diff --git a/.editorconfig b/.editorconfig index 2bd8cf9e86d..07e49a0e38b 100644 --- a/.editorconfig +++ b/.editorconfig @@ -15,5 +15,11 @@ indent_size = 2 [test/cases/parsing/bom/bomfile.{css,js}] charset = utf-8-bom +[test/configCases/css/no-extra-runtime-in-js/source.text] +insert_final_newline = false + [*.md] trim_trailing_whitespace = false + +[*.snap] +trim_trailing_whitespace = false diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 79cee6b118f..00000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,86 +0,0 @@ -module.exports = { - root: true, - plugins: ["prettier", "node", "jest"], - extends: [ - "eslint:recommended", - "plugin:node/recommended", - "plugin:prettier/recommended" - ], - env: { - node: true, - es6: true - }, - parserOptions: { - ecmaVersion: 2017 - }, - rules: { - "prettier/prettier": "error", - "no-undef": "error", - "no-extra-semi": "error", - "no-template-curly-in-string": "error", - "no-caller": "error", - "no-control-regex": "off", - yoda: "error", - eqeqeq: "error", - "global-require": "off", - "brace-style": "off", - "eol-last": "error", - "no-extra-bind": "warn", - "no-process-exit": "warn", - "no-use-before-define": "off", - "no-unused-vars": ["error", { args: "none" }], - "no-unsafe-negation": "error", - "no-loop-func": "warn", - indent: "off", - "no-console": "off", - "valid-jsdoc": [ - "error", - { - prefer: { - return: "returns", - prop: "property", - memberof: "DONTUSE", - class: "DONTUSE", - inheritdoc: "DONTUSE", - description: "DONTUSE", - readonly: "DONTUSE" - }, - preferType: { - "*": "any" - }, - requireReturnType: true - } - ], - "node/no-unsupported-features": "error", - "node/no-deprecated-api": "error", - "node/no-missing-import": "error", - "node/no-missing-require": ["error", { allowModules: ["webpack"] }], - "node/no-unpublished-bin": "error", - "node/no-unpublished-require": "error", - "node/process-exit-as-throw": "error" - }, - overrides: [ - { - files: ["lib/**/*.runtime.js", "buildin/*.js", "hot/*.js"], - env: { - es6: false, - browser: true - }, - globals: { - Promise: false - }, - parserOptions: { - ecmaVersion: 5 - } - }, - { - files: ["test/**/*.js"], - env: { - "jest/globals": true - }, - globals: { - nsObj: false - } - } - ] -}; diff --git a/.gitattributes b/.gitattributes index ac579eb7bc0..360694eafb6 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,8 @@ * text=auto -test/statsCases/* eol=lf +test/statsCases/** eol=lf +test/hotCases/** eol=lf examples/* eol=lf -bin/* eol=lf \ No newline at end of file +bin/* eol=lf +*.svg eol=lf +*.css eol=lf +**/*webpack.lock.data/** -text diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000000..5e7c7b6d7a6 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +open_collective: webpack diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 1deb4adab1a..3b257921146 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -2,9 +2,11 @@ -**Do you want to request a *feature* or report a *bug*?** +**Do you want to request a _feature_ or report a _bug_?** - + + + **What is the current behavior?** @@ -12,7 +14,7 @@ **If the current behavior is a bug, please provide the steps to reproduce.** - + **What is the expected behavior?** diff --git a/.github/ISSUE_TEMPLATE/Bug_report.md b/.github/ISSUE_TEMPLATE/Bug_report.md index 437637672bb..de70ffd482d 100644 --- a/.github/ISSUE_TEMPLATE/Bug_report.md +++ b/.github/ISSUE_TEMPLATE/Bug_report.md @@ -8,17 +8,15 @@ about: Create a report to help us improve # Bug report - + + - **What is the current behavior?** - **If the current behavior is a bug, please provide the steps to reproduce.** - @@ -28,12 +26,11 @@ about: Create a report to help us improve **What is the expected behavior?** - **Other relevant information:** webpack version: -Node.js version: -Operating System: +Node.js version: +Operating System: Additional tools: diff --git a/.github/ISSUE_TEMPLATE/Feature_request.md b/.github/ISSUE_TEMPLATE/Feature_request.md index 1b69aa08fd4..704020c0671 100644 --- a/.github/ISSUE_TEMPLATE/Feature_request.md +++ b/.github/ISSUE_TEMPLATE/Feature_request.md @@ -1,27 +1,23 @@ --- name: Feature request about: Suggest an idea for this project - --- ## Feature request - + - + **What is the expected behavior?** - **What is motivation or use case for adding/changing the behavior?** - **How should this be implemented in your opinion?** - **Are you willing to work on this yourself?** yes diff --git a/.github/ISSUE_TEMPLATE/Other.md b/.github/ISSUE_TEMPLATE/Other.md index 033e88fcad4..3faf967c321 100644 --- a/.github/ISSUE_TEMPLATE/Other.md +++ b/.github/ISSUE_TEMPLATE/Other.md @@ -1,9 +1,10 @@ --- name: Other about: Something else - --- - + + + diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 8967c8f0169..89efe54b7d5 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -2,7 +2,6 @@ - **What kind of change does this PR introduce?** diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000000..7b3e3b3ec5d --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,31 @@ +version: 2 +updates: + - package-ecosystem: npm + directory: "/" + schedule: + interval: daily + time: "04:00" + timezone: Europe/Berlin + open-pull-requests-limit: 20 + labels: + - dependencies + versioning-strategy: widen + groups: + dependencies: + patterns: + - "*" + exclude-patterns: + - "eslint-scope" + - "json-parse-even-better-errors" + - "strip-ansi" + - "rimraf" + - "mime-types" + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: daily + time: "04:00" + timezone: Europe/Berlin + open-pull-requests-limit: 20 + labels: + - dependencies diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml new file mode 100644 index 00000000000..4db2a128537 --- /dev/null +++ b/.github/workflows/dependency-review.yml @@ -0,0 +1,61 @@ +name: "Dependency Review" + +on: [pull_request] + +permissions: + contents: read + +jobs: + dependency-review: + runs-on: ubuntu-latest + steps: + - name: "Checkout Repository" + uses: actions/checkout@v4 + - name: "Dependency Review" + uses: actions/dependency-review-action@v4 + with: + allow-dependencies-licenses: "pkg:npm/@cspell/dict-en-common-misspellings, pkg:npm/flatted, pkg:npm/parse-imports, pkg:npm/prettier, pkg:npm/type-fest, pkg:npm/abbrev, pkg:npm/@pkgjs/parseargs, pkg:npm/cookie-signature" + allow-licenses: | + 0BSD, + AFL-1.1, + AFL-1.2, + AFL-2.0, + AFL-2.1, + AFL-3.0, + AGPL-3.0-only, + AGPL-3.0-or-later, + Apache-1.1, + Apache-2.0, + APSL-2.0, + Artistic-2.0, + BlueOak-1.0.0, + BSD-2-Clause, + BSD-3-Clause-Clear, + BSD-3-Clause, + BSL-1.0, + CAL-1.0, + CC-BY-3.0, + CC-BY-4.0, + CC-BY-SA-4.0, + CDDL-1.0, + CC0-1.0, + EPL-2.0, + GPL-2.0-only, + GPL-2.0-or-later, + GPL-2.0, + GPL-3.0-or-later, + ISC, + LGPL-2.0-only, + LGPL-2.1-only, + LGPL-2.1-or-later, + LGPL-2.1, + LGPL-3.0-only, + LGPL-3.0, + MIT, + MPL-2.0, + OFL-1.1, + PSF-2.0, + Python-2.0, + Python-2.0.1, + Unicode-DFS-2016, + Unlicense diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml new file mode 100644 index 00000000000..3d2f8b96ec2 --- /dev/null +++ b/.github/workflows/examples.yml @@ -0,0 +1,41 @@ +name: "Update examples" + +on: + schedule: + - cron: "0 0 * * 0" + +permissions: + contents: read + +jobs: + examples: + runs-on: ubuntu-latest + permissions: + pull-requests: write + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: "yarn" + - run: yarn --frozen-lockfile + - run: yarn link --frozen-lockfile || true + - run: yarn link webpack --frozen-lockfile + - run: yarn build:examples + - name: Create Pull Request + uses: peter-evans/create-pull-request@v7 + with: + token: ${{ secrets.PAT }} + delete-branch: true + commit-message: | + docs: update examples + title: | + docs: update examples + body: | + Update examples. + + This PR was autogenerated. + branch: update-examples diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000000..af1f302757f --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,211 @@ +name: Github Actions + +on: + push: + branches: + - main + pull_request: + branches: + - main + workflow_dispatch: + +permissions: + contents: read + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: "yarn" + - run: yarn --frozen-lockfile + - name: Cache prettier result + uses: actions/cache@v4 + with: + path: ./node_modules/.cache/prettier/.prettier-cache + key: lint-prettier-${{ runner.os }}-node-${{ hashFiles('**/yarn.lock', '**/.prettierrc.js') }} + restore-keys: lint-prettier- + - name: Cache eslint result + uses: actions/cache@v4 + with: + path: .eslintcache + key: lint-eslint-${{ runner.os }}-node-${{ hashFiles('**/yarn.lock', '**/eslint.config.mjs') }} + restore-keys: lint-eslint- + - name: Cache cspell result + uses: actions/cache@v4 + with: + path: .cspellcache + key: lint-cspell-${{ runner.os }}-node-${{ hashFiles('**/yarn.lock', '**/cspell.json') }} + restore-keys: lint-cspell- + - run: yarn lint + - name: Validate types using old typescript version + run: | + yarn upgrade typescript@5.0 + yarn --frozen-lockfile + yarn validate:types + validate-legacy-node: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: 10.x + cache: "yarn" + # Remove `devDependencies` from `package.json` to avoid `yarn install` compatibility error + - run: node -e "const content = require('./package.json');delete content.devDependencies;require('fs').writeFileSync('package.json', JSON.stringify(content, null, 2));" + - run: yarn install --production --frozen-lockfile + benchmark: + strategy: + fail-fast: false + matrix: + shard: [1/4, 2/4, 3/4, 4/4] + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + steps: + - uses: actions/checkout@v4 + with: + fetch-tags: true + fetch-depth: 0 + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: "yarn" + - run: yarn --frozen-lockfile + - run: yarn link --frozen-lockfile || true + - run: yarn link webpack --frozen-lockfile + - name: Run benchmarks + uses: CodSpeedHQ/action@v3 + with: + run: yarn benchmark --ci + token: ${{ secrets.CODSPEED_TOKEN }} + env: + LAST_COMMIT: 1 + NEGATIVE_FILTER: on-schedule + SHARD: ${{ matrix.shard }} + basic: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: "yarn" + - run: yarn --frozen-lockfile + - run: yarn link --frozen-lockfile || true + - run: yarn link webpack --frozen-lockfile + - run: yarn test:basic --ci + unit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: lts/* + cache: "yarn" + - run: yarn --frozen-lockfile + - run: yarn link --frozen-lockfile || true + - run: yarn link webpack --frozen-lockfile + - uses: actions/cache@v4 + with: + path: .jest-cache + key: jest-unit-${{ env.GITHUB_SHA }} + restore-keys: jest-unit-${{ hashFiles('**/yarn.lock', '**/jest.config.js') }} + - run: yarn cover:unit --ci --cacheDirectory .jest-cache + - uses: codecov/codecov-action@v5 + with: + flags: unit + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + integration: + needs: basic + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + node-version: [10.x, 20.x, 22.x, 24.x] + part: [a, b] + include: + # Test with main branches of webpack dependencies + - os: ubuntu-latest + node-version: lts/* + part: a + use_main_branches: 1 + - os: ubuntu-latest + node-version: lts/* + part: b + use_main_branches: 1 + # Test on old Node.js versions + - os: ubuntu-latest + node-version: 18.x + part: a + - os: ubuntu-latest + node-version: 16.x + part: a + - os: ubuntu-latest + node-version: 14.x + part: a + - os: ubuntu-latest + node-version: 12.x + part: a + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: actions/github-script@v7 + id: calculate_architecture + with: + result-encoding: string + script: | + if ('${{ matrix.os }}' === 'macos-latest' && '${{ matrix['node-version'] }}' === '10.x') { + return "x64" + } else { + return '' + } + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + architecture: ${{ steps.calculate_architecture.outputs.result }} + cache: "yarn" + # Install old `jest` version and deps for legacy node versions + - run: | + yarn upgrade jest@^27.5.0 jest-circus@^27.5.0 jest-cli@^27.5.0 jest-diff@^27.5.0 jest-environment-node@^27.5.0 jest-junit@^13.0.0 @types/jest@^27.4.0 pretty-format@^27.0.2 husky@^8.0.3 lint-staged@^13.2.1 cspell@^6.31.1 open-cli@^7.2.0 coffee-loader@^1.0.0 babel-loader@^8.1.0 style-loader@^2.0.0 css-loader@^5.0.1 less-loader@^8.1.1 mini-css-extract-plugin@^1.6.1 nyc@^15.1.0 --ignore-engines + yarn --frozen-lockfile --ignore-engines + if: matrix.node-version == '10.x' || matrix.node-version == '12.x' || matrix.node-version == '14.x' + - run: | + yarn upgrade husky@^8.0.3 lint-staged@^13.2.1 nyc@^15.1.0 coffee-loader@1.0.0 babel-loader@^8.1.0 style-loader@^2.0.0 css-loader@^5.0.1 less-loader@^8.1.1 mini-css-extract-plugin@^1.6.1 --ignore-engines + yarn --frozen-lockfile + if: matrix.node-version == '16.x' + - run: | + yarn upgrade cspell@^8.8.4 lint-staged@^15.2.5 --ignore-engines + yarn --frozen-lockfile + if: matrix.node-version == '18.x' + # Install main version of our deps + - run: yarn upgrade enhanced-resolve@webpack/enhanced-resolve#main loader-runner@webpack/loader-runner#main webpack-sources@webpack/webpack-sources#main watchpack@webpack/watchpack#main tapable@webpack/tapable#master + if: matrix.use_main_branches == '1' + # Install dependencies for LTS node versions + - run: yarn --frozen-lockfile + if: matrix.node-version != '10.x' && matrix.node-version != '12.x' && matrix.node-version != '14.x' && matrix.node-version != '16.x' + - run: yarn link --frozen-lockfile || true + - run: yarn link webpack --frozen-lockfile + - uses: actions/cache@v4 + with: + path: .jest-cache + key: jest-integration-${{ env.GITHUB_SHA }} + restore-keys: jest-integration-${{ hashFiles('**/yarn.lock', '**/jest.config.js') }} + - run: yarn cover:integration:${{ matrix.part }} --ci --cacheDirectory .jest-cache || yarn cover:integration:${{ matrix.part }} --ci --cacheDirectory .jest-cache -f + - run: yarn cover:merge + - uses: codecov/codecov-action@v5 + with: + flags: integration + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.gitignore b/.gitignore index 32814bb493a..20ee74c931a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,23 @@ /node_modules /test/js /test/browsertest/js -/test/fixtures/temp-cache-fixture -/benchmark/js -/benchmark/fixtures +/test/fixtures/temp-* +/test/temp +/test/ChangesAndRemovals +/test/**/dev-defaults.webpack.lock +/test/**/generated/** /examples/**/dist +/examples/nodejs-addons/build/** +/assembly/**/*.wat +/assembly/**/*.wasm /coverage +/.nyc_output +/.jest-cache .DS_Store *.log .idea .vscode +.cache .eslintcache +.cspellcache package-lock.json diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 00000000000..041c660c92b --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +npx --no-install lint-staged diff --git a/.prettierignore b/.prettierignore index bdf38e4bc19..ebf1141fc83 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,8 +1,39 @@ -# Ignore test fixtures -test +package.json + +# Ignore some test files +test/**/*.* !test/*.js +!test/*.cjs +!test/*.mjs !test/**/webpack.config.js +!test/**/webpack.config.cjs +!test/**/webpack.config.mjs +!test/**/test.config.js +!test/**/test.filter.js +!test/**/errors.js +!test/**/warnings.js +!test/**/deprecations.js +!test/**/infrastructure-log.js +!test/*.md +!test/helpers/*.* +!test/benchmarkCases/**/*.mjs +test/js/**/*.* + +# Ignore some folders +benchmark/ +coverage/ + +# Ignore generated files +*.check.js +*.check.d.ts +types.d.ts +declarations/WebpackOptions.d.ts + +# Ignore precompiled schemas +schemas/**/*.check.js # Ignore example fixtures -examples +examples/ !examples/**/webpack.config.js + +.vscode/**/*.* diff --git a/.prettierrc.js b/.prettierrc.js index cc7e3b51355..52e3a560973 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -2,12 +2,21 @@ module.exports = { printWidth: 80, useTabs: true, tabWidth: 2, + trailingComma: "none", + arrowParens: "avoid", overrides: [ { files: "*.json", options: { + parser: "json", useTabs: false } + }, + { + files: "*.{cts,mts,ts}", + options: { + parser: "typescript" + } } ] }; diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 08c3ee6672f..00000000000 --- a/.travis.yml +++ /dev/null @@ -1,73 +0,0 @@ -sudo: false -dist: trusty -language: node_js - -branches: - only: - - master - - next - -cache: - yarn: true - directories: - - ".jest-cache" - - ".eslintcache" - -stages: - - basic - - advanced - -matrix: - include: - - os: linux - node_js: "10" - env: NO_WATCH_TESTS=1 JEST="--maxWorkers=2 --cacheDirectory .jest-cache" JOB_PART=basic - stage: basic - - os: linux - node_js: "10" - env: NO_WATCH_TESTS=1 JEST="--maxWorkers=2 --cacheDirectory .jest-cache" JOB_PART=lint-unit - stage: advanced - - os: linux - node_js: "10" - env: NO_WATCH_TESTS=1 JEST="--maxWorkers=2 --cacheDirectory .jest-cache" JOB_PART=integration - stage: advanced - - os: linux - node_js: "10" - env: NO_WATCH_TESTS=1 ALTERNATIVE_SORT=1 JEST="--maxWorkers=2 --cacheDirectory .jest-cache" JOB_PART=integration - stage: advanced - - os: linux - node_js: "10" - env: - - NODEJS_VERSION=v12.0.0-nightly20181024bb79e768e5 - - YARN_EXTRA_ARGS="--ignore-engines" - - NO_WATCH_TESTS=1 - - JEST="--maxWorkers=2 --cacheDirectory .jest-cache" - - JOB_PART=integration - stage: advanced - fast_finish: true - -before_install: - - | - if [ "$NODEJS_VERSION" != "" ]; - then - mkdir /opt/node - curl --silent "https://nodejs.org/download/nightly/$NODEJS_VERSION/node-$NODEJS_VERSION-linux-x64.tar.gz" | tar -zxf - --directory /opt/node - export PATH="/opt/node/node-$NODEJS_VERSION-linux-x64/bin:$PATH" - node --version - fi - -install: - - yarn --frozen-lockfile $YARN_EXTRA_ARGS - - yarn link --frozen-lockfile $YARN_EXTRA_ARGS || true - - yarn link webpack --frozen-lockfile $YARN_EXTRA_ARGS - -script: yarn travis:$JOB_PART - -after_success: - - cat ./coverage/lcov.info | node_modules/.bin/coveralls --verbose - - bash <(curl -s https://codecov.io/bash) -F $JOB_PART -X gcov - - rm -f .jest-cache/haste-map* .jest-cache/perf-cache* - -notifications: - slack: - secure: JduSdKWwbnLCwo7Z4E59SGE+Uw832UwnXzQiKEpg1BV45MYDPRiGltly1tRHmPh9OGjvGx3XSkC2tNGOBLtL4UL2SCkf012x0t7jDutKRfcv/njynl8jk8l+UhPmaWiHXDQAgGiiKdL4RfzPLW3HeVHCOWm0LKMzcarTa8tw+rE= diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000000..4faf227c455 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1 @@ +[Code of Conduct](https://github.com/openjs-foundation/code-and-learn/blob/master/CODE_OF_CONDUCT.md) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index da3b43b7186..7ade9adab17 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -10,17 +10,19 @@ work is not in vain. Most of the time, if webpack is not working correctly for you, it is a simple configuration issue. If you are still having difficulty after looking over your configuration carefully, please post -a question to [StackOverflow with the webpack tag](http://stackoverflow.com/tags/webpack). Questions +a question to [StackOverflow with the webpack tag](https://stackoverflow.com/tags/webpack). Questions that include your webpack.config.js, relevant files, and the full error message are more likely to receive responses. **If you have discovered a bug or have a feature suggestion, please [create an issue on GitHub](https://github.com/webpack/webpack/issues/new).** -Do you want to fix an issue? Look at the issues with a tag of [X5: work required (PR / Help Wanted)](https://github.com/webpack/webpack/labels/X5%3A%20work%20required%20%28PR%20%2F%20Help%20Wanted%29). Each issue should be tagged with a difficulty tag - +Do you want to fix an issue? Look at the issues with a tag of [X5: work required (PR / Help Wanted)](https://github.com/webpack/webpack/labels/X5%3A%20work%20required%20%28PR%20%2F%20Help%20Wanted%29). Here are some of the key labels you may encounter: -- D0: My First Commit (Contribution Difficulty) -- D1: Easy (Contribution Difficulty) -- D2: Medium (Contribution Difficulty) -- D3: Hard (Contribution Difficulty) +- **bug**: An unexpected problem or unintended behavior. +- **enhancement**: A suggestion for a new feature or improvement. +- **question**: Requests for clarification or more information. +- **documentation**: Issues related to improving or adding documentation. + +> **Note:** Previous references to labels such as `D0: My First Commit`, `D1: Easy`, `D2: Medium`, and `D3: Hard` have been removed as these are not currently in use. If you would like to see difficulty labels added, please open a suggestion or discuss with maintainers. ## Contributing to the webpack ecosystem @@ -35,22 +37,47 @@ If you have created your own loader/plugin please include it on the relevant doc ## Submitting Changes -After getting some feedbacks, push to your fork and submit a pull request. We +After getting some feedback, push to your fork and submit a pull request. We may suggest some changes or improvements or alternatives, but for small changes your pull request should be accepted quickly. Something that will increase the chance that your pull request is accepted: -* [Write tests](./test/README.md) -* Follow the existing coding style -* Write a [good commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) +- [Write tests](./test/README.md) +- Follow the existing coding style +- Write a [good commit message](https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) +- For a major fix/feature make sure your PR has an issue and if it doesn't, please create one. This would help discussion with the community, and polishing ideas in case of a new feature. +- Make sure your PR's description contains GitHub's special keyword references that automatically close the related issue when the PR is merged. ([More info](https://github.com/blog/1506-closing-issues-via-pull-requests)) +- When you have a lot of commits in your PR, it's good practice to squash all your commits in one single commit. ([Learn how to squash here](https://davidwalsh.name/squash-commits-git)) +- For a better understanding of the folder structure and testing procedures, refer to the [Testing Documentation](./TESTING_DOCS.md). ## Documentation webpack is insanely feature rich and documentation is a huge time sink. We greatly appreciate any time spent fixing typos or clarifying sections in the -documentation. [See a list of issues with the documentation tag.](https://github.com/webpack/webpack/labels/documentation) +documentation. [See a list of issues with the documentation tag](https://github.com/webpack/webpack/labels/documentation), +or [check out the issues on the documentation website's repository](https://github.com/webpack/webpack.js.org/issues). + +## Types + +webpack is statically typed using JSDoc annotation and TypeScript. If you would like to export a new type which doesn't belong to a public API, then you can do so by declaring it in `webpack/lib/index.js`. + +`webpack/lib/index.js` + +```js +/** @typedef {import("./NormalModuleFactory").ResolveData} ResolveData */ +``` + +Then, automatically generate the type declarations by running `yarn fix` locally, and the changes you have made will be reflected in `types.d.ts`. ## Discussions Gitter is only for small questions. To discuss a subject in detail, please send a link to your forum or blog in the Gitter chat. + +## Join the development + +- Before you join development, please [set up the project](./_SETUP.md) on your local machine, run it and go through the application completely. Use any command you can find and see what it does. Explore. + + > Don't worry ... Nothing will happen to the project or to you due to the exploring. Only thing that will happen is, you'll be more familiar with what is where and might even get some cool ideas on how to improve various aspects of the project. + +- If you would like to work on an issue, drop in a comment at the issue. If it is already assigned to someone, but there is no sign of any work being done, please feel free to drop in a comment so that the issue can be assigned to you if the previous assignee has dropped it entirely. diff --git a/GOVERNANCE.md b/GOVERNANCE.md new file mode 100644 index 00000000000..6d004f58610 --- /dev/null +++ b/GOVERNANCE.md @@ -0,0 +1,3 @@ +# webpack Project Governance + +The webpack project (and organization) follows the webpack's governance model defined within [the webpack governance repository](https://github.com/webpack/governance/blob/main/README.md). diff --git a/README.md b/README.md index 344ca1fa9ad..2149c2f2126 100644 --- a/README.md +++ b/README.md @@ -8,42 +8,44 @@ [![npm][npm]][npm-url] [![node][node]][node-url] -[![deps][deps]][deps-url] -[![tests][tests]][tests-url] -[![builds][builds]][builds-url] -[![builds2][builds2]][builds2-url] +[![builds1][builds1]][builds1-url] +[![dependency-review][dependency-review]][dependency-review-url] [![coverage][cover]][cover-url] -[![licenses][licenses]][licenses-url] +[![PR's welcome][prs]][prs-url] +[![compatibility-score](https://api.dependabot.com/badges/compatibility_score?dependency-name=webpack&package-manager=npm_and_yarn&previous-version=5.72.1&new-version=5.73.0)](https://docs.github.com/en/code-security/dependabot/dependabot-security-updates/about-dependabot-security-updates#about-compatibility-scores) +[![downloads](https://img.shields.io/npm/dm/webpack.svg)](https://npmcharts.com/compare/webpack?minimal=true) +[![install-size](https://packagephobia.com/badge?p=webpack)](https://packagephobia.com/result?p=webpack) +[![backers](https://opencollective.com/webpack/backers/badge.svg)](https://opencollective.com/webpack#backer) +[![sponsors](https://opencollective.com/webpack/sponsors/badge.svg)](https://opencollective.com/webpack#sponsors) +[![contributors](https://img.shields.io/github/contributors/webpack/webpack.svg)](https://github.com/webpack/webpack/graphs/contributors) +[![discussions](https://img.shields.io/github/discussions/webpack/webpack)](https://github.com/webpack/webpack/discussions) +[![discord](https://img.shields.io/discord/1180618526436888586?label=discord&logo=discord&logoColor=white&style=flat)](https://discord.gg/5sxFZPdx2k) -
- - - - - - - - install size - - - - - - - - - - - - -

webpack

- webpack is a module bundler. Its main purpose is to bundle JavaScript files for usage in a browser, yet it is also capable of transforming, bundling, or packaging just about any resource or asset. + Webpack is a module bundler. Its main purpose is to bundle JavaScript files for usage in a browser, yet it is also capable of transforming, bundling, or packaging just about any resource or asset.

-

Install

+## Table of Contents + +- [Install](#install) +- [Introduction](#introduction) +- [Concepts](#concepts) +- [Contributing](#contributing) +- [Support](#support) +- [Current project members](#current-project-members) + - [TSC (Technical Steering Committee)](#tsc-technical-steering-committee) + - [Core Collaborators](#core-collaborators) +- [Sponsoring](#sponsoring) + - [Premium Partners](#premium-partners) + - [Gold Sponsors](#gold-sponsors) + - [Silver Sponsors](#silver-sponsors) + - [Bronze Sponsors](#bronze-sponsors) + - [Backers](#backers) +- [Special Thanks](#special-thanks-to) + +

Install

Install with npm: @@ -57,69 +59,74 @@ Install with yarn: yarn add webpack --dev ``` -

Introduction

+

Introduction

-webpack is a bundler for modules. The main purpose is to bundle JavaScript +Webpack is a bundler for modules. The main purpose is to bundle JavaScript files for usage in a browser, yet it is also capable of transforming, bundling, or packaging just about any resource or asset. **TL;DR** -* Bundles [ES Modules](http://www.2ality.com/2014/09/es6-modules-final.html), [CommonJS](http://wiki.commonjs.org/), and [AMD](https://github.com/amdjs/amdjs-api/wiki/AMD) modules (even combined). -* Can create a single bundle or multiple chunks that are asynchronously loaded at runtime (to reduce initial loading time). -* Dependencies are resolved during compilation, reducing the runtime size. -* Loaders can preprocess files while compiling, e.g. TypeScript to JavaScript, Handlebars strings to compiled functions, images to Base64, etc. -* Highly modular plugin system to do whatever else your application requires. +- Bundles [ES Modules](https://www.2ality.com/2014/09/es6-modules-final.html), [CommonJS](http://wiki.commonjs.org/), and [AMD](https://github.com/amdjs/amdjs-api/wiki/AMD) modules (even combined). +- Can create a single bundle or multiple chunks that are asynchronously loaded at runtime (to reduce initial loading time). +- Dependencies are resolved during compilation, reducing the runtime size. +- Loaders can preprocess files while compiling, e.g. TypeScript to JavaScript, Handlebars strings to compiled functions, images to Base64, etc. +- Highly modular plugin system to do whatever else your application requires. + +#### Learn about webpack through videos! + +- [Understanding Webpack - Video 1](https://www.youtube.com/watch?v=xj93pvQIsRo) +- [Understanding Webpack - Video 2](https://www.youtube.com/watch?v=4tQiJaFzuJ8) ### Get Started -Check out webpack's quick [**Get Started**](https://webpack.js.org/get-started/) guide and the [other guides](https://webpack.js.org/guides/). +Check out webpack's quick [**Get Started**](https://webpack.js.org/guides/getting-started) guide and the [other guides](https://webpack.js.org/guides/). ### Browser Compatibility -webpack supports all browsers that are [ES5-compliant](http://kangax.github.io/compat-table/es5/) (IE8 and below are not supported). -webpack also needs `Promise` for `import()` and `require.ensure()`. If you want to support older browsers, you will need to [load a polyfill](https://webpack.js.org/guides/shimming/) before using these expressions. +Webpack supports all browsers that are [ES5-compliant](https://kangax.github.io/compat-table/es5/) (IE8 and below are not supported). +Webpack also needs `Promise` for `import()` and `require.ensure()`. If you want to support older browsers, you will need to [load a polyfill](https://webpack.js.org/guides/shimming/) before using these expressions. -

Concepts

+

Concepts

### [Plugins](https://webpack.js.org/plugins/) -webpack has a [rich plugin +Webpack has a [rich plugin interface](https://webpack.js.org/plugins/). Most of the features within webpack itself use this plugin interface. This makes webpack very **flexible**. -|Name|Status|Install Size|Description| -|:--:|:----:|:----------:|:----------| -|[mini-css-extract-plugin][mini-css]|![mini-css-npm]|![mini-css-size]|Extracts CSS into separate files. It creates a CSS file per JS file which contains CSS.| -|[compression-webpack-plugin][compression]|![compression-npm]|![compression-size]|Prepares compressed versions of assets to serve them with Content-Encoding| -|[i18n-webpack-plugin][i18n]|![i18n-npm]|![i18n-size]|Adds i18n support to your bundles| -|[html-webpack-plugin][html-plugin]|![html-plugin-npm]|![html-plugin-size]| Simplifies creation of HTML files (`index.html`) to serve your bundles| -|[extract-text-webpack-plugin][extract]|![extract-npm]|![extract-size]|Extract text from a bundle, or bundles, into a separate file| +| Name | Status | Install Size | Description | +| :---------------------------------------: | :----------------: | :-----------------: | :-------------------------------------------------------------------------------------- | +| [mini-css-extract-plugin][mini-css] | ![mini-css-npm] | ![mini-css-size] | Extracts CSS into separate files. It creates a CSS file per JS file which contains CSS. | +| [compression-webpack-plugin][compression] | ![compression-npm] | ![compression-size] | Prepares compressed versions of assets to serve them with Content-Encoding | +| [html-bundler-webpack-plugin][bundler] | ![bundler-npm] | ![bundler-size] | Renders a template (EJS, Handlebars, Pug) with referenced source asset files into HTML. | +| [html-webpack-plugin][html-plugin] | ![html-plugin-npm] | ![html-plugin-size] | Simplifies creation of HTML files (`index.html`) to serve your bundles | +| [pug-plugin][pug-plugin] | ![pug-plugin-npm] | ![pug-plugin-size] | Renders Pug files to HTML, extracts JS and CSS from sources specified directly in Pug. | [common-npm]: https://img.shields.io/npm/v/webpack.svg -[extract]: https://github.com/webpack/extract-text-webpack-plugin -[extract-npm]: https://img.shields.io/npm/v/extract-text-webpack-plugin.svg -[extract-size]: https://packagephobia.now.sh/badge?p=extract-text-webpack-plugin [mini-css]: https://github.com/webpack-contrib/mini-css-extract-plugin [mini-css-npm]: https://img.shields.io/npm/v/mini-css-extract-plugin.svg -[mini-css-size]: https://packagephobia.now.sh/badge?p=mini-css-extract-plugin -[component]: https://github.com/webpack/component-webpack-plugin +[mini-css-size]: https://packagephobia.com/badge?p=mini-css-extract-plugin +[component]: https://github.com/webpack-contrib/component-webpack-plugin [component-npm]: https://img.shields.io/npm/v/component-webpack-plugin.svg -[component-size]: https://packagephobia.now.sh/badge?p=component-webpack-plugin -[compression]: https://github.com/webpack/compression-webpack-plugin +[component-size]: https://packagephobia.com/badge?p=component-webpack-plugin +[compression]: https://github.com/webpack-contrib/compression-webpack-plugin [compression-npm]: https://img.shields.io/npm/v/compression-webpack-plugin.svg -[compression-size]: https://packagephobia.now.sh/badge?p=compression-webpack-plugin -[i18n]: https://github.com/webpack/i18n-webpack-plugin -[i18n-npm]: https://img.shields.io/npm/v/i18n-webpack-plugin.svg -[i18n-size]: https://packagephobia.now.sh/badge?p=i18n-webpack-plugin -[html-plugin]: https://github.com/ampedandwired/html-webpack-plugin +[compression-size]: https://packagephobia.com/badge?p=compression-webpack-plugin +[bundler]: https://github.com/webdiscus/html-bundler-webpack-plugin +[bundler-npm]: https://img.shields.io/npm/v/html-bundler-webpack-plugin.svg +[bundler-size]: https://packagephobia.com/badge?p=html-bundler-webpack-plugin +[html-plugin]: https://github.com/jantimon/html-webpack-plugin [html-plugin-npm]: https://img.shields.io/npm/v/html-webpack-plugin.svg -[html-plugin-size]: https://packagephobia.now.sh/badge?p=html-webpack-plugin +[html-plugin-size]: https://packagephobia.com/badge?p=html-webpack-plugin +[pug-plugin]: https://github.com/webdiscus/pug-plugin +[pug-plugin-npm]: https://img.shields.io/npm/v/pug-plugin.svg +[pug-plugin-size]: https://packagephobia.com/badge?p=pug-plugin ### [Loaders](https://webpack.js.org/loaders/) -webpack enables use of loaders to preprocess files. This allows you to bundle +Webpack enables the use of loaders to preprocess files. This allows you to bundle **any static resource** way beyond JavaScript. You can easily [write your own loaders](https://webpack.js.org/api/loaders/) using Node.js. @@ -128,286 +135,206 @@ or are automatically applied via regex from your webpack configuration. #### Files -|Name|Status|Install Size|Description| -|:--:|:----:|:----------:|:----------| -|[raw-loader][raw]|![raw-npm]|![raw-size]|Loads raw content of a file (utf-8)| -|[val-loader][val]|![val-npm]|![val-size]|Executes code as module and considers exports as JS code| -|[url-loader][url]|![url-npm]|![url-size]|Works like the file loader, but can return a Data Url if the file is smaller than a limit| -|[file-loader][file]|![file-npm]|![file-size]|Emits the file into the output folder and returns the (relative) url| +| Name | Status | Install Size | Description | +| :---------------: | :--------: | :----------: | :------------------------------------------------------- | +| [val-loader][val] | ![val-npm] | ![val-size] | Executes code as module and considers exports as JS code | - -[raw]: https://github.com/webpack/raw-loader -[raw-npm]: https://img.shields.io/npm/v/raw-loader.svg -[raw-size]: https://packagephobia.now.sh/badge?p=raw-loader -[val]: https://github.com/webpack/val-loader +[val]: https://github.com/webpack-contrib/val-loader [val-npm]: https://img.shields.io/npm/v/val-loader.svg -[val-size]: https://packagephobia.now.sh/badge?p=val-loader -[url]: https://github.com/webpack/url-loader -[url-npm]: https://img.shields.io/npm/v/url-loader.svg -[url-size]: https://packagephobia.now.sh/badge?p=url-loader -[file]: https://github.com/webpack/file-loader -[file-npm]: https://img.shields.io/npm/v/file-loader.svg -[file-size]: https://packagephobia.now.sh/badge?p=file-loader +[val-size]: https://packagephobia.com/badge?p=val-loader #### JSON -|Name|Status|Install Size|Description| -|:--:|:----:|:----------:|:----------| -||![json-npm]|![json-size]|Loads a JSON file (included by default)| -||![json5-npm]|![json5-size]|Loads and transpiles a JSON 5 file| -||![cson-npm]|![cson-size]|Loads and transpiles a CSON file| - +| Name | Status | Install Size | Description | +| :---------------------------------------------------------------------------------------------------------------------------------------: | :---------: | :----------: | :------------------------------: | +| | ![cson-npm] | ![cson-size] | Loads and transpiles a CSON file | -[json-npm]: https://img.shields.io/npm/v/json-loader.svg -[json-size]: https://packagephobia.now.sh/badge?p=json-loader -[json5-npm]: https://img.shields.io/npm/v/json5-loader.svg -[json5-size]: https://packagephobia.now.sh/badge?p=json5-loader [cson-npm]: https://img.shields.io/npm/v/cson-loader.svg -[cson-size]: https://packagephobia.now.sh/badge?p=cson-loader +[cson-size]: https://packagephobia.com/badge?p=cson-loader #### Transpiling -|Name|Status|Install Size|Description| -|:--:|:----:|:----------:|:----------| -|` + + diff --git a/examples/asset-advanced/template.md b/examples/asset-advanced/template.md new file mode 100644 index 00000000000..03002aeaea9 --- /dev/null +++ b/examples/asset-advanced/template.md @@ -0,0 +1,29 @@ +This example shows the usage of the asset module type with asset generator options customization. + +Files can be imported similar to other modules without file-loader or url-loader. + +# example.js + +```javascript +_{{example.js}}_ +``` + +# webpack.config.js + +```javascript +_{{webpack.config.js}}_ +``` + +# js/output.js + +```javascript +_{{dist/output.js}}_ +``` + +# Info + +## webpack output + +``` +_{{stdout}}_ +``` diff --git a/examples/asset-advanced/webpack.config.js b/examples/asset-advanced/webpack.config.js new file mode 100644 index 00000000000..a607befdd0d --- /dev/null +++ b/examples/asset-advanced/webpack.config.js @@ -0,0 +1,28 @@ +const svgToMiniDataURI = require("mini-svg-data-uri"); + +module.exports = { + output: { + assetModuleFilename: "images/[hash][ext]" + }, + module: { + rules: [ + { + test: /\.(png|jpg)$/, + type: "asset" + }, + { + test: /\.svg$/, + type: "asset", + generator: { + dataUrl: content => { + if (typeof content !== "string") { + content = content.toString(); + } + + return svgToMiniDataURI(content); + } + } + } + ] + } +}; diff --git a/examples/asset-simple/README.md b/examples/asset-simple/README.md new file mode 100644 index 00000000000..527218ad84d --- /dev/null +++ b/examples/asset-simple/README.md @@ -0,0 +1,221 @@ +This is a very simple example that shows the usage of the asset module type. + +Files can be imported like other modules without file-loader. + +# example.js + +```javascript +import png from "./images/file.png"; +import jpg from "./images/file.jpg"; +import svg from "./images/file.svg"; + +const container = document.createElement("div"); +Object.assign(container.style, { + display: "flex", + justifyContent: "center" +}); +document.body.appendChild(container); + +function createImageElement(title, src) { + const div = document.createElement("div"); + div.style.textAlign = "center"; + + const h2 = document.createElement("h2"); + h2.textContent = title; + div.appendChild(h2); + + const img = document.createElement("img"); + img.setAttribute("src", src); + img.setAttribute("width", "150"); + div.appendChild(img); + + container.appendChild(div); +} + +[png, jpg, svg].forEach(src => { + createImageElement(src.split(".").pop(), src); +}); +``` + +# webpack.config.js + +```javascript +module.exports = { + output: { + assetModuleFilename: "images/[hash][ext]" + }, + module: { + rules: [ + { + test: /\.(png|jpg|svg)$/, + type: "asset" + } + ] + } +}; +``` + +# js/output.js + +```javascript +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */ +/*!*************************!*\ + !*** ./images/file.png ***! + \*************************/ +/*! default exports */ +/*! exports [not provided] [no usage info] */ +/*! runtime requirements: __webpack_require__.p, module, __webpack_require__.* */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +module.exports = __webpack_require__.p + "images/89a353e9c515885abd8e.png"; + +/***/ }), +/* 2 */ +/*!*************************!*\ + !*** ./images/file.jpg ***! + \*************************/ +/*! default exports */ +/*! exports [not provided] [no usage info] */ +/*! runtime requirements: module */ +/***/ ((module) => { + +module.exports = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAASABIAA...4CD/9M//Z"; + +/***/ }), +/* 3 */ +/*!*************************!*\ + !*** ./images/file.svg ***! + \*************************/ +/*! default exports */ +/*! exports [not provided] [no usage info] */ +/*! runtime requirements: module */ +/***/ ((module) => { + +module.exports = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDo...vc3ZnPgo="; + +/***/ }) +/******/ ]); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "dist/"; +/******/ })(); +/******/ +/************************************************************************/ +``` + +
+ +``` js +var __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { +/*!********************!*\ + !*** ./example.js ***! + \********************/ +/*! namespace exports */ +/*! exports [not provided] [no usage info] */ +/*! runtime requirements: __webpack_require__, __webpack_require__.r, __webpack_exports__, __webpack_require__.* */ +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _images_file_png__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./images/file.png */ 1); +/* harmony import */ var _images_file_jpg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./images/file.jpg */ 2); +/* harmony import */ var _images_file_svg__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./images/file.svg */ 3); + + + + +const container = document.createElement("div"); +Object.assign(container.style, { + display: "flex", + justifyContent: "center" +}); +document.body.appendChild(container); + +function createImageElement(title, src) { + const div = document.createElement("div"); + div.style.textAlign = "center"; + + const h2 = document.createElement("h2"); + h2.textContent = title; + div.appendChild(h2); + + const img = document.createElement("img"); + img.setAttribute("src", src); + img.setAttribute("width", "150"); + div.appendChild(img); + + container.appendChild(div); +} + +[_images_file_png__WEBPACK_IMPORTED_MODULE_0__, _images_file_jpg__WEBPACK_IMPORTED_MODULE_1__, _images_file_svg__WEBPACK_IMPORTED_MODULE_2__].forEach(src => { + createImageElement(src.split(".").pop(), src); +}); + +})(); + +/******/ })() +; +``` + +# Info + +## webpack output + +``` +asset images/89a353e9c515885abd8e.png 14.6 KiB [emitted] [immutable] [from: images/file.png] (auxiliary name: main) +asset output.js 13 KiB [emitted] (name: main) +chunk (runtime: main) output.js (main) 9.58 KiB (javascript) 14.6 KiB (asset) 306 bytes (runtime) [entry] [rendered] + > ./example.js main + dependent modules 8.86 KiB (javascript) 14.6 KiB (asset) [dependent] 3 modules + runtime modules 306 bytes 2 modules + ./example.js 742 bytes [built] [code generated] + [no exports] + [used exports unknown] + entry ./example.js main +webpack X.X.X compiled successfully +``` diff --git a/examples/asset-simple/build.js b/examples/asset-simple/build.js new file mode 100644 index 00000000000..2e93fe5a3e1 --- /dev/null +++ b/examples/asset-simple/build.js @@ -0,0 +1 @@ +require("../build-common"); diff --git a/examples/asset-simple/example.js b/examples/asset-simple/example.js new file mode 100644 index 00000000000..ba19e859f09 --- /dev/null +++ b/examples/asset-simple/example.js @@ -0,0 +1,30 @@ +import png from "./images/file.png"; +import jpg from "./images/file.jpg"; +import svg from "./images/file.svg"; + +const container = document.createElement("div"); +Object.assign(container.style, { + display: "flex", + justifyContent: "center" +}); +document.body.appendChild(container); + +function createImageElement(title, src) { + const div = document.createElement("div"); + div.style.textAlign = "center"; + + const h2 = document.createElement("h2"); + h2.textContent = title; + div.appendChild(h2); + + const img = document.createElement("img"); + img.setAttribute("src", src); + img.setAttribute("width", "150"); + div.appendChild(img); + + container.appendChild(div); +} + +[png, jpg, svg].forEach(src => { + createImageElement(src.split(".").pop(), src); +}); diff --git a/examples/asset-simple/images/file.jpg b/examples/asset-simple/images/file.jpg new file mode 100644 index 00000000000..fe5c6eefa79 Binary files /dev/null and b/examples/asset-simple/images/file.jpg differ diff --git a/examples/asset-simple/images/file.png b/examples/asset-simple/images/file.png new file mode 100644 index 00000000000..fb53b9dedd3 Binary files /dev/null and b/examples/asset-simple/images/file.png differ diff --git a/examples/asset-simple/images/file.svg b/examples/asset-simple/images/file.svg new file mode 100644 index 00000000000..d7b7e40b4f8 --- /dev/null +++ b/examples/asset-simple/images/file.svg @@ -0,0 +1 @@ +icon-square-small diff --git a/examples/asset-simple/index.html b/examples/asset-simple/index.html new file mode 100644 index 00000000000..d1fb49339c9 --- /dev/null +++ b/examples/asset-simple/index.html @@ -0,0 +1,5 @@ + + + + + diff --git a/examples/asset-simple/template.md b/examples/asset-simple/template.md new file mode 100644 index 00000000000..598823d5fa0 --- /dev/null +++ b/examples/asset-simple/template.md @@ -0,0 +1,29 @@ +This is a very simple example that shows the usage of the asset module type. + +Files can be imported like other modules without file-loader. + +# example.js + +```javascript +_{{example.js}}_ +``` + +# webpack.config.js + +```javascript +_{{webpack.config.js}}_ +``` + +# js/output.js + +```javascript +_{{dist/output.js}}_ +``` + +# Info + +## webpack output + +``` +_{{stdout}}_ +``` diff --git a/examples/asset-simple/webpack.config.js b/examples/asset-simple/webpack.config.js new file mode 100644 index 00000000000..8b935943f63 --- /dev/null +++ b/examples/asset-simple/webpack.config.js @@ -0,0 +1,13 @@ +module.exports = { + output: { + assetModuleFilename: "images/[hash][ext]" + }, + module: { + rules: [ + { + test: /\.(png|jpg|svg)$/, + type: "asset" + } + ] + } +}; diff --git a/examples/build-common.js b/examples/build-common.js index afca1e4d7c4..5517df5ab93 100644 --- a/examples/build-common.js +++ b/examples/build-common.js @@ -12,40 +12,98 @@ const async = require("neo-async"); const extraArgs = ""; -const targetArgs = global.NO_TARGET_ARGS ? "" : " ./example.js -o dist/output.js "; -const displayReasons = global.NO_REASONS ? "" : " --display-reasons --display-used-exports --display-provided-exports"; -const commonArgs = `--display-chunks --display-max-modules 99999 --display-origins --display-entrypoints --output-public-path "dist/" ${extraArgs} ${targetArgs}`; +const targetArgs = global.NO_TARGET_ARGS ? "" : "--entry ./example.js --output-filename output.js"; +const displayReasons = global.NO_REASONS ? "" : "--stats-reasons --stats-used-exports --stats-provided-exports"; +const statsArgs = global.NO_STATS_OPTIONS ? "" : "--stats-chunks --stats-modules-space 99999 --stats-chunk-origins"; +const publicPathArgs = global.NO_PUBLIC_PATH ? "" : '--output-public-path "dist/"'; +const statsColorsArg = global.STATS_COLORS ? "" : "--no-color"; +const commonArgs = `${statsColorsArg} ${statsArgs} ${publicPathArgs} ${extraArgs} ${targetArgs}`; let readme = fs.readFileSync(require("path").join(process.cwd(), "template.md"), "utf-8"); const doCompileAndReplace = (args, prefix, callback) => { - if(!tc.needResults(readme, prefix)) { + if (!tc.needResults(readme, prefix)) { callback(); return; } - if(fs.existsSync("dist")) - for(const file of fs.readdirSync("dist")) - fs.unlinkSync(`dist/${file}`); - cp.exec(`node ${path.resolve(__dirname, "../bin/webpack.js")} ${args} ${displayReasons} ${commonArgs}`, (error, stdout, stderr) => { - if(stderr) + + const deleteFiles = (dir) => { + const targetDir = path.resolve("dist", dir); + + if (path.extname(targetDir) === "") { + fs.readdirSync(targetDir).forEach((file) => { + deleteFiles(path.join(targetDir, file)); + }); + } else { + fs.unlinkSync(targetDir); + } + }; + + if (fs.existsSync("dist")) { + for (const dir of fs.readdirSync("dist")) { + deleteFiles(dir); + } + } + + try { + require.resolve("webpack-cli"); + } catch (e) { + throw new Error("Please install webpack-cli at root."); + } + + const connectIO = (subprocess) => { + const { stdin, stdout, stderr } = process; + const { stdin: _stdin, stdout: _stdout, stderr: _stderr } = subprocess; + const inputPair = [[stdin, _stdin]]; + const outputPair = [[stdout, _stdout], [stderr, _stderr]]; + inputPair.forEach(pair => { + pair[0].pipe(pair[1]) + }) + outputPair.forEach(pair => { + pair[1].pipe(pair[0]) + }) + disconnectIO = () => { + inputPair.forEach(pair => { + pair[0].unpipe(pair[1]) + }) + outputPair.forEach(pair => { + pair[1].unpipe(pair[0]) + }) + } + } + let disconnectIO = null; + + const subprocess = cp.exec(`node ${path.resolve(__dirname, "../bin/webpack.js")} ${args} ${displayReasons} ${commonArgs}`, (error, stdout, stderr) => { + disconnectIO && disconnectIO(); + if (stderr) console.log(stderr); - if(error !== null) + if (error !== null) console.log(error); try { - readme = tc.replaceResults(readme, process.cwd(), stdout.replace(/[\r?\n]*$/, ""), prefix); - } catch(e) { + readme = tc.replaceResults( + readme, + process.cwd(), + stdout + .replace(/[\r?\n]*$/, "") + .replace(/\d\d\d\d-(0[1-9]|1[0-2])-(0[1-9]|[1-2]\d|3[0-1])/g, "XXXX-XX-XX") + .replace(/([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]/g, "XXXX:XX:XX") + .replace(/webpack [0-9.]+/g, "webpack X.X.X"), + prefix + ); + } catch (e) { console.log(stderr); throw e; } callback(); }); + connectIO(subprocess); }; async.series([ - callback => doCompileAndReplace("--mode production", "production", callback), - callback => doCompileAndReplace("--mode development --devtool none", "development", callback), - callback => doCompileAndReplace("--mode none --output-pathinfo", "", callback) + callback => doCompileAndReplace("--mode production --env production", "production", callback), + callback => doCompileAndReplace("--mode development --env development --devtool none", "development", callback), + callback => doCompileAndReplace("--mode none --env none --output-pathinfo verbose", "", callback) ], () => { readme = tc.replaceBase(readme); - fs.writeFile("README.md", readme, "utf-8", function() {}); + fs.writeFile("README.md", readme, "utf-8", function () { }); }); diff --git a/examples/build-http/README.md b/examples/build-http/README.md new file mode 100644 index 00000000000..c3c27026d94 --- /dev/null +++ b/examples/build-http/README.md @@ -0,0 +1,92 @@ +# example.js + +```javascript +import pMap1 from "https://cdn.skypack.dev/p-map"; +import pMap2 from "https://cdn.esm.sh/p-map"; +import pMap3 from "https://jspm.dev/p-map"; +import pMap4 from "https://unpkg.com/p-map-series?module"; // unpkg doesn't support p-map :( +console.log(pMap1); +console.log(pMap2); +console.log(pMap3); +console.log(pMap4); +``` + +# webpack.config.js + +```javascript +module.exports = { + // enable debug logging to see network requests! + // stats: { + // loggingDebug: /HttpUriPlugin/ + // }, + experiments: { + buildHttp: [ + "https://cdn.esm.sh/", + "https://cdn.skypack.dev/", + "https://jspm.dev/", + /^https:\/\/unpkg\.com\/.+\?module$/ + ] + } +}; +``` + +# Info + +## Unoptimized + +``` +asset output.js 82.4 KiB [emitted] (name: main) +runtime modules 670 bytes 3 modules +modules by path https:// 30 KiB + modules by path https://jspm.dev/ 16.1 KiB 12 modules + modules by path https://cdn.esm.sh/ 6.15 KiB + https://cdn.esm.sh/p-map 173 bytes [built] [code generated] + [exports: default, pMapSkip] + [used exports unknown] + harmony side effect evaluation https://cdn.esm.sh/p-map ./example.js 2:0-45 + harmony import specifier https://cdn.esm.sh/p-map ./example.js 6:12-17 + https://cdn.esm.sh/v53/p-map@5.1.0/es2015/p-map.js 1.18 KiB [built] [code generated] + [exports: default, pMapSkip] + [used exports unknown] + harmony side effect evaluation https://cdn.esm.sh/v53/p-map@5.1.0/es2015/p-map.js https://cdn.esm.sh/p-map 2:0-67 + harmony export imported specifier https://cdn.esm.sh/v53/p-map@5.1.0/es2015/p-map.js https://cdn.esm.sh/p-map 2:0-67 + harmony side effect evaluation https://cdn.esm.sh/v53/p-map@5.1.0/es2015/p-map.js https://cdn.esm.sh/p-map 3:0-77 + harmony export imported specifier https://cdn.esm.sh/v53/p-map@5.1.0/es2015/p-map.js https://cdn.esm.sh/p-map 3:0-77 + + 5 modules + modules by path https://cdn.skypack.dev/ 7.46 KiB + https://cdn.skypack.dev/p-map 757 bytes [built] [code generated] + [exports: default, pMapSkip] + [used exports unknown] + harmony side effect evaluation https://cdn.skypack.dev/p-map ./example.js 1:0-50 + harmony import specifier https://cdn.skypack.dev/p-map ./example.js 5:12-17 + https://cdn.skypack.dev/-/p-map@v5.1.0-7ixXvZxXPKKt9unR9LT0/dist=es2020,mode=imp...(truncated) 2.29 KiB [built] [code generated] + [exports: default, pMapSkip] + [used exports unknown] + harmony side effect evaluation /-/p-map@v5.1.0-7ixXvZxXPKKt9unR9LT0/dist=es2020,mode=imports/optimized/p-map.js https://cdn.skypack.dev/p-map 15:0-97 + harmony export imported specifier /-/p-map@v5.1.0-7ixXvZxXPKKt9unR9LT0/dist=es2020,mode=imports/optimized/p-map.js https://cdn.skypack.dev/p-map 15:0-97 + harmony side effect evaluation /-/p-map@v5.1.0-7ixXvZxXPKKt9unR9LT0/dist=es2020,mode=imports/optimized/p-map.js https://cdn.skypack.dev/p-map 16:0-105 + harmony export imported specifier /-/p-map@v5.1.0-7ixXvZxXPKKt9unR9LT0/dist=es2020,mode=imports/optimized/p-map.js https://cdn.skypack.dev/p-map 16:0-105 + + 4 modules + https://unpkg.com/p-map-series?module 263 bytes [built] [code generated] + [exports: default] + [used exports unknown] + harmony side effect evaluation https://unpkg.com/p-map-series?module ./example.js 4:0-58 + harmony import specifier https://unpkg.com/p-map-series?module ./example.js 8:12-17 +./example.js 314 bytes [built] [code generated] + [no exports] + [used exports unknown] + entry ./example.js main +webpack X.X.X compiled successfully +``` + +## Production mode + +``` +asset output.js 12.4 KiB [emitted] [minimized] (name: main) +orphan modules 30 KiB [orphan] 26 modules +./example.js + 25 modules 30.2 KiB [built] [code generated] + [no exports] + [no exports used] + entry ./example.js main +webpack X.X.X compiled successfully +``` diff --git a/examples/build-http/build.js b/examples/build-http/build.js new file mode 100644 index 00000000000..1d8b07db18b --- /dev/null +++ b/examples/build-http/build.js @@ -0,0 +1,2 @@ +global.NO_STATS_OPTIONS = true; +require("../build-common"); diff --git a/examples/build-http/example.js b/examples/build-http/example.js new file mode 100644 index 00000000000..4dd7204b019 --- /dev/null +++ b/examples/build-http/example.js @@ -0,0 +1,8 @@ +import pMap1 from "https://cdn.skypack.dev/p-map"; +import pMap2 from "https://cdn.esm.sh/p-map"; +import pMap3 from "https://jspm.dev/p-map"; +import pMap4 from "https://unpkg.com/p-map-series?module"; // unpkg doesn't support p-map :( +console.log(pMap1); +console.log(pMap2); +console.log(pMap3); +console.log(pMap4); diff --git a/examples/build-http/template.md b/examples/build-http/template.md new file mode 100644 index 00000000000..2df3585bde6 --- /dev/null +++ b/examples/build-http/template.md @@ -0,0 +1,25 @@ +# example.js + +```javascript +_{{example.js}}_ +``` + +# webpack.config.js + +```javascript +_{{webpack.config.js}}_ +``` + +# Info + +## Unoptimized + +``` +_{{stdout}}_ +``` + +## Production mode + +``` +_{{production:stdout}}_ +``` diff --git a/examples/build-http/webpack.config.js b/examples/build-http/webpack.config.js new file mode 100644 index 00000000000..ca271913b30 --- /dev/null +++ b/examples/build-http/webpack.config.js @@ -0,0 +1,14 @@ +module.exports = { + // enable debug logging to see network requests! + // stats: { + // loggingDebug: /HttpUriPlugin/ + // }, + experiments: { + buildHttp: [ + "https://cdn.esm.sh/", + "https://cdn.skypack.dev/", + "https://jspm.dev/", + /^https:\/\/unpkg\.com\/.+\?module$/ + ] + } +}; diff --git a/examples/build-http/webpack.lock b/examples/build-http/webpack.lock new file mode 100644 index 00000000000..f696523fd3e --- /dev/null +++ b/examples/build-http/webpack.lock @@ -0,0 +1,29 @@ +{ + "https://cdn.esm.sh/p-map": { "integrity": "sha512-TfztRxlC5elIRa7x3oz4bfhtxJr5hIhoa+bliQkroNj8haEMPp1mv/eAsfzBt032G1oK6JT6y3135FP0vRh13Q==", "contentType": "application/javascript; charset=utf-8" }, + "https://cdn.esm.sh/v53/aggregate-error@4.0.0/es2015/aggregate-error.js": { "integrity": "sha512-4iHvwySJO0Dn0aenl2XY1XCGEoMZFaJ+PkuO8Op0BRVNwHiZaKrCuMnPZqUblPhvAG2o8SEA4JdB/fhS3IQZLg==", "contentType": "application/javascript" }, + "https://cdn.esm.sh/v53/clean-stack@4.1.0/es2015/clean-stack.js": { "integrity": "sha512-VzcwF50IxKsmW4O2DpY8WB6TmYh9caBctTqA2EkE3p9K8JjITMD/qBNqfVmUKAlmq4CFgI3c0xegzMf1BRWbyQ==", "contentType": "application/javascript" }, + "https://cdn.esm.sh/v53/escape-string-regexp@5.0.0/es2015/escape-string-regexp.js": { "integrity": "sha512-vst7rz+jFlvZMjo5GUzNBSq7QvFoaqOQ+hDq0m40ZJYGts6ptt+QKLZOMDWgoEq3Fabnhiy+hsoIfaHMmVdbSQ==", "contentType": "application/javascript" }, + "https://cdn.esm.sh/v53/indent-string@5.0.0/es2015/indent-string.js": { "integrity": "sha512-o1hDF1EyRTCiDpcxD2i0XpIuHCMFrc9XkKrkMISIaiWpJdKU7HBRhtqXfBcpVfJF1uNAFJ7/1v40vpPH2r7X8w==", "contentType": "application/javascript" }, + "https://cdn.esm.sh/v53/os-browserify@0.3.0/es2015/browser.js": { "integrity": "sha512-8JOZWkDGX6WNFtXIk/aOawVo35LZSIgCdbMrleK4QL8kHcYti2oTjfqfn99AJm6SOUsTt0uY5K808uHAvVe3eA==", "contentType": "application/javascript" }, + "https://cdn.esm.sh/v53/p-map@5.1.0/es2015/p-map.js": { "integrity": "sha512-3kEIICBOLKnEn6SNNixOBy+VGgwh0DYtn07yxHfagwiSJV8om7q/37RdHVbQ2pol8B/6oVMHo7Y6YYhmpYKDUA==", "contentType": "application/javascript" }, + "https://cdn.skypack.dev/-/aggregate-error@v4.0.0-rCH8s5R9g4kQQ807o58j/dist=es2020,mode=imports/optimized/aggregate-error.js": { "integrity": "sha512-E5rN3mgPTqyfHSovQ++ZyZWQkMUniuyjbeHHX+E4G3MStEx6TfObScB8tfHeIyuawSp86nVsFfMZjCruD61rdg==", "contentType": "application/javascript; charset=utf-8" }, + "https://cdn.skypack.dev/-/clean-stack@v4.1.0-DgWUKXHVzThBBZtsHXhC/dist=es2020,mode=imports/optimized/clean-stack.js": { "integrity": "sha512-1nEMT4Vc2YLu3EbeBnck7Traj0/D6G9MMSGraGpsoQIMKVuhQjq4gP76X6RxUn5GoiHv90KfrFMSWlbBn26Dhw==", "contentType": "application/javascript; charset=utf-8" }, + "https://cdn.skypack.dev/-/escape-string-regexp@v5.0.0-SUDdAhYOdAgXIYndxZss/dist=es2020,mode=imports/optimized/escape-string-regexp.js": { "integrity": "sha512-54oHYow5obgsKb0twQZMNLvCH2tV5MCOY4YHB0LQH+zVonIAn7JYZseUPWhC3MMkJFK5EkeNWDAX7P2camp27g==", "contentType": "application/javascript; charset=utf-8" }, + "https://cdn.skypack.dev/-/indent-string@v5.0.0-VgKPSgi4hUX5NbF4n3aC/dist=es2020,mode=imports/optimized/indent-string.js": { "integrity": "sha512-lSZAs06jEHkVlPMEeMtKbygGhrSmJUMVmpB6/2ChdG2F0694vRU1v6N12bUyqR5uGbbteTJ7atP5PmPtTVmlcw==", "contentType": "application/javascript; charset=utf-8" }, + "https://cdn.skypack.dev/-/p-map@v5.1.0-7ixXvZxXPKKt9unR9LT0/dist=es2020,mode=imports/optimized/p-map.js": { "integrity": "sha512-mZyhNJe8VlqEqafSkUGTooFrKcQPSwVjB3UxAAPqywSFD+age77uTRP6ul8uAMEQ3lllmengXX1q45igRxRcDw==", "contentType": "application/javascript; charset=utf-8" }, + "https://cdn.skypack.dev/p-map": { "integrity": "sha512-FFu6R9j8mrGqTvw8WL37XsWhI9P65XdPD9Jfs/47jiYNdex12f0XJNsIy+fI81PbOkCuEQRgm2nf0P76ieBlag==", "contentType": "application/javascript; charset=utf-8" }, + "https://jspm.dev/npm:@jspm/core@2.0.0-beta.11/nodelibs/os": { "integrity": "sha512-Jsg9UMzfNTnlPDu6FeftYzdp6XULJwLDI7xFSzULhMqjQUoOIHJhkAToEgr3NnEKCkLZQMIPuBvHAn0ud6gT+w==", "contentType": "application/javascript; charset=utf-8" }, + "https://jspm.dev/npm:@jspm/core@2.0.0-beta.11/nodelibs/process": { "integrity": "sha512-KIYEmkrnT7TL5EKA5coPbbdoqfL2twHFBVXKTZS+PU5aZFX90yELxZHrm4DhxSQ33FLAWo51/nQLQmqGekWNMw==", "contentType": "application/javascript; charset=utf-8" }, + "https://jspm.dev/npm:@jspm/core@2/nodelibs/os": { "integrity": "sha512-g2ppEW1AVdbIpc486D0ZmLIR5CtzMITkBwqoBgxvhiIq5/qHP4/unZ7Czk3q8A1UwdTI4wbGzRWndXAUa4/Q0Q==", "contentType": "application/javascript; charset=utf-8" }, + "https://jspm.dev/npm:aggregate-error@4": { "integrity": "sha512-XfXd6EZ09/SKLmWFFvjPCSkqv0E08IxKc8mFm9mePyLIiEiGyAKokeFt1wql+kG8ikGmI7YqKBsDf07/I31VvA==", "contentType": "application/javascript; charset=utf-8" }, + "https://jspm.dev/npm:aggregate-error@4.0.0": { "integrity": "sha512-HEobsVYXVCp5H4Z+6qAlKno8XAJwHQrfF4ivR4PHrp4ttM0Yg0zDfOcsjqJOnTP5hEnKR1K6OzQdPfR2r9of4g==", "contentType": "application/javascript; charset=utf-8" }, + "https://jspm.dev/npm:clean-stack@4": { "integrity": "sha512-3wh/QTJY4tw/GInIcn5I+0hsHSirJi8Tf3kmH85hzQsuwB5k2lghBFZyKZPO7/Ql3muvZeDgN02pYkZap59Qrw==", "contentType": "application/javascript; charset=utf-8" }, + "https://jspm.dev/npm:clean-stack@4.1.0": { "integrity": "sha512-VgNMH/ju9thH4YuxxA5trzs0u66nzRZhMa43jkhk8q6jxlEBhd7G6ZZxswy2a0ZXiXjPQVhzXfFkAIkY/pxTOg==", "contentType": "application/javascript; charset=utf-8" }, + "https://jspm.dev/npm:escape-string-regexp@5.0.0": { "integrity": "sha512-Hz7n4npzwf0UgkdjQvLN2HxudnAzllTEM9AzJPlnzf9ktGhkwlFltPQBjEM3xyDHeTj1xI1nYpBSRVQmMCl6bw==", "contentType": "application/javascript; charset=utf-8" }, + "https://jspm.dev/npm:indent-string@5": { "integrity": "sha512-hjMQ8+LX0q8xe2sCp/DEBJW2MrVFbiDv20pK0PWwENkYCkRlyP5L4t5AUiXLEXfJLUhTVrUfZtf+hmrnGJB/zA==", "contentType": "application/javascript; charset=utf-8" }, + "https://jspm.dev/npm:indent-string@5.0.0": { "integrity": "sha512-1KRJ7I1gDWWBAXz+NpwQnlJXDiSpaxaftugln1zHywLbqhA/akcZYM6+nTdfSSuQ7wiVong69R5X9l/QKWqO7g==", "contentType": "application/javascript; charset=utf-8" }, + "https://jspm.dev/npm:p-map@5.1.0": { "integrity": "sha512-Ml4ozElyzZEvq3G61nmeDVjEPVbjNzhWwIfvVcEr0OsUu58yT/ieSJWr6VSSHbNGY8B1IYjJCEO2zFrgIT9plQ==", "contentType": "application/javascript; charset=utf-8" }, + "https://jspm.dev/p-map": { "integrity": "sha512-Ztuu37YpSElOGm1OnAmLzhgTuTSyeDXCudBO94yRDDicb2zwUTIDEaVnHMJ6Gb7AVnKk26uubHB+Hw0XxKRnrw==", "contentType": "application/javascript; charset=utf-8" }, + "https://unpkg.com/p-map-series?module": { "resolved": "https://unpkg.com/p-map-series@3.0.0/index.js?module", "integrity": "sha512-e68FFGx6Hb3/2x4o16EWcd6rdmyiov0OLjPnj2bmc60JrrNowav76umw0Gc5TmT+UOjaJo9Xk2lTGQT1/Y6Jug==", "contentType": "application/javascript; charset=utf-8" }, + "version": 1 +} diff --git a/examples/build-http/webpack.lock.data/https_cdn.esm.sh/p-map_9dd32c023fd5f3d3e7f2 b/examples/build-http/webpack.lock.data/https_cdn.esm.sh/p-map_9dd32c023fd5f3d3e7f2 new file mode 100644 index 00000000000..5034fb3895a --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_cdn.esm.sh/p-map_9dd32c023fd5f3d3e7f2 @@ -0,0 +1,3 @@ +/* esm.sh - p-map@5.1.0 */ +export * from "https://cdn.esm.sh/v53/p-map@5.1.0/es2015/p-map.js"; +export { default } from "https://cdn.esm.sh/v53/p-map@5.1.0/es2015/p-map.js"; diff --git a/examples/build-http/webpack.lock.data/https_cdn.esm.sh/v53_aggregate-error_4.0.0_es2015_aggregate-error_ff6bcc1ba33bf3b1810a.js b/examples/build-http/webpack.lock.data/https_cdn.esm.sh/v53_aggregate-error_4.0.0_es2015_aggregate-error_ff6bcc1ba33bf3b1810a.js new file mode 100644 index 00000000000..7d5f29fd065 --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_cdn.esm.sh/v53_aggregate-error_4.0.0_es2015_aggregate-error_ff6bcc1ba33bf3b1810a.js @@ -0,0 +1,4 @@ +/* esm.sh - esbuild bundle(aggregate-error@4.0.0) es2015 production */ +var l=Object.defineProperty;var f=(n,t,e)=>t in n?l(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e;var s=(n,t,e)=>(f(n,typeof t!="symbol"?t+"":t,e),e),i=(n,t,e)=>{if(!t.has(n))throw TypeError("Cannot "+e)};var c=(n,t,e)=>(i(n,t,"read from private field"),e?e.call(n):t.get(n)),g=(n,t,e)=>{if(t.has(n))throw TypeError("Cannot add the same private member more than once");t instanceof WeakSet?t.add(n):t.set(n,e)},o=(n,t,e,a)=>(i(n,t,"write to private field"),a?a.call(n,e):t.set(n,e),e);import u from"/v53/indent-string@5.0.0/es2015/indent-string.js";import m from"/v53/clean-stack@4.1.0/es2015/clean-stack.js";var d=n=>n.replace(/\s+at .*aggregate-error\/index.js:\d+:\d+\)?/g,""),r,p=class extends Error{constructor(t){if(!Array.isArray(t))throw new TypeError(`Expected input to be an Array, got ${typeof t}`);t=t.map(a=>a instanceof Error?a:a!==null&&typeof a=="object"?Object.assign(new Error(a.message),a):new Error(a));let e=t.map(a=>typeof a.stack=="string"?d(m(a.stack)):String(a)).join(` +`);e=` +`+u(e,4);super(e);g(this,r,void 0);s(this,"name","AggregateError");o(this,r,t)}get errors(){return c(this,r).slice()}};r=new WeakMap;export{p as default}; diff --git a/examples/build-http/webpack.lock.data/https_cdn.esm.sh/v53_clean-stack_4.1.0_es2015_clean-stack_87b32b37ae264a8e8a1c.js b/examples/build-http/webpack.lock.data/https_cdn.esm.sh/v53_clean-stack_4.1.0_es2015_clean-stack_87b32b37ae264a8e8a1c.js new file mode 100644 index 00000000000..a3c644a1fb2 --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_cdn.esm.sh/v53_clean-stack_4.1.0_es2015_clean-stack_87b32b37ae264a8e8a1c.js @@ -0,0 +1,4 @@ +/* esm.sh - esbuild bundle(clean-stack@4.1.0) es2015 production */ +import s from"/v53/os-browserify@0.3.0/es2015/browser.js";import i from"/v53/escape-string-regexp@5.0.0/es2015/escape-string-regexp.js";var p=/\s+at.*[(\s](.*)\)?/,l=/^(?:(?:(?:node|node:[\w/]+|(?:(?:node:)?internal\/[\w/]*|.*node_modules\/(?:babel-polyfill|pirates)\/.*)?\w+)(?:\.js)?:\d+:\d+)|native)/,f=typeof s.homedir=="undefined"?"":s.homedir().replace(/\\/g,"/");function u(n,{pretty:c=!1,basePath:a}={}){let o=a&&new RegExp(`(at | \\()${i(a.replace(/\\/g,"/"))}`,"g");if(typeof n=="string")return n.replace(/\\/g,"/").split(` +`).filter(e=>{let r=e.match(p);if(r===null||!r[1])return!0;let t=r[1];return t.includes(".app/Contents/Resources/electron.asar")||t.includes(".app/Contents/Resources/default_app.asar")?!1:!l.test(t)}).filter(e=>e.trim()!=="").map(e=>(o&&(e=e.replace(o,"$1")),c&&(e=e.replace(p,(r,t)=>r.replace(t,t.replace(f,"~")))),e)).join(` +`)}export{u as default}; diff --git a/examples/build-http/webpack.lock.data/https_cdn.esm.sh/v53_escape-string-regexp_5.0.0_es2015_escape-string-regexp_2c814e466860133eca86.js b/examples/build-http/webpack.lock.data/https_cdn.esm.sh/v53_escape-string-regexp_5.0.0_es2015_escape-string-regexp_2c814e466860133eca86.js new file mode 100644 index 00000000000..a70aa3b9a9e --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_cdn.esm.sh/v53_escape-string-regexp_5.0.0_es2015_escape-string-regexp_2c814e466860133eca86.js @@ -0,0 +1,2 @@ +/* esm.sh - esbuild bundle(escape-string-regexp@5.0.0) es2015 production */ +function r(e){if(typeof e!="string")throw new TypeError("Expected a string");return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}export{r as default}; diff --git a/examples/build-http/webpack.lock.data/https_cdn.esm.sh/v53_indent-string_5.0.0_es2015_indent-string_171b2b5ba89965a085b6.js b/examples/build-http/webpack.lock.data/https_cdn.esm.sh/v53_indent-string_5.0.0_es2015_indent-string_171b2b5ba89965a085b6.js new file mode 100644 index 00000000000..758f021c33e --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_cdn.esm.sh/v53_indent-string_5.0.0_es2015_indent-string_171b2b5ba89965a085b6.js @@ -0,0 +1,2 @@ +/* esm.sh - esbuild bundle(indent-string@5.0.0) es2015 production */ +function i(t,e=1,o={}){let{indent:r=" ",includeEmptyLines:n=!1}=o;if(typeof t!="string")throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof t}\``);if(typeof e!="number")throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof e}\``);if(e<0)throw new RangeError(`Expected \`count\` to be at least 0, got \`${e}\``);if(typeof r!="string")throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof r}\``);if(e===0)return t;let p=n?/^/gm:/^(?!\s*$)/gm;return t.replace(p,r.repeat(e))}export{i as default}; diff --git a/examples/build-http/webpack.lock.data/https_cdn.esm.sh/v53_os-browserify_0.3.0_es2015_browser_476a088316baaea08336.js b/examples/build-http/webpack.lock.data/https_cdn.esm.sh/v53_os-browserify_0.3.0_es2015_browser_476a088316baaea08336.js new file mode 100644 index 00000000000..951e12edff7 --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_cdn.esm.sh/v53_os-browserify_0.3.0_es2015_browser_476a088316baaea08336.js @@ -0,0 +1,3 @@ +/* esm.sh - esbuild bundle(os-browserify@0.3.0/browser) es2015 production */ +var f=Object.create;var o=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var c=Object.getPrototypeOf,p=Object.prototype.hasOwnProperty;var d=e=>o(e,"__esModule",{value:!0});var l=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var w=(e,t,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of m(t))!p.call(e,n)&&n!=="default"&&o(e,n,{get:()=>t[n],enumerable:!(i=s(t,n))||i.enumerable});return e},a=e=>w(d(o(e!=null?f(c(e)):{},"default",e&&e.__esModule&&"default"in e?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e);var u=l(r=>{r.endianness=function(){return"LE"};r.hostname=function(){return typeof location!="undefined"?location.hostname:""};r.loadavg=function(){return[]};r.uptime=function(){return 0};r.freemem=function(){return Number.MAX_VALUE};r.totalmem=function(){return Number.MAX_VALUE};r.cpus=function(){return[]};r.type=function(){return"Browser"};r.release=function(){return typeof navigator!="undefined"?navigator.appVersion:""};r.networkInterfaces=r.getNetworkInterfaces=function(){return{}};r.arch=function(){return"javascript"};r.platform=function(){return"browser"};r.tmpdir=r.tmpDir=function(){return"/tmp"};r.EOL=` +`;r.homedir=function(){return"/"}});var b=a(u()),h=a(u()),{endianness:v,hostname:E,loadavg:L,uptime:k,freemem:A,totalmem:I,cpus:N,type:_,release:V,networkInterfaces:x,getNetworkInterfaces:D,arch:M,platform:O,tmpdir:U,tmpDir:X,EOL:j,homedir:B}=b;var export_default=h.default;export{j as EOL,M as arch,N as cpus,export_default as default,v as endianness,A as freemem,D as getNetworkInterfaces,B as homedir,E as hostname,L as loadavg,x as networkInterfaces,O as platform,V as release,X as tmpDir,U as tmpdir,I as totalmem,_ as type,k as uptime}; diff --git a/examples/build-http/webpack.lock.data/https_cdn.esm.sh/v53_p-map_5.1.0_es2015_p-map_cd0c09542673ea9d78f0.js b/examples/build-http/webpack.lock.data/https_cdn.esm.sh/v53_p-map_5.1.0_es2015_p-map_cd0c09542673ea9d78f0.js new file mode 100644 index 00000000000..8baf6a8521d --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_cdn.esm.sh/v53_p-map_5.1.0_es2015_p-map_cd0c09542673ea9d78f0.js @@ -0,0 +1,2 @@ +/* esm.sh - esbuild bundle(p-map@5.1.0) es2015 production */ +var g=(l,s,e)=>new Promise((f,x)=>{var N=t=>{try{n(e.next(t))}catch(r){x(r)}},p=t=>{try{n(e.throw(t))}catch(r){x(r)}},n=t=>t.done?f(t.value):Promise.resolve(t.value).then(N,p);n((e=e.apply(l,s)).next())});import y from"/v53/aggregate-error@4.0.0/es2015/aggregate-error.js";function S(x,N){return g(this,arguments,function*(l,s,{concurrency:e=Number.POSITIVE_INFINITY,stopOnError:f=!0}={}){return new Promise((p,n)=>{if(typeof s!="function")throw new TypeError("Mapper function is required");if(!((Number.isSafeInteger(e)||e===Number.POSITIVE_INFINITY)&&e>=1))throw new TypeError(`Expected \`concurrency\` to be an integer from 1 and up or \`Infinity\`, got \`${e}\` (${typeof e})`);let t=[],r=[],m=[],h=l[Symbol.iterator](),u=!1,c=!1,a=0,b=0,I=()=>{if(u)return;let i=h.next(),d=b;if(b++,i.done){if(c=!0,a===0)if(!f&&r.length>0)n(new y(r));else{for(let o of m)t.splice(o,1);p(t)}return}a++,(()=>g(this,null,function*(){try{let o=yield i.value;if(u)return;let w=yield s(o,d);w===T?m.push(d):t[d]=w,a--,I()}catch(o){f?(u=!0,n(o)):(r.push(o),a--,I())}}))()};for(let i=0;i { + if (typeof key !== "symbol") + key += ""; + if (key in obj) + return __defProp(obj, key, {enumerable: true, configurable: true, writable: true, value}); + return obj[key] = value; +}; +var __accessCheck = (obj, member, msg) => { + if (!member.has(obj)) + throw TypeError("Cannot " + msg); +}; +var __privateGet = (obj, member, getter) => { + __accessCheck(obj, member, "read from private field"); + return getter ? getter.call(obj) : member.get(obj); +}; +var __privateSet = (obj, member, value, setter) => { + __accessCheck(obj, member, "write to private field"); + setter ? setter.call(obj, value) : member.set(obj, value); + return value; +}; +var _errors; +import indentString from "/-/indent-string@v5.0.0-VgKPSgi4hUX5NbF4n3aC/dist=es2020,mode=imports/optimized/indent-string.js"; +import cleanStack from "/-/clean-stack@v4.1.0-DgWUKXHVzThBBZtsHXhC/dist=es2020,mode=imports/optimized/clean-stack.js"; +const cleanInternalStack = (stack) => stack.replace(/\s+at .*aggregate-error\/index.js:\d+:\d+\)?/g, ""); +class AggregateError extends Error { + constructor(errors) { + _errors.set(this, void 0); + __publicField(this, "name", "AggregateError"); + if (!Array.isArray(errors)) { + throw new TypeError(`Expected input to be an Array, got ${typeof errors}`); + } + errors = errors.map((error) => { + if (error instanceof Error) { + return error; + } + if (error !== null && typeof error === "object") { + return Object.assign(new Error(error.message), error); + } + return new Error(error); + }); + let message = errors.map((error) => { + return typeof error.stack === "string" ? cleanInternalStack(cleanStack(error.stack)) : String(error); + }).join("\n"); + message = "\n" + indentString(message, 4); + super(message); + __privateSet(this, _errors, errors); + } + get errors() { + return __privateGet(this, _errors).slice(); + } +} +_errors = new WeakMap(); +export default AggregateError; diff --git a/examples/build-http/webpack.lock.data/https_cdn.skypack.dev/clean-stack_v4.1.0-DgWUKXHVzThBBZtsHXhC_dist_es2020_mode_imports_optimized_clean-stack_25e0e8c6773c790b5bc1.js b/examples/build-http/webpack.lock.data/https_cdn.skypack.dev/clean-stack_v4.1.0-DgWUKXHVzThBBZtsHXhC_dist_es2020_mode_imports_optimized_clean-stack_25e0e8c6773c790b5bc1.js new file mode 100644 index 00000000000..d8afc7bdf1c --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_cdn.skypack.dev/clean-stack_v4.1.0-DgWUKXHVzThBBZtsHXhC_dist_es2020_mode_imports_optimized_clean-stack_25e0e8c6773c790b5bc1.js @@ -0,0 +1,31 @@ +import escapeStringRegexp from "/-/escape-string-regexp@v5.0.0-SUDdAhYOdAgXIYndxZss/dist=es2020,mode=imports/optimized/escape-string-regexp.js"; +var os = {}; +const extractPathRegex = /\s+at.*[(\s](.*)\)?/; +const pathRegex = /^(?:(?:(?:node|node:[\w/]+|(?:(?:node:)?internal\/[\w/]*|.*node_modules\/(?:babel-polyfill|pirates)\/.*)?\w+)(?:\.js)?:\d+:\d+)|native)/; +const homeDir = typeof os.homedir === "undefined" ? "" : os.homedir().replace(/\\/g, "/"); +function cleanStack(stack, {pretty = false, basePath} = {}) { + const basePathRegex = basePath && new RegExp(`(at | \\()${escapeStringRegexp(basePath.replace(/\\/g, "/"))}`, "g"); + if (typeof stack !== "string") { + return void 0; + } + return stack.replace(/\\/g, "/").split("\n").filter((line) => { + const pathMatches = line.match(extractPathRegex); + if (pathMatches === null || !pathMatches[1]) { + return true; + } + const match = pathMatches[1]; + if (match.includes(".app/Contents/Resources/electron.asar") || match.includes(".app/Contents/Resources/default_app.asar")) { + return false; + } + return !pathRegex.test(match); + }).filter((line) => line.trim() !== "").map((line) => { + if (basePathRegex) { + line = line.replace(basePathRegex, "$1"); + } + if (pretty) { + line = line.replace(extractPathRegex, (m, p1) => m.replace(p1, p1.replace(homeDir, "~"))); + } + return line; + }).join("\n"); +} +export default cleanStack; diff --git a/examples/build-http/webpack.lock.data/https_cdn.skypack.dev/escape-string-regexp_v5.0.0-SUDdAhYOdAgXIYndxZss_dist_es2020_mode_imports_optimized_escape-string-regexp_95a4ae8a862c0536f335.js b/examples/build-http/webpack.lock.data/https_cdn.skypack.dev/escape-string-regexp_v5.0.0-SUDdAhYOdAgXIYndxZss_dist_es2020_mode_imports_optimized_escape-string-regexp_95a4ae8a862c0536f335.js new file mode 100644 index 00000000000..d0aaf2eea76 --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_cdn.skypack.dev/escape-string-regexp_v5.0.0-SUDdAhYOdAgXIYndxZss_dist_es2020_mode_imports_optimized_escape-string-regexp_95a4ae8a862c0536f335.js @@ -0,0 +1,7 @@ +function escapeStringRegexp(string) { + if (typeof string !== "string") { + throw new TypeError("Expected a string"); + } + return string.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d"); +} +export default escapeStringRegexp; diff --git a/examples/build-http/webpack.lock.data/https_cdn.skypack.dev/indent-string_v5.0.0-VgKPSgi4hUX5NbF4n3aC_dist_es2020_mode_imports_optimized_indent-string_c9ee21b059896b4e6290.js b/examples/build-http/webpack.lock.data/https_cdn.skypack.dev/indent-string_v5.0.0-VgKPSgi4hUX5NbF4n3aC_dist_es2020_mode_imports_optimized_indent-string_c9ee21b059896b4e6290.js new file mode 100644 index 00000000000..307e1901ff0 --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_cdn.skypack.dev/indent-string_v5.0.0-VgKPSgi4hUX5NbF4n3aC_dist_es2020_mode_imports_optimized_indent-string_c9ee21b059896b4e6290.js @@ -0,0 +1,24 @@ +function indentString(string, count = 1, options = {}) { + const { + indent = " ", + includeEmptyLines = false + } = options; + if (typeof string !== "string") { + throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof string}\``); + } + if (typeof count !== "number") { + throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof count}\``); + } + if (count < 0) { + throw new RangeError(`Expected \`count\` to be at least 0, got \`${count}\``); + } + if (typeof indent !== "string") { + throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof indent}\``); + } + if (count === 0) { + return string; + } + const regex = includeEmptyLines ? /^/gm : /^(?!\s*$)/gm; + return string.replace(regex, indent.repeat(count)); +} +export default indentString; diff --git a/examples/build-http/webpack.lock.data/https_cdn.skypack.dev/p-map_85ed609042d47e169edd b/examples/build-http/webpack.lock.data/https_cdn.skypack.dev/p-map_85ed609042d47e169edd new file mode 100644 index 00000000000..aca926092c6 --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_cdn.skypack.dev/p-map_85ed609042d47e169edd @@ -0,0 +1,16 @@ +/* + * Skypack CDN - p-map@5.1.0 + * + * Learn more: + * 📙 Package Documentation: https://www.skypack.dev/view/p-map + * 📘 Skypack Documentation: https://www.skypack.dev/docs + * + * Pinned URL: (Optimized for Production) + * ▶️ Normal: https://cdn.skypack.dev/pin/p-map@v5.1.0-7ixXvZxXPKKt9unR9LT0/mode=imports/optimized/p-map.js + * ⏩ Minified: https://cdn.skypack.dev/pin/p-map@v5.1.0-7ixXvZxXPKKt9unR9LT0/mode=imports,min/optimized/p-map.js + * + */ + +// Browser-Optimized Imports (Don't directly import the URLs below in your application!) +export * from '/-/p-map@v5.1.0-7ixXvZxXPKKt9unR9LT0/dist=es2020,mode=imports/optimized/p-map.js'; +export {default} from '/-/p-map@v5.1.0-7ixXvZxXPKKt9unR9LT0/dist=es2020,mode=imports/optimized/p-map.js'; diff --git a/examples/build-http/webpack.lock.data/https_cdn.skypack.dev/p-map_v5.1.0-7ixXvZxXPKKt9unR9LT0_dist_es2020_mode_imports_optimized_p-map_ddf2a76b117954d701e6.js b/examples/build-http/webpack.lock.data/https_cdn.skypack.dev/p-map_v5.1.0-7ixXvZxXPKKt9unR9LT0_dist_es2020_mode_imports_optimized_p-map_ddf2a76b117954d701e6.js new file mode 100644 index 00000000000..921f352df03 --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_cdn.skypack.dev/p-map_v5.1.0-7ixXvZxXPKKt9unR9LT0_dist_es2020_mode_imports_optimized_p-map_ddf2a76b117954d701e6.js @@ -0,0 +1,79 @@ +import AggregateError from "/-/aggregate-error@v4.0.0-rCH8s5R9g4kQQ807o58j/dist=es2020,mode=imports/optimized/aggregate-error.js"; +async function pMap(iterable, mapper, { + concurrency = Number.POSITIVE_INFINITY, + stopOnError = true +} = {}) { + return new Promise((resolve, reject) => { + if (typeof mapper !== "function") { + throw new TypeError("Mapper function is required"); + } + if (!((Number.isSafeInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency >= 1)) { + throw new TypeError(`Expected \`concurrency\` to be an integer from 1 and up or \`Infinity\`, got \`${concurrency}\` (${typeof concurrency})`); + } + const result = []; + const errors = []; + const skippedIndexes = []; + const iterator = iterable[Symbol.iterator](); + let isRejected = false; + let isIterableDone = false; + let resolvingCount = 0; + let currentIndex = 0; + const next = () => { + if (isRejected) { + return; + } + const nextItem = iterator.next(); + const index = currentIndex; + currentIndex++; + if (nextItem.done) { + isIterableDone = true; + if (resolvingCount === 0) { + if (!stopOnError && errors.length > 0) { + reject(new AggregateError(errors)); + } else { + for (const skippedIndex of skippedIndexes) { + result.splice(skippedIndex, 1); + } + resolve(result); + } + } + return; + } + resolvingCount++; + (async () => { + try { + const element = await nextItem.value; + if (isRejected) { + return; + } + const value = await mapper(element, index); + if (value === pMapSkip) { + skippedIndexes.push(index); + } else { + result[index] = value; + } + resolvingCount--; + next(); + } catch (error) { + if (stopOnError) { + isRejected = true; + reject(error); + } else { + errors.push(error); + resolvingCount--; + next(); + } + } + })(); + }; + for (let index = 0; index < concurrency; index++) { + next(); + if (isIterableDone) { + break; + } + } + }); +} +const pMapSkip = Symbol("skip"); +export default pMap; +export {pMapSkip}; diff --git a/examples/build-http/webpack.lock.data/https_jspm.dev/npm_aggregate-error_4.0_50f751f77af91e405af4.0 b/examples/build-http/webpack.lock.data/https_jspm.dev/npm_aggregate-error_4.0_50f751f77af91e405af4.0 new file mode 100644 index 00000000000..65063d10575 --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_jspm.dev/npm_aggregate-error_4.0_50f751f77af91e405af4.0 @@ -0,0 +1,48 @@ +import indentString from './npm:indent-string@5'; +import cleanStack from './npm:clean-stack@4'; + +const cleanInternalStack = stack => stack.replace(/\s+at .*aggregate-error\/index.js:\d+:\d+\)?/g, ''); + +class AggregateError extends Error { + #errors; + + name = 'AggregateError'; + + constructor(errors) { + if (!Array.isArray(errors)) { + throw new TypeError(`Expected input to be an Array, got ${typeof errors}`); + } + + errors = errors.map(error => { + if (error instanceof Error) { + return error; + } + + if (error !== null && typeof error === 'object') { + // Handle plain error objects with message property and/or possibly other metadata + return Object.assign(new Error(error.message), error); + } + + return new Error(error); + }); + + let message = errors + .map(error => { + // The `stack` property is not standardized, so we can't assume it exists + return typeof error.stack === 'string' ? cleanInternalStack(cleanStack(error.stack)) : String(error); + }) + .join('\n'); + message = '\n' + indentString(message, 4); + super(message); + + this.#errors = errors; + } + + get errors() { + return this.#errors.slice(); + } +} + +export default AggregateError; + +//# sourceMappingURL=npm:aggregate-error@4.0.0.map \ No newline at end of file diff --git a/examples/build-http/webpack.lock.data/https_jspm.dev/npm_aggregate-error_4_a354b9220c6e41b430f0 b/examples/build-http/webpack.lock.data/https_jspm.dev/npm_aggregate-error_4_a354b9220c6e41b430f0 new file mode 100644 index 00000000000..511f78a97ed --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_jspm.dev/npm_aggregate-error_4_a354b9220c6e41b430f0 @@ -0,0 +1,3 @@ +import "/npm:indent-string@5"; +import "/npm:clean-stack@4"; +export { default } from "/npm:aggregate-error@4.0.0"; diff --git a/examples/build-http/webpack.lock.data/https_jspm.dev/npm_clean-stack_4.1_b2805ba009abd32b0160.0 b/examples/build-http/webpack.lock.data/https_jspm.dev/npm_clean-stack_4.1_b2805ba009abd32b0160.0 new file mode 100644 index 00000000000..8d14e04d2a0 --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_jspm.dev/npm_clean-stack_4.1_b2805ba009abd32b0160.0 @@ -0,0 +1,52 @@ +import os from './npm:@jspm/core@2/nodelibs/os'; +import escapeStringRegexp from './npm:escape-string-regexp@5.0.0'; + +const extractPathRegex = /\s+at.*[(\s](.*)\)?/; +const pathRegex = /^(?:(?:(?:node|node:[\w/]+|(?:(?:node:)?internal\/[\w/]*|.*node_modules\/(?:babel-polyfill|pirates)\/.*)?\w+)(?:\.js)?:\d+:\d+)|native)/; +const homeDir = typeof os.homedir === 'undefined' ? '' : os.homedir().replace(/\\/g, '/'); + +function cleanStack(stack, {pretty = false, basePath} = {}) { + const basePathRegex = basePath && new RegExp(`(at | \\()${escapeStringRegexp(basePath.replace(/\\/g, '/'))}`, 'g'); + + if (typeof stack !== 'string') { + return undefined; + } + + return stack.replace(/\\/g, '/') + .split('\n') + .filter(line => { + const pathMatches = line.match(extractPathRegex); + if (pathMatches === null || !pathMatches[1]) { + return true; + } + + const match = pathMatches[1]; + + // Electron + if ( + match.includes('.app/Contents/Resources/electron.asar') || + match.includes('.app/Contents/Resources/default_app.asar') + ) { + return false; + } + + return !pathRegex.test(match); + }) + .filter(line => line.trim() !== '') + .map(line => { + if (basePathRegex) { + line = line.replace(basePathRegex, '$1'); + } + + if (pretty) { + line = line.replace(extractPathRegex, (m, p1) => m.replace(p1, p1.replace(homeDir, '~'))); + } + + return line; + }) + .join('\n'); +} + +export default cleanStack; + +//# sourceMappingURL=npm:clean-stack@4.1.0.map \ No newline at end of file diff --git a/examples/build-http/webpack.lock.data/https_jspm.dev/npm_clean-stack_4_760ca83301f78911741b b/examples/build-http/webpack.lock.data/https_jspm.dev/npm_clean-stack_4_760ca83301f78911741b new file mode 100644 index 00000000000..256472ccdd7 --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_jspm.dev/npm_clean-stack_4_760ca83301f78911741b @@ -0,0 +1,3 @@ +import "/npm:@jspm/core@2/nodelibs/os"; +import "/npm:escape-string-regexp@5.0.0"; +export { default } from "/npm:clean-stack@4.1.0"; diff --git a/examples/build-http/webpack.lock.data/https_jspm.dev/npm_escape-string-regexp_5.0_703470061c4748c30ba2.0 b/examples/build-http/webpack.lock.data/https_jspm.dev/npm_escape-string-regexp_5.0_703470061c4748c30ba2.0 new file mode 100644 index 00000000000..3e1c303b111 --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_jspm.dev/npm_escape-string-regexp_5.0_703470061c4748c30ba2.0 @@ -0,0 +1,15 @@ +function escapeStringRegexp(string) { + if (typeof string !== 'string') { + throw new TypeError('Expected a string'); + } + + // Escape characters with special meaning either inside or outside character sets. + // Use a simple backslash escape when it’s always valid, and a `\xnn` escape when the simpler form would be disallowed by Unicode patterns’ stricter grammar. + return string + .replace(/[|\\{}()[\]^$+*?.]/g, '\\$&') + .replace(/-/g, '\\x2d'); +} + +export default escapeStringRegexp; + +//# sourceMappingURL=npm:escape-string-regexp@5.0.0.map \ No newline at end of file diff --git a/examples/build-http/webpack.lock.data/https_jspm.dev/npm_indent-string_5.0_39c50c3c56a92bbf73ba.0 b/examples/build-http/webpack.lock.data/https_jspm.dev/npm_indent-string_5.0_39c50c3c56a92bbf73ba.0 new file mode 100644 index 00000000000..f4ccda81d23 --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_jspm.dev/npm_indent-string_5.0_39c50c3c56a92bbf73ba.0 @@ -0,0 +1,42 @@ +function indentString(string, count = 1, options = {}) { + const { + indent = ' ', + includeEmptyLines = false + } = options; + + if (typeof string !== 'string') { + throw new TypeError( + `Expected \`input\` to be a \`string\`, got \`${typeof string}\`` + ); + } + + if (typeof count !== 'number') { + throw new TypeError( + `Expected \`count\` to be a \`number\`, got \`${typeof count}\`` + ); + } + + if (count < 0) { + throw new RangeError( + `Expected \`count\` to be at least 0, got \`${count}\`` + ); + } + + if (typeof indent !== 'string') { + throw new TypeError( + `Expected \`options.indent\` to be a \`string\`, got \`${typeof indent}\`` + ); + } + + if (count === 0) { + return string; + } + + const regex = includeEmptyLines ? /^/gm : /^(?!\s*$)/gm; + + return string.replace(regex, indent.repeat(count)); +} + +export default indentString; + +//# sourceMappingURL=npm:indent-string@5.0.0.map \ No newline at end of file diff --git a/examples/build-http/webpack.lock.data/https_jspm.dev/npm_indent-string_5_01a4f4bd5c5dc36ce1b7 b/examples/build-http/webpack.lock.data/https_jspm.dev/npm_indent-string_5_01a4f4bd5c5dc36ce1b7 new file mode 100644 index 00000000000..f8b9348076a --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_jspm.dev/npm_indent-string_5_01a4f4bd5c5dc36ce1b7 @@ -0,0 +1 @@ +export { default } from "/npm:indent-string@5.0.0"; diff --git a/examples/build-http/webpack.lock.data/https_jspm.dev/npm_jspm_core_2.0.0-beta_12b8110471722e74fcb6.11_nodelibs_process b/examples/build-http/webpack.lock.data/https_jspm.dev/npm_jspm_core_2.0.0-beta_12b8110471722e74fcb6.11_nodelibs_process new file mode 100644 index 00000000000..203f79bb446 --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_jspm.dev/npm_jspm_core_2.0.0-beta_12b8110471722e74fcb6.11_nodelibs_process @@ -0,0 +1,277 @@ +function unimplemented(name) { + throw new Error('Node.js process ' + name + ' is not supported by JSPM core outside of Node.js'); +} + +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) + return; + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } + else { + queueIndex = -1; + } + if (queue.length) + drainQueue(); +} + +function drainQueue() { + if (draining) + return; + var timeout = setTimeout(cleanUpNextTick, 0); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) + currentQueue[queueIndex].run(); + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + clearTimeout(timeout); +} + +function nextTick (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) + args[i - 1] = arguments[i]; + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) + setTimeout(drainQueue, 0); +} +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; + +var title = 'browser'; +var arch = 'x64'; +var platform = 'browser'; +var env = { + PATH: '/usr/bin', + LANG: navigator.language + '.UTF-8', + PWD: '/', + HOME: '/home', + TMP: '/tmp', +}; +var argv = ['/usr/bin/node']; +var execArgv = []; +var version = 'v16.8.0'; +var versions = { node: '16.8.0' }; + +var emitWarning = function(message, type) { + console.warn((type ? (type + ': ') : '') + message); +}; + +var binding = function(name) { unimplemented('binding'); }; + +var umask = function(mask) { return 0; }; + +var cwd = function() { return '/'; }; +var chdir = function(dir) {}; + +var release = { + name: 'node', + sourceUrl: '', + headersUrl: '', + libUrl: '', +}; + +function noop() {} + +var _rawDebug = noop; +var moduleLoadList = []; +function _linkedBinding(name) { unimplemented('_linkedBinding'); } +var domain = {}; +var _exiting = false; +var config = {}; +function dlopen(name) { unimplemented('dlopen'); } +function _getActiveRequests() { return []; } +function _getActiveHandles() { return []; } +var reallyExit = noop; +var _kill = noop; +var cpuUsage = function() { return {}; }; +var resourceUsage = cpuUsage; +var memoryUsage = cpuUsage; +var kill = noop; +var exit = noop; +var openStdin = noop; +var allowedNodeEnvironmentFlags = {}; +function assert(condition, message) { + if (!condition) throw new Error(message || 'assertion error'); +} +var features = { + inspector: false, + debug: false, + uv: false, + ipv6: false, + tls_alpn: false, + tls_sni: false, + tls_ocsp: false, + tls: false, + cached_builtins: true, +}; +var _fatalExceptions = noop; +var setUncaughtExceptionCaptureCallback = noop; +function hasUncaughtExceptionCaptureCallback() { return false; }var _tickCallback = noop; +var _debugProcess = noop; +var _debugEnd = noop; +var _startProfilerIdleNotifier = noop; +var _stopProfilerIdleNotifier = noop; +var stdout = undefined; +var stderr = undefined; +var stdin = undefined; +var abort = noop; +var pid = 2; +var ppid = 1; +var execPath = '/bin/usr/node'; +var debugPort = 9229; +var argv0 = 'node'; +var _preload_modules = []; +var setSourceMapsEnabled = noop; + +var _performance = { + now: typeof performance !== 'undefined' ? performance.now.bind(performance) : undefined, + timing: typeof performance !== 'undefined' ? performance.timing : undefined, +}; +if (_performance.now === undefined) { + var nowOffset = Date.now(); + + if (_performance.timing && _performance.timing.navigationStart) { + nowOffset = _performance.timing.navigationStart; + } + _performance.now = () => Date.now() - nowOffset; +} + +function uptime() { + return _performance.now() / 1000; +} + +var nanoPerSec = 1000000000; +function hrtime(previousTimestamp) { + var baseNow = Math.floor((Date.now() - _performance.now()) * 1e-3); + var clocktime = _performance.now() * 1e-3; + var seconds = Math.floor(clocktime) + baseNow; + var nanoseconds = Math.floor((clocktime % 1) * 1e9); + if (previousTimestamp) { + seconds = seconds - previousTimestamp[0]; + nanoseconds = nanoseconds - previousTimestamp[1]; + if (nanoseconds < 0) { + seconds--; + nanoseconds += nanoPerSec; + } + } + return [seconds, nanoseconds]; +}hrtime.bigint = function(time) { + var diff = hrtime(time); + if (typeof BigInt === 'undefined') { + return diff[0] * nanoPerSec + diff[1]; + } + return BigInt(diff[0] * nanoPerSec) + BigInt(diff[1]); +}; + +var _maxListeners = 10; +var _events = {}; +var _eventsCount = 0; +function on () { return process }var addListener = on; +var once = on; +var off = on; +var removeListener = on; +var removeAllListeners = on; +var emit = noop; +var prependListener = on; +var prependOnceListener = on; +function listeners (name) { return []; } +var process = { + version, + versions, + arch, + platform, + release, + _rawDebug, + moduleLoadList, + binding, + _linkedBinding, + _events, + _eventsCount, + _maxListeners, + on, + addListener, + once, + off, + removeListener, + removeAllListeners, + emit, + prependListener, + prependOnceListener, + listeners, + domain, + _exiting, + config, + dlopen, + uptime, + _getActiveRequests, + _getActiveHandles, + reallyExit, + _kill, + cpuUsage, + resourceUsage, + memoryUsage, + kill, + exit, + openStdin, + allowedNodeEnvironmentFlags, + assert, + features, + _fatalExceptions, + setUncaughtExceptionCaptureCallback, + hasUncaughtExceptionCaptureCallback, + emitWarning, + nextTick, + _tickCallback, + _debugProcess, + _debugEnd, + _startProfilerIdleNotifier, + _stopProfilerIdleNotifier, + stdout, + stdin, + stderr, + abort, + umask, + chdir, + cwd, + env, + title, + argv, + execArgv, + pid, + ppid, + execPath, + debugPort, + hrtime, + argv0, + _preload_modules, + setSourceMapsEnabled, +}; + +export { _debugEnd, _debugProcess, _events, _eventsCount, _exiting, _fatalExceptions, _getActiveHandles, _getActiveRequests, _kill, _linkedBinding, _maxListeners, _preload_modules, _rawDebug, _startProfilerIdleNotifier, _stopProfilerIdleNotifier, _tickCallback, abort, addListener, allowedNodeEnvironmentFlags, arch, argv, argv0, assert, binding, chdir, config, cpuUsage, cwd, debugPort, process as default, dlopen, domain, emit, emitWarning, env, execArgv, execPath, exit, features, hasUncaughtExceptionCaptureCallback, hrtime, kill, listeners, memoryUsage, moduleLoadList, nextTick, off, on, once, openStdin, pid, platform, ppid, prependListener, prependOnceListener, reallyExit, release, removeAllListeners, removeListener, resourceUsage, setSourceMapsEnabled, setUncaughtExceptionCaptureCallback, stderr, stdin, stdout, title, umask, uptime, version, versions }; + +//# sourceMappingURL=process.map \ No newline at end of file diff --git a/examples/build-http/webpack.lock.data/https_jspm.dev/npm_jspm_core_2.0.0-beta_1620e8f9e144fe702a06.11_nodelibs_os b/examples/build-http/webpack.lock.data/https_jspm.dev/npm_jspm_core_2.0.0-beta_1620e8f9e144fe702a06.11_nodelibs_os new file mode 100644 index 00000000000..65ca57a8711 --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_jspm.dev/npm_jspm_core_2.0.0-beta_1620e8f9e144fe702a06.11_nodelibs_os @@ -0,0 +1,113 @@ +import { uptime } from './process'; +export { uptime } from './process'; + +var exports = {}, + _dewExec = false; +function dew() { + if (_dewExec) return exports; + _dewExec = true; + + exports.endianness = function () { + return "LE"; + }; + + exports.hostname = function () { + if (typeof location !== "undefined") { + return location.hostname; + } else return ""; + }; + + exports.loadavg = function () { + return []; + }; + + exports.uptime = function () { + return 0; + }; + + exports.freemem = function () { + return Number.MAX_VALUE; + }; + + exports.totalmem = function () { + return Number.MAX_VALUE; + }; + + exports.cpus = function () { + return []; + }; + + exports.type = function () { + return "Browser"; + }; + + exports.release = function () { + if (typeof navigator !== "undefined") { + return navigator.appVersion; + } + + return ""; + }; + + exports.networkInterfaces = exports.getNetworkInterfaces = function () { + return {}; + }; + + exports.arch = function () { + return "javascript"; + }; + + exports.platform = function () { + return "browser"; + }; + + exports.tmpdir = exports.tmpDir = function () { + return "/tmp"; + }; + + exports.EOL = "\n"; + + exports.homedir = function () { + return "/"; + }; + + return exports; +} + +var os = dew(); + +var _endianness = new Uint8Array(new Uint16Array([1]).buffer)[0] === 1 ? 'LE' : 'BE'; +os.endianness = function() { return _endianness; }; +os.homedir = function() { return '/home'; }; +os.version = function() { return ''; }; +os.arch = function() { return 'x64'; }; +os.totalmem = function() { + return navigator.deviceMemory !== undefined ? navigator.deviceMemory * (1 << 30) : 2 * (1 << 30); +}; +os.cpus = function () { + return Array(navigator.hardwareConcurrency || 0).fill({ model: '', times: {} }); +}; +os.uptime = uptime; +os.constants = {}; +var version = os.version; +var constants = os.constants; +var EOL = os.EOL; +var arch = os.arch; +var cpus = os.cpus; +var endianness = os.endianness; +var freemem = os.freemem; +var getNetworkInterfaces = os.getNetworkInterfaces; +var homedir = os.homedir; +var hostname = os.hostname; +var loadavg = os.loadavg; +var networkInterfaces = os.networkInterfaces; +var platform = os.platform; +var release = os.release; +var tmpDir = os.tmpDir; +var tmpdir = os.tmpdir; +var totalmem = os.totalmem; +var type = os.type; + +export { EOL, arch, constants, cpus, os as default, endianness, freemem, getNetworkInterfaces, homedir, hostname, loadavg, networkInterfaces, platform, release, tmpDir, tmpdir, totalmem, type, version }; + +//# sourceMappingURL=os.map \ No newline at end of file diff --git a/examples/build-http/webpack.lock.data/https_jspm.dev/npm_jspm_core_2_nodelibs_os_3fe9447e10c5fed754bb b/examples/build-http/webpack.lock.data/https_jspm.dev/npm_jspm_core_2_nodelibs_os_3fe9447e10c5fed754bb new file mode 100644 index 00000000000..4accb6487ef --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_jspm.dev/npm_jspm_core_2_nodelibs_os_3fe9447e10c5fed754bb @@ -0,0 +1,3 @@ +import "/npm:@jspm/core@2.0.0-beta.11/nodelibs/process"; +export * from "/npm:@jspm/core@2.0.0-beta.11/nodelibs/os"; +export { default } from "/npm:@jspm/core@2.0.0-beta.11/nodelibs/os"; diff --git a/examples/build-http/webpack.lock.data/https_jspm.dev/npm_p-map_5.1_9895e1a83d37d06ab277.0 b/examples/build-http/webpack.lock.data/https_jspm.dev/npm_p-map_5.1_9895e1a83d37d06ab277.0 new file mode 100644 index 00000000000..5166d74476e --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_jspm.dev/npm_p-map_5.1_9895e1a83d37d06ab277.0 @@ -0,0 +1,103 @@ +import AggregateError from './npm:aggregate-error@4'; + +async function pMap( + iterable, + mapper, + { + concurrency = Number.POSITIVE_INFINITY, + stopOnError = true + } = {} +) { + return new Promise((resolve, reject) => { + if (typeof mapper !== 'function') { + throw new TypeError('Mapper function is required'); + } + + if (!((Number.isSafeInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency >= 1)) { + throw new TypeError(`Expected \`concurrency\` to be an integer from 1 and up or \`Infinity\`, got \`${concurrency}\` (${typeof concurrency})`); + } + + const result = []; + const errors = []; + const skippedIndexes = []; + const iterator = iterable[Symbol.iterator](); + let isRejected = false; + let isIterableDone = false; + let resolvingCount = 0; + let currentIndex = 0; + + const next = () => { + if (isRejected) { + return; + } + + const nextItem = iterator.next(); + const index = currentIndex; + currentIndex++; + + if (nextItem.done) { + isIterableDone = true; + + if (resolvingCount === 0) { + if (!stopOnError && errors.length > 0) { + reject(new AggregateError(errors)); + } else { + for (const skippedIndex of skippedIndexes) { + result.splice(skippedIndex, 1); + } + + resolve(result); + } + } + + return; + } + + resolvingCount++; + + (async () => { + try { + const element = await nextItem.value; + + if (isRejected) { + return; + } + + const value = await mapper(element, index); + if (value === pMapSkip) { + skippedIndexes.push(index); + } else { + result[index] = value; + } + + resolvingCount--; + next(); + } catch (error) { + if (stopOnError) { + isRejected = true; + reject(error); + } else { + errors.push(error); + resolvingCount--; + next(); + } + } + })(); + }; + + for (let index = 0; index < concurrency; index++) { + next(); + + if (isIterableDone) { + break; + } + } + }); +} + +const pMapSkip = Symbol('skip'); + +export default pMap; +export { pMapSkip }; + +//# sourceMappingURL=npm:p-map@5.1.0.map \ No newline at end of file diff --git a/examples/build-http/webpack.lock.data/https_jspm.dev/p-map_875efed0b6bd20646dd2 b/examples/build-http/webpack.lock.data/https_jspm.dev/p-map_875efed0b6bd20646dd2 new file mode 100644 index 00000000000..95b490c4578 --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_jspm.dev/p-map_875efed0b6bd20646dd2 @@ -0,0 +1,3 @@ +import "/npm:aggregate-error@4"; +export * from "/npm:p-map@5.1.0"; +export { default } from "/npm:p-map@5.1.0"; diff --git a/examples/build-http/webpack.lock.data/https_unpkg.com/p-map-series_3.0.0_index_module_cb329557880410b778cf.js b/examples/build-http/webpack.lock.data/https_unpkg.com/p-map-series_3.0.0_index_module_cb329557880410b778cf.js new file mode 100644 index 00000000000..f9ee01a45ae --- /dev/null +++ b/examples/build-http/webpack.lock.data/https_unpkg.com/p-map-series_3.0.0_index_module_cb329557880410b778cf.js @@ -0,0 +1,11 @@ +export default async function pMapSeries(iterable, mapper) { + const result = []; + let index = 0; + + for (const value of iterable) { + // eslint-disable-next-line no-await-in-loop + result.push((await mapper((await value), index++))); + } + + return result; +} \ No newline at end of file diff --git a/examples/buildAll.js b/examples/buildAll.js index 7ff3a9e38f2..211495d7b50 100644 --- a/examples/buildAll.js +++ b/examples/buildAll.js @@ -3,14 +3,18 @@ const cp = require("child_process"); const examples = require("./examples"); -const cmds = examples.map(function(dirname) { - return "cd " + dirname + " && node build.js"; -}); +const commands = examples + .concat( + examples.filter(dirname => dirname.includes("persistent-caching")) + ) + .map(function(dirname) { + return "cd " + dirname + " && node build.js"; + }); let failed = 0; let i = 0; -for(const cmd of cmds) { - console.log(`[${++i}/${cmds.length}] ${cmd}`); +for(const cmd of commands) { + console.log(`[${++i}/${commands.length}] ${cmd}`); try { cp.execSync(cmd, { encoding: "utf-8" }); } catch(e) { diff --git a/examples/chunkhash/README.md b/examples/chunkhash/README.md index 348c9dd262b..ebfab5df2d3 100644 --- a/examples/chunkhash/README.md +++ b/examples/chunkhash/README.md @@ -1,15 +1,15 @@ -A common challenge with combining `[chunkhash]` and Code Splitting is that the entry chunk includes the webpack runtime and with it the chunkhash mappings. This means it's always updated and the `[chunkhash]` is pretty useless, because this chunk won't be cached. +A common challenge with combining `[chunkhash]` and Code Splitting is that the entry chunk includes the webpack runtime and with it the chunkhash mappings. This means it's always updated and the `[chunkhash]` is pretty useless because this chunk won't be cached. -A very simple solution to this problem is to create another chunk which contains only the webpack runtime (including chunkhash map). This can be achieved with the `optimization.runtimeChunk` options. To avoid the additional request for another chunk, this pretty small chunk can be inlined into the HTML page. +A very simple solution to this problem is to create another chunk that contains only the webpack runtime (including chunkhash map). This can be achieved with `optimization.runtimeChunk` options. To avoid the additional request for another chunk, this pretty small chunk can be inlined into the HTML page. The configuration required for this is: -* use `[chunkhash]` in `output.filename` (Note that this example doesn't do this because of the example generator infrastructure, but you should) -* use `[chunkhash]` in `output.chunkFilename` (Note that this example doesn't do this because of the example generator infrastructure, but you should) +- use `[chunkhash]` in `output.filename` (Note that this example doesn't do this because of the example generator infrastructure, but you should) +- use `[chunkhash]` in `output.chunkFilename` (Note that this example doesn't do this because of the example generator infrastructure, but you should) # example.js -``` javascript +```javascript // some module import("./async1"); import("./async2"); @@ -17,10 +17,11 @@ import("./async2"); # webpack.config.js -``` javascript -var path = require("path"); +```javascript +const path = require("path"); + module.exports = { - // mode: "development || "production", + // mode: "development" || "production", entry: { main: "./example" }, @@ -37,272 +38,349 @@ module.exports = { # index.html -``` html +```html - - - - - - + + + + - - - + + ``` # dist/runtime~main.[chunkhash].js -
/******/ (function(modules) { /* webpackBootstrap */ }) +```javascript +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({}); +``` -``` javascript -/******/ (function(modules) { // webpackBootstrap -/******/ // install a JSONP callback for chunk loading -/******/ function webpackJsonpCallback(data) { -/******/ var chunkIds = data[0]; -/******/ var moreModules = data[1]; -/******/ var executeModules = data[2]; -/******/ -/******/ // add "moreModules" to the modules object, -/******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0, resolves = []; -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(installedChunks[chunkId]) { -/******/ resolves.push(installedChunks[chunkId][0]); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } -/******/ for(moduleId in moreModules) { -/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { -/******/ modules[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(parentJsonpFunction) parentJsonpFunction(data); -/******/ -/******/ while(resolves.length) { -/******/ resolves.shift()(); -/******/ } -/******/ -/******/ // add entry modules from loaded chunk to deferred list -/******/ deferredModules.push.apply(deferredModules, executeModules || []); -/******/ -/******/ // run deferred modules when all chunks ready -/******/ return checkDeferredModules(); -/******/ }; -/******/ function checkDeferredModules() { -/******/ var result; -/******/ for(var i = 0; i < deferredModules.length; i++) { -/******/ var deferredModule = deferredModules[i]; -/******/ var fulfilled = true; -/******/ for(var j = 1; j < deferredModule.length; j++) { -/******/ var depId = deferredModule[j]; -/******/ if(installedChunks[depId] !== 0) fulfilled = false; -/******/ } -/******/ if(fulfilled) { -/******/ deferredModules.splice(i--, 1); -/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]); -/******/ } -/******/ } -/******/ return result; -/******/ } -/******/ +
/* webpack runtime code */ + +``` js +/************************************************************************/ /******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // Promise = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ 0: 0 -/******/ }; -/******/ -/******/ var deferredModules = []; -/******/ -/******/ // script path function -/******/ function jsonpScriptSrc(chunkId) { -/******/ return __webpack_require__.p + "" + ({}[chunkId]||chunkId) + ".[chunkhash].js" -/******/ } -/******/ +/******/ var __webpack_module_cache__ = {}; +/******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { -/******/ /******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed /******/ exports: {} /******/ }; -/******/ +/******/ /******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } -/******/ -/******/ // This file contains only the entry chunk. -/******/ // The chunk loading function for additional chunks -/******/ __webpack_require__.e = function requireEnsure(chunkId) { -/******/ var promises = []; -/******/ -/******/ -/******/ // JSONP chunk loading for javascript -/******/ -/******/ var installedChunkData = installedChunks[chunkId]; -/******/ if(installedChunkData !== 0) { // 0 means "already installed". -/******/ -/******/ // a Promise means "currently loading". -/******/ if(installedChunkData) { -/******/ promises.push(installedChunkData[2]); -/******/ } else { -/******/ // setup Promise in chunk cache -/******/ var promise = new Promise(function(resolve, reject) { -/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject]; -/******/ }); -/******/ promises.push(installedChunkData[2] = promise); -/******/ -/******/ // start chunk loading -/******/ var script = document.createElement('script'); -/******/ var onScriptComplete; -/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/chunk loaded */ +/******/ (() => { +/******/ var deferred = []; +/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => { +/******/ if(chunkIds) { +/******/ priority = priority || 0; +/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1]; +/******/ deferred[i] = [chunkIds, fn, priority]; +/******/ return; +/******/ } +/******/ var notFulfilled = Infinity; +/******/ for (var i = 0; i < deferred.length; i++) { +/******/ var [chunkIds, fn, priority] = deferred[i]; +/******/ var fulfilled = true; +/******/ for (var j = 0; j < chunkIds.length; j++) { +/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) { +/******/ chunkIds.splice(j--, 1); +/******/ } else { +/******/ fulfilled = false; +/******/ if(priority < notFulfilled) notFulfilled = priority; +/******/ } +/******/ } +/******/ if(fulfilled) { +/******/ deferred.splice(i--, 1) +/******/ var r = fn(); +/******/ if (r !== undefined) result = r; +/******/ } +/******/ } +/******/ return result; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/create fake namespace object */ +/******/ (() => { +/******/ var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__); +/******/ var leafPrototypes; +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 16: return value when it's Promise-like +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = this(value); +/******/ if(mode & 8) return value; +/******/ if(typeof value === 'object' && value) { +/******/ if((mode & 4) && value.__esModule) return value; +/******/ if((mode & 16) && typeof value.then === 'function') return value; +/******/ } +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ var def = {}; +/******/ leafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)]; +/******/ for(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) { +/******/ Object.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key]))); +/******/ } +/******/ def['default'] = () => (value); +/******/ __webpack_require__.d(ns, def); +/******/ return ns; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".[chunkhash].js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ // data-webpack is not used as build has no uniqueName +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ /******/ script.charset = 'utf-8'; /******/ script.timeout = 120; /******/ if (__webpack_require__.nc) { /******/ script.setAttribute("nonce", __webpack_require__.nc); /******/ } -/******/ script.src = jsonpScriptSrc(chunkId); -/******/ -/******/ onScriptComplete = function (event) { -/******/ // avoid mem leaks in IE. -/******/ script.onerror = script.onload = null; -/******/ clearTimeout(timeout); -/******/ var chunk = installedChunks[chunkId]; -/******/ if(chunk !== 0) { -/******/ if(chunk) { -/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); -/******/ var realSrc = event && event.target && event.target.src; -/******/ var error = new Error('Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'); -/******/ error.type = errorType; -/******/ error.request = realSrc; -/******/ chunk[1](error); -/******/ } -/******/ installedChunks[chunkId] = undefined; +/******/ +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "dist/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ 1: 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // JSONP chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if(1 != chunkId) { +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ installedChunkData[1](error); +/******/ } +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); +/******/ } else installedChunks[chunkId] = 0; +/******/ } +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0); +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; /******/ } -/******/ }; -/******/ var timeout = setTimeout(function(){ -/******/ onScriptComplete({ type: 'timeout', target: script }); -/******/ }, 120000); -/******/ script.onerror = script.onload = onScriptComplete; -/******/ document.head.appendChild(script); +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); /******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ return __webpack_require__.O(result); /******/ } -/******/ return Promise.all(promises); -/******/ }; -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ // on error function for async loading -/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; -/******/ -/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; -/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); -/******/ jsonpArray.push = webpackJsonpCallback; -/******/ jsonpArray = jsonpArray.slice(); -/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); -/******/ var parentJsonpFunction = oldJsonpFunction; -/******/ -/******/ -/******/ // run deferred modules from other chunks -/******/ checkDeferredModules(); -/******/ }) +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ /************************************************************************/ ```
-``` javascript -/******/ ([]); +``` js +/******/ +/******/ +/******/ })() +; ``` # dist/main.[chunkhash].js -``` javascript -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[1],[ +```javascript +(self["webpackChunk"] = self["webpackChunk"] || []).push([[0],[ /* 0 */ /*!********************!*\ !*** ./example.js ***! \********************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: __webpack_require__.e, __webpack_require__.t, __webpack_require__.* */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { // some module -__webpack_require__.e(/*! import() */ 2).then(__webpack_require__.t.bind(null, /*! ./async1 */ 1, 7)); -__webpack_require__.e(/*! import() */ 3).then(__webpack_require__.t.bind(null, /*! ./async2 */ 2, 7)); +__webpack_require__.e(/*! import() */ 2).then(__webpack_require__.t.bind(__webpack_require__, /*! ./async1 */ 1, 23)); +__webpack_require__.e(/*! import() */ 3).then(__webpack_require__.t.bind(__webpack_require__, /*! ./async2 */ 2, 23)); /***/ }) -],[[0,0]]]); +], +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ var __webpack_exports__ = (__webpack_exec__(0)); +/******/ } +]); ``` # Info @@ -310,53 +388,57 @@ __webpack_require__.e(/*! import() */ 3).then(__webpack_require__.t.bind(null, / ## Unoptimized ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names - 2.[chunkhash].js 269 bytes 2 [emitted] - 3.[chunkhash].js 263 bytes 3 [emitted] - main.[chunkhash].js 485 bytes 1 [emitted] main -runtime~main.[chunkhash].js 8.71 KiB 0 [emitted] runtime~main -Entrypoint main = runtime~main.[chunkhash].js main.[chunkhash].js -chunk {0} runtime~main.[chunkhash].js (runtime~main) 0 bytes ={1}= >{2}< >{3}< [entry] [rendered] - > ./example main -chunk {1} main.[chunkhash].js (main) 55 bytes ={0}= >{2}< >{3}< [initial] [rendered] - > ./example main - [0] ./example.js 55 bytes {1} [built] - single entry ./example main -chunk {2} 2.[chunkhash].js 28 bytes <{0}> <{1}> [rendered] - > ./async1 [0] ./example.js 2:0-18 - [1] ./async1.js 28 bytes {2} [built] - import() ./async1 [0] ./example.js 2:0-18 -chunk {3} 3.[chunkhash].js 28 bytes <{0}> <{1}> [rendered] - > ./async2 [0] ./example.js 3:0-18 - [2] ./async2.js 28 bytes {3} [built] - import() ./async2 [0] ./example.js 3:0-18 +asset runtime~main.[chunkhash].js 12.2 KiB [emitted] (name: runtime~main) +asset main.[chunkhash].js 873 bytes [emitted] (name: main) +asset 2.[chunkhash].js 285 bytes [emitted] +asset 3.[chunkhash].js 279 bytes [emitted] +Entrypoint main 13 KiB = runtime~main.[chunkhash].js 12.2 KiB main.[chunkhash].js 873 bytes +chunk (runtime: runtime~main) main.[chunkhash].js (main) 55 bytes [initial] [rendered] + > ./example main + ./example.js 55 bytes [built] [code generated] + [used exports unknown] + entry ./example main +chunk (runtime: runtime~main) runtime~main.[chunkhash].js (runtime~main) 7.59 KiB [entry] [rendered] + > ./example main + runtime modules 7.59 KiB 10 modules +chunk (runtime: runtime~main) 2.[chunkhash].js 28 bytes [rendered] + > ./async1 ./example.js 2:0-18 + ./async1.js 28 bytes [built] [code generated] + [used exports unknown] + import() ./async1 ./example.js 2:0-18 +chunk (runtime: runtime~main) 3.[chunkhash].js 28 bytes [rendered] + > ./async2 ./example.js 3:0-18 + ./async2.js 28 bytes [built] [code generated] + [used exports unknown] + import() ./async2 ./example.js 3:0-18 +webpack X.X.X compiled successfully ``` ## Production mode ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names - 2.[chunkhash].js 77 bytes 2 [emitted] - 3.[chunkhash].js 78 bytes 3 [emitted] - main.[chunkhash].js 149 bytes 0 [emitted] main -runtime~main.[chunkhash].js 2.13 KiB 1 [emitted] runtime~main -Entrypoint main = runtime~main.[chunkhash].js main.[chunkhash].js -chunk {0} main.[chunkhash].js (main) 55 bytes ={1}= >{2}< >{3}< [initial] [rendered] - > ./example main - [0] ./example.js 55 bytes {0} [built] - single entry ./example main -chunk {1} runtime~main.[chunkhash].js (runtime~main) 0 bytes ={0}= >{2}< >{3}< [entry] [rendered] - > ./example main -chunk {2} 2.[chunkhash].js 28 bytes <{0}> <{1}> [rendered] - > ./async1 [0] ./example.js 2:0-18 - [1] ./async1.js 28 bytes {2} [built] - import() ./async1 [0] ./example.js 2:0-18 -chunk {3} 3.[chunkhash].js 28 bytes <{0}> <{1}> [rendered] - > ./async2 [0] ./example.js 3:0-18 - [2] ./async2.js 28 bytes {3} [built] - import() ./async2 [0] ./example.js 3:0-18 +asset runtime~main.[chunkhash].js 2.73 KiB [emitted] [minimized] (name: runtime~main) +asset main.[chunkhash].js 155 bytes [emitted] [minimized] (name: main) +asset 471.[chunkhash].js 69 bytes [emitted] [minimized] +asset 18.[chunkhash].js 67 bytes [emitted] [minimized] +Entrypoint main 2.88 KiB = runtime~main.[chunkhash].js 2.73 KiB main.[chunkhash].js 155 bytes +chunk (runtime: runtime~main) 18.[chunkhash].js 28 bytes [rendered] + > ./async1 ./example.js 2:0-18 + ./async1.js 28 bytes [built] [code generated] + [used exports unknown] + import() ./async1 ./example.js 2:0-18 +chunk (runtime: runtime~main) runtime~main.[chunkhash].js (runtime~main) 7.6 KiB [entry] [rendered] + > ./example main + runtime modules 7.6 KiB 10 modules +chunk (runtime: runtime~main) 471.[chunkhash].js 28 bytes [rendered] + > ./async2 ./example.js 3:0-18 + ./async2.js 28 bytes [built] [code generated] + [used exports unknown] + import() ./async2 ./example.js 3:0-18 +chunk (runtime: runtime~main) main.[chunkhash].js (main) 55 bytes [initial] [rendered] + > ./example main + ./example.js 55 bytes [built] [code generated] + [no exports used] + entry ./example main +webpack X.X.X compiled successfully ``` diff --git a/examples/chunkhash/template.md b/examples/chunkhash/template.md index b7df1a7272b..91cf1c69b9a 100644 --- a/examples/chunkhash/template.md +++ b/examples/chunkhash/template.md @@ -1,53 +1,50 @@ -A common challenge with combining `[chunkhash]` and Code Splitting is that the entry chunk includes the webpack runtime and with it the chunkhash mappings. This means it's always updated and the `[chunkhash]` is pretty useless, because this chunk won't be cached. +A common challenge with combining `[chunkhash]` and Code Splitting is that the entry chunk includes the webpack runtime and with it the chunkhash mappings. This means it's always updated and the `[chunkhash]` is pretty useless because this chunk won't be cached. -A very simple solution to this problem is to create another chunk which contains only the webpack runtime (including chunkhash map). This can be achieved with the `optimization.runtimeChunk` options. To avoid the additional request for another chunk, this pretty small chunk can be inlined into the HTML page. +A very simple solution to this problem is to create another chunk that contains only the webpack runtime (including chunkhash map). This can be achieved with `optimization.runtimeChunk` options. To avoid the additional request for another chunk, this pretty small chunk can be inlined into the HTML page. The configuration required for this is: -* use `[chunkhash]` in `output.filename` (Note that this example doesn't do this because of the example generator infrastructure, but you should) -* use `[chunkhash]` in `output.chunkFilename` (Note that this example doesn't do this because of the example generator infrastructure, but you should) +- use `[chunkhash]` in `output.filename` (Note that this example doesn't do this because of the example generator infrastructure, but you should) +- use `[chunkhash]` in `output.chunkFilename` (Note that this example doesn't do this because of the example generator infrastructure, but you should) # example.js -``` javascript -{{example.js}} +```javascript +_{{example.js}}_ ``` # webpack.config.js -``` javascript -{{webpack.config.js}} +```javascript +_{{webpack.config.js}}_ ``` # index.html -``` html +```html - - - - - - - - - - + + + + + + + ``` # dist/runtime~main.[chunkhash].js -``` javascript -{{dist/runtime~main.chunkhash.js}} +```javascript +_{{dist/runtime~main.chunkhash.js}}_ ``` # dist/main.[chunkhash].js -``` javascript -{{dist/main.chunkhash.js}} +```javascript +_{{dist/main.chunkhash.js}}_ ``` # Info @@ -55,11 +52,11 @@ The configuration required for this is: ## Unoptimized ``` -{{stdout}} +_{{stdout}}_ ``` ## Production mode ``` -{{production:stdout}} +_{{production:stdout}}_ ``` diff --git a/examples/chunkhash/webpack.config.js b/examples/chunkhash/webpack.config.js index cc34d5591f9..727e187cf1b 100644 --- a/examples/chunkhash/webpack.config.js +++ b/examples/chunkhash/webpack.config.js @@ -1,6 +1,7 @@ -var path = require("path"); +const path = require("path"); + module.exports = { - // mode: "development || "production", + // mode: "development" || "production", entry: { main: "./example" }, diff --git a/examples/cjs-tree-shaking/README.md b/examples/cjs-tree-shaking/README.md new file mode 100644 index 00000000000..faa479094a0 --- /dev/null +++ b/examples/cjs-tree-shaking/README.md @@ -0,0 +1,229 @@ +# example.js + +```javascript +const inc = require("./increment").increment; +var a = 1; +inc(a); // 2 +``` + +# increment.js + +```javascript +const add = require("./math").add; +exports.increment = function increment(val) { + return add(val, 1); +}; +exports.incrementBy2 = function incrementBy2(val) { + return add(val, 2); +}; +exports.decrement = function decrement(val) { + return add(val, 1); +}; +``` + +# math.js + +```javascript +exports.add = function add() { + var sum = 0, + i = 0, + args = arguments, + l = args.length; + while (i < l) { + sum += args[i++]; + } + return sum; +}; + +exports.multiply = function multiply() { + var product = 0, + i = 0, + args = arguments, + l = args.length; + while (i < l) { + sum *= args[i++]; + } + return sum; +}; +``` + +# dist/output.js + +```javascript +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */ +/*!**********************!*\ + !*** ./increment.js ***! + \**********************/ +/*! default exports */ +/*! export decrement [provided] [unused] [renamed to Kt] */ +/*! export increment [provided] [used in main] [renamed to GV] */ +/*! export incrementBy2 [provided] [unused] [renamed to Bd] */ +/*! runtime requirements: __webpack_require__, __webpack_exports__ */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +var __webpack_unused_export__; +const add = (__webpack_require__(/*! ./math */ 2)/* .add */ .W); +exports.GV = function increment(val) { + return add(val, 1); +}; +__webpack_unused_export__ = function incrementBy2(val) { + return add(val, 2); +}; +__webpack_unused_export__ = function decrement(val) { + return add(val, 1); +}; + + +/***/ }), +/* 2 */ +/*!*****************!*\ + !*** ./math.js ***! + \*****************/ +/*! default exports */ +/*! export add [provided] [used in main] [renamed to W] */ +/*! export multiply [provided] [unused] [renamed to l] */ +/*! runtime requirements: __webpack_exports__ */ +/***/ ((__unused_webpack_module, exports) => { + +var __webpack_unused_export__; +exports.W = function add() { + var sum = 0, + i = 0, + args = arguments, + l = args.length; + while (i < l) { + sum += args[i++]; + } + return sum; +}; + +__webpack_unused_export__ = function multiply() { + var product = 0, + i = 0, + args = arguments, + l = args.length; + while (i < l) { + sum *= args[i++]; + } + return sum; +}; + + +/***/ }) +/******/ ]); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +``` + +
+ +``` js +var __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { +/*!********************!*\ + !*** ./example.js ***! + \********************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: __webpack_require__ */ +const inc = (__webpack_require__(/*! ./increment */ 1)/* .increment */ .GV); +var a = 1; +inc(a); // 2 + +})(); + +/******/ })() +; +``` + +# dist/output.js (production) + +```javascript +/*! For license information please see output.js.LICENSE.txt */ +(()=>{var r=[,(r,t,n)=>{const o=n(2).W;t.GV=function(r){return o(r,1)}},(r,t)=>{t.W=function(){for(var r=0,t=0,n=arguments,o=n.length;t{var n=[,(n,r,t)=>{const e=t(2).add;r.increment=function(n){return e(n,1)},r.incrementBy2=function(n){return e(n,2)},r.decrement=function(n){return e(n,1)}},(n,r)=>{r.add=function(){for(var n=0,r=0,t=arguments,e=t.length;r ./example.js main + dependent modules 564 bytes [dependent] 2 modules + ./example.js 70 bytes [built] [code generated] + [no exports used] + entry ./example.js main +webpack X.X.X compiled successfully + +asset without.js 3.09 KiB [emitted] (name: main) +chunk (runtime: main) without.js (main) 634 bytes [entry] [rendered] + > ./example.js main + dependent modules 564 bytes [dependent] 2 modules + ./example.js 70 bytes [built] [code generated] + [used exports unknown] + entry ./example.js main +webpack X.X.X compiled successfully +``` + +## Production mode + +``` +asset output.js 365 bytes [emitted] [minimized] (name: main) 1 related asset +chunk (runtime: main) output.js (main) 634 bytes [entry] [rendered] + > ./example.js main + dependent modules 564 bytes [dependent] 2 modules + ./example.js 70 bytes [built] [code generated] + [no exports used] + entry ./example.js main +webpack X.X.X compiled successfully + +asset without.js 551 bytes [emitted] [minimized] (name: main) 1 related asset +chunk (runtime: main) without.js (main) 634 bytes [entry] [rendered] + > ./example.js main + dependent modules 564 bytes [dependent] 2 modules + ./example.js 70 bytes [built] [code generated] + [used exports unknown] + entry ./example.js main +webpack X.X.X compiled successfully +``` diff --git a/examples/cjs-tree-shaking/build.js b/examples/cjs-tree-shaking/build.js new file mode 100644 index 00000000000..7492e9f9f71 --- /dev/null +++ b/examples/cjs-tree-shaking/build.js @@ -0,0 +1,2 @@ +global.NO_TARGET_ARGS = true; +require("../build-common"); diff --git a/examples/cjs-tree-shaking/cases.txt b/examples/cjs-tree-shaking/cases.txt new file mode 100644 index 00000000000..34bc275e076 --- /dev/null +++ b/examples/cjs-tree-shaking/cases.txt @@ -0,0 +1,58 @@ +BAD: + +module.exports = abc; module.exports.xxx = abc; abc.xxx; +exports = abc; +module.exports +exports +this +function f() { return this; } module.exports = { f }; module.exports.xxx = abc; + + +EXPORTS: + +exports.xxx = abc; + +module.exports.xxx = abc; +this.xxx = abc +Object.defineProperty(exports, "xxx", { ... }) +Object.defineProperty(module.exports, "xxx", { ... }) +Object.defineProperty(this, "xxx", { ... }) +module.exports.xxx +exports.xxx +this.xxx +module.exports = function() {}; module.exports.xxx = abc; +module.exports = { ... }; module.exports.xxx = abc; + +OBJECTS: + +module.exports = { xxx: abc }; + +IMPORT: + +require(x).xxx +var { xxx } = require(x); +var x = require(x); x.xxx; + +REEXPORT: + +module.exports.xxx = require(x); +module.exports.xxx = require(x).xxx; +exports.xxx = require(x); +exports.xxx = require(x).xxx; +module.exports = { xxx2: require(x) }; +module.exports = { xxx2: require(x).xxx }; +var xxx = require(x); exports.xxx = xxx; +var xxx = require(x); exports.xxx = xxx.xxx; +var xxx = require(x); module.exports = { xxx }; +var xxx = require(x); module.exports = { xxx: xxx.xxx }; + +TRANSPILED: + +TypeScript: +function __export(m) { for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; } +__export(require(x)); + +Babel: +var xxx = _interopRequireDefault(require(x)); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +xxx.xxx; diff --git a/examples/cjs-tree-shaking/example.js b/examples/cjs-tree-shaking/example.js new file mode 100644 index 00000000000..824a4d22bd5 --- /dev/null +++ b/examples/cjs-tree-shaking/example.js @@ -0,0 +1,3 @@ +const inc = require("./increment").increment; +var a = 1; +inc(a); // 2 diff --git a/examples/cjs-tree-shaking/increment.js b/examples/cjs-tree-shaking/increment.js new file mode 100644 index 00000000000..df54369b913 --- /dev/null +++ b/examples/cjs-tree-shaking/increment.js @@ -0,0 +1,10 @@ +const add = require("./math").add; +exports.increment = function increment(val) { + return add(val, 1); +}; +exports.incrementBy2 = function incrementBy2(val) { + return add(val, 2); +}; +exports.decrement = function decrement(val) { + return add(val, 1); +}; diff --git a/examples/cjs-tree-shaking/math.js b/examples/cjs-tree-shaking/math.js new file mode 100644 index 00000000000..97a0ac866ab --- /dev/null +++ b/examples/cjs-tree-shaking/math.js @@ -0,0 +1,21 @@ +exports.add = function add() { + var sum = 0, + i = 0, + args = arguments, + l = args.length; + while (i < l) { + sum += args[i++]; + } + return sum; +}; + +exports.multiply = function multiply() { + var product = 0, + i = 0, + args = arguments, + l = args.length; + while (i < l) { + sum *= args[i++]; + } + return sum; +}; diff --git a/examples/cjs-tree-shaking/template.md b/examples/cjs-tree-shaking/template.md new file mode 100644 index 00000000000..68a8221b96b --- /dev/null +++ b/examples/cjs-tree-shaking/template.md @@ -0,0 +1,49 @@ +# example.js + +```javascript +_{{example.js}}_ +``` + +# increment.js + +```javascript +_{{increment.js}}_ +``` + +# math.js + +```javascript +_{{math.js}}_ +``` + +# dist/output.js + +```javascript +_{{dist/output.js}}_ +``` + +# dist/output.js (production) + +```javascript +_{{production:dist/output.js}}_ +``` + +# dist/without.js (same without tree shaking) + +```javascript +_{{production:dist/without.js}}_ +``` + +# Info + +## Unoptimized + +``` +_{{stdout}}_ +``` + +## Production mode + +``` +_{{production:stdout}}_ +``` diff --git a/examples/cjs-tree-shaking/webpack.config.js b/examples/cjs-tree-shaking/webpack.config.js new file mode 100644 index 00000000000..b40c7be44d9 --- /dev/null +++ b/examples/cjs-tree-shaking/webpack.config.js @@ -0,0 +1,26 @@ +module.exports = [ + { + entry: "./example.js", + output: { + pathinfo: true, + filename: "output.js" + }, + optimization: { + moduleIds: "size", + usedExports: true, + mangleExports: true + } + }, + { + entry: "./example.js", + output: { + pathinfo: true, + filename: "without.js" + }, + optimization: { + moduleIds: "size", + usedExports: false, + mangleExports: false + } + } +]; diff --git a/examples/code-splitted-css-bundle/README.md b/examples/code-splitted-css-bundle/README.md deleted file mode 100644 index 655e620a5d2..00000000000 --- a/examples/code-splitted-css-bundle/README.md +++ /dev/null @@ -1,140 +0,0 @@ - -# example.js - -``` javascript -require("./style.css"); -require(["./chunk"]); -``` - -# style.css - -``` css -body { - background: url(image.png); -} -``` - -# chunk.js - -``` javascript -require("./style2.css"); -``` - -# style2.css - -``` css -.xyz { - background: url(image2.png); -} -``` - -# webpack.config.js - -``` javascript -var ExtractTextPlugin = require("extract-text-webpack-plugin"); -module.exports = { - module: { - loaders: [ - { - test: /\.css$/, - use: ExtractTextPlugin.extract({ - fallback: "style-loader", - use: "css-loader" - }) - }, - { test: /\.png$/, loader: "file-loader" } - ] - }, - plugins: [ - new ExtractTextPlugin({ - filename: "style.css" - }) - ] -}; -``` - -# js/style.css - -``` javascript -body { - background: url(js/ce21cbdd9b894e6af794813eb3fdaf60.png); -} -``` - -# Info - -## Uncompressed - -``` -Hash: 5be34b0d3c624e61c616 -Version: webpack 3.11.0 - Asset Size Chunks Chunk Names -ce21cbdd9b894e6af794813eb3fdaf60.png 119 bytes [emitted] - 0.output.js 2.44 kB 0 [emitted] - output.js 21.2 kB 1 [emitted] main - style.css 71 bytes 1 [emitted] main -Entrypoint main = output.js style.css -chunk {0} 0.output.js 1.36 kB {1} [rendered] - > [0] ./example.js 2:0-20 - [5] ./chunk.js 26 bytes {0} [built] - amd require ./chunk [0] ./example.js 2:0-20 - [6] ./style2.css 1.01 kB {0} [built] - cjs require ./style2.css [5] ./chunk.js 1:0-23 - [7] (webpack)/node_modules/css-loader!./style2.css 236 bytes {0} [built] - cjs require !!../../node_modules/css-loader/index.js!./style2.css [6] ./style2.css 4:14-78 - [8] ./image2.png 82 bytes {0} [built] - cjs require ./image2.png [7] (webpack)/node_modules/css-loader!./style2.css 6:58-81 -chunk {1} output.js, style.css (main) 14.1 kB [entry] [rendered] - > main [0] ./example.js - [0] ./example.js 48 bytes {1} [built] - [1] ./style.css 41 bytes {1} [built] - cjs require ./style.css [0] ./example.js 1:0-22 - + 3 hidden modules -Child extract-text-webpack-plugin ../../node_modules/extract-text-webpack-plugin/dist ../../node_modules/css-loader/index.js!style.css: - 1 asset - Entrypoint undefined = extract-text-webpack-plugin-output-filename - chunk {0} extract-text-webpack-plugin-output-filename 2.58 kB [entry] [rendered] - > [0] (webpack)/node_modules/css-loader!./style.css - [0] (webpack)/node_modules/css-loader!./style.css 235 bytes {0} [built] - [2] ./image.png 82 bytes {0} [built] - cjs require ./image.png [0] (webpack)/node_modules/css-loader!./style.css 6:58-80 - + 1 hidden module -``` - -## Minimized (terser, no zip) - -``` -Hash: edbe0e91ba86d814d855 -Version: webpack 3.11.0 - Asset Size Chunks Chunk Names -ce21cbdd9b894e6af794813eb3fdaf60.png 119 bytes [emitted] - 0.output.js 343 bytes 0 [emitted] - output.js 6.58 kB 1 [emitted] main - style.css 61 bytes 1 [emitted] main -Entrypoint main = output.js style.css -chunk {0} 0.output.js 1.34 kB {1} [rendered] - > [0] ./example.js 2:0-20 - [5] ./chunk.js 26 bytes {0} [built] - amd require ./chunk [0] ./example.js 2:0-20 - [6] ./style2.css 1.01 kB {0} [built] - cjs require ./style2.css [5] ./chunk.js 1:0-23 - [7] (webpack)/node_modules/css-loader!./style2.css 219 bytes {0} [built] - cjs require !!../../node_modules/css-loader/index.js!./style2.css [6] ./style2.css 4:14-78 - [8] ./image2.png 82 bytes {0} [built] - cjs require ./image2.png [7] (webpack)/node_modules/css-loader!./style2.css 6:50-73 -chunk {1} output.js, style.css (main) 14.1 kB [entry] [rendered] - > main [0] ./example.js - [0] ./example.js 48 bytes {1} [built] - [1] ./style.css 41 bytes {1} [built] - cjs require ./style.css [0] ./example.js 1:0-22 - + 3 hidden modules -Child extract-text-webpack-plugin ../../node_modules/extract-text-webpack-plugin/dist ../../node_modules/css-loader/index.js!style.css: - 1 asset - Entrypoint undefined = extract-text-webpack-plugin-output-filename - chunk {0} extract-text-webpack-plugin-output-filename 2.56 kB [entry] [rendered] - > [0] (webpack)/node_modules/css-loader!./style.css - [0] (webpack)/node_modules/css-loader!./style.css 218 bytes {0} [built] - [2] ./image.png 82 bytes {0} [built] - cjs require ./image.png [0] (webpack)/node_modules/css-loader!./style.css 6:50-72 - + 1 hidden module -``` diff --git a/examples/code-splitted-require.context-amd/README.md b/examples/code-splitted-require.context-amd/README.md index 7b36e9d4d52..83b62e961b6 100644 --- a/examples/code-splitted-require.context-amd/README.md +++ b/examples/code-splitted-require.context-amd/README.md @@ -16,224 +16,226 @@ getTemplate("b", function(b) { # dist/output.js -
/******/ (function(modules) { /* webpackBootstrap */ }) - ``` javascript -/******/ (function(modules) { // webpackBootstrap -/******/ // install a JSONP callback for chunk loading -/******/ function webpackJsonpCallback(data) { -/******/ var chunkIds = data[0]; -/******/ var moreModules = data[1]; -/******/ -/******/ -/******/ // add "moreModules" to the modules object, -/******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0, resolves = []; -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(installedChunks[chunkId]) { -/******/ resolves.push(installedChunks[chunkId][0]); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } -/******/ for(moduleId in moreModules) { -/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { -/******/ modules[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(parentJsonpFunction) parentJsonpFunction(data); -/******/ -/******/ while(resolves.length) { -/******/ resolves.shift()(); -/******/ } -/******/ -/******/ }; -/******/ -/******/ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({}); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ /******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // Promise = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ 0: 0 -/******/ }; -/******/ -/******/ -/******/ -/******/ // script path function -/******/ function jsonpScriptSrc(chunkId) { -/******/ return __webpack_require__.p + "" + chunkId + ".output.js" -/******/ } -/******/ +/******/ var __webpack_module_cache__ = {}; +/******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { -/******/ /******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed /******/ exports: {} /******/ }; -/******/ +/******/ /******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } -/******/ -/******/ // This file contains only the entry chunk. -/******/ // The chunk loading function for additional chunks -/******/ __webpack_require__.e = function requireEnsure(chunkId) { -/******/ var promises = []; -/******/ -/******/ -/******/ // JSONP chunk loading for javascript -/******/ -/******/ var installedChunkData = installedChunks[chunkId]; -/******/ if(installedChunkData !== 0) { // 0 means "already installed". -/******/ -/******/ // a Promise means "currently loading". -/******/ if(installedChunkData) { -/******/ promises.push(installedChunkData[2]); -/******/ } else { -/******/ // setup Promise in chunk cache -/******/ var promise = new Promise(function(resolve, reject) { -/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject]; -/******/ }); -/******/ promises.push(installedChunkData[2] = promise); -/******/ -/******/ // start chunk loading -/******/ var script = document.createElement('script'); -/******/ var onScriptComplete; -/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".output.js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ // data-webpack is not used as build has no uniqueName +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ /******/ script.charset = 'utf-8'; /******/ script.timeout = 120; /******/ if (__webpack_require__.nc) { /******/ script.setAttribute("nonce", __webpack_require__.nc); /******/ } -/******/ script.src = jsonpScriptSrc(chunkId); -/******/ -/******/ onScriptComplete = function (event) { -/******/ // avoid mem leaks in IE. -/******/ script.onerror = script.onload = null; -/******/ clearTimeout(timeout); -/******/ var chunk = installedChunks[chunkId]; -/******/ if(chunk !== 0) { -/******/ if(chunk) { -/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); -/******/ var realSrc = event && event.target && event.target.src; -/******/ var error = new Error('Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'); -/******/ error.type = errorType; -/******/ error.request = realSrc; -/******/ chunk[1](error); +/******/ +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "dist/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "main": 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // JSONP chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if(true) { // all chunks have JS +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ installedChunkData[1](error); +/******/ } +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); /******/ } -/******/ installedChunks[chunkId] = undefined; /******/ } -/******/ }; -/******/ var timeout = setTimeout(function(){ -/******/ onScriptComplete({ type: 'timeout', target: script }); -/******/ }, 120000); -/******/ script.onerror = script.onload = onScriptComplete; -/******/ document.head.appendChild(script); +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ // no on chunks loaded +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); /******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ /******/ } -/******/ return Promise.all(promises); -/******/ }; -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ // on error function for async loading -/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; -/******/ -/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; -/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); -/******/ jsonpArray.push = webpackJsonpCallback; -/******/ jsonpArray = jsonpArray.slice(); -/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); -/******/ var parentJsonpFunction = oldJsonpFunction; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); -/******/ }) +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ /************************************************************************/ ```
-``` javascript -/******/ ([ -/* 0 */ +``` js /*!********************!*\ !*** ./example.js ***! \********************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: __webpack_require__.e, __webpack_require__.oe, __webpack_require__, __webpack_require__.* */ function getTemplate(templateName, callback) { - __webpack_require__.e(/*! AMD require */ 1).then(function() { var __WEBPACK_AMD_REQUIRE_ARRAY__ = [__webpack_require__(1)("./"+templateName)]; (function(tmpl) { + __webpack_require__.e(/*! AMD require */ "require_context_templates_sync_recursive_").then(function() { var __WEBPACK_AMD_REQUIRE_ARRAY__ = [__webpack_require__(1)("./"+templateName)]; (function(tmpl) { callback(tmpl()); - }).apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__);}).catch(__webpack_require__.oe); + }).apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__);})['catch'](__webpack_require__.oe); } getTemplate("a", function(a) { console.log(a); @@ -241,22 +243,23 @@ getTemplate("a", function(a) { getTemplate("b", function(b) { console.log(b); }); - -/***/ }) -/******/ ]); +/******/ })() +; ``` -# dist/1.output.js +# dist/require_context_templates_sync_recursive_.output.js ``` javascript -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[1],[ +(self["webpackChunk"] = self["webpackChunk"] || []).push([["require_context_templates_sync_recursive_"],[ /* 0 */, /* 1 */ -/*!**************************************************!*\ - !*** ../require.context/templates sync ^\.\/.*$ ***! - \**************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/*!***************************************************!*\ + !*** ../require.context/templates/ sync ^\.\/.*$ ***! + \***************************************************/ +/*! default exports */ +/*! exports [not provided] [no usage info] */ +/*! runtime requirements: module, __webpack_require__.o, __webpack_require__ */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { var map = { "./a": 2, @@ -273,13 +276,12 @@ function webpackContext(req) { return __webpack_require__(id); } function webpackContextResolve(req) { - var id = map[req]; - if(!(id + 1)) { // check for number or string + if(!__webpack_require__.o(map, req)) { var e = new Error("Cannot find module '" + req + "'"); e.code = 'MODULE_NOT_FOUND'; throw e; } - return id; + return map[req]; } webpackContext.keys = function webpackContextKeys() { return Object.keys(map); @@ -293,8 +295,10 @@ webpackContext.id = 1; /*!*****************************************!*\ !*** ../require.context/templates/a.js ***! \*****************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { module.exports = function() { return "This text was generated by template A"; @@ -305,8 +309,10 @@ module.exports = function() { /*!*****************************************!*\ !*** ../require.context/templates/b.js ***! \*****************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { module.exports = function() { return "This text was generated by template B"; @@ -317,8 +323,10 @@ module.exports = function() { /*!*****************************************!*\ !*** ../require.context/templates/c.js ***! \*****************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { module.exports = function() { return "This text was generated by template C"; @@ -333,55 +341,40 @@ module.exports = function() { ## Unoptimized ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -1.output.js 1.83 KiB 1 [emitted] - output.js 8.41 KiB 0 [emitted] main -Entrypoint main = output.js -chunk {0} output.js (main) 251 bytes >{1}< [entry] [rendered] - > ./example.js main - [0] ./example.js 251 bytes {0} [built] - single entry ./example.js main -chunk {1} 1.output.js 457 bytes <{0}> [rendered] - > [0] ./example.js 2:1-4:3 - [1] ../require.context/templates sync ^\.\/.*$ 217 bytes {1} [built] - amd require context ../require.context/templates [0] ./example.js 2:1-4:3 - [2] ../require.context/templates/a.js 80 bytes {1} [optional] [built] - context element ./a [1] ../require.context/templates sync ^\.\/.*$ ./a - context element ./a.js [1] ../require.context/templates sync ^\.\/.*$ ./a.js - [3] ../require.context/templates/b.js 80 bytes {1} [optional] [built] - context element ./b [1] ../require.context/templates sync ^\.\/.*$ ./b - context element ./b.js [1] ../require.context/templates sync ^\.\/.*$ ./b.js - [4] ../require.context/templates/c.js 80 bytes {1} [optional] [built] - context element ./c [1] ../require.context/templates sync ^\.\/.*$ ./c - context element ./c.js [1] ../require.context/templates sync ^\.\/.*$ ./c.js +asset output.js 9.03 KiB [emitted] (name: main) +asset require_context_templates_sync_recursive_.output.js 2.27 KiB [emitted] +chunk (runtime: main) output.js (main) 251 bytes (javascript) 4.94 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 4.94 KiB 6 modules + ./example.js 251 bytes [built] [code generated] + [used exports unknown] + entry ./example.js main +chunk (runtime: main) require_context_templates_sync_recursive_.output.js 457 bytes [rendered] + > ./example.js 2:1-4:3 + dependent modules 240 bytes [dependent] 3 modules + ../require.context/templates/ sync ^\.\/.*$ 217 bytes [built] [code generated] + [no exports] + [used exports unknown] + amd require context ./example.js 2:1-4:3 +webpack X.X.X compiled successfully ``` ## Production mode ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -1.output.js 626 bytes 1 [emitted] - output.js 2.12 KiB 0 [emitted] main -Entrypoint main = output.js -chunk {0} output.js (main) 251 bytes >{1}< [entry] [rendered] - > ./example.js main - [0] ./example.js 251 bytes {0} [built] - single entry ./example.js main -chunk {1} 1.output.js 457 bytes <{0}> [rendered] - > [0] ./example.js 2:1-4:3 - [1] ../require.context/templates sync ^\.\/.*$ 217 bytes {1} [built] - amd require context ../require.context/templates [0] ./example.js 2:1-4:3 - [2] ../require.context/templates/a.js 80 bytes {1} [optional] [built] - context element ./a [1] ../require.context/templates sync ^\.\/.*$ ./a - context element ./a.js [1] ../require.context/templates sync ^\.\/.*$ ./a.js - [3] ../require.context/templates/b.js 80 bytes {1} [optional] [built] - context element ./b [1] ../require.context/templates sync ^\.\/.*$ ./b - context element ./b.js [1] ../require.context/templates sync ^\.\/.*$ ./b.js - [4] ../require.context/templates/c.js 80 bytes {1} [optional] [built] - context element ./c [1] ../require.context/templates sync ^\.\/.*$ ./c - context element ./c.js [1] ../require.context/templates sync ^\.\/.*$ ./c.js +asset output.js 1.86 KiB [emitted] [minimized] (name: main) +asset require_context_templates_sync_recursive_.output.js 652 bytes [emitted] [minimized] +chunk (runtime: main) output.js (main) 251 bytes (javascript) 4.94 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 4.94 KiB 6 modules + ./example.js 251 bytes [built] [code generated] + [no exports used] + entry ./example.js main +chunk (runtime: main) require_context_templates_sync_recursive_.output.js 457 bytes [rendered] + > ./example.js 2:1-4:3 + dependent modules 240 bytes [dependent] 3 modules + ../require.context/templates/ sync ^\.\/.*$ 217 bytes [built] [code generated] + [no exports] + amd require context ./example.js 2:1-4:3 +webpack X.X.X compiled successfully ``` diff --git a/examples/code-splitted-require.context-amd/template.md b/examples/code-splitted-require.context-amd/template.md index 0166325bfc6..5c134294f17 100644 --- a/examples/code-splitted-require.context-amd/template.md +++ b/examples/code-splitted-require.context-amd/template.md @@ -1,19 +1,19 @@ # example.js ``` javascript -{{example.js}} +_{{example.js}}_ ``` # dist/output.js ``` javascript -{{dist/output.js}} +_{{dist/output.js}}_ ``` -# dist/1.output.js +# dist/require_context_templates_sync_recursive_.output.js ``` javascript -{{dist/1.output.js}} +_{{dist/require_context_templates_sync_recursive_.output.js}}_ ``` # Info @@ -21,11 +21,11 @@ ## Unoptimized ``` -{{stdout}} +_{{stdout}}_ ``` ## Production mode ``` -{{production:stdout}} +_{{production:stdout}}_ ``` diff --git a/examples/code-splitted-require.context-amd/webpack.config.js b/examples/code-splitted-require.context-amd/webpack.config.js index 0d554bf62ea..115df174878 100644 --- a/examples/code-splitted-require.context-amd/webpack.config.js +++ b/examples/code-splitted-require.context-amd/webpack.config.js @@ -1,5 +1,5 @@ module.exports = { optimization: { - occurrenceOrder: true // To keep filename consistent between different modes (for example building only) + chunkIds: "named" // To keep filename consistent between different modes (for example building only) } }; diff --git a/examples/code-splitted-require.context/README.md b/examples/code-splitted-require.context/README.md index 88b609d9cc5..498d9433731 100644 --- a/examples/code-splitted-require.context/README.md +++ b/examples/code-splitted-require.context/README.md @@ -16,224 +16,226 @@ getTemplate("b", function(b) { # dist/output.js -
/******/ (function(modules) { /* webpackBootstrap */ }) - ``` javascript -/******/ (function(modules) { // webpackBootstrap -/******/ // install a JSONP callback for chunk loading -/******/ function webpackJsonpCallback(data) { -/******/ var chunkIds = data[0]; -/******/ var moreModules = data[1]; -/******/ -/******/ -/******/ // add "moreModules" to the modules object, -/******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0, resolves = []; -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(installedChunks[chunkId]) { -/******/ resolves.push(installedChunks[chunkId][0]); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } -/******/ for(moduleId in moreModules) { -/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { -/******/ modules[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(parentJsonpFunction) parentJsonpFunction(data); -/******/ -/******/ while(resolves.length) { -/******/ resolves.shift()(); -/******/ } -/******/ -/******/ }; -/******/ -/******/ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({}); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ /******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // Promise = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ 0: 0 -/******/ }; -/******/ -/******/ -/******/ -/******/ // script path function -/******/ function jsonpScriptSrc(chunkId) { -/******/ return __webpack_require__.p + "" + chunkId + ".output.js" -/******/ } -/******/ +/******/ var __webpack_module_cache__ = {}; +/******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { -/******/ /******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed /******/ exports: {} /******/ }; -/******/ +/******/ /******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } -/******/ -/******/ // This file contains only the entry chunk. -/******/ // The chunk loading function for additional chunks -/******/ __webpack_require__.e = function requireEnsure(chunkId) { -/******/ var promises = []; -/******/ -/******/ -/******/ // JSONP chunk loading for javascript -/******/ -/******/ var installedChunkData = installedChunks[chunkId]; -/******/ if(installedChunkData !== 0) { // 0 means "already installed". -/******/ -/******/ // a Promise means "currently loading". -/******/ if(installedChunkData) { -/******/ promises.push(installedChunkData[2]); -/******/ } else { -/******/ // setup Promise in chunk cache -/******/ var promise = new Promise(function(resolve, reject) { -/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject]; -/******/ }); -/******/ promises.push(installedChunkData[2] = promise); -/******/ -/******/ // start chunk loading -/******/ var script = document.createElement('script'); -/******/ var onScriptComplete; -/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".output.js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ // data-webpack is not used as build has no uniqueName +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ /******/ script.charset = 'utf-8'; /******/ script.timeout = 120; /******/ if (__webpack_require__.nc) { /******/ script.setAttribute("nonce", __webpack_require__.nc); /******/ } -/******/ script.src = jsonpScriptSrc(chunkId); -/******/ -/******/ onScriptComplete = function (event) { -/******/ // avoid mem leaks in IE. -/******/ script.onerror = script.onload = null; -/******/ clearTimeout(timeout); -/******/ var chunk = installedChunks[chunkId]; -/******/ if(chunk !== 0) { -/******/ if(chunk) { -/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); -/******/ var realSrc = event && event.target && event.target.src; -/******/ var error = new Error('Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'); -/******/ error.type = errorType; -/******/ error.request = realSrc; -/******/ chunk[1](error); +/******/ +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "dist/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "main": 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // JSONP chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if(true) { // all chunks have JS +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ installedChunkData[1](error); +/******/ } +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); /******/ } -/******/ installedChunks[chunkId] = undefined; /******/ } -/******/ }; -/******/ var timeout = setTimeout(function(){ -/******/ onScriptComplete({ type: 'timeout', target: script }); -/******/ }, 120000); -/******/ script.onerror = script.onload = onScriptComplete; -/******/ document.head.appendChild(script); +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ // no on chunks loaded +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); /******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ /******/ } -/******/ return Promise.all(promises); -/******/ }; -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ // on error function for async loading -/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; -/******/ -/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; -/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); -/******/ jsonpArray.push = webpackJsonpCallback; -/******/ jsonpArray = jsonpArray.slice(); -/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); -/******/ var parentJsonpFunction = oldJsonpFunction; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); -/******/ }) +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ /************************************************************************/ ```
-``` javascript -/******/ ([ -/* 0 */ +``` js /*!********************!*\ !*** ./example.js ***! \********************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: __webpack_require__.e, __webpack_require__, __webpack_require__.* */ function getTemplate(templateName, callback) { - __webpack_require__.e(/*! require.ensure */ 1).then((function(require) { + __webpack_require__.e(/*! require.ensure */ "require_context_templates_sync_recursive_").then((function(require) { callback(__webpack_require__(1)("./"+templateName)()); - }).bind(null, __webpack_require__)).catch(__webpack_require__.oe); + }).bind(null, __webpack_require__))['catch'](__webpack_require__.oe); } getTemplate("a", function(a) { console.log(a); @@ -241,22 +243,23 @@ getTemplate("a", function(a) { getTemplate("b", function(b) { console.log(b); }); - -/***/ }) -/******/ ]); +/******/ })() +; ``` -# dist/1.output.js +# dist/require_context_templates_sync_recursive_.output.js ``` javascript -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[1],[ +(self["webpackChunk"] = self["webpackChunk"] || []).push([["require_context_templates_sync_recursive_"],[ /* 0 */, /* 1 */ -/*!**************************************************!*\ - !*** ../require.context/templates sync ^\.\/.*$ ***! - \**************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/*!***************************************************!*\ + !*** ../require.context/templates/ sync ^\.\/.*$ ***! + \***************************************************/ +/*! default exports */ +/*! exports [not provided] [no usage info] */ +/*! runtime requirements: module, __webpack_require__.o, __webpack_require__ */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { var map = { "./a": 2, @@ -273,13 +276,12 @@ function webpackContext(req) { return __webpack_require__(id); } function webpackContextResolve(req) { - var id = map[req]; - if(!(id + 1)) { // check for number or string + if(!__webpack_require__.o(map, req)) { var e = new Error("Cannot find module '" + req + "'"); e.code = 'MODULE_NOT_FOUND'; throw e; } - return id; + return map[req]; } webpackContext.keys = function webpackContextKeys() { return Object.keys(map); @@ -293,8 +295,10 @@ webpackContext.id = 1; /*!*****************************************!*\ !*** ../require.context/templates/a.js ***! \*****************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { module.exports = function() { return "This text was generated by template A"; @@ -305,8 +309,10 @@ module.exports = function() { /*!*****************************************!*\ !*** ../require.context/templates/b.js ***! \*****************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { module.exports = function() { return "This text was generated by template B"; @@ -317,8 +323,10 @@ module.exports = function() { /*!*****************************************!*\ !*** ../require.context/templates/c.js ***! \*****************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { module.exports = function() { return "This text was generated by template C"; @@ -333,55 +341,40 @@ module.exports = function() { ## Unoptimized ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -1.output.js 1.83 KiB 1 [emitted] - output.js 8.35 KiB 0 [emitted] main -Entrypoint main = output.js -chunk {0} output.js (main) 266 bytes >{1}< [entry] [rendered] - > ./example.js main - [0] ./example.js 266 bytes {0} [built] - single entry ./example.js main -chunk {1} 1.output.js 457 bytes <{0}> [rendered] - > [0] ./example.js 2:1-4:3 - [1] ../require.context/templates sync ^\.\/.*$ 217 bytes {1} [built] - cjs require context ../require.context/templates [0] ./example.js 3:11-64 - [2] ../require.context/templates/a.js 80 bytes {1} [optional] [built] - context element ./a [1] ../require.context/templates sync ^\.\/.*$ ./a - context element ./a.js [1] ../require.context/templates sync ^\.\/.*$ ./a.js - [3] ../require.context/templates/b.js 80 bytes {1} [optional] [built] - context element ./b [1] ../require.context/templates sync ^\.\/.*$ ./b - context element ./b.js [1] ../require.context/templates sync ^\.\/.*$ ./b.js - [4] ../require.context/templates/c.js 80 bytes {1} [optional] [built] - context element ./c [1] ../require.context/templates sync ^\.\/.*$ ./c - context element ./c.js [1] ../require.context/templates sync ^\.\/.*$ ./c.js +asset output.js 8.94 KiB [emitted] (name: main) +asset require_context_templates_sync_recursive_.output.js 2.27 KiB [emitted] +chunk (runtime: main) output.js (main) 266 bytes (javascript) 4.94 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 4.94 KiB 6 modules + ./example.js 266 bytes [built] [code generated] + [used exports unknown] + entry ./example.js main +chunk (runtime: main) require_context_templates_sync_recursive_.output.js 457 bytes [rendered] + > ./example.js 2:1-4:3 + dependent modules 240 bytes [dependent] 3 modules + ../require.context/templates/ sync ^\.\/.*$ 217 bytes [built] [code generated] + [no exports] + [used exports unknown] + cjs require context ./example.js 3:11-64 +webpack X.X.X compiled successfully ``` ## Production mode ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -1.output.js 626 bytes 1 [emitted] - output.js 2.1 KiB 0 [emitted] main -Entrypoint main = output.js -chunk {0} output.js (main) 266 bytes >{1}< [entry] [rendered] - > ./example.js main - [0] ./example.js 266 bytes {0} [built] - single entry ./example.js main -chunk {1} 1.output.js 457 bytes <{0}> [rendered] - > [0] ./example.js 2:1-4:3 - [1] ../require.context/templates sync ^\.\/.*$ 217 bytes {1} [built] - cjs require context ../require.context/templates [0] ./example.js 3:11-64 - [2] ../require.context/templates/a.js 80 bytes {1} [optional] [built] - context element ./a [1] ../require.context/templates sync ^\.\/.*$ ./a - context element ./a.js [1] ../require.context/templates sync ^\.\/.*$ ./a.js - [3] ../require.context/templates/b.js 80 bytes {1} [optional] [built] - context element ./b [1] ../require.context/templates sync ^\.\/.*$ ./b - context element ./b.js [1] ../require.context/templates sync ^\.\/.*$ ./b.js - [4] ../require.context/templates/c.js 80 bytes {1} [optional] [built] - context element ./c [1] ../require.context/templates sync ^\.\/.*$ ./c - context element ./c.js [1] ../require.context/templates sync ^\.\/.*$ ./c.js +asset output.js 1.83 KiB [emitted] [minimized] (name: main) +asset require_context_templates_sync_recursive_.output.js 652 bytes [emitted] [minimized] +chunk (runtime: main) output.js (main) 266 bytes (javascript) 4.94 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 4.94 KiB 6 modules + ./example.js 266 bytes [built] [code generated] + [no exports used] + entry ./example.js main +chunk (runtime: main) require_context_templates_sync_recursive_.output.js 457 bytes [rendered] + > ./example.js 2:1-4:3 + dependent modules 240 bytes [dependent] 3 modules + ../require.context/templates/ sync ^\.\/.*$ 217 bytes [built] [code generated] + [no exports] + cjs require context ./example.js 3:11-64 +webpack X.X.X compiled successfully ``` diff --git a/examples/code-splitted-require.context/template.md b/examples/code-splitted-require.context/template.md index 0166325bfc6..5c134294f17 100644 --- a/examples/code-splitted-require.context/template.md +++ b/examples/code-splitted-require.context/template.md @@ -1,19 +1,19 @@ # example.js ``` javascript -{{example.js}} +_{{example.js}}_ ``` # dist/output.js ``` javascript -{{dist/output.js}} +_{{dist/output.js}}_ ``` -# dist/1.output.js +# dist/require_context_templates_sync_recursive_.output.js ``` javascript -{{dist/1.output.js}} +_{{dist/require_context_templates_sync_recursive_.output.js}}_ ``` # Info @@ -21,11 +21,11 @@ ## Unoptimized ``` -{{stdout}} +_{{stdout}}_ ``` ## Production mode ``` -{{production:stdout}} +_{{production:stdout}}_ ``` diff --git a/examples/code-splitted-require.context/webpack.config.js b/examples/code-splitted-require.context/webpack.config.js index 0d554bf62ea..115df174878 100644 --- a/examples/code-splitted-require.context/webpack.config.js +++ b/examples/code-splitted-require.context/webpack.config.js @@ -1,5 +1,5 @@ module.exports = { optimization: { - occurrenceOrder: true // To keep filename consistent between different modes (for example building only) + chunkIds: "named" // To keep filename consistent between different modes (for example building only) } }; diff --git a/examples/code-splitting-bundle-loader/README.md b/examples/code-splitting-bundle-loader/README.md index 26d0d439c4d..b3a6f47d95a 100644 --- a/examples/code-splitting-bundle-loader/README.md +++ b/examples/code-splitting-bundle-loader/README.md @@ -4,7 +4,7 @@ The bundle loader is used to create a wrapper module for `file.js` that loads th # example.js -``` javascript +```javascript require("bundle-loader!./file.js")(function(fileJsExports) { console.log(fileJsExports); }); @@ -12,270 +12,280 @@ require("bundle-loader!./file.js")(function(fileJsExports) { # file.js -``` javascript +```javascript module.exports = "It works"; ``` - # dist/output.js -
/******/ (function(modules) { /* webpackBootstrap */ }) +```javascript +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */ +/*!***********************************************************!*\ + !*** ../../node_modules/bundle-loader/index.js!./file.js ***! + \***********************************************************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module, __webpack_require__, __webpack_require__.e, __webpack_require__.* */ +/*! CommonJS bailout: module.exports is used directly at 3:0-14 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { -``` javascript -/******/ (function(modules) { // webpackBootstrap -/******/ // install a JSONP callback for chunk loading -/******/ function webpackJsonpCallback(data) { -/******/ var chunkIds = data[0]; -/******/ var moreModules = data[1]; -/******/ -/******/ -/******/ // add "moreModules" to the modules object, -/******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0, resolves = []; -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(installedChunks[chunkId]) { -/******/ resolves.push(installedChunks[chunkId][0]); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } -/******/ for(moduleId in moreModules) { -/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { -/******/ modules[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(parentJsonpFunction) parentJsonpFunction(data); -/******/ -/******/ while(resolves.length) { -/******/ resolves.shift()(); -/******/ } -/******/ -/******/ }; -/******/ -/******/ +var cbs = [], + data; +module.exports = function(cb) { + if(cbs) cbs.push(cb); + else cb(data); +} +__webpack_require__.e(/*! require.ensure */ "file_js").then((function(require) { + data = __webpack_require__(/*! !!./file.js */ 2); + var callbacks = cbs; + cbs = null; + for(var i = 0, l = callbacks.length; i < l; i++) { + callbacks[i](data); + } +}).bind(null, __webpack_require__))['catch'](__webpack_require__.oe); + +/***/ }) +/******/ ]); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ /******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // Promise = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ 0: 0 -/******/ }; -/******/ -/******/ -/******/ -/******/ // script path function -/******/ function jsonpScriptSrc(chunkId) { -/******/ return __webpack_require__.p + "" + chunkId + ".output.js" -/******/ } -/******/ +/******/ var __webpack_module_cache__ = {}; +/******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { -/******/ /******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed /******/ exports: {} /******/ }; -/******/ +/******/ /******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } -/******/ -/******/ // This file contains only the entry chunk. -/******/ // The chunk loading function for additional chunks -/******/ __webpack_require__.e = function requireEnsure(chunkId) { -/******/ var promises = []; -/******/ -/******/ -/******/ // JSONP chunk loading for javascript -/******/ -/******/ var installedChunkData = installedChunks[chunkId]; -/******/ if(installedChunkData !== 0) { // 0 means "already installed". -/******/ -/******/ // a Promise means "currently loading". -/******/ if(installedChunkData) { -/******/ promises.push(installedChunkData[2]); -/******/ } else { -/******/ // setup Promise in chunk cache -/******/ var promise = new Promise(function(resolve, reject) { -/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject]; -/******/ }); -/******/ promises.push(installedChunkData[2] = promise); -/******/ -/******/ // start chunk loading -/******/ var script = document.createElement('script'); -/******/ var onScriptComplete; -/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".output.js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ // data-webpack is not used as build has no uniqueName +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ /******/ script.charset = 'utf-8'; /******/ script.timeout = 120; /******/ if (__webpack_require__.nc) { /******/ script.setAttribute("nonce", __webpack_require__.nc); /******/ } -/******/ script.src = jsonpScriptSrc(chunkId); -/******/ -/******/ onScriptComplete = function (event) { -/******/ // avoid mem leaks in IE. -/******/ script.onerror = script.onload = null; -/******/ clearTimeout(timeout); -/******/ var chunk = installedChunks[chunkId]; -/******/ if(chunk !== 0) { -/******/ if(chunk) { -/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); -/******/ var realSrc = event && event.target && event.target.src; -/******/ var error = new Error('Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'); -/******/ error.type = errorType; -/******/ error.request = realSrc; -/******/ chunk[1](error); +/******/ +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "dist/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "main": 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // JSONP chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if(true) { // all chunks have JS +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ installedChunkData[1](error); +/******/ } +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); /******/ } -/******/ installedChunks[chunkId] = undefined; /******/ } -/******/ }; -/******/ var timeout = setTimeout(function(){ -/******/ onScriptComplete({ type: 'timeout', target: script }); -/******/ }, 120000); -/******/ script.onerror = script.onload = onScriptComplete; -/******/ document.head.appendChild(script); +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ // no on chunks loaded +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); /******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ /******/ } -/******/ return Promise.all(promises); -/******/ }; -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ // on error function for async loading -/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; -/******/ -/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; -/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); -/******/ jsonpArray.push = webpackJsonpCallback; -/******/ jsonpArray = jsonpArray.slice(); -/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); -/******/ var parentJsonpFunction = oldJsonpFunction; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); -/******/ }) +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ /************************************************************************/ ```
-``` javascript -/******/ ([ -/* 0 */ +``` js +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { /*!********************!*\ !*** ./example.js ***! \********************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: __webpack_require__ */ __webpack_require__(/*! bundle-loader!./file.js */ 1)(function(fileJsExports) { console.log(fileJsExports); }); +})(); -/***/ }), -/* 1 */ -/*!******************************************************!*\ - !*** (webpack)/node_modules/bundle-loader!./file.js ***! - \******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var cbs = [], - data; -module.exports = function(cb) { - if(cbs) cbs.push(cb); - else cb(data); -} -__webpack_require__.e(/*! require.ensure */ 1).then((function(require) { - data = __webpack_require__(/*! !./file.js */ 2); - var callbacks = cbs; - cbs = null; - for(var i = 0, l = callbacks.length; i < l; i++) { - callbacks[i](data); - } -}).bind(null, __webpack_require__)).catch(__webpack_require__.oe); - -/***/ }) -/******/ ]); +/******/ })() +; ``` -# dist/1.output.js +# dist/file_js.output.js -``` javascript -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[1],{ +```javascript +(self["webpackChunk"] = self["webpackChunk"] || []).push([["file_js"],{ /***/ 2: /*!*****************!*\ !*** ./file.js ***! \*****************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { module.exports = "It works"; @@ -289,41 +299,41 @@ module.exports = "It works"; ## Unoptimized ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -1.output.js 257 bytes 1 [emitted] - output.js 8.78 KiB 0 [emitted] main -Entrypoint main = output.js -chunk {0} output.js (main) 375 bytes >{1}< [entry] [rendered] - > ./example.js main - [0] ./example.js 94 bytes {0} [built] - single entry ./example.js main - [1] (webpack)/node_modules/bundle-loader!./file.js 281 bytes {0} [built] - cjs require bundle-loader!./file.js [0] ./example.js 1:0-34 -chunk {1} 1.output.js 28 bytes <{0}> [rendered] - > [1] (webpack)/node_modules/bundle-loader!./file.js 7:0-14:2 - [2] ./file.js 28 bytes {1} [built] - cjs require !!./file.js [1] (webpack)/node_modules/bundle-loader!./file.js 8:8-30 +asset output.js 9.64 KiB [emitted] (name: main) +asset file_js.output.js 360 bytes [emitted] +chunk (runtime: main) file_js.output.js 28 bytes [rendered] + > ../../node_modules/bundle-loader/index.js!./file.js 7:0-14:2 + ./file.js 28 bytes [built] [code generated] + [used exports unknown] + cjs self exports reference ./file.js 1:0-14 + cjs require !!./file.js ../../node_modules/bundle-loader/index.js!./file.js 8:8-30 +chunk (runtime: main) output.js (main) 375 bytes (javascript) 4.94 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 4.94 KiB 6 modules + dependent modules 281 bytes [dependent] 1 module + ./example.js 94 bytes [built] [code generated] + [used exports unknown] + entry ./example.js main +webpack X.X.X compiled successfully ``` ## Production mode ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -1.output.js 98 bytes 1 [emitted] - output.js 2.16 KiB 0 [emitted] main -Entrypoint main = output.js -chunk {0} output.js (main) 375 bytes >{1}< [entry] [rendered] - > ./example.js main - [0] ./example.js 94 bytes {0} [built] - single entry ./example.js main - [1] (webpack)/node_modules/bundle-loader!./file.js 281 bytes {0} [built] - cjs require bundle-loader!./file.js [0] ./example.js 1:0-34 -chunk {1} 1.output.js 28 bytes <{0}> [rendered] - > [1] (webpack)/node_modules/bundle-loader!./file.js 7:0-14:2 - [2] ./file.js 28 bytes {1} [built] - cjs require !!./file.js [1] (webpack)/node_modules/bundle-loader!./file.js 8:8-30 +asset output.js 1.86 KiB [emitted] [minimized] (name: main) +asset file_js.output.js 94 bytes [emitted] [minimized] +chunk (runtime: main) file_js.output.js 28 bytes [rendered] + > ../../node_modules/bundle-loader/index.js!./file.js 7:0-14:2 + ./file.js 28 bytes [built] [code generated] + [used exports unknown] + cjs self exports reference ./file.js 1:0-14 + cjs require !!./file.js ../../node_modules/bundle-loader/index.js!./file.js 8:8-30 +chunk (runtime: main) output.js (main) 375 bytes (javascript) 4.94 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 4.94 KiB 6 modules + dependent modules 281 bytes [dependent] 1 module + ./example.js 94 bytes [built] [code generated] + [no exports used] + entry ./example.js main +webpack X.X.X compiled successfully ``` diff --git a/examples/code-splitting-bundle-loader/template.md b/examples/code-splitting-bundle-loader/template.md index fe41f8dd4bc..38e642808d5 100644 --- a/examples/code-splitting-bundle-loader/template.md +++ b/examples/code-splitting-bundle-loader/template.md @@ -4,27 +4,26 @@ The bundle loader is used to create a wrapper module for `file.js` that loads th # example.js -``` javascript -{{example.js}} +```javascript +_{{example.js}}_ ``` # file.js -``` javascript -{{file.js}} +```javascript +_{{file.js}}_ ``` - # dist/output.js -``` javascript -{{dist/output.js}} +```javascript +_{{dist/output.js}}_ ``` -# dist/1.output.js +# dist/file_js.output.js -``` javascript -{{dist/1.output.js}} +```javascript +_{{dist/file_js.output.js}}_ ``` # Info @@ -32,11 +31,11 @@ The bundle loader is used to create a wrapper module for `file.js` that loads th ## Unoptimized ``` -{{stdout}} +_{{stdout}}_ ``` ## Production mode ``` -{{production:stdout}} +_{{production:stdout}}_ ``` diff --git a/examples/code-splitting-bundle-loader/webpack.config.js b/examples/code-splitting-bundle-loader/webpack.config.js index 0d554bf62ea..115df174878 100644 --- a/examples/code-splitting-bundle-loader/webpack.config.js +++ b/examples/code-splitting-bundle-loader/webpack.config.js @@ -1,5 +1,5 @@ module.exports = { optimization: { - occurrenceOrder: true // To keep filename consistent between different modes (for example building only) + chunkIds: "named" // To keep filename consistent between different modes (for example building only) } }; diff --git a/examples/code-splitting-depend-on-advanced/README.md b/examples/code-splitting-depend-on-advanced/README.md new file mode 100644 index 00000000000..3b062638f63 --- /dev/null +++ b/examples/code-splitting-depend-on-advanced/README.md @@ -0,0 +1,688 @@ +This example shows how to use Code Splitting with entrypoint dependOn + +# webpack.config.js + +```javascript +module.exports = { + entry: { + app: { import: "./app.js", dependOn: ["other-vendors"] }, + page1: { import: "./page1.js", dependOn: ["app", "react-vendors"] }, + "react-vendors": ["react", "react-dom", "prop-types"], + "other-vendors": "./other-vendors" + }, + optimization: { + runtimeChunk: "single", + chunkIds: "named" // To keep filename consistent between different modes (for example building only) + }, + stats: { + chunks: true, + chunkRelations: true + } +}; +``` + +# app.js + +```javascript +import isomorphicFetch from "isomorphic-fetch"; +import lodash from "lodash"; + +console.log(isomorphicFetch, lodash); +``` + +# page1.js + +```javascript +import isomorphicFetch from "isomorphic-fetch"; +import react from "react"; +import reactDOM from "react-dom"; + +console.log(isomorphicFetch, react, reactDOM); + +import("./lazy"); +``` + +# lazy.js + +```javascript +import lodash from "lodash"; +import propTypes from "prop-types"; + +console.log(lodash, propTypes); +``` + +# other-vendors.js + +```javascript +import lodash from "lodash"; +import isomorphicFetch from "isomorphic-fetch"; + +// Additional initializations +console.log(lodash, isomorphicFetch); +``` + +# dist/runtime.js + +```javascript +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({}); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/chunk loaded */ +/******/ (() => { +/******/ var deferred = []; +/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => { +/******/ if(chunkIds) { +/******/ priority = priority || 0; +/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1]; +/******/ deferred[i] = [chunkIds, fn, priority]; +/******/ return; +/******/ } +/******/ var notFulfilled = Infinity; +/******/ for (var i = 0; i < deferred.length; i++) { +/******/ var [chunkIds, fn, priority] = deferred[i]; +/******/ var fulfilled = true; +/******/ for (var j = 0; j < chunkIds.length; j++) { +/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) { +/******/ chunkIds.splice(j--, 1); +/******/ } else { +/******/ fulfilled = false; +/******/ if(priority < notFulfilled) notFulfilled = priority; +/******/ } +/******/ } +/******/ if(fulfilled) { +/******/ deferred.splice(i--, 1) +/******/ var r = fn(); +/******/ if (r !== undefined) result = r; +/******/ } +/******/ } +/******/ return result; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ // data-webpack is not used as build has no uniqueName +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ +/******/ script.charset = 'utf-8'; +/******/ script.timeout = 120; +/******/ if (__webpack_require__.nc) { +/******/ script.setAttribute("nonce", __webpack_require__.nc); +/******/ } +/******/ +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "dist/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "runtime": 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // JSONP chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if("runtime" != chunkId) { +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ installedChunkData[1](error); +/******/ } +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); +/******/ } else installedChunks[chunkId] = 0; +/******/ } +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0); +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); +/******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ return __webpack_require__.O(result); +/******/ } +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ +/************************************************************************/ +``` + +
+ +``` js +/******/ +/******/ +/******/ })() +; +``` + +# dist/app.js + +```javascript +"use strict"; +(self["webpackChunk"] = self["webpackChunk"] || []).push([["app"],{ + +/***/ 6: +/*!****************!*\ + !*** ./app.js ***! + \****************/ +/*! namespace exports */ +/*! exports [not provided] [no usage info] */ +/*! runtime requirements: __webpack_require__, __webpack_require__.n, __webpack_require__.r, __webpack_exports__, __webpack_require__.* */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var isomorphic_fetch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! isomorphic-fetch */ 5); +/* harmony import */ var isomorphic_fetch__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(isomorphic_fetch__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lodash */ 4); +/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_1__); + + + +console.log((isomorphic_fetch__WEBPACK_IMPORTED_MODULE_0___default()), (lodash__WEBPACK_IMPORTED_MODULE_1___default())); + + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["other-vendors"], () => (__webpack_exec__(6))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); +``` + +# dist/page1.js + +```javascript +"use strict"; +(self["webpackChunk"] = self["webpackChunk"] || []).push([["page1"],{ + +/***/ 7: +/*!******************!*\ + !*** ./page1.js ***! + \******************/ +/*! namespace exports */ +/*! exports [not provided] [no usage info] */ +/*! runtime requirements: __webpack_require__, __webpack_require__.n, __webpack_require__.r, __webpack_exports__, __webpack_require__.e, __webpack_require__.* */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var isomorphic_fetch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! isomorphic-fetch */ 5); +/* harmony import */ var isomorphic_fetch__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(isomorphic_fetch__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ 0); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-dom */ 1); +/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_2__); + + + + +console.log((isomorphic_fetch__WEBPACK_IMPORTED_MODULE_0___default()), (react__WEBPACK_IMPORTED_MODULE_1___default()), (react_dom__WEBPACK_IMPORTED_MODULE_2___default())); + +__webpack_require__.e(/*! import() */ "lazy_js").then(__webpack_require__.bind(__webpack_require__, /*! ./lazy */ 8)); + + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ __webpack_require__.O(0, ["app","react-vendors","other-vendors"], () => (__webpack_exec__(7))); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ } +]); +``` + +# dist/other-vendors.js + +```javascript +(self["webpackChunk"] = self["webpackChunk"] || []).push([["other-vendors"],[ +/* 0 */, +/* 1 */, +/* 2 */, +/* 3 */ +/*!**************************!*\ + !*** ./other-vendors.js ***! + \**************************/ +/*! namespace exports */ +/*! exports [not provided] [no usage info] */ +/*! runtime requirements: __webpack_require__, __webpack_require__.n, __webpack_require__.r, __webpack_exports__, __webpack_require__.* */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! lodash */ 4); +/* harmony import */ var lodash__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(lodash__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var isomorphic_fetch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! isomorphic-fetch */ 5); +/* harmony import */ var isomorphic_fetch__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(isomorphic_fetch__WEBPACK_IMPORTED_MODULE_1__); + + + +// Additional initializations +console.log((lodash__WEBPACK_IMPORTED_MODULE_0___default()), (isomorphic_fetch__WEBPACK_IMPORTED_MODULE_1___default())); + + +/***/ }), +/* 4 */ +/*!********************************!*\ + !*** ./node_modules/lodash.js ***! + \********************************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { + +module.exports = 'lodash'; + + +/***/ }), +/* 5 */ +/*!******************************************!*\ + !*** ./node_modules/isomorphic-fetch.js ***! + \******************************************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { + +module.exports = "isomorphic-fetch"; + + +/***/ }) +], +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ var __webpack_exports__ = (__webpack_exec__(3)); +/******/ } +]); +``` + +# dist/react-vendors.js + +```javascript +(self["webpackChunk"] = self["webpackChunk"] || []).push([["react-vendors"],[ +/* 0 */ +/*!*******************************!*\ + !*** ./node_modules/react.js ***! + \*******************************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { + +module.exports = 'react'; + + +/***/ }), +/* 1 */ +/*!***********************************!*\ + !*** ./node_modules/react-dom.js ***! + \***********************************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { + +module.exports = 'react-dom'; + + +/***/ }), +/* 2 */ +/*!************************************!*\ + !*** ./node_modules/prop-types.js ***! + \************************************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { + +module.exports = 'prop-types'; + + +/***/ }) +], +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ var __webpack_exports__ = (__webpack_exec__(0), __webpack_exec__(1), __webpack_exec__(2)); +/******/ } +]); +``` + +# Info + +## Unoptimized + +``` +asset runtime.js 11.1 KiB [emitted] (name: runtime) +asset other-vendors.js 2.13 KiB [emitted] (name: other-vendors) +asset page1.js 1.91 KiB [emitted] (name: page1) +asset app.js 1.44 KiB [emitted] (name: app) +asset react-vendors.js 1.33 KiB [emitted] (name: react-vendors) +asset lazy_js.js 1.11 KiB [emitted] +Entrypoint app 1.44 KiB = app.js +Entrypoint page1 1.91 KiB = page1.js +Entrypoint react-vendors 12.5 KiB = runtime.js 11.1 KiB react-vendors.js 1.33 KiB +Entrypoint other-vendors 13.3 KiB = runtime.js 11.1 KiB other-vendors.js 2.13 KiB +chunk (runtime: runtime) app.js (app) 116 bytes <{other-vendors}> <{runtime}> >{page1}< [initial] [rendered] + > ./app.js app + ./app.js 116 bytes [built] [code generated] + [no exports] + [used exports unknown] + entry ./app.js app +chunk (runtime: runtime) lazy_js.js 98 bytes <{page1}> [rendered] + > ./lazy ./page1.js 7:0-16 + ./lazy.js 98 bytes [built] [code generated] + [no exports] + [used exports unknown] + import() ./lazy ./page1.js 7:0-16 +chunk (runtime: runtime) other-vendors.js (other-vendors) 210 bytes ={runtime}= >{app}< [initial] [rendered] + > ./other-vendors other-vendors + dependent modules 64 bytes [dependent] 2 modules + ./other-vendors.js 146 bytes [built] [code generated] + [no exports] + [used exports unknown] + entry ./other-vendors other-vendors +chunk (runtime: runtime) page1.js (page1) 176 bytes <{app}> <{react-vendors}> <{runtime}> >{lazy_js}< [initial] [rendered] + > ./page1.js page1 + ./page1.js 176 bytes [built] [code generated] + [no exports] + [used exports unknown] + entry ./page1.js page1 +chunk (runtime: runtime) react-vendors.js (react-vendors) 87 bytes ={runtime}= >{page1}< [initial] [rendered] + > prop-types react-vendors + > react react-vendors + > react-dom react-vendors + ./node_modules/prop-types.js 31 bytes [built] [code generated] + [used exports unknown] + from origin ./lazy.js + harmony side effect evaluation prop-types ./lazy.js 2:0-35 + harmony import specifier prop-types ./lazy.js 4:20-29 + cjs self exports reference ./node_modules/prop-types.js 1:0-14 + entry prop-types react-vendors + ./node_modules/react-dom.js 30 bytes [built] [code generated] + [used exports unknown] + from origin ./page1.js + harmony side effect evaluation react-dom ./page1.js 3:0-33 + harmony import specifier react-dom ./page1.js 5:36-44 + cjs self exports reference ./node_modules/react-dom.js 1:0-14 + entry react-dom react-vendors + ./node_modules/react.js 26 bytes [built] [code generated] + [used exports unknown] + from origin ./page1.js + harmony side effect evaluation react ./page1.js 2:0-26 + harmony import specifier react ./page1.js 5:29-34 + cjs self exports reference ./node_modules/react.js 1:0-14 + entry react react-vendors +chunk (runtime: runtime) runtime.js (runtime) 6.74 KiB ={other-vendors}= ={react-vendors}= >{app}< >{page1}< [entry] [rendered] + > ./other-vendors other-vendors + > prop-types react-vendors + > react react-vendors + > react-dom react-vendors + runtime modules 6.74 KiB 10 modules +webpack X.X.X compiled successfully +``` + +## Production mode + +``` +asset runtime.js 2.37 KiB [emitted] [minimized] (name: runtime) +asset page1.js 283 bytes [emitted] [minimized] (name: page1) +asset other-vendors.js 241 bytes [emitted] [minimized] (name: other-vendors) +asset react-vendors.js 204 bytes [emitted] [minimized] (name: react-vendors) +asset app.js 202 bytes [emitted] [minimized] (name: app) +asset lazy_js.js 160 bytes [emitted] [minimized] +Entrypoint app 202 bytes = app.js +Entrypoint page1 283 bytes = page1.js +Entrypoint react-vendors 2.57 KiB = runtime.js 2.37 KiB react-vendors.js 204 bytes +Entrypoint other-vendors 2.6 KiB = runtime.js 2.37 KiB other-vendors.js 241 bytes +chunk (runtime: runtime) app.js (app) 116 bytes <{other-vendors}> <{runtime}> >{page1}< [initial] [rendered] + > ./app.js app + ./app.js 116 bytes [built] [code generated] + [no exports] + [no exports used] + entry ./app.js app +chunk (runtime: runtime) lazy_js.js 98 bytes <{page1}> [rendered] + > ./lazy ./page1.js 7:0-16 + ./lazy.js 98 bytes [built] [code generated] + [no exports] + import() ./lazy ./page1.js 7:0-16 +chunk (runtime: runtime) other-vendors.js (other-vendors) 210 bytes ={runtime}= >{app}< [initial] [rendered] + > ./other-vendors other-vendors + dependent modules 64 bytes [dependent] 2 modules + ./other-vendors.js 146 bytes [built] [code generated] + [no exports] + [no exports used] + entry ./other-vendors other-vendors +chunk (runtime: runtime) page1.js (page1) 176 bytes <{app}> <{react-vendors}> <{runtime}> >{lazy_js}< [initial] [rendered] + > ./page1.js page1 + ./page1.js 176 bytes [built] [code generated] + [no exports] + [no exports used] + entry ./page1.js page1 +chunk (runtime: runtime) react-vendors.js (react-vendors) 87 bytes ={runtime}= >{page1}< [initial] [rendered] + > prop-types react-vendors + > react react-vendors + > react-dom react-vendors + ./node_modules/prop-types.js 31 bytes [built] [code generated] + [used exports unknown] + from origin ./lazy.js + harmony side effect evaluation prop-types ./lazy.js 2:0-35 + harmony import specifier prop-types ./lazy.js 4:20-29 + cjs self exports reference ./node_modules/prop-types.js 1:0-14 + entry prop-types react-vendors + ./node_modules/react-dom.js 30 bytes [built] [code generated] + [used exports unknown] + from origin ./page1.js + harmony side effect evaluation react-dom ./page1.js 3:0-33 + harmony import specifier react-dom ./page1.js 5:36-44 + cjs self exports reference ./node_modules/react-dom.js 1:0-14 + entry react-dom react-vendors + ./node_modules/react.js 26 bytes [built] [code generated] + [used exports unknown] + from origin ./page1.js + harmony side effect evaluation react ./page1.js 2:0-26 + harmony import specifier react ./page1.js 5:29-34 + cjs self exports reference ./node_modules/react.js 1:0-14 + entry react react-vendors +chunk (runtime: runtime) runtime.js (runtime) 6.74 KiB ={other-vendors}= ={react-vendors}= >{app}< >{page1}< [entry] [rendered] + > ./other-vendors other-vendors + > prop-types react-vendors + > react react-vendors + > react-dom react-vendors + runtime modules 6.74 KiB 10 modules +webpack X.X.X compiled successfully +``` diff --git a/examples/code-splitting-depend-on-advanced/app.js b/examples/code-splitting-depend-on-advanced/app.js new file mode 100644 index 00000000000..2fd657f1d8f --- /dev/null +++ b/examples/code-splitting-depend-on-advanced/app.js @@ -0,0 +1,4 @@ +import isomorphicFetch from "isomorphic-fetch"; +import lodash from "lodash"; + +console.log(isomorphicFetch, lodash); diff --git a/examples/i18n/build.js b/examples/code-splitting-depend-on-advanced/build.js similarity index 100% rename from examples/i18n/build.js rename to examples/code-splitting-depend-on-advanced/build.js diff --git a/examples/code-splitting-depend-on-advanced/lazy.js b/examples/code-splitting-depend-on-advanced/lazy.js new file mode 100644 index 00000000000..e2013cc26fd --- /dev/null +++ b/examples/code-splitting-depend-on-advanced/lazy.js @@ -0,0 +1,4 @@ +import lodash from "lodash"; +import propTypes from "prop-types"; + +console.log(lodash, propTypes); diff --git a/examples/code-splitting-depend-on-advanced/node_modules/isomorphic-fetch.js b/examples/code-splitting-depend-on-advanced/node_modules/isomorphic-fetch.js new file mode 100644 index 00000000000..ce0c36b3158 --- /dev/null +++ b/examples/code-splitting-depend-on-advanced/node_modules/isomorphic-fetch.js @@ -0,0 +1 @@ +module.exports = "isomorphic-fetch"; diff --git a/examples/code-splitting-depend-on-advanced/node_modules/lodash.js b/examples/code-splitting-depend-on-advanced/node_modules/lodash.js new file mode 100644 index 00000000000..8cae1154e6b --- /dev/null +++ b/examples/code-splitting-depend-on-advanced/node_modules/lodash.js @@ -0,0 +1 @@ +module.exports = 'lodash'; diff --git a/examples/code-splitting-depend-on-advanced/node_modules/prop-types.js b/examples/code-splitting-depend-on-advanced/node_modules/prop-types.js new file mode 100644 index 00000000000..9c6971329ce --- /dev/null +++ b/examples/code-splitting-depend-on-advanced/node_modules/prop-types.js @@ -0,0 +1 @@ +module.exports = 'prop-types'; diff --git a/examples/code-splitting-depend-on-advanced/node_modules/react-dom.js b/examples/code-splitting-depend-on-advanced/node_modules/react-dom.js new file mode 100644 index 00000000000..d2f4c643e28 --- /dev/null +++ b/examples/code-splitting-depend-on-advanced/node_modules/react-dom.js @@ -0,0 +1 @@ +module.exports = 'react-dom'; diff --git a/examples/code-splitting-depend-on-advanced/node_modules/react.js b/examples/code-splitting-depend-on-advanced/node_modules/react.js new file mode 100644 index 00000000000..11c0b89c737 --- /dev/null +++ b/examples/code-splitting-depend-on-advanced/node_modules/react.js @@ -0,0 +1 @@ +module.exports = 'react'; diff --git a/examples/code-splitting-depend-on-advanced/other-vendors.js b/examples/code-splitting-depend-on-advanced/other-vendors.js new file mode 100644 index 00000000000..49e051a810c --- /dev/null +++ b/examples/code-splitting-depend-on-advanced/other-vendors.js @@ -0,0 +1,5 @@ +import lodash from "lodash"; +import isomorphicFetch from "isomorphic-fetch"; + +// Additional initializations +console.log(lodash, isomorphicFetch); diff --git a/examples/code-splitting-depend-on-advanced/page1.js b/examples/code-splitting-depend-on-advanced/page1.js new file mode 100644 index 00000000000..18c9e0c9ba6 --- /dev/null +++ b/examples/code-splitting-depend-on-advanced/page1.js @@ -0,0 +1,7 @@ +import isomorphicFetch from "isomorphic-fetch"; +import react from "react"; +import reactDOM from "react-dom"; + +console.log(isomorphicFetch, react, reactDOM); + +import("./lazy"); diff --git a/examples/code-splitting-depend-on-advanced/template.md b/examples/code-splitting-depend-on-advanced/template.md new file mode 100644 index 00000000000..e2e842027e5 --- /dev/null +++ b/examples/code-splitting-depend-on-advanced/template.md @@ -0,0 +1,75 @@ +This example shows how to use Code Splitting with entrypoint dependOn + +# webpack.config.js + +```javascript +_{{webpack.config.js}}_ +``` + +# app.js + +```javascript +_{{app.js}}_ +``` + +# page1.js + +```javascript +_{{page1.js}}_ +``` + +# lazy.js + +```javascript +_{{lazy.js}}_ +``` + +# other-vendors.js + +```javascript +_{{other-vendors.js}}_ +``` + +# dist/runtime.js + +```javascript +_{{dist/runtime.js}}_ +``` + +# dist/app.js + +```javascript +_{{dist/app.js}}_ +``` + +# dist/page1.js + +```javascript +_{{dist/page1.js}}_ +``` + +# dist/other-vendors.js + +```javascript +_{{dist/other-vendors.js}}_ +``` + +# dist/react-vendors.js + +```javascript +_{{dist/react-vendors.js}}_ +``` + +# Info + +## Unoptimized + +``` +_{{stdout}}_ +``` + +## Production mode + +``` +_{{production:stdout}}_ +``` diff --git a/examples/code-splitting-depend-on-advanced/webpack.config.js b/examples/code-splitting-depend-on-advanced/webpack.config.js new file mode 100644 index 00000000000..fc4b2b3347f --- /dev/null +++ b/examples/code-splitting-depend-on-advanced/webpack.config.js @@ -0,0 +1,16 @@ +module.exports = { + entry: { + app: { import: "./app.js", dependOn: ["other-vendors"] }, + page1: { import: "./page1.js", dependOn: ["app", "react-vendors"] }, + "react-vendors": ["react", "react-dom", "prop-types"], + "other-vendors": "./other-vendors" + }, + optimization: { + runtimeChunk: "single", + chunkIds: "named" // To keep filename consistent between different modes (for example building only) + }, + stats: { + chunks: true, + chunkRelations: true + } +}; diff --git a/examples/code-splitting-depend-on-simple/README.md b/examples/code-splitting-depend-on-simple/README.md new file mode 100644 index 00000000000..f1e53d3e8cc --- /dev/null +++ b/examples/code-splitting-depend-on-simple/README.md @@ -0,0 +1,375 @@ +This example shows how to use Code Splitting with entrypoint dependOn + +# webpack.config.js + +```javascript +module.exports = { + entry: { + app: { import: "./app.js", dependOn: ["react-vendors"] }, + "react-vendors": ["react", "react-dom", "prop-types"] + }, + optimization: { + chunkIds: "named" // To keep filename consistent between different modes (for example building only) + }, + stats: { + chunks: true, + chunkRelations: true + } +}; +``` + +# app.js + +```javascript +import react from "react"; +import reactDOM from "react-dom"; +import propTypes from "prop-types"; + +console.log(react, reactDOM, propTypes); +``` + +# dist/app.js + +```javascript +"use strict"; +(self["webpackChunk"] = self["webpackChunk"] || []).push([["app"],{ + +/***/ 3: +/*!****************!*\ + !*** ./app.js ***! + \****************/ +/*! namespace exports */ +/*! exports [not provided] [no usage info] */ +/*! runtime requirements: __webpack_require__, __webpack_require__.n, __webpack_require__.r, __webpack_exports__, __webpack_require__.* */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ 0); +/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); +/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ 1); +/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! prop-types */ 2); +/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_2__); + + + + +console.log((react__WEBPACK_IMPORTED_MODULE_0___default()), (react_dom__WEBPACK_IMPORTED_MODULE_1___default()), (prop_types__WEBPACK_IMPORTED_MODULE_2___default())); + + +/***/ }) + +}, +/******/ __webpack_require__ => { // webpackRuntimeModules +/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +/******/ var __webpack_exports__ = (__webpack_exec__(3)); +/******/ } +]); +``` + +# dist/react-vendors.js + +```javascript +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ([ +/* 0 */ +/*!*******************************!*\ + !*** ./node_modules/react.js ***! + \*******************************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { + +module.exports = 'react'; + + +/***/ }), +/* 1 */ +/*!***********************************!*\ + !*** ./node_modules/react-dom.js ***! + \***********************************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { + +module.exports = 'react-dom'; + + +/***/ }), +/* 2 */ +/*!************************************!*\ + !*** ./node_modules/prop-types.js ***! + \************************************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { + +module.exports = 'prop-types'; + + +/***/ }) +/******/ ]); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/chunk loaded */ +/******/ (() => { +/******/ var deferred = []; +/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => { +/******/ if(chunkIds) { +/******/ priority = priority || 0; +/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1]; +/******/ deferred[i] = [chunkIds, fn, priority]; +/******/ return; +/******/ } +/******/ var notFulfilled = Infinity; +/******/ for (var i = 0; i < deferred.length; i++) { +/******/ var [chunkIds, fn, priority] = deferred[i]; +/******/ var fulfilled = true; +/******/ for (var j = 0; j < chunkIds.length; j++) { +/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) { +/******/ chunkIds.splice(j--, 1); +/******/ } else { +/******/ fulfilled = false; +/******/ if(priority < notFulfilled) notFulfilled = priority; +/******/ } +/******/ } +/******/ if(fulfilled) { +/******/ deferred.splice(i--, 1) +/******/ var r = fn(); +/******/ if (r !== undefined) result = r; +/******/ } +/******/ } +/******/ return result; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "react-vendors": 0 +/******/ }; +/******/ +/******/ // no chunk on demand loading +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0); +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); +/******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ return __webpack_require__.O(result); +/******/ } +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ +/************************************************************************/ +``` + +
+ +``` js +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module is referenced by other modules so it can't be inlined +/******/ __webpack_require__(0); +/******/ __webpack_require__(1); +/******/ var __webpack_exports__ = __webpack_require__(2); +/******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__); +/******/ +/******/ })() +; +``` + +# Info + +## Unoptimized + +``` +asset react-vendors.js 7.62 KiB [emitted] (name: react-vendors) +asset app.js 1.63 KiB [emitted] (name: app) +chunk (runtime: react-vendors) app.js (app) 139 bytes <{react-vendors}> [initial] [rendered] + > ./app.js app + ./app.js 139 bytes [built] [code generated] + [no exports] + [used exports unknown] + entry ./app.js app +chunk (runtime: react-vendors) react-vendors.js (react-vendors) 87 bytes (javascript) 3.29 KiB (runtime) >{app}< [entry] [rendered] + > prop-types react-vendors + > react react-vendors + > react-dom react-vendors + runtime modules 3.29 KiB 6 modules + cacheable modules 87 bytes + ./node_modules/prop-types.js 31 bytes [built] [code generated] + [used exports unknown] + from origin ./app.js + harmony side effect evaluation prop-types ./app.js 3:0-35 + harmony import specifier prop-types ./app.js 5:29-38 + cjs self exports reference ./node_modules/prop-types.js 1:0-14 + entry prop-types react-vendors + ./node_modules/react-dom.js 30 bytes [built] [code generated] + [used exports unknown] + from origin ./app.js + harmony side effect evaluation react-dom ./app.js 2:0-33 + harmony import specifier react-dom ./app.js 5:19-27 + cjs self exports reference ./node_modules/react-dom.js 1:0-14 + entry react-dom react-vendors + ./node_modules/react.js 26 bytes [built] [code generated] + [used exports unknown] + from origin ./app.js + harmony side effect evaluation react ./app.js 1:0-26 + harmony import specifier react ./app.js 5:12-17 + cjs self exports reference ./node_modules/react.js 1:0-14 + entry react react-vendors +webpack X.X.X compiled successfully +``` + +## Production mode + +``` +asset react-vendors.js 1.15 KiB [emitted] [minimized] (name: react-vendors) +asset app.js 187 bytes [emitted] [minimized] (name: app) +chunk (runtime: react-vendors) app.js (app) 139 bytes <{react-vendors}> [initial] [rendered] + > ./app.js app + ./app.js 139 bytes [built] [code generated] + [no exports] + [no exports used] + entry ./app.js app +chunk (runtime: react-vendors) react-vendors.js (react-vendors) 87 bytes (javascript) 3.03 KiB (runtime) >{app}< [entry] [rendered] + > prop-types react-vendors + > react react-vendors + > react-dom react-vendors + runtime modules 3.03 KiB 5 modules + cacheable modules 87 bytes + ./node_modules/prop-types.js 31 bytes [built] [code generated] + [used exports unknown] + from origin ./app.js + harmony side effect evaluation prop-types ./app.js 3:0-35 + harmony import specifier prop-types ./app.js 5:29-38 + cjs self exports reference ./node_modules/prop-types.js 1:0-14 + entry prop-types react-vendors + ./node_modules/react-dom.js 30 bytes [built] [code generated] + [used exports unknown] + from origin ./app.js + harmony side effect evaluation react-dom ./app.js 2:0-33 + harmony import specifier react-dom ./app.js 5:19-27 + cjs self exports reference ./node_modules/react-dom.js 1:0-14 + entry react-dom react-vendors + ./node_modules/react.js 26 bytes [built] [code generated] + [used exports unknown] + from origin ./app.js + harmony side effect evaluation react ./app.js 1:0-26 + harmony import specifier react ./app.js 5:12-17 + cjs self exports reference ./node_modules/react.js 1:0-14 + entry react react-vendors +webpack X.X.X compiled successfully +``` diff --git a/examples/code-splitting-depend-on-simple/app.js b/examples/code-splitting-depend-on-simple/app.js new file mode 100644 index 00000000000..0249287abe5 --- /dev/null +++ b/examples/code-splitting-depend-on-simple/app.js @@ -0,0 +1,5 @@ +import react from "react"; +import reactDOM from "react-dom"; +import propTypes from "prop-types"; + +console.log(react, reactDOM, propTypes); diff --git a/examples/code-splitting-depend-on-simple/build.js b/examples/code-splitting-depend-on-simple/build.js new file mode 100644 index 00000000000..39292a5b712 --- /dev/null +++ b/examples/code-splitting-depend-on-simple/build.js @@ -0,0 +1,2 @@ +global.NO_TARGET_ARGS = true; +require("../build-common"); \ No newline at end of file diff --git a/examples/code-splitting-depend-on-simple/node_modules/prop-types.js b/examples/code-splitting-depend-on-simple/node_modules/prop-types.js new file mode 100644 index 00000000000..9c6971329ce --- /dev/null +++ b/examples/code-splitting-depend-on-simple/node_modules/prop-types.js @@ -0,0 +1 @@ +module.exports = 'prop-types'; diff --git a/examples/code-splitting-depend-on-simple/node_modules/react-dom.js b/examples/code-splitting-depend-on-simple/node_modules/react-dom.js new file mode 100644 index 00000000000..d2f4c643e28 --- /dev/null +++ b/examples/code-splitting-depend-on-simple/node_modules/react-dom.js @@ -0,0 +1 @@ +module.exports = 'react-dom'; diff --git a/examples/code-splitting-depend-on-simple/node_modules/react.js b/examples/code-splitting-depend-on-simple/node_modules/react.js new file mode 100644 index 00000000000..11c0b89c737 --- /dev/null +++ b/examples/code-splitting-depend-on-simple/node_modules/react.js @@ -0,0 +1 @@ +module.exports = 'react'; diff --git a/examples/code-splitting-depend-on-simple/template.md b/examples/code-splitting-depend-on-simple/template.md new file mode 100644 index 00000000000..c89cef9b070 --- /dev/null +++ b/examples/code-splitting-depend-on-simple/template.md @@ -0,0 +1,39 @@ +This example shows how to use Code Splitting with entrypoint dependOn + +# webpack.config.js + +```javascript +_{{webpack.config.js}}_ +``` + +# app.js + +```javascript +_{{app.js}}_ +``` + +# dist/app.js + +```javascript +_{{dist/app.js}}_ +``` + +# dist/react-vendors.js + +```javascript +_{{dist/react-vendors.js}}_ +``` + +# Info + +## Unoptimized + +``` +_{{stdout}}_ +``` + +## Production mode + +``` +_{{production:stdout}}_ +``` diff --git a/examples/code-splitting-depend-on-simple/webpack.config.js b/examples/code-splitting-depend-on-simple/webpack.config.js new file mode 100644 index 00000000000..1fd0ca0d2c9 --- /dev/null +++ b/examples/code-splitting-depend-on-simple/webpack.config.js @@ -0,0 +1,13 @@ +module.exports = { + entry: { + app: { import: "./app.js", dependOn: ["react-vendors"] }, + "react-vendors": ["react", "react-dom", "prop-types"] + }, + optimization: { + chunkIds: "named" // To keep filename consistent between different modes (for example building only) + }, + stats: { + chunks: true, + chunkRelations: true + } +}; diff --git a/examples/code-splitting-harmony/README.md b/examples/code-splitting-harmony/README.md index b54578b5f16..064b72870b4 100644 --- a/examples/code-splitting-harmony/README.md +++ b/examples/code-splitting-harmony/README.md @@ -2,13 +2,13 @@ This example show how to use Code Splitting with the ES6 module syntax. The standard `import` is sync. -`import(module: string) -> Promise` can be used to load modules on demand. This acts as split point for webpack and creates a chunk. +`import(module: string) -> Promise` can be used to load modules on demand. This acts as a split point for webpack and creates a chunk. Providing dynamic expressions to `import` is possible. The same limits as with dynamic expressions in `require` calls apply here. Each possible module creates an additional chunk. In this example `import("c/" + name)` creates two additional chunks (one for each file in `node_modules/c/`). This is called "async context". # example.js -``` javascript +```javascript import a from "a"; import("b").then(function(b) { @@ -24,367 +24,448 @@ Promise.all([loadC("1"), loadC("2")]).then(function(arr) { }); ``` - # dist/output.js -
/******/ (function(modules) { /* webpackBootstrap */ }) +```javascript +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */ +/*!***************************!*\ + !*** ./node_modules/a.js ***! + \***************************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: */ +/***/ (() => { -``` javascript -/******/ (function(modules) { // webpackBootstrap -/******/ // install a JSONP callback for chunk loading -/******/ function webpackJsonpCallback(data) { -/******/ var chunkIds = data[0]; -/******/ var moreModules = data[1]; -/******/ -/******/ -/******/ // add "moreModules" to the modules object, -/******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0, resolves = []; -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(installedChunks[chunkId]) { -/******/ resolves.push(installedChunks[chunkId][0]); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } -/******/ for(moduleId in moreModules) { -/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { -/******/ modules[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(parentJsonpFunction) parentJsonpFunction(data); -/******/ -/******/ while(resolves.length) { -/******/ resolves.shift()(); -/******/ } -/******/ -/******/ }; -/******/ -/******/ +// module a + +/***/ }), +/* 2 */ +/*!********************************************************!*\ + !*** ./node_modules/c/ lazy ^\.\/.*$ namespace object ***! + \********************************************************/ +/*! default exports */ +/*! exports [not provided] [no usage info] */ +/*! runtime requirements: module, __webpack_require__.o, __webpack_require__, __webpack_require__.e, __webpack_require__.t, __webpack_require__.* */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +var map = { + "./1": [ + 4, + 197 + ], + "./1.js": [ + 4, + 197 + ], + "./2": [ + 5, + 140 + ], + "./2.js": [ + 5, + 140 + ] +}; +function webpackAsyncContext(req) { + if(!__webpack_require__.o(map, req)) { + return Promise.resolve().then(() => { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + }); + } + + var ids = map[req], id = ids[0]; + return __webpack_require__.e(ids[1]).then(() => { + return __webpack_require__.t(id, 7 | 16); + }); +} +webpackAsyncContext.keys = () => (Object.keys(map)); +webpackAsyncContext.id = 2; +module.exports = webpackAsyncContext; + +/***/ }) +/******/ ]); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ /******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // Promise = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ 2: 0 -/******/ }; -/******/ -/******/ -/******/ -/******/ // script path function -/******/ function jsonpScriptSrc(chunkId) { -/******/ return __webpack_require__.p + "" + chunkId + ".output.js" -/******/ } -/******/ +/******/ var __webpack_module_cache__ = {}; +/******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { -/******/ /******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed /******/ exports: {} /******/ }; -/******/ +/******/ /******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } -/******/ -/******/ // This file contains only the entry chunk. -/******/ // The chunk loading function for additional chunks -/******/ __webpack_require__.e = function requireEnsure(chunkId) { -/******/ var promises = []; -/******/ -/******/ -/******/ // JSONP chunk loading for javascript -/******/ -/******/ var installedChunkData = installedChunks[chunkId]; -/******/ if(installedChunkData !== 0) { // 0 means "already installed". -/******/ -/******/ // a Promise means "currently loading". -/******/ if(installedChunkData) { -/******/ promises.push(installedChunkData[2]); -/******/ } else { -/******/ // setup Promise in chunk cache -/******/ var promise = new Promise(function(resolve, reject) { -/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject]; -/******/ }); -/******/ promises.push(installedChunkData[2] = promise); -/******/ -/******/ // start chunk loading -/******/ var script = document.createElement('script'); -/******/ var onScriptComplete; -/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/create fake namespace object */ +/******/ (() => { +/******/ var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__); +/******/ var leafPrototypes; +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 16: return value when it's Promise-like +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = this(value); +/******/ if(mode & 8) return value; +/******/ if(typeof value === 'object' && value) { +/******/ if((mode & 4) && value.__esModule) return value; +/******/ if((mode & 16) && typeof value.then === 'function') return value; +/******/ } +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ var def = {}; +/******/ leafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)]; +/******/ for(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) { +/******/ Object.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key]))); +/******/ } +/******/ def['default'] = () => (value); +/******/ __webpack_require__.d(ns, def); +/******/ return ns; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".output.js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ // data-webpack is not used as build has no uniqueName +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ /******/ script.charset = 'utf-8'; /******/ script.timeout = 120; /******/ if (__webpack_require__.nc) { /******/ script.setAttribute("nonce", __webpack_require__.nc); /******/ } -/******/ script.src = jsonpScriptSrc(chunkId); -/******/ -/******/ onScriptComplete = function (event) { -/******/ // avoid mem leaks in IE. -/******/ script.onerror = script.onload = null; -/******/ clearTimeout(timeout); -/******/ var chunk = installedChunks[chunkId]; -/******/ if(chunk !== 0) { -/******/ if(chunk) { -/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); -/******/ var realSrc = event && event.target && event.target.src; -/******/ var error = new Error('Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'); -/******/ error.type = errorType; -/******/ error.request = realSrc; -/******/ chunk[1](error); +/******/ +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "dist/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ 792: 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // JSONP chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if(true) { // all chunks have JS +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ installedChunkData[1](error); +/******/ } +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); /******/ } -/******/ installedChunks[chunkId] = undefined; /******/ } -/******/ }; -/******/ var timeout = setTimeout(function(){ -/******/ onScriptComplete({ type: 'timeout', target: script }); -/******/ }, 120000); -/******/ script.onerror = script.onload = onScriptComplete; -/******/ document.head.appendChild(script); +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ // no on chunks loaded +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); /******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ /******/ } -/******/ return Promise.all(promises); -/******/ }; -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ // on error function for async loading -/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; -/******/ -/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; -/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); -/******/ jsonpArray.push = webpackJsonpCallback; -/******/ jsonpArray = jsonpArray.slice(); -/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); -/******/ var parentJsonpFunction = oldJsonpFunction; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 2); -/******/ }) +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ /************************************************************************/ ```
-``` javascript -/******/ ([ -/* 0 */, -/* 1 */, -/* 2 */ +``` js +var __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be in strict mode. +(() => { +"use strict"; /*!********************!*\ !*** ./example.js ***! \********************/ -/*! no exports provided */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; +/*! namespace exports */ +/*! exports [not provided] [no usage info] */ +/*! runtime requirements: __webpack_require__, __webpack_require__.n, __webpack_require__.r, __webpack_exports__, __webpack_require__.e, __webpack_require__.t, __webpack_require__.* */ __webpack_require__.r(__webpack_exports__); -/* harmony import */ var a__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! a */ 3); +/* harmony import */ var a__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! a */ 1); /* harmony import */ var a__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(a__WEBPACK_IMPORTED_MODULE_0__); -__webpack_require__.e(/*! import() */ 3).then(__webpack_require__.t.bind(null, /*! b */ 5, 7)).then(function(b) { +__webpack_require__.e(/*! import() */ 414).then(__webpack_require__.t.bind(__webpack_require__, /*! b */ 3, 23)).then(function(b) { console.log("b loaded", b); }) function loadC(name) { - return __webpack_require__(4)("./" + name); + return __webpack_require__(2)("./" + name); } Promise.all([loadC("1"), loadC("2")]).then(function(arr) { console.log("c/1 and c/2 loaded", arr); }); +})(); -/***/ }), -/* 3 */ -/*!***************************!*\ - !*** ./node_modules/a.js ***! - \***************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -// module a - -/***/ }), -/* 4 */ -/*!*******************************************************!*\ - !*** ./node_modules/c lazy ^\.\/.*$ namespace object ***! - \*******************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var map = { - "./1": [ - 0, - 0 - ], - "./1.js": [ - 0, - 0 - ], - "./2": [ - 1, - 1 - ], - "./2.js": [ - 1, - 1 - ] -}; -function webpackAsyncContext(req) { - var ids = map[req]; - if(!ids) { - return Promise.resolve().then(function() { - var e = new Error("Cannot find module '" + req + "'"); - e.code = 'MODULE_NOT_FOUND'; - throw e; - }); - } - return __webpack_require__.e(ids[1]).then(function() { - var id = ids[0]; - return __webpack_require__.t(id, 7); - }); -} -webpackAsyncContext.keys = function webpackAsyncContextKeys() { - return Object.keys(map); -}; -webpackAsyncContext.id = 4; -module.exports = webpackAsyncContext; - -/***/ }) -/******/ ]); +/******/ })() +; ``` - # Info ## Unoptimized ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -0.output.js 275 bytes 0 [emitted] -1.output.js 284 bytes 1 [emitted] -3.output.js 270 bytes 3 [emitted] - output.js 9.7 KiB 2 [emitted] main -Entrypoint main = output.js -chunk {0} 0.output.js 13 bytes <{2}> [rendered] - > ./1 [4] ./node_modules/c lazy ^\.\/.*$ namespace object ./1 - > ./1.js [4] ./node_modules/c lazy ^\.\/.*$ namespace object ./1.js - 1 module -chunk {1} 1.output.js 13 bytes <{2}> [rendered] - > ./2 [4] ./node_modules/c lazy ^\.\/.*$ namespace object ./2 - > ./2.js [4] ./node_modules/c lazy ^\.\/.*$ namespace object ./2.js - 1 module -chunk {2} output.js (main) 414 bytes >{0}< >{1}< >{3}< [entry] [rendered] - > ./example.js main - [2] ./example.js 243 bytes {2} [built] - [no exports] - single entry ./example.js main - [4] ./node_modules/c lazy ^\.\/.*$ namespace object 160 bytes {2} [built] - import() context lazy c [2] ./example.js 8:8-27 - + 1 hidden module -chunk {3} 3.output.js 11 bytes <{2}> [rendered] - > b [2] ./example.js 3:0-11 - 1 module +asset output.js 13.6 KiB [emitted] (name: main) +asset 140.output.js 296 bytes [emitted] +asset 197.output.js 296 bytes [emitted] +asset 414.output.js 288 bytes [emitted] +chunk (runtime: main) 140.output.js 13 bytes [rendered] + > ./2 ./node_modules/c/ lazy ^\.\/.*$ namespace object ./2 + > ./2.js ./node_modules/c/ lazy ^\.\/.*$ namespace object ./2.js + ./node_modules/c/2.js 13 bytes [optional] [built] [code generated] + [used exports unknown] + import() context element ./2 ./node_modules/c/ lazy ^\.\/.*$ namespace object ./2 + import() context element ./2.js ./node_modules/c/ lazy ^\.\/.*$ namespace object ./2.js +chunk (runtime: main) 197.output.js 13 bytes [rendered] + > ./1 ./node_modules/c/ lazy ^\.\/.*$ namespace object ./1 + > ./1.js ./node_modules/c/ lazy ^\.\/.*$ namespace object ./1.js + ./node_modules/c/1.js 13 bytes [optional] [built] [code generated] + [used exports unknown] + import() context element ./1 ./node_modules/c/ lazy ^\.\/.*$ namespace object ./1 + import() context element ./1.js ./node_modules/c/ lazy ^\.\/.*$ namespace object ./1.js +chunk (runtime: main) 414.output.js 11 bytes [rendered] + > b ./example.js 3:0-11 + ./node_modules/b.js 11 bytes [built] [code generated] + [used exports unknown] + import() b ./example.js 3:0-11 +chunk (runtime: main) output.js (main) 414 bytes (javascript) 6.88 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 6.88 KiB 10 modules + dependent modules 171 bytes [dependent] 2 modules + ./example.js 243 bytes [built] [code generated] + [no exports] + [used exports unknown] + entry ./example.js main +webpack X.X.X compiled successfully ``` ## Production mode ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -0.output.js 76 bytes 0 [emitted] -1.output.js 77 bytes 1 [emitted] -3.output.js 78 bytes 3 [emitted] - output.js 2.52 KiB 2 [emitted] main -Entrypoint main = output.js -chunk {0} 0.output.js 13 bytes <{2}> [rendered] - > ./1 [4] ./node_modules/c lazy ^\.\/.*$ namespace object ./1 - > ./1.js [4] ./node_modules/c lazy ^\.\/.*$ namespace object ./1.js - 1 module -chunk {1} 1.output.js 13 bytes <{2}> [rendered] - > ./2 [4] ./node_modules/c lazy ^\.\/.*$ namespace object ./2 - > ./2.js [4] ./node_modules/c lazy ^\.\/.*$ namespace object ./2.js - 1 module -chunk {2} output.js (main) 414 bytes >{0}< >{1}< >{3}< [entry] [rendered] - > ./example.js main - [2] ./example.js 243 bytes {2} [built] - [no exports] - single entry ./example.js main - [4] ./node_modules/c lazy ^\.\/.*$ namespace object 160 bytes {2} [built] - import() context lazy c [2] ./example.js 8:8-27 - + 1 hidden module -chunk {3} 3.output.js 11 bytes <{2}> [rendered] - > b [2] ./example.js 3:0-11 - 1 module +asset output.js 2.89 KiB [emitted] [minimized] (name: main) +asset 140.output.js 69 bytes [emitted] [minimized] +asset 197.output.js 69 bytes [emitted] [minimized] +asset 414.output.js 69 bytes [emitted] [minimized] +chunk (runtime: main) 140.output.js 13 bytes [rendered] + > ./2 ./node_modules/c/ lazy ^\.\/.*$ namespace object ./2 + > ./2.js ./node_modules/c/ lazy ^\.\/.*$ namespace object ./2.js + ./node_modules/c/2.js 13 bytes [optional] [built] [code generated] + [used exports unknown] + import() context element ./2 ./node_modules/c/ lazy ^\.\/.*$ namespace object ./2 + import() context element ./2.js ./node_modules/c/ lazy ^\.\/.*$ namespace object ./2.js +chunk (runtime: main) 197.output.js 13 bytes [rendered] + > ./1 ./node_modules/c/ lazy ^\.\/.*$ namespace object ./1 + > ./1.js ./node_modules/c/ lazy ^\.\/.*$ namespace object ./1.js + ./node_modules/c/1.js 13 bytes [optional] [built] [code generated] + [used exports unknown] + import() context element ./1 ./node_modules/c/ lazy ^\.\/.*$ namespace object ./1 + import() context element ./1.js ./node_modules/c/ lazy ^\.\/.*$ namespace object ./1.js +chunk (runtime: main) 414.output.js 11 bytes [rendered] + > b ./example.js 3:0-11 + ./node_modules/b.js 11 bytes [built] [code generated] + [used exports unknown] + import() b ./example.js 3:0-11 +chunk (runtime: main) output.js (main) 403 bytes (javascript) 6.62 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 6.62 KiB 9 modules + dependent modules 160 bytes [dependent] 1 module + ./example.js 243 bytes [built] [code generated] + [no exports] + [no exports used] + entry ./example.js main +webpack X.X.X compiled successfully ``` diff --git a/examples/code-splitting-harmony/template.md b/examples/code-splitting-harmony/template.md index 5f6a68cdf3b..3f47ddca765 100644 --- a/examples/code-splitting-harmony/template.md +++ b/examples/code-splitting-harmony/template.md @@ -2,34 +2,32 @@ This example show how to use Code Splitting with the ES6 module syntax. The standard `import` is sync. -`import(module: string) -> Promise` can be used to load modules on demand. This acts as split point for webpack and creates a chunk. +`import(module: string) -> Promise` can be used to load modules on demand. This acts as a split point for webpack and creates a chunk. Providing dynamic expressions to `import` is possible. The same limits as with dynamic expressions in `require` calls apply here. Each possible module creates an additional chunk. In this example `import("c/" + name)` creates two additional chunks (one for each file in `node_modules/c/`). This is called "async context". # example.js -``` javascript -{{example.js}} +```javascript +_{{example.js}}_ ``` - # dist/output.js -``` javascript -{{dist/output.js}} +```javascript +_{{dist/output.js}}_ ``` - # Info ## Unoptimized ``` -{{stdout}} +_{{stdout}}_ ``` ## Production mode ``` -{{production:stdout}} +_{{production:stdout}}_ ``` diff --git a/examples/code-splitting-harmony/webpack.config.js b/examples/code-splitting-harmony/webpack.config.js index 0d554bf62ea..2ad01d570d6 100644 --- a/examples/code-splitting-harmony/webpack.config.js +++ b/examples/code-splitting-harmony/webpack.config.js @@ -1,5 +1,5 @@ module.exports = { optimization: { - occurrenceOrder: true // To keep filename consistent between different modes (for example building only) + chunkIds: "deterministic" // To keep filename consistent between different modes (for example building only) } }; diff --git a/examples/code-splitting-native-import-context-filter/README.md b/examples/code-splitting-native-import-context-filter/README.md index 435862c9130..e5f1c32cb49 100644 --- a/examples/code-splitting-native-import-context-filter/README.md +++ b/examples/code-splitting-native-import-context-filter/README.md @@ -1,9 +1,9 @@ # example.js -This example illustrates how to filter the ContextModule results of `import()` statements. only `.js` files that don't +This example illustrates how to filter the ContextModule results of `import()` statements. Only `.js` files that don't end in `.noimport.js` within the `templates` folder will be bundled. -``` javascript +```javascript async function getTemplate(templateName) { try { let template = await import( @@ -28,16 +28,16 @@ getTemplate("baz.noimport"); # templates/ -* foo.js -* foo.noimport.js -* baz.js -* foo.noimport.js -* bar.js -* foo.noimport.js +- foo.js +- foo.noimport.js +- baz.js +- foo.noimport.js +- bar.js +- foo.noimport.js All templates are of this pattern: -``` javascript +```javascript var foo = "foo"; export default foo; @@ -45,226 +45,307 @@ export default foo; # dist/output.js -
/******/ (function(modules) { /* webpackBootstrap */ }) +```javascript +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */ +/*!*******************************************************************************************!*\ + !*** ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ***! + \*******************************************************************************************/ +/*! default exports */ +/*! exports [not provided] [no usage info] */ +/*! runtime requirements: module, __webpack_require__.o, __webpack_require__, __webpack_require__.e, __webpack_require__.* */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { -``` javascript -/******/ (function(modules) { // webpackBootstrap -/******/ // install a JSONP callback for chunk loading -/******/ function webpackJsonpCallback(data) { -/******/ var chunkIds = data[0]; -/******/ var moreModules = data[1]; -/******/ -/******/ -/******/ // add "moreModules" to the modules object, -/******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0, resolves = []; -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(installedChunks[chunkId]) { -/******/ resolves.push(installedChunks[chunkId][0]); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } -/******/ for(moduleId in moreModules) { -/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { -/******/ modules[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(parentJsonpFunction) parentJsonpFunction(data); -/******/ -/******/ while(resolves.length) { -/******/ resolves.shift()(); -/******/ } -/******/ -/******/ }; -/******/ -/******/ +var map = { + "./bar": [ + 2, + 776 + ], + "./bar.js": [ + 2, + 776 + ], + "./baz": [ + 3, + 0 + ], + "./baz.js": [ + 3, + 0 + ], + "./foo": [ + 4, + 717 + ], + "./foo.js": [ + 4, + 717 + ] +}; +function webpackAsyncContext(req) { + if(!__webpack_require__.o(map, req)) { + return Promise.resolve().then(() => { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + }); + } + + var ids = map[req], id = ids[0]; + return __webpack_require__.e(ids[1]).then(() => { + return __webpack_require__(id); + }); +} +webpackAsyncContext.keys = () => (Object.keys(map)); +webpackAsyncContext.id = 1; +module.exports = webpackAsyncContext; + +/***/ }) +/******/ ]); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ /******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // Promise = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ 3: 0 -/******/ }; -/******/ -/******/ -/******/ -/******/ // script path function -/******/ function jsonpScriptSrc(chunkId) { -/******/ return __webpack_require__.p + "" + chunkId + ".output.js" -/******/ } -/******/ +/******/ var __webpack_module_cache__ = {}; +/******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { -/******/ /******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed /******/ exports: {} /******/ }; -/******/ +/******/ /******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } -/******/ -/******/ // This file contains only the entry chunk. -/******/ // The chunk loading function for additional chunks -/******/ __webpack_require__.e = function requireEnsure(chunkId) { -/******/ var promises = []; -/******/ -/******/ -/******/ // JSONP chunk loading for javascript -/******/ -/******/ var installedChunkData = installedChunks[chunkId]; -/******/ if(installedChunkData !== 0) { // 0 means "already installed". -/******/ -/******/ // a Promise means "currently loading". -/******/ if(installedChunkData) { -/******/ promises.push(installedChunkData[2]); -/******/ } else { -/******/ // setup Promise in chunk cache -/******/ var promise = new Promise(function(resolve, reject) { -/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject]; -/******/ }); -/******/ promises.push(installedChunkData[2] = promise); -/******/ -/******/ // start chunk loading -/******/ var script = document.createElement('script'); -/******/ var onScriptComplete; -/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".output.js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ // data-webpack is not used as build has no uniqueName +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ /******/ script.charset = 'utf-8'; /******/ script.timeout = 120; /******/ if (__webpack_require__.nc) { /******/ script.setAttribute("nonce", __webpack_require__.nc); /******/ } -/******/ script.src = jsonpScriptSrc(chunkId); -/******/ -/******/ onScriptComplete = function (event) { -/******/ // avoid mem leaks in IE. -/******/ script.onerror = script.onload = null; -/******/ clearTimeout(timeout); -/******/ var chunk = installedChunks[chunkId]; -/******/ if(chunk !== 0) { -/******/ if(chunk) { -/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); -/******/ var realSrc = event && event.target && event.target.src; -/******/ var error = new Error('Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'); -/******/ error.type = errorType; -/******/ error.request = realSrc; -/******/ chunk[1](error); +/******/ +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "dist/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ 792: 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // JSONP chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if(true) { // all chunks have JS +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ installedChunkData[1](error); +/******/ } +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); /******/ } -/******/ installedChunks[chunkId] = undefined; /******/ } -/******/ }; -/******/ var timeout = setTimeout(function(){ -/******/ onScriptComplete({ type: 'timeout', target: script }); -/******/ }, 120000); -/******/ script.onerror = script.onload = onScriptComplete; -/******/ document.head.appendChild(script); +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ // no on chunks loaded +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); /******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ /******/ } -/******/ return Promise.all(promises); -/******/ }; -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ // on error function for async loading -/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; -/******/ -/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; -/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); -/******/ jsonpArray.push = webpackJsonpCallback; -/******/ jsonpArray = jsonpArray.slice(); -/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); -/******/ var parentJsonpFunction = oldJsonpFunction; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 3); -/******/ }) +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ /************************************************************************/ ```
-``` javascript -/******/ ([ -/* 0 */, -/* 1 */, -/* 2 */, -/* 3 */ +``` js +var __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { /*!********************!*\ !*** ./example.js ***! \********************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: __webpack_require__ */ async function getTemplate(templateName) { try { - let template = await __webpack_require__(4)(`./${templateName}`); + let template = await __webpack_require__(1)(`./${templateName}`); console.log(template); } catch(err) { console.error(err); @@ -280,63 +361,10 @@ getTemplate("bar.noimport"); getTemplate("baz.noimport"); +})(); -/***/ }), -/* 4 */ -/*!******************************************************************************************!*\ - !*** ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ***! - \******************************************************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var map = { - "./bar": [ - 0, - 0 - ], - "./bar.js": [ - 0, - 0 - ], - "./baz": [ - 1, - 1 - ], - "./baz.js": [ - 1, - 1 - ], - "./foo": [ - 2, - 2 - ], - "./foo.js": [ - 2, - 2 - ] -}; -function webpackAsyncContext(req) { - var ids = map[req]; - if(!ids) { - return Promise.resolve().then(function() { - var e = new Error("Cannot find module '" + req + "'"); - e.code = 'MODULE_NOT_FOUND'; - throw e; - }); - } - return __webpack_require__.e(ids[1]).then(function() { - var id = ids[0]; - return __webpack_require__(id); - }); -} -webpackAsyncContext.keys = function webpackAsyncContextKeys() { - return Object.keys(map); -}; -webpackAsyncContext.id = 4; -module.exports = webpackAsyncContext; - -/***/ }) -/******/ ]); +/******/ })() +; ``` # Info @@ -344,79 +372,78 @@ module.exports = webpackAsyncContext; ## Unoptimized ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -0.output.js 433 bytes 0 [emitted] -1.output.js 442 bytes 1 [emitted] -2.output.js 436 bytes 2 [emitted] - output.js 9.43 KiB 3 [emitted] main -Entrypoint main = output.js -chunk {0} 0.output.js 38 bytes <{3}> [rendered] - > ./bar [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./bar - > ./bar.js [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./bar.js - [0] ./templates/bar.js 38 bytes {0} [optional] [built] - [exports: default] - context element ./bar [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./bar - context element ./bar.js [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./bar.js -chunk {1} 1.output.js 38 bytes <{3}> [rendered] - > ./baz [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./baz - > ./baz.js [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./baz.js - [1] ./templates/baz.js 38 bytes {1} [optional] [built] - [exports: default] - context element ./baz [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./baz - context element ./baz.js [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./baz.js -chunk {2} 2.output.js 38 bytes <{3}> [rendered] - > ./foo [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./foo - > ./foo.js [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./foo.js - [2] ./templates/foo.js 38 bytes {2} [optional] [built] - [exports: default] - context element ./foo [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./foo - context element ./foo.js [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./foo.js -chunk {3} output.js (main) 597 bytes >{0}< >{1}< >{2}< [entry] [rendered] - > ./example.js main - [3] ./example.js 437 bytes {3} [built] - single entry ./example.js main - [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object 160 bytes {3} [optional] [built] - import() context lazy ./templates [3] ./example.js 3:23-7:3 +asset output.js 11.2 KiB [emitted] (name: main) +asset 717.output.js 858 bytes [emitted] +asset 776.output.js 858 bytes [emitted] +asset 0.output.js 856 bytes [emitted] +chunk (runtime: main) 0.output.js 38 bytes [rendered] + > ./baz ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./baz + > ./baz.js ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./baz.js + ./templates/baz.js 38 bytes [optional] [built] [code generated] + [exports: default] + [used exports unknown] + import() context element ./baz ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./baz + import() context element ./baz.js ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./baz.js +chunk (runtime: main) 717.output.js 38 bytes [rendered] + > ./foo ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./foo + > ./foo.js ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./foo.js + ./templates/foo.js 38 bytes [optional] [built] [code generated] + [exports: default] + [used exports unknown] + import() context element ./foo ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./foo + import() context element ./foo.js ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./foo.js +chunk (runtime: main) 776.output.js 38 bytes [rendered] + > ./bar ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./bar + > ./bar.js ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./bar.js + ./templates/bar.js 38 bytes [optional] [built] [code generated] + [exports: default] + [used exports unknown] + import() context element ./bar ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./bar + import() context element ./bar.js ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./bar.js +chunk (runtime: main) output.js (main) 597 bytes (javascript) 5.5 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 5.5 KiB 8 modules + dependent modules 160 bytes [dependent] 1 module + ./example.js 437 bytes [built] [code generated] + [used exports unknown] + entry ./example.js main +webpack X.X.X compiled successfully ``` ## Production mode ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -0.output.js 113 bytes 0 [emitted] -1.output.js 114 bytes 1 [emitted] -2.output.js 115 bytes 2 [emitted] - output.js 2.51 KiB 3 [emitted] main -Entrypoint main = output.js -chunk {0} 0.output.js 38 bytes <{3}> [rendered] - > ./bar [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./bar - > ./bar.js [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./bar.js - [0] ./templates/bar.js 38 bytes {0} [optional] [built] - [exports: default] - context element ./bar [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./bar - context element ./bar.js [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./bar.js -chunk {1} 1.output.js 38 bytes <{3}> [rendered] - > ./baz [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./baz - > ./baz.js [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./baz.js - [1] ./templates/baz.js 38 bytes {1} [optional] [built] - [exports: default] - context element ./baz [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./baz - context element ./baz.js [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./baz.js -chunk {2} 2.output.js 38 bytes <{3}> [rendered] - > ./foo [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./foo - > ./foo.js [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./foo.js - [2] ./templates/foo.js 38 bytes {2} [optional] [built] - [exports: default] - context element ./foo [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./foo - context element ./foo.js [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./foo.js -chunk {3} output.js (main) 597 bytes >{0}< >{1}< >{2}< [entry] [rendered] - > ./example.js main - [3] ./example.js 437 bytes {3} [built] - single entry ./example.js main - [4] ./templates lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object 160 bytes {3} [optional] [built] - import() context lazy ./templates [3] ./example.js 3:23-7:3 +asset output.js 2.46 KiB [emitted] [minimized] (name: main) +asset 717.output.js 130 bytes [emitted] [minimized] +asset 776.output.js 130 bytes [emitted] [minimized] +asset 0.output.js 124 bytes [emitted] [minimized] +chunk (runtime: main) 0.output.js 38 bytes [rendered] + > ./baz ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./baz + > ./baz.js ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./baz.js + ./templates/baz.js 38 bytes [optional] [built] [code generated] + [exports: default] + import() context element ./baz ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./baz + import() context element ./baz.js ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./baz.js +chunk (runtime: main) 717.output.js 38 bytes [rendered] + > ./foo ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./foo + > ./foo.js ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./foo.js + ./templates/foo.js 38 bytes [optional] [built] [code generated] + [exports: default] + import() context element ./foo ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./foo + import() context element ./foo.js ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./foo.js +chunk (runtime: main) 776.output.js 38 bytes [rendered] + > ./bar ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./bar + > ./bar.js ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./bar.js + ./templates/bar.js 38 bytes [optional] [built] [code generated] + [exports: default] + import() context element ./bar ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./bar + import() context element ./bar.js ./templates/ lazy ^\.\/.*$ include: \.js$ exclude: \.noimport\.js$ namespace object ./bar.js +chunk (runtime: main) output.js (main) 597 bytes (javascript) 5.5 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 5.5 KiB 8 modules + dependent modules 160 bytes [dependent] 1 module + ./example.js 437 bytes [built] [code generated] + [no exports used] + entry ./example.js main +webpack X.X.X compiled successfully ``` diff --git a/examples/code-splitting-native-import-context-filter/template.md b/examples/code-splitting-native-import-context-filter/template.md index 31fa2aeb04d..a4dd169ea27 100644 --- a/examples/code-splitting-native-import-context-filter/template.md +++ b/examples/code-splitting-native-import-context-filter/template.md @@ -1,31 +1,31 @@ # example.js -This example illustrates how to filter the ContextModule results of `import()` statements. only `.js` files that don't +This example illustrates how to filter the ContextModule results of `import()` statements. Only `.js` files that don't end in `.noimport.js` within the `templates` folder will be bundled. -``` javascript -{{example.js}} +```javascript +_{{example.js}}_ ``` # templates/ -* foo.js -* foo.noimport.js -* baz.js -* foo.noimport.js -* bar.js -* foo.noimport.js +- foo.js +- foo.noimport.js +- baz.js +- foo.noimport.js +- bar.js +- foo.noimport.js All templates are of this pattern: -``` javascript -{{templates/foo.js}} +```javascript +_{{templates/foo.js}}_ ``` # dist/output.js -``` javascript -{{dist/output.js}} +```javascript +_{{dist/output.js}}_ ``` # Info @@ -33,11 +33,11 @@ All templates are of this pattern: ## Unoptimized ``` -{{stdout}} +_{{stdout}}_ ``` ## Production mode ``` -{{production:stdout}} +_{{production:stdout}}_ ``` diff --git a/examples/code-splitting-native-import-context-filter/webpack.config.js b/examples/code-splitting-native-import-context-filter/webpack.config.js index 0d554bf62ea..2ad01d570d6 100644 --- a/examples/code-splitting-native-import-context-filter/webpack.config.js +++ b/examples/code-splitting-native-import-context-filter/webpack.config.js @@ -1,5 +1,5 @@ module.exports = { optimization: { - occurrenceOrder: true // To keep filename consistent between different modes (for example building only) + chunkIds: "deterministic" // To keep filename consistent between different modes (for example building only) } }; diff --git a/examples/code-splitting-native-import-context/README.md b/examples/code-splitting-native-import-context/README.md index 6c85b066336..aef36ecfff5 100644 --- a/examples/code-splitting-native-import-context/README.md +++ b/examples/code-splitting-native-import-context/README.md @@ -2,7 +2,7 @@ This example illustrates how to leverage the `import()` syntax to create ContextModules which are separated into separate chunks for each module in the `./templates` folder. -``` javascript +```javascript async function getTemplate(templateName) { try { let template = await import(`./templates/${templateName}`); @@ -20,13 +20,13 @@ getTemplate("baz"); # templates/ -* foo.js -* baz.js -* bar.js +- foo.js +- baz.js +- bar.js All templates are of this pattern: -``` javascript +```javascript var foo = "foo"; export default foo; @@ -34,226 +34,307 @@ export default foo; # dist/output.js -
/******/ (function(modules) { /* webpackBootstrap */ }) +```javascript +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */ +/*!***************************************************!*\ + !*** ./templates/ lazy ^\.\/.*$ namespace object ***! + \***************************************************/ +/*! default exports */ +/*! exports [not provided] [no usage info] */ +/*! runtime requirements: module, __webpack_require__.o, __webpack_require__, __webpack_require__.e, __webpack_require__.* */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { -``` javascript -/******/ (function(modules) { // webpackBootstrap -/******/ // install a JSONP callback for chunk loading -/******/ function webpackJsonpCallback(data) { -/******/ var chunkIds = data[0]; -/******/ var moreModules = data[1]; -/******/ -/******/ -/******/ // add "moreModules" to the modules object, -/******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0, resolves = []; -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(installedChunks[chunkId]) { -/******/ resolves.push(installedChunks[chunkId][0]); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } -/******/ for(moduleId in moreModules) { -/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { -/******/ modules[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(parentJsonpFunction) parentJsonpFunction(data); -/******/ -/******/ while(resolves.length) { -/******/ resolves.shift()(); -/******/ } -/******/ -/******/ }; -/******/ -/******/ +var map = { + "./bar": [ + 2, + 776 + ], + "./bar.js": [ + 2, + 776 + ], + "./baz": [ + 3, + 0 + ], + "./baz.js": [ + 3, + 0 + ], + "./foo": [ + 4, + 717 + ], + "./foo.js": [ + 4, + 717 + ] +}; +function webpackAsyncContext(req) { + if(!__webpack_require__.o(map, req)) { + return Promise.resolve().then(() => { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + }); + } + + var ids = map[req], id = ids[0]; + return __webpack_require__.e(ids[1]).then(() => { + return __webpack_require__(id); + }); +} +webpackAsyncContext.keys = () => (Object.keys(map)); +webpackAsyncContext.id = 1; +module.exports = webpackAsyncContext; + +/***/ }) +/******/ ]); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ /******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // Promise = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ 3: 0 -/******/ }; -/******/ -/******/ -/******/ -/******/ // script path function -/******/ function jsonpScriptSrc(chunkId) { -/******/ return __webpack_require__.p + "" + chunkId + ".output.js" -/******/ } -/******/ +/******/ var __webpack_module_cache__ = {}; +/******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { -/******/ /******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed /******/ exports: {} /******/ }; -/******/ +/******/ /******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } -/******/ -/******/ // This file contains only the entry chunk. -/******/ // The chunk loading function for additional chunks -/******/ __webpack_require__.e = function requireEnsure(chunkId) { -/******/ var promises = []; -/******/ -/******/ -/******/ // JSONP chunk loading for javascript -/******/ -/******/ var installedChunkData = installedChunks[chunkId]; -/******/ if(installedChunkData !== 0) { // 0 means "already installed". -/******/ -/******/ // a Promise means "currently loading". -/******/ if(installedChunkData) { -/******/ promises.push(installedChunkData[2]); -/******/ } else { -/******/ // setup Promise in chunk cache -/******/ var promise = new Promise(function(resolve, reject) { -/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject]; -/******/ }); -/******/ promises.push(installedChunkData[2] = promise); -/******/ -/******/ // start chunk loading -/******/ var script = document.createElement('script'); -/******/ var onScriptComplete; -/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".output.js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ // data-webpack is not used as build has no uniqueName +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ /******/ script.charset = 'utf-8'; /******/ script.timeout = 120; /******/ if (__webpack_require__.nc) { /******/ script.setAttribute("nonce", __webpack_require__.nc); /******/ } -/******/ script.src = jsonpScriptSrc(chunkId); -/******/ -/******/ onScriptComplete = function (event) { -/******/ // avoid mem leaks in IE. -/******/ script.onerror = script.onload = null; -/******/ clearTimeout(timeout); -/******/ var chunk = installedChunks[chunkId]; -/******/ if(chunk !== 0) { -/******/ if(chunk) { -/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); -/******/ var realSrc = event && event.target && event.target.src; -/******/ var error = new Error('Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'); -/******/ error.type = errorType; -/******/ error.request = realSrc; -/******/ chunk[1](error); +/******/ +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "dist/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ 792: 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // JSONP chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if(true) { // all chunks have JS +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ installedChunkData[1](error); +/******/ } +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); /******/ } -/******/ installedChunks[chunkId] = undefined; /******/ } -/******/ }; -/******/ var timeout = setTimeout(function(){ -/******/ onScriptComplete({ type: 'timeout', target: script }); -/******/ }, 120000); -/******/ script.onerror = script.onload = onScriptComplete; -/******/ document.head.appendChild(script); +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ // no on chunks loaded +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); /******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ /******/ } -/******/ return Promise.all(promises); -/******/ }; -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ // on error function for async loading -/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; -/******/ -/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; -/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); -/******/ jsonpArray.push = webpackJsonpCallback; -/******/ jsonpArray = jsonpArray.slice(); -/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); -/******/ var parentJsonpFunction = oldJsonpFunction; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 3); -/******/ }) +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ /************************************************************************/ ```
-``` javascript -/******/ ([ -/* 0 */, -/* 1 */, -/* 2 */, -/* 3 */ +``` js +var __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { /*!********************!*\ !*** ./example.js ***! \********************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: __webpack_require__ */ async function getTemplate(templateName) { try { - let template = await __webpack_require__(4)(`./${templateName}`); + let template = await __webpack_require__(1)(`./${templateName}`); console.log(template); } catch(err) { console.error("template error"); @@ -267,63 +348,10 @@ getTemplate("baz"); +})(); -/***/ }), -/* 4 */ -/*!**************************************************!*\ - !*** ./templates lazy ^\.\/.*$ namespace object ***! - \**************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var map = { - "./bar": [ - 0, - 0 - ], - "./bar.js": [ - 0, - 0 - ], - "./baz": [ - 1, - 1 - ], - "./baz.js": [ - 1, - 1 - ], - "./foo": [ - 2, - 2 - ], - "./foo.js": [ - 2, - 2 - ] -}; -function webpackAsyncContext(req) { - var ids = map[req]; - if(!ids) { - return Promise.resolve().then(function() { - var e = new Error("Cannot find module '" + req + "'"); - e.code = 'MODULE_NOT_FOUND'; - throw e; - }); - } - return __webpack_require__.e(ids[1]).then(function() { - var id = ids[0]; - return __webpack_require__(id); - }); -} -webpackAsyncContext.keys = function webpackAsyncContextKeys() { - return Object.keys(map); -}; -webpackAsyncContext.id = 4; -module.exports = webpackAsyncContext; - -/***/ }) -/******/ ]); +/******/ })() +; ``` # Info @@ -331,79 +359,78 @@ module.exports = webpackAsyncContext; ## Unoptimized ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -0.output.js 433 bytes 0 [emitted] -1.output.js 442 bytes 1 [emitted] -2.output.js 436 bytes 2 [emitted] - output.js 9.24 KiB 3 [emitted] main -Entrypoint main = output.js -chunk {0} 0.output.js 38 bytes <{3}> [rendered] - > ./bar [4] ./templates lazy ^\.\/.*$ namespace object ./bar - > ./bar.js [4] ./templates lazy ^\.\/.*$ namespace object ./bar.js - [0] ./templates/bar.js 38 bytes {0} [optional] [built] - [exports: default] - context element ./bar [4] ./templates lazy ^\.\/.*$ namespace object ./bar - context element ./bar.js [4] ./templates lazy ^\.\/.*$ namespace object ./bar.js -chunk {1} 1.output.js 38 bytes <{3}> [rendered] - > ./baz [4] ./templates lazy ^\.\/.*$ namespace object ./baz - > ./baz.js [4] ./templates lazy ^\.\/.*$ namespace object ./baz.js - [1] ./templates/baz.js 38 bytes {1} [optional] [built] - [exports: default] - context element ./baz [4] ./templates lazy ^\.\/.*$ namespace object ./baz - context element ./baz.js [4] ./templates lazy ^\.\/.*$ namespace object ./baz.js -chunk {2} 2.output.js 38 bytes <{3}> [rendered] - > ./foo [4] ./templates lazy ^\.\/.*$ namespace object ./foo - > ./foo.js [4] ./templates lazy ^\.\/.*$ namespace object ./foo.js - [2] ./templates/foo.js 38 bytes {2} [optional] [built] - [exports: default] - context element ./foo [4] ./templates lazy ^\.\/.*$ namespace object ./foo - context element ./foo.js [4] ./templates lazy ^\.\/.*$ namespace object ./foo.js -chunk {3} output.js (main) 441 bytes >{0}< >{1}< >{2}< [entry] [rendered] - > ./example.js main - [3] ./example.js 281 bytes {3} [built] - single entry ./example.js main - [4] ./templates lazy ^\.\/.*$ namespace object 160 bytes {3} [optional] [built] - import() context lazy ./templates [3] ./example.js 3:23-60 +asset output.js 11 KiB [emitted] (name: main) +asset 717.output.js 858 bytes [emitted] +asset 776.output.js 858 bytes [emitted] +asset 0.output.js 856 bytes [emitted] +chunk (runtime: main) 0.output.js 38 bytes [rendered] + > ./baz ./templates/ lazy ^\.\/.*$ namespace object ./baz + > ./baz.js ./templates/ lazy ^\.\/.*$ namespace object ./baz.js + ./templates/baz.js 38 bytes [optional] [built] [code generated] + [exports: default] + [used exports unknown] + import() context element ./baz ./templates/ lazy ^\.\/.*$ namespace object ./baz + import() context element ./baz.js ./templates/ lazy ^\.\/.*$ namespace object ./baz.js +chunk (runtime: main) 717.output.js 38 bytes [rendered] + > ./foo ./templates/ lazy ^\.\/.*$ namespace object ./foo + > ./foo.js ./templates/ lazy ^\.\/.*$ namespace object ./foo.js + ./templates/foo.js 38 bytes [optional] [built] [code generated] + [exports: default] + [used exports unknown] + import() context element ./foo ./templates/ lazy ^\.\/.*$ namespace object ./foo + import() context element ./foo.js ./templates/ lazy ^\.\/.*$ namespace object ./foo.js +chunk (runtime: main) 776.output.js 38 bytes [rendered] + > ./bar ./templates/ lazy ^\.\/.*$ namespace object ./bar + > ./bar.js ./templates/ lazy ^\.\/.*$ namespace object ./bar.js + ./templates/bar.js 38 bytes [optional] [built] [code generated] + [exports: default] + [used exports unknown] + import() context element ./bar ./templates/ lazy ^\.\/.*$ namespace object ./bar + import() context element ./bar.js ./templates/ lazy ^\.\/.*$ namespace object ./bar.js +chunk (runtime: main) output.js (main) 441 bytes (javascript) 5.5 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 5.5 KiB 8 modules + dependent modules 160 bytes [dependent] 1 module + ./example.js 281 bytes [built] [code generated] + [used exports unknown] + entry ./example.js main +webpack X.X.X compiled successfully ``` ## Production mode ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -0.output.js 113 bytes 0 [emitted] -1.output.js 114 bytes 1 [emitted] -2.output.js 115 bytes 2 [emitted] - output.js 2.47 KiB 3 [emitted] main -Entrypoint main = output.js -chunk {0} 0.output.js 38 bytes <{3}> [rendered] - > ./bar [4] ./templates lazy ^\.\/.*$ namespace object ./bar - > ./bar.js [4] ./templates lazy ^\.\/.*$ namespace object ./bar.js - [0] ./templates/bar.js 38 bytes {0} [optional] [built] - [exports: default] - context element ./bar [4] ./templates lazy ^\.\/.*$ namespace object ./bar - context element ./bar.js [4] ./templates lazy ^\.\/.*$ namespace object ./bar.js -chunk {1} 1.output.js 38 bytes <{3}> [rendered] - > ./baz [4] ./templates lazy ^\.\/.*$ namespace object ./baz - > ./baz.js [4] ./templates lazy ^\.\/.*$ namespace object ./baz.js - [1] ./templates/baz.js 38 bytes {1} [optional] [built] - [exports: default] - context element ./baz [4] ./templates lazy ^\.\/.*$ namespace object ./baz - context element ./baz.js [4] ./templates lazy ^\.\/.*$ namespace object ./baz.js -chunk {2} 2.output.js 38 bytes <{3}> [rendered] - > ./foo [4] ./templates lazy ^\.\/.*$ namespace object ./foo - > ./foo.js [4] ./templates lazy ^\.\/.*$ namespace object ./foo.js - [2] ./templates/foo.js 38 bytes {2} [optional] [built] - [exports: default] - context element ./foo [4] ./templates lazy ^\.\/.*$ namespace object ./foo - context element ./foo.js [4] ./templates lazy ^\.\/.*$ namespace object ./foo.js -chunk {3} output.js (main) 441 bytes >{0}< >{1}< >{2}< [entry] [rendered] - > ./example.js main - [3] ./example.js 281 bytes {3} [built] - single entry ./example.js main - [4] ./templates lazy ^\.\/.*$ namespace object 160 bytes {3} [optional] [built] - import() context lazy ./templates [3] ./example.js 3:23-60 +asset output.js 2.42 KiB [emitted] [minimized] (name: main) +asset 717.output.js 130 bytes [emitted] [minimized] +asset 776.output.js 130 bytes [emitted] [minimized] +asset 0.output.js 124 bytes [emitted] [minimized] +chunk (runtime: main) 0.output.js 38 bytes [rendered] + > ./baz ./templates/ lazy ^\.\/.*$ namespace object ./baz + > ./baz.js ./templates/ lazy ^\.\/.*$ namespace object ./baz.js + ./templates/baz.js 38 bytes [optional] [built] [code generated] + [exports: default] + import() context element ./baz ./templates/ lazy ^\.\/.*$ namespace object ./baz + import() context element ./baz.js ./templates/ lazy ^\.\/.*$ namespace object ./baz.js +chunk (runtime: main) 717.output.js 38 bytes [rendered] + > ./foo ./templates/ lazy ^\.\/.*$ namespace object ./foo + > ./foo.js ./templates/ lazy ^\.\/.*$ namespace object ./foo.js + ./templates/foo.js 38 bytes [optional] [built] [code generated] + [exports: default] + import() context element ./foo ./templates/ lazy ^\.\/.*$ namespace object ./foo + import() context element ./foo.js ./templates/ lazy ^\.\/.*$ namespace object ./foo.js +chunk (runtime: main) 776.output.js 38 bytes [rendered] + > ./bar ./templates/ lazy ^\.\/.*$ namespace object ./bar + > ./bar.js ./templates/ lazy ^\.\/.*$ namespace object ./bar.js + ./templates/bar.js 38 bytes [optional] [built] [code generated] + [exports: default] + import() context element ./bar ./templates/ lazy ^\.\/.*$ namespace object ./bar + import() context element ./bar.js ./templates/ lazy ^\.\/.*$ namespace object ./bar.js +chunk (runtime: main) output.js (main) 441 bytes (javascript) 5.5 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 5.5 KiB 8 modules + dependent modules 160 bytes [dependent] 1 module + ./example.js 281 bytes [built] [code generated] + [no exports used] + entry ./example.js main +webpack X.X.X compiled successfully ``` diff --git a/examples/code-splitting-native-import-context/template.md b/examples/code-splitting-native-import-context/template.md index f26cba077bf..f3c30f24490 100644 --- a/examples/code-splitting-native-import-context/template.md +++ b/examples/code-splitting-native-import-context/template.md @@ -2,26 +2,26 @@ This example illustrates how to leverage the `import()` syntax to create ContextModules which are separated into separate chunks for each module in the `./templates` folder. -``` javascript -{{example.js}} +```javascript +_{{example.js}}_ ``` # templates/ -* foo.js -* baz.js -* bar.js +- foo.js +- baz.js +- bar.js All templates are of this pattern: -``` javascript -{{templates/foo.js}} +```javascript +_{{templates/foo.js}}_ ``` # dist/output.js -``` javascript -{{dist/output.js}} +```javascript +_{{dist/output.js}}_ ``` # Info @@ -29,11 +29,11 @@ All templates are of this pattern: ## Unoptimized ``` -{{stdout}} +_{{stdout}}_ ``` ## Production mode ``` -{{production:stdout}} +_{{production:stdout}}_ ``` diff --git a/examples/code-splitting-native-import-context/webpack.config.js b/examples/code-splitting-native-import-context/webpack.config.js index 0d554bf62ea..2ad01d570d6 100644 --- a/examples/code-splitting-native-import-context/webpack.config.js +++ b/examples/code-splitting-native-import-context/webpack.config.js @@ -1,5 +1,5 @@ module.exports = { optimization: { - occurrenceOrder: true // To keep filename consistent between different modes (for example building only) + chunkIds: "deterministic" // To keep filename consistent between different modes (for example building only) } }; diff --git a/examples/code-splitting-specify-chunk-name/README.md b/examples/code-splitting-specify-chunk-name/README.md index 897c52f02a4..1d474ea2ef9 100644 --- a/examples/code-splitting-specify-chunk-name/README.md +++ b/examples/code-splitting-specify-chunk-name/README.md @@ -1,8 +1,8 @@ # example.js -This example illustrates how to specify chunk name in `require.ensure()` and `import()` to separated modules into separate chunks manually. +This example illustrates how to specify the chunk name in `require.ensure()` and `import()` to separated modules into separate chunks manually. -``` javascript +```javascript import("./templates/foo" /* webpackChunkName: "chunk-foo" */ ).then(function(foo) { console.log('foo:', foo); }) @@ -20,13 +20,13 @@ import("./templates/ba" + createContextVar /* webpackChunkName: "chunk-bar-baz" # templates/ -* foo.js -* baz.js -* bar.js +- foo.js +- baz.js +- bar.js All templates are of this pattern: -``` javascript +```javascript var foo = "foo"; export default foo; @@ -34,288 +34,316 @@ export default foo; # dist/output.js -
/******/ (function(modules) { /* webpackBootstrap */ }) +```javascript +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */ +/*!******************************************************************************!*\ + !*** ./templates/ lazy ^\.\/ba.*$ chunkName: chunk-bar-baz namespace object ***! + \******************************************************************************/ +/*! default exports */ +/*! exports [not provided] [no usage info] */ +/*! runtime requirements: module, __webpack_require__.o, __webpack_require__, __webpack_require__.e, __webpack_require__.* */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { -``` javascript -/******/ (function(modules) { // webpackBootstrap -/******/ // install a JSONP callback for chunk loading -/******/ function webpackJsonpCallback(data) { -/******/ var chunkIds = data[0]; -/******/ var moreModules = data[1]; -/******/ -/******/ -/******/ // add "moreModules" to the modules object, -/******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0, resolves = []; -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(installedChunks[chunkId]) { -/******/ resolves.push(installedChunks[chunkId][0]); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } -/******/ for(moduleId in moreModules) { -/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { -/******/ modules[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(parentJsonpFunction) parentJsonpFunction(data); -/******/ -/******/ while(resolves.length) { -/******/ resolves.shift()(); -/******/ } -/******/ -/******/ }; -/******/ -/******/ +var map = { + "./bar": [ + 3, + 994 + ], + "./bar.js": [ + 3, + 994 + ], + "./baz": [ + 4, + 792 + ], + "./baz.js": [ + 4, + 792 + ] +}; +function webpackAsyncContext(req) { + if(!__webpack_require__.o(map, req)) { + return Promise.resolve().then(() => { + var e = new Error("Cannot find module '" + req + "'"); + e.code = 'MODULE_NOT_FOUND'; + throw e; + }); + } + + var ids = map[req], id = ids[0]; + return __webpack_require__.e(ids[1]).then(() => { + return __webpack_require__(id); + }); +} +webpackAsyncContext.keys = () => (Object.keys(map)); +webpackAsyncContext.id = 1; +module.exports = webpackAsyncContext; + +/***/ }) +/******/ ]); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ /******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // Promise = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ 3: 0 -/******/ }; -/******/ -/******/ -/******/ -/******/ // script path function -/******/ function jsonpScriptSrc(chunkId) { -/******/ return __webpack_require__.p + "" + chunkId + ".output.js" -/******/ } -/******/ +/******/ var __webpack_module_cache__ = {}; +/******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { -/******/ /******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed /******/ exports: {} /******/ }; -/******/ +/******/ /******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } -/******/ -/******/ // This file contains only the entry chunk. -/******/ // The chunk loading function for additional chunks -/******/ __webpack_require__.e = function requireEnsure(chunkId) { -/******/ var promises = []; -/******/ -/******/ -/******/ // JSONP chunk loading for javascript -/******/ -/******/ var installedChunkData = installedChunks[chunkId]; -/******/ if(installedChunkData !== 0) { // 0 means "already installed". -/******/ -/******/ // a Promise means "currently loading". -/******/ if(installedChunkData) { -/******/ promises.push(installedChunkData[2]); -/******/ } else { -/******/ // setup Promise in chunk cache -/******/ var promise = new Promise(function(resolve, reject) { -/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject]; -/******/ }); -/******/ promises.push(installedChunkData[2] = promise); -/******/ -/******/ // start chunk loading -/******/ var script = document.createElement('script'); -/******/ var onScriptComplete; -/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".output.js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ // data-webpack is not used as build has no uniqueName +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ /******/ script.charset = 'utf-8'; /******/ script.timeout = 120; /******/ if (__webpack_require__.nc) { /******/ script.setAttribute("nonce", __webpack_require__.nc); /******/ } -/******/ script.src = jsonpScriptSrc(chunkId); -/******/ -/******/ onScriptComplete = function (event) { -/******/ // avoid mem leaks in IE. -/******/ script.onerror = script.onload = null; -/******/ clearTimeout(timeout); -/******/ var chunk = installedChunks[chunkId]; -/******/ if(chunk !== 0) { -/******/ if(chunk) { -/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); -/******/ var realSrc = event && event.target && event.target.src; -/******/ var error = new Error('Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'); -/******/ error.type = errorType; -/******/ error.request = realSrc; -/******/ chunk[1](error); +/******/ +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "dist/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ 411: 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // JSONP chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if(true) { // all chunks have JS +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ installedChunkData[1](error); +/******/ } +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); /******/ } -/******/ installedChunks[chunkId] = undefined; /******/ } -/******/ }; -/******/ var timeout = setTimeout(function(){ -/******/ onScriptComplete({ type: 'timeout', target: script }); -/******/ }, 120000); -/******/ script.onerror = script.onload = onScriptComplete; -/******/ document.head.appendChild(script); +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ // no on chunks loaded +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); /******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ /******/ } -/******/ return Promise.all(promises); -/******/ }; -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ // on error function for async loading -/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; -/******/ -/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; -/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); -/******/ jsonpArray.push = webpackJsonpCallback; -/******/ jsonpArray = jsonpArray.slice(); -/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); -/******/ var parentJsonpFunction = oldJsonpFunction; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 3); -/******/ }) +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ /************************************************************************/ ```
-``` javascript -/******/ ([ -/* 0 */, -/* 1 */, -/* 2 */, -/* 3 */ +``` js +var __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { /*!********************!*\ !*** ./example.js ***! \********************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -__webpack_require__.e(/*! import() | chunk-foo */ 2).then(__webpack_require__.bind(null, /*! ./templates/foo */ 0)).then(function(foo) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: __webpack_require__, __webpack_require__.e, __webpack_require__.* */ +__webpack_require__.e(/*! import() | chunk-foo */ 45).then(__webpack_require__.bind(__webpack_require__, /*! ./templates/foo */ 2)).then(function(foo) { console.log('foo:', foo); }) -__webpack_require__.e(/*! require.ensure | chunk-foo1 */ 2).then((function(require) { - var foo = __webpack_require__(/*! ./templates/foo */ 0); +__webpack_require__.e(/*! require.ensure | chunk-foo1 */ 45).then((function(require) { + var foo = __webpack_require__(/*! ./templates/foo */ 2); console.log('foo:', foo); -}).bind(null, __webpack_require__)).catch(__webpack_require__.oe); +}).bind(null, __webpack_require__))['catch'](__webpack_require__.oe); var createContextVar = "r"; -__webpack_require__(4)("./ba" + createContextVar).then(function(bar) { +__webpack_require__(1)("./ba" + createContextVar).then(function(bar) { console.log('bar:', bar); }) +})(); -/***/ }), -/* 4 */ -/*!****************************************************!*\ - !*** ./templates lazy ^\.\/ba.*$ namespace object ***! - \****************************************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var map = { - "./bar": [ - 1, - 0 - ], - "./bar.js": [ - 1, - 0 - ], - "./baz": [ - 2, - 1 - ], - "./baz.js": [ - 2, - 1 - ] -}; -function webpackAsyncContext(req) { - var ids = map[req]; - if(!ids) { - return Promise.resolve().then(function() { - var e = new Error("Cannot find module '" + req + "'"); - e.code = 'MODULE_NOT_FOUND'; - throw e; - }); - } - return __webpack_require__.e(ids[1]).then(function() { - var id = ids[0]; - return __webpack_require__(id); - }); -} -webpackAsyncContext.keys = function webpackAsyncContextKeys() { - return Object.keys(map); -}; -webpackAsyncContext.id = 4; -module.exports = webpackAsyncContext; - -/***/ }) -/******/ ]); +/******/ })() +; ``` # Info @@ -323,79 +351,78 @@ module.exports = webpackAsyncContext; ## Unoptimized ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -0.output.js 442 bytes 0 [emitted] chunk-bar-baz0 -1.output.js 436 bytes 1 [emitted] chunk-bar-baz2 -2.output.js 433 bytes 2 [emitted] chunk-foo - output.js 9.44 KiB 3 [emitted] main -Entrypoint main = output.js -chunk {0} 0.output.js (chunk-bar-baz0) 38 bytes <{3}> [rendered] - > ./bar [4] ./templates lazy ^\.\/ba.*$ namespace object ./bar - > ./bar.js [4] ./templates lazy ^\.\/ba.*$ namespace object ./bar.js - [1] ./templates/bar.js 38 bytes {0} [optional] [built] - [exports: default] - context element ./bar [4] ./templates lazy ^\.\/ba.*$ namespace object ./bar - context element ./bar.js [4] ./templates lazy ^\.\/ba.*$ namespace object ./bar.js -chunk {1} 1.output.js (chunk-bar-baz2) 38 bytes <{3}> [rendered] - > ./baz [4] ./templates lazy ^\.\/ba.*$ namespace object ./baz - > ./baz.js [4] ./templates lazy ^\.\/ba.*$ namespace object ./baz.js - [2] ./templates/baz.js 38 bytes {1} [optional] [built] - [exports: default] - context element ./baz [4] ./templates lazy ^\.\/ba.*$ namespace object ./baz - context element ./baz.js [4] ./templates lazy ^\.\/ba.*$ namespace object ./baz.js -chunk {2} 2.output.js (chunk-foo) 38 bytes <{3}> [rendered] - > ./templates/foo [3] ./example.js 1:0-62 - > [3] ./example.js 5:0-8:16 - [0] ./templates/foo.js 38 bytes {2} [built] - [exports: default] - import() ./templates/foo [3] ./example.js 1:0-62 - cjs require ./templates/foo [3] ./example.js 6:11-37 -chunk {3} output.js (main) 565 bytes >{0}< >{1}< >{2}< [entry] [rendered] - > ./example.js main - [3] ./example.js 405 bytes {3} [built] - single entry ./example.js main - [4] ./templates lazy ^\.\/ba.*$ namespace object 160 bytes {3} [built] - import() context lazy ./templates [3] ./example.js 11:0-84 +asset output.js 11.3 KiB [emitted] (name: main) +asset 792.output.js 858 bytes [emitted] (name: chunk-bar-baz2) +asset 994.output.js 858 bytes [emitted] (name: chunk-bar-baz0) +asset 45.output.js 857 bytes [emitted] (name: chunk-foo) +chunk (runtime: main) 45.output.js (chunk-foo) 38 bytes [rendered] + > ./templates/foo ./example.js 1:0-62 + > ./example.js 5:0-8:16 + ./templates/foo.js 38 bytes [built] [code generated] + [exports: default] + [used exports unknown] + import() ./templates/foo ./example.js 1:0-62 + cjs require ./templates/foo ./example.js 6:11-37 +chunk (runtime: main) output.js (main) 565 bytes (javascript) 5.5 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 5.5 KiB 8 modules + dependent modules 160 bytes [dependent] 1 module + ./example.js 405 bytes [built] [code generated] + [used exports unknown] + entry ./example.js main +chunk (runtime: main) 792.output.js (chunk-bar-baz2) 38 bytes [rendered] + > ./baz ./templates/ lazy ^\.\/ba.*$ chunkName: chunk-bar-baz namespace object ./baz + > ./baz.js ./templates/ lazy ^\.\/ba.*$ chunkName: chunk-bar-baz namespace object ./baz.js + ./templates/baz.js 38 bytes [optional] [built] [code generated] + [exports: default] + [used exports unknown] + import() context element ./baz ./templates/ lazy ^\.\/ba.*$ chunkName: chunk-bar-baz namespace object ./baz + import() context element ./baz.js ./templates/ lazy ^\.\/ba.*$ chunkName: chunk-bar-baz namespace object ./baz.js +chunk (runtime: main) 994.output.js (chunk-bar-baz0) 38 bytes [rendered] + > ./bar ./templates/ lazy ^\.\/ba.*$ chunkName: chunk-bar-baz namespace object ./bar + > ./bar.js ./templates/ lazy ^\.\/ba.*$ chunkName: chunk-bar-baz namespace object ./bar.js + ./templates/bar.js 38 bytes [optional] [built] [code generated] + [exports: default] + [used exports unknown] + import() context element ./bar ./templates/ lazy ^\.\/ba.*$ chunkName: chunk-bar-baz namespace object ./bar + import() context element ./bar.js ./templates/ lazy ^\.\/ba.*$ chunkName: chunk-bar-baz namespace object ./bar.js +webpack X.X.X compiled successfully ``` ## Production mode ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -0.output.js 114 bytes 0 [emitted] chunk-bar-baz0 -1.output.js 115 bytes 1 [emitted] chunk-bar-baz2 -2.output.js 113 bytes 2 [emitted] chunk-foo - output.js 2.49 KiB 3 [emitted] main -Entrypoint main = output.js -chunk {0} 0.output.js (chunk-bar-baz0) 38 bytes <{3}> [rendered] - > ./bar [4] ./templates lazy ^\.\/ba.*$ namespace object ./bar - > ./bar.js [4] ./templates lazy ^\.\/ba.*$ namespace object ./bar.js - [1] ./templates/bar.js 38 bytes {0} [optional] [built] - [exports: default] - context element ./bar [4] ./templates lazy ^\.\/ba.*$ namespace object ./bar - context element ./bar.js [4] ./templates lazy ^\.\/ba.*$ namespace object ./bar.js -chunk {1} 1.output.js (chunk-bar-baz2) 38 bytes <{3}> [rendered] - > ./baz [4] ./templates lazy ^\.\/ba.*$ namespace object ./baz - > ./baz.js [4] ./templates lazy ^\.\/ba.*$ namespace object ./baz.js - [2] ./templates/baz.js 38 bytes {1} [optional] [built] - [exports: default] - context element ./baz [4] ./templates lazy ^\.\/ba.*$ namespace object ./baz - context element ./baz.js [4] ./templates lazy ^\.\/ba.*$ namespace object ./baz.js -chunk {2} 2.output.js (chunk-foo) 38 bytes <{3}> [rendered] - > ./templates/foo [3] ./example.js 1:0-62 - > [3] ./example.js 5:0-8:16 - [0] ./templates/foo.js 38 bytes {2} [built] - [exports: default] - import() ./templates/foo [3] ./example.js 1:0-62 - cjs require ./templates/foo [3] ./example.js 6:11-37 -chunk {3} output.js (main) 565 bytes >{0}< >{1}< >{2}< [entry] [rendered] - > ./example.js main - [3] ./example.js 405 bytes {3} [built] - single entry ./example.js main - [4] ./templates lazy ^\.\/ba.*$ namespace object 160 bytes {3} [built] - import() context lazy ./templates [3] ./example.js 11:0-84 +asset output.js 2.44 KiB [emitted] [minimized] (name: main) +asset 994.output.js 130 bytes [emitted] [minimized] (name: chunk-bar-baz0) +asset 45.output.js 129 bytes [emitted] [minimized] (name: chunk-foo) +asset 792.output.js 126 bytes [emitted] [minimized] (name: chunk-bar-baz2) +chunk (runtime: main) 45.output.js (chunk-foo) 38 bytes [rendered] + > ./templates/foo ./example.js 1:0-62 + > ./example.js 5:0-8:16 + ./templates/foo.js 38 bytes [built] [code generated] + [exports: default] + import() ./templates/foo ./example.js 1:0-62 + cjs require ./templates/foo ./example.js 6:11-37 +chunk (runtime: main) output.js (main) 565 bytes (javascript) 5.5 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 5.5 KiB 8 modules + dependent modules 160 bytes [dependent] 1 module + ./example.js 405 bytes [built] [code generated] + [no exports used] + entry ./example.js main +chunk (runtime: main) 792.output.js (chunk-bar-baz2) 38 bytes [rendered] + > ./baz ./templates/ lazy ^\.\/ba.*$ chunkName: chunk-bar-baz namespace object ./baz + > ./baz.js ./templates/ lazy ^\.\/ba.*$ chunkName: chunk-bar-baz namespace object ./baz.js + ./templates/baz.js 38 bytes [optional] [built] [code generated] + [exports: default] + import() context element ./baz ./templates/ lazy ^\.\/ba.*$ chunkName: chunk-bar-baz namespace object ./baz + import() context element ./baz.js ./templates/ lazy ^\.\/ba.*$ chunkName: chunk-bar-baz namespace object ./baz.js +chunk (runtime: main) 994.output.js (chunk-bar-baz0) 38 bytes [rendered] + > ./bar ./templates/ lazy ^\.\/ba.*$ chunkName: chunk-bar-baz namespace object ./bar + > ./bar.js ./templates/ lazy ^\.\/ba.*$ chunkName: chunk-bar-baz namespace object ./bar.js + ./templates/bar.js 38 bytes [optional] [built] [code generated] + [exports: default] + import() context element ./bar ./templates/ lazy ^\.\/ba.*$ chunkName: chunk-bar-baz namespace object ./bar + import() context element ./bar.js ./templates/ lazy ^\.\/ba.*$ chunkName: chunk-bar-baz namespace object ./bar.js +webpack X.X.X compiled successfully ``` diff --git a/examples/code-splitting-specify-chunk-name/template.md b/examples/code-splitting-specify-chunk-name/template.md index b85d38e981d..0c63d10ca61 100644 --- a/examples/code-splitting-specify-chunk-name/template.md +++ b/examples/code-splitting-specify-chunk-name/template.md @@ -1,27 +1,27 @@ # example.js -This example illustrates how to specify chunk name in `require.ensure()` and `import()` to separated modules into separate chunks manually. +This example illustrates how to specify the chunk name in `require.ensure()` and `import()` to separated modules into separate chunks manually. -``` javascript -{{example.js}} +```javascript +_{{example.js}}_ ``` # templates/ -* foo.js -* baz.js -* bar.js +- foo.js +- baz.js +- bar.js All templates are of this pattern: -``` javascript -{{templates/foo.js}} +```javascript +_{{templates/foo.js}}_ ``` # dist/output.js -``` javascript -{{dist/output.js}} +```javascript +_{{dist/output.js}}_ ``` # Info @@ -29,11 +29,11 @@ All templates are of this pattern: ## Unoptimized ``` -{{stdout}} +_{{stdout}}_ ``` ## Production mode ``` -{{production:stdout}} +_{{production:stdout}}_ ``` diff --git a/examples/code-splitting-specify-chunk-name/webpack.config.js b/examples/code-splitting-specify-chunk-name/webpack.config.js index 0d554bf62ea..2ad01d570d6 100644 --- a/examples/code-splitting-specify-chunk-name/webpack.config.js +++ b/examples/code-splitting-specify-chunk-name/webpack.config.js @@ -1,5 +1,5 @@ module.exports = { optimization: { - occurrenceOrder: true // To keep filename consistent between different modes (for example building only) + chunkIds: "deterministic" // To keep filename consistent between different modes (for example building only) } }; diff --git a/examples/code-splitting/README.md b/examples/code-splitting/README.md index 138a8b18b15..7b3606f0da5 100644 --- a/examples/code-splitting/README.md +++ b/examples/code-splitting/README.md @@ -1,32 +1,31 @@ This example illustrates a very simple case of Code Splitting with `require.ensure`. -* `a` and `b` are required normally via CommonJS -* `c` is depended through the `require.ensure` array. - * This means: make it available, but don't execute it - * webpack will load it on demand -* `b` and `d` are required via CommonJs in the `require.ensure` callback - * webpack detects that these are in the on-demand-callback and - * will load them on demand - * webpacks optimizer can optimize `b` away - * as it is already available through the parent chunks +- `a` and `b` are required normally via CommonJS +- `c` is made available(,but doesn't get execute) through the `require.ensure` array. + - webpack will load it on demand +- `b` and `d` are required via CommonJs in the `require.ensure` callback + - webpack detects that these are in the on-demand-callback and + - will load them on demand + - webpack's optimizer can optimize `b` away + - as it is already available through the parent chunks You can see that webpack outputs two files/chunks: -* `output.js` is the entry chunk and contains - * the module system - * chunk loading logic - * the entry point `example.js` - * module `a` - * module `b` -* `1.output.js` is an additional chunk (on demand loaded) and contains - * module `c` - * module `d` +- `output.js` is the entry chunk and contains + - the module system + - chunk loading logic + - the entry point `example.js` + - module `a` + - module `b` +- `1.output.js` is an additional chunk (on-demand loaded) and contains + - module `c` + - module `d` You can see that chunks are loaded via JSONP. The additional chunks are pretty small and minimize well. # example.js -``` javascript +```javascript var a = require("a"); var b = require("b"); require.ensure(["c"], function(require) { @@ -35,258 +34,266 @@ require.ensure(["c"], function(require) { }); ``` - # dist/output.js -
/******/ (function(modules) { /* webpackBootstrap */ }) +```javascript +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */ +/*!***************************!*\ + !*** ./node_modules/a.js ***! + \***************************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: */ +/***/ (() => { -``` javascript -/******/ (function(modules) { // webpackBootstrap -/******/ // install a JSONP callback for chunk loading -/******/ function webpackJsonpCallback(data) { -/******/ var chunkIds = data[0]; -/******/ var moreModules = data[1]; -/******/ -/******/ -/******/ // add "moreModules" to the modules object, -/******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0, resolves = []; -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(installedChunks[chunkId]) { -/******/ resolves.push(installedChunks[chunkId][0]); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } -/******/ for(moduleId in moreModules) { -/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { -/******/ modules[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(parentJsonpFunction) parentJsonpFunction(data); -/******/ -/******/ while(resolves.length) { -/******/ resolves.shift()(); -/******/ } -/******/ -/******/ }; -/******/ -/******/ +// module a + +/***/ }), +/* 2 */ +/*!***************************!*\ + !*** ./node_modules/b.js ***! + \***************************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: */ +/***/ (() => { + +// module b + +/***/ }) +/******/ ]); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ /******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // Promise = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ 0: 0 -/******/ }; -/******/ -/******/ -/******/ -/******/ // script path function -/******/ function jsonpScriptSrc(chunkId) { -/******/ return __webpack_require__.p + "" + chunkId + ".output.js" -/******/ } -/******/ +/******/ var __webpack_module_cache__ = {}; +/******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { -/******/ /******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed /******/ exports: {} /******/ }; -/******/ +/******/ /******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } -/******/ -/******/ // This file contains only the entry chunk. -/******/ // The chunk loading function for additional chunks -/******/ __webpack_require__.e = function requireEnsure(chunkId) { -/******/ var promises = []; -/******/ -/******/ -/******/ // JSONP chunk loading for javascript -/******/ -/******/ var installedChunkData = installedChunks[chunkId]; -/******/ if(installedChunkData !== 0) { // 0 means "already installed". -/******/ -/******/ // a Promise means "currently loading". -/******/ if(installedChunkData) { -/******/ promises.push(installedChunkData[2]); -/******/ } else { -/******/ // setup Promise in chunk cache -/******/ var promise = new Promise(function(resolve, reject) { -/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject]; -/******/ }); -/******/ promises.push(installedChunkData[2] = promise); -/******/ -/******/ // start chunk loading -/******/ var script = document.createElement('script'); -/******/ var onScriptComplete; -/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".output.js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ // data-webpack is not used as build has no uniqueName +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ /******/ script.charset = 'utf-8'; /******/ script.timeout = 120; /******/ if (__webpack_require__.nc) { /******/ script.setAttribute("nonce", __webpack_require__.nc); /******/ } -/******/ script.src = jsonpScriptSrc(chunkId); -/******/ -/******/ onScriptComplete = function (event) { -/******/ // avoid mem leaks in IE. -/******/ script.onerror = script.onload = null; -/******/ clearTimeout(timeout); -/******/ var chunk = installedChunks[chunkId]; -/******/ if(chunk !== 0) { -/******/ if(chunk) { -/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); -/******/ var realSrc = event && event.target && event.target.src; -/******/ var error = new Error('Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'); -/******/ error.type = errorType; -/******/ error.request = realSrc; -/******/ chunk[1](error); +/******/ +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "dist/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "main": 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // JSONP chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if(true) { // all chunks have JS +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ installedChunkData[1](error); +/******/ } +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); /******/ } -/******/ installedChunks[chunkId] = undefined; /******/ } -/******/ }; -/******/ var timeout = setTimeout(function(){ -/******/ onScriptComplete({ type: 'timeout', target: script }); -/******/ }, 120000); -/******/ script.onerror = script.onload = onScriptComplete; -/******/ document.head.appendChild(script); +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ // no on chunks loaded +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); /******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ /******/ } -/******/ return Promise.all(promises); -/******/ }; -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ // on error function for async loading -/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; -/******/ -/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; -/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); -/******/ jsonpArray.push = webpackJsonpCallback; -/******/ jsonpArray = jsonpArray.slice(); -/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); -/******/ var parentJsonpFunction = oldJsonpFunction; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 1); -/******/ }) +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ /************************************************************************/ ```
-``` javascript -/******/ ([ -/* 0 */ -/*!***************************!*\ - !*** ./node_modules/b.js ***! - \***************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -// module b - -/***/ }), -/* 1 */ +``` js +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { /*!********************!*\ !*** ./example.js ***! \********************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var a = __webpack_require__(/*! a */ 2); -var b = __webpack_require__(/*! b */ 0); -__webpack_require__.e(/*! require.ensure */ 1).then((function(require) { - __webpack_require__(/*! b */ 0).xyz(); +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: __webpack_require__, __webpack_require__.e, __webpack_require__.* */ +var a = __webpack_require__(/*! a */ 1); +var b = __webpack_require__(/*! b */ 2); +__webpack_require__.e(/*! require.ensure */ "node_modules_c_js-node_modules_d_js").then((function(require) { + (__webpack_require__(/*! b */ 2).xyz)(); var d = __webpack_require__(/*! d */ 4); -}).bind(null, __webpack_require__)).catch(__webpack_require__.oe); - -/***/ }), -/* 2 */ -/*!***************************!*\ - !*** ./node_modules/a.js ***! - \***************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -// module a +}).bind(null, __webpack_require__))['catch'](__webpack_require__.oe); +})(); -/***/ }) -/******/ ]); +/******/ })() +; ``` -# dist/1.output.js +# dist/node_modules_c_js-node_modules_d_js.output.js -``` javascript -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[1],[ +```javascript +(self["webpackChunk"] = self["webpackChunk"] || []).push([["node_modules_c_js-node_modules_d_js"],[ /* 0 */, /* 1 */, /* 2 */, @@ -294,8 +301,9 @@ __webpack_require__.e(/*! require.ensure */ 1).then((function(require) { /*!***************************!*\ !*** ./node_modules/c.js ***! \***************************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: */ +/***/ (() => { // module c @@ -304,8 +312,9 @@ __webpack_require__.e(/*! require.ensure */ 1).then((function(require) { /*!***************************!*\ !*** ./node_modules/d.js ***! \***************************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: */ +/***/ (() => { // module d @@ -315,8 +324,8 @@ __webpack_require__.e(/*! require.ensure */ 1).then((function(require) { Minimized -``` javascript -(window.webpackJsonp=window.webpackJsonp||[]).push([[1],[,,,function(n,o){},function(n,o){}]]); +```javascript +(self.webpackChunk=self.webpackChunk||[]).push([["node_modules_c_js-node_modules_d_js"],{576:()=>{},605:()=>{}}]); ``` # Info @@ -324,37 +333,45 @@ Minimized ## Unoptimized ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -1.output.js 490 bytes 1 [emitted] - output.js 8.69 KiB 0 [emitted] main -Entrypoint main = output.js -chunk {0} output.js (main) 161 bytes >{1}< [entry] [rendered] - > ./example.js main - [1] ./example.js 139 bytes {0} [built] - single entry ./example.js main - + 2 hidden modules -chunk {1} 1.output.js 22 bytes <{0}> [rendered] - > [1] ./example.js 3:0-6:2 - 2 modules +asset output.js 9.46 KiB [emitted] (name: main) +asset node_modules_c_js-node_modules_d_js.output.js 562 bytes [emitted] +chunk (runtime: main) output.js (main) 161 bytes (javascript) 4.94 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 4.94 KiB 6 modules + dependent modules 22 bytes [dependent] 2 modules + ./example.js 139 bytes [built] [code generated] + [used exports unknown] + entry ./example.js main +chunk (runtime: main) node_modules_c_js-node_modules_d_js.output.js 22 bytes [rendered] + > ./example.js 3:0-6:2 + ./node_modules/c.js 11 bytes [built] [code generated] + [used exports unknown] + require.ensure item c ./example.js 3:0-6:2 + ./node_modules/d.js 11 bytes [built] [code generated] + [used exports unknown] + cjs require d ./example.js 5:12-24 +webpack X.X.X compiled successfully ``` ## Production mode ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -1.output.js 95 bytes 1 [emitted] - output.js 2.05 KiB 0 [emitted] main -Entrypoint main = output.js -chunk {0} output.js (main) 161 bytes >{1}< [entry] [rendered] - > ./example.js main - [1] ./example.js 139 bytes {0} [built] - single entry ./example.js main - + 2 hidden modules -chunk {1} 1.output.js 22 bytes <{0}> [rendered] - > [1] ./example.js 3:0-6:2 - 2 modules +asset output.js 1.77 KiB [emitted] [minimized] (name: main) +asset node_modules_c_js-node_modules_d_js.output.js 114 bytes [emitted] [minimized] +chunk (runtime: main) output.js (main) 161 bytes (javascript) 4.94 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 4.94 KiB 6 modules + dependent modules 22 bytes [dependent] 2 modules + ./example.js 139 bytes [built] [code generated] + [no exports used] + entry ./example.js main +chunk (runtime: main) node_modules_c_js-node_modules_d_js.output.js 22 bytes [rendered] + > ./example.js 3:0-6:2 + ./node_modules/c.js 11 bytes [built] [code generated] + [used exports unknown] + require.ensure item c ./example.js 3:0-6:2 + ./node_modules/d.js 11 bytes [built] [code generated] + [used exports unknown] + cjs require d ./example.js 5:12-24 +webpack X.X.X compiled successfully ``` diff --git a/examples/code-splitting/template.md b/examples/code-splitting/template.md index 8e32dc5c49d..1b5e16233c4 100644 --- a/examples/code-splitting/template.md +++ b/examples/code-splitting/template.md @@ -1,52 +1,50 @@ This example illustrates a very simple case of Code Splitting with `require.ensure`. -* `a` and `b` are required normally via CommonJS -* `c` is depended through the `require.ensure` array. - * This means: make it available, but don't execute it - * webpack will load it on demand -* `b` and `d` are required via CommonJs in the `require.ensure` callback - * webpack detects that these are in the on-demand-callback and - * will load them on demand - * webpacks optimizer can optimize `b` away - * as it is already available through the parent chunks +- `a` and `b` are required normally via CommonJS +- `c` is made available(,but doesn't get execute) through the `require.ensure` array. + - webpack will load it on demand +- `b` and `d` are required via CommonJs in the `require.ensure` callback + - webpack detects that these are in the on-demand-callback and + - will load them on demand + - webpack's optimizer can optimize `b` away + - as it is already available through the parent chunks You can see that webpack outputs two files/chunks: -* `output.js` is the entry chunk and contains - * the module system - * chunk loading logic - * the entry point `example.js` - * module `a` - * module `b` -* `1.output.js` is an additional chunk (on demand loaded) and contains - * module `c` - * module `d` +- `output.js` is the entry chunk and contains + - the module system + - chunk loading logic + - the entry point `example.js` + - module `a` + - module `b` +- `1.output.js` is an additional chunk (on-demand loaded) and contains + - module `c` + - module `d` You can see that chunks are loaded via JSONP. The additional chunks are pretty small and minimize well. # example.js -``` javascript -{{example.js}} +```javascript +_{{example.js}}_ ``` - # dist/output.js -``` javascript -{{dist/output.js}} +```javascript +_{{dist/output.js}}_ ``` -# dist/1.output.js +# dist/node_modules_c_js-node_modules_d_js.output.js -``` javascript -{{dist/1.output.js}} +```javascript +_{{dist/node_modules_c_js-node_modules_d_js.output.js}}_ ``` Minimized -``` javascript -{{production:dist/1.output.js}} +```javascript +_{{production:dist/node_modules_c_js-node_modules_d_js.output.js}}_ ``` # Info @@ -54,11 +52,11 @@ Minimized ## Unoptimized ``` -{{stdout}} +_{{stdout}}_ ``` ## Production mode ``` -{{production:stdout}} +_{{production:stdout}}_ ``` diff --git a/examples/code-splitting/webpack.config.js b/examples/code-splitting/webpack.config.js index 0d554bf62ea..115df174878 100644 --- a/examples/code-splitting/webpack.config.js +++ b/examples/code-splitting/webpack.config.js @@ -1,5 +1,5 @@ module.exports = { optimization: { - occurrenceOrder: true // To keep filename consistent between different modes (for example building only) + chunkIds: "named" // To keep filename consistent between different modes (for example building only) } }; diff --git a/examples/coffee-script/README.md b/examples/coffee-script/README.md index d5fe207547d..2edbc5477ee 100644 --- a/examples/coffee-script/README.md +++ b/examples/coffee-script/README.md @@ -1,13 +1,12 @@ - # example.js -``` javascript +```javascript console.log(require("./cup1")); ``` # cup1.coffee -``` coffee-script +```coffee-script module.exports = cool: "stuff" answer: 42 @@ -17,7 +16,7 @@ module.exports = # cup2.coffee -``` coffee-script +```coffee-script console.log "yeah coffee-script" module.exports = 42 @@ -25,117 +24,18 @@ module.exports = 42 # dist/output.js -
/******/ (function(modules) { /* webpackBootstrap */ }) - -``` javascript -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); -/******/ }) -/************************************************************************/ -``` - -
- -``` javascript -/******/ ([ -/* 0 */ -/*!********************!*\ - !*** ./example.js ***! - \********************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -console.log(__webpack_require__(/*! ./cup1 */ 1)); - -/***/ }), +```javascript +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ([ +/* 0 */, /* 1 */ /*!*********************!*\ !*** ./cup1.coffee ***! \*********************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module, __webpack_require__ */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { module.exports = { cool: "stuff", @@ -150,8 +50,10 @@ module.exports = { /*!*********************!*\ !*** ./cup2.coffee ***! \*********************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 3:0-14 */ +/***/ ((module) => { console.log("yeah coffee-script"); @@ -159,7 +61,55 @@ module.exports = 42; /***/ }) -/******/ ]); +/******/ ]); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +``` + +
+ +``` js +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { +/*!********************!*\ + !*** ./example.js ***! + \********************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: __webpack_require__ */ +console.log(__webpack_require__(/*! ./cup1 */ 1)); +})(); + +/******/ })() +; ``` # Info @@ -167,37 +117,25 @@ module.exports = 42; ## Unoptimized ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -output.js 4.31 KiB 0 [emitted] main -Entrypoint main = output.js -chunk {0} output.js (main) 206 bytes [entry] [rendered] - > ./example.js main - [0] ./example.js 31 bytes {0} [built] - single entry ./example.js main - [1] ./cup1.coffee 118 bytes {0} [built] - cjs require ./cup1 [0] ./example.js 1:12-29 - [2] ./cup2.coffee 57 bytes {0} [built] - cjs require ./cup2.coffee [1] ./cup1.coffee 4:12-36 - cjs require ./cup2 [1] ./cup1.coffee 5:9-26 +asset output.js 2.24 KiB [emitted] (name: main) +chunk (runtime: main) output.js (main) 206 bytes [entry] [rendered] + > ./example.js main + dependent modules 175 bytes [dependent] 2 modules + ./example.js 31 bytes [built] [code generated] + [used exports unknown] + entry ./example.js main +webpack X.X.X compiled successfully ``` ## Production mode ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -output.js 1.07 KiB 0 [emitted] main -Entrypoint main = output.js -chunk {0} output.js (main) 206 bytes [entry] [rendered] - > ./example.js main - [0] ./cup2.coffee 57 bytes {0} [built] - cjs require ./cup2.coffee [2] ./cup1.coffee 4:12-36 - cjs require ./cup2 [2] ./cup1.coffee 5:9-26 - [1] ./example.js 31 bytes {0} [built] - single entry ./example.js main - [2] ./cup1.coffee 118 bytes {0} [built] - cjs require ./cup1 [1] ./example.js 1:12-29 -``` \ No newline at end of file +asset output.js 294 bytes [emitted] [minimized] (name: main) +chunk (runtime: main) output.js (main) 206 bytes [entry] [rendered] + > ./example.js main + dependent modules 175 bytes [dependent] 2 modules + ./example.js 31 bytes [built] [code generated] + [no exports used] + entry ./example.js main +webpack X.X.X compiled successfully +``` diff --git a/examples/coffee-script/template.md b/examples/coffee-script/template.md index bef6e314e38..c2c60394cc9 100644 --- a/examples/coffee-script/template.md +++ b/examples/coffee-script/template.md @@ -1,26 +1,25 @@ - # example.js -``` javascript -{{example.js}} +```javascript +_{{example.js}}_ ``` # cup1.coffee -``` coffee-script -{{cup1.coffee}} +```coffee-script +_{{cup1.coffee}}_ ``` # cup2.coffee -``` coffee-script -{{cup2.coffee}} +```coffee-script +_{{cup2.coffee}}_ ``` # dist/output.js -``` javascript -{{dist/output.js}} +```javascript +_{{dist/output.js}}_ ``` # Info @@ -28,11 +27,11 @@ ## Unoptimized ``` -{{stdout}} +_{{stdout}}_ ``` ## Production mode ``` -{{production:stdout}} -``` \ No newline at end of file +_{{production:stdout}}_ +``` diff --git a/examples/coffee-script/webpack.config.js b/examples/coffee-script/webpack.config.js index 845f9f4c190..91c59cf45a7 100644 --- a/examples/coffee-script/webpack.config.js +++ b/examples/coffee-script/webpack.config.js @@ -1,5 +1,5 @@ module.exports = { - // mode: "development || "production", + // mode: "development" || "production", module: { rules: [ { diff --git a/examples/common-chunk-and-vendor-chunk/README.md b/examples/common-chunk-and-vendor-chunk/README.md index 9534bf50759..c662abce680 100644 --- a/examples/common-chunk-and-vendor-chunk/README.md +++ b/examples/common-chunk-and-vendor-chunk/README.md @@ -33,8 +33,8 @@ With this bundle configuration, you would load your third party libraries, then # webpack.config.js -``` javascript -var path = require("path"); +```javascript +const path = require("path"); module.exports = { // mode: "development" || "production", @@ -44,6 +44,7 @@ module.exports = { pageC: "./pageC" }, optimization: { + chunkIds: "named", splitChunks: { cacheGroups: { commons: { @@ -71,15 +72,17 @@ module.exports = { # dist/vendor.js -``` javascript -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[1],{ +```javascript +(self["webpackChunk"] = self["webpackChunk"] || []).push([["vendor"],{ /***/ 1: /*!*********************************!*\ !*** ./node_modules/vendor1.js ***! \*********************************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { module.exports = "vendor1"; @@ -89,8 +92,10 @@ module.exports = "vendor1"; /*!*********************************!*\ !*** ./node_modules/vendor2.js ***! \*********************************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { module.exports = "vendor2"; @@ -99,17 +104,19 @@ module.exports = "vendor2"; }]); ``` -# dist/commons~pageA~pageB~pageC.js +# dist/commons-utility2_js.js ``` javascript -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[2],{ +(self["webpackChunk"] = self["webpackChunk"] || []).push([["commons-utility2_js"],{ /***/ 3: /*!*********************!*\ !*** ./utility2.js ***! \*********************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { module.exports = "utility2"; @@ -118,17 +125,19 @@ module.exports = "utility2"; }]); ``` -# dist/commons~pageB~pageC.js +# dist/commons-utility3_js.js ``` javascript -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[4],{ +(self["webpackChunk"] = self["webpackChunk"] || []).push([["commons-utility3_js"],{ /***/ 6: /*!*********************!*\ !*** ./utility3.js ***! \*********************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { module.exports = "utility3"; @@ -139,175 +148,17 @@ module.exports = "utility3"; # dist/pageA.js -
/******/ (function(modules) { /* webpackBootstrap */ }) - -``` javascript -/******/ (function(modules) { // webpackBootstrap -/******/ // install a JSONP callback for chunk loading -/******/ function webpackJsonpCallback(data) { -/******/ var chunkIds = data[0]; -/******/ var moreModules = data[1]; -/******/ var executeModules = data[2]; -/******/ -/******/ // add "moreModules" to the modules object, -/******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0, resolves = []; -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(installedChunks[chunkId]) { -/******/ resolves.push(installedChunks[chunkId][0]); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } -/******/ for(moduleId in moreModules) { -/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { -/******/ modules[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(parentJsonpFunction) parentJsonpFunction(data); -/******/ -/******/ while(resolves.length) { -/******/ resolves.shift()(); -/******/ } -/******/ -/******/ // add entry modules from loaded chunk to deferred list -/******/ deferredModules.push.apply(deferredModules, executeModules || []); -/******/ -/******/ // run deferred modules when all chunks ready -/******/ return checkDeferredModules(); -/******/ }; -/******/ function checkDeferredModules() { -/******/ var result; -/******/ for(var i = 0; i < deferredModules.length; i++) { -/******/ var deferredModule = deferredModules[i]; -/******/ var fulfilled = true; -/******/ for(var j = 1; j < deferredModule.length; j++) { -/******/ var depId = deferredModule[j]; -/******/ if(installedChunks[depId] !== 0) fulfilled = false; -/******/ } -/******/ if(fulfilled) { -/******/ deferredModules.splice(i--, 1); -/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]); -/******/ } -/******/ } -/******/ return result; -/******/ } -/******/ -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // Promise = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ 0: 0 -/******/ }; -/******/ -/******/ var deferredModules = []; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; -/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); -/******/ jsonpArray.push = webpackJsonpCallback; -/******/ jsonpArray = jsonpArray.slice(); -/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); -/******/ var parentJsonpFunction = oldJsonpFunction; -/******/ -/******/ -/******/ // add entry module to deferred list -/******/ deferredModules.push([0,1,2]); -/******/ // run deferred modules when ready -/******/ return checkDeferredModules(); -/******/ }) -/************************************************************************/ -``` - -
- -``` javascript -/******/ ([ +```javascript +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ([ /* 0 */ /*!******************!*\ !*** ./pageA.js ***! \******************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module, __webpack_require__ */ +/*! CommonJS bailout: module.exports is used directly at 5:0-14 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { var vendor1 = __webpack_require__(/*! vendor1 */ 1); var utility1 = __webpack_require__(/*! ./utility1 */ 2); @@ -322,180 +173,170 @@ module.exports = "pageA"; /*!*********************!*\ !*** ./utility1.js ***! \*********************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { module.exports = "utility1"; /***/ }) -/******/ ]); +/******/ ]); ``` -# dist/pageB.js +
/* webpack runtime code */ -``` javascript -/******/ (function(modules) { // webpackBootstrap -/******/ // install a JSONP callback for chunk loading -/******/ function webpackJsonpCallback(data) { -/******/ var chunkIds = data[0]; -/******/ var moreModules = data[1]; -/******/ var executeModules = data[2]; -/******/ -/******/ // add "moreModules" to the modules object, -/******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0, resolves = []; -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(installedChunks[chunkId]) { -/******/ resolves.push(installedChunks[chunkId][0]); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } -/******/ for(moduleId in moreModules) { -/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { -/******/ modules[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(parentJsonpFunction) parentJsonpFunction(data); -/******/ -/******/ while(resolves.length) { -/******/ resolves.shift()(); -/******/ } -/******/ -/******/ // add entry modules from loaded chunk to deferred list -/******/ deferredModules.push.apply(deferredModules, executeModules || []); -/******/ -/******/ // run deferred modules when all chunks ready -/******/ return checkDeferredModules(); -/******/ }; -/******/ function checkDeferredModules() { -/******/ var result; -/******/ for(var i = 0; i < deferredModules.length; i++) { -/******/ var deferredModule = deferredModules[i]; -/******/ var fulfilled = true; -/******/ for(var j = 1; j < deferredModule.length; j++) { -/******/ var depId = deferredModule[j]; -/******/ if(installedChunks[depId] !== 0) fulfilled = false; -/******/ } -/******/ if(fulfilled) { -/******/ deferredModules.splice(i--, 1); -/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]); -/******/ } -/******/ } -/******/ return result; -/******/ } -/******/ +``` js +/************************************************************************/ /******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // Promise = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ 3: 0 -/******/ }; -/******/ -/******/ var deferredModules = []; -/******/ +/******/ var __webpack_module_cache__ = {}; +/******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { -/******/ /******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed /******/ exports: {} /******/ }; -/******/ +/******/ /******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } -/******/ -/******/ +/******/ /******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/chunk loaded */ +/******/ (() => { +/******/ var deferred = []; +/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => { +/******/ if(chunkIds) { +/******/ priority = priority || 0; +/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1]; +/******/ deferred[i] = [chunkIds, fn, priority]; +/******/ return; +/******/ } +/******/ var notFulfilled = Infinity; +/******/ for (var i = 0; i < deferred.length; i++) { +/******/ var [chunkIds, fn, priority] = deferred[i]; +/******/ var fulfilled = true; +/******/ for (var j = 0; j < chunkIds.length; j++) { +/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) { +/******/ chunkIds.splice(j--, 1); +/******/ } else { +/******/ fulfilled = false; +/******/ if(priority < notFulfilled) notFulfilled = priority; +/******/ } +/******/ } +/******/ if(fulfilled) { +/******/ deferred.splice(i--, 1) +/******/ var r = fn(); +/******/ if (r !== undefined) result = r; +/******/ } +/******/ } +/******/ return result; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "pageA": 0 +/******/ }; +/******/ +/******/ // no chunk on demand loading +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0); +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); +/******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ return __webpack_require__.O(result); /******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; -/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); -/******/ jsonpArray.push = webpackJsonpCallback; -/******/ jsonpArray = jsonpArray.slice(); -/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); -/******/ var parentJsonpFunction = oldJsonpFunction; -/******/ -/******/ -/******/ // add entry module to deferred list -/******/ deferredModules.push([4,1,2,4]); -/******/ // run deferred modules when ready -/******/ return checkDeferredModules(); -/******/ }) +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ /************************************************************************/ -/******/ ({ +``` + +
+ +``` js +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module depends on other loaded chunks and execution need to be delayed +/******/ var __webpack_exports__ = __webpack_require__.O(undefined, ["vendor","commons-utility2_js"], () => (__webpack_require__(0))) +/******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__); +/******/ +/******/ })() +; +``` + +# dist/pageB.js + +```javascript +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ /***/ 4: /*!******************!*\ !*** ./pageB.js ***! \******************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module, __webpack_require__ */ +/*! CommonJS bailout: module.exports is used directly at 5:0-14 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { var vendor2 = __webpack_require__(/*! vendor2 */ 5); var utility2 = __webpack_require__(/*! ./utility2 */ 3); @@ -506,174 +347,162 @@ module.exports = "pageB"; /***/ }) -/******/ }); +/******/ }); ``` -# dist/pageC.js +
/* webpack runtime code */ -``` javascript -/******/ (function(modules) { // webpackBootstrap -/******/ // install a JSONP callback for chunk loading -/******/ function webpackJsonpCallback(data) { -/******/ var chunkIds = data[0]; -/******/ var moreModules = data[1]; -/******/ var executeModules = data[2]; -/******/ -/******/ // add "moreModules" to the modules object, -/******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0, resolves = []; -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(installedChunks[chunkId]) { -/******/ resolves.push(installedChunks[chunkId][0]); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } -/******/ for(moduleId in moreModules) { -/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { -/******/ modules[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(parentJsonpFunction) parentJsonpFunction(data); -/******/ -/******/ while(resolves.length) { -/******/ resolves.shift()(); -/******/ } -/******/ -/******/ // add entry modules from loaded chunk to deferred list -/******/ deferredModules.push.apply(deferredModules, executeModules || []); -/******/ -/******/ // run deferred modules when all chunks ready -/******/ return checkDeferredModules(); -/******/ }; -/******/ function checkDeferredModules() { -/******/ var result; -/******/ for(var i = 0; i < deferredModules.length; i++) { -/******/ var deferredModule = deferredModules[i]; -/******/ var fulfilled = true; -/******/ for(var j = 1; j < deferredModule.length; j++) { -/******/ var depId = deferredModule[j]; -/******/ if(installedChunks[depId] !== 0) fulfilled = false; -/******/ } -/******/ if(fulfilled) { -/******/ deferredModules.splice(i--, 1); -/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]); -/******/ } -/******/ } -/******/ return result; -/******/ } -/******/ +``` js +/************************************************************************/ /******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // Promise = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ 5: 0 -/******/ }; -/******/ -/******/ var deferredModules = []; -/******/ +/******/ var __webpack_module_cache__ = {}; +/******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { -/******/ /******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed /******/ exports: {} /******/ }; -/******/ +/******/ /******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } -/******/ -/******/ +/******/ /******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/chunk loaded */ +/******/ (() => { +/******/ var deferred = []; +/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => { +/******/ if(chunkIds) { +/******/ priority = priority || 0; +/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1]; +/******/ deferred[i] = [chunkIds, fn, priority]; +/******/ return; +/******/ } +/******/ var notFulfilled = Infinity; +/******/ for (var i = 0; i < deferred.length; i++) { +/******/ var [chunkIds, fn, priority] = deferred[i]; +/******/ var fulfilled = true; +/******/ for (var j = 0; j < chunkIds.length; j++) { +/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) { +/******/ chunkIds.splice(j--, 1); +/******/ } else { +/******/ fulfilled = false; +/******/ if(priority < notFulfilled) notFulfilled = priority; +/******/ } +/******/ } +/******/ if(fulfilled) { +/******/ deferred.splice(i--, 1) +/******/ var r = fn(); +/******/ if (r !== undefined) result = r; +/******/ } +/******/ } +/******/ return result; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "pageB": 0 +/******/ }; +/******/ +/******/ // no chunk on demand loading +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0); +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); +/******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ return __webpack_require__.O(result); /******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; -/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); -/******/ jsonpArray.push = webpackJsonpCallback; -/******/ jsonpArray = jsonpArray.slice(); -/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); -/******/ var parentJsonpFunction = oldJsonpFunction; -/******/ -/******/ -/******/ // add entry module to deferred list -/******/ deferredModules.push([7,2,4]); -/******/ // run deferred modules when ready -/******/ return checkDeferredModules(); -/******/ }) +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ /************************************************************************/ -/******/ ({ +``` + +
+ +``` js +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module depends on other loaded chunks and execution need to be delayed +/******/ var __webpack_exports__ = __webpack_require__.O(undefined, ["vendor","commons-utility2_js","commons-utility3_js"], () => (__webpack_require__(4))) +/******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__); +/******/ +/******/ })() +; +``` + +# dist/pageC.js + +```javascript +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ /***/ 7: /*!******************!*\ !*** ./pageC.js ***! \******************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module, __webpack_require__ */ +/*! CommonJS bailout: module.exports is used directly at 4:0-14 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { var utility2 = __webpack_require__(/*! ./utility2 */ 3); var utility3 = __webpack_require__(/*! ./utility3 */ 6); @@ -682,7 +511,146 @@ module.exports = "pageC"; /***/ }) -/******/ }); +/******/ }); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/chunk loaded */ +/******/ (() => { +/******/ var deferred = []; +/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => { +/******/ if(chunkIds) { +/******/ priority = priority || 0; +/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1]; +/******/ deferred[i] = [chunkIds, fn, priority]; +/******/ return; +/******/ } +/******/ var notFulfilled = Infinity; +/******/ for (var i = 0; i < deferred.length; i++) { +/******/ var [chunkIds, fn, priority] = deferred[i]; +/******/ var fulfilled = true; +/******/ for (var j = 0; j < chunkIds.length; j++) { +/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) { +/******/ chunkIds.splice(j--, 1); +/******/ } else { +/******/ fulfilled = false; +/******/ if(priority < notFulfilled) notFulfilled = priority; +/******/ } +/******/ } +/******/ if(fulfilled) { +/******/ deferred.splice(i--, 1) +/******/ var r = fn(); +/******/ if (r !== undefined) result = r; +/******/ } +/******/ } +/******/ return result; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "pageC": 0 +/******/ }; +/******/ +/******/ // no chunk on demand loading +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0); +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); +/******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ return __webpack_require__.O(result); +/******/ } +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ +/************************************************************************/ +``` + +
+ +``` js +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module depends on other loaded chunks and execution need to be delayed +/******/ var __webpack_exports__ = __webpack_require__.O(undefined, ["commons-utility2_js","commons-utility3_js"], () => (__webpack_require__(7))) +/******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__); +/******/ +/******/ })() +; ``` # Info @@ -690,97 +658,133 @@ module.exports = "pageC"; ## Unoptimized ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -commons~pageA~pageB~pageC.js 269 bytes 2 [emitted] commons~pageA~pageB~pageC - commons~pageB~pageC.js 269 bytes 4 [emitted] commons~pageB~pageC - pageA.js 6.7 KiB 0 [emitted] pageA - pageB.js 6.5 KiB 3 [emitted] pageB - pageC.js 6.45 KiB 5 [emitted] pageC - vendor.js 536 bytes 1 [emitted] vendor -Entrypoint pageA = vendor.js commons~pageA~pageB~pageC.js pageA.js -Entrypoint pageB = vendor.js commons~pageA~pageB~pageC.js commons~pageB~pageC.js pageB.js -Entrypoint pageC = commons~pageA~pageB~pageC.js commons~pageB~pageC.js pageC.js -chunk {0} pageA.js (pageA) 165 bytes ={1}= ={2}= [entry] [rendered] - > ./pageA pageA - [0] ./pageA.js 137 bytes {0} [built] - single entry ./pageA pageA - [2] ./utility1.js 28 bytes {0} [built] - cjs require ./utility1 [0] ./pageA.js 2:15-36 -chunk {1} vendor.js (vendor) 54 bytes ={0}= ={2}= ={3}= ={4}= [initial] [rendered] split chunk (cache group: vendor) (name: vendor) - > ./pageA pageA - > ./pageB pageB - 2 modules -chunk {2} commons~pageA~pageB~pageC.js (commons~pageA~pageB~pageC) 28 bytes ={0}= ={1}= ={3}= ={4}= ={5}= [initial] [rendered] split chunk (cache group: commons) (name: commons~pageA~pageB~pageC) - > ./pageA pageA - > ./pageB pageB - > ./pageC pageC - [3] ./utility2.js 28 bytes {2} [built] - cjs require ./utility2 [0] ./pageA.js 3:15-36 - cjs require ./utility2 [4] ./pageB.js 2:15-36 - cjs require ./utility2 [7] ./pageC.js 1:15-36 -chunk {3} pageB.js (pageB) 137 bytes ={1}= ={2}= ={4}= [entry] [rendered] - > ./pageB pageB - [4] ./pageB.js 137 bytes {3} [built] - single entry ./pageB pageB -chunk {4} commons~pageB~pageC.js (commons~pageB~pageC) 28 bytes ={1}= ={2}= ={3}= ={5}= [initial] [rendered] split chunk (cache group: commons) (name: commons~pageB~pageC) - > ./pageB pageB - > ./pageC pageC - [6] ./utility3.js 28 bytes {4} [built] - cjs require ./utility3 [4] ./pageB.js 3:15-36 - cjs require ./utility3 [7] ./pageC.js 2:15-36 -chunk {5} pageC.js (pageC) 102 bytes ={2}= ={4}= [entry] [rendered] - > ./pageC pageC - [7] ./pageC.js 102 bytes {5} [built] - single entry ./pageC pageC +assets by chunk 768 bytes (id hint: commons) + asset commons-utility2_js.js 384 bytes [emitted] (id hint: commons) + asset commons-utility3_js.js 384 bytes [emitted] (id hint: commons) +asset pageA.js 6.07 KiB [emitted] (name: pageA) +asset pageB.js 5.8 KiB [emitted] (name: pageB) +asset pageC.js 5.74 KiB [emitted] (name: pageC) +asset vendor.js 737 bytes [emitted] (name: vendor) (id hint: vendor) +Entrypoint pageA 7.17 KiB = vendor.js 737 bytes commons-utility2_js.js 384 bytes pageA.js 6.07 KiB +Entrypoint pageB 7.27 KiB = vendor.js 737 bytes commons-utility2_js.js 384 bytes commons-utility3_js.js 384 bytes pageB.js 5.8 KiB +Entrypoint pageC 6.49 KiB = commons-utility2_js.js 384 bytes commons-utility3_js.js 384 bytes pageC.js 5.74 KiB +chunk (runtime: pageA, pageB, pageC) commons-utility2_js.js (id hint: commons) 28 bytes [initial] [rendered] split chunk (cache group: commons) + > ./pageA pageA + > ./pageB pageB + > ./pageC pageC + ./utility2.js 28 bytes [built] [code generated] + [used exports unknown] + cjs require ./utility2 ./pageA.js 3:15-36 + cjs require ./utility2 ./pageB.js 2:15-36 + cjs require ./utility2 ./pageC.js 1:15-36 + cjs self exports reference ./utility2.js 1:0-14 +chunk (runtime: pageB, pageC) commons-utility3_js.js (id hint: commons) 28 bytes [initial] [rendered] split chunk (cache group: commons) + > ./pageB pageB + > ./pageC pageC + ./utility3.js 28 bytes [built] [code generated] + [used exports unknown] + cjs require ./utility3 ./pageB.js 3:15-36 + cjs require ./utility3 ./pageC.js 2:15-36 + cjs self exports reference ./utility3.js 1:0-14 +chunk (runtime: pageA) pageA.js (pageA) 165 bytes (javascript) 2.46 KiB (runtime) [entry] [rendered] + > ./pageA pageA + runtime modules 2.46 KiB 3 modules + dependent modules 28 bytes [dependent] 1 module + ./pageA.js 137 bytes [built] [code generated] + [used exports unknown] + cjs self exports reference ./pageA.js 5:0-14 + entry ./pageA pageA +chunk (runtime: pageB) pageB.js (pageB) 137 bytes (javascript) 2.46 KiB (runtime) [entry] [rendered] + > ./pageB pageB + runtime modules 2.46 KiB 3 modules + ./pageB.js 137 bytes [built] [code generated] + [used exports unknown] + cjs self exports reference ./pageB.js 5:0-14 + entry ./pageB pageB +chunk (runtime: pageC) pageC.js (pageC) 102 bytes (javascript) 2.46 KiB (runtime) [entry] [rendered] + > ./pageC pageC + runtime modules 2.46 KiB 3 modules + ./pageC.js 102 bytes [built] [code generated] + [used exports unknown] + cjs self exports reference ./pageC.js 4:0-14 + entry ./pageC pageC +chunk (runtime: pageA, pageB) vendor.js (vendor) (id hint: vendor) 54 bytes [initial] [rendered] split chunk (cache group: vendor) (name: vendor) + > ./pageA pageA + > ./pageB pageB + ./node_modules/vendor1.js 27 bytes [built] [code generated] + [used exports unknown] + cjs self exports reference ./node_modules/vendor1.js 1:0-14 + cjs require vendor1 ./pageA.js 1:14-32 + ./node_modules/vendor2.js 27 bytes [built] [code generated] + [used exports unknown] + cjs self exports reference ./node_modules/vendor2.js 1:0-14 + cjs require vendor2 ./pageB.js 1:14-32 +webpack X.X.X compiled successfully ``` ## Production mode ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -commons~pageA~pageB~pageC.js 96 bytes 0 [emitted] commons~pageA~pageB~pageC - commons~pageB~pageC.js 97 bytes 1 [emitted] commons~pageB~pageC - pageA.js 1.52 KiB 3 [emitted] pageA - pageB.js 1.49 KiB 4 [emitted] pageB - pageC.js 1.48 KiB 5 [emitted] pageC - vendor.js 134 bytes 2 [emitted] vendor -Entrypoint pageA = vendor.js commons~pageA~pageB~pageC.js pageA.js -Entrypoint pageB = vendor.js commons~pageA~pageB~pageC.js commons~pageB~pageC.js pageB.js -Entrypoint pageC = commons~pageA~pageB~pageC.js commons~pageB~pageC.js pageC.js -chunk {0} commons~pageA~pageB~pageC.js (commons~pageA~pageB~pageC) 28 bytes ={1}= ={2}= ={3}= ={4}= ={5}= [initial] [rendered] split chunk (cache group: commons) (name: commons~pageA~pageB~pageC) - > ./pageA pageA - > ./pageB pageB - > ./pageC pageC - [0] ./utility2.js 28 bytes {0} [built] - cjs require ./utility2 [2] ./pageA.js 3:15-36 - cjs require ./utility2 [5] ./pageB.js 2:15-36 - cjs require ./utility2 [7] ./pageC.js 1:15-36 -chunk {1} commons~pageB~pageC.js (commons~pageB~pageC) 28 bytes ={0}= ={2}= ={4}= ={5}= [initial] [rendered] split chunk (cache group: commons) (name: commons~pageB~pageC) - > ./pageB pageB - > ./pageC pageC - [1] ./utility3.js 28 bytes {1} [built] - cjs require ./utility3 [5] ./pageB.js 3:15-36 - cjs require ./utility3 [7] ./pageC.js 2:15-36 -chunk {2} vendor.js (vendor) 54 bytes ={0}= ={1}= ={3}= ={4}= [initial] [rendered] split chunk (cache group: vendor) (name: vendor) - > ./pageA pageA - > ./pageB pageB - 2 modules -chunk {3} pageA.js (pageA) 165 bytes ={0}= ={2}= [entry] [rendered] - > ./pageA pageA - [2] ./pageA.js 137 bytes {3} [built] - single entry ./pageA pageA - [4] ./utility1.js 28 bytes {3} [built] - cjs require ./utility1 [2] ./pageA.js 2:15-36 -chunk {4} pageB.js (pageB) 137 bytes ={0}= ={1}= ={2}= [entry] [rendered] - > ./pageB pageB - [5] ./pageB.js 137 bytes {4} [built] - single entry ./pageB pageB -chunk {5} pageC.js (pageC) 102 bytes ={0}= ={1}= [entry] [rendered] - > ./pageC pageC - [7] ./pageC.js 102 bytes {5} [built] - single entry ./pageC pageC +assets by chunk 212 bytes (id hint: commons) + asset commons-utility2_js.js 106 bytes [emitted] [minimized] (id hint: commons) + asset commons-utility3_js.js 106 bytes [emitted] [minimized] (id hint: commons) +asset pageA.js 1 KiB [emitted] [minimized] (name: pageA) +asset pageB.js 1020 bytes [emitted] [minimized] (name: pageB) +asset pageC.js 1010 bytes [emitted] [minimized] (name: pageC) +asset vendor.js 121 bytes [emitted] [minimized] (name: vendor) (id hint: vendor) +Entrypoint pageA 1.22 KiB = vendor.js 121 bytes commons-utility2_js.js 106 bytes pageA.js 1 KiB +Entrypoint pageB 1.32 KiB = vendor.js 121 bytes commons-utility2_js.js 106 bytes commons-utility3_js.js 106 bytes pageB.js 1020 bytes +Entrypoint pageC 1.19 KiB = commons-utility2_js.js 106 bytes commons-utility3_js.js 106 bytes pageC.js 1010 bytes +chunk (runtime: pageA, pageB, pageC) commons-utility2_js.js (id hint: commons) 28 bytes [initial] [rendered] split chunk (cache group: commons) + > ./pageA pageA + > ./pageB pageB + > ./pageC pageC + ./utility2.js 28 bytes [built] [code generated] + [used exports unknown] + cjs require ./utility2 ./pageA.js 3:15-36 + cjs require ./utility2 ./pageB.js 2:15-36 + cjs require ./utility2 ./pageC.js 1:15-36 + cjs self exports reference ./utility2.js 1:0-14 +chunk (runtime: pageB, pageC) commons-utility3_js.js (id hint: commons) 28 bytes [initial] [rendered] split chunk (cache group: commons) + > ./pageB pageB + > ./pageC pageC + ./utility3.js 28 bytes [built] [code generated] + [used exports unknown] + cjs require ./utility3 ./pageB.js 3:15-36 + cjs require ./utility3 ./pageC.js 2:15-36 + cjs self exports reference ./utility3.js 1:0-14 +chunk (runtime: pageA) pageA.js (pageA) 165 bytes (javascript) 2.46 KiB (runtime) [entry] [rendered] + > ./pageA pageA + runtime modules 2.46 KiB 3 modules + dependent modules 28 bytes [dependent] 1 module + ./pageA.js 137 bytes [built] [code generated] + [used exports unknown] + cjs self exports reference ./pageA.js 5:0-14 + entry ./pageA pageA +chunk (runtime: pageB) pageB.js (pageB) 137 bytes (javascript) 2.46 KiB (runtime) [entry] [rendered] + > ./pageB pageB + runtime modules 2.46 KiB 3 modules + ./pageB.js 137 bytes [built] [code generated] + [used exports unknown] + cjs self exports reference ./pageB.js 5:0-14 + entry ./pageB pageB +chunk (runtime: pageC) pageC.js (pageC) 102 bytes (javascript) 2.46 KiB (runtime) [entry] [rendered] + > ./pageC pageC + runtime modules 2.46 KiB 3 modules + ./pageC.js 102 bytes [built] [code generated] + [used exports unknown] + cjs self exports reference ./pageC.js 4:0-14 + entry ./pageC pageC +chunk (runtime: pageA, pageB) vendor.js (vendor) (id hint: vendor) 54 bytes [initial] [rendered] split chunk (cache group: vendor) (name: vendor) + > ./pageA pageA + > ./pageB pageB + ./node_modules/vendor1.js 27 bytes [built] [code generated] + [used exports unknown] + cjs self exports reference ./node_modules/vendor1.js 1:0-14 + cjs require vendor1 ./pageA.js 1:14-32 + ./node_modules/vendor2.js 27 bytes [built] [code generated] + [used exports unknown] + cjs self exports reference ./node_modules/vendor2.js 1:0-14 + cjs require vendor2 ./pageB.js 1:14-32 +webpack X.X.X compiled successfully ``` diff --git a/examples/common-chunk-and-vendor-chunk/template.md b/examples/common-chunk-and-vendor-chunk/template.md index bc7f590c76a..64de9808254 100644 --- a/examples/common-chunk-and-vendor-chunk/template.md +++ b/examples/common-chunk-and-vendor-chunk/template.md @@ -33,44 +33,44 @@ With this bundle configuration, you would load your third party libraries, then # webpack.config.js -``` javascript -{{webpack.config.js}} +```javascript +_{{webpack.config.js}}_ ``` # dist/vendor.js -``` javascript -{{dist/vendor.js}} +```javascript +_{{dist/vendor.js}}_ ``` -# dist/commons~pageA~pageB~pageC.js +# dist/commons-utility2_js.js ``` javascript -{{dist/commons~pageA~pageB~pageC.js}} +_{{dist/commons-utility2_js.js}}_ ``` -# dist/commons~pageB~pageC.js +# dist/commons-utility3_js.js ``` javascript -{{dist/commons~pageB~pageC.js}} +_{{dist/commons-utility3_js.js}}_ ``` # dist/pageA.js -``` javascript -{{dist/pageA.js}} +```javascript +_{{dist/pageA.js}}_ ``` # dist/pageB.js -``` javascript -{{dist/pageB.js}} +```javascript +_{{dist/pageB.js}}_ ``` # dist/pageC.js -``` javascript -{{dist/pageC.js}} +```javascript +_{{dist/pageC.js}}_ ``` # Info @@ -78,11 +78,11 @@ With this bundle configuration, you would load your third party libraries, then ## Unoptimized ``` -{{stdout}} +_{{stdout}}_ ``` ## Production mode ``` -{{production:stdout}} +_{{production:stdout}}_ ``` diff --git a/examples/common-chunk-and-vendor-chunk/webpack.config.js b/examples/common-chunk-and-vendor-chunk/webpack.config.js index 2cdc9599bf9..e28ea6b8f53 100644 --- a/examples/common-chunk-and-vendor-chunk/webpack.config.js +++ b/examples/common-chunk-and-vendor-chunk/webpack.config.js @@ -1,4 +1,4 @@ -var path = require("path"); +const path = require("path"); module.exports = { // mode: "development" || "production", @@ -8,6 +8,7 @@ module.exports = { pageC: "./pageC" }, optimization: { + chunkIds: "named", splitChunks: { cacheGroups: { commons: { diff --git a/examples/common-chunk-grandchildren/README.md b/examples/common-chunk-grandchildren/README.md index e124a228233..0942b2db45b 100644 --- a/examples/common-chunk-grandchildren/README.md +++ b/examples/common-chunk-grandchildren/README.md @@ -1,28 +1,27 @@ This example illustrates how common modules from deep ancestors of an entry point can be split into a separate common chunk -* `pageA` and `pageB` are dynamically required -* `pageC` and `pageA` both require the `reusableComponent` -* `pageB` dynamically requires `PageC` +- `pageA` and `pageB` are dynamically required +- `pageC` and `pageA` both require the `reusableComponent` +- `pageB` dynamically requires `PageC` You can see that webpack outputs five files/chunks: -* `output.js` is the entry chunk and contains - * the module system - * chunk loading logic - * the entry point `example.js` -* `0.output.js` is an additional chunk - * module `reusableComponent` -* `1.output.js` is an additional chunk - * module `pageB` -* `2.output.js` is an additional chunk - * module `pageA` -* `3.output.js` is an additional chunk - * module `pageC` - +- `output.js` is the entry chunk and contains + - the module system + - chunk loading logic + - the entry point `example.js` +- `0.output.js` is an additional chunk + - module `reusableComponent` +- `1.output.js` is an additional chunk + - module `pageB` +- `2.output.js` is an additional chunk + - module `pageA` +- `3.output.js` is an additional chunk + - module `pageC` # example.js -``` javascript +```javascript var main = function() { console.log("Main class"); require.ensure([], () => { @@ -40,7 +39,7 @@ main(); # pageA.js -``` javascript +```javascript var reusableComponent = require("./reusableComponent"); module.exports = function() { @@ -51,7 +50,7 @@ module.exports = function() { # pageB.js -``` javascript +```javascript module.exports = function() { console.log("Page B"); require.ensure([], ()=>{ @@ -63,7 +62,7 @@ module.exports = function() { # pageC.js -``` javascript +```javascript var reusableComponent = require("./reusableComponent"); module.exports = function() { @@ -74,7 +73,7 @@ module.exports = function() { # reusableComponent.js -``` javascript +```javascript module.exports = function() { console.log("reusable Component"); }; @@ -82,12 +81,12 @@ module.exports = function() { # webpack.config.js -``` javascript +```javascript "use strict"; const path = require("path"); module.exports = { - // mode: "development || "production", + // mode: "development" || "production", entry: { main: ["./example.js"] }, @@ -95,7 +94,7 @@ module.exports = { splitChunks: { minSize: 0 // This example is too small, in practice you can use the defaults }, - occurrenceOrder: true // To keep filename consistent between different modes (for example building only) + chunkIds: "named" // To keep filename consistent between different modes (for example building only) }, output: { path: path.resolve(__dirname, "dist"), @@ -106,285 +105,255 @@ module.exports = { # dist/output.js -
/******/ (function(modules) { /* webpackBootstrap */ }) - -``` javascript -/******/ (function(modules) { // webpackBootstrap -/******/ // install a JSONP callback for chunk loading -/******/ function webpackJsonpCallback(data) { -/******/ var chunkIds = data[0]; -/******/ var moreModules = data[1]; -/******/ -/******/ -/******/ // add "moreModules" to the modules object, -/******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0, resolves = []; -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(installedChunks[chunkId]) { -/******/ resolves.push(installedChunks[chunkId][0]); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } -/******/ for(moduleId in moreModules) { -/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { -/******/ modules[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(parentJsonpFunction) parentJsonpFunction(data); -/******/ -/******/ while(resolves.length) { -/******/ resolves.shift()(); -/******/ } -/******/ -/******/ }; -/******/ -/******/ +```javascript +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({}); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ /******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // Promise = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ 1: 0 -/******/ }; -/******/ -/******/ -/******/ -/******/ // script path function -/******/ function jsonpScriptSrc(chunkId) { -/******/ return __webpack_require__.p + "" + chunkId + ".output.js" -/******/ } -/******/ +/******/ var __webpack_module_cache__ = {}; +/******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { -/******/ /******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed /******/ exports: {} /******/ }; -/******/ +/******/ /******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } -/******/ -/******/ // This file contains only the entry chunk. -/******/ // The chunk loading function for additional chunks -/******/ __webpack_require__.e = function requireEnsure(chunkId) { -/******/ var promises = []; -/******/ -/******/ -/******/ // JSONP chunk loading for javascript -/******/ -/******/ var installedChunkData = installedChunks[chunkId]; -/******/ if(installedChunkData !== 0) { // 0 means "already installed". -/******/ -/******/ // a Promise means "currently loading". -/******/ if(installedChunkData) { -/******/ promises.push(installedChunkData[2]); -/******/ } else { -/******/ // setup Promise in chunk cache -/******/ var promise = new Promise(function(resolve, reject) { -/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject]; -/******/ }); -/******/ promises.push(installedChunkData[2] = promise); -/******/ -/******/ // start chunk loading -/******/ var script = document.createElement('script'); -/******/ var onScriptComplete; -/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".output.js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ // data-webpack is not used as build has no uniqueName +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ /******/ script.charset = 'utf-8'; /******/ script.timeout = 120; /******/ if (__webpack_require__.nc) { /******/ script.setAttribute("nonce", __webpack_require__.nc); /******/ } -/******/ script.src = jsonpScriptSrc(chunkId); -/******/ -/******/ onScriptComplete = function (event) { -/******/ // avoid mem leaks in IE. -/******/ script.onerror = script.onload = null; -/******/ clearTimeout(timeout); -/******/ var chunk = installedChunks[chunkId]; -/******/ if(chunk !== 0) { -/******/ if(chunk) { -/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); -/******/ var realSrc = event && event.target && event.target.src; -/******/ var error = new Error('Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'); -/******/ error.type = errorType; -/******/ error.request = realSrc; -/******/ chunk[1](error); +/******/ +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "dist/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "main": 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // JSONP chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if(true) { // all chunks have JS +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ installedChunkData[1](error); +/******/ } +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); /******/ } -/******/ installedChunks[chunkId] = undefined; /******/ } -/******/ }; -/******/ var timeout = setTimeout(function(){ -/******/ onScriptComplete({ type: 'timeout', target: script }); -/******/ }, 120000); -/******/ script.onerror = script.onload = onScriptComplete; -/******/ document.head.appendChild(script); +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ // no on chunks loaded +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); /******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ /******/ } -/******/ return Promise.all(promises); -/******/ }; -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ // on error function for async loading -/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; -/******/ -/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; -/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); -/******/ jsonpArray.push = webpackJsonpCallback; -/******/ jsonpArray = jsonpArray.slice(); -/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); -/******/ var parentJsonpFunction = oldJsonpFunction; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); -/******/ }) +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ /************************************************************************/ ```
-``` javascript -/******/ ([ -/* 0 */ -/*!**************************!*\ - !*** multi ./example.js ***! - \**************************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(/*! ./example.js */1); - - -/***/ }), -/* 1 */ +``` js /*!********************!*\ !*** ./example.js ***! \********************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: __webpack_require__, __webpack_require__.e, __webpack_require__.* */ var main = function() { console.log("Main class"); - Promise.all(/*! require.ensure */[__webpack_require__.e(0), __webpack_require__.e(2)]).then((() => { - const page = __webpack_require__(/*! ./pageA */ 2); + Promise.all(/*! require.ensure */[__webpack_require__.e("reusableComponent_js"), __webpack_require__.e("pageA_js")]).then((() => { + const page = __webpack_require__(/*! ./pageA */ 1); page(); - }).bind(null, __webpack_require__)).catch(__webpack_require__.oe); - __webpack_require__.e(/*! require.ensure */ 3).then((() => { + }).bind(null, __webpack_require__))['catch'](__webpack_require__.oe); + __webpack_require__.e(/*! require.ensure */ "pageB_js").then((() => { const page = __webpack_require__(/*! ./pageB */ 3); page(); - }).bind(null, __webpack_require__)).catch(__webpack_require__.oe); + }).bind(null, __webpack_require__))['catch'](__webpack_require__.oe); }; main(); - -/***/ }) -/******/ ]); +/******/ })() +; ``` -# dist/0.output.js +# dist/pageA_js.output.js -``` javascript -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[0],{ - -/***/ 4: -/*!******************************!*\ - !*** ./reusableComponent.js ***! - \******************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = function() { - console.log("reusable Component"); -}; - - -/***/ }) - -}]); -``` - -# dist/2.output.js - -``` javascript -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[2],{ - -/***/ 2: +```javascript +(self["webpackChunk"] = self["webpackChunk"] || []).push([["pageA_js"],[ +/* 0 */, +/* 1 */ /*!******************!*\ !*** ./pageA.js ***! \******************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module, __webpack_require__ */ +/*! CommonJS bailout: module.exports is used directly at 3:0-14 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { -var reusableComponent = __webpack_require__(/*! ./reusableComponent */ 4); +var reusableComponent = __webpack_require__(/*! ./reusableComponent */ 2); module.exports = function() { console.log("Page A"); @@ -393,28 +362,29 @@ module.exports = function() { /***/ }) - -}]); +]]); ``` -# dist/3.output.js +# dist/pageB_js.output.js -``` javascript -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[3],{ +```javascript +(self["webpackChunk"] = self["webpackChunk"] || []).push([["pageB_js"],{ /***/ 3: /*!******************!*\ !*** ./pageB.js ***! \******************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module, __webpack_require__, __webpack_require__.e, __webpack_require__.* */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { module.exports = function() { console.log("Page B"); - Promise.all(/*! require.ensure */[__webpack_require__.e(0), __webpack_require__.e(4)]).then((()=>{ - const page = __webpack_require__(/*! ./pageC */ 5); + Promise.all(/*! require.ensure */[__webpack_require__.e("reusableComponent_js"), __webpack_require__.e("pageC_js")]).then((()=>{ + const page = __webpack_require__(/*! ./pageC */ 4); page(); - }).bind(null, __webpack_require__)).catch(__webpack_require__.oe); + }).bind(null, __webpack_require__))['catch'](__webpack_require__.oe); }; @@ -423,19 +393,21 @@ module.exports = function() { }]); ``` -# dist/4.output.js +# dist/pageC_js.output.js -``` javascript -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[4],{ +```javascript +(self["webpackChunk"] = self["webpackChunk"] || []).push([["pageC_js"],{ -/***/ 5: +/***/ 4: /*!******************!*\ !*** ./pageC.js ***! \******************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module, __webpack_require__ */ +/*! CommonJS bailout: module.exports is used directly at 3:0-14 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { -var reusableComponent = __webpack_require__(/*! ./reusableComponent */ 4); +var reusableComponent = __webpack_require__(/*! ./reusableComponent */ 2); module.exports = function() { console.log("Page C"); @@ -443,6 +415,30 @@ module.exports = function() { }; +/***/ }) + +}]); +``` + +# dist/reusableComponent_js.output.js + +```javascript +(self["webpackChunk"] = self["webpackChunk"] || []).push([["reusableComponent_js"],{ + +/***/ 2: +/*!******************************!*\ + !*** ./reusableComponent.js ***! + \******************************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { + +module.exports = function() { + console.log("reusable Component"); +}; + + /***/ }) }]); @@ -453,75 +449,85 @@ module.exports = function() { ## Unoptimized ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -0.output.js 337 bytes 0 [emitted] -2.output.js 408 bytes 2 [emitted] -3.output.js 542 bytes 3 [emitted] -4.output.js 408 bytes 4 [emitted] - output.js 8.74 KiB 1 [emitted] main -Entrypoint main = output.js -chunk {0} 0.output.js 69 bytes <{1}> <{3}> ={2}= ={4}= [rendered] split chunk (cache group: default) - > [1] ./example.js 3:1-6:3 - > [3] ./pageB.js 3:1-6:3 - [4] ./reusableComponent.js 69 bytes {0} [built] - cjs require ./reusableComponent [2] ./pageA.js 1:24-54 - cjs require ./reusableComponent [5] ./pageC.js 1:24-54 -chunk {1} output.js (main) 248 bytes >{0}< >{2}< >{3}< [entry] [rendered] - > main - [0] multi ./example.js 28 bytes {1} [built] - multi entry - [1] ./example.js 220 bytes {1} [built] - single entry ./example.js [0] multi ./example.js main[0] -chunk {2} 2.output.js 136 bytes <{1}> ={0}= [rendered] - > [1] ./example.js 3:1-6:3 - [2] ./pageA.js 136 bytes {2} [built] - cjs require ./pageA [1] ./example.js 4:15-33 -chunk {3} 3.output.js 133 bytes <{1}> >{0}< >{4}< [rendered] - > [1] ./example.js 7:1-10:3 - [3] ./pageB.js 133 bytes {3} [built] - cjs require ./pageB [1] ./example.js 8:15-33 -chunk {4} 4.output.js 136 bytes <{3}> ={0}= [rendered] - > [3] ./pageB.js 3:1-6:3 - [5] ./pageC.js 136 bytes {4} [built] - cjs require ./pageC [3] ./pageB.js 4:15-33 +asset output.js 9.08 KiB [emitted] (name: main) +asset pageB_js.output.js 772 bytes [emitted] +asset pageA_js.output.js 565 bytes [emitted] +asset pageC_js.output.js 559 bytes [emitted] +asset reusableComponent_js.output.js 453 bytes [emitted] +chunk (runtime: main) output.js (main) 220 bytes (javascript) 4.94 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 4.94 KiB 6 modules + ./example.js 220 bytes [built] [code generated] + [used exports unknown] + entry ./example.js main +chunk (runtime: main) pageA_js.output.js 136 bytes [rendered] + > ./example.js 3:1-6:3 + ./pageA.js 136 bytes [built] [code generated] + [used exports unknown] + cjs require ./pageA ./example.js 4:15-33 + cjs self exports reference ./pageA.js 3:0-14 +chunk (runtime: main) pageB_js.output.js 133 bytes [rendered] + > ./example.js 7:1-10:3 + ./pageB.js 133 bytes [built] [code generated] + [used exports unknown] + cjs require ./pageB ./example.js 8:15-33 + cjs self exports reference ./pageB.js 1:0-14 +chunk (runtime: main) pageC_js.output.js 136 bytes [rendered] + > ./pageB.js 3:1-6:3 + ./pageC.js 136 bytes [built] [code generated] + [used exports unknown] + cjs require ./pageC ./pageB.js 4:15-33 + cjs self exports reference ./pageC.js 3:0-14 +chunk (runtime: main) reusableComponent_js.output.js 69 bytes [rendered] split chunk (cache group: default) + > ./example.js 3:1-6:3 + > ./pageB.js 3:1-6:3 + ./reusableComponent.js 69 bytes [built] [code generated] + [used exports unknown] + cjs require ./reusableComponent ./pageA.js 1:24-54 + cjs require ./reusableComponent ./pageC.js 1:24-54 + cjs self exports reference ./reusableComponent.js 1:0-14 +webpack X.X.X compiled successfully ``` ## Production mode ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -0.output.js 133 bytes 0 [emitted] -2.output.js 138 bytes 2 [emitted] -3.output.js 198 bytes 3 [emitted] -4.output.js 138 bytes 4 [emitted] - output.js 2.13 KiB 1 [emitted] main -Entrypoint main = output.js -chunk {0} 0.output.js 69 bytes <{1}> <{3}> ={2}= ={4}= [rendered] split chunk (cache group: default) - > [1] ./example.js 3:1-6:3 - > [3] ./pageB.js 3:1-6:3 - [4] ./reusableComponent.js 69 bytes {0} [built] - cjs require ./reusableComponent [2] ./pageA.js 1:24-54 - cjs require ./reusableComponent [5] ./pageC.js 1:24-54 -chunk {1} output.js (main) 248 bytes >{0}< >{2}< >{3}< [entry] [rendered] - > main - [0] multi ./example.js 28 bytes {1} [built] - multi entry - [1] ./example.js 220 bytes {1} [built] - single entry ./example.js [0] multi ./example.js main[0] -chunk {2} 2.output.js 136 bytes <{1}> ={0}= [rendered] - > [1] ./example.js 3:1-6:3 - [2] ./pageA.js 136 bytes {2} [built] - cjs require ./pageA [1] ./example.js 4:15-33 -chunk {3} 3.output.js 133 bytes <{1}> >{0}< >{4}< [rendered] - > [1] ./example.js 7:1-10:3 - [3] ./pageB.js 133 bytes {3} [built] - cjs require ./pageB [1] ./example.js 8:15-33 -chunk {4} 4.output.js 136 bytes <{3}> ={0}= [rendered] - > [3] ./pageB.js 3:1-6:3 - [5] ./pageC.js 136 bytes {4} [built] - cjs require ./pageC [3] ./pageB.js 4:15-33 +asset output.js 1.83 KiB [emitted] [minimized] (name: main) +asset pageB_js.output.js 231 bytes [emitted] [minimized] +asset reusableComponent_js.output.js 142 bytes [emitted] [minimized] +asset pageC_js.output.js 141 bytes [emitted] [minimized] +asset pageA_js.output.js 140 bytes [emitted] [minimized] +chunk (runtime: main) output.js (main) 220 bytes (javascript) 4.94 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 4.94 KiB 6 modules + ./example.js 220 bytes [built] [code generated] + [no exports used] + entry ./example.js main +chunk (runtime: main) pageA_js.output.js 136 bytes [rendered] + > ./example.js 3:1-6:3 + ./pageA.js 136 bytes [built] [code generated] + [used exports unknown] + cjs require ./pageA ./example.js 4:15-33 + cjs self exports reference ./pageA.js 3:0-14 +chunk (runtime: main) pageB_js.output.js 133 bytes [rendered] + > ./example.js 7:1-10:3 + ./pageB.js 133 bytes [built] [code generated] + [used exports unknown] + cjs require ./pageB ./example.js 8:15-33 + cjs self exports reference ./pageB.js 1:0-14 +chunk (runtime: main) pageC_js.output.js 136 bytes [rendered] + > ./pageB.js 3:1-6:3 + ./pageC.js 136 bytes [built] [code generated] + [used exports unknown] + cjs require ./pageC ./pageB.js 4:15-33 + cjs self exports reference ./pageC.js 3:0-14 +chunk (runtime: main) reusableComponent_js.output.js 69 bytes [rendered] split chunk (cache group: default) + > ./pageB.js 3:1-6:3 + > ./example.js 3:1-6:3 + ./reusableComponent.js 69 bytes [built] [code generated] + [used exports unknown] + cjs require ./reusableComponent ./pageA.js 1:24-54 + cjs require ./reusableComponent ./pageC.js 1:24-54 + cjs self exports reference ./reusableComponent.js 1:0-14 +webpack X.X.X compiled successfully ``` diff --git a/examples/common-chunk-grandchildren/template.md b/examples/common-chunk-grandchildren/template.md index 60d126f864f..7be73dfc7a9 100644 --- a/examples/common-chunk-grandchildren/template.md +++ b/examples/common-chunk-grandchildren/template.md @@ -1,89 +1,88 @@ This example illustrates how common modules from deep ancestors of an entry point can be split into a separate common chunk -* `pageA` and `pageB` are dynamically required -* `pageC` and `pageA` both require the `reusableComponent` -* `pageB` dynamically requires `PageC` +- `pageA` and `pageB` are dynamically required +- `pageC` and `pageA` both require the `reusableComponent` +- `pageB` dynamically requires `PageC` You can see that webpack outputs five files/chunks: -* `output.js` is the entry chunk and contains - * the module system - * chunk loading logic - * the entry point `example.js` -* `0.output.js` is an additional chunk - * module `reusableComponent` -* `1.output.js` is an additional chunk - * module `pageB` -* `2.output.js` is an additional chunk - * module `pageA` -* `3.output.js` is an additional chunk - * module `pageC` - +- `output.js` is the entry chunk and contains + - the module system + - chunk loading logic + - the entry point `example.js` +- `0.output.js` is an additional chunk + - module `reusableComponent` +- `1.output.js` is an additional chunk + - module `pageB` +- `2.output.js` is an additional chunk + - module `pageA` +- `3.output.js` is an additional chunk + - module `pageC` # example.js -``` javascript -{{example.js}} +```javascript +_{{example.js}}_ ``` # pageA.js -``` javascript -{{pageA.js}} +```javascript +_{{pageA.js}}_ ``` # pageB.js -``` javascript -{{pageB.js}} +```javascript +_{{pageB.js}}_ ``` # pageC.js -``` javascript -{{pageC.js}} +```javascript +_{{pageC.js}}_ ``` # reusableComponent.js -``` javascript -{{reusableComponent.js}} +```javascript +_{{reusableComponent.js}}_ ``` # webpack.config.js -``` javascript -{{webpack.config.js}} +```javascript +_{{webpack.config.js}}_ ``` # dist/output.js -``` javascript -{{dist/output.js}} +```javascript +_{{dist/output.js}}_ ``` -# dist/0.output.js +# dist/pageA_js.output.js -``` javascript -{{dist/0.output.js}} +```javascript +_{{dist/pageA_js.output.js}}_ ``` -# dist/2.output.js +# dist/pageB_js.output.js -``` javascript -{{dist/2.output.js}} +```javascript +_{{dist/pageB_js.output.js}}_ ``` -# dist/3.output.js +# dist/pageC_js.output.js -``` javascript -{{dist/3.output.js}} +```javascript +_{{dist/pageC_js.output.js}}_ ``` -# dist/4.output.js +# dist/reusableComponent_js.output.js -``` javascript -{{dist/4.output.js}} +```javascript +_{{dist/reusableComponent_js.output.js}}_ ``` # Info @@ -91,11 +90,11 @@ You can see that webpack outputs five files/chunks: ## Unoptimized ``` -{{stdout}} +_{{stdout}}_ ``` ## Production mode ``` -{{production:stdout}} +_{{production:stdout}}_ ``` diff --git a/examples/common-chunk-grandchildren/webpack.config.js b/examples/common-chunk-grandchildren/webpack.config.js index 189b94895b8..55aeb1408bf 100644 --- a/examples/common-chunk-grandchildren/webpack.config.js +++ b/examples/common-chunk-grandchildren/webpack.config.js @@ -2,7 +2,7 @@ const path = require("path"); module.exports = { - // mode: "development || "production", + // mode: "development" || "production", entry: { main: ["./example.js"] }, @@ -10,7 +10,7 @@ module.exports = { splitChunks: { minSize: 0 // This example is too small, in practice you can use the defaults }, - occurrenceOrder: true // To keep filename consistent between different modes (for example building only) + chunkIds: "named" // To keep filename consistent between different modes (for example building only) }, output: { path: path.resolve(__dirname, "dist"), diff --git a/examples/commonjs/README.md b/examples/commonjs/README.md index 1ca5c06e71b..b7a134c00ed 100644 --- a/examples/commonjs/README.md +++ b/examples/commonjs/README.md @@ -1,14 +1,14 @@ -This very simple example shows usage of CommonJS. +This is a simple example that shows the usage of CommonJS. The three files `example.js`, `increment.js` and `math.js` form a dependency chain. They use `require(dependency)` to declare dependencies. -You can see the output file that webpack creates by bundling them together in one file. Keep in mind that webpack adds comments to make reading this file easier. These comments are removed when minimizing the file. +You can see the output file that webpack creates by bundling them together in one file. Keep in mind that webpack add comments to make reading this file easier. These comments are removed when minimizing the file. -You can also see the info messages webpack prints to console (for both normal and minimized build). +You can also see the info messages that webpack prints to console (for both normal and minimized build). # example.js -``` javascript +```javascript const inc = require('./increment').increment; const a = 1; inc(a); // 2 @@ -16,7 +16,7 @@ inc(a); // 2 # increment.js -``` javascript +```javascript const add = require('./math').add; exports.increment = function(val) { return add(val, 1); @@ -25,7 +25,7 @@ exports.increment = function(val) { # math.js -``` javascript +```javascript exports.add = function() { var sum = 0, i = 0, args = arguments, l = args.length; while (i < l) { @@ -37,122 +37,21 @@ exports.add = function() { # dist/output.js -
/******/ (function(modules) { /* webpackBootstrap */ }) - -``` javascript -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); -/******/ }) -/************************************************************************/ -``` - -
- -``` javascript -/******/ ([ -/* 0 */ -/*!********************!*\ - !*** ./example.js ***! - \********************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -const inc = __webpack_require__(/*! ./increment */ 1).increment; -const a = 1; -inc(a); // 2 - - -/***/ }), +```javascript +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ([ +/* 0 */, /* 1 */ /*!**********************!*\ !*** ./increment.js ***! \**********************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/*! default exports */ +/*! export increment [provided] [no usage info] [missing usage info prevents renaming] */ +/*! other exports [not provided] [no usage info] */ +/*! runtime requirements: __webpack_require__, __webpack_exports__ */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -const add = __webpack_require__(/*! ./math */ 2).add; +const add = (__webpack_require__(/*! ./math */ 2).add); exports.increment = function(val) { return add(val, 1); }; @@ -163,8 +62,11 @@ exports.increment = function(val) { /*!*****************!*\ !*** ./math.js ***! \*****************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! default exports */ +/*! export add [provided] [no usage info] [missing usage info prevents renaming] */ +/*! other exports [not provided] [no usage info] */ +/*! runtime requirements: __webpack_exports__ */ +/***/ ((__unused_webpack_module, exports) => { exports.add = function() { var sum = 0, i = 0, args = arguments, l = args.length; @@ -175,7 +77,59 @@ exports.add = function() { }; /***/ }) -/******/ ]); +/******/ ]); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +``` + +
+ +``` js +var __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { +/*!********************!*\ + !*** ./example.js ***! + \********************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: __webpack_require__ */ +const inc = (__webpack_require__(/*! ./increment */ 1).increment); +const a = 1; +inc(a); // 2 + +})(); + +/******/ })() +; ``` # Info @@ -183,35 +137,25 @@ exports.add = function() { ## Unoptimized ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -output.js 4.4 KiB 0 [emitted] main -Entrypoint main = output.js -chunk {0} output.js (main) 326 bytes [entry] [rendered] - > ./example.js main - [0] ./example.js 72 bytes {0} [built] - single entry ./example.js main - [1] ./increment.js 98 bytes {0} [built] - cjs require ./increment [0] ./example.js 1:12-34 - [2] ./math.js 156 bytes {0} [built] - cjs require ./math [1] ./increment.js 1:12-29 +asset output.js 2.52 KiB [emitted] (name: main) +chunk (runtime: main) output.js (main) 326 bytes [entry] [rendered] + > ./example.js main + dependent modules 254 bytes [dependent] 2 modules + ./example.js 72 bytes [built] [code generated] + [used exports unknown] + entry ./example.js main +webpack X.X.X compiled successfully ``` ## Production mode ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -output.js 1.1 KiB 0 [emitted] main -Entrypoint main = output.js -chunk {0} output.js (main) 326 bytes [entry] [rendered] - > ./example.js main - [0] ./example.js 72 bytes {0} [built] - single entry ./example.js main - [1] ./increment.js 98 bytes {0} [built] - cjs require ./increment [0] ./example.js 1:12-34 - [2] ./math.js 156 bytes {0} [built] - cjs require ./math [1] ./increment.js 1:12-29 -``` \ No newline at end of file +asset output.js 310 bytes [emitted] [minimized] (name: main) +chunk (runtime: main) output.js (main) 326 bytes [entry] [rendered] + > ./example.js main + dependent modules 254 bytes [dependent] 2 modules + ./example.js 72 bytes [built] [code generated] + [no exports used] + entry ./example.js main +webpack X.X.X compiled successfully +``` diff --git a/examples/commonjs/template.md b/examples/commonjs/template.md index 5ed0539fc77..8fa7cf29052 100644 --- a/examples/commonjs/template.md +++ b/examples/commonjs/template.md @@ -1,33 +1,33 @@ -This very simple example shows usage of CommonJS. +This is a simple example that shows the usage of CommonJS. The three files `example.js`, `increment.js` and `math.js` form a dependency chain. They use `require(dependency)` to declare dependencies. -You can see the output file that webpack creates by bundling them together in one file. Keep in mind that webpack adds comments to make reading this file easier. These comments are removed when minimizing the file. +You can see the output file that webpack creates by bundling them together in one file. Keep in mind that webpack add comments to make reading this file easier. These comments are removed when minimizing the file. -You can also see the info messages webpack prints to console (for both normal and minimized build). +You can also see the info messages that webpack prints to console (for both normal and minimized build). # example.js -``` javascript -{{example.js}} +```javascript +_{{example.js}}_ ``` # increment.js -``` javascript -{{increment.js}} +```javascript +_{{increment.js}}_ ``` # math.js -``` javascript -{{math.js}} +```javascript +_{{math.js}}_ ``` # dist/output.js -``` javascript -{{dist/output.js}} +```javascript +_{{dist/output.js}}_ ``` # Info @@ -35,11 +35,11 @@ You can also see the info messages webpack prints to console (for both normal an ## Unoptimized ``` -{{stdout}} +_{{stdout}}_ ``` ## Production mode ``` -{{production:stdout}} -``` \ No newline at end of file +_{{production:stdout}}_ +``` diff --git a/examples/css/README.md b/examples/css/README.md new file mode 100644 index 00000000000..a78da27d1e6 --- /dev/null +++ b/examples/css/README.md @@ -0,0 +1,605 @@ +# example.js + +```javascript +import "./style.css"; +import "./style2.css"; +import { main } from "./style.module.css"; +import("./lazy-style.css"); + +document.getElementsByTagName("main")[0].className = main; +``` + +# style.css + +```javascript +@import "style-imported.css"; +@import "https://fonts.googleapis.com/css?family=Open+Sans"; + +body { + background: green; + font-family: "Open Sans"; +} +``` + +# dist/output.js + +```javascript +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */ +/*!***********************!*\ + !*** css ./style.css ***! + \***********************/ +/*! namespace exports */ +/*! exports [not provided] [no usage info] */ +/*! runtime requirements: module, has css modules */ +/***/ ((module) => { + + + +/***/ }), +/* 2 */, +/* 3 */, +/* 4 */, +/* 5 */ +/*!************************!*\ + !*** css ./style2.css ***! + \************************/ +/*! namespace exports */ +/*! exports [not provided] [no usage info] */ +/*! runtime requirements: module, has css modules */ +/***/ ((module) => { + + + +/***/ }), +/* 6 */ +/*!******************************!*\ + !*** css ./style.module.css ***! + \******************************/ +/*! namespace exports */ +/*! export large [provided] [no usage info] [missing usage info prevents renaming] */ +/*! export main [provided] [no usage info] [missing usage info prevents renaming] */ +/*! other exports [not provided] [no usage info] */ +/*! runtime requirements: module, __webpack_require__.r, has css modules, __webpack_require__.* */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +__webpack_require__.r(module.exports = { + "large": "--app-6-large", + "main": "app-6-main" +}); + +/***/ }) +/******/ ]); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get css chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.k = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".output.css"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".output.js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ var dataWebpackPrefix = "app:"; +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url || s.getAttribute("data-webpack") == dataWebpackPrefix + key) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ +/******/ script.charset = 'utf-8'; +/******/ script.timeout = 120; +/******/ if (__webpack_require__.nc) { +/******/ script.setAttribute("nonce", __webpack_require__.nc); +/******/ } +/******/ script.setAttribute("data-webpack", dataWebpackPrefix + key); +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "dist/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/css loading */ +/******/ (() => { +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ 0: 0 +/******/ }; +/******/ +/******/ var uniqueName = "app"; +/******/ var loadingAttribute = "data-webpack-loading"; +/******/ var loadStylesheet = (chunkId, url, done) => { +/******/ var link, needAttach, key = "chunk-" + chunkId; +/******/ +/******/ var links = document.getElementsByTagName("link"); +/******/ for(var i = 0; i < links.length; i++) { +/******/ var l = links[i]; +/******/ if(l.rel == "stylesheet" && (l.href == url || l.getAttribute("href") == url || l.getAttribute("data-webpack") == uniqueName + ":" + key)) { link = l; break; } +/******/ } +/******/ if(!done) return link; +/******/ +/******/ if(!link) { +/******/ needAttach = true; +/******/ link = document.createElement('link'); +/******/ link.charset = 'utf-8'; +/******/ if (__webpack_require__.nc) { +/******/ link.setAttribute("nonce", __webpack_require__.nc); +/******/ } +/******/ link.setAttribute("data-webpack", uniqueName + ":" + key); +/******/ +/******/ link.setAttribute(loadingAttribute, 1); +/******/ link.rel = "stylesheet"; +/******/ link.href = url; +/******/ } +/******/ var onLinkComplete = (prev, event) => { +/******/ link.onerror = link.onload = null; +/******/ link.removeAttribute(loadingAttribute); +/******/ clearTimeout(timeout); +/******/ if(event && event.type != "load") link.parentNode.removeChild(link) +/******/ done(event); +/******/ if(prev) return prev(event); +/******/ }; +/******/ if(link.getAttribute(loadingAttribute)) { +/******/ var timeout = setTimeout(onLinkComplete.bind(null, undefined, { type: 'timeout', target: link }), 120000); +/******/ link.onerror = onLinkComplete.bind(null, link.onerror); +/******/ link.onload = onLinkComplete.bind(null, link.onload); +/******/ } else onLinkComplete(undefined, { type: 'load', target: link }); +/******/ +/******/ +/******/ needAttach && document.head.appendChild(link); +/******/ return link; +/******/ }; +/******/ __webpack_require__.f.css = (chunkId, promises) => { +/******/ // css chunk loading +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if(true) { // all chunks have CSS +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.k(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ if(event.type !== "load") { +/******/ var errorType = event && event.type; +/******/ var realHref = event && event.target && event.target.href; +/******/ error.message = 'Loading css chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realHref + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realHref; +/******/ installedChunkData[1](error); +/******/ } else { +/******/ installedChunks[chunkId] = 0; +/******/ installedChunkData[0](); +/******/ } +/******/ } +/******/ } +/******/ }; +/******/ +/******/ loadStylesheet(chunkId, url, loadingEnded); +/******/ } else installedChunks[chunkId] = 0; +/******/ } +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ // no hmr +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ 0: 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // JSONP chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if(true) { // all chunks have JS +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ installedChunkData[1](error); +/******/ } +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); +/******/ } +/******/ } +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ // no on chunks loaded +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); +/******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ +/******/ } +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunkapp"] = self["webpackChunkapp"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ +/************************************************************************/ +``` + +
+ +``` js +var __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { +/*!********************!*\ + !*** ./example.js ***! + \********************/ +/*! namespace exports */ +/*! exports [not provided] [no usage info] */ +/*! runtime requirements: __webpack_require__, __webpack_require__.r, __webpack_exports__, __webpack_require__.e, __webpack_require__.* */ +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _style_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./style.css */ 1); +/* harmony import */ var _style2_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./style2.css */ 5); +/* harmony import */ var _style_module_css__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./style.module.css */ 6); + + + +__webpack_require__.e(/*! import() */ 1).then(__webpack_require__.bind(__webpack_require__, /*! ./lazy-style.css */ 7)); + +document.getElementsByTagName("main")[0].className = _style_module_css__WEBPACK_IMPORTED_MODULE_2__.main; + +})(); + +/******/ })() +; +``` + +# dist/output.css + +```javascript +/*!********************************************************************!*\ + !*** external "https://fonts.googleapis.com/css?family=Open+Sans" ***! + \********************************************************************/ +@import url("https://fonts.googleapis.com/css?family=Open+Sans"); +/*!********************************!*\ + !*** css ./style-imported.css ***! + \********************************/ +.img { + width: 150px; + height: 150px; + background: url(dist/89a353e9c515885abd8e.png); +} + +/*!***********************!*\ + !*** css ./style.css ***! + \***********************/ + +body { + background: green; + font-family: "Open Sans"; +} + +/*!************************!*\ + !*** css ./style2.css ***! + \************************/ +body { + background: red; +} + +/*!******************************!*\ + !*** css ./style.module.css ***! + \******************************/ +:root { + --app-6-large: 72px; +} + +.app-6-main { + font-size: var(--app-6-large); + color: darkblue; +} + +@media (min-width: 1024px) { + .app-6-main { + color: green; + } +} + +@supports (display: grid) { + .app-6-main { + display: grid + } +} +``` + +## production + +```javascript +@import url("https://fonts.googleapis.com/css?family=Open+Sans"); +.img { + width: 150px; + height: 150px; + background: url(dist/89a353e9c515885abd8e.png); +} + + +body { + background: green; + font-family: "Open Sans"; +} + +body { + background: red; +} + +:root { + --app-235-a: 72px; +} + +.app-235-i { + font-size: var(--app-235-a); + color: darkblue; +} + +@media (min-width: 1024px) { + .app-235-i { + color: green; + } +} + +@supports (display: grid) { + .app-235-i { + display: grid + } +} +``` + +# dist/1.output.css + +```javascript +/*!****************************!*\ + !*** css ./lazy-style.css ***! + \****************************/ +body { + color: blue; +} +``` + +# Info + +## Unoptimized + +``` +assets by path *.js 16.3 KiB + asset output.js 15.9 KiB [emitted] (name: main) + asset 1.output.js 357 bytes [emitted] +assets by path *.css 1.19 KiB + asset output.css 1.06 KiB [emitted] (name: main) + asset 1.output.css 125 bytes [emitted] +asset 89a353e9c515885abd8e.png 14.6 KiB [emitted] [immutable] [from: images/file.png] (auxiliary name: main) +Entrypoint main 17 KiB (14.6 KiB) = output.js 15.9 KiB output.css 1.06 KiB 1 auxiliary asset +chunk (runtime: main) output.js, output.css (main) 265 bytes (javascript) 454 bytes (css) 14.6 KiB (asset) 42 bytes (css-url) 42 bytes (css-import) 8.82 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 8.82 KiB 9 modules + dependent modules 14.6 KiB (asset) 42 bytes (css-url) 454 bytes (css) 89 bytes (javascript) 42 bytes (css-import) [dependent] 6 modules + ./example.js 176 bytes [built] [code generated] + [no exports] + [used exports unknown] + entry ./example.js main +chunk (runtime: main) 1.output.js, 1.output.css 1 bytes (javascript) 23 bytes (css) [rendered] + > ./lazy-style.css ./example.js 4:0-26 + css ./lazy-style.css 1 bytes (javascript) 23 bytes (css) [built] [code generated] + [no exports] + [used exports unknown] + import() ./lazy-style.css ./example.js 4:0-26 +webpack X.X.X compiled successfully +``` + +## Production mode + +``` +assets by path *.js 3.44 KiB + asset output.js 3.35 KiB [emitted] [minimized] (name: main) + asset 822.output.js 87 bytes [emitted] [minimized] +assets by path *.css 490 bytes + asset output.css 466 bytes [emitted] (name: main) + asset 822.output.css 24 bytes [emitted] +asset 89a353e9c515885abd8e.png 14.6 KiB [emitted] [immutable] [from: images/file.png] (auxiliary name: main) +Entrypoint main 3.81 KiB (14.6 KiB) = output.js 3.35 KiB output.css 466 bytes 1 auxiliary asset +chunk (runtime: main) output.js, output.css (main) 299 bytes (javascript) 454 bytes (css) 14.6 KiB (asset) 42 bytes (css-url) 42 bytes (css-import) 8.82 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 8.82 KiB 9 modules + dependent modules 14.6 KiB (asset) 42 bytes (css-url) 119 bytes (javascript) 279 bytes (css) 42 bytes (css-import) [dependent] 4 modules + cacheable modules 180 bytes (javascript) 175 bytes (css) + ./example.js + 2 modules 178 bytes [built] [code generated] + [no exports] + [no exports used] + entry ./example.js main + css ./style.css 1 bytes (javascript) 148 bytes (css) [built] [code generated] + [no exports] + [no exports used] + css ./style2.css 1 bytes (javascript) 27 bytes (css) [built] [code generated] + [no exports] + [no exports used] +chunk (runtime: main) 822.output.js, 822.output.css 1 bytes (javascript) 23 bytes (css) [rendered] + > ./lazy-style.css ./example.js 4:0-26 + css ./lazy-style.css 1 bytes (javascript) 23 bytes (css) [built] [code generated] + [no exports] + import() ./lazy-style.css ./example.js + 2 modules ./example.js 4:0-26 +webpack X.X.X compiled successfully +``` diff --git a/examples/web-worker/build.js b/examples/css/build.js similarity index 100% rename from examples/web-worker/build.js rename to examples/css/build.js diff --git a/examples/css/example.js b/examples/css/example.js new file mode 100644 index 00000000000..b44731310a8 --- /dev/null +++ b/examples/css/example.js @@ -0,0 +1,6 @@ +import "./style.css"; +import "./style2.css"; +import { main } from "./style.module.css"; +import("./lazy-style.css"); + +document.getElementsByTagName("main")[0].className = main; diff --git a/examples/css/images/file.png b/examples/css/images/file.png new file mode 100644 index 00000000000..fb53b9dedd3 Binary files /dev/null and b/examples/css/images/file.png differ diff --git a/examples/css/index.html b/examples/css/index.html new file mode 100644 index 00000000000..9b3f06397ab --- /dev/null +++ b/examples/css/index.html @@ -0,0 +1,10 @@ + + + + + +
Hello World
+

+ + + diff --git a/examples/css/lazy-style.css b/examples/css/lazy-style.css new file mode 100644 index 00000000000..36505138bc9 --- /dev/null +++ b/examples/css/lazy-style.css @@ -0,0 +1,3 @@ +body { + color: blue; +} diff --git a/examples/css/style-imported.css b/examples/css/style-imported.css new file mode 100644 index 00000000000..83989315ce2 --- /dev/null +++ b/examples/css/style-imported.css @@ -0,0 +1,5 @@ +.img { + width: 150px; + height: 150px; + background: url("./images/file.png"); +} diff --git a/examples/css/style.css b/examples/css/style.css new file mode 100644 index 00000000000..8b855420284 --- /dev/null +++ b/examples/css/style.css @@ -0,0 +1,7 @@ +@import "style-imported.css"; +@import "https://fonts.googleapis.com/css?family=Open+Sans"; + +body { + background: green; + font-family: "Open Sans"; +} diff --git a/examples/css/style.module.css b/examples/css/style.module.css new file mode 100644 index 00000000000..a788746a1a3 --- /dev/null +++ b/examples/css/style.module.css @@ -0,0 +1,20 @@ +:root { + --large: 72px; +} + +.main { + font-size: var(--large); + color: darkblue; +} + +@media (min-width: 1024px) { + .main { + color: green; + } +} + +@supports (display: grid) { + .main { + display: grid + } +} diff --git a/examples/css/style2.css b/examples/css/style2.css new file mode 100644 index 00000000000..f0d5b13bffd --- /dev/null +++ b/examples/css/style2.css @@ -0,0 +1,3 @@ +body { + background: red; +} diff --git a/examples/css/template.md b/examples/css/template.md new file mode 100644 index 00000000000..6dea2beb4e5 --- /dev/null +++ b/examples/css/template.md @@ -0,0 +1,49 @@ +# example.js + +```javascript +_{{example.js}}_ +``` + +# style.css + +```javascript +_{{style.css}}_ +``` + +# dist/output.js + +```javascript +_{{dist/output.js}}_ +``` + +# dist/output.css + +```javascript +_{{dist/output.css}}_ +``` + +## production + +```javascript +_{{production:dist/output.css}}_ +``` + +# dist/1.output.css + +```javascript +_{{dist/1.output.css}}_ +``` + +# Info + +## Unoptimized + +``` +_{{stdout}}_ +``` + +## Production mode + +``` +_{{production:stdout}}_ +``` diff --git a/examples/css/webpack.config.js b/examples/css/webpack.config.js new file mode 100644 index 00000000000..93ef7f910e6 --- /dev/null +++ b/examples/css/webpack.config.js @@ -0,0 +1,8 @@ +module.exports = { + output: { + uniqueName: "app" + }, + experiments: { + css: true + } +}; diff --git a/examples/custom-json-modules/README.md b/examples/custom-json-modules/README.md new file mode 100644 index 00000000000..98eddf55da7 --- /dev/null +++ b/examples/custom-json-modules/README.md @@ -0,0 +1,259 @@ +This is a simple example that shows the usage of a custom parser for json-modules. + +Toml, yaml and json5 files can be imported like other modules without toml-loader. + +# data.toml + +```toml +title = "TOML Example" + +[owner] +name = "Tom Preston-Werner" +organization = "GitHub" +bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." +dob = 1979-05-27T07:32:00Z +``` + +# data.yaml + +```yaml +title: YAML Example +owner: + name: Tom Preston-Werner + organization: GitHub + bio: |- + GitHub Cofounder & CEO + Likes tater tots and beer. + dob: 1979-05-27T07:32:00.000Z +``` + +# data.json5 + +```json5 +{ + // comment + title: "JSON5 Example", + owner: { + name: "Tom Preston-Werner", + organization: "GitHub", + bio: "GitHub Cofounder & CEO\n\ +Likes tater tots and beer.", + dob: "1979-05-27T07:32:00.000Z" + } +} +``` + +# example.js + +```javascript +import toml from "./data.toml"; +import yaml from "./data.yaml"; +import json from "./data.json5"; + +document.querySelector('#app').innerHTML = [toml, yaml, json].map(data => ` +

${data.title}

+
${data.owner.name}
+
${data.owner.organization}
+
${data.owner.bio}
+
${data.owner.dob}
+`).join('

'); +``` + +# webpack.config.js + +```javascript +const toml = require("toml"); +const json5 = require("json5"); +const yaml = require("yamljs"); + +module.exports = { + module: { + rules: [ + { + test: /\.toml$/, + type: "json", + parser: { + parse: toml.parse + } + }, + { + test: /\.json5$/, + type: "json", + parser: { + parse: json5.parse + } + }, + { + test: /\.yaml$/, + type: "json", + parser: { + parse: yaml.parse + } + } + ] + } +}; +``` + +# js/output.js + +```javascript +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */ +/*!*******************!*\ + !*** ./data.toml ***! + \*******************/ +/*! default exports */ +/*! export owner [provided] [no usage info] [missing usage info prevents renaming] */ +/*! export bio [provided] [no usage info] [missing usage info prevents renaming] */ +/*! export dob [provided] [no usage info] [missing usage info prevents renaming] */ +/*! exports [not provided] [no usage info] */ +/*! export name [provided] [no usage info] [missing usage info prevents renaming] */ +/*! export organization [provided] [no usage info] [missing usage info prevents renaming] */ +/*! other exports [not provided] [no usage info] */ +/*! export title [provided] [no usage info] [missing usage info prevents renaming] */ +/*! other exports [not provided] [no usage info] */ +/*! runtime requirements: module */ +/***/ ((module) => { + +module.exports = /*#__PURE__*/JSON.parse('{"title":"TOML Example","owner":{"name":"Tom Preston-Werner","organization":"GitHub","bio":"GitHub Cofounder & CEO\\nLikes tater tots and beer.","dob":"1979-05-27T07:32:00.000Z"}}'); + +/***/ }), +/* 2 */ +/*!*******************!*\ + !*** ./data.yaml ***! + \*******************/ +/*! default exports */ +/*! export owner [provided] [no usage info] [missing usage info prevents renaming] */ +/*! export bio [provided] [no usage info] [missing usage info prevents renaming] */ +/*! export dob [provided] [no usage info] [missing usage info prevents renaming] */ +/*! exports [not provided] [no usage info] */ +/*! export name [provided] [no usage info] [missing usage info prevents renaming] */ +/*! export organization [provided] [no usage info] [missing usage info prevents renaming] */ +/*! other exports [not provided] [no usage info] */ +/*! export title [provided] [no usage info] [missing usage info prevents renaming] */ +/*! other exports [not provided] [no usage info] */ +/*! runtime requirements: module */ +/***/ ((module) => { + +module.exports = /*#__PURE__*/JSON.parse('{"title":"YAML Example","owner":{"name":"Tom Preston-Werner","organization":"GitHub","bio":"GitHub Cofounder & CEO\\nLikes tater tots and beer.","dob":"1979-05-27T07:32:00.000Z"}}'); + +/***/ }), +/* 3 */ +/*!********************!*\ + !*** ./data.json5 ***! + \********************/ +/*! default exports */ +/*! export owner [provided] [no usage info] [missing usage info prevents renaming] */ +/*! export bio [provided] [no usage info] [missing usage info prevents renaming] */ +/*! export dob [provided] [no usage info] [missing usage info prevents renaming] */ +/*! export name [provided] [no usage info] [missing usage info prevents renaming] */ +/*! export organization [provided] [no usage info] [missing usage info prevents renaming] */ +/*! other exports [not provided] [no usage info] */ +/*! export title [provided] [no usage info] [missing usage info prevents renaming] */ +/*! other exports [not provided] [no usage info] */ +/*! runtime requirements: module */ +/***/ ((module) => { + +module.exports = /*#__PURE__*/JSON.parse('{"title":"JSON5 Example","owner":{"name":"Tom Preston-Werner","organization":"GitHub","bio":"GitHub Cofounder & CEO\\nLikes tater tots and beer.","dob":"1979-05-27T07:32:00.000Z"}}'); + +/***/ }) +/******/ ]); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +``` + +
+ +``` js +var __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { +/*!********************!*\ + !*** ./example.js ***! + \********************/ +/*! namespace exports */ +/*! exports [not provided] [no usage info] */ +/*! runtime requirements: __webpack_require__, __webpack_require__.r, __webpack_exports__, __webpack_require__.* */ +__webpack_require__.r(__webpack_exports__); +/* harmony import */ var _data_toml__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./data.toml */ 1); +/* harmony import */ var _data_yaml__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./data.yaml */ 2); +/* harmony import */ var _data_json5__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./data.json5 */ 3); + + + + +document.querySelector('#app').innerHTML = [_data_toml__WEBPACK_IMPORTED_MODULE_0__, _data_yaml__WEBPACK_IMPORTED_MODULE_1__, _data_json5__WEBPACK_IMPORTED_MODULE_2__].map(data => ` +

${data.title}

+
${data.owner.name}
+
${data.owner.organization}
+
${data.owner.bio}
+
${data.owner.dob}
+`).join('

'); + +})(); + +/******/ })() +; +``` + +# Info + +## webpack output + +``` +asset output.js 5.91 KiB [emitted] (name: main) +chunk (runtime: main) output.js (main) 919 bytes (javascript) 274 bytes (runtime) [entry] [rendered] + > ./example.js main + dependent modules 565 bytes [dependent] 3 modules + runtime modules 274 bytes 1 module + ./example.js 354 bytes [built] [code generated] + [no exports] + [used exports unknown] + entry ./example.js main +webpack X.X.X compiled successfully +``` diff --git a/examples/custom-json-modules/build.js b/examples/custom-json-modules/build.js new file mode 100644 index 00000000000..2e93fe5a3e1 --- /dev/null +++ b/examples/custom-json-modules/build.js @@ -0,0 +1 @@ +require("../build-common"); diff --git a/examples/custom-json-modules/data.json5 b/examples/custom-json-modules/data.json5 new file mode 100644 index 00000000000..37fb5e6f70e --- /dev/null +++ b/examples/custom-json-modules/data.json5 @@ -0,0 +1,11 @@ +{ + // comment + title: "JSON5 Example", + owner: { + name: "Tom Preston-Werner", + organization: "GitHub", + bio: "GitHub Cofounder & CEO\n\ +Likes tater tots and beer.", + dob: "1979-05-27T07:32:00.000Z" + } +} diff --git a/examples/custom-json-modules/data.toml b/examples/custom-json-modules/data.toml new file mode 100644 index 00000000000..bf6c9dd3363 --- /dev/null +++ b/examples/custom-json-modules/data.toml @@ -0,0 +1,7 @@ +title = "TOML Example" + +[owner] +name = "Tom Preston-Werner" +organization = "GitHub" +bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." +dob = 1979-05-27T07:32:00Z diff --git a/examples/custom-json-modules/data.yaml b/examples/custom-json-modules/data.yaml new file mode 100644 index 00000000000..d0b37096a12 --- /dev/null +++ b/examples/custom-json-modules/data.yaml @@ -0,0 +1,8 @@ +title: YAML Example +owner: + name: Tom Preston-Werner + organization: GitHub + bio: |- + GitHub Cofounder & CEO + Likes tater tots and beer. + dob: 1979-05-27T07:32:00.000Z diff --git a/examples/custom-json-modules/example.js b/examples/custom-json-modules/example.js new file mode 100644 index 00000000000..d628768fe9c --- /dev/null +++ b/examples/custom-json-modules/example.js @@ -0,0 +1,11 @@ +import toml from "./data.toml"; +import yaml from "./data.yaml"; +import json from "./data.json5"; + +document.querySelector('#app').innerHTML = [toml, yaml, json].map(data => ` +

${data.title}

+
${data.owner.name}
+
${data.owner.organization}
+
${data.owner.bio}
+
${data.owner.dob}
+`).join('

'); diff --git a/examples/custom-json-modules/index.html b/examples/custom-json-modules/index.html new file mode 100644 index 00000000000..8e22e079147 --- /dev/null +++ b/examples/custom-json-modules/index.html @@ -0,0 +1,6 @@ + + +
+ + + diff --git a/examples/custom-json-modules/template.md b/examples/custom-json-modules/template.md new file mode 100644 index 00000000000..5c5507d7d21 --- /dev/null +++ b/examples/custom-json-modules/template.md @@ -0,0 +1,47 @@ +This is a simple example that shows the usage of a custom parser for json-modules. + +Toml, yaml and json5 files can be imported like other modules without toml-loader. + +# data.toml + +```toml +_{{data.toml}}_ +``` + +# data.yaml + +```yaml +_{{data.yaml}}_ +``` + +# data.json5 + +```json5 +_{{data.json5}}_ +``` + +# example.js + +```javascript +_{{example.js}}_ +``` + +# webpack.config.js + +```javascript +_{{webpack.config.js}}_ +``` + +# js/output.js + +```javascript +_{{dist/output.js}}_ +``` + +# Info + +## webpack output + +``` +_{{stdout}}_ +``` diff --git a/examples/custom-json-modules/webpack.config.js b/examples/custom-json-modules/webpack.config.js new file mode 100644 index 00000000000..06d92d9232a --- /dev/null +++ b/examples/custom-json-modules/webpack.config.js @@ -0,0 +1,31 @@ +const toml = require("toml"); +const json5 = require("json5"); +const yaml = require("yamljs"); + +module.exports = { + module: { + rules: [ + { + test: /\.toml$/, + type: "json", + parser: { + parse: toml.parse + } + }, + { + test: /\.json5$/, + type: "json", + parser: { + parse: json5.parse + } + }, + { + test: /\.yaml$/, + type: "json", + parser: { + parse: yaml.parse + } + } + ] + } +}; diff --git a/examples/dll-app-and-vendor/0-vendor/README.md b/examples/dll-app-and-vendor/0-vendor/README.md index fd6777c78af..12f49127649 100644 --- a/examples/dll-app-and-vendor/0-vendor/README.md +++ b/examples/dll-app-and-vendor/0-vendor/README.md @@ -8,22 +8,22 @@ A manifest is created which includes mappings from module names to internal ids. ### webpack.config.js -``` javascript +```javascript var path = require("path"); var webpack = require("../../../"); module.exports = { - // mode: "development || "production", + // mode: "development" || "production", context: __dirname, entry: ["example-vendor"], output: { - filename: "vendor.js", // best use [hash] here too + filename: "vendor.js", // best use [fullhash] here too path: path.resolve(__dirname, "dist"), - library: "vendor_lib_[hash]" + library: "vendor_lib_[fullhash]" }, plugins: [ new webpack.DllPlugin({ - name: "vendor_lib_[hash]", + name: "vendor_lib_[fullhash]", path: path.resolve(__dirname, "dist/vendor-manifest.json") }) ] @@ -32,7 +32,7 @@ module.exports = { # example-vendor -``` javascript +```javascript export function square(n) { return n * n; } @@ -40,111 +40,17 @@ export function square(n) { # dist/vendor.js -``` javascript -var vendor_lib_04d3460d8b3b7c5ce19f = -``` -
/******/ (function(modules) { /* webpackBootstrap */ }) - -``` js -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); -/******/ }) -/************************************************************************/ -``` - -
- -``` js -/******/ ([ +```javascript +var vendor_lib_bef1463383efb1c65306; +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ([ /* 0 */ /*!****************!*\ !*** dll main ***! \****************/ -/*! no static exports found */ -/*! all exports used */ -/***/ (function(module, exports, __webpack_require__) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: __webpack_require__, module */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { module.exports = __webpack_require__; @@ -153,26 +59,104 @@ module.exports = __webpack_require__; /*!*****************************************!*\ !*** ../node_modules/example-vendor.js ***! \*****************************************/ -/*! exports provided: square */ -/*! all exports used */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/*! namespace exports */ +/*! export square [provided] [no usage info] [missing usage info prevents renaming] */ +/*! other exports [not provided] [no usage info] */ +/*! runtime requirements: __webpack_require__.r, __webpack_exports__, __webpack_require__.d, __webpack_require__.* */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "square", function() { return square; }); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ square: () => (/* binding */ square) +/* harmony export */ }); function square(n) { return n * n; } /***/ }) -/******/ ]); +/******/ ]); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/************************************************************************/ +``` + +
+ +``` js +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module doesn't tell about it's top-level declarations so it can't be inlined +/******/ var __webpack_exports__ = __webpack_require__(0); +/******/ vendor_lib_bef1463383efb1c65306 = __webpack_exports__; +/******/ +/******/ })() +; ``` # dist/vendor-manifest.json -``` javascript -{"name":"vendor_lib_04d3460d8b3b7c5ce19f","content":{"../node_modules/example-vendor.js":{"id":1,"buildMeta":{"exportsType":"namespace","providedExports":["square"]}}}} +```javascript +{"name":"vendor_lib_bef1463383efb1c65306","content":{"../node_modules/example-vendor.js":{"id":1,"buildMeta":{"exportsType":"namespace"},"exports":["square"]}}} ``` # Info @@ -180,32 +164,28 @@ function square(n) { ## Unoptimized ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -vendor.js 4.28 KiB 0 [emitted] main -Entrypoint main = vendor.js -chunk {0} vendor.js (main) 57 bytes [entry] [rendered] - > main - [0] dll main 12 bytes {0} [built] - dll entry - DllPlugin - + 1 hidden module +asset vendor.js 3.68 KiB [emitted] (name: main) +chunk (runtime: main) vendor.js (main) 57 bytes (javascript) 670 bytes (runtime) [entry] [rendered] + > main + runtime modules 670 bytes 3 modules + dependent modules 45 bytes [dependent] 1 module + dll main 12 bytes [built] [code generated] + [used exports unknown] + dll entry 0:0-0 + used as library export +webpack X.X.X compiled successfully ``` ## Production mode ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -vendor.js 1.06 KiB 0 [emitted] main -Entrypoint main = vendor.js -chunk {0} vendor.js (main) 57 bytes [entry] [rendered] - > main - [0] dll main 12 bytes {0} [built] - dll entry - DllPlugin - + 1 hidden module +asset vendor.js 653 bytes [emitted] [minimized] (name: main) +chunk (runtime: main) vendor.js (main) 57 bytes (javascript) 670 bytes (runtime) [entry] [rendered] + > main + runtime modules 670 bytes 3 modules + dependent modules 45 bytes [dependent] 1 module + dll main 12 bytes [built] [code generated] + dll entry 0:0-0 + used as library export +webpack X.X.X compiled successfully ``` - diff --git a/examples/dll-app-and-vendor/0-vendor/template.md b/examples/dll-app-and-vendor/0-vendor/template.md index 358db39d4c7..73abe44e338 100644 --- a/examples/dll-app-and-vendor/0-vendor/template.md +++ b/examples/dll-app-and-vendor/0-vendor/template.md @@ -8,26 +8,26 @@ A manifest is created which includes mappings from module names to internal ids. ### webpack.config.js -``` javascript -{{webpack.config.js}} +```javascript +_{{webpack.config.js}}_ ``` # example-vendor -``` javascript -{{../node_modules/example-vendor.js}} +```javascript +_{{../node_modules/example-vendor.js}}_ ``` # dist/vendor.js -``` javascript -{{dist/vendor.js}} +```javascript +_{{dist/vendor.js}}_ ``` # dist/vendor-manifest.json -``` javascript -{{dist/vendor-manifest.json}} +```javascript +_{{dist/vendor-manifest.json}}_ ``` # Info @@ -35,12 +35,11 @@ A manifest is created which includes mappings from module names to internal ids. ## Unoptimized ``` -{{stdout}} +_{{stdout}}_ ``` ## Production mode ``` -{{production:stdout}} +_{{production:stdout}}_ ``` - diff --git a/examples/dll-app-and-vendor/0-vendor/webpack.config.js b/examples/dll-app-and-vendor/0-vendor/webpack.config.js index ec5f19b19c2..5a9099cdb5c 100644 --- a/examples/dll-app-and-vendor/0-vendor/webpack.config.js +++ b/examples/dll-app-and-vendor/0-vendor/webpack.config.js @@ -2,17 +2,17 @@ var path = require("path"); var webpack = require("../../../"); module.exports = { - // mode: "development || "production", + // mode: "development" || "production", context: __dirname, entry: ["example-vendor"], output: { - filename: "vendor.js", // best use [hash] here too + filename: "vendor.js", // best use [fullhash] here too path: path.resolve(__dirname, "dist"), - library: "vendor_lib_[hash]" + library: "vendor_lib_[fullhash]" }, plugins: [ new webpack.DllPlugin({ - name: "vendor_lib_[hash]", + name: "vendor_lib_[fullhash]", path: path.resolve(__dirname, "dist/vendor-manifest.json") }) ] diff --git a/examples/dll-app-and-vendor/1-app/README.md b/examples/dll-app-and-vendor/1-app/README.md index aa16add3698..4ef1019bea1 100644 --- a/examples/dll-app-and-vendor/1-app/README.md +++ b/examples/dll-app-and-vendor/1-app/README.md @@ -4,7 +4,7 @@ The previously built vendor dll is used. The DllReferencePlugin reads the conten # webpack.config.js -``` javascript +```javascript var path = require("path"); var webpack = require("../../../"); @@ -18,7 +18,6 @@ module.exports = { }, plugins: [ new webpack.DllReferencePlugin({ - context: ".", manifest: require("../0-vendor/dist/vendor-manifest.json") // eslint-disable-line }) ] @@ -27,7 +26,7 @@ module.exports = { # example-app.js -``` javascript +```javascript import { square } from "example-vendor"; console.log(square(7)); @@ -36,7 +35,7 @@ console.log(new square(7)); # example.html -``` html +```html @@ -48,139 +47,106 @@ console.log(new square(7)); # dist/app.js -
/******/ (function(modules) { /* webpackBootstrap */ }) +```javascript +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */ +/*!******************************************************************************************************!*\ + !*** delegated ../node_modules/example-vendor.js from dll-reference vendor_lib_bef1463383efb1c65306 ***! + \******************************************************************************************************/ +/*! namespace exports */ +/*! export square [provided] [no usage info] [provision prevents renaming (no use info)] */ +/*! other exports [not provided] [no usage info] */ +/*! runtime requirements: module, __webpack_require__ */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +module.exports = (__webpack_require__(/*! dll-reference vendor_lib_bef1463383efb1c65306 */ 2))(1); + +/***/ }), +/* 2 */ +/*!**************************************************!*\ + !*** external "vendor_lib_bef1463383efb1c65306" ***! + \**************************************************/ +/*! dynamic exports */ +/*! exports [maybe provided (runtime-defined)] [no usage info] */ +/*! runtime requirements: module */ +/***/ ((module) => { -``` javascript -/******/ (function(modules) { // webpackBootstrap +"use strict"; +module.exports = vendor_lib_bef1463383efb1c65306; + +/***/ }) +/******/ ]); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ /******/ // The module cache -/******/ var installedModules = {}; -/******/ +/******/ var __webpack_module_cache__ = {}; +/******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { -/******/ /******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed /******/ exports: {} /******/ }; -/******/ +/******/ /******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); -/******/ }) +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ /************************************************************************/ ```
-``` javascript -/******/ ([ -/* 0 */ +``` js +var __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be in strict mode. +(() => { +"use strict"; /*!************************!*\ !*** ./example-app.js ***! \************************/ -/*! no exports provided */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; +/*! namespace exports */ +/*! exports [not provided] [no usage info] */ +/*! runtime requirements: __webpack_require__, __webpack_require__.r, __webpack_exports__, __webpack_require__.* */ __webpack_require__.r(__webpack_exports__); /* harmony import */ var example_vendor__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! example-vendor */ 1); -console.log(Object(example_vendor__WEBPACK_IMPORTED_MODULE_0__["square"])(7)); -console.log(new example_vendor__WEBPACK_IMPORTED_MODULE_0__["square"](7)); - - -/***/ }), -/* 1 */ -/*!******************************************************************************************************!*\ - !*** delegated ../node_modules/example-vendor.js from dll-reference vendor_lib_04d3460d8b3b7c5ce19f ***! - \******************************************************************************************************/ -/*! exports provided: square */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = (__webpack_require__(/*! dll-reference vendor_lib_04d3460d8b3b7c5ce19f */ 2))(1); - -/***/ }), -/* 2 */ -/*!**************************************************!*\ - !*** external "vendor_lib_04d3460d8b3b7c5ce19f" ***! - \**************************************************/ -/*! no static exports found */ -/***/ (function(module, exports) { +console.log((0,example_vendor__WEBPACK_IMPORTED_MODULE_0__.square)(7)); +console.log(new example_vendor__WEBPACK_IMPORTED_MODULE_0__.square(7)); -module.exports = vendor_lib_04d3460d8b3b7c5ce19f; +})(); -/***/ }) -/******/ ]); +/******/ })() +; ``` # Info @@ -188,45 +154,30 @@ module.exports = vendor_lib_04d3460d8b3b7c5ce19f; ## Unoptimized ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -app.js 4.86 KiB 0 [emitted] main -Entrypoint main = app.js -chunk {0} app.js (main) 178 bytes [entry] [rendered] - > ./example-app main - [0] ./example-app.js 94 bytes {0} [built] - [no exports] - single entry ./example-app main - [1] delegated ../node_modules/example-vendor.js from dll-reference vendor_lib_04d3460d8b3b7c5ce19f 42 bytes {0} [built] - [exports: square] - harmony side effect evaluation example-vendor [0] ./example-app.js 1:0-40 - harmony import specifier example-vendor [0] ./example-app.js 3:12-18 - harmony import specifier example-vendor [0] ./example-app.js 4:16-22 - [2] external "vendor_lib_04d3460d8b3b7c5ce19f" 42 bytes {0} [built] - delegated source dll-reference vendor_lib_04d3460d8b3b7c5ce19f [1] delegated ../node_modules/example-vendor.js from dll-reference vendor_lib_04d3460d8b3b7c5ce19f +asset app.js 3.44 KiB [emitted] (name: main) +chunk (runtime: main) app.js (main) 178 bytes (javascript) 274 bytes (runtime) [entry] [rendered] + > ./example-app main + dependent modules 84 bytes [dependent] 2 modules + runtime modules 274 bytes 1 module + ./example-app.js 94 bytes [built] [code generated] + [no exports] + [used exports unknown] + entry ./example-app main +webpack X.X.X compiled successfully ``` ## Production mode ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -app.js 1.09 KiB 0 [emitted] main -Entrypoint main = app.js -chunk {0} app.js (main) 178 bytes [entry] [rendered] - > ./example-app main - [0] delegated ../node_modules/example-vendor.js from dll-reference vendor_lib_04d3460d8b3b7c5ce19f 42 bytes {0} [built] - [exports: square] - harmony side effect evaluation example-vendor [1] ./example-app.js 1:0-40 - harmony import specifier example-vendor [1] ./example-app.js 3:12-18 - harmony import specifier example-vendor [1] ./example-app.js 4:16-22 - [1] ./example-app.js 94 bytes {0} [built] - [no exports] - single entry ./example-app main - [2] external "vendor_lib_04d3460d8b3b7c5ce19f" 42 bytes {0} [built] - delegated source dll-reference vendor_lib_04d3460d8b3b7c5ce19f [0] delegated ../node_modules/example-vendor.js from dll-reference vendor_lib_04d3460d8b3b7c5ce19f +asset app.js 331 bytes [emitted] [minimized] (name: main) +chunk (runtime: main) app.js (main) 178 bytes [entry] [rendered] + > ./example-app main + dependent modules 84 bytes [dependent] 2 modules + ./example-app.js 94 bytes [built] [code generated] + [no exports] + [no exports used] + entry ./example-app main +webpack X.X.X compiled successfully ``` +
+ + + + + + + + + + + + + + + +``` + +# src-b/Component.js + +```jsx +import React from "react"; +import { formatRelative, subDays } from "date-fns"; +// date-fns is a shared module, but used as usual +// exposing modules act as async boundary, +// so no additional async boundary need to be added here +// As data-fns is an shared module, it will be placed in a separate file +// It will be loaded in parallel to the code of this module + +const Component = ({ locale }) => ( +
+

I'm a Component exposed from container B!

+

+ Using date-fn in Remote:{" "} + {formatRelative(subDays(new Date(), 2), new Date(), { locale })} +

+
+); +export default Component; +``` + +# dist/aaa/app.js + +```javascript +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ 0: +/*!**********************!*\ + !*** ./src/index.js ***! + \**********************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: __webpack_require__.e, __webpack_require__, __webpack_require__.* */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +// Sharing modules requires that all remotes are initialized +// and can provide shared modules to the common scope +// As this is an async operation we need an async boundary (import()) + +// Using modules from remotes is also an async operation +// as chunks need to be loaded for the code of the remote module +// This also requires an async boundary (import()) + +// At this point shared modules initialized and remote modules are loaded +__webpack_require__.e(/*! import() */ "src_bootstrap_js").then(__webpack_require__.bind(__webpack_require__, /*! ./bootstrap */ 2)); + +// It's possible to place more code here to do stuff on page init +// but it can't use any of the shared modules or remote modules. + +/***/ }), + +/***/ 9: +/*!*********************************************!*\ + !*** external "mfeBBB@/dist/bbb/mfeBBB.js" ***! + \*********************************************/ +/*! dynamic exports */ +/*! exports [maybe provided (runtime-defined)] [no usage info] */ +/*! runtime requirements: __webpack_require__.l, module, __webpack_require__.* */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +var __webpack_error__ = new Error(); +module.exports = new Promise((resolve, reject) => { + if(typeof mfeBBB !== "undefined") return resolve(); + __webpack_require__.l("/dist/bbb/mfeBBB.js", (event) => { + if(typeof mfeBBB !== "undefined") return resolve(); + var errorType = event && (event.type === 'load' ? 'missing' : event.type); + var realSrc = event && event.target && event.target.src; + __webpack_error__.message = 'Loading script failed.\n(' + errorType + ': ' + realSrc + ')'; + __webpack_error__.name = 'ScriptExternalLoadError'; + __webpack_error__.type = errorType; + __webpack_error__.request = realSrc; + reject(__webpack_error__); + }, "mfeBBB"); +}).then(() => (mfeBBB)); + +/***/ }), + +/***/ 11: +/*!*********************************************!*\ + !*** external "mfeCCC@/dist/ccc/mfeCCC.js" ***! + \*********************************************/ +/*! dynamic exports */ +/*! exports [maybe provided (runtime-defined)] [no usage info] */ +/*! runtime requirements: __webpack_require__.l, module, __webpack_require__.* */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { + +"use strict"; +var __webpack_error__ = new Error(); +module.exports = new Promise((resolve, reject) => { + if(typeof mfeCCC !== "undefined") return resolve(); + __webpack_require__.l("/dist/ccc/mfeCCC.js", (event) => { + if(typeof mfeCCC !== "undefined") return resolve(); + var errorType = event && (event.type === 'load' ? 'missing' : event.type); + var realSrc = event && event.target && event.target.src; + __webpack_error__.message = 'Loading script failed.\n(' + errorType + ': ' + realSrc + ')'; + __webpack_error__.name = 'ScriptExternalLoadError'; + __webpack_error__.type = errorType; + __webpack_error__.request = realSrc; + reject(__webpack_error__); + }, "mfeCCC"); +}).then(() => (mfeCCC)); + +/***/ }) + +/******/ }); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = __webpack_module_cache__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/create fake namespace object */ +/******/ (() => { +/******/ var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__); +/******/ var leafPrototypes; +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 16: return value when it's Promise-like +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = this(value); +/******/ if(mode & 8) return value; +/******/ if(typeof value === 'object' && value) { +/******/ if((mode & 4) && value.__esModule) return value; +/******/ if((mode & 16) && typeof value.then === 'function') return value; +/******/ } +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ var def = {}; +/******/ leafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)]; +/******/ for(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) { +/******/ Object.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key]))); +/******/ } +/******/ def['default'] = () => (value); +/******/ __webpack_require__.d(ns, def); +/******/ return ns; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ var dataWebpackPrefix = "module-federation-aaa:"; +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url || s.getAttribute("data-webpack") == dataWebpackPrefix + key) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ +/******/ script.charset = 'utf-8'; +/******/ script.timeout = 120; +/******/ if (__webpack_require__.nc) { +/******/ script.setAttribute("nonce", __webpack_require__.nc); +/******/ } +/******/ script.setAttribute("data-webpack", dataWebpackPrefix + key); +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/remotes loading */ +/******/ (() => { +/******/ var chunkMapping = { +/******/ "src_bootstrap_js": [ +/******/ 8, +/******/ 10 +/******/ ], +/******/ "webpack_container_remote_mfe-c_Component2": [ +/******/ 24 +/******/ ] +/******/ }; +/******/ var idToExternalAndNameMapping = { +/******/ "8": [ +/******/ "default", +/******/ "./Component", +/******/ 9 +/******/ ], +/******/ "10": [ +/******/ "default", +/******/ "./Component", +/******/ 11 +/******/ ], +/******/ "24": [ +/******/ "default", +/******/ "./Component2", +/******/ 11 +/******/ ] +/******/ }; +/******/ __webpack_require__.f.remotes = (chunkId, promises) => { +/******/ if(__webpack_require__.o(chunkMapping, chunkId)) { +/******/ chunkMapping[chunkId].forEach((id) => { +/******/ var getScope = __webpack_require__.R; +/******/ if(!getScope) getScope = []; +/******/ var data = idToExternalAndNameMapping[id]; +/******/ if(getScope.indexOf(data) >= 0) return; +/******/ getScope.push(data); +/******/ if(data.p) return promises.push(data.p); +/******/ var onError = (error) => { +/******/ if(!error) error = new Error("Container missing"); +/******/ if(typeof error.message === "string") +/******/ error.message += '\nwhile loading "' + data[1] + '" from ' + data[2]; +/******/ __webpack_require__.m[id] = () => { +/******/ throw error; +/******/ } +/******/ data.p = 0; +/******/ }; +/******/ var handleFunction = (fn, arg1, arg2, d, next, first) => { +/******/ try { +/******/ var promise = fn(arg1, arg2); +/******/ if(promise && promise.then) { +/******/ var p = promise.then((result) => (next(result, d)), onError); +/******/ if(first) promises.push(data.p = p); else return p; +/******/ } else { +/******/ return next(promise, d, first); +/******/ } +/******/ } catch(error) { +/******/ onError(error); +/******/ } +/******/ } +/******/ var onExternal = (external, _, first) => (external ? handleFunction(__webpack_require__.I, data[0], 0, external, onInitialized, first) : onError()); +/******/ var onInitialized = (_, external, first) => (handleFunction(external.get, data[1], getScope, 0, onFactory, first)); +/******/ var onFactory = (factory) => { +/******/ data.p = 1; +/******/ __webpack_require__.m[id] = (module) => { +/******/ module.exports = factory(); +/******/ } +/******/ }; +/******/ handleFunction(__webpack_require__, data[2], 0, 0, onExternal, 1); +/******/ }); +/******/ } +/******/ } +/******/ })(); +/******/ +/******/ /* webpack/runtime/sharing */ +/******/ (() => { +/******/ __webpack_require__.S = {}; +/******/ var initPromises = {}; +/******/ var initTokens = {}; +/******/ __webpack_require__.I = (name, initScope) => { +/******/ if(!initScope) initScope = []; +/******/ // handling circular init calls +/******/ var initToken = initTokens[name]; +/******/ if(!initToken) initToken = initTokens[name] = {}; +/******/ if(initScope.indexOf(initToken) >= 0) return; +/******/ initScope.push(initToken); +/******/ // only runs once +/******/ if(initPromises[name]) return initPromises[name]; +/******/ // creates a new share scope if needed +/******/ if(!__webpack_require__.o(__webpack_require__.S, name)) __webpack_require__.S[name] = {}; +/******/ // runs all init snippets from all modules reachable +/******/ var scope = __webpack_require__.S[name]; +/******/ var warn = (msg) => { +/******/ if (typeof console !== "undefined" && console.warn) console.warn(msg); +/******/ }; +/******/ var uniqueName = "module-federation-aaa"; +/******/ var register = (name, version, factory, eager) => { +/******/ var versions = scope[name] = scope[name] || {}; +/******/ var activeVersion = versions[version]; +/******/ if(!activeVersion || (!activeVersion.loaded && (!eager != !activeVersion.eager ? eager : uniqueName > activeVersion.from))) versions[version] = { get: factory, from: uniqueName, eager: !!eager }; +/******/ }; +/******/ var initExternal = (id) => { +/******/ var handleError = (err) => (warn("Initialization of sharing external failed: " + err)); +/******/ try { +/******/ var module = __webpack_require__(id); +/******/ if(!module) return; +/******/ var initFn = (module) => (module && module.init && module.init(__webpack_require__.S[name], initScope)) +/******/ if(module.then) return promises.push(module.then(initFn, handleError)); +/******/ var initResult = initFn(module); +/******/ if(initResult && initResult.then) return promises.push(initResult['catch'](handleError)); +/******/ } catch(err) { handleError(err); } +/******/ } +/******/ var promises = []; +/******/ switch(name) { +/******/ case "default": { +/******/ register("react", "19.1.0", () => (__webpack_require__.e("vendors-node_modules_react_index_js").then(() => (() => (__webpack_require__(/*! ../../node_modules/react/index.js */ 22)))))); +/******/ initExternal(9); +/******/ initExternal(11); +/******/ } +/******/ break; +/******/ } +/******/ if(!promises.length) return initPromises[name] = 1; +/******/ return initPromises[name] = Promise.all(promises).then(() => (initPromises[name] = 1)); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "dist/aaa/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/consumes */ +/******/ (() => { +/******/ var parseVersion = (str) => { +/******/ // see webpack/lib/util/semver.js for original code +/******/ var p=p=>{return p.split(".").map((p=>{return+p==p?+p:p}))},n=/^([^-+]+)?(?:-([^+]+))?(?:\+(.+))?$/.exec(str),r=n[1]?p(n[1]):[];return n[2]&&(r.length++,r.push.apply(r,p(n[2]))),n[3]&&(r.push([]),r.push.apply(r,p(n[3]))),r; +/******/ } +/******/ var versionLt = (a, b) => { +/******/ // see webpack/lib/util/semver.js for original code +/******/ a=parseVersion(a),b=parseVersion(b);for(var r=0;;){if(r>=a.length)return r=b.length)return"u"==n;var t=b[r],f=(typeof t)[0];if(n!=f)return"o"==n&&"n"==f||("s"==f||"u"==n);if("o"!=n&&"u"!=n&&e!=t)return e { +/******/ // see webpack/lib/util/semver.js for original code +/******/ var r=range[0],n="";if(1===range.length)return"*";if(r+.5){n+=0==r?">=":-1==r?"<":1==r?"^":2==r?"~":r>0?"=":"!=";for(var e=1,a=1;a0?".":"")+(e=2,t)}return n}var g=[];for(a=1;a { +/******/ // see webpack/lib/util/semver.js for original code +/******/ if(0 in range){version=parseVersion(version);var e=range[0],r=e<0;r&&(e=-e-1);for(var n=0,i=1,a=!0;;i++,n++){var f,s,g=i=version.length||"o"==(s=(typeof(f=version[n]))[0]))return!a||("u"==g?i>e&&!r:""==g!=r);if("u"==s){if(!a||"u"!=g)return!1}else if(a)if(g==s)if(i<=e){if(f!=range[i])return!1}else{if(r?f>range[i]:f { +/******/ return scope && __webpack_require__.o(scope, key); +/******/ } +/******/ var get = (entry) => { +/******/ entry.loaded = 1; +/******/ return entry.get() +/******/ }; +/******/ var eagerOnly = (versions) => { +/******/ return Object.keys(versions).reduce((filtered, version) => { +/******/ if (versions[version].eager) { +/******/ filtered[version] = versions[version]; +/******/ } +/******/ return filtered; +/******/ }, {}); +/******/ }; +/******/ var findLatestVersion = (scope, key, eager) => { +/******/ var versions = eager ? eagerOnly(scope[key]) : scope[key]; +/******/ var key = Object.keys(versions).reduce((a, b) => { +/******/ return !a || versionLt(a, b) ? b : a; +/******/ }, 0); +/******/ return key && versions[key]; +/******/ }; +/******/ var findSatisfyingVersion = (scope, key, requiredVersion, eager) => { +/******/ var versions = eager ? eagerOnly(scope[key]) : scope[key]; +/******/ var key = Object.keys(versions).reduce((a, b) => { +/******/ if (!satisfy(requiredVersion, b)) return a; +/******/ return !a || versionLt(a, b) ? b : a; +/******/ }, 0); +/******/ return key && versions[key] +/******/ }; +/******/ var findSingletonVersionKey = (scope, key, eager) => { +/******/ var versions = eager ? eagerOnly(scope[key]) : scope[key]; +/******/ return Object.keys(versions).reduce((a, b) => { +/******/ return !a || (!versions[a].loaded && versionLt(a, b)) ? b : a; +/******/ }, 0); +/******/ }; +/******/ var getInvalidSingletonVersionMessage = (scope, key, version, requiredVersion) => { +/******/ return "Unsatisfied version " + version + " from " + (version && scope[key][version].from) + " of shared singleton module " + key + " (required " + rangeToString(requiredVersion) + ")" +/******/ }; +/******/ var getInvalidVersionMessage = (scope, scopeName, key, requiredVersion, eager) => { +/******/ var versions = scope[key]; +/******/ return "No satisfying version (" + rangeToString(requiredVersion) + ")" + (eager ? " for eager consumption" : "") + " of shared module " + key + " found in shared scope " + scopeName + ".\n" + +/******/ "Available versions: " + Object.keys(versions).map((key) => { +/******/ return key + " from " + versions[key].from; +/******/ }).join(", "); +/******/ }; +/******/ var fail = (msg) => { +/******/ throw new Error(msg); +/******/ } +/******/ var failAsNotExist = (scopeName, key) => { +/******/ return fail("Shared module " + key + " doesn't exist in shared scope " + scopeName); +/******/ } +/******/ var warn = /*#__PURE__*/ (msg) => { +/******/ if (typeof console !== "undefined" && console.warn) console.warn(msg); +/******/ }; +/******/ var init = (fn) => (function(scopeName, key, eager, c, d) { +/******/ var promise = __webpack_require__.I(scopeName); +/******/ if (promise && promise.then && !eager) { +/******/ return promise.then(fn.bind(fn, scopeName, __webpack_require__.S[scopeName], key, false, c, d)); +/******/ } +/******/ return fn(scopeName, __webpack_require__.S[scopeName], key, eager, c, d); +/******/ }); +/******/ +/******/ var useFallback = (scopeName, key, fallback) => { +/******/ return fallback ? fallback() : failAsNotExist(scopeName, key); +/******/ } +/******/ var load = /*#__PURE__*/ init((scopeName, scope, key, eager, fallback) => { +/******/ if (!exists(scope, key)) return useFallback(scopeName, key, fallback); +/******/ return get(findLatestVersion(scope, key, eager)); +/******/ }); +/******/ var loadVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => { +/******/ if (!exists(scope, key)) return useFallback(scopeName, key, fallback); +/******/ var satisfyingVersion = findSatisfyingVersion(scope, key, requiredVersion, eager); +/******/ if (satisfyingVersion) return get(satisfyingVersion); +/******/ warn(getInvalidVersionMessage(scope, scopeName, key, requiredVersion, eager)) +/******/ return get(findLatestVersion(scope, key, eager)); +/******/ }); +/******/ var loadStrictVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => { +/******/ if (!exists(scope, key)) return useFallback(scopeName, key, fallback); +/******/ var satisfyingVersion = findSatisfyingVersion(scope, key, requiredVersion, eager); +/******/ if (satisfyingVersion) return get(satisfyingVersion); +/******/ if (fallback) return fallback(); +/******/ fail(getInvalidVersionMessage(scope, scopeName, key, requiredVersion, eager)); +/******/ }); +/******/ var loadSingleton = /*#__PURE__*/ init((scopeName, scope, key, eager, fallback) => { +/******/ if (!exists(scope, key)) return useFallback(scopeName, key, fallback); +/******/ var version = findSingletonVersionKey(scope, key, eager); +/******/ return get(scope[key][version]); +/******/ }); +/******/ var loadSingletonVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => { +/******/ if (!exists(scope, key)) return useFallback(scopeName, key, fallback); +/******/ var version = findSingletonVersionKey(scope, key, eager); +/******/ if (!satisfy(requiredVersion, version)) { +/******/ warn(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion)); +/******/ } +/******/ return get(scope[key][version]); +/******/ }); +/******/ var loadStrictSingletonVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => { +/******/ if (!exists(scope, key)) return useFallback(scopeName, key, fallback); +/******/ var version = findSingletonVersionKey(scope, key, eager); +/******/ if (!satisfy(requiredVersion, version)) { +/******/ fail(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion)); +/******/ } +/******/ return get(scope[key][version]); +/******/ }); +/******/ var installedModules = {}; +/******/ var moduleToHandlerMapping = { +/******/ 5: () => (loadSingletonVersion("default", "react", false, [1,19,1,0], () => (__webpack_require__.e("vendors-node_modules_react_index_js").then(() => (() => (__webpack_require__(/*! react */ 22))))))), +/******/ 6: () => (loadSingletonVersion("default", "react", false, [1,19,0,0], () => (__webpack_require__.e("vendors-node_modules_react_index_js").then(() => (() => (__webpack_require__(/*! react */ 22))))))) +/******/ }; +/******/ // no consumes in initial chunks +/******/ var chunkMapping = { +/******/ "src_bootstrap_js": [ +/******/ 5, +/******/ 6 +/******/ ] +/******/ }; +/******/ var startedInstallModules = {}; +/******/ __webpack_require__.f.consumes = (chunkId, promises) => { +/******/ if(__webpack_require__.o(chunkMapping, chunkId)) { +/******/ chunkMapping[chunkId].forEach((id) => { +/******/ if(__webpack_require__.o(installedModules, id)) return promises.push(installedModules[id]); +/******/ if(!startedInstallModules[id]) { +/******/ var onFactory = (factory) => { +/******/ installedModules[id] = 0; +/******/ __webpack_require__.m[id] = (module) => { +/******/ delete __webpack_require__.c[id]; +/******/ module.exports = factory(); +/******/ } +/******/ }; +/******/ startedInstallModules[id] = true; +/******/ var onError = (error) => { +/******/ delete installedModules[id]; +/******/ __webpack_require__.m[id] = (module) => { +/******/ delete __webpack_require__.c[id]; +/******/ throw error; +/******/ } +/******/ }; +/******/ try { +/******/ var promise = moduleToHandlerMapping[id](); +/******/ if(promise.then) { +/******/ promises.push(installedModules[id] = promise.then(onFactory)['catch'](onError)); +/******/ } else onFactory(promise); +/******/ } catch(e) { onError(e); } +/******/ } +/******/ }); +/******/ } +/******/ } +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "app": 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // JSONP chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if("webpack_container_remote_mfe-c_Component2" != chunkId) { +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ installedChunkData[1](error); +/******/ } +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); +/******/ } else installedChunks[chunkId] = 0; +/******/ } +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ // no on chunks loaded +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); +/******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ +/******/ } +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunkmodule_federation_aaa"] = self["webpackChunkmodule_federation_aaa"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ +/************************************************************************/ +``` + +
+ +``` js +/******/ +/******/ // module cache are used so entry inlining is disabled +/******/ // startup +/******/ // Load entry module and return exports +/******/ var __webpack_exports__ = __webpack_require__(0); +/******/ +/******/ })() +; +``` + +# dist/bbb/mfeBBB.js + +```javascript +var mfeBBB; +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ([ +/* 0 */ +/*!***********************!*\ + !*** container entry ***! + \***********************/ +/*! namespace exports */ +/*! export get [provided] [maybe used in mfeBBB (runtime-defined)] [usage and provision prevents renaming] */ +/*! export init [provided] [maybe used in mfeBBB (runtime-defined)] [usage and provision prevents renaming] */ +/*! other exports [not provided] [maybe used in mfeBBB (runtime-defined)] */ +/*! runtime requirements: __webpack_require__.d, __webpack_require__.o, __webpack_exports__, __webpack_require__.e, __webpack_require__, __webpack_require__.* */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +var moduleMap = { + "./Component": () => { + return __webpack_require__.e("src-b_Component_js").then(() => (() => ((__webpack_require__(/*! ./src-b/Component */ 3))))); + } +}; +var get = (module, getScope) => { + __webpack_require__.R = getScope; + getScope = ( + __webpack_require__.o(moduleMap, module) + ? moduleMap[module]() + : Promise.resolve().then(() => { + throw new Error('Module "' + module + '" does not exist in container.'); + }) + ); + __webpack_require__.R = undefined; + return getScope; +}; +var init = (shareScope, initScope) => { + if (!__webpack_require__.S) return; + var name = "default" + var oldScope = __webpack_require__.S[name]; + if(oldScope && oldScope !== shareScope) throw new Error("Container initialization failed as it has already been initialized with a different share scope"); + __webpack_require__.S[name] = shareScope; + return __webpack_require__.I(name, initScope); +}; + +// This exports getters to disallow modifications +__webpack_require__.d(exports, { + get: () => (get), + init: () => (init) +}); + +/***/ }) +/******/ ]); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = __webpack_module_cache__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ var dataWebpackPrefix = "module-federation-bbb:"; +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url || s.getAttribute("data-webpack") == dataWebpackPrefix + key) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ +/******/ script.charset = 'utf-8'; +/******/ script.timeout = 120; +/******/ if (__webpack_require__.nc) { +/******/ script.setAttribute("nonce", __webpack_require__.nc); +/******/ } +/******/ script.setAttribute("data-webpack", dataWebpackPrefix + key); +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/sharing */ +/******/ (() => { +/******/ __webpack_require__.S = {}; +/******/ var initPromises = {}; +/******/ var initTokens = {}; +/******/ __webpack_require__.I = (name, initScope) => { +/******/ if(!initScope) initScope = []; +/******/ // handling circular init calls +/******/ var initToken = initTokens[name]; +/******/ if(!initToken) initToken = initTokens[name] = {}; +/******/ if(initScope.indexOf(initToken) >= 0) return; +/******/ initScope.push(initToken); +/******/ // only runs once +/******/ if(initPromises[name]) return initPromises[name]; +/******/ // creates a new share scope if needed +/******/ if(!__webpack_require__.o(__webpack_require__.S, name)) __webpack_require__.S[name] = {}; +/******/ // runs all init snippets from all modules reachable +/******/ var scope = __webpack_require__.S[name]; +/******/ var warn = (msg) => { +/******/ if (typeof console !== "undefined" && console.warn) console.warn(msg); +/******/ }; +/******/ var uniqueName = "module-federation-bbb"; +/******/ var register = (name, version, factory, eager) => { +/******/ var versions = scope[name] = scope[name] || {}; +/******/ var activeVersion = versions[version]; +/******/ if(!activeVersion || (!activeVersion.loaded && (!eager != !activeVersion.eager ? eager : uniqueName > activeVersion.from))) versions[version] = { get: factory, from: uniqueName, eager: !!eager }; +/******/ }; +/******/ var initExternal = (id) => { +/******/ var handleError = (err) => (warn("Initialization of sharing external failed: " + err)); +/******/ try { +/******/ var module = __webpack_require__(id); +/******/ if(!module) return; +/******/ var initFn = (module) => (module && module.init && module.init(__webpack_require__.S[name], initScope)) +/******/ if(module.then) return promises.push(module.then(initFn, handleError)); +/******/ var initResult = initFn(module); +/******/ if(initResult && initResult.then) return promises.push(initResult['catch'](handleError)); +/******/ } catch(err) { handleError(err); } +/******/ } +/******/ var promises = []; +/******/ switch(name) { +/******/ case "default": { +/******/ register("date-fns", "4.1.0", () => (__webpack_require__.e("vendors-node_modules_date-fns_index_js").then(() => (() => (__webpack_require__(/*! ../../node_modules/date-fns/index.js */ 6)))))); +/******/ register("react", "19.1.0", () => (__webpack_require__.e("vendors-node_modules_react_index_js").then(() => (() => (__webpack_require__(/*! ../../node_modules/react/index.js */ 309)))))); +/******/ } +/******/ break; +/******/ } +/******/ if(!promises.length) return initPromises[name] = 1; +/******/ return initPromises[name] = Promise.all(promises).then(() => (initPromises[name] = 1)); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "dist/bbb/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/consumes */ +/******/ (() => { +/******/ var parseVersion = (str) => { +/******/ // see webpack/lib/util/semver.js for original code +/******/ var p=p=>{return p.split(".").map((p=>{return+p==p?+p:p}))},n=/^([^-+]+)?(?:-([^+]+))?(?:\+(.+))?$/.exec(str),r=n[1]?p(n[1]):[];return n[2]&&(r.length++,r.push.apply(r,p(n[2]))),n[3]&&(r.push([]),r.push.apply(r,p(n[3]))),r; +/******/ } +/******/ var versionLt = (a, b) => { +/******/ // see webpack/lib/util/semver.js for original code +/******/ a=parseVersion(a),b=parseVersion(b);for(var r=0;;){if(r>=a.length)return r=b.length)return"u"==n;var t=b[r],f=(typeof t)[0];if(n!=f)return"o"==n&&"n"==f||("s"==f||"u"==n);if("o"!=n&&"u"!=n&&e!=t)return e { +/******/ // see webpack/lib/util/semver.js for original code +/******/ var r=range[0],n="";if(1===range.length)return"*";if(r+.5){n+=0==r?">=":-1==r?"<":1==r?"^":2==r?"~":r>0?"=":"!=";for(var e=1,a=1;a0?".":"")+(e=2,t)}return n}var g=[];for(a=1;a { +/******/ // see webpack/lib/util/semver.js for original code +/******/ if(0 in range){version=parseVersion(version);var e=range[0],r=e<0;r&&(e=-e-1);for(var n=0,i=1,a=!0;;i++,n++){var f,s,g=i=version.length||"o"==(s=(typeof(f=version[n]))[0]))return!a||("u"==g?i>e&&!r:""==g!=r);if("u"==s){if(!a||"u"!=g)return!1}else if(a)if(g==s)if(i<=e){if(f!=range[i])return!1}else{if(r?f>range[i]:f { +/******/ return scope && __webpack_require__.o(scope, key); +/******/ } +/******/ var get = (entry) => { +/******/ entry.loaded = 1; +/******/ return entry.get() +/******/ }; +/******/ var eagerOnly = (versions) => { +/******/ return Object.keys(versions).reduce((filtered, version) => { +/******/ if (versions[version].eager) { +/******/ filtered[version] = versions[version]; +/******/ } +/******/ return filtered; +/******/ }, {}); +/******/ }; +/******/ var findLatestVersion = (scope, key, eager) => { +/******/ var versions = eager ? eagerOnly(scope[key]) : scope[key]; +/******/ var key = Object.keys(versions).reduce((a, b) => { +/******/ return !a || versionLt(a, b) ? b : a; +/******/ }, 0); +/******/ return key && versions[key]; +/******/ }; +/******/ var findSatisfyingVersion = (scope, key, requiredVersion, eager) => { +/******/ var versions = eager ? eagerOnly(scope[key]) : scope[key]; +/******/ var key = Object.keys(versions).reduce((a, b) => { +/******/ if (!satisfy(requiredVersion, b)) return a; +/******/ return !a || versionLt(a, b) ? b : a; +/******/ }, 0); +/******/ return key && versions[key] +/******/ }; +/******/ var findSingletonVersionKey = (scope, key, eager) => { +/******/ var versions = eager ? eagerOnly(scope[key]) : scope[key]; +/******/ return Object.keys(versions).reduce((a, b) => { +/******/ return !a || (!versions[a].loaded && versionLt(a, b)) ? b : a; +/******/ }, 0); +/******/ }; +/******/ var getInvalidSingletonVersionMessage = (scope, key, version, requiredVersion) => { +/******/ return "Unsatisfied version " + version + " from " + (version && scope[key][version].from) + " of shared singleton module " + key + " (required " + rangeToString(requiredVersion) + ")" +/******/ }; +/******/ var getInvalidVersionMessage = (scope, scopeName, key, requiredVersion, eager) => { +/******/ var versions = scope[key]; +/******/ return "No satisfying version (" + rangeToString(requiredVersion) + ")" + (eager ? " for eager consumption" : "") + " of shared module " + key + " found in shared scope " + scopeName + ".\n" + +/******/ "Available versions: " + Object.keys(versions).map((key) => { +/******/ return key + " from " + versions[key].from; +/******/ }).join(", "); +/******/ }; +/******/ var fail = (msg) => { +/******/ throw new Error(msg); +/******/ } +/******/ var failAsNotExist = (scopeName, key) => { +/******/ return fail("Shared module " + key + " doesn't exist in shared scope " + scopeName); +/******/ } +/******/ var warn = /*#__PURE__*/ (msg) => { +/******/ if (typeof console !== "undefined" && console.warn) console.warn(msg); +/******/ }; +/******/ var init = (fn) => (function(scopeName, key, eager, c, d) { +/******/ var promise = __webpack_require__.I(scopeName); +/******/ if (promise && promise.then && !eager) { +/******/ return promise.then(fn.bind(fn, scopeName, __webpack_require__.S[scopeName], key, false, c, d)); +/******/ } +/******/ return fn(scopeName, __webpack_require__.S[scopeName], key, eager, c, d); +/******/ }); +/******/ +/******/ var useFallback = (scopeName, key, fallback) => { +/******/ return fallback ? fallback() : failAsNotExist(scopeName, key); +/******/ } +/******/ var load = /*#__PURE__*/ init((scopeName, scope, key, eager, fallback) => { +/******/ if (!exists(scope, key)) return useFallback(scopeName, key, fallback); +/******/ return get(findLatestVersion(scope, key, eager)); +/******/ }); +/******/ var loadVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => { +/******/ if (!exists(scope, key)) return useFallback(scopeName, key, fallback); +/******/ var satisfyingVersion = findSatisfyingVersion(scope, key, requiredVersion, eager); +/******/ if (satisfyingVersion) return get(satisfyingVersion); +/******/ warn(getInvalidVersionMessage(scope, scopeName, key, requiredVersion, eager)) +/******/ return get(findLatestVersion(scope, key, eager)); +/******/ }); +/******/ var loadStrictVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => { +/******/ if (!exists(scope, key)) return useFallback(scopeName, key, fallback); +/******/ var satisfyingVersion = findSatisfyingVersion(scope, key, requiredVersion, eager); +/******/ if (satisfyingVersion) return get(satisfyingVersion); +/******/ if (fallback) return fallback(); +/******/ fail(getInvalidVersionMessage(scope, scopeName, key, requiredVersion, eager)); +/******/ }); +/******/ var loadSingleton = /*#__PURE__*/ init((scopeName, scope, key, eager, fallback) => { +/******/ if (!exists(scope, key)) return useFallback(scopeName, key, fallback); +/******/ var version = findSingletonVersionKey(scope, key, eager); +/******/ return get(scope[key][version]); +/******/ }); +/******/ var loadSingletonVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => { +/******/ if (!exists(scope, key)) return useFallback(scopeName, key, fallback); +/******/ var version = findSingletonVersionKey(scope, key, eager); +/******/ if (!satisfy(requiredVersion, version)) { +/******/ warn(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion)); +/******/ } +/******/ return get(scope[key][version]); +/******/ }); +/******/ var loadStrictSingletonVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => { +/******/ if (!exists(scope, key)) return useFallback(scopeName, key, fallback); +/******/ var version = findSingletonVersionKey(scope, key, eager); +/******/ if (!satisfy(requiredVersion, version)) { +/******/ fail(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion)); +/******/ } +/******/ return get(scope[key][version]); +/******/ }); +/******/ var installedModules = {}; +/******/ var moduleToHandlerMapping = { +/******/ 4: () => (loadSingletonVersion("default", "react", false, [1,19,0,0], () => (__webpack_require__.e("vendors-node_modules_react_index_js").then(() => (() => (__webpack_require__(/*! react */ 309))))))), +/******/ 5: () => (loadStrictVersion("default", "date-fns", false, [1,4,0,0], () => (__webpack_require__.e("vendors-node_modules_date-fns_index_js").then(() => (() => (__webpack_require__(/*! date-fns */ 6))))))) +/******/ }; +/******/ // no consumes in initial chunks +/******/ var chunkMapping = { +/******/ "src-b_Component_js": [ +/******/ 4, +/******/ 5 +/******/ ] +/******/ }; +/******/ var startedInstallModules = {}; +/******/ __webpack_require__.f.consumes = (chunkId, promises) => { +/******/ if(__webpack_require__.o(chunkMapping, chunkId)) { +/******/ chunkMapping[chunkId].forEach((id) => { +/******/ if(__webpack_require__.o(installedModules, id)) return promises.push(installedModules[id]); +/******/ if(!startedInstallModules[id]) { +/******/ var onFactory = (factory) => { +/******/ installedModules[id] = 0; +/******/ __webpack_require__.m[id] = (module) => { +/******/ delete __webpack_require__.c[id]; +/******/ module.exports = factory(); +/******/ } +/******/ }; +/******/ startedInstallModules[id] = true; +/******/ var onError = (error) => { +/******/ delete installedModules[id]; +/******/ __webpack_require__.m[id] = (module) => { +/******/ delete __webpack_require__.c[id]; +/******/ throw error; +/******/ } +/******/ }; +/******/ try { +/******/ var promise = moduleToHandlerMapping[id](); +/******/ if(promise.then) { +/******/ promises.push(installedModules[id] = promise.then(onFactory)['catch'](onError)); +/******/ } else onFactory(promise); +/******/ } catch(e) { onError(e); } +/******/ } +/******/ }); +/******/ } +/******/ } +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "mfeBBB": 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // JSONP chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if(true) { // all chunks have JS +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ installedChunkData[1](error); +/******/ } +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); +/******/ } +/******/ } +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ // no on chunks loaded +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); +/******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ +/******/ } +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunkmodule_federation_bbb"] = self["webpackChunkmodule_federation_bbb"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ +/************************************************************************/ +``` + +
+ +``` js +/******/ +/******/ // module cache are used so entry inlining is disabled +/******/ // startup +/******/ // Load entry module and return exports +/******/ var __webpack_exports__ = __webpack_require__(0); +/******/ mfeBBB = __webpack_exports__; +/******/ +/******/ })() +; +``` + +# dist/ccc/mfeCCC.js + +```javascript +var mfeCCC; +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ([ +/* 0 */ +/*!***********************!*\ + !*** container entry ***! + \***********************/ +/*! namespace exports */ +/*! export get [provided] [maybe used in mfeCCC (runtime-defined)] [usage and provision prevents renaming] */ +/*! export init [provided] [maybe used in mfeCCC (runtime-defined)] [usage and provision prevents renaming] */ +/*! other exports [not provided] [maybe used in mfeCCC (runtime-defined)] */ +/*! runtime requirements: __webpack_require__.d, __webpack_require__.o, __webpack_exports__, __webpack_require__.e, __webpack_require__, __webpack_require__.* */ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +var moduleMap = { + "./Component": () => { + return Promise.all([__webpack_require__.e("webpack_sharing_consume_default_react"), __webpack_require__.e("src-c_Component_js")]).then(() => (() => ((__webpack_require__(/*! ./src-c/Component */ 3))))); + }, + "./Component2": () => { + return Promise.all([__webpack_require__.e("webpack_sharing_consume_default_react"), __webpack_require__.e("src-c_LazyComponent_js")]).then(() => (() => ((__webpack_require__(/*! ./src-c/LazyComponent */ 6))))); + } +}; +var get = (module, getScope) => { + __webpack_require__.R = getScope; + getScope = ( + __webpack_require__.o(moduleMap, module) + ? moduleMap[module]() + : Promise.resolve().then(() => { + throw new Error('Module "' + module + '" does not exist in container.'); + }) + ); + __webpack_require__.R = undefined; + return getScope; +}; +var init = (shareScope, initScope) => { + if (!__webpack_require__.S) return; + var name = "default" + var oldScope = __webpack_require__.S[name]; + if(oldScope && oldScope !== shareScope) throw new Error("Container initialization failed as it has already been initialized with a different share scope"); + __webpack_require__.S[name] = shareScope; + return __webpack_require__.I(name, initScope); +}; + +// This exports getters to disallow modifications +__webpack_require__.d(exports, { + get: () => (get), + init: () => (init) +}); + +/***/ }) +/******/ ]); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = __webpack_module_cache__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat get default export */ +/******/ (() => { +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = (module) => { +/******/ var getter = module && module.__esModule ? +/******/ () => (module['default']) : +/******/ () => (module); +/******/ __webpack_require__.d(getter, { a: getter }); +/******/ return getter; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/global */ +/******/ (() => { +/******/ __webpack_require__.g = (function() { +/******/ if (typeof globalThis === 'object') return globalThis; +/******/ try { +/******/ return this || new Function('return this')(); +/******/ } catch (e) { +/******/ if (typeof window === 'object') return window; +/******/ } +/******/ })(); +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ var dataWebpackPrefix = "module-federation-ccc:"; +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url || s.getAttribute("data-webpack") == dataWebpackPrefix + key) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ +/******/ script.charset = 'utf-8'; +/******/ script.timeout = 120; +/******/ if (__webpack_require__.nc) { +/******/ script.setAttribute("nonce", __webpack_require__.nc); +/******/ } +/******/ script.setAttribute("data-webpack", dataWebpackPrefix + key); +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/sharing */ +/******/ (() => { +/******/ __webpack_require__.S = {}; +/******/ var initPromises = {}; +/******/ var initTokens = {}; +/******/ __webpack_require__.I = (name, initScope) => { +/******/ if(!initScope) initScope = []; +/******/ // handling circular init calls +/******/ var initToken = initTokens[name]; +/******/ if(!initToken) initToken = initTokens[name] = {}; +/******/ if(initScope.indexOf(initToken) >= 0) return; +/******/ initScope.push(initToken); +/******/ // only runs once +/******/ if(initPromises[name]) return initPromises[name]; +/******/ // creates a new share scope if needed +/******/ if(!__webpack_require__.o(__webpack_require__.S, name)) __webpack_require__.S[name] = {}; +/******/ // runs all init snippets from all modules reachable +/******/ var scope = __webpack_require__.S[name]; +/******/ var warn = (msg) => { +/******/ if (typeof console !== "undefined" && console.warn) console.warn(msg); +/******/ }; +/******/ var uniqueName = "module-federation-ccc"; +/******/ var register = (name, version, factory, eager) => { +/******/ var versions = scope[name] = scope[name] || {}; +/******/ var activeVersion = versions[version]; +/******/ if(!activeVersion || (!activeVersion.loaded && (!eager != !activeVersion.eager ? eager : uniqueName > activeVersion.from))) versions[version] = { get: factory, from: uniqueName, eager: !!eager }; +/******/ }; +/******/ var initExternal = (id) => { +/******/ var handleError = (err) => (warn("Initialization of sharing external failed: " + err)); +/******/ try { +/******/ var module = __webpack_require__(id); +/******/ if(!module) return; +/******/ var initFn = (module) => (module && module.init && module.init(__webpack_require__.S[name], initScope)) +/******/ if(module.then) return promises.push(module.then(initFn, handleError)); +/******/ var initResult = initFn(module); +/******/ if(initResult && initResult.then) return promises.push(initResult['catch'](handleError)); +/******/ } catch(err) { handleError(err); } +/******/ } +/******/ var promises = []; +/******/ switch(name) { +/******/ case "default": { +/******/ register("date-fns", "4.1.0", () => (__webpack_require__.e("vendors-node_modules_date-fns_index_js").then(() => (() => (__webpack_require__(/*! ../../node_modules/date-fns/index.js */ 8)))))); +/******/ register("lodash/random", "4.17.21", () => (__webpack_require__.e("vendors-node_modules_lodash_random_js").then(() => (() => (__webpack_require__(/*! ../../node_modules/lodash/random.js */ 311)))))); +/******/ } +/******/ break; +/******/ } +/******/ if(!promises.length) return initPromises[name] = 1; +/******/ return initPromises[name] = Promise.all(promises).then(() => (initPromises[name] = 1)); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "dist/ccc/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/consumes */ +/******/ (() => { +/******/ var parseVersion = (str) => { +/******/ // see webpack/lib/util/semver.js for original code +/******/ var p=p=>{return p.split(".").map((p=>{return+p==p?+p:p}))},n=/^([^-+]+)?(?:-([^+]+))?(?:\+(.+))?$/.exec(str),r=n[1]?p(n[1]):[];return n[2]&&(r.length++,r.push.apply(r,p(n[2]))),n[3]&&(r.push([]),r.push.apply(r,p(n[3]))),r; +/******/ } +/******/ var versionLt = (a, b) => { +/******/ // see webpack/lib/util/semver.js for original code +/******/ a=parseVersion(a),b=parseVersion(b);for(var r=0;;){if(r>=a.length)return r=b.length)return"u"==n;var t=b[r],f=(typeof t)[0];if(n!=f)return"o"==n&&"n"==f||("s"==f||"u"==n);if("o"!=n&&"u"!=n&&e!=t)return e { +/******/ // see webpack/lib/util/semver.js for original code +/******/ var r=range[0],n="";if(1===range.length)return"*";if(r+.5){n+=0==r?">=":-1==r?"<":1==r?"^":2==r?"~":r>0?"=":"!=";for(var e=1,a=1;a0?".":"")+(e=2,t)}return n}var g=[];for(a=1;a { +/******/ // see webpack/lib/util/semver.js for original code +/******/ if(0 in range){version=parseVersion(version);var e=range[0],r=e<0;r&&(e=-e-1);for(var n=0,i=1,a=!0;;i++,n++){var f,s,g=i=version.length||"o"==(s=(typeof(f=version[n]))[0]))return!a||("u"==g?i>e&&!r:""==g!=r);if("u"==s){if(!a||"u"!=g)return!1}else if(a)if(g==s)if(i<=e){if(f!=range[i])return!1}else{if(r?f>range[i]:f { +/******/ return scope && __webpack_require__.o(scope, key); +/******/ } +/******/ var get = (entry) => { +/******/ entry.loaded = 1; +/******/ return entry.get() +/******/ }; +/******/ var eagerOnly = (versions) => { +/******/ return Object.keys(versions).reduce((filtered, version) => { +/******/ if (versions[version].eager) { +/******/ filtered[version] = versions[version]; +/******/ } +/******/ return filtered; +/******/ }, {}); +/******/ }; +/******/ var findLatestVersion = (scope, key, eager) => { +/******/ var versions = eager ? eagerOnly(scope[key]) : scope[key]; +/******/ var key = Object.keys(versions).reduce((a, b) => { +/******/ return !a || versionLt(a, b) ? b : a; +/******/ }, 0); +/******/ return key && versions[key]; +/******/ }; +/******/ var findSatisfyingVersion = (scope, key, requiredVersion, eager) => { +/******/ var versions = eager ? eagerOnly(scope[key]) : scope[key]; +/******/ var key = Object.keys(versions).reduce((a, b) => { +/******/ if (!satisfy(requiredVersion, b)) return a; +/******/ return !a || versionLt(a, b) ? b : a; +/******/ }, 0); +/******/ return key && versions[key] +/******/ }; +/******/ var findSingletonVersionKey = (scope, key, eager) => { +/******/ var versions = eager ? eagerOnly(scope[key]) : scope[key]; +/******/ return Object.keys(versions).reduce((a, b) => { +/******/ return !a || (!versions[a].loaded && versionLt(a, b)) ? b : a; +/******/ }, 0); +/******/ }; +/******/ var getInvalidSingletonVersionMessage = (scope, key, version, requiredVersion) => { +/******/ return "Unsatisfied version " + version + " from " + (version && scope[key][version].from) + " of shared singleton module " + key + " (required " + rangeToString(requiredVersion) + ")" +/******/ }; +/******/ var getInvalidVersionMessage = (scope, scopeName, key, requiredVersion, eager) => { +/******/ var versions = scope[key]; +/******/ return "No satisfying version (" + rangeToString(requiredVersion) + ")" + (eager ? " for eager consumption" : "") + " of shared module " + key + " found in shared scope " + scopeName + ".\n" + +/******/ "Available versions: " + Object.keys(versions).map((key) => { +/******/ return key + " from " + versions[key].from; +/******/ }).join(", "); +/******/ }; +/******/ var fail = (msg) => { +/******/ throw new Error(msg); +/******/ } +/******/ var failAsNotExist = (scopeName, key) => { +/******/ return fail("Shared module " + key + " doesn't exist in shared scope " + scopeName); +/******/ } +/******/ var warn = /*#__PURE__*/ (msg) => { +/******/ if (typeof console !== "undefined" && console.warn) console.warn(msg); +/******/ }; +/******/ var init = (fn) => (function(scopeName, key, eager, c, d) { +/******/ var promise = __webpack_require__.I(scopeName); +/******/ if (promise && promise.then && !eager) { +/******/ return promise.then(fn.bind(fn, scopeName, __webpack_require__.S[scopeName], key, false, c, d)); +/******/ } +/******/ return fn(scopeName, __webpack_require__.S[scopeName], key, eager, c, d); +/******/ }); +/******/ +/******/ var useFallback = (scopeName, key, fallback) => { +/******/ return fallback ? fallback() : failAsNotExist(scopeName, key); +/******/ } +/******/ var load = /*#__PURE__*/ init((scopeName, scope, key, eager, fallback) => { +/******/ if (!exists(scope, key)) return useFallback(scopeName, key, fallback); +/******/ return get(findLatestVersion(scope, key, eager)); +/******/ }); +/******/ var loadVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => { +/******/ if (!exists(scope, key)) return useFallback(scopeName, key, fallback); +/******/ var satisfyingVersion = findSatisfyingVersion(scope, key, requiredVersion, eager); +/******/ if (satisfyingVersion) return get(satisfyingVersion); +/******/ warn(getInvalidVersionMessage(scope, scopeName, key, requiredVersion, eager)) +/******/ return get(findLatestVersion(scope, key, eager)); +/******/ }); +/******/ var loadStrictVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => { +/******/ if (!exists(scope, key)) return useFallback(scopeName, key, fallback); +/******/ var satisfyingVersion = findSatisfyingVersion(scope, key, requiredVersion, eager); +/******/ if (satisfyingVersion) return get(satisfyingVersion); +/******/ if (fallback) return fallback(); +/******/ fail(getInvalidVersionMessage(scope, scopeName, key, requiredVersion, eager)); +/******/ }); +/******/ var loadSingleton = /*#__PURE__*/ init((scopeName, scope, key, eager, fallback) => { +/******/ if (!exists(scope, key)) return useFallback(scopeName, key, fallback); +/******/ var version = findSingletonVersionKey(scope, key, eager); +/******/ return get(scope[key][version]); +/******/ }); +/******/ var loadSingletonVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => { +/******/ if (!exists(scope, key)) return useFallback(scopeName, key, fallback); +/******/ var version = findSingletonVersionKey(scope, key, eager); +/******/ if (!satisfy(requiredVersion, version)) { +/******/ warn(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion)); +/******/ } +/******/ return get(scope[key][version]); +/******/ }); +/******/ var loadStrictSingletonVersion = /*#__PURE__*/ init((scopeName, scope, key, eager, requiredVersion, fallback) => { +/******/ if (!exists(scope, key)) return useFallback(scopeName, key, fallback); +/******/ var version = findSingletonVersionKey(scope, key, eager); +/******/ if (!satisfy(requiredVersion, version)) { +/******/ fail(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion)); +/******/ } +/******/ return get(scope[key][version]); +/******/ }); +/******/ var installedModules = {}; +/******/ var moduleToHandlerMapping = { +/******/ 4: () => (loadSingletonVersion("default", "react", false, [1,19,0,0])), +/******/ 5: () => (loadStrictVersion("default", "date-fns", false, [1,4,0,0], () => (__webpack_require__.e("vendors-node_modules_date-fns_index_js").then(() => (() => (__webpack_require__(/*! date-fns */ 8))))))), +/******/ 7: () => (loadStrictVersion("default", "lodash/random", false, [1,4,17,19], () => (__webpack_require__.e("vendors-node_modules_lodash_random_js").then(() => (() => (__webpack_require__(/*! lodash/random */ 311))))))) +/******/ }; +/******/ // no consumes in initial chunks +/******/ var chunkMapping = { +/******/ "webpack_sharing_consume_default_react": [ +/******/ 4 +/******/ ], +/******/ "src-c_Component_js": [ +/******/ 5 +/******/ ], +/******/ "src-c_LazyComponent_js": [ +/******/ 7 +/******/ ] +/******/ }; +/******/ var startedInstallModules = {}; +/******/ __webpack_require__.f.consumes = (chunkId, promises) => { +/******/ if(__webpack_require__.o(chunkMapping, chunkId)) { +/******/ chunkMapping[chunkId].forEach((id) => { +/******/ if(__webpack_require__.o(installedModules, id)) return promises.push(installedModules[id]); +/******/ if(!startedInstallModules[id]) { +/******/ var onFactory = (factory) => { +/******/ installedModules[id] = 0; +/******/ __webpack_require__.m[id] = (module) => { +/******/ delete __webpack_require__.c[id]; +/******/ module.exports = factory(); +/******/ } +/******/ }; +/******/ startedInstallModules[id] = true; +/******/ var onError = (error) => { +/******/ delete installedModules[id]; +/******/ __webpack_require__.m[id] = (module) => { +/******/ delete __webpack_require__.c[id]; +/******/ throw error; +/******/ } +/******/ }; +/******/ try { +/******/ var promise = moduleToHandlerMapping[id](); +/******/ if(promise.then) { +/******/ promises.push(installedModules[id] = promise.then(onFactory)['catch'](onError)); +/******/ } else onFactory(promise); +/******/ } catch(e) { onError(e); } +/******/ } +/******/ }); +/******/ } +/******/ } +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "mfeCCC": 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // JSONP chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if("webpack_sharing_consume_default_react" != chunkId) { +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ installedChunkData[1](error); +/******/ } +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); +/******/ } else installedChunks[chunkId] = 0; +/******/ } +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ // no on chunks loaded +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); +/******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ +/******/ } +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunkmodule_federation_ccc"] = self["webpackChunkmodule_federation_ccc"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ +/************************************************************************/ +``` + +
+ +``` js +/******/ +/******/ // module cache are used so entry inlining is disabled +/******/ // startup +/******/ // Load entry module and return exports +/******/ var __webpack_exports__ = __webpack_require__(0); +/******/ mfeCCC = __webpack_exports__; +/******/ +/******/ })() +; +``` + +# Info + +## Unoptimized + +``` +app: + asset src_bootstrap_js.js 43.7 KiB [emitted] + asset app.js 30.1 KiB [emitted] (name: app) + asset vendors-node_modules_react_index_js.js 27.5 KiB [emitted] (id hint: vendors) + chunk (runtime: app) app.js (app) 672 bytes (javascript) 42 bytes (share-init) 19 KiB (runtime) [entry] [rendered] + > ./src/index.js app + runtime modules 19 KiB 13 modules + built modules 672 bytes (javascript) 42 bytes (share-init) [built] + ./src/index.js 588 bytes [built] [code generated] + external "mfeBBB@/dist/bbb/mfeBBB.js" 42 bytes [built] [code generated] + external "mfeCCC@/dist/ccc/mfeCCC.js" 42 bytes [built] [code generated] + provide shared module (default) react@19.1.0 = ../../node_modules/react/index.js 42 bytes [built] [code generated] + chunk (runtime: app) src_bootstrap_js.js 26.3 KiB (javascript) 84 bytes (consume-shared) 12 bytes (remote) 12 bytes (share-init) [rendered] + > ./bootstrap ./src/index.js 10:0-21 + dependent modules 25.9 KiB (javascript) 84 bytes (consume-shared) 12 bytes (remote) 12 bytes (share-init) [dependent] 17 modules + ./src/bootstrap.js 380 bytes [built] [code generated] + chunk (runtime: app) vendors-node_modules_react_index_js.js (id hint: vendors) 16.9 KiB [rendered] reused as split chunk (cache group: defaultVendors) + > provide shared module (default) react@19.1.0 = ../../node_modules/react/index.js + > consume shared module (default) react@^19.1.0 (singleton) (fallback: ../../node_modules/react/index.js) + > consume shared module (default) react@^19.0.0 (singleton) (fallback: ../../node_modules/react/index.js) + dependent modules 16.7 KiB [dependent] 1 module + ../../node_modules/react/index.js 186 bytes [built] [code generated] + chunk (runtime: app) 6 bytes (remote) 6 bytes (share-init) + > mfe-c/Component2 ./src/App.js 7:49-75 + remote mfe-c/Component2 6 bytes (remote) 6 bytes (share-init) [built] [code generated] + app (webpack X.X.X) compiled successfully + +mfe-b: + assets by chunk 1020 KiB (id hint: vendors) + asset vendors-node_modules_date-fns_index_js.js 995 KiB [emitted] (id hint: vendors) + asset vendors-node_modules_react_index_js.js 27.5 KiB [emitted] (id hint: vendors) + asset mfeBBB.js 24.6 KiB [emitted] (name: mfeBBB) + asset src-b_Component_js.js 2.25 KiB [emitted] + chunk (runtime: mfeBBB) mfeBBB.js (mfeBBB) 42 bytes (javascript) 84 bytes (share-init) 16.2 KiB (runtime) [entry] [rendered] + > mfeBBB + runtime modules 16.2 KiB 11 modules + built modules 42 bytes (javascript) 84 bytes (share-init) [built] + container entry 42 bytes [built] [code generated] + provide shared module (default) date-fns@4.1.0 = ../../node_modules/dat...(truncated) 42 bytes [built] [code generated] + provide shared module (default) react@19.1.0 = ../../node_modules/react/index.js 42 bytes [built] [code generated] + chunk (runtime: mfeBBB) src-b_Component_js.js 752 bytes (javascript) 84 bytes (consume-shared) [rendered] + > ./src-b/Component container entry ./Component + dependent modules 84 bytes [dependent] 2 modules + ./src-b/Component.js 752 bytes [built] [code generated] + chunk (runtime: mfeBBB) vendors-node_modules_date-fns_index_js.js (id hint: vendors) 520 KiB [rendered] reused as split chunk (cache group: defaultVendors) + > provide shared module (default) date-fns@4.1.0 = ../../node_modules/date-fns/index.js + > consume shared module (default) date-fns@^4.0.0 (strict) (fallback: ../../node_modules/date-fns/index.js) + dependent modules 512 KiB [dependent] 302 modules + ../../node_modules/date-fns/index.js 8.68 KiB [built] [code generated] + chunk (runtime: mfeBBB) vendors-node_modules_react_index_js.js (id hint: vendors) 16.9 KiB [rendered] reused as split chunk (cache group: defaultVendors) + > provide shared module (default) react@19.1.0 = ../../node_modules/react/index.js + > consume shared module (default) react@^19.0.0 (singleton) (fallback: ../../node_modules/react/index.js) + dependent modules 16.7 KiB [dependent] 1 module + ../../node_modules/react/index.js 186 bytes [built] [code generated] + mfe-b (webpack X.X.X) compiled successfully + +mfe-c: + assets by chunk 1020 KiB (id hint: vendors) + asset vendors-node_modules_date-fns_index_js.js 995 KiB [emitted] (id hint: vendors) + asset vendors-node_modules_lodash_random_js.js 24.8 KiB [emitted] (id hint: vendors) + asset mfeCCC.js 25.6 KiB [emitted] (name: mfeCCC) + asset src-c_LazyComponent_js.js 2.05 KiB [emitted] + asset src-c_Component_js.js 1.97 KiB [emitted] + chunk (runtime: mfeCCC) mfeCCC.js (mfeCCC) 42 bytes (javascript) 84 bytes (share-init) 16.6 KiB (runtime) [entry] [rendered] + > mfeCCC + runtime modules 16.6 KiB 12 modules + built modules 42 bytes (javascript) 84 bytes (share-init) [built] + container entry 42 bytes [built] [code generated] + provide shared module (default) date-fns@4.1.0 = ../../node_modules/dat...(truncated) 42 bytes [built] [code generated] + provide shared module (default) lodash/random@4.17.21 = ../../node_modules/lo...(truncated) 42 bytes [built] [code generated] + chunk (runtime: mfeCCC) src-c_Component_js.js 467 bytes (javascript) 42 bytes (consume-shared) [rendered] + > ./src-c/Component container entry ./Component + dependent modules 42 bytes [dependent] 1 module + ./src-c/Component.js 467 bytes [built] [code generated] + chunk (runtime: mfeCCC) src-c_LazyComponent_js.js 504 bytes (javascript) 42 bytes (consume-shared) [rendered] + > ./src-c/LazyComponent container entry ./Component2 + dependent modules 42 bytes [dependent] 1 module + ./src-c/LazyComponent.js 504 bytes [built] [code generated] + chunk (runtime: mfeCCC) vendors-node_modules_date-fns_index_js.js (id hint: vendors) 520 KiB [rendered] reused as split chunk (cache group: defaultVendors) + > provide shared module (default) date-fns@4.1.0 = ../../node_modules/date-fns/index.js + > consume shared module (default) date-fns@^4.0.0 (strict) (fallback: ../../node_modules/date-fns/index.js) + dependent modules 512 KiB [dependent] 302 modules + ../../node_modules/date-fns/index.js 8.68 KiB [built] [code generated] + chunk (runtime: mfeCCC) vendors-node_modules_lodash_random_js.js (id hint: vendors) 16 KiB [rendered] reused as split chunk (cache group: defaultVendors) + > provide shared module (default) lodash/random@4.17.21 = ../../node_modules/lodash/random.js + > consume shared module (default) lodash/random@^4.17.19 (strict) (fallback: ../../node_modules/lodash/random.js) + dependent modules 13.7 KiB [dependent] 20 modules + ../../node_modules/lodash/random.js 2.32 KiB [built] [code generated] + chunk (runtime: mfeCCC) 42 bytes split chunk (cache group: default) + > ./src-c/Component container entry ./Component + > ./src-c/LazyComponent container entry ./Component2 + consume shared module (default) react@^19.0.0 (singleton) 42 bytes [built] [code generated] + mfe-c (webpack X.X.X) compiled successfully +``` + +## Production mode + +``` +app: + asset src_bootstrap_js.js 12.5 KiB [emitted] [minimized] 1 related asset + asset app.js 7.66 KiB [emitted] [minimized] (name: app) + asset node_modules_react_index_js.js 7.46 KiB [emitted] [minimized] 1 related asset + chunk (runtime: app) app.js (app) 672 bytes (javascript) 42 bytes (share-init) 18.9 KiB (runtime) [entry] [rendered] + > ./src/index.js app + runtime modules 18.9 KiB 13 modules + built modules 672 bytes (javascript) 42 bytes (share-init) [built] + ./src/index.js 588 bytes [built] [code generated] + external "mfeBBB@/dist/bbb/mfeBBB.js" 42 bytes [built] [code generated] + external "mfeCCC@/dist/ccc/mfeCCC.js" 42 bytes [built] [code generated] + provide shared module (default) react@19.1.0 = ../../node_modules/react/index.js 42 bytes [built] [code generated] + chunk (runtime: app) node_modules_react_index_js.js 16.9 KiB [rendered] + > provide shared module (default) react@19.1.0 = ../../node_modules/react/index.js + > consume shared module (default) react@^19.1.0 (singleton) (fallback: ../../node_modules/react/index.js) + > consume shared module (default) react@^19.0.0 (singleton) (fallback: ../../node_modules/react/index.js) + dependent modules 16.7 KiB [dependent] 1 module + ../../node_modules/react/index.js 186 bytes [built] [code generated] + chunk (runtime: app) src_bootstrap_js.js 26.3 KiB (javascript) 84 bytes (consume-shared) 12 bytes (remote) 12 bytes (share-init) [rendered] + > ./bootstrap ./src/index.js 10:0-21 + dependent modules 7.83 KiB (javascript) 84 bytes (consume-shared) 12 bytes (remote) 12 bytes (share-init) [dependent] 6 modules + ./src/bootstrap.js + 11 modules 18.4 KiB [built] [code generated] + chunk (runtime: app) 6 bytes (remote) 6 bytes (share-init) + > mfe-c/Component2 ./src/App.js 7:49-75 + remote mfe-c/Component2 6 bytes (remote) 6 bytes (share-init) [built] [code generated] + app (webpack X.X.X) compiled successfully + +mfe-b: + asset vendors-node_modules_date-fns_index_js.js 70.4 KiB [emitted] [minimized] (id hint: vendors) + asset node_modules_react_index_js.js 7.46 KiB [emitted] [minimized] 1 related asset + asset mfeBBB.js 6.36 KiB [emitted] [minimized] (name: mfeBBB) + asset src-b_Component_js.js 489 bytes [emitted] [minimized] + chunk (runtime: mfeBBB) mfeBBB.js (mfeBBB) 42 bytes (javascript) 84 bytes (share-init) 16.1 KiB (runtime) [entry] [rendered] + > mfeBBB + runtime modules 16.1 KiB 11 modules + built modules 42 bytes (javascript) 84 bytes (share-init) [built] + container entry 42 bytes [built] [code generated] + provide shared module (default) date-fns@4.1.0 = ../../node_modules/dat...(truncated) 42 bytes [built] [code generated] + provide shared module (default) react@19.1.0 = ../../node_modules/react/index.js 42 bytes [built] [code generated] + chunk (runtime: mfeBBB) node_modules_react_index_js.js 16.9 KiB [rendered] + > provide shared module (default) react@19.1.0 = ../../node_modules/react/index.js + > consume shared module (default) react@^19.0.0 (singleton) (fallback: ../../node_modules/react/index.js) + dependent modules 16.7 KiB [dependent] 1 module + ../../node_modules/react/index.js 186 bytes [built] [code generated] + chunk (runtime: mfeBBB) src-b_Component_js.js 752 bytes (javascript) 84 bytes (consume-shared) [rendered] + > ./src-b/Component container entry ./Component + dependent modules 84 bytes [dependent] 2 modules + ./src-b/Component.js 752 bytes [built] [code generated] + chunk (runtime: mfeBBB) vendors-node_modules_date-fns_index_js.js (id hint: vendors) 520 KiB [rendered] reused as split chunk (cache group: defaultVendors) + > consume shared module (default) date-fns@^4.0.0 (strict) (fallback: ../../node_modules/date-fns/index.js) + > provide shared module (default) date-fns@4.1.0 = ../../node_modules/date-fns/index.js + ../../node_modules/date-fns/index.js + 302 modules 520 KiB [built] [code generated] + mfe-b (webpack X.X.X) compiled successfully + +mfe-c: + asset vendors-node_modules_date-fns_index_js.js 70.4 KiB [emitted] [minimized] (id hint: vendors) + asset mfeCCC.js 6.9 KiB [emitted] [minimized] (name: mfeCCC) + asset node_modules_lodash_random_js.js 3.13 KiB [emitted] [minimized] + asset src-c_LazyComponent_js.js 533 bytes [emitted] [minimized] + asset src-c_Component_js.js 488 bytes [emitted] [minimized] + chunk (runtime: mfeCCC) mfeCCC.js (mfeCCC) 42 bytes (javascript) 84 bytes (share-init) 16.5 KiB (runtime) [entry] [rendered] + > mfeCCC + runtime modules 16.5 KiB 12 modules + built modules 42 bytes (javascript) 84 bytes (share-init) [built] + container entry 42 bytes [built] [code generated] + provide shared module (default) date-fns@4.1.0 = ../../node_modules/dat...(truncated) 42 bytes [built] [code generated] + provide shared module (default) lodash/random@4.17.21 = ../../node_modules/lo...(truncated) 42 bytes [built] [code generated] + chunk (runtime: mfeCCC) node_modules_lodash_random_js.js 16 KiB [rendered] + > consume shared module (default) lodash/random@^4.17.19 (strict) (fallback: ../../node_modules/lodash/random.js) + > provide shared module (default) lodash/random@4.17.21 = ../../node_modules/lodash/random.js + dependent modules 13.7 KiB [dependent] 20 modules + ../../node_modules/lodash/random.js 2.32 KiB [built] [code generated] + chunk (runtime: mfeCCC) src-c_Component_js.js 467 bytes (javascript) 42 bytes (consume-shared) [rendered] + > ./src-c/Component container entry ./Component + dependent modules 42 bytes [dependent] 1 module + ./src-c/Component.js 467 bytes [built] [code generated] + chunk (runtime: mfeCCC) src-c_LazyComponent_js.js 504 bytes (javascript) 42 bytes (consume-shared) [rendered] + > ./src-c/LazyComponent container entry ./Component2 + dependent modules 42 bytes [dependent] 1 module + ./src-c/LazyComponent.js 504 bytes [built] [code generated] + chunk (runtime: mfeCCC) vendors-node_modules_date-fns_index_js.js (id hint: vendors) 520 KiB [rendered] reused as split chunk (cache group: defaultVendors) + > consume shared module (default) date-fns@^4.0.0 (strict) (fallback: ../../node_modules/date-fns/index.js) + > provide shared module (default) date-fns@4.1.0 = ../../node_modules/date-fns/index.js + ../../node_modules/date-fns/index.js + 302 modules 520 KiB [built] [code generated] + chunk (runtime: mfeCCC) 42 bytes split chunk (cache group: default) + > ./src-c/Component container entry ./Component + > ./src-c/LazyComponent container entry ./Component2 + consume shared module (default) react@^19.0.0 (singleton) 42 bytes [built] [code generated] + mfe-c (webpack X.X.X) compiled successfully +``` diff --git a/examples/module-federation/build.js b/examples/module-federation/build.js new file mode 100644 index 00000000000..2eab80c3400 --- /dev/null +++ b/examples/module-federation/build.js @@ -0,0 +1,5 @@ +global.NO_TARGET_ARGS = true; +global.NO_REASONS = true; +global.NO_STATS_OPTIONS = true; +global.NO_PUBLIC_PATH = true; +require("../build-common"); diff --git a/examples/module-federation/index.html b/examples/module-federation/index.html new file mode 100644 index 00000000000..f5a0a1ec244 --- /dev/null +++ b/examples/module-federation/index.html @@ -0,0 +1,83 @@ + + + + + + +
+ + + + + + + + + + + + + + + diff --git a/examples/module-federation/src-b/Component.js b/examples/module-federation/src-b/Component.js new file mode 100644 index 00000000000..4225568f1e2 --- /dev/null +++ b/examples/module-federation/src-b/Component.js @@ -0,0 +1,18 @@ +import React from "react"; +import { formatRelative, subDays } from "date-fns"; +// date-fns is a shared module, but used as usual +// exposing modules act as async boundary, +// so no additional async boundary need to be added here +// As data-fns is an shared module, it will be placed in a separate file +// It will be loaded in parallel to the code of this module + +const Component = ({ locale }) => ( +
+

I'm a Component exposed from container B!

+

+ Using date-fn in Remote:{" "} + {formatRelative(subDays(new Date(), 2), new Date(), { locale })} +

+
+); +export default Component; diff --git a/examples/module-federation/src-c/Component.js b/examples/module-federation/src-c/Component.js new file mode 100644 index 00000000000..dba8151efb8 --- /dev/null +++ b/examples/module-federation/src-c/Component.js @@ -0,0 +1,13 @@ +import React from "react"; +import { formatRelative, subDays } from "date-fns"; + +const Component = ({ locale }) => ( +
+

I'm a Component exposed from container C!

+

+ Using date-fn in Remote:{" "} + {formatRelative(subDays(new Date(), 3), new Date(), { locale })} +

+
+); +export default Component; diff --git a/examples/module-federation/src-c/LazyComponent.js b/examples/module-federation/src-c/LazyComponent.js new file mode 100644 index 00000000000..22dea24a471 --- /dev/null +++ b/examples/module-federation/src-c/LazyComponent.js @@ -0,0 +1,11 @@ +import React from "react"; +import random from "lodash/random"; + +const Component = () => ( +
+

I'm a lazy Component exposed from container C!

+

I'm lazy loaded by the app and lazy load another component myself.

+

Using lodash in Remote: {random(0, 6)}

+
+); +export default Component; diff --git a/examples/module-federation/src/App.js b/examples/module-federation/src/App.js new file mode 100644 index 00000000000..b58a5c19650 --- /dev/null +++ b/examples/module-federation/src/App.js @@ -0,0 +1,26 @@ +import React from "react"; +import ComponentB from "mfe-b/Component"; // <- these are remote modules, +import ComponentC from "mfe-c/Component"; // <- but they are used as usual packages +import { de } from "date-fns/locale"; + +// remote modules can also be used with import() which lazy loads them as usual +const ComponentD = React.lazy(() => import("mfe-c/Component2")); + +const App = () => ( +
+
+

Hello World

+
+

This component is from a remote container:

+ +

And this component is from another remote container:

+ + Lazy loading component...

}> +

+ And this component is from this remote container too, but lazy loaded: +

+ +
+
+); +export default App; diff --git a/examples/module-federation/src/bootstrap.js b/examples/module-federation/src/bootstrap.js new file mode 100644 index 00000000000..afb68467aba --- /dev/null +++ b/examples/module-federation/src/bootstrap.js @@ -0,0 +1,11 @@ +import ReactDom from "react-dom"; +import React from "react"; // <- this is a shared module, but used as usual +import App from "./App"; + +// load app +const el = document.createElement("main"); +ReactDom.render(, el); +document.body.appendChild(el); + +// remove spinner +document.body.removeChild(document.getElementsByClassName("spinner")[0]); diff --git a/examples/module-federation/src/index.js b/examples/module-federation/src/index.js new file mode 100644 index 00000000000..5e42922531e --- /dev/null +++ b/examples/module-federation/src/index.js @@ -0,0 +1,13 @@ +// Sharing modules requires that all remotes are initialized +// and can provide shared modules to the common scope +// As this is an async operation we need an async boundary (import()) + +// Using modules from remotes is also an async operation +// as chunks need to be loaded for the code of the remote module +// This also requires an async boundary (import()) + +// At this point shared modules initialized and remote modules are loaded +import("./bootstrap"); + +// It's possible to place more code here to do stuff on page init +// but it can't use any of the shared modules or remote modules. diff --git a/examples/module-federation/template.md b/examples/module-federation/template.md new file mode 100644 index 00000000000..abb4767fccb --- /dev/null +++ b/examples/module-federation/template.md @@ -0,0 +1,67 @@ +# webpack.config.js + +```javascript +_{{webpack.config.js}}_ +``` + +# src/index.js + +```javascript +_{{src/index.js}}_ +``` + +# src/bootstrap.js + +```jsx +_{{src/bootstrap.js}}_ +``` + +# src/App.js + +```jsx +_{{src/App.js}}_ +``` + +# index.html + +```html +_{{index.html}}_ +``` + +# src-b/Component.js + +```jsx +_{{src-b/Component.js}}_ +``` + +# dist/aaa/app.js + +```javascript +_{{dist/aaa/app.js}}_ +``` + +# dist/bbb/mfeBBB.js + +```javascript +_{{dist/bbb/mfeBBB.js}}_ +``` + +# dist/ccc/mfeCCC.js + +```javascript +_{{dist/ccc/mfeCCC.js}}_ +``` + +# Info + +## Unoptimized + +``` +_{{stdout}}_ +``` + +## Production mode + +``` +_{{production:stdout}}_ +``` diff --git a/examples/module-federation/webpack.config.js b/examples/module-federation/webpack.config.js new file mode 100644 index 00000000000..72f1e11ff3c --- /dev/null +++ b/examples/module-federation/webpack.config.js @@ -0,0 +1,150 @@ +const path = require("path"); +const { ModuleFederationPlugin } = require("../../").container; +const rules = [ + { + test: /\.js$/, + include: path.resolve(__dirname, "src"), + use: { + loader: "babel-loader", + options: { + presets: ["@babel/react"] + } + } + } +]; +const optimization = { + chunkIds: "named", // for this example only: readable filenames in production too + nodeEnv: "production" // for this example only: always production version of react +}; +const stats = { + chunks: true, + modules: false, + chunkModules: true, + chunkOrigins: true +}; +module.exports = (env = "development") => [ + // For this example we have 3 configs in a single file + // In practice you probably would have separate config + // maybe even separate repos for each build. + // For Module Federation there is not compile-time dependency + // between the builds. + // Each one can have different config options. + { + name: "app", + mode: env, + entry: { + app: "./src/index.js" + }, + output: { + filename: "[name].js", + path: path.resolve(__dirname, "dist/aaa"), + publicPath: "dist/aaa/", + + // Each build needs a unique name + // to avoid runtime collisions + // The default uses "name" from package.json + uniqueName: "module-federation-aaa" + }, + module: { rules }, + optimization, + plugins: [ + new ModuleFederationPlugin({ + // List of remotes with URLs + remotes: { + "mfe-b": "mfeBBB@/dist/bbb/mfeBBB.js", + "mfe-c": "mfeCCC@/dist/ccc/mfeCCC.js" + }, + + // list of shared modules with optional options + shared: { + // specifying a module request as shared module + // will provide all used modules matching this name (version from package.json) + // and consume shared modules in the version specified in dependencies from package.json + // (or in dev/peer/optionalDependencies) + // So it use the highest available version of this package matching the version requirement + // from package.json, while providing it's own version to others. + react: { + singleton: true // make sure only a single react module is used + } + } + }) + ], + stats + }, + { + name: "mfe-b", + mode: env, + entry: {}, + output: { + filename: "[name].js", + path: path.resolve(__dirname, "dist/bbb"), + publicPath: "dist/bbb/", + uniqueName: "module-federation-bbb" + }, + module: { rules }, + optimization, + plugins: [ + new ModuleFederationPlugin({ + // A unique name + name: "mfeBBB", + + // List of exposed modules + exposes: { + "./Component": "./src-b/Component" + }, + + // list of shared modules + shared: [ + // date-fns is shared with the other remote, app doesn't know about that + "date-fns", + { + react: { + singleton: true // must be specified in each config + } + } + ] + }) + ], + stats + }, + { + name: "mfe-c", + mode: env, + entry: {}, + output: { + filename: "[name].js", + path: path.resolve(__dirname, "dist/ccc"), + publicPath: "dist/ccc/", + uniqueName: "module-federation-ccc" + }, + module: { rules }, + optimization, + plugins: [ + new ModuleFederationPlugin({ + name: "mfeCCC", + + exposes: { + "./Component": "./src-c/Component", + "./Component2": "./src-c/LazyComponent" + }, + + shared: [ + // All (used) requests within lodash are shared. + "lodash/", + "date-fns", + { + react: { + // Do not load our own version. + // There must be a valid shared module available at runtime. + // This improves build time as this module doesn't need to be compiled, + // but it opts-out of possible fallbacks and runtime version upgrade. + import: false, + singleton: true + } + } + ] + }) + ], + stats + } +]; diff --git a/examples/module-library/README.md b/examples/module-library/README.md new file mode 100644 index 00000000000..9ee9d8939b8 --- /dev/null +++ b/examples/module-library/README.md @@ -0,0 +1,105 @@ +# example.js + +```javascript +export * from "./counter"; +export * from "./methods"; +``` + +# methods.js + +```javascript +export { reset as resetCounter } from "./counter"; + +export const print = value => console.log(value); +``` + +# counter.js + +```javascript +export let value = 0; +export function increment() { + value++; +} +export function decrement() { + value--; +} +export function reset() { + value = 0; +} +``` + +# dist/output.js + +```javascript +/*!********************************!*\ + !*** ./example.js + 2 modules ***! + \********************************/ +/*! namespace exports */ +/*! export decrement [provided] [used in main] [missing usage info prevents renaming] -> ./counter.js .decrement */ +/*! export increment [provided] [used in main] [missing usage info prevents renaming] -> ./counter.js .increment */ +/*! export print [provided] [used in main] [missing usage info prevents renaming] -> ./methods.js .print */ +/*! export reset [provided] [used in main] [missing usage info prevents renaming] -> ./counter.js .reset */ +/*! export resetCounter [provided] [used in main] [missing usage info prevents renaming] -> ./counter.js .reset */ +/*! export value [provided] [used in main] [missing usage info prevents renaming] -> ./counter.js .value */ +/*! other exports [not provided] [no usage info] */ +/*! runtime requirements: */ + +;// ./counter.js +let value = 0; +function increment() { + value++; +} +function decrement() { + value--; +} +function counter_reset() { + value = 0; +} + +;// ./methods.js + + +const print = value => console.log(value); + +;// ./example.js + + + +export { decrement, increment, print, counter_reset as reset, counter_reset as resetCounter, value }; +``` + +# dist/output.js (production) + +```javascript +let n=0;function o(){n++}function t(){n--}function e(){n=0}const s=n=>console.log(n);export{t as decrement,o as increment,s as print,e as reset,e as resetCounter,n as value}; +``` + +# Info + +## Unoptimized + +``` +asset output.js 1.19 KiB [emitted] [javascript module] (name: main) +chunk (runtime: main) output.js (main) 302 bytes [entry] [rendered] + > ./example.js main + ./example.js + 2 modules 302 bytes [built] [code generated] + [exports: decrement, increment, print, reset, resetCounter, value] + [used exports unknown] + entry ./example.js main + used as library export +webpack X.X.X compiled successfully +``` + +## Production mode + +``` +asset output.js 174 bytes [emitted] [javascript module] [minimized] (name: main) +chunk (runtime: main) output.js (main) 302 bytes [entry] [rendered] + > ./example.js main + ./example.js + 2 modules 302 bytes [built] [code generated] + [exports: decrement, increment, print, reset, resetCounter, value] + [all exports used] + entry ./example.js main + used as library export +webpack X.X.X compiled successfully +``` diff --git a/examples/module-library/build.js b/examples/module-library/build.js new file mode 100644 index 00000000000..41c29c9d169 --- /dev/null +++ b/examples/module-library/build.js @@ -0,0 +1 @@ +require("../build-common"); \ No newline at end of file diff --git a/examples/module-library/counter.js b/examples/module-library/counter.js new file mode 100644 index 00000000000..7009896e282 --- /dev/null +++ b/examples/module-library/counter.js @@ -0,0 +1,10 @@ +export let value = 0; +export function increment() { + value++; +} +export function decrement() { + value--; +} +export function reset() { + value = 0; +} diff --git a/examples/module-library/example.js b/examples/module-library/example.js new file mode 100644 index 00000000000..ef58a21ffa1 --- /dev/null +++ b/examples/module-library/example.js @@ -0,0 +1,2 @@ +export * from "./counter"; +export * from "./methods"; diff --git a/examples/module-library/methods.js b/examples/module-library/methods.js new file mode 100644 index 00000000000..4be8f10f704 --- /dev/null +++ b/examples/module-library/methods.js @@ -0,0 +1,3 @@ +export { reset as resetCounter } from "./counter"; + +export const print = value => console.log(value); diff --git a/examples/module-library/template.md b/examples/module-library/template.md new file mode 100644 index 00000000000..98d06e62ec9 --- /dev/null +++ b/examples/module-library/template.md @@ -0,0 +1,43 @@ +# example.js + +```javascript +_{{example.js}}_ +``` + +# methods.js + +```javascript +_{{methods.js}}_ +``` + +# counter.js + +```javascript +_{{counter.js}}_ +``` + +# dist/output.js + +```javascript +_{{dist/output.js}}_ +``` + +# dist/output.js (production) + +```javascript +_{{production:dist/output.js}}_ +``` + +# Info + +## Unoptimized + +``` +_{{stdout}}_ +``` + +## Production mode + +``` +_{{production:stdout}}_ +``` diff --git a/examples/module-library/webpack.config.js b/examples/module-library/webpack.config.js new file mode 100644 index 00000000000..d7f45aa6917 --- /dev/null +++ b/examples/module-library/webpack.config.js @@ -0,0 +1,14 @@ +module.exports = { + output: { + module: true, + library: { + type: "module" + } + }, + optimization: { + concatenateModules: true + }, + experiments: { + outputModule: true + } +}; diff --git a/examples/module-worker/README.md b/examples/module-worker/README.md new file mode 100644 index 00000000000..faad2abc327 --- /dev/null +++ b/examples/module-worker/README.md @@ -0,0 +1,920 @@ +# example.js + +```javascript +document.body.innerHTML = ` +

+	
+ + +
+

Computing fibonacci without worker:

+ +

+	

Computing fibonacci with worker:

+ +

+`;
+
+const history = document.getElementById("history");
+const message = document.getElementById("message");
+const send = document.getElementById("send");
+const fib1 = document.getElementById("fib1");
+const output1 = document.getElementById("output1");
+const fib2 = document.getElementById("fib2");
+const output2 = document.getElementById("output2");
+
+/// CHAT with shared worker ///
+
+const chatWorker = new SharedWorker(
+	new URL("./chat-worker.js", import.meta.url),
+	{
+		name: "chat",
+		type: "module"
+	}
+);
+
+let historyTimeout;
+const scheduleUpdateHistory = () => {
+	clearTimeout(historyTimeout);
+	historyTimeout = setTimeout(() => {
+		chatWorker.port.postMessage({ type: "history" });
+	}, 1000);
+};
+scheduleUpdateHistory();
+
+const from = `User ${Math.floor(Math.random() * 10000)}`;
+
+send.addEventListener("click", e => {
+	chatWorker.port.postMessage({
+		type: "message",
+		content: message.value,
+		from
+	});
+	message.value = "";
+	message.focus();
+	e.preventDefault();
+});
+
+chatWorker.port.onmessage = event => {
+	const msg = event.data;
+	switch (msg.type) {
+		case "history":
+			history.innerText = msg.history.join("\n");
+			scheduleUpdateHistory();
+			break;
+	}
+};
+
+/// FIBONACCI without worker ///
+
+fib1.addEventListener("change", async () => {
+	try {
+		const value = parseInt(fib1.value, 10);
+		const { fibonacci } = await import("./fibonacci");
+		const result = fibonacci(value);
+		output1.innerText = `fib(${value}) = ${result}`;
+	} catch (e) {
+		output1.innerText = e.message;
+	}
+});
+
+/// FIBONACCI with worker ///
+
+const fibWorker = new Worker(new URL("./fib-worker.js", import.meta.url), {
+	name: "fibonacci",
+	type: "module"
+	/* webpackEntryOptions: { filename: "workers/[name].js" } */
+});
+
+fib2.addEventListener("change", () => {
+	try {
+		const value = parseInt(fib2.value, 10);
+		fibWorker.postMessage(`${value}`);
+	} catch (e) {
+		output2.innerText = e.message;
+	}
+});
+
+fibWorker.onmessage = event => {
+	output2.innerText = event.data;
+};
+```
+
+# fib-worker.js
+
+```javascript
+onmessage = async event => {
+	const { fibonacci } = await import("./fibonacci");
+	const value = JSON.parse(event.data);
+	postMessage(`fib(${value}) = ${fibonacci(value)}`);
+};
+```
+
+# fibonacci.js
+
+```javascript
+export function fibonacci(n) {
+	return n < 1 ? 0 : n <= 2 ? 1 : fibonacci(n - 1) + fibonacci(n - 2);
+}
+```
+
+# chat-worker.js
+
+```javascript
+onconnect = function (e) {
+	for (const port of e.ports) {
+		port.onmessage = async event => {
+			const msg = event.data;
+			switch (msg.type) {
+				case "message":
+					const { add } = await import("./chat-module");
+					add(msg.content, msg.from);
+				// fallthrough
+				case "history":
+					const { history } = await import("./chat-module");
+					port.postMessage({
+						type: "history",
+						history
+					});
+					break;
+			}
+		};
+	}
+};
+```
+
+# chat-module.js
+
+```javascript
+export const history = [];
+
+export const add = (content, from) => {
+	if (history.length > 10) history.shift();
+	history.push(`${from}: ${content}`);
+};
+```
+
+# dist/main.js
+
+```javascript
+/******/ var __webpack_modules__ = ({});
+```
+
+
/* webpack runtime code */ + +``` js +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames not based on template +/******/ if (chunkId === 721) return "workers/fibonacci.js"; +/******/ // return url for filenames based on template +/******/ return "" + (chunkId === 377 ? "chat" : chunkId) + ".js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "/dist/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/import chunk loading */ +/******/ (() => { +/******/ __webpack_require__.b = new URL("./", import.meta.url); +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ 792: 0 +/******/ }; +/******/ +/******/ var installChunk = (data) => { +/******/ var {__webpack_ids__, __webpack_modules__, __webpack_runtime__} = data; +/******/ // add "modules" to the modules object, +/******/ // then flag all "ids" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ for(moduleId in __webpack_modules__) { +/******/ if(__webpack_require__.o(__webpack_modules__, moduleId)) { +/******/ __webpack_require__.m[moduleId] = __webpack_modules__[moduleId]; +/******/ } +/******/ } +/******/ if(__webpack_runtime__) __webpack_runtime__(__webpack_require__); +/******/ for(;i < __webpack_ids__.length; i++) { +/******/ chunkId = __webpack_ids__[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[__webpack_ids__[i]] = 0; +/******/ } +/******/ +/******/ } +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // import() chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[1]); +/******/ } else { +/******/ if(true) { // all chunks have JS +/******/ // setup Promise in chunk cache +/******/ var promise = import(__webpack_require__.p + "./" + __webpack_require__.u(chunkId)).then(installChunk, (e) => { +/******/ if(installedChunks[chunkId] !== 0) installedChunks[chunkId] = undefined; +/******/ throw e; +/******/ }); +/******/ var promise = Promise.race([promise, new Promise((resolve) => (installedChunkData = installedChunks[chunkId] = [resolve]))]) +/******/ promises.push(installedChunkData[1] = promise); +/******/ } +/******/ } +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no external install chunk +/******/ +/******/ // no on chunks loaded +/******/ })(); +/******/ +/************************************************************************/ +``` + +
+ +``` js +var __webpack_exports__ = {}; +/*!********************!*\ + !*** ./example.js ***! + \********************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: __webpack_require__.p, __webpack_require__.b, __webpack_require__.u, __webpack_require__.e, __webpack_require__, __webpack_require__.* */ +document.body.innerHTML = ` +

+	
+ + +
+

Computing fibonacci without worker:

+ +

+	

Computing fibonacci with worker:

+ +

+`;
+
+const history = document.getElementById("history");
+const message = document.getElementById("message");
+const send = document.getElementById("send");
+const fib1 = document.getElementById("fib1");
+const output1 = document.getElementById("output1");
+const fib2 = document.getElementById("fib2");
+const output2 = document.getElementById("output2");
+
+/// CHAT with shared worker ///
+
+const chatWorker = new SharedWorker(
+	new URL(/* worker import */ __webpack_require__.p + __webpack_require__.u(377), __webpack_require__.b),
+	{
+		name: "chat",
+		type: "module"
+	}
+);
+
+let historyTimeout;
+const scheduleUpdateHistory = () => {
+	clearTimeout(historyTimeout);
+	historyTimeout = setTimeout(() => {
+		chatWorker.port.postMessage({ type: "history" });
+	}, 1000);
+};
+scheduleUpdateHistory();
+
+const from = `User ${Math.floor(Math.random() * 10000)}`;
+
+send.addEventListener("click", e => {
+	chatWorker.port.postMessage({
+		type: "message",
+		content: message.value,
+		from
+	});
+	message.value = "";
+	message.focus();
+	e.preventDefault();
+});
+
+chatWorker.port.onmessage = event => {
+	const msg = event.data;
+	switch (msg.type) {
+		case "history":
+			history.innerText = msg.history.join("\n");
+			scheduleUpdateHistory();
+			break;
+	}
+};
+
+/// FIBONACCI without worker ///
+
+fib1.addEventListener("change", async () => {
+	try {
+		const value = parseInt(fib1.value, 10);
+		const { fibonacci } = await __webpack_require__.e(/*! import() */ 129).then(__webpack_require__.bind(__webpack_require__, /*! ./fibonacci */ 3));
+		const result = fibonacci(value);
+		output1.innerText = `fib(${value}) = ${result}`;
+	} catch (e) {
+		output1.innerText = e.message;
+	}
+});
+
+/// FIBONACCI with worker ///
+
+const fibWorker = new Worker(new URL(/* worker import */ __webpack_require__.p + __webpack_require__.u(721), __webpack_require__.b), {
+	name: "fibonacci",
+	type: "module"
+	/* webpackEntryOptions: { filename: "workers/[name].js" } */
+});
+
+fib2.addEventListener("change", () => {
+	try {
+		const value = parseInt(fib2.value, 10);
+		fibWorker.postMessage(`${value}`);
+	} catch (e) {
+		output2.innerText = e.message;
+	}
+});
+
+fibWorker.onmessage = event => {
+	output2.innerText = event.data;
+};
+```
+
+# dist/chat.js
+
+```javascript
+/******/ var __webpack_modules__ = ({});
+```
+
+
/* webpack runtime code */ + +``` js +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "/dist/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/import chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ 377: 0 +/******/ }; +/******/ +/******/ var installChunk = (data) => { +/******/ var {__webpack_ids__, __webpack_modules__, __webpack_runtime__} = data; +/******/ // add "modules" to the modules object, +/******/ // then flag all "ids" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ for(moduleId in __webpack_modules__) { +/******/ if(__webpack_require__.o(__webpack_modules__, moduleId)) { +/******/ __webpack_require__.m[moduleId] = __webpack_modules__[moduleId]; +/******/ } +/******/ } +/******/ if(__webpack_runtime__) __webpack_runtime__(__webpack_require__); +/******/ for(;i < __webpack_ids__.length; i++) { +/******/ chunkId = __webpack_ids__[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[__webpack_ids__[i]] = 0; +/******/ } +/******/ +/******/ } +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // import() chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[1]); +/******/ } else { +/******/ if(true) { // all chunks have JS +/******/ // setup Promise in chunk cache +/******/ var promise = import(__webpack_require__.p + "./" + __webpack_require__.u(chunkId)).then(installChunk, (e) => { +/******/ if(installedChunks[chunkId] !== 0) installedChunks[chunkId] = undefined; +/******/ throw e; +/******/ }); +/******/ var promise = Promise.race([promise, new Promise((resolve) => (installedChunkData = installedChunks[chunkId] = [resolve]))]) +/******/ promises.push(installedChunkData[1] = promise); +/******/ } +/******/ } +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no external install chunk +/******/ +/******/ // no on chunks loaded +/******/ })(); +/******/ +/************************************************************************/ +``` + +
+ +``` js +var __webpack_exports__ = {}; +/*!************************!*\ + !*** ./chat-worker.js ***! + \************************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: __webpack_require__.e, __webpack_require__, __webpack_require__.* */ +onconnect = function (e) { + for (const port of e.ports) { + port.onmessage = async event => { + const msg = event.data; + switch (msg.type) { + case "message": + const { add } = await __webpack_require__.e(/*! import() */ 936).then(__webpack_require__.bind(__webpack_require__, /*! ./chat-module */ 4)); + add(msg.content, msg.from); + // fallthrough + case "history": + const { history } = await __webpack_require__.e(/*! import() */ 936).then(__webpack_require__.bind(__webpack_require__, /*! ./chat-module */ 4)); + port.postMessage({ + type: "history", + history + }); + break; + } + }; + } +}; +``` + +```javascript +var e,o,t={},r={};function s(e){var o=r[e];if(void 0!==o)return o.exports;var n=r[e]={exports:{}};return t[e](n,n.exports,s),n.exports}s.m=t,s.d=(e,o)=>{for(var t in o)s.o(o,t)&&!s.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:o[t]})},s.f={},s.e=e=>Promise.all(Object.keys(s.f).reduce(((o,t)=>(s.f[t](e,o),o)),[])),s.u=e=>e+".js",s.o=(e,o)=>Object.prototype.hasOwnProperty.call(e,o),s.p="/dist/",e={377:0},o=o=>{var t,r,{__webpack_ids__:n,__webpack_modules__:a,__webpack_runtime__:i}=o,c=0;for(t in a)s.o(a,t)&&(s.m[t]=a[t]);for(i&&i(s);c{var n=s.o(e,t)?e[t]:void 0;if(0!==n)if(n)r.push(n[1]);else{var a=import(s.p+"./"+s.u(t)).then(o,(o=>{throw 0!==e[t]&&(e[t]=void 0),o}));a=Promise.race([a,new Promise((o=>n=e[t]=[o]))]),r.push(n[1]=a)}},onconnect=function(e){for(const o of e.ports)o.onmessage=async e=>{const t=e.data;switch(t.type){case"message":const{add:e}=await s.e(936).then(s.bind(s,936));e(t.content,t.from);case"history":const{history:r}=await s.e(936).then(s.bind(s,936));o.postMessage({type:"history",history:r})}}}; +``` + +# dist/workers/fibonacci.js + +```javascript +/******/ var __webpack_modules__ = ({}); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { +/******/ // define __esModule on exports +/******/ __webpack_require__.r = (exports) => { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "/dist/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/import chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ 721: 0 +/******/ }; +/******/ +/******/ var installChunk = (data) => { +/******/ var {__webpack_ids__, __webpack_modules__, __webpack_runtime__} = data; +/******/ // add "modules" to the modules object, +/******/ // then flag all "ids" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ for(moduleId in __webpack_modules__) { +/******/ if(__webpack_require__.o(__webpack_modules__, moduleId)) { +/******/ __webpack_require__.m[moduleId] = __webpack_modules__[moduleId]; +/******/ } +/******/ } +/******/ if(__webpack_runtime__) __webpack_runtime__(__webpack_require__); +/******/ for(;i < __webpack_ids__.length; i++) { +/******/ chunkId = __webpack_ids__[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[__webpack_ids__[i]] = 0; +/******/ } +/******/ +/******/ } +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // import() chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[1]); +/******/ } else { +/******/ if(true) { // all chunks have JS +/******/ // setup Promise in chunk cache +/******/ var promise = import(__webpack_require__.p + "../" + __webpack_require__.u(chunkId)).then(installChunk, (e) => { +/******/ if(installedChunks[chunkId] !== 0) installedChunks[chunkId] = undefined; +/******/ throw e; +/******/ }); +/******/ var promise = Promise.race([promise, new Promise((resolve) => (installedChunkData = installedChunks[chunkId] = [resolve]))]) +/******/ promises.push(installedChunkData[1] = promise); +/******/ } +/******/ } +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no external install chunk +/******/ +/******/ // no on chunks loaded +/******/ })(); +/******/ +/************************************************************************/ +``` + +
+ +``` js +var __webpack_exports__ = {}; +/*!***********************!*\ + !*** ./fib-worker.js ***! + \***********************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: __webpack_require__.e, __webpack_require__, __webpack_require__.* */ +onmessage = async event => { + const { fibonacci } = await __webpack_require__.e(/*! import() */ 129).then(__webpack_require__.bind(__webpack_require__, /*! ./fibonacci */ 3)); + const value = JSON.parse(event.data); + postMessage(`fib(${value}) = ${fibonacci(value)}`); +}; +``` + +```javascript +var e,r,o={},t={};function a(e){var r=t[e];if(void 0!==r)return r.exports;var s=t[e]={exports:{}};return o[e](s,s.exports,a),s.exports}a.m=o,a.d=(e,r)=>{for(var o in r)a.o(r,o)&&!a.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:r[o]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((r,o)=>(a.f[o](e,r),r)),[])),a.u=e=>e+".js",a.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),a.p="/dist/",e={721:0},r=r=>{var o,t,{__webpack_ids__:s,__webpack_modules__:i,__webpack_runtime__:n}=r,p=0;for(o in i)a.o(i,o)&&(a.m[o]=i[o]);for(n&&n(a);p{var s=a.o(e,o)?e[o]:void 0;if(0!==s)if(s)t.push(s[1]);else{var i=import(a.p+"../"+a.u(o)).then(r,(r=>{throw 0!==e[o]&&(e[o]=void 0),r}));i=Promise.race([i,new Promise((r=>s=e[o]=[r]))]),t.push(s[1]=i)}},onmessage=async e=>{const{fibonacci:r}=await a.e(129).then(a.bind(a,129)),o=JSON.parse(e.data);postMessage(`fib(${o}) = ${r(o)}`)}; +``` + +# dist/129.js + +```javascript +export const __webpack_id__ = 129; +export const __webpack_ids__ = [129]; +export const __webpack_modules__ = { + +/***/ 3: +/*!**********************!*\ + !*** ./fibonacci.js ***! + \**********************/ +/*! namespace exports */ +/*! export fibonacci [provided] [no usage info] [missing usage info prevents renaming] */ +/*! other exports [not provided] [no usage info] */ +/*! runtime requirements: __webpack_require__.r, __webpack_exports__, __webpack_require__.d, __webpack_require__.* */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ fibonacci: () => (/* binding */ fibonacci) +/* harmony export */ }); +function fibonacci(n) { + return n < 1 ? 0 : n <= 2 ? 1 : fibonacci(n - 1) + fibonacci(n - 2); +} + + +/***/ }) + +}; +``` + +# Info + +## Unoptimized + +``` +asset main.js 8.74 KiB [emitted] [javascript module] (name: main) +asset chat.js 6.65 KiB [emitted] [javascript module] (name: chat) +asset workers/fibonacci.js 6.3 KiB [emitted] [javascript module] (name: fibonacci) +asset 936.js 1.04 KiB [emitted] [javascript module] +asset 129.js 881 bytes [emitted] [javascript module] +chunk (runtime: 9a81d90cfd0dfd13d748, main) 129.js 103 bytes [rendered] + > ./fibonacci ./example.js 70:30-51 + > ./fibonacci ./fib-worker.js 2:29-50 + ./fibonacci.js 103 bytes [built] [code generated] + [exports: fibonacci] + [used exports unknown] + import() ./fibonacci ./example.js 70:30-51 + import() ./fibonacci ./fib-worker.js 2:29-50 +chunk (runtime: 1fad8bf8de78b0a77bfd) chat.js (chat) 442 bytes (javascript) 3.04 KiB (runtime) [entry] [rendered] + > ./example.js 25:19-31:1 + runtime modules 3.04 KiB 7 modules + ./chat-worker.js 442 bytes [built] [code generated] + [used exports unknown] + new Worker() ./chat-worker.js ./example.js 25:19-31:1 +chunk (runtime: 9a81d90cfd0dfd13d748) workers/fibonacci.js (fibonacci) 176 bytes (javascript) 3.04 KiB (runtime) [entry] [rendered] + > ./example.js 80:18-84:2 + runtime modules 3.04 KiB 7 modules + ./fib-worker.js 176 bytes [built] [code generated] + [used exports unknown] + new Worker() ./fib-worker.js ./example.js 80:18-84:2 +chunk (runtime: main) main.js (main) 2.25 KiB (javascript) 3.21 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 3.21 KiB 7 modules + ./example.js 2.25 KiB [built] [code generated] + [used exports unknown] + entry ./example.js main +chunk (runtime: 1fad8bf8de78b0a77bfd) 936.js 152 bytes [rendered] + > ./chat-module ./chat-worker.js 11:31-54 + > ./chat-module ./chat-worker.js 7:27-50 + ./chat-module.js 152 bytes [built] [code generated] + [exports: add, history] + [used exports unknown] + import() ./chat-module ./chat-worker.js 7:27-50 + import() ./chat-module ./chat-worker.js 11:31-54 +webpack X.X.X compiled successfully +``` + +## Production mode + +``` +asset main.js 2.37 KiB [emitted] [javascript module] [minimized] (name: main) +asset chat.js 1.08 KiB [emitted] [javascript module] [minimized] (name: chat) +asset workers/fibonacci.js 951 bytes [emitted] [javascript module] [minimized] (name: fibonacci) +asset 936.js 216 bytes [emitted] [javascript module] [minimized] +asset 129.js 190 bytes [emitted] [javascript module] [minimized] +chunk (runtime: 9a81d90cfd0dfd13d748, main) 129.js 103 bytes [rendered] + > ./fibonacci ./fib-worker.js 2:29-50 + > ./fibonacci ./example.js 70:30-51 + ./fibonacci.js 103 bytes [built] [code generated] + [exports: fibonacci] + [all exports used] + import() ./fibonacci ./example.js 70:30-51 + import() ./fibonacci ./fib-worker.js 2:29-50 +chunk (runtime: 1fad8bf8de78b0a77bfd) chat.js (chat) 442 bytes (javascript) 2.77 KiB (runtime) [entry] [rendered] + > ./example.js 25:19-31:1 + runtime modules 2.77 KiB 6 modules + ./chat-worker.js 442 bytes [built] [code generated] + [no exports used] + new Worker() ./chat-worker.js ./example.js 25:19-31:1 +chunk (runtime: 9a81d90cfd0dfd13d748) workers/fibonacci.js (fibonacci) 176 bytes (javascript) 2.78 KiB (runtime) [entry] [rendered] + > ./example.js 80:18-84:2 + runtime modules 2.78 KiB 6 modules + ./fib-worker.js 176 bytes [built] [code generated] + [no exports used] + new Worker() ./fib-worker.js ./example.js 80:18-84:2 +chunk (runtime: main) main.js (main) 2.25 KiB (javascript) 2.95 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 2.95 KiB 6 modules + ./example.js 2.25 KiB [built] [code generated] + [no exports used] + entry ./example.js main +chunk (runtime: 1fad8bf8de78b0a77bfd) 936.js 152 bytes [rendered] + > ./chat-module ./chat-worker.js 11:31-54 + > ./chat-module ./chat-worker.js 7:27-50 + ./chat-module.js 152 bytes [built] [code generated] + [exports: add, history] + [all exports used] + import() ./chat-module ./chat-worker.js 7:27-50 + import() ./chat-module ./chat-worker.js 11:31-54 +webpack X.X.X compiled successfully +``` diff --git a/examples/module-worker/build.js b/examples/module-worker/build.js new file mode 100644 index 00000000000..5768b058787 --- /dev/null +++ b/examples/module-worker/build.js @@ -0,0 +1,3 @@ +global.NO_TARGET_ARGS = true; +global.NO_PUBLIC_PATH = true; +require("../build-common"); diff --git a/examples/module-worker/chat-module.js b/examples/module-worker/chat-module.js new file mode 100644 index 00000000000..716a104a9dc --- /dev/null +++ b/examples/module-worker/chat-module.js @@ -0,0 +1,6 @@ +export const history = []; + +export const add = (content, from) => { + if (history.length > 10) history.shift(); + history.push(`${from}: ${content}`); +}; diff --git a/examples/module-worker/chat-worker.js b/examples/module-worker/chat-worker.js new file mode 100644 index 00000000000..1a8bcb81ea0 --- /dev/null +++ b/examples/module-worker/chat-worker.js @@ -0,0 +1,20 @@ +onconnect = function (e) { + for (const port of e.ports) { + port.onmessage = async event => { + const msg = event.data; + switch (msg.type) { + case "message": + const { add } = await import("./chat-module"); + add(msg.content, msg.from); + // fallthrough + case "history": + const { history } = await import("./chat-module"); + port.postMessage({ + type: "history", + history + }); + break; + } + }; + } +}; diff --git a/examples/module-worker/example.js b/examples/module-worker/example.js new file mode 100644 index 00000000000..fcbe23f092f --- /dev/null +++ b/examples/module-worker/example.js @@ -0,0 +1,97 @@ +document.body.innerHTML = ` +

+	
+ + +
+

Computing fibonacci without worker:

+ +

+	

Computing fibonacci with worker:

+ +

+`;
+
+const history = document.getElementById("history");
+const message = document.getElementById("message");
+const send = document.getElementById("send");
+const fib1 = document.getElementById("fib1");
+const output1 = document.getElementById("output1");
+const fib2 = document.getElementById("fib2");
+const output2 = document.getElementById("output2");
+
+/// CHAT with shared worker ///
+
+const chatWorker = new SharedWorker(
+	new URL("./chat-worker.js", import.meta.url),
+	{
+		name: "chat",
+		type: "module"
+	}
+);
+
+let historyTimeout;
+const scheduleUpdateHistory = () => {
+	clearTimeout(historyTimeout);
+	historyTimeout = setTimeout(() => {
+		chatWorker.port.postMessage({ type: "history" });
+	}, 1000);
+};
+scheduleUpdateHistory();
+
+const from = `User ${Math.floor(Math.random() * 10000)}`;
+
+send.addEventListener("click", e => {
+	chatWorker.port.postMessage({
+		type: "message",
+		content: message.value,
+		from
+	});
+	message.value = "";
+	message.focus();
+	e.preventDefault();
+});
+
+chatWorker.port.onmessage = event => {
+	const msg = event.data;
+	switch (msg.type) {
+		case "history":
+			history.innerText = msg.history.join("\n");
+			scheduleUpdateHistory();
+			break;
+	}
+};
+
+/// FIBONACCI without worker ///
+
+fib1.addEventListener("change", async () => {
+	try {
+		const value = parseInt(fib1.value, 10);
+		const { fibonacci } = await import("./fibonacci");
+		const result = fibonacci(value);
+		output1.innerText = `fib(${value}) = ${result}`;
+	} catch (e) {
+		output1.innerText = e.message;
+	}
+});
+
+/// FIBONACCI with worker ///
+
+const fibWorker = new Worker(new URL("./fib-worker.js", import.meta.url), {
+	name: "fibonacci",
+	type: "module"
+	/* webpackEntryOptions: { filename: "workers/[name].js" } */
+});
+
+fib2.addEventListener("change", () => {
+	try {
+		const value = parseInt(fib2.value, 10);
+		fibWorker.postMessage(`${value}`);
+	} catch (e) {
+		output2.innerText = e.message;
+	}
+});
+
+fibWorker.onmessage = event => {
+	output2.innerText = event.data;
+};
diff --git a/examples/module-worker/fib-worker.js b/examples/module-worker/fib-worker.js
new file mode 100644
index 00000000000..42efa83cf4e
--- /dev/null
+++ b/examples/module-worker/fib-worker.js
@@ -0,0 +1,5 @@
+onmessage = async event => {
+	const { fibonacci } = await import("./fibonacci");
+	const value = JSON.parse(event.data);
+	postMessage(`fib(${value}) = ${fibonacci(value)}`);
+};
diff --git a/examples/module-worker/fibonacci.js b/examples/module-worker/fibonacci.js
new file mode 100644
index 00000000000..282fcec2fca
--- /dev/null
+++ b/examples/module-worker/fibonacci.js
@@ -0,0 +1,3 @@
+export function fibonacci(n) {
+	return n < 1 ? 0 : n <= 2 ? 1 : fibonacci(n - 1) + fibonacci(n - 2);
+}
diff --git a/examples/module-worker/index.html b/examples/module-worker/index.html
new file mode 100644
index 00000000000..e3b460bdf15
--- /dev/null
+++ b/examples/module-worker/index.html
@@ -0,0 +1,10 @@
+
+
+	
+		
+		Worker example
+	
+	
+		
+	
+
diff --git a/examples/module-worker/template.md b/examples/module-worker/template.md
new file mode 100644
index 00000000000..6a93ddfd9b5
--- /dev/null
+++ b/examples/module-worker/template.md
@@ -0,0 +1,75 @@
+# example.js
+
+```javascript
+_{{example.js}}_
+```
+
+# fib-worker.js
+
+```javascript
+_{{fib-worker.js}}_
+```
+
+# fibonacci.js
+
+```javascript
+_{{fibonacci.js}}_
+```
+
+# chat-worker.js
+
+```javascript
+_{{chat-worker.js}}_
+```
+
+# chat-module.js
+
+```javascript
+_{{chat-module.js}}_
+```
+
+# dist/main.js
+
+```javascript
+_{{dist/main.js}}_
+```
+
+# dist/chat.js
+
+```javascript
+_{{dist/chat.js}}_
+```
+
+```javascript
+_{{production:dist/chat.js}}_
+```
+
+# dist/workers/fibonacci.js
+
+```javascript
+_{{dist/workers/fibonacci.js}}_
+```
+
+```javascript
+_{{production:dist/workers/fibonacci.js}}_
+```
+
+# dist/129.js
+
+```javascript
+_{{dist/129.js}}_
+```
+
+# Info
+
+## Unoptimized
+
+```
+_{{stdout}}_
+```
+
+## Production mode
+
+```
+_{{production:stdout}}_
+```
diff --git a/examples/module-worker/webpack.config.js b/examples/module-worker/webpack.config.js
new file mode 100644
index 00000000000..7787a5113be
--- /dev/null
+++ b/examples/module-worker/webpack.config.js
@@ -0,0 +1,18 @@
+const path = require("path");
+
+module.exports = {
+	entry: "./example.js",
+	output: {
+		path: path.join(__dirname, "dist"),
+		filename: "[name].js",
+		chunkFilename: "[name].js",
+		publicPath: "/dist/"
+	},
+	optimization: {
+		chunkIds: "deterministic" // To keep filename consistent between different modes (for example building only)
+	},
+	target: "browserslist: last 2 Chrome versions",
+	experiments: {
+		outputModule: true
+	}
+};
diff --git a/examples/module/README.md b/examples/module/README.md
new file mode 100644
index 00000000000..1d12f4aaf4d
--- /dev/null
+++ b/examples/module/README.md
@@ -0,0 +1,118 @@
+# example.js
+
+```javascript
+import { increment as inc, value } from "./counter";
+import { resetCounter, print } from "./methods";
+print(value);
+inc();
+inc();
+inc();
+print(value);
+resetCounter();
+print(value);
+
+export { inc, print };
+```
+
+# methods.js
+
+```javascript
+export { reset as resetCounter } from "./counter";
+
+export const print = value => console.log(value);
+```
+
+# counter.js
+
+```javascript
+export let value = 0;
+export function increment() {
+	value++;
+}
+export function decrement() {
+	value--;
+}
+export function reset() {
+	value = 0;
+}
+```
+
+# dist/output.js
+
+```javascript
+/*!********************************!*\
+  !*** ./example.js + 2 modules ***!
+  \********************************/
+/*! namespace exports */
+/*! export inc [provided] [used in main] [could be renamed] -> ./counter.js .increment */
+/*! export print [provided] [used in main] [could be renamed] -> ./methods.js .print */
+/*! runtime requirements:  */
+
+;// ./counter.js
+let value = 0;
+function increment() {
+	value++;
+}
+function decrement() {
+	value--;
+}
+function counter_reset() {
+	value = 0;
+}
+
+;// ./methods.js
+
+
+const print = value => console.log(value);
+
+;// ./example.js
+
+
+print(value);
+increment();
+increment();
+increment();
+print(value);
+counter_reset();
+print(value);
+
+
+
+export { increment as inc, print };
+```
+
+# dist/output.js (production)
+
+```javascript
+let o=0;function n(){o++}const c=o=>console.log(o);c(o),n(),n(),n(),c(o),o=0,c(o);export{n as inc,c as print};
+```
+
+# Info
+
+## Unoptimized
+
+```
+asset output.js 710 bytes [emitted] [javascript module] (name: main)
+chunk (runtime: main) output.js (main) 453 bytes [entry] [rendered]
+  > ./example.js main
+  ./example.js + 2 modules 453 bytes [built] [code generated]
+    [exports: inc, print]
+    [all exports used]
+    entry ./example.js main
+    used as library export
+webpack X.X.X compiled successfully
+```
+
+## Production mode
+
+```
+asset output.js 110 bytes [emitted] [javascript module] [minimized] (name: main)
+chunk (runtime: main) output.js (main) 453 bytes [entry] [rendered]
+  > ./example.js main
+  ./example.js + 2 modules 453 bytes [built] [code generated]
+    [exports: inc, print]
+    [all exports used]
+    entry ./example.js main
+    used as library export
+webpack X.X.X compiled successfully
+```
diff --git a/examples/module/build.js b/examples/module/build.js
new file mode 100644
index 00000000000..41c29c9d169
--- /dev/null
+++ b/examples/module/build.js
@@ -0,0 +1 @@
+require("../build-common");
\ No newline at end of file
diff --git a/examples/module/counter.js b/examples/module/counter.js
new file mode 100644
index 00000000000..7009896e282
--- /dev/null
+++ b/examples/module/counter.js
@@ -0,0 +1,10 @@
+export let value = 0;
+export function increment() {
+	value++;
+}
+export function decrement() {
+	value--;
+}
+export function reset() {
+	value = 0;
+}
diff --git a/examples/module/example.js b/examples/module/example.js
new file mode 100644
index 00000000000..29e215a8009
--- /dev/null
+++ b/examples/module/example.js
@@ -0,0 +1,11 @@
+import { increment as inc, value } from "./counter";
+import { resetCounter, print } from "./methods";
+print(value);
+inc();
+inc();
+inc();
+print(value);
+resetCounter();
+print(value);
+
+export { inc, print };
diff --git a/examples/module/methods.js b/examples/module/methods.js
new file mode 100644
index 00000000000..4be8f10f704
--- /dev/null
+++ b/examples/module/methods.js
@@ -0,0 +1,3 @@
+export { reset as resetCounter } from "./counter";
+
+export const print = value => console.log(value);
diff --git a/examples/module/template.md b/examples/module/template.md
new file mode 100644
index 00000000000..98d06e62ec9
--- /dev/null
+++ b/examples/module/template.md
@@ -0,0 +1,43 @@
+# example.js
+
+```javascript
+_{{example.js}}_
+```
+
+# methods.js
+
+```javascript
+_{{methods.js}}_
+```
+
+# counter.js
+
+```javascript
+_{{counter.js}}_
+```
+
+# dist/output.js
+
+```javascript
+_{{dist/output.js}}_
+```
+
+# dist/output.js (production)
+
+```javascript
+_{{production:dist/output.js}}_
+```
+
+# Info
+
+## Unoptimized
+
+```
+_{{stdout}}_
+```
+
+## Production mode
+
+```
+_{{production:stdout}}_
+```
diff --git a/examples/module/webpack.config.js b/examples/module/webpack.config.js
new file mode 100644
index 00000000000..0f10a6d3d39
--- /dev/null
+++ b/examples/module/webpack.config.js
@@ -0,0 +1,15 @@
+module.exports = {
+	output: {
+		module: true,
+		library: {
+			type: "module"
+		}
+	},
+	optimization: {
+		usedExports: true,
+		concatenateModules: true
+	},
+	experiments: {
+		outputModule: true
+	}
+};
diff --git a/examples/multi-compiler/README.md b/examples/multi-compiler/README.md
index c3337e50046..efb228b05aa 100644
--- a/examples/multi-compiler/README.md
+++ b/examples/multi-compiler/README.md
@@ -1,7 +1,6 @@
-
 # example.js
 
-``` javascript
+```javascript
 if(ENV === "mobile") {
 	require("./mobile-stuff");
 }
@@ -10,13 +9,14 @@ console.log("Running " + ENV + " build");
 
 # webpack.config.js
 
-``` javascript
-var path = require("path");
-var webpack = require("../../");
+```javascript
+const path = require("path");
+const webpack = require("../../");
+
 module.exports = [
 	{
 		name: "mobile",
-		// mode: "development || "production",
+		// mode: "development" || "production",
 		entry: "./example",
 		output: {
 			path: path.join(__dirname, "dist"),
@@ -31,7 +31,7 @@ module.exports = [
 
 	{
 		name: "desktop",
-		// mode: "development || "production",
+		// mode: "development" || "production",
 		entry: "./example",
 		output: {
 			path: path.join(__dirname, "dist"),
@@ -48,229 +48,88 @@ module.exports = [
 
 # dist/desktop.js
 
-
/******/ (function(modules) { /* webpackBootstrap */ }) - -``` javascript -/******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); -/******/ }) -/************************************************************************/ -``` - -
- -``` javascript -/******/ ([ -/* 0 */ +```javascript +/******/ (() => { // webpackBootstrap /*!********************!*\ !*** ./example.js ***! \********************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: */ if(false) {} console.log("Running " + "desktop" + " build"); +/******/ })() +; +``` + +# dist/mobile.js + +```javascript +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */ +/*!*************************!*\ + !*** ./mobile-stuff.js ***! + \*************************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: */ +/***/ (() => { + +// mobile only stuff /***/ }) -/******/ ]); +/******/ ]); ``` -# dist/mobile.js +
/* webpack runtime code */ -``` javascript -/******/ (function(modules) { // webpackBootstrap +``` js +/************************************************************************/ /******/ // The module cache -/******/ var installedModules = {}; -/******/ +/******/ var __webpack_module_cache__ = {}; +/******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { -/******/ /******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed /******/ exports: {} /******/ }; -/******/ +/******/ /******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); -/******/ }) +/******/ /************************************************************************/ -/******/ ([ -/* 0 */ +``` + +
+ +``` js +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { /*!********************!*\ !*** ./example.js ***! \********************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: __webpack_require__ */ if(true) { __webpack_require__(/*! ./mobile-stuff */ 1); } console.log("Running " + "mobile" + " build"); +})(); -/***/ }), -/* 1 */ -/*!*************************!*\ - !*** ./mobile-stuff.js ***! - \*************************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -// mobile only stuff - -/***/ }) -/******/ ]); +/******/ })() +; ``` # Info @@ -278,53 +137,45 @@ console.log("Running " + "mobile" + " build"); ## Unoptimized ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 -Child mobile: - Hash: 0a1b2c3d4e5f6a7b8c9d - Asset Size Chunks Chunk Names - mobile.js 4 KiB 0 [emitted] main - Entrypoint main = mobile.js - chunk {0} mobile.js (main) 114 bytes [entry] [rendered] - > ./example main - [0] ./example.js 94 bytes {0} [built] - single entry ./example main - [1] ./mobile-stuff.js 20 bytes {0} [built] - cjs require ./mobile-stuff [0] ./example.js 2:1-26 -Child desktop: - Hash: 0a1b2c3d4e5f6a7b8c9d - Asset Size Chunks Chunk Names - desktop.js 3.76 KiB 0 [emitted] main - Entrypoint main = desktop.js - chunk {0} desktop.js (main) 94 bytes [entry] [rendered] - > ./example main - [0] ./example.js 94 bytes {0} [built] - single entry ./example main +mobile: + asset mobile.js 1.71 KiB [emitted] (name: main) + chunk (runtime: main) mobile.js (main) 114 bytes [entry] [rendered] + > ./example main + dependent modules 20 bytes [dependent] 1 module + ./example.js 94 bytes [built] [code generated] + [used exports unknown] + entry ./example main + mobile (webpack X.X.X) compiled successfully + +desktop: + asset desktop.js 262 bytes [emitted] (name: main) + chunk (runtime: main) desktop.js (main) 94 bytes [entry] [rendered] + > ./example main + ./example.js 94 bytes [built] [code generated] + [used exports unknown] + entry ./example main + desktop (webpack X.X.X) compiled successfully ``` ## Production mode ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 -Child mobile: - Hash: 0a1b2c3d4e5f6a7b8c9d - Asset Size Chunks Chunk Names - mobile.js 993 bytes 0 [emitted] main - Entrypoint main = mobile.js - chunk {0} mobile.js (main) 114 bytes [entry] [rendered] - > ./example main - [0] ./example.js 94 bytes {0} [built] - single entry ./example main - [1] ./mobile-stuff.js 20 bytes {0} [built] - cjs require ./mobile-stuff [0] ./example.js 2:1-26 -Child desktop: - Hash: 0a1b2c3d4e5f6a7b8c9d - Asset Size Chunks Chunk Names - desktop.js 973 bytes 0 [emitted] main - Entrypoint main = desktop.js - chunk {0} desktop.js (main) 94 bytes [entry] [rendered] - > ./example main - [0] ./example.js 94 bytes {0} [built] - single entry ./example main -``` \ No newline at end of file +mobile: + asset mobile.js 193 bytes [emitted] [minimized] (name: main) + chunk (runtime: main) mobile.js (main) 114 bytes [entry] [rendered] + > ./example main + dependent modules 20 bytes [dependent] 1 module + ./example.js 94 bytes [built] [code generated] + [no exports used] + entry ./example main + mobile (webpack X.X.X) compiled successfully + +desktop: + asset desktop.js 37 bytes [emitted] [minimized] (name: main) + chunk (runtime: main) desktop.js (main) 94 bytes [entry] [rendered] + > ./example main + ./example.js 94 bytes [built] [code generated] + [no exports used] + entry ./example main + desktop (webpack X.X.X) compiled successfully +``` diff --git a/examples/multi-compiler/template.md b/examples/multi-compiler/template.md index f1d65349f43..bcd632cf46e 100644 --- a/examples/multi-compiler/template.md +++ b/examples/multi-compiler/template.md @@ -1,26 +1,25 @@ - # example.js -``` javascript -{{example.js}} +```javascript +_{{example.js}}_ ``` # webpack.config.js -``` javascript -{{webpack.config.js}} +```javascript +_{{webpack.config.js}}_ ``` # dist/desktop.js -``` javascript -{{dist/desktop.js}} +```javascript +_{{dist/desktop.js}}_ ``` # dist/mobile.js -``` javascript -{{dist/mobile.js}} +```javascript +_{{dist/mobile.js}}_ ``` # Info @@ -28,11 +27,11 @@ ## Unoptimized ``` -{{stdout}} +_{{stdout}}_ ``` ## Production mode ``` -{{production:stdout}} -``` \ No newline at end of file +_{{production:stdout}}_ +``` diff --git a/examples/multi-compiler/webpack.config.js b/examples/multi-compiler/webpack.config.js index 4fc3088639a..e7b01428c58 100644 --- a/examples/multi-compiler/webpack.config.js +++ b/examples/multi-compiler/webpack.config.js @@ -1,9 +1,10 @@ -var path = require("path"); -var webpack = require("../../"); +const path = require("path"); +const webpack = require("../../"); + module.exports = [ { name: "mobile", - // mode: "development || "production", + // mode: "development" || "production", entry: "./example", output: { path: path.join(__dirname, "dist"), @@ -18,7 +19,7 @@ module.exports = [ { name: "desktop", - // mode: "development || "production", + // mode: "development" || "production", entry: "./example", output: { path: path.join(__dirname, "dist"), diff --git a/examples/multi-part-library/README.md b/examples/multi-part-library/README.md index e7aa40a8ed7..3294303a686 100644 --- a/examples/multi-part-library/README.md +++ b/examples/multi-part-library/README.md @@ -1,23 +1,24 @@ -This example demonstrates how to build a complex library with webpack. The library consist of multiple parts that are usable on its own and together. +This example demonstrates how to build a complex library with webpack. The library consists of multiple parts that are usable on its own and together. -When using this library with script tags it exports itself to the namespace `MyLibrary` and each part to a property in this namespace (`MyLibrary.alpha` and `MyLibrary.beta`). When consuming the library with CommonsJs or AMD it just export each part. +When using this library with script tags it exports itself to the namespace `MyLibrary` and each part to a property in this namespace (`MyLibrary.alpha` and `MyLibrary.beta`). When consuming the library with CommonsJS or AMD it just exports each part. -We are using multiple entry points (`entry` option) to build every part of the library as separate output file. The `output.filename` option contains `[name]` to give each output file a different name. +We are using multiple entry points (`entry` option) to build every part of the library as a separate output file. The `output.filename` option contains `[name]` to give each output file a different name. -We are using the `libraryTarget` option to generate a UMD ([Universal Module Definition](https://github.com/umdjs/umd)) module that is consumable in CommonsJs, AMD and with script tags. The `library` option defines the namespace. We are using `[name]` in the `library` option to give every entry a different namespace. +We are using the `libraryTarget` option to generate a UMD ([Universal Module Definition](https://github.com/umdjs/umd)) module that is consumable in CommonsJS, AMD and with script tags. The `library` option defines the namespace. We are using `[name]` in the `library` option to give every entry a different namespace. You can see that webpack automatically wraps your module so that it is consumable in every environment. All you need is this simple config. Note: You can also use the `library` and `libraryTarget` options without multiple entry points. Then you don't need `[name]`. -Note: When your library has dependencies that should not be included in the compiled version, you can use the `externals` option. See [externals example](https://github.com/webpack/webpack/tree/master/examples/externals). +Note: When your library has dependencies that should not be included in the compiled version, you can use the `externals` option. See [externals example](https://github.com/webpack/webpack/tree/main/examples/externals). # webpack.config.js -``` javascript -var path = require("path"); +```javascript +const path = require("path"); + module.exports = { - // mode: "development || "production", + // mode: "development" || "production", entry: { alpha: "./alpha", beta: "./beta" @@ -33,239 +34,154 @@ module.exports = { # dist/MyLibrary.alpha.js -``` javascript +```javascript (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') - exports["alpha"] = factory(); + exports["MyLibrary"] = factory(); else root["MyLibrary"] = root["MyLibrary"] || {}, root["MyLibrary"]["alpha"] = factory(); -})(window, function() { +})(self, () => { +return /******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ([ +/* 0 */ +/*!******************!*\ + !*** ./alpha.js ***! + \******************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { + +module.exports = "alpha"; + +/***/ }) +/******/ ]); ``` -
return /******/ (function(modules) { /* webpackBootstrap */ }) + +
/* webpack runtime code */ ``` js -return /******/ (function(modules) { // webpackBootstrap +/************************************************************************/ /******/ // The module cache -/******/ var installedModules = {}; -/******/ +/******/ var __webpack_module_cache__ = {}; +/******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { -/******/ /******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed /******/ exports: {} /******/ }; -/******/ +/******/ /******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); -/******/ }) +/******/ /************************************************************************/ ```
``` js -/******/ ([ -/* 0 */ -/*!******************!*\ - !*** ./alpha.js ***! - \******************/ -/*! no static exports found */ -/***/ (function(module, exports) { - -module.exports = "alpha"; - -/***/ }) -/******/ ]); +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module is referenced by other modules so it can't be inlined +/******/ var __webpack_exports__ = __webpack_require__(0); +/******/ +/******/ return __webpack_exports__; +/******/ })() +; }); ``` # dist/MyLibrary.beta.js -``` javascript +```javascript (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') - exports["beta"] = factory(); + exports["MyLibrary"] = factory(); else root["MyLibrary"] = root["MyLibrary"] || {}, root["MyLibrary"]["beta"] = factory(); -})(window, function() { -return /******/ (function(modules) { // webpackBootstrap +})(self, () => { +return /******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */ +/*!*****************!*\ + !*** ./beta.js ***! + \*****************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { + +module.exports = "beta"; + +/***/ }) +/******/ ]); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ /******/ // The module cache -/******/ var installedModules = {}; -/******/ +/******/ var __webpack_module_cache__ = {}; +/******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { -/******/ /******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed /******/ exports: {} /******/ }; -/******/ +/******/ /******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 1); -/******/ }) +/******/ /************************************************************************/ -/******/ ([ -/* 0 */, -/* 1 */ -/*!*****************!*\ - !*** ./beta.js ***! - \*****************/ -/*! no static exports found */ -/***/ (function(module, exports) { +``` -module.exports = "beta"; +
-/***/ }) -/******/ ]); +``` js +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module is referenced by other modules so it can't be inlined +/******/ var __webpack_exports__ = __webpack_require__(1); +/******/ +/******/ return __webpack_exports__; +/******/ })() +; }); ``` @@ -274,39 +190,43 @@ module.exports = "beta"; ## Unoptimized ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -MyLibrary.alpha.js 4.12 KiB 0 [emitted] alpha - MyLibrary.beta.js 4.12 KiB 1 [emitted] beta -Entrypoint alpha = MyLibrary.alpha.js -Entrypoint beta = MyLibrary.beta.js -chunk {0} MyLibrary.alpha.js (alpha) 25 bytes [entry] [rendered] - > ./alpha alpha - [0] ./alpha.js 25 bytes {0} [built] - single entry ./alpha alpha -chunk {1} MyLibrary.beta.js (beta) 24 bytes [entry] [rendered] - > ./beta beta - [1] ./beta.js 24 bytes {1} [built] - single entry ./beta beta +asset MyLibrary.beta.js 2.06 KiB [emitted] (name: beta) +asset MyLibrary.alpha.js 2.06 KiB [emitted] (name: alpha) +chunk (runtime: alpha) MyLibrary.alpha.js (alpha) 25 bytes [entry] [rendered] + > ./alpha alpha + ./alpha.js 25 bytes [built] [code generated] + [used exports unknown] + cjs self exports reference ./alpha.js 1:0-14 + entry ./alpha alpha + used as library export +chunk (runtime: beta) MyLibrary.beta.js (beta) 24 bytes [entry] [rendered] + > ./beta beta + ./beta.js 24 bytes [built] [code generated] + [used exports unknown] + cjs self exports reference ./beta.js 1:0-14 + entry ./beta beta + used as library export +webpack X.X.X compiled successfully ``` ## Production mode ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -MyLibrary.alpha.js 1.19 KiB 0 [emitted] alpha - MyLibrary.beta.js 1.19 KiB 1 [emitted] beta -Entrypoint alpha = MyLibrary.alpha.js -Entrypoint beta = MyLibrary.beta.js -chunk {0} MyLibrary.alpha.js (alpha) 25 bytes [entry] [rendered] - > ./alpha alpha - [0] ./alpha.js 25 bytes {0} [built] - single entry ./alpha alpha -chunk {1} MyLibrary.beta.js (beta) 24 bytes [entry] [rendered] - > ./beta beta - [1] ./beta.js 24 bytes {1} [built] - single entry ./beta beta +asset MyLibrary.alpha.js 423 bytes [emitted] [minimized] (name: alpha) +asset MyLibrary.beta.js 421 bytes [emitted] [minimized] (name: beta) +chunk (runtime: beta) MyLibrary.beta.js (beta) 24 bytes [entry] [rendered] + > ./beta beta + ./beta.js 24 bytes [built] [code generated] + [used exports unknown] + cjs self exports reference ./beta.js 1:0-14 + entry ./beta beta + used as library export +chunk (runtime: alpha) MyLibrary.alpha.js (alpha) 25 bytes [entry] [rendered] + > ./alpha alpha + ./alpha.js 25 bytes [built] [code generated] + [used exports unknown] + cjs self exports reference ./alpha.js 1:0-14 + entry ./alpha alpha + used as library export +webpack X.X.X compiled successfully ``` diff --git a/examples/multi-part-library/template.md b/examples/multi-part-library/template.md index 900b16dabf6..6237b338ecb 100644 --- a/examples/multi-part-library/template.md +++ b/examples/multi-part-library/template.md @@ -1,33 +1,33 @@ -This example demonstrates how to build a complex library with webpack. The library consist of multiple parts that are usable on its own and together. +This example demonstrates how to build a complex library with webpack. The library consists of multiple parts that are usable on its own and together. -When using this library with script tags it exports itself to the namespace `MyLibrary` and each part to a property in this namespace (`MyLibrary.alpha` and `MyLibrary.beta`). When consuming the library with CommonsJs or AMD it just export each part. +When using this library with script tags it exports itself to the namespace `MyLibrary` and each part to a property in this namespace (`MyLibrary.alpha` and `MyLibrary.beta`). When consuming the library with CommonsJS or AMD it just exports each part. -We are using multiple entry points (`entry` option) to build every part of the library as separate output file. The `output.filename` option contains `[name]` to give each output file a different name. +We are using multiple entry points (`entry` option) to build every part of the library as a separate output file. The `output.filename` option contains `[name]` to give each output file a different name. -We are using the `libraryTarget` option to generate a UMD ([Universal Module Definition](https://github.com/umdjs/umd)) module that is consumable in CommonsJs, AMD and with script tags. The `library` option defines the namespace. We are using `[name]` in the `library` option to give every entry a different namespace. +We are using the `libraryTarget` option to generate a UMD ([Universal Module Definition](https://github.com/umdjs/umd)) module that is consumable in CommonsJS, AMD and with script tags. The `library` option defines the namespace. We are using `[name]` in the `library` option to give every entry a different namespace. You can see that webpack automatically wraps your module so that it is consumable in every environment. All you need is this simple config. Note: You can also use the `library` and `libraryTarget` options without multiple entry points. Then you don't need `[name]`. -Note: When your library has dependencies that should not be included in the compiled version, you can use the `externals` option. See [externals example](https://github.com/webpack/webpack/tree/master/examples/externals). +Note: When your library has dependencies that should not be included in the compiled version, you can use the `externals` option. See [externals example](https://github.com/webpack/webpack/tree/main/examples/externals). # webpack.config.js -``` javascript -{{webpack.config.js}} +```javascript +_{{webpack.config.js}}_ ``` # dist/MyLibrary.alpha.js -``` javascript -{{dist/MyLibrary.alpha.js}} +```javascript +_{{dist/MyLibrary.alpha.js}}_ ``` # dist/MyLibrary.beta.js -``` javascript -{{dist/MyLibrary.beta.js}} +```javascript +_{{dist/MyLibrary.beta.js}}_ ``` # Info @@ -35,11 +35,11 @@ Note: When your library has dependencies that should not be included in the comp ## Unoptimized ``` -{{stdout}} +_{{stdout}}_ ``` ## Production mode ``` -{{production:stdout}} +_{{production:stdout}}_ ``` diff --git a/examples/multi-part-library/webpack.config.js b/examples/multi-part-library/webpack.config.js index f79be11fe71..2d829643bcc 100644 --- a/examples/multi-part-library/webpack.config.js +++ b/examples/multi-part-library/webpack.config.js @@ -1,6 +1,7 @@ -var path = require("path"); +const path = require("path"); + module.exports = { - // mode: "development || "production", + // mode: "development" || "production", entry: { alpha: "./alpha", beta: "./beta" diff --git a/examples/multiple-entry-points/README.md b/examples/multiple-entry-points/README.md index fde37b098a7..813bd22745d 100644 --- a/examples/multiple-entry-points/README.md +++ b/examples/multiple-entry-points/README.md @@ -1,6 +1,6 @@ This example shows how to use multiple entry points with a commons chunk. -In this example you have two (HTML) pages `pageA` and `pageB`. You want to create individual bundles for each page. In addition to this you want to create a shared bundle that contains all modules used in both pages (assuming there are many/big modules in common). The pages also use Code Splitting to load a less used part of the features on demand. +In this example, you have two (HTML) pages `pageA` and `pageB`. You want to create individual bundles for each page. In addition to this, you want to create a shared bundle that contains all the modules used in both pages (assuming there are many/big modules in common). The pages also use Code Splitting to load a less used part of the features on demand. You can see how to define multiple entry points via the `entry` option. @@ -8,29 +8,29 @@ You can use You can see the output files: -* `commons.js` contains: - * module `common.js` which is used in both pages -* `pageA.js` contains: (`pageB.js` is similar) - * the module system - * chunk loading logic - * the entry point `pageA.js` - * it would contain any other module that is only used by `pageA` -* `0.chunk.js` is an additional chunk which is used by both pages. It contains: - * module `shared.js` +- `commons.js` contains: + - module `common.js` which is used in both pages +- `pageA.js` contains: (`pageB.js` is similar) + - the module system + - chunk loading logic + - the entry point `pageA.js` + - it would contain any other module that is only used by `pageA` +- `406.js` is an additional chunk which is used by both pages. It contains: + - module `shared.js` You can also see the info that is printed to console. It shows among others: -* the generated files -* the chunks with file, name and id - * see lines starting with `chunk` -* the modules that are in the chunks -* the reasons why the modules are included -* the reasons why a chunk is created - * see lines starting with `>` +- the generated files +- the chunks with file, name, and id + - see lines starting with `chunk` +- the modules that are in the chunks +- the reasons why the modules are included +- the reasons why a chunk is created + - see lines starting with `>` # pageA.js -``` javascript +```javascript var common = require("./common"); require(["./shared"], function(shared) { shared("This is page A"); @@ -39,7 +39,7 @@ require(["./shared"], function(shared) { # pageB.js -``` javascript +```javascript var common = require("./common"); require.ensure(["./shared"], function(require) { var shared = require("./shared"); @@ -49,9 +49,9 @@ require.ensure(["./shared"], function(require) { # webpack.config.js -``` javascript +```javascript module.exports = { - // mode: "development || "production", + // mode: "development" || "production", entry: { pageA: "./pageA", pageB: "./pageB" @@ -67,14 +67,14 @@ module.exports = { } } }, - occurrenceOrder: true // To keep filename consistent between different modes (for example building only) + chunkIds: "named" // To keep filename consistent between different modes (for example building only) } }; ``` # pageA.html -``` html +```html @@ -86,14 +86,17 @@ module.exports = { # dist/commons.js -``` javascript -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[0],[ -/* 0 */ +```javascript +(self["webpackChunk"] = self["webpackChunk"] || []).push([["commons"],[ +/* 0 */, +/* 1 */ /*!*******************!*\ !*** ./common.js ***! \*******************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module */ +/*! CommonJS bailout: module.exports is used directly at 1:0-14 */ +/***/ ((module) => { module.exports = "Common"; @@ -103,515 +106,571 @@ module.exports = "Common"; # dist/pageA.js -
/******/ (function(modules) { /* webpackBootstrap */ }) - -``` javascript -/******/ (function(modules) { // webpackBootstrap -/******/ // install a JSONP callback for chunk loading -/******/ function webpackJsonpCallback(data) { -/******/ var chunkIds = data[0]; -/******/ var moreModules = data[1]; -/******/ var executeModules = data[2]; -/******/ -/******/ // add "moreModules" to the modules object, -/******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0, resolves = []; -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(installedChunks[chunkId]) { -/******/ resolves.push(installedChunks[chunkId][0]); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } -/******/ for(moduleId in moreModules) { -/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { -/******/ modules[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(parentJsonpFunction) parentJsonpFunction(data); -/******/ -/******/ while(resolves.length) { -/******/ resolves.shift()(); -/******/ } -/******/ -/******/ // add entry modules from loaded chunk to deferred list -/******/ deferredModules.push.apply(deferredModules, executeModules || []); -/******/ -/******/ // run deferred modules when all chunks ready -/******/ return checkDeferredModules(); -/******/ }; -/******/ function checkDeferredModules() { -/******/ var result; -/******/ for(var i = 0; i < deferredModules.length; i++) { -/******/ var deferredModule = deferredModules[i]; -/******/ var fulfilled = true; -/******/ for(var j = 1; j < deferredModule.length; j++) { -/******/ var depId = deferredModule[j]; -/******/ if(installedChunks[depId] !== 0) fulfilled = false; -/******/ } -/******/ if(fulfilled) { -/******/ deferredModules.splice(i--, 1); -/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]); -/******/ } -/******/ } -/******/ return result; -/******/ } -/******/ +```javascript +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ([ +/* 0 */ +/*!******************!*\ + !*** ./pageA.js ***! + \******************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: __webpack_require__, __webpack_require__.e, __webpack_require__.oe, __webpack_require__.* */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +var common = __webpack_require__(/*! ./common */ 1); +__webpack_require__.e(/*! AMD require */ "shared_js").then(function() { var __WEBPACK_AMD_REQUIRE_ARRAY__ = [__webpack_require__(/*! ./shared */ 3)]; (function(shared) { + shared("This is page A"); +}).apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__);})['catch'](__webpack_require__.oe); + +/***/ }) +/******/ ]); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ /******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // Promise = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ 2: 0 -/******/ }; -/******/ -/******/ var deferredModules = []; -/******/ -/******/ // script path function -/******/ function jsonpScriptSrc(chunkId) { -/******/ return __webpack_require__.p + "" + ({}[chunkId]||chunkId) + ".js" -/******/ } -/******/ +/******/ var __webpack_module_cache__ = {}; +/******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { -/******/ /******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed /******/ exports: {} /******/ }; -/******/ +/******/ /******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } -/******/ -/******/ // This file contains only the entry chunk. -/******/ // The chunk loading function for additional chunks -/******/ __webpack_require__.e = function requireEnsure(chunkId) { -/******/ var promises = []; -/******/ -/******/ -/******/ // JSONP chunk loading for javascript -/******/ -/******/ var installedChunkData = installedChunks[chunkId]; -/******/ if(installedChunkData !== 0) { // 0 means "already installed". -/******/ -/******/ // a Promise means "currently loading". -/******/ if(installedChunkData) { -/******/ promises.push(installedChunkData[2]); -/******/ } else { -/******/ // setup Promise in chunk cache -/******/ var promise = new Promise(function(resolve, reject) { -/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject]; -/******/ }); -/******/ promises.push(installedChunkData[2] = promise); -/******/ -/******/ // start chunk loading -/******/ var script = document.createElement('script'); -/******/ var onScriptComplete; -/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/chunk loaded */ +/******/ (() => { +/******/ var deferred = []; +/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => { +/******/ if(chunkIds) { +/******/ priority = priority || 0; +/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1]; +/******/ deferred[i] = [chunkIds, fn, priority]; +/******/ return; +/******/ } +/******/ var notFulfilled = Infinity; +/******/ for (var i = 0; i < deferred.length; i++) { +/******/ var [chunkIds, fn, priority] = deferred[i]; +/******/ var fulfilled = true; +/******/ for (var j = 0; j < chunkIds.length; j++) { +/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) { +/******/ chunkIds.splice(j--, 1); +/******/ } else { +/******/ fulfilled = false; +/******/ if(priority < notFulfilled) notFulfilled = priority; +/******/ } +/******/ } +/******/ if(fulfilled) { +/******/ deferred.splice(i--, 1) +/******/ var r = fn(); +/******/ if (r !== undefined) result = r; +/******/ } +/******/ } +/******/ return result; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ // data-webpack is not used as build has no uniqueName +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ /******/ script.charset = 'utf-8'; /******/ script.timeout = 120; /******/ if (__webpack_require__.nc) { /******/ script.setAttribute("nonce", __webpack_require__.nc); /******/ } -/******/ script.src = jsonpScriptSrc(chunkId); -/******/ -/******/ onScriptComplete = function (event) { -/******/ // avoid mem leaks in IE. -/******/ script.onerror = script.onload = null; -/******/ clearTimeout(timeout); -/******/ var chunk = installedChunks[chunkId]; -/******/ if(chunk !== 0) { -/******/ if(chunk) { -/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); -/******/ var realSrc = event && event.target && event.target.src; -/******/ var error = new Error('Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'); -/******/ error.type = errorType; -/******/ error.request = realSrc; -/******/ chunk[1](error); +/******/ +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "dist/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "pageA": 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // JSONP chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if(true) { // all chunks have JS +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ installedChunkData[1](error); +/******/ } +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); /******/ } -/******/ installedChunks[chunkId] = undefined; /******/ } -/******/ }; -/******/ var timeout = setTimeout(function(){ -/******/ onScriptComplete({ type: 'timeout', target: script }); -/******/ }, 120000); -/******/ script.onerror = script.onload = onScriptComplete; -/******/ document.head.appendChild(script); +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0); +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); /******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ return __webpack_require__.O(result); /******/ } -/******/ return Promise.all(promises); -/******/ }; -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ // on error function for async loading -/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; -/******/ -/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; -/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); -/******/ jsonpArray.push = webpackJsonpCallback; -/******/ jsonpArray = jsonpArray.slice(); -/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); -/******/ var parentJsonpFunction = oldJsonpFunction; -/******/ -/******/ -/******/ // add entry module to deferred list -/******/ deferredModules.push([2,0]); -/******/ // run deferred modules when ready -/******/ return checkDeferredModules(); -/******/ }) +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ /************************************************************************/ ```
-``` javascript -/******/ ({ +``` js +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module depends on other loaded chunks and execution need to be delayed +/******/ var __webpack_exports__ = __webpack_require__.O(undefined, ["commons"], () => (__webpack_require__(0))) +/******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__); +/******/ +/******/ })() +; +``` + +# dist/pageB.js + +```javascript +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ /***/ 2: /*!******************!*\ - !*** ./pageA.js ***! + !*** ./pageB.js ***! \******************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: __webpack_require__, __webpack_require__.e, __webpack_require__.* */ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { -var common = __webpack_require__(/*! ./common */ 0); -__webpack_require__.e(/*! AMD require */ 1).then(function() { var __WEBPACK_AMD_REQUIRE_ARRAY__ = [__webpack_require__(/*! ./shared */ 1)]; (function(shared) { - shared("This is page A"); -}).apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__);}).catch(__webpack_require__.oe); +var common = __webpack_require__(/*! ./common */ 1); +__webpack_require__.e(/*! require.ensure */ "shared_js").then((function(require) { + var shared = __webpack_require__(/*! ./shared */ 3); + shared("This is page B"); +}).bind(null, __webpack_require__))['catch'](__webpack_require__.oe); /***/ }) -/******/ }); +/******/ }); ``` -# dist/pageB.js +
/* webpack runtime code */ -``` javascript -/******/ (function(modules) { // webpackBootstrap -/******/ // install a JSONP callback for chunk loading -/******/ function webpackJsonpCallback(data) { -/******/ var chunkIds = data[0]; -/******/ var moreModules = data[1]; -/******/ var executeModules = data[2]; -/******/ -/******/ // add "moreModules" to the modules object, -/******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0, resolves = []; -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(installedChunks[chunkId]) { -/******/ resolves.push(installedChunks[chunkId][0]); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } -/******/ for(moduleId in moreModules) { -/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { -/******/ modules[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(parentJsonpFunction) parentJsonpFunction(data); -/******/ -/******/ while(resolves.length) { -/******/ resolves.shift()(); -/******/ } -/******/ -/******/ // add entry modules from loaded chunk to deferred list -/******/ deferredModules.push.apply(deferredModules, executeModules || []); -/******/ -/******/ // run deferred modules when all chunks ready -/******/ return checkDeferredModules(); -/******/ }; -/******/ function checkDeferredModules() { -/******/ var result; -/******/ for(var i = 0; i < deferredModules.length; i++) { -/******/ var deferredModule = deferredModules[i]; -/******/ var fulfilled = true; -/******/ for(var j = 1; j < deferredModule.length; j++) { -/******/ var depId = deferredModule[j]; -/******/ if(installedChunks[depId] !== 0) fulfilled = false; -/******/ } -/******/ if(fulfilled) { -/******/ deferredModules.splice(i--, 1); -/******/ result = __webpack_require__(__webpack_require__.s = deferredModule[0]); -/******/ } -/******/ } -/******/ return result; -/******/ } -/******/ +``` js +/************************************************************************/ /******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // Promise = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ 3: 0 -/******/ }; -/******/ -/******/ var deferredModules = []; -/******/ -/******/ // script path function -/******/ function jsonpScriptSrc(chunkId) { -/******/ return __webpack_require__.p + "" + ({}[chunkId]||chunkId) + ".js" -/******/ } -/******/ +/******/ var __webpack_module_cache__ = {}; +/******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { -/******/ /******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed /******/ exports: {} /******/ }; -/******/ +/******/ /******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } -/******/ -/******/ // This file contains only the entry chunk. -/******/ // The chunk loading function for additional chunks -/******/ __webpack_require__.e = function requireEnsure(chunkId) { -/******/ var promises = []; -/******/ -/******/ -/******/ // JSONP chunk loading for javascript -/******/ -/******/ var installedChunkData = installedChunks[chunkId]; -/******/ if(installedChunkData !== 0) { // 0 means "already installed". -/******/ -/******/ // a Promise means "currently loading". -/******/ if(installedChunkData) { -/******/ promises.push(installedChunkData[2]); -/******/ } else { -/******/ // setup Promise in chunk cache -/******/ var promise = new Promise(function(resolve, reject) { -/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject]; -/******/ }); -/******/ promises.push(installedChunkData[2] = promise); -/******/ -/******/ // start chunk loading -/******/ var script = document.createElement('script'); -/******/ var onScriptComplete; -/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/chunk loaded */ +/******/ (() => { +/******/ var deferred = []; +/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => { +/******/ if(chunkIds) { +/******/ priority = priority || 0; +/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1]; +/******/ deferred[i] = [chunkIds, fn, priority]; +/******/ return; +/******/ } +/******/ var notFulfilled = Infinity; +/******/ for (var i = 0; i < deferred.length; i++) { +/******/ var [chunkIds, fn, priority] = deferred[i]; +/******/ var fulfilled = true; +/******/ for (var j = 0; j < chunkIds.length; j++) { +/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) { +/******/ chunkIds.splice(j--, 1); +/******/ } else { +/******/ fulfilled = false; +/******/ if(priority < notFulfilled) notFulfilled = priority; +/******/ } +/******/ } +/******/ if(fulfilled) { +/******/ deferred.splice(i--, 1) +/******/ var r = fn(); +/******/ if (r !== undefined) result = r; +/******/ } +/******/ } +/******/ return result; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ // data-webpack is not used as build has no uniqueName +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ /******/ script.charset = 'utf-8'; /******/ script.timeout = 120; /******/ if (__webpack_require__.nc) { /******/ script.setAttribute("nonce", __webpack_require__.nc); /******/ } -/******/ script.src = jsonpScriptSrc(chunkId); -/******/ -/******/ onScriptComplete = function (event) { -/******/ // avoid mem leaks in IE. -/******/ script.onerror = script.onload = null; -/******/ clearTimeout(timeout); -/******/ var chunk = installedChunks[chunkId]; -/******/ if(chunk !== 0) { -/******/ if(chunk) { -/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); -/******/ var realSrc = event && event.target && event.target.src; -/******/ var error = new Error('Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'); -/******/ error.type = errorType; -/******/ error.request = realSrc; -/******/ chunk[1](error); +/******/ +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "dist/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "pageB": 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // JSONP chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if(true) { // all chunks have JS +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ installedChunkData[1](error); +/******/ } +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); /******/ } -/******/ installedChunks[chunkId] = undefined; /******/ } -/******/ }; -/******/ var timeout = setTimeout(function(){ -/******/ onScriptComplete({ type: 'timeout', target: script }); -/******/ }, 120000); -/******/ script.onerror = script.onload = onScriptComplete; -/******/ document.head.appendChild(script); +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0); +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); /******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ return __webpack_require__.O(result); /******/ } -/******/ return Promise.all(promises); -/******/ }; -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ // on error function for async loading -/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; -/******/ -/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; -/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); -/******/ jsonpArray.push = webpackJsonpCallback; -/******/ jsonpArray = jsonpArray.slice(); -/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); -/******/ var parentJsonpFunction = oldJsonpFunction; -/******/ -/******/ -/******/ // add entry module to deferred list -/******/ deferredModules.push([3,0]); -/******/ // run deferred modules when ready -/******/ return checkDeferredModules(); -/******/ }) +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ /************************************************************************/ -/******/ ({ - -/***/ 3: -/*!******************!*\ - !*** ./pageB.js ***! - \******************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var common = __webpack_require__(/*! ./common */ 0); -__webpack_require__.e(/*! require.ensure */ 1).then((function(require) { - var shared = __webpack_require__(/*! ./shared */ 1); - shared("This is page B"); -}).bind(null, __webpack_require__)).catch(__webpack_require__.oe); +``` -/***/ }) +
-/******/ }); +``` js +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module depends on other loaded chunks and execution need to be delayed +/******/ var __webpack_exports__ = __webpack_require__.O(undefined, ["commons"], () => (__webpack_require__(2))) +/******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__); +/******/ +/******/ })() +; ``` -# dist/1.js +# dist/shared_js.js -``` javascript -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[1],[ -/* 0 */, -/* 1 */ +```javascript +(self["webpackChunk"] = self["webpackChunk"] || []).push([["shared_js"],{ + +/***/ 3: /*!*******************!*\ !*** ./shared.js ***! \*******************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: module, __webpack_require__ */ +/*! CommonJS bailout: module.exports is used directly at 2:0-14 */ +/***/ ((module, __unused_webpack_exports, __webpack_require__) => { -var common = __webpack_require__(/*! ./common */ 0); +var common = __webpack_require__(/*! ./common */ 1); module.exports = function(msg) { console.log(msg); }; /***/ }) -]]); + +}]); ``` # Info @@ -619,71 +678,85 @@ module.exports = function(msg) { ## Unoptimized ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names - 1.js 369 bytes 1 [emitted] -commons.js 258 bytes 0 [emitted] commons - pageA.js 9.28 KiB 2 [emitted] pageA - pageB.js 9.24 KiB 3 [emitted] pageB -Entrypoint pageA = commons.js pageA.js -Entrypoint pageB = commons.js pageB.js -chunk {0} commons.js (commons) 26 bytes ={2}= ={3}= >{1}< [initial] [rendered] split chunk (cache group: commons) (name: commons) - > ./pageA pageA - > ./pageB pageB - [0] ./common.js 26 bytes {0} [built] - cjs require ./common [1] ./shared.js 1:13-32 - cjs require ./common [2] ./pageA.js 1:13-32 - cjs require ./common [3] ./pageB.js 1:13-32 -chunk {1} 1.js 88 bytes <{0}> <{2}> <{3}> [rendered] - > ./shared [2] ./pageA.js 2:0-4:2 - > [3] ./pageB.js 2:0-5:2 - [1] ./shared.js 88 bytes {1} [built] - amd require ./shared [2] ./pageA.js 2:0-4:2 - require.ensure item ./shared [3] ./pageB.js 2:0-5:2 - cjs require ./shared [3] ./pageB.js 3:14-33 -chunk {2} pageA.js (pageA) 105 bytes ={0}= >{1}< [entry] [rendered] - > ./pageA pageA - [2] ./pageA.js 105 bytes {2} [built] - single entry ./pageA pageA -chunk {3} pageB.js (pageB) 148 bytes ={0}= >{1}< [entry] [rendered] - > ./pageB pageB - [3] ./pageB.js 148 bytes {3} [built] - single entry ./pageB pageB +asset pageA.js 10.7 KiB [emitted] (name: pageA) +asset pageB.js 10.6 KiB [emitted] (name: pageB) +asset shared_js.js 515 bytes [emitted] +asset commons.js 370 bytes [emitted] (name: commons) (id hint: commons) +Entrypoint pageA 11.1 KiB = commons.js 370 bytes pageA.js 10.7 KiB +Entrypoint pageB 11 KiB = commons.js 370 bytes pageB.js 10.6 KiB +chunk (runtime: pageA, pageB) commons.js (commons) (id hint: commons) 26 bytes [initial] [rendered] split chunk (cache group: commons) (name: commons) + > ./pageA pageA + > ./pageB pageB + ./common.js 26 bytes [built] [code generated] + [used exports unknown] + cjs self exports reference ./common.js 1:0-14 + cjs require ./common ./pageA.js 1:13-32 + cjs require ./common ./pageB.js 1:13-32 + cjs require ./common ./shared.js 1:13-32 +chunk (runtime: pageA) pageA.js (pageA) 105 bytes (javascript) 5.88 KiB (runtime) [entry] [rendered] + > ./pageA pageA + runtime modules 5.88 KiB 7 modules + ./pageA.js 105 bytes [built] [code generated] + [used exports unknown] + entry ./pageA pageA +chunk (runtime: pageB) pageB.js (pageB) 148 bytes (javascript) 5.88 KiB (runtime) [entry] [rendered] + > ./pageB pageB + runtime modules 5.88 KiB 7 modules + ./pageB.js 148 bytes [built] [code generated] + [used exports unknown] + entry ./pageB pageB +chunk (runtime: pageA, pageB) shared_js.js 88 bytes [rendered] + > ./shared ./pageA.js 2:0-4:2 + > ./pageB.js 2:0-5:2 + ./shared.js 88 bytes [built] [code generated] + [used exports unknown] + from origin ./pageB.js + require.ensure item ./shared ./pageB.js 2:0-5:2 + cjs require ./shared ./pageB.js 3:14-33 + amd require ./shared ./pageA.js 2:0-4:2 + cjs self exports reference ./shared.js 2:0-14 +webpack X.X.X compiled successfully ``` ## Production mode ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names - 1.js 121 bytes 1 [emitted] -commons.js 94 bytes 0 [emitted] commons - pageA.js 2.26 KiB 2 [emitted] pageA - pageB.js 2.23 KiB 3 [emitted] pageB -Entrypoint pageA = commons.js pageA.js -Entrypoint pageB = commons.js pageB.js -chunk {0} commons.js (commons) 26 bytes ={2}= ={3}= >{1}< [initial] [rendered] split chunk (cache group: commons) (name: commons) - > ./pageA pageA - > ./pageB pageB - [0] ./common.js 26 bytes {0} [built] - cjs require ./common [1] ./shared.js 1:13-32 - cjs require ./common [2] ./pageA.js 1:13-32 - cjs require ./common [3] ./pageB.js 1:13-32 -chunk {1} 1.js 88 bytes <{0}> <{2}> <{3}> [rendered] - > ./shared [2] ./pageA.js 2:0-4:2 - > [3] ./pageB.js 2:0-5:2 - [1] ./shared.js 88 bytes {1} [built] - amd require ./shared [2] ./pageA.js 2:0-4:2 - require.ensure item ./shared [3] ./pageB.js 2:0-5:2 - cjs require ./shared [3] ./pageB.js 3:14-33 -chunk {2} pageA.js (pageA) 105 bytes ={0}= >{1}< [entry] [rendered] - > ./pageA pageA - [2] ./pageA.js 105 bytes {2} [built] - single entry ./pageA pageA -chunk {3} pageB.js (pageB) 148 bytes ={0}= >{1}< [entry] [rendered] - > ./pageB pageB - [3] ./pageB.js 148 bytes {3} [built] - single entry ./pageB pageB +asset pageA.js 2.17 KiB [emitted] [minimized] (name: pageA) +asset pageB.js 2.15 KiB [emitted] [minimized] (name: pageB) +asset shared_js.js 125 bytes [emitted] [minimized] +asset commons.js 92 bytes [emitted] [minimized] (name: commons) (id hint: commons) +Entrypoint pageA 2.26 KiB = commons.js 92 bytes pageA.js 2.17 KiB +Entrypoint pageB 2.24 KiB = commons.js 92 bytes pageB.js 2.15 KiB +chunk (runtime: pageA, pageB) commons.js (commons) (id hint: commons) 26 bytes [initial] [rendered] split chunk (cache group: commons) (name: commons) + > ./pageA pageA + > ./pageB pageB + ./common.js 26 bytes [built] [code generated] + [used exports unknown] + cjs self exports reference ./common.js 1:0-14 + cjs require ./common ./pageA.js 1:13-32 + cjs require ./common ./pageB.js 1:13-32 + cjs require ./common ./shared.js 1:13-32 +chunk (runtime: pageA) pageA.js (pageA) 105 bytes (javascript) 5.88 KiB (runtime) [entry] [rendered] + > ./pageA pageA + runtime modules 5.88 KiB 7 modules + ./pageA.js 105 bytes [built] [code generated] + [no exports used] + entry ./pageA pageA +chunk (runtime: pageB) pageB.js (pageB) 148 bytes (javascript) 5.88 KiB (runtime) [entry] [rendered] + > ./pageB pageB + runtime modules 5.88 KiB 7 modules + ./pageB.js 148 bytes [built] [code generated] + [no exports used] + entry ./pageB pageB +chunk (runtime: pageA, pageB) shared_js.js 88 bytes [rendered] + > ./shared ./pageA.js 2:0-4:2 + > ./pageB.js 2:0-5:2 + ./shared.js 88 bytes [built] [code generated] + [used exports unknown] + from origin ./pageB.js + require.ensure item ./shared ./pageB.js 2:0-5:2 + cjs require ./shared ./pageB.js 3:14-33 + amd require ./shared ./pageA.js 2:0-4:2 + cjs self exports reference ./shared.js 2:0-14 +webpack X.X.X compiled successfully ``` diff --git a/examples/multiple-entry-points/template.md b/examples/multiple-entry-points/template.md index 3266d1ba9d3..2bfea3457a7 100644 --- a/examples/multiple-entry-points/template.md +++ b/examples/multiple-entry-points/template.md @@ -1,6 +1,6 @@ This example shows how to use multiple entry points with a commons chunk. -In this example you have two (HTML) pages `pageA` and `pageB`. You want to create individual bundles for each page. In addition to this you want to create a shared bundle that contains all modules used in both pages (assuming there are many/big modules in common). The pages also use Code Splitting to load a less used part of the features on demand. +In this example, you have two (HTML) pages `pageA` and `pageB`. You want to create individual bundles for each page. In addition to this, you want to create a shared bundle that contains all the modules used in both pages (assuming there are many/big modules in common). The pages also use Code Splitting to load a less used part of the features on demand. You can see how to define multiple entry points via the `entry` option. @@ -8,72 +8,72 @@ You can use You can see the output files: -* `commons.js` contains: - * module `common.js` which is used in both pages -* `pageA.js` contains: (`pageB.js` is similar) - * the module system - * chunk loading logic - * the entry point `pageA.js` - * it would contain any other module that is only used by `pageA` -* `0.chunk.js` is an additional chunk which is used by both pages. It contains: - * module `shared.js` +- `commons.js` contains: + - module `common.js` which is used in both pages +- `pageA.js` contains: (`pageB.js` is similar) + - the module system + - chunk loading logic + - the entry point `pageA.js` + - it would contain any other module that is only used by `pageA` +- `406.js` is an additional chunk which is used by both pages. It contains: + - module `shared.js` You can also see the info that is printed to console. It shows among others: -* the generated files -* the chunks with file, name and id - * see lines starting with `chunk` -* the modules that are in the chunks -* the reasons why the modules are included -* the reasons why a chunk is created - * see lines starting with `>` +- the generated files +- the chunks with file, name, and id + - see lines starting with `chunk` +- the modules that are in the chunks +- the reasons why the modules are included +- the reasons why a chunk is created + - see lines starting with `>` # pageA.js -``` javascript -{{pageA.js}} +```javascript +_{{pageA.js}}_ ``` # pageB.js -``` javascript -{{pageB.js}} +```javascript +_{{pageB.js}}_ ``` # webpack.config.js -``` javascript -{{webpack.config.js}} +```javascript +_{{webpack.config.js}}_ ``` # pageA.html -``` html -{{pageA.html}} +```html +_{{pageA.html}}_ ``` # dist/commons.js -``` javascript -{{dist/commons.js}} +```javascript +_{{dist/commons.js}}_ ``` # dist/pageA.js -``` javascript -{{dist/pageA.js}} +```javascript +_{{dist/pageA.js}}_ ``` # dist/pageB.js -``` javascript -{{dist/pageB.js}} +```javascript +_{{dist/pageB.js}}_ ``` -# dist/1.js +# dist/shared_js.js -``` javascript -{{dist/1.js}} +```javascript +_{{dist/shared_js.js}}_ ``` # Info @@ -81,11 +81,11 @@ You can also see the info that is printed to console. It shows among others: ## Unoptimized ``` -{{stdout}} +_{{stdout}}_ ``` ## Production mode ``` -{{production:stdout}} +_{{production:stdout}}_ ``` diff --git a/examples/multiple-entry-points/webpack.config.js b/examples/multiple-entry-points/webpack.config.js index 9927b2f0f57..06451696a6e 100644 --- a/examples/multiple-entry-points/webpack.config.js +++ b/examples/multiple-entry-points/webpack.config.js @@ -1,5 +1,5 @@ module.exports = { - // mode: "development || "production", + // mode: "development" || "production", entry: { pageA: "./pageA", pageB: "./pageB" @@ -15,6 +15,6 @@ module.exports = { } } }, - occurrenceOrder: true // To keep filename consistent between different modes (for example building only) + chunkIds: "named" // To keep filename consistent between different modes (for example building only) } }; diff --git a/examples/named-chunks/README.md b/examples/named-chunks/README.md index 75ab48f2143..2cd9610e936 100644 --- a/examples/named-chunks/README.md +++ b/examples/named-chunks/README.md @@ -1,6 +1,6 @@ # example.js -``` javascript +```javascript var a = require("a"); require.ensure(["b"], function(require) { @@ -23,320 +23,333 @@ require.ensure(["b"], function(require) { }); ``` - # dist/output.js -
/******/ (function(modules) { /* webpackBootstrap */ }) - -``` javascript -/******/ (function(modules) { // webpackBootstrap -/******/ // install a JSONP callback for chunk loading -/******/ function webpackJsonpCallback(data) { -/******/ var chunkIds = data[0]; -/******/ var moreModules = data[1]; -/******/ -/******/ -/******/ // add "moreModules" to the modules object, -/******/ // then flag all "chunkIds" as loaded and fire callback -/******/ var moduleId, chunkId, i = 0, resolves = []; -/******/ for(;i < chunkIds.length; i++) { -/******/ chunkId = chunkIds[i]; -/******/ if(installedChunks[chunkId]) { -/******/ resolves.push(installedChunks[chunkId][0]); -/******/ } -/******/ installedChunks[chunkId] = 0; -/******/ } -/******/ for(moduleId in moreModules) { -/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { -/******/ modules[moduleId] = moreModules[moduleId]; -/******/ } -/******/ } -/******/ if(parentJsonpFunction) parentJsonpFunction(data); -/******/ -/******/ while(resolves.length) { -/******/ resolves.shift()(); -/******/ } -/******/ -/******/ }; -/******/ -/******/ +```javascript +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ([ +/* 0 */, +/* 1 */ +/*!***************************!*\ + !*** ./node_modules/a.js ***! + \***************************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: */ +/***/ (() => { + +// module a + +/***/ }) +/******/ ]); +``` + +
/* webpack runtime code */ + +``` js +/************************************************************************/ /******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // object to store loaded and loading chunks -/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched -/******/ // Promise = chunk loading, 0 = chunk loaded -/******/ var installedChunks = { -/******/ 0: 0 -/******/ }; -/******/ -/******/ -/******/ -/******/ // script path function -/******/ function jsonpScriptSrc(chunkId) { -/******/ return __webpack_require__.p + "" + chunkId + ".output.js" -/******/ } -/******/ +/******/ var __webpack_module_cache__ = {}; +/******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { -/******/ /******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed /******/ exports: {} /******/ }; -/******/ +/******/ /******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } -/******/ -/******/ // This file contains only the entry chunk. -/******/ // The chunk loading function for additional chunks -/******/ __webpack_require__.e = function requireEnsure(chunkId) { -/******/ var promises = []; -/******/ -/******/ -/******/ // JSONP chunk loading for javascript -/******/ -/******/ var installedChunkData = installedChunks[chunkId]; -/******/ if(installedChunkData !== 0) { // 0 means "already installed". -/******/ -/******/ // a Promise means "currently loading". -/******/ if(installedChunkData) { -/******/ promises.push(installedChunkData[2]); -/******/ } else { -/******/ // setup Promise in chunk cache -/******/ var promise = new Promise(function(resolve, reject) { -/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject]; -/******/ }); -/******/ promises.push(installedChunkData[2] = promise); -/******/ -/******/ // start chunk loading -/******/ var script = document.createElement('script'); -/******/ var onScriptComplete; -/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".output.js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ // data-webpack is not used as build has no uniqueName +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ /******/ script.charset = 'utf-8'; /******/ script.timeout = 120; /******/ if (__webpack_require__.nc) { /******/ script.setAttribute("nonce", __webpack_require__.nc); /******/ } -/******/ script.src = jsonpScriptSrc(chunkId); -/******/ -/******/ onScriptComplete = function (event) { -/******/ // avoid mem leaks in IE. -/******/ script.onerror = script.onload = null; -/******/ clearTimeout(timeout); -/******/ var chunk = installedChunks[chunkId]; -/******/ if(chunk !== 0) { -/******/ if(chunk) { -/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); -/******/ var realSrc = event && event.target && event.target.src; -/******/ var error = new Error('Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'); -/******/ error.type = errorType; -/******/ error.request = realSrc; -/******/ chunk[1](error); +/******/ +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "dist/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ "main": 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // JSONP chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if(true) { // all chunks have JS +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ installedChunkData[1](error); +/******/ } +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); /******/ } -/******/ installedChunks[chunkId] = undefined; /******/ } -/******/ }; -/******/ var timeout = setTimeout(function(){ -/******/ onScriptComplete({ type: 'timeout', target: script }); -/******/ }, 120000); -/******/ script.onerror = script.onload = onScriptComplete; -/******/ document.head.appendChild(script); +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ // no on chunks loaded +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); /******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ /******/ } -/******/ return Promise.all(promises); -/******/ }; -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = "dist/"; -/******/ -/******/ // on error function for async loading -/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; -/******/ -/******/ var jsonpArray = window["webpackJsonp"] = window["webpackJsonp"] || []; -/******/ var oldJsonpFunction = jsonpArray.push.bind(jsonpArray); -/******/ jsonpArray.push = webpackJsonpCallback; -/******/ jsonpArray = jsonpArray.slice(); -/******/ for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]); -/******/ var parentJsonpFunction = oldJsonpFunction; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 2); -/******/ }) +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ /************************************************************************/ ```
-``` javascript -/******/ ([ -/* 0 */, -/* 1 */, -/* 2 */ +``` js +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { /*!********************!*\ !*** ./example.js ***! \********************/ -/*! no static exports found */ -/***/ (function(module, exports, __webpack_require__) { - -var a = __webpack_require__(/*! a */ 3); +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: __webpack_require__, __webpack_require__.e, __webpack_require__.* */ +var a = __webpack_require__(/*! a */ 1); -__webpack_require__.e(/*! require.ensure | my own chunk */ 1).then((function(require) { +__webpack_require__.e(/*! require.ensure | my own chunk */ "my own chunk").then((function(require) { // a named chunk - var c = __webpack_require__(/*! c */ 4); -}).bind(null, __webpack_require__)).catch(__webpack_require__.oe); + var c = __webpack_require__(/*! c */ 3); +}).bind(null, __webpack_require__))['catch'](__webpack_require__.oe); -__webpack_require__.e(/*! require.ensure | my own chunk */ 1).then((function(require) { +__webpack_require__.e(/*! require.ensure | my own chunk */ "my own chunk").then((function(require) { // another chunk with the same name - var d = __webpack_require__(/*! d */ 1); -}).bind(null, __webpack_require__)).catch(__webpack_require__.oe); + var d = __webpack_require__(/*! d */ 4); +}).bind(null, __webpack_require__))['catch'](__webpack_require__.oe); -__webpack_require__.e(/*! require.ensure | my own chunk */ 1).then((function(require) { +__webpack_require__.e(/*! require.ensure | my own chunk */ "my own chunk").then((function(require) { // the same again -}).bind(null, __webpack_require__)).catch(__webpack_require__.oe); +}).bind(null, __webpack_require__))['catch'](__webpack_require__.oe); -__webpack_require__.e(/*! require.ensure */ 2).then((function(require) { +__webpack_require__.e(/*! require.ensure */ "node_modules_b_js-node_modules_d_js").then((function(require) { // chunk without name - var d = __webpack_require__(/*! d */ 1); -}).bind(null, __webpack_require__)).catch(__webpack_require__.oe); - - -/***/ }), -/* 3 */ -/*!***************************!*\ - !*** ./node_modules/a.js ***! - \***************************/ -/*! no static exports found */ -/***/ (function(module, exports) { + var d = __webpack_require__(/*! d */ 4); +}).bind(null, __webpack_require__))['catch'](__webpack_require__.oe); -// module a +})(); -/***/ }) -/******/ ]); +/******/ })() +; ``` -# dist/1.output.js +# dist/my own chunk.output.js -``` javascript -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[1],[ -/* 0 */ +```javascript +(self["webpackChunk"] = self["webpackChunk"] || []).push([["my own chunk"],[ +/* 0 */, +/* 1 */, +/* 2 */ /*!***************************!*\ !*** ./node_modules/b.js ***! \***************************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: */ +/***/ (() => { // module b /***/ }), -/* 1 */ +/* 3 */ /*!***************************!*\ - !*** ./node_modules/d.js ***! + !*** ./node_modules/c.js ***! \***************************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: */ +/***/ (() => { -// module d +// module c /***/ }), -/* 2 */, -/* 3 */, /* 4 */ /*!***************************!*\ - !*** ./node_modules/c.js ***! + !*** ./node_modules/d.js ***! \***************************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: */ +/***/ (() => { -// module c +// module d /***/ }) ]]); ``` -# dist/2.output.js +# dist/node_modules_b_js-node_modules_d_js.output.js -``` javascript -(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[2],[ -/* 0 */ +```javascript +(self["webpackChunk"] = self["webpackChunk"] || []).push([["node_modules_b_js-node_modules_d_js"],[ +/* 0 */, +/* 1 */, +/* 2 */ /*!***************************!*\ !*** ./node_modules/b.js ***! \***************************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: */ +/***/ (() => { // module b /***/ }), -/* 1 */ +/* 3 */, +/* 4 */ /*!***************************!*\ !*** ./node_modules/d.js ***! \***************************/ -/*! no static exports found */ -/***/ (function(module, exports) { +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: */ +/***/ (() => { // module d @@ -349,49 +362,85 @@ __webpack_require__.e(/*! require.ensure */ 2).then((function(require) { ## Unoptimized ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -1.output.js 677 bytes 1 [emitted] my own chunk -2.output.js 463 bytes 2 [emitted] - output.js 9.07 KiB 0 [emitted] main -Entrypoint main = output.js -chunk {0} output.js (main) 432 bytes >{1}< >{2}< [entry] [rendered] - > ./example.js main - [2] ./example.js 421 bytes {0} [built] - single entry ./example.js main - + 1 hidden module -chunk {1} 1.output.js (my own chunk) 33 bytes <{0}> [rendered] - > [2] ./example.js 13:0-15:18 - > [2] ./example.js 3:0-6:18 - > [2] ./example.js 8:0-11:18 - 3 modules -chunk {2} 2.output.js 22 bytes <{0}> [rendered] - > [2] ./example.js 17:0-20:2 - 2 modules +asset output.js 9.85 KiB [emitted] (name: main) +asset my own chunk.output.js 746 bytes [emitted] (name: my own chunk) +asset node_modules_b_js-node_modules_d_js.output.js 562 bytes [emitted] +chunk (runtime: main) output.js (main) 432 bytes (javascript) 4.94 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 4.94 KiB 6 modules + dependent modules 11 bytes [dependent] 1 module + ./example.js 421 bytes [built] [code generated] + [used exports unknown] + entry ./example.js main +chunk (runtime: main) my own chunk.output.js (my own chunk) 33 bytes [rendered] + > ./example.js 13:0-15:18 + > ./example.js 3:0-6:18 + > ./example.js 8:0-11:18 + ./node_modules/b.js 11 bytes [built] [code generated] + [used exports unknown] + require.ensure item b ./example.js 3:0-6:18 + require.ensure item b ./example.js 8:0-11:18 + require.ensure item b ./example.js 17:0-20:2 + ./node_modules/c.js 11 bytes [built] [code generated] + [used exports unknown] + cjs require c ./example.js 5:9-21 + ./node_modules/d.js 11 bytes [built] [code generated] + [used exports unknown] + cjs require d ./example.js 10:9-21 + cjs require d ./example.js 19:9-21 +chunk (runtime: main) node_modules_b_js-node_modules_d_js.output.js 22 bytes [rendered] + > ./example.js 17:0-20:2 + ./node_modules/b.js 11 bytes [built] [code generated] + [used exports unknown] + require.ensure item b ./example.js 3:0-6:18 + require.ensure item b ./example.js 8:0-11:18 + require.ensure item b ./example.js 17:0-20:2 + ./node_modules/d.js 11 bytes [built] [code generated] + [used exports unknown] + cjs require d ./example.js 10:9-21 + cjs require d ./example.js 19:9-21 +webpack X.X.X compiled successfully ``` ## Production mode ``` -Hash: 0a1b2c3d4e5f6a7b8c9d -Version: webpack 4.29.0 - Asset Size Chunks Chunk Names -1.output.js 112 bytes 1, 2 [emitted] my own chunk -2.output.js 92 bytes 2 [emitted] - output.js 2.19 KiB 0 [emitted] main -Entrypoint main = output.js -chunk {0} output.js (main) 432 bytes >{1}< >{2}< [entry] [rendered] - > ./example.js main - [2] ./example.js 421 bytes {0} [built] - single entry ./example.js main - + 1 hidden module -chunk {1} 1.output.js (my own chunk) 33 bytes <{0}> [rendered] - > [2] ./example.js 13:0-15:18 - > [2] ./example.js 3:0-6:18 - > [2] ./example.js 8:0-11:18 - 3 modules -chunk {2} 2.output.js 22 bytes <{0}> [rendered] - > [2] ./example.js 17:0-20:2 - 2 modules +asset output.js 1.95 KiB [emitted] [minimized] (name: main) +asset my own chunk.output.js 140 bytes [emitted] [minimized] (name: my own chunk) +asset node_modules_b_js-node_modules_d_js.output.js 114 bytes [emitted] [minimized] +chunk (runtime: main) output.js (main) 432 bytes (javascript) 4.94 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 4.94 KiB 6 modules + dependent modules 11 bytes [dependent] 1 module + ./example.js 421 bytes [built] [code generated] + [no exports used] + entry ./example.js main +chunk (runtime: main) my own chunk.output.js (my own chunk) 33 bytes [rendered] + > ./example.js 13:0-15:18 + > ./example.js 3:0-6:18 + > ./example.js 8:0-11:18 + ./node_modules/b.js 11 bytes [built] [code generated] + [used exports unknown] + require.ensure item b ./example.js 3:0-6:18 + require.ensure item b ./example.js 8:0-11:18 + require.ensure item b ./example.js 17:0-20:2 + ./node_modules/c.js 11 bytes [built] [code generated] + [used exports unknown] + cjs require c ./example.js 5:9-21 + ./node_modules/d.js 11 bytes [built] [code generated] + [used exports unknown] + cjs require d ./example.js 10:9-21 + cjs require d ./example.js 19:9-21 +chunk (runtime: main) node_modules_b_js-node_modules_d_js.output.js 22 bytes [rendered] + > ./example.js 17:0-20:2 + ./node_modules/b.js 11 bytes [built] [code generated] + [used exports unknown] + require.ensure item b ./example.js 3:0-6:18 + require.ensure item b ./example.js 8:0-11:18 + require.ensure item b ./example.js 17:0-20:2 + ./node_modules/d.js 11 bytes [built] [code generated] + [used exports unknown] + cjs require d ./example.js 10:9-21 + cjs require d ./example.js 19:9-21 +webpack X.X.X compiled successfully ``` diff --git a/examples/named-chunks/template.md b/examples/named-chunks/template.md index 9e48aefbb35..b3447100444 100644 --- a/examples/named-chunks/template.md +++ b/examples/named-chunks/template.md @@ -1,26 +1,25 @@ # example.js -``` javascript -{{example.js}} +```javascript +_{{example.js}}_ ``` - # dist/output.js -``` javascript -{{dist/output.js}} +```javascript +_{{dist/output.js}}_ ``` -# dist/1.output.js +# dist/my own chunk.output.js -``` javascript -{{dist/1.output.js}} +```javascript +_{{dist/my own chunk.output.js}}_ ``` -# dist/2.output.js +# dist/node_modules_b_js-node_modules_d_js.output.js -``` javascript -{{dist/2.output.js}} +```javascript +_{{dist/node_modules_b_js-node_modules_d_js.output.js}}_ ``` # Info @@ -28,11 +27,11 @@ ## Unoptimized ``` -{{stdout}} +_{{stdout}}_ ``` ## Production mode ``` -{{production:stdout}} +_{{production:stdout}}_ ``` diff --git a/examples/named-chunks/webpack.config.js b/examples/named-chunks/webpack.config.js index 0d554bf62ea..0cb61065efb 100644 --- a/examples/named-chunks/webpack.config.js +++ b/examples/named-chunks/webpack.config.js @@ -1,5 +1,5 @@ module.exports = { optimization: { - occurrenceOrder: true // To keep filename consistent between different modes (for example building only) + chunkIds: "named" } }; diff --git a/examples/node_modules/module.js b/examples/node_modules/module.js index f23403c2c0f..d6df8480e22 100644 --- a/examples/node_modules/module.js +++ b/examples/node_modules/module.js @@ -1 +1 @@ -module.exports = "module"; \ No newline at end of file +module.exports = "module"; diff --git a/examples/nodejs-addons/README.md b/examples/nodejs-addons/README.md new file mode 100644 index 00000000000..e117c9c66f1 --- /dev/null +++ b/examples/nodejs-addons/README.md @@ -0,0 +1,76 @@ +This example illustrates how to use [Node.js addons](https://nodejs.org/api/addons.html). + +# example.js + +```javascript +import { dlopen } from 'node:process'; +import { fileURLToPath } from 'node:url'; + +const file = new URL("./file.node", import.meta.url); +const myModule = { exports: {} }; + +try { + dlopen(myModule, fileURLToPath(file)); +} catch (err) { + console.log(err) + // Handling errors +} + +console.log(myModule.exports.hello()); +// Outputs: world +``` + +# webpack.config.js + +```javascript +module.exports = { + // mode: "development" || "production", + target: "node", + output: { + // We strong recommend use `publicPath: 'auto'` or do not set `publicPath` at all to generate relative URLs + // publicPath: 'auto' + }, + module: { + rules: [ + { + test: /\.node$/, + type: "asset/resource" + } + ] + } +}; +``` + +# Info + +## Unoptimized + +``` +asset 7726cbf5eb6de9759226.node 16.5 KiB [emitted] [immutable] [from: file.node] (auxiliary name: main) +asset output.js 6.27 KiB [emitted] (name: main) +chunk (runtime: main) output.js (main) 457 bytes (javascript) 16.5 KiB (asset) 1.26 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 1.26 KiB 6 modules + dependent modules 16.5 KiB (asset) 126 bytes (javascript) [dependent] 3 modules + ./example.js 331 bytes [built] [code generated] + [no exports] + [used exports unknown] + entry ./example.js main +webpack X.X.X compiled successfully +``` + +## Production mode + +``` +asset 7726cbf5eb6de9759226.node 16.5 KiB [emitted] [immutable] [from: file.node] (auxiliary name: main) +asset output.js 510 bytes [emitted] [minimized] (name: main) +chunk (runtime: main) output.js (main) 16.5 KiB (asset) 457 bytes (javascript) 440 bytes (runtime) [entry] [rendered] + > ./example.js main + runtime modules 440 bytes 3 modules + dependent modules 16.5 KiB (asset) 42 bytes (javascript) [dependent] 1 module + ./example.js + 2 modules 415 bytes [not cacheable] [built] [code generated] + [no exports] + [no exports used] + entry ./example.js main +webpack X.X.X compiled successfully +``` diff --git a/examples/nodejs-addons/binding.gyp b/examples/nodejs-addons/binding.gyp new file mode 100644 index 00000000000..de0ccf993a4 --- /dev/null +++ b/examples/nodejs-addons/binding.gyp @@ -0,0 +1,8 @@ +{ + "targets": [ + { + "target_name": "file", + "sources": [ "file.cc" ] + } + ] +} diff --git a/examples/nodejs-addons/build.js b/examples/nodejs-addons/build.js new file mode 100644 index 00000000000..795841944eb --- /dev/null +++ b/examples/nodejs-addons/build.js @@ -0,0 +1,25 @@ +global.NO_PUBLIC_PATH = true; + +const cp = require("child_process"); +const path = require("path"); +const fs = require("fs"); + +cp.exec(`node-gyp --target=${process.version} configure build`, (error, stdout, stderr) => { + if (stderr) { + console.log(stderr); + } + + if (error !== null) { + console.log(error); + } + + fs.copyFile(path.resolve(__dirname, "./build/Release/file.node"), path.resolve(__dirname, './file.node'), (err) => { + if (err) { + console.log(err); + } + + require("../build-common"); + }); +}); + + diff --git a/examples/nodejs-addons/example.js b/examples/nodejs-addons/example.js new file mode 100644 index 00000000000..41d2403e4be --- /dev/null +++ b/examples/nodejs-addons/example.js @@ -0,0 +1,15 @@ +import { dlopen } from 'node:process'; +import { fileURLToPath } from 'node:url'; + +const file = new URL("./file.node", import.meta.url); +const myModule = { exports: {} }; + +try { + dlopen(myModule, fileURLToPath(file)); +} catch (err) { + console.log(err) + // Handling errors +} + +console.log(myModule.exports.hello()); +// Outputs: world diff --git a/examples/nodejs-addons/file.cc b/examples/nodejs-addons/file.cc new file mode 100644 index 00000000000..b94aecb3c76 --- /dev/null +++ b/examples/nodejs-addons/file.cc @@ -0,0 +1,21 @@ +// Include uv.h and v8.h ahead of node.h to verify that node.h doesn't need to +// be included first. Disable clang-format as it will sort the include lists. +// clang-format off +#include +#include +#include +// clang-format on + +static void Method(const v8::FunctionCallbackInfo& args) { + v8::Isolate* isolate = args.GetIsolate(); + args.GetReturnValue().Set( + v8::String::NewFromUtf8(isolate, "world").ToLocalChecked()); +} + +static void InitModule(v8::Local exports, + v8::Local module, + v8::Local context) { + NODE_SET_METHOD(exports, "hello", Method); +} + +NODE_MODULE(NODE_GYP_MODULE_NAME, InitModule) diff --git a/examples/nodejs-addons/file.node b/examples/nodejs-addons/file.node new file mode 100755 index 00000000000..f7f058a3063 Binary files /dev/null and b/examples/nodejs-addons/file.node differ diff --git a/examples/nodejs-addons/template.md b/examples/nodejs-addons/template.md new file mode 100644 index 00000000000..9ac79d27260 --- /dev/null +++ b/examples/nodejs-addons/template.md @@ -0,0 +1,27 @@ +This example illustrates how to use [Node.js addons](https://nodejs.org/api/addons.html). + +# example.js + +```javascript +_{{example.js}}_ +``` + +# webpack.config.js + +```javascript +_{{webpack.config.js}}_ +``` + +# Info + +## Unoptimized + +``` +_{{stdout}}_ +``` + +## Production mode + +``` +_{{production:stdout}}_ +``` diff --git a/examples/nodejs-addons/webpack.config.js b/examples/nodejs-addons/webpack.config.js new file mode 100644 index 00000000000..57376a15bb4 --- /dev/null +++ b/examples/nodejs-addons/webpack.config.js @@ -0,0 +1,16 @@ +module.exports = { + // mode: "development" || "production", + target: "node", + output: { + // We strong recommend use `publicPath: 'auto'` or do not set `publicPath` at all to generate relative URLs + // publicPath: 'auto' + }, + module: { + rules: [ + { + test: /\.node$/, + type: "asset/resource" + } + ] + } +}; diff --git a/examples/persistent-caching/README.md b/examples/persistent-caching/README.md new file mode 100644 index 00000000000..c53e28b71df --- /dev/null +++ b/examples/persistent-caching/README.md @@ -0,0 +1,88 @@ +# example.js + +```javascript +console.log(process.env.NODE_ENV); + +import "./example.css"; +import "react"; +import "react-dom"; +import "acorn"; +import "core-js"; +import "date-fns"; +import "lodash"; +import * as _ from "lodash-es"; +console.log(_); +``` + +# webpack.config.js + +```javascript +const path = require("path"); +module.exports = (env = "development") => ({ + mode: env, + infrastructureLogging: { + // Optional: print more verbose logging about caching + level: "verbose" + }, + cache: { + type: "filesystem", + + // changing the cacheDirectory is optional, + // by default it will be in `node_modules/.cache` + cacheDirectory: path.resolve(__dirname, ".cache"), + + // Add additional dependencies to the build + buildDependencies: { + // recommended to invalidate cache on config changes + // This also makes all dependencies of this file build dependencies + config: [__filename] + // By default webpack and loaders are build dependencies + } + }, + module: { + rules: [ + { + test: /\.css$/, + use: ["style-loader", "css-loader"] + } + ] + } +}); +``` + +# Info + +## Unoptimized + +``` +asset output.js 3.57 MiB [emitted] (name: main) +chunk (runtime: main) output.js (main) 2.22 MiB (javascript) 1.29 KiB (runtime) [entry] + > ./example.js main + cached modules 2.22 MiB (javascript) 1.29 KiB (runtime) [cached] 1492 modules +webpack X.X.X compiled successfully +``` + +## Production mode + +``` +asset output.js 541 KiB [emitted] [minimized] [big] (name: main) 1 related asset +chunk (runtime: main) output.js (main) 2.16 MiB (javascript) 1.29 KiB (runtime) [entry] + > ./example.js main + cached modules 2.16 MiB (javascript) 1.29 KiB (runtime) [cached] 869 modules + +WARNING in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB). +This can impact web performance. +Assets: + output.js (541 KiB) + +WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance. +Entrypoints: + main (541 KiB) + output.js + +WARNING in webpack performance recommendations: +You can limit the size of your bundles by using import() or require.ensure to lazy load some parts of your application. +For more info visit https://webpack.js.org/guides/code-splitting/ + +webpack X.X.X compiled with 3 warnings +``` diff --git a/examples/persistent-caching/build.js b/examples/persistent-caching/build.js new file mode 100644 index 00000000000..41c29c9d169 --- /dev/null +++ b/examples/persistent-caching/build.js @@ -0,0 +1 @@ +require("../build-common"); \ No newline at end of file diff --git a/examples/persistent-caching/example.css b/examples/persistent-caching/example.css new file mode 100644 index 00000000000..f0d5b13bffd --- /dev/null +++ b/examples/persistent-caching/example.css @@ -0,0 +1,3 @@ +body { + background: red; +} diff --git a/examples/persistent-caching/example.js b/examples/persistent-caching/example.js new file mode 100644 index 00000000000..f04e6a6675a --- /dev/null +++ b/examples/persistent-caching/example.js @@ -0,0 +1,11 @@ +console.log(process.env.NODE_ENV); + +import "./example.css"; +import "react"; +import "react-dom"; +import "acorn"; +import "core-js"; +import "date-fns"; +import "lodash"; +import * as _ from "lodash-es"; +console.log(_); diff --git a/examples/persistent-caching/template.md b/examples/persistent-caching/template.md new file mode 100644 index 00000000000..2df3585bde6 --- /dev/null +++ b/examples/persistent-caching/template.md @@ -0,0 +1,25 @@ +# example.js + +```javascript +_{{example.js}}_ +``` + +# webpack.config.js + +```javascript +_{{webpack.config.js}}_ +``` + +# Info + +## Unoptimized + +``` +_{{stdout}}_ +``` + +## Production mode + +``` +_{{production:stdout}}_ +``` diff --git a/examples/persistent-caching/webpack.config.js b/examples/persistent-caching/webpack.config.js new file mode 100644 index 00000000000..9b7a46907b8 --- /dev/null +++ b/examples/persistent-caching/webpack.config.js @@ -0,0 +1,31 @@ +const path = require("path"); +module.exports = (env = "development") => ({ + mode: env, + infrastructureLogging: { + // Optional: print more verbose logging about caching + level: "verbose" + }, + cache: { + type: "filesystem", + + // changing the cacheDirectory is optional, + // by default it will be in `node_modules/.cache` + cacheDirectory: path.resolve(__dirname, ".cache"), + + // Add additional dependencies to the build + buildDependencies: { + // recommended to invalidate cache on config changes + // This also makes all dependencies of this file build dependencies + config: [__filename] + // By default webpack and loaders are build dependencies + } + }, + module: { + rules: [ + { + test: /\.css$/, + use: ["style-loader", "css-loader"] + } + ] + } +}); diff --git a/examples/reexport-components/README.md b/examples/reexport-components/README.md new file mode 100644 index 00000000000..8518c00b370 --- /dev/null +++ b/examples/reexport-components/README.md @@ -0,0 +1,263 @@ +# example.js + +```javascript +// insert router here +import(`./pages/${page}`); +``` + +# pages/Dashboard.js + +```javascript +import { Button, Checkbox } from "../components"; + +const Dashboard = () => { + return ( + <> + + +

Computing fibonacci without worker:

+ +

+	

Computing fibonacci with worker:

+ +

+`;
+
+const history = document.getElementById("history");
+const message = document.getElementById("message");
+const send = document.getElementById("send");
+const fib1 = document.getElementById("fib1");
+const output1 = document.getElementById("output1");
+const fib2 = document.getElementById("fib2");
+const output2 = document.getElementById("output2");
+
+/// CHAT with shared worker ///
+
+const chatWorker = new SharedWorker(
+	new URL("./chat-worker.js", import.meta.url),
+	{
+		name: "chat",
+		type: "module"
+	}
+);
+
+let historyTimeout;
+const scheduleUpdateHistory = () => {
+	clearTimeout(historyTimeout);
+	historyTimeout = setTimeout(() => {
+		chatWorker.port.postMessage({ type: "history" });
+	}, 1000);
+};
+scheduleUpdateHistory();
+
+const from = `User ${Math.floor(Math.random() * 10000)}`;
+
+send.addEventListener("click", e => {
+	chatWorker.port.postMessage({
+		type: "message",
+		content: message.value,
+		from
+	});
+	message.value = "";
+	message.focus();
+	e.preventDefault();
+});
+
+chatWorker.port.onmessage = event => {
+	const msg = event.data;
+	switch (msg.type) {
+		case "history":
+			history.innerText = msg.history.join("\n");
+			scheduleUpdateHistory();
+			break;
+	}
+};
+
+/// FIBONACCI without worker ///
+
+fib1.addEventListener("change", async () => {
+	try {
+		const value = parseInt(fib1.value, 10);
+		const { fibonacci } = await import("./fibonacci");
+		const result = fibonacci(value);
+		output1.innerText = `fib(${value}) = ${result}`;
+	} catch (e) {
+		output1.innerText = e.message;
+	}
+});
+
+/// FIBONACCI with worker ///
+
+const fibWorker = new Worker(new URL("./fib-worker.js", import.meta.url), {
+	name: "fibonacci",
+	type: "module"
+	/* webpackEntryOptions: { filename: "workers/[name].js" } */
+});
+
+fib2.addEventListener("change", () => {
+	try {
+		const value = parseInt(fib2.value, 10);
+		fibWorker.postMessage(`${value}`);
+	} catch (e) {
+		output2.innerText = e.message;
+	}
+});
+
+fibWorker.onmessage = event => {
+	output2.innerText = event.data;
+};
+```
+
+# fib-worker.js
+
+```javascript
+onmessage = async event => {
+	const { fibonacci } = await import("./fibonacci");
+	const value = JSON.parse(event.data);
+	postMessage(`fib(${value}) = ${fibonacci(value)}`);
+};
+```
+
+# fibonacci.js
+
+```javascript
+export function fibonacci(n) {
+	return n < 1 ? 0 : n <= 2 ? 1 : fibonacci(n - 1) + fibonacci(n - 2);
+}
+```
+
+# chat-worker.js
+
+```javascript
+import { history, add } from "./chat-module";
+
+onconnect = function (e) {
+	for (const port of e.ports) {
+		port.onmessage = event => {
+			const msg = event.data;
+			switch (msg.type) {
+				case "message":
+					add(msg.content, msg.from);
+				// fallthrough
+				case "history":
+					port.postMessage({
+						type: "history",
+						history
+					});
+					break;
+			}
+		};
+	}
+};
+```
+
+# chat-module.js
+
+```javascript
+export const history = [];
+
+export const add = (content, from) => {
+	if (history.length > 10) history.shift();
+	history.push(`${from}: ${content}`);
+};
+```
+
+# dist/main.js
+
+```javascript
+/******/ (() => { // webpackBootstrap
+/******/ 	var __webpack_modules__ = ({});
+```
+
+
/* webpack runtime code */ + +``` js +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames not based on template +/******/ if (chunkId === 721) return "workers/fibonacci.js"; +/******/ // return url for filenames based on template +/******/ return "" + (chunkId === 377 ? "chat" : chunkId) + ".js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/load script */ +/******/ (() => { +/******/ var inProgress = {}; +/******/ // data-webpack is not used as build has no uniqueName +/******/ // loadScript function to load a script via script tag +/******/ __webpack_require__.l = (url, done, key, chunkId) => { +/******/ if(inProgress[url]) { inProgress[url].push(done); return; } +/******/ var script, needAttach; +/******/ if(key !== undefined) { +/******/ var scripts = document.getElementsByTagName("script"); +/******/ for(var i = 0; i < scripts.length; i++) { +/******/ var s = scripts[i]; +/******/ if(s.getAttribute("src") == url) { script = s; break; } +/******/ } +/******/ } +/******/ if(!script) { +/******/ needAttach = true; +/******/ script = document.createElement('script'); +/******/ +/******/ script.charset = 'utf-8'; +/******/ script.timeout = 120; +/******/ if (__webpack_require__.nc) { +/******/ script.setAttribute("nonce", __webpack_require__.nc); +/******/ } +/******/ +/******/ +/******/ script.src = url; +/******/ } +/******/ inProgress[url] = [done]; +/******/ var onScriptComplete = (prev, event) => { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var doneFns = inProgress[url]; +/******/ delete inProgress[url]; +/******/ script.parentNode && script.parentNode.removeChild(script); +/******/ doneFns && doneFns.forEach((fn) => (fn(event))); +/******/ if(prev) return prev(event); +/******/ } +/******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000); +/******/ script.onerror = onScriptComplete.bind(null, script.onerror); +/******/ script.onload = onScriptComplete.bind(null, script.onload); +/******/ needAttach && document.head.appendChild(script); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "/dist/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/jsonp chunk loading */ +/******/ (() => { +/******/ __webpack_require__.b = document.baseURI || self.location.href; +/******/ +/******/ // object to store loaded and loading chunks +/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched +/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded +/******/ var installedChunks = { +/******/ 792: 0 +/******/ }; +/******/ +/******/ __webpack_require__.f.j = (chunkId, promises) => { +/******/ // JSONP chunk loading for javascript +/******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined; +/******/ if(installedChunkData !== 0) { // 0 means "already installed". +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ promises.push(installedChunkData[2]); +/******/ } else { +/******/ if(true) { // all chunks have JS +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject])); +/******/ promises.push(installedChunkData[2] = promise); +/******/ +/******/ // start chunk loading +/******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId); +/******/ // create error before stack unwound to get useful stacktrace later +/******/ var error = new Error(); +/******/ var loadingEnded = (event) => { +/******/ if(__webpack_require__.o(installedChunks, chunkId)) { +/******/ installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined; +/******/ if(installedChunkData) { +/******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type); +/******/ var realSrc = event && event.target && event.target.src; +/******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')'; +/******/ error.name = 'ChunkLoadError'; +/******/ error.type = errorType; +/******/ error.request = realSrc; +/******/ installedChunkData[1](error); +/******/ } +/******/ } +/******/ }; +/******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId); +/******/ } +/******/ } +/******/ } +/******/ }; +/******/ +/******/ // no prefetching +/******/ +/******/ // no preloaded +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ +/******/ // no on chunks loaded +/******/ +/******/ // install a JSONP callback for chunk loading +/******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0; +/******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) { +/******/ for(moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) var result = runtime(__webpack_require__); +/******/ } +/******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data); +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) { +/******/ installedChunks[chunkId][0](); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ +/******/ } +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0)); +/******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal)); +/******/ })(); +/******/ +/************************************************************************/ +``` + +
+ +``` js +var __webpack_exports__ = {}; +/*!********************!*\ + !*** ./example.js ***! + \********************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: __webpack_require__.p, __webpack_require__.b, __webpack_require__.u, __webpack_require__.e, __webpack_require__, __webpack_require__.* */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */ +document.body.innerHTML = ` +

+	
+ + +
+

Computing fibonacci without worker:

+ +

+	

Computing fibonacci with worker:

+ +

+`;
+
+const history = document.getElementById("history");
+const message = document.getElementById("message");
+const send = document.getElementById("send");
+const fib1 = document.getElementById("fib1");
+const output1 = document.getElementById("output1");
+const fib2 = document.getElementById("fib2");
+const output2 = document.getElementById("output2");
+
+/// CHAT with shared worker ///
+
+const chatWorker = new SharedWorker(
+	new URL(/* worker import */ __webpack_require__.p + __webpack_require__.u(377), __webpack_require__.b),
+	{
+		name: "chat",
+		type: undefined
+	}
+);
+
+let historyTimeout;
+const scheduleUpdateHistory = () => {
+	clearTimeout(historyTimeout);
+	historyTimeout = setTimeout(() => {
+		chatWorker.port.postMessage({ type: "history" });
+	}, 1000);
+};
+scheduleUpdateHistory();
+
+const from = `User ${Math.floor(Math.random() * 10000)}`;
+
+send.addEventListener("click", e => {
+	chatWorker.port.postMessage({
+		type: "message",
+		content: message.value,
+		from
+	});
+	message.value = "";
+	message.focus();
+	e.preventDefault();
+});
+
+chatWorker.port.onmessage = event => {
+	const msg = event.data;
+	switch (msg.type) {
+		case "history":
+			history.innerText = msg.history.join("\n");
+			scheduleUpdateHistory();
+			break;
+	}
+};
+
+/// FIBONACCI without worker ///
+
+fib1.addEventListener("change", async () => {
+	try {
+		const value = parseInt(fib1.value, 10);
+		const { fibonacci } = await __webpack_require__.e(/*! import() */ 129).then(__webpack_require__.bind(__webpack_require__, /*! ./fibonacci */ 3));
+		const result = fibonacci(value);
+		output1.innerText = `fib(${value}) = ${result}`;
+	} catch (e) {
+		output1.innerText = e.message;
+	}
+});
+
+/// FIBONACCI with worker ///
+
+const fibWorker = new Worker(new URL(/* worker import */ __webpack_require__.p + __webpack_require__.u(721), __webpack_require__.b), {
+	name: "fibonacci",
+	type: undefined
+	/* webpackEntryOptions: { filename: "workers/[name].js" } */
+});
+
+fib2.addEventListener("change", () => {
+	try {
+		const value = parseInt(fib2.value, 10);
+		fibWorker.postMessage(`${value}`);
+	} catch (e) {
+		output2.innerText = e.message;
+	}
+});
+
+fibWorker.onmessage = event => {
+	output2.innerText = event.data;
+};
+
+/******/ })()
+;
+```
+
+# dist/chat.js
+
+```javascript
+/******/ (() => { // webpackBootstrap
+/******/ 	"use strict";
+/*!************************************!*\
+  !*** ./chat-worker.js + 1 modules ***!
+  \************************************/
+/*! namespace exports */
+/*! runtime requirements:  */
+
+;// ./chat-module.js
+const chat_module_history = [];
+
+const add = (content, from) => {
+	if (chat_module_history.length > 10) chat_module_history.shift();
+	chat_module_history.push(`${from}: ${content}`);
+};
+
+;// ./chat-worker.js
+
+
+onconnect = function (e) {
+	for (const port of e.ports) {
+		port.onmessage = event => {
+			const msg = event.data;
+			switch (msg.type) {
+				case "message":
+					add(msg.content, msg.from);
+				// fallthrough
+				case "history":
+					port.postMessage({
+						type: "history",
+						history: chat_module_history
+					});
+					break;
+			}
+		};
+	}
+};
+
+/******/ })()
+;
+```
+
+```javascript
+(()=>{"use strict";const s=[];onconnect=function(t){for(const o of t.ports)o.onmessage=t=>{const e=t.data;switch(e.type){case"message":n=e.content,c=e.from,s.length>10&&s.shift(),s.push(`${c}: ${n}`);case"history":o.postMessage({type:"history",history:s})}var n,c}}})();
+```
+
+# dist/workers/fibonacci.js
+
+```javascript
+/******/ (() => { // webpackBootstrap
+/******/ 	var __webpack_modules__ = ({});
+```
+
+
/* webpack runtime code */ + +``` js +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = __webpack_modules__; +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { +/******/ // define getter functions for harmony exports +/******/ __webpack_require__.d = (exports, definition) => { +/******/ for(var key in definition) { +/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { +/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); +/******/ } +/******/ } +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/ensure chunk */ +/******/ (() => { +/******/ __webpack_require__.f = {}; +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = (chunkId) => { +/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { +/******/ __webpack_require__.f[key](chunkId, promises); +/******/ return promises; +/******/ }, [])); +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/get javascript chunk filename */ +/******/ (() => { +/******/ // This function allow to reference async chunks +/******/ __webpack_require__.u = (chunkId) => { +/******/ // return url for filenames based on template +/******/ return "" + chunkId + ".js"; +/******/ }; +/******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { +/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) +/******/ })(); +/******/ +/******/ /* webpack/runtime/publicPath */ +/******/ (() => { +/******/ __webpack_require__.p = "/dist/"; +/******/ })(); +/******/ +/******/ /* webpack/runtime/importScripts chunk loading */ +/******/ (() => { +/******/ // no baseURI +/******/ +/******/ // object to store loaded chunks +/******/ // "1" means "already loaded" +/******/ var installedChunks = { +/******/ 721: 1 +/******/ }; +/******/ +/******/ // importScripts chunk loading +/******/ var installChunk = (data) => { +/******/ var [chunkIds, moreModules, runtime] = data; +/******/ for(var moduleId in moreModules) { +/******/ if(__webpack_require__.o(moreModules, moduleId)) { +/******/ __webpack_require__.m[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(runtime) runtime(__webpack_require__); +/******/ while(chunkIds.length) +/******/ installedChunks[chunkIds.pop()] = 1; +/******/ parentChunkLoadingFunction(data); +/******/ }; +/******/ __webpack_require__.f.i = (chunkId, promises) => { +/******/ // "1" is the signal for "already loaded" +/******/ if(!installedChunks[chunkId]) { +/******/ if(true) { // all chunks have JS +/******/ importScripts(__webpack_require__.p + __webpack_require__.u(chunkId)); +/******/ } +/******/ } +/******/ }; +/******/ +/******/ var chunkLoadingGlobal = self["webpackChunk"] = self["webpackChunk"] || []; +/******/ var parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal); +/******/ chunkLoadingGlobal.push = installChunk; +/******/ +/******/ // no HMR +/******/ +/******/ // no HMR manifest +/******/ })(); +/******/ +/************************************************************************/ +``` + +
+ +``` js +var __webpack_exports__ = {}; +/*!***********************!*\ + !*** ./fib-worker.js ***! + \***********************/ +/*! unknown exports (runtime-defined) */ +/*! runtime requirements: __webpack_require__.e, __webpack_require__, __webpack_require__.* */ +/*! ModuleConcatenation bailout: Module is not an ECMAScript module */ +onmessage = async event => { + const { fibonacci } = await __webpack_require__.e(/*! import() */ 129).then(__webpack_require__.bind(__webpack_require__, /*! ./fibonacci */ 3)); + const value = JSON.parse(event.data); + postMessage(`fib(${value}) = ${fibonacci(value)}`); +}; + +/******/ })() +; +``` + +```javascript +(()=>{var e={},r={};function o(t){var a=r[t];if(void 0!==a)return a.exports;var s=r[t]={exports:{}};return e[t](s,s.exports,o),s.exports}o.m=e,o.d=(e,r)=>{for(var t in r)o.o(r,t)&&!o.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},o.f={},o.e=e=>Promise.all(Object.keys(o.f).reduce(((r,t)=>(o.f[t](e,r),r)),[])),o.u=e=>e+".js",o.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),o.p="/dist/",(()=>{var e={721:1};o.f.i=(r,t)=>{e[r]||importScripts(o.p+o.u(r))};var r=self.webpackChunk=self.webpackChunk||[],t=r.push.bind(r);r.push=r=>{var[a,s,p]=r;for(var n in s)o.o(s,n)&&(o.m[n]=s[n]);for(p&&p(o);a.length;)e[a.pop()]=1;t(r)}})(),onmessage=async e=>{const{fibonacci:r}=await o.e(129).then(o.bind(o,129)),t=JSON.parse(e.data);postMessage(`fib(${t}) = ${r(t)}`)}})(); +``` + +# dist/129.js + +```javascript +"use strict"; +(self["webpackChunk"] = self["webpackChunk"] || []).push([[129],{ + +/***/ 3: +/*!**********************!*\ + !*** ./fibonacci.js ***! + \**********************/ +/*! namespace exports */ +/*! export fibonacci [provided] [used in main, 9a81d90cfd0dfd13d748] [usage prevents renaming] */ +/*! runtime requirements: __webpack_exports__, __webpack_require__.d, __webpack_require__.* */ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ fibonacci: () => (/* binding */ fibonacci) +/* harmony export */ }); +function fibonacci(n) { + return n < 1 ? 0 : n <= 2 ? 1 : fibonacci(n - 1) + fibonacci(n - 2); +} + + +/***/ }) + +}]); +``` + +# Info + +## Unoptimized + +``` +asset main.js 11.9 KiB [emitted] (name: main) +asset workers/fibonacci.js 4.99 KiB [emitted] (name: fibonacci) +asset chat.js 839 bytes [emitted] (name: chat) +asset 129.js 741 bytes [emitted] +chunk (runtime: 9a81d90cfd0dfd13d748, main) 129.js 103 bytes [rendered] + > ./fibonacci ./example.js 70:30-51 + > ./fibonacci ./fib-worker.js 2:29-50 + ./fibonacci.js 103 bytes [built] [code generated] + [exports: fibonacci] + [all exports used] + import() ./fibonacci ./example.js 70:30-51 + import() ./fibonacci ./fib-worker.js 2:29-50 +chunk (runtime: 1fad8bf8de78b0a77bfd) chat.js (chat) 527 bytes [entry] [rendered] + > ./example.js 25:19-31:1 + ./chat-worker.js + 1 modules 527 bytes [built] [code generated] + [no exports] + [no exports used] + new Worker() ./chat-worker.js ./example.js 25:19-31:1 +chunk (runtime: 9a81d90cfd0dfd13d748) workers/fibonacci.js (fibonacci) 176 bytes (javascript) 1.88 KiB (runtime) [entry] [rendered] + > ./example.js 80:18-84:2 + runtime modules 1.88 KiB 6 modules + ./fib-worker.js 176 bytes [built] [code generated] + [no exports used] + new Worker() ./fib-worker.js ./example.js 80:18-84:2 +chunk (runtime: main) main.js (main) 2.25 KiB (javascript) 5.41 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 5.41 KiB 7 modules + ./example.js 2.25 KiB [built] [code generated] + [no exports used] + entry ./example.js main +webpack X.X.X compiled successfully +``` + +## Production mode + +``` +asset main.js 3.29 KiB [emitted] [minimized] (name: main) +asset workers/fibonacci.js 778 bytes [emitted] [minimized] (name: fibonacci) +asset chat.js 270 bytes [emitted] [minimized] (name: chat) +asset 129.js 159 bytes [emitted] [minimized] +chunk (runtime: 9a81d90cfd0dfd13d748, main) 129.js 103 bytes [rendered] + > ./fibonacci ./fib-worker.js 2:29-50 + > ./fibonacci ./example.js 70:30-51 + ./fibonacci.js 103 bytes [built] [code generated] + [exports: fibonacci] + [all exports used] + import() ./fibonacci ./example.js 70:30-51 + import() ./fibonacci ./fib-worker.js 2:29-50 +chunk (runtime: 1fad8bf8de78b0a77bfd) chat.js (chat) 527 bytes [entry] [rendered] + > ./example.js 25:19-31:1 + ./chat-worker.js + 1 modules 527 bytes [built] [code generated] + [no exports] + [no exports used] + new Worker() ./chat-worker.js ./example.js 25:19-31:1 +chunk (runtime: 9a81d90cfd0dfd13d748) workers/fibonacci.js (fibonacci) 176 bytes (javascript) 1.88 KiB (runtime) [entry] [rendered] + > ./example.js 80:18-84:2 + runtime modules 1.88 KiB 6 modules + ./fib-worker.js 176 bytes [built] [code generated] + [no exports used] + new Worker() ./fib-worker.js ./example.js 80:18-84:2 +chunk (runtime: main) main.js (main) 2.25 KiB (javascript) 5.41 KiB (runtime) [entry] [rendered] + > ./example.js main + runtime modules 5.41 KiB 7 modules + ./example.js 2.25 KiB [built] [code generated] + [no exports used] + entry ./example.js main +webpack X.X.X compiled successfully +``` diff --git a/examples/worker/build.js b/examples/worker/build.js new file mode 100644 index 00000000000..5768b058787 --- /dev/null +++ b/examples/worker/build.js @@ -0,0 +1,3 @@ +global.NO_TARGET_ARGS = true; +global.NO_PUBLIC_PATH = true; +require("../build-common"); diff --git a/examples/worker/chat-module.js b/examples/worker/chat-module.js new file mode 100644 index 00000000000..716a104a9dc --- /dev/null +++ b/examples/worker/chat-module.js @@ -0,0 +1,6 @@ +export const history = []; + +export const add = (content, from) => { + if (history.length > 10) history.shift(); + history.push(`${from}: ${content}`); +}; diff --git a/examples/worker/chat-worker.js b/examples/worker/chat-worker.js new file mode 100644 index 00000000000..66fa65165a9 --- /dev/null +++ b/examples/worker/chat-worker.js @@ -0,0 +1,20 @@ +import { history, add } from "./chat-module"; + +onconnect = function (e) { + for (const port of e.ports) { + port.onmessage = event => { + const msg = event.data; + switch (msg.type) { + case "message": + add(msg.content, msg.from); + // fallthrough + case "history": + port.postMessage({ + type: "history", + history + }); + break; + } + }; + } +}; diff --git a/examples/worker/example.js b/examples/worker/example.js new file mode 100644 index 00000000000..fcbe23f092f --- /dev/null +++ b/examples/worker/example.js @@ -0,0 +1,97 @@ +document.body.innerHTML = ` +

+	
+ + +
+

Computing fibonacci without worker:

+ +

+	

Computing fibonacci with worker:

+ +

+`;
+
+const history = document.getElementById("history");
+const message = document.getElementById("message");
+const send = document.getElementById("send");
+const fib1 = document.getElementById("fib1");
+const output1 = document.getElementById("output1");
+const fib2 = document.getElementById("fib2");
+const output2 = document.getElementById("output2");
+
+/// CHAT with shared worker ///
+
+const chatWorker = new SharedWorker(
+	new URL("./chat-worker.js", import.meta.url),
+	{
+		name: "chat",
+		type: "module"
+	}
+);
+
+let historyTimeout;
+const scheduleUpdateHistory = () => {
+	clearTimeout(historyTimeout);
+	historyTimeout = setTimeout(() => {
+		chatWorker.port.postMessage({ type: "history" });
+	}, 1000);
+};
+scheduleUpdateHistory();
+
+const from = `User ${Math.floor(Math.random() * 10000)}`;
+
+send.addEventListener("click", e => {
+	chatWorker.port.postMessage({
+		type: "message",
+		content: message.value,
+		from
+	});
+	message.value = "";
+	message.focus();
+	e.preventDefault();
+});
+
+chatWorker.port.onmessage = event => {
+	const msg = event.data;
+	switch (msg.type) {
+		case "history":
+			history.innerText = msg.history.join("\n");
+			scheduleUpdateHistory();
+			break;
+	}
+};
+
+/// FIBONACCI without worker ///
+
+fib1.addEventListener("change", async () => {
+	try {
+		const value = parseInt(fib1.value, 10);
+		const { fibonacci } = await import("./fibonacci");
+		const result = fibonacci(value);
+		output1.innerText = `fib(${value}) = ${result}`;
+	} catch (e) {
+		output1.innerText = e.message;
+	}
+});
+
+/// FIBONACCI with worker ///
+
+const fibWorker = new Worker(new URL("./fib-worker.js", import.meta.url), {
+	name: "fibonacci",
+	type: "module"
+	/* webpackEntryOptions: { filename: "workers/[name].js" } */
+});
+
+fib2.addEventListener("change", () => {
+	try {
+		const value = parseInt(fib2.value, 10);
+		fibWorker.postMessage(`${value}`);
+	} catch (e) {
+		output2.innerText = e.message;
+	}
+});
+
+fibWorker.onmessage = event => {
+	output2.innerText = event.data;
+};
diff --git a/examples/worker/fib-worker.js b/examples/worker/fib-worker.js
new file mode 100644
index 00000000000..42efa83cf4e
--- /dev/null
+++ b/examples/worker/fib-worker.js
@@ -0,0 +1,5 @@
+onmessage = async event => {
+	const { fibonacci } = await import("./fibonacci");
+	const value = JSON.parse(event.data);
+	postMessage(`fib(${value}) = ${fibonacci(value)}`);
+};
diff --git a/examples/worker/fibonacci.js b/examples/worker/fibonacci.js
new file mode 100644
index 00000000000..282fcec2fca
--- /dev/null
+++ b/examples/worker/fibonacci.js
@@ -0,0 +1,3 @@
+export function fibonacci(n) {
+	return n < 1 ? 0 : n <= 2 ? 1 : fibonacci(n - 1) + fibonacci(n - 2);
+}
diff --git a/examples/worker/index.html b/examples/worker/index.html
new file mode 100644
index 00000000000..fd8adb597c8
--- /dev/null
+++ b/examples/worker/index.html
@@ -0,0 +1,10 @@
+
+
+	
+		
+		Worker example
+	
+	
+		
+	
+
diff --git a/examples/worker/template.md b/examples/worker/template.md
new file mode 100644
index 00000000000..6a93ddfd9b5
--- /dev/null
+++ b/examples/worker/template.md
@@ -0,0 +1,75 @@
+# example.js
+
+```javascript
+_{{example.js}}_
+```
+
+# fib-worker.js
+
+```javascript
+_{{fib-worker.js}}_
+```
+
+# fibonacci.js
+
+```javascript
+_{{fibonacci.js}}_
+```
+
+# chat-worker.js
+
+```javascript
+_{{chat-worker.js}}_
+```
+
+# chat-module.js
+
+```javascript
+_{{chat-module.js}}_
+```
+
+# dist/main.js
+
+```javascript
+_{{dist/main.js}}_
+```
+
+# dist/chat.js
+
+```javascript
+_{{dist/chat.js}}_
+```
+
+```javascript
+_{{production:dist/chat.js}}_
+```
+
+# dist/workers/fibonacci.js
+
+```javascript
+_{{dist/workers/fibonacci.js}}_
+```
+
+```javascript
+_{{production:dist/workers/fibonacci.js}}_
+```
+
+# dist/129.js
+
+```javascript
+_{{dist/129.js}}_
+```
+
+# Info
+
+## Unoptimized
+
+```
+_{{stdout}}_
+```
+
+## Production mode
+
+```
+_{{production:stdout}}_
+```
diff --git a/examples/worker/webpack.config.js b/examples/worker/webpack.config.js
new file mode 100644
index 00000000000..40032472184
--- /dev/null
+++ b/examples/worker/webpack.config.js
@@ -0,0 +1,17 @@
+const path = require("path");
+
+module.exports = {
+	entry: "./example.js",
+	output: {
+		path: path.join(__dirname, "dist"),
+		filename: "[name].js",
+		chunkFilename: "[name].js",
+		publicPath: "/dist/"
+	},
+	optimization: {
+		concatenateModules: true,
+		usedExports: true,
+		providedExports: true,
+		chunkIds: "deterministic" // To keep filename consistent between different modes (for example building only)
+	}
+};
diff --git a/generate-types-config.js b/generate-types-config.js
new file mode 100644
index 00000000000..b1a47a8285e
--- /dev/null
+++ b/generate-types-config.js
@@ -0,0 +1,9 @@
+module.exports = {
+	nameMapping: {
+		FsStats: /^Stats Import fs/,
+		validateFunction: /^validate Import/,
+		Configuration: /^WebpackOptions /
+	},
+	exclude: [/^devServer in WebpackOptions /],
+	include: [/^(_module|_compilation|_compiler) in NormalModuleLoaderContext /]
+};
diff --git a/hot/dev-server.js b/hot/dev-server.js
index 682a47f8423..4812864a128 100644
--- a/hot/dev-server.js
+++ b/hot/dev-server.js
@@ -2,24 +2,33 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
-/*globals window __webpack_hash__ */
+/* globals __webpack_hash__ */
 if (module.hot) {
+	/** @type {undefined|string} */
 	var lastHash;
 	var upToDate = function upToDate() {
-		return lastHash.indexOf(__webpack_hash__) >= 0;
+		return /** @type {string} */ (lastHash).indexOf(__webpack_hash__) >= 0;
 	};
 	var log = require("./log");
 	var check = function check() {
 		module.hot
 			.check(true)
-			.then(function(updatedModules) {
+			.then(function (updatedModules) {
 				if (!updatedModules) {
-					log("warning", "[HMR] Cannot find update. Need to do a full reload!");
+					log(
+						"warning",
+						"[HMR] Cannot find update. " +
+							(typeof window !== "undefined"
+								? "Need to do a full reload!"
+								: "Please reload manually!")
+					);
 					log(
 						"warning",
 						"[HMR] (Probably because of restarting the webpack-dev-server)"
 					);
-					window.location.reload();
+					if (typeof window !== "undefined") {
+						window.location.reload();
+					}
 					return;
 				}
 
@@ -33,22 +42,27 @@ if (module.hot) {
 					log("info", "[HMR] App is up to date.");
 				}
 			})
-			.catch(function(err) {
+			.catch(function (err) {
 				var status = module.hot.status();
 				if (["abort", "fail"].indexOf(status) >= 0) {
 					log(
 						"warning",
-						"[HMR] Cannot apply update. Need to do a full reload!"
+						"[HMR] Cannot apply update. " +
+							(typeof window !== "undefined"
+								? "Need to do a full reload!"
+								: "Please reload manually!")
 					);
-					log("warning", "[HMR] " + (err.stack || err.message));
-					window.location.reload();
+					log("warning", "[HMR] " + log.formatError(err));
+					if (typeof window !== "undefined") {
+						window.location.reload();
+					}
 				} else {
-					log("warning", "[HMR] Update failed: " + (err.stack || err.message));
+					log("warning", "[HMR] Update failed: " + log.formatError(err));
 				}
 			});
 	};
 	var hotEmitter = require("./emitter");
-	hotEmitter.on("webpackHotUpdate", function(currentHash) {
+	hotEmitter.on("webpackHotUpdate", function (currentHash) {
 		lastHash = currentHash;
 		if (!upToDate() && module.hot.status() === "idle") {
 			log("info", "[HMR] Checking for updates on the server...");
diff --git a/hot/lazy-compilation-node.js b/hot/lazy-compilation-node.js
new file mode 100644
index 00000000000..da4058583b1
--- /dev/null
+++ b/hot/lazy-compilation-node.js
@@ -0,0 +1,50 @@
+/* global __resourceQuery */
+
+"use strict";
+
+var urlBase = decodeURIComponent(__resourceQuery.slice(1));
+
+/**
+ * @param {{ data: string, onError: (err: Error) => void, active: boolean, module: module }} options options
+ * @returns {() => void} function to destroy response
+ */
+exports.keepAlive = function (options) {
+	var data = options.data;
+	var onError = options.onError;
+	var active = options.active;
+	var module = options.module;
+	/** @type {import("http").IncomingMessage} */
+	var response;
+	var request = (
+		urlBase.startsWith("https") ? require("https") : require("http")
+	).request(
+		urlBase + data,
+		{
+			agent: false,
+			headers: { accept: "text/event-stream" }
+		},
+		function (res) {
+			response = res;
+			response.on("error", errorHandler);
+			if (!active && !module.hot) {
+				console.log(
+					"Hot Module Replacement is not enabled. Waiting for process restart..."
+				);
+			}
+		}
+	);
+
+	/**
+	 * @param {Error} err error
+	 */
+	function errorHandler(err) {
+		err.message =
+			"Problem communicating active modules to the server: " + err.message;
+		onError(err);
+	}
+	request.on("error", errorHandler);
+	request.end();
+	return function () {
+		response.destroy();
+	};
+};
diff --git a/hot/lazy-compilation-web.js b/hot/lazy-compilation-web.js
new file mode 100644
index 00000000000..ec8253f0a3c
--- /dev/null
+++ b/hot/lazy-compilation-web.js
@@ -0,0 +1,83 @@
+/* global __resourceQuery */
+
+"use strict";
+
+if (typeof EventSource !== "function") {
+	throw new Error(
+		"Environment doesn't support lazy compilation (requires EventSource)"
+	);
+}
+
+var urlBase = decodeURIComponent(__resourceQuery.slice(1));
+/** @type {EventSource | undefined} */
+var activeEventSource;
+var activeKeys = new Map();
+var errorHandlers = new Set();
+
+var updateEventSource = function updateEventSource() {
+	if (activeEventSource) activeEventSource.close();
+	if (activeKeys.size) {
+		activeEventSource = new EventSource(
+			urlBase + Array.from(activeKeys.keys()).join("@")
+		);
+		/**
+		 * @this {EventSource}
+		 * @param {Event & { message?: string, filename?: string, lineno?: number, colno?: number, error?: Error }} event event
+		 */
+		activeEventSource.onerror = function (event) {
+			errorHandlers.forEach(function (onError) {
+				onError(
+					new Error(
+						"Problem communicating active modules to the server: " +
+							event.message +
+							" " +
+							event.filename +
+							":" +
+							event.lineno +
+							":" +
+							event.colno +
+							" " +
+							event.error
+					)
+				);
+			});
+		};
+	} else {
+		activeEventSource = undefined;
+	}
+};
+
+/**
+ * @param {{ data: string, onError: (err: Error) => void, active: boolean, module: module }} options options
+ * @returns {() => void} function to destroy response
+ */
+exports.keepAlive = function (options) {
+	var data = options.data;
+	var onError = options.onError;
+	var active = options.active;
+	var module = options.module;
+	errorHandlers.add(onError);
+	var value = activeKeys.get(data) || 0;
+	activeKeys.set(data, value + 1);
+	if (value === 0) {
+		updateEventSource();
+	}
+	if (!active && !module.hot) {
+		console.log(
+			"Hot Module Replacement is not enabled. Waiting for process restart..."
+		);
+	}
+
+	return function () {
+		errorHandlers.delete(onError);
+		setTimeout(function () {
+			var value = activeKeys.get(data);
+			if (value === 1) {
+				activeKeys.delete(data);
+				updateEventSource();
+			} else {
+				activeKeys.set(data, value - 1);
+			}
+		}, 1000);
+	};
+};
diff --git a/hot/log-apply-result.js b/hot/log-apply-result.js
index b63e757418d..cb46366dd44 100644
--- a/hot/log-apply-result.js
+++ b/hot/log-apply-result.js
@@ -2,8 +2,13 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
-module.exports = function(updatedModules, renewedModules) {
-	var unacceptedModules = updatedModules.filter(function(moduleId) {
+
+/**
+ * @param {(string | number)[]} updatedModules updated modules
+ * @param {(string | number)[] | null} renewedModules renewed modules
+ */
+module.exports = function (updatedModules, renewedModules) {
+	var unacceptedModules = updatedModules.filter(function (moduleId) {
 		return renewedModules && renewedModules.indexOf(moduleId) < 0;
 	});
 	var log = require("./log");
@@ -13,7 +18,7 @@ module.exports = function(updatedModules, renewedModules) {
 			"warning",
 			"[HMR] The following modules couldn't be hot updated: (They would need a full reload!)"
 		);
-		unacceptedModules.forEach(function(moduleId) {
+		unacceptedModules.forEach(function (moduleId) {
 			log("warning", "[HMR]  - " + moduleId);
 		});
 	}
@@ -22,7 +27,7 @@ module.exports = function(updatedModules, renewedModules) {
 		log("info", "[HMR] Nothing hot updated.");
 	} else {
 		log("info", "[HMR] Updated modules:");
-		renewedModules.forEach(function(moduleId) {
+		renewedModules.forEach(function (moduleId) {
 			if (typeof moduleId === "string" && moduleId.indexOf("!") !== -1) {
 				var parts = moduleId.split("!");
 				log.groupCollapsed("info", "[HMR]  - " + parts.pop());
@@ -32,13 +37,13 @@ module.exports = function(updatedModules, renewedModules) {
 				log("info", "[HMR]  - " + moduleId);
 			}
 		});
-		var numberIds = renewedModules.every(function(moduleId) {
+		var numberIds = renewedModules.every(function (moduleId) {
 			return typeof moduleId === "number";
 		});
 		if (numberIds)
 			log(
 				"info",
-				"[HMR] Consider using the NamedModulesPlugin for module names."
+				'[HMR] Consider using the optimization.moduleIds: "named" for module names.'
 			);
 	}
 };
diff --git a/hot/log.js b/hot/log.js
index 0d05673f83b..63758822ae6 100644
--- a/hot/log.js
+++ b/hot/log.js
@@ -1,7 +1,14 @@
+/** @typedef {"info" | "warning" | "error"} LogLevel */
+
+/** @type {LogLevel} */
 var logLevel = "info";
 
 function dummy() {}
 
+/**
+ * @param {LogLevel} level log level
+ * @returns {boolean} true, if should log
+ */
 function shouldLog(level) {
 	var shouldLog =
 		(logLevel === "info" && level === "info") ||
@@ -10,15 +17,23 @@ function shouldLog(level) {
 	return shouldLog;
 }
 
+/**
+ * @param {(msg?: string) => void} logFn log function
+ * @returns {(level: LogLevel, msg?: string) => void} function that logs when log level is sufficient
+ */
 function logGroup(logFn) {
-	return function(level, msg) {
+	return function (level, msg) {
 		if (shouldLog(level)) {
 			logFn(msg);
 		}
 	};
 }
 
-module.exports = function(level, msg) {
+/**
+ * @param {LogLevel} level log level
+ * @param {string|Error} msg message
+ */
+module.exports = function (level, msg) {
 	if (shouldLog(level)) {
 		if (level === "info") {
 			console.log(msg);
@@ -30,11 +45,9 @@ module.exports = function(level, msg) {
 	}
 };
 
-/* eslint-disable node/no-unsupported-features/node-builtins */
 var group = console.group || dummy;
 var groupCollapsed = console.groupCollapsed || dummy;
 var groupEnd = console.groupEnd || dummy;
-/* eslint-enable node/no-unsupported-features/node-builtins */
 
 module.exports.group = logGroup(group);
 
@@ -42,6 +55,24 @@ module.exports.groupCollapsed = logGroup(groupCollapsed);
 
 module.exports.groupEnd = logGroup(groupEnd);
 
-module.exports.setLogLevel = function(level) {
+/**
+ * @param {LogLevel} level log level
+ */
+module.exports.setLogLevel = function (level) {
 	logLevel = level;
 };
+
+/**
+ * @param {Error} err error
+ * @returns {string} formatted error
+ */
+module.exports.formatError = function (err) {
+	var message = err.message;
+	var stack = err.stack;
+	if (!stack) {
+		return message;
+	} else if (stack.indexOf(message) < 0) {
+		return message + "\n" + stack;
+	}
+	return stack;
+};
diff --git a/hot/only-dev-server.js b/hot/only-dev-server.js
index 043f2430b54..5979ab54353 100644
--- a/hot/only-dev-server.js
+++ b/hot/only-dev-server.js
@@ -2,17 +2,18 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
-/*globals __webpack_hash__ */
+/* globals __webpack_hash__ */
 if (module.hot) {
+	/** @type {undefined|string} */
 	var lastHash;
 	var upToDate = function upToDate() {
-		return lastHash.indexOf(__webpack_hash__) >= 0;
+		return /** @type {string} */ (lastHash).indexOf(__webpack_hash__) >= 0;
 	};
 	var log = require("./log");
 	var check = function check() {
 		module.hot
 			.check()
-			.then(function(updatedModules) {
+			.then(function (updatedModules) {
 				if (!updatedModules) {
 					log("warning", "[HMR] Cannot find update. Need to do a full reload!");
 					log(
@@ -27,21 +28,21 @@ if (module.hot) {
 						ignoreUnaccepted: true,
 						ignoreDeclined: true,
 						ignoreErrored: true,
-						onUnaccepted: function(data) {
+						onUnaccepted: function (data) {
 							log(
 								"warning",
 								"Ignored an update to unaccepted module " +
 									data.chain.join(" -> ")
 							);
 						},
-						onDeclined: function(data) {
+						onDeclined: function (data) {
 							log(
 								"warning",
 								"Ignored an update to declined module " +
 									data.chain.join(" -> ")
 							);
 						},
-						onErrored: function(data) {
+						onErrored: function (data) {
 							log("error", data.error);
 							log(
 								"warning",
@@ -53,7 +54,7 @@ if (module.hot) {
 							);
 						}
 					})
-					.then(function(renewedModules) {
+					.then(function (renewedModules) {
 						if (!upToDate()) {
 							check();
 						}
@@ -65,24 +66,21 @@ if (module.hot) {
 						}
 					});
 			})
-			.catch(function(err) {
+			.catch(function (err) {
 				var status = module.hot.status();
 				if (["abort", "fail"].indexOf(status) >= 0) {
 					log(
 						"warning",
 						"[HMR] Cannot check for update. Need to do a full reload!"
 					);
-					log("warning", "[HMR] " + (err.stack || err.message));
+					log("warning", "[HMR] " + log.formatError(err));
 				} else {
-					log(
-						"warning",
-						"[HMR] Update check failed: " + (err.stack || err.message)
-					);
+					log("warning", "[HMR] Update check failed: " + log.formatError(err));
 				}
 			});
 	};
 	var hotEmitter = require("./emitter");
-	hotEmitter.on("webpackHotUpdate", function(currentHash) {
+	hotEmitter.on("webpackHotUpdate", function (currentHash) {
 		lastHash = currentHash;
 		if (!upToDate()) {
 			var status = module.hot.status();
diff --git a/hot/poll.js b/hot/poll.js
index 8193db01f5c..b87c2525944 100644
--- a/hot/poll.js
+++ b/hot/poll.js
@@ -2,16 +2,19 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
-/*globals __resourceQuery */
+/* globals __resourceQuery */
 if (module.hot) {
-	var hotPollInterval = +__resourceQuery.substr(1) || 10 * 60 * 1000;
+	var hotPollInterval = +__resourceQuery.slice(1) || 10 * 60 * 1000;
 	var log = require("./log");
 
+	/**
+	 * @param {boolean=} fromUpdate true when called from update
+	 */
 	var checkForUpdate = function checkForUpdate(fromUpdate) {
 		if (module.hot.status() === "idle") {
 			module.hot
 				.check(true)
-				.then(function(updatedModules) {
+				.then(function (updatedModules) {
 					if (!updatedModules) {
 						if (fromUpdate) log("info", "[HMR] Update applied.");
 						return;
@@ -19,17 +22,14 @@ if (module.hot) {
 					require("./log-apply-result")(updatedModules, updatedModules);
 					checkForUpdate(true);
 				})
-				.catch(function(err) {
+				.catch(function (err) {
 					var status = module.hot.status();
 					if (["abort", "fail"].indexOf(status) >= 0) {
 						log("warning", "[HMR] Cannot apply update.");
-						log("warning", "[HMR] " + (err.stack || err.message));
+						log("warning", "[HMR] " + log.formatError(err));
 						log("warning", "[HMR] You need to restart the application!");
 					} else {
-						log(
-							"warning",
-							"[HMR] Update failed: " + (err.stack || err.message)
-						);
+						log("warning", "[HMR] Update failed: " + log.formatError(err));
 					}
 				});
 		}
diff --git a/hot/signal.js b/hot/signal.js
index 24c4f5cb337..36a0cbe38c7 100644
--- a/hot/signal.js
+++ b/hot/signal.js
@@ -2,13 +2,17 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
-/*globals __resourceQuery */
+/* globals __resourceQuery */
 if (module.hot) {
 	var log = require("./log");
+
+	/**
+	 * @param {boolean=} fromUpdate true when called from update
+	 */
 	var checkForUpdate = function checkForUpdate(fromUpdate) {
 		module.hot
 			.check()
-			.then(function(updatedModules) {
+			.then(function (updatedModules) {
 				if (!updatedModules) {
 					if (fromUpdate) log("info", "[HMR] Update applied.");
 					else log("warning", "[HMR] Cannot find update.");
@@ -18,7 +22,7 @@ if (module.hot) {
 				return module.hot
 					.apply({
 						ignoreUnaccepted: true,
-						onUnaccepted: function(data) {
+						onUnaccepted: function (data) {
 							log(
 								"warning",
 								"Ignored an update to unaccepted module " +
@@ -26,18 +30,18 @@ if (module.hot) {
 							);
 						}
 					})
-					.then(function(renewedModules) {
+					.then(function (renewedModules) {
 						require("./log-apply-result")(updatedModules, renewedModules);
 
 						checkForUpdate(true);
 						return null;
 					});
 			})
-			.catch(function(err) {
+			.catch(function (err) {
 				var status = module.hot.status();
 				if (["abort", "fail"].indexOf(status) >= 0) {
 					log("warning", "[HMR] Cannot apply update.");
-					log("warning", "[HMR] " + (err.stack || err.message));
+					log("warning", "[HMR] " + log.formatError(err));
 					log("warning", "[HMR] You need to restart the application!");
 				} else {
 					log("warning", "[HMR] Update failed: " + (err.stack || err.message));
@@ -45,7 +49,7 @@ if (module.hot) {
 			});
 	};
 
-	process.on(__resourceQuery.substr(1) || "SIGUSR2", function() {
+	process.on(__resourceQuery.slice(1) || "SIGUSR2", function () {
 		if (module.hot.status() !== "idle") {
 			log(
 				"warning",
diff --git a/jest.config.js b/jest.config.js
new file mode 100644
index 00000000000..2cc6d151b2e
--- /dev/null
+++ b/jest.config.js
@@ -0,0 +1,54 @@
+/** @type {import('jest').Config} */
+const config = {
+	prettierPath: require.resolve("prettier-2"),
+	forceExit: true,
+	setupFilesAfterEnv: ["/test/setupTestFramework.js"],
+	testMatch: [
+		"/test/*.test.js",
+		"/test/*.basictest.js",
+		"/test/*.longtest.js",
+		"/test/*.unittest.js"
+	],
+	watchPathIgnorePatterns: [
+		"/.git",
+		"/node_modules",
+		"/test/js",
+		"/test/browsertest/js",
+		"/test/fixtures/temp-cache-fixture",
+		"/test/fixtures/temp-",
+		"/benchmark",
+		"/assembly",
+		"/tooling",
+		"/examples/*/dist",
+		"/coverage",
+		"/.eslintcache"
+	],
+	modulePathIgnorePatterns: [
+		"/.git",
+		"/node_modules/webpack/node_modules",
+		"/test/js",
+		"/test/browsertest/js",
+		"/test/fixtures/temp-cache-fixture",
+		"/test/fixtures/temp-",
+		"/benchmark",
+		"/examples/*/dist",
+		"/coverage",
+		"/.eslintcache"
+	],
+	transformIgnorePatterns: [""],
+	coverageDirectory: "/coverage",
+	coveragePathIgnorePatterns: [
+		"\\.runtime\\.js$",
+		"/test",
+		"/schemas",
+		"/node_modules"
+	],
+	testEnvironment: "./test/patch-node-env.js",
+	coverageReporters: ["json"],
+	snapshotFormat: {
+		escapeString: true,
+		printBasicPrototype: true
+	}
+};
+
+module.exports = config;
diff --git a/lib/APIPlugin.js b/lib/APIPlugin.js
index 6cd80646dcd..9305f6f3fe0 100644
--- a/lib/APIPlugin.js
+++ b/lib/APIPlugin.js
@@ -2,80 +2,320 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const InitFragment = require("./InitFragment");
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_DYNAMIC,
+	JAVASCRIPT_MODULE_TYPE_ESM
+} = require("./ModuleTypeConstants");
+const RuntimeGlobals = require("./RuntimeGlobals");
+const WebpackError = require("./WebpackError");
 const ConstDependency = require("./dependencies/ConstDependency");
-const ParserHelpers = require("./ParserHelpers");
-
-const NullFactory = require("./NullFactory");
-
-/* eslint-disable camelcase */
-const REPLACEMENTS = {
-	__webpack_require__: "__webpack_require__",
-	__webpack_public_path__: "__webpack_require__.p",
-	__webpack_modules__: "__webpack_require__.m",
-	__webpack_chunk_load__: "__webpack_require__.e",
-	__non_webpack_require__: "require",
-	__webpack_nonce__: "__webpack_require__.nc",
-	"require.onError": "__webpack_require__.oe"
-};
-const NO_WEBPACK_REQUIRE = {
-	__non_webpack_require__: true
-};
-const REPLACEMENT_TYPES = {
-	__webpack_public_path__: "string",
-	__webpack_require__: "function",
-	__webpack_modules__: "object",
-	__webpack_chunk_load__: "function",
-	__webpack_nonce__: "string"
-};
-/* eslint-enable camelcase */
+const BasicEvaluatedExpression = require("./javascript/BasicEvaluatedExpression");
+const JavascriptModulesPlugin = require("./javascript/JavascriptModulesPlugin");
+const {
+	toConstantDependency,
+	evaluateToString
+} = require("./javascript/JavascriptParserHelpers");
+const ChunkNameRuntimeModule = require("./runtime/ChunkNameRuntimeModule");
+const GetFullHashRuntimeModule = require("./runtime/GetFullHashRuntimeModule");
+
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("./Module").BuildInfo} BuildInfo */
+/** @typedef {import("./javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("./javascript/JavascriptParser").Range} Range */
+
+/**
+ * @param {boolean | undefined} module true if ES module
+ * @param {string} importMetaName `import.meta` name
+ * @returns {Record} replacements
+ */
+function getReplacements(module, importMetaName) {
+	return {
+		__webpack_require__: {
+			expr: RuntimeGlobals.require,
+			req: [RuntimeGlobals.require],
+			type: "function",
+			assign: false
+		},
+		__webpack_public_path__: {
+			expr: RuntimeGlobals.publicPath,
+			req: [RuntimeGlobals.publicPath],
+			type: "string",
+			assign: true
+		},
+		__webpack_base_uri__: {
+			expr: RuntimeGlobals.baseURI,
+			req: [RuntimeGlobals.baseURI],
+			type: "string",
+			assign: true
+		},
+		__webpack_modules__: {
+			expr: RuntimeGlobals.moduleFactories,
+			req: [RuntimeGlobals.moduleFactories],
+			type: "object",
+			assign: false
+		},
+		__webpack_chunk_load__: {
+			expr: RuntimeGlobals.ensureChunk,
+			req: [RuntimeGlobals.ensureChunk],
+			type: "function",
+			assign: true
+		},
+		__non_webpack_require__: {
+			expr: module
+				? `__WEBPACK_EXTERNAL_createRequire(${importMetaName}.url)`
+				: "require",
+			req: null,
+			type: undefined, // type is not known, depends on environment
+			assign: true
+		},
+		__webpack_nonce__: {
+			expr: RuntimeGlobals.scriptNonce,
+			req: [RuntimeGlobals.scriptNonce],
+			type: "string",
+			assign: true
+		},
+		__webpack_hash__: {
+			expr: `${RuntimeGlobals.getFullHash}()`,
+			req: [RuntimeGlobals.getFullHash],
+			type: "string",
+			assign: false
+		},
+		__webpack_chunkname__: {
+			expr: RuntimeGlobals.chunkName,
+			req: [RuntimeGlobals.chunkName],
+			type: "string",
+			assign: false
+		},
+		__webpack_get_script_filename__: {
+			expr: RuntimeGlobals.getChunkScriptFilename,
+			req: [RuntimeGlobals.getChunkScriptFilename],
+			type: "function",
+			assign: true
+		},
+		__webpack_runtime_id__: {
+			expr: RuntimeGlobals.runtimeId,
+			req: [RuntimeGlobals.runtimeId],
+			assign: false
+		},
+		"require.onError": {
+			expr: RuntimeGlobals.uncaughtErrorHandler,
+			req: [RuntimeGlobals.uncaughtErrorHandler],
+			type: undefined, // type is not known, could be function or undefined
+			assign: true // is never a pattern
+		},
+		__system_context__: {
+			expr: RuntimeGlobals.systemContext,
+			req: [RuntimeGlobals.systemContext],
+			type: "object",
+			assign: false
+		},
+		__webpack_share_scopes__: {
+			expr: RuntimeGlobals.shareScopeMap,
+			req: [RuntimeGlobals.shareScopeMap],
+			type: "object",
+			assign: false
+		},
+		__webpack_init_sharing__: {
+			expr: RuntimeGlobals.initializeSharing,
+			req: [RuntimeGlobals.initializeSharing],
+			type: "function",
+			assign: true
+		}
+	};
+}
+
+const PLUGIN_NAME = "APIPlugin";
+
+/**
+ * @typedef {object} APIPluginOptions
+ * @property {boolean=} module the output filename
+ */
 
 class APIPlugin {
+	/**
+	 * @param {APIPluginOptions=} options options
+	 */
+	constructor(options = {}) {
+		this.options = options;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		compiler.hooks.compilation.tap(
-			"APIPlugin",
+			PLUGIN_NAME,
 			(compilation, { normalModuleFactory }) => {
-				compilation.dependencyFactories.set(ConstDependency, new NullFactory());
+				const importMetaName = /** @type {string} */ (
+					compilation.outputOptions.importMetaName
+				);
+				const REPLACEMENTS = getReplacements(
+					this.options.module,
+					importMetaName
+				);
+
 				compilation.dependencyTemplates.set(
 					ConstDependency,
 					new ConstDependency.Template()
 				);
 
+				compilation.hooks.runtimeRequirementInTree
+					.for(RuntimeGlobals.chunkName)
+					.tap(PLUGIN_NAME, chunk => {
+						compilation.addRuntimeModule(
+							chunk,
+							new ChunkNameRuntimeModule(/** @type {string} */ (chunk.name))
+						);
+						return true;
+					});
+
+				compilation.hooks.runtimeRequirementInTree
+					.for(RuntimeGlobals.getFullHash)
+					.tap(PLUGIN_NAME, (chunk, set) => {
+						compilation.addRuntimeModule(chunk, new GetFullHashRuntimeModule());
+						return true;
+					});
+
+				const hooks = JavascriptModulesPlugin.getCompilationHooks(compilation);
+
+				hooks.renderModuleContent.tap(
+					PLUGIN_NAME,
+					(source, module, renderContext) => {
+						if (/** @type {BuildInfo} */ (module.buildInfo).needCreateRequire) {
+							const needPrefix =
+								renderContext.runtimeTemplate.supportNodePrefixForCoreModules();
+							const chunkInitFragments = [
+								new InitFragment(
+									`import { createRequire as __WEBPACK_EXTERNAL_createRequire } from "${
+										needPrefix ? "node:" : ""
+									}module";\n`,
+									InitFragment.STAGE_HARMONY_IMPORTS,
+									0,
+									"external module node-commonjs"
+								)
+							];
+
+							renderContext.chunkInitFragments.push(...chunkInitFragments);
+						}
+
+						return source;
+					}
+				);
+
+				/**
+				 * @param {JavascriptParser} parser the parser
+				 */
 				const handler = parser => {
-					Object.keys(REPLACEMENTS).forEach(key => {
-						parser.hooks.expression
-							.for(key)
-							.tap(
-								"APIPlugin",
-								NO_WEBPACK_REQUIRE[key]
-									? ParserHelpers.toConstantDependency(
-											parser,
-											REPLACEMENTS[key]
-									  )
-									: ParserHelpers.toConstantDependencyWithWebpackRequire(
-											parser,
-											REPLACEMENTS[key]
-									  )
+					for (const key of Object.keys(REPLACEMENTS)) {
+						const info = REPLACEMENTS[key];
+						parser.hooks.expression.for(key).tap(PLUGIN_NAME, expression => {
+							const dep = toConstantDependency(parser, info.expr, info.req);
+
+							if (key === "__non_webpack_require__" && this.options.module) {
+								/** @type {BuildInfo} */
+								(parser.state.module.buildInfo).needCreateRequire = true;
+							}
+
+							return dep(expression);
+						});
+						if (info.assign === false) {
+							parser.hooks.assign.for(key).tap(PLUGIN_NAME, expr => {
+								const err = new WebpackError(`${key} must not be assigned`);
+								err.loc = /** @type {DependencyLocation} */ (expr.loc);
+								throw err;
+							});
+						}
+						if (info.type) {
+							parser.hooks.evaluateTypeof
+								.for(key)
+								.tap(PLUGIN_NAME, evaluateToString(info.type));
+						}
+					}
+
+					parser.hooks.expression
+						.for("__webpack_layer__")
+						.tap(PLUGIN_NAME, expr => {
+							const dep = new ConstDependency(
+								JSON.stringify(parser.state.module.layer),
+								/** @type {Range} */ (expr.range)
+							);
+							dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+							parser.state.module.addPresentationalDependency(dep);
+							return true;
+						});
+					parser.hooks.evaluateIdentifier
+						.for("__webpack_layer__")
+						.tap(PLUGIN_NAME, expr =>
+							(parser.state.module.layer === null
+								? new BasicEvaluatedExpression().setNull()
+								: new BasicEvaluatedExpression().setString(
+										parser.state.module.layer
+									)
+							).setRange(/** @type {Range} */ (expr.range))
+						);
+					parser.hooks.evaluateTypeof
+						.for("__webpack_layer__")
+						.tap(PLUGIN_NAME, expr =>
+							new BasicEvaluatedExpression()
+								.setString(
+									parser.state.module.layer === null ? "object" : "string"
+								)
+								.setRange(/** @type {Range} */ (expr.range))
+						);
+
+					parser.hooks.expression
+						.for("__webpack_module__.id")
+						.tap(PLUGIN_NAME, expr => {
+							/** @type {BuildInfo} */
+							(parser.state.module.buildInfo).moduleConcatenationBailout =
+								"__webpack_module__.id";
+							const dep = new ConstDependency(
+								`${parser.state.module.moduleArgument}.id`,
+								/** @type {Range} */ (expr.range),
+								[RuntimeGlobals.moduleId]
 							);
-						parser.hooks.evaluateTypeof
-							.for(key)
-							.tap(
-								"APIPlugin",
-								ParserHelpers.evaluateToString(REPLACEMENT_TYPES[key])
+							dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+							parser.state.module.addPresentationalDependency(dep);
+							return true;
+						});
+
+					parser.hooks.expression
+						.for("__webpack_module__")
+						.tap(PLUGIN_NAME, expr => {
+							/** @type {BuildInfo} */
+							(parser.state.module.buildInfo).moduleConcatenationBailout =
+								"__webpack_module__";
+							const dep = new ConstDependency(
+								parser.state.module.moduleArgument,
+								/** @type {Range} */ (expr.range),
+								[RuntimeGlobals.module]
 							);
-					});
+							dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+							parser.state.module.addPresentationalDependency(dep);
+							return true;
+						});
+					parser.hooks.evaluateTypeof
+						.for("__webpack_module__")
+						.tap(PLUGIN_NAME, evaluateToString("object"));
 				};
 
 				normalModuleFactory.hooks.parser
-					.for("javascript/auto")
-					.tap("APIPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, handler);
 				normalModuleFactory.hooks.parser
-					.for("javascript/dynamic")
-					.tap("APIPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
+					.tap(PLUGIN_NAME, handler);
 				normalModuleFactory.hooks.parser
-					.for("javascript/esm")
-					.tap("APIPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_ESM)
+					.tap(PLUGIN_NAME, handler);
 			}
 		);
 	}
diff --git a/lib/AbstractMethodError.js b/lib/AbstractMethodError.js
new file mode 100644
index 00000000000..7a9d2f992b4
--- /dev/null
+++ b/lib/AbstractMethodError.js
@@ -0,0 +1,54 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const WebpackError = require("./WebpackError");
+const CURRENT_METHOD_REGEXP = /at ([a-zA-Z0-9_.]*)/;
+
+/**
+ * @param {string=} method method name
+ * @returns {string} message
+ */
+function createMessage(method) {
+	return `Abstract method${method ? ` ${method}` : ""}. Must be overridden.`;
+}
+
+/**
+ * @constructor
+ */
+function Message() {
+	/** @type {string | undefined} */
+	this.stack = undefined;
+	Error.captureStackTrace(this);
+	/** @type {RegExpMatchArray | null} */
+	const match =
+		/** @type {string} */
+		(/** @type {unknown} */ (this.stack))
+			.split("\n")[3]
+			.match(CURRENT_METHOD_REGEXP);
+
+	this.message = match && match[1] ? createMessage(match[1]) : createMessage();
+}
+
+/**
+ * Error for abstract method
+ * @example
+ * ```js
+ * class FooClass {
+ *     abstractMethod() {
+ *         throw new AbstractMethodError(); // error message: Abstract method FooClass.abstractMethod. Must be overridden.
+ *     }
+ * }
+ * ```
+ */
+class AbstractMethodError extends WebpackError {
+	constructor() {
+		super(new Message().message);
+		this.name = "AbstractMethodError";
+	}
+}
+
+module.exports = AbstractMethodError;
diff --git a/lib/AmdMainTemplatePlugin.js b/lib/AmdMainTemplatePlugin.js
deleted file mode 100644
index 5e2c0bd7df0..00000000000
--- a/lib/AmdMainTemplatePlugin.js
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
-
-"use strict";
-
-const { ConcatSource } = require("webpack-sources");
-const Template = require("./Template");
-
-/** @typedef {import("./Compilation")} Compilation */
-
-/**
- * @typedef {Object} AmdMainTemplatePluginOptions
- * @param {string=} name the library name
- * @property {boolean=} requireAsWrapper
- */
-
-class AmdMainTemplatePlugin {
-	/**
-	 * @param {AmdMainTemplatePluginOptions} options the plugin options
-	 */
-	constructor(options) {
-		if (!options || typeof options === "string") {
-			this.name = options;
-			this.requireAsWrapper = false;
-		} else {
-			this.name = options.name;
-			this.requireAsWrapper = options.requireAsWrapper;
-		}
-	}
-
-	/**
-	 * @param {Compilation} compilation the compilation instance
-	 * @returns {void}
-	 */
-	apply(compilation) {
-		const { mainTemplate, chunkTemplate } = compilation;
-
-		const onRenderWithEntry = (source, chunk, hash) => {
-			const externals = chunk.getModules().filter(m => m.external);
-			const externalsDepsArray = JSON.stringify(
-				externals.map(
-					m => (typeof m.request === "object" ? m.request.amd : m.request)
-				)
-			);
-			const externalsArguments = externals
-				.map(
-					m => `__WEBPACK_EXTERNAL_MODULE_${Template.toIdentifier(`${m.id}`)}__`
-				)
-				.join(", ");
-
-			if (this.requireAsWrapper) {
-				return new ConcatSource(
-					`require(${externalsDepsArray}, function(${externalsArguments}) { return `,
-					source,
-					"});"
-				);
-			} else if (this.name) {
-				const name = mainTemplate.getAssetPath(this.name, {
-					hash,
-					chunk
-				});
-
-				return new ConcatSource(
-					`define(${JSON.stringify(
-						name
-					)}, ${externalsDepsArray}, function(${externalsArguments}) { return `,
-					source,
-					"});"
-				);
-			} else if (externalsArguments) {
-				return new ConcatSource(
-					`define(${externalsDepsArray}, function(${externalsArguments}) { return `,
-					source,
-					"});"
-				);
-			} else {
-				return new ConcatSource("define(function() { return ", source, "});");
-			}
-		};
-
-		for (const template of [mainTemplate, chunkTemplate]) {
-			template.hooks.renderWithEntry.tap(
-				"AmdMainTemplatePlugin",
-				onRenderWithEntry
-			);
-		}
-
-		mainTemplate.hooks.globalHashPaths.tap("AmdMainTemplatePlugin", paths => {
-			if (this.name) {
-				paths.push(this.name);
-			}
-			return paths;
-		});
-
-		mainTemplate.hooks.hash.tap("AmdMainTemplatePlugin", hash => {
-			hash.update("exports amd");
-			if (this.name) {
-				hash.update(this.name);
-			}
-		});
-	}
-}
-
-module.exports = AmdMainTemplatePlugin;
diff --git a/lib/AsyncDependenciesBlock.js b/lib/AsyncDependenciesBlock.js
index a7e029131fd..2b66dc29a08 100644
--- a/lib/AsyncDependenciesBlock.js
+++ b/lib/AsyncDependenciesBlock.js
@@ -2,24 +2,32 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const DependenciesBlock = require("./DependenciesBlock");
+const makeSerializable = require("./util/makeSerializable");
 
+/** @typedef {import("./ChunkGraph")} ChunkGraph */
 /** @typedef {import("./ChunkGroup")} ChunkGroup */
-/** @typedef {import("./Module")} Module */
+/** @typedef {import("./ChunkGroup").ChunkGroupOptions} ChunkGroupOptions */
 /** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
-/** @typedef {import("./util/createHash").Hash} Hash */
-/** @typedef {TODO} GroupOptions */
+/** @typedef {import("./Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("./Entrypoint").EntryOptions} EntryOptions */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("./util/Hash")} Hash */
 
-module.exports = class AsyncDependenciesBlock extends DependenciesBlock {
+/** @typedef {(ChunkGroupOptions & { entryOptions?: EntryOptions }) | string} GroupOptions */
+
+class AsyncDependenciesBlock extends DependenciesBlock {
 	/**
-	 * @param {GroupOptions} groupOptions options for the group
-	 * @param {Module} module the Module object
-	 * @param {DependencyLocation=} loc the line of code
-	 * @param {TODO=} request the request
+	 * @param {GroupOptions | null} groupOptions options for the group
+	 * @param {(DependencyLocation | null)=} loc the line of code
+	 * @param {(string | null)=} request the request
 	 */
-	constructor(groupOptions, module, loc, request) {
+	constructor(groupOptions, loc, request) {
 		super();
 		if (typeof groupOptions === "string") {
 			groupOptions = { name: groupOptions };
@@ -27,84 +35,82 @@ module.exports = class AsyncDependenciesBlock extends DependenciesBlock {
 			groupOptions = { name: undefined };
 		}
 		this.groupOptions = groupOptions;
-		/** @type {ChunkGroup=} */
-		this.chunkGroup = undefined;
-		this.module = module;
 		this.loc = loc;
 		this.request = request;
-		/** @type {DependenciesBlock} */
-		this.parent = undefined;
+		this._stringifiedGroupOptions = undefined;
 	}
 
 	/**
-	 * @returns {string} The name of the chunk
+	 * @returns {string | null | undefined} The name of the chunk
 	 */
 	get chunkName() {
 		return this.groupOptions.name;
 	}
 
 	/**
-	 * @param {string} value The new chunk name
+	 * @param {string | undefined} value The new chunk name
 	 * @returns {void}
 	 */
 	set chunkName(value) {
-		this.groupOptions.name = value;
-	}
-
-	/**
-	 * @returns {never} this throws and should never be called
-	 */
-	get chunks() {
-		throw new Error("Moved to AsyncDependenciesBlock.chunkGroup");
-	}
-
-	/**
-	 * @param {never} value setter value
-	 * @returns {never} this is going to throw therefore we should throw type
-	 * assertions by returning never
-	 */
-	set chunks(value) {
-		throw new Error("Moved to AsyncDependenciesBlock.chunkGroup");
+		if (this.groupOptions.name !== value) {
+			this.groupOptions.name = value;
+			this._stringifiedGroupOptions = undefined;
+		}
 	}
 
 	/**
-	 * @param {Hash} hash the hash used to track block changes, from "crypto" module
+	 * @param {Hash} hash the hash used to track dependencies
+	 * @param {UpdateHashContext} context context
 	 * @returns {void}
 	 */
-	updateHash(hash) {
-		hash.update(JSON.stringify(this.groupOptions));
+	updateHash(hash, context) {
+		const { chunkGraph } = context;
+		if (this._stringifiedGroupOptions === undefined) {
+			this._stringifiedGroupOptions = JSON.stringify(this.groupOptions);
+		}
+		const chunkGroup = chunkGraph.getBlockChunkGroup(this);
 		hash.update(
-			(this.chunkGroup &&
-				this.chunkGroup.chunks
-					.map(chunk => {
-						return chunk.id !== null ? chunk.id : "";
-					})
-					.join(",")) ||
-				""
+			`${this._stringifiedGroupOptions}${chunkGroup ? chunkGroup.id : ""}`
 		);
-		super.updateHash(hash);
+		super.updateHash(hash, context);
 	}
 
 	/**
-	 * @returns {void}
+	 * @param {ObjectSerializerContext} context context
 	 */
-	disconnect() {
-		this.chunkGroup = undefined;
-		super.disconnect();
+	serialize(context) {
+		const { write } = context;
+		write(this.groupOptions);
+		write(this.loc);
+		write(this.request);
+		super.serialize(context);
 	}
 
 	/**
-	 * @returns {void}
+	 * @param {ObjectDeserializerContext} context context
 	 */
-	unseal() {
-		this.chunkGroup = undefined;
-		super.unseal();
+	deserialize(context) {
+		const { read } = context;
+		this.groupOptions = read();
+		this.loc = read();
+		this.request = read();
+		super.deserialize(context);
 	}
+}
 
-	/**
-	 * @returns {void}
-	 */
-	sortItems() {
-		super.sortItems();
+makeSerializable(AsyncDependenciesBlock, "webpack/lib/AsyncDependenciesBlock");
+
+Object.defineProperty(AsyncDependenciesBlock.prototype, "module", {
+	get() {
+		throw new Error(
+			"module property was removed from AsyncDependenciesBlock (it's not needed)"
+		);
+	},
+	set() {
+		throw new Error(
+			"module property was removed from AsyncDependenciesBlock (it's not needed)"
+		);
 	}
-};
+});
+
+module.exports = AsyncDependenciesBlock;
diff --git a/lib/AsyncDependencyToInitialChunkError.js b/lib/AsyncDependencyToInitialChunkError.js
index a0631aa3d50..75888f869a3 100644
--- a/lib/AsyncDependencyToInitialChunkError.js
+++ b/lib/AsyncDependencyToInitialChunkError.js
@@ -2,10 +2,12 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Sean Larkin @thelarkinn
 */
+
 "use strict";
 
 const WebpackError = require("./WebpackError");
 
+/** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
 /** @typedef {import("./Module")} Module */
 
 class AsyncDependencyToInitialChunkError extends WebpackError {
@@ -13,7 +15,7 @@ class AsyncDependencyToInitialChunkError extends WebpackError {
 	 * Creates an instance of AsyncDependencyToInitialChunkError.
 	 * @param {string} chunkName Name of Chunk
 	 * @param {Module} module module tied to dependency
-	 * @param {TODO} loc location of dependency
+	 * @param {DependencyLocation} loc location of dependency
 	 */
 	constructor(chunkName, module, loc) {
 		super(
@@ -23,8 +25,6 @@ class AsyncDependencyToInitialChunkError extends WebpackError {
 		this.name = "AsyncDependencyToInitialChunkError";
 		this.module = module;
 		this.loc = loc;
-
-		Error.captureStackTrace(this, this.constructor);
 	}
 }
 
diff --git a/lib/AutomaticPrefetchPlugin.js b/lib/AutomaticPrefetchPlugin.js
index 2d0db16ecdb..05eb99b5ad4 100644
--- a/lib/AutomaticPrefetchPlugin.js
+++ b/lib/AutomaticPrefetchPlugin.js
@@ -2,23 +2,26 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const asyncLib = require("neo-async");
-const PrefetchDependency = require("./dependencies/PrefetchDependency");
 const NormalModule = require("./NormalModule");
+const PrefetchDependency = require("./dependencies/PrefetchDependency");
 
 /** @typedef {import("./Compiler")} Compiler */
 
+const PLUGIN_NAME = "AutomaticPrefetchPlugin";
+
 class AutomaticPrefetchPlugin {
 	/**
 	 * Apply the plugin
-	 * @param {Compiler} compiler Webpack Compiler
+	 * @param {Compiler} compiler the compiler instance
 	 * @returns {void}
 	 */
 	apply(compiler) {
 		compiler.hooks.compilation.tap(
-			"AutomaticPrefetchPlugin",
+			PLUGIN_NAME,
 			(compilation, { normalModuleFactory }) => {
 				compilation.dependencyFactories.set(
 					PrefetchDependency,
@@ -26,32 +29,37 @@ class AutomaticPrefetchPlugin {
 				);
 			}
 		);
+		/** @type {{context: string | null, request: string}[] | null} */
 		let lastModules = null;
-		compiler.hooks.afterCompile.tap("AutomaticPrefetchPlugin", compilation => {
-			lastModules = compilation.modules
-				.filter(m => m instanceof NormalModule)
-				.map((/** @type {NormalModule} */ m) => ({
-					context: m.context,
-					request: m.request
-				}));
-		});
-		compiler.hooks.make.tapAsync(
-			"AutomaticPrefetchPlugin",
-			(compilation, callback) => {
-				if (!lastModules) return callback();
-				asyncLib.forEach(
-					lastModules,
-					(m, callback) => {
-						compilation.prefetch(
-							m.context || compiler.context,
-							new PrefetchDependency(m.request),
-							callback
-						);
-					},
-					callback
-				);
+		compiler.hooks.afterCompile.tap(PLUGIN_NAME, compilation => {
+			lastModules = [];
+
+			for (const m of compilation.modules) {
+				if (m instanceof NormalModule) {
+					lastModules.push({
+						context: m.context,
+						request: m.request
+					});
+				}
 			}
-		);
+		});
+		compiler.hooks.make.tapAsync(PLUGIN_NAME, (compilation, callback) => {
+			if (!lastModules) return callback();
+			asyncLib.each(
+				lastModules,
+				(m, callback) => {
+					compilation.addModuleChain(
+						m.context || compiler.context,
+						new PrefetchDependency(`!!${m.request}`),
+						callback
+					);
+				},
+				err => {
+					lastModules = null;
+					callback(err);
+				}
+			);
+		});
 	}
 }
 module.exports = AutomaticPrefetchPlugin;
diff --git a/lib/BannerPlugin.js b/lib/BannerPlugin.js
index 80c66a5ac11..4409c8b8ec0 100644
--- a/lib/BannerPlugin.js
+++ b/lib/BannerPlugin.js
@@ -1,20 +1,37 @@
 /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
 
 "use strict";
 
 const { ConcatSource } = require("webpack-sources");
+const Compilation = require("./Compilation");
 const ModuleFilenameHelpers = require("./ModuleFilenameHelpers");
 const Template = require("./Template");
+const createSchemaValidation = require("./util/create-schema-validation");
 
-const validateOptions = require("schema-utils");
-const schema = require("../schemas/plugins/BannerPlugin.json");
-
+/** @typedef {import("../declarations/plugins/BannerPlugin").BannerFunction} BannerFunction */
 /** @typedef {import("../declarations/plugins/BannerPlugin").BannerPluginArgument} BannerPluginArgument */
 /** @typedef {import("../declarations/plugins/BannerPlugin").BannerPluginOptions} BannerPluginOptions */
+/** @typedef {import("./Compilation").PathData} PathData */
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./TemplatedPathPlugin").TemplatePath} TemplatePath */
+
+const validate = createSchemaValidation(
+	/** @type {((value: typeof import("../schemas/plugins/BannerPlugin.json")) => boolean)} */
+	(require("../schemas/plugins/BannerPlugin.check.js")),
+	() => require("../schemas/plugins/BannerPlugin.json"),
+	{
+		name: "Banner Plugin",
+		baseDataPath: "options"
+	}
+);
 
+/**
+ * @param {string} str string to wrap
+ * @returns {string} wrapped string
+ */
 const wrapComment = str => {
 	if (!str.includes("\n")) {
 		return Template.toComment(str);
@@ -22,45 +39,49 @@ const wrapComment = str => {
 	return `/*!\n * ${str
 		.replace(/\*\//g, "* /")
 		.split("\n")
-		.join("\n * ")}\n */`;
+		.join("\n * ")
+		.replace(/\s+\n/g, "\n")
+		.trimEnd()}\n */`;
 };
 
+const PLUGIN_NAME = "BannerPlugin";
+
 class BannerPlugin {
 	/**
 	 * @param {BannerPluginArgument} options options object
 	 */
 	constructor(options) {
-		if (arguments.length > 1) {
-			throw new Error(
-				"BannerPlugin only takes one argument (pass an options object)"
-			);
-		}
-
-		validateOptions(schema, options, "Banner Plugin");
-
 		if (typeof options === "string" || typeof options === "function") {
 			options = {
 				banner: options
 			};
 		}
 
-		/** @type {BannerPluginOptions} */
+		validate(options);
+
 		this.options = options;
 
 		const bannerOption = options.banner;
 		if (typeof bannerOption === "function") {
 			const getBanner = bannerOption;
+			/** @type {BannerFunction} */
 			this.banner = this.options.raw
 				? getBanner
-				: data => wrapComment(getBanner(data));
+				: /** @type {BannerFunction} */ data => wrapComment(getBanner(data));
 		} else {
 			const banner = this.options.raw
 				? bannerOption
 				: wrapComment(bannerOption);
+			/** @type {BannerFunction} */
 			this.banner = () => banner;
 		}
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		const options = this.options;
 		const banner = this.banner;
@@ -68,10 +89,13 @@ class BannerPlugin {
 			undefined,
 			options
 		);
+		const cache = new WeakMap();
+		const stage =
+			this.options.stage || Compilation.PROCESS_ASSETS_STAGE_ADDITIONS;
 
-		compiler.hooks.compilation.tap("BannerPlugin", compilation => {
-			compilation.hooks.optimizeChunkAssets.tap("BannerPlugin", chunks => {
-				for (const chunk of chunks) {
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			compilation.hooks.processAssets.tap({ name: PLUGIN_NAME, stage }, () => {
+				for (const chunk of compilation.chunks) {
 					if (options.entryOnly && !chunk.canBeInitial()) {
 						continue;
 					}
@@ -81,40 +105,26 @@ class BannerPlugin {
 							continue;
 						}
 
-						let basename;
-						let query = "";
-						let filename = file;
-						const hash = compilation.hash;
-						const querySplit = filename.indexOf("?");
-
-						if (querySplit >= 0) {
-							query = filename.substr(querySplit);
-							filename = filename.substr(0, querySplit);
-						}
+						/** @type {PathData} */
+						const data = { chunk, filename: file };
 
-						const lastSlashIndex = filename.lastIndexOf("/");
-
-						if (lastSlashIndex === -1) {
-							basename = filename;
-						} else {
-							basename = filename.substr(lastSlashIndex + 1);
-						}
-
-						const data = {
-							hash,
-							chunk,
-							filename,
-							basename,
-							query
-						};
-
-						const comment = compilation.getPath(banner(data), data);
-
-						compilation.assets[file] = new ConcatSource(
-							comment,
-							"\n",
-							compilation.assets[file]
+						const comment = compilation.getPath(
+							/** @type {TemplatePath} */
+							(banner),
+							data
 						);
+
+						compilation.updateAsset(file, old => {
+							const cached = cache.get(old);
+							if (!cached || cached.comment !== comment) {
+								const source = options.footer
+									? new ConcatSource(old, "\n", comment)
+									: new ConcatSource(comment, "\n", old);
+								cache.set(old, { source, comment });
+								return source;
+							}
+							return cached.source;
+						});
 					}
 				}
 			});
diff --git a/lib/BasicEvaluatedExpression.js b/lib/BasicEvaluatedExpression.js
deleted file mode 100644
index a0f7bd435b7..00000000000
--- a/lib/BasicEvaluatedExpression.js
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-
-"use strict";
-
-const TypeUnknown = 0;
-const TypeNull = 1;
-const TypeString = 2;
-const TypeNumber = 3;
-const TypeBoolean = 4;
-const TypeRegExp = 5;
-const TypeConditional = 6;
-const TypeArray = 7;
-const TypeConstArray = 8;
-const TypeIdentifier = 9;
-const TypeWrapped = 10;
-const TypeTemplateString = 11;
-
-class BasicEvaluatedExpression {
-	constructor() {
-		this.type = TypeUnknown;
-		this.range = null;
-		this.falsy = false;
-		this.truthy = false;
-		this.bool = null;
-		this.number = null;
-		this.regExp = null;
-		this.string = null;
-		this.quasis = null;
-		this.parts = null;
-		this.array = null;
-		this.items = null;
-		this.options = null;
-		this.prefix = null;
-		this.postfix = null;
-		this.wrappedInnerExpressions = null;
-		this.expression = null;
-	}
-
-	isNull() {
-		return this.type === TypeNull;
-	}
-
-	isString() {
-		return this.type === TypeString;
-	}
-
-	isNumber() {
-		return this.type === TypeNumber;
-	}
-
-	isBoolean() {
-		return this.type === TypeBoolean;
-	}
-
-	isRegExp() {
-		return this.type === TypeRegExp;
-	}
-
-	isConditional() {
-		return this.type === TypeConditional;
-	}
-
-	isArray() {
-		return this.type === TypeArray;
-	}
-
-	isConstArray() {
-		return this.type === TypeConstArray;
-	}
-
-	isIdentifier() {
-		return this.type === TypeIdentifier;
-	}
-
-	isWrapped() {
-		return this.type === TypeWrapped;
-	}
-
-	isTemplateString() {
-		return this.type === TypeTemplateString;
-	}
-
-	isTruthy() {
-		return this.truthy;
-	}
-
-	isFalsy() {
-		return this.falsy;
-	}
-
-	asBool() {
-		if (this.truthy) return true;
-		if (this.falsy) return false;
-		if (this.isBoolean()) return this.bool;
-		if (this.isNull()) return false;
-		if (this.isString()) return this.string !== "";
-		if (this.isNumber()) return this.number !== 0;
-		if (this.isRegExp()) return true;
-		if (this.isArray()) return true;
-		if (this.isConstArray()) return true;
-		if (this.isWrapped()) {
-			return (this.prefix && this.prefix.asBool()) ||
-				(this.postfix && this.postfix.asBool())
-				? true
-				: undefined;
-		}
-		if (this.isTemplateString()) {
-			const str = this.asString();
-			if (typeof str === "string") return str !== "";
-		}
-		return undefined;
-	}
-
-	asString() {
-		if (this.isBoolean()) return `${this.bool}`;
-		if (this.isNull()) return "null";
-		if (this.isString()) return this.string;
-		if (this.isNumber()) return `${this.number}`;
-		if (this.isRegExp()) return `${this.regExp}`;
-		if (this.isArray()) {
-			let array = [];
-			for (const item of this.items) {
-				const itemStr = item.asString();
-				if (itemStr === undefined) return undefined;
-				array.push(itemStr);
-			}
-			return `${array}`;
-		}
-		if (this.isConstArray()) return `${this.array}`;
-		if (this.isTemplateString()) {
-			let str = "";
-			for (const part of this.parts) {
-				const partStr = part.asString();
-				if (partStr === undefined) return undefined;
-				str += partStr;
-			}
-			return str;
-		}
-		return undefined;
-	}
-
-	setString(string) {
-		this.type = TypeString;
-		this.string = string;
-		return this;
-	}
-
-	setNull() {
-		this.type = TypeNull;
-		return this;
-	}
-
-	setNumber(number) {
-		this.type = TypeNumber;
-		this.number = number;
-		return this;
-	}
-
-	setBoolean(bool) {
-		this.type = TypeBoolean;
-		this.bool = bool;
-		return this;
-	}
-
-	setRegExp(regExp) {
-		this.type = TypeRegExp;
-		this.regExp = regExp;
-		return this;
-	}
-
-	setIdentifier(identifier) {
-		this.type = TypeIdentifier;
-		this.identifier = identifier;
-		return this;
-	}
-
-	setWrapped(prefix, postfix, innerExpressions) {
-		this.type = TypeWrapped;
-		this.prefix = prefix;
-		this.postfix = postfix;
-		this.wrappedInnerExpressions = innerExpressions;
-		return this;
-	}
-
-	setOptions(options) {
-		this.type = TypeConditional;
-		this.options = options;
-		return this;
-	}
-
-	addOptions(options) {
-		if (!this.options) {
-			this.type = TypeConditional;
-			this.options = [];
-		}
-		for (const item of options) {
-			this.options.push(item);
-		}
-		return this;
-	}
-
-	setItems(items) {
-		this.type = TypeArray;
-		this.items = items;
-		return this;
-	}
-
-	setArray(array) {
-		this.type = TypeConstArray;
-		this.array = array;
-		return this;
-	}
-
-	setTemplateString(quasis, parts, kind) {
-		this.type = TypeTemplateString;
-		this.quasis = quasis;
-		this.parts = parts;
-		this.templateStringKind = kind;
-		return this;
-	}
-
-	setTruthy() {
-		this.falsy = false;
-		this.truthy = true;
-		return this;
-	}
-
-	setFalsy() {
-		this.falsy = true;
-		this.truthy = false;
-		return this;
-	}
-
-	setRange(range) {
-		this.range = range;
-		return this;
-	}
-
-	setExpression(expression) {
-		this.expression = expression;
-		return this;
-	}
-}
-
-module.exports = BasicEvaluatedExpression;
diff --git a/lib/Cache.js b/lib/Cache.js
new file mode 100644
index 00000000000..757119c9de5
--- /dev/null
+++ b/lib/Cache.js
@@ -0,0 +1,167 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { AsyncParallelHook, AsyncSeriesBailHook, SyncHook } = require("tapable");
+const {
+	makeWebpackError,
+	makeWebpackErrorCallback
+} = require("./HookWebpackError");
+
+/** @typedef {import("./WebpackError")} WebpackError */
+
+/**
+ * @typedef {object} Etag
+ * @property {() => string} toString
+ */
+
+/**
+ * @template T
+ * @callback CallbackCache
+ * @param {WebpackError | null} err
+ * @param {T=} result
+ * @returns {void}
+ */
+
+/** @typedef {EXPECTED_ANY} Data */
+
+/**
+ * @callback GotHandler
+ * @param {TODO} result
+ * @param {(err?: Error) => void} callback
+ * @returns {void}
+ */
+
+/**
+ * @param {number} times times
+ * @param {(err?: Error) => void} callback callback
+ * @returns {(err?: Error) => void} callback
+ */
+const needCalls = (times, callback) => err => {
+	if (--times === 0) {
+		return callback(err);
+	}
+	if (err && times > 0) {
+		times = 0;
+		return callback(err);
+	}
+};
+
+class Cache {
+	constructor() {
+		this.hooks = {
+			/** @type {AsyncSeriesBailHook<[string, Etag | null, GotHandler[]], Data>} */
+			get: new AsyncSeriesBailHook(["identifier", "etag", "gotHandlers"]),
+			/** @type {AsyncParallelHook<[string, Etag | null, Data]>} */
+			store: new AsyncParallelHook(["identifier", "etag", "data"]),
+			/** @type {AsyncParallelHook<[Iterable]>} */
+			storeBuildDependencies: new AsyncParallelHook(["dependencies"]),
+			/** @type {SyncHook<[]>} */
+			beginIdle: new SyncHook([]),
+			/** @type {AsyncParallelHook<[]>} */
+			endIdle: new AsyncParallelHook([]),
+			/** @type {AsyncParallelHook<[]>} */
+			shutdown: new AsyncParallelHook([])
+		};
+	}
+
+	/**
+	 * @template T
+	 * @param {string} identifier the cache identifier
+	 * @param {Etag | null} etag the etag
+	 * @param {CallbackCache} callback signals when the value is retrieved
+	 * @returns {void}
+	 */
+	get(identifier, etag, callback) {
+		/** @type {GotHandler[]} */
+		const gotHandlers = [];
+		this.hooks.get.callAsync(identifier, etag, gotHandlers, (err, result) => {
+			if (err) {
+				callback(makeWebpackError(err, "Cache.hooks.get"));
+				return;
+			}
+			if (result === null) {
+				result = undefined;
+			}
+			if (gotHandlers.length > 1) {
+				const innerCallback = needCalls(gotHandlers.length, () =>
+					callback(null, result)
+				);
+				for (const gotHandler of gotHandlers) {
+					gotHandler(result, innerCallback);
+				}
+			} else if (gotHandlers.length === 1) {
+				gotHandlers[0](result, () => callback(null, result));
+			} else {
+				callback(null, result);
+			}
+		});
+	}
+
+	/**
+	 * @template T
+	 * @param {string} identifier the cache identifier
+	 * @param {Etag | null} etag the etag
+	 * @param {T} data the value to store
+	 * @param {CallbackCache} callback signals when the value is stored
+	 * @returns {void}
+	 */
+	store(identifier, etag, data, callback) {
+		this.hooks.store.callAsync(
+			identifier,
+			etag,
+			data,
+			makeWebpackErrorCallback(callback, "Cache.hooks.store")
+		);
+	}
+
+	/**
+	 * After this method has succeeded the cache can only be restored when build dependencies are
+	 * @param {Iterable} dependencies list of all build dependencies
+	 * @param {CallbackCache} callback signals when the dependencies are stored
+	 * @returns {void}
+	 */
+	storeBuildDependencies(dependencies, callback) {
+		this.hooks.storeBuildDependencies.callAsync(
+			dependencies,
+			makeWebpackErrorCallback(callback, "Cache.hooks.storeBuildDependencies")
+		);
+	}
+
+	/**
+	 * @returns {void}
+	 */
+	beginIdle() {
+		this.hooks.beginIdle.call();
+	}
+
+	/**
+	 * @param {CallbackCache} callback signals when the call finishes
+	 * @returns {void}
+	 */
+	endIdle(callback) {
+		this.hooks.endIdle.callAsync(
+			makeWebpackErrorCallback(callback, "Cache.hooks.endIdle")
+		);
+	}
+
+	/**
+	 * @param {CallbackCache} callback signals when the call finishes
+	 * @returns {void}
+	 */
+	shutdown(callback) {
+		this.hooks.shutdown.callAsync(
+			makeWebpackErrorCallback(callback, "Cache.hooks.shutdown")
+		);
+	}
+}
+
+Cache.STAGE_MEMORY = -10;
+Cache.STAGE_DEFAULT = 0;
+Cache.STAGE_DISK = 10;
+Cache.STAGE_NETWORK = 20;
+
+module.exports = Cache;
diff --git a/lib/CacheFacade.js b/lib/CacheFacade.js
new file mode 100644
index 00000000000..190de11dc06
--- /dev/null
+++ b/lib/CacheFacade.js
@@ -0,0 +1,350 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { forEachBail } = require("enhanced-resolve");
+const asyncLib = require("neo-async");
+const getLazyHashedEtag = require("./cache/getLazyHashedEtag");
+const mergeEtags = require("./cache/mergeEtags");
+
+/** @typedef {import("./Cache")} Cache */
+/** @typedef {import("./Cache").Etag} Etag */
+/** @typedef {import("./WebpackError")} WebpackError */
+/** @typedef {import("./cache/getLazyHashedEtag").HashableObject} HashableObject */
+/** @typedef {typeof import("./util/Hash")} HashConstructor */
+
+/**
+ * @template T
+ * @callback CallbackCache
+ * @param {(Error | null)=} err
+ * @param {(T | null)=} result
+ * @returns {void}
+ */
+
+/**
+ * @template T
+ * @callback CallbackNormalErrorCache
+ * @param {(Error | null)=} err
+ * @param {T=} result
+ * @returns {void}
+ */
+
+class MultiItemCache {
+	/**
+	 * @param {ItemCacheFacade[]} items item caches
+	 */
+	constructor(items) {
+		this._items = items;
+		// @ts-expect-error expected - returns the single ItemCacheFacade when passed an array of length 1
+		// eslint-disable-next-line no-constructor-return
+		if (items.length === 1) return /** @type {ItemCacheFacade} */ (items[0]);
+	}
+
+	/**
+	 * @template T
+	 * @param {CallbackCache} callback signals when the value is retrieved
+	 * @returns {void}
+	 */
+	get(callback) {
+		forEachBail(this._items, (item, callback) => item.get(callback), callback);
+	}
+
+	/**
+	 * @template T
+	 * @returns {Promise} promise with the data
+	 */
+	getPromise() {
+		/**
+		 * @param {number} i index
+		 * @returns {Promise} promise with the data
+		 */
+		const next = i =>
+			this._items[i].getPromise().then(result => {
+				if (result !== undefined) return result;
+				if (++i < this._items.length) return next(i);
+			});
+		return next(0);
+	}
+
+	/**
+	 * @template T
+	 * @param {T} data the value to store
+	 * @param {CallbackCache} callback signals when the value is stored
+	 * @returns {void}
+	 */
+	store(data, callback) {
+		asyncLib.each(
+			this._items,
+			(item, callback) => item.store(data, callback),
+			callback
+		);
+	}
+
+	/**
+	 * @template T
+	 * @param {T} data the value to store
+	 * @returns {Promise} promise signals when the value is stored
+	 */
+	storePromise(data) {
+		return Promise.all(this._items.map(item => item.storePromise(data))).then(
+			() => {}
+		);
+	}
+}
+
+class ItemCacheFacade {
+	/**
+	 * @param {Cache} cache the root cache
+	 * @param {string} name the child cache item name
+	 * @param {Etag | null} etag the etag
+	 */
+	constructor(cache, name, etag) {
+		this._cache = cache;
+		this._name = name;
+		this._etag = etag;
+	}
+
+	/**
+	 * @template T
+	 * @param {CallbackCache} callback signals when the value is retrieved
+	 * @returns {void}
+	 */
+	get(callback) {
+		this._cache.get(this._name, this._etag, callback);
+	}
+
+	/**
+	 * @template T
+	 * @returns {Promise} promise with the data
+	 */
+	getPromise() {
+		return new Promise((resolve, reject) => {
+			this._cache.get(this._name, this._etag, (err, data) => {
+				if (err) {
+					reject(err);
+				} else {
+					resolve(data);
+				}
+			});
+		});
+	}
+
+	/**
+	 * @template T
+	 * @param {T} data the value to store
+	 * @param {CallbackCache} callback signals when the value is stored
+	 * @returns {void}
+	 */
+	store(data, callback) {
+		this._cache.store(this._name, this._etag, data, callback);
+	}
+
+	/**
+	 * @template T
+	 * @param {T} data the value to store
+	 * @returns {Promise} promise signals when the value is stored
+	 */
+	storePromise(data) {
+		return new Promise((resolve, reject) => {
+			this._cache.store(this._name, this._etag, data, err => {
+				if (err) {
+					reject(err);
+				} else {
+					resolve();
+				}
+			});
+		});
+	}
+
+	/**
+	 * @template T
+	 * @param {(callback: CallbackNormalErrorCache) => void} computer function to compute the value if not cached
+	 * @param {CallbackNormalErrorCache} callback signals when the value is retrieved
+	 * @returns {void}
+	 */
+	provide(computer, callback) {
+		this.get((err, cacheEntry) => {
+			if (err) return callback(err);
+			if (cacheEntry !== undefined) return cacheEntry;
+			computer((err, result) => {
+				if (err) return callback(err);
+				this.store(result, err => {
+					if (err) return callback(err);
+					callback(null, result);
+				});
+			});
+		});
+	}
+
+	/**
+	 * @template T
+	 * @param {() => Promise | T} computer function to compute the value if not cached
+	 * @returns {Promise} promise with the data
+	 */
+	async providePromise(computer) {
+		const cacheEntry = await this.getPromise();
+		if (cacheEntry !== undefined) return cacheEntry;
+		const result = await computer();
+		await this.storePromise(result);
+		return result;
+	}
+}
+
+class CacheFacade {
+	/**
+	 * @param {Cache} cache the root cache
+	 * @param {string} name the child cache name
+	 * @param {(string | HashConstructor)=} hashFunction the hash function to use
+	 */
+	constructor(cache, name, hashFunction) {
+		this._cache = cache;
+		this._name = name;
+		this._hashFunction = hashFunction;
+	}
+
+	/**
+	 * @param {string} name the child cache name#
+	 * @returns {CacheFacade} child cache
+	 */
+	getChildCache(name) {
+		return new CacheFacade(
+			this._cache,
+			`${this._name}|${name}`,
+			this._hashFunction
+		);
+	}
+
+	/**
+	 * @param {string} identifier the cache identifier
+	 * @param {Etag | null} etag the etag
+	 * @returns {ItemCacheFacade} item cache
+	 */
+	getItemCache(identifier, etag) {
+		return new ItemCacheFacade(
+			this._cache,
+			`${this._name}|${identifier}`,
+			etag
+		);
+	}
+
+	/**
+	 * @param {HashableObject} obj an hashable object
+	 * @returns {Etag} an etag that is lazy hashed
+	 */
+	getLazyHashedEtag(obj) {
+		return getLazyHashedEtag(obj, this._hashFunction);
+	}
+
+	/**
+	 * @param {Etag} a an etag
+	 * @param {Etag} b another etag
+	 * @returns {Etag} an etag that represents both
+	 */
+	mergeEtags(a, b) {
+		return mergeEtags(a, b);
+	}
+
+	/**
+	 * @template T
+	 * @param {string} identifier the cache identifier
+	 * @param {Etag | null} etag the etag
+	 * @param {CallbackCache} callback signals when the value is retrieved
+	 * @returns {void}
+	 */
+	get(identifier, etag, callback) {
+		this._cache.get(`${this._name}|${identifier}`, etag, callback);
+	}
+
+	/**
+	 * @template T
+	 * @param {string} identifier the cache identifier
+	 * @param {Etag | null} etag the etag
+	 * @returns {Promise} promise with the data
+	 */
+	getPromise(identifier, etag) {
+		return new Promise((resolve, reject) => {
+			this._cache.get(`${this._name}|${identifier}`, etag, (err, data) => {
+				if (err) {
+					reject(err);
+				} else {
+					resolve(data);
+				}
+			});
+		});
+	}
+
+	/**
+	 * @template T
+	 * @param {string} identifier the cache identifier
+	 * @param {Etag | null} etag the etag
+	 * @param {T} data the value to store
+	 * @param {CallbackCache} callback signals when the value is stored
+	 * @returns {void}
+	 */
+	store(identifier, etag, data, callback) {
+		this._cache.store(`${this._name}|${identifier}`, etag, data, callback);
+	}
+
+	/**
+	 * @template T
+	 * @param {string} identifier the cache identifier
+	 * @param {Etag | null} etag the etag
+	 * @param {T} data the value to store
+	 * @returns {Promise} promise signals when the value is stored
+	 */
+	storePromise(identifier, etag, data) {
+		return new Promise((resolve, reject) => {
+			this._cache.store(`${this._name}|${identifier}`, etag, data, err => {
+				if (err) {
+					reject(err);
+				} else {
+					resolve();
+				}
+			});
+		});
+	}
+
+	/**
+	 * @template T
+	 * @param {string} identifier the cache identifier
+	 * @param {Etag | null} etag the etag
+	 * @param {(callback: CallbackNormalErrorCache) => void} computer function to compute the value if not cached
+	 * @param {CallbackNormalErrorCache} callback signals when the value is retrieved
+	 * @returns {void}
+	 */
+	provide(identifier, etag, computer, callback) {
+		this.get(identifier, etag, (err, cacheEntry) => {
+			if (err) return callback(err);
+			if (cacheEntry !== undefined) return cacheEntry;
+			computer((err, result) => {
+				if (err) return callback(err);
+				this.store(identifier, etag, result, err => {
+					if (err) return callback(err);
+					callback(null, result);
+				});
+			});
+		});
+	}
+
+	/**
+	 * @template T
+	 * @param {string} identifier the cache identifier
+	 * @param {Etag | null} etag the etag
+	 * @param {() => Promise | T} computer function to compute the value if not cached
+	 * @returns {Promise} promise with the data
+	 */
+	async providePromise(identifier, etag, computer) {
+		const cacheEntry = await this.getPromise(identifier, etag);
+		if (cacheEntry !== undefined) return cacheEntry;
+		const result = await computer();
+		await this.storePromise(identifier, etag, result);
+		return result;
+	}
+}
+
+module.exports = CacheFacade;
+module.exports.ItemCacheFacade = ItemCacheFacade;
+module.exports.MultiItemCache = MultiItemCache;
diff --git a/lib/CachePlugin.js b/lib/CachePlugin.js
deleted file mode 100644
index 0d1650be963..00000000000
--- a/lib/CachePlugin.js
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const asyncLib = require("neo-async");
-
-class CachePlugin {
-	constructor(cache) {
-		this.cache = cache || {};
-		this.FS_ACCURACY = 2000;
-	}
-
-	apply(compiler) {
-		if (Array.isArray(compiler.compilers)) {
-			compiler.compilers.forEach((c, idx) => {
-				new CachePlugin((this.cache[idx] = this.cache[idx] || {})).apply(c);
-			});
-		} else {
-			const registerCacheToCompiler = (compiler, cache) => {
-				compiler.hooks.thisCompilation.tap("CachePlugin", compilation => {
-					compilation.cache = cache;
-					compilation.hooks.childCompiler.tap(
-						"CachePlugin",
-						(childCompiler, compilerName, compilerIndex) => {
-							if (cache) {
-								let childCache;
-								if (!cache.children) {
-									cache.children = {};
-								}
-								if (!cache.children[compilerName]) {
-									cache.children[compilerName] = [];
-								}
-								if (cache.children[compilerName][compilerIndex]) {
-									childCache = cache.children[compilerName][compilerIndex];
-								} else {
-									cache.children[compilerName].push((childCache = {}));
-								}
-								registerCacheToCompiler(childCompiler, childCache);
-							}
-						}
-					);
-				});
-			};
-			registerCacheToCompiler(compiler, this.cache);
-			compiler.hooks.watchRun.tap("CachePlugin", () => {
-				this.watching = true;
-			});
-			compiler.hooks.run.tapAsync("CachePlugin", (compiler, callback) => {
-				if (!compiler._lastCompilationFileDependencies) {
-					return callback();
-				}
-				const fs = compiler.inputFileSystem;
-				const fileTs = (compiler.fileTimestamps = new Map());
-				asyncLib.forEach(
-					compiler._lastCompilationFileDependencies,
-					(file, callback) => {
-						fs.stat(file, (err, stat) => {
-							if (err) {
-								if (err.code === "ENOENT") return callback();
-								return callback(err);
-							}
-
-							if (stat.mtime) this.applyMtime(+stat.mtime);
-
-							fileTs.set(file, +stat.mtime || Infinity);
-
-							callback();
-						});
-					},
-					err => {
-						if (err) return callback(err);
-
-						for (const [file, ts] of fileTs) {
-							fileTs.set(file, ts + this.FS_ACCURACY);
-						}
-
-						callback();
-					}
-				);
-			});
-			compiler.hooks.afterCompile.tap("CachePlugin", compilation => {
-				compilation.compiler._lastCompilationFileDependencies =
-					compilation.fileDependencies;
-				compilation.compiler._lastCompilationContextDependencies =
-					compilation.contextDependencies;
-			});
-		}
-	}
-
-	/* istanbul ignore next */
-	applyMtime(mtime) {
-		if (this.FS_ACCURACY > 1 && mtime % 2 !== 0) this.FS_ACCURACY = 1;
-		else if (this.FS_ACCURACY > 10 && mtime % 20 !== 0) this.FS_ACCURACY = 10;
-		else if (this.FS_ACCURACY > 100 && mtime % 200 !== 0)
-			this.FS_ACCURACY = 100;
-		else if (this.FS_ACCURACY > 1000 && mtime % 2000 !== 0)
-			this.FS_ACCURACY = 1000;
-	}
-}
-module.exports = CachePlugin;
diff --git a/lib/CaseSensitiveModulesWarning.js b/lib/CaseSensitiveModulesWarning.js
index 6bfeeca83f1..58a38e5506e 100644
--- a/lib/CaseSensitiveModulesWarning.js
+++ b/lib/CaseSensitiveModulesWarning.js
@@ -2,18 +2,20 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const WebpackError = require("./WebpackError");
 
 /** @typedef {import("./Module")} Module */
+/** @typedef {import("./ModuleGraph")} ModuleGraph */
 
 /**
  * @param {Module[]} modules the modules to be sorted
  * @returns {Module[]} sorted version of original modules
  */
-const sortModules = modules => {
-	return modules.slice().sort((a, b) => {
+const sortModules = modules =>
+	modules.sort((a, b) => {
 		const aIdent = a.identifier();
 		const bIdent = b.identifier();
 		/* istanbul ignore next */
@@ -23,44 +25,46 @@ const sortModules = modules => {
 		/* istanbul ignore next */
 		return 0;
 	});
-};
 
 /**
  * @param {Module[]} modules each module from throw
- * @returns {string} each message from provided moduels
+ * @param {ModuleGraph} moduleGraph the module graph
+ * @returns {string} each message from provided modules
  */
-const createModulesListMessage = modules => {
-	return modules
+const createModulesListMessage = (modules, moduleGraph) =>
+	modules
 		.map(m => {
 			let message = `* ${m.identifier()}`;
-			const validReasons = m.reasons.filter(reason => reason.module);
+			const validReasons = Array.from(
+				moduleGraph.getIncomingConnectionsByOriginModule(m).keys()
+			).filter(Boolean);
 
 			if (validReasons.length > 0) {
 				message += `\n    Used by ${validReasons.length} module(s), i. e.`;
-				message += `\n    ${validReasons[0].module.identifier()}`;
+				message += `\n    ${
+					/** @type {Module[]} */ (validReasons)[0].identifier()
+				}`;
 			}
 			return message;
 		})
 		.join("\n");
-};
 
 class CaseSensitiveModulesWarning extends WebpackError {
 	/**
 	 * Creates an instance of CaseSensitiveModulesWarning.
-	 * @param {Module[]} modules modules that were detected
+	 * @param {Iterable} modules modules that were detected
+	 * @param {ModuleGraph} moduleGraph the module graph
 	 */
-	constructor(modules) {
-		const sortedModules = sortModules(modules);
-		const modulesList = createModulesListMessage(sortedModules);
+	constructor(modules, moduleGraph) {
+		const sortedModules = sortModules(Array.from(modules));
+		const modulesList = createModulesListMessage(sortedModules, moduleGraph);
 		super(`There are multiple modules with names that only differ in casing.
 This can lead to unexpected behavior when compiling on a filesystem with other case-semantic.
 Use equal casing. Compare these module identifiers:
 ${modulesList}`);
 
 		this.name = "CaseSensitiveModulesWarning";
-		this.origin = this.module = sortedModules[0];
-
-		Error.captureStackTrace(this, this.constructor);
+		this.module = sortedModules[0];
 	}
 }
 
diff --git a/lib/Chunk.js b/lib/Chunk.js
index b7811c5b516..dcd0d84ff80 100644
--- a/lib/Chunk.js
+++ b/lib/Chunk.js
@@ -1,103 +1,66 @@
 /*
-MIT License http://www.opensource.org/licenses/mit-license.php
-Author Tobias Koppers @sokra
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const util = require("util");
-const SortableSet = require("./util/SortableSet");
-const intersect = require("./util/SetHelpers").intersect;
-const GraphHelpers = require("./GraphHelpers");
+const ChunkGraph = require("./ChunkGraph");
 const Entrypoint = require("./Entrypoint");
-let debugId = 1000;
-const ERR_CHUNK_ENTRY = "Chunk.entry was removed. Use hasRuntime()";
-const ERR_CHUNK_INITIAL =
-	"Chunk.initial was removed. Use canBeInitial/isOnlyInitial()";
+const { intersect } = require("./util/SetHelpers");
+const SortableSet = require("./util/SortableSet");
+const StringXor = require("./util/StringXor");
+const {
+	compareModulesByIdentifier,
+	compareChunkGroupsByIndex,
+	compareModulesById
+} = require("./util/comparators");
+const { createArrayToSetDeprecationSet } = require("./util/deprecation");
+const { mergeRuntime } = require("./util/runtime");
 
-/** @typedef {import("./Module")} Module */
-/** @typedef {import("./ChunkGroup")} ChunkGroup */
-/** @typedef {import("./ModuleReason")} ModuleReason */
 /** @typedef {import("webpack-sources").Source} Source */
-/** @typedef {import("./util/createHash").Hash} Hash */
-
-/**
- *  @typedef {Object} WithId an object who has an id property *
- *  @property {string | number} id the id of the object
- */
-
-/**
- * Compare two Modules based on their ids for sorting
- * @param {Module} a module
- * @param {Module} b module
- * @returns {-1|0|1} sort value
- */
-
-// TODO use @callback
-/** @typedef {(a: Module, b: Module) => -1|0|1} ModuleSortPredicate */
-/** @typedef {(m: Module) => boolean} ModuleFilterPredicate */
-/** @typedef {(c: Chunk) => boolean} ChunkFilterPredicate */
+/** @typedef {import("./ChunkGraph").ChunkFilterPredicate} ChunkFilterPredicate */
+/** @typedef {import("./ChunkGraph").ChunkSizeOptions} ChunkSizeOptions */
+/** @typedef {import("./ChunkGraph").ModuleFilterPredicate} ModuleFilterPredicate */
+/** @typedef {import("./ChunkGraph").ModuleId} ModuleId */
+/** @typedef {import("./ChunkGroup")} ChunkGroup */
+/** @typedef {import("./ChunkGroup").ChunkGroupOptions} ChunkGroupOptions */
+/** @typedef {import("./Compilation")} Compilation */
+/** @typedef {import("./Compilation").AssetInfo} AssetInfo */
+/** @typedef {import("./Entrypoint").EntryOptions} EntryOptions */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./ModuleGraph")} ModuleGraph */
+/** @typedef {import("./TemplatedPathPlugin").TemplatePath} TemplatePath */
+/** @typedef {import("./util/Hash")} Hash */
+/** @typedef {import("./util/runtime").RuntimeSpec} RuntimeSpec */
 
-const sortModuleById = (a, b) => {
-	if (a.id < b.id) return -1;
-	if (b.id < a.id) return 1;
-	return 0;
-};
+/** @typedef {string | null} ChunkName */
+/** @typedef {number | string} ChunkId */
+/** @typedef {SortableSet} IdNameHints */
 
-/**
- * Compare two ChunkGroups based on their ids for sorting
- * @param {ChunkGroup} a chunk group
- * @param {ChunkGroup} b chunk group
- * @returns {-1|0|1} sort value
- */
-const sortChunkGroupById = (a, b) => {
-	if (a.id < b.id) return -1;
-	if (b.id < a.id) return 1;
-	return 0;
-};
+const ChunkFilesSet = createArrayToSetDeprecationSet("chunk.files");
 
 /**
- * Compare two Identifiables , based on their ids for sorting
- * @param {Module} a first object with ident fn
- * @param {Module} b second object with ident fn
- * @returns {-1|0|1} The order number of the sort
+ * @typedef {object} WithId an object who has an id property *
+ * @property {string | number} id the id of the object
  */
-const sortByIdentifier = (a, b) => {
-	if (a.identifier() > b.identifier()) return 1;
-	if (a.identifier() < b.identifier()) return -1;
-	return 0;
-};
 
 /**
- * @returns {string} a concatenation of module identifiers sorted
- * @param {SortableSet} set to pull module identifiers from
+ * @deprecated
+ * @typedef {object} ChunkMaps
+ * @property {Record} hash
+ * @property {Record>} contentHash
+ * @property {Record} name
  */
-const getModulesIdent = set => {
-	set.sort();
-	let str = "";
-	for (const m of set) {
-		str += m.identifier() + "#";
-	}
-	return str;
-};
 
 /**
- * @template T
- * @param {SortableSet} set the sortable set to convert to array
- * @returns {Array} the array returned from Array.from(set)
+ * @deprecated
+ * @typedef {object} ChunkModuleMaps
+ * @property {Record} id
+ * @property {Record} hash
  */
-const getArray = set => Array.from(set);
 
-/**
- * @param {SortableSet} set the sortable Set to get the count/size of
- * @returns {number} the size of the modules
- */
-const getModulesSize = set => {
-	let size = 0;
-	for (const module of set) {
-		size += module.size();
-	}
-	return size;
-};
+let debugId = 1000;
 
 /**
  * A Chunk is a unit of encapsulation for Modules.
@@ -105,34 +68,42 @@ const getModulesSize = set => {
  */
 class Chunk {
 	/**
-	 * @param {string=} name of chunk being created, is optional (for subclasses)
+	 * @param {ChunkName=} name of chunk being created, is optional (for subclasses)
+	 * @param {boolean} backCompat enable backward-compatibility
 	 */
-	constructor(name) {
-		/** @type {number | null} */
+	constructor(name, backCompat = true) {
+		/** @type {ChunkId | null} */
 		this.id = null;
-		/** @type {number[] | null} */
+		/** @type {ChunkId[] | null} */
 		this.ids = null;
 		/** @type {number} */
 		this.debugId = debugId++;
-		/** @type {string} */
+		/** @type {ChunkName | undefined} */
 		this.name = name;
+		/** @type {IdNameHints} */
+		this.idNameHints = new SortableSet();
 		/** @type {boolean} */
 		this.preventIntegration = false;
-		/** @type {Module=} */
-		this.entryModule = undefined;
-		/** @private @type {SortableSet} */
-		this._modules = new SortableSet(undefined, sortByIdentifier);
-		/** @type {string?} */
+		/** @type {TemplatePath | undefined} */
 		this.filenameTemplate = undefined;
-		/** @private @type {SortableSet} */
-		this._groups = new SortableSet(undefined, sortChunkGroupById);
-		/** @type {string[]} */
-		this.files = [];
+		/** @type {TemplatePath | undefined} */
+		this.cssFilenameTemplate = undefined;
+		/**
+		 * @private
+		 * @type {SortableSet}
+		 */
+		this._groups = new SortableSet(undefined, compareChunkGroupsByIndex);
+		/** @type {RuntimeSpec} */
+		this.runtime = undefined;
+		/** @type {Set} */
+		this.files = backCompat ? new ChunkFilesSet() : new Set();
+		/** @type {Set} */
+		this.auxiliaryFiles = new Set();
 		/** @type {boolean} */
 		this.rendered = false;
 		/** @type {string=} */
 		this.hash = undefined;
-		/** @type {Object} */
+		/** @type {Record} */
 		this.contentHash = Object.create(null);
 		/** @type {string=} */
 		this.renderedHash = undefined;
@@ -140,297 +111,432 @@ class Chunk {
 		this.chunkReason = undefined;
 		/** @type {boolean} */
 		this.extraAsync = false;
-		this.removedModules = undefined;
+	}
+
+	// TODO remove in webpack 6
+	// BACKWARD-COMPAT START
+	get entryModule() {
+		const entryModules = Array.from(
+			ChunkGraph.getChunkGraphForChunk(
+				this,
+				"Chunk.entryModule",
+				"DEP_WEBPACK_CHUNK_ENTRY_MODULE"
+			).getChunkEntryModulesIterable(this)
+		);
+		if (entryModules.length === 0) {
+			return undefined;
+		} else if (entryModules.length === 1) {
+			return entryModules[0];
+		}
+
+		throw new Error(
+			"Module.entryModule: Multiple entry modules are not supported by the deprecated API (Use the new ChunkGroup API)"
+		);
 	}
 
 	/**
-	 * @deprecated Chunk.entry has been deprecated. Please use .hasRuntime() instead
-	 * @returns {never} Throws an error trying to access this property
+	 * @returns {boolean} true, if the chunk contains an entry module
 	 */
-	get entry() {
-		throw new Error(ERR_CHUNK_ENTRY);
+	hasEntryModule() {
+		return (
+			ChunkGraph.getChunkGraphForChunk(
+				this,
+				"Chunk.hasEntryModule",
+				"DEP_WEBPACK_CHUNK_HAS_ENTRY_MODULE"
+			).getNumberOfEntryModules(this) > 0
+		);
 	}
 
 	/**
-	 * @deprecated .entry has been deprecated. Please use .hasRuntime() instead
-	 * @param {never} data The data that was attempting to be set
-	 * @returns {never} Throws an error trying to access this property
+	 * @param {Module} module the module
+	 * @returns {boolean} true, if the chunk could be added
 	 */
-	set entry(data) {
-		throw new Error(ERR_CHUNK_ENTRY);
+	addModule(module) {
+		const chunkGraph = ChunkGraph.getChunkGraphForChunk(
+			this,
+			"Chunk.addModule",
+			"DEP_WEBPACK_CHUNK_ADD_MODULE"
+		);
+		if (chunkGraph.isModuleInChunk(module, this)) return false;
+		chunkGraph.connectChunkAndModule(this, module);
+		return true;
 	}
 
 	/**
-	 * @deprecated Chunk.initial was removed. Use canBeInitial/isOnlyInitial()
-	 * @returns {never} Throws an error trying to access this property
+	 * @param {Module} module the module
+	 * @returns {void}
 	 */
-	get initial() {
-		throw new Error(ERR_CHUNK_INITIAL);
+	removeModule(module) {
+		ChunkGraph.getChunkGraphForChunk(
+			this,
+			"Chunk.removeModule",
+			"DEP_WEBPACK_CHUNK_REMOVE_MODULE"
+		).disconnectChunkAndModule(this, module);
 	}
 
 	/**
-	 * @deprecated Chunk.initial was removed. Use canBeInitial/isOnlyInitial()
-	 * @param {never} data The data attempting to be set
-	 * @returns {never} Throws an error trying to access this property
+	 * @returns {number} the number of module which are contained in this chunk
 	 */
-	set initial(data) {
-		throw new Error(ERR_CHUNK_INITIAL);
+	getNumberOfModules() {
+		return ChunkGraph.getChunkGraphForChunk(
+			this,
+			"Chunk.getNumberOfModules",
+			"DEP_WEBPACK_CHUNK_GET_NUMBER_OF_MODULES"
+		).getNumberOfChunkModules(this);
+	}
+
+	get modulesIterable() {
+		const chunkGraph = ChunkGraph.getChunkGraphForChunk(
+			this,
+			"Chunk.modulesIterable",
+			"DEP_WEBPACK_CHUNK_MODULES_ITERABLE"
+		);
+		return chunkGraph.getOrderedChunkModulesIterable(
+			this,
+			compareModulesByIdentifier
+		);
 	}
 
 	/**
-	 * @returns {boolean} whether or not the Chunk will have a runtime
+	 * @param {Chunk} otherChunk the chunk to compare with
+	 * @returns {-1|0|1} the comparison result
 	 */
-	hasRuntime() {
-		for (const chunkGroup of this._groups) {
-			if (
-				chunkGroup.isInitial() &&
-				chunkGroup instanceof Entrypoint &&
-				chunkGroup.getRuntimeChunk() === this
-			) {
-				return true;
-			}
-		}
-		return false;
+	compareTo(otherChunk) {
+		const chunkGraph = ChunkGraph.getChunkGraphForChunk(
+			this,
+			"Chunk.compareTo",
+			"DEP_WEBPACK_CHUNK_COMPARE_TO"
+		);
+		return chunkGraph.compareChunks(this, otherChunk);
 	}
 
 	/**
-	 * @returns {boolean} whether or not this chunk can be an initial chunk
+	 * @param {Module} module the module
+	 * @returns {boolean} true, if the chunk contains the module
 	 */
-	canBeInitial() {
-		for (const chunkGroup of this._groups) {
-			if (chunkGroup.isInitial()) return true;
-		}
-		return false;
+	containsModule(module) {
+		return ChunkGraph.getChunkGraphForChunk(
+			this,
+			"Chunk.containsModule",
+			"DEP_WEBPACK_CHUNK_CONTAINS_MODULE"
+		).isModuleInChunk(module, this);
 	}
 
 	/**
-	 * @returns {boolean} whether this chunk can only be an initial chunk
+	 * @returns {Module[]} the modules for this chunk
 	 */
-	isOnlyInitial() {
-		if (this._groups.size <= 0) return false;
-		for (const chunkGroup of this._groups) {
-			if (!chunkGroup.isInitial()) return false;
-		}
-		return true;
+	getModules() {
+		return ChunkGraph.getChunkGraphForChunk(
+			this,
+			"Chunk.getModules",
+			"DEP_WEBPACK_CHUNK_GET_MODULES"
+		).getChunkModules(this);
 	}
 
 	/**
-	 * @returns {boolean} if this chunk contains the entry module
+	 * @returns {void}
 	 */
-	hasEntryModule() {
-		return !!this.entryModule;
+	remove() {
+		const chunkGraph = ChunkGraph.getChunkGraphForChunk(
+			this,
+			"Chunk.remove",
+			"DEP_WEBPACK_CHUNK_REMOVE"
+		);
+		chunkGraph.disconnectChunk(this);
+		this.disconnectFromGroups();
 	}
 
 	/**
-	 * @param {Module} module the module that will be added to this chunk.
-	 * @returns {boolean} returns true if the chunk doesn't have the module and it was added
+	 * @param {Module} module the module
+	 * @param {Chunk} otherChunk the target chunk
+	 * @returns {void}
 	 */
-	addModule(module) {
-		if (!this._modules.has(module)) {
-			this._modules.add(module);
-			return true;
-		}
-		return false;
+	moveModule(module, otherChunk) {
+		const chunkGraph = ChunkGraph.getChunkGraphForChunk(
+			this,
+			"Chunk.moveModule",
+			"DEP_WEBPACK_CHUNK_MOVE_MODULE"
+		);
+		chunkGraph.disconnectChunkAndModule(this, module);
+		chunkGraph.connectChunkAndModule(otherChunk, module);
 	}
 
 	/**
-	 * @param {Module} module the module that will be removed from this chunk
-	 * @returns {boolean} returns true if chunk exists and is successfully deleted
+	 * @param {Chunk} otherChunk the other chunk
+	 * @returns {boolean} true, if the specified chunk has been integrated
 	 */
-	removeModule(module) {
-		if (this._modules.delete(module)) {
-			module.removeChunk(this);
+	integrate(otherChunk) {
+		const chunkGraph = ChunkGraph.getChunkGraphForChunk(
+			this,
+			"Chunk.integrate",
+			"DEP_WEBPACK_CHUNK_INTEGRATE"
+		);
+		if (chunkGraph.canChunksBeIntegrated(this, otherChunk)) {
+			chunkGraph.integrateChunks(this, otherChunk);
 			return true;
 		}
+
 		return false;
 	}
 
 	/**
-	 * @param {Module[]} modules the new modules to be set
-	 * @returns {void} set new modules to this chunk and return nothing
+	 * @param {Chunk} otherChunk the other chunk
+	 * @returns {boolean} true, if chunks could be integrated
 	 */
-	setModules(modules) {
-		this._modules = new SortableSet(modules, sortByIdentifier);
+	canBeIntegrated(otherChunk) {
+		const chunkGraph = ChunkGraph.getChunkGraphForChunk(
+			this,
+			"Chunk.canBeIntegrated",
+			"DEP_WEBPACK_CHUNK_CAN_BE_INTEGRATED"
+		);
+		return chunkGraph.canChunksBeIntegrated(this, otherChunk);
 	}
 
 	/**
-	 * @returns {number} the amount of modules in chunk
+	 * @returns {boolean} true, if this chunk contains no module
 	 */
-	getNumberOfModules() {
-		return this._modules.size;
+	isEmpty() {
+		const chunkGraph = ChunkGraph.getChunkGraphForChunk(
+			this,
+			"Chunk.isEmpty",
+			"DEP_WEBPACK_CHUNK_IS_EMPTY"
+		);
+		return chunkGraph.getNumberOfChunkModules(this) === 0;
 	}
 
 	/**
-	 * @returns {SortableSet} return the modules SortableSet for this chunk
+	 * @returns {number} total size of all modules in this chunk
 	 */
-	get modulesIterable() {
-		return this._modules;
+	modulesSize() {
+		const chunkGraph = ChunkGraph.getChunkGraphForChunk(
+			this,
+			"Chunk.modulesSize",
+			"DEP_WEBPACK_CHUNK_MODULES_SIZE"
+		);
+		return chunkGraph.getChunkModulesSize(this);
 	}
 
 	/**
-	 * @param {ChunkGroup} chunkGroup the chunkGroup the chunk is being added
-	 * @returns {boolean} returns true if chunk is not apart of chunkGroup and is added successfully
+	 * @param {ChunkSizeOptions} options options object
+	 * @returns {number} total size of this chunk
 	 */
-	addGroup(chunkGroup) {
-		if (this._groups.has(chunkGroup)) return false;
-		this._groups.add(chunkGroup);
-		return true;
+	size(options = {}) {
+		const chunkGraph = ChunkGraph.getChunkGraphForChunk(
+			this,
+			"Chunk.size",
+			"DEP_WEBPACK_CHUNK_SIZE"
+		);
+		return chunkGraph.getChunkSize(this, options);
 	}
 
 	/**
-	 * @param {ChunkGroup} chunkGroup the chunkGroup the chunk is being removed from
-	 * @returns {boolean} returns true if chunk does exist in chunkGroup and is removed
+	 * @param {Chunk} otherChunk the other chunk
+	 * @param {ChunkSizeOptions} options options object
+	 * @returns {number} total size of the chunk or false if the chunk can't be integrated
 	 */
-	removeGroup(chunkGroup) {
-		if (!this._groups.has(chunkGroup)) return false;
-		this._groups.delete(chunkGroup);
-		return true;
+	integratedSize(otherChunk, options) {
+		const chunkGraph = ChunkGraph.getChunkGraphForChunk(
+			this,
+			"Chunk.integratedSize",
+			"DEP_WEBPACK_CHUNK_INTEGRATED_SIZE"
+		);
+		return chunkGraph.getIntegratedChunksSize(this, otherChunk, options);
 	}
 
 	/**
-	 * @param {ChunkGroup} chunkGroup the chunkGroup to check
-	 * @returns {boolean} returns true if chunk has chunkGroup reference and exists in chunkGroup
+	 * @param {ModuleFilterPredicate} filterFn function used to filter modules
+	 * @returns {ChunkModuleMaps} module map information
 	 */
-	isInGroup(chunkGroup) {
-		return this._groups.has(chunkGroup);
+	getChunkModuleMaps(filterFn) {
+		const chunkGraph = ChunkGraph.getChunkGraphForChunk(
+			this,
+			"Chunk.getChunkModuleMaps",
+			"DEP_WEBPACK_CHUNK_GET_CHUNK_MODULE_MAPS"
+		);
+		/** @type {Record} */
+		const chunkModuleIdMap = Object.create(null);
+		/** @type {Record} */
+		const chunkModuleHashMap = Object.create(null);
+
+		for (const asyncChunk of this.getAllAsyncChunks()) {
+			/** @type {ChunkId[] | undefined} */
+			let array;
+			for (const module of chunkGraph.getOrderedChunkModulesIterable(
+				asyncChunk,
+				compareModulesById(chunkGraph)
+			)) {
+				if (filterFn(module)) {
+					if (array === undefined) {
+						array = [];
+						chunkModuleIdMap[/** @type {ChunkId} */ (asyncChunk.id)] = array;
+					}
+					const moduleId =
+						/** @type {ModuleId} */
+						(chunkGraph.getModuleId(module));
+					array.push(moduleId);
+					chunkModuleHashMap[moduleId] = chunkGraph.getRenderedModuleHash(
+						module,
+						undefined
+					);
+				}
+			}
+		}
+
+		return {
+			id: chunkModuleIdMap,
+			hash: chunkModuleHashMap
+		};
 	}
 
 	/**
-	 * @returns {number} the amount of groups said chunk is in
+	 * @param {ModuleFilterPredicate} filterFn predicate function used to filter modules
+	 * @param {ChunkFilterPredicate=} filterChunkFn predicate function used to filter chunks
+	 * @returns {boolean} return true if module exists in graph
 	 */
-	getNumberOfGroups() {
-		return this._groups.size;
+	hasModuleInGraph(filterFn, filterChunkFn) {
+		const chunkGraph = ChunkGraph.getChunkGraphForChunk(
+			this,
+			"Chunk.hasModuleInGraph",
+			"DEP_WEBPACK_CHUNK_HAS_MODULE_IN_GRAPH"
+		);
+		return chunkGraph.hasModuleInGraph(this, filterFn, filterChunkFn);
 	}
 
 	/**
-	 * @returns {SortableSet} the chunkGroups that said chunk is referenced in
+	 * @deprecated
+	 * @param {boolean} realHash whether the full hash or the rendered hash is to be used
+	 * @returns {ChunkMaps} the chunk map information
 	 */
-	get groupsIterable() {
-		return this._groups;
+	getChunkMaps(realHash) {
+		/** @type {Record} */
+		const chunkHashMap = Object.create(null);
+		/** @type {Record>} */
+		const chunkContentHashMap = Object.create(null);
+		/** @type {Record} */
+		const chunkNameMap = Object.create(null);
+
+		for (const chunk of this.getAllAsyncChunks()) {
+			const id = /** @type {ChunkId} */ (chunk.id);
+			chunkHashMap[id] =
+				/** @type {string} */
+				(realHash ? chunk.hash : chunk.renderedHash);
+			for (const key of Object.keys(chunk.contentHash)) {
+				if (!chunkContentHashMap[key]) {
+					chunkContentHashMap[key] = Object.create(null);
+				}
+				chunkContentHashMap[key][id] = chunk.contentHash[key];
+			}
+			if (chunk.name) {
+				chunkNameMap[id] = chunk.name;
+			}
+		}
+
+		return {
+			hash: chunkHashMap,
+			contentHash: chunkContentHashMap,
+			name: chunkNameMap
+		};
 	}
+	// BACKWARD-COMPAT END
 
 	/**
-	 * @param {Chunk} otherChunk the chunk to compare itself with
-	 * @returns {-1|0|1} this is a comparitor function like sort and returns -1, 0, or 1 based on sort order
+	 * @returns {boolean} whether or not the Chunk will have a runtime
 	 */
-	compareTo(otherChunk) {
-		if (this.name && !otherChunk.name) return -1;
-		if (!this.name && otherChunk.name) return 1;
-		if (this.name < otherChunk.name) return -1;
-		if (this.name > otherChunk.name) return 1;
-		if (this._modules.size > otherChunk._modules.size) return -1;
-		if (this._modules.size < otherChunk._modules.size) return 1;
-		this._modules.sort();
-		otherChunk._modules.sort();
-		const a = this._modules[Symbol.iterator]();
-		const b = otherChunk._modules[Symbol.iterator]();
-		// eslint-disable-next-line no-constant-condition
-		while (true) {
-			const aItem = a.next();
-			if (aItem.done) return 0;
-			const bItem = b.next();
-			const aModuleIdentifier = aItem.value.identifier();
-			const bModuleIdentifier = bItem.value.identifier();
-			if (aModuleIdentifier < bModuleIdentifier) return -1;
-			if (aModuleIdentifier > bModuleIdentifier) return 1;
+	hasRuntime() {
+		for (const chunkGroup of this._groups) {
+			if (
+				chunkGroup instanceof Entrypoint &&
+				chunkGroup.getRuntimeChunk() === this
+			) {
+				return true;
+			}
 		}
+		return false;
 	}
 
 	/**
-	 * @param {Module} module Module to check
-	 * @returns {boolean} returns true if module does exist in this chunk
+	 * @returns {boolean} whether or not this chunk can be an initial chunk
 	 */
-	containsModule(module) {
-		return this._modules.has(module);
+	canBeInitial() {
+		for (const chunkGroup of this._groups) {
+			if (chunkGroup.isInitial()) return true;
+		}
+		return false;
 	}
 
 	/**
-	 * @returns {Module[]} an array of modules (do not modify)
+	 * @returns {boolean} whether this chunk can only be an initial chunk
 	 */
-	getModules() {
-		return this._modules.getFromCache(getArray);
-	}
-
-	getModulesIdent() {
-		return this._modules.getFromUnorderedCache(getModulesIdent);
+	isOnlyInitial() {
+		if (this._groups.size <= 0) return false;
+		for (const chunkGroup of this._groups) {
+			if (!chunkGroup.isInitial()) return false;
+		}
+		return true;
 	}
 
-	remove() {
-		// cleanup modules
-		// Array.from is used here to create a clone, because removeChunk modifies this._modules
-		for (const module of Array.from(this._modules)) {
-			module.removeChunk(this);
-		}
+	/**
+	 * @returns {EntryOptions | undefined} the entry options for this chunk
+	 */
+	getEntryOptions() {
 		for (const chunkGroup of this._groups) {
-			chunkGroup.removeChunk(this);
+			if (chunkGroup instanceof Entrypoint) {
+				return chunkGroup.options;
+			}
 		}
+		return undefined;
 	}
 
 	/**
-	 *
-	 * @param {Module} module module to move
-	 * @param {Chunk} otherChunk other chunk to move it to
+	 * @param {ChunkGroup} chunkGroup the chunkGroup the chunk is being added
 	 * @returns {void}
 	 */
-	moveModule(module, otherChunk) {
-		GraphHelpers.disconnectChunkAndModule(this, module);
-		GraphHelpers.connectChunkAndModule(otherChunk, module);
-		module.rewriteChunkInReasons(this, [otherChunk]);
+	addGroup(chunkGroup) {
+		this._groups.add(chunkGroup);
 	}
 
 	/**
-	 *
-	 * @param {Chunk} otherChunk the chunk to integrate with
-	 * @param {ModuleReason} reason reason why the module is being integrated
-	 * @returns {boolean} returns true or false if integration succeeds or fails
+	 * @param {ChunkGroup} chunkGroup the chunkGroup the chunk is being removed from
+	 * @returns {void}
 	 */
-	integrate(otherChunk, reason) {
-		if (!this.canBeIntegrated(otherChunk)) {
-			return false;
-		}
+	removeGroup(chunkGroup) {
+		this._groups.delete(chunkGroup);
+	}
 
-		// Pick a new name for the integrated chunk
-		if (this.name && otherChunk.name) {
-			if (this.hasEntryModule() === otherChunk.hasEntryModule()) {
-				// When both chunks have entry modules or none have one, use
-				// shortest name
-				if (this.name.length !== otherChunk.name.length) {
-					this.name =
-						this.name.length < otherChunk.name.length
-							? this.name
-							: otherChunk.name;
-				} else {
-					this.name = this.name < otherChunk.name ? this.name : otherChunk.name;
-				}
-			} else if (otherChunk.hasEntryModule()) {
-				// Pick the name of the chunk with the entry module
-				this.name = otherChunk.name;
-			}
-		} else if (otherChunk.name) {
-			this.name = otherChunk.name;
-		}
+	/**
+	 * @param {ChunkGroup} chunkGroup the chunkGroup to check
+	 * @returns {boolean} returns true if chunk has chunkGroup reference and exists in chunkGroup
+	 */
+	isInGroup(chunkGroup) {
+		return this._groups.has(chunkGroup);
+	}
 
-		// Array.from is used here to create a clone, because moveModule modifies otherChunk._modules
-		for (const module of Array.from(otherChunk._modules)) {
-			otherChunk.moveModule(module, this);
-		}
-		otherChunk._modules.clear();
+	/**
+	 * @returns {number} the amount of groups that the said chunk is in
+	 */
+	getNumberOfGroups() {
+		return this._groups.size;
+	}
 
-		if (otherChunk.entryModule) {
-			this.entryModule = otherChunk.entryModule;
-		}
+	/**
+	 * @returns {SortableSet} the chunkGroups that the said chunk is referenced in
+	 */
+	get groupsIterable() {
+		this._groups.sort();
+		return this._groups;
+	}
 
-		for (const chunkGroup of otherChunk._groups) {
-			chunkGroup.replaceChunk(otherChunk, this);
-			this.addGroup(chunkGroup);
+	/**
+	 * @returns {void}
+	 */
+	disconnectFromGroups() {
+		for (const chunkGroup of this._groups) {
+			chunkGroup.removeChunk(this);
 		}
-		otherChunk._groups.clear();
-
-		return true;
 	}
 
 	/**
-	 * @param {Chunk} newChunk the new chunk that will be split out of the current chunk
+	 * @param {Chunk} newChunk the new chunk that will be split out of
 	 * @returns {void}
 	 */
 	split(newChunk) {
@@ -438,129 +544,132 @@ class Chunk {
 			chunkGroup.insertChunk(newChunk, this);
 			newChunk.addGroup(chunkGroup);
 		}
+		for (const idHint of this.idNameHints) {
+			newChunk.idNameHints.add(idHint);
+		}
+		newChunk.runtime = mergeRuntime(newChunk.runtime, this.runtime);
 	}
 
-	isEmpty() {
-		return this._modules.size === 0;
-	}
-
-	updateHash(hash) {
-		hash.update(`${this.id} `);
-		hash.update(this.ids ? this.ids.join(",") : "");
-		hash.update(`${this.name || ""} `);
-		for (const m of this._modules) {
-			hash.update(m.hash);
+	/**
+	 * @param {Hash} hash hash (will be modified)
+	 * @param {ChunkGraph} chunkGraph the chunk graph
+	 * @returns {void}
+	 */
+	updateHash(hash, chunkGraph) {
+		hash.update(
+			`${this.id} ${this.ids ? this.ids.join() : ""} ${this.name || ""} `
+		);
+		const xor = new StringXor();
+		for (const m of chunkGraph.getChunkModulesIterable(this)) {
+			xor.add(chunkGraph.getModuleHash(m, this.runtime));
+		}
+		xor.updateHash(hash);
+		const entryModules =
+			chunkGraph.getChunkEntryModulesWithChunkGroupIterable(this);
+		for (const [m, chunkGroup] of entryModules) {
+			hash.update(
+				`entry${chunkGraph.getModuleId(m)}${
+					/** @type {ChunkGroup} */ (chunkGroup).id
+				}`
+			);
 		}
 	}
 
-	canBeIntegrated(otherChunk) {
-		if (this.preventIntegration || otherChunk.preventIntegration) {
-			return false;
-		}
+	/**
+	 * @returns {Set} a set of all the async chunks
+	 */
+	getAllAsyncChunks() {
+		const queue = new Set();
+		const chunks = new Set();
 
-		const isAvailable = (a, b) => {
-			const queue = new Set(b.groupsIterable);
-			for (const chunkGroup of queue) {
-				if (a.isInGroup(chunkGroup)) continue;
-				if (chunkGroup.isInitial()) return false;
-				for (const parent of chunkGroup.parentsIterable) {
-					queue.add(parent);
-				}
-			}
-			return true;
-		};
+		const initialChunks = intersect(
+			Array.from(this.groupsIterable, g => new Set(g.chunks))
+		);
 
-		const selfHasRuntime = this.hasRuntime();
-		const otherChunkHasRuntime = otherChunk.hasRuntime();
+		const initialQueue = new Set(this.groupsIterable);
 
-		if (selfHasRuntime !== otherChunkHasRuntime) {
-			if (selfHasRuntime) {
-				return isAvailable(this, otherChunk);
-			} else if (otherChunkHasRuntime) {
-				return isAvailable(otherChunk, this);
-			} else {
-				return false;
+		for (const chunkGroup of initialQueue) {
+			for (const child of chunkGroup.childrenIterable) {
+				if (child instanceof Entrypoint) {
+					initialQueue.add(child);
+				} else {
+					queue.add(child);
+				}
 			}
 		}
 
-		if (this.hasEntryModule() || otherChunk.hasEntryModule()) {
-			return false;
+		for (const chunkGroup of queue) {
+			for (const chunk of chunkGroup.chunks) {
+				if (!initialChunks.has(chunk)) {
+					chunks.add(chunk);
+				}
+			}
+			for (const child of chunkGroup.childrenIterable) {
+				queue.add(child);
+			}
 		}
 
-		return true;
-	}
-
-	/**
-	 *
-	 * @param {number} size the size
-	 * @param {Object} options the options passed in
-	 * @returns {number} the multiplier returned
-	 */
-	addMultiplierAndOverhead(size, options) {
-		const overhead =
-			typeof options.chunkOverhead === "number" ? options.chunkOverhead : 10000;
-		const multiplicator = this.canBeInitial()
-			? options.entryChunkMultiplicator || 10
-			: 1;
-
-		return size * multiplicator + overhead;
-	}
-
-	/**
-	 * @returns {number} the size of all modules
-	 */
-	modulesSize() {
-		return this._modules.getFromUnorderedCache(getModulesSize);
+		return chunks;
 	}
 
 	/**
-	 * @param {Object} options the size display options
-	 * @returns {number} the chunk size
+	 * @returns {Set} a set of all the initial chunks (including itself)
 	 */
-	size(options) {
-		return this.addMultiplierAndOverhead(this.modulesSize(), options);
+	getAllInitialChunks() {
+		const chunks = new Set();
+		const queue = new Set(this.groupsIterable);
+		for (const group of queue) {
+			if (group.isInitial()) {
+				for (const c of group.chunks) chunks.add(c);
+				for (const g of group.childrenIterable) queue.add(g);
+			}
+		}
+		return chunks;
 	}
 
 	/**
-	 * @param {Chunk} otherChunk the other chunk
-	 * @param {TODO} options the options for this function
-	 * @returns {number | false} the size, or false if it can't be integrated
+	 * @returns {Set} a set of all the referenced chunks (including itself)
 	 */
-	integratedSize(otherChunk, options) {
-		// Chunk if it's possible to integrate this chunk
-		if (!this.canBeIntegrated(otherChunk)) {
-			return false;
-		}
+	getAllReferencedChunks() {
+		const queue = new Set(this.groupsIterable);
+		const chunks = new Set();
 
-		let integratedModulesSize = this.modulesSize();
-		// only count modules that do not exist in this chunk!
-		for (const otherModule of otherChunk._modules) {
-			if (!this._modules.has(otherModule)) {
-				integratedModulesSize += otherModule.size();
+		for (const chunkGroup of queue) {
+			for (const chunk of chunkGroup.chunks) {
+				chunks.add(chunk);
+			}
+			for (const child of chunkGroup.childrenIterable) {
+				queue.add(child);
 			}
 		}
 
-		return this.addMultiplierAndOverhead(integratedModulesSize, options);
+		return chunks;
 	}
 
 	/**
-	 * @param {function(Module, Module): -1|0|1=} sortByFn a predicate function used to sort modules
-	 * @returns {void}
+	 * @returns {Set} a set of all the referenced entrypoints
 	 */
-	sortModules(sortByFn) {
-		this._modules.sortWith(sortByFn || sortModuleById);
-	}
+	getAllReferencedAsyncEntrypoints() {
+		const queue = new Set(this.groupsIterable);
+		const entrypoints = new Set();
 
-	sortItems() {
-		this.sortModules();
+		for (const chunkGroup of queue) {
+			for (const entrypoint of chunkGroup.asyncEntrypointsIterable) {
+				entrypoints.add(entrypoint);
+			}
+			for (const child of chunkGroup.childrenIterable) {
+				queue.add(child);
+			}
+		}
+
+		return entrypoints;
 	}
 
 	/**
-	 * @returns {Set} a set of all the async chunks
+	 * @returns {boolean} true, if the chunk references async chunks
 	 */
-	getAllAsyncChunks() {
+	hasAsyncChunks() {
 		const queue = new Set();
-		const chunks = new Set();
 
 		const initialChunks = intersect(
 			Array.from(this.groupsIterable, g => new Set(g.chunks))
@@ -575,7 +684,7 @@ class Chunk {
 		for (const chunkGroup of queue) {
 			for (const chunk of chunkGroup.chunks) {
 				if (!initialChunks.has(chunk)) {
-					chunks.add(chunk);
+					return true;
 				}
 			}
 			for (const child of chunkGroup.childrenIterable) {
@@ -583,112 +692,148 @@ class Chunk {
 			}
 		}
 
-		return chunks;
-	}
-
-	/**
-	 * @typedef {Object} ChunkMaps
-	 * @property {Record} hash
-	 * @property {Record>} contentHash
-	 * @property {Record} name
-	 */
-
-	/**
-	 * @param {boolean} realHash should the full hash or the rendered hash be used
-	 * @returns {ChunkMaps} the chunk map information
-	 */
-	getChunkMaps(realHash) {
-		/** @type {Record} */
-		const chunkHashMap = Object.create(null);
-		/** @type {Record>} */
-		const chunkContentHashMap = Object.create(null);
-		/** @type {Record} */
-		const chunkNameMap = Object.create(null);
-
-		for (const chunk of this.getAllAsyncChunks()) {
-			chunkHashMap[chunk.id] = realHash ? chunk.hash : chunk.renderedHash;
-			for (const key of Object.keys(chunk.contentHash)) {
-				if (!chunkContentHashMap[key]) {
-					chunkContentHashMap[key] = Object.create(null);
-				}
-				chunkContentHashMap[key][chunk.id] = chunk.contentHash[key];
-			}
-			if (chunk.name) {
-				chunkNameMap[chunk.id] = chunk.name;
-			}
-		}
-
-		return {
-			hash: chunkHashMap,
-			contentHash: chunkContentHashMap,
-			name: chunkNameMap
-		};
+		return false;
 	}
 
 	/**
-	 * @returns {Record[]>} a record object of names to lists of child ids(?)
+	 * @param {ChunkGraph} chunkGraph the chunk graph
+	 * @param {ChunkFilterPredicate=} filterFn function used to filter chunks
+	 * @returns {Record} a record object of names to lists of child ids(?)
 	 */
-	getChildIdsByOrders() {
+	getChildIdsByOrders(chunkGraph, filterFn) {
+		/** @type {Map} */
 		const lists = new Map();
 		for (const group of this.groupsIterable) {
 			if (group.chunks[group.chunks.length - 1] === this) {
 				for (const childGroup of group.childrenIterable) {
-					// TODO webpack 5 remove this check for options
-					if (typeof childGroup.options === "object") {
-						for (const key of Object.keys(childGroup.options)) {
-							if (key.endsWith("Order")) {
-								const name = key.substr(0, key.length - "Order".length);
-								let list = lists.get(name);
-								if (list === undefined) lists.set(name, (list = []));
-								list.push({
-									order: childGroup.options[key],
-									group: childGroup
-								});
+					for (const key of Object.keys(childGroup.options)) {
+						if (key.endsWith("Order")) {
+							const name = key.slice(0, key.length - "Order".length);
+							let list = lists.get(name);
+							if (list === undefined) {
+								list = [];
+								lists.set(name, list);
 							}
+							list.push({
+								order:
+									/** @type {number} */
+									(
+										childGroup.options[
+											/** @type {keyof ChunkGroupOptions} */
+											(key)
+										]
+									),
+								group: childGroup
+							});
 						}
 					}
 				}
 			}
 		}
+		/** @type {Record} */
 		const result = Object.create(null);
 		for (const [name, list] of lists) {
 			list.sort((a, b) => {
 				const cmp = b.order - a.order;
 				if (cmp !== 0) return cmp;
-				// TODO webpack 5 remove this check of compareTo
-				if (a.group.compareTo) {
-					return a.group.compareTo(b.group);
-				}
-				return 0;
+				return a.group.compareTo(chunkGraph, b.group);
 			});
-			result[name] = Array.from(
-				list.reduce((set, item) => {
-					for (const chunk of item.group.chunks) {
-						set.add(chunk.id);
-					}
-					return set;
-				}, new Set())
-			);
+			/** @type {Set} */
+			const chunkIdSet = new Set();
+			for (const item of list) {
+				for (const chunk of item.group.chunks) {
+					if (filterFn && !filterFn(chunk, chunkGraph)) continue;
+					chunkIdSet.add(/** @type {ChunkId} */ (chunk.id));
+				}
+			}
+			if (chunkIdSet.size > 0) {
+				result[name] = Array.from(chunkIdSet);
+			}
 		}
 		return result;
 	}
 
-	getChildIdsByOrdersMap(includeDirectChildren) {
+	/**
+	 * @param {ChunkGraph} chunkGraph the chunk graph
+	 * @param {string} type option name
+	 * @returns {{ onChunks: Chunk[], chunks: Set }[] | undefined} referenced chunks for a specific type
+	 */
+	getChildrenOfTypeInOrder(chunkGraph, type) {
+		const list = [];
+		for (const group of this.groupsIterable) {
+			for (const childGroup of group.childrenIterable) {
+				const order =
+					childGroup.options[/** @type {keyof ChunkGroupOptions} */ (type)];
+				if (order === undefined) continue;
+				list.push({
+					order,
+					group,
+					childGroup
+				});
+			}
+		}
+		if (list.length === 0) return;
+		list.sort((a, b) => {
+			const cmp =
+				/** @type {number} */ (b.order) - /** @type {number} */ (a.order);
+			if (cmp !== 0) return cmp;
+			return a.group.compareTo(chunkGraph, b.group);
+		});
+		const result = [];
+		let lastEntry;
+		for (const { group, childGroup } of list) {
+			if (lastEntry && lastEntry.onChunks === group.chunks) {
+				for (const chunk of childGroup.chunks) {
+					lastEntry.chunks.add(chunk);
+				}
+			} else {
+				result.push(
+					(lastEntry = {
+						onChunks: group.chunks,
+						chunks: new Set(childGroup.chunks)
+					})
+				);
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * @param {ChunkGraph} chunkGraph the chunk graph
+	 * @param {boolean=} includeDirectChildren include direct children (by default only children of async children are included)
+	 * @param {ChunkFilterPredicate=} filterFn function used to filter chunks
+	 * @returns {Record>} a record object of names to lists of child ids(?) by chunk id
+	 */
+	getChildIdsByOrdersMap(chunkGraph, includeDirectChildren, filterFn) {
+		/** @type {Record>} */
 		const chunkMaps = Object.create(null);
 
+		/**
+		 * @param {Chunk} chunk a chunk
+		 * @returns {void}
+		 */
 		const addChildIdsByOrdersToMap = chunk => {
-			const data = chunk.getChildIdsByOrders();
+			const data = chunk.getChildIdsByOrders(chunkGraph, filterFn);
 			for (const key of Object.keys(data)) {
 				let chunkMap = chunkMaps[key];
 				if (chunkMap === undefined) {
 					chunkMaps[key] = chunkMap = Object.create(null);
 				}
-				chunkMap[chunk.id] = data[key];
+				chunkMap[/** @type {ChunkId} */ (chunk.id)] = data[key];
 			}
 		};
 
 		if (includeDirectChildren) {
-			addChildIdsByOrdersToMap(this);
+			/** @type {Set} */
+			const chunks = new Set();
+			for (const chunkGroup of this.groupsIterable) {
+				for (const chunk of chunkGroup.chunks) {
+					chunks.add(chunk);
+				}
+			}
+			for (const chunk of chunks) {
+				addChildIdsByOrdersToMap(chunk);
+			}
 		}
 
 		for (const chunk of this.getAllAsyncChunks()) {
@@ -699,160 +844,34 @@ class Chunk {
 	}
 
 	/**
-	 * @typedef {Object} ChunkModuleMaps
-	 * @property {Record} id
-	 * @property {Record} hash
+	 * @param {ChunkGraph} chunkGraph the chunk graph
+	 * @param {string} type option name
+	 * @param {boolean=} includeDirectChildren include direct children (by default only children of async children are included)
+	 * @param {ChunkFilterPredicate=} filterFn function used to filter chunks
+	 * @returns {boolean} true when the child is of type order, otherwise false
 	 */
-
-	/**
-	 * @param {ModuleFilterPredicate} filterFn function used to filter modules
-	 * @returns {ChunkModuleMaps} module map information
-	 */
-	getChunkModuleMaps(filterFn) {
-		/** @type {Record} */
-		const chunkModuleIdMap = Object.create(null);
-		/** @type {Record} */
-		const chunkModuleHashMap = Object.create(null);
-
-		for (const chunk of this.getAllAsyncChunks()) {
-			/** @type {(string|number)[]} */
-			let array;
-			for (const module of chunk.modulesIterable) {
-				if (filterFn(module)) {
-					if (array === undefined) {
-						array = [];
-						chunkModuleIdMap[chunk.id] = array;
-					}
-					array.push(module.id);
-					chunkModuleHashMap[module.id] = module.renderedHash;
+	hasChildByOrder(chunkGraph, type, includeDirectChildren, filterFn) {
+		if (includeDirectChildren) {
+			/** @type {Set} */
+			const chunks = new Set();
+			for (const chunkGroup of this.groupsIterable) {
+				for (const chunk of chunkGroup.chunks) {
+					chunks.add(chunk);
 				}
 			}
-			if (array !== undefined) {
-				array.sort();
+			for (const chunk of chunks) {
+				const data = chunk.getChildIdsByOrders(chunkGraph, filterFn);
+				if (data[type] !== undefined) return true;
 			}
 		}
 
-		return {
-			id: chunkModuleIdMap,
-			hash: chunkModuleHashMap
-		};
-	}
-
-	/**
-	 *
-	 * @param {function(Module): boolean} filterFn predicate function used to filter modules
-	 * @param {function(Chunk): boolean} filterChunkFn predicate function used to filter chunks
-	 * @returns {boolean} return true if module exists in graph
-	 */
-	hasModuleInGraph(filterFn, filterChunkFn) {
-		const queue = new Set(this.groupsIterable);
-		const chunksProcessed = new Set();
-
-		for (const chunkGroup of queue) {
-			for (const chunk of chunkGroup.chunks) {
-				if (!chunksProcessed.has(chunk)) {
-					chunksProcessed.add(chunk);
-					if (!filterChunkFn || filterChunkFn(chunk)) {
-						for (const module of chunk.modulesIterable) {
-							if (filterFn(module)) {
-								return true;
-							}
-						}
-					}
-				}
-			}
-			for (const child of chunkGroup.childrenIterable) {
-				queue.add(child);
-			}
+		for (const chunk of this.getAllAsyncChunks()) {
+			const data = chunk.getChildIdsByOrders(chunkGraph, filterFn);
+			if (data[type] !== undefined) return true;
 		}
-		return false;
-	}
 
-	toString() {
-		return `Chunk[${Array.from(this._modules).join()}]`;
+		return false;
 	}
 }
 
-// TODO remove in webpack 5
-Object.defineProperty(Chunk.prototype, "forEachModule", {
-	configurable: false,
-	value: util.deprecate(
-		/**
-		 * @deprecated
-		 * @this {Chunk}
-		 * @typedef {function(any, any, Set): void} ForEachModuleCallback
-		 * @param {ForEachModuleCallback} fn Callback function
-		 * @returns {void}
-		 */
-		function(fn) {
-			this._modules.forEach(fn);
-		},
-		"Chunk.forEachModule: Use for(const module of chunk.modulesIterable) instead"
-	)
-});
-
-// TODO remove in webpack 5
-Object.defineProperty(Chunk.prototype, "mapModules", {
-	configurable: false,
-	value: util.deprecate(
-		/**
-		 * @deprecated
-		 * @this {Chunk}
-		 * @typedef {function(any, number): any} MapModulesCallback
-		 * @param {MapModulesCallback} fn Callback function
-		 * @returns {TODO[]} result of mapped modules
-		 */
-		function(fn) {
-			return Array.from(this._modules, fn);
-		},
-		"Chunk.mapModules: Use Array.from(chunk.modulesIterable, fn) instead"
-	)
-});
-
-// TODO remove in webpack 5
-Object.defineProperty(Chunk.prototype, "chunks", {
-	configurable: false,
-	get() {
-		throw new Error("Chunk.chunks: Use ChunkGroup.getChildren() instead");
-	},
-	set() {
-		throw new Error("Chunk.chunks: Use ChunkGroup.add/removeChild() instead");
-	}
-});
-
-// TODO remove in webpack 5
-Object.defineProperty(Chunk.prototype, "parents", {
-	configurable: false,
-	get() {
-		throw new Error("Chunk.parents: Use ChunkGroup.getParents() instead");
-	},
-	set() {
-		throw new Error("Chunk.parents: Use ChunkGroup.add/removeParent() instead");
-	}
-});
-
-// TODO remove in webpack 5
-Object.defineProperty(Chunk.prototype, "blocks", {
-	configurable: false,
-	get() {
-		throw new Error("Chunk.blocks: Use ChunkGroup.getBlocks() instead");
-	},
-	set() {
-		throw new Error("Chunk.blocks: Use ChunkGroup.add/removeBlock() instead");
-	}
-});
-
-// TODO remove in webpack 5
-Object.defineProperty(Chunk.prototype, "entrypoints", {
-	configurable: false,
-	get() {
-		throw new Error(
-			"Chunk.entrypoints: Use Chunks.groupsIterable and filter by instanceof Entrypoint instead"
-		);
-	},
-	set() {
-		throw new Error("Chunk.entrypoints: Use Chunks.addGroup instead");
-	}
-});
-
 module.exports = Chunk;
diff --git a/lib/ChunkGraph.js b/lib/ChunkGraph.js
new file mode 100644
index 00000000000..3096d89d41b
--- /dev/null
+++ b/lib/ChunkGraph.js
@@ -0,0 +1,1872 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const util = require("util");
+const Entrypoint = require("./Entrypoint");
+const ModuleGraphConnection = require("./ModuleGraphConnection");
+const { DEFAULTS } = require("./config/defaults");
+const { first } = require("./util/SetHelpers");
+const SortableSet = require("./util/SortableSet");
+const {
+	compareModulesById,
+	compareIterables,
+	compareModulesByIdentifier,
+	concatComparators,
+	compareSelect,
+	compareIds
+} = require("./util/comparators");
+const createHash = require("./util/createHash");
+const findGraphRoots = require("./util/findGraphRoots");
+const {
+	RuntimeSpecMap,
+	RuntimeSpecSet,
+	runtimeToString,
+	mergeRuntime,
+	forEachRuntime
+} = require("./util/runtime");
+
+/** @typedef {import("./AsyncDependenciesBlock")} AsyncDependenciesBlock */
+/** @typedef {import("./Chunk")} Chunk */
+/** @typedef {import("./Chunk").ChunkId} ChunkId */
+/** @typedef {import("./ChunkGroup")} ChunkGroup */
+/** @typedef {import("./Generator").SourceTypes} SourceTypes */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./Module").ReadOnlyRuntimeRequirements} ReadOnlyRuntimeRequirements */
+/** @typedef {import("./Module").RuntimeRequirements} RuntimeRequirements */
+/** @typedef {import("./ModuleGraph")} ModuleGraph */
+/** @typedef {import("./ModuleGraphConnection").ConnectionState} ConnectionState */
+/** @typedef {import("./RuntimeModule")} RuntimeModule */
+/** @typedef {typeof import("./util/Hash")} Hash */
+/** @typedef {import("./util/runtime").RuntimeSpec} RuntimeSpec */
+
+/** @type {ReadonlySet} */
+const EMPTY_SET = new Set();
+
+const ZERO_BIG_INT = BigInt(0);
+
+const compareModuleIterables = compareIterables(compareModulesByIdentifier);
+
+/** @typedef {(c: Chunk, chunkGraph: ChunkGraph) => boolean} ChunkFilterPredicate */
+/** @typedef {(m: Module) => boolean} ModuleFilterPredicate */
+/** @typedef {[Module, Entrypoint | undefined]} EntryModuleWithChunkGroup */
+
+/**
+ * @typedef {object} ChunkSizeOptions
+ * @property {number=} chunkOverhead constant overhead for a chunk
+ * @property {number=} entryChunkMultiplicator multiplicator for initial chunks
+ */
+
+class ModuleHashInfo {
+	/**
+	 * @param {string} hash hash
+	 * @param {string} renderedHash rendered hash
+	 */
+	constructor(hash, renderedHash) {
+		this.hash = hash;
+		this.renderedHash = renderedHash;
+	}
+}
+
+/**
+ * @template T
+ * @param {SortableSet} set the set
+ * @returns {T[]} set as array
+ */
+const getArray = set => Array.from(set);
+
+/**
+ * @param {SortableSet} chunks the chunks
+ * @returns {RuntimeSpecSet} runtimes
+ */
+const getModuleRuntimes = chunks => {
+	const runtimes = new RuntimeSpecSet();
+	for (const chunk of chunks) {
+		runtimes.add(chunk.runtime);
+	}
+	return runtimes;
+};
+
+/**
+ * @param {WeakMap> | undefined} sourceTypesByModule sourceTypesByModule
+ * @returns {(set: SortableSet) => Map>} modules by source type
+ */
+const modulesBySourceType = sourceTypesByModule => set => {
+	/** @type {Map>} */
+	const map = new Map();
+	for (const module of set) {
+		const sourceTypes =
+			(sourceTypesByModule && sourceTypesByModule.get(module)) ||
+			module.getSourceTypes();
+		for (const sourceType of sourceTypes) {
+			let innerSet = map.get(sourceType);
+			if (innerSet === undefined) {
+				innerSet = new SortableSet();
+				map.set(sourceType, innerSet);
+			}
+			innerSet.add(module);
+		}
+	}
+	for (const [key, innerSet] of map) {
+		// When all modules have the source type, we reuse the original SortableSet
+		// to benefit from the shared cache (especially for sorting)
+		if (innerSet.size === set.size) {
+			map.set(key, set);
+		}
+	}
+	return map;
+};
+const defaultModulesBySourceType = modulesBySourceType(undefined);
+
+/**
+ * @typedef {(set: SortableSet) => Module[]} ModuleSetToArrayFunction
+ */
+
+/**
+ * @template T
+ * @type {WeakMap}
+ */
+const createOrderedArrayFunctionMap = new WeakMap();
+
+/**
+ * @template T
+ * @param {ModuleComparator} comparator comparator function
+ * @returns {ModuleSetToArrayFunction} set as ordered array
+ */
+const createOrderedArrayFunction = comparator => {
+	let fn = createOrderedArrayFunctionMap.get(comparator);
+	if (fn !== undefined) return fn;
+	fn = set => {
+		set.sortWith(comparator);
+		return Array.from(set);
+	};
+	createOrderedArrayFunctionMap.set(comparator, fn);
+	return fn;
+};
+
+/**
+ * @param {Iterable} modules the modules to get the count/size of
+ * @returns {number} the size of the modules
+ */
+const getModulesSize = modules => {
+	let size = 0;
+	for (const module of modules) {
+		for (const type of module.getSourceTypes()) {
+			size += module.size(type);
+		}
+	}
+	return size;
+};
+
+/**
+ * @param {Iterable} modules the sortable Set to get the size of
+ * @returns {Record} the sizes of the modules
+ */
+const getModulesSizes = modules => {
+	const sizes = Object.create(null);
+	for (const module of modules) {
+		for (const type of module.getSourceTypes()) {
+			sizes[type] = (sizes[type] || 0) + module.size(type);
+		}
+	}
+	return sizes;
+};
+
+/**
+ * @param {Chunk} a chunk
+ * @param {Chunk} b chunk
+ * @returns {boolean} true, if a is always a parent of b
+ */
+const isAvailableChunk = (a, b) => {
+	const queue = new Set(b.groupsIterable);
+	for (const chunkGroup of queue) {
+		if (a.isInGroup(chunkGroup)) continue;
+		if (chunkGroup.isInitial()) return false;
+		for (const parent of chunkGroup.parentsIterable) {
+			queue.add(parent);
+		}
+	}
+	return true;
+};
+
+/** @typedef {Set} EntryInChunks */
+/** @typedef {Set} RuntimeInChunks */
+/** @typedef {string | number} ModuleId */
+
+class ChunkGraphModule {
+	constructor() {
+		/** @type {SortableSet} */
+		this.chunks = new SortableSet();
+		/** @type {EntryInChunks | undefined} */
+		this.entryInChunks = undefined;
+		/** @type {RuntimeInChunks | undefined} */
+		this.runtimeInChunks = undefined;
+		/** @type {RuntimeSpecMap | undefined} */
+		this.hashes = undefined;
+		/** @type {ModuleId | null} */
+		this.id = null;
+		/** @type {RuntimeSpecMap, RuntimeRequirements> | undefined} */
+		this.runtimeRequirements = undefined;
+		/** @type {RuntimeSpecMap | undefined} */
+		this.graphHashes = undefined;
+		/** @type {RuntimeSpecMap | undefined} */
+		this.graphHashesWithConnections = undefined;
+	}
+}
+
+class ChunkGraphChunk {
+	constructor() {
+		/** @type {SortableSet} */
+		this.modules = new SortableSet();
+		/** @type {WeakMap> | undefined} */
+		this.sourceTypesByModule = undefined;
+		/** @type {Map} */
+		this.entryModules = new Map();
+		/** @type {SortableSet} */
+		this.runtimeModules = new SortableSet();
+		/** @type {Set | undefined} */
+		this.fullHashModules = undefined;
+		/** @type {Set | undefined} */
+		this.dependentHashModules = undefined;
+		/** @type {Set | undefined} */
+		this.runtimeRequirements = undefined;
+		/** @type {Set} */
+		this.runtimeRequirementsInTree = new Set();
+
+		this._modulesBySourceType = defaultModulesBySourceType;
+	}
+}
+
+/** @typedef {(a: Module, b: Module) => -1 | 0 | 1} ModuleComparator */
+
+class ChunkGraph {
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @param {string | Hash} hashFunction the hash function to use
+	 */
+	constructor(moduleGraph, hashFunction = DEFAULTS.HASH_FUNCTION) {
+		/**
+		 * @private
+		 * @type {WeakMap}
+		 */
+		this._modules = new WeakMap();
+		/**
+		 * @private
+		 * @type {WeakMap}
+		 */
+		this._chunks = new WeakMap();
+		/**
+		 * @private
+		 * @type {WeakMap}
+		 */
+		this._blockChunkGroups = new WeakMap();
+		/**
+		 * @private
+		 * @type {Map}
+		 */
+		this._runtimeIds = new Map();
+		/** @type {ModuleGraph} */
+		this.moduleGraph = moduleGraph;
+
+		this._hashFunction = hashFunction;
+
+		this._getGraphRoots = this._getGraphRoots.bind(this);
+	}
+
+	/**
+	 * @private
+	 * @param {Module} module the module
+	 * @returns {ChunkGraphModule} internal module
+	 */
+	_getChunkGraphModule(module) {
+		let cgm = this._modules.get(module);
+		if (cgm === undefined) {
+			cgm = new ChunkGraphModule();
+			this._modules.set(module, cgm);
+		}
+		return cgm;
+	}
+
+	/**
+	 * @private
+	 * @param {Chunk} chunk the chunk
+	 * @returns {ChunkGraphChunk} internal chunk
+	 */
+	_getChunkGraphChunk(chunk) {
+		let cgc = this._chunks.get(chunk);
+		if (cgc === undefined) {
+			cgc = new ChunkGraphChunk();
+			this._chunks.set(chunk, cgc);
+		}
+		return cgc;
+	}
+
+	/**
+	 * @param {SortableSet} set the sortable Set to get the roots of
+	 * @returns {Module[]} the graph roots
+	 */
+	_getGraphRoots(set) {
+		const { moduleGraph } = this;
+		return Array.from(
+			findGraphRoots(set, module => {
+				/** @type {Set} */
+				const set = new Set();
+				/**
+				 * @param {Module} module module
+				 */
+				const addDependencies = module => {
+					for (const connection of moduleGraph.getOutgoingConnections(module)) {
+						if (!connection.module) continue;
+						const activeState = connection.getActiveState(undefined);
+						if (activeState === false) continue;
+						if (activeState === ModuleGraphConnection.TRANSITIVE_ONLY) {
+							addDependencies(connection.module);
+							continue;
+						}
+						set.add(connection.module);
+					}
+				};
+				addDependencies(module);
+				return set;
+			})
+		).sort(compareModulesByIdentifier);
+	}
+
+	/**
+	 * @param {Chunk} chunk the new chunk
+	 * @param {Module} module the module
+	 * @returns {void}
+	 */
+	connectChunkAndModule(chunk, module) {
+		const cgm = this._getChunkGraphModule(module);
+		const cgc = this._getChunkGraphChunk(chunk);
+		cgm.chunks.add(chunk);
+		cgc.modules.add(module);
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {Module} module the module
+	 * @returns {void}
+	 */
+	disconnectChunkAndModule(chunk, module) {
+		const cgm = this._getChunkGraphModule(module);
+		const cgc = this._getChunkGraphChunk(chunk);
+		cgc.modules.delete(module);
+		// No need to invalidate cgc._modulesBySourceType because we modified cgc.modules anyway
+		if (cgc.sourceTypesByModule) cgc.sourceTypesByModule.delete(module);
+		cgm.chunks.delete(chunk);
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk which will be disconnected
+	 * @returns {void}
+	 */
+	disconnectChunk(chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		for (const module of cgc.modules) {
+			const cgm = this._getChunkGraphModule(module);
+			cgm.chunks.delete(chunk);
+		}
+		cgc.modules.clear();
+		chunk.disconnectFromGroups();
+		ChunkGraph.clearChunkGraphForChunk(chunk);
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {Iterable} modules the modules
+	 * @returns {void}
+	 */
+	attachModules(chunk, modules) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		for (const module of modules) {
+			cgc.modules.add(module);
+		}
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {Iterable} modules the runtime modules
+	 * @returns {void}
+	 */
+	attachRuntimeModules(chunk, modules) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		for (const module of modules) {
+			cgc.runtimeModules.add(module);
+		}
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {Iterable} modules the modules that require a full hash
+	 * @returns {void}
+	 */
+	attachFullHashModules(chunk, modules) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		if (cgc.fullHashModules === undefined) cgc.fullHashModules = new Set();
+		for (const module of modules) {
+			cgc.fullHashModules.add(module);
+		}
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {Iterable} modules the modules that require a full hash
+	 * @returns {void}
+	 */
+	attachDependentHashModules(chunk, modules) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		if (cgc.dependentHashModules === undefined)
+			cgc.dependentHashModules = new Set();
+		for (const module of modules) {
+			cgc.dependentHashModules.add(module);
+		}
+	}
+
+	/**
+	 * @param {Module} oldModule the replaced module
+	 * @param {Module} newModule the replacing module
+	 * @returns {void}
+	 */
+	replaceModule(oldModule, newModule) {
+		const oldCgm = this._getChunkGraphModule(oldModule);
+		const newCgm = this._getChunkGraphModule(newModule);
+
+		for (const chunk of oldCgm.chunks) {
+			const cgc = this._getChunkGraphChunk(chunk);
+			cgc.modules.delete(oldModule);
+			cgc.modules.add(newModule);
+			newCgm.chunks.add(chunk);
+		}
+		oldCgm.chunks.clear();
+
+		if (oldCgm.entryInChunks !== undefined) {
+			if (newCgm.entryInChunks === undefined) {
+				newCgm.entryInChunks = new Set();
+			}
+			for (const chunk of oldCgm.entryInChunks) {
+				const cgc = this._getChunkGraphChunk(chunk);
+				const old = /** @type {Entrypoint} */ (cgc.entryModules.get(oldModule));
+				/** @type {Map} */
+				const newEntryModules = new Map();
+				for (const [m, cg] of cgc.entryModules) {
+					if (m === oldModule) {
+						newEntryModules.set(newModule, old);
+					} else {
+						newEntryModules.set(m, cg);
+					}
+				}
+				cgc.entryModules = newEntryModules;
+				newCgm.entryInChunks.add(chunk);
+			}
+			oldCgm.entryInChunks = undefined;
+		}
+
+		if (oldCgm.runtimeInChunks !== undefined) {
+			if (newCgm.runtimeInChunks === undefined) {
+				newCgm.runtimeInChunks = new Set();
+			}
+			for (const chunk of oldCgm.runtimeInChunks) {
+				const cgc = this._getChunkGraphChunk(chunk);
+				cgc.runtimeModules.delete(/** @type {RuntimeModule} */ (oldModule));
+				cgc.runtimeModules.add(/** @type {RuntimeModule} */ (newModule));
+				newCgm.runtimeInChunks.add(chunk);
+				if (
+					cgc.fullHashModules !== undefined &&
+					cgc.fullHashModules.has(/** @type {RuntimeModule} */ (oldModule))
+				) {
+					cgc.fullHashModules.delete(/** @type {RuntimeModule} */ (oldModule));
+					cgc.fullHashModules.add(/** @type {RuntimeModule} */ (newModule));
+				}
+				if (
+					cgc.dependentHashModules !== undefined &&
+					cgc.dependentHashModules.has(/** @type {RuntimeModule} */ (oldModule))
+				) {
+					cgc.dependentHashModules.delete(
+						/** @type {RuntimeModule} */ (oldModule)
+					);
+					cgc.dependentHashModules.add(
+						/** @type {RuntimeModule} */ (newModule)
+					);
+				}
+			}
+			oldCgm.runtimeInChunks = undefined;
+		}
+	}
+
+	/**
+	 * @param {Module} module the checked module
+	 * @param {Chunk} chunk the checked chunk
+	 * @returns {boolean} true, if the chunk contains the module
+	 */
+	isModuleInChunk(module, chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		return cgc.modules.has(module);
+	}
+
+	/**
+	 * @param {Module} module the checked module
+	 * @param {ChunkGroup} chunkGroup the checked chunk group
+	 * @returns {boolean} true, if the chunk contains the module
+	 */
+	isModuleInChunkGroup(module, chunkGroup) {
+		for (const chunk of chunkGroup.chunks) {
+			if (this.isModuleInChunk(module, chunk)) return true;
+		}
+		return false;
+	}
+
+	/**
+	 * @param {Module} module the checked module
+	 * @returns {boolean} true, if the module is entry of any chunk
+	 */
+	isEntryModule(module) {
+		const cgm = this._getChunkGraphModule(module);
+		return cgm.entryInChunks !== undefined;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @returns {Iterable} iterable of chunks (do not modify)
+	 */
+	getModuleChunksIterable(module) {
+		const cgm = this._getChunkGraphModule(module);
+		return cgm.chunks;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {(a: Chunk, b: Chunk) => -1 | 0 | 1} sortFn sort function
+	 * @returns {Iterable} iterable of chunks (do not modify)
+	 */
+	getOrderedModuleChunksIterable(module, sortFn) {
+		const cgm = this._getChunkGraphModule(module);
+		cgm.chunks.sortWith(sortFn);
+		return cgm.chunks;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @returns {Chunk[]} array of chunks (cached, do not modify)
+	 */
+	getModuleChunks(module) {
+		const cgm = this._getChunkGraphModule(module);
+		return cgm.chunks.getFromCache(getArray);
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @returns {number} the number of chunk which contain the module
+	 */
+	getNumberOfModuleChunks(module) {
+		const cgm = this._getChunkGraphModule(module);
+		return cgm.chunks.size;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @returns {RuntimeSpecSet} runtimes
+	 */
+	getModuleRuntimes(module) {
+		const cgm = this._getChunkGraphModule(module);
+		return cgm.chunks.getFromUnorderedCache(getModuleRuntimes);
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {number} the number of modules which are contained in this chunk
+	 */
+	getNumberOfChunkModules(chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		return cgc.modules.size;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {number} the number of full hash modules which are contained in this chunk
+	 */
+	getNumberOfChunkFullHashModules(chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		return cgc.fullHashModules === undefined ? 0 : cgc.fullHashModules.size;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {Iterable} return the modules for this chunk
+	 */
+	getChunkModulesIterable(chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		return cgc.modules;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {string} sourceType source type
+	 * @returns {Iterable | undefined} return the modules for this chunk
+	 */
+	getChunkModulesIterableBySourceType(chunk, sourceType) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		const modulesWithSourceType = cgc.modules
+			.getFromUnorderedCache(cgc._modulesBySourceType)
+			.get(sourceType);
+		return modulesWithSourceType;
+	}
+
+	/**
+	 * @param {Chunk} chunk chunk
+	 * @param {Module} module chunk module
+	 * @param {Set} sourceTypes source types
+	 */
+	setChunkModuleSourceTypes(chunk, module, sourceTypes) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		if (cgc.sourceTypesByModule === undefined) {
+			cgc.sourceTypesByModule = new WeakMap();
+		}
+		cgc.sourceTypesByModule.set(module, sourceTypes);
+		// Update cgc._modulesBySourceType to invalidate the cache
+		cgc._modulesBySourceType = modulesBySourceType(cgc.sourceTypesByModule);
+	}
+
+	/**
+	 * @param {Chunk} chunk chunk
+	 * @param {Module} module chunk module
+	 * @returns {SourceTypes} source types
+	 */
+	getChunkModuleSourceTypes(chunk, module) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		if (cgc.sourceTypesByModule === undefined) {
+			return module.getSourceTypes();
+		}
+		return cgc.sourceTypesByModule.get(module) || module.getSourceTypes();
+	}
+
+	/**
+	 * @param {Module} module module
+	 * @returns {SourceTypes} source types
+	 */
+	getModuleSourceTypes(module) {
+		return (
+			this._getOverwrittenModuleSourceTypes(module) || module.getSourceTypes()
+		);
+	}
+
+	/**
+	 * @param {Module} module module
+	 * @returns {Set | undefined} source types
+	 */
+	_getOverwrittenModuleSourceTypes(module) {
+		let newSet = false;
+		let sourceTypes;
+		for (const chunk of this.getModuleChunksIterable(module)) {
+			const cgc = this._getChunkGraphChunk(chunk);
+			if (cgc.sourceTypesByModule === undefined) return;
+			const st = cgc.sourceTypesByModule.get(module);
+			if (st === undefined) return;
+			if (!sourceTypes) {
+				sourceTypes = st;
+			} else if (!newSet) {
+				for (const type of st) {
+					if (!newSet) {
+						if (!sourceTypes.has(type)) {
+							newSet = true;
+							sourceTypes = new Set(sourceTypes);
+							sourceTypes.add(type);
+						}
+					} else {
+						sourceTypes.add(type);
+					}
+				}
+			} else {
+				for (const type of st) sourceTypes.add(type);
+			}
+		}
+
+		return sourceTypes;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {ModuleComparator} comparator comparator function
+	 * @returns {Iterable} return the modules for this chunk
+	 */
+	getOrderedChunkModulesIterable(chunk, comparator) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		cgc.modules.sortWith(comparator);
+		return cgc.modules;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {string} sourceType source type
+	 * @param {ModuleComparator} comparator comparator function
+	 * @returns {Iterable | undefined} return the modules for this chunk
+	 */
+	getOrderedChunkModulesIterableBySourceType(chunk, sourceType, comparator) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		const modulesWithSourceType = cgc.modules
+			.getFromUnorderedCache(cgc._modulesBySourceType)
+			.get(sourceType);
+		if (modulesWithSourceType === undefined) return;
+		modulesWithSourceType.sortWith(comparator);
+		return modulesWithSourceType;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {Module[]} return the modules for this chunk (cached, do not modify)
+	 */
+	getChunkModules(chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		return cgc.modules.getFromUnorderedCache(getArray);
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {ModuleComparator} comparator comparator function
+	 * @returns {Module[]} return the modules for this chunk (cached, do not modify)
+	 */
+	getOrderedChunkModules(chunk, comparator) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		const arrayFunction = createOrderedArrayFunction(comparator);
+		return cgc.modules.getFromUnorderedCache(arrayFunction);
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {ModuleFilterPredicate} filterFn function used to filter modules
+	 * @param {boolean} includeAllChunks all chunks or only async chunks
+	 * @returns {Record} chunk to module ids object
+	 */
+	getChunkModuleIdMap(chunk, filterFn, includeAllChunks = false) {
+		/** @type {Record} */
+		const chunkModuleIdMap = Object.create(null);
+
+		for (const asyncChunk of includeAllChunks
+			? chunk.getAllReferencedChunks()
+			: chunk.getAllAsyncChunks()) {
+			/** @type {(string | number)[] | undefined} */
+			let array;
+			for (const module of this.getOrderedChunkModulesIterable(
+				asyncChunk,
+				compareModulesById(this)
+			)) {
+				if (filterFn(module)) {
+					if (array === undefined) {
+						array = [];
+						chunkModuleIdMap[/** @type {ChunkId} */ (asyncChunk.id)] = array;
+					}
+					const moduleId = /** @type {ModuleId} */ (this.getModuleId(module));
+					array.push(moduleId);
+				}
+			}
+		}
+
+		return chunkModuleIdMap;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {ModuleFilterPredicate} filterFn function used to filter modules
+	 * @param {number} hashLength length of the hash
+	 * @param {boolean} includeAllChunks all chunks or only async chunks
+	 * @returns {Record>} chunk to module id to module hash object
+	 */
+	getChunkModuleRenderedHashMap(
+		chunk,
+		filterFn,
+		hashLength = 0,
+		includeAllChunks = false
+	) {
+		/** @type {Record>} */
+		const chunkModuleHashMap = Object.create(null);
+
+		/** @typedef {Record} IdToHashMap  */
+
+		for (const asyncChunk of includeAllChunks
+			? chunk.getAllReferencedChunks()
+			: chunk.getAllAsyncChunks()) {
+			/** @type {IdToHashMap | undefined} */
+			let idToHashMap;
+			for (const module of this.getOrderedChunkModulesIterable(
+				asyncChunk,
+				compareModulesById(this)
+			)) {
+				if (filterFn(module)) {
+					if (idToHashMap === undefined) {
+						idToHashMap = Object.create(null);
+						chunkModuleHashMap[/** @type {ChunkId} */ (asyncChunk.id)] =
+							/** @type {IdToHashMap} */ (idToHashMap);
+					}
+					const moduleId = this.getModuleId(module);
+					const hash = this.getRenderedModuleHash(module, asyncChunk.runtime);
+					/** @type {IdToHashMap} */
+					(idToHashMap)[/** @type {ModuleId} */ (moduleId)] = hashLength
+						? hash.slice(0, hashLength)
+						: hash;
+				}
+			}
+		}
+
+		return chunkModuleHashMap;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {ChunkFilterPredicate} filterFn function used to filter chunks
+	 * @returns {Record} chunk map
+	 */
+	getChunkConditionMap(chunk, filterFn) {
+		const map = Object.create(null);
+		for (const c of chunk.getAllReferencedChunks()) {
+			map[/** @type {ChunkId} */ (c.id)] = filterFn(c, this);
+		}
+		return map;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {ModuleFilterPredicate} filterFn predicate function used to filter modules
+	 * @param {ChunkFilterPredicate=} filterChunkFn predicate function used to filter chunks
+	 * @returns {boolean} return true if module exists in graph
+	 */
+	hasModuleInGraph(chunk, filterFn, filterChunkFn) {
+		const queue = new Set(chunk.groupsIterable);
+		const chunksProcessed = new Set();
+
+		for (const chunkGroup of queue) {
+			for (const innerChunk of chunkGroup.chunks) {
+				if (!chunksProcessed.has(innerChunk)) {
+					chunksProcessed.add(innerChunk);
+					if (!filterChunkFn || filterChunkFn(innerChunk, this)) {
+						for (const module of this.getChunkModulesIterable(innerChunk)) {
+							if (filterFn(module)) {
+								return true;
+							}
+						}
+					}
+				}
+			}
+			for (const child of chunkGroup.childrenIterable) {
+				queue.add(child);
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * @param {Chunk} chunkA first chunk
+	 * @param {Chunk} chunkB second chunk
+	 * @returns {-1|0|1} this is a comparator function like sort and returns -1, 0, or 1 based on sort order
+	 */
+	compareChunks(chunkA, chunkB) {
+		const cgcA = this._getChunkGraphChunk(chunkA);
+		const cgcB = this._getChunkGraphChunk(chunkB);
+		if (cgcA.modules.size > cgcB.modules.size) return -1;
+		if (cgcA.modules.size < cgcB.modules.size) return 1;
+		cgcA.modules.sortWith(compareModulesByIdentifier);
+		cgcB.modules.sortWith(compareModulesByIdentifier);
+		return compareModuleIterables(cgcA.modules, cgcB.modules);
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {number} total size of all modules in the chunk
+	 */
+	getChunkModulesSize(chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		return cgc.modules.getFromUnorderedCache(getModulesSize);
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {Record} total sizes of all modules in the chunk by source type
+	 */
+	getChunkModulesSizes(chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		return cgc.modules.getFromUnorderedCache(getModulesSizes);
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {Module[]} root modules of the chunks (ordered by identifier)
+	 */
+	getChunkRootModules(chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		return cgc.modules.getFromUnorderedCache(this._getGraphRoots);
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {ChunkSizeOptions} options options object
+	 * @returns {number} total size of the chunk
+	 */
+	getChunkSize(chunk, options = {}) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		const modulesSize = cgc.modules.getFromUnorderedCache(getModulesSize);
+		const chunkOverhead =
+			typeof options.chunkOverhead === "number" ? options.chunkOverhead : 10000;
+		const entryChunkMultiplicator =
+			typeof options.entryChunkMultiplicator === "number"
+				? options.entryChunkMultiplicator
+				: 10;
+		return (
+			chunkOverhead +
+			modulesSize * (chunk.canBeInitial() ? entryChunkMultiplicator : 1)
+		);
+	}
+
+	/**
+	 * @param {Chunk} chunkA chunk
+	 * @param {Chunk} chunkB chunk
+	 * @param {ChunkSizeOptions} options options object
+	 * @returns {number} total size of the chunk or false if chunks can't be integrated
+	 */
+	getIntegratedChunksSize(chunkA, chunkB, options = {}) {
+		const cgcA = this._getChunkGraphChunk(chunkA);
+		const cgcB = this._getChunkGraphChunk(chunkB);
+		const allModules = new Set(cgcA.modules);
+		for (const m of cgcB.modules) allModules.add(m);
+		const modulesSize = getModulesSize(allModules);
+		const chunkOverhead =
+			typeof options.chunkOverhead === "number" ? options.chunkOverhead : 10000;
+		const entryChunkMultiplicator =
+			typeof options.entryChunkMultiplicator === "number"
+				? options.entryChunkMultiplicator
+				: 10;
+		return (
+			chunkOverhead +
+			modulesSize *
+				(chunkA.canBeInitial() || chunkB.canBeInitial()
+					? entryChunkMultiplicator
+					: 1)
+		);
+	}
+
+	/**
+	 * @param {Chunk} chunkA chunk
+	 * @param {Chunk} chunkB chunk
+	 * @returns {boolean} true, if chunks could be integrated
+	 */
+	canChunksBeIntegrated(chunkA, chunkB) {
+		if (chunkA.preventIntegration || chunkB.preventIntegration) {
+			return false;
+		}
+
+		const hasRuntimeA = chunkA.hasRuntime();
+		const hasRuntimeB = chunkB.hasRuntime();
+
+		if (hasRuntimeA !== hasRuntimeB) {
+			if (hasRuntimeA) {
+				return isAvailableChunk(chunkA, chunkB);
+			} else if (hasRuntimeB) {
+				return isAvailableChunk(chunkB, chunkA);
+			}
+
+			return false;
+		}
+
+		if (
+			this.getNumberOfEntryModules(chunkA) > 0 ||
+			this.getNumberOfEntryModules(chunkB) > 0
+		) {
+			return false;
+		}
+
+		return true;
+	}
+
+	/**
+	 * @param {Chunk} chunkA the target chunk
+	 * @param {Chunk} chunkB the chunk to integrate
+	 * @returns {void}
+	 */
+	integrateChunks(chunkA, chunkB) {
+		// Decide for one name (deterministic)
+		if (chunkA.name && chunkB.name) {
+			if (
+				this.getNumberOfEntryModules(chunkA) > 0 ===
+				this.getNumberOfEntryModules(chunkB) > 0
+			) {
+				// When both chunks have entry modules or none have one, use
+				// shortest name
+				if (chunkA.name.length !== chunkB.name.length) {
+					chunkA.name =
+						chunkA.name.length < chunkB.name.length ? chunkA.name : chunkB.name;
+				} else {
+					chunkA.name = chunkA.name < chunkB.name ? chunkA.name : chunkB.name;
+				}
+			} else if (this.getNumberOfEntryModules(chunkB) > 0) {
+				// Pick the name of the chunk with the entry module
+				chunkA.name = chunkB.name;
+			}
+		} else if (chunkB.name) {
+			chunkA.name = chunkB.name;
+		}
+
+		// Merge id name hints
+		for (const hint of chunkB.idNameHints) {
+			chunkA.idNameHints.add(hint);
+		}
+
+		// Merge runtime
+		chunkA.runtime = mergeRuntime(chunkA.runtime, chunkB.runtime);
+
+		// getChunkModules is used here to create a clone, because disconnectChunkAndModule modifies
+		for (const module of this.getChunkModules(chunkB)) {
+			this.disconnectChunkAndModule(chunkB, module);
+			this.connectChunkAndModule(chunkA, module);
+		}
+
+		for (const [module, chunkGroup] of Array.from(
+			this.getChunkEntryModulesWithChunkGroupIterable(chunkB)
+		)) {
+			this.disconnectChunkAndEntryModule(chunkB, module);
+			this.connectChunkAndEntryModule(
+				chunkA,
+				module,
+				/** @type {Entrypoint} */
+				(chunkGroup)
+			);
+		}
+
+		for (const chunkGroup of chunkB.groupsIterable) {
+			chunkGroup.replaceChunk(chunkB, chunkA);
+			chunkA.addGroup(chunkGroup);
+			chunkB.removeGroup(chunkGroup);
+		}
+		ChunkGraph.clearChunkGraphForChunk(chunkB);
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk to upgrade
+	 * @returns {void}
+	 */
+	upgradeDependentToFullHashModules(chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		if (cgc.dependentHashModules === undefined) return;
+		if (cgc.fullHashModules === undefined) {
+			cgc.fullHashModules = cgc.dependentHashModules;
+		} else {
+			for (const m of cgc.dependentHashModules) {
+				cgc.fullHashModules.add(m);
+			}
+			cgc.dependentHashModules = undefined;
+		}
+	}
+
+	/**
+	 * @param {Module} module the checked module
+	 * @param {Chunk} chunk the checked chunk
+	 * @returns {boolean} true, if the chunk contains the module as entry
+	 */
+	isEntryModuleInChunk(module, chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		return cgc.entryModules.has(module);
+	}
+
+	/**
+	 * @param {Chunk} chunk the new chunk
+	 * @param {Module} module the entry module
+	 * @param {Entrypoint} entrypoint the chunk group which must be loaded before the module is executed
+	 * @returns {void}
+	 */
+	connectChunkAndEntryModule(chunk, module, entrypoint) {
+		const cgm = this._getChunkGraphModule(module);
+		const cgc = this._getChunkGraphChunk(chunk);
+		if (cgm.entryInChunks === undefined) {
+			cgm.entryInChunks = new Set();
+		}
+		cgm.entryInChunks.add(chunk);
+		cgc.entryModules.set(module, entrypoint);
+	}
+
+	/**
+	 * @param {Chunk} chunk the new chunk
+	 * @param {RuntimeModule} module the runtime module
+	 * @returns {void}
+	 */
+	connectChunkAndRuntimeModule(chunk, module) {
+		const cgm = this._getChunkGraphModule(module);
+		const cgc = this._getChunkGraphChunk(chunk);
+		if (cgm.runtimeInChunks === undefined) {
+			cgm.runtimeInChunks = new Set();
+		}
+		cgm.runtimeInChunks.add(chunk);
+		cgc.runtimeModules.add(module);
+	}
+
+	/**
+	 * @param {Chunk} chunk the new chunk
+	 * @param {RuntimeModule} module the module that require a full hash
+	 * @returns {void}
+	 */
+	addFullHashModuleToChunk(chunk, module) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		if (cgc.fullHashModules === undefined) cgc.fullHashModules = new Set();
+		cgc.fullHashModules.add(module);
+	}
+
+	/**
+	 * @param {Chunk} chunk the new chunk
+	 * @param {RuntimeModule} module the module that require a full hash
+	 * @returns {void}
+	 */
+	addDependentHashModuleToChunk(chunk, module) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		if (cgc.dependentHashModules === undefined)
+			cgc.dependentHashModules = new Set();
+		cgc.dependentHashModules.add(module);
+	}
+
+	/**
+	 * @param {Chunk} chunk the new chunk
+	 * @param {Module} module the entry module
+	 * @returns {void}
+	 */
+	disconnectChunkAndEntryModule(chunk, module) {
+		const cgm = this._getChunkGraphModule(module);
+		const cgc = this._getChunkGraphChunk(chunk);
+		/** @type {EntryInChunks} */
+		(cgm.entryInChunks).delete(chunk);
+		if (/** @type {EntryInChunks} */ (cgm.entryInChunks).size === 0) {
+			cgm.entryInChunks = undefined;
+		}
+		cgc.entryModules.delete(module);
+	}
+
+	/**
+	 * @param {Chunk} chunk the new chunk
+	 * @param {RuntimeModule} module the runtime module
+	 * @returns {void}
+	 */
+	disconnectChunkAndRuntimeModule(chunk, module) {
+		const cgm = this._getChunkGraphModule(module);
+		const cgc = this._getChunkGraphChunk(chunk);
+		/** @type {RuntimeInChunks} */
+		(cgm.runtimeInChunks).delete(chunk);
+		if (/** @type {RuntimeInChunks} */ (cgm.runtimeInChunks).size === 0) {
+			cgm.runtimeInChunks = undefined;
+		}
+		cgc.runtimeModules.delete(module);
+	}
+
+	/**
+	 * @param {Module} module the entry module, it will no longer be entry
+	 * @returns {void}
+	 */
+	disconnectEntryModule(module) {
+		const cgm = this._getChunkGraphModule(module);
+		for (const chunk of /** @type {EntryInChunks} */ (cgm.entryInChunks)) {
+			const cgc = this._getChunkGraphChunk(chunk);
+			cgc.entryModules.delete(module);
+		}
+		cgm.entryInChunks = undefined;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk, for which all entries will be removed
+	 * @returns {void}
+	 */
+	disconnectEntries(chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		for (const module of cgc.entryModules.keys()) {
+			const cgm = this._getChunkGraphModule(module);
+			/** @type {EntryInChunks} */
+			(cgm.entryInChunks).delete(chunk);
+			if (/** @type {EntryInChunks} */ (cgm.entryInChunks).size === 0) {
+				cgm.entryInChunks = undefined;
+			}
+		}
+		cgc.entryModules.clear();
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {number} the amount of entry modules in chunk
+	 */
+	getNumberOfEntryModules(chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		return cgc.entryModules.size;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {number} the amount of entry modules in chunk
+	 */
+	getNumberOfRuntimeModules(chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		return cgc.runtimeModules.size;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {Iterable} iterable of modules (do not modify)
+	 */
+	getChunkEntryModulesIterable(chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		return cgc.entryModules.keys();
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {Iterable} iterable of chunks
+	 */
+	getChunkEntryDependentChunksIterable(chunk) {
+		/** @type {Set} */
+		const set = new Set();
+		for (const chunkGroup of chunk.groupsIterable) {
+			if (chunkGroup instanceof Entrypoint) {
+				const entrypointChunk = chunkGroup.getEntrypointChunk();
+				const cgc = this._getChunkGraphChunk(entrypointChunk);
+				for (const chunkGroup of cgc.entryModules.values()) {
+					for (const c of chunkGroup.chunks) {
+						if (c !== chunk && c !== entrypointChunk && !c.hasRuntime()) {
+							set.add(c);
+						}
+					}
+				}
+			}
+		}
+
+		return set;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {boolean} true, when it has dependent chunks
+	 */
+	hasChunkEntryDependentChunks(chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		for (const chunkGroup of cgc.entryModules.values()) {
+			for (const c of chunkGroup.chunks) {
+				if (c !== chunk) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {Iterable} iterable of modules (do not modify)
+	 */
+	getChunkRuntimeModulesIterable(chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		return cgc.runtimeModules;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {RuntimeModule[]} array of modules in order of execution
+	 */
+	getChunkRuntimeModulesInOrder(chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		const array = Array.from(cgc.runtimeModules);
+		array.sort(
+			concatComparators(
+				compareSelect(r => /** @type {RuntimeModule} */ (r).stage, compareIds),
+				compareModulesByIdentifier
+			)
+		);
+		return array;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {Iterable | undefined} iterable of modules (do not modify)
+	 */
+	getChunkFullHashModulesIterable(chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		return cgc.fullHashModules;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {ReadonlySet | undefined} set of modules (do not modify)
+	 */
+	getChunkFullHashModulesSet(chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		return cgc.fullHashModules;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {Iterable | undefined} iterable of modules (do not modify)
+	 */
+	getChunkDependentHashModulesIterable(chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		return cgc.dependentHashModules;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {Iterable} iterable of modules (do not modify)
+	 */
+	getChunkEntryModulesWithChunkGroupIterable(chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		return cgc.entryModules;
+	}
+
+	/**
+	 * @param {AsyncDependenciesBlock} depBlock the async block
+	 * @returns {ChunkGroup | undefined} the chunk group
+	 */
+	getBlockChunkGroup(depBlock) {
+		return this._blockChunkGroups.get(depBlock);
+	}
+
+	/**
+	 * @param {AsyncDependenciesBlock} depBlock the async block
+	 * @param {ChunkGroup} chunkGroup the chunk group
+	 * @returns {void}
+	 */
+	connectBlockAndChunkGroup(depBlock, chunkGroup) {
+		this._blockChunkGroups.set(depBlock, chunkGroup);
+		chunkGroup.addBlock(depBlock);
+	}
+
+	/**
+	 * @param {ChunkGroup} chunkGroup the chunk group
+	 * @returns {void}
+	 */
+	disconnectChunkGroup(chunkGroup) {
+		for (const block of chunkGroup.blocksIterable) {
+			this._blockChunkGroups.delete(block);
+		}
+		// TODO refactor by moving blocks list into ChunkGraph
+		chunkGroup._blocks.clear();
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @returns {ModuleId | null} the id of the module
+	 */
+	getModuleId(module) {
+		const cgm = this._getChunkGraphModule(module);
+		return cgm.id;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {ModuleId} id the id of the module
+	 * @returns {void}
+	 */
+	setModuleId(module, id) {
+		const cgm = this._getChunkGraphModule(module);
+		cgm.id = id;
+	}
+
+	/**
+	 * @param {string} runtime runtime
+	 * @returns {string | number} the id of the runtime
+	 */
+	getRuntimeId(runtime) {
+		return /** @type {string | number} */ (this._runtimeIds.get(runtime));
+	}
+
+	/**
+	 * @param {string} runtime runtime
+	 * @param {string | number} id the id of the runtime
+	 * @returns {void}
+	 */
+	setRuntimeId(runtime, id) {
+		this._runtimeIds.set(runtime, id);
+	}
+
+	/**
+	 * @template T
+	 * @param {Module} module the module
+	 * @param {RuntimeSpecMap} hashes hashes data
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {T} hash
+	 */
+	_getModuleHashInfo(module, hashes, runtime) {
+		if (!hashes) {
+			throw new Error(
+				`Module ${module.identifier()} has no hash info for runtime ${runtimeToString(
+					runtime
+				)} (hashes not set at all)`
+			);
+		} else if (runtime === undefined) {
+			const hashInfoItems = new Set(hashes.values());
+			if (hashInfoItems.size !== 1) {
+				throw new Error(
+					`No unique hash info entry for unspecified runtime for ${module.identifier()} (existing runtimes: ${Array.from(
+						hashes.keys(),
+						r => runtimeToString(r)
+					).join(", ")}).
+Caller might not support runtime-dependent code generation (opt-out via optimization.usedExports: "global").`
+				);
+			}
+			return /** @type {T} */ (first(hashInfoItems));
+		} else {
+			const hashInfo = hashes.get(runtime);
+			if (!hashInfo) {
+				throw new Error(
+					`Module ${module.identifier()} has no hash info for runtime ${runtimeToString(
+						runtime
+					)} (available runtimes ${Array.from(
+						hashes.keys(),
+						runtimeToString
+					).join(", ")})`
+				);
+			}
+			return hashInfo;
+		}
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {boolean} true, if the module has hashes for this runtime
+	 */
+	hasModuleHashes(module, runtime) {
+		const cgm = this._getChunkGraphModule(module);
+		const hashes = /** @type {RuntimeSpecMap} */ (cgm.hashes);
+		return hashes && hashes.has(runtime);
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {string} hash
+	 */
+	getModuleHash(module, runtime) {
+		const cgm = this._getChunkGraphModule(module);
+		const hashes = /** @type {RuntimeSpecMap} */ (cgm.hashes);
+		return this._getModuleHashInfo(module, hashes, runtime).hash;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {string} hash
+	 */
+	getRenderedModuleHash(module, runtime) {
+		const cgm = this._getChunkGraphModule(module);
+		const hashes = /** @type {RuntimeSpecMap} */ (cgm.hashes);
+		return this._getModuleHashInfo(module, hashes, runtime).renderedHash;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @param {string} hash the full hash
+	 * @param {string} renderedHash the shortened hash for rendering
+	 * @returns {void}
+	 */
+	setModuleHashes(module, runtime, hash, renderedHash) {
+		const cgm = this._getChunkGraphModule(module);
+		if (cgm.hashes === undefined) {
+			cgm.hashes = new RuntimeSpecMap();
+		}
+		cgm.hashes.set(runtime, new ModuleHashInfo(hash, renderedHash));
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @param {Set} items runtime requirements to be added (ownership of this Set is given to ChunkGraph when transferOwnership not false)
+	 * @param {boolean} transferOwnership true: transfer ownership of the items object, false: items is immutable and shared and won't be modified
+	 * @returns {void}
+	 */
+	addModuleRuntimeRequirements(
+		module,
+		runtime,
+		items,
+		transferOwnership = true
+	) {
+		const cgm = this._getChunkGraphModule(module);
+		const runtimeRequirementsMap = cgm.runtimeRequirements;
+		if (runtimeRequirementsMap === undefined) {
+			const map = new RuntimeSpecMap();
+			// TODO avoid cloning item and track ownership instead
+			map.set(runtime, transferOwnership ? items : new Set(items));
+			cgm.runtimeRequirements = map;
+			return;
+		}
+		runtimeRequirementsMap.update(runtime, runtimeRequirements => {
+			if (runtimeRequirements === undefined) {
+				return transferOwnership ? items : new Set(items);
+			} else if (!transferOwnership || runtimeRequirements.size >= items.size) {
+				for (const item of items) runtimeRequirements.add(item);
+				return runtimeRequirements;
+			}
+
+			for (const item of runtimeRequirements) items.add(item);
+			return items;
+		});
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {Set} items runtime requirements to be added (ownership of this Set is given to ChunkGraph)
+	 * @returns {void}
+	 */
+	addChunkRuntimeRequirements(chunk, items) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		const runtimeRequirements = cgc.runtimeRequirements;
+		if (runtimeRequirements === undefined) {
+			cgc.runtimeRequirements = items;
+		} else if (runtimeRequirements.size >= items.size) {
+			for (const item of items) runtimeRequirements.add(item);
+		} else {
+			for (const item of runtimeRequirements) items.add(item);
+			cgc.runtimeRequirements = items;
+		}
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {Iterable} items runtime requirements to be added
+	 * @returns {void}
+	 */
+	addTreeRuntimeRequirements(chunk, items) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		const runtimeRequirements = cgc.runtimeRequirementsInTree;
+		for (const item of items) runtimeRequirements.add(item);
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {ReadOnlyRuntimeRequirements} runtime requirements
+	 */
+	getModuleRuntimeRequirements(module, runtime) {
+		const cgm = this._getChunkGraphModule(module);
+		const runtimeRequirements =
+			cgm.runtimeRequirements && cgm.runtimeRequirements.get(runtime);
+		return runtimeRequirements === undefined ? EMPTY_SET : runtimeRequirements;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {ReadOnlyRuntimeRequirements} runtime requirements
+	 */
+	getChunkRuntimeRequirements(chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		const runtimeRequirements = cgc.runtimeRequirements;
+		return runtimeRequirements === undefined ? EMPTY_SET : runtimeRequirements;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @param {boolean} withConnections include connections
+	 * @returns {string} hash
+	 */
+	getModuleGraphHash(module, runtime, withConnections = true) {
+		const cgm = this._getChunkGraphModule(module);
+		return withConnections
+			? this._getModuleGraphHashWithConnections(cgm, module, runtime)
+			: this._getModuleGraphHashBigInt(cgm, module, runtime).toString(16);
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @param {boolean} withConnections include connections
+	 * @returns {bigint} hash
+	 */
+	getModuleGraphHashBigInt(module, runtime, withConnections = true) {
+		const cgm = this._getChunkGraphModule(module);
+		return withConnections
+			? BigInt(
+					`0x${this._getModuleGraphHashWithConnections(cgm, module, runtime)}`
+				)
+			: this._getModuleGraphHashBigInt(cgm, module, runtime);
+	}
+
+	/**
+	 * @param {ChunkGraphModule} cgm the ChunkGraphModule
+	 * @param {Module} module the module
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {bigint} hash as big int
+	 */
+	_getModuleGraphHashBigInt(cgm, module, runtime) {
+		if (cgm.graphHashes === undefined) {
+			cgm.graphHashes = new RuntimeSpecMap();
+		}
+		const graphHash = cgm.graphHashes.provide(runtime, () => {
+			const hash = createHash(this._hashFunction);
+			hash.update(`${cgm.id}${this.moduleGraph.isAsync(module)}`);
+			const sourceTypes = this._getOverwrittenModuleSourceTypes(module);
+			if (sourceTypes !== undefined) {
+				for (const type of sourceTypes) hash.update(type);
+			}
+			this.moduleGraph.getExportsInfo(module).updateHash(hash, runtime);
+			return BigInt(`0x${/** @type {string} */ (hash.digest("hex"))}`);
+		});
+		return graphHash;
+	}
+
+	/**
+	 * @param {ChunkGraphModule} cgm the ChunkGraphModule
+	 * @param {Module} module the module
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {string} hash
+	 */
+	_getModuleGraphHashWithConnections(cgm, module, runtime) {
+		if (cgm.graphHashesWithConnections === undefined) {
+			cgm.graphHashesWithConnections = new RuntimeSpecMap();
+		}
+
+		/**
+		 * @param {ConnectionState} state state
+		 * @returns {"F" | "T" | "O"} result
+		 */
+		const activeStateToString = state => {
+			if (state === false) return "F";
+			if (state === true) return "T";
+			if (state === ModuleGraphConnection.TRANSITIVE_ONLY) return "O";
+			throw new Error("Not implemented active state");
+		};
+		const strict = module.buildMeta && module.buildMeta.strictHarmonyModule;
+		return cgm.graphHashesWithConnections.provide(runtime, () => {
+			const graphHash = this._getModuleGraphHashBigInt(
+				cgm,
+				module,
+				runtime
+			).toString(16);
+			const connections = this.moduleGraph.getOutgoingConnections(module);
+			/** @type {Set} */
+			const activeNamespaceModules = new Set();
+			/** @type {Map>} */
+			const connectedModules = new Map();
+			/**
+			 * @param {ModuleGraphConnection} connection connection
+			 * @param {string} stateInfo state info
+			 */
+			const processConnection = (connection, stateInfo) => {
+				const module = connection.module;
+				stateInfo += module.getExportsType(this.moduleGraph, strict);
+				// cspell:word Tnamespace
+				if (stateInfo === "Tnamespace") activeNamespaceModules.add(module);
+				else {
+					const oldModule = connectedModules.get(stateInfo);
+					if (oldModule === undefined) {
+						connectedModules.set(stateInfo, module);
+					} else if (oldModule instanceof Set) {
+						oldModule.add(module);
+					} else if (oldModule !== module) {
+						connectedModules.set(stateInfo, new Set([oldModule, module]));
+					}
+				}
+			};
+			if (runtime === undefined || typeof runtime === "string") {
+				for (const connection of connections) {
+					const state = connection.getActiveState(runtime);
+					if (state === false) continue;
+					processConnection(connection, state === true ? "T" : "O");
+				}
+			} else {
+				// cspell:word Tnamespace
+				for (const connection of connections) {
+					const states = new Set();
+					let stateInfo = "";
+					forEachRuntime(
+						runtime,
+						runtime => {
+							const state = connection.getActiveState(runtime);
+							states.add(state);
+							stateInfo += activeStateToString(state) + runtime;
+						},
+						true
+					);
+					if (states.size === 1) {
+						const state = first(states);
+						if (state === false) continue;
+						stateInfo = activeStateToString(state);
+					}
+					processConnection(connection, stateInfo);
+				}
+			}
+			// cspell:word Tnamespace
+			if (activeNamespaceModules.size === 0 && connectedModules.size === 0)
+				return graphHash;
+			const connectedModulesInOrder =
+				connectedModules.size > 1
+					? Array.from(connectedModules).sort(([a], [b]) => (a < b ? -1 : 1))
+					: connectedModules;
+			const hash = createHash(this._hashFunction);
+			/**
+			 * @param {Module} module module
+			 */
+			const addModuleToHash = module => {
+				hash.update(
+					this._getModuleGraphHashBigInt(
+						this._getChunkGraphModule(module),
+						module,
+						runtime
+					).toString(16)
+				);
+			};
+			/**
+			 * @param {Set} modules modules
+			 */
+			const addModulesToHash = modules => {
+				let xor = ZERO_BIG_INT;
+				for (const m of modules) {
+					xor =
+						xor ^
+						this._getModuleGraphHashBigInt(
+							this._getChunkGraphModule(m),
+							m,
+							runtime
+						);
+				}
+				hash.update(xor.toString(16));
+			};
+			if (activeNamespaceModules.size === 1)
+				addModuleToHash(
+					/** @type {Module} */ (activeNamespaceModules.values().next().value)
+				);
+			else if (activeNamespaceModules.size > 1)
+				addModulesToHash(activeNamespaceModules);
+			for (const [stateInfo, modules] of connectedModulesInOrder) {
+				hash.update(stateInfo);
+				if (modules instanceof Set) {
+					addModulesToHash(modules);
+				} else {
+					addModuleToHash(modules);
+				}
+			}
+			hash.update(graphHash);
+			return /** @type {string} */ (hash.digest("hex"));
+		});
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {ReadOnlyRuntimeRequirements} runtime requirements
+	 */
+	getTreeRuntimeRequirements(chunk) {
+		const cgc = this._getChunkGraphChunk(chunk);
+		return cgc.runtimeRequirementsInTree;
+	}
+
+	// TODO remove in webpack 6
+	/**
+	 * @param {Module} module the module
+	 * @param {string} deprecateMessage message for the deprecation message
+	 * @param {string} deprecationCode code for the deprecation
+	 * @returns {ChunkGraph} the chunk graph
+	 */
+	static getChunkGraphForModule(module, deprecateMessage, deprecationCode) {
+		const fn = deprecateGetChunkGraphForModuleMap.get(deprecateMessage);
+		if (fn) return fn(module);
+		const newFn = util.deprecate(
+			/**
+			 * @param {Module} module the module
+			 * @returns {ChunkGraph} the chunk graph
+			 */
+			module => {
+				const chunkGraph = chunkGraphForModuleMap.get(module);
+				if (!chunkGraph)
+					throw new Error(
+						`${
+							deprecateMessage
+						}: There was no ChunkGraph assigned to the Module for backward-compat (Use the new API)`
+					);
+				return chunkGraph;
+			},
+			`${deprecateMessage}: Use new ChunkGraph API`,
+			deprecationCode
+		);
+		deprecateGetChunkGraphForModuleMap.set(deprecateMessage, newFn);
+		return newFn(module);
+	}
+
+	// TODO remove in webpack 6
+	/**
+	 * @param {Module} module the module
+	 * @param {ChunkGraph} chunkGraph the chunk graph
+	 * @returns {void}
+	 */
+	static setChunkGraphForModule(module, chunkGraph) {
+		chunkGraphForModuleMap.set(module, chunkGraph);
+	}
+
+	// TODO remove in webpack 6
+	/**
+	 * @param {Module} module the module
+	 * @returns {void}
+	 */
+	static clearChunkGraphForModule(module) {
+		chunkGraphForModuleMap.delete(module);
+	}
+
+	// TODO remove in webpack 6
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {string} deprecateMessage message for the deprecation message
+	 * @param {string} deprecationCode code for the deprecation
+	 * @returns {ChunkGraph} the chunk graph
+	 */
+	static getChunkGraphForChunk(chunk, deprecateMessage, deprecationCode) {
+		const fn = deprecateGetChunkGraphForChunkMap.get(deprecateMessage);
+		if (fn) return fn(chunk);
+		const newFn = util.deprecate(
+			/**
+			 * @param {Chunk} chunk the chunk
+			 * @returns {ChunkGraph} the chunk graph
+			 */
+			chunk => {
+				const chunkGraph = chunkGraphForChunkMap.get(chunk);
+				if (!chunkGraph)
+					throw new Error(
+						`${
+							deprecateMessage
+						}There was no ChunkGraph assigned to the Chunk for backward-compat (Use the new API)`
+					);
+				return chunkGraph;
+			},
+			`${deprecateMessage}: Use new ChunkGraph API`,
+			deprecationCode
+		);
+		deprecateGetChunkGraphForChunkMap.set(deprecateMessage, newFn);
+		return newFn(chunk);
+	}
+
+	// TODO remove in webpack 6
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {ChunkGraph} chunkGraph the chunk graph
+	 * @returns {void}
+	 */
+	static setChunkGraphForChunk(chunk, chunkGraph) {
+		chunkGraphForChunkMap.set(chunk, chunkGraph);
+	}
+
+	// TODO remove in webpack 6
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {void}
+	 */
+	static clearChunkGraphForChunk(chunk) {
+		chunkGraphForChunkMap.delete(chunk);
+	}
+}
+
+// TODO remove in webpack 6
+/** @type {WeakMap} */
+const chunkGraphForModuleMap = new WeakMap();
+
+// TODO remove in webpack 6
+/** @type {WeakMap} */
+const chunkGraphForChunkMap = new WeakMap();
+
+// TODO remove in webpack 6
+/** @type {Map ChunkGraph>} */
+const deprecateGetChunkGraphForModuleMap = new Map();
+
+// TODO remove in webpack 6
+/** @type {Map ChunkGraph>} */
+const deprecateGetChunkGraphForChunkMap = new Map();
+
+module.exports = ChunkGraph;
diff --git a/lib/ChunkGroup.js b/lib/ChunkGroup.js
index 031fc14e45d..2fcb71d1d9b 100644
--- a/lib/ChunkGroup.js
+++ b/lib/ChunkGroup.js
@@ -2,17 +2,36 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const util = require("util");
 const SortableSet = require("./util/SortableSet");
-const compareLocations = require("./compareLocations");
+const {
+	compareLocations,
+	compareChunks,
+	compareIterables
+} = require("./util/comparators");
 
+/** @typedef {import("./AsyncDependenciesBlock")} AsyncDependenciesBlock */
 /** @typedef {import("./Chunk")} Chunk */
+/** @typedef {import("./ChunkGraph")} ChunkGraph */
+/** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("./Entrypoint")} Entrypoint */
 /** @typedef {import("./Module")} Module */
-/** @typedef {import("./ModuleReason")} ModuleReason */
+/** @typedef {import("./ModuleGraph")} ModuleGraph */
+
+/** @typedef {{id: number}} HasId */
+/** @typedef {{module: Module | null, loc: DependencyLocation, request: string}} OriginRecord */
+
+/**
+ * @typedef {object} RawChunkGroupOptions
+ * @property {number=} preloadOrder
+ * @property {number=} prefetchOrder
+ * @property {("low" | "high" | "auto")=} fetchPriority
+ */
 
-/** @typedef {{module: Module, loc: TODO, request: string}} OriginRecord */
-/** @typedef {string|{name: string}} ChunkGroupOptions */
+/** @typedef {RawChunkGroupOptions & { name?: string | null }} ChunkGroupOptions */
 
 let debugId = 5000;
 
@@ -51,7 +70,7 @@ const sortOrigin = (a, b) => {
 class ChunkGroup {
 	/**
 	 * Creates an instance of ChunkGroup.
-	 * @param {ChunkGroupOptions=} options chunk group options passed to chunkGroup
+	 * @param {string | ChunkGroupOptions=} options chunk group options passed to chunkGroup
 	 */
 	constructor(options) {
 		if (typeof options === "string") {
@@ -61,21 +80,32 @@ class ChunkGroup {
 		}
 		/** @type {number} */
 		this.groupDebugId = debugId++;
-		this.options = options;
+		this.options = /** @type {ChunkGroupOptions} */ (options);
 		/** @type {SortableSet} */
 		this._children = new SortableSet(undefined, sortById);
+		/** @type {SortableSet} */
 		this._parents = new SortableSet(undefined, sortById);
+		/** @type {SortableSet} */
+		this._asyncEntrypoints = new SortableSet(undefined, sortById);
 		this._blocks = new SortableSet();
 		/** @type {Chunk[]} */
 		this.chunks = [];
 		/** @type {OriginRecord[]} */
 		this.origins = [];
-		/** Indicies in top-down order */
-		/** @private @type {Map} */
-		this._moduleIndicies = new Map();
-		/** Indicies in bottom-up order */
-		/** @private @type {Map} */
-		this._moduleIndicies2 = new Map();
+		/** Indices in top-down order */
+		/**
+		 * @private
+		 * @type {Map}
+		 */
+		this._modulePreOrderIndices = new Map();
+		/** Indices in bottom-up order */
+		/**
+		 * @private
+		 * @type {Map}
+		 */
+		this._modulePostOrderIndices = new Map();
+		/** @type {number | undefined} */
+		this.index = undefined;
 	}
 
 	/**
@@ -84,12 +114,18 @@ class ChunkGroup {
 	 * @returns {void}
 	 */
 	addOptions(options) {
-		for (const key of Object.keys(options)) {
+		for (const _key of Object.keys(options)) {
+			const key = /** @type {keyof ChunkGroupOptions} */ (_key);
 			if (this.options[key] === undefined) {
-				this.options[key] = options[key];
+				/** @type {TODO} */
+				(this.options)[key] = options[key];
 			} else if (this.options[key] !== options[key]) {
 				if (key.endsWith("Order")) {
-					this.options[key] = Math.max(this.options[key], options[key]);
+					/** @type {TODO} */
+					(this.options)[key] = Math.max(
+						/** @type {number} */ (this.options[key]),
+						/** @type {number} */ (options[key])
+					);
 				} else {
 					throw new Error(
 						`ChunkGroup.addOptions: No option merge strategy for ${key}`
@@ -101,7 +137,7 @@ class ChunkGroup {
 
 	/**
 	 * returns the name of current ChunkGroup
-	 * @returns {string|undefined} returns the ChunkGroup name
+	 * @returns {string | null | undefined} returns the ChunkGroup name
 	 */
 	get name() {
 		return this.options.name;
@@ -109,13 +145,14 @@ class ChunkGroup {
 
 	/**
 	 * sets a new name for current ChunkGroup
-	 * @param {string} value the new name for ChunkGroup
+	 * @param {string | undefined} value the new name for ChunkGroup
 	 * @returns {void}
 	 */
 	set name(value) {
 		this.options.name = value;
 	}
 
+	/* istanbul ignore next */
 	/**
 	 * get a uniqueId for ChunkGroup, made up of its member Chunk debugId's
 	 * @returns {string} a unique concatenation of chunk debugId's
@@ -174,7 +211,7 @@ class ChunkGroup {
 	/**
 	 * add a chunk into ChunkGroup. Is pushed on or prepended
 	 * @param {Chunk} chunk chunk being pushed into ChunkGroupS
-	 * @returns {boolean} returns true if chunk addition was ssuccesful.
+	 * @returns {boolean} returns true if chunk addition was successful.
 	 */
 	pushChunk(chunk) {
 		const oldIdx = this.chunks.indexOf(chunk);
@@ -187,8 +224,8 @@ class ChunkGroup {
 
 	/**
 	 * @param {Chunk} oldChunk chunk to be replaced
-	 * @param {Chunk} newChunk New chunkt that will be replaced
-	 * @returns {boolean} rerturns true for
+	 * @param {Chunk} newChunk New chunk that will be replaced with
+	 * @returns {boolean | undefined} returns true if the replacement was successful
 	 */
 	replaceChunk(oldChunk, newChunk) {
 		const oldIdx = this.chunks.indexOf(oldChunk);
@@ -208,6 +245,10 @@ class ChunkGroup {
 		}
 	}
 
+	/**
+	 * @param {Chunk} chunk chunk to remove
+	 * @returns {boolean} returns true if chunk was removed
+	 */
 	removeChunk(chunk) {
 		const idx = this.chunks.indexOf(chunk);
 		if (idx >= 0) {
@@ -217,18 +258,26 @@ class ChunkGroup {
 		return false;
 	}
 
+	/**
+	 * @returns {boolean} true, when this chunk group will be loaded on initial page load
+	 */
 	isInitial() {
 		return false;
 	}
 
-	addChild(chunk) {
-		if (this._children.has(chunk)) {
-			return false;
-		}
-		this._children.add(chunk);
-		return true;
+	/**
+	 * @param {ChunkGroup} group chunk group to add
+	 * @returns {boolean} returns true if chunk group was added
+	 */
+	addChild(group) {
+		const size = this._children.size;
+		this._children.add(group);
+		return size !== this._children.size;
 	}
 
+	/**
+	 * @returns {ChunkGroup[]} returns the children of this group
+	 */
 	getChildren() {
 		return this._children.getFromCache(getArray);
 	}
@@ -241,16 +290,24 @@ class ChunkGroup {
 		return this._children;
 	}
 
-	removeChild(chunk) {
-		if (!this._children.has(chunk)) {
+	/**
+	 * @param {ChunkGroup} group the chunk group to remove
+	 * @returns {boolean} returns true if the chunk group was removed
+	 */
+	removeChild(group) {
+		if (!this._children.has(group)) {
 			return false;
 		}
 
-		this._children.delete(chunk);
-		chunk.removeParent(this);
+		this._children.delete(group);
+		group.removeParent(this);
 		return true;
 	}
 
+	/**
+	 * @param {ChunkGroup} parentChunk the parent group to be added into
+	 * @returns {boolean} returns true if this chunk group was added to the parent group
+	 */
 	addParent(parentChunk) {
 		if (!this._parents.has(parentChunk)) {
 			this._parents.add(parentChunk);
@@ -259,21 +316,21 @@ class ChunkGroup {
 		return false;
 	}
 
+	/**
+	 * @returns {ChunkGroup[]} returns the parents of this group
+	 */
 	getParents() {
 		return this._parents.getFromCache(getArray);
 	}
 
-	setParents(newParents) {
-		this._parents.clear();
-		for (const p of newParents) {
-			this._parents.add(p);
-		}
-	}
-
 	getNumberOfParents() {
 		return this._parents.size;
 	}
 
+	/**
+	 * @param {ChunkGroup} parent the parent group
+	 * @returns {boolean} returns true if the parent group contains this group
+	 */
 	hasParent(parent) {
 		return this._parents.has(parent);
 	}
@@ -282,16 +339,34 @@ class ChunkGroup {
 		return this._parents;
 	}
 
-	removeParent(chunk) {
-		if (this._parents.delete(chunk)) {
-			chunk.removeChunk(this);
+	/**
+	 * @param {ChunkGroup} chunkGroup the parent group
+	 * @returns {boolean} returns true if this group has been removed from the parent
+	 */
+	removeParent(chunkGroup) {
+		if (this._parents.delete(chunkGroup)) {
+			chunkGroup.removeChild(this);
 			return true;
 		}
 		return false;
 	}
 
 	/**
-	 * @returns {Array} - an array containing the blocks
+	 * @param {Entrypoint} entrypoint entrypoint to add
+	 * @returns {boolean} returns true if entrypoint was added
+	 */
+	addAsyncEntrypoint(entrypoint) {
+		const size = this._asyncEntrypoints.size;
+		this._asyncEntrypoints.add(entrypoint);
+		return size !== this._asyncEntrypoints.size;
+	}
+
+	get asyncEntrypointsIterable() {
+		return this._asyncEntrypoints;
+	}
+
+	/**
+	 * @returns {Array} an array containing the blocks
 	 */
 	getBlocks() {
 		return this._blocks.getFromCache(getArray);
@@ -301,14 +376,25 @@ class ChunkGroup {
 		return this._blocks.size;
 	}
 
+	/**
+	 * @param {AsyncDependenciesBlock} block block
+	 * @returns {boolean} true, if block exists
+	 */
 	hasBlock(block) {
 		return this._blocks.has(block);
 	}
 
+	/**
+	 * @returns {Iterable} blocks
+	 */
 	get blocksIterable() {
 		return this._blocks;
 	}
 
+	/**
+	 * @param {AsyncDependenciesBlock} block a block
+	 * @returns {boolean} false, if block was already added
+	 */
 	addBlock(block) {
 		if (!this._blocks.has(block)) {
 			this._blocks.add(block);
@@ -317,6 +403,12 @@ class ChunkGroup {
 		return false;
 	}
 
+	/**
+	 * @param {Module | null} module origin module
+	 * @param {DependencyLocation} loc location of the reference in the origin module
+	 * @param {string} request request name of the reference
+	 * @returns {void}
+	 */
 	addOrigin(module, loc, request) {
 		this.origins.push({
 			module,
@@ -325,13 +417,9 @@ class ChunkGroup {
 		});
 	}
 
-	containsModule(module) {
-		for (const chunk of this.chunks) {
-			if (chunk.containsModule(module)) return true;
-		}
-		return false;
-	}
-
+	/**
+	 * @returns {string[]} the files contained this chunk group
+	 */
 	getFiles() {
 		const files = new Set();
 
@@ -345,10 +433,9 @@ class ChunkGroup {
 	}
 
 	/**
-	 * @param {ModuleReason} reason reason for removing ChunkGroup
 	 * @returns {void}
 	 */
-	remove(reason) {
+	remove() {
 		// cleanup parents
 		for (const parentChunkGroup of this._parents) {
 			// remove this chunk from its parents
@@ -369,7 +456,7 @@ class ChunkGroup {
 
 		/**
 		 * we need to iterate again over the children
-		 * to remove this from the childs parents.
+		 * to remove this from the child's parents.
 		 * This can not be done in the above loop
 		 * as it is not guaranteed that `this._parents` contains anything.
 		 */
@@ -378,11 +465,6 @@ class ChunkGroup {
 			chunkGroup._parents.delete(this);
 		}
 
-		// cleanup blocks
-		for (const block of this._blocks) {
-			block.chunkGroup = null;
-		}
-
 		// remove chunks
 		for (const chunk of this.chunks) {
 			chunk.removeGroup(this);
@@ -391,62 +473,58 @@ class ChunkGroup {
 
 	sortItems() {
 		this.origins.sort(sortOrigin);
-		this._parents.sort();
-		this._children.sort();
 	}
 
 	/**
 	 * Sorting predicate which allows current ChunkGroup to be compared against another.
 	 * Sorting values are based off of number of chunks in ChunkGroup.
-	 *
+	 * @param {ChunkGraph} chunkGraph the chunk graph
 	 * @param {ChunkGroup} otherGroup the chunkGroup to compare this against
 	 * @returns {-1|0|1} sort position for comparison
 	 */
-	compareTo(otherGroup) {
+	compareTo(chunkGraph, otherGroup) {
 		if (this.chunks.length > otherGroup.chunks.length) return -1;
 		if (this.chunks.length < otherGroup.chunks.length) return 1;
-		const a = this.chunks[Symbol.iterator]();
-		const b = otherGroup.chunks[Symbol.iterator]();
-		// eslint-disable-next-line no-constant-condition
-		while (true) {
-			const aItem = a.next();
-			const bItem = b.next();
-			if (aItem.done) return 0;
-			const cmp = aItem.value.compareTo(bItem.value);
-			if (cmp !== 0) return cmp;
-		}
+		return compareIterables(compareChunks(chunkGraph))(
+			this.chunks,
+			otherGroup.chunks
+		);
 	}
 
-	getChildrenByOrders() {
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @param {ChunkGraph} chunkGraph the chunk graph
+	 * @returns {Record} mapping from children type to ordered list of ChunkGroups
+	 */
+	getChildrenByOrders(moduleGraph, chunkGraph) {
+		/** @type {Map} */
 		const lists = new Map();
 		for (const childGroup of this._children) {
-			// TODO webpack 5 remove this check for options
-			if (typeof childGroup.options === "object") {
-				for (const key of Object.keys(childGroup.options)) {
-					if (key.endsWith("Order")) {
-						const name = key.substr(0, key.length - "Order".length);
-						let list = lists.get(name);
-						if (list === undefined) {
-							lists.set(name, (list = []));
-						}
-						list.push({
-							order: childGroup.options[key],
-							group: childGroup
-						});
+			for (const key of Object.keys(childGroup.options)) {
+				if (key.endsWith("Order")) {
+					const name = key.slice(0, key.length - "Order".length);
+					let list = lists.get(name);
+					if (list === undefined) {
+						lists.set(name, (list = []));
 					}
+					list.push({
+						order:
+							/** @type {number} */
+							(
+								childGroup.options[/** @type {keyof ChunkGroupOptions} */ (key)]
+							),
+						group: childGroup
+					});
 				}
 			}
 		}
+		/** @type {Record} */
 		const result = Object.create(null);
 		for (const [name, list] of lists) {
 			list.sort((a, b) => {
 				const cmp = b.order - a.order;
 				if (cmp !== 0) return cmp;
-				// TODO webpack 5 remove this check of compareTo
-				if (a.group.compareTo) {
-					return a.group.compareTo(b.group);
-				}
-				return 0;
+				return a.group.compareTo(chunkGraph, b.group);
 			});
 			result[name] = list.map(i => i.group);
 		}
@@ -459,17 +537,17 @@ class ChunkGroup {
 	 * @param {number} index the index of the module
 	 * @returns {void}
 	 */
-	setModuleIndex(module, index) {
-		this._moduleIndicies.set(module, index);
+	setModulePreOrderIndex(module, index) {
+		this._modulePreOrderIndices.set(module, index);
 	}
 
 	/**
 	 * Gets the top-down index of a module in this ChunkGroup
 	 * @param {Module} module the module
-	 * @returns {number} index
+	 * @returns {number | undefined} index
 	 */
-	getModuleIndex(module) {
-		return this._moduleIndicies.get(module);
+	getModulePreOrderIndex(module) {
+		return this._modulePreOrderIndices.get(module);
 	}
 
 	/**
@@ -478,40 +556,49 @@ class ChunkGroup {
 	 * @param {number} index the index of the module
 	 * @returns {void}
 	 */
-	setModuleIndex2(module, index) {
-		this._moduleIndicies2.set(module, index);
+	setModulePostOrderIndex(module, index) {
+		this._modulePostOrderIndices.set(module, index);
 	}
 
 	/**
 	 * Gets the bottom-up index of a module in this ChunkGroup
 	 * @param {Module} module the module
-	 * @returns {number} index
+	 * @returns {number | undefined} index
 	 */
-	getModuleIndex2(module) {
-		return this._moduleIndicies2.get(module);
+	getModulePostOrderIndex(module) {
+		return this._modulePostOrderIndices.get(module);
 	}
 
+	/* istanbul ignore next */
 	checkConstraints() {
 		const chunk = this;
 		for (const child of chunk._children) {
 			if (!child._parents.has(chunk)) {
 				throw new Error(
-					`checkConstraints: child missing parent ${chunk.debugId} -> ${
-						child.debugId
-					}`
+					`checkConstraints: child missing parent ${chunk.debugId} -> ${child.debugId}`
 				);
 			}
 		}
 		for (const parentChunk of chunk._parents) {
 			if (!parentChunk._children.has(chunk)) {
 				throw new Error(
-					`checkConstraints: parent missing child ${parentChunk.debugId} <- ${
-						chunk.debugId
-					}`
+					`checkConstraints: parent missing child ${parentChunk.debugId} <- ${chunk.debugId}`
 				);
 			}
 		}
 	}
 }
 
+ChunkGroup.prototype.getModuleIndex = util.deprecate(
+	ChunkGroup.prototype.getModulePreOrderIndex,
+	"ChunkGroup.getModuleIndex was renamed to getModulePreOrderIndex",
+	"DEP_WEBPACK_CHUNK_GROUP_GET_MODULE_INDEX"
+);
+
+ChunkGroup.prototype.getModuleIndex2 = util.deprecate(
+	ChunkGroup.prototype.getModulePostOrderIndex,
+	"ChunkGroup.getModuleIndex2 was renamed to getModulePostOrderIndex",
+	"DEP_WEBPACK_CHUNK_GROUP_GET_MODULE_INDEX_2"
+);
+
 module.exports = ChunkGroup;
diff --git a/lib/ChunkRenderError.js b/lib/ChunkRenderError.js
index 0d0eb2cbc53..fce913f171a 100644
--- a/lib/ChunkRenderError.js
+++ b/lib/ChunkRenderError.js
@@ -2,6 +2,7 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const WebpackError = require("./WebpackError");
@@ -24,8 +25,6 @@ class ChunkRenderError extends WebpackError {
 		this.details = error.stack;
 		this.file = file;
 		this.chunk = chunk;
-
-		Error.captureStackTrace(this, this.constructor);
 	}
 }
 
diff --git a/lib/ChunkTemplate.js b/lib/ChunkTemplate.js
index 65861af49f4..f76557e9e15 100644
--- a/lib/ChunkTemplate.js
+++ b/lib/ChunkTemplate.js
@@ -2,86 +2,180 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const { Tapable, SyncWaterfallHook, SyncHook } = require("tapable");
+const util = require("util");
+const memoize = require("./util/memoize");
 
-/** @typedef {import("./ModuleTemplate")} ModuleTemplate */
+/** @typedef {import("tapable").Tap} Tap */
+/** @typedef {import("../declarations/WebpackOptions").Output} OutputOptions */
 /** @typedef {import("./Chunk")} Chunk */
-/** @typedef {import("./Module")} Module} */
-/** @typedef {import("./Dependency").DependencyTemplate} DependencyTemplate} */
-/** @typedef {import("./util/createHash").Hash} Hash} */
-
+/** @typedef {import("./Compilation")} Compilation */
+/** @typedef {import("./Compilation").ChunkHashContext} ChunkHashContext */
+/** @typedef {import("./Compilation").Hash} Hash */
+/** @typedef {import("./Compilation").RenderManifestEntry} RenderManifestEntry */
+/** @typedef {import("./Compilation").RenderManifestOptions} RenderManifestOptions */
+/** @typedef {import("./Compilation").Source} Source */
+/** @typedef {import("./ModuleTemplate")} ModuleTemplate */
+/** @typedef {import("./javascript/JavascriptModulesPlugin").RenderContext} RenderContext */
 /**
- * @typedef {Object} RenderManifestOptions
- * @property {Chunk} chunk the chunk used to render
- * @property {string} hash
- * @property {string} fullHash
- * @property {TODO} outputOptions
- * @property {{javascript: ModuleTemplate, webassembly: ModuleTemplate}} moduleTemplates
- * @property {Map} dependencyTemplates
+ * @template T
+ * @typedef {import("tapable").IfSet} IfSet
  */
 
-module.exports = class ChunkTemplate extends Tapable {
-	constructor(outputOptions) {
-		super();
-		this.outputOptions = outputOptions || {};
-		this.hooks = {
-			/** @type {SyncWaterfallHook} */
-			renderManifest: new SyncWaterfallHook(["result", "options"]),
-			modules: new SyncWaterfallHook([
-				"source",
-				"chunk",
-				"moduleTemplate",
-				"dependencyTemplates"
-			]),
-			render: new SyncWaterfallHook([
-				"source",
-				"chunk",
-				"moduleTemplate",
-				"dependencyTemplates"
-			]),
-			renderWithEntry: new SyncWaterfallHook(["source", "chunk"]),
-			hash: new SyncHook(["hash"]),
-			hashForChunk: new SyncHook(["hash", "chunk"])
-		};
-	}
+const getJavascriptModulesPlugin = memoize(() =>
+	require("./javascript/JavascriptModulesPlugin")
+);
 
+// TODO webpack 6 remove this class
+class ChunkTemplate {
 	/**
-	 *
-	 * @param {RenderManifestOptions} options render manifest options
-	 * @returns {TODO[]} returns render manifest
+	 * @param {OutputOptions} outputOptions output options
+	 * @param {Compilation} compilation the compilation
 	 */
-	getRenderManifest(options) {
-		const result = [];
-
-		this.hooks.renderManifest.call(result, options);
-
-		return result;
+	constructor(outputOptions, compilation) {
+		this._outputOptions = outputOptions || {};
+		this.hooks = Object.freeze({
+			renderManifest: {
+				tap: util.deprecate(
+					/**
+					 * @template AdditionalOptions
+					 * @param {string | Tap & IfSet} options options
+					 * @param {(renderManifestEntries: RenderManifestEntry[], renderManifestOptions: RenderManifestOptions) => RenderManifestEntry[]} fn function
+					 */
+					(options, fn) => {
+						compilation.hooks.renderManifest.tap(
+							options,
+							(entries, options) => {
+								if (options.chunk.hasRuntime()) return entries;
+								return fn(entries, options);
+							}
+						);
+					},
+					"ChunkTemplate.hooks.renderManifest is deprecated (use Compilation.hooks.renderManifest instead)",
+					"DEP_WEBPACK_CHUNK_TEMPLATE_RENDER_MANIFEST"
+				)
+			},
+			modules: {
+				tap: util.deprecate(
+					/**
+					 * @template AdditionalOptions
+					 * @param {string | Tap & IfSet} options options
+					 * @param {(source: Source, moduleTemplate: ModuleTemplate, renderContext: RenderContext) => Source} fn function
+					 */
+					(options, fn) => {
+						getJavascriptModulesPlugin()
+							.getCompilationHooks(compilation)
+							.renderChunk.tap(options, (source, renderContext) =>
+								fn(
+									source,
+									compilation.moduleTemplates.javascript,
+									renderContext
+								)
+							);
+					},
+					"ChunkTemplate.hooks.modules is deprecated (use JavascriptModulesPlugin.getCompilationHooks().renderChunk instead)",
+					"DEP_WEBPACK_CHUNK_TEMPLATE_MODULES"
+				)
+			},
+			render: {
+				tap: util.deprecate(
+					/**
+					 * @template AdditionalOptions
+					 * @param {string | Tap & IfSet} options options
+					 * @param {(source: Source, moduleTemplate: ModuleTemplate, renderContext: RenderContext) => Source} fn function
+					 */
+					(options, fn) => {
+						getJavascriptModulesPlugin()
+							.getCompilationHooks(compilation)
+							.renderChunk.tap(options, (source, renderContext) =>
+								fn(
+									source,
+									compilation.moduleTemplates.javascript,
+									renderContext
+								)
+							);
+					},
+					"ChunkTemplate.hooks.render is deprecated (use JavascriptModulesPlugin.getCompilationHooks().renderChunk instead)",
+					"DEP_WEBPACK_CHUNK_TEMPLATE_RENDER"
+				)
+			},
+			renderWithEntry: {
+				tap: util.deprecate(
+					/**
+					 * @template AdditionalOptions
+					 * @param {string | Tap & IfSet} options options
+					 * @param {(source: Source, chunk: Chunk) => Source} fn function
+					 */
+					(options, fn) => {
+						getJavascriptModulesPlugin()
+							.getCompilationHooks(compilation)
+							.render.tap(options, (source, renderContext) => {
+								if (
+									renderContext.chunkGraph.getNumberOfEntryModules(
+										renderContext.chunk
+									) === 0 ||
+									renderContext.chunk.hasRuntime()
+								) {
+									return source;
+								}
+								return fn(source, renderContext.chunk);
+							});
+					},
+					"ChunkTemplate.hooks.renderWithEntry is deprecated (use JavascriptModulesPlugin.getCompilationHooks().render instead)",
+					"DEP_WEBPACK_CHUNK_TEMPLATE_RENDER_WITH_ENTRY"
+				)
+			},
+			hash: {
+				tap: util.deprecate(
+					/**
+					 * @template AdditionalOptions
+					 * @param {string | Tap & IfSet} options options
+					 * @param {(hash: Hash) => void} fn function
+					 */
+					(options, fn) => {
+						compilation.hooks.fullHash.tap(options, fn);
+					},
+					"ChunkTemplate.hooks.hash is deprecated (use Compilation.hooks.fullHash instead)",
+					"DEP_WEBPACK_CHUNK_TEMPLATE_HASH"
+				)
+			},
+			hashForChunk: {
+				tap: util.deprecate(
+					/**
+					 * @template AdditionalOptions
+					 * @param {string | Tap & IfSet} options options
+					 * @param {(hash: Hash, chunk: Chunk, chunkHashContext: ChunkHashContext) => void} fn function
+					 */
+					(options, fn) => {
+						getJavascriptModulesPlugin()
+							.getCompilationHooks(compilation)
+							.chunkHash.tap(options, (chunk, hash, context) => {
+								if (chunk.hasRuntime()) return;
+								fn(hash, chunk, context);
+							});
+					},
+					"ChunkTemplate.hooks.hashForChunk is deprecated (use JavascriptModulesPlugin.getCompilationHooks().chunkHash instead)",
+					"DEP_WEBPACK_CHUNK_TEMPLATE_HASH_FOR_CHUNK"
+				)
+			}
+		});
 	}
+}
 
-	/**
-	 * Updates hash with information from this template
-	 * @param {Hash} hash the hash to update
-	 * @returns {void}
-	 */
-	updateHash(hash) {
-		hash.update("ChunkTemplate");
-		hash.update("2");
-		this.hooks.hash.call(hash);
-	}
+Object.defineProperty(ChunkTemplate.prototype, "outputOptions", {
+	get: util.deprecate(
+		/**
+		 * @this {ChunkTemplate}
+		 * @returns {OutputOptions} output options
+		 */
+		function () {
+			return this._outputOptions;
+		},
+		"ChunkTemplate.outputOptions is deprecated (use Compilation.outputOptions instead)",
+		"DEP_WEBPACK_CHUNK_TEMPLATE_OUTPUT_OPTIONS"
+	)
+});
 
-	/**
-	 * TODO webpack 5: remove moduleTemplate and dependencyTemplates
-	 * Updates hash with chunk-specific information from this template
-	 * @param {Hash} hash the hash to update
-	 * @param {Chunk} chunk the chunk
-	 * @param {ModuleTemplate} moduleTemplate ModuleTemplate instance for render
-	 * @param {Map} dependencyTemplates dependency templates
-	 * @returns {void}
-	 */
-	updateHashForChunk(hash, chunk, moduleTemplate, dependencyTemplates) {
-		this.updateHash(hash);
-		this.hooks.hashForChunk.call(hash, chunk);
-	}
-};
+module.exports = ChunkTemplate;
diff --git a/lib/CleanPlugin.js b/lib/CleanPlugin.js
new file mode 100644
index 00000000000..7bd5ac904b9
--- /dev/null
+++ b/lib/CleanPlugin.js
@@ -0,0 +1,445 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Sergey Melyukov @smelukov
+*/
+
+"use strict";
+
+const asyncLib = require("neo-async");
+const { SyncBailHook } = require("tapable");
+const Compilation = require("./Compilation");
+const createSchemaValidation = require("./util/create-schema-validation");
+const { join } = require("./util/fs");
+const processAsyncTree = require("./util/processAsyncTree");
+
+/** @typedef {import("../declarations/WebpackOptions").CleanOptions} CleanOptions */
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./logging/Logger").Logger} Logger */
+/** @typedef {import("./util/fs").IStats} IStats */
+/** @typedef {import("./util/fs").OutputFileSystem} OutputFileSystem */
+/** @typedef {import("./util/fs").StatsCallback} StatsCallback */
+
+/** @typedef {Map} Assets */
+
+/**
+ * @typedef {object} CleanPluginCompilationHooks
+ * @property {SyncBailHook<[string], boolean | void>} keep when returning true the file/directory will be kept during cleaning, returning false will clean it and ignore the following plugins and config
+ */
+
+/**
+ * @callback KeepFn
+ * @param {string} path path
+ * @returns {boolean | void} true, if the path should be kept
+ */
+
+const validate = createSchemaValidation(
+	undefined,
+	() => {
+		const { definitions } = require("../schemas/WebpackOptions.json");
+		return {
+			definitions,
+			oneOf: [{ $ref: "#/definitions/CleanOptions" }]
+		};
+	},
+	{
+		name: "Clean Plugin",
+		baseDataPath: "options"
+	}
+);
+const _10sec = 10 * 1000;
+
+/**
+ * merge assets map 2 into map 1
+ * @param {Assets} as1 assets
+ * @param {Assets} as2 assets
+ * @returns {void}
+ */
+const mergeAssets = (as1, as2) => {
+	for (const [key, value1] of as2) {
+		const value2 = as1.get(key);
+		if (!value2 || value1 > value2) as1.set(key, value1);
+	}
+};
+
+/** @typedef {Set} Diff */
+
+/**
+ * @param {OutputFileSystem} fs filesystem
+ * @param {string} outputPath output path
+ * @param {Map} currentAssets filename of the current assets (must not start with .. or ., must only use / as path separator)
+ * @param {(err?: Error | null, set?: Diff) => void} callback returns the filenames of the assets that shouldn't be there
+ * @returns {void}
+ */
+const getDiffToFs = (fs, outputPath, currentAssets, callback) => {
+	const directories = new Set();
+	// get directories of assets
+	for (const [asset] of currentAssets) {
+		directories.add(asset.replace(/(^|\/)[^/]*$/, ""));
+	}
+	// and all parent directories
+	for (const directory of directories) {
+		directories.add(directory.replace(/(^|\/)[^/]*$/, ""));
+	}
+	const diff = new Set();
+	asyncLib.forEachLimit(
+		directories,
+		10,
+		(directory, callback) => {
+			/** @type {NonNullable} */
+			(fs.readdir)(join(fs, outputPath, directory), (err, entries) => {
+				if (err) {
+					if (err.code === "ENOENT") return callback();
+					if (err.code === "ENOTDIR") {
+						diff.add(directory);
+						return callback();
+					}
+					return callback(err);
+				}
+				for (const entry of /** @type {string[]} */ (entries)) {
+					const file = entry;
+					const filename = directory ? `${directory}/${file}` : file;
+					if (!directories.has(filename) && !currentAssets.has(filename)) {
+						diff.add(filename);
+					}
+				}
+				callback();
+			});
+		},
+		err => {
+			if (err) return callback(err);
+
+			callback(null, diff);
+		}
+	);
+};
+
+/**
+ * @param {Assets} currentAssets assets list
+ * @param {Assets} oldAssets old assets list
+ * @returns {Diff} diff
+ */
+const getDiffToOldAssets = (currentAssets, oldAssets) => {
+	const diff = new Set();
+	const now = Date.now();
+	for (const [asset, ts] of oldAssets) {
+		if (ts >= now) continue;
+		if (!currentAssets.has(asset)) diff.add(asset);
+	}
+	return diff;
+};
+
+/**
+ * @param {OutputFileSystem} fs filesystem
+ * @param {string} filename path to file
+ * @param {StatsCallback} callback callback for provided filename
+ * @returns {void}
+ */
+const doStat = (fs, filename, callback) => {
+	if ("lstat" in fs) {
+		/** @type {NonNullable} */
+		(fs.lstat)(filename, callback);
+	} else {
+		fs.stat(filename, callback);
+	}
+};
+
+/**
+ * @param {OutputFileSystem} fs filesystem
+ * @param {string} outputPath output path
+ * @param {boolean} dry only log instead of fs modification
+ * @param {Logger} logger logger
+ * @param {Diff} diff filenames of the assets that shouldn't be there
+ * @param {(path: string) => boolean | void} isKept check if the entry is ignored
+ * @param {(err?: Error, assets?: Assets) => void} callback callback
+ * @returns {void}
+ */
+const applyDiff = (fs, outputPath, dry, logger, diff, isKept, callback) => {
+	/**
+	 * @param {string} msg message
+	 */
+	const log = msg => {
+		if (dry) {
+			logger.info(msg);
+		} else {
+			logger.log(msg);
+		}
+	};
+	/** @typedef {{ type: "check" | "unlink" | "rmdir", filename: string, parent: { remaining: number, job: Job } | undefined }} Job */
+	/** @type {Job[]} */
+	const jobs = Array.from(diff.keys(), filename => ({
+		type: "check",
+		filename,
+		parent: undefined
+	}));
+	/** @type {Assets} */
+	const keptAssets = new Map();
+	processAsyncTree(
+		jobs,
+		10,
+		({ type, filename, parent }, push, callback) => {
+			/**
+			 * @param {Error & { code?: string }} err error
+			 * @returns {void}
+			 */
+			const handleError = err => {
+				if (err.code === "ENOENT") {
+					log(`${filename} was removed during cleaning by something else`);
+					handleParent();
+					return callback();
+				}
+				return callback(err);
+			};
+			const handleParent = () => {
+				if (parent && --parent.remaining === 0) push(parent.job);
+			};
+			const path = join(fs, outputPath, filename);
+			switch (type) {
+				case "check":
+					if (isKept(filename)) {
+						keptAssets.set(filename, 0);
+						// do not decrement parent entry as we don't want to delete the parent
+						log(`${filename} will be kept`);
+						return process.nextTick(callback);
+					}
+					doStat(fs, path, (err, stats) => {
+						if (err) return handleError(err);
+						if (!(/** @type {IStats} */ (stats).isDirectory())) {
+							push({
+								type: "unlink",
+								filename,
+								parent
+							});
+							return callback();
+						}
+
+						/** @type {NonNullable} */
+						(fs.readdir)(path, (err, _entries) => {
+							if (err) return handleError(err);
+							/** @type {Job} */
+							const deleteJob = {
+								type: "rmdir",
+								filename,
+								parent
+							};
+							const entries = /** @type {string[]} */ (_entries);
+							if (entries.length === 0) {
+								push(deleteJob);
+							} else {
+								const parentToken = {
+									remaining: entries.length,
+									job: deleteJob
+								};
+								for (const entry of entries) {
+									const file = /** @type {string} */ (entry);
+									if (file.startsWith(".")) {
+										log(
+											`${filename} will be kept (dot-files will never be removed)`
+										);
+										continue;
+									}
+									push({
+										type: "check",
+										filename: `${filename}/${file}`,
+										parent: parentToken
+									});
+								}
+							}
+							return callback();
+						});
+					});
+					break;
+				case "rmdir":
+					log(`${filename} will be removed`);
+					if (dry) {
+						handleParent();
+						return process.nextTick(callback);
+					}
+					if (!fs.rmdir) {
+						logger.warn(
+							`${filename} can't be removed because output file system doesn't support removing directories (rmdir)`
+						);
+						return process.nextTick(callback);
+					}
+					fs.rmdir(path, err => {
+						if (err) return handleError(err);
+						handleParent();
+						callback();
+					});
+					break;
+				case "unlink":
+					log(`${filename} will be removed`);
+					if (dry) {
+						handleParent();
+						return process.nextTick(callback);
+					}
+					if (!fs.unlink) {
+						logger.warn(
+							`${filename} can't be removed because output file system doesn't support removing files (rmdir)`
+						);
+						return process.nextTick(callback);
+					}
+					fs.unlink(path, err => {
+						if (err) return handleError(err);
+						handleParent();
+						callback();
+					});
+					break;
+			}
+		},
+		err => {
+			if (err) return callback(err);
+			callback(undefined, keptAssets);
+		}
+	);
+};
+
+/** @type {WeakMap} */
+const compilationHooksMap = new WeakMap();
+
+const PLUGIN_NAME = "CleanPlugin";
+
+class CleanPlugin {
+	/**
+	 * @param {Compilation} compilation the compilation
+	 * @returns {CleanPluginCompilationHooks} the attached hooks
+	 */
+	static getCompilationHooks(compilation) {
+		if (!(compilation instanceof Compilation)) {
+			throw new TypeError(
+				"The 'compilation' argument must be an instance of Compilation"
+			);
+		}
+		let hooks = compilationHooksMap.get(compilation);
+		if (hooks === undefined) {
+			hooks = {
+				keep: new SyncBailHook(["ignore"])
+			};
+			compilationHooksMap.set(compilation, hooks);
+		}
+		return hooks;
+	}
+
+	/** @param {CleanOptions} options options */
+	constructor(options = {}) {
+		validate(options);
+		this.options = { dry: false, ...options };
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		const { dry, keep } = this.options;
+
+		/** @type {KeepFn} */
+		const keepFn =
+			typeof keep === "function"
+				? keep
+				: typeof keep === "string"
+					? path => path.startsWith(keep)
+					: typeof keep === "object" && keep.test
+						? path => keep.test(path)
+						: () => false;
+
+		// We assume that no external modification happens while the compiler is active
+		// So we can store the old assets and only diff to them to avoid fs access on
+		// incremental builds
+		/** @type {undefined|Assets} */
+		let oldAssets;
+
+		compiler.hooks.emit.tapAsync(
+			{
+				name: PLUGIN_NAME,
+				stage: 100
+			},
+			(compilation, callback) => {
+				const hooks = CleanPlugin.getCompilationHooks(compilation);
+				const logger = compilation.getLogger(`webpack.${PLUGIN_NAME}`);
+				const fs = /** @type {OutputFileSystem} */ (compiler.outputFileSystem);
+
+				if (!fs.readdir) {
+					return callback(
+						new Error(
+							`${PLUGIN_NAME}: Output filesystem doesn't support listing directories (readdir)`
+						)
+					);
+				}
+
+				/** @type {Assets} */
+				const currentAssets = new Map();
+				const now = Date.now();
+				for (const asset of Object.keys(compilation.assets)) {
+					if (/^[A-Za-z]:\\|^\/|^\\\\/.test(asset)) continue;
+					let normalizedAsset;
+					let newNormalizedAsset = asset.replace(/\\/g, "/");
+					do {
+						normalizedAsset = newNormalizedAsset;
+						newNormalizedAsset = normalizedAsset.replace(
+							/(^|\/)(?!\.\.)[^/]+\/\.\.\//g,
+							"$1"
+						);
+					} while (newNormalizedAsset !== normalizedAsset);
+					if (normalizedAsset.startsWith("../")) continue;
+					const assetInfo = compilation.assetsInfo.get(asset);
+					if (assetInfo && assetInfo.hotModuleReplacement) {
+						currentAssets.set(normalizedAsset, now + _10sec);
+					} else {
+						currentAssets.set(normalizedAsset, 0);
+					}
+				}
+
+				const outputPath = compilation.getPath(compiler.outputPath, {});
+
+				/**
+				 * @param {string} path path
+				 * @returns {boolean | void} true, if needs to be kept
+				 */
+				const isKept = path => {
+					const result = hooks.keep.call(path);
+					if (result !== undefined) return result;
+					return keepFn(path);
+				};
+
+				/**
+				 * @param {(Error | null)=} err err
+				 * @param {Diff=} diff diff
+				 */
+				const diffCallback = (err, diff) => {
+					if (err) {
+						oldAssets = undefined;
+						callback(err);
+						return;
+					}
+					applyDiff(
+						fs,
+						outputPath,
+						dry,
+						logger,
+						/** @type {Diff} */ (diff),
+						isKept,
+						(err, keptAssets) => {
+							if (err) {
+								oldAssets = undefined;
+							} else {
+								if (oldAssets) mergeAssets(currentAssets, oldAssets);
+								oldAssets = currentAssets;
+								if (keptAssets) mergeAssets(oldAssets, keptAssets);
+							}
+							callback(err);
+						}
+					);
+				};
+
+				if (oldAssets) {
+					diffCallback(null, getDiffToOldAssets(currentAssets, oldAssets));
+				} else {
+					getDiffToFs(fs, outputPath, currentAssets, diffCallback);
+				}
+			}
+		);
+	}
+}
+
+module.exports = CleanPlugin;
diff --git a/lib/CodeGenerationError.js b/lib/CodeGenerationError.js
new file mode 100644
index 00000000000..b1cf51d744e
--- /dev/null
+++ b/lib/CodeGenerationError.js
@@ -0,0 +1,29 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const WebpackError = require("./WebpackError");
+
+/** @typedef {import("./Module")} Module */
+
+class CodeGenerationError extends WebpackError {
+	/**
+	 * Create a new CodeGenerationError
+	 * @param {Module} module related module
+	 * @param {Error} error Original error
+	 */
+	constructor(module, error) {
+		super();
+
+		this.name = "CodeGenerationError";
+		this.error = error;
+		this.message = error.message;
+		this.details = error.stack;
+		this.module = module;
+	}
+}
+
+module.exports = CodeGenerationError;
diff --git a/lib/CodeGenerationResults.js b/lib/CodeGenerationResults.js
new file mode 100644
index 00000000000..24f232de9ae
--- /dev/null
+++ b/lib/CodeGenerationResults.js
@@ -0,0 +1,158 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { DEFAULTS } = require("./config/defaults");
+const { getOrInsert } = require("./util/MapHelpers");
+const { first } = require("./util/SetHelpers");
+const createHash = require("./util/createHash");
+const { runtimeToString, RuntimeSpecMap } = require("./util/runtime");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./Module").CodeGenerationResult} CodeGenerationResult */
+/** @typedef {import("./Module").ReadOnlyRuntimeRequirements} ReadOnlyRuntimeRequirements */
+/** @typedef {typeof import("./util/Hash")} Hash */
+/** @typedef {import("./util/runtime").RuntimeSpec} RuntimeSpec */
+
+class CodeGenerationResults {
+	/**
+	 * @param {string | Hash} hashFunction the hash function to use
+	 */
+	constructor(hashFunction = DEFAULTS.HASH_FUNCTION) {
+		/** @type {Map>} */
+		this.map = new Map();
+		this._hashFunction = hashFunction;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {RuntimeSpec} runtime runtime(s)
+	 * @returns {CodeGenerationResult} the CodeGenerationResult
+	 */
+	get(module, runtime) {
+		const entry = this.map.get(module);
+		if (entry === undefined) {
+			throw new Error(
+				`No code generation entry for ${module.identifier()} (existing entries: ${Array.from(
+					this.map.keys(),
+					m => m.identifier()
+				).join(", ")})`
+			);
+		}
+		if (runtime === undefined) {
+			if (entry.size > 1) {
+				const results = new Set(entry.values());
+				if (results.size !== 1) {
+					throw new Error(
+						`No unique code generation entry for unspecified runtime for ${module.identifier()} (existing runtimes: ${Array.from(
+							entry.keys(),
+							r => runtimeToString(r)
+						).join(", ")}).
+Caller might not support runtime-dependent code generation (opt-out via optimization.usedExports: "global").`
+					);
+				}
+				return /** @type {CodeGenerationResult} */ (first(results));
+			}
+			return /** @type {CodeGenerationResult} */ (entry.values().next().value);
+		}
+		const result = entry.get(runtime);
+		if (result === undefined) {
+			throw new Error(
+				`No code generation entry for runtime ${runtimeToString(
+					runtime
+				)} for ${module.identifier()} (existing runtimes: ${Array.from(
+					entry.keys(),
+					r => runtimeToString(r)
+				).join(", ")})`
+			);
+		}
+		return result;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {RuntimeSpec} runtime runtime(s)
+	 * @returns {boolean} true, when we have data for this
+	 */
+	has(module, runtime) {
+		const entry = this.map.get(module);
+		if (entry === undefined) {
+			return false;
+		}
+		if (runtime !== undefined) {
+			return entry.has(runtime);
+		} else if (entry.size > 1) {
+			const results = new Set(entry.values());
+			return results.size === 1;
+		}
+		return entry.size === 1;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {RuntimeSpec} runtime runtime(s)
+	 * @param {string} sourceType the source type
+	 * @returns {Source} a source
+	 */
+	getSource(module, runtime, sourceType) {
+		return /** @type {Source} */ (
+			this.get(module, runtime).sources.get(sourceType)
+		);
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {RuntimeSpec} runtime runtime(s)
+	 * @returns {ReadOnlyRuntimeRequirements | null} runtime requirements
+	 */
+	getRuntimeRequirements(module, runtime) {
+		return this.get(module, runtime).runtimeRequirements;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {RuntimeSpec} runtime runtime(s)
+	 * @param {string} key data key
+	 * @returns {TODO | undefined} data generated by code generation
+	 */
+	getData(module, runtime, key) {
+		const data = this.get(module, runtime).data;
+		return data === undefined ? undefined : data.get(key);
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {RuntimeSpec} runtime runtime(s)
+	 * @returns {string} hash of the code generation
+	 */
+	getHash(module, runtime) {
+		const info = this.get(module, runtime);
+		if (info.hash !== undefined) return info.hash;
+		const hash = createHash(this._hashFunction);
+		for (const [type, source] of info.sources) {
+			hash.update(type);
+			source.updateHash(hash);
+		}
+		if (info.runtimeRequirements) {
+			for (const rr of info.runtimeRequirements) hash.update(rr);
+		}
+		return (info.hash = /** @type {string} */ (hash.digest("hex")));
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {RuntimeSpec} runtime runtime(s)
+	 * @param {CodeGenerationResult} result result from module
+	 * @returns {void}
+	 */
+	add(module, runtime, result) {
+		const map = getOrInsert(this.map, module, () => new RuntimeSpecMap());
+		map.set(runtime, result);
+	}
+}
+
+module.exports = CodeGenerationResults;
diff --git a/lib/CommentCompilationWarning.js b/lib/CommentCompilationWarning.js
index 79f0a2af5d5..99cd0fbdada 100644
--- a/lib/CommentCompilationWarning.js
+++ b/lib/CommentCompilationWarning.js
@@ -2,31 +2,31 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const WebpackError = require("./WebpackError");
-
-/** @typedef {import("./Module")} Module */
+const makeSerializable = require("./util/makeSerializable");
 
 /** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
 
 class CommentCompilationWarning extends WebpackError {
 	/**
-	 *
 	 * @param {string} message warning message
-	 * @param {Module} module affected module
 	 * @param {DependencyLocation} loc affected lines of code
 	 */
-	constructor(message, module, loc) {
+	constructor(message, loc) {
 		super(message);
 
 		this.name = "CommentCompilationWarning";
 
-		this.module = module;
 		this.loc = loc;
-
-		Error.captureStackTrace(this, this.constructor);
 	}
 }
 
+makeSerializable(
+	CommentCompilationWarning,
+	"webpack/lib/CommentCompilationWarning"
+);
+
 module.exports = CommentCompilationWarning;
diff --git a/lib/CompatibilityPlugin.js b/lib/CompatibilityPlugin.js
index 1544d6c82a4..05cdeece6c3 100644
--- a/lib/CompatibilityPlugin.js
+++ b/lib/CompatibilityPlugin.js
@@ -2,50 +2,69 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_DYNAMIC,
+	JAVASCRIPT_MODULE_TYPE_ESM
+} = require("./ModuleTypeConstants");
+const RuntimeGlobals = require("./RuntimeGlobals");
 const ConstDependency = require("./dependencies/ConstDependency");
 
-const NullFactory = require("./NullFactory");
-
+/** @typedef {import("estree").CallExpression} CallExpression */
 /** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("./javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("./javascript/JavascriptParser").Range} Range */
+/** @typedef {import("./javascript/JavascriptParser").TagData} TagData */
+
+const nestedWebpackIdentifierTag = Symbol("nested webpack identifier");
+const PLUGIN_NAME = "CompatibilityPlugin";
 
 class CompatibilityPlugin {
 	/**
 	 * Apply the plugin
-	 * @param {Compiler} compiler Webpack Compiler
+	 * @param {Compiler} compiler the compiler instance
 	 * @returns {void}
 	 */
 	apply(compiler) {
 		compiler.hooks.compilation.tap(
-			"CompatibilityPlugin",
+			PLUGIN_NAME,
 			(compilation, { normalModuleFactory }) => {
-				compilation.dependencyFactories.set(ConstDependency, new NullFactory());
 				compilation.dependencyTemplates.set(
 					ConstDependency,
 					new ConstDependency.Template()
 				);
 
 				normalModuleFactory.hooks.parser
-					.for("javascript/auto")
-					.tap("CompatibilityPlugin", (parser, parserOptions) => {
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, (parser, parserOptions) => {
 						if (
 							parserOptions.browserify !== undefined &&
 							!parserOptions.browserify
 						)
 							return;
 
-						parser.hooks.call
-							.for("require")
-							.tap("CompatibilityPlugin", expr => {
+						parser.hooks.call.for("require").tap(
+							PLUGIN_NAME,
+							/**
+							 * @param {CallExpression} expr call expression
+							 * @returns {boolean | void} true when need to handle
+							 */
+							expr => {
 								// support for browserify style require delegator: "require(o, !0)"
 								if (expr.arguments.length !== 2) return;
 								const second = parser.evaluateExpression(expr.arguments[1]);
 								if (!second.isBoolean()) return;
 								if (second.asBool() !== true) return;
-								const dep = new ConstDependency("require", expr.callee.range);
-								dep.loc = expr.loc;
-								if (parser.state.current.dependencies.length > 1) {
+								const dep = new ConstDependency(
+									"require",
+									/** @type {Range} */ (expr.callee.range)
+								);
+								dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+								if (parser.state.current.dependencies.length > 0) {
 									const last =
 										parser.state.current.dependencies[
 											parser.state.current.dependencies.length - 1
@@ -59,10 +78,115 @@ class CompatibilityPlugin {
 									)
 										parser.state.current.dependencies.pop();
 								}
-								parser.state.current.addDependency(dep);
+								parser.state.module.addPresentationalDependency(dep);
 								return true;
+							}
+						);
+					});
+
+				/**
+				 * @param {JavascriptParser} parser the parser
+				 * @returns {void}
+				 */
+				const handler = parser => {
+					// Handle nested requires
+					parser.hooks.preStatement.tap(PLUGIN_NAME, statement => {
+						if (
+							statement.type === "FunctionDeclaration" &&
+							statement.id &&
+							statement.id.name === RuntimeGlobals.require
+						) {
+							const newName = `__nested_webpack_require_${
+								/** @type {Range} */ (statement.range)[0]
+							}__`;
+							parser.tagVariable(
+								statement.id.name,
+								nestedWebpackIdentifierTag,
+								{
+									name: newName,
+									declaration: {
+										updated: false,
+										loc: statement.id.loc,
+										range: statement.id.range
+									}
+								}
+							);
+							return true;
+						}
+					});
+					parser.hooks.pattern
+						.for(RuntimeGlobals.require)
+						.tap(PLUGIN_NAME, pattern => {
+							const newName = `__nested_webpack_require_${
+								/** @type {Range} */ (pattern.range)[0]
+							}__`;
+							parser.tagVariable(pattern.name, nestedWebpackIdentifierTag, {
+								name: newName,
+								declaration: {
+									updated: false,
+									loc: pattern.loc,
+									range: pattern.range
+								}
+							});
+							return true;
+						});
+					parser.hooks.pattern
+						.for(RuntimeGlobals.exports)
+						.tap(PLUGIN_NAME, pattern => {
+							parser.tagVariable(pattern.name, nestedWebpackIdentifierTag, {
+								name: "__nested_webpack_exports__",
+								declaration: {
+									updated: false,
+									loc: pattern.loc,
+									range: pattern.range
+								}
 							});
+							return true;
+						});
+					parser.hooks.expression
+						.for(nestedWebpackIdentifierTag)
+						.tap(PLUGIN_NAME, expr => {
+							const { name, declaration } =
+								/** @type {TagData} */
+								(parser.currentTagData);
+							if (!declaration.updated) {
+								const dep = new ConstDependency(name, declaration.range);
+								dep.loc = declaration.loc;
+								parser.state.module.addPresentationalDependency(dep);
+								declaration.updated = true;
+							}
+							const dep = new ConstDependency(
+								name,
+								/** @type {Range} */ (expr.range)
+							);
+							dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+							parser.state.module.addPresentationalDependency(dep);
+							return true;
+						});
+
+					// Handle hashbang
+					parser.hooks.program.tap(PLUGIN_NAME, (program, comments) => {
+						if (comments.length === 0) return;
+						const c = comments[0];
+						if (c.type === "Line" && /** @type {Range} */ (c.range)[0] === 0) {
+							if (parser.state.source.slice(0, 2).toString() !== "#!") return;
+							// this is a hashbang comment
+							const dep = new ConstDependency("//", 0);
+							dep.loc = /** @type {DependencyLocation} */ (c.loc);
+							parser.state.module.addPresentationalDependency(dep);
+						}
 					});
+				};
+
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, handler);
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
+					.tap(PLUGIN_NAME, handler);
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_ESM)
+					.tap(PLUGIN_NAME, handler);
 			}
 		);
 	}
diff --git a/lib/Compilation.js b/lib/Compilation.js
index 386e2f31a9c..24c52d09d69 100644
--- a/lib/Compilation.js
+++ b/lib/Compilation.js
@@ -1,498 +1,1213 @@
 /*
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
-	*/
+*/
+
 "use strict";
 
 const asyncLib = require("neo-async");
-const util = require("util");
-const { CachedSource } = require("webpack-sources");
 const {
-	Tapable,
+	HookMap,
 	SyncHook,
 	SyncBailHook,
 	SyncWaterfallHook,
-	AsyncSeriesHook
+	AsyncSeriesHook,
+	AsyncSeriesBailHook,
+	AsyncParallelHook
 } = require("tapable");
-const EntryModuleNotFoundError = require("./EntryModuleNotFoundError");
-const ModuleNotFoundError = require("./ModuleNotFoundError");
-const ModuleDependencyWarning = require("./ModuleDependencyWarning");
-const ModuleDependencyError = require("./ModuleDependencyError");
-const ChunkGroup = require("./ChunkGroup");
+const util = require("util");
+const { CachedSource } = require("webpack-sources");
+const { MultiItemCache } = require("./CacheFacade");
 const Chunk = require("./Chunk");
+const ChunkGraph = require("./ChunkGraph");
+const ChunkGroup = require("./ChunkGroup");
+const ChunkRenderError = require("./ChunkRenderError");
+const ChunkTemplate = require("./ChunkTemplate");
+const CodeGenerationError = require("./CodeGenerationError");
+const CodeGenerationResults = require("./CodeGenerationResults");
+const Dependency = require("./Dependency");
+const DependencyTemplates = require("./DependencyTemplates");
 const Entrypoint = require("./Entrypoint");
+const ErrorHelpers = require("./ErrorHelpers");
+const FileSystemInfo = require("./FileSystemInfo");
+const {
+	connectChunkGroupAndChunk,
+	connectChunkGroupParentAndChild
+} = require("./GraphHelpers");
+const {
+	makeWebpackError,
+	tryRunOrWebpackError
+} = require("./HookWebpackError");
 const MainTemplate = require("./MainTemplate");
-const ChunkTemplate = require("./ChunkTemplate");
-const HotUpdateChunkTemplate = require("./HotUpdateChunkTemplate");
+const Module = require("./Module");
+const ModuleDependencyError = require("./ModuleDependencyError");
+const ModuleDependencyWarning = require("./ModuleDependencyWarning");
+const ModuleGraph = require("./ModuleGraph");
+const ModuleHashingError = require("./ModuleHashingError");
+const ModuleNotFoundError = require("./ModuleNotFoundError");
+const ModuleProfile = require("./ModuleProfile");
+const ModuleRestoreError = require("./ModuleRestoreError");
+const ModuleStoreError = require("./ModuleStoreError");
 const ModuleTemplate = require("./ModuleTemplate");
+const { WEBPACK_MODULE_TYPE_RUNTIME } = require("./ModuleTypeConstants");
+const RuntimeGlobals = require("./RuntimeGlobals");
 const RuntimeTemplate = require("./RuntimeTemplate");
-const ChunkRenderError = require("./ChunkRenderError");
-const AsyncDependencyToInitialChunkError = require("./AsyncDependencyToInitialChunkError");
 const Stats = require("./Stats");
-const Semaphore = require("./util/Semaphore");
+const WebpackError = require("./WebpackError");
+const buildChunkGraph = require("./buildChunkGraph");
+const BuildCycleError = require("./errors/BuildCycleError");
+const { Logger, LogType } = require("./logging/Logger");
+const StatsFactory = require("./stats/StatsFactory");
+const StatsPrinter = require("./stats/StatsPrinter");
+const { equals: arrayEquals } = require("./util/ArrayHelpers");
+const AsyncQueue = require("./util/AsyncQueue");
+const LazySet = require("./util/LazySet");
+const { getOrInsert } = require("./util/MapHelpers");
+const WeakTupleMap = require("./util/WeakTupleMap");
+const { cachedCleverMerge } = require("./util/cleverMerge");
+const {
+	compareLocations,
+	concatComparators,
+	compareSelect,
+	compareIds,
+	compareStringsNumeric,
+	compareModulesByIdentifier
+} = require("./util/comparators");
 const createHash = require("./util/createHash");
-const Queue = require("./util/Queue");
-const SortableSet = require("./util/SortableSet");
-const GraphHelpers = require("./GraphHelpers");
-const ModuleDependency = require("./dependencies/ModuleDependency");
-const compareLocations = require("./compareLocations");
-
-/** @typedef {import("./Module")} Module */
-/** @typedef {import("./Compiler")} Compiler */
+const {
+	arrayToSetDeprecation,
+	soonFrozenObjectDeprecation,
+	createFakeHook
+} = require("./util/deprecation");
+const processAsyncTree = require("./util/processAsyncTree");
+const { getRuntimeKey } = require("./util/runtime");
+const { isSourceEqual } = require("./util/source");
+
+/** @template T @typedef {import("tapable").AsArray} AsArray */
 /** @typedef {import("webpack-sources").Source} Source */
-/** @typedef {import("./WebpackError")} WebpackError */
-/** @typedef {import("./DependenciesBlockVariable")} DependenciesBlockVariable */
-/** @typedef {import("./dependencies/SingleEntryDependency")} SingleEntryDependency */
-/** @typedef {import("./dependencies/MultiEntryDependency")} MultiEntryDependency */
-/** @typedef {import("./dependencies/DllEntryDependency")} DllEntryDependency */
-/** @typedef {import("./dependencies/DependencyReference")} DependencyReference */
-/** @typedef {import("./DependenciesBlock")} DependenciesBlock */
+/** @typedef {import("../declarations/WebpackOptions").EntryDescriptionNormalized} EntryDescription */
+/** @typedef {import("../declarations/WebpackOptions").OutputNormalized} OutputOptions */
+/** @typedef {import("../declarations/WebpackOptions").StatsOptions} StatsOptions */
+/** @typedef {import("../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
+/** @typedef {import("../declarations/WebpackOptions").WebpackPluginFunction} WebpackPluginFunction */
+/** @typedef {import("../declarations/WebpackOptions").WebpackPluginInstance} WebpackPluginInstance */
 /** @typedef {import("./AsyncDependenciesBlock")} AsyncDependenciesBlock */
-/** @typedef {import("./Dependency")} Dependency */
+/** @typedef {import("./Cache")} Cache */
+/** @typedef {import("./CacheFacade")} CacheFacade */
+/** @typedef {import("./Chunk").ChunkName} ChunkName */
+/** @typedef {import("./Chunk").ChunkId} ChunkId */
+/** @typedef {import("./ChunkGroup").ChunkGroupOptions} ChunkGroupOptions */
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./Compiler").CompilationParams} CompilationParams */
+/** @typedef {import("./Compiler").MemCache} MemCache */
+/** @typedef {import("./Compiler").WeakReferences} WeakReferences */
+/** @typedef {import("./Compiler").ModuleMemCachesItem} ModuleMemCachesItem */
+/** @typedef {import("./DependenciesBlock")} DependenciesBlock */
 /** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
-/** @typedef {import("./Dependency").DependencyTemplate} DependencyTemplate */
-/** @typedef {import("./util/createHash").Hash} Hash */
-
-// TODO use @callback
-/** @typedef {{[assetName: string]: Source}} CompilationAssets */
-/** @typedef {(err: Error|null, result?: Module) => void } ModuleCallback */
-/** @typedef {(err?: Error|null, result?: Module) => void } ModuleChainCallback */
-/** @typedef {(module: Module) => void} OnModuleCallback */
-/** @typedef {(err?: Error|null) => void} Callback */
-/** @typedef {(d: Dependency) => any} DepBlockVarDependenciesCallback */
-/** @typedef {new (...args: any[]) => Dependency} DepConstructor */
-/** @typedef {{apply: () => void}} Plugin */
+/** @typedef {import("./Dependency").ReferencedExport} ReferencedExport */
+/** @typedef {import("./DependencyTemplate")} DependencyTemplate */
+/** @typedef {import("./Entrypoint").EntryOptions} EntryOptions */
+/** @typedef {import("./Module").BuildInfo} BuildInfo */
+/** @typedef {import("./Module").ValueCacheVersions} ValueCacheVersions */
+/** @typedef {import("./Module").RuntimeRequirements} RuntimeRequirements */
+/** @typedef {import("./NormalModule").NormalModuleCompilationHooks} NormalModuleCompilationHooks */
+/** @typedef {import("./Module").FactoryMeta} FactoryMeta */
+/** @typedef {import("./Module").CodeGenerationResult} CodeGenerationResult */
+/** @typedef {import("./ModuleFactory")} ModuleFactory */
+/** @typedef {import("../declarations/WebpackOptions").ResolveOptions} ResolveOptions */
+/** @typedef {import("./ChunkGraph").ModuleId} ModuleId */
+/** @typedef {import("./ModuleGraphConnection")} ModuleGraphConnection */
+/** @typedef {import("./ModuleFactory").ModuleFactoryCreateDataContextInfo} ModuleFactoryCreateDataContextInfo */
+/** @typedef {import("./ModuleFactory").ModuleFactoryResult} ModuleFactoryResult */
+/** @typedef {import("./NormalModule").ParserOptions} ParserOptions */
+/** @typedef {import("./NormalModule").GeneratorOptions} GeneratorOptions */
+/** @typedef {import("./RequestShortener")} RequestShortener */
+/** @typedef {import("./RuntimeModule")} RuntimeModule */
+/** @typedef {import("./Template").RenderManifestEntry} RenderManifestEntry */
+/** @typedef {import("./Template").RenderManifestOptions} RenderManifestOptions */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsAsset} StatsAsset */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsError} StatsError */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsModule} StatsModule */
+/** @typedef {import("./TemplatedPathPlugin").TemplatePath} TemplatePath */
+/** @typedef {import("./util/Hash")} Hash */
+/** @typedef {import("../declarations/WebpackOptions").HashFunction} HashFunction */
+/**
+ * @template T
+ * @typedef {import("./util/deprecation").FakeHook} FakeHook
+ */
+/** @typedef {import("./util/runtime").RuntimeSpec} RuntimeSpec */
+/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
+/**
+ * @callback Callback
+ * @param {(WebpackError | null)=} err
+ * @returns {void}
+ */
 
 /**
- * @typedef {Object} ModuleFactoryCreateDataContextInfo
- * @property {string} issuer
- * @property {string} compiler
+ * @callback ModuleCallback
+ * @param {(WebpackError | null)=} err
+ * @param {(Module | null)=} result
+ * @returns {void}
  */
 
 /**
- * @typedef {Object} ModuleFactoryCreateData
- * @property {ModuleFactoryCreateDataContextInfo} contextInfo
- * @property {any=} resolveOptions
- * @property {string} context
- * @property {Dependency[]} dependencies
+ * @callback ModuleFactoryResultCallback
+ * @param {(WebpackError | null)=} err
+ * @param {ModuleFactoryResult=} result
+ * @returns {void}
  */
 
 /**
- * @typedef {Object} ModuleFactory
- * @property {(data: ModuleFactoryCreateData, callback: ModuleCallback) => any} create
+ * @callback ModuleOrFactoryResultCallback
+ * @param {(WebpackError | null)=} err
+ * @param {Module | ModuleFactoryResult=} result
+ * @returns {void}
  */
 
 /**
- * @typedef {Object} SortedDependency
- * @property {ModuleFactory} factory
- * @property {Dependency[]} dependencies
+ * @callback ExecuteModuleCallback
+ * @param {WebpackError | null} err
+ * @param {ExecuteModuleResult=} result
+ * @returns {void}
+ */
+
+/** @typedef {new (...args: EXPECTED_ANY[]) => Dependency} DepConstructor */
+
+/** @typedef {Record} CompilationAssets */
+
+/**
+ * @typedef {object} AvailableModulesChunkGroupMapping
+ * @property {ChunkGroup} chunkGroup
+ * @property {Set} availableModules
+ * @property {boolean} needCopy
  */
 
 /**
- * @typedef {Object} DependenciesBlockLike
+ * @typedef {object} DependenciesBlockLike
  * @property {Dependency[]} dependencies
  * @property {AsyncDependenciesBlock[]} blocks
- * @property {DependenciesBlockVariable[]} variables
  */
 
 /**
- * @param {Chunk} a first chunk to sort by id
- * @param {Chunk} b second chunk to sort by id
- * @returns {-1|0|1} sort value
+ * @typedef {object} ChunkPathData
+ * @property {string | number} id
+ * @property {string=} name
+ * @property {string} hash
+ * @property {((length: number) => string)=} hashWithLength
+ * @property {(Record)=} contentHash
+ * @property {(Record string>)=} contentHashWithLength
  */
-const byId = (a, b) => {
-	if (typeof a.id !== typeof b.id) {
-		return typeof a.id < typeof b.id ? -1 : 1;
-	}
-	if (a.id < b.id) return -1;
-	if (a.id > b.id) return 1;
-	return 0;
-};
 
 /**
- * @param {Module} a first module to sort by
- * @param {Module} b second module to sort by
- * @returns {-1|0|1} sort value
+ * @typedef {object} ChunkHashContext
+ * @property {CodeGenerationResults} codeGenerationResults results of code generation
+ * @property {RuntimeTemplate} runtimeTemplate the runtime template
+ * @property {ModuleGraph} moduleGraph the module graph
+ * @property {ChunkGraph} chunkGraph the chunk graph
  */
-const byIdOrIdentifier = (a, b) => {
-	if (typeof a.id !== typeof b.id) {
-		return typeof a.id < typeof b.id ? -1 : 1;
-	}
-	if (a.id < b.id) return -1;
-	if (a.id > b.id) return 1;
-	const identA = a.identifier();
-	const identB = b.identifier();
-	if (identA < identB) return -1;
-	if (identA > identB) return 1;
-	return 0;
-};
 
 /**
- * @param {Module} a first module to sort by
- * @param {Module} b second module to sort by
- * @returns {-1|0|1} sort value
+ * @typedef {object} RuntimeRequirementsContext
+ * @property {ChunkGraph} chunkGraph the chunk graph
+ * @property {CodeGenerationResults} codeGenerationResults the code generation results
  */
-const byIndexOrIdentifier = (a, b) => {
-	if (a.index < b.index) return -1;
-	if (a.index > b.index) return 1;
-	const identA = a.identifier();
-	const identB = b.identifier();
-	if (identA < identB) return -1;
-	if (identA > identB) return 1;
-	return 0;
-};
 
 /**
- * @param {Compilation} a first compilation to sort by
- * @param {Compilation} b second compilation to sort by
- * @returns {-1|0|1} sort value
+ * @typedef {object} ExecuteModuleOptions
+ * @property {EntryOptions=} entryOptions
  */
-const byNameOrHash = (a, b) => {
-	if (a.name < b.name) return -1;
-	if (a.name > b.name) return 1;
-	if (a.fullHash < b.fullHash) return -1;
-	if (a.fullHash > b.fullHash) return 1;
-	return 0;
-};
+
+/** @typedef {EXPECTED_ANY} ExecuteModuleExports */
 
 /**
- * @template T
- * @param {Set} a first set
- * @param {Set} b second set
- * @returns {number} cmp
+ * @typedef {object} ExecuteModuleResult
+ * @property {ExecuteModuleExports} exports
+ * @property {boolean} cacheable
+ * @property {Map} assets
+ * @property {LazySet} fileDependencies
+ * @property {LazySet} contextDependencies
+ * @property {LazySet} missingDependencies
+ * @property {LazySet} buildDependencies
  */
-const bySetSize = (a, b) => {
-	return a.size - b.size;
-};
 
 /**
- * @param {DependenciesBlockVariable[]} variables DepBlock Variables to iterate over
- * @param {DepBlockVarDependenciesCallback} fn callback to apply on iterated elements
- * @returns {void}
+ * @typedef {object} ExecuteModuleObject
+ * @property {string=} id module id
+ * @property {ExecuteModuleExports} exports exports
+ * @property {boolean} loaded is loaded
+ * @property {Error=} error error
  */
-const iterationBlockVariable = (variables, fn) => {
-	for (
-		let indexVariable = 0;
-		indexVariable < variables.length;
-		indexVariable++
-	) {
-		const varDep = variables[indexVariable].dependencies;
-		for (let indexVDep = 0; indexVDep < varDep.length; indexVDep++) {
-			fn(varDep[indexVDep]);
+
+/**
+ * @typedef {object} ExecuteModuleArgument
+ * @property {Module} module
+ * @property {ExecuteModuleObject=} moduleObject
+ * @property {TODO} preparedInfo
+ * @property {CodeGenerationResult} codeGenerationResult
+ */
+
+/** @typedef {((id: string) => ExecuteModuleExports) & { i?: ((options: ExecuteOptions) => void)[], c?: Record }} WebpackRequire */
+
+/**
+ * @typedef {object} ExecuteOptions
+ * @property {string=} id module id
+ * @property {ExecuteModuleObject} module module
+ * @property {WebpackRequire} require require function
+ */
+
+/**
+ * @typedef {object} ExecuteModuleContext
+ * @property {Map} assets
+ * @property {Chunk} chunk
+ * @property {ChunkGraph} chunkGraph
+ * @property {WebpackRequire=} __webpack_require__
+ */
+
+/**
+ * @typedef {object} EntryData
+ * @property {Dependency[]} dependencies dependencies of the entrypoint that should be evaluated at startup
+ * @property {Dependency[]} includeDependencies dependencies of the entrypoint that should be included but not evaluated
+ * @property {EntryOptions} options options of the entrypoint
+ */
+
+/**
+ * @typedef {object} LogEntry
+ * @property {string} type
+ * @property {EXPECTED_ANY[]=} args
+ * @property {number} time
+ * @property {string[]=} trace
+ */
+
+/**
+ * @typedef {object} KnownAssetInfo
+ * @property {boolean=} immutable true, if the asset can be long term cached forever (contains a hash)
+ * @property {boolean=} minimized whether the asset is minimized
+ * @property {string | string[]=} fullhash the value(s) of the full hash used for this asset
+ * @property {string | string[]=} chunkhash the value(s) of the chunk hash used for this asset
+ * @property {string | string[]=} modulehash the value(s) of the module hash used for this asset
+ * @property {string | string[]=} contenthash the value(s) of the content hash used for this asset
+ * @property {string=} sourceFilename when asset was created from a source file (potentially transformed), the original filename relative to compilation context
+ * @property {number=} size size in bytes, only set after asset has been emitted
+ * @property {boolean=} development true, when asset is only used for development and doesn't count towards user-facing assets
+ * @property {boolean=} hotModuleReplacement true, when asset ships data for updating an existing application (HMR)
+ * @property {boolean=} javascriptModule true, when asset is javascript and an ESM
+ * @property {Record=} related object of pointers to other assets, keyed by type of relation (only points from parent to child)
+ */
+
+/** @typedef {KnownAssetInfo & Record} AssetInfo */
+
+/** @typedef {{ path: string, info: AssetInfo }} InterpolatedPathAndAssetInfo */
+
+/**
+ * @typedef {object} Asset
+ * @property {string} name the filename of the asset
+ * @property {Source} source source of the asset
+ * @property {AssetInfo} info info about the asset
+ */
+
+/**
+ * @typedef {object} ModulePathData
+ * @property {string | number} id
+ * @property {string} hash
+ * @property {((length: number) => string)=} hashWithLength
+ */
+
+/**
+ * @typedef {object} PathData
+ * @property {ChunkGraph=} chunkGraph
+ * @property {string=} hash
+ * @property {((length: number) => string)=} hashWithLength
+ * @property {(Chunk | ChunkPathData)=} chunk
+ * @property {(Module | ModulePathData)=} module
+ * @property {RuntimeSpec=} runtime
+ * @property {string=} filename
+ * @property {string=} basename
+ * @property {string=} query
+ * @property {string=} contentHashType
+ * @property {string=} contentHash
+ * @property {((length: number) => string)=} contentHashWithLength
+ * @property {boolean=} noChunkHash
+ * @property {string=} url
+ */
+
+/** @typedef {"module" | "chunk" | "root-of-chunk" | "nested"} ExcludeModulesType */
+
+/**
+ * @typedef {object} KnownNormalizedStatsOptions
+ * @property {string} context
+ * @property {RequestShortener} requestShortener
+ * @property {string | false} chunksSort
+ * @property {string | false} modulesSort
+ * @property {string | false} chunkModulesSort
+ * @property {string | false} nestedModulesSort
+ * @property {string | false} assetsSort
+ * @property {boolean} ids
+ * @property {boolean} cachedAssets
+ * @property {boolean} groupAssetsByEmitStatus
+ * @property {boolean} groupAssetsByPath
+ * @property {boolean} groupAssetsByExtension
+ * @property {number} assetsSpace
+ * @property {((value: string, asset: StatsAsset) => boolean)[]} excludeAssets
+ * @property {((name: string, module: StatsModule, type: ExcludeModulesType) => boolean)[]} excludeModules
+ * @property {((warning: StatsError, textValue: string) => boolean)[]} warningsFilter
+ * @property {boolean} cachedModules
+ * @property {boolean} orphanModules
+ * @property {boolean} dependentModules
+ * @property {boolean} runtimeModules
+ * @property {boolean} groupModulesByCacheStatus
+ * @property {boolean} groupModulesByLayer
+ * @property {boolean} groupModulesByAttributes
+ * @property {boolean} groupModulesByPath
+ * @property {boolean} groupModulesByExtension
+ * @property {boolean} groupModulesByType
+ * @property {boolean | "auto"} entrypoints
+ * @property {boolean} chunkGroups
+ * @property {boolean} chunkGroupAuxiliary
+ * @property {boolean} chunkGroupChildren
+ * @property {number} chunkGroupMaxAssets
+ * @property {number} modulesSpace
+ * @property {number} chunkModulesSpace
+ * @property {number} nestedModulesSpace
+ * @property {false | "none" | "error" | "warn" | "info" | "log" | "verbose"} logging
+ * @property {((value: string) => boolean)[]} loggingDebug
+ * @property {boolean} loggingTrace
+ * @property {TODO} _env
+ */
+
+/** @typedef {KnownNormalizedStatsOptions & Omit & Record} NormalizedStatsOptions */
+
+/**
+ * @typedef {object} KnownCreateStatsOptionsContext
+ * @property {boolean=} forToString
+ */
+
+/** @typedef {KnownCreateStatsOptionsContext & Record} CreateStatsOptionsContext */
+
+/** @typedef {{ module: Module, hash: string, runtime: RuntimeSpec, runtimes: RuntimeSpec[]}} CodeGenerationJob */
+
+/** @typedef {CodeGenerationJob[]} CodeGenerationJobs */
+
+/** @typedef {{javascript: ModuleTemplate}} ModuleTemplates */
+
+/** @typedef {Set} NotCodeGeneratedModules */
+
+/** @typedef {Record} Records */
+
+/** @type {AssetInfo} */
+const EMPTY_ASSET_INFO = Object.freeze({});
+
+const esmDependencyCategory = "esm";
+
+// TODO webpack 6: remove
+const deprecatedNormalModuleLoaderHook = util.deprecate(
+	/**
+	 * @param {Compilation} compilation compilation
+	 * @returns {NormalModuleCompilationHooks["loader"]} hooks
+	 */
+	compilation =>
+		require("./NormalModule").getCompilationHooks(compilation).loader,
+	"Compilation.hooks.normalModuleLoader was moved to NormalModule.getCompilationHooks(compilation).loader",
+	"DEP_WEBPACK_COMPILATION_NORMAL_MODULE_LOADER_HOOK"
+);
+
+// TODO webpack 6: remove
+/**
+ * @param {ModuleTemplates | undefined} moduleTemplates module templates
+ */
+const defineRemovedModuleTemplates = moduleTemplates => {
+	Object.defineProperties(moduleTemplates, {
+		asset: {
+			enumerable: false,
+			configurable: false,
+			get: () => {
+				throw new WebpackError(
+					"Compilation.moduleTemplates.asset has been removed"
+				);
+			}
+		},
+		webassembly: {
+			enumerable: false,
+			configurable: false,
+			get: () => {
+				throw new WebpackError(
+					"Compilation.moduleTemplates.webassembly has been removed"
+				);
+			}
 		}
-	}
+	});
+	moduleTemplates = undefined;
 };
 
+const byId = compareSelect(c => c.id, compareIds);
+
+const byNameOrHash = concatComparators(
+	compareSelect(c => c.name, compareIds),
+	compareSelect(c => c.fullHash, compareIds)
+);
+
+const byMessage = compareSelect(err => `${err.message}`, compareStringsNumeric);
+
+const byModule = compareSelect(
+	err => (err.module && err.module.identifier()) || "",
+	compareStringsNumeric
+);
+
+const byLocation = compareSelect(err => err.loc, compareLocations);
+
+const compareErrors = concatComparators(byModule, byLocation, byMessage);
+
 /**
- * @template T
- * @param {T[]} arr array of elements to iterate over
- * @param {function(T): void} fn callback applied to each element
- * @returns {void}
+ * @typedef {object} KnownUnsafeCacheData
+ * @property {FactoryMeta=} factoryMeta factory meta
+ * @property {ResolveOptions=} resolveOptions resolve options
+ * @property {ParserOptions=} parserOptions
+ * @property {GeneratorOptions=} generatorOptions
  */
-const iterationOfArrayCallback = (arr, fn) => {
-	for (let index = 0; index < arr.length; index++) {
-		fn(arr[index]);
-	}
-};
+
+/** @typedef {KnownUnsafeCacheData & Record} UnsafeCacheData */
 
 /**
- * @template T
- * @param {Set} set set to add items to
- * @param {Set} otherSet set to add items from
- * @returns {void}
+ * @typedef {Module & { restoreFromUnsafeCache?: (unsafeCacheData: UnsafeCacheData, moduleFactory: ModuleFactory, compilationParams: CompilationParams) => void }} ModuleWithRestoreFromUnsafeCache
  */
-const addAllToSet = (set, otherSet) => {
-	for (const item of otherSet) {
-		set.add(item);
-	}
-};
 
-class Compilation extends Tapable {
+/** @type {WeakMap} */
+const unsafeCacheDependencies = new WeakMap();
+
+/** @type {WeakMap} */
+const unsafeCacheData = new WeakMap();
+
+/** @typedef {{ id: ModuleId, modules?: Map, blocks?: (string | number | null)[] }} References */
+/** @typedef {Map>} ModuleMemCaches */
+
+class Compilation {
 	/**
 	 * Creates an instance of Compilation.
 	 * @param {Compiler} compiler the compiler which created the compilation
+	 * @param {CompilationParams} params the compilation parameters
 	 */
-	constructor(compiler) {
-		super();
-		this.hooks = {
-			/** @type {SyncHook} */
+	constructor(compiler, params) {
+		this._backCompat = compiler._backCompat;
+
+		const getNormalModuleLoader = () => deprecatedNormalModuleLoaderHook(this);
+		/** @typedef {{ additionalAssets?: true | TODO }} ProcessAssetsAdditionalOptions */
+		/** @type {AsyncSeriesHook<[CompilationAssets], ProcessAssetsAdditionalOptions>} */
+		const processAssetsHook = new AsyncSeriesHook(["assets"]);
+
+		let savedAssets = new Set();
+		/**
+		 * @param {CompilationAssets} assets assets
+		 * @returns {CompilationAssets} new assets
+		 */
+		const popNewAssets = assets => {
+			let newAssets;
+			for (const file of Object.keys(assets)) {
+				if (savedAssets.has(file)) continue;
+				if (newAssets === undefined) {
+					newAssets = Object.create(null);
+				}
+				newAssets[file] = assets[file];
+				savedAssets.add(file);
+			}
+			return newAssets;
+		};
+		processAssetsHook.intercept({
+			name: "Compilation",
+			call: () => {
+				savedAssets = new Set(Object.keys(this.assets));
+			},
+			register: tap => {
+				const { type, name } = tap;
+				const { fn, additionalAssets, ...remainingTap } = tap;
+				const additionalAssetsFn =
+					additionalAssets === true ? fn : additionalAssets;
+				/** @typedef {WeakSet} ProcessedAssets */
+
+				/** @type {ProcessedAssets | undefined} */
+				const processedAssets = additionalAssetsFn ? new WeakSet() : undefined;
+				switch (type) {
+					case "sync":
+						if (additionalAssetsFn) {
+							this.hooks.processAdditionalAssets.tap(name, assets => {
+								if (
+									/** @type {ProcessedAssets} */
+									(processedAssets).has(this.assets)
+								)
+									additionalAssetsFn(assets);
+							});
+						}
+						return {
+							...remainingTap,
+							type: "async",
+							/**
+							 * @param {CompilationAssets} assets assets
+							 * @param {(err?: Error | null, result?: void) => void} callback callback
+							 * @returns {void}
+							 */
+							fn: (assets, callback) => {
+								try {
+									fn(assets);
+								} catch (err) {
+									return callback(/** @type {Error} */ (err));
+								}
+								if (processedAssets !== undefined)
+									processedAssets.add(this.assets);
+								const newAssets = popNewAssets(assets);
+								if (newAssets !== undefined) {
+									this.hooks.processAdditionalAssets.callAsync(
+										newAssets,
+										callback
+									);
+									return;
+								}
+								callback();
+							}
+						};
+					case "async":
+						if (additionalAssetsFn) {
+							this.hooks.processAdditionalAssets.tapAsync(
+								name,
+								(assets, callback) => {
+									if (
+										/** @type {ProcessedAssets} */
+										(processedAssets).has(this.assets)
+									)
+										return additionalAssetsFn(assets, callback);
+									callback();
+								}
+							);
+						}
+						return {
+							...remainingTap,
+							/**
+							 * @param {CompilationAssets} assets assets
+							 * @param {(err?: Error | null, result?: void) => void} callback callback
+							 * @returns {void}
+							 */
+							fn: (assets, callback) => {
+								fn(
+									assets,
+									/**
+									 * @param {Error} err err
+									 * @returns {void}
+									 */
+									err => {
+										if (err) return callback(err);
+										if (processedAssets !== undefined)
+											processedAssets.add(this.assets);
+										const newAssets = popNewAssets(assets);
+										if (newAssets !== undefined) {
+											this.hooks.processAdditionalAssets.callAsync(
+												newAssets,
+												callback
+											);
+											return;
+										}
+										callback();
+									}
+								);
+							}
+						};
+					case "promise":
+						if (additionalAssetsFn) {
+							this.hooks.processAdditionalAssets.tapPromise(name, assets => {
+								if (
+									/** @type {ProcessedAssets} */
+									(processedAssets).has(this.assets)
+								)
+									return additionalAssetsFn(assets);
+								return Promise.resolve();
+							});
+						}
+						return {
+							...remainingTap,
+							/**
+							 * @param {CompilationAssets} assets assets
+							 * @returns {Promise} result
+							 */
+							fn: assets => {
+								const p = fn(assets);
+								if (!p || !p.then) return p;
+								return p.then(() => {
+									if (processedAssets !== undefined)
+										processedAssets.add(this.assets);
+									const newAssets = popNewAssets(assets);
+									if (newAssets !== undefined) {
+										return this.hooks.processAdditionalAssets.promise(
+											newAssets
+										);
+									}
+								});
+							}
+						};
+				}
+			}
+		});
+
+		/** @type {SyncHook<[CompilationAssets]>} */
+		const afterProcessAssetsHook = new SyncHook(["assets"]);
+
+		/**
+		 * @template T
+		 * @param {string} name name of the hook
+		 * @param {number} stage new stage
+		 * @param {() => AsArray} getArgs get old hook function args
+		 * @param {string=} code deprecation code (not deprecated when unset)
+		 * @returns {FakeHook, "tap" | "tapAsync" | "tapPromise" | "name">> | undefined} fake hook which redirects
+		 */
+		const createProcessAssetsHook = (name, stage, getArgs, code) => {
+			if (!this._backCompat && code) return;
+			/**
+			 * @param {string} reason reason
+			 * @returns {string} error message
+			 */
+			const errorMessage =
+				reason => `Can't automatically convert plugin using Compilation.hooks.${name} to Compilation.hooks.processAssets because ${reason}.
+BREAKING CHANGE: Asset processing hooks in Compilation has been merged into a single Compilation.hooks.processAssets hook.`;
+			/**
+			 * @param {string | (import("tapable").TapOptions & { name: string; } & ProcessAssetsAdditionalOptions)} options hook options
+			 * @returns {import("tapable").TapOptions & { name: string; } & ProcessAssetsAdditionalOptions} modified options
+			 */
+			const getOptions = options => {
+				if (typeof options === "string") options = { name: options };
+				if (options.stage) {
+					throw new Error(errorMessage("it's using the 'stage' option"));
+				}
+				return { ...options, stage };
+			};
+			return createFakeHook(
+				{
+					name,
+					/** @type {AsyncSeriesHook["intercept"]} */
+					intercept(interceptor) {
+						throw new Error(errorMessage("it's using 'intercept'"));
+					},
+					/** @type {AsyncSeriesHook["tap"]} */
+					tap: (options, fn) => {
+						processAssetsHook.tap(getOptions(options), () => fn(...getArgs()));
+					},
+					/** @type {AsyncSeriesHook["tapAsync"]} */
+					tapAsync: (options, fn) => {
+						processAssetsHook.tapAsync(
+							getOptions(options),
+							(assets, callback) =>
+								/** @type {TODO} */ (fn)(...getArgs(), callback)
+						);
+					},
+					/** @type {AsyncSeriesHook["tapPromise"]} */
+					tapPromise: (options, fn) => {
+						processAssetsHook.tapPromise(getOptions(options), () =>
+							fn(...getArgs())
+						);
+					}
+				},
+				`${name} is deprecated (use Compilation.hooks.processAssets instead and use one of Compilation.PROCESS_ASSETS_STAGE_* as stage option)`,
+				code
+			);
+		};
+		this.hooks = Object.freeze({
+			/** @type {SyncHook<[Module]>} */
 			buildModule: new SyncHook(["module"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Module]>} */
 			rebuildModule: new SyncHook(["module"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Module, WebpackError]>} */
 			failedModule: new SyncHook(["module", "error"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Module]>} */
 			succeedModule: new SyncHook(["module"]),
-
-			/** @type {SyncHook} */
-			addEntry: new SyncHook(["entry", "name"]),
-			/** @type {SyncHook} */
-			failedEntry: new SyncHook(["entry", "name", "error"]),
-			/** @type {SyncHook} */
-			succeedEntry: new SyncHook(["entry", "name", "module"]),
-
-			/** @type {SyncWaterfallHook} */
-			dependencyReference: new SyncWaterfallHook([
-				"dependencyReference",
+			/** @type {SyncHook<[Module]>} */
+			stillValidModule: new SyncHook(["module"]),
+
+			/** @type {SyncHook<[Dependency, EntryOptions]>} */
+			addEntry: new SyncHook(["entry", "options"]),
+			/** @type {SyncHook<[Dependency, EntryOptions, Error]>} */
+			failedEntry: new SyncHook(["entry", "options", "error"]),
+			/** @type {SyncHook<[Dependency, EntryOptions, Module]>} */
+			succeedEntry: new SyncHook(["entry", "options", "module"]),
+
+			/** @type {SyncWaterfallHook<[(string[] | ReferencedExport)[], Dependency, RuntimeSpec]>} */
+			dependencyReferencedExports: new SyncWaterfallHook([
+				"referencedExports",
 				"dependency",
-				"module"
+				"runtime"
 			]),
 
-			/** @type {SyncHook} */
-			finishModules: new SyncHook(["modules"]),
-			/** @type {SyncHook} */
-			finishRebuildingModule: new SyncHook(["module"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[ExecuteModuleArgument, ExecuteModuleContext]>} */
+			executeModule: new SyncHook(["options", "context"]),
+			/** @type {AsyncParallelHook<[ExecuteModuleArgument, ExecuteModuleContext]>} */
+			prepareModuleExecution: new AsyncParallelHook(["options", "context"]),
+
+			/** @type {AsyncSeriesHook<[Iterable]>} */
+			finishModules: new AsyncSeriesHook(["modules"]),
+			/** @type {AsyncSeriesHook<[Module]>} */
+			finishRebuildingModule: new AsyncSeriesHook(["module"]),
+			/** @type {SyncHook<[]>} */
 			unseal: new SyncHook([]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[]>} */
 			seal: new SyncHook([]),
 
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[]>} */
 			beforeChunks: new SyncHook([]),
-			/** @type {SyncHook} */
+			/**
+			 * The `afterChunks` hook is called directly after the chunks and module graph have
+			 * been created and before the chunks and modules have been optimized. This hook is useful to
+			 * inspect, analyze, and/or modify the chunk graph.
+			 * @type {SyncHook<[Iterable]>}
+			 */
 			afterChunks: new SyncHook(["chunks"]),
 
-			/** @type {SyncBailHook} */
-			optimizeDependenciesBasic: new SyncBailHook(["modules"]),
-			/** @type {SyncBailHook} */
+			/** @type {SyncBailHook<[Iterable], boolean | void>} */
 			optimizeDependencies: new SyncBailHook(["modules"]),
-			/** @type {SyncBailHook} */
-			optimizeDependenciesAdvanced: new SyncBailHook(["modules"]),
-			/** @type {SyncBailHook} */
+			/** @type {SyncHook<[Iterable]>} */
 			afterOptimizeDependencies: new SyncHook(["modules"]),
 
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[]>} */
 			optimize: new SyncHook([]),
-			/** @type {SyncBailHook} */
-			optimizeModulesBasic: new SyncBailHook(["modules"]),
-			/** @type {SyncBailHook} */
+			/** @type {SyncBailHook<[Iterable], boolean | void>} */
 			optimizeModules: new SyncBailHook(["modules"]),
-			/** @type {SyncBailHook} */
-			optimizeModulesAdvanced: new SyncBailHook(["modules"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Iterable]>} */
 			afterOptimizeModules: new SyncHook(["modules"]),
 
-			/** @type {SyncBailHook} */
-			optimizeChunksBasic: new SyncBailHook(["chunks", "chunkGroups"]),
-			/** @type {SyncBailHook} */
+			/** @type {SyncBailHook<[Iterable, ChunkGroup[]], boolean | void>} */
 			optimizeChunks: new SyncBailHook(["chunks", "chunkGroups"]),
-			/** @type {SyncBailHook} */
-			optimizeChunksAdvanced: new SyncBailHook(["chunks", "chunkGroups"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Iterable, ChunkGroup[]]>} */
 			afterOptimizeChunks: new SyncHook(["chunks", "chunkGroups"]),
 
-			/** @type {AsyncSeriesHook} */
+			/** @type {AsyncSeriesHook<[Iterable, Iterable]>} */
 			optimizeTree: new AsyncSeriesHook(["chunks", "modules"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Iterable, Iterable]>} */
 			afterOptimizeTree: new SyncHook(["chunks", "modules"]),
 
-			/** @type {SyncBailHook} */
-			optimizeChunkModulesBasic: new SyncBailHook(["chunks", "modules"]),
-			/** @type {SyncBailHook} */
-			optimizeChunkModules: new SyncBailHook(["chunks", "modules"]),
-			/** @type {SyncBailHook} */
-			optimizeChunkModulesAdvanced: new SyncBailHook(["chunks", "modules"]),
-			/** @type {SyncHook} */
+			/** @type {AsyncSeriesBailHook<[Iterable, Iterable], void>} */
+			optimizeChunkModules: new AsyncSeriesBailHook(["chunks", "modules"]),
+			/** @type {SyncHook<[Iterable, Iterable]>} */
 			afterOptimizeChunkModules: new SyncHook(["chunks", "modules"]),
-			/** @type {SyncBailHook} */
+			/** @type {SyncBailHook<[], boolean | void>} */
 			shouldRecord: new SyncBailHook([]),
 
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Chunk, Set, RuntimeRequirementsContext]>} */
+			additionalChunkRuntimeRequirements: new SyncHook([
+				"chunk",
+				"runtimeRequirements",
+				"context"
+			]),
+			/** @type {HookMap, RuntimeRequirementsContext], void>>} */
+			runtimeRequirementInChunk: new HookMap(
+				() => new SyncBailHook(["chunk", "runtimeRequirements", "context"])
+			),
+			/** @type {SyncHook<[Module, Set, RuntimeRequirementsContext]>} */
+			additionalModuleRuntimeRequirements: new SyncHook([
+				"module",
+				"runtimeRequirements",
+				"context"
+			]),
+			/** @type {HookMap, RuntimeRequirementsContext], void>>} */
+			runtimeRequirementInModule: new HookMap(
+				() => new SyncBailHook(["module", "runtimeRequirements", "context"])
+			),
+			/** @type {SyncHook<[Chunk, Set, RuntimeRequirementsContext]>} */
+			additionalTreeRuntimeRequirements: new SyncHook([
+				"chunk",
+				"runtimeRequirements",
+				"context"
+			]),
+			/** @type {HookMap, RuntimeRequirementsContext], void>>} */
+			runtimeRequirementInTree: new HookMap(
+				() => new SyncBailHook(["chunk", "runtimeRequirements", "context"])
+			),
+
+			/** @type {SyncHook<[RuntimeModule, Chunk]>} */
+			runtimeModule: new SyncHook(["module", "chunk"]),
+
+			/** @type {SyncHook<[Iterable, Records]>} */
 			reviveModules: new SyncHook(["modules", "records"]),
-			/** @type {SyncHook} */
-			optimizeModuleOrder: new SyncHook(["modules"]),
-			/** @type {SyncHook} */
-			advancedOptimizeModuleOrder: new SyncHook(["modules"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Iterable]>} */
 			beforeModuleIds: new SyncHook(["modules"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Iterable]>} */
 			moduleIds: new SyncHook(["modules"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Iterable]>} */
 			optimizeModuleIds: new SyncHook(["modules"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Iterable]>} */
 			afterOptimizeModuleIds: new SyncHook(["modules"]),
 
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Iterable, Records]>} */
 			reviveChunks: new SyncHook(["chunks", "records"]),
-			/** @type {SyncHook} */
-			optimizeChunkOrder: new SyncHook(["chunks"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Iterable]>} */
 			beforeChunkIds: new SyncHook(["chunks"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Iterable]>} */
+			chunkIds: new SyncHook(["chunks"]),
+			/** @type {SyncHook<[Iterable]>} */
 			optimizeChunkIds: new SyncHook(["chunks"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Iterable]>} */
 			afterOptimizeChunkIds: new SyncHook(["chunks"]),
 
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Iterable, Records]>} */
 			recordModules: new SyncHook(["modules", "records"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Iterable, Records]>} */
 			recordChunks: new SyncHook(["chunks", "records"]),
 
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Iterable]>} */
+			optimizeCodeGeneration: new SyncHook(["modules"]),
+
+			/** @type {SyncHook<[]>} */
+			beforeModuleHash: new SyncHook([]),
+			/** @type {SyncHook<[]>} */
+			afterModuleHash: new SyncHook([]),
+
+			/** @type {SyncHook<[]>} */
+			beforeCodeGeneration: new SyncHook([]),
+			/** @type {SyncHook<[]>} */
+			afterCodeGeneration: new SyncHook([]),
+
+			/** @type {SyncHook<[]>} */
+			beforeRuntimeRequirements: new SyncHook([]),
+			/** @type {SyncHook<[]>} */
+			afterRuntimeRequirements: new SyncHook([]),
+
+			/** @type {SyncHook<[]>} */
 			beforeHash: new SyncHook([]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Chunk]>} */
 			contentHash: new SyncHook(["chunk"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[]>} */
 			afterHash: new SyncHook([]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Records]>} */
 			recordHash: new SyncHook(["records"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Compilation, Records]>} */
 			record: new SyncHook(["compilation", "records"]),
 
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[]>} */
 			beforeModuleAssets: new SyncHook([]),
-			/** @type {SyncBailHook} */
+			/** @type {SyncBailHook<[], boolean | void>} */
 			shouldGenerateChunkAssets: new SyncBailHook([]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[]>} */
 			beforeChunkAssets: new SyncHook([]),
-			/** @type {SyncHook} */
-			additionalChunkAssets: new SyncHook(["chunks"]),
-
-			/** @type {AsyncSeriesHook} */
-			additionalAssets: new AsyncSeriesHook([]),
-			/** @type {AsyncSeriesHook} */
-			optimizeChunkAssets: new AsyncSeriesHook(["chunks"]),
-			/** @type {SyncHook} */
-			afterOptimizeChunkAssets: new SyncHook(["chunks"]),
-			/** @type {AsyncSeriesHook} */
-			optimizeAssets: new AsyncSeriesHook(["assets"]),
-			/** @type {SyncHook} */
-			afterOptimizeAssets: new SyncHook(["assets"]),
-
-			/** @type {SyncBailHook} */
+			// TODO webpack 6 remove
+			/** @deprecated */
+			additionalChunkAssets:
+				/** @type {FakeHook]>, "tap" | "tapAsync" | "tapPromise" | "name">>} */
+				(
+					createProcessAssetsHook(
+						"additionalChunkAssets",
+						Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL,
+						() => [this.chunks],
+						"DEP_WEBPACK_COMPILATION_ADDITIONAL_CHUNK_ASSETS"
+					)
+				),
+
+			// TODO webpack 6 deprecate
+			/** @deprecated */
+			additionalAssets:
+				/** @type {FakeHook, "tap" | "tapAsync" | "tapPromise" | "name">>} */
+				(
+					createProcessAssetsHook(
+						"additionalAssets",
+						Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL,
+						() => []
+					)
+				),
+			// TODO webpack 6 remove
+			/** @deprecated */
+			optimizeChunkAssets:
+				/** @type {FakeHook]>, "tap" | "tapAsync" | "tapPromise" | "name">>} */
+				(
+					createProcessAssetsHook(
+						"optimizeChunkAssets",
+						Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE,
+						() => [this.chunks],
+						"DEP_WEBPACK_COMPILATION_OPTIMIZE_CHUNK_ASSETS"
+					)
+				),
+			// TODO webpack 6 remove
+			/** @deprecated */
+			afterOptimizeChunkAssets:
+				/** @type {FakeHook]>, "tap" | "tapAsync" | "tapPromise" | "name">>} */
+				(
+					createProcessAssetsHook(
+						"afterOptimizeChunkAssets",
+						Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE + 1,
+						() => [this.chunks],
+						"DEP_WEBPACK_COMPILATION_AFTER_OPTIMIZE_CHUNK_ASSETS"
+					)
+				),
+			// TODO webpack 6 deprecate
+			/** @deprecated */
+			optimizeAssets: processAssetsHook,
+			// TODO webpack 6 deprecate
+			/** @deprecated */
+			afterOptimizeAssets: afterProcessAssetsHook,
+
+			processAssets: processAssetsHook,
+			afterProcessAssets: afterProcessAssetsHook,
+			/** @type {AsyncSeriesHook<[CompilationAssets]>} */
+			processAdditionalAssets: new AsyncSeriesHook(["assets"]),
+
+			/** @type {SyncBailHook<[], boolean | void>} */
 			needAdditionalSeal: new SyncBailHook([]),
-			/** @type {AsyncSeriesHook} */
+			/** @type {AsyncSeriesHook<[]>} */
 			afterSeal: new AsyncSeriesHook([]),
 
-			/** @type {SyncHook} */
-			chunkHash: new SyncHook(["chunk", "chunkHash"]),
-			/** @type {SyncHook} */
+			/** @type {SyncWaterfallHook<[RenderManifestEntry[], RenderManifestOptions]>} */
+			renderManifest: new SyncWaterfallHook(["result", "options"]),
+
+			/** @type {SyncHook<[Hash]>} */
+			fullHash: new SyncHook(["hash"]),
+			/** @type {SyncHook<[Chunk, Hash, ChunkHashContext]>} */
+			chunkHash: new SyncHook(["chunk", "chunkHash", "ChunkHashContext"]),
+
+			/** @type {SyncHook<[Module, string]>} */
 			moduleAsset: new SyncHook(["module", "filename"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Chunk, string]>} */
 			chunkAsset: new SyncHook(["chunk", "filename"]),
 
-			/** @type {SyncWaterfallHook} */
-			assetPath: new SyncWaterfallHook(["filename", "data"]), // TODO MainTemplate
+			/** @type {SyncWaterfallHook<[string, PathData, AssetInfo | undefined]>} */
+			assetPath: new SyncWaterfallHook(["path", "options", "assetInfo"]),
 
-			/** @type {SyncBailHook} */
+			/** @type {SyncBailHook<[], boolean | void>} */
 			needAdditionalPass: new SyncBailHook([]),
 
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Compiler, string, number]>} */
 			childCompiler: new SyncHook([
 				"childCompiler",
 				"compilerName",
 				"compilerIndex"
 			]),
 
-			// TODO the following hooks are weirdly located here
-			// TODO move them for webpack 5
-			/** @type {SyncHook} */
-			normalModuleLoader: new SyncHook(["loaderContext", "module"]),
-
-			/** @type {SyncBailHook} */
-			optimizeExtractedChunksBasic: new SyncBailHook(["chunks"]),
-			/** @type {SyncBailHook} */
-			optimizeExtractedChunks: new SyncBailHook(["chunks"]),
-			/** @type {SyncBailHook} */
-			optimizeExtractedChunksAdvanced: new SyncBailHook(["chunks"]),
-			/** @type {SyncHook} */
-			afterOptimizeExtractedChunks: new SyncHook(["chunks"])
-		};
-		this._pluginCompat.tap("Compilation", options => {
-			switch (options.name) {
-				case "optimize-tree":
-				case "additional-assets":
-				case "optimize-chunk-assets":
-				case "optimize-assets":
-				case "after-seal":
-					options.async = true;
-					break;
+			/** @type {SyncBailHook<[string, LogEntry], boolean | void>} */
+			log: new SyncBailHook(["origin", "logEntry"]),
+
+			/** @type {SyncWaterfallHook<[Error[]]>} */
+			processWarnings: new SyncWaterfallHook(["warnings"]),
+			/** @type {SyncWaterfallHook<[Error[]]>} */
+			processErrors: new SyncWaterfallHook(["errors"]),
+
+			/** @type {HookMap, CreateStatsOptionsContext]>>} */
+			statsPreset: new HookMap(() => new SyncHook(["options", "context"])),
+			/** @type {SyncHook<[Partial, CreateStatsOptionsContext]>} */
+			statsNormalize: new SyncHook(["options", "context"]),
+			/** @type {SyncHook<[StatsFactory, NormalizedStatsOptions]>} */
+			statsFactory: new SyncHook(["statsFactory", "options"]),
+			/** @type {SyncHook<[StatsPrinter, NormalizedStatsOptions]>} */
+			statsPrinter: new SyncHook(["statsPrinter", "options"]),
+
+			get normalModuleLoader() {
+				return getNormalModuleLoader();
 			}
 		});
 		/** @type {string=} */
 		this.name = undefined;
+		/** @type {number | undefined} */
+		this.startTime = undefined;
+		/** @type {number | undefined} */
+		this.endTime = undefined;
 		/** @type {Compiler} */
 		this.compiler = compiler;
 		this.resolverFactory = compiler.resolverFactory;
-		this.inputFileSystem = compiler.inputFileSystem;
+		/** @type {InputFileSystem} */
+		this.inputFileSystem =
+			/** @type {InputFileSystem} */
+			(compiler.inputFileSystem);
+		this.fileSystemInfo = new FileSystemInfo(this.inputFileSystem, {
+			unmanagedPaths: compiler.unmanagedPaths,
+			managedPaths: compiler.managedPaths,
+			immutablePaths: compiler.immutablePaths,
+			logger: this.getLogger("webpack.FileSystemInfo"),
+			hashFunction: compiler.options.output.hashFunction
+		});
+		if (compiler.fileTimestamps) {
+			this.fileSystemInfo.addFileTimestamps(compiler.fileTimestamps, true);
+		}
+		if (compiler.contextTimestamps) {
+			this.fileSystemInfo.addContextTimestamps(
+				compiler.contextTimestamps,
+				true
+			);
+		}
+		/** @type {ValueCacheVersions} */
+		this.valueCacheVersions = new Map();
 		this.requestShortener = compiler.requestShortener;
+		this.compilerPath = compiler.compilerPath;
 
-		const options = compiler.options;
+		this.logger = this.getLogger("webpack.Compilation");
+
+		const options = /** @type {WebpackOptions} */ (compiler.options);
 		this.options = options;
 		this.outputOptions = options && options.output;
-		/** @type {boolean=} */
-		this.bail = options && options.bail;
-		this.profile = options && options.profile;
-		this.performance = options && options.performance;
-
-		this.mainTemplate = new MainTemplate(this.outputOptions);
-		this.chunkTemplate = new ChunkTemplate(this.outputOptions);
-		this.hotUpdateChunkTemplate = new HotUpdateChunkTemplate(
-			this.outputOptions
-		);
+		/** @type {boolean} */
+		this.bail = (options && options.bail) || false;
+		/** @type {boolean} */
+		this.profile = (options && options.profile) || false;
+
+		this.params = params;
+		this.mainTemplate = new MainTemplate(this.outputOptions, this);
+		this.chunkTemplate = new ChunkTemplate(this.outputOptions, this);
 		this.runtimeTemplate = new RuntimeTemplate(
+			this,
 			this.outputOptions,
 			this.requestShortener
 		);
+		/** @type {ModuleTemplates} */
 		this.moduleTemplates = {
-			javascript: new ModuleTemplate(this.runtimeTemplate, "javascript"),
-			webassembly: new ModuleTemplate(this.runtimeTemplate, "webassembly")
+			javascript: new ModuleTemplate(this.runtimeTemplate, this)
 		};
+		defineRemovedModuleTemplates(this.moduleTemplates);
+
+		// We need to think how implement types here
+		/** @type {ModuleMemCaches | undefined} */
+		this.moduleMemCaches = undefined;
+		/** @type {ModuleMemCaches | undefined} */
+		this.moduleMemCaches2 = undefined;
+		this.moduleGraph = new ModuleGraph();
+		/** @type {ChunkGraph} */
+		this.chunkGraph = /** @type {TODO} */ (undefined);
+		/** @type {CodeGenerationResults} */
+		this.codeGenerationResults = /** @type {TODO} */ (undefined);
+
+		/** @type {AsyncQueue} */
+		this.processDependenciesQueue = new AsyncQueue({
+			name: "processDependencies",
+			parallelism: options.parallelism || 100,
+			processor: this._processModuleDependencies.bind(this)
+		});
+		/** @type {AsyncQueue} */
+		this.addModuleQueue = new AsyncQueue({
+			name: "addModule",
+			parent: this.processDependenciesQueue,
+			getKey: module => module.identifier(),
+			processor: this._addModule.bind(this)
+		});
+		/** @type {AsyncQueue} */
+		this.factorizeQueue = new AsyncQueue({
+			name: "factorize",
+			parent: this.addModuleQueue,
+			processor: this._factorizeModule.bind(this)
+		});
+		/** @type {AsyncQueue} */
+		this.buildQueue = new AsyncQueue({
+			name: "build",
+			parent: this.factorizeQueue,
+			processor: this._buildModule.bind(this)
+		});
+		/** @type {AsyncQueue} */
+		this.rebuildQueue = new AsyncQueue({
+			name: "rebuild",
+			parallelism: options.parallelism || 100,
+			processor: this._rebuildModule.bind(this)
+		});
 
-		this.semaphore = new Semaphore(options.parallelism || 100);
-
-		this.entries = [];
-		/** @private @type {{name: string, request: string, module: Module}[]} */
-		this._preparedEntrypoints = [];
+		/**
+		 * Modules in value are building during the build of Module in key.
+		 * Means value blocking key from finishing.
+		 * Needed to detect build cycles.
+		 * @type {WeakMap>}
+		 */
+		this.creatingModuleDuringBuild = new WeakMap();
+
+		/** @type {Map, EntryData>} */
+		this.entries = new Map();
+		/** @type {EntryData} */
+		this.globalEntry = {
+			dependencies: [],
+			includeDependencies: [],
+			options: {
+				name: undefined
+			}
+		};
+		/** @type {Map} */
 		this.entrypoints = new Map();
-		/** @type {Chunk[]} */
-		this.chunks = [];
+		/** @type {Entrypoint[]} */
+		this.asyncEntrypoints = [];
+		/** @type {Set} */
+		this.chunks = new Set();
 		/** @type {ChunkGroup[]} */
 		this.chunkGroups = [];
 		/** @type {Map} */
 		this.namedChunkGroups = new Map();
 		/** @type {Map} */
 		this.namedChunks = new Map();
-		/** @type {Module[]} */
-		this.modules = [];
-		/** @private @type {Map} */
+		/** @type {Set} */
+		this.modules = new Set();
+		if (this._backCompat) {
+			arrayToSetDeprecation(this.chunks, "Compilation.chunks");
+			arrayToSetDeprecation(this.modules, "Compilation.modules");
+		}
+		/**
+		 * @private
+		 * @type {Map}
+		 */
 		this._modules = new Map();
-		this.cache = null;
+		/** @type {Records | null} */
 		this.records = null;
 		/** @type {string[]} */
 		this.additionalChunkAssets = [];
 		/** @type {CompilationAssets} */
 		this.assets = {};
-		/** @type {WebpackError[]} */
+		/** @type {Map} */
+		this.assetsInfo = new Map();
+		/** @type {Map>>} */
+		this._assetsRelatedIn = new Map();
+		/** @type {Error[]} */
 		this.errors = [];
-		/** @type {WebpackError[]} */
+		/** @type {Error[]} */
 		this.warnings = [];
 		/** @type {Compilation[]} */
 		this.children = [];
+		/** @type {Map} */
+		this.logging = new Map();
 		/** @type {Map} */
 		this.dependencyFactories = new Map();
-		/** @type {Map} */
-		this.dependencyTemplates = new Map();
-		// TODO refactor this in webpack 5 to a custom DependencyTemplates class with a hash property
-		// @ts-ignore
-		this.dependencyTemplates.set("hash", "");
+		/** @type {DependencyTemplates} */
+		this.dependencyTemplates = new DependencyTemplates(
+			this.outputOptions.hashFunction
+		);
+		/** @type {Record} */
 		this.childrenCounters = {};
-		/** @type {Set} */
+		/** @type {Set | null} */
 		this.usedChunkIds = null;
-		/** @type {Set} */
+		/** @type {Set | null} */
 		this.usedModuleIds = null;
-		/** @type {Map=} */
-		this.fileTimestamps = undefined;
-		/** @type {Map=} */
-		this.contextTimestamps = undefined;
-		/** @type {Set=} */
-		this.compilationDependencies = undefined;
-		/** @private @type {Map} */
-		this._buildingModules = new Map();
-		/** @private @type {Map} */
-		this._rebuildingModules = new Map();
+		/** @type {boolean} */
+		this.needAdditionalPass = false;
+		/** @type {Set} */
+		this._restoredUnsafeCacheModuleEntries = new Set();
+		/** @type {Map} */
+		this._restoredUnsafeCacheEntries = new Map();
+		/** @type {WeakSet} */
+		this.builtModules = new WeakSet();
+		/** @type {WeakSet} */
+		this.codeGeneratedModules = new WeakSet();
+		/** @type {WeakSet} */
+		this.buildTimeExecutedModules = new WeakSet();
 		/** @type {Set} */
 		this.emittedAssets = new Set();
+		/** @type {Set} */
+		this.comparedForEmitAssets = new Set();
+		/** @type {LazySet} */
+		this.fileDependencies = new LazySet();
+		/** @type {LazySet} */
+		this.contextDependencies = new LazySet();
+		/** @type {LazySet} */
+		this.missingDependencies = new LazySet();
+		/** @type {LazySet} */
+		this.buildDependencies = new LazySet();
+		// TODO webpack 6 remove
+		this.compilationDependencies = {
+			add: util.deprecate(
+				/**
+				 * @param {string} item item
+				 * @returns {LazySet} file dependencies
+				 */
+				item => this.fileDependencies.add(item),
+				"Compilation.compilationDependencies is deprecated (used Compilation.fileDependencies instead)",
+				"DEP_WEBPACK_COMPILATION_COMPILATION_DEPENDENCIES"
+			)
+		};
+
+		this._modulesCache = this.getCache("Compilation/modules");
+		this._assetsCache = this.getCache("Compilation/assets");
+		this._codeGenerationCache = this.getCache("Compilation/codeGeneration");
+
+		const unsafeCache = options.module.unsafeCache;
+		this._unsafeCache = Boolean(unsafeCache);
+		this._unsafeCachePredicate =
+			typeof unsafeCache === "function" ? unsafeCache : () => true;
 	}
 
 	getStats() {
@@ -500,182 +1215,340 @@ class Compilation extends Tapable {
 	}
 
 	/**
-	 * @typedef {Object} AddModuleResult
-	 * @property {Module} module the added or existing module
-	 * @property {boolean} issuer was this the first request for this module
-	 * @property {boolean} build should the module be build
-	 * @property {boolean} dependencies should dependencies be walked
+	 * @param {string | boolean | StatsOptions | undefined} optionsOrPreset stats option value
+	 * @param {CreateStatsOptionsContext=} context context
+	 * @returns {NormalizedStatsOptions} normalized options
 	 */
-
-	/**
-	 * @param {Module} module module to be added that was created
-	 * @param {any=} cacheGroup cacheGroup it is apart of
-	 * @returns {AddModuleResult} returns meta about whether or not the module had built
-	 * had an issuer, or any dependnecies
-	 */
-	addModule(module, cacheGroup) {
-		const identifier = module.identifier();
-		const alreadyAddedModule = this._modules.get(identifier);
-		if (alreadyAddedModule) {
-			return {
-				module: alreadyAddedModule,
-				issuer: false,
-				build: false,
-				dependencies: false
+	createStatsOptions(optionsOrPreset, context = {}) {
+		if (typeof optionsOrPreset === "boolean") {
+			optionsOrPreset = {
+				preset: optionsOrPreset === false ? "none" : "normal"
 			};
+		} else if (typeof optionsOrPreset === "string") {
+			optionsOrPreset = { preset: optionsOrPreset };
 		}
-		const cacheName = (cacheGroup || "m") + identifier;
-		if (this.cache && this.cache[cacheName]) {
-			const cacheModule = this.cache[cacheName];
-
-			if (typeof cacheModule.updateCacheModule === "function") {
-				cacheModule.updateCacheModule(module);
-			}
-
-			let rebuild = true;
-			if (this.fileTimestamps && this.contextTimestamps) {
-				rebuild = cacheModule.needRebuild(
-					this.fileTimestamps,
-					this.contextTimestamps
-				);
+		if (typeof optionsOrPreset === "object" && optionsOrPreset !== null) {
+			// We use this method of shallow cloning this object to include
+			// properties in the prototype chain
+			/** @type {Partial} */
+			const options = {};
+			// eslint-disable-next-line guard-for-in
+			for (const key in optionsOrPreset) {
+				options[key] = optionsOrPreset[/** @type {keyof StatsOptions} */ (key)];
 			}
-
-			if (!rebuild) {
-				cacheModule.disconnect();
-				this._modules.set(identifier, cacheModule);
-				this.modules.push(cacheModule);
-				for (const err of cacheModule.errors) {
-					this.errors.push(err);
-				}
-				for (const err of cacheModule.warnings) {
-					this.warnings.push(err);
-				}
-				return {
-					module: cacheModule,
-					issuer: true,
-					build: false,
-					dependencies: true
-				};
+			if (options.preset !== undefined) {
+				this.hooks.statsPreset.for(options.preset).call(options, context);
 			}
-			cacheModule.unbuild();
-			module = cacheModule;
-		}
-		this._modules.set(identifier, module);
-		if (this.cache) {
-			this.cache[cacheName] = module;
+			this.hooks.statsNormalize.call(options, context);
+			return /** @type {NormalizedStatsOptions} */ (options);
 		}
-		this.modules.push(module);
-		return {
-			module: module,
-			issuer: true,
-			build: true,
-			dependencies: true
-		};
+		/** @type {Partial} */
+		const options = {};
+		this.hooks.statsNormalize.call(options, context);
+		return /** @type {NormalizedStatsOptions} */ (options);
 	}
 
 	/**
-	 * Fetches a module from a compilation by its identifier
-	 * @param {Module} module the module provided
-	 * @returns {Module} the module requested
+	 * @param {NormalizedStatsOptions} options options
+	 * @returns {StatsFactory} the stats factory
 	 */
-	getModule(module) {
-		const identifier = module.identifier();
-		return this._modules.get(identifier);
+	createStatsFactory(options) {
+		const statsFactory = new StatsFactory();
+		this.hooks.statsFactory.call(statsFactory, options);
+		return statsFactory;
 	}
 
 	/**
-	 * Attempts to search for a module by its identifier
-	 * @param {string} identifier identifier (usually path) for module
-	 * @returns {Module|undefined} attempt to search for module and return it, else undefined
+	 * @param {NormalizedStatsOptions} options options
+	 * @returns {StatsPrinter} the stats printer
 	 */
-	findModule(identifier) {
-		return this._modules.get(identifier);
+	createStatsPrinter(options) {
+		const statsPrinter = new StatsPrinter();
+		this.hooks.statsPrinter.call(statsPrinter, options);
+		return statsPrinter;
 	}
 
 	/**
-	 * @param {Module} module module with its callback list
-	 * @param {Callback} callback the callback function
-	 * @returns {void}
+	 * @param {string} name cache name
+	 * @returns {CacheFacade} the cache facade instance
 	 */
-	waitForBuildingFinished(module, callback) {
-		let callbackList = this._buildingModules.get(module);
-		if (callbackList) {
-			callbackList.push(() => callback());
-		} else {
-			process.nextTick(callback);
+	getCache(name) {
+		return this.compiler.getCache(name);
+	}
+
+	/**
+	 * @param {string | (() => string)} name name of the logger, or function called once to get the logger name
+	 * @returns {Logger} a logger with that name
+	 */
+	getLogger(name) {
+		if (!name) {
+			throw new TypeError("Compilation.getLogger(name) called without a name");
+		}
+		/** @type {LogEntry[] | undefined} */
+		let logEntries;
+		return new Logger(
+			(type, args) => {
+				if (typeof name === "function") {
+					name = name();
+					if (!name) {
+						throw new TypeError(
+							"Compilation.getLogger(name) called with a function not returning a name"
+						);
+					}
+				}
+				let trace;
+				switch (type) {
+					case LogType.warn:
+					case LogType.error:
+					case LogType.trace:
+						trace = ErrorHelpers.cutOffLoaderExecution(
+							/** @type {string} */ (new Error("Trace").stack)
+						)
+							.split("\n")
+							.slice(3);
+						break;
+				}
+				/** @type {LogEntry} */
+				const logEntry = {
+					time: Date.now(),
+					type,
+					args,
+					trace
+				};
+				/* eslint-disable no-console */
+				if (this.hooks.log.call(name, logEntry) === undefined) {
+					if (
+						logEntry.type === LogType.profileEnd &&
+						typeof console.profileEnd === "function"
+					) {
+						console.profileEnd(
+							`[${name}] ${/** @type {NonNullable} */ (logEntry.args)[0]}`
+						);
+					}
+					if (logEntries === undefined) {
+						logEntries = this.logging.get(name);
+						if (logEntries === undefined) {
+							logEntries = [];
+							this.logging.set(name, logEntries);
+						}
+					}
+					logEntries.push(logEntry);
+					if (
+						logEntry.type === LogType.profile &&
+						typeof console.profile === "function"
+					) {
+						console.profile(
+							`[${name}] ${
+								/** @type {NonNullable} */
+								(logEntry.args)[0]
+							}`
+						);
+					}
+					/* eslint-enable no-console */
+				}
+			},
+			childName => {
+				if (typeof name === "function") {
+					if (typeof childName === "function") {
+						return this.getLogger(() => {
+							if (typeof name === "function") {
+								name = name();
+								if (!name) {
+									throw new TypeError(
+										"Compilation.getLogger(name) called with a function not returning a name"
+									);
+								}
+							}
+							if (typeof childName === "function") {
+								childName = childName();
+								if (!childName) {
+									throw new TypeError(
+										"Logger.getChildLogger(name) called with a function not returning a name"
+									);
+								}
+							}
+							return `${name}/${childName}`;
+						});
+					}
+					return this.getLogger(() => {
+						if (typeof name === "function") {
+							name = name();
+							if (!name) {
+								throw new TypeError(
+									"Compilation.getLogger(name) called with a function not returning a name"
+								);
+							}
+						}
+						return `${name}/${childName}`;
+					});
+				}
+				if (typeof childName === "function") {
+					return this.getLogger(() => {
+						if (typeof childName === "function") {
+							childName = childName();
+							if (!childName) {
+								throw new TypeError(
+									"Logger.getChildLogger(name) called with a function not returning a name"
+								);
+							}
+						}
+						return `${name}/${childName}`;
+					});
+				}
+				return this.getLogger(`${name}/${childName}`);
+			}
+		);
+	}
+
+	/**
+	 * @param {Module} module module to be added that was created
+	 * @param {ModuleCallback} callback returns the module in the compilation,
+	 * it could be the passed one (if new), or an already existing in the compilation
+	 * @returns {void}
+	 */
+	addModule(module, callback) {
+		this.addModuleQueue.add(module, callback);
+	}
+
+	/**
+	 * @param {Module} module module to be added that was created
+	 * @param {ModuleCallback} callback returns the module in the compilation,
+	 * it could be the passed one (if new), or an already existing in the compilation
+	 * @returns {void}
+	 */
+	_addModule(module, callback) {
+		const identifier = module.identifier();
+		const alreadyAddedModule = this._modules.get(identifier);
+		if (alreadyAddedModule) {
+			return callback(null, alreadyAddedModule);
+		}
+
+		const currentProfile = this.profile
+			? this.moduleGraph.getProfile(module)
+			: undefined;
+		if (currentProfile !== undefined) {
+			currentProfile.markRestoringStart();
 		}
+
+		this._modulesCache.get(identifier, null, (err, cacheModule) => {
+			if (err) return callback(new ModuleRestoreError(module, err));
+
+			if (currentProfile !== undefined) {
+				currentProfile.markRestoringEnd();
+				currentProfile.markIntegrationStart();
+			}
+
+			if (cacheModule) {
+				cacheModule.updateCacheModule(module);
+
+				module = cacheModule;
+			}
+			this._modules.set(identifier, module);
+			this.modules.add(module);
+			if (this._backCompat)
+				ModuleGraph.setModuleGraphForModule(module, this.moduleGraph);
+			if (currentProfile !== undefined) {
+				currentProfile.markIntegrationEnd();
+			}
+			callback(null, module);
+		});
+	}
+
+	/**
+	 * Fetches a module from a compilation by its identifier
+	 * @param {Module} module the module provided
+	 * @returns {Module} the module requested
+	 */
+	getModule(module) {
+		const identifier = module.identifier();
+		return /** @type {Module} */ (this._modules.get(identifier));
+	}
+
+	/**
+	 * Attempts to search for a module by its identifier
+	 * @param {string} identifier identifier (usually path) for module
+	 * @returns {Module|undefined} attempt to search for module and return it, else undefined
+	 */
+	findModule(identifier) {
+		return this._modules.get(identifier);
+	}
+
+	/**
+	 * Schedules a build of the module object
+	 * @param {Module} module module to be built
+	 * @param {ModuleCallback} callback the callback
+	 * @returns {void}
+	 */
+	buildModule(module, callback) {
+		this.buildQueue.add(module, callback);
 	}
 
 	/**
 	 * Builds the module object
-	 *
 	 * @param {Module} module module to be built
-	 * @param {boolean} optional optional flag
-	 * @param {Module=} origin origin module this module build was requested from
-	 * @param {Dependency[]=} dependencies optional dependencies from the module to be built
-	 * @param {TODO} thisCallback the callback
-	 * @returns {TODO} returns the callback function with results
+	 * @param {ModuleCallback} callback the callback
+	 * @returns {void}
 	 */
-	buildModule(module, optional, origin, dependencies, thisCallback) {
-		let callbackList = this._buildingModules.get(module);
-		if (callbackList) {
-			callbackList.push(thisCallback);
-			return;
+	_buildModule(module, callback) {
+		const currentProfile = this.profile
+			? this.moduleGraph.getProfile(module)
+			: undefined;
+		if (currentProfile !== undefined) {
+			currentProfile.markBuildingStart();
 		}
-		this._buildingModules.set(module, (callbackList = [thisCallback]));
 
-		const callback = err => {
-			this._buildingModules.delete(module);
-			for (const cb of callbackList) {
-				cb(err);
-			}
-		};
+		module.needBuild(
+			{
+				compilation: this,
+				fileSystemInfo: this.fileSystemInfo,
+				valueCacheVersions: this.valueCacheVersions
+			},
+			(err, needBuild) => {
+				if (err) return callback(err);
 
-		this.hooks.buildModule.call(module);
-		module.build(
-			this.options,
-			this,
-			this.resolverFactory.get("normal", module.resolveOptions),
-			this.inputFileSystem,
-			error => {
-				const errors = module.errors;
-				for (let indexError = 0; indexError < errors.length; indexError++) {
-					const err = errors[indexError];
-					err.origin = origin;
-					err.dependencies = dependencies;
-					if (optional) {
-						this.warnings.push(err);
-					} else {
-						this.errors.push(err);
+				if (!needBuild) {
+					if (currentProfile !== undefined) {
+						currentProfile.markBuildingEnd();
 					}
+					this.hooks.stillValidModule.call(module);
+					return callback();
 				}
 
-				const warnings = module.warnings;
-				for (
-					let indexWarning = 0;
-					indexWarning < warnings.length;
-					indexWarning++
-				) {
-					const war = warnings[indexWarning];
-					war.origin = origin;
-					war.dependencies = dependencies;
-					this.warnings.push(war);
-				}
-				const originalMap = module.dependencies.reduce((map, v, i) => {
-					map.set(v, i);
-					return map;
-				}, new Map());
-				module.dependencies.sort((a, b) => {
-					const cmp = compareLocations(a.loc, b.loc);
-					if (cmp) return cmp;
-					return originalMap.get(a) - originalMap.get(b);
-				});
-				if (error) {
-					this.hooks.failedModule.call(module, error);
-					return callback(error);
-				}
-				this.hooks.succeedModule.call(module);
-				return callback();
+				this.hooks.buildModule.call(module);
+				this.builtModules.add(module);
+				module.build(
+					this.options,
+					this,
+					this.resolverFactory.get("normal", module.resolveOptions),
+					/** @type {InputFileSystem} */
+					(this.inputFileSystem),
+					err => {
+						if (currentProfile !== undefined) {
+							currentProfile.markBuildingEnd();
+						}
+						if (err) {
+							this.hooks.failedModule.call(module, err);
+							return callback(err);
+						}
+						if (currentProfile !== undefined) {
+							currentProfile.markStoringStart();
+						}
+						this._modulesCache.store(module.identifier(), null, module, err => {
+							if (currentProfile !== undefined) {
+								currentProfile.markStoringEnd();
+							}
+							if (err) {
+								this.hooks.failedModule.call(
+									module,
+									/** @type {WebpackError} */ (err)
+								);
+								return callback(new ModuleStoreError(module, err));
+							}
+							this.hooks.succeedModule.call(module);
+							return callback();
+						});
+					}
+				);
 			}
 		);
 	}
@@ -686,702 +1559,2338 @@ class Compilation extends Tapable {
 	 * @returns {void}
 	 */
 	processModuleDependencies(module, callback) {
-		const dependencies = new Map();
-
-		const addDependency = dep => {
-			const resourceIdent = dep.getResourceIdentifier();
-			if (resourceIdent) {
-				const factory = this.dependencyFactories.get(dep.constructor);
-				if (factory === undefined) {
-					throw new Error(
-						`No module factory available for dependency type: ${
-							dep.constructor.name
-						}`
-					);
-				}
-				let innerMap = dependencies.get(factory);
-				if (innerMap === undefined) {
-					dependencies.set(factory, (innerMap = new Map()));
-				}
-				let list = innerMap.get(resourceIdent);
-				if (list === undefined) innerMap.set(resourceIdent, (list = []));
-				list.push(dep);
-			}
-		};
+		this.processDependenciesQueue.add(module, callback);
+	}
 
-		const addDependenciesBlock = block => {
+	/**
+	 * @param {Module} module to be processed for deps
+	 * @returns {void}
+	 */
+	processModuleDependenciesNonRecursive(module) {
+		/**
+		 * @param {DependenciesBlock} block block
+		 */
+		const processDependenciesBlock = block => {
 			if (block.dependencies) {
-				iterationOfArrayCallback(block.dependencies, addDependency);
+				let i = 0;
+				for (const dep of block.dependencies) {
+					this.moduleGraph.setParents(dep, block, module, i++);
+				}
 			}
 			if (block.blocks) {
-				iterationOfArrayCallback(block.blocks, addDependenciesBlock);
-			}
-			if (block.variables) {
-				iterationBlockVariable(block.variables, addDependency);
+				for (const b of block.blocks) processDependenciesBlock(b);
 			}
 		};
 
-		try {
-			addDependenciesBlock(module);
-		} catch (e) {
-			callback(e);
-		}
-
-		const sortedDependencies = [];
-
-		for (const pair1 of dependencies) {
-			for (const pair2 of pair1[1]) {
-				sortedDependencies.push({
-					factory: pair1[0],
-					dependencies: pair2[1]
-				});
-			}
-		}
-
-		this.addModuleDependencies(
-			module,
-			sortedDependencies,
-			this.bail,
-			null,
-			true,
-			callback
-		);
+		processDependenciesBlock(module);
 	}
 
 	/**
-	 * @param {Module} module module to add deps to
-	 * @param {SortedDependency[]} dependencies set of sorted dependencies to iterate through
-	 * @param {(boolean|null)=} bail whether to bail or not
-	 * @param {TODO} cacheGroup optional cacheGroup
-	 * @param {boolean} recursive whether it is recursive traversal
-	 * @param {function} callback callback for when dependencies are finished being added
+	 * @param {Module} module to be processed for deps
+	 * @param {ModuleCallback} callback callback to be triggered
 	 * @returns {void}
 	 */
-	addModuleDependencies(
-		module,
-		dependencies,
-		bail,
-		cacheGroup,
-		recursive,
-		callback
-	) {
-		const start = this.profile && Date.now();
-		const currentProfile = this.profile && {};
+	_processModuleDependencies(module, callback) {
+		/** @type {Array<{factory: ModuleFactory, dependencies: Dependency[], context: string|undefined, originModule: Module|null}>} */
+		const sortedDependencies = [];
 
-		asyncLib.forEach(
-			dependencies,
-			(item, callback) => {
-				const dependencies = item.dependencies;
+		/** @type {DependenciesBlock} */
+		let currentBlock;
+
+		/** @type {Map>} */
+		let dependencies;
+		/** @type {DepConstructor} */
+		let factoryCacheKey;
+		/** @type {ModuleFactory} */
+		let factoryCacheKey2;
+		/** @typedef {Map} FactoryCacheValue */
+		/** @type {FactoryCacheValue | undefined} */
+		let factoryCacheValue;
+		/** @type {string} */
+		let listCacheKey1;
+		/** @type {string} */
+		let listCacheKey2;
+		/** @type {Dependency[]} */
+		let listCacheValue;
+
+		let inProgressSorting = 1;
+		let inProgressTransitive = 1;
 
-				const errorAndCallback = err => {
-					err.origin = module;
-					err.dependencies = dependencies;
-					this.errors.push(err);
-					if (bail) {
-						callback(err);
-					} else {
-						callback();
+		/**
+		 * @param {WebpackError=} err error
+		 * @returns {void}
+		 */
+		const onDependenciesSorted = err => {
+			if (err) return callback(err);
+
+			// early exit without changing parallelism back and forth
+			if (sortedDependencies.length === 0 && inProgressTransitive === 1) {
+				return callback();
+			}
+
+			// This is nested so we need to allow one additional task
+			this.processDependenciesQueue.increaseParallelism();
+
+			for (const item of sortedDependencies) {
+				inProgressTransitive++;
+				// eslint-disable-next-line no-loop-func
+				this.handleModuleCreation(item, err => {
+					// In V8, the Error objects keep a reference to the functions on the stack. These warnings &
+					// errors are created inside closures that keep a reference to the Compilation, so errors are
+					// leaking the Compilation object.
+					if (err && this.bail) {
+						if (inProgressTransitive <= 0) return;
+						inProgressTransitive = -1;
+						// eslint-disable-next-line no-self-assign
+						err.stack = err.stack;
+						onTransitiveTasksFinished(err);
+						return;
 					}
-				};
-				const warningAndCallback = err => {
-					err.origin = module;
-					this.warnings.push(err);
-					callback();
-				};
+					if (--inProgressTransitive === 0) onTransitiveTasksFinished();
+				});
+			}
+			if (--inProgressTransitive === 0) onTransitiveTasksFinished();
+		};
 
-				const semaphore = this.semaphore;
-				semaphore.acquire(() => {
-					const factory = item.factory;
-					factory.create(
-						{
-							contextInfo: {
-								issuer: module.nameForCondition && module.nameForCondition(),
-								compiler: this.compiler.name
-							},
-							resolveOptions: module.resolveOptions,
-							context: module.context,
-							dependencies: dependencies
-						},
-						(err, dependentModule) => {
-							let afterFactory;
-
-							const isOptional = () => {
-								return dependencies.every(d => d.optional);
-							};
+		/**
+		 * @param {WebpackError=} err error
+		 * @returns {void}
+		 */
+		const onTransitiveTasksFinished = err => {
+			if (err) return callback(err);
+			this.processDependenciesQueue.decreaseParallelism();
 
-							const errorOrWarningAndCallback = err => {
-								if (isOptional()) {
-									return warningAndCallback(err);
-								} else {
-									return errorAndCallback(err);
-								}
-							};
+			return callback();
+		};
 
+		/**
+		 * @param {Dependency} dep dependency
+		 * @param {number} index index in block
+		 * @returns {void}
+		 */
+		const processDependency = (dep, index) => {
+			this.moduleGraph.setParents(dep, currentBlock, module, index);
+			if (this._unsafeCache) {
+				try {
+					const unsafeCachedModule = unsafeCacheDependencies.get(dep);
+					if (unsafeCachedModule === null) return;
+					if (unsafeCachedModule !== undefined) {
+						if (
+							this._restoredUnsafeCacheModuleEntries.has(unsafeCachedModule)
+						) {
+							this._handleExistingModuleFromUnsafeCache(
+								module,
+								dep,
+								unsafeCachedModule
+							);
+							return;
+						}
+						const identifier = unsafeCachedModule.identifier();
+						const cachedModule =
+							this._restoredUnsafeCacheEntries.get(identifier);
+						if (cachedModule !== undefined) {
+							// update unsafe cache to new module
+							unsafeCacheDependencies.set(dep, cachedModule);
+							this._handleExistingModuleFromUnsafeCache(
+								module,
+								dep,
+								cachedModule
+							);
+							return;
+						}
+						inProgressSorting++;
+						this._modulesCache.get(identifier, null, (err, cachedModule) => {
 							if (err) {
-								semaphore.release();
-								return errorOrWarningAndCallback(
-									new ModuleNotFoundError(module, err)
-								);
+								if (inProgressSorting <= 0) return;
+								inProgressSorting = -1;
+								onDependenciesSorted(/** @type {WebpackError} */ (err));
+								return;
 							}
-							if (!dependentModule) {
-								semaphore.release();
-								return process.nextTick(callback);
+							try {
+								if (!this._restoredUnsafeCacheEntries.has(identifier)) {
+									const data = unsafeCacheData.get(cachedModule);
+									if (data === undefined) {
+										processDependencyForResolving(dep);
+										if (--inProgressSorting === 0) onDependenciesSorted();
+										return;
+									}
+									if (cachedModule !== unsafeCachedModule) {
+										unsafeCacheDependencies.set(dep, cachedModule);
+									}
+									cachedModule.restoreFromUnsafeCache(
+										data,
+										this.params.normalModuleFactory,
+										this.params
+									);
+									this._restoredUnsafeCacheEntries.set(
+										identifier,
+										cachedModule
+									);
+									this._restoredUnsafeCacheModuleEntries.add(cachedModule);
+									if (!this.modules.has(cachedModule)) {
+										inProgressTransitive++;
+										this._handleNewModuleFromUnsafeCache(
+											module,
+											dep,
+											cachedModule,
+											err => {
+												if (err) {
+													if (inProgressTransitive <= 0) return;
+													inProgressTransitive = -1;
+													onTransitiveTasksFinished(err);
+												}
+												if (--inProgressTransitive === 0)
+													return onTransitiveTasksFinished();
+											}
+										);
+										if (--inProgressSorting === 0) onDependenciesSorted();
+										return;
+									}
+								}
+								if (unsafeCachedModule !== cachedModule) {
+									unsafeCacheDependencies.set(dep, cachedModule);
+								}
+								this._handleExistingModuleFromUnsafeCache(
+									module,
+									dep,
+									cachedModule
+								); // a3
+							} catch (err) {
+								if (inProgressSorting <= 0) return;
+								inProgressSorting = -1;
+								onDependenciesSorted(/** @type {WebpackError} */ (err));
+								return;
 							}
-							if (currentProfile) {
-								afterFactory = Date.now();
-								currentProfile.factory = afterFactory - start;
+							if (--inProgressSorting === 0) onDependenciesSorted();
+						});
+						return;
+					}
+				} catch (err) {
+					// eslint-disable-next-line no-console
+					console.error(err);
+				}
+			}
+			processDependencyForResolving(dep);
+		};
+
+		/**
+		 * @param {Dependency} dep dependency
+		 * @returns {void}
+		 */
+		const processDependencyForResolving = dep => {
+			const resourceIdent = dep.getResourceIdentifier();
+			if (resourceIdent !== undefined && resourceIdent !== null) {
+				const category = dep.category;
+				const constructor = /** @type {DepConstructor} */ (dep.constructor);
+				if (factoryCacheKey === constructor) {
+					// Fast path 1: same constructor as prev item
+					if (listCacheKey1 === category && listCacheKey2 === resourceIdent) {
+						// Super fast path 1: also same resource
+						listCacheValue.push(dep);
+						return;
+					}
+				} else {
+					const factory = this.dependencyFactories.get(constructor);
+					if (factory === undefined) {
+						throw new Error(
+							`No module factory available for dependency type: ${constructor.name}`
+						);
+					}
+					if (factoryCacheKey2 === factory) {
+						// Fast path 2: same factory as prev item
+						factoryCacheKey = constructor;
+						if (listCacheKey1 === category && listCacheKey2 === resourceIdent) {
+							// Super fast path 2: also same resource
+							listCacheValue.push(dep);
+							return;
+						}
+					} else {
+						// Slow path
+						if (factoryCacheKey2 !== undefined) {
+							// Archive last cache entry
+							if (dependencies === undefined) dependencies = new Map();
+							dependencies.set(
+								factoryCacheKey2,
+								/** @type {FactoryCacheValue} */ (factoryCacheValue)
+							);
+							factoryCacheValue = dependencies.get(factory);
+							if (factoryCacheValue === undefined) {
+								factoryCacheValue = new Map();
 							}
+						} else {
+							factoryCacheValue = new Map();
+						}
+						factoryCacheKey = constructor;
+						factoryCacheKey2 = factory;
+					}
+				}
+				// Here webpack is using heuristic that assumes
+				// mostly esm dependencies would be used
+				// so we don't allocate extra string for them
+				const cacheKey =
+					category === esmDependencyCategory
+						? resourceIdent
+						: `${category}${resourceIdent}`;
+				let list = /** @type {FactoryCacheValue} */ (factoryCacheValue).get(
+					cacheKey
+				);
+				if (list === undefined) {
+					/** @type {FactoryCacheValue} */
+					(factoryCacheValue).set(cacheKey, (list = []));
+					sortedDependencies.push({
+						factory: factoryCacheKey2,
+						dependencies: list,
+						context: dep.getContext(),
+						originModule: module
+					});
+				}
+				list.push(dep);
+				listCacheKey1 = category;
+				listCacheKey2 = resourceIdent;
+				listCacheValue = list;
+			}
+		};
 
-							const iterationDependencies = depend => {
-								for (let index = 0; index < depend.length; index++) {
-									const dep = depend[index];
-									dep.module = dependentModule;
-									dependentModule.addReason(module, dep);
-								}
-							};
+		try {
+			/** @type {DependenciesBlock[]} */
+			const queue = [module];
+			do {
+				const block = /** @type {DependenciesBlock} */ (queue.pop());
+				if (block.dependencies) {
+					currentBlock = block;
+					let i = 0;
+					for (const dep of block.dependencies) processDependency(dep, i++);
+				}
+				if (block.blocks) {
+					for (const b of block.blocks) queue.push(b);
+				}
+			} while (queue.length !== 0);
+		} catch (err) {
+			return callback(/** @type {WebpackError} */ (err));
+		}
 
-							const addModuleResult = this.addModule(
-								dependentModule,
-								cacheGroup
-							);
-							dependentModule = addModuleResult.module;
-							iterationDependencies(dependencies);
+		if (--inProgressSorting === 0) onDependenciesSorted();
+	}
 
-							const afterBuild = () => {
-								if (currentProfile) {
-									const afterBuilding = Date.now();
-									currentProfile.building = afterBuilding - afterFactory;
-								}
+	/**
+	 * @private
+	 * @param {Module} originModule original module
+	 * @param {Dependency} dependency dependency
+	 * @param {Module} module cached module
+	 * @param {Callback} callback callback
+	 */
+	_handleNewModuleFromUnsafeCache(originModule, dependency, module, callback) {
+		const moduleGraph = this.moduleGraph;
 
-								if (recursive && addModuleResult.dependencies) {
-									this.processModuleDependencies(dependentModule, callback);
-								} else {
-									return callback();
-								}
-							};
+		moduleGraph.setResolvedModule(originModule, dependency, module);
 
-							if (addModuleResult.issuer) {
-								if (currentProfile) {
-									dependentModule.profile = currentProfile;
-								}
+		moduleGraph.setIssuerIfUnset(
+			module,
+			originModule !== undefined ? originModule : null
+		);
 
-								dependentModule.issuer = module;
-							} else {
-								if (this.profile) {
-									if (module.profile) {
-										const time = Date.now() - start;
-										if (
-											!module.profile.dependencies ||
-											time > module.profile.dependencies
-										) {
-											module.profile.dependencies = time;
-										}
-									}
-								}
-							}
+		this._modules.set(module.identifier(), module);
+		this.modules.add(module);
+		if (this._backCompat)
+			ModuleGraph.setModuleGraphForModule(module, this.moduleGraph);
 
-							if (addModuleResult.build) {
-								this.buildModule(
-									dependentModule,
-									isOptional(),
-									module,
-									dependencies,
-									err => {
-										if (err) {
-											semaphore.release();
-											return errorOrWarningAndCallback(err);
-										}
+		this._handleModuleBuildAndDependencies(
+			originModule,
+			module,
+			true,
+			false,
+			callback
+		);
+	}
 
-										if (currentProfile) {
-											const afterBuilding = Date.now();
-											currentProfile.building = afterBuilding - afterFactory;
-										}
+	/**
+	 * @private
+	 * @param {Module} originModule original modules
+	 * @param {Dependency} dependency dependency
+	 * @param {Module} module cached module
+	 */
+	_handleExistingModuleFromUnsafeCache(originModule, dependency, module) {
+		const moduleGraph = this.moduleGraph;
 
-										semaphore.release();
-										afterBuild();
-									}
-								);
-							} else {
-								semaphore.release();
-								this.waitForBuildingFinished(dependentModule, afterBuild);
-							}
+		moduleGraph.setResolvedModule(originModule, dependency, module);
+	}
+
+	/**
+	 * @typedef {object} HandleModuleCreationOptions
+	 * @property {ModuleFactory} factory
+	 * @property {Dependency[]} dependencies
+	 * @property {Module | null} originModule
+	 * @property {Partial=} contextInfo
+	 * @property {string=} context
+	 * @property {boolean=} recursive recurse into dependencies of the created module
+	 * @property {boolean=} connectOrigin connect the resolved module with the origin module
+	 * @property {boolean=} checkCycle check the cycle dependencies of the created module
+	 */
+
+	/**
+	 * @param {HandleModuleCreationOptions} options options object
+	 * @param {ModuleCallback} callback callback
+	 * @returns {void}
+	 */
+	handleModuleCreation(
+		{
+			factory,
+			dependencies,
+			originModule,
+			contextInfo,
+			context,
+			recursive = true,
+			connectOrigin = recursive,
+			checkCycle = !recursive
+		},
+		callback
+	) {
+		const moduleGraph = this.moduleGraph;
+
+		const currentProfile = this.profile ? new ModuleProfile() : undefined;
+
+		this.factorizeModule(
+			{
+				currentProfile,
+				factory,
+				dependencies,
+				factoryResult: true,
+				originModule,
+				contextInfo,
+				context
+			},
+			(err, factoryResult) => {
+				const applyFactoryResultDependencies = () => {
+					const { fileDependencies, contextDependencies, missingDependencies } =
+						/** @type {ModuleFactoryResult} */ (factoryResult);
+					if (fileDependencies) {
+						this.fileDependencies.addAll(fileDependencies);
+					}
+					if (contextDependencies) {
+						this.contextDependencies.addAll(contextDependencies);
+					}
+					if (missingDependencies) {
+						this.missingDependencies.addAll(missingDependencies);
+					}
+				};
+				if (err) {
+					if (factoryResult) applyFactoryResultDependencies();
+					if (dependencies.every(d => d.optional)) {
+						this.warnings.push(err);
+						return callback();
+					}
+					this.errors.push(err);
+					return callback(err);
+				}
+
+				const newModule =
+					/** @type {ModuleFactoryResult} */
+					(factoryResult).module;
+
+				if (!newModule) {
+					applyFactoryResultDependencies();
+					return callback();
+				}
+
+				if (currentProfile !== undefined) {
+					moduleGraph.setProfile(newModule, currentProfile);
+				}
+
+				this.addModule(newModule, (err, _module) => {
+					if (err) {
+						applyFactoryResultDependencies();
+						if (!err.module) {
+							err.module = _module;
 						}
+						this.errors.push(err);
+
+						return callback(err);
+					}
+
+					const module =
+						/** @type {ModuleWithRestoreFromUnsafeCache} */
+						(_module);
+
+					if (
+						this._unsafeCache &&
+						/** @type {ModuleFactoryResult} */
+						(factoryResult).cacheable !== false &&
+						module.restoreFromUnsafeCache &&
+						this._unsafeCachePredicate(module)
+					) {
+						const unsafeCacheableModule =
+							/** @type {ModuleWithRestoreFromUnsafeCache} */
+							(module);
+						for (const dependency of dependencies) {
+							moduleGraph.setResolvedModule(
+								connectOrigin ? originModule : null,
+								dependency,
+								unsafeCacheableModule
+							);
+							unsafeCacheDependencies.set(dependency, unsafeCacheableModule);
+						}
+						if (!unsafeCacheData.has(unsafeCacheableModule)) {
+							unsafeCacheData.set(
+								unsafeCacheableModule,
+								unsafeCacheableModule.getUnsafeCacheData()
+							);
+						}
+					} else {
+						applyFactoryResultDependencies();
+						for (const dependency of dependencies) {
+							moduleGraph.setResolvedModule(
+								connectOrigin ? originModule : null,
+								dependency,
+								module
+							);
+						}
+					}
+
+					moduleGraph.setIssuerIfUnset(
+						module,
+						originModule !== undefined ? originModule : null
+					);
+					if (module !== newModule && currentProfile !== undefined) {
+						const otherProfile = moduleGraph.getProfile(module);
+						if (otherProfile !== undefined) {
+							currentProfile.mergeInto(otherProfile);
+						} else {
+							moduleGraph.setProfile(module, currentProfile);
+						}
+					}
+
+					this._handleModuleBuildAndDependencies(
+						originModule,
+						module,
+						recursive,
+						checkCycle,
+						callback
 					);
 				});
+			}
+		);
+	}
+
+	/**
+	 * @private
+	 * @param {Module | null} originModule original module
+	 * @param {Module} module module
+	 * @param {boolean} recursive true if make it recursive, otherwise false
+	 * @param {boolean} checkCycle true if need to check cycle, otherwise false
+	 * @param {ModuleCallback} callback callback
+	 * @returns {void}
+	 */
+	_handleModuleBuildAndDependencies(
+		originModule,
+		module,
+		recursive,
+		checkCycle,
+		callback
+	) {
+		// Check for cycles when build is trigger inside another build
+		/** @type {Set | undefined} */
+		let creatingModuleDuringBuildSet;
+		if (
+			checkCycle &&
+			this.buildQueue.isProcessing(/** @type {Module} */ (originModule))
+		) {
+			// Track build dependency
+			creatingModuleDuringBuildSet = this.creatingModuleDuringBuild.get(
+				/** @type {Module} */
+				(originModule)
+			);
+			if (creatingModuleDuringBuildSet === undefined) {
+				creatingModuleDuringBuildSet = new Set();
+				this.creatingModuleDuringBuild.set(
+					/** @type {Module} */
+					(originModule),
+					creatingModuleDuringBuildSet
+				);
+			}
+			creatingModuleDuringBuildSet.add(module);
+
+			// When building is blocked by another module
+			// search for a cycle, cancel the cycle by throwing
+			// an error (otherwise this would deadlock)
+			const blockReasons = this.creatingModuleDuringBuild.get(module);
+			if (blockReasons !== undefined) {
+				const set = new Set(blockReasons);
+				for (const item of set) {
+					const blockReasons = this.creatingModuleDuringBuild.get(item);
+					if (blockReasons !== undefined) {
+						for (const m of blockReasons) {
+							if (m === module) {
+								return callback(new BuildCycleError(module));
+							}
+							set.add(m);
+						}
+					}
+				}
+			}
+		}
+
+		this.buildModule(module, err => {
+			if (creatingModuleDuringBuildSet !== undefined) {
+				creatingModuleDuringBuildSet.delete(module);
+			}
+			if (err) {
+				if (!err.module) {
+					err.module = module;
+				}
+				this.errors.push(err);
+
+				return callback(err);
+			}
+
+			if (!recursive) {
+				this.processModuleDependenciesNonRecursive(module);
+				callback(null, module);
+				return;
+			}
+
+			// This avoids deadlocks for circular dependencies
+			if (this.processDependenciesQueue.isProcessing(module)) {
+				return callback(null, module);
+			}
+
+			this.processModuleDependencies(module, err => {
+				if (err) {
+					return callback(err);
+				}
+				callback(null, module);
+			});
+		});
+	}
+
+	/**
+	 * @param {FactorizeModuleOptions} options options object
+	 * @param {ModuleOrFactoryResultCallback} callback callback
+	 * @returns {void}
+	 */
+	_factorizeModule(
+		{
+			currentProfile,
+			factory,
+			dependencies,
+			originModule,
+			factoryResult,
+			contextInfo,
+			context
+		},
+		callback
+	) {
+		if (currentProfile !== undefined) {
+			currentProfile.markFactoryStart();
+		}
+		factory.create(
+			{
+				contextInfo: {
+					issuer: originModule
+						? /** @type {string} */ (originModule.nameForCondition())
+						: "",
+					issuerLayer: originModule ? originModule.layer : null,
+					compiler: /** @type {string} */ (this.compiler.name),
+					...contextInfo
+				},
+				resolveOptions: originModule ? originModule.resolveOptions : undefined,
+				context:
+					context ||
+					(originModule
+						? /** @type {string} */ (originModule.context)
+						: /** @type {string} */ (this.compiler.context)),
+				dependencies
 			},
-			err => {
-				// In V8, the Error objects keep a reference to the functions on the stack. These warnings &
-				// errors are created inside closures that keep a reference to the Compilation, so errors are
-				// leaking the Compilation object.
+			(err, result) => {
+				if (result) {
+					// TODO webpack 6: remove
+					// For backward-compat
+					if (result.module === undefined && result instanceof Module) {
+						result = {
+							module: result
+						};
+					}
+					if (!factoryResult) {
+						const {
+							fileDependencies,
+							contextDependencies,
+							missingDependencies
+						} = result;
+						if (fileDependencies) {
+							this.fileDependencies.addAll(fileDependencies);
+						}
+						if (contextDependencies) {
+							this.contextDependencies.addAll(contextDependencies);
+						}
+						if (missingDependencies) {
+							this.missingDependencies.addAll(missingDependencies);
+						}
+					}
+				}
+				if (err) {
+					const notFoundError = new ModuleNotFoundError(
+						originModule,
+						err,
+						/** @type {DependencyLocation} */
+						(dependencies.map(d => d.loc).find(Boolean))
+					);
+					return callback(notFoundError, factoryResult ? result : undefined);
+				}
+				if (!result) {
+					return callback();
+				}
+
+				if (currentProfile !== undefined) {
+					currentProfile.markFactoryEnd();
+				}
+
+				callback(null, factoryResult ? result : result.module);
+			}
+		);
+	}
+
+	/**
+	 * @param {string} context context string path
+	 * @param {Dependency} dependency dependency used to create Module chain
+	 * @param {ModuleCallback} callback callback for when module chain is complete
+	 * @returns {void} will throw if dependency instance is not a valid Dependency
+	 */
+	addModuleChain(context, dependency, callback) {
+		return this.addModuleTree({ context, dependency }, callback);
+	}
+
+	/**
+	 * @param {object} options options
+	 * @param {string} options.context context string path
+	 * @param {Dependency} options.dependency dependency used to create Module chain
+	 * @param {Partial=} options.contextInfo additional context info for the root module
+	 * @param {ModuleCallback} callback callback for when module chain is complete
+	 * @returns {void} will throw if dependency instance is not a valid Dependency
+	 */
+	addModuleTree({ context, dependency, contextInfo }, callback) {
+		if (
+			typeof dependency !== "object" ||
+			dependency === null ||
+			!dependency.constructor
+		) {
+			return callback(
+				new WebpackError("Parameter 'dependency' must be a Dependency")
+			);
+		}
+		const Dep = /** @type {DepConstructor} */ (dependency.constructor);
+		const moduleFactory = this.dependencyFactories.get(Dep);
+		if (!moduleFactory) {
+			return callback(
+				new WebpackError(
+					`No dependency factory available for this dependency type: ${dependency.constructor.name}`
+				)
+			);
+		}
+
+		this.handleModuleCreation(
+			{
+				factory: moduleFactory,
+				dependencies: [dependency],
+				originModule: null,
+				contextInfo,
+				context
+			},
+			(err, result) => {
+				if (err && this.bail) {
+					callback(err);
+					this.buildQueue.stop();
+					this.rebuildQueue.stop();
+					this.processDependenciesQueue.stop();
+					this.factorizeQueue.stop();
+				} else if (!err && result) {
+					callback(null, result);
+				} else {
+					callback();
+				}
+			}
+		);
+	}
+
+	/**
+	 * @param {string} context context path for entry
+	 * @param {Dependency} entry entry dependency that should be followed
+	 * @param {string | EntryOptions} optionsOrName options or deprecated name of entry
+	 * @param {ModuleCallback} callback callback function
+	 * @returns {void} returns
+	 */
+	addEntry(context, entry, optionsOrName, callback) {
+		// TODO webpack 6 remove
+		const options =
+			typeof optionsOrName === "object"
+				? optionsOrName
+				: { name: optionsOrName };
+
+		this._addEntryItem(context, entry, "dependencies", options, callback);
+	}
+
+	/**
+	 * @param {string} context context path for entry
+	 * @param {Dependency} dependency dependency that should be followed
+	 * @param {EntryOptions} options options
+	 * @param {ModuleCallback} callback callback function
+	 * @returns {void} returns
+	 */
+	addInclude(context, dependency, options, callback) {
+		this._addEntryItem(
+			context,
+			dependency,
+			"includeDependencies",
+			options,
+			callback
+		);
+	}
+
+	/**
+	 * @param {string} context context path for entry
+	 * @param {Dependency} entry entry dependency that should be followed
+	 * @param {"dependencies" | "includeDependencies"} target type of entry
+	 * @param {EntryOptions} options options
+	 * @param {ModuleCallback} callback callback function
+	 * @returns {void} returns
+	 */
+	_addEntryItem(context, entry, target, options, callback) {
+		const { name } = options;
+		let entryData =
+			name !== undefined ? this.entries.get(name) : this.globalEntry;
+		if (entryData === undefined) {
+			entryData = {
+				dependencies: [],
+				includeDependencies: [],
+				options: {
+					name: undefined,
+					...options
+				}
+			};
+			entryData[target].push(entry);
+			this.entries.set(
+				/** @type {NonNullable} */
+				(name),
+				entryData
+			);
+		} else {
+			entryData[target].push(entry);
+			for (const _key of Object.keys(options)) {
+				const key = /** @type {keyof EntryOptions} */ (_key);
+				if (options[key] === undefined) continue;
+				if (entryData.options[key] === options[key]) continue;
+				if (
+					Array.isArray(entryData.options[key]) &&
+					Array.isArray(options[key]) &&
+					arrayEquals(entryData.options[key], options[key])
+				) {
+					continue;
+				}
+				if (entryData.options[key] === undefined) {
+					/** @type {TODO} */
+					(entryData.options)[key] =
+						/** @type {NonNullable} */
+						(options[key]);
+				} else {
+					return callback(
+						new WebpackError(
+							`Conflicting entry option ${key} = ${entryData.options[key]} vs ${options[key]}`
+						)
+					);
+				}
+			}
+		}
+
+		this.hooks.addEntry.call(entry, options);
+
+		this.addModuleTree(
+			{
+				context,
+				dependency: entry,
+				contextInfo: entryData.options.layer
+					? { issuerLayer: entryData.options.layer }
+					: undefined
+			},
+			(err, module) => {
+				if (err) {
+					this.hooks.failedEntry.call(entry, options, err);
+					return callback(err);
+				}
+				this.hooks.succeedEntry.call(
+					entry,
+					options,
+					/** @type {Module} */
+					(module)
+				);
+				return callback(null, module);
+			}
+		);
+	}
+
+	/**
+	 * @param {Module} module module to be rebuilt
+	 * @param {ModuleCallback} callback callback when module finishes rebuilding
+	 * @returns {void}
+	 */
+	rebuildModule(module, callback) {
+		this.rebuildQueue.add(module, callback);
+	}
+
+	/**
+	 * @param {Module} module module to be rebuilt
+	 * @param {ModuleCallback} callback callback when module finishes rebuilding
+	 * @returns {void}
+	 */
+	_rebuildModule(module, callback) {
+		this.hooks.rebuildModule.call(module);
+		const oldDependencies = module.dependencies.slice();
+		const oldBlocks = module.blocks.slice();
+		module.invalidateBuild();
+		this.buildQueue.invalidate(module);
+		this.buildModule(module, err => {
+			if (err) {
+				return this.hooks.finishRebuildingModule.callAsync(module, err2 => {
+					if (err2) {
+						callback(
+							makeWebpackError(err2, "Compilation.hooks.finishRebuildingModule")
+						);
+						return;
+					}
+					callback(err);
+				});
+			}
+
+			this.processDependenciesQueue.invalidate(module);
+			this.moduleGraph.unfreeze();
+			this.processModuleDependencies(module, err => {
+				if (err) return callback(err);
+				this.removeReasonsOfDependencyBlock(module, {
+					dependencies: oldDependencies,
+					blocks: oldBlocks
+				});
+				this.hooks.finishRebuildingModule.callAsync(module, err2 => {
+					if (err2) {
+						callback(
+							makeWebpackError(err2, "Compilation.hooks.finishRebuildingModule")
+						);
+						return;
+					}
+					callback(null, module);
+				});
+			});
+		});
+	}
+
+	/**
+	 * @private
+	 * @param {Set} modules modules
+	 */
+	_computeAffectedModules(modules) {
+		const moduleMemCacheCache = this.compiler.moduleMemCaches;
+		if (!moduleMemCacheCache) return;
+		if (!this.moduleMemCaches) {
+			this.moduleMemCaches = new Map();
+			this.moduleGraph.setModuleMemCaches(this.moduleMemCaches);
+		}
+		const { moduleGraph, moduleMemCaches } = this;
+		const affectedModules = new Set();
+		const infectedModules = new Set();
+		let statNew = 0;
+		let statChanged = 0;
+		let statUnchanged = 0;
+		let statReferencesChanged = 0;
+		let statWithoutBuild = 0;
+
+		/**
+		 * @param {Module} module module
+		 * @returns {WeakReferences | undefined} references
+		 */
+		const computeReferences = module => {
+			/** @type {WeakReferences | undefined} */
+			let references;
+			for (const connection of moduleGraph.getOutgoingConnections(module)) {
+				const d = connection.dependency;
+				const m = connection.module;
+				if (!d || !m || unsafeCacheDependencies.has(d)) continue;
+				if (references === undefined) references = new WeakMap();
+				references.set(d, m);
+			}
+			return references;
+		};
+
+		/**
+		 * @param {Module} module the module
+		 * @param {WeakReferences | undefined} references references
+		 * @returns {boolean} true, when the references differ
+		 */
+		const compareReferences = (module, references) => {
+			if (references === undefined) return true;
+			for (const connection of moduleGraph.getOutgoingConnections(module)) {
+				const d = connection.dependency;
+				if (!d) continue;
+				const entry = references.get(d);
+				if (entry === undefined) continue;
+				if (entry !== connection.module) return false;
+			}
+			return true;
+		};
+
+		const modulesWithoutCache = new Set(modules);
+		for (const [module, cachedMemCache] of moduleMemCacheCache) {
+			if (modulesWithoutCache.has(module)) {
+				const buildInfo = module.buildInfo;
+				if (buildInfo) {
+					if (cachedMemCache.buildInfo !== buildInfo) {
+						// use a new one
+						/** @type {MemCache} */
+						const memCache = new WeakTupleMap();
+						moduleMemCaches.set(module, memCache);
+						affectedModules.add(module);
+						cachedMemCache.buildInfo = buildInfo;
+						cachedMemCache.references = computeReferences(module);
+						cachedMemCache.memCache = memCache;
+						statChanged++;
+					} else if (!compareReferences(module, cachedMemCache.references)) {
+						// use a new one
+						/** @type {MemCache} */
+						const memCache = new WeakTupleMap();
+						moduleMemCaches.set(module, memCache);
+						affectedModules.add(module);
+						cachedMemCache.references = computeReferences(module);
+						cachedMemCache.memCache = memCache;
+						statReferencesChanged++;
+					} else {
+						// keep the old mem cache
+						moduleMemCaches.set(module, cachedMemCache.memCache);
+						statUnchanged++;
+					}
+				} else {
+					infectedModules.add(module);
+					moduleMemCacheCache.delete(module);
+					statWithoutBuild++;
+				}
+				modulesWithoutCache.delete(module);
+			} else {
+				moduleMemCacheCache.delete(module);
+			}
+		}
+
+		for (const module of modulesWithoutCache) {
+			const buildInfo = module.buildInfo;
+			if (buildInfo) {
+				// create a new entry
+				const memCache = new WeakTupleMap();
+				moduleMemCacheCache.set(module, {
+					buildInfo,
+					references: computeReferences(module),
+					memCache
+				});
+				moduleMemCaches.set(module, memCache);
+				affectedModules.add(module);
+				statNew++;
+			} else {
+				infectedModules.add(module);
+				statWithoutBuild++;
+			}
+		}
+
+		/**
+		 * @param {readonly ModuleGraphConnection[]} connections connections
+		 * @returns {symbol|boolean} result
+		 */
+		const reduceAffectType = connections => {
+			let affected = false;
+			for (const { dependency } of connections) {
+				if (!dependency) continue;
+				const type = dependency.couldAffectReferencingModule();
+				if (type === Dependency.TRANSITIVE) return Dependency.TRANSITIVE;
+				if (type === false) continue;
+				affected = true;
+			}
+			return affected;
+		};
+		const directOnlyInfectedModules = new Set();
+		for (const module of infectedModules) {
+			for (const [
+				referencingModule,
+				connections
+			] of moduleGraph.getIncomingConnectionsByOriginModule(module)) {
+				if (!referencingModule) continue;
+				if (infectedModules.has(referencingModule)) continue;
+				const type = reduceAffectType(connections);
+				if (!type) continue;
+				if (type === true) {
+					directOnlyInfectedModules.add(referencingModule);
+				} else {
+					infectedModules.add(referencingModule);
+				}
+			}
+		}
+		for (const module of directOnlyInfectedModules) infectedModules.add(module);
+		const directOnlyAffectModules = new Set();
+		for (const module of affectedModules) {
+			for (const [
+				referencingModule,
+				connections
+			] of moduleGraph.getIncomingConnectionsByOriginModule(module)) {
+				if (!referencingModule) continue;
+				if (infectedModules.has(referencingModule)) continue;
+				if (affectedModules.has(referencingModule)) continue;
+				const type = reduceAffectType(connections);
+				if (!type) continue;
+				if (type === true) {
+					directOnlyAffectModules.add(referencingModule);
+				} else {
+					affectedModules.add(referencingModule);
+				}
+				/** @type {MemCache} */
+				const memCache = new WeakTupleMap();
+				const cache =
+					/** @type {ModuleMemCachesItem} */
+					(moduleMemCacheCache.get(referencingModule));
+				cache.memCache = memCache;
+				moduleMemCaches.set(referencingModule, memCache);
+			}
+		}
+		for (const module of directOnlyAffectModules) affectedModules.add(module);
+		this.logger.log(
+			`${Math.round(
+				(100 * (affectedModules.size + infectedModules.size)) /
+					this.modules.size
+			)}% (${affectedModules.size} affected + ${
+				infectedModules.size
+			} infected of ${
+				this.modules.size
+			}) modules flagged as affected (${statNew} new modules, ${statChanged} changed, ${statReferencesChanged} references changed, ${statUnchanged} unchanged, ${statWithoutBuild} were not built)`
+		);
+	}
+
+	_computeAffectedModulesWithChunkGraph() {
+		const { moduleMemCaches } = this;
+		if (!moduleMemCaches) return;
+		const moduleMemCaches2 = (this.moduleMemCaches2 = new Map());
+		const { moduleGraph, chunkGraph } = this;
+		const key = "memCache2";
+		let statUnchanged = 0;
+		let statChanged = 0;
+		let statNew = 0;
+		/**
+		 * @param {Module} module module
+		 * @returns {References} references
+		 */
+		const computeReferences = module => {
+			const id = /** @type {ModuleId} */ (chunkGraph.getModuleId(module));
+			/** @type {Map | undefined} */
+			let modules;
+			/** @type {(string | number | null)[] | undefined} */
+			let blocks;
+			const outgoing = moduleGraph.getOutgoingConnectionsByModule(module);
+			if (outgoing !== undefined) {
+				for (const m of outgoing.keys()) {
+					if (!m) continue;
+					if (modules === undefined) modules = new Map();
+					modules.set(m, /** @type {ModuleId} */ (chunkGraph.getModuleId(m)));
+				}
+			}
+			if (module.blocks.length > 0) {
+				blocks = [];
+				const queue = Array.from(module.blocks);
+				for (const block of queue) {
+					const chunkGroup = chunkGraph.getBlockChunkGroup(block);
+					if (chunkGroup) {
+						for (const chunk of chunkGroup.chunks) {
+							blocks.push(chunk.id);
+						}
+					} else {
+						blocks.push(null);
+					}
+					// eslint-disable-next-line prefer-spread
+					queue.push.apply(queue, block.blocks);
+				}
+			}
+			return { id, modules, blocks };
+		};
+		/**
+		 * @param {Module} module module
+		 * @param {object} references references
+		 * @param {string | number} references.id id
+		 * @param {Map=} references.modules modules
+		 * @param {(string | number | null)[]=} references.blocks blocks
+		 * @returns {boolean} ok?
+		 */
+		const compareReferences = (module, { id, modules, blocks }) => {
+			if (id !== chunkGraph.getModuleId(module)) return false;
+			if (modules !== undefined) {
+				for (const [module, id] of modules) {
+					if (chunkGraph.getModuleId(module) !== id) return false;
+				}
+			}
+			if (blocks !== undefined) {
+				const queue = Array.from(module.blocks);
+				let i = 0;
+				for (const block of queue) {
+					const chunkGroup = chunkGraph.getBlockChunkGroup(block);
+					if (chunkGroup) {
+						for (const chunk of chunkGroup.chunks) {
+							if (i >= blocks.length || blocks[i++] !== chunk.id) return false;
+						}
+					} else if (i >= blocks.length || blocks[i++] !== null) {
+						return false;
+					}
+					// eslint-disable-next-line prefer-spread
+					queue.push.apply(queue, block.blocks);
+				}
+				if (i !== blocks.length) return false;
+			}
+			return true;
+		};
+
+		for (const [module, memCache] of moduleMemCaches) {
+			/** @type {{ references: References, memCache: MemCache } | undefined} */
+			const cache = memCache.get(key);
+			if (cache === undefined) {
+				/** @type {WeakTupleMap | undefined} */
+				const memCache2 = new WeakTupleMap();
+				memCache.set(key, {
+					references: computeReferences(module),
+					memCache: memCache2
+				});
+				moduleMemCaches2.set(module, memCache2);
+				statNew++;
+			} else if (!compareReferences(module, cache.references)) {
+				/** @type {WeakTupleMap | undefined} */
+				const memCache = new WeakTupleMap();
+				cache.references = computeReferences(module);
+				cache.memCache = memCache;
+				moduleMemCaches2.set(module, memCache);
+				statChanged++;
+			} else {
+				moduleMemCaches2.set(module, cache.memCache);
+				statUnchanged++;
+			}
+		}
+
+		this.logger.log(
+			`${Math.round(
+				(100 * statChanged) / (statNew + statChanged + statUnchanged)
+			)}% modules flagged as affected by chunk graph (${statNew} new modules, ${statChanged} changed, ${statUnchanged} unchanged)`
+		);
+	}
+
+	/**
+	 * @param {Callback} callback callback
+	 */
+	finish(callback) {
+		this.factorizeQueue.clear();
+		if (this.profile) {
+			this.logger.time("finish module profiles");
+			const ParallelismFactorCalculator = require("./util/ParallelismFactorCalculator");
+			const p = new ParallelismFactorCalculator();
+			const moduleGraph = this.moduleGraph;
+			/** @type {Map} */
+			const modulesWithProfiles = new Map();
+			for (const module of this.modules) {
+				const profile = moduleGraph.getProfile(module);
+				if (!profile) continue;
+				modulesWithProfiles.set(module, profile);
+				p.range(
+					profile.buildingStartTime,
+					profile.buildingEndTime,
+					f => (profile.buildingParallelismFactor = f)
+				);
+				p.range(
+					profile.factoryStartTime,
+					profile.factoryEndTime,
+					f => (profile.factoryParallelismFactor = f)
+				);
+				p.range(
+					profile.integrationStartTime,
+					profile.integrationEndTime,
+					f => (profile.integrationParallelismFactor = f)
+				);
+				p.range(
+					profile.storingStartTime,
+					profile.storingEndTime,
+					f => (profile.storingParallelismFactor = f)
+				);
+				p.range(
+					profile.restoringStartTime,
+					profile.restoringEndTime,
+					f => (profile.restoringParallelismFactor = f)
+				);
+				if (profile.additionalFactoryTimes) {
+					for (const { start, end } of profile.additionalFactoryTimes) {
+						const influence = (end - start) / profile.additionalFactories;
+						p.range(
+							start,
+							end,
+							f =>
+								(profile.additionalFactoriesParallelismFactor += f * influence)
+						);
+					}
+				}
+			}
+			p.calculate();
+
+			const logger = this.getLogger("webpack.Compilation.ModuleProfile");
+			// Avoid coverage problems due indirect changes
+			/**
+			 * @param {number} value value
+			 * @param {string} msg message
+			 */
+			/* istanbul ignore next */
+			const logByValue = (value, msg) => {
+				if (value > 1000) {
+					logger.error(msg);
+				} else if (value > 500) {
+					logger.warn(msg);
+				} else if (value > 200) {
+					logger.info(msg);
+				} else if (value > 30) {
+					logger.log(msg);
+				} else {
+					logger.debug(msg);
+				}
+			};
+			/**
+			 * @param {string} category a category
+			 * @param {(profile: ModuleProfile) => number} getDuration get duration callback
+			 * @param {(profile: ModuleProfile) => number} getParallelism get parallelism callback
+			 */
+			const logNormalSummary = (category, getDuration, getParallelism) => {
+				let sum = 0;
+				let max = 0;
+				for (const [module, profile] of modulesWithProfiles) {
+					const p = getParallelism(profile);
+					const d = getDuration(profile);
+					if (d === 0 || p === 0) continue;
+					const t = d / p;
+					sum += t;
+					if (t <= 10) continue;
+					logByValue(
+						t,
+						` | ${Math.round(t)} ms${
+							p >= 1.1 ? ` (parallelism ${Math.round(p * 10) / 10})` : ""
+						} ${category} > ${module.readableIdentifier(this.requestShortener)}`
+					);
+					max = Math.max(max, t);
+				}
+				if (sum <= 10) return;
+				logByValue(
+					Math.max(sum / 10, max),
+					`${Math.round(sum)} ms ${category}`
+				);
+			};
+			/**
+			 * @param {string} category a category
+			 * @param {(profile: ModuleProfile) => number} getDuration get duration callback
+			 * @param {(profile: ModuleProfile) => number} getParallelism get parallelism callback
+			 */
+			const logByLoadersSummary = (category, getDuration, getParallelism) => {
+				const map = new Map();
+				for (const [module, profile] of modulesWithProfiles) {
+					const list = getOrInsert(
+						map,
+						`${module.type}!${module.identifier().replace(/(!|^)[^!]*$/, "")}`,
+						() => []
+					);
+					list.push({ module, profile });
+				}
+
+				let sum = 0;
+				let max = 0;
+				for (const [key, modules] of map) {
+					let innerSum = 0;
+					let innerMax = 0;
+					for (const { module, profile } of modules) {
+						const p = getParallelism(profile);
+						const d = getDuration(profile);
+						if (d === 0 || p === 0) continue;
+						const t = d / p;
+						innerSum += t;
+						if (t <= 10) continue;
+						logByValue(
+							t,
+							` |  | ${Math.round(t)} ms${
+								p >= 1.1 ? ` (parallelism ${Math.round(p * 10) / 10})` : ""
+							} ${category} > ${module.readableIdentifier(
+								this.requestShortener
+							)}`
+						);
+						innerMax = Math.max(innerMax, t);
+					}
+					sum += innerSum;
+					if (innerSum <= 10) continue;
+					const idx = key.indexOf("!");
+					const loaders = key.slice(idx + 1);
+					const moduleType = key.slice(0, idx);
+					const t = Math.max(innerSum / 10, innerMax);
+					logByValue(
+						t,
+						` | ${Math.round(innerSum)} ms ${category} > ${
+							loaders
+								? `${
+										modules.length
+									} x ${moduleType} with ${this.requestShortener.shorten(
+										loaders
+									)}`
+								: `${modules.length} x ${moduleType}`
+						}`
+					);
+					max = Math.max(max, t);
+				}
+				if (sum <= 10) return;
+				logByValue(
+					Math.max(sum / 10, max),
+					`${Math.round(sum)} ms ${category}`
+				);
+			};
+			logNormalSummary(
+				"resolve to new modules",
+				p => p.factory,
+				p => p.factoryParallelismFactor
+			);
+			logNormalSummary(
+				"resolve to existing modules",
+				p => p.additionalFactories,
+				p => p.additionalFactoriesParallelismFactor
+			);
+			logNormalSummary(
+				"integrate modules",
+				p => p.restoring,
+				p => p.restoringParallelismFactor
+			);
+			logByLoadersSummary(
+				"build modules",
+				p => p.building,
+				p => p.buildingParallelismFactor
+			);
+			logNormalSummary(
+				"store modules",
+				p => p.storing,
+				p => p.storingParallelismFactor
+			);
+			logNormalSummary(
+				"restore modules",
+				p => p.restoring,
+				p => p.restoringParallelismFactor
+			);
+			this.logger.timeEnd("finish module profiles");
+		}
+		this.logger.time("compute affected modules");
+		this._computeAffectedModules(this.modules);
+		this.logger.timeEnd("compute affected modules");
+		this.logger.time("finish modules");
+		const { modules, moduleMemCaches } = this;
+		this.hooks.finishModules.callAsync(modules, err => {
+			this.logger.timeEnd("finish modules");
+			if (err) return callback(/** @type {WebpackError} */ (err));
+
+			// extract warnings and errors from modules
+			this.moduleGraph.freeze("dependency errors");
+			// TODO keep a cacheToken (= {}) for each module in the graph
+			// create a new one per compilation and flag all updated files
+			// and parents with it
+			this.logger.time("report dependency errors and warnings");
+			for (const module of modules) {
+				// TODO only run for modules with changed cacheToken
+				// global WeakMap> to keep modules without errors/warnings
+				const memCache = moduleMemCaches && moduleMemCaches.get(module);
+				if (memCache && memCache.get("noWarningsOrErrors")) continue;
+				let hasProblems = this.reportDependencyErrorsAndWarnings(module, [
+					module
+				]);
+				const errors = module.getErrors();
+				if (errors !== undefined) {
+					for (const error of errors) {
+						if (!error.module) {
+							error.module = module;
+						}
+						this.errors.push(error);
+						hasProblems = true;
+					}
+				}
+				const warnings = module.getWarnings();
+				if (warnings !== undefined) {
+					for (const warning of warnings) {
+						if (!warning.module) {
+							warning.module = module;
+						}
+						this.warnings.push(warning);
+						hasProblems = true;
+					}
+				}
+				if (!hasProblems && memCache) memCache.set("noWarningsOrErrors", true);
+			}
+			this.moduleGraph.unfreeze();
+			this.logger.timeEnd("report dependency errors and warnings");
+
+			callback();
+		});
+	}
+
+	unseal() {
+		this.hooks.unseal.call();
+		this.chunks.clear();
+		this.chunkGroups.length = 0;
+		this.namedChunks.clear();
+		this.namedChunkGroups.clear();
+		this.entrypoints.clear();
+		this.additionalChunkAssets.length = 0;
+		this.assets = {};
+		this.assetsInfo.clear();
+		this.moduleGraph.removeAllModuleAttributes();
+		this.moduleGraph.unfreeze();
+		this.moduleMemCaches2 = undefined;
+	}
+
+	/**
+	 * @param {Callback} callback signals when the call finishes
+	 * @returns {void}
+	 */
+	seal(callback) {
+		/**
+		 * @param {WebpackError=} err err
+		 * @returns {void}
+		 */
+		const finalCallback = err => {
+			this.factorizeQueue.clear();
+			this.buildQueue.clear();
+			this.rebuildQueue.clear();
+			this.processDependenciesQueue.clear();
+			this.addModuleQueue.clear();
+			return callback(err);
+		};
+		const chunkGraph = new ChunkGraph(
+			this.moduleGraph,
+			this.outputOptions.hashFunction
+		);
+		this.chunkGraph = chunkGraph;
+
+		if (this._backCompat) {
+			for (const module of this.modules) {
+				ChunkGraph.setChunkGraphForModule(module, chunkGraph);
+			}
+		}
+
+		this.hooks.seal.call();
+
+		this.logger.time("optimize dependencies");
+		while (this.hooks.optimizeDependencies.call(this.modules)) {
+			/* empty */
+		}
+		this.hooks.afterOptimizeDependencies.call(this.modules);
+		this.logger.timeEnd("optimize dependencies");
 
-				if (err) {
-					// eslint-disable-next-line no-self-assign
-					err.stack = err.stack;
-					return callback(err);
-				}
+		this.logger.time("create chunks");
+		this.hooks.beforeChunks.call();
+		this.moduleGraph.freeze("seal");
+		/** @type {Map} */
+		const chunkGraphInit = new Map();
+		for (const [name, { dependencies, includeDependencies, options }] of this
+			.entries) {
+			const chunk = this.addChunk(name);
+			if (options.filename) {
+				chunk.filenameTemplate = options.filename;
+			}
+			const entrypoint = new Entrypoint(options);
+			if (!options.dependOn && !options.runtime) {
+				entrypoint.setRuntimeChunk(chunk);
+			}
+			entrypoint.setEntrypointChunk(chunk);
+			this.namedChunkGroups.set(name, entrypoint);
+			this.entrypoints.set(name, entrypoint);
+			this.chunkGroups.push(entrypoint);
+			connectChunkGroupAndChunk(entrypoint, chunk);
+
+			const entryModules = new Set();
+			for (const dep of [...this.globalEntry.dependencies, ...dependencies]) {
+				entrypoint.addOrigin(
+					null,
+					{ name },
+					/** @type {Dependency & { request: string }} */
+					(dep).request
+				);
 
-				return process.nextTick(callback);
+				const module = this.moduleGraph.getModule(dep);
+				if (module) {
+					chunkGraph.connectChunkAndEntryModule(chunk, module, entrypoint);
+					entryModules.add(module);
+					const modulesList = chunkGraphInit.get(entrypoint);
+					if (modulesList === undefined) {
+						chunkGraphInit.set(entrypoint, [module]);
+					} else {
+						modulesList.push(module);
+					}
+				}
 			}
-		);
-	}
 
-	/**
-	 *
-	 * @param {string} context context string path
-	 * @param {Dependency} dependency dependency used to create Module chain
-	 * @param {OnModuleCallback} onModule function invoked on modules creation
-	 * @param {ModuleChainCallback} callback callback for when module chain is complete
-	 * @returns {void} will throw if dependency instance is not a valid Dependency
-	 */
-	_addModuleChain(context, dependency, onModule, callback) {
-		const start = this.profile && Date.now();
-		const currentProfile = this.profile && {};
+			this.assignDepths(entryModules);
 
-		const errorAndCallback = this.bail
-			? err => {
-					callback(err);
-			  }
-			: err => {
-					err.dependencies = [dependency];
-					this.errors.push(err);
-					callback();
-			  };
+			/**
+			 * @param {Dependency[]} deps deps
+			 * @returns {Module[]} sorted deps
+			 */
+			const mapAndSort = deps =>
+				/** @type {Module[]} */
+				(deps.map(dep => this.moduleGraph.getModule(dep)).filter(Boolean)).sort(
+					compareModulesByIdentifier
+				);
+			const includedModules = [
+				...mapAndSort(this.globalEntry.includeDependencies),
+				...mapAndSort(includeDependencies)
+			];
+
+			let modulesList = chunkGraphInit.get(entrypoint);
+			if (modulesList === undefined) {
+				chunkGraphInit.set(entrypoint, (modulesList = []));
+			}
+			for (const module of includedModules) {
+				this.assignDepth(module);
+				modulesList.push(module);
+			}
+		}
+		const runtimeChunks = new Set();
+		outer: for (const [
+			name,
+			{
+				options: { dependOn, runtime }
+			}
+		] of this.entries) {
+			if (dependOn && runtime) {
+				const err =
+					new WebpackError(`Entrypoint '${name}' has 'dependOn' and 'runtime' specified. This is not valid.
+Entrypoints that depend on other entrypoints do not have their own runtime.
+They will use the runtime(s) from referenced entrypoints instead.
+Remove the 'runtime' option from the entrypoint.`);
+				const entry = /** @type {Entrypoint} */ (this.entrypoints.get(name));
+				err.chunk = entry.getEntrypointChunk();
+				this.errors.push(err);
+			}
+			if (dependOn) {
+				const entry = /** @type {Entrypoint} */ (this.entrypoints.get(name));
+				const referencedChunks = entry
+					.getEntrypointChunk()
+					.getAllReferencedChunks();
+				const dependOnEntries = [];
+				for (const dep of dependOn) {
+					const dependency = this.entrypoints.get(dep);
+					if (!dependency) {
+						throw new Error(
+							`Entry ${name} depends on ${dep}, but this entry was not found`
+						);
+					}
+					if (referencedChunks.has(dependency.getEntrypointChunk())) {
+						const err = new WebpackError(
+							`Entrypoints '${name}' and '${dep}' use 'dependOn' to depend on each other in a circular way.`
+						);
+						const entryChunk = entry.getEntrypointChunk();
+						err.chunk = entryChunk;
+						this.errors.push(err);
+						entry.setRuntimeChunk(entryChunk);
+						continue outer;
+					}
+					dependOnEntries.push(dependency);
+				}
+				for (const dependency of dependOnEntries) {
+					connectChunkGroupParentAndChild(dependency, entry);
+				}
+			} else if (runtime) {
+				const entry = /** @type {Entrypoint} */ (this.entrypoints.get(name));
+				let chunk = this.namedChunks.get(runtime);
+				if (chunk) {
+					if (!runtimeChunks.has(chunk)) {
+						const err =
+							new WebpackError(`Entrypoint '${name}' has a 'runtime' option which points to another entrypoint named '${runtime}'.
+It's not valid to use other entrypoints as runtime chunk.
+Did you mean to use 'dependOn: ${JSON.stringify(
+								runtime
+							)}' instead to allow using entrypoint '${name}' within the runtime of entrypoint '${runtime}'? For this '${runtime}' must always be loaded when '${name}' is used.
+Or do you want to use the entrypoints '${name}' and '${runtime}' independently on the same page with a shared runtime? In this case give them both the same value for the 'runtime' option. It must be a name not already used by an entrypoint.`);
+						const entryChunk =
+							/** @type {Chunk} */
+							(entry.getEntrypointChunk());
+						err.chunk = entryChunk;
+						this.errors.push(err);
+						entry.setRuntimeChunk(entryChunk);
+						continue;
+					}
+				} else {
+					chunk = this.addChunk(runtime);
+					chunk.preventIntegration = true;
+					runtimeChunks.add(chunk);
+				}
+				entry.unshiftChunk(chunk);
+				chunk.addGroup(entry);
+				entry.setRuntimeChunk(chunk);
+			}
+		}
+		buildChunkGraph(this, chunkGraphInit);
+		this.hooks.afterChunks.call(this.chunks);
+		this.logger.timeEnd("create chunks");
 
-		if (
-			typeof dependency !== "object" ||
-			dependency === null ||
-			!dependency.constructor
-		) {
-			throw new Error("Parameter 'dependency' must be a Dependency");
+		this.logger.time("optimize");
+		this.hooks.optimize.call();
+
+		while (this.hooks.optimizeModules.call(this.modules)) {
+			/* empty */
 		}
-		const Dep = /** @type {DepConstructor} */ (dependency.constructor);
-		const moduleFactory = this.dependencyFactories.get(Dep);
-		if (!moduleFactory) {
-			throw new Error(
-				`No dependency factory available for this dependency type: ${
-					dependency.constructor.name
-				}`
-			);
+		this.hooks.afterOptimizeModules.call(this.modules);
+
+		while (this.hooks.optimizeChunks.call(this.chunks, this.chunkGroups)) {
+			/* empty */
 		}
+		this.hooks.afterOptimizeChunks.call(this.chunks, this.chunkGroups);
 
-		this.semaphore.acquire(() => {
-			moduleFactory.create(
-				{
-					contextInfo: {
-						issuer: "",
-						compiler: this.compiler.name
-					},
-					context: context,
-					dependencies: [dependency]
-				},
-				(err, module) => {
-					if (err) {
-						this.semaphore.release();
-						return errorAndCallback(new EntryModuleNotFoundError(err));
-					}
+		this.hooks.optimizeTree.callAsync(this.chunks, this.modules, err => {
+			if (err) {
+				return finalCallback(
+					makeWebpackError(err, "Compilation.hooks.optimizeTree")
+				);
+			}
 
-					let afterFactory;
+			this.hooks.afterOptimizeTree.call(this.chunks, this.modules);
 
-					if (currentProfile) {
-						afterFactory = Date.now();
-						currentProfile.factory = afterFactory - start;
+			this.hooks.optimizeChunkModules.callAsync(
+				this.chunks,
+				this.modules,
+				err => {
+					if (err) {
+						return finalCallback(
+							makeWebpackError(err, "Compilation.hooks.optimizeChunkModules")
+						);
 					}
 
-					const addModuleResult = this.addModule(module);
-					module = addModuleResult.module;
+					this.hooks.afterOptimizeChunkModules.call(this.chunks, this.modules);
 
-					onModule(module);
+					const shouldRecord = this.hooks.shouldRecord.call() !== false;
 
-					dependency.module = module;
-					module.addReason(null, dependency);
+					this.hooks.reviveModules.call(
+						this.modules,
+						/** @type {Records} */
+						(this.records)
+					);
+					this.hooks.beforeModuleIds.call(this.modules);
+					this.hooks.moduleIds.call(this.modules);
+					this.hooks.optimizeModuleIds.call(this.modules);
+					this.hooks.afterOptimizeModuleIds.call(this.modules);
+
+					this.hooks.reviveChunks.call(
+						this.chunks,
+						/** @type {Records} */
+						(this.records)
+					);
+					this.hooks.beforeChunkIds.call(this.chunks);
+					this.hooks.chunkIds.call(this.chunks);
+					this.hooks.optimizeChunkIds.call(this.chunks);
+					this.hooks.afterOptimizeChunkIds.call(this.chunks);
 
-					const afterBuild = () => {
-						if (currentProfile) {
-							const afterBuilding = Date.now();
-							currentProfile.building = afterBuilding - afterFactory;
-						}
+					this.assignRuntimeIds();
 
-						if (addModuleResult.dependencies) {
-							this.processModuleDependencies(module, err => {
-								if (err) return callback(err);
-								callback(null, module);
-							});
-						} else {
-							return callback(null, module);
-						}
-					};
+					this.logger.time("compute affected modules with chunk graph");
+					this._computeAffectedModulesWithChunkGraph();
+					this.logger.timeEnd("compute affected modules with chunk graph");
 
-					if (addModuleResult.issuer) {
-						if (currentProfile) {
-							module.profile = currentProfile;
-						}
+					this.sortItemsWithChunkIds();
+
+					if (shouldRecord) {
+						this.hooks.recordModules.call(
+							this.modules,
+							/** @type {Records} */
+							(this.records)
+						);
+						this.hooks.recordChunks.call(
+							this.chunks,
+							/** @type {Records} */
+							(this.records)
+						);
 					}
 
-					if (addModuleResult.build) {
-						this.buildModule(module, false, null, null, err => {
+					this.hooks.optimizeCodeGeneration.call(this.modules);
+					this.logger.timeEnd("optimize");
+
+					this.logger.time("module hashing");
+					this.hooks.beforeModuleHash.call();
+					this.createModuleHashes();
+					this.hooks.afterModuleHash.call();
+					this.logger.timeEnd("module hashing");
+
+					this.logger.time("code generation");
+					this.hooks.beforeCodeGeneration.call();
+					this.codeGeneration(err => {
+						if (err) {
+							return finalCallback(err);
+						}
+						this.hooks.afterCodeGeneration.call();
+						this.logger.timeEnd("code generation");
+
+						this.logger.time("runtime requirements");
+						this.hooks.beforeRuntimeRequirements.call();
+						this.processRuntimeRequirements();
+						this.hooks.afterRuntimeRequirements.call();
+						this.logger.timeEnd("runtime requirements");
+
+						this.logger.time("hashing");
+						this.hooks.beforeHash.call();
+						const codeGenerationJobs = this.createHash();
+						this.hooks.afterHash.call();
+						this.logger.timeEnd("hashing");
+
+						this._runCodeGenerationJobs(codeGenerationJobs, err => {
 							if (err) {
-								this.semaphore.release();
-								return errorAndCallback(err);
+								return finalCallback(err);
 							}
 
-							if (currentProfile) {
-								const afterBuilding = Date.now();
-								currentProfile.building = afterBuilding - afterFactory;
+							if (shouldRecord) {
+								this.logger.time("record hash");
+								this.hooks.recordHash.call(
+									/** @type {Records} */
+									(this.records)
+								);
+								this.logger.timeEnd("record hash");
 							}
 
-							this.semaphore.release();
-							afterBuild();
+							this.logger.time("module assets");
+							this.clearAssets();
+
+							this.hooks.beforeModuleAssets.call();
+							this.createModuleAssets();
+							this.logger.timeEnd("module assets");
+
+							const cont = () => {
+								this.logger.time("process assets");
+								this.hooks.processAssets.callAsync(this.assets, err => {
+									if (err) {
+										return finalCallback(
+											makeWebpackError(err, "Compilation.hooks.processAssets")
+										);
+									}
+									this.hooks.afterProcessAssets.call(this.assets);
+									this.logger.timeEnd("process assets");
+									this.assets =
+										/** @type {CompilationAssets} */
+										(
+											this._backCompat
+												? soonFrozenObjectDeprecation(
+														this.assets,
+														"Compilation.assets",
+														"DEP_WEBPACK_COMPILATION_ASSETS",
+														`BREAKING CHANGE: No more changes should happen to Compilation.assets after sealing the Compilation.
+	Do changes to assets earlier, e. g. in Compilation.hooks.processAssets.
+	Make sure to select an appropriate stage from Compilation.PROCESS_ASSETS_STAGE_*.`
+													)
+												: Object.freeze(this.assets)
+										);
+
+									this.summarizeDependencies();
+									if (shouldRecord) {
+										this.hooks.record.call(
+											this,
+											/** @type {Records} */
+											(this.records)
+										);
+									}
+
+									if (this.hooks.needAdditionalSeal.call()) {
+										this.unseal();
+										return this.seal(callback);
+									}
+									return this.hooks.afterSeal.callAsync(err => {
+										if (err) {
+											return finalCallback(
+												makeWebpackError(err, "Compilation.hooks.afterSeal")
+											);
+										}
+										this.fileSystemInfo.logStatistics();
+										finalCallback();
+									});
+								});
+							};
+
+							this.logger.time("create chunk assets");
+							if (this.hooks.shouldGenerateChunkAssets.call() !== false) {
+								this.hooks.beforeChunkAssets.call();
+								this.createChunkAssets(err => {
+									this.logger.timeEnd("create chunk assets");
+									if (err) {
+										return finalCallback(err);
+									}
+									cont();
+								});
+							} else {
+								this.logger.timeEnd("create chunk assets");
+								cont();
+							}
 						});
-					} else {
-						this.semaphore.release();
-						this.waitForBuildingFinished(module, afterBuild);
-					}
+					});
 				}
 			);
 		});
 	}
 
 	/**
-	 *
-	 * @param {string} context context path for entry
-	 * @param {Dependency} entry entry dependency being created
-	 * @param {string} name name of entry
-	 * @param {ModuleCallback} callback callback function
-	 * @returns {void} returns
+	 * @param {Module} module module to report from
+	 * @param {DependenciesBlock[]} blocks blocks to report from
+	 * @returns {boolean} true, when it has warnings or errors
 	 */
-	addEntry(context, entry, name, callback) {
-		this.hooks.addEntry.call(entry, name);
-
-		const slot = {
-			name: name,
-			// TODO webpack 5 remove `request`
-			request: null,
-			module: null
-		};
-
-		if (entry instanceof ModuleDependency) {
-			slot.request = entry.request;
-		}
+	reportDependencyErrorsAndWarnings(module, blocks) {
+		let hasProblems = false;
+		for (const block of blocks) {
+			const dependencies = block.dependencies;
 
-		// TODO webpack 5: merge modules instead when multiple entry modules are supported
-		const idx = this._preparedEntrypoints.findIndex(slot => slot.name === name);
-		if (idx >= 0) {
-			// Overwrite existing entrypoint
-			this._preparedEntrypoints[idx] = slot;
-		} else {
-			this._preparedEntrypoints.push(slot);
-		}
-		this._addModuleChain(
-			context,
-			entry,
-			module => {
-				this.entries.push(module);
-			},
-			(err, module) => {
-				if (err) {
-					this.hooks.failedEntry.call(entry, name, err);
-					return callback(err);
+			for (const d of dependencies) {
+				const warnings = d.getWarnings(this.moduleGraph);
+				if (warnings) {
+					for (const w of warnings) {
+						const warning = new ModuleDependencyWarning(module, w, d.loc);
+						this.warnings.push(warning);
+						hasProblems = true;
+					}
 				}
-
-				if (module) {
-					slot.module = module;
-				} else {
-					const idx = this._preparedEntrypoints.indexOf(slot);
-					if (idx >= 0) {
-						this._preparedEntrypoints.splice(idx, 1);
+				const errors = d.getErrors(this.moduleGraph);
+				if (errors) {
+					for (const e of errors) {
+						const error = new ModuleDependencyError(module, e, d.loc);
+						this.errors.push(error);
+						hasProblems = true;
 					}
 				}
-				this.hooks.succeedEntry.call(entry, name, module);
-				return callback(null, module);
 			}
-		);
+
+			if (this.reportDependencyErrorsAndWarnings(module, block.blocks))
+				hasProblems = true;
+		}
+		return hasProblems;
 	}
 
 	/**
-	 * @param {string} context context path string
-	 * @param {Dependency} dependency dep used to create module
-	 * @param {ModuleCallback} callback module callback sending module up a level
-	 * @returns {void}
+	 * @param {Callback} callback callback
 	 */
-	prefetch(context, dependency, callback) {
-		this._addModuleChain(
-			context,
-			dependency,
-			module => {
-				module.prefetched = true;
-			},
-			callback
+	codeGeneration(callback) {
+		const { chunkGraph } = this;
+		this.codeGenerationResults = new CodeGenerationResults(
+			this.outputOptions.hashFunction
 		);
+		/** @type {CodeGenerationJobs} */
+		const jobs = [];
+		for (const module of this.modules) {
+			const runtimes = chunkGraph.getModuleRuntimes(module);
+			if (runtimes.size === 1) {
+				for (const runtime of runtimes) {
+					const hash = chunkGraph.getModuleHash(module, runtime);
+					jobs.push({ module, hash, runtime, runtimes: [runtime] });
+				}
+			} else if (runtimes.size > 1) {
+				/** @type {Map} */
+				const map = new Map();
+				for (const runtime of runtimes) {
+					const hash = chunkGraph.getModuleHash(module, runtime);
+					const job = map.get(hash);
+					if (job === undefined) {
+						const newJob = { module, hash, runtime, runtimes: [runtime] };
+						jobs.push(newJob);
+						map.set(hash, newJob);
+					} else {
+						job.runtimes.push(runtime);
+					}
+				}
+			}
+		}
+
+		this._runCodeGenerationJobs(jobs, callback);
 	}
 
 	/**
-	 * @param {Module} module module to be rebuilt
-	 * @param {Callback} thisCallback callback when module finishes rebuilding
+	 * @private
+	 * @param {CodeGenerationJobs} jobs code generation jobs
+	 * @param {Callback} callback callback
 	 * @returns {void}
 	 */
-	rebuildModule(module, thisCallback) {
-		let callbackList = this._rebuildingModules.get(module);
-		if (callbackList) {
-			callbackList.push(thisCallback);
-			return;
+	_runCodeGenerationJobs(jobs, callback) {
+		if (jobs.length === 0) {
+			return callback();
 		}
-		this._rebuildingModules.set(module, (callbackList = [thisCallback]));
-
-		const callback = err => {
-			this._rebuildingModules.delete(module);
-			for (const cb of callbackList) {
-				cb(err);
-			}
+		let statModulesFromCache = 0;
+		let statModulesGenerated = 0;
+		const { chunkGraph, moduleGraph, dependencyTemplates, runtimeTemplate } =
+			this;
+		const results = this.codeGenerationResults;
+		/** @type {WebpackError[]} */
+		const errors = [];
+		/** @type {NotCodeGeneratedModules | undefined} */
+		let notCodeGeneratedModules;
+		const runIteration = () => {
+			/** @type {CodeGenerationJobs} */
+			let delayedJobs = [];
+			let delayedModules = new Set();
+			asyncLib.eachLimit(
+				jobs,
+				/** @type {number} */
+				(this.options.parallelism),
+				(job, callback) => {
+					const { module } = job;
+					const { codeGenerationDependencies } = module;
+					if (
+						codeGenerationDependencies !== undefined &&
+						(notCodeGeneratedModules === undefined ||
+							codeGenerationDependencies.some(dep => {
+								const referencedModule = /** @type {Module} */ (
+									moduleGraph.getModule(dep)
+								);
+								return /** @type {NotCodeGeneratedModules} */ (
+									notCodeGeneratedModules
+								).has(referencedModule);
+							}))
+					) {
+						delayedJobs.push(job);
+						delayedModules.add(module);
+						return callback();
+					}
+					const { hash, runtime, runtimes } = job;
+					this._codeGenerationModule(
+						module,
+						runtime,
+						runtimes,
+						hash,
+						dependencyTemplates,
+						chunkGraph,
+						moduleGraph,
+						runtimeTemplate,
+						errors,
+						results,
+						(err, codeGenerated) => {
+							if (codeGenerated) statModulesGenerated++;
+							else statModulesFromCache++;
+							callback(err);
+						}
+					);
+				},
+				err => {
+					if (err) return callback(err);
+					if (delayedJobs.length > 0) {
+						if (delayedJobs.length === jobs.length) {
+							return callback(
+								/** @type {WebpackError} */ (
+									new Error(
+										`Unable to make progress during code generation because of circular code generation dependency: ${Array.from(
+											delayedModules,
+											m => m.identifier()
+										).join(", ")}`
+									)
+								)
+							);
+						}
+						jobs = delayedJobs;
+						delayedJobs = [];
+						notCodeGeneratedModules = delayedModules;
+						delayedModules = new Set();
+						return runIteration();
+					}
+					if (errors.length > 0) {
+						errors.sort(
+							compareSelect(err => err.module, compareModulesByIdentifier)
+						);
+						for (const error of errors) {
+							this.errors.push(error);
+						}
+					}
+					this.logger.log(
+						`${Math.round(
+							(100 * statModulesGenerated) /
+								(statModulesGenerated + statModulesFromCache)
+						)}% code generated (${statModulesGenerated} generated, ${statModulesFromCache} from cache)`
+					);
+					callback();
+				}
+			);
 		};
+		runIteration();
+	}
 
-		this.hooks.rebuildModule.call(module);
-		const oldDependencies = module.dependencies.slice();
-		const oldVariables = module.variables.slice();
-		const oldBlocks = module.blocks.slice();
-		module.unbuild();
-		this.buildModule(module, false, module, null, err => {
-			if (err) {
-				this.hooks.finishRebuildingModule.call(module);
-				return callback(err);
+	/**
+	 * @param {Module} module module
+	 * @param {RuntimeSpec} runtime runtime
+	 * @param {RuntimeSpec[]} runtimes runtimes
+	 * @param {string} hash hash
+	 * @param {DependencyTemplates} dependencyTemplates dependencyTemplates
+	 * @param {ChunkGraph} chunkGraph chunkGraph
+	 * @param {ModuleGraph} moduleGraph moduleGraph
+	 * @param {RuntimeTemplate} runtimeTemplate runtimeTemplate
+	 * @param {WebpackError[]} errors errors
+	 * @param {CodeGenerationResults} results results
+	 * @param {(err?: WebpackError | null, result?: boolean) => void} callback callback
+	 */
+	_codeGenerationModule(
+		module,
+		runtime,
+		runtimes,
+		hash,
+		dependencyTemplates,
+		chunkGraph,
+		moduleGraph,
+		runtimeTemplate,
+		errors,
+		results,
+		callback
+	) {
+		let codeGenerated = false;
+		const cache = new MultiItemCache(
+			runtimes.map(runtime =>
+				this._codeGenerationCache.getItemCache(
+					`${module.identifier()}|${getRuntimeKey(runtime)}`,
+					`${hash}|${dependencyTemplates.getHash()}`
+				)
+			)
+		);
+		cache.get((err, cachedResult) => {
+			if (err) return callback(/** @type {WebpackError} */ (err));
+			let result;
+			if (!cachedResult) {
+				try {
+					codeGenerated = true;
+					this.codeGeneratedModules.add(module);
+					result = module.codeGeneration({
+						chunkGraph,
+						moduleGraph,
+						dependencyTemplates,
+						runtimeTemplate,
+						runtime,
+						codeGenerationResults: results,
+						compilation: this
+					});
+				} catch (err) {
+					errors.push(
+						new CodeGenerationError(module, /** @type {Error} */ (err))
+					);
+					result = cachedResult = {
+						sources: new Map(),
+						runtimeRequirements: null
+					};
+				}
+			} else {
+				result = cachedResult;
+			}
+			for (const runtime of runtimes) {
+				results.add(module, runtime, result);
+			}
+			if (!cachedResult) {
+				cache.store(result, err =>
+					callback(/** @type {WebpackError} */ (err), codeGenerated)
+				);
+			} else {
+				callback(null, codeGenerated);
 			}
-
-			this.processModuleDependencies(module, err => {
-				if (err) return callback(err);
-				this.removeReasonsOfDependencyBlock(module, {
-					dependencies: oldDependencies,
-					variables: oldVariables,
-					blocks: oldBlocks
-				});
-				this.hooks.finishRebuildingModule.call(module);
-				callback();
-			});
 		});
 	}
 
-	finish() {
-		const modules = this.modules;
-		this.hooks.finishModules.call(modules);
-
-		for (let index = 0; index < modules.length; index++) {
-			const module = modules[index];
-			this.reportDependencyErrorsAndWarnings(module, [module]);
+	_getChunkGraphEntries() {
+		/** @type {Set} */
+		const treeEntries = new Set();
+		for (const ep of this.entrypoints.values()) {
+			const chunk = ep.getRuntimeChunk();
+			if (chunk) treeEntries.add(chunk);
 		}
-	}
-
-	unseal() {
-		this.hooks.unseal.call();
-		this.chunks.length = 0;
-		this.chunkGroups.length = 0;
-		this.namedChunks.clear();
-		this.namedChunkGroups.clear();
-		this.additionalChunkAssets.length = 0;
-		this.assets = {};
-		for (const module of this.modules) {
-			module.unseal();
+		for (const ep of this.asyncEntrypoints) {
+			const chunk = ep.getRuntimeChunk();
+			if (chunk) treeEntries.add(chunk);
 		}
+		return treeEntries;
 	}
 
 	/**
-	 * @param {Callback} callback signals when the seal method is finishes
+	 * @param {object} options options
+	 * @param {ChunkGraph=} options.chunkGraph the chunk graph
+	 * @param {Iterable=} options.modules modules
+	 * @param {Iterable=} options.chunks chunks
+	 * @param {CodeGenerationResults=} options.codeGenerationResults codeGenerationResults
+	 * @param {Iterable=} options.chunkGraphEntries chunkGraphEntries
 	 * @returns {void}
 	 */
-	seal(callback) {
-		this.hooks.seal.call();
-
-		while (
-			this.hooks.optimizeDependenciesBasic.call(this.modules) ||
-			this.hooks.optimizeDependencies.call(this.modules) ||
-			this.hooks.optimizeDependenciesAdvanced.call(this.modules)
-		) {
-			/* empty */
-		}
-		this.hooks.afterOptimizeDependencies.call(this.modules);
-
-		this.hooks.beforeChunks.call();
-		for (const preparedEntrypoint of this._preparedEntrypoints) {
-			const module = preparedEntrypoint.module;
-			const name = preparedEntrypoint.name;
-			const chunk = this.addChunk(name);
-			const entrypoint = new Entrypoint(name);
-			entrypoint.setRuntimeChunk(chunk);
-			entrypoint.addOrigin(null, name, preparedEntrypoint.request);
-			this.namedChunkGroups.set(name, entrypoint);
-			this.entrypoints.set(name, entrypoint);
-			this.chunkGroups.push(entrypoint);
-
-			GraphHelpers.connectChunkGroupAndChunk(entrypoint, chunk);
-			GraphHelpers.connectChunkAndModule(chunk, module);
-
-			chunk.entryModule = module;
-			chunk.name = name;
-
-			this.assignDepth(module);
-		}
-		this.processDependenciesBlocksForChunkGroups(this.chunkGroups.slice());
-		this.sortModules(this.modules);
-		this.hooks.afterChunks.call(this.chunks);
-
-		this.hooks.optimize.call();
-
-		while (
-			this.hooks.optimizeModulesBasic.call(this.modules) ||
-			this.hooks.optimizeModules.call(this.modules) ||
-			this.hooks.optimizeModulesAdvanced.call(this.modules)
-		) {
-			/* empty */
-		}
-		this.hooks.afterOptimizeModules.call(this.modules);
-
-		while (
-			this.hooks.optimizeChunksBasic.call(this.chunks, this.chunkGroups) ||
-			this.hooks.optimizeChunks.call(this.chunks, this.chunkGroups) ||
-			this.hooks.optimizeChunksAdvanced.call(this.chunks, this.chunkGroups)
-		) {
-			/* empty */
-		}
-		this.hooks.afterOptimizeChunks.call(this.chunks, this.chunkGroups);
+	processRuntimeRequirements({
+		chunkGraph = this.chunkGraph,
+		modules = this.modules,
+		chunks = this.chunks,
+		codeGenerationResults = this.codeGenerationResults,
+		chunkGraphEntries = this._getChunkGraphEntries()
+	} = {}) {
+		const context = { chunkGraph, codeGenerationResults };
+		const { moduleMemCaches2 } = this;
+		this.logger.time("runtime requirements.modules");
+		const additionalModuleRuntimeRequirements =
+			this.hooks.additionalModuleRuntimeRequirements;
+		const runtimeRequirementInModule = this.hooks.runtimeRequirementInModule;
+		for (const module of modules) {
+			if (chunkGraph.getNumberOfModuleChunks(module) > 0) {
+				const memCache = moduleMemCaches2 && moduleMemCaches2.get(module);
+				for (const runtime of chunkGraph.getModuleRuntimes(module)) {
+					if (memCache) {
+						const cached = memCache.get(
+							`moduleRuntimeRequirements-${getRuntimeKey(runtime)}`
+						);
+						if (cached !== undefined) {
+							if (cached !== null) {
+								chunkGraph.addModuleRuntimeRequirements(
+									module,
+									runtime,
+									/** @type {RuntimeRequirements} */
+									(cached),
+									false
+								);
+							}
+							continue;
+						}
+					}
+					let set;
+					const runtimeRequirements =
+						codeGenerationResults.getRuntimeRequirements(module, runtime);
+					if (runtimeRequirements && runtimeRequirements.size > 0) {
+						set = new Set(runtimeRequirements);
+					} else if (additionalModuleRuntimeRequirements.isUsed()) {
+						set = new Set();
+					} else {
+						if (memCache) {
+							memCache.set(
+								`moduleRuntimeRequirements-${getRuntimeKey(runtime)}`,
+								null
+							);
+						}
+						continue;
+					}
+					additionalModuleRuntimeRequirements.call(module, set, context);
 
-		this.hooks.optimizeTree.callAsync(this.chunks, this.modules, err => {
-			if (err) {
-				return callback(err);
+					for (const r of set) {
+						const hook = runtimeRequirementInModule.get(r);
+						if (hook !== undefined) hook.call(module, set, context);
+					}
+					if (set.size === 0) {
+						if (memCache) {
+							memCache.set(
+								`moduleRuntimeRequirements-${getRuntimeKey(runtime)}`,
+								null
+							);
+						}
+					} else if (memCache) {
+						memCache.set(
+							`moduleRuntimeRequirements-${getRuntimeKey(runtime)}`,
+							set
+						);
+						chunkGraph.addModuleRuntimeRequirements(
+							module,
+							runtime,
+							set,
+							false
+						);
+					} else {
+						chunkGraph.addModuleRuntimeRequirements(module, runtime, set);
+					}
+				}
 			}
-
-			this.hooks.afterOptimizeTree.call(this.chunks, this.modules);
-
-			while (
-				this.hooks.optimizeChunkModulesBasic.call(this.chunks, this.modules) ||
-				this.hooks.optimizeChunkModules.call(this.chunks, this.modules) ||
-				this.hooks.optimizeChunkModulesAdvanced.call(this.chunks, this.modules)
-			) {
-				/* empty */
+		}
+		this.logger.timeEnd("runtime requirements.modules");
+
+		this.logger.time("runtime requirements.chunks");
+		for (const chunk of chunks) {
+			const set = new Set();
+			for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
+				const runtimeRequirements = chunkGraph.getModuleRuntimeRequirements(
+					module,
+					chunk.runtime
+				);
+				for (const r of runtimeRequirements) set.add(r);
 			}
-			this.hooks.afterOptimizeChunkModules.call(this.chunks, this.modules);
-
-			const shouldRecord = this.hooks.shouldRecord.call() !== false;
-
-			this.hooks.reviveModules.call(this.modules, this.records);
-			this.hooks.optimizeModuleOrder.call(this.modules);
-			this.hooks.advancedOptimizeModuleOrder.call(this.modules);
-			this.hooks.beforeModuleIds.call(this.modules);
-			this.hooks.moduleIds.call(this.modules);
-			this.applyModuleIds();
-			this.hooks.optimizeModuleIds.call(this.modules);
-			this.hooks.afterOptimizeModuleIds.call(this.modules);
+			this.hooks.additionalChunkRuntimeRequirements.call(chunk, set, context);
 
-			this.sortItemsWithModuleIds();
-
-			this.hooks.reviveChunks.call(this.chunks, this.records);
-			this.hooks.optimizeChunkOrder.call(this.chunks);
-			this.hooks.beforeChunkIds.call(this.chunks);
-			this.applyChunkIds();
-			this.hooks.optimizeChunkIds.call(this.chunks);
-			this.hooks.afterOptimizeChunkIds.call(this.chunks);
-
-			this.sortItemsWithChunkIds();
-
-			if (shouldRecord) {
-				this.hooks.recordModules.call(this.modules, this.records);
-				this.hooks.recordChunks.call(this.chunks, this.records);
+			for (const r of set) {
+				this.hooks.runtimeRequirementInChunk.for(r).call(chunk, set, context);
 			}
 
-			this.hooks.beforeHash.call();
-			this.createHash();
-			this.hooks.afterHash.call();
-
-			if (shouldRecord) {
-				this.hooks.recordHash.call(this.records);
+			chunkGraph.addChunkRuntimeRequirements(chunk, set);
+		}
+		this.logger.timeEnd("runtime requirements.chunks");
+
+		this.logger.time("runtime requirements.entries");
+		for (const treeEntry of chunkGraphEntries) {
+			const set = new Set();
+			for (const chunk of treeEntry.getAllReferencedChunks()) {
+				const runtimeRequirements =
+					chunkGraph.getChunkRuntimeRequirements(chunk);
+				for (const r of runtimeRequirements) set.add(r);
 			}
 
-			this.hooks.beforeModuleAssets.call();
-			this.createModuleAssets();
-			if (this.hooks.shouldGenerateChunkAssets.call() !== false) {
-				this.hooks.beforeChunkAssets.call();
-				this.createChunkAssets();
-			}
-			this.hooks.additionalChunkAssets.call(this.chunks);
-			this.summarizeDependencies();
-			if (shouldRecord) {
-				this.hooks.record.call(this, this.records);
-			}
+			this.hooks.additionalTreeRuntimeRequirements.call(
+				treeEntry,
+				set,
+				context
+			);
 
-			this.hooks.additionalAssets.callAsync(err => {
-				if (err) {
-					return callback(err);
-				}
-				this.hooks.optimizeChunkAssets.callAsync(this.chunks, err => {
-					if (err) {
-						return callback(err);
-					}
-					this.hooks.afterOptimizeChunkAssets.call(this.chunks);
-					this.hooks.optimizeAssets.callAsync(this.assets, err => {
-						if (err) {
-							return callback(err);
-						}
-						this.hooks.afterOptimizeAssets.call(this.assets);
-						if (this.hooks.needAdditionalSeal.call()) {
-							this.unseal();
-							return this.seal(callback);
-						}
-						return this.hooks.afterSeal.callAsync(callback);
-					});
-				});
-			});
-		});
-	}
+			for (const r of set) {
+				this.hooks.runtimeRequirementInTree
+					.for(r)
+					.call(treeEntry, set, context);
+			}
 
-	/**
-	 * @param {Module[]} modules the modules array on compilation to perform the sort for
-	 * @returns {void}
-	 */
-	sortModules(modules) {
-		// TODO webpack 5: this should only be enabled when `moduleIds: "natural"`
-		// TODO move it into a plugin (NaturalModuleIdsPlugin) and use this in WebpackOptionsApply
-		// TODO remove this method
-		modules.sort(byIndexOrIdentifier);
+			chunkGraph.addTreeRuntimeRequirements(treeEntry, set);
+		}
+		this.logger.timeEnd("runtime requirements.entries");
 	}
 
+	// TODO webpack 6 make chunkGraph argument non-optional
 	/**
-	 * @param {Module} module moulde to report from
-	 * @param {DependenciesBlock[]} blocks blocks to report from
+	 * @param {Chunk} chunk target chunk
+	 * @param {RuntimeModule} module runtime module
+	 * @param {ChunkGraph} chunkGraph the chunk graph
 	 * @returns {void}
 	 */
-	reportDependencyErrorsAndWarnings(module, blocks) {
-		for (let indexBlock = 0; indexBlock < blocks.length; indexBlock++) {
-			const block = blocks[indexBlock];
-			const dependencies = block.dependencies;
-
-			for (let indexDep = 0; indexDep < dependencies.length; indexDep++) {
-				const d = dependencies[indexDep];
-
-				const warnings = d.getWarnings();
-				if (warnings) {
-					for (let indexWar = 0; indexWar < warnings.length; indexWar++) {
-						const w = warnings[indexWar];
+	addRuntimeModule(chunk, module, chunkGraph = this.chunkGraph) {
+		// Deprecated ModuleGraph association
+		if (this._backCompat)
+			ModuleGraph.setModuleGraphForModule(module, this.moduleGraph);
+
+		// add it to the list
+		this.modules.add(module);
+		this._modules.set(module.identifier(), module);
+
+		// connect to the chunk graph
+		chunkGraph.connectChunkAndModule(chunk, module);
+		chunkGraph.connectChunkAndRuntimeModule(chunk, module);
+		if (module.fullHash) {
+			chunkGraph.addFullHashModuleToChunk(chunk, module);
+		} else if (module.dependentHash) {
+			chunkGraph.addDependentHashModuleToChunk(chunk, module);
+		}
 
-						const warning = new ModuleDependencyWarning(module, w, d.loc);
-						this.warnings.push(warning);
-					}
-				}
-				const errors = d.getErrors();
-				if (errors) {
-					for (let indexErr = 0; indexErr < errors.length; indexErr++) {
-						const e = errors[indexErr];
+		// attach runtime module
+		module.attach(this, chunk, chunkGraph);
 
-						const error = new ModuleDependencyError(module, e, d.loc);
-						this.errors.push(error);
-					}
-				}
+		// Setup internals
+		const exportsInfo = this.moduleGraph.getExportsInfo(module);
+		exportsInfo.setHasProvideInfo();
+		if (typeof chunk.runtime === "string") {
+			exportsInfo.setUsedForSideEffectsOnly(chunk.runtime);
+		} else if (chunk.runtime === undefined) {
+			exportsInfo.setUsedForSideEffectsOnly(undefined);
+		} else {
+			for (const runtime of chunk.runtime) {
+				exportsInfo.setUsedForSideEffectsOnly(runtime);
 			}
-
-			this.reportDependencyErrorsAndWarnings(module, block.blocks);
 		}
+		chunkGraph.addModuleRuntimeRequirements(
+			module,
+			chunk.runtime,
+			new Set([RuntimeGlobals.requireScope])
+		);
+
+		// runtime modules don't need ids
+		chunkGraph.setModuleId(module, "");
+
+		// Call hook
+		this.hooks.runtimeModule.call(module, chunk);
 	}
 
 	/**
-	 * @param {TODO} groupOptions options for the chunk group
-	 * @param {Module} module the module the references the chunk group
-	 * @param {DependencyLocation} loc the location from with the chunk group is referenced (inside of module)
-	 * @param {string} request the request from which the the chunk group is referenced
+	 * If `module` is passed, `loc` and `request` must also be passed.
+	 * @param {string | ChunkGroupOptions} groupOptions options for the chunk group
+	 * @param {Module=} module the module the references the chunk group
+	 * @param {DependencyLocation=} loc the location from with the chunk group is referenced (inside of module)
+	 * @param {string=} request the request from which the the chunk group is referenced
 	 * @returns {ChunkGroup} the new or existing chunk group
 	 */
 	addChunkInGroup(groupOptions, module, loc, request) {
@@ -1392,18 +3901,30 @@ class Compilation extends Tapable {
 		if (name) {
 			const chunkGroup = this.namedChunkGroups.get(name);
 			if (chunkGroup !== undefined) {
-				chunkGroup.addOptions(groupOptions);
 				if (module) {
-					chunkGroup.addOrigin(module, loc, request);
+					chunkGroup.addOrigin(
+						module,
+						/** @type {DependencyLocation} */
+						(loc),
+						/** @type {string} */
+						(request)
+					);
 				}
 				return chunkGroup;
 			}
 		}
 		const chunkGroup = new ChunkGroup(groupOptions);
-		if (module) chunkGroup.addOrigin(module, loc, request);
+		if (module)
+			chunkGroup.addOrigin(
+				module,
+				/** @type {DependencyLocation} */
+				(loc),
+				/** @type {string} */
+				(request)
+			);
 		const chunk = this.addChunk(name);
 
-		GraphHelpers.connectChunkGroupAndChunk(chunkGroup, chunk);
+		connectChunkGroupAndChunk(chunkGroup, chunk);
 
 		this.chunkGroups.push(chunkGroup);
 		if (name) {
@@ -1412,11 +3933,53 @@ class Compilation extends Tapable {
 		return chunkGroup;
 	}
 
+	/**
+	 * @param {EntryOptions} options options for the entrypoint
+	 * @param {Module} module the module the references the chunk group
+	 * @param {DependencyLocation} loc the location from with the chunk group is referenced (inside of module)
+	 * @param {string} request the request from which the the chunk group is referenced
+	 * @returns {Entrypoint} the new or existing entrypoint
+	 */
+	addAsyncEntrypoint(options, module, loc, request) {
+		const name = options.name;
+		if (name) {
+			const entrypoint = this.namedChunkGroups.get(name);
+			if (entrypoint instanceof Entrypoint) {
+				if (entrypoint !== undefined) {
+					if (module) {
+						entrypoint.addOrigin(module, loc, request);
+					}
+					return entrypoint;
+				}
+			} else if (entrypoint) {
+				throw new Error(
+					`Cannot add an async entrypoint with the name '${name}', because there is already an chunk group with this name`
+				);
+			}
+		}
+		const chunk = this.addChunk(name);
+		if (options.filename) {
+			chunk.filenameTemplate = options.filename;
+		}
+		const entrypoint = new Entrypoint(options, false);
+		entrypoint.setRuntimeChunk(chunk);
+		entrypoint.setEntrypointChunk(chunk);
+		if (name) {
+			this.namedChunkGroups.set(name, entrypoint);
+		}
+		this.chunkGroups.push(entrypoint);
+		this.asyncEntrypoints.push(entrypoint);
+		connectChunkGroupAndChunk(entrypoint, chunk);
+		if (module) {
+			entrypoint.addOrigin(module, loc, request);
+		}
+		return entrypoint;
+	}
+
 	/**
 	 * This method first looks to see if a name is provided for a new chunk,
 	 * and first looks to see if any named chunks already exist and reuse that chunk instead.
-	 *
-	 * @param {string=} name optional chunk name to be provided
+	 * @param {ChunkName=} name optional chunk name to be provided
 	 * @returns {Chunk} create a chunk (invoked during seal event)
 	 */
 	addChunk(name) {
@@ -1426,8 +3989,10 @@ class Compilation extends Tapable {
 				return chunk;
 			}
 		}
-		const chunk = new Chunk(name);
-		this.chunks.push(chunk);
+		const chunk = new Chunk(name, this._backCompat);
+		this.chunks.add(chunk);
+		if (this._backCompat)
+			ChunkGraph.setChunkGraphForChunk(chunk, this.chunkGraph);
 		if (name) {
 			this.namedChunks.set(name, chunk);
 		}
@@ -1435,560 +4000,119 @@ class Compilation extends Tapable {
 	}
 
 	/**
+	 * @deprecated
 	 * @param {Module} module module to assign depth
 	 * @returns {void}
 	 */
 	assignDepth(module) {
-		const queue = new Set([module]);
-		let depth;
-
-		module.depth = 0;
-
-		/**
-		 * @param {Module} module module for processeing
-		 * @returns {void}
-		 */
-		const enqueueJob = module => {
-			const d = module.depth;
-			if (typeof d === "number" && d <= depth) return;
-			queue.add(module);
-			module.depth = depth;
-		};
-
-		/**
-		 * @param {Dependency} dependency dependency to assign depth to
-		 * @returns {void}
-		 */
-		const assignDepthToDependency = dependency => {
-			if (dependency.module) {
-				enqueueJob(dependency.module);
-			}
-		};
-
-		/**
-		 * @param {DependenciesBlock} block block to assign depth to
-		 * @returns {void}
-		 */
-		const assignDepthToDependencyBlock = block => {
-			if (block.variables) {
-				iterationBlockVariable(block.variables, assignDepthToDependency);
-			}
-
-			if (block.dependencies) {
-				iterationOfArrayCallback(block.dependencies, assignDepthToDependency);
-			}
-
-			if (block.blocks) {
-				iterationOfArrayCallback(block.blocks, assignDepthToDependencyBlock);
-			}
-		};
-
-		for (module of queue) {
-			queue.delete(module);
-			depth = module.depth;
-
-			depth++;
-			assignDepthToDependencyBlock(module);
-		}
-	}
-
-	/**
-	 * @param {Module} module the module containing the dependency
-	 * @param {Dependency} dependency the dependency
-	 * @returns {DependencyReference} a reference for the dependency
-	 */
-	getDependencyReference(module, dependency) {
-		// TODO remove dep.getReference existence check in webpack 5
-		if (typeof dependency.getReference !== "function") return null;
-		const ref = dependency.getReference();
-		if (!ref) return null;
-		return this.hooks.dependencyReference.call(ref, dependency, module);
-	}
-
-	/**
-	 * This method creates the Chunk graph from the Module graph
-	 * @private
-	 * @param {TODO[]} inputChunkGroups chunk groups which are processed
-	 * @returns {void}
-	 */
-	processDependenciesBlocksForChunkGroups(inputChunkGroups) {
-		// Process is splitting into two parts:
-		// Part one traverse the module graph and builds a very basic chunks graph
-		//   in chunkDependencies.
-		// Part two traverse every possible way through the basic chunk graph and
-		//   tracks the available modules. While traversing it connects chunks with
-		//   eachother and Blocks with Chunks. It stops traversing when all modules
-		//   for a chunk are already available. So it doesn't connect unneeded chunks.
-
-		/** @type {Map} */
-		const chunkDependencies = new Map();
-		const allCreatedChunkGroups = new Set();
-
-		// PREPARE
-		/** @type {Map} */
-		const blockInfoMap = new Map();
-
-		/**
-		 * @param {Dependency} d dependency to iterate over
-		 * @returns {void}
-		 */
-		const iteratorDependency = d => {
-			// We skip Dependencies without Reference
-			const ref = this.getDependencyReference(currentModule, d);
-			if (!ref) {
-				return;
-			}
-			// We skip Dependencies without Module pointer
-			const refModule = ref.module;
-			if (!refModule) {
-				return;
-			}
-			// We skip weak Dependencies
-			if (ref.weak) {
-				return;
-			}
-
-			blockInfoModules.add(refModule);
-		};
-
-		/**
-		 * @param {AsyncDependenciesBlock} b blocks to prepare
-		 * @returns {void}
-		 */
-		const iteratorBlockPrepare = b => {
-			blockInfoBlocks.push(b);
-			blockQueue.push(b);
-		};
-
-		/** @type {Module} */
-		let currentModule;
-		/** @type {DependenciesBlock} */
-		let block;
-		/** @type {DependenciesBlock[]} */
-		let blockQueue;
-		/** @type {Set} */
-		let blockInfoModules;
-		/** @type {AsyncDependenciesBlock[]} */
-		let blockInfoBlocks;
-
-		for (const module of this.modules) {
-			blockQueue = [module];
-			currentModule = module;
-			while (blockQueue.length > 0) {
-				block = blockQueue.pop();
-				blockInfoModules = new Set();
-				blockInfoBlocks = [];
-
-				if (block.variables) {
-					iterationBlockVariable(block.variables, iteratorDependency);
-				}
-
-				if (block.dependencies) {
-					iterationOfArrayCallback(block.dependencies, iteratorDependency);
-				}
-
-				if (block.blocks) {
-					iterationOfArrayCallback(block.blocks, iteratorBlockPrepare);
-				}
-
-				const blockInfo = {
-					modules: Array.from(blockInfoModules),
-					blocks: blockInfoBlocks
-				};
-				blockInfoMap.set(block, blockInfo);
-			}
-		}
-
-		// PART ONE
-
-		/** @type {Map} */
-		const chunkGroupCounters = new Map();
-		for (const chunkGroup of inputChunkGroups) {
-			chunkGroupCounters.set(chunkGroup, { index: 0, index2: 0 });
-		}
-
-		let nextFreeModuleIndex = 0;
-		let nextFreeModuleIndex2 = 0;
-
-		/** @type {Map} */
-		const blockChunkGroups = new Map();
-
-		/** @type {Set} */
-		const blocksWithNestedBlocks = new Set();
-
-		const ADD_AND_ENTER_MODULE = 0;
-		const ENTER_MODULE = 1;
-		const PROCESS_BLOCK = 2;
-		const LEAVE_MODULE = 3;
-
-		/**
-		 * @typedef {Object} QueueItem
-		 * @property {number} action
-		 * @property {DependenciesBlock} block
-		 * @property {Module} module
-		 * @property {Chunk} chunk
-		 * @property {ChunkGroup} chunkGroup
-		 */
-
-		/**
-		 * @param {ChunkGroup} chunkGroup chunk group
-		 * @returns {QueueItem} queue item
-		 */
-		const chunkGroupToQueueItem = chunkGroup => ({
-			action: ENTER_MODULE,
-			block: chunkGroup.chunks[0].entryModule,
-			module: chunkGroup.chunks[0].entryModule,
-			chunk: chunkGroup.chunks[0],
-			chunkGroup
-		});
-
-		// Start with the provided modules/chunks
-		/** @type {QueueItem[]} */
-		let queue = inputChunkGroups.map(chunkGroupToQueueItem).reverse();
-		/** @type {QueueItem[]} */
-		let queueDelayed = [];
-
-		/** @type {Module} */
-		let module;
-		/** @type {Chunk} */
-		let chunk;
-		/** @type {ChunkGroup} */
-		let chunkGroup;
-
-		// For each async Block in graph
-		/**
-		 * @param {AsyncDependenciesBlock} b iterating over each Async DepBlock
-		 * @returns {void}
-		 */
-		const iteratorBlock = b => {
-			// 1. We create a chunk for this Block
-			// but only once (blockChunkGroups map)
-			let c = blockChunkGroups.get(b);
-			if (c === undefined) {
-				c = this.namedChunkGroups.get(b.chunkName);
-				if (c && c.isInitial()) {
-					this.errors.push(
-						new AsyncDependencyToInitialChunkError(b.chunkName, module, b.loc)
-					);
-					c = chunkGroup;
-				} else {
-					c = this.addChunkInGroup(
-						b.groupOptions || b.chunkName,
-						module,
-						b.loc,
-						b.request
-					);
-					chunkGroupCounters.set(c, { index: 0, index2: 0 });
-					blockChunkGroups.set(b, c);
-					allCreatedChunkGroups.add(c);
-				}
-			} else {
-				// TODO webpack 5 remove addOptions check
-				if (c.addOptions) c.addOptions(b.groupOptions);
-				c.addOrigin(module, b.loc, b.request);
-			}
-
-			// 2. We store the Block+Chunk mapping as dependency for the chunk
-			let deps = chunkDependencies.get(chunkGroup);
-			if (!deps) chunkDependencies.set(chunkGroup, (deps = []));
-			deps.push({
-				block: b,
-				chunkGroup: c,
-				couldBeFiltered: true
-			});
-
-			// 3. We enqueue the DependenciesBlock for traversal
-			queueDelayed.push({
-				action: PROCESS_BLOCK,
-				block: b,
-				module: module,
-				chunk: c.chunks[0],
-				chunkGroup: c
-			});
-		};
-
-		// Iterative traversal of the Module graph
-		// Recursive would be simpler to write but could result in Stack Overflows
-		while (queue.length) {
-			while (queue.length) {
-				const queueItem = queue.pop();
-				module = queueItem.module;
-				block = queueItem.block;
-				chunk = queueItem.chunk;
-				chunkGroup = queueItem.chunkGroup;
-
-				switch (queueItem.action) {
-					case ADD_AND_ENTER_MODULE: {
-						// We connect Module and Chunk when not already done
-						if (chunk.addModule(module)) {
-							module.addChunk(chunk);
-						} else {
-							// already connected, skip it
-							break;
-						}
-					}
-					// fallthrough
-					case ENTER_MODULE: {
-						if (chunkGroup !== undefined) {
-							const index = chunkGroup.getModuleIndex(module);
-							if (index === undefined) {
-								chunkGroup.setModuleIndex(
-									module,
-									chunkGroupCounters.get(chunkGroup).index++
-								);
-							}
-						}
-
-						if (module.index === null) {
-							module.index = nextFreeModuleIndex++;
-						}
-
-						queue.push({
-							action: LEAVE_MODULE,
-							block,
-							module,
-							chunk,
-							chunkGroup
-						});
-					}
-					// fallthrough
-					case PROCESS_BLOCK: {
-						// get prepared block info
-						const blockInfo = blockInfoMap.get(block);
-
-						// Traverse all referenced modules
-						for (let i = blockInfo.modules.length - 1; i >= 0; i--) {
-							const refModule = blockInfo.modules[i];
-							if (chunk.containsModule(refModule)) {
-								// skip early if already connected
-								continue;
-							}
-							// enqueue the add and enter to enter in the correct order
-							// this is relevant with circular dependencies
-							queue.push({
-								action: ADD_AND_ENTER_MODULE,
-								block: refModule,
-								module: refModule,
-								chunk,
-								chunkGroup
-							});
-						}
+		const moduleGraph = this.moduleGraph;
 
-						// Traverse all Blocks
-						iterationOfArrayCallback(blockInfo.blocks, iteratorBlock);
-
-						if (blockInfo.blocks.length > 0 && module !== block) {
-							blocksWithNestedBlocks.add(block);
-						}
-						break;
-					}
-					case LEAVE_MODULE: {
-						if (chunkGroup !== undefined) {
-							const index = chunkGroup.getModuleIndex2(module);
-							if (index === undefined) {
-								chunkGroup.setModuleIndex2(
-									module,
-									chunkGroupCounters.get(chunkGroup).index2++
-								);
-							}
-						}
-
-						if (module.index2 === null) {
-							module.index2 = nextFreeModuleIndex2++;
-						}
-						break;
-					}
-				}
-			}
-			const tempQueue = queue;
-			queue = queueDelayed.reverse();
-			queueDelayed = tempQueue;
-		}
-
-		// PART TWO
-		/** @type {Set} */
-		let newAvailableModules;
-
-		/**
-		 * @typedef {Object} ChunkGroupInfo
-		 * @property {Set} minAvailableModules current minimal set of modules available at this point
-		 * @property {Set[]} availableModulesToBeMerged enqueued updates to the minimal set of available modules
-		 */
-
-		/** @type {Map} */
-		const chunkGroupInfoMap = new Map();
-
-		/** @type {Queue} */
-		const queue2 = new Queue(inputChunkGroups);
-
-		for (const chunkGroup of inputChunkGroups) {
-			chunkGroupInfoMap.set(chunkGroup, {
-				minAvailableModules: undefined,
-				availableModulesToBeMerged: [new Set()]
-			});
-		}
-
-		/**
-		 * Helper function to check if all modules of a chunk are available
-		 *
-		 * @param {ChunkGroup} chunkGroup the chunkGroup to scan
-		 * @param {Set} availableModules the comparitor set
-		 * @returns {boolean} return true if all modules of a chunk are available
-		 */
-		const areModulesAvailable = (chunkGroup, availableModules) => {
-			for (const chunk of chunkGroup.chunks) {
-				for (const module of chunk.modulesIterable) {
-					if (!availableModules.has(module)) return false;
-				}
-			}
-			return true;
-		};
+		const queue = new Set([module]);
+		/** @type {number} */
+		let depth;
+
+		moduleGraph.setDepth(module, 0);
 
-		// For each edge in the basic chunk graph
 		/**
-		 * @param {TODO} dep the dependency used for filtering
-		 * @returns {boolean} used to filter "edges" (aka Dependencies) that were pointing
-		 * to modules that are already available. Also filters circular dependencies in the chunks graph
+		 * @param {Module} module module for processing
+		 * @returns {void}
 		 */
-		const filterFn = dep => {
-			const depChunkGroup = dep.chunkGroup;
-			if (!dep.couldBeFiltered) return true;
-			if (blocksWithNestedBlocks.has(dep.block)) return true;
-			if (areModulesAvailable(depChunkGroup, newAvailableModules)) {
-				return false; // break all modules are already available
-			}
-			dep.couldBeFiltered = false;
-			return true;
+		const processModule = module => {
+			if (!moduleGraph.setDepthIfLower(module, depth)) return;
+			queue.add(module);
 		};
 
-		// Iterative traversing of the basic chunk graph
-		while (queue2.length) {
-			chunkGroup = queue2.dequeue();
-			const info = chunkGroupInfoMap.get(chunkGroup);
-			const availableModulesToBeMerged = info.availableModulesToBeMerged;
-			let minAvailableModules = info.minAvailableModules;
-
-			// 1. Get minimal available modules
-			// It doesn't make sense to traverse a chunk again with more available modules.
-			// This step calculates the minimal available modules and skips traversal when
-			// the list didn't shrink.
-			availableModulesToBeMerged.sort(bySetSize);
-			let changed = false;
-			for (const availableModules of availableModulesToBeMerged) {
-				if (minAvailableModules === undefined) {
-					minAvailableModules = new Set(availableModules);
-					info.minAvailableModules = minAvailableModules;
-					changed = true;
-				} else {
-					for (const m of minAvailableModules) {
-						if (!availableModules.has(m)) {
-							minAvailableModules.delete(m);
-							changed = true;
-						}
-					}
-				}
-			}
-			availableModulesToBeMerged.length = 0;
-			if (!changed) continue;
-
-			// 2. Get the edges at this point of the graph
-			const deps = chunkDependencies.get(chunkGroup);
-			if (!deps) continue;
-			if (deps.length === 0) continue;
+		for (module of queue) {
+			queue.delete(module);
+			depth = /** @type {number} */ (moduleGraph.getDepth(module)) + 1;
 
-			// 3. Create a new Set of available modules at this points
-			newAvailableModules = new Set(minAvailableModules);
-			for (const chunk of chunkGroup.chunks) {
-				for (const m of chunk.modulesIterable) {
-					newAvailableModules.add(m);
+			for (const connection of moduleGraph.getOutgoingConnections(module)) {
+				const refModule = connection.module;
+				if (refModule) {
+					processModule(refModule);
 				}
 			}
+		}
+	}
 
-			// 4. Foreach remaining edge
-			const nextChunkGroups = new Set();
-			for (let i = 0; i < deps.length; i++) {
-				const dep = deps[i];
+	/**
+	 * @param {Set} modules module to assign depth
+	 * @returns {void}
+	 */
+	assignDepths(modules) {
+		const moduleGraph = this.moduleGraph;
 
-				// Filter inline, rather than creating a new array from `.filter()`
-				if (!filterFn(dep)) {
-					continue;
+		/** @type {Set} */
+		const queue = new Set(modules);
+		// Track these in local variables so that queue only has one data type
+		let nextDepthAt = queue.size;
+		let depth = 0;
+
+		let i = 0;
+		for (const module of queue) {
+			moduleGraph.setDepth(module, depth);
+			// Some of these results come from cache, which speeds this up
+			const connections = moduleGraph.getOutgoingConnectionsByModule(module);
+			// connections will be undefined if there are no outgoing connections
+			if (connections) {
+				for (const refModule of connections.keys()) {
+					if (refModule) queue.add(refModule);
 				}
-				const depChunkGroup = dep.chunkGroup;
-				const depBlock = dep.block;
-
-				// 5. Connect block with chunk
-				GraphHelpers.connectDependenciesBlockAndChunkGroup(
-					depBlock,
-					depChunkGroup
-				);
-
-				// 6. Connect chunk with parent
-				GraphHelpers.connectChunkGroupParentAndChild(chunkGroup, depChunkGroup);
-
-				nextChunkGroups.add(depChunkGroup);
 			}
-
-			// 7. Enqueue further traversal
-			for (const nextChunkGroup of nextChunkGroups) {
-				let nextInfo = chunkGroupInfoMap.get(nextChunkGroup);
-				if (nextInfo === undefined) {
-					nextInfo = {
-						minAvailableModules: undefined,
-						availableModulesToBeMerged: []
-					};
-					chunkGroupInfoMap.set(nextChunkGroup, nextInfo);
-				}
-				nextInfo.availableModulesToBeMerged.push(newAvailableModules);
-
-				// As queue deduplicates enqueued items this makes sure that a ChunkGroup
-				// is not enqueued twice
-				queue2.enqueue(nextChunkGroup);
+			i++;
+			// Since this is a breadth-first search, all modules added to the queue
+			// while at depth N will be depth N+1
+			if (i >= nextDepthAt) {
+				depth++;
+				nextDepthAt = queue.size;
 			}
 		}
+	}
 
-		// Remove all unconnected chunk groups
-		for (const chunkGroup of allCreatedChunkGroups) {
-			if (chunkGroup.getNumberOfParents() === 0) {
-				for (const chunk of chunkGroup.chunks) {
-					const idx = this.chunks.indexOf(chunk);
-					if (idx >= 0) this.chunks.splice(idx, 1);
-					chunk.remove("unconnected");
-				}
-				chunkGroup.remove("unconnected");
-			}
-		}
+	/**
+	 * @param {Dependency} dependency the dependency
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {(string[] | ReferencedExport)[]} referenced exports
+	 */
+	getDependencyReferencedExports(dependency, runtime) {
+		const referencedExports = dependency.getReferencedExports(
+			this.moduleGraph,
+			runtime
+		);
+		return this.hooks.dependencyReferencedExports.call(
+			referencedExports,
+			dependency,
+			runtime
+		);
 	}
 
 	/**
-	 *
 	 * @param {Module} module module relationship for removal
 	 * @param {DependenciesBlockLike} block //TODO: good description
 	 * @returns {void}
 	 */
 	removeReasonsOfDependencyBlock(module, block) {
-		const iteratorDependency = d => {
-			if (!d.module) {
-				return;
-			}
-			if (d.module.removeReason(module, d)) {
-				for (const chunk of d.module.chunksIterable) {
-					this.patchChunksAfterReasonRemoval(d.module, chunk);
-				}
-			}
-		};
-
 		if (block.blocks) {
-			iterationOfArrayCallback(block.blocks, block =>
-				this.removeReasonsOfDependencyBlock(module, block)
-			);
+			for (const b of block.blocks) {
+				this.removeReasonsOfDependencyBlock(module, b);
+			}
 		}
 
 		if (block.dependencies) {
-			iterationOfArrayCallback(block.dependencies, iteratorDependency);
-		}
-
-		if (block.variables) {
-			iterationBlockVariable(block.variables, iteratorDependency);
+			for (const dep of block.dependencies) {
+				const originalModule = this.moduleGraph.getModule(dep);
+				if (originalModule) {
+					this.moduleGraph.removeConnection(dep);
+
+					if (this.chunkGraph) {
+						for (const chunk of this.chunkGraph.getModuleChunks(
+							originalModule
+						)) {
+							this.patchChunksAfterReasonRemoval(originalModule, chunk);
+						}
+					}
+				}
+			}
 		}
 	}
 
@@ -1998,494 +4122,1026 @@ class Compilation extends Tapable {
 	 * @returns {void}
 	 */
 	patchChunksAfterReasonRemoval(module, chunk) {
-		if (!module.hasReasons()) {
+		if (!module.hasReasons(this.moduleGraph, chunk.runtime)) {
 			this.removeReasonsOfDependencyBlock(module, module);
 		}
-		if (!module.hasReasonForChunk(chunk)) {
-			if (module.removeChunk(chunk)) {
-				this.removeChunkFromDependencies(module, chunk);
-			}
+		if (
+			!module.hasReasonForChunk(chunk, this.moduleGraph, this.chunkGraph) &&
+			this.chunkGraph.isModuleInChunk(module, chunk)
+		) {
+			this.chunkGraph.disconnectChunkAndModule(chunk, module);
+			this.removeChunkFromDependencies(module, chunk);
 		}
 	}
 
 	/**
-	 *
 	 * @param {DependenciesBlock} block block tie for Chunk
 	 * @param {Chunk} chunk chunk to remove from dep
 	 * @returns {void}
 	 */
 	removeChunkFromDependencies(block, chunk) {
+		/**
+		 * @param {Dependency} d dependency to (maybe) patch up
+		 */
 		const iteratorDependency = d => {
-			if (!d.module) {
+			const depModule = this.moduleGraph.getModule(d);
+			if (!depModule) {
 				return;
 			}
-			this.patchChunksAfterReasonRemoval(d.module, chunk);
+			this.patchChunksAfterReasonRemoval(depModule, chunk);
 		};
 
 		const blocks = block.blocks;
-		for (let indexBlock = 0; indexBlock < blocks.length; indexBlock++) {
-			const asyncBlock = blocks[indexBlock];
+		for (const asyncBlock of blocks) {
+			const chunkGroup =
+				/** @type {ChunkGroup} */
+				(this.chunkGraph.getBlockChunkGroup(asyncBlock));
 			// Grab all chunks from the first Block's AsyncDepBlock
-			const chunks = asyncBlock.chunkGroup.chunks;
+			const chunks = chunkGroup.chunks;
 			// For each chunk in chunkGroup
-			for (let indexChunk = 0; indexChunk < chunks.length; indexChunk++) {
-				const iteratedChunk = chunks[indexChunk];
-				asyncBlock.chunkGroup.removeChunk(iteratedChunk);
-				asyncBlock.chunkGroup.removeParent(iteratedChunk);
+			for (const iteratedChunk of chunks) {
+				chunkGroup.removeChunk(iteratedChunk);
 				// Recurse
 				this.removeChunkFromDependencies(block, iteratedChunk);
 			}
 		}
 
 		if (block.dependencies) {
-			iterationOfArrayCallback(block.dependencies, iteratorDependency);
-		}
-
-		if (block.variables) {
-			iterationBlockVariable(block.variables, iteratorDependency);
+			for (const dep of block.dependencies) iteratorDependency(dep);
 		}
 	}
 
-	applyModuleIds() {
-		const unusedIds = [];
-		let nextFreeModuleId = 0;
-		const usedIds = new Set();
-		if (this.usedModuleIds) {
-			for (const id of this.usedModuleIds) {
-				usedIds.add(id);
-			}
+	assignRuntimeIds() {
+		const { chunkGraph } = this;
+		/**
+		 * @param {Entrypoint} ep an entrypoint
+		 */
+		const processEntrypoint = ep => {
+			const runtime = /** @type {string} */ (ep.options.runtime || ep.name);
+			const chunk = /** @type {Chunk} */ (ep.getRuntimeChunk());
+			chunkGraph.setRuntimeId(runtime, /** @type {ChunkId} */ (chunk.id));
+		};
+		for (const ep of this.entrypoints.values()) {
+			processEntrypoint(ep);
 		}
+		for (const ep of this.asyncEntrypoints) {
+			processEntrypoint(ep);
+		}
+	}
 
-		const modules1 = this.modules;
-		for (let indexModule1 = 0; indexModule1 < modules1.length; indexModule1++) {
-			const module1 = modules1[indexModule1];
-			if (module1.id !== null) {
-				usedIds.add(module1.id);
-			}
+	sortItemsWithChunkIds() {
+		for (const chunkGroup of this.chunkGroups) {
+			chunkGroup.sortItems();
 		}
 
-		if (usedIds.size > 0) {
-			let usedIdMax = -1;
-			for (const usedIdKey of usedIds) {
-				if (typeof usedIdKey !== "number") {
-					continue;
-				}
+		this.errors.sort(compareErrors);
+		this.warnings.sort(compareErrors);
+		this.children.sort(byNameOrHash);
+	}
 
-				usedIdMax = Math.max(usedIdMax, usedIdKey);
-			}
+	summarizeDependencies() {
+		for (const child of this.children) {
+			this.fileDependencies.addAll(child.fileDependencies);
+			this.contextDependencies.addAll(child.contextDependencies);
+			this.missingDependencies.addAll(child.missingDependencies);
+			this.buildDependencies.addAll(child.buildDependencies);
+		}
 
-			let lengthFreeModules = (nextFreeModuleId = usedIdMax + 1);
+		for (const module of this.modules) {
+			module.addCacheDependencies(
+				this.fileDependencies,
+				this.contextDependencies,
+				this.missingDependencies,
+				this.buildDependencies
+			);
+		}
+	}
 
-			while (lengthFreeModules--) {
-				if (!usedIds.has(lengthFreeModules)) {
-					unusedIds.push(lengthFreeModules);
+	createModuleHashes() {
+		let statModulesHashed = 0;
+		let statModulesFromCache = 0;
+		const { chunkGraph, runtimeTemplate, moduleMemCaches2 } = this;
+		const { hashFunction, hashDigest, hashDigestLength } = this.outputOptions;
+		/** @type {WebpackError[]} */
+		const errors = [];
+		for (const module of this.modules) {
+			const memCache = moduleMemCaches2 && moduleMemCaches2.get(module);
+			for (const runtime of chunkGraph.getModuleRuntimes(module)) {
+				if (memCache) {
+					const digest =
+						/** @type {string} */
+						(memCache.get(`moduleHash-${getRuntimeKey(runtime)}`));
+					if (digest !== undefined) {
+						chunkGraph.setModuleHashes(
+							module,
+							runtime,
+							digest,
+							digest.slice(0, hashDigestLength)
+						);
+						statModulesFromCache++;
+						continue;
+					}
+				}
+				statModulesHashed++;
+				const digest = this._createModuleHash(
+					module,
+					chunkGraph,
+					runtime,
+					hashFunction,
+					runtimeTemplate,
+					hashDigest,
+					hashDigestLength,
+					errors
+				);
+				if (memCache) {
+					memCache.set(`moduleHash-${getRuntimeKey(runtime)}`, digest);
 				}
 			}
 		}
-
-		const modules2 = this.modules;
-		for (let indexModule2 = 0; indexModule2 < modules2.length; indexModule2++) {
-			const module2 = modules2[indexModule2];
-			if (module2.id === null) {
-				if (unusedIds.length > 0) {
-					module2.id = unusedIds.pop();
-				} else {
-					module2.id = nextFreeModuleId++;
-				}
+		if (errors.length > 0) {
+			errors.sort(compareSelect(err => err.module, compareModulesByIdentifier));
+			for (const error of errors) {
+				this.errors.push(error);
 			}
 		}
+		this.logger.log(
+			`${statModulesHashed} modules hashed, ${statModulesFromCache} from cache (${
+				Math.round(
+					(100 * (statModulesHashed + statModulesFromCache)) / this.modules.size
+				) / 100
+			} variants per module in average)`
+		);
 	}
 
-	applyChunkIds() {
-		/** @type {Set} */
-		const usedIds = new Set();
-
-		// Get used ids from usedChunkIds property (i. e. from records)
-		if (this.usedChunkIds) {
-			for (const id of this.usedChunkIds) {
-				if (typeof id !== "number") {
-					continue;
-				}
+	/**
+	 * @private
+	 * @param {Module} module module
+	 * @param {ChunkGraph} chunkGraph the chunk graph
+	 * @param {RuntimeSpec} runtime runtime
+	 * @param {OutputOptions["hashFunction"]} hashFunction hash function
+	 * @param {RuntimeTemplate} runtimeTemplate runtime template
+	 * @param {OutputOptions["hashDigest"]} hashDigest hash digest
+	 * @param {OutputOptions["hashDigestLength"]} hashDigestLength hash digest length
+	 * @param {WebpackError[]} errors errors
+	 * @returns {string} module hash digest
+	 */
+	_createModuleHash(
+		module,
+		chunkGraph,
+		runtime,
+		hashFunction,
+		runtimeTemplate,
+		hashDigest,
+		hashDigestLength,
+		errors
+	) {
+		let moduleHashDigest;
+		try {
+			const moduleHash = createHash(/** @type {HashFunction} */ (hashFunction));
+			module.updateHash(moduleHash, {
+				chunkGraph,
+				runtime,
+				runtimeTemplate
+			});
+			moduleHashDigest = /** @type {string} */ (moduleHash.digest(hashDigest));
+		} catch (err) {
+			errors.push(new ModuleHashingError(module, /** @type {Error} */ (err)));
+			moduleHashDigest = "XXXXXX";
+		}
+		chunkGraph.setModuleHashes(
+			module,
+			runtime,
+			moduleHashDigest,
+			moduleHashDigest.slice(0, hashDigestLength)
+		);
+		return moduleHashDigest;
+	}
 
-				usedIds.add(id);
+	createHash() {
+		this.logger.time("hashing: initialize hash");
+		const chunkGraph = /** @type {ChunkGraph} */ (this.chunkGraph);
+		const runtimeTemplate = this.runtimeTemplate;
+		const outputOptions = this.outputOptions;
+		const hashFunction = outputOptions.hashFunction;
+		const hashDigest = outputOptions.hashDigest;
+		const hashDigestLength = outputOptions.hashDigestLength;
+		const hash = createHash(/** @type {HashFunction} */ (hashFunction));
+		if (outputOptions.hashSalt) {
+			hash.update(outputOptions.hashSalt);
+		}
+		this.logger.timeEnd("hashing: initialize hash");
+		if (this.children.length > 0) {
+			this.logger.time("hashing: hash child compilations");
+			for (const child of this.children) {
+				hash.update(/** @type {string} */ (child.hash));
 			}
+			this.logger.timeEnd("hashing: hash child compilations");
 		}
-
-		// Get used ids from existing chunks
-		const chunks = this.chunks;
-		for (let indexChunk = 0; indexChunk < chunks.length; indexChunk++) {
-			const chunk = chunks[indexChunk];
-			const usedIdValue = chunk.id;
-
-			if (typeof usedIdValue !== "number") {
-				continue;
+		if (this.warnings.length > 0) {
+			this.logger.time("hashing: hash warnings");
+			for (const warning of this.warnings) {
+				hash.update(`${warning.message}`);
 			}
-
-			usedIds.add(usedIdValue);
+			this.logger.timeEnd("hashing: hash warnings");
 		}
-
-		// Calculate maximum assigned chunk id
-		let nextFreeChunkId = -1;
-		for (const id of usedIds) {
-			nextFreeChunkId = Math.max(nextFreeChunkId, id);
+		if (this.errors.length > 0) {
+			this.logger.time("hashing: hash errors");
+			for (const error of this.errors) {
+				hash.update(`${error.message}`);
+			}
+			this.logger.timeEnd("hashing: hash errors");
 		}
-		nextFreeChunkId++;
 
-		// Determine free chunk ids from 0 to maximum
-		/** @type {number[]} */
-		const unusedIds = [];
-		if (nextFreeChunkId > 0) {
-			let index = nextFreeChunkId;
-			while (index--) {
-				if (!usedIds.has(index)) {
-					unusedIds.push(index);
+		this.logger.time("hashing: sort chunks");
+		/*
+		 * all non-runtime chunks need to be hashes first,
+		 * since runtime chunk might use their hashes.
+		 * runtime chunks need to be hashed in the correct order
+		 * since they may depend on each other (for async entrypoints).
+		 * So we put all non-runtime chunks first and hash them in any order.
+		 * And order runtime chunks according to referenced between each other.
+		 * Chunks need to be in deterministic order since we add hashes to full chunk
+		 * during these hashing.
+		 */
+		/** @type {Chunk[]} */
+		const unorderedRuntimeChunks = [];
+		/** @type {Chunk[]} */
+		const otherChunks = [];
+		for (const c of this.chunks) {
+			if (c.hasRuntime()) {
+				unorderedRuntimeChunks.push(c);
+			} else {
+				otherChunks.push(c);
+			}
+		}
+		unorderedRuntimeChunks.sort(byId);
+		otherChunks.sort(byId);
+
+		/** @typedef {{ chunk: Chunk, referencedBy: RuntimeChunkInfo[], remaining: number }} RuntimeChunkInfo */
+		/** @type {Map} */
+		const runtimeChunksMap = new Map();
+		for (const chunk of unorderedRuntimeChunks) {
+			runtimeChunksMap.set(chunk, {
+				chunk,
+				referencedBy: [],
+				remaining: 0
+			});
+		}
+		let remaining = 0;
+		for (const info of runtimeChunksMap.values()) {
+			for (const other of new Set(
+				Array.from(info.chunk.getAllReferencedAsyncEntrypoints()).map(
+					e => e.chunks[e.chunks.length - 1]
+				)
+			)) {
+				const otherInfo =
+					/** @type {RuntimeChunkInfo} */
+					(runtimeChunksMap.get(other));
+				otherInfo.referencedBy.push(info);
+				info.remaining++;
+				remaining++;
+			}
+		}
+		/** @type {Chunk[]} */
+		const runtimeChunks = [];
+		for (const info of runtimeChunksMap.values()) {
+			if (info.remaining === 0) {
+				runtimeChunks.push(info.chunk);
+			}
+		}
+		// If there are any references between chunks
+		// make sure to follow these chains
+		if (remaining > 0) {
+			const readyChunks = [];
+			for (const chunk of runtimeChunks) {
+				const hasFullHashModules =
+					chunkGraph.getNumberOfChunkFullHashModules(chunk) !== 0;
+				const info =
+					/** @type {RuntimeChunkInfo} */
+					(runtimeChunksMap.get(chunk));
+				for (const otherInfo of info.referencedBy) {
+					if (hasFullHashModules) {
+						chunkGraph.upgradeDependentToFullHashModules(otherInfo.chunk);
+					}
+					remaining--;
+					if (--otherInfo.remaining === 0) {
+						readyChunks.push(otherInfo.chunk);
+					}
+				}
+				if (readyChunks.length > 0) {
+					// This ensures deterministic ordering, since referencedBy is non-deterministic
+					readyChunks.sort(byId);
+					for (const c of readyChunks) runtimeChunks.push(c);
+					readyChunks.length = 0;
+				}
+			}
+		}
+		// If there are still remaining references we have cycles and want to create a warning
+		if (remaining > 0) {
+			const circularRuntimeChunkInfo = [];
+			for (const info of runtimeChunksMap.values()) {
+				if (info.remaining !== 0) {
+					circularRuntimeChunkInfo.push(info);
 				}
 			}
+			circularRuntimeChunkInfo.sort(compareSelect(i => i.chunk, byId));
+			const err =
+				new WebpackError(`Circular dependency between chunks with runtime (${Array.from(
+					circularRuntimeChunkInfo,
+					c => c.chunk.name || c.chunk.id
+				).join(", ")})
+This prevents using hashes of each other and should be avoided.`);
+			err.chunk = circularRuntimeChunkInfo[0].chunk;
+			this.warnings.push(err);
+			for (const i of circularRuntimeChunkInfo) runtimeChunks.push(i.chunk);
 		}
+		this.logger.timeEnd("hashing: sort chunks");
+
+		const fullHashChunks = new Set();
+		/** @type {CodeGenerationJobs} */
+		const codeGenerationJobs = [];
+		/** @type {Map>} */
+		const codeGenerationJobsMap = new Map();
+		/** @type {WebpackError[]} */
+		const errors = [];
 
-		// Assign ids to chunk which has no id
-		for (let indexChunk = 0; indexChunk < chunks.length; indexChunk++) {
-			const chunk = chunks[indexChunk];
-			if (chunk.id === null) {
-				if (unusedIds.length > 0) {
-					chunk.id = unusedIds.pop();
+		/**
+		 * @param {Chunk} chunk chunk
+		 */
+		const processChunk = chunk => {
+			// Last minute module hash generation for modules that depend on chunk hashes
+			this.logger.time("hashing: hash runtime modules");
+			const runtime = chunk.runtime;
+			for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
+				if (!chunkGraph.hasModuleHashes(module, runtime)) {
+					const hash = this._createModuleHash(
+						module,
+						chunkGraph,
+						runtime,
+						hashFunction,
+						runtimeTemplate,
+						hashDigest,
+						hashDigestLength,
+						errors
+					);
+					let hashMap = codeGenerationJobsMap.get(hash);
+					if (hashMap) {
+						const moduleJob = hashMap.get(module);
+						if (moduleJob) {
+							moduleJob.runtimes.push(runtime);
+							continue;
+						}
+					} else {
+						hashMap = new Map();
+						codeGenerationJobsMap.set(hash, hashMap);
+					}
+					const job = {
+						module,
+						hash,
+						runtime,
+						runtimes: [runtime]
+					};
+					hashMap.set(module, job);
+					codeGenerationJobs.push(job);
+				}
+			}
+			this.logger.timeAggregate("hashing: hash runtime modules");
+			try {
+				this.logger.time("hashing: hash chunks");
+				const chunkHash = createHash(
+					/** @type {HashFunction} */ (hashFunction)
+				);
+				if (outputOptions.hashSalt) {
+					chunkHash.update(outputOptions.hashSalt);
+				}
+				chunk.updateHash(chunkHash, chunkGraph);
+				this.hooks.chunkHash.call(chunk, chunkHash, {
+					chunkGraph,
+					codeGenerationResults: this.codeGenerationResults,
+					moduleGraph: this.moduleGraph,
+					runtimeTemplate: this.runtimeTemplate
+				});
+				const chunkHashDigest = /** @type {string} */ (
+					chunkHash.digest(hashDigest)
+				);
+				hash.update(chunkHashDigest);
+				chunk.hash = chunkHashDigest;
+				chunk.renderedHash = chunk.hash.slice(0, hashDigestLength);
+				const fullHashModules =
+					chunkGraph.getChunkFullHashModulesIterable(chunk);
+				if (fullHashModules) {
+					fullHashChunks.add(chunk);
 				} else {
-					chunk.id = nextFreeChunkId++;
+					this.hooks.contentHash.call(chunk);
 				}
+			} catch (err) {
+				this.errors.push(
+					new ChunkRenderError(chunk, "", /** @type {Error} */ (err))
+				);
 			}
-			if (!chunk.ids) {
-				chunk.ids = [chunk.id];
+			this.logger.timeAggregate("hashing: hash chunks");
+		};
+		for (const chunk of otherChunks) processChunk(chunk);
+		for (const chunk of runtimeChunks) processChunk(chunk);
+		if (errors.length > 0) {
+			errors.sort(compareSelect(err => err.module, compareModulesByIdentifier));
+			for (const error of errors) {
+				this.errors.push(error);
 			}
 		}
-	}
-
-	sortItemsWithModuleIds() {
-		this.modules.sort(byIdOrIdentifier);
 
-		const modules = this.modules;
-		for (let indexModule = 0; indexModule < modules.length; indexModule++) {
-			modules[indexModule].sortItems(false);
+		this.logger.timeAggregateEnd("hashing: hash runtime modules");
+		this.logger.timeAggregateEnd("hashing: hash chunks");
+		this.logger.time("hashing: hash digest");
+		this.hooks.fullHash.call(hash);
+		this.fullHash = /** @type {string} */ (hash.digest(hashDigest));
+		this.hash = this.fullHash.slice(0, hashDigestLength);
+		this.logger.timeEnd("hashing: hash digest");
+
+		this.logger.time("hashing: process full hash modules");
+		for (const chunk of fullHashChunks) {
+			for (const module of /** @type {Iterable} */ (
+				chunkGraph.getChunkFullHashModulesIterable(chunk)
+			)) {
+				const moduleHash = createHash(
+					/** @type {HashFunction} */ (hashFunction)
+				);
+				module.updateHash(moduleHash, {
+					chunkGraph,
+					runtime: chunk.runtime,
+					runtimeTemplate
+				});
+				const moduleHashDigest = /** @type {string} */ (
+					moduleHash.digest(hashDigest)
+				);
+				const oldHash = chunkGraph.getModuleHash(module, chunk.runtime);
+				chunkGraph.setModuleHashes(
+					module,
+					chunk.runtime,
+					moduleHashDigest,
+					moduleHashDigest.slice(0, hashDigestLength)
+				);
+				/** @type {CodeGenerationJob} */
+				(
+					/** @type {Map} */
+					(codeGenerationJobsMap.get(oldHash)).get(module)
+				).hash = moduleHashDigest;
+			}
+			const chunkHash = createHash(/** @type {HashFunction} */ (hashFunction));
+			chunkHash.update(chunk.hash);
+			chunkHash.update(this.hash);
+			const chunkHashDigest =
+				/** @type {string} */
+				(chunkHash.digest(hashDigest));
+			chunk.hash = chunkHashDigest;
+			chunk.renderedHash = chunk.hash.slice(0, hashDigestLength);
+			this.hooks.contentHash.call(chunk);
 		}
+		this.logger.timeEnd("hashing: process full hash modules");
+		return codeGenerationJobs;
+	}
 
-		const chunks = this.chunks;
-		for (let indexChunk = 0; indexChunk < chunks.length; indexChunk++) {
-			chunks[indexChunk].sortItems();
+	/**
+	 * @param {string} file file name
+	 * @param {Source} source asset source
+	 * @param {AssetInfo} assetInfo extra asset information
+	 * @returns {void}
+	 */
+	emitAsset(file, source, assetInfo = {}) {
+		if (this.assets[file]) {
+			if (!isSourceEqual(this.assets[file], source)) {
+				this.errors.push(
+					new WebpackError(
+						`Conflict: Multiple assets emit different content to the same filename ${file}${
+							assetInfo.sourceFilename
+								? `. Original source ${assetInfo.sourceFilename}`
+								: ""
+						}`
+					)
+				);
+				this.assets[file] = source;
+				this._setAssetInfo(file, assetInfo);
+				return;
+			}
+			const oldInfo = this.assetsInfo.get(file);
+			const newInfo = { ...oldInfo, ...assetInfo };
+			this._setAssetInfo(file, newInfo, oldInfo);
+			return;
 		}
-
-		chunks.sort((a, b) => a.compareTo(b));
+		this.assets[file] = source;
+		this._setAssetInfo(file, assetInfo, undefined);
 	}
 
-	sortItemsWithChunkIds() {
-		for (const chunkGroup of this.chunkGroups) {
-			chunkGroup.sortItems();
+	/**
+	 * @private
+	 * @param {string} file file name
+	 * @param {AssetInfo=} newInfo new asset information
+	 * @param {AssetInfo=} oldInfo old asset information
+	 */
+	_setAssetInfo(file, newInfo, oldInfo = this.assetsInfo.get(file)) {
+		if (newInfo === undefined) {
+			this.assetsInfo.delete(file);
+		} else {
+			this.assetsInfo.set(file, newInfo);
 		}
-
-		this.chunks.sort(byId);
-
-		for (
-			let indexModule = 0;
-			indexModule < this.modules.length;
-			indexModule++
-		) {
-			this.modules[indexModule].sortItems(true);
+		const oldRelated = oldInfo && oldInfo.related;
+		const newRelated = newInfo && newInfo.related;
+		if (oldRelated) {
+			for (const key of Object.keys(oldRelated)) {
+				/**
+				 * @param {string} name name
+				 */
+				const remove = name => {
+					const relatedIn = this._assetsRelatedIn.get(name);
+					if (relatedIn === undefined) return;
+					const entry = relatedIn.get(key);
+					if (entry === undefined) return;
+					entry.delete(file);
+					if (entry.size !== 0) return;
+					relatedIn.delete(key);
+					if (relatedIn.size === 0) this._assetsRelatedIn.delete(name);
+				};
+				const entry = oldRelated[key];
+				if (Array.isArray(entry)) {
+					for (const name of entry) {
+						remove(name);
+					}
+				} else if (entry) {
+					remove(entry);
+				}
+			}
 		}
-
-		const chunks = this.chunks;
-		for (let indexChunk = 0; indexChunk < chunks.length; indexChunk++) {
-			chunks[indexChunk].sortItems();
+		if (newRelated) {
+			for (const key of Object.keys(newRelated)) {
+				/**
+				 * @param {string} name name
+				 */
+				const add = name => {
+					let relatedIn = this._assetsRelatedIn.get(name);
+					if (relatedIn === undefined) {
+						this._assetsRelatedIn.set(name, (relatedIn = new Map()));
+					}
+					let entry = relatedIn.get(key);
+					if (entry === undefined) {
+						relatedIn.set(key, (entry = new Set()));
+					}
+					entry.add(file);
+				};
+				const entry = newRelated[key];
+				if (Array.isArray(entry)) {
+					for (const name of entry) {
+						add(name);
+					}
+				} else if (entry) {
+					add(entry);
+				}
+			}
 		}
-
-		/**
-		 * Used to sort errors and warnings in compilation. this.warnings, and
-		 * this.errors contribute to the compilation hash and therefore should be
-		 * updated whenever other references (having a chunk id) are sorted. This preserves the hash
-		 * integrity
-		 *
-		 * @param {WebpackError} a first WebpackError instance (including subclasses)
-		 * @param {WebpackError} b second WebpackError instance (including subclasses)
-		 * @returns {-1|0|1} sort order index
-		 */
-		const byMessage = (a, b) => {
-			const ma = `${a.message}`;
-			const mb = `${b.message}`;
-			if (ma < mb) return -1;
-			if (mb < ma) return 1;
-			return 0;
-		};
-
-		this.errors.sort(byMessage);
-		this.warnings.sort(byMessage);
-		this.children.sort(byNameOrHash);
 	}
 
-	summarizeDependencies() {
-		this.fileDependencies = new SortableSet(this.compilationDependencies);
-		this.contextDependencies = new SortableSet();
-		this.missingDependencies = new SortableSet();
-
-		for (
-			let indexChildren = 0;
-			indexChildren < this.children.length;
-			indexChildren++
-		) {
-			const child = this.children[indexChildren];
-
-			addAllToSet(this.fileDependencies, child.fileDependencies);
-			addAllToSet(this.contextDependencies, child.contextDependencies);
-			addAllToSet(this.missingDependencies, child.missingDependencies);
+	/**
+	 * @param {string} file file name
+	 * @param {Source | ((source: Source) => Source)} newSourceOrFunction new asset source or function converting old to new
+	 * @param {(AssetInfo | ((assetInfo?: AssetInfo) => AssetInfo | undefined)) | undefined} assetInfoUpdateOrFunction new asset info or function converting old to new
+	 */
+	updateAsset(
+		file,
+		newSourceOrFunction,
+		assetInfoUpdateOrFunction = undefined
+	) {
+		if (!this.assets[file]) {
+			throw new Error(
+				`Called Compilation.updateAsset for not existing filename ${file}`
+			);
 		}
-
-		for (
-			let indexModule = 0;
-			indexModule < this.modules.length;
-			indexModule++
-		) {
-			const module = this.modules[indexModule];
-
-			if (module.buildInfo.fileDependencies) {
-				addAllToSet(this.fileDependencies, module.buildInfo.fileDependencies);
-			}
-			if (module.buildInfo.contextDependencies) {
-				addAllToSet(
-					this.contextDependencies,
-					module.buildInfo.contextDependencies
+		this.assets[file] =
+			typeof newSourceOrFunction === "function"
+				? newSourceOrFunction(this.assets[file])
+				: newSourceOrFunction;
+		if (assetInfoUpdateOrFunction !== undefined) {
+			const oldInfo = this.assetsInfo.get(file) || EMPTY_ASSET_INFO;
+			if (typeof assetInfoUpdateOrFunction === "function") {
+				this._setAssetInfo(file, assetInfoUpdateOrFunction(oldInfo), oldInfo);
+			} else {
+				this._setAssetInfo(
+					file,
+					cachedCleverMerge(oldInfo, assetInfoUpdateOrFunction),
+					oldInfo
 				);
 			}
 		}
-		for (const error of this.errors) {
-			if (
-				typeof error.missing === "object" &&
-				error.missing &&
-				error.missing[Symbol.iterator]
-			) {
-				addAllToSet(this.missingDependencies, error.missing);
-			}
-		}
-		this.fileDependencies.sort();
-		this.contextDependencies.sort();
-		this.missingDependencies.sort();
 	}
 
-	createHash() {
-		const outputOptions = this.outputOptions;
-		const hashFunction = outputOptions.hashFunction;
-		const hashDigest = outputOptions.hashDigest;
-		const hashDigestLength = outputOptions.hashDigestLength;
-		const hash = createHash(hashFunction);
-		if (outputOptions.hashSalt) {
-			hash.update(outputOptions.hashSalt);
+	/**
+	 * @param {string} file file name
+	 * @param {string} newFile the new name of file
+	 */
+	renameAsset(file, newFile) {
+		const source = this.assets[file];
+		if (!source) {
+			throw new Error(
+				`Called Compilation.renameAsset for not existing filename ${file}`
+			);
+		}
+		if (this.assets[newFile] && !isSourceEqual(this.assets[file], source)) {
+			this.errors.push(
+				new WebpackError(
+					`Conflict: Called Compilation.renameAsset for already existing filename ${newFile} with different content`
+				)
+			);
 		}
-		this.mainTemplate.updateHash(hash);
-		this.chunkTemplate.updateHash(hash);
-		for (const key of Object.keys(this.moduleTemplates).sort()) {
-			this.moduleTemplates[key].updateHash(hash);
+		const assetInfo = this.assetsInfo.get(file);
+		// Update related in all other assets
+		const relatedInInfo = this._assetsRelatedIn.get(file);
+		if (relatedInInfo) {
+			for (const [key, assets] of relatedInInfo) {
+				for (const name of assets) {
+					const info = this.assetsInfo.get(name);
+					if (!info) continue;
+					const related = info.related;
+					if (!related) continue;
+					const entry = related[key];
+					let newEntry;
+					if (Array.isArray(entry)) {
+						newEntry = entry.map(x => (x === file ? newFile : x));
+					} else if (entry === file) {
+						newEntry = newFile;
+					} else continue;
+					this.assetsInfo.set(name, {
+						...info,
+						related: {
+							...related,
+							[key]: newEntry
+						}
+					});
+				}
+			}
 		}
-		for (const child of this.children) {
-			hash.update(child.hash);
+		this._setAssetInfo(file, undefined, assetInfo);
+		this._setAssetInfo(newFile, assetInfo);
+		delete this.assets[file];
+		this.assets[newFile] = source;
+		for (const chunk of this.chunks) {
+			{
+				const size = chunk.files.size;
+				chunk.files.delete(file);
+				if (size !== chunk.files.size) {
+					chunk.files.add(newFile);
+				}
+			}
+			{
+				const size = chunk.auxiliaryFiles.size;
+				chunk.auxiliaryFiles.delete(file);
+				if (size !== chunk.auxiliaryFiles.size) {
+					chunk.auxiliaryFiles.add(newFile);
+				}
+			}
 		}
-		for (const warning of this.warnings) {
-			hash.update(`${warning.message}`);
+	}
+
+	/**
+	 * @param {string} file file name
+	 */
+	deleteAsset(file) {
+		if (!this.assets[file]) {
+			return;
 		}
-		for (const error of this.errors) {
-			hash.update(`${error.message}`);
+		delete this.assets[file];
+		const assetInfo = this.assetsInfo.get(file);
+		this._setAssetInfo(file, undefined, assetInfo);
+		const related = assetInfo && assetInfo.related;
+		if (related) {
+			for (const key of Object.keys(related)) {
+				/**
+				 * @param {string} file file
+				 */
+				const checkUsedAndDelete = file => {
+					if (!this._assetsRelatedIn.has(file)) {
+						this.deleteAsset(file);
+					}
+				};
+				const items = related[key];
+				if (Array.isArray(items)) {
+					for (const file of items) {
+						checkUsedAndDelete(file);
+					}
+				} else if (items) {
+					checkUsedAndDelete(items);
+				}
+			}
 		}
-		const modules = this.modules;
-		for (let i = 0; i < modules.length; i++) {
-			const module = modules[i];
-			const moduleHash = createHash(hashFunction);
-			module.updateHash(moduleHash);
-			module.hash = moduleHash.digest(hashDigest);
-			module.renderedHash = module.hash.substr(0, hashDigestLength);
+		// TODO If this becomes a performance problem
+		// store a reverse mapping from asset to chunk
+		for (const chunk of this.chunks) {
+			chunk.files.delete(file);
+			chunk.auxiliaryFiles.delete(file);
 		}
-		// clone needed as sort below is inplace mutation
-		const chunks = this.chunks.slice();
-		/**
-		 * sort here will bring all "falsy" values to the beginning
-		 * this is needed as the "hasRuntime()" chunks are dependent on the
-		 * hashes of the non-runtime chunks.
-		 */
-		chunks.sort((a, b) => {
-			const aEntry = a.hasRuntime();
-			const bEntry = b.hasRuntime();
-			if (aEntry && !bEntry) return 1;
-			if (!aEntry && bEntry) return -1;
-			return byId(a, b);
-		});
-		for (let i = 0; i < chunks.length; i++) {
-			const chunk = chunks[i];
-			const chunkHash = createHash(hashFunction);
-			try {
-				if (outputOptions.hashSalt) {
-					chunkHash.update(outputOptions.hashSalt);
-				}
-				chunk.updateHash(chunkHash);
-				const template = chunk.hasRuntime()
-					? this.mainTemplate
-					: this.chunkTemplate;
-				template.updateHashForChunk(
-					chunkHash,
-					chunk,
-					this.moduleTemplates.javascript,
-					this.dependencyTemplates
-				);
-				this.hooks.chunkHash.call(chunk, chunkHash);
-				chunk.hash = chunkHash.digest(hashDigest);
-				hash.update(chunk.hash);
-				chunk.renderedHash = chunk.hash.substr(0, hashDigestLength);
-				this.hooks.contentHash.call(chunk);
-			} catch (err) {
-				this.errors.push(new ChunkRenderError(chunk, "", err));
+	}
+
+	getAssets() {
+		/** @type {Readonly[]} */
+		const array = [];
+		for (const assetName of Object.keys(this.assets)) {
+			if (Object.prototype.hasOwnProperty.call(this.assets, assetName)) {
+				array.push({
+					name: assetName,
+					source: this.assets[assetName],
+					info: this.assetsInfo.get(assetName) || EMPTY_ASSET_INFO
+				});
 			}
 		}
-		this.fullHash = hash.digest(hashDigest);
-		this.hash = this.fullHash.substr(0, hashDigestLength);
+		return array;
 	}
 
 	/**
-	 * @param {string} update extra information
-	 * @returns {void}
+	 * @param {string} name the name of the asset
+	 * @returns {Readonly | undefined} the asset or undefined when not found
 	 */
-	modifyHash(update) {
-		const outputOptions = this.outputOptions;
-		const hashFunction = outputOptions.hashFunction;
-		const hashDigest = outputOptions.hashDigest;
-		const hashDigestLength = outputOptions.hashDigestLength;
-		const hash = createHash(hashFunction);
-		hash.update(this.fullHash);
-		hash.update(update);
-		this.fullHash = hash.digest(hashDigest);
-		this.hash = this.fullHash.substr(0, hashDigestLength);
+	getAsset(name) {
+		if (!Object.prototype.hasOwnProperty.call(this.assets, name)) return;
+		return {
+			name,
+			source: this.assets[name],
+			info: this.assetsInfo.get(name) || EMPTY_ASSET_INFO
+		};
+	}
+
+	clearAssets() {
+		for (const chunk of this.chunks) {
+			chunk.files.clear();
+			chunk.auxiliaryFiles.clear();
+		}
 	}
 
 	createModuleAssets() {
-		for (let i = 0; i < this.modules.length; i++) {
-			const module = this.modules[i];
-			if (module.buildInfo.assets) {
-				for (const assetName of Object.keys(module.buildInfo.assets)) {
-					const fileName = this.getPath(assetName);
-					this.assets[fileName] = module.buildInfo.assets[assetName];
+		const { chunkGraph } = this;
+		for (const module of this.modules) {
+			const buildInfo = /** @type {BuildInfo} */ (module.buildInfo);
+			if (buildInfo.assets) {
+				const assetsInfo = buildInfo.assetsInfo;
+				for (const assetName of Object.keys(buildInfo.assets)) {
+					const fileName = this.getPath(assetName, {
+						chunkGraph: this.chunkGraph,
+						module
+					});
+					for (const chunk of chunkGraph.getModuleChunksIterable(module)) {
+						chunk.auxiliaryFiles.add(fileName);
+					}
+					this.emitAsset(
+						fileName,
+						buildInfo.assets[assetName],
+						assetsInfo ? assetsInfo.get(assetName) : undefined
+					);
 					this.hooks.moduleAsset.call(module, fileName);
 				}
 			}
 		}
 	}
 
-	createChunkAssets() {
+	/**
+	 * @param {RenderManifestOptions} options options object
+	 * @returns {RenderManifestEntry[]} manifest entries
+	 */
+	getRenderManifest(options) {
+		return this.hooks.renderManifest.call([], options);
+	}
+
+	/**
+	 * @param {Callback} callback signals when the call finishes
+	 * @returns {void}
+	 */
+	createChunkAssets(callback) {
 		const outputOptions = this.outputOptions;
-		const cachedSourceMap = new Map();
+		const cachedSourceMap = new WeakMap();
 		/** @type {Map} */
 		const alreadyWrittenFiles = new Map();
-		for (let i = 0; i < this.chunks.length; i++) {
-			const chunk = this.chunks[i];
-			chunk.files = [];
-			let source;
-			let file;
-			let filenameTemplate;
-			try {
-				const template = chunk.hasRuntime()
-					? this.mainTemplate
-					: this.chunkTemplate;
-				const manifest = template.getRenderManifest({
-					chunk,
-					hash: this.hash,
-					fullHash: this.fullHash,
-					outputOptions,
-					moduleTemplates: this.moduleTemplates,
-					dependencyTemplates: this.dependencyTemplates
-				}); // [{ render(), filenameTemplate, pathOptions, identifier, hash }]
-				for (const fileManifest of manifest) {
-					const cacheName = fileManifest.identifier;
-					const usedHash = fileManifest.hash;
-					filenameTemplate = fileManifest.filenameTemplate;
-					file = this.getPath(filenameTemplate, fileManifest.pathOptions);
-
-					// check if the same filename was already written by another chunk
-					const alreadyWritten = alreadyWrittenFiles.get(file);
-					if (alreadyWritten !== undefined) {
-						if (alreadyWritten.hash === usedHash) {
-							if (this.cache) {
-								this.cache[cacheName] = {
-									hash: usedHash,
-									source: alreadyWritten.source
-								};
-							}
-							chunk.files.push(file);
-							this.hooks.chunkAsset.call(chunk, file);
-							continue;
-						} else {
-							throw new Error(
-								`Conflict: Multiple chunks emit assets to the same filename ${file}` +
-									` (chunks ${alreadyWritten.chunk.id} and ${chunk.id})`
-							);
-						}
-					}
-					if (
-						this.cache &&
-						this.cache[cacheName] &&
-						this.cache[cacheName].hash === usedHash
-					) {
-						source = this.cache[cacheName].source;
-					} else {
-						source = fileManifest.render();
-						// Ensure that source is a cached source to avoid additional cost because of repeated access
-						if (!(source instanceof CachedSource)) {
-							const cacheEntry = cachedSourceMap.get(source);
-							if (cacheEntry) {
-								source = cacheEntry;
-							} else {
-								const cachedSource = new CachedSource(source);
-								cachedSourceMap.set(source, cachedSource);
-								source = cachedSource;
-							}
-						}
-						if (this.cache) {
-							this.cache[cacheName] = {
-								hash: usedHash,
-								source
-							};
-						}
-					}
-					if (this.assets[file] && this.assets[file] !== source) {
-						throw new Error(
-							`Conflict: Multiple assets emit to the same filename ${file}`
-						);
-					}
-					this.assets[file] = source;
-					chunk.files.push(file);
-					this.hooks.chunkAsset.call(chunk, file);
-					alreadyWrittenFiles.set(file, {
-						hash: usedHash,
-						source,
-						chunk
+
+		asyncLib.forEachLimit(
+			this.chunks,
+			15,
+			(chunk, callback) => {
+				/** @type {RenderManifestEntry[]} */
+				let manifest;
+				try {
+					manifest = this.getRenderManifest({
+						chunk,
+						hash: /** @type {string} */ (this.hash),
+						fullHash: /** @type {string} */ (this.fullHash),
+						outputOptions,
+						codeGenerationResults: this.codeGenerationResults,
+						moduleTemplates: this.moduleTemplates,
+						dependencyTemplates: this.dependencyTemplates,
+						chunkGraph: this.chunkGraph,
+						moduleGraph: this.moduleGraph,
+						runtimeTemplate: this.runtimeTemplate
 					});
+				} catch (err) {
+					this.errors.push(
+						new ChunkRenderError(chunk, "", /** @type {Error} */ (err))
+					);
+					return callback();
 				}
-			} catch (err) {
-				this.errors.push(
-					new ChunkRenderError(chunk, file || filenameTemplate, err)
+				asyncLib.each(
+					manifest,
+					(fileManifest, callback) => {
+						const ident = fileManifest.identifier;
+						const usedHash = /** @type {string} */ (fileManifest.hash);
+
+						const assetCacheItem = this._assetsCache.getItemCache(
+							ident,
+							usedHash
+						);
+
+						assetCacheItem.get((err, sourceFromCache) => {
+							/** @type {TemplatePath} */
+							let filenameTemplate;
+							/** @type {string} */
+							let file;
+							/** @type {AssetInfo} */
+							let assetInfo;
+
+							let inTry = true;
+							/**
+							 * @param {Error} err error
+							 * @returns {void}
+							 */
+							const errorAndCallback = err => {
+								const filename =
+									file ||
+									(typeof file === "string"
+										? file
+										: typeof filenameTemplate === "string"
+											? filenameTemplate
+											: "");
+
+								this.errors.push(new ChunkRenderError(chunk, filename, err));
+								inTry = false;
+								return callback();
+							};
+
+							try {
+								if ("filename" in fileManifest) {
+									file = fileManifest.filename;
+									assetInfo = fileManifest.info;
+								} else {
+									filenameTemplate = fileManifest.filenameTemplate;
+									const pathAndInfo = this.getPathWithInfo(
+										filenameTemplate,
+										fileManifest.pathOptions
+									);
+									file = pathAndInfo.path;
+									assetInfo = fileManifest.info
+										? {
+												...pathAndInfo.info,
+												...fileManifest.info
+											}
+										: pathAndInfo.info;
+								}
+
+								if (err) {
+									return errorAndCallback(err);
+								}
+
+								let source = sourceFromCache;
+
+								// check if the same filename was already written by another chunk
+								const alreadyWritten = alreadyWrittenFiles.get(file);
+								if (alreadyWritten !== undefined) {
+									if (alreadyWritten.hash !== usedHash) {
+										inTry = false;
+										return callback(
+											new WebpackError(
+												`Conflict: Multiple chunks emit assets to the same filename ${file}` +
+													` (chunks ${alreadyWritten.chunk.id} and ${chunk.id})`
+											)
+										);
+									}
+									source = alreadyWritten.source;
+								} else if (!source) {
+									// render the asset
+									source = fileManifest.render();
+
+									// Ensure that source is a cached source to avoid additional cost because of repeated access
+									if (!(source instanceof CachedSource)) {
+										const cacheEntry = cachedSourceMap.get(source);
+										if (cacheEntry) {
+											source = cacheEntry;
+										} else {
+											const cachedSource = new CachedSource(source);
+											cachedSourceMap.set(source, cachedSource);
+											source = cachedSource;
+										}
+									}
+								}
+								this.emitAsset(file, source, assetInfo);
+								if (fileManifest.auxiliary) {
+									chunk.auxiliaryFiles.add(file);
+								} else {
+									chunk.files.add(file);
+								}
+								this.hooks.chunkAsset.call(chunk, file);
+								alreadyWrittenFiles.set(file, {
+									hash: usedHash,
+									source,
+									chunk
+								});
+								if (source !== sourceFromCache) {
+									assetCacheItem.store(source, err => {
+										if (err) return errorAndCallback(err);
+										inTry = false;
+										return callback();
+									});
+								} else {
+									inTry = false;
+									callback();
+								}
+							} catch (err) {
+								if (!inTry) throw err;
+								errorAndCallback(/** @type {Error} */ (err));
+							}
+						});
+					},
+					callback
 				);
-			}
+			},
+			callback
+		);
+	}
+
+	/**
+	 * @param {TemplatePath} filename used to get asset path with hash
+	 * @param {PathData} data context data
+	 * @returns {string} interpolated path
+	 */
+	getPath(filename, data = {}) {
+		if (!data.hash) {
+			data = {
+				hash: this.hash,
+				...data
+			};
 		}
+		return this.getAssetPath(filename, data);
 	}
 
 	/**
-	 * @param {string} filename used to get asset path with hash
-	 * @param {TODO=} data // TODO: figure out this param type
+	 * @param {TemplatePath} filename used to get asset path with hash
+	 * @param {PathData} data context data
+	 * @returns {InterpolatedPathAndAssetInfo} interpolated path and asset info
+	 */
+	getPathWithInfo(filename, data = {}) {
+		if (!data.hash) {
+			data = {
+				hash: this.hash,
+				...data
+			};
+		}
+		return this.getAssetPathWithInfo(filename, data);
+	}
+
+	/**
+	 * @param {TemplatePath} filename used to get asset path with hash
+	 * @param {PathData} data context data
 	 * @returns {string} interpolated path
 	 */
-	getPath(filename, data) {
-		data = data || {};
-		data.hash = data.hash || this.hash;
-		return this.mainTemplate.getAssetPath(filename, data);
+	getAssetPath(filename, data) {
+		return this.hooks.assetPath.call(
+			typeof filename === "function" ? filename(data) : filename,
+			data,
+			undefined
+		);
+	}
+
+	/**
+	 * @param {TemplatePath} filename used to get asset path with hash
+	 * @param {PathData} data context data
+	 * @returns {InterpolatedPathAndAssetInfo} interpolated path and asset info
+	 */
+	getAssetPathWithInfo(filename, data) {
+		const assetInfo = {};
+		// TODO webpack 5: refactor assetPath hook to receive { path, info } object
+		const newPath = this.hooks.assetPath.call(
+			typeof filename === "function" ? filename(data, assetInfo) : filename,
+			data,
+			assetInfo
+		);
+		return { path: newPath, info: assetInfo };
+	}
+
+	getWarnings() {
+		return this.hooks.processWarnings.call(this.warnings);
+	}
+
+	getErrors() {
+		return this.hooks.processErrors.call(this.errors);
 	}
 
 	/**
 	 * This function allows you to run another instance of webpack inside of webpack however as
 	 * a child with different settings and configurations (if desired) applied. It copies all hooks, plugins
 	 * from parent (or top level compiler) and creates a child Compilation
-	 *
 	 * @param {string} name name of the child compiler
-	 * @param {TODO} outputOptions // Need to convert config schema to types for this
-	 * @param {Plugin[]} plugins webpack plugins that will be applied
+	 * @param {Partial=} outputOptions // Need to convert config schema to types for this
+	 * @param {Array=} plugins webpack plugins that will be applied
 	 * @returns {Compiler} creates a child Compiler instance
 	 */
 	createChildCompiler(name, outputOptions, plugins) {
@@ -2500,13 +5156,387 @@ class Compilation extends Tapable {
 		);
 	}
 
+	/**
+	 * @param {Module} module the module
+	 * @param {ExecuteModuleOptions} options options
+	 * @param {ExecuteModuleCallback} callback callback
+	 */
+	executeModule(module, options, callback) {
+		// Aggregate all referenced modules and ensure they are ready
+		const modules = new Set([module]);
+		processAsyncTree(
+			modules,
+			10,
+			(module, push, callback) => {
+				this.buildQueue.waitFor(module, err => {
+					if (err) return callback(err);
+					this.processDependenciesQueue.waitFor(module, err => {
+						if (err) return callback(err);
+						for (const { module: m } of this.moduleGraph.getOutgoingConnections(
+							module
+						)) {
+							const size = modules.size;
+							modules.add(m);
+							if (modules.size !== size) push(m);
+						}
+						callback();
+					});
+				});
+			},
+			err => {
+				if (err) return callback(/** @type {WebpackError} */ (err));
+
+				// Create new chunk graph, chunk and entrypoint for the build time execution
+				const chunkGraph = new ChunkGraph(
+					this.moduleGraph,
+					this.outputOptions.hashFunction
+				);
+				const runtime = "build time";
+				const { hashFunction, hashDigest, hashDigestLength } =
+					this.outputOptions;
+				const runtimeTemplate = this.runtimeTemplate;
+
+				const chunk = new Chunk("build time chunk", this._backCompat);
+				chunk.id = /** @type {ChunkId} */ (chunk.name);
+				chunk.ids = [chunk.id];
+				chunk.runtime = runtime;
+
+				const entrypoint = new Entrypoint({
+					runtime,
+					chunkLoading: false,
+					...options.entryOptions
+				});
+				chunkGraph.connectChunkAndEntryModule(chunk, module, entrypoint);
+				connectChunkGroupAndChunk(entrypoint, chunk);
+				entrypoint.setRuntimeChunk(chunk);
+				entrypoint.setEntrypointChunk(chunk);
+
+				const chunks = new Set([chunk]);
+
+				// Assign ids to modules and modules to the chunk
+				for (const module of modules) {
+					const id = module.identifier();
+					chunkGraph.setModuleId(module, id);
+					chunkGraph.connectChunkAndModule(chunk, module);
+				}
+
+				/** @type {WebpackError[]} */
+				const errors = [];
+
+				// Hash modules
+				for (const module of modules) {
+					this._createModuleHash(
+						module,
+						chunkGraph,
+						runtime,
+						hashFunction,
+						runtimeTemplate,
+						hashDigest,
+						hashDigestLength,
+						errors
+					);
+				}
+
+				const codeGenerationResults = new CodeGenerationResults(
+					this.outputOptions.hashFunction
+				);
+				/**
+				 * @param {Module} module the module
+				 * @param {Callback} callback callback
+				 * @returns {void}
+				 */
+				const codeGen = (module, callback) => {
+					this._codeGenerationModule(
+						module,
+						runtime,
+						[runtime],
+						chunkGraph.getModuleHash(module, runtime),
+						this.dependencyTemplates,
+						chunkGraph,
+						this.moduleGraph,
+						runtimeTemplate,
+						errors,
+						codeGenerationResults,
+						(err, codeGenerated) => {
+							callback(err);
+						}
+					);
+				};
+
+				const reportErrors = () => {
+					if (errors.length > 0) {
+						errors.sort(
+							compareSelect(err => err.module, compareModulesByIdentifier)
+						);
+						for (const error of errors) {
+							this.errors.push(error);
+						}
+						errors.length = 0;
+					}
+				};
+
+				// Generate code for all aggregated modules
+				asyncLib.eachLimit(modules, 10, codeGen, err => {
+					if (err) return callback(err);
+					reportErrors();
+
+					// for backward-compat temporary set the chunk graph
+					// TODO webpack 6
+					const old = this.chunkGraph;
+					this.chunkGraph = chunkGraph;
+					this.processRuntimeRequirements({
+						chunkGraph,
+						modules,
+						chunks,
+						codeGenerationResults,
+						chunkGraphEntries: chunks
+					});
+					this.chunkGraph = old;
+
+					const runtimeModules =
+						chunkGraph.getChunkRuntimeModulesIterable(chunk);
+
+					// Hash runtime modules
+					for (const module of runtimeModules) {
+						modules.add(module);
+						this._createModuleHash(
+							module,
+							chunkGraph,
+							runtime,
+							hashFunction,
+							runtimeTemplate,
+							hashDigest,
+							hashDigestLength,
+							errors
+						);
+					}
+
+					// Generate code for all runtime modules
+					asyncLib.eachLimit(runtimeModules, 10, codeGen, err => {
+						if (err) return callback(err);
+						reportErrors();
+
+						/** @type {Map} */
+						const moduleArgumentsMap = new Map();
+						/** @type {Map} */
+						const moduleArgumentsById = new Map();
+
+						/** @type {ExecuteModuleResult["fileDependencies"]} */
+						const fileDependencies = new LazySet();
+						/** @type {ExecuteModuleResult["contextDependencies"]} */
+						const contextDependencies = new LazySet();
+						/** @type {ExecuteModuleResult["missingDependencies"]} */
+						const missingDependencies = new LazySet();
+						/** @type {ExecuteModuleResult["buildDependencies"]} */
+						const buildDependencies = new LazySet();
+
+						/** @type {ExecuteModuleResult["assets"]} */
+						const assets = new Map();
+
+						let cacheable = true;
+
+						/** @type {ExecuteModuleContext} */
+						const context = {
+							assets,
+							__webpack_require__: undefined,
+							chunk,
+							chunkGraph
+						};
+
+						// Prepare execution
+						asyncLib.eachLimit(
+							modules,
+							10,
+							(module, callback) => {
+								const codeGenerationResult = codeGenerationResults.get(
+									module,
+									runtime
+								);
+								/** @type {ExecuteModuleArgument} */
+								const moduleArgument = {
+									module,
+									codeGenerationResult,
+									preparedInfo: undefined,
+									moduleObject: undefined
+								};
+								moduleArgumentsMap.set(module, moduleArgument);
+								moduleArgumentsById.set(module.identifier(), moduleArgument);
+								module.addCacheDependencies(
+									fileDependencies,
+									contextDependencies,
+									missingDependencies,
+									buildDependencies
+								);
+								if (
+									/** @type {BuildInfo} */ (module.buildInfo).cacheable ===
+									false
+								) {
+									cacheable = false;
+								}
+								if (module.buildInfo && module.buildInfo.assets) {
+									const { assets: moduleAssets, assetsInfo } = module.buildInfo;
+									for (const assetName of Object.keys(moduleAssets)) {
+										assets.set(assetName, {
+											source: moduleAssets[assetName],
+											info: assetsInfo ? assetsInfo.get(assetName) : undefined
+										});
+									}
+								}
+								this.hooks.prepareModuleExecution.callAsync(
+									moduleArgument,
+									context,
+									callback
+								);
+							},
+							err => {
+								if (err) return callback(err);
+
+								/** @type {ExecuteModuleExports | undefined} */
+								let exports;
+								try {
+									const {
+										strictModuleErrorHandling,
+										strictModuleExceptionHandling
+									} = this.outputOptions;
+
+									/** @type {WebpackRequire} */
+									const __webpack_require__ = id => {
+										const cached = moduleCache[id];
+										if (cached !== undefined) {
+											if (cached.error) throw cached.error;
+											return cached.exports;
+										}
+										const moduleArgument = moduleArgumentsById.get(id);
+										return __webpack_require_module__(
+											/** @type {ExecuteModuleArgument} */
+											(moduleArgument),
+											id
+										);
+									};
+									const interceptModuleExecution = (__webpack_require__[
+										/** @type {"i"} */
+										(
+											RuntimeGlobals.interceptModuleExecution.replace(
+												`${RuntimeGlobals.require}.`,
+												""
+											)
+										)
+									] = /** @type {NonNullable} */ ([]));
+									const moduleCache = (__webpack_require__[
+										/** @type {"c"} */ (
+											RuntimeGlobals.moduleCache.replace(
+												`${RuntimeGlobals.require}.`,
+												""
+											)
+										)
+									] = /** @type {NonNullable} */ ({}));
+
+									context.__webpack_require__ = __webpack_require__;
+
+									/**
+									 * @param {ExecuteModuleArgument} moduleArgument the module argument
+									 * @param {string=} id id
+									 * @returns {ExecuteModuleExports} exports
+									 */
+									const __webpack_require_module__ = (moduleArgument, id) => {
+										/** @type {ExecuteOptions} */
+										const execOptions = {
+											id,
+											module: {
+												id,
+												exports: {},
+												loaded: false,
+												error: undefined
+											},
+											require: __webpack_require__
+										};
+										for (const handler of interceptModuleExecution) {
+											handler(execOptions);
+										}
+										const module = moduleArgument.module;
+										this.buildTimeExecutedModules.add(module);
+										const moduleObject = execOptions.module;
+										moduleArgument.moduleObject = moduleObject;
+										try {
+											if (id) moduleCache[id] = moduleObject;
+
+											tryRunOrWebpackError(
+												() =>
+													this.hooks.executeModule.call(
+														moduleArgument,
+														context
+													),
+												"Compilation.hooks.executeModule"
+											);
+											moduleObject.loaded = true;
+											return moduleObject.exports;
+										} catch (execErr) {
+											if (strictModuleExceptionHandling) {
+												if (id) delete moduleCache[id];
+											} else if (strictModuleErrorHandling) {
+												moduleObject.error =
+													/** @type {WebpackError} */
+													(execErr);
+											}
+											if (!(/** @type {WebpackError} */ (execErr).module)) {
+												/** @type {WebpackError} */
+												(execErr).module = module;
+											}
+											throw execErr;
+										}
+									};
+
+									for (const runtimeModule of chunkGraph.getChunkRuntimeModulesInOrder(
+										chunk
+									)) {
+										__webpack_require_module__(
+											/** @type {ExecuteModuleArgument} */
+											(moduleArgumentsMap.get(runtimeModule))
+										);
+									}
+									exports = __webpack_require__(module.identifier());
+								} catch (execErr) {
+									const { message, stack, module } =
+										/** @type {WebpackError} */
+										(execErr);
+									const err = new WebpackError(
+										`Execution of module code from module graph (${
+											/** @type {Module} */
+											(module).readableIdentifier(this.requestShortener)
+										}) failed: ${message}`,
+										{ cause: execErr }
+									);
+									err.stack = stack;
+									err.module = module;
+									return callback(err);
+								}
+
+								callback(null, {
+									exports,
+									assets,
+									cacheable,
+									fileDependencies,
+									contextDependencies,
+									missingDependencies,
+									buildDependencies
+								});
+							}
+						);
+					});
+				});
+			}
+		);
+	}
+
 	checkConstraints() {
+		const chunkGraph = this.chunkGraph;
+
 		/** @type {Set} */
 		const usedIds = new Set();
 
-		const modules = this.modules;
-		for (let indexModule = 0; indexModule < modules.length; indexModule++) {
-			const moduleId = modules[indexModule].id;
+		for (const module of this.modules) {
+			if (module.type === WEBPACK_MODULE_TYPE_RUNTIME) continue;
+			const moduleId = chunkGraph.getModuleId(module);
 			if (moduleId === null) continue;
 			if (usedIds.has(moduleId)) {
 				throw new Error(`checkConstraints: duplicate module id ${moduleId}`);
@@ -2514,13 +5544,22 @@ class Compilation extends Tapable {
 			usedIds.add(moduleId);
 		}
 
-		const chunks = this.chunks;
-		for (let indexChunk = 0; indexChunk < chunks.length; indexChunk++) {
-			const chunk = chunks[indexChunk];
-			if (chunks.indexOf(chunk) !== indexChunk) {
-				throw new Error(
-					`checkConstraints: duplicate chunk in compilation ${chunk.debugId}`
-				);
+		for (const chunk of this.chunks) {
+			for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
+				if (!this.modules.has(module)) {
+					throw new Error(
+						"checkConstraints: module in chunk but not in compilation " +
+							` ${chunk.debugId} ${module.debugId}`
+					);
+				}
+			}
+			for (const module of chunkGraph.getChunkEntryModulesIterable(chunk)) {
+				if (!this.modules.has(module)) {
+					throw new Error(
+						"checkConstraints: entry module in chunk but not in compilation " +
+							` ${chunk.debugId} ${module.debugId}`
+					);
+				}
 			}
 		}
 
@@ -2530,49 +5569,155 @@ class Compilation extends Tapable {
 	}
 }
 
-// TODO remove in webpack 5
-Compilation.prototype.applyPlugins = util.deprecate(
-	/**
-	 * @deprecated
-	 * @param {string} name Name
-	 * @param {any[]} args Other arguments
-	 * @returns {void}
-	 * @this {Compilation}
-	 */
-	function(name, ...args) {
-		this.hooks[
-			name.replace(/[- ]([a-z])/g, match => match[1].toUpperCase())
-		].call(...args);
-	},
-	"Compilation.applyPlugins is deprecated. Use new API on `.hooks` instead"
+/**
+ * @typedef {object} FactorizeModuleOptions
+ * @property {ModuleProfile=} currentProfile
+ * @property {ModuleFactory} factory
+ * @property {Dependency[]} dependencies
+ * @property {boolean=} factoryResult return full ModuleFactoryResult instead of only module
+ * @property {Module | null} originModule
+ * @property {Partial=} contextInfo
+ * @property {string=} context
+ */
+
+/**
+ * @param {FactorizeModuleOptions} options options object
+ * @param {ModuleCallback | ModuleFactoryResultCallback} callback callback
+ * @returns {void}
+ */
+
+// Workaround for typescript as it doesn't support function overloading in jsdoc within a class
+/* eslint-disable jsdoc/require-asterisk-prefix */
+Compilation.prototype.factorizeModule = /**
+	 @type {{
+	(options: FactorizeModuleOptions & { factoryResult?: false }, callback: ModuleCallback): void;
+	(options: FactorizeModuleOptions & { factoryResult: true }, callback: ModuleFactoryResultCallback): void;
+}} */ (
+	function (options, callback) {
+		this.factorizeQueue.add(options, /** @type {TODO} */ (callback));
+	}
 );
+/* eslint-enable jsdoc/require-asterisk-prefix */
+
+// Hide from typescript
+const compilationPrototype = Compilation.prototype;
+
+// TODO webpack 6 remove
+Object.defineProperty(compilationPrototype, "modifyHash", {
+	writable: false,
+	enumerable: false,
+	configurable: false,
+	value: () => {
+		throw new Error(
+			"Compilation.modifyHash was removed in favor of Compilation.hooks.fullHash"
+		);
+	}
+});
 
-// TODO remove in webpack 5
-Object.defineProperty(Compilation.prototype, "moduleTemplate", {
+// TODO webpack 6 remove
+Object.defineProperty(compilationPrototype, "cache", {
+	enumerable: false,
 	configurable: false,
 	get: util.deprecate(
 		/**
-		 * @deprecated
-		 * @this {Compilation}
-		 * @returns {TODO} module template
+		 * @this {Compilation} the compilation
+		 * @returns {Cache} the cache
 		 */
-		function() {
-			return this.moduleTemplates.javascript;
+		function () {
+			return this.compiler.cache;
 		},
-		"Compilation.moduleTemplate: Use Compilation.moduleTemplates.javascript instead"
+		"Compilation.cache was removed in favor of Compilation.getCache()",
+		"DEP_WEBPACK_COMPILATION_CACHE"
 	),
 	set: util.deprecate(
 		/**
-		 * @deprecated
-		 * @param {ModuleTemplate} value Template value
-		 * @this {Compilation}
-		 * @returns {void}
+		 * @param {EXPECTED_ANY} v value
 		 */
-		function(value) {
-			this.moduleTemplates.javascript = value;
-		},
-		"Compilation.moduleTemplate: Use Compilation.moduleTemplates.javascript instead."
+		v => {},
+		"Compilation.cache was removed in favor of Compilation.getCache()",
+		"DEP_WEBPACK_COMPILATION_CACHE"
 	)
 });
 
+/**
+ * Add additional assets to the compilation.
+ */
+Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL = -2000;
+
+/**
+ * Basic preprocessing of assets.
+ */
+Compilation.PROCESS_ASSETS_STAGE_PRE_PROCESS = -1000;
+
+/**
+ * Derive new assets from existing assets.
+ * Existing assets should not be treated as complete.
+ */
+Compilation.PROCESS_ASSETS_STAGE_DERIVED = -200;
+
+/**
+ * Add additional sections to existing assets, like a banner or initialization code.
+ */
+Compilation.PROCESS_ASSETS_STAGE_ADDITIONS = -100;
+
+/**
+ * Optimize existing assets in a general way.
+ */
+Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE = 100;
+
+/**
+ * Optimize the count of existing assets, e. g. by merging them.
+ * Only assets of the same type should be merged.
+ * For assets of different types see PROCESS_ASSETS_STAGE_OPTIMIZE_INLINE.
+ */
+Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_COUNT = 200;
+
+/**
+ * Optimize the compatibility of existing assets, e. g. add polyfills or vendor-prefixes.
+ */
+Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_COMPATIBILITY = 300;
+
+/**
+ * Optimize the size of existing assets, e. g. by minimizing or omitting whitespace.
+ */
+Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE = 400;
+
+/**
+ * Add development tooling to assets, e. g. by extracting a SourceMap.
+ */
+Compilation.PROCESS_ASSETS_STAGE_DEV_TOOLING = 500;
+
+/**
+ * Optimize the count of existing assets, e. g. by inlining assets of into other assets.
+ * Only assets of different types should be inlined.
+ * For assets of the same type see PROCESS_ASSETS_STAGE_OPTIMIZE_COUNT.
+ */
+Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_INLINE = 700;
+
+/**
+ * Summarize the list of existing assets
+ * e. g. creating an assets manifest of Service Workers.
+ */
+Compilation.PROCESS_ASSETS_STAGE_SUMMARIZE = 1000;
+
+/**
+ * Optimize the hashes of the assets, e. g. by generating real hashes of the asset content.
+ */
+Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_HASH = 2500;
+
+/**
+ * Optimize the transfer of existing assets, e. g. by preparing a compressed (gzip) file as separate asset.
+ */
+Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_TRANSFER = 3000;
+
+/**
+ * Analyse existing assets.
+ */
+Compilation.PROCESS_ASSETS_STAGE_ANALYSE = 4000;
+
+/**
+ * Creating assets for reporting purposes.
+ */
+Compilation.PROCESS_ASSETS_STAGE_REPORT = 5000;
+
 module.exports = Compilation;
diff --git a/lib/Compiler.js b/lib/Compiler.js
index decde5945cc..b09e240d687 100644
--- a/lib/Compiler.js
+++ b/lib/Compiler.js
@@ -2,235 +2,519 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const parseJson = require("json-parse-better-errors");
+const parseJson = require("json-parse-even-better-errors");
 const asyncLib = require("neo-async");
-const path = require("path");
-const { Source } = require("webpack-sources");
-const util = require("util");
 const {
-	Tapable,
 	SyncHook,
 	SyncBailHook,
 	AsyncParallelHook,
 	AsyncSeriesHook
 } = require("tapable");
-
+const { SizeOnlySource } = require("webpack-sources");
+const webpack = require(".");
+const Cache = require("./Cache");
+const CacheFacade = require("./CacheFacade");
+const ChunkGraph = require("./ChunkGraph");
 const Compilation = require("./Compilation");
-const Stats = require("./Stats");
-const Watching = require("./Watching");
-const NormalModuleFactory = require("./NormalModuleFactory");
+const ConcurrentCompilationError = require("./ConcurrentCompilationError");
 const ContextModuleFactory = require("./ContextModuleFactory");
-const ResolverFactory = require("./ResolverFactory");
-
+const ModuleGraph = require("./ModuleGraph");
+const NormalModuleFactory = require("./NormalModuleFactory");
 const RequestShortener = require("./RequestShortener");
+const ResolverFactory = require("./ResolverFactory");
+const Stats = require("./Stats");
+const Watching = require("./Watching");
+const WebpackError = require("./WebpackError");
+const { Logger } = require("./logging/Logger");
+const { join, dirname, mkdirp } = require("./util/fs");
 const { makePathsRelative } = require("./util/identifier");
-const ConcurrentCompilationError = require("./ConcurrentCompilationError");
-
-/** @typedef {import("../declarations/WebpackOptions").Entry} Entry */
-/** @typedef {import("../declarations/WebpackOptions").WebpackOptions} WebpackOptions */
+const { isSourceEqual } = require("./util/source");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../declarations/WebpackOptions").EntryNormalized} Entry */
+/** @typedef {import("../declarations/WebpackOptions").OutputNormalized} OutputOptions */
+/** @typedef {import("../declarations/WebpackOptions").WatchOptions} WatchOptions */
+/** @typedef {import("../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
+/** @typedef {import("../declarations/WebpackOptions").WebpackPluginInstance} WebpackPluginInstance */
+/** @typedef {import("./Chunk")} Chunk */
+/** @typedef {import("./ChunkGraph").ModuleId} ModuleId */
+/** @typedef {import("./Dependency")} Dependency */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./Module").BuildInfo} BuildInfo */
+/** @typedef {import("./config/target").PlatformTargetProperties} PlatformTargetProperties */
+/** @typedef {import("./logging/createConsoleLogger").LoggingFunction} LoggingFunction */
+/** @typedef {import("./util/fs").IStats} IStats */
+/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
+/** @typedef {import("./util/fs").IntermediateFileSystem} IntermediateFileSystem */
+/** @typedef {import("./util/fs").OutputFileSystem} OutputFileSystem */
+/** @typedef {import("./util/fs").TimeInfoEntries} TimeInfoEntries */
+/** @typedef {import("./util/fs").WatchFileSystem} WatchFileSystem */
 
 /**
- * @typedef {Object} CompilationParams
+ * @typedef {object} CompilationParams
  * @property {NormalModuleFactory} normalModuleFactory
  * @property {ContextModuleFactory} contextModuleFactory
- * @property {Set} compilationDependencies
  */
 
-class Compiler extends Tapable {
-	constructor(context) {
-		super();
-		this.hooks = {
-			/** @type {SyncBailHook} */
+/**
+ * @template T
+ * @callback RunCallback
+ * @param {Error | null} err
+ * @param {T=} result
+ */
+
+/**
+ * @template T
+ * @callback Callback
+ * @param {(Error | null)=} err
+ * @param {T=} result
+ */
+
+/**
+ * @callback RunAsChildCallback
+ * @param {Error | null} err
+ * @param {Chunk[]=} entries
+ * @param {Compilation=} compilation
+ */
+
+/**
+ * @typedef {object} AssetEmittedInfo
+ * @property {Buffer} content
+ * @property {Source} source
+ * @property {Compilation} compilation
+ * @property {string} outputPath
+ * @property {string} targetPath
+ */
+
+/** @typedef {{ sizeOnlySource: SizeOnlySource | undefined, writtenTo: Map }} CacheEntry */
+/** @typedef {{ path: string, source: Source, size: number | undefined, waiting: ({ cacheEntry: CacheEntry, file: string }[] | undefined) }} SimilarEntry */
+
+/** @typedef {WeakMap} WeakReferences */
+/** @typedef {import("./util/WeakTupleMap")} MemCache */
+/** @typedef {{ buildInfo: BuildInfo, references: WeakReferences | undefined, memCache: MemCache }} ModuleMemCachesItem */
+
+/**
+ * @param {string[]} array an array
+ * @returns {boolean} true, if the array is sorted
+ */
+const isSorted = array => {
+	for (let i = 1; i < array.length; i++) {
+		if (array[i - 1] > array[i]) return false;
+	}
+	return true;
+};
+
+/**
+ * @template {object} T
+ * @param {T} obj an object
+ * @param {(keyof T)[]} keys the keys of the object
+ * @returns {T} the object with properties sorted by property name
+ */
+const sortObject = (obj, keys) => {
+	const o = /** @type {T} */ ({});
+	for (const k of keys.sort()) {
+		o[k] = obj[k];
+	}
+	return o;
+};
+
+/**
+ * @param {string} filename filename
+ * @param {string | string[] | undefined} hashes list of hashes
+ * @returns {boolean} true, if the filename contains any hash
+ */
+const includesHash = (filename, hashes) => {
+	if (!hashes) return false;
+	if (Array.isArray(hashes)) {
+		return hashes.some(hash => filename.includes(hash));
+	}
+	return filename.includes(hashes);
+};
+
+class Compiler {
+	/**
+	 * @param {string} context the compilation path
+	 * @param {WebpackOptions} options options
+	 */
+	constructor(context, options = /** @type {WebpackOptions} */ ({})) {
+		this.hooks = Object.freeze({
+			/** @type {SyncHook<[]>} */
+			initialize: new SyncHook([]),
+
+			/** @type {SyncBailHook<[Compilation], boolean | void>} */
 			shouldEmit: new SyncBailHook(["compilation"]),
-			/** @type {AsyncSeriesHook} */
+			/** @type {AsyncSeriesHook<[Stats]>} */
 			done: new AsyncSeriesHook(["stats"]),
-			/** @type {AsyncSeriesHook<>} */
+			/** @type {SyncHook<[Stats]>} */
+			afterDone: new SyncHook(["stats"]),
+			/** @type {AsyncSeriesHook<[]>} */
 			additionalPass: new AsyncSeriesHook([]),
-			/** @type {AsyncSeriesHook} */
+			/** @type {AsyncSeriesHook<[Compiler]>} */
 			beforeRun: new AsyncSeriesHook(["compiler"]),
-			/** @type {AsyncSeriesHook} */
+			/** @type {AsyncSeriesHook<[Compiler]>} */
 			run: new AsyncSeriesHook(["compiler"]),
-			/** @type {AsyncSeriesHook} */
+			/** @type {AsyncSeriesHook<[Compilation]>} */
 			emit: new AsyncSeriesHook(["compilation"]),
-			/** @type {AsyncSeriesHook} */
+			/** @type {AsyncSeriesHook<[string, AssetEmittedInfo]>} */
+			assetEmitted: new AsyncSeriesHook(["file", "info"]),
+			/** @type {AsyncSeriesHook<[Compilation]>} */
 			afterEmit: new AsyncSeriesHook(["compilation"]),
 
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Compilation, CompilationParams]>} */
 			thisCompilation: new SyncHook(["compilation", "params"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Compilation, CompilationParams]>} */
 			compilation: new SyncHook(["compilation", "params"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[NormalModuleFactory]>} */
 			normalModuleFactory: new SyncHook(["normalModuleFactory"]),
-			/** @type {SyncHook}  */
-			contextModuleFactory: new SyncHook(["contextModulefactory"]),
+			/** @type {SyncHook<[ContextModuleFactory]>}  */
+			contextModuleFactory: new SyncHook(["contextModuleFactory"]),
 
-			/** @type {AsyncSeriesHook} */
+			/** @type {AsyncSeriesHook<[CompilationParams]>} */
 			beforeCompile: new AsyncSeriesHook(["params"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[CompilationParams]>} */
 			compile: new SyncHook(["params"]),
-			/** @type {AsyncParallelHook} */
+			/** @type {AsyncParallelHook<[Compilation]>} */
 			make: new AsyncParallelHook(["compilation"]),
-			/** @type {AsyncSeriesHook} */
+			/** @type {AsyncParallelHook<[Compilation]>} */
+			finishMake: new AsyncSeriesHook(["compilation"]),
+			/** @type {AsyncSeriesHook<[Compilation]>} */
 			afterCompile: new AsyncSeriesHook(["compilation"]),
 
-			/** @type {AsyncSeriesHook} */
+			/** @type {AsyncSeriesHook<[]>} */
+			readRecords: new AsyncSeriesHook([]),
+			/** @type {AsyncSeriesHook<[]>} */
+			emitRecords: new AsyncSeriesHook([]),
+
+			/** @type {AsyncSeriesHook<[Compiler]>} */
 			watchRun: new AsyncSeriesHook(["compiler"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Error]>} */
 			failed: new SyncHook(["error"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[string | null, number]>} */
 			invalid: new SyncHook(["filename", "changeTime"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[]>} */
 			watchClose: new SyncHook([]),
+			/** @type {AsyncSeriesHook<[]>} */
+			shutdown: new AsyncSeriesHook([]),
+
+			/** @type {SyncBailHook<[string, string, EXPECTED_ANY[] | undefined], true | void>} */
+			infrastructureLog: new SyncBailHook(["origin", "type", "args"]),
 
 			// TODO the following hooks are weirdly located here
 			// TODO move them for webpack 5
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[]>} */
 			environment: new SyncHook([]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[]>} */
 			afterEnvironment: new SyncHook([]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Compiler]>} */
 			afterPlugins: new SyncHook(["compiler"]),
-			/** @type {SyncHook} */
+			/** @type {SyncHook<[Compiler]>} */
 			afterResolvers: new SyncHook(["compiler"]),
-			/** @type {SyncBailHook} */
+			/** @type {SyncBailHook<[string, Entry], boolean | void>} */
 			entryOption: new SyncBailHook(["context", "entry"])
-		};
-
-		this._pluginCompat.tap("Compiler", options => {
-			switch (options.name) {
-				case "additional-pass":
-				case "before-run":
-				case "run":
-				case "emit":
-				case "after-emit":
-				case "before-compile":
-				case "make":
-				case "after-compile":
-				case "watch-run":
-					options.async = true;
-					break;
-			}
 		});
 
-		/** @type {string=} */
+		this.webpack = webpack;
+
+		/** @type {string | undefined} */
 		this.name = undefined;
-		/** @type {Compilation=} */
+		/** @type {Compilation | undefined} */
 		this.parentCompilation = undefined;
+		/** @type {Compiler} */
+		this.root = this;
 		/** @type {string} */
 		this.outputPath = "";
+		/** @type {Watching | undefined} */
+		this.watching = undefined;
 
+		/** @type {OutputFileSystem | null} */
 		this.outputFileSystem = null;
+		/** @type {IntermediateFileSystem | null} */
+		this.intermediateFileSystem = null;
+		/** @type {InputFileSystem | null} */
 		this.inputFileSystem = null;
+		/** @type {WatchFileSystem | null} */
+		this.watchFileSystem = null;
 
 		/** @type {string|null} */
 		this.recordsInputPath = null;
 		/** @type {string|null} */
 		this.recordsOutputPath = null;
+		/** @type {Record} */
 		this.records = {};
-		this.removedFiles = new Set();
-		/** @type {Map} */
-		this.fileTimestamps = new Map();
-		/** @type {Map} */
-		this.contextTimestamps = new Map();
+		/** @type {Set} */
+		this.managedPaths = new Set();
+		/** @type {Set} */
+		this.unmanagedPaths = new Set();
+		/** @type {Set} */
+		this.immutablePaths = new Set();
+
+		/** @type {ReadonlySet | undefined} */
+		this.modifiedFiles = undefined;
+		/** @type {ReadonlySet | undefined} */
+		this.removedFiles = undefined;
+		/** @type {TimeInfoEntries | undefined} */
+		this.fileTimestamps = undefined;
+		/** @type {TimeInfoEntries | undefined} */
+		this.contextTimestamps = undefined;
+		/** @type {number | undefined} */
+		this.fsStartTime = undefined;
+
 		/** @type {ResolverFactory} */
 		this.resolverFactory = new ResolverFactory();
 
-		// TODO remove in webpack 5
-		this.resolvers = {
-			normal: {
-				plugins: util.deprecate((hook, fn) => {
-					this.resolverFactory.plugin("resolver normal", resolver => {
-						resolver.plugin(hook, fn);
-					});
-				}, "webpack: Using compiler.resolvers.normal is deprecated.\n" + 'Use compiler.resolverFactory.plugin("resolver normal", resolver => {\n  resolver.plugin(/* … */);\n}); instead.'),
-				apply: util.deprecate((...args) => {
-					this.resolverFactory.plugin("resolver normal", resolver => {
-						resolver.apply(...args);
-					});
-				}, "webpack: Using compiler.resolvers.normal is deprecated.\n" + 'Use compiler.resolverFactory.plugin("resolver normal", resolver => {\n  resolver.apply(/* … */);\n}); instead.')
-			},
-			loader: {
-				plugins: util.deprecate((hook, fn) => {
-					this.resolverFactory.plugin("resolver loader", resolver => {
-						resolver.plugin(hook, fn);
-					});
-				}, "webpack: Using compiler.resolvers.loader is deprecated.\n" + 'Use compiler.resolverFactory.plugin("resolver loader", resolver => {\n  resolver.plugin(/* … */);\n}); instead.'),
-				apply: util.deprecate((...args) => {
-					this.resolverFactory.plugin("resolver loader", resolver => {
-						resolver.apply(...args);
-					});
-				}, "webpack: Using compiler.resolvers.loader is deprecated.\n" + 'Use compiler.resolverFactory.plugin("resolver loader", resolver => {\n  resolver.apply(/* … */);\n}); instead.')
-			},
-			context: {
-				plugins: util.deprecate((hook, fn) => {
-					this.resolverFactory.plugin("resolver context", resolver => {
-						resolver.plugin(hook, fn);
-					});
-				}, "webpack: Using compiler.resolvers.context is deprecated.\n" + 'Use compiler.resolverFactory.plugin("resolver context", resolver => {\n  resolver.plugin(/* … */);\n}); instead.'),
-				apply: util.deprecate((...args) => {
-					this.resolverFactory.plugin("resolver context", resolver => {
-						resolver.apply(...args);
-					});
-				}, "webpack: Using compiler.resolvers.context is deprecated.\n" + 'Use compiler.resolverFactory.plugin("resolver context", resolver => {\n  resolver.apply(/* … */);\n}); instead.')
-			}
+		/** @type {LoggingFunction | undefined} */
+		this.infrastructureLogger = undefined;
+
+		/** @type {Readonly} */
+		this.platform = {
+			web: null,
+			browser: null,
+			webworker: null,
+			node: null,
+			nwjs: null,
+			electron: null
 		};
 
-		/** @type {WebpackOptions} */
-		this.options = /** @type {WebpackOptions} */ ({});
+		this.options = options;
 
 		this.context = context;
 
-		this.requestShortener = new RequestShortener(context);
+		this.requestShortener = new RequestShortener(context, this.root);
+
+		this.cache = new Cache();
+
+		/** @type {Map | undefined} */
+		this.moduleMemCaches = undefined;
+
+		this.compilerPath = "";
 
 		/** @type {boolean} */
 		this.running = false;
 
+		/** @type {boolean} */
+		this.idle = false;
+
 		/** @type {boolean} */
 		this.watchMode = false;
 
-		/** @private @type {WeakMap }>} */
+		this._backCompat = this.options.experiments.backCompat !== false;
+
+		/** @type {Compilation | undefined} */
+		this._lastCompilation = undefined;
+		/** @type {NormalModuleFactory | undefined} */
+		this._lastNormalModuleFactory = undefined;
+
+		/**
+		 * @private
+		 * @type {WeakMap}
+		 */
 		this._assetEmittingSourceCache = new WeakMap();
-		/** @private @type {Map} */
+		/**
+		 * @private
+		 * @type {Map}
+		 */
 		this._assetEmittingWrittenFiles = new Map();
+		/**
+		 * @private
+		 * @type {Set}
+		 */
+		this._assetEmittingPreviousFiles = new Set();
+	}
+
+	/**
+	 * @param {string} name cache name
+	 * @returns {CacheFacade} the cache facade instance
+	 */
+	getCache(name) {
+		return new CacheFacade(
+			this.cache,
+			`${this.compilerPath}${name}`,
+			this.options.output.hashFunction
+		);
 	}
 
+	/**
+	 * @param {string | (() => string)} name name of the logger, or function called once to get the logger name
+	 * @returns {Logger} a logger with that name
+	 */
+	getInfrastructureLogger(name) {
+		if (!name) {
+			throw new TypeError(
+				"Compiler.getInfrastructureLogger(name) called without a name"
+			);
+		}
+		return new Logger(
+			(type, args) => {
+				if (typeof name === "function") {
+					name = name();
+					if (!name) {
+						throw new TypeError(
+							"Compiler.getInfrastructureLogger(name) called with a function not returning a name"
+						);
+					}
+				}
+				if (
+					this.hooks.infrastructureLog.call(name, type, args) === undefined &&
+					this.infrastructureLogger !== undefined
+				) {
+					this.infrastructureLogger(name, type, args);
+				}
+			},
+			childName => {
+				if (typeof name === "function") {
+					if (typeof childName === "function") {
+						return this.getInfrastructureLogger(() => {
+							if (typeof name === "function") {
+								name = name();
+								if (!name) {
+									throw new TypeError(
+										"Compiler.getInfrastructureLogger(name) called with a function not returning a name"
+									);
+								}
+							}
+							if (typeof childName === "function") {
+								childName = childName();
+								if (!childName) {
+									throw new TypeError(
+										"Logger.getChildLogger(name) called with a function not returning a name"
+									);
+								}
+							}
+							return `${name}/${childName}`;
+						});
+					}
+					return this.getInfrastructureLogger(() => {
+						if (typeof name === "function") {
+							name = name();
+							if (!name) {
+								throw new TypeError(
+									"Compiler.getInfrastructureLogger(name) called with a function not returning a name"
+								);
+							}
+						}
+						return `${name}/${childName}`;
+					});
+				}
+				if (typeof childName === "function") {
+					return this.getInfrastructureLogger(() => {
+						if (typeof childName === "function") {
+							childName = childName();
+							if (!childName) {
+								throw new TypeError(
+									"Logger.getChildLogger(name) called with a function not returning a name"
+								);
+							}
+						}
+						return `${name}/${childName}`;
+					});
+				}
+				return this.getInfrastructureLogger(`${name}/${childName}`);
+			}
+		);
+	}
+
+	// TODO webpack 6: solve this in a better way
+	// e.g. move compilation specific info from Modules into ModuleGraph
+	_cleanupLastCompilation() {
+		if (this._lastCompilation !== undefined) {
+			for (const childCompilation of this._lastCompilation.children) {
+				for (const module of childCompilation.modules) {
+					ChunkGraph.clearChunkGraphForModule(module);
+					ModuleGraph.clearModuleGraphForModule(module);
+					module.cleanupForCache();
+				}
+				for (const chunk of childCompilation.chunks) {
+					ChunkGraph.clearChunkGraphForChunk(chunk);
+				}
+			}
+
+			for (const module of this._lastCompilation.modules) {
+				ChunkGraph.clearChunkGraphForModule(module);
+				ModuleGraph.clearModuleGraphForModule(module);
+				module.cleanupForCache();
+			}
+			for (const chunk of this._lastCompilation.chunks) {
+				ChunkGraph.clearChunkGraphForChunk(chunk);
+			}
+			this._lastCompilation = undefined;
+		}
+	}
+
+	// TODO webpack 6: solve this in a better way
+	_cleanupLastNormalModuleFactory() {
+		if (this._lastNormalModuleFactory !== undefined) {
+			this._lastNormalModuleFactory.cleanupForCache();
+			this._lastNormalModuleFactory = undefined;
+		}
+	}
+
+	/**
+	 * @param {WatchOptions} watchOptions the watcher's options
+	 * @param {RunCallback} handler signals when the call finishes
+	 * @returns {Watching} a compiler watcher
+	 */
 	watch(watchOptions, handler) {
-		if (this.running) return handler(new ConcurrentCompilationError());
+		if (this.running) {
+			return handler(new ConcurrentCompilationError());
+		}
 
 		this.running = true;
 		this.watchMode = true;
-		this.fileTimestamps = new Map();
-		this.contextTimestamps = new Map();
-		this.removedFiles = new Set();
-		return new Watching(this, watchOptions, handler);
+		this.watching = new Watching(this, watchOptions, handler);
+		return this.watching;
 	}
 
+	/**
+	 * @param {RunCallback} callback signals when the call finishes
+	 * @returns {void}
+	 */
 	run(callback) {
-		if (this.running) return callback(new ConcurrentCompilationError());
+		if (this.running) {
+			return callback(new ConcurrentCompilationError());
+		}
+
+		/** @type {Logger | undefined} */
+		let logger;
 
+		/**
+		 * @param {Error | null} err error
+		 * @param {Stats=} stats stats
+		 */
 		const finalCallback = (err, stats) => {
+			if (logger) logger.time("beginIdle");
+			this.idle = true;
+			this.cache.beginIdle();
+			this.idle = true;
+			if (logger) logger.timeEnd("beginIdle");
 			this.running = false;
-
 			if (err) {
 				this.hooks.failed.call(err);
 			}
-
-			if (callback !== undefined) return callback(err, stats);
+			if (callback !== undefined) callback(err, stats);
+			this.hooks.afterDone.call(/** @type {Stats} */ (stats));
 		};
 
 		const startTime = Date.now();
 
 		this.running = true;
 
-		const onCompiled = (err, compilation) => {
+		/**
+		 * @param {Error | null} err error
+		 * @param {Compilation=} _compilation compilation
+		 * @returns {void}
+		 */
+		const onCompiled = (err, _compilation) => {
 			if (err) return finalCallback(err);
 
+			const compilation = /** @type {Compilation} */ (_compilation);
+
 			if (this.hooks.shouldEmit.call(compilation) === false) {
+				compilation.startTime = startTime;
+				compilation.endTime = Date.now();
 				const stats = new Stats(compilation);
-				stats.startTime = startTime;
-				stats.endTime = Date.now();
 				this.hooks.done.callAsync(stats, err => {
 					if (err) return finalCallback(err);
 					return finalCallback(null, stats);
@@ -238,72 +522,143 @@ class Compiler extends Tapable {
 				return;
 			}
 
-			this.emitAssets(compilation, err => {
-				if (err) return finalCallback(err);
+			process.nextTick(() => {
+				logger = compilation.getLogger("webpack.Compiler");
+				logger.time("emitAssets");
+				this.emitAssets(compilation, err => {
+					/** @type {Logger} */
+					(logger).timeEnd("emitAssets");
+					if (err) return finalCallback(err);
+
+					if (compilation.hooks.needAdditionalPass.call()) {
+						compilation.needAdditionalPass = true;
+
+						compilation.startTime = startTime;
+						compilation.endTime = Date.now();
+						/** @type {Logger} */
+						(logger).time("done hook");
+						const stats = new Stats(compilation);
+						this.hooks.done.callAsync(stats, err => {
+							/** @type {Logger} */
+							(logger).timeEnd("done hook");
+							if (err) return finalCallback(err);
 
-				if (compilation.hooks.needAdditionalPass.call()) {
-					compilation.needAdditionalPass = true;
+							this.hooks.additionalPass.callAsync(err => {
+								if (err) return finalCallback(err);
+								this.compile(onCompiled);
+							});
+						});
+						return;
+					}
 
-					const stats = new Stats(compilation);
-					stats.startTime = startTime;
-					stats.endTime = Date.now();
-					this.hooks.done.callAsync(stats, err => {
+					/** @type {Logger} */
+					(logger).time("emitRecords");
+					this.emitRecords(err => {
+						/** @type {Logger} */
+						(logger).timeEnd("emitRecords");
 						if (err) return finalCallback(err);
 
-						this.hooks.additionalPass.callAsync(err => {
+						compilation.startTime = startTime;
+						compilation.endTime = Date.now();
+						/** @type {Logger} */
+						(logger).time("done hook");
+						const stats = new Stats(compilation);
+						this.hooks.done.callAsync(stats, err => {
+							/** @type {Logger} */
+							(logger).timeEnd("done hook");
 							if (err) return finalCallback(err);
-							this.compile(onCompiled);
+							this.cache.storeBuildDependencies(
+								compilation.buildDependencies,
+								err => {
+									if (err) return finalCallback(err);
+									return finalCallback(null, stats);
+								}
+							);
 						});
 					});
-					return;
-				}
+				});
+			});
+		};
+
+		const run = () => {
+			this.hooks.beforeRun.callAsync(this, err => {
+				if (err) return finalCallback(err);
 
-				this.emitRecords(err => {
+				this.hooks.run.callAsync(this, err => {
 					if (err) return finalCallback(err);
 
-					const stats = new Stats(compilation);
-					stats.startTime = startTime;
-					stats.endTime = Date.now();
-					this.hooks.done.callAsync(stats, err => {
+					this.readRecords(err => {
 						if (err) return finalCallback(err);
-						return finalCallback(null, stats);
+
+						this.compile(onCompiled);
 					});
 				});
 			});
 		};
 
-		this.hooks.beforeRun.callAsync(this, err => {
-			if (err) return finalCallback(err);
-
-			this.hooks.run.callAsync(this, err => {
+		if (this.idle) {
+			this.cache.endIdle(err => {
 				if (err) return finalCallback(err);
 
-				this.readRecords(err => {
-					if (err) return finalCallback(err);
-
-					this.compile(onCompiled);
-				});
+				this.idle = false;
+				run();
 			});
-		});
+		} else {
+			run();
+		}
 	}
 
+	/**
+	 * @param {RunAsChildCallback} callback signals when the call finishes
+	 * @returns {void}
+	 */
 	runAsChild(callback) {
-		this.compile((err, compilation) => {
-			if (err) return callback(err);
+		const startTime = Date.now();
+
+		/**
+		 * @param {Error | null} err error
+		 * @param {Chunk[]=} entries entries
+		 * @param {Compilation=} compilation compilation
+		 */
+		const finalCallback = (err, entries, compilation) => {
+			try {
+				callback(err, entries, compilation);
+			} catch (runAsChildErr) {
+				const err = new WebpackError(
+					`compiler.runAsChild callback error: ${runAsChildErr}`,
+					{ cause: runAsChildErr }
+				);
+				err.details = /** @type {Error} */ (runAsChildErr).stack;
+				/** @type {Compilation} */
+				(this.parentCompilation).errors.push(err);
+			}
+		};
+
+		this.compile((err, _compilation) => {
+			if (err) return finalCallback(err);
+
+			const compilation = /** @type {Compilation} */ (_compilation);
+			const parentCompilation = /** @type {Compilation} */ (
+				this.parentCompilation
+			);
 
-			this.parentCompilation.children.push(compilation);
-			for (const name of Object.keys(compilation.assets)) {
-				this.parentCompilation.assets[name] = compilation.assets[name];
+			parentCompilation.children.push(compilation);
+
+			for (const { name, source, info } of compilation.getAssets()) {
+				parentCompilation.emitAsset(name, source, info);
 			}
 
-			const entries = Array.from(
-				compilation.entrypoints.values(),
-				ep => ep.chunks
-			).reduce((array, chunks) => {
-				return array.concat(chunks);
-			}, []);
+			/** @type {Chunk[]} */
+			const entries = [];
+
+			for (const ep of compilation.entrypoints.values()) {
+				entries.push(...ep.chunks);
+			}
 
-			return callback(null, entries, compilation);
+			compilation.startTime = startTime;
+			compilation.endTime = Date.now();
+
+			return finalCallback(null, entries, compilation);
 		});
 	}
 
@@ -313,78 +668,154 @@ class Compiler extends Tapable {
 		}
 	}
 
+	/**
+	 * @param {Compilation} compilation the compilation
+	 * @param {Callback} callback signals when the assets are emitted
+	 * @returns {void}
+	 */
 	emitAssets(compilation, callback) {
+		/** @type {string} */
 		let outputPath;
+
+		/**
+		 * @param {Error=} err error
+		 * @returns {void}
+		 */
 		const emitFiles = err => {
 			if (err) return callback(err);
 
+			const assets = compilation.getAssets();
+			compilation.assets = { ...compilation.assets };
+			/** @type {Map} */
+			const caseInsensitiveMap = new Map();
+			/** @type {Set} */
+			const allTargetPaths = new Set();
 			asyncLib.forEachLimit(
-				compilation.assets,
+				assets,
 				15,
-				(source, file, callback) => {
+				({ name: file, source, info }, callback) => {
 					let targetFile = file;
+					let immutable = info.immutable;
 					const queryStringIdx = targetFile.indexOf("?");
 					if (queryStringIdx >= 0) {
-						targetFile = targetFile.substr(0, queryStringIdx);
+						targetFile = targetFile.slice(0, queryStringIdx);
+						// We may remove the hash, which is in the query string
+						// So we recheck if the file is immutable
+						// This doesn't cover all cases, but immutable is only a performance optimization anyway
+						immutable =
+							immutable &&
+							(includesHash(targetFile, info.contenthash) ||
+								includesHash(targetFile, info.chunkhash) ||
+								includesHash(targetFile, info.modulehash) ||
+								includesHash(targetFile, info.fullhash));
 					}
 
+					/**
+					 * @param {Error=} err error
+					 * @returns {void}
+					 */
 					const writeOut = err => {
 						if (err) return callback(err);
-						const targetPath = this.outputFileSystem.join(
+						const targetPath = join(
+							/** @type {OutputFileSystem} */
+							(this.outputFileSystem),
 							outputPath,
 							targetFile
 						);
-						// TODO webpack 5 remove futureEmitAssets option and make it on by default
-						if (this.options.output.futureEmitAssets) {
-							// check if the target file has already been written by this Compiler
-							const targetFileGeneration = this._assetEmittingWrittenFiles.get(
-								targetPath
-							);
-
-							// create an cache entry for this Source if not already existing
-							let cacheEntry = this._assetEmittingSourceCache.get(source);
-							if (cacheEntry === undefined) {
-								cacheEntry = {
-									sizeOnlySource: undefined,
-									writtenTo: new Map()
-								};
-								this._assetEmittingSourceCache.set(source, cacheEntry);
-							}
+						allTargetPaths.add(targetPath);
+
+						// check if the target file has already been written by this Compiler
+						const targetFileGeneration =
+							this._assetEmittingWrittenFiles.get(targetPath);
+
+						// create an cache entry for this Source if not already existing
+						let cacheEntry = this._assetEmittingSourceCache.get(source);
+						if (cacheEntry === undefined) {
+							cacheEntry = {
+								sizeOnlySource: undefined,
+								writtenTo: new Map()
+							};
+							this._assetEmittingSourceCache.set(source, cacheEntry);
+						}
 
-							// if the target file has already been written
-							if (targetFileGeneration !== undefined) {
-								// check if the Source has been written to this target file
-								const writtenGeneration = cacheEntry.writtenTo.get(targetPath);
-								if (writtenGeneration === targetFileGeneration) {
-									// if yes, we skip writing the file
-									// as it's already there
-									// (we assume one doesn't remove files while the Compiler is running)
-									return callback();
+						/** @type {SimilarEntry | undefined} */
+						let similarEntry;
+
+						const checkSimilarFile = () => {
+							const caseInsensitiveTargetPath = targetPath.toLowerCase();
+							similarEntry = caseInsensitiveMap.get(caseInsensitiveTargetPath);
+							if (similarEntry !== undefined) {
+								const { path: other, source: otherSource } = similarEntry;
+								if (isSourceEqual(otherSource, source)) {
+									// Size may or may not be available at this point.
+									// If it's not available add to "waiting" list and it will be updated once available
+									if (similarEntry.size !== undefined) {
+										updateWithReplacementSource(similarEntry.size);
+									} else {
+										if (!similarEntry.waiting) similarEntry.waiting = [];
+										similarEntry.waiting.push({ file, cacheEntry });
+									}
+									alreadyWritten();
+								} else {
+									const err =
+										new WebpackError(`Prevent writing to file that only differs in casing or query string from already written file.
+This will lead to a race-condition and corrupted files on case-insensitive file systems.
+${targetPath}
+${other}`);
+									err.file = file;
+									callback(err);
 								}
+								return true;
 							}
-
-							// get the binary (Buffer) content from the Source
-							/** @type {Buffer} */
-							let content;
+							caseInsensitiveMap.set(
+								caseInsensitiveTargetPath,
+								(similarEntry = /** @type {SimilarEntry} */ ({
+									path: targetPath,
+									source,
+									size: undefined,
+									waiting: undefined
+								}))
+							);
+							return false;
+						};
+
+						/**
+						 * get the binary (Buffer) content from the Source
+						 * @returns {Buffer} content for the source
+						 */
+						const getContent = () => {
 							if (typeof source.buffer === "function") {
-								content = source.buffer();
-							} else {
-								const bufferOrString = source.source();
-								if (Buffer.isBuffer(bufferOrString)) {
-									content = bufferOrString;
-								} else {
-									content = Buffer.from(bufferOrString, "utf8");
-								}
+								return source.buffer();
 							}
+							const bufferOrString = source.source();
+							if (Buffer.isBuffer(bufferOrString)) {
+								return bufferOrString;
+							}
+							return Buffer.from(bufferOrString, "utf8");
+						};
 
-							// Create a replacement resource which only allows to ask for size
-							// This allows to GC all memory allocated by the Source
-							// (expect when the Source is stored in any other cache)
-							cacheEntry.sizeOnlySource = new SizeOnlySource(content.length);
-							compilation.assets[file] = cacheEntry.sizeOnlySource;
-
-							// Write the file to output file system
-							this.outputFileSystem.writeFile(targetPath, content, err => {
+						const alreadyWritten = () => {
+							// cache the information that the Source has been already been written to that location
+							if (targetFileGeneration === undefined) {
+								const newGeneration = 1;
+								this._assetEmittingWrittenFiles.set(targetPath, newGeneration);
+								/** @type {CacheEntry} */
+								(cacheEntry).writtenTo.set(targetPath, newGeneration);
+							} else {
+								/** @type {CacheEntry} */
+								(cacheEntry).writtenTo.set(targetPath, targetFileGeneration);
+							}
+							callback();
+						};
+
+						/**
+						 * Write the file to output file system
+						 * @param {Buffer} content content to be written
+						 * @returns {void}
+						 */
+						const doWrite = content => {
+							/** @type {OutputFileSystem} */
+							(this.outputFileSystem).writeFile(targetPath, content, err => {
 								if (err) return callback(err);
 
 								// information marker that the asset has been emitted
@@ -395,39 +826,179 @@ class Compiler extends Tapable {
 									targetFileGeneration === undefined
 										? 1
 										: targetFileGeneration + 1;
-								cacheEntry.writtenTo.set(targetPath, newGeneration);
+								/** @type {CacheEntry} */
+								(cacheEntry).writtenTo.set(targetPath, newGeneration);
 								this._assetEmittingWrittenFiles.set(targetPath, newGeneration);
-								callback();
+								this.hooks.assetEmitted.callAsync(
+									file,
+									{
+										content,
+										source,
+										outputPath,
+										compilation,
+										targetPath
+									},
+									callback
+								);
 							});
-						} else {
-							if (source.existsAt === targetPath) {
-								source.emitted = false;
-								return callback();
+						};
+
+						/**
+						 * @param {number} size size
+						 */
+						const updateWithReplacementSource = size => {
+							updateFileWithReplacementSource(
+								file,
+								/** @type {CacheEntry} */ (cacheEntry),
+								size
+							);
+							/** @type {SimilarEntry} */
+							(similarEntry).size = size;
+							if (
+								/** @type {SimilarEntry} */ (similarEntry).waiting !== undefined
+							) {
+								for (const { file, cacheEntry } of /** @type {SimilarEntry} */ (
+									similarEntry
+								).waiting) {
+									updateFileWithReplacementSource(file, cacheEntry, size);
+								}
+							}
+						};
+
+						/**
+						 * @param {string} file file
+						 * @param {CacheEntry} cacheEntry cache entry
+						 * @param {number} size size
+						 */
+						const updateFileWithReplacementSource = (
+							file,
+							cacheEntry,
+							size
+						) => {
+							// Create a replacement resource which only allows to ask for size
+							// This allows to GC all memory allocated by the Source
+							// (expect when the Source is stored in any other cache)
+							if (!cacheEntry.sizeOnlySource) {
+								cacheEntry.sizeOnlySource = new SizeOnlySource(size);
+							}
+							compilation.updateAsset(file, cacheEntry.sizeOnlySource, {
+								size
+							});
+						};
+
+						/**
+						 * @param {IStats} stats stats
+						 * @returns {void}
+						 */
+						const processExistingFile = stats => {
+							// skip emitting if it's already there and an immutable file
+							if (immutable) {
+								updateWithReplacementSource(/** @type {number} */ (stats.size));
+								return alreadyWritten();
 							}
-							let content = source.source();
 
-							if (!Buffer.isBuffer(content)) {
-								content = Buffer.from(content, "utf8");
+							const content = getContent();
+
+							updateWithReplacementSource(content.length);
+
+							// if it exists and content on disk matches content
+							// skip writing the same content again
+							// (to keep mtime and don't trigger watchers)
+							// for a fast negative match file size is compared first
+							if (content.length === stats.size) {
+								compilation.comparedForEmitAssets.add(file);
+								return /** @type {OutputFileSystem} */ (
+									this.outputFileSystem
+								).readFile(targetPath, (err, existingContent) => {
+									if (
+										err ||
+										!content.equals(/** @type {Buffer} */ (existingContent))
+									) {
+										return doWrite(content);
+									}
+									return alreadyWritten();
+								});
 							}
 
-							source.existsAt = targetPath;
-							source.emitted = true;
-							this.outputFileSystem.writeFile(targetPath, content, callback);
+							return doWrite(content);
+						};
+
+						const processMissingFile = () => {
+							const content = getContent();
+
+							updateWithReplacementSource(content.length);
+
+							return doWrite(content);
+						};
+
+						// if the target file has already been written
+						if (targetFileGeneration !== undefined) {
+							// check if the Source has been written to this target file
+							const writtenGeneration = /** @type {CacheEntry} */ (
+								cacheEntry
+							).writtenTo.get(targetPath);
+							if (writtenGeneration === targetFileGeneration) {
+								// if yes, we may skip writing the file
+								// if it's already there
+								// (we assume one doesn't modify files while the Compiler is running, other then removing them)
+
+								if (this._assetEmittingPreviousFiles.has(targetPath)) {
+									const sizeOnlySource = /** @type {SizeOnlySource} */ (
+										/** @type {CacheEntry} */ (cacheEntry).sizeOnlySource
+									);
+
+									// We assume that assets from the last compilation say intact on disk (they are not removed)
+									compilation.updateAsset(file, sizeOnlySource, {
+										size: sizeOnlySource.size()
+									});
+
+									return callback();
+								}
+								// Settings immutable will make it accept file content without comparing when file exist
+								immutable = true;
+							} else if (!immutable) {
+								if (checkSimilarFile()) return;
+								// We wrote to this file before which has very likely a different content
+								// skip comparing and assume content is different for performance
+								// This case happens often during watch mode.
+								return processMissingFile();
+							}
+						}
+
+						if (checkSimilarFile()) return;
+						if (this.options.output.compareBeforeEmit) {
+							/** @type {OutputFileSystem} */
+							(this.outputFileSystem).stat(targetPath, (err, stats) => {
+								const exists = !err && /** @type {IStats} */ (stats).isFile();
+
+								if (exists) {
+									processExistingFile(/** @type {IStats} */ (stats));
+								} else {
+									processMissingFile();
+								}
+							});
+						} else {
+							processMissingFile();
 						}
 					};
 
-					if (targetFile.match(/\/|\\/)) {
-						const dir = path.dirname(targetFile);
-						this.outputFileSystem.mkdirp(
-							this.outputFileSystem.join(outputPath, dir),
-							writeOut
-						);
+					if (/\/|\\/.test(targetFile)) {
+						const fs = /** @type {OutputFileSystem} */ (this.outputFileSystem);
+						const dir = dirname(fs, join(fs, outputPath, targetFile));
+						mkdirp(fs, dir, writeOut);
 					} else {
 						writeOut();
 					}
 				},
 				err => {
-					if (err) return callback(err);
+					// Clear map to free up memory
+					caseInsensitiveMap.clear();
+					if (err) {
+						this._assetEmittingPreviousFiles.clear();
+						return callback(err);
+					}
+
+					this._assetEmittingPreviousFiles = allTargetPaths;
 
 					this.hooks.afterEmit.callAsync(compilation, err => {
 						if (err) return callback(err);
@@ -440,64 +1011,159 @@ class Compiler extends Tapable {
 
 		this.hooks.emit.callAsync(compilation, err => {
 			if (err) return callback(err);
-			outputPath = compilation.getPath(this.outputPath);
-			this.outputFileSystem.mkdirp(outputPath, emitFiles);
+			outputPath = compilation.getPath(this.outputPath, {});
+			mkdirp(
+				/** @type {OutputFileSystem} */ (this.outputFileSystem),
+				outputPath,
+				emitFiles
+			);
 		});
 	}
 
+	/**
+	 * @param {Callback} callback signals when the call finishes
+	 * @returns {void}
+	 */
 	emitRecords(callback) {
-		if (!this.recordsOutputPath) return callback();
-		const idx1 = this.recordsOutputPath.lastIndexOf("/");
-		const idx2 = this.recordsOutputPath.lastIndexOf("\\");
-		let recordsOutputPathDirectory = null;
-		if (idx1 > idx2) {
-			recordsOutputPathDirectory = this.recordsOutputPath.substr(0, idx1);
-		} else if (idx1 < idx2) {
-			recordsOutputPathDirectory = this.recordsOutputPath.substr(0, idx2);
+		if (this.hooks.emitRecords.isUsed()) {
+			if (this.recordsOutputPath) {
+				asyncLib.parallel(
+					[
+						cb => this.hooks.emitRecords.callAsync(cb),
+						this._emitRecords.bind(this)
+					],
+					err => callback(err)
+				);
+			} else {
+				this.hooks.emitRecords.callAsync(callback);
+			}
+		} else if (this.recordsOutputPath) {
+			this._emitRecords(callback);
+		} else {
+			callback();
 		}
+	}
 
+	/**
+	 * @param {Callback} callback signals when the call finishes
+	 * @returns {void}
+	 */
+	_emitRecords(callback) {
 		const writeFile = () => {
-			this.outputFileSystem.writeFile(
-				this.recordsOutputPath,
-				JSON.stringify(this.records, undefined, 2),
+			/** @type {OutputFileSystem} */
+			(this.outputFileSystem).writeFile(
+				/** @type {string} */ (this.recordsOutputPath),
+				JSON.stringify(
+					this.records,
+					(n, value) => {
+						if (
+							typeof value === "object" &&
+							value !== null &&
+							!Array.isArray(value)
+						) {
+							const keys = Object.keys(value);
+							if (!isSorted(keys)) {
+								return sortObject(value, keys);
+							}
+						}
+						return value;
+					},
+					2
+				),
 				callback
 			);
 		};
 
+		const recordsOutputPathDirectory = dirname(
+			/** @type {OutputFileSystem} */ (this.outputFileSystem),
+			/** @type {string} */ (this.recordsOutputPath)
+		);
 		if (!recordsOutputPathDirectory) {
 			return writeFile();
 		}
-		this.outputFileSystem.mkdirp(recordsOutputPathDirectory, err => {
-			if (err) return callback(err);
-			writeFile();
-		});
+		mkdirp(
+			/** @type {OutputFileSystem} */ (this.outputFileSystem),
+			recordsOutputPathDirectory,
+			err => {
+				if (err) return callback(err);
+				writeFile();
+			}
+		);
 	}
 
+	/**
+	 * @param {Callback} callback signals when the call finishes
+	 * @returns {void}
+	 */
 	readRecords(callback) {
+		if (this.hooks.readRecords.isUsed()) {
+			if (this.recordsInputPath) {
+				asyncLib.parallel(
+					[
+						cb => this.hooks.readRecords.callAsync(cb),
+						this._readRecords.bind(this)
+					],
+					err => callback(err)
+				);
+			} else {
+				this.records = {};
+				this.hooks.readRecords.callAsync(callback);
+			}
+		} else if (this.recordsInputPath) {
+			this._readRecords(callback);
+		} else {
+			this.records = {};
+			callback();
+		}
+	}
+
+	/**
+	 * @param {Callback} callback signals when the call finishes
+	 * @returns {void}
+	 */
+	_readRecords(callback) {
 		if (!this.recordsInputPath) {
 			this.records = {};
 			return callback();
 		}
-		this.inputFileSystem.stat(this.recordsInputPath, err => {
+		/** @type {InputFileSystem} */
+		(this.inputFileSystem).stat(this.recordsInputPath, err => {
 			// It doesn't exist
 			// We can ignore this.
 			if (err) return callback();
 
-			this.inputFileSystem.readFile(this.recordsInputPath, (err, content) => {
-				if (err) return callback(err);
+			/** @type {InputFileSystem} */
+			(this.inputFileSystem).readFile(
+				/** @type {string} */ (this.recordsInputPath),
+				(err, content) => {
+					if (err) return callback(err);
 
-				try {
-					this.records = parseJson(content.toString("utf-8"));
-				} catch (e) {
-					e.message = "Cannot parse records: " + e.message;
-					return callback(e);
-				}
+					try {
+						this.records = parseJson(
+							/** @type {Buffer} */ (content).toString("utf-8")
+						);
+					} catch (parseErr) {
+						return callback(
+							new Error(
+								`Cannot parse records: ${/** @type {Error} */ (parseErr).message}`
+							)
+						);
+					}
 
-				return callback();
-			});
+					return callback();
+				}
+			);
 		});
 	}
 
+	/**
+	 * @param {Compilation} compilation the compilation
+	 * @param {string} compilerName the compiler's name
+	 * @param {number} compilerIndex the compiler's index
+	 * @param {Partial=} outputOptions the output options
+	 * @param {WebpackPluginInstance[]=} plugins the plugins to apply
+	 * @returns {Compiler} a child compiler
+	 */
 	createChildCompiler(
 		compilation,
 		compilerName,
@@ -505,38 +1171,32 @@ class Compiler extends Tapable {
 		outputOptions,
 		plugins
 	) {
-		const childCompiler = new Compiler(this.context);
-		if (Array.isArray(plugins)) {
-			for (const plugin of plugins) {
-				plugin.apply(childCompiler);
+		const childCompiler = new Compiler(this.context, {
+			...this.options,
+			output: {
+				...this.options.output,
+				...outputOptions
 			}
-		}
-		for (const name in this.hooks) {
-			if (
-				![
-					"make",
-					"compile",
-					"emit",
-					"afterEmit",
-					"invalid",
-					"done",
-					"thisCompilation"
-				].includes(name)
-			) {
-				if (childCompiler.hooks[name]) {
-					childCompiler.hooks[name].taps = this.hooks[name].taps.slice();
-				}
-			}
-		}
+		});
 		childCompiler.name = compilerName;
 		childCompiler.outputPath = this.outputPath;
 		childCompiler.inputFileSystem = this.inputFileSystem;
 		childCompiler.outputFileSystem = null;
 		childCompiler.resolverFactory = this.resolverFactory;
+		childCompiler.modifiedFiles = this.modifiedFiles;
+		childCompiler.removedFiles = this.removedFiles;
 		childCompiler.fileTimestamps = this.fileTimestamps;
 		childCompiler.contextTimestamps = this.contextTimestamps;
+		childCompiler.fsStartTime = this.fsStartTime;
+		childCompiler.cache = this.cache;
+		childCompiler.compilerPath = `${this.compilerPath}${compilerName}|${compilerIndex}|`;
+		childCompiler._backCompat = this._backCompat;
 
-		const relativeCompilerName = makePathsRelative(this.context, compilerName);
+		const relativeCompilerName = makePathsRelative(
+			this.context,
+			compilerName,
+			this.root
+		);
 		if (!this.records[relativeCompilerName]) {
 			this.records[relativeCompilerName] = [];
 		}
@@ -546,12 +1206,38 @@ class Compiler extends Tapable {
 			this.records[relativeCompilerName].push((childCompiler.records = {}));
 		}
 
-		childCompiler.options = Object.create(this.options);
-		childCompiler.options.output = Object.create(childCompiler.options.output);
-		for (const name in outputOptions) {
-			childCompiler.options.output[name] = outputOptions[name];
-		}
 		childCompiler.parentCompilation = compilation;
+		childCompiler.root = this.root;
+		if (Array.isArray(plugins)) {
+			for (const plugin of plugins) {
+				if (plugin) {
+					plugin.apply(childCompiler);
+				}
+			}
+		}
+		for (const name in this.hooks) {
+			if (
+				![
+					"make",
+					"compile",
+					"emit",
+					"afterEmit",
+					"invalid",
+					"done",
+					"thisCompilation"
+				].includes(name) &&
+				childCompiler.hooks[/** @type {keyof Compiler["hooks"]} */ (name)]
+			) {
+				childCompiler.hooks[
+					/** @type {keyof Compiler["hooks"]} */
+					(name)
+				].taps =
+					this.hooks[
+						/** @type {keyof Compiler["hooks"]} */
+						(name)
+					].taps.slice();
+			}
+		}
 
 		compilation.hooks.childCompiler.call(
 			childCompiler,
@@ -563,31 +1249,42 @@ class Compiler extends Tapable {
 	}
 
 	isChild() {
-		return !!this.parentCompilation;
+		return Boolean(this.parentCompilation);
 	}
 
-	createCompilation() {
-		return new Compilation(this);
+	/**
+	 * @param {CompilationParams} params the compilation parameters
+	 * @returns {Compilation} compilation
+	 */
+	createCompilation(params) {
+		this._cleanupLastCompilation();
+		return (this._lastCompilation = new Compilation(this, params));
 	}
 
+	/**
+	 * @param {CompilationParams} params the compilation parameters
+	 * @returns {Compilation} the created compilation
+	 */
 	newCompilation(params) {
-		const compilation = this.createCompilation();
-		compilation.fileTimestamps = this.fileTimestamps;
-		compilation.contextTimestamps = this.contextTimestamps;
+		const compilation = this.createCompilation(params);
 		compilation.name = this.name;
 		compilation.records = this.records;
-		compilation.compilationDependencies = params.compilationDependencies;
 		this.hooks.thisCompilation.call(compilation, params);
 		this.hooks.compilation.call(compilation, params);
 		return compilation;
 	}
 
 	createNormalModuleFactory() {
-		const normalModuleFactory = new NormalModuleFactory(
-			this.options.context,
-			this.resolverFactory,
-			this.options.module || {}
-		);
+		this._cleanupLastNormalModuleFactory();
+		const normalModuleFactory = new NormalModuleFactory({
+			context: this.options.context,
+			fs: /** @type {InputFileSystem} */ (this.inputFileSystem),
+			resolverFactory: this.resolverFactory,
+			options: this.options.module,
+			associatedObjectForCache: this.root,
+			layers: this.options.experiments.layers
+		});
+		this._lastNormalModuleFactory = normalModuleFactory;
 		this.hooks.normalModuleFactory.call(normalModuleFactory);
 		return normalModuleFactory;
 	}
@@ -601,12 +1298,15 @@ class Compiler extends Tapable {
 	newCompilationParams() {
 		const params = {
 			normalModuleFactory: this.createNormalModuleFactory(),
-			contextModuleFactory: this.createContextModuleFactory(),
-			compilationDependencies: new Set()
+			contextModuleFactory: this.createContextModuleFactory()
 		};
 		return params;
 	}
 
+	/**
+	 * @param {RunCallback} callback signals when the compilation finishes
+	 * @returns {void}
+	 */
 	compile(callback) {
 		const params = this.newCompilationParams();
 		this.hooks.beforeCompile.callAsync(params, err => {
@@ -616,68 +1316,66 @@ class Compiler extends Tapable {
 
 			const compilation = this.newCompilation(params);
 
+			const logger = compilation.getLogger("webpack.Compiler");
+
+			logger.time("make hook");
 			this.hooks.make.callAsync(compilation, err => {
+				logger.timeEnd("make hook");
 				if (err) return callback(err);
 
-				compilation.finish();
-
-				compilation.seal(err => {
+				logger.time("finish make hook");
+				this.hooks.finishMake.callAsync(compilation, err => {
+					logger.timeEnd("finish make hook");
 					if (err) return callback(err);
 
-					this.hooks.afterCompile.callAsync(compilation, err => {
-						if (err) return callback(err);
+					process.nextTick(() => {
+						logger.time("finish compilation");
+						compilation.finish(err => {
+							logger.timeEnd("finish compilation");
+							if (err) return callback(err);
 
-						return callback(null, compilation);
+							logger.time("seal compilation");
+							compilation.seal(err => {
+								logger.timeEnd("seal compilation");
+								if (err) return callback(err);
+
+								logger.time("afterCompile hook");
+								this.hooks.afterCompile.callAsync(compilation, err => {
+									logger.timeEnd("afterCompile hook");
+									if (err) return callback(err);
+
+									return callback(null, compilation);
+								});
+							});
+						});
 					});
 				});
 			});
 		});
 	}
-}
-
-module.exports = Compiler;
-
-class SizeOnlySource extends Source {
-	constructor(size) {
-		super();
-		this._size = size;
-	}
-
-	_error() {
-		return new Error(
-			"Content and Map of this Source is no longer available (only size() is supported)"
-		);
-	}
-
-	size() {
-		return this._size;
-	}
 
 	/**
-	 * @param {any} options options
-	 * @returns {string} the source
+	 * @param {RunCallback} callback signals when the compiler closes
+	 * @returns {void}
 	 */
-	source(options) {
-		throw this._error();
-	}
-
-	node() {
-		throw this._error();
-	}
-
-	listMap() {
-		throw this._error();
-	}
-
-	map() {
-		throw this._error();
-	}
-
-	listNode() {
-		throw this._error();
-	}
-
-	updateHash() {
-		throw this._error();
+	close(callback) {
+		if (this.watching) {
+			// When there is still an active watching, close this first
+			this.watching.close(err => {
+				this.close(callback);
+			});
+			return;
+		}
+		this.hooks.shutdown.callAsync(err => {
+			if (err) return callback(err);
+			// Get rid of reference to last compilation to avoid leaking memory
+			// We can't run this._cleanupLastCompilation() as the Stats to this compilation
+			// might be still in use. We try to get rid of the reference to the cache instead.
+			this._lastCompilation = undefined;
+			this._lastNormalModuleFactory = undefined;
+			this.cache.shutdown(callback);
+		});
 	}
 }
+
+module.exports = Compiler;
diff --git a/lib/ConcatenationScope.js b/lib/ConcatenationScope.js
new file mode 100644
index 00000000000..5c7bb6fd0dc
--- /dev/null
+++ b/lib/ConcatenationScope.js
@@ -0,0 +1,143 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const {
+	DEFAULT_EXPORT,
+	NAMESPACE_OBJECT_EXPORT
+} = require("./util/concatenate");
+
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./optimize/ConcatenatedModule").ConcatenatedModuleInfo} ConcatenatedModuleInfo */
+/** @typedef {import("./optimize/ConcatenatedModule").ModuleInfo} ModuleInfo */
+
+const MODULE_REFERENCE_REGEXP =
+	/^__WEBPACK_MODULE_REFERENCE__(\d+)_([\da-f]+|ns)(_call)?(_directImport)?(?:_asiSafe(\d))?__$/;
+
+/**
+ * @typedef {object} ModuleReferenceOptions
+ * @property {string[]} ids the properties/exports of the module
+ * @property {boolean} call true, when this referenced export is called
+ * @property {boolean} directImport true, when this referenced export is directly imported (not via property access)
+ * @property {boolean | undefined} asiSafe if the position is ASI safe or unknown
+ */
+
+class ConcatenationScope {
+	/**
+	 * @param {ModuleInfo[] | Map} modulesMap all module info by module
+	 * @param {ConcatenatedModuleInfo} currentModule the current module info
+	 */
+	constructor(modulesMap, currentModule) {
+		this._currentModule = currentModule;
+		if (Array.isArray(modulesMap)) {
+			const map = new Map();
+			for (const info of modulesMap) {
+				map.set(info.module, info);
+			}
+			modulesMap = map;
+		}
+		this._modulesMap = modulesMap;
+	}
+
+	/**
+	 * @param {Module} module the referenced module
+	 * @returns {boolean} true, when it's in the scope
+	 */
+	isModuleInScope(module) {
+		return this._modulesMap.has(module);
+	}
+
+	/**
+	 * @param {string} exportName name of the export
+	 * @param {string} symbol identifier of the export in source code
+	 */
+	registerExport(exportName, symbol) {
+		if (!this._currentModule.exportMap) {
+			this._currentModule.exportMap = new Map();
+		}
+		if (!this._currentModule.exportMap.has(exportName)) {
+			this._currentModule.exportMap.set(exportName, symbol);
+		}
+	}
+
+	/**
+	 * @param {string} exportName name of the export
+	 * @param {string} expression expression to be used
+	 */
+	registerRawExport(exportName, expression) {
+		if (!this._currentModule.rawExportMap) {
+			this._currentModule.rawExportMap = new Map();
+		}
+		if (!this._currentModule.rawExportMap.has(exportName)) {
+			this._currentModule.rawExportMap.set(exportName, expression);
+		}
+	}
+
+	/**
+	 * @param {string} symbol identifier of the export in source code
+	 */
+	registerNamespaceExport(symbol) {
+		this._currentModule.namespaceExportSymbol = symbol;
+	}
+
+	/**
+	 * @param {Module} module the referenced module
+	 * @param {Partial} options options
+	 * @returns {string} the reference as identifier
+	 */
+	createModuleReference(
+		module,
+		{ ids = undefined, call = false, directImport = false, asiSafe = false }
+	) {
+		const info = /** @type {ModuleInfo} */ (this._modulesMap.get(module));
+		const callFlag = call ? "_call" : "";
+		const directImportFlag = directImport ? "_directImport" : "";
+		const asiSafeFlag = asiSafe
+			? "_asiSafe1"
+			: asiSafe === false
+				? "_asiSafe0"
+				: "";
+		const exportData = ids
+			? Buffer.from(JSON.stringify(ids), "utf-8").toString("hex")
+			: "ns";
+		// a "._" is appended to allow "delete ...", which would cause a SyntaxError in strict mode
+		return `__WEBPACK_MODULE_REFERENCE__${info.index}_${exportData}${callFlag}${directImportFlag}${asiSafeFlag}__._`;
+	}
+
+	/**
+	 * @param {string} name the identifier
+	 * @returns {boolean} true, when it's an module reference
+	 */
+	static isModuleReference(name) {
+		return MODULE_REFERENCE_REGEXP.test(name);
+	}
+
+	/**
+	 * @param {string} name the identifier
+	 * @returns {ModuleReferenceOptions & { index: number } | null} parsed options and index
+	 */
+	static matchModuleReference(name) {
+		const match = MODULE_REFERENCE_REGEXP.exec(name);
+		if (!match) return null;
+		const index = Number(match[1]);
+		const asiSafe = match[5];
+		return {
+			index,
+			ids:
+				match[2] === "ns"
+					? []
+					: JSON.parse(Buffer.from(match[2], "hex").toString("utf-8")),
+			call: Boolean(match[3]),
+			directImport: Boolean(match[4]),
+			asiSafe: asiSafe ? asiSafe === "1" : undefined
+		};
+	}
+}
+
+ConcatenationScope.DEFAULT_EXPORT = DEFAULT_EXPORT;
+ConcatenationScope.NAMESPACE_OBJECT_EXPORT = NAMESPACE_OBJECT_EXPORT;
+
+module.exports = ConcatenationScope;
diff --git a/lib/ConcurrentCompilationError.js b/lib/ConcurrentCompilationError.js
index 3b590e72c2c..3643553f050 100644
--- a/lib/ConcurrentCompilationError.js
+++ b/lib/ConcurrentCompilationError.js
@@ -2,6 +2,7 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Maksim Nazarjev @acupofspirt
 */
+
 "use strict";
 
 const WebpackError = require("./WebpackError");
@@ -13,7 +14,5 @@ module.exports = class ConcurrentCompilationError extends WebpackError {
 		this.name = "ConcurrentCompilationError";
 		this.message =
 			"You ran Webpack twice. Each instance only supports a single concurrent compilation at a time.";
-
-		Error.captureStackTrace(this, this.constructor);
 	}
 };
diff --git a/lib/ConditionalInitFragment.js b/lib/ConditionalInitFragment.js
new file mode 100644
index 00000000000..4386fee4dfa
--- /dev/null
+++ b/lib/ConditionalInitFragment.js
@@ -0,0 +1,120 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { ConcatSource, PrefixSource } = require("webpack-sources");
+const InitFragment = require("./InitFragment");
+const Template = require("./Template");
+const { mergeRuntime } = require("./util/runtime");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("./Generator").GenerateContext} GenerateContext */
+/** @typedef {import("./util/runtime").RuntimeSpec} RuntimeSpec */
+
+/**
+ * @param {string} condition condition
+ * @param {string | Source} source source
+ * @returns {string | Source} wrapped source
+ */
+const wrapInCondition = (condition, source) => {
+	if (typeof source === "string") {
+		return Template.asString([
+			`if (${condition}) {`,
+			Template.indent(source),
+			"}",
+			""
+		]);
+	}
+	return new ConcatSource(
+		`if (${condition}) {\n`,
+		new PrefixSource("\t", source),
+		"}\n"
+	);
+};
+
+/**
+ * @extends {InitFragment}
+ */
+class ConditionalInitFragment extends InitFragment {
+	/**
+	 * @param {string | Source | undefined} content the source code that will be included as initialization code
+	 * @param {number} stage category of initialization code (contribute to order)
+	 * @param {number} position position in the category (contribute to order)
+	 * @param {string | undefined} key unique key to avoid emitting the same initialization code twice
+	 * @param {RuntimeSpec | boolean} runtimeCondition in which runtime this fragment should be executed
+	 * @param {string | Source=} endContent the source code that will be included at the end of the module
+	 */
+	constructor(
+		content,
+		stage,
+		position,
+		key,
+		runtimeCondition = true,
+		endContent = undefined
+	) {
+		super(content, stage, position, key, endContent);
+		this.runtimeCondition = runtimeCondition;
+	}
+
+	/**
+	 * @param {GenerateContext} context context
+	 * @returns {string | Source | undefined} the source code that will be included as initialization code
+	 */
+	getContent(context) {
+		if (this.runtimeCondition === false || !this.content) return "";
+		if (this.runtimeCondition === true) return this.content;
+		const expr = context.runtimeTemplate.runtimeConditionExpression({
+			chunkGraph: context.chunkGraph,
+			runtimeRequirements: context.runtimeRequirements,
+			runtime: context.runtime,
+			runtimeCondition: this.runtimeCondition
+		});
+		if (expr === "true") return this.content;
+		return wrapInCondition(expr, this.content);
+	}
+
+	/**
+	 * @param {GenerateContext} context context
+	 * @returns {string | Source=} the source code that will be included at the end of the module
+	 */
+	getEndContent(context) {
+		if (this.runtimeCondition === false || !this.endContent) return "";
+		if (this.runtimeCondition === true) return this.endContent;
+		const expr = context.runtimeTemplate.runtimeConditionExpression({
+			chunkGraph: context.chunkGraph,
+			runtimeRequirements: context.runtimeRequirements,
+			runtime: context.runtime,
+			runtimeCondition: this.runtimeCondition
+		});
+		if (expr === "true") return this.endContent;
+		return wrapInCondition(expr, this.endContent);
+	}
+
+	/**
+	 * @param {ConditionalInitFragment} other fragment to merge with
+	 * @returns {ConditionalInitFragment} merged fragment
+	 */
+	merge(other) {
+		if (this.runtimeCondition === true) return this;
+		if (other.runtimeCondition === true) return other;
+		if (this.runtimeCondition === false) return other;
+		if (other.runtimeCondition === false) return this;
+		const runtimeCondition = mergeRuntime(
+			this.runtimeCondition,
+			other.runtimeCondition
+		);
+		return new ConditionalInitFragment(
+			this.content,
+			this.stage,
+			this.position,
+			this.key,
+			runtimeCondition,
+			this.endContent
+		);
+	}
+}
+
+module.exports = ConditionalInitFragment;
diff --git a/lib/ConstPlugin.js b/lib/ConstPlugin.js
index 164b840dab2..11020251bf3 100644
--- a/lib/ConstPlugin.js
+++ b/lib/ConstPlugin.js
@@ -2,20 +2,40 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_DYNAMIC,
+	JAVASCRIPT_MODULE_TYPE_ESM
+} = require("./ModuleTypeConstants");
+const CachedConstDependency = require("./dependencies/CachedConstDependency");
 const ConstDependency = require("./dependencies/ConstDependency");
-const NullFactory = require("./NullFactory");
-const ParserHelpers = require("./ParserHelpers");
+const { evaluateToString } = require("./javascript/JavascriptParserHelpers");
+const { parseResource } = require("./util/identifier");
 
-const getQuery = request => {
-	const i = request.indexOf("?");
-	return i !== -1 ? request.substr(i) : "";
-};
+/** @typedef {import("estree").AssignmentProperty} AssignmentProperty */
+/** @typedef {import("estree").Expression} Expression */
+/** @typedef {import("estree").Identifier} Identifier */
+/** @typedef {import("estree").Pattern} Pattern */
+/** @typedef {import("estree").SourceLocation} SourceLocation */
+/** @typedef {import("estree").Statement} Statement */
+/** @typedef {import("estree").Super} Super */
+/** @typedef {import("estree").VariableDeclaration} VariableDeclaration */
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./javascript/BasicEvaluatedExpression")} BasicEvaluatedExpression */
+/** @typedef {import("./javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("./javascript/JavascriptParser").Range} Range */
 
+/**
+ * @param {Set} declarations set of declarations
+ * @param {Identifier | Pattern} pattern pattern to collect declarations from
+ */
 const collectDeclaration = (declarations, pattern) => {
 	const stack = [pattern];
 	while (stack.length > 0) {
-		const node = stack.pop();
+		const node = /** @type {Pattern} */ (stack.pop());
 		switch (node.type) {
 			case "Identifier":
 				declarations.add(node.name);
@@ -32,7 +52,7 @@ const collectDeclaration = (declarations, pattern) => {
 				break;
 			case "ObjectPattern":
 				for (const property of node.properties) {
-					stack.push(property.value);
+					stack.push(/** @type {AssignmentProperty} */ (property).value);
 				}
 				break;
 			case "RestElement":
@@ -42,8 +62,14 @@ const collectDeclaration = (declarations, pattern) => {
 	}
 };
 
+/**
+ * @param {Statement} branch branch to get hoisted declarations from
+ * @param {boolean} includeFunctionDeclarations whether to include function declarations
+ * @returns {Array} hoisted declarations
+ */
 const getHoistedDeclarations = (branch, includeFunctionDeclarations) => {
 	const declarations = new Set();
+	/** @type {Array} */
 	const stack = [branch];
 	while (stack.length > 0) {
 		const node = stack.pop();
@@ -62,12 +88,12 @@ const getHoistedDeclarations = (branch, includeFunctionDeclarations) => {
 				stack.push(node.alternate);
 				break;
 			case "ForStatement":
-				stack.push(node.init);
+				stack.push(/** @type {VariableDeclaration} */ (node.init));
 				stack.push(node.body);
 				break;
 			case "ForInStatement":
 			case "ForOfStatement":
-				stack.push(node.left);
+				stack.push(/** @type {VariableDeclaration} */ (node.left));
 				stack.push(node.body);
 				break;
 			case "DoWhileStatement":
@@ -91,7 +117,7 @@ const getHoistedDeclarations = (branch, includeFunctionDeclarations) => {
 				break;
 			case "FunctionDeclaration":
 				if (includeFunctionDeclarations) {
-					collectDeclaration(declarations, node.id);
+					collectDeclaration(declarations, /** @type {Identifier} */ (node.id));
 				}
 				break;
 			case "VariableDeclaration":
@@ -106,26 +132,48 @@ const getHoistedDeclarations = (branch, includeFunctionDeclarations) => {
 	return Array.from(declarations);
 };
 
+const PLUGIN_NAME = "ConstPlugin";
+
 class ConstPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
+		const cachedParseResource = parseResource.bindCache(compiler.root);
 		compiler.hooks.compilation.tap(
-			"ConstPlugin",
+			PLUGIN_NAME,
 			(compilation, { normalModuleFactory }) => {
-				compilation.dependencyFactories.set(ConstDependency, new NullFactory());
 				compilation.dependencyTemplates.set(
 					ConstDependency,
 					new ConstDependency.Template()
 				);
 
+				compilation.dependencyTemplates.set(
+					CachedConstDependency,
+					new CachedConstDependency.Template()
+				);
+
+				/**
+				 * @param {JavascriptParser} parser the parser
+				 */
 				const handler = parser => {
-					parser.hooks.statementIf.tap("ConstPlugin", statement => {
+					parser.hooks.terminate.tap(PLUGIN_NAME, statement => true);
+					parser.hooks.statementIf.tap(PLUGIN_NAME, statement => {
+						if (parser.scope.isAsmJs) return;
 						const param = parser.evaluateExpression(statement.test);
 						const bool = param.asBool();
 						if (typeof bool === "boolean") {
-							if (statement.test.type !== "Literal") {
-								const dep = new ConstDependency(`${bool}`, param.range);
-								dep.loc = statement.loc;
-								parser.state.current.addDependency(dep);
+							if (!param.couldHaveSideEffects()) {
+								const dep = new ConstDependency(
+									`${bool}`,
+									/** @type {Range} */ (param.range)
+								);
+								dep.loc = /** @type {SourceLocation} */ (statement.loc);
+								parser.state.module.addPresentationalDependency(dep);
+							} else {
+								parser.walkExpression(statement.test);
 							}
 							const branchToRemove = bool
 								? statement.alternate
@@ -161,41 +209,39 @@ class ConstPlugin {
 								// NOTE: When code runs in strict mode, `var` declarations
 								// are hoisted but `function` declarations don't.
 								//
-								let declarations;
-								if (parser.scope.isStrict) {
-									// If the code runs in strict mode, variable declarations
-									// using `var` must be hoisted.
-									declarations = getHoistedDeclarations(branchToRemove, false);
-								} else {
-									// Otherwise, collect all hoisted declaration.
-									declarations = getHoistedDeclarations(branchToRemove, true);
-								}
-								let replacement;
-								if (declarations.length > 0) {
-									replacement = `{ var ${declarations.join(", ")}; }`;
-								} else {
-									replacement = "{}";
-								}
+								const declarations = parser.scope.isStrict
+									? getHoistedDeclarations(branchToRemove, false)
+									: getHoistedDeclarations(branchToRemove, true);
+								const replacement =
+									declarations.length > 0
+										? `{ var ${declarations.join(", ")}; }`
+										: "{}";
 								const dep = new ConstDependency(
 									replacement,
-									branchToRemove.range
+									/** @type {Range} */ (branchToRemove.range)
 								);
-								dep.loc = branchToRemove.loc;
-								parser.state.current.addDependency(dep);
+								dep.loc = /** @type {SourceLocation} */ (branchToRemove.loc);
+								parser.state.module.addPresentationalDependency(dep);
 							}
 							return bool;
 						}
 					});
 					parser.hooks.expressionConditionalOperator.tap(
-						"ConstPlugin",
+						PLUGIN_NAME,
 						expression => {
+							if (parser.scope.isAsmJs) return;
 							const param = parser.evaluateExpression(expression.test);
 							const bool = param.asBool();
 							if (typeof bool === "boolean") {
-								if (expression.test.type !== "Literal") {
-									const dep = new ConstDependency(` ${bool}`, param.range);
-									dep.loc = expression.loc;
-									parser.state.current.addDependency(dep);
+								if (!param.couldHaveSideEffects()) {
+									const dep = new ConstDependency(
+										` ${bool}`,
+										/** @type {Range} */ (param.range)
+									);
+									dep.loc = /** @type {SourceLocation} */ (expression.loc);
+									parser.state.module.addPresentationalDependency(dep);
+								} else {
+									parser.walkExpression(expression.test);
 								}
 								// Expressions do not hoist.
 								// It is safe to remove the dead branch.
@@ -206,24 +252,25 @@ class ConstPlugin {
 								//
 								// the generated code is:
 								//
-								//   false ? undefined : otherExpression();
+								//   false ? 0 : otherExpression();
 								//
 								const branchToRemove = bool
 									? expression.alternate
 									: expression.consequent;
 								const dep = new ConstDependency(
-									"undefined",
-									branchToRemove.range
+									"0",
+									/** @type {Range} */ (branchToRemove.range)
 								);
-								dep.loc = branchToRemove.loc;
-								parser.state.current.addDependency(dep);
+								dep.loc = /** @type {SourceLocation} */ (branchToRemove.loc);
+								parser.state.module.addPresentationalDependency(dep);
 								return bool;
 							}
 						}
 					);
 					parser.hooks.expressionLogicalOperator.tap(
-						"ConstPlugin",
+						PLUGIN_NAME,
 						expression => {
+							if (parser.scope.isAsmJs) return;
 							if (
 								expression.operator === "&&" ||
 								expression.operator === "||"
@@ -278,7 +325,10 @@ class ConstPlugin {
 										(expression.operator === "&&" && bool) ||
 										(expression.operator === "||" && !bool);
 
-									if (param.isBoolean() || keepRight) {
+									if (
+										!param.couldHaveSideEffects() &&
+										(param.isBoolean() || keepRight)
+									) {
 										// for case like
 										//
 										//   return'development'===process.env.NODE_ENV&&'foo'
@@ -287,54 +337,200 @@ class ConstPlugin {
 										//
 										//   returnfalse&&'foo'
 										//
-										const dep = new ConstDependency(` ${bool}`, param.range);
-										dep.loc = expression.loc;
-										parser.state.current.addDependency(dep);
+										const dep = new ConstDependency(
+											` ${bool}`,
+											/** @type {Range} */ (param.range)
+										);
+										dep.loc = /** @type {SourceLocation} */ (expression.loc);
+										parser.state.module.addPresentationalDependency(dep);
 									} else {
 										parser.walkExpression(expression.left);
 									}
 									if (!keepRight) {
 										const dep = new ConstDependency(
-											"false",
-											expression.right.range
+											"0",
+											/** @type {Range} */ (expression.right.range)
+										);
+										dep.loc = /** @type {SourceLocation} */ (expression.loc);
+										parser.state.module.addPresentationalDependency(dep);
+									}
+									return keepRight;
+								}
+							} else if (expression.operator === "??") {
+								const param = parser.evaluateExpression(expression.left);
+								const keepRight = param.asNullish();
+								if (typeof keepRight === "boolean") {
+									// ------------------------------------------
+									//
+									// Given the following code:
+									//
+									//   nonNullish ?? someExpression();
+									//
+									// the generated code is:
+									//
+									//   nonNullish ?? 0;
+									//
+									// ------------------------------------------
+									//
+									// Given the following code:
+									//
+									//   nullish ?? someExpression();
+									//
+									// the generated code is:
+									//
+									//   null ?? someExpression();
+									//
+									if (!param.couldHaveSideEffects() && keepRight) {
+										// cspell:word returnnull
+										// for case like
+										//
+										//   return('development'===process.env.NODE_ENV&&null)??'foo'
+										//
+										// we need a space before the bool to prevent result like
+										//
+										//   returnnull??'foo'
+										//
+										const dep = new ConstDependency(
+											" null",
+											/** @type {Range} */ (param.range)
 										);
-										dep.loc = expression.loc;
-										parser.state.current.addDependency(dep);
+										dep.loc = /** @type {SourceLocation} */ (expression.loc);
+										parser.state.module.addPresentationalDependency(dep);
+									} else {
+										const dep = new ConstDependency(
+											"0",
+											/** @type {Range} */ (expression.right.range)
+										);
+										dep.loc = /** @type {SourceLocation} */ (expression.loc);
+										parser.state.module.addPresentationalDependency(dep);
+										parser.walkExpression(expression.left);
 									}
+
 									return keepRight;
 								}
 							}
 						}
 					);
+					parser.hooks.optionalChaining.tap(PLUGIN_NAME, expr => {
+						/** @type {Expression[]} */
+						const optionalExpressionsStack = [];
+						/** @type {Expression | Super} */
+						let next = expr.expression;
+
+						while (
+							next.type === "MemberExpression" ||
+							next.type === "CallExpression"
+						) {
+							if (next.type === "MemberExpression") {
+								if (next.optional) {
+									// SuperNode can not be optional
+									optionalExpressionsStack.push(
+										/** @type {Expression} */ (next.object)
+									);
+								}
+								next = next.object;
+							} else {
+								if (next.optional) {
+									// SuperNode can not be optional
+									optionalExpressionsStack.push(
+										/** @type {Expression} */ (next.callee)
+									);
+								}
+								next = next.callee;
+							}
+						}
+
+						while (optionalExpressionsStack.length) {
+							const expression = optionalExpressionsStack.pop();
+							const evaluated = parser.evaluateExpression(
+								/** @type {Expression} */ (expression)
+							);
+
+							if (evaluated.asNullish()) {
+								// ------------------------------------------
+								//
+								// Given the following code:
+								//
+								//   nullishMemberChain?.a.b();
+								//
+								// the generated code is:
+								//
+								//   undefined;
+								//
+								// ------------------------------------------
+								//
+								const dep = new ConstDependency(
+									" undefined",
+									/** @type {Range} */ (expr.range)
+								);
+								dep.loc = /** @type {SourceLocation} */ (expr.loc);
+								parser.state.module.addPresentationalDependency(dep);
+								return true;
+							}
+						}
+					});
 					parser.hooks.evaluateIdentifier
 						.for("__resourceQuery")
-						.tap("ConstPlugin", expr => {
+						.tap(PLUGIN_NAME, expr => {
+							if (parser.scope.isAsmJs) return;
 							if (!parser.state.module) return;
-							return ParserHelpers.evaluateToString(
-								getQuery(parser.state.module.resource)
+							return evaluateToString(
+								cachedParseResource(parser.state.module.resource).query
 							)(expr);
 						});
 					parser.hooks.expression
 						.for("__resourceQuery")
-						.tap("ConstPlugin", () => {
+						.tap(PLUGIN_NAME, expr => {
+							if (parser.scope.isAsmJs) return;
+							if (!parser.state.module) return;
+							const dep = new CachedConstDependency(
+								JSON.stringify(
+									cachedParseResource(parser.state.module.resource).query
+								),
+								/** @type {Range} */ (expr.range),
+								"__resourceQuery"
+							);
+							dep.loc = /** @type {SourceLocation} */ (expr.loc);
+							parser.state.module.addPresentationalDependency(dep);
+							return true;
+						});
+
+					parser.hooks.evaluateIdentifier
+						.for("__resourceFragment")
+						.tap(PLUGIN_NAME, expr => {
+							if (parser.scope.isAsmJs) return;
+							if (!parser.state.module) return;
+							return evaluateToString(
+								cachedParseResource(parser.state.module.resource).fragment
+							)(expr);
+						});
+					parser.hooks.expression
+						.for("__resourceFragment")
+						.tap(PLUGIN_NAME, expr => {
+							if (parser.scope.isAsmJs) return;
 							if (!parser.state.module) return;
-							parser.state.current.addVariable(
-								"__resourceQuery",
-								JSON.stringify(getQuery(parser.state.module.resource))
+							const dep = new CachedConstDependency(
+								JSON.stringify(
+									cachedParseResource(parser.state.module.resource).fragment
+								),
+								/** @type {Range} */ (expr.range),
+								"__resourceFragment"
 							);
+							dep.loc = /** @type {SourceLocation} */ (expr.loc);
+							parser.state.module.addPresentationalDependency(dep);
 							return true;
 						});
 				};
 
 				normalModuleFactory.hooks.parser
-					.for("javascript/auto")
-					.tap("ConstPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, handler);
 				normalModuleFactory.hooks.parser
-					.for("javascript/dynamic")
-					.tap("ConstPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
+					.tap(PLUGIN_NAME, handler);
 				normalModuleFactory.hooks.parser
-					.for("javascript/esm")
-					.tap("ConstPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_ESM)
+					.tap(PLUGIN_NAME, handler);
 			}
 		);
 	}
diff --git a/lib/ContextExclusionPlugin.js b/lib/ContextExclusionPlugin.js
index 0b1dda0e9f5..c9ad952e143 100644
--- a/lib/ContextExclusionPlugin.js
+++ b/lib/ContextExclusionPlugin.js
@@ -1,8 +1,14 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
 "use strict";
 
 /** @typedef {import("./Compiler")} Compiler */
 /** @typedef {import("./ContextModuleFactory")} ContextModuleFactory */
 
+const PLUGIN_NAME = "ContextExclusionPlugin";
+
 class ContextExclusionPlugin {
 	/**
 	 * @param {RegExp} negativeMatcher Matcher regular expression
@@ -13,14 +19,14 @@ class ContextExclusionPlugin {
 
 	/**
 	 * Apply the plugin
-	 * @param {Compiler} compiler Webpack Compiler
+	 * @param {Compiler} compiler the compiler instance
 	 * @returns {void}
 	 */
 	apply(compiler) {
-		compiler.hooks.contextModuleFactory.tap("ContextExclusionPlugin", cmf => {
-			cmf.hooks.contextModuleFiles.tap("ContextExclusionPlugin", files => {
-				return files.filter(filePath => !this.negativeMatcher.test(filePath));
-			});
+		compiler.hooks.contextModuleFactory.tap(PLUGIN_NAME, cmf => {
+			cmf.hooks.contextModuleFiles.tap(PLUGIN_NAME, files =>
+				files.filter(filePath => !this.negativeMatcher.test(filePath))
+			);
 		});
 	}
 }
diff --git a/lib/ContextModule.js b/lib/ContextModule.js
index 78e0e47aa73..44711c4e314 100644
--- a/lib/ContextModule.js
+++ b/lib/ContextModule.js
@@ -2,128 +2,290 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
-const util = require("util");
+
 const { OriginalSource, RawSource } = require("webpack-sources");
-const Module = require("./Module");
 const AsyncDependenciesBlock = require("./AsyncDependenciesBlock");
+const { makeWebpackError } = require("./HookWebpackError");
+const Module = require("./Module");
+const { JS_TYPES } = require("./ModuleSourceTypesConstants");
+const { JAVASCRIPT_MODULE_TYPE_DYNAMIC } = require("./ModuleTypeConstants");
+const RuntimeGlobals = require("./RuntimeGlobals");
 const Template = require("./Template");
-const contextify = require("./util/identifier").contextify;
+const WebpackError = require("./WebpackError");
+const {
+	compareLocations,
+	concatComparators,
+	compareSelect,
+	keepOriginalOrder,
+	compareModulesById
+} = require("./util/comparators");
+const {
+	contextify,
+	parseResource,
+	makePathsRelative
+} = require("./util/identifier");
+const makeSerializable = require("./util/makeSerializable");
 
-/** @typedef {"sync" | "eager" | "weak" | "async-weak" | "lazy" | "lazy-once"} ContextMode Context mode */
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../declarations/WebpackOptions").ResolveOptions} ResolveOptions */
+/** @typedef {import("../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
+/** @typedef {import("./Chunk")} Chunk */
+/** @typedef {import("./Chunk").ChunkId} ChunkId */
+/** @typedef {import("./ChunkGraph")} ChunkGraph */
+/** @typedef {import("./ChunkGraph").ModuleId} ModuleId */
+/** @typedef {import("./ChunkGroup").RawChunkGroupOptions} RawChunkGroupOptions */
+/** @typedef {import("./Compilation")} Compilation */
+/** @typedef {import("./Dependency")} Dependency */
+/** @typedef {import("./DependencyTemplates")} DependencyTemplates */
+/** @typedef {import("./Generator").SourceTypes} SourceTypes */
+/** @typedef {import("./Module").BuildCallback} BuildCallback */
+/** @typedef {import("./Module").BuildInfo} BuildInfo */
+/** @typedef {import("./Module").BuildMeta} BuildMeta */
+/** @typedef {import("./Module").CodeGenerationContext} CodeGenerationContext */
+/** @typedef {import("./Module").CodeGenerationResult} CodeGenerationResult */
+/** @typedef {import("./Module").LibIdentOptions} LibIdentOptions */
+/** @typedef {import("./Module").NeedBuildCallback} NeedBuildCallback */
+/** @typedef {import("./Module").NeedBuildContext} NeedBuildContext */
+/** @typedef {import("./ModuleGraph")} ModuleGraph */
+/** @typedef {import("./RequestShortener")} RequestShortener */
+/** @typedef {import("./ResolverFactory").ResolverWithOptions} ResolverWithOptions */
+/** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */
 /** @typedef {import("./dependencies/ContextElementDependency")} ContextElementDependency */
+/** @typedef {import("./javascript/JavascriptParser").ImportAttributes} ImportAttributes */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @template T @typedef {import("./util/LazySet")} LazySet */
+/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
+
+/** @typedef {"sync" | "eager" | "weak" | "async-weak" | "lazy" | "lazy-once"} ContextMode Context mode */
+
+/**
+ * @typedef {object} ContextOptions
+ * @property {ContextMode} mode
+ * @property {boolean} recursive
+ * @property {RegExp} regExp
+ * @property {("strict" | boolean)=} namespaceObject
+ * @property {string=} addon
+ * @property {(string | null)=} chunkName
+ * @property {(RegExp | null)=} include
+ * @property {(RegExp | null)=} exclude
+ * @property {RawChunkGroupOptions=} groupOptions
+ * @property {string=} typePrefix
+ * @property {string=} category
+ * @property {(string[][] | null)=} referencedExports exports referenced from modules (won't be mangled)
+ * @property {string=} layer
+ * @property {ImportAttributes=} attributes
+ */
+
+/**
+ * @typedef {object} ContextModuleOptionsExtras
+ * @property {false | string | string[]} resource
+ * @property {string=} resourceQuery
+ * @property {string=} resourceFragment
+ * @property {ResolveOptions=} resolveOptions
+ */
+
+/** @typedef {ContextOptions & ContextModuleOptionsExtras} ContextModuleOptions */
 
 /**
  * @callback ResolveDependenciesCallback
- * @param {Error=} err
- * @param {ContextElementDependency[]} dependencies
+ * @param {Error | null} err
+ * @param {ContextElementDependency[]=} dependencies
  */
 
 /**
  * @callback ResolveDependencies
- * @param {TODO} fs
- * @param {TODO} options
+ * @param {InputFileSystem} fs
+ * @param {ContextModuleOptions} options
  * @param {ResolveDependenciesCallback} callback
  */
 
+/** @typedef {1 | 3 | 7 | 9} FakeMapType */
+
+/** @typedef {Record} FakeMap */
+
+const SNAPSHOT_OPTIONS = { timestamp: true };
+
 class ContextModule extends Module {
-	// type ContextMode = "sync" | "eager" | "weak" | "async-weak" | "lazy" | "lazy-once"
-	// type ContextOptions = { resource: string, recursive: boolean, regExp: RegExp, addon?: string, mode?: ContextMode, chunkName?: string, include?: RegExp, exclude?: RegExp, groupOptions?: Object }
-	// resolveDependencies: (fs: FS, options: ContextOptions, (err: Error?, dependencies: Dependency[]) => void) => void
-	// options: ContextOptions
 	/**
 	 * @param {ResolveDependencies} resolveDependencies function to get dependencies in this context
-	 * @param {TODO} options options object
+	 * @param {ContextModuleOptions} options options object
 	 */
 	constructor(resolveDependencies, options) {
-		let resource;
-		let resourceQuery;
-		const queryIdx = options.resource.indexOf("?");
-		if (queryIdx >= 0) {
-			resource = options.resource.substr(0, queryIdx);
-			resourceQuery = options.resource.substr(queryIdx);
+		if (!options || typeof options.resource === "string") {
+			const parsed = parseResource(
+				options ? /** @type {string} */ (options.resource) : ""
+			);
+			const resource = parsed.path;
+			const resourceQuery = (options && options.resourceQuery) || parsed.query;
+			const resourceFragment =
+				(options && options.resourceFragment) || parsed.fragment;
+			const layer = options && options.layer;
+
+			super(JAVASCRIPT_MODULE_TYPE_DYNAMIC, resource, layer);
+			/** @type {ContextModuleOptions} */
+			this.options = {
+				...options,
+				resource,
+				resourceQuery,
+				resourceFragment
+			};
 		} else {
-			resource = options.resource;
-			resourceQuery = "";
+			super(JAVASCRIPT_MODULE_TYPE_DYNAMIC, undefined, options.layer);
+			/** @type {ContextModuleOptions} */
+			this.options = {
+				...options,
+				resource: options.resource,
+				resourceQuery: options.resourceQuery || "",
+				resourceFragment: options.resourceFragment || ""
+			};
 		}
 
-		super("javascript/dynamic", resource);
-
 		// Info from Factory
+		/** @type {ResolveDependencies | undefined} */
 		this.resolveDependencies = resolveDependencies;
-		this.options = Object.assign({}, options, {
-			resource: resource,
-			resourceQuery: resourceQuery
-		});
-		if (options.resolveOptions !== undefined) {
+		if (options && options.resolveOptions !== undefined) {
 			this.resolveOptions = options.resolveOptions;
 		}
 
-		// Info from Build
-		this._contextDependencies = new Set([this.context]);
-
-		if (typeof options.mode !== "string") {
+		if (options && typeof options.mode !== "string") {
 			throw new Error("options.mode is a required option");
 		}
 
 		this._identifier = this._createIdentifier();
+		this._forceBuild = true;
+	}
+
+	/**
+	 * @returns {SourceTypes} types available (do not mutate)
+	 */
+	getSourceTypes() {
+		return JS_TYPES;
 	}
 
+	/**
+	 * Assuming this module is in the cache. Update the (cached) module with
+	 * the fresh module from the factory. Usually updates internal references
+	 * and properties.
+	 * @param {Module} module fresh module
+	 * @returns {void}
+	 */
 	updateCacheModule(module) {
-		this.resolveDependencies = module.resolveDependencies;
-		this.options = module.options;
-		this.resolveOptions = module.resolveOptions;
+		const m = /** @type {ContextModule} */ (module);
+		this.resolveDependencies = m.resolveDependencies;
+		this.options = m.options;
 	}
 
-	prettyRegExp(regexString) {
-		// remove the "/" at the front and the beginning
-		// "/foo/" -> "foo"
-		return regexString.substring(1, regexString.length - 1);
+	/**
+	 * Assuming this module is in the cache. Remove internal references to allow freeing some memory.
+	 */
+	cleanupForCache() {
+		super.cleanupForCache();
+		this.resolveDependencies = undefined;
+	}
+
+	/**
+	 * @private
+	 * @param {RegExp} regexString RegExp as a string
+	 * @param {boolean=} stripSlash do we need to strip a slsh
+	 * @returns {string} pretty RegExp
+	 */
+	_prettyRegExp(regexString, stripSlash = true) {
+		const str = stripSlash
+			? regexString.source + regexString.flags
+			: `${regexString}`;
+		return str.replace(/!/g, "%21").replace(/\|/g, "%7C");
 	}
 
 	_createIdentifier() {
-		let identifier = this.context;
+		let identifier =
+			this.context ||
+			(typeof this.options.resource === "string" ||
+			this.options.resource === false
+				? `${this.options.resource}`
+				: this.options.resource.join("|"));
 		if (this.options.resourceQuery) {
-			identifier += ` ${this.options.resourceQuery}`;
+			identifier += `|${this.options.resourceQuery}`;
+		}
+		if (this.options.resourceFragment) {
+			identifier += `|${this.options.resourceFragment}`;
 		}
 		if (this.options.mode) {
-			identifier += ` ${this.options.mode}`;
+			identifier += `|${this.options.mode}`;
 		}
 		if (!this.options.recursive) {
-			identifier += " nonrecursive";
+			identifier += "|nonrecursive";
 		}
 		if (this.options.addon) {
-			identifier += ` ${this.options.addon}`;
+			identifier += `|${this.options.addon}`;
 		}
 		if (this.options.regExp) {
-			identifier += ` ${this.options.regExp}`;
+			identifier += `|${this._prettyRegExp(this.options.regExp, false)}`;
 		}
 		if (this.options.include) {
-			identifier += ` include: ${this.options.include}`;
+			identifier += `|include: ${this._prettyRegExp(
+				this.options.include,
+				false
+			)}`;
 		}
 		if (this.options.exclude) {
-			identifier += ` exclude: ${this.options.exclude}`;
+			identifier += `|exclude: ${this._prettyRegExp(
+				this.options.exclude,
+				false
+			)}`;
+		}
+		if (this.options.referencedExports) {
+			identifier += `|referencedExports: ${JSON.stringify(
+				this.options.referencedExports
+			)}`;
+		}
+		if (this.options.chunkName) {
+			identifier += `|chunkName: ${this.options.chunkName}`;
 		}
 		if (this.options.groupOptions) {
-			identifier += ` groupOptions: ${JSON.stringify(
+			identifier += `|groupOptions: ${JSON.stringify(
 				this.options.groupOptions
 			)}`;
 		}
 		if (this.options.namespaceObject === "strict") {
-			identifier += " strict namespace object";
+			identifier += "|strict namespace object";
 		} else if (this.options.namespaceObject) {
-			identifier += " namespace object";
+			identifier += "|namespace object";
+		}
+		if (this.layer) {
+			identifier += `|layer: ${this.layer}`;
 		}
 
 		return identifier;
 	}
 
+	/**
+	 * @returns {string} a unique identifier of the module
+	 */
 	identifier() {
 		return this._identifier;
 	}
 
+	/**
+	 * @param {RequestShortener} requestShortener the request shortener
+	 * @returns {string} a user readable identifier of the module
+	 */
 	readableIdentifier(requestShortener) {
-		let identifier = requestShortener.shorten(this.context);
+		let identifier;
+		if (this.context) {
+			identifier = `${requestShortener.shorten(this.context)}/`;
+		} else if (
+			typeof this.options.resource === "string" ||
+			this.options.resource === false
+		) {
+			identifier = `${requestShortener.shorten(`${this.options.resource}`)}/`;
+		} else {
+			identifier = this.options.resource
+				.map(r => `${requestShortener.shorten(r)}/`)
+				.join(" ");
+		}
 		if (this.options.resourceQuery) {
 			identifier += ` ${this.options.resourceQuery}`;
 		}
@@ -137,18 +299,28 @@ class ContextModule extends Module {
 			identifier += ` ${requestShortener.shorten(this.options.addon)}`;
 		}
 		if (this.options.regExp) {
-			identifier += ` ${this.prettyRegExp(this.options.regExp + "")}`;
+			identifier += ` ${this._prettyRegExp(this.options.regExp)}`;
 		}
 		if (this.options.include) {
-			identifier += ` include: ${this.prettyRegExp(this.options.include + "")}`;
+			identifier += ` include: ${this._prettyRegExp(this.options.include)}`;
 		}
 		if (this.options.exclude) {
-			identifier += ` exclude: ${this.prettyRegExp(this.options.exclude + "")}`;
+			identifier += ` exclude: ${this._prettyRegExp(this.options.exclude)}`;
+		}
+		if (this.options.referencedExports) {
+			identifier += ` referencedExports: ${this.options.referencedExports
+				.map(e => e.join("."))
+				.join(", ")}`;
+		}
+		if (this.options.chunkName) {
+			identifier += ` chunkName: ${this.options.chunkName}`;
 		}
 		if (this.options.groupOptions) {
 			const groupOptions = this.options.groupOptions;
 			for (const key of Object.keys(groupOptions)) {
-				identifier += ` ${key}: ${groupOptions[key]}`;
+				identifier += ` ${key}: ${
+					groupOptions[/** @type {keyof RawChunkGroupOptions} */ (key)]
+				}`;
 			}
 		}
 		if (this.options.namespaceObject === "strict") {
@@ -160,8 +332,36 @@ class ContextModule extends Module {
 		return identifier;
 	}
 
+	/**
+	 * @param {LibIdentOptions} options options
+	 * @returns {string | null} an identifier for library inclusion
+	 */
 	libIdent(options) {
-		let identifier = contextify(options.context, this.context);
+		let identifier;
+
+		if (this.context) {
+			identifier = contextify(
+				options.context,
+				this.context,
+				options.associatedObjectForCache
+			);
+		} else if (typeof this.options.resource === "string") {
+			identifier = contextify(
+				options.context,
+				this.options.resource,
+				options.associatedObjectForCache
+			);
+		} else if (this.options.resource === false) {
+			identifier = "false";
+		} else {
+			identifier = this.options.resource
+				.map(res =>
+					contextify(options.context, res, options.associatedObjectForCache)
+				)
+				.join(" ");
+		}
+
+		if (this.layer) identifier = `(${this.layer})/${identifier}`;
 		if (this.options.mode) {
 			identifier += ` ${this.options.mode}`;
 		}
@@ -169,39 +369,85 @@ class ContextModule extends Module {
 			identifier += " recursive";
 		}
 		if (this.options.addon) {
-			identifier += ` ${contextify(options.context, this.options.addon)}`;
+			identifier += ` ${contextify(
+				options.context,
+				this.options.addon,
+				options.associatedObjectForCache
+			)}`;
 		}
 		if (this.options.regExp) {
-			identifier += ` ${this.prettyRegExp(this.options.regExp + "")}`;
+			identifier += ` ${this._prettyRegExp(this.options.regExp)}`;
 		}
 		if (this.options.include) {
-			identifier += ` include: ${this.prettyRegExp(this.options.include + "")}`;
+			identifier += ` include: ${this._prettyRegExp(this.options.include)}`;
 		}
 		if (this.options.exclude) {
-			identifier += ` exclude: ${this.prettyRegExp(this.options.exclude + "")}`;
+			identifier += ` exclude: ${this._prettyRegExp(this.options.exclude)}`;
+		}
+		if (this.options.referencedExports) {
+			identifier += ` referencedExports: ${this.options.referencedExports
+				.map(e => e.join("."))
+				.join(", ")}`;
 		}
 
 		return identifier;
 	}
 
-	needRebuild(fileTimestamps, contextTimestamps) {
-		const ts = contextTimestamps.get(this.context);
-		if (!ts) {
-			return true;
-		}
+	/**
+	 * @returns {void}
+	 */
+	invalidateBuild() {
+		this._forceBuild = true;
+	}
+
+	/**
+	 * @param {NeedBuildContext} context context info
+	 * @param {NeedBuildCallback} callback callback function, returns true, if the module needs a rebuild
+	 * @returns {void}
+	 */
+	needBuild({ fileSystemInfo }, callback) {
+		// build if enforced
+		if (this._forceBuild) return callback(null, true);
 
-		return ts >= this.buildInfo.builtTime;
+		const buildInfo = /** @type {BuildInfo} */ (this.buildInfo);
+
+		// always build when we have no snapshot and context
+		if (!buildInfo.snapshot)
+			return callback(null, Boolean(this.context || this.options.resource));
+
+		fileSystemInfo.checkSnapshotValid(buildInfo.snapshot, (err, valid) => {
+			callback(err, !valid);
+		});
 	}
 
+	/**
+	 * @param {WebpackOptions} options webpack options
+	 * @param {Compilation} compilation the compilation
+	 * @param {ResolverWithOptions} resolver the resolver
+	 * @param {InputFileSystem} fs the file system
+	 * @param {BuildCallback} callback callback function
+	 * @returns {void}
+	 */
 	build(options, compilation, resolver, fs, callback) {
-		this.built = true;
-		this.buildMeta = {};
+		this._forceBuild = false;
+		/** @type {BuildMeta} */
+		this.buildMeta = {
+			exportsType: "default",
+			defaultObject: "redirect-warn"
+		};
 		this.buildInfo = {
-			builtTime: Date.now(),
-			contextDependencies: this._contextDependencies
+			snapshot: undefined
 		};
-		this.resolveDependencies(fs, this.options, (err, dependencies) => {
-			if (err) return callback(err);
+		this.dependencies.length = 0;
+		this.blocks.length = 0;
+		const startTime = Date.now();
+		/** @type {ResolveDependencies} */
+		(this.resolveDependencies)(fs, this.options, (err, dependencies) => {
+			if (err) {
+				return callback(
+					makeWebpackError(err, "ContextModule.resolveDependencies")
+				);
+			}
 
 			// abort if something failed
 			// this will create an empty context
@@ -217,6 +463,12 @@ class ContextModule extends Module {
 				};
 				dep.request = this.options.addon + dep.request;
 			}
+			dependencies.sort(
+				concatComparators(
+					compareSelect(a => a.loc, compareLocations),
+					keepOriginalOrder(this.dependencies)
+				)
+			);
 
 			if (this.options.mode === "sync" || this.options.mode === "eager") {
 				// if we have an sync or eager context
@@ -226,12 +478,10 @@ class ContextModule extends Module {
 				// for the lazy-once mode create a new async dependency block
 				// and add that block to this context
 				if (dependencies.length > 0) {
-					const block = new AsyncDependenciesBlock(
-						Object.assign({}, this.options.groupOptions, {
-							name: this.options.chunkName
-						}),
-						this
-					);
+					const block = new AsyncDependenciesBlock({
+						...this.options.groupOptions,
+						name: this.options.chunkName
+					});
 					for (const dep of dependencies) {
 						block.addDependency(dep);
 					}
@@ -256,17 +506,17 @@ class ContextModule extends Module {
 						if (!/\[(index|request)\]/.test(chunkName)) {
 							chunkName += "[index]";
 						}
-						chunkName = chunkName.replace(/\[index\]/g, index++);
+						chunkName = chunkName.replace(/\[index\]/g, `${index++}`);
 						chunkName = chunkName.replace(
 							/\[request\]/g,
 							Template.toPath(dep.userRequest)
 						);
 					}
 					const block = new AsyncDependenciesBlock(
-						Object.assign({}, this.options.groupOptions, {
+						{
+							...this.options.groupOptions,
 							name: chunkName
-						}),
-						dep.module,
+						},
 						dep.loc,
 						dep.userRequest
 					);
@@ -275,101 +525,204 @@ class ContextModule extends Module {
 				}
 			} else {
 				callback(
-					new Error(`Unsupported mode "${this.options.mode}" in context`)
+					new WebpackError(`Unsupported mode "${this.options.mode}" in context`)
 				);
 				return;
 			}
-			callback();
+			if (!this.context && !this.options.resource) return callback();
+
+			compilation.fileSystemInfo.createSnapshot(
+				startTime,
+				null,
+				this.context
+					? [this.context]
+					: typeof this.options.resource === "string"
+						? [this.options.resource]
+						: /** @type {string[]} */ (this.options.resource),
+				null,
+				SNAPSHOT_OPTIONS,
+				(err, snapshot) => {
+					if (err) return callback(err);
+					/** @type {BuildInfo} */
+					(this.buildInfo).snapshot = snapshot;
+					callback();
+				}
+			);
 		});
 	}
 
-	getUserRequestMap(dependencies) {
+	/**
+	 * @param {LazySet} fileDependencies set where file dependencies are added to
+	 * @param {LazySet} contextDependencies set where context dependencies are added to
+	 * @param {LazySet} missingDependencies set where missing dependencies are added to
+	 * @param {LazySet} buildDependencies set where build dependencies are added to
+	 */
+	addCacheDependencies(
+		fileDependencies,
+		contextDependencies,
+		missingDependencies,
+		buildDependencies
+	) {
+		if (this.context) {
+			contextDependencies.add(this.context);
+		} else if (typeof this.options.resource === "string") {
+			contextDependencies.add(this.options.resource);
+		} else if (this.options.resource === false) {
+			// Do nothing
+		} else {
+			for (const res of this.options.resource) contextDependencies.add(res);
+		}
+	}
+
+	/**
+	 * @param {Dependency[]} dependencies all dependencies
+	 * @param {ChunkGraph} chunkGraph chunk graph
+	 * @returns {Map} map with user requests
+	 */
+	getUserRequestMap(dependencies, chunkGraph) {
+		const moduleGraph = chunkGraph.moduleGraph;
 		// if we filter first we get a new array
-		// therefor we dont need to create a clone of dependencies explicitly
+		// therefore we don't need to create a clone of dependencies explicitly
 		// therefore the order of this is !important!
-		return dependencies
-			.filter(dependency => dependency.module)
-			.sort((a, b) => {
-				if (a.userRequest === b.userRequest) {
-					return 0;
-				}
-				return a.userRequest < b.userRequest ? -1 : 1;
-			})
-			.reduce((map, dep) => {
-				map[dep.userRequest] = dep.module.id;
-				return map;
-			}, Object.create(null));
+		const sortedDependencies =
+			/** @type {ContextElementDependency[]} */
+			(dependencies)
+				.filter(dependency => moduleGraph.getModule(dependency))
+				.sort((a, b) => {
+					if (a.userRequest === b.userRequest) {
+						return 0;
+					}
+					return a.userRequest < b.userRequest ? -1 : 1;
+				});
+		const map = Object.create(null);
+		for (const dep of sortedDependencies) {
+			const module = /** @type {Module} */ (moduleGraph.getModule(dep));
+			map[dep.userRequest] = chunkGraph.getModuleId(module);
+		}
+		return map;
 	}
 
-	getFakeMap(dependencies) {
+	/**
+	 * @param {Dependency[]} dependencies all dependencies
+	 * @param {ChunkGraph} chunkGraph chunk graph
+	 * @returns {FakeMap | FakeMapType} fake map
+	 */
+	getFakeMap(dependencies, chunkGraph) {
 		if (!this.options.namespaceObject) {
 			return 9;
 		}
+		const moduleGraph = chunkGraph.moduleGraph;
+		// bitfield
+		let hasType = 0;
+		const comparator = compareModulesById(chunkGraph);
 		// if we filter first we get a new array
-		// therefor we dont need to create a clone of dependencies explicitly
+		// therefore we don't need to create a clone of dependencies explicitly
 		// therefore the order of this is !important!
-		let hasNonHarmony = false;
-		let hasNamespace = false;
-		let hasNamed = false;
-		const fakeMap = dependencies
-			.filter(dependency => dependency.module)
-			.sort((a, b) => {
-				return b.module.id - a.module.id;
-			})
-			.reduce((map, dep) => {
-				const exportsType =
-					dep.module.buildMeta && dep.module.buildMeta.exportsType;
-				const id = dep.module.id;
-				if (!exportsType) {
-					map[id] = this.options.namespaceObject === "strict" ? 1 : 7;
-					hasNonHarmony = true;
-				} else if (exportsType === "namespace") {
-					map[id] = 9;
-					hasNamespace = true;
-				} else if (exportsType === "named") {
-					map[id] = 3;
-					hasNamed = true;
-				}
-				return map;
-			}, Object.create(null));
-		if (!hasNamespace && hasNonHarmony && !hasNamed) {
-			return this.options.namespaceObject === "strict" ? 1 : 7;
+		const sortedModules = dependencies
+			.map(
+				dependency => /** @type {Module} */ (moduleGraph.getModule(dependency))
+			)
+			.filter(Boolean)
+			.sort(comparator);
+		/** @type {FakeMap} */
+		const fakeMap = Object.create(null);
+		for (const module of sortedModules) {
+			const exportsType = module.getExportsType(
+				moduleGraph,
+				this.options.namespaceObject === "strict"
+			);
+			const id = /** @type {ModuleId} */ (chunkGraph.getModuleId(module));
+			switch (exportsType) {
+				case "namespace":
+					fakeMap[id] = 9;
+					hasType |= 1;
+					break;
+				case "dynamic":
+					fakeMap[id] = 7;
+					hasType |= 2;
+					break;
+				case "default-only":
+					fakeMap[id] = 1;
+					hasType |= 4;
+					break;
+				case "default-with-named":
+					fakeMap[id] = 3;
+					hasType |= 8;
+					break;
+				default:
+					throw new Error(`Unexpected exports type ${exportsType}`);
+			}
 		}
-		if (hasNamespace && !hasNonHarmony && !hasNamed) {
+		if (hasType === 1) {
 			return 9;
 		}
-		if (!hasNamespace && !hasNonHarmony && hasNamed) {
+		if (hasType === 2) {
+			return 7;
+		}
+		if (hasType === 4) {
+			return 1;
+		}
+		if (hasType === 8) {
 			return 3;
 		}
-		if (!hasNamespace && !hasNonHarmony && !hasNamed) {
+		if (hasType === 0) {
 			return 9;
 		}
 		return fakeMap;
 	}
 
+	/**
+	 * @param {FakeMap | FakeMapType} fakeMap fake map
+	 * @returns {string} fake map init statement
+	 */
 	getFakeMapInitStatement(fakeMap) {
 		return typeof fakeMap === "object"
 			? `var fakeMap = ${JSON.stringify(fakeMap, null, "\t")};`
 			: "";
 	}
 
-	getReturn(type) {
+	/**
+	 * @param {FakeMapType} type type
+	 * @param {boolean=} asyncModule is async module
+	 * @returns {string} return result
+	 */
+	getReturn(type, asyncModule) {
 		if (type === 9) {
-			return "__webpack_require__(id)";
+			return `${RuntimeGlobals.require}(id)`;
 		}
-		return `__webpack_require__.t(id, ${type})`;
+		return `${RuntimeGlobals.createFakeNamespaceObject}(id, ${type}${
+			asyncModule ? " | 16" : ""
+		})`;
 	}
 
-	getReturnModuleObjectSource(fakeMap, fakeMapDataExpression = "fakeMap[id]") {
+	/**
+	 * @param {FakeMap | FakeMapType} fakeMap fake map
+	 * @param {boolean=} asyncModule us async module
+	 * @param {string=} fakeMapDataExpression fake map data expression
+	 * @returns {string} module object source
+	 */
+	getReturnModuleObjectSource(
+		fakeMap,
+		asyncModule,
+		fakeMapDataExpression = "fakeMap[id]"
+	) {
 		if (typeof fakeMap === "number") {
-			return `return ${this.getReturn(fakeMap)};`;
+			return `return ${this.getReturn(fakeMap, asyncModule)};`;
 		}
-		return `return __webpack_require__.t(id, ${fakeMapDataExpression})`;
+		return `return ${
+			RuntimeGlobals.createFakeNamespaceObject
+		}(id, ${fakeMapDataExpression}${asyncModule ? " | 16" : ""})`;
 	}
 
-	getSyncSource(dependencies, id) {
-		const map = this.getUserRequestMap(dependencies);
-		const fakeMap = this.getFakeMap(dependencies);
+	/**
+	 * @param {Dependency[]} dependencies dependencies
+	 * @param {ModuleId} id module id
+	 * @param {ChunkGraph} chunkGraph the chunk graph
+	 * @returns {string} source code
+	 */
+	getSyncSource(dependencies, id, chunkGraph) {
+		const map = this.getUserRequestMap(dependencies, chunkGraph);
+		const fakeMap = this.getFakeMap(dependencies, chunkGraph);
 		const returnModuleObject = this.getReturnModuleObjectSource(fakeMap);
 
 		return `var map = ${JSON.stringify(map, null, "\t")};
@@ -380,13 +733,12 @@ function webpackContext(req) {
 	${returnModuleObject}
 }
 function webpackContextResolve(req) {
-	var id = map[req];
-	if(!(id + 1)) { // check for number or string
+	if(!${RuntimeGlobals.hasOwnProperty}(map, req)) {
 		var e = new Error("Cannot find module '" + req + "'");
 		e.code = 'MODULE_NOT_FOUND';
 		throw e;
 	}
-	return id;
+	return map[req];
 }
 webpackContext.keys = function webpackContextKeys() {
 	return Object.keys(map);
@@ -396,9 +748,15 @@ module.exports = webpackContext;
 webpackContext.id = ${JSON.stringify(id)};`;
 	}
 
-	getWeakSyncSource(dependencies, id) {
-		const map = this.getUserRequestMap(dependencies);
-		const fakeMap = this.getFakeMap(dependencies);
+	/**
+	 * @param {Dependency[]} dependencies dependencies
+	 * @param {ModuleId} id module id
+	 * @param {ChunkGraph} chunkGraph the chunk graph
+	 * @returns {string} source code
+	 */
+	getWeakSyncSource(dependencies, id, chunkGraph) {
+		const map = this.getUserRequestMap(dependencies, chunkGraph);
+		const fakeMap = this.getFakeMap(dependencies, chunkGraph);
 		const returnModuleObject = this.getReturnModuleObjectSource(fakeMap);
 
 		return `var map = ${JSON.stringify(map, null, "\t")};
@@ -406,7 +764,7 @@ ${this.getFakeMapInitStatement(fakeMap)}
 
 function webpackContext(req) {
 	var id = webpackContextResolve(req);
-	if(!__webpack_require__.m[id]) {
+	if(!${RuntimeGlobals.moduleFactories}[id]) {
 		var e = new Error("Module '" + req + "' ('" + id + "') is not available (weak dependency)");
 		e.code = 'MODULE_NOT_FOUND';
 		throw e;
@@ -414,13 +772,12 @@ function webpackContext(req) {
 	${returnModuleObject}
 }
 function webpackContextResolve(req) {
-	var id = map[req];
-	if(!(id + 1)) { // check for number or string
+	if(!${RuntimeGlobals.hasOwnProperty}(map, req)) {
 		var e = new Error("Cannot find module '" + req + "'");
 		e.code = 'MODULE_NOT_FOUND';
 		throw e;
 	}
-	return id;
+	return map[req];
 }
 webpackContext.keys = function webpackContextKeys() {
 	return Object.keys(map);
@@ -430,17 +787,28 @@ webpackContext.id = ${JSON.stringify(id)};
 module.exports = webpackContext;`;
 	}
 
-	getAsyncWeakSource(dependencies, id) {
-		const map = this.getUserRequestMap(dependencies);
-		const fakeMap = this.getFakeMap(dependencies);
-		const returnModuleObject = this.getReturnModuleObjectSource(fakeMap);
+	/**
+	 * @param {Dependency[]} dependencies dependencies
+	 * @param {ModuleId} id module id
+	 * @param {object} context context
+	 * @param {ChunkGraph} context.chunkGraph the chunk graph
+	 * @param {RuntimeTemplate} context.runtimeTemplate the chunk graph
+	 * @returns {string} source code
+	 */
+	getAsyncWeakSource(dependencies, id, { chunkGraph, runtimeTemplate }) {
+		const arrow = runtimeTemplate.supportsArrowFunction();
+		const map = this.getUserRequestMap(dependencies, chunkGraph);
+		const fakeMap = this.getFakeMap(dependencies, chunkGraph);
+		const returnModuleObject = this.getReturnModuleObjectSource(fakeMap, true);
 
 		return `var map = ${JSON.stringify(map, null, "\t")};
 ${this.getFakeMapInitStatement(fakeMap)}
 
 function webpackAsyncContext(req) {
-	return webpackAsyncContextResolve(req).then(function(id) {
-		if(!__webpack_require__.m[id]) {
+	return webpackAsyncContextResolve(req).then(${
+		arrow ? "id =>" : "function(id)"
+	} {
+		if(!${RuntimeGlobals.moduleFactories}[id]) {
 			var e = new Error("Module '" + req + "' ('" + id + "') is not available (weak dependency)");
 			e.code = 'MODULE_NOT_FOUND';
 			throw e;
@@ -451,33 +819,41 @@ function webpackAsyncContext(req) {
 function webpackAsyncContextResolve(req) {
 	// Here Promise.resolve().then() is used instead of new Promise() to prevent
 	// uncaught exception popping up in devtools
-	return Promise.resolve().then(function() {
-		var id = map[req];
-		if(!(id + 1)) { // check for number or string
+	return Promise.resolve().then(${arrow ? "() =>" : "function()"} {
+		if(!${RuntimeGlobals.hasOwnProperty}(map, req)) {
 			var e = new Error("Cannot find module '" + req + "'");
 			e.code = 'MODULE_NOT_FOUND';
 			throw e;
 		}
-		return id;
+		return map[req];
 	});
 }
-webpackAsyncContext.keys = function webpackAsyncContextKeys() {
-	return Object.keys(map);
-};
+webpackAsyncContext.keys = ${runtimeTemplate.returningFunction(
+			"Object.keys(map)"
+		)};
 webpackAsyncContext.resolve = webpackAsyncContextResolve;
 webpackAsyncContext.id = ${JSON.stringify(id)};
 module.exports = webpackAsyncContext;`;
 	}
 
-	getEagerSource(dependencies, id) {
-		const map = this.getUserRequestMap(dependencies);
-		const fakeMap = this.getFakeMap(dependencies);
+	/**
+	 * @param {Dependency[]} dependencies dependencies
+	 * @param {ModuleId} id module id
+	 * @param {object} context context
+	 * @param {ChunkGraph} context.chunkGraph the chunk graph
+	 * @param {RuntimeTemplate} context.runtimeTemplate the chunk graph
+	 * @returns {string} source code
+	 */
+	getEagerSource(dependencies, id, { chunkGraph, runtimeTemplate }) {
+		const arrow = runtimeTemplate.supportsArrowFunction();
+		const map = this.getUserRequestMap(dependencies, chunkGraph);
+		const fakeMap = this.getFakeMap(dependencies, chunkGraph);
 		const thenFunction =
 			fakeMap !== 9
-				? `function(id) {
-		${this.getReturnModuleObjectSource(fakeMap)}
+				? `${arrow ? "id =>" : "function(id)"} {
+		${this.getReturnModuleObjectSource(fakeMap, true)}
 	}`
-				: "__webpack_require__";
+				: RuntimeGlobals.require;
 		return `var map = ${JSON.stringify(map, null, "\t")};
 ${this.getFakeMapInitStatement(fakeMap)}
 
@@ -487,37 +863,48 @@ function webpackAsyncContext(req) {
 function webpackAsyncContextResolve(req) {
 	// Here Promise.resolve().then() is used instead of new Promise() to prevent
 	// uncaught exception popping up in devtools
-	return Promise.resolve().then(function() {
-		var id = map[req];
-		if(!(id + 1)) { // check for number or string
+	return Promise.resolve().then(${arrow ? "() =>" : "function()"} {
+		if(!${RuntimeGlobals.hasOwnProperty}(map, req)) {
 			var e = new Error("Cannot find module '" + req + "'");
 			e.code = 'MODULE_NOT_FOUND';
 			throw e;
 		}
-		return id;
+		return map[req];
 	});
 }
-webpackAsyncContext.keys = function webpackAsyncContextKeys() {
-	return Object.keys(map);
-};
+webpackAsyncContext.keys = ${runtimeTemplate.returningFunction(
+			"Object.keys(map)"
+		)};
 webpackAsyncContext.resolve = webpackAsyncContextResolve;
 webpackAsyncContext.id = ${JSON.stringify(id)};
 module.exports = webpackAsyncContext;`;
 	}
 
-	getLazyOnceSource(block, dependencies, id, runtimeTemplate) {
+	/**
+	 * @param {AsyncDependenciesBlock} block block
+	 * @param {Dependency[]} dependencies dependencies
+	 * @param {ModuleId} id module id
+	 * @param {object} options options object
+	 * @param {RuntimeTemplate} options.runtimeTemplate the runtime template
+	 * @param {ChunkGraph} options.chunkGraph the chunk graph
+	 * @returns {string} source code
+	 */
+	getLazyOnceSource(block, dependencies, id, { runtimeTemplate, chunkGraph }) {
 		const promise = runtimeTemplate.blockPromise({
+			chunkGraph,
 			block,
-			message: "lazy-once context"
+			message: "lazy-once context",
+			runtimeRequirements: new Set()
 		});
-		const map = this.getUserRequestMap(dependencies);
-		const fakeMap = this.getFakeMap(dependencies);
+		const arrow = runtimeTemplate.supportsArrowFunction();
+		const map = this.getUserRequestMap(dependencies, chunkGraph);
+		const fakeMap = this.getFakeMap(dependencies, chunkGraph);
 		const thenFunction =
 			fakeMap !== 9
-				? `function(id) {
-		${this.getReturnModuleObjectSource(fakeMap)};
+				? `${arrow ? "id =>" : "function(id)"} {
+		${this.getReturnModuleObjectSource(fakeMap, true)};
 	}`
-				: "__webpack_require__";
+				: RuntimeGlobals.require;
 
 		return `var map = ${JSON.stringify(map, null, "\t")};
 ${this.getFakeMapInitStatement(fakeMap)}
@@ -526,319 +913,344 @@ function webpackAsyncContext(req) {
 	return webpackAsyncContextResolve(req).then(${thenFunction});
 }
 function webpackAsyncContextResolve(req) {
-	return ${promise}.then(function() {
-		var id = map[req];
-		if(!(id + 1)) { // check for number or string
+	return ${promise}.then(${arrow ? "() =>" : "function()"} {
+		if(!${RuntimeGlobals.hasOwnProperty}(map, req)) {
 			var e = new Error("Cannot find module '" + req + "'");
 			e.code = 'MODULE_NOT_FOUND';
 			throw e;
 		}
-		return id;
+		return map[req];
 	});
 }
-webpackAsyncContext.keys = function webpackAsyncContextKeys() {
-	return Object.keys(map);
-};
+webpackAsyncContext.keys = ${runtimeTemplate.returningFunction(
+			"Object.keys(map)"
+		)};
 webpackAsyncContext.resolve = webpackAsyncContextResolve;
 webpackAsyncContext.id = ${JSON.stringify(id)};
 module.exports = webpackAsyncContext;`;
 	}
 
-	getLazySource(blocks, id) {
+	/**
+	 * @param {AsyncDependenciesBlock[]} blocks blocks
+	 * @param {ModuleId} id module id
+	 * @param {object} context context
+	 * @param {ChunkGraph} context.chunkGraph the chunk graph
+	 * @param {RuntimeTemplate} context.runtimeTemplate the chunk graph
+	 * @returns {string} source code
+	 */
+	getLazySource(blocks, id, { chunkGraph, runtimeTemplate }) {
+		const moduleGraph = chunkGraph.moduleGraph;
+		const arrow = runtimeTemplate.supportsArrowFunction();
 		let hasMultipleOrNoChunks = false;
-		const fakeMap = this.getFakeMap(blocks.map(b => b.dependencies[0]));
-		const map = blocks
-			.filter(block => block.dependencies[0].module)
-			.map(block => ({
-				dependency: block.dependencies[0],
-				block: block,
-				userRequest: block.dependencies[0].userRequest
-			}))
-			.sort((a, b) => {
-				if (a.userRequest === b.userRequest) return 0;
-				return a.userRequest < b.userRequest ? -1 : 1;
+		let hasNoChunk = true;
+		const fakeMap = this.getFakeMap(
+			blocks.map(b => b.dependencies[0]),
+			chunkGraph
+		);
+		const hasFakeMap = typeof fakeMap === "object";
+		/** @typedef {{userRequest: string, dependency: ContextElementDependency, chunks: undefined | Chunk[], module: Module, block: AsyncDependenciesBlock}} Item */
+		/**
+		 * @type {Item[]}
+		 */
+		const items = blocks
+			.map(block => {
+				const dependency =
+					/** @type {ContextElementDependency} */
+					(block.dependencies[0]);
+				return {
+					dependency,
+					module: /** @type {Module} */ (moduleGraph.getModule(dependency)),
+					block,
+					userRequest: dependency.userRequest,
+					chunks: undefined
+				};
 			})
-			.reduce((map, item) => {
-				const chunks =
-					(item.block.chunkGroup && item.block.chunkGroup.chunks) || [];
-				if (chunks.length !== 1) {
-					hasMultipleOrNoChunks = true;
-				}
-				const arrayStart = [item.dependency.module.id];
-				if (typeof fakeMap === "object") {
-					arrayStart.push(fakeMap[item.dependency.module.id]);
+			.filter(item => item.module);
+		for (const item of items) {
+			const chunkGroup = chunkGraph.getBlockChunkGroup(item.block);
+			const chunks = (chunkGroup && chunkGroup.chunks) || [];
+			item.chunks = chunks;
+			if (chunks.length > 0) {
+				hasNoChunk = false;
+			}
+			if (chunks.length !== 1) {
+				hasMultipleOrNoChunks = true;
+			}
+		}
+		const shortMode = hasNoChunk && !hasFakeMap;
+		const sortedItems = items.sort((a, b) => {
+			if (a.userRequest === b.userRequest) return 0;
+			return a.userRequest < b.userRequest ? -1 : 1;
+		});
+		/** @type {Record} */
+		const map = Object.create(null);
+		for (const item of sortedItems) {
+			const moduleId =
+				/** @type {ModuleId} */
+				(chunkGraph.getModuleId(item.module));
+			if (shortMode) {
+				map[item.userRequest] = moduleId;
+			} else {
+				/** @type {(ModuleId | ChunkId)[]} */
+				const arrayStart = [moduleId];
+				if (hasFakeMap) {
+					arrayStart.push(fakeMap[moduleId]);
 				}
 				map[item.userRequest] = arrayStart.concat(
-					chunks.map(chunk => chunk.id)
+					/** @type {Chunk[]} */
+					(item.chunks).map(chunk => /** @type {ChunkId} */ (chunk.id))
 				);
+			}
+		}
 
-				return map;
-			}, Object.create(null));
-
-		const chunksStartPosition = typeof fakeMap === "object" ? 2 : 1;
-		const requestPrefix = hasMultipleOrNoChunks
-			? `Promise.all(ids.slice(${chunksStartPosition}).map(__webpack_require__.e))`
-			: `__webpack_require__.e(ids[${chunksStartPosition}])`;
+		const chunksStartPosition = hasFakeMap ? 2 : 1;
+		const requestPrefix = hasNoChunk
+			? "Promise.resolve()"
+			: hasMultipleOrNoChunks
+				? `Promise.all(ids.slice(${chunksStartPosition}).map(${RuntimeGlobals.ensureChunk}))`
+				: `${RuntimeGlobals.ensureChunk}(ids[${chunksStartPosition}])`;
 		const returnModuleObject = this.getReturnModuleObjectSource(
 			fakeMap,
-			"ids[1]"
+			true,
+			shortMode ? "invalid" : "ids[1]"
 		);
 
-		return `var map = ${JSON.stringify(map, null, "\t")};
+		const webpackAsyncContext =
+			requestPrefix === "Promise.resolve()"
+				? `
 function webpackAsyncContext(req) {
-	var ids = map[req];
-	if(!ids) {
-		return Promise.resolve().then(function() {
+	return Promise.resolve().then(${arrow ? "() =>" : "function()"} {
+		if(!${RuntimeGlobals.hasOwnProperty}(map, req)) {
+			var e = new Error("Cannot find module '" + req + "'");
+			e.code = 'MODULE_NOT_FOUND';
+			throw e;
+		}
+
+		${shortMode ? "var id = map[req];" : "var ids = map[req], id = ids[0];"}
+		${returnModuleObject}
+	});
+}`
+				: `function webpackAsyncContext(req) {
+	if(!${RuntimeGlobals.hasOwnProperty}(map, req)) {
+		return Promise.resolve().then(${arrow ? "() =>" : "function()"} {
 			var e = new Error("Cannot find module '" + req + "'");
 			e.code = 'MODULE_NOT_FOUND';
 			throw e;
 		});
 	}
-	return ${requestPrefix}.then(function() {
-		var id = ids[0];
+
+	var ids = map[req], id = ids[0];
+	return ${requestPrefix}.then(${arrow ? "() =>" : "function()"} {
 		${returnModuleObject}
 	});
-}
-webpackAsyncContext.keys = function webpackAsyncContextKeys() {
-	return Object.keys(map);
-};
+}`;
+
+		return `var map = ${JSON.stringify(map, null, "\t")};
+${webpackAsyncContext}
+webpackAsyncContext.keys = ${runtimeTemplate.returningFunction(
+			"Object.keys(map)"
+		)};
 webpackAsyncContext.id = ${JSON.stringify(id)};
 module.exports = webpackAsyncContext;`;
 	}
 
-	getSourceForEmptyContext(id) {
+	/**
+	 * @param {ModuleId} id module id
+	 * @param {RuntimeTemplate} runtimeTemplate runtime template
+	 * @returns {string} source for empty async context
+	 */
+	getSourceForEmptyContext(id, runtimeTemplate) {
 		return `function webpackEmptyContext(req) {
 	var e = new Error("Cannot find module '" + req + "'");
 	e.code = 'MODULE_NOT_FOUND';
 	throw e;
 }
-webpackEmptyContext.keys = function() { return []; };
+webpackEmptyContext.keys = ${runtimeTemplate.returningFunction("[]")};
 webpackEmptyContext.resolve = webpackEmptyContext;
-module.exports = webpackEmptyContext;
-webpackEmptyContext.id = ${JSON.stringify(id)};`;
+webpackEmptyContext.id = ${JSON.stringify(id)};
+module.exports = webpackEmptyContext;`;
 	}
 
-	getSourceForEmptyAsyncContext(id) {
+	/**
+	 * @param {ModuleId} id module id
+	 * @param {RuntimeTemplate} runtimeTemplate runtime template
+	 * @returns {string} source for empty async context
+	 */
+	getSourceForEmptyAsyncContext(id, runtimeTemplate) {
+		const arrow = runtimeTemplate.supportsArrowFunction();
 		return `function webpackEmptyAsyncContext(req) {
 	// Here Promise.resolve().then() is used instead of new Promise() to prevent
 	// uncaught exception popping up in devtools
-	return Promise.resolve().then(function() {
+	return Promise.resolve().then(${arrow ? "() =>" : "function()"} {
 		var e = new Error("Cannot find module '" + req + "'");
 		e.code = 'MODULE_NOT_FOUND';
 		throw e;
 	});
 }
-webpackEmptyAsyncContext.keys = function() { return []; };
+webpackEmptyAsyncContext.keys = ${runtimeTemplate.returningFunction("[]")};
 webpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;
-module.exports = webpackEmptyAsyncContext;
-webpackEmptyAsyncContext.id = ${JSON.stringify(id)};`;
+webpackEmptyAsyncContext.id = ${JSON.stringify(id)};
+module.exports = webpackEmptyAsyncContext;`;
 	}
 
-	getSourceString(asyncMode, runtimeTemplate) {
+	/**
+	 * @param {string} asyncMode module mode
+	 * @param {CodeGenerationContext} context context info
+	 * @returns {string} the source code
+	 */
+	getSourceString(asyncMode, { runtimeTemplate, chunkGraph }) {
+		const id = /** @type {ModuleId} */ (chunkGraph.getModuleId(this));
 		if (asyncMode === "lazy") {
 			if (this.blocks && this.blocks.length > 0) {
-				return this.getLazySource(this.blocks, this.id);
+				return this.getLazySource(this.blocks, id, {
+					runtimeTemplate,
+					chunkGraph
+				});
 			}
-			return this.getSourceForEmptyAsyncContext(this.id);
+			return this.getSourceForEmptyAsyncContext(id, runtimeTemplate);
 		}
 		if (asyncMode === "eager") {
 			if (this.dependencies && this.dependencies.length > 0) {
-				return this.getEagerSource(this.dependencies, this.id);
+				return this.getEagerSource(this.dependencies, id, {
+					chunkGraph,
+					runtimeTemplate
+				});
 			}
-			return this.getSourceForEmptyAsyncContext(this.id);
+			return this.getSourceForEmptyAsyncContext(id, runtimeTemplate);
 		}
 		if (asyncMode === "lazy-once") {
 			const block = this.blocks[0];
 			if (block) {
-				return this.getLazyOnceSource(
-					block,
-					block.dependencies,
-					this.id,
-					runtimeTemplate
-				);
+				return this.getLazyOnceSource(block, block.dependencies, id, {
+					runtimeTemplate,
+					chunkGraph
+				});
 			}
-			return this.getSourceForEmptyAsyncContext(this.id);
+			return this.getSourceForEmptyAsyncContext(id, runtimeTemplate);
 		}
 		if (asyncMode === "async-weak") {
 			if (this.dependencies && this.dependencies.length > 0) {
-				return this.getAsyncWeakSource(this.dependencies, this.id);
+				return this.getAsyncWeakSource(this.dependencies, id, {
+					chunkGraph,
+					runtimeTemplate
+				});
 			}
-			return this.getSourceForEmptyAsyncContext(this.id);
+			return this.getSourceForEmptyAsyncContext(id, runtimeTemplate);
 		}
-		if (asyncMode === "weak") {
-			if (this.dependencies && this.dependencies.length > 0) {
-				return this.getWeakSyncSource(this.dependencies, this.id);
-			}
+		if (
+			asyncMode === "weak" &&
+			this.dependencies &&
+			this.dependencies.length > 0
+		) {
+			return this.getWeakSyncSource(this.dependencies, id, chunkGraph);
 		}
 		if (this.dependencies && this.dependencies.length > 0) {
-			return this.getSyncSource(this.dependencies, this.id);
+			return this.getSyncSource(this.dependencies, id, chunkGraph);
 		}
-		return this.getSourceForEmptyContext(this.id);
+		return this.getSourceForEmptyContext(id, runtimeTemplate);
 	}
 
-	getSource(sourceString) {
-		if (this.useSourceMap) {
-			return new OriginalSource(sourceString, this.identifier());
+	/**
+	 * @param {string} sourceString source content
+	 * @param {Compilation=} compilation the compilation
+	 * @returns {Source} generated source
+	 */
+	getSource(sourceString, compilation) {
+		if (this.useSourceMap || this.useSimpleSourceMap) {
+			return new OriginalSource(
+				sourceString,
+				`webpack://${makePathsRelative(
+					(compilation && compilation.compiler.context) || "",
+					this.identifier(),
+					compilation && compilation.compiler.root
+				)}`
+			);
 		}
 		return new RawSource(sourceString);
 	}
 
-	source(dependencyTemplates, runtimeTemplate) {
-		return this.getSource(
-			this.getSourceString(this.options.mode, runtimeTemplate)
+	/**
+	 * @param {CodeGenerationContext} context context for code generation
+	 * @returns {CodeGenerationResult} result
+	 */
+	codeGeneration(context) {
+		const { chunkGraph, compilation } = context;
+		const sources = new Map();
+		sources.set(
+			"javascript",
+			this.getSource(
+				this.getSourceString(this.options.mode, context),
+				compilation
+			)
 		);
+		const set = new Set();
+		const allDeps =
+			this.dependencies.length > 0
+				? /** @type {ContextElementDependency[]} */ (this.dependencies).slice()
+				: [];
+		for (const block of this.blocks)
+			for (const dep of block.dependencies)
+				allDeps.push(/** @type {ContextElementDependency} */ (dep));
+		set.add(RuntimeGlobals.module);
+		set.add(RuntimeGlobals.hasOwnProperty);
+		if (allDeps.length > 0) {
+			const asyncMode = this.options.mode;
+			set.add(RuntimeGlobals.require);
+			if (asyncMode === "weak") {
+				set.add(RuntimeGlobals.moduleFactories);
+			} else if (asyncMode === "async-weak") {
+				set.add(RuntimeGlobals.moduleFactories);
+				set.add(RuntimeGlobals.ensureChunk);
+			} else if (asyncMode === "lazy" || asyncMode === "lazy-once") {
+				set.add(RuntimeGlobals.ensureChunk);
+			}
+			if (this.getFakeMap(allDeps, chunkGraph) !== 9) {
+				set.add(RuntimeGlobals.createFakeNamespaceObject);
+			}
+		}
+		return {
+			sources,
+			runtimeRequirements: set
+		};
 	}
 
-	size() {
+	/**
+	 * @param {string=} type the source type for which the size should be estimated
+	 * @returns {number} the estimated size of the module (must be non-zero)
+	 */
+	size(type) {
 		// base penalty
-		const initialSize = 160;
+		let size = 160;
 
-		// if we dont have dependencies we stop here.
-		return this.dependencies.reduce((size, dependency) => {
+		// if we don't have dependencies we stop here.
+		for (const dependency of this.dependencies) {
 			const element = /** @type {ContextElementDependency} */ (dependency);
-			return size + 5 + element.userRequest.length;
-		}, initialSize);
+			size += 5 + element.userRequest.length;
+		}
+		return size;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this._identifier);
+		write(this._forceBuild);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this._identifier = read();
+		this._forceBuild = read();
+		super.deserialize(context);
 	}
 }
 
-// TODO remove in webpack 5
-Object.defineProperty(ContextModule.prototype, "recursive", {
-	configurable: false,
-	get: util.deprecate(
-		/**
-		 * @deprecated
-		 * @this {ContextModule}
-		 * @returns {boolean} is recursive
-		 */
-		function() {
-			return this.options.recursive;
-		},
-		"ContextModule.recursive has been moved to ContextModule.options.recursive"
-	),
-	set: util.deprecate(
-		/**
-		 * @deprecated
-		 * @this {ContextModule}
-		 * @param {boolean} value is recursive
-		 * @returns {void}
-		 */
-		function(value) {
-			this.options.recursive = value;
-		},
-		"ContextModule.recursive has been moved to ContextModule.options.recursive"
-	)
-});
-
-// TODO remove in webpack 5
-Object.defineProperty(ContextModule.prototype, "regExp", {
-	configurable: false,
-	get: util.deprecate(
-		/**
-		 * @deprecated
-		 * @this {ContextModule}
-		 * @returns {RegExp} regular expression
-		 */
-		function() {
-			return this.options.regExp;
-		},
-		"ContextModule.regExp has been moved to ContextModule.options.regExp"
-	),
-	set: util.deprecate(
-		/**
-		 * @deprecated
-		 * @this {ContextModule}
-		 * @param {RegExp} value Regular expression
-		 * @returns {void}
-		 */
-		function(value) {
-			this.options.regExp = value;
-		},
-		"ContextModule.regExp has been moved to ContextModule.options.regExp"
-	)
-});
-
-// TODO remove in webpack 5
-Object.defineProperty(ContextModule.prototype, "addon", {
-	configurable: false,
-	get: util.deprecate(
-		/**
-		 * @deprecated
-		 * @this {ContextModule}
-		 * @returns {string} addon
-		 */
-		function() {
-			return this.options.addon;
-		},
-		"ContextModule.addon has been moved to ContextModule.options.addon"
-	),
-	set: util.deprecate(
-		/**
-		 * @deprecated
-		 * @this {ContextModule}
-		 * @param {string} value addon
-		 * @returns {void}
-		 */
-		function(value) {
-			this.options.addon = value;
-		},
-		"ContextModule.addon has been moved to ContextModule.options.addon"
-	)
-});
-
-// TODO remove in webpack 5
-Object.defineProperty(ContextModule.prototype, "async", {
-	configurable: false,
-	get: util.deprecate(
-		/**
-		 * @deprecated
-		 * @this {ContextModule}
-		 * @returns {boolean} is async
-		 */
-		function() {
-			return this.options.mode;
-		},
-		"ContextModule.async has been moved to ContextModule.options.mode"
-	),
-	set: util.deprecate(
-		/**
-		 * @deprecated
-		 * @this {ContextModule}
-		 * @param {ContextMode} value Context mode
-		 * @returns {void}
-		 */
-		function(value) {
-			this.options.mode = value;
-		},
-		"ContextModule.async has been moved to ContextModule.options.mode"
-	)
-});
-
-// TODO remove in webpack 5
-Object.defineProperty(ContextModule.prototype, "chunkName", {
-	configurable: false,
-	get: util.deprecate(
-		/**
-		 * @deprecated
-		 * @this {ContextModule}
-		 * @returns {string} chunk name
-		 */
-		function() {
-			return this.options.chunkName;
-		},
-		"ContextModule.chunkName has been moved to ContextModule.options.chunkName"
-	),
-	set: util.deprecate(
-		/**
-		 * @deprecated
-		 * @this {ContextModule}
-		 * @param {string} value chunk name
-		 * @returns {void}
-		 */
-		function(value) {
-			this.options.chunkName = value;
-		},
-		"ContextModule.chunkName has been moved to ContextModule.options.chunkName"
-	)
-});
+makeSerializable(ContextModule, "webpack/lib/ContextModule");
 
 module.exports = ContextModule;
diff --git a/lib/ContextModuleFactory.js b/lib/ContextModuleFactory.js
index f5941128813..65543b5cd61 100644
--- a/lib/ContextModuleFactory.js
+++ b/lib/ContextModuleFactory.js
@@ -2,78 +2,140 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const asyncLib = require("neo-async");
-const path = require("path");
-
-const {
-	Tapable,
-	AsyncSeriesWaterfallHook,
-	SyncWaterfallHook
-} = require("tapable");
+const { AsyncSeriesWaterfallHook, SyncWaterfallHook } = require("tapable");
 const ContextModule = require("./ContextModule");
+const ModuleFactory = require("./ModuleFactory");
 const ContextElementDependency = require("./dependencies/ContextElementDependency");
+const LazySet = require("./util/LazySet");
+const { cachedSetProperty } = require("./util/cleverMerge");
+const { createFakeHook } = require("./util/deprecation");
+const { join } = require("./util/fs");
 
+/** @typedef {import("./ContextModule").ContextModuleOptions} ContextModuleOptions */
+/** @typedef {import("./ContextModule").ResolveDependenciesCallback} ResolveDependenciesCallback */
 /** @typedef {import("./Module")} Module */
+/** @typedef {import("./ModuleFactory").ModuleFactoryCreateData} ModuleFactoryCreateData */
+/** @typedef {import("./ModuleFactory").ModuleFactoryCallback} ModuleFactoryCallback */
+/** @typedef {import("./ResolverFactory")} ResolverFactory */
+/** @typedef {import("./dependencies/ContextDependency")} ContextDependency */
+/** @typedef {import("enhanced-resolve").ResolveRequest} ResolveRequest */
+/**
+ * @template T
+ * @typedef {import("./util/deprecation").FakeHook} FakeHook
+ */
+/** @typedef {import("./util/fs").IStats} IStats */
+/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
+/** @typedef {{ context: string, request: string }} ContextAlternativeRequest */
 
 const EMPTY_RESOLVE_OPTIONS = {};
 
-module.exports = class ContextModuleFactory extends Tapable {
+module.exports = class ContextModuleFactory extends ModuleFactory {
+	/**
+	 * @param {ResolverFactory} resolverFactory resolverFactory
+	 */
 	constructor(resolverFactory) {
 		super();
-		this.hooks = {
-			/** @type {AsyncSeriesWaterfallHook} */
+		/** @type {AsyncSeriesWaterfallHook<[ContextAlternativeRequest[], ContextModuleOptions]>} */
+		const alternativeRequests = new AsyncSeriesWaterfallHook([
+			"modules",
+			"options"
+		]);
+		this.hooks = Object.freeze({
+			/** @type {AsyncSeriesWaterfallHook<[TODO]>} */
 			beforeResolve: new AsyncSeriesWaterfallHook(["data"]),
-			/** @type {AsyncSeriesWaterfallHook} */
+			/** @type {AsyncSeriesWaterfallHook<[TODO]>} */
 			afterResolve: new AsyncSeriesWaterfallHook(["data"]),
-			/** @type {SyncWaterfallHook} */
+			/** @type {SyncWaterfallHook<[string[]]>} */
 			contextModuleFiles: new SyncWaterfallHook(["files"]),
-			/** @type {SyncWaterfallHook} */
-			alternatives: new AsyncSeriesWaterfallHook(["modules"])
-		};
-		this._pluginCompat.tap("ContextModuleFactory", options => {
-			switch (options.name) {
-				case "before-resolve":
-				case "after-resolve":
-				case "alternatives":
-					options.async = true;
-					break;
-			}
+			/** @type {FakeHook, "tap" | "tapAsync" | "tapPromise" | "name">>} */
+			alternatives: createFakeHook(
+				{
+					name: "alternatives",
+					/** @type {AsyncSeriesWaterfallHook<[ContextAlternativeRequest[]]>["intercept"]} */
+					intercept: interceptor => {
+						throw new Error(
+							"Intercepting fake hook ContextModuleFactory.hooks.alternatives is not possible, use ContextModuleFactory.hooks.alternativeRequests instead"
+						);
+					},
+					/** @type {AsyncSeriesWaterfallHook<[ContextAlternativeRequest[]]>["tap"]} */
+					tap: (options, fn) => {
+						alternativeRequests.tap(options, fn);
+					},
+					/** @type {AsyncSeriesWaterfallHook<[ContextAlternativeRequest[]]>["tapAsync"]} */
+					tapAsync: (options, fn) => {
+						alternativeRequests.tapAsync(options, (items, _options, callback) =>
+							fn(items, callback)
+						);
+					},
+					/** @type {AsyncSeriesWaterfallHook<[ContextAlternativeRequest[]]>["tapPromise"]} */
+					tapPromise: (options, fn) => {
+						alternativeRequests.tapPromise(options, fn);
+					}
+				},
+				"ContextModuleFactory.hooks.alternatives has deprecated in favor of ContextModuleFactory.hooks.alternativeRequests with an additional options argument.",
+				"DEP_WEBPACK_CONTEXT_MODULE_FACTORY_ALTERNATIVES"
+			),
+			alternativeRequests
 		});
 		this.resolverFactory = resolverFactory;
 	}
 
+	/**
+	 * @param {ModuleFactoryCreateData} data data object
+	 * @param {ModuleFactoryCallback} callback callback
+	 * @returns {void}
+	 */
 	create(data, callback) {
 		const context = data.context;
 		const dependencies = data.dependencies;
 		const resolveOptions = data.resolveOptions;
-		const dependency = dependencies[0];
+		const dependency = /** @type {ContextDependency} */ (dependencies[0]);
+		const fileDependencies = new LazySet();
+		const missingDependencies = new LazySet();
+		const contextDependencies = new LazySet();
 		this.hooks.beforeResolve.callAsync(
-			Object.assign(
-				{
-					context: context,
-					dependencies: dependencies,
-					resolveOptions
-				},
-				dependency.options
-			),
+			{
+				context,
+				dependencies,
+				layer: data.contextInfo.issuerLayer,
+				resolveOptions,
+				fileDependencies,
+				missingDependencies,
+				contextDependencies,
+				...dependency.options
+			},
 			(err, beforeResolveResult) => {
-				if (err) return callback(err);
+				if (err) {
+					return callback(err, {
+						fileDependencies,
+						missingDependencies,
+						contextDependencies
+					});
+				}
 
 				// Ignored
-				if (!beforeResolveResult) return callback();
+				if (!beforeResolveResult) {
+					return callback(null, {
+						fileDependencies,
+						missingDependencies,
+						contextDependencies
+					});
+				}
 
 				const context = beforeResolveResult.context;
 				const request = beforeResolveResult.request;
 				const resolveOptions = beforeResolveResult.resolveOptions;
 
-				let loaders,
-					resource,
-					loadersPrefix = "";
+				let loaders;
+				let resource;
+				let loadersPrefix = "";
 				const idx = request.lastIndexOf("!");
 				if (idx >= 0) {
-					let loadersRequest = request.substr(0, idx + 1);
+					let loadersRequest = request.slice(0, idx + 1);
 					let i;
 					for (
 						i = 0;
@@ -83,15 +145,11 @@ module.exports = class ContextModuleFactory extends Tapable {
 						loadersPrefix += "!";
 					}
 					loadersRequest = loadersRequest
-						.substr(i)
+						.slice(i)
 						.replace(/!+$/, "")
 						.replace(/!!+/g, "!");
-					if (loadersRequest === "") {
-						loaders = [];
-					} else {
-						loaders = loadersRequest.split("!");
-					}
-					resource = request.substr(idx + 1);
+					loaders = loadersRequest === "" ? [] : loadersRequest.split("!");
+					resource = request.slice(idx + 1);
 				} else {
 					loaders = [];
 					resource = request;
@@ -99,24 +157,41 @@ module.exports = class ContextModuleFactory extends Tapable {
 
 				const contextResolver = this.resolverFactory.get(
 					"context",
-					resolveOptions || EMPTY_RESOLVE_OPTIONS
-				);
-				const loaderResolver = this.resolverFactory.get(
-					"loader",
-					EMPTY_RESOLVE_OPTIONS
+					dependencies.length > 0
+						? cachedSetProperty(
+								resolveOptions || EMPTY_RESOLVE_OPTIONS,
+								"dependencyType",
+								dependencies[0].category
+							)
+						: resolveOptions
 				);
+				const loaderResolver = this.resolverFactory.get("loader");
 
 				asyncLib.parallel(
 					[
 						callback => {
+							const results = /** @type ResolveRequest[] */ ([]);
+							/**
+							 * @param {ResolveRequest} obj obj
+							 * @returns {void}
+							 */
+							const yield_ = obj => {
+								results.push(obj);
+							};
+
 							contextResolver.resolve(
 								{},
 								context,
 								resource,
-								{},
-								(err, result) => {
+								{
+									fileDependencies,
+									missingDependencies,
+									contextDependencies,
+									yield: yield_
+								},
+								err => {
 									if (err) return callback(err);
-									callback(null, result);
+									callback(null, results);
 								}
 							);
 						},
@@ -128,10 +203,14 @@ module.exports = class ContextModuleFactory extends Tapable {
 										{},
 										context,
 										loader,
-										{},
+										{
+											fileDependencies,
+											missingDependencies,
+											contextDependencies
+										},
 										(err, result) => {
 											if (err) return callback(err);
-											callback(null, result);
+											callback(null, /** @type {string} */ (result));
 										}
 									);
 								},
@@ -140,30 +219,59 @@ module.exports = class ContextModuleFactory extends Tapable {
 						}
 					],
 					(err, result) => {
-						if (err) return callback(err);
-
+						if (err) {
+							return callback(err, {
+								fileDependencies,
+								missingDependencies,
+								contextDependencies
+							});
+						}
+						let [contextResult, loaderResult] =
+							/** @type {[ResolveRequest[], string[]]} */ (result);
+						if (contextResult.length > 1) {
+							const first = contextResult[0];
+							contextResult = contextResult.filter(r => r.path);
+							if (contextResult.length === 0) contextResult.push(first);
+						}
 						this.hooks.afterResolve.callAsync(
-							Object.assign(
-								{
-									addon:
-										loadersPrefix +
-										result[1].join("!") +
-										(result[1].length > 0 ? "!" : ""),
-									resource: result[0],
-									resolveDependencies: this.resolveDependencies.bind(this)
-								},
-								beforeResolveResult
-							),
+							{
+								addon:
+									loadersPrefix +
+									loaderResult.join("!") +
+									(loaderResult.length > 0 ? "!" : ""),
+								resource:
+									contextResult.length > 1
+										? contextResult.map(r => r.path)
+										: contextResult[0].path,
+								resolveDependencies: this.resolveDependencies.bind(this),
+								resourceQuery: contextResult[0].query,
+								resourceFragment: contextResult[0].fragment,
+								...beforeResolveResult
+							},
 							(err, result) => {
-								if (err) return callback(err);
+								if (err) {
+									return callback(err, {
+										fileDependencies,
+										missingDependencies,
+										contextDependencies
+									});
+								}
 
 								// Ignored
-								if (!result) return callback();
+								if (!result) {
+									return callback(null, {
+										fileDependencies,
+										missingDependencies,
+										contextDependencies
+									});
+								}
 
-								return callback(
-									null,
-									new ContextModule(result.resolveDependencies, result)
-								);
+								return callback(null, {
+									module: new ContextModule(result.resolveDependencies, result),
+									fileDependencies,
+									missingDependencies,
+									contextDependencies
+								});
 							}
 						);
 					}
@@ -172,67 +280,130 @@ module.exports = class ContextModuleFactory extends Tapable {
 		);
 	}
 
+	/**
+	 * @param {InputFileSystem} fs file system
+	 * @param {ContextModuleOptions} options options
+	 * @param {ResolveDependenciesCallback} callback callback function
+	 * @returns {void}
+	 */
 	resolveDependencies(fs, options, callback) {
 		const cmf = this;
-		let resource = options.resource;
-		let resourceQuery = options.resourceQuery;
-		let recursive = options.recursive;
-		let regExp = options.regExp;
-		let include = options.include;
-		let exclude = options.exclude;
+		const {
+			resource,
+			resourceQuery,
+			resourceFragment,
+			recursive,
+			regExp,
+			include,
+			exclude,
+			referencedExports,
+			category,
+			typePrefix,
+			attributes
+		} = options;
 		if (!regExp || !resource) return callback(null, []);
 
-		const addDirectory = (directory, callback) => {
+		/**
+		 * @param {string} ctx context
+		 * @param {string} directory directory
+		 * @param {Set} visited visited
+		 * @param {ResolveDependenciesCallback} callback callback
+		 */
+		const addDirectoryChecked = (ctx, directory, visited, callback) => {
+			/** @type {NonNullable} */
+			(fs.realpath)(directory, (err, _realPath) => {
+				if (err) return callback(err);
+				const realPath = /** @type {string} */ (_realPath);
+				if (visited.has(realPath)) return callback(null, []);
+				/** @type {Set | undefined} */
+				let recursionStack;
+				addDirectory(
+					ctx,
+					directory,
+					(_, dir, callback) => {
+						if (recursionStack === undefined) {
+							recursionStack = new Set(visited);
+							recursionStack.add(realPath);
+						}
+						addDirectoryChecked(ctx, dir, recursionStack, callback);
+					},
+					callback
+				);
+			});
+		};
+
+		/**
+		 * @param {string} ctx context
+		 * @param {string} directory directory
+		 * @param {(context: string, subResource: string, callback: () => void) => void} addSubDirectory addSubDirectoryFn
+		 * @param {ResolveDependenciesCallback} callback callback
+		 */
+		const addDirectory = (ctx, directory, addSubDirectory, callback) => {
 			fs.readdir(directory, (err, files) => {
 				if (err) return callback(err);
-				files = cmf.hooks.contextModuleFiles.call(files);
-				if (!files || files.length === 0) return callback(null, []);
+				const processedFiles = cmf.hooks.contextModuleFiles.call(
+					/** @type {string[]} */ (files).map(file => file.normalize("NFC"))
+				);
+				if (!processedFiles || processedFiles.length === 0)
+					return callback(null, []);
 				asyncLib.map(
-					files.filter(p => p.indexOf(".") !== 0),
+					processedFiles.filter(p => p.indexOf(".") !== 0),
 					(segment, callback) => {
-						const subResource = path.join(directory, segment);
+						const subResource = join(fs, directory, segment);
 
 						if (!exclude || !subResource.match(exclude)) {
-							fs.stat(subResource, (err, stat) => {
+							fs.stat(subResource, (err, _stat) => {
 								if (err) {
 									if (err.code === "ENOENT") {
 										// ENOENT is ok here because the file may have been deleted between
 										// the readdir and stat calls.
 										return callback();
-									} else {
-										return callback(err);
 									}
+									return callback(err);
 								}
 
+								const stat = /** @type {IStats} */ (_stat);
+
 								if (stat.isDirectory()) {
 									if (!recursive) return callback();
-									addDirectory.call(this, subResource, callback);
+									addSubDirectory(ctx, subResource, callback);
 								} else if (
 									stat.isFile() &&
 									(!include || subResource.match(include))
 								) {
+									/** @type {{ context: string, request: string }} */
 									const obj = {
-										context: resource,
-										request:
-											"." +
-											subResource.substr(resource.length).replace(/\\/g, "/")
+										context: ctx,
+										request: `.${subResource.slice(ctx.length).replace(/\\/g, "/")}`
 									};
 
-									this.hooks.alternatives.callAsync(
+									this.hooks.alternativeRequests.callAsync(
 										[obj],
+										options,
 										(err, alternatives) => {
 											if (err) return callback(err);
-											alternatives = alternatives
-												.filter(obj => regExp.test(obj.request))
-												.map(obj => {
-													const dep = new ContextElementDependency(
-														obj.request + resourceQuery,
-														obj.request
-													);
-													dep.optional = true;
-													return dep;
-												});
-											callback(null, alternatives);
+											callback(
+												null,
+												/** @type {ContextAlternativeRequest[]} */
+												(alternatives)
+													.filter(obj =>
+														regExp.test(/** @type {string} */ (obj.request))
+													)
+													.map(obj => {
+														const dep = new ContextElementDependency(
+															`${obj.request}${resourceQuery}${resourceFragment}`,
+															obj.request,
+															typePrefix,
+															/** @type {string} */
+															(category),
+															referencedExports,
+															obj.context,
+															attributes
+														);
+														dep.optional = true;
+														return dep;
+													})
+											);
 										}
 									);
 								} else {
@@ -248,15 +419,62 @@ module.exports = class ContextModuleFactory extends Tapable {
 
 						if (!result) return callback(null, []);
 
-						callback(
-							null,
-							result.filter(Boolean).reduce((a, i) => a.concat(i), [])
-						);
+						const flattenedResult = [];
+
+						for (const item of result) {
+							if (item) flattenedResult.push(...item);
+						}
+
+						callback(null, flattenedResult);
 					}
 				);
 			});
 		};
 
-		addDirectory(resource, callback);
+		/**
+		 * @param {string} ctx context
+		 * @param {string} dir dir
+		 * @param {ResolveDependenciesCallback} callback callback
+		 * @returns {void}
+		 */
+		const addSubDirectory = (ctx, dir, callback) =>
+			addDirectory(ctx, dir, addSubDirectory, callback);
+
+		/**
+		 * @param {string} resource resource
+		 * @param {ResolveDependenciesCallback} callback callback
+		 */
+		const visitResource = (resource, callback) => {
+			if (typeof fs.realpath === "function") {
+				addDirectoryChecked(resource, resource, new Set(), callback);
+			} else {
+				addDirectory(resource, resource, addSubDirectory, callback);
+			}
+		};
+
+		if (typeof resource === "string") {
+			visitResource(resource, callback);
+		} else {
+			asyncLib.map(resource, visitResource, (err, _result) => {
+				if (err) return callback(err);
+				const result = /** @type {ContextElementDependency[][]} */ (_result);
+
+				// result dependencies should have unique userRequest
+				// ordered by resolve result
+				/** @type {Set} */
+				const temp = new Set();
+				/** @type {ContextElementDependency[]} */
+				const res = [];
+				for (let i = 0; i < result.length; i++) {
+					const inner = result[i];
+					for (const el of inner) {
+						if (temp.has(el.userRequest)) continue;
+						res.push(el);
+						temp.add(el.userRequest);
+					}
+				}
+				callback(null, res);
+			});
+		}
 	}
 };
diff --git a/lib/ContextReplacementPlugin.js b/lib/ContextReplacementPlugin.js
index 5523c8ab683..eda49603362 100644
--- a/lib/ContextReplacementPlugin.js
+++ b/lib/ContextReplacementPlugin.js
@@ -2,12 +2,27 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const path = require("path");
 const ContextElementDependency = require("./dependencies/ContextElementDependency");
+const { join } = require("./util/fs");
+
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./ContextModule").ContextModuleOptions} ContextModuleOptions */
+/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
+
+/** @typedef {Record} NewContentCreateContextMap */
+
+const PLUGIN_NAME = "ContextReplacementPlugin";
 
 class ContextReplacementPlugin {
+	/**
+	 * @param {RegExp} resourceRegExp A regular expression that determines which files will be selected
+	 * @param {(string | ((context: TODO) => void) | RegExp | boolean)=} newContentResource A new resource to replace the match
+	 * @param {(boolean | NewContentCreateContextMap | RegExp)=} newContentRecursive If true, all subdirectories are searched for matches
+	 * @param {RegExp=} newContentRegExp A regular expression that determines which files will be selected
+	 */
 	constructor(
 		resourceRegExp,
 		newContentResource,
@@ -16,38 +31,64 @@ class ContextReplacementPlugin {
 	) {
 		this.resourceRegExp = resourceRegExp;
 
+		// new webpack.ContextReplacementPlugin(/selector/, (context) => { /* Logic */ });
 		if (typeof newContentResource === "function") {
 			this.newContentCallback = newContentResource;
-		} else if (
+		}
+		// new ContextReplacementPlugin(/selector/, './folder', { './request': './request' });
+		else if (
 			typeof newContentResource === "string" &&
 			typeof newContentRecursive === "object"
 		) {
 			this.newContentResource = newContentResource;
+			/**
+			 * @param {InputFileSystem} fs input file system
+			 * @param {(err: null | Error, newContentRecursive: NewContentCreateContextMap) => void} callback callback
+			 */
 			this.newContentCreateContextMap = (fs, callback) => {
-				callback(null, newContentRecursive);
+				callback(
+					null,
+					/** @type {NewContentCreateContextMap} */ (newContentRecursive)
+				);
 			};
-		} else if (
+		}
+		// new ContextReplacementPlugin(/selector/, './folder', (context) => { /* Logic */ });
+		else if (
 			typeof newContentResource === "string" &&
 			typeof newContentRecursive === "function"
 		) {
 			this.newContentResource = newContentResource;
 			this.newContentCreateContextMap = newContentRecursive;
 		} else {
+			// new webpack.ContextReplacementPlugin(/selector/, false, /reg-exp/);
 			if (typeof newContentResource !== "string") {
-				newContentRegExp = newContentRecursive;
-				newContentRecursive = newContentResource;
+				newContentRegExp = /** @type {RegExp} */ (newContentRecursive);
+				newContentRecursive = /** @type {boolean} */ (newContentResource);
 				newContentResource = undefined;
 			}
+			// new webpack.ContextReplacementPlugin(/selector/, /de|fr|hu/);
 			if (typeof newContentRecursive !== "boolean") {
-				newContentRegExp = newContentRecursive;
+				newContentRegExp = /** @type {RegExp} */ (newContentRecursive);
 				newContentRecursive = undefined;
 			}
-			this.newContentResource = newContentResource;
-			this.newContentRecursive = newContentRecursive;
-			this.newContentRegExp = newContentRegExp;
+			// new webpack.ContextReplacementPlugin(/selector/, './folder', false, /selector/);
+			this.newContentResource =
+				/** @type {string | undefined} */
+				(newContentResource);
+			this.newContentRecursive =
+				/** @type {boolean | undefined} */
+				(newContentRecursive);
+			this.newContentRegExp =
+				/** @type {RegExp | undefined} */
+				(newContentRegExp);
 		}
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		const resourceRegExp = this.resourceRegExp;
 		const newContentCallback = this.newContentCallback;
@@ -56,8 +97,8 @@ class ContextReplacementPlugin {
 		const newContentRegExp = this.newContentRegExp;
 		const newContentCreateContextMap = this.newContentCreateContextMap;
 
-		compiler.hooks.contextModuleFactory.tap("ContextReplacementPlugin", cmf => {
-			cmf.hooks.beforeResolve.tap("ContextReplacementPlugin", result => {
+		compiler.hooks.contextModuleFactory.tap(PLUGIN_NAME, cmf => {
+			cmf.hooks.beforeResolve.tap(PLUGIN_NAME, result => {
 				if (!result) return;
 				if (resourceRegExp.test(result.request)) {
 					if (newContentResource !== undefined) {
@@ -79,11 +120,22 @@ class ContextReplacementPlugin {
 				}
 				return result;
 			});
-			cmf.hooks.afterResolve.tap("ContextReplacementPlugin", result => {
+			cmf.hooks.afterResolve.tap(PLUGIN_NAME, result => {
 				if (!result) return;
 				if (resourceRegExp.test(result.resource)) {
 					if (newContentResource !== undefined) {
-						result.resource = path.resolve(result.resource, newContentResource);
+						if (
+							newContentResource.startsWith("/") ||
+							(newContentResource.length > 1 && newContentResource[1] === ":")
+						) {
+							result.resource = newContentResource;
+						} else {
+							result.resource = join(
+								/** @type {InputFileSystem} */ (compiler.inputFileSystem),
+								result.resource,
+								newContentResource
+							);
+						}
 					}
 					if (newContentRecursive !== undefined) {
 						result.recursive = newContentRecursive;
@@ -92,15 +144,25 @@ class ContextReplacementPlugin {
 						result.regExp = newContentRegExp;
 					}
 					if (typeof newContentCreateContextMap === "function") {
-						result.resolveDependencies = createResolveDependenciesFromContextMap(
-							newContentCreateContextMap
-						);
+						result.resolveDependencies =
+							createResolveDependenciesFromContextMap(
+								newContentCreateContextMap
+							);
 					}
 					if (typeof newContentCallback === "function") {
 						const origResource = result.resource;
 						newContentCallback(result);
-						if (result.resource !== origResource) {
-							result.resource = path.resolve(origResource, result.resource);
+						if (
+							result.resource !== origResource &&
+							!result.resource.startsWith("/") &&
+							(result.resource.length <= 1 || result.resource[1] !== ":")
+						) {
+							// When the function changed it to an relative path
+							result.resource = join(
+								/** @type {InputFileSystem} */ (compiler.inputFileSystem),
+								origResource,
+								result.resource
+							);
 						}
 					} else {
 						for (const d of result.dependencies) {
@@ -114,20 +176,27 @@ class ContextReplacementPlugin {
 	}
 }
 
-const createResolveDependenciesFromContextMap = createContextMap => {
-	const resolveDependenciesFromContextMap = (fs, options, callback) => {
+/**
+ * @param {(fs: InputFileSystem, callback: (err: null | Error, map: NewContentCreateContextMap) => void) => void} createContextMap create context map function
+ * @returns {(fs: InputFileSystem, options: ContextModuleOptions, callback: (err: null | Error, dependencies?: ContextElementDependency[]) => void) => void} resolve resolve dependencies from context map function
+ */
+const createResolveDependenciesFromContextMap =
+	createContextMap => (fs, options, callback) => {
 		createContextMap(fs, (err, map) => {
 			if (err) return callback(err);
-			const dependencies = Object.keys(map).map(key => {
-				return new ContextElementDependency(
-					map[key] + options.resourceQuery,
-					key
-				);
-			});
+			const dependencies = Object.keys(map).map(
+				key =>
+					new ContextElementDependency(
+						map[key] + options.resourceQuery + options.resourceFragment,
+						key,
+						options.typePrefix,
+						/** @type {string} */
+						(options.category),
+						options.referencedExports
+					)
+			);
 			callback(null, dependencies);
 		});
 	};
-	return resolveDependenciesFromContextMap;
-};
 
 module.exports = ContextReplacementPlugin;
diff --git a/lib/CssModule.js b/lib/CssModule.js
new file mode 100644
index 00000000000..1112cea9ec1
--- /dev/null
+++ b/lib/CssModule.js
@@ -0,0 +1,174 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Alexander Akait @alexander-akait
+*/
+
+"use strict";
+
+const NormalModule = require("./NormalModule");
+const makeSerializable = require("./util/makeSerializable");
+
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./NormalModule").NormalModuleCreateData} NormalModuleCreateData */
+/** @typedef {import("./RequestShortener")} RequestShortener */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
+/** @typedef {string | undefined} CssLayer */
+/** @typedef {string | undefined} Supports */
+/** @typedef {string | undefined} Media */
+/** @typedef {[CssLayer, Supports, Media]} InheritanceItem */
+/** @typedef {Array} Inheritance */
+
+/** @typedef {NormalModuleCreateData & { cssLayer: CssLayer, supports: Supports, media: Media, inheritance: Inheritance }} CSSModuleCreateData */
+
+class CssModule extends NormalModule {
+	/**
+	 * @param {CSSModuleCreateData} options options object
+	 */
+	constructor(options) {
+		super(options);
+
+		// Avoid override `layer` for `Module` class, because it is a feature to run module in specific layer
+		this.cssLayer = options.cssLayer;
+		this.supports = options.supports;
+		this.media = options.media;
+		this.inheritance = options.inheritance;
+	}
+
+	/**
+	 * @returns {string} a unique identifier of the module
+	 */
+	identifier() {
+		let identifier = super.identifier();
+
+		if (this.cssLayer) {
+			identifier += `|${this.cssLayer}`;
+		}
+
+		if (this.supports) {
+			identifier += `|${this.supports}`;
+		}
+
+		if (this.media) {
+			identifier += `|${this.media}`;
+		}
+
+		if (this.inheritance) {
+			const inheritance = this.inheritance.map(
+				(item, index) =>
+					`inheritance_${index}|${item[0] || ""}|${item[1] || ""}|${
+						item[2] || ""
+					}`
+			);
+
+			identifier += `|${inheritance.join("|")}`;
+		}
+
+		// We generate extra code for HMR, so we need to invalidate the module
+		if (this.hot) {
+			identifier += `|${this.hot}`;
+		}
+
+		return identifier;
+	}
+
+	/**
+	 * @param {RequestShortener} requestShortener the request shortener
+	 * @returns {string} a user readable identifier of the module
+	 */
+	readableIdentifier(requestShortener) {
+		const readableIdentifier = super.readableIdentifier(requestShortener);
+
+		let identifier = `css ${readableIdentifier}`;
+
+		if (this.cssLayer) {
+			identifier += ` (layer: ${this.cssLayer})`;
+		}
+
+		if (this.supports) {
+			identifier += ` (supports: ${this.supports})`;
+		}
+
+		if (this.media) {
+			identifier += ` (media: ${this.media})`;
+		}
+
+		return identifier;
+	}
+
+	/**
+	 * Assuming this module is in the cache. Update the (cached) module with
+	 * the fresh module from the factory. Usually updates internal references
+	 * and properties.
+	 * @param {Module} module fresh module
+	 * @returns {void}
+	 */
+	updateCacheModule(module) {
+		super.updateCacheModule(module);
+		const m = /** @type {CssModule} */ (module);
+		this.cssLayer = m.cssLayer;
+		this.supports = m.supports;
+		this.media = m.media;
+		this.inheritance = m.inheritance;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.cssLayer);
+		write(this.supports);
+		write(this.media);
+		write(this.inheritance);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 * @returns {CssModule} the deserialized object
+	 */
+	static deserialize(context) {
+		const obj = new CssModule({
+			// will be deserialized by Module
+			layer: /** @type {EXPECTED_ANY} */ (null),
+			type: "",
+			// will be filled by updateCacheModule
+			resource: "",
+			context: "",
+			request: /** @type {EXPECTED_ANY} */ (null),
+			userRequest: /** @type {EXPECTED_ANY} */ (null),
+			rawRequest: /** @type {EXPECTED_ANY} */ (null),
+			loaders: /** @type {EXPECTED_ANY} */ (null),
+			matchResource: /** @type {EXPECTED_ANY} */ (null),
+			parser: /** @type {EXPECTED_ANY} */ (null),
+			parserOptions: /** @type {EXPECTED_ANY} */ (null),
+			generator: /** @type {EXPECTED_ANY} */ (null),
+			generatorOptions: /** @type {EXPECTED_ANY} */ (null),
+			resolveOptions: /** @type {EXPECTED_ANY} */ (null),
+			cssLayer: /** @type {EXPECTED_ANY} */ (null),
+			supports: /** @type {EXPECTED_ANY} */ (null),
+			media: /** @type {EXPECTED_ANY} */ (null),
+			inheritance: /** @type {EXPECTED_ANY} */ (null)
+		});
+		obj.deserialize(context);
+		return obj;
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.cssLayer = read();
+		this.supports = read();
+		this.media = read();
+		this.inheritance = read();
+		super.deserialize(context);
+	}
+}
+
+makeSerializable(CssModule, "webpack/lib/CssModule");
+
+module.exports = CssModule;
diff --git a/lib/DefinePlugin.js b/lib/DefinePlugin.js
index b0ea1d3a75c..8bc028df3b4 100644
--- a/lib/DefinePlugin.js
+++ b/lib/DefinePlugin.js
@@ -2,78 +2,335 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_ESM,
+	JAVASCRIPT_MODULE_TYPE_DYNAMIC
+} = require("./ModuleTypeConstants");
+const RuntimeGlobals = require("./RuntimeGlobals");
+const WebpackError = require("./WebpackError");
 const ConstDependency = require("./dependencies/ConstDependency");
-const BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
-const ParserHelpers = require("./ParserHelpers");
-const NullFactory = require("./NullFactory");
+const BasicEvaluatedExpression = require("./javascript/BasicEvaluatedExpression");
+const { VariableInfo } = require("./javascript/JavascriptParser");
+const {
+	evaluateToString,
+	toConstantDependency
+} = require("./javascript/JavascriptParserHelpers");
+const createHash = require("./util/createHash");
 
+/** @typedef {import("estree").Expression} Expression */
+/** @typedef {import("../declarations/WebpackOptions").HashFunction} HashFunction */
 /** @typedef {import("./Compiler")} Compiler */
-/** @typedef {import("./Parser")} Parser */
-/** @typedef {null|undefined|RegExp|Function|string|number} CodeValuePrimitive */
-/** @typedef {CodeValuePrimitive|Record|RuntimeValue} CodeValue */
+/** @typedef {import("./Module").BuildInfo} BuildInfo */
+/** @typedef {import("./Module").ValueCacheVersions} ValueCacheVersions */
+/** @typedef {import("./NormalModule")} NormalModule */
+/** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */
+/** @typedef {import("./javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("./javascript/JavascriptParser").DestructuringAssignmentProperty} DestructuringAssignmentProperty */
+/** @typedef {import("./javascript/JavascriptParser").Range} Range */
+/** @typedef {import("./logging/Logger").Logger} Logger */
+
+/** @typedef {null | undefined | RegExp | EXPECTED_FUNCTION | string | number | boolean | bigint | undefined} CodeValuePrimitive */
+/** @typedef {RecursiveArrayOrRecord} CodeValue */
+
+/**
+ * @typedef {object} RuntimeValueOptions
+ * @property {string[]=} fileDependencies
+ * @property {string[]=} contextDependencies
+ * @property {string[]=} missingDependencies
+ * @property {string[]=} buildDependencies
+ * @property {string| (() => string)=} version
+ */
+
+/** @typedef {string | Set} ValueCacheVersion */
+/** @typedef {(value: { module: NormalModule, key: string, readonly version: ValueCacheVersion }) => CodeValuePrimitive} GeneratorFn */
 
 class RuntimeValue {
-	constructor(fn, fileDependencies) {
+	/**
+	 * @param {GeneratorFn} fn generator function
+	 * @param {true | string[] | RuntimeValueOptions=} options options
+	 */
+	constructor(fn, options) {
 		this.fn = fn;
-		this.fileDependencies = fileDependencies || [];
+		if (Array.isArray(options)) {
+			options = {
+				fileDependencies: options
+			};
+		}
+		this.options = options || {};
+	}
+
+	get fileDependencies() {
+		return this.options === true ? true : this.options.fileDependencies;
 	}
 
-	exec(parser) {
-		if (this.fileDependencies === true) {
-			parser.state.module.buildInfo.cacheable = false;
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @param {ValueCacheVersions} valueCacheVersions valueCacheVersions
+	 * @param {string} key the defined key
+	 * @returns {CodeValuePrimitive} code
+	 */
+	exec(parser, valueCacheVersions, key) {
+		const buildInfo = /** @type {BuildInfo} */ (parser.state.module.buildInfo);
+		if (this.options === true) {
+			buildInfo.cacheable = false;
 		} else {
-			for (const fileDependency of this.fileDependencies) {
-				parser.state.module.buildInfo.fileDependencies.add(fileDependency);
+			if (this.options.fileDependencies) {
+				for (const dep of this.options.fileDependencies) {
+					/** @type {NonNullable} */
+					(buildInfo.fileDependencies).add(dep);
+				}
+			}
+			if (this.options.contextDependencies) {
+				for (const dep of this.options.contextDependencies) {
+					/** @type {NonNullable} */
+					(buildInfo.contextDependencies).add(dep);
+				}
+			}
+			if (this.options.missingDependencies) {
+				for (const dep of this.options.missingDependencies) {
+					/** @type {NonNullable} */
+					(buildInfo.missingDependencies).add(dep);
+				}
+			}
+			if (this.options.buildDependencies) {
+				for (const dep of this.options.buildDependencies) {
+					/** @type {NonNullable} */
+					(buildInfo.buildDependencies).add(dep);
+				}
 			}
 		}
 
-		return this.fn({ module: parser.state.module });
+		return this.fn({
+			module: parser.state.module,
+			key,
+			get version() {
+				return /** @type {ValueCacheVersion} */ (
+					valueCacheVersions.get(VALUE_DEP_PREFIX + key)
+				);
+			}
+		});
 	}
+
+	getCacheVersion() {
+		return this.options === true
+			? undefined
+			: (typeof this.options.version === "function"
+					? this.options.version()
+					: this.options.version) || "unset";
+	}
+}
+
+/**
+ * @param {Set | undefined} properties properties
+ * @returns {Set | undefined} used keys
+ */
+function getObjKeys(properties) {
+	if (!properties) return;
+	return new Set([...properties].map(p => p.id));
 }
 
-const stringifyObj = (obj, parser) => {
-	return (
-		"Object({" +
-		Object.keys(obj)
+/** @typedef {Set | null} ObjKeys */
+/** @typedef {boolean | undefined | null} AsiSafe */
+
+/**
+ * @param {EXPECTED_ANY[] | {[k: string]: EXPECTED_ANY}} obj obj
+ * @param {JavascriptParser} parser Parser
+ * @param {ValueCacheVersions} valueCacheVersions valueCacheVersions
+ * @param {string} key the defined key
+ * @param {RuntimeTemplate} runtimeTemplate the runtime template
+ * @param {Logger} logger the logger object
+ * @param {AsiSafe=} asiSafe asi safe (undefined: unknown, null: unneeded)
+ * @param {ObjKeys=} objKeys used keys
+ * @returns {string} code converted to string that evaluates
+ */
+const stringifyObj = (
+	obj,
+	parser,
+	valueCacheVersions,
+	key,
+	runtimeTemplate,
+	logger,
+	asiSafe,
+	objKeys
+) => {
+	let code;
+	const arr = Array.isArray(obj);
+	if (arr) {
+		code = `[${obj
+			.map(code =>
+				toCode(
+					code,
+					parser,
+					valueCacheVersions,
+					key,
+					runtimeTemplate,
+					logger,
+					null
+				)
+			)
+			.join(",")}]`;
+	} else {
+		let keys = Object.keys(obj);
+		if (objKeys) {
+			keys = objKeys.size === 0 ? [] : keys.filter(k => objKeys.has(k));
+		}
+		code = `{${keys
 			.map(key => {
 				const code = obj[key];
-				return JSON.stringify(key) + ":" + toCode(code, parser);
+				return `${JSON.stringify(key)}:${toCode(
+					code,
+					parser,
+					valueCacheVersions,
+					key,
+					runtimeTemplate,
+					logger,
+					null
+				)}`;
 			})
-			.join(",") +
-		"})"
-	);
+			.join(",")}}`;
+	}
+
+	switch (asiSafe) {
+		case null:
+			return code;
+		case true:
+			return arr ? code : `(${code})`;
+		case false:
+			return arr ? `;${code}` : `;(${code})`;
+		default:
+			return `/*#__PURE__*/Object(${code})`;
+	}
 };
 
 /**
  * Convert code to a string that evaluates
  * @param {CodeValue} code Code to evaluate
- * @param {Parser} parser Parser
+ * @param {JavascriptParser} parser Parser
+ * @param {ValueCacheVersions} valueCacheVersions valueCacheVersions
+ * @param {string} key the defined key
+ * @param {RuntimeTemplate} runtimeTemplate the runtime template
+ * @param {Logger} logger the logger object
+ * @param {boolean | undefined | null=} asiSafe asi safe (undefined: unknown, null: unneeded)
+ * @param {ObjKeys=} objKeys used keys
  * @returns {string} code converted to string that evaluates
  */
-const toCode = (code, parser) => {
+const toCode = (
+	code,
+	parser,
+	valueCacheVersions,
+	key,
+	runtimeTemplate,
+	logger,
+	asiSafe,
+	objKeys
+) => {
+	const transformToCode = () => {
+		if (code === null) {
+			return "null";
+		}
+		if (code === undefined) {
+			return "undefined";
+		}
+		if (Object.is(code, -0)) {
+			return "-0";
+		}
+		if (code instanceof RuntimeValue) {
+			return toCode(
+				code.exec(parser, valueCacheVersions, key),
+				parser,
+				valueCacheVersions,
+				key,
+				runtimeTemplate,
+				logger,
+				asiSafe
+			);
+		}
+		if (code instanceof RegExp && code.toString) {
+			return code.toString();
+		}
+		if (typeof code === "function" && code.toString) {
+			return `(${code.toString()})`;
+		}
+		if (typeof code === "object") {
+			return stringifyObj(
+				code,
+				parser,
+				valueCacheVersions,
+				key,
+				runtimeTemplate,
+				logger,
+				asiSafe,
+				objKeys
+			);
+		}
+		if (typeof code === "bigint") {
+			return runtimeTemplate.supportsBigIntLiteral()
+				? `${code}n`
+				: `BigInt("${code}")`;
+		}
+		return `${code}`;
+	};
+
+	const strCode = transformToCode();
+
+	logger.debug(`Replaced "${key}" with "${strCode}"`);
+
+	return strCode;
+};
+
+/**
+ * @param {CodeValue} code code
+ * @returns {string | undefined} result
+ */
+const toCacheVersion = code => {
 	if (code === null) {
 		return "null";
 	}
 	if (code === undefined) {
 		return "undefined";
 	}
+	if (Object.is(code, -0)) {
+		return "-0";
+	}
 	if (code instanceof RuntimeValue) {
-		return toCode(code.exec(parser), parser);
+		return code.getCacheVersion();
 	}
 	if (code instanceof RegExp && code.toString) {
 		return code.toString();
 	}
 	if (typeof code === "function" && code.toString) {
-		return "(" + code.toString() + ")";
+		return `(${code.toString()})`;
 	}
 	if (typeof code === "object") {
-		return stringifyObj(code, parser);
+		const items = Object.keys(code).map(key => ({
+			key,
+			value: toCacheVersion(
+				/** @type {Record} */
+				(code)[key]
+			)
+		}));
+		if (items.some(({ value }) => value === undefined)) return;
+		return `{${items.map(({ key, value }) => `${key}: ${value}`).join(", ")}}`;
+	}
+	if (typeof code === "bigint") {
+		return `${code}n`;
 	}
-	return code + "";
+	return `${code}`;
 };
 
+const PLUGIN_NAME = "DefinePlugin";
+const VALUE_DEP_PREFIX = `webpack/${PLUGIN_NAME} `;
+const VALUE_DEP_MAIN = `webpack/${PLUGIN_NAME}_hash`;
+const TYPEOF_OPERATOR_REGEXP = /^typeof\s+/;
+const WEBPACK_REQUIRE_FUNCTION_REGEXP = new RegExp(
+	`${RuntimeGlobals.require}\\s*(!?\\.)`
+);
+const WEBPACK_REQUIRE_IDENTIFIER_REGEXP = new RegExp(RuntimeGlobals.require);
+
 class DefinePlugin {
 	/**
 	 * Create a new define plugin
@@ -83,40 +340,95 @@ class DefinePlugin {
 		this.definitions = definitions;
 	}
 
-	static runtimeValue(fn, fileDependencies) {
-		return new RuntimeValue(fn, fileDependencies);
+	/**
+	 * @param {GeneratorFn} fn generator function
+	 * @param {true | string[] | RuntimeValueOptions=} options options
+	 * @returns {RuntimeValue} runtime value
+	 */
+	static runtimeValue(fn, options) {
+		return new RuntimeValue(fn, options);
 	}
 
 	/**
 	 * Apply the plugin
-	 * @param {Compiler} compiler Webpack compiler
+	 * @param {Compiler} compiler the compiler instance
 	 * @returns {void}
 	 */
 	apply(compiler) {
 		const definitions = this.definitions;
 		compiler.hooks.compilation.tap(
-			"DefinePlugin",
+			PLUGIN_NAME,
 			(compilation, { normalModuleFactory }) => {
-				compilation.dependencyFactories.set(ConstDependency, new NullFactory());
+				const logger = compilation.getLogger("webpack.DefinePlugin");
 				compilation.dependencyTemplates.set(
 					ConstDependency,
 					new ConstDependency.Template()
 				);
+				const { runtimeTemplate } = compilation;
+
+				const mainHash = createHash(
+					/** @type {HashFunction} */
+					(compilation.outputOptions.hashFunction)
+				);
+				mainHash.update(
+					/** @type {string} */
+					(compilation.valueCacheVersions.get(VALUE_DEP_MAIN)) || ""
+				);
 
 				/**
 				 * Handler
-				 * @param {Parser} parser Parser
+				 * @param {JavascriptParser} parser Parser
 				 * @returns {void}
 				 */
 				const handler = parser => {
+					const mainValue =
+						/** @type {ValueCacheVersion} */
+						(compilation.valueCacheVersions.get(VALUE_DEP_MAIN));
+					parser.hooks.program.tap(PLUGIN_NAME, () => {
+						const buildInfo = /** @type {BuildInfo} */ (
+							parser.state.module.buildInfo
+						);
+						if (!buildInfo.valueDependencies)
+							buildInfo.valueDependencies = new Map();
+						buildInfo.valueDependencies.set(VALUE_DEP_MAIN, mainValue);
+					});
+
+					/**
+					 * @param {string} key key
+					 */
+					const addValueDependency = key => {
+						const buildInfo =
+							/** @type {BuildInfo} */
+							(parser.state.module.buildInfo);
+						/** @type {NonNullable} */
+						(buildInfo.valueDependencies).set(
+							VALUE_DEP_PREFIX + key,
+							/** @type {ValueCacheVersion} */
+							(compilation.valueCacheVersions.get(VALUE_DEP_PREFIX + key))
+						);
+					};
+
+					/**
+					 * @template T
+					 * @param {string} key key
+					 * @param {(expression: Expression) => T} fn fn
+					 * @returns {(expression: Expression) => T} result
+					 */
+					const withValueDependency =
+						(key, fn) =>
+						(...args) => {
+							addValueDependency(key);
+							return fn(...args);
+						};
+
 					/**
 					 * Walk definitions
-					 * @param {Object} definitions Definitions map
+					 * @param {Record} definitions Definitions map
 					 * @param {string} prefix Prefix string
 					 * @returns {void}
 					 */
 					const walkDefinitions = (definitions, prefix) => {
-						Object.keys(definitions).forEach(key => {
+						for (const key of Object.keys(definitions)) {
 							const code = definitions[key];
 							if (
 								code &&
@@ -124,13 +436,16 @@ class DefinePlugin {
 								!(code instanceof RuntimeValue) &&
 								!(code instanceof RegExp)
 							) {
-								walkDefinitions(code, prefix + key + ".");
+								walkDefinitions(
+									/** @type {Record} */ (code),
+									`${prefix + key}.`
+								);
 								applyObjectDefine(prefix + key, code);
-								return;
+								continue;
 							}
 							applyDefineKey(prefix, key);
 							applyDefine(prefix + key, code);
-						});
+						}
 					};
 
 					/**
@@ -141,12 +456,19 @@ class DefinePlugin {
 					 */
 					const applyDefineKey = (prefix, key) => {
 						const splittedKey = key.split(".");
-						splittedKey.slice(1).forEach((_, i) => {
+						const firstKey = splittedKey[0];
+						for (const [i, _] of splittedKey.slice(1).entries()) {
 							const fullKey = prefix + splittedKey.slice(0, i + 1).join(".");
-							parser.hooks.canRename
-								.for(fullKey)
-								.tap("DefinePlugin", ParserHelpers.approve);
-						});
+							parser.hooks.canRename.for(fullKey).tap(PLUGIN_NAME, () => {
+								addValueDependency(key);
+								if (
+									parser.scope.definitions.get(firstKey) instanceof VariableInfo
+								) {
+									return false;
+								}
+								return true;
+							});
+						}
 					};
 
 					/**
@@ -156,17 +478,19 @@ class DefinePlugin {
 					 * @returns {void}
 					 */
 					const applyDefine = (key, code) => {
-						const isTypeof = /^typeof\s+/.test(key);
-						if (isTypeof) key = key.replace(/^typeof\s+/, "");
+						const originalKey = key;
+						const isTypeof = TYPEOF_OPERATOR_REGEXP.test(key);
+						if (isTypeof) key = key.replace(TYPEOF_OPERATOR_REGEXP, "");
 						let recurse = false;
 						let recurseTypeof = false;
 						if (!isTypeof) {
-							parser.hooks.canRename
-								.for(key)
-								.tap("DefinePlugin", ParserHelpers.approve);
+							parser.hooks.canRename.for(key).tap(PLUGIN_NAME, () => {
+								addValueDependency(originalKey);
+								return true;
+							});
 							parser.hooks.evaluateIdentifier
 								.for(key)
-								.tap("DefinePlugin", expr => {
+								.tap(PLUGIN_NAME, expr => {
 									/**
 									 * this is needed in case there is a recursion in the DefinePlugin
 									 * to prevent an endless recursion
@@ -176,27 +500,53 @@ class DefinePlugin {
 									 * });
 									 */
 									if (recurse) return;
+									addValueDependency(originalKey);
 									recurse = true;
-									const res = parser.evaluate(toCode(code, parser));
+									const res = parser.evaluate(
+										toCode(
+											code,
+											parser,
+											compilation.valueCacheVersions,
+											key,
+											runtimeTemplate,
+											logger,
+											null
+										)
+									);
 									recurse = false;
-									res.setRange(expr.range);
+									res.setRange(/** @type {Range} */ (expr.range));
 									return res;
 								});
-							parser.hooks.expression.for(key).tap("DefinePlugin", expr => {
-								const strCode = toCode(code, parser);
-								if (/__webpack_require__/.test(strCode)) {
-									return ParserHelpers.toConstantDependencyWithWebpackRequire(
-										parser,
-										strCode
-									)(expr);
-								} else {
-									return ParserHelpers.toConstantDependency(parser, strCode)(
-										expr
-									);
+							parser.hooks.expression.for(key).tap(PLUGIN_NAME, expr => {
+								addValueDependency(originalKey);
+								let strCode = toCode(
+									code,
+									parser,
+									compilation.valueCacheVersions,
+									originalKey,
+									runtimeTemplate,
+									logger,
+									!parser.isAsiPosition(/** @type {Range} */ (expr.range)[0]),
+									null
+								);
+
+								if (parser.scope.inShorthand) {
+									strCode = `${parser.scope.inShorthand}:${strCode}`;
+								}
+
+								if (WEBPACK_REQUIRE_FUNCTION_REGEXP.test(strCode)) {
+									return toConstantDependency(parser, strCode, [
+										RuntimeGlobals.require
+									])(expr);
+								} else if (WEBPACK_REQUIRE_IDENTIFIER_REGEXP.test(strCode)) {
+									return toConstantDependency(parser, strCode, [
+										RuntimeGlobals.requireScope
+									])(expr);
 								}
+								return toConstantDependency(parser, strCode)(expr);
 							});
 						}
-						parser.hooks.evaluateTypeof.for(key).tap("DefinePlugin", expr => {
+						parser.hooks.evaluateTypeof.for(key).tap(PLUGIN_NAME, expr => {
 							/**
 							 * this is needed in case there is a recursion in the DefinePlugin
 							 * to prevent an endless recursion
@@ -207,21 +557,37 @@ class DefinePlugin {
 							 */
 							if (recurseTypeof) return;
 							recurseTypeof = true;
-							const typeofCode = isTypeof
-								? toCode(code, parser)
-								: "typeof (" + toCode(code, parser) + ")";
+							addValueDependency(originalKey);
+							const codeCode = toCode(
+								code,
+								parser,
+								compilation.valueCacheVersions,
+								originalKey,
+								runtimeTemplate,
+								logger,
+								null
+							);
+							const typeofCode = isTypeof ? codeCode : `typeof (${codeCode})`;
 							const res = parser.evaluate(typeofCode);
 							recurseTypeof = false;
-							res.setRange(expr.range);
+							res.setRange(/** @type {Range} */ (expr.range));
 							return res;
 						});
-						parser.hooks.typeof.for(key).tap("DefinePlugin", expr => {
-							const typeofCode = isTypeof
-								? toCode(code, parser)
-								: "typeof (" + toCode(code, parser) + ")";
+						parser.hooks.typeof.for(key).tap(PLUGIN_NAME, expr => {
+							addValueDependency(originalKey);
+							const codeCode = toCode(
+								code,
+								parser,
+								compilation.valueCacheVersions,
+								originalKey,
+								runtimeTemplate,
+								logger,
+								null
+							);
+							const typeofCode = isTypeof ? codeCode : `typeof (${codeCode})`;
 							const res = parser.evaluate(typeofCode);
 							if (!res.isString()) return;
-							return ParserHelpers.toConstantDependency(
+							return toConstantDependency(
 								parser,
 								JSON.stringify(res.string)
 							).bind(parser)(expr);
@@ -231,55 +597,122 @@ class DefinePlugin {
 					/**
 					 * Apply Object
 					 * @param {string} key Key
-					 * @param {Object} obj Object
+					 * @param {object} obj Object
 					 * @returns {void}
 					 */
 					const applyObjectDefine = (key, obj) => {
-						parser.hooks.canRename
-							.for(key)
-							.tap("DefinePlugin", ParserHelpers.approve);
-						parser.hooks.evaluateIdentifier
+						parser.hooks.canRename.for(key).tap(PLUGIN_NAME, () => {
+							addValueDependency(key);
+							return true;
+						});
+						parser.hooks.evaluateIdentifier.for(key).tap(PLUGIN_NAME, expr => {
+							addValueDependency(key);
+							return new BasicEvaluatedExpression()
+								.setTruthy()
+								.setSideEffects(false)
+								.setRange(/** @type {Range} */ (expr.range));
+						});
+						parser.hooks.evaluateTypeof
 							.for(key)
-							.tap("DefinePlugin", expr =>
-								new BasicEvaluatedExpression().setTruthy().setRange(expr.range)
+							.tap(
+								PLUGIN_NAME,
+								withValueDependency(key, evaluateToString("object"))
+							);
+						parser.hooks.expression.for(key).tap(PLUGIN_NAME, expr => {
+							addValueDependency(key);
+							let strCode = stringifyObj(
+								obj,
+								parser,
+								compilation.valueCacheVersions,
+								key,
+								runtimeTemplate,
+								logger,
+								!parser.isAsiPosition(/** @type {Range} */ (expr.range)[0]),
+								getObjKeys(parser.destructuringAssignmentPropertiesFor(expr))
 							);
-						parser.hooks.evaluateTypeof.for(key).tap("DefinePlugin", expr => {
-							return ParserHelpers.evaluateToString("object")(expr);
-						});
-						parser.hooks.expression.for(key).tap("DefinePlugin", expr => {
-							const strCode = stringifyObj(obj, parser);
 
-							if (/__webpack_require__/.test(strCode)) {
-								return ParserHelpers.toConstantDependencyWithWebpackRequire(
-									parser,
-									strCode
-								)(expr);
-							} else {
-								return ParserHelpers.toConstantDependency(parser, strCode)(
-									expr
-								);
+							if (parser.scope.inShorthand) {
+								strCode = `${parser.scope.inShorthand}:${strCode}`;
 							}
+
+							if (WEBPACK_REQUIRE_FUNCTION_REGEXP.test(strCode)) {
+								return toConstantDependency(parser, strCode, [
+									RuntimeGlobals.require
+								])(expr);
+							} else if (WEBPACK_REQUIRE_IDENTIFIER_REGEXP.test(strCode)) {
+								return toConstantDependency(parser, strCode, [
+									RuntimeGlobals.requireScope
+								])(expr);
+							}
+							return toConstantDependency(parser, strCode)(expr);
 						});
-						parser.hooks.typeof.for(key).tap("DefinePlugin", expr => {
-							return ParserHelpers.toConstantDependency(
-								parser,
-								JSON.stringify("object")
-							)(expr);
-						});
+						parser.hooks.typeof
+							.for(key)
+							.tap(
+								PLUGIN_NAME,
+								withValueDependency(
+									key,
+									toConstantDependency(parser, JSON.stringify("object"))
+								)
+							);
 					};
 
 					walkDefinitions(definitions, "");
 				};
 
 				normalModuleFactory.hooks.parser
-					.for("javascript/auto")
-					.tap("DefinePlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, handler);
 				normalModuleFactory.hooks.parser
-					.for("javascript/dynamic")
-					.tap("DefinePlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
+					.tap(PLUGIN_NAME, handler);
 				normalModuleFactory.hooks.parser
-					.for("javascript/esm")
-					.tap("DefinePlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_ESM)
+					.tap(PLUGIN_NAME, handler);
+
+				/**
+				 * Walk definitions
+				 * @param {Record} definitions Definitions map
+				 * @param {string} prefix Prefix string
+				 * @returns {void}
+				 */
+				const walkDefinitionsForValues = (definitions, prefix) => {
+					for (const key of Object.keys(definitions)) {
+						const code = definitions[key];
+						const version = /** @type {string} */ (toCacheVersion(code));
+						const name = VALUE_DEP_PREFIX + prefix + key;
+						mainHash.update(`|${prefix}${key}`);
+						const oldVersion = compilation.valueCacheVersions.get(name);
+						if (oldVersion === undefined) {
+							compilation.valueCacheVersions.set(name, version);
+						} else if (oldVersion !== version) {
+							const warning = new WebpackError(
+								`${PLUGIN_NAME}\nConflicting values for '${prefix + key}'`
+							);
+							warning.details = `'${oldVersion}' !== '${version}'`;
+							warning.hideStack = true;
+							compilation.warnings.push(warning);
+						}
+						if (
+							code &&
+							typeof code === "object" &&
+							!(code instanceof RuntimeValue) &&
+							!(code instanceof RegExp)
+						) {
+							walkDefinitionsForValues(
+								/** @type {Record} */ (code),
+								`${prefix + key}.`
+							);
+						}
+					}
+				};
+
+				walkDefinitionsForValues(definitions, "");
+
+				compilation.valueCacheVersions.set(
+					VALUE_DEP_MAIN,
+					/** @type {string} */ (mainHash.digest("hex").slice(0, 8))
+				);
 			}
 		);
 	}
diff --git a/lib/DelegatedModule.js b/lib/DelegatedModule.js
index 170ceca7a1a..f798e3c7fa8 100644
--- a/lib/DelegatedModule.js
+++ b/lib/DelegatedModule.js
@@ -2,26 +2,76 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const { OriginalSource, RawSource } = require("webpack-sources");
-
 const Module = require("./Module");
-const WebpackMissingModule = require("./dependencies/WebpackMissingModule");
+const { JS_TYPES } = require("./ModuleSourceTypesConstants");
+const { JAVASCRIPT_MODULE_TYPE_DYNAMIC } = require("./ModuleTypeConstants");
+const RuntimeGlobals = require("./RuntimeGlobals");
 const DelegatedSourceDependency = require("./dependencies/DelegatedSourceDependency");
-const DelegatedExportsDependency = require("./dependencies/DelegatedExportsDependency");
+const StaticExportsDependency = require("./dependencies/StaticExportsDependency");
+const makeSerializable = require("./util/makeSerializable");
 
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
+/** @typedef {import("../declarations/plugins/DllReferencePlugin").DllReferencePluginOptions} DllReferencePluginOptions */
+/** @typedef {import("./ChunkGraph")} ChunkGraph */
+/** @typedef {import("./Compilation")} Compilation */
+/** @typedef {import("./Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("./DependencyTemplates")} DependencyTemplates */
+/** @typedef {import("./Generator").SourceTypes} SourceTypes */
+/** @typedef {import("./LibManifestPlugin").ManifestModuleData} ManifestModuleData */
+/** @typedef {import("./Module").BuildCallback} BuildCallback */
+/** @typedef {import("./Module").BuildMeta} BuildMeta */
+/** @typedef {import("./Module").CodeGenerationContext} CodeGenerationContext */
+/** @typedef {import("./Module").CodeGenerationResult} CodeGenerationResult */
+/** @typedef {import("./Module").LibIdentOptions} LibIdentOptions */
+/** @typedef {import("./Module").NeedBuildCallback} NeedBuildCallback */
+/** @typedef {import("./Module").NeedBuildContext} NeedBuildContext */
+/** @typedef {import("./Module").SourceContext} SourceContext */
+/** @typedef {import("./RequestShortener")} RequestShortener */
+/** @typedef {import("./ResolverFactory").ResolverWithOptions} ResolverWithOptions */
+/** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */
+/** @typedef {import("./WebpackError")} WebpackError */
 /** @typedef {import("./dependencies/ModuleDependency")} ModuleDependency */
-/** @typedef {import("./util/createHash").Hash} Hash */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("./util/Hash")} Hash */
+/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
+
+/** @typedef {string} DelegatedModuleSourceRequest */
+
+/** @typedef {NonNullable} DelegatedModuleType */
+
+/**
+ * @typedef {object} DelegatedModuleData
+ * @property {BuildMeta=} buildMeta build meta
+ * @property {true | string[]=} exports exports
+ * @property {number | string} id module id
+ */
+
+const RUNTIME_REQUIREMENTS = new Set([
+	RuntimeGlobals.module,
+	RuntimeGlobals.require
+]);
 
 class DelegatedModule extends Module {
+	/**
+	 * @param {DelegatedModuleSourceRequest} sourceRequest source request
+	 * @param {DelegatedModuleData} data data
+	 * @param {DelegatedModuleType} type type
+	 * @param {string} userRequest user request
+	 * @param {string | Module} originalRequest original request
+	 */
 	constructor(sourceRequest, data, type, userRequest, originalRequest) {
-		super("javascript/dynamic", null);
+		super(JAVASCRIPT_MODULE_TYPE_DYNAMIC, null);
 
 		// Info from Factory
 		this.sourceRequest = sourceRequest;
 		this.request = data.id;
-		this.type = type;
+		this.delegationType = type;
 		this.userRequest = userRequest;
 		this.originalRequest = originalRequest;
 		this.delegateData = data;
@@ -30,54 +80,94 @@ class DelegatedModule extends Module {
 		this.delegatedSourceDependency = undefined;
 	}
 
+	/**
+	 * @returns {SourceTypes} types available (do not mutate)
+	 */
+	getSourceTypes() {
+		return JS_TYPES;
+	}
+
+	/**
+	 * @param {LibIdentOptions} options options
+	 * @returns {string | null} an identifier for library inclusion
+	 */
 	libIdent(options) {
 		return typeof this.originalRequest === "string"
 			? this.originalRequest
 			: this.originalRequest.libIdent(options);
 	}
 
+	/**
+	 * @returns {string} a unique identifier of the module
+	 */
 	identifier() {
 		return `delegated ${JSON.stringify(this.request)} from ${
 			this.sourceRequest
 		}`;
 	}
 
-	readableIdentifier() {
+	/**
+	 * @param {RequestShortener} requestShortener the request shortener
+	 * @returns {string} a user readable identifier of the module
+	 */
+	readableIdentifier(requestShortener) {
 		return `delegated ${this.userRequest} from ${this.sourceRequest}`;
 	}
 
-	needRebuild() {
-		return false;
+	/**
+	 * @param {NeedBuildContext} context context info
+	 * @param {NeedBuildCallback} callback callback function, returns true, if the module needs a rebuild
+	 * @returns {void}
+	 */
+	needBuild(context, callback) {
+		return callback(null, !this.buildMeta);
 	}
 
+	/**
+	 * @param {WebpackOptions} options webpack options
+	 * @param {Compilation} compilation the compilation
+	 * @param {ResolverWithOptions} resolver the resolver
+	 * @param {InputFileSystem} fs the file system
+	 * @param {BuildCallback} callback callback function
+	 * @returns {void}
+	 */
 	build(options, compilation, resolver, fs, callback) {
-		this.built = true;
-		this.buildMeta = Object.assign({}, this.delegateData.buildMeta);
+		const delegateData = /** @type {ManifestModuleData} */ (this.delegateData);
+		this.buildMeta = { ...delegateData.buildMeta };
 		this.buildInfo = {};
+		this.dependencies.length = 0;
 		this.delegatedSourceDependency = new DelegatedSourceDependency(
 			this.sourceRequest
 		);
 		this.addDependency(this.delegatedSourceDependency);
 		this.addDependency(
-			new DelegatedExportsDependency(this, this.delegateData.exports || true)
+			new StaticExportsDependency(delegateData.exports || true, false)
 		);
 		callback();
 	}
 
-	source(depTemplates, runtime) {
+	/**
+	 * @param {CodeGenerationContext} context context for code generation
+	 * @returns {CodeGenerationResult} result
+	 */
+	codeGeneration({ runtimeTemplate, moduleGraph, chunkGraph }) {
 		const dep = /** @type {DelegatedSourceDependency} */ (this.dependencies[0]);
-		const sourceModule = dep.module;
+		const sourceModule = moduleGraph.getModule(dep);
 		let str;
 
 		if (!sourceModule) {
-			str = WebpackMissingModule.moduleCode(this.sourceRequest);
+			str = runtimeTemplate.throwMissingModuleErrorBlock({
+				request: this.sourceRequest
+			});
 		} else {
-			str = `module.exports = (${runtime.moduleExports({
+			str = `module.exports = (${runtimeTemplate.moduleExports({
 				module: sourceModule,
-				request: dep.request
+				chunkGraph,
+				request: dep.request,
+				runtimeRequirements: new Set()
 			})})`;
 
-			switch (this.type) {
+			switch (this.delegationType) {
 				case "require":
 					str += `(${JSON.stringify(this.request)})`;
 					break;
@@ -89,26 +179,96 @@ class DelegatedModule extends Module {
 			str += ";";
 		}
 
-		if (this.useSourceMap) {
-			return new OriginalSource(str, this.identifier());
+		const sources = new Map();
+		if (this.useSourceMap || this.useSimpleSourceMap) {
+			sources.set("javascript", new OriginalSource(str, this.identifier()));
 		} else {
-			return new RawSource(str);
+			sources.set("javascript", new RawSource(str));
 		}
+
+		return {
+			sources,
+			runtimeRequirements: RUNTIME_REQUIREMENTS
+		};
 	}
 
-	size() {
+	/**
+	 * @param {string=} type the source type for which the size should be estimated
+	 * @returns {number} the estimated size of the module (must be non-zero)
+	 */
+	size(type) {
 		return 42;
 	}
 
 	/**
 	 * @param {Hash} hash the hash used to track dependencies
+	 * @param {UpdateHashContext} context context
 	 * @returns {void}
 	 */
-	updateHash(hash) {
-		hash.update(this.type);
+	updateHash(hash, context) {
+		hash.update(this.delegationType);
 		hash.update(JSON.stringify(this.request));
-		super.updateHash(hash);
+		super.updateHash(hash, context);
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		// constructor
+		write(this.sourceRequest);
+		write(this.delegateData);
+		write(this.delegationType);
+		write(this.userRequest);
+		write(this.originalRequest);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context\
+	 * @returns {DelegatedModule} DelegatedModule
+	 */
+	static deserialize(context) {
+		const { read } = context;
+		const obj = new DelegatedModule(
+			read(), // sourceRequest
+			read(), // delegateData
+			read(), // delegationType
+			read(), // userRequest
+			read() // originalRequest
+		);
+		obj.deserialize(context);
+		return obj;
+	}
+
+	/**
+	 * Assuming this module is in the cache. Update the (cached) module with
+	 * the fresh module from the factory. Usually updates internal references
+	 * and properties.
+	 * @param {Module} module fresh module
+	 * @returns {void}
+	 */
+	updateCacheModule(module) {
+		super.updateCacheModule(module);
+		const m = /** @type {DelegatedModule} */ (module);
+		this.delegationType = m.delegationType;
+		this.userRequest = m.userRequest;
+		this.originalRequest = m.originalRequest;
+		this.delegateData = m.delegateData;
+	}
+
+	/**
+	 * Assuming this module is in the cache. Remove internal references to allow freeing some memory.
+	 */
+	cleanupForCache() {
+		super.cleanupForCache();
+		this.delegateData =
+			/** @type {EXPECTED_ANY} */
+			(undefined);
 	}
 }
 
+makeSerializable(DelegatedModule, "webpack/lib/DelegatedModule");
+
 module.exports = DelegatedModule;
diff --git a/lib/DelegatedModuleFactoryPlugin.js b/lib/DelegatedModuleFactoryPlugin.js
index a0a05a43878..3e9df64415a 100644
--- a/lib/DelegatedModuleFactoryPlugin.js
+++ b/lib/DelegatedModuleFactoryPlugin.js
@@ -2,38 +2,53 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const DelegatedModule = require("./DelegatedModule");
 
-// options.source
-// options.type
-// options.context
-// options.scope
-// options.content
+/** @typedef {import("../declarations/plugins/DllReferencePlugin").DllReferencePluginOptions} DllReferencePluginOptions */
+/** @typedef {import("../declarations/plugins/DllReferencePlugin").DllReferencePluginOptionsContent} DllReferencePluginOptionsContent */
+/** @typedef {import("./DelegatedModule").DelegatedModuleSourceRequest} DelegatedModuleSourceRequest */
+/** @typedef {import("./DelegatedModule").DelegatedModuleType} DelegatedModuleType */
+/** @typedef {import("./NormalModuleFactory")} NormalModuleFactory */
+/** @typedef {import("./util/identifier").AssociatedObjectForCache} AssociatedObjectForCache */
+
+/**
+ * @typedef {object} Options
+ * @property {DelegatedModuleSourceRequest} source source
+ * @property {NonNullable} context absolute context path to which lib ident is relative to
+ * @property {DllReferencePluginOptionsContent} content content
+ * @property {DllReferencePluginOptions["type"]} type type
+ * @property {DllReferencePluginOptions["extensions"]} extensions extensions
+ * @property {DllReferencePluginOptions["scope"]} scope scope
+ * @property {AssociatedObjectForCache=} associatedObjectForCache object for caching
+ */
+
 class DelegatedModuleFactoryPlugin {
+	/**
+	 * @param {Options} options options
+	 */
 	constructor(options) {
 		this.options = options;
 		options.type = options.type || "require";
-		options.extensions = options.extensions || [
-			"",
-			".wasm",
-			".mjs",
-			".js",
-			".json"
-		];
+		options.extensions = options.extensions || ["", ".js", ".json", ".wasm"];
 	}
 
+	/**
+	 * @param {NormalModuleFactory} normalModuleFactory the normal module factory
+	 * @returns {void}
+	 */
 	apply(normalModuleFactory) {
 		const scope = this.options.scope;
 		if (scope) {
-			normalModuleFactory.hooks.factory.tap(
+			normalModuleFactory.hooks.factorize.tapAsync(
 				"DelegatedModuleFactoryPlugin",
-				factory => (data, callback) => {
-					const dependency = data.dependencies[0];
-					const request = dependency.request;
-					if (request && request.indexOf(scope + "/") === 0) {
-						const innerRequest = "." + request.substr(scope.length);
+				(data, callback) => {
+					const [dependency] = data.dependencies;
+					const { request } = dependency;
+					if (request && request.startsWith(`${scope}/`)) {
+						const innerRequest = `.${request.slice(scope.length)}`;
 						let resolved;
 						if (innerRequest in this.options.content) {
 							resolved = this.options.content[innerRequest];
@@ -42,14 +57,18 @@ class DelegatedModuleFactoryPlugin {
 								new DelegatedModule(
 									this.options.source,
 									resolved,
-									this.options.type,
+									/** @type {DelegatedModuleType} */
+									(this.options.type),
 									innerRequest,
 									request
 								)
 							);
 						}
-						for (let i = 0; i < this.options.extensions.length; i++) {
-							const extension = this.options.extensions[i];
+						const extensions =
+							/** @type {string[]} */
+							(this.options.extensions);
+						for (let i = 0; i < extensions.length; i++) {
+							const extension = extensions[i];
 							const requestPlusExt = innerRequest + extension;
 							if (requestPlusExt in this.options.content) {
 								resolved = this.options.content[requestPlusExt];
@@ -58,7 +77,8 @@ class DelegatedModuleFactoryPlugin {
 									new DelegatedModule(
 										this.options.source,
 										resolved,
-										this.options.type,
+										/** @type {DelegatedModuleType} */
+										(this.options.type),
 										requestPlusExt,
 										request + extension
 									)
@@ -66,25 +86,24 @@ class DelegatedModuleFactoryPlugin {
 							}
 						}
 					}
-					return factory(data, callback);
+					return callback();
 				}
 			);
 		} else {
 			normalModuleFactory.hooks.module.tap(
 				"DelegatedModuleFactoryPlugin",
 				module => {
-					if (module.libIdent) {
-						const request = module.libIdent(this.options);
-						if (request && request in this.options.content) {
-							const resolved = this.options.content[request];
-							return new DelegatedModule(
-								this.options.source,
-								resolved,
-								this.options.type,
-								request,
-								module
-							);
-						}
+					const request = module.libIdent(this.options);
+					if (request && request in this.options.content) {
+						const resolved = this.options.content[request];
+						return new DelegatedModule(
+							this.options.source,
+							resolved,
+							/** @type {DelegatedModuleType} */
+							(this.options.type),
+							request,
+							module
+						);
 					}
 					return module;
 				}
diff --git a/lib/DelegatedPlugin.js b/lib/DelegatedPlugin.js
index 714eb8533cd..64f3941f993 100644
--- a/lib/DelegatedPlugin.js
+++ b/lib/DelegatedPlugin.js
@@ -7,31 +7,41 @@
 
 const DelegatedModuleFactoryPlugin = require("./DelegatedModuleFactoryPlugin");
 const DelegatedSourceDependency = require("./dependencies/DelegatedSourceDependency");
-const DelegatedExportsDependency = require("./dependencies/DelegatedExportsDependency");
-const NullFactory = require("./NullFactory");
+
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./DelegatedModuleFactoryPlugin").Options} Options */
+
+const PLUGIN_NAME = "DelegatedPlugin";
 
 class DelegatedPlugin {
+	/**
+	 * @param {Options} options options
+	 */
 	constructor(options) {
 		this.options = options;
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		compiler.hooks.compilation.tap(
-			"DelegatedPlugin",
+			PLUGIN_NAME,
 			(compilation, { normalModuleFactory }) => {
 				compilation.dependencyFactories.set(
 					DelegatedSourceDependency,
 					normalModuleFactory
 				);
-				compilation.dependencyFactories.set(
-					DelegatedExportsDependency,
-					new NullFactory()
-				);
 			}
 		);
 
-		compiler.hooks.compile.tap("DelegatedPlugin", ({ normalModuleFactory }) => {
-			new DelegatedModuleFactoryPlugin(this.options).apply(normalModuleFactory);
+		compiler.hooks.compile.tap(PLUGIN_NAME, ({ normalModuleFactory }) => {
+			new DelegatedModuleFactoryPlugin({
+				associatedObjectForCache: compiler.root,
+				...this.options
+			}).apply(normalModuleFactory);
 		});
 	}
 }
diff --git a/lib/DependenciesBlock.js b/lib/DependenciesBlock.js
index 142f3eacbaf..a952b643b56 100644
--- a/lib/DependenciesBlock.js
+++ b/lib/DependenciesBlock.js
@@ -1,32 +1,51 @@
 /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
 "use strict";
 
-const DependenciesBlockVariable = require("./DependenciesBlockVariable");
+const makeSerializable = require("./util/makeSerializable");
 
+/** @typedef {import("./AsyncDependenciesBlock")} AsyncDependenciesBlock */
+/** @typedef {import("./ChunkGraph")} ChunkGraph */
 /** @typedef {import("./ChunkGroup")} ChunkGroup */
 /** @typedef {import("./Dependency")} Dependency */
-/** @typedef {import("./AsyncDependenciesBlock")} AsyncDependenciesBlock */
-/** @typedef {import("./DependenciesBlockVariable")} DependenciesBlockVariable */
+/** @typedef {import("./Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("./util/Hash")} Hash */
+
 /** @typedef {(d: Dependency) => boolean} DependencyFilterFunction */
-/** @typedef {import("./util/createHash").Hash} Hash */
 
+/**
+ * DependenciesBlock is the base class for all Module classes in webpack. It describes a
+ * "block" of dependencies which are pointers to other DependenciesBlock instances. For example
+ * when a Module has a CommonJs require statement, the DependencyBlock for the CommonJs module
+ * would be added as a dependency to the Module. DependenciesBlock is inherited by two types of classes:
+ * Module subclasses and AsyncDependenciesBlock subclasses. The only difference between the two is that
+ * AsyncDependenciesBlock subclasses are used for code-splitting (async boundary) and Module subclasses are not.
+ */
 class DependenciesBlock {
 	constructor() {
 		/** @type {Dependency[]} */
 		this.dependencies = [];
 		/** @type {AsyncDependenciesBlock[]} */
 		this.blocks = [];
-		/** @type {DependenciesBlockVariable[]} */
-		this.variables = [];
+		/** @type {DependenciesBlock | undefined} */
+		this.parent = undefined;
+	}
+
+	getRootBlock() {
+		/** @type {DependenciesBlock} */
+		let current = this;
+		while (current.parent) current = current.parent;
+		return current;
 	}
 
 	/**
 	 * Adds a DependencyBlock to DependencyBlock relationship.
 	 * This is used for when a Module has a AsyncDependencyBlock tie (for code-splitting)
-	 *
 	 * @param {AsyncDependenciesBlock} block block being added
 	 * @returns {void}
 	 */
@@ -35,23 +54,6 @@ class DependenciesBlock {
 		block.parent = this;
 	}
 
-	/**
-	 * @param {string} name name of dependency
-	 * @param {string} expression expression string for variable
-	 * @param {Dependency[]} dependencies dependency instances tied to variable
-	 * @returns {void}
-	 */
-	addVariable(name, expression, dependencies) {
-		for (let v of this.variables) {
-			if (v.name === name && v.expression === expression) {
-				return;
-			}
-		}
-		this.variables.push(
-			new DependenciesBlockVariable(name, expression, dependencies)
-		);
-	}
-
 	/**
 	 * @param {Dependency} dependency dependency being tied to block.
 	 * This is an "edge" pointing to another "node" on module graph.
@@ -73,52 +75,48 @@ class DependenciesBlock {
 	}
 
 	/**
-	 * @param {Hash} hash the hash used to track dependencies
+	 * Removes all dependencies and blocks
 	 * @returns {void}
 	 */
-	updateHash(hash) {
-		for (const dep of this.dependencies) dep.updateHash(hash);
-		for (const block of this.blocks) block.updateHash(hash);
-		for (const variable of this.variables) variable.updateHash(hash);
+	clearDependenciesAndBlocks() {
+		this.dependencies.length = 0;
+		this.blocks.length = 0;
 	}
 
-	disconnect() {
-		for (const dep of this.dependencies) dep.disconnect();
-		for (const block of this.blocks) block.disconnect();
-		for (const variable of this.variables) variable.disconnect();
+	/**
+	 * @param {Hash} hash the hash used to track dependencies
+	 * @param {UpdateHashContext} context context
+	 * @returns {void}
+	 */
+	updateHash(hash, context) {
+		for (const dep of this.dependencies) {
+			dep.updateHash(hash, context);
+		}
+		for (const block of this.blocks) {
+			block.updateHash(hash, context);
+		}
 	}
 
-	unseal() {
-		for (const block of this.blocks) block.unseal();
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize({ write }) {
+		write(this.dependencies);
+		write(this.blocks);
 	}
 
 	/**
-	 * @param {DependencyFilterFunction} filter filter function for dependencies, gets passed all dependency ties from current instance
-	 * @returns {boolean} returns boolean for filter
+	 * @param {ObjectDeserializerContext} context context
 	 */
-	hasDependencies(filter) {
-		if (filter) {
-			for (const dep of this.dependencies) {
-				if (filter(dep)) return true;
-			}
-		} else {
-			if (this.dependencies.length > 0) {
-				return true;
-			}
-		}
-
+	deserialize({ read }) {
+		this.dependencies = read();
+		this.blocks = read();
 		for (const block of this.blocks) {
-			if (block.hasDependencies(filter)) return true;
-		}
-		for (const variable of this.variables) {
-			if (variable.hasDependencies(filter)) return true;
+			block.parent = this;
 		}
-		return false;
-	}
-
-	sortItems() {
-		for (const block of this.blocks) block.sortItems();
 	}
 }
 
+makeSerializable(DependenciesBlock, "webpack/lib/DependenciesBlock");
+
 module.exports = DependenciesBlock;
diff --git a/lib/DependenciesBlockVariable.js b/lib/DependenciesBlockVariable.js
deleted file mode 100644
index c4ed9162700..00000000000
--- a/lib/DependenciesBlockVariable.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const { RawSource, ReplaceSource } = require("webpack-sources");
-
-/** @typedef {import("./Dependency")} Dependency */
-/** @typedef {import("./Dependency").DependencyTemplate} DependencyTemplate */
-/** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */
-/** @typedef {import("./util/createHash").Hash} Hash */
-/** @typedef {(d: Dependency) => boolean} DependencyFilterFunction */
-/** @typedef {Map} DependencyTemplates */
-
-class DependenciesBlockVariable {
-	/**
-	 * Creates an instance of DependenciesBlockVariable.
-	 * @param {string} name name of DependenciesBlockVariable
-	 * @param {string} expression expression string
-	 * @param {Dependency[]=} dependencies dependencies tied to this varaiable
-	 */
-	constructor(name, expression, dependencies) {
-		this.name = name;
-		this.expression = expression;
-		this.dependencies = dependencies || [];
-	}
-
-	/**
-	 * @param {Hash} hash hash for instance to update
-	 * @returns {void}
-	 */
-	updateHash(hash) {
-		hash.update(this.name);
-		hash.update(this.expression);
-		for (const d of this.dependencies) {
-			d.updateHash(hash);
-		}
-	}
-
-	/**
-	 * @param {DependencyTemplates} dependencyTemplates Dependency constructors and templates Map.
-	 * @param {RuntimeTemplate} runtimeTemplate runtimeTemplate to generate expression souce
-	 * @returns {ReplaceSource} returns constructed source for expression via templates
-	 */
-	expressionSource(dependencyTemplates, runtimeTemplate) {
-		const source = new ReplaceSource(new RawSource(this.expression));
-		for (const dep of this.dependencies) {
-			const template = dependencyTemplates.get(dep.constructor);
-			if (!template) {
-				throw new Error(`No template for dependency: ${dep.constructor.name}`);
-			}
-			template.apply(dep, source, runtimeTemplate, dependencyTemplates);
-		}
-		return source;
-	}
-
-	disconnect() {
-		for (const d of this.dependencies) {
-			d.disconnect();
-		}
-	}
-
-	hasDependencies(filter) {
-		if (filter) {
-			return this.dependencies.some(filter);
-		}
-		return this.dependencies.length > 0;
-	}
-}
-
-module.exports = DependenciesBlockVariable;
diff --git a/lib/Dependency.js b/lib/Dependency.js
index 6d27b1ed6d2..7447c36487f 100644
--- a/lib/Dependency.js
+++ b/lib/Dependency.js
@@ -2,88 +2,371 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const util = require("util");
-const compareLocations = require("./compareLocations");
-const DependencyReference = require("./dependencies/DependencyReference");
+const RawModule = require("./RawModule");
+const memoize = require("./util/memoize");
 
-/** @typedef {import("./Module")} Module */
 /** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("./ChunkGraph")} ChunkGraph */
+/** @typedef {import("./DependenciesBlock")} DependenciesBlock */
+/** @typedef {import("./DependencyTemplates")} DependencyTemplates */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./ModuleGraph")} ModuleGraph */
+/** @typedef {import("./ModuleGraphConnection")} ModuleGraphConnection */
+/** @typedef {import("./ModuleGraphConnection").ConnectionState} ConnectionState */
 /** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */
+/** @typedef {import("./WebpackError")} WebpackError */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("./util/Hash")} Hash */
+/** @typedef {import("./util/runtime").RuntimeSpec} RuntimeSpec */
 
 /**
- * @typedef {Object} DependencyTemplate
- * @property {function(Dependency, Source, RuntimeTemplate, Map): void} apply
+ * @typedef {object} UpdateHashContext
+ * @property {ChunkGraph} chunkGraph
+ * @property {RuntimeSpec} runtime
+ * @property {RuntimeTemplate=} runtimeTemplate
  */
 
-/** @typedef {Object} SourcePosition
- *  @property {number} line
- *  @property {number=} column
+/**
+ * @typedef {object} SourcePosition
+ * @property {number} line
+ * @property {number=} column
+ */
+
+/**
+ * @typedef {object} RealDependencyLocation
+ * @property {SourcePosition} start
+ * @property {SourcePosition=} end
+ * @property {number=} index
  */
 
-/** @typedef {Object} RealDependencyLocation
- *  @property {SourcePosition} start
- *  @property {SourcePosition=} end
- *  @property {number=} index
+/**
+ * @typedef {object} SyntheticDependencyLocation
+ * @property {string} name
+ * @property {number=} index
  */
 
-/** @typedef {Object} SynteticDependencyLocation
- *  @property {string} name
- *  @property {number=} index
+/** @typedef {SyntheticDependencyLocation | RealDependencyLocation} DependencyLocation */
+
+/**
+ * @typedef {object} ExportSpec
+ * @property {string} name the name of the export
+ * @property {boolean=} canMangle can the export be renamed (defaults to true)
+ * @property {boolean=} terminalBinding is the export a terminal binding that should be checked for export star conflicts
+ * @property {(string | ExportSpec)[]=} exports nested exports
+ * @property {ModuleGraphConnection=} from when reexported: from which module
+ * @property {string[] | null=} export when reexported: from which export
+ * @property {number=} priority when reexported: with which priority
+ * @property {boolean=} hidden export is not visible, because another export blends over it
  */
 
-/** @typedef {SynteticDependencyLocation|RealDependencyLocation} DependencyLocation */
+/**
+ * @typedef {object} ExportsSpec
+ * @property {(string | ExportSpec)[] | true | null} exports exported names, true for unknown exports or null for no exports
+ * @property {Set=} excludeExports when exports = true, list of unaffected exports
+ * @property {(Set | null)=} hideExports list of maybe prior exposed, but now hidden exports
+ * @property {ModuleGraphConnection=} from when reexported: from which module
+ * @property {number=} priority when reexported: with which priority
+ * @property {boolean=} canMangle can the export be renamed (defaults to true)
+ * @property {boolean=} terminalBinding are the exports terminal bindings that should be checked for export star conflicts
+ * @property {Module[]=} dependencies module on which the result depends on
+ */
+
+/**
+ * @typedef {object} ReferencedExport
+ * @property {string[]} name name of the referenced export
+ * @property {boolean=} canMangle when false, referenced export can not be mangled, defaults to true
+ */
+
+/** @typedef {(moduleGraphConnection: ModuleGraphConnection, runtime: RuntimeSpec) => ConnectionState} GetConditionFn */
+
+const TRANSITIVE = Symbol("transitive");
+
+const getIgnoredModule = memoize(
+	() => new RawModule("/* (ignored) */", "ignored", "(ignored)")
+);
 
 class Dependency {
 	constructor() {
-		/** @type {Module|null} */
-		this.module = null;
-		// TODO remove in webpack 5
+		/** @type {Module | undefined} */
+		this._parentModule = undefined;
+		/** @type {DependenciesBlock | undefined} */
+		this._parentDependenciesBlock = undefined;
+		/** @type {number} */
+		this._parentDependenciesBlockIndex = -1;
+		// TODO check if this can be moved into ModuleDependency
 		/** @type {boolean} */
 		this.weak = false;
+		// TODO check if this can be moved into ModuleDependency
 		/** @type {boolean} */
 		this.optional = false;
-		/** @type {DependencyLocation} */
-		this.loc = undefined;
+		this._locSL = 0;
+		this._locSC = 0;
+		this._locEL = 0;
+		this._locEC = 0;
+		this._locI = undefined;
+		this._locN = undefined;
+		this._loc = undefined;
+	}
+
+	/**
+	 * @returns {string} a display name for the type of dependency
+	 */
+	get type() {
+		return "unknown";
+	}
+
+	/**
+	 * @returns {string} a dependency category, typical categories are "commonjs", "amd", "esm"
+	 */
+	get category() {
+		return "unknown";
+	}
+
+	/**
+	 * @returns {DependencyLocation} location
+	 */
+	get loc() {
+		if (this._loc !== undefined) return this._loc;
+
+		/** @type {SyntheticDependencyLocation & RealDependencyLocation} */
+		const loc = {};
+
+		if (this._locSL > 0) {
+			loc.start = { line: this._locSL, column: this._locSC };
+		}
+		if (this._locEL > 0) {
+			loc.end = { line: this._locEL, column: this._locEC };
+		}
+		if (this._locN !== undefined) {
+			loc.name = this._locN;
+		}
+		if (this._locI !== undefined) {
+			loc.index = this._locI;
+		}
+
+		return (this._loc = loc);
+	}
+
+	set loc(loc) {
+		if ("start" in loc && typeof loc.start === "object") {
+			this._locSL = loc.start.line || 0;
+			this._locSC = loc.start.column || 0;
+		} else {
+			this._locSL = 0;
+			this._locSC = 0;
+		}
+		if ("end" in loc && typeof loc.end === "object") {
+			this._locEL = loc.end.line || 0;
+			this._locEC = loc.end.column || 0;
+		} else {
+			this._locEL = 0;
+			this._locEC = 0;
+		}
+		this._locI = "index" in loc ? loc.index : undefined;
+		this._locN = "name" in loc ? loc.name : undefined;
+		this._loc = loc;
+	}
+
+	/**
+	 * @param {number} startLine start line
+	 * @param {number} startColumn start column
+	 * @param {number} endLine end line
+	 * @param {number} endColumn end column
+	 */
+	setLoc(startLine, startColumn, endLine, endColumn) {
+		this._locSL = startLine;
+		this._locSC = startColumn;
+		this._locEL = endLine;
+		this._locEC = endColumn;
+		this._locI = undefined;
+		this._locN = undefined;
+		this._loc = undefined;
+	}
+
+	/**
+	 * @returns {string | undefined} a request context
+	 */
+	getContext() {
+		return undefined;
 	}
 
+	/**
+	 * @returns {string | null} an identifier to merge equal requests
+	 */
 	getResourceIdentifier() {
 		return null;
 	}
 
-	// Returns the referenced module and export
-	getReference() {
-		if (!this.module) return null;
-		return new DependencyReference(this.module, true, this.weak);
+	/**
+	 * @returns {boolean | TRANSITIVE} true, when changes to the referenced module could affect the referencing module; TRANSITIVE, when changes to the referenced module could affect referencing modules of the referencing module
+	 */
+	couldAffectReferencingModule() {
+		return TRANSITIVE;
 	}
 
-	// Returns the exported names
-	getExports() {
+	/**
+	 * Returns the referenced module and export
+	 * @deprecated
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {never} throws error
+	 */
+	getReference(moduleGraph) {
+		throw new Error(
+			"Dependency.getReference was removed in favor of Dependency.getReferencedExports, ModuleGraph.getModule and ModuleGraph.getConnection().active"
+		);
+	}
+
+	/**
+	 * Returns list of exports referenced by this dependency
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @param {RuntimeSpec} runtime the runtime for which the module is analysed
+	 * @returns {(string[] | ReferencedExport)[]} referenced exports
+	 */
+	getReferencedExports(moduleGraph, runtime) {
+		return Dependency.EXPORTS_OBJECT_REFERENCED;
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {null | false | GetConditionFn} function to determine if the connection is active
+	 */
+	getCondition(moduleGraph) {
 		return null;
 	}
 
-	getWarnings() {
+	/**
+	 * Returns the exported names
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {ExportsSpec | undefined} export names
+	 */
+	getExports(moduleGraph) {
+		return undefined;
+	}
+
+	/**
+	 * Returns warnings
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {WebpackError[] | null | undefined} warnings
+	 */
+	getWarnings(moduleGraph) {
 		return null;
 	}
 
-	getErrors() {
+	/**
+	 * Returns errors
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {WebpackError[] | null | undefined} errors
+	 */
+	getErrors(moduleGraph) {
 		return null;
 	}
 
-	updateHash(hash) {
-		hash.update((this.module && this.module.id) + "");
+	/**
+	 * Update the hash
+	 * @param {Hash} hash hash to be updated
+	 * @param {UpdateHashContext} context context
+	 * @returns {void}
+	 */
+	updateHash(hash, context) {}
+
+	/**
+	 * implement this method to allow the occurrence order plugin to count correctly
+	 * @returns {number} count how often the id is used in this dependency
+	 */
+	getNumberOfIdOccurrences() {
+		return 1;
 	}
 
-	disconnect() {
-		this.module = null;
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @returns {ConnectionState} how this dependency connects the module to referencing modules
+	 */
+	getModuleEvaluationSideEffectsState(moduleGraph) {
+		return true;
+	}
+
+	/**
+	 * @param {string} context context directory
+	 * @returns {Module} ignored module
+	 */
+	createIgnoredModule(context) {
+		return getIgnoredModule();
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize({ write }) {
+		write(this.weak);
+		write(this.optional);
+		write(this._locSL);
+		write(this._locSC);
+		write(this._locEL);
+		write(this._locEC);
+		write(this._locI);
+		write(this._locN);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize({ read }) {
+		this.weak = read();
+		this.optional = read();
+		this._locSL = read();
+		this._locSC = read();
+		this._locEL = read();
+		this._locEC = read();
+		this._locI = read();
+		this._locN = read();
 	}
 }
 
-// TODO remove in webpack 5
-Dependency.compare = util.deprecate(
-	(a, b) => compareLocations(a.loc, b.loc),
-	"Dependency.compare is deprecated and will be removed in the next major version"
-);
+/** @type {string[][]} */
+Dependency.NO_EXPORTS_REFERENCED = [];
+/** @type {string[][]} */
+Dependency.EXPORTS_OBJECT_REFERENCED = [[]];
+
+// TODO remove in webpack 6
+Object.defineProperty(Dependency.prototype, "module", {
+	/**
+	 * @deprecated
+	 * @returns {EXPECTED_ANY} throws
+	 */
+	get() {
+		throw new Error(
+			"module property was removed from Dependency (use compilation.moduleGraph.getModule(dependency) instead)"
+		);
+	},
+
+	/**
+	 * @deprecated
+	 * @returns {never} throws
+	 */
+	set() {
+		throw new Error(
+			"module property was removed from Dependency (use compilation.moduleGraph.updateModule(dependency, module) instead)"
+		);
+	}
+});
+
+// TODO remove in webpack 6
+Object.defineProperty(Dependency.prototype, "disconnect", {
+	/**
+	 * @deprecated
+	 * @returns {EXPECTED_ANY} throws
+	 */
+	get() {
+		throw new Error(
+			"disconnect was removed from Dependency (Dependency no longer carries graph specific information)"
+		);
+	}
+});
+
+Dependency.TRANSITIVE = TRANSITIVE;
 
 module.exports = Dependency;
diff --git a/lib/DependencyTemplate.js b/lib/DependencyTemplate.js
new file mode 100644
index 00000000000..8402ade157e
--- /dev/null
+++ b/lib/DependencyTemplate.js
@@ -0,0 +1,69 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("./ChunkGraph")} ChunkGraph */
+/** @typedef {import("./CodeGenerationResults")} CodeGenerationResults */
+/** @typedef {import("./ConcatenationScope")} ConcatenationScope */
+/** @typedef {import("./Dependency")} Dependency */
+/** @typedef {import("./Dependency").RuntimeSpec} RuntimeSpec */
+/** @typedef {import("./DependencyTemplates")} DependencyTemplates */
+/** @typedef {import("./Generator").GenerateContext} GenerateContext */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./Module").RuntimeRequirements} RuntimeRequirements */
+/** @typedef {import("./ModuleGraph")} ModuleGraph */
+/** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */
+
+/**
+ * @template T
+ * @typedef {import("./InitFragment")} InitFragment
+ */
+
+/**
+ * @typedef {object} DependencyTemplateContext
+ * @property {RuntimeTemplate} runtimeTemplate the runtime template
+ * @property {DependencyTemplates} dependencyTemplates the dependency templates
+ * @property {ModuleGraph} moduleGraph the module graph
+ * @property {ChunkGraph} chunkGraph the chunk graph
+ * @property {RuntimeRequirements} runtimeRequirements the requirements for runtime
+ * @property {Module} module current module
+ * @property {RuntimeSpec} runtime current runtimes, for which code is generated
+ * @property {InitFragment[]} initFragments mutable array of init fragments for the current module
+ * @property {ConcatenationScope=} concatenationScope when in a concatenated module, information about other concatenated modules
+ * @property {CodeGenerationResults} codeGenerationResults the code generation results
+ * @property {InitFragment[]} chunkInitFragments chunkInitFragments
+ */
+
+/**
+ * @typedef {object} CssDependencyTemplateContextExtras
+ * @property {CssData} cssData the css exports data
+ */
+
+/**
+ * @typedef {object} CssData
+ * @property {boolean} esModule whether export __esModule
+ * @property {Map} exports the css exports
+ */
+
+/** @typedef {DependencyTemplateContext & CssDependencyTemplateContextExtras} CssDependencyTemplateContext */
+
+class DependencyTemplate {
+	/* istanbul ignore next */
+	/**
+	 * @abstract
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, templateContext) {
+		const AbstractMethodError = require("./AbstractMethodError");
+		throw new AbstractMethodError();
+	}
+}
+
+module.exports = DependencyTemplate;
diff --git a/lib/DependencyTemplates.js b/lib/DependencyTemplates.js
new file mode 100644
index 00000000000..4eeaa0e05cd
--- /dev/null
+++ b/lib/DependencyTemplates.js
@@ -0,0 +1,68 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { DEFAULTS } = require("./config/defaults");
+const createHash = require("./util/createHash");
+
+/** @typedef {import("./Dependency")} Dependency */
+/** @typedef {import("./DependencyTemplate")} DependencyTemplate */
+/** @typedef {typeof import("./util/Hash")} Hash */
+
+/** @typedef {new (...args: EXPECTED_ANY[]) => Dependency} DependencyConstructor */
+
+class DependencyTemplates {
+	/**
+	 * @param {string | Hash} hashFunction the hash function to use
+	 */
+	constructor(hashFunction = DEFAULTS.HASH_FUNCTION) {
+		/** @type {Map} */
+		this._map = new Map();
+		/** @type {string} */
+		this._hash = "31d6cfe0d16ae931b73c59d7e0c089c0";
+		this._hashFunction = hashFunction;
+	}
+
+	/**
+	 * @param {DependencyConstructor} dependency Constructor of Dependency
+	 * @returns {DependencyTemplate | undefined} template for this dependency
+	 */
+	get(dependency) {
+		return this._map.get(dependency);
+	}
+
+	/**
+	 * @param {DependencyConstructor} dependency Constructor of Dependency
+	 * @param {DependencyTemplate} dependencyTemplate template for this dependency
+	 * @returns {void}
+	 */
+	set(dependency, dependencyTemplate) {
+		this._map.set(dependency, dependencyTemplate);
+	}
+
+	/**
+	 * @param {string} part additional hash contributor
+	 * @returns {void}
+	 */
+	updateHash(part) {
+		const hash = createHash(this._hashFunction);
+		hash.update(`${this._hash}${part}`);
+		this._hash = /** @type {string} */ (hash.digest("hex"));
+	}
+
+	getHash() {
+		return this._hash;
+	}
+
+	clone() {
+		const newInstance = new DependencyTemplates(this._hashFunction);
+		newInstance._map = new Map(this._map);
+		newInstance._hash = this._hash;
+		return newInstance;
+	}
+}
+
+module.exports = DependencyTemplates;
diff --git a/lib/DllEntryPlugin.js b/lib/DllEntryPlugin.js
index 562628d906a..cd00373f230 100644
--- a/lib/DllEntryPlugin.js
+++ b/lib/DllEntryPlugin.js
@@ -2,22 +2,39 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const DllEntryDependency = require("./dependencies/DllEntryDependency");
-const SingleEntryDependency = require("./dependencies/SingleEntryDependency");
 const DllModuleFactory = require("./DllModuleFactory");
+const DllEntryDependency = require("./dependencies/DllEntryDependency");
+const EntryDependency = require("./dependencies/EntryDependency");
+
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {string[]} Entries */
+/** @typedef {{ name: string, filename: TODO }} Options */
+
+const PLUGIN_NAME = "DllEntryPlugin";
 
 class DllEntryPlugin {
-	constructor(context, entries, name) {
+	/**
+	 * @param {string} context context
+	 * @param {Entries} entries entry names
+	 * @param {Options} options options
+	 */
+	constructor(context, entries, options) {
 		this.context = context;
 		this.entries = entries;
-		this.name = name;
+		this.options = options;
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		compiler.hooks.compilation.tap(
-			"DllEntryPlugin",
+			PLUGIN_NAME,
 			(compilation, { normalModuleFactory }) => {
 				const dllModuleFactory = new DllModuleFactory();
 				compilation.dependencyFactories.set(
@@ -25,27 +42,30 @@ class DllEntryPlugin {
 					dllModuleFactory
 				);
 				compilation.dependencyFactories.set(
-					SingleEntryDependency,
+					EntryDependency,
 					normalModuleFactory
 				);
 			}
 		);
-		compiler.hooks.make.tapAsync("DllEntryPlugin", (compilation, callback) => {
+		compiler.hooks.make.tapAsync(PLUGIN_NAME, (compilation, callback) => {
 			compilation.addEntry(
 				this.context,
 				new DllEntryDependency(
 					this.entries.map((e, idx) => {
-						const dep = new SingleEntryDependency(e);
+						const dep = new EntryDependency(e);
 						dep.loc = {
-							name: this.name,
+							name: this.options.name,
 							index: idx
 						};
 						return dep;
 					}),
-					this.name
+					this.options.name
 				),
-				this.name,
-				callback
+				this.options,
+				error => {
+					if (error) return callback(error);
+					callback();
+				}
 			);
 		});
 	}
diff --git a/lib/DllModule.js b/lib/DllModule.js
index 0cd9cbcf8ce..58b06b0ecf7 100644
--- a/lib/DllModule.js
+++ b/lib/DllModule.js
@@ -1,60 +1,176 @@
 /*
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
-	*/
+*/
+
 "use strict";
 
 const { RawSource } = require("webpack-sources");
 const Module = require("./Module");
+const { JS_TYPES } = require("./ModuleSourceTypesConstants");
+const { JAVASCRIPT_MODULE_TYPE_DYNAMIC } = require("./ModuleTypeConstants");
+const RuntimeGlobals = require("./RuntimeGlobals");
+const makeSerializable = require("./util/makeSerializable");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
+/** @typedef {import("./ChunkGraph")} ChunkGraph */
+/** @typedef {import("./Compilation")} Compilation */
+/** @typedef {import("./Dependency")} Dependency */
+/** @typedef {import("./Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("./DependencyTemplates")} DependencyTemplates */
+/** @typedef {import("./Generator").SourceTypes} SourceTypes */
+/** @typedef {import("./Module").BuildCallback} BuildCallback */
+/** @typedef {import("./Module").CodeGenerationContext} CodeGenerationContext */
+/** @typedef {import("./Module").CodeGenerationResult} CodeGenerationResult */
+/** @typedef {import("./Module").NeedBuildCallback} NeedBuildCallback */
+/** @typedef {import("./Module").NeedBuildContext} NeedBuildContext */
+/** @typedef {import("./Module").SourceContext} SourceContext */
+/** @typedef {import("./RequestShortener")} RequestShortener */
+/** @typedef {import("./ResolverFactory").ResolverWithOptions} ResolverWithOptions */
+/** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */
+/** @typedef {import("./WebpackError")} WebpackError */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("./util/Hash")} Hash */
+/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
 
-/** @typedef {import("./util/createHash").Hash} Hash */
+const RUNTIME_REQUIREMENTS = new Set([
+	RuntimeGlobals.require,
+	RuntimeGlobals.module
+]);
 
 class DllModule extends Module {
-	constructor(context, dependencies, name, type) {
-		super("javascript/dynamic", context);
+	/**
+	 * @param {string} context context path
+	 * @param {Dependency[]} dependencies dependencies
+	 * @param {string} name name
+	 */
+	constructor(context, dependencies, name) {
+		super(JAVASCRIPT_MODULE_TYPE_DYNAMIC, context);
 
 		// Info from Factory
+		/** @type {Dependency[]} */
 		this.dependencies = dependencies;
 		this.name = name;
-		this.type = type;
 	}
 
+	/**
+	 * @returns {SourceTypes} types available (do not mutate)
+	 */
+	getSourceTypes() {
+		return JS_TYPES;
+	}
+
+	/**
+	 * @returns {string} a unique identifier of the module
+	 */
 	identifier() {
 		return `dll ${this.name}`;
 	}
 
-	readableIdentifier() {
+	/**
+	 * @param {RequestShortener} requestShortener the request shortener
+	 * @returns {string} a user readable identifier of the module
+	 */
+	readableIdentifier(requestShortener) {
 		return `dll ${this.name}`;
 	}
 
+	/**
+	 * @param {WebpackOptions} options webpack options
+	 * @param {Compilation} compilation the compilation
+	 * @param {ResolverWithOptions} resolver the resolver
+	 * @param {InputFileSystem} fs the file system
+	 * @param {BuildCallback} callback callback function
+	 * @returns {void}
+	 */
 	build(options, compilation, resolver, fs, callback) {
-		this.built = true;
 		this.buildMeta = {};
 		this.buildInfo = {};
 		return callback();
 	}
 
-	source() {
-		return new RawSource("module.exports = __webpack_require__;");
+	/**
+	 * @param {CodeGenerationContext} context context for code generation
+	 * @returns {CodeGenerationResult} result
+	 */
+	codeGeneration(context) {
+		const sources = new Map();
+		sources.set(
+			"javascript",
+			new RawSource(`module.exports = ${RuntimeGlobals.require};`)
+		);
+		return {
+			sources,
+			runtimeRequirements: RUNTIME_REQUIREMENTS
+		};
 	}
 
-	needRebuild() {
-		return false;
+	/**
+	 * @param {NeedBuildContext} context context info
+	 * @param {NeedBuildCallback} callback callback function, returns true, if the module needs a rebuild
+	 * @returns {void}
+	 */
+	needBuild(context, callback) {
+		return callback(null, !this.buildMeta);
 	}
 
-	size() {
+	/**
+	 * @param {string=} type the source type for which the size should be estimated
+	 * @returns {number} the estimated size of the module (must be non-zero)
+	 */
+	size(type) {
 		return 12;
 	}
 
 	/**
 	 * @param {Hash} hash the hash used to track dependencies
+	 * @param {UpdateHashContext} context context
+	 * @returns {void}
+	 */
+	updateHash(hash, context) {
+		hash.update(`dll module${this.name || ""}`);
+		super.updateHash(hash, context);
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		context.write(this.name);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		this.name = context.read();
+		super.deserialize(context);
+	}
+
+	/**
+	 * Assuming this module is in the cache. Update the (cached) module with
+	 * the fresh module from the factory. Usually updates internal references
+	 * and properties.
+	 * @param {Module} module fresh module
 	 * @returns {void}
 	 */
-	updateHash(hash) {
-		hash.update("dll module");
-		hash.update(this.name || "");
-		super.updateHash(hash);
+	updateCacheModule(module) {
+		super.updateCacheModule(module);
+		this.dependencies = module.dependencies;
+	}
+
+	/**
+	 * Assuming this module is in the cache. Remove internal references to allow freeing some memory.
+	 */
+	cleanupForCache() {
+		super.cleanupForCache();
+		this.dependencies = /** @type {EXPECTED_ANY} */ (undefined);
 	}
 }
 
+makeSerializable(DllModule, "webpack/lib/DllModule");
+
 module.exports = DllModule;
diff --git a/lib/DllModuleFactory.js b/lib/DllModuleFactory.js
index f5d12ddc4be..41aa1610726 100644
--- a/lib/DllModuleFactory.js
+++ b/lib/DllModuleFactory.js
@@ -2,27 +2,36 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const { Tapable } = require("tapable");
 const DllModule = require("./DllModule");
+const ModuleFactory = require("./ModuleFactory");
+
+/** @typedef {import("./ModuleFactory").ModuleFactoryCallback} ModuleFactoryCallback */
+/** @typedef {import("./ModuleFactory").ModuleFactoryCreateData} ModuleFactoryCreateData */
+/** @typedef {import("./dependencies/DllEntryDependency")} DllEntryDependency */
 
-class DllModuleFactory extends Tapable {
+class DllModuleFactory extends ModuleFactory {
 	constructor() {
 		super();
-		this.hooks = {};
+		this.hooks = Object.freeze({});
 	}
+
+	/**
+	 * @param {ModuleFactoryCreateData} data data object
+	 * @param {ModuleFactoryCallback} callback callback
+	 * @returns {void}
+	 */
 	create(data, callback) {
-		const dependency = data.dependencies[0];
-		callback(
-			null,
-			new DllModule(
+		const dependency = /** @type {DllEntryDependency} */ (data.dependencies[0]);
+		callback(null, {
+			module: new DllModule(
 				data.context,
 				dependency.dependencies,
-				dependency.name,
-				dependency.type
+				dependency.name
 			)
-		);
+		});
 	}
 }
 
diff --git a/lib/DllPlugin.js b/lib/DllPlugin.js
index 884c21c5821..cb034431c08 100644
--- a/lib/DllPlugin.js
+++ b/lib/DllPlugin.js
@@ -1,47 +1,70 @@
 /*
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
-	*/
+*/
+
 "use strict";
 
 const DllEntryPlugin = require("./DllEntryPlugin");
+const FlagAllModulesAsUsedPlugin = require("./FlagAllModulesAsUsedPlugin");
 const LibManifestPlugin = require("./LibManifestPlugin");
-const FlagInitialModulesAsUsedPlugin = require("./FlagInitialModulesAsUsedPlugin");
-
-const validateOptions = require("schema-utils");
-const schema = require("../schemas/plugins/DllPlugin.json");
+const createSchemaValidation = require("./util/create-schema-validation");
 
 /** @typedef {import("../declarations/plugins/DllPlugin").DllPluginOptions} DllPluginOptions */
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./DllEntryPlugin").Entries} Entries */
+/** @typedef {import("./DllEntryPlugin").Options} Options */
+
+const validate = createSchemaValidation(
+	require("../schemas/plugins/DllPlugin.check.js"),
+	() => require("../schemas/plugins/DllPlugin.json"),
+	{
+		name: "Dll Plugin",
+		baseDataPath: "options"
+	}
+);
+
+const PLUGIN_NAME = "DllPlugin";
 
 class DllPlugin {
 	/**
 	 * @param {DllPluginOptions} options options object
 	 */
 	constructor(options) {
-		validateOptions(schema, options, "Dll Plugin");
-		this.options = options;
+		validate(options);
+		this.options = {
+			...options,
+			entryOnly: options.entryOnly !== false
+		};
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		compiler.hooks.entryOption.tap("DllPlugin", (context, entry) => {
-			const itemToPlugin = (item, name) => {
-				if (Array.isArray(item)) {
-					return new DllEntryPlugin(context, item, name);
+		compiler.hooks.entryOption.tap(PLUGIN_NAME, (context, entry) => {
+			if (typeof entry !== "function") {
+				for (const name of Object.keys(entry)) {
+					/** @type {Options} */
+					const options = { name, filename: entry.filename };
+					new DllEntryPlugin(
+						context,
+						/** @type {Entries} */ (entry[name].import),
+						options
+					).apply(compiler);
 				}
-				throw new Error("DllPlugin: supply an Array as entry");
-			};
-			if (typeof entry === "object" && !Array.isArray(entry)) {
-				Object.keys(entry).forEach(name => {
-					itemToPlugin(entry[name], name).apply(compiler);
-				});
 			} else {
-				itemToPlugin(entry, "main").apply(compiler);
+				throw new Error(
+					`${PLUGIN_NAME} doesn't support dynamic entry (function) yet`
+				);
 			}
 			return true;
 		});
 		new LibManifestPlugin(this.options).apply(compiler);
 		if (!this.options.entryOnly) {
-			new FlagInitialModulesAsUsedPlugin("DllPlugin").apply(compiler);
+			new FlagAllModulesAsUsedPlugin(PLUGIN_NAME).apply(compiler);
 		}
 	}
 }
diff --git a/lib/DllReferencePlugin.js b/lib/DllReferencePlugin.js
index 62e26d89369..1325ec51361 100644
--- a/lib/DllReferencePlugin.js
+++ b/lib/DllReferencePlugin.js
@@ -2,154 +2,188 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const parseJson = require("json-parse-better-errors");
-const DelegatedSourceDependency = require("./dependencies/DelegatedSourceDependency");
+const parseJson = require("json-parse-even-better-errors");
 const DelegatedModuleFactoryPlugin = require("./DelegatedModuleFactoryPlugin");
 const ExternalModuleFactoryPlugin = require("./ExternalModuleFactoryPlugin");
-const DelegatedExportsDependency = require("./dependencies/DelegatedExportsDependency");
-const NullFactory = require("./NullFactory");
-const makePathsRelative = require("./util/identifier").makePathsRelative;
 const WebpackError = require("./WebpackError");
+const DelegatedSourceDependency = require("./dependencies/DelegatedSourceDependency");
+const createSchemaValidation = require("./util/create-schema-validation");
+const makePathsRelative = require("./util/identifier").makePathsRelative;
 
-const validateOptions = require("schema-utils");
-const schema = require("../schemas/plugins/DllReferencePlugin.json");
-
+/** @typedef {import("../declarations/WebpackOptions").Externals} Externals */
 /** @typedef {import("../declarations/plugins/DllReferencePlugin").DllReferencePluginOptions} DllReferencePluginOptions */
+/** @typedef {import("../declarations/plugins/DllReferencePlugin").DllReferencePluginOptionsContent} DllReferencePluginOptionsContent */
 /** @typedef {import("../declarations/plugins/DllReferencePlugin").DllReferencePluginOptionsManifest} DllReferencePluginOptionsManifest */
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./Compiler").CompilationParams} CompilationParams */
+/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
+
+const validate = createSchemaValidation(
+	require("../schemas/plugins/DllReferencePlugin.check.js"),
+	() => require("../schemas/plugins/DllReferencePlugin.json"),
+	{
+		name: "Dll Reference Plugin",
+		baseDataPath: "options"
+	}
+);
+
+/** @typedef {{ path: string, data: DllReferencePluginOptionsManifest | undefined, error: Error | undefined }} CompilationDataItem */
+
+const PLUGIN_NAME = "DllReferencePlugin";
 
 class DllReferencePlugin {
 	/**
 	 * @param {DllReferencePluginOptions} options options object
 	 */
 	constructor(options) {
-		validateOptions(schema, options, "Dll Reference Plugin");
+		validate(options);
 		this.options = options;
+		/** @type {WeakMap} */
+		this._compilationData = new WeakMap();
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		compiler.hooks.compilation.tap(
-			"DllReferencePlugin",
+			PLUGIN_NAME,
 			(compilation, { normalModuleFactory }) => {
 				compilation.dependencyFactories.set(
 					DelegatedSourceDependency,
 					normalModuleFactory
 				);
-				compilation.dependencyFactories.set(
-					DelegatedExportsDependency,
-					new NullFactory()
-				);
 			}
 		);
 
-		compiler.hooks.beforeCompile.tapAsync(
-			"DllReferencePlugin",
-			(params, callback) => {
-				if ("manifest" in this.options) {
-					const manifest = this.options.manifest;
-					if (typeof manifest === "string") {
-						params.compilationDependencies.add(manifest);
-						compiler.inputFileSystem.readFile(manifest, (err, result) => {
-							if (err) return callback(err);
-							// Catch errors parsing the manifest so that blank
-							// or malformed manifest files don't kill the process.
-							try {
-								params["dll reference " + manifest] = parseJson(
-									result.toString("utf-8")
-								);
-							} catch (e) {
-								// Store the error in the params so that it can
-								// be added as a compilation error later on.
-								const manifestPath = makePathsRelative(
-									compiler.options.context,
-									manifest
-								);
-								params[
-									"dll reference parse error " + manifest
-								] = new DllManifestError(manifestPath, e.message);
-							}
-							return callback();
-						});
-						return;
-					}
+		compiler.hooks.beforeCompile.tapAsync(PLUGIN_NAME, (params, callback) => {
+			if ("manifest" in this.options) {
+				const manifest = this.options.manifest;
+				if (typeof manifest === "string") {
+					/** @type {InputFileSystem} */
+					(compiler.inputFileSystem).readFile(manifest, (err, result) => {
+						if (err) return callback(err);
+						/** @type {CompilationDataItem} */
+						const data = {
+							path: manifest,
+							data: undefined,
+							error: undefined
+						};
+						// Catch errors parsing the manifest so that blank
+						// or malformed manifest files don't kill the process.
+						try {
+							data.data = parseJson(
+								/** @type {Buffer} */ (result).toString("utf-8")
+							);
+						} catch (parseErr) {
+							// Store the error in the params so that it can
+							// be added as a compilation error later on.
+							const manifestPath = makePathsRelative(
+								/** @type {string} */ (compiler.options.context),
+								manifest,
+								compiler.root
+							);
+							data.error = new DllManifestError(
+								manifestPath,
+								/** @type {Error} */ (parseErr).message
+							);
+						}
+						this._compilationData.set(params, data);
+						return callback();
+					});
+					return;
 				}
-				return callback();
 			}
-		);
+			return callback();
+		});
 
-		compiler.hooks.compile.tap("DllReferencePlugin", params => {
+		compiler.hooks.compile.tap(PLUGIN_NAME, params => {
 			let name = this.options.name;
 			let sourceType = this.options.sourceType;
-			let content =
+			let resolvedContent =
 				"content" in this.options ? this.options.content : undefined;
 			if ("manifest" in this.options) {
-				let manifestParameter = this.options.manifest;
+				const manifestParameter = this.options.manifest;
 				let manifest;
 				if (typeof manifestParameter === "string") {
+					const data =
+						/** @type {CompilationDataItem} */
+						(this._compilationData.get(params));
 					// If there was an error parsing the manifest
 					// file, exit now because the error will be added
 					// as a compilation error in the "compilation" hook.
-					if (params["dll reference parse error " + manifestParameter]) {
+					if (data.error) {
 						return;
 					}
-					manifest =
-						/** @type {DllReferencePluginOptionsManifest} */ (params[
-							"dll reference " + manifestParameter
-						]);
+					manifest = data.data;
 				} else {
 					manifest = manifestParameter;
 				}
 				if (manifest) {
 					if (!name) name = manifest.name;
 					if (!sourceType) sourceType = manifest.type;
-					if (!content) content = manifest.content;
+					if (!resolvedContent) resolvedContent = manifest.content;
 				}
 			}
+			/** @type {Externals} */
 			const externals = {};
-			const source = "dll-reference " + name;
-			externals[source] = name;
+			const source = `dll-reference ${name}`;
+			externals[source] = /** @type {string} */ (name);
 			const normalModuleFactory = params.normalModuleFactory;
 			new ExternalModuleFactoryPlugin(sourceType || "var", externals).apply(
 				normalModuleFactory
 			);
 			new DelegatedModuleFactoryPlugin({
-				source: source,
+				source,
 				type: this.options.type,
 				scope: this.options.scope,
-				context: this.options.context || compiler.options.context,
-				content,
-				extensions: this.options.extensions
+				context:
+					/** @type {string} */
+					(this.options.context || compiler.options.context),
+				content:
+					/** @type {DllReferencePluginOptionsContent} */
+					(resolvedContent),
+				extensions: this.options.extensions,
+				associatedObjectForCache: compiler.root
 			}).apply(normalModuleFactory);
 		});
 
-		compiler.hooks.compilation.tap(
-			"DllReferencePlugin",
-			(compilation, params) => {
-				if ("manifest" in this.options) {
-					let manifest = this.options.manifest;
-					if (typeof manifest === "string") {
-						// If there was an error parsing the manifest file, add the
-						// error as a compilation error to make the compilation fail.
-						let e = params["dll reference parse error " + manifest];
-						if (e) {
-							compilation.errors.push(e);
-						}
+		compiler.hooks.compilation.tap(PLUGIN_NAME, (compilation, params) => {
+			if ("manifest" in this.options) {
+				const manifest = this.options.manifest;
+				if (typeof manifest === "string") {
+					const data = /** @type {CompilationDataItem} */ (
+						this._compilationData.get(params)
+					);
+					// If there was an error parsing the manifest file, add the
+					// error as a compilation error to make the compilation fail.
+					if (data.error) {
+						compilation.errors.push(
+							/** @type {DllManifestError} */ (data.error)
+						);
 					}
+					compilation.fileDependencies.add(manifest);
 				}
 			}
-		);
+		});
 	}
 }
 
 class DllManifestError extends WebpackError {
+	/**
+	 * @param {string} filename filename of the manifest
+	 * @param {string} message error message
+	 */
 	constructor(filename, message) {
 		super();
 
 		this.name = "DllManifestError";
 		this.message = `Dll manifest ${filename}\n${message}`;
-
-		Error.captureStackTrace(this, this.constructor);
 	}
 }
 
diff --git a/lib/DynamicEntryPlugin.js b/lib/DynamicEntryPlugin.js
index be9b237b94d..eb2386dd2bd 100644
--- a/lib/DynamicEntryPlugin.js
+++ b/lib/DynamicEntryPlugin.js
@@ -2,18 +2,21 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Naoyuki Kanezawa @nkzawa
 */
+
 "use strict";
 
-const MultiEntryDependency = require("./dependencies/MultiEntryDependency");
-const SingleEntryDependency = require("./dependencies/SingleEntryDependency");
-const MultiModuleFactory = require("./MultiModuleFactory");
-const MultiEntryPlugin = require("./MultiEntryPlugin");
-const SingleEntryPlugin = require("./SingleEntryPlugin");
+const EntryOptionPlugin = require("./EntryOptionPlugin");
+const EntryPlugin = require("./EntryPlugin");
+const EntryDependency = require("./dependencies/EntryDependency");
 
-/** @typedef {import("../declarations/WebpackOptions").EntryDynamic} EntryDynamic */
-/** @typedef {import("../declarations/WebpackOptions").EntryStatic} EntryStatic */
+/** @typedef {import("../declarations/WebpackOptions").EntryDescriptionNormalized} EntryDescriptionNormalized */
+/** @typedef {import("../declarations/WebpackOptions").EntryDynamicNormalized} EntryDynamic */
+/** @typedef {import("../declarations/WebpackOptions").EntryItem} EntryItem */
+/** @typedef {import("../declarations/WebpackOptions").EntryStaticNormalized} EntryStatic */
 /** @typedef {import("./Compiler")} Compiler */
 
+const PLUGIN_NAME = "DynamicEntryPlugin";
+
 class DynamicEntryPlugin {
 	/**
 	 * @param {string} context the context path
@@ -25,70 +28,61 @@ class DynamicEntryPlugin {
 	}
 
 	/**
+	 * Apply the plugin
 	 * @param {Compiler} compiler the compiler instance
 	 * @returns {void}
 	 */
 	apply(compiler) {
 		compiler.hooks.compilation.tap(
-			"DynamicEntryPlugin",
+			PLUGIN_NAME,
 			(compilation, { normalModuleFactory }) => {
-				const multiModuleFactory = new MultiModuleFactory();
-
-				compilation.dependencyFactories.set(
-					MultiEntryDependency,
-					multiModuleFactory
-				);
 				compilation.dependencyFactories.set(
-					SingleEntryDependency,
+					EntryDependency,
 					normalModuleFactory
 				);
 			}
 		);
 
-		compiler.hooks.make.tapAsync(
-			"DynamicEntryPlugin",
-			(compilation, callback) => {
-				/**
-				 * @param {string|string[]} entry entry value or array of entry values
-				 * @param {string} name name of entry
-				 * @returns {Promise} returns the promise resolving the Compilation#addEntry function
-				 */
-				const addEntry = (entry, name) => {
-					const dep = DynamicEntryPlugin.createDependency(entry, name);
-					return new Promise((resolve, reject) => {
-						compilation.addEntry(this.context, dep, name, err => {
-							if (err) return reject(err);
-							resolve();
-						});
-					});
-				};
-
-				Promise.resolve(this.entry()).then(entry => {
-					if (typeof entry === "string" || Array.isArray(entry)) {
-						addEntry(entry, "main").then(() => callback(), callback);
-					} else if (typeof entry === "object") {
-						Promise.all(
-							Object.keys(entry).map(name => {
-								return addEntry(entry[name], name);
-							})
-						).then(() => callback(), callback);
+		compiler.hooks.make.tapPromise(PLUGIN_NAME, compilation =>
+			Promise.resolve(this.entry())
+				.then(entry => {
+					const promises = [];
+					for (const name of Object.keys(entry)) {
+						const desc = entry[name];
+						const options = EntryOptionPlugin.entryDescriptionToOptions(
+							compiler,
+							name,
+							desc
+						);
+						for (const entry of /** @type {NonNullable} */ (
+							desc.import
+						)) {
+							promises.push(
+								new Promise(
+									/**
+									 * @param {(value?: undefined) => void} resolve resolve
+									 * @param {(reason?: Error) => void} reject reject
+									 */
+									(resolve, reject) => {
+										compilation.addEntry(
+											this.context,
+											EntryPlugin.createDependency(entry, options),
+											options,
+											err => {
+												if (err) return reject(err);
+												resolve();
+											}
+										);
+									}
+								)
+							);
+						}
 					}
-				});
-			}
+					return Promise.all(promises);
+				})
+				.then(x => {})
 		);
 	}
 }
 
 module.exports = DynamicEntryPlugin;
-/**
- * @param {string|string[]} entry entry value or array of entry paths
- * @param {string} name name of entry
- * @returns {SingleEntryDependency|MultiEntryDependency} returns dep
- */
-DynamicEntryPlugin.createDependency = (entry, name) => {
-	if (Array.isArray(entry)) {
-		return MultiEntryPlugin.createDependency(entry, name);
-	} else {
-		return SingleEntryPlugin.createDependency(entry, name);
-	}
-};
diff --git a/lib/EntryModuleNotFoundError.js b/lib/EntryModuleNotFoundError.js
deleted file mode 100644
index b2458d6f24f..00000000000
--- a/lib/EntryModuleNotFoundError.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const WebpackError = require("./WebpackError");
-
-class EntryModuleNotFoundError extends WebpackError {
-	constructor(err) {
-		super("Entry module not found: " + err);
-
-		this.name = "EntryModuleNotFoundError";
-		this.details = err.details;
-		this.error = err;
-
-		Error.captureStackTrace(this, this.constructor);
-	}
-}
-
-module.exports = EntryModuleNotFoundError;
diff --git a/lib/EntryOptionPlugin.js b/lib/EntryOptionPlugin.js
index ddda157fe80..25f9d5c1ded 100644
--- a/lib/EntryOptionPlugin.js
+++ b/lib/EntryOptionPlugin.js
@@ -2,45 +2,97 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
-"use strict";
 
-const SingleEntryPlugin = require("./SingleEntryPlugin");
-const MultiEntryPlugin = require("./MultiEntryPlugin");
-const DynamicEntryPlugin = require("./DynamicEntryPlugin");
+"use strict";
 
-/** @typedef {import("../declarations/WebpackOptions").EntryItem} EntryItem */
+/** @typedef {import("../declarations/WebpackOptions").EntryDescriptionNormalized} EntryDescription */
+/** @typedef {import("../declarations/WebpackOptions").EntryNormalized} Entry */
 /** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./Entrypoint").EntryOptions} EntryOptions */
 
-/**
- * @param {string} context context path
- * @param {EntryItem} item entry array or single path
- * @param {string} name entry key name
- * @returns {SingleEntryPlugin | MultiEntryPlugin} returns either a single or multi entry plugin
- */
-const itemToPlugin = (context, item, name) => {
-	if (Array.isArray(item)) {
-		return new MultiEntryPlugin(context, item, name);
-	}
-	return new SingleEntryPlugin(context, item, name);
-};
+const PLUGIN_NAME = "EntryOptionPlugin";
 
-module.exports = class EntryOptionPlugin {
+class EntryOptionPlugin {
 	/**
 	 * @param {Compiler} compiler the compiler instance one is tapping into
 	 * @returns {void}
 	 */
 	apply(compiler) {
-		compiler.hooks.entryOption.tap("EntryOptionPlugin", (context, entry) => {
-			if (typeof entry === "string" || Array.isArray(entry)) {
-				itemToPlugin(context, entry, "main").apply(compiler);
-			} else if (typeof entry === "object") {
-				for (const name of Object.keys(entry)) {
-					itemToPlugin(context, entry[name], name).apply(compiler);
-				}
-			} else if (typeof entry === "function") {
-				new DynamicEntryPlugin(context, entry).apply(compiler);
-			}
+		compiler.hooks.entryOption.tap(PLUGIN_NAME, (context, entry) => {
+			EntryOptionPlugin.applyEntryOption(compiler, context, entry);
 			return true;
 		});
 	}
-};
+
+	/**
+	 * @param {Compiler} compiler the compiler
+	 * @param {string} context context directory
+	 * @param {Entry} entry request
+	 * @returns {void}
+	 */
+	static applyEntryOption(compiler, context, entry) {
+		if (typeof entry === "function") {
+			const DynamicEntryPlugin = require("./DynamicEntryPlugin");
+			new DynamicEntryPlugin(context, entry).apply(compiler);
+		} else {
+			const EntryPlugin = require("./EntryPlugin");
+			for (const name of Object.keys(entry)) {
+				const desc = entry[name];
+				const options = EntryOptionPlugin.entryDescriptionToOptions(
+					compiler,
+					name,
+					desc
+				);
+				const descImport =
+					/** @type {Exclude} */
+					(desc.import);
+				for (const entry of descImport) {
+					new EntryPlugin(context, entry, options).apply(compiler);
+				}
+			}
+		}
+	}
+
+	/**
+	 * @param {Compiler} compiler the compiler
+	 * @param {string} name entry name
+	 * @param {EntryDescription} desc entry description
+	 * @returns {EntryOptions} options for the entry
+	 */
+	static entryDescriptionToOptions(compiler, name, desc) {
+		/** @type {EntryOptions} */
+		const options = {
+			name,
+			filename: desc.filename,
+			runtime: desc.runtime,
+			layer: desc.layer,
+			dependOn: desc.dependOn,
+			baseUri: desc.baseUri,
+			publicPath: desc.publicPath,
+			chunkLoading: desc.chunkLoading,
+			asyncChunks: desc.asyncChunks,
+			wasmLoading: desc.wasmLoading,
+			library: desc.library
+		};
+		if (desc.layer !== undefined && !compiler.options.experiments.layers) {
+			throw new Error(
+				"'entryOptions.layer' is only allowed when 'experiments.layers' is enabled"
+			);
+		}
+		if (desc.chunkLoading) {
+			const EnableChunkLoadingPlugin = require("./javascript/EnableChunkLoadingPlugin");
+			EnableChunkLoadingPlugin.checkEnabled(compiler, desc.chunkLoading);
+		}
+		if (desc.wasmLoading) {
+			const EnableWasmLoadingPlugin = require("./wasm/EnableWasmLoadingPlugin");
+			EnableWasmLoadingPlugin.checkEnabled(compiler, desc.wasmLoading);
+		}
+		if (desc.library) {
+			const EnableLibraryPlugin = require("./library/EnableLibraryPlugin");
+			EnableLibraryPlugin.checkEnabled(compiler, desc.library.type);
+		}
+		return options;
+	}
+}
+
+module.exports = EntryOptionPlugin;
diff --git a/lib/EntryPlugin.js b/lib/EntryPlugin.js
new file mode 100644
index 00000000000..5031b6d077a
--- /dev/null
+++ b/lib/EntryPlugin.js
@@ -0,0 +1,72 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const EntryDependency = require("./dependencies/EntryDependency");
+
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./Entrypoint").EntryOptions} EntryOptions */
+
+const PLUGIN_NAME = "EntryPlugin";
+
+class EntryPlugin {
+	/**
+	 * An entry plugin which will handle creation of the EntryDependency
+	 * @param {string} context context path
+	 * @param {string} entry entry path
+	 * @param {EntryOptions | string=} options entry options (passing a string is deprecated)
+	 */
+	constructor(context, entry, options) {
+		this.context = context;
+		this.entry = entry;
+		this.options = options || "";
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(
+			PLUGIN_NAME,
+			(compilation, { normalModuleFactory }) => {
+				compilation.dependencyFactories.set(
+					EntryDependency,
+					normalModuleFactory
+				);
+			}
+		);
+
+		const { entry, options, context } = this;
+		const dep = EntryPlugin.createDependency(entry, options);
+
+		compiler.hooks.make.tapAsync(PLUGIN_NAME, (compilation, callback) => {
+			compilation.addEntry(context, dep, options, err => {
+				callback(err);
+			});
+		});
+	}
+
+	/**
+	 * @param {string} entry entry request
+	 * @param {EntryOptions | string} options entry options (passing string is deprecated)
+	 * @returns {EntryDependency} the dependency
+	 */
+	static createDependency(entry, options) {
+		const dep = new EntryDependency(entry);
+		// TODO webpack 6 remove string option
+		dep.loc = {
+			name:
+				typeof options === "object"
+					? /** @type {string} */ (options.name)
+					: options
+		};
+		return dep;
+	}
+}
+
+module.exports = EntryPlugin;
diff --git a/lib/Entrypoint.js b/lib/Entrypoint.js
index c1389a4f7d1..7aa019e4d28 100644
--- a/lib/Entrypoint.js
+++ b/lib/Entrypoint.js
@@ -2,12 +2,16 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const ChunkGroup = require("./ChunkGroup");
 
+/** @typedef {import("../declarations/WebpackOptions").EntryDescriptionNormalized} EntryDescription */
 /** @typedef {import("./Chunk")} Chunk */
 
+/** @typedef {{ name?: string } & Omit} EntryOptions */
+
 /**
  * Entrypoint serves as an encapsulation primitive for chunks that are
  * a part of a single ChunkGroup. They represent all bundles that need to be loaded for a
@@ -17,20 +21,30 @@ const ChunkGroup = require("./ChunkGroup");
 class Entrypoint extends ChunkGroup {
 	/**
 	 * Creates an instance of Entrypoint.
-	 * @param {string} name the name of the entrypoint
+	 * @param {EntryOptions | string} entryOptions the options for the entrypoint (or name)
+	 * @param {boolean=} initial false, when the entrypoint is not initial loaded
 	 */
-	constructor(name) {
-		super(name);
+	constructor(entryOptions, initial = true) {
+		if (typeof entryOptions === "string") {
+			entryOptions = { name: entryOptions };
+		}
+		super({
+			name: entryOptions.name
+		});
+		this.options = entryOptions;
+		/** @type {Chunk=} */
+		this._runtimeChunk = undefined;
 		/** @type {Chunk=} */
-		this.runtimeChunk = undefined;
+		this._entrypointChunk = undefined;
+		/** @type {boolean} */
+		this._initial = initial;
 	}
 
 	/**
-	 * isInitial will always return true for Entrypoint ChunkGroup.
-	 * @returns {true} returns true as all entrypoints are initial ChunkGroups
+	 * @returns {boolean} true, when this chunk group will be loaded on initial page load
 	 */
 	isInitial() {
-		return true;
+		return this._initial;
 	}
 
 	/**
@@ -39,24 +53,47 @@ class Entrypoint extends ChunkGroup {
 	 * @returns {void}
 	 */
 	setRuntimeChunk(chunk) {
-		this.runtimeChunk = chunk;
+		this._runtimeChunk = chunk;
 	}
 
 	/**
 	 * Fetches the chunk reference containing the webpack bootstrap code
-	 * @returns {Chunk} returns the runtime chunk or first chunk in `this.chunks`
+	 * @returns {Chunk | null} returns the runtime chunk or null if there is none
 	 */
 	getRuntimeChunk() {
-		return this.runtimeChunk || this.chunks[0];
+		if (this._runtimeChunk) return this._runtimeChunk;
+		for (const parent of this.parentsIterable) {
+			if (parent instanceof Entrypoint) return parent.getRuntimeChunk();
+		}
+		return null;
+	}
+
+	/**
+	 * Sets the chunk with the entrypoint modules for an entrypoint.
+	 * @param {Chunk} chunk the chunk being set as the entrypoint chunk.
+	 * @returns {void}
+	 */
+	setEntrypointChunk(chunk) {
+		this._entrypointChunk = chunk;
+	}
+
+	/**
+	 * Returns the chunk which contains the entrypoint modules
+	 * (or at least the execution of them)
+	 * @returns {Chunk} chunk
+	 */
+	getEntrypointChunk() {
+		return /** @type {Chunk} */ (this._entrypointChunk);
 	}
 
 	/**
 	 * @param {Chunk} oldChunk chunk to be replaced
-	 * @param {Chunk} newChunk New chunkt that will be replaced
-	 * @returns {boolean} rerturns true for
+	 * @param {Chunk} newChunk New chunk that will be replaced with
+	 * @returns {boolean | undefined} returns true if the replacement was successful
 	 */
 	replaceChunk(oldChunk, newChunk) {
-		if (this.runtimeChunk === oldChunk) this.runtimeChunk = newChunk;
+		if (this._runtimeChunk === oldChunk) this._runtimeChunk = newChunk;
+		if (this._entrypointChunk === oldChunk) this._entrypointChunk = newChunk;
 		return super.replaceChunk(oldChunk, newChunk);
 	}
 }
diff --git a/lib/EnvironmentNotSupportAsyncWarning.js b/lib/EnvironmentNotSupportAsyncWarning.js
new file mode 100644
index 00000000000..1a1ea9ece66
--- /dev/null
+++ b/lib/EnvironmentNotSupportAsyncWarning.js
@@ -0,0 +1,52 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Gengkun He @ahabhgk
+*/
+
+"use strict";
+
+const WebpackError = require("./WebpackError");
+const makeSerializable = require("./util/makeSerializable");
+
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./Compilation")} Compilation */
+/** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {"asyncWebAssembly" | "topLevelAwait" | "external promise" | "external script" | "external import" | "external module"} Feature */
+
+class EnvironmentNotSupportAsyncWarning extends WebpackError {
+	/**
+	 * Creates an instance of EnvironmentNotSupportAsyncWarning.
+	 * @param {Module} module module
+	 * @param {Feature} feature feature
+	 */
+	constructor(module, feature) {
+		const message = `The generated code contains 'async/await' because this module is using "${feature}".
+However, your target environment does not appear to support 'async/await'.
+As a result, the code may not run as expected or may cause runtime errors.`;
+		super(message);
+
+		this.name = "EnvironmentNotSupportAsyncWarning";
+		this.module = module;
+	}
+
+	/**
+	 * Creates an instance of EnvironmentNotSupportAsyncWarning.
+	 * @param {Module} module module
+	 * @param {RuntimeTemplate} runtimeTemplate compilation
+	 * @param {Feature} feature feature
+	 */
+	static check(module, runtimeTemplate, feature) {
+		if (!runtimeTemplate.supportsAsyncFunction()) {
+			module.addWarning(new EnvironmentNotSupportAsyncWarning(module, feature));
+		}
+	}
+}
+
+makeSerializable(
+	EnvironmentNotSupportAsyncWarning,
+	"webpack/lib/EnvironmentNotSupportAsyncWarning"
+);
+
+module.exports = EnvironmentNotSupportAsyncWarning;
diff --git a/lib/EnvironmentPlugin.js b/lib/EnvironmentPlugin.js
index c9fafaa8a7e..078cdf67c70 100644
--- a/lib/EnvironmentPlugin.js
+++ b/lib/EnvironmentPlugin.js
@@ -5,65 +5,64 @@
 
 "use strict";
 
-/** @typedef {import("./Compiler")} Compiler */
-
-const WebpackError = require("./WebpackError");
 const DefinePlugin = require("./DefinePlugin");
+const WebpackError = require("./WebpackError");
+
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./DefinePlugin").CodeValue} CodeValue */
 
-const needsEnvVarFix =
-	["8", "9"].indexOf(process.versions.node.split(".")[0]) >= 0 &&
-	process.platform === "win32";
+const PLUGIN_NAME = "EnvironmentPlugin";
 
 class EnvironmentPlugin {
+	/**
+	 * @param {(string | string[] | Record)[]} keys keys
+	 */
 	constructor(...keys) {
 		if (keys.length === 1 && Array.isArray(keys[0])) {
+			/** @type {string[]} */
 			this.keys = keys[0];
 			this.defaultValues = {};
 		} else if (keys.length === 1 && keys[0] && typeof keys[0] === "object") {
 			this.keys = Object.keys(keys[0]);
-			this.defaultValues = keys[0];
+			this.defaultValues =
+				/** @type {Record} */
+				(keys[0]);
 		} else {
-			this.keys = keys;
+			this.keys = /** @type {string[]} */ (keys);
 			this.defaultValues = {};
 		}
 	}
 
 	/**
-	 * @param {Compiler} compiler webpack compiler instance
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
 	 * @returns {void}
 	 */
 	apply(compiler) {
-		const definitions = this.keys.reduce((defs, key) => {
-			// TODO remove once the fix has made its way into Node 8.
-			// Work around https://github.com/nodejs/node/pull/18463,
-			// affecting Node 8 & 9 by performing an OS-level
-			// operation that always succeeds before reading
-			// environment variables:
-			if (needsEnvVarFix) require("os").cpus();
-
+		/** @type {Record} */
+		const definitions = {};
+		for (const key of this.keys) {
 			const value =
 				process.env[key] !== undefined
 					? process.env[key]
 					: this.defaultValues[key];
 
 			if (value === undefined) {
-				compiler.hooks.thisCompilation.tap("EnvironmentPlugin", compilation => {
+				compiler.hooks.thisCompilation.tap(PLUGIN_NAME, compilation => {
 					const error = new WebpackError(
-						`EnvironmentPlugin - ${key} environment variable is undefined.\n\n` +
+						`${PLUGIN_NAME} - ${key} environment variable is undefined.\n\n` +
 							"You can pass an object with default values to suppress this warning.\n" +
 							"See https://webpack.js.org/plugins/environment-plugin for example."
 					);
 
 					error.name = "EnvVariableNotDefinedError";
-					compilation.warnings.push(error);
+					compilation.errors.push(error);
 				});
 			}
 
-			defs[`process.env.${key}`] =
+			definitions[`process.env.${key}`] =
 				value === undefined ? "undefined" : JSON.stringify(value);
-
-			return defs;
-		}, {});
+		}
 
 		new DefinePlugin(definitions).apply(compiler);
 	}
diff --git a/lib/ErrorHelpers.js b/lib/ErrorHelpers.js
index 900ae4d59e8..58c11554193 100644
--- a/lib/ErrorHelpers.js
+++ b/lib/ErrorHelpers.js
@@ -2,59 +2,99 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const loaderFlag = "LOADER_EXECUTION";
 
 const webpackOptionsFlag = "WEBPACK_OPTIONS";
 
-exports.cutOffByFlag = (stack, flag) => {
-	stack = stack.split("\n");
-	for (let i = 0; i < stack.length; i++) {
-		if (stack[i].includes(flag)) {
-			stack.length = i;
+/**
+ * @param {string} stack stack trace
+ * @param {string} flag flag to cut off
+ * @returns {string} stack trace without the specified flag included
+ */
+const cutOffByFlag = (stack, flag) => {
+	const errorStack = stack.split("\n");
+	for (let i = 0; i < errorStack.length; i++) {
+		if (errorStack[i].includes(flag)) {
+			errorStack.length = i;
 		}
 	}
-	return stack.join("\n");
+	return errorStack.join("\n");
 };
 
-exports.cutOffLoaderExecution = stack =>
-	exports.cutOffByFlag(stack, loaderFlag);
+/**
+ * @param {string} stack stack trace
+ * @returns {string} stack trace without the loader execution flag included
+ */
+const cutOffLoaderExecution = stack => cutOffByFlag(stack, loaderFlag);
+
+/**
+ * @param {string} stack stack trace
+ * @returns {string} stack trace without the webpack options flag included
+ */
+const cutOffWebpackOptions = stack => cutOffByFlag(stack, webpackOptionsFlag);
 
-exports.cutOffWebpackOptions = stack =>
-	exports.cutOffByFlag(stack, webpackOptionsFlag);
+/**
+ * @param {string} stack stack trace
+ * @param {string} message error message
+ * @returns {string} stack trace without the message included
+ */
+const cutOffMultilineMessage = (stack, message) => {
+	const stackSplitByLines = stack.split("\n");
+	const messageSplitByLines = message.split("\n");
 
-exports.cutOffMultilineMessage = (stack, message) => {
-	stack = stack.split("\n");
-	message = message.split("\n");
+	/** @type {string[]} */
+	const result = [];
 
-	return stack
-		.reduce(
-			(acc, line, idx) =>
-				line.includes(message[idx]) ? acc : acc.concat(line),
-			[]
-		)
-		.join("\n");
+	for (const [idx, line] of stackSplitByLines.entries()) {
+		if (!line.includes(messageSplitByLines[idx])) result.push(line);
+	}
+
+	return result.join("\n");
 };
 
-exports.cutOffMessage = (stack, message) => {
+/**
+ * @param {string} stack stack trace
+ * @param {string} message error message
+ * @returns {string} stack trace without the message included
+ */
+const cutOffMessage = (stack, message) => {
 	const nextLine = stack.indexOf("\n");
 	if (nextLine === -1) {
 		return stack === message ? "" : stack;
-	} else {
-		const firstLine = stack.substr(0, nextLine);
-		return firstLine === message ? stack.substr(nextLine + 1) : stack;
 	}
+	const firstLine = stack.slice(0, nextLine);
+	return firstLine === message ? stack.slice(nextLine + 1) : stack;
 };
 
-exports.cleanUp = (stack, message) => {
-	stack = exports.cutOffLoaderExecution(stack);
-	stack = exports.cutOffMessage(stack, message);
+/**
+ * @param {string} stack stack trace
+ * @param {string} message error message
+ * @returns {string} stack trace without the loader execution flag and message included
+ */
+const cleanUp = (stack, message) => {
+	stack = cutOffLoaderExecution(stack);
+	stack = cutOffMessage(stack, message);
 	return stack;
 };
 
-exports.cleanUpWebpackOptions = (stack, message) => {
-	stack = exports.cutOffWebpackOptions(stack);
-	stack = exports.cutOffMultilineMessage(stack, message);
+/**
+ * @param {string} stack stack trace
+ * @param {string} message error message
+ * @returns {string} stack trace without the webpack options flag and message included
+ */
+const cleanUpWebpackOptions = (stack, message) => {
+	stack = cutOffWebpackOptions(stack);
+	stack = cutOffMultilineMessage(stack, message);
 	return stack;
 };
+
+module.exports.cutOffByFlag = cutOffByFlag;
+module.exports.cutOffLoaderExecution = cutOffLoaderExecution;
+module.exports.cutOffWebpackOptions = cutOffWebpackOptions;
+module.exports.cutOffMultilineMessage = cutOffMultilineMessage;
+module.exports.cutOffMessage = cutOffMessage;
+module.exports.cleanUp = cleanUp;
+module.exports.cleanUpWebpackOptions = cleanUpWebpackOptions;
diff --git a/lib/EvalDevToolModulePlugin.js b/lib/EvalDevToolModulePlugin.js
index 2af11f9c3a4..956dd6a14a4 100644
--- a/lib/EvalDevToolModulePlugin.js
+++ b/lib/EvalDevToolModulePlugin.js
@@ -2,24 +2,128 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const EvalDevToolModuleTemplatePlugin = require("./EvalDevToolModuleTemplatePlugin");
+const { ConcatSource, RawSource } = require("webpack-sources");
+const ExternalModule = require("./ExternalModule");
+const ModuleFilenameHelpers = require("./ModuleFilenameHelpers");
+const RuntimeGlobals = require("./RuntimeGlobals");
+const JavascriptModulesPlugin = require("./javascript/JavascriptModulesPlugin");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../declarations/WebpackOptions").OutputNormalized} OutputOptions */
+/** @typedef {import("./Compiler")} Compiler */
+
+/** @type {WeakMap} */
+const cache = new WeakMap();
+
+const devtoolWarning = new RawSource(`/*
+ * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
+ * This devtool is neither made for production nor for readable output files.
+ * It uses "eval()" calls to create a separate source file in the browser devtools.
+ * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
+ * or disable the default devtool with "devtool: false".
+ * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
+ */
+`);
+
+/**
+ * @typedef {object} EvalDevToolModulePluginOptions
+ * @property {OutputOptions["devtoolNamespace"]=} namespace namespace
+ * @property {string=} sourceUrlComment source url comment
+ * @property {OutputOptions["devtoolModuleFilenameTemplate"]=} moduleFilenameTemplate module filename template
+ */
+
+const PLUGIN_NAME = "EvalDevToolModulePlugin";
 
 class EvalDevToolModulePlugin {
-	constructor(options) {
-		this.sourceUrlComment = options.sourceUrlComment;
-		this.moduleFilenameTemplate = options.moduleFilenameTemplate;
-		this.namespace = options.namespace;
+	/**
+	 * @param {EvalDevToolModulePluginOptions=} options options
+	 */
+	constructor(options = {}) {
+		this.namespace = options.namespace || "";
+		this.sourceUrlComment = options.sourceUrlComment || "\n//# sourceURL=[url]";
+		this.moduleFilenameTemplate =
+			options.moduleFilenameTemplate ||
+			"webpack://[namespace]/[resourcePath]?[loaders]";
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		compiler.hooks.compilation.tap("EvalDevToolModulePlugin", compilation => {
-			new EvalDevToolModuleTemplatePlugin({
-				sourceUrlComment: this.sourceUrlComment,
-				moduleFilenameTemplate: this.moduleFilenameTemplate,
-				namespace: this.namespace
-			}).apply(compilation.moduleTemplates.javascript);
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			const hooks = JavascriptModulesPlugin.getCompilationHooks(compilation);
+			hooks.renderModuleContent.tap(
+				PLUGIN_NAME,
+				(source, module, { chunk, runtimeTemplate, chunkGraph }) => {
+					const cacheEntry = cache.get(source);
+					if (cacheEntry !== undefined) return cacheEntry;
+					if (module instanceof ExternalModule) {
+						cache.set(source, source);
+						return source;
+					}
+					const content = source.source();
+					const namespace = compilation.getPath(this.namespace, {
+						chunk
+					});
+					const str = ModuleFilenameHelpers.createFilename(
+						module,
+						{
+							moduleFilenameTemplate: this.moduleFilenameTemplate,
+							namespace
+						},
+						{
+							requestShortener: runtimeTemplate.requestShortener,
+							chunkGraph,
+							hashFunction: compilation.outputOptions.hashFunction
+						}
+					);
+					const footer = `\n${this.sourceUrlComment.replace(
+						/\[url\]/g,
+						encodeURI(str)
+							.replace(/%2F/g, "/")
+							.replace(/%20/g, "_")
+							.replace(/%5E/g, "^")
+							.replace(/%5C/g, "\\")
+							.replace(/^\//, "")
+					)}`;
+					const result = new RawSource(
+						`eval(${
+							compilation.outputOptions.trustedTypes
+								? `${RuntimeGlobals.createScript}(${JSON.stringify(
+										content + footer
+									)})`
+								: JSON.stringify(content + footer)
+						});`
+					);
+					cache.set(source, result);
+					return result;
+				}
+			);
+			hooks.inlineInRuntimeBailout.tap(
+				PLUGIN_NAME,
+				() => "the eval devtool is used."
+			);
+			hooks.render.tap(
+				PLUGIN_NAME,
+				source => new ConcatSource(devtoolWarning, source)
+			);
+			hooks.chunkHash.tap(PLUGIN_NAME, (chunk, hash) => {
+				hash.update(PLUGIN_NAME);
+				hash.update("2");
+			});
+			if (compilation.outputOptions.trustedTypes) {
+				compilation.hooks.additionalModuleRuntimeRequirements.tap(
+					PLUGIN_NAME,
+					(module, set, context) => {
+						set.add(RuntimeGlobals.createScript);
+					}
+				);
+			}
 		});
 	}
 }
diff --git a/lib/EvalDevToolModuleTemplatePlugin.js b/lib/EvalDevToolModuleTemplatePlugin.js
deleted file mode 100644
index ab5dd1aac1c..00000000000
--- a/lib/EvalDevToolModuleTemplatePlugin.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const { RawSource } = require("webpack-sources");
-const ModuleFilenameHelpers = require("./ModuleFilenameHelpers");
-
-const cache = new WeakMap();
-
-class EvalDevToolModuleTemplatePlugin {
-	constructor(options) {
-		this.sourceUrlComment = options.sourceUrlComment || "\n//# sourceURL=[url]";
-		this.moduleFilenameTemplate =
-			options.moduleFilenameTemplate ||
-			"webpack://[namespace]/[resourcePath]?[loaders]";
-		this.namespace = options.namespace || "";
-	}
-
-	apply(moduleTemplate) {
-		moduleTemplate.hooks.module.tap(
-			"EvalDevToolModuleTemplatePlugin",
-			(source, module) => {
-				const cacheEntry = cache.get(source);
-				if (cacheEntry !== undefined) return cacheEntry;
-				const content = source.source();
-				const str = ModuleFilenameHelpers.createFilename(
-					module,
-					{
-						moduleFilenameTemplate: this.moduleFilenameTemplate,
-						namespace: this.namespace
-					},
-					moduleTemplate.runtimeTemplate.requestShortener
-				);
-				const footer =
-					"\n" +
-					this.sourceUrlComment.replace(
-						/\[url\]/g,
-						encodeURI(str)
-							.replace(/%2F/g, "/")
-							.replace(/%20/g, "_")
-							.replace(/%5E/g, "^")
-							.replace(/%5C/g, "\\")
-							.replace(/^\//, "")
-					);
-				const result = new RawSource(
-					`eval(${JSON.stringify(content + footer)});`
-				);
-				cache.set(source, result);
-				return result;
-			}
-		);
-		moduleTemplate.hooks.hash.tap("EvalDevToolModuleTemplatePlugin", hash => {
-			hash.update("EvalDevToolModuleTemplatePlugin");
-			hash.update("2");
-		});
-	}
-}
-
-module.exports = EvalDevToolModuleTemplatePlugin;
diff --git a/lib/EvalSourceMapDevToolModuleTemplatePlugin.js b/lib/EvalSourceMapDevToolModuleTemplatePlugin.js
deleted file mode 100644
index ac22c68976e..00000000000
--- a/lib/EvalSourceMapDevToolModuleTemplatePlugin.js
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const { RawSource } = require("webpack-sources");
-const ModuleFilenameHelpers = require("./ModuleFilenameHelpers");
-
-const cache = new WeakMap();
-
-class EvalSourceMapDevToolModuleTemplatePlugin {
-	constructor(compilation, options) {
-		this.compilation = compilation;
-		this.sourceMapComment =
-			options.append || "//# sourceURL=[module]\n//# sourceMappingURL=[url]";
-		this.moduleFilenameTemplate =
-			options.moduleFilenameTemplate ||
-			"webpack://[namespace]/[resource-path]?[hash]";
-		this.namespace = options.namespace || "";
-		this.options = options;
-	}
-
-	apply(moduleTemplate) {
-		const self = this;
-		const options = this.options;
-		const matchModule = ModuleFilenameHelpers.matchObject.bind(
-			ModuleFilenameHelpers,
-			options
-		);
-		moduleTemplate.hooks.module.tap(
-			"EvalSourceMapDevToolModuleTemplatePlugin",
-			(source, module) => {
-				const cachedSource = cache.get(source);
-				if (cachedSource !== undefined) {
-					return cachedSource;
-				}
-
-				if (!matchModule(module.resource)) {
-					return source;
-				}
-
-				/** @type {{ [key: string]: TODO; }} */
-				let sourceMap;
-				let content;
-				if (source.sourceAndMap) {
-					const sourceAndMap = source.sourceAndMap(options);
-					sourceMap = sourceAndMap.map;
-					content = sourceAndMap.source;
-				} else {
-					sourceMap = source.map(options);
-					content = source.source();
-				}
-				if (!sourceMap) {
-					return source;
-				}
-
-				// Clone (flat) the sourcemap to ensure that the mutations below do not persist.
-				sourceMap = Object.keys(sourceMap).reduce((obj, key) => {
-					obj[key] = sourceMap[key];
-					return obj;
-				}, {});
-				const modules = sourceMap.sources.map(source => {
-					const module = self.compilation.findModule(source);
-					return module || source;
-				});
-				let moduleFilenames = modules.map(module => {
-					return ModuleFilenameHelpers.createFilename(
-						module,
-						{
-							moduleFilenameTemplate: self.moduleFilenameTemplate,
-							namespace: self.namespace
-						},
-						moduleTemplate.runtimeTemplate.requestShortener
-					);
-				});
-				moduleFilenames = ModuleFilenameHelpers.replaceDuplicates(
-					moduleFilenames,
-					(filename, i, n) => {
-						for (let j = 0; j < n; j++) filename += "*";
-						return filename;
-					}
-				);
-				sourceMap.sources = moduleFilenames;
-				sourceMap.sourceRoot = options.sourceRoot || "";
-				sourceMap.file = `${module.id}.js`;
-
-				const footer =
-					self.sourceMapComment.replace(
-						/\[url\]/g,
-						`data:application/json;charset=utf-8;base64,${Buffer.from(
-							JSON.stringify(sourceMap),
-							"utf8"
-						).toString("base64")}`
-					) + `\n//# sourceURL=webpack-internal:///${module.id}\n`; // workaround for chrome bug
-
-				const evalSource = new RawSource(
-					`eval(${JSON.stringify(content + footer)});`
-				);
-
-				cache.set(source, evalSource);
-
-				return evalSource;
-			}
-		);
-		moduleTemplate.hooks.hash.tap(
-			"EvalSourceMapDevToolModuleTemplatePlugin",
-			hash => {
-				hash.update("eval-source-map");
-				hash.update("2");
-			}
-		);
-	}
-}
-module.exports = EvalSourceMapDevToolModuleTemplatePlugin;
diff --git a/lib/EvalSourceMapDevToolPlugin.js b/lib/EvalSourceMapDevToolPlugin.js
index daf9aaddfc6..29dcc55c52a 100644
--- a/lib/EvalSourceMapDevToolPlugin.js
+++ b/lib/EvalSourceMapDevToolPlugin.js
@@ -2,39 +2,224 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const EvalSourceMapDevToolModuleTemplatePlugin = require("./EvalSourceMapDevToolModuleTemplatePlugin");
+const { ConcatSource, RawSource } = require("webpack-sources");
+const ModuleFilenameHelpers = require("./ModuleFilenameHelpers");
+const NormalModule = require("./NormalModule");
+const RuntimeGlobals = require("./RuntimeGlobals");
 const SourceMapDevToolModuleOptionsPlugin = require("./SourceMapDevToolModuleOptionsPlugin");
+const JavascriptModulesPlugin = require("./javascript/JavascriptModulesPlugin");
+const ConcatenatedModule = require("./optimize/ConcatenatedModule");
+const generateDebugId = require("./util/generateDebugId");
+const { makePathsAbsolute } = require("./util/identifier");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../declarations/WebpackOptions").DevTool} DevToolOptions */
+/** @typedef {import("../declarations/plugins/SourceMapDevToolPlugin").SourceMapDevToolPluginOptions} SourceMapDevToolPluginOptions */
+/** @typedef {import("./ChunkGraph").ModuleId} ModuleId */
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./NormalModule").SourceMap} SourceMap */
+
+/** @type {WeakMap} */
+const cache = new WeakMap();
+
+const devtoolWarning = new RawSource(`/*
+ * ATTENTION: An "eval-source-map" devtool has been used.
+ * This devtool is neither made for production nor for readable output files.
+ * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
+ * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
+ * or disable the default devtool with "devtool: false".
+ * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
+ */
+`);
+
+const PLUGIN_NAME = "EvalSourceMapDevToolPlugin";
 
 class EvalSourceMapDevToolPlugin {
-	constructor(options) {
-		if (arguments.length > 1) {
-			throw new Error(
-				"EvalSourceMapDevToolPlugin only takes one argument (pass an options object)"
-			);
-		}
-		if (typeof options === "string") {
+	/**
+	 * @param {SourceMapDevToolPluginOptions | string} inputOptions Options object
+	 */
+	constructor(inputOptions) {
+		/** @type {SourceMapDevToolPluginOptions} */
+		let options;
+		if (typeof inputOptions === "string") {
 			options = {
-				append: options
+				append: inputOptions
 			};
+		} else {
+			options = inputOptions;
 		}
-		if (!options) options = {};
+		this.sourceMapComment =
+			options.append && typeof options.append !== "function"
+				? options.append
+				: "//# sourceURL=[module]\n//# sourceMappingURL=[url]";
+		this.moduleFilenameTemplate =
+			options.moduleFilenameTemplate ||
+			"webpack://[namespace]/[resource-path]?[hash]";
+		this.namespace = options.namespace || "";
 		this.options = options;
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		const options = this.options;
-		compiler.hooks.compilation.tap(
-			"EvalSourceMapDevToolPlugin",
-			compilation => {
-				new SourceMapDevToolModuleOptionsPlugin(options).apply(compilation);
-				new EvalSourceMapDevToolModuleTemplatePlugin(
-					compilation,
-					options
-				).apply(compilation.moduleTemplates.javascript);
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			const hooks = JavascriptModulesPlugin.getCompilationHooks(compilation);
+			new SourceMapDevToolModuleOptionsPlugin(options).apply(compilation);
+			const matchModule = ModuleFilenameHelpers.matchObject.bind(
+				ModuleFilenameHelpers,
+				options
+			);
+			hooks.renderModuleContent.tap(
+				PLUGIN_NAME,
+				(source, m, { chunk, runtimeTemplate, chunkGraph }) => {
+					const cachedSource = cache.get(source);
+					if (cachedSource !== undefined) {
+						return cachedSource;
+					}
+
+					/**
+					 * @param {Source} r result
+					 * @returns {Source} result
+					 */
+					const result = r => {
+						cache.set(source, r);
+						return r;
+					};
+
+					if (m instanceof NormalModule) {
+						const module = /** @type {NormalModule} */ (m);
+						if (!matchModule(module.resource)) {
+							return result(source);
+						}
+					} else if (m instanceof ConcatenatedModule) {
+						const concatModule = /** @type {ConcatenatedModule} */ (m);
+						if (concatModule.rootModule instanceof NormalModule) {
+							const module = /** @type {NormalModule} */ (
+								concatModule.rootModule
+							);
+							if (!matchModule(module.resource)) {
+								return result(source);
+							}
+						} else {
+							return result(source);
+						}
+					} else {
+						return result(source);
+					}
+
+					const namespace = compilation.getPath(this.namespace, {
+						chunk
+					});
+					/** @type {SourceMap} */
+					let sourceMap;
+					let content;
+					if (source.sourceAndMap) {
+						const sourceAndMap = source.sourceAndMap(options);
+						sourceMap = /** @type {SourceMap} */ (sourceAndMap.map);
+						content = sourceAndMap.source;
+					} else {
+						sourceMap = /** @type {SourceMap} */ (source.map(options));
+						content = source.source();
+					}
+					if (!sourceMap) {
+						return result(source);
+					}
+
+					// Clone (flat) the sourcemap to ensure that the mutations below do not persist.
+					sourceMap = { ...sourceMap };
+					const context = /** @type {string} */ (compiler.options.context);
+					const root = compiler.root;
+					const modules = sourceMap.sources.map(source => {
+						if (!source.startsWith("webpack://")) return source;
+						source = makePathsAbsolute(context, source.slice(10), root);
+						const module = compilation.findModule(source);
+						return module || source;
+					});
+					let moduleFilenames = modules.map(module =>
+						ModuleFilenameHelpers.createFilename(
+							module,
+							{
+								moduleFilenameTemplate: this.moduleFilenameTemplate,
+								namespace
+							},
+							{
+								requestShortener: runtimeTemplate.requestShortener,
+								chunkGraph,
+								hashFunction: compilation.outputOptions.hashFunction
+							}
+						)
+					);
+					moduleFilenames = ModuleFilenameHelpers.replaceDuplicates(
+						moduleFilenames,
+						(filename, i, n) => {
+							for (let j = 0; j < n; j++) filename += "*";
+							return filename;
+						}
+					);
+					sourceMap.sources = moduleFilenames;
+					if (options.noSources) {
+						sourceMap.sourcesContent = undefined;
+					}
+					sourceMap.sourceRoot = options.sourceRoot || "";
+					const moduleId =
+						/** @type {ModuleId} */
+						(chunkGraph.getModuleId(m));
+					sourceMap.file =
+						typeof moduleId === "number" ? `${moduleId}.js` : moduleId;
+
+					if (options.debugIds) {
+						sourceMap.debugId = generateDebugId(content, sourceMap.file);
+					}
+
+					const footer = `${this.sourceMapComment.replace(
+						/\[url\]/g,
+						`data:application/json;charset=utf-8;base64,${Buffer.from(
+							JSON.stringify(sourceMap),
+							"utf8"
+						).toString("base64")}`
+					)}\n//# sourceURL=webpack-internal:///${moduleId}\n`; // workaround for chrome bug
+
+					return result(
+						new RawSource(
+							`eval(${
+								compilation.outputOptions.trustedTypes
+									? `${RuntimeGlobals.createScript}(${JSON.stringify(
+											content + footer
+										)})`
+									: JSON.stringify(content + footer)
+							});`
+						)
+					);
+				}
+			);
+			hooks.inlineInRuntimeBailout.tap(
+				"EvalDevToolModulePlugin",
+				() => "the eval-source-map devtool is used."
+			);
+			hooks.render.tap(
+				PLUGIN_NAME,
+				source => new ConcatSource(devtoolWarning, source)
+			);
+			hooks.chunkHash.tap(PLUGIN_NAME, (chunk, hash) => {
+				hash.update(PLUGIN_NAME);
+				hash.update("2");
+			});
+			if (compilation.outputOptions.trustedTypes) {
+				compilation.hooks.additionalModuleRuntimeRequirements.tap(
+					PLUGIN_NAME,
+					(module, set, context) => {
+						set.add(RuntimeGlobals.createScript);
+					}
+				);
 			}
-		);
+		});
 	}
 }
 
diff --git a/lib/ExportPropertyMainTemplatePlugin.js b/lib/ExportPropertyMainTemplatePlugin.js
deleted file mode 100644
index 90df031aabb..00000000000
--- a/lib/ExportPropertyMainTemplatePlugin.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const { ConcatSource } = require("webpack-sources");
-
-/** @typedef {import("./Compilation")} Compilation */
-
-/**
- * @param {string[]} accessor the accessor to convert to path
- * @returns {string} the path
- */
-const accessorToObjectAccess = accessor => {
-	return accessor.map(a => `[${JSON.stringify(a)}]`).join("");
-};
-
-class ExportPropertyMainTemplatePlugin {
-	/**
-	 * @param {string|string[]} property the name of the property to export
-	 */
-	constructor(property) {
-		this.property = property;
-	}
-
-	/**
-	 * @param {Compilation} compilation the compilation instance
-	 * @returns {void}
-	 */
-	apply(compilation) {
-		const { mainTemplate, chunkTemplate } = compilation;
-
-		const onRenderWithEntry = (source, chunk, hash) => {
-			const postfix = `${accessorToObjectAccess([].concat(this.property))}`;
-			return new ConcatSource(source, postfix);
-		};
-
-		for (const template of [mainTemplate, chunkTemplate]) {
-			template.hooks.renderWithEntry.tap(
-				"ExportPropertyMainTemplatePlugin",
-				onRenderWithEntry
-			);
-		}
-
-		mainTemplate.hooks.hash.tap("ExportPropertyMainTemplatePlugin", hash => {
-			hash.update("export property");
-			hash.update(`${this.property}`);
-		});
-	}
-}
-
-module.exports = ExportPropertyMainTemplatePlugin;
diff --git a/lib/ExportsInfo.js b/lib/ExportsInfo.js
new file mode 100644
index 00000000000..7234957339c
--- /dev/null
+++ b/lib/ExportsInfo.js
@@ -0,0 +1,1675 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { equals } = require("./util/ArrayHelpers");
+const SortableSet = require("./util/SortableSet");
+const makeSerializable = require("./util/makeSerializable");
+const { forEachRuntime } = require("./util/runtime");
+
+/** @typedef {import("./Dependency")} Dependency */
+/** @typedef {import("./Dependency").RuntimeSpec} RuntimeSpec */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./ModuleGraph")} ModuleGraph */
+/** @typedef {import("./ModuleGraphConnection")} ModuleGraphConnection */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("./util/Hash")} Hash */
+
+/** @typedef {typeof UsageState.OnlyPropertiesUsed | typeof UsageState.NoInfo | typeof UsageState.Unknown | typeof UsageState.Used} RuntimeUsageStateType */
+/** @typedef {typeof UsageState.Unused | RuntimeUsageStateType} UsageStateType */
+
+const UsageState = Object.freeze({
+	Unused: /** @type {0} */ (0),
+	OnlyPropertiesUsed: /** @type {1} */ (1),
+	NoInfo: /** @type {2} */ (2),
+	Unknown: /** @type {3} */ (3),
+	Used: /** @type {4} */ (4)
+});
+
+const RETURNS_TRUE = () => true;
+
+const CIRCULAR = Symbol("circular target");
+
+/**
+ * @typedef {object} RestoreProvidedDataExports
+ * @property {ExportInfoName} name
+ * @property {ExportInfo["provided"]} provided
+ * @property {ExportInfo["canMangleProvide"]} canMangleProvide
+ * @property {ExportInfo["terminalBinding"]} terminalBinding
+ * @property {RestoreProvidedData | undefined} exportsInfo
+ */
+
+class RestoreProvidedData {
+	/**
+	 * @param {RestoreProvidedDataExports[]} exports exports
+	 * @param {ExportInfo["provided"]} otherProvided other provided
+	 * @param {ExportInfo["canMangleProvide"]} otherCanMangleProvide other can mangle provide
+	 * @param {ExportInfo["terminalBinding"]} otherTerminalBinding other terminal binding
+	 */
+	constructor(
+		exports,
+		otherProvided,
+		otherCanMangleProvide,
+		otherTerminalBinding
+	) {
+		this.exports = exports;
+		this.otherProvided = otherProvided;
+		this.otherCanMangleProvide = otherCanMangleProvide;
+		this.otherTerminalBinding = otherTerminalBinding;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize({ write }) {
+		write(this.exports);
+		write(this.otherProvided);
+		write(this.otherCanMangleProvide);
+		write(this.otherTerminalBinding);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 * @returns {RestoreProvidedData} RestoreProvidedData
+	 */
+	static deserialize({ read }) {
+		return new RestoreProvidedData(read(), read(), read(), read());
+	}
+}
+
+makeSerializable(
+	RestoreProvidedData,
+	"webpack/lib/ModuleGraph",
+	"RestoreProvidedData"
+);
+
+/** @typedef {Map} Exports */
+/** @typedef {string | string[] | false} UsedName */
+
+class ExportsInfo {
+	constructor() {
+		/** @type {Exports} */
+		this._exports = new Map();
+		this._otherExportsInfo = new ExportInfo(/** @type {TODO} */ (null));
+		this._sideEffectsOnlyInfo = new ExportInfo("*side effects only*");
+		this._exportsAreOrdered = false;
+		/** @type {ExportsInfo=} */
+		this._redirectTo = undefined;
+	}
+
+	/**
+	 * @returns {Iterable} all owned exports in any order
+	 */
+	get ownedExports() {
+		return this._exports.values();
+	}
+
+	/**
+	 * @returns {Iterable} all owned exports in order
+	 */
+	get orderedOwnedExports() {
+		if (!this._exportsAreOrdered) {
+			this._sortExports();
+		}
+		return this._exports.values();
+	}
+
+	/**
+	 * @returns {Iterable} all exports in any order
+	 */
+	get exports() {
+		if (this._redirectTo !== undefined) {
+			const map = new Map(this._redirectTo._exports);
+			for (const [key, value] of this._exports) {
+				map.set(key, value);
+			}
+			return map.values();
+		}
+		return this._exports.values();
+	}
+
+	/**
+	 * @returns {Iterable} all exports in order
+	 */
+	get orderedExports() {
+		if (!this._exportsAreOrdered) {
+			this._sortExports();
+		}
+		if (this._redirectTo !== undefined) {
+			/** @type {Exports} */
+			const map = new Map(
+				Array.from(this._redirectTo.orderedExports, item => [item.name, item])
+			);
+			for (const [key, value] of this._exports) {
+				map.set(key, value);
+			}
+			// sorting should be pretty fast as map contains
+			// a lot of presorted items
+			this._sortExportsMap(map);
+			return map.values();
+		}
+		return this._exports.values();
+	}
+
+	/**
+	 * @returns {ExportInfo} the export info of unlisted exports
+	 */
+	get otherExportsInfo() {
+		if (this._redirectTo !== undefined)
+			return this._redirectTo.otherExportsInfo;
+		return this._otherExportsInfo;
+	}
+
+	/**
+	 * @param {Exports} exports exports
+	 * @private
+	 */
+	_sortExportsMap(exports) {
+		if (exports.size > 1) {
+			/** @type {string[]} */
+			const namesInOrder = [];
+			for (const entry of exports.values()) {
+				namesInOrder.push(entry.name);
+			}
+			namesInOrder.sort();
+			let i = 0;
+			for (const entry of exports.values()) {
+				const name = namesInOrder[i];
+				if (entry.name !== name) break;
+				i++;
+			}
+			for (; i < namesInOrder.length; i++) {
+				const name = namesInOrder[i];
+				const correctEntry = /** @type {ExportInfo} */ (exports.get(name));
+				exports.delete(name);
+				exports.set(name, correctEntry);
+			}
+		}
+	}
+
+	_sortExports() {
+		this._sortExportsMap(this._exports);
+		this._exportsAreOrdered = true;
+	}
+
+	/**
+	 * @param {ExportsInfo | undefined} exportsInfo exports info
+	 * @returns {boolean} result
+	 */
+	setRedirectNamedTo(exportsInfo) {
+		if (this._redirectTo === exportsInfo) return false;
+		this._redirectTo = exportsInfo;
+		return true;
+	}
+
+	setHasProvideInfo() {
+		for (const exportInfo of this._exports.values()) {
+			if (exportInfo.provided === undefined) {
+				exportInfo.provided = false;
+			}
+			if (exportInfo.canMangleProvide === undefined) {
+				exportInfo.canMangleProvide = true;
+			}
+		}
+		if (this._redirectTo !== undefined) {
+			this._redirectTo.setHasProvideInfo();
+		} else {
+			if (this._otherExportsInfo.provided === undefined) {
+				this._otherExportsInfo.provided = false;
+			}
+			if (this._otherExportsInfo.canMangleProvide === undefined) {
+				this._otherExportsInfo.canMangleProvide = true;
+			}
+		}
+	}
+
+	setHasUseInfo() {
+		for (const exportInfo of this._exports.values()) {
+			exportInfo.setHasUseInfo();
+		}
+		this._sideEffectsOnlyInfo.setHasUseInfo();
+		if (this._redirectTo !== undefined) {
+			this._redirectTo.setHasUseInfo();
+		} else {
+			this._otherExportsInfo.setHasUseInfo();
+		}
+	}
+
+	/**
+	 * @param {ExportInfoName} name export name
+	 * @returns {ExportInfo} export info for this name
+	 */
+	getOwnExportInfo(name) {
+		const info = this._exports.get(name);
+		if (info !== undefined) return info;
+		const newInfo = new ExportInfo(name, this._otherExportsInfo);
+		this._exports.set(name, newInfo);
+		this._exportsAreOrdered = false;
+		return newInfo;
+	}
+
+	/**
+	 * @param {ExportInfoName} name export name
+	 * @returns {ExportInfo} export info for this name
+	 */
+	getExportInfo(name) {
+		const info = this._exports.get(name);
+		if (info !== undefined) return info;
+		if (this._redirectTo !== undefined)
+			return this._redirectTo.getExportInfo(name);
+		const newInfo = new ExportInfo(name, this._otherExportsInfo);
+		this._exports.set(name, newInfo);
+		this._exportsAreOrdered = false;
+		return newInfo;
+	}
+
+	/**
+	 * @param {ExportInfoName} name export name
+	 * @returns {ExportInfo} export info for this name
+	 */
+	getReadOnlyExportInfo(name) {
+		const info = this._exports.get(name);
+		if (info !== undefined) return info;
+		if (this._redirectTo !== undefined)
+			return this._redirectTo.getReadOnlyExportInfo(name);
+		return this._otherExportsInfo;
+	}
+
+	/**
+	 * @param {ExportInfoName[]} name export name
+	 * @returns {ExportInfo | undefined} export info for this name
+	 */
+	getReadOnlyExportInfoRecursive(name) {
+		const exportInfo = this.getReadOnlyExportInfo(name[0]);
+		if (name.length === 1) return exportInfo;
+		if (!exportInfo.exportsInfo) return;
+		return exportInfo.exportsInfo.getReadOnlyExportInfoRecursive(name.slice(1));
+	}
+
+	/**
+	 * @param {ExportInfoName[]=} name the export name
+	 * @returns {ExportsInfo | undefined} the nested exports info
+	 */
+	getNestedExportsInfo(name) {
+		if (Array.isArray(name) && name.length > 0) {
+			const info = this.getReadOnlyExportInfo(name[0]);
+			if (!info.exportsInfo) return;
+			return info.exportsInfo.getNestedExportsInfo(name.slice(1));
+		}
+		return this;
+	}
+
+	/**
+	 * @param {boolean=} canMangle true, if exports can still be mangled (defaults to false)
+	 * @param {Set=} excludeExports list of unaffected exports
+	 * @param {Dependency=} targetKey use this as key for the target
+	 * @param {ModuleGraphConnection=} targetModule set this module as target
+	 * @param {number=} priority priority
+	 * @returns {boolean} true, if this call changed something
+	 */
+	setUnknownExportsProvided(
+		canMangle,
+		excludeExports,
+		targetKey,
+		targetModule,
+		priority
+	) {
+		let changed = false;
+		if (excludeExports) {
+			for (const name of excludeExports) {
+				// Make sure these entries exist, so they can get different info
+				this.getExportInfo(name);
+			}
+		}
+		for (const exportInfo of this._exports.values()) {
+			if (!canMangle && exportInfo.canMangleProvide !== false) {
+				exportInfo.canMangleProvide = false;
+				changed = true;
+			}
+			if (excludeExports && excludeExports.has(exportInfo.name)) continue;
+			if (exportInfo.provided !== true && exportInfo.provided !== null) {
+				exportInfo.provided = null;
+				changed = true;
+			}
+			if (targetKey) {
+				exportInfo.setTarget(
+					targetKey,
+					/** @type {ModuleGraphConnection} */
+					(targetModule),
+					[exportInfo.name],
+					-1
+				);
+			}
+		}
+		if (this._redirectTo !== undefined) {
+			if (
+				this._redirectTo.setUnknownExportsProvided(
+					canMangle,
+					excludeExports,
+					targetKey,
+					targetModule,
+					priority
+				)
+			) {
+				changed = true;
+			}
+		} else {
+			if (
+				this._otherExportsInfo.provided !== true &&
+				this._otherExportsInfo.provided !== null
+			) {
+				this._otherExportsInfo.provided = null;
+				changed = true;
+			}
+			if (!canMangle && this._otherExportsInfo.canMangleProvide !== false) {
+				this._otherExportsInfo.canMangleProvide = false;
+				changed = true;
+			}
+			if (targetKey) {
+				this._otherExportsInfo.setTarget(
+					targetKey,
+					/** @type {ModuleGraphConnection} */ (targetModule),
+					undefined,
+					priority
+				);
+			}
+		}
+		return changed;
+	}
+
+	/**
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {boolean} true, when something changed
+	 */
+	setUsedInUnknownWay(runtime) {
+		let changed = false;
+		for (const exportInfo of this._exports.values()) {
+			if (exportInfo.setUsedInUnknownWay(runtime)) {
+				changed = true;
+			}
+		}
+		if (this._redirectTo !== undefined) {
+			if (this._redirectTo.setUsedInUnknownWay(runtime)) {
+				changed = true;
+			}
+		} else {
+			if (
+				this._otherExportsInfo.setUsedConditionally(
+					used => used < UsageState.Unknown,
+					UsageState.Unknown,
+					runtime
+				)
+			) {
+				changed = true;
+			}
+			if (this._otherExportsInfo.canMangleUse !== false) {
+				this._otherExportsInfo.canMangleUse = false;
+				changed = true;
+			}
+		}
+		return changed;
+	}
+
+	/**
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {boolean} true, when something changed
+	 */
+	setUsedWithoutInfo(runtime) {
+		let changed = false;
+		for (const exportInfo of this._exports.values()) {
+			if (exportInfo.setUsedWithoutInfo(runtime)) {
+				changed = true;
+			}
+		}
+		if (this._redirectTo !== undefined) {
+			if (this._redirectTo.setUsedWithoutInfo(runtime)) {
+				changed = true;
+			}
+		} else {
+			if (this._otherExportsInfo.setUsed(UsageState.NoInfo, runtime)) {
+				changed = true;
+			}
+			if (this._otherExportsInfo.canMangleUse !== false) {
+				this._otherExportsInfo.canMangleUse = false;
+				changed = true;
+			}
+		}
+		return changed;
+	}
+
+	/**
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {boolean} true, when something changed
+	 */
+	setAllKnownExportsUsed(runtime) {
+		let changed = false;
+		for (const exportInfo of this._exports.values()) {
+			if (!exportInfo.provided) continue;
+			if (exportInfo.setUsed(UsageState.Used, runtime)) {
+				changed = true;
+			}
+		}
+		return changed;
+	}
+
+	/**
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {boolean} true, when something changed
+	 */
+	setUsedForSideEffectsOnly(runtime) {
+		return this._sideEffectsOnlyInfo.setUsedConditionally(
+			used => used === UsageState.Unused,
+			UsageState.Used,
+			runtime
+		);
+	}
+
+	/**
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {boolean} true, when the module exports are used in any way
+	 */
+	isUsed(runtime) {
+		if (this._redirectTo !== undefined) {
+			if (this._redirectTo.isUsed(runtime)) {
+				return true;
+			}
+		} else if (this._otherExportsInfo.getUsed(runtime) !== UsageState.Unused) {
+			return true;
+		}
+		for (const exportInfo of this._exports.values()) {
+			if (exportInfo.getUsed(runtime) !== UsageState.Unused) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {boolean} true, when the module is used in any way
+	 */
+	isModuleUsed(runtime) {
+		if (this.isUsed(runtime)) return true;
+		if (this._sideEffectsOnlyInfo.getUsed(runtime) !== UsageState.Unused)
+			return true;
+		return false;
+	}
+
+	/**
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {SortableSet | boolean | null} set of used exports, or true (when namespace object is used), or false (when unused), or null (when unknown)
+	 */
+	getUsedExports(runtime) {
+		// eslint-disable-next-line no-constant-binary-expression
+		if (!this._redirectTo !== undefined) {
+			switch (this._otherExportsInfo.getUsed(runtime)) {
+				case UsageState.NoInfo:
+					return null;
+				case UsageState.Unknown:
+				case UsageState.OnlyPropertiesUsed:
+				case UsageState.Used:
+					return true;
+			}
+		}
+		const array = [];
+		if (!this._exportsAreOrdered) this._sortExports();
+		for (const exportInfo of this._exports.values()) {
+			switch (exportInfo.getUsed(runtime)) {
+				case UsageState.NoInfo:
+					return null;
+				case UsageState.Unknown:
+					return true;
+				case UsageState.OnlyPropertiesUsed:
+				case UsageState.Used:
+					array.push(exportInfo.name);
+			}
+		}
+		if (this._redirectTo !== undefined) {
+			const inner = this._redirectTo.getUsedExports(runtime);
+			if (inner === null) return null;
+			if (inner === true) return true;
+			if (inner !== false) {
+				for (const item of inner) {
+					array.push(item);
+				}
+			}
+		}
+		if (array.length === 0) {
+			switch (this._sideEffectsOnlyInfo.getUsed(runtime)) {
+				case UsageState.NoInfo:
+					return null;
+				case UsageState.Unused:
+					return false;
+			}
+		}
+		return /** @type {SortableSet} */ (new SortableSet(array));
+	}
+
+	/**
+	 * @returns {null | true | string[]} list of exports when known
+	 */
+	getProvidedExports() {
+		// eslint-disable-next-line no-constant-binary-expression
+		if (!this._redirectTo !== undefined) {
+			switch (this._otherExportsInfo.provided) {
+				case undefined:
+					return null;
+				case null:
+					return true;
+				case true:
+					return true;
+			}
+		}
+		/** @type {string[]} */
+		const array = [];
+		if (!this._exportsAreOrdered) this._sortExports();
+		for (const exportInfo of this._exports.values()) {
+			switch (exportInfo.provided) {
+				case undefined:
+					return null;
+				case null:
+					return true;
+				case true:
+					array.push(exportInfo.name);
+			}
+		}
+		if (this._redirectTo !== undefined) {
+			const inner = this._redirectTo.getProvidedExports();
+			if (inner === null) return null;
+			if (inner === true) return true;
+			for (const item of inner) {
+				if (!array.includes(item)) {
+					array.push(item);
+				}
+			}
+		}
+		return array;
+	}
+
+	/**
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {ExportInfo[]} exports that are relevant (not unused and potential provided)
+	 */
+	getRelevantExports(runtime) {
+		const list = [];
+		for (const exportInfo of this._exports.values()) {
+			const used = exportInfo.getUsed(runtime);
+			if (used === UsageState.Unused) continue;
+			if (exportInfo.provided === false) continue;
+			list.push(exportInfo);
+		}
+		if (this._redirectTo !== undefined) {
+			for (const exportInfo of this._redirectTo.getRelevantExports(runtime)) {
+				if (!this._exports.has(exportInfo.name)) list.push(exportInfo);
+			}
+		}
+		if (
+			this._otherExportsInfo.provided !== false &&
+			this._otherExportsInfo.getUsed(runtime) !== UsageState.Unused
+		) {
+			list.push(this._otherExportsInfo);
+		}
+		return list;
+	}
+
+	/**
+	 * @param {ExportInfoName | ExportInfoName[]} name the name of the export
+	 * @returns {boolean | undefined | null} if the export is provided
+	 */
+	isExportProvided(name) {
+		if (Array.isArray(name)) {
+			const info = this.getReadOnlyExportInfo(name[0]);
+			if (info.exportsInfo && name.length > 1) {
+				return info.exportsInfo.isExportProvided(name.slice(1));
+			}
+			return info.provided ? name.length === 1 || undefined : info.provided;
+		}
+		const info = this.getReadOnlyExportInfo(name);
+		return info.provided;
+	}
+
+	/**
+	 * @param {RuntimeSpec} runtime runtime
+	 * @returns {string} key representing the usage
+	 */
+	getUsageKey(runtime) {
+		const key = [];
+		if (this._redirectTo !== undefined) {
+			key.push(this._redirectTo.getUsageKey(runtime));
+		} else {
+			key.push(this._otherExportsInfo.getUsed(runtime));
+		}
+		key.push(this._sideEffectsOnlyInfo.getUsed(runtime));
+		for (const exportInfo of this.orderedOwnedExports) {
+			key.push(exportInfo.getUsed(runtime));
+		}
+		return key.join("|");
+	}
+
+	/**
+	 * @param {RuntimeSpec} runtimeA first runtime
+	 * @param {RuntimeSpec} runtimeB second runtime
+	 * @returns {boolean} true, when equally used
+	 */
+	isEquallyUsed(runtimeA, runtimeB) {
+		if (this._redirectTo !== undefined) {
+			if (!this._redirectTo.isEquallyUsed(runtimeA, runtimeB)) return false;
+		} else if (
+			this._otherExportsInfo.getUsed(runtimeA) !==
+			this._otherExportsInfo.getUsed(runtimeB)
+		) {
+			return false;
+		}
+		if (
+			this._sideEffectsOnlyInfo.getUsed(runtimeA) !==
+			this._sideEffectsOnlyInfo.getUsed(runtimeB)
+		) {
+			return false;
+		}
+		for (const exportInfo of this.ownedExports) {
+			if (exportInfo.getUsed(runtimeA) !== exportInfo.getUsed(runtimeB))
+				return false;
+		}
+		return true;
+	}
+
+	/**
+	 * @param {ExportInfoName | ExportInfoName[]} name export name
+	 * @param {RuntimeSpec} runtime check usage for this runtime only
+	 * @returns {UsageStateType} usage status
+	 */
+	getUsed(name, runtime) {
+		if (Array.isArray(name)) {
+			if (name.length === 0) return this.otherExportsInfo.getUsed(runtime);
+			const info = this.getReadOnlyExportInfo(name[0]);
+			if (info.exportsInfo && name.length > 1) {
+				return info.exportsInfo.getUsed(name.slice(1), runtime);
+			}
+			return info.getUsed(runtime);
+		}
+		const info = this.getReadOnlyExportInfo(name);
+		return info.getUsed(runtime);
+	}
+
+	/**
+	 * @param {ExportInfoName | ExportInfoName[]} name the export name
+	 * @param {RuntimeSpec} runtime check usage for this runtime only
+	 * @returns {UsedName} the used name
+	 */
+	getUsedName(name, runtime) {
+		if (Array.isArray(name)) {
+			// TODO improve this
+			if (name.length === 0) {
+				if (!this.isUsed(runtime)) return false;
+				return name;
+			}
+			const info = this.getReadOnlyExportInfo(name[0]);
+			const x = info.getUsedName(name[0], runtime);
+			if (x === false) return false;
+			const arr =
+				/** @type {ExportInfoName[]} */
+				(x === name[0] && name.length === 1 ? name : [x]);
+			if (name.length === 1) {
+				return arr;
+			}
+			if (
+				info.exportsInfo &&
+				info.getUsed(runtime) === UsageState.OnlyPropertiesUsed
+			) {
+				const nested = info.exportsInfo.getUsedName(name.slice(1), runtime);
+				if (!nested) return false;
+				return arr.concat(nested);
+			}
+			return arr.concat(name.slice(1));
+		}
+		const info = this.getReadOnlyExportInfo(name);
+		const usedName = info.getUsedName(name, runtime);
+		return usedName;
+	}
+
+	/**
+	 * @param {Hash} hash the hash
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {void}
+	 */
+	updateHash(hash, runtime) {
+		this._updateHash(hash, runtime, new Set());
+	}
+
+	/**
+	 * @param {Hash} hash the hash
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @param {Set} alreadyVisitedExportsInfo for circular references
+	 * @returns {void}
+	 */
+	_updateHash(hash, runtime, alreadyVisitedExportsInfo) {
+		const set = new Set(alreadyVisitedExportsInfo);
+		set.add(this);
+		for (const exportInfo of this.orderedExports) {
+			if (exportInfo.hasInfo(this._otherExportsInfo, runtime)) {
+				exportInfo._updateHash(hash, runtime, set);
+			}
+		}
+		this._sideEffectsOnlyInfo._updateHash(hash, runtime, set);
+		this._otherExportsInfo._updateHash(hash, runtime, set);
+		if (this._redirectTo !== undefined) {
+			this._redirectTo._updateHash(hash, runtime, set);
+		}
+	}
+
+	/**
+	 * @returns {RestoreProvidedData} restore provided data
+	 */
+	getRestoreProvidedData() {
+		const otherProvided = this._otherExportsInfo.provided;
+		const otherCanMangleProvide = this._otherExportsInfo.canMangleProvide;
+		const otherTerminalBinding = this._otherExportsInfo.terminalBinding;
+		/** @type {RestoreProvidedDataExports[]} */
+		const exports = [];
+		for (const exportInfo of this.orderedExports) {
+			if (
+				exportInfo.provided !== otherProvided ||
+				exportInfo.canMangleProvide !== otherCanMangleProvide ||
+				exportInfo.terminalBinding !== otherTerminalBinding ||
+				exportInfo.exportsInfoOwned
+			) {
+				exports.push({
+					name: exportInfo.name,
+					provided: exportInfo.provided,
+					canMangleProvide: exportInfo.canMangleProvide,
+					terminalBinding: exportInfo.terminalBinding,
+					exportsInfo: exportInfo.exportsInfoOwned
+						? /** @type {NonNullable} */
+							(exportInfo.exportsInfo).getRestoreProvidedData()
+						: undefined
+				});
+			}
+		}
+		return new RestoreProvidedData(
+			exports,
+			otherProvided,
+			otherCanMangleProvide,
+			otherTerminalBinding
+		);
+	}
+
+	/**
+	 * @param {RestoreProvidedData} data data
+	 */
+	restoreProvided({
+		otherProvided,
+		otherCanMangleProvide,
+		otherTerminalBinding,
+		exports
+	}) {
+		let wasEmpty = true;
+		for (const exportInfo of this._exports.values()) {
+			wasEmpty = false;
+			exportInfo.provided = otherProvided;
+			exportInfo.canMangleProvide = otherCanMangleProvide;
+			exportInfo.terminalBinding = otherTerminalBinding;
+		}
+		this._otherExportsInfo.provided = otherProvided;
+		this._otherExportsInfo.canMangleProvide = otherCanMangleProvide;
+		this._otherExportsInfo.terminalBinding = otherTerminalBinding;
+		for (const exp of exports) {
+			const exportInfo = this.getExportInfo(exp.name);
+			exportInfo.provided = exp.provided;
+			exportInfo.canMangleProvide = exp.canMangleProvide;
+			exportInfo.terminalBinding = exp.terminalBinding;
+			if (exp.exportsInfo) {
+				const exportsInfo = exportInfo.createNestedExportsInfo();
+				exportsInfo.restoreProvided(exp.exportsInfo);
+			}
+		}
+		if (wasEmpty) this._exportsAreOrdered = true;
+	}
+}
+
+/** @typedef {Map} UsedInRuntime */
+
+/** @typedef {{ module: Module, export: string[] }} TargetItemWithoutConnection */
+
+/** @typedef {{ module: Module, connection: ModuleGraphConnection, export: string[] | undefined }} TargetItemWithConnection */
+
+/** @typedef {(target: TargetItemWithConnection) => boolean} ResolveTargetFilter */
+
+/** @typedef {(module: Module) => boolean} ValidTargetModuleFilter */
+
+/** @typedef {{ connection: ModuleGraphConnection, export: string[], priority: number }} TargetItem */
+
+/** @typedef {Map} Target */
+
+/** @typedef {string} ExportInfoName */
+/** @typedef {string | null} ExportInfoUsedName */
+/** @typedef {boolean | null} ExportInfoProvided */
+
+class ExportInfo {
+	/**
+	 * @param {ExportInfoName} name the original name of the export
+	 * @param {ExportInfo=} initFrom init values from this ExportInfo
+	 */
+	constructor(name, initFrom) {
+		/** @type {ExportInfoName} */
+		this.name = name;
+		/**
+		 * @private
+		 * @type {ExportInfoUsedName}
+		 */
+		this._usedName = initFrom ? initFrom._usedName : null;
+		/**
+		 * @private
+		 * @type {UsageStateType | undefined}
+		 */
+		this._globalUsed = initFrom ? initFrom._globalUsed : undefined;
+		/**
+		 * @private
+		 * @type {UsedInRuntime | undefined}
+		 */
+		this._usedInRuntime =
+			initFrom && initFrom._usedInRuntime
+				? new Map(initFrom._usedInRuntime)
+				: undefined;
+		/**
+		 * @private
+		 * @type {boolean}
+		 */
+		this._hasUseInRuntimeInfo = initFrom
+			? initFrom._hasUseInRuntimeInfo
+			: false;
+		/**
+		 * true: it is provided
+		 * false: it is not provided
+		 * null: only the runtime knows if it is provided
+		 * undefined: it was not determined if it is provided
+		 * @type {ExportInfoProvided | undefined}
+		 */
+		this.provided = initFrom ? initFrom.provided : undefined;
+		/**
+		 * is the export a terminal binding that should be checked for export star conflicts
+		 * @type {boolean}
+		 */
+		this.terminalBinding = initFrom ? initFrom.terminalBinding : false;
+		/**
+		 * true: it can be mangled
+		 * false: is can not be mangled
+		 * undefined: it was not determined if it can be mangled
+		 * @type {boolean | undefined}
+		 */
+		this.canMangleProvide = initFrom ? initFrom.canMangleProvide : undefined;
+		/**
+		 * true: it can be mangled
+		 * false: is can not be mangled
+		 * undefined: it was not determined if it can be mangled
+		 * @type {boolean | undefined}
+		 */
+		this.canMangleUse = initFrom ? initFrom.canMangleUse : undefined;
+		/** @type {boolean} */
+		this.exportsInfoOwned = false;
+		/** @type {ExportsInfo | undefined} */
+		this.exportsInfo = undefined;
+		/** @type {Target | undefined} */
+		this._target = undefined;
+		if (initFrom && initFrom._target) {
+			this._target = new Map();
+			for (const [key, value] of initFrom._target) {
+				this._target.set(key, {
+					connection: value.connection,
+					export: value.export || [name],
+					priority: value.priority
+				});
+			}
+		}
+		/** @type {Target | undefined} */
+		this._maxTarget = undefined;
+	}
+
+	// TODO webpack 5 remove
+	/**
+	 * @private
+	 * @param {EXPECTED_ANY} v v
+	 */
+	set used(v) {
+		throw new Error("REMOVED");
+	}
+
+	// TODO webpack 5 remove
+	/** @private */
+	get used() {
+		throw new Error("REMOVED");
+	}
+
+	// TODO webpack 5 remove
+	/**
+	 * @private
+	 * @param {EXPECTED_ANY} v v
+	 */
+	set usedName(v) {
+		throw new Error("REMOVED");
+	}
+
+	// TODO webpack 5 remove
+	/** @private */
+	get usedName() {
+		throw new Error("REMOVED");
+	}
+
+	get canMangle() {
+		switch (this.canMangleProvide) {
+			case undefined:
+				return this.canMangleUse === false ? false : undefined;
+			case false:
+				return false;
+			case true:
+				switch (this.canMangleUse) {
+					case undefined:
+						return undefined;
+					case false:
+						return false;
+					case true:
+						return true;
+				}
+		}
+		throw new Error(
+			`Unexpected flags for canMangle ${this.canMangleProvide} ${this.canMangleUse}`
+		);
+	}
+
+	/**
+	 * @param {RuntimeSpec} runtime only apply to this runtime
+	 * @returns {boolean} true, when something changed
+	 */
+	setUsedInUnknownWay(runtime) {
+		let changed = false;
+		if (
+			this.setUsedConditionally(
+				used => used < UsageState.Unknown,
+				UsageState.Unknown,
+				runtime
+			)
+		) {
+			changed = true;
+		}
+		if (this.canMangleUse !== false) {
+			this.canMangleUse = false;
+			changed = true;
+		}
+		return changed;
+	}
+
+	/**
+	 * @param {RuntimeSpec} runtime only apply to this runtime
+	 * @returns {boolean} true, when something changed
+	 */
+	setUsedWithoutInfo(runtime) {
+		let changed = false;
+		if (this.setUsed(UsageState.NoInfo, runtime)) {
+			changed = true;
+		}
+		if (this.canMangleUse !== false) {
+			this.canMangleUse = false;
+			changed = true;
+		}
+		return changed;
+	}
+
+	setHasUseInfo() {
+		if (!this._hasUseInRuntimeInfo) {
+			this._hasUseInRuntimeInfo = true;
+		}
+		if (this.canMangleUse === undefined) {
+			this.canMangleUse = true;
+		}
+		if (this.exportsInfoOwned) {
+			/** @type {ExportsInfo} */
+			(this.exportsInfo).setHasUseInfo();
+		}
+	}
+
+	/**
+	 * @param {(condition: UsageStateType) => boolean} condition compare with old value
+	 * @param {UsageStateType} newValue set when condition is true
+	 * @param {RuntimeSpec} runtime only apply to this runtime
+	 * @returns {boolean} true when something has changed
+	 */
+	setUsedConditionally(condition, newValue, runtime) {
+		if (runtime === undefined) {
+			if (this._globalUsed === undefined) {
+				this._globalUsed = newValue;
+				return true;
+			}
+			if (this._globalUsed !== newValue && condition(this._globalUsed)) {
+				this._globalUsed = newValue;
+				return true;
+			}
+		} else if (this._usedInRuntime === undefined) {
+			if (newValue !== UsageState.Unused && condition(UsageState.Unused)) {
+				this._usedInRuntime = new Map();
+				forEachRuntime(runtime, runtime =>
+					/** @type {UsedInRuntime} */
+					(this._usedInRuntime).set(/** @type {string} */ (runtime), newValue)
+				);
+				return true;
+			}
+		} else {
+			let changed = false;
+			forEachRuntime(runtime, _runtime => {
+				const runtime = /** @type {string} */ (_runtime);
+				const usedInRuntime =
+					/** @type {UsedInRuntime} */
+					(this._usedInRuntime);
+				let oldValue =
+					/** @type {UsageStateType} */
+					(usedInRuntime.get(runtime));
+				if (oldValue === undefined) oldValue = UsageState.Unused;
+				if (newValue !== oldValue && condition(oldValue)) {
+					if (newValue === UsageState.Unused) {
+						usedInRuntime.delete(runtime);
+					} else {
+						usedInRuntime.set(runtime, newValue);
+					}
+					changed = true;
+				}
+			});
+			if (changed) {
+				if (this._usedInRuntime.size === 0) this._usedInRuntime = undefined;
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * @param {UsageStateType} newValue new value of the used state
+	 * @param {RuntimeSpec} runtime only apply to this runtime
+	 * @returns {boolean} true when something has changed
+	 */
+	setUsed(newValue, runtime) {
+		if (runtime === undefined) {
+			if (this._globalUsed !== newValue) {
+				this._globalUsed = newValue;
+				return true;
+			}
+		} else if (this._usedInRuntime === undefined) {
+			if (newValue !== UsageState.Unused) {
+				this._usedInRuntime = new Map();
+				forEachRuntime(runtime, runtime =>
+					/** @type {UsedInRuntime} */
+					(this._usedInRuntime).set(/** @type {string} */ (runtime), newValue)
+				);
+				return true;
+			}
+		} else {
+			let changed = false;
+			forEachRuntime(runtime, _runtime => {
+				const runtime = /** @type {string} */ (_runtime);
+				const usedInRuntime =
+					/** @type {UsedInRuntime} */
+					(this._usedInRuntime);
+				let oldValue =
+					/** @type {UsageStateType} */
+					(usedInRuntime.get(runtime));
+				if (oldValue === undefined) oldValue = UsageState.Unused;
+				if (newValue !== oldValue) {
+					if (newValue === UsageState.Unused) {
+						usedInRuntime.delete(runtime);
+					} else {
+						usedInRuntime.set(runtime, newValue);
+					}
+					changed = true;
+				}
+			});
+			if (changed) {
+				if (this._usedInRuntime.size === 0) this._usedInRuntime = undefined;
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * @param {Dependency} key the key
+	 * @returns {boolean} true, if something has changed
+	 */
+	unsetTarget(key) {
+		if (!this._target) return false;
+		if (this._target.delete(key)) {
+			this._maxTarget = undefined;
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * @param {Dependency} key the key
+	 * @param {ModuleGraphConnection} connection the target module if a single one
+	 * @param {(string[] | null)=} exportName the exported name
+	 * @param {number=} priority priority
+	 * @returns {boolean} true, if something has changed
+	 */
+	setTarget(key, connection, exportName, priority = 0) {
+		if (exportName) exportName = [...exportName];
+		if (!this._target) {
+			this._target = new Map();
+			this._target.set(key, {
+				connection,
+				export: /** @type {string[]} */ (exportName),
+				priority
+			});
+			return true;
+		}
+		const oldTarget = this._target.get(key);
+		if (!oldTarget) {
+			if (oldTarget === null && !connection) return false;
+			this._target.set(key, {
+				connection,
+				export: /** @type {string[]} */ (exportName),
+				priority
+			});
+			this._maxTarget = undefined;
+			return true;
+		}
+		if (
+			oldTarget.connection !== connection ||
+			oldTarget.priority !== priority ||
+			(exportName
+				? !oldTarget.export || !equals(oldTarget.export, exportName)
+				: oldTarget.export)
+		) {
+			oldTarget.connection = connection;
+			oldTarget.export = /** @type {string[]} */ (exportName);
+			oldTarget.priority = priority;
+			this._maxTarget = undefined;
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * @param {RuntimeSpec} runtime for this runtime
+	 * @returns {UsageStateType} usage state
+	 */
+	getUsed(runtime) {
+		if (!this._hasUseInRuntimeInfo) return UsageState.NoInfo;
+		if (this._globalUsed !== undefined) return this._globalUsed;
+		if (this._usedInRuntime === undefined) {
+			return UsageState.Unused;
+		} else if (typeof runtime === "string") {
+			const value = this._usedInRuntime.get(runtime);
+			return value === undefined ? UsageState.Unused : value;
+		} else if (runtime === undefined) {
+			/** @type {UsageStateType} */
+			let max = UsageState.Unused;
+			for (const value of this._usedInRuntime.values()) {
+				if (value === UsageState.Used) {
+					return UsageState.Used;
+				}
+				if (max < value) max = value;
+			}
+			return max;
+		}
+
+		/** @type {UsageStateType} */
+		let max = UsageState.Unused;
+		for (const item of runtime) {
+			const value = this._usedInRuntime.get(item);
+			if (value !== undefined) {
+				if (value === UsageState.Used) {
+					return UsageState.Used;
+				}
+				if (max < value) max = value;
+			}
+		}
+		return max;
+	}
+
+	/**
+	 * get used name
+	 * @param {string | undefined} fallbackName fallback name for used exports with no name
+	 * @param {RuntimeSpec} runtime check usage for this runtime only
+	 * @returns {string | false} used name
+	 */
+	getUsedName(fallbackName, runtime) {
+		if (this._hasUseInRuntimeInfo) {
+			if (this._globalUsed !== undefined) {
+				if (this._globalUsed === UsageState.Unused) return false;
+			} else {
+				if (this._usedInRuntime === undefined) return false;
+				if (typeof runtime === "string") {
+					if (!this._usedInRuntime.has(runtime)) {
+						return false;
+					}
+				} else if (
+					runtime !== undefined &&
+					Array.from(runtime).every(
+						runtime =>
+							!(/** @type {UsedInRuntime} */ (this._usedInRuntime).has(runtime))
+					)
+				) {
+					return false;
+				}
+			}
+		}
+		if (this._usedName !== null) return this._usedName;
+		return /** @type {string | false} */ (this.name || fallbackName);
+	}
+
+	/**
+	 * @returns {boolean} true, when a mangled name of this export is set
+	 */
+	hasUsedName() {
+		return this._usedName !== null;
+	}
+
+	/**
+	 * Sets the mangled name of this export
+	 * @param {string} name the new name
+	 * @returns {void}
+	 */
+	setUsedName(name) {
+		this._usedName = name;
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @param {ResolveTargetFilter} resolveTargetFilter filter function to further resolve target
+	 * @returns {ExportInfo | ExportsInfo | undefined} the terminal binding export(s) info if known
+	 */
+	getTerminalBinding(moduleGraph, resolveTargetFilter = RETURNS_TRUE) {
+		if (this.terminalBinding) return this;
+		const target = this.getTarget(moduleGraph, resolveTargetFilter);
+		if (!target) return;
+		const exportsInfo = moduleGraph.getExportsInfo(target.module);
+		if (!target.export) return exportsInfo;
+		return exportsInfo.getReadOnlyExportInfoRecursive(target.export);
+	}
+
+	isReexport() {
+		return !this.terminalBinding && this._target && this._target.size > 0;
+	}
+
+	_getMaxTarget() {
+		if (this._maxTarget !== undefined) return this._maxTarget;
+		if (/** @type {Target} */ (this._target).size <= 1)
+			return (this._maxTarget = this._target);
+		let maxPriority = -Infinity;
+		let minPriority = Infinity;
+		for (const { priority } of /** @type {Target} */ (this._target).values()) {
+			if (maxPriority < priority) maxPriority = priority;
+			if (minPriority > priority) minPriority = priority;
+		}
+		// This should be very common
+		if (maxPriority === minPriority) return (this._maxTarget = this._target);
+
+		// This is an edge case
+		/** @type {Target} */
+		const map = new Map();
+		for (const [key, value] of /** @type {Target} */ (this._target)) {
+			if (maxPriority === value.priority) {
+				map.set(key, value);
+			}
+		}
+		this._maxTarget = map;
+		return map;
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @param {ValidTargetModuleFilter} validTargetModuleFilter a valid target module
+	 * @returns {TargetItemWithoutConnection | null | undefined | false} the target, undefined when there is no target, false when no target is valid
+	 */
+	findTarget(moduleGraph, validTargetModuleFilter) {
+		return this._findTarget(moduleGraph, validTargetModuleFilter, new Set());
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @param {ValidTargetModuleFilter} validTargetModuleFilter a valid target module
+	 * @param {Set} alreadyVisited set of already visited export info to avoid circular references
+	 * @returns {TargetItemWithoutConnection | null | undefined | false} the target, undefined when there is no target, false when no target is valid
+	 */
+	_findTarget(moduleGraph, validTargetModuleFilter, alreadyVisited) {
+		if (!this._target || this._target.size === 0) return;
+		const rawTarget =
+			/** @type {Target} */
+			(this._getMaxTarget()).values().next().value;
+		if (!rawTarget) return;
+		/** @type {TargetItemWithoutConnection} */
+		let target = {
+			module: rawTarget.connection.module,
+			export: rawTarget.export
+		};
+		for (;;) {
+			if (validTargetModuleFilter(target.module)) return target;
+			const exportsInfo = moduleGraph.getExportsInfo(target.module);
+			const exportInfo = exportsInfo.getExportInfo(target.export[0]);
+			if (alreadyVisited.has(exportInfo)) return null;
+			const newTarget = exportInfo._findTarget(
+				moduleGraph,
+				validTargetModuleFilter,
+				alreadyVisited
+			);
+			if (!newTarget) return false;
+			if (target.export.length === 1) {
+				target = newTarget;
+			} else {
+				target = {
+					module: newTarget.module,
+					export: newTarget.export
+						? newTarget.export.concat(target.export.slice(1))
+						: target.export.slice(1)
+				};
+			}
+		}
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @param {ResolveTargetFilter} resolveTargetFilter filter function to further resolve target
+	 * @returns {TargetItemWithConnection | undefined} the target
+	 */
+	getTarget(moduleGraph, resolveTargetFilter = RETURNS_TRUE) {
+		const result = this._getTarget(moduleGraph, resolveTargetFilter, undefined);
+		if (result === CIRCULAR) return;
+		return result;
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @param {ResolveTargetFilter} resolveTargetFilter filter function to further resolve target
+	 * @param {Set | undefined} alreadyVisited set of already visited export info to avoid circular references
+	 * @returns {TargetItemWithConnection | CIRCULAR | undefined} the target
+	 */
+	_getTarget(moduleGraph, resolveTargetFilter, alreadyVisited) {
+		/**
+		 * @param {TargetItem | undefined | null} inputTarget unresolved target
+		 * @param {Set} alreadyVisited set of already visited export info to avoid circular references
+		 * @returns {TargetItemWithConnection | CIRCULAR | null} resolved target
+		 */
+		const resolveTarget = (inputTarget, alreadyVisited) => {
+			if (!inputTarget) return null;
+			if (!inputTarget.export) {
+				return {
+					module: inputTarget.connection.module,
+					connection: inputTarget.connection,
+					export: undefined
+				};
+			}
+			/** @type {TargetItemWithConnection} */
+			let target = {
+				module: inputTarget.connection.module,
+				connection: inputTarget.connection,
+				export: inputTarget.export
+			};
+			if (!resolveTargetFilter(target)) return target;
+			let alreadyVisitedOwned = false;
+			for (;;) {
+				const exportsInfo = moduleGraph.getExportsInfo(target.module);
+				const exportInfo = exportsInfo.getExportInfo(
+					/** @type {NonNullable} */
+					(target.export)[0]
+				);
+				if (!exportInfo) return target;
+				if (alreadyVisited.has(exportInfo)) return CIRCULAR;
+				const newTarget = exportInfo._getTarget(
+					moduleGraph,
+					resolveTargetFilter,
+					alreadyVisited
+				);
+				if (newTarget === CIRCULAR) return CIRCULAR;
+				if (!newTarget) return target;
+				if (
+					/** @type {NonNullable} */
+					(target.export).length === 1
+				) {
+					target = newTarget;
+					if (!target.export) return target;
+				} else {
+					target = {
+						module: newTarget.module,
+						connection: newTarget.connection,
+						export: newTarget.export
+							? newTarget.export.concat(
+									/** @type {NonNullable} */
+									(target.export).slice(1)
+								)
+							: /** @type {NonNullable} */
+								(target.export).slice(1)
+					};
+				}
+				if (!resolveTargetFilter(target)) return target;
+				if (!alreadyVisitedOwned) {
+					alreadyVisited = new Set(alreadyVisited);
+					alreadyVisitedOwned = true;
+				}
+				alreadyVisited.add(exportInfo);
+			}
+		};
+
+		if (!this._target || this._target.size === 0) return;
+		if (alreadyVisited && alreadyVisited.has(this)) return CIRCULAR;
+		const newAlreadyVisited = new Set(alreadyVisited);
+		newAlreadyVisited.add(this);
+		const values = /** @type {Target} */ (this._getMaxTarget()).values();
+		const target = resolveTarget(values.next().value, newAlreadyVisited);
+		if (target === CIRCULAR) return CIRCULAR;
+		if (target === null) return;
+		let result = values.next();
+		while (!result.done) {
+			const t = resolveTarget(result.value, newAlreadyVisited);
+			if (t === CIRCULAR) return CIRCULAR;
+			if (t === null) return;
+			if (t.module !== target.module) return;
+			if (!t.export !== !target.export) return;
+			if (
+				target.export &&
+				!equals(/** @type {ArrayLike} */ (t.export), target.export)
+			)
+				return;
+			result = values.next();
+		}
+		return target;
+	}
+
+	/**
+	 * Move the target forward as long resolveTargetFilter is fulfilled
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @param {ResolveTargetFilter} resolveTargetFilter filter function to further resolve target
+	 * @param {(target: TargetItemWithConnection) => ModuleGraphConnection=} updateOriginalConnection updates the original connection instead of using the target connection
+	 * @returns {TargetItemWithConnection | undefined} the resolved target when moved
+	 */
+	moveTarget(moduleGraph, resolveTargetFilter, updateOriginalConnection) {
+		const target = this._getTarget(moduleGraph, resolveTargetFilter, undefined);
+		if (target === CIRCULAR) return;
+		if (!target) return;
+		const originalTarget =
+			/** @type {TargetItem} */
+			(
+				/** @type {Target} */
+				(this._getMaxTarget()).values().next().value
+			);
+		if (
+			originalTarget.connection === target.connection &&
+			originalTarget.export === target.export
+		) {
+			return;
+		}
+		/** @type {Target} */
+		(this._target).clear();
+		/** @type {Target} */
+		(this._target).set(undefined, {
+			connection: updateOriginalConnection
+				? updateOriginalConnection(target)
+				: target.connection,
+			export: /** @type {NonNullable} */ (
+				target.export
+			),
+			priority: 0
+		});
+		return target;
+	}
+
+	/**
+	 * @returns {ExportsInfo} an exports info
+	 */
+	createNestedExportsInfo() {
+		if (this.exportsInfoOwned)
+			return /** @type {ExportsInfo} */ (this.exportsInfo);
+		this.exportsInfoOwned = true;
+		const oldExportsInfo = this.exportsInfo;
+		this.exportsInfo = new ExportsInfo();
+		this.exportsInfo.setHasProvideInfo();
+		if (oldExportsInfo) {
+			this.exportsInfo.setRedirectNamedTo(oldExportsInfo);
+		}
+		return this.exportsInfo;
+	}
+
+	getNestedExportsInfo() {
+		return this.exportsInfo;
+	}
+
+	/**
+	 * @param {ExportInfo} baseInfo base info
+	 * @param {RuntimeSpec} runtime runtime
+	 * @returns {boolean} true when has info, otherwise false
+	 */
+	hasInfo(baseInfo, runtime) {
+		return (
+			(this._usedName && this._usedName !== this.name) ||
+			this.provided ||
+			this.terminalBinding ||
+			this.getUsed(runtime) !== baseInfo.getUsed(runtime)
+		);
+	}
+
+	/**
+	 * @param {Hash} hash the hash
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {void}
+	 */
+	updateHash(hash, runtime) {
+		this._updateHash(hash, runtime, new Set());
+	}
+
+	/**
+	 * @param {Hash} hash the hash
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @param {Set} alreadyVisitedExportsInfo for circular references
+	 */
+	_updateHash(hash, runtime, alreadyVisitedExportsInfo) {
+		hash.update(
+			`${this._usedName || this.name}${this.getUsed(runtime)}${this.provided}${
+				this.terminalBinding
+			}`
+		);
+		if (this.exportsInfo && !alreadyVisitedExportsInfo.has(this.exportsInfo)) {
+			this.exportsInfo._updateHash(hash, runtime, alreadyVisitedExportsInfo);
+		}
+	}
+
+	getUsedInfo() {
+		if (this._globalUsed !== undefined) {
+			switch (this._globalUsed) {
+				case UsageState.Unused:
+					return "unused";
+				case UsageState.NoInfo:
+					return "no usage info";
+				case UsageState.Unknown:
+					return "maybe used (runtime-defined)";
+				case UsageState.Used:
+					return "used";
+				case UsageState.OnlyPropertiesUsed:
+					return "only properties used";
+			}
+		} else if (this._usedInRuntime !== undefined) {
+			/** @type {Map} */
+			const map = new Map();
+			for (const [runtime, used] of this._usedInRuntime) {
+				const list = map.get(used);
+				if (list !== undefined) list.push(runtime);
+				else map.set(used, [runtime]);
+			}
+			// eslint-disable-next-line array-callback-return
+			const specificInfo = Array.from(map, ([used, runtimes]) => {
+				switch (used) {
+					case UsageState.NoInfo:
+						return `no usage info in ${runtimes.join(", ")}`;
+					case UsageState.Unknown:
+						return `maybe used in ${runtimes.join(", ")} (runtime-defined)`;
+					case UsageState.Used:
+						return `used in ${runtimes.join(", ")}`;
+					case UsageState.OnlyPropertiesUsed:
+						return `only properties used in ${runtimes.join(", ")}`;
+				}
+			});
+			if (specificInfo.length > 0) {
+				return specificInfo.join("; ");
+			}
+		}
+		return this._hasUseInRuntimeInfo ? "unused" : "no usage info";
+	}
+
+	getProvidedInfo() {
+		switch (this.provided) {
+			case undefined:
+				return "no provided info";
+			case null:
+				return "maybe provided (runtime-defined)";
+			case true:
+				return "provided";
+			case false:
+				return "not provided";
+		}
+	}
+
+	getRenameInfo() {
+		if (this._usedName !== null && this._usedName !== this.name) {
+			return `renamed to ${JSON.stringify(this._usedName).slice(1, -1)}`;
+		}
+		switch (this.canMangleProvide) {
+			case undefined:
+				switch (this.canMangleUse) {
+					case undefined:
+						return "missing provision and use info prevents renaming";
+					case false:
+						return "usage prevents renaming (no provision info)";
+					case true:
+						return "missing provision info prevents renaming";
+				}
+				break;
+			case true:
+				switch (this.canMangleUse) {
+					case undefined:
+						return "missing usage info prevents renaming";
+					case false:
+						return "usage prevents renaming";
+					case true:
+						return "could be renamed";
+				}
+				break;
+			case false:
+				switch (this.canMangleUse) {
+					case undefined:
+						return "provision prevents renaming (no use info)";
+					case false:
+						return "usage and provision prevents renaming";
+					case true:
+						return "provision prevents renaming";
+				}
+				break;
+		}
+		throw new Error(
+			`Unexpected flags for getRenameInfo ${this.canMangleProvide} ${this.canMangleUse}`
+		);
+	}
+}
+
+module.exports = ExportsInfo;
+module.exports.ExportInfo = ExportInfo;
+module.exports.UsageState = UsageState;
+module.exports.RestoreProvidedData = RestoreProvidedData;
diff --git a/lib/ExportsInfoApiPlugin.js b/lib/ExportsInfoApiPlugin.js
new file mode 100644
index 00000000000..faf4594bbd0
--- /dev/null
+++ b/lib/ExportsInfoApiPlugin.js
@@ -0,0 +1,87 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_DYNAMIC,
+	JAVASCRIPT_MODULE_TYPE_ESM
+} = require("./ModuleTypeConstants");
+const ConstDependency = require("./dependencies/ConstDependency");
+const ExportsInfoDependency = require("./dependencies/ExportsInfoDependency");
+
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("./javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("./javascript/JavascriptParser").Range} Range */
+
+const PLUGIN_NAME = "ExportsInfoApiPlugin";
+
+class ExportsInfoApiPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(
+			PLUGIN_NAME,
+			(compilation, { normalModuleFactory }) => {
+				compilation.dependencyTemplates.set(
+					ExportsInfoDependency,
+					new ExportsInfoDependency.Template()
+				);
+				/**
+				 * @param {JavascriptParser} parser the parser
+				 * @returns {void}
+				 */
+				const handler = parser => {
+					parser.hooks.expressionMemberChain
+						.for("__webpack_exports_info__")
+						.tap(PLUGIN_NAME, (expr, members) => {
+							const dep =
+								members.length >= 2
+									? new ExportsInfoDependency(
+											/** @type {Range} */ (expr.range),
+											members.slice(0, -1),
+											members[members.length - 1]
+										)
+									: new ExportsInfoDependency(
+											/** @type {Range} */ (expr.range),
+											null,
+											members[0]
+										);
+							dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+							parser.state.module.addDependency(dep);
+							return true;
+						});
+					parser.hooks.expression
+						.for("__webpack_exports_info__")
+						.tap(PLUGIN_NAME, expr => {
+							const dep = new ConstDependency(
+								"true",
+								/** @type {Range} */ (expr.range)
+							);
+							dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+							parser.state.module.addPresentationalDependency(dep);
+							return true;
+						});
+				};
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, handler);
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
+					.tap(PLUGIN_NAME, handler);
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_ESM)
+					.tap(PLUGIN_NAME, handler);
+			}
+		);
+	}
+}
+
+module.exports = ExportsInfoApiPlugin;
diff --git a/lib/ExtendedAPIPlugin.js b/lib/ExtendedAPIPlugin.js
deleted file mode 100644
index e41defb1fab..00000000000
--- a/lib/ExtendedAPIPlugin.js
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const Template = require("./Template");
-const ConstDependency = require("./dependencies/ConstDependency");
-const ParserHelpers = require("./ParserHelpers");
-const NullFactory = require("./NullFactory");
-
-const REPLACEMENTS = {
-	// eslint-disable-next-line camelcase
-	__webpack_hash__: "__webpack_require__.h",
-	// eslint-disable-next-line camelcase
-	__webpack_chunkname__: "__webpack_require__.cn"
-};
-const REPLACEMENT_TYPES = {
-	// eslint-disable-next-line camelcase
-	__webpack_hash__: "string",
-	// eslint-disable-next-line camelcase
-	__webpack_chunkname__: "string"
-};
-
-class ExtendedAPIPlugin {
-	apply(compiler) {
-		compiler.hooks.compilation.tap(
-			"ExtendedAPIPlugin",
-			(compilation, { normalModuleFactory }) => {
-				compilation.dependencyFactories.set(ConstDependency, new NullFactory());
-				compilation.dependencyTemplates.set(
-					ConstDependency,
-					new ConstDependency.Template()
-				);
-
-				const mainTemplate = compilation.mainTemplate;
-				mainTemplate.hooks.requireExtensions.tap(
-					"ExtendedAPIPlugin",
-					(source, chunk, hash) => {
-						const buf = [source];
-						buf.push("");
-						buf.push("// __webpack_hash__");
-						buf.push(`${mainTemplate.requireFn}.h = ${JSON.stringify(hash)};`);
-						buf.push("");
-						buf.push("// __webpack_chunkname__");
-						buf.push(
-							`${mainTemplate.requireFn}.cn = ${JSON.stringify(chunk.name)};`
-						);
-						return Template.asString(buf);
-					}
-				);
-				mainTemplate.hooks.globalHash.tap("ExtendedAPIPlugin", () => true);
-
-				const handler = (parser, parserOptions) => {
-					Object.keys(REPLACEMENTS).forEach(key => {
-						parser.hooks.expression
-							.for(key)
-							.tap(
-								"ExtendedAPIPlugin",
-								ParserHelpers.toConstantDependencyWithWebpackRequire(
-									parser,
-									REPLACEMENTS[key]
-								)
-							);
-						parser.hooks.evaluateTypeof
-							.for(key)
-							.tap(
-								"ExtendedAPIPlugin",
-								ParserHelpers.evaluateToString(REPLACEMENT_TYPES[key])
-							);
-					});
-				};
-
-				normalModuleFactory.hooks.parser
-					.for("javascript/auto")
-					.tap("ExtendedAPIPlugin", handler);
-				normalModuleFactory.hooks.parser
-					.for("javascript/dynamic")
-					.tap("ExtendedAPIPlugin", handler);
-				normalModuleFactory.hooks.parser
-					.for("javascript/esm")
-					.tap("ExtendedAPIPlugin", handler);
-			}
-		);
-	}
-}
-
-module.exports = ExtendedAPIPlugin;
diff --git a/lib/ExternalModule.js b/lib/ExternalModule.js
index d7e4e3f5574..e6777b65eb9 100644
--- a/lib/ExternalModule.js
+++ b/lib/ExternalModule.js
@@ -2,177 +2,1008 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const { OriginalSource, RawSource } = require("webpack-sources");
+const ConcatenationScope = require("./ConcatenationScope");
+const EnvironmentNotSupportAsyncWarning = require("./EnvironmentNotSupportAsyncWarning");
+const { UsageState } = require("./ExportsInfo");
+const InitFragment = require("./InitFragment");
 const Module = require("./Module");
-const WebpackMissingModule = require("./dependencies/WebpackMissingModule");
+const {
+	JS_TYPES,
+	CSS_URL_TYPES,
+	CSS_IMPORT_TYPES
+} = require("./ModuleSourceTypesConstants");
+const { JAVASCRIPT_MODULE_TYPE_DYNAMIC } = require("./ModuleTypeConstants");
+const RuntimeGlobals = require("./RuntimeGlobals");
 const Template = require("./Template");
+const { DEFAULTS } = require("./config/defaults");
+const StaticExportsDependency = require("./dependencies/StaticExportsDependency");
+const createHash = require("./util/createHash");
+const extractUrlAndGlobal = require("./util/extractUrlAndGlobal");
+const makeSerializable = require("./util/makeSerializable");
+const propertyAccess = require("./util/propertyAccess");
+const { register } = require("./util/serialization");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../declarations/WebpackOptions").HashFunction} HashFunction */
+/** @typedef {import("../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
+/** @typedef {import("./Chunk")} Chunk */
+/** @typedef {import("./ChunkGraph")} ChunkGraph */
+/** @typedef {import("./Compilation")} Compilation */
+/** @typedef {import("./Compilation").UnsafeCacheData} UnsafeCacheData */
+/** @typedef {import("./Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("./DependencyTemplates")} DependencyTemplates */
+/** @typedef {import("./ExportsInfo")} ExportsInfo */
+/** @typedef {import("./Generator").GenerateContext} GenerateContext */
+/** @typedef {import("./Generator").SourceTypes} SourceTypes */
+/** @typedef {import("./Module").BuildCallback} BuildCallback */
+/** @typedef {import("./Module").BuildInfo} BuildInfo */
+/** @typedef {import("./Module").CodeGenerationContext} CodeGenerationContext */
+/** @typedef {import("./Module").CodeGenerationResult} CodeGenerationResult */
+/** @typedef {import("./Module").ConcatenationBailoutReasonContext} ConcatenationBailoutReasonContext */
+/** @typedef {import("./Module").LibIdentOptions} LibIdentOptions */
+/** @typedef {import("./Module").NeedBuildCallback} NeedBuildCallback */
+/** @typedef {import("./Module").NeedBuildContext} NeedBuildContext */
+/** @typedef {import("./Module").ReadOnlyRuntimeRequirements} ReadOnlyRuntimeRequirements */
+/** @typedef {import("./ModuleGraph")} ModuleGraph */
+/** @typedef {import("./NormalModuleFactory")} NormalModuleFactory */
+/** @typedef {import("./RequestShortener")} RequestShortener */
+/** @typedef {import("./ResolverFactory").ResolverWithOptions} ResolverWithOptions */
+/** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */
+/** @typedef {import("./WebpackError")} WebpackError */
+/** @typedef {import("./javascript/JavascriptModulesPlugin").ChunkRenderContext} ChunkRenderContext */
+/** @typedef {import("./javascript/JavascriptParser").ImportAttributes} ImportAttributes */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("./util/Hash")} Hash */
+/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
+/** @typedef {import("./util/runtime").RuntimeSpec} RuntimeSpec */
+
+/** @typedef {{ attributes?: ImportAttributes, externalType: "import" | "module" | undefined }} ImportDependencyMeta */
+/** @typedef {{ layer?: string, supports?: string, media?: string }} CssImportDependencyMeta */
+/** @typedef {{ sourceType: "css-url" }} AssetDependencyMeta */
+
+/** @typedef {ImportDependencyMeta | CssImportDependencyMeta | AssetDependencyMeta} DependencyMeta */
+
+/**
+ * @typedef {object} SourceData
+ * @property {boolean=} iife
+ * @property {string=} init
+ * @property {string} expression
+ * @property {InitFragment[]=} chunkInitFragments
+ * @property {ReadOnlyRuntimeRequirements=} runtimeRequirements
+ */
+
+const RUNTIME_REQUIREMENTS = new Set([RuntimeGlobals.module]);
+const RUNTIME_REQUIREMENTS_FOR_SCRIPT = new Set([RuntimeGlobals.loadScript]);
+const RUNTIME_REQUIREMENTS_FOR_MODULE = new Set([
+	RuntimeGlobals.definePropertyGetters
+]);
+const EMPTY_RUNTIME_REQUIREMENTS = new Set([]);
+
+/**
+ * @param {string|string[]} variableName the variable name or path
+ * @param {string} type the module system
+ * @returns {SourceData} the generated source
+ */
+const getSourceForGlobalVariableExternal = (variableName, type) => {
+	if (!Array.isArray(variableName)) {
+		// make it an array as the look up works the same basically
+		variableName = [variableName];
+	}
+
+	// needed for e.g. window["some"]["thing"]
+	const objectLookup = variableName.map(r => `[${JSON.stringify(r)}]`).join("");
+	return {
+		iife: type === "this",
+		expression: `${type}${objectLookup}`
+	};
+};
+
+/**
+ * @param {string|string[]} moduleAndSpecifiers the module request
+ * @returns {SourceData} the generated source
+ */
+const getSourceForCommonJsExternal = moduleAndSpecifiers => {
+	if (!Array.isArray(moduleAndSpecifiers)) {
+		return {
+			expression: `require(${JSON.stringify(moduleAndSpecifiers)})`
+		};
+	}
+	const moduleName = moduleAndSpecifiers[0];
+	return {
+		expression: `require(${JSON.stringify(moduleName)})${propertyAccess(
+			moduleAndSpecifiers,
+			1
+		)}`
+	};
+};
+
+/**
+ * @param {string|string[]} moduleAndSpecifiers the module request
+ * @param {string} importMetaName import.meta name
+ * @param {boolean} needPrefix need to use `node:` prefix for `module` import
+ * @returns {SourceData} the generated source
+ */
+const getSourceForCommonJsExternalInNodeModule = (
+	moduleAndSpecifiers,
+	importMetaName,
+	needPrefix
+) => {
+	const chunkInitFragments = [
+		new InitFragment(
+			`import { createRequire as __WEBPACK_EXTERNAL_createRequire } from "${
+				needPrefix ? "node:" : ""
+			}module";\n`,
+			InitFragment.STAGE_HARMONY_IMPORTS,
+			0,
+			"external module node-commonjs"
+		)
+	];
+	if (!Array.isArray(moduleAndSpecifiers)) {
+		return {
+			chunkInitFragments,
+			expression: `__WEBPACK_EXTERNAL_createRequire(${importMetaName}.url)(${JSON.stringify(
+				moduleAndSpecifiers
+			)})`
+		};
+	}
+	const moduleName = moduleAndSpecifiers[0];
+	return {
+		chunkInitFragments,
+		expression: `__WEBPACK_EXTERNAL_createRequire(${importMetaName}.url)(${JSON.stringify(
+			moduleName
+		)})${propertyAccess(moduleAndSpecifiers, 1)}`
+	};
+};
+
+/**
+ * @param {string|string[]} moduleAndSpecifiers the module request
+ * @param {RuntimeTemplate} runtimeTemplate the runtime template
+ * @param {ImportDependencyMeta=} dependencyMeta the dependency meta
+ * @returns {SourceData} the generated source
+ */
+const getSourceForImportExternal = (
+	moduleAndSpecifiers,
+	runtimeTemplate,
+	dependencyMeta
+) => {
+	const importName = runtimeTemplate.outputOptions.importFunctionName;
+	if (
+		!runtimeTemplate.supportsDynamicImport() &&
+		(importName === "import" || importName === "module-import")
+	) {
+		throw new Error(
+			"The target environment doesn't support 'import()' so it's not possible to use external type 'import'"
+		);
+	}
+	const attributes =
+		dependencyMeta && dependencyMeta.attributes
+			? dependencyMeta.attributes._isLegacyAssert
+				? `, { assert: ${JSON.stringify(
+						dependencyMeta.attributes,
+						importAssertionReplacer
+					)} }`
+				: `, { with: ${JSON.stringify(dependencyMeta.attributes)} }`
+			: "";
+	if (!Array.isArray(moduleAndSpecifiers)) {
+		return {
+			expression: `${importName}(${JSON.stringify(
+				moduleAndSpecifiers
+			)}${attributes});`
+		};
+	}
+	if (moduleAndSpecifiers.length === 1) {
+		return {
+			expression: `${importName}(${JSON.stringify(
+				moduleAndSpecifiers[0]
+			)}${attributes});`
+		};
+	}
+	const moduleName = moduleAndSpecifiers[0];
+	return {
+		expression: `${importName}(${JSON.stringify(
+			moduleName
+		)}${attributes}).then(${runtimeTemplate.returningFunction(
+			`module${propertyAccess(moduleAndSpecifiers, 1)}`,
+			"module"
+		)});`
+	};
+};
+
+/**
+ * @template {{ [key: string]: string }} T
+ * @param {keyof T} key key
+ * @param {T[keyof T]} value value
+ * @returns {undefined | T[keyof T]} replaced value
+ */
+const importAssertionReplacer = (key, value) => {
+	if (key === "_isLegacyAssert") {
+		return;
+	}
+
+	return value;
+};
+
+/**
+ * @extends {InitFragment}
+ */
+class ModuleExternalInitFragment extends InitFragment {
+	/**
+	 * @param {string} request import source
+	 * @param {string=} ident recomputed ident
+	 * @param {ImportDependencyMeta=} dependencyMeta the dependency meta
+	 * @param {HashFunction=} hashFunction the hash function to use
+	 */
+	constructor(
+		request,
+		ident,
+		dependencyMeta,
+		hashFunction = DEFAULTS.HASH_FUNCTION
+	) {
+		if (ident === undefined) {
+			ident = Template.toIdentifier(request);
+			if (ident !== request) {
+				ident += `_${createHash(hashFunction)
+					.update(request)
+					.digest("hex")
+					.slice(0, 8)}`;
+			}
+		}
+		const identifier = `__WEBPACK_EXTERNAL_MODULE_${ident}__`;
+		super(
+			`import * as ${identifier} from ${JSON.stringify(request)}${
+				dependencyMeta && dependencyMeta.attributes
+					? dependencyMeta.attributes._isLegacyAssert
+						? ` assert ${JSON.stringify(
+								dependencyMeta.attributes,
+								importAssertionReplacer
+							)}`
+						: ` with ${JSON.stringify(dependencyMeta.attributes)}`
+					: ""
+			};\n`,
+			InitFragment.STAGE_HARMONY_IMPORTS,
+			0,
+			`external module import ${ident}`
+		);
+		this._ident = ident;
+		this._request = request;
+		this._dependencyMeta = request;
+		this._identifier = identifier;
+	}
+
+	getNamespaceIdentifier() {
+		return this._identifier;
+	}
+}
+
+register(
+	ModuleExternalInitFragment,
+	"webpack/lib/ExternalModule",
+	"ModuleExternalInitFragment",
+	{
+		serialize(obj, { write }) {
+			write(obj._request);
+			write(obj._ident);
+			write(obj._dependencyMeta);
+		},
+		deserialize({ read }) {
+			return new ModuleExternalInitFragment(read(), read(), read());
+		}
+	}
+);
+
+/**
+ * @param {string} input input
+ * @param {ExportsInfo} exportsInfo the exports info
+ * @param {RuntimeSpec=} runtime the runtime
+ * @param {RuntimeTemplate=} runtimeTemplate the runtime template
+ * @returns {string | undefined} the module remapping
+ */
+const generateModuleRemapping = (
+	input,
+	exportsInfo,
+	runtime,
+	runtimeTemplate
+) => {
+	if (exportsInfo.otherExportsInfo.getUsed(runtime) === UsageState.Unused) {
+		const properties = [];
+		for (const exportInfo of exportsInfo.orderedExports) {
+			const used = exportInfo.getUsedName(exportInfo.name, runtime);
+			if (!used) continue;
+			const nestedInfo = exportInfo.getNestedExportsInfo();
+			if (nestedInfo) {
+				const nestedExpr = generateModuleRemapping(
+					`${input}${propertyAccess([exportInfo.name])}`,
+					nestedInfo
+				);
+				if (nestedExpr) {
+					properties.push(`[${JSON.stringify(used)}]: y(${nestedExpr})`);
+					continue;
+				}
+			}
+			properties.push(
+				`[${JSON.stringify(used)}]: ${
+					/** @type {RuntimeTemplate} */ (runtimeTemplate).returningFunction(
+						`${input}${propertyAccess([exportInfo.name])}`
+					)
+				}`
+			);
+		}
+		return `x({ ${properties.join(", ")} })`;
+	}
+};
+
+/**
+ * @param {string|string[]} moduleAndSpecifiers the module request
+ * @param {ExportsInfo} exportsInfo exports info of this module
+ * @param {RuntimeSpec} runtime the runtime
+ * @param {RuntimeTemplate} runtimeTemplate the runtime template
+ * @param {ImportDependencyMeta} dependencyMeta the dependency meta
+ * @returns {SourceData} the generated source
+ */
+const getSourceForModuleExternal = (
+	moduleAndSpecifiers,
+	exportsInfo,
+	runtime,
+	runtimeTemplate,
+	dependencyMeta
+) => {
+	if (!Array.isArray(moduleAndSpecifiers))
+		moduleAndSpecifiers = [moduleAndSpecifiers];
+	const initFragment = new ModuleExternalInitFragment(
+		moduleAndSpecifiers[0],
+		undefined,
+		dependencyMeta,
+		runtimeTemplate.outputOptions.hashFunction
+	);
+	const baseAccess = `${initFragment.getNamespaceIdentifier()}${propertyAccess(
+		moduleAndSpecifiers,
+		1
+	)}`;
+	const moduleRemapping = generateModuleRemapping(
+		baseAccess,
+		exportsInfo,
+		runtime,
+		runtimeTemplate
+	);
+	const expression = moduleRemapping || baseAccess;
+	return {
+		expression,
+		init: moduleRemapping
+			? `var x = ${runtimeTemplate.basicFunction(
+					"y",
+					`var x = {}; ${RuntimeGlobals.definePropertyGetters}(x, y); return x`
+				)} \nvar y = ${runtimeTemplate.returningFunction(
+					runtimeTemplate.returningFunction("x"),
+					"x"
+				)}`
+			: undefined,
+		runtimeRequirements: moduleRemapping
+			? RUNTIME_REQUIREMENTS_FOR_MODULE
+			: undefined,
+		chunkInitFragments: [initFragment]
+	};
+};
+
+/**
+ * @param {string|string[]} urlAndGlobal the script request
+ * @param {RuntimeTemplate} runtimeTemplate the runtime template
+ * @returns {SourceData} the generated source
+ */
+const getSourceForScriptExternal = (urlAndGlobal, runtimeTemplate) => {
+	if (typeof urlAndGlobal === "string") {
+		urlAndGlobal = extractUrlAndGlobal(urlAndGlobal);
+	}
+	const url = urlAndGlobal[0];
+	const globalName = urlAndGlobal[1];
+	return {
+		init: "var __webpack_error__ = new Error();",
+		expression: `new Promise(${runtimeTemplate.basicFunction(
+			"resolve, reject",
+			[
+				`if(typeof ${globalName} !== "undefined") return resolve();`,
+				`${RuntimeGlobals.loadScript}(${JSON.stringify(
+					url
+				)}, ${runtimeTemplate.basicFunction("event", [
+					`if(typeof ${globalName} !== "undefined") return resolve();`,
+					"var errorType = event && (event.type === 'load' ? 'missing' : event.type);",
+					"var realSrc = event && event.target && event.target.src;",
+					"__webpack_error__.message = 'Loading script failed.\\n(' + errorType + ': ' + realSrc + ')';",
+					"__webpack_error__.name = 'ScriptExternalLoadError';",
+					"__webpack_error__.type = errorType;",
+					"__webpack_error__.request = realSrc;",
+					"reject(__webpack_error__);"
+				])}, ${JSON.stringify(globalName)});`
+			]
+		)}).then(${runtimeTemplate.returningFunction(
+			`${globalName}${propertyAccess(urlAndGlobal, 2)}`
+		)})`,
+		runtimeRequirements: RUNTIME_REQUIREMENTS_FOR_SCRIPT
+	};
+};
 
-/** @typedef {import("./util/createHash").Hash} Hash */
+/**
+ * @param {string} variableName the variable name to check
+ * @param {string} request the request path
+ * @param {RuntimeTemplate} runtimeTemplate the runtime template
+ * @returns {string} the generated source
+ */
+const checkExternalVariable = (variableName, request, runtimeTemplate) =>
+	`if(typeof ${variableName} === 'undefined') { ${runtimeTemplate.throwMissingModuleErrorBlock(
+		{ request }
+	)} }\n`;
+
+/**
+ * @param {string|number} id the module id
+ * @param {boolean} optional true, if the module is optional
+ * @param {string|string[]} request the request path
+ * @param {RuntimeTemplate} runtimeTemplate the runtime template
+ * @returns {SourceData} the generated source
+ */
+const getSourceForAmdOrUmdExternal = (
+	id,
+	optional,
+	request,
+	runtimeTemplate
+) => {
+	const externalVariable = `__WEBPACK_EXTERNAL_MODULE_${Template.toIdentifier(
+		`${id}`
+	)}__`;
+	return {
+		init: optional
+			? checkExternalVariable(
+					externalVariable,
+					Array.isArray(request) ? request.join(".") : request,
+					runtimeTemplate
+				)
+			: undefined,
+		expression: externalVariable
+	};
+};
+
+/**
+ * @param {boolean} optional true, if the module is optional
+ * @param {string|string[]} request the request path
+ * @param {RuntimeTemplate} runtimeTemplate the runtime template
+ * @returns {SourceData} the generated source
+ */
+const getSourceForDefaultCase = (optional, request, runtimeTemplate) => {
+	if (!Array.isArray(request)) {
+		// make it an array as the look up works the same basically
+		request = [request];
+	}
+
+	const variableName = request[0];
+	const objectLookup = propertyAccess(request, 1);
+	return {
+		init: optional
+			? checkExternalVariable(variableName, request.join("."), runtimeTemplate)
+			: undefined,
+		expression: `${variableName}${objectLookup}`
+	};
+};
+
+/** @typedef {Record} RequestRecord */
 
 class ExternalModule extends Module {
-	constructor(request, type, userRequest) {
-		super("javascript/dynamic", null);
+	/**
+	 * @param {string | string[] | RequestRecord} request request
+	 * @param {string} type type
+	 * @param {string} userRequest user request
+	 * @param {DependencyMeta=} dependencyMeta dependency meta
+	 */
+	constructor(request, type, userRequest, dependencyMeta) {
+		super(JAVASCRIPT_MODULE_TYPE_DYNAMIC, null);
 
 		// Info from Factory
+		/** @type {string | string[] | Record} */
 		this.request = request;
+		/** @type {string} */
 		this.externalType = type;
+		/** @type {string} */
 		this.userRequest = userRequest;
-		this.external = true;
+		/** @type {DependencyMeta=} */
+		this.dependencyMeta = dependencyMeta;
+	}
+
+	/**
+	 * @returns {SourceTypes} types available (do not mutate)
+	 */
+	getSourceTypes() {
+		if (
+			this.externalType === "asset" &&
+			this.dependencyMeta &&
+			/** @type {AssetDependencyMeta} */
+			(this.dependencyMeta).sourceType === "css-url"
+		) {
+			return CSS_URL_TYPES;
+		} else if (this.externalType === "css-import") {
+			return CSS_IMPORT_TYPES;
+		}
+
+		return JS_TYPES;
 	}
 
-	libIdent() {
+	/**
+	 * @param {LibIdentOptions} options options
+	 * @returns {string | null} an identifier for library inclusion
+	 */
+	libIdent(options) {
 		return this.userRequest;
 	}
 
-	chunkCondition(chunk) {
-		return chunk.hasEntryModule();
+	/**
+	 * @param {Chunk} chunk the chunk which condition should be checked
+	 * @param {Compilation} compilation the compilation
+	 * @returns {boolean} true, if the chunk is ok for the module
+	 */
+	chunkCondition(chunk, { chunkGraph }) {
+		return this.externalType === "css-import"
+			? true
+			: chunkGraph.getNumberOfEntryModules(chunk) > 0;
 	}
 
+	/**
+	 * @returns {string} a unique identifier of the module
+	 */
 	identifier() {
-		return "external " + JSON.stringify(this.request);
+		return `external ${this._resolveExternalType(this.externalType)} ${JSON.stringify(this.request)}`;
 	}
 
-	readableIdentifier() {
-		return "external " + JSON.stringify(this.request);
+	/**
+	 * @param {RequestShortener} requestShortener the request shortener
+	 * @returns {string} a user readable identifier of the module
+	 */
+	readableIdentifier(requestShortener) {
+		return `external ${JSON.stringify(this.request)}`;
 	}
 
-	needRebuild() {
-		return false;
+	/**
+	 * @param {NeedBuildContext} context context info
+	 * @param {NeedBuildCallback} callback callback function, returns true, if the module needs a rebuild
+	 * @returns {void}
+	 */
+	needBuild(context, callback) {
+		return callback(null, !this.buildMeta);
 	}
 
+	/**
+	 * @param {WebpackOptions} options webpack options
+	 * @param {Compilation} compilation the compilation
+	 * @param {ResolverWithOptions} resolver the resolver
+	 * @param {InputFileSystem} fs the file system
+	 * @param {BuildCallback} callback callback function
+	 * @returns {void}
+	 */
 	build(options, compilation, resolver, fs, callback) {
-		this.built = true;
-		this.buildMeta = {};
-		this.buildInfo = {};
+		this.buildMeta = {
+			async: false,
+			exportsType: undefined
+		};
+		this.buildInfo = {
+			strict: true,
+			topLevelDeclarations: new Set(),
+			module: compilation.outputOptions.module
+		};
+		const { request, externalType } = this._getRequestAndExternalType();
+		this.buildMeta.exportsType = "dynamic";
+		let canMangle = false;
+		this.clearDependenciesAndBlocks();
+		switch (externalType) {
+			case "this":
+				this.buildInfo.strict = false;
+				break;
+			case "system":
+				if (!Array.isArray(request) || request.length === 1) {
+					this.buildMeta.exportsType = "namespace";
+					canMangle = true;
+				}
+				break;
+			case "module":
+				if (this.buildInfo.module) {
+					if (!Array.isArray(request) || request.length === 1) {
+						this.buildMeta.exportsType = "namespace";
+						canMangle = true;
+					}
+				} else {
+					this.buildMeta.async = true;
+					EnvironmentNotSupportAsyncWarning.check(
+						this,
+						compilation.runtimeTemplate,
+						"external module"
+					);
+					if (!Array.isArray(request) || request.length === 1) {
+						this.buildMeta.exportsType = "namespace";
+						canMangle = false;
+					}
+				}
+				break;
+			case "script":
+				this.buildMeta.async = true;
+				EnvironmentNotSupportAsyncWarning.check(
+					this,
+					compilation.runtimeTemplate,
+					"external script"
+				);
+				break;
+			case "promise":
+				this.buildMeta.async = true;
+				EnvironmentNotSupportAsyncWarning.check(
+					this,
+					compilation.runtimeTemplate,
+					"external promise"
+				);
+				break;
+			case "import":
+				this.buildMeta.async = true;
+				EnvironmentNotSupportAsyncWarning.check(
+					this,
+					compilation.runtimeTemplate,
+					"external import"
+				);
+				if (!Array.isArray(request) || request.length === 1) {
+					this.buildMeta.exportsType = "namespace";
+					canMangle = false;
+				}
+				break;
+		}
+		this.addDependency(new StaticExportsDependency(true, canMangle));
 		callback();
 	}
 
-	getSourceForGlobalVariableExternal(variableName, type) {
-		if (!Array.isArray(variableName)) {
-			// make it an array as the look up works the same basically
-			variableName = [variableName];
-		}
-
-		// needed for e.g. window["some"]["thing"]
-		const objectLookup = variableName
-			.map(r => `[${JSON.stringify(r)}]`)
-			.join("");
-		return `(function() { module.exports = ${type}${objectLookup}; }());`;
+	/**
+	 * restore unsafe cache data
+	 * @param {UnsafeCacheData} unsafeCacheData data from getUnsafeCacheData
+	 * @param {NormalModuleFactory} normalModuleFactory the normal module factory handling the unsafe caching
+	 */
+	restoreFromUnsafeCache(unsafeCacheData, normalModuleFactory) {
+		this._restoreFromUnsafeCache(unsafeCacheData, normalModuleFactory);
 	}
 
-	getSourceForCommonJsExternal(moduleAndSpecifiers) {
-		if (!Array.isArray(moduleAndSpecifiers)) {
-			return `module.exports = require(${JSON.stringify(
-				moduleAndSpecifiers
-			)});`;
+	/**
+	 * @param {ConcatenationBailoutReasonContext} context context
+	 * @returns {string | undefined} reason why this module can't be concatenated, undefined when it can be concatenated
+	 */
+	getConcatenationBailoutReason({ moduleGraph }) {
+		switch (this.externalType) {
+			case "amd":
+			case "amd-require":
+			case "umd":
+			case "umd2":
+			case "system":
+			case "jsonp":
+				return `${this.externalType} externals can't be concatenated`;
 		}
-
-		const moduleName = moduleAndSpecifiers[0];
-		const objectLookup = moduleAndSpecifiers
-			.slice(1)
-			.map(r => `[${JSON.stringify(r)}]`)
-			.join("");
-		return `module.exports = require(${JSON.stringify(
-			moduleName
-		)})${objectLookup};`;
+		return undefined;
 	}
 
-	checkExternalVariable(variableToCheck, request) {
-		return `if(typeof ${variableToCheck} === 'undefined') {${WebpackMissingModule.moduleCode(
-			request
-		)}}\n`;
+	_getRequestAndExternalType() {
+		let { request, externalType } = this;
+		if (typeof request === "object" && !Array.isArray(request))
+			request = request[externalType];
+		externalType = this._resolveExternalType(externalType);
+		return { request, externalType };
 	}
 
-	getSourceForAmdOrUmdExternal(id, optional, request) {
-		const externalVariable = `__WEBPACK_EXTERNAL_MODULE_${Template.toIdentifier(
-			`${id}`
-		)}__`;
-		const missingModuleError = optional
-			? this.checkExternalVariable(externalVariable, request)
-			: "";
-		return `${missingModuleError}module.exports = ${externalVariable};`;
-	}
+	/**
+	 * Resolve the detailed external type from the raw external type.
+	 * e.g. resolve "module" or "import" from "module-import" type
+	 * @param {string} externalType raw external type
+	 * @returns {string} resolved external type
+	 */
+	_resolveExternalType(externalType) {
+		if (externalType === "module-import") {
+			if (
+				this.dependencyMeta &&
+				/** @type {ImportDependencyMeta} */
+				(this.dependencyMeta).externalType
+			) {
+				return /** @type {ImportDependencyMeta} */ (this.dependencyMeta)
+					.externalType;
+			}
+			return "module";
+		} else if (externalType === "asset") {
+			if (
+				this.dependencyMeta &&
+				/** @type {AssetDependencyMeta} */
+				(this.dependencyMeta).sourceType
+			) {
+				return /** @type {AssetDependencyMeta} */ (this.dependencyMeta)
+					.sourceType;
+			}
 
-	getSourceForDefaultCase(optional, request) {
-		if (!Array.isArray(request)) {
-			// make it an array as the look up works the same basically
-			request = [request];
+			return "asset";
 		}
 
-		const variableName = request[0];
-		const missingModuleError = optional
-			? this.checkExternalVariable(variableName, request.join("."))
-			: "";
-		const objectLookup = request
-			.slice(1)
-			.map(r => `[${JSON.stringify(r)}]`)
-			.join("");
-		return `${missingModuleError}module.exports = ${variableName}${objectLookup};`;
-	}
-
-	getSourceString(runtime) {
-		const request =
-			typeof this.request === "object" && !Array.isArray(this.request)
-				? this.request[this.externalType]
-				: this.request;
-		switch (this.externalType) {
+		return externalType;
+	}
+
+	/**
+	 * @private
+	 * @param {string | string[]} request request
+	 * @param {string} externalType the external type
+	 * @param {RuntimeTemplate} runtimeTemplate the runtime template
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @param {ChunkGraph} chunkGraph the chunk graph
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @param {DependencyMeta | undefined} dependencyMeta the dependency meta
+	 * @returns {SourceData} the source data
+	 */
+	_getSourceData(
+		request,
+		externalType,
+		runtimeTemplate,
+		moduleGraph,
+		chunkGraph,
+		runtime,
+		dependencyMeta
+	) {
+		switch (externalType) {
 			case "this":
 			case "window":
 			case "self":
-				return this.getSourceForGlobalVariableExternal(
-					request,
-					this.externalType
-				);
+				return getSourceForGlobalVariableExternal(request, this.externalType);
 			case "global":
-				return this.getSourceForGlobalVariableExternal(
+				return getSourceForGlobalVariableExternal(
 					request,
-					runtime.outputOptions.globalObject
+					runtimeTemplate.globalObject
 				);
 			case "commonjs":
 			case "commonjs2":
-				return this.getSourceForCommonJsExternal(request);
+			case "commonjs-module":
+			case "commonjs-static":
+				return getSourceForCommonJsExternal(request);
+			case "node-commonjs":
+				return /** @type {BuildInfo} */ (this.buildInfo).module
+					? getSourceForCommonJsExternalInNodeModule(
+							request,
+							/** @type {string} */
+							(runtimeTemplate.outputOptions.importMetaName),
+							/** @type {boolean} */
+							(runtimeTemplate.supportNodePrefixForCoreModules())
+						)
+					: getSourceForCommonJsExternal(request);
 			case "amd":
 			case "amd-require":
 			case "umd":
 			case "umd2":
-				return this.getSourceForAmdOrUmdExternal(
-					this.id,
-					this.optional,
-					request
+			case "system":
+			case "jsonp": {
+				const id = chunkGraph.getModuleId(this);
+				return getSourceForAmdOrUmdExternal(
+					id !== null ? id : this.identifier(),
+					this.isOptional(moduleGraph),
+					request,
+					runtimeTemplate
 				);
+			}
+			case "import":
+				return getSourceForImportExternal(
+					request,
+					runtimeTemplate,
+					/** @type {ImportDependencyMeta} */ (dependencyMeta)
+				);
+			case "script":
+				return getSourceForScriptExternal(request, runtimeTemplate);
+			case "module": {
+				if (!(/** @type {BuildInfo} */ (this.buildInfo).module)) {
+					if (!runtimeTemplate.supportsDynamicImport()) {
+						throw new Error(
+							`The target environment doesn't support dynamic import() syntax so it's not possible to use external type 'module' within a script${
+								runtimeTemplate.supportsEcmaScriptModuleSyntax()
+									? "\nDid you mean to build a EcmaScript Module ('output.module: true')?"
+									: ""
+							}`
+						);
+					}
+					return getSourceForImportExternal(
+						request,
+						runtimeTemplate,
+						/** @type {ImportDependencyMeta} */ (dependencyMeta)
+					);
+				}
+				if (!runtimeTemplate.supportsEcmaScriptModuleSyntax()) {
+					throw new Error(
+						"The target environment doesn't support EcmaScriptModule syntax so it's not possible to use external type 'module'"
+					);
+				}
+				return getSourceForModuleExternal(
+					request,
+					moduleGraph.getExportsInfo(this),
+					runtime,
+					runtimeTemplate,
+					/** @type {ImportDependencyMeta} */ (dependencyMeta)
+				);
+			}
+			case "var":
+			case "promise":
+			case "const":
+			case "let":
+			case "assign":
 			default:
-				return this.getSourceForDefaultCase(this.optional, request);
+				return getSourceForDefaultCase(
+					this.isOptional(moduleGraph),
+					request,
+					runtimeTemplate
+				);
 		}
 	}
 
-	getSource(sourceString) {
-		if (this.useSourceMap) {
-			return new OriginalSource(sourceString, this.identifier());
-		}
+	/**
+	 * @param {CodeGenerationContext} context context for code generation
+	 * @returns {CodeGenerationResult} result
+	 */
+	codeGeneration({
+		runtimeTemplate,
+		moduleGraph,
+		chunkGraph,
+		runtime,
+		concatenationScope
+	}) {
+		const { request, externalType } = this._getRequestAndExternalType();
+		switch (externalType) {
+			case "asset": {
+				const sources = new Map();
+				sources.set(
+					"javascript",
+					new RawSource(`module.exports = ${JSON.stringify(request)};`)
+				);
+				const data = new Map();
+				data.set("url", { javascript: request });
+				return { sources, runtimeRequirements: RUNTIME_REQUIREMENTS, data };
+			}
+			case "css-url": {
+				const sources = new Map();
+				const data = new Map();
+				data.set("url", { "css-url": request });
+				return { sources, runtimeRequirements: RUNTIME_REQUIREMENTS, data };
+			}
+			case "css-import": {
+				const sources = new Map();
+				const dependencyMeta = /** @type {CssImportDependencyMeta} */ (
+					this.dependencyMeta
+				);
+				const layer =
+					dependencyMeta.layer !== undefined
+						? ` layer(${dependencyMeta.layer})`
+						: "";
+				const supports = dependencyMeta.supports
+					? ` supports(${dependencyMeta.supports})`
+					: "";
+				const media = dependencyMeta.media ? ` ${dependencyMeta.media}` : "";
+				sources.set(
+					"css-import",
+					new RawSource(
+						`@import url(${JSON.stringify(
+							request
+						)})${layer}${supports}${media};`
+					)
+				);
+				return {
+					sources,
+					runtimeRequirements: EMPTY_RUNTIME_REQUIREMENTS
+				};
+			}
+			default: {
+				const sourceData = this._getSourceData(
+					request,
+					externalType,
+					runtimeTemplate,
+					moduleGraph,
+					chunkGraph,
+					runtime,
+					this.dependencyMeta
+				);
 
-		return new RawSource(sourceString);
-	}
+				let sourceString = sourceData.expression;
+				if (sourceData.iife)
+					sourceString = `(function() { return ${sourceString}; }())`;
+				if (concatenationScope) {
+					sourceString = `${
+						runtimeTemplate.supportsConst() ? "const" : "var"
+					} ${ConcatenationScope.NAMESPACE_OBJECT_EXPORT} = ${sourceString};`;
+					concatenationScope.registerNamespaceExport(
+						ConcatenationScope.NAMESPACE_OBJECT_EXPORT
+					);
+				} else {
+					sourceString = `module.exports = ${sourceString};`;
+				}
+				if (sourceData.init)
+					sourceString = `${sourceData.init}\n${sourceString}`;
+
+				let data;
+				if (sourceData.chunkInitFragments) {
+					data = new Map();
+					data.set("chunkInitFragments", sourceData.chunkInitFragments);
+				}
+
+				const sources = new Map();
+				if (this.useSourceMap || this.useSimpleSourceMap) {
+					sources.set(
+						"javascript",
+						new OriginalSource(sourceString, this.identifier())
+					);
+				} else {
+					sources.set("javascript", new RawSource(sourceString));
+				}
 
-	source(dependencyTemplates, runtime) {
-		return this.getSource(this.getSourceString(runtime));
+				let runtimeRequirements = sourceData.runtimeRequirements;
+				if (!concatenationScope) {
+					if (!runtimeRequirements) {
+						runtimeRequirements = RUNTIME_REQUIREMENTS;
+					} else {
+						const set = new Set(runtimeRequirements);
+						set.add(RuntimeGlobals.module);
+						runtimeRequirements = set;
+					}
+				}
+
+				return {
+					sources,
+					runtimeRequirements:
+						runtimeRequirements || EMPTY_RUNTIME_REQUIREMENTS,
+					data
+				};
+			}
+		}
 	}
 
-	size() {
+	/**
+	 * @param {string=} type the source type for which the size should be estimated
+	 * @returns {number} the estimated size of the module (must be non-zero)
+	 */
+	size(type) {
 		return 42;
 	}
 
 	/**
 	 * @param {Hash} hash the hash used to track dependencies
+	 * @param {UpdateHashContext} context context
 	 * @returns {void}
 	 */
-	updateHash(hash) {
-		hash.update(this.externalType);
-		hash.update(JSON.stringify(this.request));
-		hash.update(JSON.stringify(Boolean(this.optional)));
-		super.updateHash(hash);
+	updateHash(hash, context) {
+		const { chunkGraph } = context;
+		hash.update(
+			`${this._resolveExternalType(this.externalType)}${JSON.stringify(this.request)}${this.isOptional(
+				chunkGraph.moduleGraph
+			)}`
+		);
+		super.updateHash(hash, context);
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+
+		write(this.request);
+		write(this.externalType);
+		write(this.userRequest);
+		write(this.dependencyMeta);
+
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+
+		this.request = read();
+		this.externalType = read();
+		this.userRequest = read();
+		this.dependencyMeta = read();
+
+		super.deserialize(context);
 	}
 }
 
+makeSerializable(ExternalModule, "webpack/lib/ExternalModule");
+
 module.exports = ExternalModule;
diff --git a/lib/ExternalModuleFactoryPlugin.js b/lib/ExternalModuleFactoryPlugin.js
index b75cc7476fa..c5c4f3fb2d5 100644
--- a/lib/ExternalModuleFactoryPlugin.js
+++ b/lib/ExternalModuleFactoryPlugin.js
@@ -2,52 +2,210 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const util = require("util");
 const ExternalModule = require("./ExternalModule");
+const ContextElementDependency = require("./dependencies/ContextElementDependency");
+const CssImportDependency = require("./dependencies/CssImportDependency");
+const CssUrlDependency = require("./dependencies/CssUrlDependency");
+const HarmonyImportDependency = require("./dependencies/HarmonyImportDependency");
+const ImportDependency = require("./dependencies/ImportDependency");
+const { resolveByProperty, cachedSetProperty } = require("./util/cleverMerge");
+
+/** @typedef {import("../declarations/WebpackOptions").ExternalItemFunctionData} ExternalItemFunctionData */
+/** @typedef {import("../declarations/WebpackOptions").ExternalItemObjectKnown} ExternalItemObjectKnown */
+/** @typedef {import("../declarations/WebpackOptions").ExternalItemObjectUnknown} ExternalItemObjectUnknown */
+/** @typedef {import("../declarations/WebpackOptions").Externals} Externals */
+/** @typedef {import("./Compilation").DepConstructor} DepConstructor */
+/** @typedef {import("./ExternalModule").DependencyMeta} DependencyMeta */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./ModuleFactory").IssuerLayer} IssuerLayer */
+/** @typedef {import("./NormalModuleFactory")} NormalModuleFactory */
+
+const UNSPECIFIED_EXTERNAL_TYPE_REGEXP = /^[a-z0-9-]+ /;
+const EMPTY_RESOLVE_OPTIONS = {};
+
+// TODO webpack 6 remove this
+const callDeprecatedExternals = util.deprecate(
+	/**
+	 * @param {EXPECTED_FUNCTION} externalsFunction externals function
+	 * @param {string} context context
+	 * @param {string} request request
+	 * @param {(err: Error | null | undefined, value: ExternalValue | undefined, ty: ExternalType | undefined) => void} cb cb
+	 */
+	(externalsFunction, context, request, cb) => {
+		// eslint-disable-next-line no-useless-call
+		externalsFunction.call(null, context, request, cb);
+	},
+	"The externals-function should be defined like ({context, request}, cb) => { ... }",
+	"DEP_WEBPACK_EXTERNALS_FUNCTION_PARAMETERS"
+);
+
+/** @typedef {ExternalItemObjectKnown & ExternalItemObjectUnknown} ExternalItemObject */
+
+/**
+ * @template {ExternalItemObject} T
+ * @typedef {WeakMap>>} ExternalWeakCache
+ */
+
+/** @type {ExternalWeakCache} */
+const cache = new WeakMap();
+
+/**
+ * @param {ExternalItemObject} obj obj
+ * @param {IssuerLayer} layer layer
+ * @returns {Omit} result
+ */
+const resolveLayer = (obj, layer) => {
+	let map = cache.get(obj);
+	if (map === undefined) {
+		map = new Map();
+		cache.set(obj, map);
+	} else {
+		const cacheEntry = map.get(layer);
+		if (cacheEntry !== undefined) return cacheEntry;
+	}
+	const result = resolveByProperty(obj, "byLayer", layer);
+	map.set(layer, result);
+	return result;
+};
+
+/** @typedef {string | string[] | boolean | Record} ExternalValue */
+/** @typedef {string | undefined} ExternalType */
 
 class ExternalModuleFactoryPlugin {
+	/**
+	 * @param {string | undefined} type default external type
+	 * @param {Externals} externals externals config
+	 */
 	constructor(type, externals) {
 		this.type = type;
 		this.externals = externals;
 	}
 
+	/**
+	 * @param {NormalModuleFactory} normalModuleFactory the normal module factory
+	 * @returns {void}
+	 */
 	apply(normalModuleFactory) {
 		const globalType = this.type;
-		normalModuleFactory.hooks.factory.tap(
+		normalModuleFactory.hooks.factorize.tapAsync(
 			"ExternalModuleFactoryPlugin",
-			factory => (data, callback) => {
+			(data, callback) => {
 				const context = data.context;
+				const contextInfo = data.contextInfo;
 				const dependency = data.dependencies[0];
+				const dependencyType = data.dependencyType;
+
+				/** @typedef {(err?: Error | null, externalModule?: ExternalModule) => void} HandleExternalCallback */
 
+				/**
+				 * @param {ExternalValue} value the external config
+				 * @param {ExternalType | undefined} type type of external
+				 * @param {HandleExternalCallback} callback callback
+				 * @returns {void}
+				 */
 				const handleExternal = (value, type, callback) => {
-					if (typeof type === "function") {
-						callback = type;
-						type = undefined;
+					if (value === false) {
+						// Not externals, fallback to original factory
+						return callback();
 					}
-					if (value === false) return factory(data, callback);
-					if (value === true) value = dependency.request;
-					if (type === undefined && /^[a-z0-9]+ /.test(value)) {
-						const idx = value.indexOf(" ");
-						type = value.substr(0, idx);
-						value = value.substr(idx + 1);
+					/** @type {string | string[] | Record} */
+					let externalConfig = value === true ? dependency.request : value;
+					// When no explicit type is specified, extract it from the externalConfig
+					if (type === undefined) {
+						if (
+							typeof externalConfig === "string" &&
+							UNSPECIFIED_EXTERNAL_TYPE_REGEXP.test(externalConfig)
+						) {
+							const idx = externalConfig.indexOf(" ");
+							type = externalConfig.slice(0, idx);
+							externalConfig = externalConfig.slice(idx + 1);
+						} else if (
+							Array.isArray(externalConfig) &&
+							externalConfig.length > 0 &&
+							UNSPECIFIED_EXTERNAL_TYPE_REGEXP.test(externalConfig[0])
+						) {
+							const firstItem = externalConfig[0];
+							const idx = firstItem.indexOf(" ");
+							type = firstItem.slice(0, idx);
+							externalConfig = [
+								firstItem.slice(idx + 1),
+								...externalConfig.slice(1)
+							];
+						}
 					}
+
+					const resolvedType = /** @type {string} */ (type || globalType);
+
+					// TODO make it pluggable/add hooks to `ExternalModule` to allow output modules own externals?
+					/** @type {DependencyMeta | undefined} */
+					let dependencyMeta;
+
+					if (
+						dependency instanceof HarmonyImportDependency ||
+						dependency instanceof ImportDependency ||
+						dependency instanceof ContextElementDependency
+					) {
+						const externalType =
+							dependency instanceof HarmonyImportDependency
+								? "module"
+								: dependency instanceof ImportDependency
+									? "import"
+									: undefined;
+
+						dependencyMeta = {
+							attributes: dependency.assertions,
+							externalType
+						};
+					} else if (dependency instanceof CssImportDependency) {
+						dependencyMeta = {
+							layer: dependency.layer,
+							supports: dependency.supports,
+							media: dependency.media
+						};
+					}
+
+					if (
+						resolvedType === "asset" &&
+						dependency instanceof CssUrlDependency
+					) {
+						dependencyMeta = { sourceType: "css-url" };
+					}
+
 					callback(
 						null,
-						new ExternalModule(value, type || globalType, dependency.request)
+						new ExternalModule(
+							externalConfig,
+							resolvedType,
+							dependency.request,
+							dependencyMeta
+						)
 					);
-					return true;
 				};
 
+				/**
+				 * @param {Externals} externals externals config
+				 * @param {HandleExternalCallback} callback callback
+				 * @returns {void}
+				 */
 				const handleExternals = (externals, callback) => {
 					if (typeof externals === "string") {
 						if (externals === dependency.request) {
-							return handleExternal(dependency.request, callback);
+							return handleExternal(dependency.request, undefined, callback);
 						}
 					} else if (Array.isArray(externals)) {
 						let i = 0;
 						const next = () => {
+							/** @type {boolean | undefined} */
 							let asyncFlag;
+							/**
+							 * @param {(Error | null)=} err err
+							 * @param {ExternalModule=} module module
+							 * @returns {void}
+							 */
 							const handleExternalsAndCallback = (err, module) => {
 								if (err) return callback(err);
 								if (!module) {
@@ -72,37 +230,107 @@ class ExternalModuleFactoryPlugin {
 						return;
 					} else if (externals instanceof RegExp) {
 						if (externals.test(dependency.request)) {
-							return handleExternal(dependency.request, callback);
+							return handleExternal(dependency.request, undefined, callback);
 						}
 					} else if (typeof externals === "function") {
-						externals.call(
-							null,
-							context,
-							dependency.request,
-							(err, value, type) => {
-								if (err) return callback(err);
-								if (value !== undefined) {
-									handleExternal(value, type, callback);
-								} else {
-									callback();
-								}
+						/**
+						 * @param {Error | null | undefined} err err
+						 * @param {ExternalValue=} value value
+						 * @param {ExternalType=} type type
+						 * @returns {void}
+						 */
+						const cb = (err, value, type) => {
+							if (err) return callback(err);
+							if (value !== undefined) {
+								handleExternal(value, type, callback);
+							} else {
+								callback();
 							}
-						);
+						};
+						if (externals.length === 3) {
+							// TODO webpack 6 remove this
+							callDeprecatedExternals(
+								externals,
+								context,
+								dependency.request,
+								cb
+							);
+						} else {
+							const promise = externals(
+								{
+									context,
+									request: dependency.request,
+									dependencyType,
+									contextInfo,
+									getResolve: options => (context, request, callback) => {
+										const resolveContext = {
+											fileDependencies: data.fileDependencies,
+											missingDependencies: data.missingDependencies,
+											contextDependencies: data.contextDependencies
+										};
+										let resolver = normalModuleFactory.getResolver(
+											"normal",
+											dependencyType
+												? cachedSetProperty(
+														data.resolveOptions || EMPTY_RESOLVE_OPTIONS,
+														"dependencyType",
+														dependencyType
+													)
+												: data.resolveOptions
+										);
+										if (options) resolver = resolver.withOptions(options);
+										if (callback) {
+											resolver.resolve(
+												{},
+												context,
+												request,
+												resolveContext,
+												callback
+											);
+										} else {
+											return new Promise((resolve, reject) => {
+												resolver.resolve(
+													{},
+													context,
+													request,
+													resolveContext,
+													(err, result) => {
+														if (err) reject(err);
+														else resolve(result);
+													}
+												);
+											});
+										}
+									}
+								},
+								cb
+							);
+							if (promise && promise.then) promise.then(r => cb(null, r), cb);
+						}
 						return;
-					} else if (
-						typeof externals === "object" &&
-						Object.prototype.hasOwnProperty.call(externals, dependency.request)
-					) {
-						return handleExternal(externals[dependency.request], callback);
+					} else if (typeof externals === "object") {
+						const resolvedExternals = resolveLayer(
+							externals,
+							/** @type {IssuerLayer} */
+							(contextInfo.issuerLayer)
+						);
+						if (
+							Object.prototype.hasOwnProperty.call(
+								resolvedExternals,
+								dependency.request
+							)
+						) {
+							return handleExternal(
+								resolvedExternals[dependency.request],
+								undefined,
+								callback
+							);
+						}
 					}
 					callback();
 				};
 
-				handleExternals(this.externals, (err, module) => {
-					if (err) return callback(err);
-					if (!module) return handleExternal(false, callback);
-					return callback(null, module);
-				});
+				handleExternals(this.externals, callback);
 			}
 		);
 	}
diff --git a/lib/ExternalsPlugin.js b/lib/ExternalsPlugin.js
index 697f1aaa0f1..87b692e7fed 100644
--- a/lib/ExternalsPlugin.js
+++ b/lib/ExternalsPlugin.js
@@ -2,17 +2,33 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const ExternalModuleFactoryPlugin = require("./ExternalModuleFactoryPlugin");
 
+/** @typedef {import("../declarations/WebpackOptions").Externals} Externals */
+/** @typedef {import("./Compiler")} Compiler */
+
+const PLUGIN_NAME = "ExternalsPlugin";
+
 class ExternalsPlugin {
+	/**
+	 * @param {string | undefined} type default external type
+	 * @param {Externals} externals externals config
+	 */
 	constructor(type, externals) {
 		this.type = type;
 		this.externals = externals;
 	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		compiler.hooks.compile.tap("ExternalsPlugin", ({ normalModuleFactory }) => {
+		compiler.hooks.compile.tap(PLUGIN_NAME, ({ normalModuleFactory }) => {
 			new ExternalModuleFactoryPlugin(this.type, this.externals).apply(
 				normalModuleFactory
 			);
diff --git a/lib/FalseIIFEUmdWarning.js b/lib/FalseIIFEUmdWarning.js
new file mode 100644
index 00000000000..79eaa54ae03
--- /dev/null
+++ b/lib/FalseIIFEUmdWarning.js
@@ -0,0 +1,19 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Arka Pratim Chaudhuri @arkapratimc
+*/
+
+"use strict";
+
+const WebpackError = require("./WebpackError");
+
+class FalseIIFEUmdWarning extends WebpackError {
+	constructor() {
+		super();
+		this.name = "FalseIIFEUmdWarning";
+		this.message =
+			"Configuration:\nSetting 'output.iife' to 'false' is incompatible with 'output.library.type' set to 'umd'. This configuration may cause unexpected behavior, as UMD libraries are expected to use an IIFE (Immediately Invoked Function Expression) to support various module formats. Consider setting 'output.iife' to 'true' or choosing a different 'library.type' to ensure compatibility.\nLearn more: https://webpack.js.org/configuration/output/";
+	}
+}
+
+module.exports = FalseIIFEUmdWarning;
diff --git a/lib/FileSystemInfo.js b/lib/FileSystemInfo.js
new file mode 100644
index 00000000000..dfebcf0c4f2
--- /dev/null
+++ b/lib/FileSystemInfo.js
@@ -0,0 +1,4074 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { create: createResolver } = require("enhanced-resolve");
+const nodeModule = require("module");
+const asyncLib = require("neo-async");
+const { isAbsolute } = require("path");
+const { DEFAULTS } = require("./config/defaults");
+const AsyncQueue = require("./util/AsyncQueue");
+const StackedCacheMap = require("./util/StackedCacheMap");
+const createHash = require("./util/createHash");
+const { join, dirname, relative, lstatReadlinkAbsolute } = require("./util/fs");
+const makeSerializable = require("./util/makeSerializable");
+const processAsyncTree = require("./util/processAsyncTree");
+
+/** @typedef {import("enhanced-resolve").Resolver} Resolver */
+/** @typedef {import("enhanced-resolve").ResolveRequest} ResolveRequest */
+/** @typedef {import("enhanced-resolve").ResolveFunctionAsync} ResolveFunctionAsync */
+/** @typedef {import("./WebpackError")} WebpackError */
+/** @typedef {import("./logging/Logger").Logger} Logger */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../declarations/WebpackOptions").HashFunction} HashFunction */
+/** @typedef {import("./util/fs").IStats} IStats */
+/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
+/** @typedef {import("./util/fs").PathLike} PathLike */
+/** @typedef {import("./util/fs").StringCallback} StringCallback */
+/**
+ * @template T
+ * @typedef {import("./util/AsyncQueue").Callback} ProcessorCallback
+ */
+/**
+ * @template T, R
+ * @typedef {import("./util/AsyncQueue").Processor} Processor
+ */
+
+const supportsEsm = Number(process.versions.modules) >= 83;
+
+/** @type {Set} */
+const builtinModules = new Set(nodeModule.builtinModules);
+
+let FS_ACCURACY = 2000;
+
+const EMPTY_SET = new Set();
+
+const RBDT_RESOLVE_CJS = 0;
+const RBDT_RESOLVE_ESM = 1;
+const RBDT_RESOLVE_DIRECTORY = 2;
+const RBDT_RESOLVE_CJS_FILE = 3;
+const RBDT_RESOLVE_CJS_FILE_AS_CHILD = 4;
+const RBDT_RESOLVE_ESM_FILE = 5;
+const RBDT_DIRECTORY = 6;
+const RBDT_FILE = 7;
+const RBDT_DIRECTORY_DEPENDENCIES = 8;
+const RBDT_FILE_DEPENDENCIES = 9;
+
+/** @typedef {RBDT_RESOLVE_CJS | RBDT_RESOLVE_ESM | RBDT_RESOLVE_DIRECTORY | RBDT_RESOLVE_CJS_FILE | RBDT_RESOLVE_CJS_FILE_AS_CHILD | RBDT_RESOLVE_ESM_FILE | RBDT_DIRECTORY | RBDT_FILE | RBDT_DIRECTORY_DEPENDENCIES | RBDT_FILE_DEPENDENCIES} JobType */
+
+const INVALID = Symbol("invalid");
+
+/**
+ * @typedef {object} FileSystemInfoEntry
+ * @property {number} safeTime
+ * @property {number=} timestamp
+ */
+
+/**
+ * @typedef {object} ResolvedContextFileSystemInfoEntry
+ * @property {number} safeTime
+ * @property {string=} timestampHash
+ */
+
+/** @typedef {Set} Symlinks */
+
+/**
+ * @typedef {object} ContextFileSystemInfoEntry
+ * @property {number} safeTime
+ * @property {string=} timestampHash
+ * @property {ResolvedContextFileSystemInfoEntry=} resolved
+ * @property {Symlinks=} symlinks
+ */
+
+/**
+ * @typedef {object} TimestampAndHash
+ * @property {number} safeTime
+ * @property {number=} timestamp
+ * @property {string} hash
+ */
+
+/**
+ * @typedef {object} ResolvedContextTimestampAndHash
+ * @property {number} safeTime
+ * @property {string=} timestampHash
+ * @property {string} hash
+ */
+
+/**
+ * @typedef {object} ContextTimestampAndHash
+ * @property {number} safeTime
+ * @property {string=} timestampHash
+ * @property {string} hash
+ * @property {ResolvedContextTimestampAndHash=} resolved
+ * @property {Symlinks=} symlinks
+ */
+
+/**
+ * @typedef {object} ContextHash
+ * @property {string} hash
+ * @property {string=} resolved
+ * @property {Symlinks=} symlinks
+ */
+
+/** @typedef {Set} SnapshotContent */
+
+/**
+ * @typedef {object} SnapshotOptimizationEntry
+ * @property {Snapshot} snapshot
+ * @property {number} shared
+ * @property {SnapshotContent | undefined} snapshotContent
+ * @property {Set | undefined} children
+ */
+
+/** @typedef {Map} ResolveResults */
+
+/** @typedef {Set} Files */
+/** @typedef {Set} Directories */
+/** @typedef {Set} Missing */
+
+/**
+ * @typedef {object} ResolveDependencies
+ * @property {Files} files list of files
+ * @property {Directories} directories list of directories
+ * @property {Missing} missing list of missing entries
+ */
+
+/**
+ * @typedef {object} ResolveBuildDependenciesResult
+ * @property {Files} files list of files
+ * @property {Directories} directories list of directories
+ * @property {Missing} missing list of missing entries
+ * @property {ResolveResults} resolveResults stored resolve results
+ * @property {ResolveDependencies} resolveDependencies dependencies of the resolving
+ */
+
+/**
+ * @typedef {object} SnapshotOptions
+ * @property {boolean=} hash should use hash to snapshot
+ * @property {boolean=} timestamp should use timestamp to snapshot
+ */
+
+const DONE_ITERATOR_RESULT = new Set().keys().next();
+
+// cspell:word tshs
+// Tsh = Timestamp + Hash
+// Tshs = Timestamp + Hash combinations
+
+class SnapshotIterator {
+	/**
+	 * @param {() => IteratorResult} next next
+	 */
+	constructor(next) {
+		this.next = next;
+	}
+}
+
+/** @typedef {Map | Set | undefined} SnapshotMap */
+/** @typedef {(snapshot: Snapshot) => SnapshotMap[]} GetMapsFunction */
+
+class SnapshotIterable {
+	/**
+	 * @param {Snapshot} snapshot snapshot
+	 * @param {GetMapsFunction} getMaps get maps function
+	 */
+	constructor(snapshot, getMaps) {
+		this.snapshot = snapshot;
+		this.getMaps = getMaps;
+	}
+
+	[Symbol.iterator]() {
+		let state = 0;
+		/** @type {IterableIterator} */
+		let it;
+		/** @type {GetMapsFunction} */
+		let getMaps;
+		/** @type {SnapshotMap[]} */
+		let maps;
+		/** @type {Snapshot} */
+		let snapshot;
+		/** @type {Snapshot[] | undefined} */
+		let queue;
+		return new SnapshotIterator(() => {
+			for (;;) {
+				switch (state) {
+					case 0:
+						snapshot = this.snapshot;
+						getMaps = this.getMaps;
+						maps = getMaps(snapshot);
+						state = 1;
+					/* falls through */
+					case 1:
+						if (maps.length > 0) {
+							const map = maps.pop();
+							if (map !== undefined) {
+								it = map.keys();
+								state = 2;
+							} else {
+								break;
+							}
+						} else {
+							state = 3;
+							break;
+						}
+					/* falls through */
+					case 2: {
+						const result = it.next();
+						if (!result.done) return result;
+						state = 1;
+						break;
+					}
+					case 3: {
+						const children = snapshot.children;
+						if (children !== undefined) {
+							if (children.size === 1) {
+								// shortcut for a single child
+								// avoids allocation of queue
+								for (const child of children) snapshot = child;
+								maps = getMaps(snapshot);
+								state = 1;
+								break;
+							}
+							if (queue === undefined) queue = [];
+							for (const child of children) {
+								queue.push(child);
+							}
+						}
+						if (queue !== undefined && queue.length > 0) {
+							snapshot = /** @type {Snapshot} */ (queue.pop());
+							maps = getMaps(snapshot);
+							state = 1;
+							break;
+						} else {
+							state = 4;
+						}
+					}
+					/* falls through */
+					case 4:
+						return DONE_ITERATOR_RESULT;
+				}
+			}
+		});
+	}
+}
+
+/** @typedef {Map} FileTimestamps */
+/** @typedef {Map} FileHashes */
+/** @typedef {Map} FileTshs */
+/** @typedef {Map} ContextTimestamps */
+/** @typedef {Map} ContextHashes */
+/** @typedef {Map} ContextTshs */
+/** @typedef {Map} MissingExistence */
+/** @typedef {Map} ManagedItemInfo */
+/** @typedef {Set} ManagedFiles */
+/** @typedef {Set} ManagedContexts */
+/** @typedef {Set} ManagedMissing */
+/** @typedef {Set} Children */
+
+class Snapshot {
+	constructor() {
+		this._flags = 0;
+		/** @type {Iterable | undefined} */
+		this._cachedFileIterable = undefined;
+		/** @type {Iterable | undefined} */
+		this._cachedContextIterable = undefined;
+		/** @type {Iterable | undefined} */
+		this._cachedMissingIterable = undefined;
+		/** @type {number | undefined} */
+		this.startTime = undefined;
+		/** @type {FileTimestamps | undefined} */
+		this.fileTimestamps = undefined;
+		/** @type {FileHashes | undefined} */
+		this.fileHashes = undefined;
+		/** @type {FileTshs | undefined} */
+		this.fileTshs = undefined;
+		/** @type {ContextTimestamps | undefined} */
+		this.contextTimestamps = undefined;
+		/** @type {ContextHashes | undefined} */
+		this.contextHashes = undefined;
+		/** @type {ContextTshs | undefined} */
+		this.contextTshs = undefined;
+		/** @type {MissingExistence | undefined} */
+		this.missingExistence = undefined;
+		/** @type {ManagedItemInfo | undefined} */
+		this.managedItemInfo = undefined;
+		/** @type {ManagedFiles | undefined} */
+		this.managedFiles = undefined;
+		/** @type {ManagedContexts | undefined} */
+		this.managedContexts = undefined;
+		/** @type {ManagedMissing | undefined} */
+		this.managedMissing = undefined;
+		/** @type {Children | undefined} */
+		this.children = undefined;
+	}
+
+	hasStartTime() {
+		return (this._flags & 1) !== 0;
+	}
+
+	/**
+	 * @param {number} value start value
+	 */
+	setStartTime(value) {
+		this._flags = this._flags | 1;
+		this.startTime = value;
+	}
+
+	/**
+	 * @param {number | undefined} value value
+	 * @param {Snapshot} snapshot snapshot
+	 */
+	setMergedStartTime(value, snapshot) {
+		if (value) {
+			if (snapshot.hasStartTime()) {
+				this.setStartTime(
+					Math.min(
+						value,
+						/** @type {NonNullable} */
+						(snapshot.startTime)
+					)
+				);
+			} else {
+				this.setStartTime(value);
+			}
+		} else if (snapshot.hasStartTime()) {
+			this.setStartTime(
+				/** @type {NonNullable} */
+				(snapshot.startTime)
+			);
+		}
+	}
+
+	hasFileTimestamps() {
+		return (this._flags & 2) !== 0;
+	}
+
+	/**
+	 * @param {FileTimestamps} value file timestamps
+	 */
+	setFileTimestamps(value) {
+		this._flags = this._flags | 2;
+		this.fileTimestamps = value;
+	}
+
+	hasFileHashes() {
+		return (this._flags & 4) !== 0;
+	}
+
+	/**
+	 * @param {FileHashes} value file hashes
+	 */
+	setFileHashes(value) {
+		this._flags = this._flags | 4;
+		this.fileHashes = value;
+	}
+
+	hasFileTshs() {
+		return (this._flags & 8) !== 0;
+	}
+
+	/**
+	 * @param {FileTshs} value file tshs
+	 */
+	setFileTshs(value) {
+		this._flags = this._flags | 8;
+		this.fileTshs = value;
+	}
+
+	hasContextTimestamps() {
+		return (this._flags & 0x10) !== 0;
+	}
+
+	/**
+	 * @param {ContextTimestamps} value context timestamps
+	 */
+	setContextTimestamps(value) {
+		this._flags = this._flags | 0x10;
+		this.contextTimestamps = value;
+	}
+
+	hasContextHashes() {
+		return (this._flags & 0x20) !== 0;
+	}
+
+	/**
+	 * @param {ContextHashes} value context hashes
+	 */
+	setContextHashes(value) {
+		this._flags = this._flags | 0x20;
+		this.contextHashes = value;
+	}
+
+	hasContextTshs() {
+		return (this._flags & 0x40) !== 0;
+	}
+
+	/**
+	 * @param {ContextTshs} value context tshs
+	 */
+	setContextTshs(value) {
+		this._flags = this._flags | 0x40;
+		this.contextTshs = value;
+	}
+
+	hasMissingExistence() {
+		return (this._flags & 0x80) !== 0;
+	}
+
+	/**
+	 * @param {MissingExistence} value context tshs
+	 */
+	setMissingExistence(value) {
+		this._flags = this._flags | 0x80;
+		this.missingExistence = value;
+	}
+
+	hasManagedItemInfo() {
+		return (this._flags & 0x100) !== 0;
+	}
+
+	/**
+	 * @param {ManagedItemInfo} value managed item info
+	 */
+	setManagedItemInfo(value) {
+		this._flags = this._flags | 0x100;
+		this.managedItemInfo = value;
+	}
+
+	hasManagedFiles() {
+		return (this._flags & 0x200) !== 0;
+	}
+
+	/**
+	 * @param {ManagedFiles} value managed files
+	 */
+	setManagedFiles(value) {
+		this._flags = this._flags | 0x200;
+		this.managedFiles = value;
+	}
+
+	hasManagedContexts() {
+		return (this._flags & 0x400) !== 0;
+	}
+
+	/**
+	 * @param {ManagedContexts} value managed contexts
+	 */
+	setManagedContexts(value) {
+		this._flags = this._flags | 0x400;
+		this.managedContexts = value;
+	}
+
+	hasManagedMissing() {
+		return (this._flags & 0x800) !== 0;
+	}
+
+	/**
+	 * @param {ManagedMissing} value managed missing
+	 */
+	setManagedMissing(value) {
+		this._flags = this._flags | 0x800;
+		this.managedMissing = value;
+	}
+
+	hasChildren() {
+		return (this._flags & 0x1000) !== 0;
+	}
+
+	/**
+	 * @param {Children} value children
+	 */
+	setChildren(value) {
+		this._flags = this._flags | 0x1000;
+		this.children = value;
+	}
+
+	/**
+	 * @param {Snapshot} child children
+	 */
+	addChild(child) {
+		if (!this.hasChildren()) {
+			this.setChildren(new Set());
+		}
+		/** @type {Children} */
+		(this.children).add(child);
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize({ write }) {
+		write(this._flags);
+		if (this.hasStartTime()) write(this.startTime);
+		if (this.hasFileTimestamps()) write(this.fileTimestamps);
+		if (this.hasFileHashes()) write(this.fileHashes);
+		if (this.hasFileTshs()) write(this.fileTshs);
+		if (this.hasContextTimestamps()) write(this.contextTimestamps);
+		if (this.hasContextHashes()) write(this.contextHashes);
+		if (this.hasContextTshs()) write(this.contextTshs);
+		if (this.hasMissingExistence()) write(this.missingExistence);
+		if (this.hasManagedItemInfo()) write(this.managedItemInfo);
+		if (this.hasManagedFiles()) write(this.managedFiles);
+		if (this.hasManagedContexts()) write(this.managedContexts);
+		if (this.hasManagedMissing()) write(this.managedMissing);
+		if (this.hasChildren()) write(this.children);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize({ read }) {
+		this._flags = read();
+		if (this.hasStartTime()) this.startTime = read();
+		if (this.hasFileTimestamps()) this.fileTimestamps = read();
+		if (this.hasFileHashes()) this.fileHashes = read();
+		if (this.hasFileTshs()) this.fileTshs = read();
+		if (this.hasContextTimestamps()) this.contextTimestamps = read();
+		if (this.hasContextHashes()) this.contextHashes = read();
+		if (this.hasContextTshs()) this.contextTshs = read();
+		if (this.hasMissingExistence()) this.missingExistence = read();
+		if (this.hasManagedItemInfo()) this.managedItemInfo = read();
+		if (this.hasManagedFiles()) this.managedFiles = read();
+		if (this.hasManagedContexts()) this.managedContexts = read();
+		if (this.hasManagedMissing()) this.managedMissing = read();
+		if (this.hasChildren()) this.children = read();
+	}
+
+	/**
+	 * @param {GetMapsFunction} getMaps first
+	 * @returns {Iterable} iterable
+	 */
+	_createIterable(getMaps) {
+		return new SnapshotIterable(this, getMaps);
+	}
+
+	/**
+	 * @returns {Iterable} iterable
+	 */
+	getFileIterable() {
+		if (this._cachedFileIterable === undefined) {
+			this._cachedFileIterable = this._createIterable(s => [
+				s.fileTimestamps,
+				s.fileHashes,
+				s.fileTshs,
+				s.managedFiles
+			]);
+		}
+		return this._cachedFileIterable;
+	}
+
+	/**
+	 * @returns {Iterable} iterable
+	 */
+	getContextIterable() {
+		if (this._cachedContextIterable === undefined) {
+			this._cachedContextIterable = this._createIterable(s => [
+				s.contextTimestamps,
+				s.contextHashes,
+				s.contextTshs,
+				s.managedContexts
+			]);
+		}
+		return this._cachedContextIterable;
+	}
+
+	/**
+	 * @returns {Iterable} iterable
+	 */
+	getMissingIterable() {
+		if (this._cachedMissingIterable === undefined) {
+			this._cachedMissingIterable = this._createIterable(s => [
+				s.missingExistence,
+				s.managedMissing
+			]);
+		}
+		return this._cachedMissingIterable;
+	}
+}
+
+makeSerializable(Snapshot, "webpack/lib/FileSystemInfo", "Snapshot");
+
+const MIN_COMMON_SNAPSHOT_SIZE = 3;
+
+/**
+ * @template U, T
+ * @typedef {U extends true ? Set : Map} SnapshotOptimizationValue
+ */
+
+/**
+ * @template T
+ * @template {boolean} [U=false]
+ */
+class SnapshotOptimization {
+	/**
+	 * @param {(snapshot: Snapshot) => boolean} has has value
+	 * @param {(snapshot: Snapshot) => SnapshotOptimizationValue | undefined} get get value
+	 * @param {(snapshot: Snapshot, value: SnapshotOptimizationValue) => void} set set value
+	 * @param {boolean=} useStartTime use the start time of snapshots
+	 * @param {U=} isSet value is an Set instead of a Map
+	 */
+	constructor(
+		has,
+		get,
+		set,
+		useStartTime = true,
+		isSet = /** @type {U} */ (false)
+	) {
+		this._has = has;
+		this._get = get;
+		this._set = set;
+		this._useStartTime = useStartTime;
+		/** @type {U} */
+		this._isSet = isSet;
+		/** @type {Map} */
+		this._map = new Map();
+		this._statItemsShared = 0;
+		this._statItemsUnshared = 0;
+		this._statSharedSnapshots = 0;
+		this._statReusedSharedSnapshots = 0;
+	}
+
+	getStatisticMessage() {
+		const total = this._statItemsShared + this._statItemsUnshared;
+		if (total === 0) return;
+		return `${
+			this._statItemsShared && Math.round((this._statItemsShared * 100) / total)
+		}% (${this._statItemsShared}/${total}) entries shared via ${
+			this._statSharedSnapshots
+		} shared snapshots (${
+			this._statReusedSharedSnapshots + this._statSharedSnapshots
+		} times referenced)`;
+	}
+
+	clear() {
+		this._map.clear();
+		this._statItemsShared = 0;
+		this._statItemsUnshared = 0;
+		this._statSharedSnapshots = 0;
+		this._statReusedSharedSnapshots = 0;
+	}
+
+	/**
+	 * @param {Snapshot} newSnapshot snapshot
+	 * @param {Set} capturedFiles files to snapshot/share
+	 * @returns {void}
+	 */
+	optimize(newSnapshot, capturedFiles) {
+		/**
+		 * @param {SnapshotOptimizationEntry} entry optimization entry
+		 * @returns {void}
+		 */
+		const increaseSharedAndStoreOptimizationEntry = entry => {
+			if (entry.children !== undefined) {
+				for (const child of entry.children) {
+					increaseSharedAndStoreOptimizationEntry(child);
+				}
+			}
+			entry.shared++;
+			storeOptimizationEntry(entry);
+		};
+		/**
+		 * @param {SnapshotOptimizationEntry} entry optimization entry
+		 * @returns {void}
+		 */
+		const storeOptimizationEntry = entry => {
+			for (const path of /** @type {SnapshotContent} */ (
+				entry.snapshotContent
+			)) {
+				const old =
+					/** @type {SnapshotOptimizationEntry} */
+					(this._map.get(path));
+				if (old.shared < entry.shared) {
+					this._map.set(path, entry);
+				}
+				capturedFiles.delete(path);
+			}
+		};
+
+		/** @type {SnapshotOptimizationEntry | undefined} */
+		let newOptimizationEntry;
+
+		const capturedFilesSize = capturedFiles.size;
+
+		/** @type {Set | undefined} */
+		const optimizationEntries = new Set();
+
+		for (const path of capturedFiles) {
+			const optimizationEntry = this._map.get(path);
+			if (optimizationEntry === undefined) {
+				if (newOptimizationEntry === undefined) {
+					newOptimizationEntry = {
+						snapshot: newSnapshot,
+						shared: 0,
+						snapshotContent: undefined,
+						children: undefined
+					};
+				}
+				this._map.set(path, newOptimizationEntry);
+			} else {
+				optimizationEntries.add(optimizationEntry);
+			}
+		}
+
+		optimizationEntriesLabel: for (const optimizationEntry of optimizationEntries) {
+			const snapshot = optimizationEntry.snapshot;
+			if (optimizationEntry.shared > 0) {
+				// It's a shared snapshot
+				// We can't change it, so we can only use it when all files match
+				// and startTime is compatible
+				if (
+					this._useStartTime &&
+					newSnapshot.startTime &&
+					(!snapshot.startTime || snapshot.startTime > newSnapshot.startTime)
+				) {
+					continue;
+				}
+				const nonSharedFiles = new Set();
+				const snapshotContent =
+					/** @type {NonNullable} */
+					(optimizationEntry.snapshotContent);
+				const snapshotEntries =
+					/** @type {SnapshotOptimizationValue} */
+					(this._get(snapshot));
+				for (const path of snapshotContent) {
+					if (!capturedFiles.has(path)) {
+						if (!snapshotEntries.has(path)) {
+							// File is not shared and can't be removed from the snapshot
+							// because it's in a child of the snapshot
+							continue optimizationEntriesLabel;
+						}
+						nonSharedFiles.add(path);
+					}
+				}
+				if (nonSharedFiles.size === 0) {
+					// The complete snapshot is shared
+					// add it as child
+					newSnapshot.addChild(snapshot);
+					increaseSharedAndStoreOptimizationEntry(optimizationEntry);
+					this._statReusedSharedSnapshots++;
+				} else {
+					// Only a part of the snapshot is shared
+					const sharedCount = snapshotContent.size - nonSharedFiles.size;
+					if (sharedCount < MIN_COMMON_SNAPSHOT_SIZE) {
+						// Common part it too small
+						continue;
+					}
+					// Extract common timestamps from both snapshots
+					let commonMap;
+					if (this._isSet) {
+						commonMap = new Set();
+						for (const path of /** @type {Set} */ (snapshotEntries)) {
+							if (nonSharedFiles.has(path)) continue;
+							commonMap.add(path);
+							snapshotEntries.delete(path);
+						}
+					} else {
+						commonMap = new Map();
+						const map = /** @type {Map} */ (snapshotEntries);
+						for (const [path, value] of map) {
+							if (nonSharedFiles.has(path)) continue;
+							commonMap.set(path, value);
+							snapshotEntries.delete(path);
+						}
+					}
+					// Create and attach snapshot
+					const commonSnapshot = new Snapshot();
+					if (this._useStartTime) {
+						commonSnapshot.setMergedStartTime(newSnapshot.startTime, snapshot);
+					}
+					this._set(
+						commonSnapshot,
+						/** @type {SnapshotOptimizationValue} */ (commonMap)
+					);
+					newSnapshot.addChild(commonSnapshot);
+					snapshot.addChild(commonSnapshot);
+					// Create optimization entry
+					const newEntry = {
+						snapshot: commonSnapshot,
+						shared: optimizationEntry.shared + 1,
+						snapshotContent: new Set(commonMap.keys()),
+						children: undefined
+					};
+					if (optimizationEntry.children === undefined)
+						optimizationEntry.children = new Set();
+					optimizationEntry.children.add(newEntry);
+					storeOptimizationEntry(newEntry);
+					this._statSharedSnapshots++;
+				}
+			} else {
+				// It's a unshared snapshot
+				// We can extract a common shared snapshot
+				// with all common files
+				const snapshotEntries = this._get(snapshot);
+				if (snapshotEntries === undefined) {
+					// Incomplete snapshot, that can't be used
+					continue;
+				}
+				let commonMap;
+				if (this._isSet) {
+					commonMap = new Set();
+					const set = /** @type {Set} */ (snapshotEntries);
+					if (capturedFiles.size < set.size) {
+						for (const path of capturedFiles) {
+							if (set.has(path)) commonMap.add(path);
+						}
+					} else {
+						for (const path of set) {
+							if (capturedFiles.has(path)) commonMap.add(path);
+						}
+					}
+				} else {
+					commonMap = new Map();
+					const map = /** @type {Map} */ (snapshotEntries);
+					for (const path of capturedFiles) {
+						const ts = map.get(path);
+						if (ts === undefined) continue;
+						commonMap.set(path, ts);
+					}
+				}
+
+				if (commonMap.size < MIN_COMMON_SNAPSHOT_SIZE) {
+					// Common part it too small
+					continue;
+				}
+				// Create and attach snapshot
+				const commonSnapshot = new Snapshot();
+				if (this._useStartTime) {
+					commonSnapshot.setMergedStartTime(newSnapshot.startTime, snapshot);
+				}
+				this._set(
+					commonSnapshot,
+					/** @type {SnapshotOptimizationValue} */
+					(commonMap)
+				);
+				newSnapshot.addChild(commonSnapshot);
+				snapshot.addChild(commonSnapshot);
+				// Remove files from snapshot
+				for (const path of commonMap.keys()) snapshotEntries.delete(path);
+				const sharedCount = commonMap.size;
+				this._statItemsUnshared -= sharedCount;
+				this._statItemsShared += sharedCount;
+				// Create optimization entry
+				storeOptimizationEntry({
+					snapshot: commonSnapshot,
+					shared: 2,
+					snapshotContent: new Set(commonMap.keys()),
+					children: undefined
+				});
+				this._statSharedSnapshots++;
+			}
+		}
+		const unshared = capturedFiles.size;
+		this._statItemsUnshared += unshared;
+		this._statItemsShared += capturedFilesSize - unshared;
+	}
+}
+
+/**
+ * @param {string} str input
+ * @returns {string} result
+ */
+const parseString = str => {
+	if (str[0] === "'" || str[0] === "`")
+		str = `"${str.slice(1, -1).replace(/"/g, '\\"')}"`;
+	return JSON.parse(str);
+};
+
+/* istanbul ignore next */
+/**
+ * @param {number} mtime mtime
+ */
+const applyMtime = mtime => {
+	if (FS_ACCURACY > 1 && mtime % 2 !== 0) FS_ACCURACY = 1;
+	else if (FS_ACCURACY > 10 && mtime % 20 !== 0) FS_ACCURACY = 10;
+	else if (FS_ACCURACY > 100 && mtime % 200 !== 0) FS_ACCURACY = 100;
+	else if (FS_ACCURACY > 1000 && mtime % 2000 !== 0) FS_ACCURACY = 1000;
+};
+
+/**
+ * @template T
+ * @template K
+ * @param {Map | undefined} a source map
+ * @param {Map | undefined} b joining map
+ * @returns {Map} joined map
+ */
+const mergeMaps = (a, b) => {
+	if (!b || b.size === 0) return /** @type {Map} */ (a);
+	if (!a || a.size === 0) return /** @type {Map} */ (b);
+	/** @type {Map} */
+	const map = new Map(a);
+	for (const [key, value] of b) {
+		map.set(key, value);
+	}
+	return map;
+};
+
+/**
+ * @template T
+ * @param {Set | undefined} a source map
+ * @param {Set | undefined} b joining map
+ * @returns {Set} joined map
+ */
+const mergeSets = (a, b) => {
+	if (!b || b.size === 0) return /** @type {Set} */ (a);
+	if (!a || a.size === 0) return /** @type {Set} */ (b);
+	/** @type {Set} */
+	const map = new Set(a);
+	for (const item of b) {
+		map.add(item);
+	}
+	return map;
+};
+
+/**
+ * Finding file or directory to manage
+ * @param {string} managedPath path that is managing by {@link FileSystemInfo}
+ * @param {string} path path to file or directory
+ * @returns {string|null} managed item
+ * @example
+ * getManagedItem(
+ *   '/Users/user/my-project/node_modules/',
+ *   '/Users/user/my-project/node_modules/package/index.js'
+ * ) === '/Users/user/my-project/node_modules/package'
+ * getManagedItem(
+ *   '/Users/user/my-project/node_modules/',
+ *   '/Users/user/my-project/node_modules/package1/node_modules/package2'
+ * ) === '/Users/user/my-project/node_modules/package1/node_modules/package2'
+ * getManagedItem(
+ *   '/Users/user/my-project/node_modules/',
+ *   '/Users/user/my-project/node_modules/.bin/script.js'
+ * ) === null // hidden files are disallowed as managed items
+ * getManagedItem(
+ *   '/Users/user/my-project/node_modules/',
+ *   '/Users/user/my-project/node_modules/package'
+ * ) === '/Users/user/my-project/node_modules/package'
+ */
+const getManagedItem = (managedPath, path) => {
+	let i = managedPath.length;
+	let slashes = 1;
+	let startingPosition = true;
+	loop: while (i < path.length) {
+		switch (path.charCodeAt(i)) {
+			case 47: // slash
+			case 92: // backslash
+				if (--slashes === 0) break loop;
+				startingPosition = true;
+				break;
+			case 46: // .
+				// hidden files are disallowed as managed items
+				// it's probably .yarn-integrity or .cache
+				if (startingPosition) return null;
+				break;
+			case 64: // @
+				if (!startingPosition) return null;
+				slashes++;
+				break;
+			default:
+				startingPosition = false;
+				break;
+		}
+		i++;
+	}
+	if (i === path.length) slashes--;
+	// return null when path is incomplete
+	if (slashes !== 0) return null;
+	// if (path.slice(i + 1, i + 13) === "node_modules")
+	if (
+		path.length >= i + 13 &&
+		path.charCodeAt(i + 1) === 110 &&
+		path.charCodeAt(i + 2) === 111 &&
+		path.charCodeAt(i + 3) === 100 &&
+		path.charCodeAt(i + 4) === 101 &&
+		path.charCodeAt(i + 5) === 95 &&
+		path.charCodeAt(i + 6) === 109 &&
+		path.charCodeAt(i + 7) === 111 &&
+		path.charCodeAt(i + 8) === 100 &&
+		path.charCodeAt(i + 9) === 117 &&
+		path.charCodeAt(i + 10) === 108 &&
+		path.charCodeAt(i + 11) === 101 &&
+		path.charCodeAt(i + 12) === 115
+	) {
+		// if this is the end of the path
+		if (path.length === i + 13) {
+			// return the node_modules directory
+			// it's special
+			return path;
+		}
+		const c = path.charCodeAt(i + 13);
+		// if next symbol is slash or backslash
+		if (c === 47 || c === 92) {
+			// Managed subpath
+			return getManagedItem(path.slice(0, i + 14), path);
+		}
+	}
+	return path.slice(0, i);
+};
+
+/**
+ * @template {ContextFileSystemInfoEntry | ContextTimestampAndHash} T
+ * @param {T | null} entry entry
+ * @returns {T["resolved"] | null | undefined} the resolved entry
+ */
+const getResolvedTimestamp = entry => {
+	if (entry === null) return null;
+	if (entry.resolved !== undefined) return entry.resolved;
+	return entry.symlinks === undefined ? entry : undefined;
+};
+
+/**
+ * @param {ContextHash | null} entry entry
+ * @returns {string | null | undefined} the resolved entry
+ */
+const getResolvedHash = entry => {
+	if (entry === null) return null;
+	if (entry.resolved !== undefined) return entry.resolved;
+	return entry.symlinks === undefined ? entry.hash : undefined;
+};
+
+/**
+ * @template T
+ * @param {Set} source source
+ * @param {Set} target target
+ */
+const addAll = (source, target) => {
+	for (const key of source) target.add(key);
+};
+
+/** @typedef {Set} LoggedPaths */
+
+/** @typedef {FileSystemInfoEntry | "ignore" | null} FileTimestamp */
+/** @typedef {ContextFileSystemInfoEntry | "ignore" | null} ContextTimestamp */
+/** @typedef {ResolvedContextFileSystemInfoEntry | "ignore" | null} ResolvedContextTimestamp */
+
+/** @typedef {(err?: WebpackError | null, result?: boolean) => void} CheckSnapshotValidCallback */
+
+/**
+ * Used to access information about the filesystem in a cached way
+ */
+class FileSystemInfo {
+	/**
+	 * @param {InputFileSystem} fs file system
+	 * @param {object} options options
+	 * @param {Iterable=} options.unmanagedPaths paths that are not managed by a package manager and the contents are subject to change
+	 * @param {Iterable=} options.managedPaths paths that are only managed by a package manager
+	 * @param {Iterable=} options.immutablePaths paths that are immutable
+	 * @param {Logger=} options.logger logger used to log invalid snapshots
+	 * @param {HashFunction=} options.hashFunction the hash function to use
+	 */
+	constructor(
+		fs,
+		{
+			unmanagedPaths = [],
+			managedPaths = [],
+			immutablePaths = [],
+			logger,
+			hashFunction = DEFAULTS.HASH_FUNCTION
+		} = {}
+	) {
+		this.fs = fs;
+		this.logger = logger;
+		this._remainingLogs = logger ? 40 : 0;
+		/** @type {LoggedPaths | undefined} */
+		this._loggedPaths = logger ? new Set() : undefined;
+		this._hashFunction = hashFunction;
+		/** @type {WeakMap} */
+		this._snapshotCache = new WeakMap();
+		this._fileTimestampsOptimization = new SnapshotOptimization(
+			s => s.hasFileTimestamps(),
+			s => s.fileTimestamps,
+			(s, v) => s.setFileTimestamps(v)
+		);
+		this._fileHashesOptimization = new SnapshotOptimization(
+			s => s.hasFileHashes(),
+			s => s.fileHashes,
+			(s, v) => s.setFileHashes(v),
+			false
+		);
+		this._fileTshsOptimization = new SnapshotOptimization(
+			s => s.hasFileTshs(),
+			s => s.fileTshs,
+			(s, v) => s.setFileTshs(v)
+		);
+		this._contextTimestampsOptimization = new SnapshotOptimization(
+			s => s.hasContextTimestamps(),
+			s => s.contextTimestamps,
+			(s, v) => s.setContextTimestamps(v)
+		);
+		this._contextHashesOptimization = new SnapshotOptimization(
+			s => s.hasContextHashes(),
+			s => s.contextHashes,
+			(s, v) => s.setContextHashes(v),
+			false
+		);
+		this._contextTshsOptimization = new SnapshotOptimization(
+			s => s.hasContextTshs(),
+			s => s.contextTshs,
+			(s, v) => s.setContextTshs(v)
+		);
+		this._missingExistenceOptimization = new SnapshotOptimization(
+			s => s.hasMissingExistence(),
+			s => s.missingExistence,
+			(s, v) => s.setMissingExistence(v),
+			false
+		);
+		this._managedItemInfoOptimization = new SnapshotOptimization(
+			s => s.hasManagedItemInfo(),
+			s => s.managedItemInfo,
+			(s, v) => s.setManagedItemInfo(v),
+			false
+		);
+		this._managedFilesOptimization = new SnapshotOptimization(
+			s => s.hasManagedFiles(),
+			s => s.managedFiles,
+			(s, v) => s.setManagedFiles(v),
+			false,
+			true
+		);
+		this._managedContextsOptimization = new SnapshotOptimization(
+			s => s.hasManagedContexts(),
+			s => s.managedContexts,
+			(s, v) => s.setManagedContexts(v),
+			false,
+			true
+		);
+		this._managedMissingOptimization = new SnapshotOptimization(
+			s => s.hasManagedMissing(),
+			s => s.managedMissing,
+			(s, v) => s.setManagedMissing(v),
+			false,
+			true
+		);
+		/** @type {StackedCacheMap} */
+		this._fileTimestamps = new StackedCacheMap();
+		/** @type {Map} */
+		this._fileHashes = new Map();
+		/** @type {Map} */
+		this._fileTshs = new Map();
+		/** @type {StackedCacheMap} */
+		this._contextTimestamps = new StackedCacheMap();
+		/** @type {Map} */
+		this._contextHashes = new Map();
+		/** @type {Map} */
+		this._contextTshs = new Map();
+		/** @type {Map} */
+		this._managedItems = new Map();
+		/** @type {AsyncQueue} */
+		this.fileTimestampQueue = new AsyncQueue({
+			name: "file timestamp",
+			parallelism: 30,
+			processor: this._readFileTimestamp.bind(this)
+		});
+		/** @type {AsyncQueue} */
+		this.fileHashQueue = new AsyncQueue({
+			name: "file hash",
+			parallelism: 10,
+			processor: this._readFileHash.bind(this)
+		});
+		/** @type {AsyncQueue} */
+		this.contextTimestampQueue = new AsyncQueue({
+			name: "context timestamp",
+			parallelism: 2,
+			processor: this._readContextTimestamp.bind(this)
+		});
+		/** @type {AsyncQueue} */
+		this.contextHashQueue = new AsyncQueue({
+			name: "context hash",
+			parallelism: 2,
+			processor: this._readContextHash.bind(this)
+		});
+		/** @type {AsyncQueue} */
+		this.contextTshQueue = new AsyncQueue({
+			name: "context hash and timestamp",
+			parallelism: 2,
+			processor: this._readContextTimestampAndHash.bind(this)
+		});
+		/** @type {AsyncQueue} */
+		this.managedItemQueue = new AsyncQueue({
+			name: "managed item info",
+			parallelism: 10,
+			processor: this._getManagedItemInfo.bind(this)
+		});
+		/** @type {AsyncQueue>} */
+		this.managedItemDirectoryQueue = new AsyncQueue({
+			name: "managed item directory info",
+			parallelism: 10,
+			processor: this._getManagedItemDirectoryInfo.bind(this)
+		});
+		const _unmanagedPaths = Array.from(unmanagedPaths);
+		this.unmanagedPathsWithSlash =
+			/** @type {string[]} */
+			(_unmanagedPaths.filter(p => typeof p === "string")).map(p =>
+				join(fs, p, "_").slice(0, -1)
+			);
+		this.unmanagedPathsRegExps =
+			/** @type {RegExp[]} */
+			(_unmanagedPaths.filter(p => typeof p !== "string"));
+
+		this.managedPaths = Array.from(managedPaths);
+		this.managedPathsWithSlash =
+			/** @type {string[]} */
+			(this.managedPaths.filter(p => typeof p === "string")).map(p =>
+				join(fs, p, "_").slice(0, -1)
+			);
+
+		this.managedPathsRegExps =
+			/** @type {RegExp[]} */
+			(this.managedPaths.filter(p => typeof p !== "string"));
+		this.immutablePaths = Array.from(immutablePaths);
+		this.immutablePathsWithSlash =
+			/** @type {string[]} */
+			(this.immutablePaths.filter(p => typeof p === "string")).map(p =>
+				join(fs, p, "_").slice(0, -1)
+			);
+		this.immutablePathsRegExps =
+			/** @type {RegExp[]} */
+			(this.immutablePaths.filter(p => typeof p !== "string"));
+
+		this._cachedDeprecatedFileTimestamps = undefined;
+		this._cachedDeprecatedContextTimestamps = undefined;
+
+		this._warnAboutExperimentalEsmTracking = false;
+
+		this._statCreatedSnapshots = 0;
+		this._statTestedSnapshotsCached = 0;
+		this._statTestedSnapshotsNotCached = 0;
+		this._statTestedChildrenCached = 0;
+		this._statTestedChildrenNotCached = 0;
+		this._statTestedEntries = 0;
+	}
+
+	logStatistics() {
+		const logger = /** @type {Logger} */ (this.logger);
+		/**
+		 * @param {string} header header
+		 * @param {string | undefined} message message
+		 */
+		const logWhenMessage = (header, message) => {
+			if (message) {
+				logger.log(`${header}: ${message}`);
+			}
+		};
+		logger.log(`${this._statCreatedSnapshots} new snapshots created`);
+		logger.log(
+			`${
+				this._statTestedSnapshotsNotCached &&
+				Math.round(
+					(this._statTestedSnapshotsNotCached * 100) /
+						(this._statTestedSnapshotsCached +
+							this._statTestedSnapshotsNotCached)
+				)
+			}% root snapshot uncached (${this._statTestedSnapshotsNotCached} / ${
+				this._statTestedSnapshotsCached + this._statTestedSnapshotsNotCached
+			})`
+		);
+		logger.log(
+			`${
+				this._statTestedChildrenNotCached &&
+				Math.round(
+					(this._statTestedChildrenNotCached * 100) /
+						(this._statTestedChildrenCached + this._statTestedChildrenNotCached)
+				)
+			}% children snapshot uncached (${this._statTestedChildrenNotCached} / ${
+				this._statTestedChildrenCached + this._statTestedChildrenNotCached
+			})`
+		);
+		logger.log(`${this._statTestedEntries} entries tested`);
+		logger.log(
+			`File info in cache: ${this._fileTimestamps.size} timestamps ${this._fileHashes.size} hashes ${this._fileTshs.size} timestamp hash combinations`
+		);
+		logWhenMessage(
+			"File timestamp snapshot optimization",
+			this._fileTimestampsOptimization.getStatisticMessage()
+		);
+		logWhenMessage(
+			"File hash snapshot optimization",
+			this._fileHashesOptimization.getStatisticMessage()
+		);
+		logWhenMessage(
+			"File timestamp hash combination snapshot optimization",
+			this._fileTshsOptimization.getStatisticMessage()
+		);
+		logger.log(
+			`Directory info in cache: ${this._contextTimestamps.size} timestamps ${this._contextHashes.size} hashes ${this._contextTshs.size} timestamp hash combinations`
+		);
+		logWhenMessage(
+			"Directory timestamp snapshot optimization",
+			this._contextTimestampsOptimization.getStatisticMessage()
+		);
+		logWhenMessage(
+			"Directory hash snapshot optimization",
+			this._contextHashesOptimization.getStatisticMessage()
+		);
+		logWhenMessage(
+			"Directory timestamp hash combination snapshot optimization",
+			this._contextTshsOptimization.getStatisticMessage()
+		);
+		logWhenMessage(
+			"Missing items snapshot optimization",
+			this._missingExistenceOptimization.getStatisticMessage()
+		);
+		logger.log(`Managed items info in cache: ${this._managedItems.size} items`);
+		logWhenMessage(
+			"Managed items snapshot optimization",
+			this._managedItemInfoOptimization.getStatisticMessage()
+		);
+		logWhenMessage(
+			"Managed files snapshot optimization",
+			this._managedFilesOptimization.getStatisticMessage()
+		);
+		logWhenMessage(
+			"Managed contexts snapshot optimization",
+			this._managedContextsOptimization.getStatisticMessage()
+		);
+		logWhenMessage(
+			"Managed missing snapshot optimization",
+			this._managedMissingOptimization.getStatisticMessage()
+		);
+	}
+
+	/**
+	 * @private
+	 * @param {string} path path
+	 * @param {string} reason reason
+	 * @param {EXPECTED_ANY[]} args arguments
+	 */
+	_log(path, reason, ...args) {
+		const key = path + reason;
+		const loggedPaths = /** @type {LoggedPaths} */ (this._loggedPaths);
+		if (loggedPaths.has(key)) return;
+		loggedPaths.add(key);
+		/** @type {Logger} */
+		(this.logger).debug(`${path} invalidated because ${reason}`, ...args);
+		if (--this._remainingLogs === 0) {
+			/** @type {Logger} */
+			(this.logger).debug(
+				"Logging limit has been reached and no further logging will be emitted by FileSystemInfo"
+			);
+		}
+	}
+
+	clear() {
+		this._remainingLogs = this.logger ? 40 : 0;
+		if (this._loggedPaths !== undefined) this._loggedPaths.clear();
+
+		this._snapshotCache = new WeakMap();
+		this._fileTimestampsOptimization.clear();
+		this._fileHashesOptimization.clear();
+		this._fileTshsOptimization.clear();
+		this._contextTimestampsOptimization.clear();
+		this._contextHashesOptimization.clear();
+		this._contextTshsOptimization.clear();
+		this._missingExistenceOptimization.clear();
+		this._managedItemInfoOptimization.clear();
+		this._managedFilesOptimization.clear();
+		this._managedContextsOptimization.clear();
+		this._managedMissingOptimization.clear();
+		this._fileTimestamps.clear();
+		this._fileHashes.clear();
+		this._fileTshs.clear();
+		this._contextTimestamps.clear();
+		this._contextHashes.clear();
+		this._contextTshs.clear();
+		this._managedItems.clear();
+		this._managedItems.clear();
+
+		this._cachedDeprecatedFileTimestamps = undefined;
+		this._cachedDeprecatedContextTimestamps = undefined;
+
+		this._statCreatedSnapshots = 0;
+		this._statTestedSnapshotsCached = 0;
+		this._statTestedSnapshotsNotCached = 0;
+		this._statTestedChildrenCached = 0;
+		this._statTestedChildrenNotCached = 0;
+		this._statTestedEntries = 0;
+	}
+
+	/**
+	 * @param {ReadonlyMap} map timestamps
+	 * @param {boolean=} immutable if 'map' is immutable and FileSystemInfo can keep referencing it
+	 * @returns {void}
+	 */
+	addFileTimestamps(map, immutable) {
+		this._fileTimestamps.addAll(map, immutable);
+		this._cachedDeprecatedFileTimestamps = undefined;
+	}
+
+	/**
+	 * @param {ReadonlyMap} map timestamps
+	 * @param {boolean=} immutable if 'map' is immutable and FileSystemInfo can keep referencing it
+	 * @returns {void}
+	 */
+	addContextTimestamps(map, immutable) {
+		this._contextTimestamps.addAll(map, immutable);
+		this._cachedDeprecatedContextTimestamps = undefined;
+	}
+
+	/**
+	 * @param {string} path file path
+	 * @param {(err?: WebpackError | null, fileTimestamp?: FileTimestamp) => void} callback callback function
+	 * @returns {void}
+	 */
+	getFileTimestamp(path, callback) {
+		const cache = this._fileTimestamps.get(path);
+		if (cache !== undefined) return callback(null, cache);
+		this.fileTimestampQueue.add(path, callback);
+	}
+
+	/**
+	 * @param {string} path context path
+	 * @param {(err?: WebpackError | null, resolvedContextTimestamp?: ResolvedContextTimestamp) => void} callback callback function
+	 * @returns {void}
+	 */
+	getContextTimestamp(path, callback) {
+		const cache = this._contextTimestamps.get(path);
+		if (cache !== undefined) {
+			if (cache === "ignore") return callback(null, "ignore");
+			const resolved = getResolvedTimestamp(cache);
+			if (resolved !== undefined) return callback(null, resolved);
+			return this._resolveContextTimestamp(
+				/** @type {ResolvedContextFileSystemInfoEntry} */
+				(cache),
+				callback
+			);
+		}
+		this.contextTimestampQueue.add(path, (err, _entry) => {
+			if (err) return callback(err);
+			const entry = /** @type {ContextFileSystemInfoEntry} */ (_entry);
+			const resolved = getResolvedTimestamp(entry);
+			if (resolved !== undefined) return callback(null, resolved);
+			this._resolveContextTimestamp(entry, callback);
+		});
+	}
+
+	/**
+	 * @private
+	 * @param {string} path context path
+	 * @param {(err?: WebpackError | null, contextTimestamp?: ContextTimestamp) => void} callback callback function
+	 * @returns {void}
+	 */
+	_getUnresolvedContextTimestamp(path, callback) {
+		const cache = this._contextTimestamps.get(path);
+		if (cache !== undefined) return callback(null, cache);
+		this.contextTimestampQueue.add(path, callback);
+	}
+
+	/**
+	 * @param {string} path file path
+	 * @param {(err?: WebpackError | null, hash?: string | null) => void} callback callback function
+	 * @returns {void}
+	 */
+	getFileHash(path, callback) {
+		const cache = this._fileHashes.get(path);
+		if (cache !== undefined) return callback(null, cache);
+		this.fileHashQueue.add(path, callback);
+	}
+
+	/**
+	 * @param {string} path context path
+	 * @param {(err?: WebpackError | null, contextHash?: string) => void} callback callback function
+	 * @returns {void}
+	 */
+	getContextHash(path, callback) {
+		const cache = this._contextHashes.get(path);
+		if (cache !== undefined) {
+			const resolved = getResolvedHash(cache);
+			if (resolved !== undefined)
+				return callback(null, /** @type {string} */ (resolved));
+			return this._resolveContextHash(cache, callback);
+		}
+		this.contextHashQueue.add(path, (err, _entry) => {
+			if (err) return callback(err);
+			const entry = /** @type {ContextHash} */ (_entry);
+			const resolved = getResolvedHash(entry);
+			if (resolved !== undefined)
+				return callback(null, /** @type {string} */ (resolved));
+			this._resolveContextHash(entry, callback);
+		});
+	}
+
+	/**
+	 * @private
+	 * @param {string} path context path
+	 * @param {(err?: WebpackError | null, contextHash?: ContextHash | null) => void} callback callback function
+	 * @returns {void}
+	 */
+	_getUnresolvedContextHash(path, callback) {
+		const cache = this._contextHashes.get(path);
+		if (cache !== undefined) return callback(null, cache);
+		this.contextHashQueue.add(path, callback);
+	}
+
+	/**
+	 * @param {string} path context path
+	 * @param {(err?: WebpackError | null, resolvedContextTimestampAndHash?: ResolvedContextTimestampAndHash | null) => void} callback callback function
+	 * @returns {void}
+	 */
+	getContextTsh(path, callback) {
+		const cache = this._contextTshs.get(path);
+		if (cache !== undefined) {
+			const resolved = getResolvedTimestamp(cache);
+			if (resolved !== undefined) return callback(null, resolved);
+			return this._resolveContextTsh(cache, callback);
+		}
+		this.contextTshQueue.add(path, (err, _entry) => {
+			if (err) return callback(err);
+			const entry = /** @type {ContextTimestampAndHash} */ (_entry);
+			const resolved = getResolvedTimestamp(entry);
+			if (resolved !== undefined) return callback(null, resolved);
+			this._resolveContextTsh(entry, callback);
+		});
+	}
+
+	/**
+	 * @private
+	 * @param {string} path context path
+	 * @param {(err?: WebpackError | null, contextTimestampAndHash?: ContextTimestampAndHash | null) => void} callback callback function
+	 * @returns {void}
+	 */
+	_getUnresolvedContextTsh(path, callback) {
+		const cache = this._contextTshs.get(path);
+		if (cache !== undefined) return callback(null, cache);
+		this.contextTshQueue.add(path, callback);
+	}
+
+	_createBuildDependenciesResolvers() {
+		const resolveContext = createResolver({
+			resolveToContext: true,
+			exportsFields: [],
+			fileSystem: this.fs
+		});
+		const resolveCjs = createResolver({
+			extensions: [".js", ".json", ".node"],
+			conditionNames: ["require", "node"],
+			exportsFields: ["exports"],
+			fileSystem: this.fs
+		});
+		const resolveCjsAsChild = createResolver({
+			extensions: [".js", ".json", ".node"],
+			conditionNames: ["require", "node"],
+			exportsFields: [],
+			fileSystem: this.fs
+		});
+		const resolveEsm = createResolver({
+			extensions: [".js", ".json", ".node"],
+			fullySpecified: true,
+			conditionNames: ["import", "node"],
+			exportsFields: ["exports"],
+			fileSystem: this.fs
+		});
+		return { resolveContext, resolveEsm, resolveCjs, resolveCjsAsChild };
+	}
+
+	/**
+	 * @param {string} context context directory
+	 * @param {Iterable} deps dependencies
+	 * @param {(err?: Error | null, resolveBuildDependenciesResult?: ResolveBuildDependenciesResult) => void} callback callback function
+	 * @returns {void}
+	 */
+	resolveBuildDependencies(context, deps, callback) {
+		const { resolveContext, resolveEsm, resolveCjs, resolveCjsAsChild } =
+			this._createBuildDependenciesResolvers();
+
+		/** @type {Files} */
+		const files = new Set();
+		/** @type {Symlinks} */
+		const fileSymlinks = new Set();
+		/** @type {Directories} */
+		const directories = new Set();
+		/** @type {Symlinks} */
+		const directorySymlinks = new Set();
+		/** @type {Missing} */
+		const missing = new Set();
+		/** @type {ResolveDependencies["files"]} */
+		const resolveFiles = new Set();
+		/** @type {ResolveDependencies["directories"]} */
+		const resolveDirectories = new Set();
+		/** @type {ResolveDependencies["missing"]} */
+		const resolveMissing = new Set();
+		/** @type {ResolveResults} */
+		const resolveResults = new Map();
+		/** @type {Set} */
+		const invalidResolveResults = new Set();
+		const resolverContext = {
+			fileDependencies: resolveFiles,
+			contextDependencies: resolveDirectories,
+			missingDependencies: resolveMissing
+		};
+		/**
+		 * @param {undefined | boolean | string} expected expected result
+		 * @returns {string} expected result
+		 */
+		const expectedToString = expected =>
+			expected ? ` (expected ${expected})` : "";
+		/** @typedef {{ type: JobType, context: string | undefined, path: string, issuer: Job | undefined, expected: undefined | boolean | string }} Job */
+
+		/**
+		 * @param {Job} job job
+		 * @returns {`resolve commonjs file ${string}${string}`|`resolve esm file ${string}${string}`|`resolve esm ${string}${string}`|`resolve directory ${string}`|`file ${string}`|`unknown ${string} ${string}`|`resolve commonjs ${string}${string}`|`directory ${string}`|`file dependencies ${string}`|`directory dependencies ${string}`} result
+		 */
+		const jobToString = job => {
+			switch (job.type) {
+				case RBDT_RESOLVE_CJS:
+					return `resolve commonjs ${job.path}${expectedToString(
+						job.expected
+					)}`;
+				case RBDT_RESOLVE_ESM:
+					return `resolve esm ${job.path}${expectedToString(job.expected)}`;
+				case RBDT_RESOLVE_DIRECTORY:
+					return `resolve directory ${job.path}`;
+				case RBDT_RESOLVE_CJS_FILE:
+					return `resolve commonjs file ${job.path}${expectedToString(
+						job.expected
+					)}`;
+				case RBDT_RESOLVE_ESM_FILE:
+					return `resolve esm file ${job.path}${expectedToString(
+						job.expected
+					)}`;
+				case RBDT_DIRECTORY:
+					return `directory ${job.path}`;
+				case RBDT_FILE:
+					return `file ${job.path}`;
+				case RBDT_DIRECTORY_DEPENDENCIES:
+					return `directory dependencies ${job.path}`;
+				case RBDT_FILE_DEPENDENCIES:
+					return `file dependencies ${job.path}`;
+			}
+			return `unknown ${job.type} ${job.path}`;
+		};
+		/**
+		 * @param {Job} job job
+		 * @returns {string} string value
+		 */
+		const pathToString = job => {
+			let result = ` at ${jobToString(job)}`;
+			/** @type {Job | undefined} */
+			(job) = job.issuer;
+			while (job !== undefined) {
+				result += `\n at ${jobToString(job)}`;
+				job = /** @type {Job} */ (job.issuer);
+			}
+			return result;
+		};
+		const logger = /** @type {Logger} */ (this.logger);
+		processAsyncTree(
+			Array.from(
+				deps,
+				dep =>
+					/** @type {Job} */ ({
+						type: RBDT_RESOLVE_CJS,
+						context,
+						path: dep,
+						expected: undefined,
+						issuer: undefined
+					})
+			),
+			20,
+			(job, push, callback) => {
+				const { type, context, path, expected } = job;
+				/**
+				 * @param {string} path path
+				 * @returns {void}
+				 */
+				const resolveDirectory = path => {
+					const key = `d\n${context}\n${path}`;
+					if (resolveResults.has(key)) {
+						return callback();
+					}
+					resolveResults.set(key, undefined);
+					resolveContext(
+						/** @type {string} */ (context),
+						path,
+						resolverContext,
+						(err, _, result) => {
+							if (err) {
+								if (expected === false) {
+									resolveResults.set(key, false);
+									return callback();
+								}
+								invalidResolveResults.add(key);
+								err.message += `\nwhile resolving '${path}' in ${context} to a directory`;
+								return callback(err);
+							}
+							const resultPath = /** @type {ResolveRequest} */ (result).path;
+							resolveResults.set(key, resultPath);
+							push({
+								type: RBDT_DIRECTORY,
+								context: undefined,
+								path: /** @type {string} */ (resultPath),
+								expected: undefined,
+								issuer: job
+							});
+							callback();
+						}
+					);
+				};
+				/**
+				 * @param {string} path path
+				 * @param {("f" | "c" | "e")=} symbol symbol
+				 * @param {(ResolveFunctionAsync)=} resolve resolve fn
+				 * @returns {void}
+				 */
+				const resolveFile = (path, symbol, resolve) => {
+					const key = `${symbol}\n${context}\n${path}`;
+					if (resolveResults.has(key)) {
+						return callback();
+					}
+					resolveResults.set(key, undefined);
+					/** @type {ResolveFunctionAsync} */
+					(resolve)(
+						/** @type {string} */ (context),
+						path,
+						resolverContext,
+						(err, _, result) => {
+							if (typeof expected === "string") {
+								if (!err && result && result.path === expected) {
+									resolveResults.set(key, result.path);
+								} else {
+									invalidResolveResults.add(key);
+									logger.warn(
+										`Resolving '${path}' in ${context} for build dependencies doesn't lead to expected result '${expected}', but to '${
+											err || (result && result.path)
+										}' instead. Resolving dependencies are ignored for this path.\n${pathToString(
+											job
+										)}`
+									);
+								}
+							} else {
+								if (err) {
+									if (expected === false) {
+										resolveResults.set(key, false);
+										return callback();
+									}
+									invalidResolveResults.add(key);
+									err.message += `\nwhile resolving '${path}' in ${context} as file\n${pathToString(
+										job
+									)}`;
+									return callback(err);
+								}
+								const resultPath = /** @type {ResolveRequest} */ (result).path;
+								resolveResults.set(key, resultPath);
+								push({
+									type: RBDT_FILE,
+									context: undefined,
+									path: /** @type {string} */ (resultPath),
+									expected: undefined,
+									issuer: job
+								});
+							}
+							callback();
+						}
+					);
+				};
+				switch (type) {
+					case RBDT_RESOLVE_CJS: {
+						const isDirectory = /[\\/]$/.test(path);
+						if (isDirectory) {
+							resolveDirectory(path.slice(0, -1));
+						} else {
+							resolveFile(path, "f", resolveCjs);
+						}
+						break;
+					}
+					case RBDT_RESOLVE_ESM: {
+						const isDirectory = /[\\/]$/.test(path);
+						if (isDirectory) {
+							resolveDirectory(path.slice(0, -1));
+						} else {
+							resolveFile(path);
+						}
+						break;
+					}
+					case RBDT_RESOLVE_DIRECTORY: {
+						resolveDirectory(path);
+						break;
+					}
+					case RBDT_RESOLVE_CJS_FILE: {
+						resolveFile(path, "f", resolveCjs);
+						break;
+					}
+					case RBDT_RESOLVE_CJS_FILE_AS_CHILD: {
+						resolveFile(path, "c", resolveCjsAsChild);
+						break;
+					}
+					case RBDT_RESOLVE_ESM_FILE: {
+						resolveFile(path, "e", resolveEsm);
+						break;
+					}
+					case RBDT_FILE: {
+						if (files.has(path)) {
+							callback();
+							break;
+						}
+						files.add(path);
+						/** @type {NonNullable} */
+						(this.fs.realpath)(path, (err, _realPath) => {
+							if (err) return callback(err);
+							const realPath = /** @type {string} */ (_realPath);
+							if (realPath !== path) {
+								fileSymlinks.add(path);
+								resolveFiles.add(path);
+								if (files.has(realPath)) return callback();
+								files.add(realPath);
+							}
+							push({
+								type: RBDT_FILE_DEPENDENCIES,
+								context: undefined,
+								path: realPath,
+								expected: undefined,
+								issuer: job
+							});
+							callback();
+						});
+						break;
+					}
+					case RBDT_DIRECTORY: {
+						if (directories.has(path)) {
+							callback();
+							break;
+						}
+						directories.add(path);
+						/** @type {NonNullable} */
+						(this.fs.realpath)(path, (err, _realPath) => {
+							if (err) return callback(err);
+							const realPath = /** @type {string} */ (_realPath);
+							if (realPath !== path) {
+								directorySymlinks.add(path);
+								resolveFiles.add(path);
+								if (directories.has(realPath)) return callback();
+								directories.add(realPath);
+							}
+							push({
+								type: RBDT_DIRECTORY_DEPENDENCIES,
+								context: undefined,
+								path: realPath,
+								expected: undefined,
+								issuer: job
+							});
+							callback();
+						});
+						break;
+					}
+					case RBDT_FILE_DEPENDENCIES: {
+						// Check for known files without dependencies
+						if (/\.json5?$|\.yarn-integrity$|yarn\.lock$|\.ya?ml/.test(path)) {
+							process.nextTick(callback);
+							break;
+						}
+						// Check commonjs cache for the module
+						/** @type {NodeModule | undefined} */
+						const module = require.cache[path];
+						if (module && Array.isArray(module.children)) {
+							children: for (const child of module.children) {
+								const childPath = child.filename;
+								if (childPath) {
+									push({
+										type: RBDT_FILE,
+										context: undefined,
+										path: childPath,
+										expected: undefined,
+										issuer: job
+									});
+									const context = dirname(this.fs, path);
+									for (const modulePath of module.paths) {
+										if (childPath.startsWith(modulePath)) {
+											const subPath = childPath.slice(modulePath.length + 1);
+											const packageMatch = /^(@[^\\/]+[\\/])[^\\/]+/.exec(
+												subPath
+											);
+											if (packageMatch) {
+												push({
+													type: RBDT_FILE,
+													context: undefined,
+													path: `${
+														modulePath +
+														childPath[modulePath.length] +
+														packageMatch[0] +
+														childPath[modulePath.length]
+													}package.json`,
+													expected: false,
+													issuer: job
+												});
+											}
+											let request = subPath.replace(/\\/g, "/");
+											if (request.endsWith(".js"))
+												request = request.slice(0, -3);
+											push({
+												type: RBDT_RESOLVE_CJS_FILE_AS_CHILD,
+												context,
+												path: request,
+												expected: child.filename,
+												issuer: job
+											});
+											continue children;
+										}
+									}
+									let request = relative(this.fs, context, childPath);
+									if (request.endsWith(".js")) request = request.slice(0, -3);
+									request = request.replace(/\\/g, "/");
+									if (!request.startsWith("../") && !isAbsolute(request)) {
+										request = `./${request}`;
+									}
+									push({
+										type: RBDT_RESOLVE_CJS_FILE,
+										context,
+										path: request,
+										expected: child.filename,
+										issuer: job
+									});
+								}
+							}
+						} else if (supportsEsm && /\.m?js$/.test(path)) {
+							if (!this._warnAboutExperimentalEsmTracking) {
+								logger.log(
+									"Node.js doesn't offer a (nice) way to introspect the ESM dependency graph yet.\n" +
+										"Until a full solution is available webpack uses an experimental ESM tracking based on parsing.\n" +
+										"As best effort webpack parses the ESM files to guess dependencies. But this can lead to expensive and incorrect tracking."
+								);
+								this._warnAboutExperimentalEsmTracking = true;
+							}
+							const lexer = require("es-module-lexer");
+							lexer.init.then(() => {
+								this.fs.readFile(path, (err, content) => {
+									if (err) return callback(err);
+									try {
+										const context = dirname(this.fs, path);
+										const source = /** @type {Buffer} */ (content).toString();
+										const [imports] = lexer.parse(source);
+										for (const imp of imports) {
+											try {
+												let dependency;
+												if (imp.d === -1) {
+													// import ... from "..."
+													dependency = parseString(
+														source.substring(imp.s - 1, imp.e + 1)
+													);
+												} else if (imp.d > -1) {
+													// import()
+													const expr = source.substring(imp.s, imp.e).trim();
+													dependency = parseString(expr);
+												} else {
+													// e.g. import.meta
+													continue;
+												}
+
+												// we should not track Node.js build dependencies
+												if (dependency.startsWith("node:")) continue;
+												if (builtinModules.has(dependency)) continue;
+
+												push({
+													type: RBDT_RESOLVE_ESM_FILE,
+													context,
+													path: dependency,
+													expected: imp.d > -1 ? false : undefined,
+													issuer: job
+												});
+											} catch (err1) {
+												logger.warn(
+													`Parsing of ${path} for build dependencies failed at 'import(${source.substring(
+														imp.s,
+														imp.e
+													)})'.\n` +
+														"Build dependencies behind this expression are ignored and might cause incorrect cache invalidation."
+												);
+												logger.debug(pathToString(job));
+												logger.debug(/** @type {Error} */ (err1).stack);
+											}
+										}
+									} catch (err2) {
+										logger.warn(
+											`Parsing of ${path} for build dependencies failed and all dependencies of this file are ignored, which might cause incorrect cache invalidation..`
+										);
+										logger.debug(pathToString(job));
+										logger.debug(/** @type {Error} */ (err2).stack);
+									}
+									process.nextTick(callback);
+								});
+							}, callback);
+							break;
+						} else {
+							logger.log(
+								`Assuming ${path} has no dependencies as we were unable to assign it to any module system.`
+							);
+							logger.debug(pathToString(job));
+						}
+						process.nextTick(callback);
+						break;
+					}
+					case RBDT_DIRECTORY_DEPENDENCIES: {
+						const match =
+							/(^.+[\\/]node_modules[\\/](?:@[^\\/]+[\\/])?[^\\/]+)/.exec(path);
+						const packagePath = match ? match[1] : path;
+						const packageJson = join(this.fs, packagePath, "package.json");
+						this.fs.readFile(packageJson, (err, content) => {
+							if (err) {
+								if (err.code === "ENOENT") {
+									resolveMissing.add(packageJson);
+									const parent = dirname(this.fs, packagePath);
+									if (parent !== packagePath) {
+										push({
+											type: RBDT_DIRECTORY_DEPENDENCIES,
+											context: undefined,
+											path: parent,
+											expected: undefined,
+											issuer: job
+										});
+									}
+									callback();
+									return;
+								}
+								return callback(err);
+							}
+							resolveFiles.add(packageJson);
+							let packageData;
+							try {
+								packageData = JSON.parse(
+									/** @type {Buffer} */ (content).toString("utf-8")
+								);
+							} catch (parseErr) {
+								return callback(/** @type {Error} */ (parseErr));
+							}
+							const depsObject = packageData.dependencies;
+							const optionalDepsObject = packageData.optionalDependencies;
+							const allDeps = new Set();
+							const optionalDeps = new Set();
+							if (typeof depsObject === "object" && depsObject) {
+								for (const dep of Object.keys(depsObject)) {
+									allDeps.add(dep);
+								}
+							}
+							if (
+								typeof optionalDepsObject === "object" &&
+								optionalDepsObject
+							) {
+								for (const dep of Object.keys(optionalDepsObject)) {
+									allDeps.add(dep);
+									optionalDeps.add(dep);
+								}
+							}
+							for (const dep of allDeps) {
+								push({
+									type: RBDT_RESOLVE_DIRECTORY,
+									context: packagePath,
+									path: dep,
+									expected: !optionalDeps.has(dep),
+									issuer: job
+								});
+							}
+							callback();
+						});
+						break;
+					}
+				}
+			},
+			err => {
+				if (err) return callback(err);
+				for (const l of fileSymlinks) files.delete(l);
+				for (const l of directorySymlinks) directories.delete(l);
+				for (const k of invalidResolveResults) resolveResults.delete(k);
+				callback(null, {
+					files,
+					directories,
+					missing,
+					resolveResults,
+					resolveDependencies: {
+						files: resolveFiles,
+						directories: resolveDirectories,
+						missing: resolveMissing
+					}
+				});
+			}
+		);
+	}
+
+	/**
+	 * @param {ResolveResults} resolveResults results from resolving
+	 * @param {(err?: Error | null, result?: boolean) => void} callback callback with true when resolveResults resolve the same way
+	 * @returns {void}
+	 */
+	checkResolveResultsValid(resolveResults, callback) {
+		const { resolveCjs, resolveCjsAsChild, resolveEsm, resolveContext } =
+			this._createBuildDependenciesResolvers();
+		asyncLib.eachLimit(
+			resolveResults,
+			20,
+			([key, expectedResult], callback) => {
+				const [type, context, path] = key.split("\n");
+				switch (type) {
+					case "d":
+						resolveContext(context, path, {}, (err, _, result) => {
+							if (expectedResult === false)
+								return callback(err ? undefined : INVALID);
+							if (err) return callback(err);
+							const resultPath = /** @type {ResolveRequest} */ (result).path;
+							if (resultPath !== expectedResult) return callback(INVALID);
+							callback();
+						});
+						break;
+					case "f":
+						resolveCjs(context, path, {}, (err, _, result) => {
+							if (expectedResult === false)
+								return callback(err ? undefined : INVALID);
+							if (err) return callback(err);
+							const resultPath = /** @type {ResolveRequest} */ (result).path;
+							if (resultPath !== expectedResult) return callback(INVALID);
+							callback();
+						});
+						break;
+					case "c":
+						resolveCjsAsChild(context, path, {}, (err, _, result) => {
+							if (expectedResult === false)
+								return callback(err ? undefined : INVALID);
+							if (err) return callback(err);
+							const resultPath = /** @type {ResolveRequest} */ (result).path;
+							if (resultPath !== expectedResult) return callback(INVALID);
+							callback();
+						});
+						break;
+					case "e":
+						resolveEsm(context, path, {}, (err, _, result) => {
+							if (expectedResult === false)
+								return callback(err ? undefined : INVALID);
+							if (err) return callback(err);
+							const resultPath = /** @type {ResolveRequest} */ (result).path;
+							if (resultPath !== expectedResult) return callback(INVALID);
+							callback();
+						});
+						break;
+					default:
+						callback(new Error("Unexpected type in resolve result key"));
+						break;
+				}
+			},
+			/**
+			 * @param {Error | typeof INVALID=} err error or invalid flag
+			 * @returns {void}
+			 */
+			err => {
+				if (err === INVALID) {
+					return callback(null, false);
+				}
+				if (err) {
+					return callback(err);
+				}
+				return callback(null, true);
+			}
+		);
+	}
+
+	/**
+	 * @param {number | null | undefined} startTime when processing the files has started
+	 * @param {Iterable | null} files all files
+	 * @param {Iterable | null} directories all directories
+	 * @param {Iterable | null} missing all missing files or directories
+	 * @param {SnapshotOptions | null | undefined} options options object (for future extensions)
+	 * @param {(err: WebpackError | null, snapshot: Snapshot | null) => void} callback callback function
+	 * @returns {void}
+	 */
+	createSnapshot(startTime, files, directories, missing, options, callback) {
+		/** @type {FileTimestamps} */
+		const fileTimestamps = new Map();
+		/** @type {FileHashes} */
+		const fileHashes = new Map();
+		/** @type {FileTshs} */
+		const fileTshs = new Map();
+		/** @type {ContextTimestamps} */
+		const contextTimestamps = new Map();
+		/** @type {ContextHashes} */
+		const contextHashes = new Map();
+		/** @type {ContextTshs} */
+		const contextTshs = new Map();
+		/** @type {MissingExistence} */
+		const missingExistence = new Map();
+		/** @type {ManagedItemInfo} */
+		const managedItemInfo = new Map();
+		/** @type {ManagedFiles} */
+		const managedFiles = new Set();
+		/** @type {ManagedContexts} */
+		const managedContexts = new Set();
+		/** @type {ManagedMissing} */
+		const managedMissing = new Set();
+		/** @type {Children} */
+		const children = new Set();
+
+		const snapshot = new Snapshot();
+		if (startTime) snapshot.setStartTime(startTime);
+
+		/** @type {Set} */
+		const managedItems = new Set();
+
+		/** 1 = timestamp, 2 = hash, 3 = timestamp + hash */
+		const mode = options && options.hash ? (options.timestamp ? 3 : 2) : 1;
+
+		let jobs = 1;
+		const jobDone = () => {
+			if (--jobs === 0) {
+				if (fileTimestamps.size !== 0) {
+					snapshot.setFileTimestamps(fileTimestamps);
+				}
+				if (fileHashes.size !== 0) {
+					snapshot.setFileHashes(fileHashes);
+				}
+				if (fileTshs.size !== 0) {
+					snapshot.setFileTshs(fileTshs);
+				}
+				if (contextTimestamps.size !== 0) {
+					snapshot.setContextTimestamps(contextTimestamps);
+				}
+				if (contextHashes.size !== 0) {
+					snapshot.setContextHashes(contextHashes);
+				}
+				if (contextTshs.size !== 0) {
+					snapshot.setContextTshs(contextTshs);
+				}
+				if (missingExistence.size !== 0) {
+					snapshot.setMissingExistence(missingExistence);
+				}
+				if (managedItemInfo.size !== 0) {
+					snapshot.setManagedItemInfo(managedItemInfo);
+				}
+				this._managedFilesOptimization.optimize(snapshot, managedFiles);
+				if (managedFiles.size !== 0) {
+					snapshot.setManagedFiles(managedFiles);
+				}
+				this._managedContextsOptimization.optimize(snapshot, managedContexts);
+				if (managedContexts.size !== 0) {
+					snapshot.setManagedContexts(managedContexts);
+				}
+				this._managedMissingOptimization.optimize(snapshot, managedMissing);
+				if (managedMissing.size !== 0) {
+					snapshot.setManagedMissing(managedMissing);
+				}
+				if (children.size !== 0) {
+					snapshot.setChildren(children);
+				}
+				this._snapshotCache.set(snapshot, true);
+				this._statCreatedSnapshots++;
+
+				callback(null, snapshot);
+			}
+		};
+		const jobError = () => {
+			if (jobs > 0) {
+				// large negative number instead of NaN or something else to keep jobs to stay a SMI (v8)
+				jobs = -100000000;
+				callback(null, null);
+			}
+		};
+		/**
+		 * @param {string} path path
+		 * @param {ManagedFiles} managedSet managed set
+		 * @returns {boolean} true when managed
+		 */
+		const checkManaged = (path, managedSet) => {
+			for (const unmanagedPath of this.unmanagedPathsRegExps) {
+				if (unmanagedPath.test(path)) return false;
+			}
+			for (const unmanagedPath of this.unmanagedPathsWithSlash) {
+				if (path.startsWith(unmanagedPath)) return false;
+			}
+			for (const immutablePath of this.immutablePathsRegExps) {
+				if (immutablePath.test(path)) {
+					managedSet.add(path);
+					return true;
+				}
+			}
+			for (const immutablePath of this.immutablePathsWithSlash) {
+				if (path.startsWith(immutablePath)) {
+					managedSet.add(path);
+					return true;
+				}
+			}
+			for (const managedPath of this.managedPathsRegExps) {
+				const match = managedPath.exec(path);
+				if (match) {
+					const managedItem = getManagedItem(match[1], path);
+					if (managedItem) {
+						managedItems.add(managedItem);
+						managedSet.add(path);
+						return true;
+					}
+				}
+			}
+			for (const managedPath of this.managedPathsWithSlash) {
+				if (path.startsWith(managedPath)) {
+					const managedItem = getManagedItem(managedPath, path);
+					if (managedItem) {
+						managedItems.add(managedItem);
+						managedSet.add(path);
+						return true;
+					}
+				}
+			}
+			return false;
+		};
+		/**
+		 * @param {Iterable} items items
+		 * @param {Set} managedSet managed set
+		 * @returns {Set} result
+		 */
+		const captureNonManaged = (items, managedSet) => {
+			/** @type {Set} */
+			const capturedItems = new Set();
+			for (const path of items) {
+				if (!checkManaged(path, managedSet)) capturedItems.add(path);
+			}
+			return capturedItems;
+		};
+		/**
+		 * @param {ManagedFiles} capturedFiles captured files
+		 */
+		const processCapturedFiles = capturedFiles => {
+			switch (mode) {
+				case 3:
+					this._fileTshsOptimization.optimize(snapshot, capturedFiles);
+					for (const path of capturedFiles) {
+						const cache = this._fileTshs.get(path);
+						if (cache !== undefined) {
+							fileTshs.set(path, cache);
+						} else {
+							jobs++;
+							this._getFileTimestampAndHash(path, (err, entry) => {
+								if (err) {
+									if (this.logger) {
+										this.logger.debug(
+											`Error snapshotting file timestamp hash combination of ${path}: ${err.stack}`
+										);
+									}
+									jobError();
+								} else {
+									fileTshs.set(path, /** @type {TimestampAndHash} */ (entry));
+									jobDone();
+								}
+							});
+						}
+					}
+					break;
+				case 2:
+					this._fileHashesOptimization.optimize(snapshot, capturedFiles);
+					for (const path of capturedFiles) {
+						const cache = this._fileHashes.get(path);
+						if (cache !== undefined) {
+							fileHashes.set(path, cache);
+						} else {
+							jobs++;
+							this.fileHashQueue.add(path, (err, entry) => {
+								if (err) {
+									if (this.logger) {
+										this.logger.debug(
+											`Error snapshotting file hash of ${path}: ${err.stack}`
+										);
+									}
+									jobError();
+								} else {
+									fileHashes.set(path, /** @type {string} */ (entry));
+									jobDone();
+								}
+							});
+						}
+					}
+					break;
+				case 1:
+					this._fileTimestampsOptimization.optimize(snapshot, capturedFiles);
+					for (const path of capturedFiles) {
+						const cache = this._fileTimestamps.get(path);
+						if (cache !== undefined) {
+							if (cache !== "ignore") {
+								fileTimestamps.set(path, cache);
+							}
+						} else {
+							jobs++;
+							this.fileTimestampQueue.add(path, (err, entry) => {
+								if (err) {
+									if (this.logger) {
+										this.logger.debug(
+											`Error snapshotting file timestamp of ${path}: ${err.stack}`
+										);
+									}
+									jobError();
+								} else {
+									fileTimestamps.set(
+										path,
+										/** @type {FileSystemInfoEntry} */
+										(entry)
+									);
+									jobDone();
+								}
+							});
+						}
+					}
+					break;
+			}
+		};
+		if (files) {
+			processCapturedFiles(captureNonManaged(files, managedFiles));
+		}
+		/**
+		 * @param {ManagedContexts} capturedDirectories captured directories
+		 */
+		const processCapturedDirectories = capturedDirectories => {
+			switch (mode) {
+				case 3:
+					this._contextTshsOptimization.optimize(snapshot, capturedDirectories);
+					for (const path of capturedDirectories) {
+						const cache = this._contextTshs.get(path);
+						/** @type {ResolvedContextTimestampAndHash | null | undefined} */
+						let resolved;
+						if (
+							cache !== undefined &&
+							(resolved = getResolvedTimestamp(cache)) !== undefined
+						) {
+							contextTshs.set(path, resolved);
+						} else {
+							jobs++;
+							/**
+							 * @param {(WebpackError | null)=} err error
+							 * @param {(ResolvedContextTimestampAndHash | null)=} entry entry
+							 * @returns {void}
+							 */
+							const callback = (err, entry) => {
+								if (err) {
+									if (this.logger) {
+										this.logger.debug(
+											`Error snapshotting context timestamp hash combination of ${path}: ${err.stack}`
+										);
+									}
+									jobError();
+								} else {
+									contextTshs.set(
+										path,
+										/** @type {ResolvedContextTimestampAndHash | null} */
+										(entry)
+									);
+									jobDone();
+								}
+							};
+							if (cache !== undefined) {
+								this._resolveContextTsh(cache, callback);
+							} else {
+								this.getContextTsh(path, callback);
+							}
+						}
+					}
+					break;
+				case 2:
+					this._contextHashesOptimization.optimize(
+						snapshot,
+						capturedDirectories
+					);
+					for (const path of capturedDirectories) {
+						const cache = this._contextHashes.get(path);
+						let resolved;
+						if (
+							cache !== undefined &&
+							(resolved = getResolvedHash(cache)) !== undefined
+						) {
+							contextHashes.set(path, resolved);
+						} else {
+							jobs++;
+							/**
+							 * @param {(WebpackError | null)=} err err
+							 * @param {string=} entry entry
+							 */
+							const callback = (err, entry) => {
+								if (err) {
+									if (this.logger) {
+										this.logger.debug(
+											`Error snapshotting context hash of ${path}: ${err.stack}`
+										);
+									}
+									jobError();
+								} else {
+									contextHashes.set(path, /** @type {string} */ (entry));
+									jobDone();
+								}
+							};
+							if (cache !== undefined) {
+								this._resolveContextHash(cache, callback);
+							} else {
+								this.getContextHash(path, callback);
+							}
+						}
+					}
+					break;
+				case 1:
+					this._contextTimestampsOptimization.optimize(
+						snapshot,
+						capturedDirectories
+					);
+					for (const path of capturedDirectories) {
+						const cache = this._contextTimestamps.get(path);
+						if (cache === "ignore") continue;
+						let resolved;
+						if (
+							cache !== undefined &&
+							(resolved = getResolvedTimestamp(cache)) !== undefined
+						) {
+							contextTimestamps.set(path, resolved);
+						} else {
+							jobs++;
+							/**
+							 * @param {(Error | null)=} err error
+							 * @param {FileTimestamp=} entry entry
+							 * @returns {void}
+							 */
+							const callback = (err, entry) => {
+								if (err) {
+									if (this.logger) {
+										this.logger.debug(
+											`Error snapshotting context timestamp of ${path}: ${err.stack}`
+										);
+									}
+									jobError();
+								} else {
+									contextTimestamps.set(
+										path,
+										/** @type {FileSystemInfoEntry | null} */
+										(entry)
+									);
+									jobDone();
+								}
+							};
+							if (cache !== undefined) {
+								this._resolveContextTimestamp(
+									/** @type {ContextFileSystemInfoEntry} */
+									(cache),
+									callback
+								);
+							} else {
+								this.getContextTimestamp(path, callback);
+							}
+						}
+					}
+					break;
+			}
+		};
+		if (directories) {
+			processCapturedDirectories(
+				captureNonManaged(directories, managedContexts)
+			);
+		}
+		/**
+		 * @param {ManagedMissing} capturedMissing captured missing
+		 */
+		const processCapturedMissing = capturedMissing => {
+			this._missingExistenceOptimization.optimize(snapshot, capturedMissing);
+			for (const path of capturedMissing) {
+				const cache = this._fileTimestamps.get(path);
+				if (cache !== undefined) {
+					if (cache !== "ignore") {
+						missingExistence.set(path, Boolean(cache));
+					}
+				} else {
+					jobs++;
+					this.fileTimestampQueue.add(path, (err, entry) => {
+						if (err) {
+							if (this.logger) {
+								this.logger.debug(
+									`Error snapshotting missing timestamp of ${path}: ${err.stack}`
+								);
+							}
+							jobError();
+						} else {
+							missingExistence.set(path, Boolean(entry));
+							jobDone();
+						}
+					});
+				}
+			}
+		};
+		if (missing) {
+			processCapturedMissing(captureNonManaged(missing, managedMissing));
+		}
+		this._managedItemInfoOptimization.optimize(snapshot, managedItems);
+		for (const path of managedItems) {
+			const cache = this._managedItems.get(path);
+			if (cache !== undefined) {
+				if (!cache.startsWith("*")) {
+					managedFiles.add(join(this.fs, path, "package.json"));
+				} else if (cache === "*nested") {
+					managedMissing.add(join(this.fs, path, "package.json"));
+				}
+				managedItemInfo.set(path, cache);
+			} else {
+				jobs++;
+				this.managedItemQueue.add(path, (err, entry) => {
+					if (err) {
+						if (this.logger) {
+							this.logger.debug(
+								`Error snapshotting managed item ${path}: ${err.stack}`
+							);
+						}
+						jobError();
+					} else if (entry) {
+						if (!entry.startsWith("*")) {
+							managedFiles.add(join(this.fs, path, "package.json"));
+						} else if (cache === "*nested") {
+							managedMissing.add(join(this.fs, path, "package.json"));
+						}
+						managedItemInfo.set(path, entry);
+						jobDone();
+					} else {
+						// Fallback to normal snapshotting
+						/**
+						 * @param {Set} set set
+						 * @param {(set: Set) => void} fn fn
+						 */
+						const process = (set, fn) => {
+							if (set.size === 0) return;
+							const captured = new Set();
+							for (const file of set) {
+								if (file.startsWith(path)) captured.add(file);
+							}
+							if (captured.size > 0) fn(captured);
+						};
+						process(managedFiles, processCapturedFiles);
+						process(managedContexts, processCapturedDirectories);
+						process(managedMissing, processCapturedMissing);
+						jobDone();
+					}
+				});
+			}
+		}
+		jobDone();
+	}
+
+	/**
+	 * @param {Snapshot} snapshot1 a snapshot
+	 * @param {Snapshot} snapshot2 a snapshot
+	 * @returns {Snapshot} merged snapshot
+	 */
+	mergeSnapshots(snapshot1, snapshot2) {
+		const snapshot = new Snapshot();
+		if (snapshot1.hasStartTime() && snapshot2.hasStartTime()) {
+			snapshot.setStartTime(
+				Math.min(
+					/** @type {NonNullable} */
+					(snapshot1.startTime),
+					/** @type {NonNullable} */
+					(snapshot2.startTime)
+				)
+			);
+		} else if (snapshot2.hasStartTime()) {
+			snapshot.startTime = snapshot2.startTime;
+		} else if (snapshot1.hasStartTime()) {
+			snapshot.startTime = snapshot1.startTime;
+		}
+		if (snapshot1.hasFileTimestamps() || snapshot2.hasFileTimestamps()) {
+			snapshot.setFileTimestamps(
+				mergeMaps(snapshot1.fileTimestamps, snapshot2.fileTimestamps)
+			);
+		}
+		if (snapshot1.hasFileHashes() || snapshot2.hasFileHashes()) {
+			snapshot.setFileHashes(
+				mergeMaps(snapshot1.fileHashes, snapshot2.fileHashes)
+			);
+		}
+		if (snapshot1.hasFileTshs() || snapshot2.hasFileTshs()) {
+			snapshot.setFileTshs(mergeMaps(snapshot1.fileTshs, snapshot2.fileTshs));
+		}
+		if (snapshot1.hasContextTimestamps() || snapshot2.hasContextTimestamps()) {
+			snapshot.setContextTimestamps(
+				mergeMaps(snapshot1.contextTimestamps, snapshot2.contextTimestamps)
+			);
+		}
+		if (snapshot1.hasContextHashes() || snapshot2.hasContextHashes()) {
+			snapshot.setContextHashes(
+				mergeMaps(snapshot1.contextHashes, snapshot2.contextHashes)
+			);
+		}
+		if (snapshot1.hasContextTshs() || snapshot2.hasContextTshs()) {
+			snapshot.setContextTshs(
+				mergeMaps(snapshot1.contextTshs, snapshot2.contextTshs)
+			);
+		}
+		if (snapshot1.hasMissingExistence() || snapshot2.hasMissingExistence()) {
+			snapshot.setMissingExistence(
+				mergeMaps(snapshot1.missingExistence, snapshot2.missingExistence)
+			);
+		}
+		if (snapshot1.hasManagedItemInfo() || snapshot2.hasManagedItemInfo()) {
+			snapshot.setManagedItemInfo(
+				mergeMaps(snapshot1.managedItemInfo, snapshot2.managedItemInfo)
+			);
+		}
+		if (snapshot1.hasManagedFiles() || snapshot2.hasManagedFiles()) {
+			snapshot.setManagedFiles(
+				mergeSets(snapshot1.managedFiles, snapshot2.managedFiles)
+			);
+		}
+		if (snapshot1.hasManagedContexts() || snapshot2.hasManagedContexts()) {
+			snapshot.setManagedContexts(
+				mergeSets(snapshot1.managedContexts, snapshot2.managedContexts)
+			);
+		}
+		if (snapshot1.hasManagedMissing() || snapshot2.hasManagedMissing()) {
+			snapshot.setManagedMissing(
+				mergeSets(snapshot1.managedMissing, snapshot2.managedMissing)
+			);
+		}
+		if (snapshot1.hasChildren() || snapshot2.hasChildren()) {
+			snapshot.setChildren(mergeSets(snapshot1.children, snapshot2.children));
+		}
+		if (
+			this._snapshotCache.get(snapshot1) === true &&
+			this._snapshotCache.get(snapshot2) === true
+		) {
+			this._snapshotCache.set(snapshot, true);
+		}
+		return snapshot;
+	}
+
+	/**
+	 * @param {Snapshot} snapshot the snapshot made
+	 * @param {CheckSnapshotValidCallback} callback callback function
+	 * @returns {void}
+	 */
+	checkSnapshotValid(snapshot, callback) {
+		const cachedResult = this._snapshotCache.get(snapshot);
+		if (cachedResult !== undefined) {
+			this._statTestedSnapshotsCached++;
+			if (typeof cachedResult === "boolean") {
+				callback(null, cachedResult);
+			} else {
+				cachedResult.push(callback);
+			}
+			return;
+		}
+		this._statTestedSnapshotsNotCached++;
+		this._checkSnapshotValidNoCache(snapshot, callback);
+	}
+
+	/**
+	 * @private
+	 * @param {Snapshot} snapshot the snapshot made
+	 * @param {CheckSnapshotValidCallback} callback callback function
+	 * @returns {void}
+	 */
+	_checkSnapshotValidNoCache(snapshot, callback) {
+		/** @type {number | undefined} */
+		let startTime;
+		if (snapshot.hasStartTime()) {
+			startTime = snapshot.startTime;
+		}
+		let jobs = 1;
+		const jobDone = () => {
+			if (--jobs === 0) {
+				this._snapshotCache.set(snapshot, true);
+				callback(null, true);
+			}
+		};
+		const invalid = () => {
+			if (jobs > 0) {
+				// large negative number instead of NaN or something else to keep jobs to stay a SMI (v8)
+				jobs = -100000000;
+				this._snapshotCache.set(snapshot, false);
+				callback(null, false);
+			}
+		};
+		/**
+		 * @param {string} path path
+		 * @param {WebpackError} err err
+		 */
+		const invalidWithError = (path, err) => {
+			if (this._remainingLogs > 0) {
+				this._log(path, "error occurred: %s", err);
+			}
+			invalid();
+		};
+		/**
+		 * @param {string} path file path
+		 * @param {string | null} current current hash
+		 * @param {string | null} snap snapshot hash
+		 * @returns {boolean} true, if ok
+		 */
+		const checkHash = (path, current, snap) => {
+			if (current !== snap) {
+				// If hash differ it's invalid
+				if (this._remainingLogs > 0) {
+					this._log(path, "hashes differ (%s != %s)", current, snap);
+				}
+				return false;
+			}
+			return true;
+		};
+		/**
+		 * @param {string} path file path
+		 * @param {boolean} current current entry
+		 * @param {boolean} snap entry from snapshot
+		 * @returns {boolean} true, if ok
+		 */
+		const checkExistence = (path, current, snap) => {
+			if (!current !== !snap) {
+				// If existence of item differs
+				// it's invalid
+				if (this._remainingLogs > 0) {
+					this._log(
+						path,
+						current ? "it didn't exist before" : "it does no longer exist"
+					);
+				}
+				return false;
+			}
+			return true;
+		};
+		/**
+		 * @param {string} path file path
+		 * @param {FileSystemInfoEntry | null} c current entry
+		 * @param {FileSystemInfoEntry | null} s entry from snapshot
+		 * @param {boolean} log log reason
+		 * @returns {boolean} true, if ok
+		 */
+		const checkFile = (path, c, s, log = true) => {
+			if (c === s) return true;
+			if (!checkExistence(path, Boolean(c), Boolean(s))) return false;
+			if (c) {
+				// For existing items only
+				if (typeof startTime === "number" && c.safeTime > startTime) {
+					// If a change happened after starting reading the item
+					// this may no longer be valid
+					if (log && this._remainingLogs > 0) {
+						this._log(
+							path,
+							"it may have changed (%d) after the start time of the snapshot (%d)",
+							c.safeTime,
+							startTime
+						);
+					}
+					return false;
+				}
+				const snap = /** @type {FileSystemInfoEntry} */ (s);
+				if (snap.timestamp !== undefined && c.timestamp !== snap.timestamp) {
+					// If we have a timestamp (it was a file or symlink) and it differs from current timestamp
+					// it's invalid
+					if (log && this._remainingLogs > 0) {
+						this._log(
+							path,
+							"timestamps differ (%d != %d)",
+							c.timestamp,
+							snap.timestamp
+						);
+					}
+					return false;
+				}
+			}
+			return true;
+		};
+		/**
+		 * @param {string} path file path
+		 * @param {ResolvedContextFileSystemInfoEntry | null} c current entry
+		 * @param {ResolvedContextFileSystemInfoEntry | null} s entry from snapshot
+		 * @param {boolean} log log reason
+		 * @returns {boolean} true, if ok
+		 */
+		const checkContext = (path, c, s, log = true) => {
+			if (c === s) return true;
+			if (!checkExistence(path, Boolean(c), Boolean(s))) return false;
+			if (c) {
+				// For existing items only
+				if (typeof startTime === "number" && c.safeTime > startTime) {
+					// If a change happened after starting reading the item
+					// this may no longer be valid
+					if (log && this._remainingLogs > 0) {
+						this._log(
+							path,
+							"it may have changed (%d) after the start time of the snapshot (%d)",
+							c.safeTime,
+							startTime
+						);
+					}
+					return false;
+				}
+				const snap = /** @type {ResolvedContextFileSystemInfoEntry} */ (s);
+				if (
+					snap.timestampHash !== undefined &&
+					c.timestampHash !== snap.timestampHash
+				) {
+					// If we have a timestampHash (it was a directory) and it differs from current timestampHash
+					// it's invalid
+					if (log && this._remainingLogs > 0) {
+						this._log(
+							path,
+							"timestamps hashes differ (%s != %s)",
+							c.timestampHash,
+							snap.timestampHash
+						);
+					}
+					return false;
+				}
+			}
+			return true;
+		};
+		if (snapshot.hasChildren()) {
+			/**
+			 * @param {(WebpackError | null)=} err err
+			 * @param {boolean=} result result
+			 * @returns {void}
+			 */
+			const childCallback = (err, result) => {
+				if (err || !result) return invalid();
+				jobDone();
+			};
+			for (const child of /** @type {Children} */ (snapshot.children)) {
+				const cache = this._snapshotCache.get(child);
+				if (cache !== undefined) {
+					this._statTestedChildrenCached++;
+					/* istanbul ignore else */
+					if (typeof cache === "boolean") {
+						if (cache === false) {
+							invalid();
+							return;
+						}
+					} else {
+						jobs++;
+						cache.push(childCallback);
+					}
+				} else {
+					this._statTestedChildrenNotCached++;
+					jobs++;
+					this._checkSnapshotValidNoCache(child, childCallback);
+				}
+			}
+		}
+		if (snapshot.hasFileTimestamps()) {
+			const fileTimestamps =
+				/** @type {FileTimestamps} */
+				(snapshot.fileTimestamps);
+			this._statTestedEntries += fileTimestamps.size;
+			for (const [path, ts] of fileTimestamps) {
+				const cache = this._fileTimestamps.get(path);
+				if (cache !== undefined) {
+					if (cache !== "ignore" && !checkFile(path, cache, ts)) {
+						invalid();
+						return;
+					}
+				} else {
+					jobs++;
+					this.fileTimestampQueue.add(path, (err, entry) => {
+						if (err) return invalidWithError(path, err);
+						if (
+							!checkFile(
+								path,
+								/** @type {FileSystemInfoEntry | null} */ (entry),
+								ts
+							)
+						) {
+							invalid();
+						} else {
+							jobDone();
+						}
+					});
+				}
+			}
+		}
+		/**
+		 * @param {string} path file path
+		 * @param {string | null} hash hash
+		 */
+		const processFileHashSnapshot = (path, hash) => {
+			const cache = this._fileHashes.get(path);
+			if (cache !== undefined) {
+				if (cache !== "ignore" && !checkHash(path, cache, hash)) {
+					invalid();
+				}
+			} else {
+				jobs++;
+				this.fileHashQueue.add(path, (err, entry) => {
+					if (err) return invalidWithError(path, err);
+					if (!checkHash(path, /** @type {string} */ (entry), hash)) {
+						invalid();
+					} else {
+						jobDone();
+					}
+				});
+			}
+		};
+		if (snapshot.hasFileHashes()) {
+			const fileHashes = /** @type {FileHashes} */ (snapshot.fileHashes);
+			this._statTestedEntries += fileHashes.size;
+			for (const [path, hash] of fileHashes) {
+				processFileHashSnapshot(path, hash);
+			}
+		}
+		if (snapshot.hasFileTshs()) {
+			const fileTshs = /** @type {FileTshs} */ (snapshot.fileTshs);
+			this._statTestedEntries += fileTshs.size;
+			for (const [path, tsh] of fileTshs) {
+				if (typeof tsh === "string") {
+					processFileHashSnapshot(path, tsh);
+				} else {
+					const cache = this._fileTimestamps.get(path);
+					if (cache !== undefined) {
+						if (cache === "ignore" || !checkFile(path, cache, tsh, false)) {
+							processFileHashSnapshot(path, tsh && tsh.hash);
+						}
+					} else {
+						jobs++;
+						this.fileTimestampQueue.add(path, (err, entry) => {
+							if (err) return invalidWithError(path, err);
+							if (
+								!checkFile(
+									path,
+									/** @type {FileSystemInfoEntry | null} */
+									(entry),
+									tsh,
+									false
+								)
+							) {
+								processFileHashSnapshot(path, tsh && tsh.hash);
+							}
+							jobDone();
+						});
+					}
+				}
+			}
+		}
+		if (snapshot.hasContextTimestamps()) {
+			const contextTimestamps =
+				/** @type {ContextTimestamps} */
+				(snapshot.contextTimestamps);
+			this._statTestedEntries += contextTimestamps.size;
+			for (const [path, ts] of contextTimestamps) {
+				const cache = this._contextTimestamps.get(path);
+				if (cache === "ignore") continue;
+				let resolved;
+				if (
+					cache !== undefined &&
+					(resolved = getResolvedTimestamp(cache)) !== undefined
+				) {
+					if (!checkContext(path, resolved, ts)) {
+						invalid();
+						return;
+					}
+				} else {
+					jobs++;
+					/**
+					 * @param {(WebpackError | null)=} err error
+					 * @param {ResolvedContextTimestamp=} entry entry
+					 * @returns {void}
+					 */
+					const callback = (err, entry) => {
+						if (err) return invalidWithError(path, err);
+						if (
+							!checkContext(
+								path,
+								/** @type {ResolvedContextFileSystemInfoEntry | null} */
+								(entry),
+								ts
+							)
+						) {
+							invalid();
+						} else {
+							jobDone();
+						}
+					};
+					if (cache !== undefined) {
+						this._resolveContextTimestamp(
+							/** @type {ContextFileSystemInfoEntry} */
+							(cache),
+							callback
+						);
+					} else {
+						this.getContextTimestamp(path, callback);
+					}
+				}
+			}
+		}
+		/**
+		 * @param {string} path path
+		 * @param {string | null} hash hash
+		 */
+		const processContextHashSnapshot = (path, hash) => {
+			const cache = this._contextHashes.get(path);
+			let resolved;
+			if (
+				cache !== undefined &&
+				(resolved = getResolvedHash(cache)) !== undefined
+			) {
+				if (!checkHash(path, resolved, hash)) {
+					invalid();
+				}
+			} else {
+				jobs++;
+				/**
+				 * @param {(WebpackError | null)=} err err
+				 * @param {string=} entry entry
+				 * @returns {void}
+				 */
+				const callback = (err, entry) => {
+					if (err) return invalidWithError(path, err);
+					if (!checkHash(path, /** @type {string} */ (entry), hash)) {
+						invalid();
+					} else {
+						jobDone();
+					}
+				};
+				if (cache !== undefined) {
+					this._resolveContextHash(cache, callback);
+				} else {
+					this.getContextHash(path, callback);
+				}
+			}
+		};
+		if (snapshot.hasContextHashes()) {
+			const contextHashes =
+				/** @type {ContextHashes} */
+				(snapshot.contextHashes);
+			this._statTestedEntries += contextHashes.size;
+			for (const [path, hash] of contextHashes) {
+				processContextHashSnapshot(path, hash);
+			}
+		}
+		if (snapshot.hasContextTshs()) {
+			const contextTshs = /** @type {ContextTshs} */ (snapshot.contextTshs);
+			this._statTestedEntries += contextTshs.size;
+			for (const [path, tsh] of contextTshs) {
+				if (typeof tsh === "string") {
+					processContextHashSnapshot(path, tsh);
+				} else {
+					const cache = this._contextTimestamps.get(path);
+					if (cache === "ignore") continue;
+					let resolved;
+					if (
+						cache !== undefined &&
+						(resolved = getResolvedTimestamp(cache)) !== undefined
+					) {
+						if (
+							!checkContext(
+								path,
+								/** @type {ResolvedContextFileSystemInfoEntry | null} */
+								(resolved),
+								tsh,
+								false
+							)
+						) {
+							processContextHashSnapshot(path, tsh && tsh.hash);
+						}
+					} else {
+						jobs++;
+						/**
+						 * @param {(WebpackError | null)=} err error
+						 * @param {ResolvedContextTimestamp=} entry entry
+						 * @returns {void}
+						 */
+						const callback = (err, entry) => {
+							if (err) return invalidWithError(path, err);
+							if (
+								!checkContext(
+									path,
+									// TODO: test with `"ignore"`
+									/** @type {ResolvedContextFileSystemInfoEntry | null} */
+									(entry),
+									tsh,
+									false
+								)
+							) {
+								processContextHashSnapshot(path, tsh && tsh.hash);
+							}
+							jobDone();
+						};
+						if (cache !== undefined) {
+							this._resolveContextTimestamp(
+								/** @type {ContextFileSystemInfoEntry} */
+								(cache),
+								callback
+							);
+						} else {
+							this.getContextTimestamp(path, callback);
+						}
+					}
+				}
+			}
+		}
+		if (snapshot.hasMissingExistence()) {
+			const missingExistence =
+				/** @type {MissingExistence} */
+				(snapshot.missingExistence);
+			this._statTestedEntries += missingExistence.size;
+			for (const [path, existence] of missingExistence) {
+				const cache = this._fileTimestamps.get(path);
+				if (cache !== undefined) {
+					if (
+						cache !== "ignore" &&
+						!checkExistence(path, Boolean(cache), Boolean(existence))
+					) {
+						invalid();
+						return;
+					}
+				} else {
+					jobs++;
+					this.fileTimestampQueue.add(path, (err, entry) => {
+						if (err) return invalidWithError(path, err);
+						if (!checkExistence(path, Boolean(entry), Boolean(existence))) {
+							invalid();
+						} else {
+							jobDone();
+						}
+					});
+				}
+			}
+		}
+		if (snapshot.hasManagedItemInfo()) {
+			const managedItemInfo =
+				/** @type {ManagedItemInfo} */
+				(snapshot.managedItemInfo);
+			this._statTestedEntries += managedItemInfo.size;
+			for (const [path, info] of managedItemInfo) {
+				const cache = this._managedItems.get(path);
+				if (cache !== undefined) {
+					if (!checkHash(path, cache, info)) {
+						invalid();
+						return;
+					}
+				} else {
+					jobs++;
+					this.managedItemQueue.add(path, (err, entry) => {
+						if (err) return invalidWithError(path, err);
+						if (!checkHash(path, /** @type {string} */ (entry), info)) {
+							invalid();
+						} else {
+							jobDone();
+						}
+					});
+				}
+			}
+		}
+		jobDone();
+
+		// if there was an async action
+		// try to join multiple concurrent request for this snapshot
+		if (jobs > 0) {
+			const callbacks = [callback];
+			callback = (err, result) => {
+				for (const callback of callbacks) callback(err, result);
+			};
+			this._snapshotCache.set(snapshot, callbacks);
+		}
+	}
+
+	/**
+	 * @private
+	 * @type {Processor}
+	 */
+	_readFileTimestamp(path, callback) {
+		this.fs.stat(path, (err, _stat) => {
+			if (err) {
+				if (err.code === "ENOENT") {
+					this._fileTimestamps.set(path, null);
+					this._cachedDeprecatedFileTimestamps = undefined;
+					return callback(null, null);
+				}
+				return callback(/** @type {WebpackError} */ (err));
+			}
+			const stat = /** @type {IStats} */ (_stat);
+			let ts;
+			if (stat.isDirectory()) {
+				ts = {
+					safeTime: 0,
+					timestamp: undefined
+				};
+			} else {
+				const mtime = Number(stat.mtime);
+
+				if (mtime) applyMtime(mtime);
+
+				ts = {
+					safeTime: mtime ? mtime + FS_ACCURACY : Infinity,
+					timestamp: mtime
+				};
+			}
+
+			this._fileTimestamps.set(path, ts);
+			this._cachedDeprecatedFileTimestamps = undefined;
+
+			callback(null, ts);
+		});
+	}
+
+	/**
+	 * @private
+	 * @type {Processor}
+	 */
+	_readFileHash(path, callback) {
+		this.fs.readFile(path, (err, content) => {
+			if (err) {
+				if (err.code === "EISDIR") {
+					this._fileHashes.set(path, "directory");
+					return callback(null, "directory");
+				}
+				if (err.code === "ENOENT") {
+					this._fileHashes.set(path, null);
+					return callback(null, null);
+				}
+				if (err.code === "ERR_FS_FILE_TOO_LARGE") {
+					/** @type {Logger} */
+					(this.logger).warn(`Ignoring ${path} for hashing as it's very large`);
+					this._fileHashes.set(path, "too large");
+					return callback(null, "too large");
+				}
+				return callback(/** @type {WebpackError} */ (err));
+			}
+
+			const hash = createHash(this._hashFunction);
+
+			hash.update(/** @type {string | Buffer} */ (content));
+
+			const digest = /** @type {string} */ (hash.digest("hex"));
+
+			this._fileHashes.set(path, digest);
+
+			callback(null, digest);
+		});
+	}
+
+	/**
+	 * @private
+	 * @param {string} path path
+	 * @param {(err: WebpackError | null, timestampAndHash?: TimestampAndHash) => void} callback callback
+	 */
+	_getFileTimestampAndHash(path, callback) {
+		/**
+		 * @param {string} hash hash
+		 * @returns {void}
+		 */
+		const continueWithHash = hash => {
+			const cache = this._fileTimestamps.get(path);
+			if (cache !== undefined) {
+				if (cache !== "ignore") {
+					/** @type {TimestampAndHash} */
+					const result = {
+						.../** @type {FileSystemInfoEntry} */ (cache),
+						hash
+					};
+					this._fileTshs.set(path, result);
+					return callback(null, result);
+				}
+				this._fileTshs.set(path, hash);
+				return callback(null, /** @type {TODO} */ (hash));
+			}
+			this.fileTimestampQueue.add(path, (err, entry) => {
+				if (err) {
+					return callback(err);
+				}
+				/** @type {TimestampAndHash} */
+				const result = {
+					.../** @type {FileSystemInfoEntry} */ (entry),
+					hash
+				};
+				this._fileTshs.set(path, result);
+				return callback(null, result);
+			});
+		};
+
+		const cache = this._fileHashes.get(path);
+		if (cache !== undefined) {
+			continueWithHash(/** @type {string} */ (cache));
+		} else {
+			this.fileHashQueue.add(path, (err, entry) => {
+				if (err) {
+					return callback(err);
+				}
+				continueWithHash(/** @type {string} */ (entry));
+			});
+		}
+	}
+
+	/**
+	 * @private
+	 * @template T
+	 * @template ItemType
+	 * @param {object} options options
+	 * @param {string} options.path path
+	 * @param {(value: string) => ItemType} options.fromImmutablePath called when context item is an immutable path
+	 * @param {(value: string) => ItemType} options.fromManagedItem called when context item is a managed path
+	 * @param {(value: string, result: string, callback: (err?: WebpackError | null, itemType?: ItemType) => void) => void} options.fromSymlink called when context item is a symlink
+	 * @param {(value: string, stats: IStats, callback: (err?: WebpackError | null, itemType?: ItemType | null) => void) => void} options.fromFile called when context item is a file
+	 * @param {(value: string, stats: IStats, callback: (err?: WebpackError | null, itemType?: ItemType) => void) => void} options.fromDirectory called when context item is a directory
+	 * @param {(arr: string[], arr1: ItemType[]) => T} options.reduce called from all context items
+	 * @param {(err?: Error | null, result?: T | null) => void} callback callback
+	 */
+	_readContext(
+		{
+			path,
+			fromImmutablePath,
+			fromManagedItem,
+			fromSymlink,
+			fromFile,
+			fromDirectory,
+			reduce
+		},
+		callback
+	) {
+		this.fs.readdir(path, (err, _files) => {
+			if (err) {
+				if (err.code === "ENOENT") {
+					return callback(null, null);
+				}
+				return callback(err);
+			}
+			const files = /** @type {string[]} */ (_files)
+				.map(file => file.normalize("NFC"))
+				.filter(file => !/^\./.test(file))
+				.sort();
+			asyncLib.map(
+				files,
+				(file, callback) => {
+					const child = join(this.fs, path, file);
+					for (const immutablePath of this.immutablePathsRegExps) {
+						if (immutablePath.test(path)) {
+							// ignore any immutable path for timestamping
+							return callback(null, fromImmutablePath(path));
+						}
+					}
+					for (const immutablePath of this.immutablePathsWithSlash) {
+						if (path.startsWith(immutablePath)) {
+							// ignore any immutable path for timestamping
+							return callback(null, fromImmutablePath(path));
+						}
+					}
+					for (const managedPath of this.managedPathsRegExps) {
+						const match = managedPath.exec(path);
+						if (match) {
+							const managedItem = getManagedItem(match[1], path);
+							if (managedItem) {
+								// construct timestampHash from managed info
+								return this.managedItemQueue.add(managedItem, (err, info) => {
+									if (err) return callback(err);
+									return callback(
+										null,
+										fromManagedItem(/** @type {string} */ (info))
+									);
+								});
+							}
+						}
+					}
+					for (const managedPath of this.managedPathsWithSlash) {
+						if (path.startsWith(managedPath)) {
+							const managedItem = getManagedItem(managedPath, child);
+							if (managedItem) {
+								// construct timestampHash from managed info
+								return this.managedItemQueue.add(managedItem, (err, info) => {
+									if (err) return callback(err);
+									return callback(
+										null,
+										fromManagedItem(/** @type {string} */ (info))
+									);
+								});
+							}
+						}
+					}
+
+					lstatReadlinkAbsolute(this.fs, child, (err, _stat) => {
+						if (err) return callback(err);
+
+						const stat = /** @type {IStats | string} */ (_stat);
+
+						if (typeof stat === "string") {
+							return fromSymlink(child, stat, callback);
+						}
+
+						if (stat.isFile()) {
+							return fromFile(child, stat, callback);
+						}
+						if (stat.isDirectory()) {
+							return fromDirectory(child, stat, callback);
+						}
+						callback(null, null);
+					});
+				},
+				(err, results) => {
+					if (err) return callback(err);
+					const result = reduce(files, /** @type {ItemType[]} */ (results));
+					callback(null, result);
+				}
+			);
+		});
+	}
+
+	/**
+	 * @private
+	 * @type {Processor}
+	 */
+	_readContextTimestamp(path, callback) {
+		this._readContext(
+			{
+				path,
+				fromImmutablePath: () =>
+					/** @type {ContextFileSystemInfoEntry | FileSystemInfoEntry | "ignore" | null} */
+					(null),
+				fromManagedItem: info => ({
+					safeTime: 0,
+					timestampHash: info
+				}),
+				fromSymlink: (file, target, callback) => {
+					callback(
+						null,
+						/** @type {ContextFileSystemInfoEntry} */
+						({
+							timestampHash: target,
+							symlinks: new Set([target])
+						})
+					);
+				},
+				fromFile: (file, stat, callback) => {
+					// Prefer the cached value over our new stat to report consistent results
+					const cache = this._fileTimestamps.get(file);
+					if (cache !== undefined)
+						return callback(null, cache === "ignore" ? null : cache);
+
+					const mtime = Number(stat.mtime);
+
+					if (mtime) applyMtime(mtime);
+
+					/** @type {FileSystemInfoEntry} */
+					const ts = {
+						safeTime: mtime ? mtime + FS_ACCURACY : Infinity,
+						timestamp: mtime
+					};
+
+					this._fileTimestamps.set(file, ts);
+					this._cachedDeprecatedFileTimestamps = undefined;
+					callback(null, ts);
+				},
+				fromDirectory: (directory, stat, callback) => {
+					this.contextTimestampQueue.increaseParallelism();
+					this._getUnresolvedContextTimestamp(directory, (err, tsEntry) => {
+						this.contextTimestampQueue.decreaseParallelism();
+						callback(err, tsEntry);
+					});
+				},
+				reduce: (files, tsEntries) => {
+					let symlinks;
+
+					const hash = createHash(this._hashFunction);
+
+					for (const file of files) hash.update(file);
+					let safeTime = 0;
+					for (const _e of tsEntries) {
+						if (!_e) {
+							hash.update("n");
+							continue;
+						}
+						const entry =
+							/** @type {FileSystemInfoEntry | ContextFileSystemInfoEntry} */
+							(_e);
+						if (/** @type {FileSystemInfoEntry} */ (entry).timestamp) {
+							hash.update("f");
+							hash.update(
+								`${/** @type {FileSystemInfoEntry} */ (entry).timestamp}`
+							);
+						} else if (
+							/** @type {ContextFileSystemInfoEntry} */ (entry).timestampHash
+						) {
+							hash.update("d");
+							hash.update(
+								`${/** @type {ContextFileSystemInfoEntry} */ (entry).timestampHash}`
+							);
+						}
+						if (
+							/** @type {ContextFileSystemInfoEntry} */
+							(entry).symlinks !== undefined
+						) {
+							if (symlinks === undefined) symlinks = new Set();
+							addAll(
+								/** @type {ContextFileSystemInfoEntry} */ (entry).symlinks,
+								symlinks
+							);
+						}
+						if (entry.safeTime) {
+							safeTime = Math.max(safeTime, entry.safeTime);
+						}
+					}
+
+					const digest = /** @type {string} */ (hash.digest("hex"));
+					/** @type {ContextFileSystemInfoEntry} */
+					const result = {
+						safeTime,
+						timestampHash: digest
+					};
+					if (symlinks) result.symlinks = symlinks;
+					return result;
+				}
+			},
+			(err, result) => {
+				if (err) return callback(/** @type {WebpackError} */ (err));
+				this._contextTimestamps.set(path, result);
+				this._cachedDeprecatedContextTimestamps = undefined;
+
+				callback(null, result);
+			}
+		);
+	}
+
+	/**
+	 * @private
+	 * @param {ContextFileSystemInfoEntry} entry entry
+	 * @param {(err?: WebpackError | null, resolvedContextTimestamp?: ResolvedContextTimestamp) => void} callback callback
+	 * @returns {void}
+	 */
+	_resolveContextTimestamp(entry, callback) {
+		/** @type {string[]} */
+		const hashes = [];
+		let safeTime = 0;
+		processAsyncTree(
+			/** @type {NonNullable} */ (entry.symlinks),
+			10,
+			(target, push, callback) => {
+				this._getUnresolvedContextTimestamp(target, (err, entry) => {
+					if (err) return callback(err);
+					if (entry && entry !== "ignore") {
+						hashes.push(/** @type {string} */ (entry.timestampHash));
+						if (entry.safeTime) {
+							safeTime = Math.max(safeTime, entry.safeTime);
+						}
+						if (entry.symlinks !== undefined) {
+							for (const target of entry.symlinks) push(target);
+						}
+					}
+					callback();
+				});
+			},
+			err => {
+				if (err) return callback(/** @type {WebpackError} */ (err));
+				const hash = createHash(this._hashFunction);
+				hash.update(/** @type {string} */ (entry.timestampHash));
+				if (entry.safeTime) {
+					safeTime = Math.max(safeTime, entry.safeTime);
+				}
+				hashes.sort();
+				for (const h of hashes) {
+					hash.update(h);
+				}
+				callback(
+					null,
+					(entry.resolved = {
+						safeTime,
+						timestampHash: /** @type {string} */ (hash.digest("hex"))
+					})
+				);
+			}
+		);
+	}
+
+	/**
+	 * @private
+	 * @type {Processor}
+	 */
+	_readContextHash(path, callback) {
+		this._readContext(
+			{
+				path,
+				fromImmutablePath: () => /** @type {ContextHash | ""} */ (""),
+				fromManagedItem: info => info || "",
+				fromSymlink: (file, target, callback) => {
+					callback(
+						null,
+						/** @type {ContextHash} */
+						({
+							hash: target,
+							symlinks: new Set([target])
+						})
+					);
+				},
+				fromFile: (file, stat, callback) =>
+					this.getFileHash(file, (err, hash) => {
+						callback(err, hash || "");
+					}),
+				fromDirectory: (directory, stat, callback) => {
+					this.contextHashQueue.increaseParallelism();
+					this._getUnresolvedContextHash(directory, (err, hash) => {
+						this.contextHashQueue.decreaseParallelism();
+						callback(err, hash || "");
+					});
+				},
+				/**
+				 * @param {string[]} files files
+				 * @param {(string | ContextHash)[]} fileHashes hashes
+				 * @returns {ContextHash} reduced hash
+				 */
+				reduce: (files, fileHashes) => {
+					let symlinks;
+					const hash = createHash(this._hashFunction);
+
+					for (const file of files) hash.update(file);
+					for (const entry of fileHashes) {
+						if (typeof entry === "string") {
+							hash.update(entry);
+						} else {
+							hash.update(entry.hash);
+							if (entry.symlinks) {
+								if (symlinks === undefined) symlinks = new Set();
+								addAll(entry.symlinks, symlinks);
+							}
+						}
+					}
+
+					/** @type {ContextHash} */
+					const result = {
+						hash: /** @type {string} */ (hash.digest("hex"))
+					};
+					if (symlinks) result.symlinks = symlinks;
+					return result;
+				}
+			},
+			(err, _result) => {
+				if (err) return callback(/** @type {WebpackError} */ (err));
+				const result = /** @type {ContextHash} */ (_result);
+				this._contextHashes.set(path, result);
+				return callback(null, result);
+			}
+		);
+	}
+
+	/**
+	 * @private
+	 * @param {ContextHash} entry context hash
+	 * @param {(err: WebpackError | null, contextHash?: string) => void} callback callback
+	 * @returns {void}
+	 */
+	_resolveContextHash(entry, callback) {
+		/** @type {string[]} */
+		const hashes = [];
+		processAsyncTree(
+			/** @type {NonNullable} */ (entry.symlinks),
+			10,
+			(target, push, callback) => {
+				this._getUnresolvedContextHash(target, (err, hash) => {
+					if (err) return callback(err);
+					if (hash) {
+						hashes.push(hash.hash);
+						if (hash.symlinks !== undefined) {
+							for (const target of hash.symlinks) push(target);
+						}
+					}
+					callback();
+				});
+			},
+			err => {
+				if (err) return callback(/** @type {WebpackError} */ (err));
+				const hash = createHash(this._hashFunction);
+				hash.update(entry.hash);
+				hashes.sort();
+				for (const h of hashes) {
+					hash.update(h);
+				}
+				callback(
+					null,
+					(entry.resolved = /** @type {string} */ (hash.digest("hex")))
+				);
+			}
+		);
+	}
+
+	/**
+	 * @private
+	 * @type {Processor}
+	 */
+	_readContextTimestampAndHash(path, callback) {
+		/**
+		 * @param {ContextTimestamp} timestamp timestamp
+		 * @param {ContextHash} hash hash
+		 */
+		const finalize = (timestamp, hash) => {
+			const result =
+				/** @type {ContextTimestampAndHash} */
+				(timestamp === "ignore" ? hash : { ...timestamp, ...hash });
+			this._contextTshs.set(path, result);
+			callback(null, result);
+		};
+		const cachedHash = this._contextHashes.get(path);
+		const cachedTimestamp = this._contextTimestamps.get(path);
+		if (cachedHash !== undefined) {
+			if (cachedTimestamp !== undefined) {
+				finalize(cachedTimestamp, cachedHash);
+			} else {
+				this.contextTimestampQueue.add(path, (err, entry) => {
+					if (err) return callback(err);
+					finalize(
+						/** @type {ContextFileSystemInfoEntry} */
+						(entry),
+						cachedHash
+					);
+				});
+			}
+		} else if (cachedTimestamp !== undefined) {
+			this.contextHashQueue.add(path, (err, entry) => {
+				if (err) return callback(err);
+				finalize(cachedTimestamp, /** @type {ContextHash} */ (entry));
+			});
+		} else {
+			this._readContext(
+				{
+					path,
+					fromImmutablePath: () =>
+						/** @type {ContextTimestampAndHash | null} */ (null),
+					fromManagedItem: info => ({
+						safeTime: 0,
+						timestampHash: info,
+						hash: info || ""
+					}),
+					fromSymlink: (file, target, callback) => {
+						callback(
+							null,
+							/** @type {TODO} */
+							({
+								timestampHash: target,
+								hash: target,
+								symlinks: new Set([target])
+							})
+						);
+					},
+					fromFile: (file, stat, callback) => {
+						this._getFileTimestampAndHash(file, callback);
+					},
+					fromDirectory: (directory, stat, callback) => {
+						this.contextTshQueue.increaseParallelism();
+						this.contextTshQueue.add(directory, (err, result) => {
+							this.contextTshQueue.decreaseParallelism();
+							callback(err, result);
+						});
+					},
+					/**
+					 * @param {string[]} files files
+					 * @param {(Partial & Partial | string | null)[]} results results
+					 * @returns {ContextTimestampAndHash} tsh
+					 */
+					reduce: (files, results) => {
+						let symlinks;
+
+						const tsHash = createHash(this._hashFunction);
+						const hash = createHash(this._hashFunction);
+
+						for (const file of files) {
+							tsHash.update(file);
+							hash.update(file);
+						}
+						let safeTime = 0;
+						for (const entry of results) {
+							if (!entry) {
+								tsHash.update("n");
+								continue;
+							}
+							if (typeof entry === "string") {
+								tsHash.update("n");
+								hash.update(entry);
+								continue;
+							}
+							if (entry.timestamp) {
+								tsHash.update("f");
+								tsHash.update(`${entry.timestamp}`);
+							} else if (entry.timestampHash) {
+								tsHash.update("d");
+								tsHash.update(`${entry.timestampHash}`);
+							}
+							if (entry.symlinks !== undefined) {
+								if (symlinks === undefined) symlinks = new Set();
+								addAll(entry.symlinks, symlinks);
+							}
+							if (entry.safeTime) {
+								safeTime = Math.max(safeTime, entry.safeTime);
+							}
+							hash.update(/** @type {string} */ (entry.hash));
+						}
+
+						/** @type {ContextTimestampAndHash} */
+						const result = {
+							safeTime,
+							timestampHash: /** @type {string} */ (tsHash.digest("hex")),
+							hash: /** @type {string} */ (hash.digest("hex"))
+						};
+						if (symlinks) result.symlinks = symlinks;
+						return result;
+					}
+				},
+				(err, _result) => {
+					if (err) return callback(/** @type {WebpackError} */ (err));
+					const result = /** @type {ContextTimestampAndHash} */ (_result);
+					this._contextTshs.set(path, result);
+					return callback(null, result);
+				}
+			);
+		}
+	}
+
+	/**
+	 * @private
+	 * @param {ContextTimestampAndHash} entry entry
+	 * @param {ProcessorCallback} callback callback
+	 * @returns {void}
+	 */
+	_resolveContextTsh(entry, callback) {
+		/** @type {string[]} */
+		const hashes = [];
+		/** @type {string[]} */
+		const tsHashes = [];
+		let safeTime = 0;
+		processAsyncTree(
+			/** @type {NonNullable} */ (entry.symlinks),
+			10,
+			(target, push, callback) => {
+				this._getUnresolvedContextTsh(target, (err, entry) => {
+					if (err) return callback(err);
+					if (entry) {
+						hashes.push(entry.hash);
+						if (entry.timestampHash) tsHashes.push(entry.timestampHash);
+						if (entry.safeTime) {
+							safeTime = Math.max(safeTime, entry.safeTime);
+						}
+						if (entry.symlinks !== undefined) {
+							for (const target of entry.symlinks) push(target);
+						}
+					}
+					callback();
+				});
+			},
+			err => {
+				if (err) return callback(/** @type {WebpackError} */ (err));
+				const hash = createHash(this._hashFunction);
+				const tsHash = createHash(this._hashFunction);
+				hash.update(entry.hash);
+				if (entry.timestampHash) tsHash.update(entry.timestampHash);
+				if (entry.safeTime) {
+					safeTime = Math.max(safeTime, entry.safeTime);
+				}
+				hashes.sort();
+				for (const h of hashes) {
+					hash.update(h);
+				}
+				tsHashes.sort();
+				for (const h of tsHashes) {
+					tsHash.update(h);
+				}
+				callback(
+					null,
+					(entry.resolved = {
+						safeTime,
+						timestampHash: /** @type {string} */ (tsHash.digest("hex")),
+						hash: /** @type {string} */ (hash.digest("hex"))
+					})
+				);
+			}
+		);
+	}
+
+	/**
+	 * @private
+	 * @type {Processor>}
+	 */
+	_getManagedItemDirectoryInfo(path, callback) {
+		this.fs.readdir(path, (err, elements) => {
+			if (err) {
+				if (err.code === "ENOENT" || err.code === "ENOTDIR") {
+					return callback(null, EMPTY_SET);
+				}
+				return callback(/** @type {WebpackError} */ (err));
+			}
+			const set = new Set(
+				/** @type {string[]} */ (elements).map(element =>
+					join(this.fs, path, element)
+				)
+			);
+			callback(null, set);
+		});
+	}
+
+	/**
+	 * @private
+	 * @type {Processor}
+	 */
+	_getManagedItemInfo(path, callback) {
+		const dir = dirname(this.fs, path);
+		this.managedItemDirectoryQueue.add(dir, (err, elements) => {
+			if (err) {
+				return callback(err);
+			}
+			if (!(/** @type {Set} */ (elements).has(path))) {
+				// file or directory doesn't exist
+				this._managedItems.set(path, "*missing");
+				return callback(null, "*missing");
+			}
+			// something exists
+			// it may be a file or directory
+			if (
+				path.endsWith("node_modules") &&
+				(path.endsWith("/node_modules") || path.endsWith("\\node_modules"))
+			) {
+				// we are only interested in existence of this special directory
+				this._managedItems.set(path, "*node_modules");
+				return callback(null, "*node_modules");
+			}
+
+			// we assume it's a directory, as files shouldn't occur in managed paths
+			const packageJsonPath = join(this.fs, path, "package.json");
+			this.fs.readFile(packageJsonPath, (err, content) => {
+				if (err) {
+					if (err.code === "ENOENT" || err.code === "ENOTDIR") {
+						// no package.json or path is not a directory
+						this.fs.readdir(path, (err, elements) => {
+							if (
+								!err &&
+								/** @type {string[]} */ (elements).length === 1 &&
+								/** @type {string[]} */ (elements)[0] === "node_modules"
+							) {
+								// This is only a grouping folder e.g. used by yarn
+								// we are only interested in existence of this special directory
+								this._managedItems.set(path, "*nested");
+								return callback(null, "*nested");
+							}
+							/** @type {Logger} */
+							(this.logger).warn(
+								`Managed item ${path} isn't a directory or doesn't contain a package.json (see snapshot.managedPaths option)`
+							);
+							return callback();
+						});
+						return;
+					}
+					return callback(/** @type {WebpackError} */ (err));
+				}
+				let data;
+				try {
+					data = JSON.parse(/** @type {Buffer} */ (content).toString("utf-8"));
+				} catch (parseErr) {
+					return callback(/** @type {WebpackError} */ (parseErr));
+				}
+				if (!data.name) {
+					/** @type {Logger} */
+					(this.logger).warn(
+						`${packageJsonPath} doesn't contain a "name" property (see snapshot.managedPaths option)`
+					);
+					return callback();
+				}
+				const info = `${data.name || ""}@${data.version || ""}`;
+				this._managedItems.set(path, info);
+				callback(null, info);
+			});
+		});
+	}
+
+	getDeprecatedFileTimestamps() {
+		if (this._cachedDeprecatedFileTimestamps !== undefined)
+			return this._cachedDeprecatedFileTimestamps;
+		/** @type {Map} */
+		const map = new Map();
+		for (const [path, info] of this._fileTimestamps) {
+			if (info) map.set(path, typeof info === "object" ? info.safeTime : null);
+		}
+		return (this._cachedDeprecatedFileTimestamps = map);
+	}
+
+	getDeprecatedContextTimestamps() {
+		if (this._cachedDeprecatedContextTimestamps !== undefined)
+			return this._cachedDeprecatedContextTimestamps;
+		/** @type {Map} */
+		const map = new Map();
+		for (const [path, info] of this._contextTimestamps) {
+			if (info) map.set(path, typeof info === "object" ? info.safeTime : null);
+		}
+		return (this._cachedDeprecatedContextTimestamps = map);
+	}
+}
+
+module.exports = FileSystemInfo;
+module.exports.Snapshot = Snapshot;
diff --git a/lib/FlagAllModulesAsUsedPlugin.js b/lib/FlagAllModulesAsUsedPlugin.js
new file mode 100644
index 00000000000..eb3ee4cf43d
--- /dev/null
+++ b/lib/FlagAllModulesAsUsedPlugin.js
@@ -0,0 +1,55 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { getEntryRuntime, mergeRuntimeOwned } = require("./util/runtime");
+
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./Module").FactoryMeta} FactoryMeta */
+/** @typedef {import("./util/runtime").RuntimeSpec} RuntimeSpec */
+
+const PLUGIN_NAME = "FlagAllModulesAsUsedPlugin";
+class FlagAllModulesAsUsedPlugin {
+	/**
+	 * @param {string} explanation explanation
+	 */
+	constructor(explanation) {
+		this.explanation = explanation;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			const moduleGraph = compilation.moduleGraph;
+			compilation.hooks.optimizeDependencies.tap(PLUGIN_NAME, modules => {
+				/** @type {RuntimeSpec} */
+				let runtime;
+				for (const [name, { options }] of compilation.entries) {
+					runtime = mergeRuntimeOwned(
+						runtime,
+						getEntryRuntime(compilation, name, options)
+					);
+				}
+				for (const module of modules) {
+					const exportsInfo = moduleGraph.getExportsInfo(module);
+					exportsInfo.setUsedInUnknownWay(runtime);
+					moduleGraph.addExtraReason(module, this.explanation);
+					if (module.factoryMeta === undefined) {
+						module.factoryMeta = {};
+					}
+					/** @type {FactoryMeta} */
+					(module.factoryMeta).sideEffectFree = false;
+				}
+			});
+		});
+	}
+}
+
+module.exports = FlagAllModulesAsUsedPlugin;
diff --git a/lib/FlagDependencyExportsPlugin.js b/lib/FlagDependencyExportsPlugin.js
index d3eb7d49e3f..dd984e0e57f 100644
--- a/lib/FlagDependencyExportsPlugin.js
+++ b/lib/FlagDependencyExportsPlugin.js
@@ -2,153 +2,421 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const asyncLib = require("neo-async");
 const Queue = require("./util/Queue");
 
-const addToSet = (a, b) => {
-	let changed = false;
-	for (const item of b) {
-		if (!a.has(item)) {
-			a.add(item);
-			changed = true;
-		}
-	}
-	return changed;
-};
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./DependenciesBlock")} DependenciesBlock */
+/** @typedef {import("./Dependency")} Dependency */
+/** @typedef {import("./Dependency").ExportSpec} ExportSpec */
+/** @typedef {import("./Dependency").ExportsSpec} ExportsSpec */
+/** @typedef {import("./ExportsInfo")} ExportsInfo */
+/** @typedef {import("./ExportsInfo").RestoreProvidedData} RestoreProvidedData */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./Module").BuildInfo} BuildInfo */
+
+const PLUGIN_NAME = "FlagDependencyExportsPlugin";
+const PLUGIN_LOGGER_NAME = `webpack.${PLUGIN_NAME}`;
 
 class FlagDependencyExportsPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		compiler.hooks.compilation.tap(
-			"FlagDependencyExportsPlugin",
-			compilation => {
-				compilation.hooks.finishModules.tap(
-					"FlagDependencyExportsPlugin",
-					modules => {
-						const dependencies = new Map();
-
-						const queue = new Queue();
-
-						let module;
-						let moduleWithExports;
-						let moduleProvidedExports;
-						let providedExportsAreTemporary;
-
-						const processDependenciesBlock = depBlock => {
-							for (const dep of depBlock.dependencies) {
-								if (processDependency(dep)) return true;
-							}
-							for (const variable of depBlock.variables) {
-								for (const dep of variable.dependencies) {
-									if (processDependency(dep)) return true;
-								}
-							}
-							for (const block of depBlock.blocks) {
-								if (processDependenciesBlock(block)) return true;
-							}
-							return false;
-						};
-
-						const processDependency = dep => {
-							const exportDesc = dep.getExports && dep.getExports();
-							if (!exportDesc) return;
-							moduleWithExports = true;
-							const exports = exportDesc.exports;
-							// break early if it's only in the worst state
-							if (module.buildMeta.providedExports === true) {
-								return true;
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			const moduleGraph = compilation.moduleGraph;
+			const cache = compilation.getCache(PLUGIN_NAME);
+			compilation.hooks.finishModules.tapAsync(
+				PLUGIN_NAME,
+				(modules, callback) => {
+					const logger = compilation.getLogger(PLUGIN_LOGGER_NAME);
+					let statRestoredFromMemCache = 0;
+					let statRestoredFromCache = 0;
+					let statNoExports = 0;
+					let statFlaggedUncached = 0;
+					let statNotCached = 0;
+					let statQueueItemsProcessed = 0;
+
+					const { moduleMemCaches } = compilation;
+
+					/** @type {Queue} */
+					const queue = new Queue();
+
+					// Step 1: Try to restore cached provided export info from cache
+					logger.time("restore cached provided exports");
+					asyncLib.each(
+						modules,
+						(module, callback) => {
+							const exportsInfo = moduleGraph.getExportsInfo(module);
+							// If the module doesn't have an exportsType, it's a module
+							// without declared exports.
+							if (
+								(!module.buildMeta || !module.buildMeta.exportsType) &&
+								exportsInfo.otherExportsInfo.provided !== null
+							) {
+								// It's a module without declared exports
+								statNoExports++;
+								exportsInfo.setHasProvideInfo();
+								exportsInfo.setUnknownExportsProvided();
+								return callback();
 							}
-							// break if it should move to the worst state
-							if (exports === true) {
-								module.buildMeta.providedExports = true;
-								notifyDependencies();
-								return true;
+							// If the module has no hash, it's uncacheable
+							if (
+								typeof (/** @type {BuildInfo} */ (module.buildInfo).hash) !==
+								"string"
+							) {
+								statFlaggedUncached++;
+								// Enqueue uncacheable module for determining the exports
+								queue.enqueue(module);
+								exportsInfo.setHasProvideInfo();
+								return callback();
 							}
-							// merge in new exports
-							if (Array.isArray(exports)) {
-								if (addToSet(moduleProvidedExports, exports)) {
-									notifyDependencies();
-								}
+							const memCache = moduleMemCaches && moduleMemCaches.get(module);
+							const memCacheValue = memCache && memCache.get(this);
+							if (memCacheValue !== undefined) {
+								statRestoredFromMemCache++;
+								exportsInfo.restoreProvided(memCacheValue);
+								return callback();
 							}
-							// store dependencies
-							const exportDeps = exportDesc.dependencies;
-							if (exportDeps) {
-								providedExportsAreTemporary = true;
-								for (const exportDependency of exportDeps) {
-									// add dependency for this module
-									const set = dependencies.get(exportDependency);
-									if (set === undefined) {
-										dependencies.set(exportDependency, new Set([module]));
+							cache.get(
+								module.identifier(),
+								/** @type {BuildInfo} */
+								(module.buildInfo).hash,
+								(err, result) => {
+									if (err) return callback(err);
+
+									if (result !== undefined) {
+										statRestoredFromCache++;
+										exportsInfo.restoreProvided(result);
 									} else {
-										set.add(module);
+										statNotCached++;
+										// Without cached info enqueue module for determining the exports
+										queue.enqueue(module);
+										exportsInfo.setHasProvideInfo();
 									}
+									callback();
 								}
-							}
-							return false;
-						};
-
-						const notifyDependencies = () => {
-							const deps = dependencies.get(module);
-							if (deps !== undefined) {
-								for (const dep of deps) {
-									queue.enqueue(dep);
+							);
+						},
+						err => {
+							logger.timeEnd("restore cached provided exports");
+							if (err) return callback(err);
+
+							/** @type {Set} */
+							const modulesToStore = new Set();
+
+							/** @type {Map>} */
+							const dependencies = new Map();
+
+							/** @type {Module} */
+							let module;
+
+							/** @type {ExportsInfo} */
+							let exportsInfo;
+
+							/** @type {Map} */
+							const exportsSpecsFromDependencies = new Map();
+
+							let cacheable = true;
+							let changed = false;
+
+							/**
+							 * @param {DependenciesBlock} depBlock the dependencies block
+							 * @returns {void}
+							 */
+							const processDependenciesBlock = depBlock => {
+								for (const dep of depBlock.dependencies) {
+									processDependency(dep);
 								}
-							}
-						};
-
-						// Start with all modules without provided exports
-						for (const module of modules) {
-							if (module.buildInfo.temporaryProvidedExports) {
-								// Clear exports when they are temporary
-								// and recreate them
-								module.buildMeta.providedExports = null;
-								queue.enqueue(module);
-							} else if (!module.buildMeta.providedExports) {
-								queue.enqueue(module);
-							}
-						}
+								for (const block of depBlock.blocks) {
+									processDependenciesBlock(block);
+								}
+							};
 
-						while (queue.length > 0) {
-							module = queue.dequeue();
-
-							if (module.buildMeta.providedExports !== true) {
-								moduleWithExports =
-									module.buildMeta && module.buildMeta.exportsType;
-								moduleProvidedExports = Array.isArray(
-									module.buildMeta.providedExports
-								)
-									? new Set(module.buildMeta.providedExports)
-									: new Set();
-								providedExportsAreTemporary = false;
+							/**
+							 * @param {Dependency} dep the dependency
+							 * @returns {void}
+							 */
+							const processDependency = dep => {
+								const exportDesc = dep.getExports(moduleGraph);
+								if (!exportDesc) return;
+								exportsSpecsFromDependencies.set(dep, exportDesc);
+							};
+
+							/**
+							 * @param {Dependency} dep dependency
+							 * @param {ExportsSpec} exportDesc info
+							 * @returns {void}
+							 */
+							const processExportsSpec = (dep, exportDesc) => {
+								const exports = exportDesc.exports;
+								const globalCanMangle = exportDesc.canMangle;
+								const globalFrom = exportDesc.from;
+								const globalPriority = exportDesc.priority;
+								const globalTerminalBinding =
+									exportDesc.terminalBinding || false;
+								const exportDeps = exportDesc.dependencies;
+								if (exportDesc.hideExports) {
+									for (const name of exportDesc.hideExports) {
+										const exportInfo = exportsInfo.getExportInfo(name);
+										exportInfo.unsetTarget(dep);
+									}
+								}
+								if (exports === true) {
+									// unknown exports
+									if (
+										exportsInfo.setUnknownExportsProvided(
+											globalCanMangle,
+											exportDesc.excludeExports,
+											globalFrom && dep,
+											globalFrom,
+											globalPriority
+										)
+									) {
+										changed = true;
+									}
+								} else if (Array.isArray(exports)) {
+									/**
+									 * merge in new exports
+									 * @param {ExportsInfo} exportsInfo own exports info
+									 * @param {(ExportSpec | string)[]} exports list of exports
+									 */
+									const mergeExports = (exportsInfo, exports) => {
+										for (const exportNameOrSpec of exports) {
+											let name;
+											let canMangle = globalCanMangle;
+											let terminalBinding = globalTerminalBinding;
+											let exports;
+											let from = globalFrom;
+											let fromExport;
+											let priority = globalPriority;
+											let hidden = false;
+											if (typeof exportNameOrSpec === "string") {
+												name = exportNameOrSpec;
+											} else {
+												name = exportNameOrSpec.name;
+												if (exportNameOrSpec.canMangle !== undefined)
+													canMangle = exportNameOrSpec.canMangle;
+												if (exportNameOrSpec.export !== undefined)
+													fromExport = exportNameOrSpec.export;
+												if (exportNameOrSpec.exports !== undefined)
+													exports = exportNameOrSpec.exports;
+												if (exportNameOrSpec.from !== undefined)
+													from = exportNameOrSpec.from;
+												if (exportNameOrSpec.priority !== undefined)
+													priority = exportNameOrSpec.priority;
+												if (exportNameOrSpec.terminalBinding !== undefined)
+													terminalBinding = exportNameOrSpec.terminalBinding;
+												if (exportNameOrSpec.hidden !== undefined)
+													hidden = exportNameOrSpec.hidden;
+											}
+											const exportInfo = exportsInfo.getExportInfo(name);
+
+											if (
+												exportInfo.provided === false ||
+												exportInfo.provided === null
+											) {
+												exportInfo.provided = true;
+												changed = true;
+											}
+
+											if (
+												exportInfo.canMangleProvide !== false &&
+												canMangle === false
+											) {
+												exportInfo.canMangleProvide = false;
+												changed = true;
+											}
+
+											if (terminalBinding && !exportInfo.terminalBinding) {
+												exportInfo.terminalBinding = true;
+												changed = true;
+											}
+
+											if (exports) {
+												const nestedExportsInfo =
+													exportInfo.createNestedExportsInfo();
+												mergeExports(
+													/** @type {ExportsInfo} */ (nestedExportsInfo),
+													exports
+												);
+											}
+
+											if (
+												from &&
+												(hidden
+													? exportInfo.unsetTarget(dep)
+													: exportInfo.setTarget(
+															dep,
+															from,
+															fromExport === undefined ? [name] : fromExport,
+															priority
+														))
+											) {
+												changed = true;
+											}
+
+											// Recalculate target exportsInfo
+											const target = exportInfo.getTarget(moduleGraph);
+											let targetExportsInfo;
+											if (target) {
+												const targetModuleExportsInfo =
+													moduleGraph.getExportsInfo(target.module);
+												targetExportsInfo =
+													targetModuleExportsInfo.getNestedExportsInfo(
+														target.export
+													);
+												// add dependency for this module
+												const set = dependencies.get(target.module);
+												if (set === undefined) {
+													dependencies.set(target.module, new Set([module]));
+												} else {
+													set.add(module);
+												}
+											}
+
+											if (exportInfo.exportsInfoOwned) {
+												if (
+													/** @type {ExportsInfo} */
+													(exportInfo.exportsInfo).setRedirectNamedTo(
+														targetExportsInfo
+													)
+												) {
+													changed = true;
+												}
+											} else if (exportInfo.exportsInfo !== targetExportsInfo) {
+												exportInfo.exportsInfo = targetExportsInfo;
+												changed = true;
+											}
+										}
+									};
+									mergeExports(exportsInfo, exports);
+								}
+								// store dependencies
+								if (exportDeps) {
+									cacheable = false;
+									for (const exportDependency of exportDeps) {
+										// add dependency for this module
+										const set = dependencies.get(exportDependency);
+										if (set === undefined) {
+											dependencies.set(exportDependency, new Set([module]));
+										} else {
+											set.add(module);
+										}
+									}
+								}
+							};
+
+							const notifyDependencies = () => {
+								const deps = dependencies.get(module);
+								if (deps !== undefined) {
+									for (const dep of deps) {
+										queue.enqueue(dep);
+									}
+								}
+							};
+
+							logger.time("figure out provided exports");
+							while (queue.length > 0) {
+								module = /** @type {Module} */ (queue.dequeue());
+
+								statQueueItemsProcessed++;
+
+								exportsInfo = moduleGraph.getExportsInfo(module);
+
+								cacheable = true;
+								changed = false;
+
+								exportsSpecsFromDependencies.clear();
+								moduleGraph.freeze();
 								processDependenciesBlock(module);
-								module.buildInfo.temporaryProvidedExports = providedExportsAreTemporary;
-								if (!moduleWithExports) {
-									module.buildMeta.providedExports = true;
+								moduleGraph.unfreeze();
+								for (const [dep, exportsSpec] of exportsSpecsFromDependencies) {
+									processExportsSpec(dep, exportsSpec);
+								}
+
+								if (cacheable) {
+									modulesToStore.add(module);
+								}
+
+								if (changed) {
 									notifyDependencies();
-								} else if (module.buildMeta.providedExports !== true) {
-									module.buildMeta.providedExports = Array.from(
-										moduleProvidedExports
-									);
 								}
 							}
+							logger.timeEnd("figure out provided exports");
+
+							logger.log(
+								`${Math.round(
+									(100 * (statFlaggedUncached + statNotCached)) /
+										(statRestoredFromMemCache +
+											statRestoredFromCache +
+											statNotCached +
+											statFlaggedUncached +
+											statNoExports)
+								)}% of exports of modules have been determined (${statNoExports} no declared exports, ${statNotCached} not cached, ${statFlaggedUncached} flagged uncacheable, ${statRestoredFromCache} from cache, ${statRestoredFromMemCache} from mem cache, ${
+									statQueueItemsProcessed - statNotCached - statFlaggedUncached
+								} additional calculations due to dependencies)`
+							);
+
+							logger.time("store provided exports into cache");
+							asyncLib.each(
+								modulesToStore,
+								(module, callback) => {
+									if (
+										typeof (
+											/** @type {BuildInfo} */
+											(module.buildInfo).hash
+										) !== "string"
+									) {
+										// not cacheable
+										return callback();
+									}
+									const cachedData = moduleGraph
+										.getExportsInfo(module)
+										.getRestoreProvidedData();
+									const memCache =
+										moduleMemCaches && moduleMemCaches.get(module);
+									if (memCache) {
+										memCache.set(this, cachedData);
+									}
+									cache.store(
+										module.identifier(),
+										/** @type {BuildInfo} */
+										(module.buildInfo).hash,
+										cachedData,
+										callback
+									);
+								},
+								err => {
+									logger.timeEnd("store provided exports into cache");
+									callback(err);
+								}
+							);
 						}
-					}
-				);
-				const providedExportsCache = new WeakMap();
-				compilation.hooks.rebuildModule.tap(
-					"FlagDependencyExportsPlugin",
-					module => {
-						providedExportsCache.set(module, module.buildMeta.providedExports);
-					}
+					);
+				}
+			);
+
+			/** @type {WeakMap} */
+			const providedExportsCache = new WeakMap();
+			compilation.hooks.rebuildModule.tap(PLUGIN_NAME, module => {
+				providedExportsCache.set(
+					module,
+					moduleGraph.getExportsInfo(module).getRestoreProvidedData()
 				);
-				compilation.hooks.finishRebuildingModule.tap(
-					"FlagDependencyExportsPlugin",
-					module => {
-						module.buildMeta.providedExports = providedExportsCache.get(module);
-					}
+			});
+			compilation.hooks.finishRebuildingModule.tap(PLUGIN_NAME, module => {
+				moduleGraph.getExportsInfo(module).restoreProvided(
+					/** @type {RestoreProvidedData} */
+					(providedExportsCache.get(module))
 				);
-			}
-		);
+			});
+		});
 	}
 }
 
diff --git a/lib/FlagDependencyUsagePlugin.js b/lib/FlagDependencyUsagePlugin.js
index 85c22160892..3d25a2d0fff 100644
--- a/lib/FlagDependencyUsagePlugin.js
+++ b/lib/FlagDependencyUsagePlugin.js
@@ -2,115 +2,346 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-/** @typedef {import("./Module")} Module */
+const Dependency = require("./Dependency");
+const { UsageState } = require("./ExportsInfo");
+const ModuleGraphConnection = require("./ModuleGraphConnection");
+const { STAGE_DEFAULT } = require("./OptimizationStages");
+const ArrayQueue = require("./util/ArrayQueue");
+const TupleQueue = require("./util/TupleQueue");
+const { getEntryRuntime, mergeRuntimeOwned } = require("./util/runtime");
+
+/** @typedef {import("./Chunk")} Chunk */
+/** @typedef {import("./ChunkGroup")} ChunkGroup */
+/** @typedef {import("./Compiler")} Compiler */
 /** @typedef {import("./DependenciesBlock")} DependenciesBlock */
+/** @typedef {import("./Dependency").ReferencedExport} ReferencedExport */
+/** @typedef {import("./ExportsInfo")} ExportsInfo */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./util/runtime").RuntimeSpec} RuntimeSpec */
 
-/** @typedef {false | true | string[]} UsedExports */
+const { NO_EXPORTS_REFERENCED, EXPORTS_OBJECT_REFERENCED } = Dependency;
 
-const addToSet = (a, b) => {
-	for (const item of b) {
-		if (!a.includes(item)) a.push(item);
-	}
-	return a;
-};
-
-const isSubset = (biggerSet, subset) => {
-	if (biggerSet === true) return true;
-	if (subset === true) return false;
-	return subset.every(item => biggerSet.indexOf(item) >= 0);
-};
+const PLUGIN_NAME = "FlagDependencyUsagePlugin";
+const PLUGIN_LOGGER_NAME = `webpack.${PLUGIN_NAME}`;
 
 class FlagDependencyUsagePlugin {
+	/**
+	 * @param {boolean} global do a global analysis instead of per runtime
+	 */
+	constructor(global) {
+		this.global = global;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		compiler.hooks.compilation.tap("FlagDependencyUsagePlugin", compilation => {
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			const moduleGraph = compilation.moduleGraph;
 			compilation.hooks.optimizeDependencies.tap(
-				"FlagDependencyUsagePlugin",
+				{ name: PLUGIN_NAME, stage: STAGE_DEFAULT },
 				modules => {
-					const processModule = (module, usedExports) => {
-						module.used = true;
-						if (module.usedExports === true) return;
-						if (usedExports === true) {
-							module.usedExports = true;
-						} else if (Array.isArray(usedExports)) {
-							const old = module.usedExports ? module.usedExports.length : -1;
-							module.usedExports = addToSet(
-								module.usedExports || [],
-								usedExports
-							);
-							if (module.usedExports.length === old) {
+					if (compilation.moduleMemCaches) {
+						throw new Error(
+							"optimization.usedExports can't be used with cacheUnaffected as export usage is a global effect"
+						);
+					}
+
+					const logger = compilation.getLogger(PLUGIN_LOGGER_NAME);
+					/** @type {Map} */
+					const exportInfoToModuleMap = new Map();
+
+					/** @type {TupleQueue} */
+					const queue = new TupleQueue();
+
+					/**
+					 * @param {Module} module module to process
+					 * @param {(string[] | ReferencedExport)[]} usedExports list of used exports
+					 * @param {RuntimeSpec} runtime part of which runtime
+					 * @param {boolean} forceSideEffects always apply side effects
+					 * @returns {void}
+					 */
+					const processReferencedModule = (
+						module,
+						usedExports,
+						runtime,
+						forceSideEffects
+					) => {
+						const exportsInfo = moduleGraph.getExportsInfo(module);
+						if (usedExports.length > 0) {
+							if (!module.buildMeta || !module.buildMeta.exportsType) {
+								if (exportsInfo.setUsedWithoutInfo(runtime)) {
+									queue.enqueue(module, runtime);
+								}
 								return;
 							}
-						} else if (Array.isArray(module.usedExports)) {
-							return;
+							for (const usedExportInfo of usedExports) {
+								let usedExport;
+								let canMangle = true;
+								if (Array.isArray(usedExportInfo)) {
+									usedExport = usedExportInfo;
+								} else {
+									usedExport = usedExportInfo.name;
+									canMangle = usedExportInfo.canMangle !== false;
+								}
+								if (usedExport.length === 0) {
+									if (exportsInfo.setUsedInUnknownWay(runtime)) {
+										queue.enqueue(module, runtime);
+									}
+								} else {
+									let currentExportsInfo = exportsInfo;
+									for (let i = 0; i < usedExport.length; i++) {
+										const exportInfo = currentExportsInfo.getExportInfo(
+											usedExport[i]
+										);
+										if (canMangle === false) {
+											exportInfo.canMangleUse = false;
+										}
+										const lastOne = i === usedExport.length - 1;
+										if (!lastOne) {
+											const nestedInfo = exportInfo.getNestedExportsInfo();
+											if (nestedInfo) {
+												if (
+													exportInfo.setUsedConditionally(
+														used => used === UsageState.Unused,
+														UsageState.OnlyPropertiesUsed,
+														runtime
+													)
+												) {
+													const currentModule =
+														currentExportsInfo === exportsInfo
+															? module
+															: exportInfoToModuleMap.get(currentExportsInfo);
+													if (currentModule) {
+														queue.enqueue(currentModule, runtime);
+													}
+												}
+												currentExportsInfo = nestedInfo;
+												continue;
+											}
+										}
+										if (
+											exportInfo.setUsedConditionally(
+												v => v !== UsageState.Used,
+												UsageState.Used,
+												runtime
+											)
+										) {
+											const currentModule =
+												currentExportsInfo === exportsInfo
+													? module
+													: exportInfoToModuleMap.get(currentExportsInfo);
+											if (currentModule) {
+												queue.enqueue(currentModule, runtime);
+											}
+										}
+										break;
+									}
+								}
+							}
 						} else {
-							module.usedExports = false;
-						}
-
-						// for a module without side effects we stop tracking usage here when no export is used
-						// This module won't be evaluated in this case
-						if (module.factoryMeta.sideEffectFree) {
-							if (module.usedExports === false) return;
+							// for a module without side effects we stop tracking usage here when no export is used
+							// This module won't be evaluated in this case
+							// TODO webpack 6 remove this check
 							if (
-								Array.isArray(module.usedExports) &&
-								module.usedExports.length === 0
-							)
+								!forceSideEffects &&
+								module.factoryMeta !== undefined &&
+								module.factoryMeta.sideEffectFree
+							) {
 								return;
+							}
+							if (exportsInfo.setUsedForSideEffectsOnly(runtime)) {
+								queue.enqueue(module, runtime);
+							}
 						}
-
-						queue.push([module, module, module.usedExports]);
 					};
 
-					const processDependenciesBlock = (module, depBlock, usedExports) => {
-						for (const dep of depBlock.dependencies) {
-							processDependency(module, dep);
-						}
-						for (const variable of depBlock.variables) {
-							for (const dep of variable.dependencies) {
-								processDependency(module, dep);
+					/**
+					 * @param {DependenciesBlock} module the module
+					 * @param {RuntimeSpec} runtime part of which runtime
+					 * @param {boolean} forceSideEffects always apply side effects
+					 * @returns {void}
+					 */
+					const processModule = (module, runtime, forceSideEffects) => {
+						/** @type {Map>} */
+						const map = new Map();
+
+						/** @type {ArrayQueue} */
+						const queue = new ArrayQueue();
+						queue.enqueue(module);
+						for (;;) {
+							const block = queue.dequeue();
+							if (block === undefined) break;
+							for (const b of block.blocks) {
+								if (
+									!this.global &&
+									b.groupOptions &&
+									b.groupOptions.entryOptions
+								) {
+									processModule(
+										b,
+										b.groupOptions.entryOptions.runtime || undefined,
+										true
+									);
+								} else {
+									queue.enqueue(b);
+								}
+							}
+							for (const dep of block.dependencies) {
+								const connection = moduleGraph.getConnection(dep);
+								if (!connection || !connection.module) {
+									continue;
+								}
+								const activeState = connection.getActiveState(runtime);
+								if (activeState === false) continue;
+								const { module } = connection;
+								if (activeState === ModuleGraphConnection.TRANSITIVE_ONLY) {
+									processModule(module, runtime, false);
+									continue;
+								}
+								const oldReferencedExports = map.get(module);
+								if (oldReferencedExports === EXPORTS_OBJECT_REFERENCED) {
+									continue;
+								}
+								const referencedExports =
+									compilation.getDependencyReferencedExports(dep, runtime);
+								if (
+									oldReferencedExports === undefined ||
+									oldReferencedExports === NO_EXPORTS_REFERENCED ||
+									referencedExports === EXPORTS_OBJECT_REFERENCED
+								) {
+									map.set(module, referencedExports);
+								} else if (
+									oldReferencedExports !== undefined &&
+									referencedExports === NO_EXPORTS_REFERENCED
+								) {
+									continue;
+								} else {
+									let exportsMap;
+									if (Array.isArray(oldReferencedExports)) {
+										exportsMap = new Map();
+										for (const item of oldReferencedExports) {
+											if (Array.isArray(item)) {
+												exportsMap.set(item.join("\n"), item);
+											} else {
+												exportsMap.set(item.name.join("\n"), item);
+											}
+										}
+										map.set(module, exportsMap);
+									} else {
+										exportsMap = oldReferencedExports;
+									}
+									for (const item of referencedExports) {
+										if (Array.isArray(item)) {
+											const key = item.join("\n");
+											const oldItem = exportsMap.get(key);
+											if (oldItem === undefined) {
+												exportsMap.set(key, item);
+											}
+											// if oldItem is already an array we have to do nothing
+											// if oldItem is an ReferencedExport object, we don't have to do anything
+											// as canMangle defaults to true for arrays
+										} else {
+											const key = item.name.join("\n");
+											const oldItem = exportsMap.get(key);
+											if (oldItem === undefined || Array.isArray(oldItem)) {
+												exportsMap.set(key, item);
+											} else {
+												exportsMap.set(key, {
+													name: item.name,
+													canMangle: item.canMangle && oldItem.canMangle
+												});
+											}
+										}
+									}
+								}
 							}
 						}
-						for (const block of depBlock.blocks) {
-							queue.push([module, block, usedExports]);
-						}
-					};
 
-					const processDependency = (module, dep) => {
-						const reference = compilation.getDependencyReference(module, dep);
-						if (!reference) return;
-						const referenceModule = reference.module;
-						const importedNames = reference.importedNames;
-						const oldUsed = referenceModule.used;
-						const oldUsedExports = referenceModule.usedExports;
-						if (
-							!oldUsed ||
-							(importedNames &&
-								(!oldUsedExports || !isSubset(oldUsedExports, importedNames)))
-						) {
-							processModule(referenceModule, importedNames);
+						for (const [module, referencedExports] of map) {
+							if (Array.isArray(referencedExports)) {
+								processReferencedModule(
+									module,
+									referencedExports,
+									runtime,
+									forceSideEffects
+								);
+							} else {
+								processReferencedModule(
+									module,
+									Array.from(referencedExports.values()),
+									runtime,
+									forceSideEffects
+								);
+							}
 						}
 					};
 
+					logger.time("initialize exports usage");
 					for (const module of modules) {
-						module.used = false;
+						const exportsInfo = moduleGraph.getExportsInfo(module);
+						exportInfoToModuleMap.set(exportsInfo, module);
+						exportsInfo.setHasUseInfo();
 					}
+					logger.timeEnd("initialize exports usage");
 
-					/** @type {[Module, DependenciesBlock, UsedExports][]} */
-					const queue = [];
-					for (const preparedEntrypoint of compilation._preparedEntrypoints) {
-						if (preparedEntrypoint.module) {
-							processModule(preparedEntrypoint.module, true);
+					logger.time("trace exports usage in graph");
+
+					/**
+					 * @param {Dependency} dep dependency
+					 * @param {RuntimeSpec} runtime runtime
+					 */
+					const processEntryDependency = (dep, runtime) => {
+						const module = moduleGraph.getModule(dep);
+						if (module) {
+							processReferencedModule(
+								module,
+								NO_EXPORTS_REFERENCED,
+								runtime,
+								true
+							);
+						}
+					};
+					/** @type {RuntimeSpec} */
+					let globalRuntime;
+					for (const [
+						entryName,
+						{ dependencies: deps, includeDependencies: includeDeps, options }
+					] of compilation.entries) {
+						const runtime = this.global
+							? undefined
+							: getEntryRuntime(compilation, entryName, options);
+						for (const dep of deps) {
+							processEntryDependency(dep, runtime);
 						}
+						for (const dep of includeDeps) {
+							processEntryDependency(dep, runtime);
+						}
+						globalRuntime = mergeRuntimeOwned(globalRuntime, runtime);
+					}
+					for (const dep of compilation.globalEntry.dependencies) {
+						processEntryDependency(dep, globalRuntime);
+					}
+					for (const dep of compilation.globalEntry.includeDependencies) {
+						processEntryDependency(dep, globalRuntime);
 					}
 
 					while (queue.length) {
-						const queueItem = queue.pop();
-						processDependenciesBlock(queueItem[0], queueItem[1], queueItem[2]);
+						const [module, runtime] = /** @type {[Module, RuntimeSpec]} */ (
+							queue.dequeue()
+						);
+						processModule(module, runtime, false);
 					}
+					logger.timeEnd("trace exports usage in graph");
 				}
 			);
 		});
 	}
 }
+
 module.exports = FlagDependencyUsagePlugin;
diff --git a/lib/FlagEntryExportAsUsedPlugin.js b/lib/FlagEntryExportAsUsedPlugin.js
new file mode 100644
index 00000000000..d2826d12fb2
--- /dev/null
+++ b/lib/FlagEntryExportAsUsedPlugin.js
@@ -0,0 +1,56 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { getEntryRuntime } = require("./util/runtime");
+
+/** @typedef {import("./Compiler")} Compiler */
+
+const PLUGIN_NAME = "FlagEntryExportAsUsedPlugin";
+
+class FlagEntryExportAsUsedPlugin {
+	/**
+	 * @param {boolean} nsObjectUsed true, if the ns object is used
+	 * @param {string} explanation explanation for the reason
+	 */
+	constructor(nsObjectUsed, explanation) {
+		this.nsObjectUsed = nsObjectUsed;
+		this.explanation = explanation;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.thisCompilation.tap(PLUGIN_NAME, compilation => {
+			const moduleGraph = compilation.moduleGraph;
+			compilation.hooks.seal.tap(PLUGIN_NAME, () => {
+				for (const [
+					entryName,
+					{ dependencies: deps, options }
+				] of compilation.entries) {
+					const runtime = getEntryRuntime(compilation, entryName, options);
+					for (const dep of deps) {
+						const module = moduleGraph.getModule(dep);
+						if (module) {
+							const exportsInfo = moduleGraph.getExportsInfo(module);
+							if (this.nsObjectUsed) {
+								exportsInfo.setUsedInUnknownWay(runtime);
+							} else {
+								exportsInfo.setAllKnownExportsUsed(runtime);
+							}
+							moduleGraph.addExtraReason(module, this.explanation);
+						}
+					}
+				}
+			});
+		});
+	}
+}
+
+module.exports = FlagEntryExportAsUsedPlugin;
diff --git a/lib/FlagInitialModulesAsUsedPlugin.js b/lib/FlagInitialModulesAsUsedPlugin.js
deleted file mode 100644
index 7272ddb3a35..00000000000
--- a/lib/FlagInitialModulesAsUsedPlugin.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-class FlagInitialModulesAsUsedPlugin {
-	constructor(explanation) {
-		this.explanation = explanation;
-	}
-
-	apply(compiler) {
-		compiler.hooks.compilation.tap(
-			"FlagInitialModulesAsUsedPlugin",
-			compilation => {
-				compilation.hooks.afterOptimizeChunks.tap(
-					"FlagInitialModulesAsUsedPlugin",
-					chunks => {
-						for (const chunk of chunks) {
-							if (!chunk.isOnlyInitial()) {
-								return;
-							}
-							for (const module of chunk.modulesIterable) {
-								module.used = true;
-								module.usedExports = true;
-								module.addReason(null, null, this.explanation);
-							}
-						}
-					}
-				);
-			}
-		);
-	}
-}
-
-module.exports = FlagInitialModulesAsUsedPlugin;
diff --git a/lib/FunctionModulePlugin.js b/lib/FunctionModulePlugin.js
deleted file mode 100644
index fc4b2707f0a..00000000000
--- a/lib/FunctionModulePlugin.js
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const FunctionModuleTemplatePlugin = require("./FunctionModuleTemplatePlugin");
-
-class FunctionModulePlugin {
-	apply(compiler) {
-		compiler.hooks.compilation.tap("FunctionModulePlugin", compilation => {
-			new FunctionModuleTemplatePlugin().apply(
-				compilation.moduleTemplates.javascript
-			);
-		});
-	}
-}
-
-module.exports = FunctionModulePlugin;
diff --git a/lib/FunctionModuleTemplatePlugin.js b/lib/FunctionModuleTemplatePlugin.js
deleted file mode 100644
index cf2e1b0eae4..00000000000
--- a/lib/FunctionModuleTemplatePlugin.js
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const { ConcatSource } = require("webpack-sources");
-const Template = require("./Template");
-
-class FunctionModuleTemplatePlugin {
-	apply(moduleTemplate) {
-		moduleTemplate.hooks.render.tap(
-			"FunctionModuleTemplatePlugin",
-			(moduleSource, module) => {
-				const source = new ConcatSource();
-				const args = [module.moduleArgument];
-				// TODO remove HACK checking type for javascript
-				if (module.type && module.type.startsWith("javascript")) {
-					args.push(module.exportsArgument);
-					if (module.hasDependencies(d => d.requireWebpackRequire !== false)) {
-						args.push("__webpack_require__");
-					}
-				} else if (module.type && module.type.startsWith("json")) {
-					// no additional arguments needed
-				} else {
-					args.push(module.exportsArgument, "__webpack_require__");
-				}
-				source.add("/***/ (function(" + args.join(", ") + ") {\n\n");
-				if (module.buildInfo.strict) source.add('"use strict";\n');
-				source.add(moduleSource);
-				source.add("\n\n/***/ })");
-				return source;
-			}
-		);
-
-		moduleTemplate.hooks.package.tap(
-			"FunctionModuleTemplatePlugin",
-			(moduleSource, module) => {
-				if (moduleTemplate.runtimeTemplate.outputOptions.pathinfo) {
-					const source = new ConcatSource();
-					const req = module.readableIdentifier(
-						moduleTemplate.runtimeTemplate.requestShortener
-					);
-					source.add("/*!****" + req.replace(/./g, "*") + "****!*\\\n");
-					source.add("  !*** " + req.replace(/\*\//g, "*_/") + " ***!\n");
-					source.add("  \\****" + req.replace(/./g, "*") + "****/\n");
-					if (
-						Array.isArray(module.buildMeta.providedExports) &&
-						module.buildMeta.providedExports.length === 0
-					) {
-						source.add(Template.toComment("no exports provided") + "\n");
-					} else if (Array.isArray(module.buildMeta.providedExports)) {
-						source.add(
-							Template.toComment(
-								"exports provided: " +
-									module.buildMeta.providedExports.join(", ")
-							) + "\n"
-						);
-					} else if (module.buildMeta.providedExports) {
-						source.add(Template.toComment("no static exports found") + "\n");
-					}
-					if (
-						Array.isArray(module.usedExports) &&
-						module.usedExports.length === 0
-					) {
-						source.add(Template.toComment("no exports used") + "\n");
-					} else if (Array.isArray(module.usedExports)) {
-						source.add(
-							Template.toComment(
-								"exports used: " + module.usedExports.join(", ")
-							) + "\n"
-						);
-					} else if (module.usedExports) {
-						source.add(Template.toComment("all exports used") + "\n");
-					}
-					if (module.optimizationBailout) {
-						for (const text of module.optimizationBailout) {
-							let code;
-							if (typeof text === "function") {
-								code = text(moduleTemplate.runtimeTemplate.requestShortener);
-							} else {
-								code = text;
-							}
-							source.add(Template.toComment(`${code}`) + "\n");
-						}
-					}
-					source.add(moduleSource);
-					return source;
-				}
-				return moduleSource;
-			}
-		);
-
-		moduleTemplate.hooks.hash.tap("FunctionModuleTemplatePlugin", hash => {
-			hash.update("FunctionModuleTemplatePlugin");
-			hash.update("2");
-		});
-	}
-}
-module.exports = FunctionModuleTemplatePlugin;
diff --git a/lib/Generator.js b/lib/Generator.js
index 655a9b1da81..a00b3c644f6 100644
--- a/lib/Generator.js
+++ b/lib/Generator.js
@@ -2,58 +2,181 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("./ChunkGraph")} ChunkGraph */
+/** @typedef {import("./CodeGenerationResults")} CodeGenerationResults */
+/** @typedef {import("./Compilation")} Compilation */
+/** @typedef {import("./ConcatenationScope")} ConcatenationScope */
+/** @typedef {import("./DependencyTemplate")} DependencyTemplate */
+/** @typedef {import("./DependencyTemplates")} DependencyTemplates */
+/** @typedef {import("./Module").ConcatenationBailoutReasonContext} ConcatenationBailoutReasonContext */
+/** @typedef {import("./Module").RuntimeRequirements} RuntimeRequirements */
+/** @typedef {import("./Module").SourceTypes} SourceTypes */
+/** @typedef {import("./ModuleGraph")} ModuleGraph */
 /** @typedef {import("./NormalModule")} NormalModule */
 /** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */
-/** @typedef {import("webpack-sources").Source} Source */
-/** @typedef {import("./Dependency").DependencyTemplate} DependencyTemplate */
+/** @typedef {import("./util/Hash")} Hash */
+/** @typedef {import("./util/runtime").RuntimeSpec} RuntimeSpec */
+
+/**
+ * @typedef {object} GenerateContext
+ * @property {DependencyTemplates} dependencyTemplates mapping from dependencies to templates
+ * @property {RuntimeTemplate} runtimeTemplate the runtime template
+ * @property {ModuleGraph} moduleGraph the module graph
+ * @property {ChunkGraph} chunkGraph the chunk graph
+ * @property {RuntimeRequirements} runtimeRequirements the requirements for runtime
+ * @property {RuntimeSpec} runtime the runtime
+ * @property {ConcatenationScope=} concatenationScope when in concatenated module, information about other concatenated modules
+ * @property {CodeGenerationResults=} codeGenerationResults code generation results of other modules (need to have a codeGenerationDependency to use that)
+ * @property {string} type which kind of code should be generated
+ * @property {() => Map=} getData get access to the code generation data
+ */
 
 /**
- *
+ * @callback GenerateErrorFn
+ * @param {Error} error the error
+ * @param {NormalModule} module module for which the code should be generated
+ * @param {GenerateContext} generateContext context for generate
+ * @returns {Source | null} generated code
  */
+
+/**
+ * @typedef {object} UpdateHashContext
+ * @property {NormalModule} module the module
+ * @property {ChunkGraph} chunkGraph
+ * @property {RuntimeSpec} runtime
+ * @property {RuntimeTemplate=} runtimeTemplate
+ */
+
 class Generator {
+	/**
+	 * @param {Record} map map of types
+	 * @returns {ByTypeGenerator} generator by type
+	 */
 	static byType(map) {
 		return new ByTypeGenerator(map);
 	}
 
+	/* istanbul ignore next */
+	/**
+	 * @abstract
+	 * @param {NormalModule} module fresh module
+	 * @returns {SourceTypes} available types (do not mutate)
+	 */
+	getTypes(module) {
+		const AbstractMethodError = require("./AbstractMethodError");
+		throw new AbstractMethodError();
+	}
+
+	/* istanbul ignore next */
+	/**
+	 * @abstract
+	 * @param {NormalModule} module the module
+	 * @param {string=} type source type
+	 * @returns {number} estimate size of the module
+	 */
+	getSize(module, type) {
+		const AbstractMethodError = require("./AbstractMethodError");
+		throw new AbstractMethodError();
+	}
+
+	/* istanbul ignore next */
 	/**
 	 * @abstract
 	 * @param {NormalModule} module module for which the code should be generated
-	 * @param {Map} dependencyTemplates mapping from dependencies to templates
-	 * @param {RuntimeTemplate} runtimeTemplate the runtime template
-	 * @param {string} type which kind of code should be generated
-	 * @returns {Source} generated code
+	 * @param {GenerateContext} generateContext context for generate
+	 * @returns {Source | null} generated code
+	 */
+	generate(
+		module,
+		{ dependencyTemplates, runtimeTemplate, moduleGraph, type }
+	) {
+		const AbstractMethodError = require("./AbstractMethodError");
+		throw new AbstractMethodError();
+	}
+
+	/**
+	 * @param {NormalModule} module module for which the bailout reason should be determined
+	 * @param {ConcatenationBailoutReasonContext} context context
+	 * @returns {string | undefined} reason why this module can't be concatenated, undefined when it can be concatenated
+	 */
+	getConcatenationBailoutReason(module, context) {
+		return `Module Concatenation is not implemented for ${this.constructor.name}`;
+	}
+
+	/**
+	 * @param {Hash} hash hash that will be modified
+	 * @param {UpdateHashContext} updateHashContext context for updating hash
 	 */
-	generate(module, dependencyTemplates, runtimeTemplate, type) {
-		throw new Error("Generator.generate: must be overridden");
+	updateHash(hash, { module, runtime }) {
+		// no nothing
 	}
 }
 
+/**
+ * @this {ByTypeGenerator}
+ * @type {GenerateErrorFn}
+ */
+function generateError(error, module, generateContext) {
+	const type = generateContext.type;
+	const generator =
+		/** @type {Generator & { generateError?: GenerateErrorFn }} */
+		(this.map[type]);
+	if (!generator) {
+		throw new Error(`Generator.byType: no generator specified for ${type}`);
+	}
+	if (typeof generator.generateError === "undefined") {
+		return null;
+	}
+	return generator.generateError(error, module, generateContext);
+}
+
 class ByTypeGenerator extends Generator {
+	/**
+	 * @param {Record} map map of types
+	 */
 	constructor(map) {
 		super();
 		this.map = map;
+		this._types = new Set(Object.keys(map));
+		/** @type {GenerateErrorFn | undefined} */
+		this.generateError = generateError.bind(this);
+	}
+
+	/**
+	 * @param {NormalModule} module fresh module
+	 * @returns {SourceTypes} available types (do not mutate)
+	 */
+	getTypes(module) {
+		return this._types;
+	}
+
+	/**
+	 * @param {NormalModule} module the module
+	 * @param {string=} type source type
+	 * @returns {number} estimate size of the module
+	 */
+	getSize(module, type = "javascript") {
+		const t = type;
+		const generator = this.map[t];
+		return generator ? generator.getSize(module, t) : 0;
 	}
 
 	/**
 	 * @param {NormalModule} module module for which the code should be generated
-	 * @param {Map} dependencyTemplates mapping from dependencies to templates
-	 * @param {RuntimeTemplate} runtimeTemplate the runtime template
-	 * @param {string} type which kind of code should be generated
-	 * @returns {Source} generated code
+	 * @param {GenerateContext} generateContext context for generate
+	 * @returns {Source | null} generated code
 	 */
-	generate(module, dependencyTemplates, runtimeTemplate, type) {
+	generate(module, generateContext) {
+		const type = generateContext.type;
 		const generator = this.map[type];
 		if (!generator) {
 			throw new Error(`Generator.byType: no generator specified for ${type}`);
 		}
-		return generator.generate(
-			module,
-			dependencyTemplates,
-			runtimeTemplate,
-			type
-		);
+		return generator.generate(module, generateContext);
 	}
 }
 
diff --git a/lib/GraphHelpers.js b/lib/GraphHelpers.js
index 73c567442d5..65d7087281d 100644
--- a/lib/GraphHelpers.js
+++ b/lib/GraphHelpers.js
@@ -1,8 +1,15 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+/** @typedef {import("./AsyncDependenciesBlock")} AsyncDependenciesBlock */
 /** @typedef {import("./Chunk")} Chunk */
 /** @typedef {import("./ChunkGroup")} ChunkGroup */
-/** @typedef {import("./Module")} Module */
 /** @typedef {import("./DependenciesBlock")} DependenciesBlock */
-/** @typedef {import("./AsyncDependenciesBlock")} AsyncDependenciesBlock */
+/** @typedef {import("./Module")} Module */
 
 /**
  * @param {ChunkGroup} chunkGroup the ChunkGroup to connect
@@ -26,40 +33,6 @@ const connectChunkGroupParentAndChild = (parent, child) => {
 	}
 };
 
-/**
- * @param {Chunk} chunk Chunk to connect to Module
- * @param {Module} module Module to connect to Chunk
- * @returns {void}
- */
-const connectChunkAndModule = (chunk, module) => {
-	if (module.addChunk(chunk)) {
-		chunk.addModule(module);
-	}
-};
-
-/**
- * @param {Chunk} chunk Chunk being disconnected
- * @param {Module} module Module being disconnected
- * @returns {void}
- */
-const disconnectChunkAndModule = (chunk, module) => {
-	chunk.removeModule(module);
-	module.removeChunk(chunk);
-};
-
-/**
- * @param {AsyncDependenciesBlock} depBlock DepBlock being tied to ChunkGroup
- * @param {ChunkGroup} chunkGroup ChunkGroup being tied to DepBlock
- * @returns {void}
- */
-const connectDependenciesBlockAndChunkGroup = (depBlock, chunkGroup) => {
-	if (chunkGroup.addBlock(depBlock)) {
-		depBlock.chunkGroup = chunkGroup;
-	}
-};
-
-exports.connectChunkGroupAndChunk = connectChunkGroupAndChunk;
-exports.connectChunkGroupParentAndChild = connectChunkGroupParentAndChild;
-exports.connectChunkAndModule = connectChunkAndModule;
-exports.disconnectChunkAndModule = disconnectChunkAndModule;
-exports.connectDependenciesBlockAndChunkGroup = connectDependenciesBlockAndChunkGroup;
+module.exports.connectChunkGroupAndChunk = connectChunkGroupAndChunk;
+module.exports.connectChunkGroupParentAndChild =
+	connectChunkGroupParentAndChild;
diff --git a/lib/HarmonyLinkingError.js b/lib/HarmonyLinkingError.js
index 78ce16dde45..8259beca634 100644
--- a/lib/HarmonyLinkingError.js
+++ b/lib/HarmonyLinkingError.js
@@ -1,6 +1,7 @@
 /*
 	MIT License http://www.opensource.org/licenses/mit-license.php
 */
+
 "use strict";
 
 const WebpackError = require("./WebpackError");
@@ -11,7 +12,5 @@ module.exports = class HarmonyLinkingError extends WebpackError {
 		super(message);
 		this.name = "HarmonyLinkingError";
 		this.hideStack = true;
-
-		Error.captureStackTrace(this, this.constructor);
 	}
 };
diff --git a/lib/HashedModuleIdsPlugin.js b/lib/HashedModuleIdsPlugin.js
deleted file mode 100644
index 0c720c181b2..00000000000
--- a/lib/HashedModuleIdsPlugin.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-const createHash = require("./util/createHash");
-
-const validateOptions = require("schema-utils");
-const schema = require("../schemas/plugins/HashedModuleIdsPlugin.json");
-
-/** @typedef {import("../declarations/plugins/HashedModuleIdsPlugin").HashedModuleIdsPluginOptions} HashedModuleIdsPluginOptions */
-
-class HashedModuleIdsPlugin {
-	/**
-	 * @param {HashedModuleIdsPluginOptions=} options options object
-	 */
-	constructor(options) {
-		if (!options) options = {};
-
-		validateOptions(schema, options, "Hashed Module Ids Plugin");
-
-		/** @type {HashedModuleIdsPluginOptions} */
-		this.options = Object.assign(
-			{
-				context: null,
-				hashFunction: "md4",
-				hashDigest: "base64",
-				hashDigestLength: 4
-			},
-			options
-		);
-	}
-
-	apply(compiler) {
-		const options = this.options;
-		compiler.hooks.compilation.tap("HashedModuleIdsPlugin", compilation => {
-			const usedIds = new Set();
-			compilation.hooks.beforeModuleIds.tap(
-				"HashedModuleIdsPlugin",
-				modules => {
-					for (const module of modules) {
-						if (module.id === null && module.libIdent) {
-							const id = module.libIdent({
-								context: this.options.context || compiler.options.context
-							});
-							const hash = createHash(options.hashFunction);
-							hash.update(id);
-							const hashId = hash.digest(options.hashDigest);
-							let len = options.hashDigestLength;
-							while (usedIds.has(hashId.substr(0, len))) len++;
-							module.id = hashId.substr(0, len);
-							usedIds.add(module.id);
-						}
-					}
-				}
-			);
-		});
-	}
-}
-
-module.exports = HashedModuleIdsPlugin;
diff --git a/lib/HookWebpackError.js b/lib/HookWebpackError.js
new file mode 100644
index 00000000000..127421f36a7
--- /dev/null
+++ b/lib/HookWebpackError.js
@@ -0,0 +1,91 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Sean Larkin @thelarkinn
+*/
+
+"use strict";
+
+const WebpackError = require("./WebpackError");
+
+/** @typedef {import("./Module")} Module */
+
+/**
+ * @template T
+ * @callback Callback
+ * @param {Error | null} err
+ * @param {T=} stats
+ * @returns {void}
+ */
+
+class HookWebpackError extends WebpackError {
+	/**
+	 * Creates an instance of HookWebpackError.
+	 * @param {Error} error inner error
+	 * @param {string} hook name of hook
+	 */
+	constructor(error, hook) {
+		super(error.message);
+
+		this.name = "HookWebpackError";
+		this.hook = hook;
+		this.error = error;
+		this.hideStack = true;
+		this.details = `caused by plugins in ${hook}\n${error.stack}`;
+
+		this.stack += `\n-- inner error --\n${error.stack}`;
+	}
+}
+
+module.exports = HookWebpackError;
+
+/**
+ * @param {Error} error an error
+ * @param {string} hook name of the hook
+ * @returns {WebpackError} a webpack error
+ */
+const makeWebpackError = (error, hook) => {
+	if (error instanceof WebpackError) return error;
+	return new HookWebpackError(error, hook);
+};
+module.exports.makeWebpackError = makeWebpackError;
+
+/**
+ * @template T
+ * @param {(err: WebpackError | null, result?: T) => void} callback webpack error callback
+ * @param {string} hook name of hook
+ * @returns {Callback} generic callback
+ */
+const makeWebpackErrorCallback = (callback, hook) => (err, result) => {
+	if (err) {
+		if (err instanceof WebpackError) {
+			callback(err);
+			return;
+		}
+		callback(new HookWebpackError(err, hook));
+		return;
+	}
+	callback(null, result);
+};
+
+module.exports.makeWebpackErrorCallback = makeWebpackErrorCallback;
+
+/**
+ * @template T
+ * @param {() => T} fn function which will be wrapping in try catch
+ * @param {string} hook name of hook
+ * @returns {T} the result
+ */
+const tryRunOrWebpackError = (fn, hook) => {
+	let r;
+	try {
+		r = fn();
+	} catch (err) {
+		if (err instanceof WebpackError) {
+			throw err;
+		}
+		throw new HookWebpackError(/** @type {Error} */ (err), hook);
+	}
+	return r;
+};
+
+module.exports.tryRunOrWebpackError = tryRunOrWebpackError;
diff --git a/lib/HotModuleReplacement.runtime.js b/lib/HotModuleReplacement.runtime.js
deleted file mode 100644
index 5497091c817..00000000000
--- a/lib/HotModuleReplacement.runtime.js
+++ /dev/null
@@ -1,645 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-/*global $hash$ $requestTimeout$ installedModules $require$ hotDownloadManifest hotDownloadUpdateChunk hotDisposeChunk modules */
-module.exports = function() {
-	var hotApplyOnUpdate = true;
-	// eslint-disable-next-line no-unused-vars
-	var hotCurrentHash = $hash$;
-	var hotRequestTimeout = $requestTimeout$;
-	var hotCurrentModuleData = {};
-	var hotCurrentChildModule;
-	// eslint-disable-next-line no-unused-vars
-	var hotCurrentParents = [];
-	// eslint-disable-next-line no-unused-vars
-	var hotCurrentParentsTemp = [];
-
-	// eslint-disable-next-line no-unused-vars
-	function hotCreateRequire(moduleId) {
-		var me = installedModules[moduleId];
-		if (!me) return $require$;
-		var fn = function(request) {
-			if (me.hot.active) {
-				if (installedModules[request]) {
-					if (installedModules[request].parents.indexOf(moduleId) === -1) {
-						installedModules[request].parents.push(moduleId);
-					}
-				} else {
-					hotCurrentParents = [moduleId];
-					hotCurrentChildModule = request;
-				}
-				if (me.children.indexOf(request) === -1) {
-					me.children.push(request);
-				}
-			} else {
-				console.warn(
-					"[HMR] unexpected require(" +
-						request +
-						") from disposed module " +
-						moduleId
-				);
-				hotCurrentParents = [];
-			}
-			return $require$(request);
-		};
-		var ObjectFactory = function ObjectFactory(name) {
-			return {
-				configurable: true,
-				enumerable: true,
-				get: function() {
-					return $require$[name];
-				},
-				set: function(value) {
-					$require$[name] = value;
-				}
-			};
-		};
-		for (var name in $require$) {
-			if (
-				Object.prototype.hasOwnProperty.call($require$, name) &&
-				name !== "e" &&
-				name !== "t"
-			) {
-				Object.defineProperty(fn, name, ObjectFactory(name));
-			}
-		}
-		fn.e = function(chunkId) {
-			if (hotStatus === "ready") hotSetStatus("prepare");
-			hotChunksLoading++;
-			return $require$.e(chunkId).then(finishChunkLoading, function(err) {
-				finishChunkLoading();
-				throw err;
-			});
-
-			function finishChunkLoading() {
-				hotChunksLoading--;
-				if (hotStatus === "prepare") {
-					if (!hotWaitingFilesMap[chunkId]) {
-						hotEnsureUpdateChunk(chunkId);
-					}
-					if (hotChunksLoading === 0 && hotWaitingFiles === 0) {
-						hotUpdateDownloaded();
-					}
-				}
-			}
-		};
-		fn.t = function(value, mode) {
-			if (mode & 1) value = fn(value);
-			return $require$.t(value, mode & ~1);
-		};
-		return fn;
-	}
-
-	// eslint-disable-next-line no-unused-vars
-	function hotCreateModule(moduleId) {
-		var hot = {
-			// private stuff
-			_acceptedDependencies: {},
-			_declinedDependencies: {},
-			_selfAccepted: false,
-			_selfDeclined: false,
-			_disposeHandlers: [],
-			_main: hotCurrentChildModule !== moduleId,
-
-			// Module API
-			active: true,
-			accept: function(dep, callback) {
-				if (dep === undefined) hot._selfAccepted = true;
-				else if (typeof dep === "function") hot._selfAccepted = dep;
-				else if (typeof dep === "object")
-					for (var i = 0; i < dep.length; i++)
-						hot._acceptedDependencies[dep[i]] = callback || function() {};
-				else hot._acceptedDependencies[dep] = callback || function() {};
-			},
-			decline: function(dep) {
-				if (dep === undefined) hot._selfDeclined = true;
-				else if (typeof dep === "object")
-					for (var i = 0; i < dep.length; i++)
-						hot._declinedDependencies[dep[i]] = true;
-				else hot._declinedDependencies[dep] = true;
-			},
-			dispose: function(callback) {
-				hot._disposeHandlers.push(callback);
-			},
-			addDisposeHandler: function(callback) {
-				hot._disposeHandlers.push(callback);
-			},
-			removeDisposeHandler: function(callback) {
-				var idx = hot._disposeHandlers.indexOf(callback);
-				if (idx >= 0) hot._disposeHandlers.splice(idx, 1);
-			},
-
-			// Management API
-			check: hotCheck,
-			apply: hotApply,
-			status: function(l) {
-				if (!l) return hotStatus;
-				hotStatusHandlers.push(l);
-			},
-			addStatusHandler: function(l) {
-				hotStatusHandlers.push(l);
-			},
-			removeStatusHandler: function(l) {
-				var idx = hotStatusHandlers.indexOf(l);
-				if (idx >= 0) hotStatusHandlers.splice(idx, 1);
-			},
-
-			//inherit from previous dispose call
-			data: hotCurrentModuleData[moduleId]
-		};
-		hotCurrentChildModule = undefined;
-		return hot;
-	}
-
-	var hotStatusHandlers = [];
-	var hotStatus = "idle";
-
-	function hotSetStatus(newStatus) {
-		hotStatus = newStatus;
-		for (var i = 0; i < hotStatusHandlers.length; i++)
-			hotStatusHandlers[i].call(null, newStatus);
-	}
-
-	// while downloading
-	var hotWaitingFiles = 0;
-	var hotChunksLoading = 0;
-	var hotWaitingFilesMap = {};
-	var hotRequestedFilesMap = {};
-	var hotAvailableFilesMap = {};
-	var hotDeferred;
-
-	// The update info
-	var hotUpdate, hotUpdateNewHash;
-
-	function toModuleId(id) {
-		var isNumber = +id + "" === id;
-		return isNumber ? +id : id;
-	}
-
-	function hotCheck(apply) {
-		if (hotStatus !== "idle") {
-			throw new Error("check() is only allowed in idle status");
-		}
-		hotApplyOnUpdate = apply;
-		hotSetStatus("check");
-		return hotDownloadManifest(hotRequestTimeout).then(function(update) {
-			if (!update) {
-				hotSetStatus("idle");
-				return null;
-			}
-			hotRequestedFilesMap = {};
-			hotWaitingFilesMap = {};
-			hotAvailableFilesMap = update.c;
-			hotUpdateNewHash = update.h;
-
-			hotSetStatus("prepare");
-			var promise = new Promise(function(resolve, reject) {
-				hotDeferred = {
-					resolve: resolve,
-					reject: reject
-				};
-			});
-			hotUpdate = {};
-			/*foreachInstalledChunks*/
-			// eslint-disable-next-line no-lone-blocks
-			{
-				/*globals chunkId */
-				hotEnsureUpdateChunk(chunkId);
-			}
-			if (
-				hotStatus === "prepare" &&
-				hotChunksLoading === 0 &&
-				hotWaitingFiles === 0
-			) {
-				hotUpdateDownloaded();
-			}
-			return promise;
-		});
-	}
-
-	// eslint-disable-next-line no-unused-vars
-	function hotAddUpdateChunk(chunkId, moreModules) {
-		if (!hotAvailableFilesMap[chunkId] || !hotRequestedFilesMap[chunkId])
-			return;
-		hotRequestedFilesMap[chunkId] = false;
-		for (var moduleId in moreModules) {
-			if (Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {
-				hotUpdate[moduleId] = moreModules[moduleId];
-			}
-		}
-		if (--hotWaitingFiles === 0 && hotChunksLoading === 0) {
-			hotUpdateDownloaded();
-		}
-	}
-
-	function hotEnsureUpdateChunk(chunkId) {
-		if (!hotAvailableFilesMap[chunkId]) {
-			hotWaitingFilesMap[chunkId] = true;
-		} else {
-			hotRequestedFilesMap[chunkId] = true;
-			hotWaitingFiles++;
-			hotDownloadUpdateChunk(chunkId);
-		}
-	}
-
-	function hotUpdateDownloaded() {
-		hotSetStatus("ready");
-		var deferred = hotDeferred;
-		hotDeferred = null;
-		if (!deferred) return;
-		if (hotApplyOnUpdate) {
-			// Wrap deferred object in Promise to mark it as a well-handled Promise to
-			// avoid triggering uncaught exception warning in Chrome.
-			// See https://bugs.chromium.org/p/chromium/issues/detail?id=465666
-			Promise.resolve()
-				.then(function() {
-					return hotApply(hotApplyOnUpdate);
-				})
-				.then(
-					function(result) {
-						deferred.resolve(result);
-					},
-					function(err) {
-						deferred.reject(err);
-					}
-				);
-		} else {
-			var outdatedModules = [];
-			for (var id in hotUpdate) {
-				if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) {
-					outdatedModules.push(toModuleId(id));
-				}
-			}
-			deferred.resolve(outdatedModules);
-		}
-	}
-
-	function hotApply(options) {
-		if (hotStatus !== "ready")
-			throw new Error("apply() is only allowed in ready status");
-		options = options || {};
-
-		var cb;
-		var i;
-		var j;
-		var module;
-		var moduleId;
-
-		function getAffectedStuff(updateModuleId) {
-			var outdatedModules = [updateModuleId];
-			var outdatedDependencies = {};
-
-			var queue = outdatedModules.slice().map(function(id) {
-				return {
-					chain: [id],
-					id: id
-				};
-			});
-			while (queue.length > 0) {
-				var queueItem = queue.pop();
-				var moduleId = queueItem.id;
-				var chain = queueItem.chain;
-				module = installedModules[moduleId];
-				if (!module || module.hot._selfAccepted) continue;
-				if (module.hot._selfDeclined) {
-					return {
-						type: "self-declined",
-						chain: chain,
-						moduleId: moduleId
-					};
-				}
-				if (module.hot._main) {
-					return {
-						type: "unaccepted",
-						chain: chain,
-						moduleId: moduleId
-					};
-				}
-				for (var i = 0; i < module.parents.length; i++) {
-					var parentId = module.parents[i];
-					var parent = installedModules[parentId];
-					if (!parent) continue;
-					if (parent.hot._declinedDependencies[moduleId]) {
-						return {
-							type: "declined",
-							chain: chain.concat([parentId]),
-							moduleId: moduleId,
-							parentId: parentId
-						};
-					}
-					if (outdatedModules.indexOf(parentId) !== -1) continue;
-					if (parent.hot._acceptedDependencies[moduleId]) {
-						if (!outdatedDependencies[parentId])
-							outdatedDependencies[parentId] = [];
-						addAllToSet(outdatedDependencies[parentId], [moduleId]);
-						continue;
-					}
-					delete outdatedDependencies[parentId];
-					outdatedModules.push(parentId);
-					queue.push({
-						chain: chain.concat([parentId]),
-						id: parentId
-					});
-				}
-			}
-
-			return {
-				type: "accepted",
-				moduleId: updateModuleId,
-				outdatedModules: outdatedModules,
-				outdatedDependencies: outdatedDependencies
-			};
-		}
-
-		function addAllToSet(a, b) {
-			for (var i = 0; i < b.length; i++) {
-				var item = b[i];
-				if (a.indexOf(item) === -1) a.push(item);
-			}
-		}
-
-		// at begin all updates modules are outdated
-		// the "outdated" status can propagate to parents if they don't accept the children
-		var outdatedDependencies = {};
-		var outdatedModules = [];
-		var appliedUpdate = {};
-
-		var warnUnexpectedRequire = function warnUnexpectedRequire() {
-			console.warn(
-				"[HMR] unexpected require(" + result.moduleId + ") to disposed module"
-			);
-		};
-
-		for (var id in hotUpdate) {
-			if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) {
-				moduleId = toModuleId(id);
-				/** @type {TODO} */
-				var result;
-				if (hotUpdate[id]) {
-					result = getAffectedStuff(moduleId);
-				} else {
-					result = {
-						type: "disposed",
-						moduleId: id
-					};
-				}
-				/** @type {Error|false} */
-				var abortError = false;
-				var doApply = false;
-				var doDispose = false;
-				var chainInfo = "";
-				if (result.chain) {
-					chainInfo = "\nUpdate propagation: " + result.chain.join(" -> ");
-				}
-				switch (result.type) {
-					case "self-declined":
-						if (options.onDeclined) options.onDeclined(result);
-						if (!options.ignoreDeclined)
-							abortError = new Error(
-								"Aborted because of self decline: " +
-									result.moduleId +
-									chainInfo
-							);
-						break;
-					case "declined":
-						if (options.onDeclined) options.onDeclined(result);
-						if (!options.ignoreDeclined)
-							abortError = new Error(
-								"Aborted because of declined dependency: " +
-									result.moduleId +
-									" in " +
-									result.parentId +
-									chainInfo
-							);
-						break;
-					case "unaccepted":
-						if (options.onUnaccepted) options.onUnaccepted(result);
-						if (!options.ignoreUnaccepted)
-							abortError = new Error(
-								"Aborted because " + moduleId + " is not accepted" + chainInfo
-							);
-						break;
-					case "accepted":
-						if (options.onAccepted) options.onAccepted(result);
-						doApply = true;
-						break;
-					case "disposed":
-						if (options.onDisposed) options.onDisposed(result);
-						doDispose = true;
-						break;
-					default:
-						throw new Error("Unexception type " + result.type);
-				}
-				if (abortError) {
-					hotSetStatus("abort");
-					return Promise.reject(abortError);
-				}
-				if (doApply) {
-					appliedUpdate[moduleId] = hotUpdate[moduleId];
-					addAllToSet(outdatedModules, result.outdatedModules);
-					for (moduleId in result.outdatedDependencies) {
-						if (
-							Object.prototype.hasOwnProperty.call(
-								result.outdatedDependencies,
-								moduleId
-							)
-						) {
-							if (!outdatedDependencies[moduleId])
-								outdatedDependencies[moduleId] = [];
-							addAllToSet(
-								outdatedDependencies[moduleId],
-								result.outdatedDependencies[moduleId]
-							);
-						}
-					}
-				}
-				if (doDispose) {
-					addAllToSet(outdatedModules, [result.moduleId]);
-					appliedUpdate[moduleId] = warnUnexpectedRequire;
-				}
-			}
-		}
-
-		// Store self accepted outdated modules to require them later by the module system
-		var outdatedSelfAcceptedModules = [];
-		for (i = 0; i < outdatedModules.length; i++) {
-			moduleId = outdatedModules[i];
-			if (
-				installedModules[moduleId] &&
-				installedModules[moduleId].hot._selfAccepted
-			)
-				outdatedSelfAcceptedModules.push({
-					module: moduleId,
-					errorHandler: installedModules[moduleId].hot._selfAccepted
-				});
-		}
-
-		// Now in "dispose" phase
-		hotSetStatus("dispose");
-		Object.keys(hotAvailableFilesMap).forEach(function(chunkId) {
-			if (hotAvailableFilesMap[chunkId] === false) {
-				hotDisposeChunk(chunkId);
-			}
-		});
-
-		var idx;
-		var queue = outdatedModules.slice();
-		while (queue.length > 0) {
-			moduleId = queue.pop();
-			module = installedModules[moduleId];
-			if (!module) continue;
-
-			var data = {};
-
-			// Call dispose handlers
-			var disposeHandlers = module.hot._disposeHandlers;
-			for (j = 0; j < disposeHandlers.length; j++) {
-				cb = disposeHandlers[j];
-				cb(data);
-			}
-			hotCurrentModuleData[moduleId] = data;
-
-			// disable module (this disables requires from this module)
-			module.hot.active = false;
-
-			// remove module from cache
-			delete installedModules[moduleId];
-
-			// when disposing there is no need to call dispose handler
-			delete outdatedDependencies[moduleId];
-
-			// remove "parents" references from all children
-			for (j = 0; j < module.children.length; j++) {
-				var child = installedModules[module.children[j]];
-				if (!child) continue;
-				idx = child.parents.indexOf(moduleId);
-				if (idx >= 0) {
-					child.parents.splice(idx, 1);
-				}
-			}
-		}
-
-		// remove outdated dependency from module children
-		var dependency;
-		var moduleOutdatedDependencies;
-		for (moduleId in outdatedDependencies) {
-			if (
-				Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)
-			) {
-				module = installedModules[moduleId];
-				if (module) {
-					moduleOutdatedDependencies = outdatedDependencies[moduleId];
-					for (j = 0; j < moduleOutdatedDependencies.length; j++) {
-						dependency = moduleOutdatedDependencies[j];
-						idx = module.children.indexOf(dependency);
-						if (idx >= 0) module.children.splice(idx, 1);
-					}
-				}
-			}
-		}
-
-		// Not in "apply" phase
-		hotSetStatus("apply");
-
-		hotCurrentHash = hotUpdateNewHash;
-
-		// insert new code
-		for (moduleId in appliedUpdate) {
-			if (Object.prototype.hasOwnProperty.call(appliedUpdate, moduleId)) {
-				modules[moduleId] = appliedUpdate[moduleId];
-			}
-		}
-
-		// call accept handlers
-		var error = null;
-		for (moduleId in outdatedDependencies) {
-			if (
-				Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)
-			) {
-				module = installedModules[moduleId];
-				if (module) {
-					moduleOutdatedDependencies = outdatedDependencies[moduleId];
-					var callbacks = [];
-					for (i = 0; i < moduleOutdatedDependencies.length; i++) {
-						dependency = moduleOutdatedDependencies[i];
-						cb = module.hot._acceptedDependencies[dependency];
-						if (cb) {
-							if (callbacks.indexOf(cb) !== -1) continue;
-							callbacks.push(cb);
-						}
-					}
-					for (i = 0; i < callbacks.length; i++) {
-						cb = callbacks[i];
-						try {
-							cb(moduleOutdatedDependencies);
-						} catch (err) {
-							if (options.onErrored) {
-								options.onErrored({
-									type: "accept-errored",
-									moduleId: moduleId,
-									dependencyId: moduleOutdatedDependencies[i],
-									error: err
-								});
-							}
-							if (!options.ignoreErrored) {
-								if (!error) error = err;
-							}
-						}
-					}
-				}
-			}
-		}
-
-		// Load self accepted modules
-		for (i = 0; i < outdatedSelfAcceptedModules.length; i++) {
-			var item = outdatedSelfAcceptedModules[i];
-			moduleId = item.module;
-			hotCurrentParents = [moduleId];
-			try {
-				$require$(moduleId);
-			} catch (err) {
-				if (typeof item.errorHandler === "function") {
-					try {
-						item.errorHandler(err);
-					} catch (err2) {
-						if (options.onErrored) {
-							options.onErrored({
-								type: "self-accept-error-handler-errored",
-								moduleId: moduleId,
-								error: err2,
-								originalError: err
-							});
-						}
-						if (!options.ignoreErrored) {
-							if (!error) error = err2;
-						}
-						if (!error) error = err;
-					}
-				} else {
-					if (options.onErrored) {
-						options.onErrored({
-							type: "self-accept-errored",
-							moduleId: moduleId,
-							error: err
-						});
-					}
-					if (!options.ignoreErrored) {
-						if (!error) error = err;
-					}
-				}
-			}
-		}
-
-		// handle errors in accept handlers and self accepted module load
-		if (error) {
-			hotSetStatus("fail");
-			return Promise.reject(error);
-		}
-
-		hotSetStatus("idle");
-		return new Promise(function(resolve) {
-			resolve(outdatedModules);
-		});
-	}
-};
diff --git a/lib/HotModuleReplacementPlugin.js b/lib/HotModuleReplacementPlugin.js
index 46acc677052..4672e2fc9fd 100644
--- a/lib/HotModuleReplacementPlugin.js
+++ b/lib/HotModuleReplacementPlugin.js
@@ -2,163 +2,311 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const { SyncBailHook } = require("tapable");
 const { RawSource } = require("webpack-sources");
-const Template = require("./Template");
+const ChunkGraph = require("./ChunkGraph");
+const Compilation = require("./Compilation");
+const HotUpdateChunk = require("./HotUpdateChunk");
+const NormalModule = require("./NormalModule");
+const RuntimeGlobals = require("./RuntimeGlobals");
+const WebpackError = require("./WebpackError");
+const ConstDependency = require("./dependencies/ConstDependency");
+const ImportMetaHotAcceptDependency = require("./dependencies/ImportMetaHotAcceptDependency");
+const ImportMetaHotDeclineDependency = require("./dependencies/ImportMetaHotDeclineDependency");
 const ModuleHotAcceptDependency = require("./dependencies/ModuleHotAcceptDependency");
 const ModuleHotDeclineDependency = require("./dependencies/ModuleHotDeclineDependency");
-const ConstDependency = require("./dependencies/ConstDependency");
-const NullFactory = require("./NullFactory");
-const ParserHelpers = require("./ParserHelpers");
-
-module.exports = class HotModuleReplacementPlugin {
-	constructor(options) {
-		this.options = options || {};
-		this.multiStep = this.options.multiStep;
-		this.fullBuildTimeout = this.options.fullBuildTimeout || 200;
-		this.requestTimeout = this.options.requestTimeout || 10000;
+const HotModuleReplacementRuntimeModule = require("./hmr/HotModuleReplacementRuntimeModule");
+const JavascriptParser = require("./javascript/JavascriptParser");
+const {
+	evaluateToIdentifier
+} = require("./javascript/JavascriptParserHelpers");
+const { find, isSubset } = require("./util/SetHelpers");
+const TupleSet = require("./util/TupleSet");
+const { compareModulesById } = require("./util/comparators");
+const {
+	getRuntimeKey,
+	keyToRuntime,
+	forEachRuntime,
+	mergeRuntimeOwned,
+	subtractRuntime,
+	intersectRuntime
+} = require("./util/runtime");
+
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_DYNAMIC,
+	JAVASCRIPT_MODULE_TYPE_ESM,
+	WEBPACK_MODULE_TYPE_RUNTIME
+} = require("./ModuleTypeConstants");
+
+/** @typedef {import("estree").CallExpression} CallExpression */
+/** @typedef {import("estree").Expression} Expression */
+/** @typedef {import("estree").SpreadElement} SpreadElement */
+/** @typedef {import("../declarations/WebpackOptions").OutputNormalized} OutputNormalized */
+/** @typedef {import("./Chunk")} Chunk */
+/** @typedef {import("./Chunk").ChunkId} ChunkId */
+/** @typedef {import("./ChunkGraph").ModuleId} ModuleId */
+/** @typedef {import("./Compilation").AssetInfo} AssetInfo */
+/** @typedef {import("./Compilation").Records} Records */
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./Module").BuildInfo} BuildInfo */
+/** @typedef {import("./RuntimeModule")} RuntimeModule */
+/** @typedef {import("./javascript/BasicEvaluatedExpression")} BasicEvaluatedExpression */
+/** @typedef {import("./javascript/JavascriptParserHelpers").Range} Range */
+/** @typedef {import("./util/runtime").RuntimeSpec} RuntimeSpec */
+
+/**
+ * @typedef {object} HMRJavascriptParserHooks
+ * @property {SyncBailHook<[Expression | SpreadElement, string[]], void>} hotAcceptCallback
+ * @property {SyncBailHook<[CallExpression, string[]], void>} hotAcceptWithoutCallback
+ */
+
+/** @typedef {{ updatedChunkIds: Set, removedChunkIds: Set, removedModules: Set, filename: string, assetInfo: AssetInfo }} HotUpdateMainContentByRuntimeItem */
+/** @typedef {Map} HotUpdateMainContentByRuntime */
+
+/** @type {WeakMap} */
+const parserHooksMap = new WeakMap();
+
+const PLUGIN_NAME = "HotModuleReplacementPlugin";
+
+class HotModuleReplacementPlugin {
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @returns {HMRJavascriptParserHooks} the attached hooks
+	 */
+	static getParserHooks(parser) {
+		if (!(parser instanceof JavascriptParser)) {
+			throw new TypeError(
+				"The 'parser' argument must be an instance of JavascriptParser"
+			);
+		}
+		let hooks = parserHooksMap.get(parser);
+		if (hooks === undefined) {
+			hooks = {
+				hotAcceptCallback: new SyncBailHook(["expression", "requests"]),
+				hotAcceptWithoutCallback: new SyncBailHook(["expression", "requests"])
+			};
+			parserHooksMap.set(parser, hooks);
+		}
+		return hooks;
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		const multiStep = this.multiStep;
-		const fullBuildTimeout = this.fullBuildTimeout;
-		const requestTimeout = this.requestTimeout;
-		const hotUpdateChunkFilename =
-			compiler.options.output.hotUpdateChunkFilename;
-		const hotUpdateMainFilename = compiler.options.output.hotUpdateMainFilename;
-		compiler.hooks.additionalPass.tapAsync(
-			"HotModuleReplacementPlugin",
-			callback => {
-				if (multiStep) return setTimeout(callback, fullBuildTimeout);
-				return callback();
-			}
-		);
+		const { _backCompat: backCompat } = compiler;
+		if (compiler.options.output.strictModuleErrorHandling === undefined)
+			compiler.options.output.strictModuleErrorHandling = true;
+		const runtimeRequirements = [RuntimeGlobals.module];
 
-		const addParserPlugins = (parser, parserOptions) => {
-			parser.hooks.expression
-				.for("__webpack_hash__")
-				.tap(
-					"HotModuleReplacementPlugin",
-					ParserHelpers.toConstantDependencyWithWebpackRequire(
-						parser,
-						"__webpack_require__.h()"
-					)
-				);
-			parser.hooks.evaluateTypeof
-				.for("__webpack_hash__")
-				.tap(
-					"HotModuleReplacementPlugin",
-					ParserHelpers.evaluateToString("string")
+		/**
+		 * @param {JavascriptParser} parser the parser
+		 * @param {typeof ModuleHotAcceptDependency} ParamDependency dependency
+		 * @returns {(expr: CallExpression) => boolean | undefined} callback
+		 */
+		const createAcceptHandler = (parser, ParamDependency) => {
+			const { hotAcceptCallback, hotAcceptWithoutCallback } =
+				HotModuleReplacementPlugin.getParserHooks(parser);
+
+			return expr => {
+				const module = parser.state.module;
+				const dep = new ConstDependency(
+					`${module.moduleArgument}.hot.accept`,
+					/** @type {Range} */ (expr.callee.range),
+					runtimeRequirements
 				);
+				dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+				module.addPresentationalDependency(dep);
+				/** @type {BuildInfo} */
+				(module.buildInfo).moduleConcatenationBailout =
+					"Hot Module Replacement";
+
+				if (expr.arguments.length >= 1) {
+					const arg = parser.evaluateExpression(expr.arguments[0]);
+					/** @type {BasicEvaluatedExpression[]} */
+					let params = [];
+					if (arg.isString()) {
+						params = [arg];
+					} else if (arg.isArray()) {
+						params =
+							/** @type {BasicEvaluatedExpression[]} */
+							(arg.items).filter(param => param.isString());
+					}
+					/** @type {string[]} */
+					const requests = [];
+					if (params.length > 0) {
+						for (const [idx, param] of params.entries()) {
+							const request = /** @type {string} */ (param.string);
+							const dep = new ParamDependency(
+								request,
+								/** @type {Range} */ (param.range)
+							);
+							dep.optional = true;
+							dep.loc = Object.create(
+								/** @type {DependencyLocation} */ (expr.loc)
+							);
+							dep.loc.index = idx;
+							module.addDependency(dep);
+							requests.push(request);
+						}
+						if (expr.arguments.length > 1) {
+							hotAcceptCallback.call(expr.arguments[1], requests);
+							for (let i = 1; i < expr.arguments.length; i++) {
+								parser.walkExpression(expr.arguments[i]);
+							}
+							return true;
+						}
+						hotAcceptWithoutCallback.call(expr, requests);
+						return true;
+					}
+				}
+				parser.walkExpressions(expr.arguments);
+				return true;
+			};
+		};
+
+		/**
+		 * @param {JavascriptParser} parser the parser
+		 * @param {typeof ModuleHotDeclineDependency} ParamDependency dependency
+		 * @returns {(expr: CallExpression) => boolean | undefined} callback
+		 */
+		const createDeclineHandler = (parser, ParamDependency) => expr => {
+			const module = parser.state.module;
+			const dep = new ConstDependency(
+				`${module.moduleArgument}.hot.decline`,
+				/** @type {Range} */ (expr.callee.range),
+				runtimeRequirements
+			);
+			dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+			module.addPresentationalDependency(dep);
+			/** @type {BuildInfo} */
+			(module.buildInfo).moduleConcatenationBailout = "Hot Module Replacement";
+			if (expr.arguments.length === 1) {
+				const arg = parser.evaluateExpression(expr.arguments[0]);
+				/** @type {BasicEvaluatedExpression[]} */
+				let params = [];
+				if (arg.isString()) {
+					params = [arg];
+				} else if (arg.isArray()) {
+					params =
+						/** @type {BasicEvaluatedExpression[]} */
+						(arg.items).filter(param => param.isString());
+				}
+				for (const [idx, param] of params.entries()) {
+					const dep = new ParamDependency(
+						/** @type {string} */ (param.string),
+						/** @type {Range} */ (param.range)
+					);
+					dep.optional = true;
+					dep.loc = Object.create(/** @type {DependencyLocation} */ (expr.loc));
+					dep.loc.index = idx;
+					module.addDependency(dep);
+				}
+			}
+			return true;
+		};
+
+		/**
+		 * @param {JavascriptParser} parser the parser
+		 * @returns {(expr: Expression) => boolean | undefined} callback
+		 */
+		const createHMRExpressionHandler = parser => expr => {
+			const module = parser.state.module;
+			const dep = new ConstDependency(
+				`${module.moduleArgument}.hot`,
+				/** @type {Range} */ (expr.range),
+				runtimeRequirements
+			);
+			dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+			module.addPresentationalDependency(dep);
+			/** @type {BuildInfo} */
+			(module.buildInfo).moduleConcatenationBailout = "Hot Module Replacement";
+			return true;
+		};
+
+		/**
+		 * @param {JavascriptParser} parser the parser
+		 * @returns {void}
+		 */
+		const applyModuleHot = parser => {
 			parser.hooks.evaluateIdentifier.for("module.hot").tap(
 				{
-					name: "HotModuleReplacementPlugin",
+					name: PLUGIN_NAME,
 					before: "NodeStuffPlugin"
 				},
-				expr => {
-					return ParserHelpers.evaluateToIdentifier(
+				expr =>
+					evaluateToIdentifier(
 						"module.hot",
-						!!parser.state.compilation.hotUpdateChunkTemplate
-					)(expr);
-				}
+						"module",
+						() => ["hot"],
+						true
+					)(expr)
 			);
-			// TODO webpack 5: refactor this, no custom hooks
-			if (!parser.hooks.hotAcceptCallback) {
-				parser.hooks.hotAcceptCallback = new SyncBailHook([
-					"expression",
-					"requests"
-				]);
-			}
-			if (!parser.hooks.hotAcceptWithoutCallback) {
-				parser.hooks.hotAcceptWithoutCallback = new SyncBailHook([
-					"expression",
-					"requests"
-				]);
-			}
 			parser.hooks.call
 				.for("module.hot.accept")
-				.tap("HotModuleReplacementPlugin", expr => {
-					if (!parser.state.compilation.hotUpdateChunkTemplate) {
-						return false;
-					}
-					if (expr.arguments.length >= 1) {
-						const arg = parser.evaluateExpression(expr.arguments[0]);
-						let params = [];
-						let requests = [];
-						if (arg.isString()) {
-							params = [arg];
-						} else if (arg.isArray()) {
-							params = arg.items.filter(param => param.isString());
-						}
-						if (params.length > 0) {
-							params.forEach((param, idx) => {
-								const request = param.string;
-								const dep = new ModuleHotAcceptDependency(request, param.range);
-								dep.optional = true;
-								dep.loc = Object.create(expr.loc);
-								dep.loc.index = idx;
-								parser.state.module.addDependency(dep);
-								requests.push(request);
-							});
-							if (expr.arguments.length > 1) {
-								parser.hooks.hotAcceptCallback.call(
-									expr.arguments[1],
-									requests
-								);
-								parser.walkExpression(expr.arguments[1]); // other args are ignored
-								return true;
-							} else {
-								parser.hooks.hotAcceptWithoutCallback.call(expr, requests);
-								return true;
-							}
-						}
-					}
-				});
+				.tap(
+					PLUGIN_NAME,
+					createAcceptHandler(parser, ModuleHotAcceptDependency)
+				);
 			parser.hooks.call
 				.for("module.hot.decline")
-				.tap("HotModuleReplacementPlugin", expr => {
-					if (!parser.state.compilation.hotUpdateChunkTemplate) {
-						return false;
-					}
-					if (expr.arguments.length === 1) {
-						const arg = parser.evaluateExpression(expr.arguments[0]);
-						let params = [];
-						if (arg.isString()) {
-							params = [arg];
-						} else if (arg.isArray()) {
-							params = arg.items.filter(param => param.isString());
-						}
-						params.forEach((param, idx) => {
-							const dep = new ModuleHotDeclineDependency(
-								param.string,
-								param.range
-							);
-							dep.optional = true;
-							dep.loc = Object.create(expr.loc);
-							dep.loc.index = idx;
-							parser.state.module.addDependency(dep);
-						});
-					}
-				});
+				.tap(
+					PLUGIN_NAME,
+					createDeclineHandler(parser, ModuleHotDeclineDependency)
+				);
 			parser.hooks.expression
 				.for("module.hot")
-				.tap("HotModuleReplacementPlugin", ParserHelpers.skipTraversal);
+				.tap(PLUGIN_NAME, createHMRExpressionHandler(parser));
+		};
+
+		/**
+		 * @param {JavascriptParser} parser the parser
+		 * @returns {void}
+		 */
+		const applyImportMetaHot = parser => {
+			parser.hooks.evaluateIdentifier
+				.for("import.meta.webpackHot")
+				.tap(PLUGIN_NAME, expr =>
+					evaluateToIdentifier(
+						"import.meta.webpackHot",
+						"import.meta",
+						() => ["webpackHot"],
+						true
+					)(expr)
+				);
+			parser.hooks.call
+				.for("import.meta.webpackHot.accept")
+				.tap(
+					PLUGIN_NAME,
+					createAcceptHandler(parser, ImportMetaHotAcceptDependency)
+				);
+			parser.hooks.call
+				.for("import.meta.webpackHot.decline")
+				.tap(
+					PLUGIN_NAME,
+					createDeclineHandler(parser, ImportMetaHotDeclineDependency)
+				);
+			parser.hooks.expression
+				.for("import.meta.webpackHot")
+				.tap(PLUGIN_NAME, createHMRExpressionHandler(parser));
 		};
 
 		compiler.hooks.compilation.tap(
-			"HotModuleReplacementPlugin",
+			PLUGIN_NAME,
 			(compilation, { normalModuleFactory }) => {
-				const hotUpdateChunkTemplate = compilation.hotUpdateChunkTemplate;
-				if (!hotUpdateChunkTemplate) return;
-
-				compilation.dependencyFactories.set(ConstDependency, new NullFactory());
-				compilation.dependencyTemplates.set(
-					ConstDependency,
-					new ConstDependency.Template()
-				);
+				// This applies the HMR plugin only to the targeted compiler
+				// It should not affect child compilations
+				if (compilation.compiler !== compiler) return;
 
+				// #region module.hot.* API
 				compilation.dependencyFactories.set(
 					ModuleHotAcceptDependency,
 					normalModuleFactory
@@ -167,7 +315,6 @@ module.exports = class HotModuleReplacementPlugin {
 					ModuleHotAcceptDependency,
 					new ModuleHotAcceptDependency.Template()
 				);
-
 				compilation.dependencyFactories.set(
 					ModuleHotDeclineDependency,
 					normalModuleFactory
@@ -176,223 +323,540 @@ module.exports = class HotModuleReplacementPlugin {
 					ModuleHotDeclineDependency,
 					new ModuleHotDeclineDependency.Template()
 				);
+				// #endregion
 
-				compilation.hooks.record.tap(
-					"HotModuleReplacementPlugin",
-					(compilation, records) => {
-						if (records.hash === compilation.hash) return;
-						records.hash = compilation.hash;
-						records.moduleHashs = {};
-						for (const module of compilation.modules) {
-							const identifier = module.identifier();
-							records.moduleHashs[identifier] = module.hash;
-						}
-						records.chunkHashs = {};
-						for (const chunk of compilation.chunks) {
-							records.chunkHashs[chunk.id] = chunk.hash;
-						}
-						records.chunkModuleIds = {};
-						for (const chunk of compilation.chunks) {
-							records.chunkModuleIds[chunk.id] = Array.from(
-								chunk.modulesIterable,
-								m => m.id
-							);
-						}
-					}
+				// #region import.meta.webpackHot.* API
+				compilation.dependencyFactories.set(
+					ImportMetaHotAcceptDependency,
+					normalModuleFactory
 				);
-				let initialPass = false;
-				let recompilation = false;
-				compilation.hooks.afterHash.tap("HotModuleReplacementPlugin", () => {
-					let records = compilation.records;
-					if (!records) {
-						initialPass = true;
-						return;
+				compilation.dependencyTemplates.set(
+					ImportMetaHotAcceptDependency,
+					new ImportMetaHotAcceptDependency.Template()
+				);
+				compilation.dependencyFactories.set(
+					ImportMetaHotDeclineDependency,
+					normalModuleFactory
+				);
+				compilation.dependencyTemplates.set(
+					ImportMetaHotDeclineDependency,
+					new ImportMetaHotDeclineDependency.Template()
+				);
+				// #endregion
+
+				let hotIndex = 0;
+				/** @type {Record} */
+				const fullHashChunkModuleHashes = {};
+				/** @type {Record} */
+				const chunkModuleHashes = {};
+
+				compilation.hooks.record.tap(PLUGIN_NAME, (compilation, records) => {
+					if (records.hash === compilation.hash) return;
+					const chunkGraph = compilation.chunkGraph;
+					records.hash = compilation.hash;
+					records.hotIndex = hotIndex;
+					records.fullHashChunkModuleHashes = fullHashChunkModuleHashes;
+					records.chunkModuleHashes = chunkModuleHashes;
+					records.chunkHashes = {};
+					records.chunkRuntime = {};
+					for (const chunk of compilation.chunks) {
+						const chunkId = /** @type {ChunkId} */ (chunk.id);
+						records.chunkHashes[chunkId] = chunk.hash;
+						records.chunkRuntime[chunkId] = getRuntimeKey(chunk.runtime);
 					}
-					if (!records.hash) initialPass = true;
-					const preHash = records.preHash || "x";
-					const prepreHash = records.prepreHash || "x";
-					if (preHash === compilation.hash) {
-						recompilation = true;
-						compilation.modifyHash(prepreHash);
-						return;
+					records.chunkModuleIds = {};
+					for (const chunk of compilation.chunks) {
+						records.chunkModuleIds[/** @type {ChunkId} */ (chunk.id)] =
+							Array.from(
+								chunkGraph.getOrderedChunkModulesIterable(
+									chunk,
+									compareModulesById(chunkGraph)
+								),
+								m => chunkGraph.getModuleId(m)
+							);
 					}
-					records.prepreHash = records.hash || "x";
-					records.preHash = compilation.hash;
-					compilation.modifyHash(records.prepreHash);
 				});
-				compilation.hooks.shouldGenerateChunkAssets.tap(
-					"HotModuleReplacementPlugin",
-					() => {
-						if (multiStep && !recompilation && !initialPass) return false;
-					}
-				);
-				compilation.hooks.needAdditionalPass.tap(
-					"HotModuleReplacementPlugin",
-					() => {
-						if (multiStep && !recompilation && !initialPass) return true;
+				/** @type {TupleSet} */
+				const updatedModules = new TupleSet();
+				/** @type {TupleSet} */
+				const fullHashModules = new TupleSet();
+				/** @type {TupleSet} */
+				const nonCodeGeneratedModules = new TupleSet();
+				compilation.hooks.fullHash.tap(PLUGIN_NAME, hash => {
+					const chunkGraph = compilation.chunkGraph;
+					const records = /** @type {Records} */ (compilation.records);
+					for (const chunk of compilation.chunks) {
+						/**
+						 * @param {Module} module module
+						 * @returns {string} module hash
+						 */
+						const getModuleHash = module => {
+							if (
+								compilation.codeGenerationResults.has(module, chunk.runtime)
+							) {
+								return compilation.codeGenerationResults.getHash(
+									module,
+									chunk.runtime
+								);
+							}
+							nonCodeGeneratedModules.add(module, chunk.runtime);
+							return chunkGraph.getModuleHash(module, chunk.runtime);
+						};
+						const fullHashModulesInThisChunk =
+							chunkGraph.getChunkFullHashModulesSet(chunk);
+						if (fullHashModulesInThisChunk !== undefined) {
+							for (const module of fullHashModulesInThisChunk) {
+								fullHashModules.add(module, chunk);
+							}
+						}
+						const modules = chunkGraph.getChunkModulesIterable(chunk);
+						if (modules !== undefined) {
+							if (records.chunkModuleHashes) {
+								if (fullHashModulesInThisChunk !== undefined) {
+									for (const module of modules) {
+										const key = `${chunk.id}|${module.identifier()}`;
+										const hash = getModuleHash(module);
+										if (
+											fullHashModulesInThisChunk.has(
+												/** @type {RuntimeModule} */ (module)
+											)
+										) {
+											if (records.fullHashChunkModuleHashes[key] !== hash) {
+												updatedModules.add(module, chunk);
+											}
+											fullHashChunkModuleHashes[key] = hash;
+										} else {
+											if (records.chunkModuleHashes[key] !== hash) {
+												updatedModules.add(module, chunk);
+											}
+											chunkModuleHashes[key] = hash;
+										}
+									}
+								} else {
+									for (const module of modules) {
+										const key = `${chunk.id}|${module.identifier()}`;
+										const hash = getModuleHash(module);
+										if (records.chunkModuleHashes[key] !== hash) {
+											updatedModules.add(module, chunk);
+										}
+										chunkModuleHashes[key] = hash;
+									}
+								}
+							} else if (fullHashModulesInThisChunk !== undefined) {
+								for (const module of modules) {
+									const key = `${chunk.id}|${module.identifier()}`;
+									const hash = getModuleHash(module);
+									if (
+										fullHashModulesInThisChunk.has(
+											/** @type {RuntimeModule} */ (module)
+										)
+									) {
+										fullHashChunkModuleHashes[key] = hash;
+									} else {
+										chunkModuleHashes[key] = hash;
+									}
+								}
+							} else {
+								for (const module of modules) {
+									const key = `${chunk.id}|${module.identifier()}`;
+									const hash = getModuleHash(module);
+									chunkModuleHashes[key] = hash;
+								}
+							}
+						}
 					}
-				);
-				compilation.hooks.additionalChunkAssets.tap(
-					"HotModuleReplacementPlugin",
+
+					hotIndex = records.hotIndex || 0;
+					if (updatedModules.size > 0) hotIndex++;
+
+					hash.update(`${hotIndex}`);
+				});
+				compilation.hooks.processAssets.tap(
+					{
+						name: PLUGIN_NAME,
+						stage: Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL
+					},
 					() => {
-						const records = compilation.records;
+						const chunkGraph = compilation.chunkGraph;
+						const records = /** @type {Records} */ (compilation.records);
 						if (records.hash === compilation.hash) return;
 						if (
-							!records.moduleHashs ||
-							!records.chunkHashs ||
+							!records.chunkModuleHashes ||
+							!records.chunkHashes ||
 							!records.chunkModuleIds
-						)
+						) {
 							return;
+						}
+						for (const [module, chunk] of fullHashModules) {
+							const key = `${chunk.id}|${module.identifier()}`;
+							const hash = nonCodeGeneratedModules.has(module, chunk.runtime)
+								? chunkGraph.getModuleHash(module, chunk.runtime)
+								: compilation.codeGenerationResults.getHash(
+										module,
+										chunk.runtime
+									);
+							if (records.chunkModuleHashes[key] !== hash) {
+								updatedModules.add(module, chunk);
+							}
+							chunkModuleHashes[key] = hash;
+						}
+
+						/** @type {HotUpdateMainContentByRuntime} */
+						const hotUpdateMainContentByRuntime = new Map();
+						let allOldRuntime;
+						for (const key of Object.keys(records.chunkRuntime)) {
+							const runtime = keyToRuntime(records.chunkRuntime[key]);
+							allOldRuntime = mergeRuntimeOwned(allOldRuntime, runtime);
+						}
+						forEachRuntime(allOldRuntime, runtime => {
+							const { path: filename, info: assetInfo } =
+								compilation.getPathWithInfo(
+									/** @type {NonNullable} */
+									(compilation.outputOptions.hotUpdateMainFilename),
+									{
+										hash: records.hash,
+										runtime
+									}
+								);
+							hotUpdateMainContentByRuntime.set(
+								/** @type {string} */ (runtime),
+								{
+									updatedChunkIds: new Set(),
+									removedChunkIds: new Set(),
+									removedModules: new Set(),
+									filename,
+									assetInfo
+								}
+							);
+						});
+						if (hotUpdateMainContentByRuntime.size === 0) return;
+
+						// Create a list of all active modules to verify which modules are removed completely
+						/** @type {Map} */
+						const allModules = new Map();
 						for (const module of compilation.modules) {
-							const identifier = module.identifier();
-							let hash = module.hash;
-							module.hotUpdate = records.moduleHashs[identifier] !== hash;
+							const id =
+								/** @type {ModuleId} */
+								(chunkGraph.getModuleId(module));
+							allModules.set(id, module);
 						}
-						const hotUpdateMainContent = {
-							h: compilation.hash,
-							c: {}
-						};
-						for (const key of Object.keys(records.chunkHashs)) {
-							const chunkId = isNaN(+key) ? key : +key;
-							const currentChunk = compilation.chunks.find(
+
+						// List of completely removed modules
+						/** @type {Set} */
+						const completelyRemovedModules = new Set();
+
+						for (const key of Object.keys(records.chunkHashes)) {
+							const oldRuntime = keyToRuntime(records.chunkRuntime[key]);
+							/** @type {Module[]} */
+							const remainingModules = [];
+							// Check which modules are removed
+							for (const id of records.chunkModuleIds[key]) {
+								const module = allModules.get(id);
+								if (module === undefined) {
+									completelyRemovedModules.add(id);
+								} else {
+									remainingModules.push(module);
+								}
+							}
+
+							/** @type {ChunkId | null} */
+							let chunkId;
+							let newModules;
+							let newRuntimeModules;
+							let newFullHashModules;
+							let newDependentHashModules;
+							let newRuntime;
+							let removedFromRuntime;
+							const currentChunk = find(
+								compilation.chunks,
 								chunk => `${chunk.id}` === key
 							);
 							if (currentChunk) {
-								const newModules = currentChunk
-									.getModules()
-									.filter(module => module.hotUpdate);
-								const allModules = new Set();
-								for (const module of currentChunk.modulesIterable) {
-									allModules.add(module.id);
+								chunkId = currentChunk.id;
+								newRuntime = intersectRuntime(
+									currentChunk.runtime,
+									allOldRuntime
+								);
+								if (newRuntime === undefined) continue;
+								newModules = chunkGraph
+									.getChunkModules(currentChunk)
+									.filter(module => updatedModules.has(module, currentChunk));
+								newRuntimeModules = Array.from(
+									chunkGraph.getChunkRuntimeModulesIterable(currentChunk)
+								).filter(module => updatedModules.has(module, currentChunk));
+								const fullHashModules =
+									chunkGraph.getChunkFullHashModulesIterable(currentChunk);
+								newFullHashModules =
+									fullHashModules &&
+									Array.from(fullHashModules).filter(module =>
+										updatedModules.has(module, currentChunk)
+									);
+								const dependentHashModules =
+									chunkGraph.getChunkDependentHashModulesIterable(currentChunk);
+								newDependentHashModules =
+									dependentHashModules &&
+									Array.from(dependentHashModules).filter(module =>
+										updatedModules.has(module, currentChunk)
+									);
+								removedFromRuntime = subtractRuntime(oldRuntime, newRuntime);
+							} else {
+								// chunk has completely removed
+								chunkId = `${Number(key)}` === key ? Number(key) : key;
+								removedFromRuntime = oldRuntime;
+								newRuntime = oldRuntime;
+							}
+							if (removedFromRuntime) {
+								// chunk was removed from some runtimes
+								forEachRuntime(removedFromRuntime, runtime => {
+									const item =
+										/** @type {HotUpdateMainContentByRuntimeItem} */
+										(
+											hotUpdateMainContentByRuntime.get(
+												/** @type {string} */ (runtime)
+											)
+										);
+									item.removedChunkIds.add(/** @type {ChunkId} */ (chunkId));
+								});
+								// dispose modules from the chunk in these runtimes
+								// where they are no longer in this runtime
+								for (const module of remainingModules) {
+									const moduleKey = `${key}|${module.identifier()}`;
+									const oldHash = records.chunkModuleHashes[moduleKey];
+									const runtimes = chunkGraph.getModuleRuntimes(module);
+									if (oldRuntime === newRuntime && runtimes.has(newRuntime)) {
+										// Module is still in the same runtime combination
+										const hash = nonCodeGeneratedModules.has(module, newRuntime)
+											? chunkGraph.getModuleHash(module, newRuntime)
+											: compilation.codeGenerationResults.getHash(
+													module,
+													newRuntime
+												);
+										if (hash !== oldHash) {
+											if (module.type === WEBPACK_MODULE_TYPE_RUNTIME) {
+												newRuntimeModules = newRuntimeModules || [];
+												newRuntimeModules.push(
+													/** @type {RuntimeModule} */ (module)
+												);
+											} else {
+												newModules = newModules || [];
+												newModules.push(module);
+											}
+										}
+									} else {
+										// module is no longer in this runtime combination
+										// We (incorrectly) assume that it's not in an overlapping runtime combination
+										// and dispose it from the main runtimes the chunk was removed from
+										forEachRuntime(removedFromRuntime, runtime => {
+											// If the module is still used in this runtime, do not dispose it
+											// This could create a bad runtime state where the module is still loaded,
+											// but no chunk which contains it. This means we don't receive further HMR updates
+											// to this module and that's bad.
+											// TODO force load one of the chunks which contains the module
+											for (const moduleRuntime of runtimes) {
+												if (typeof moduleRuntime === "string") {
+													if (moduleRuntime === runtime) return;
+												} else if (
+													moduleRuntime !== undefined &&
+													moduleRuntime.has(/** @type {string} */ (runtime))
+												)
+													return;
+											}
+											const item =
+												/** @type {HotUpdateMainContentByRuntimeItem} */ (
+													hotUpdateMainContentByRuntime.get(
+														/** @type {string} */ (runtime)
+													)
+												);
+											item.removedModules.add(module);
+										});
+									}
 								}
-								const removedModules = records.chunkModuleIds[chunkId].filter(
-									id => !allModules.has(id)
+							}
+							if (
+								(newModules && newModules.length > 0) ||
+								(newRuntimeModules && newRuntimeModules.length > 0)
+							) {
+								const hotUpdateChunk = new HotUpdateChunk();
+								if (backCompat)
+									ChunkGraph.setChunkGraphForChunk(hotUpdateChunk, chunkGraph);
+								hotUpdateChunk.id = chunkId;
+								hotUpdateChunk.runtime = currentChunk
+									? currentChunk.runtime
+									: newRuntime;
+								if (currentChunk) {
+									for (const group of currentChunk.groupsIterable)
+										hotUpdateChunk.addGroup(group);
+								}
+								chunkGraph.attachModules(hotUpdateChunk, newModules || []);
+								chunkGraph.attachRuntimeModules(
+									hotUpdateChunk,
+									newRuntimeModules || []
 								);
-								if (newModules.length > 0 || removedModules.length > 0) {
-									const source = hotUpdateChunkTemplate.render(
-										chunkId,
-										newModules,
-										removedModules,
-										compilation.hash,
-										compilation.moduleTemplates.javascript,
-										compilation.dependencyTemplates
+								if (newFullHashModules) {
+									chunkGraph.attachFullHashModules(
+										hotUpdateChunk,
+										newFullHashModules
 									);
-									const filename = compilation.getPath(hotUpdateChunkFilename, {
-										hash: records.hash,
-										chunk: currentChunk
-									});
+								}
+								if (newDependentHashModules) {
+									chunkGraph.attachDependentHashModules(
+										hotUpdateChunk,
+										newDependentHashModules
+									);
+								}
+								const renderManifest = compilation.getRenderManifest({
+									chunk: hotUpdateChunk,
+									hash: records.hash,
+									fullHash: records.hash,
+									outputOptions: compilation.outputOptions,
+									moduleTemplates: compilation.moduleTemplates,
+									dependencyTemplates: compilation.dependencyTemplates,
+									codeGenerationResults: compilation.codeGenerationResults,
+									runtimeTemplate: compilation.runtimeTemplate,
+									moduleGraph: compilation.moduleGraph,
+									chunkGraph
+								});
+								for (const entry of renderManifest) {
+									/** @type {string} */
+									let filename;
+									/** @type {AssetInfo} */
+									let assetInfo;
+									if ("filename" in entry) {
+										filename = entry.filename;
+										assetInfo = entry.info;
+									} else {
+										({ path: filename, info: assetInfo } =
+											compilation.getPathWithInfo(
+												entry.filenameTemplate,
+												entry.pathOptions
+											));
+									}
+									const source = entry.render();
 									compilation.additionalChunkAssets.push(filename);
-									compilation.assets[filename] = source;
-									hotUpdateMainContent.c[chunkId] = true;
-									currentChunk.files.push(filename);
-									compilation.hooks.chunkAsset.call(currentChunk, filename);
+									compilation.emitAsset(filename, source, {
+										hotModuleReplacement: true,
+										...assetInfo
+									});
+									if (currentChunk) {
+										currentChunk.files.add(filename);
+										compilation.hooks.chunkAsset.call(currentChunk, filename);
+									}
 								}
-							} else {
-								hotUpdateMainContent.c[chunkId] = false;
+								forEachRuntime(newRuntime, runtime => {
+									const item =
+										/** @type {HotUpdateMainContentByRuntimeItem} */ (
+											hotUpdateMainContentByRuntime.get(
+												/** @type {string} */ (runtime)
+											)
+										);
+									item.updatedChunkIds.add(/** @type {ChunkId} */ (chunkId));
+								});
 							}
 						}
-						const source = new RawSource(JSON.stringify(hotUpdateMainContent));
-						const filename = compilation.getPath(hotUpdateMainFilename, {
-							hash: records.hash
-						});
-						compilation.assets[filename] = source;
-					}
-				);
-
-				const mainTemplate = compilation.mainTemplate;
-
-				mainTemplate.hooks.hash.tap("HotModuleReplacementPlugin", hash => {
-					hash.update("HotMainTemplateDecorator");
-				});
-
-				mainTemplate.hooks.moduleRequire.tap(
-					"HotModuleReplacementPlugin",
-					(_, chunk, hash, varModuleId) => {
-						return `hotCreateRequire(${varModuleId})`;
-					}
-				);
-
-				mainTemplate.hooks.requireExtensions.tap(
-					"HotModuleReplacementPlugin",
-					source => {
-						const buf = [source];
-						buf.push("");
-						buf.push("// __webpack_hash__");
-						buf.push(
-							mainTemplate.requireFn +
-								".h = function() { return hotCurrentHash; };"
+						const completelyRemovedModulesArray = Array.from(
+							completelyRemovedModules
 						);
-						return Template.asString(buf);
-					}
-				);
-
-				const needChunkLoadingCode = chunk => {
-					for (const chunkGroup of chunk.groupsIterable) {
-						if (chunkGroup.chunks.length > 1) return true;
-						if (chunkGroup.getNumberOfChildren() > 0) return true;
-					}
-					return false;
-				};
-
-				mainTemplate.hooks.bootstrap.tap(
-					"HotModuleReplacementPlugin",
-					(source, chunk, hash) => {
-						source = mainTemplate.hooks.hotBootstrap.call(source, chunk, hash);
-						return Template.asString([
-							source,
-							"",
-							hotInitCode
-								.replace(/\$require\$/g, mainTemplate.requireFn)
-								.replace(/\$hash\$/g, JSON.stringify(hash))
-								.replace(/\$requestTimeout\$/g, requestTimeout)
-								.replace(
-									/\/\*foreachInstalledChunks\*\//g,
-									needChunkLoadingCode(chunk)
-										? "for(var chunkId in installedChunks)"
-										: `var chunkId = ${JSON.stringify(chunk.id)};`
-								)
-						]);
-					}
-				);
-
-				mainTemplate.hooks.globalHash.tap(
-					"HotModuleReplacementPlugin",
-					() => true
-				);
+						const hotUpdateMainContentByFilename = new Map();
+						for (const {
+							removedChunkIds,
+							removedModules,
+							updatedChunkIds,
+							filename,
+							assetInfo
+						} of hotUpdateMainContentByRuntime.values()) {
+							const old = hotUpdateMainContentByFilename.get(filename);
+							if (
+								old &&
+								(!isSubset(old.removedChunkIds, removedChunkIds) ||
+									!isSubset(old.removedModules, removedModules) ||
+									!isSubset(old.updatedChunkIds, updatedChunkIds))
+							) {
+								compilation.warnings.push(
+									new WebpackError(`HotModuleReplacementPlugin
+The configured output.hotUpdateMainFilename doesn't lead to unique filenames per runtime and HMR update differs between runtimes.
+This might lead to incorrect runtime behavior of the applied update.
+To fix this, make sure to include [runtime] in the output.hotUpdateMainFilename option, or use the default config.`)
+								);
+								for (const chunkId of removedChunkIds)
+									old.removedChunkIds.add(chunkId);
+								for (const chunkId of removedModules)
+									old.removedModules.add(chunkId);
+								for (const chunkId of updatedChunkIds)
+									old.updatedChunkIds.add(chunkId);
+								continue;
+							}
+							hotUpdateMainContentByFilename.set(filename, {
+								removedChunkIds,
+								removedModules,
+								updatedChunkIds,
+								assetInfo
+							});
+						}
+						for (const [
+							filename,
+							{ removedChunkIds, removedModules, updatedChunkIds, assetInfo }
+						] of hotUpdateMainContentByFilename) {
+							const hotUpdateMainJson = {
+								c: Array.from(updatedChunkIds),
+								r: Array.from(removedChunkIds),
+								m:
+									removedModules.size === 0
+										? completelyRemovedModulesArray
+										: completelyRemovedModulesArray.concat(
+												Array.from(
+													removedModules,
+													m =>
+														/** @type {ModuleId} */ (chunkGraph.getModuleId(m))
+												)
+											)
+							};
 
-				mainTemplate.hooks.currentHash.tap(
-					"HotModuleReplacementPlugin",
-					(_, length) => {
-						if (isFinite(length)) {
-							return `hotCurrentHash.substr(0, ${length})`;
-						} else {
-							return "hotCurrentHash";
+							const source = new RawSource(JSON.stringify(hotUpdateMainJson));
+							compilation.emitAsset(filename, source, {
+								hotModuleReplacement: true,
+								...assetInfo
+							});
 						}
 					}
 				);
 
-				mainTemplate.hooks.moduleObj.tap(
-					"HotModuleReplacementPlugin",
-					(source, chunk, hash, varModuleId) => {
-						return Template.asString([
-							`${source},`,
-							`hot: hotCreateModule(${varModuleId}),`,
-							"parents: (hotCurrentParentsTemp = hotCurrentParents, hotCurrentParents = [], hotCurrentParentsTemp),",
-							"children: []"
-						]);
+				compilation.hooks.additionalTreeRuntimeRequirements.tap(
+					PLUGIN_NAME,
+					(chunk, runtimeRequirements) => {
+						runtimeRequirements.add(RuntimeGlobals.hmrDownloadManifest);
+						runtimeRequirements.add(RuntimeGlobals.hmrDownloadUpdateHandlers);
+						runtimeRequirements.add(RuntimeGlobals.interceptModuleExecution);
+						runtimeRequirements.add(RuntimeGlobals.moduleCache);
+						compilation.addRuntimeModule(
+							chunk,
+							new HotModuleReplacementRuntimeModule()
+						);
 					}
 				);
 
-				// TODO add HMR support for javascript/esm
 				normalModuleFactory.hooks.parser
-					.for("javascript/auto")
-					.tap("HotModuleReplacementPlugin", addParserPlugins);
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, parser => {
+						applyModuleHot(parser);
+						applyImportMetaHot(parser);
+					});
 				normalModuleFactory.hooks.parser
-					.for("javascript/dynamic")
-					.tap("HotModuleReplacementPlugin", addParserPlugins);
+					.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
+					.tap(PLUGIN_NAME, parser => {
+						applyModuleHot(parser);
+					});
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_ESM)
+					.tap(PLUGIN_NAME, parser => {
+						applyImportMetaHot(parser);
+					});
+				normalModuleFactory.hooks.module.tap(PLUGIN_NAME, module => {
+					module.hot = true;
+					return module;
+				});
 
-				compilation.hooks.normalModuleLoader.tap(
-					"HotModuleReplacementPlugin",
+				NormalModule.getCompilationHooks(compilation).loader.tap(
+					PLUGIN_NAME,
 					context => {
 						context.hot = true;
 					}
@@ -400,8 +864,6 @@ module.exports = class HotModuleReplacementPlugin {
 			}
 		);
 	}
-};
+}
 
-const hotInitCode = Template.getFunctionContent(
-	require("./HotModuleReplacement.runtime")
-);
+module.exports = HotModuleReplacementPlugin;
diff --git a/lib/HotUpdateChunk.js b/lib/HotUpdateChunk.js
index 8845643b4f2..d939838527d 100644
--- a/lib/HotUpdateChunk.js
+++ b/lib/HotUpdateChunk.js
@@ -2,15 +2,17 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const Chunk = require("./Chunk");
 
+/** @typedef {import("./ChunkGraph")} ChunkGraph */
+/** @typedef {import("./util/Hash")} Hash */
+
 class HotUpdateChunk extends Chunk {
 	constructor() {
 		super();
-		/** @type {(string|number)[]} */
-		this.removedModules = undefined;
 	}
 }
 
diff --git a/lib/HotUpdateChunkTemplate.js b/lib/HotUpdateChunkTemplate.js
deleted file mode 100644
index 92ab8db08c9..00000000000
--- a/lib/HotUpdateChunkTemplate.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const Template = require("./Template");
-const HotUpdateChunk = require("./HotUpdateChunk");
-const { Tapable, SyncWaterfallHook, SyncHook } = require("tapable");
-
-module.exports = class HotUpdateChunkTemplate extends Tapable {
-	constructor(outputOptions) {
-		super();
-		this.outputOptions = outputOptions || {};
-		this.hooks = {
-			modules: new SyncWaterfallHook([
-				"source",
-				"modules",
-				"removedModules",
-				"moduleTemplate",
-				"dependencyTemplates"
-			]),
-			render: new SyncWaterfallHook([
-				"source",
-				"modules",
-				"removedModules",
-				"hash",
-				"id",
-				"moduleTemplate",
-				"dependencyTemplates"
-			]),
-			hash: new SyncHook(["hash"])
-		};
-	}
-
-	render(
-		id,
-		modules,
-		removedModules,
-		hash,
-		moduleTemplate,
-		dependencyTemplates
-	) {
-		const hotUpdateChunk = new HotUpdateChunk();
-		hotUpdateChunk.id = id;
-		hotUpdateChunk.setModules(modules);
-		hotUpdateChunk.removedModules = removedModules;
-		const modulesSource = Template.renderChunkModules(
-			hotUpdateChunk,
-			m => typeof m.source === "function",
-			moduleTemplate,
-			dependencyTemplates
-		);
-		const core = this.hooks.modules.call(
-			modulesSource,
-			modules,
-			removedModules,
-			moduleTemplate,
-			dependencyTemplates
-		);
-		const source = this.hooks.render.call(
-			core,
-			modules,
-			removedModules,
-			hash,
-			id,
-			moduleTemplate,
-			dependencyTemplates
-		);
-		return source;
-	}
-
-	updateHash(hash) {
-		hash.update("HotUpdateChunkTemplate");
-		hash.update("1");
-		this.hooks.hash.call(hash);
-	}
-};
diff --git a/lib/IgnoreErrorModuleFactory.js b/lib/IgnoreErrorModuleFactory.js
new file mode 100644
index 00000000000..423277935c3
--- /dev/null
+++ b/lib/IgnoreErrorModuleFactory.js
@@ -0,0 +1,39 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const ModuleFactory = require("./ModuleFactory");
+
+/** @typedef {import("./ModuleFactory").ModuleFactoryCallback} ModuleFactoryCallback */
+/** @typedef {import("./ModuleFactory").ModuleFactoryCreateData} ModuleFactoryCreateData */
+/** @typedef {import("./NormalModuleFactory")} NormalModuleFactory */
+
+/**
+ * Ignores error when module is unresolved
+ */
+class IgnoreErrorModuleFactory extends ModuleFactory {
+	/**
+	 * @param {NormalModuleFactory} normalModuleFactory normalModuleFactory instance
+	 */
+	constructor(normalModuleFactory) {
+		super();
+
+		this.normalModuleFactory = normalModuleFactory;
+	}
+
+	/**
+	 * @param {ModuleFactoryCreateData} data data object
+	 * @param {ModuleFactoryCallback} callback callback
+	 * @returns {void}
+	 */
+	create(data, callback) {
+		this.normalModuleFactory.create(data, (err, result) =>
+			callback(null, result)
+		);
+	}
+}
+
+module.exports = IgnoreErrorModuleFactory;
diff --git a/lib/IgnorePlugin.js b/lib/IgnorePlugin.js
index cd824db2ba2..42052a5c497 100644
--- a/lib/IgnorePlugin.js
+++ b/lib/IgnorePlugin.js
@@ -2,88 +2,96 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const validateOptions = require("schema-utils");
-const schema = require("../schemas/plugins/IgnorePlugin.json");
+const RawModule = require("./RawModule");
+const EntryDependency = require("./dependencies/EntryDependency");
+const createSchemaValidation = require("./util/create-schema-validation");
 
 /** @typedef {import("../declarations/plugins/IgnorePlugin").IgnorePluginOptions} IgnorePluginOptions */
 /** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./NormalModuleFactory").ResolveData} ResolveData */
+
+const validate = createSchemaValidation(
+	require("../schemas/plugins/IgnorePlugin.check.js"),
+	() => require("../schemas/plugins/IgnorePlugin.json"),
+	{
+		name: "Ignore Plugin",
+		baseDataPath: "options"
+	}
+);
+
+const PLUGIN_NAME = "IgnorePlugin";
 
 class IgnorePlugin {
 	/**
 	 * @param {IgnorePluginOptions} options IgnorePlugin options
 	 */
 	constructor(options) {
-		// TODO webpack 5 remove this compat-layer
-		if (arguments.length > 1 || options instanceof RegExp) {
-			options = {
-				resourceRegExp: arguments[0],
-				contextRegExp: arguments[1]
-			};
-		}
-
-		validateOptions(schema, options, "IgnorePlugin");
+		validate(options);
 		this.options = options;
-
-		/** @private @type {Function} */
 		this.checkIgnore = this.checkIgnore.bind(this);
 	}
 
 	/**
-	 * Note that if "contextRegExp" is given, both the "resourceRegExp"
-	 * and "contextRegExp" have to match.
-	 *
-	 * @param {TODO} result result
-	 * @returns {TODO|null} returns result or null if result should be ignored
+	 * Note that if "contextRegExp" is given, both the "resourceRegExp" and "contextRegExp" have to match.
+	 * @param {ResolveData} resolveData resolve data
+	 * @returns {false|undefined} returns false when the request should be ignored, otherwise undefined
 	 */
-	checkIgnore(result) {
-		if (!result) return result;
-
+	checkIgnore(resolveData) {
 		if (
 			"checkResource" in this.options &&
 			this.options.checkResource &&
-			this.options.checkResource(result.request, result.context)
+			this.options.checkResource(resolveData.request, resolveData.context)
 		) {
-			// TODO webpack 5 remove checkContext, as checkResource already gets context
-			if ("checkContext" in this.options && this.options.checkContext) {
-				if (this.options.checkContext(result.context)) {
-					return null;
-				}
-			} else {
-				return null;
-			}
+			return false;
 		}
 
 		if (
 			"resourceRegExp" in this.options &&
 			this.options.resourceRegExp &&
-			this.options.resourceRegExp.test(result.request)
+			this.options.resourceRegExp.test(resolveData.request)
 		) {
 			if ("contextRegExp" in this.options && this.options.contextRegExp) {
 				// if "contextRegExp" is given,
 				// both the "resourceRegExp" and "contextRegExp" have to match.
-				if (this.options.contextRegExp.test(result.context)) {
-					return null;
+				if (this.options.contextRegExp.test(resolveData.context)) {
+					return false;
 				}
 			} else {
-				return null;
+				return false;
 			}
 		}
-
-		return result;
 	}
 
 	/**
-	 * @param {Compiler} compiler Webpack Compiler
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
 	 * @returns {void}
 	 */
 	apply(compiler) {
-		compiler.hooks.normalModuleFactory.tap("IgnorePlugin", nmf => {
-			nmf.hooks.beforeResolve.tap("IgnorePlugin", this.checkIgnore);
+		compiler.hooks.normalModuleFactory.tap(PLUGIN_NAME, nmf => {
+			nmf.hooks.beforeResolve.tap(PLUGIN_NAME, resolveData => {
+				const result = this.checkIgnore(resolveData);
+
+				if (
+					result === false &&
+					resolveData.dependencies.length > 0 &&
+					resolveData.dependencies[0] instanceof EntryDependency
+				) {
+					resolveData.ignoredModule = new RawModule(
+						"",
+						"ignored-entry-module",
+						"(ignored-entry-module)"
+					);
+				}
+
+				return result;
+			});
 		});
-		compiler.hooks.contextModuleFactory.tap("IgnorePlugin", cmf => {
-			cmf.hooks.beforeResolve.tap("IgnorePlugin", this.checkIgnore);
+		compiler.hooks.contextModuleFactory.tap(PLUGIN_NAME, cmf => {
+			cmf.hooks.beforeResolve.tap(PLUGIN_NAME, this.checkIgnore);
 		});
 	}
 }
diff --git a/lib/IgnoreWarningsPlugin.js b/lib/IgnoreWarningsPlugin.js
new file mode 100644
index 00000000000..5518b648dd7
--- /dev/null
+++ b/lib/IgnoreWarningsPlugin.js
@@ -0,0 +1,38 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+/** @typedef {import("../declarations/WebpackOptions").IgnoreWarningsNormalized} IgnoreWarningsNormalized */
+/** @typedef {import("./Compiler")} Compiler */
+
+const PLUGIN_NAME = "IgnoreWarningsPlugin";
+
+class IgnoreWarningsPlugin {
+	/**
+	 * @param {IgnoreWarningsNormalized} ignoreWarnings conditions to ignore warnings
+	 */
+	constructor(ignoreWarnings) {
+		this._ignoreWarnings = ignoreWarnings;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			compilation.hooks.processWarnings.tap(PLUGIN_NAME, warnings =>
+				warnings.filter(
+					warning =>
+						!this._ignoreWarnings.some(ignore => ignore(warning, compilation))
+				)
+			);
+		});
+	}
+}
+
+module.exports = IgnoreWarningsPlugin;
diff --git a/lib/InitFragment.js b/lib/InitFragment.js
new file mode 100644
index 00000000000..228f592a4ff
--- /dev/null
+++ b/lib/InitFragment.js
@@ -0,0 +1,185 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Florent Cailhol @ooflorent
+*/
+
+"use strict";
+
+const { ConcatSource } = require("webpack-sources");
+const makeSerializable = require("./util/makeSerializable");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("./Generator").GenerateContext} GenerateContext */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
+/**
+ * @template T
+ * @param {InitFragment} fragment the init fragment
+ * @param {number} index index
+ * @returns {[InitFragment, number]} tuple with both
+ */
+const extractFragmentIndex = (fragment, index) => [fragment, index];
+
+/**
+ * @template T
+ * @param {[InitFragment, number]} a first pair
+ * @param {[InitFragment, number]} b second pair
+ * @returns {number} sort value
+ */
+const sortFragmentWithIndex = ([a, i], [b, j]) => {
+	const stageCmp = a.stage - b.stage;
+	if (stageCmp !== 0) return stageCmp;
+	const positionCmp = a.position - b.position;
+	if (positionCmp !== 0) return positionCmp;
+	return i - j;
+};
+
+/**
+ * @template GenerateContext
+ */
+class InitFragment {
+	/**
+	 * @param {string | Source | undefined} content the source code that will be included as initialization code
+	 * @param {number} stage category of initialization code (contribute to order)
+	 * @param {number} position position in the category (contribute to order)
+	 * @param {string=} key unique key to avoid emitting the same initialization code twice
+	 * @param {string | Source=} endContent the source code that will be included at the end of the module
+	 */
+	constructor(content, stage, position, key, endContent) {
+		this.content = content;
+		this.stage = stage;
+		this.position = position;
+		this.key = key;
+		this.endContent = endContent;
+	}
+
+	/**
+	 * @param {GenerateContext} context context
+	 * @returns {string | Source | undefined} the source code that will be included as initialization code
+	 */
+	getContent(context) {
+		return this.content;
+	}
+
+	/**
+	 * @param {GenerateContext} context context
+	 * @returns {string | Source=} the source code that will be included at the end of the module
+	 */
+	getEndContent(context) {
+		return this.endContent;
+	}
+
+	/**
+	 * @template Context
+	 * @template T
+	 * @param {Source} source sources
+	 * @param {InitFragment[]} initFragments init fragments
+	 * @param {Context} context context
+	 * @returns {Source} source
+	 */
+	static addToSource(source, initFragments, context) {
+		if (initFragments.length > 0) {
+			// Sort fragments by position. If 2 fragments have the same position,
+			// use their index.
+			const sortedFragments = initFragments
+				.map(extractFragmentIndex)
+				.sort(sortFragmentWithIndex);
+
+			// Deduplicate fragments. If a fragment has no key, it is always included.
+			const keyedFragments = new Map();
+			for (const [fragment] of sortedFragments) {
+				if (
+					typeof (
+						/** @type {InitFragment & { mergeAll?: (fragments: InitFragment[]) => InitFragment[] }} */
+						(fragment).mergeAll
+					) === "function"
+				) {
+					if (!fragment.key) {
+						throw new Error(
+							`InitFragment with mergeAll function must have a valid key: ${fragment.constructor.name}`
+						);
+					}
+					const oldValue = keyedFragments.get(fragment.key);
+					if (oldValue === undefined) {
+						keyedFragments.set(fragment.key, fragment);
+					} else if (Array.isArray(oldValue)) {
+						oldValue.push(fragment);
+					} else {
+						keyedFragments.set(fragment.key, [oldValue, fragment]);
+					}
+					continue;
+				} else if (typeof fragment.merge === "function") {
+					const oldValue = keyedFragments.get(fragment.key);
+					if (oldValue !== undefined) {
+						keyedFragments.set(fragment.key, fragment.merge(oldValue));
+						continue;
+					}
+				}
+				keyedFragments.set(fragment.key || Symbol("fragment key"), fragment);
+			}
+
+			const concatSource = new ConcatSource();
+			const endContents = [];
+			for (let fragment of keyedFragments.values()) {
+				if (Array.isArray(fragment)) {
+					fragment = fragment[0].mergeAll(fragment);
+				}
+				concatSource.add(fragment.getContent(context));
+				const endContent = fragment.getEndContent(context);
+				if (endContent) {
+					endContents.push(endContent);
+				}
+			}
+
+			concatSource.add(source);
+			for (const content of endContents.reverse()) {
+				concatSource.add(content);
+			}
+			return concatSource;
+		}
+		return source;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+
+		write(this.content);
+		write(this.stage);
+		write(this.position);
+		write(this.key);
+		write(this.endContent);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+
+		this.content = read();
+		this.stage = read();
+		this.position = read();
+		this.key = read();
+		this.endContent = read();
+	}
+}
+
+makeSerializable(InitFragment, "webpack/lib/InitFragment");
+
+InitFragment.prototype.merge =
+	/** @type {TODO} */
+	(undefined);
+
+InitFragment.STAGE_CONSTANTS = 10;
+InitFragment.STAGE_ASYNC_BOUNDARY = 20;
+InitFragment.STAGE_HARMONY_EXPORTS = 30;
+InitFragment.STAGE_HARMONY_IMPORTS = 40;
+InitFragment.STAGE_PROVIDES = 50;
+InitFragment.STAGE_ASYNC_DEPENDENCIES = 60;
+InitFragment.STAGE_ASYNC_HARMONY_IMPORTS = 70;
+
+module.exports = InitFragment;
diff --git a/lib/InvalidDependenciesModuleWarning.js b/lib/InvalidDependenciesModuleWarning.js
new file mode 100644
index 00000000000..a69eed58d92
--- /dev/null
+++ b/lib/InvalidDependenciesModuleWarning.js
@@ -0,0 +1,44 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const WebpackError = require("./WebpackError");
+const makeSerializable = require("./util/makeSerializable");
+
+/** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("./Module")} Module */
+
+class InvalidDependenciesModuleWarning extends WebpackError {
+	/**
+	 * @param {Module} module module tied to dependency
+	 * @param {Iterable} deps invalid dependencies
+	 */
+	constructor(module, deps) {
+		const orderedDeps = deps ? Array.from(deps).sort() : [];
+		const depsList = orderedDeps.map(dep => ` * ${JSON.stringify(dep)}`);
+		super(`Invalid dependencies have been reported by plugins or loaders for this module. All reported dependencies need to be absolute paths.
+Invalid dependencies may lead to broken watching and caching.
+As best effort we try to convert all invalid values to absolute paths and converting globs into context dependencies, but this is deprecated behavior.
+Loaders: Pass absolute paths to this.addDependency (existing files), this.addMissingDependency (not existing files), and this.addContextDependency (directories).
+Plugins: Pass absolute paths to fileDependencies (existing files), missingDependencies (not existing files), and contextDependencies (directories).
+Globs: They are not supported. Pass absolute path to the directory as context dependencies.
+The following invalid values have been reported:
+${depsList.slice(0, 3).join("\n")}${
+			depsList.length > 3 ? "\n * and more ..." : ""
+		}`);
+
+		this.name = "InvalidDependenciesModuleWarning";
+		this.details = depsList.slice(3).join("\n");
+		this.module = module;
+	}
+}
+
+makeSerializable(
+	InvalidDependenciesModuleWarning,
+	"webpack/lib/InvalidDependenciesModuleWarning"
+);
+
+module.exports = InvalidDependenciesModuleWarning;
diff --git a/lib/JavascriptGenerator.js b/lib/JavascriptGenerator.js
deleted file mode 100644
index 882f7d4d4a6..00000000000
--- a/lib/JavascriptGenerator.js
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const { RawSource, ReplaceSource } = require("webpack-sources");
-
-// TODO: clean up this file
-// replace with newer constructs
-
-// TODO: remove DependencyVariables and replace them with something better
-
-class JavascriptGenerator {
-	generate(module, dependencyTemplates, runtimeTemplate) {
-		const originalSource = module.originalSource();
-		if (!originalSource) {
-			return new RawSource("throw new Error('No source available');");
-		}
-
-		const source = new ReplaceSource(originalSource);
-
-		this.sourceBlock(
-			module,
-			module,
-			[],
-			dependencyTemplates,
-			source,
-			runtimeTemplate
-		);
-
-		return source;
-	}
-
-	sourceBlock(
-		module,
-		block,
-		availableVars,
-		dependencyTemplates,
-		source,
-		runtimeTemplate
-	) {
-		for (const dependency of block.dependencies) {
-			this.sourceDependency(
-				dependency,
-				dependencyTemplates,
-				source,
-				runtimeTemplate
-			);
-		}
-
-		/**
-		 * Get the variables of all blocks that we need to inject.
-		 * These will contain the variable name and its expression.
-		 * The name will be added as a parameter in a IIFE the expression as its value.
-		 */
-		const vars = block.variables.reduce((result, value) => {
-			const variable = this.sourceVariables(
-				value,
-				availableVars,
-				dependencyTemplates,
-				runtimeTemplate
-			);
-
-			if (variable) {
-				result.push(variable);
-			}
-
-			return result;
-		}, []);
-
-		/**
-		 * if we actually have variables
-		 * this is important as how #splitVariablesInUniqueNamedChunks works
-		 * it will always return an array in an array which would lead to a IIFE wrapper around
-		 * a module if we do this with an empty vars array.
-		 */
-		if (vars.length > 0) {
-			/**
-			 * Split all variables up into chunks of unique names.
-			 * e.g. imagine you have the following variable names that need to be injected:
-			 * [foo, bar, baz, foo, some, more]
-			 * we can not inject "foo" twice, therefore we just make two IIFEs like so:
-			 * (function(foo, bar, baz){
-			 *   (function(foo, some, more){
-			 *     …
-			 *   }(…));
-			 * }(…));
-			 *
-			 * "splitVariablesInUniqueNamedChunks" splits the variables shown above up to this:
-			 * [[foo, bar, baz], [foo, some, more]]
-			 */
-			const injectionVariableChunks = this.splitVariablesInUniqueNamedChunks(
-				vars
-			);
-
-			// create all the beginnings of IIFEs
-			const functionWrapperStarts = injectionVariableChunks.map(
-				variableChunk => {
-					return this.variableInjectionFunctionWrapperStartCode(
-						variableChunk.map(variable => variable.name)
-					);
-				}
-			);
-
-			// and all the ends
-			const functionWrapperEnds = injectionVariableChunks.map(variableChunk => {
-				return this.variableInjectionFunctionWrapperEndCode(
-					module,
-					variableChunk.map(variable => variable.expression),
-					block
-				);
-			});
-
-			// join them to one big string
-			const varStartCode = functionWrapperStarts.join("");
-
-			// reverse the ends first before joining them, as the last added must be the inner most
-			const varEndCode = functionWrapperEnds.reverse().join("");
-
-			// if we have anything, add it to the source
-			if (varStartCode && varEndCode) {
-				const start = block.range ? block.range[0] : -10;
-				const end = block.range
-					? block.range[1]
-					: module.originalSource().size() + 1;
-				source.insert(start + 0.5, varStartCode);
-				source.insert(end + 0.5, "\n/* WEBPACK VAR INJECTION */" + varEndCode);
-			}
-		}
-
-		for (const childBlock of block.blocks) {
-			this.sourceBlock(
-				module,
-				childBlock,
-				availableVars.concat(vars),
-				dependencyTemplates,
-				source,
-				runtimeTemplate
-			);
-		}
-	}
-
-	sourceDependency(dependency, dependencyTemplates, source, runtimeTemplate) {
-		const template = dependencyTemplates.get(dependency.constructor);
-		if (!template) {
-			throw new Error(
-				"No template for dependency: " + dependency.constructor.name
-			);
-		}
-		template.apply(dependency, source, runtimeTemplate, dependencyTemplates);
-	}
-
-	sourceVariables(
-		variable,
-		availableVars,
-		dependencyTemplates,
-		runtimeTemplate
-	) {
-		const name = variable.name;
-		const expr = variable.expressionSource(
-			dependencyTemplates,
-			runtimeTemplate
-		);
-
-		if (
-			availableVars.some(
-				v => v.name === name && v.expression.source() === expr.source()
-			)
-		) {
-			return;
-		}
-		return {
-			name: name,
-			expression: expr
-		};
-	}
-
-	/*
-	 * creates the start part of a IIFE around the module to inject a variable name
-	 * (function(…){   <- this part
-	 * }.call(…))
-	 */
-	variableInjectionFunctionWrapperStartCode(varNames) {
-		const args = varNames.join(", ");
-		return `/* WEBPACK VAR INJECTION */(function(${args}) {`;
-	}
-
-	contextArgument(module, block) {
-		if (this === block) {
-			return module.exportsArgument;
-		}
-		return "this";
-	}
-
-	/*
-	 * creates the end part of a IIFE around the module to inject a variable name
-	 * (function(…){
-	 * }.call(…))   <- this part
-	 */
-	variableInjectionFunctionWrapperEndCode(module, varExpressions, block) {
-		const firstParam = this.contextArgument(module, block);
-		const furtherParams = varExpressions.map(e => e.source()).join(", ");
-		return `}.call(${firstParam}, ${furtherParams}))`;
-	}
-
-	splitVariablesInUniqueNamedChunks(vars) {
-		const startState = [[]];
-		return vars.reduce((chunks, variable) => {
-			const current = chunks[chunks.length - 1];
-			// check if variable with same name exists already
-			// if so create a new chunk of variables.
-			const variableNameAlreadyExists = current.some(
-				v => v.name === variable.name
-			);
-
-			if (variableNameAlreadyExists) {
-				// start new chunk with current variable
-				chunks.push([variable]);
-			} else {
-				// else add it to current chunk
-				current.push(variable);
-			}
-			return chunks;
-		}, startState);
-	}
-}
-
-module.exports = JavascriptGenerator;
diff --git a/lib/JavascriptMetaInfoPlugin.js b/lib/JavascriptMetaInfoPlugin.js
new file mode 100644
index 00000000000..b8f77bea369
--- /dev/null
+++ b/lib/JavascriptMetaInfoPlugin.js
@@ -0,0 +1,80 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Sergey Melyukov @smelukov
+*/
+
+"use strict";
+
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_DYNAMIC,
+	JAVASCRIPT_MODULE_TYPE_ESM
+} = require("./ModuleTypeConstants");
+const InnerGraph = require("./optimize/InnerGraph");
+
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./Module").BuildInfo} BuildInfo */
+/** @typedef {import("./javascript/JavascriptParser")} JavascriptParser */
+
+const PLUGIN_NAME = "JavascriptMetaInfoPlugin";
+
+class JavascriptMetaInfoPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(
+			PLUGIN_NAME,
+			(compilation, { normalModuleFactory }) => {
+				/**
+				 * @param {JavascriptParser} parser the parser
+				 * @returns {void}
+				 */
+				const handler = parser => {
+					parser.hooks.call.for("eval").tap(PLUGIN_NAME, () => {
+						const buildInfo =
+							/** @type {BuildInfo} */
+							(parser.state.module.buildInfo);
+						buildInfo.moduleConcatenationBailout = "eval()";
+						buildInfo.usingEval = true;
+						const currentSymbol = InnerGraph.getTopLevelSymbol(parser.state);
+						if (currentSymbol) {
+							InnerGraph.addUsage(parser.state, null, currentSymbol);
+						} else {
+							InnerGraph.bailout(parser.state);
+						}
+					});
+					parser.hooks.finish.tap(PLUGIN_NAME, () => {
+						const buildInfo =
+							/** @type {BuildInfo} */
+							(parser.state.module.buildInfo);
+						let topLevelDeclarations = buildInfo.topLevelDeclarations;
+						if (topLevelDeclarations === undefined) {
+							topLevelDeclarations = buildInfo.topLevelDeclarations = new Set();
+						}
+						for (const name of parser.scope.definitions.asSet()) {
+							const freeInfo = parser.getFreeInfoFromVariable(name);
+							if (freeInfo === undefined) {
+								topLevelDeclarations.add(name);
+							}
+						}
+					});
+				};
+
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, handler);
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
+					.tap(PLUGIN_NAME, handler);
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_ESM)
+					.tap(PLUGIN_NAME, handler);
+			}
+		);
+	}
+}
+
+module.exports = JavascriptMetaInfoPlugin;
diff --git a/lib/JavascriptModulesPlugin.js b/lib/JavascriptModulesPlugin.js
deleted file mode 100644
index 07030c9a301..00000000000
--- a/lib/JavascriptModulesPlugin.js
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const Parser = require("./Parser");
-const Template = require("./Template");
-const { ConcatSource } = require("webpack-sources");
-const JavascriptGenerator = require("./JavascriptGenerator");
-const createHash = require("./util/createHash");
-
-class JavascriptModulesPlugin {
-	apply(compiler) {
-		compiler.hooks.compilation.tap(
-			"JavascriptModulesPlugin",
-			(compilation, { normalModuleFactory }) => {
-				normalModuleFactory.hooks.createParser
-					.for("javascript/auto")
-					.tap("JavascriptModulesPlugin", options => {
-						return new Parser(options, "auto");
-					});
-				normalModuleFactory.hooks.createParser
-					.for("javascript/dynamic")
-					.tap("JavascriptModulesPlugin", options => {
-						return new Parser(options, "script");
-					});
-				normalModuleFactory.hooks.createParser
-					.for("javascript/esm")
-					.tap("JavascriptModulesPlugin", options => {
-						return new Parser(options, "module");
-					});
-				normalModuleFactory.hooks.createGenerator
-					.for("javascript/auto")
-					.tap("JavascriptModulesPlugin", () => {
-						return new JavascriptGenerator();
-					});
-				normalModuleFactory.hooks.createGenerator
-					.for("javascript/dynamic")
-					.tap("JavascriptModulesPlugin", () => {
-						return new JavascriptGenerator();
-					});
-				normalModuleFactory.hooks.createGenerator
-					.for("javascript/esm")
-					.tap("JavascriptModulesPlugin", () => {
-						return new JavascriptGenerator();
-					});
-				compilation.mainTemplate.hooks.renderManifest.tap(
-					"JavascriptModulesPlugin",
-					(result, options) => {
-						const chunk = options.chunk;
-						const hash = options.hash;
-						const fullHash = options.fullHash;
-						const outputOptions = options.outputOptions;
-						const moduleTemplates = options.moduleTemplates;
-						const dependencyTemplates = options.dependencyTemplates;
-
-						const filenameTemplate =
-							chunk.filenameTemplate || outputOptions.filename;
-
-						const useChunkHash = compilation.mainTemplate.useChunkHash(chunk);
-
-						result.push({
-							render: () =>
-								compilation.mainTemplate.render(
-									hash,
-									chunk,
-									moduleTemplates.javascript,
-									dependencyTemplates
-								),
-							filenameTemplate,
-							pathOptions: {
-								noChunkHash: !useChunkHash,
-								contentHashType: "javascript",
-								chunk
-							},
-							identifier: `chunk${chunk.id}`,
-							hash: useChunkHash ? chunk.hash : fullHash
-						});
-						return result;
-					}
-				);
-				compilation.mainTemplate.hooks.modules.tap(
-					"JavascriptModulesPlugin",
-					(source, chunk, hash, moduleTemplate, dependencyTemplates) => {
-						return Template.renderChunkModules(
-							chunk,
-							m => typeof m.source === "function",
-							moduleTemplate,
-							dependencyTemplates,
-							"/******/ "
-						);
-					}
-				);
-				compilation.chunkTemplate.hooks.renderManifest.tap(
-					"JavascriptModulesPlugin",
-					(result, options) => {
-						const chunk = options.chunk;
-						const outputOptions = options.outputOptions;
-						const moduleTemplates = options.moduleTemplates;
-						const dependencyTemplates = options.dependencyTemplates;
-						const filenameTemplate =
-							chunk.filenameTemplate || outputOptions.chunkFilename;
-
-						result.push({
-							render: () =>
-								this.renderJavascript(
-									compilation.chunkTemplate,
-									chunk,
-									moduleTemplates.javascript,
-									dependencyTemplates
-								),
-							filenameTemplate,
-							pathOptions: {
-								chunk,
-								contentHashType: "javascript"
-							},
-							identifier: `chunk${chunk.id}`,
-							hash: chunk.hash
-						});
-
-						return result;
-					}
-				);
-				compilation.hooks.contentHash.tap("JavascriptModulesPlugin", chunk => {
-					const outputOptions = compilation.outputOptions;
-					const {
-						hashSalt,
-						hashDigest,
-						hashDigestLength,
-						hashFunction
-					} = outputOptions;
-					const hash = createHash(hashFunction);
-					if (hashSalt) hash.update(hashSalt);
-					const template = chunk.hasRuntime()
-						? compilation.mainTemplate
-						: compilation.chunkTemplate;
-					hash.update(`${chunk.id} `);
-					hash.update(chunk.ids ? chunk.ids.join(",") : "");
-					template.updateHashForChunk(
-						hash,
-						chunk,
-						compilation.moduleTemplates.javascript,
-						compilation.dependencyTemplates
-					);
-					for (const m of chunk.modulesIterable) {
-						if (typeof m.source === "function") {
-							hash.update(m.hash);
-						}
-					}
-					chunk.contentHash.javascript = hash
-						.digest(hashDigest)
-						.substr(0, hashDigestLength);
-				});
-			}
-		);
-	}
-
-	renderJavascript(chunkTemplate, chunk, moduleTemplate, dependencyTemplates) {
-		const moduleSources = Template.renderChunkModules(
-			chunk,
-			m => typeof m.source === "function",
-			moduleTemplate,
-			dependencyTemplates
-		);
-		const core = chunkTemplate.hooks.modules.call(
-			moduleSources,
-			chunk,
-			moduleTemplate,
-			dependencyTemplates
-		);
-		let source = chunkTemplate.hooks.render.call(
-			core,
-			chunk,
-			moduleTemplate,
-			dependencyTemplates
-		);
-		if (chunk.hasEntryModule()) {
-			source = chunkTemplate.hooks.renderWithEntry.call(source, chunk);
-		}
-		chunk.rendered = true;
-		return new ConcatSource(source, ";");
-	}
-}
-
-module.exports = JavascriptModulesPlugin;
diff --git a/lib/JsonGenerator.js b/lib/JsonGenerator.js
deleted file mode 100644
index 5b4c739538f..00000000000
--- a/lib/JsonGenerator.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const { ConcatSource, RawSource } = require("webpack-sources");
-
-const stringifySafe = data => {
-	const stringified = JSON.stringify(data);
-	if (!stringified) {
-		return undefined; // Invalid JSON
-	}
-
-	return stringified.replace(
-		/\u2028|\u2029/g,
-		str => (str === "\u2029" ? "\\u2029" : "\\u2028")
-	); // invalid in JavaScript but valid JSON
-};
-
-class JsonGenerator {
-	generate(module, dependencyTemplates, runtimeTemplate) {
-		const source = new ConcatSource();
-		const data = module.buildInfo.jsonData;
-		if (data === undefined) {
-			return new RawSource(
-				runtimeTemplate.missingModuleStatement({
-					request: module.rawRequest
-				})
-			);
-		}
-		if (
-			Array.isArray(module.buildMeta.providedExports) &&
-			!module.isUsed("default")
-		) {
-			// Only some exports are used: We can optimize here, by only generating a part of the JSON
-			const reducedJson = {};
-			for (const exportName of module.buildMeta.providedExports) {
-				if (exportName === "default") continue;
-				const used = module.isUsed(exportName);
-				if (used) {
-					reducedJson[used] = data[exportName];
-				}
-			}
-			source.add(
-				`${module.moduleArgument}.exports = ${stringifySafe(reducedJson)};`
-			);
-		} else {
-			source.add(`${module.moduleArgument}.exports = ${stringifySafe(data)};`);
-		}
-		return source;
-	}
-}
-
-module.exports = JsonGenerator;
diff --git a/lib/JsonModulesPlugin.js b/lib/JsonModulesPlugin.js
deleted file mode 100644
index 20b8a034c8a..00000000000
--- a/lib/JsonModulesPlugin.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const JsonParser = require("./JsonParser");
-const JsonGenerator = require("./JsonGenerator");
-
-class JsonModulesPlugin {
-	apply(compiler) {
-		compiler.hooks.compilation.tap(
-			"JsonModulesPlugin",
-			(compilation, { normalModuleFactory }) => {
-				normalModuleFactory.hooks.createParser
-					.for("json")
-					.tap("JsonModulesPlugin", () => {
-						return new JsonParser();
-					});
-				normalModuleFactory.hooks.createGenerator
-					.for("json")
-					.tap("JsonModulesPlugin", () => {
-						return new JsonGenerator();
-					});
-			}
-		);
-	}
-}
-
-module.exports = JsonModulesPlugin;
diff --git a/lib/JsonParser.js b/lib/JsonParser.js
deleted file mode 100644
index f0c59777bb3..00000000000
--- a/lib/JsonParser.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const parseJson = require("json-parse-better-errors");
-const JsonExportsDependency = require("./dependencies/JsonExportsDependency");
-
-class JsonParser {
-	constructor(options) {
-		this.options = options;
-	}
-
-	parse(source, state) {
-		const data = parseJson(source[0] === "\ufeff" ? source.slice(1) : source);
-		state.module.buildInfo.jsonData = data;
-		state.module.buildMeta.exportsType = "named";
-		if (typeof data === "object" && data) {
-			state.module.addDependency(new JsonExportsDependency(Object.keys(data)));
-		}
-		state.module.addDependency(new JsonExportsDependency(["default"]));
-		return state;
-	}
-}
-
-module.exports = JsonParser;
diff --git a/lib/LibManifestPlugin.js b/lib/LibManifestPlugin.js
index 05e98b047cc..80ad2c58769 100644
--- a/lib/LibManifestPlugin.js
+++ b/lib/LibManifestPlugin.js
@@ -2,84 +2,137 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const path = require("path");
 const asyncLib = require("neo-async");
-const SingleEntryDependency = require("./dependencies/SingleEntryDependency");
+const EntryDependency = require("./dependencies/EntryDependency");
+const { someInIterable } = require("./util/IterableHelpers");
+const { compareModulesById } = require("./util/comparators");
+const { dirname, mkdirp } = require("./util/fs");
+
+/** @typedef {import("./ChunkGraph").ModuleId} ModuleId */
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./Compiler").IntermediateFileSystem} IntermediateFileSystem */
+/** @typedef {import("./Module").BuildMeta} BuildMeta */
+
+/**
+ * @typedef {object} ManifestModuleData
+ * @property {string | number} id
+ * @property {BuildMeta=} buildMeta
+ * @property {boolean | string[]=} exports
+ */
+
+/**
+ * @typedef {object} LibManifestPluginOptions
+ * @property {string=} context Context of requests in the manifest file (defaults to the webpack context).
+ * @property {boolean=} entryOnly If true, only entry points will be exposed (default: true).
+ * @property {boolean=} format If true, manifest json file (output) will be formatted.
+ * @property {string=} name Name of the exposed dll function (external name, use value of 'output.library').
+ * @property {string} path Absolute path to the manifest json file (output).
+ * @property {string=} type Type of the dll bundle (external type, use value of 'output.libraryTarget').
+ */
+
+const PLUGIN_NAME = "LibManifestPlugin";
 
 class LibManifestPlugin {
+	/**
+	 * @param {LibManifestPluginOptions} options the options
+	 */
 	constructor(options) {
 		this.options = options;
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		compiler.hooks.emit.tapAsync(
-			"LibManifestPlugin",
+			{ name: PLUGIN_NAME, stage: 110 },
 			(compilation, callback) => {
-				asyncLib.forEach(
-					compilation.chunks,
+				const moduleGraph = compilation.moduleGraph;
+				// store used paths to detect issue and output an error. #18200
+				const usedPaths = new Set();
+				asyncLib.each(
+					Array.from(compilation.chunks),
 					(chunk, callback) => {
-						if (!chunk.isOnlyInitial()) {
+						if (!chunk.canBeInitial()) {
 							callback();
 							return;
 						}
+						const chunkGraph = compilation.chunkGraph;
 						const targetPath = compilation.getPath(this.options.path, {
-							hash: compilation.hash,
 							chunk
 						});
+						if (usedPaths.has(targetPath)) {
+							callback(new Error("each chunk must have a unique path"));
+							return;
+						}
+						usedPaths.add(targetPath);
 						const name =
 							this.options.name &&
 							compilation.getPath(this.options.name, {
-								hash: compilation.hash,
-								chunk
+								chunk,
+								contentHashType: "javascript"
+							});
+						const content = Object.create(null);
+						for (const module of chunkGraph.getOrderedChunkModulesIterable(
+							chunk,
+							compareModulesById(chunkGraph)
+						)) {
+							if (
+								this.options.entryOnly &&
+								!someInIterable(
+									moduleGraph.getIncomingConnections(module),
+									c => c.dependency instanceof EntryDependency
+								)
+							) {
+								continue;
+							}
+							const ident = module.libIdent({
+								context:
+									this.options.context ||
+									/** @type {string} */ (compiler.options.context),
+								associatedObjectForCache: compiler.root
 							});
+							if (ident) {
+								const exportsInfo = moduleGraph.getExportsInfo(module);
+								const providedExports = exportsInfo.getProvidedExports();
+								/** @type {ManifestModuleData} */
+								const data = {
+									id: /** @type {ModuleId} */ (chunkGraph.getModuleId(module)),
+									buildMeta: /** @type {BuildMeta} */ (module.buildMeta),
+									exports: Array.isArray(providedExports)
+										? providedExports
+										: undefined
+								};
+								content[ident] = data;
+							}
+						}
 						const manifest = {
 							name,
 							type: this.options.type,
-							content: Array.from(chunk.modulesIterable, module => {
-								if (
-									this.options.entryOnly &&
-									!module.reasons.some(
-										r => r.dependency instanceof SingleEntryDependency
-									)
-								) {
-									return;
-								}
-								if (module.libIdent) {
-									const ident = module.libIdent({
-										context: this.options.context || compiler.options.context
-									});
-									if (ident) {
-										return {
-											ident,
-											data: {
-												id: module.id,
-												buildMeta: module.buildMeta
-											}
-										};
-									}
-								}
-							})
-								.filter(Boolean)
-								.reduce((obj, item) => {
-									obj[item.ident] = item.data;
-									return obj;
-								}, Object.create(null))
+							content
 						};
 						// Apply formatting to content if format flag is true;
 						const manifestContent = this.options.format
 							? JSON.stringify(manifest, null, 2)
 							: JSON.stringify(manifest);
-						const content = Buffer.from(manifestContent, "utf8");
-						compiler.outputFileSystem.mkdirp(path.dirname(targetPath), err => {
-							if (err) return callback(err);
-							compiler.outputFileSystem.writeFile(
-								targetPath,
-								content,
-								callback
+						const buffer = Buffer.from(manifestContent, "utf8");
+						const intermediateFileSystem =
+							/** @type {IntermediateFileSystem} */ (
+								compiler.intermediateFileSystem
 							);
-						});
+						mkdirp(
+							intermediateFileSystem,
+							dirname(intermediateFileSystem, targetPath),
+							err => {
+								if (err) return callback(err);
+								intermediateFileSystem.writeFile(targetPath, buffer, callback);
+							}
+						);
 					},
 					callback
 				);
diff --git a/lib/LibraryTemplatePlugin.js b/lib/LibraryTemplatePlugin.js
index eb6e7ed26a8..91cc4ab1440 100644
--- a/lib/LibraryTemplatePlugin.js
+++ b/lib/LibraryTemplatePlugin.js
@@ -2,177 +2,46 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const SetVarMainTemplatePlugin = require("./SetVarMainTemplatePlugin");
+const EnableLibraryPlugin = require("./library/EnableLibraryPlugin");
 
-/** @typedef {import("../declarations/WebpackOptions").LibraryCustomUmdObject} LibraryCustomUmdObject */
+/** @typedef {import("../declarations/WebpackOptions").AuxiliaryComment} AuxiliaryComment */
+/** @typedef {import("../declarations/WebpackOptions").LibraryExport} LibraryExport */
+/** @typedef {import("../declarations/WebpackOptions").LibraryName} LibraryName */
+/** @typedef {import("../declarations/WebpackOptions").LibraryType} LibraryType */
+/** @typedef {import("../declarations/WebpackOptions").UmdNamedDefine} UmdNamedDefine */
 /** @typedef {import("./Compiler")} Compiler */
 
-/**
- * @param {string[]} accessor the accessor to convert to path
- * @returns {string} the path
- */
-const accessorToObjectAccess = accessor => {
-	return accessor.map(a => `[${JSON.stringify(a)}]`).join("");
-};
-
-/**
- * @param {string=} base the path prefix
- * @param {string|string[]|LibraryCustomUmdObject} accessor the accessor
- * @param {"amd" | "commonjs" | "root"} umdProperty property used when a custom umd object is provided
- * @param {string=} joinWith the element separator
- * @returns {string} the path
- */
-const accessorAccess = (base, accessor, umdProperty, joinWith = "; ") => {
-	const normalizedAccessor =
-		typeof accessor === "object" && !Array.isArray(accessor)
-			? accessor[umdProperty]
-			: accessor;
-	const accessors = Array.isArray(normalizedAccessor)
-		? normalizedAccessor
-		: [normalizedAccessor];
-	return accessors
-		.map((_, idx) => {
-			const a = base
-				? base + accessorToObjectAccess(accessors.slice(0, idx + 1))
-				: accessors[0] + accessorToObjectAccess(accessors.slice(1, idx + 1));
-			if (idx === accessors.length - 1) return a;
-			if (idx === 0 && base === undefined) {
-				return `${a} = typeof ${a} === "object" ? ${a} : {}`;
-			}
-			return `${a} = ${a} || {}`;
-		})
-		.join(joinWith);
-};
-
+// TODO webpack 6 remove
 class LibraryTemplatePlugin {
 	/**
-	 * @param {string|string[]|LibraryCustomUmdObject} name name of library
-	 * @param {string} target type of library
-	 * @param {boolean} umdNamedDefine setting this to true will name the UMD module
-	 * @param {string|TODO} auxiliaryComment comment in the UMD wrapper
-	 * @param {string|string[]} exportProperty which export should be exposed as library
+	 * @param {LibraryName} name name of library
+	 * @param {LibraryType} target type of library
+	 * @param {UmdNamedDefine} umdNamedDefine setting this to true will name the UMD module
+	 * @param {AuxiliaryComment} auxiliaryComment comment in the UMD wrapper
+	 * @param {LibraryExport} exportProperty which export should be exposed as library
 	 */
 	constructor(name, target, umdNamedDefine, auxiliaryComment, exportProperty) {
-		this.name = name;
-		this.target = target;
-		this.umdNamedDefine = umdNamedDefine;
-		this.auxiliaryComment = auxiliaryComment;
-		this.exportProperty = exportProperty;
+		this.library = {
+			type: target || "var",
+			name,
+			umdNamedDefine,
+			auxiliaryComment,
+			export: exportProperty
+		};
 	}
 
 	/**
+	 * Apply the plugin
 	 * @param {Compiler} compiler the compiler instance
 	 * @returns {void}
 	 */
 	apply(compiler) {
-		compiler.hooks.thisCompilation.tap("LibraryTemplatePlugin", compilation => {
-			if (this.exportProperty) {
-				const ExportPropertyMainTemplatePlugin = require("./ExportPropertyMainTemplatePlugin");
-				new ExportPropertyMainTemplatePlugin(this.exportProperty).apply(
-					compilation
-				);
-			}
-			switch (this.target) {
-				case "var":
-					if (
-						!this.name ||
-						(typeof this.name === "object" && !Array.isArray(this.name))
-					) {
-						throw new Error(
-							"library name must be set and not an UMD custom object for non-UMD target"
-						);
-					}
-					new SetVarMainTemplatePlugin(
-						`var ${accessorAccess(undefined, this.name, "root")}`,
-						false
-					).apply(compilation);
-					break;
-				case "assign":
-					new SetVarMainTemplatePlugin(
-						accessorAccess(undefined, this.name, "root"),
-						false
-					).apply(compilation);
-					break;
-				case "this":
-				case "self":
-				case "window":
-					if (this.name) {
-						new SetVarMainTemplatePlugin(
-							accessorAccess(this.target, this.name, "root"),
-							false
-						).apply(compilation);
-					} else {
-						new SetVarMainTemplatePlugin(this.target, true).apply(compilation);
-					}
-					break;
-				case "global":
-					if (this.name) {
-						new SetVarMainTemplatePlugin(
-							accessorAccess(
-								compilation.runtimeTemplate.outputOptions.globalObject,
-								this.name,
-								"root"
-							),
-							false
-						).apply(compilation);
-					} else {
-						new SetVarMainTemplatePlugin(
-							compilation.runtimeTemplate.outputOptions.globalObject,
-							true
-						).apply(compilation);
-					}
-					break;
-				case "commonjs":
-					if (this.name) {
-						new SetVarMainTemplatePlugin(
-							accessorAccess("exports", this.name, "commonjs"),
-							false
-						).apply(compilation);
-					} else {
-						new SetVarMainTemplatePlugin("exports", true).apply(compilation);
-					}
-					break;
-				case "commonjs2":
-				case "commonjs-module":
-					new SetVarMainTemplatePlugin("module.exports", false).apply(
-						compilation
-					);
-					break;
-				case "amd":
-				case "amd-require": {
-					const AmdMainTemplatePlugin = require("./AmdMainTemplatePlugin");
-					if (this.name && typeof this.name !== "string") {
-						throw new Error("library name must be a string for amd target");
-					}
-					new AmdMainTemplatePlugin({
-						name: this.name,
-						requireAsWrapper: this.target === "amd-require"
-					}).apply(compilation);
-					break;
-				}
-				case "umd":
-				case "umd2": {
-					const UmdMainTemplatePlugin = require("./UmdMainTemplatePlugin");
-					new UmdMainTemplatePlugin(this.name, {
-						optionalAmdExternalAsGlobal: this.target === "umd2",
-						namedDefine: this.umdNamedDefine,
-						auxiliaryComment: this.auxiliaryComment
-					}).apply(compilation);
-					break;
-				}
-				case "jsonp": {
-					const JsonpExportMainTemplatePlugin = require("./web/JsonpExportMainTemplatePlugin");
-					if (typeof this.name !== "string")
-						throw new Error("library name must be a string for jsonp target");
-					new JsonpExportMainTemplatePlugin(this.name).apply(compilation);
-					break;
-				}
-				default:
-					throw new Error(`${this.target} is not a valid Library target`);
-			}
-		});
+		const { output } = compiler.options;
+		output.library = this.library;
+		new EnableLibraryPlugin(this.library.type).apply(compiler);
 	}
 }
 
diff --git a/lib/LoaderOptionsPlugin.js b/lib/LoaderOptionsPlugin.js
index 651987b8d71..0ff521bf474 100644
--- a/lib/LoaderOptionsPlugin.js
+++ b/lib/LoaderOptionsPlugin.js
@@ -2,36 +2,64 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const ModuleFilenameHelpers = require("./ModuleFilenameHelpers");
-
-const validateOptions = require("schema-utils");
-const schema = require("../schemas/plugins/LoaderOptionsPlugin.json");
+const NormalModule = require("./NormalModule");
+const createSchemaValidation = require("./util/create-schema-validation");
 
 /** @typedef {import("../declarations/plugins/LoaderOptionsPlugin").LoaderOptionsPluginOptions} LoaderOptionsPluginOptions */
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./ModuleFilenameHelpers").Matcher} Matcher  */
+/** @typedef {import("./ModuleFilenameHelpers").MatchObject} MatchObject  */
+
+/**
+ * @template T
+ * @typedef {import("../declarations/LoaderContext").LoaderContext} LoaderContext
+ */
+
+const validate = createSchemaValidation(
+	require("../schemas/plugins/LoaderOptionsPlugin.check.js"),
+	() => require("../schemas/plugins/LoaderOptionsPlugin.json"),
+	{
+		name: "Loader Options Plugin",
+		baseDataPath: "options"
+	}
+);
+
+const PLUGIN_NAME = "LoaderOptionsPlugin";
 
 class LoaderOptionsPlugin {
 	/**
-	 * @param {LoaderOptionsPluginOptions} options options object
+	 * @param {LoaderOptionsPluginOptions & MatchObject} options options object
 	 */
-	constructor(options) {
-		validateOptions(schema, options || {}, "Loader Options Plugin");
-
+	constructor(options = {}) {
+		validate(options);
+		// If no options are set then generate empty options object
 		if (typeof options !== "object") options = {};
 		if (!options.test) {
-			options.test = {
+			/** @type {TODO} */
+			const defaultTrueMockRegExp = {
 				test: () => true
 			};
+
+			/** @type {RegExp} */
+			options.test = defaultTrueMockRegExp;
 		}
 		this.options = options;
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		const options = this.options;
-		compiler.hooks.compilation.tap("LoaderOptionsPlugin", compilation => {
-			compilation.hooks.normalModuleLoader.tap(
-				"LoaderOptionsPlugin",
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			NormalModule.getCompilationHooks(compilation).loader.tap(
+				PLUGIN_NAME,
 				(context, module) => {
 					const resource = module.resource;
 					if (!resource) return;
@@ -39,14 +67,16 @@ class LoaderOptionsPlugin {
 					if (
 						ModuleFilenameHelpers.matchObject(
 							options,
-							i < 0 ? resource : resource.substr(0, i)
+							i < 0 ? resource : resource.slice(0, i)
 						)
 					) {
 						for (const key of Object.keys(options)) {
 							if (key === "include" || key === "exclude" || key === "test") {
 								continue;
 							}
-							context[key] = options[key];
+
+							/** @type {TODO} */
+							(context)[key] = options[key];
 						}
 					}
 				}
diff --git a/lib/LoaderTargetPlugin.js b/lib/LoaderTargetPlugin.js
index 99ffbc9979d..e6ea9810db6 100644
--- a/lib/LoaderTargetPlugin.js
+++ b/lib/LoaderTargetPlugin.js
@@ -2,17 +2,32 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const NormalModule = require("./NormalModule");
+
+/** @typedef {import("./Compiler")} Compiler */
+
+const PLUGIN_NAME = "LoaderTargetPlugin";
+
 class LoaderTargetPlugin {
+	/**
+	 * @param {string} target the target
+	 */
 	constructor(target) {
 		this.target = target;
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		compiler.hooks.compilation.tap("LoaderTargetPlugin", compilation => {
-			compilation.hooks.normalModuleLoader.tap(
-				"LoaderTargetPlugin",
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			NormalModule.getCompilationHooks(compilation).loader.tap(
+				PLUGIN_NAME,
 				loaderContext => {
 					loaderContext.target = this.target;
 				}
diff --git a/lib/MainTemplate.js b/lib/MainTemplate.js
index db42205e7de..06ecbb04552 100644
--- a/lib/MainTemplate.js
+++ b/lib/MainTemplate.js
@@ -2,88 +2,271 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const {
-	ConcatSource,
-	OriginalSource,
-	PrefixSource,
-	RawSource
-} = require("webpack-sources");
-const {
-	Tapable,
-	SyncWaterfallHook,
-	SyncHook,
-	SyncBailHook
-} = require("tapable");
-const Template = require("./Template");
+const { SyncWaterfallHook } = require("tapable");
+const util = require("util");
+const RuntimeGlobals = require("./RuntimeGlobals");
+const memoize = require("./util/memoize");
 
+/** @typedef {import("tapable").Tap} Tap */
 /** @typedef {import("webpack-sources").ConcatSource} ConcatSource */
 /** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../declarations/WebpackOptions").Output} OutputOptions */
 /** @typedef {import("./ModuleTemplate")} ModuleTemplate */
 /** @typedef {import("./Chunk")} Chunk */
+/** @typedef {import("./Compilation")} Compilation */
+/** @typedef {import("./Compilation").AssetInfo} AssetInfo */
+/** @typedef {import("./Compilation").InterpolatedPathAndAssetInfo} InterpolatedPathAndAssetInfo */
 /** @typedef {import("./Module")} Module} */
-/** @typedef {import("./util/createHash").Hash} Hash} */
-/** @typedef {import("./Dependency").DependencyTemplate} DependencyTemplate} */
-
+/** @typedef {import("./util/Hash")} Hash} */
+/** @typedef {import("./DependencyTemplates")} DependencyTemplates} */
+/** @typedef {import("./javascript/JavascriptModulesPlugin").RenderContext} RenderContext} */
+/** @typedef {import("./javascript/JavascriptModulesPlugin").RenderBootstrapContext} RenderBootstrapContext} */
+/** @typedef {import("./javascript/JavascriptModulesPlugin").ChunkHashContext} ChunkHashContext} */
+/** @typedef {import("./RuntimeTemplate")} RuntimeTemplate} */
+/** @typedef {import("./ModuleGraph")} ModuleGraph} */
+/** @typedef {import("./ChunkGraph")} ChunkGraph} */
+/** @typedef {import("./Template").RenderManifestOptions} RenderManifestOptions} */
+/** @typedef {import("./Template").RenderManifestEntry} RenderManifestEntry} */
+/** @typedef {import("./TemplatedPathPlugin").TemplatePath} TemplatePath} */
+/** @typedef {import("./TemplatedPathPlugin").PathData} PathData} */
 /**
- * @typedef {Object} RenderManifestOptions
- * @property {Chunk} chunk the chunk used to render
- * @property {string} hash
- * @property {string} fullHash
- * @property {TODO} outputOptions
- * @property {{javascript: ModuleTemplate, webassembly: ModuleTemplate}} moduleTemplates
- * @property {Map} dependencyTemplates
+ * @template T
+ * @typedef {import("tapable").IfSet} IfSet
  */
 
-// require function shortcuts:
-// __webpack_require__.s = the module id of the entry point
-// __webpack_require__.c = the module cache
-// __webpack_require__.m = the module functions
-// __webpack_require__.p = the bundle public path
-// __webpack_require__.i = the identity function used for harmony imports
-// __webpack_require__.e = the chunk ensure function
-// __webpack_require__.d = the exported property define getter function
-// __webpack_require__.o = Object.prototype.hasOwnProperty.call
-// __webpack_require__.r = define compatibility on export
-// __webpack_require__.t = create a fake namespace object
-// __webpack_require__.n = compatibility get default export
-// __webpack_require__.h = the webpack hash
-// __webpack_require__.w = an object containing all installed WebAssembly.Instance export objects keyed by module id
-// __webpack_require__.oe = the uncaught error handler for the webpack runtime
-// __webpack_require__.nc = the script nonce
+const getJavascriptModulesPlugin = memoize(() =>
+	require("./javascript/JavascriptModulesPlugin")
+);
+const getJsonpTemplatePlugin = memoize(() =>
+	require("./web/JsonpTemplatePlugin")
+);
+const getLoadScriptRuntimeModule = memoize(() =>
+	require("./runtime/LoadScriptRuntimeModule")
+);
 
-module.exports = class MainTemplate extends Tapable {
+// TODO webpack 6 remove this class
+class MainTemplate {
 	/**
-	 *
-	 * @param {TODO=} outputOptions output options for the MainTemplate
+	 * @param {OutputOptions} outputOptions output options for the MainTemplate
+	 * @param {Compilation} compilation the compilation
 	 */
-	constructor(outputOptions) {
-		super();
-		/** @type {TODO?} */
-		this.outputOptions = outputOptions || {};
-		this.hooks = {
-			/** @type {SyncWaterfallHook} */
-			renderManifest: new SyncWaterfallHook(["result", "options"]),
-			modules: new SyncWaterfallHook([
-				"modules",
-				"chunk",
-				"hash",
-				"moduleTemplate",
-				"dependencyTemplates"
-			]),
-			moduleObj: new SyncWaterfallHook([
-				"source",
-				"chunk",
-				"hash",
-				"moduleIdExpression"
-			]),
-			requireEnsure: new SyncWaterfallHook([
-				"source",
-				"chunk",
-				"hash",
-				"chunkIdExpression"
-			]),
+	constructor(outputOptions, compilation) {
+		/** @type {OutputOptions} */
+		this._outputOptions = outputOptions || {};
+		this.hooks = Object.freeze({
+			renderManifest: {
+				tap: util.deprecate(
+					/**
+					 * @template AdditionalOptions
+					 * @param {string | Tap & IfSet} options options
+					 * @param {(renderManifestEntries: RenderManifestEntry[], renderManifestOptions: RenderManifestOptions) => RenderManifestEntry[]} fn fn
+					 */
+					(options, fn) => {
+						compilation.hooks.renderManifest.tap(
+							options,
+							(entries, options) => {
+								if (!options.chunk.hasRuntime()) return entries;
+								return fn(entries, options);
+							}
+						);
+					},
+					"MainTemplate.hooks.renderManifest is deprecated (use Compilation.hooks.renderManifest instead)",
+					"DEP_WEBPACK_MAIN_TEMPLATE_RENDER_MANIFEST"
+				)
+			},
+			modules: {
+				tap: () => {
+					throw new Error(
+						"MainTemplate.hooks.modules has been removed (there is no replacement, please create an issue to request that)"
+					);
+				}
+			},
+			moduleObj: {
+				tap: () => {
+					throw new Error(
+						"MainTemplate.hooks.moduleObj has been removed (there is no replacement, please create an issue to request that)"
+					);
+				}
+			},
+			require: {
+				tap: util.deprecate(
+					/**
+					 * @template AdditionalOptions
+					 * @param {string | Tap & IfSet} options options
+					 * @param {(value: string, renderBootstrapContext: RenderBootstrapContext) => string} fn fn
+					 */
+					(options, fn) => {
+						getJavascriptModulesPlugin()
+							.getCompilationHooks(compilation)
+							.renderRequire.tap(options, fn);
+					},
+					"MainTemplate.hooks.require is deprecated (use JavascriptModulesPlugin.getCompilationHooks().renderRequire instead)",
+					"DEP_WEBPACK_MAIN_TEMPLATE_REQUIRE"
+				)
+			},
+			beforeStartup: {
+				tap: () => {
+					throw new Error(
+						"MainTemplate.hooks.beforeStartup has been removed (use RuntimeGlobals.startupOnlyBefore instead)"
+					);
+				}
+			},
+			startup: {
+				tap: () => {
+					throw new Error(
+						"MainTemplate.hooks.startup has been removed (use RuntimeGlobals.startup instead)"
+					);
+				}
+			},
+			afterStartup: {
+				tap: () => {
+					throw new Error(
+						"MainTemplate.hooks.afterStartup has been removed (use RuntimeGlobals.startupOnlyAfter instead)"
+					);
+				}
+			},
+			render: {
+				tap: util.deprecate(
+					/**
+					 * @template AdditionalOptions
+					 * @param {string | Tap & IfSet} options options
+					 * @param {(source: Source, chunk: Chunk, hash: string | undefined, moduleTemplate: ModuleTemplate, dependencyTemplates: DependencyTemplates) => Source} fn fn
+					 */
+					(options, fn) => {
+						getJavascriptModulesPlugin()
+							.getCompilationHooks(compilation)
+							.render.tap(options, (source, renderContext) => {
+								if (
+									renderContext.chunkGraph.getNumberOfEntryModules(
+										renderContext.chunk
+									) === 0 ||
+									!renderContext.chunk.hasRuntime()
+								) {
+									return source;
+								}
+								return fn(
+									source,
+									renderContext.chunk,
+									compilation.hash,
+									compilation.moduleTemplates.javascript,
+									compilation.dependencyTemplates
+								);
+							});
+					},
+					"MainTemplate.hooks.render is deprecated (use JavascriptModulesPlugin.getCompilationHooks().render instead)",
+					"DEP_WEBPACK_MAIN_TEMPLATE_RENDER"
+				)
+			},
+			renderWithEntry: {
+				tap: util.deprecate(
+					/**
+					 * @template AdditionalOptions
+					 * @param {string | Tap & IfSet} options options
+					 * @param {(source: Source, chunk: Chunk, hash: string | undefined) => Source} fn fn
+					 */
+					(options, fn) => {
+						getJavascriptModulesPlugin()
+							.getCompilationHooks(compilation)
+							.render.tap(options, (source, renderContext) => {
+								if (
+									renderContext.chunkGraph.getNumberOfEntryModules(
+										renderContext.chunk
+									) === 0 ||
+									!renderContext.chunk.hasRuntime()
+								) {
+									return source;
+								}
+								return fn(source, renderContext.chunk, compilation.hash);
+							});
+					},
+					"MainTemplate.hooks.renderWithEntry is deprecated (use JavascriptModulesPlugin.getCompilationHooks().render instead)",
+					"DEP_WEBPACK_MAIN_TEMPLATE_RENDER_WITH_ENTRY"
+				)
+			},
+			assetPath: {
+				tap: util.deprecate(
+					/**
+					 * @template AdditionalOptions
+					 * @param {string | Tap & IfSet} options options
+					 * @param {(value: string, path: PathData, assetInfo: AssetInfo | undefined) => string} fn fn
+					 */
+					(options, fn) => {
+						compilation.hooks.assetPath.tap(options, fn);
+					},
+					"MainTemplate.hooks.assetPath is deprecated (use Compilation.hooks.assetPath instead)",
+					"DEP_WEBPACK_MAIN_TEMPLATE_ASSET_PATH"
+				),
+				call: util.deprecate(
+					/**
+					 * @param {TemplatePath} filename used to get asset path with hash
+					 * @param {PathData} options context data
+					 * @returns {string} interpolated path
+					 */
+					(filename, options) => compilation.getAssetPath(filename, options),
+					"MainTemplate.hooks.assetPath is deprecated (use Compilation.hooks.assetPath instead)",
+					"DEP_WEBPACK_MAIN_TEMPLATE_ASSET_PATH"
+				)
+			},
+			hash: {
+				tap: util.deprecate(
+					/**
+					 * @template AdditionalOptions
+					 * @param {string | Tap & IfSet} options options
+					 * @param {(hash: Hash) => void} fn fn
+					 */
+					(options, fn) => {
+						compilation.hooks.fullHash.tap(options, fn);
+					},
+					"MainTemplate.hooks.hash is deprecated (use Compilation.hooks.fullHash instead)",
+					"DEP_WEBPACK_MAIN_TEMPLATE_HASH"
+				)
+			},
+			hashForChunk: {
+				tap: util.deprecate(
+					/**
+					 * @template AdditionalOptions
+					 * @param {string | Tap & IfSet} options options
+					 * @param {(hash: Hash, chunk: Chunk) => void} fn fn
+					 */
+					(options, fn) => {
+						getJavascriptModulesPlugin()
+							.getCompilationHooks(compilation)
+							.chunkHash.tap(options, (chunk, hash) => {
+								if (!chunk.hasRuntime()) return;
+								return fn(hash, chunk);
+							});
+					},
+					"MainTemplate.hooks.hashForChunk is deprecated (use JavascriptModulesPlugin.getCompilationHooks().chunkHash instead)",
+					"DEP_WEBPACK_MAIN_TEMPLATE_HASH_FOR_CHUNK"
+				)
+			},
+			globalHashPaths: {
+				tap: util.deprecate(
+					() => {},
+					"MainTemplate.hooks.globalHashPaths has been removed (it's no longer needed)",
+					"DEP_WEBPACK_MAIN_TEMPLATE_HASH_FOR_CHUNK"
+				)
+			},
+			globalHash: {
+				tap: util.deprecate(
+					() => {},
+					"MainTemplate.hooks.globalHash has been removed (it's no longer needed)",
+					"DEP_WEBPACK_MAIN_TEMPLATE_HASH_FOR_CHUNK"
+				)
+			},
+			hotBootstrap: {
+				tap: () => {
+					throw new Error(
+						"MainTemplate.hooks.hotBootstrap has been removed (use your own RuntimeModule instead)"
+					);
+				}
+			},
+
+			// for compatibility:
+			/** @type {SyncWaterfallHook<[string, Chunk, string, ModuleTemplate, DependencyTemplates]>} */
 			bootstrap: new SyncWaterfallHook([
 				"source",
 				"chunk",
@@ -91,458 +274,109 @@ module.exports = class MainTemplate extends Tapable {
 				"moduleTemplate",
 				"dependencyTemplates"
 			]),
+			/** @type {SyncWaterfallHook<[string, Chunk, string]>} */
 			localVars: new SyncWaterfallHook(["source", "chunk", "hash"]),
-			require: new SyncWaterfallHook(["source", "chunk", "hash"]),
+			/** @type {SyncWaterfallHook<[string, Chunk, string]>} */
 			requireExtensions: new SyncWaterfallHook(["source", "chunk", "hash"]),
-			/** @type {SyncWaterfallHook} */
-			beforeStartup: new SyncWaterfallHook(["source", "chunk", "hash"]),
-			/** @type {SyncWaterfallHook} */
-			startup: new SyncWaterfallHook(["source", "chunk", "hash"]),
-			render: new SyncWaterfallHook([
-				"source",
-				"chunk",
-				"hash",
-				"moduleTemplate",
-				"dependencyTemplates"
-			]),
-			renderWithEntry: new SyncWaterfallHook(["source", "chunk", "hash"]),
-			moduleRequire: new SyncWaterfallHook([
-				"source",
-				"chunk",
-				"hash",
-				"moduleIdExpression"
-			]),
-			addModule: new SyncWaterfallHook([
+			/** @type {SyncWaterfallHook<[string, Chunk, string, string]>} */
+			requireEnsure: new SyncWaterfallHook([
 				"source",
 				"chunk",
 				"hash",
-				"moduleIdExpression",
-				"moduleExpression"
+				"chunkIdExpression"
 			]),
-			currentHash: new SyncWaterfallHook(["source", "requestedLength"]),
-			assetPath: new SyncWaterfallHook(["path", "options"]),
-			hash: new SyncHook(["hash"]),
-			hashForChunk: new SyncHook(["hash", "chunk"]),
-			globalHashPaths: new SyncWaterfallHook(["paths"]),
-			globalHash: new SyncBailHook(["chunk", "paths"]),
-
-			// TODO this should be moved somewhere else
-			// It's weird here
-			hotBootstrap: new SyncWaterfallHook(["source", "chunk", "hash"])
-		};
-		this.hooks.startup.tap("MainTemplate", (source, chunk, hash) => {
-			/** @type {string[]} */
-			const buf = [];
-			if (chunk.entryModule) {
-				buf.push("// Load entry module and return exports");
-				buf.push(
-					`return ${this.renderRequireFunctionForModule(
-						hash,
-						chunk,
-						JSON.stringify(chunk.entryModule.id)
-					)}(${this.requireFn}.s = ${JSON.stringify(chunk.entryModule.id)});`
-				);
+			get jsonpScript() {
+				const hooks =
+					getLoadScriptRuntimeModule().getCompilationHooks(compilation);
+				return hooks.createScript;
+			},
+			get linkPrefetch() {
+				const hooks = getJsonpTemplatePlugin().getCompilationHooks(compilation);
+				return hooks.linkPrefetch;
+			},
+			get linkPreload() {
+				const hooks = getJsonpTemplatePlugin().getCompilationHooks(compilation);
+				return hooks.linkPreload;
 			}
-			return Template.asString(buf);
-		});
-		this.hooks.render.tap(
-			"MainTemplate",
-			(bootstrapSource, chunk, hash, moduleTemplate, dependencyTemplates) => {
-				const source = new ConcatSource();
-				source.add("/******/ (function(modules) { // webpackBootstrap\n");
-				source.add(new PrefixSource("/******/", bootstrapSource));
-				source.add("/******/ })\n");
-				source.add(
-					"/************************************************************************/\n"
-				);
-				source.add("/******/ (");
-				source.add(
-					this.hooks.modules.call(
-						new RawSource(""),
-						chunk,
-						hash,
-						moduleTemplate,
-						dependencyTemplates
-					)
-				);
-				source.add(")");
-				return source;
-			}
-		);
-		this.hooks.localVars.tap("MainTemplate", (source, chunk, hash) => {
-			return Template.asString([
-				source,
-				"// The module cache",
-				"var installedModules = {};"
-			]);
 		});
-		this.hooks.require.tap("MainTemplate", (source, chunk, hash) => {
-			return Template.asString([
-				source,
-				"// Check if module is in cache",
-				"if(installedModules[moduleId]) {",
-				Template.indent("return installedModules[moduleId].exports;"),
-				"}",
-				"// Create a new module (and put it into the cache)",
-				"var module = installedModules[moduleId] = {",
-				Template.indent(this.hooks.moduleObj.call("", chunk, hash, "moduleId")),
-				"};",
-				"",
-				Template.asString(
-					outputOptions.strictModuleExceptionHandling
-						? [
-								"// Execute the module function",
-								"var threw = true;",
-								"try {",
-								Template.indent([
-									`modules[moduleId].call(module.exports, module, module.exports, ${this.renderRequireFunctionForModule(
-										hash,
-										chunk,
-										"moduleId"
-									)});`,
-									"threw = false;"
-								]),
-								"} finally {",
-								Template.indent([
-									"if(threw) delete installedModules[moduleId];"
-								]),
-								"}"
-						  ]
-						: [
-								"// Execute the module function",
-								`modules[moduleId].call(module.exports, module, module.exports, ${this.renderRequireFunctionForModule(
-									hash,
-									chunk,
-									"moduleId"
-								)});`
-						  ]
-				),
-				"",
-				"// Flag the module as loaded",
-				"module.l = true;",
-				"",
-				"// Return the exports of the module",
-				"return module.exports;"
-			]);
-		});
-		this.hooks.moduleObj.tap(
-			"MainTemplate",
-			(source, chunk, hash, varModuleId) => {
-				return Template.asString(["i: moduleId,", "l: false,", "exports: {}"]);
-			}
-		);
-		this.hooks.requireExtensions.tap("MainTemplate", (source, chunk, hash) => {
-			const buf = [];
-			const chunkMaps = chunk.getChunkMaps();
-			// Check if there are non initial chunks which need to be imported using require-ensure
-			if (Object.keys(chunkMaps.hash).length) {
-				buf.push("// This file contains only the entry chunk.");
-				buf.push("// The chunk loading function for additional chunks");
-				buf.push(`${this.requireFn}.e = function requireEnsure(chunkId) {`);
-				buf.push(Template.indent("var promises = [];"));
-				buf.push(
-					Template.indent(
-						this.hooks.requireEnsure.call("", chunk, hash, "chunkId")
-					)
-				);
-				buf.push(Template.indent("return Promise.all(promises);"));
-				buf.push("};");
-			} else if (
-				chunk.hasModuleInGraph(m =>
-					m.blocks.some(b => b.chunkGroup && b.chunkGroup.chunks.length > 0)
-				)
-			) {
-				// There async blocks in the graph, so we need to add an empty requireEnsure
-				// function anyway. This can happen with multiple entrypoints.
-				buf.push("// The chunk loading function for additional chunks");
-				buf.push("// Since all referenced chunks are already included");
-				buf.push("// in this file, this function is empty here.");
-				buf.push(`${this.requireFn}.e = function requireEnsure() {`);
-				buf.push(Template.indent("return Promise.resolve();"));
-				buf.push("};");
-			}
-			buf.push("");
-			buf.push("// expose the modules object (__webpack_modules__)");
-			buf.push(`${this.requireFn}.m = modules;`);
 
-			buf.push("");
-			buf.push("// expose the module cache");
-			buf.push(`${this.requireFn}.c = installedModules;`);
-
-			buf.push("");
-			buf.push("// define getter function for harmony exports");
-			buf.push(`${this.requireFn}.d = function(exports, name, getter) {`);
-			buf.push(
-				Template.indent([
-					`if(!${this.requireFn}.o(exports, name)) {`,
-					Template.indent([
-						"Object.defineProperty(exports, name, { enumerable: true, get: getter });"
-					]),
-					"}"
-				])
-			);
-			buf.push("};");
-
-			buf.push("");
-			buf.push("// define __esModule on exports");
-			buf.push(`${this.requireFn}.r = function(exports) {`);
-			buf.push(
-				Template.indent([
-					"if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {",
-					Template.indent([
-						"Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });"
-					]),
-					"}",
-					"Object.defineProperty(exports, '__esModule', { value: true });"
-				])
-			);
-			buf.push("};");
-
-			buf.push("");
-			buf.push("// create a fake namespace object");
-			buf.push("// mode & 1: value is a module id, require it");
-			buf.push("// mode & 2: merge all properties of value into the ns");
-			buf.push("// mode & 4: return value when already ns object");
-			buf.push("// mode & 8|1: behave like require");
-			buf.push(`${this.requireFn}.t = function(value, mode) {`);
-			buf.push(
-				Template.indent([
-					`if(mode & 1) value = ${this.requireFn}(value);`,
-					`if(mode & 8) return value;`,
-					"if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;",
-					"var ns = Object.create(null);",
-					`${this.requireFn}.r(ns);`,
-					"Object.defineProperty(ns, 'default', { enumerable: true, value: value });",
-					"if(mode & 2 && typeof value != 'string') for(var key in value) " +
-						`${this.requireFn}.d(ns, key, function(key) { ` +
-						"return value[key]; " +
-						"}.bind(null, key));",
-					"return ns;"
-				])
-			);
-			buf.push("};");
-
-			buf.push("");
-			buf.push(
-				"// getDefaultExport function for compatibility with non-harmony modules"
-			);
-			buf.push(this.requireFn + ".n = function(module) {");
-			buf.push(
-				Template.indent([
-					"var getter = module && module.__esModule ?",
-					Template.indent([
-						"function getDefault() { return module['default']; } :",
-						"function getModuleExports() { return module; };"
-					]),
-					`${this.requireFn}.d(getter, 'a', getter);`,
-					"return getter;"
-				])
-			);
-			buf.push("};");
-
-			buf.push("");
-			buf.push("// Object.prototype.hasOwnProperty.call");
-			buf.push(
-				`${
-					this.requireFn
-				}.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };`
-			);
-
-			const publicPath = this.getPublicPath({
-				hash: hash
-			});
-			buf.push("");
-			buf.push("// __webpack_public_path__");
-			buf.push(`${this.requireFn}.p = ${JSON.stringify(publicPath)};`);
-			return Template.asString(buf);
-		});
-
-		this.requireFn = "__webpack_require__";
-	}
-
-	/**
-	 *
-	 * @param {RenderManifestOptions} options render manifest options
-	 * @returns {TODO[]} returns render manifest
-	 */
-	getRenderManifest(options) {
-		const result = [];
-
-		this.hooks.renderManifest.call(result, options);
-
-		return result;
-	}
-
-	/**
-	 * TODO webpack 5: remove moduleTemplate and dependencyTemplates
-	 * @param {string} hash hash to be used for render call
-	 * @param {Chunk} chunk Chunk instance
-	 * @param {ModuleTemplate} moduleTemplate ModuleTemplate instance for render
-	 * @param {Map} dependencyTemplates dependency templates
-	 * @returns {string[]} the generated source of the bootstrap code
-	 */
-	renderBootstrap(hash, chunk, moduleTemplate, dependencyTemplates) {
-		const buf = [];
-		buf.push(
-			this.hooks.bootstrap.call(
-				"",
-				chunk,
-				hash,
-				moduleTemplate,
-				dependencyTemplates
-			)
-		);
-		buf.push(this.hooks.localVars.call("", chunk, hash));
-		buf.push("");
-		buf.push("// The require function");
-		buf.push(`function ${this.requireFn}(moduleId) {`);
-		buf.push(Template.indent(this.hooks.require.call("", chunk, hash)));
-		buf.push("}");
-		buf.push("");
-		buf.push(
-			Template.asString(this.hooks.requireExtensions.call("", chunk, hash))
+		this.renderCurrentHashCode = util.deprecate(
+			/**
+			 * @deprecated
+			 * @param {string} hash the hash
+			 * @param {number=} length length of the hash
+			 * @returns {string} generated code
+			 */
+			(hash, length) => {
+				if (length) {
+					return `${RuntimeGlobals.getFullHash} ? ${
+						RuntimeGlobals.getFullHash
+					}().slice(0, ${length}) : ${hash.slice(0, length)}`;
+				}
+				return `${RuntimeGlobals.getFullHash} ? ${RuntimeGlobals.getFullHash}() : ${hash}`;
+			},
+			"MainTemplate.renderCurrentHashCode is deprecated (use RuntimeGlobals.getFullHash runtime function instead)",
+			"DEP_WEBPACK_MAIN_TEMPLATE_RENDER_CURRENT_HASH_CODE"
 		);
-		buf.push("");
-		buf.push(Template.asString(this.hooks.beforeStartup.call("", chunk, hash)));
-		buf.push(Template.asString(this.hooks.startup.call("", chunk, hash)));
-		return buf;
-	}
 
-	/**
-	 * @param {string} hash hash to be used for render call
-	 * @param {Chunk} chunk Chunk instance
-	 * @param {ModuleTemplate} moduleTemplate ModuleTemplate instance for render
-	 * @param {Map} dependencyTemplates dependency templates
-	 * @returns {ConcatSource} the newly generated source from rendering
-	 */
-	render(hash, chunk, moduleTemplate, dependencyTemplates) {
-		const buf = this.renderBootstrap(
-			hash,
-			chunk,
-			moduleTemplate,
-			dependencyTemplates
-		);
-		let source = this.hooks.render.call(
-			new OriginalSource(
-				Template.prefix(buf, " \t") + "\n",
-				"webpack/bootstrap"
-			),
-			chunk,
-			hash,
-			moduleTemplate,
-			dependencyTemplates
-		);
-		if (chunk.hasEntryModule()) {
-			source = this.hooks.renderWithEntry.call(source, chunk, hash);
-		}
-		if (!source) {
-			throw new Error(
-				"Compiler error: MainTemplate plugin 'render' should return something"
-			);
-		}
-		chunk.rendered = true;
-		return new ConcatSource(source, ";");
-	}
-
-	/**
-	 *
-	 * @param {string} hash hash for render fn
-	 * @param {Chunk} chunk Chunk instance for require
-	 * @param {(number|string)=} varModuleId module id
-	 * @returns {TODO} the moduleRequire hook call return signature
-	 */
-	renderRequireFunctionForModule(hash, chunk, varModuleId) {
-		return this.hooks.moduleRequire.call(
-			this.requireFn,
-			chunk,
-			hash,
-			varModuleId
-		);
-	}
-
-	/**
-	 *
-	 * @param {string} hash hash for render add fn
-	 * @param {Chunk} chunk Chunk instance for require add fn
-	 * @param {(string|number)=} varModuleId module id
-	 * @param {Module} varModule Module instance
-	 * @returns {TODO} renderAddModule call
-	 */
-	renderAddModule(hash, chunk, varModuleId, varModule) {
-		return this.hooks.addModule.call(
-			`modules[${varModuleId}] = ${varModule};`,
-			chunk,
-			hash,
-			varModuleId,
-			varModule
+		this.getPublicPath = util.deprecate(
+			/**
+			 * @param {PathData} options context data
+			 * @returns {string} interpolated path
+			 */ options =>
+				compilation.getAssetPath(
+					/** @type {string} */
+					(compilation.outputOptions.publicPath),
+					options
+				),
+			"MainTemplate.getPublicPath is deprecated (use Compilation.getAssetPath(compilation.outputOptions.publicPath, options) instead)",
+			"DEP_WEBPACK_MAIN_TEMPLATE_GET_PUBLIC_PATH"
 		);
-	}
 
-	/**
-	 *
-	 * @param {string} hash string hash
-	 * @param {number=} length length
-	 * @returns {string} call hook return
-	 */
-	renderCurrentHashCode(hash, length) {
-		length = length || Infinity;
-		return this.hooks.currentHash.call(
-			JSON.stringify(hash.substr(0, length)),
-			length
+		this.getAssetPath = util.deprecate(
+			/**
+			 * @param {TemplatePath} path used to get asset path with hash
+			 * @param {PathData} options context data
+			 * @returns {string} interpolated path
+			 */
+			(path, options) => compilation.getAssetPath(path, options),
+			"MainTemplate.getAssetPath is deprecated (use Compilation.getAssetPath instead)",
+			"DEP_WEBPACK_MAIN_TEMPLATE_GET_ASSET_PATH"
 		);
-	}
 
-	/**
-	 *
-	 * @param {object} options get public path options
-	 * @returns {string} hook call
-	 */
-	getPublicPath(options) {
-		return this.hooks.assetPath.call(
-			this.outputOptions.publicPath || "",
-			options
+		this.getAssetPathWithInfo = util.deprecate(
+			/**
+			 * @param {TemplatePath} path used to get asset path with hash
+			 * @param {PathData} options context data
+			 * @returns {InterpolatedPathAndAssetInfo} interpolated path and asset info
+			 */
+			(path, options) => compilation.getAssetPathWithInfo(path, options),
+			"MainTemplate.getAssetPathWithInfo is deprecated (use Compilation.getAssetPath instead)",
+			"DEP_WEBPACK_MAIN_TEMPLATE_GET_ASSET_PATH_WITH_INFO"
 		);
 	}
+}
 
-	getAssetPath(path, options) {
-		return this.hooks.assetPath.call(path, options);
-	}
-
-	/**
-	 * Updates hash with information from this template
-	 * @param {Hash} hash the hash to update
-	 * @returns {void}
-	 */
-	updateHash(hash) {
-		hash.update("maintemplate");
-		hash.update("3");
-		this.hooks.hash.call(hash);
-	}
+Object.defineProperty(MainTemplate.prototype, "requireFn", {
+	get: util.deprecate(
+		() => RuntimeGlobals.require,
+		`MainTemplate.requireFn is deprecated (use "${RuntimeGlobals.require}")`,
+		"DEP_WEBPACK_MAIN_TEMPLATE_REQUIRE_FN"
+	)
+});
 
-	/**
-	 * TODO webpack 5: remove moduleTemplate and dependencyTemplates
-	 * Updates hash with chunk-specific information from this template
-	 * @param {Hash} hash the hash to update
-	 * @param {Chunk} chunk the chunk
-	 * @param {ModuleTemplate} moduleTemplate ModuleTemplate instance for render
-	 * @param {Map} dependencyTemplates dependency templates
-	 * @returns {void}
-	 */
-	updateHashForChunk(hash, chunk, moduleTemplate, dependencyTemplates) {
-		this.updateHash(hash);
-		this.hooks.hashForChunk.call(hash, chunk);
-		for (const line of this.renderBootstrap(
-			"0000",
-			chunk,
-			moduleTemplate,
-			dependencyTemplates
-		)) {
-			hash.update(line);
-		}
-	}
+Object.defineProperty(MainTemplate.prototype, "outputOptions", {
+	get: util.deprecate(
+		/**
+		 * @this {MainTemplate}
+		 * @returns {OutputOptions} output options
+		 */
+		function () {
+			return this._outputOptions;
+		},
+		"MainTemplate.outputOptions is deprecated (use Compilation.outputOptions instead)",
+		"DEP_WEBPACK_MAIN_TEMPLATE_OUTPUT_OPTIONS"
+	)
+});
 
-	useChunkHash(chunk) {
-		const paths = this.hooks.globalHashPaths.call([]);
-		return !this.hooks.globalHash.call(chunk, paths);
-	}
-};
+module.exports = MainTemplate;
diff --git a/lib/MemoryOutputFileSystem.js b/lib/MemoryOutputFileSystem.js
deleted file mode 100644
index 8476148882a..00000000000
--- a/lib/MemoryOutputFileSystem.js
+++ /dev/null
@@ -1,5 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-module.exports = require("memory-fs");
diff --git a/lib/Module.js b/lib/Module.js
index 3fb571cbe18..c654d1633ac 100644
--- a/lib/Module.js
+++ b/lib/Module.js
@@ -2,434 +2,1235 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const util = require("util");
-
+const ChunkGraph = require("./ChunkGraph");
 const DependenciesBlock = require("./DependenciesBlock");
-const ModuleReason = require("./ModuleReason");
-const SortableSet = require("./util/SortableSet");
-const Template = require("./Template");
+const ModuleGraph = require("./ModuleGraph");
+const { JS_TYPES } = require("./ModuleSourceTypesConstants");
+const RuntimeGlobals = require("./RuntimeGlobals");
+const { first } = require("./util/SetHelpers");
+const { compareChunksById } = require("./util/comparators");
+const makeSerializable = require("./util/makeSerializable");
 
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../declarations/WebpackOptions").ResolveOptions} ResolveOptions */
+/** @typedef {import("../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
 /** @typedef {import("./Chunk")} Chunk */
+/** @typedef {import("./ChunkGraph").ModuleId} ModuleId */
+/** @typedef {import("./ChunkGroup")} ChunkGroup */
+/** @typedef {import("./CodeGenerationResults")} CodeGenerationResults */
+/** @typedef {import("./Compilation")} Compilation */
+/** @typedef {import("./Compilation").AssetInfo} AssetInfo */
+/** @typedef {import("./Compilation").UnsafeCacheData} UnsafeCacheData */
+/** @typedef {import("./ConcatenationScope")} ConcatenationScope */
+/** @typedef {import("./Dependency")} Dependency */
+/** @typedef {import("./Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("./DependencyTemplate").CssData} CssData */
+/** @typedef {import("./DependencyTemplates")} DependencyTemplates */
+/** @typedef {import("./ExportsInfo").UsageStateType} UsageStateType */
+/** @typedef {import("./FileSystemInfo")} FileSystemInfo */
+/** @typedef {import("./FileSystemInfo").Snapshot} Snapshot */
+/** @typedef {import("./ModuleGraphConnection").ConnectionState} ConnectionState */
+/** @typedef {import("./ModuleTypeConstants").ModuleTypes} ModuleTypes */
+/** @typedef {import("./NormalModuleFactory")} NormalModuleFactory */
 /** @typedef {import("./RequestShortener")} RequestShortener */
+/** @typedef {import("./ResolverFactory").ResolverWithOptions} ResolverWithOptions */
+/** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */
 /** @typedef {import("./WebpackError")} WebpackError */
-/** @typedef {import("./util/createHash").Hash} Hash */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("./util/Hash")} Hash */
+/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
+/** @typedef {import("./util/identifier").AssociatedObjectForCache} AssociatedObjectForCache */
+/** @typedef {import("./util/runtime").RuntimeSpec} RuntimeSpec */
+
+/**
+ * @template T
+ * @typedef {import("./util/LazySet")} LazySet
+ */
+
+/**
+ * @template T
+ * @typedef {import("./util/SortableSet")} SortableSet
+ */
+
+/**
+ * @typedef {object} SourceContext
+ * @property {DependencyTemplates} dependencyTemplates the dependency templates
+ * @property {RuntimeTemplate} runtimeTemplate the runtime template
+ * @property {ModuleGraph} moduleGraph the module graph
+ * @property {ChunkGraph} chunkGraph the chunk graph
+ * @property {RuntimeSpec} runtime the runtimes code should be generated for
+ * @property {string=} type the type of source that should be generated
+ */
+
+/** @typedef {ReadonlySet} SourceTypes */
+
+// TODO webpack 6: compilation will be required in CodeGenerationContext
+/**
+ * @typedef {object} CodeGenerationContext
+ * @property {DependencyTemplates} dependencyTemplates the dependency templates
+ * @property {RuntimeTemplate} runtimeTemplate the runtime template
+ * @property {ModuleGraph} moduleGraph the module graph
+ * @property {ChunkGraph} chunkGraph the chunk graph
+ * @property {RuntimeSpec} runtime the runtimes code should be generated for
+ * @property {ConcatenationScope=} concatenationScope when in concatenated module, information about other concatenated modules
+ * @property {CodeGenerationResults | undefined} codeGenerationResults code generation results of other modules (need to have a codeGenerationDependency to use that)
+ * @property {Compilation=} compilation the compilation
+ * @property {SourceTypes=} sourceTypes source types
+ */
+
+/**
+ * @typedef {object} ConcatenationBailoutReasonContext
+ * @property {ModuleGraph} moduleGraph the module graph
+ * @property {ChunkGraph} chunkGraph the chunk graph
+ */
+
+/** @typedef {Set} RuntimeRequirements */
+/** @typedef {ReadonlySet} ReadOnlyRuntimeRequirements */
+
+/**
+ * @typedef {object} CodeGenerationResult
+ * @property {Map} sources the resulting sources for all source types
+ * @property {Map=} data the resulting data for all source types
+ * @property {ReadOnlyRuntimeRequirements | null} runtimeRequirements the runtime requirements
+ * @property {string=} hash a hash of the code generation result (will be automatically calculated from sources and runtimeRequirements if not provided)
+ */
+
+/**
+ * @typedef {object} LibIdentOptions
+ * @property {string} context absolute context path to which lib ident is relative to
+ * @property {AssociatedObjectForCache=} associatedObjectForCache object for caching
+ */
+
+/**
+ * @typedef {object} KnownBuildMeta
+ * @property {("default" | "namespace" | "flagged" | "dynamic")=} exportsType
+ * @property {(false | "redirect" | "redirect-warn")=} defaultObject
+ * @property {boolean=} strictHarmonyModule
+ * @property {boolean=} async
+ * @property {boolean=} sideEffectFree
+ * @property {Record=} exportsFinalName
+ * @property {boolean=} isCSSModule
+ */
+
+/**
+ * @typedef {object} KnownBuildInfo
+ * @property {boolean=} cacheable
+ * @property {boolean=} parsed
+ * @property {boolean=} strict
+ * @property {string=} moduleArgument using in AMD
+ * @property {string=} exportsArgument using in AMD
+ * @property {string=} moduleConcatenationBailout using in CommonJs
+ * @property {boolean=} needCreateRequire using in APIPlugin
+ * @property {string=} resourceIntegrity using in HttpUriPlugin
+ * @property {LazySet=} fileDependencies using in NormalModule
+ * @property {LazySet=} contextDependencies using in NormalModule
+ * @property {LazySet=} missingDependencies using in NormalModule
+ * @property {LazySet=} buildDependencies using in NormalModule
+ * @property {ValueCacheVersions=} valueDependencies using in NormalModule
+ * @property {Record=} assets using in NormalModule
+ * @property {string=} hash using in NormalModule
+ * @property {(Snapshot | null)=} snapshot using in ContextModule
+ * @property {string=} fullContentHash for assets modules
+ * @property {string=} filename for assets modules
+ * @property {Map=} assetsInfo for assets modules
+ * @property {boolean=} dataUrl for assets modules
+ * @property {CssData=} cssData for css modules
+ */
+
+/** @typedef {Map>} ValueCacheVersions */
+
+/**
+ * @typedef {object} NeedBuildContext
+ * @property {Compilation} compilation
+ * @property {FileSystemInfo} fileSystemInfo
+ * @property {ValueCacheVersions} valueCacheVersions
+ */
+
+/** @typedef {(err?: WebpackError | null, needBuild?: boolean) => void} NeedBuildCallback */
+
+/** @typedef {(err?: WebpackError) => void} BuildCallback */
+
+/** @typedef {KnownBuildMeta & Record} BuildMeta */
+/** @typedef {KnownBuildInfo & Record} BuildInfo */
+
+/**
+ * @typedef {object} FactoryMeta
+ * @property {boolean=} sideEffectFree
+ */
 
 const EMPTY_RESOLVE_OPTIONS = {};
 
 let debugId = 1000;
 
-const sortById = (a, b) => {
-	return a.id - b.id;
-};
+const DEFAULT_TYPES_UNKNOWN = new Set(["unknown"]);
 
-const sortByDebugId = (a, b) => {
-	return a.debugId - b.debugId;
-};
+const deprecatedNeedRebuild = util.deprecate(
+	/**
+	 * @param {Module} module the module
+	 * @param {NeedBuildContext} context context info
+	 * @returns {boolean} true, when rebuild is needed
+	 */
+	(module, context) =>
+		module.needRebuild(
+			context.fileSystemInfo.getDeprecatedFileTimestamps(),
+			context.fileSystemInfo.getDeprecatedContextTimestamps()
+		),
+	"Module.needRebuild is deprecated in favor of Module.needBuild",
+	"DEP_WEBPACK_MODULE_NEED_REBUILD"
+);
 
 /** @typedef {(requestShortener: RequestShortener) => string} OptimizationBailoutFunction */
 
 class Module extends DependenciesBlock {
-	constructor(type, context = null) {
+	/**
+	 * @param {ModuleTypes | ""} type the module type, when deserializing the type is not known and is an empty string
+	 * @param {(string | null)=} context an optional context
+	 * @param {(string | null)=} layer an optional layer in which the module is
+	 */
+	constructor(type, context = null, layer = null) {
 		super();
-		/** @type {string} */
+
+		/** @type {ModuleTypes} */
 		this.type = type;
-		/** @type {string} */
+		/** @type {string | null} */
 		this.context = context;
+		/** @type {string | null} */
+		this.layer = layer;
+		/** @type {boolean} */
+		this.needId = true;
 
 		// Unique Id
 		/** @type {number} */
 		this.debugId = debugId++;
 
-		// Hash
-		/** @type {string} */
-		this.hash = undefined;
-		/** @type {string} */
-		this.renderedHash = undefined;
-
 		// Info from Factory
-		/** @type {TODO} */
+		/** @type {ResolveOptions | undefined} */
 		this.resolveOptions = EMPTY_RESOLVE_OPTIONS;
-		/** @type {object} */
-		this.factoryMeta = {};
+		/** @type {FactoryMeta | undefined} */
+		this.factoryMeta = undefined;
+		// TODO refactor this -> options object filled from Factory
+		// TODO webpack 6: use an enum
+		/** @type {boolean} */
+		this.useSourceMap = false;
+		/** @type {boolean} */
+		this.useSimpleSourceMap = false;
 
+		// Is in hot context, i.e. HotModuleReplacementPlugin.js enabled
+		// TODO do we need hot here?
+		/** @type {boolean} */
+		this.hot = false;
 		// Info from Build
-		/** @type {WebpackError[]} */
-		this.warnings = [];
-		/** @type {WebpackError[]} */
-		this.errors = [];
-		/** @type {object} */
+		/** @type {WebpackError[] | undefined} */
+		this._warnings = undefined;
+		/** @type {WebpackError[] | undefined} */
+		this._errors = undefined;
+		/** @type {BuildMeta | undefined} */
 		this.buildMeta = undefined;
-		/** @type {object} */
+		/** @type {BuildInfo | undefined} */
 		this.buildInfo = undefined;
+		/** @type {Dependency[] | undefined} */
+		this.presentationalDependencies = undefined;
+		/** @type {Dependency[] | undefined} */
+		this.codeGenerationDependencies = undefined;
+	}
 
-		// Graph (per Compilation)
-		/** @type {ModuleReason[]} */
-		this.reasons = [];
-		/** @type {SortableSet} */
-		this._chunks = new SortableSet(undefined, sortById);
+	// TODO remove in webpack 6
+	// BACKWARD-COMPAT START
+	/**
+	 * @returns {ModuleId | null} module id
+	 */
+	get id() {
+		return ChunkGraph.getChunkGraphForModule(
+			this,
+			"Module.id",
+			"DEP_WEBPACK_MODULE_ID"
+		).getModuleId(this);
+	}
 
-		// Info from Compilation (per Compilation)
-		/** @type {number|string} */
-		this.id = null;
-		/** @type {number} */
-		this.index = null;
-		/** @type {number} */
-		this.index2 = null;
-		/** @type {number} */
-		this.depth = null;
-		/** @type {Module} */
-		this.issuer = null;
-		/** @type {undefined | object} */
-		this.profile = undefined;
-		/** @type {boolean} */
-		this.prefetched = false;
-		/** @type {boolean} */
-		this.built = false;
+	/**
+	 * @param {ModuleId} value value
+	 */
+	set id(value) {
+		if (value === "") {
+			this.needId = false;
+			return;
+		}
+		ChunkGraph.getChunkGraphForModule(
+			this,
+			"Module.id",
+			"DEP_WEBPACK_MODULE_ID"
+		).setModuleId(this, value);
+	}
 
-		// Info from Optimization (per Compilation)
-		/** @type {null | boolean} */
-		this.used = null;
-		/** @type {false | true | string[]} */
-		this.usedExports = null;
-		/** @type {(string | OptimizationBailoutFunction)[]} */
-		this.optimizationBailout = [];
+	/**
+	 * @returns {string} the hash of the module
+	 */
+	get hash() {
+		return ChunkGraph.getChunkGraphForModule(
+			this,
+			"Module.hash",
+			"DEP_WEBPACK_MODULE_HASH"
+		).getModuleHash(this, undefined);
+	}
 
-		// delayed operations
-		/** @type {undefined | {oldChunk: Chunk, newChunks: Chunk[]}[] } */
-		this._rewriteChunkInReasons = undefined;
+	/**
+	 * @returns {string} the shortened hash of the module
+	 */
+	get renderedHash() {
+		return ChunkGraph.getChunkGraphForModule(
+			this,
+			"Module.renderedHash",
+			"DEP_WEBPACK_MODULE_RENDERED_HASH"
+		).getRenderedModuleHash(this, undefined);
+	}
 
-		/** @type {boolean} */
-		this.useSourceMap = false;
+	get profile() {
+		return ModuleGraph.getModuleGraphForModule(
+			this,
+			"Module.profile",
+			"DEP_WEBPACK_MODULE_PROFILE"
+		).getProfile(this);
+	}
 
-		// info from build
-		this._source = null;
+	set profile(value) {
+		ModuleGraph.getModuleGraphForModule(
+			this,
+			"Module.profile",
+			"DEP_WEBPACK_MODULE_PROFILE"
+		).setProfile(this, value);
 	}
 
-	get exportsArgument() {
-		return (this.buildInfo && this.buildInfo.exportsArgument) || "exports";
+	/**
+	 * @returns {number | null} the pre order index
+	 */
+	get index() {
+		return ModuleGraph.getModuleGraphForModule(
+			this,
+			"Module.index",
+			"DEP_WEBPACK_MODULE_INDEX"
+		).getPreOrderIndex(this);
 	}
 
-	get moduleArgument() {
-		return (this.buildInfo && this.buildInfo.moduleArgument) || "module";
+	/**
+	 * @param {number} value the pre order index
+	 */
+	set index(value) {
+		ModuleGraph.getModuleGraphForModule(
+			this,
+			"Module.index",
+			"DEP_WEBPACK_MODULE_INDEX"
+		).setPreOrderIndex(this, value);
 	}
 
-	disconnect() {
-		this.hash = undefined;
-		this.renderedHash = undefined;
+	/**
+	 * @returns {number | null} the post order index
+	 */
+	get index2() {
+		return ModuleGraph.getModuleGraphForModule(
+			this,
+			"Module.index2",
+			"DEP_WEBPACK_MODULE_INDEX2"
+		).getPostOrderIndex(this);
+	}
 
-		this.reasons.length = 0;
-		this._rewriteChunkInReasons = undefined;
-		this._chunks.clear();
+	/**
+	 * @param {number} value the post order index
+	 */
+	set index2(value) {
+		ModuleGraph.getModuleGraphForModule(
+			this,
+			"Module.index2",
+			"DEP_WEBPACK_MODULE_INDEX2"
+		).setPostOrderIndex(this, value);
+	}
 
-		this.id = null;
-		this.index = null;
-		this.index2 = null;
-		this.depth = null;
-		this.issuer = null;
-		this.profile = undefined;
-		this.prefetched = false;
-		this.built = false;
+	/**
+	 * @returns {number | null} the depth
+	 */
+	get depth() {
+		return ModuleGraph.getModuleGraphForModule(
+			this,
+			"Module.depth",
+			"DEP_WEBPACK_MODULE_DEPTH"
+		).getDepth(this);
+	}
 
-		this.used = null;
-		this.usedExports = null;
-		this.optimizationBailout.length = 0;
-		super.disconnect();
+	/**
+	 * @param {number} value the depth
+	 */
+	set depth(value) {
+		ModuleGraph.getModuleGraphForModule(
+			this,
+			"Module.depth",
+			"DEP_WEBPACK_MODULE_DEPTH"
+		).setDepth(this, value);
 	}
 
-	unseal() {
-		this.id = null;
-		this.index = null;
-		this.index2 = null;
-		this.depth = null;
-		this._chunks.clear();
-		super.unseal();
+	/**
+	 * @returns {Module | null | undefined} issuer
+	 */
+	get issuer() {
+		return ModuleGraph.getModuleGraphForModule(
+			this,
+			"Module.issuer",
+			"DEP_WEBPACK_MODULE_ISSUER"
+		).getIssuer(this);
 	}
 
-	setChunks(chunks) {
-		this._chunks = new SortableSet(chunks, sortById);
+	/**
+	 * @param {Module | null} value issuer
+	 */
+	set issuer(value) {
+		ModuleGraph.getModuleGraphForModule(
+			this,
+			"Module.issuer",
+			"DEP_WEBPACK_MODULE_ISSUER"
+		).setIssuer(this, value);
 	}
 
+	get usedExports() {
+		return ModuleGraph.getModuleGraphForModule(
+			this,
+			"Module.usedExports",
+			"DEP_WEBPACK_MODULE_USED_EXPORTS"
+		).getUsedExports(this, undefined);
+	}
+
+	/**
+	 * @deprecated
+	 * @returns {(string | OptimizationBailoutFunction)[]} list
+	 */
+	get optimizationBailout() {
+		return ModuleGraph.getModuleGraphForModule(
+			this,
+			"Module.optimizationBailout",
+			"DEP_WEBPACK_MODULE_OPTIMIZATION_BAILOUT"
+		).getOptimizationBailout(this);
+	}
+
+	get optional() {
+		return this.isOptional(
+			ModuleGraph.getModuleGraphForModule(
+				this,
+				"Module.optional",
+				"DEP_WEBPACK_MODULE_OPTIONAL"
+			)
+		);
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {boolean} true, when the module was added
+	 */
 	addChunk(chunk) {
-		if (this._chunks.has(chunk)) return false;
-		this._chunks.add(chunk);
+		const chunkGraph = ChunkGraph.getChunkGraphForModule(
+			this,
+			"Module.addChunk",
+			"DEP_WEBPACK_MODULE_ADD_CHUNK"
+		);
+		if (chunkGraph.isModuleInChunk(this, chunk)) return false;
+		chunkGraph.connectChunkAndModule(chunk, this);
 		return true;
 	}
 
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {void}
+	 */
 	removeChunk(chunk) {
-		if (this._chunks.delete(chunk)) {
-			chunk.removeModule(this);
-			return true;
-		}
-		return false;
+		return ChunkGraph.getChunkGraphForModule(
+			this,
+			"Module.removeChunk",
+			"DEP_WEBPACK_MODULE_REMOVE_CHUNK"
+		).disconnectChunkAndModule(chunk, this);
 	}
 
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @returns {boolean} true, when the module is in the chunk
+	 */
 	isInChunk(chunk) {
-		return this._chunks.has(chunk);
+		return ChunkGraph.getChunkGraphForModule(
+			this,
+			"Module.isInChunk",
+			"DEP_WEBPACK_MODULE_IS_IN_CHUNK"
+		).isModuleInChunk(this, chunk);
 	}
 
 	isEntryModule() {
-		for (const chunk of this._chunks) {
-			if (chunk.entryModule === this) return true;
-		}
-		return false;
+		return ChunkGraph.getChunkGraphForModule(
+			this,
+			"Module.isEntryModule",
+			"DEP_WEBPACK_MODULE_IS_ENTRY_MODULE"
+		).isEntryModule(this);
 	}
 
-	get optional() {
-		return (
-			this.reasons.length > 0 &&
-			this.reasons.every(r => r.dependency && r.dependency.optional)
-		);
-	}
-
-	/**
-	 * @returns {Chunk[]} all chunks which contain the module
-	 */
 	getChunks() {
-		return Array.from(this._chunks);
+		return ChunkGraph.getChunkGraphForModule(
+			this,
+			"Module.getChunks",
+			"DEP_WEBPACK_MODULE_GET_CHUNKS"
+		).getModuleChunks(this);
 	}
 
 	getNumberOfChunks() {
-		return this._chunks.size;
+		return ChunkGraph.getChunkGraphForModule(
+			this,
+			"Module.getNumberOfChunks",
+			"DEP_WEBPACK_MODULE_GET_NUMBER_OF_CHUNKS"
+		).getNumberOfModuleChunks(this);
 	}
 
 	get chunksIterable() {
-		return this._chunks;
-	}
-
-	hasEqualsChunks(otherModule) {
-		if (this._chunks.size !== otherModule._chunks.size) return false;
-		this._chunks.sortWith(sortByDebugId);
-		otherModule._chunks.sortWith(sortByDebugId);
-		const a = this._chunks[Symbol.iterator]();
-		const b = otherModule._chunks[Symbol.iterator]();
-		// eslint-disable-next-line no-constant-condition
-		while (true) {
-			const aItem = a.next();
-			const bItem = b.next();
-			if (aItem.done) return true;
-			if (aItem.value !== bItem.value) return false;
-		}
+		return ChunkGraph.getChunkGraphForModule(
+			this,
+			"Module.chunksIterable",
+			"DEP_WEBPACK_MODULE_CHUNKS_ITERABLE"
+		).getOrderedModuleChunksIterable(this, compareChunksById);
 	}
 
-	addReason(module, dependency, explanation) {
-		this.reasons.push(new ModuleReason(module, dependency, explanation));
+	/**
+	 * @param {string} exportName a name of an export
+	 * @returns {boolean | null} true, if the export is provided why the module.
+	 * null, if it's unknown.
+	 * false, if it's not provided.
+	 */
+	isProvided(exportName) {
+		return ModuleGraph.getModuleGraphForModule(
+			this,
+			"Module.usedExports",
+			"DEP_WEBPACK_MODULE_USED_EXPORTS"
+		).isExportProvided(this, exportName);
 	}
+	// BACKWARD-COMPAT END
 
-	removeReason(module, dependency) {
-		for (let i = 0; i < this.reasons.length; i++) {
-			let r = this.reasons[i];
-			if (r.module === module && r.dependency === dependency) {
-				this.reasons.splice(i, 1);
-				return true;
+	/**
+	 * @returns {string} name of the exports argument
+	 */
+	get exportsArgument() {
+		return (this.buildInfo && this.buildInfo.exportsArgument) || "exports";
+	}
+
+	/**
+	 * @returns {string} name of the module argument
+	 */
+	get moduleArgument() {
+		return (this.buildInfo && this.buildInfo.moduleArgument) || "module";
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @param {boolean | undefined} strict the importing module is strict
+	 * @returns {"namespace" | "default-only" | "default-with-named" | "dynamic"} export type
+	 * "namespace": Exports is already a namespace object. namespace = exports.
+	 * "dynamic": Check at runtime if __esModule is set. When set: namespace = { ...exports, default: exports }. When not set: namespace = { default: exports }.
+	 * "default-only": Provide a namespace object with only default export. namespace = { default: exports }
+	 * "default-with-named": Provide a namespace object with named and default export. namespace = { ...exports, default: exports }
+	 */
+	getExportsType(moduleGraph, strict) {
+		switch (this.buildMeta && this.buildMeta.exportsType) {
+			case "flagged":
+				return strict ? "default-with-named" : "namespace";
+			case "namespace":
+				return "namespace";
+			case "default":
+				switch (/** @type {BuildMeta} */ (this.buildMeta).defaultObject) {
+					case "redirect":
+						return "default-with-named";
+					case "redirect-warn":
+						return strict ? "default-only" : "default-with-named";
+					default:
+						return "default-only";
+				}
+			case "dynamic": {
+				if (strict) return "default-with-named";
+				// Try to figure out value of __esModule by following reexports
+				const handleDefault = () => {
+					switch (/** @type {BuildMeta} */ (this.buildMeta).defaultObject) {
+						case "redirect":
+						case "redirect-warn":
+							return "default-with-named";
+						default:
+							return "default-only";
+					}
+				};
+				const exportInfo = moduleGraph.getReadOnlyExportInfo(
+					this,
+					"__esModule"
+				);
+				if (exportInfo.provided === false) {
+					return handleDefault();
+				}
+				const target = exportInfo.getTarget(moduleGraph);
+				if (
+					!target ||
+					!target.export ||
+					target.export.length !== 1 ||
+					target.export[0] !== "__esModule"
+				) {
+					return "dynamic";
+				}
+				switch (
+					target.module.buildMeta &&
+					target.module.buildMeta.exportsType
+				) {
+					case "flagged":
+					case "namespace":
+						return "namespace";
+					case "default":
+						return handleDefault();
+					default:
+						return "dynamic";
+				}
 			}
+			default:
+				return strict ? "default-with-named" : "dynamic";
 		}
-		return false;
 	}
 
-	hasReasonForChunk(chunk) {
-		if (this._rewriteChunkInReasons) {
-			for (const operation of this._rewriteChunkInReasons) {
-				this._doRewriteChunkInReasons(operation.oldChunk, operation.newChunks);
-			}
-			this._rewriteChunkInReasons = undefined;
+	/**
+	 * @param {Dependency} presentationalDependency dependency being tied to module.
+	 * This is a Dependency without edge in the module graph. It's only for presentation.
+	 * @returns {void}
+	 */
+	addPresentationalDependency(presentationalDependency) {
+		if (this.presentationalDependencies === undefined) {
+			this.presentationalDependencies = [];
 		}
-		for (let i = 0; i < this.reasons.length; i++) {
-			if (this.reasons[i].hasChunk(chunk)) return true;
+		this.presentationalDependencies.push(presentationalDependency);
+	}
+
+	/**
+	 * @param {Dependency} codeGenerationDependency dependency being tied to module.
+	 * This is a Dependency where the code generation result of the referenced module is needed during code generation.
+	 * The Dependency should also be added to normal dependencies via addDependency.
+	 * @returns {void}
+	 */
+	addCodeGenerationDependency(codeGenerationDependency) {
+		if (this.codeGenerationDependencies === undefined) {
+			this.codeGenerationDependencies = [];
 		}
-		return false;
+		this.codeGenerationDependencies.push(codeGenerationDependency);
 	}
 
-	hasReasons() {
-		return this.reasons.length > 0;
+	/**
+	 * Removes all dependencies and blocks
+	 * @returns {void}
+	 */
+	clearDependenciesAndBlocks() {
+		if (this.presentationalDependencies !== undefined) {
+			this.presentationalDependencies.length = 0;
+		}
+		if (this.codeGenerationDependencies !== undefined) {
+			this.codeGenerationDependencies.length = 0;
+		}
+		super.clearDependenciesAndBlocks();
 	}
 
-	rewriteChunkInReasons(oldChunk, newChunks) {
-		// This is expensive. Delay operation until we really need the data
-		if (this._rewriteChunkInReasons === undefined) {
-			this._rewriteChunkInReasons = [];
+	/**
+	 * @param {WebpackError} warning the warning
+	 * @returns {void}
+	 */
+	addWarning(warning) {
+		if (this._warnings === undefined) {
+			this._warnings = [];
 		}
-		this._rewriteChunkInReasons.push({
-			oldChunk,
-			newChunks
-		});
+		this._warnings.push(warning);
 	}
 
-	_doRewriteChunkInReasons(oldChunk, newChunks) {
-		for (let i = 0; i < this.reasons.length; i++) {
-			this.reasons[i].rewriteChunks(oldChunk, newChunks);
+	/**
+	 * @returns {Iterable | undefined} list of warnings if any
+	 */
+	getWarnings() {
+		return this._warnings;
+	}
+
+	/**
+	 * @returns {number} number of warnings
+	 */
+	getNumberOfWarnings() {
+		return this._warnings !== undefined ? this._warnings.length : 0;
+	}
+
+	/**
+	 * @param {WebpackError} error the error
+	 * @returns {void}
+	 */
+	addError(error) {
+		if (this._errors === undefined) {
+			this._errors = [];
 		}
+		this._errors.push(error);
 	}
 
 	/**
-	 * @param {string=} exportName the name of the export
-	 * @returns {boolean|string} false if the export isn't used, true if no exportName is provided and the module is used, or the name to access it if the export is used
+	 * @returns {Iterable | undefined} list of errors if any
 	 */
-	isUsed(exportName) {
-		if (!exportName) return this.used !== false;
-		if (this.used === null || this.usedExports === null) return exportName;
-		if (!this.used) return false;
-		if (!this.usedExports) return false;
-		if (this.usedExports === true) return exportName;
-		let idx = this.usedExports.indexOf(exportName);
-		if (idx < 0) return false;
+	getErrors() {
+		return this._errors;
+	}
 
-		// Mangle export name if possible
-		if (this.isProvided(exportName)) {
-			if (this.buildMeta.exportsType === "namespace") {
-				return Template.numberToIdentifer(idx);
-			}
+	/**
+	 * @returns {number} number of errors
+	 */
+	getNumberOfErrors() {
+		return this._errors !== undefined ? this._errors.length : 0;
+	}
+
+	/**
+	 * removes all warnings and errors
+	 * @returns {void}
+	 */
+	clearWarningsAndErrors() {
+		if (this._warnings !== undefined) {
+			this._warnings.length = 0;
+		}
+		if (this._errors !== undefined) {
+			this._errors.length = 0;
+		}
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @returns {boolean} true, if the module is optional
+	 */
+	isOptional(moduleGraph) {
+		let hasConnections = false;
+		for (const r of moduleGraph.getIncomingConnections(this)) {
 			if (
-				this.buildMeta.exportsType === "named" &&
-				!this.usedExports.includes("default")
+				!r.dependency ||
+				!r.dependency.optional ||
+				!r.isTargetActive(undefined)
 			) {
-				return Template.numberToIdentifer(idx);
+				return false;
 			}
+			hasConnections = true;
 		}
-		return exportName;
+		return hasConnections;
 	}
 
-	isProvided(exportName) {
-		if (!Array.isArray(this.buildMeta.providedExports)) return null;
-		return this.buildMeta.providedExports.includes(exportName);
+	/**
+	 * @param {ChunkGraph} chunkGraph the chunk graph
+	 * @param {Chunk} chunk a chunk
+	 * @param {Chunk=} ignoreChunk chunk to be ignored
+	 * @returns {boolean} true, if the module is accessible from "chunk" when ignoring "ignoreChunk"
+	 */
+	isAccessibleInChunk(chunkGraph, chunk, ignoreChunk) {
+		// Check if module is accessible in ALL chunk groups
+		for (const chunkGroup of chunk.groupsIterable) {
+			if (!this.isAccessibleInChunkGroup(chunkGraph, chunkGroup)) return false;
+		}
+		return true;
 	}
 
+	/**
+	 * @param {ChunkGraph} chunkGraph the chunk graph
+	 * @param {ChunkGroup} chunkGroup a chunk group
+	 * @param {Chunk=} ignoreChunk chunk to be ignored
+	 * @returns {boolean} true, if the module is accessible from "chunkGroup" when ignoring "ignoreChunk"
+	 */
+	isAccessibleInChunkGroup(chunkGraph, chunkGroup, ignoreChunk) {
+		const queue = new Set([chunkGroup]);
+
+		// Check if module is accessible from all items of the queue
+		queueFor: for (const cg of queue) {
+			// 1. If module is in one of the chunks of the group we can continue checking the next items
+			//    because it's accessible.
+			for (const chunk of cg.chunks) {
+				if (chunk !== ignoreChunk && chunkGraph.isModuleInChunk(this, chunk))
+					continue queueFor;
+			}
+			// 2. If the chunk group is initial, we can break here because it's not accessible.
+			if (chunkGroup.isInitial()) return false;
+			// 3. Enqueue all parents because it must be accessible from ALL parents
+			for (const parent of chunkGroup.parentsIterable) queue.add(parent);
+		}
+		// When we processed through the whole list and we didn't bailout, the module is accessible
+		return true;
+	}
+
+	/**
+	 * @param {Chunk} chunk a chunk
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @param {ChunkGraph} chunkGraph the chunk graph
+	 * @returns {boolean} true, if the module has any reason why "chunk" should be included
+	 */
+	hasReasonForChunk(chunk, moduleGraph, chunkGraph) {
+		// check for each reason if we need the chunk
+		for (const [
+			fromModule,
+			connections
+		] of moduleGraph.getIncomingConnectionsByOriginModule(this)) {
+			if (!connections.some(c => c.isTargetActive(chunk.runtime))) continue;
+			for (const originChunk of chunkGraph.getModuleChunksIterable(
+				/** @type {Module} */ (fromModule)
+			)) {
+				// return true if module this is not reachable from originChunk when ignoring chunk
+				if (!this.isAccessibleInChunk(chunkGraph, originChunk, chunk))
+					return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {boolean} true if at least one other module depends on this module
+	 */
+	hasReasons(moduleGraph, runtime) {
+		for (const c of moduleGraph.getIncomingConnections(this)) {
+			if (c.isTargetActive(runtime)) return true;
+		}
+		return false;
+	}
+
+	/**
+	 * @returns {string} for debugging
+	 */
 	toString() {
-		return `Module[${this.id || this.debugId}]`;
+		return `Module[${this.debugId}: ${this.identifier()}]`;
 	}
 
+	/**
+	 * @param {NeedBuildContext} context context info
+	 * @param {NeedBuildCallback} callback callback function, returns true, if the module needs a rebuild
+	 * @returns {void}
+	 */
+	needBuild(context, callback) {
+		callback(
+			null,
+			!this.buildMeta ||
+				this.needRebuild === Module.prototype.needRebuild ||
+				deprecatedNeedRebuild(this, context)
+		);
+	}
+
+	/**
+	 * @deprecated Use needBuild instead
+	 * @param {Map} fileTimestamps timestamps of files
+	 * @param {Map} contextTimestamps timestamps of directories
+	 * @returns {boolean} true, if the module needs a rebuild
+	 */
 	needRebuild(fileTimestamps, contextTimestamps) {
 		return true;
 	}
 
 	/**
 	 * @param {Hash} hash the hash used to track dependencies
+	 * @param {UpdateHashContext} context context
 	 * @returns {void}
 	 */
-	updateHash(hash) {
-		hash.update(`${this.id}`);
-		hash.update(JSON.stringify(this.usedExports));
-		super.updateHash(hash);
-	}
-
-	sortItems(sortChunks) {
-		super.sortItems();
-		if (sortChunks) this._chunks.sort();
-		this.reasons.sort((a, b) => {
-			if (a.module === b.module) return 0;
-			if (!a.module) return -1;
-			if (!b.module) return 1;
-			return sortById(a.module, b.module);
-		});
-		if (Array.isArray(this.usedExports)) {
-			this.usedExports.sort();
+	updateHash(
+		hash,
+		context = {
+			chunkGraph: ChunkGraph.getChunkGraphForModule(
+				this,
+				"Module.updateHash",
+				"DEP_WEBPACK_MODULE_UPDATE_HASH"
+			),
+			runtime: undefined
+		}
+	) {
+		const { chunkGraph, runtime } = context;
+		hash.update(chunkGraph.getModuleGraphHash(this, runtime));
+		if (this.presentationalDependencies !== undefined) {
+			for (const dep of this.presentationalDependencies) {
+				dep.updateHash(hash, context);
+			}
 		}
+		super.updateHash(hash, context);
 	}
 
-	unbuild() {
-		this.dependencies.length = 0;
-		this.blocks.length = 0;
-		this.variables.length = 0;
-		this.buildMeta = undefined;
-		this.buildInfo = undefined;
-		this.disconnect();
+	/**
+	 * @returns {void}
+	 */
+	invalidateBuild() {
+		// should be overridden to support this feature
+	}
+
+	/* istanbul ignore next */
+	/**
+	 * @abstract
+	 * @returns {string} a unique identifier of the module
+	 */
+	identifier() {
+		const AbstractMethodError = require("./AbstractMethodError");
+		throw new AbstractMethodError();
+	}
+
+	/* istanbul ignore next */
+	/**
+	 * @abstract
+	 * @param {RequestShortener} requestShortener the request shortener
+	 * @returns {string} a user readable identifier of the module
+	 */
+	readableIdentifier(requestShortener) {
+		const AbstractMethodError = require("./AbstractMethodError");
+		throw new AbstractMethodError();
+	}
+
+	/* istanbul ignore next */
+	/**
+	 * @abstract
+	 * @param {WebpackOptions} options webpack options
+	 * @param {Compilation} compilation the compilation
+	 * @param {ResolverWithOptions} resolver the resolver
+	 * @param {InputFileSystem} fs the file system
+	 * @param {BuildCallback} callback callback function
+	 * @returns {void}
+	 */
+	build(options, compilation, resolver, fs, callback) {
+		const AbstractMethodError = require("./AbstractMethodError");
+		throw new AbstractMethodError();
+	}
+
+	/**
+	 * @abstract
+	 * @returns {SourceTypes} types available (do not mutate)
+	 */
+	getSourceTypes() {
+		// Better override this method to return the correct types
+		if (this.source === Module.prototype.source) {
+			return DEFAULT_TYPES_UNKNOWN;
+		}
+		return JS_TYPES;
+	}
+
+	/**
+	 * @abstract
+	 * @deprecated Use codeGeneration() instead
+	 * @param {DependencyTemplates} dependencyTemplates the dependency templates
+	 * @param {RuntimeTemplate} runtimeTemplate the runtime template
+	 * @param {string=} type the type of source that should be generated
+	 * @returns {Source} generated source
+	 */
+	source(dependencyTemplates, runtimeTemplate, type = "javascript") {
+		if (this.codeGeneration === Module.prototype.codeGeneration) {
+			const AbstractMethodError = require("./AbstractMethodError");
+			throw new AbstractMethodError();
+		}
+		const chunkGraph = ChunkGraph.getChunkGraphForModule(
+			this,
+			"Module.source() is deprecated. Use Compilation.codeGenerationResults.getSource(module, runtime, type) instead",
+			"DEP_WEBPACK_MODULE_SOURCE"
+		);
+		/** @type {CodeGenerationContext} */
+		const codeGenContext = {
+			dependencyTemplates,
+			runtimeTemplate,
+			moduleGraph: chunkGraph.moduleGraph,
+			chunkGraph,
+			runtime: undefined,
+			codeGenerationResults: undefined
+		};
+		const sources = this.codeGeneration(codeGenContext).sources;
+
+		return /** @type {Source} */ (
+			type
+				? sources.get(type)
+				: sources.get(/** @type {string} */ (first(this.getSourceTypes())))
+		);
+	}
+
+	/* istanbul ignore next */
+	/**
+	 * @abstract
+	 * @param {string=} type the source type for which the size should be estimated
+	 * @returns {number} the estimated size of the module (must be non-zero)
+	 */
+	size(type) {
+		const AbstractMethodError = require("./AbstractMethodError");
+		throw new AbstractMethodError();
+	}
+
+	/**
+	 * @param {LibIdentOptions} options options
+	 * @returns {string | null} an identifier for library inclusion
+	 */
+	libIdent(options) {
+		return null;
+	}
+
+	/**
+	 * @returns {string | null} absolute path which should be used for condition matching (usually the resource path)
+	 */
+	nameForCondition() {
+		return null;
+	}
+
+	/**
+	 * @param {ConcatenationBailoutReasonContext} context context
+	 * @returns {string | undefined} reason why this module can't be concatenated, undefined when it can be concatenated
+	 */
+	getConcatenationBailoutReason(context) {
+		return `Module Concatenation is not implemented for ${this.constructor.name}`;
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @returns {ConnectionState} how this module should be connected to referencing modules when consumed for side-effects only
+	 */
+	getSideEffectsConnectionState(moduleGraph) {
+		return true;
 	}
 
-	get arguments() {
-		throw new Error("Module.arguments was removed, there is no replacement.");
+	/**
+	 * @param {CodeGenerationContext} context context for code generation
+	 * @returns {CodeGenerationResult} result
+	 */
+	codeGeneration(context) {
+		// Best override this method
+		const sources = new Map();
+		for (const type of this.getSourceTypes()) {
+			if (type !== "unknown") {
+				sources.set(
+					type,
+					this.source(
+						context.dependencyTemplates,
+						context.runtimeTemplate,
+						type
+					)
+				);
+			}
+		}
+		return {
+			sources,
+			runtimeRequirements: new Set([
+				RuntimeGlobals.module,
+				RuntimeGlobals.exports,
+				RuntimeGlobals.require
+			])
+		};
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk which condition should be checked
+	 * @param {Compilation} compilation the compilation
+	 * @returns {boolean} true, if the chunk is ok for the module
+	 */
+	chunkCondition(chunk, compilation) {
+		return true;
+	}
+
+	hasChunkCondition() {
+		return this.chunkCondition !== Module.prototype.chunkCondition;
 	}
 
-	set arguments(value) {
-		throw new Error("Module.arguments was removed, there is no replacement.");
+	/**
+	 * Assuming this module is in the cache. Update the (cached) module with
+	 * the fresh module from the factory. Usually updates internal references
+	 * and properties.
+	 * @param {Module} module fresh module
+	 * @returns {void}
+	 */
+	updateCacheModule(module) {
+		this.type = module.type;
+		this.layer = module.layer;
+		this.context = module.context;
+		this.factoryMeta = module.factoryMeta;
+		this.resolveOptions = module.resolveOptions;
+	}
+
+	/**
+	 * Module should be unsafe cached. Get data that's needed for that.
+	 * This data will be passed to restoreFromUnsafeCache later.
+	 * @returns {UnsafeCacheData} cached data
+	 */
+	getUnsafeCacheData() {
+		return {
+			factoryMeta: this.factoryMeta,
+			resolveOptions: this.resolveOptions
+		};
+	}
+
+	/**
+	 * restore unsafe cache data
+	 * @param {UnsafeCacheData} unsafeCacheData data from getUnsafeCacheData
+	 * @param {NormalModuleFactory} normalModuleFactory the normal module factory handling the unsafe caching
+	 */
+	_restoreFromUnsafeCache(unsafeCacheData, normalModuleFactory) {
+		this.factoryMeta = unsafeCacheData.factoryMeta;
+		this.resolveOptions = unsafeCacheData.resolveOptions;
+	}
+
+	/**
+	 * Assuming this module is in the cache. Remove internal references to allow freeing some memory.
+	 */
+	cleanupForCache() {
+		this.factoryMeta = undefined;
+		this.resolveOptions = undefined;
+	}
+
+	/**
+	 * @returns {Source | null} the original source for the module before webpack transformation
+	 */
+	originalSource() {
+		return null;
+	}
+
+	/**
+	 * @param {LazySet} fileDependencies set where file dependencies are added to
+	 * @param {LazySet} contextDependencies set where context dependencies are added to
+	 * @param {LazySet} missingDependencies set where missing dependencies are added to
+	 * @param {LazySet} buildDependencies set where build dependencies are added to
+	 */
+	addCacheDependencies(
+		fileDependencies,
+		contextDependencies,
+		missingDependencies,
+		buildDependencies
+	) {}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.type);
+		write(this.layer);
+		write(this.context);
+		write(this.resolveOptions);
+		write(this.factoryMeta);
+		write(this.useSourceMap);
+		write(this.useSimpleSourceMap);
+		write(this.hot);
+		write(
+			this._warnings !== undefined && this._warnings.length === 0
+				? undefined
+				: this._warnings
+		);
+		write(
+			this._errors !== undefined && this._errors.length === 0
+				? undefined
+				: this._errors
+		);
+		write(this.buildMeta);
+		write(this.buildInfo);
+		write(this.presentationalDependencies);
+		write(this.codeGenerationDependencies);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.type = read();
+		this.layer = read();
+		this.context = read();
+		this.resolveOptions = read();
+		this.factoryMeta = read();
+		this.useSourceMap = read();
+		this.useSimpleSourceMap = read();
+		this.hot = read();
+		this._warnings = read();
+		this._errors = read();
+		this.buildMeta = read();
+		this.buildInfo = read();
+		this.presentationalDependencies = read();
+		this.codeGenerationDependencies = read();
+		super.deserialize(context);
 	}
 }
 
-// TODO remove in webpack 5
-Object.defineProperty(Module.prototype, "forEachChunk", {
-	configurable: false,
-	value: util.deprecate(
-		/**
-		 * @deprecated
-		 * @param {function(any, any, Set): void} fn callback function
-		 * @returns {void}
-		 * @this {Module}
-		 */
-		function(fn) {
-			this._chunks.forEach(fn);
-		},
-		"Module.forEachChunk: Use for(const chunk of module.chunksIterable) instead"
-	)
-});
+makeSerializable(Module, "webpack/lib/Module");
 
-// TODO remove in webpack 5
-Object.defineProperty(Module.prototype, "mapChunks", {
-	configurable: false,
-	value: util.deprecate(
-		/**
-		 * @deprecated
-		 * @param {function(any, any): void} fn Mapper function
-		 * @returns {Array} Array of chunks mapped
-		 * @this {Module}
-		 */
-		function(fn) {
-			return Array.from(this._chunks, fn);
-		},
-		"Module.mapChunks: Use Array.from(module.chunksIterable, fn) instead"
-	)
+// TODO remove in webpack 6
+Object.defineProperty(Module.prototype, "hasEqualsChunks", {
+	/**
+	 * @deprecated
+	 * @returns {EXPECTED_ANY} throw an error
+	 */
+	get() {
+		throw new Error(
+			"Module.hasEqualsChunks was renamed (use hasEqualChunks instead)"
+		);
+	}
 });
 
-// TODO remove in webpack 5
-Object.defineProperty(Module.prototype, "entry", {
-	configurable: false,
+// TODO remove in webpack 6
+Object.defineProperty(Module.prototype, "isUsed", {
+	/**
+	 * @deprecated
+	 * @returns {EXPECTED_ANY} throw an error
+	 */
 	get() {
-		throw new Error("Module.entry was removed. Use Chunk.entryModule");
-	},
-	set() {
-		throw new Error("Module.entry was removed. Use Chunk.entryModule");
+		throw new Error(
+			"Module.isUsed was renamed (use getUsedName, isExportUsed or isModuleUsed instead)"
+		);
 	}
 });
 
-// TODO remove in webpack 5
-Object.defineProperty(Module.prototype, "meta", {
-	configurable: false,
+// TODO remove in webpack 6
+Object.defineProperty(Module.prototype, "errors", {
+	/**
+	 * @deprecated
+	 * @returns {WebpackError[]} errors
+	 */
 	get: util.deprecate(
 		/**
-		 * @deprecated
-		 * @returns {void}
 		 * @this {Module}
+		 * @returns {WebpackError[]} errors
 		 */
-		function() {
-			return this.buildMeta;
+		function () {
+			if (this._errors === undefined) {
+				this._errors = [];
+			}
+			return this._errors;
 		},
-		"Module.meta was renamed to Module.buildMeta"
-	),
-	set: util.deprecate(
+		"Module.errors was removed (use getErrors instead)",
+		"DEP_WEBPACK_MODULE_ERRORS"
+	)
+});
+
+// TODO remove in webpack 6
+Object.defineProperty(Module.prototype, "warnings", {
+	/**
+	 * @deprecated
+	 * @returns {WebpackError[]} warnings
+	 */
+	get: util.deprecate(
 		/**
-		 * @deprecated
-		 * @param {TODO} value Value
-		 * @returns {void}
 		 * @this {Module}
+		 * @returns {WebpackError[]} warnings
 		 */
-		function(value) {
-			this.buildMeta = value;
+		function () {
+			if (this._warnings === undefined) {
+				this._warnings = [];
+			}
+			return this._warnings;
 		},
-		"Module.meta was renamed to Module.buildMeta"
+		"Module.warnings was removed (use getWarnings instead)",
+		"DEP_WEBPACK_MODULE_WARNINGS"
 	)
 });
 
-/** @type {function(): string} */
-Module.prototype.identifier = null;
-
-/** @type {function(RequestShortener): string} */
-Module.prototype.readableIdentifier = null;
-
-Module.prototype.build = null;
-Module.prototype.source = null;
-Module.prototype.size = null;
-Module.prototype.nameForCondition = null;
-/** @type {null | function(Chunk): boolean} */
-Module.prototype.chunkCondition = null;
-Module.prototype.updateCacheModule = null;
+// TODO remove in webpack 6
+Object.defineProperty(Module.prototype, "used", {
+	/**
+	 * @deprecated
+	 * @returns {EXPECTED_ANY} throw an error
+	 */
+	get() {
+		throw new Error(
+			"Module.used was refactored (use ModuleGraph.getUsedExports instead)"
+		);
+	},
+	/**
+	 * @param {EXPECTED_ANY} value value
+	 */
+	set(value) {
+		throw new Error(
+			"Module.used was refactored (use ModuleGraph.setUsedExports instead)"
+		);
+	}
+});
 
 module.exports = Module;
diff --git a/lib/ModuleBuildError.js b/lib/ModuleBuildError.js
index d6b498eef23..15f16955ac2 100644
--- a/lib/ModuleBuildError.js
+++ b/lib/ModuleBuildError.js
@@ -2,51 +2,80 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const WebpackError = require("./WebpackError");
 const { cutOffLoaderExecution } = require("./ErrorHelpers");
+const WebpackError = require("./WebpackError");
+const makeSerializable = require("./util/makeSerializable");
+
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
+/** @typedef {Error & { hideStack?: boolean }} ErrorWithHideStack */
 
 class ModuleBuildError extends WebpackError {
-	constructor(module, err, { from = null } = {}) {
+	/**
+	 * @param {string | ErrorWithHideStack} err error thrown
+	 * @param {{from?: string|null}} info additional info
+	 */
+	constructor(err, { from = null } = {}) {
 		let message = "Module build failed";
-		let details = undefined;
-		if (from) {
-			message += ` (from ${from}):\n`;
-		} else {
-			message += ": ";
-		}
+		let details;
+
+		message += from ? ` (from ${from}):\n` : ": ";
+
 		if (err !== null && typeof err === "object") {
 			if (typeof err.stack === "string" && err.stack) {
 				const stack = cutOffLoaderExecution(err.stack);
+
 				if (!err.hideStack) {
 					message += stack;
 				} else {
 					details = stack;
-					if (typeof err.message === "string" && err.message) {
-						message += err.message;
-					} else {
-						message += err;
-					}
+
+					message +=
+						typeof err.message === "string" && err.message ? err.message : err;
 				}
 			} else if (typeof err.message === "string" && err.message) {
 				message += err.message;
 			} else {
-				message += err;
+				message += String(err);
 			}
 		} else {
-			message = err;
+			message += String(err);
 		}
 
 		super(message);
 
 		this.name = "ModuleBuildError";
 		this.details = details;
-		this.module = module;
 		this.error = err;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
 
-		Error.captureStackTrace(this, this.constructor);
+		write(this.error);
+
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+
+		this.error = read();
+
+		super.deserialize(context);
 	}
 }
 
+makeSerializable(ModuleBuildError, "webpack/lib/ModuleBuildError");
+
 module.exports = ModuleBuildError;
diff --git a/lib/ModuleDependencyError.js b/lib/ModuleDependencyError.js
index cb16cc34a1a..374f610b8b5 100644
--- a/lib/ModuleDependencyError.js
+++ b/lib/ModuleDependencyError.js
@@ -2,33 +2,41 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const WebpackError = require("./WebpackError");
 
+/** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
 /** @typedef {import("./Module")} Module */
+/** @typedef {import("./ModuleBuildError").ErrorWithHideStack} ErrorWithHideStack */
 
 class ModuleDependencyError extends WebpackError {
 	/**
 	 * Creates an instance of ModuleDependencyError.
 	 * @param {Module} module module tied to dependency
-	 * @param {Error} err error thrown
-	 * @param {TODO} loc location of dependency
+	 * @param {ErrorWithHideStack} err error thrown
+	 * @param {DependencyLocation} loc location of dependency
 	 */
 	constructor(module, err, loc) {
 		super(err.message);
 
 		this.name = "ModuleDependencyError";
-		this.details = err.stack
-			.split("\n")
-			.slice(1)
-			.join("\n");
+		this.details =
+			err && !err.hideStack
+				? /** @type {string} */ (err.stack).split("\n").slice(1).join("\n")
+				: undefined;
 		this.module = module;
 		this.loc = loc;
+		/** error is not (de)serialized, so it might be undefined after deserialization */
 		this.error = err;
-		this.origin = module.issuer;
 
-		Error.captureStackTrace(this, this.constructor);
+		if (err && err.hideStack && err.stack) {
+			this.stack = /** @type {string} */ `${err.stack
+				.split("\n")
+				.slice(1)
+				.join("\n")}\n\n${this.stack}`;
+		}
 	}
 }
 
diff --git a/lib/ModuleDependencyWarning.js b/lib/ModuleDependencyWarning.js
index be62791cbdc..dc4c4f3435b 100644
--- a/lib/ModuleDependencyWarning.js
+++ b/lib/ModuleDependencyWarning.js
@@ -2,24 +2,47 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const WebpackError = require("./WebpackError");
+const makeSerializable = require("./util/makeSerializable");
+
+/** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./ModuleDependencyError").ErrorWithHideStack} ErrorWithHideStack */
 
-module.exports = class ModuleDependencyWarning extends WebpackError {
+class ModuleDependencyWarning extends WebpackError {
+	/**
+	 * @param {Module} module module tied to dependency
+	 * @param {ErrorWithHideStack} err error thrown
+	 * @param {DependencyLocation} loc location of dependency
+	 */
 	constructor(module, err, loc) {
-		super(err.message);
+		super(err ? err.message : "");
 
 		this.name = "ModuleDependencyWarning";
-		this.details = err.stack
-			.split("\n")
-			.slice(1)
-			.join("\n");
+		this.details =
+			err && !err.hideStack
+				? /** @type {string} */ (err.stack).split("\n").slice(1).join("\n")
+				: undefined;
 		this.module = module;
 		this.loc = loc;
+		/** error is not (de)serialized, so it might be undefined after deserialization */
 		this.error = err;
-		this.origin = module.issuer;
 
-		Error.captureStackTrace(this, this.constructor);
+		if (err && err.hideStack && err.stack) {
+			this.stack = /** @type {string} */ `${err.stack
+				.split("\n")
+				.slice(1)
+				.join("\n")}\n\n${this.stack}`;
+		}
 	}
-};
+}
+
+makeSerializable(
+	ModuleDependencyWarning,
+	"webpack/lib/ModuleDependencyWarning"
+);
+
+module.exports = ModuleDependencyWarning;
diff --git a/lib/ModuleError.js b/lib/ModuleError.js
index 7079d613292..f8227a8fc48 100644
--- a/lib/ModuleError.js
+++ b/lib/ModuleError.js
@@ -2,35 +2,65 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const WebpackError = require("./WebpackError");
 const { cleanUp } = require("./ErrorHelpers");
+const WebpackError = require("./WebpackError");
+const makeSerializable = require("./util/makeSerializable");
+
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
 
 class ModuleError extends WebpackError {
-	constructor(module, err, { from = null } = {}) {
+	/**
+	 * @param {Error} err error thrown
+	 * @param {{from?: string|null}} info additional info
+	 */
+	constructor(err, { from = null } = {}) {
 		let message = "Module Error";
-		if (from) {
-			message += ` (from ${from}):\n`;
-		} else {
-			message += ": ";
-		}
+
+		message += from ? ` (from ${from}):\n` : ": ";
+
 		if (err && typeof err === "object" && err.message) {
 			message += err.message;
 		} else if (err) {
 			message += err;
 		}
+
 		super(message);
+
 		this.name = "ModuleError";
-		this.module = module;
 		this.error = err;
 		this.details =
 			err && typeof err === "object" && err.stack
 				? cleanUp(err.stack, this.message)
 				: undefined;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+
+		write(this.error);
+
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
 
-		Error.captureStackTrace(this, this.constructor);
+		this.error = read();
+
+		super.deserialize(context);
 	}
 }
 
+makeSerializable(ModuleError, "webpack/lib/ModuleError");
+
 module.exports = ModuleError;
diff --git a/lib/ModuleFactory.js b/lib/ModuleFactory.js
new file mode 100644
index 00000000000..26cb9a94a78
--- /dev/null
+++ b/lib/ModuleFactory.js
@@ -0,0 +1,56 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+/** @typedef {import("../declarations/WebpackOptions").ResolveOptions} ResolveOptions */
+/** @typedef {import("./Dependency")} Dependency */
+/** @typedef {import("./Module")} Module */
+
+/**
+ * @typedef {object} ModuleFactoryResult
+ * @property {Module=} module the created module or unset if no module was created
+ * @property {Set=} fileDependencies
+ * @property {Set=} contextDependencies
+ * @property {Set=} missingDependencies
+ * @property {boolean=} cacheable allow to use the unsafe cache
+ */
+
+/** @typedef {string | null} IssuerLayer */
+
+/**
+ * @typedef {object} ModuleFactoryCreateDataContextInfo
+ * @property {string} issuer
+ * @property {IssuerLayer=} issuerLayer
+ * @property {string=} compiler
+ */
+
+/**
+ * @typedef {object} ModuleFactoryCreateData
+ * @property {ModuleFactoryCreateDataContextInfo} contextInfo
+ * @property {ResolveOptions=} resolveOptions
+ * @property {string} context
+ * @property {Dependency[]} dependencies
+ */
+
+/**
+ * @typedef {(err?: Error | null, result?: ModuleFactoryResult) => void} ModuleFactoryCallback
+ */
+
+class ModuleFactory {
+	/* istanbul ignore next */
+	/**
+	 * @abstract
+	 * @param {ModuleFactoryCreateData} data data object
+	 * @param {ModuleFactoryCallback} callback callback
+	 * @returns {void}
+	 */
+	create(data, callback) {
+		const AbstractMethodError = require("./AbstractMethodError");
+		throw new AbstractMethodError();
+	}
+}
+
+module.exports = ModuleFactory;
diff --git a/lib/ModuleFilenameHelpers.js b/lib/ModuleFilenameHelpers.js
index 105e89e3fa8..0abb1220e9a 100644
--- a/lib/ModuleFilenameHelpers.js
+++ b/lib/ModuleFilenameHelpers.js
@@ -2,20 +2,37 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const NormalModule = require("./NormalModule");
+const { DEFAULTS } = require("./config/defaults");
 const createHash = require("./util/createHash");
+const memoize = require("./util/memoize");
+
+/** @typedef {import("../declarations/WebpackOptions").DevtoolModuleFilenameTemplate} DevtoolModuleFilenameTemplate */
+/** @typedef {import("../declarations/WebpackOptions").HashFunction} HashFunction */
+/** @typedef {import("./ChunkGraph")} ChunkGraph */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./RequestShortener")} RequestShortener */
 
-const ModuleFilenameHelpers = exports;
+/** @typedef {string | RegExp | (string | RegExp)[]} Matcher */
+/** @typedef {{ test?: Matcher, include?: Matcher, exclude?: Matcher }} MatchObject */
 
+const ModuleFilenameHelpers = module.exports;
+
+// TODO webpack 6: consider removing these
 ModuleFilenameHelpers.ALL_LOADERS_RESOURCE = "[all-loaders][resource]";
-ModuleFilenameHelpers.REGEXP_ALL_LOADERS_RESOURCE = /\[all-?loaders\]\[resource\]/gi;
+ModuleFilenameHelpers.REGEXP_ALL_LOADERS_RESOURCE =
+	/\[all-?loaders\]\[resource\]/gi;
 ModuleFilenameHelpers.LOADERS_RESOURCE = "[loaders][resource]";
 ModuleFilenameHelpers.REGEXP_LOADERS_RESOURCE = /\[loaders\]\[resource\]/gi;
 ModuleFilenameHelpers.RESOURCE = "[resource]";
 ModuleFilenameHelpers.REGEXP_RESOURCE = /\[resource\]/gi;
 ModuleFilenameHelpers.ABSOLUTE_RESOURCE_PATH = "[absolute-resource-path]";
-ModuleFilenameHelpers.REGEXP_ABSOLUTE_RESOURCE_PATH = /\[abs(olute)?-?resource-?path\]/gi;
+// cSpell:words olute
+ModuleFilenameHelpers.REGEXP_ABSOLUTE_RESOURCE_PATH =
+	/\[abs(olute)?-?resource-?path\]/gi;
 ModuleFilenameHelpers.RESOURCE_PATH = "[resource-path]";
 ModuleFilenameHelpers.REGEXP_RESOURCE_PATH = /\[resource-?path\]/gi;
 ModuleFilenameHelpers.ALL_LOADERS = "[all-loaders]";
@@ -31,148 +48,322 @@ ModuleFilenameHelpers.REGEXP_HASH = /\[hash\]/gi;
 ModuleFilenameHelpers.NAMESPACE = "[namespace]";
 ModuleFilenameHelpers.REGEXP_NAMESPACE = /\[namespace\]/gi;
 
-const getAfter = (str, token) => {
+/** @typedef {() => string} ReturnStringCallback */
+
+/**
+ * Returns a function that returns the part of the string after the token
+ * @param {ReturnStringCallback} strFn the function to get the string
+ * @param {string} token the token to search for
+ * @returns {ReturnStringCallback} a function that returns the part of the string after the token
+ */
+const getAfter = (strFn, token) => () => {
+	const str = strFn();
 	const idx = str.indexOf(token);
-	return idx < 0 ? "" : str.substr(idx);
+	return idx < 0 ? "" : str.slice(idx);
 };
 
-const getBefore = (str, token) => {
+/**
+ * Returns a function that returns the part of the string before the token
+ * @param {ReturnStringCallback} strFn the function to get the string
+ * @param {string} token the token to search for
+ * @returns {ReturnStringCallback} a function that returns the part of the string before the token
+ */
+const getBefore = (strFn, token) => () => {
+	const str = strFn();
 	const idx = str.lastIndexOf(token);
-	return idx < 0 ? "" : str.substr(0, idx);
+	return idx < 0 ? "" : str.slice(0, idx);
 };
 
-const getHash = str => {
-	const hash = createHash("md4");
-	hash.update(str);
-	return hash.digest("hex").substr(0, 4);
-};
+/**
+ * Returns a function that returns a hash of the string
+ * @param {ReturnStringCallback} strFn the function to get the string
+ * @param {HashFunction=} hashFunction the hash function to use
+ * @returns {ReturnStringCallback} a function that returns the hash of the string
+ */
+const getHash =
+	(strFn, hashFunction = DEFAULTS.HASH_FUNCTION) =>
+	() => {
+		const hash = createHash(hashFunction);
+		hash.update(strFn());
+		const digest = /** @type {string} */ (hash.digest("hex"));
+		return digest.slice(0, 4);
+	};
 
-const asRegExp = test => {
-	if (typeof test === "string") {
-		test = new RegExp("^" + test.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"));
+/**
+ * @template T
+ * Returns a lazy object. The object is lazy in the sense that the properties are
+ * only evaluated when they are accessed. This is only obtained by setting a function as the value for each key.
+ * @param {Record T>} obj the object to convert to a lazy access object
+ * @returns {T} the lazy access object
+ */
+const lazyObject = obj => {
+	const newObj = /** @type {T} */ ({});
+	for (const key of Object.keys(obj)) {
+		const fn = obj[key];
+		Object.defineProperty(newObj, key, {
+			get: () => fn(),
+			set: v => {
+				Object.defineProperty(newObj, key, {
+					value: v,
+					enumerable: true,
+					writable: true
+				});
+			},
+			enumerable: true,
+			configurable: true
+		});
 	}
-	return test;
+	return newObj;
 };
 
-ModuleFilenameHelpers.createFilename = (module, options, requestShortener) => {
-	const opts = Object.assign(
-		{
-			namespace: "",
-			moduleFilenameTemplate: ""
-		},
-		typeof options === "object"
+const SQUARE_BRACKET_TAG_REGEXP = /\[\\*([\w-]+)\\*\]/gi;
+
+/** @typedef {((context: TODO) => string)} ModuleFilenameTemplateFunction */
+/** @typedef {string | ModuleFilenameTemplateFunction} ModuleFilenameTemplate */
+
+/**
+ * @param {Module | string} module the module
+ * @param {{ namespace?: string, moduleFilenameTemplate?: ModuleFilenameTemplate }} options options
+ * @param {{ requestShortener: RequestShortener, chunkGraph: ChunkGraph, hashFunction?: HashFunction }} contextInfo context info
+ * @returns {string} the filename
+ */
+ModuleFilenameHelpers.createFilename = (
+	// eslint-disable-next-line default-param-last
+	module = "",
+	options,
+	{ requestShortener, chunkGraph, hashFunction = DEFAULTS.HASH_FUNCTION }
+) => {
+	const opts = {
+		namespace: "",
+		moduleFilenameTemplate: "",
+		...(typeof options === "object"
 			? options
 			: {
 					moduleFilenameTemplate: options
-			  }
-	);
+				})
+	};
 
+	/** @type {ReturnStringCallback} */
 	let absoluteResourcePath;
 	let hash;
+	/** @type {ReturnStringCallback} */
 	let identifier;
+	/** @type {ReturnStringCallback} */
 	let moduleId;
+	/** @type {ReturnStringCallback} */
 	let shortIdentifier;
-	if (module === undefined) module = "";
 	if (typeof module === "string") {
-		shortIdentifier = requestShortener.shorten(module);
+		shortIdentifier =
+			/** @type {ReturnStringCallback} */
+			(memoize(() => requestShortener.shorten(module)));
 		identifier = shortIdentifier;
-		moduleId = "";
-		absoluteResourcePath = module.split("!").pop();
-		hash = getHash(identifier);
+		moduleId = () => "";
+		absoluteResourcePath = () =>
+			/** @type {string} */ (module.split("!").pop());
+		hash = getHash(identifier, hashFunction);
 	} else {
-		shortIdentifier = module.readableIdentifier(requestShortener);
-		identifier = requestShortener.shorten(module.identifier());
-		moduleId = module.id;
-		absoluteResourcePath = module
-			.identifier()
-			.split("!")
-			.pop();
-		hash = getHash(identifier);
+		shortIdentifier = memoize(() =>
+			module.readableIdentifier(requestShortener)
+		);
+		identifier =
+			/** @type {ReturnStringCallback} */
+			(memoize(() => requestShortener.shorten(module.identifier())));
+		moduleId =
+			/** @type {ReturnStringCallback} */
+			(() => chunkGraph.getModuleId(module));
+		absoluteResourcePath = () =>
+			module instanceof NormalModule
+				? module.resource
+				: /** @type {string} */ (module.identifier().split("!").pop());
+		hash = getHash(identifier, hashFunction);
 	}
-	const resource = shortIdentifier.split("!").pop();
+	const resource =
+		/** @type {ReturnStringCallback} */
+		(memoize(() => shortIdentifier().split("!").pop()));
+
 	const loaders = getBefore(shortIdentifier, "!");
 	const allLoaders = getBefore(identifier, "!");
 	const query = getAfter(resource, "?");
-	const resourcePath = resource.substr(0, resource.length - query.length);
+	const resourcePath = () => {
+		const q = query().length;
+		return q === 0 ? resource() : resource().slice(0, -q);
+	};
 	if (typeof opts.moduleFilenameTemplate === "function") {
-		return opts.moduleFilenameTemplate({
-			identifier: identifier,
-			shortIdentifier: shortIdentifier,
-			resource: resource,
-			resourcePath: resourcePath,
-			absoluteResourcePath: absoluteResourcePath,
-			allLoaders: allLoaders,
-			query: query,
-			moduleId: moduleId,
-			hash: hash,
-			namespace: opts.namespace
-		});
+		return opts.moduleFilenameTemplate(
+			lazyObject({
+				identifier,
+				shortIdentifier,
+				resource,
+				resourcePath: memoize(resourcePath),
+				absoluteResourcePath: memoize(absoluteResourcePath),
+				loaders: memoize(loaders),
+				allLoaders: memoize(allLoaders),
+				query: memoize(query),
+				moduleId: memoize(moduleId),
+				hash: memoize(hash),
+				namespace: () => opts.namespace
+			})
+		);
 	}
-	return opts.moduleFilenameTemplate
-		.replace(ModuleFilenameHelpers.REGEXP_ALL_LOADERS_RESOURCE, identifier)
-		.replace(ModuleFilenameHelpers.REGEXP_LOADERS_RESOURCE, shortIdentifier)
-		.replace(ModuleFilenameHelpers.REGEXP_RESOURCE, resource)
-		.replace(ModuleFilenameHelpers.REGEXP_RESOURCE_PATH, resourcePath)
+
+	// TODO webpack 6: consider removing alternatives without dashes
+	/** @type {Map string>} */
+	const replacements = new Map([
+		["identifier", identifier],
+		["short-identifier", shortIdentifier],
+		["resource", resource],
+		["resource-path", resourcePath],
+		// cSpell:words resourcepath
+		["resourcepath", resourcePath],
+		["absolute-resource-path", absoluteResourcePath],
+		["abs-resource-path", absoluteResourcePath],
+		// cSpell:words absoluteresource
+		["absoluteresource-path", absoluteResourcePath],
+		// cSpell:words absresource
+		["absresource-path", absoluteResourcePath],
+		// cSpell:words resourcepath
+		["absolute-resourcepath", absoluteResourcePath],
+		// cSpell:words resourcepath
+		["abs-resourcepath", absoluteResourcePath],
+		// cSpell:words absoluteresourcepath
+		["absoluteresourcepath", absoluteResourcePath],
+		// cSpell:words absresourcepath
+		["absresourcepath", absoluteResourcePath],
+		["all-loaders", allLoaders],
+		// cSpell:words allloaders
+		["allloaders", allLoaders],
+		["loaders", loaders],
+		["query", query],
+		["id", moduleId],
+		["hash", hash],
+		["namespace", () => opts.namespace]
+	]);
+
+	// TODO webpack 6: consider removing weird double placeholders
+	return /** @type {string} */ (opts.moduleFilenameTemplate)
+		.replace(ModuleFilenameHelpers.REGEXP_ALL_LOADERS_RESOURCE, "[identifier]")
 		.replace(
-			ModuleFilenameHelpers.REGEXP_ABSOLUTE_RESOURCE_PATH,
-			absoluteResourcePath
+			ModuleFilenameHelpers.REGEXP_LOADERS_RESOURCE,
+			"[short-identifier]"
 		)
-		.replace(ModuleFilenameHelpers.REGEXP_ALL_LOADERS, allLoaders)
-		.replace(ModuleFilenameHelpers.REGEXP_LOADERS, loaders)
-		.replace(ModuleFilenameHelpers.REGEXP_QUERY, query)
-		.replace(ModuleFilenameHelpers.REGEXP_ID, moduleId)
-		.replace(ModuleFilenameHelpers.REGEXP_HASH, hash)
-		.replace(ModuleFilenameHelpers.REGEXP_NAMESPACE, opts.namespace);
+		.replace(SQUARE_BRACKET_TAG_REGEXP, (match, content) => {
+			if (content.length + 2 === match.length) {
+				const replacement = replacements.get(content.toLowerCase());
+				if (replacement !== undefined) {
+					return replacement();
+				}
+			} else if (match.startsWith("[\\") && match.endsWith("\\]")) {
+				return `[${match.slice(2, -2)}]`;
+			}
+			return match;
+		});
 };
 
+/**
+ * Replaces duplicate items in an array with new values generated by a callback function.
+ * The callback function is called with the duplicate item, the index of the duplicate item, and the number of times the item has been replaced.
+ * The callback function should return the new value for the duplicate item.
+ * @template T
+ * @param {T[]} array the array with duplicates to be replaced
+ * @param {(duplicateItem: T, duplicateItemIndex: number, numberOfTimesReplaced: number) => T} fn callback function to generate new values for the duplicate items
+ * @param {(firstElement:T, nextElement:T) => -1 | 0 | 1=} comparator optional comparator function to sort the duplicate items
+ * @returns {T[]} the array with duplicates replaced
+ * @example
+ * ```js
+ * const array = ["a", "b", "c", "a", "b", "a"];
+ * const result = ModuleFilenameHelpers.replaceDuplicates(array, (item, index, count) => `${item}-${count}`);
+ * // result: ["a-1", "b-1", "c", "a-2", "b-2", "a-3"]
+ * ```
+ */
 ModuleFilenameHelpers.replaceDuplicates = (array, fn, comparator) => {
 	const countMap = Object.create(null);
 	const posMap = Object.create(null);
-	array.forEach((item, idx) => {
+
+	for (const [idx, item] of array.entries()) {
 		countMap[item] = countMap[item] || [];
 		countMap[item].push(idx);
 		posMap[item] = 0;
-	});
+	}
 	if (comparator) {
-		Object.keys(countMap).forEach(item => {
+		for (const item of Object.keys(countMap)) {
 			countMap[item].sort(comparator);
-		});
+		}
 	}
 	return array.map((item, i) => {
 		if (countMap[item].length > 1) {
 			if (comparator && countMap[item][0] === i) return item;
 			return fn(item, i, posMap[item]++);
-		} else {
-			return item;
 		}
+		return item;
 	});
 };
 
-ModuleFilenameHelpers.matchPart = (str, test) => {
+/**
+ * Tests if a string matches a RegExp or an array of RegExp.
+ * @param {string} str string to test
+ * @param {Matcher} test value which will be used to match against the string
+ * @returns {boolean} true, when the RegExp matches
+ * @example
+ * ```js
+ * ModuleFilenameHelpers.matchPart("foo.js", "foo"); // true
+ * ModuleFilenameHelpers.matchPart("foo.js", "foo.js"); // true
+ * ModuleFilenameHelpers.matchPart("foo.js", "foo."); // false
+ * ModuleFilenameHelpers.matchPart("foo.js", "foo*"); // false
+ * ModuleFilenameHelpers.matchPart("foo.js", "foo.*"); // true
+ * ModuleFilenameHelpers.matchPart("foo.js", /^foo/); // true
+ * ModuleFilenameHelpers.matchPart("foo.js", [/^foo/, "bar"]); // true
+ * ModuleFilenameHelpers.matchPart("foo.js", [/^foo/, "bar"]); // true
+ * ModuleFilenameHelpers.matchPart("foo.js", [/^foo/, /^bar/]); // true
+ * ModuleFilenameHelpers.matchPart("foo.js", [/^baz/, /^bar/]); // false
+ * ```
+ */
+const matchPart = (str, test) => {
 	if (!test) return true;
-	test = asRegExp(test);
 	if (Array.isArray(test)) {
-		return test.map(asRegExp).some(regExp => regExp.test(str));
-	} else {
-		return test.test(str);
+		return test.some(test => matchPart(str, test));
 	}
+	if (typeof test === "string") {
+		return str.startsWith(test);
+	}
+	return test.test(str);
 };
 
+ModuleFilenameHelpers.matchPart = matchPart;
+
+/**
+ * Tests if a string matches a match object. The match object can have the following properties:
+ * - `test`: a RegExp or an array of RegExp
+ * - `include`: a RegExp or an array of RegExp
+ * - `exclude`: a RegExp or an array of RegExp
+ *
+ * The `test` property is tested first, then `include` and then `exclude`.
+ * @param {MatchObject} obj a match object to test against the string
+ * @param {string} str string to test against the matching object
+ * @returns {boolean} true, when the object matches
+ * @example
+ * ```js
+ * ModuleFilenameHelpers.matchObject({ test: "foo.js" }, "foo.js"); // true
+ * ModuleFilenameHelpers.matchObject({ test: /^foo/ }, "foo.js"); // true
+ * ModuleFilenameHelpers.matchObject({ test: [/^foo/, "bar"] }, "foo.js"); // true
+ * ModuleFilenameHelpers.matchObject({ test: [/^foo/, "bar"] }, "baz.js"); // false
+ * ModuleFilenameHelpers.matchObject({ include: "foo.js" }, "foo.js"); // true
+ * ModuleFilenameHelpers.matchObject({ include: "foo.js" }, "bar.js"); // false
+ * ModuleFilenameHelpers.matchObject({ include: /^foo/ }, "foo.js"); // true
+ * ModuleFilenameHelpers.matchObject({ include: [/^foo/, "bar"] }, "foo.js"); // true
+ * ModuleFilenameHelpers.matchObject({ include: [/^foo/, "bar"] }, "baz.js"); // false
+ * ModuleFilenameHelpers.matchObject({ exclude: "foo.js" }, "foo.js"); // false
+ * ModuleFilenameHelpers.matchObject({ exclude: [/^foo/, "bar"] }, "foo.js"); // false
+ * ```
+ */
 ModuleFilenameHelpers.matchObject = (obj, str) => {
-	if (obj.test) {
-		if (!ModuleFilenameHelpers.matchPart(str, obj.test)) {
-			return false;
-		}
+	if (obj.test && !ModuleFilenameHelpers.matchPart(str, obj.test)) {
+		return false;
 	}
-	if (obj.include) {
-		if (!ModuleFilenameHelpers.matchPart(str, obj.include)) {
-			return false;
-		}
+	if (obj.include && !ModuleFilenameHelpers.matchPart(str, obj.include)) {
+		return false;
 	}
-	if (obj.exclude) {
-		if (ModuleFilenameHelpers.matchPart(str, obj.exclude)) {
-			return false;
-		}
+	if (obj.exclude && ModuleFilenameHelpers.matchPart(str, obj.exclude)) {
+		return false;
 	}
 	return true;
 };
diff --git a/lib/ModuleGraph.js b/lib/ModuleGraph.js
new file mode 100644
index 00000000000..40fc0392d94
--- /dev/null
+++ b/lib/ModuleGraph.js
@@ -0,0 +1,907 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const util = require("util");
+const ExportsInfo = require("./ExportsInfo");
+const ModuleGraphConnection = require("./ModuleGraphConnection");
+const SortableSet = require("./util/SortableSet");
+const WeakTupleMap = require("./util/WeakTupleMap");
+
+/** @typedef {import("./Compilation").ModuleMemCaches} ModuleMemCaches */
+/** @typedef {import("./DependenciesBlock")} DependenciesBlock */
+/** @typedef {import("./Dependency")} Dependency */
+/** @typedef {import("./ExportsInfo").ExportInfo} ExportInfo */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./ModuleProfile")} ModuleProfile */
+/** @typedef {import("./RequestShortener")} RequestShortener */
+/** @typedef {import("./util/runtime").RuntimeSpec} RuntimeSpec */
+
+/**
+ * @callback OptimizationBailoutFunction
+ * @param {RequestShortener} requestShortener
+ * @returns {string}
+ */
+
+const EMPTY_SET = new Set();
+
+/**
+ * @param {SortableSet} set input
+ * @returns {readonly Map} mapped by origin module
+ */
+const getConnectionsByOriginModule = set => {
+	const map = new Map();
+	/** @type {Module | 0} */
+	let lastModule = 0;
+	/** @type {ModuleGraphConnection[] | undefined} */
+	let lastList;
+	for (const connection of set) {
+		const { originModule } = connection;
+		if (lastModule === originModule) {
+			/** @type {ModuleGraphConnection[]} */
+			(lastList).push(connection);
+		} else {
+			lastModule = /** @type {Module} */ (originModule);
+			const list = map.get(originModule);
+			if (list !== undefined) {
+				lastList = list;
+				list.push(connection);
+			} else {
+				const list = [connection];
+				lastList = list;
+				map.set(originModule, list);
+			}
+		}
+	}
+	return map;
+};
+
+/**
+ * @param {SortableSet} set input
+ * @returns {readonly Map} mapped by module
+ */
+const getConnectionsByModule = set => {
+	const map = new Map();
+	/** @type {Module | 0} */
+	let lastModule = 0;
+	/** @type {ModuleGraphConnection[] | undefined} */
+	let lastList;
+	for (const connection of set) {
+		const { module } = connection;
+		if (lastModule === module) {
+			/** @type {ModuleGraphConnection[]} */
+			(lastList).push(connection);
+		} else {
+			lastModule = module;
+			const list = map.get(module);
+			if (list !== undefined) {
+				lastList = list;
+				list.push(connection);
+			} else {
+				const list = [connection];
+				lastList = list;
+				map.set(module, list);
+			}
+		}
+	}
+	return map;
+};
+
+/** @typedef {SortableSet} IncomingConnections */
+/** @typedef {SortableSet} OutgoingConnections */
+
+class ModuleGraphModule {
+	constructor() {
+		/** @type {IncomingConnections} */
+		this.incomingConnections = new SortableSet();
+		/** @type {OutgoingConnections | undefined} */
+		this.outgoingConnections = undefined;
+		/** @type {Module | null | undefined} */
+		this.issuer = undefined;
+		/** @type {(string | OptimizationBailoutFunction)[]} */
+		this.optimizationBailout = [];
+		/** @type {ExportsInfo} */
+		this.exports = new ExportsInfo();
+		/** @type {number | null} */
+		this.preOrderIndex = null;
+		/** @type {number | null} */
+		this.postOrderIndex = null;
+		/** @type {number | null} */
+		this.depth = null;
+		/** @type {ModuleProfile | undefined} */
+		this.profile = undefined;
+		/** @type {boolean} */
+		this.async = false;
+		/** @type {ModuleGraphConnection[] | undefined} */
+		this._unassignedConnections = undefined;
+	}
+}
+
+/** @typedef {(moduleGraphConnection: ModuleGraphConnection) => boolean} FilterConnection */
+
+/** @typedef {EXPECTED_OBJECT} MetaKey */
+/** @typedef {TODO} Meta */
+
+class ModuleGraph {
+	constructor() {
+		/**
+		 * @type {WeakMap}
+		 * @private
+		 */
+		this._dependencyMap = new WeakMap();
+		/**
+		 * @type {Map}
+		 * @private
+		 */
+		this._moduleMap = new Map();
+		/**
+		 * @type {WeakMap}
+		 * @private
+		 */
+		this._metaMap = new WeakMap();
+		/**
+		 * @type {WeakTupleMap | undefined}
+		 * @private
+		 */
+		this._cache = undefined;
+		/**
+		 * @type {ModuleMemCaches | undefined}
+		 * @private
+		 */
+		this._moduleMemCaches = undefined;
+
+		/**
+		 * @type {string | undefined}
+		 * @private
+		 */
+		this._cacheStage = undefined;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @returns {ModuleGraphModule} the internal module
+	 */
+	_getModuleGraphModule(module) {
+		let mgm = this._moduleMap.get(module);
+		if (mgm === undefined) {
+			mgm = new ModuleGraphModule();
+			this._moduleMap.set(module, mgm);
+		}
+		return mgm;
+	}
+
+	/**
+	 * @param {Dependency} dependency the dependency
+	 * @param {DependenciesBlock} block parent block
+	 * @param {Module} module parent module
+	 * @param {number=} indexInBlock position in block
+	 * @returns {void}
+	 */
+	setParents(dependency, block, module, indexInBlock = -1) {
+		dependency._parentDependenciesBlockIndex = indexInBlock;
+		dependency._parentDependenciesBlock = block;
+		dependency._parentModule = module;
+	}
+
+	/**
+	 * @param {Dependency} dependency the dependency
+	 * @returns {Module | undefined} parent module
+	 */
+	getParentModule(dependency) {
+		return dependency._parentModule;
+	}
+
+	/**
+	 * @param {Dependency} dependency the dependency
+	 * @returns {DependenciesBlock | undefined} parent block
+	 */
+	getParentBlock(dependency) {
+		return dependency._parentDependenciesBlock;
+	}
+
+	/**
+	 * @param {Dependency} dependency the dependency
+	 * @returns {number} index
+	 */
+	getParentBlockIndex(dependency) {
+		return dependency._parentDependenciesBlockIndex;
+	}
+
+	/**
+	 * @param {Module | null} originModule the referencing module
+	 * @param {Dependency} dependency the referencing dependency
+	 * @param {Module} module the referenced module
+	 * @returns {void}
+	 */
+	setResolvedModule(originModule, dependency, module) {
+		const connection = new ModuleGraphConnection(
+			originModule,
+			dependency,
+			module,
+			undefined,
+			dependency.weak,
+			dependency.getCondition(this)
+		);
+		const connections = this._getModuleGraphModule(module).incomingConnections;
+		connections.add(connection);
+		if (originModule) {
+			const mgm = this._getModuleGraphModule(originModule);
+			if (mgm._unassignedConnections === undefined) {
+				mgm._unassignedConnections = [];
+			}
+			mgm._unassignedConnections.push(connection);
+			if (mgm.outgoingConnections === undefined) {
+				mgm.outgoingConnections = new SortableSet();
+			}
+			mgm.outgoingConnections.add(connection);
+		} else {
+			this._dependencyMap.set(dependency, connection);
+		}
+	}
+
+	/**
+	 * @param {Dependency} dependency the referencing dependency
+	 * @param {Module} module the referenced module
+	 * @returns {void}
+	 */
+	updateModule(dependency, module) {
+		const connection =
+			/** @type {ModuleGraphConnection} */
+			(this.getConnection(dependency));
+		if (connection.module === module) return;
+		const newConnection = connection.clone();
+		newConnection.module = module;
+		this._dependencyMap.set(dependency, newConnection);
+		connection.setActive(false);
+		const originMgm = this._getModuleGraphModule(
+			/** @type {Module} */ (connection.originModule)
+		);
+		/** @type {OutgoingConnections} */
+		(originMgm.outgoingConnections).add(newConnection);
+		const targetMgm = this._getModuleGraphModule(module);
+		targetMgm.incomingConnections.add(newConnection);
+	}
+
+	/**
+	 * @param {Dependency} dependency the referencing dependency
+	 * @returns {void}
+	 */
+	removeConnection(dependency) {
+		const connection =
+			/** @type {ModuleGraphConnection} */
+			(this.getConnection(dependency));
+		const targetMgm = this._getModuleGraphModule(connection.module);
+		targetMgm.incomingConnections.delete(connection);
+		const originMgm = this._getModuleGraphModule(
+			/** @type {Module} */ (connection.originModule)
+		);
+		/** @type {OutgoingConnections} */
+		(originMgm.outgoingConnections).delete(connection);
+		this._dependencyMap.set(dependency, null);
+	}
+
+	/**
+	 * @param {Dependency} dependency the referencing dependency
+	 * @param {string} explanation an explanation
+	 * @returns {void}
+	 */
+	addExplanation(dependency, explanation) {
+		const connection =
+			/** @type {ModuleGraphConnection} */
+			(this.getConnection(dependency));
+		connection.addExplanation(explanation);
+	}
+
+	/**
+	 * @param {Module} sourceModule the source module
+	 * @param {Module} targetModule the target module
+	 * @returns {void}
+	 */
+	cloneModuleAttributes(sourceModule, targetModule) {
+		const oldMgm = this._getModuleGraphModule(sourceModule);
+		const newMgm = this._getModuleGraphModule(targetModule);
+		newMgm.postOrderIndex = oldMgm.postOrderIndex;
+		newMgm.preOrderIndex = oldMgm.preOrderIndex;
+		newMgm.depth = oldMgm.depth;
+		newMgm.exports = oldMgm.exports;
+		newMgm.async = oldMgm.async;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @returns {void}
+	 */
+	removeModuleAttributes(module) {
+		const mgm = this._getModuleGraphModule(module);
+		mgm.postOrderIndex = null;
+		mgm.preOrderIndex = null;
+		mgm.depth = null;
+		mgm.async = false;
+	}
+
+	/**
+	 * @returns {void}
+	 */
+	removeAllModuleAttributes() {
+		for (const mgm of this._moduleMap.values()) {
+			mgm.postOrderIndex = null;
+			mgm.preOrderIndex = null;
+			mgm.depth = null;
+			mgm.async = false;
+		}
+	}
+
+	/**
+	 * @param {Module} oldModule the old referencing module
+	 * @param {Module} newModule the new referencing module
+	 * @param {FilterConnection} filterConnection filter predicate for replacement
+	 * @returns {void}
+	 */
+	moveModuleConnections(oldModule, newModule, filterConnection) {
+		if (oldModule === newModule) return;
+		const oldMgm = this._getModuleGraphModule(oldModule);
+		const newMgm = this._getModuleGraphModule(newModule);
+		// Outgoing connections
+		const oldConnections = oldMgm.outgoingConnections;
+		if (oldConnections !== undefined) {
+			if (newMgm.outgoingConnections === undefined) {
+				newMgm.outgoingConnections = new SortableSet();
+			}
+			const newConnections = newMgm.outgoingConnections;
+			for (const connection of oldConnections) {
+				if (filterConnection(connection)) {
+					connection.originModule = newModule;
+					newConnections.add(connection);
+					oldConnections.delete(connection);
+				}
+			}
+		}
+		// Incoming connections
+		const oldConnections2 = oldMgm.incomingConnections;
+		const newConnections2 = newMgm.incomingConnections;
+		for (const connection of oldConnections2) {
+			if (filterConnection(connection)) {
+				connection.module = newModule;
+				newConnections2.add(connection);
+				oldConnections2.delete(connection);
+			}
+		}
+	}
+
+	/**
+	 * @param {Module} oldModule the old referencing module
+	 * @param {Module} newModule the new referencing module
+	 * @param {FilterConnection} filterConnection filter predicate for replacement
+	 * @returns {void}
+	 */
+	copyOutgoingModuleConnections(oldModule, newModule, filterConnection) {
+		if (oldModule === newModule) return;
+		const oldMgm = this._getModuleGraphModule(oldModule);
+		const newMgm = this._getModuleGraphModule(newModule);
+		// Outgoing connections
+		const oldConnections = oldMgm.outgoingConnections;
+		if (oldConnections !== undefined) {
+			if (newMgm.outgoingConnections === undefined) {
+				newMgm.outgoingConnections = new SortableSet();
+			}
+			const newConnections = newMgm.outgoingConnections;
+			for (const connection of oldConnections) {
+				if (filterConnection(connection)) {
+					const newConnection = connection.clone();
+					newConnection.originModule = newModule;
+					newConnections.add(newConnection);
+					if (newConnection.module !== undefined) {
+						const otherMgm = this._getModuleGraphModule(newConnection.module);
+						otherMgm.incomingConnections.add(newConnection);
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * @param {Module} module the referenced module
+	 * @param {string} explanation an explanation why it's referenced
+	 * @returns {void}
+	 */
+	addExtraReason(module, explanation) {
+		const connections = this._getModuleGraphModule(module).incomingConnections;
+		connections.add(new ModuleGraphConnection(null, null, module, explanation));
+	}
+
+	/**
+	 * @param {Dependency} dependency the dependency to look for a referenced module
+	 * @returns {Module | null} the referenced module
+	 */
+	getResolvedModule(dependency) {
+		const connection = this.getConnection(dependency);
+		return connection !== undefined ? connection.resolvedModule : null;
+	}
+
+	/**
+	 * @param {Dependency} dependency the dependency to look for a referenced module
+	 * @returns {ModuleGraphConnection | undefined} the connection
+	 */
+	getConnection(dependency) {
+		const connection = this._dependencyMap.get(dependency);
+		if (connection === undefined) {
+			const module = this.getParentModule(dependency);
+			if (module !== undefined) {
+				const mgm = this._getModuleGraphModule(module);
+				if (
+					mgm._unassignedConnections &&
+					mgm._unassignedConnections.length !== 0
+				) {
+					let foundConnection;
+					for (const connection of mgm._unassignedConnections) {
+						this._dependencyMap.set(
+							/** @type {Dependency} */ (connection.dependency),
+							connection
+						);
+						if (connection.dependency === dependency)
+							foundConnection = connection;
+					}
+					mgm._unassignedConnections.length = 0;
+					if (foundConnection !== undefined) {
+						return foundConnection;
+					}
+				}
+			}
+			this._dependencyMap.set(dependency, null);
+			return;
+		}
+		return connection === null ? undefined : connection;
+	}
+
+	/**
+	 * @param {Dependency} dependency the dependency to look for a referenced module
+	 * @returns {Module | null} the referenced module
+	 */
+	getModule(dependency) {
+		const connection = this.getConnection(dependency);
+		return connection !== undefined ? connection.module : null;
+	}
+
+	/**
+	 * @param {Dependency} dependency the dependency to look for a referencing module
+	 * @returns {Module | null} the referencing module
+	 */
+	getOrigin(dependency) {
+		const connection = this.getConnection(dependency);
+		return connection !== undefined ? connection.originModule : null;
+	}
+
+	/**
+	 * @param {Dependency} dependency the dependency to look for a referencing module
+	 * @returns {Module | null} the original referencing module
+	 */
+	getResolvedOrigin(dependency) {
+		const connection = this.getConnection(dependency);
+		return connection !== undefined ? connection.resolvedOriginModule : null;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @returns {Iterable} reasons why a module is included
+	 */
+	getIncomingConnections(module) {
+		const connections = this._getModuleGraphModule(module).incomingConnections;
+		return connections;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @returns {Iterable} list of outgoing connections
+	 */
+	getOutgoingConnections(module) {
+		const connections = this._getModuleGraphModule(module).outgoingConnections;
+		return connections === undefined ? EMPTY_SET : connections;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @returns {readonly Map} reasons why a module is included, in a map by source module
+	 */
+	getIncomingConnectionsByOriginModule(module) {
+		const connections = this._getModuleGraphModule(module).incomingConnections;
+		return connections.getFromUnorderedCache(getConnectionsByOriginModule);
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @returns {readonly Map | undefined} connections to modules, in a map by module
+	 */
+	getOutgoingConnectionsByModule(module) {
+		const connections = this._getModuleGraphModule(module).outgoingConnections;
+		return connections === undefined
+			? undefined
+			: connections.getFromUnorderedCache(getConnectionsByModule);
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @returns {ModuleProfile | undefined} the module profile
+	 */
+	getProfile(module) {
+		const mgm = this._getModuleGraphModule(module);
+		return mgm.profile;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {ModuleProfile | undefined} profile the module profile
+	 * @returns {void}
+	 */
+	setProfile(module, profile) {
+		const mgm = this._getModuleGraphModule(module);
+		mgm.profile = profile;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @returns {Module | null | undefined} the issuer module
+	 */
+	getIssuer(module) {
+		const mgm = this._getModuleGraphModule(module);
+		return mgm.issuer;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {Module | null} issuer the issuer module
+	 * @returns {void}
+	 */
+	setIssuer(module, issuer) {
+		const mgm = this._getModuleGraphModule(module);
+		mgm.issuer = issuer;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {Module | null} issuer the issuer module
+	 * @returns {void}
+	 */
+	setIssuerIfUnset(module, issuer) {
+		const mgm = this._getModuleGraphModule(module);
+		if (mgm.issuer === undefined) mgm.issuer = issuer;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @returns {(string | OptimizationBailoutFunction)[]} optimization bailouts
+	 */
+	getOptimizationBailout(module) {
+		const mgm = this._getModuleGraphModule(module);
+		return mgm.optimizationBailout;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @returns {true | string[] | null} the provided exports
+	 */
+	getProvidedExports(module) {
+		const mgm = this._getModuleGraphModule(module);
+		return mgm.exports.getProvidedExports();
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {string | string[]} exportName a name of an export
+	 * @returns {boolean | null} true, if the export is provided by the module.
+	 * null, if it's unknown.
+	 * false, if it's not provided.
+	 */
+	isExportProvided(module, exportName) {
+		const mgm = this._getModuleGraphModule(module);
+		const result = mgm.exports.isExportProvided(exportName);
+		return result === undefined ? null : result;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @returns {ExportsInfo} info about the exports
+	 */
+	getExportsInfo(module) {
+		const mgm = this._getModuleGraphModule(module);
+		return mgm.exports;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {string} exportName the export
+	 * @returns {ExportInfo} info about the export
+	 */
+	getExportInfo(module, exportName) {
+		const mgm = this._getModuleGraphModule(module);
+		return mgm.exports.getExportInfo(exportName);
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {string} exportName the export
+	 * @returns {ExportInfo} info about the export (do not modify)
+	 */
+	getReadOnlyExportInfo(module, exportName) {
+		const mgm = this._getModuleGraphModule(module);
+		return mgm.exports.getReadOnlyExportInfo(exportName);
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {false | true | SortableSet | null} the used exports
+	 * false: module is not used at all.
+	 * true: the module namespace/object export is used.
+	 * SortableSet: these export names are used.
+	 * empty SortableSet: module is used but no export.
+	 * null: unknown, worst case should be assumed.
+	 */
+	getUsedExports(module, runtime) {
+		const mgm = this._getModuleGraphModule(module);
+		return mgm.exports.getUsedExports(runtime);
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @returns {number | null} the index of the module
+	 */
+	getPreOrderIndex(module) {
+		const mgm = this._getModuleGraphModule(module);
+		return mgm.preOrderIndex;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @returns {number | null} the index of the module
+	 */
+	getPostOrderIndex(module) {
+		const mgm = this._getModuleGraphModule(module);
+		return mgm.postOrderIndex;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {number} index the index of the module
+	 * @returns {void}
+	 */
+	setPreOrderIndex(module, index) {
+		const mgm = this._getModuleGraphModule(module);
+		mgm.preOrderIndex = index;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {number} index the index of the module
+	 * @returns {boolean} true, if the index was set
+	 */
+	setPreOrderIndexIfUnset(module, index) {
+		const mgm = this._getModuleGraphModule(module);
+		if (mgm.preOrderIndex === null) {
+			mgm.preOrderIndex = index;
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {number} index the index of the module
+	 * @returns {void}
+	 */
+	setPostOrderIndex(module, index) {
+		const mgm = this._getModuleGraphModule(module);
+		mgm.postOrderIndex = index;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {number} index the index of the module
+	 * @returns {boolean} true, if the index was set
+	 */
+	setPostOrderIndexIfUnset(module, index) {
+		const mgm = this._getModuleGraphModule(module);
+		if (mgm.postOrderIndex === null) {
+			mgm.postOrderIndex = index;
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @returns {number | null} the depth of the module
+	 */
+	getDepth(module) {
+		const mgm = this._getModuleGraphModule(module);
+		return mgm.depth;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {number} depth the depth of the module
+	 * @returns {void}
+	 */
+	setDepth(module, depth) {
+		const mgm = this._getModuleGraphModule(module);
+		mgm.depth = depth;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {number} depth the depth of the module
+	 * @returns {boolean} true, if the depth was set
+	 */
+	setDepthIfLower(module, depth) {
+		const mgm = this._getModuleGraphModule(module);
+		if (mgm.depth === null || mgm.depth > depth) {
+			mgm.depth = depth;
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @returns {boolean} true, if the module is async
+	 */
+	isAsync(module) {
+		const mgm = this._getModuleGraphModule(module);
+		return mgm.async;
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @returns {void}
+	 */
+	setAsync(module) {
+		const mgm = this._getModuleGraphModule(module);
+		mgm.async = true;
+	}
+
+	/**
+	 * @param {MetaKey} thing any thing
+	 * @returns {Meta} metadata
+	 */
+	getMeta(thing) {
+		let meta = this._metaMap.get(thing);
+		if (meta === undefined) {
+			meta = Object.create(null);
+			this._metaMap.set(thing, meta);
+		}
+		return meta;
+	}
+
+	/**
+	 * @param {MetaKey} thing any thing
+	 * @returns {Meta | undefined} metadata
+	 */
+	getMetaIfExisting(thing) {
+		return this._metaMap.get(thing);
+	}
+
+	/**
+	 * @param {string=} cacheStage a persistent stage name for caching
+	 */
+	freeze(cacheStage) {
+		this._cache = new WeakTupleMap();
+		this._cacheStage = cacheStage;
+	}
+
+	unfreeze() {
+		this._cache = undefined;
+		this._cacheStage = undefined;
+	}
+
+	/**
+	 * @template T
+	 * @template R
+	 * @param {(moduleGraph: ModuleGraph, ...args: T[]) => R} fn computer
+	 * @param {...T} args arguments
+	 * @returns {R} computed value or cached
+	 */
+	cached(fn, ...args) {
+		if (this._cache === undefined) return fn(this, ...args);
+		return this._cache.provide(fn, ...args, () => fn(this, ...args));
+	}
+
+	/**
+	 * @param {ModuleMemCaches} moduleMemCaches mem caches for modules for better caching
+	 */
+	setModuleMemCaches(moduleMemCaches) {
+		this._moduleMemCaches = moduleMemCaches;
+	}
+
+	/**
+	 * @template {Dependency} D
+	 * @template {EXPECTED_ANY[]} ARGS
+	 * @template R
+	 * @param {D} dependency dependency
+	 * @param {[...ARGS, (moduleGraph: ModuleGraph, dependency: D, ...args: ARGS) => R]} args arguments, last argument is a function called with moduleGraph, dependency, ...args
+	 * @returns {R} computed value or cached
+	 */
+	dependencyCacheProvide(dependency, ...args) {
+		const fn =
+			/** @type {(moduleGraph: ModuleGraph, dependency: D, ...args: EXPECTED_ANY[]) => R} */
+			(args.pop());
+		if (this._moduleMemCaches && this._cacheStage) {
+			const memCache = this._moduleMemCaches.get(
+				/** @type {Module} */
+				(this.getParentModule(dependency))
+			);
+			if (memCache !== undefined) {
+				return memCache.provide(dependency, this._cacheStage, ...args, () =>
+					fn(this, dependency, ...args)
+				);
+			}
+		}
+		if (this._cache === undefined) return fn(this, dependency, ...args);
+		return this._cache.provide(dependency, ...args, () =>
+			fn(this, dependency, ...args)
+		);
+	}
+
+	// TODO remove in webpack 6
+	/**
+	 * @param {Module} module the module
+	 * @param {string} deprecateMessage message for the deprecation message
+	 * @param {string} deprecationCode code for the deprecation
+	 * @returns {ModuleGraph} the module graph
+	 */
+	static getModuleGraphForModule(module, deprecateMessage, deprecationCode) {
+		const fn = deprecateMap.get(deprecateMessage);
+		if (fn) return fn(module);
+		const newFn = util.deprecate(
+			/**
+			 * @param {Module} module the module
+			 * @returns {ModuleGraph} the module graph
+			 */
+			module => {
+				const moduleGraph = moduleGraphForModuleMap.get(module);
+				if (!moduleGraph)
+					throw new Error(
+						`${
+							deprecateMessage
+						}There was no ModuleGraph assigned to the Module for backward-compat (Use the new API)`
+					);
+				return moduleGraph;
+			},
+			`${deprecateMessage}: Use new ModuleGraph API`,
+			deprecationCode
+		);
+		deprecateMap.set(deprecateMessage, newFn);
+		return newFn(module);
+	}
+
+	// TODO remove in webpack 6
+	/**
+	 * @param {Module} module the module
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @returns {void}
+	 */
+	static setModuleGraphForModule(module, moduleGraph) {
+		moduleGraphForModuleMap.set(module, moduleGraph);
+	}
+
+	// TODO remove in webpack 6
+	/**
+	 * @param {Module} module the module
+	 * @returns {void}
+	 */
+	static clearModuleGraphForModule(module) {
+		moduleGraphForModuleMap.delete(module);
+	}
+}
+
+// TODO remove in webpack 6
+/** @type {WeakMap} */
+const moduleGraphForModuleMap = new WeakMap();
+
+// TODO remove in webpack 6
+/** @type {Map ModuleGraph>} */
+const deprecateMap = new Map();
+
+module.exports = ModuleGraph;
+module.exports.ModuleGraphConnection = ModuleGraphConnection;
diff --git a/lib/ModuleGraphConnection.js b/lib/ModuleGraphConnection.js
new file mode 100644
index 00000000000..5b06d758781
--- /dev/null
+++ b/lib/ModuleGraphConnection.js
@@ -0,0 +1,199 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+/** @typedef {import("./Dependency")} Dependency */
+/** @typedef {import("./Dependency").GetConditionFn} GetConditionFn */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./util/runtime").RuntimeSpec} RuntimeSpec */
+
+/**
+ * Module itself is not connected, but transitive modules are connected transitively.
+ */
+const TRANSITIVE_ONLY = Symbol("transitive only");
+
+/**
+ * While determining the active state, this flag is used to signal a circular connection.
+ */
+const CIRCULAR_CONNECTION = Symbol("circular connection");
+
+/** @typedef {boolean | typeof TRANSITIVE_ONLY | typeof CIRCULAR_CONNECTION} ConnectionState */
+
+/**
+ * @param {ConnectionState} a first
+ * @param {ConnectionState} b second
+ * @returns {ConnectionState} merged
+ */
+const addConnectionStates = (a, b) => {
+	if (a === true || b === true) return true;
+	if (a === false) return b;
+	if (b === false) return a;
+	if (a === TRANSITIVE_ONLY) return b;
+	if (b === TRANSITIVE_ONLY) return a;
+	return a;
+};
+
+/**
+ * @param {ConnectionState} a first
+ * @param {ConnectionState} b second
+ * @returns {ConnectionState} intersected
+ */
+const intersectConnectionStates = (a, b) => {
+	if (a === false || b === false) return false;
+	if (a === true) return b;
+	if (b === true) return a;
+	if (a === CIRCULAR_CONNECTION) return b;
+	if (b === CIRCULAR_CONNECTION) return a;
+	return a;
+};
+
+class ModuleGraphConnection {
+	/**
+	 * @param {Module|null} originModule the referencing module
+	 * @param {Dependency|null} dependency the referencing dependency
+	 * @param {Module} module the referenced module
+	 * @param {string=} explanation some extra detail
+	 * @param {boolean=} weak the reference is weak
+	 * @param {false | null | GetConditionFn | undefined} condition condition for the connection
+	 */
+	constructor(
+		originModule,
+		dependency,
+		module,
+		explanation,
+		weak = false,
+		condition = undefined
+	) {
+		this.originModule = originModule;
+		this.resolvedOriginModule = originModule;
+		this.dependency = dependency;
+		this.resolvedModule = module;
+		this.module = module;
+		this.weak = weak;
+		this.conditional = Boolean(condition);
+		this._active = condition !== false;
+		this.condition = condition || undefined;
+		/** @type {Set | undefined} */
+		this.explanations = undefined;
+		if (explanation) {
+			this.explanations = new Set();
+			this.explanations.add(explanation);
+		}
+	}
+
+	clone() {
+		const clone = new ModuleGraphConnection(
+			this.resolvedOriginModule,
+			this.dependency,
+			this.resolvedModule,
+			undefined,
+			this.weak,
+			this.condition
+		);
+		clone.originModule = this.originModule;
+		clone.module = this.module;
+		clone.conditional = this.conditional;
+		clone._active = this._active;
+		if (this.explanations) clone.explanations = new Set(this.explanations);
+		return clone;
+	}
+
+	/**
+	 * @param {GetConditionFn} condition condition for the connection
+	 * @returns {void}
+	 */
+	addCondition(condition) {
+		if (this.conditional) {
+			const old =
+				/** @type {GetConditionFn} */
+				(this.condition);
+			/** @type {GetConditionFn} */
+			(this.condition) = (c, r) =>
+				intersectConnectionStates(old(c, r), condition(c, r));
+		} else if (this._active) {
+			this.conditional = true;
+			this.condition = condition;
+		}
+	}
+
+	/**
+	 * @param {string} explanation the explanation to add
+	 * @returns {void}
+	 */
+	addExplanation(explanation) {
+		if (this.explanations === undefined) {
+			this.explanations = new Set();
+		}
+		this.explanations.add(explanation);
+	}
+
+	get explanation() {
+		if (this.explanations === undefined) return "";
+		return Array.from(this.explanations).join(" ");
+	}
+
+	/**
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {boolean} true, if the connection is active
+	 */
+	isActive(runtime) {
+		if (!this.conditional) return this._active;
+
+		return (
+			/** @type {GetConditionFn} */ (this.condition)(this, runtime) !== false
+		);
+	}
+
+	/**
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {boolean} true, if the connection is active
+	 */
+	isTargetActive(runtime) {
+		if (!this.conditional) return this._active;
+		return (
+			/** @type {GetConditionFn} */ (this.condition)(this, runtime) === true
+		);
+	}
+
+	/**
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {ConnectionState} true: fully active, false: inactive, TRANSITIVE: direct module inactive, but transitive connection maybe active
+	 */
+	getActiveState(runtime) {
+		if (!this.conditional) return this._active;
+		return /** @type {GetConditionFn} */ (this.condition)(this, runtime);
+	}
+
+	/**
+	 * @param {boolean} value active or not
+	 * @returns {void}
+	 */
+	setActive(value) {
+		this.conditional = false;
+		this._active = value;
+	}
+
+	// TODO webpack 5 remove
+	get active() {
+		throw new Error("Use getActiveState instead");
+	}
+
+	set active(value) {
+		throw new Error("Use setActive instead");
+	}
+}
+
+/** @typedef {typeof TRANSITIVE_ONLY} TRANSITIVE_ONLY */
+/** @typedef {typeof CIRCULAR_CONNECTION} CIRCULAR_CONNECTION */
+
+module.exports = ModuleGraphConnection;
+module.exports.addConnectionStates = addConnectionStates;
+module.exports.TRANSITIVE_ONLY = /** @type {typeof TRANSITIVE_ONLY} */ (
+	TRANSITIVE_ONLY
+);
+module.exports.CIRCULAR_CONNECTION = /** @type {typeof CIRCULAR_CONNECTION} */ (
+	CIRCULAR_CONNECTION
+);
diff --git a/lib/ModuleHashingError.js b/lib/ModuleHashingError.js
new file mode 100644
index 00000000000..77c8f415aff
--- /dev/null
+++ b/lib/ModuleHashingError.js
@@ -0,0 +1,29 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const WebpackError = require("./WebpackError");
+
+/** @typedef {import("./Module")} Module */
+
+class ModuleHashingError extends WebpackError {
+	/**
+	 * Create a new ModuleHashingError
+	 * @param {Module} module related module
+	 * @param {Error} error Original error
+	 */
+	constructor(module, error) {
+		super();
+
+		this.name = "ModuleHashingError";
+		this.error = error;
+		this.message = error.message;
+		this.details = error.stack;
+		this.module = module;
+	}
+}
+
+module.exports = ModuleHashingError;
diff --git a/lib/ModuleInfoHeaderPlugin.js b/lib/ModuleInfoHeaderPlugin.js
new file mode 100644
index 00000000000..5cfac69a88f
--- /dev/null
+++ b/lib/ModuleInfoHeaderPlugin.js
@@ -0,0 +1,313 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { ConcatSource, RawSource, CachedSource } = require("webpack-sources");
+const { UsageState } = require("./ExportsInfo");
+const Template = require("./Template");
+const CssModulesPlugin = require("./css/CssModulesPlugin");
+const JavascriptModulesPlugin = require("./javascript/JavascriptModulesPlugin");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./ExportsInfo")} ExportsInfo */
+/** @typedef {import("./ExportsInfo").ExportInfo} ExportInfo */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./Module").BuildMeta} BuildMeta */
+/** @typedef {import("./ModuleGraph")} ModuleGraph */
+/** @typedef {import("./ModuleTemplate")} ModuleTemplate */
+/** @typedef {import("./RequestShortener")} RequestShortener */
+
+/**
+ * @template T
+ * @param {Iterable} iterable iterable
+ * @returns {string} joined with comma
+ */
+const joinIterableWithComma = iterable => {
+	// This is more performant than Array.from().join(", ")
+	// as it doesn't create an array
+	let str = "";
+	let first = true;
+	for (const item of iterable) {
+		if (first) {
+			first = false;
+		} else {
+			str += ", ";
+		}
+		str += item;
+	}
+	return str;
+};
+
+/**
+ * @param {ConcatSource} source output
+ * @param {string} indent spacing
+ * @param {ExportsInfo} exportsInfo data
+ * @param {ModuleGraph} moduleGraph moduleGraph
+ * @param {RequestShortener} requestShortener requestShortener
+ * @param {Set} alreadyPrinted deduplication set
+ * @returns {void}
+ */
+const printExportsInfoToSource = (
+	source,
+	indent,
+	exportsInfo,
+	moduleGraph,
+	requestShortener,
+	alreadyPrinted = new Set()
+) => {
+	const otherExportsInfo = exportsInfo.otherExportsInfo;
+
+	let alreadyPrintedExports = 0;
+
+	// determine exports to print
+	const printedExports = [];
+	for (const exportInfo of exportsInfo.orderedExports) {
+		if (!alreadyPrinted.has(exportInfo)) {
+			alreadyPrinted.add(exportInfo);
+			printedExports.push(exportInfo);
+		} else {
+			alreadyPrintedExports++;
+		}
+	}
+	let showOtherExports = false;
+	if (!alreadyPrinted.has(otherExportsInfo)) {
+		alreadyPrinted.add(otherExportsInfo);
+		showOtherExports = true;
+	} else {
+		alreadyPrintedExports++;
+	}
+
+	// print the exports
+	for (const exportInfo of printedExports) {
+		const target = exportInfo.getTarget(moduleGraph);
+		source.add(
+			`${Template.toComment(
+				`${indent}export ${JSON.stringify(exportInfo.name).slice(
+					1,
+					-1
+				)} [${exportInfo.getProvidedInfo()}] [${exportInfo.getUsedInfo()}] [${exportInfo.getRenameInfo()}]${
+					target
+						? ` -> ${target.module.readableIdentifier(requestShortener)}${
+								target.export
+									? ` .${target.export
+											.map(e => JSON.stringify(e).slice(1, -1))
+											.join(".")}`
+									: ""
+							}`
+						: ""
+				}`
+			)}\n`
+		);
+		if (exportInfo.exportsInfo) {
+			printExportsInfoToSource(
+				source,
+				`${indent}  `,
+				exportInfo.exportsInfo,
+				moduleGraph,
+				requestShortener,
+				alreadyPrinted
+			);
+		}
+	}
+
+	if (alreadyPrintedExports) {
+		source.add(
+			`${Template.toComment(
+				`${indent}... (${alreadyPrintedExports} already listed exports)`
+			)}\n`
+		);
+	}
+
+	if (showOtherExports) {
+		const target = otherExportsInfo.getTarget(moduleGraph);
+		if (
+			target ||
+			otherExportsInfo.provided !== false ||
+			otherExportsInfo.getUsed(undefined) !== UsageState.Unused
+		) {
+			const title =
+				printedExports.length > 0 || alreadyPrintedExports > 0
+					? "other exports"
+					: "exports";
+			source.add(
+				`${Template.toComment(
+					`${indent}${title} [${otherExportsInfo.getProvidedInfo()}] [${otherExportsInfo.getUsedInfo()}]${
+						target
+							? ` -> ${target.module.readableIdentifier(requestShortener)}`
+							: ""
+					}`
+				)}\n`
+			);
+		}
+	}
+};
+
+/** @type {WeakMap }>>} */
+const caches = new WeakMap();
+
+const PLUGIN_NAME = "ModuleInfoHeaderPlugin";
+
+class ModuleInfoHeaderPlugin {
+	/**
+	 * @param {boolean=} verbose add more information like exports, runtime requirements and bailouts
+	 */
+	constructor(verbose = true) {
+		this._verbose = verbose;
+	}
+
+	/**
+	 * @param {Compiler} compiler the compiler
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		const { _verbose: verbose } = this;
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			const javascriptHooks =
+				JavascriptModulesPlugin.getCompilationHooks(compilation);
+			javascriptHooks.renderModulePackage.tap(
+				PLUGIN_NAME,
+				(
+					moduleSource,
+					module,
+					{ chunk, chunkGraph, moduleGraph, runtimeTemplate }
+				) => {
+					const { requestShortener } = runtimeTemplate;
+					let cacheEntry;
+					let cache = caches.get(requestShortener);
+					if (cache === undefined) {
+						caches.set(requestShortener, (cache = new WeakMap()));
+						cache.set(
+							module,
+							(cacheEntry = { header: undefined, full: new WeakMap() })
+						);
+					} else {
+						cacheEntry = cache.get(module);
+						if (cacheEntry === undefined) {
+							cache.set(
+								module,
+								(cacheEntry = { header: undefined, full: new WeakMap() })
+							);
+						} else if (!verbose) {
+							const cachedSource = cacheEntry.full.get(moduleSource);
+							if (cachedSource !== undefined) return cachedSource;
+						}
+					}
+					const source = new ConcatSource();
+					let header = cacheEntry.header;
+					if (header === undefined) {
+						header = this.generateHeader(module, requestShortener);
+						cacheEntry.header = header;
+					}
+					source.add(header);
+					if (verbose) {
+						const exportsType = /** @type {BuildMeta} */ (module.buildMeta)
+							.exportsType;
+						source.add(
+							`${Template.toComment(
+								exportsType
+									? `${exportsType} exports`
+									: "unknown exports (runtime-defined)"
+							)}\n`
+						);
+						if (exportsType) {
+							const exportsInfo = moduleGraph.getExportsInfo(module);
+							printExportsInfoToSource(
+								source,
+								"",
+								exportsInfo,
+								moduleGraph,
+								requestShortener
+							);
+						}
+						source.add(
+							`${Template.toComment(
+								`runtime requirements: ${joinIterableWithComma(
+									chunkGraph.getModuleRuntimeRequirements(module, chunk.runtime)
+								)}`
+							)}\n`
+						);
+						const optimizationBailout =
+							moduleGraph.getOptimizationBailout(module);
+						if (optimizationBailout) {
+							for (const text of optimizationBailout) {
+								const code =
+									typeof text === "function" ? text(requestShortener) : text;
+								source.add(`${Template.toComment(`${code}`)}\n`);
+							}
+						}
+						source.add(moduleSource);
+						return source;
+					}
+					source.add(moduleSource);
+					const cachedSource = new CachedSource(source);
+					cacheEntry.full.set(moduleSource, cachedSource);
+					return cachedSource;
+				}
+			);
+			javascriptHooks.chunkHash.tap(PLUGIN_NAME, (_chunk, hash) => {
+				hash.update(PLUGIN_NAME);
+				hash.update("1");
+			});
+			const cssHooks = CssModulesPlugin.getCompilationHooks(compilation);
+			cssHooks.renderModulePackage.tap(
+				PLUGIN_NAME,
+				(moduleSource, module, { runtimeTemplate }) => {
+					const { requestShortener } = runtimeTemplate;
+					let cacheEntry;
+					let cache = caches.get(requestShortener);
+					if (cache === undefined) {
+						caches.set(requestShortener, (cache = new WeakMap()));
+						cache.set(
+							module,
+							(cacheEntry = { header: undefined, full: new WeakMap() })
+						);
+					} else {
+						cacheEntry = cache.get(module);
+						if (cacheEntry === undefined) {
+							cache.set(
+								module,
+								(cacheEntry = { header: undefined, full: new WeakMap() })
+							);
+						} else if (!verbose) {
+							const cachedSource = cacheEntry.full.get(moduleSource);
+							if (cachedSource !== undefined) return cachedSource;
+						}
+					}
+					const source = new ConcatSource();
+					let header = cacheEntry.header;
+					if (header === undefined) {
+						header = this.generateHeader(module, requestShortener);
+						cacheEntry.header = header;
+					}
+					source.add(header);
+					source.add(moduleSource);
+					const cachedSource = new CachedSource(source);
+					cacheEntry.full.set(moduleSource, cachedSource);
+					return cachedSource;
+				}
+			);
+			cssHooks.chunkHash.tap(PLUGIN_NAME, (_chunk, hash) => {
+				hash.update(PLUGIN_NAME);
+				hash.update("1");
+			});
+		});
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {RequestShortener} requestShortener request shortener
+	 * @returns {RawSource} the header
+	 */
+	generateHeader(module, requestShortener) {
+		const req = module.readableIdentifier(requestShortener);
+		const reqStr = req.replace(/\*\//g, "*_/");
+		const reqStrStar = "*".repeat(reqStr.length);
+		const headerStr = `/*!****${reqStrStar}****!*\\\n  !*** ${reqStr} ***!\n  \\****${reqStrStar}****/\n`;
+		return new RawSource(headerStr);
+	}
+}
+module.exports = ModuleInfoHeaderPlugin;
diff --git a/lib/ModuleNotFoundError.js b/lib/ModuleNotFoundError.js
index cdfc3147b16..6f86b76f17a 100644
--- a/lib/ModuleNotFoundError.js
+++ b/lib/ModuleNotFoundError.js
@@ -2,21 +2,87 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const WebpackError = require("./WebpackError");
 
+/** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("./Module")} Module */
+
+const previouslyPolyfilledBuiltinModules = {
+	assert: "assert/",
+	buffer: "buffer/",
+	console: "console-browserify",
+	constants: "constants-browserify",
+	crypto: "crypto-browserify",
+	domain: "domain-browser",
+	events: "events/",
+	http: "stream-http",
+	https: "https-browserify",
+	os: "os-browserify/browser",
+	path: "path-browserify",
+	punycode: "punycode/",
+	process: "process/browser",
+	querystring: "querystring-es3",
+	stream: "stream-browserify",
+	_stream_duplex: "readable-stream/duplex",
+	_stream_passthrough: "readable-stream/passthrough",
+	_stream_readable: "readable-stream/readable",
+	_stream_transform: "readable-stream/transform",
+	_stream_writable: "readable-stream/writable",
+	string_decoder: "string_decoder/",
+	sys: "util/",
+	timers: "timers-browserify",
+	tty: "tty-browserify",
+	url: "url/",
+	util: "util/",
+	vm: "vm-browserify",
+	zlib: "browserify-zlib"
+};
+
 class ModuleNotFoundError extends WebpackError {
-	constructor(module, err) {
-		super("Module not found: " + err);
+	/**
+	 * @param {Module | null} module module tied to dependency
+	 * @param {Error & { details?: string }} err error thrown
+	 * @param {DependencyLocation} loc location of dependency
+	 */
+	constructor(module, err, loc) {
+		let message = `Module not found: ${err.toString()}`;
+
+		// TODO remove in webpack 6
+		const match = err.message.match(/Can't resolve '([^']+)'/);
+		if (match) {
+			const request = match[1];
+			const alias =
+				previouslyPolyfilledBuiltinModules[
+					/** @type {keyof previouslyPolyfilledBuiltinModules} */ (request)
+				];
+			if (alias) {
+				const pathIndex = alias.indexOf("/");
+				const dependency = pathIndex > 0 ? alias.slice(0, pathIndex) : alias;
+				message +=
+					"\n\n" +
+					"BREAKING CHANGE: " +
+					"webpack < 5 used to include polyfills for node.js core modules by default.\n" +
+					"This is no longer the case. Verify if you need this module and configure a polyfill for it.\n\n";
+				message +=
+					"If you want to include a polyfill, you need to:\n" +
+					`\t- add a fallback 'resolve.fallback: { "${request}": require.resolve("${alias}") }'\n` +
+					`\t- install '${dependency}'\n`;
+				message +=
+					"If you don't want to include a polyfill, you can use an empty module like this:\n" +
+					`\tresolve.fallback: { "${request}": false }`;
+			}
+		}
+
+		super(message);
 
 		this.name = "ModuleNotFoundError";
 		this.details = err.details;
-		this.missing = err.missing;
 		this.module = module;
 		this.error = err;
-
-		Error.captureStackTrace(this, this.constructor);
+		this.loc = loc;
 	}
 }
 
diff --git a/lib/ModuleParseError.js b/lib/ModuleParseError.js
index 32c7a69c116..f4e39c08cd3 100644
--- a/lib/ModuleParseError.js
+++ b/lib/ModuleParseError.js
@@ -2,56 +2,117 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const WebpackError = require("./WebpackError");
+const makeSerializable = require("./util/makeSerializable");
+
+/** @typedef {import("./Dependency").SourcePosition} SourcePosition */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
 
-/** @typedef {import("./Module")} Module */
+const WASM_HEADER = Buffer.from([0x00, 0x61, 0x73, 0x6d]);
 
 class ModuleParseError extends WebpackError {
 	/**
-	 * @param {Module} module the errored module
-	 * @param {string} source source code
-	 * @param {Error&any} err the parse error
+	 * @param {string | Buffer} source source code
+	 * @param {Error & { loc?: SourcePosition }} err the parse error
+	 * @param {string[]} loaders the loaders used
+	 * @param {string} type module type
 	 */
-	constructor(module, source, err) {
-		let message = "Module parse failed: " + err.message;
-		let loc = undefined;
-		message += "\nYou may need an appropriate loader to handle this file type.";
+	constructor(source, err, loaders, type) {
+		let message = `Module parse failed: ${err && err.message}`;
+		let loc;
+
+		if (
+			((Buffer.isBuffer(source) && source.slice(0, 4).equals(WASM_HEADER)) ||
+				(typeof source === "string" && /^\0asm/.test(source))) &&
+			!type.startsWith("webassembly")
+		) {
+			message +=
+				"\nThe module seem to be a WebAssembly module, but module is not flagged as WebAssembly module for webpack.";
+			message +=
+				"\nBREAKING CHANGE: Since webpack 5 WebAssembly is not enabled by default and flagged as experimental feature.";
+			message +=
+				"\nYou need to enable one of the WebAssembly experiments via 'experiments.asyncWebAssembly: true' (based on async modules) or 'experiments.syncWebAssembly: true' (like webpack 4, deprecated).";
+			message +=
+				"\nFor files that transpile to WebAssembly, make sure to set the module type in the 'module.rules' section of the config (e. g. 'type: \"webassembly/async\"').";
+		} else if (!loaders) {
+			message +=
+				"\nYou may need an appropriate loader to handle this file type.";
+		} else if (loaders.length >= 1) {
+			message += `\nFile was processed with these loaders:${loaders
+				.map(loader => `\n * ${loader}`)
+				.join("")}`;
+			message +=
+				"\nYou may need an additional loader to handle the result of these loaders.";
+		} else {
+			message +=
+				"\nYou may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders";
+		}
+
 		if (
+			err &&
 			err.loc &&
 			typeof err.loc === "object" &&
 			typeof err.loc.line === "number"
 		) {
-			var lineNumber = err.loc.line;
-			if (/[\0\u0001\u0002\u0003\u0004\u0005\u0006\u0007]/.test(source)) {
+			const lineNumber = err.loc.line;
+
+			if (
+				Buffer.isBuffer(source) ||
+				/[\0\u0001\u0002\u0003\u0004\u0005\u0006\u0007]/.test(source)
+			) {
 				// binary file
 				message += "\n(Source code omitted for this binary file)";
 			} else {
-				const sourceLines = source.split("\n");
+				const sourceLines = source.split(/\r?\n/);
 				const start = Math.max(0, lineNumber - 3);
 				const linesBefore = sourceLines.slice(start, lineNumber - 1);
 				const theLine = sourceLines[lineNumber - 1];
 				const linesAfter = sourceLines.slice(lineNumber, lineNumber + 2);
-				message +=
-					linesBefore.map(l => `\n| ${l}`).join("") +
-					`\n> ${theLine}` +
-					linesAfter.map(l => `\n| ${l}`).join("");
+
+				message += `${linesBefore
+					.map(l => `\n| ${l}`)
+					.join("")}\n> ${theLine}${linesAfter.map(l => `\n| ${l}`).join("")}`;
 			}
-			loc = err.loc;
-		} else {
-			message += "\n" + err.stack;
+
+			loc = { start: err.loc };
+		} else if (err && err.stack) {
+			message += `\n${err.stack}`;
 		}
 
 		super(message);
 
 		this.name = "ModuleParseError";
-		this.module = module;
 		this.loc = loc;
 		this.error = err;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+
+		write(this.error);
+
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+
+		this.error = read();
 
-		Error.captureStackTrace(this, this.constructor);
+		super.deserialize(context);
 	}
 }
 
+makeSerializable(ModuleParseError, "webpack/lib/ModuleParseError");
+
 module.exports = ModuleParseError;
diff --git a/lib/ModuleProfile.js b/lib/ModuleProfile.js
new file mode 100644
index 00000000000..360991ab005
--- /dev/null
+++ b/lib/ModuleProfile.js
@@ -0,0 +1,108 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+class ModuleProfile {
+	constructor() {
+		this.startTime = Date.now();
+
+		this.factoryStartTime = 0;
+		this.factoryEndTime = 0;
+		this.factory = 0;
+		this.factoryParallelismFactor = 0;
+
+		this.restoringStartTime = 0;
+		this.restoringEndTime = 0;
+		this.restoring = 0;
+		this.restoringParallelismFactor = 0;
+
+		this.integrationStartTime = 0;
+		this.integrationEndTime = 0;
+		this.integration = 0;
+		this.integrationParallelismFactor = 0;
+
+		this.buildingStartTime = 0;
+		this.buildingEndTime = 0;
+		this.building = 0;
+		this.buildingParallelismFactor = 0;
+
+		this.storingStartTime = 0;
+		this.storingEndTime = 0;
+		this.storing = 0;
+		this.storingParallelismFactor = 0;
+
+		/** @type {{ start: number, end: number }[] | undefined } */
+		this.additionalFactoryTimes = undefined;
+		this.additionalFactories = 0;
+		this.additionalFactoriesParallelismFactor = 0;
+
+		/** @deprecated */
+		this.additionalIntegration = 0;
+	}
+
+	markFactoryStart() {
+		this.factoryStartTime = Date.now();
+	}
+
+	markFactoryEnd() {
+		this.factoryEndTime = Date.now();
+		this.factory = this.factoryEndTime - this.factoryStartTime;
+	}
+
+	markRestoringStart() {
+		this.restoringStartTime = Date.now();
+	}
+
+	markRestoringEnd() {
+		this.restoringEndTime = Date.now();
+		this.restoring = this.restoringEndTime - this.restoringStartTime;
+	}
+
+	markIntegrationStart() {
+		this.integrationStartTime = Date.now();
+	}
+
+	markIntegrationEnd() {
+		this.integrationEndTime = Date.now();
+		this.integration = this.integrationEndTime - this.integrationStartTime;
+	}
+
+	markBuildingStart() {
+		this.buildingStartTime = Date.now();
+	}
+
+	markBuildingEnd() {
+		this.buildingEndTime = Date.now();
+		this.building = this.buildingEndTime - this.buildingStartTime;
+	}
+
+	markStoringStart() {
+		this.storingStartTime = Date.now();
+	}
+
+	markStoringEnd() {
+		this.storingEndTime = Date.now();
+		this.storing = this.storingEndTime - this.storingStartTime;
+	}
+
+	// This depends on timing so we ignore it for coverage
+	/* istanbul ignore next */
+	/**
+	 * Merge this profile into another one
+	 * @param {ModuleProfile} realProfile the profile to merge into
+	 * @returns {void}
+	 */
+	mergeInto(realProfile) {
+		realProfile.additionalFactories = this.factory;
+		(realProfile.additionalFactoryTimes =
+			realProfile.additionalFactoryTimes || []).push({
+			start: this.factoryStartTime,
+			end: this.factoryEndTime
+		});
+	}
+}
+
+module.exports = ModuleProfile;
diff --git a/lib/ModuleReason.js b/lib/ModuleReason.js
deleted file mode 100644
index 3697f849502..00000000000
--- a/lib/ModuleReason.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-/** @typedef {import("./Module")} Module */
-/** @typedef {import("./Dependency")} Dependency */
-
-class ModuleReason {
-	/**
-	 * @param {Module} module the referencing module
-	 * @param {Dependency} dependency the referencing dependency
-	 * @param {string=} explanation some extra detail
-	 */
-	constructor(module, dependency, explanation) {
-		this.module = module;
-		this.dependency = dependency;
-		this.explanation = explanation;
-		this._chunks = null;
-	}
-
-	hasChunk(chunk) {
-		if (this._chunks) {
-			if (this._chunks.has(chunk)) return true;
-		} else if (this.module && this.module._chunks.has(chunk)) return true;
-		return false;
-	}
-
-	rewriteChunks(oldChunk, newChunks) {
-		if (!this._chunks) {
-			if (this.module) {
-				if (!this.module._chunks.has(oldChunk)) return;
-				this._chunks = new Set(this.module._chunks);
-			} else {
-				this._chunks = new Set();
-			}
-		}
-		if (this._chunks.has(oldChunk)) {
-			this._chunks.delete(oldChunk);
-			for (let i = 0; i < newChunks.length; i++) {
-				this._chunks.add(newChunks[i]);
-			}
-		}
-	}
-}
-
-module.exports = ModuleReason;
diff --git a/lib/ModuleRestoreError.js b/lib/ModuleRestoreError.js
new file mode 100644
index 00000000000..2570862d421
--- /dev/null
+++ b/lib/ModuleRestoreError.js
@@ -0,0 +1,44 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const WebpackError = require("./WebpackError");
+
+/** @typedef {import("./Module")} Module */
+
+class ModuleRestoreError extends WebpackError {
+	/**
+	 * @param {Module} module module tied to dependency
+	 * @param {string | Error} err error thrown
+	 */
+	constructor(module, err) {
+		let message = "Module restore failed: ";
+		/** @type {string | undefined} */
+		const details = undefined;
+		if (err !== null && typeof err === "object") {
+			if (typeof err.stack === "string" && err.stack) {
+				const stack = err.stack;
+				message += stack;
+			} else if (typeof err.message === "string" && err.message) {
+				message += err.message;
+			} else {
+				message += err;
+			}
+		} else {
+			message += String(err);
+		}
+
+		super(message);
+
+		this.name = "ModuleRestoreError";
+		/** @type {string | undefined} */
+		this.details = details;
+		this.module = module;
+		this.error = err;
+	}
+}
+
+module.exports = ModuleRestoreError;
diff --git a/lib/ModuleSourceTypesConstants.js b/lib/ModuleSourceTypesConstants.js
new file mode 100644
index 00000000000..f78d70a57b6
--- /dev/null
+++ b/lib/ModuleSourceTypesConstants.js
@@ -0,0 +1,123 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Alexander Akait @alexander-akait
+*/
+
+"use strict";
+
+/**
+ * @type {ReadonlySet}
+ */
+const NO_TYPES = new Set();
+
+/**
+ * @type {ReadonlySet<"asset">}
+ */
+const ASSET_TYPES = new Set(["asset"]);
+
+/**
+ * @type {ReadonlySet<"asset" | "javascript" | "asset">}
+ */
+const ASSET_AND_JS_TYPES = new Set(["asset", "javascript"]);
+
+/**
+ * @type {ReadonlySet<"css-url" | "asset">}
+ */
+const ASSET_AND_CSS_URL_TYPES = new Set(["asset", "css-url"]);
+
+/**
+ * @type {ReadonlySet<"javascript" | "css-url" | "asset">}
+ */
+const ASSET_AND_JS_AND_CSS_URL_TYPES = new Set([
+	"asset",
+	"javascript",
+	"css-url"
+]);
+
+/**
+ * @type {"javascript"}
+ */
+const JS_TYPE = "javascript";
+
+/**
+ * @type {ReadonlySet<"javascript">}
+ */
+const JS_TYPES = new Set(["javascript"]);
+
+/**
+ * @type {ReadonlySet<"javascript" | "css-export">}
+ */
+const JS_AND_CSS_EXPORT_TYPES = new Set(["javascript", "css-export"]);
+
+/**
+ * @type {ReadonlySet<"javascript" | "css-url">}
+ */
+const JS_AND_CSS_URL_TYPES = new Set(["javascript", "css-url"]);
+
+/**
+ * @type {ReadonlySet<"javascript" | "css">}
+ */
+const JS_AND_CSS_TYPES = new Set(["javascript", "css"]);
+
+/**
+ * @type {"css"}
+ */
+const CSS_TYPE = "css";
+/**
+ * @type {ReadonlySet<"css">}
+ */
+const CSS_TYPES = new Set(["css"]);
+
+/**
+ * @type {ReadonlySet<"css-url">}
+ */
+const CSS_URL_TYPES = new Set(["css-url"]);
+/**
+ * @type {ReadonlySet<"css-import">}
+ */
+const CSS_IMPORT_TYPES = new Set(["css-import"]);
+
+/**
+ * @type {ReadonlySet<"webassembly">}
+ */
+const WEBASSEMBLY_TYPES = new Set(["webassembly"]);
+
+/**
+ * @type {ReadonlySet<"runtime">}
+ */
+const RUNTIME_TYPES = new Set(["runtime"]);
+
+/**
+ * @type {ReadonlySet<"remote" | "share-init">}
+ */
+const REMOTE_AND_SHARE_INIT_TYPES = new Set(["remote", "share-init"]);
+
+/**
+ * @type {ReadonlySet<"consume-shared">}
+ */
+const CONSUME_SHARED_TYPES = new Set(["consume-shared"]);
+
+/**
+ * @type {ReadonlySet<"share-init">}
+ */
+const SHARED_INIT_TYPES = new Set(["share-init"]);
+
+module.exports.NO_TYPES = NO_TYPES;
+module.exports.JS_TYPE = JS_TYPE;
+module.exports.JS_TYPES = JS_TYPES;
+module.exports.JS_AND_CSS_TYPES = JS_AND_CSS_TYPES;
+module.exports.JS_AND_CSS_URL_TYPES = JS_AND_CSS_URL_TYPES;
+module.exports.JS_AND_CSS_EXPORT_TYPES = JS_AND_CSS_EXPORT_TYPES;
+module.exports.ASSET_TYPES = ASSET_TYPES;
+module.exports.ASSET_AND_JS_TYPES = ASSET_AND_JS_TYPES;
+module.exports.ASSET_AND_CSS_URL_TYPES = ASSET_AND_CSS_URL_TYPES;
+module.exports.ASSET_AND_JS_AND_CSS_URL_TYPES = ASSET_AND_JS_AND_CSS_URL_TYPES;
+module.exports.CSS_TYPE = CSS_TYPE;
+module.exports.CSS_TYPES = CSS_TYPES;
+module.exports.CSS_URL_TYPES = CSS_URL_TYPES;
+module.exports.CSS_IMPORT_TYPES = CSS_IMPORT_TYPES;
+module.exports.WEBASSEMBLY_TYPES = WEBASSEMBLY_TYPES;
+module.exports.RUNTIME_TYPES = RUNTIME_TYPES;
+module.exports.REMOTE_AND_SHARE_INIT_TYPES = REMOTE_AND_SHARE_INIT_TYPES;
+module.exports.CONSUME_SHARED_TYPES = CONSUME_SHARED_TYPES;
+module.exports.SHARED_INIT_TYPES = SHARED_INIT_TYPES;
diff --git a/lib/ModuleStoreError.js b/lib/ModuleStoreError.js
new file mode 100644
index 00000000000..26ca0c8b5d7
--- /dev/null
+++ b/lib/ModuleStoreError.js
@@ -0,0 +1,43 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const WebpackError = require("./WebpackError");
+
+/** @typedef {import("./Module")} Module */
+
+class ModuleStoreError extends WebpackError {
+	/**
+	 * @param {Module} module module tied to dependency
+	 * @param {string | Error} err error thrown
+	 */
+	constructor(module, err) {
+		let message = "Module storing failed: ";
+		/** @type {string | undefined} */
+		const details = undefined;
+		if (err !== null && typeof err === "object") {
+			if (typeof err.stack === "string" && err.stack) {
+				const stack = err.stack;
+				message += stack;
+			} else if (typeof err.message === "string" && err.message) {
+				message += err.message;
+			} else {
+				message += err;
+			}
+		} else {
+			message += String(err);
+		}
+
+		super(message);
+
+		this.name = "ModuleStoreError";
+		this.details = /** @type {string | undefined} */ (details);
+		this.module = module;
+		this.error = err;
+	}
+}
+
+module.exports = ModuleStoreError;
diff --git a/lib/ModuleTemplate.js b/lib/ModuleTemplate.js
index 06e787ed930..38f2bd78670 100644
--- a/lib/ModuleTemplate.js
+++ b/lib/ModuleTemplate.js
@@ -2,92 +2,173 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const { Tapable, SyncWaterfallHook, SyncHook } = require("tapable");
+const util = require("util");
+const memoize = require("./util/memoize");
 
+/** @typedef {import("tapable").Tap} Tap */
 /** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("./Chunk")} Chunk */
+/** @typedef {import("./ChunkGraph")} ChunkGraph */
+/** @typedef {import("./Compilation")} Compilation */
+/** @typedef {import("./DependencyTemplates")} DependencyTemplates */
 /** @typedef {import("./Module")} Module */
+/** @typedef {import("./ModuleGraph")} ModuleGraph */
+/** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */
+/** @typedef {import("./javascript/JavascriptModulesPlugin").ChunkRenderContext} ChunkRenderContext */
+/** @typedef {import("./util/Hash")} Hash */
 
-module.exports = class ModuleTemplate extends Tapable {
-	constructor(runtimeTemplate, type) {
-		super();
-		this.runtimeTemplate = runtimeTemplate;
-		this.type = type;
-		this.hooks = {
-			content: new SyncWaterfallHook([
-				"source",
-				"module",
-				"options",
-				"dependencyTemplates"
-			]),
-			module: new SyncWaterfallHook([
-				"source",
-				"module",
-				"options",
-				"dependencyTemplates"
-			]),
-			render: new SyncWaterfallHook([
-				"source",
-				"module",
-				"options",
-				"dependencyTemplates"
-			]),
-			package: new SyncWaterfallHook([
-				"source",
-				"module",
-				"options",
-				"dependencyTemplates"
-			]),
-			hash: new SyncHook(["hash"])
-		};
-	}
+/**
+ * @template T
+ * @typedef {import("tapable").IfSet} IfSet
+ */
+
+const getJavascriptModulesPlugin = memoize(() =>
+	require("./javascript/JavascriptModulesPlugin")
+);
 
+// TODO webpack 6: remove this class
+class ModuleTemplate {
 	/**
-	 * @param {Module} module the module
-	 * @param {TODO} dependencyTemplates templates for dependencies
-	 * @param {TODO} options render options
-	 * @returns {Source} the source
+	 * @param {RuntimeTemplate} runtimeTemplate the runtime template
+	 * @param {Compilation} compilation the compilation
 	 */
-	render(module, dependencyTemplates, options) {
-		try {
-			const moduleSource = module.source(
-				dependencyTemplates,
-				this.runtimeTemplate,
-				this.type
-			);
-			const moduleSourcePostContent = this.hooks.content.call(
-				moduleSource,
-				module,
-				options,
-				dependencyTemplates
-			);
-			const moduleSourcePostModule = this.hooks.module.call(
-				moduleSourcePostContent,
-				module,
-				options,
-				dependencyTemplates
-			);
-			const moduleSourcePostRender = this.hooks.render.call(
-				moduleSourcePostModule,
-				module,
-				options,
-				dependencyTemplates
-			);
-			return this.hooks.package.call(
-				moduleSourcePostRender,
-				module,
-				options,
-				dependencyTemplates
-			);
-		} catch (e) {
-			e.message = `${module.identifier()}\n${e.message}`;
-			throw e;
-		}
+	constructor(runtimeTemplate, compilation) {
+		this._runtimeTemplate = runtimeTemplate;
+		this.type = "javascript";
+		this.hooks = Object.freeze({
+			content: {
+				tap: util.deprecate(
+					/**
+					 * @template AdditionalOptions
+					 * @param {string | Tap & IfSet} options options
+					 * @param {(source: Source, module: Module, chunkRenderContext: ChunkRenderContext, dependencyTemplates: DependencyTemplates) => Source} fn fn
+					 */
+					(options, fn) => {
+						getJavascriptModulesPlugin()
+							.getCompilationHooks(compilation)
+							.renderModuleContent.tap(
+								options,
+								(source, module, renderContext) =>
+									fn(
+										source,
+										module,
+										renderContext,
+										renderContext.dependencyTemplates
+									)
+							);
+					},
+					"ModuleTemplate.hooks.content is deprecated (use JavascriptModulesPlugin.getCompilationHooks().renderModuleContent instead)",
+					"DEP_MODULE_TEMPLATE_CONTENT"
+				)
+			},
+			module: {
+				tap: util.deprecate(
+					/**
+					 * @template AdditionalOptions
+					 * @param {string | Tap & IfSet} options options
+					 * @param {(source: Source, module: Module, chunkRenderContext: ChunkRenderContext, dependencyTemplates: DependencyTemplates) => Source} fn fn
+					 */
+					(options, fn) => {
+						getJavascriptModulesPlugin()
+							.getCompilationHooks(compilation)
+							.renderModuleContent.tap(
+								options,
+								(source, module, renderContext) =>
+									fn(
+										source,
+										module,
+										renderContext,
+										renderContext.dependencyTemplates
+									)
+							);
+					},
+					"ModuleTemplate.hooks.module is deprecated (use JavascriptModulesPlugin.getCompilationHooks().renderModuleContent instead)",
+					"DEP_MODULE_TEMPLATE_MODULE"
+				)
+			},
+			render: {
+				tap: util.deprecate(
+					/**
+					 * @template AdditionalOptions
+					 * @param {string | Tap & IfSet} options options
+					 * @param {(source: Source, module: Module, chunkRenderContext: ChunkRenderContext, dependencyTemplates: DependencyTemplates) => Source} fn fn
+					 */
+					(options, fn) => {
+						getJavascriptModulesPlugin()
+							.getCompilationHooks(compilation)
+							.renderModuleContainer.tap(
+								options,
+								(source, module, renderContext) =>
+									fn(
+										source,
+										module,
+										renderContext,
+										renderContext.dependencyTemplates
+									)
+							);
+					},
+					"ModuleTemplate.hooks.render is deprecated (use JavascriptModulesPlugin.getCompilationHooks().renderModuleContainer instead)",
+					"DEP_MODULE_TEMPLATE_RENDER"
+				)
+			},
+			package: {
+				tap: util.deprecate(
+					/**
+					 * @template AdditionalOptions
+					 * @param {string | Tap & IfSet} options options
+					 * @param {(source: Source, module: Module, chunkRenderContext: ChunkRenderContext, dependencyTemplates: DependencyTemplates) => Source} fn fn
+					 */
+					(options, fn) => {
+						getJavascriptModulesPlugin()
+							.getCompilationHooks(compilation)
+							.renderModulePackage.tap(
+								options,
+								(source, module, renderContext) =>
+									fn(
+										source,
+										module,
+										renderContext,
+										renderContext.dependencyTemplates
+									)
+							);
+					},
+					"ModuleTemplate.hooks.package is deprecated (use JavascriptModulesPlugin.getCompilationHooks().renderModulePackage instead)",
+					"DEP_MODULE_TEMPLATE_PACKAGE"
+				)
+			},
+			hash: {
+				tap: util.deprecate(
+					/**
+					 * @template AdditionalOptions
+					 * @param {string | Tap & IfSet} options options
+					 * @param {(hash: Hash) => void} fn fn
+					 */
+					(options, fn) => {
+						compilation.hooks.fullHash.tap(options, fn);
+					},
+					"ModuleTemplate.hooks.hash is deprecated (use Compilation.hooks.fullHash instead)",
+					"DEP_MODULE_TEMPLATE_HASH"
+				)
+			}
+		});
 	}
+}
 
-	updateHash(hash) {
-		hash.update("1");
-		this.hooks.hash.call(hash);
-	}
-};
+Object.defineProperty(ModuleTemplate.prototype, "runtimeTemplate", {
+	get: util.deprecate(
+		/**
+		 * @this {ModuleTemplate}
+		 * @returns {RuntimeTemplate} output options
+		 */
+		function () {
+			return this._runtimeTemplate;
+		},
+		"ModuleTemplate.runtimeTemplate is deprecated (use Compilation.runtimeTemplate instead)",
+		"DEP_WEBPACK_CHUNK_TEMPLATE_OUTPUT_OPTIONS"
+	)
+});
+
+module.exports = ModuleTemplate;
diff --git a/lib/ModuleTypeConstants.js b/lib/ModuleTypeConstants.js
new file mode 100644
index 00000000000..82d8bcfc1d5
--- /dev/null
+++ b/lib/ModuleTypeConstants.js
@@ -0,0 +1,183 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Sean Larkin @TheLarkInn
+*/
+
+"use strict";
+
+/**
+ * @type {Readonly<"javascript/auto">}
+ */
+const JAVASCRIPT_MODULE_TYPE_AUTO = "javascript/auto";
+
+/**
+ * @type {Readonly<"javascript/dynamic">}
+ */
+const JAVASCRIPT_MODULE_TYPE_DYNAMIC = "javascript/dynamic";
+
+/**
+ * @type {Readonly<"javascript/esm">}
+ * This is the module type used for _strict_ ES Module syntax. This means that all legacy formats
+ * that webpack supports (CommonJS, AMD, SystemJS) are not supported.
+ */
+const JAVASCRIPT_MODULE_TYPE_ESM = "javascript/esm";
+
+/**
+ * @type {Readonly<"json">}
+ * This is the module type used for JSON files. JSON files are always parsed as ES Module.
+ */
+const JSON_MODULE_TYPE = "json";
+
+/**
+ * @type {Readonly<"webassembly/async">}
+ * This is the module type used for WebAssembly modules. In webpack 5 they are always treated as async modules.
+ */
+const WEBASSEMBLY_MODULE_TYPE_ASYNC = "webassembly/async";
+
+/**
+ * @type {Readonly<"webassembly/sync">}
+ * This is the module type used for WebAssembly modules. In webpack 4 they are always treated as sync modules.
+ * There is a legacy option to support this usage in webpack 5 and up.
+ */
+const WEBASSEMBLY_MODULE_TYPE_SYNC = "webassembly/sync";
+
+/**
+ * @type {Readonly<"css">}
+ * This is the module type used for CSS files.
+ */
+const CSS_MODULE_TYPE = "css";
+
+/**
+ * @type {Readonly<"css/global">}
+ * This is the module type used for CSS modules files where you need to use `:local` in selector list to hash classes.
+ */
+const CSS_MODULE_TYPE_GLOBAL = "css/global";
+
+/**
+ * @type {Readonly<"css/module">}
+ * This is the module type used for CSS modules files, by default all classes are hashed.
+ */
+const CSS_MODULE_TYPE_MODULE = "css/module";
+
+/**
+ * @type {Readonly<"css/auto">}
+ * This is the module type used for CSS files, the module will be parsed as CSS modules if it's filename contains `.module.` or `.modules.`.
+ */
+const CSS_MODULE_TYPE_AUTO = "css/auto";
+
+/**
+ * @type {Readonly<"asset">}
+ * This is the module type used for automatically choosing between `asset/inline`, `asset/resource` based on asset size limit (8096).
+ */
+const ASSET_MODULE_TYPE = "asset";
+
+/**
+ * @type {Readonly<"asset/inline">}
+ * This is the module type used for assets that are inlined as a data URI. This is the equivalent of `url-loader`.
+ */
+const ASSET_MODULE_TYPE_INLINE = "asset/inline";
+
+/**
+ * @type {Readonly<"asset/resource">}
+ * This is the module type used for assets that are copied to the output directory. This is the equivalent of `file-loader`.
+ */
+const ASSET_MODULE_TYPE_RESOURCE = "asset/resource";
+
+/**
+ * @type {Readonly<"asset/source">}
+ * This is the module type used for assets that are imported as source code. This is the equivalent of `raw-loader`.
+ */
+const ASSET_MODULE_TYPE_SOURCE = "asset/source";
+
+/**
+ * @type {Readonly<"asset/raw-data-url">}
+ * TODO: Document what this asset type is for. See css-loader tests for its usage.
+ */
+const ASSET_MODULE_TYPE_RAW_DATA_URL = "asset/raw-data-url";
+
+/**
+ * @type {Readonly<"runtime">}
+ * This is the module type used for the webpack runtime abstractions.
+ */
+const WEBPACK_MODULE_TYPE_RUNTIME = "runtime";
+
+/**
+ * @type {Readonly<"fallback-module">}
+ * This is the module type used for the ModuleFederation feature's FallbackModule class.
+ * TODO: Document this better.
+ */
+const WEBPACK_MODULE_TYPE_FALLBACK = "fallback-module";
+
+/**
+ * @type {Readonly<"remote-module">}
+ * This is the module type used for the ModuleFederation feature's RemoteModule class.
+ * TODO: Document this better.
+ */
+const WEBPACK_MODULE_TYPE_REMOTE = "remote-module";
+
+/**
+ * @type {Readonly<"provide-module">}
+ * This is the module type used for the ModuleFederation feature's ProvideModule class.
+ * TODO: Document this better.
+ */
+const WEBPACK_MODULE_TYPE_PROVIDE = "provide-module";
+
+/**
+ * @type {Readonly<"consume-shared-module">}
+ * This is the module type used for the ModuleFederation feature's ConsumeSharedModule class.
+ */
+const WEBPACK_MODULE_TYPE_CONSUME_SHARED_MODULE = "consume-shared-module";
+
+/**
+ * @type {Readonly<"lazy-compilation-proxy">}
+ * Module type used for `experiments.lazyCompilation` feature. See `LazyCompilationPlugin` for more information.
+ */
+const WEBPACK_MODULE_TYPE_LAZY_COMPILATION_PROXY = "lazy-compilation-proxy";
+
+/** @typedef {"javascript/auto" | "javascript/dynamic" | "javascript/esm"} JavaScriptModuleTypes */
+/** @typedef {"json"} JSONModuleType */
+/** @typedef {"webassembly/async" | "webassembly/sync"} WebAssemblyModuleTypes */
+/** @typedef {"css" | "css/global" | "css/module"} CSSModuleTypes */
+/** @typedef {"asset" | "asset/inline" | "asset/resource" | "asset/source" | "asset/raw-data-url"} AssetModuleTypes */
+/** @typedef {"runtime" | "fallback-module" | "remote-module" | "provide-module" | "consume-shared-module" | "lazy-compilation-proxy"} WebpackModuleTypes */
+/** @typedef {string} UnknownModuleTypes */
+/** @typedef {JavaScriptModuleTypes | JSONModuleType | WebAssemblyModuleTypes | CSSModuleTypes | AssetModuleTypes | WebpackModuleTypes | UnknownModuleTypes} ModuleTypes */
+
+module.exports.ASSET_MODULE_TYPE = ASSET_MODULE_TYPE;
+module.exports.ASSET_MODULE_TYPE_RAW_DATA_URL = ASSET_MODULE_TYPE_RAW_DATA_URL;
+module.exports.ASSET_MODULE_TYPE_SOURCE = ASSET_MODULE_TYPE_SOURCE;
+module.exports.ASSET_MODULE_TYPE_RESOURCE = ASSET_MODULE_TYPE_RESOURCE;
+module.exports.ASSET_MODULE_TYPE_INLINE = ASSET_MODULE_TYPE_INLINE;
+module.exports.JAVASCRIPT_MODULE_TYPE_AUTO = JAVASCRIPT_MODULE_TYPE_AUTO;
+module.exports.JAVASCRIPT_MODULE_TYPE_DYNAMIC = JAVASCRIPT_MODULE_TYPE_DYNAMIC;
+module.exports.JAVASCRIPT_MODULE_TYPE_ESM = JAVASCRIPT_MODULE_TYPE_ESM;
+module.exports.JAVASCRIPT_MODULES = [
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_DYNAMIC,
+	JAVASCRIPT_MODULE_TYPE_ESM
+];
+module.exports.JSON_MODULE_TYPE = JSON_MODULE_TYPE;
+module.exports.WEBASSEMBLY_MODULE_TYPE_ASYNC = WEBASSEMBLY_MODULE_TYPE_ASYNC;
+module.exports.WEBASSEMBLY_MODULE_TYPE_SYNC = WEBASSEMBLY_MODULE_TYPE_SYNC;
+module.exports.WEBASSEMBLY_MODULES = [
+	WEBASSEMBLY_MODULE_TYPE_SYNC,
+	WEBASSEMBLY_MODULE_TYPE_SYNC
+];
+module.exports.CSS_MODULE_TYPE = CSS_MODULE_TYPE;
+module.exports.CSS_MODULE_TYPE_GLOBAL = CSS_MODULE_TYPE_GLOBAL;
+module.exports.CSS_MODULE_TYPE_MODULE = CSS_MODULE_TYPE_MODULE;
+module.exports.CSS_MODULE_TYPE_AUTO = CSS_MODULE_TYPE_AUTO;
+module.exports.CSS_MODULES = [
+	CSS_MODULE_TYPE,
+	CSS_MODULE_TYPE_GLOBAL,
+	CSS_MODULE_TYPE_MODULE,
+	CSS_MODULE_TYPE_AUTO
+];
+module.exports.WEBPACK_MODULE_TYPE_RUNTIME = WEBPACK_MODULE_TYPE_RUNTIME;
+module.exports.WEBPACK_MODULE_TYPE_FALLBACK = WEBPACK_MODULE_TYPE_FALLBACK;
+module.exports.WEBPACK_MODULE_TYPE_REMOTE = WEBPACK_MODULE_TYPE_REMOTE;
+module.exports.WEBPACK_MODULE_TYPE_PROVIDE = WEBPACK_MODULE_TYPE_PROVIDE;
+module.exports.WEBPACK_MODULE_TYPE_CONSUME_SHARED_MODULE =
+	WEBPACK_MODULE_TYPE_CONSUME_SHARED_MODULE;
+module.exports.WEBPACK_MODULE_TYPE_LAZY_COMPILATION_PROXY =
+	WEBPACK_MODULE_TYPE_LAZY_COMPILATION_PROXY;
diff --git a/lib/ModuleWarning.js b/lib/ModuleWarning.js
index 13068192c16..9b45a9afdd0 100644
--- a/lib/ModuleWarning.js
+++ b/lib/ModuleWarning.js
@@ -2,35 +2,65 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const WebpackError = require("./WebpackError");
 const { cleanUp } = require("./ErrorHelpers");
+const WebpackError = require("./WebpackError");
+const makeSerializable = require("./util/makeSerializable");
+
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
 
 class ModuleWarning extends WebpackError {
-	constructor(module, warning, { from = null } = {}) {
+	/**
+	 * @param {Error} warning error thrown
+	 * @param {{from?: string|null}} info additional info
+	 */
+	constructor(warning, { from = null } = {}) {
 		let message = "Module Warning";
-		if (from) {
-			message += ` (from ${from}):\n`;
-		} else {
-			message += ": ";
-		}
+
+		message += from ? ` (from ${from}):\n` : ": ";
+
 		if (warning && typeof warning === "object" && warning.message) {
 			message += warning.message;
 		} else if (warning) {
-			message += warning;
+			message += String(warning);
 		}
+
 		super(message);
+
 		this.name = "ModuleWarning";
-		this.module = module;
 		this.warning = warning;
 		this.details =
 			warning && typeof warning === "object" && warning.stack
 				? cleanUp(warning.stack, this.message)
 				: undefined;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+
+		write(this.warning);
+
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
 
-		Error.captureStackTrace(this, this.constructor);
+		this.warning = read();
+
+		super.deserialize(context);
 	}
 }
 
+makeSerializable(ModuleWarning, "webpack/lib/ModuleWarning");
+
 module.exports = ModuleWarning;
diff --git a/lib/MultiCompiler.js b/lib/MultiCompiler.js
index cdc7fb5089e..28e544ca618 100644
--- a/lib/MultiCompiler.js
+++ b/lib/MultiCompiler.js
@@ -2,57 +2,159 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const { Tapable, SyncHook, MultiHook } = require("tapable");
 const asyncLib = require("neo-async");
-const MultiWatching = require("./MultiWatching");
-const MultiStats = require("./MultiStats");
+const { SyncHook, MultiHook } = require("tapable");
+
 const ConcurrentCompilationError = require("./ConcurrentCompilationError");
+const MultiStats = require("./MultiStats");
+const MultiWatching = require("./MultiWatching");
+const WebpackError = require("./WebpackError");
+const ArrayQueue = require("./util/ArrayQueue");
 
-module.exports = class MultiCompiler extends Tapable {
-	constructor(compilers) {
-		super();
-		this.hooks = {
-			done: new SyncHook(["stats"]),
-			invalid: new MultiHook(compilers.map(c => c.hooks.invalid)),
-			run: new MultiHook(compilers.map(c => c.hooks.run)),
-			watchClose: new SyncHook([]),
-			watchRun: new MultiHook(compilers.map(c => c.hooks.watchRun))
-		};
+/** @template T @typedef {import("tapable").AsyncSeriesHook} AsyncSeriesHook */
+/** @template T @template R @typedef {import("tapable").SyncBailHook} SyncBailHook */
+/** @typedef {import("../declarations/WebpackOptions").WatchOptions} WatchOptions */
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./Stats")} Stats */
+/** @typedef {import("./Watching")} Watching */
+/** @typedef {import("./logging/Logger").Logger} Logger */
+/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
+/** @typedef {import("./util/fs").IntermediateFileSystem} IntermediateFileSystem */
+/** @typedef {import("./util/fs").OutputFileSystem} OutputFileSystem */
+/** @typedef {import("./util/fs").WatchFileSystem} WatchFileSystem */
+
+/**
+ * @template T
+ * @callback Callback
+ * @param {Error | null} err
+ * @param {T=} result
+ */
+
+/**
+ * @callback RunWithDependenciesHandler
+ * @param {Compiler} compiler
+ * @param {Callback} callback
+ */
+
+/**
+ * @typedef {object} MultiCompilerOptions
+ * @property {number=} parallelism how many Compilers are allows to run at the same time in parallel
+ */
+
+const CLASS_NAME = "MultiCompiler";
+
+module.exports = class MultiCompiler {
+	/**
+	 * @param {Compiler[] | Record} compilers child compilers
+	 * @param {MultiCompilerOptions} options options
+	 */
+	constructor(compilers, options) {
 		if (!Array.isArray(compilers)) {
+			/** @type {Compiler[]} */
 			compilers = Object.keys(compilers).map(name => {
-				compilers[name].name = name;
-				return compilers[name];
+				/** @type {Record} */
+				(compilers)[name].name = name;
+				return /** @type {Record} */ (compilers)[name];
 			});
 		}
+
+		this.hooks = Object.freeze({
+			/** @type {SyncHook<[MultiStats]>} */
+			done: new SyncHook(["stats"]),
+			/** @type {MultiHook>} */
+			invalid: new MultiHook(compilers.map(c => c.hooks.invalid)),
+			/** @type {MultiHook>} */
+			run: new MultiHook(compilers.map(c => c.hooks.run)),
+			/** @type {SyncHook<[]>} */
+			watchClose: new SyncHook([]),
+			/** @type {MultiHook>} */
+			watchRun: new MultiHook(compilers.map(c => c.hooks.watchRun)),
+			/** @type {MultiHook>} */
+			infrastructureLog: new MultiHook(
+				compilers.map(c => c.hooks.infrastructureLog)
+			)
+		});
 		this.compilers = compilers;
+		/** @type {MultiCompilerOptions} */
+		this._options = {
+			parallelism: options.parallelism || Infinity
+		};
+		/** @type {WeakMap} */
+		this.dependencies = new WeakMap();
+		this.running = false;
+
+		/** @type {(Stats | null)[]} */
+		const compilerStats = this.compilers.map(() => null);
 		let doneCompilers = 0;
-		let compilerStats = [];
-		let index = 0;
-		for (const compiler of this.compilers) {
+		for (let index = 0; index < this.compilers.length; index++) {
+			const compiler = this.compilers[index];
+			const compilerIndex = index;
 			let compilerDone = false;
-			const compilerIndex = index++;
 			// eslint-disable-next-line no-loop-func
-			compiler.hooks.done.tap("MultiCompiler", stats => {
+			compiler.hooks.done.tap(CLASS_NAME, stats => {
 				if (!compilerDone) {
 					compilerDone = true;
 					doneCompilers++;
 				}
 				compilerStats[compilerIndex] = stats;
 				if (doneCompilers === this.compilers.length) {
-					this.hooks.done.call(new MultiStats(compilerStats));
+					this.hooks.done.call(
+						new MultiStats(/** @type {Stats[]} */ (compilerStats))
+					);
 				}
 			});
 			// eslint-disable-next-line no-loop-func
-			compiler.hooks.invalid.tap("MultiCompiler", () => {
+			compiler.hooks.invalid.tap(CLASS_NAME, () => {
 				if (compilerDone) {
 					compilerDone = false;
 					doneCompilers--;
 				}
 			});
 		}
-		this.running = false;
+		this._validateCompilersOptions();
+	}
+
+	_validateCompilersOptions() {
+		if (this.compilers.length < 2) return;
+		/**
+		 * @param {Compiler} compiler compiler
+		 * @param {WebpackError} warning warning
+		 */
+		const addWarning = (compiler, warning) => {
+			compiler.hooks.thisCompilation.tap(CLASS_NAME, compilation => {
+				compilation.warnings.push(warning);
+			});
+		};
+		const cacheNames = new Set();
+		for (const compiler of this.compilers) {
+			if (compiler.options.cache && "name" in compiler.options.cache) {
+				const name = compiler.options.cache.name;
+				if (cacheNames.has(name)) {
+					addWarning(
+						compiler,
+						new WebpackError(
+							`${
+								compiler.name
+									? `Compiler with name "${compiler.name}" doesn't use unique cache name. `
+									: ""
+							}Please set unique "cache.name" option. Name "${name}" already used.`
+						)
+					);
+				} else {
+					cacheNames.add(name);
+				}
+			}
+		}
+	}
+
+	get options() {
+		return Object.assign(
+			this.compilers.map(c => c.options),
+			this._options
+		);
 	}
 
 	get outputPath() {
@@ -74,25 +176,84 @@ module.exports = class MultiCompiler extends Tapable {
 		throw new Error("Cannot read inputFileSystem of a MultiCompiler");
 	}
 
-	get outputFileSystem() {
-		throw new Error("Cannot read outputFileSystem of a MultiCompiler");
-	}
-
+	/**
+	 * @param {InputFileSystem} value the new input file system
+	 */
 	set inputFileSystem(value) {
 		for (const compiler of this.compilers) {
 			compiler.inputFileSystem = value;
 		}
 	}
 
+	get outputFileSystem() {
+		throw new Error("Cannot read outputFileSystem of a MultiCompiler");
+	}
+
+	/**
+	 * @param {OutputFileSystem} value the new output file system
+	 */
 	set outputFileSystem(value) {
 		for (const compiler of this.compilers) {
 			compiler.outputFileSystem = value;
 		}
 	}
 
+	get watchFileSystem() {
+		throw new Error("Cannot read watchFileSystem of a MultiCompiler");
+	}
+
+	/**
+	 * @param {WatchFileSystem} value the new watch file system
+	 */
+	set watchFileSystem(value) {
+		for (const compiler of this.compilers) {
+			compiler.watchFileSystem = value;
+		}
+	}
+
+	/**
+	 * @param {IntermediateFileSystem} value the new intermediate file system
+	 */
+	set intermediateFileSystem(value) {
+		for (const compiler of this.compilers) {
+			compiler.intermediateFileSystem = value;
+		}
+	}
+
+	get intermediateFileSystem() {
+		throw new Error("Cannot read outputFileSystem of a MultiCompiler");
+	}
+
+	/**
+	 * @param {string | (() => string)} name name of the logger, or function called once to get the logger name
+	 * @returns {Logger} a logger with that name
+	 */
+	getInfrastructureLogger(name) {
+		return this.compilers[0].getInfrastructureLogger(name);
+	}
+
+	/**
+	 * @param {Compiler} compiler the child compiler
+	 * @param {string[]} dependencies its dependencies
+	 * @returns {void}
+	 */
+	setDependencies(compiler, dependencies) {
+		this.dependencies.set(compiler, dependencies);
+	}
+
+	/**
+	 * @param {Callback} callback signals when the validation is complete
+	 * @returns {boolean} true if the dependencies are valid
+	 */
 	validateDependencies(callback) {
+		/** @type {Set<{source: Compiler, target: Compiler}>} */
 		const edges = new Set();
+		/** @type {string[]} */
 		const missing = [];
+		/**
+		 * @param {Compiler} compiler compiler
+		 * @returns {boolean} target was found
+		 */
 		const targetFound = compiler => {
 			for (const edge of edges) {
 				if (edge.target === compiler) {
@@ -101,15 +262,20 @@ module.exports = class MultiCompiler extends Tapable {
 			}
 			return false;
 		};
-		const sortEdges = (e1, e2) => {
-			return (
-				e1.source.name.localeCompare(e2.source.name) ||
-				e1.target.name.localeCompare(e2.target.name)
-			);
-		};
+		/**
+		 * @param {{source: Compiler, target: Compiler}} e1 edge 1
+		 * @param {{source: Compiler, target: Compiler}} e2 edge 2
+		 * @returns {number} result
+		 */
+		const sortEdges = (e1, e2) =>
+			/** @type {string} */
+			(e1.source.name).localeCompare(/** @type {string} */ (e2.source.name)) ||
+			/** @type {string} */
+			(e1.target.name).localeCompare(/** @type {string} */ (e2.target.name));
 		for (const source of this.compilers) {
-			if (source.dependencies) {
-				for (const dep of source.dependencies) {
+			const dependencies = this.dependencies.get(source);
+			if (dependencies) {
+				for (const dep of dependencies) {
 					const target = this.compilers.find(c => c.name === dep);
 					if (!target) {
 						missing.push(dep);
@@ -122,6 +288,7 @@ module.exports = class MultiCompiler extends Tapable {
 				}
 			}
 		}
+		/** @type {string[]} */
 		const errors = missing.map(m => `Compiler dependency \`${m}\` not found.`);
 		const stack = this.compilers.filter(c => !targetFound(c));
 		while (stack.length > 0) {
@@ -137,6 +304,7 @@ module.exports = class MultiCompiler extends Tapable {
 			}
 		}
 		if (edges.size > 0) {
+			/** @type {string[]} */
 			const lines = Array.from(edges)
 				.sort(sortEdges)
 				.map(edge => `${edge.source.name} -> ${edge.target.name}`);
@@ -151,17 +319,33 @@ module.exports = class MultiCompiler extends Tapable {
 		return true;
 	}
 
+	// TODO webpack 6 remove
+	/**
+	 * @deprecated This method should have been private
+	 * @param {Compiler[]} compilers the child compilers
+	 * @param {RunWithDependenciesHandler} fn a handler to run for each compiler
+	 * @param {Callback} callback the compiler's handler
+	 * @returns {void}
+	 */
 	runWithDependencies(compilers, fn, callback) {
 		const fulfilledNames = new Set();
 		let remainingCompilers = compilers;
+		/**
+		 * @param {string} d dependency
+		 * @returns {boolean} when dependency was fulfilled
+		 */
 		const isDependencyFulfilled = d => fulfilledNames.has(d);
+		/**
+		 * @returns {Compiler[]} compilers
+		 */
 		const getReadyCompilers = () => {
-			let readyCompilers = [];
-			let list = remainingCompilers;
+			const readyCompilers = [];
+			const list = remainingCompilers;
 			remainingCompilers = [];
 			for (const c of list) {
+				const dependencies = this.dependencies.get(c);
 				const ready =
-					!c.dependencies || c.dependencies.every(isDependencyFulfilled);
+					!dependencies || dependencies.every(isDependencyFulfilled);
 				if (ready) {
 					readyCompilers.push(c);
 				} else {
@@ -170,8 +354,12 @@ module.exports = class MultiCompiler extends Tapable {
 			}
 			return readyCompilers;
 		};
+		/**
+		 * @param {Callback} callback callback
+		 * @returns {void}
+		 */
 		const runCompilers = callback => {
-			if (remainingCompilers.length === 0) return callback();
+			if (remainingCompilers.length === 0) return callback(null);
 			asyncLib.map(
 				getReadyCompilers(),
 				(compiler, callback) => {
@@ -181,93 +369,267 @@ module.exports = class MultiCompiler extends Tapable {
 						runCompilers(callback);
 					});
 				},
-				callback
+				(err, results) => {
+					callback(err, /** @type {TODO} */ (results));
+				}
 			);
 		};
 		runCompilers(callback);
 	}
 
+	/**
+	 * @template SetupResult
+	 * @param {(compiler: Compiler, index: number, doneCallback: Callback, isBlocked: () => boolean, setChanged: () => void, setInvalid: () => void) => SetupResult} setup setup a single compiler
+	 * @param {(compiler: Compiler, setupResult: SetupResult, callback: Callback) => void} run run/continue a single compiler
+	 * @param {Callback} callback callback when all compilers are done, result includes Stats of all changed compilers
+	 * @returns {SetupResult[]} result of setup
+	 */
+	_runGraph(setup, run, callback) {
+		/** @typedef {{ compiler: Compiler, setupResult: undefined | SetupResult, result: undefined | Stats, state: "pending" | "blocked" | "queued" | "starting" | "running" | "running-outdated" | "done", children: Node[], parents: Node[] }} Node */
+
+		// State transitions for nodes:
+		// -> blocked (initial)
+		// blocked -> starting [running++] (when all parents done)
+		// queued -> starting [running++] (when processing the queue)
+		// starting -> running (when run has been called)
+		// running -> done [running--] (when compilation is done)
+		// done -> pending (when invalidated from file change)
+		// pending -> blocked [add to queue] (when invalidated from aggregated changes)
+		// done -> blocked [add to queue] (when invalidated, from parent invalidation)
+		// running -> running-outdated (when invalidated, either from change or parent invalidation)
+		// running-outdated -> blocked [running--] (when compilation is done)
+
+		/** @type {Node[]} */
+		const nodes = this.compilers.map(compiler => ({
+			compiler,
+			setupResult: undefined,
+			result: undefined,
+			state: "blocked",
+			children: [],
+			parents: []
+		}));
+		/** @type {Map} */
+		const compilerToNode = new Map();
+		for (const node of nodes) {
+			compilerToNode.set(/** @type {string} */ (node.compiler.name), node);
+		}
+		for (const node of nodes) {
+			const dependencies = this.dependencies.get(node.compiler);
+			if (!dependencies) continue;
+			for (const dep of dependencies) {
+				const parent = /** @type {Node} */ (compilerToNode.get(dep));
+				node.parents.push(parent);
+				parent.children.push(node);
+			}
+		}
+		/** @type {ArrayQueue} */
+		const queue = new ArrayQueue();
+		for (const node of nodes) {
+			if (node.parents.length === 0) {
+				node.state = "queued";
+				queue.enqueue(node);
+			}
+		}
+		let errored = false;
+		let running = 0;
+		const parallelism = /** @type {number} */ (this._options.parallelism);
+		/**
+		 * @param {Node} node node
+		 * @param {(Error | null)=} err error
+		 * @param {Stats=} stats result
+		 * @returns {void}
+		 */
+		const nodeDone = (node, err, stats) => {
+			if (errored) return;
+			if (err) {
+				errored = true;
+				return asyncLib.each(
+					nodes,
+					(node, callback) => {
+						if (node.compiler.watching) {
+							node.compiler.watching.close(callback);
+						} else {
+							callback();
+						}
+					},
+					() => callback(err)
+				);
+			}
+			node.result = stats;
+			running--;
+			if (node.state === "running") {
+				node.state = "done";
+				for (const child of node.children) {
+					if (child.state === "blocked") queue.enqueue(child);
+				}
+			} else if (node.state === "running-outdated") {
+				node.state = "blocked";
+				queue.enqueue(node);
+			}
+			processQueue();
+		};
+		/**
+		 * @param {Node} node node
+		 * @returns {void}
+		 */
+		const nodeInvalidFromParent = node => {
+			if (node.state === "done") {
+				node.state = "blocked";
+			} else if (node.state === "running") {
+				node.state = "running-outdated";
+			}
+			for (const child of node.children) {
+				nodeInvalidFromParent(child);
+			}
+		};
+		/**
+		 * @param {Node} node node
+		 * @returns {void}
+		 */
+		const nodeInvalid = node => {
+			if (node.state === "done") {
+				node.state = "pending";
+			} else if (node.state === "running") {
+				node.state = "running-outdated";
+			}
+			for (const child of node.children) {
+				nodeInvalidFromParent(child);
+			}
+		};
+		/**
+		 * @param {Node} node node
+		 * @returns {void}
+		 */
+		const nodeChange = node => {
+			nodeInvalid(node);
+			if (node.state === "pending") {
+				node.state = "blocked";
+			}
+			if (node.state === "blocked") {
+				queue.enqueue(node);
+				processQueue();
+			}
+		};
+
+		/** @type {SetupResult[]} */
+		const setupResults = [];
+		for (const [i, node] of nodes.entries()) {
+			setupResults.push(
+				(node.setupResult = setup(
+					node.compiler,
+					i,
+					nodeDone.bind(null, node),
+					() => node.state !== "starting" && node.state !== "running",
+					() => nodeChange(node),
+					() => nodeInvalid(node)
+				))
+			);
+		}
+		let processing = true;
+		const processQueue = () => {
+			if (processing) return;
+			processing = true;
+			process.nextTick(processQueueWorker);
+		};
+		const processQueueWorker = () => {
+			// eslint-disable-next-line no-unmodified-loop-condition
+			while (running < parallelism && queue.length > 0 && !errored) {
+				const node = /** @type {Node} */ (queue.dequeue());
+				if (
+					node.state === "queued" ||
+					(node.state === "blocked" &&
+						node.parents.every(p => p.state === "done"))
+				) {
+					running++;
+					node.state = "starting";
+					run(
+						node.compiler,
+						/** @type {SetupResult} */ (node.setupResult),
+						nodeDone.bind(null, node)
+					);
+					node.state = "running";
+				}
+			}
+			processing = false;
+			if (
+				!errored &&
+				running === 0 &&
+				nodes.every(node => node.state === "done")
+			) {
+				const stats = [];
+				for (const node of nodes) {
+					const result = node.result;
+					if (result) {
+						node.result = undefined;
+						stats.push(result);
+					}
+				}
+				if (stats.length > 0) {
+					callback(null, new MultiStats(stats));
+				}
+			}
+		};
+		processQueueWorker();
+		return setupResults;
+	}
+
+	/**
+	 * @param {WatchOptions|WatchOptions[]} watchOptions the watcher's options
+	 * @param {Callback} handler signals when the call finishes
+	 * @returns {MultiWatching} a compiler watcher
+	 */
 	watch(watchOptions, handler) {
-		if (this.running) return handler(new ConcurrentCompilationError());
+		if (this.running) {
+			return handler(new ConcurrentCompilationError());
+		}
+		this.running = true;
 
-		let watchings = [];
-		let allStats = this.compilers.map(() => null);
-		let compilerStatus = this.compilers.map(() => false);
 		if (this.validateDependencies(handler)) {
-			this.running = true;
-			this.runWithDependencies(
-				this.compilers,
-				(compiler, callback) => {
-					const compilerIdx = this.compilers.indexOf(compiler);
-					let firstRun = true;
-					let watching = compiler.watch(
-						Array.isArray(watchOptions)
-							? watchOptions[compilerIdx]
-							: watchOptions,
-						(err, stats) => {
-							if (err) handler(err);
-							if (stats) {
-								allStats[compilerIdx] = stats;
-								compilerStatus[compilerIdx] = "new";
-								if (compilerStatus.every(Boolean)) {
-									const freshStats = allStats.filter((s, idx) => {
-										return compilerStatus[idx] === "new";
-									});
-									compilerStatus.fill(true);
-									const multiStats = new MultiStats(freshStats);
-									handler(null, multiStats);
-								}
-							}
-							if (firstRun && !err) {
-								firstRun = false;
-								callback();
-							}
-						}
+			const watchings = this._runGraph(
+				(compiler, idx, callback, isBlocked, setChanged, setInvalid) => {
+					const watching = compiler.watch(
+						Array.isArray(watchOptions) ? watchOptions[idx] : watchOptions,
+						callback
 					);
-					watchings.push(watching);
+					if (watching) {
+						watching._onInvalid = setInvalid;
+						watching._onChange = setChanged;
+						watching._isBlocked = isBlocked;
+					}
+					return watching;
 				},
-				() => {
-					// ignore
-				}
+				(compiler, watching, callback) => {
+					if (compiler.watching !== watching) return;
+					if (!watching.running) watching.invalidate();
+				},
+				handler
 			);
+			return new MultiWatching(watchings, this);
 		}
 
-		return new MultiWatching(watchings, this);
+		return new MultiWatching([], this);
 	}
 
+	/**
+	 * @param {Callback} callback signals when the call finishes
+	 * @returns {void}
+	 */
 	run(callback) {
 		if (this.running) {
 			return callback(new ConcurrentCompilationError());
 		}
+		this.running = true;
 
-		const finalCallback = (err, stats) => {
-			this.running = false;
-
-			if (callback !== undefined) {
-				return callback(err, stats);
-			}
-		};
-
-		const allStats = this.compilers.map(() => null);
 		if (this.validateDependencies(callback)) {
-			this.running = true;
-			this.runWithDependencies(
-				this.compilers,
-				(compiler, callback) => {
-					const compilerIdx = this.compilers.indexOf(compiler);
-					compiler.run((err, stats) => {
-						if (err) {
-							return callback(err);
-						}
-						allStats[compilerIdx] = stats;
-						callback();
-					});
-				},
-				err => {
-					if (err) {
-						return finalCallback(err);
+			this._runGraph(
+				() => {},
+				(compiler, setupResult, callback) => compiler.run(callback),
+				(err, stats) => {
+					this.running = false;
+
+					if (callback !== undefined) {
+						return callback(err, stats);
 					}
-					finalCallback(null, new MultiStats(allStats));
 				}
 			);
 		}
@@ -280,4 +642,20 @@ module.exports = class MultiCompiler extends Tapable {
 			}
 		}
 	}
+
+	/**
+	 * @param {Callback} callback signals when the compiler closes
+	 * @returns {void}
+	 */
+	close(callback) {
+		asyncLib.each(
+			this.compilers,
+			(compiler, callback) => {
+				compiler.close(callback);
+			},
+			error => {
+				callback(error);
+			}
+		);
+	}
 };
diff --git a/lib/MultiEntryPlugin.js b/lib/MultiEntryPlugin.js
deleted file mode 100644
index b38a82399d9..00000000000
--- a/lib/MultiEntryPlugin.js
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const MultiEntryDependency = require("./dependencies/MultiEntryDependency");
-const SingleEntryDependency = require("./dependencies/SingleEntryDependency");
-const MultiModuleFactory = require("./MultiModuleFactory");
-
-/** @typedef {import("./Compiler")} Compiler */
-
-class MultiEntryPlugin {
-	/**
-	 * The MultiEntryPlugin is invoked whenever this.options.entry value is an array of paths
-	 * @param {string} context context path
-	 * @param {string[]} entries array of entry paths
-	 * @param {string} name entry key name
-	 */
-	constructor(context, entries, name) {
-		this.context = context;
-		this.entries = entries;
-		this.name = name;
-	}
-
-	/**
-	 * @param {Compiler} compiler the compiler instance
-	 * @returns {void}
-	 */
-	apply(compiler) {
-		compiler.hooks.compilation.tap(
-			"MultiEntryPlugin",
-			(compilation, { normalModuleFactory }) => {
-				const multiModuleFactory = new MultiModuleFactory();
-
-				compilation.dependencyFactories.set(
-					MultiEntryDependency,
-					multiModuleFactory
-				);
-				compilation.dependencyFactories.set(
-					SingleEntryDependency,
-					normalModuleFactory
-				);
-			}
-		);
-
-		compiler.hooks.make.tapAsync(
-			"MultiEntryPlugin",
-			(compilation, callback) => {
-				const { context, entries, name } = this;
-
-				const dep = MultiEntryPlugin.createDependency(entries, name);
-				compilation.addEntry(context, dep, name, callback);
-			}
-		);
-	}
-
-	/**
-	 * @param {string[]} entries each entry path string
-	 * @param {string} name name of the entry
-	 * @returns {MultiEntryDependency} returns a constructed Dependency
-	 */
-	static createDependency(entries, name) {
-		return new MultiEntryDependency(
-			entries.map((e, idx) => {
-				const dep = new SingleEntryDependency(e);
-				// Because entrypoints are not dependencies found in an
-				// existing module, we give it a synthetic id
-				dep.loc = {
-					name,
-					index: idx
-				};
-				return dep;
-			}),
-			name
-		);
-	}
-}
-
-module.exports = MultiEntryPlugin;
diff --git a/lib/MultiModule.js b/lib/MultiModule.js
deleted file mode 100644
index c8e5d575718..00000000000
--- a/lib/MultiModule.js
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const Module = require("./Module");
-const Template = require("./Template");
-const { RawSource } = require("webpack-sources");
-
-/** @typedef {import("./util/createHash").Hash} Hash */
-
-class MultiModule extends Module {
-	constructor(context, dependencies, name) {
-		super("javascript/dynamic", context);
-
-		// Info from Factory
-		this.dependencies = dependencies;
-		this.name = name;
-		this._identifier = `multi ${this.dependencies
-			.map(d => d.request)
-			.join(" ")}`;
-	}
-
-	identifier() {
-		return this._identifier;
-	}
-
-	readableIdentifier(requestShortener) {
-		return `multi ${this.dependencies
-			.map(d => requestShortener.shorten(d.request))
-			.join(" ")}`;
-	}
-
-	build(options, compilation, resolver, fs, callback) {
-		this.built = true;
-		this.buildMeta = {};
-		this.buildInfo = {};
-		return callback();
-	}
-
-	needRebuild() {
-		return false;
-	}
-
-	size() {
-		return 16 + this.dependencies.length * 12;
-	}
-
-	/**
-	 * @param {Hash} hash the hash used to track dependencies
-	 * @returns {void}
-	 */
-	updateHash(hash) {
-		hash.update("multi module");
-		hash.update(this.name || "");
-		super.updateHash(hash);
-	}
-
-	source(dependencyTemplates, runtimeTemplate) {
-		const str = [];
-		let idx = 0;
-		for (const dep of this.dependencies) {
-			if (dep.module) {
-				if (idx === this.dependencies.length - 1) {
-					str.push("module.exports = ");
-				}
-				str.push("__webpack_require__(");
-				if (runtimeTemplate.outputOptions.pathinfo) {
-					str.push(Template.toComment(dep.request));
-				}
-				str.push(`${JSON.stringify(dep.module.id)}`);
-				str.push(")");
-			} else {
-				const content = require("./dependencies/WebpackMissingModule").module(
-					dep.request
-				);
-				str.push(content);
-			}
-			str.push(";\n");
-			idx++;
-		}
-		return new RawSource(str.join(""));
-	}
-}
-
-module.exports = MultiModule;
diff --git a/lib/MultiModuleFactory.js b/lib/MultiModuleFactory.js
deleted file mode 100644
index 5d29b2056a5..00000000000
--- a/lib/MultiModuleFactory.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const { Tapable } = require("tapable");
-const MultiModule = require("./MultiModule");
-
-module.exports = class MultiModuleFactory extends Tapable {
-	constructor() {
-		super();
-		this.hooks = {};
-	}
-
-	create(data, callback) {
-		const dependency = data.dependencies[0];
-		callback(
-			null,
-			new MultiModule(data.context, dependency.dependencies, dependency.name)
-		);
-	}
-};
diff --git a/lib/MultiStats.js b/lib/MultiStats.js
index 1a5fcf2b007..73ab807942f 100644
--- a/lib/MultiStats.js
+++ b/lib/MultiStats.js
@@ -2,90 +2,206 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const Stats = require("./Stats");
+const identifierUtils = require("./util/identifier");
+
+/** @typedef {import("../declarations/WebpackOptions").StatsOptions} StatsOptions */
+/** @typedef {import("./Compilation").CreateStatsOptionsContext} CreateStatsOptionsContext */
+/** @typedef {import("./Compilation").NormalizedStatsOptions} NormalizedStatsOptions */
+/** @typedef {import("./Stats")} Stats */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").KnownStatsCompilation} KnownStatsCompilation */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsCompilation} StatsCompilation */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsError} StatsError */
+
+/**
+ * @param {string} str string
+ * @param {string} prefix pref
+ * @returns {string} indent
+ */
+const indent = (str, prefix) => {
+	const rem = str.replace(/\n([^\n])/g, `\n${prefix}$1`);
+	return prefix + rem;
+};
 
-const optionOrFallback = (optionValue, fallbackValue) =>
-	optionValue !== undefined ? optionValue : fallbackValue;
+/** @typedef {{ version: boolean, hash: boolean, errorsCount: boolean, warningsCount: boolean, errors: boolean, warnings: boolean, children: NormalizedStatsOptions[] }} ChildOptions */
 
 class MultiStats {
+	/**
+	 * @param {Stats[]} stats the child stats
+	 */
 	constructor(stats) {
 		this.stats = stats;
-		this.hash = stats.map(stat => stat.hash).join("");
 	}
 
+	get hash() {
+		return this.stats.map(stat => stat.hash).join("");
+	}
+
+	/**
+	 * @returns {boolean} true if a child compilation encountered an error
+	 */
 	hasErrors() {
-		return this.stats
-			.map(stat => stat.hasErrors())
-			.reduce((a, b) => a || b, false);
+		return this.stats.some(stat => stat.hasErrors());
 	}
 
+	/**
+	 * @returns {boolean} true if a child compilation had a warning
+	 */
 	hasWarnings() {
-		return this.stats
-			.map(stat => stat.hasWarnings())
-			.reduce((a, b) => a || b, false);
+		return this.stats.some(stat => stat.hasWarnings());
 	}
 
-	toJson(options, forToString) {
-		if (typeof options === "boolean" || typeof options === "string") {
-			options = Stats.presetToOptions(options);
-		} else if (!options) {
-			options = {};
-		}
-		const jsons = this.stats.map((stat, idx) => {
-			const childOptions = Stats.getChildOptions(options, idx);
-			const obj = stat.toJson(childOptions, forToString);
-			obj.name = stat.compilation && stat.compilation.name;
+	/**
+	 * @param {string | boolean | StatsOptions | undefined} options stats options
+	 * @param {CreateStatsOptionsContext} context context
+	 * @returns {ChildOptions} context context
+	 */
+	_createChildOptions(options, context) {
+		const getCreateStatsOptions = () => {
+			if (!options) {
+				options = {};
+			}
+
+			const { children: childrenOptions = undefined, ...baseOptions } =
+				typeof options === "string"
+					? { preset: options }
+					: /** @type {StatsOptions} */ (options);
+
+			return { childrenOptions, baseOptions };
+		};
+
+		const children = this.stats.map((stat, idx) => {
+			if (typeof options === "boolean") {
+				return stat.compilation.createStatsOptions(options, context);
+			}
+			const { childrenOptions, baseOptions } = getCreateStatsOptions();
+			const childOptions = Array.isArray(childrenOptions)
+				? childrenOptions[idx]
+				: childrenOptions;
+			return stat.compilation.createStatsOptions(
+				{
+					...baseOptions,
+					...(typeof childOptions === "string"
+						? { preset: childOptions }
+						: childOptions && typeof childOptions === "object"
+							? childOptions
+							: undefined)
+				},
+				context
+			);
+		});
+		return {
+			version: children.every(o => o.version),
+			hash: children.every(o => o.hash),
+			errorsCount: children.every(o => o.errorsCount),
+			warningsCount: children.every(o => o.warningsCount),
+			errors: children.every(o => o.errors),
+			warnings: children.every(o => o.warnings),
+			children
+		};
+	}
+
+	/**
+	 * @param {(string | boolean | StatsOptions)=} options stats options
+	 * @returns {StatsCompilation} json output
+	 */
+	toJson(options) {
+		const childOptions = this._createChildOptions(options, {
+			forToString: false
+		});
+		/** @type {KnownStatsCompilation} */
+		const obj = {};
+		obj.children = this.stats.map((stat, idx) => {
+			const obj = stat.toJson(childOptions.children[idx]);
+			const compilationName = stat.compilation.name;
+			const name =
+				compilationName &&
+				identifierUtils.makePathsRelative(
+					stat.compilation.compiler.context,
+					compilationName,
+					stat.compilation.compiler.root
+				);
+			obj.name = name;
 			return obj;
 		});
-		const showVersion =
-			options.version === undefined
-				? jsons.every(j => j.version)
-				: options.version !== false;
-		const showHash =
-			options.hash === undefined
-				? jsons.every(j => j.hash)
-				: options.hash !== false;
-		if (showVersion) {
-			for (const j of jsons) {
-				delete j.version;
+		if (childOptions.version) {
+			obj.version = obj.children[0].version;
+		}
+		if (childOptions.hash) {
+			obj.hash = obj.children.map(j => j.hash).join("");
+		}
+		/**
+		 * @param {StatsCompilation} j stats error
+		 * @param {StatsError} obj Stats error
+		 * @returns {StatsError} result
+		 */
+		const mapError = (j, obj) => ({
+			...obj,
+			compilerPath: obj.compilerPath ? `${j.name}.${obj.compilerPath}` : j.name
+		});
+		if (childOptions.errors) {
+			obj.errors = [];
+			for (const j of obj.children) {
+				const errors =
+					/** @type {NonNullable} */
+					(j.errors);
+				for (const i of errors) {
+					obj.errors.push(mapError(j, i));
+				}
+			}
+		}
+		if (childOptions.warnings) {
+			obj.warnings = [];
+			for (const j of obj.children) {
+				const warnings =
+					/** @type {NonNullable} */
+					(j.warnings);
+				for (const i of warnings) {
+					obj.warnings.push(mapError(j, i));
+				}
+			}
+		}
+		if (childOptions.errorsCount) {
+			obj.errorsCount = 0;
+			for (const j of obj.children) {
+				obj.errorsCount += /** @type {number} */ (j.errorsCount);
+			}
+		}
+		if (childOptions.warningsCount) {
+			obj.warningsCount = 0;
+			for (const j of obj.children) {
+				obj.warningsCount += /** @type {number} */ (j.warningsCount);
 			}
 		}
-		const obj = {
-			errors: jsons.reduce((arr, j) => {
-				return arr.concat(
-					j.errors.map(msg => {
-						return `(${j.name}) ${msg}`;
-					})
-				);
-			}, []),
-			warnings: jsons.reduce((arr, j) => {
-				return arr.concat(
-					j.warnings.map(msg => {
-						return `(${j.name}) ${msg}`;
-					})
-				);
-			}, [])
-		};
-		if (showVersion) obj.version = require("../package.json").version;
-		if (showHash) obj.hash = this.hash;
-		if (options.children !== false) obj.children = jsons;
 		return obj;
 	}
 
+	/**
+	 * @param {(string | boolean | StatsOptions)=} options stats options
+	 * @returns {string} string output
+	 */
 	toString(options) {
-		if (typeof options === "boolean" || typeof options === "string") {
-			options = Stats.presetToOptions(options);
-		} else if (!options) {
-			options = {};
-		}
-
-		const useColors = optionOrFallback(options.colors, false);
-
-		const obj = this.toJson(options, true);
-
-		return Stats.jsonToString(obj, useColors);
+		const childOptions = this._createChildOptions(options, {
+			forToString: true
+		});
+		const results = this.stats.map((stat, idx) => {
+			const str = stat.toString(childOptions.children[idx]);
+			const compilationName = stat.compilation.name;
+			const name =
+				compilationName &&
+				identifierUtils
+					.makePathsRelative(
+						stat.compilation.compiler.context,
+						compilationName,
+						stat.compilation.compiler.root
+					)
+					.replace(/\|/g, " ");
+			if (!str) return str;
+			return name ? `${name}:\n${indent(str, "  ")}` : str;
+		});
+		return results.filter(Boolean).join("\n\n");
 	}
 }
 
diff --git a/lib/MultiWatching.js b/lib/MultiWatching.js
index 48e012c871c..cfe95f17b28 100644
--- a/lib/MultiWatching.js
+++ b/lib/MultiWatching.js
@@ -2,24 +2,67 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const asyncLib = require("neo-async");
 
+/** @typedef {import("./MultiCompiler")} MultiCompiler */
+/** @typedef {import("./Watching")} Watching */
+
+/**
+ * @template T
+ * @callback Callback
+ * @param {(Error | null)=} err
+ * @param {T=} result
+ */
+
 class MultiWatching {
+	/**
+	 * @param {Watching[]} watchings child compilers' watchers
+	 * @param {MultiCompiler} compiler the compiler
+	 */
 	constructor(watchings, compiler) {
 		this.watchings = watchings;
 		this.compiler = compiler;
 	}
 
-	invalidate() {
+	/**
+	 * @param {Callback=} callback signals when the build has completed again
+	 * @returns {void}
+	 */
+	invalidate(callback) {
+		if (callback) {
+			asyncLib.each(
+				this.watchings,
+				(watching, callback) => watching.invalidate(callback),
+				callback
+			);
+		} else {
+			for (const watching of this.watchings) {
+				watching.invalidate();
+			}
+		}
+	}
+
+	suspend() {
+		for (const watching of this.watchings) {
+			watching.suspend();
+		}
+	}
+
+	resume() {
 		for (const watching of this.watchings) {
-			watching.invalidate();
+			watching.resume();
 		}
 	}
 
+	/**
+	 * @param {Callback} callback signals when the watcher is closed
+	 * @returns {void}
+	 */
 	close(callback) {
-		asyncLib.forEach(
+		asyncLib.each(
 			this.watchings,
 			(watching, finishedCallback) => {
 				watching.close(finishedCallback);
diff --git a/lib/NamedChunksPlugin.js b/lib/NamedChunksPlugin.js
deleted file mode 100644
index 0cb5b6bf3d1..00000000000
--- a/lib/NamedChunksPlugin.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-class NamedChunksPlugin {
-	static defaultNameResolver(chunk) {
-		return chunk.name || null;
-	}
-
-	constructor(nameResolver) {
-		this.nameResolver = nameResolver || NamedChunksPlugin.defaultNameResolver;
-	}
-
-	apply(compiler) {
-		compiler.hooks.compilation.tap("NamedChunksPlugin", compilation => {
-			compilation.hooks.beforeChunkIds.tap("NamedChunksPlugin", chunks => {
-				for (const chunk of chunks) {
-					if (chunk.id === null) {
-						chunk.id = this.nameResolver(chunk);
-					}
-				}
-			});
-		});
-	}
-}
-
-module.exports = NamedChunksPlugin;
diff --git a/lib/NamedModulesPlugin.js b/lib/NamedModulesPlugin.js
deleted file mode 100644
index a3857ac8e90..00000000000
--- a/lib/NamedModulesPlugin.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const createHash = require("./util/createHash");
-const RequestShortener = require("./RequestShortener");
-
-const getHash = str => {
-	const hash = createHash("md4");
-	hash.update(str);
-	return hash.digest("hex").substr(0, 4);
-};
-
-class NamedModulesPlugin {
-	constructor(options) {
-		this.options = options || {};
-	}
-
-	apply(compiler) {
-		compiler.hooks.compilation.tap("NamedModulesPlugin", compilation => {
-			compilation.hooks.beforeModuleIds.tap("NamedModulesPlugin", modules => {
-				const namedModules = new Map();
-				const context = this.options.context || compiler.options.context;
-
-				for (const module of modules) {
-					if (module.id === null && module.libIdent) {
-						module.id = module.libIdent({ context });
-					}
-
-					if (module.id !== null) {
-						const namedModule = namedModules.get(module.id);
-						if (namedModule !== undefined) {
-							namedModule.push(module);
-						} else {
-							namedModules.set(module.id, [module]);
-						}
-					}
-				}
-
-				for (const namedModule of namedModules.values()) {
-					if (namedModule.length > 1) {
-						for (const module of namedModule) {
-							const requestShortener = new RequestShortener(context);
-							module.id = `${module.id}?${getHash(
-								requestShortener.shorten(module.identifier())
-							)}`;
-						}
-					}
-				}
-			});
-		});
-	}
-}
-
-module.exports = NamedModulesPlugin;
diff --git a/lib/NoEmitOnErrorsPlugin.js b/lib/NoEmitOnErrorsPlugin.js
index 2c37c497989..dfcde930954 100644
--- a/lib/NoEmitOnErrorsPlugin.js
+++ b/lib/NoEmitOnErrorsPlugin.js
@@ -2,15 +2,25 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+/** @typedef {import("./Compiler")} Compiler */
+
+const PLUGIN_NAME = "NoEmitOnErrorsPlugin";
+
 class NoEmitOnErrorsPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		compiler.hooks.shouldEmit.tap("NoEmitOnErrorsPlugin", compilation => {
+		compiler.hooks.shouldEmit.tap(PLUGIN_NAME, compilation => {
 			if (compilation.getStats().hasErrors()) return false;
 		});
-		compiler.hooks.compilation.tap("NoEmitOnErrorsPlugin", compilation => {
-			compilation.hooks.shouldRecord.tap("NoEmitOnErrorsPlugin", () => {
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			compilation.hooks.shouldRecord.tap(PLUGIN_NAME, () => {
 				if (compilation.getStats().hasErrors()) return false;
 			});
 		});
diff --git a/lib/NoModeWarning.js b/lib/NoModeWarning.js
index 1fbc3426af9..fdd3fadf9c6 100644
--- a/lib/NoModeWarning.js
+++ b/lib/NoModeWarning.js
@@ -2,22 +2,21 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const WebpackError = require("./WebpackError");
 
 module.exports = class NoModeWarning extends WebpackError {
-	constructor(modules) {
+	constructor() {
 		super();
 
 		this.name = "NoModeWarning";
 		this.message =
 			"configuration\n" +
-			"The 'mode' option has not been set, webpack will fallback to 'production' for this value. " +
+			"The 'mode' option has not been set, webpack will fallback to 'production' for this value.\n" +
 			"Set 'mode' option to 'development' or 'production' to enable defaults for each environment.\n" +
 			"You can also set it to 'none' to disable any default behavior. " +
-			"Learn more: https://webpack.js.org/concepts/mode/";
-
-		Error.captureStackTrace(this, this.constructor);
+			"Learn more: https://webpack.js.org/configuration/mode/";
 	}
 };
diff --git a/lib/NodeStuffInWebError.js b/lib/NodeStuffInWebError.js
new file mode 100644
index 00000000000..02b048ec4fd
--- /dev/null
+++ b/lib/NodeStuffInWebError.js
@@ -0,0 +1,34 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const WebpackError = require("./WebpackError");
+const makeSerializable = require("./util/makeSerializable");
+
+/** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
+
+class NodeStuffInWebError extends WebpackError {
+	/**
+	 * @param {DependencyLocation} loc loc
+	 * @param {string} expression expression
+	 * @param {string} description description
+	 */
+	constructor(loc, expression, description) {
+		super(
+			`${JSON.stringify(
+				expression
+			)} has been used, it will be undefined in next major version.
+${description}`
+		);
+
+		this.name = "NodeStuffInWebError";
+		this.loc = loc;
+	}
+}
+
+makeSerializable(NodeStuffInWebError, "webpack/lib/NodeStuffInWebError");
+
+module.exports = NodeStuffInWebError;
diff --git a/lib/NodeStuffPlugin.js b/lib/NodeStuffPlugin.js
index 75d2e73b063..87a5cd61405 100644
--- a/lib/NodeStuffPlugin.js
+++ b/lib/NodeStuffPlugin.js
@@ -2,196 +2,274 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const path = require("path");
-const ParserHelpers = require("./ParserHelpers");
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_DYNAMIC
+} = require("./ModuleTypeConstants");
+const NodeStuffInWebError = require("./NodeStuffInWebError");
+const RuntimeGlobals = require("./RuntimeGlobals");
+const CachedConstDependency = require("./dependencies/CachedConstDependency");
 const ConstDependency = require("./dependencies/ConstDependency");
+const ExternalModuleDependency = require("./dependencies/ExternalModuleDependency");
+const {
+	evaluateToString,
+	expressionIsUnsupported
+} = require("./javascript/JavascriptParserHelpers");
+const { relative } = require("./util/fs");
+const { parseResource } = require("./util/identifier");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
+/** @typedef {import("../declarations/WebpackOptions").NodeOptions} NodeOptions */
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./Dependency")} Dependency */
+/** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("./DependencyTemplates")} DependencyTemplates */
+/** @typedef {import("./NormalModule")} NormalModule */
+/** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */
+/** @typedef {import("./javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("./javascript/JavascriptParser").Range} Range */
+/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
 
-const NullFactory = require("./NullFactory");
+const PLUGIN_NAME = "NodeStuffPlugin";
 
 class NodeStuffPlugin {
+	/**
+	 * @param {NodeOptions} options options
+	 */
 	constructor(options) {
 		this.options = options;
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		const options = this.options;
 		compiler.hooks.compilation.tap(
-			"NodeStuffPlugin",
+			PLUGIN_NAME,
 			(compilation, { normalModuleFactory }) => {
-				compilation.dependencyFactories.set(ConstDependency, new NullFactory());
 				compilation.dependencyTemplates.set(
-					ConstDependency,
-					new ConstDependency.Template()
+					ExternalModuleDependency,
+					new ExternalModuleDependency.Template()
 				);
 
+				/**
+				 * @param {JavascriptParser} parser the parser
+				 * @param {JavascriptParserOptions} parserOptions options
+				 * @returns {void}
+				 */
 				const handler = (parser, parserOptions) => {
 					if (parserOptions.node === false) return;
 
 					let localOptions = options;
 					if (parserOptions.node) {
-						localOptions = Object.assign({}, localOptions, parserOptions.node);
+						localOptions = { ...localOptions, ...parserOptions.node };
+					}
+
+					if (localOptions.global !== false) {
+						const withWarning = localOptions.global === "warn";
+						parser.hooks.expression.for("global").tap(PLUGIN_NAME, expr => {
+							const dep = new ConstDependency(
+								RuntimeGlobals.global,
+								/** @type {Range} */ (expr.range),
+								[RuntimeGlobals.global]
+							);
+							dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+							parser.state.module.addPresentationalDependency(dep);
+
+							// TODO webpack 6 remove
+							if (withWarning) {
+								parser.state.module.addWarning(
+									new NodeStuffInWebError(
+										dep.loc,
+										"global",
+										"The global namespace object is a Node.js feature and isn't available in browsers."
+									)
+								);
+							}
+						});
+						parser.hooks.rename.for("global").tap(PLUGIN_NAME, expr => {
+							const dep = new ConstDependency(
+								RuntimeGlobals.global,
+								/** @type {Range} */ (expr.range),
+								[RuntimeGlobals.global]
+							);
+							dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+							parser.state.module.addPresentationalDependency(dep);
+							return false;
+						});
 					}
 
-					const setConstant = (expressionName, value) => {
+					/**
+					 * @param {string} expressionName expression name
+					 * @param {(module: NormalModule) => string} fn function
+					 * @param {string=} warning warning
+					 * @returns {void}
+					 */
+					const setModuleConstant = (expressionName, fn, warning) => {
 						parser.hooks.expression
 							.for(expressionName)
-							.tap("NodeStuffPlugin", () => {
-								parser.state.current.addVariable(
-									expressionName,
-									JSON.stringify(value)
+							.tap(PLUGIN_NAME, expr => {
+								const dep = new CachedConstDependency(
+									JSON.stringify(fn(parser.state.module)),
+									/** @type {Range} */ (expr.range),
+									expressionName
 								);
+								dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+								parser.state.module.addPresentationalDependency(dep);
+
+								// TODO webpack 6 remove
+								if (warning) {
+									parser.state.module.addWarning(
+										new NodeStuffInWebError(dep.loc, expressionName, warning)
+									);
+								}
+
 								return true;
 							});
 					};
 
-					const setModuleConstant = (expressionName, fn) => {
+					/**
+					 * @param {string} expressionName expression name
+					 * @param {(value: string) => string} fn function
+					 * @returns {void}
+					 */
+					const setUrlModuleConstant = (expressionName, fn) => {
 						parser.hooks.expression
 							.for(expressionName)
-							.tap("NodeStuffPlugin", () => {
-								parser.state.current.addVariable(
-									expressionName,
-									JSON.stringify(fn(parser.state.module))
+							.tap(PLUGIN_NAME, expr => {
+								const dep = new ExternalModuleDependency(
+									"url",
+									[
+										{
+											name: "fileURLToPath",
+											value: "__webpack_fileURLToPath__"
+										}
+									],
+									undefined,
+									fn("__webpack_fileURLToPath__"),
+									/** @type {Range} */ (expr.range),
+									expressionName
 								);
+								dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+								parser.state.module.addPresentationalDependency(dep);
+
 								return true;
 							});
 					};
+
+					/**
+					 * @param {string} expressionName expression name
+					 * @param {string} value value
+					 * @param {string=} warning warning
+					 * @returns {void}
+					 */
+					const setConstant = (expressionName, value, warning) =>
+						setModuleConstant(expressionName, () => value, warning);
+
 					const context = compiler.context;
-					if (localOptions.__filename === "mock") {
-						setConstant("__filename", "/index.js");
-					} else if (localOptions.__filename) {
-						setModuleConstant("__filename", module =>
-							path.relative(context, module.resource)
-						);
+					if (localOptions.__filename) {
+						switch (localOptions.__filename) {
+							case "mock":
+								setConstant("__filename", "/index.js");
+								break;
+							case "warn-mock":
+								setConstant(
+									"__filename",
+									"/index.js",
+									"__filename is a Node.js feature and isn't available in browsers."
+								);
+								break;
+							case "node-module":
+								setUrlModuleConstant(
+									"__filename",
+									functionName => `${functionName}(import.meta.url)`
+								);
+								break;
+							case true:
+								setModuleConstant("__filename", module =>
+									relative(
+										/** @type {InputFileSystem} */ (compiler.inputFileSystem),
+										context,
+										module.resource
+									)
+								);
+								break;
+						}
+
+						parser.hooks.evaluateIdentifier
+							.for("__filename")
+							.tap(PLUGIN_NAME, expr => {
+								if (!parser.state.module) return;
+								const resource = parseResource(parser.state.module.resource);
+								return evaluateToString(resource.path)(expr);
+							});
 					}
-					parser.hooks.evaluateIdentifier
-						.for("__filename")
-						.tap("NodeStuffPlugin", expr => {
-							if (!parser.state.module) return;
-							const resource = parser.state.module.resource;
-							const i = resource.indexOf("?");
-							return ParserHelpers.evaluateToString(
-								i < 0 ? resource : resource.substr(0, i)
-							)(expr);
-						});
-					if (localOptions.__dirname === "mock") {
-						setConstant("__dirname", "/");
-					} else if (localOptions.__dirname) {
-						setModuleConstant("__dirname", module =>
-							path.relative(context, module.context)
-						);
+					if (localOptions.__dirname) {
+						switch (localOptions.__dirname) {
+							case "mock":
+								setConstant("__dirname", "/");
+								break;
+							case "warn-mock":
+								setConstant(
+									"__dirname",
+									"/",
+									"__dirname is a Node.js feature and isn't available in browsers."
+								);
+								break;
+							case "node-module":
+								setUrlModuleConstant(
+									"__dirname",
+									functionName =>
+										`${functionName}(import.meta.url + "/..").slice(0, -1)`
+								);
+								break;
+							case true:
+								setModuleConstant("__dirname", module =>
+									relative(
+										/** @type {InputFileSystem} */ (compiler.inputFileSystem),
+										context,
+										/** @type {string} */ (module.context)
+									)
+								);
+								break;
+						}
+
+						parser.hooks.evaluateIdentifier
+							.for("__dirname")
+							.tap(PLUGIN_NAME, expr => {
+								if (!parser.state.module) return;
+								return evaluateToString(
+									/** @type {string} */ (parser.state.module.context)
+								)(expr);
+							});
 					}
-					parser.hooks.evaluateIdentifier
-						.for("__dirname")
-						.tap("NodeStuffPlugin", expr => {
-							if (!parser.state.module) return;
-							return ParserHelpers.evaluateToString(
-								parser.state.module.context
-							)(expr);
-						});
-					parser.hooks.expression
-						.for("require.main")
-						.tap(
-							"NodeStuffPlugin",
-							ParserHelpers.toConstantDependencyWithWebpackRequire(
-								parser,
-								"__webpack_require__.c[__webpack_require__.s]"
-							)
-						);
 					parser.hooks.expression
 						.for("require.extensions")
 						.tap(
-							"NodeStuffPlugin",
-							ParserHelpers.expressionIsUnsupported(
+							PLUGIN_NAME,
+							expressionIsUnsupported(
 								parser,
 								"require.extensions is not supported by webpack. Use a loader instead."
 							)
 						);
-					parser.hooks.expression
-						.for("require.main.require")
-						.tap(
-							"NodeStuffPlugin",
-							ParserHelpers.expressionIsUnsupported(
-								parser,
-								"require.main.require is not supported by webpack."
-							)
-						);
-					parser.hooks.expression
-						.for("module.parent.require")
-						.tap(
-							"NodeStuffPlugin",
-							ParserHelpers.expressionIsUnsupported(
-								parser,
-								"module.parent.require is not supported by webpack."
-							)
-						);
-					parser.hooks.expression
-						.for("module.loaded")
-						.tap("NodeStuffPlugin", expr => {
-							parser.state.module.buildMeta.moduleConcatenationBailout =
-								"module.loaded";
-							return ParserHelpers.toConstantDependency(parser, "module.l")(
-								expr
-							);
-						});
-					parser.hooks.expression
-						.for("module.id")
-						.tap("NodeStuffPlugin", expr => {
-							parser.state.module.buildMeta.moduleConcatenationBailout =
-								"module.id";
-							return ParserHelpers.toConstantDependency(parser, "module.i")(
-								expr
-							);
-						});
-					parser.hooks.expression
-						.for("module.exports")
-						.tap("NodeStuffPlugin", () => {
-							const module = parser.state.module;
-							const isHarmony =
-								module.buildMeta && module.buildMeta.exportsType;
-							if (!isHarmony) return true;
-						});
-					parser.hooks.evaluateIdentifier
-						.for("module.hot")
-						.tap(
-							"NodeStuffPlugin",
-							ParserHelpers.evaluateToIdentifier("module.hot", false)
-						);
-					parser.hooks.expression.for("module").tap("NodeStuffPlugin", () => {
-						const module = parser.state.module;
-						const isHarmony = module.buildMeta && module.buildMeta.exportsType;
-						let moduleJsPath = path.join(
-							__dirname,
-							"..",
-							"buildin",
-							isHarmony ? "harmony-module.js" : "module.js"
-						);
-						if (module.context) {
-							moduleJsPath = path.relative(
-								parser.state.module.context,
-								moduleJsPath
-							);
-							if (!/^[A-Z]:/i.test(moduleJsPath)) {
-								moduleJsPath = `./${moduleJsPath.replace(/\\/g, "/")}`;
-							}
-						}
-						return ParserHelpers.addParsedVariableToModule(
-							parser,
-							"module",
-							`require(${JSON.stringify(moduleJsPath)})(module)`
-						);
-					});
 				};
 
 				normalModuleFactory.hooks.parser
-					.for("javascript/auto")
-					.tap("NodeStuffPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, handler);
 				normalModuleFactory.hooks.parser
-					.for("javascript/dynamic")
-					.tap("NodeStuffPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
+					.tap(PLUGIN_NAME, handler);
 			}
 		);
 	}
 }
+
 module.exports = NodeStuffPlugin;
diff --git a/lib/NormalModule.js b/lib/NormalModule.js
index 3e9dc55554a..b07d4253798 100644
--- a/lib/NormalModule.js
+++ b/lib/NormalModule.js
@@ -2,161 +2,733 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
-"use strict";
 
-const NativeModule = require("module");
+"use strict";
 
+const parseJson = require("json-parse-even-better-errors");
+const { getContext, runLoaders } = require("loader-runner");
+const querystring = require("querystring");
+const {
+	HookMap,
+	SyncHook,
+	SyncWaterfallHook,
+	AsyncSeriesBailHook
+} = require("tapable");
 const {
 	CachedSource,
-	LineToLineMappedSource,
 	OriginalSource,
 	RawSource,
 	SourceMapSource
 } = require("webpack-sources");
-const { getContext, runLoaders } = require("loader-runner");
-
-const WebpackError = require("./WebpackError");
+const Compilation = require("./Compilation");
+const HookWebpackError = require("./HookWebpackError");
 const Module = require("./Module");
-const ModuleParseError = require("./ModuleParseError");
 const ModuleBuildError = require("./ModuleBuildError");
 const ModuleError = require("./ModuleError");
+const ModuleGraphConnection = require("./ModuleGraphConnection");
+const ModuleParseError = require("./ModuleParseError");
+const { JAVASCRIPT_MODULE_TYPE_AUTO } = require("./ModuleTypeConstants");
 const ModuleWarning = require("./ModuleWarning");
+const RuntimeGlobals = require("./RuntimeGlobals");
+const UnhandledSchemeError = require("./UnhandledSchemeError");
+const WebpackError = require("./WebpackError");
+const formatLocation = require("./formatLocation");
+const LazySet = require("./util/LazySet");
+const { isSubset } = require("./util/SetHelpers");
+const { getScheme } = require("./util/URLAbsoluteSpecifier");
+const {
+	compareLocations,
+	concatComparators,
+	compareSelect,
+	keepOriginalOrder
+} = require("./util/comparators");
 const createHash = require("./util/createHash");
-const contextify = require("./util/identifier").contextify;
+const { createFakeHook } = require("./util/deprecation");
+const { join } = require("./util/fs");
+const {
+	contextify,
+	absolutify,
+	makePathsRelative
+} = require("./util/identifier");
+const makeSerializable = require("./util/makeSerializable");
+const memoize = require("./util/memoize");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../declarations/WebpackOptions").Mode} Mode */
+/** @typedef {import("../declarations/WebpackOptions").ResolveOptions} ResolveOptions */
+/** @typedef {import("../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
+/** @typedef {import("../declarations/WebpackOptions").NoParse} NoParse */
+/** @typedef {import("./ChunkGraph")} ChunkGraph */
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("./DependencyTemplates")} DependencyTemplates */
+/** @typedef {import("./Generator")} Generator */
+/** @typedef {import("./Generator").GenerateErrorFn} GenerateErrorFn */
+/** @typedef {import("./Module").BuildInfo} BuildInfo */
+/** @typedef {import("./Module").BuildMeta} BuildMeta */
+/** @typedef {import("./Module").CodeGenerationContext} CodeGenerationContext */
+/** @typedef {import("./Module").CodeGenerationResult} CodeGenerationResult */
+/** @typedef {import("./Module").ConcatenationBailoutReasonContext} ConcatenationBailoutReasonContext */
+/** @typedef {import("./Module").KnownBuildInfo} KnownBuildInfo */
+/** @typedef {import("./Module").LibIdentOptions} LibIdentOptions */
+/** @typedef {import("./Module").NeedBuildContext} NeedBuildContext */
+/** @typedef {import("./Module").NeedBuildCallback} NeedBuildCallback */
+/** @typedef {import("./Module").BuildCallback} BuildCallback */
+/** @typedef {import("./Generator").SourceTypes} SourceTypes */
+/** @typedef {import("./Module").UnsafeCacheData} UnsafeCacheData */
+/** @typedef {import("./ModuleGraph")} ModuleGraph */
+/** @typedef {import("./ModuleGraphConnection").ConnectionState} ConnectionState */
+/** @typedef {import("./ModuleTypeConstants").JavaScriptModuleTypes} JavaScriptModuleTypes */
+/** @typedef {import("./NormalModuleFactory")} NormalModuleFactory */
+/** @typedef {import("./NormalModuleFactory").ResourceDataWithData} ResourceDataWithData */
+/** @typedef {import("./NormalModuleFactory").ResourceSchemeData} ResourceSchemeData */
+/** @typedef {import("./Parser")} Parser */
+/** @typedef {import("./Parser").PreparsedAst} PreparsedAst */
+/** @typedef {import("./RequestShortener")} RequestShortener */
+/** @typedef {import("./ResolverFactory").ResolveContext} ResolveContext */
+/** @typedef {import("./ResolverFactory").ResolverWithOptions} ResolverWithOptions */
+/** @typedef {import("./ResolverFactory").ResolveRequest} ResolveRequest */
+/** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */
+/** @typedef {import("./logging/Logger").Logger} WebpackLogger */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("./util/Hash")} Hash */
+/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
+/** @typedef {import("./util/runtime").RuntimeSpec} RuntimeSpec */
+/** @typedef {import("../declarations/WebpackOptions").HashFunction} HashFunction */
+/** @typedef {import("./util/identifier").AssociatedObjectForCache} AssociatedObjectForCache */
+/**
+ * @template T
+ * @typedef {import("./util/deprecation").FakeHook} FakeHook
+ */
+
+/** @typedef {{ [k: string]: EXPECTED_ANY }} ParserOptions */
+/** @typedef {{ [k: string]: EXPECTED_ANY }} GeneratorOptions */
+
+/**
+ * @template T
+ * @typedef {import("../declarations/LoaderContext").LoaderContext} LoaderContext
+ */
+
+/**
+ * @template T
+ * @typedef {import("../declarations/LoaderContext").NormalModuleLoaderContext} NormalModuleLoaderContext
+ */
 
-/** @typedef {import("./util/createHash").Hash} Hash */
+/**
+ * @typedef {object} SourceMap
+ * @property {number} version
+ * @property {string[]} sources
+ * @property {string} mappings
+ * @property {string=} file
+ * @property {string=} sourceRoot
+ * @property {string[]=} sourcesContent
+ * @property {string[]=} names
+ * @property {string=} debugId
+ */
+
+const getInvalidDependenciesModuleWarning = memoize(() =>
+	require("./InvalidDependenciesModuleWarning")
+);
+const getValidate = memoize(() => require("schema-utils").validate);
+
+const ABSOLUTE_PATH_REGEX = /^([a-zA-Z]:\\|\\\\|\/)/;
+
+/**
+ * @typedef {object} LoaderItem
+ * @property {string} loader
+ * @property {string | null | undefined | Record} options
+ * @property {string?} ident
+ * @property {string?} type
+ */
+
+/**
+ * @param {string} context absolute context path
+ * @param {string} source a source path
+ * @param {AssociatedObjectForCache=} associatedObjectForCache an object to which the cache will be attached
+ * @returns {string} new source path
+ */
+const contextifySourceUrl = (context, source, associatedObjectForCache) => {
+	if (source.startsWith("webpack://")) return source;
+	return `webpack://${makePathsRelative(
+		context,
+		source,
+		associatedObjectForCache
+	)}`;
+};
 
-const asString = buf => {
-	if (Buffer.isBuffer(buf)) {
-		return buf.toString("utf-8");
+/**
+ * @param {string} context absolute context path
+ * @param {SourceMap} sourceMap a source map
+ * @param {AssociatedObjectForCache=} associatedObjectForCache an object to which the cache will be attached
+ * @returns {SourceMap} new source map
+ */
+const contextifySourceMap = (context, sourceMap, associatedObjectForCache) => {
+	if (!Array.isArray(sourceMap.sources)) return sourceMap;
+	const { sourceRoot } = sourceMap;
+	/** @type {(source: string) => string} */
+	const mapper = !sourceRoot
+		? source => source
+		: sourceRoot.endsWith("/")
+			? source =>
+					source.startsWith("/")
+						? `${sourceRoot.slice(0, -1)}${source}`
+						: `${sourceRoot}${source}`
+			: source =>
+					source.startsWith("/")
+						? `${sourceRoot}${source}`
+						: `${sourceRoot}/${source}`;
+	const newSources = sourceMap.sources.map(source =>
+		contextifySourceUrl(context, mapper(source), associatedObjectForCache)
+	);
+	return {
+		...sourceMap,
+		file: "x",
+		sourceRoot: undefined,
+		sources: newSources
+	};
+};
+
+/**
+ * @param {string | Buffer} input the input
+ * @returns {string} the converted string
+ */
+const asString = input => {
+	if (Buffer.isBuffer(input)) {
+		return input.toString("utf-8");
 	}
-	return buf;
+	return input;
 };
 
-const asBuffer = str => {
-	if (!Buffer.isBuffer(str)) {
-		return Buffer.from(str, "utf-8");
+/**
+ * @param {string | Buffer} input the input
+ * @returns {Buffer} the converted buffer
+ */
+const asBuffer = input => {
+	if (!Buffer.isBuffer(input)) {
+		return Buffer.from(input, "utf-8");
 	}
-	return str;
+	return input;
 };
 
 class NonErrorEmittedError extends WebpackError {
+	/**
+	 * @param {EXPECTED_ANY} error value which is not an instance of Error
+	 */
 	constructor(error) {
 		super();
 
 		this.name = "NonErrorEmittedError";
-		this.message = "(Emitted value instead of an instance of Error) " + error;
-
-		Error.captureStackTrace(this, this.constructor);
+		this.message = `(Emitted value instead of an instance of Error) ${error}`;
 	}
 }
 
+makeSerializable(
+	NonErrorEmittedError,
+	"webpack/lib/NormalModule",
+	"NonErrorEmittedError"
+);
+
+/** @typedef {[string | Buffer, string | SourceMapSource, PreparsedAst]}  Result */
+
+/**
+ * @typedef {object} NormalModuleCompilationHooks
+ * @property {SyncHook<[LoaderContext, NormalModule]>} loader
+ * @property {SyncHook<[LoaderItem[], NormalModule, LoaderContext]>} beforeLoaders
+ * @property {SyncHook<[NormalModule]>} beforeParse
+ * @property {SyncHook<[NormalModule]>} beforeSnapshot
+ * @property {HookMap>>} readResourceForScheme
+ * @property {HookMap], string | Buffer | null>>} readResource
+ * @property {SyncWaterfallHook<[Result, NormalModule]>} processResult
+ * @property {AsyncSeriesBailHook<[NormalModule, NeedBuildContext], boolean>} needBuild
+ */
+
 /**
- * @typedef {Object} CachedSourceEntry
- * @property {TODO} source the generated source
- * @property {string} hash the hash value
+ * @typedef {object} NormalModuleCreateData
+ * @property {string=} layer an optional layer in which the module is
+ * @property {JavaScriptModuleTypes | ""} type module type. When deserializing, this is set to an empty string "".
+ * @property {string} request request string
+ * @property {string} userRequest request intended by user (without loaders from config)
+ * @property {string} rawRequest request without resolving
+ * @property {LoaderItem[]} loaders list of loaders
+ * @property {string} resource path + query of the real resource
+ * @property {(ResourceSchemeData & Partial)=} resourceResolveData resource resolve data
+ * @property {string} context context directory for resolving
+ * @property {string=} matchResource path + query of the matched resource (virtual)
+ * @property {Parser} parser the parser used
+ * @property {ParserOptions=} parserOptions the options of the parser used
+ * @property {Generator} generator the generator used
+ * @property {GeneratorOptions=} generatorOptions the options of the generator used
+ * @property {ResolveOptions=} resolveOptions options used for resolving requests from this module
  */
 
+/** @type {WeakMap} */
+const compilationHooksMap = new WeakMap();
+
+/** @typedef {Map} CodeGeneratorData */
+
 class NormalModule extends Module {
+	/**
+	 * @param {Compilation} compilation the compilation
+	 * @returns {NormalModuleCompilationHooks} the attached hooks
+	 */
+	static getCompilationHooks(compilation) {
+		if (!(compilation instanceof Compilation)) {
+			throw new TypeError(
+				"The 'compilation' argument must be an instance of Compilation"
+			);
+		}
+		let hooks = compilationHooksMap.get(compilation);
+		if (hooks === undefined) {
+			hooks = {
+				loader: new SyncHook(["loaderContext", "module"]),
+				beforeLoaders: new SyncHook(["loaders", "module", "loaderContext"]),
+				beforeParse: new SyncHook(["module"]),
+				beforeSnapshot: new SyncHook(["module"]),
+				// TODO webpack 6 deprecate
+				readResourceForScheme: new HookMap(scheme => {
+					const hook =
+						/** @type {NormalModuleCompilationHooks} */
+						(hooks).readResource.for(scheme);
+					return createFakeHook(
+						/** @type {AsyncSeriesBailHook<[string, NormalModule], string | Buffer | null>} */ ({
+							tap: (options, fn) =>
+								hook.tap(options, loaderContext =>
+									fn(
+										loaderContext.resource,
+										/** @type {NormalModule} */ (loaderContext._module)
+									)
+								),
+							tapAsync: (options, fn) =>
+								hook.tapAsync(options, (loaderContext, callback) =>
+									fn(
+										loaderContext.resource,
+										/** @type {NormalModule} */ (loaderContext._module),
+										callback
+									)
+								),
+							tapPromise: (options, fn) =>
+								hook.tapPromise(options, loaderContext =>
+									fn(
+										loaderContext.resource,
+										/** @type {NormalModule} */ (loaderContext._module)
+									)
+								)
+						})
+					);
+				}),
+				readResource: new HookMap(
+					() => new AsyncSeriesBailHook(["loaderContext"])
+				),
+				processResult: new SyncWaterfallHook(["result", "module"]),
+				needBuild: new AsyncSeriesBailHook(["module", "context"])
+			};
+			compilationHooksMap.set(
+				compilation,
+				/** @type {NormalModuleCompilationHooks} */ (hooks)
+			);
+		}
+		return /** @type {NormalModuleCompilationHooks} */ (hooks);
+	}
+
+	/**
+	 * @param {NormalModuleCreateData} options options object
+	 */
 	constructor({
+		layer,
 		type,
 		request,
 		userRequest,
 		rawRequest,
 		loaders,
 		resource,
+		resourceResolveData,
+		context,
 		matchResource,
 		parser,
+		parserOptions,
 		generator,
+		generatorOptions,
 		resolveOptions
 	}) {
-		super(type, getContext(resource));
+		super(type, context || getContext(resource), layer);
 
 		// Info from Factory
+		/** @type {string} */
 		this.request = request;
+		/** @type {string} */
 		this.userRequest = userRequest;
+		/** @type {string} */
 		this.rawRequest = rawRequest;
-		this.binary = type.startsWith("webassembly");
+		/** @type {boolean} */
+		this.binary = /^(asset|webassembly)\b/.test(type);
+		/** @type {undefined | Parser} */
 		this.parser = parser;
+		/** @type {undefined | ParserOptions} */
+		this.parserOptions = parserOptions;
+		/** @type {undefined | Generator} */
 		this.generator = generator;
+		/** @type {undefined | GeneratorOptions} */
+		this.generatorOptions = generatorOptions;
+		/** @type {string} */
 		this.resource = resource;
+		this.resourceResolveData = resourceResolveData;
+		/** @type {string | undefined} */
 		this.matchResource = matchResource;
+		/** @type {LoaderItem[]} */
 		this.loaders = loaders;
-		if (resolveOptions !== undefined) this.resolveOptions = resolveOptions;
+		if (resolveOptions !== undefined) {
+			// already declared in super class
+			this.resolveOptions = resolveOptions;
+		}
 
 		// Info from Build
+		/** @type {WebpackError | null} */
 		this.error = null;
+		/**
+		 * @private
+		 * @type {Source | null}
+		 */
 		this._source = null;
-		this._buildHash = "";
-		this.buildTimestamp = undefined;
-		/** @private @type {Map} */
-		this._cachedSources = new Map();
-
-		// Options for the NormalModule set by plugins
-		// TODO refactor this -> options object filled from Factory
-		this.useSourceMap = false;
-		this.lineToLine = false;
+		/**
+		 * @private
+		 * @type {Map | undefined}
+		 */
+		this._sourceSizes = undefined;
+		/**
+		 * @private
+		 * @type {undefined | SourceTypes}
+		 */
+		this._sourceTypes = undefined;
 
 		// Cache
 		this._lastSuccessfulBuildMeta = {};
+		this._forceBuild = true;
+		this._isEvaluatingSideEffects = false;
+		/** @type {WeakSet | undefined} */
+		this._addedSideEffectsBailout = undefined;
+		/** @type {CodeGeneratorData} */
+		this._codeGeneratorData = new Map();
 	}
 
+	/**
+	 * @returns {string} a unique identifier of the module
+	 */
 	identifier() {
-		return this.request;
+		if (this.layer === null) {
+			if (this.type === JAVASCRIPT_MODULE_TYPE_AUTO) {
+				return this.request;
+			}
+			return `${this.type}|${this.request}`;
+		}
+		return `${this.type}|${this.request}|${this.layer}`;
 	}
 
+	/**
+	 * @param {RequestShortener} requestShortener the request shortener
+	 * @returns {string} a user readable identifier of the module
+	 */
 	readableIdentifier(requestShortener) {
-		return requestShortener.shorten(this.userRequest);
+		return /** @type {string} */ (requestShortener.shorten(this.userRequest));
 	}
 
+	/**
+	 * @param {LibIdentOptions} options options
+	 * @returns {string | null} an identifier for library inclusion
+	 */
 	libIdent(options) {
-		return contextify(options.context, this.userRequest);
+		let ident = contextify(
+			options.context,
+			this.userRequest,
+			options.associatedObjectForCache
+		);
+		if (this.layer) ident = `(${this.layer})/${ident}`;
+		return ident;
 	}
 
+	/**
+	 * @returns {string | null} absolute path which should be used for condition matching (usually the resource path)
+	 */
 	nameForCondition() {
 		const resource = this.matchResource || this.resource;
 		const idx = resource.indexOf("?");
-		if (idx >= 0) return resource.substr(0, idx);
+		if (idx >= 0) return resource.slice(0, idx);
 		return resource;
 	}
 
+	/**
+	 * Assuming this module is in the cache. Update the (cached) module with
+	 * the fresh module from the factory. Usually updates internal references
+	 * and properties.
+	 * @param {Module} module fresh module
+	 * @returns {void}
+	 */
 	updateCacheModule(module) {
-		this.type = module.type;
-		this.request = module.request;
-		this.userRequest = module.userRequest;
-		this.rawRequest = module.rawRequest;
-		this.parser = module.parser;
-		this.generator = module.generator;
-		this.resource = module.resource;
-		this.matchResource = module.matchResource;
-		this.loaders = module.loaders;
-		this.resolveOptions = module.resolveOptions;
-	}
-
-	createSourceForAsset(name, content, sourceMap) {
-		if (!sourceMap) {
-			return new RawSource(content);
+		super.updateCacheModule(module);
+		const m = /** @type {NormalModule} */ (module);
+		this.binary = m.binary;
+		this.request = m.request;
+		this.userRequest = m.userRequest;
+		this.rawRequest = m.rawRequest;
+		this.parser = m.parser;
+		this.parserOptions = m.parserOptions;
+		this.generator = m.generator;
+		this.generatorOptions = m.generatorOptions;
+		this.resource = m.resource;
+		this.resourceResolveData = m.resourceResolveData;
+		this.context = m.context;
+		this.matchResource = m.matchResource;
+		this.loaders = m.loaders;
+	}
+
+	/**
+	 * Assuming this module is in the cache. Remove internal references to allow freeing some memory.
+	 */
+	cleanupForCache() {
+		// Make sure to cache types and sizes before cleanup when this module has been built
+		// They are accessed by the stats and we don't want them to crash after cleanup
+		// TODO reconsider this for webpack 6
+		if (this.buildInfo) {
+			if (this._sourceTypes === undefined) this.getSourceTypes();
+			for (const type of /** @type {SourceTypes} */ (this._sourceTypes)) {
+				this.size(type);
+			}
 		}
+		super.cleanupForCache();
+		this.parser = undefined;
+		this.parserOptions = undefined;
+		this.generator = undefined;
+		this.generatorOptions = undefined;
+	}
+
+	/**
+	 * Module should be unsafe cached. Get data that's needed for that.
+	 * This data will be passed to restoreFromUnsafeCache later.
+	 * @returns {UnsafeCacheData} cached data
+	 */
+	getUnsafeCacheData() {
+		const data = super.getUnsafeCacheData();
+		data.parserOptions = this.parserOptions;
+		data.generatorOptions = this.generatorOptions;
+		return data;
+	}
+
+	/**
+	 * restore unsafe cache data
+	 * @param {UnsafeCacheData} unsafeCacheData data from getUnsafeCacheData
+	 * @param {NormalModuleFactory} normalModuleFactory the normal module factory handling the unsafe caching
+	 */
+	restoreFromUnsafeCache(unsafeCacheData, normalModuleFactory) {
+		this._restoreFromUnsafeCache(unsafeCacheData, normalModuleFactory);
+	}
+
+	/**
+	 * restore unsafe cache data
+	 * @param {UnsafeCacheData} unsafeCacheData data from getUnsafeCacheData
+	 * @param {NormalModuleFactory} normalModuleFactory the normal module factory handling the unsafe caching
+	 */
+	_restoreFromUnsafeCache(unsafeCacheData, normalModuleFactory) {
+		super._restoreFromUnsafeCache(unsafeCacheData, normalModuleFactory);
+		this.parserOptions = unsafeCacheData.parserOptions;
+		this.parser = normalModuleFactory.getParser(this.type, this.parserOptions);
+		this.generatorOptions = unsafeCacheData.generatorOptions;
+		this.generator = normalModuleFactory.getGenerator(
+			this.type,
+			this.generatorOptions
+		);
+		// we assume the generator behaves identically and keep cached sourceTypes/Sizes
+	}
+
+	/**
+	 * @param {string} context the compilation context
+	 * @param {string} name the asset name
+	 * @param {string | Buffer} content the content
+	 * @param {(string | SourceMap)=} sourceMap an optional source map
+	 * @param {AssociatedObjectForCache=} associatedObjectForCache object for caching
+	 * @returns {Source} the created source
+	 */
+	createSourceForAsset(
+		context,
+		name,
+		content,
+		sourceMap,
+		associatedObjectForCache
+	) {
+		if (sourceMap) {
+			if (
+				typeof sourceMap === "string" &&
+				(this.useSourceMap || this.useSimpleSourceMap)
+			) {
+				return new OriginalSource(
+					content,
+					contextifySourceUrl(context, sourceMap, associatedObjectForCache)
+				);
+			}
 
-		if (typeof sourceMap === "string") {
-			return new OriginalSource(content, sourceMap);
+			if (this.useSourceMap) {
+				return new SourceMapSource(
+					content,
+					name,
+					contextifySourceMap(
+						context,
+						/** @type {SourceMap} */ (sourceMap),
+						associatedObjectForCache
+					)
+				);
+			}
 		}
 
-		return new SourceMapSource(content, name, sourceMap);
+		return new RawSource(content);
 	}
 
-	createLoaderContext(resolver, options, compilation, fs) {
-		const requestShortener = compilation.runtimeTemplate.requestShortener;
+	/**
+	 * @private
+	 * @template T
+	 * @param {ResolverWithOptions} resolver a resolver
+	 * @param {WebpackOptions} options webpack options
+	 * @param {Compilation} compilation the compilation
+	 * @param {InputFileSystem} fs file system from reading
+	 * @param {NormalModuleCompilationHooks} hooks the hooks
+	 * @returns {import("../declarations/LoaderContext").LoaderContext} loader context
+	 */
+	_createLoaderContext(resolver, options, compilation, fs, hooks) {
+		const { requestShortener } = compilation.runtimeTemplate;
+		const getCurrentLoaderName = () => {
+			const currentLoader = this.getCurrentLoader(
+				/** @type {LoaderContext} */ (loaderContext)
+			);
+			if (!currentLoader) return "(not in loader scope)";
+			return requestShortener.shorten(currentLoader.loader);
+		};
+		/**
+		 * @returns {ResolveContext} resolve context
+		 */
+		const getResolveContext = () => ({
+			fileDependencies: {
+				add: d =>
+					/** @type {LoaderContext} */ (
+						loaderContext
+					).addDependency(d)
+			},
+			contextDependencies: {
+				add: d =>
+					/** @type {LoaderContext} */ (
+						loaderContext
+					).addContextDependency(d)
+			},
+			missingDependencies: {
+				add: d =>
+					/** @type {LoaderContext} */ (
+						loaderContext
+					).addMissingDependency(d)
+			}
+		});
+		const getAbsolutify = memoize(() =>
+			absolutify.bindCache(compilation.compiler.root)
+		);
+		const getAbsolutifyInContext = memoize(() =>
+			absolutify.bindContextCache(
+				/** @type {string} */
+				(this.context),
+				compilation.compiler.root
+			)
+		);
+		const getContextify = memoize(() =>
+			contextify.bindCache(compilation.compiler.root)
+		);
+		const getContextifyInContext = memoize(() =>
+			contextify.bindContextCache(
+				/** @type {string} */
+				(this.context),
+				compilation.compiler.root
+			)
+		);
+		const utils = {
+			/**
+			 * @param {string} context context
+			 * @param {string} request request
+			 * @returns {string} result
+			 */
+			absolutify: (context, request) =>
+				context === this.context
+					? getAbsolutifyInContext()(request)
+					: getAbsolutify()(context, request),
+			/**
+			 * @param {string} context context
+			 * @param {string} request request
+			 * @returns {string} result
+			 */
+			contextify: (context, request) =>
+				context === this.context
+					? getContextifyInContext()(request)
+					: getContextify()(context, request),
+			/**
+			 * @param {HashFunction=} type type
+			 * @returns {Hash} hash
+			 */
+			createHash: type =>
+				createHash(
+					type ||
+						/** @type {HashFunction} */
+						(compilation.outputOptions.hashFunction)
+				)
+		};
+		/** @type {import("../declarations/LoaderContext").NormalModuleLoaderContext} */
 		const loaderContext = {
 			version: 2,
+			/**
+			 * @param {import("../declarations/LoaderContext").Schema=} schema schema
+			 * @returns {T} options
+			 */
+			getOptions: schema => {
+				const loader = this.getCurrentLoader(
+					/** @type {LoaderContext} */ (loaderContext)
+				);
+
+				let { options } = /** @type {LoaderItem} */ (loader);
+
+				if (typeof options === "string") {
+					if (options.startsWith("{") && options.endsWith("}")) {
+						try {
+							options = parseJson(options);
+						} catch (err) {
+							throw new Error(
+								`Cannot parse string options: ${/** @type {Error} */ (err).message}`
+							);
+						}
+					} else {
+						options = querystring.parse(options, "&", "=", {
+							maxKeys: 0
+						});
+					}
+				}
+
+				if (options === null || options === undefined) {
+					options = {};
+				}
+
+				if (schema) {
+					let name = "Loader";
+					let baseDataPath = "options";
+					let match;
+					if (schema.title && (match = /^(.+) (.+)$/.exec(schema.title))) {
+						[, name, baseDataPath] = match;
+					}
+					getValidate()(schema, /** @type {EXPECTED_OBJECT} */ (options), {
+						name,
+						baseDataPath
+					});
+				}
+
+				return /** @type {T} */ (options);
+			},
 			emitWarning: warning => {
 				if (!(warning instanceof Error)) {
 					warning = new NonErrorEmittedError(warning);
 				}
-				const currentLoader = this.getCurrentLoader(loaderContext);
-				this.warnings.push(
-					new ModuleWarning(this, warning, {
-						from: requestShortener.shorten(currentLoader.loader)
+				this.addWarning(
+					new ModuleWarning(warning, {
+						from: getCurrentLoaderName()
 					})
 				);
 			},
@@ -164,68 +736,119 @@ class NormalModule extends Module {
 				if (!(error instanceof Error)) {
 					error = new NonErrorEmittedError(error);
 				}
-				const currentLoader = this.getCurrentLoader(loaderContext);
-				this.errors.push(
-					new ModuleError(this, error, {
-						from: requestShortener.shorten(currentLoader.loader)
+				this.addError(
+					new ModuleError(error, {
+						from: getCurrentLoaderName()
 					})
 				);
 			},
-			// TODO remove in webpack 5
-			exec: (code, filename) => {
-				// @ts-ignore Argument of type 'this' is not assignable to parameter of type 'Module'.
-				const module = new NativeModule(filename, this);
-				// @ts-ignore _nodeModulePaths is deprecated and undocumented Node.js API
-				module.paths = NativeModule._nodeModulePaths(this.context);
-				module.filename = filename;
-				module._compile(code, filename);
-				return module.exports;
+			getLogger: name => {
+				const currentLoader = this.getCurrentLoader(
+					/** @type {LoaderContext} */ (loaderContext)
+				);
+				return compilation.getLogger(() =>
+					[currentLoader && currentLoader.loader, name, this.identifier()]
+						.filter(Boolean)
+						.join("|")
+				);
 			},
 			resolve(context, request, callback) {
-				resolver.resolve({}, context, request, {}, callback);
+				resolver.resolve({}, context, request, getResolveContext(), callback);
 			},
 			getResolve(options) {
 				const child = options ? resolver.withOptions(options) : resolver;
-				return (context, request, callback) => {
-					if (callback) {
-						child.resolve({}, context, request, {}, callback);
-					} else {
-						return new Promise((resolve, reject) => {
-							child.resolve({}, context, request, {}, (err, result) => {
-								if (err) reject(err);
-								else resolve(result);
+				return /** @type {ReturnType["getResolve"]>} */ (
+					(context, request, callback) => {
+						if (callback) {
+							child.resolve(
+								{},
+								context,
+								request,
+								getResolveContext(),
+								callback
+							);
+						} else {
+							return new Promise((resolve, reject) => {
+								child.resolve(
+									{},
+									context,
+									request,
+									getResolveContext(),
+									(err, result) => {
+										if (err) reject(err);
+										else resolve(result);
+									}
+								);
 							});
-						});
+						}
 					}
-				};
+				);
 			},
-			emitFile: (name, content, sourceMap) => {
-				if (!this.buildInfo.assets) {
-					this.buildInfo.assets = Object.create(null);
+			emitFile: (name, content, sourceMap, assetInfo) => {
+				const buildInfo = /** @type {BuildInfo} */ (this.buildInfo);
+
+				if (!buildInfo.assets) {
+					buildInfo.assets = Object.create(null);
+					buildInfo.assetsInfo = new Map();
 				}
-				this.buildInfo.assets[name] = this.createSourceForAsset(
+
+				const assets =
+					/** @type {NonNullable} */
+					(buildInfo.assets);
+				const assetsInfo =
+					/** @type {NonNullable} */
+					(buildInfo.assetsInfo);
+
+				assets[name] = this.createSourceForAsset(
+					/** @type {string} */ (options.context),
 					name,
 					content,
-					sourceMap
+					sourceMap,
+					compilation.compiler.root
 				);
+				assetsInfo.set(name, assetInfo);
 			},
-			rootContext: options.context,
+			addBuildDependency: dep => {
+				const buildInfo = /** @type {BuildInfo} */ (this.buildInfo);
+
+				if (buildInfo.buildDependencies === undefined) {
+					buildInfo.buildDependencies = new LazySet();
+				}
+				buildInfo.buildDependencies.add(dep);
+			},
+			utils,
+			rootContext: /** @type {string} */ (options.context),
 			webpack: true,
-			sourceMap: !!this.useSourceMap,
+			sourceMap: Boolean(this.useSourceMap),
+			mode: options.mode || "production",
+			hashFunction: /** @type {string} */ (options.output.hashFunction),
+			hashDigest: /** @type {string} */ (options.output.hashDigest),
+			hashDigestLength: /** @type {number} */ (options.output.hashDigestLength),
+			hashSalt: /** @type {string} */ (options.output.hashSalt),
 			_module: this,
 			_compilation: compilation,
 			_compiler: compilation.compiler,
-			fs: fs
+			fs
 		};
 
-		compilation.hooks.normalModuleLoader.call(loaderContext, this);
-		if (options.loader) {
-			Object.assign(loaderContext, options.loader);
-		}
+		Object.assign(loaderContext, options.loader);
 
-		return loaderContext;
+		// After `hooks.loader.call` is called, the loaderContext is typed as LoaderContext
+		hooks.loader.call(
+			/** @type {LoaderContext} */
+			(loaderContext),
+			this
+		);
+
+		return /** @type {LoaderContext} */ (loaderContext);
 	}
 
+	// TODO remove `loaderContext` in webpack@6
+	/**
+	 * @param {LoaderContext} loaderContext loader context
+	 * @param {number} index index
+	 * @returns {LoaderItem | null} loader
+	 */
 	getCurrentLoader(loaderContext, index = loaderContext.loaderIndex) {
 		if (
 			this.loaders &&
@@ -239,127 +862,250 @@ class NormalModule extends Module {
 		return null;
 	}
 
-	createSource(source, resourceBuffer, sourceMap) {
+	/**
+	 * @param {string} context the compilation context
+	 * @param {string | Buffer} content the content
+	 * @param {(string | SourceMapSource | null)=} sourceMap an optional source map
+	 * @param {AssociatedObjectForCache=} associatedObjectForCache object for caching
+	 * @returns {Source} the created source
+	 */
+	createSource(context, content, sourceMap, associatedObjectForCache) {
+		if (Buffer.isBuffer(content)) {
+			return new RawSource(content);
+		}
+
 		// if there is no identifier return raw source
 		if (!this.identifier) {
-			return new RawSource(source);
+			return new RawSource(content);
 		}
 
 		// from here on we assume we have an identifier
 		const identifier = this.identifier();
 
-		if (this.lineToLine && resourceBuffer) {
-			return new LineToLineMappedSource(
-				source,
-				identifier,
-				asString(resourceBuffer)
-			);
-		}
-
 		if (this.useSourceMap && sourceMap) {
-			return new SourceMapSource(source, identifier, sourceMap);
+			return new SourceMapSource(
+				content,
+				contextifySourceUrl(context, identifier, associatedObjectForCache),
+				contextifySourceMap(
+					context,
+					/** @type {TODO} */ (sourceMap),
+					associatedObjectForCache
+				)
+			);
 		}
 
-		if (Buffer.isBuffer(source)) {
-			// @ts-ignore
-			// TODO We need to fix @types/webpack-sources to allow RawSource to take a Buffer | string
-			return new RawSource(source);
+		if (this.useSourceMap || this.useSimpleSourceMap) {
+			return new OriginalSource(
+				content,
+				contextifySourceUrl(context, identifier, associatedObjectForCache)
+			);
 		}
 
-		return new OriginalSource(source, identifier);
+		return new RawSource(content);
 	}
 
-	doBuild(options, compilation, resolver, fs, callback) {
-		const loaderContext = this.createLoaderContext(
+	/**
+	 * @param {WebpackOptions} options webpack options
+	 * @param {Compilation} compilation the compilation
+	 * @param {ResolverWithOptions} resolver the resolver
+	 * @param {InputFileSystem} fs the file system
+	 * @param {NormalModuleCompilationHooks} hooks the hooks
+	 * @param {BuildCallback} callback callback function
+	 * @returns {void}
+	 */
+	_doBuild(options, compilation, resolver, fs, hooks, callback) {
+		const loaderContext = this._createLoaderContext(
 			resolver,
 			options,
 			compilation,
-			fs
+			fs,
+			hooks
 		);
 
+		/**
+		 * @param {Error | null} err err
+		 * @param {(Result | null)=} _result result
+		 * @returns {void}
+		 */
+		const processResult = (err, _result) => {
+			if (err) {
+				if (!(err instanceof Error)) {
+					err = new NonErrorEmittedError(err);
+				}
+				const currentLoader = this.getCurrentLoader(loaderContext);
+				const error = new ModuleBuildError(err, {
+					from:
+						currentLoader &&
+						compilation.runtimeTemplate.requestShortener.shorten(
+							currentLoader.loader
+						)
+				});
+				return callback(error);
+			}
+			const result = hooks.processResult.call(
+				/** @type {Result} */ (_result),
+				this
+			);
+			const source = result[0];
+			const sourceMap = result.length >= 1 ? result[1] : null;
+			const extraInfo = result.length >= 2 ? result[2] : null;
+
+			if (!Buffer.isBuffer(source) && typeof source !== "string") {
+				const currentLoader = this.getCurrentLoader(loaderContext, 0);
+				const err = new Error(
+					`Final loader (${
+						currentLoader
+							? compilation.runtimeTemplate.requestShortener.shorten(
+									currentLoader.loader
+								)
+							: "unknown"
+					}) didn't return a Buffer or String`
+				);
+				const error = new ModuleBuildError(err);
+				return callback(error);
+			}
+
+			const isBinaryModule =
+				this.generatorOptions && this.generatorOptions.binary !== undefined
+					? this.generatorOptions.binary
+					: this.binary;
+
+			this._source = this.createSource(
+				/** @type {string} */ (options.context),
+				isBinaryModule ? asBuffer(source) : asString(source),
+				sourceMap,
+				compilation.compiler.root
+			);
+			if (this._sourceSizes !== undefined) this._sourceSizes.clear();
+			this._ast =
+				typeof extraInfo === "object" &&
+				extraInfo !== null &&
+				extraInfo.webpackAST !== undefined
+					? extraInfo.webpackAST
+					: null;
+			return callback();
+		};
+
+		const buildInfo = /** @type {BuildInfo} */ (this.buildInfo);
+
+		buildInfo.fileDependencies = new LazySet();
+		buildInfo.contextDependencies = new LazySet();
+		buildInfo.missingDependencies = new LazySet();
+		buildInfo.cacheable = true;
+
+		try {
+			hooks.beforeLoaders.call(
+				this.loaders,
+				this,
+				/** @type {LoaderContext} */
+				(loaderContext)
+			);
+		} catch (err) {
+			processResult(/** @type {Error} */ (err));
+			return;
+		}
+
+		if (this.loaders.length > 0) {
+			/** @type {BuildInfo} */
+			(this.buildInfo).buildDependencies = new LazySet();
+		}
+
 		runLoaders(
 			{
 				resource: this.resource,
 				loaders: this.loaders,
 				context: loaderContext,
-				readResource: fs.readFile.bind(fs)
+				/**
+				 * @param {LoaderContext} loaderContext the loader context
+				 * @param {string} resourcePath the resource Path
+				 * @param {(err: Error | null, result?: string | Buffer) => void} callback callback
+				 */
+				processResource: (loaderContext, resourcePath, callback) => {
+					const resource = loaderContext.resource;
+					const scheme = getScheme(resource);
+					hooks.readResource
+						.for(scheme)
+						.callAsync(loaderContext, (err, result) => {
+							if (err) return callback(err);
+							if (typeof result !== "string" && !result) {
+								return callback(
+									new UnhandledSchemeError(
+										/** @type {string} */
+										(scheme),
+										resource
+									)
+								);
+							}
+							return callback(null, result);
+						});
+				}
 			},
 			(err, result) => {
-				if (result) {
-					this.buildInfo.cacheable = result.cacheable;
-					this.buildInfo.fileDependencies = new Set(result.fileDependencies);
-					this.buildInfo.contextDependencies = new Set(
-						result.contextDependencies
+				// Cleanup loaderContext to avoid leaking memory in ICs
+				loaderContext._compilation =
+					loaderContext._compiler =
+					loaderContext._module =
+					loaderContext.fs =
+						/** @type {EXPECTED_ANY} */
+						(undefined);
+
+				if (!result) {
+					/** @type {BuildInfo} */
+					(this.buildInfo).cacheable = false;
+					return processResult(
+						err || new Error("No result from loader-runner processing"),
+						null
 					);
 				}
 
-				if (err) {
-					if (!(err instanceof Error)) {
-						err = new NonErrorEmittedError(err);
-					}
-					const currentLoader = this.getCurrentLoader(loaderContext);
-					const error = new ModuleBuildError(this, err, {
-						from:
-							currentLoader &&
-							compilation.runtimeTemplate.requestShortener.shorten(
-								currentLoader.loader
-							)
-					});
-					return callback(error);
-				}
-
-				const resourceBuffer = result.resourceBuffer;
-				const source = result.result[0];
-				const sourceMap = result.result.length >= 1 ? result.result[1] : null;
-				const extraInfo = result.result.length >= 2 ? result.result[2] : null;
-
-				if (!Buffer.isBuffer(source) && typeof source !== "string") {
-					const currentLoader = this.getCurrentLoader(loaderContext, 0);
-					const err = new Error(
-						`Final loader (${
-							currentLoader
-								? compilation.runtimeTemplate.requestShortener.shorten(
-										currentLoader.loader
-								  )
-								: "unknown"
-						}) didn't return a Buffer or String`
-					);
-					const error = new ModuleBuildError(this, err);
-					return callback(error);
+				const buildInfo = /** @type {BuildInfo} */ (this.buildInfo);
+
+				const fileDependencies =
+					/** @type {NonNullable} */
+					(buildInfo.fileDependencies);
+				const contextDependencies =
+					/** @type {NonNullable} */
+					(buildInfo.contextDependencies);
+				const missingDependencies =
+					/** @type {NonNullable} */
+					(buildInfo.missingDependencies);
+
+				fileDependencies.addAll(result.fileDependencies);
+				contextDependencies.addAll(result.contextDependencies);
+				missingDependencies.addAll(result.missingDependencies);
+				for (const loader of this.loaders) {
+					const buildDependencies =
+						/** @type {NonNullable} */
+						(buildInfo.buildDependencies);
+
+					buildDependencies.add(loader.loader);
 				}
-
-				this._source = this.createSource(
-					this.binary ? asBuffer(source) : asString(source),
-					resourceBuffer,
-					sourceMap
-				);
-				this._ast =
-					typeof extraInfo === "object" &&
-					extraInfo !== null &&
-					extraInfo.webpackAST !== undefined
-						? extraInfo.webpackAST
-						: null;
-				return callback();
+				buildInfo.cacheable = buildInfo.cacheable && result.cacheable;
+				processResult(err, result.result);
 			}
 		);
 	}
 
+	/**
+	 * @param {WebpackError} error the error
+	 * @returns {void}
+	 */
 	markModuleAsErrored(error) {
 		// Restore build meta from successful build to keep importing state
-		this.buildMeta = Object.assign({}, this._lastSuccessfulBuildMeta);
-
+		this.buildMeta = { ...this._lastSuccessfulBuildMeta };
 		this.error = error;
-		this.errors.push(this.error);
-		this._source = new RawSource(
-			"throw new Error(" + JSON.stringify(this.error.message) + ");"
-		);
-		this._ast = null;
+		this.addError(error);
 	}
 
+	/**
+	 * @param {Exclude} rule rule
+	 * @param {string} content content
+	 * @returns {boolean} result
+	 */
 	applyNoParseRule(rule, content) {
 		// must start with "rule" if rule is a string
 		if (typeof rule === "string") {
-			return content.indexOf(rule) === 0;
+			return content.startsWith(rule);
 		}
 
 		if (typeof rule === "function") {
@@ -369,9 +1115,11 @@ class NormalModule extends Module {
 		return rule.test(content);
 	}
 
-	// check if module should not be parsed
-	// returns "true" if the module should !not! be parsed
-	// returns "false" if the module !must! be parsed
+	/**
+	 * @param {undefined | NoParse} noParseRule no parse rule
+	 * @param {string} request request
+	 * @returns {boolean} check if module should not be parsed, returns "true" if the module should !not! be parsed, returns "false" if the module !must! be parsed
+	 */
 	shouldPreventParsing(noParseRule, request) {
 		// if no noParseRule exists, return false
 		// the module !must! be parsed.
@@ -397,36 +1145,61 @@ class NormalModule extends Module {
 		return false;
 	}
 
+	/**
+	 * @param {Compilation} compilation compilation
+	 * @private
+	 */
 	_initBuildHash(compilation) {
-		const hash = createHash(compilation.outputOptions.hashFunction);
+		const hash = createHash(
+			/** @type {HashFunction} */
+			(compilation.outputOptions.hashFunction)
+		);
 		if (this._source) {
 			hash.update("source");
 			this._source.updateHash(hash);
 		}
 		hash.update("meta");
 		hash.update(JSON.stringify(this.buildMeta));
-		this._buildHash = hash.digest("hex");
+		/** @type {BuildInfo} */
+		(this.buildInfo).hash = /** @type {string} */ (hash.digest("hex"));
 	}
 
+	/**
+	 * @param {WebpackOptions} options webpack options
+	 * @param {Compilation} compilation the compilation
+	 * @param {ResolverWithOptions} resolver the resolver
+	 * @param {InputFileSystem} fs the file system
+	 * @param {BuildCallback} callback callback function
+	 * @returns {void}
+	 */
 	build(options, compilation, resolver, fs, callback) {
-		this.buildTimestamp = Date.now();
-		this.built = true;
+		this._forceBuild = false;
 		this._source = null;
+		if (this._sourceSizes !== undefined) this._sourceSizes.clear();
+		this._sourceTypes = undefined;
 		this._ast = null;
-		this._buildHash = "";
 		this.error = null;
-		this.errors.length = 0;
-		this.warnings.length = 0;
+		this.clearWarningsAndErrors();
+		this.clearDependenciesAndBlocks();
 		this.buildMeta = {};
 		this.buildInfo = {
 			cacheable: false,
-			fileDependencies: new Set(),
-			contextDependencies: new Set()
+			parsed: true,
+			fileDependencies: undefined,
+			contextDependencies: undefined,
+			missingDependencies: undefined,
+			buildDependencies: undefined,
+			valueDependencies: undefined,
+			hash: undefined,
+			assets: undefined,
+			assetsInfo: undefined
 		};
 
-		return this.doBuild(options, compilation, resolver, fs, err => {
-			this._cachedSources.clear();
+		const startTime = compilation.compiler.fsStartTime || Date.now();
 
+		const hooks = NormalModule.getCompilationHooks(compilation);
+
+		return this._doBuild(options, compilation, resolver, fs, hooks, err => {
 			// if we have an error mark module as failed and exit
 			if (err) {
 				this.markModuleAsErrored(err);
@@ -434,124 +1207,518 @@ class NormalModule extends Module {
 				return callback();
 			}
 
-			// check if this module should !not! be parsed.
-			// if so, exit here;
-			const noParseRule = options.module && options.module.noParse;
-			if (this.shouldPreventParsing(noParseRule, this.request)) {
-				this._initBuildHash(compilation);
-				return callback();
-			}
-
+			/**
+			 * @param {Error} e error
+			 * @returns {void}
+			 */
 			const handleParseError = e => {
-				const source = this._source.source();
-				const error = new ModuleParseError(this, source, e);
+				const source = /** @type {Source} */ (this._source).source();
+				const loaders = this.loaders.map(item =>
+					contextify(
+						/** @type {string} */ (options.context),
+						item.loader,
+						compilation.compiler.root
+					)
+				);
+				const error = new ModuleParseError(source, e, loaders, this.type);
 				this.markModuleAsErrored(error);
 				this._initBuildHash(compilation);
 				return callback();
 			};
 
-			const handleParseResult = result => {
-				this._lastSuccessfulBuildMeta = this.buildMeta;
+			const handleParseResult = () => {
+				this.dependencies.sort(
+					concatComparators(
+						compareSelect(a => a.loc, compareLocations),
+						keepOriginalOrder(this.dependencies)
+					)
+				);
 				this._initBuildHash(compilation);
-				return callback();
+				this._lastSuccessfulBuildMeta =
+					/** @type {BuildMeta} */
+					(this.buildMeta);
+				return handleBuildDone();
 			};
 
-			try {
-				const result = this.parser.parse(
-					this._ast || this._source.source(),
-					{
-						current: this,
-						module: this,
-						compilation: compilation,
-						options: options
-					},
-					(err, result) => {
+			const handleBuildDone = () => {
+				try {
+					hooks.beforeSnapshot.call(this);
+				} catch (err) {
+					this.markModuleAsErrored(/** @type {WebpackError} */ (err));
+					return callback();
+				}
+
+				const snapshotOptions = compilation.options.snapshot.module;
+				const { cacheable } = /** @type {BuildInfo} */ (this.buildInfo);
+				if (!cacheable || !snapshotOptions) {
+					return callback();
+				}
+				// add warning for all non-absolute paths in fileDependencies, etc
+				// This makes it easier to find problems with watching and/or caching
+				/** @type {undefined | Set} */
+				let nonAbsoluteDependencies;
+				/**
+				 * @param {LazySet} deps deps
+				 */
+				const checkDependencies = deps => {
+					for (const dep of deps) {
+						if (!ABSOLUTE_PATH_REGEX.test(dep)) {
+							if (nonAbsoluteDependencies === undefined)
+								nonAbsoluteDependencies = new Set();
+							nonAbsoluteDependencies.add(dep);
+							deps.delete(dep);
+							try {
+								const depWithoutGlob = dep.replace(/[\\/]?\*.*$/, "");
+								const absolute = join(
+									compilation.fileSystemInfo.fs,
+									/** @type {string} */
+									(this.context),
+									depWithoutGlob
+								);
+								if (absolute !== dep && ABSOLUTE_PATH_REGEX.test(absolute)) {
+									(depWithoutGlob !== dep
+										? /** @type {NonNullable} */
+											(
+												/** @type {BuildInfo} */
+												(this.buildInfo).contextDependencies
+											)
+										: deps
+									).add(absolute);
+								}
+							} catch (_err) {
+								// ignore
+							}
+						}
+					}
+				};
+				const buildInfo = /** @type {BuildInfo} */ (this.buildInfo);
+				const fileDependencies =
+					/** @type {NonNullable} */
+					(buildInfo.fileDependencies);
+				const contextDependencies =
+					/** @type {NonNullable} */
+					(buildInfo.contextDependencies);
+				const missingDependencies =
+					/** @type {NonNullable} */
+					(buildInfo.missingDependencies);
+				checkDependencies(fileDependencies);
+				checkDependencies(missingDependencies);
+				checkDependencies(contextDependencies);
+				if (nonAbsoluteDependencies !== undefined) {
+					const InvalidDependenciesModuleWarning =
+						getInvalidDependenciesModuleWarning();
+					this.addWarning(
+						new InvalidDependenciesModuleWarning(this, nonAbsoluteDependencies)
+					);
+				}
+				// convert file/context/missingDependencies into filesystem snapshot
+				compilation.fileSystemInfo.createSnapshot(
+					startTime,
+					fileDependencies,
+					contextDependencies,
+					missingDependencies,
+					snapshotOptions,
+					(err, snapshot) => {
 						if (err) {
-							handleParseError(err);
-						} else {
-							handleParseResult(result);
+							this.markModuleAsErrored(err);
+							return;
 						}
+						buildInfo.fileDependencies = undefined;
+						buildInfo.contextDependencies = undefined;
+						buildInfo.missingDependencies = undefined;
+						buildInfo.snapshot = snapshot;
+						return callback();
 					}
 				);
-				if (result !== undefined) {
-					// parse is sync
-					handleParseResult(result);
-				}
-			} catch (e) {
-				handleParseError(e);
+			};
+
+			try {
+				hooks.beforeParse.call(this);
+			} catch (err) {
+				this.markModuleAsErrored(/** @type {WebpackError} */ (err));
+				this._initBuildHash(compilation);
+				return callback();
+			}
+
+			// check if this module should !not! be parsed.
+			// if so, exit here;
+			const noParseRule = options.module && options.module.noParse;
+			if (this.shouldPreventParsing(noParseRule, this.request)) {
+				// We assume that we need module and exports
+				/** @type {BuildInfo} */
+				(this.buildInfo).parsed = false;
+				this._initBuildHash(compilation);
+				return handleBuildDone();
+			}
+
+			try {
+				const source = /** @type {Source} */ (this._source).source();
+				/** @type {Parser} */
+				(this.parser).parse(this._ast || source, {
+					source,
+					current: this,
+					module: this,
+					compilation,
+					options
+				});
+			} catch (parseErr) {
+				handleParseError(/** @type {Error} */ (parseErr));
+				return;
 			}
+			handleParseResult();
 		});
 	}
 
-	getHashDigest(dependencyTemplates) {
-		// TODO webpack 5 refactor
-		let dtHash = dependencyTemplates.get("hash");
-		return `${this.hash}-${dtHash}`;
+	/**
+	 * @param {ConcatenationBailoutReasonContext} context context
+	 * @returns {string | undefined} reason why this module can't be concatenated, undefined when it can be concatenated
+	 */
+	getConcatenationBailoutReason(context) {
+		return /** @type {Generator} */ (
+			this.generator
+		).getConcatenationBailoutReason(this, context);
 	}
 
-	source(dependencyTemplates, runtimeTemplate, type = "javascript") {
-		const hashDigest = this.getHashDigest(dependencyTemplates);
-		const cacheEntry = this._cachedSources.get(type);
-		if (cacheEntry !== undefined && cacheEntry.hash === hashDigest) {
-			// We can reuse the cached source
-			return cacheEntry.source;
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @returns {ConnectionState} how this module should be connected to referencing modules when consumed for side-effects only
+	 */
+	getSideEffectsConnectionState(moduleGraph) {
+		if (this.factoryMeta !== undefined) {
+			if (this.factoryMeta.sideEffectFree) return false;
+			if (this.factoryMeta.sideEffectFree === false) return true;
+		}
+		if (this.buildMeta !== undefined && this.buildMeta.sideEffectFree) {
+			if (this._isEvaluatingSideEffects)
+				return ModuleGraphConnection.CIRCULAR_CONNECTION;
+			this._isEvaluatingSideEffects = true;
+			/** @type {ConnectionState} */
+			let current = false;
+			for (const dep of this.dependencies) {
+				const state = dep.getModuleEvaluationSideEffectsState(moduleGraph);
+				if (state === true) {
+					if (
+						this._addedSideEffectsBailout === undefined
+							? ((this._addedSideEffectsBailout = new WeakSet()), true)
+							: !this._addedSideEffectsBailout.has(moduleGraph)
+					) {
+						this._addedSideEffectsBailout.add(moduleGraph);
+						moduleGraph
+							.getOptimizationBailout(this)
+							.push(
+								() =>
+									`Dependency (${
+										dep.type
+									}) with side effects at ${formatLocation(dep.loc)}`
+							);
+					}
+					this._isEvaluatingSideEffects = false;
+					return true;
+				} else if (state !== ModuleGraphConnection.CIRCULAR_CONNECTION) {
+					current = ModuleGraphConnection.addConnectionStates(current, state);
+				}
+			}
+			this._isEvaluatingSideEffects = false;
+			// When caching is implemented here, make sure to not cache when
+			// at least one circular connection was in the loop above
+			return current;
 		}
+		return true;
+	}
 
-		const source = this.generator.generate(
-			this,
-			dependencyTemplates,
-			runtimeTemplate,
-			type
-		);
+	/**
+	 * @returns {SourceTypes} types available (do not mutate)
+	 */
+	getSourceTypes() {
+		if (this._sourceTypes === undefined) {
+			this._sourceTypes = /** @type {Generator} */ (this.generator).getTypes(
+				this
+			);
+		}
+		return this._sourceTypes;
+	}
 
-		const cachedSource = new CachedSource(source);
-		this._cachedSources.set(type, {
-			source: cachedSource,
-			hash: hashDigest
-		});
-		return cachedSource;
+	/**
+	 * @param {CodeGenerationContext} context context for code generation
+	 * @returns {CodeGenerationResult} result
+	 */
+	codeGeneration({
+		dependencyTemplates,
+		runtimeTemplate,
+		moduleGraph,
+		chunkGraph,
+		runtime,
+		concatenationScope,
+		codeGenerationResults,
+		sourceTypes
+	}) {
+		/** @type {Set} */
+		const runtimeRequirements = new Set();
+
+		const { parsed } = /** @type {BuildInfo} */ (this.buildInfo);
+
+		if (!parsed) {
+			runtimeRequirements.add(RuntimeGlobals.module);
+			runtimeRequirements.add(RuntimeGlobals.exports);
+			runtimeRequirements.add(RuntimeGlobals.thisAsExports);
+		}
+
+		/**
+		 * @type {() => CodeGeneratorData}
+		 */
+		const getData = () => this._codeGeneratorData;
+
+		const sources = new Map();
+		for (const type of sourceTypes || chunkGraph.getModuleSourceTypes(this)) {
+			// TODO webpack@6 make generateError required
+			const generator =
+				/** @type {Generator & { generateError?: GenerateErrorFn }} */
+				(this.generator);
+			const source = this.error
+				? generator.generateError
+					? generator.generateError(this.error, this, {
+							dependencyTemplates,
+							runtimeTemplate,
+							moduleGraph,
+							chunkGraph,
+							runtimeRequirements,
+							runtime,
+							concatenationScope,
+							codeGenerationResults,
+							getData,
+							type
+						})
+					: new RawSource(
+							`throw new Error(${JSON.stringify(this.error.message)});`
+						)
+				: generator.generate(this, {
+						dependencyTemplates,
+						runtimeTemplate,
+						moduleGraph,
+						chunkGraph,
+						runtimeRequirements,
+						runtime,
+						concatenationScope,
+						codeGenerationResults,
+						getData,
+						type
+					});
+
+			if (source) {
+				sources.set(type, new CachedSource(source));
+			}
+		}
+
+		/** @type {CodeGenerationResult} */
+		const resultEntry = {
+			sources,
+			runtimeRequirements,
+			data: this._codeGeneratorData
+		};
+		return resultEntry;
 	}
 
+	/**
+	 * @returns {Source | null} the original source for the module before webpack transformation
+	 */
 	originalSource() {
 		return this._source;
 	}
 
-	needRebuild(fileTimestamps, contextTimestamps) {
-		// always try to rebuild in case of an error
-		if (this.error) return true;
+	/**
+	 * @returns {void}
+	 */
+	invalidateBuild() {
+		this._forceBuild = true;
+	}
 
-		// always rebuild when module is not cacheable
-		if (!this.buildInfo.cacheable) return true;
+	/**
+	 * @param {NeedBuildContext} context context info
+	 * @param {NeedBuildCallback} callback callback function, returns true, if the module needs a rebuild
+	 * @returns {void}
+	 */
+	needBuild(context, callback) {
+		const { fileSystemInfo, compilation, valueCacheVersions } = context;
+		// build if enforced
+		if (this._forceBuild) return callback(null, true);
+
+		// always try to build in case of an error
+		if (this.error) return callback(null, true);
+
+		const { cacheable, snapshot, valueDependencies } =
+			/** @type {BuildInfo} */ (this.buildInfo);
+
+		// always build when module is not cacheable
+		if (!cacheable) return callback(null, true);
+
+		// build when there is no snapshot to check
+		if (!snapshot) return callback(null, true);
+
+		// build when valueDependencies have changed
+		if (valueDependencies) {
+			if (!valueCacheVersions) return callback(null, true);
+			for (const [key, value] of valueDependencies) {
+				if (value === undefined) return callback(null, true);
+				const current = valueCacheVersions.get(key);
+				if (
+					value !== current &&
+					(typeof value === "string" ||
+						typeof current === "string" ||
+						current === undefined ||
+						!isSubset(value, current))
+				) {
+					return callback(null, true);
+				}
+			}
+		}
 
-		// Check timestamps of all dependencies
-		// Missing timestamp -> need rebuild
-		// Timestamp bigger than buildTimestamp -> need rebuild
-		for (const file of this.buildInfo.fileDependencies) {
-			const timestamp = fileTimestamps.get(file);
-			if (!timestamp) return true;
-			if (timestamp >= this.buildTimestamp) return true;
+		// check snapshot for validity
+		fileSystemInfo.checkSnapshotValid(snapshot, (err, valid) => {
+			if (err) return callback(err);
+			if (!valid) return callback(null, true);
+			const hooks = NormalModule.getCompilationHooks(compilation);
+			hooks.needBuild.callAsync(this, context, (err, needBuild) => {
+				if (err) {
+					return callback(
+						HookWebpackError.makeWebpackError(
+							err,
+							"NormalModule.getCompilationHooks().needBuild"
+						)
+					);
+				}
+				callback(null, Boolean(needBuild));
+			});
+		});
+	}
+
+	/**
+	 * @param {string=} type the source type for which the size should be estimated
+	 * @returns {number} the estimated size of the module (must be non-zero)
+	 */
+	size(type) {
+		const cachedSize =
+			this._sourceSizes === undefined ? undefined : this._sourceSizes.get(type);
+		if (cachedSize !== undefined) {
+			return cachedSize;
 		}
-		for (const file of this.buildInfo.contextDependencies) {
-			const timestamp = contextTimestamps.get(file);
-			if (!timestamp) return true;
-			if (timestamp >= this.buildTimestamp) return true;
+		const size = Math.max(
+			1,
+			/** @type {Generator} */ (this.generator).getSize(this, type)
+		);
+		if (this._sourceSizes === undefined) {
+			this._sourceSizes = new Map();
 		}
-		// elsewise -> no rebuild needed
-		return false;
+		this._sourceSizes.set(type, size);
+		return size;
 	}
 
-	size() {
-		return this._source ? this._source.size() : -1;
+	/**
+	 * @param {LazySet} fileDependencies set where file dependencies are added to
+	 * @param {LazySet} contextDependencies set where context dependencies are added to
+	 * @param {LazySet} missingDependencies set where missing dependencies are added to
+	 * @param {LazySet} buildDependencies set where build dependencies are added to
+	 */
+	addCacheDependencies(
+		fileDependencies,
+		contextDependencies,
+		missingDependencies,
+		buildDependencies
+	) {
+		const { snapshot, buildDependencies: buildDeps } =
+			/** @type {BuildInfo} */ (this.buildInfo);
+		if (snapshot) {
+			fileDependencies.addAll(snapshot.getFileIterable());
+			contextDependencies.addAll(snapshot.getContextIterable());
+			missingDependencies.addAll(snapshot.getMissingIterable());
+		} else {
+			const {
+				fileDependencies: fileDeps,
+				contextDependencies: contextDeps,
+				missingDependencies: missingDeps
+			} = /** @type {BuildInfo} */ (this.buildInfo);
+			if (fileDeps !== undefined) fileDependencies.addAll(fileDeps);
+			if (contextDeps !== undefined) contextDependencies.addAll(contextDeps);
+			if (missingDeps !== undefined) missingDependencies.addAll(missingDeps);
+		}
+		if (buildDeps !== undefined) {
+			buildDependencies.addAll(buildDeps);
+		}
 	}
 
 	/**
 	 * @param {Hash} hash the hash used to track dependencies
+	 * @param {UpdateHashContext} context context
 	 * @returns {void}
 	 */
-	updateHash(hash) {
-		hash.update(this._buildHash);
-		super.updateHash(hash);
+	updateHash(hash, context) {
+		const buildInfo = /** @type {BuildInfo} */ (this.buildInfo);
+		hash.update(
+			/** @type {string} */
+			(buildInfo.hash)
+		);
+		/** @type {Generator} */
+		(this.generator).updateHash(hash, {
+			module: this,
+			...context
+		});
+		super.updateHash(hash, context);
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		// deserialize
+		write(this._source);
+		write(this.error);
+		write(this._lastSuccessfulBuildMeta);
+		write(this._forceBuild);
+		write(this._codeGeneratorData);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 * @returns {NormalModule} module
+	 */
+	static deserialize(context) {
+		const obj = new NormalModule({
+			// will be deserialized by Module
+			layer: /** @type {EXPECTED_ANY} */ (null),
+			type: "",
+			// will be filled by updateCacheModule
+			resource: "",
+			context: "",
+			request: /** @type {EXPECTED_ANY} */ (null),
+			userRequest: /** @type {EXPECTED_ANY} */ (null),
+			rawRequest: /** @type {EXPECTED_ANY} */ (null),
+			loaders: /** @type {EXPECTED_ANY} */ (null),
+			matchResource: /** @type {EXPECTED_ANY} */ (null),
+			parser: /** @type {EXPECTED_ANY} */ (null),
+			parserOptions: /** @type {EXPECTED_ANY} */ (null),
+			generator: /** @type {EXPECTED_ANY} */ (null),
+			generatorOptions: /** @type {EXPECTED_ANY} */ (null),
+			resolveOptions: /** @type {EXPECTED_ANY} */ (null)
+		});
+		obj.deserialize(context);
+		return obj;
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this._source = read();
+		this.error = read();
+		this._lastSuccessfulBuildMeta = read();
+		this._forceBuild = read();
+		this._codeGeneratorData = read();
+		super.deserialize(context);
 	}
 }
 
+makeSerializable(NormalModule, "webpack/lib/NormalModule");
+
 module.exports = NormalModule;
diff --git a/lib/NormalModuleFactory.js b/lib/NormalModuleFactory.js
index 23ef0ae1dde..47bedac3172 100644
--- a/lib/NormalModuleFactory.js
+++ b/lib/NormalModuleFactory.js
@@ -1,415 +1,1173 @@
 /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
 "use strict";
 
-const path = require("path");
+const { getContext } = require("loader-runner");
 const asyncLib = require("neo-async");
 const {
-	Tapable,
-	AsyncSeriesWaterfallHook,
+	AsyncSeriesBailHook,
 	SyncWaterfallHook,
 	SyncBailHook,
 	SyncHook,
 	HookMap
 } = require("tapable");
+const ChunkGraph = require("./ChunkGraph");
+const Module = require("./Module");
+const ModuleFactory = require("./ModuleFactory");
+const ModuleGraph = require("./ModuleGraph");
+const { JAVASCRIPT_MODULE_TYPE_AUTO } = require("./ModuleTypeConstants");
 const NormalModule = require("./NormalModule");
-const RawModule = require("./RawModule");
-const RuleSet = require("./RuleSet");
-const cachedMerge = require("./util/cachedMerge");
+const BasicEffectRulePlugin = require("./rules/BasicEffectRulePlugin");
+const BasicMatcherRulePlugin = require("./rules/BasicMatcherRulePlugin");
+const ObjectMatcherRulePlugin = require("./rules/ObjectMatcherRulePlugin");
+const RuleSetCompiler = require("./rules/RuleSetCompiler");
+const UseEffectRulePlugin = require("./rules/UseEffectRulePlugin");
+const LazySet = require("./util/LazySet");
+const { getScheme } = require("./util/URLAbsoluteSpecifier");
+const { cachedCleverMerge, cachedSetProperty } = require("./util/cleverMerge");
+const { join } = require("./util/fs");
+const {
+	parseResource,
+	parseResourceWithoutFragment
+} = require("./util/identifier");
+
+/** @typedef {import("../declarations/WebpackOptions").ModuleOptionsNormalized} ModuleOptions */
+/** @typedef {import("../declarations/WebpackOptions").RuleSetRule} RuleSetRule */
+/** @typedef {import("./Generator")} Generator */
+/** @typedef {import("./ModuleFactory").ModuleFactoryCallback} ModuleFactoryCallback */
+/** @typedef {import("./ModuleFactory").ModuleFactoryCreateData} ModuleFactoryCreateData */
+/** @typedef {import("./ModuleFactory").ModuleFactoryCreateDataContextInfo} ModuleFactoryCreateDataContextInfo */
+/** @typedef {import("./ModuleFactory").ModuleFactoryResult} ModuleFactoryResult */
+/** @typedef {import("./NormalModule").GeneratorOptions} GeneratorOptions */
+/** @typedef {import("./NormalModule").LoaderItem} LoaderItem */
+/** @typedef {import("./NormalModule").NormalModuleCreateData} NormalModuleCreateData */
+/** @typedef {import("./NormalModule").ParserOptions} ParserOptions */
+/** @typedef {import("./Parser")} Parser */
+/** @typedef {import("./ResolverFactory")} ResolverFactory */
+/** @typedef {import("./ResolverFactory").ResolveContext} ResolveContext */
+/** @typedef {import("./ResolverFactory").ResolveRequest} ResolveRequest */
+/** @typedef {import("./ResolverFactory").ResolverWithOptions} ResolverWithOptions */
+/** @typedef {import("./dependencies/ModuleDependency")} ModuleDependency */
+/** @typedef {import("./javascript/JavascriptParser").ImportAttributes} ImportAttributes */
+/** @typedef {import("./rules/RuleSetCompiler").RuleSetRules} RuleSetRules */
+/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
+/** @typedef {import("./util/identifier").AssociatedObjectForCache} AssociatedObjectForCache */
+
+/** @typedef {Pick} ModuleSettings */
+/** @typedef {Partial} CreateData */
+
+/**
+ * @typedef {object} ResolveData
+ * @property {ModuleFactoryCreateData["contextInfo"]} contextInfo
+ * @property {ModuleFactoryCreateData["resolveOptions"]} resolveOptions
+ * @property {string} context
+ * @property {string} request
+ * @property {ImportAttributes | undefined} assertions
+ * @property {ModuleDependency[]} dependencies
+ * @property {string} dependencyType
+ * @property {CreateData} createData
+ * @property {LazySet} fileDependencies
+ * @property {LazySet} missingDependencies
+ * @property {LazySet} contextDependencies
+ * @property {Module=} ignoredModule
+ * @property {boolean} cacheable allow to use the unsafe cache
+ */
+
+/**
+ * @typedef {object} ResourceData
+ * @property {string} resource
+ * @property {string=} path
+ * @property {string=} query
+ * @property {string=} fragment
+ * @property {string=} context
+ */
+
+/**
+ * @typedef {object} ResourceSchemeData
+ * @property {string=} mimetype mime type of the resource
+ * @property {string=} parameters additional parameters for the resource
+ * @property {"base64" | false=} encoding encoding of the resource
+ * @property {string=} encodedContent encoded content of the resource
+ */
+
+/** @typedef {ResourceData & { data: ResourceSchemeData & Partial }} ResourceDataWithData */
+
+/**
+ * @typedef {object} ParsedLoaderRequest
+ * @property {string} loader loader
+ * @property {string|undefined} options options
+ */
+
+/**
+ * @template T
+ * @callback Callback
+ * @param {(Error | null)=} err
+ * @param {T=} stats
+ * @returns {void}
+ */
 
 const EMPTY_RESOLVE_OPTIONS = {};
+/** @type {ParserOptions} */
+const EMPTY_PARSER_OPTIONS = {};
+/** @type {GeneratorOptions} */
+const EMPTY_GENERATOR_OPTIONS = {};
+/** @type {ParsedLoaderRequest[]} */
+const EMPTY_ELEMENTS = [];
 
 const MATCH_RESOURCE_REGEX = /^([^!]+)!=!/;
+const LEADING_DOT_EXTENSION_REGEX = /^[^.]/;
 
+/**
+ * @param {LoaderItem} data data
+ * @returns {string} ident
+ */
 const loaderToIdent = data => {
 	if (!data.options) {
 		return data.loader;
 	}
 	if (typeof data.options === "string") {
-		return data.loader + "?" + data.options;
+		return `${data.loader}?${data.options}`;
 	}
 	if (typeof data.options !== "object") {
 		throw new Error("loader options must be string or object");
 	}
 	if (data.ident) {
-		return data.loader + "??" + data.ident;
+		return `${data.loader}??${data.ident}`;
 	}
-	return data.loader + "?" + JSON.stringify(data.options);
+	return `${data.loader}?${JSON.stringify(data.options)}`;
 };
 
-const identToLoaderRequest = resultString => {
-	const idx = resultString.indexOf("?");
-	if (idx >= 0) {
-		const loader = resultString.substr(0, idx);
-		const options = resultString.substr(idx + 1);
-		return {
-			loader,
-			options
-		};
-	} else {
-		return {
-			loader: resultString,
-			options: undefined
-		};
+/**
+ * @param {LoaderItem[]} loaders loaders
+ * @param {string} resource resource
+ * @returns {string} stringified loaders and resource
+ */
+const stringifyLoadersAndResource = (loaders, resource) => {
+	let str = "";
+	for (const loader of loaders) {
+		str += `${loaderToIdent(loader)}!`;
 	}
+	return str + resource;
 };
 
-const dependencyCache = new WeakMap();
+/**
+ * @param {number} times times
+ * @param {(err?: null | Error) => void} callback callback
+ * @returns {(err?: null | Error) => void} callback
+ */
+const needCalls = (times, callback) => err => {
+	if (--times === 0) {
+		return callback(err);
+	}
+	if (err && times > 0) {
+		times = Number.NaN;
+		return callback(err);
+	}
+};
 
-class NormalModuleFactory extends Tapable {
-	constructor(context, resolverFactory, options) {
+/**
+ * @template T
+ * @template O
+ * @param {T} globalOptions global options
+ * @param {string} type type
+ * @param {O} localOptions local options
+ * @returns {T & O | T | O} result
+ */
+const mergeGlobalOptions = (globalOptions, type, localOptions) => {
+	const parts = type.split("/");
+	let result;
+	let current = "";
+	for (const part of parts) {
+		current = current ? `${current}/${part}` : part;
+		const options =
+			/** @type {T} */
+			(globalOptions[/** @type {keyof T} */ (current)]);
+		if (typeof options === "object") {
+			result =
+				result === undefined ? options : cachedCleverMerge(result, options);
+		}
+	}
+	if (result === undefined) {
+		return localOptions;
+	}
+	return cachedCleverMerge(result, localOptions);
+};
+
+// TODO webpack 6 remove
+/**
+ * @template {import("tapable").Hook} T
+ * @param {string} name name
+ * @param {T} hook hook
+ * @returns {string} result
+ */
+const deprecationChangedHookMessage = (name, hook) => {
+	const names = hook.taps.map(tapped => tapped.name).join(", ");
+
+	return (
+		`NormalModuleFactory.${name} (${names}) is no longer a waterfall hook, but a bailing hook instead. ` +
+		"Do not return the passed object, but modify it instead. " +
+		"Returning false will ignore the request and results in no module created."
+	);
+};
+
+const ruleSetCompiler = new RuleSetCompiler([
+	new BasicMatcherRulePlugin("test", "resource"),
+	new BasicMatcherRulePlugin("scheme"),
+	new BasicMatcherRulePlugin("mimetype"),
+	new BasicMatcherRulePlugin("dependency"),
+	new BasicMatcherRulePlugin("include", "resource"),
+	new BasicMatcherRulePlugin("exclude", "resource", true),
+	new BasicMatcherRulePlugin("resource"),
+	new BasicMatcherRulePlugin("resourceQuery"),
+	new BasicMatcherRulePlugin("resourceFragment"),
+	new BasicMatcherRulePlugin("realResource"),
+	new BasicMatcherRulePlugin("issuer"),
+	new BasicMatcherRulePlugin("compiler"),
+	new BasicMatcherRulePlugin("issuerLayer"),
+	new ObjectMatcherRulePlugin("assert", "assertions", value => {
+		if (value) {
+			return (
+				/** @type {ImportAttributes} */ (value)._isLegacyAssert !== undefined
+			);
+		}
+
+		return false;
+	}),
+	new ObjectMatcherRulePlugin("with", "assertions", value => {
+		if (value) {
+			return !(/** @type {ImportAttributes} */ (value)._isLegacyAssert);
+		}
+		return false;
+	}),
+	new ObjectMatcherRulePlugin("descriptionData"),
+	new BasicEffectRulePlugin("type"),
+	new BasicEffectRulePlugin("sideEffects"),
+	new BasicEffectRulePlugin("parser"),
+	new BasicEffectRulePlugin("resolve"),
+	new BasicEffectRulePlugin("generator"),
+	new BasicEffectRulePlugin("layer"),
+	new UseEffectRulePlugin()
+]);
+
+class NormalModuleFactory extends ModuleFactory {
+	/**
+	 * @param {object} param params
+	 * @param {string=} param.context context
+	 * @param {InputFileSystem} param.fs file system
+	 * @param {ResolverFactory} param.resolverFactory resolverFactory
+	 * @param {ModuleOptions} param.options options
+	 * @param {AssociatedObjectForCache} param.associatedObjectForCache an object to which the cache will be attached
+	 * @param {boolean=} param.layers enable layers
+	 */
+	constructor({
+		context,
+		fs,
+		resolverFactory,
+		options,
+		associatedObjectForCache,
+		layers = false
+	}) {
 		super();
-		this.hooks = {
-			resolver: new SyncWaterfallHook(["resolver"]),
-			factory: new SyncWaterfallHook(["factory"]),
-			beforeResolve: new AsyncSeriesWaterfallHook(["data"]),
-			afterResolve: new AsyncSeriesWaterfallHook(["data"]),
-			createModule: new SyncBailHook(["data"]),
-			module: new SyncWaterfallHook(["module", "data"]),
+		this.hooks = Object.freeze({
+			/** @type {AsyncSeriesBailHook<[ResolveData], Module | false | void>} */
+			resolve: new AsyncSeriesBailHook(["resolveData"]),
+			/** @type {HookMap>} */
+			resolveForScheme: new HookMap(
+				() => new AsyncSeriesBailHook(["resourceData", "resolveData"])
+			),
+			/** @type {HookMap>} */
+			resolveInScheme: new HookMap(
+				() => new AsyncSeriesBailHook(["resourceData", "resolveData"])
+			),
+			/** @type {AsyncSeriesBailHook<[ResolveData], Module | undefined>} */
+			factorize: new AsyncSeriesBailHook(["resolveData"]),
+			/** @type {AsyncSeriesBailHook<[ResolveData], false | void>} */
+			beforeResolve: new AsyncSeriesBailHook(["resolveData"]),
+			/** @type {AsyncSeriesBailHook<[ResolveData], false | void>} */
+			afterResolve: new AsyncSeriesBailHook(["resolveData"]),
+			/** @type {AsyncSeriesBailHook<[CreateData, ResolveData], Module | void>} */
+			createModule: new AsyncSeriesBailHook(["createData", "resolveData"]),
+			/** @type {SyncWaterfallHook<[Module, CreateData, ResolveData]>} */
+			module: new SyncWaterfallHook(["module", "createData", "resolveData"]),
+			/** @type {HookMap>} */
 			createParser: new HookMap(() => new SyncBailHook(["parserOptions"])),
+			/** @type {HookMap>} */
 			parser: new HookMap(() => new SyncHook(["parser", "parserOptions"])),
+			/** @type {HookMap>} */
 			createGenerator: new HookMap(
 				() => new SyncBailHook(["generatorOptions"])
 			),
+			/** @type {HookMap>} */
 			generator: new HookMap(
 				() => new SyncHook(["generator", "generatorOptions"])
+			),
+			/** @type {HookMap>} */
+			createModuleClass: new HookMap(
+				() => new SyncBailHook(["createData", "resolveData"])
 			)
-		};
-		this._pluginCompat.tap("NormalModuleFactory", options => {
-			switch (options.name) {
-				case "before-resolve":
-				case "after-resolve":
-					options.async = true;
-					break;
-				case "parser":
-					this.hooks.parser
-						.for("javascript/auto")
-						.tap(options.fn.name || "unnamed compat plugin", options.fn);
-					return true;
-			}
-			let match;
-			match = /^parser (.+)$/.exec(options.name);
-			if (match) {
-				this.hooks.parser
-					.for(match[1])
-					.tap(
-						options.fn.name || "unnamed compat plugin",
-						options.fn.bind(this)
-					);
-				return true;
-			}
-			match = /^create-parser (.+)$/.exec(options.name);
-			if (match) {
-				this.hooks.createParser
-					.for(match[1])
-					.tap(
-						options.fn.name || "unnamed compat plugin",
-						options.fn.bind(this)
-					);
-				return true;
-			}
 		});
 		this.resolverFactory = resolverFactory;
-		this.ruleSet = new RuleSet(options.defaultRules.concat(options.rules));
-		this.cachePredicate =
-			typeof options.unsafeCache === "function"
-				? options.unsafeCache
-				: Boolean.bind(null, options.unsafeCache);
+		this.ruleSet = ruleSetCompiler.compile([
+			{
+				rules: /** @type {RuleSetRules} */ (options.defaultRules)
+			},
+			{
+				rules: /** @type {RuleSetRules} */ (options.rules)
+			}
+		]);
 		this.context = context || "";
-		this.parserCache = Object.create(null);
-		this.generatorCache = Object.create(null);
-		this.hooks.factory.tap("NormalModuleFactory", () => (result, callback) => {
-			let resolver = this.hooks.resolver.call(null);
+		this.fs = fs;
+		this._globalParserOptions = options.parser;
+		this._globalGeneratorOptions = options.generator;
+		/** @type {Map>} */
+		this.parserCache = new Map();
+		/** @type {Map>} */
+		this.generatorCache = new Map();
+		/** @type {Set} */
+		this._restoredUnsafeCacheEntries = new Set();
 
-			// Ignored
-			if (!resolver) return callback();
+		/** @type {(resource: string) => import("./util/identifier").ParsedResource} */
+		const cacheParseResource = parseResource.bindCache(
+			associatedObjectForCache
+		);
+		const cachedParseResourceWithoutFragment =
+			parseResourceWithoutFragment.bindCache(associatedObjectForCache);
+		this._parseResourceWithoutFragment = cachedParseResourceWithoutFragment;
 
-			resolver(result, (err, data) => {
-				if (err) return callback(err);
+		this.hooks.factorize.tapAsync(
+			{
+				name: "NormalModuleFactory",
+				stage: 100
+			},
+			(resolveData, callback) => {
+				this.hooks.resolve.callAsync(resolveData, (err, result) => {
+					if (err) return callback(err);
 
-				// Ignored
-				if (!data) return callback();
+					// Ignored
+					if (result === false) return callback();
 
-				// direct module
-				if (typeof data.source === "function") return callback(null, data);
+					// direct module
+					if (result instanceof Module) return callback(null, result);
 
-				this.hooks.afterResolve.callAsync(data, (err, result) => {
-					if (err) return callback(err);
+					if (typeof result === "object")
+						throw new Error(
+							`${deprecationChangedHookMessage(
+								"resolve",
+								this.hooks.resolve
+							)} Returning a Module object will result in this module used as result.`
+						);
 
-					// Ignored
-					if (!result) return callback();
+					this.hooks.afterResolve.callAsync(resolveData, (err, result) => {
+						if (err) return callback(err);
 
-					let createdModule = this.hooks.createModule.call(result);
-					if (!createdModule) {
-						if (!result.request) {
-							return callback(new Error("Empty dependency (no request)"));
-						}
+						if (typeof result === "object")
+							throw new Error(
+								deprecationChangedHookMessage(
+									"afterResolve",
+									this.hooks.afterResolve
+								)
+							);
 
-						createdModule = new NormalModule(result);
-					}
+						// Ignored
+						if (result === false) return callback();
+
+						const createData = resolveData.createData;
+
+						this.hooks.createModule.callAsync(
+							createData,
+							resolveData,
+							(err, createdModule) => {
+								if (!createdModule) {
+									if (!resolveData.request) {
+										return callback(new Error("Empty dependency (no request)"));
+									}
 
-					createdModule = this.hooks.module.call(createdModule, result);
+									// TODO webpack 6 make it required and move javascript/wasm/asset properties to own module
+									createdModule = this.hooks.createModuleClass
+										.for(
+											/** @type {ModuleSettings} */
+											(createData.settings).type
+										)
+										.call(createData, resolveData);
 
-					return callback(null, createdModule);
+									if (!createdModule) {
+										createdModule = /** @type {Module} */ (
+											new NormalModule(
+												/** @type {NormalModuleCreateData} */
+												(createData)
+											)
+										);
+									}
+								}
+
+								createdModule = this.hooks.module.call(
+									createdModule,
+									createData,
+									resolveData
+								);
+
+								return callback(null, createdModule);
+							}
+						);
+					});
 				});
-			});
-		});
-		this.hooks.resolver.tap("NormalModuleFactory", () => (data, callback) => {
-			const contextInfo = data.contextInfo;
-			const context = data.context;
-			const request = data.request;
-
-			const loaderResolver = this.getResolver("loader");
-			const normalResolver = this.getResolver("normal", data.resolveOptions);
-
-			let matchResource = undefined;
-			let requestWithoutMatchResource = request;
-			const matchResourceMatch = MATCH_RESOURCE_REGEX.exec(request);
-			if (matchResourceMatch) {
-				matchResource = matchResourceMatch[1];
-				if (/^\.\.?\//.test(matchResource)) {
-					matchResource = path.join(context, matchResource);
-				}
-				requestWithoutMatchResource = request.substr(
-					matchResourceMatch[0].length
-				);
 			}
+		);
+		this.hooks.resolve.tapAsync(
+			{
+				name: "NormalModuleFactory",
+				stage: 100
+			},
+			(data, callback) => {
+				const {
+					contextInfo,
+					context,
+					dependencies,
+					dependencyType,
+					request,
+					assertions,
+					resolveOptions,
+					fileDependencies,
+					missingDependencies,
+					contextDependencies
+				} = data;
+				const loaderResolver = this.getResolver("loader");
 
-			const noPreAutoLoaders = requestWithoutMatchResource.startsWith("-!");
-			const noAutoLoaders =
-				noPreAutoLoaders || requestWithoutMatchResource.startsWith("!");
-			const noPrePostAutoLoaders = requestWithoutMatchResource.startsWith("!!");
-			let elements = requestWithoutMatchResource
-				.replace(/^-?!+/, "")
-				.replace(/!!+/g, "!")
-				.split("!");
-			let resource = elements.pop();
-			elements = elements.map(identToLoaderRequest);
-
-			asyncLib.parallel(
-				[
-					callback =>
-						this.resolveRequestArray(
-							contextInfo,
-							context,
-							elements,
-							loaderResolver,
-							callback
-						),
-					callback => {
-						if (resource === "" || resource[0] === "?") {
-							return callback(null, {
-								resource
-							});
-						}
+				/** @type {ResourceData | undefined} */
+				let matchResourceData;
+				/** @type {string} */
+				let unresolvedResource;
+				/** @type {ParsedLoaderRequest[]} */
+				let elements;
+				let noPreAutoLoaders = false;
+				let noAutoLoaders = false;
+				let noPrePostAutoLoaders = false;
 
-						normalResolver.resolve(
-							contextInfo,
-							context,
-							resource,
-							{},
-							(err, resource, resourceResolveData) => {
-								if (err) return callback(err);
-								callback(null, {
-									resourceResolveData,
-									resource
-								});
+				const contextScheme = getScheme(context);
+				/** @type {string | undefined} */
+				let scheme = getScheme(request);
+
+				if (!scheme) {
+					/** @type {string} */
+					let requestWithoutMatchResource = request;
+					const matchResourceMatch = MATCH_RESOURCE_REGEX.exec(request);
+					if (matchResourceMatch) {
+						let matchResource = matchResourceMatch[1];
+						// Check if matchResource starts with ./ or ../
+						if (matchResource.charCodeAt(0) === 46) {
+							// 46 is "."
+							const secondChar = matchResource.charCodeAt(1);
+							if (
+								secondChar === 47 || // 47 is "/"
+								(secondChar === 46 && matchResource.charCodeAt(2) === 47) // "../"
+							) {
+								// Resolve relative path against context
+								matchResource = join(this.fs, context, matchResource);
 							}
+						}
+
+						matchResourceData = {
+							...cacheParseResource(matchResource),
+							resource: matchResource
+						};
+						requestWithoutMatchResource = request.slice(
+							matchResourceMatch[0].length
 						);
 					}
-				],
-				(err, results) => {
+
+					scheme = getScheme(requestWithoutMatchResource);
+
+					if (!scheme && !contextScheme) {
+						const firstChar = requestWithoutMatchResource.charCodeAt(0);
+						const secondChar = requestWithoutMatchResource.charCodeAt(1);
+						noPreAutoLoaders = firstChar === 45 && secondChar === 33; // startsWith "-!"
+						noAutoLoaders = noPreAutoLoaders || firstChar === 33; // startsWith "!"
+						noPrePostAutoLoaders = firstChar === 33 && secondChar === 33; // startsWith "!!";
+						const rawElements = requestWithoutMatchResource
+							.slice(
+								noPreAutoLoaders || noPrePostAutoLoaders
+									? 2
+									: noAutoLoaders
+										? 1
+										: 0
+							)
+							.split(/!+/);
+						unresolvedResource = /** @type {string} */ (rawElements.pop());
+						elements = rawElements.map(el => {
+							const { path, query } = cachedParseResourceWithoutFragment(el);
+							return {
+								loader: path,
+								options: query ? query.slice(1) : undefined
+							};
+						});
+						scheme = getScheme(unresolvedResource);
+					} else {
+						unresolvedResource = requestWithoutMatchResource;
+						elements = EMPTY_ELEMENTS;
+					}
+				} else {
+					unresolvedResource = request;
+					elements = EMPTY_ELEMENTS;
+				}
+
+				/** @type {ResolveContext} */
+				const resolveContext = {
+					fileDependencies,
+					missingDependencies,
+					contextDependencies
+				};
+
+				/** @type {ResourceDataWithData} */
+				let resourceData;
+
+				/** @type {undefined | LoaderItem[]} */
+				let loaders;
+
+				const continueCallback = needCalls(2, err => {
 					if (err) return callback(err);
-					let loaders = results[0];
-					const resourceResolveData = results[1].resourceResolveData;
-					resource = results[1].resource;
 
 					// translate option idents
 					try {
-						for (const item of loaders) {
+						for (const item of /** @type {LoaderItem[]} */ (loaders)) {
 							if (typeof item.options === "string" && item.options[0] === "?") {
-								const ident = item.options.substr(1);
-								item.options = this.ruleSet.findOptionsByIdent(ident);
+								const ident = item.options.slice(1);
+								if (ident === "[[missing ident]]") {
+									throw new Error(
+										"No ident is provided by referenced loader. " +
+											"When using a function for Rule.use in config you need to " +
+											"provide an 'ident' property for referenced loader options."
+									);
+								}
+								item.options = this.ruleSet.references.get(ident);
+								if (item.options === undefined) {
+									throw new Error(
+										"Invalid ident is provided by referenced loader"
+									);
+								}
 								item.ident = ident;
 							}
 						}
-					} catch (e) {
-						return callback(e);
+					} catch (identErr) {
+						return callback(/** @type {Error} */ (identErr));
 					}
 
-					if (resource === false) {
+					if (!resourceData) {
 						// ignored
-						return callback(
-							null,
-							new RawModule(
-								"/* (ignored) */",
-								`ignored ${context} ${request}`,
-								`${request} (ignored)`
-							)
-						);
+						return callback(null, dependencies[0].createIgnoredModule(context));
 					}
 
 					const userRequest =
-						(matchResource !== undefined ? `${matchResource}!=!` : "") +
-						loaders
-							.map(loaderToIdent)
-							.concat([resource])
-							.join("!");
-
-					let resourcePath =
-						matchResource !== undefined ? matchResource : resource;
-					let resourceQuery = "";
-					const queryIndex = resourcePath.indexOf("?");
-					if (queryIndex >= 0) {
-						resourceQuery = resourcePath.substr(queryIndex);
-						resourcePath = resourcePath.substr(0, queryIndex);
-					}
+						(matchResourceData !== undefined
+							? `${matchResourceData.resource}!=!`
+							: "") +
+						stringifyLoadersAndResource(
+							/** @type {LoaderItem[]} */ (loaders),
+							resourceData.resource
+						);
 
-					const result = this.ruleSet.exec({
-						resource: resourcePath,
-						realResource:
-							matchResource !== undefined
-								? resource.replace(/\?.*/, "")
-								: resourcePath,
-						resourceQuery,
-						issuer: contextInfo.issuer,
-						compiler: contextInfo.compiler
-					});
+					/** @type {ModuleSettings} */
 					const settings = {};
 					const useLoadersPost = [];
 					const useLoaders = [];
 					const useLoadersPre = [];
-					for (const r of result) {
-						if (r.type === "use") {
-							if (r.enforce === "post" && !noPrePostAutoLoaders) {
-								useLoadersPost.push(r.value);
-							} else if (
-								r.enforce === "pre" &&
-								!noPreAutoLoaders &&
-								!noPrePostAutoLoaders
-							) {
-								useLoadersPre.push(r.value);
+
+					// handle .webpack[] suffix
+					let resource;
+					let match;
+					if (
+						matchResourceData &&
+						typeof (resource = matchResourceData.resource) === "string" &&
+						(match = /\.webpack\[([^\]]+)\]$/.exec(resource))
+					) {
+						settings.type = match[1];
+						matchResourceData.resource = matchResourceData.resource.slice(
+							0,
+							-settings.type.length - 10
+						);
+					} else {
+						settings.type = JAVASCRIPT_MODULE_TYPE_AUTO;
+						const resourceDataForRules = matchResourceData || resourceData;
+						const result = this.ruleSet.exec({
+							resource: resourceDataForRules.path,
+							realResource: resourceData.path,
+							resourceQuery: resourceDataForRules.query,
+							resourceFragment: resourceDataForRules.fragment,
+							scheme,
+							assertions,
+							mimetype: matchResourceData
+								? ""
+								: resourceData.data.mimetype || "",
+							dependency: dependencyType,
+							descriptionData: matchResourceData
+								? undefined
+								: resourceData.data.descriptionFileData,
+							issuer: contextInfo.issuer,
+							compiler: contextInfo.compiler,
+							issuerLayer: contextInfo.issuerLayer || ""
+						});
+						for (const r of result) {
+							// https://github.com/webpack/webpack/issues/16466
+							// if a request exists PrePostAutoLoaders, should disable modifying Rule.type
+							if (r.type === "type" && noPrePostAutoLoaders) {
+								continue;
+							}
+							if (r.type === "use") {
+								if (!noAutoLoaders && !noPrePostAutoLoaders) {
+									useLoaders.push(r.value);
+								}
+							} else if (r.type === "use-post") {
+								if (!noPrePostAutoLoaders) {
+									useLoadersPost.push(r.value);
+								}
+							} else if (r.type === "use-pre") {
+								if (!noPreAutoLoaders && !noPrePostAutoLoaders) {
+									useLoadersPre.push(r.value);
+								}
 							} else if (
-								!r.enforce &&
-								!noAutoLoaders &&
-								!noPrePostAutoLoaders
+								typeof r.value === "object" &&
+								r.value !== null &&
+								typeof settings[
+									/** @type {keyof ModuleSettings} */ (r.type)
+								] === "object" &&
+								settings[/** @type {keyof ModuleSettings} */ (r.type)] !== null
 							) {
-								useLoaders.push(r.value);
+								const type = /** @type {keyof ModuleSettings} */ (r.type);
+								/** @type {TODO} */
+								(settings)[type] = cachedCleverMerge(settings[type], r.value);
+							} else {
+								const type = /** @type {keyof ModuleSettings} */ (r.type);
+								/** @type {TODO} */
+								(settings)[type] = r.value;
 							}
-						} else if (
-							typeof r.value === "object" &&
-							r.value !== null &&
-							typeof settings[r.type] === "object" &&
-							settings[r.type] !== null
-						) {
-							settings[r.type] = cachedMerge(settings[r.type], r.value);
-						} else {
-							settings[r.type] = r.value;
 						}
 					}
-					asyncLib.parallel(
-						[
-							this.resolveRequestArray.bind(
-								this,
-								contextInfo,
-								this.context,
-								useLoadersPost,
-								loaderResolver
-							),
-							this.resolveRequestArray.bind(
-								this,
-								contextInfo,
-								this.context,
-								useLoaders,
-								loaderResolver
-							),
-							this.resolveRequestArray.bind(
-								this,
-								contextInfo,
-								this.context,
-								useLoadersPre,
-								loaderResolver
-							)
-						],
-						(err, results) => {
-							if (err) return callback(err);
-							loaders = results[0].concat(loaders, results[1], results[2]);
-							process.nextTick(() => {
-								const type = settings.type;
-								const resolveOptions = settings.resolve;
-								callback(null, {
-									context: context,
-									request: loaders
-										.map(loaderToIdent)
-										.concat([resource])
-										.join("!"),
-									dependencies: data.dependencies,
-									userRequest,
-									rawRequest: request,
-									loaders,
-									resource,
-									matchResource,
-									resourceResolveData,
-									settings,
-									type,
-									parser: this.getParser(type, settings.parser),
-									generator: this.getGenerator(type, settings.generator),
-									resolveOptions
-								});
+
+					/** @type {undefined | LoaderItem[]} */
+					let postLoaders;
+					/** @type {undefined | LoaderItem[]} */
+					let normalLoaders;
+					/** @type {undefined | LoaderItem[]} */
+					let preLoaders;
+
+					const continueCallback = needCalls(3, err => {
+						if (err) {
+							return callback(err);
+						}
+						const allLoaders = /** @type {LoaderItem[]} */ (postLoaders);
+						if (matchResourceData === undefined) {
+							for (const loader of /** @type {LoaderItem[]} */ (loaders))
+								allLoaders.push(loader);
+							for (const loader of /** @type {LoaderItem[]} */ (normalLoaders))
+								allLoaders.push(loader);
+						} else {
+							for (const loader of /** @type {LoaderItem[]} */ (normalLoaders))
+								allLoaders.push(loader);
+							for (const loader of /** @type {LoaderItem[]} */ (loaders))
+								allLoaders.push(loader);
+						}
+						for (const loader of /** @type {LoaderItem[]} */ (preLoaders))
+							allLoaders.push(loader);
+						const type = /** @type {string} */ (settings.type);
+						const resolveOptions = settings.resolve;
+						const layer = settings.layer;
+						if (layer !== undefined && !layers) {
+							return callback(
+								new Error(
+									"'Rule.layer' is only allowed when 'experiments.layers' is enabled"
+								)
+							);
+						}
+						try {
+							Object.assign(data.createData, {
+								layer:
+									layer === undefined ? contextInfo.issuerLayer || null : layer,
+								request: stringifyLoadersAndResource(
+									allLoaders,
+									resourceData.resource
+								),
+								userRequest,
+								rawRequest: request,
+								loaders: allLoaders,
+								resource: resourceData.resource,
+								context:
+									resourceData.context || getContext(resourceData.resource),
+								matchResource: matchResourceData
+									? matchResourceData.resource
+									: undefined,
+								resourceResolveData: resourceData.data,
+								settings,
+								type,
+								parser: this.getParser(type, settings.parser),
+								parserOptions: settings.parser,
+								generator: this.getGenerator(type, settings.generator),
+								generatorOptions: settings.generator,
+								resolveOptions
 							});
+						} catch (createDataErr) {
+							return callback(/** @type {Error} */ (createDataErr));
+						}
+						callback();
+					});
+					this.resolveRequestArray(
+						contextInfo,
+						this.context,
+						useLoadersPost,
+						loaderResolver,
+						resolveContext,
+						(err, result) => {
+							postLoaders = result;
+							continueCallback(err);
+						}
+					);
+					this.resolveRequestArray(
+						contextInfo,
+						this.context,
+						useLoaders,
+						loaderResolver,
+						resolveContext,
+						(err, result) => {
+							normalLoaders = result;
+							continueCallback(err);
 						}
 					);
+					this.resolveRequestArray(
+						contextInfo,
+						this.context,
+						useLoadersPre,
+						loaderResolver,
+						resolveContext,
+						(err, result) => {
+							preLoaders = result;
+							continueCallback(err);
+						}
+					);
+				});
+
+				this.resolveRequestArray(
+					contextInfo,
+					contextScheme ? this.context : context,
+					/** @type {LoaderItem[]} */ (elements),
+					loaderResolver,
+					resolveContext,
+					(err, result) => {
+						if (err) return continueCallback(err);
+						loaders = result;
+						continueCallback();
+					}
+				);
+
+				/**
+				 * @param {string} context context
+				 */
+				const defaultResolve = context => {
+					if (/^($|\?)/.test(unresolvedResource)) {
+						resourceData = {
+							...cacheParseResource(unresolvedResource),
+							resource: unresolvedResource,
+							data: {}
+						};
+						continueCallback();
+					}
+
+					// resource without scheme and with path
+					else {
+						const normalResolver = this.getResolver(
+							"normal",
+							dependencyType
+								? cachedSetProperty(
+										resolveOptions || EMPTY_RESOLVE_OPTIONS,
+										"dependencyType",
+										dependencyType
+									)
+								: resolveOptions
+						);
+						this.resolveResource(
+							contextInfo,
+							context,
+							unresolvedResource,
+							normalResolver,
+							resolveContext,
+							(err, _resolvedResource, resolvedResourceResolveData) => {
+								if (err) return continueCallback(err);
+								if (_resolvedResource !== false) {
+									const resolvedResource =
+										/** @type {string} */
+										(_resolvedResource);
+									resourceData = {
+										...cacheParseResource(resolvedResource),
+										resource: resolvedResource,
+										data:
+											/** @type {ResolveRequest} */
+											(resolvedResourceResolveData)
+									};
+								}
+								continueCallback();
+							}
+						);
+					}
+				};
+
+				// resource with scheme
+				if (scheme) {
+					resourceData = {
+						resource: unresolvedResource,
+						data: {},
+						path: undefined,
+						query: undefined,
+						fragment: undefined,
+						context: undefined
+					};
+					this.hooks.resolveForScheme
+						.for(scheme)
+						.callAsync(resourceData, data, err => {
+							if (err) return continueCallback(err);
+							continueCallback();
+						});
 				}
-			);
-		});
+
+				// resource within scheme
+				else if (contextScheme) {
+					resourceData = {
+						resource: unresolvedResource,
+						data: {},
+						path: undefined,
+						query: undefined,
+						fragment: undefined,
+						context: undefined
+					};
+					this.hooks.resolveInScheme
+						.for(contextScheme)
+						.callAsync(resourceData, data, (err, handled) => {
+							if (err) return continueCallback(err);
+							if (!handled) return defaultResolve(this.context);
+							continueCallback();
+						});
+				}
+
+				// resource without scheme and without path
+				else defaultResolve(context);
+			}
+		);
 	}
 
+	cleanupForCache() {
+		for (const module of this._restoredUnsafeCacheEntries) {
+			ChunkGraph.clearChunkGraphForModule(module);
+			ModuleGraph.clearModuleGraphForModule(module);
+			module.cleanupForCache();
+		}
+	}
+
+	/**
+	 * @param {ModuleFactoryCreateData} data data object
+	 * @param {ModuleFactoryCallback} callback callback
+	 * @returns {void}
+	 */
 	create(data, callback) {
-		const dependencies = data.dependencies;
-		const cacheEntry = dependencyCache.get(dependencies[0]);
-		if (cacheEntry) return callback(null, cacheEntry);
+		const dependencies = /** @type {ModuleDependency[]} */ (data.dependencies);
 		const context = data.context || this.context;
 		const resolveOptions = data.resolveOptions || EMPTY_RESOLVE_OPTIONS;
-		const request = dependencies[0].request;
-		const contextInfo = data.contextInfo || {};
-		this.hooks.beforeResolve.callAsync(
-			{
-				contextInfo,
-				resolveOptions,
-				context,
-				request,
-				dependencies
-			},
-			(err, result) => {
-				if (err) return callback(err);
+		const dependency = dependencies[0];
+		const request = dependency.request;
+		const assertions = dependency.assertions;
+		const dependencyType = dependency.category || "";
+		const contextInfo = data.contextInfo;
+		const fileDependencies = new LazySet();
+		const missingDependencies = new LazySet();
+		const contextDependencies = new LazySet();
+		/** @type {ResolveData} */
+		const resolveData = {
+			contextInfo,
+			resolveOptions,
+			context,
+			request,
+			assertions,
+			dependencies,
+			dependencyType,
+			fileDependencies,
+			missingDependencies,
+			contextDependencies,
+			createData: {},
+			cacheable: true
+		};
+		this.hooks.beforeResolve.callAsync(resolveData, (err, result) => {
+			if (err) {
+				return callback(err, {
+					fileDependencies,
+					missingDependencies,
+					contextDependencies,
+					cacheable: false
+				});
+			}
 
-				// Ignored
-				if (!result) return callback();
+			// Ignored
+			if (result === false) {
+				/** @type {ModuleFactoryResult} * */
+				const factoryResult = {
+					fileDependencies,
+					missingDependencies,
+					contextDependencies,
+					cacheable: resolveData.cacheable
+				};
 
-				const factory = this.hooks.factory.call(null);
+				if (resolveData.ignoredModule) {
+					factoryResult.module = resolveData.ignoredModule;
+				}
 
-				// Ignored
-				if (!factory) return callback();
+				return callback(null, factoryResult);
+			}
 
-				factory(result, (err, module) => {
-					if (err) return callback(err);
+			if (typeof result === "object")
+				throw new Error(
+					deprecationChangedHookMessage(
+						"beforeResolve",
+						this.hooks.beforeResolve
+					)
+				);
+
+			this.hooks.factorize.callAsync(resolveData, (err, module) => {
+				if (err) {
+					return callback(err, {
+						fileDependencies,
+						missingDependencies,
+						contextDependencies,
+						cacheable: false
+					});
+				}
+
+				/** @type {ModuleFactoryResult} * */
+				const factoryResult = {
+					module,
+					fileDependencies,
+					missingDependencies,
+					contextDependencies,
+					cacheable: resolveData.cacheable
+				};
+
+				callback(null, factoryResult);
+			});
+		});
+	}
+
+	/**
+	 * @param {ModuleFactoryCreateDataContextInfo} contextInfo context info
+	 * @param {string} context context
+	 * @param {string} unresolvedResource unresolved resource
+	 * @param {ResolverWithOptions} resolver resolver
+	 * @param {ResolveContext} resolveContext resolver context
+	 * @param {(err: null | Error, res?: string | false, req?: ResolveRequest) => void} callback callback
+	 */
+	resolveResource(
+		contextInfo,
+		context,
+		unresolvedResource,
+		resolver,
+		resolveContext,
+		callback
+	) {
+		resolver.resolve(
+			contextInfo,
+			context,
+			unresolvedResource,
+			resolveContext,
+			(err, resolvedResource, resolvedResourceResolveData) => {
+				if (err) {
+					return this._resolveResourceErrorHints(
+						err,
+						contextInfo,
+						context,
+						unresolvedResource,
+						resolver,
+						resolveContext,
+						(err2, hints) => {
+							if (err2) {
+								err.message += `
+A fatal error happened during resolving additional hints for this error: ${err2.message}`;
+								err.stack += `
 
-					if (module && this.cachePredicate(module)) {
-						for (const d of dependencies) {
-							dependencyCache.set(d, module);
+A fatal error happened during resolving additional hints for this error:
+${err2.stack}`;
+								return callback(err);
+							}
+							if (hints && hints.length > 0) {
+								err.message += `
+${hints.join("\n\n")}`;
+							}
+
+							// Check if the extension is missing a leading dot (e.g. "js" instead of ".js")
+							let appendResolveExtensionsHint = false;
+							const specifiedExtensions = Array.from(
+								resolver.options.extensions
+							);
+							const expectedExtensions = specifiedExtensions.map(extension => {
+								if (LEADING_DOT_EXTENSION_REGEX.test(extension)) {
+									appendResolveExtensionsHint = true;
+									return `.${extension}`;
+								}
+								return extension;
+							});
+							if (appendResolveExtensionsHint) {
+								err.message += `\nDid you miss the leading dot in 'resolve.extensions'? Did you mean '${JSON.stringify(
+									expectedExtensions
+								)}' instead of '${JSON.stringify(specifiedExtensions)}'?`;
+							}
+
+							callback(err);
 						}
-					}
+					);
+				}
+				callback(err, resolvedResource, resolvedResourceResolveData);
+			}
+		);
+	}
 
-					callback(null, module);
-				});
+	/**
+	 * @param {Error} error error
+	 * @param {ModuleFactoryCreateDataContextInfo} contextInfo context info
+	 * @param {string} context context
+	 * @param {string} unresolvedResource unresolved resource
+	 * @param {ResolverWithOptions} resolver resolver
+	 * @param {ResolveContext} resolveContext resolver context
+	 * @param {Callback} callback callback
+	 * @private
+	 */
+	_resolveResourceErrorHints(
+		error,
+		contextInfo,
+		context,
+		unresolvedResource,
+		resolver,
+		resolveContext,
+		callback
+	) {
+		asyncLib.parallel(
+			[
+				callback => {
+					if (!resolver.options.fullySpecified) return callback();
+					resolver
+						.withOptions({
+							fullySpecified: false
+						})
+						.resolve(
+							contextInfo,
+							context,
+							unresolvedResource,
+							resolveContext,
+							(err, resolvedResource) => {
+								if (!err && resolvedResource) {
+									const resource = parseResource(resolvedResource).path.replace(
+										/^.*[\\/]/,
+										""
+									);
+									return callback(
+										null,
+										`Did you mean '${resource}'?
+BREAKING CHANGE: The request '${unresolvedResource}' failed to resolve only because it was resolved as fully specified
+(probably because the origin is strict EcmaScript Module, e. g. a module with javascript mimetype, a '*.mjs' file, or a '*.js' file where the package.json contains '"type": "module"').
+The extension in the request is mandatory for it to be fully specified.
+Add the extension to the request.`
+									);
+								}
+								callback();
+							}
+						);
+				},
+				callback => {
+					if (!resolver.options.enforceExtension) return callback();
+					resolver
+						.withOptions({
+							enforceExtension: false,
+							extensions: []
+						})
+						.resolve(
+							contextInfo,
+							context,
+							unresolvedResource,
+							resolveContext,
+							(err, resolvedResource) => {
+								if (!err && resolvedResource) {
+									let hint = "";
+									const match = /(\.[^.]+)(\?|$)/.exec(unresolvedResource);
+									if (match) {
+										const fixedRequest = unresolvedResource.replace(
+											/(\.[^.]+)(\?|$)/,
+											"$2"
+										);
+										hint = resolver.options.extensions.has(match[1])
+											? `Did you mean '${fixedRequest}'?`
+											: `Did you mean '${fixedRequest}'? Also note that '${match[1]}' is not in 'resolve.extensions' yet and need to be added for this to work?`;
+									} else {
+										hint =
+											"Did you mean to omit the extension or to remove 'resolve.enforceExtension'?";
+									}
+									return callback(
+										null,
+										`The request '${unresolvedResource}' failed to resolve only because 'resolve.enforceExtension' was specified.
+${hint}
+Including the extension in the request is no longer possible. Did you mean to enforce including the extension in requests with 'resolve.extensions: []' instead?`
+									);
+								}
+								callback();
+							}
+						);
+				},
+				callback => {
+					if (
+						/^\.\.?\//.test(unresolvedResource) ||
+						resolver.options.preferRelative
+					) {
+						return callback();
+					}
+					resolver.resolve(
+						contextInfo,
+						context,
+						`./${unresolvedResource}`,
+						resolveContext,
+						(err, resolvedResource) => {
+							if (err || !resolvedResource) return callback();
+							const moduleDirectories = resolver.options.modules
+								.map(m => (Array.isArray(m) ? m.join(", ") : m))
+								.join(", ");
+							callback(
+								null,
+								`Did you mean './${unresolvedResource}'?
+Requests that should resolve in the current directory need to start with './'.
+Requests that start with a name are treated as module requests and resolve within module directories (${moduleDirectories}).
+If changing the source code is not an option there is also a resolve options called 'preferRelative' which tries to resolve these kind of requests in the current directory too.`
+							);
+						}
+					);
+				}
+			],
+			(err, hints) => {
+				if (err) return callback(err);
+				callback(null, /** @type {string[]} */ (hints).filter(Boolean));
 			}
 		);
 	}
 
-	resolveRequestArray(contextInfo, context, array, resolver, callback) {
-		if (array.length === 0) return callback(null, []);
+	/**
+	 * @param {ModuleFactoryCreateDataContextInfo} contextInfo context info
+	 * @param {string} context context
+	 * @param {LoaderItem[]} array array
+	 * @param {ResolverWithOptions} resolver resolver
+	 * @param {ResolveContext} resolveContext resolve context
+	 * @param {Callback} callback callback
+	 * @returns {void} result
+	 */
+	resolveRequestArray(
+		contextInfo,
+		context,
+		array,
+		resolver,
+		resolveContext,
+		callback
+	) {
+		// LoaderItem
+		if (array.length === 0) return callback(null, array);
 		asyncLib.map(
 			array,
 			(item, callback) => {
@@ -417,27 +1175,24 @@ class NormalModuleFactory extends Tapable {
 					contextInfo,
 					context,
 					item.loader,
-					{},
-					(err, result) => {
+					resolveContext,
+					(err, result, resolveRequest) => {
 						if (
 							err &&
 							/^[^/]*$/.test(item.loader) &&
-							!/-loader$/.test(item.loader)
+							!item.loader.endsWith("-loader")
 						) {
 							return resolver.resolve(
 								contextInfo,
 								context,
-								item.loader + "-loader",
-								{},
+								`${item.loader}-loader`,
+								resolveContext,
 								err2 => {
 									if (!err2) {
 										err.message =
-											err.message +
-											"\n" +
+											`${err.message}\n` +
 											"BREAKING CHANGE: It's no longer allowed to omit the '-loader' suffix when using loaders.\n" +
-											`                 You need to specify '${
-												item.loader
-											}-loader' instead of '${item.loader}',\n` +
+											`                 You need to specify '${item.loader}-loader' instead of '${item.loader}',\n` +
 											"                 see https://webpack.js.org/migrate/3/#automatic-loader-module-name-extension-removed";
 									}
 									callback(err);
@@ -446,38 +1201,76 @@ class NormalModuleFactory extends Tapable {
 						}
 						if (err) return callback(err);
 
-						const optionsOnly = item.options
-							? {
-									options: item.options
-							  }
-							: undefined;
-						return callback(
-							null,
-							Object.assign({}, item, identToLoaderRequest(result), optionsOnly)
+						const parsedResult = this._parseResourceWithoutFragment(
+							/** @type {string} */ (result)
 						);
+
+						const type = /\.mjs$/i.test(parsedResult.path)
+							? "module"
+							: /\.cjs$/i.test(parsedResult.path)
+								? "commonjs"
+								: /** @type {ResolveRequest} */
+									(resolveRequest).descriptionFileData === undefined
+									? undefined
+									: /** @type {ResolveRequest} */
+										(resolveRequest).descriptionFileData.type;
+						const resolved = {
+							loader: parsedResult.path,
+							type,
+							options:
+								item.options === undefined
+									? parsedResult.query
+										? parsedResult.query.slice(1)
+										: undefined
+									: item.options,
+							ident:
+								item.options === undefined
+									? undefined
+									: /** @type {string} */ (item.ident)
+						};
+
+						return callback(null, /** @type {LoaderItem} */ (resolved));
 					}
 				);
 			},
-			callback
+			/** @type {Callback<(LoaderItem | undefined)[]>} */ (callback)
 		);
 	}
 
-	getParser(type, parserOptions) {
-		let ident = type;
-		if (parserOptions) {
-			if (parserOptions.ident) {
-				ident = `${type}|${parserOptions.ident}`;
-			} else {
-				ident = JSON.stringify([type, parserOptions]);
-			}
+	/**
+	 * @param {string} type type
+	 * @param {ParserOptions} parserOptions parser options
+	 * @returns {Parser} parser
+	 */
+	getParser(type, parserOptions = EMPTY_PARSER_OPTIONS) {
+		let cache = this.parserCache.get(type);
+
+		if (cache === undefined) {
+			cache = new WeakMap();
+			this.parserCache.set(type, cache);
 		}
-		if (ident in this.parserCache) {
-			return this.parserCache[ident];
+
+		let parser = cache.get(parserOptions);
+
+		if (parser === undefined) {
+			parser = this.createParser(type, parserOptions);
+			cache.set(parserOptions, parser);
 		}
-		return (this.parserCache[ident] = this.createParser(type, parserOptions));
+
+		return parser;
 	}
 
+	/**
+	 * @param {string} type type
+	 * @param {ParserOptions} parserOptions parser options
+	 * @returns {Parser} parser
+	 */
 	createParser(type, parserOptions = {}) {
+		parserOptions = mergeGlobalOptions(
+			this._globalParserOptions,
+			type,
+			parserOptions
+		);
 		const parser = this.hooks.createParser.for(type).call(parserOptions);
 		if (!parser) {
 			throw new Error(`No parser registered for ${type}`);
@@ -486,25 +1279,40 @@ class NormalModuleFactory extends Tapable {
 		return parser;
 	}
 
-	getGenerator(type, generatorOptions) {
-		let ident = type;
-		if (generatorOptions) {
-			if (generatorOptions.ident) {
-				ident = `${type}|${generatorOptions.ident}`;
-			} else {
-				ident = JSON.stringify([type, generatorOptions]);
-			}
+	/**
+	 * @param {string} type type of generator
+	 * @param {GeneratorOptions} generatorOptions generator options
+	 * @returns {Generator} generator
+	 */
+	getGenerator(type, generatorOptions = EMPTY_GENERATOR_OPTIONS) {
+		let cache = this.generatorCache.get(type);
+
+		if (cache === undefined) {
+			cache = new WeakMap();
+			this.generatorCache.set(type, cache);
 		}
-		if (ident in this.generatorCache) {
-			return this.generatorCache[ident];
+
+		let generator = cache.get(generatorOptions);
+
+		if (generator === undefined) {
+			generator = this.createGenerator(type, generatorOptions);
+			cache.set(generatorOptions, generator);
 		}
-		return (this.generatorCache[ident] = this.createGenerator(
-			type,
-			generatorOptions
-		));
+
+		return generator;
 	}
 
+	/**
+	 * @param {string} type type of generator
+	 * @param {GeneratorOptions} generatorOptions generator options
+	 * @returns {Generator} generator
+	 */
 	createGenerator(type, generatorOptions = {}) {
+		generatorOptions = mergeGlobalOptions(
+			this._globalGeneratorOptions,
+			type,
+			generatorOptions
+		);
 		const generator = this.hooks.createGenerator
 			.for(type)
 			.call(generatorOptions);
@@ -515,11 +1323,13 @@ class NormalModuleFactory extends Tapable {
 		return generator;
 	}
 
+	/**
+	 * @param {Parameters[0]} type type of resolver
+	 * @param {Parameters[1]=} resolveOptions options
+	 * @returns {ReturnType} the resolver
+	 */
 	getResolver(type, resolveOptions) {
-		return this.resolverFactory.get(
-			type,
-			resolveOptions || EMPTY_RESOLVE_OPTIONS
-		);
+		return this.resolverFactory.get(type, resolveOptions);
 	}
 }
 
diff --git a/lib/NormalModuleReplacementPlugin.js b/lib/NormalModuleReplacementPlugin.js
index d4f23a58bae..f816d5018de 100644
--- a/lib/NormalModuleReplacementPlugin.js
+++ b/lib/NormalModuleReplacementPlugin.js
@@ -2,49 +2,73 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const path = require("path");
+const { join, dirname } = require("./util/fs");
+
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./NormalModuleFactory").ResolveData} ResolveData */
+/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
+
+/** @typedef {(resolveData: ResolveData) => void} ModuleReplacer */
+
+const PLUGIN_NAME = "NormalModuleReplacementPlugin";
 
 class NormalModuleReplacementPlugin {
+	/**
+	 * Create an instance of the plugin
+	 * @param {RegExp} resourceRegExp the resource matcher
+	 * @param {string | ModuleReplacer} newResource the resource replacement
+	 */
 	constructor(resourceRegExp, newResource) {
 		this.resourceRegExp = resourceRegExp;
 		this.newResource = newResource;
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		const resourceRegExp = this.resourceRegExp;
 		const newResource = this.newResource;
-		compiler.hooks.normalModuleFactory.tap(
-			"NormalModuleReplacementPlugin",
-			nmf => {
-				nmf.hooks.beforeResolve.tap("NormalModuleReplacementPlugin", result => {
-					if (!result) return;
-					if (resourceRegExp.test(result.request)) {
-						if (typeof newResource === "function") {
-							newResource(result);
-						} else {
-							result.request = newResource;
-						}
+		compiler.hooks.normalModuleFactory.tap(PLUGIN_NAME, nmf => {
+			nmf.hooks.beforeResolve.tap(PLUGIN_NAME, result => {
+				if (resourceRegExp.test(result.request)) {
+					if (typeof newResource === "function") {
+						newResource(result);
+					} else {
+						result.request = newResource;
 					}
-					return result;
-				});
-				nmf.hooks.afterResolve.tap("NormalModuleReplacementPlugin", result => {
-					if (!result) return;
-					if (resourceRegExp.test(result.resource)) {
-						if (typeof newResource === "function") {
-							newResource(result);
+				}
+			});
+			nmf.hooks.afterResolve.tap(PLUGIN_NAME, result => {
+				const createData = result.createData;
+				if (resourceRegExp.test(/** @type {string} */ (createData.resource))) {
+					if (typeof newResource === "function") {
+						newResource(result);
+					} else {
+						const fs =
+							/** @type {InputFileSystem} */
+							(compiler.inputFileSystem);
+						if (
+							newResource.startsWith("/") ||
+							(newResource.length > 1 && newResource[1] === ":")
+						) {
+							createData.resource = newResource;
 						} else {
-							result.resource = path.resolve(
-								path.dirname(result.resource),
+							createData.resource = join(
+								fs,
+								dirname(fs, /** @type {string} */ (createData.resource)),
 								newResource
 							);
 						}
 					}
-					return result;
-				});
-			}
-		);
+				}
+			});
+		});
 	}
 }
 
diff --git a/lib/NullFactory.js b/lib/NullFactory.js
index 90ede1fe3f1..4665f75902a 100644
--- a/lib/NullFactory.js
+++ b/lib/NullFactory.js
@@ -2,9 +2,20 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-class NullFactory {
+const ModuleFactory = require("./ModuleFactory");
+
+/** @typedef {import("./ModuleFactory").ModuleFactoryCallback} ModuleFactoryCallback */
+/** @typedef {import("./ModuleFactory").ModuleFactoryCreateData} ModuleFactoryCreateData */
+
+class NullFactory extends ModuleFactory {
+	/**
+	 * @param {ModuleFactoryCreateData} data data object
+	 * @param {ModuleFactoryCallback} callback callback
+	 * @returns {void}
+	 */
 	create(data, callback) {
 		return callback();
 	}
diff --git a/lib/OptimizationStages.js b/lib/OptimizationStages.js
new file mode 100644
index 00000000000..102d613c5aa
--- /dev/null
+++ b/lib/OptimizationStages.js
@@ -0,0 +1,10 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Florent Cailhol @ooflorent
+*/
+
+"use strict";
+
+module.exports.STAGE_BASIC = -10;
+module.exports.STAGE_DEFAULT = 0;
+module.exports.STAGE_ADVANCED = 10;
diff --git a/lib/OptionsApply.js b/lib/OptionsApply.js
index 3b1ec316485..b7a3941543b 100644
--- a/lib/OptionsApply.js
+++ b/lib/OptionsApply.js
@@ -2,9 +2,21 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+/** @typedef {import("../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
+/** @typedef {import("./Compiler")} Compiler */
+
 class OptionsApply {
-	process(options, compiler) {}
+	/**
+	 * @param {WebpackOptions} options options object
+	 * @param {Compiler} compiler compiler object
+	 * @returns {WebpackOptions} options object
+	 */
+	process(options, compiler) {
+		return options;
+	}
 }
+
 module.exports = OptionsApply;
diff --git a/lib/OptionsDefaulter.js b/lib/OptionsDefaulter.js
deleted file mode 100644
index cad07ea06c2..00000000000
--- a/lib/OptionsDefaulter.js
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const getProperty = (obj, name) => {
-	name = name.split(".");
-	for (let i = 0; i < name.length - 1; i++) {
-		obj = obj[name[i]];
-		if (typeof obj !== "object" || !obj || Array.isArray(obj)) return;
-	}
-	return obj[name.pop()];
-};
-
-const setProperty = (obj, name, value) => {
-	name = name.split(".");
-	for (let i = 0; i < name.length - 1; i++) {
-		if (typeof obj[name[i]] !== "object" && obj[name[i]] !== undefined) return;
-		if (Array.isArray(obj[name[i]])) return;
-		if (!obj[name[i]]) obj[name[i]] = {};
-		obj = obj[name[i]];
-	}
-	obj[name.pop()] = value;
-};
-
-class OptionsDefaulter {
-	constructor() {
-		this.defaults = {};
-		this.config = {};
-	}
-
-	process(options) {
-		options = Object.assign({}, options);
-		for (let name in this.defaults) {
-			switch (this.config[name]) {
-				case undefined:
-					if (getProperty(options, name) === undefined) {
-						setProperty(options, name, this.defaults[name]);
-					}
-					break;
-				case "call":
-					setProperty(
-						options,
-						name,
-						this.defaults[name].call(this, getProperty(options, name), options)
-					);
-					break;
-				case "make":
-					if (getProperty(options, name) === undefined) {
-						setProperty(options, name, this.defaults[name].call(this, options));
-					}
-					break;
-				case "append": {
-					let oldValue = getProperty(options, name);
-					if (!Array.isArray(oldValue)) {
-						oldValue = [];
-					}
-					oldValue.push(...this.defaults[name]);
-					setProperty(options, name, oldValue);
-					break;
-				}
-				default:
-					throw new Error(
-						"OptionsDefaulter cannot process " + this.config[name]
-					);
-			}
-		}
-		return options;
-	}
-
-	set(name, config, def) {
-		if (def !== undefined) {
-			this.defaults[name] = def;
-			this.config[name] = config;
-		} else {
-			this.defaults[name] = config;
-			delete this.config[name];
-		}
-	}
-}
-
-module.exports = OptionsDefaulter;
diff --git a/lib/Parser.js b/lib/Parser.js
index 7a83c983cff..8dd02c92bbf 100644
--- a/lib/Parser.js
+++ b/lib/Parser.js
@@ -2,2276 +2,38 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
-"use strict";
-
-// Syntax: https://developer.mozilla.org/en/SpiderMonkey/Parser_API
-
-const acorn = require("acorn");
-const acornDynamicImport = require("acorn-dynamic-import").default;
-const { Tapable, SyncBailHook, HookMap } = require("tapable");
-const util = require("util");
-const vm = require("vm");
-const BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
-const StackedSetMap = require("./util/StackedSetMap");
-const TrackingSet = require("./util/TrackingSet");
-
-const acornParser = acorn.Parser.extend(acornDynamicImport);
-
-const joinRanges = (startRange, endRange) => {
-	if (!endRange) return startRange;
-	if (!startRange) return endRange;
-	return [startRange[0], endRange[1]];
-};
-
-const defaultParserOptions = {
-	ranges: true,
-	locations: true,
-	ecmaVersion: 2019,
-	sourceType: "module",
-	onComment: null
-};
-
-// regexp to match at lease one "magic comment"
-const webpackCommentRegExp = new RegExp(/(^|\W)webpack[A-Z]{1,}[A-Za-z]{1,}:/);
-
-const EMPTY_ARRAY = [];
-
-const EMPTY_COMMENT_OPTIONS = {
-	options: null,
-	errors: null
-};
-
-class Parser extends Tapable {
-	constructor(options, sourceType = "auto") {
-		super();
-		this.hooks = {
-			evaluateTypeof: new HookMap(() => new SyncBailHook(["expression"])),
-			evaluate: new HookMap(() => new SyncBailHook(["expression"])),
-			evaluateIdentifier: new HookMap(() => new SyncBailHook(["expression"])),
-			evaluateDefinedIdentifier: new HookMap(
-				() => new SyncBailHook(["expression"])
-			),
-			evaluateCallExpressionMember: new HookMap(
-				() => new SyncBailHook(["expression", "param"])
-			),
-			statement: new SyncBailHook(["statement"]),
-			statementIf: new SyncBailHook(["statement"]),
-			label: new HookMap(() => new SyncBailHook(["statement"])),
-			import: new SyncBailHook(["statement", "source"]),
-			importSpecifier: new SyncBailHook([
-				"statement",
-				"source",
-				"exportName",
-				"identifierName"
-			]),
-			export: new SyncBailHook(["statement"]),
-			exportImport: new SyncBailHook(["statement", "source"]),
-			exportDeclaration: new SyncBailHook(["statement", "declaration"]),
-			exportExpression: new SyncBailHook(["statement", "declaration"]),
-			exportSpecifier: new SyncBailHook([
-				"statement",
-				"identifierName",
-				"exportName",
-				"index"
-			]),
-			exportImportSpecifier: new SyncBailHook([
-				"statement",
-				"source",
-				"identifierName",
-				"exportName",
-				"index"
-			]),
-			varDeclaration: new HookMap(() => new SyncBailHook(["declaration"])),
-			varDeclarationLet: new HookMap(() => new SyncBailHook(["declaration"])),
-			varDeclarationConst: new HookMap(() => new SyncBailHook(["declaration"])),
-			varDeclarationVar: new HookMap(() => new SyncBailHook(["declaration"])),
-			canRename: new HookMap(() => new SyncBailHook(["initExpression"])),
-			rename: new HookMap(() => new SyncBailHook(["initExpression"])),
-			assigned: new HookMap(() => new SyncBailHook(["expression"])),
-			assign: new HookMap(() => new SyncBailHook(["expression"])),
-			typeof: new HookMap(() => new SyncBailHook(["expression"])),
-			importCall: new SyncBailHook(["expression"]),
-			call: new HookMap(() => new SyncBailHook(["expression"])),
-			callAnyMember: new HookMap(() => new SyncBailHook(["expression"])),
-			new: new HookMap(() => new SyncBailHook(["expression"])),
-			expression: new HookMap(() => new SyncBailHook(["expression"])),
-			expressionAnyMember: new HookMap(() => new SyncBailHook(["expression"])),
-			expressionConditionalOperator: new SyncBailHook(["expression"]),
-			expressionLogicalOperator: new SyncBailHook(["expression"]),
-			program: new SyncBailHook(["ast", "comments"])
-		};
-		const HOOK_MAP_COMPAT_CONFIG = {
-			evaluateTypeof: /^evaluate typeof (.+)$/,
-			evaluateIdentifier: /^evaluate Identifier (.+)$/,
-			evaluateDefinedIdentifier: /^evaluate defined Identifier (.+)$/,
-			evaluateCallExpressionMember: /^evaluate CallExpression .(.+)$/,
-			evaluate: /^evaluate (.+)$/,
-			label: /^label (.+)$/,
-			varDeclarationLet: /^var-let (.+)$/,
-			varDeclarationConst: /^var-const (.+)$/,
-			varDeclarationVar: /^var-var (.+)$/,
-			varDeclaration: /^var (.+)$/,
-			canRename: /^can-rename (.+)$/,
-			rename: /^rename (.+)$/,
-			typeof: /^typeof (.+)$/,
-			assigned: /^assigned (.+)$/,
-			assign: /^assign (.+)$/,
-			callAnyMember: /^call (.+)\.\*$/,
-			call: /^call (.+)$/,
-			new: /^new (.+)$/,
-			expressionConditionalOperator: /^expression \?:$/,
-			expressionAnyMember: /^expression (.+)\.\*$/,
-			expression: /^expression (.+)$/
-		};
-		this._pluginCompat.tap("Parser", options => {
-			for (const name of Object.keys(HOOK_MAP_COMPAT_CONFIG)) {
-				const regexp = HOOK_MAP_COMPAT_CONFIG[name];
-				const match = regexp.exec(options.name);
-				if (match) {
-					if (match[1]) {
-						this.hooks[name].tap(
-							match[1],
-							options.fn.name || "unnamed compat plugin",
-							options.fn.bind(this)
-						);
-					} else {
-						this.hooks[name].tap(
-							options.fn.name || "unnamed compat plugin",
-							options.fn.bind(this)
-						);
-					}
-					return true;
-				}
-			}
-		});
-		this.options = options;
-		this.sourceType = sourceType;
-		this.scope = undefined;
-		this.state = undefined;
-		this.comments = undefined;
-		this.initializeEvaluating();
-	}
-
-	initializeEvaluating() {
-		this.hooks.evaluate.for("Literal").tap("Parser", expr => {
-			switch (typeof expr.value) {
-				case "number":
-					return new BasicEvaluatedExpression()
-						.setNumber(expr.value)
-						.setRange(expr.range);
-				case "string":
-					return new BasicEvaluatedExpression()
-						.setString(expr.value)
-						.setRange(expr.range);
-				case "boolean":
-					return new BasicEvaluatedExpression()
-						.setBoolean(expr.value)
-						.setRange(expr.range);
-			}
-			if (expr.value === null) {
-				return new BasicEvaluatedExpression().setNull().setRange(expr.range);
-			}
-			if (expr.value instanceof RegExp) {
-				return new BasicEvaluatedExpression()
-					.setRegExp(expr.value)
-					.setRange(expr.range);
-			}
-		});
-		this.hooks.evaluate.for("LogicalExpression").tap("Parser", expr => {
-			let left;
-			let leftAsBool;
-			let right;
-			if (expr.operator === "&&") {
-				left = this.evaluateExpression(expr.left);
-				leftAsBool = left && left.asBool();
-				if (leftAsBool === false) return left.setRange(expr.range);
-				if (leftAsBool !== true) return;
-				right = this.evaluateExpression(expr.right);
-				return right.setRange(expr.range);
-			} else if (expr.operator === "||") {
-				left = this.evaluateExpression(expr.left);
-				leftAsBool = left && left.asBool();
-				if (leftAsBool === true) return left.setRange(expr.range);
-				if (leftAsBool !== false) return;
-				right = this.evaluateExpression(expr.right);
-				return right.setRange(expr.range);
-			}
-		});
-		this.hooks.evaluate.for("BinaryExpression").tap("Parser", expr => {
-			let left;
-			let right;
-			let res;
-			if (expr.operator === "+") {
-				left = this.evaluateExpression(expr.left);
-				right = this.evaluateExpression(expr.right);
-				if (!left || !right) return;
-				res = new BasicEvaluatedExpression();
-				if (left.isString()) {
-					if (right.isString()) {
-						res.setString(left.string + right.string);
-					} else if (right.isNumber()) {
-						res.setString(left.string + right.number);
-					} else if (
-						right.isWrapped() &&
-						right.prefix &&
-						right.prefix.isString()
-					) {
-						// "left" + ("prefix" + inner + "postfix")
-						// => ("leftprefix" + inner + "postfix")
-						res.setWrapped(
-							new BasicEvaluatedExpression()
-								.setString(left.string + right.prefix.string)
-								.setRange(joinRanges(left.range, right.prefix.range)),
-							right.postfix,
-							right.wrappedInnerExpressions
-						);
-					} else if (right.isWrapped()) {
-						// "left" + ([null] + inner + "postfix")
-						// => ("left" + inner + "postfix")
-						res.setWrapped(left, right.postfix, right.wrappedInnerExpressions);
-					} else {
-						// "left" + expr
-						// => ("left" + expr + "")
-						res.setWrapped(left, null, [right]);
-					}
-				} else if (left.isNumber()) {
-					if (right.isString()) {
-						res.setString(left.number + right.string);
-					} else if (right.isNumber()) {
-						res.setNumber(left.number + right.number);
-					} else {
-						return;
-					}
-				} else if (left.isWrapped()) {
-					if (left.postfix && left.postfix.isString() && right.isString()) {
-						// ("prefix" + inner + "postfix") + "right"
-						// => ("prefix" + inner + "postfixright")
-						res.setWrapped(
-							left.prefix,
-							new BasicEvaluatedExpression()
-								.setString(left.postfix.string + right.string)
-								.setRange(joinRanges(left.postfix.range, right.range)),
-							left.wrappedInnerExpressions
-						);
-					} else if (
-						left.postfix &&
-						left.postfix.isString() &&
-						right.isNumber()
-					) {
-						// ("prefix" + inner + "postfix") + 123
-						// => ("prefix" + inner + "postfix123")
-						res.setWrapped(
-							left.prefix,
-							new BasicEvaluatedExpression()
-								.setString(left.postfix.string + right.number)
-								.setRange(joinRanges(left.postfix.range, right.range)),
-							left.wrappedInnerExpressions
-						);
-					} else if (right.isString()) {
-						// ("prefix" + inner + [null]) + "right"
-						// => ("prefix" + inner + "right")
-						res.setWrapped(left.prefix, right, left.wrappedInnerExpressions);
-					} else if (right.isNumber()) {
-						// ("prefix" + inner + [null]) + 123
-						// => ("prefix" + inner + "123")
-						res.setWrapped(
-							left.prefix,
-							new BasicEvaluatedExpression()
-								.setString(right.number + "")
-								.setRange(right.range),
-							left.wrappedInnerExpressions
-						);
-					} else if (right.isWrapped()) {
-						// ("prefix1" + inner1 + "postfix1") + ("prefix2" + inner2 + "postfix2")
-						// ("prefix1" + inner1 + "postfix1" + "prefix2" + inner2 + "postfix2")
-						res.setWrapped(
-							left.prefix,
-							right.postfix,
-							left.wrappedInnerExpressions &&
-								right.wrappedInnerExpressions &&
-								left.wrappedInnerExpressions
-									.concat(left.postfix ? [left.postfix] : [])
-									.concat(right.prefix ? [right.prefix] : [])
-									.concat(right.wrappedInnerExpressions)
-						);
-					} else {
-						// ("prefix" + inner + postfix) + expr
-						// => ("prefix" + inner + postfix + expr + [null])
-						res.setWrapped(
-							left.prefix,
-							null,
-							left.wrappedInnerExpressions &&
-								left.wrappedInnerExpressions.concat(
-									left.postfix ? [left.postfix, right] : [right]
-								)
-						);
-					}
-				} else {
-					if (right.isString()) {
-						// left + "right"
-						// => ([null] + left + "right")
-						res.setWrapped(null, right, [left]);
-					} else if (right.isWrapped()) {
-						// left + (prefix + inner + "postfix")
-						// => ([null] + left + prefix + inner + "postfix")
-						res.setWrapped(
-							null,
-							right.postfix,
-							right.wrappedInnerExpressions &&
-								(right.prefix ? [left, right.prefix] : [left]).concat(
-									right.wrappedInnerExpressions
-								)
-						);
-					} else {
-						return;
-					}
-				}
-				res.setRange(expr.range);
-				return res;
-			} else if (expr.operator === "-") {
-				left = this.evaluateExpression(expr.left);
-				right = this.evaluateExpression(expr.right);
-				if (!left || !right) return;
-				if (!left.isNumber() || !right.isNumber()) return;
-				res = new BasicEvaluatedExpression();
-				res.setNumber(left.number - right.number);
-				res.setRange(expr.range);
-				return res;
-			} else if (expr.operator === "*") {
-				left = this.evaluateExpression(expr.left);
-				right = this.evaluateExpression(expr.right);
-				if (!left || !right) return;
-				if (!left.isNumber() || !right.isNumber()) return;
-				res = new BasicEvaluatedExpression();
-				res.setNumber(left.number * right.number);
-				res.setRange(expr.range);
-				return res;
-			} else if (expr.operator === "/") {
-				left = this.evaluateExpression(expr.left);
-				right = this.evaluateExpression(expr.right);
-				if (!left || !right) return;
-				if (!left.isNumber() || !right.isNumber()) return;
-				res = new BasicEvaluatedExpression();
-				res.setNumber(left.number / right.number);
-				res.setRange(expr.range);
-				return res;
-			} else if (expr.operator === "**") {
-				left = this.evaluateExpression(expr.left);
-				right = this.evaluateExpression(expr.right);
-				if (!left || !right) return;
-				if (!left.isNumber() || !right.isNumber()) return;
-				res = new BasicEvaluatedExpression();
-				res.setNumber(Math.pow(left.number, right.number));
-				res.setRange(expr.range);
-				return res;
-			} else if (expr.operator === "==" || expr.operator === "===") {
-				left = this.evaluateExpression(expr.left);
-				right = this.evaluateExpression(expr.right);
-				if (!left || !right) return;
-				res = new BasicEvaluatedExpression();
-				res.setRange(expr.range);
-				if (left.isString() && right.isString()) {
-					return res.setBoolean(left.string === right.string);
-				} else if (left.isNumber() && right.isNumber()) {
-					return res.setBoolean(left.number === right.number);
-				} else if (left.isBoolean() && right.isBoolean()) {
-					return res.setBoolean(left.bool === right.bool);
-				}
-			} else if (expr.operator === "!=" || expr.operator === "!==") {
-				left = this.evaluateExpression(expr.left);
-				right = this.evaluateExpression(expr.right);
-				if (!left || !right) return;
-				res = new BasicEvaluatedExpression();
-				res.setRange(expr.range);
-				if (left.isString() && right.isString()) {
-					return res.setBoolean(left.string !== right.string);
-				} else if (left.isNumber() && right.isNumber()) {
-					return res.setBoolean(left.number !== right.number);
-				} else if (left.isBoolean() && right.isBoolean()) {
-					return res.setBoolean(left.bool !== right.bool);
-				}
-			} else if (expr.operator === "&") {
-				left = this.evaluateExpression(expr.left);
-				right = this.evaluateExpression(expr.right);
-				if (!left || !right) return;
-				if (!left.isNumber() || !right.isNumber()) return;
-				res = new BasicEvaluatedExpression();
-				res.setNumber(left.number & right.number);
-				res.setRange(expr.range);
-				return res;
-			} else if (expr.operator === "|") {
-				left = this.evaluateExpression(expr.left);
-				right = this.evaluateExpression(expr.right);
-				if (!left || !right) return;
-				if (!left.isNumber() || !right.isNumber()) return;
-				res = new BasicEvaluatedExpression();
-				res.setNumber(left.number | right.number);
-				res.setRange(expr.range);
-				return res;
-			} else if (expr.operator === "^") {
-				left = this.evaluateExpression(expr.left);
-				right = this.evaluateExpression(expr.right);
-				if (!left || !right) return;
-				if (!left.isNumber() || !right.isNumber()) return;
-				res = new BasicEvaluatedExpression();
-				res.setNumber(left.number ^ right.number);
-				res.setRange(expr.range);
-				return res;
-			} else if (expr.operator === ">>>") {
-				left = this.evaluateExpression(expr.left);
-				right = this.evaluateExpression(expr.right);
-				if (!left || !right) return;
-				if (!left.isNumber() || !right.isNumber()) return;
-				res = new BasicEvaluatedExpression();
-				res.setNumber(left.number >>> right.number);
-				res.setRange(expr.range);
-				return res;
-			} else if (expr.operator === ">>") {
-				left = this.evaluateExpression(expr.left);
-				right = this.evaluateExpression(expr.right);
-				if (!left || !right) return;
-				if (!left.isNumber() || !right.isNumber()) return;
-				res = new BasicEvaluatedExpression();
-				res.setNumber(left.number >> right.number);
-				res.setRange(expr.range);
-				return res;
-			} else if (expr.operator === "<<") {
-				left = this.evaluateExpression(expr.left);
-				right = this.evaluateExpression(expr.right);
-				if (!left || !right) return;
-				if (!left.isNumber() || !right.isNumber()) return;
-				res = new BasicEvaluatedExpression();
-				res.setNumber(left.number << right.number);
-				res.setRange(expr.range);
-				return res;
-			}
-		});
-		this.hooks.evaluate.for("UnaryExpression").tap("Parser", expr => {
-			if (expr.operator === "typeof") {
-				let res;
-				let name;
-				if (expr.argument.type === "Identifier") {
-					name =
-						this.scope.renames.get(expr.argument.name) || expr.argument.name;
-					if (!this.scope.definitions.has(name)) {
-						const hook = this.hooks.evaluateTypeof.get(name);
-						if (hook !== undefined) {
-							res = hook.call(expr);
-							if (res !== undefined) return res;
-						}
-					}
-				}
-				if (expr.argument.type === "MemberExpression") {
-					const exprName = this.getNameForExpression(expr.argument);
-					if (exprName && exprName.free) {
-						const hook = this.hooks.evaluateTypeof.get(exprName.name);
-						if (hook !== undefined) {
-							res = hook.call(expr);
-							if (res !== undefined) return res;
-						}
-					}
-				}
-				if (expr.argument.type === "FunctionExpression") {
-					return new BasicEvaluatedExpression()
-						.setString("function")
-						.setRange(expr.range);
-				}
-				const arg = this.evaluateExpression(expr.argument);
-				if (arg.isString() || arg.isWrapped()) {
-					return new BasicEvaluatedExpression()
-						.setString("string")
-						.setRange(expr.range);
-				}
-				if (arg.isNumber()) {
-					return new BasicEvaluatedExpression()
-						.setString("number")
-						.setRange(expr.range);
-				}
-				if (arg.isBoolean()) {
-					return new BasicEvaluatedExpression()
-						.setString("boolean")
-						.setRange(expr.range);
-				}
-				if (arg.isArray() || arg.isConstArray() || arg.isRegExp()) {
-					return new BasicEvaluatedExpression()
-						.setString("object")
-						.setRange(expr.range);
-				}
-			} else if (expr.operator === "!") {
-				const argument = this.evaluateExpression(expr.argument);
-				if (!argument) return;
-				if (argument.isBoolean()) {
-					return new BasicEvaluatedExpression()
-						.setBoolean(!argument.bool)
-						.setRange(expr.range);
-				}
-				if (argument.isTruthy()) {
-					return new BasicEvaluatedExpression()
-						.setBoolean(false)
-						.setRange(expr.range);
-				}
-				if (argument.isFalsy()) {
-					return new BasicEvaluatedExpression()
-						.setBoolean(true)
-						.setRange(expr.range);
-				}
-				if (argument.isString()) {
-					return new BasicEvaluatedExpression()
-						.setBoolean(!argument.string)
-						.setRange(expr.range);
-				}
-				if (argument.isNumber()) {
-					return new BasicEvaluatedExpression()
-						.setBoolean(!argument.number)
-						.setRange(expr.range);
-				}
-			} else if (expr.operator === "~") {
-				const argument = this.evaluateExpression(expr.argument);
-				if (!argument) return;
-				if (!argument.isNumber()) return;
-				const res = new BasicEvaluatedExpression();
-				res.setNumber(~argument.number);
-				res.setRange(expr.range);
-				return res;
-			}
-		});
-		this.hooks.evaluateTypeof.for("undefined").tap("Parser", expr => {
-			return new BasicEvaluatedExpression()
-				.setString("undefined")
-				.setRange(expr.range);
-		});
-		this.hooks.evaluate.for("Identifier").tap("Parser", expr => {
-			const name = this.scope.renames.get(expr.name) || expr.name;
-			if (!this.scope.definitions.has(expr.name)) {
-				const hook = this.hooks.evaluateIdentifier.get(name);
-				if (hook !== undefined) {
-					const result = hook.call(expr);
-					if (result) return result;
-				}
-				return new BasicEvaluatedExpression()
-					.setIdentifier(name)
-					.setRange(expr.range);
-			} else {
-				const hook = this.hooks.evaluateDefinedIdentifier.get(name);
-				if (hook !== undefined) {
-					return hook.call(expr);
-				}
-			}
-		});
-		this.hooks.evaluate.for("ThisExpression").tap("Parser", expr => {
-			const name = this.scope.renames.get("this");
-			if (name) {
-				const hook = this.hooks.evaluateIdentifier.get(name);
-				if (hook !== undefined) {
-					const result = hook.call(expr);
-					if (result) return result;
-				}
-				return new BasicEvaluatedExpression()
-					.setIdentifier(name)
-					.setRange(expr.range);
-			}
-		});
-		this.hooks.evaluate.for("MemberExpression").tap("Parser", expression => {
-			let exprName = this.getNameForExpression(expression);
-			if (exprName) {
-				if (exprName.free) {
-					const hook = this.hooks.evaluateIdentifier.get(exprName.name);
-					if (hook !== undefined) {
-						const result = hook.call(expression);
-						if (result) return result;
-					}
-					return new BasicEvaluatedExpression()
-						.setIdentifier(exprName.name)
-						.setRange(expression.range);
-				} else {
-					const hook = this.hooks.evaluateDefinedIdentifier.get(exprName.name);
-					if (hook !== undefined) {
-						return hook.call(expression);
-					}
-				}
-			}
-		});
-		this.hooks.evaluate.for("CallExpression").tap("Parser", expr => {
-			if (expr.callee.type !== "MemberExpression") return;
-			if (
-				expr.callee.property.type !==
-				(expr.callee.computed ? "Literal" : "Identifier")
-			)
-				return;
-			const param = this.evaluateExpression(expr.callee.object);
-			if (!param) return;
-			const property = expr.callee.property.name || expr.callee.property.value;
-			const hook = this.hooks.evaluateCallExpressionMember.get(property);
-			if (hook !== undefined) {
-				return hook.call(expr, param);
-			}
-		});
-		this.hooks.evaluateCallExpressionMember
-			.for("replace")
-			.tap("Parser", (expr, param) => {
-				if (!param.isString()) return;
-				if (expr.arguments.length !== 2) return;
-				let arg1 = this.evaluateExpression(expr.arguments[0]);
-				let arg2 = this.evaluateExpression(expr.arguments[1]);
-				if (!arg1.isString() && !arg1.isRegExp()) return;
-				arg1 = arg1.regExp || arg1.string;
-				if (!arg2.isString()) return;
-				arg2 = arg2.string;
-				return new BasicEvaluatedExpression()
-					.setString(param.string.replace(arg1, arg2))
-					.setRange(expr.range);
-			});
-		["substr", "substring"].forEach(fn => {
-			this.hooks.evaluateCallExpressionMember
-				.for(fn)
-				.tap("Parser", (expr, param) => {
-					if (!param.isString()) return;
-					let arg1;
-					let result,
-						str = param.string;
-					switch (expr.arguments.length) {
-						case 1:
-							arg1 = this.evaluateExpression(expr.arguments[0]);
-							if (!arg1.isNumber()) return;
-							result = str[fn](arg1.number);
-							break;
-						case 2: {
-							arg1 = this.evaluateExpression(expr.arguments[0]);
-							const arg2 = this.evaluateExpression(expr.arguments[1]);
-							if (!arg1.isNumber()) return;
-							if (!arg2.isNumber()) return;
-							result = str[fn](arg1.number, arg2.number);
-							break;
-						}
-						default:
-							return;
-					}
-					return new BasicEvaluatedExpression()
-						.setString(result)
-						.setRange(expr.range);
-				});
-		});
-
-		/**
-		 * @param {string} kind "cooked" | "raw"
-		 * @param {TODO} templateLiteralExpr TemplateLiteral expr
-		 * @returns {{quasis: BasicEvaluatedExpression[], parts: BasicEvaluatedExpression[]}} Simplified template
-		 */
-		const getSimplifiedTemplateResult = (kind, templateLiteralExpr) => {
-			const quasis = [];
-			const parts = [];
-
-			for (let i = 0; i < templateLiteralExpr.quasis.length; i++) {
-				const quasiExpr = templateLiteralExpr.quasis[i];
-				const quasi = quasiExpr.value[kind];
-
-				if (i > 0) {
-					const prevExpr = parts[parts.length - 1];
-					const expr = this.evaluateExpression(
-						templateLiteralExpr.expressions[i - 1]
-					);
-					const exprAsString = expr.asString();
-					if (typeof exprAsString === "string") {
-						// We can merge quasi + expr + quasi when expr
-						// is a const string
-
-						prevExpr.setString(prevExpr.string + exprAsString + quasi);
-						prevExpr.setRange([prevExpr.range[0], quasiExpr.range[1]]);
-						// We unset the expression as it doesn't match to a single expression
-						prevExpr.setExpression(undefined);
-						continue;
-					}
-					parts.push(expr);
-				}
-
-				const part = new BasicEvaluatedExpression()
-					.setString(quasi)
-					.setRange(quasiExpr.range)
-					.setExpression(quasiExpr);
-				quasis.push(part);
-				parts.push(part);
-			}
-			return {
-				quasis,
-				parts
-			};
-		};
-
-		this.hooks.evaluate.for("TemplateLiteral").tap("Parser", node => {
-			const { quasis, parts } = getSimplifiedTemplateResult("cooked", node);
-			if (parts.length === 1) {
-				return parts[0].setRange(node.range);
-			}
-			return new BasicEvaluatedExpression()
-				.setTemplateString(quasis, parts, "cooked")
-				.setRange(node.range);
-		});
-		this.hooks.evaluate.for("TaggedTemplateExpression").tap("Parser", node => {
-			if (this.evaluateExpression(node.tag).identifier !== "String.raw") return;
-			const { quasis, parts } = getSimplifiedTemplateResult("raw", node.quasi);
-			if (parts.length === 1) {
-				return parts[0].setRange(node.range);
-			}
-			return new BasicEvaluatedExpression()
-				.setTemplateString(quasis, parts, "raw")
-				.setRange(node.range);
-		});
-
-		this.hooks.evaluateCallExpressionMember
-			.for("concat")
-			.tap("Parser", (expr, param) => {
-				if (!param.isString() && !param.isWrapped()) return;
-
-				let stringSuffix = null;
-				let hasUnknownParams = false;
-				for (let i = expr.arguments.length - 1; i >= 0; i--) {
-					const argExpr = this.evaluateExpression(expr.arguments[i]);
-					if (!argExpr.isString() && !argExpr.isNumber()) {
-						hasUnknownParams = true;
-						break;
-					}
-
-					const value = argExpr.isString()
-						? argExpr.string
-						: "" + argExpr.number;
-
-					const newString = value + (stringSuffix ? stringSuffix.string : "");
-					const newRange = [
-						argExpr.range[0],
-						(stringSuffix || argExpr).range[1]
-					];
-					stringSuffix = new BasicEvaluatedExpression()
-						.setString(newString)
-						.setRange(newRange);
-				}
-
-				if (hasUnknownParams) {
-					const prefix = param.isString() ? param : param.prefix;
-					return new BasicEvaluatedExpression()
-						.setWrapped(prefix, stringSuffix)
-						.setRange(expr.range);
-				} else if (param.isWrapped()) {
-					const postfix = stringSuffix || param.postfix;
-					return new BasicEvaluatedExpression()
-						.setWrapped(param.prefix, postfix)
-						.setRange(expr.range);
-				} else {
-					const newString =
-						param.string + (stringSuffix ? stringSuffix.string : "");
-					return new BasicEvaluatedExpression()
-						.setString(newString)
-						.setRange(expr.range);
-				}
-			});
-		this.hooks.evaluateCallExpressionMember
-			.for("split")
-			.tap("Parser", (expr, param) => {
-				if (!param.isString()) return;
-				if (expr.arguments.length !== 1) return;
-				let result;
-				const arg = this.evaluateExpression(expr.arguments[0]);
-				if (arg.isString()) {
-					result = param.string.split(arg.string);
-				} else if (arg.isRegExp()) {
-					result = param.string.split(arg.regExp);
-				} else {
-					return;
-				}
-				return new BasicEvaluatedExpression()
-					.setArray(result)
-					.setRange(expr.range);
-			});
-		this.hooks.evaluate.for("ConditionalExpression").tap("Parser", expr => {
-			const condition = this.evaluateExpression(expr.test);
-			const conditionValue = condition.asBool();
-			let res;
-			if (conditionValue === undefined) {
-				const consequent = this.evaluateExpression(expr.consequent);
-				const alternate = this.evaluateExpression(expr.alternate);
-				if (!consequent || !alternate) return;
-				res = new BasicEvaluatedExpression();
-				if (consequent.isConditional()) {
-					res.setOptions(consequent.options);
-				} else {
-					res.setOptions([consequent]);
-				}
-				if (alternate.isConditional()) {
-					res.addOptions(alternate.options);
-				} else {
-					res.addOptions([alternate]);
-				}
-			} else {
-				res = this.evaluateExpression(
-					conditionValue ? expr.consequent : expr.alternate
-				);
-			}
-			res.setRange(expr.range);
-			return res;
-		});
-		this.hooks.evaluate.for("ArrayExpression").tap("Parser", expr => {
-			const items = expr.elements.map(element => {
-				return element !== null && this.evaluateExpression(element);
-			});
-			if (!items.every(Boolean)) return;
-			return new BasicEvaluatedExpression()
-				.setItems(items)
-				.setRange(expr.range);
-		});
-	}
-
-	getRenameIdentifier(expr) {
-		const result = this.evaluateExpression(expr);
-		if (result && result.isIdentifier()) {
-			return result.identifier;
-		}
-	}
-
-	walkClass(classy) {
-		if (classy.superClass) this.walkExpression(classy.superClass);
-		if (classy.body && classy.body.type === "ClassBody") {
-			const wasTopLevel = this.scope.topLevelScope;
-			this.scope.topLevelScope = false;
-			for (const methodDefinition of classy.body.body) {
-				if (methodDefinition.type === "MethodDefinition") {
-					this.walkMethodDefinition(methodDefinition);
-				}
-			}
-			this.scope.topLevelScope = wasTopLevel;
-		}
-	}
-
-	walkMethodDefinition(methodDefinition) {
-		if (methodDefinition.computed && methodDefinition.key) {
-			this.walkExpression(methodDefinition.key);
-		}
-		if (methodDefinition.value) {
-			this.walkExpression(methodDefinition.value);
-		}
-	}
-
-	// Prewalking iterates the scope for variable declarations
-	prewalkStatements(statements) {
-		for (let index = 0, len = statements.length; index < len; index++) {
-			const statement = statements[index];
-			this.prewalkStatement(statement);
-		}
-	}
-
-	// Walking iterates the statements and expressions and processes them
-	walkStatements(statements) {
-		for (let index = 0, len = statements.length; index < len; index++) {
-			const statement = statements[index];
-			this.walkStatement(statement);
-		}
-	}
-
-	prewalkStatement(statement) {
-		switch (statement.type) {
-			case "BlockStatement":
-				this.prewalkBlockStatement(statement);
-				break;
-			case "ClassDeclaration":
-				this.prewalkClassDeclaration(statement);
-				break;
-			case "DoWhileStatement":
-				this.prewalkDoWhileStatement(statement);
-				break;
-			case "ExportAllDeclaration":
-				this.prewalkExportAllDeclaration(statement);
-				break;
-			case "ExportDefaultDeclaration":
-				this.prewalkExportDefaultDeclaration(statement);
-				break;
-			case "ExportNamedDeclaration":
-				this.prewalkExportNamedDeclaration(statement);
-				break;
-			case "ForInStatement":
-				this.prewalkForInStatement(statement);
-				break;
-			case "ForOfStatement":
-				this.prewalkForOfStatement(statement);
-				break;
-			case "ForStatement":
-				this.prewalkForStatement(statement);
-				break;
-			case "FunctionDeclaration":
-				this.prewalkFunctionDeclaration(statement);
-				break;
-			case "IfStatement":
-				this.prewalkIfStatement(statement);
-				break;
-			case "ImportDeclaration":
-				this.prewalkImportDeclaration(statement);
-				break;
-			case "LabeledStatement":
-				this.prewalkLabeledStatement(statement);
-				break;
-			case "SwitchStatement":
-				this.prewalkSwitchStatement(statement);
-				break;
-			case "TryStatement":
-				this.prewalkTryStatement(statement);
-				break;
-			case "VariableDeclaration":
-				this.prewalkVariableDeclaration(statement);
-				break;
-			case "WhileStatement":
-				this.prewalkWhileStatement(statement);
-				break;
-			case "WithStatement":
-				this.prewalkWithStatement(statement);
-				break;
-		}
-	}
-
-	walkStatement(statement) {
-		if (this.hooks.statement.call(statement) !== undefined) return;
-		switch (statement.type) {
-			case "BlockStatement":
-				this.walkBlockStatement(statement);
-				break;
-			case "ClassDeclaration":
-				this.walkClassDeclaration(statement);
-				break;
-			case "DoWhileStatement":
-				this.walkDoWhileStatement(statement);
-				break;
-			case "ExportDefaultDeclaration":
-				this.walkExportDefaultDeclaration(statement);
-				break;
-			case "ExportNamedDeclaration":
-				this.walkExportNamedDeclaration(statement);
-				break;
-			case "ExpressionStatement":
-				this.walkExpressionStatement(statement);
-				break;
-			case "ForInStatement":
-				this.walkForInStatement(statement);
-				break;
-			case "ForOfStatement":
-				this.walkForOfStatement(statement);
-				break;
-			case "ForStatement":
-				this.walkForStatement(statement);
-				break;
-			case "FunctionDeclaration":
-				this.walkFunctionDeclaration(statement);
-				break;
-			case "IfStatement":
-				this.walkIfStatement(statement);
-				break;
-			case "LabeledStatement":
-				this.walkLabeledStatement(statement);
-				break;
-			case "ReturnStatement":
-				this.walkReturnStatement(statement);
-				break;
-			case "SwitchStatement":
-				this.walkSwitchStatement(statement);
-				break;
-			case "ThrowStatement":
-				this.walkThrowStatement(statement);
-				break;
-			case "TryStatement":
-				this.walkTryStatement(statement);
-				break;
-			case "VariableDeclaration":
-				this.walkVariableDeclaration(statement);
-				break;
-			case "WhileStatement":
-				this.walkWhileStatement(statement);
-				break;
-			case "WithStatement":
-				this.walkWithStatement(statement);
-				break;
-		}
-	}
-
-	// Real Statements
-	prewalkBlockStatement(statement) {
-		this.prewalkStatements(statement.body);
-	}
-
-	walkBlockStatement(statement) {
-		this.walkStatements(statement.body);
-	}
-
-	walkExpressionStatement(statement) {
-		this.walkExpression(statement.expression);
-	}
-
-	prewalkIfStatement(statement) {
-		this.prewalkStatement(statement.consequent);
-		if (statement.alternate) {
-			this.prewalkStatement(statement.alternate);
-		}
-	}
-
-	walkIfStatement(statement) {
-		const result = this.hooks.statementIf.call(statement);
-		if (result === undefined) {
-			this.walkExpression(statement.test);
-			this.walkStatement(statement.consequent);
-			if (statement.alternate) {
-				this.walkStatement(statement.alternate);
-			}
-		} else {
-			if (result) {
-				this.walkStatement(statement.consequent);
-			} else if (statement.alternate) {
-				this.walkStatement(statement.alternate);
-			}
-		}
-	}
-
-	prewalkLabeledStatement(statement) {
-		this.prewalkStatement(statement.body);
-	}
-
-	walkLabeledStatement(statement) {
-		const hook = this.hooks.label.get(statement.label.name);
-		if (hook !== undefined) {
-			const result = hook.call(statement);
-			if (result === true) return;
-		}
-		this.walkStatement(statement.body);
-	}
-
-	prewalkWithStatement(statement) {
-		this.prewalkStatement(statement.body);
-	}
-
-	walkWithStatement(statement) {
-		this.walkExpression(statement.object);
-		this.walkStatement(statement.body);
-	}
-
-	prewalkSwitchStatement(statement) {
-		this.prewalkSwitchCases(statement.cases);
-	}
 
-	walkSwitchStatement(statement) {
-		this.walkExpression(statement.discriminant);
-		this.walkSwitchCases(statement.cases);
-	}
-
-	walkTerminatingStatement(statement) {
-		if (statement.argument) this.walkExpression(statement.argument);
-	}
-
-	walkReturnStatement(statement) {
-		this.walkTerminatingStatement(statement);
-	}
-
-	walkThrowStatement(statement) {
-		this.walkTerminatingStatement(statement);
-	}
-
-	prewalkTryStatement(statement) {
-		this.prewalkStatement(statement.block);
-	}
-
-	walkTryStatement(statement) {
-		if (this.scope.inTry) {
-			this.walkStatement(statement.block);
-		} else {
-			this.scope.inTry = true;
-			this.walkStatement(statement.block);
-			this.scope.inTry = false;
-		}
-		if (statement.handler) this.walkCatchClause(statement.handler);
-		if (statement.finalizer) this.walkStatement(statement.finalizer);
-	}
-
-	prewalkWhileStatement(statement) {
-		this.prewalkStatement(statement.body);
-	}
-
-	walkWhileStatement(statement) {
-		this.walkExpression(statement.test);
-		this.walkStatement(statement.body);
-	}
-
-	prewalkDoWhileStatement(statement) {
-		this.prewalkStatement(statement.body);
-	}
-
-	walkDoWhileStatement(statement) {
-		this.walkStatement(statement.body);
-		this.walkExpression(statement.test);
-	}
-
-	prewalkForStatement(statement) {
-		if (statement.init) {
-			if (statement.init.type === "VariableDeclaration") {
-				this.prewalkStatement(statement.init);
-			}
-		}
-		this.prewalkStatement(statement.body);
-	}
-
-	walkForStatement(statement) {
-		if (statement.init) {
-			if (statement.init.type === "VariableDeclaration") {
-				this.walkStatement(statement.init);
-			} else {
-				this.walkExpression(statement.init);
-			}
-		}
-		if (statement.test) {
-			this.walkExpression(statement.test);
-		}
-		if (statement.update) {
-			this.walkExpression(statement.update);
-		}
-		this.walkStatement(statement.body);
-	}
-
-	prewalkForInStatement(statement) {
-		if (statement.left.type === "VariableDeclaration") {
-			this.prewalkVariableDeclaration(statement.left);
-		}
-		this.prewalkStatement(statement.body);
-	}
-
-	walkForInStatement(statement) {
-		if (statement.left.type === "VariableDeclaration") {
-			this.walkVariableDeclaration(statement.left);
-		} else {
-			this.walkPattern(statement.left);
-		}
-		this.walkExpression(statement.right);
-		this.walkStatement(statement.body);
-	}
-
-	prewalkForOfStatement(statement) {
-		if (statement.left.type === "VariableDeclaration") {
-			this.prewalkVariableDeclaration(statement.left);
-		}
-		this.prewalkStatement(statement.body);
-	}
-
-	walkForOfStatement(statement) {
-		if (statement.left.type === "VariableDeclaration") {
-			this.walkVariableDeclaration(statement.left);
-		} else {
-			this.walkPattern(statement.left);
-		}
-		this.walkExpression(statement.right);
-		this.walkStatement(statement.body);
-	}
-
-	// Declarations
-	prewalkFunctionDeclaration(statement) {
-		if (statement.id) {
-			this.scope.renames.set(statement.id.name, null);
-			this.scope.definitions.add(statement.id.name);
-		}
-	}
-
-	walkFunctionDeclaration(statement) {
-		const wasTopLevel = this.scope.topLevelScope;
-		this.scope.topLevelScope = false;
-		this.inScope(statement.params, () => {
-			for (const param of statement.params) {
-				this.walkPattern(param);
-			}
-			if (statement.body.type === "BlockStatement") {
-				this.detectStrictMode(statement.body.body);
-				this.prewalkStatement(statement.body);
-				this.walkStatement(statement.body);
-			} else {
-				this.walkExpression(statement.body);
-			}
-		});
-		this.scope.topLevelScope = wasTopLevel;
-	}
-
-	prewalkImportDeclaration(statement) {
-		const source = statement.source.value;
-		this.hooks.import.call(statement, source);
-		for (const specifier of statement.specifiers) {
-			const name = specifier.local.name;
-			this.scope.renames.set(name, null);
-			this.scope.definitions.add(name);
-			switch (specifier.type) {
-				case "ImportDefaultSpecifier":
-					this.hooks.importSpecifier.call(statement, source, "default", name);
-					break;
-				case "ImportSpecifier":
-					this.hooks.importSpecifier.call(
-						statement,
-						source,
-						specifier.imported.name,
-						name
-					);
-					break;
-				case "ImportNamespaceSpecifier":
-					this.hooks.importSpecifier.call(statement, source, null, name);
-					break;
-			}
-		}
-	}
-
-	prewalkExportNamedDeclaration(statement) {
-		let source;
-		if (statement.source) {
-			source = statement.source.value;
-			this.hooks.exportImport.call(statement, source);
-		} else {
-			this.hooks.export.call(statement);
-		}
-		if (statement.declaration) {
-			if (
-				!this.hooks.exportDeclaration.call(statement, statement.declaration)
-			) {
-				const originalDefinitions = this.scope.definitions;
-				const tracker = new TrackingSet(this.scope.definitions);
-				this.scope.definitions = tracker;
-				this.prewalkStatement(statement.declaration);
-				const newDefs = Array.from(tracker.getAddedItems());
-				this.scope.definitions = originalDefinitions;
-				for (let index = newDefs.length - 1; index >= 0; index--) {
-					const def = newDefs[index];
-					this.hooks.exportSpecifier.call(statement, def, def, index);
-				}
-			}
-		}
-		if (statement.specifiers) {
-			for (
-				let specifierIndex = 0;
-				specifierIndex < statement.specifiers.length;
-				specifierIndex++
-			) {
-				const specifier = statement.specifiers[specifierIndex];
-				switch (specifier.type) {
-					case "ExportSpecifier": {
-						const name = specifier.exported.name;
-						if (source) {
-							this.hooks.exportImportSpecifier.call(
-								statement,
-								source,
-								specifier.local.name,
-								name,
-								specifierIndex
-							);
-						} else {
-							this.hooks.exportSpecifier.call(
-								statement,
-								specifier.local.name,
-								name,
-								specifierIndex
-							);
-						}
-						break;
-					}
-				}
-			}
-		}
-	}
-
-	walkExportNamedDeclaration(statement) {
-		if (statement.declaration) {
-			this.walkStatement(statement.declaration);
-		}
-	}
-
-	prewalkExportDefaultDeclaration(statement) {
-		if (statement.declaration.id) {
-			const originalDefinitions = this.scope.definitions;
-			const tracker = new TrackingSet(this.scope.definitions);
-			this.scope.definitions = tracker;
-			this.prewalkStatement(statement.declaration);
-			const newDefs = Array.from(tracker.getAddedItems());
-			this.scope.definitions = originalDefinitions;
-			for (let index = 0, len = newDefs.length; index < len; index++) {
-				const def = newDefs[index];
-				this.hooks.exportSpecifier.call(statement, def, "default");
-			}
-		}
-	}
-
-	walkExportDefaultDeclaration(statement) {
-		this.hooks.export.call(statement);
-		if (
-			statement.declaration.id &&
-			statement.declaration.type !== "FunctionExpression" &&
-			statement.declaration.type !== "ClassExpression"
-		) {
-			if (
-				!this.hooks.exportDeclaration.call(statement, statement.declaration)
-			) {
-				this.walkStatement(statement.declaration);
-			}
-		} else {
-			// Acorn parses `export default function() {}` as `FunctionDeclaration` and
-			// `export default class {}` as `ClassDeclaration`, both with `id = null`.
-			// These nodes must be treated as expressions.
-			if (statement.declaration.type === "FunctionDeclaration") {
-				this.walkFunctionDeclaration(statement.declaration);
-			} else if (statement.declaration.type === "ClassDeclaration") {
-				this.walkClassDeclaration(statement.declaration);
-			} else {
-				this.walkExpression(statement.declaration);
-			}
-			if (!this.hooks.exportExpression.call(statement, statement.declaration)) {
-				this.hooks.exportSpecifier.call(
-					statement,
-					statement.declaration,
-					"default"
-				);
-			}
-		}
-	}
-
-	prewalkExportAllDeclaration(statement) {
-		const source = statement.source.value;
-		this.hooks.exportImport.call(statement, source);
-		this.hooks.exportImportSpecifier.call(statement, source, null, null, 0);
-	}
-
-	prewalkVariableDeclaration(statement) {
-		const hookMap =
-			statement.kind === "const"
-				? this.hooks.varDeclarationConst
-				: statement.kind === "let"
-					? this.hooks.varDeclarationLet
-					: this.hooks.varDeclarationVar;
-		for (const declarator of statement.declarations) {
-			switch (declarator.type) {
-				case "VariableDeclarator": {
-					this.enterPattern(declarator.id, (name, decl) => {
-						let hook = hookMap.get(name);
-						if (hook === undefined || !hook.call(decl)) {
-							hook = this.hooks.varDeclaration.get(name);
-							if (hook === undefined || !hook.call(decl)) {
-								this.scope.renames.set(name, null);
-								this.scope.definitions.add(name);
-							}
-						}
-					});
-					break;
-				}
-			}
-		}
-	}
-
-	walkVariableDeclaration(statement) {
-		for (const declarator of statement.declarations) {
-			switch (declarator.type) {
-				case "VariableDeclarator": {
-					const renameIdentifier =
-						declarator.init && this.getRenameIdentifier(declarator.init);
-					if (renameIdentifier && declarator.id.type === "Identifier") {
-						const hook = this.hooks.canRename.get(renameIdentifier);
-						if (hook !== undefined && hook.call(declarator.init)) {
-							// renaming with "var a = b;"
-							const hook = this.hooks.rename.get(renameIdentifier);
-							if (hook === undefined || !hook.call(declarator.init)) {
-								this.scope.renames.set(
-									declarator.id.name,
-									this.scope.renames.get(renameIdentifier) || renameIdentifier
-								);
-								this.scope.definitions.delete(declarator.id.name);
-							}
-							break;
-						}
-					}
-					this.walkPattern(declarator.id);
-					if (declarator.init) this.walkExpression(declarator.init);
-					break;
-				}
-			}
-		}
-	}
-
-	prewalkClassDeclaration(statement) {
-		if (statement.id) {
-			this.scope.renames.set(statement.id.name, null);
-			this.scope.definitions.add(statement.id.name);
-		}
-	}
-
-	walkClassDeclaration(statement) {
-		this.walkClass(statement);
-	}
-
-	prewalkSwitchCases(switchCases) {
-		for (let index = 0, len = switchCases.length; index < len; index++) {
-			const switchCase = switchCases[index];
-			this.prewalkStatements(switchCase.consequent);
-		}
-	}
-
-	walkSwitchCases(switchCases) {
-		for (let index = 0, len = switchCases.length; index < len; index++) {
-			const switchCase = switchCases[index];
-
-			if (switchCase.test) {
-				this.walkExpression(switchCase.test);
-			}
-			this.walkStatements(switchCase.consequent);
-		}
-	}
-
-	walkCatchClause(catchClause) {
-		// Error binding is optional in catch clause since ECMAScript 2019
-		const errorBinding =
-			catchClause.param === null ? EMPTY_ARRAY : [catchClause.param];
-
-		this.inScope(errorBinding, () => {
-			this.prewalkStatement(catchClause.body);
-			this.walkStatement(catchClause.body);
-		});
-	}
-
-	walkPattern(pattern) {
-		switch (pattern.type) {
-			case "ArrayPattern":
-				this.walkArrayPattern(pattern);
-				break;
-			case "AssignmentPattern":
-				this.walkAssignmentPattern(pattern);
-				break;
-			case "MemberExpression":
-				this.walkMemberExpression(pattern);
-				break;
-			case "ObjectPattern":
-				this.walkObjectPattern(pattern);
-				break;
-			case "RestElement":
-				this.walkRestElement(pattern);
-				break;
-		}
-	}
-
-	walkAssignmentPattern(pattern) {
-		this.walkExpression(pattern.right);
-		this.walkPattern(pattern.left);
-	}
-
-	walkObjectPattern(pattern) {
-		for (let i = 0, len = pattern.properties.length; i < len; i++) {
-			const prop = pattern.properties[i];
-			if (prop) {
-				if (prop.computed) this.walkExpression(prop.key);
-				if (prop.value) this.walkPattern(prop.value);
-			}
-		}
-	}
-
-	walkArrayPattern(pattern) {
-		for (let i = 0, len = pattern.elements.length; i < len; i++) {
-			const element = pattern.elements[i];
-			if (element) this.walkPattern(element);
-		}
-	}
-
-	walkRestElement(pattern) {
-		this.walkPattern(pattern.argument);
-	}
-
-	walkExpressions(expressions) {
-		for (const expression of expressions) {
-			if (expression) {
-				this.walkExpression(expression);
-			}
-		}
-	}
-
-	walkExpression(expression) {
-		switch (expression.type) {
-			case "ArrayExpression":
-				this.walkArrayExpression(expression);
-				break;
-			case "ArrowFunctionExpression":
-				this.walkArrowFunctionExpression(expression);
-				break;
-			case "AssignmentExpression":
-				this.walkAssignmentExpression(expression);
-				break;
-			case "AwaitExpression":
-				this.walkAwaitExpression(expression);
-				break;
-			case "BinaryExpression":
-				this.walkBinaryExpression(expression);
-				break;
-			case "CallExpression":
-				this.walkCallExpression(expression);
-				break;
-			case "ClassExpression":
-				this.walkClassExpression(expression);
-				break;
-			case "ConditionalExpression":
-				this.walkConditionalExpression(expression);
-				break;
-			case "FunctionExpression":
-				this.walkFunctionExpression(expression);
-				break;
-			case "Identifier":
-				this.walkIdentifier(expression);
-				break;
-			case "LogicalExpression":
-				this.walkLogicalExpression(expression);
-				break;
-			case "MemberExpression":
-				this.walkMemberExpression(expression);
-				break;
-			case "NewExpression":
-				this.walkNewExpression(expression);
-				break;
-			case "ObjectExpression":
-				this.walkObjectExpression(expression);
-				break;
-			case "SequenceExpression":
-				this.walkSequenceExpression(expression);
-				break;
-			case "SpreadElement":
-				this.walkSpreadElement(expression);
-				break;
-			case "TaggedTemplateExpression":
-				this.walkTaggedTemplateExpression(expression);
-				break;
-			case "TemplateLiteral":
-				this.walkTemplateLiteral(expression);
-				break;
-			case "ThisExpression":
-				this.walkThisExpression(expression);
-				break;
-			case "UnaryExpression":
-				this.walkUnaryExpression(expression);
-				break;
-			case "UpdateExpression":
-				this.walkUpdateExpression(expression);
-				break;
-			case "YieldExpression":
-				this.walkYieldExpression(expression);
-				break;
-		}
-	}
-
-	walkAwaitExpression(expression) {
-		this.walkExpression(expression.argument);
-	}
-
-	walkArrayExpression(expression) {
-		if (expression.elements) {
-			this.walkExpressions(expression.elements);
-		}
-	}
-
-	walkSpreadElement(expression) {
-		if (expression.argument) {
-			this.walkExpression(expression.argument);
-		}
-	}
-
-	walkObjectExpression(expression) {
-		for (
-			let propIndex = 0, len = expression.properties.length;
-			propIndex < len;
-			propIndex++
-		) {
-			const prop = expression.properties[propIndex];
-			if (prop.type === "SpreadElement") {
-				this.walkExpression(prop.argument);
-				continue;
-			}
-			if (prop.computed) {
-				this.walkExpression(prop.key);
-			}
-			if (prop.shorthand) {
-				this.scope.inShorthand = true;
-			}
-			this.walkExpression(prop.value);
-			if (prop.shorthand) {
-				this.scope.inShorthand = false;
-			}
-		}
-	}
-
-	walkFunctionExpression(expression) {
-		const wasTopLevel = this.scope.topLevelScope;
-		this.scope.topLevelScope = false;
-		this.inScope(expression.params, () => {
-			for (const param of expression.params) {
-				this.walkPattern(param);
-			}
-			if (expression.body.type === "BlockStatement") {
-				this.detectStrictMode(expression.body.body);
-				this.prewalkStatement(expression.body);
-				this.walkStatement(expression.body);
-			} else {
-				this.walkExpression(expression.body);
-			}
-		});
-		this.scope.topLevelScope = wasTopLevel;
-	}
-
-	walkArrowFunctionExpression(expression) {
-		this.inScope(expression.params, () => {
-			for (const param of expression.params) {
-				this.walkPattern(param);
-			}
-			if (expression.body.type === "BlockStatement") {
-				this.detectStrictMode(expression.body.body);
-				this.prewalkStatement(expression.body);
-				this.walkStatement(expression.body);
-			} else {
-				this.walkExpression(expression.body);
-			}
-		});
-	}
-
-	walkSequenceExpression(expression) {
-		if (expression.expressions) this.walkExpressions(expression.expressions);
-	}
-
-	walkUpdateExpression(expression) {
-		this.walkExpression(expression.argument);
-	}
-
-	walkUnaryExpression(expression) {
-		if (expression.operator === "typeof") {
-			const exprName = this.getNameForExpression(expression.argument);
-			if (exprName && exprName.free) {
-				const hook = this.hooks.typeof.get(exprName.name);
-				if (hook !== undefined) {
-					const result = hook.call(expression);
-					if (result === true) return;
-				}
-			}
-		}
-		this.walkExpression(expression.argument);
-	}
-
-	walkLeftRightExpression(expression) {
-		this.walkExpression(expression.left);
-		this.walkExpression(expression.right);
-	}
-
-	walkBinaryExpression(expression) {
-		this.walkLeftRightExpression(expression);
-	}
-
-	walkLogicalExpression(expression) {
-		const result = this.hooks.expressionLogicalOperator.call(expression);
-		if (result === undefined) {
-			this.walkLeftRightExpression(expression);
-		} else {
-			if (result) {
-				this.walkExpression(expression.right);
-			}
-		}
-	}
-
-	walkAssignmentExpression(expression) {
-		const renameIdentifier = this.getRenameIdentifier(expression.right);
-		if (expression.left.type === "Identifier" && renameIdentifier) {
-			const hook = this.hooks.canRename.get(renameIdentifier);
-			if (hook !== undefined && hook.call(expression.right)) {
-				// renaming "a = b;"
-				const hook = this.hooks.rename.get(renameIdentifier);
-				if (hook === undefined || !hook.call(expression.right)) {
-					this.scope.renames.set(expression.left.name, renameIdentifier);
-					this.scope.definitions.delete(expression.left.name);
-				}
-				return;
-			}
-		}
-		if (expression.left.type === "Identifier") {
-			const assignedHook = this.hooks.assigned.get(expression.left.name);
-			if (assignedHook === undefined || !assignedHook.call(expression)) {
-				this.walkExpression(expression.right);
-			}
-			this.scope.renames.set(expression.left.name, null);
-			const assignHook = this.hooks.assign.get(expression.left.name);
-			if (assignHook === undefined || !assignHook.call(expression)) {
-				this.walkExpression(expression.left);
-			}
-			return;
-		}
-		this.walkExpression(expression.right);
-		this.walkPattern(expression.left);
-		this.enterPattern(expression.left, (name, decl) => {
-			this.scope.renames.set(name, null);
-		});
-	}
-
-	walkConditionalExpression(expression) {
-		const result = this.hooks.expressionConditionalOperator.call(expression);
-		if (result === undefined) {
-			this.walkExpression(expression.test);
-			this.walkExpression(expression.consequent);
-			if (expression.alternate) {
-				this.walkExpression(expression.alternate);
-			}
-		} else {
-			if (result) {
-				this.walkExpression(expression.consequent);
-			} else if (expression.alternate) {
-				this.walkExpression(expression.alternate);
-			}
-		}
-	}
-
-	walkNewExpression(expression) {
-		const callee = this.evaluateExpression(expression.callee);
-		if (callee.isIdentifier()) {
-			const hook = this.hooks.new.get(callee.identifier);
-			if (hook !== undefined) {
-				const result = hook.call(expression);
-				if (result === true) {
-					return;
-				}
-			}
-		}
-
-		this.walkExpression(expression.callee);
-		if (expression.arguments) {
-			this.walkExpressions(expression.arguments);
-		}
-	}
-
-	walkYieldExpression(expression) {
-		if (expression.argument) {
-			this.walkExpression(expression.argument);
-		}
-	}
-
-	walkTemplateLiteral(expression) {
-		if (expression.expressions) {
-			this.walkExpressions(expression.expressions);
-		}
-	}
-
-	walkTaggedTemplateExpression(expression) {
-		if (expression.tag) {
-			this.walkExpression(expression.tag);
-		}
-		if (expression.quasi && expression.quasi.expressions) {
-			this.walkExpressions(expression.quasi.expressions);
-		}
-	}
-
-	walkClassExpression(expression) {
-		this.walkClass(expression);
-	}
-
-	_walkIIFE(functionExpression, options, currentThis) {
-		const renameArgOrThis = argOrThis => {
-			const renameIdentifier = this.getRenameIdentifier(argOrThis);
-			if (renameIdentifier) {
-				const hook = this.hooks.canRename.get(renameIdentifier);
-				if (hook !== undefined && hook.call(argOrThis)) {
-					const hook = this.hooks.rename.get(renameIdentifier);
-					if (hook === undefined || !hook.call(argOrThis)) {
-						return renameIdentifier;
-					}
-				}
-			}
-			this.walkExpression(argOrThis);
-		};
-		const params = functionExpression.params;
-		const renameThis = currentThis ? renameArgOrThis(currentThis) : null;
-		const args = options.map(renameArgOrThis);
-		const wasTopLevel = this.scope.topLevelScope;
-		this.scope.topLevelScope = false;
-		this.inScope(params.filter((identifier, idx) => !args[idx]), () => {
-			if (renameThis) {
-				this.scope.renames.set("this", renameThis);
-			}
-			for (let i = 0; i < args.length; i++) {
-				const param = args[i];
-				if (!param) continue;
-				if (!params[i] || params[i].type !== "Identifier") continue;
-				this.scope.renames.set(params[i].name, param);
-			}
-			if (functionExpression.body.type === "BlockStatement") {
-				this.prewalkStatement(functionExpression.body);
-				this.walkStatement(functionExpression.body);
-			} else {
-				this.walkExpression(functionExpression.body);
-			}
-		});
-		this.scope.topLevelScope = wasTopLevel;
-	}
-
-	walkCallExpression(expression) {
-		if (
-			expression.callee.type === "MemberExpression" &&
-			expression.callee.object.type === "FunctionExpression" &&
-			!expression.callee.computed &&
-			(expression.callee.property.name === "call" ||
-				expression.callee.property.name === "bind") &&
-			expression.arguments.length > 0
-		) {
-			// (function(…) { }.call/bind(?, …))
-			this._walkIIFE(
-				expression.callee.object,
-				expression.arguments.slice(1),
-				expression.arguments[0]
-			);
-		} else if (expression.callee.type === "FunctionExpression") {
-			// (function(…) { }(…))
-			this._walkIIFE(expression.callee, expression.arguments, null);
-		} else if (expression.callee.type === "Import") {
-			let result = this.hooks.importCall.call(expression);
-			if (result === true) return;
-
-			if (expression.arguments) this.walkExpressions(expression.arguments);
-		} else {
-			const callee = this.evaluateExpression(expression.callee);
-			if (callee.isIdentifier()) {
-				const callHook = this.hooks.call.get(callee.identifier);
-				if (callHook !== undefined) {
-					let result = callHook.call(expression);
-					if (result === true) return;
-				}
-				let identifier = callee.identifier.replace(/\.[^.]+$/, "");
-				if (identifier !== callee.identifier) {
-					const callAnyHook = this.hooks.callAnyMember.get(identifier);
-					if (callAnyHook !== undefined) {
-						let result = callAnyHook.call(expression);
-						if (result === true) return;
-					}
-				}
-			}
-
-			if (expression.callee) this.walkExpression(expression.callee);
-			if (expression.arguments) this.walkExpressions(expression.arguments);
-		}
-	}
-
-	walkMemberExpression(expression) {
-		const exprName = this.getNameForExpression(expression);
-		if (exprName && exprName.free) {
-			const expressionHook = this.hooks.expression.get(exprName.name);
-			if (expressionHook !== undefined) {
-				const result = expressionHook.call(expression);
-				if (result === true) return;
-			}
-			const expressionAnyMemberHook = this.hooks.expressionAnyMember.get(
-				exprName.nameGeneral
-			);
-			if (expressionAnyMemberHook !== undefined) {
-				const result = expressionAnyMemberHook.call(expression);
-				if (result === true) return;
-			}
-		}
-		this.walkExpression(expression.object);
-		if (expression.computed === true) this.walkExpression(expression.property);
-	}
-
-	walkThisExpression(expression) {
-		const expressionHook = this.hooks.expression.get("this");
-		if (expressionHook !== undefined) {
-			expressionHook.call(expression);
-		}
-	}
-
-	walkIdentifier(expression) {
-		if (!this.scope.definitions.has(expression.name)) {
-			const hook = this.hooks.expression.get(
-				this.scope.renames.get(expression.name) || expression.name
-			);
-			if (hook !== undefined) {
-				const result = hook.call(expression);
-				if (result === true) return;
-			}
-		}
-	}
-
-	inScope(params, fn) {
-		const oldScope = this.scope;
-		this.scope = {
-			topLevelScope: oldScope.topLevelScope,
-			inTry: false,
-			inShorthand: false,
-			isStrict: oldScope.isStrict,
-			definitions: oldScope.definitions.createChild(),
-			renames: oldScope.renames.createChild()
-		};
-
-		this.scope.renames.set("this", null);
-
-		for (const param of params) {
-			if (typeof param !== "string") {
-				this.enterPattern(param, param => {
-					this.scope.renames.set(param, null);
-					this.scope.definitions.add(param);
-				});
-			} else if (param) {
-				this.scope.renames.set(param, null);
-				this.scope.definitions.add(param);
-			}
-		}
-
-		fn();
-		this.scope = oldScope;
-	}
-
-	detectStrictMode(statements) {
-		const isStrict =
-			statements.length >= 1 &&
-			statements[0].type === "ExpressionStatement" &&
-			statements[0].expression.type === "Literal" &&
-			statements[0].expression.value === "use strict";
-		if (isStrict) {
-			this.scope.isStrict = true;
-		}
-	}
-
-	enterPattern(pattern, onIdent) {
-		if (!pattern) return;
-		switch (pattern.type) {
-			case "ArrayPattern":
-				this.enterArrayPattern(pattern, onIdent);
-				break;
-			case "AssignmentPattern":
-				this.enterAssignmentPattern(pattern, onIdent);
-				break;
-			case "Identifier":
-				this.enterIdentifier(pattern, onIdent);
-				break;
-			case "ObjectPattern":
-				this.enterObjectPattern(pattern, onIdent);
-				break;
-			case "RestElement":
-				this.enterRestElement(pattern, onIdent);
-				break;
-		}
-	}
-
-	enterIdentifier(pattern, onIdent) {
-		onIdent(pattern.name, pattern);
-	}
-
-	enterObjectPattern(pattern, onIdent) {
-		for (
-			let propIndex = 0, len = pattern.properties.length;
-			propIndex < len;
-			propIndex++
-		) {
-			const prop = pattern.properties[propIndex];
-			this.enterPattern(prop.value, onIdent);
-		}
-	}
-
-	enterArrayPattern(pattern, onIdent) {
-		for (
-			let elementIndex = 0, len = pattern.elements.length;
-			elementIndex < len;
-			elementIndex++
-		) {
-			const element = pattern.elements[elementIndex];
-			this.enterPattern(element, onIdent);
-		}
-	}
-
-	enterRestElement(pattern, onIdent) {
-		this.enterPattern(pattern.argument, onIdent);
-	}
-
-	enterAssignmentPattern(pattern, onIdent) {
-		this.enterPattern(pattern.left, onIdent);
-	}
-
-	evaluateExpression(expression) {
-		try {
-			const hook = this.hooks.evaluate.get(expression.type);
-			if (hook !== undefined) {
-				const result = hook.call(expression);
-				if (result !== undefined) {
-					if (result) {
-						result.setExpression(expression);
-					}
-					return result;
-				}
-			}
-		} catch (e) {
-			console.warn(e);
-			// ignore error
-		}
-		return new BasicEvaluatedExpression()
-			.setRange(expression.range)
-			.setExpression(expression);
-	}
-
-	parseString(expression) {
-		switch (expression.type) {
-			case "BinaryExpression":
-				if (expression.operator === "+") {
-					return (
-						this.parseString(expression.left) +
-						this.parseString(expression.right)
-					);
-				}
-				break;
-			case "Literal":
-				return expression.value + "";
-		}
-		throw new Error(
-			expression.type + " is not supported as parameter for require"
-		);
-	}
-
-	parseCalculatedString(expression) {
-		switch (expression.type) {
-			case "BinaryExpression":
-				if (expression.operator === "+") {
-					const left = this.parseCalculatedString(expression.left);
-					const right = this.parseCalculatedString(expression.right);
-					if (left.code) {
-						return {
-							range: left.range,
-							value: left.value,
-							code: true,
-							conditional: false
-						};
-					} else if (right.code) {
-						return {
-							range: [
-								left.range[0],
-								right.range ? right.range[1] : left.range[1]
-							],
-							value: left.value + right.value,
-							code: true,
-							conditional: false
-						};
-					} else {
-						return {
-							range: [left.range[0], right.range[1]],
-							value: left.value + right.value,
-							code: false,
-							conditional: false
-						};
-					}
-				}
-				break;
-			case "ConditionalExpression": {
-				const consequent = this.parseCalculatedString(expression.consequent);
-				const alternate = this.parseCalculatedString(expression.alternate);
-				const items = [];
-				if (consequent.conditional) {
-					items.push(...consequent.conditional);
-				} else if (!consequent.code) {
-					items.push(consequent);
-				} else {
-					break;
-				}
-				if (alternate.conditional) {
-					items.push(...alternate.conditional);
-				} else if (!alternate.code) {
-					items.push(alternate);
-				} else {
-					break;
-				}
-				return {
-					range: undefined,
-					value: "",
-					code: true,
-					conditional: items
-				};
-			}
-			case "Literal":
-				return {
-					range: expression.range,
-					value: expression.value + "",
-					code: false,
-					conditional: false
-				};
-		}
-		return {
-			range: undefined,
-			value: "",
-			code: true,
-			conditional: false
-		};
-	}
-
-	parse(source, initialState) {
-		let ast;
-		let comments;
-		if (typeof source === "object" && source !== null) {
-			ast = source;
-			comments = source.comments;
-		} else {
-			comments = [];
-			ast = Parser.parse(source, {
-				sourceType: this.sourceType,
-				onComment: comments
-			});
-		}
-
-		const oldScope = this.scope;
-		const oldState = this.state;
-		const oldComments = this.comments;
-		this.scope = {
-			topLevelScope: true,
-			inTry: false,
-			inShorthand: false,
-			isStrict: false,
-			definitions: new StackedSetMap(),
-			renames: new StackedSetMap()
-		};
-		const state = (this.state = initialState || {});
-		this.comments = comments;
-		if (this.hooks.program.call(ast, comments) === undefined) {
-			this.detectStrictMode(ast.body);
-			this.prewalkStatements(ast.body);
-			this.walkStatements(ast.body);
-		}
-		this.scope = oldScope;
-		this.state = oldState;
-		this.comments = oldComments;
-		return state;
-	}
-
-	evaluate(source) {
-		const ast = Parser.parse("(" + source + ")", {
-			sourceType: this.sourceType,
-			locations: false
-		});
-		// TODO(https://github.com/acornjs/acorn/issues/741)
-		// @ts-ignore
-		if (ast.body.length !== 1 || ast.body[0].type !== "ExpressionStatement") {
-			throw new Error("evaluate: Source is not a expression");
-		}
-		// TODO(https://github.com/acornjs/acorn/issues/741)
-		// @ts-ignore
-		return this.evaluateExpression(ast.body[0].expression);
-	}
-
-	getComments(range) {
-		return this.comments.filter(
-			comment => comment.range[0] >= range[0] && comment.range[1] <= range[1]
-		);
-	}
-
-	parseCommentOptions(range) {
-		const comments = this.getComments(range);
-		if (comments.length === 0) {
-			return EMPTY_COMMENT_OPTIONS;
-		}
-		let options = {};
-		let errors = [];
-		for (const comment of comments) {
-			const { value } = comment;
-			if (value && webpackCommentRegExp.test(value)) {
-				// try compile only if webpack options comment is present
-				try {
-					const val = vm.runInNewContext(`(function(){return {${value}};})()`);
-					Object.assign(options, val);
-				} catch (e) {
-					e.comment = comment;
-					errors.push(e);
-				}
-			}
-		}
-		return { options, errors };
-	}
-
-	getNameForExpression(expression) {
-		let expr = expression;
-		const exprName = [];
-		while (
-			expr.type === "MemberExpression" &&
-			expr.property.type === (expr.computed ? "Literal" : "Identifier")
-		) {
-			exprName.push(expr.computed ? expr.property.value : expr.property.name);
-			expr = expr.object;
-		}
-		let free;
-		if (expr.type === "Identifier") {
-			free = !this.scope.definitions.has(expr.name);
-			exprName.push(this.scope.renames.get(expr.name) || expr.name);
-		} else if (
-			expr.type === "ThisExpression" &&
-			this.scope.renames.get("this")
-		) {
-			free = true;
-			exprName.push(this.scope.renames.get("this"));
-		} else if (expr.type === "ThisExpression") {
-			free = this.scope.topLevelScope;
-			exprName.push("this");
-		} else {
-			return null;
-		}
-		let prefix = "";
-		for (let i = exprName.length - 1; i >= 2; i--) {
-			prefix += exprName[i] + ".";
-		}
-		if (exprName.length > 1) {
-			prefix += exprName[1];
-		}
-		const name = prefix ? prefix + "." + exprName[0] : exprName[0];
-		const nameGeneral = prefix;
-		return {
-			name,
-			nameGeneral,
-			free
-		};
-	}
-
-	static parse(code, options) {
-		const type = options ? options.sourceType : "module";
-		const parserOptions = Object.assign(
-			Object.create(null),
-			defaultParserOptions,
-			options
-		);
-
-		if (type === "auto") {
-			parserOptions.sourceType = "module";
-		}
-
-		let ast;
-		let error;
-		let threw = false;
-		try {
-			ast = acornParser.parse(code, parserOptions);
-		} catch (e) {
-			error = e;
-			threw = true;
-		}
-
-		if (threw && type === "auto") {
-			parserOptions.sourceType = "script";
-			if (Array.isArray(parserOptions.onComment)) {
-				parserOptions.onComment.length = 0;
-			}
-			try {
-				ast = acornParser.parse(code, parserOptions);
-				threw = false;
-			} catch (e) {
-				threw = true;
-			}
-		}
-
-		if (threw) {
-			throw error;
-		}
+"use strict";
 
-		return ast;
+/** @typedef {import("../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
+/** @typedef {import("./Compilation")} Compilation */
+/** @typedef {import("./NormalModule")} NormalModule */
+
+/** @typedef {Record} PreparsedAst */
+
+/**
+ * @typedef {object} ParserStateBase
+ * @property {string | Buffer} source
+ * @property {NormalModule} current
+ * @property {NormalModule} module
+ * @property {Compilation} compilation
+ * @property {WebpackOptions} options
+ */
+
+/** @typedef {Record & ParserStateBase} ParserState */
+
+class Parser {
+	/* istanbul ignore next */
+	/**
+	 * @abstract
+	 * @param {string | Buffer | PreparsedAst} source the source to parse
+	 * @param {ParserState} state the parser state
+	 * @returns {ParserState} the parser state
+	 */
+	parse(source, state) {
+		const AbstractMethodError = require("./AbstractMethodError");
+		throw new AbstractMethodError();
 	}
 }
 
-// TODO remove in webpack 5
-Object.defineProperty(Parser.prototype, "getCommentOptions", {
-	configurable: false,
-	value: util.deprecate(
-		/**
-		 * @deprecated
-		 * @param {TODO} range Range
-		 * @returns {void}
-		 * @this {Parser}
-		 */
-		function(range) {
-			return this.parseCommentOptions(range).options;
-		},
-		"Parser.getCommentOptions: Use Parser.parseCommentOptions(range) instead"
-	)
-});
-
 module.exports = Parser;
diff --git a/lib/ParserHelpers.js b/lib/ParserHelpers.js
deleted file mode 100644
index 5248f12fe55..00000000000
--- a/lib/ParserHelpers.js
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-const path = require("path");
-
-const BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
-const ConstDependency = require("./dependencies/ConstDependency");
-const UnsupportedFeatureWarning = require("./UnsupportedFeatureWarning");
-
-const ParserHelpers = exports;
-
-ParserHelpers.addParsedVariableToModule = (parser, name, expression) => {
-	if (!parser.state.current.addVariable) return false;
-	var deps = [];
-	parser.parse(expression, {
-		current: {
-			addDependency: dep => {
-				dep.userRequest = name;
-				deps.push(dep);
-			}
-		},
-		module: parser.state.module
-	});
-	parser.state.current.addVariable(name, expression, deps);
-	return true;
-};
-
-ParserHelpers.requireFileAsExpression = (context, pathToModule) => {
-	var moduleJsPath = path.relative(context, pathToModule);
-	if (!/^[A-Z]:/i.test(moduleJsPath)) {
-		moduleJsPath = "./" + moduleJsPath.replace(/\\/g, "/");
-	}
-	return "require(" + JSON.stringify(moduleJsPath) + ")";
-};
-
-ParserHelpers.toConstantDependency = (parser, value) => {
-	return function constDependency(expr) {
-		var dep = new ConstDependency(value, expr.range, false);
-		dep.loc = expr.loc;
-		parser.state.current.addDependency(dep);
-		return true;
-	};
-};
-
-ParserHelpers.toConstantDependencyWithWebpackRequire = (parser, value) => {
-	return function constDependencyWithWebpackRequire(expr) {
-		var dep = new ConstDependency(value, expr.range, true);
-		dep.loc = expr.loc;
-		parser.state.current.addDependency(dep);
-		return true;
-	};
-};
-
-ParserHelpers.evaluateToString = value => {
-	return function stringExpression(expr) {
-		return new BasicEvaluatedExpression().setString(value).setRange(expr.range);
-	};
-};
-
-ParserHelpers.evaluateToBoolean = value => {
-	return function booleanExpression(expr) {
-		return new BasicEvaluatedExpression()
-			.setBoolean(value)
-			.setRange(expr.range);
-	};
-};
-
-ParserHelpers.evaluateToIdentifier = (identifier, truthy) => {
-	return function identifierExpression(expr) {
-		let evex = new BasicEvaluatedExpression()
-			.setIdentifier(identifier)
-			.setRange(expr.range);
-		if (truthy === true) {
-			evex = evex.setTruthy();
-		} else if (truthy === false) {
-			evex = evex.setFalsy();
-		}
-		return evex;
-	};
-};
-
-ParserHelpers.expressionIsUnsupported = (parser, message) => {
-	return function unsupportedExpression(expr) {
-		var dep = new ConstDependency("(void 0)", expr.range, false);
-		dep.loc = expr.loc;
-		parser.state.current.addDependency(dep);
-		if (!parser.state.module) return;
-		parser.state.module.warnings.push(
-			new UnsupportedFeatureWarning(parser.state.module, message, expr.loc)
-		);
-		return true;
-	};
-};
-
-ParserHelpers.skipTraversal = function skipTraversal() {
-	return true;
-};
-
-ParserHelpers.approve = function approve() {
-	return true;
-};
diff --git a/lib/PlatformPlugin.js b/lib/PlatformPlugin.js
new file mode 100644
index 00000000000..57a8808ceda
--- /dev/null
+++ b/lib/PlatformPlugin.js
@@ -0,0 +1,41 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Authors Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./config/target").PlatformTargetProperties} PlatformTargetProperties */
+
+const PLUGIN_NAME = "PlatformPlugin";
+
+/**
+ * Should be used only for "target === false" or
+ * when you want to overwrite platform target properties
+ */
+class PlatformPlugin {
+	/**
+	 * @param {Partial} platform target properties
+	 */
+	constructor(platform) {
+		/** @type {Partial} */
+		this.platform = platform;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.environment.tap(PLUGIN_NAME, () => {
+			compiler.platform = {
+				...compiler.platform,
+				...this.platform
+			};
+		});
+	}
+}
+
+module.exports = PlatformPlugin;
diff --git a/lib/PrefetchPlugin.js b/lib/PrefetchPlugin.js
index cc9d17c0c86..ce5d802ef5d 100644
--- a/lib/PrefetchPlugin.js
+++ b/lib/PrefetchPlugin.js
@@ -2,22 +2,38 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
 const PrefetchDependency = require("./dependencies/PrefetchDependency");
 
+/** @typedef {import("./Compiler")} Compiler */
+
+const PLUGIN_NAME = "PrefetchPlugin";
+
 class PrefetchPlugin {
+	/**
+	 * @param {string} context context or request if context is not set
+	 * @param {string=} request request
+	 */
 	constructor(context, request) {
-		if (!request) {
-			this.request = context;
-		} else {
+		if (request) {
 			this.context = context;
 			this.request = request;
+		} else {
+			this.context = null;
+			this.request = context;
 		}
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		compiler.hooks.compilation.tap(
-			"PrefetchPlugin",
+			PLUGIN_NAME,
 			(compilation, { normalModuleFactory }) => {
 				compilation.dependencyFactories.set(
 					PrefetchDependency,
@@ -25,13 +41,16 @@ class PrefetchPlugin {
 				);
 			}
 		);
-		compiler.hooks.make.tapAsync("PrefetchPlugin", (compilation, callback) => {
-			compilation.prefetch(
+		compiler.hooks.make.tapAsync(PLUGIN_NAME, (compilation, callback) => {
+			compilation.addModuleChain(
 				this.context || compiler.context,
 				new PrefetchDependency(this.request),
-				callback
+				err => {
+					callback(err);
+				}
 			);
 		});
 	}
 }
+
 module.exports = PrefetchPlugin;
diff --git a/lib/ProgressPlugin.js b/lib/ProgressPlugin.js
index 4f479f3395a..cb17eae22d0 100644
--- a/lib/ProgressPlugin.js
+++ b/lib/ProgressPlugin.js
@@ -2,330 +2,704 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const validateOptions = require("schema-utils");
-const schema = require("../schemas/plugins/ProgressPlugin.json");
+const Compiler = require("./Compiler");
+const MultiCompiler = require("./MultiCompiler");
+const NormalModule = require("./NormalModule");
+const createSchemaValidation = require("./util/create-schema-validation");
+const { contextify } = require("./util/identifier");
 
+/** @typedef {import("tapable").Tap} Tap */
+/** @typedef {import("../declarations/plugins/ProgressPlugin").HandlerFunction} HandlerFunction */
 /** @typedef {import("../declarations/plugins/ProgressPlugin").ProgressPluginArgument} ProgressPluginArgument */
 /** @typedef {import("../declarations/plugins/ProgressPlugin").ProgressPluginOptions} ProgressPluginOptions */
+/** @typedef {import("./Compilation").FactorizeModuleOptions} FactorizeModuleOptions */
+/** @typedef {import("./Dependency")} Dependency */
+/** @typedef {import("./Entrypoint").EntryOptions} EntryOptions */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./ModuleFactory").ModuleFactoryResult} ModuleFactoryResult */
+/** @typedef {import("./logging/Logger").Logger} Logger */
+
+/**
+ * @template T, K, R
+ * @typedef {import("./util/AsyncQueue")} AsyncQueue
+ */
+
+/**
+ * @typedef {object} CountsData
+ * @property {number} modulesCount modules count
+ * @property {number} dependenciesCount dependencies count
+ */
+
+const validate = createSchemaValidation(
+	require("../schemas/plugins/ProgressPlugin.check.js"),
+	() => require("../schemas/plugins/ProgressPlugin.json"),
+	{
+		name: "Progress Plugin",
+		baseDataPath: "options"
+	}
+);
+
+/**
+ * @param {number} a a
+ * @param {number} b b
+ * @param {number} c c
+ * @returns {number} median
+ */
+const median3 = (a, b, c) => a + b + c - Math.max(a, b, c) - Math.min(a, b, c);
 
-const createDefaultHandler = profile => {
-	let lineCaretPosition = 0;
-	let lastMessage = "";
-	let lastState;
-	let lastStateTime;
+/**
+ * @param {boolean | null | undefined} profile need profile
+ * @param {Logger} logger logger
+ * @returns {defaultHandler} default handler
+ */
+const createDefaultHandler = (profile, logger) => {
+	/** @type {{ value: string | undefined, time: number }[]} */
+	const lastStateInfo = [];
 
+	/**
+	 * @param {number} percentage percentage
+	 * @param {string} msg message
+	 * @param {...string} args additional arguments
+	 */
 	const defaultHandler = (percentage, msg, ...args) => {
-		let state = msg;
-		const details = args;
-		if (percentage < 1) {
-			percentage = Math.floor(percentage * 100);
-			msg = `${percentage}% ${msg}`;
-			if (percentage < 100) {
-				msg = ` ${msg}`;
-			}
-			if (percentage < 10) {
-				msg = ` ${msg}`;
-			}
-			for (let detail of details) {
-				if (!detail) continue;
-				if (detail.length > 40) {
-					detail = `...${detail.substr(detail.length - 39)}`;
-				}
-				msg += ` ${detail}`;
-			}
-		}
 		if (profile) {
-			state = state.replace(/^\d+\/\d+\s+/, "");
 			if (percentage === 0) {
-				lastState = null;
-				lastStateTime = Date.now();
-			} else if (state !== lastState || percentage === 1) {
-				const now = Date.now();
-				if (lastState) {
-					const stateMsg = `${now - lastStateTime}ms ${lastState}`;
-					goToLineStart(stateMsg);
-					process.stderr.write(stateMsg + "\n");
-					lineCaretPosition = 0;
+				lastStateInfo.length = 0;
+			}
+			const fullState = [msg, ...args];
+			const state = fullState.map(s => s.replace(/\d+\/\d+ /g, ""));
+			const now = Date.now();
+			const len = Math.max(state.length, lastStateInfo.length);
+			for (let i = len; i >= 0; i--) {
+				const stateItem = i < state.length ? state[i] : undefined;
+				const lastStateItem =
+					i < lastStateInfo.length ? lastStateInfo[i] : undefined;
+				if (lastStateItem) {
+					if (stateItem !== lastStateItem.value) {
+						const diff = now - lastStateItem.time;
+						if (lastStateItem.value) {
+							let reportState = lastStateItem.value;
+							if (i > 0) {
+								reportState = `${lastStateInfo[i - 1].value} > ${reportState}`;
+							}
+							const stateMsg = `${" | ".repeat(i)}${diff} ms ${reportState}`;
+							const d = diff;
+							// This depends on timing so we ignore it for coverage
+							/* eslint-disable no-lone-blocks */
+							/* istanbul ignore next */
+							{
+								if (d > 10000) {
+									logger.error(stateMsg);
+								} else if (d > 1000) {
+									logger.warn(stateMsg);
+								} else if (d > 10) {
+									logger.info(stateMsg);
+								} else if (d > 5) {
+									logger.log(stateMsg);
+								} else {
+									logger.debug(stateMsg);
+								}
+							}
+							/* eslint-enable no-lone-blocks */
+						}
+						if (stateItem === undefined) {
+							lastStateInfo.length = i;
+						} else {
+							lastStateItem.value = stateItem;
+							lastStateItem.time = now;
+							lastStateInfo.length = i + 1;
+						}
+					}
+				} else {
+					lastStateInfo[i] = {
+						value: stateItem,
+						time: now
+					};
 				}
-				lastState = state;
-				lastStateTime = now;
 			}
 		}
-		if (lastMessage !== msg) {
-			goToLineStart(msg);
-			process.stderr.write(msg);
-			lastMessage = msg;
-		}
-	};
-
-	const goToLineStart = nextMessage => {
-		let str = "";
-		for (; lineCaretPosition > nextMessage.length; lineCaretPosition--) {
-			str += "\b \b";
-		}
-		for (var i = 0; i < lineCaretPosition; i++) {
-			str += "\b";
-		}
-		lineCaretPosition = nextMessage.length;
-		if (str) process.stderr.write(str);
+		logger.status(`${Math.floor(percentage * 100)}%`, msg, ...args);
+		if (percentage === 1 || (!msg && args.length === 0)) logger.status();
 	};
 
 	return defaultHandler;
 };
 
+const SKIPPED_QUEUE_CONTEXTS = ["import-module", "load-module"];
+
+/**
+ * @callback ReportProgress
+ * @param {number} p percentage
+ * @param {...string} args additional arguments
+ * @returns {void}
+ */
+
+/** @type {WeakMap} */
+const progressReporters = new WeakMap();
+
+const PLUGIN_NAME = "ProgressPlugin";
+
 class ProgressPlugin {
+	/**
+	 * @param {Compiler} compiler the current compiler
+	 * @returns {ReportProgress | undefined} a progress reporter, if any
+	 */
+	static getReporter(compiler) {
+		return progressReporters.get(compiler);
+	}
+
 	/**
 	 * @param {ProgressPluginArgument} options options
 	 */
-	constructor(options) {
+	constructor(options = {}) {
 		if (typeof options === "function") {
 			options = {
 				handler: options
 			};
 		}
 
-		options = options || {};
-		validateOptions(schema, options, "Progress Plugin");
-		options = Object.assign({}, ProgressPlugin.defaultOptions, options);
+		validate(options);
+		options = { ...ProgressPlugin.defaultOptions, ...options };
 
 		this.profile = options.profile;
 		this.handler = options.handler;
 		this.modulesCount = options.modulesCount;
+		this.dependenciesCount = options.dependenciesCount;
 		this.showEntries = options.entries;
 		this.showModules = options.modules;
+		this.showDependencies = options.dependencies;
 		this.showActiveModules = options.activeModules;
+		this.percentBy = options.percentBy;
 	}
 
+	/**
+	 * @param {Compiler | MultiCompiler} compiler webpack compiler
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		const { modulesCount } = this;
-		const handler = this.handler || createDefaultHandler(this.profile);
+		const handler =
+			this.handler ||
+			createDefaultHandler(
+				this.profile,
+				compiler.getInfrastructureLogger("webpack.Progress")
+			);
+		if (compiler instanceof MultiCompiler) {
+			this._applyOnMultiCompiler(compiler, handler);
+		} else if (compiler instanceof Compiler) {
+			this._applyOnCompiler(compiler, handler);
+		}
+	}
+
+	/**
+	 * @param {MultiCompiler} compiler webpack multi-compiler
+	 * @param {HandlerFunction} handler function that executes for every progress step
+	 * @returns {void}
+	 */
+	_applyOnMultiCompiler(compiler, handler) {
+		const states = compiler.compilers.map(
+			() => /** @type {[number, ...string[]]} */ ([0])
+		);
+		for (const [idx, item] of compiler.compilers.entries()) {
+			new ProgressPlugin((p, msg, ...args) => {
+				states[idx] = [p, msg, ...args];
+				let sum = 0;
+				for (const [p] of states) sum += p;
+				handler(sum / states.length, `[${idx}] ${msg}`, ...args);
+			}).apply(item);
+		}
+	}
+
+	/**
+	 * @param {Compiler} compiler webpack compiler
+	 * @param {HandlerFunction} handler function that executes for every progress step
+	 * @returns {void}
+	 */
+	_applyOnCompiler(compiler, handler) {
 		const showEntries = this.showEntries;
 		const showModules = this.showModules;
+		const showDependencies = this.showDependencies;
 		const showActiveModules = this.showActiveModules;
-		if (compiler.compilers) {
-			const states = new Array(compiler.compilers.length);
-			compiler.compilers.forEach((compiler, idx) => {
-				new ProgressPlugin((p, msg, ...args) => {
-					states[idx] = [p, msg, ...args];
-					handler(
-						states
-							.map(state => (state && state[0]) || 0)
-							.reduce((a, b) => a + b) / states.length,
-						`[${idx}] ${msg}`,
-						...args
+		let lastActiveModule = "";
+		let currentLoader = "";
+		let lastModulesCount = 0;
+		let lastDependenciesCount = 0;
+		let lastEntriesCount = 0;
+		let modulesCount = 0;
+		let skippedModulesCount = 0;
+		let dependenciesCount = 0;
+		let skippedDependenciesCount = 0;
+		let entriesCount = 1;
+		let doneModules = 0;
+		let doneDependencies = 0;
+		let doneEntries = 0;
+		const activeModules = new Set();
+		let lastUpdate = 0;
+
+		const updateThrottled = () => {
+			if (lastUpdate + 500 < Date.now()) update();
+		};
+
+		const update = () => {
+			/** @type {string[]} */
+			const items = [];
+			const percentByModules =
+				doneModules /
+				Math.max(lastModulesCount || this.modulesCount || 1, modulesCount);
+			const percentByEntries =
+				doneEntries /
+				Math.max(lastEntriesCount || this.dependenciesCount || 1, entriesCount);
+			const percentByDependencies =
+				doneDependencies /
+				Math.max(lastDependenciesCount || 1, dependenciesCount);
+			let percentageFactor;
+
+			switch (this.percentBy) {
+				case "entries":
+					percentageFactor = percentByEntries;
+					break;
+				case "dependencies":
+					percentageFactor = percentByDependencies;
+					break;
+				case "modules":
+					percentageFactor = percentByModules;
+					break;
+				default:
+					percentageFactor = median3(
+						percentByModules,
+						percentByEntries,
+						percentByDependencies
 					);
-				}).apply(compiler);
-			});
-		} else {
-			let lastModulesCount = 0;
-			let lastEntriesCount = 0;
-			let moduleCount = modulesCount;
-			let entriesCount = 1;
-			let doneModules = 0;
-			let doneEntries = 0;
-			const activeModules = new Set();
-			let lastActiveModule = "";
-
-			const update = () => {
-				const percentByModules =
-					doneModules / Math.max(lastModulesCount, moduleCount);
-				const percentByEntries =
-					doneEntries / Math.max(lastEntriesCount, entriesCount);
-
-				const items = [
-					0.1 + Math.max(percentByModules, percentByEntries) * 0.6,
-					"building"
-				];
+			}
+
+			const percentage = 0.1 + percentageFactor * 0.55;
+
+			if (currentLoader) {
+				items.push(
+					`import loader ${contextify(
+						compiler.context,
+						currentLoader,
+						compiler.root
+					)}`
+				);
+			} else {
+				const statItems = [];
 				if (showEntries) {
-					items.push(`${doneEntries}/${entriesCount} entries`);
+					statItems.push(`${doneEntries}/${entriesCount} entries`);
+				}
+				if (showDependencies) {
+					statItems.push(
+						`${doneDependencies}/${dependenciesCount} dependencies`
+					);
 				}
 				if (showModules) {
-					items.push(`${doneModules}/${moduleCount} modules`);
+					statItems.push(`${doneModules}/${modulesCount} modules`);
+				}
+				if (showActiveModules) {
+					statItems.push(`${activeModules.size} active`);
+				}
+				if (statItems.length > 0) {
+					items.push(statItems.join(" "));
 				}
 				if (showActiveModules) {
-					items.push(`${activeModules.size} active`);
 					items.push(lastActiveModule);
 				}
-				handler(...items);
-			};
+			}
+			handler(percentage, "building", ...items);
+			lastUpdate = Date.now();
+		};
 
-			const moduleAdd = module => {
-				moduleCount++;
-				if (showActiveModules) {
-					const ident = module.identifier();
-					if (ident) {
-						activeModules.add(ident);
-						lastActiveModule = ident;
+		/**
+		 * @template T
+		 * @param {AsyncQueue} factorizeQueue async queue
+		 * @param {T} _item item
+		 */
+		const factorizeAdd = (factorizeQueue, _item) => {
+			if (SKIPPED_QUEUE_CONTEXTS.includes(factorizeQueue.getContext())) {
+				skippedDependenciesCount++;
+			}
+			dependenciesCount++;
+			if (dependenciesCount < 50 || dependenciesCount % 100 === 0)
+				updateThrottled();
+		};
+
+		const factorizeDone = () => {
+			doneDependencies++;
+			if (doneDependencies < 50 || doneDependencies % 100 === 0)
+				updateThrottled();
+		};
+
+		/**
+		 * @template T
+		 * @param {AsyncQueue} addModuleQueue async queue
+		 * @param {T} _item item
+		 */
+		const moduleAdd = (addModuleQueue, _item) => {
+			if (SKIPPED_QUEUE_CONTEXTS.includes(addModuleQueue.getContext())) {
+				skippedModulesCount++;
+			}
+			modulesCount++;
+			if (modulesCount < 50 || modulesCount % 100 === 0) updateThrottled();
+		};
+
+		// only used when showActiveModules is set
+		/**
+		 * @param {Module} module the module
+		 */
+		const moduleBuild = module => {
+			const ident = module.identifier();
+			if (ident) {
+				activeModules.add(ident);
+				lastActiveModule = ident;
+				update();
+			}
+		};
+
+		/**
+		 * @param {Dependency} entry entry dependency
+		 * @param {EntryOptions} options options object
+		 */
+		const entryAdd = (entry, options) => {
+			entriesCount++;
+			if (entriesCount < 5 || entriesCount % 10 === 0) updateThrottled();
+		};
+
+		/**
+		 * @param {Module} module the module
+		 */
+		const moduleDone = module => {
+			doneModules++;
+			if (showActiveModules) {
+				const ident = module.identifier();
+				if (ident) {
+					activeModules.delete(ident);
+					if (lastActiveModule === ident) {
+						lastActiveModule = "";
+						for (const m of activeModules) {
+							lastActiveModule = m;
+						}
+						update();
+						return;
 					}
 				}
-				update();
-			};
+			}
+			if (doneModules < 50 || doneModules % 100 === 0) updateThrottled();
+		};
 
-			const entryAdd = (entry, name) => {
-				entriesCount++;
-				update();
-			};
+		/**
+		 * @param {Dependency} entry entry dependency
+		 * @param {EntryOptions} options options object
+		 */
+		const entryDone = (entry, options) => {
+			doneEntries++;
+			update();
+		};
 
-			const moduleDone = module => {
-				doneModules++;
-				if (showActiveModules) {
-					const ident = module.identifier();
-					if (ident) {
-						activeModules.delete(ident);
-						if (lastActiveModule === ident) {
-							lastActiveModule = "";
-							for (const m of activeModules) {
-								lastActiveModule = m;
-							}
+		const cache = compiler.getCache(PLUGIN_NAME).getItemCache("counts", null);
+
+		/** @type {Promise | undefined} */
+		let cacheGetPromise;
+
+		compiler.hooks.beforeCompile.tap(PLUGIN_NAME, () => {
+			if (!cacheGetPromise) {
+				cacheGetPromise = cache.getPromise().then(
+					data => {
+						if (data) {
+							lastModulesCount = lastModulesCount || data.modulesCount;
+							lastDependenciesCount =
+								lastDependenciesCount || data.dependenciesCount;
 						}
+						return data;
+					},
+					err => {
+						// Ignore error
+					}
+				);
+			}
+		});
+
+		compiler.hooks.afterCompile.tapPromise(PLUGIN_NAME, compilation => {
+			if (compilation.compiler.isChild()) return Promise.resolve();
+			return /** @type {Promise} */ (cacheGetPromise).then(
+				async oldData => {
+					const realModulesCount = modulesCount - skippedModulesCount;
+					const realDependenciesCount =
+						dependenciesCount - skippedDependenciesCount;
+
+					if (
+						!oldData ||
+						oldData.modulesCount !== realModulesCount ||
+						oldData.dependenciesCount !== realDependenciesCount
+					) {
+						await cache.storePromise({
+							modulesCount: realModulesCount,
+							dependenciesCount: realDependenciesCount
+						});
 					}
 				}
-				update();
-			};
+			);
+		});
 
-			const entryDone = (entry, name) => {
-				doneEntries++;
-				update();
-			};
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			if (compilation.compiler.isChild()) return;
+			lastModulesCount = modulesCount;
+			lastEntriesCount = entriesCount;
+			lastDependenciesCount = dependenciesCount;
+			modulesCount =
+				skippedModulesCount =
+				dependenciesCount =
+				skippedDependenciesCount =
+				entriesCount =
+					0;
+			doneModules = doneDependencies = doneEntries = 0;
+
+			compilation.factorizeQueue.hooks.added.tap(PLUGIN_NAME, item =>
+				factorizeAdd(compilation.factorizeQueue, item)
+			);
+			compilation.factorizeQueue.hooks.result.tap(PLUGIN_NAME, factorizeDone);
+
+			compilation.addModuleQueue.hooks.added.tap(PLUGIN_NAME, item =>
+				moduleAdd(compilation.addModuleQueue, item)
+			);
+			compilation.processDependenciesQueue.hooks.result.tap(
+				PLUGIN_NAME,
+				moduleDone
+			);
 
-			compiler.hooks.compilation.tap("ProgressPlugin", compilation => {
-				if (compilation.compiler.isChild()) return;
-				lastModulesCount = moduleCount;
-				lastEntriesCount = entriesCount;
-				moduleCount = entriesCount = 0;
-				doneModules = doneEntries = 0;
-				handler(0, "compiling");
-
-				compilation.hooks.buildModule.tap("ProgressPlugin", moduleAdd);
-				compilation.hooks.failedModule.tap("ProgressPlugin", moduleDone);
-				compilation.hooks.succeedModule.tap("ProgressPlugin", moduleDone);
-
-				compilation.hooks.addEntry.tap("ProgressPlugin", entryAdd);
-				compilation.hooks.failedEntry.tap("ProgressPlugin", entryDone);
-				compilation.hooks.succeedEntry.tap("ProgressPlugin", entryDone);
-
-				const hooks = {
-					finishModules: "finish module graph",
-					seal: "sealing",
-					beforeChunks: "chunk graph",
-					afterChunks: "after chunk graph",
-					optimizeDependenciesBasic: "basic dependencies optimization",
-					optimizeDependencies: "dependencies optimization",
-					optimizeDependenciesAdvanced: "advanced dependencies optimization",
-					afterOptimizeDependencies: "after dependencies optimization",
-					optimize: "optimizing",
-					optimizeModulesBasic: "basic module optimization",
-					optimizeModules: "module optimization",
-					optimizeModulesAdvanced: "advanced module optimization",
-					afterOptimizeModules: "after module optimization",
-					optimizeChunksBasic: "basic chunk optimization",
-					optimizeChunks: "chunk optimization",
-					optimizeChunksAdvanced: "advanced chunk optimization",
-					afterOptimizeChunks: "after chunk optimization",
-					optimizeTree: "module and chunk tree optimization",
-					afterOptimizeTree: "after module and chunk tree optimization",
-					optimizeChunkModulesBasic: "basic chunk modules optimization",
-					optimizeChunkModules: "chunk modules optimization",
-					optimizeChunkModulesAdvanced: "advanced chunk modules optimization",
-					afterOptimizeChunkModules: "after chunk modules optimization",
-					reviveModules: "module reviving",
-					optimizeModuleOrder: "module order optimization",
-					advancedOptimizeModuleOrder: "advanced module order optimization",
-					beforeModuleIds: "before module ids",
-					moduleIds: "module ids",
-					optimizeModuleIds: "module id optimization",
-					afterOptimizeModuleIds: "module id optimization",
-					reviveChunks: "chunk reviving",
-					optimizeChunkOrder: "chunk order optimization",
-					beforeChunkIds: "before chunk ids",
-					optimizeChunkIds: "chunk id optimization",
-					afterOptimizeChunkIds: "after chunk id optimization",
-					recordModules: "record modules",
-					recordChunks: "record chunks",
-					beforeHash: "hashing",
-					contentHash: "content hashing",
-					afterHash: "after hashing",
-					recordHash: "record hash",
-					beforeModuleAssets: "module assets processing",
-					beforeChunkAssets: "chunk assets processing",
-					additionalChunkAssets: "additional chunk assets processing",
-					record: "recording",
-					additionalAssets: "additional asset processing",
-					optimizeChunkAssets: "chunk asset optimization",
-					afterOptimizeChunkAssets: "after chunk asset optimization",
-					optimizeAssets: "asset optimization",
-					afterOptimizeAssets: "after asset optimization",
-					afterSeal: "after seal"
-				};
-				const numberOfHooks = Object.keys(hooks).length;
-				Object.keys(hooks).forEach((name, idx) => {
-					const title = hooks[name];
-					const percentage = (idx / numberOfHooks) * 0.25 + 0.7;
-					compilation.hooks[name].intercept({
-						name: "ProgressPlugin",
-						context: true,
-						call: () => {
-							handler(percentage, title);
-						},
-						tap: (context, tap) => {
-							if (context) {
-								// p is percentage from 0 to 1
-								// args is any number of messages in a hierarchical matter
-								context.reportProgress = (p, ...args) => {
-									handler(percentage, title, tap.name, ...args);
-								};
+			if (showActiveModules) {
+				compilation.hooks.buildModule.tap(PLUGIN_NAME, moduleBuild);
+			}
+
+			compilation.hooks.addEntry.tap(PLUGIN_NAME, entryAdd);
+			compilation.hooks.failedEntry.tap(PLUGIN_NAME, entryDone);
+			compilation.hooks.succeedEntry.tap(PLUGIN_NAME, entryDone);
+
+			// @ts-expect-error avoid dynamic require if bundled with webpack
+			if (typeof __webpack_require__ !== "function") {
+				const requiredLoaders = new Set();
+				NormalModule.getCompilationHooks(compilation).beforeLoaders.tap(
+					PLUGIN_NAME,
+					loaders => {
+						for (const loader of loaders) {
+							if (
+								loader.type !== "module" &&
+								!requiredLoaders.has(loader.loader)
+							) {
+								requiredLoaders.add(loader.loader);
+								currentLoader = loader.loader;
+								update();
+								require(loader.loader);
 							}
-							handler(percentage, title, tap.name);
 						}
-					});
+						if (currentLoader) {
+							currentLoader = "";
+							update();
+						}
+					}
+				);
+			}
+
+			const hooks = {
+				finishModules: "finish module graph",
+				seal: "plugins",
+				optimizeDependencies: "dependencies optimization",
+				afterOptimizeDependencies: "after dependencies optimization",
+				beforeChunks: "chunk graph",
+				afterChunks: "after chunk graph",
+				optimize: "optimizing",
+				optimizeModules: "module optimization",
+				afterOptimizeModules: "after module optimization",
+				optimizeChunks: "chunk optimization",
+				afterOptimizeChunks: "after chunk optimization",
+				optimizeTree: "module and chunk tree optimization",
+				afterOptimizeTree: "after module and chunk tree optimization",
+				optimizeChunkModules: "chunk modules optimization",
+				afterOptimizeChunkModules: "after chunk modules optimization",
+				reviveModules: "module reviving",
+				beforeModuleIds: "before module ids",
+				moduleIds: "module ids",
+				optimizeModuleIds: "module id optimization",
+				afterOptimizeModuleIds: "module id optimization",
+				reviveChunks: "chunk reviving",
+				beforeChunkIds: "before chunk ids",
+				chunkIds: "chunk ids",
+				optimizeChunkIds: "chunk id optimization",
+				afterOptimizeChunkIds: "after chunk id optimization",
+				recordModules: "record modules",
+				recordChunks: "record chunks",
+				beforeModuleHash: "module hashing",
+				beforeCodeGeneration: "code generation",
+				beforeRuntimeRequirements: "runtime requirements",
+				beforeHash: "hashing",
+				afterHash: "after hashing",
+				recordHash: "record hash",
+				beforeModuleAssets: "module assets processing",
+				beforeChunkAssets: "chunk assets processing",
+				processAssets: "asset processing",
+				afterProcessAssets: "after asset optimization",
+				record: "recording",
+				afterSeal: "after seal"
+			};
+			const numberOfHooks = Object.keys(hooks).length;
+			for (const [idx, name] of Object.keys(hooks).entries()) {
+				const title = hooks[/** @type {keyof typeof hooks} */ (name)];
+				const percentage = (idx / numberOfHooks) * 0.25 + 0.7;
+				compilation.hooks[/** @type {keyof typeof hooks} */ (name)].intercept({
+					name: PLUGIN_NAME,
+					call() {
+						handler(percentage, "sealing", title);
+					},
+					done() {
+						progressReporters.set(compiler, undefined);
+						handler(percentage, "sealing", title);
+					},
+					result() {
+						handler(percentage, "sealing", title);
+					},
+					error() {
+						handler(percentage, "sealing", title);
+					},
+					tap(tap) {
+						// p is percentage from 0 to 1
+						// args is any number of messages in a hierarchical matter
+						progressReporters.set(compilation.compiler, (p, ...args) => {
+							handler(percentage, "sealing", title, tap.name, ...args);
+						});
+						handler(percentage, "sealing", title, tap.name);
+					}
 				});
-			});
-			compiler.hooks.emit.intercept({
-				name: "ProgressPlugin",
-				context: true,
-				call: () => {
-					handler(0.95, "emitting");
+			}
+		});
+		compiler.hooks.make.intercept({
+			name: PLUGIN_NAME,
+			call() {
+				handler(0.1, "building");
+			},
+			done() {
+				handler(0.65, "building");
+			}
+		});
+		/**
+		 * @param {TODO} hook hook
+		 * @param {number} progress progress from 0 to 1
+		 * @param {string} category category
+		 * @param {string} name name
+		 */
+		const interceptHook = (hook, progress, category, name) => {
+			hook.intercept({
+				name: PLUGIN_NAME,
+				call() {
+					handler(progress, category, name);
 				},
-				tap: (context, tap) => {
-					if (context) {
-						context.reportProgress = (p, ...args) => {
-							handler(0.95, "emitting", tap.name, ...args);
-						};
-					}
-					handler(0.95, "emitting", tap.name);
-				}
-			});
-			compiler.hooks.afterEmit.intercept({
-				name: "ProgressPlugin",
-				context: true,
-				call: () => {
-					handler(0.98, "after emitting");
+				done() {
+					progressReporters.set(compiler, undefined);
+					handler(progress, category, name);
 				},
-				tap: (context, tap) => {
-					if (context) {
-						context.reportProgress = (p, ...args) => {
-							handler(0.98, "after emitting", tap.name, ...args);
-						};
-					}
-					handler(0.98, "after emitting", tap.name);
+				result() {
+					handler(progress, category, name);
+				},
+				error() {
+					handler(progress, category, name);
+				},
+				/**
+				 * @param {Tap} tap tap
+				 */
+				tap(tap) {
+					progressReporters.set(compiler, (p, ...args) => {
+						handler(progress, category, name, tap.name, ...args);
+					});
+					handler(progress, category, name, tap.name);
 				}
 			});
-			compiler.hooks.done.tap("ProgressPlugin", () => {
+		};
+		compiler.cache.hooks.endIdle.intercept({
+			name: PLUGIN_NAME,
+			call() {
+				handler(0, "");
+			}
+		});
+		interceptHook(compiler.cache.hooks.endIdle, 0.01, "cache", "end idle");
+		compiler.hooks.beforeRun.intercept({
+			name: PLUGIN_NAME,
+			call() {
+				handler(0, "");
+			}
+		});
+		interceptHook(compiler.hooks.beforeRun, 0.01, "setup", "before run");
+		interceptHook(compiler.hooks.run, 0.02, "setup", "run");
+		interceptHook(compiler.hooks.watchRun, 0.03, "setup", "watch run");
+		interceptHook(
+			compiler.hooks.normalModuleFactory,
+			0.04,
+			"setup",
+			"normal module factory"
+		);
+		interceptHook(
+			compiler.hooks.contextModuleFactory,
+			0.05,
+			"setup",
+			"context module factory"
+		);
+		interceptHook(
+			compiler.hooks.beforeCompile,
+			0.06,
+			"setup",
+			"before compile"
+		);
+		interceptHook(compiler.hooks.compile, 0.07, "setup", "compile");
+		interceptHook(compiler.hooks.thisCompilation, 0.08, "setup", "compilation");
+		interceptHook(compiler.hooks.compilation, 0.09, "setup", "compilation");
+		interceptHook(compiler.hooks.finishMake, 0.69, "building", "finish");
+		interceptHook(compiler.hooks.emit, 0.95, "emitting", "emit");
+		interceptHook(compiler.hooks.afterEmit, 0.98, "emitting", "after emit");
+		interceptHook(compiler.hooks.done, 0.99, "done", "plugins");
+		compiler.hooks.done.intercept({
+			name: PLUGIN_NAME,
+			done() {
+				handler(0.99, "");
+			}
+		});
+		interceptHook(
+			compiler.cache.hooks.storeBuildDependencies,
+			0.99,
+			"cache",
+			"store build dependencies"
+		);
+		interceptHook(compiler.cache.hooks.shutdown, 0.99, "cache", "shutdown");
+		interceptHook(compiler.cache.hooks.beginIdle, 0.99, "cache", "begin idle");
+		interceptHook(
+			compiler.hooks.watchClose,
+			0.99,
+			"end",
+			"closing watch compilation"
+		);
+		compiler.cache.hooks.beginIdle.intercept({
+			name: PLUGIN_NAME,
+			done() {
 				handler(1, "");
-			});
-		}
+			}
+		});
+		compiler.cache.hooks.shutdown.intercept({
+			name: PLUGIN_NAME,
+			done() {
+				handler(1, "");
+			}
+		});
 	}
 }
 
 ProgressPlugin.defaultOptions = {
 	profile: false,
-	modulesCount: 500,
+	modulesCount: 5000,
+	dependenciesCount: 10000,
 	modules: true,
-	activeModules: true,
-	// TODO webpack 5 default this to true
-	entries: false
+	dependencies: true,
+	activeModules: false,
+	entries: true
 };
 
+ProgressPlugin.createDefaultHandler = createDefaultHandler;
+
 module.exports = ProgressPlugin;
diff --git a/lib/ProvidePlugin.js b/lib/ProvidePlugin.js
index 3ed2fc1b4b2..28c3ce5d590 100644
--- a/lib/ProvidePlugin.js
+++ b/lib/ProvidePlugin.js
@@ -2,84 +2,118 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const ParserHelpers = require("./ParserHelpers");
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_DYNAMIC,
+	JAVASCRIPT_MODULE_TYPE_ESM
+} = require("./ModuleTypeConstants");
 const ConstDependency = require("./dependencies/ConstDependency");
+const ProvidedDependency = require("./dependencies/ProvidedDependency");
+const { approve } = require("./javascript/JavascriptParserHelpers");
+
+/** @typedef {import("../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("./javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("./javascript/JavascriptParser").Range} Range */
 
-const NullFactory = require("./NullFactory");
+const PLUGIN_NAME = "ProvidePlugin";
 
 class ProvidePlugin {
+	/**
+	 * @param {Record} definitions the provided identifiers
+	 */
 	constructor(definitions) {
 		this.definitions = definitions;
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		const definitions = this.definitions;
 		compiler.hooks.compilation.tap(
-			"ProvidePlugin",
+			PLUGIN_NAME,
 			(compilation, { normalModuleFactory }) => {
-				compilation.dependencyFactories.set(ConstDependency, new NullFactory());
 				compilation.dependencyTemplates.set(
 					ConstDependency,
 					new ConstDependency.Template()
 				);
+				compilation.dependencyFactories.set(
+					ProvidedDependency,
+					normalModuleFactory
+				);
+				compilation.dependencyTemplates.set(
+					ProvidedDependency,
+					new ProvidedDependency.Template()
+				);
+				/**
+				 * @param {JavascriptParser} parser the parser
+				 * @param {JavascriptParserOptions} parserOptions options
+				 * @returns {void}
+				 */
 				const handler = (parser, parserOptions) => {
-					Object.keys(definitions).forEach(name => {
-						var request = [].concat(definitions[name]);
-						var splittedName = name.split(".");
+					for (const name of Object.keys(definitions)) {
+						const request =
+							/** @type {string[]} */
+							([]).concat(definitions[name]);
+						const splittedName = name.split(".");
 						if (splittedName.length > 0) {
-							splittedName.slice(1).forEach((_, i) => {
+							for (const [i, _] of splittedName.slice(1).entries()) {
 								const name = splittedName.slice(0, i + 1).join(".");
-								parser.hooks.canRename
-									.for(name)
-									.tap("ProvidePlugin", ParserHelpers.approve);
-							});
-						}
-						parser.hooks.expression.for(name).tap("ProvidePlugin", expr => {
-							let nameIdentifier = name;
-							const scopedName = name.includes(".");
-							let expression = `require(${JSON.stringify(request[0])})`;
-							if (scopedName) {
-								nameIdentifier = `__webpack_provided_${name.replace(
-									/\./g,
-									"_dot_"
-								)}`;
-							}
-							if (request.length > 1) {
-								expression += request
-									.slice(1)
-									.map(r => `[${JSON.stringify(r)}]`)
-									.join("");
-							}
-							if (
-								!ParserHelpers.addParsedVariableToModule(
-									parser,
-									nameIdentifier,
-									expression
-								)
-							) {
-								return false;
-							}
-							if (scopedName) {
-								ParserHelpers.toConstantDependency(parser, nameIdentifier)(
-									expr
-								);
+								parser.hooks.canRename.for(name).tap(PLUGIN_NAME, approve);
 							}
+						}
+
+						parser.hooks.expression.for(name).tap(PLUGIN_NAME, expr => {
+							const nameIdentifier = name.includes(".")
+								? `__webpack_provided_${name.replace(/\./g, "_dot_")}`
+								: name;
+							const dep = new ProvidedDependency(
+								request[0],
+								nameIdentifier,
+								request.slice(1),
+								/** @type {Range} */ (expr.range)
+							);
+							dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+							parser.state.module.addDependency(dep);
+							return true;
+						});
+
+						parser.hooks.call.for(name).tap(PLUGIN_NAME, expr => {
+							const nameIdentifier = name.includes(".")
+								? `__webpack_provided_${name.replace(/\./g, "_dot_")}`
+								: name;
+							const dep = new ProvidedDependency(
+								request[0],
+								nameIdentifier,
+								request.slice(1),
+								/** @type {Range} */ (expr.callee.range)
+							);
+							dep.loc = /** @type {DependencyLocation} */ (expr.callee.loc);
+							parser.state.module.addDependency(dep);
+							parser.walkExpressions(expr.arguments);
 							return true;
 						});
-					});
+					}
 				};
 				normalModuleFactory.hooks.parser
-					.for("javascript/auto")
-					.tap("ProvidePlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, handler);
 				normalModuleFactory.hooks.parser
-					.for("javascript/dynamic")
-					.tap("ProvidePlugin", handler);
-
-				// Disable ProvidePlugin for javascript/esm, see https://github.com/webpack/webpack/issues/7032
+					.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
+					.tap(PLUGIN_NAME, handler);
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_ESM)
+					.tap(PLUGIN_NAME, handler);
 			}
 		);
 	}
 }
+
 module.exports = ProvidePlugin;
diff --git a/lib/RawModule.js b/lib/RawModule.js
index ab3fd3ab5bd..6167915d750 100644
--- a/lib/RawModule.js
+++ b/lib/RawModule.js
@@ -2,38 +2,102 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const Module = require("./Module");
 const { OriginalSource, RawSource } = require("webpack-sources");
+const Module = require("./Module");
+const { JS_TYPES } = require("./ModuleSourceTypesConstants");
+const { JAVASCRIPT_MODULE_TYPE_DYNAMIC } = require("./ModuleTypeConstants");
+const makeSerializable = require("./util/makeSerializable");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
+/** @typedef {import("./ChunkGraph")} ChunkGraph */
+/** @typedef {import("./Compilation")} Compilation */
+/** @typedef {import("./Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("./DependencyTemplates")} DependencyTemplates */
+/** @typedef {import("./Generator").SourceTypes} SourceTypes */
+/** @typedef {import("./Module").BuildCallback} BuildCallback */
+/** @typedef {import("./Module").CodeGenerationContext} CodeGenerationContext */
+/** @typedef {import("./Module").CodeGenerationResult} CodeGenerationResult */
+/** @typedef {import("./Module").NeedBuildCallback} NeedBuildCallback */
+/** @typedef {import("./Module").NeedBuildContext} NeedBuildContext */
+/** @typedef {import("./Module").ReadOnlyRuntimeRequirements} ReadOnlyRuntimeRequirements */
+/** @typedef {import("./RequestShortener")} RequestShortener */
+/** @typedef {import("./ResolverFactory").ResolverWithOptions} ResolverWithOptions */
+/** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */
+/** @typedef {import("./WebpackError")} WebpackError */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("./util/Hash")} Hash */
+/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
 
-module.exports = class RawModule extends Module {
-	constructor(source, identifier, readableIdentifier) {
-		super("javascript/dynamic", null);
+class RawModule extends Module {
+	/**
+	 * @param {string} source source code
+	 * @param {string} identifier unique identifier
+	 * @param {string=} readableIdentifier readable identifier
+	 * @param {ReadOnlyRuntimeRequirements=} runtimeRequirements runtime requirements needed for the source code
+	 */
+	constructor(source, identifier, readableIdentifier, runtimeRequirements) {
+		super(JAVASCRIPT_MODULE_TYPE_DYNAMIC, null);
 		this.sourceStr = source;
 		this.identifierStr = identifier || this.sourceStr;
 		this.readableIdentifierStr = readableIdentifier || this.identifierStr;
-		this.built = false;
+		this.runtimeRequirements = runtimeRequirements || null;
 	}
 
+	/**
+	 * @returns {SourceTypes} types available (do not mutate)
+	 */
+	getSourceTypes() {
+		return JS_TYPES;
+	}
+
+	/**
+	 * @returns {string} a unique identifier of the module
+	 */
 	identifier() {
 		return this.identifierStr;
 	}
 
-	size() {
-		return this.sourceStr.length;
+	/**
+	 * @param {string=} type the source type for which the size should be estimated
+	 * @returns {number} the estimated size of the module (must be non-zero)
+	 */
+	size(type) {
+		return Math.max(1, this.sourceStr.length);
 	}
 
+	/**
+	 * @param {RequestShortener} requestShortener the request shortener
+	 * @returns {string} a user readable identifier of the module
+	 */
 	readableIdentifier(requestShortener) {
-		return requestShortener.shorten(this.readableIdentifierStr);
+		return /** @type {string} */ (
+			requestShortener.shorten(this.readableIdentifierStr)
+		);
 	}
 
-	needRebuild() {
-		return false;
+	/**
+	 * @param {NeedBuildContext} context context info
+	 * @param {NeedBuildCallback} callback callback function, returns true, if the module needs a rebuild
+	 * @returns {void}
+	 */
+	needBuild(context, callback) {
+		return callback(null, !this.buildMeta);
 	}
 
-	build(options, compilations, resolver, fs, callback) {
-		this.built = true;
+	/**
+	 * @param {WebpackOptions} options webpack options
+	 * @param {Compilation} compilation the compilation
+	 * @param {ResolverWithOptions} resolver the resolver
+	 * @param {InputFileSystem} fs the file system
+	 * @param {BuildCallback} callback callback function
+	 * @returns {void}
+	 */
+	build(options, compilation, resolver, fs, callback) {
 		this.buildMeta = {};
 		this.buildInfo = {
 			cacheable: true
@@ -41,16 +105,62 @@ module.exports = class RawModule extends Module {
 		callback();
 	}
 
-	source() {
-		if (this.useSourceMap) {
-			return new OriginalSource(this.sourceStr, this.identifier());
+	/**
+	 * @param {CodeGenerationContext} context context for code generation
+	 * @returns {CodeGenerationResult} result
+	 */
+	codeGeneration(context) {
+		const sources = new Map();
+		if (this.useSourceMap || this.useSimpleSourceMap) {
+			sources.set(
+				"javascript",
+				new OriginalSource(this.sourceStr, this.identifier())
+			);
 		} else {
-			return new RawSource(this.sourceStr);
+			sources.set("javascript", new RawSource(this.sourceStr));
 		}
+		return { sources, runtimeRequirements: this.runtimeRequirements };
 	}
 
-	updateHash(hash) {
+	/**
+	 * @param {Hash} hash the hash used to track dependencies
+	 * @param {UpdateHashContext} context context
+	 * @returns {void}
+	 */
+	updateHash(hash, context) {
 		hash.update(this.sourceStr);
-		super.updateHash(hash);
+		super.updateHash(hash, context);
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+
+		write(this.sourceStr);
+		write(this.identifierStr);
+		write(this.readableIdentifierStr);
+		write(this.runtimeRequirements);
+
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+
+		this.sourceStr = read();
+		this.identifierStr = read();
+		this.readableIdentifierStr = read();
+		this.runtimeRequirements = read();
+
+		super.deserialize(context);
 	}
-};
+}
+
+makeSerializable(RawModule, "webpack/lib/RawModule");
+
+module.exports = RawModule;
diff --git a/lib/RecordIdsPlugin.js b/lib/RecordIdsPlugin.js
index 88c6a9a3c76..d76f1c42882 100644
--- a/lib/RecordIdsPlugin.js
+++ b/lib/RecordIdsPlugin.js
@@ -2,38 +2,46 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const { compareNumbers } = require("./util/comparators");
 const identifierUtils = require("./util/identifier");
 
-/** @typedef {import("./Compiler")} Compiler */
 /** @typedef {import("./Chunk")} Chunk */
+/** @typedef {import("./Compiler")} Compiler */
 /** @typedef {import("./Module")} Module */
 
 /**
- * @typedef {Object} RecordsChunks
+ * @typedef {object} RecordsChunks
  * @property {Record=} byName
  * @property {Record=} bySource
  * @property {number[]=} usedIds
  */
 
 /**
- * @typedef {Object} RecordsModules
+ * @typedef {object} RecordsModules
  * @property {Record=} byIdentifier
  * @property {Record=} bySource
- * @property {Record=} usedIds
+ * @property {number[]=} usedIds
  */
 
 /**
- * @typedef {Object} Records
+ * @typedef {object} Records
  * @property {RecordsChunks=} chunks
  * @property {RecordsModules=} modules
  */
 
+/**
+ * @typedef {object} RecordIdsPluginOptions
+ * @property {boolean=} portableIds true, when ids need to be portable
+ */
+
+const PLUGIN_NAME = "RecordIdsPlugin";
+
 class RecordIdsPlugin {
 	/**
-	 * @param {Object} options Options object
-	 * @param {boolean=} options.portableIds true, when ids need to be portable
+	 * @param {RecordIdsPluginOptions=} options object
 	 */
 	constructor(options) {
 		this.options = options || {};
@@ -45,80 +53,61 @@ class RecordIdsPlugin {
 	 */
 	apply(compiler) {
 		const portableIds = this.options.portableIds;
-		compiler.hooks.compilation.tap("RecordIdsPlugin", compilation => {
-			compilation.hooks.recordModules.tap(
-				"RecordIdsPlugin",
-				/**
-				 * @param {Module[]} modules the modules array
-				 * @param {Records} records the records object
-				 * @returns {void}
-				 */
-				(modules, records) => {
-					if (!records.modules) records.modules = {};
-					if (!records.modules.byIdentifier) records.modules.byIdentifier = {};
-					if (!records.modules.usedIds) records.modules.usedIds = {};
+
+		const makePathsRelative =
+			identifierUtils.makePathsRelative.bindContextCache(
+				compiler.context,
+				compiler.root
+			);
+
+		/**
+		 * @param {Module} module the module
+		 * @returns {string} the (portable) identifier
+		 */
+		const getModuleIdentifier = module => {
+			if (portableIds) {
+				return makePathsRelative(module.identifier());
+			}
+			return module.identifier();
+		};
+
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			compilation.hooks.recordModules.tap(PLUGIN_NAME, (modules, records) => {
+				const chunkGraph = compilation.chunkGraph;
+				if (!records.modules) records.modules = {};
+				if (!records.modules.byIdentifier) records.modules.byIdentifier = {};
+				/** @type {Set} */
+				const usedIds = new Set();
+				for (const module of modules) {
+					const moduleId = chunkGraph.getModuleId(module);
+					if (typeof moduleId !== "number") continue;
+					const identifier = getModuleIdentifier(module);
+					records.modules.byIdentifier[identifier] = moduleId;
+					usedIds.add(moduleId);
+				}
+				records.modules.usedIds = Array.from(usedIds).sort(compareNumbers);
+			});
+			compilation.hooks.reviveModules.tap(PLUGIN_NAME, (modules, records) => {
+				if (!records.modules) return;
+				if (records.modules.byIdentifier) {
+					const chunkGraph = compilation.chunkGraph;
+					/** @type {Set} */
+					const usedIds = new Set();
 					for (const module of modules) {
-						if (typeof module.id !== "number") continue;
-						const identifier = portableIds
-							? identifierUtils.makePathsRelative(
-									compiler.context,
-									module.identifier(),
-									compilation.cache
-							  )
-							: module.identifier();
-						records.modules.byIdentifier[identifier] = module.id;
-						records.modules.usedIds[module.id] = module.id;
+						const moduleId = chunkGraph.getModuleId(module);
+						if (moduleId !== null) continue;
+						const identifier = getModuleIdentifier(module);
+						const id = records.modules.byIdentifier[identifier];
+						if (id === undefined) continue;
+						if (usedIds.has(id)) continue;
+						usedIds.add(id);
+						chunkGraph.setModuleId(module, id);
 					}
 				}
-			);
-			compilation.hooks.reviveModules.tap(
-				"RecordIdsPlugin",
-				/**
-				 * @param {Module[]} modules the modules array
-				 * @param {Records} records the records object
-				 * @returns {void}
-				 */
-				(modules, records) => {
-					if (!records.modules) return;
-					if (records.modules.byIdentifier) {
-						/** @type {Set} */
-						const usedIds = new Set();
-						for (const module of modules) {
-							if (module.id !== null) continue;
-							const identifier = portableIds
-								? identifierUtils.makePathsRelative(
-										compiler.context,
-										module.identifier(),
-										compilation.cache
-								  )
-								: module.identifier();
-							const id = records.modules.byIdentifier[identifier];
-							if (id === undefined) continue;
-							if (usedIds.has(id)) continue;
-							usedIds.add(id);
-							module.id = id;
-						}
-					}
-					if (Array.isArray(records.modules.usedIds)) {
-						compilation.usedModuleIds = new Set(records.modules.usedIds);
-					}
+				if (Array.isArray(records.modules.usedIds)) {
+					compilation.usedModuleIds = new Set(records.modules.usedIds);
 				}
-			);
-
-			/**
-			 * @param {Module} module the module
-			 * @returns {string} the (portable) identifier
-			 */
-			const getModuleIdentifier = module => {
-				if (portableIds) {
-					return identifierUtils.makePathsRelative(
-						compiler.context,
-						module.identifier(),
-						compilation.cache
-					);
-				}
-				return module.identifier();
-			};
+			});
 
 			/**
 			 * @param {Chunk} chunk the chunk
@@ -129,28 +118,34 @@ class RecordIdsPlugin {
 				const sources = [];
 				for (const chunkGroup of chunk.groupsIterable) {
 					const index = chunkGroup.chunks.indexOf(chunk);
-					for (const origin of chunkGroup.origins) {
-						if (origin.module) {
-							if (origin.request) {
-								sources.push(
-									`${index} ${getModuleIdentifier(origin.module)} ${
-										origin.request
-									}`
-								);
-							} else if (typeof origin.loc === "string") {
-								sources.push(
-									`${index} ${getModuleIdentifier(origin.module)} ${origin.loc}`
-								);
-							} else if (
-								origin.loc &&
-								typeof origin.loc === "object" &&
-								origin.loc.start
-							) {
-								sources.push(
-									`${index} ${getModuleIdentifier(
-										origin.module
-									)} ${JSON.stringify(origin.loc.start)}`
-								);
+					if (chunkGroup.name) {
+						sources.push(`${index} ${chunkGroup.name}`);
+					} else {
+						for (const origin of chunkGroup.origins) {
+							if (origin.module) {
+								if (origin.request) {
+									sources.push(
+										`${index} ${getModuleIdentifier(origin.module)} ${
+											origin.request
+										}`
+									);
+								} else if (typeof origin.loc === "string") {
+									sources.push(
+										`${index} ${getModuleIdentifier(origin.module)} ${
+											origin.loc
+										}`
+									);
+								} else if (
+									origin.loc &&
+									typeof origin.loc === "object" &&
+									"start" in origin.loc
+								) {
+									sources.push(
+										`${index} ${getModuleIdentifier(
+											origin.module
+										)} ${JSON.stringify(origin.loc.start)}`
+									);
+								}
 							}
 						}
 					}
@@ -158,72 +153,59 @@ class RecordIdsPlugin {
 				return sources;
 			};
 
-			compilation.hooks.recordChunks.tap(
-				"RecordIdsPlugin",
-				/**
-				 * @param {Chunk[]} chunks the chunks array
-				 * @param {Records} records the records object
-				 * @returns {void}
-				 */
-				(chunks, records) => {
-					if (!records.chunks) records.chunks = {};
-					if (!records.chunks.byName) records.chunks.byName = {};
-					if (!records.chunks.bySource) records.chunks.bySource = {};
-					/** @type {Set} */
-					const usedIds = new Set();
+			compilation.hooks.recordChunks.tap(PLUGIN_NAME, (chunks, records) => {
+				if (!records.chunks) records.chunks = {};
+				if (!records.chunks.byName) records.chunks.byName = {};
+				if (!records.chunks.bySource) records.chunks.bySource = {};
+				/** @type {Set} */
+				const usedIds = new Set();
+				for (const chunk of chunks) {
+					if (typeof chunk.id !== "number") continue;
+					const name = chunk.name;
+					if (name) records.chunks.byName[name] = chunk.id;
+					const sources = getChunkSources(chunk);
+					for (const source of sources) {
+						records.chunks.bySource[source] = chunk.id;
+					}
+					usedIds.add(chunk.id);
+				}
+				records.chunks.usedIds = Array.from(usedIds).sort(compareNumbers);
+			});
+			compilation.hooks.reviveChunks.tap(PLUGIN_NAME, (chunks, records) => {
+				if (!records.chunks) return;
+				/** @type {Set} */
+				const usedIds = new Set();
+				if (records.chunks.byName) {
 					for (const chunk of chunks) {
-						if (typeof chunk.id !== "number") continue;
-						const name = chunk.name;
-						if (name) records.chunks.byName[name] = chunk.id;
-						const sources = getChunkSources(chunk);
-						for (const source of sources) {
-							records.chunks.bySource[source] = chunk.id;
-						}
-						usedIds.add(chunk.id);
+						if (chunk.id !== null) continue;
+						if (!chunk.name) continue;
+						const id = records.chunks.byName[chunk.name];
+						if (id === undefined) continue;
+						if (usedIds.has(id)) continue;
+						usedIds.add(id);
+						chunk.id = id;
+						chunk.ids = [id];
 					}
-					records.chunks.usedIds = Array.from(usedIds).sort();
 				}
-			);
-			compilation.hooks.reviveChunks.tap(
-				"RecordIdsPlugin",
-				/**
-				 * @param {Chunk[]} chunks the chunks array
-				 * @param {Records} records the records object
-				 * @returns {void}
-				 */
-				(chunks, records) => {
-					if (!records.chunks) return;
-					/** @type {Set} */
-					const usedIds = new Set();
-					if (records.chunks.byName) {
-						for (const chunk of chunks) {
-							if (chunk.id !== null) continue;
-							if (!chunk.name) continue;
-							const id = records.chunks.byName[chunk.name];
+				if (records.chunks.bySource) {
+					for (const chunk of chunks) {
+						if (chunk.id !== null) continue;
+						const sources = getChunkSources(chunk);
+						for (const source of sources) {
+							const id = records.chunks.bySource[source];
 							if (id === undefined) continue;
 							if (usedIds.has(id)) continue;
 							usedIds.add(id);
 							chunk.id = id;
+							chunk.ids = [id];
+							break;
 						}
 					}
-					if (records.chunks.bySource) {
-						for (const chunk of chunks) {
-							const sources = getChunkSources(chunk);
-							for (const source of sources) {
-								const id = records.chunks.bySource[source];
-								if (id === undefined) continue;
-								if (usedIds.has(id)) continue;
-								usedIds.add(id);
-								chunk.id = id;
-								break;
-							}
-						}
-					}
-					if (Array.isArray(records.chunks.usedIds)) {
-						compilation.usedChunkIds = new Set(records.chunks.usedIds);
-					}
 				}
-			);
+				if (Array.isArray(records.chunks.usedIds)) {
+					compilation.usedChunkIds = new Set(records.chunks.usedIds);
+				}
+			});
 		});
 	}
 }
diff --git a/lib/RemovedPluginError.js b/lib/RemovedPluginError.js
deleted file mode 100644
index 626c3b4fb2c..00000000000
--- a/lib/RemovedPluginError.js
+++ /dev/null
@@ -1,11 +0,0 @@
-"use strict";
-
-const WebpackError = require("./WebpackError");
-
-module.exports = class RemovedPluginError extends WebpackError {
-	constructor(message) {
-		super(message);
-
-		Error.captureStackTrace(this, this.constructor);
-	}
-};
diff --git a/lib/RequestShortener.js b/lib/RequestShortener.js
index 7b007816a8c..b39bc2e7384 100644
--- a/lib/RequestShortener.js
+++ b/lib/RequestShortener.js
@@ -2,81 +2,34 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
-"use strict";
 
-const path = require("path");
-const NORMALIZE_SLASH_DIRECTION_REGEXP = /\\/g;
-const PATH_CHARS_REGEXP = /[-[\]{}()*+?.,\\^$|#\s]/g;
-const SEPARATOR_REGEXP = /[/\\]$/;
-const FRONT_OR_BACK_BANG_REGEXP = /^!|!$/g;
-const INDEX_JS_REGEXP = /\/index.js(!|\?|\(query\))/g;
-const MATCH_RESOURCE_REGEXP = /!=!/;
+"use strict";
 
-const normalizeBackSlashDirection = request => {
-	return request.replace(NORMALIZE_SLASH_DIRECTION_REGEXP, "/");
-};
+const { contextify } = require("./util/identifier");
 
-const createRegExpForPath = path => {
-	const regexpTypePartial = path.replace(PATH_CHARS_REGEXP, "\\$&");
-	return new RegExp(`(^|!)${regexpTypePartial}`, "g");
-};
+/** @typedef {import("./util/identifier").AssociatedObjectForCache} AssociatedObjectForCache */
 
 class RequestShortener {
-	constructor(directory) {
-		directory = normalizeBackSlashDirection(directory);
-		if (SEPARATOR_REGEXP.test(directory)) {
-			directory = directory.substr(0, directory.length - 1);
-		}
-
-		if (directory) {
-			this.currentDirectoryRegExp = createRegExpForPath(directory);
-		}
-
-		const dirname = path.dirname(directory);
-		const endsWithSeparator = SEPARATOR_REGEXP.test(dirname);
-		const parentDirectory = endsWithSeparator
-			? dirname.substr(0, dirname.length - 1)
-			: dirname;
-		if (parentDirectory && parentDirectory !== directory) {
-			this.parentDirectoryRegExp = createRegExpForPath(parentDirectory);
-		}
-
-		if (__dirname.length >= 2) {
-			const buildins = normalizeBackSlashDirection(path.join(__dirname, ".."));
-			const buildinsAsModule =
-				this.currentDirectoryRegExp &&
-				this.currentDirectoryRegExp.test(buildins);
-			this.buildinsAsModule = buildinsAsModule;
-			this.buildinsRegExp = createRegExpForPath(buildins);
-		}
-
-		this.cache = new Map();
+	/**
+	 * @param {string} dir the directory
+	 * @param {AssociatedObjectForCache=} associatedObjectForCache an object to which the cache will be attached
+	 */
+	constructor(dir, associatedObjectForCache) {
+		this.contextify = contextify.bindContextCache(
+			dir,
+			associatedObjectForCache
+		);
 	}
 
+	/**
+	 * @param {string | undefined | null} request the request to shorten
+	 * @returns {string | undefined | null} the shortened request
+	 */
 	shorten(request) {
-		if (!request) return request;
-		const cacheEntry = this.cache.get(request);
-		if (cacheEntry !== undefined) {
-			return cacheEntry;
-		}
-		let result = normalizeBackSlashDirection(request);
-		if (this.buildinsAsModule && this.buildinsRegExp) {
-			result = result.replace(this.buildinsRegExp, "!(webpack)");
-		}
-		if (this.currentDirectoryRegExp) {
-			result = result.replace(this.currentDirectoryRegExp, "!.");
-		}
-		if (this.parentDirectoryRegExp) {
-			result = result.replace(this.parentDirectoryRegExp, "!..");
-		}
-		if (!this.buildinsAsModule && this.buildinsRegExp) {
-			result = result.replace(this.buildinsRegExp, "!(webpack)");
+		if (!request) {
+			return request;
 		}
-		result = result.replace(INDEX_JS_REGEXP, "$1");
-		result = result.replace(FRONT_OR_BACK_BANG_REGEXP, "");
-		result = result.replace(MATCH_RESOURCE_REGEXP, " = ");
-		this.cache.set(request, result);
-		return result;
+		return this.contextify(request);
 	}
 }
 
diff --git a/lib/RequireJsStuffPlugin.js b/lib/RequireJsStuffPlugin.js
index 632deefc2d6..c9acc6643dd 100644
--- a/lib/RequireJsStuffPlugin.js
+++ b/lib/RequireJsStuffPlugin.js
@@ -2,64 +2,82 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const ParserHelpers = require("./ParserHelpers");
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_DYNAMIC
+} = require("./ModuleTypeConstants");
+const RuntimeGlobals = require("./RuntimeGlobals");
 const ConstDependency = require("./dependencies/ConstDependency");
-const NullFactory = require("./NullFactory");
+const {
+	toConstantDependency
+} = require("./javascript/JavascriptParserHelpers");
+
+/** @typedef {import("../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./javascript/JavascriptParser")} JavascriptParser */
+
+const PLUGIN_NAME = "RequireJsStuffPlugin";
 
 module.exports = class RequireJsStuffPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		compiler.hooks.compilation.tap(
-			"RequireJsStuffPlugin",
+			PLUGIN_NAME,
 			(compilation, { normalModuleFactory }) => {
-				compilation.dependencyFactories.set(ConstDependency, new NullFactory());
 				compilation.dependencyTemplates.set(
 					ConstDependency,
 					new ConstDependency.Template()
 				);
+				/**
+				 * @param {JavascriptParser} parser the parser
+				 * @param {JavascriptParserOptions} parserOptions options
+				 * @returns {void}
+				 */
 				const handler = (parser, parserOptions) => {
-					if (parserOptions.requireJs !== undefined && !parserOptions.requireJs)
+					if (
+						parserOptions.requireJs === undefined ||
+						!parserOptions.requireJs
+					) {
 						return;
+					}
 
 					parser.hooks.call
 						.for("require.config")
-						.tap(
-							"RequireJsStuffPlugin",
-							ParserHelpers.toConstantDependency(parser, "undefined")
-						);
+						.tap(PLUGIN_NAME, toConstantDependency(parser, "undefined"));
 					parser.hooks.call
 						.for("requirejs.config")
-						.tap(
-							"RequireJsStuffPlugin",
-							ParserHelpers.toConstantDependency(parser, "undefined")
-						);
+						.tap(PLUGIN_NAME, toConstantDependency(parser, "undefined"));
 
 					parser.hooks.expression
 						.for("require.version")
 						.tap(
-							"RequireJsStuffPlugin",
-							ParserHelpers.toConstantDependency(
-								parser,
-								JSON.stringify("0.0.0")
-							)
+							PLUGIN_NAME,
+							toConstantDependency(parser, JSON.stringify("0.0.0"))
 						);
 					parser.hooks.expression
 						.for("requirejs.onError")
 						.tap(
-							"RequireJsStuffPlugin",
-							ParserHelpers.toConstantDependencyWithWebpackRequire(
+							PLUGIN_NAME,
+							toConstantDependency(
 								parser,
-								"__webpack_require__.oe"
+								RuntimeGlobals.uncaughtErrorHandler,
+								[RuntimeGlobals.uncaughtErrorHandler]
 							)
 						);
 				};
 				normalModuleFactory.hooks.parser
-					.for("javascript/auto")
-					.tap("RequireJsStuffPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, handler);
 				normalModuleFactory.hooks.parser
-					.for("javascript/dynamic")
-					.tap("RequireJsStuffPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
+					.tap(PLUGIN_NAME, handler);
 			}
 		);
 	}
diff --git a/lib/ResolverFactory.js b/lib/ResolverFactory.js
index 80c5e8b685c..61bb42ebd89 100644
--- a/lib/ResolverFactory.js
+++ b/lib/ResolverFactory.js
@@ -1,77 +1,158 @@
 /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
 "use strict";
 
-const { Tapable, HookMap, SyncHook, SyncWaterfallHook } = require("tapable");
 const Factory = require("enhanced-resolve").ResolverFactory;
+const { HookMap, SyncHook, SyncWaterfallHook } = require("tapable");
+const {
+	cachedCleverMerge,
+	removeOperations,
+	resolveByProperty
+} = require("./util/cleverMerge");
 
+/** @typedef {import("enhanced-resolve").ResolveContext} ResolveContext */
+/** @typedef {import("enhanced-resolve").ResolveOptions} ResolveOptions */
+/** @typedef {import("enhanced-resolve").ResolveRequest} ResolveRequest */
 /** @typedef {import("enhanced-resolve").Resolver} Resolver */
+/** @typedef {import("../declarations/WebpackOptions").ResolveOptions} WebpackResolveOptions */
+/** @typedef {import("../declarations/WebpackOptions").ResolvePluginInstance} ResolvePluginInstance */
+
+/** @typedef {WebpackResolveOptions & { dependencyType?: string, resolveToContext?: boolean }} ResolveOptionsWithDependencyType */
+/**
+ * @typedef {object} WithOptions
+ * @property {(options: Partial) => ResolverWithOptions} withOptions create a resolver with additional/different options
+ */
+
+/** @typedef {Resolver & WithOptions} ResolverWithOptions */
+
+// need to be hoisted on module level for caching identity
+/** @type {ResolveOptionsWithDependencyType} */
+const EMPTY_RESOLVE_OPTIONS = {};
+
+/**
+ * @param {ResolveOptionsWithDependencyType} resolveOptionsWithDepType enhanced options
+ * @returns {ResolveOptions} merged options
+ */
+const convertToResolveOptions = resolveOptionsWithDepType => {
+	const { dependencyType, plugins, ...remaining } = resolveOptionsWithDepType;
+
+	// check type compat
+	/** @type {Partial} */
+	const partialOptions = {
+		...remaining,
+		plugins:
+			plugins &&
+			/** @type {ResolvePluginInstance[]} */ (
+				plugins.filter(item => item !== "...")
+			)
+	};
+
+	if (!partialOptions.fileSystem) {
+		throw new Error(
+			"fileSystem is missing in resolveOptions, but it's required for enhanced-resolve"
+		);
+	}
+	// These weird types validate that we checked all non-optional properties
+	const options =
+		/** @type {Partial & Pick} */ (
+			partialOptions
+		);
 
-module.exports = class ResolverFactory extends Tapable {
+	return /** @type {ResolveOptions} */ (
+		removeOperations(
+			resolveByProperty(options, "byDependency", dependencyType),
+			// Keep the `unsafeCache` because it can be a `Proxy`
+			["unsafeCache"]
+		)
+	);
+};
+
+/**
+ * @typedef {object} ResolverCache
+ * @property {WeakMap} direct
+ * @property {Map} stringified
+ */
+
+module.exports = class ResolverFactory {
 	constructor() {
-		super();
-		this.hooks = {
+		this.hooks = Object.freeze({
+			/** @type {HookMap>} */
 			resolveOptions: new HookMap(
 				() => new SyncWaterfallHook(["resolveOptions"])
 			),
-			resolver: new HookMap(() => new SyncHook(["resolver", "resolveOptions"]))
-		};
-		this._pluginCompat.tap("ResolverFactory", options => {
-			let match;
-			match = /^resolve-options (.+)$/.exec(options.name);
-			if (match) {
-				this.hooks.resolveOptions.tap(
-					match[1],
-					options.fn.name || "unnamed compat plugin",
-					options.fn
-				);
-				return true;
-			}
-			match = /^resolver (.+)$/.exec(options.name);
-			if (match) {
-				this.hooks.resolver.tap(
-					match[1],
-					options.fn.name || "unnamed compat plugin",
-					options.fn
-				);
-				return true;
-			}
+			/** @type {HookMap>} */
+			resolver: new HookMap(
+				() => new SyncHook(["resolver", "resolveOptions", "userResolveOptions"])
+			)
 		});
-		this.cache1 = new WeakMap();
-		this.cache2 = new Map();
+		/** @type {Map} */
+		this.cache = new Map();
 	}
 
-	get(type, resolveOptions) {
-		const cachedResolver = this.cache1.get(resolveOptions);
-		if (cachedResolver) return cachedResolver();
-		const ident = `${type}|${JSON.stringify(resolveOptions)}`;
-		const resolver = this.cache2.get(ident);
-		if (resolver) return resolver;
+	/**
+	 * @param {string} type type of resolver
+	 * @param {ResolveOptionsWithDependencyType=} resolveOptions options
+	 * @returns {ResolverWithOptions} the resolver
+	 */
+	get(type, resolveOptions = EMPTY_RESOLVE_OPTIONS) {
+		let typedCaches = this.cache.get(type);
+		if (!typedCaches) {
+			typedCaches = {
+				direct: new WeakMap(),
+				stringified: new Map()
+			};
+			this.cache.set(type, typedCaches);
+		}
+		const cachedResolver = typedCaches.direct.get(resolveOptions);
+		if (cachedResolver) {
+			return cachedResolver;
+		}
+		const ident = JSON.stringify(resolveOptions);
+		const resolver = typedCaches.stringified.get(ident);
+		if (resolver) {
+			typedCaches.direct.set(resolveOptions, resolver);
+			return resolver;
+		}
 		const newResolver = this._create(type, resolveOptions);
-		this.cache2.set(ident, newResolver);
+		typedCaches.direct.set(resolveOptions, newResolver);
+		typedCaches.stringified.set(ident, newResolver);
 		return newResolver;
 	}
 
-	_create(type, resolveOptions) {
-		const originalResolveOptions = Object.assign({}, resolveOptions);
-		resolveOptions = this.hooks.resolveOptions.for(type).call(resolveOptions);
-		const resolver = Factory.createResolver(resolveOptions);
+	/**
+	 * @param {string} type type of resolver
+	 * @param {ResolveOptionsWithDependencyType} resolveOptionsWithDepType options
+	 * @returns {ResolverWithOptions} the resolver
+	 */
+	_create(type, resolveOptionsWithDepType) {
+		/** @type {ResolveOptionsWithDependencyType} */
+		const originalResolveOptions = { ...resolveOptionsWithDepType };
+
+		const resolveOptions = convertToResolveOptions(
+			this.hooks.resolveOptions.for(type).call(resolveOptionsWithDepType)
+		);
+		const resolver = /** @type {ResolverWithOptions} */ (
+			Factory.createResolver(resolveOptions)
+		);
 		if (!resolver) {
 			throw new Error("No resolver created");
 		}
-		/** @type {Map} */
-		const childCache = new Map();
+		/** @type {WeakMap, ResolverWithOptions>} */
+		const childCache = new WeakMap();
 		resolver.withOptions = options => {
 			const cacheEntry = childCache.get(options);
 			if (cacheEntry !== undefined) return cacheEntry;
-			const mergedOptions = Object.assign({}, originalResolveOptions, options);
+			const mergedOptions = cachedCleverMerge(originalResolveOptions, options);
 			const resolver = this.get(type, mergedOptions);
 			childCache.set(options, resolver);
 			return resolver;
 		};
-		this.hooks.resolver.for(type).call(resolver, resolveOptions);
+		this.hooks.resolver
+			.for(type)
+			.call(resolver, resolveOptions, originalResolveOptions);
 		return resolver;
 	}
 };
diff --git a/lib/RuleSet.js b/lib/RuleSet.js
deleted file mode 100644
index 7ed8eba6f5c..00000000000
--- a/lib/RuleSet.js
+++ /dev/null
@@ -1,567 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-/*
-: 
-: []
-: {
-	resource: {
-		test: ,
-		include: ,
-		exclude: ,
-	},
-	resource: , -> resource.test
-	test: , -> resource.test
-	include: , -> resource.include
-	exclude: , -> resource.exclude
-	resourceQuery: ,
-	compiler: ,
-	issuer: ,
-	use: "loader", -> use[0].loader
-	loader: <>, -> use[0].loader
-	loaders: <>, -> use
-	options: {}, -> use[0].options,
-	query: {}, -> options
-	parser: {},
-	use: [
-		"loader" -> use[x].loader
-	],
-	use: [
-		{
-			loader: "loader",
-			options: {}
-		}
-	],
-	rules: [
-		
-	],
-	oneOf: [
-		
-	]
-}
-
-: /regExp/
-: function(arg) {}
-: "starting"
-: [] // or
-: { and: [] }
-: { or: [] }
-: { not: [] }
-: { test: , include: , exclude:  }
-
-
-normalized:
-
-{
-	resource: function(),
-	resourceQuery: function(),
-	compiler: function(),
-	issuer: function(),
-	use: [
-		{
-			loader: string,
-			options: string,
-			: 
-		}
-	],
-	rules: [],
-	oneOf: [],
-	: ,
-}
-
-*/
-
-"use strict";
-
-const notMatcher = matcher => {
-	return str => {
-		return !matcher(str);
-	};
-};
-
-const orMatcher = items => {
-	return str => {
-		for (let i = 0; i < items.length; i++) {
-			if (items[i](str)) return true;
-		}
-		return false;
-	};
-};
-
-const andMatcher = items => {
-	return str => {
-		for (let i = 0; i < items.length; i++) {
-			if (!items[i](str)) return false;
-		}
-		return true;
-	};
-};
-
-module.exports = class RuleSet {
-	constructor(rules) {
-		this.references = Object.create(null);
-		this.rules = RuleSet.normalizeRules(rules, this.references, "ref-");
-	}
-
-	static normalizeRules(rules, refs, ident) {
-		if (Array.isArray(rules)) {
-			return rules.map((rule, idx) => {
-				return RuleSet.normalizeRule(rule, refs, `${ident}-${idx}`);
-			});
-		} else if (rules) {
-			return [RuleSet.normalizeRule(rules, refs, ident)];
-		} else {
-			return [];
-		}
-	}
-
-	static normalizeRule(rule, refs, ident) {
-		if (typeof rule === "string") {
-			return {
-				use: [
-					{
-						loader: rule
-					}
-				]
-			};
-		}
-		if (!rule) {
-			throw new Error("Unexcepted null when object was expected as rule");
-		}
-		if (typeof rule !== "object") {
-			throw new Error(
-				"Unexcepted " +
-					typeof rule +
-					" when object was expected as rule (" +
-					rule +
-					")"
-			);
-		}
-
-		const newRule = {};
-		let useSource;
-		let resourceSource;
-		let condition;
-
-		const checkUseSource = newSource => {
-			if (useSource && useSource !== newSource) {
-				throw new Error(
-					RuleSet.buildErrorMessage(
-						rule,
-						new Error(
-							"Rule can only have one result source (provided " +
-								newSource +
-								" and " +
-								useSource +
-								")"
-						)
-					)
-				);
-			}
-			useSource = newSource;
-		};
-
-		const checkResourceSource = newSource => {
-			if (resourceSource && resourceSource !== newSource) {
-				throw new Error(
-					RuleSet.buildErrorMessage(
-						rule,
-						new Error(
-							"Rule can only have one resource source (provided " +
-								newSource +
-								" and " +
-								resourceSource +
-								")"
-						)
-					)
-				);
-			}
-			resourceSource = newSource;
-		};
-
-		if (rule.test || rule.include || rule.exclude) {
-			checkResourceSource("test + include + exclude");
-			condition = {
-				test: rule.test,
-				include: rule.include,
-				exclude: rule.exclude
-			};
-			try {
-				newRule.resource = RuleSet.normalizeCondition(condition);
-			} catch (error) {
-				throw new Error(RuleSet.buildErrorMessage(condition, error));
-			}
-		}
-
-		if (rule.resource) {
-			checkResourceSource("resource");
-			try {
-				newRule.resource = RuleSet.normalizeCondition(rule.resource);
-			} catch (error) {
-				throw new Error(RuleSet.buildErrorMessage(rule.resource, error));
-			}
-		}
-
-		if (rule.realResource) {
-			try {
-				newRule.realResource = RuleSet.normalizeCondition(rule.realResource);
-			} catch (error) {
-				throw new Error(RuleSet.buildErrorMessage(rule.realResource, error));
-			}
-		}
-
-		if (rule.resourceQuery) {
-			try {
-				newRule.resourceQuery = RuleSet.normalizeCondition(rule.resourceQuery);
-			} catch (error) {
-				throw new Error(RuleSet.buildErrorMessage(rule.resourceQuery, error));
-			}
-		}
-
-		if (rule.compiler) {
-			try {
-				newRule.compiler = RuleSet.normalizeCondition(rule.compiler);
-			} catch (error) {
-				throw new Error(RuleSet.buildErrorMessage(rule.compiler, error));
-			}
-		}
-
-		if (rule.issuer) {
-			try {
-				newRule.issuer = RuleSet.normalizeCondition(rule.issuer);
-			} catch (error) {
-				throw new Error(RuleSet.buildErrorMessage(rule.issuer, error));
-			}
-		}
-
-		if (rule.loader && rule.loaders) {
-			throw new Error(
-				RuleSet.buildErrorMessage(
-					rule,
-					new Error(
-						"Provided loader and loaders for rule (use only one of them)"
-					)
-				)
-			);
-		}
-
-		const loader = rule.loaders || rule.loader;
-		if (typeof loader === "string" && !rule.options && !rule.query) {
-			checkUseSource("loader");
-			newRule.use = RuleSet.normalizeUse(loader.split("!"), ident);
-		} else if (typeof loader === "string" && (rule.options || rule.query)) {
-			checkUseSource("loader + options/query");
-			newRule.use = RuleSet.normalizeUse(
-				{
-					loader: loader,
-					options: rule.options,
-					query: rule.query
-				},
-				ident
-			);
-		} else if (loader && (rule.options || rule.query)) {
-			throw new Error(
-				RuleSet.buildErrorMessage(
-					rule,
-					new Error(
-						"options/query cannot be used with loaders (use options for each array item)"
-					)
-				)
-			);
-		} else if (loader) {
-			checkUseSource("loaders");
-			newRule.use = RuleSet.normalizeUse(loader, ident);
-		} else if (rule.options || rule.query) {
-			throw new Error(
-				RuleSet.buildErrorMessage(
-					rule,
-					new Error(
-						"options/query provided without loader (use loader + options)"
-					)
-				)
-			);
-		}
-
-		if (rule.use) {
-			checkUseSource("use");
-			newRule.use = RuleSet.normalizeUse(rule.use, ident);
-		}
-
-		if (rule.rules) {
-			newRule.rules = RuleSet.normalizeRules(
-				rule.rules,
-				refs,
-				`${ident}-rules`
-			);
-		}
-
-		if (rule.oneOf) {
-			newRule.oneOf = RuleSet.normalizeRules(
-				rule.oneOf,
-				refs,
-				`${ident}-oneOf`
-			);
-		}
-
-		const keys = Object.keys(rule).filter(key => {
-			return ![
-				"resource",
-				"resourceQuery",
-				"compiler",
-				"test",
-				"include",
-				"exclude",
-				"issuer",
-				"loader",
-				"options",
-				"query",
-				"loaders",
-				"use",
-				"rules",
-				"oneOf"
-			].includes(key);
-		});
-		for (const key of keys) {
-			newRule[key] = rule[key];
-		}
-
-		if (Array.isArray(newRule.use)) {
-			for (const item of newRule.use) {
-				if (item.ident) {
-					refs[item.ident] = item.options;
-				}
-			}
-		}
-
-		return newRule;
-	}
-
-	static buildErrorMessage(condition, error) {
-		const conditionAsText = JSON.stringify(
-			condition,
-			(key, value) => {
-				return value === undefined ? "undefined" : value;
-			},
-			2
-		);
-		return error.message + " in " + conditionAsText;
-	}
-
-	static normalizeUse(use, ident) {
-		if (typeof use === "function") {
-			return data => RuleSet.normalizeUse(use(data), ident);
-		}
-		if (Array.isArray(use)) {
-			return use
-				.map((item, idx) => RuleSet.normalizeUse(item, `${ident}-${idx}`))
-				.reduce((arr, items) => arr.concat(items), []);
-		}
-		return [RuleSet.normalizeUseItem(use, ident)];
-	}
-
-	static normalizeUseItemString(useItemString) {
-		const idx = useItemString.indexOf("?");
-		if (idx >= 0) {
-			return {
-				loader: useItemString.substr(0, idx),
-				options: useItemString.substr(idx + 1)
-			};
-		}
-		return {
-			loader: useItemString,
-			options: undefined
-		};
-	}
-
-	static normalizeUseItem(item, ident) {
-		if (typeof item === "string") {
-			return RuleSet.normalizeUseItemString(item);
-		}
-
-		const newItem = {};
-
-		if (item.options && item.query) {
-			throw new Error("Provided options and query in use");
-		}
-
-		if (!item.loader) {
-			throw new Error("No loader specified");
-		}
-
-		newItem.options = item.options || item.query;
-
-		if (typeof newItem.options === "object" && newItem.options) {
-			if (newItem.options.ident) {
-				newItem.ident = newItem.options.ident;
-			} else {
-				newItem.ident = ident;
-			}
-		}
-
-		const keys = Object.keys(item).filter(function(key) {
-			return !["options", "query"].includes(key);
-		});
-
-		for (const key of keys) {
-			newItem[key] = item[key];
-		}
-
-		return newItem;
-	}
-
-	static normalizeCondition(condition) {
-		if (!condition) throw new Error("Expected condition but got falsy value");
-		if (typeof condition === "string") {
-			return str => str.indexOf(condition) === 0;
-		}
-		if (typeof condition === "function") {
-			return condition;
-		}
-		if (condition instanceof RegExp) {
-			return condition.test.bind(condition);
-		}
-		if (Array.isArray(condition)) {
-			const items = condition.map(c => RuleSet.normalizeCondition(c));
-			return orMatcher(items);
-		}
-		if (typeof condition !== "object") {
-			throw Error(
-				"Unexcepted " +
-					typeof condition +
-					" when condition was expected (" +
-					condition +
-					")"
-			);
-		}
-
-		const matchers = [];
-		Object.keys(condition).forEach(key => {
-			const value = condition[key];
-			switch (key) {
-				case "or":
-				case "include":
-				case "test":
-					if (value) matchers.push(RuleSet.normalizeCondition(value));
-					break;
-				case "and":
-					if (value) {
-						const items = value.map(c => RuleSet.normalizeCondition(c));
-						matchers.push(andMatcher(items));
-					}
-					break;
-				case "not":
-				case "exclude":
-					if (value) {
-						const matcher = RuleSet.normalizeCondition(value);
-						matchers.push(notMatcher(matcher));
-					}
-					break;
-				default:
-					throw new Error("Unexcepted property " + key + " in condition");
-			}
-		});
-		if (matchers.length === 0) {
-			throw new Error("Excepted condition but got " + condition);
-		}
-		if (matchers.length === 1) {
-			return matchers[0];
-		}
-		return andMatcher(matchers);
-	}
-
-	exec(data) {
-		const result = [];
-		this._run(
-			data,
-			{
-				rules: this.rules
-			},
-			result
-		);
-		return result;
-	}
-
-	_run(data, rule, result) {
-		// test conditions
-		if (rule.resource && !data.resource) return false;
-		if (rule.realResource && !data.realResource) return false;
-		if (rule.resourceQuery && !data.resourceQuery) return false;
-		if (rule.compiler && !data.compiler) return false;
-		if (rule.issuer && !data.issuer) return false;
-		if (rule.resource && !rule.resource(data.resource)) return false;
-		if (rule.realResource && !rule.realResource(data.realResource))
-			return false;
-		if (data.issuer && rule.issuer && !rule.issuer(data.issuer)) return false;
-		if (
-			data.resourceQuery &&
-			rule.resourceQuery &&
-			!rule.resourceQuery(data.resourceQuery)
-		) {
-			return false;
-		}
-		if (data.compiler && rule.compiler && !rule.compiler(data.compiler)) {
-			return false;
-		}
-
-		// apply
-		const keys = Object.keys(rule).filter(key => {
-			return ![
-				"resource",
-				"realResource",
-				"resourceQuery",
-				"compiler",
-				"issuer",
-				"rules",
-				"oneOf",
-				"use",
-				"enforce"
-			].includes(key);
-		});
-		for (const key of keys) {
-			result.push({
-				type: key,
-				value: rule[key]
-			});
-		}
-
-		if (rule.use) {
-			const process = use => {
-				if (typeof use === "function") {
-					process(use(data));
-				} else if (Array.isArray(use)) {
-					use.forEach(process);
-				} else {
-					result.push({
-						type: "use",
-						value: use,
-						enforce: rule.enforce
-					});
-				}
-			};
-			process(rule.use);
-		}
-
-		if (rule.rules) {
-			for (let i = 0; i < rule.rules.length; i++) {
-				this._run(data, rule.rules[i], result);
-			}
-		}
-
-		if (rule.oneOf) {
-			for (let i = 0; i < rule.oneOf.length; i++) {
-				if (this._run(data, rule.oneOf[i], result)) break;
-			}
-		}
-
-		return true;
-	}
-
-	findOptionsByIdent(ident) {
-		const options = this.references[ident];
-		if (!options) {
-			throw new Error("Can't find options with ident '" + ident + "'");
-		}
-		return options;
-	}
-};
diff --git a/lib/RuntimeGlobals.js b/lib/RuntimeGlobals.js
new file mode 100644
index 00000000000..7d201f6267a
--- /dev/null
+++ b/lib/RuntimeGlobals.js
@@ -0,0 +1,387 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+/**
+ * the internal require function
+ */
+module.exports.require = "__webpack_require__";
+
+/**
+ * access to properties of the internal require function/object
+ */
+module.exports.requireScope = "__webpack_require__.*";
+
+/**
+ * the internal exports object
+ */
+module.exports.exports = "__webpack_exports__";
+
+/**
+ * top-level this need to be the exports object
+ */
+module.exports.thisAsExports = "top-level-this-exports";
+
+/**
+ * runtime need to return the exports of the last entry module
+ */
+module.exports.returnExportsFromRuntime = "return-exports-from-runtime";
+
+/**
+ * the internal module object
+ */
+module.exports.module = "module";
+
+/**
+ * the internal module object
+ */
+module.exports.moduleId = "module.id";
+
+/**
+ * the internal module object
+ */
+module.exports.moduleLoaded = "module.loaded";
+
+/**
+ * the bundle public path
+ */
+module.exports.publicPath = "__webpack_require__.p";
+
+/**
+ * the module id of the entry point
+ */
+module.exports.entryModuleId = "__webpack_require__.s";
+
+/**
+ * the module cache
+ */
+module.exports.moduleCache = "__webpack_require__.c";
+
+/**
+ * the module functions
+ */
+module.exports.moduleFactories = "__webpack_require__.m";
+
+/**
+ * the module functions, with only write access
+ */
+module.exports.moduleFactoriesAddOnly = "__webpack_require__.m (add only)";
+
+/**
+ * the chunk ensure function
+ */
+module.exports.ensureChunk = "__webpack_require__.e";
+
+/**
+ * an object with handlers to ensure a chunk
+ */
+module.exports.ensureChunkHandlers = "__webpack_require__.f";
+
+/**
+ * a runtime requirement if ensureChunkHandlers should include loading of chunk needed for entries
+ */
+module.exports.ensureChunkIncludeEntries =
+	"__webpack_require__.f (include entries)";
+
+/**
+ * the chunk prefetch function
+ */
+module.exports.prefetchChunk = "__webpack_require__.E";
+
+/**
+ * an object with handlers to prefetch a chunk
+ */
+module.exports.prefetchChunkHandlers = "__webpack_require__.F";
+
+/**
+ * the chunk preload function
+ */
+module.exports.preloadChunk = "__webpack_require__.G";
+
+/**
+ * an object with handlers to preload a chunk
+ */
+module.exports.preloadChunkHandlers = "__webpack_require__.H";
+
+/**
+ * the exported property define getters function
+ */
+module.exports.definePropertyGetters = "__webpack_require__.d";
+
+/**
+ * define compatibility on export
+ */
+module.exports.makeNamespaceObject = "__webpack_require__.r";
+
+/**
+ * create a fake namespace object
+ */
+module.exports.createFakeNamespaceObject = "__webpack_require__.t";
+
+/**
+ * compatibility get default export
+ */
+module.exports.compatGetDefaultExport = "__webpack_require__.n";
+
+/**
+ * harmony module decorator
+ */
+module.exports.harmonyModuleDecorator = "__webpack_require__.hmd";
+
+/**
+ * node.js module decorator
+ */
+module.exports.nodeModuleDecorator = "__webpack_require__.nmd";
+
+/**
+ * the webpack hash
+ */
+module.exports.getFullHash = "__webpack_require__.h";
+
+/**
+ * an object containing all installed WebAssembly.Instance export objects keyed by module id
+ */
+module.exports.wasmInstances = "__webpack_require__.w";
+
+/**
+ * instantiate a wasm instance from module exports object, id, hash and importsObject
+ */
+module.exports.instantiateWasm = "__webpack_require__.v";
+
+/**
+ * the uncaught error handler for the webpack runtime
+ */
+module.exports.uncaughtErrorHandler = "__webpack_require__.oe";
+
+/**
+ * the script nonce
+ */
+module.exports.scriptNonce = "__webpack_require__.nc";
+
+/**
+ * function to load a script tag.
+ * Arguments: (url: string, done: (event) => void), key?: string | number, chunkId?: string | number) => void
+ * done function is called when loading has finished or timeout occurred.
+ * It will attach to existing script tags with data-webpack == uniqueName + ":" + key or src == url.
+ */
+module.exports.loadScript = "__webpack_require__.l";
+
+/**
+ * function to promote a string to a TrustedScript using webpack's Trusted
+ * Types policy
+ * Arguments: (script: string) => TrustedScript
+ */
+module.exports.createScript = "__webpack_require__.ts";
+
+/**
+ * function to promote a string to a TrustedScriptURL using webpack's Trusted
+ * Types policy
+ * Arguments: (url: string) => TrustedScriptURL
+ */
+module.exports.createScriptUrl = "__webpack_require__.tu";
+
+/**
+ * function to return webpack's Trusted Types policy
+ * Arguments: () => TrustedTypePolicy
+ */
+module.exports.getTrustedTypesPolicy = "__webpack_require__.tt";
+
+/**
+ * a flag when a chunk has a fetch priority
+ */
+module.exports.hasFetchPriority = "has fetch priority";
+
+/**
+ * the chunk name of the chunk with the runtime
+ */
+module.exports.chunkName = "__webpack_require__.cn";
+
+/**
+ * the runtime id of the current runtime
+ */
+module.exports.runtimeId = "__webpack_require__.j";
+
+/**
+ * the filename of the script part of the chunk
+ */
+module.exports.getChunkScriptFilename = "__webpack_require__.u";
+
+/**
+ * the filename of the css part of the chunk
+ */
+module.exports.getChunkCssFilename = "__webpack_require__.k";
+
+/**
+ * a flag when a module/chunk/tree has css modules
+ */
+module.exports.hasCssModules = "has css modules";
+
+/**
+ * the filename of the script part of the hot update chunk
+ */
+module.exports.getChunkUpdateScriptFilename = "__webpack_require__.hu";
+
+/**
+ * the filename of the css part of the hot update chunk
+ */
+module.exports.getChunkUpdateCssFilename = "__webpack_require__.hk";
+
+/**
+ * startup signal from runtime
+ * This will be called when the runtime chunk has been loaded.
+ */
+module.exports.startup = "__webpack_require__.x";
+
+/**
+ * @deprecated
+ * creating a default startup function with the entry modules
+ */
+module.exports.startupNoDefault = "__webpack_require__.x (no default handler)";
+
+/**
+ * startup signal from runtime but only used to add logic after the startup
+ */
+module.exports.startupOnlyAfter = "__webpack_require__.x (only after)";
+
+/**
+ * startup signal from runtime but only used to add sync logic before the startup
+ */
+module.exports.startupOnlyBefore = "__webpack_require__.x (only before)";
+
+/**
+ * global callback functions for installing chunks
+ */
+module.exports.chunkCallback = "webpackChunk";
+
+/**
+ * method to startup an entrypoint with needed chunks.
+ * Signature: (moduleId: Id, chunkIds: Id[]) => any.
+ * Returns the exports of the module or a Promise
+ */
+module.exports.startupEntrypoint = "__webpack_require__.X";
+
+/**
+ * register deferred code, which will run when certain
+ * chunks are loaded.
+ * Signature: (chunkIds: Id[], fn: () => any, priority: int >= 0 = 0) => any
+ * Returned value will be returned directly when all chunks are already loaded
+ * When (priority & 1) it will wait for all other handlers with lower priority to
+ * be executed before itself is executed
+ */
+module.exports.onChunksLoaded = "__webpack_require__.O";
+
+/**
+ * method to install a chunk that was loaded somehow
+ * Signature: ({ id, ids, modules, runtime }) => void
+ */
+module.exports.externalInstallChunk = "__webpack_require__.C";
+
+/**
+ * interceptor for module executions
+ */
+module.exports.interceptModuleExecution = "__webpack_require__.i";
+
+/**
+ * the global object
+ */
+module.exports.global = "__webpack_require__.g";
+
+/**
+ * an object with all share scopes
+ */
+module.exports.shareScopeMap = "__webpack_require__.S";
+
+/**
+ * The sharing init sequence function (only runs once per share scope).
+ * Has one argument, the name of the share scope.
+ * Creates a share scope if not existing
+ */
+module.exports.initializeSharing = "__webpack_require__.I";
+
+/**
+ * The current scope when getting a module from a remote
+ */
+module.exports.currentRemoteGetScope = "__webpack_require__.R";
+
+/**
+ * the filename of the HMR manifest
+ */
+module.exports.getUpdateManifestFilename = "__webpack_require__.hmrF";
+
+/**
+ * function downloading the update manifest
+ */
+module.exports.hmrDownloadManifest = "__webpack_require__.hmrM";
+
+/**
+ * array with handler functions to download chunk updates
+ */
+module.exports.hmrDownloadUpdateHandlers = "__webpack_require__.hmrC";
+
+/**
+ * object with all hmr module data for all modules
+ */
+module.exports.hmrModuleData = "__webpack_require__.hmrD";
+
+/**
+ * array with handler functions when a module should be invalidated
+ */
+module.exports.hmrInvalidateModuleHandlers = "__webpack_require__.hmrI";
+
+/**
+ * the prefix for storing state of runtime modules when hmr is enabled
+ */
+module.exports.hmrRuntimeStatePrefix = "__webpack_require__.hmrS";
+
+/**
+ * the AMD define function
+ */
+module.exports.amdDefine = "__webpack_require__.amdD";
+
+/**
+ * the AMD options
+ */
+module.exports.amdOptions = "__webpack_require__.amdO";
+
+/**
+ * the System polyfill object
+ */
+module.exports.system = "__webpack_require__.System";
+
+/**
+ * the shorthand for Object.prototype.hasOwnProperty
+ * using of it decreases the compiled bundle size
+ */
+module.exports.hasOwnProperty = "__webpack_require__.o";
+
+/**
+ * the System.register context object
+ */
+module.exports.systemContext = "__webpack_require__.y";
+
+/**
+ * the baseURI of current document
+ */
+module.exports.baseURI = "__webpack_require__.b";
+
+/**
+ * a RelativeURL class when relative URLs are used
+ */
+module.exports.relativeUrl = "__webpack_require__.U";
+
+/**
+ * Creates an async module. The body function must be a async function.
+ * "module.exports" will be decorated with an AsyncModulePromise.
+ * The body function will be called.
+ * To handle async dependencies correctly do this: "([a, b, c] = await handleDependencies([a, b, c]));".
+ * If "hasAwaitAfterDependencies" is truthy, "handleDependencies()" must be called at the end of the body function.
+ * Signature: function(
+ * module: Module,
+ * body: (handleDependencies: (deps: AsyncModulePromise[]) => Promise & () => void,
+ * hasAwaitAfterDependencies?: boolean
+ * ) => void
+ */
+module.exports.asyncModule = "__webpack_require__.a";
diff --git a/lib/RuntimeModule.js b/lib/RuntimeModule.js
new file mode 100644
index 00000000000..6f5e82ea133
--- /dev/null
+++ b/lib/RuntimeModule.js
@@ -0,0 +1,216 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { RawSource } = require("webpack-sources");
+const OriginalSource = require("webpack-sources").OriginalSource;
+const Module = require("./Module");
+const { RUNTIME_TYPES } = require("./ModuleSourceTypesConstants");
+const { WEBPACK_MODULE_TYPE_RUNTIME } = require("./ModuleTypeConstants");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
+/** @typedef {import("./Chunk")} Chunk */
+/** @typedef {import("./ChunkGraph")} ChunkGraph */
+/** @typedef {import("./Compilation")} Compilation */
+/** @typedef {import("./Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("./Generator").SourceTypes} SourceTypes */
+/** @typedef {import("./Module").BuildCallback} BuildCallback */
+/** @typedef {import("./Module").CodeGenerationContext} CodeGenerationContext */
+/** @typedef {import("./Module").CodeGenerationResult} CodeGenerationResult */
+/** @typedef {import("./Module").NeedBuildCallback} NeedBuildCallback */
+/** @typedef {import("./Module").NeedBuildContext} NeedBuildContext */
+/** @typedef {import("./RequestShortener")} RequestShortener */
+/** @typedef {import("./ResolverFactory").ResolverWithOptions} ResolverWithOptions */
+/** @typedef {import("./WebpackError")} WebpackError */
+/** @typedef {import("./util/Hash")} Hash */
+/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
+
+class RuntimeModule extends Module {
+	/**
+	 * @param {string} name a readable name
+	 * @param {number=} stage an optional stage
+	 */
+	constructor(name, stage = 0) {
+		super(WEBPACK_MODULE_TYPE_RUNTIME);
+		this.name = name;
+		this.stage = stage;
+		this.buildMeta = {};
+		this.buildInfo = {};
+		/** @type {Compilation | undefined} */
+		this.compilation = undefined;
+		/** @type {Chunk | undefined} */
+		this.chunk = undefined;
+		/** @type {ChunkGraph | undefined} */
+		this.chunkGraph = undefined;
+		this.fullHash = false;
+		this.dependentHash = false;
+		/** @type {string | undefined | null} */
+		this._cachedGeneratedCode = undefined;
+	}
+
+	/**
+	 * @param {Compilation} compilation the compilation
+	 * @param {Chunk} chunk the chunk
+	 * @param {ChunkGraph} chunkGraph the chunk graph
+	 * @returns {void}
+	 */
+	attach(compilation, chunk, chunkGraph = compilation.chunkGraph) {
+		this.compilation = compilation;
+		this.chunk = chunk;
+		this.chunkGraph = chunkGraph;
+	}
+
+	/**
+	 * @returns {string} a unique identifier of the module
+	 */
+	identifier() {
+		return `webpack/runtime/${this.name}`;
+	}
+
+	/**
+	 * @param {RequestShortener} requestShortener the request shortener
+	 * @returns {string} a user readable identifier of the module
+	 */
+	readableIdentifier(requestShortener) {
+		return `webpack/runtime/${this.name}`;
+	}
+
+	/**
+	 * @param {NeedBuildContext} context context info
+	 * @param {NeedBuildCallback} callback callback function, returns true, if the module needs a rebuild
+	 * @returns {void}
+	 */
+	needBuild(context, callback) {
+		return callback(null, false);
+	}
+
+	/**
+	 * @param {WebpackOptions} options webpack options
+	 * @param {Compilation} compilation the compilation
+	 * @param {ResolverWithOptions} resolver the resolver
+	 * @param {InputFileSystem} fs the file system
+	 * @param {BuildCallback} callback callback function
+	 * @returns {void}
+	 */
+	build(options, compilation, resolver, fs, callback) {
+		// do nothing
+		// should not be called as runtime modules are added later to the compilation
+		callback();
+	}
+
+	/**
+	 * @param {Hash} hash the hash used to track dependencies
+	 * @param {UpdateHashContext} context context
+	 * @returns {void}
+	 */
+	updateHash(hash, context) {
+		hash.update(this.name);
+		hash.update(`${this.stage}`);
+		try {
+			if (this.fullHash || this.dependentHash) {
+				// Do not use getGeneratedCode here, because i. e. compilation hash might be not
+				// ready at this point. We will cache it later instead.
+				hash.update(/** @type {string} */ (this.generate()));
+			} else {
+				hash.update(/** @type {string} */ (this.getGeneratedCode()));
+			}
+		} catch (err) {
+			hash.update(/** @type {Error} */ (err).message);
+		}
+		super.updateHash(hash, context);
+	}
+
+	/**
+	 * @returns {SourceTypes} types available (do not mutate)
+	 */
+	getSourceTypes() {
+		return RUNTIME_TYPES;
+	}
+
+	/**
+	 * @param {CodeGenerationContext} context context for code generation
+	 * @returns {CodeGenerationResult} result
+	 */
+	codeGeneration(context) {
+		const sources = new Map();
+		const generatedCode = this.getGeneratedCode();
+		if (generatedCode) {
+			sources.set(
+				WEBPACK_MODULE_TYPE_RUNTIME,
+				this.useSourceMap || this.useSimpleSourceMap
+					? new OriginalSource(generatedCode, this.identifier())
+					: new RawSource(generatedCode)
+			);
+		}
+		return {
+			sources,
+			runtimeRequirements: null
+		};
+	}
+
+	/**
+	 * @param {string=} type the source type for which the size should be estimated
+	 * @returns {number} the estimated size of the module (must be non-zero)
+	 */
+	size(type) {
+		try {
+			const source = this.getGeneratedCode();
+			return source ? source.length : 0;
+		} catch (_err) {
+			return 0;
+		}
+	}
+
+	/* istanbul ignore next */
+	/**
+	 * @abstract
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const AbstractMethodError = require("./AbstractMethodError");
+		throw new AbstractMethodError();
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	getGeneratedCode() {
+		if (this._cachedGeneratedCode) {
+			return this._cachedGeneratedCode;
+		}
+		return (this._cachedGeneratedCode = this.generate());
+	}
+
+	/**
+	 * @returns {boolean} true, if the runtime module should get it's own scope
+	 */
+	shouldIsolate() {
+		return true;
+	}
+}
+
+/**
+ * Runtime modules without any dependencies to other runtime modules
+ */
+RuntimeModule.STAGE_NORMAL = 0;
+
+/**
+ * Runtime modules with simple dependencies on other runtime modules
+ */
+RuntimeModule.STAGE_BASIC = 5;
+
+/**
+ * Runtime modules which attach to handlers of other runtime modules
+ */
+RuntimeModule.STAGE_ATTACH = 10;
+
+/**
+ * Runtime modules which trigger actions on bootstrap
+ */
+RuntimeModule.STAGE_TRIGGER = 20;
+
+module.exports = RuntimeModule;
diff --git a/lib/RuntimePlugin.js b/lib/RuntimePlugin.js
new file mode 100644
index 00000000000..1de5e592f4d
--- /dev/null
+++ b/lib/RuntimePlugin.js
@@ -0,0 +1,498 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("./RuntimeGlobals");
+const { getChunkFilenameTemplate } = require("./css/CssModulesPlugin");
+const RuntimeRequirementsDependency = require("./dependencies/RuntimeRequirementsDependency");
+const JavascriptModulesPlugin = require("./javascript/JavascriptModulesPlugin");
+const AsyncModuleRuntimeModule = require("./runtime/AsyncModuleRuntimeModule");
+const AutoPublicPathRuntimeModule = require("./runtime/AutoPublicPathRuntimeModule");
+const BaseUriRuntimeModule = require("./runtime/BaseUriRuntimeModule");
+const CompatGetDefaultExportRuntimeModule = require("./runtime/CompatGetDefaultExportRuntimeModule");
+const CompatRuntimeModule = require("./runtime/CompatRuntimeModule");
+const CreateFakeNamespaceObjectRuntimeModule = require("./runtime/CreateFakeNamespaceObjectRuntimeModule");
+const CreateScriptRuntimeModule = require("./runtime/CreateScriptRuntimeModule");
+const CreateScriptUrlRuntimeModule = require("./runtime/CreateScriptUrlRuntimeModule");
+const DefinePropertyGettersRuntimeModule = require("./runtime/DefinePropertyGettersRuntimeModule");
+const EnsureChunkRuntimeModule = require("./runtime/EnsureChunkRuntimeModule");
+const GetChunkFilenameRuntimeModule = require("./runtime/GetChunkFilenameRuntimeModule");
+const GetMainFilenameRuntimeModule = require("./runtime/GetMainFilenameRuntimeModule");
+const GetTrustedTypesPolicyRuntimeModule = require("./runtime/GetTrustedTypesPolicyRuntimeModule");
+const GlobalRuntimeModule = require("./runtime/GlobalRuntimeModule");
+const HasOwnPropertyRuntimeModule = require("./runtime/HasOwnPropertyRuntimeModule");
+const LoadScriptRuntimeModule = require("./runtime/LoadScriptRuntimeModule");
+const MakeNamespaceObjectRuntimeModule = require("./runtime/MakeNamespaceObjectRuntimeModule");
+const NonceRuntimeModule = require("./runtime/NonceRuntimeModule");
+const OnChunksLoadedRuntimeModule = require("./runtime/OnChunksLoadedRuntimeModule");
+const PublicPathRuntimeModule = require("./runtime/PublicPathRuntimeModule");
+const RelativeUrlRuntimeModule = require("./runtime/RelativeUrlRuntimeModule");
+const RuntimeIdRuntimeModule = require("./runtime/RuntimeIdRuntimeModule");
+const SystemContextRuntimeModule = require("./runtime/SystemContextRuntimeModule");
+const ShareRuntimeModule = require("./sharing/ShareRuntimeModule");
+const StringXor = require("./util/StringXor");
+const memoize = require("./util/memoize");
+
+/** @typedef {import("../declarations/WebpackOptions").LibraryOptions} LibraryOptions */
+/** @typedef {import("../declarations/WebpackOptions").OutputNormalized} OutputNormalized */
+/** @typedef {import("./Chunk")} Chunk */
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./TemplatedPathPlugin").TemplatePath} TemplatePath */
+
+const getJavascriptModulesPlugin = memoize(() =>
+	require("./javascript/JavascriptModulesPlugin")
+);
+const getCssModulesPlugin = memoize(() => require("./css/CssModulesPlugin"));
+
+const GLOBALS_ON_REQUIRE = [
+	RuntimeGlobals.chunkName,
+	RuntimeGlobals.runtimeId,
+	RuntimeGlobals.compatGetDefaultExport,
+	RuntimeGlobals.createFakeNamespaceObject,
+	RuntimeGlobals.createScript,
+	RuntimeGlobals.createScriptUrl,
+	RuntimeGlobals.getTrustedTypesPolicy,
+	RuntimeGlobals.definePropertyGetters,
+	RuntimeGlobals.ensureChunk,
+	RuntimeGlobals.entryModuleId,
+	RuntimeGlobals.getFullHash,
+	RuntimeGlobals.global,
+	RuntimeGlobals.makeNamespaceObject,
+	RuntimeGlobals.moduleCache,
+	RuntimeGlobals.moduleFactories,
+	RuntimeGlobals.moduleFactoriesAddOnly,
+	RuntimeGlobals.interceptModuleExecution,
+	RuntimeGlobals.publicPath,
+	RuntimeGlobals.baseURI,
+	RuntimeGlobals.relativeUrl,
+	// TODO webpack 6 - rename to nonce, because we use it for CSS too
+	RuntimeGlobals.scriptNonce,
+	RuntimeGlobals.uncaughtErrorHandler,
+	RuntimeGlobals.asyncModule,
+	RuntimeGlobals.wasmInstances,
+	RuntimeGlobals.instantiateWasm,
+	RuntimeGlobals.shareScopeMap,
+	RuntimeGlobals.initializeSharing,
+	RuntimeGlobals.loadScript,
+	RuntimeGlobals.systemContext,
+	RuntimeGlobals.onChunksLoaded
+];
+
+const MODULE_DEPENDENCIES = {
+	[RuntimeGlobals.moduleLoaded]: [RuntimeGlobals.module],
+	[RuntimeGlobals.moduleId]: [RuntimeGlobals.module]
+};
+
+const TREE_DEPENDENCIES = {
+	[RuntimeGlobals.definePropertyGetters]: [RuntimeGlobals.hasOwnProperty],
+	[RuntimeGlobals.compatGetDefaultExport]: [
+		RuntimeGlobals.definePropertyGetters
+	],
+	[RuntimeGlobals.createFakeNamespaceObject]: [
+		RuntimeGlobals.definePropertyGetters,
+		RuntimeGlobals.makeNamespaceObject,
+		RuntimeGlobals.require
+	],
+	[RuntimeGlobals.initializeSharing]: [RuntimeGlobals.shareScopeMap],
+	[RuntimeGlobals.shareScopeMap]: [RuntimeGlobals.hasOwnProperty]
+};
+
+const PLUGIN_NAME = "RuntimePlugin";
+
+class RuntimePlugin {
+	/**
+	 * @param {Compiler} compiler the Compiler
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			const globalChunkLoading = compilation.outputOptions.chunkLoading;
+			/**
+			 * @param {Chunk} chunk chunk
+			 * @returns {boolean} true, when chunk loading is disabled for the chunk
+			 */
+			const isChunkLoadingDisabledForChunk = chunk => {
+				const options = chunk.getEntryOptions();
+				const chunkLoading =
+					options && options.chunkLoading !== undefined
+						? options.chunkLoading
+						: globalChunkLoading;
+				return chunkLoading === false;
+			};
+			compilation.dependencyTemplates.set(
+				RuntimeRequirementsDependency,
+				new RuntimeRequirementsDependency.Template()
+			);
+			for (const req of GLOBALS_ON_REQUIRE) {
+				compilation.hooks.runtimeRequirementInModule
+					.for(req)
+					.tap(PLUGIN_NAME, (module, set) => {
+						set.add(RuntimeGlobals.requireScope);
+					});
+				compilation.hooks.runtimeRequirementInTree
+					.for(req)
+					.tap(PLUGIN_NAME, (module, set) => {
+						set.add(RuntimeGlobals.requireScope);
+					});
+			}
+			for (const req of Object.keys(TREE_DEPENDENCIES)) {
+				const deps =
+					TREE_DEPENDENCIES[/** @type {keyof TREE_DEPENDENCIES} */ (req)];
+				compilation.hooks.runtimeRequirementInTree
+					.for(req)
+					.tap(PLUGIN_NAME, (chunk, set) => {
+						for (const dep of deps) set.add(dep);
+					});
+			}
+			for (const req of Object.keys(MODULE_DEPENDENCIES)) {
+				const deps =
+					MODULE_DEPENDENCIES[/** @type {keyof MODULE_DEPENDENCIES} */ (req)];
+				compilation.hooks.runtimeRequirementInModule
+					.for(req)
+					.tap(PLUGIN_NAME, (chunk, set) => {
+						for (const dep of deps) set.add(dep);
+					});
+			}
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.definePropertyGetters)
+				.tap(PLUGIN_NAME, chunk => {
+					compilation.addRuntimeModule(
+						chunk,
+						new DefinePropertyGettersRuntimeModule()
+					);
+					return true;
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.makeNamespaceObject)
+				.tap(PLUGIN_NAME, chunk => {
+					compilation.addRuntimeModule(
+						chunk,
+						new MakeNamespaceObjectRuntimeModule()
+					);
+					return true;
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.createFakeNamespaceObject)
+				.tap(PLUGIN_NAME, chunk => {
+					compilation.addRuntimeModule(
+						chunk,
+						new CreateFakeNamespaceObjectRuntimeModule()
+					);
+					return true;
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.hasOwnProperty)
+				.tap(PLUGIN_NAME, chunk => {
+					compilation.addRuntimeModule(
+						chunk,
+						new HasOwnPropertyRuntimeModule()
+					);
+					return true;
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.compatGetDefaultExport)
+				.tap(PLUGIN_NAME, chunk => {
+					compilation.addRuntimeModule(
+						chunk,
+						new CompatGetDefaultExportRuntimeModule()
+					);
+					return true;
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.runtimeId)
+				.tap(PLUGIN_NAME, chunk => {
+					compilation.addRuntimeModule(chunk, new RuntimeIdRuntimeModule());
+					return true;
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.publicPath)
+				.tap(PLUGIN_NAME, (chunk, set) => {
+					const { outputOptions } = compilation;
+					const { publicPath: globalPublicPath, scriptType } = outputOptions;
+					const entryOptions = chunk.getEntryOptions();
+					const publicPath =
+						entryOptions && entryOptions.publicPath !== undefined
+							? entryOptions.publicPath
+							: globalPublicPath;
+
+					if (publicPath === "auto") {
+						const module = new AutoPublicPathRuntimeModule();
+						if (scriptType !== "module") set.add(RuntimeGlobals.global);
+						compilation.addRuntimeModule(chunk, module);
+					} else {
+						const module = new PublicPathRuntimeModule(publicPath);
+
+						if (
+							typeof publicPath !== "string" ||
+							/\[(full)?hash\]/.test(publicPath)
+						) {
+							module.fullHash = true;
+						}
+
+						compilation.addRuntimeModule(chunk, module);
+					}
+					return true;
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.global)
+				.tap(PLUGIN_NAME, chunk => {
+					compilation.addRuntimeModule(chunk, new GlobalRuntimeModule());
+					return true;
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.asyncModule)
+				.tap(PLUGIN_NAME, chunk => {
+					compilation.addRuntimeModule(chunk, new AsyncModuleRuntimeModule());
+					return true;
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.systemContext)
+				.tap(PLUGIN_NAME, chunk => {
+					const entryOptions = chunk.getEntryOptions();
+					const libraryType =
+						entryOptions && entryOptions.library !== undefined
+							? entryOptions.library.type
+							: /** @type {LibraryOptions} */
+								(compilation.outputOptions.library).type;
+
+					if (libraryType === "system") {
+						compilation.addRuntimeModule(
+							chunk,
+							new SystemContextRuntimeModule()
+						);
+					}
+					return true;
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.getChunkScriptFilename)
+				.tap(PLUGIN_NAME, (chunk, set, { chunkGraph }) => {
+					if (
+						typeof compilation.outputOptions.chunkFilename === "string" &&
+						/\[(full)?hash(:\d+)?\]/.test(
+							compilation.outputOptions.chunkFilename
+						)
+					) {
+						set.add(RuntimeGlobals.getFullHash);
+					}
+					compilation.addRuntimeModule(
+						chunk,
+						new GetChunkFilenameRuntimeModule(
+							"javascript",
+							"javascript",
+							RuntimeGlobals.getChunkScriptFilename,
+							chunk =>
+								getJavascriptModulesPlugin().chunkHasJs(chunk, chunkGraph) &&
+								/** @type {TemplatePath} */ (
+									chunk.filenameTemplate ||
+										(chunk.canBeInitial()
+											? compilation.outputOptions.filename
+											: compilation.outputOptions.chunkFilename)
+								),
+							set.has(RuntimeGlobals.hmrDownloadUpdateHandlers)
+						)
+					);
+					return true;
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.getChunkCssFilename)
+				.tap(PLUGIN_NAME, (chunk, set, { chunkGraph }) => {
+					if (
+						typeof compilation.outputOptions.cssChunkFilename === "string" &&
+						/\[(full)?hash(:\d+)?\]/.test(
+							compilation.outputOptions.cssChunkFilename
+						)
+					) {
+						set.add(RuntimeGlobals.getFullHash);
+					}
+					compilation.addRuntimeModule(
+						chunk,
+						new GetChunkFilenameRuntimeModule(
+							"css",
+							"css",
+							RuntimeGlobals.getChunkCssFilename,
+							chunk =>
+								getCssModulesPlugin().chunkHasCss(chunk, chunkGraph) &&
+								getChunkFilenameTemplate(chunk, compilation.outputOptions),
+							set.has(RuntimeGlobals.hmrDownloadUpdateHandlers)
+						)
+					);
+					return true;
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.getChunkUpdateScriptFilename)
+				.tap(PLUGIN_NAME, (chunk, set) => {
+					if (
+						/\[(full)?hash(:\d+)?\]/.test(
+							/** @type {NonNullable} */
+							(compilation.outputOptions.hotUpdateChunkFilename)
+						)
+					)
+						set.add(RuntimeGlobals.getFullHash);
+					compilation.addRuntimeModule(
+						chunk,
+						new GetChunkFilenameRuntimeModule(
+							"javascript",
+							"javascript update",
+							RuntimeGlobals.getChunkUpdateScriptFilename,
+							c =>
+								/** @type {NonNullable} */
+								(compilation.outputOptions.hotUpdateChunkFilename),
+							true
+						)
+					);
+					return true;
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.getUpdateManifestFilename)
+				.tap(PLUGIN_NAME, (chunk, set) => {
+					if (
+						/\[(full)?hash(:\d+)?\]/.test(
+							/** @type {NonNullable} */
+							(compilation.outputOptions.hotUpdateMainFilename)
+						)
+					) {
+						set.add(RuntimeGlobals.getFullHash);
+					}
+					compilation.addRuntimeModule(
+						chunk,
+						new GetMainFilenameRuntimeModule(
+							"update manifest",
+							RuntimeGlobals.getUpdateManifestFilename,
+							/** @type {NonNullable} */
+							(compilation.outputOptions.hotUpdateMainFilename)
+						)
+					);
+					return true;
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.ensureChunk)
+				.tap(PLUGIN_NAME, (chunk, set) => {
+					const hasAsyncChunks = chunk.hasAsyncChunks();
+					if (hasAsyncChunks) {
+						set.add(RuntimeGlobals.ensureChunkHandlers);
+					}
+					compilation.addRuntimeModule(
+						chunk,
+						new EnsureChunkRuntimeModule(set)
+					);
+					return true;
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.ensureChunkIncludeEntries)
+				.tap(PLUGIN_NAME, (chunk, set) => {
+					set.add(RuntimeGlobals.ensureChunkHandlers);
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.shareScopeMap)
+				.tap(PLUGIN_NAME, (chunk, set) => {
+					compilation.addRuntimeModule(chunk, new ShareRuntimeModule());
+					return true;
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.loadScript)
+				.tap(PLUGIN_NAME, (chunk, set) => {
+					const withCreateScriptUrl = Boolean(
+						compilation.outputOptions.trustedTypes
+					);
+					if (withCreateScriptUrl) {
+						set.add(RuntimeGlobals.createScriptUrl);
+					}
+					const withFetchPriority = set.has(RuntimeGlobals.hasFetchPriority);
+					compilation.addRuntimeModule(
+						chunk,
+						new LoadScriptRuntimeModule(withCreateScriptUrl, withFetchPriority)
+					);
+					return true;
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.createScript)
+				.tap(PLUGIN_NAME, (chunk, set) => {
+					if (compilation.outputOptions.trustedTypes) {
+						set.add(RuntimeGlobals.getTrustedTypesPolicy);
+					}
+					compilation.addRuntimeModule(chunk, new CreateScriptRuntimeModule());
+					return true;
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.createScriptUrl)
+				.tap(PLUGIN_NAME, (chunk, set) => {
+					if (compilation.outputOptions.trustedTypes) {
+						set.add(RuntimeGlobals.getTrustedTypesPolicy);
+					}
+					compilation.addRuntimeModule(
+						chunk,
+						new CreateScriptUrlRuntimeModule()
+					);
+					return true;
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.getTrustedTypesPolicy)
+				.tap(PLUGIN_NAME, (chunk, set) => {
+					compilation.addRuntimeModule(
+						chunk,
+						new GetTrustedTypesPolicyRuntimeModule(set)
+					);
+					return true;
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.relativeUrl)
+				.tap(PLUGIN_NAME, (chunk, set) => {
+					compilation.addRuntimeModule(chunk, new RelativeUrlRuntimeModule());
+					return true;
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.onChunksLoaded)
+				.tap(PLUGIN_NAME, (chunk, set) => {
+					compilation.addRuntimeModule(
+						chunk,
+						new OnChunksLoadedRuntimeModule()
+					);
+					return true;
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.baseURI)
+				.tap(PLUGIN_NAME, chunk => {
+					if (isChunkLoadingDisabledForChunk(chunk)) {
+						compilation.addRuntimeModule(chunk, new BaseUriRuntimeModule());
+						return true;
+					}
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.scriptNonce)
+				.tap(PLUGIN_NAME, chunk => {
+					compilation.addRuntimeModule(chunk, new NonceRuntimeModule());
+					return true;
+				});
+			// TODO webpack 6: remove CompatRuntimeModule
+			compilation.hooks.additionalTreeRuntimeRequirements.tap(
+				PLUGIN_NAME,
+				(chunk, set) => {
+					const { mainTemplate } = compilation;
+					if (
+						mainTemplate.hooks.bootstrap.isUsed() ||
+						mainTemplate.hooks.localVars.isUsed() ||
+						mainTemplate.hooks.requireEnsure.isUsed() ||
+						mainTemplate.hooks.requireExtensions.isUsed()
+					) {
+						compilation.addRuntimeModule(chunk, new CompatRuntimeModule());
+					}
+				}
+			);
+			JavascriptModulesPlugin.getCompilationHooks(compilation).chunkHash.tap(
+				PLUGIN_NAME,
+				(chunk, hash, { chunkGraph }) => {
+					const xor = new StringXor();
+					for (const m of chunkGraph.getChunkRuntimeModulesIterable(chunk)) {
+						xor.add(chunkGraph.getModuleHash(m, chunk.runtime));
+					}
+					xor.updateHash(hash);
+				}
+			);
+		});
+	}
+}
+module.exports = RuntimePlugin;
diff --git a/lib/RuntimeTemplate.js b/lib/RuntimeTemplate.js
index 613aed1c3ad..536d0b5eb1d 100644
--- a/lib/RuntimeTemplate.js
+++ b/lib/RuntimeTemplate.js
@@ -2,23 +2,319 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const InitFragment = require("./InitFragment");
+const RuntimeGlobals = require("./RuntimeGlobals");
 const Template = require("./Template");
+const { equals } = require("./util/ArrayHelpers");
+const compileBooleanMatcher = require("./util/compileBooleanMatcher");
+const propertyAccess = require("./util/propertyAccess");
+const { forEachRuntime, subtractRuntime } = require("./util/runtime");
 
+/** @typedef {import("../declarations/WebpackOptions").Environment} Environment */
+/** @typedef {import("../declarations/WebpackOptions").OutputNormalized} OutputOptions */
+/** @typedef {import("./AsyncDependenciesBlock")} AsyncDependenciesBlock */
+/** @typedef {import("./Chunk")} Chunk */
+/** @typedef {import("./ChunkGraph")} ChunkGraph */
+/** @typedef {import("./CodeGenerationResults")} CodeGenerationResults */
+/** @typedef {import("./CodeGenerationResults").CodeGenerationResult} CodeGenerationResult */
+/** @typedef {import("./Compilation")} Compilation */
+/** @typedef {import("./Dependency")} Dependency */
 /** @typedef {import("./Module")} Module */
+/** @typedef {import("./Module").BuildMeta} BuildMeta */
+/** @typedef {import("./Module").RuntimeRequirements} RuntimeRequirements */
+/** @typedef {import("./ModuleGraph")} ModuleGraph */
+/** @typedef {import("./RequestShortener")} RequestShortener */
+/** @typedef {import("./util/runtime").RuntimeSpec} RuntimeSpec */
+
+/**
+ * @param {Module} module the module
+ * @param {ChunkGraph} chunkGraph the chunk graph
+ * @returns {string} error message
+ */
+const noModuleIdErrorMessage = (
+	module,
+	chunkGraph
+) => `Module ${module.identifier()} has no id assigned.
+This should not happen.
+It's in these chunks: ${
+	Array.from(
+		chunkGraph.getModuleChunksIterable(module),
+		c => c.name || c.id || c.debugId
+	).join(", ") || "none"
+} (If module is in no chunk this indicates a bug in some chunk/module optimization logic)
+Module has these incoming connections: ${Array.from(
+	chunkGraph.moduleGraph.getIncomingConnections(module),
+	connection =>
+		`\n - ${
+			connection.originModule && connection.originModule.identifier()
+		} ${connection.dependency && connection.dependency.type} ${
+			(connection.explanations &&
+				Array.from(connection.explanations).join(", ")) ||
+			""
+		}`
+).join("")}`;
+
+/**
+ * @param {string | undefined} definition global object definition
+ * @returns {string | undefined} save to use global object
+ */
+function getGlobalObject(definition) {
+	if (!definition) return definition;
+	const trimmed = definition.trim();
+
+	if (
+		// identifier, we do not need real identifier regarding ECMAScript/Unicode
+		/^[_\p{L}][_0-9\p{L}]*$/iu.test(trimmed) ||
+		// iife
+		// call expression
+		// expression in parentheses
+		/^([_\p{L}][_0-9\p{L}]*)?\(.*\)$/iu.test(trimmed)
+	)
+		return trimmed;
+
+	return `Object(${trimmed})`;
+}
 
-module.exports = class RuntimeTemplate {
-	constructor(outputOptions, requestShortener) {
-		this.outputOptions = outputOptions || {};
+class RuntimeTemplate {
+	/**
+	 * @param {Compilation} compilation the compilation
+	 * @param {OutputOptions} outputOptions the compilation output options
+	 * @param {RequestShortener} requestShortener the request shortener
+	 */
+	constructor(compilation, outputOptions, requestShortener) {
+		this.compilation = compilation;
+		this.outputOptions = /** @type {OutputOptions} */ (outputOptions || {});
 		this.requestShortener = requestShortener;
+		this.globalObject =
+			/** @type {string} */
+			(getGlobalObject(outputOptions.globalObject));
+		this.contentHashReplacement = "X".repeat(
+			/** @type {NonNullable} */
+			(outputOptions.hashDigestLength)
+		);
+	}
+
+	isIIFE() {
+		return this.outputOptions.iife;
+	}
+
+	isModule() {
+		return this.outputOptions.module;
+	}
+
+	isNeutralPlatform() {
+		return (
+			!this.outputOptions.environment.document &&
+			!this.compilation.compiler.platform.node
+		);
+	}
+
+	supportsConst() {
+		return this.outputOptions.environment.const;
+	}
+
+	supportsArrowFunction() {
+		return this.outputOptions.environment.arrowFunction;
+	}
+
+	supportsAsyncFunction() {
+		return this.outputOptions.environment.asyncFunction;
+	}
+
+	supportsOptionalChaining() {
+		return this.outputOptions.environment.optionalChaining;
+	}
+
+	supportsForOf() {
+		return this.outputOptions.environment.forOf;
+	}
+
+	supportsDestructuring() {
+		return this.outputOptions.environment.destructuring;
+	}
+
+	supportsBigIntLiteral() {
+		return this.outputOptions.environment.bigIntLiteral;
+	}
+
+	supportsDynamicImport() {
+		return this.outputOptions.environment.dynamicImport;
+	}
+
+	supportsEcmaScriptModuleSyntax() {
+		return this.outputOptions.environment.module;
+	}
+
+	supportTemplateLiteral() {
+		return this.outputOptions.environment.templateLiteral;
+	}
+
+	supportNodePrefixForCoreModules() {
+		return this.outputOptions.environment.nodePrefixForCoreModules;
+	}
+
+	/**
+	 * @param {string} returnValue return value
+	 * @param {string} args arguments
+	 * @returns {string} returning function
+	 */
+	returningFunction(returnValue, args = "") {
+		return this.supportsArrowFunction()
+			? `(${args}) => (${returnValue})`
+			: `function(${args}) { return ${returnValue}; }`;
+	}
+
+	/**
+	 * @param {string} args arguments
+	 * @param {string | string[]} body body
+	 * @returns {string} basic function
+	 */
+	basicFunction(args, body) {
+		return this.supportsArrowFunction()
+			? `(${args}) => {\n${Template.indent(body)}\n}`
+			: `function(${args}) {\n${Template.indent(body)}\n}`;
+	}
+
+	/**
+	 * @param {Array} args args
+	 * @returns {string} result expression
+	 */
+	concatenation(...args) {
+		const len = args.length;
+
+		if (len === 2) return this._es5Concatenation(args);
+		if (len === 0) return '""';
+		if (len === 1) {
+			return typeof args[0] === "string"
+				? JSON.stringify(args[0])
+				: `"" + ${args[0].expr}`;
+		}
+		if (!this.supportTemplateLiteral()) return this._es5Concatenation(args);
+
+		// cost comparison between template literal and concatenation:
+		// both need equal surroundings: `xxx` vs "xxx"
+		// template literal has constant cost of 3 chars for each expression
+		// es5 concatenation has cost of 3 + n chars for n expressions in row
+		// when a es5 concatenation ends with an expression it reduces cost by 3
+		// when a es5 concatenation starts with an single expression it reduces cost by 3
+		// e. g. `${a}${b}${c}` (3*3 = 9) is longer than ""+a+b+c ((3+3)-3 = 3)
+		// e. g. `x${a}x${b}x${c}x` (3*3 = 9) is shorter than "x"+a+"x"+b+"x"+c+"x" (4+4+4 = 12)
+
+		let templateCost = 0;
+		let concatenationCost = 0;
+
+		let lastWasExpr = false;
+		for (const arg of args) {
+			const isExpr = typeof arg !== "string";
+			if (isExpr) {
+				templateCost += 3;
+				concatenationCost += lastWasExpr ? 1 : 4;
+			}
+			lastWasExpr = isExpr;
+		}
+		if (lastWasExpr) concatenationCost -= 3;
+		if (typeof args[0] !== "string" && typeof args[1] === "string")
+			concatenationCost -= 3;
+
+		if (concatenationCost <= templateCost) return this._es5Concatenation(args);
+
+		return `\`${args
+			.map(arg => (typeof arg === "string" ? arg : `\${${arg.expr}}`))
+			.join("")}\``;
+	}
+
+	/**
+	 * @param {Array} args args (len >= 2)
+	 * @returns {string} result expression
+	 * @private
+	 */
+	_es5Concatenation(args) {
+		const str = args
+			.map(arg => (typeof arg === "string" ? JSON.stringify(arg) : arg.expr))
+			.join(" + ");
+
+		// when the first two args are expression, we need to prepend "" + to force string
+		// concatenation instead of number addition.
+		return typeof args[0] !== "string" && typeof args[1] !== "string"
+			? `"" + ${str}`
+			: str;
+	}
+
+	/**
+	 * @param {string} expression expression
+	 * @param {string} args arguments
+	 * @returns {string} expression function code
+	 */
+	expressionFunction(expression, args = "") {
+		return this.supportsArrowFunction()
+			? `(${args}) => (${expression})`
+			: `function(${args}) { ${expression}; }`;
+	}
+
+	/**
+	 * @returns {string} empty function code
+	 */
+	emptyFunction() {
+		return this.supportsArrowFunction() ? "x => {}" : "function() {}";
+	}
+
+	/**
+	 * @param {string[]} items items
+	 * @param {string} value value
+	 * @returns {string} destructure array code
+	 */
+	destructureArray(items, value) {
+		return this.supportsDestructuring()
+			? `var [${items.join(", ")}] = ${value};`
+			: Template.asString(
+					items.map((item, i) => `var ${item} = ${value}[${i}];`)
+				);
+	}
+
+	/**
+	 * @param {string[]} items items
+	 * @param {string} value value
+	 * @returns {string} destructure object code
+	 */
+	destructureObject(items, value) {
+		return this.supportsDestructuring()
+			? `var {${items.join(", ")}} = ${value};`
+			: Template.asString(
+					items.map(item => `var ${item} = ${value}${propertyAccess([item])};`)
+				);
+	}
+
+	/**
+	 * @param {string} args arguments
+	 * @param {string} body body
+	 * @returns {string} IIFE code
+	 */
+	iife(args, body) {
+		return `(${this.basicFunction(args, body)})()`;
+	}
+
+	/**
+	 * @param {string} variable variable
+	 * @param {string} array array
+	 * @param {string | string[]} body body
+	 * @returns {string} for each code
+	 */
+	forEach(variable, array, body) {
+		return this.supportsForOf()
+			? `for(const ${variable} of ${array}) {\n${Template.indent(body)}\n}`
+			: `${array}.forEach(function(${variable}) {\n${Template.indent(
+					body
+				)}\n});`;
 	}
 
 	/**
 	 * Add a comment
 	 * @param {object} options Information content of the comment
 	 * @param {string=} options.request request string used originally
-	 * @param {string=} options.chunkName name of the chunk referenced
+	 * @param {(string | null)=} options.chunkName name of the chunk referenced
 	 * @param {string=} options.chunkReason reason information of the chunk
 	 * @param {string=} options.message additional message
 	 * @param {string=} options.exportName name of the export
@@ -39,107 +335,314 @@ module.exports = class RuntimeTemplate {
 		}
 		if (!content) return "";
 		if (this.outputOptions.pathinfo) {
-			return Template.toComment(content) + " ";
-		} else {
-			return Template.toNormalComment(content) + " ";
+			return `${Template.toComment(content)} `;
 		}
+		return `${Template.toNormalComment(content)} `;
 	}
 
-	throwMissingModuleErrorFunction({ request }) {
+	/**
+	 * @param {object} options generation options
+	 * @param {string=} options.request request string used originally
+	 * @returns {string} generated error block
+	 */
+	throwMissingModuleErrorBlock({ request }) {
 		const err = `Cannot find module '${request}'`;
-		return `function webpackMissingModule() { var e = new Error(${JSON.stringify(
+		return `var e = new Error(${JSON.stringify(
 			err
-		)}); e.code = 'MODULE_NOT_FOUND'; throw e; }`;
+		)}); e.code = 'MODULE_NOT_FOUND'; throw e;`;
+	}
+
+	/**
+	 * @param {object} options generation options
+	 * @param {string=} options.request request string used originally
+	 * @returns {string} generated error function
+	 */
+	throwMissingModuleErrorFunction({ request }) {
+		return `function webpackMissingModule() { ${this.throwMissingModuleErrorBlock(
+			{ request }
+		)} }`;
 	}
 
+	/**
+	 * @param {object} options generation options
+	 * @param {string=} options.request request string used originally
+	 * @returns {string} generated error IIFE
+	 */
 	missingModule({ request }) {
-		return `!(${this.throwMissingModuleErrorFunction({ request })}())`;
+		return `Object(${this.throwMissingModuleErrorFunction({ request })}())`;
 	}
 
+	/**
+	 * @param {object} options generation options
+	 * @param {string=} options.request request string used originally
+	 * @returns {string} generated error statement
+	 */
 	missingModuleStatement({ request }) {
 		return `${this.missingModule({ request })};\n`;
 	}
 
+	/**
+	 * @param {object} options generation options
+	 * @param {string=} options.request request string used originally
+	 * @returns {string} generated error code
+	 */
 	missingModulePromise({ request }) {
 		return `Promise.resolve().then(${this.throwMissingModuleErrorFunction({
 			request
 		})})`;
 	}
 
-	moduleId({ module, request }) {
+	/**
+	 * @param {object} options options object
+	 * @param {ChunkGraph} options.chunkGraph the chunk graph
+	 * @param {Module} options.module the module
+	 * @param {string=} options.request the request that should be printed as comment
+	 * @param {string=} options.idExpr expression to use as id expression
+	 * @param {"expression" | "promise" | "statements"} options.type which kind of code should be returned
+	 * @returns {string} the code
+	 */
+	weakError({ module, chunkGraph, request, idExpr, type }) {
+		const moduleId = chunkGraph.getModuleId(module);
+		const errorMessage =
+			moduleId === null
+				? JSON.stringify("Module is not available (weak dependency)")
+				: idExpr
+					? `"Module '" + ${idExpr} + "' is not available (weak dependency)"`
+					: JSON.stringify(
+							`Module '${moduleId}' is not available (weak dependency)`
+						);
+		const comment = request ? `${Template.toNormalComment(request)} ` : "";
+		const errorStatements = `var e = new Error(${errorMessage}); ${
+			comment
+		}e.code = 'MODULE_NOT_FOUND'; throw e;`;
+		switch (type) {
+			case "statements":
+				return errorStatements;
+			case "promise":
+				return `Promise.resolve().then(${this.basicFunction(
+					"",
+					errorStatements
+				)})`;
+			case "expression":
+				return this.iife("", errorStatements);
+		}
+	}
+
+	/**
+	 * @param {object} options options object
+	 * @param {Module} options.module the module
+	 * @param {ChunkGraph} options.chunkGraph the chunk graph
+	 * @param {string=} options.request the request that should be printed as comment
+	 * @param {boolean=} options.weak if the dependency is weak (will create a nice error message)
+	 * @returns {string} the expression
+	 */
+	moduleId({ module, chunkGraph, request, weak }) {
 		if (!module) {
 			return this.missingModule({
 				request
 			});
 		}
-		if (module.id === null) {
+		const moduleId = chunkGraph.getModuleId(module);
+		if (moduleId === null) {
+			if (weak) {
+				return "null /* weak dependency, without id */";
+			}
 			throw new Error(
-				`RuntimeTemplate.moduleId(): Module ${module.identifier()} has no id. This should not happen.`
+				`RuntimeTemplate.moduleId(): ${noModuleIdErrorMessage(
+					module,
+					chunkGraph
+				)}`
 			);
 		}
-		return `${this.comment({ request })}${JSON.stringify(module.id)}`;
+		return `${this.comment({ request })}${JSON.stringify(moduleId)}`;
 	}
 
-	moduleRaw({ module, request }) {
+	/**
+	 * @param {object} options options object
+	 * @param {Module | null} options.module the module
+	 * @param {ChunkGraph} options.chunkGraph the chunk graph
+	 * @param {string=} options.request the request that should be printed as comment
+	 * @param {boolean=} options.weak if the dependency is weak (will create a nice error message)
+	 * @param {RuntimeRequirements} options.runtimeRequirements if set, will be filled with runtime requirements
+	 * @returns {string} the expression
+	 */
+	moduleRaw({ module, chunkGraph, request, weak, runtimeRequirements }) {
 		if (!module) {
 			return this.missingModule({
 				request
 			});
 		}
-		return `__webpack_require__(${this.moduleId({ module, request })})`;
+		const moduleId = chunkGraph.getModuleId(module);
+		if (moduleId === null) {
+			if (weak) {
+				// only weak referenced modules don't get an id
+				// we can always emit an error emitting code here
+				return this.weakError({
+					module,
+					chunkGraph,
+					request,
+					type: "expression"
+				});
+			}
+			throw new Error(
+				`RuntimeTemplate.moduleId(): ${noModuleIdErrorMessage(
+					module,
+					chunkGraph
+				)}`
+			);
+		}
+		runtimeRequirements.add(RuntimeGlobals.require);
+		return `${RuntimeGlobals.require}(${this.moduleId({
+			module,
+			chunkGraph,
+			request,
+			weak
+		})})`;
 	}
 
-	moduleExports({ module, request }) {
+	/**
+	 * @param {object} options options object
+	 * @param {Module | null} options.module the module
+	 * @param {ChunkGraph} options.chunkGraph the chunk graph
+	 * @param {string} options.request the request that should be printed as comment
+	 * @param {boolean=} options.weak if the dependency is weak (will create a nice error message)
+	 * @param {RuntimeRequirements} options.runtimeRequirements if set, will be filled with runtime requirements
+	 * @returns {string} the expression
+	 */
+	moduleExports({ module, chunkGraph, request, weak, runtimeRequirements }) {
 		return this.moduleRaw({
 			module,
-			request
+			chunkGraph,
+			request,
+			weak,
+			runtimeRequirements
 		});
 	}
 
-	moduleNamespace({ module, request, strict }) {
+	/**
+	 * @param {object} options options object
+	 * @param {Module} options.module the module
+	 * @param {ChunkGraph} options.chunkGraph the chunk graph
+	 * @param {string} options.request the request that should be printed as comment
+	 * @param {boolean=} options.strict if the current module is in strict esm mode
+	 * @param {boolean=} options.weak if the dependency is weak (will create a nice error message)
+	 * @param {RuntimeRequirements} options.runtimeRequirements if set, will be filled with runtime requirements
+	 * @returns {string} the expression
+	 */
+	moduleNamespace({
+		module,
+		chunkGraph,
+		request,
+		strict,
+		weak,
+		runtimeRequirements
+	}) {
 		if (!module) {
 			return this.missingModule({
 				request
 			});
 		}
+		if (chunkGraph.getModuleId(module) === null) {
+			if (weak) {
+				// only weak referenced modules don't get an id
+				// we can always emit an error emitting code here
+				return this.weakError({
+					module,
+					chunkGraph,
+					request,
+					type: "expression"
+				});
+			}
+			throw new Error(
+				`RuntimeTemplate.moduleNamespace(): ${noModuleIdErrorMessage(
+					module,
+					chunkGraph
+				)}`
+			);
+		}
 		const moduleId = this.moduleId({
 			module,
-			request
+			chunkGraph,
+			request,
+			weak
 		});
-		const exportsType = module.buildMeta && module.buildMeta.exportsType;
-		if (exportsType === "namespace") {
-			const rawModule = this.moduleRaw({
-				module,
-				request
-			});
-			return rawModule;
-		} else if (exportsType === "named") {
-			return `__webpack_require__.t(${moduleId}, 3)`;
-		} else if (strict) {
-			return `__webpack_require__.t(${moduleId}, 1)`;
-		} else {
-			return `__webpack_require__.t(${moduleId}, 7)`;
+		const exportsType = module.getExportsType(chunkGraph.moduleGraph, strict);
+		switch (exportsType) {
+			case "namespace":
+				return this.moduleRaw({
+					module,
+					chunkGraph,
+					request,
+					weak,
+					runtimeRequirements
+				});
+			case "default-with-named":
+				runtimeRequirements.add(RuntimeGlobals.createFakeNamespaceObject);
+				return `${RuntimeGlobals.createFakeNamespaceObject}(${moduleId}, 3)`;
+			case "default-only":
+				runtimeRequirements.add(RuntimeGlobals.createFakeNamespaceObject);
+				return `${RuntimeGlobals.createFakeNamespaceObject}(${moduleId}, 1)`;
+			case "dynamic":
+				runtimeRequirements.add(RuntimeGlobals.createFakeNamespaceObject);
+				return `${RuntimeGlobals.createFakeNamespaceObject}(${moduleId}, 7)`;
 		}
 	}
 
-	moduleNamespacePromise({ block, module, request, message, strict, weak }) {
+	/**
+	 * @param {object} options options object
+	 * @param {ChunkGraph} options.chunkGraph the chunk graph
+	 * @param {AsyncDependenciesBlock=} options.block the current dependencies block
+	 * @param {Module} options.module the module
+	 * @param {string} options.request the request that should be printed as comment
+	 * @param {string} options.message a message for the comment
+	 * @param {boolean=} options.strict if the current module is in strict esm mode
+	 * @param {boolean=} options.weak if the dependency is weak (will create a nice error message)
+	 * @param {RuntimeRequirements} options.runtimeRequirements if set, will be filled with runtime requirements
+	 * @returns {string} the promise expression
+	 */
+	moduleNamespacePromise({
+		chunkGraph,
+		block,
+		module,
+		request,
+		message,
+		strict,
+		weak,
+		runtimeRequirements
+	}) {
 		if (!module) {
 			return this.missingModulePromise({
 				request
 			});
 		}
-		if (module.id === null) {
+		const moduleId = chunkGraph.getModuleId(module);
+		if (moduleId === null) {
+			if (weak) {
+				// only weak referenced modules don't get an id
+				// we can always emit an error emitting code here
+				return this.weakError({
+					module,
+					chunkGraph,
+					request,
+					type: "promise"
+				});
+			}
 			throw new Error(
-				`RuntimeTemplate.moduleNamespacePromise(): Module ${module.identifier()} has no id. This should not happen.`
+				`RuntimeTemplate.moduleNamespacePromise(): ${noModuleIdErrorMessage(
+					module,
+					chunkGraph
+				)}`
 			);
 		}
 		const promise = this.blockPromise({
+			chunkGraph,
 			block,
-			message
+			message,
+			runtimeRequirements
 		});
 
-		let getModuleFunction;
-		let idExpr = JSON.stringify(module.id);
+		let appending;
+		let idExpr = JSON.stringify(chunkGraph.getModuleId(module));
 		const comment = this.comment({
 			request
 		});
@@ -150,85 +653,225 @@ module.exports = class RuntimeTemplate {
 				header += `var id = ${idExpr}; `;
 				idExpr = "id";
 			}
-			header += `if(!__webpack_require__.m[${idExpr}]) { var e = new Error("Module '" + ${idExpr} + "' is not available (weak dependency)"); e.code = 'MODULE_NOT_FOUND'; throw e; } `;
+			runtimeRequirements.add(RuntimeGlobals.moduleFactories);
+			header += `if(!${
+				RuntimeGlobals.moduleFactories
+			}[${idExpr}]) { ${this.weakError({
+				module,
+				chunkGraph,
+				request,
+				idExpr,
+				type: "statements"
+			})} } `;
 		}
-		const moduleId = this.moduleId({
+		const moduleIdExpr = this.moduleId({
 			module,
-			request
+			chunkGraph,
+			request,
+			weak
 		});
-		const exportsType = module.buildMeta && module.buildMeta.exportsType;
-		if (exportsType === "namespace") {
-			if (header) {
-				const rawModule = this.moduleRaw({
-					module,
-					request
-				});
-				getModuleFunction = `function() { ${header}return ${rawModule}; }`;
-			} else {
-				getModuleFunction = `__webpack_require__.bind(null, ${comment}${idExpr})`;
-			}
-		} else if (exportsType === "named") {
-			if (header) {
-				getModuleFunction = `function() { ${header}return __webpack_require__.t(${moduleId}, 3); }`;
-			} else {
-				getModuleFunction = `__webpack_require__.t.bind(null, ${comment}${idExpr}, 3)`;
-			}
-		} else if (strict) {
-			if (header) {
-				getModuleFunction = `function() { ${header}return __webpack_require__.t(${moduleId}, 1); }`;
-			} else {
-				getModuleFunction = `__webpack_require__.t.bind(null, ${comment}${idExpr}, 1)`;
-			}
-		} else {
-			if (header) {
-				getModuleFunction = `function() { ${header}return __webpack_require__.t(${moduleId}, 7); }`;
-			} else {
-				getModuleFunction = `__webpack_require__.t.bind(null, ${comment}${idExpr}, 7)`;
-			}
+		const exportsType = module.getExportsType(chunkGraph.moduleGraph, strict);
+		let fakeType = 16;
+		switch (exportsType) {
+			case "namespace":
+				if (header) {
+					const rawModule = this.moduleRaw({
+						module,
+						chunkGraph,
+						request,
+						weak,
+						runtimeRequirements
+					});
+					appending = `.then(${this.basicFunction(
+						"",
+						`${header}return ${rawModule};`
+					)})`;
+				} else {
+					runtimeRequirements.add(RuntimeGlobals.require);
+					appending = `.then(${RuntimeGlobals.require}.bind(${RuntimeGlobals.require}, ${comment}${idExpr}))`;
+				}
+				break;
+			case "dynamic":
+				fakeType |= 4;
+			/* fall through */
+			case "default-with-named":
+				fakeType |= 2;
+			/* fall through */
+			case "default-only":
+				runtimeRequirements.add(RuntimeGlobals.createFakeNamespaceObject);
+				if (chunkGraph.moduleGraph.isAsync(module)) {
+					if (header) {
+						const rawModule = this.moduleRaw({
+							module,
+							chunkGraph,
+							request,
+							weak,
+							runtimeRequirements
+						});
+						appending = `.then(${this.basicFunction(
+							"",
+							`${header}return ${rawModule};`
+						)})`;
+					} else {
+						runtimeRequirements.add(RuntimeGlobals.require);
+						appending = `.then(${RuntimeGlobals.require}.bind(${RuntimeGlobals.require}, ${comment}${idExpr}))`;
+					}
+					appending += `.then(${this.returningFunction(
+						`${RuntimeGlobals.createFakeNamespaceObject}(m, ${fakeType})`,
+						"m"
+					)})`;
+				} else {
+					fakeType |= 1;
+					if (header) {
+						const returnExpression = `${RuntimeGlobals.createFakeNamespaceObject}(${moduleIdExpr}, ${fakeType})`;
+						appending = `.then(${this.basicFunction(
+							"",
+							`${header}return ${returnExpression};`
+						)})`;
+					} else {
+						appending = `.then(${RuntimeGlobals.createFakeNamespaceObject}.bind(${RuntimeGlobals.require}, ${comment}${idExpr}, ${fakeType}))`;
+					}
+				}
+				break;
 		}
 
-		return `${promise || "Promise.resolve()"}.then(${getModuleFunction})`;
+		return `${promise || "Promise.resolve()"}${appending}`;
+	}
+
+	/**
+	 * @param {object} options options object
+	 * @param {ChunkGraph} options.chunkGraph the chunk graph
+	 * @param {RuntimeSpec=} options.runtime runtime for which this code will be generated
+	 * @param {RuntimeSpec | boolean=} options.runtimeCondition only execute the statement in some runtimes
+	 * @param {RuntimeRequirements} options.runtimeRequirements if set, will be filled with runtime requirements
+	 * @returns {string} expression
+	 */
+	runtimeConditionExpression({
+		chunkGraph,
+		runtimeCondition,
+		runtime,
+		runtimeRequirements
+	}) {
+		if (runtimeCondition === undefined) return "true";
+		if (typeof runtimeCondition === "boolean") return `${runtimeCondition}`;
+		/** @type {Set} */
+		const positiveRuntimeIds = new Set();
+		forEachRuntime(runtimeCondition, runtime =>
+			positiveRuntimeIds.add(
+				`${chunkGraph.getRuntimeId(/** @type {string} */ (runtime))}`
+			)
+		);
+		/** @type {Set} */
+		const negativeRuntimeIds = new Set();
+		forEachRuntime(subtractRuntime(runtime, runtimeCondition), runtime =>
+			negativeRuntimeIds.add(
+				`${chunkGraph.getRuntimeId(/** @type {string} */ (runtime))}`
+			)
+		);
+		runtimeRequirements.add(RuntimeGlobals.runtimeId);
+		return compileBooleanMatcher.fromLists(
+			Array.from(positiveRuntimeIds),
+			Array.from(negativeRuntimeIds)
+		)(RuntimeGlobals.runtimeId);
 	}
 
 	/**
-	 *
-	 * @param {Object} options options object
+	 * @param {object} options options object
 	 * @param {boolean=} options.update whether a new variable should be created or the existing one updated
 	 * @param {Module} options.module the module
+	 * @param {ChunkGraph} options.chunkGraph the chunk graph
 	 * @param {string} options.request the request that should be printed as comment
 	 * @param {string} options.importVar name of the import variable
 	 * @param {Module} options.originModule module in which the statement is emitted
-	 * @returns {string} the import statement
+	 * @param {boolean=} options.weak true, if this is a weak dependency
+	 * @param {RuntimeRequirements} options.runtimeRequirements if set, will be filled with runtime requirements
+	 * @returns {[string, string]} the import statement and the compat statement
 	 */
-	importStatement({ update, module, request, importVar, originModule }) {
+	importStatement({
+		update,
+		module,
+		chunkGraph,
+		request,
+		importVar,
+		originModule,
+		weak,
+		runtimeRequirements
+	}) {
 		if (!module) {
-			return this.missingModuleStatement({
-				request
-			});
+			return [
+				this.missingModuleStatement({
+					request
+				}),
+				""
+			];
+		}
+		if (chunkGraph.getModuleId(module) === null) {
+			if (weak) {
+				// only weak referenced modules don't get an id
+				// we can always emit an error emitting code here
+				return [
+					this.weakError({
+						module,
+						chunkGraph,
+						request,
+						type: "statements"
+					}),
+					""
+				];
+			}
+			throw new Error(
+				`RuntimeTemplate.importStatement(): ${noModuleIdErrorMessage(
+					module,
+					chunkGraph
+				)}`
+			);
 		}
 		const moduleId = this.moduleId({
 			module,
-			request
+			chunkGraph,
+			request,
+			weak
 		});
 		const optDeclaration = update ? "" : "var ";
 
-		const exportsType = module.buildMeta && module.buildMeta.exportsType;
-		let content = `/* harmony import */ ${optDeclaration}${importVar} = __webpack_require__(${moduleId});\n`;
+		const exportsType = module.getExportsType(
+			chunkGraph.moduleGraph,
+			/** @type {BuildMeta} */
+			(originModule.buildMeta).strictHarmonyModule
+		);
+		runtimeRequirements.add(RuntimeGlobals.require);
+		const importContent = `/* harmony import */ ${optDeclaration}${importVar} = ${RuntimeGlobals.require}(${moduleId});\n`;
 
-		if (!exportsType && !originModule.buildMeta.strictHarmonyModule) {
-			content += `/* harmony import */ ${optDeclaration}${importVar}_default = /*#__PURE__*/__webpack_require__.n(${importVar});\n`;
-		}
-		if (exportsType === "named") {
-			if (Array.isArray(module.buildMeta.providedExports)) {
-				content += `${optDeclaration}${importVar}_namespace = /*#__PURE__*/__webpack_require__.t(${moduleId}, 1);\n`;
-			} else {
-				content += `${optDeclaration}${importVar}_namespace = /*#__PURE__*/__webpack_require__.t(${moduleId});\n`;
-			}
+		if (exportsType === "dynamic") {
+			runtimeRequirements.add(RuntimeGlobals.compatGetDefaultExport);
+			return [
+				importContent,
+				`/* harmony import */ ${optDeclaration}${importVar}_default = /*#__PURE__*/${RuntimeGlobals.compatGetDefaultExport}(${importVar});\n`
+			];
 		}
-		return content;
+		return [importContent, ""];
 	}
 
+	/**
+	 * @template GenerateContext
+	 * @param {object} options options
+	 * @param {ModuleGraph} options.moduleGraph the module graph
+	 * @param {Module} options.module the module
+	 * @param {string} options.request the request
+	 * @param {string | string[]} options.exportName the export name
+	 * @param {Module} options.originModule the origin module
+	 * @param {boolean|undefined} options.asiSafe true, if location is safe for ASI, a bracket can be emitted
+	 * @param {boolean} options.isCall true, if expression will be called
+	 * @param {boolean | null} options.callContext when false, call context will not be preserved
+	 * @param {boolean} options.defaultInterop when true and accessing the default exports, interop code will be generated
+	 * @param {string} options.importVar the identifier name of the import variable
+	 * @param {InitFragment[]} options.initFragments init fragments will be added here
+	 * @param {RuntimeSpec} options.runtime runtime for which this code will be generated
+	 * @param {RuntimeRequirements} options.runtimeRequirements if set, will be filled with runtime requirements
+	 * @returns {string} expression
+	 */
 	exportFromImport({
+		moduleGraph,
 		module,
 		request,
 		exportName,
@@ -236,101 +879,232 @@ module.exports = class RuntimeTemplate {
 		asiSafe,
 		isCall,
 		callContext,
-		importVar
+		defaultInterop,
+		importVar,
+		initFragments,
+		runtime,
+		runtimeRequirements
 	}) {
 		if (!module) {
 			return this.missingModule({
 				request
 			});
 		}
-		const exportsType = module.buildMeta && module.buildMeta.exportsType;
-
-		if (!exportsType) {
-			if (exportName === "default") {
-				if (!originModule.buildMeta.strictHarmonyModule) {
-					if (isCall) {
-						return `${importVar}_default()`;
-					} else if (asiSafe) {
-						return `(${importVar}_default())`;
-					} else {
-						return `${importVar}_default.a`;
-					}
-				} else {
-					return importVar;
-				}
-			} else if (originModule.buildMeta.strictHarmonyModule) {
-				if (exportName) {
-					return "/* non-default import from non-esm module */undefined";
-				} else {
-					return `/*#__PURE__*/__webpack_require__.t(${importVar})`;
-				}
-			}
+		if (!Array.isArray(exportName)) {
+			exportName = exportName ? [exportName] : [];
 		}
+		const exportsType = module.getExportsType(
+			moduleGraph,
+			/** @type {BuildMeta} */
+			(originModule.buildMeta).strictHarmonyModule
+		);
 
-		if (exportsType === "named") {
-			if (exportName === "default") {
-				return importVar;
-			} else if (!exportName) {
-				return `${importVar}_namespace`;
+		if (defaultInterop) {
+			if (exportName.length > 0 && exportName[0] === "default") {
+				switch (exportsType) {
+					case "dynamic":
+						if (isCall) {
+							return `${importVar}_default()${propertyAccess(exportName, 1)}`;
+						}
+						return asiSafe
+							? `(${importVar}_default()${propertyAccess(exportName, 1)})`
+							: asiSafe === false
+								? `;(${importVar}_default()${propertyAccess(exportName, 1)})`
+								: `${importVar}_default.a${propertyAccess(exportName, 1)}`;
+
+					case "default-only":
+					case "default-with-named":
+						exportName = exportName.slice(1);
+						break;
+				}
+			} else if (exportName.length > 0) {
+				if (exportsType === "default-only") {
+					return `/* non-default import from non-esm module */undefined${propertyAccess(
+						exportName,
+						1
+					)}`;
+				} else if (
+					exportsType !== "namespace" &&
+					exportName[0] === "__esModule"
+				) {
+					return "/* __esModule */true";
+				}
+			} else if (
+				exportsType === "default-only" ||
+				exportsType === "default-with-named"
+			) {
+				runtimeRequirements.add(RuntimeGlobals.createFakeNamespaceObject);
+				initFragments.push(
+					new InitFragment(
+						`var ${importVar}_namespace_cache;\n`,
+						InitFragment.STAGE_CONSTANTS,
+						-1,
+						`${importVar}_namespace_cache`
+					)
+				);
+				return `/*#__PURE__*/ ${
+					asiSafe ? "" : asiSafe === false ? ";" : "Object"
+				}(${importVar}_namespace_cache || (${importVar}_namespace_cache = ${
+					RuntimeGlobals.createFakeNamespaceObject
+				}(${importVar}${exportsType === "default-only" ? "" : ", 2"})))`;
 			}
 		}
 
-		if (exportName) {
-			const used = module.isUsed(exportName);
+		if (exportName.length > 0) {
+			const exportsInfo = moduleGraph.getExportsInfo(module);
+			const used = exportsInfo.getUsedName(exportName, runtime);
 			if (!used) {
-				const comment = Template.toNormalComment(`unused export ${exportName}`);
+				const comment = Template.toNormalComment(
+					`unused export ${propertyAccess(exportName)}`
+				);
 				return `${comment} undefined`;
 			}
-			const comment =
-				used !== exportName ? Template.toNormalComment(exportName) + " " : "";
-			const access = `${importVar}[${comment}${JSON.stringify(used)}]`;
-			if (isCall) {
-				if (callContext === false && asiSafe) {
-					return `(0,${access})`;
-				} else if (callContext === false) {
-					return `Object(${access})`;
-				}
+			const comment = equals(used, exportName)
+				? ""
+				: `${Template.toNormalComment(propertyAccess(exportName))} `;
+			const access = `${importVar}${comment}${propertyAccess(used)}`;
+			if (isCall && callContext === false) {
+				return asiSafe
+					? `(0,${access})`
+					: asiSafe === false
+						? `;(0,${access})`
+						: `/*#__PURE__*/Object(${access})`;
 			}
 			return access;
-		} else {
-			return importVar;
 		}
+		return importVar;
 	}
 
-	blockPromise({ block, message }) {
-		if (!block || !block.chunkGroup || block.chunkGroup.chunks.length === 0) {
+	/**
+	 * @param {object} options options
+	 * @param {AsyncDependenciesBlock | undefined} options.block the async block
+	 * @param {string} options.message the message
+	 * @param {ChunkGraph} options.chunkGraph the chunk graph
+	 * @param {RuntimeRequirements} options.runtimeRequirements if set, will be filled with runtime requirements
+	 * @returns {string} expression
+	 */
+	blockPromise({ block, message, chunkGraph, runtimeRequirements }) {
+		if (!block) {
+			const comment = this.comment({
+				message
+			});
+			return `Promise.resolve(${comment.trim()})`;
+		}
+		const chunkGroup = chunkGraph.getBlockChunkGroup(block);
+		if (!chunkGroup || chunkGroup.chunks.length === 0) {
 			const comment = this.comment({
 				message
 			});
 			return `Promise.resolve(${comment.trim()})`;
 		}
-		const chunks = block.chunkGroup.chunks.filter(
+		const chunks = chunkGroup.chunks.filter(
 			chunk => !chunk.hasRuntime() && chunk.id !== null
 		);
 		const comment = this.comment({
 			message,
-			chunkName: block.chunkName,
-			chunkReason: block.chunkReason
+			chunkName: block.chunkName
 		});
 		if (chunks.length === 1) {
 			const chunkId = JSON.stringify(chunks[0].id);
-			return `__webpack_require__.e(${comment}${chunkId})`;
+			runtimeRequirements.add(RuntimeGlobals.ensureChunk);
+
+			const fetchPriority = chunkGroup.options.fetchPriority;
+
+			if (fetchPriority) {
+				runtimeRequirements.add(RuntimeGlobals.hasFetchPriority);
+			}
+
+			return `${RuntimeGlobals.ensureChunk}(${comment}${chunkId}${
+				fetchPriority ? `, ${JSON.stringify(fetchPriority)}` : ""
+			})`;
 		} else if (chunks.length > 0) {
+			runtimeRequirements.add(RuntimeGlobals.ensureChunk);
+
+			const fetchPriority = chunkGroup.options.fetchPriority;
+
+			if (fetchPriority) {
+				runtimeRequirements.add(RuntimeGlobals.hasFetchPriority);
+			}
+
+			/**
+			 * @param {Chunk} chunk chunk
+			 * @returns {string} require chunk id code
+			 */
 			const requireChunkId = chunk =>
-				`__webpack_require__.e(${JSON.stringify(chunk.id)})`;
+				`${RuntimeGlobals.ensureChunk}(${JSON.stringify(chunk.id)}${
+					fetchPriority ? `, ${JSON.stringify(fetchPriority)}` : ""
+				})`;
 			return `Promise.all(${comment.trim()}[${chunks
 				.map(requireChunkId)
 				.join(", ")}])`;
-		} else {
-			return `Promise.resolve(${comment.trim()})`;
 		}
+		return `Promise.resolve(${comment.trim()})`;
+	}
+
+	/**
+	 * @param {object} options options
+	 * @param {AsyncDependenciesBlock} options.block the async block
+	 * @param {ChunkGraph} options.chunkGraph the chunk graph
+	 * @param {RuntimeRequirements} options.runtimeRequirements if set, will be filled with runtime requirements
+	 * @param {string=} options.request request string used originally
+	 * @returns {string} expression
+	 */
+	asyncModuleFactory({ block, chunkGraph, runtimeRequirements, request }) {
+		const dep = block.dependencies[0];
+		const module = chunkGraph.moduleGraph.getModule(dep);
+		const ensureChunk = this.blockPromise({
+			block,
+			message: "",
+			chunkGraph,
+			runtimeRequirements
+		});
+		const factory = this.returningFunction(
+			this.moduleRaw({
+				module,
+				chunkGraph,
+				request,
+				runtimeRequirements
+			})
+		);
+		return this.returningFunction(
+			ensureChunk.startsWith("Promise.resolve(")
+				? `${factory}`
+				: `${ensureChunk}.then(${this.returningFunction(factory)})`
+		);
 	}
 
-	onError() {
-		return "__webpack_require__.oe";
+	/**
+	 * @param {object} options options
+	 * @param {Dependency} options.dependency the dependency
+	 * @param {ChunkGraph} options.chunkGraph the chunk graph
+	 * @param {RuntimeRequirements} options.runtimeRequirements if set, will be filled with runtime requirements
+	 * @param {string=} options.request request string used originally
+	 * @returns {string} expression
+	 */
+	syncModuleFactory({ dependency, chunkGraph, runtimeRequirements, request }) {
+		const module = chunkGraph.moduleGraph.getModule(dependency);
+		const factory = this.returningFunction(
+			this.moduleRaw({
+				module,
+				chunkGraph,
+				request,
+				runtimeRequirements
+			})
+		);
+		return this.returningFunction(factory);
 	}
 
-	defineEsModuleFlagStatement({ exportsArgument }) {
-		return `__webpack_require__.r(${exportsArgument});\n`;
+	/**
+	 * @param {object} options options
+	 * @param {string} options.exportsArgument the name of the exports object
+	 * @param {RuntimeRequirements} options.runtimeRequirements if set, will be filled with runtime requirements
+	 * @returns {string} statement
+	 */
+	defineEsModuleFlagStatement({ exportsArgument, runtimeRequirements }) {
+		runtimeRequirements.add(RuntimeGlobals.makeNamespaceObject);
+		runtimeRequirements.add(RuntimeGlobals.exports);
+		return `${RuntimeGlobals.makeNamespaceObject}(${exportsArgument});\n`;
 	}
-};
+}
+
+module.exports = RuntimeTemplate;
diff --git a/lib/SelfModuleFactory.js b/lib/SelfModuleFactory.js
new file mode 100644
index 00000000000..97562b280c9
--- /dev/null
+++ b/lib/SelfModuleFactory.js
@@ -0,0 +1,33 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+/** @typedef {import("./ModuleFactory").ModuleFactoryCallback} ModuleFactoryCallback */
+/** @typedef {import("./ModuleFactory").ModuleFactoryCreateData} ModuleFactoryCreateData */
+/** @typedef {import("./ModuleGraph")} ModuleGraph */
+
+class SelfModuleFactory {
+	/**
+	 * @param {ModuleGraph} moduleGraph module graph
+	 */
+	constructor(moduleGraph) {
+		this.moduleGraph = moduleGraph;
+	}
+
+	/**
+	 * @param {ModuleFactoryCreateData} data data object
+	 * @param {ModuleFactoryCallback} callback callback
+	 * @returns {void}
+	 */
+	create(data, callback) {
+		const module = this.moduleGraph.getParentModule(data.dependencies[0]);
+		callback(null, {
+			module
+		});
+	}
+}
+
+module.exports = SelfModuleFactory;
diff --git a/lib/SetVarMainTemplatePlugin.js b/lib/SetVarMainTemplatePlugin.js
deleted file mode 100644
index 63db2821a54..00000000000
--- a/lib/SetVarMainTemplatePlugin.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const { ConcatSource } = require("webpack-sources");
-
-/** @typedef {import("./Compilation")} Compilation */
-
-class SetVarMainTemplatePlugin {
-	/**
-	 * @param {string} varExpression the accessor where the library is exported
-	 * @param {boolean} copyObject specify copying the exports
-	 */
-	constructor(varExpression, copyObject) {
-		/** @type {string} */
-		this.varExpression = varExpression;
-		/** @type {boolean} */
-		this.copyObject = copyObject;
-	}
-
-	/**
-	 * @param {Compilation} compilation the compilation instance
-	 * @returns {void}
-	 */
-	apply(compilation) {
-		const { mainTemplate, chunkTemplate } = compilation;
-
-		const onRenderWithEntry = (source, chunk, hash) => {
-			const varExpression = mainTemplate.getAssetPath(this.varExpression, {
-				hash,
-				chunk
-			});
-			if (this.copyObject) {
-				return new ConcatSource(
-					`(function(e, a) { for(var i in a) e[i] = a[i]; }(${varExpression}, `,
-					source,
-					"))"
-				);
-			} else {
-				const prefix = `${varExpression} =\n`;
-				return new ConcatSource(prefix, source);
-			}
-		};
-
-		for (const template of [mainTemplate, chunkTemplate]) {
-			template.hooks.renderWithEntry.tap(
-				"SetVarMainTemplatePlugin",
-				onRenderWithEntry
-			);
-		}
-
-		mainTemplate.hooks.globalHashPaths.tap(
-			"SetVarMainTemplatePlugin",
-			paths => {
-				if (this.varExpression) paths.push(this.varExpression);
-				return paths;
-			}
-		);
-		mainTemplate.hooks.hash.tap("SetVarMainTemplatePlugin", hash => {
-			hash.update("set var");
-			hash.update(`${this.varExpression}`);
-			hash.update(`${this.copyObject}`);
-		});
-	}
-}
-
-module.exports = SetVarMainTemplatePlugin;
diff --git a/lib/SingleEntryPlugin.js b/lib/SingleEntryPlugin.js
index 4a1703b1f85..65791735c79 100644
--- a/lib/SingleEntryPlugin.js
+++ b/lib/SingleEntryPlugin.js
@@ -1,63 +1,8 @@
 /*
 	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
+	Author Sean Larkin @thelarkinn
 */
-"use strict";
-const SingleEntryDependency = require("./dependencies/SingleEntryDependency");
-
-/** @typedef {import("./Compiler")} Compiler */
-
-class SingleEntryPlugin {
-	/**
-	 * An entry plugin which will handle
-	 * creation of the SingleEntryDependency
-	 *
-	 * @param {string} context context path
-	 * @param {string} entry entry path
-	 * @param {string} name entry key name
-	 */
-	constructor(context, entry, name) {
-		this.context = context;
-		this.entry = entry;
-		this.name = name;
-	}
-
-	/**
-	 * @param {Compiler} compiler the compiler instance
-	 * @returns {void}
-	 */
-	apply(compiler) {
-		compiler.hooks.compilation.tap(
-			"SingleEntryPlugin",
-			(compilation, { normalModuleFactory }) => {
-				compilation.dependencyFactories.set(
-					SingleEntryDependency,
-					normalModuleFactory
-				);
-			}
-		);
 
-		compiler.hooks.make.tapAsync(
-			"SingleEntryPlugin",
-			(compilation, callback) => {
-				const { entry, name, context } = this;
-
-				const dep = SingleEntryPlugin.createDependency(entry, name);
-				compilation.addEntry(context, dep, name, callback);
-			}
-		);
-	}
-
-	/**
-	 * @param {string} entry entry request
-	 * @param {string} name entry name
-	 * @returns {SingleEntryDependency} the dependency
-	 */
-	static createDependency(entry, name) {
-		const dep = new SingleEntryDependency(entry);
-		dep.loc = { name };
-		return dep;
-	}
-}
+"use strict";
 
-module.exports = SingleEntryPlugin;
+module.exports = require("./EntryPlugin");
diff --git a/lib/SizeFormatHelpers.js b/lib/SizeFormatHelpers.js
index c4677f60bf8..4c6a748f0eb 100644
--- a/lib/SizeFormatHelpers.js
+++ b/lib/SizeFormatHelpers.js
@@ -2,11 +2,14 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Sean Larkin @thelarkinn
 */
-"use strict";
 
-const SizeFormatHelpers = exports;
+"use strict";
 
-SizeFormatHelpers.formatSize = size => {
+/**
+ * @param {number} size the size in bytes
+ * @returns {string} the formatted size
+ */
+module.exports.formatSize = size => {
 	if (typeof size !== "number" || Number.isNaN(size) === true) {
 		return "unknown size";
 	}
@@ -18,7 +21,5 @@ SizeFormatHelpers.formatSize = size => {
 	const abbreviations = ["bytes", "KiB", "MiB", "GiB"];
 	const index = Math.floor(Math.log(size) / Math.log(1024));
 
-	return `${+(size / Math.pow(1024, index)).toPrecision(3)} ${
-		abbreviations[index]
-	}`;
+	return `${Number((size / 1024 ** index).toPrecision(3))} ${abbreviations[index]}`;
 };
diff --git a/lib/SourceMapDevToolModuleOptionsPlugin.js b/lib/SourceMapDevToolModuleOptionsPlugin.js
index e593ced7b3d..e7d722e12a8 100644
--- a/lib/SourceMapDevToolModuleOptionsPlugin.js
+++ b/lib/SourceMapDevToolModuleOptionsPlugin.js
@@ -2,15 +2,26 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const ModuleFilenameHelpers = require("./ModuleFilenameHelpers");
+const JavascriptModulesPlugin = require("./javascript/JavascriptModulesPlugin");
+
+/** @typedef {import("../declarations/plugins/SourceMapDevToolPlugin").SourceMapDevToolPluginOptions} SourceMapDevToolPluginOptions */
+/** @typedef {import("./Compilation")} Compilation */
 
 class SourceMapDevToolModuleOptionsPlugin {
+	/**
+	 * @param {SourceMapDevToolPluginOptions} options options
+	 */
 	constructor(options) {
 		this.options = options;
 	}
 
+	/**
+	 * @param {Compilation} compilation the compiler instance
+	 * @returns {void}
+	 */
 	apply(compilation) {
 		const options = this.options;
 		if (options.module !== false) {
@@ -20,29 +31,30 @@ class SourceMapDevToolModuleOptionsPlugin {
 					module.useSourceMap = true;
 				}
 			);
-		}
-		if (options.lineToLine === true) {
-			compilation.hooks.buildModule.tap(
+			compilation.hooks.runtimeModule.tap(
 				"SourceMapDevToolModuleOptionsPlugin",
 				module => {
-					module.lineToLine = true;
+					module.useSourceMap = true;
 				}
 			);
-		} else if (options.lineToLine) {
+		} else {
 			compilation.hooks.buildModule.tap(
 				"SourceMapDevToolModuleOptionsPlugin",
 				module => {
-					if (!module.resource) return;
-					let resourcePath = module.resource;
-					const idx = resourcePath.indexOf("?");
-					if (idx >= 0) resourcePath = resourcePath.substr(0, idx);
-					module.lineToLine = ModuleFilenameHelpers.matchObject(
-						options.lineToLine,
-						resourcePath
-					);
+					module.useSimpleSourceMap = true;
+				}
+			);
+			compilation.hooks.runtimeModule.tap(
+				"SourceMapDevToolModuleOptionsPlugin",
+				module => {
+					module.useSimpleSourceMap = true;
 				}
 			);
 		}
+		JavascriptModulesPlugin.getCompilationHooks(compilation).useSourceMap.tap(
+			"SourceMapDevToolModuleOptionsPlugin",
+			() => true
+		);
 	}
 }
 
diff --git a/lib/SourceMapDevToolPlugin.js b/lib/SourceMapDevToolPlugin.js
index 3c56d52108d..7cbba17992f 100644
--- a/lib/SourceMapDevToolPlugin.js
+++ b/lib/SourceMapDevToolPlugin.js
@@ -2,78 +2,151 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const path = require("path");
+const asyncLib = require("neo-async");
 const { ConcatSource, RawSource } = require("webpack-sources");
+const Compilation = require("./Compilation");
 const ModuleFilenameHelpers = require("./ModuleFilenameHelpers");
+const ProgressPlugin = require("./ProgressPlugin");
 const SourceMapDevToolModuleOptionsPlugin = require("./SourceMapDevToolModuleOptionsPlugin");
+const createSchemaValidation = require("./util/create-schema-validation");
 const createHash = require("./util/createHash");
+const { relative, dirname } = require("./util/fs");
+const generateDebugId = require("./util/generateDebugId");
+const { makePathsAbsolute } = require("./util/identifier");
 
-const validateOptions = require("schema-utils");
-const schema = require("../schemas/plugins/SourceMapDevToolPlugin.json");
-
+/** @typedef {import("webpack-sources").MapOptions} MapOptions */
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../declarations/WebpackOptions").HashFunction} HashFunction */
 /** @typedef {import("../declarations/plugins/SourceMapDevToolPlugin").SourceMapDevToolPluginOptions} SourceMapDevToolPluginOptions */
+/** @typedef {import("./Cache").Etag} Etag */
+/** @typedef {import("./CacheFacade").ItemCacheFacade} ItemCacheFacade */
+/** @typedef {import("./Chunk")} Chunk */
+/** @typedef {import("./Compilation").Asset} Asset */
+/** @typedef {import("./Compilation").AssetInfo} AssetInfo */
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./NormalModule").SourceMap} SourceMap */
+/** @typedef {import("./TemplatedPathPlugin").TemplatePath} TemplatePath */
+/** @typedef {import("./util/fs").OutputFileSystem} OutputFileSystem */
+
+const validate = createSchemaValidation(
+	require("../schemas/plugins/SourceMapDevToolPlugin.check.js"),
+	() => require("../schemas/plugins/SourceMapDevToolPlugin.json"),
+	{
+		name: "SourceMap DevTool Plugin",
+		baseDataPath: "options"
+	}
+);
+/**
+ * @typedef {object} SourceMapTask
+ * @property {Source} asset
+ * @property {AssetInfo} assetInfo
+ * @property {(string | Module)[]} modules
+ * @property {string} source
+ * @property {string} file
+ * @property {SourceMap} sourceMap
+ * @property {ItemCacheFacade} cacheItem cache item
+ */
+
+const METACHARACTERS_REGEXP = /[-[\]\\/{}()*+?.^$|]/g;
+const CONTENT_HASH_DETECT_REGEXP = /\[contenthash(:\w+)?\]/;
+const CSS_AND_JS_MODULE_EXTENSIONS_REGEXP = /\.((c|m)?js|css)($|\?)/i;
+const CSS_EXTENSION_DETECT_REGEXP = /\.css($|\?)/i;
+const MAP_URL_COMMENT_REGEXP = /\[map\]/g;
+const URL_COMMENT_REGEXP = /\[url\]/g;
+const URL_FORMATTING_REGEXP = /^\n\/\/(.*)$/;
 
-const basename = name => {
-	if (!name.includes("/")) return name;
-	return name.substr(name.lastIndexOf("/") + 1);
+/**
+ * Reset's .lastIndex of stateful Regular Expressions
+ * For when `test` or `exec` is called on them
+ * @param {RegExp} regexp Stateful Regular Expression to be reset
+ * @returns {void}
+ */
+const resetRegexpState = regexp => {
+	regexp.lastIndex = -1;
 };
 
-const assetsCache = new WeakMap();
-
-const getTaskForFile = (file, chunk, options, compilation) => {
-	const asset = compilation.assets[file];
-	const cache = assetsCache.get(asset);
-	if (cache && cache.file === file) {
-		for (const cachedFile in cache.assets) {
-			compilation.assets[cachedFile] = cache.assets[cachedFile];
-			if (cachedFile !== file) chunk.files.push(cachedFile);
-		}
-		return;
-	}
-	let source, sourceMap;
+/**
+ * Escapes regular expression metacharacters
+ * @param {string} str String to quote
+ * @returns {string} Escaped string
+ */
+const quoteMeta = str => str.replace(METACHARACTERS_REGEXP, "\\$&");
+
+/**
+ * Creating {@link SourceMapTask} for given file
+ * @param {string} file current compiled file
+ * @param {Source} asset the asset
+ * @param {AssetInfo} assetInfo the asset info
+ * @param {MapOptions} options source map options
+ * @param {Compilation} compilation compilation instance
+ * @param {ItemCacheFacade} cacheItem cache item
+ * @returns {SourceMapTask | undefined} created task instance or `undefined`
+ */
+const getTaskForFile = (
+	file,
+	asset,
+	assetInfo,
+	options,
+	compilation,
+	cacheItem
+) => {
+	let source;
+	/** @type {SourceMap} */
+	let sourceMap;
+	/**
+	 * Check if asset can build source map
+	 */
 	if (asset.sourceAndMap) {
 		const sourceAndMap = asset.sourceAndMap(options);
-		sourceMap = sourceAndMap.map;
+		sourceMap = /** @type {SourceMap} */ (sourceAndMap.map);
 		source = sourceAndMap.source;
 	} else {
-		sourceMap = asset.map(options);
+		sourceMap = /** @type {SourceMap} */ (asset.map(options));
 		source = asset.source();
 	}
-	if (sourceMap) {
-		return {
-			chunk,
-			file,
-			asset,
-			source,
-			sourceMap,
-			modules: undefined
-		};
-	}
+	if (!sourceMap || typeof source !== "string") return;
+	const context = /** @type {string} */ (compilation.options.context);
+	const root = compilation.compiler.root;
+	const cachedAbsolutify = makePathsAbsolute.bindContextCache(context, root);
+	const modules = sourceMap.sources.map(source => {
+		if (!source.startsWith("webpack://")) return source;
+		source = cachedAbsolutify(source.slice(10));
+		const module = compilation.findModule(source);
+		return module || source;
+	});
+
+	return {
+		file,
+		asset,
+		source,
+		assetInfo,
+		sourceMap,
+		modules,
+		cacheItem
+	};
 };
 
+const PLUGIN_NAME = "SourceMapDevToolPlugin";
+
 class SourceMapDevToolPlugin {
 	/**
 	 * @param {SourceMapDevToolPluginOptions=} options options object
+	 * @throws {Error} throws error, if got more than 1 arguments
 	 */
-	constructor(options) {
-		if (arguments.length > 1) {
-			throw new Error(
-				"SourceMapDevToolPlugin only takes one argument (pass an options object)"
-			);
-		}
-
-		if (!options) options = {};
+	constructor(options = {}) {
+		validate(options);
 
-		validateOptions(schema, options, "SourceMap DevTool Plugin");
-
-		this.sourceMapFilename = options.filename;
-		/** @type {string | false} */
+		this.sourceMapFilename = /** @type {string | false} */ (options.filename);
+		/** @type {false | TemplatePath}} */
 		this.sourceMappingURLComment =
 			options.append === false
 				? false
-				: options.append || "\n//# sourceMappingURL=[url]";
+				: // eslint-disable-next-line no-useless-concat
+					options.append || "\n//# source" + "MappingURL=[url]";
 		this.moduleFilenameTemplate =
 			options.moduleFilenameTemplate || "webpack://[namespace]/[resourcePath]";
 		this.fallbackModuleFilenameTemplate =
@@ -83,7 +156,15 @@ class SourceMapDevToolPlugin {
 		this.options = options;
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
+		const outputFs = /** @type {OutputFileSystem} */ (
+			compiler.outputFileSystem
+		);
 		const sourceMapFilename = this.sourceMapFilename;
 		const sourceMappingURLComment = this.sourceMappingURLComment;
 		const moduleFilenameTemplate = this.moduleFilenameTemplate;
@@ -91,220 +172,436 @@ class SourceMapDevToolPlugin {
 		const fallbackModuleFilenameTemplate = this.fallbackModuleFilenameTemplate;
 		const requestShortener = compiler.requestShortener;
 		const options = this.options;
-		options.test = options.test || /\.(m?js|css)($|\?)/i;
+		options.test = options.test || CSS_AND_JS_MODULE_EXTENSIONS_REGEXP;
 
 		const matchObject = ModuleFilenameHelpers.matchObject.bind(
 			undefined,
 			options
 		);
 
-		compiler.hooks.compilation.tap("SourceMapDevToolPlugin", compilation => {
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
 			new SourceMapDevToolModuleOptionsPlugin(options).apply(compilation);
 
-			compilation.hooks.afterOptimizeChunkAssets.tap(
+			compilation.hooks.processAssets.tapAsync(
 				{
-					name: "SourceMapDevToolPlugin",
-					context: true
+					name: PLUGIN_NAME,
+					stage: Compilation.PROCESS_ASSETS_STAGE_DEV_TOOLING,
+					additionalAssets: true
 				},
-				(context, chunks) => {
+				(assets, callback) => {
+					const chunkGraph = compilation.chunkGraph;
+					const cache = compilation.getCache(PLUGIN_NAME);
+					/** @type {Map} */
 					const moduleToSourceNameMapping = new Map();
 					const reportProgress =
-						context && context.reportProgress
-							? context.reportProgress
-							: () => {};
+						ProgressPlugin.getReporter(compilation.compiler) || (() => {});
 
-					const files = [];
-					for (const chunk of chunks) {
+					/** @type {Map} */
+					const fileToChunk = new Map();
+					for (const chunk of compilation.chunks) {
 						for (const file of chunk.files) {
-							if (matchObject(file)) {
-								files.push({
-									file,
-									chunk
-								});
-							}
+							fileToChunk.set(file, chunk);
+						}
+						for (const file of chunk.auxiliaryFiles) {
+							fileToChunk.set(file, chunk);
+						}
+					}
+
+					/** @type {string[]} */
+					const files = [];
+					for (const file of Object.keys(assets)) {
+						if (matchObject(file)) {
+							files.push(file);
 						}
 					}
 
-					reportProgress(0.0);
+					reportProgress(0);
+					/** @type {SourceMapTask[]} */
 					const tasks = [];
-					files.forEach(({ file, chunk }, idx) => {
-						reportProgress(
-							(0.5 * idx) / files.length,
-							file,
-							"generate SourceMap"
-						);
-						const task = getTaskForFile(file, chunk, options, compilation);
-
-						if (task) {
-							const modules = task.sourceMap.sources.map(source => {
-								const module = compilation.findModule(source);
-								return module || source;
+					let fileIndex = 0;
+
+					asyncLib.each(
+						files,
+						(file, callback) => {
+							const asset =
+								/** @type {Readonly} */
+								(compilation.getAsset(file));
+							if (asset.info.related && asset.info.related.sourceMap) {
+								fileIndex++;
+								return callback();
+							}
+
+							const chunk = fileToChunk.get(file);
+							const sourceMapNamespace = compilation.getPath(this.namespace, {
+								chunk
 							});
 
-							for (let idx = 0; idx < modules.length; idx++) {
-								const module = modules[idx];
-								if (!moduleToSourceNameMapping.get(module)) {
-									moduleToSourceNameMapping.set(
-										module,
-										ModuleFilenameHelpers.createFilename(
-											module,
-											{
-												moduleFilenameTemplate: moduleFilenameTemplate,
-												namespace: namespace
-											},
-											requestShortener
-										)
+							const cacheItem = cache.getItemCache(
+								file,
+								cache.mergeEtags(
+									cache.getLazyHashedEtag(asset.source),
+									sourceMapNamespace
+								)
+							);
+
+							cacheItem.get((err, cacheEntry) => {
+								if (err) {
+									return callback(err);
+								}
+								/**
+								 * If presented in cache, reassigns assets. Cache assets already have source maps.
+								 */
+								if (cacheEntry) {
+									const { assets, assetsInfo } = cacheEntry;
+									for (const cachedFile of Object.keys(assets)) {
+										if (cachedFile === file) {
+											compilation.updateAsset(
+												cachedFile,
+												assets[cachedFile],
+												assetsInfo[cachedFile]
+											);
+										} else {
+											compilation.emitAsset(
+												cachedFile,
+												assets[cachedFile],
+												assetsInfo[cachedFile]
+											);
+										}
+										/**
+										 * Add file to chunk, if not presented there
+										 */
+										if (cachedFile !== file && chunk !== undefined)
+											chunk.auxiliaryFiles.add(cachedFile);
+									}
+
+									reportProgress(
+										(0.5 * ++fileIndex) / files.length,
+										file,
+										"restored cached SourceMap"
 									);
+
+									return callback();
 								}
-							}
 
-							task.modules = modules;
+								reportProgress(
+									(0.5 * fileIndex) / files.length,
+									file,
+									"generate SourceMap"
+								);
 
-							tasks.push(task);
-						}
-					});
-
-					reportProgress(0.5, "resolve sources");
-					const usedNamesSet = new Set(moduleToSourceNameMapping.values());
-					const conflictDetectionSet = new Set();
-
-					// all modules in defined order (longest identifier first)
-					const allModules = Array.from(moduleToSourceNameMapping.keys()).sort(
-						(a, b) => {
-							const ai = typeof a === "string" ? a : a.identifier();
-							const bi = typeof b === "string" ? b : b.identifier();
-							return ai.length - bi.length;
-						}
-					);
+								/** @type {SourceMapTask | undefined} */
+								const task = getTaskForFile(
+									file,
+									asset.source,
+									asset.info,
+									{
+										module: options.module,
+										columns: options.columns
+									},
+									compilation,
+									cacheItem
+								);
 
-					// find modules with conflicting source names
-					for (let idx = 0; idx < allModules.length; idx++) {
-						const module = allModules[idx];
-						let sourceName = moduleToSourceNameMapping.get(module);
-						let hasName = conflictDetectionSet.has(sourceName);
-						if (!hasName) {
-							conflictDetectionSet.add(sourceName);
-							continue;
-						}
+								if (task) {
+									const modules = task.modules;
 
-						// try the fallback name first
-						sourceName = ModuleFilenameHelpers.createFilename(
-							module,
-							{
-								moduleFilenameTemplate: fallbackModuleFilenameTemplate,
-								namespace: namespace
-							},
-							requestShortener
-						);
-						hasName = usedNamesSet.has(sourceName);
-						if (!hasName) {
-							moduleToSourceNameMapping.set(module, sourceName);
-							usedNamesSet.add(sourceName);
-							continue;
-						}
+									for (let idx = 0; idx < modules.length; idx++) {
+										const module = modules[idx];
 
-						// elsewise just append stars until we have a valid name
-						while (hasName) {
-							sourceName += "*";
-							hasName = usedNamesSet.has(sourceName);
-						}
-						moduleToSourceNameMapping.set(module, sourceName);
-						usedNamesSet.add(sourceName);
-					}
-					tasks.forEach((task, index) => {
-						reportProgress(
-							0.5 + (0.5 * index) / tasks.length,
-							task.file,
-							"attach SourceMap"
-						);
-						const assets = Object.create(null);
-						const chunk = task.chunk;
-						const file = task.file;
-						const asset = task.asset;
-						const sourceMap = task.sourceMap;
-						const source = task.source;
-						const modules = task.modules;
-						const moduleFilenames = modules.map(m =>
-							moduleToSourceNameMapping.get(m)
-						);
-						sourceMap.sources = moduleFilenames;
-						if (options.noSources) {
-							sourceMap.sourcesContent = undefined;
-						}
-						sourceMap.sourceRoot = options.sourceRoot || "";
-						sourceMap.file = file;
-						assetsCache.set(asset, { file, assets });
-						/** @type {string | false} */
-						let currentSourceMappingURLComment = sourceMappingURLComment;
-						if (
-							currentSourceMappingURLComment !== false &&
-							/\.css($|\?)/i.test(file)
-						) {
-							currentSourceMappingURLComment = currentSourceMappingURLComment.replace(
-								/^\n\/\/(.*)$/,
-								"\n/*$1*/"
-							);
-						}
-						const sourceMapString = JSON.stringify(sourceMap);
-						if (sourceMapFilename) {
-							let filename = file;
-							let query = "";
-							const idx = filename.indexOf("?");
-							if (idx >= 0) {
-								query = filename.substr(idx);
-								filename = filename.substr(0, idx);
-							}
-							let sourceMapFile = compilation.getPath(sourceMapFilename, {
-								chunk,
-								filename: options.fileContext
-									? path.relative(options.fileContext, filename)
-									: filename,
-								query,
-								basename: basename(filename),
-								contentHash: createHash("md4")
-									.update(sourceMapString)
-									.digest("hex")
-							});
-							const sourceMapUrl = options.publicPath
-								? options.publicPath + sourceMapFile.replace(/\\/g, "/")
-								: path
-										.relative(path.dirname(file), sourceMapFile)
-										.replace(/\\/g, "/");
-							if (currentSourceMappingURLComment !== false) {
-								assets[file] = compilation.assets[file] = new ConcatSource(
-									new RawSource(source),
-									currentSourceMappingURLComment.replace(
-										/\[url\]/g,
-										sourceMapUrl
-									)
+										if (
+											typeof module === "string" &&
+											/^(data|https?):/.test(module)
+										) {
+											moduleToSourceNameMapping.set(module, module);
+											continue;
+										}
+
+										if (!moduleToSourceNameMapping.get(module)) {
+											moduleToSourceNameMapping.set(
+												module,
+												ModuleFilenameHelpers.createFilename(
+													module,
+													{
+														moduleFilenameTemplate,
+														namespace: sourceMapNamespace
+													},
+													{
+														requestShortener,
+														chunkGraph,
+														hashFunction: compilation.outputOptions.hashFunction
+													}
+												)
+											);
+										}
+									}
+
+									tasks.push(task);
+								}
+
+								reportProgress(
+									(0.5 * ++fileIndex) / files.length,
+									file,
+									"generated SourceMap"
 								);
+
+								callback();
+							});
+						},
+						err => {
+							if (err) {
+								return callback(err);
 							}
-							assets[sourceMapFile] = compilation.assets[
-								sourceMapFile
-							] = new RawSource(sourceMapString);
-							chunk.files.push(sourceMapFile);
-						} else {
-							if (currentSourceMappingURLComment === false) {
-								throw new Error(
-									"SourceMapDevToolPlugin: append can't be false when no filename is provided"
+
+							reportProgress(0.5, "resolve sources");
+							/** @type {Set} */
+							const usedNamesSet = new Set(moduleToSourceNameMapping.values());
+							/** @type {Set} */
+							const conflictDetectionSet = new Set();
+
+							/**
+							 * all modules in defined order (longest identifier first)
+							 * @type {Array}
+							 */
+							const allModules = Array.from(
+								moduleToSourceNameMapping.keys()
+							).sort((a, b) => {
+								const ai = typeof a === "string" ? a : a.identifier();
+								const bi = typeof b === "string" ? b : b.identifier();
+								return ai.length - bi.length;
+							});
+
+							// find modules with conflicting source names
+							for (let idx = 0; idx < allModules.length; idx++) {
+								const module = allModules[idx];
+								let sourceName =
+									/** @type {string} */
+									(moduleToSourceNameMapping.get(module));
+								let hasName = conflictDetectionSet.has(sourceName);
+								if (!hasName) {
+									conflictDetectionSet.add(sourceName);
+									continue;
+								}
+
+								// try the fallback name first
+								sourceName = ModuleFilenameHelpers.createFilename(
+									module,
+									{
+										moduleFilenameTemplate: fallbackModuleFilenameTemplate,
+										namespace
+									},
+									{
+										requestShortener,
+										chunkGraph,
+										hashFunction: compilation.outputOptions.hashFunction
+									}
 								);
+								hasName = usedNamesSet.has(sourceName);
+								if (!hasName) {
+									moduleToSourceNameMapping.set(module, sourceName);
+									usedNamesSet.add(sourceName);
+									continue;
+								}
+
+								// otherwise just append stars until we have a valid name
+								while (hasName) {
+									sourceName += "*";
+									hasName = usedNamesSet.has(sourceName);
+								}
+								moduleToSourceNameMapping.set(module, sourceName);
+								usedNamesSet.add(sourceName);
 							}
-							assets[file] = compilation.assets[file] = new ConcatSource(
-								new RawSource(source),
-								currentSourceMappingURLComment
-									.replace(/\[map\]/g, () => sourceMapString)
-									.replace(
-										/\[url\]/g,
-										() =>
-											`data:application/json;charset=utf-8;base64,${Buffer.from(
-												sourceMapString,
-												"utf-8"
-											).toString("base64")}`
-									)
+
+							let taskIndex = 0;
+
+							asyncLib.each(
+								tasks,
+								(task, callback) => {
+									const assets = Object.create(null);
+									const assetsInfo = Object.create(null);
+									const file = task.file;
+									const chunk = fileToChunk.get(file);
+									const sourceMap = task.sourceMap;
+									const source = task.source;
+									const modules = task.modules;
+
+									reportProgress(
+										0.5 + (0.5 * taskIndex) / tasks.length,
+										file,
+										"attach SourceMap"
+									);
+
+									const moduleFilenames = modules.map(m =>
+										moduleToSourceNameMapping.get(m)
+									);
+									sourceMap.sources = /** @type {string[]} */ (moduleFilenames);
+									if (options.noSources) {
+										sourceMap.sourcesContent = undefined;
+									}
+									sourceMap.sourceRoot = options.sourceRoot || "";
+									sourceMap.file = file;
+									const usesContentHash =
+										sourceMapFilename &&
+										CONTENT_HASH_DETECT_REGEXP.test(sourceMapFilename);
+
+									resetRegexpState(CONTENT_HASH_DETECT_REGEXP);
+
+									// If SourceMap and asset uses contenthash, avoid a circular dependency by hiding hash in `file`
+									if (usesContentHash && task.assetInfo.contenthash) {
+										const contenthash = task.assetInfo.contenthash;
+										const pattern = Array.isArray(contenthash)
+											? contenthash.map(quoteMeta).join("|")
+											: quoteMeta(contenthash);
+										sourceMap.file = sourceMap.file.replace(
+											new RegExp(pattern, "g"),
+											m => "x".repeat(m.length)
+										);
+									}
+
+									/** @type {false | TemplatePath} */
+									let currentSourceMappingURLComment = sourceMappingURLComment;
+									const cssExtensionDetected =
+										CSS_EXTENSION_DETECT_REGEXP.test(file);
+									resetRegexpState(CSS_EXTENSION_DETECT_REGEXP);
+									if (
+										currentSourceMappingURLComment !== false &&
+										typeof currentSourceMappingURLComment !== "function" &&
+										cssExtensionDetected
+									) {
+										currentSourceMappingURLComment =
+											currentSourceMappingURLComment.replace(
+												URL_FORMATTING_REGEXP,
+												"\n/*$1*/"
+											);
+									}
+
+									if (options.debugIds) {
+										const debugId = generateDebugId(source, sourceMap.file);
+										sourceMap.debugId = debugId;
+										currentSourceMappingURLComment = `\n//# debugId=${debugId}${currentSourceMappingURLComment}`;
+									}
+
+									const sourceMapString = JSON.stringify(sourceMap);
+									if (sourceMapFilename) {
+										const filename = file;
+										const sourceMapContentHash =
+											/** @type {string} */
+											(
+												usesContentHash &&
+													createHash(
+														/** @type {HashFunction} */
+														(compilation.outputOptions.hashFunction)
+													)
+														.update(sourceMapString)
+														.digest("hex")
+											);
+										const pathParams = {
+											chunk,
+											filename: options.fileContext
+												? relative(
+														outputFs,
+														`/${options.fileContext}`,
+														`/${filename}`
+													)
+												: filename,
+											contentHash: sourceMapContentHash
+										};
+										const { path: sourceMapFile, info: sourceMapInfo } =
+											compilation.getPathWithInfo(
+												sourceMapFilename,
+												pathParams
+											);
+										const sourceMapUrl = options.publicPath
+											? options.publicPath + sourceMapFile
+											: relative(
+													outputFs,
+													dirname(outputFs, `/${file}`),
+													`/${sourceMapFile}`
+												);
+										/** @type {Source} */
+										let asset = new RawSource(source);
+										if (currentSourceMappingURLComment !== false) {
+											// Add source map url to compilation asset, if currentSourceMappingURLComment is set
+											asset = new ConcatSource(
+												asset,
+												compilation.getPath(currentSourceMappingURLComment, {
+													url: sourceMapUrl,
+													...pathParams
+												})
+											);
+										}
+										const assetInfo = {
+											related: { sourceMap: sourceMapFile }
+										};
+										assets[file] = asset;
+										assetsInfo[file] = assetInfo;
+										compilation.updateAsset(file, asset, assetInfo);
+										// Add source map file to compilation assets and chunk files
+										const sourceMapAsset = new RawSource(sourceMapString);
+										const sourceMapAssetInfo = {
+											...sourceMapInfo,
+											development: true
+										};
+										assets[sourceMapFile] = sourceMapAsset;
+										assetsInfo[sourceMapFile] = sourceMapAssetInfo;
+										compilation.emitAsset(
+											sourceMapFile,
+											sourceMapAsset,
+											sourceMapAssetInfo
+										);
+										if (chunk !== undefined)
+											chunk.auxiliaryFiles.add(sourceMapFile);
+									} else {
+										if (currentSourceMappingURLComment === false) {
+											throw new Error(
+												`${PLUGIN_NAME}: append can't be false when no filename is provided`
+											);
+										}
+										if (typeof currentSourceMappingURLComment === "function") {
+											throw new Error(
+												`${PLUGIN_NAME}: append can't be a function when no filename is provided`
+											);
+										}
+										/**
+										 * Add source map as data url to asset
+										 */
+										const asset = new ConcatSource(
+											new RawSource(source),
+											currentSourceMappingURLComment
+												.replace(MAP_URL_COMMENT_REGEXP, () => sourceMapString)
+												.replace(
+													URL_COMMENT_REGEXP,
+													() =>
+														`data:application/json;charset=utf-8;base64,${Buffer.from(
+															sourceMapString,
+															"utf-8"
+														).toString("base64")}`
+												)
+										);
+										assets[file] = asset;
+										assetsInfo[file] = undefined;
+										compilation.updateAsset(file, asset);
+									}
+
+									task.cacheItem.store({ assets, assetsInfo }, err => {
+										reportProgress(
+											0.5 + (0.5 * ++taskIndex) / tasks.length,
+											task.file,
+											"attached SourceMap"
+										);
+
+										if (err) {
+											return callback(err);
+										}
+										callback();
+									});
+								},
+								err => {
+									reportProgress(1);
+									callback(err);
+								}
 							);
 						}
-					});
-					reportProgress(1.0);
+					);
 				}
 			);
 		});
diff --git a/lib/Stats.js b/lib/Stats.js
index 6d338342fe2..22a36632a97 100644
--- a/lib/Stats.js
+++ b/lib/Stats.js
@@ -2,81 +2,47 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
-"use strict";
-
-const RequestShortener = require("./RequestShortener");
-const SizeFormatHelpers = require("./SizeFormatHelpers");
-const formatLocation = require("./formatLocation");
-const identifierUtils = require("./util/identifier");
-const compareLocations = require("./compareLocations");
 
-const optionsOrFallback = (...args) => {
-	let optionValues = [];
-	optionValues.push(...args);
-	return optionValues.find(optionValue => optionValue !== undefined);
-};
+"use strict";
 
-const compareId = (a, b) => {
-	if (typeof a !== typeof b) {
-		return typeof a < typeof b ? -1 : 1;
-	}
-	if (a < b) return -1;
-	if (a > b) return 1;
-	return 0;
-};
+/** @typedef {import("../declarations/WebpackOptions").StatsOptions} StatsOptions */
+/** @typedef {import("./Compilation")} Compilation */
+/** @typedef {import("./Compilation").NormalizedStatsOptions} NormalizedStatsOptions */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsCompilation} StatsCompilation */
 
 class Stats {
+	/**
+	 * @param {Compilation} compilation webpack compilation
+	 */
 	constructor(compilation) {
 		this.compilation = compilation;
-		this.hash = compilation.hash;
-		this.startTime = undefined;
-		this.endTime = undefined;
 	}
 
-	static filterWarnings(warnings, warningsFilter) {
-		// we dont have anything to filter so all warnings can be shown
-		if (!warningsFilter) {
-			return warnings;
-		}
-
-		// create a chain of filters
-		// if they return "true" a warning should be suppressed
-		const normalizedWarningsFilters = [].concat(warningsFilter).map(filter => {
-			if (typeof filter === "string") {
-				return warning => warning.includes(filter);
-			}
-
-			if (filter instanceof RegExp) {
-				return warning => filter.test(warning);
-			}
-
-			if (typeof filter === "function") {
-				return filter;
-			}
+	get hash() {
+		return this.compilation.hash;
+	}
 
-			throw new Error(
-				`Can only filter warnings with Strings or RegExps. (Given: ${filter})`
-			);
-		});
-		return warnings.filter(warning => {
-			return !normalizedWarningsFilters.some(check => check(warning));
-		});
+	get startTime() {
+		return this.compilation.startTime;
 	}
 
-	formatFilePath(filePath) {
-		const OPTIONS_REGEXP = /^(\s|\S)*!/;
-		return filePath.includes("!")
-			? `${filePath.replace(OPTIONS_REGEXP, "")} (${filePath})`
-			: `${filePath}`;
+	get endTime() {
+		return this.compilation.endTime;
 	}
 
+	/**
+	 * @returns {boolean} true if the compilation had a warning
+	 */
 	hasWarnings() {
 		return (
-			this.compilation.warnings.length > 0 ||
+			this.compilation.getWarnings().length > 0 ||
 			this.compilation.children.some(child => child.getStats().hasWarnings())
 		);
 	}
 
+	/**
+	 * @returns {boolean} true if the compilation encountered an error
+	 */
 	hasErrors() {
 		return (
 			this.compilation.errors.length > 0 ||
@@ -84,1353 +50,39 @@ class Stats {
 		);
 	}
 
-	// remove a prefixed "!" that can be specified to reverse sort order
-	normalizeFieldKey(field) {
-		if (field[0] === "!") {
-			return field.substr(1);
-		}
-		return field;
-	}
-
-	// if a field is prefixed by a "!" reverse sort order
-	sortOrderRegular(field) {
-		if (field[0] === "!") {
-			return false;
-		}
-		return true;
-	}
-
-	toJson(options, forToString) {
-		if (typeof options === "boolean" || typeof options === "string") {
-			options = Stats.presetToOptions(options);
-		} else if (!options) {
-			options = {};
-		}
-
-		const optionOrLocalFallback = (v, def) =>
-			v !== undefined ? v : options.all !== undefined ? options.all : def;
-
-		const testAgainstGivenOption = item => {
-			if (typeof item === "string") {
-				const regExp = new RegExp(
-					`[\\\\/]${item.replace(
-						// eslint-disable-next-line no-useless-escape
-						/[-[\]{}()*+?.\\^$|]/g,
-						"\\$&"
-					)}([\\\\/]|$|!|\\?)`
-				);
-				return ident => regExp.test(ident);
-			}
-			if (item && typeof item === "object" && typeof item.test === "function") {
-				return ident => item.test(ident);
-			}
-			if (typeof item === "function") {
-				return item;
-			}
-			if (typeof item === "boolean") {
-				return () => item;
-			}
-		};
-
-		const compilation = this.compilation;
-		const context = optionsOrFallback(
-			options.context,
-			compilation.compiler.context
-		);
-		const requestShortener =
-			compilation.compiler.context === context
-				? compilation.requestShortener
-				: new RequestShortener(context);
-		const showPerformance = optionOrLocalFallback(options.performance, true);
-		const showHash = optionOrLocalFallback(options.hash, true);
-		const showEnv = optionOrLocalFallback(options.env, false);
-		const showVersion = optionOrLocalFallback(options.version, true);
-		const showTimings = optionOrLocalFallback(options.timings, true);
-		const showBuiltAt = optionOrLocalFallback(options.builtAt, true);
-		const showAssets = optionOrLocalFallback(options.assets, true);
-		const showEntrypoints = optionOrLocalFallback(options.entrypoints, true);
-		const showChunkGroups = optionOrLocalFallback(
-			options.chunkGroups,
-			!forToString
-		);
-		const showChunks = optionOrLocalFallback(options.chunks, !forToString);
-		const showChunkModules = optionOrLocalFallback(options.chunkModules, true);
-		const showChunkOrigins = optionOrLocalFallback(
-			options.chunkOrigins,
-			!forToString
-		);
-		const showModules = optionOrLocalFallback(options.modules, true);
-		const showNestedModules = optionOrLocalFallback(
-			options.nestedModules,
-			true
-		);
-		const showModuleAssets = optionOrLocalFallback(
-			options.moduleAssets,
-			!forToString
-		);
-		const showDepth = optionOrLocalFallback(options.depth, !forToString);
-		const showCachedModules = optionOrLocalFallback(options.cached, true);
-		const showCachedAssets = optionOrLocalFallback(options.cachedAssets, true);
-		const showReasons = optionOrLocalFallback(options.reasons, !forToString);
-		const showUsedExports = optionOrLocalFallback(
-			options.usedExports,
-			!forToString
-		);
-		const showProvidedExports = optionOrLocalFallback(
-			options.providedExports,
-			!forToString
-		);
-		const showOptimizationBailout = optionOrLocalFallback(
-			options.optimizationBailout,
-			!forToString
-		);
-		const showChildren = optionOrLocalFallback(options.children, true);
-		const showSource = optionOrLocalFallback(options.source, !forToString);
-		const showModuleTrace = optionOrLocalFallback(options.moduleTrace, true);
-		const showErrors = optionOrLocalFallback(options.errors, true);
-		const showErrorDetails = optionOrLocalFallback(
-			options.errorDetails,
-			!forToString
-		);
-		const showWarnings = optionOrLocalFallback(options.warnings, true);
-		const warningsFilter = optionsOrFallback(options.warningsFilter, null);
-		const showPublicPath = optionOrLocalFallback(
-			options.publicPath,
-			!forToString
-		);
-		const excludeModules = []
-			.concat(optionsOrFallback(options.excludeModules, options.exclude, []))
-			.map(testAgainstGivenOption);
-		const excludeAssets = []
-			.concat(optionsOrFallback(options.excludeAssets, []))
-			.map(testAgainstGivenOption);
-		const maxModules = optionsOrFallback(
-			options.maxModules,
-			forToString ? 15 : Infinity
-		);
-		const sortModules = optionsOrFallback(options.modulesSort, "id");
-		const sortChunks = optionsOrFallback(options.chunksSort, "id");
-		const sortAssets = optionsOrFallback(options.assetsSort, "");
-		const showOutputPath = optionOrLocalFallback(
-			options.outputPath,
-			!forToString
-		);
-
-		if (!showCachedModules) {
-			excludeModules.push((ident, module) => !module.built);
-		}
-
-		const createModuleFilter = () => {
-			let i = 0;
-			return module => {
-				if (excludeModules.length > 0) {
-					const ident = requestShortener.shorten(module.resource);
-					const excluded = excludeModules.some(fn => fn(ident, module));
-					if (excluded) return false;
-				}
-				const result = i < maxModules;
-				i++;
-				return result;
-			};
-		};
-
-		const createAssetFilter = () => {
-			return asset => {
-				if (excludeAssets.length > 0) {
-					const ident = asset.name;
-					const excluded = excludeAssets.some(fn => fn(ident, asset));
-					if (excluded) return false;
-				}
-				return showCachedAssets || asset.emitted;
-			};
-		};
-
-		const sortByFieldAndOrder = (fieldKey, a, b) => {
-			if (a[fieldKey] === null && b[fieldKey] === null) return 0;
-			if (a[fieldKey] === null) return 1;
-			if (b[fieldKey] === null) return -1;
-			if (a[fieldKey] === b[fieldKey]) return 0;
-			if (typeof a[fieldKey] !== typeof b[fieldKey])
-				return typeof a[fieldKey] < typeof b[fieldKey] ? -1 : 1;
-			return a[fieldKey] < b[fieldKey] ? -1 : 1;
-		};
-
-		const sortByField = (field, originalArray) => {
-			const originalMap = originalArray.reduce((map, v, i) => {
-				map.set(v, i);
-				return map;
-			}, new Map());
-			return (a, b) => {
-				if (field) {
-					const fieldKey = this.normalizeFieldKey(field);
-
-					// if a field is prefixed with a "!" the sort is reversed!
-					const sortIsRegular = this.sortOrderRegular(field);
-
-					const cmp = sortByFieldAndOrder(
-						fieldKey,
-						sortIsRegular ? a : b,
-						sortIsRegular ? b : a
-					);
-					if (cmp) return cmp;
-				}
-				return originalMap.get(a) - originalMap.get(b);
-			};
-		};
-
-		const formatError = e => {
-			let text = "";
-			if (typeof e === "string") {
-				e = { message: e };
-			}
-			if (e.chunk) {
-				text += `chunk ${e.chunk.name || e.chunk.id}${
-					e.chunk.hasRuntime()
-						? " [entry]"
-						: e.chunk.canBeInitial()
-							? " [initial]"
-							: ""
-				}\n`;
-			}
-			if (e.file) {
-				text += `${e.file}\n`;
-			}
-			if (
-				e.module &&
-				e.module.readableIdentifier &&
-				typeof e.module.readableIdentifier === "function"
-			) {
-				text += this.formatFilePath(
-					e.module.readableIdentifier(requestShortener)
-				);
-				if (typeof e.loc === "object") {
-					const locInfo = formatLocation(e.loc);
-					if (locInfo) text += ` ${locInfo}`;
-				}
-				text += "\n";
-			}
-			text += e.message;
-			if (showErrorDetails && e.details) {
-				text += `\n${e.details}`;
-			}
-			if (showErrorDetails && e.missing) {
-				text += e.missing.map(item => `\n[${item}]`).join("");
-			}
-			if (showModuleTrace && e.origin) {
-				text += `\n @ ${this.formatFilePath(
-					e.origin.readableIdentifier(requestShortener)
-				)}`;
-				if (typeof e.originLoc === "object") {
-					const locInfo = formatLocation(e.originLoc);
-					if (locInfo) text += ` ${locInfo}`;
-				}
-				if (e.dependencies) {
-					for (const dep of e.dependencies) {
-						if (!dep.loc) continue;
-						if (typeof dep.loc === "string") continue;
-						const locInfo = formatLocation(dep.loc);
-						if (!locInfo) continue;
-						text += ` ${locInfo}`;
-					}
-				}
-				let current = e.origin;
-				while (current.issuer) {
-					current = current.issuer;
-					text += `\n @ ${current.readableIdentifier(requestShortener)}`;
-				}
-			}
-			return text;
-		};
-
-		const obj = {
-			errors: compilation.errors.map(formatError),
-			warnings: Stats.filterWarnings(
-				compilation.warnings.map(formatError),
-				warningsFilter
-			)
-		};
-
-		//We just hint other renderers since actually omitting
-		//errors/warnings from the JSON would be kind of weird.
-		Object.defineProperty(obj, "_showWarnings", {
-			value: showWarnings,
-			enumerable: false
-		});
-		Object.defineProperty(obj, "_showErrors", {
-			value: showErrors,
-			enumerable: false
+	/**
+	 * @param {(string | boolean | StatsOptions)=} options stats options
+	 * @returns {StatsCompilation} json output
+	 */
+	toJson(options) {
+		const normalizedOptions = this.compilation.createStatsOptions(options, {
+			forToString: false
 		});
 
-		if (showVersion) {
-			obj.version = require("../package.json").version;
-		}
-
-		if (showHash) obj.hash = this.hash;
-		if (showTimings && this.startTime && this.endTime) {
-			obj.time = this.endTime - this.startTime;
-		}
-
-		if (showBuiltAt && this.endTime) {
-			obj.builtAt = this.endTime;
-		}
+		const statsFactory = this.compilation.createStatsFactory(normalizedOptions);
 
-		if (showEnv && options._env) {
-			obj.env = options._env;
-		}
-
-		if (compilation.needAdditionalPass) {
-			obj.needAdditionalPass = true;
-		}
-		if (showPublicPath) {
-			obj.publicPath = this.compilation.mainTemplate.getPublicPath({
-				hash: this.compilation.hash
-			});
-		}
-		if (showOutputPath) {
-			obj.outputPath = this.compilation.mainTemplate.outputOptions.path;
-		}
-		if (showAssets) {
-			const assetsByFile = {};
-			const compilationAssets = Object.keys(compilation.assets).sort();
-			obj.assetsByChunkName = {};
-			obj.assets = compilationAssets
-				.map(asset => {
-					const obj = {
-						name: asset,
-						size: compilation.assets[asset].size(),
-						chunks: [],
-						chunkNames: [],
-						// TODO webpack 5: remove .emitted
-						emitted:
-							compilation.assets[asset].emitted ||
-							compilation.emittedAssets.has(asset)
-					};
-
-					if (showPerformance) {
-						obj.isOverSizeLimit = compilation.assets[asset].isOverSizeLimit;
-					}
-
-					assetsByFile[asset] = obj;
-					return obj;
-				})
-				.filter(createAssetFilter());
-			obj.filteredAssets = compilationAssets.length - obj.assets.length;
-
-			for (const chunk of compilation.chunks) {
-				for (const asset of chunk.files) {
-					if (assetsByFile[asset]) {
-						for (const id of chunk.ids) {
-							assetsByFile[asset].chunks.push(id);
-						}
-						if (chunk.name) {
-							assetsByFile[asset].chunkNames.push(chunk.name);
-							if (obj.assetsByChunkName[chunk.name]) {
-								obj.assetsByChunkName[chunk.name] = []
-									.concat(obj.assetsByChunkName[chunk.name])
-									.concat([asset]);
-							} else {
-								obj.assetsByChunkName[chunk.name] = asset;
-							}
-						}
-					}
-				}
-			}
-			obj.assets.sort(sortByField(sortAssets, obj.assets));
-		}
-
-		const fnChunkGroup = groupMap => {
-			const obj = {};
-			for (const keyValuePair of groupMap) {
-				const name = keyValuePair[0];
-				const cg = keyValuePair[1];
-				const children = cg.getChildrenByOrders();
-				obj[name] = {
-					chunks: cg.chunks.map(c => c.id),
-					assets: cg.chunks.reduce(
-						(array, c) => array.concat(c.files || []),
-						[]
-					),
-					children: Object.keys(children).reduce((obj, key) => {
-						const groups = children[key];
-						obj[key] = groups.map(group => ({
-							name: group.name,
-							chunks: group.chunks.map(c => c.id),
-							assets: group.chunks.reduce(
-								(array, c) => array.concat(c.files || []),
-								[]
-							)
-						}));
-						return obj;
-					}, Object.create(null)),
-					childAssets: Object.keys(children).reduce((obj, key) => {
-						const groups = children[key];
-						obj[key] = Array.from(
-							groups.reduce((set, group) => {
-								for (const chunk of group.chunks) {
-									for (const asset of chunk.files) {
-										set.add(asset);
-									}
-								}
-								return set;
-							}, new Set())
-						);
-						return obj;
-					}, Object.create(null))
-				};
-				if (showPerformance) {
-					obj[name].isOverSizeLimit = cg.isOverSizeLimit;
-				}
-			}
-
-			return obj;
-		};
-
-		if (showEntrypoints) {
-			obj.entrypoints = fnChunkGroup(compilation.entrypoints);
-		}
-
-		if (showChunkGroups) {
-			obj.namedChunkGroups = fnChunkGroup(compilation.namedChunkGroups);
-		}
-
-		const fnModule = module => {
-			const path = [];
-			let current = module;
-			while (current.issuer) {
-				path.push((current = current.issuer));
-			}
-			path.reverse();
-			const obj = {
-				id: module.id,
-				identifier: module.identifier(),
-				name: module.readableIdentifier(requestShortener),
-				index: module.index,
-				index2: module.index2,
-				size: module.size(),
-				cacheable: module.buildInfo.cacheable,
-				built: !!module.built,
-				optional: module.optional,
-				prefetched: module.prefetched,
-				chunks: Array.from(module.chunksIterable, chunk => chunk.id),
-				issuer: module.issuer && module.issuer.identifier(),
-				issuerId: module.issuer && module.issuer.id,
-				issuerName:
-					module.issuer && module.issuer.readableIdentifier(requestShortener),
-				issuerPath:
-					module.issuer &&
-					path.map(module => ({
-						id: module.id,
-						identifier: module.identifier(),
-						name: module.readableIdentifier(requestShortener),
-						profile: module.profile
-					})),
-				profile: module.profile,
-				failed: !!module.error,
-				errors: module.errors ? module.errors.length : 0,
-				warnings: module.warnings ? module.warnings.length : 0
-			};
-			if (showModuleAssets) {
-				obj.assets = Object.keys(module.buildInfo.assets || {});
-			}
-			if (showReasons) {
-				obj.reasons = module.reasons
-					.sort((a, b) => {
-						if (a.module && !b.module) return -1;
-						if (!a.module && b.module) return 1;
-						if (a.module && b.module) {
-							const cmp = compareId(a.module.id, b.module.id);
-							if (cmp) return cmp;
-						}
-						if (a.dependency && !b.dependency) return -1;
-						if (!a.dependency && b.dependency) return 1;
-						if (a.dependency && b.dependency) {
-							const cmp = compareLocations(a.dependency.loc, b.dependency.loc);
-							if (cmp) return cmp;
-							if (a.dependency.type < b.dependency.type) return -1;
-							if (a.dependency.type > b.dependency.type) return 1;
-						}
-						return 0;
-					})
-					.map(reason => {
-						const obj = {
-							moduleId: reason.module ? reason.module.id : null,
-							moduleIdentifier: reason.module
-								? reason.module.identifier()
-								: null,
-							module: reason.module
-								? reason.module.readableIdentifier(requestShortener)
-								: null,
-							moduleName: reason.module
-								? reason.module.readableIdentifier(requestShortener)
-								: null,
-							type: reason.dependency ? reason.dependency.type : null,
-							explanation: reason.explanation,
-							userRequest: reason.dependency
-								? reason.dependency.userRequest
-								: null
-						};
-						if (reason.dependency) {
-							const locInfo = formatLocation(reason.dependency.loc);
-							if (locInfo) {
-								obj.loc = locInfo;
-							}
-						}
-						return obj;
-					});
-			}
-			if (showUsedExports) {
-				if (module.used === true) {
-					obj.usedExports = module.usedExports;
-				} else if (module.used === false) {
-					obj.usedExports = false;
-				}
-			}
-			if (showProvidedExports) {
-				obj.providedExports = Array.isArray(module.buildMeta.providedExports)
-					? module.buildMeta.providedExports
-					: null;
-			}
-			if (showOptimizationBailout) {
-				obj.optimizationBailout = module.optimizationBailout.map(item => {
-					if (typeof item === "function") return item(requestShortener);
-					return item;
-				});
-			}
-			if (showDepth) {
-				obj.depth = module.depth;
-			}
-			if (showNestedModules) {
-				if (module.modules) {
-					const modules = module.modules;
-					obj.modules = modules
-						.sort(sortByField("depth", modules))
-						.filter(createModuleFilter())
-						.map(fnModule);
-					obj.filteredModules = modules.length - obj.modules.length;
-					obj.modules.sort(sortByField(sortModules, obj.modules));
-				}
-			}
-			if (showSource && module._source) {
-				obj.source = module._source.source();
-			}
-			return obj;
-		};
-		if (showChunks) {
-			obj.chunks = compilation.chunks.map(chunk => {
-				const parents = new Set();
-				const children = new Set();
-				const siblings = new Set();
-				const childIdByOrder = chunk.getChildIdsByOrders();
-				for (const chunkGroup of chunk.groupsIterable) {
-					for (const parentGroup of chunkGroup.parentsIterable) {
-						for (const chunk of parentGroup.chunks) {
-							parents.add(chunk.id);
-						}
-					}
-					for (const childGroup of chunkGroup.childrenIterable) {
-						for (const chunk of childGroup.chunks) {
-							children.add(chunk.id);
-						}
-					}
-					for (const sibling of chunkGroup.chunks) {
-						if (sibling !== chunk) siblings.add(sibling.id);
-					}
-				}
-				const obj = {
-					id: chunk.id,
-					rendered: chunk.rendered,
-					initial: chunk.canBeInitial(),
-					entry: chunk.hasRuntime(),
-					recorded: chunk.recorded,
-					reason: chunk.chunkReason,
-					size: chunk.modulesSize(),
-					names: chunk.name ? [chunk.name] : [],
-					files: chunk.files.slice(),
-					hash: chunk.renderedHash,
-					siblings: Array.from(siblings).sort(compareId),
-					parents: Array.from(parents).sort(compareId),
-					children: Array.from(children).sort(compareId),
-					childrenByOrder: childIdByOrder
-				};
-				if (showChunkModules) {
-					const modules = chunk.getModules();
-					obj.modules = modules
-						.slice()
-						.sort(sortByField("depth", modules))
-						.filter(createModuleFilter())
-						.map(fnModule);
-					obj.filteredModules = chunk.getNumberOfModules() - obj.modules.length;
-					obj.modules.sort(sortByField(sortModules, obj.modules));
-				}
-				if (showChunkOrigins) {
-					obj.origins = Array.from(chunk.groupsIterable, g => g.origins)
-						.reduce((a, b) => a.concat(b), [])
-						.map(origin => ({
-							moduleId: origin.module ? origin.module.id : undefined,
-							module: origin.module ? origin.module.identifier() : "",
-							moduleIdentifier: origin.module ? origin.module.identifier() : "",
-							moduleName: origin.module
-								? origin.module.readableIdentifier(requestShortener)
-								: "",
-							loc: formatLocation(origin.loc),
-							request: origin.request,
-							reasons: origin.reasons || []
-						}))
-						.sort((a, b) => {
-							const cmp1 = compareId(a.moduleId, b.moduleId);
-							if (cmp1) return cmp1;
-							const cmp2 = compareId(a.loc, b.loc);
-							if (cmp2) return cmp2;
-							const cmp3 = compareId(a.request, b.request);
-							if (cmp3) return cmp3;
-							return 0;
-						});
-				}
-				return obj;
-			});
-			obj.chunks.sort(sortByField(sortChunks, obj.chunks));
-		}
-		if (showModules) {
-			obj.modules = compilation.modules
-				.slice()
-				.sort(sortByField("depth", compilation.modules))
-				.filter(createModuleFilter())
-				.map(fnModule);
-			obj.filteredModules = compilation.modules.length - obj.modules.length;
-			obj.modules.sort(sortByField(sortModules, obj.modules));
-		}
-		if (showChildren) {
-			obj.children = compilation.children.map((child, idx) => {
-				const childOptions = Stats.getChildOptions(options, idx);
-				const obj = new Stats(child).toJson(childOptions, forToString);
-				delete obj.hash;
-				delete obj.version;
-				if (child.name) {
-					obj.name = identifierUtils.makePathsRelative(
-						context,
-						child.name,
-						compilation.cache
-					);
-				}
-				return obj;
-			});
-		}
-
-		return obj;
+		return statsFactory.create("compilation", this.compilation, {
+			compilation: this.compilation
+		});
 	}
 
+	/**
+	 * @param {(string | boolean | StatsOptions)=} options stats options
+	 * @returns {string} string output
+	 */
 	toString(options) {
-		if (typeof options === "boolean" || typeof options === "string") {
-			options = Stats.presetToOptions(options);
-		} else if (!options) {
-			options = {};
-		}
-
-		const useColors = optionsOrFallback(options.colors, false);
-
-		const obj = this.toJson(options, true);
-
-		return Stats.jsonToString(obj, useColors);
-	}
-
-	static jsonToString(obj, useColors) {
-		const buf = [];
-
-		const defaultColors = {
-			bold: "\u001b[1m",
-			yellow: "\u001b[1m\u001b[33m",
-			red: "\u001b[1m\u001b[31m",
-			green: "\u001b[1m\u001b[32m",
-			cyan: "\u001b[1m\u001b[36m",
-			magenta: "\u001b[1m\u001b[35m"
-		};
-
-		const colors = Object.keys(defaultColors).reduce(
-			(obj, color) => {
-				obj[color] = str => {
-					if (useColors) {
-						buf.push(
-							useColors === true || useColors[color] === undefined
-								? defaultColors[color]
-								: useColors[color]
-						);
-					}
-					buf.push(str);
-					if (useColors) {
-						buf.push("\u001b[39m\u001b[22m");
-					}
-				};
-				return obj;
-			},
-			{
-				normal: str => buf.push(str)
-			}
-		);
-
-		const coloredTime = time => {
-			let times = [800, 400, 200, 100];
-			if (obj.time) {
-				times = [obj.time / 2, obj.time / 4, obj.time / 8, obj.time / 16];
-			}
-			if (time < times[3]) colors.normal(`${time}ms`);
-			else if (time < times[2]) colors.bold(`${time}ms`);
-			else if (time < times[1]) colors.green(`${time}ms`);
-			else if (time < times[0]) colors.yellow(`${time}ms`);
-			else colors.red(`${time}ms`);
-		};
-
-		const newline = () => buf.push("\n");
-
-		const getText = (arr, row, col) => {
-			return arr[row][col].value;
-		};
-
-		const table = (array, align, splitter) => {
-			const rows = array.length;
-			const cols = array[0].length;
-			const colSizes = new Array(cols);
-			for (let col = 0; col < cols; col++) {
-				colSizes[col] = 0;
-			}
-			for (let row = 0; row < rows; row++) {
-				for (let col = 0; col < cols; col++) {
-					const value = `${getText(array, row, col)}`;
-					if (value.length > colSizes[col]) {
-						colSizes[col] = value.length;
-					}
-				}
-			}
-			for (let row = 0; row < rows; row++) {
-				for (let col = 0; col < cols; col++) {
-					const format = array[row][col].color;
-					const value = `${getText(array, row, col)}`;
-					let l = value.length;
-					if (align[col] === "l") {
-						format(value);
-					}
-					for (; l < colSizes[col] && col !== cols - 1; l++) {
-						colors.normal(" ");
-					}
-					if (align[col] === "r") {
-						format(value);
-					}
-					if (col + 1 < cols && colSizes[col] !== 0) {
-						colors.normal(splitter || "  ");
-					}
-				}
-				newline();
-			}
-		};
-
-		const getAssetColor = (asset, defaultColor) => {
-			if (asset.isOverSizeLimit) {
-				return colors.yellow;
-			}
-
-			return defaultColor;
-		};
-
-		if (obj.hash) {
-			colors.normal("Hash: ");
-			colors.bold(obj.hash);
-			newline();
-		}
-		if (obj.version) {
-			colors.normal("Version: webpack ");
-			colors.bold(obj.version);
-			newline();
-		}
-		if (typeof obj.time === "number") {
-			colors.normal("Time: ");
-			colors.bold(obj.time);
-			colors.normal("ms");
-			newline();
-		}
-		if (typeof obj.builtAt === "number") {
-			const builtAtDate = new Date(obj.builtAt);
-			colors.normal("Built at: ");
-			colors.normal(
-				builtAtDate.toLocaleDateString(undefined, {
-					day: "2-digit",
-					month: "2-digit",
-					year: "numeric"
-				})
-			);
-			colors.normal(" ");
-			colors.bold(builtAtDate.toLocaleTimeString());
-			newline();
-		}
-		if (obj.env) {
-			colors.normal("Environment (--env): ");
-			colors.bold(JSON.stringify(obj.env, null, 2));
-			newline();
-		}
-		if (obj.publicPath) {
-			colors.normal("PublicPath: ");
-			colors.bold(obj.publicPath);
-			newline();
-		}
-
-		if (obj.assets && obj.assets.length > 0) {
-			const t = [
-				[
-					{
-						value: "Asset",
-						color: colors.bold
-					},
-					{
-						value: "Size",
-						color: colors.bold
-					},
-					{
-						value: "Chunks",
-						color: colors.bold
-					},
-					{
-						value: "",
-						color: colors.bold
-					},
-					{
-						value: "",
-						color: colors.bold
-					},
-					{
-						value: "Chunk Names",
-						color: colors.bold
-					}
-				]
-			];
-			for (const asset of obj.assets) {
-				t.push([
-					{
-						value: asset.name,
-						color: getAssetColor(asset, colors.green)
-					},
-					{
-						value: SizeFormatHelpers.formatSize(asset.size),
-						color: getAssetColor(asset, colors.normal)
-					},
-					{
-						value: asset.chunks.join(", "),
-						color: colors.bold
-					},
-					{
-						value: asset.emitted ? "[emitted]" : "",
-						color: colors.green
-					},
-					{
-						value: asset.isOverSizeLimit ? "[big]" : "",
-						color: getAssetColor(asset, colors.normal)
-					},
-					{
-						value: asset.chunkNames.join(", "),
-						color: colors.normal
-					}
-				]);
-			}
-			table(t, "rrrlll");
-		}
-		if (obj.filteredAssets > 0) {
-			colors.normal(" ");
-			if (obj.assets.length > 0) colors.normal("+ ");
-			colors.normal(obj.filteredAssets);
-			if (obj.assets.length > 0) colors.normal(" hidden");
-			colors.normal(obj.filteredAssets !== 1 ? " assets" : " asset");
-			newline();
-		}
-
-		const processChunkGroups = (namedGroups, prefix) => {
-			for (const name of Object.keys(namedGroups)) {
-				const cg = namedGroups[name];
-				colors.normal(`${prefix} `);
-				colors.bold(name);
-				if (cg.isOverSizeLimit) {
-					colors.normal(" ");
-					colors.yellow("[big]");
-				}
-				colors.normal(" =");
-				for (const asset of cg.assets) {
-					colors.normal(" ");
-					colors.green(asset);
-				}
-				for (const name of Object.keys(cg.childAssets)) {
-					const assets = cg.childAssets[name];
-					if (assets && assets.length > 0) {
-						colors.normal(" ");
-						colors.magenta(`(${name}:`);
-						for (const asset of assets) {
-							colors.normal(" ");
-							colors.green(asset);
-						}
-						colors.magenta(")");
-					}
-				}
-				newline();
-			}
-		};
-
-		if (obj.entrypoints) {
-			processChunkGroups(obj.entrypoints, "Entrypoint");
-		}
-
-		if (obj.namedChunkGroups) {
-			let outputChunkGroups = obj.namedChunkGroups;
-			if (obj.entrypoints) {
-				outputChunkGroups = Object.keys(outputChunkGroups)
-					.filter(name => !obj.entrypoints[name])
-					.reduce((result, name) => {
-						result[name] = obj.namedChunkGroups[name];
-						return result;
-					}, {});
-			}
-			processChunkGroups(outputChunkGroups, "Chunk Group");
-		}
-
-		const modulesByIdentifier = {};
-		if (obj.modules) {
-			for (const module of obj.modules) {
-				modulesByIdentifier[`$${module.identifier}`] = module;
-			}
-		} else if (obj.chunks) {
-			for (const chunk of obj.chunks) {
-				if (chunk.modules) {
-					for (const module of chunk.modules) {
-						modulesByIdentifier[`$${module.identifier}`] = module;
-					}
-				}
-			}
-		}
-
-		const processModuleAttributes = module => {
-			colors.normal(" ");
-			colors.normal(SizeFormatHelpers.formatSize(module.size));
-			if (module.chunks) {
-				for (const chunk of module.chunks) {
-					colors.normal(" {");
-					colors.yellow(chunk);
-					colors.normal("}");
-				}
-			}
-			if (typeof module.depth === "number") {
-				colors.normal(` [depth ${module.depth}]`);
-			}
-			if (module.cacheable === false) {
-				colors.red(" [not cacheable]");
-			}
-			if (module.optional) {
-				colors.yellow(" [optional]");
-			}
-			if (module.built) {
-				colors.green(" [built]");
-			}
-			if (module.assets && module.assets.length) {
-				colors.magenta(
-					` [${module.assets.length} asset${
-						module.assets.length === 1 ? "" : "s"
-					}]`
-				);
-			}
-			if (module.prefetched) {
-				colors.magenta(" [prefetched]");
-			}
-			if (module.failed) colors.red(" [failed]");
-			if (module.warnings) {
-				colors.yellow(
-					` [${module.warnings} warning${module.warnings === 1 ? "" : "s"}]`
-				);
-			}
-			if (module.errors) {
-				colors.red(
-					` [${module.errors} error${module.errors === 1 ? "" : "s"}]`
-				);
-			}
-		};
-
-		const processModuleContent = (module, prefix) => {
-			if (Array.isArray(module.providedExports)) {
-				colors.normal(prefix);
-				if (module.providedExports.length === 0) {
-					colors.cyan("[no exports]");
-				} else {
-					colors.cyan(`[exports: ${module.providedExports.join(", ")}]`);
-				}
-				newline();
-			}
-			if (module.usedExports !== undefined) {
-				if (module.usedExports !== true) {
-					colors.normal(prefix);
-					if (module.usedExports === null) {
-						colors.cyan("[used exports unknown]");
-					} else if (module.usedExports === false) {
-						colors.cyan("[no exports used]");
-					} else if (
-						Array.isArray(module.usedExports) &&
-						module.usedExports.length === 0
-					) {
-						colors.cyan("[no exports used]");
-					} else if (Array.isArray(module.usedExports)) {
-						const providedExportsCount = Array.isArray(module.providedExports)
-							? module.providedExports.length
-							: null;
-						if (
-							providedExportsCount !== null &&
-							providedExportsCount === module.usedExports.length
-						) {
-							colors.cyan("[all exports used]");
-						} else {
-							colors.cyan(
-								`[only some exports used: ${module.usedExports.join(", ")}]`
-							);
-						}
-					}
-					newline();
-				}
-			}
-			if (Array.isArray(module.optimizationBailout)) {
-				for (const item of module.optimizationBailout) {
-					colors.normal(prefix);
-					colors.yellow(item);
-					newline();
-				}
-			}
-			if (module.reasons) {
-				for (const reason of module.reasons) {
-					colors.normal(prefix);
-					if (reason.type) {
-						colors.normal(reason.type);
-						colors.normal(" ");
-					}
-					if (reason.userRequest) {
-						colors.cyan(reason.userRequest);
-						colors.normal(" ");
-					}
-					if (reason.moduleId !== null) {
-						colors.normal("[");
-						colors.normal(reason.moduleId);
-						colors.normal("]");
-					}
-					if (reason.module && reason.module !== reason.moduleId) {
-						colors.normal(" ");
-						colors.magenta(reason.module);
-					}
-					if (reason.loc) {
-						colors.normal(" ");
-						colors.normal(reason.loc);
-					}
-					if (reason.explanation) {
-						colors.normal(" ");
-						colors.cyan(reason.explanation);
-					}
-					newline();
-				}
-			}
-			if (module.profile) {
-				colors.normal(prefix);
-				let sum = 0;
-				if (module.issuerPath) {
-					for (const m of module.issuerPath) {
-						colors.normal("[");
-						colors.normal(m.id);
-						colors.normal("] ");
-						if (m.profile) {
-							const time = (m.profile.factory || 0) + (m.profile.building || 0);
-							coloredTime(time);
-							sum += time;
-							colors.normal(" ");
-						}
-						colors.normal("-> ");
-					}
-				}
-				for (const key of Object.keys(module.profile)) {
-					colors.normal(`${key}:`);
-					const time = module.profile[key];
-					coloredTime(time);
-					colors.normal(" ");
-					sum += time;
-				}
-				colors.normal("= ");
-				coloredTime(sum);
-				newline();
-			}
-			if (module.modules) {
-				processModulesList(module, prefix + "| ");
-			}
-		};
-
-		const processModulesList = (obj, prefix) => {
-			if (obj.modules) {
-				let maxModuleId = 0;
-				for (const module of obj.modules) {
-					if (typeof module.id === "number") {
-						if (maxModuleId < module.id) maxModuleId = module.id;
-					}
-				}
-				let contentPrefix = prefix + "    ";
-				if (maxModuleId >= 10) contentPrefix += " ";
-				if (maxModuleId >= 100) contentPrefix += " ";
-				if (maxModuleId >= 1000) contentPrefix += " ";
-				for (const module of obj.modules) {
-					colors.normal(prefix);
-					const name = module.name || module.identifier;
-					if (typeof module.id === "string" || typeof module.id === "number") {
-						if (typeof module.id === "number") {
-							if (module.id < 1000 && maxModuleId >= 1000) colors.normal(" ");
-							if (module.id < 100 && maxModuleId >= 100) colors.normal(" ");
-							if (module.id < 10 && maxModuleId >= 10) colors.normal(" ");
-						} else {
-							if (maxModuleId >= 1000) colors.normal(" ");
-							if (maxModuleId >= 100) colors.normal(" ");
-							if (maxModuleId >= 10) colors.normal(" ");
-						}
-						if (name !== module.id) {
-							colors.normal("[");
-							colors.normal(module.id);
-							colors.normal("]");
-							colors.normal(" ");
-						} else {
-							colors.normal("[");
-							colors.bold(module.id);
-							colors.normal("]");
-						}
-					}
-					if (name !== module.id) {
-						colors.bold(name);
-					}
-					processModuleAttributes(module);
-					newline();
-					processModuleContent(module, contentPrefix);
-				}
-				if (obj.filteredModules > 0) {
-					colors.normal(prefix);
-					colors.normal("   ");
-					if (obj.modules.length > 0) colors.normal(" + ");
-					colors.normal(obj.filteredModules);
-					if (obj.modules.length > 0) colors.normal(" hidden");
-					colors.normal(obj.filteredModules !== 1 ? " modules" : " module");
-					newline();
-				}
-			}
-		};
-
-		if (obj.chunks) {
-			for (const chunk of obj.chunks) {
-				colors.normal("chunk ");
-				if (chunk.id < 1000) colors.normal(" ");
-				if (chunk.id < 100) colors.normal(" ");
-				if (chunk.id < 10) colors.normal(" ");
-				colors.normal("{");
-				colors.yellow(chunk.id);
-				colors.normal("} ");
-				colors.green(chunk.files.join(", "));
-				if (chunk.names && chunk.names.length > 0) {
-					colors.normal(" (");
-					colors.normal(chunk.names.join(", "));
-					colors.normal(")");
-				}
-				colors.normal(" ");
-				colors.normal(SizeFormatHelpers.formatSize(chunk.size));
-				for (const id of chunk.parents) {
-					colors.normal(" <{");
-					colors.yellow(id);
-					colors.normal("}>");
-				}
-				for (const id of chunk.siblings) {
-					colors.normal(" ={");
-					colors.yellow(id);
-					colors.normal("}=");
-				}
-				for (const id of chunk.children) {
-					colors.normal(" >{");
-					colors.yellow(id);
-					colors.normal("}<");
-				}
-				if (chunk.childrenByOrder) {
-					for (const name of Object.keys(chunk.childrenByOrder)) {
-						const children = chunk.childrenByOrder[name];
-						colors.normal(" ");
-						colors.magenta(`(${name}:`);
-						for (const id of children) {
-							colors.normal(" {");
-							colors.yellow(id);
-							colors.normal("}");
-						}
-						colors.magenta(")");
-					}
-				}
-				if (chunk.entry) {
-					colors.yellow(" [entry]");
-				} else if (chunk.initial) {
-					colors.yellow(" [initial]");
-				}
-				if (chunk.rendered) {
-					colors.green(" [rendered]");
-				}
-				if (chunk.recorded) {
-					colors.green(" [recorded]");
-				}
-				if (chunk.reason) {
-					colors.yellow(` ${chunk.reason}`);
-				}
-				newline();
-				if (chunk.origins) {
-					for (const origin of chunk.origins) {
-						colors.normal("    > ");
-						if (origin.reasons && origin.reasons.length) {
-							colors.yellow(origin.reasons.join(" "));
-							colors.normal(" ");
-						}
-						if (origin.request) {
-							colors.normal(origin.request);
-							colors.normal(" ");
-						}
-						if (origin.module) {
-							colors.normal("[");
-							colors.normal(origin.moduleId);
-							colors.normal("] ");
-							const module = modulesByIdentifier[`$${origin.module}`];
-							if (module) {
-								colors.bold(module.name);
-								colors.normal(" ");
-							}
-						}
-						if (origin.loc) {
-							colors.normal(origin.loc);
-						}
-						newline();
-					}
-				}
-				processModulesList(chunk, " ");
-			}
-		}
-
-		processModulesList(obj, "");
-
-		if (obj._showWarnings && obj.warnings) {
-			for (const warning of obj.warnings) {
-				newline();
-				colors.yellow(`WARNING in ${warning}`);
-				newline();
-			}
-		}
-		if (obj._showErrors && obj.errors) {
-			for (const error of obj.errors) {
-				newline();
-				colors.red(`ERROR in ${error}`);
-				newline();
-			}
-		}
-		if (obj.children) {
-			for (const child of obj.children) {
-				const childString = Stats.jsonToString(child, useColors);
-				if (childString) {
-					if (child.name) {
-						colors.normal("Child ");
-						colors.bold(child.name);
-						colors.normal(":");
-					} else {
-						colors.normal("Child");
-					}
-					newline();
-					buf.push("    ");
-					buf.push(childString.replace(/\n/g, "\n    "));
-					newline();
-				}
-			}
-		}
-		if (obj.needAdditionalPass) {
-			colors.yellow(
-				"Compilation needs an additional pass and will compile again."
-			);
-		}
+		const normalizedOptions = this.compilation.createStatsOptions(options, {
+			forToString: true
+		});
 
-		while (buf[buf.length - 1] === "\n") {
-			buf.pop();
-		}
-		return buf.join("");
-	}
+		const statsFactory = this.compilation.createStatsFactory(normalizedOptions);
+		const statsPrinter = this.compilation.createStatsPrinter(normalizedOptions);
 
-	static presetToOptions(name) {
-		// Accepted values: none, errors-only, minimal, normal, detailed, verbose
-		// Any other falsy value will behave as 'none', truthy values as 'normal'
-		const pn =
-			(typeof name === "string" && name.toLowerCase()) || name || "none";
-		switch (pn) {
-			case "none":
-				return {
-					all: false
-				};
-			case "verbose":
-				return {
-					entrypoints: true,
-					chunkGroups: true,
-					modules: false,
-					chunks: true,
-					chunkModules: true,
-					chunkOrigins: true,
-					depth: true,
-					env: true,
-					reasons: true,
-					usedExports: true,
-					providedExports: true,
-					optimizationBailout: true,
-					errorDetails: true,
-					publicPath: true,
-					exclude: false,
-					maxModules: Infinity
-				};
-			case "detailed":
-				return {
-					entrypoints: true,
-					chunkGroups: true,
-					chunks: true,
-					chunkModules: false,
-					chunkOrigins: true,
-					depth: true,
-					usedExports: true,
-					providedExports: true,
-					optimizationBailout: true,
-					errorDetails: true,
-					publicPath: true,
-					exclude: false,
-					maxModules: Infinity
-				};
-			case "minimal":
-				return {
-					all: false,
-					modules: true,
-					maxModules: 0,
-					errors: true,
-					warnings: true
-				};
-			case "errors-only":
-				return {
-					all: false,
-					errors: true,
-					moduleTrace: true
-				};
-			default:
-				return {};
-		}
-	}
-
-	static getChildOptions(options, idx) {
-		let innerOptions;
-		if (Array.isArray(options.children)) {
-			if (idx < options.children.length) {
-				innerOptions = options.children[idx];
-			}
-		} else if (typeof options.children === "object" && options.children) {
-			innerOptions = options.children;
-		}
-		if (typeof innerOptions === "boolean" || typeof innerOptions === "string") {
-			innerOptions = Stats.presetToOptions(innerOptions);
-		}
-		if (!innerOptions) {
-			return options;
-		}
-		const childOptions = Object.assign({}, options);
-		delete childOptions.children; // do not inherit children
-		return Object.assign(childOptions, innerOptions);
+		const data = statsFactory.create("compilation", this.compilation, {
+			compilation: this.compilation
+		});
+		const result = statsPrinter.print("compilation", data);
+		return result === undefined ? "" : result;
 	}
 }
 
diff --git a/lib/Template.js b/lib/Template.js
index adb16836499..6ca6f1205ac 100644
--- a/lib/Template.js
+++ b/lib/Template.js
@@ -2,17 +2,37 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
-/** @typedef {import("./Module")} Module */
+
+"use strict";
+
+const { ConcatSource, PrefixSource } = require("webpack-sources");
+const { WEBPACK_MODULE_TYPE_RUNTIME } = require("./ModuleTypeConstants");
+const RuntimeGlobals = require("./RuntimeGlobals");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../declarations/WebpackOptions").Output} OutputOptions */
 /** @typedef {import("./Chunk")} Chunk */
+/** @typedef {import("./ChunkGraph")} ChunkGraph */
+/** @typedef {import("./ChunkGraph").ModuleId} ModuleId */
+/** @typedef {import("./CodeGenerationResults")} CodeGenerationResults */
+/** @typedef {import("./Compilation").AssetInfo} AssetInfo */
+/** @typedef {import("./Compilation").PathData} PathData */
+/** @typedef {import("./DependencyTemplates")} DependencyTemplates */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./ModuleGraph")} ModuleGraph */
 /** @typedef {import("./ModuleTemplate")} ModuleTemplate */
-/** @typedef {import("webpack-sources").ConcatSource} ConcatSource */
-
-const { ConcatSource } = require("webpack-sources");
-const HotUpdateChunk = require("./HotUpdateChunk");
+/** @typedef {import("./RuntimeModule")} RuntimeModule */
+/** @typedef {import("./RuntimeTemplate")} RuntimeTemplate */
+/** @typedef {import("./TemplatedPathPlugin").TemplatePath} TemplatePath */
+/** @typedef {import("./javascript/JavascriptModulesPlugin").ChunkRenderContext} ChunkRenderContext */
+/** @typedef {import("./javascript/JavascriptModulesPlugin").RenderContext} RenderContext */
 
 const START_LOWERCASE_ALPHABET_CODE = "a".charCodeAt(0);
 const START_UPPERCASE_ALPHABET_CODE = "A".charCodeAt(0);
 const DELTA_A_TO_Z = "z".charCodeAt(0) - START_LOWERCASE_ALPHABET_CODE + 1;
+const NUMBER_OF_IDENTIFIER_START_CHARS = DELTA_A_TO_Z * 2 + 2; // a-z A-Z _ $
+const NUMBER_OF_IDENTIFIER_CONTINUATION_CHARS =
+	NUMBER_OF_IDENTIFIER_START_CHARS + 10; // a-z A-Z _ $ 0-9
 const FUNCTION_CONTENT_REGEX = /^function\s?\(\)\s?\{\r?\n?|\r?\n?\}$/g;
 const INDENT_MULTILINE_REGEX = /^\t/gm;
 const LINE_SEPARATOR_REGEX = /\r?\n/g;
@@ -22,34 +42,56 @@ const COMMENT_END_REGEX = /\*\//g;
 const PATH_NAME_NORMALIZE_REPLACE_REGEX = /[^a-zA-Z0-9_!§$()=\-^°]+/g;
 const MATCH_PADDED_HYPHENS_REPLACE_REGEX = /^-|-$/g;
 
-/** @typedef {import("webpack-sources").Source} Source */
+/**
+ * @typedef {object} RenderManifestOptions
+ * @property {Chunk} chunk the chunk used to render
+ * @property {string} hash
+ * @property {string} fullHash
+ * @property {OutputOptions} outputOptions
+ * @property {CodeGenerationResults} codeGenerationResults
+ * @property {{javascript: ModuleTemplate}} moduleTemplates
+ * @property {DependencyTemplates} dependencyTemplates
+ * @property {RuntimeTemplate} runtimeTemplate
+ * @property {ModuleGraph} moduleGraph
+ * @property {ChunkGraph} chunkGraph
+ */
+
+/** @typedef {RenderManifestEntryTemplated | RenderManifestEntryStatic} RenderManifestEntry */
 
 /**
- * @typedef {Object} HasId
- * @property {number | string} id
+ * @typedef {object} RenderManifestEntryTemplated
+ * @property {() => Source} render
+ * @property {TemplatePath} filenameTemplate
+ * @property {PathData=} pathOptions
+ * @property {AssetInfo=} info
+ * @property {string} identifier
+ * @property {string=} hash
+ * @property {boolean=} auxiliary
+ */
+
+/**
+ * @typedef {object} RenderManifestEntryStatic
+ * @property {() => Source} render
+ * @property {string} filename
+ * @property {AssetInfo} info
+ * @property {string} identifier
+ * @property {string=} hash
+ * @property {boolean=} auxiliary
  */
 
 /**
- * @typedef {function(Module, number): boolean} ModuleFilterPredicate
+ * @typedef {object} HasId
+ * @property {number | string} id
  */
 
 /**
- * @param {HasId} a first id object to be sorted
- * @param {HasId} b second id object to be sorted against
- * @returns {-1|0|1} the sort value
+ * @typedef {(module: Module) => boolean} ModuleFilterPredicate
  */
-const stringifyIdSortPredicate = (a, b) => {
-	const aId = a.id + "";
-	const bId = b.id + "";
-	if (aId < bId) return -1;
-	if (aId > bId) return 1;
-	return 0;
-};
 
 class Template {
 	/**
-	 *
-	 * @param {Function} fn - a runtime function (.runtime.js) "template"
+	 * @template {EXPECTED_FUNCTION} T
+	 * @param {T} fn a runtime function (.runtime.js) "template"
 	 * @returns {string} the updated and normalized function string
 	 */
 	static getFunctionContent(fn) {
@@ -70,8 +112,8 @@ class Template {
 			.replace(IDENTIFIER_NAME_REPLACE_REGEX, "_$1")
 			.replace(IDENTIFIER_ALPHA_NUMERIC_NAME_REPLACE_REGEX, "_");
 	}
+
 	/**
-	 *
 	 * @param {string} str string to be converted to commented in bundle code
 	 * @returns {string} returns a commented version of string
 	 */
@@ -81,7 +123,6 @@ class Template {
 	}
 
 	/**
-	 *
 	 * @param {string} str string to be converted to "normal comment"
 	 * @returns {string} returns a commented version of string
 	 */
@@ -101,50 +142,90 @@ class Template {
 			.replace(MATCH_PADDED_HYPHENS_REPLACE_REGEX, "");
 	}
 
-	// map number to a single character a-z, A-Z or <_ + number> if number is too big
+	// map number to a single character a-z, A-Z or multiple characters if number is too big
 	/**
-	 *
 	 * @param {number} n number to convert to ident
 	 * @returns {string} returns single character ident
 	 */
-	static numberToIdentifer(n) {
+	static numberToIdentifier(n) {
+		if (n >= NUMBER_OF_IDENTIFIER_START_CHARS) {
+			// use multiple letters
+			return (
+				Template.numberToIdentifier(n % NUMBER_OF_IDENTIFIER_START_CHARS) +
+				Template.numberToIdentifierContinuation(
+					Math.floor(n / NUMBER_OF_IDENTIFIER_START_CHARS)
+				)
+			);
+		}
+
 		// lower case
 		if (n < DELTA_A_TO_Z) {
 			return String.fromCharCode(START_LOWERCASE_ALPHABET_CODE + n);
 		}
+		n -= DELTA_A_TO_Z;
 
 		// upper case
-		if (n < DELTA_A_TO_Z * 2) {
-			return String.fromCharCode(
-				START_UPPERCASE_ALPHABET_CODE + n - DELTA_A_TO_Z
+		if (n < DELTA_A_TO_Z) {
+			return String.fromCharCode(START_UPPERCASE_ALPHABET_CODE + n);
+		}
+
+		if (n === DELTA_A_TO_Z) return "_";
+		return "$";
+	}
+
+	/**
+	 * @param {number} n number to convert to ident
+	 * @returns {string} returns single character ident
+	 */
+	static numberToIdentifierContinuation(n) {
+		if (n >= NUMBER_OF_IDENTIFIER_CONTINUATION_CHARS) {
+			// use multiple letters
+			return (
+				Template.numberToIdentifierContinuation(
+					n % NUMBER_OF_IDENTIFIER_CONTINUATION_CHARS
+				) +
+				Template.numberToIdentifierContinuation(
+					Math.floor(n / NUMBER_OF_IDENTIFIER_CONTINUATION_CHARS)
+				)
 			);
 		}
 
-		// use multiple letters
-		return (
-			Template.numberToIdentifer(n % (2 * DELTA_A_TO_Z)) +
-			Template.numberToIdentifer(Math.floor(n / (2 * DELTA_A_TO_Z)))
-		);
+		// lower case
+		if (n < DELTA_A_TO_Z) {
+			return String.fromCharCode(START_LOWERCASE_ALPHABET_CODE + n);
+		}
+		n -= DELTA_A_TO_Z;
+
+		// upper case
+		if (n < DELTA_A_TO_Z) {
+			return String.fromCharCode(START_UPPERCASE_ALPHABET_CODE + n);
+		}
+		n -= DELTA_A_TO_Z;
+
+		// numbers
+		if (n < 10) {
+			return `${n}`;
+		}
+
+		if (n === 10) return "_";
+		return "$";
 	}
 
 	/**
-	 *
 	 * @param {string | string[]} s string to convert to identity
 	 * @returns {string} converted identity
 	 */
 	static indent(s) {
 		if (Array.isArray(s)) {
 			return s.map(Template.indent).join("\n");
-		} else {
-			const str = s.trimRight();
-			if (!str) return "";
-			const ind = str[0] === "\n" ? "" : "\t";
-			return ind + str.replace(/\n([^\n])/g, "\n\t$1");
 		}
+		const str = s.trimEnd();
+		if (!str) return "";
+		const ind = str[0] === "\n" ? "" : "\t";
+		return ind + str.replace(/\n([^\n])/g, "\n\t$1");
 	}
 
 	/**
-	 *
 	 * @param {string|string[]} s string to create prefix for
 	 * @param {string} prefix prefix to compose
 	 * @returns {string} returns new prefix string
@@ -153,11 +234,10 @@ class Template {
 		const str = Template.asString(s).trim();
 		if (!str) return "";
 		const ind = str[0] === "\n" ? "" : prefix;
-		return ind + str.replace(/\n([^\n])/g, "\n" + prefix + "$1");
+		return ind + str.replace(/\n([^\n])/g, `\n${prefix}$1`);
 	}
 
 	/**
-	 *
 	 * @param {string|string[]} str string or string collection
 	 * @returns {string} returns a single string from array
 	 */
@@ -169,8 +249,8 @@ class Template {
 	}
 
 	/**
-	 * @typedef {Object} WithId
-	 * @property {string|number} id
+	 * @typedef {object} WithId
+	 * @property {string | number} id
 	 */
 
 	/**
@@ -182,67 +262,44 @@ class Template {
 		let maxId = -Infinity;
 		let minId = Infinity;
 		for (const module of modules) {
-			if (typeof module.id !== "number") return false;
-			if (maxId < module.id) maxId = /** @type {number} */ (module.id);
-			if (minId > module.id) minId = /** @type {number} */ (module.id);
+			const moduleId = module.id;
+			if (typeof moduleId !== "number") return false;
+			if (maxId < moduleId) maxId = moduleId;
+			if (minId > moduleId) minId = moduleId;
 		}
-		if (minId < 16 + ("" + minId).length) {
+		if (minId < 16 + String(minId).length) {
 			// add minId x ',' instead of 'Array(minId).concat(…)'
 			minId = 0;
 		}
-		const objectOverhead = modules
-			.map(module => (module.id + "").length + 2)
-			.reduce((a, b) => a + b, -1);
-		const arrayOverhead =
-			minId === 0 ? maxId : 16 + ("" + minId).length + maxId;
+		// start with -1 because the first module needs no comma
+		let objectOverhead = -1;
+		for (const module of modules) {
+			// module id + colon + comma
+			objectOverhead += `${module.id}`.length + 2;
+		}
+		// number of commas, or when starting non-zero the length of Array(minId).concat()
+		const arrayOverhead = minId === 0 ? maxId : 16 + `${minId}`.length + maxId;
 		return arrayOverhead < objectOverhead ? [minId, maxId] : false;
 	}
 
 	/**
-	 * @param {Chunk} chunk chunk whose modules will be rendered
-	 * @param {ModuleFilterPredicate} filterFn function used to filter modules from chunk to render
-	 * @param {ModuleTemplate} moduleTemplate ModuleTemplate instance used to render modules
-	 * @param {TODO | TODO[]} dependencyTemplates templates needed for each module to render dependencies
+	 * @param {ChunkRenderContext} renderContext render context
+	 * @param {Module[]} modules modules to render (should be ordered by identifier)
+	 * @param {(module: Module) => Source | null} renderModule function to render a module
 	 * @param {string=} prefix applying prefix strings
-	 * @returns {ConcatSource} rendered chunk modules in a Source object
+	 * @returns {Source | null} rendered chunk modules in a Source object or null if no modules
 	 */
-	static renderChunkModules(
-		chunk,
-		filterFn,
-		moduleTemplate,
-		dependencyTemplates,
-		prefix = ""
-	) {
+	static renderChunkModules(renderContext, modules, renderModule, prefix = "") {
+		const { chunkGraph } = renderContext;
 		const source = new ConcatSource();
-		const modules = chunk.getModules().filter(filterFn);
-		let removedModules;
-		if (chunk instanceof HotUpdateChunk) {
-			removedModules = chunk.removedModules;
-		}
-		if (
-			modules.length === 0 &&
-			(!removedModules || removedModules.length === 0)
-		) {
-			source.add("[]");
-			return source;
+		if (modules.length === 0) {
+			return null;
 		}
 		/** @type {{id: string|number, source: Source|string}[]} */
-		const allModules = modules.map(module => {
-			return {
-				id: module.id,
-				source: moduleTemplate.render(module, dependencyTemplates, {
-					chunk
-				})
-			};
-		});
-		if (removedModules && removedModules.length > 0) {
-			for (const id of removedModules) {
-				allModules.push({
-					id,
-					source: "false"
-				});
-			}
-		}
+		const allModules = modules.map(module => ({
+			id: /** @type {ModuleId} */ (chunkGraph.getModuleId(module)),
+			source: renderModule(module) || "false"
+		}));
 		const bounds = Template.getModulesArrayBounds(allModules);
 		if (bounds) {
 			// Render a spare array
@@ -268,24 +325,92 @@ class Template {
 					source.add(module.source);
 				}
 			}
-			source.add("\n" + prefix + "]");
+			source.add(`\n${prefix}]`);
 			if (minId !== 0) {
 				source.add(")");
 			}
 		} else {
 			// Render an object
 			source.add("{\n");
-			allModules.sort(stringifyIdSortPredicate).forEach((module, idx) => {
-				if (idx !== 0) {
+			for (let i = 0; i < allModules.length; i++) {
+				const module = allModules[i];
+				if (i !== 0) {
 					source.add(",\n");
 				}
 				source.add(`\n/***/ ${JSON.stringify(module.id)}:\n`);
 				source.add(module.source);
-			});
+			}
 			source.add(`\n\n${prefix}}`);
 		}
 		return source;
 	}
+
+	/**
+	 * @param {RuntimeModule[]} runtimeModules array of runtime modules in order
+	 * @param {RenderContext & { codeGenerationResults?: CodeGenerationResults }} renderContext render context
+	 * @returns {Source} rendered runtime modules in a Source object
+	 */
+	static renderRuntimeModules(runtimeModules, renderContext) {
+		const source = new ConcatSource();
+		for (const module of runtimeModules) {
+			const codeGenerationResults = renderContext.codeGenerationResults;
+			let runtimeSource;
+			if (codeGenerationResults) {
+				runtimeSource = codeGenerationResults.getSource(
+					module,
+					renderContext.chunk.runtime,
+					WEBPACK_MODULE_TYPE_RUNTIME
+				);
+			} else {
+				const codeGenResult = module.codeGeneration({
+					chunkGraph: renderContext.chunkGraph,
+					dependencyTemplates: renderContext.dependencyTemplates,
+					moduleGraph: renderContext.moduleGraph,
+					runtimeTemplate: renderContext.runtimeTemplate,
+					runtime: renderContext.chunk.runtime,
+					codeGenerationResults
+				});
+				if (!codeGenResult) continue;
+				runtimeSource = codeGenResult.sources.get("runtime");
+			}
+			if (runtimeSource) {
+				source.add(`${Template.toNormalComment(module.identifier())}\n`);
+				if (!module.shouldIsolate()) {
+					source.add(runtimeSource);
+					source.add("\n\n");
+				} else if (renderContext.runtimeTemplate.supportsArrowFunction()) {
+					source.add("(() => {\n");
+					source.add(new PrefixSource("\t", runtimeSource));
+					source.add("\n})();\n\n");
+				} else {
+					source.add("!function() {\n");
+					source.add(new PrefixSource("\t", runtimeSource));
+					source.add("\n}();\n\n");
+				}
+			}
+		}
+		return source;
+	}
+
+	/**
+	 * @param {RuntimeModule[]} runtimeModules array of runtime modules in order
+	 * @param {RenderContext} renderContext render context
+	 * @returns {Source} rendered chunk runtime modules in a Source object
+	 */
+	static renderChunkRuntimeModules(runtimeModules, renderContext) {
+		return new PrefixSource(
+			"/******/ ",
+			new ConcatSource(
+				`function(${RuntimeGlobals.require}) { // webpackRuntimeModules\n`,
+				this.renderRuntimeModules(runtimeModules, renderContext),
+				"}\n"
+			)
+		);
+	}
 }
 
 module.exports = Template;
+module.exports.NUMBER_OF_IDENTIFIER_START_CHARS =
+	NUMBER_OF_IDENTIFIER_START_CHARS;
+module.exports.NUMBER_OF_IDENTIFIER_CONTINUATION_CHARS =
+	NUMBER_OF_IDENTIFIER_CONTINUATION_CHARS;
diff --git a/lib/TemplatedPathPlugin.js b/lib/TemplatedPathPlugin.js
index 8cd1ef40a44..4f79169c34e 100644
--- a/lib/TemplatedPathPlugin.js
+++ b/lib/TemplatedPathPlugin.js
@@ -2,170 +2,395 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Jason Anderson @diurnalist
 */
+
 "use strict";
 
-const REGEXP_HASH = /\[hash(?::(\d+))?\]/gi,
-	REGEXP_CHUNKHASH = /\[chunkhash(?::(\d+))?\]/gi,
-	REGEXP_MODULEHASH = /\[modulehash(?::(\d+))?\]/gi,
-	REGEXP_CONTENTHASH = /\[contenthash(?::(\d+))?\]/gi,
-	REGEXP_NAME = /\[name\]/gi,
-	REGEXP_ID = /\[id\]/gi,
-	REGEXP_MODULEID = /\[moduleid\]/gi,
-	REGEXP_FILE = /\[file\]/gi,
-	REGEXP_QUERY = /\[query\]/gi,
-	REGEXP_FILEBASE = /\[filebase\]/gi;
-
-// Using global RegExp for .test is dangerous
-// We use a normal RegExp instead of .test
-const REGEXP_HASH_FOR_TEST = new RegExp(REGEXP_HASH.source, "i"),
-	REGEXP_CHUNKHASH_FOR_TEST = new RegExp(REGEXP_CHUNKHASH.source, "i"),
-	REGEXP_CONTENTHASH_FOR_TEST = new RegExp(REGEXP_CONTENTHASH.source, "i"),
-	REGEXP_NAME_FOR_TEST = new RegExp(REGEXP_NAME.source, "i");
-
-const withHashLength = (replacer, handlerFn) => {
-	const fn = (match, hashLength, ...args) => {
-		const length = hashLength && parseInt(hashLength, 10);
-		if (length && handlerFn) {
-			return handlerFn(length);
+const mime = require("mime-types");
+const { basename, extname } = require("path");
+const util = require("util");
+const Chunk = require("./Chunk");
+const Module = require("./Module");
+const { parseResource } = require("./util/identifier");
+
+/** @typedef {import("./ChunkGraph")} ChunkGraph */
+/** @typedef {import("./ChunkGraph").ModuleId} ModuleId */
+/** @typedef {import("./Compilation").AssetInfo} AssetInfo */
+/** @typedef {import("./Compilation").PathData} PathData */
+/** @typedef {import("./Compiler")} Compiler */
+
+const REGEXP = /\[\\*([\w:]+)\\*\]/gi;
+
+/**
+ * @param {string | number} id id
+ * @returns {string | number} result
+ */
+const prepareId = id => {
+	if (typeof id !== "string") return id;
+
+	if (/^"\s\+*.*\+\s*"$/.test(id)) {
+		const match = /^"\s\+*\s*(.*)\s*\+\s*"$/.exec(id);
+
+		return `" + (${
+			/** @type {string[]} */ (match)[1]
+		} + "").replace(/(^[.-]|[^a-zA-Z0-9_-])+/g, "_") + "`;
+	}
+
+	return id.replace(/(^[.-]|[^a-zA-Z0-9_-])+/g, "_");
+};
+
+/**
+ * @callback ReplacerFunction
+ * @param {string} match
+ * @param {string | undefined} arg
+ * @param {string} input
+ */
+
+/**
+ * @param {ReplacerFunction} replacer replacer
+ * @param {((arg0: number) => string) | undefined} handler handler
+ * @param {AssetInfo | undefined} assetInfo asset info
+ * @param {string} hashName hash name
+ * @returns {Replacer} hash replacer function
+ */
+const hashLength = (replacer, handler, assetInfo, hashName) => {
+	/** @type {Replacer} */
+	const fn = (match, arg, input) => {
+		let result;
+		const length = arg && Number.parseInt(arg, 10);
+
+		if (length && handler) {
+			result = handler(length);
+		} else {
+			const hash = replacer(match, arg, input);
+
+			result = length ? hash.slice(0, length) : hash;
+		}
+		if (assetInfo) {
+			assetInfo.immutable = true;
+			if (Array.isArray(assetInfo[hashName])) {
+				assetInfo[hashName] = [...assetInfo[hashName], result];
+			} else if (assetInfo[hashName]) {
+				assetInfo[hashName] = [assetInfo[hashName], result];
+			} else {
+				assetInfo[hashName] = result;
+			}
 		}
-		const hash = replacer(match, hashLength, ...args);
-		return length ? hash.slice(0, length) : hash;
+		return result;
 	};
+
 	return fn;
 };
 
-const getReplacer = (value, allowEmpty) => {
-	const fn = (match, ...args) => {
-		// last argument in replacer is the entire input string
-		const input = args[args.length - 1];
+/** @typedef {(match: string, arg: string | undefined, input: string) => string} Replacer */
+
+/**
+ * @param {string | number | null | undefined | (() => string | number | null | undefined)} value value
+ * @param {boolean=} allowEmpty allow empty
+ * @returns {Replacer} replacer
+ */
+const replacer = (value, allowEmpty) => {
+	/** @type {Replacer} */
+	const fn = (match, arg, input) => {
+		if (typeof value === "function") {
+			value = value();
+		}
 		if (value === null || value === undefined) {
 			if (!allowEmpty) {
 				throw new Error(
 					`Path variable ${match} not implemented in this context: ${input}`
 				);
 			}
+
 			return "";
-		} else {
-			return `${value}`;
 		}
+
+		return `${value}`;
 	};
+
 	return fn;
 };
 
-const replacePathVariables = (path, data) => {
-	const chunk = data.chunk;
-	const chunkId = chunk && chunk.id;
-	const chunkName = chunk && (chunk.name || chunk.id);
-	const chunkHash = chunk && (chunk.renderedHash || chunk.hash);
-	const chunkHashWithLength = chunk && chunk.hashWithLength;
-	const contentHashType = data.contentHashType;
-	const contentHash =
-		(chunk && chunk.contentHash && chunk.contentHash[contentHashType]) ||
-		data.contentHash;
-	const contentHashWithLength =
-		(chunk &&
-			chunk.contentHashWithLength &&
-			chunk.contentHashWithLength[contentHashType]) ||
-		data.contentHashWithLength;
-	const module = data.module;
-	const moduleId = module && module.id;
-	const moduleHash = module && (module.renderedHash || module.hash);
-	const moduleHashWithLength = module && module.hashWithLength;
+const deprecationCache = new Map();
+const deprecatedFunction = (() => () => {})();
+/**
+ * @template {(...args: EXPECTED_ANY[]) => EXPECTED_ANY} T
+ * @param {T} fn function
+ * @param {string} message message
+ * @param {string} code code
+ * @returns {T} function with deprecation output
+ */
+const deprecated = (fn, message, code) => {
+	let d = deprecationCache.get(message);
+	if (d === undefined) {
+		d = util.deprecate(deprecatedFunction, message, code);
+		deprecationCache.set(message, d);
+	}
+	return /** @type {T} */ (
+		(...args) => {
+			d();
+			return fn(...args);
+		}
+	);
+};
+
+/** @typedef {string | ((pathData: PathData, assetInfo?: AssetInfo) => string)} TemplatePath */
 
-	if (typeof path === "function") {
-		path = path(data);
+/**
+ * @param {TemplatePath} path the raw path
+ * @param {PathData} data context data
+ * @param {AssetInfo | undefined} assetInfo extra info about the asset (will be written to)
+ * @returns {string} the interpolated path
+ */
+const replacePathVariables = (path, data, assetInfo) => {
+	const chunkGraph = data.chunkGraph;
+
+	/** @type {Map} */
+	const replacements = new Map();
+
+	// Filename context
+	//
+	// Placeholders
+	//
+	// for /some/path/file.js?query#fragment:
+	// [file] - /some/path/file.js
+	// [query] - ?query
+	// [fragment] - #fragment
+	// [base] - file.js
+	// [path] - /some/path/
+	// [name] - file
+	// [ext] - .js
+	if (typeof data.filename === "string") {
+		// check that filename is data uri
+		const match = data.filename.match(/^data:([^;,]+)/);
+		if (match) {
+			const ext = mime.extension(match[1]);
+			const emptyReplacer = replacer("", true);
+			// "XXXX" used for `updateHash`, so we don't need it here
+			const contentHash =
+				data.contentHash && !/X+/.test(data.contentHash)
+					? data.contentHash
+					: false;
+			const baseReplacer = contentHash ? replacer(contentHash) : emptyReplacer;
+
+			replacements.set("file", emptyReplacer);
+			replacements.set("query", emptyReplacer);
+			replacements.set("fragment", emptyReplacer);
+			replacements.set("path", emptyReplacer);
+			replacements.set("base", baseReplacer);
+			replacements.set("name", baseReplacer);
+			replacements.set("ext", replacer(ext ? `.${ext}` : "", true));
+			// Legacy
+			replacements.set(
+				"filebase",
+				deprecated(
+					baseReplacer,
+					"[filebase] is now [base]",
+					"DEP_WEBPACK_TEMPLATE_PATH_PLUGIN_REPLACE_PATH_VARIABLES_FILENAME"
+				)
+			);
+		} else {
+			const { path: file, query, fragment } = parseResource(data.filename);
+
+			const ext = extname(file);
+			const base = basename(file);
+			const name = base.slice(0, base.length - ext.length);
+			const path = file.slice(0, file.length - base.length);
+
+			replacements.set("file", replacer(file));
+			replacements.set("query", replacer(query, true));
+			replacements.set("fragment", replacer(fragment, true));
+			replacements.set("path", replacer(path, true));
+			replacements.set("base", replacer(base));
+			replacements.set("name", replacer(name));
+			replacements.set("ext", replacer(ext, true));
+			// Legacy
+			replacements.set(
+				"filebase",
+				deprecated(
+					replacer(base),
+					"[filebase] is now [base]",
+					"DEP_WEBPACK_TEMPLATE_PATH_PLUGIN_REPLACE_PATH_VARIABLES_FILENAME"
+				)
+			);
+		}
 	}
 
-	if (
-		data.noChunkHash &&
-		(REGEXP_CHUNKHASH_FOR_TEST.test(path) ||
-			REGEXP_CONTENTHASH_FOR_TEST.test(path))
-	) {
-		throw new Error(
-			`Cannot use [chunkhash] or [contenthash] for chunk in '${path}' (use [hash] instead)`
+	// Compilation context
+	//
+	// Placeholders
+	//
+	// [fullhash] - data.hash (3a4b5c6e7f)
+	//
+	// Legacy Placeholders
+	//
+	// [hash] - data.hash (3a4b5c6e7f)
+	if (data.hash) {
+		const hashReplacer = hashLength(
+			replacer(data.hash),
+			data.hashWithLength,
+			assetInfo,
+			"fullhash"
 		);
-	}
 
-	return (
-		path
-			.replace(
-				REGEXP_HASH,
-				withHashLength(getReplacer(data.hash), data.hashWithLength)
-			)
-			.replace(
-				REGEXP_CHUNKHASH,
-				withHashLength(getReplacer(chunkHash), chunkHashWithLength)
+		replacements.set("fullhash", hashReplacer);
+
+		// Legacy
+		replacements.set(
+			"hash",
+			deprecated(
+				hashReplacer,
+				"[hash] is now [fullhash] (also consider using [chunkhash] or [contenthash], see documentation for details)",
+				"DEP_WEBPACK_TEMPLATE_PATH_PLUGIN_REPLACE_PATH_VARIABLES_HASH"
 			)
-			.replace(
-				REGEXP_CONTENTHASH,
-				withHashLength(getReplacer(contentHash), contentHashWithLength)
+		);
+	}
+
+	// Chunk Context
+	//
+	// Placeholders
+	//
+	// [id] - chunk.id (0.js)
+	// [name] - chunk.name (app.js)
+	// [chunkhash] - chunk.hash (7823t4t4.js)
+	// [contenthash] - chunk.contentHash[type] (3256u3zg.js)
+	if (data.chunk) {
+		const chunk = data.chunk;
+
+		const contentHashType = data.contentHashType;
+
+		const idReplacer = replacer(chunk.id);
+		const nameReplacer = replacer(chunk.name || chunk.id);
+		const chunkhashReplacer = hashLength(
+			replacer(chunk instanceof Chunk ? chunk.renderedHash : chunk.hash),
+			"hashWithLength" in chunk ? chunk.hashWithLength : undefined,
+			assetInfo,
+			"chunkhash"
+		);
+		const contenthashReplacer = hashLength(
+			replacer(
+				data.contentHash ||
+					(contentHashType &&
+						chunk.contentHash &&
+						chunk.contentHash[contentHashType])
+			),
+			data.contentHashWithLength ||
+				("contentHashWithLength" in chunk && chunk.contentHashWithLength
+					? chunk.contentHashWithLength[/** @type {string} */ (contentHashType)]
+					: undefined),
+			assetInfo,
+			"contenthash"
+		);
+
+		replacements.set("id", idReplacer);
+		replacements.set("name", nameReplacer);
+		replacements.set("chunkhash", chunkhashReplacer);
+		replacements.set("contenthash", contenthashReplacer);
+	}
+
+	// Module Context
+	//
+	// Placeholders
+	//
+	// [id] - module.id (2.png)
+	// [hash] - module.hash (6237543873.png)
+	//
+	// Legacy Placeholders
+	//
+	// [moduleid] - module.id (2.png)
+	// [modulehash] - module.hash (6237543873.png)
+	if (data.module) {
+		const module = data.module;
+
+		const idReplacer = replacer(() =>
+			prepareId(
+				module instanceof Module
+					? /** @type {ModuleId} */
+						(/** @type {ChunkGraph} */ (chunkGraph).getModuleId(module))
+					: module.id
 			)
-			.replace(
-				REGEXP_MODULEHASH,
-				withHashLength(getReplacer(moduleHash), moduleHashWithLength)
+		);
+		const moduleHashReplacer = hashLength(
+			replacer(() =>
+				module instanceof Module
+					? /** @type {ChunkGraph} */
+						(chunkGraph).getRenderedModuleHash(module, data.runtime)
+					: module.hash
+			),
+			"hashWithLength" in module ? module.hashWithLength : undefined,
+			assetInfo,
+			"modulehash"
+		);
+		const contentHashReplacer = hashLength(
+			replacer(/** @type {string} */ (data.contentHash)),
+			undefined,
+			assetInfo,
+			"contenthash"
+		);
+
+		replacements.set("id", idReplacer);
+		replacements.set("modulehash", moduleHashReplacer);
+		replacements.set("contenthash", contentHashReplacer);
+		replacements.set(
+			"hash",
+			data.contentHash ? contentHashReplacer : moduleHashReplacer
+		);
+		// Legacy
+		replacements.set(
+			"moduleid",
+			deprecated(
+				idReplacer,
+				"[moduleid] is now [id]",
+				"DEP_WEBPACK_TEMPLATE_PATH_PLUGIN_REPLACE_PATH_VARIABLES_MODULE_ID"
 			)
-			.replace(REGEXP_ID, getReplacer(chunkId))
-			.replace(REGEXP_MODULEID, getReplacer(moduleId))
-			.replace(REGEXP_NAME, getReplacer(chunkName))
-			.replace(REGEXP_FILE, getReplacer(data.filename))
-			.replace(REGEXP_FILEBASE, getReplacer(data.basename))
-			// query is optional, it's OK if it's in a path but there's nothing to replace it with
-			.replace(REGEXP_QUERY, getReplacer(data.query, true))
-	);
-};
+		);
+	}
 
-class TemplatedPathPlugin {
-	apply(compiler) {
-		compiler.hooks.compilation.tap("TemplatedPathPlugin", compilation => {
-			const mainTemplate = compilation.mainTemplate;
+	// Other things
+	if (data.url) {
+		replacements.set("url", replacer(data.url));
+	}
+	if (typeof data.runtime === "string") {
+		replacements.set(
+			"runtime",
+			replacer(() => prepareId(/** @type {string} */ (data.runtime)))
+		);
+	} else {
+		replacements.set("runtime", replacer("_"));
+	}
 
-			mainTemplate.hooks.assetPath.tap(
-				"TemplatedPathPlugin",
-				replacePathVariables
-			);
+	if (typeof path === "function") {
+		path = path(data, assetInfo);
+	}
 
-			mainTemplate.hooks.globalHash.tap(
-				"TemplatedPathPlugin",
-				(chunk, paths) => {
-					const outputOptions = mainTemplate.outputOptions;
-					const publicPath = outputOptions.publicPath || "";
-					const filename = outputOptions.filename || "";
-					const chunkFilename =
-						outputOptions.chunkFilename || outputOptions.filename;
-					if (
-						REGEXP_HASH_FOR_TEST.test(publicPath) ||
-						REGEXP_CHUNKHASH_FOR_TEST.test(publicPath) ||
-						REGEXP_CONTENTHASH_FOR_TEST.test(publicPath) ||
-						REGEXP_NAME_FOR_TEST.test(publicPath)
-					)
-						return true;
-					if (REGEXP_HASH_FOR_TEST.test(filename)) return true;
-					if (REGEXP_HASH_FOR_TEST.test(chunkFilename)) return true;
-					if (REGEXP_HASH_FOR_TEST.test(paths.join("|"))) return true;
-				}
-			);
+	path = path.replace(REGEXP, (match, content) => {
+		if (content.length + 2 === match.length) {
+			const contentMatch = /^(\w+)(?::(\w+))?$/.exec(content);
+			if (!contentMatch) return match;
+			const [, kind, arg] = contentMatch;
+			const replacer = replacements.get(kind);
+			if (replacer !== undefined) {
+				return replacer(match, arg, /** @type {string} */ (path));
+			}
+		} else if (match.startsWith("[\\") && match.endsWith("\\]")) {
+			return `[${match.slice(2, -2)}]`;
+		}
+		return match;
+	});
 
-			mainTemplate.hooks.hashForChunk.tap(
-				"TemplatedPathPlugin",
-				(hash, chunk) => {
-					const outputOptions = mainTemplate.outputOptions;
-					const chunkFilename =
-						outputOptions.chunkFilename || outputOptions.filename;
-					if (REGEXP_CHUNKHASH_FOR_TEST.test(chunkFilename)) {
-						hash.update(JSON.stringify(chunk.getChunkMaps(true).hash));
-					}
-					if (REGEXP_CONTENTHASH_FOR_TEST.test(chunkFilename)) {
-						hash.update(
-							JSON.stringify(
-								chunk.getChunkMaps(true).contentHash.javascript || {}
-							)
-						);
-					}
-					if (REGEXP_NAME_FOR_TEST.test(chunkFilename)) {
-						hash.update(JSON.stringify(chunk.getChunkMaps(true).name));
-					}
-				}
-			);
+	return path;
+};
+
+const plugin = "TemplatedPathPlugin";
+
+class TemplatedPathPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(plugin, compilation => {
+			compilation.hooks.assetPath.tap(plugin, replacePathVariables);
 		});
 	}
 }
diff --git a/lib/UmdMainTemplatePlugin.js b/lib/UmdMainTemplatePlugin.js
deleted file mode 100644
index ba5d24a2bdd..00000000000
--- a/lib/UmdMainTemplatePlugin.js
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const { ConcatSource, OriginalSource } = require("webpack-sources");
-const Template = require("./Template");
-
-/** @typedef {import("../declarations/WebpackOptions").LibraryCustomUmdObject} LibraryCustomUmdObject */
-/** @typedef {import("./Compilation")} Compilation */
-
-/**
- * @param {string[]} accessor the accessor to convert to path
- * @returns {string} the path
- */
-const accessorToObjectAccess = accessor => {
-	return accessor.map(a => `[${JSON.stringify(a)}]`).join("");
-};
-
-/**
- * @param {string=} base the path prefix
- * @param {string|string[]} accessor the accessor
- * @param {string=} joinWith the element separator
- * @returns {string} the path
- */
-const accessorAccess = (base, accessor, joinWith = ", ") => {
-	const accessors = Array.isArray(accessor) ? accessor : [accessor];
-	return accessors
-		.map((_, idx) => {
-			const a = base
-				? base + accessorToObjectAccess(accessors.slice(0, idx + 1))
-				: accessors[0] + accessorToObjectAccess(accessors.slice(1, idx + 1));
-			if (idx === accessors.length - 1) return a;
-			if (idx === 0 && base === undefined)
-				return `${a} = typeof ${a} === "object" ? ${a} : {}`;
-			return `${a} = ${a} || {}`;
-		})
-		.join(joinWith);
-};
-
-/** @typedef {string | string[] | LibraryCustomUmdObject} UmdMainTemplatePluginName */
-
-/**
- * @typedef {Object} AuxiliaryCommentObject
- * @property {string} root
- * @property {string} commonjs
- * @property {string} commonjs2
- * @property {string} amd
- */
-
-/**
- * @typedef {Object} UmdMainTemplatePluginOption
- * @property {boolean=} optionalAmdExternalAsGlobal
- * @property {boolean} namedDefine
- * @property {string | AuxiliaryCommentObject} auxiliaryComment
- */
-
-class UmdMainTemplatePlugin {
-	/**
-	 * @param {UmdMainTemplatePluginName} name the name of the UMD library
-	 * @param {UmdMainTemplatePluginOption} options the plugin option
-	 */
-	constructor(name, options) {
-		if (typeof name === "object" && !Array.isArray(name)) {
-			this.name = name.root || name.amd || name.commonjs;
-			this.names = name;
-		} else {
-			this.name = name;
-			this.names = {
-				commonjs: name,
-				root: name,
-				amd: name
-			};
-		}
-		this.optionalAmdExternalAsGlobal = options.optionalAmdExternalAsGlobal;
-		this.namedDefine = options.namedDefine;
-		this.auxiliaryComment = options.auxiliaryComment;
-	}
-
-	/**
-	 * @param {Compilation} compilation the compilation instance
-	 * @returns {void}
-	 */
-	apply(compilation) {
-		const { mainTemplate, chunkTemplate, runtimeTemplate } = compilation;
-
-		const onRenderWithEntry = (source, chunk, hash) => {
-			let externals = chunk
-				.getModules()
-				.filter(
-					m =>
-						m.external &&
-						(m.externalType === "umd" || m.externalType === "umd2")
-				);
-			const optionalExternals = [];
-			let requiredExternals = [];
-			if (this.optionalAmdExternalAsGlobal) {
-				for (const m of externals) {
-					if (m.optional) {
-						optionalExternals.push(m);
-					} else {
-						requiredExternals.push(m);
-					}
-				}
-				externals = requiredExternals.concat(optionalExternals);
-			} else {
-				requiredExternals = externals;
-			}
-
-			const replaceKeys = str => {
-				return mainTemplate.getAssetPath(str, {
-					hash,
-					chunk
-				});
-			};
-
-			const externalsDepsArray = modules => {
-				return `[${replaceKeys(
-					modules
-						.map(m =>
-							JSON.stringify(
-								typeof m.request === "object" ? m.request.amd : m.request
-							)
-						)
-						.join(", ")
-				)}]`;
-			};
-
-			const externalsRootArray = modules => {
-				return replaceKeys(
-					modules
-						.map(m => {
-							let request = m.request;
-							if (typeof request === "object") request = request.root;
-							return `root${accessorToObjectAccess([].concat(request))}`;
-						})
-						.join(", ")
-				);
-			};
-
-			const externalsRequireArray = type => {
-				return replaceKeys(
-					externals
-						.map(m => {
-							let expr;
-							let request = m.request;
-							if (typeof request === "object") {
-								request = request[type];
-							}
-							if (request === undefined) {
-								throw new Error(
-									"Missing external configuration for type:" + type
-								);
-							}
-							if (Array.isArray(request)) {
-								expr = `require(${JSON.stringify(
-									request[0]
-								)})${accessorToObjectAccess(request.slice(1))}`;
-							} else {
-								expr = `require(${JSON.stringify(request)})`;
-							}
-							if (m.optional) {
-								expr = `(function webpackLoadOptionalExternalModule() { try { return ${expr}; } catch(e) {} }())`;
-							}
-							return expr;
-						})
-						.join(", ")
-				);
-			};
-
-			const externalsArguments = modules => {
-				return modules
-					.map(
-						m =>
-							`__WEBPACK_EXTERNAL_MODULE_${Template.toIdentifier(`${m.id}`)}__`
-					)
-					.join(", ");
-			};
-
-			const libraryName = library => {
-				return JSON.stringify(replaceKeys([].concat(library).pop()));
-			};
-
-			let amdFactory;
-			if (optionalExternals.length > 0) {
-				const wrapperArguments = externalsArguments(requiredExternals);
-				const factoryArguments =
-					requiredExternals.length > 0
-						? externalsArguments(requiredExternals) +
-						  ", " +
-						  externalsRootArray(optionalExternals)
-						: externalsRootArray(optionalExternals);
-				amdFactory =
-					`function webpackLoadOptionalExternalModuleAmd(${wrapperArguments}) {\n` +
-					`			return factory(${factoryArguments});\n` +
-					"		}";
-			} else {
-				amdFactory = "factory";
-			}
-
-			const auxiliaryComment = this.auxiliaryComment;
-
-			const getAuxilaryComment = type => {
-				if (auxiliaryComment) {
-					if (typeof auxiliaryComment === "string")
-						return "\t//" + auxiliaryComment + "\n";
-					if (auxiliaryComment[type])
-						return "\t//" + auxiliaryComment[type] + "\n";
-				}
-				return "";
-			};
-
-			return new ConcatSource(
-				new OriginalSource(
-					"(function webpackUniversalModuleDefinition(root, factory) {\n" +
-						getAuxilaryComment("commonjs2") +
-						"	if(typeof exports === 'object' && typeof module === 'object')\n" +
-						"		module.exports = factory(" +
-						externalsRequireArray("commonjs2") +
-						");\n" +
-						getAuxilaryComment("amd") +
-						"	else if(typeof define === 'function' && define.amd)\n" +
-						(requiredExternals.length > 0
-							? this.names.amd && this.namedDefine === true
-								? "		define(" +
-								  libraryName(this.names.amd) +
-								  ", " +
-								  externalsDepsArray(requiredExternals) +
-								  ", " +
-								  amdFactory +
-								  ");\n"
-								: "		define(" +
-								  externalsDepsArray(requiredExternals) +
-								  ", " +
-								  amdFactory +
-								  ");\n"
-							: this.names.amd && this.namedDefine === true
-								? "		define(" +
-								  libraryName(this.names.amd) +
-								  ", [], " +
-								  amdFactory +
-								  ");\n"
-								: "		define([], " + amdFactory + ");\n") +
-						(this.names.root || this.names.commonjs
-							? getAuxilaryComment("commonjs") +
-							  "	else if(typeof exports === 'object')\n" +
-							  "		exports[" +
-							  libraryName(this.names.commonjs || this.names.root) +
-							  "] = factory(" +
-							  externalsRequireArray("commonjs") +
-							  ");\n" +
-							  getAuxilaryComment("root") +
-							  "	else\n" +
-							  "		" +
-							  replaceKeys(
-									accessorAccess("root", this.names.root || this.names.commonjs)
-							  ) +
-							  " = factory(" +
-							  externalsRootArray(externals) +
-							  ");\n"
-							: "	else {\n" +
-							  (externals.length > 0
-									? "		var a = typeof exports === 'object' ? factory(" +
-									  externalsRequireArray("commonjs") +
-									  ") : factory(" +
-									  externalsRootArray(externals) +
-									  ");\n"
-									: "		var a = factory();\n") +
-							  "		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n" +
-							  "	}\n") +
-						`})(${
-							runtimeTemplate.outputOptions.globalObject
-						}, function(${externalsArguments(externals)}) {\nreturn `,
-					"webpack/universalModuleDefinition"
-				),
-				source,
-				";\n})"
-			);
-		};
-
-		for (const template of [mainTemplate, chunkTemplate]) {
-			template.hooks.renderWithEntry.tap(
-				"UmdMainTemplatePlugin",
-				onRenderWithEntry
-			);
-		}
-
-		mainTemplate.hooks.globalHashPaths.tap("UmdMainTemplatePlugin", paths => {
-			if (this.names.root) paths = paths.concat(this.names.root);
-			if (this.names.amd) paths = paths.concat(this.names.amd);
-			if (this.names.commonjs) paths = paths.concat(this.names.commonjs);
-			return paths;
-		});
-
-		mainTemplate.hooks.hash.tap("UmdMainTemplatePlugin", hash => {
-			hash.update("umd");
-			hash.update(`${this.names.root}`);
-			hash.update(`${this.names.amd}`);
-			hash.update(`${this.names.commonjs}`);
-		});
-	}
-}
-
-module.exports = UmdMainTemplatePlugin;
diff --git a/lib/UnhandledSchemeError.js b/lib/UnhandledSchemeError.js
new file mode 100644
index 00000000000..80fa07af188
--- /dev/null
+++ b/lib/UnhandledSchemeError.js
@@ -0,0 +1,33 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const WebpackError = require("./WebpackError");
+const makeSerializable = require("./util/makeSerializable");
+
+class UnhandledSchemeError extends WebpackError {
+	/**
+	 * @param {string} scheme scheme
+	 * @param {string} resource resource
+	 */
+	constructor(scheme, resource) {
+		super(
+			`Reading from "${resource}" is not handled by plugins (Unhandled scheme).` +
+				'\nWebpack supports "data:" and "file:" URIs by default.' +
+				`\nYou may need an additional plugin to handle "${scheme}:" URIs.`
+		);
+		this.file = resource;
+		this.name = "UnhandledSchemeError";
+	}
+}
+
+makeSerializable(
+	UnhandledSchemeError,
+	"webpack/lib/UnhandledSchemeError",
+	"UnhandledSchemeError"
+);
+
+module.exports = UnhandledSchemeError;
diff --git a/lib/UnsupportedFeatureWarning.js b/lib/UnsupportedFeatureWarning.js
index 72eef834e89..2c59f4a80a8 100644
--- a/lib/UnsupportedFeatureWarning.js
+++ b/lib/UnsupportedFeatureWarning.js
@@ -2,29 +2,31 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const WebpackError = require("./WebpackError");
+const makeSerializable = require("./util/makeSerializable");
 
-/** @typedef {import("./Module")} Module */
 /** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
 
 class UnsupportedFeatureWarning extends WebpackError {
 	/**
-	 * @param {Module} module module relevant to warning
 	 * @param {string} message description of warning
 	 * @param {DependencyLocation} loc location start and end positions of the module
 	 */
-	constructor(module, message, loc) {
+	constructor(message, loc) {
 		super(message);
 
 		this.name = "UnsupportedFeatureWarning";
-		this.module = module;
 		this.loc = loc;
 		this.hideStack = true;
-
-		Error.captureStackTrace(this, this.constructor);
 	}
 }
 
+makeSerializable(
+	UnsupportedFeatureWarning,
+	"webpack/lib/UnsupportedFeatureWarning"
+);
+
 module.exports = UnsupportedFeatureWarning;
diff --git a/lib/UseStrictPlugin.js b/lib/UseStrictPlugin.js
index 425be2e31c7..3db3daa8f62 100644
--- a/lib/UseStrictPlugin.js
+++ b/lib/UseStrictPlugin.js
@@ -2,23 +2,41 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_DYNAMIC,
+	JAVASCRIPT_MODULE_TYPE_ESM
+} = require("./ModuleTypeConstants");
 const ConstDependency = require("./dependencies/ConstDependency");
 
+/** @typedef {import("../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
 /** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("./Module").BuildInfo} BuildInfo */
+/** @typedef {import("./javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("./javascript/JavascriptParser").Range} Range */
+
+const PLUGIN_NAME = "UseStrictPlugin";
 
 class UseStrictPlugin {
 	/**
-	 * @param {Compiler} compiler Webpack Compiler
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
 	 * @returns {void}
 	 */
 	apply(compiler) {
 		compiler.hooks.compilation.tap(
-			"UseStrictPlugin",
+			PLUGIN_NAME,
 			(compilation, { normalModuleFactory }) => {
-				const handler = parser => {
-					parser.hooks.program.tap("UseStrictPlugin", ast => {
+				/**
+				 * @param {JavascriptParser} parser the parser
+				 * @param {JavascriptParserOptions} parserOptions the javascript parser options
+				 */
+				const handler = (parser, parserOptions) => {
+					parser.hooks.program.tap(PLUGIN_NAME, ast => {
 						const firstNode = ast.body[0];
 						if (
 							firstNode &&
@@ -29,23 +47,32 @@ class UseStrictPlugin {
 							// Remove "use strict" expression. It will be added later by the renderer again.
 							// This is necessary in order to not break the strict mode when webpack prepends code.
 							// @see https://github.com/webpack/webpack/issues/1970
-							const dep = new ConstDependency("", firstNode.range);
-							dep.loc = firstNode.loc;
-							parser.state.current.addDependency(dep);
-							parser.state.module.buildInfo.strict = true;
+							const dep = new ConstDependency(
+								"",
+								/** @type {Range} */ (firstNode.range)
+							);
+							dep.loc = /** @type {DependencyLocation} */ (firstNode.loc);
+							parser.state.module.addPresentationalDependency(dep);
+							/** @type {BuildInfo} */
+							(parser.state.module.buildInfo).strict = true;
+						}
+						if (parserOptions.overrideStrict) {
+							/** @type {BuildInfo} */
+							(parser.state.module.buildInfo).strict =
+								parserOptions.overrideStrict === "strict";
 						}
 					});
 				};
 
 				normalModuleFactory.hooks.parser
-					.for("javascript/auto")
-					.tap("UseStrictPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, handler);
 				normalModuleFactory.hooks.parser
-					.for("javascript/dynamic")
-					.tap("UseStrictPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
+					.tap(PLUGIN_NAME, handler);
 				normalModuleFactory.hooks.parser
-					.for("javascript/esm")
-					.tap("UseStrictPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_ESM)
+					.tap(PLUGIN_NAME, handler);
 			}
 		);
 	}
diff --git a/lib/WarnCaseSensitiveModulesPlugin.js b/lib/WarnCaseSensitiveModulesPlugin.js
index 867a33fe31e..5badc2229c4 100644
--- a/lib/WarnCaseSensitiveModulesPlugin.js
+++ b/lib/WarnCaseSensitiveModulesPlugin.js
@@ -2,35 +2,62 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const CaseSensitiveModulesWarning = require("./CaseSensitiveModulesWarning");
 
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./NormalModule")} NormalModule */
+
+const PLUGIN_NAME = "WarnCaseSensitiveModulesPlugin";
+
 class WarnCaseSensitiveModulesPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		compiler.hooks.compilation.tap(
-			"WarnCaseSensitiveModulesPlugin",
-			compilation => {
-				compilation.hooks.seal.tap("WarnCaseSensitiveModulesPlugin", () => {
-					const moduleWithoutCase = new Map();
-					for (const module of compilation.modules) {
-						const identifier = module.identifier().toLowerCase();
-						const array = moduleWithoutCase.get(identifier);
-						if (array) {
-							array.push(module);
-						} else {
-							moduleWithoutCase.set(identifier, [module]);
-						}
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			compilation.hooks.seal.tap(PLUGIN_NAME, () => {
+				/** @type {Map>} */
+				const moduleWithoutCase = new Map();
+				for (const module of compilation.modules) {
+					const identifier = module.identifier();
+
+					// Ignore `data:` URLs, because it's not a real path
+					if (
+						/** @type {NormalModule} */
+						(module).resourceResolveData !== undefined &&
+						/** @type {NormalModule} */
+						(module).resourceResolveData.encodedContent !== undefined
+					) {
+						continue;
+					}
+
+					const lowerIdentifier = identifier.toLowerCase();
+					let map = moduleWithoutCase.get(lowerIdentifier);
+					if (map === undefined) {
+						map = new Map();
+						moduleWithoutCase.set(lowerIdentifier, map);
 					}
-					for (const pair of moduleWithoutCase) {
-						const array = pair[1];
-						if (array.length > 1) {
-							compilation.warnings.push(new CaseSensitiveModulesWarning(array));
-						}
+					map.set(identifier, module);
+				}
+				for (const pair of moduleWithoutCase) {
+					const map = pair[1];
+					if (map.size > 1) {
+						compilation.warnings.push(
+							new CaseSensitiveModulesWarning(
+								map.values(),
+								compilation.moduleGraph
+							)
+						);
 					}
-				});
-			}
-		);
+				}
+			});
+		});
 	}
 }
 
diff --git a/lib/WarnDeprecatedOptionPlugin.js b/lib/WarnDeprecatedOptionPlugin.js
new file mode 100644
index 00000000000..8cad0869908
--- /dev/null
+++ b/lib/WarnDeprecatedOptionPlugin.js
@@ -0,0 +1,60 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Florent Cailhol @ooflorent
+*/
+
+"use strict";
+
+const WebpackError = require("./WebpackError");
+
+/** @typedef {import("./Compiler")} Compiler */
+
+class WarnDeprecatedOptionPlugin {
+	/**
+	 * Create an instance of the plugin
+	 * @param {string} option the target option
+	 * @param {string | number} value the deprecated option value
+	 * @param {string} suggestion the suggestion replacement
+	 */
+	constructor(option, value, suggestion) {
+		this.option = option;
+		this.value = value;
+		this.suggestion = suggestion;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.thisCompilation.tap(
+			"WarnDeprecatedOptionPlugin",
+			compilation => {
+				compilation.warnings.push(
+					new DeprecatedOptionWarning(this.option, this.value, this.suggestion)
+				);
+			}
+		);
+	}
+}
+
+class DeprecatedOptionWarning extends WebpackError {
+	/**
+	 * Create an instance deprecated option warning
+	 * @param {string} option the target option
+	 * @param {string | number} value the deprecated option value
+	 * @param {string} suggestion the suggestion replacement
+	 */
+	constructor(option, value, suggestion) {
+		super();
+
+		this.name = "DeprecatedOptionWarning";
+		this.message =
+			"configuration\n" +
+			`The value '${value}' for option '${option}' is deprecated. ` +
+			`Use '${suggestion}' instead.`;
+	}
+}
+
+module.exports = WarnDeprecatedOptionPlugin;
diff --git a/lib/WarnNoModeSetPlugin.js b/lib/WarnNoModeSetPlugin.js
index 4a69a8cca4b..7eaee450bc4 100644
--- a/lib/WarnNoModeSetPlugin.js
+++ b/lib/WarnNoModeSetPlugin.js
@@ -2,13 +2,23 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const NoModeWarning = require("./NoModeWarning");
 
+/** @typedef {import("./Compiler")} Compiler */
+
+const PLUGIN_NAME = "WarnNoModeSetPlugin";
+
 class WarnNoModeSetPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		compiler.hooks.thisCompilation.tap("WarnNoModeSetPlugin", compilation => {
+		compiler.hooks.thisCompilation.tap(PLUGIN_NAME, compilation => {
 			compilation.warnings.push(new NoModeWarning());
 		});
 	}
diff --git a/lib/WatchIgnorePlugin.js b/lib/WatchIgnorePlugin.js
index dc00cf5fde4..ce72ae8ed33 100644
--- a/lib/WatchIgnorePlugin.js
+++ b/lib/WatchIgnorePlugin.js
@@ -2,61 +2,87 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const validateOptions = require("schema-utils");
-const schema = require("../schemas/plugins/WatchIgnorePlugin.json");
+const { groupBy } = require("./util/ArrayHelpers");
+const createSchemaValidation = require("./util/create-schema-validation");
 
 /** @typedef {import("../declarations/plugins/WatchIgnorePlugin").WatchIgnorePluginOptions} WatchIgnorePluginOptions */
+/** @typedef {import("../declarations/WebpackOptions").WatchOptions} WatchOptions */
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./util/fs").TimeInfoEntries} TimeInfoEntries */
+/** @typedef {import("./util/fs").WatchFileSystem} WatchFileSystem */
+/** @typedef {import("./util/fs").WatchMethod} WatchMethod */
+/** @typedef {import("./util/fs").Watcher} Watcher */
+const validate = createSchemaValidation(
+	require("../schemas/plugins/WatchIgnorePlugin.check.js"),
+	() => require("../schemas/plugins/WatchIgnorePlugin.json"),
+	{
+		name: "Watch Ignore Plugin",
+		baseDataPath: "options"
+	}
+);
+
+const IGNORE_TIME_ENTRY = "ignore";
 
 class IgnoringWatchFileSystem {
+	/**
+	 * @param {WatchFileSystem} wfs original file system
+	 * @param {WatchIgnorePluginOptions["paths"]} paths ignored paths
+	 */
 	constructor(wfs, paths) {
 		this.wfs = wfs;
 		this.paths = paths;
 	}
 
+	/** @type {WatchMethod} */
 	watch(files, dirs, missing, startTime, options, callback, callbackUndelayed) {
+		files = Array.from(files);
+		dirs = Array.from(dirs);
+		/**
+		 * @param {string} path path to check
+		 * @returns {boolean} true, if path is ignored
+		 */
 		const ignored = path =>
-			this.paths.some(
-				p => (p instanceof RegExp ? p.test(path) : path.indexOf(p) === 0)
+			this.paths.some(p =>
+				p instanceof RegExp ? p.test(path) : path.indexOf(p) === 0
 			);
 
-		const notIgnored = path => !ignored(path);
-
-		const ignoredFiles = files.filter(ignored);
-		const ignoredDirs = dirs.filter(ignored);
+		const [ignoredFiles, notIgnoredFiles] = groupBy(
+			/** @type {Array} */
+			(files),
+			ignored
+		);
+		const [ignoredDirs, notIgnoredDirs] = groupBy(
+			/** @type {Array} */
+			(dirs),
+			ignored
+		);
 
 		const watcher = this.wfs.watch(
-			files.filter(notIgnored),
-			dirs.filter(notIgnored),
+			notIgnoredFiles,
+			notIgnoredDirs,
 			missing,
 			startTime,
 			options,
-			(
-				err,
-				filesModified,
-				dirsModified,
-				missingModified,
-				fileTimestamps,
-				dirTimestamps,
-				removedFiles
-			) => {
+			(err, fileTimestamps, dirTimestamps, changedFiles, removedFiles) => {
 				if (err) return callback(err);
 				for (const path of ignoredFiles) {
-					fileTimestamps.set(path, 1);
+					/** @type {TimeInfoEntries} */
+					(fileTimestamps).set(path, IGNORE_TIME_ENTRY);
 				}
 
 				for (const path of ignoredDirs) {
-					dirTimestamps.set(path, 1);
+					/** @type {TimeInfoEntries} */
+					(dirTimestamps).set(path, IGNORE_TIME_ENTRY);
 				}
 
 				callback(
-					err,
-					filesModified,
-					dirsModified,
-					missingModified,
+					null,
 					fileTimestamps,
 					dirTimestamps,
+					changedFiles,
 					removedFiles
 				);
 			},
@@ -66,37 +92,60 @@ class IgnoringWatchFileSystem {
 		return {
 			close: () => watcher.close(),
 			pause: () => watcher.pause(),
-			getContextTimestamps: () => {
-				const dirTimestamps = watcher.getContextTimestamps();
+			getContextTimeInfoEntries: () => {
+				const dirTimestamps = watcher.getContextTimeInfoEntries();
 				for (const path of ignoredDirs) {
-					dirTimestamps.set(path, 1);
+					dirTimestamps.set(path, IGNORE_TIME_ENTRY);
 				}
 				return dirTimestamps;
 			},
-			getFileTimestamps: () => {
-				const fileTimestamps = watcher.getFileTimestamps();
+			getFileTimeInfoEntries: () => {
+				const fileTimestamps = watcher.getFileTimeInfoEntries();
 				for (const path of ignoredFiles) {
-					fileTimestamps.set(path, 1);
+					fileTimestamps.set(path, IGNORE_TIME_ENTRY);
 				}
 				return fileTimestamps;
-			}
+			},
+			getInfo:
+				watcher.getInfo &&
+				(() => {
+					const info =
+						/** @type {NonNullable} */
+						(watcher.getInfo)();
+					const { fileTimeInfoEntries, contextTimeInfoEntries } = info;
+					for (const path of ignoredFiles) {
+						fileTimeInfoEntries.set(path, IGNORE_TIME_ENTRY);
+					}
+					for (const path of ignoredDirs) {
+						contextTimeInfoEntries.set(path, IGNORE_TIME_ENTRY);
+					}
+					return info;
+				})
 		};
 	}
 }
 
+const PLUGIN_NAME = "WatchIgnorePlugin";
+
 class WatchIgnorePlugin {
 	/**
-	 * @param {WatchIgnorePluginOptions} paths list of paths
+	 * @param {WatchIgnorePluginOptions} options options
 	 */
-	constructor(paths) {
-		validateOptions(schema, paths, "Watch Ignore Plugin");
-		this.paths = paths;
+	constructor(options) {
+		validate(options);
+		this.paths = options.paths;
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		compiler.hooks.afterEnvironment.tap("WatchIgnorePlugin", () => {
+		compiler.hooks.afterEnvironment.tap(PLUGIN_NAME, () => {
 			compiler.watchFileSystem = new IgnoringWatchFileSystem(
-				compiler.watchFileSystem,
+				/** @type {WatchFileSystem} */
+				(compiler.watchFileSystem),
 				this.paths
 			);
 		});
diff --git a/lib/Watching.js b/lib/Watching.js
index 9b1a06d5755..a047f257b20 100644
--- a/lib/Watching.js
+++ b/lib/Watching.js
@@ -2,176 +2,505 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const Stats = require("./Stats");
 
+/** @typedef {import("../declarations/WebpackOptions").WatchOptions} WatchOptions */
+/** @typedef {import("./Compilation")} Compilation */
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./FileSystemInfo").FileSystemInfoEntry} FileSystemInfoEntry */
+/** @typedef {import("./WebpackError")} WebpackError */
+/** @typedef {import("./logging/Logger").Logger} Logger */
+/** @typedef {import("./util/fs").TimeInfoEntries} TimeInfoEntries */
+/** @typedef {import("./util/fs").WatchFileSystem} WatchFileSystem */
+/** @typedef {import("./util/fs").Watcher} Watcher */
+
+/**
+ * @template T
+ * @callback Callback
+ * @param {Error | null} err
+ * @param {T=} result
+ */
+
 class Watching {
+	/**
+	 * @param {Compiler} compiler the compiler
+	 * @param {WatchOptions} watchOptions options
+	 * @param {Callback} handler completion handler
+	 */
 	constructor(compiler, watchOptions, handler) {
 		this.startTime = null;
 		this.invalid = false;
 		this.handler = handler;
+		/** @type {Callback[]} */
 		this.callbacks = [];
+		/** @type {Callback[] | undefined} */
+		this._closeCallbacks = undefined;
 		this.closed = false;
+		this.suspended = false;
+		this.blocked = false;
+		this._isBlocked = () => false;
+		this._onChange = () => {};
+		this._onInvalid = () => {};
 		if (typeof watchOptions === "number") {
+			/** @type {WatchOptions} */
 			this.watchOptions = {
 				aggregateTimeout: watchOptions
 			};
 		} else if (watchOptions && typeof watchOptions === "object") {
-			this.watchOptions = Object.assign({}, watchOptions);
+			/** @type {WatchOptions} */
+			this.watchOptions = { ...watchOptions };
 		} else {
+			/** @type {WatchOptions} */
 			this.watchOptions = {};
 		}
-		this.watchOptions.aggregateTimeout =
-			this.watchOptions.aggregateTimeout || 200;
+		if (typeof this.watchOptions.aggregateTimeout !== "number") {
+			this.watchOptions.aggregateTimeout = 20;
+		}
 		this.compiler = compiler;
-		this.running = true;
-		this.compiler.readRecords(err => {
-			if (err) return this._done(err);
-
-			this._go();
+		this.running = false;
+		this._initial = true;
+		this._invalidReported = true;
+		this._needRecords = true;
+		this.watcher = undefined;
+		this.pausedWatcher = undefined;
+		/** @type {Set | undefined} */
+		this._collectedChangedFiles = undefined;
+		/** @type {Set | undefined} */
+		this._collectedRemovedFiles = undefined;
+		this._done = this._done.bind(this);
+		process.nextTick(() => {
+			if (this._initial) this._invalidate();
 		});
 	}
 
-	_go() {
-		this.startTime = Date.now();
+	/**
+	 * @param {ReadonlySet | undefined | null} changedFiles changed files
+	 * @param {ReadonlySet | undefined | null} removedFiles removed files
+	 */
+	_mergeWithCollected(changedFiles, removedFiles) {
+		if (!changedFiles) return;
+		if (!this._collectedChangedFiles) {
+			this._collectedChangedFiles = new Set(changedFiles);
+			this._collectedRemovedFiles = new Set(removedFiles);
+		} else {
+			for (const file of changedFiles) {
+				this._collectedChangedFiles.add(file);
+				/** @type {Set} */
+				(this._collectedRemovedFiles).delete(file);
+			}
+			for (const file of /** @type {ReadonlySet} */ (removedFiles)) {
+				this._collectedChangedFiles.delete(file);
+				/** @type {Set} */
+				(this._collectedRemovedFiles).add(file);
+			}
+		}
+	}
+
+	/**
+	 * @param {TimeInfoEntries=} fileTimeInfoEntries info for files
+	 * @param {TimeInfoEntries=} contextTimeInfoEntries info for directories
+	 * @param {ReadonlySet=} changedFiles changed files
+	 * @param {ReadonlySet=} removedFiles removed files
+	 * @returns {void}
+	 */
+	_go(fileTimeInfoEntries, contextTimeInfoEntries, changedFiles, removedFiles) {
+		this._initial = false;
+		if (this.startTime === null) this.startTime = Date.now();
 		this.running = true;
-		this.invalid = false;
-		this.compiler.hooks.watchRun.callAsync(this.compiler, err => {
-			if (err) return this._done(err);
-			const onCompiled = (err, compilation) => {
+		if (this.watcher) {
+			this.pausedWatcher = this.watcher;
+			this.lastWatcherStartTime = Date.now();
+			this.watcher.pause();
+			this.watcher = null;
+		} else if (!this.lastWatcherStartTime) {
+			this.lastWatcherStartTime = Date.now();
+		}
+		this.compiler.fsStartTime = Date.now();
+		if (
+			changedFiles &&
+			removedFiles &&
+			fileTimeInfoEntries &&
+			contextTimeInfoEntries
+		) {
+			this._mergeWithCollected(changedFiles, removedFiles);
+			this.compiler.fileTimestamps = fileTimeInfoEntries;
+			this.compiler.contextTimestamps = contextTimeInfoEntries;
+		} else if (this.pausedWatcher) {
+			if (this.pausedWatcher.getInfo) {
+				const {
+					changes,
+					removals,
+					fileTimeInfoEntries,
+					contextTimeInfoEntries
+				} = this.pausedWatcher.getInfo();
+				this._mergeWithCollected(changes, removals);
+				this.compiler.fileTimestamps = fileTimeInfoEntries;
+				this.compiler.contextTimestamps = contextTimeInfoEntries;
+			} else {
+				this._mergeWithCollected(
+					this.pausedWatcher.getAggregatedChanges &&
+						this.pausedWatcher.getAggregatedChanges(),
+					this.pausedWatcher.getAggregatedRemovals &&
+						this.pausedWatcher.getAggregatedRemovals()
+				);
+				this.compiler.fileTimestamps =
+					this.pausedWatcher.getFileTimeInfoEntries();
+				this.compiler.contextTimestamps =
+					this.pausedWatcher.getContextTimeInfoEntries();
+			}
+		}
+		this.compiler.modifiedFiles = this._collectedChangedFiles;
+		this._collectedChangedFiles = undefined;
+		this.compiler.removedFiles = this._collectedRemovedFiles;
+		this._collectedRemovedFiles = undefined;
+
+		const run = () => {
+			if (this.compiler.idle) {
+				return this.compiler.cache.endIdle(err => {
+					if (err) return this._done(err);
+					this.compiler.idle = false;
+					run();
+				});
+			}
+			if (this._needRecords) {
+				return this.compiler.readRecords(err => {
+					if (err) return this._done(err);
+
+					this._needRecords = false;
+					run();
+				});
+			}
+			this.invalid = false;
+			this._invalidReported = false;
+			this.compiler.hooks.watchRun.callAsync(this.compiler, err => {
 				if (err) return this._done(err);
-				if (this.invalid) return this._done();
+				/**
+				 * @param {Error | null} err error
+				 * @param {Compilation=} _compilation compilation
+				 * @returns {void}
+				 */
+				const onCompiled = (err, _compilation) => {
+					if (err) return this._done(err, _compilation);
 
-				if (this.compiler.hooks.shouldEmit.call(compilation) === false) {
-					return this._done(null, compilation);
-				}
+					const compilation = /** @type {Compilation} */ (_compilation);
 
-				this.compiler.emitAssets(compilation, err => {
-					if (err) return this._done(err);
-					if (this.invalid) return this._done();
-					this.compiler.emitRecords(err => {
-						if (err) return this._done(err);
-
-						if (compilation.hooks.needAdditionalPass.call()) {
-							compilation.needAdditionalPass = true;
-
-							const stats = new Stats(compilation);
-							stats.startTime = this.startTime;
-							stats.endTime = Date.now();
-							this.compiler.hooks.done.callAsync(stats, err => {
-								if (err) return this._done(err);
-
-								this.compiler.hooks.additionalPass.callAsync(err => {
-									if (err) return this._done(err);
-									this.compiler.compile(onCompiled);
-								});
-							});
-							return;
-						}
+					if (this.invalid) return this._done(null, compilation);
+
+					if (this.compiler.hooks.shouldEmit.call(compilation) === false) {
 						return this._done(null, compilation);
+					}
+
+					process.nextTick(() => {
+						const logger = compilation.getLogger("webpack.Compiler");
+						logger.time("emitAssets");
+						this.compiler.emitAssets(compilation, err => {
+							logger.timeEnd("emitAssets");
+							if (err) return this._done(err, compilation);
+							if (this.invalid) return this._done(null, compilation);
+
+							logger.time("emitRecords");
+							this.compiler.emitRecords(err => {
+								logger.timeEnd("emitRecords");
+								if (err) return this._done(err, compilation);
+
+								if (compilation.hooks.needAdditionalPass.call()) {
+									compilation.needAdditionalPass = true;
+
+									compilation.startTime = /** @type {number} */ (
+										this.startTime
+									);
+									compilation.endTime = Date.now();
+									logger.time("done hook");
+									const stats = new Stats(compilation);
+									this.compiler.hooks.done.callAsync(stats, err => {
+										logger.timeEnd("done hook");
+										if (err) return this._done(err, compilation);
+
+										this.compiler.hooks.additionalPass.callAsync(err => {
+											if (err) return this._done(err, compilation);
+											this.compiler.compile(onCompiled);
+										});
+									});
+									return;
+								}
+								return this._done(null, compilation);
+							});
+						});
 					});
-				});
-			};
-			this.compiler.compile(onCompiled);
-		});
+				};
+				this.compiler.compile(onCompiled);
+			});
+		};
+
+		run();
 	}
 
+	/**
+	 * @param {Compilation} compilation the compilation
+	 * @returns {Stats} the compilation stats
+	 */
 	_getStats(compilation) {
 		const stats = new Stats(compilation);
-		stats.startTime = this.startTime;
-		stats.endTime = Date.now();
 		return stats;
 	}
 
+	/**
+	 * @param {(Error | null)=} err an optional error
+	 * @param {Compilation=} compilation the compilation
+	 * @returns {void}
+	 */
 	_done(err, compilation) {
 		this.running = false;
-		if (this.invalid) return this._go();
 
-		const stats = compilation ? this._getStats(compilation) : null;
-		if (err) {
+		const logger =
+			/** @type {Logger} */
+			(compilation && compilation.getLogger("webpack.Watching"));
+
+		/** @type {Stats | undefined} */
+		let stats;
+
+		/**
+		 * @param {Error} err error
+		 * @param {Callback[]=} cbs callbacks
+		 */
+		const handleError = (err, cbs) => {
 			this.compiler.hooks.failed.call(err);
-			this.handler(err, stats);
+			this.compiler.cache.beginIdle();
+			this.compiler.idle = true;
+			this.handler(err, /** @type {Stats} */ (stats));
+			if (!cbs) {
+				cbs = this.callbacks;
+				this.callbacks = [];
+			}
+			for (const cb of cbs) cb(err);
+		};
+
+		if (
+			this.invalid &&
+			!this.suspended &&
+			!this.blocked &&
+			!(this._isBlocked() && (this.blocked = true))
+		) {
+			if (compilation) {
+				logger.time("storeBuildDependencies");
+				this.compiler.cache.storeBuildDependencies(
+					compilation.buildDependencies,
+					err => {
+						logger.timeEnd("storeBuildDependencies");
+						if (err) return handleError(err);
+						this._go();
+					}
+				);
+			} else {
+				this._go();
+			}
 			return;
 		}
-		this.compiler.hooks.done.callAsync(stats, () => {
+
+		if (compilation) {
+			compilation.startTime = /** @type {number} */ (this.startTime);
+			compilation.endTime = Date.now();
+			stats = new Stats(compilation);
+		}
+		this.startTime = null;
+		if (err) return handleError(err);
+
+		const cbs = this.callbacks;
+		this.callbacks = [];
+		logger.time("done hook");
+		this.compiler.hooks.done.callAsync(/** @type {Stats} */ (stats), err => {
+			logger.timeEnd("done hook");
+			if (err) return handleError(err, cbs);
 			this.handler(null, stats);
-			if (!this.closed) {
-				this.watch(
-					Array.from(compilation.fileDependencies),
-					Array.from(compilation.contextDependencies),
-					Array.from(compilation.missingDependencies)
-				);
-			}
-			for (const cb of this.callbacks) cb();
-			this.callbacks.length = 0;
+			logger.time("storeBuildDependencies");
+			this.compiler.cache.storeBuildDependencies(
+				/** @type {Compilation} */
+				(compilation).buildDependencies,
+				err => {
+					logger.timeEnd("storeBuildDependencies");
+					if (err) return handleError(err, cbs);
+					logger.time("beginIdle");
+					this.compiler.cache.beginIdle();
+					this.compiler.idle = true;
+					logger.timeEnd("beginIdle");
+					process.nextTick(() => {
+						if (!this.closed) {
+							this.watch(
+								/** @type {Compilation} */
+								(compilation).fileDependencies,
+								/** @type {Compilation} */
+								(compilation).contextDependencies,
+								/** @type {Compilation} */
+								(compilation).missingDependencies
+							);
+						}
+					});
+					for (const cb of cbs) cb(null);
+					this.compiler.hooks.afterDone.call(/** @type {Stats} */ (stats));
+				}
+			);
 		});
 	}
 
+	/**
+	 * @param {Iterable} files watched files
+	 * @param {Iterable} dirs watched directories
+	 * @param {Iterable} missing watched existence entries
+	 * @returns {void}
+	 */
 	watch(files, dirs, missing) {
 		this.pausedWatcher = null;
-		this.watcher = this.compiler.watchFileSystem.watch(
-			files,
-			dirs,
-			missing,
-			this.startTime,
-			this.watchOptions,
-			(
-				err,
-				filesModified,
-				contextModified,
-				missingModified,
-				fileTimestamps,
-				contextTimestamps,
-				removedFiles
-			) => {
-				this.pausedWatcher = this.watcher;
-				this.watcher = null;
-				if (err) {
-					return this.handler(err);
+		this.watcher =
+			/** @type {WatchFileSystem} */
+			(this.compiler.watchFileSystem).watch(
+				files,
+				dirs,
+				missing,
+				/** @type {number} */ (this.lastWatcherStartTime),
+				this.watchOptions,
+				(
+					err,
+					fileTimeInfoEntries,
+					contextTimeInfoEntries,
+					changedFiles,
+					removedFiles
+				) => {
+					if (err) {
+						this.compiler.modifiedFiles = undefined;
+						this.compiler.removedFiles = undefined;
+						this.compiler.fileTimestamps = undefined;
+						this.compiler.contextTimestamps = undefined;
+						this.compiler.fsStartTime = undefined;
+						return this.handler(err);
+					}
+					this._invalidate(
+						fileTimeInfoEntries,
+						contextTimeInfoEntries,
+						changedFiles,
+						removedFiles
+					);
+					this._onChange();
+				},
+				(fileName, changeTime) => {
+					if (!this._invalidReported) {
+						this._invalidReported = true;
+						this.compiler.hooks.invalid.call(fileName, changeTime);
+					}
+					this._onInvalid();
 				}
-				this.compiler.fileTimestamps = fileTimestamps;
-				this.compiler.contextTimestamps = contextTimestamps;
-				this.compiler.removedFiles = removedFiles;
-				this._invalidate();
-			},
-			(fileName, changeTime) => {
-				this.compiler.hooks.invalid.call(fileName, changeTime);
-			}
-		);
+			);
 	}
 
+	/**
+	 * @param {Callback=} callback signals when the build has completed again
+	 * @returns {void}
+	 */
 	invalidate(callback) {
 		if (callback) {
 			this.callbacks.push(callback);
 		}
-		if (this.watcher) {
-			this.compiler.fileTimestamps = this.watcher.getFileTimestamps();
-			this.compiler.contextTimestamps = this.watcher.getContextTimestamps();
+		if (!this._invalidReported) {
+			this._invalidReported = true;
+			this.compiler.hooks.invalid.call(null, Date.now());
 		}
-		return this._invalidate();
+		this._onChange();
+		this._invalidate();
 	}
 
-	_invalidate() {
-		if (this.watcher) {
-			this.pausedWatcher = this.watcher;
-			this.watcher.pause();
-			this.watcher = null;
+	/**
+	 * @param {TimeInfoEntries=} fileTimeInfoEntries info for files
+	 * @param {TimeInfoEntries=} contextTimeInfoEntries info for directories
+	 * @param {ReadonlySet=} changedFiles changed files
+	 * @param {ReadonlySet=} removedFiles removed files
+	 * @returns {void}
+	 */
+	_invalidate(
+		fileTimeInfoEntries,
+		contextTimeInfoEntries,
+		changedFiles,
+		removedFiles
+	) {
+		if (this.suspended || (this._isBlocked() && (this.blocked = true))) {
+			this._mergeWithCollected(changedFiles, removedFiles);
+			return;
 		}
+
 		if (this.running) {
+			this._mergeWithCollected(changedFiles, removedFiles);
 			this.invalid = true;
-			return false;
 		} else {
-			this._go();
+			this._go(
+				fileTimeInfoEntries,
+				contextTimeInfoEntries,
+				changedFiles,
+				removedFiles
+			);
 		}
 	}
 
+	suspend() {
+		this.suspended = true;
+	}
+
+	resume() {
+		if (this.suspended) {
+			this.suspended = false;
+			this._invalidate();
+		}
+	}
+
+	/**
+	 * @param {Callback} callback signals when the watcher is closed
+	 * @returns {void}
+	 */
 	close(callback) {
-		const finalCallback = () => {
-			this.compiler.hooks.watchClose.call();
+		if (this._closeCallbacks) {
+			if (callback) {
+				this._closeCallbacks.push(callback);
+			}
+			return;
+		}
+		/**
+		 * @param {WebpackError | null} err error if any
+		 * @param {Compilation=} compilation compilation if any
+		 */
+		const finalCallback = (err, compilation) => {
+			this.running = false;
 			this.compiler.running = false;
+			this.compiler.watching = undefined;
 			this.compiler.watchMode = false;
-			if (callback !== undefined) callback();
+			this.compiler.modifiedFiles = undefined;
+			this.compiler.removedFiles = undefined;
+			this.compiler.fileTimestamps = undefined;
+			this.compiler.contextTimestamps = undefined;
+			this.compiler.fsStartTime = undefined;
+			/**
+			 * @param {WebpackError | null} err error if any
+			 */
+			const shutdown = err => {
+				this.compiler.hooks.watchClose.call();
+				const closeCallbacks =
+					/** @type {Callback[]} */
+					(this._closeCallbacks);
+				this._closeCallbacks = undefined;
+				for (const cb of closeCallbacks) cb(err);
+			};
+			if (compilation) {
+				const logger = compilation.getLogger("webpack.Watching");
+				logger.time("storeBuildDependencies");
+				this.compiler.cache.storeBuildDependencies(
+					compilation.buildDependencies,
+					err2 => {
+						logger.timeEnd("storeBuildDependencies");
+						shutdown(err || err2);
+					}
+				);
+			} else {
+				shutdown(err);
+			}
 		};
 
 		this.closed = true;
@@ -183,11 +512,15 @@ class Watching {
 			this.pausedWatcher.close();
 			this.pausedWatcher = null;
 		}
+		this._closeCallbacks = [];
+		if (callback) {
+			this._closeCallbacks.push(callback);
+		}
 		if (this.running) {
 			this.invalid = true;
 			this._done = finalCallback;
 		} else {
-			finalCallback();
+			finalCallback(null);
 		}
 	}
 }
diff --git a/lib/WebpackError.js b/lib/WebpackError.js
index 891809a67e9..02a7e4aba24 100644
--- a/lib/WebpackError.js
+++ b/lib/WebpackError.js
@@ -2,28 +2,77 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Jarid Margolin @jaridmargolin
 */
+
 "use strict";
 
+const inspect = require("util").inspect.custom;
+const makeSerializable = require("./util/makeSerializable");
+
+/** @typedef {import("./Chunk")} Chunk */
+/** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
 class WebpackError extends Error {
 	/**
 	 * Creates an instance of WebpackError.
 	 * @param {string=} message error message
+	 * @param {{ cause?: unknown }} options error options
 	 */
-	constructor(message) {
-		super(message);
+	constructor(message, options = {}) {
+		// @ts-expect-error ES2018 doesn't `Error.cause`, but it can be used by developers
+		super(message, options);
 
+		/** @type {string=} */
 		this.details = undefined;
-		this.missing = undefined;
-		this.origin = undefined;
-		this.dependencies = undefined;
+		/** @type {(Module | null)=} */
 		this.module = undefined;
+		/** @type {DependencyLocation=} */
+		this.loc = undefined;
+		/** @type {boolean=} */
+		this.hideStack = undefined;
+		/** @type {Chunk=} */
+		this.chunk = undefined;
+		/** @type {string=} */
+		this.file = undefined;
+	}
 
-		Error.captureStackTrace(this, this.constructor);
+	[inspect]() {
+		return (
+			this.stack +
+			(this.details ? `\n${this.details}` : "") +
+			(this.cause ? `\n${this.cause}` : "")
+		);
 	}
 
-	inspect() {
-		return this.stack + (this.details ? `\n${this.details}` : "");
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize({ write }) {
+		write(this.name);
+		write(this.message);
+		write(this.stack);
+		write(this.cause);
+		write(this.details);
+		write(this.loc);
+		write(this.hideStack);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize({ read }) {
+		this.name = read();
+		this.message = read();
+		this.stack = read();
+		this.cause = read();
+		this.details = read();
+		this.loc = read();
+		this.hideStack = read();
 	}
 }
 
+makeSerializable(WebpackError, "webpack/lib/WebpackError");
+
 module.exports = WebpackError;
diff --git a/lib/WebpackIsIncludedPlugin.js b/lib/WebpackIsIncludedPlugin.js
new file mode 100644
index 00000000000..981cf8f6dff
--- /dev/null
+++ b/lib/WebpackIsIncludedPlugin.js
@@ -0,0 +1,94 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const IgnoreErrorModuleFactory = require("./IgnoreErrorModuleFactory");
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_DYNAMIC,
+	JAVASCRIPT_MODULE_TYPE_ESM
+} = require("./ModuleTypeConstants");
+const WebpackIsIncludedDependency = require("./dependencies/WebpackIsIncludedDependency");
+const {
+	toConstantDependency
+} = require("./javascript/JavascriptParserHelpers");
+
+/** @typedef {import("enhanced-resolve").Resolver} Resolver */
+/** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("./javascript/JavascriptParser").Range} Range */
+
+const PLUGIN_NAME = "WebpackIsIncludedPlugin";
+
+class WebpackIsIncludedPlugin {
+	/**
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(
+			PLUGIN_NAME,
+			(compilation, { normalModuleFactory }) => {
+				compilation.dependencyFactories.set(
+					WebpackIsIncludedDependency,
+					new IgnoreErrorModuleFactory(normalModuleFactory)
+				);
+				compilation.dependencyTemplates.set(
+					WebpackIsIncludedDependency,
+					new WebpackIsIncludedDependency.Template()
+				);
+
+				/**
+				 * @param {JavascriptParser} parser the parser
+				 * @returns {void}
+				 */
+				const handler = parser => {
+					parser.hooks.call
+						.for("__webpack_is_included__")
+						.tap(PLUGIN_NAME, expr => {
+							if (
+								expr.type !== "CallExpression" ||
+								expr.arguments.length !== 1 ||
+								expr.arguments[0].type === "SpreadElement"
+							)
+								return;
+
+							const request = parser.evaluateExpression(expr.arguments[0]);
+
+							if (!request.isString()) return;
+
+							const dep = new WebpackIsIncludedDependency(
+								/** @type {string} */ (request.string),
+								/** @type {Range} */ (expr.range)
+							);
+							dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+							parser.state.module.addDependency(dep);
+							return true;
+						});
+					parser.hooks.typeof
+						.for("__webpack_is_included__")
+						.tap(
+							PLUGIN_NAME,
+							toConstantDependency(parser, JSON.stringify("function"))
+						);
+				};
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, handler);
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
+					.tap(PLUGIN_NAME, handler);
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_ESM)
+					.tap(PLUGIN_NAME, handler);
+			}
+		);
+	}
+}
+
+module.exports = WebpackIsIncludedPlugin;
diff --git a/lib/WebpackOptionsApply.js b/lib/WebpackOptionsApply.js
index 6afa3314d07..02f5126aceb 100644
--- a/lib/WebpackOptionsApply.js
+++ b/lib/WebpackOptionsApply.js
@@ -2,69 +2,68 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const OptionsApply = require("./OptionsApply");
 
-const JavascriptModulesPlugin = require("./JavascriptModulesPlugin");
-const JsonModulesPlugin = require("./JsonModulesPlugin");
-const WebAssemblyModulesPlugin = require("./wasm/WebAssemblyModulesPlugin");
+const AssetModulesPlugin = require("./asset/AssetModulesPlugin");
+const JavascriptModulesPlugin = require("./javascript/JavascriptModulesPlugin");
+const JsonModulesPlugin = require("./json/JsonModulesPlugin");
 
-const LoaderTargetPlugin = require("./LoaderTargetPlugin");
-const FunctionModulePlugin = require("./FunctionModulePlugin");
-const EvalDevToolModulePlugin = require("./EvalDevToolModulePlugin");
-const SourceMapDevToolPlugin = require("./SourceMapDevToolPlugin");
-const EvalSourceMapDevToolPlugin = require("./EvalSourceMapDevToolPlugin");
+const ChunkPrefetchPreloadPlugin = require("./prefetch/ChunkPrefetchPreloadPlugin");
 
 const EntryOptionPlugin = require("./EntryOptionPlugin");
 const RecordIdsPlugin = require("./RecordIdsPlugin");
 
+const RuntimePlugin = require("./RuntimePlugin");
+
 const APIPlugin = require("./APIPlugin");
-const ConstPlugin = require("./ConstPlugin");
-const RequireJsStuffPlugin = require("./RequireJsStuffPlugin");
-const NodeStuffPlugin = require("./NodeStuffPlugin");
 const CompatibilityPlugin = require("./CompatibilityPlugin");
+const ConstPlugin = require("./ConstPlugin");
+const ExportsInfoApiPlugin = require("./ExportsInfoApiPlugin");
+const WebpackIsIncludedPlugin = require("./WebpackIsIncludedPlugin");
 
 const TemplatedPathPlugin = require("./TemplatedPathPlugin");
-const WarnCaseSensitiveModulesPlugin = require("./WarnCaseSensitiveModulesPlugin");
 const UseStrictPlugin = require("./UseStrictPlugin");
+const WarnCaseSensitiveModulesPlugin = require("./WarnCaseSensitiveModulesPlugin");
+
+const DataUriPlugin = require("./schemes/DataUriPlugin");
+const FileUriPlugin = require("./schemes/FileUriPlugin");
+
+const ResolverCachePlugin = require("./cache/ResolverCachePlugin");
 
-const LoaderPlugin = require("./dependencies/LoaderPlugin");
 const CommonJsPlugin = require("./dependencies/CommonJsPlugin");
 const HarmonyModulesPlugin = require("./dependencies/HarmonyModulesPlugin");
-const SystemPlugin = require("./dependencies/SystemPlugin");
+const ImportMetaContextPlugin = require("./dependencies/ImportMetaContextPlugin");
+const ImportMetaPlugin = require("./dependencies/ImportMetaPlugin");
 const ImportPlugin = require("./dependencies/ImportPlugin");
-const AMDPlugin = require("./dependencies/AMDPlugin");
+const LoaderPlugin = require("./dependencies/LoaderPlugin");
 const RequireContextPlugin = require("./dependencies/RequireContextPlugin");
 const RequireEnsurePlugin = require("./dependencies/RequireEnsurePlugin");
 const RequireIncludePlugin = require("./dependencies/RequireIncludePlugin");
+const SystemPlugin = require("./dependencies/SystemPlugin");
+const URLPlugin = require("./dependencies/URLPlugin");
+const WorkerPlugin = require("./dependencies/WorkerPlugin");
+
+const InferAsyncModulesPlugin = require("./async-modules/InferAsyncModulesPlugin");
 
-const WarnNoModeSetPlugin = require("./WarnNoModeSetPlugin");
-
-const EnsureChunkConditionsPlugin = require("./optimize/EnsureChunkConditionsPlugin");
-const RemoveParentModulesPlugin = require("./optimize/RemoveParentModulesPlugin");
-const RemoveEmptyChunksPlugin = require("./optimize/RemoveEmptyChunksPlugin");
-const MergeDuplicateChunksPlugin = require("./optimize/MergeDuplicateChunksPlugin");
-const FlagIncludedChunksPlugin = require("./optimize/FlagIncludedChunksPlugin");
-const OccurrenceChunkOrderPlugin = require("./optimize/OccurrenceChunkOrderPlugin");
-const OccurrenceModuleOrderPlugin = require("./optimize/OccurrenceModuleOrderPlugin");
-const NaturalChunkOrderPlugin = require("./optimize/NaturalChunkOrderPlugin");
-const SideEffectsFlagPlugin = require("./optimize/SideEffectsFlagPlugin");
-const FlagDependencyUsagePlugin = require("./FlagDependencyUsagePlugin");
 const FlagDependencyExportsPlugin = require("./FlagDependencyExportsPlugin");
-const ModuleConcatenationPlugin = require("./optimize/ModuleConcatenationPlugin");
-const SplitChunksPlugin = require("./optimize/SplitChunksPlugin");
-const RuntimeChunkPlugin = require("./optimize/RuntimeChunkPlugin");
-const NoEmitOnErrorsPlugin = require("./NoEmitOnErrorsPlugin");
-const NamedModulesPlugin = require("./NamedModulesPlugin");
-const NamedChunksPlugin = require("./NamedChunksPlugin");
-const HashedModuleIdsPlugin = require("./HashedModuleIdsPlugin");
-const DefinePlugin = require("./DefinePlugin");
-const SizeLimitsPlugin = require("./performance/SizeLimitsPlugin");
-const WasmFinalizeExportsPlugin = require("./wasm/WasmFinalizeExportsPlugin");
-
-/** @typedef {import("../declarations/WebpackOptions").WebpackOptions} WebpackOptions */
+const JavascriptMetaInfoPlugin = require("./JavascriptMetaInfoPlugin");
+const DefaultStatsFactoryPlugin = require("./stats/DefaultStatsFactoryPlugin");
+const DefaultStatsPresetPlugin = require("./stats/DefaultStatsPresetPlugin");
+const DefaultStatsPrinterPlugin = require("./stats/DefaultStatsPrinterPlugin");
+
+const { cleverMerge } = require("./util/cleverMerge");
+
+/** @typedef {import("../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
+/** @typedef {import("../declarations/WebpackOptions").WebpackPluginFunction} WebpackPluginFunction */
+/** @typedef {import("../declarations/WebpackOptions").WebpackPluginInstance} WebpackPluginInstance */
 /** @typedef {import("./Compiler")} Compiler */
+/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
+/** @typedef {import("./util/fs").IntermediateFileSystem} IntermediateFileSystem */
+
+const CLASS_NAME = "WebpackOptionsApply";
 
 class WebpackOptionsApply extends OptionsApply {
 	constructor() {
@@ -77,378 +76,533 @@ class WebpackOptionsApply extends OptionsApply {
 	 * @returns {WebpackOptions} options object
 	 */
 	process(options, compiler) {
-		let ExternalsPlugin;
-		compiler.outputPath = options.output.path;
-		compiler.recordsInputPath = options.recordsInputPath || options.recordsPath;
-		compiler.recordsOutputPath =
-			options.recordsOutputPath || options.recordsPath;
+		compiler.outputPath = /** @type {string} */ (options.output.path);
+		compiler.recordsInputPath = options.recordsInputPath || null;
+		compiler.recordsOutputPath = options.recordsOutputPath || null;
 		compiler.name = options.name;
-		// TODO webpack 5 refactor this to MultiCompiler.setDependencies() with a WeakMap
-		// @ts-ignore TODO
-		compiler.dependencies = options.dependencies;
-		if (typeof options.target === "string") {
-			let JsonpTemplatePlugin;
-			let FetchCompileWasmTemplatePlugin;
-			let ReadFileCompileWasmTemplatePlugin;
-			let NodeSourcePlugin;
-			let NodeTargetPlugin;
-			let NodeTemplatePlugin;
-
-			switch (options.target) {
-				case "web":
-					JsonpTemplatePlugin = require("./web/JsonpTemplatePlugin");
-					FetchCompileWasmTemplatePlugin = require("./web/FetchCompileWasmTemplatePlugin");
-					NodeSourcePlugin = require("./node/NodeSourcePlugin");
-					new JsonpTemplatePlugin().apply(compiler);
-					new FetchCompileWasmTemplatePlugin({
-						mangleImports: options.optimization.mangleWasmImports
-					}).apply(compiler);
-					new FunctionModulePlugin().apply(compiler);
-					new NodeSourcePlugin(options.node).apply(compiler);
-					new LoaderTargetPlugin(options.target).apply(compiler);
-					break;
-				case "webworker": {
-					let WebWorkerTemplatePlugin = require("./webworker/WebWorkerTemplatePlugin");
-					FetchCompileWasmTemplatePlugin = require("./web/FetchCompileWasmTemplatePlugin");
-					NodeSourcePlugin = require("./node/NodeSourcePlugin");
-					new WebWorkerTemplatePlugin().apply(compiler);
-					new FetchCompileWasmTemplatePlugin({
-						mangleImports: options.optimization.mangleWasmImports
-					}).apply(compiler);
-					new FunctionModulePlugin().apply(compiler);
-					new NodeSourcePlugin(options.node).apply(compiler);
-					new LoaderTargetPlugin(options.target).apply(compiler);
-					break;
+
+		if (options.externals) {
+			// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+			const ExternalsPlugin = require("./ExternalsPlugin");
+			new ExternalsPlugin(options.externalsType, options.externals).apply(
+				compiler
+			);
+		}
+
+		if (options.externalsPresets.node) {
+			const NodeTargetPlugin = require("./node/NodeTargetPlugin");
+			new NodeTargetPlugin().apply(compiler);
+		}
+		if (options.externalsPresets.electronMain) {
+			// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+			const ElectronTargetPlugin = require("./electron/ElectronTargetPlugin");
+			new ElectronTargetPlugin("main").apply(compiler);
+		}
+		if (options.externalsPresets.electronPreload) {
+			// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+			const ElectronTargetPlugin = require("./electron/ElectronTargetPlugin");
+			new ElectronTargetPlugin("preload").apply(compiler);
+		}
+		if (options.externalsPresets.electronRenderer) {
+			// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+			const ElectronTargetPlugin = require("./electron/ElectronTargetPlugin");
+			new ElectronTargetPlugin("renderer").apply(compiler);
+		}
+		if (
+			options.externalsPresets.electron &&
+			!options.externalsPresets.electronMain &&
+			!options.externalsPresets.electronPreload &&
+			!options.externalsPresets.electronRenderer
+		) {
+			// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+			const ElectronTargetPlugin = require("./electron/ElectronTargetPlugin");
+			new ElectronTargetPlugin().apply(compiler);
+		}
+		if (options.externalsPresets.nwjs) {
+			// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+			const ExternalsPlugin = require("./ExternalsPlugin");
+			new ExternalsPlugin("node-commonjs", "nw.gui").apply(compiler);
+		}
+		if (options.externalsPresets.webAsync) {
+			// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+			const ExternalsPlugin = require("./ExternalsPlugin");
+			new ExternalsPlugin("import", ({ request, dependencyType }, callback) => {
+				if (dependencyType === "url") {
+					if (/^(\/\/|https?:\/\/|#)/.test(/** @type {string} */ (request)))
+						return callback(null, `asset ${request}`);
+				} else if (options.experiments.css && dependencyType === "css-import") {
+					if (/^(\/\/|https?:\/\/|#)/.test(/** @type {string} */ (request)))
+						return callback(null, `css-import ${request}`);
+				} else if (
+					options.experiments.css &&
+					/^(\/\/|https?:\/\/|std:)/.test(/** @type {string} */ (request))
+				) {
+					if (/^\.css(\?|$)/.test(/** @type {string} */ (request)))
+						return callback(null, `css-import ${request}`);
+					return callback(null, `import ${request}`);
 				}
-				case "node":
-				case "async-node":
-					NodeTemplatePlugin = require("./node/NodeTemplatePlugin");
-					ReadFileCompileWasmTemplatePlugin = require("./node/ReadFileCompileWasmTemplatePlugin");
-					NodeTargetPlugin = require("./node/NodeTargetPlugin");
-					new NodeTemplatePlugin({
-						asyncChunkLoading: options.target === "async-node"
-					}).apply(compiler);
-					new ReadFileCompileWasmTemplatePlugin({
-						mangleImports: options.optimization.mangleWasmImports
-					}).apply(compiler);
-					new FunctionModulePlugin().apply(compiler);
-					new NodeTargetPlugin().apply(compiler);
-					new LoaderTargetPlugin("node").apply(compiler);
-					break;
-				case "node-webkit":
-					JsonpTemplatePlugin = require("./web/JsonpTemplatePlugin");
-					NodeTargetPlugin = require("./node/NodeTargetPlugin");
-					ExternalsPlugin = require("./ExternalsPlugin");
-					new JsonpTemplatePlugin().apply(compiler);
-					new FunctionModulePlugin().apply(compiler);
-					new NodeTargetPlugin().apply(compiler);
-					new ExternalsPlugin("commonjs", "nw.gui").apply(compiler);
-					new LoaderTargetPlugin(options.target).apply(compiler);
+				callback();
+			}).apply(compiler);
+		} else if (options.externalsPresets.web) {
+			// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+			const ExternalsPlugin = require("./ExternalsPlugin");
+			new ExternalsPlugin("module", ({ request, dependencyType }, callback) => {
+				if (dependencyType === "url") {
+					if (/^(\/\/|https?:\/\/|#)/.test(/** @type {string} */ (request)))
+						return callback(null, `asset ${request}`);
+				} else if (options.experiments.css && dependencyType === "css-import") {
+					if (/^(\/\/|https?:\/\/|#)/.test(/** @type {string} */ (request)))
+						return callback(null, `css-import ${request}`);
+				} else if (
+					/^(\/\/|https?:\/\/|std:)/.test(/** @type {string} */ (request))
+				) {
+					if (
+						options.experiments.css &&
+						/^\.css((\?)|$)/.test(/** @type {string} */ (request))
+					)
+						return callback(null, `css-import ${request}`);
+					return callback(null, `module ${request}`);
+				}
+				callback();
+			}).apply(compiler);
+		} else if (options.externalsPresets.node && options.experiments.css) {
+			// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+			const ExternalsPlugin = require("./ExternalsPlugin");
+			new ExternalsPlugin("module", ({ request, dependencyType }, callback) => {
+				if (dependencyType === "url") {
+					if (/^(\/\/|https?:\/\/|#)/.test(/** @type {string} */ (request)))
+						return callback(null, `asset ${request}`);
+				} else if (dependencyType === "css-import") {
+					if (/^(\/\/|https?:\/\/|#)/.test(/** @type {string} */ (request)))
+						return callback(null, `css-import ${request}`);
+				} else if (
+					/^(\/\/|https?:\/\/|std:)/.test(/** @type {string} */ (request))
+				) {
+					if (/^\.css(\?|$)/.test(/** @type {string} */ (request)))
+						return callback(null, `css-import ${request}`);
+					return callback(null, `module ${request}`);
+				}
+				callback();
+			}).apply(compiler);
+		}
+
+		new ChunkPrefetchPreloadPlugin().apply(compiler);
+
+		if (typeof options.output.chunkFormat === "string") {
+			switch (options.output.chunkFormat) {
+				case "array-push": {
+					const ArrayPushCallbackChunkFormatPlugin = require("./javascript/ArrayPushCallbackChunkFormatPlugin");
+					new ArrayPushCallbackChunkFormatPlugin().apply(compiler);
 					break;
-				case "electron-main":
-					NodeTemplatePlugin = require("./node/NodeTemplatePlugin");
-					NodeTargetPlugin = require("./node/NodeTargetPlugin");
-					ExternalsPlugin = require("./ExternalsPlugin");
-					new NodeTemplatePlugin({
-						asyncChunkLoading: true
-					}).apply(compiler);
-					new FunctionModulePlugin().apply(compiler);
-					new NodeTargetPlugin().apply(compiler);
-					new ExternalsPlugin("commonjs", [
-						"app",
-						"auto-updater",
-						"browser-window",
-						"clipboard",
-						"content-tracing",
-						"crash-reporter",
-						"dialog",
-						"electron",
-						"global-shortcut",
-						"ipc",
-						"ipc-main",
-						"menu",
-						"menu-item",
-						"native-image",
-						"original-fs",
-						"power-monitor",
-						"power-save-blocker",
-						"protocol",
-						"screen",
-						"session",
-						"shell",
-						"tray",
-						"web-contents"
-					]).apply(compiler);
-					new LoaderTargetPlugin(options.target).apply(compiler);
+				}
+				case "commonjs": {
+					const CommonJsChunkFormatPlugin = require("./javascript/CommonJsChunkFormatPlugin");
+					new CommonJsChunkFormatPlugin().apply(compiler);
 					break;
-				case "electron-renderer":
-					JsonpTemplatePlugin = require("./web/JsonpTemplatePlugin");
-					FetchCompileWasmTemplatePlugin = require("./web/FetchCompileWasmTemplatePlugin");
-					NodeTargetPlugin = require("./node/NodeTargetPlugin");
-					ExternalsPlugin = require("./ExternalsPlugin");
-					new JsonpTemplatePlugin().apply(compiler);
-					new FetchCompileWasmTemplatePlugin({
-						mangleImports: options.optimization.mangleWasmImports
-					}).apply(compiler);
-					new FunctionModulePlugin().apply(compiler);
-					new NodeTargetPlugin().apply(compiler);
-					new ExternalsPlugin("commonjs", [
-						"clipboard",
-						"crash-reporter",
-						"desktop-capturer",
-						"electron",
-						"ipc",
-						"ipc-renderer",
-						"native-image",
-						"original-fs",
-						"remote",
-						"screen",
-						"shell",
-						"web-frame"
-					]).apply(compiler);
-					new LoaderTargetPlugin(options.target).apply(compiler);
+				}
+				case "module": {
+					const ModuleChunkFormatPlugin = require("./esm/ModuleChunkFormatPlugin");
+					new ModuleChunkFormatPlugin().apply(compiler);
 					break;
+				}
 				default:
-					throw new Error("Unsupported target '" + options.target + "'.");
+					throw new Error(
+						`Unsupported chunk format '${options.output.chunkFormat}'.`
+					);
 			}
 		}
-		// @ts-ignore This is always true, which is good this way
-		else if (options.target !== false) {
-			options.target(compiler);
-		} else {
-			throw new Error("Unsupported target '" + options.target + "'.");
-		}
-
-		if (options.output.library || options.output.libraryTarget !== "var") {
-			const LibraryTemplatePlugin = require("./LibraryTemplatePlugin");
-			new LibraryTemplatePlugin(
-				options.output.library,
-				options.output.libraryTarget,
-				options.output.umdNamedDefine,
-				options.output.auxiliaryComment || "",
-				options.output.libraryExport
-			).apply(compiler);
+
+		const enabledChunkLoadingTypes =
+			/** @type {NonNullable} */
+			(options.output.enabledChunkLoadingTypes);
+
+		if (enabledChunkLoadingTypes.length > 0) {
+			for (const type of enabledChunkLoadingTypes) {
+				const EnableChunkLoadingPlugin = require("./javascript/EnableChunkLoadingPlugin");
+				new EnableChunkLoadingPlugin(type).apply(compiler);
+			}
 		}
-		if (options.externals) {
-			ExternalsPlugin = require("./ExternalsPlugin");
-			new ExternalsPlugin(
-				options.output.libraryTarget,
-				options.externals
+
+		const enabledWasmLoadingTypes =
+			/** @type {NonNullable} */
+			(options.output.enabledWasmLoadingTypes);
+
+		if (enabledWasmLoadingTypes.length > 0) {
+			for (const type of enabledWasmLoadingTypes) {
+				const EnableWasmLoadingPlugin = require("./wasm/EnableWasmLoadingPlugin");
+				new EnableWasmLoadingPlugin(type).apply(compiler);
+			}
+		}
+
+		const enabledLibraryTypes =
+			/** @type {NonNullable} */
+			(options.output.enabledLibraryTypes);
+
+		if (enabledLibraryTypes.length > 0) {
+			let once = true;
+			for (const type of enabledLibraryTypes) {
+				const EnableLibraryPlugin = require("./library/EnableLibraryPlugin");
+				new EnableLibraryPlugin(type, {
+					// eslint-disable-next-line no-loop-func
+					additionalApply: () => {
+						if (!once) return;
+						once = false;
+						// We rely on `exportInfo` to generate the `export statement` in certain library bundles.
+						// Therefore, we ignore the disabling of `optimization.providedExport` and continue to apply `FlagDependencyExportsPlugin`.
+						if (
+							["module", "commonjs-static", "modern-module"].includes(type) &&
+							!options.optimization.providedExports
+						) {
+							new FlagDependencyExportsPlugin().apply(compiler);
+						}
+					}
+				}).apply(compiler);
+			}
+		}
+
+		if (options.output.pathinfo) {
+			const ModuleInfoHeaderPlugin = require("./ModuleInfoHeaderPlugin");
+			new ModuleInfoHeaderPlugin(options.output.pathinfo !== true).apply(
+				compiler
+			);
+		}
+
+		if (options.output.clean) {
+			const CleanPlugin = require("./CleanPlugin");
+			new CleanPlugin(
+				options.output.clean === true ? {} : options.output.clean
 			).apply(compiler);
 		}
 
-		let noSources;
-		let legacy;
-		let modern;
-		let comment;
-		if (
-			options.devtool &&
-			(options.devtool.includes("sourcemap") ||
-				options.devtool.includes("source-map"))
-		) {
-			const hidden = options.devtool.includes("hidden");
-			const inline = options.devtool.includes("inline");
-			const evalWrapped = options.devtool.includes("eval");
-			const cheap = options.devtool.includes("cheap");
-			const moduleMaps = options.devtool.includes("module");
-			noSources = options.devtool.includes("nosources");
-			legacy = options.devtool.includes("@");
-			modern = options.devtool.includes("#");
-			comment =
-				legacy && modern
-					? "\n/*\n//@ source" +
-					  "MappingURL=[url]\n//# source" +
-					  "MappingURL=[url]\n*/"
-					: legacy
-						? "\n/*\n//@ source" + "MappingURL=[url]\n*/"
-						: modern
-							? "\n//# source" + "MappingURL=[url]"
-							: null;
-			const Plugin = evalWrapped
-				? EvalSourceMapDevToolPlugin
-				: SourceMapDevToolPlugin;
-			new Plugin({
-				filename: inline ? null : options.output.sourceMapFilename,
-				moduleFilenameTemplate: options.output.devtoolModuleFilenameTemplate,
-				fallbackModuleFilenameTemplate:
-					options.output.devtoolFallbackModuleFilenameTemplate,
-				append: hidden ? false : comment,
-				module: moduleMaps ? true : cheap ? false : true,
-				columns: cheap ? false : true,
-				lineToLine: options.output.devtoolLineToLine,
-				noSources: noSources,
-				namespace: options.output.devtoolNamespace
-			}).apply(compiler);
-		} else if (options.devtool && options.devtool.includes("eval")) {
-			legacy = options.devtool.includes("@");
-			modern = options.devtool.includes("#");
-			comment =
-				legacy && modern
-					? "\n//@ sourceURL=[url]\n//# sourceURL=[url]"
-					: legacy
-						? "\n//@ sourceURL=[url]"
-						: modern
-							? "\n//# sourceURL=[url]"
-							: null;
-			new EvalDevToolModulePlugin({
-				sourceUrlComment: comment,
-				moduleFilenameTemplate: options.output.devtoolModuleFilenameTemplate,
-				namespace: options.output.devtoolNamespace
-			}).apply(compiler);
+		if (options.devtool) {
+			if (options.devtool.includes("source-map")) {
+				const hidden = options.devtool.includes("hidden");
+				const inline = options.devtool.includes("inline");
+				const evalWrapped = options.devtool.includes("eval");
+				const cheap = options.devtool.includes("cheap");
+				const moduleMaps = options.devtool.includes("module");
+				const noSources = options.devtool.includes("nosources");
+				const debugIds = options.devtool.includes("debugids");
+				const Plugin = evalWrapped
+					? require("./EvalSourceMapDevToolPlugin")
+					: require("./SourceMapDevToolPlugin");
+				new Plugin({
+					filename: inline ? null : options.output.sourceMapFilename,
+					moduleFilenameTemplate: options.output.devtoolModuleFilenameTemplate,
+					fallbackModuleFilenameTemplate:
+						options.output.devtoolFallbackModuleFilenameTemplate,
+					append: hidden ? false : undefined,
+					module: moduleMaps ? true : !cheap,
+					columns: !cheap,
+					noSources,
+					namespace: options.output.devtoolNamespace,
+					debugIds
+				}).apply(compiler);
+			} else if (options.devtool.includes("eval")) {
+				const EvalDevToolModulePlugin = require("./EvalDevToolModulePlugin");
+				new EvalDevToolModulePlugin({
+					moduleFilenameTemplate: options.output.devtoolModuleFilenameTemplate,
+					namespace: options.output.devtoolNamespace
+				}).apply(compiler);
+			}
 		}
 
 		new JavascriptModulesPlugin().apply(compiler);
 		new JsonModulesPlugin().apply(compiler);
-		new WebAssemblyModulesPlugin({
-			mangleImports: options.optimization.mangleWasmImports
-		}).apply(compiler);
+		new AssetModulesPlugin().apply(compiler);
+
+		if (!options.experiments.outputModule) {
+			if (options.output.module) {
+				throw new Error(
+					"'output.module: true' is only allowed when 'experiments.outputModule' is enabled"
+				);
+			}
+			if (options.output.enabledLibraryTypes.includes("module")) {
+				throw new Error(
+					"library type \"module\" is only allowed when 'experiments.outputModule' is enabled"
+				);
+			}
+			if (options.output.enabledLibraryTypes.includes("modern-module")) {
+				throw new Error(
+					"library type \"modern-module\" is only allowed when 'experiments.outputModule' is enabled"
+				);
+			}
+			if (
+				options.externalsType === "module" ||
+				options.externalsType === "module-import"
+			) {
+				throw new Error(
+					"'externalsType: \"module\"' is only allowed when 'experiments.outputModule' is enabled"
+				);
+			}
+		}
+
+		if (options.experiments.syncWebAssembly) {
+			const WebAssemblyModulesPlugin = require("./wasm-sync/WebAssemblyModulesPlugin");
+			new WebAssemblyModulesPlugin({
+				mangleImports: options.optimization.mangleWasmImports
+			}).apply(compiler);
+		}
+
+		if (options.experiments.asyncWebAssembly) {
+			const AsyncWebAssemblyModulesPlugin = require("./wasm-async/AsyncWebAssemblyModulesPlugin");
+			new AsyncWebAssemblyModulesPlugin({
+				mangleImports: options.optimization.mangleWasmImports
+			}).apply(compiler);
+		}
+
+		if (options.experiments.css) {
+			const CssModulesPlugin = require("./css/CssModulesPlugin");
+			new CssModulesPlugin().apply(compiler);
+		}
+
+		if (options.experiments.lazyCompilation) {
+			const LazyCompilationPlugin = require("./hmr/LazyCompilationPlugin");
+			const lazyOptions =
+				typeof options.experiments.lazyCompilation === "object"
+					? options.experiments.lazyCompilation
+					: {};
+			new LazyCompilationPlugin({
+				backend:
+					typeof lazyOptions.backend === "function"
+						? lazyOptions.backend
+						: require("./hmr/lazyCompilationBackend")({
+								...lazyOptions.backend,
+								client:
+									(lazyOptions.backend && lazyOptions.backend.client) ||
+									require.resolve(
+										`../hot/lazy-compilation-${
+											options.externalsPresets.node ? "node" : "web"
+										}.js`
+									)
+							}),
+				entries: !lazyOptions || lazyOptions.entries !== false,
+				imports: !lazyOptions || lazyOptions.imports !== false,
+				test: (lazyOptions && lazyOptions.test) || undefined
+			}).apply(compiler);
+		}
+
+		if (options.experiments.buildHttp) {
+			const HttpUriPlugin = require("./schemes/HttpUriPlugin");
+			const httpOptions = options.experiments.buildHttp;
+			new HttpUriPlugin(httpOptions).apply(compiler);
+		}
 
 		new EntryOptionPlugin().apply(compiler);
-		compiler.hooks.entryOption.call(options.context, options.entry);
+		compiler.hooks.entryOption.call(
+			/** @type {string} */
+			(options.context),
+			options.entry
+		);
+
+		new RuntimePlugin().apply(compiler);
+
+		new InferAsyncModulesPlugin().apply(compiler);
+
+		new DataUriPlugin().apply(compiler);
+		new FileUriPlugin().apply(compiler);
 
 		new CompatibilityPlugin().apply(compiler);
-		new HarmonyModulesPlugin(options.module).apply(compiler);
-		new AMDPlugin(options.module, options.amd || {}).apply(compiler);
-		new CommonJsPlugin(options.module).apply(compiler);
+		new HarmonyModulesPlugin({
+			topLevelAwait: options.experiments.topLevelAwait
+		}).apply(compiler);
+		if (options.amd !== false) {
+			const AMDPlugin = require("./dependencies/AMDPlugin");
+			const RequireJsStuffPlugin = require("./RequireJsStuffPlugin");
+			new AMDPlugin(options.amd || {}).apply(compiler);
+			new RequireJsStuffPlugin().apply(compiler);
+		}
+		new CommonJsPlugin().apply(compiler);
 		new LoaderPlugin().apply(compiler);
-		new NodeStuffPlugin(options.node).apply(compiler);
-		new RequireJsStuffPlugin().apply(compiler);
-		new APIPlugin().apply(compiler);
+		if (options.node !== false) {
+			const NodeStuffPlugin = require("./NodeStuffPlugin");
+			new NodeStuffPlugin(options.node).apply(compiler);
+		}
+		new APIPlugin({
+			module: options.output.module
+		}).apply(compiler);
+		new ExportsInfoApiPlugin().apply(compiler);
+		new WebpackIsIncludedPlugin().apply(compiler);
 		new ConstPlugin().apply(compiler);
 		new UseStrictPlugin().apply(compiler);
 		new RequireIncludePlugin().apply(compiler);
 		new RequireEnsurePlugin().apply(compiler);
-		new RequireContextPlugin(
-			options.resolve.modules,
-			options.resolve.extensions,
-			options.resolve.mainFiles
+		new RequireContextPlugin().apply(compiler);
+		new ImportPlugin().apply(compiler);
+		new ImportMetaContextPlugin().apply(compiler);
+		new SystemPlugin().apply(compiler);
+		new ImportMetaPlugin().apply(compiler);
+		new URLPlugin().apply(compiler);
+		new WorkerPlugin(
+			options.output.workerChunkLoading,
+			options.output.workerWasmLoading,
+			options.output.module,
+			options.output.workerPublicPath
 		).apply(compiler);
-		new ImportPlugin(options.module).apply(compiler);
-		new SystemPlugin(options.module).apply(compiler);
+
+		new DefaultStatsFactoryPlugin().apply(compiler);
+		new DefaultStatsPresetPlugin().apply(compiler);
+		new DefaultStatsPrinterPlugin().apply(compiler);
+
+		new JavascriptMetaInfoPlugin().apply(compiler);
 
 		if (typeof options.mode !== "string") {
+			const WarnNoModeSetPlugin = require("./WarnNoModeSetPlugin");
 			new WarnNoModeSetPlugin().apply(compiler);
 		}
 
+		const EnsureChunkConditionsPlugin = require("./optimize/EnsureChunkConditionsPlugin");
 		new EnsureChunkConditionsPlugin().apply(compiler);
 		if (options.optimization.removeAvailableModules) {
+			const RemoveParentModulesPlugin = require("./optimize/RemoveParentModulesPlugin");
 			new RemoveParentModulesPlugin().apply(compiler);
 		}
 		if (options.optimization.removeEmptyChunks) {
+			const RemoveEmptyChunksPlugin = require("./optimize/RemoveEmptyChunksPlugin");
 			new RemoveEmptyChunksPlugin().apply(compiler);
 		}
 		if (options.optimization.mergeDuplicateChunks) {
+			const MergeDuplicateChunksPlugin = require("./optimize/MergeDuplicateChunksPlugin");
 			new MergeDuplicateChunksPlugin().apply(compiler);
 		}
 		if (options.optimization.flagIncludedChunks) {
+			const FlagIncludedChunksPlugin = require("./optimize/FlagIncludedChunksPlugin");
 			new FlagIncludedChunksPlugin().apply(compiler);
 		}
 		if (options.optimization.sideEffects) {
-			new SideEffectsFlagPlugin().apply(compiler);
+			const SideEffectsFlagPlugin = require("./optimize/SideEffectsFlagPlugin");
+			new SideEffectsFlagPlugin(
+				options.optimization.sideEffects === true
+			).apply(compiler);
 		}
 		if (options.optimization.providedExports) {
 			new FlagDependencyExportsPlugin().apply(compiler);
 		}
 		if (options.optimization.usedExports) {
-			new FlagDependencyUsagePlugin().apply(compiler);
+			const FlagDependencyUsagePlugin = require("./FlagDependencyUsagePlugin");
+			new FlagDependencyUsagePlugin(
+				options.optimization.usedExports === "global"
+			).apply(compiler);
+		}
+		if (options.optimization.innerGraph) {
+			const InnerGraphPlugin = require("./optimize/InnerGraphPlugin");
+			new InnerGraphPlugin().apply(compiler);
+		}
+		if (options.optimization.mangleExports) {
+			const MangleExportsPlugin = require("./optimize/MangleExportsPlugin");
+			new MangleExportsPlugin(
+				options.optimization.mangleExports !== "size"
+			).apply(compiler);
 		}
 		if (options.optimization.concatenateModules) {
+			const ModuleConcatenationPlugin = require("./optimize/ModuleConcatenationPlugin");
 			new ModuleConcatenationPlugin().apply(compiler);
 		}
 		if (options.optimization.splitChunks) {
+			const SplitChunksPlugin = require("./optimize/SplitChunksPlugin");
 			new SplitChunksPlugin(options.optimization.splitChunks).apply(compiler);
 		}
 		if (options.optimization.runtimeChunk) {
+			const RuntimeChunkPlugin = require("./optimize/RuntimeChunkPlugin");
 			new RuntimeChunkPlugin(options.optimization.runtimeChunk).apply(compiler);
 		}
-		if (options.optimization.noEmitOnErrors) {
+		if (!options.optimization.emitOnErrors) {
+			const NoEmitOnErrorsPlugin = require("./NoEmitOnErrorsPlugin");
 			new NoEmitOnErrorsPlugin().apply(compiler);
 		}
+		if (options.optimization.realContentHash) {
+			const RealContentHashPlugin = require("./optimize/RealContentHashPlugin");
+			new RealContentHashPlugin({
+				hashFunction:
+					/** @type {NonNullable} */
+					(options.output.hashFunction),
+				hashDigest:
+					/** @type {NonNullable} */
+					(options.output.hashDigest)
+			}).apply(compiler);
+		}
 		if (options.optimization.checkWasmTypes) {
+			const WasmFinalizeExportsPlugin = require("./wasm-sync/WasmFinalizeExportsPlugin");
 			new WasmFinalizeExportsPlugin().apply(compiler);
 		}
-		let moduleIds = options.optimization.moduleIds;
-		if (moduleIds === undefined) {
-			// TODO webpack 5 remove all these options
-			if (options.optimization.occurrenceOrder) {
-				moduleIds = "size";
-			}
-			if (options.optimization.namedModules) {
-				moduleIds = "named";
-			}
-			if (options.optimization.hashedModuleIds) {
-				moduleIds = "hashed";
-			}
-			if (moduleIds === undefined) {
-				moduleIds = "natural";
-			}
-		}
+		const moduleIds = options.optimization.moduleIds;
 		if (moduleIds) {
 			switch (moduleIds) {
-				case "natural":
-					// TODO webpack 5: see hint in Compilation.sortModules
-					break;
-				case "named":
-					new NamedModulesPlugin().apply(compiler);
+				case "natural": {
+					const NaturalModuleIdsPlugin = require("./ids/NaturalModuleIdsPlugin");
+					new NaturalModuleIdsPlugin().apply(compiler);
 					break;
-				case "hashed":
-					new HashedModuleIdsPlugin().apply(compiler);
+				}
+				case "named": {
+					const NamedModuleIdsPlugin = require("./ids/NamedModuleIdsPlugin");
+					new NamedModuleIdsPlugin().apply(compiler);
 					break;
-				case "size":
-					new OccurrenceModuleOrderPlugin({
-						prioritiseInitial: true
+				}
+				case "hashed": {
+					const WarnDeprecatedOptionPlugin = require("./WarnDeprecatedOptionPlugin");
+					const HashedModuleIdsPlugin = require("./ids/HashedModuleIdsPlugin");
+					new WarnDeprecatedOptionPlugin(
+						"optimization.moduleIds",
+						"hashed",
+						"deterministic"
+					).apply(compiler);
+					new HashedModuleIdsPlugin({
+						hashFunction: options.output.hashFunction
 					}).apply(compiler);
 					break;
-				case "total-size":
-					new OccurrenceModuleOrderPlugin({
-						prioritiseInitial: false
+				}
+				case "deterministic": {
+					const DeterministicModuleIdsPlugin = require("./ids/DeterministicModuleIdsPlugin");
+					new DeterministicModuleIdsPlugin().apply(compiler);
+					break;
+				}
+				case "size": {
+					const OccurrenceModuleIdsPlugin = require("./ids/OccurrenceModuleIdsPlugin");
+					new OccurrenceModuleIdsPlugin({
+						prioritiseInitial: true
 					}).apply(compiler);
 					break;
+				}
 				default:
 					throw new Error(
 						`webpack bug: moduleIds: ${moduleIds} is not implemented`
 					);
 			}
 		}
-		let chunkIds = options.optimization.chunkIds;
-		if (chunkIds === undefined) {
-			// TODO webpack 5 remove all these options
-			if (options.optimization.occurrenceOrder) {
-				// This looks weird but it's for backward-compat
-				// This bug already existed before adding this feature
-				chunkIds = "total-size";
-			}
-			if (options.optimization.namedChunks) {
-				chunkIds = "named";
-			}
-			if (chunkIds === undefined) {
-				chunkIds = "natural";
-			}
-		}
+		const chunkIds = options.optimization.chunkIds;
 		if (chunkIds) {
 			switch (chunkIds) {
-				case "natural":
-					new NaturalChunkOrderPlugin().apply(compiler);
+				case "natural": {
+					const NaturalChunkIdsPlugin = require("./ids/NaturalChunkIdsPlugin");
+					new NaturalChunkIdsPlugin().apply(compiler);
 					break;
-				case "named":
-					// TODO webapck 5: for backward-compat this need to have OccurrenceChunkOrderPlugin too
-					// The NamedChunksPlugin doesn't give every chunk a name
-					// This should be fixed, and the OccurrenceChunkOrderPlugin should be removed here.
-					new OccurrenceChunkOrderPlugin({
-						prioritiseInitial: false
-					}).apply(compiler);
-					new NamedChunksPlugin().apply(compiler);
+				}
+				case "named": {
+					const NamedChunkIdsPlugin = require("./ids/NamedChunkIdsPlugin");
+					new NamedChunkIdsPlugin().apply(compiler);
 					break;
-				case "size":
-					new OccurrenceChunkOrderPlugin({
+				}
+				case "deterministic": {
+					const DeterministicChunkIdsPlugin = require("./ids/DeterministicChunkIdsPlugin");
+					new DeterministicChunkIdsPlugin().apply(compiler);
+					break;
+				}
+				case "size": {
+					// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+					const OccurrenceChunkIdsPlugin = require("./ids/OccurrenceChunkIdsPlugin");
+					new OccurrenceChunkIdsPlugin({
 						prioritiseInitial: true
 					}).apply(compiler);
 					break;
-				case "total-size":
-					new OccurrenceChunkOrderPlugin({
+				}
+				case "total-size": {
+					// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+					const OccurrenceChunkIdsPlugin = require("./ids/OccurrenceChunkIdsPlugin");
+					new OccurrenceChunkIdsPlugin({
 						prioritiseInitial: false
 					}).apply(compiler);
 					break;
+				}
 				default:
 					throw new Error(
 						`webpack bug: chunkIds: ${chunkIds} is not implemented`
@@ -456,21 +610,26 @@ class WebpackOptionsApply extends OptionsApply {
 			}
 		}
 		if (options.optimization.nodeEnv) {
+			const DefinePlugin = require("./DefinePlugin");
 			new DefinePlugin({
 				"process.env.NODE_ENV": JSON.stringify(options.optimization.nodeEnv)
 			}).apply(compiler);
 		}
 		if (options.optimization.minimize) {
-			for (const minimizer of options.optimization.minimizer) {
+			for (const minimizer of /** @type {(WebpackPluginInstance | WebpackPluginFunction | "...")[]} */ (
+				options.optimization.minimizer
+			)) {
 				if (typeof minimizer === "function") {
-					minimizer.call(compiler, compiler);
-				} else {
+					/** @type {WebpackPluginFunction} */
+					(minimizer).call(compiler, compiler);
+				} else if (minimizer !== "..." && minimizer) {
 					minimizer.apply(compiler);
 				}
 			}
 		}
 
 		if (options.performance) {
+			const SizeLimitsPlugin = require("./performance/SizeLimitsPlugin");
 			new SizeLimitsPlugin(options.performance).apply(compiler);
 		}
 
@@ -482,11 +641,120 @@ class WebpackOptionsApply extends OptionsApply {
 
 		new WarnCaseSensitiveModulesPlugin().apply(compiler);
 
-		if (options.cache) {
-			const CachePlugin = require("./CachePlugin");
-			new CachePlugin(
-				typeof options.cache === "object" ? options.cache : null
-			).apply(compiler);
+		const AddManagedPathsPlugin = require("./cache/AddManagedPathsPlugin");
+		new AddManagedPathsPlugin(
+			/** @type {NonNullable} */
+			(options.snapshot.managedPaths),
+			/** @type {NonNullable} */
+			(options.snapshot.immutablePaths),
+			/** @type {NonNullable} */
+			(options.snapshot.unmanagedPaths)
+		).apply(compiler);
+
+		if (options.cache && typeof options.cache === "object") {
+			const cacheOptions = options.cache;
+			switch (cacheOptions.type) {
+				case "memory": {
+					if (Number.isFinite(cacheOptions.maxGenerations)) {
+						// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+						const MemoryWithGcCachePlugin = require("./cache/MemoryWithGcCachePlugin");
+						new MemoryWithGcCachePlugin({
+							maxGenerations:
+								/** @type {number} */
+								(cacheOptions.maxGenerations)
+						}).apply(compiler);
+					} else {
+						// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+						const MemoryCachePlugin = require("./cache/MemoryCachePlugin");
+						new MemoryCachePlugin().apply(compiler);
+					}
+					if (cacheOptions.cacheUnaffected) {
+						if (!options.experiments.cacheUnaffected) {
+							throw new Error(
+								"'cache.cacheUnaffected: true' is only allowed when 'experiments.cacheUnaffected' is enabled"
+							);
+						}
+						compiler.moduleMemCaches = new Map();
+					}
+					break;
+				}
+				case "filesystem": {
+					const AddBuildDependenciesPlugin = require("./cache/AddBuildDependenciesPlugin");
+					// eslint-disable-next-line guard-for-in
+					for (const key in cacheOptions.buildDependencies) {
+						const list = cacheOptions.buildDependencies[key];
+						new AddBuildDependenciesPlugin(list).apply(compiler);
+					}
+					if (!Number.isFinite(cacheOptions.maxMemoryGenerations)) {
+						// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+						const MemoryCachePlugin = require("./cache/MemoryCachePlugin");
+						new MemoryCachePlugin().apply(compiler);
+					} else if (cacheOptions.maxMemoryGenerations !== 0) {
+						// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+						const MemoryWithGcCachePlugin = require("./cache/MemoryWithGcCachePlugin");
+						new MemoryWithGcCachePlugin({
+							maxGenerations:
+								/** @type {number} */
+								(cacheOptions.maxMemoryGenerations)
+						}).apply(compiler);
+					}
+					if (cacheOptions.memoryCacheUnaffected) {
+						if (!options.experiments.cacheUnaffected) {
+							throw new Error(
+								"'cache.memoryCacheUnaffected: true' is only allowed when 'experiments.cacheUnaffected' is enabled"
+							);
+						}
+						compiler.moduleMemCaches = new Map();
+					}
+					switch (cacheOptions.store) {
+						case "pack": {
+							const IdleFileCachePlugin = require("./cache/IdleFileCachePlugin");
+							const PackFileCacheStrategy = require("./cache/PackFileCacheStrategy");
+							new IdleFileCachePlugin(
+								new PackFileCacheStrategy({
+									compiler,
+									fs:
+										/** @type {IntermediateFileSystem} */
+										(compiler.intermediateFileSystem),
+									context: /** @type {string} */ (options.context),
+									cacheLocation:
+										/** @type {string} */
+										(cacheOptions.cacheLocation),
+									version: /** @type {string} */ (cacheOptions.version),
+									logger: compiler.getInfrastructureLogger(
+										"webpack.cache.PackFileCacheStrategy"
+									),
+									snapshot: options.snapshot,
+									maxAge: /** @type {number} */ (cacheOptions.maxAge),
+									profile: cacheOptions.profile,
+									allowCollectingMemory: cacheOptions.allowCollectingMemory,
+									compression: cacheOptions.compression,
+									readonly: cacheOptions.readonly
+								}),
+								/** @type {number} */
+								(cacheOptions.idleTimeout),
+								/** @type {number} */
+								(cacheOptions.idleTimeoutForInitialStore),
+								/** @type {number} */
+								(cacheOptions.idleTimeoutAfterLargeChanges)
+							).apply(compiler);
+							break;
+						}
+						default:
+							throw new Error("Unhandled value for cache.store");
+					}
+					break;
+				}
+				default:
+					// @ts-expect-error Property 'type' does not exist on type 'never'. ts(2339)
+					throw new Error(`Unknown cache type ${cacheOptions.type}`);
+			}
+		}
+		new ResolverCachePlugin().apply(compiler);
+
+		if (options.ignoreWarnings && options.ignoreWarnings.length > 0) {
+			const IgnoreWarningsPlugin = require("./IgnoreWarningsPlugin");
+			new IgnoreWarningsPlugin(options.ignoreWarnings).apply(compiler);
 		}
 
 		compiler.hooks.afterPlugins.call(compiler);
@@ -495,37 +763,31 @@ class WebpackOptionsApply extends OptionsApply {
 		}
 		compiler.resolverFactory.hooks.resolveOptions
 			.for("normal")
-			.tap("WebpackOptionsApply", resolveOptions => {
-				return Object.assign(
-					{
-						fileSystem: compiler.inputFileSystem
-					},
-					options.resolve,
-					resolveOptions
-				);
+			.tap(CLASS_NAME, resolveOptions => {
+				resolveOptions = cleverMerge(options.resolve, resolveOptions);
+				resolveOptions.fileSystem =
+					/** @type {InputFileSystem} */
+					(compiler.inputFileSystem);
+				return resolveOptions;
 			});
 		compiler.resolverFactory.hooks.resolveOptions
 			.for("context")
-			.tap("WebpackOptionsApply", resolveOptions => {
-				return Object.assign(
-					{
-						fileSystem: compiler.inputFileSystem,
-						resolveToContext: true
-					},
-					options.resolve,
-					resolveOptions
-				);
+			.tap(CLASS_NAME, resolveOptions => {
+				resolveOptions = cleverMerge(options.resolve, resolveOptions);
+				resolveOptions.fileSystem =
+					/** @type {InputFileSystem} */
+					(compiler.inputFileSystem);
+				resolveOptions.resolveToContext = true;
+				return resolveOptions;
 			});
 		compiler.resolverFactory.hooks.resolveOptions
 			.for("loader")
-			.tap("WebpackOptionsApply", resolveOptions => {
-				return Object.assign(
-					{
-						fileSystem: compiler.inputFileSystem
-					},
-					options.resolveLoader,
-					resolveOptions
-				);
+			.tap(CLASS_NAME, resolveOptions => {
+				resolveOptions = cleverMerge(options.resolveLoader, resolveOptions);
+				resolveOptions.fileSystem =
+					/** @type {InputFileSystem} */
+					(compiler.inputFileSystem);
+				return resolveOptions;
 			});
 		compiler.hooks.afterResolvers.call(compiler);
 		return options;
diff --git a/lib/WebpackOptionsDefaulter.js b/lib/WebpackOptionsDefaulter.js
index b6e69ef98f5..12fbe698d93 100644
--- a/lib/WebpackOptionsDefaulter.js
+++ b/lib/WebpackOptionsDefaulter.js
@@ -2,370 +2,24 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
-"use strict";
-
-const path = require("path");
-
-const OptionsDefaulter = require("./OptionsDefaulter");
-const Template = require("./Template");
-
-const isProductionLikeMode = options => {
-	return options.mode === "production" || !options.mode;
-};
-
-const isWebLikeTarget = options => {
-	return options.target === "web" || options.target === "webworker";
-};
-
-const getDevtoolNamespace = library => {
-	// if options.output.library is a string
-	if (Array.isArray(library)) {
-		return library.join(".");
-	} else if (typeof library === "object") {
-		return getDevtoolNamespace(library.root);
-	}
-	return library || "";
-};
-
-class WebpackOptionsDefaulter extends OptionsDefaulter {
-	constructor() {
-		super();
-
-		this.set("entry", "./src");
 
-		this.set(
-			"devtool",
-			"make",
-			options => (options.mode === "development" ? "eval" : false)
-		);
-		this.set("cache", "make", options => options.mode === "development");
-
-		this.set("context", process.cwd());
-		this.set("target", "web");
-
-		this.set("module", "call", value => Object.assign({}, value));
-		this.set("module.unknownContextRequest", ".");
-		this.set("module.unknownContextRegExp", false);
-		this.set("module.unknownContextRecursive", true);
-		this.set("module.unknownContextCritical", true);
-		this.set("module.exprContextRequest", ".");
-		this.set("module.exprContextRegExp", false);
-		this.set("module.exprContextRecursive", true);
-		this.set("module.exprContextCritical", true);
-		this.set("module.wrappedContextRegExp", /.*/);
-		this.set("module.wrappedContextRecursive", true);
-		this.set("module.wrappedContextCritical", false);
-		this.set("module.strictExportPresence", false);
-		this.set("module.strictThisContextOnImports", false);
-		this.set("module.unsafeCache", "make", options => !!options.cache);
-		this.set("module.rules", []);
-		this.set("module.defaultRules", "make", options => [
-			{
-				type: "javascript/auto",
-				resolve: {}
-			},
-			{
-				test: /\.mjs$/i,
-				type: "javascript/esm",
-				resolve: {
-					mainFields:
-						options.target === "web" ||
-						options.target === "webworker" ||
-						options.target === "electron-renderer"
-							? ["browser", "main"]
-							: ["main"]
-				}
-			},
-			{
-				test: /\.json$/i,
-				type: "json"
-			},
-			{
-				test: /\.wasm$/i,
-				type: "webassembly/experimental"
-			}
-		]);
-
-		this.set("output", "call", (value, options) => {
-			if (typeof value === "string") {
-				return {
-					filename: value
-				};
-			} else if (typeof value !== "object") {
-				return {};
-			} else {
-				return Object.assign({}, value);
-			}
-		});
-
-		this.set("output.filename", "[name].js");
-		this.set("output.chunkFilename", "make", options => {
-			const filename = options.output.filename;
-			if (typeof filename !== "function") {
-				const hasName = filename.includes("[name]");
-				const hasId = filename.includes("[id]");
-				const hasChunkHash = filename.includes("[chunkhash]");
-				// Anything changing depending on chunk is fine
-				if (hasChunkHash || hasName || hasId) return filename;
-				// Elsewise prefix "[id]." in front of the basename to make it changing
-				return filename.replace(/(^|\/)([^/]*(?:\?|$))/, "$1[id].$2");
-			}
-			return "[id].js";
-		});
-		this.set("output.webassemblyModuleFilename", "[modulehash].module.wasm");
-		this.set("output.library", "");
-		this.set("output.hotUpdateFunction", "make", options => {
-			return Template.toIdentifier(
-				"webpackHotUpdate" + Template.toIdentifier(options.output.library)
-			);
-		});
-		this.set("output.jsonpFunction", "make", options => {
-			return Template.toIdentifier(
-				"webpackJsonp" + Template.toIdentifier(options.output.library)
-			);
-		});
-		this.set("output.chunkCallbackName", "make", options => {
-			return Template.toIdentifier(
-				"webpackChunk" + Template.toIdentifier(options.output.library)
-			);
-		});
-		this.set("output.globalObject", "make", options => {
-			switch (options.target) {
-				case "web":
-				case "electron-renderer":
-				case "node-webkit":
-					return "window";
-				case "webworker":
-					return "self";
-				case "node":
-				case "async-node":
-				case "electron-main":
-					return "global";
-				default:
-					return "self";
-			}
-		});
-		this.set("output.devtoolNamespace", "make", options => {
-			return getDevtoolNamespace(options.output.library);
-		});
-		this.set("output.libraryTarget", "var");
-		this.set("output.path", path.join(process.cwd(), "dist"));
-		this.set(
-			"output.pathinfo",
-			"make",
-			options => options.mode === "development"
-		);
-		this.set("output.sourceMapFilename", "[file].map[query]");
-		this.set("output.hotUpdateChunkFilename", "[id].[hash].hot-update.js");
-		this.set("output.hotUpdateMainFilename", "[hash].hot-update.json");
-		this.set("output.crossOriginLoading", false);
-		this.set("output.jsonpScriptType", false);
-		this.set("output.chunkLoadTimeout", 120000);
-		this.set("output.hashFunction", "md4");
-		this.set("output.hashDigest", "hex");
-		this.set("output.hashDigestLength", 20);
-		this.set("output.devtoolLineToLine", false);
-		this.set("output.strictModuleExceptionHandling", false);
-
-		this.set("node", "call", value => {
-			if (typeof value === "boolean") {
-				return value;
-			} else {
-				return Object.assign({}, value);
-			}
-		});
-		this.set("node.console", false);
-		this.set("node.process", true);
-		this.set("node.global", true);
-		this.set("node.Buffer", true);
-		this.set("node.setImmediate", true);
-		this.set("node.__filename", "mock");
-		this.set("node.__dirname", "mock");
-
-		this.set("performance", "call", (value, options) => {
-			if (value === false) return false;
-			if (
-				value === undefined &&
-				(!isProductionLikeMode(options) || !isWebLikeTarget(options))
-			)
-				return false;
-			return Object.assign({}, value);
-		});
-		this.set("performance.maxAssetSize", 250000);
-		this.set("performance.maxEntrypointSize", 250000);
-		this.set(
-			"performance.hints",
-			"make",
-			options => (isProductionLikeMode(options) ? "warning" : false)
-		);
-
-		this.set("optimization", "call", value => Object.assign({}, value));
-		this.set("optimization.removeAvailableModules", true);
-		this.set("optimization.removeEmptyChunks", true);
-		this.set("optimization.mergeDuplicateChunks", true);
-		this.set("optimization.flagIncludedChunks", "make", options =>
-			isProductionLikeMode(options)
-		);
-		// TODO webpack 5 add `moduleIds: "named"` default for development
-		// TODO webpack 5 add `moduleIds: "size"` default for production
-		// TODO webpack 5 remove optimization.occurrenceOrder
-		this.set("optimization.occurrenceOrder", "make", options =>
-			isProductionLikeMode(options)
-		);
-		this.set("optimization.sideEffects", "make", options =>
-			isProductionLikeMode(options)
-		);
-		this.set("optimization.providedExports", true);
-		this.set("optimization.usedExports", "make", options =>
-			isProductionLikeMode(options)
-		);
-		this.set("optimization.concatenateModules", "make", options =>
-			isProductionLikeMode(options)
-		);
-		this.set("optimization.splitChunks", {});
-		this.set("optimization.splitChunks.hidePathInfo", "make", options => {
-			return isProductionLikeMode(options);
-		});
-		this.set("optimization.splitChunks.chunks", "async");
-		this.set("optimization.splitChunks.minSize", "make", options => {
-			return isProductionLikeMode(options) ? 30000 : 10000;
-		});
-		this.set("optimization.splitChunks.minChunks", 1);
-		this.set("optimization.splitChunks.maxAsyncRequests", "make", options => {
-			return isProductionLikeMode(options) ? 5 : Infinity;
-		});
-		this.set("optimization.splitChunks.automaticNameDelimiter", "~");
-		this.set("optimization.splitChunks.maxInitialRequests", "make", options => {
-			return isProductionLikeMode(options) ? 3 : Infinity;
-		});
-		this.set("optimization.splitChunks.name", true);
-		this.set("optimization.splitChunks.cacheGroups", {});
-		this.set("optimization.splitChunks.cacheGroups.default", {
-			automaticNamePrefix: "",
-			reuseExistingChunk: true,
-			minChunks: 2,
-			priority: -20
-		});
-		this.set("optimization.splitChunks.cacheGroups.vendors", {
-			automaticNamePrefix: "vendors",
-			test: /[\\/]node_modules[\\/]/,
-			priority: -10
-		});
-		this.set("optimization.runtimeChunk", "call", value => {
-			if (value === "single") {
-				return {
-					name: "runtime"
-				};
-			}
-			if (value === true || value === "multiple") {
-				return {
-					name: entrypoint => `runtime~${entrypoint.name}`
-				};
-			}
-			return value;
-		});
-		this.set("optimization.noEmitOnErrors", "make", options =>
-			isProductionLikeMode(options)
-		);
-		this.set("optimization.checkWasmTypes", "make", options =>
-			isProductionLikeMode(options)
-		);
-		this.set("optimization.mangleWasmImports", false);
-		// TODO webpack 5 remove optimization.namedModules
-		this.set(
-			"optimization.namedModules",
-			"make",
-			options => options.mode === "development"
-		);
-		this.set("optimization.hashedModuleIds", false);
-		// TODO webpack 5 add `chunkIds: "named"` default for development
-		// TODO webpack 5 add `chunkIds: "size"` default for production
-		// TODO webpack 5 remove optimization.namedChunks
-		this.set(
-			"optimization.namedChunks",
-			"make",
-			options => options.mode === "development"
-		);
-		this.set(
-			"optimization.portableRecords",
-			"make",
-			options =>
-				!!(
-					options.recordsInputPath ||
-					options.recordsOutputPath ||
-					options.recordsPath
-				)
-		);
-		this.set("optimization.minimize", "make", options =>
-			isProductionLikeMode(options)
-		);
-		this.set("optimization.minimizer", "make", options => [
-			{
-				apply: compiler => {
-					// Lazy load the Terser plugin
-					const TerserPlugin = require("terser-webpack-plugin");
-					const SourceMapDevToolPlugin = require("./SourceMapDevToolPlugin");
-					new TerserPlugin({
-						cache: true,
-						parallel: true,
-						sourceMap:
-							(options.devtool && /source-?map/.test(options.devtool)) ||
-							(options.plugins &&
-								options.plugins.some(p => p instanceof SourceMapDevToolPlugin))
-					}).apply(compiler);
-				}
-			}
-		]);
-		this.set("optimization.nodeEnv", "make", options => {
-			// TODO: In webpack 5, it should return `false` when mode is `none`
-			return options.mode || "production";
-		});
-
-		this.set("resolve", "call", value => Object.assign({}, value));
-		this.set("resolve.unsafeCache", true);
-		this.set("resolve.modules", ["node_modules"]);
-		this.set("resolve.extensions", [".wasm", ".mjs", ".js", ".json"]);
-		this.set("resolve.mainFiles", ["index"]);
-		this.set("resolve.aliasFields", "make", options => {
-			if (
-				options.target === "web" ||
-				options.target === "webworker" ||
-				options.target === "electron-renderer"
-			) {
-				return ["browser"];
-			} else {
-				return [];
-			}
-		});
-		this.set("resolve.mainFields", "make", options => {
-			if (
-				options.target === "web" ||
-				options.target === "webworker" ||
-				options.target === "electron-renderer"
-			) {
-				return ["browser", "module", "main"];
-			} else {
-				return ["module", "main"];
-			}
-		});
-		this.set("resolve.cacheWithContext", "make", options => {
-			return (
-				Array.isArray(options.resolve.plugins) &&
-				options.resolve.plugins.length > 0
-			);
-		});
+"use strict";
 
-		this.set("resolveLoader", "call", value => Object.assign({}, value));
-		this.set("resolveLoader.unsafeCache", true);
-		this.set("resolveLoader.mainFields", ["loader", "main"]);
-		this.set("resolveLoader.extensions", [".js", ".json"]);
-		this.set("resolveLoader.mainFiles", ["index"]);
-		this.set("resolveLoader.cacheWithContext", "make", options => {
-			return (
-				Array.isArray(options.resolveLoader.plugins) &&
-				options.resolveLoader.plugins.length > 0
-			);
-		});
+const { applyWebpackOptionsDefaults } = require("./config/defaults");
+const { getNormalizedWebpackOptions } = require("./config/normalization");
+
+/** @typedef {import("./config/normalization").WebpackOptions} WebpackOptions */
+/** @typedef {import("./config/normalization").WebpackOptionsNormalized} WebpackOptionsNormalized */
+
+class WebpackOptionsDefaulter {
+	/**
+	 * @param {WebpackOptions} options webpack options
+	 * @returns {WebpackOptionsNormalized} normalized webpack options
+	 */
+	process(options) {
+		const normalizedOptions = getNormalizedWebpackOptions(options);
+		applyWebpackOptionsDefaults(normalizedOptions);
+		return normalizedOptions;
 	}
 }
 
diff --git a/lib/WebpackOptionsValidationError.js b/lib/WebpackOptionsValidationError.js
deleted file mode 100644
index d66cb2ccca2..00000000000
--- a/lib/WebpackOptionsValidationError.js
+++ /dev/null
@@ -1,344 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Gajus Kuizinas @gajus
-*/
-"use strict";
-
-const WebpackError = require("./WebpackError");
-const webpackOptionsSchema = require("../schemas/WebpackOptions.json");
-
-const getSchemaPart = (path, parents, additionalPath) => {
-	parents = parents || 0;
-	path = path.split("/");
-	path = path.slice(0, path.length - parents);
-	if (additionalPath) {
-		additionalPath = additionalPath.split("/");
-		path = path.concat(additionalPath);
-	}
-	let schemaPart = webpackOptionsSchema;
-	for (let i = 1; i < path.length; i++) {
-		const inner = schemaPart[path[i]];
-		if (inner) schemaPart = inner;
-	}
-	return schemaPart;
-};
-
-const getSchemaPartText = (schemaPart, additionalPath) => {
-	if (additionalPath) {
-		for (let i = 0; i < additionalPath.length; i++) {
-			const inner = schemaPart[additionalPath[i]];
-			if (inner) schemaPart = inner;
-		}
-	}
-	while (schemaPart.$ref) {
-		schemaPart = getSchemaPart(schemaPart.$ref);
-	}
-	let schemaText = WebpackOptionsValidationError.formatSchema(schemaPart);
-	if (schemaPart.description) {
-		schemaText += `\n-> ${schemaPart.description}`;
-	}
-	return schemaText;
-};
-
-const getSchemaPartDescription = schemaPart => {
-	while (schemaPart.$ref) {
-		schemaPart = getSchemaPart(schemaPart.$ref);
-	}
-	if (schemaPart.description) {
-		return `\n-> ${schemaPart.description}`;
-	}
-	return "";
-};
-
-const filterChildren = children => {
-	return children.filter(
-		err =>
-			err.keyword !== "anyOf" &&
-			err.keyword !== "allOf" &&
-			err.keyword !== "oneOf"
-	);
-};
-
-const indent = (str, prefix, firstLine) => {
-	if (firstLine) {
-		return prefix + str.replace(/\n(?!$)/g, "\n" + prefix);
-	} else {
-		return str.replace(/\n(?!$)/g, `\n${prefix}`);
-	}
-};
-
-class WebpackOptionsValidationError extends WebpackError {
-	constructor(validationErrors) {
-		super(
-			"Invalid configuration object. " +
-				"Webpack has been initialised using a configuration object that does not match the API schema.\n" +
-				validationErrors
-					.map(
-						err =>
-							" - " +
-							indent(
-								WebpackOptionsValidationError.formatValidationError(err),
-								"   ",
-								false
-							)
-					)
-					.join("\n")
-		);
-
-		this.name = "WebpackOptionsValidationError";
-		this.validationErrors = validationErrors;
-
-		Error.captureStackTrace(this, this.constructor);
-	}
-
-	static formatSchema(schema, prevSchemas) {
-		prevSchemas = prevSchemas || [];
-
-		const formatInnerSchema = (innerSchema, addSelf) => {
-			if (!addSelf) {
-				return WebpackOptionsValidationError.formatSchema(
-					innerSchema,
-					prevSchemas
-				);
-			}
-			if (prevSchemas.includes(innerSchema)) {
-				return "(recursive)";
-			}
-			return WebpackOptionsValidationError.formatSchema(
-				innerSchema,
-				prevSchemas.concat(schema)
-			);
-		};
-
-		if (schema.type === "string") {
-			if (schema.minLength === 1) {
-				return "non-empty string";
-			}
-			if (schema.minLength > 1) {
-				return `string (min length ${schema.minLength})`;
-			}
-			return "string";
-		}
-		if (schema.type === "boolean") {
-			return "boolean";
-		}
-		if (schema.type === "number") {
-			return "number";
-		}
-		if (schema.type === "object") {
-			if (schema.properties) {
-				const required = schema.required || [];
-				return `object { ${Object.keys(schema.properties)
-					.map(property => {
-						if (!required.includes(property)) return property + "?";
-						return property;
-					})
-					.concat(schema.additionalProperties ? ["…"] : [])
-					.join(", ")} }`;
-			}
-			if (schema.additionalProperties) {
-				return `object { : ${formatInnerSchema(
-					schema.additionalProperties
-				)} }`;
-			}
-			return "object";
-		}
-		if (schema.type === "array") {
-			return `[${formatInnerSchema(schema.items)}]`;
-		}
-
-		switch (schema.instanceof) {
-			case "Function":
-				return "function";
-			case "RegExp":
-				return "RegExp";
-		}
-
-		if (schema.$ref) {
-			return formatInnerSchema(getSchemaPart(schema.$ref), true);
-		}
-		if (schema.allOf) {
-			return schema.allOf.map(formatInnerSchema).join(" & ");
-		}
-		if (schema.oneOf) {
-			return schema.oneOf.map(formatInnerSchema).join(" | ");
-		}
-		if (schema.anyOf) {
-			return schema.anyOf.map(formatInnerSchema).join(" | ");
-		}
-		if (schema.enum) {
-			return schema.enum.map(item => JSON.stringify(item)).join(" | ");
-		}
-		return JSON.stringify(schema, null, 2);
-	}
-
-	static formatValidationError(err) {
-		const dataPath = `configuration${err.dataPath}`;
-		if (err.keyword === "additionalProperties") {
-			const baseMessage = `${dataPath} has an unknown property '${
-				err.params.additionalProperty
-			}'. These properties are valid:\n${getSchemaPartText(err.parentSchema)}`;
-			if (!err.dataPath) {
-				switch (err.params.additionalProperty) {
-					case "debug":
-						return (
-							`${baseMessage}\n` +
-							"The 'debug' property was removed in webpack 2.0.0.\n" +
-							"Loaders should be updated to allow passing this option via loader options in module.rules.\n" +
-							"Until loaders are updated one can use the LoaderOptionsPlugin to switch loaders into debug mode:\n" +
-							"plugins: [\n" +
-							"  new webpack.LoaderOptionsPlugin({\n" +
-							"    debug: true\n" +
-							"  })\n" +
-							"]"
-						);
-				}
-				return (
-					`${baseMessage}\n` +
-					"For typos: please correct them.\n" +
-					"For loader options: webpack >= v2.0.0 no longer allows custom properties in configuration.\n" +
-					"  Loaders should be updated to allow passing options via loader options in module.rules.\n" +
-					"  Until loaders are updated one can use the LoaderOptionsPlugin to pass these options to the loader:\n" +
-					"  plugins: [\n" +
-					"    new webpack.LoaderOptionsPlugin({\n" +
-					"      // test: /\\.xxx$/, // may apply this only for some modules\n" +
-					"      options: {\n" +
-					`        ${err.params.additionalProperty}: …\n` +
-					"      }\n" +
-					"    })\n" +
-					"  ]"
-				);
-			}
-			return baseMessage;
-		} else if (err.keyword === "oneOf" || err.keyword === "anyOf") {
-			if (err.children && err.children.length > 0) {
-				if (err.schema.length === 1) {
-					const lastChild = err.children[err.children.length - 1];
-					const remainingChildren = err.children.slice(
-						0,
-						err.children.length - 1
-					);
-					return WebpackOptionsValidationError.formatValidationError(
-						Object.assign({}, lastChild, {
-							children: remainingChildren,
-							parentSchema: Object.assign(
-								{},
-								err.parentSchema,
-								lastChild.parentSchema
-							)
-						})
-					);
-				}
-				return (
-					`${dataPath} should be one of these:\n${getSchemaPartText(
-						err.parentSchema
-					)}\n` +
-					`Details:\n${filterChildren(err.children)
-						.map(
-							err =>
-								" * " +
-								indent(
-									WebpackOptionsValidationError.formatValidationError(err),
-									"   ",
-									false
-								)
-						)
-						.join("\n")}`
-				);
-			}
-			return `${dataPath} should be one of these:\n${getSchemaPartText(
-				err.parentSchema
-			)}`;
-		} else if (err.keyword === "enum") {
-			if (
-				err.parentSchema &&
-				err.parentSchema.enum &&
-				err.parentSchema.enum.length === 1
-			) {
-				return `${dataPath} should be ${getSchemaPartText(err.parentSchema)}`;
-			}
-			return `${dataPath} should be one of these:\n${getSchemaPartText(
-				err.parentSchema
-			)}`;
-		} else if (err.keyword === "allOf") {
-			return `${dataPath} should be:\n${getSchemaPartText(err.parentSchema)}`;
-		} else if (err.keyword === "type") {
-			switch (err.params.type) {
-				case "object":
-					return `${dataPath} should be an object.${getSchemaPartDescription(
-						err.parentSchema
-					)}`;
-				case "string":
-					return `${dataPath} should be a string.${getSchemaPartDescription(
-						err.parentSchema
-					)}`;
-				case "boolean":
-					return `${dataPath} should be a boolean.${getSchemaPartDescription(
-						err.parentSchema
-					)}`;
-				case "number":
-					return `${dataPath} should be a number.${getSchemaPartDescription(
-						err.parentSchema
-					)}`;
-				case "array":
-					return `${dataPath} should be an array:\n${getSchemaPartText(
-						err.parentSchema
-					)}`;
-			}
-			return `${dataPath} should be ${err.params.type}:\n${getSchemaPartText(
-				err.parentSchema
-			)}`;
-		} else if (err.keyword === "instanceof") {
-			return `${dataPath} should be an instance of ${getSchemaPartText(
-				err.parentSchema
-			)}`;
-		} else if (err.keyword === "required") {
-			const missingProperty = err.params.missingProperty.replace(/^\./, "");
-			return `${dataPath} misses the property '${missingProperty}'.\n${getSchemaPartText(
-				err.parentSchema,
-				["properties", missingProperty]
-			)}`;
-		} else if (err.keyword === "minimum") {
-			return `${dataPath} ${err.message}.${getSchemaPartDescription(
-				err.parentSchema
-			)}`;
-		} else if (err.keyword === "uniqueItems") {
-			return `${dataPath} should not contain the item '${
-				err.data[err.params.i]
-			}' twice.${getSchemaPartDescription(err.parentSchema)}`;
-		} else if (
-			err.keyword === "minLength" ||
-			err.keyword === "minItems" ||
-			err.keyword === "minProperties"
-		) {
-			if (err.params.limit === 1) {
-				return `${dataPath} should not be empty.${getSchemaPartDescription(
-					err.parentSchema
-				)}`;
-			} else {
-				return `${dataPath} ${err.message}${getSchemaPartDescription(
-					err.parentSchema
-				)}`;
-			}
-		} else if (err.keyword === "absolutePath") {
-			const baseMessage = `${dataPath}: ${
-				err.message
-			}${getSchemaPartDescription(err.parentSchema)}`;
-			if (dataPath === "configuration.output.filename") {
-				return (
-					`${baseMessage}\n` +
-					"Please use output.path to specify absolute path and output.filename for the file name."
-				);
-			}
-			return baseMessage;
-		} else {
-			return `${dataPath} ${err.message} (${JSON.stringify(
-				err,
-				null,
-				2
-			)}).\n${getSchemaPartText(err.parentSchema)}`;
-		}
-	}
-}
-
-module.exports = WebpackOptionsValidationError;
diff --git a/lib/asset/AssetGenerator.js b/lib/asset/AssetGenerator.js
new file mode 100644
index 00000000000..58e82589e31
--- /dev/null
+++ b/lib/asset/AssetGenerator.js
@@ -0,0 +1,808 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Sergey Melyukov @smelukov
+*/
+
+"use strict";
+
+const mimeTypes = require("mime-types");
+const path = require("path");
+const { RawSource } = require("webpack-sources");
+const ConcatenationScope = require("../ConcatenationScope");
+const Generator = require("../Generator");
+const {
+	NO_TYPES,
+	ASSET_TYPES,
+	ASSET_AND_JS_TYPES,
+	ASSET_AND_JS_AND_CSS_URL_TYPES,
+	ASSET_AND_CSS_URL_TYPES,
+	JS_TYPES,
+	JS_AND_CSS_URL_TYPES,
+	CSS_URL_TYPES
+} = require("../ModuleSourceTypesConstants");
+const { ASSET_MODULE_TYPE } = require("../ModuleTypeConstants");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const CssUrlDependency = require("../dependencies/CssUrlDependency");
+const createHash = require("../util/createHash");
+const { makePathsRelative } = require("../util/identifier");
+const nonNumericOnlyHash = require("../util/nonNumericOnlyHash");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../../declarations/WebpackOptions").AssetGeneratorDataUrlOptions} AssetGeneratorDataUrlOptions */
+/** @typedef {import("../../declarations/WebpackOptions").AssetGeneratorOptions} AssetGeneratorOptions */
+/** @typedef {import("../../declarations/WebpackOptions").AssetModuleFilename} AssetModuleFilename */
+/** @typedef {import("../../declarations/WebpackOptions").AssetModuleOutputPath} AssetModuleOutputPath */
+/** @typedef {import("../../declarations/WebpackOptions").AssetResourceGeneratorOptions} AssetResourceGeneratorOptions */
+/** @typedef {import("../../declarations/WebpackOptions").HashFunction} HashFunction */
+/** @typedef {import("../../declarations/WebpackOptions").RawPublicPath} RawPublicPath */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Compilation").AssetInfo} AssetInfo */
+/** @typedef {import("../Compilation").InterpolatedPathAndAssetInfo} InterpolatedPathAndAssetInfo */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Generator").GenerateContext} GenerateContext */
+/** @typedef {import("../Generator").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../Module").BuildInfo} BuildInfo */
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
+/** @typedef {import("../Module").ConcatenationBailoutReasonContext} ConcatenationBailoutReasonContext */
+/** @typedef {import("../Module").SourceTypes} SourceTypes */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../NormalModule")} NormalModule */
+/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
+/** @typedef {import("../TemplatedPathPlugin").TemplatePath} TemplatePath */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+
+/**
+ * @template T
+ * @template U
+ * @param {string | Array | Set | undefined} a a
+ * @param {string | Array | Set | undefined} b b
+ * @returns {Array & Array} array
+ */
+const mergeMaybeArrays = (a, b) => {
+	const set = new Set();
+	if (Array.isArray(a)) for (const item of a) set.add(item);
+	else set.add(a);
+	if (Array.isArray(b)) for (const item of b) set.add(item);
+	else set.add(b);
+	return Array.from(set);
+};
+
+/**
+ * @param {AssetInfo} a a
+ * @param {AssetInfo} b b
+ * @returns {AssetInfo} object
+ */
+const mergeAssetInfo = (a, b) => {
+	/** @type {AssetInfo} */
+	const result = { ...a, ...b };
+	for (const key of Object.keys(a)) {
+		if (key in b) {
+			if (a[key] === b[key]) continue;
+			switch (key) {
+				case "fullhash":
+				case "chunkhash":
+				case "modulehash":
+				case "contenthash":
+					result[key] = mergeMaybeArrays(a[key], b[key]);
+					break;
+				case "immutable":
+				case "development":
+				case "hotModuleReplacement":
+				case "javascriptModule":
+					result[key] = a[key] || b[key];
+					break;
+				case "related":
+					result[key] = mergeRelatedInfo(
+						/** @type {NonNullable} */
+						(a[key]),
+						/** @type {NonNullable} */
+						(b[key])
+					);
+					break;
+				default:
+					throw new Error(`Can't handle conflicting asset info for ${key}`);
+			}
+		}
+	}
+	return result;
+};
+
+/**
+ * @param {NonNullable} a a
+ * @param {NonNullable} b b
+ * @returns {NonNullable} object
+ */
+const mergeRelatedInfo = (a, b) => {
+	const result = { ...a, ...b };
+	for (const key of Object.keys(a)) {
+		if (key in b) {
+			if (a[key] === b[key]) continue;
+			result[key] = mergeMaybeArrays(a[key], b[key]);
+		}
+	}
+	return result;
+};
+
+/**
+ * @param {"base64" | false} encoding encoding
+ * @param {Source} source source
+ * @returns {string} encoded data
+ */
+const encodeDataUri = (encoding, source) => {
+	/** @type {string | undefined} */
+	let encodedContent;
+
+	switch (encoding) {
+		case "base64": {
+			encodedContent = source.buffer().toString("base64");
+			break;
+		}
+		case false: {
+			const content = source.source();
+
+			if (typeof content !== "string") {
+				encodedContent = content.toString("utf-8");
+			}
+
+			encodedContent = encodeURIComponent(
+				/** @type {string} */
+				(encodedContent)
+			).replace(
+				/[!'()*]/g,
+				character =>
+					`%${/** @type {number} */ (character.codePointAt(0)).toString(16)}`
+			);
+			break;
+		}
+		default:
+			throw new Error(`Unsupported encoding '${encoding}'`);
+	}
+
+	return encodedContent;
+};
+
+/**
+ * @param {"base64" | false} encoding encoding
+ * @param {string} content content
+ * @returns {Buffer} decoded content
+ */
+const decodeDataUriContent = (encoding, content) => {
+	const isBase64 = encoding === "base64";
+
+	if (isBase64) {
+		return Buffer.from(content, "base64");
+	}
+
+	// If we can't decode return the original body
+	try {
+		return Buffer.from(decodeURIComponent(content), "ascii");
+	} catch (_) {
+		return Buffer.from(content, "ascii");
+	}
+};
+
+const DEFAULT_ENCODING = "base64";
+
+class AssetGenerator extends Generator {
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @param {AssetGeneratorOptions["dataUrl"]=} dataUrlOptions the options for the data url
+	 * @param {AssetModuleFilename=} filename override for output.assetModuleFilename
+	 * @param {RawPublicPath=} publicPath override for output.assetModulePublicPath
+	 * @param {AssetModuleOutputPath=} outputPath the output path for the emitted file which is not included in the runtime import
+	 * @param {boolean=} emit generate output asset
+	 */
+	constructor(
+		moduleGraph,
+		dataUrlOptions,
+		filename,
+		publicPath,
+		outputPath,
+		emit
+	) {
+		super();
+		this.dataUrlOptions = dataUrlOptions;
+		this.filename = filename;
+		this.publicPath = publicPath;
+		this.outputPath = outputPath;
+		this.emit = emit;
+		this._moduleGraph = moduleGraph;
+	}
+
+	/**
+	 * @param {NormalModule} module module
+	 * @param {RuntimeTemplate} runtimeTemplate runtime template
+	 * @returns {string} source file name
+	 */
+	static getSourceFileName(module, runtimeTemplate) {
+		return makePathsRelative(
+			runtimeTemplate.compilation.compiler.context,
+			module.matchResource || module.resource,
+			runtimeTemplate.compilation.compiler.root
+		).replace(/^\.\//, "");
+	}
+
+	/**
+	 * @param {NormalModule} module module
+	 * @param {RuntimeTemplate} runtimeTemplate runtime template
+	 * @returns {[string, string]} return full hash and non-numeric full hash
+	 */
+	static getFullContentHash(module, runtimeTemplate) {
+		const hash = createHash(
+			/** @type {HashFunction} */
+			(runtimeTemplate.outputOptions.hashFunction)
+		);
+
+		if (runtimeTemplate.outputOptions.hashSalt) {
+			hash.update(runtimeTemplate.outputOptions.hashSalt);
+		}
+
+		const source = module.originalSource();
+
+		if (source) {
+			hash.update(source.buffer());
+		}
+
+		if (module.error) {
+			hash.update(module.error.toString());
+		}
+
+		const fullContentHash = /** @type {string} */ (
+			hash.digest(runtimeTemplate.outputOptions.hashDigest)
+		);
+
+		/** @type {string} */
+		const contentHash = nonNumericOnlyHash(
+			fullContentHash,
+			/** @type {number} */
+			(runtimeTemplate.outputOptions.hashDigestLength)
+		);
+
+		return [fullContentHash, contentHash];
+	}
+
+	/**
+	 * @param {NormalModule} module module for which the code should be generated
+	 * @param {Pick} generatorOptions generator options
+	 * @param {{ runtime: RuntimeSpec, runtimeTemplate: RuntimeTemplate, chunkGraph: ChunkGraph }} generateContext context for generate
+	 * @param {string} contentHash the content hash
+	 * @returns {{ filename: string, originalFilename: string, assetInfo: AssetInfo }} info
+	 */
+	static getFilenameWithInfo(
+		module,
+		generatorOptions,
+		{ runtime, runtimeTemplate, chunkGraph },
+		contentHash
+	) {
+		const assetModuleFilename =
+			generatorOptions.filename ||
+			/** @type {AssetModuleFilename} */
+			(runtimeTemplate.outputOptions.assetModuleFilename);
+
+		const sourceFilename = AssetGenerator.getSourceFileName(
+			module,
+			runtimeTemplate
+		);
+		let { path: filename, info: assetInfo } =
+			runtimeTemplate.compilation.getAssetPathWithInfo(assetModuleFilename, {
+				module,
+				runtime,
+				filename: sourceFilename,
+				chunkGraph,
+				contentHash
+			});
+
+		const originalFilename = filename;
+
+		if (generatorOptions.outputPath) {
+			const { path: outputPath, info } =
+				runtimeTemplate.compilation.getAssetPathWithInfo(
+					generatorOptions.outputPath,
+					{
+						module,
+						runtime,
+						filename: sourceFilename,
+						chunkGraph,
+						contentHash
+					}
+				);
+			filename = path.posix.join(outputPath, filename);
+			assetInfo = mergeAssetInfo(assetInfo, info);
+		}
+
+		return { originalFilename, filename, assetInfo };
+	}
+
+	/**
+	 * @param {NormalModule} module module for which the code should be generated
+	 * @param {Pick} generatorOptions generator options
+	 * @param {GenerateContext} generateContext context for generate
+	 * @param {string} filename the filename
+	 * @param {AssetInfo} assetInfo the asset info
+	 * @param {string} contentHash the content hash
+	 * @returns {{ assetPath: string, assetInfo: AssetInfo }} asset path and info
+	 */
+	static getAssetPathWithInfo(
+		module,
+		generatorOptions,
+		{ runtime, runtimeTemplate, type, chunkGraph, runtimeRequirements },
+		filename,
+		assetInfo,
+		contentHash
+	) {
+		const sourceFilename = AssetGenerator.getSourceFileName(
+			module,
+			runtimeTemplate
+		);
+
+		let assetPath;
+
+		if (generatorOptions.publicPath !== undefined && type === "javascript") {
+			const { path, info } = runtimeTemplate.compilation.getAssetPathWithInfo(
+				generatorOptions.publicPath,
+				{
+					module,
+					runtime,
+					filename: sourceFilename,
+					chunkGraph,
+					contentHash
+				}
+			);
+			assetInfo = mergeAssetInfo(assetInfo, info);
+			assetPath = JSON.stringify(path + filename);
+		} else if (
+			generatorOptions.publicPath !== undefined &&
+			type === "css-url"
+		) {
+			const { path, info } = runtimeTemplate.compilation.getAssetPathWithInfo(
+				generatorOptions.publicPath,
+				{
+					module,
+					runtime,
+					filename: sourceFilename,
+					chunkGraph,
+					contentHash
+				}
+			);
+			assetInfo = mergeAssetInfo(assetInfo, info);
+			assetPath = path + filename;
+		} else if (type === "javascript") {
+			// add __webpack_require__.p
+			runtimeRequirements.add(RuntimeGlobals.publicPath);
+			assetPath = runtimeTemplate.concatenation(
+				{ expr: RuntimeGlobals.publicPath },
+				filename
+			);
+		} else if (type === "css-url") {
+			const compilation = runtimeTemplate.compilation;
+			const path =
+				compilation.outputOptions.publicPath === "auto"
+					? CssUrlDependency.PUBLIC_PATH_AUTO
+					: compilation.getAssetPath(
+							/** @type {TemplatePath} */
+							(compilation.outputOptions.publicPath),
+							{
+								hash: compilation.hash
+							}
+						);
+
+			assetPath = path + filename;
+		}
+
+		return {
+			// eslint-disable-next-line object-shorthand
+			assetPath: /** @type {string} */ (assetPath),
+			assetInfo: { sourceFilename, ...assetInfo }
+		};
+	}
+
+	/**
+	 * @param {NormalModule} module module for which the bailout reason should be determined
+	 * @param {ConcatenationBailoutReasonContext} context context
+	 * @returns {string | undefined} reason why this module can't be concatenated, undefined when it can be concatenated
+	 */
+	getConcatenationBailoutReason(module, context) {
+		return undefined;
+	}
+
+	/**
+	 * @param {NormalModule} module module
+	 * @returns {string} mime type
+	 */
+	getMimeType(module) {
+		if (typeof this.dataUrlOptions === "function") {
+			throw new Error(
+				"This method must not be called when dataUrlOptions is a function"
+			);
+		}
+
+		/** @type {string | boolean | undefined} */
+		let mimeType =
+			/** @type {AssetGeneratorDataUrlOptions} */
+			(this.dataUrlOptions).mimetype;
+		if (mimeType === undefined) {
+			const ext = path.extname(
+				/** @type {string} */
+				(module.nameForCondition())
+			);
+			if (
+				module.resourceResolveData &&
+				module.resourceResolveData.mimetype !== undefined
+			) {
+				mimeType =
+					module.resourceResolveData.mimetype +
+					module.resourceResolveData.parameters;
+			} else if (ext) {
+				mimeType = mimeTypes.lookup(ext);
+
+				if (typeof mimeType !== "string") {
+					throw new Error(
+						"DataUrl can't be generated automatically, " +
+							`because there is no mimetype for "${ext}" in mimetype database. ` +
+							'Either pass a mimetype via "generator.mimetype" or ' +
+							'use type: "asset/resource" to create a resource file instead of a DataUrl'
+					);
+				}
+			}
+		}
+
+		if (typeof mimeType !== "string") {
+			throw new Error(
+				"DataUrl can't be generated automatically. " +
+					'Either pass a mimetype via "generator.mimetype" or ' +
+					'use type: "asset/resource" to create a resource file instead of a DataUrl'
+			);
+		}
+
+		return /** @type {string} */ (mimeType);
+	}
+
+	/**
+	 * @param {NormalModule} module module for which the code should be generated
+	 * @returns {string} DataURI
+	 */
+	generateDataUri(module) {
+		const source = /** @type {Source} */ (module.originalSource());
+
+		let encodedSource;
+
+		if (typeof this.dataUrlOptions === "function") {
+			encodedSource = this.dataUrlOptions.call(null, source.source(), {
+				filename: module.matchResource || module.resource,
+				module
+			});
+		} else {
+			let encoding =
+				/** @type {AssetGeneratorDataUrlOptions} */
+				(this.dataUrlOptions).encoding;
+			if (
+				encoding === undefined &&
+				module.resourceResolveData &&
+				module.resourceResolveData.encoding !== undefined
+			) {
+				encoding = module.resourceResolveData.encoding;
+			}
+			if (encoding === undefined) {
+				encoding = DEFAULT_ENCODING;
+			}
+			const mimeType = this.getMimeType(module);
+
+			let encodedContent;
+
+			if (
+				module.resourceResolveData &&
+				module.resourceResolveData.encoding === encoding &&
+				decodeDataUriContent(
+					module.resourceResolveData.encoding,
+					/** @type {string} */ (module.resourceResolveData.encodedContent)
+				).equals(source.buffer())
+			) {
+				encodedContent = module.resourceResolveData.encodedContent;
+			} else {
+				encodedContent = encodeDataUri(
+					/** @type {"base64" | false} */ (encoding),
+					source
+				);
+			}
+
+			encodedSource = `data:${mimeType}${
+				encoding ? `;${encoding}` : ""
+			},${encodedContent}`;
+		}
+
+		return encodedSource;
+	}
+
+	/**
+	 * @param {NormalModule} module module for which the code should be generated
+	 * @param {GenerateContext} generateContext context for generate
+	 * @returns {Source | null} generated code
+	 */
+	generate(module, generateContext) {
+		const {
+			type,
+			getData,
+			runtimeTemplate,
+			runtimeRequirements,
+			concatenationScope
+		} = generateContext;
+
+		let content;
+
+		const needContent = type === "javascript" || type === "css-url";
+
+		const data = getData ? getData() : undefined;
+
+		if (
+			/** @type {BuildInfo} */
+			(module.buildInfo).dataUrl &&
+			needContent
+		) {
+			const encodedSource = this.generateDataUri(module);
+			content =
+				type === "javascript" ? JSON.stringify(encodedSource) : encodedSource;
+
+			if (data) {
+				data.set("url", { [type]: content, ...data.get("url") });
+			}
+		} else {
+			const [fullContentHash, contentHash] = AssetGenerator.getFullContentHash(
+				module,
+				runtimeTemplate
+			);
+
+			if (data) {
+				data.set("fullContentHash", fullContentHash);
+				data.set("contentHash", contentHash);
+			}
+
+			/** @type {BuildInfo} */
+			(module.buildInfo).fullContentHash = fullContentHash;
+
+			const { originalFilename, filename, assetInfo } =
+				AssetGenerator.getFilenameWithInfo(
+					module,
+					{ filename: this.filename, outputPath: this.outputPath },
+					generateContext,
+					contentHash
+				);
+
+			if (data) {
+				data.set("filename", filename);
+			}
+
+			let { assetPath, assetInfo: newAssetInfo } =
+				AssetGenerator.getAssetPathWithInfo(
+					module,
+					{ publicPath: this.publicPath },
+					generateContext,
+					originalFilename,
+					assetInfo,
+					contentHash
+				);
+
+			if (data && (type === "javascript" || type === "css-url")) {
+				data.set("url", { [type]: assetPath, ...data.get("url") });
+			}
+
+			if (data && data.get("assetInfo")) {
+				newAssetInfo = mergeAssetInfo(data.get("assetInfo"), newAssetInfo);
+			}
+
+			if (data) {
+				data.set("assetInfo", newAssetInfo);
+			}
+
+			// Due to code generation caching module.buildInfo.XXX can't used to store such information
+			// It need to be stored in the code generation results instead, where it's cached too
+			// TODO webpack 6 For back-compat reasons we also store in on module.buildInfo
+			/** @type {BuildInfo} */
+			(module.buildInfo).filename = filename;
+
+			/** @type {BuildInfo} */
+			(module.buildInfo).assetInfo = newAssetInfo;
+
+			content = assetPath;
+		}
+
+		if (type === "javascript") {
+			if (concatenationScope) {
+				concatenationScope.registerNamespaceExport(
+					ConcatenationScope.NAMESPACE_OBJECT_EXPORT
+				);
+
+				return new RawSource(
+					`${runtimeTemplate.supportsConst() ? "const" : "var"} ${
+						ConcatenationScope.NAMESPACE_OBJECT_EXPORT
+					} = ${content};`
+				);
+			}
+
+			runtimeRequirements.add(RuntimeGlobals.module);
+
+			return new RawSource(`${RuntimeGlobals.module}.exports = ${content};`);
+		} else if (type === "css-url") {
+			return null;
+		}
+
+		return /** @type {Source} */ (module.originalSource());
+	}
+
+	/**
+	 * @param {Error} error the error
+	 * @param {NormalModule} module module for which the code should be generated
+	 * @param {GenerateContext} generateContext context for generate
+	 * @returns {Source | null} generated code
+	 */
+	generateError(error, module, generateContext) {
+		switch (generateContext.type) {
+			case "asset": {
+				return new RawSource(error.message);
+			}
+			case "javascript": {
+				return new RawSource(
+					`throw new Error(${JSON.stringify(error.message)});`
+				);
+			}
+			default:
+				return null;
+		}
+	}
+
+	/**
+	 * @param {NormalModule} module fresh module
+	 * @returns {SourceTypes} available types (do not mutate)
+	 */
+	getTypes(module) {
+		const sourceTypes = new Set();
+		const connections = this._moduleGraph.getIncomingConnections(module);
+
+		for (const connection of connections) {
+			if (!connection.originModule) {
+				continue;
+			}
+
+			sourceTypes.add(connection.originModule.type.split("/")[0]);
+		}
+
+		if ((module.buildInfo && module.buildInfo.dataUrl) || this.emit === false) {
+			if (sourceTypes) {
+				if (sourceTypes.has("javascript") && sourceTypes.has("css")) {
+					return JS_AND_CSS_URL_TYPES;
+				} else if (sourceTypes.has("javascript")) {
+					return JS_TYPES;
+				} else if (sourceTypes.has("css")) {
+					return CSS_URL_TYPES;
+				}
+			}
+
+			return NO_TYPES;
+		}
+
+		if (sourceTypes) {
+			if (sourceTypes.has("javascript") && sourceTypes.has("css")) {
+				return ASSET_AND_JS_AND_CSS_URL_TYPES;
+			} else if (sourceTypes.has("javascript")) {
+				return ASSET_AND_JS_TYPES;
+			} else if (sourceTypes.has("css")) {
+				return ASSET_AND_CSS_URL_TYPES;
+			}
+		}
+
+		return ASSET_TYPES;
+	}
+
+	/**
+	 * @param {NormalModule} module the module
+	 * @param {string=} type source type
+	 * @returns {number} estimate size of the module
+	 */
+	getSize(module, type) {
+		switch (type) {
+			case ASSET_MODULE_TYPE: {
+				const originalSource = module.originalSource();
+
+				if (!originalSource) {
+					return 0;
+				}
+
+				return originalSource.size();
+			}
+			default:
+				if (module.buildInfo && module.buildInfo.dataUrl) {
+					const originalSource = module.originalSource();
+
+					if (!originalSource) {
+						return 0;
+					}
+
+					// roughly for data url
+					// Example: m.exports="data:image/png;base64,ag82/f+2=="
+					// 4/3 = base64 encoding
+					// 34 = ~ data url header + footer + rounding
+					return originalSource.size() * 1.34 + 36;
+				}
+				// it's only estimated so this number is probably fine
+				// Example: m.exports=r.p+"0123456789012345678901.ext"
+				return 42;
+		}
+	}
+
+	/**
+	 * @param {Hash} hash hash that will be modified
+	 * @param {UpdateHashContext} updateHashContext context for updating hash
+	 */
+	updateHash(hash, updateHashContext) {
+		const { module } = updateHashContext;
+
+		if (
+			/** @type {BuildInfo} */
+			(module.buildInfo).dataUrl
+		) {
+			hash.update("data-url");
+			// this.dataUrlOptions as function should be pure and only depend on input source and filename
+			// therefore it doesn't need to be hashed
+			if (typeof this.dataUrlOptions === "function") {
+				const ident = /** @type {{ ident?: string }} */ (this.dataUrlOptions)
+					.ident;
+				if (ident) hash.update(ident);
+			} else {
+				const dataUrlOptions =
+					/** @type {AssetGeneratorDataUrlOptions} */
+					(this.dataUrlOptions);
+				if (
+					dataUrlOptions.encoding &&
+					dataUrlOptions.encoding !== DEFAULT_ENCODING
+				) {
+					hash.update(dataUrlOptions.encoding);
+				}
+				if (dataUrlOptions.mimetype) hash.update(dataUrlOptions.mimetype);
+				// computed mimetype depends only on module filename which is already part of the hash
+			}
+		} else {
+			hash.update("resource");
+
+			const { module, chunkGraph, runtime } = updateHashContext;
+			const runtimeTemplate =
+				/** @type {NonNullable} */
+				(updateHashContext.runtimeTemplate);
+
+			const pathData = {
+				module,
+				runtime,
+				filename: AssetGenerator.getSourceFileName(module, runtimeTemplate),
+				chunkGraph,
+				contentHash: runtimeTemplate.contentHashReplacement
+			};
+
+			if (typeof this.publicPath === "function") {
+				hash.update("path");
+				const assetInfo = {};
+				hash.update(this.publicPath(pathData, assetInfo));
+				hash.update(JSON.stringify(assetInfo));
+			} else if (this.publicPath) {
+				hash.update("path");
+				hash.update(this.publicPath);
+			} else {
+				hash.update("no-path");
+			}
+
+			const assetModuleFilename =
+				this.filename ||
+				/** @type {AssetModuleFilename} */
+				(runtimeTemplate.outputOptions.assetModuleFilename);
+			const { path: filename, info } =
+				runtimeTemplate.compilation.getAssetPathWithInfo(
+					assetModuleFilename,
+					pathData
+				);
+			hash.update(filename);
+			hash.update(JSON.stringify(info));
+		}
+	}
+}
+
+module.exports = AssetGenerator;
diff --git a/lib/asset/AssetModulesPlugin.js b/lib/asset/AssetModulesPlugin.js
new file mode 100644
index 00000000000..42c0e236155
--- /dev/null
+++ b/lib/asset/AssetModulesPlugin.js
@@ -0,0 +1,292 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Yuta Hiroto @hiroppy
+*/
+
+"use strict";
+
+const {
+	ASSET_MODULE_TYPE_RESOURCE,
+	ASSET_MODULE_TYPE_INLINE,
+	ASSET_MODULE_TYPE,
+	ASSET_MODULE_TYPE_SOURCE
+} = require("../ModuleTypeConstants");
+const { cleverMerge } = require("../util/cleverMerge");
+const { compareModulesByIdOrIdentifier } = require("../util/comparators");
+const createSchemaValidation = require("../util/create-schema-validation");
+const memoize = require("../util/memoize");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../../declarations/WebpackOptions").AssetParserOptions} AssetParserOptions */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compilation").AssetInfo} AssetInfo */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../Module").BuildInfo} BuildInfo */
+/** @typedef {import("../Module").CodeGenerationResult} CodeGenerationResult */
+/** @typedef {import("../NormalModule")} NormalModule */
+
+/**
+ * @param {string} name name of definitions
+ * @returns {TODO} definition
+ */
+const getSchema = name => {
+	const { definitions } = require("../../schemas/WebpackOptions.json");
+	return {
+		definitions,
+		oneOf: [{ $ref: `#/definitions/${name}` }]
+	};
+};
+
+const generatorValidationOptions = {
+	name: "Asset Modules Plugin",
+	baseDataPath: "generator"
+};
+const validateGeneratorOptions = {
+	asset: createSchemaValidation(
+		require("../../schemas/plugins/asset/AssetGeneratorOptions.check.js"),
+		() => getSchema("AssetGeneratorOptions"),
+		generatorValidationOptions
+	),
+	"asset/resource": createSchemaValidation(
+		require("../../schemas/plugins/asset/AssetResourceGeneratorOptions.check.js"),
+		() => getSchema("AssetResourceGeneratorOptions"),
+		generatorValidationOptions
+	),
+	"asset/inline": createSchemaValidation(
+		require("../../schemas/plugins/asset/AssetInlineGeneratorOptions.check.js"),
+		() => getSchema("AssetInlineGeneratorOptions"),
+		generatorValidationOptions
+	)
+};
+
+const validateParserOptions = createSchemaValidation(
+	require("../../schemas/plugins/asset/AssetParserOptions.check.js"),
+	() => getSchema("AssetParserOptions"),
+	{
+		name: "Asset Modules Plugin",
+		baseDataPath: "parser"
+	}
+);
+
+const getAssetGenerator = memoize(() => require("./AssetGenerator"));
+const getAssetParser = memoize(() => require("./AssetParser"));
+const getAssetSourceParser = memoize(() => require("./AssetSourceParser"));
+const getAssetSourceGenerator = memoize(() =>
+	require("./AssetSourceGenerator")
+);
+
+const type = ASSET_MODULE_TYPE;
+const plugin = "AssetModulesPlugin";
+
+class AssetModulesPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(
+			plugin,
+			(compilation, { normalModuleFactory }) => {
+				normalModuleFactory.hooks.createParser
+					.for(ASSET_MODULE_TYPE)
+					.tap(plugin, parserOptions => {
+						validateParserOptions(parserOptions);
+						parserOptions = cleverMerge(
+							/** @type {AssetParserOptions} */
+							(compiler.options.module.parser.asset),
+							parserOptions
+						);
+
+						let dataUrlCondition = parserOptions.dataUrlCondition;
+						if (!dataUrlCondition || typeof dataUrlCondition === "object") {
+							dataUrlCondition = {
+								maxSize: 8096,
+								...dataUrlCondition
+							};
+						}
+
+						const AssetParser = getAssetParser();
+
+						return new AssetParser(dataUrlCondition);
+					});
+				normalModuleFactory.hooks.createParser
+					.for(ASSET_MODULE_TYPE_INLINE)
+					.tap(plugin, _parserOptions => {
+						const AssetParser = getAssetParser();
+
+						return new AssetParser(true);
+					});
+				normalModuleFactory.hooks.createParser
+					.for(ASSET_MODULE_TYPE_RESOURCE)
+					.tap(plugin, _parserOptions => {
+						const AssetParser = getAssetParser();
+
+						return new AssetParser(false);
+					});
+				normalModuleFactory.hooks.createParser
+					.for(ASSET_MODULE_TYPE_SOURCE)
+					.tap(plugin, _parserOptions => {
+						const AssetSourceParser = getAssetSourceParser();
+
+						return new AssetSourceParser();
+					});
+
+				for (const type of [
+					ASSET_MODULE_TYPE,
+					ASSET_MODULE_TYPE_INLINE,
+					ASSET_MODULE_TYPE_RESOURCE
+				]) {
+					normalModuleFactory.hooks.createGenerator
+						.for(type)
+						.tap(plugin, generatorOptions => {
+							validateGeneratorOptions[type](generatorOptions);
+
+							let dataUrl;
+							if (type !== ASSET_MODULE_TYPE_RESOURCE) {
+								dataUrl = generatorOptions.dataUrl;
+								if (!dataUrl || typeof dataUrl === "object") {
+									dataUrl = {
+										encoding: undefined,
+										mimetype: undefined,
+										...dataUrl
+									};
+								}
+							}
+
+							let filename;
+							let publicPath;
+							let outputPath;
+							if (type !== ASSET_MODULE_TYPE_INLINE) {
+								filename = generatorOptions.filename;
+								publicPath = generatorOptions.publicPath;
+								outputPath = generatorOptions.outputPath;
+							}
+
+							const AssetGenerator = getAssetGenerator();
+
+							return new AssetGenerator(
+								compilation.moduleGraph,
+								dataUrl,
+								filename,
+								publicPath,
+								outputPath,
+								generatorOptions.emit !== false
+							);
+						});
+				}
+				normalModuleFactory.hooks.createGenerator
+					.for(ASSET_MODULE_TYPE_SOURCE)
+					.tap(plugin, () => {
+						const AssetSourceGenerator = getAssetSourceGenerator();
+
+						return new AssetSourceGenerator(compilation.moduleGraph);
+					});
+
+				compilation.hooks.renderManifest.tap(plugin, (result, options) => {
+					const { chunkGraph } = compilation;
+					const { chunk, codeGenerationResults, runtimeTemplate } = options;
+
+					const modules = chunkGraph.getOrderedChunkModulesIterableBySourceType(
+						chunk,
+						ASSET_MODULE_TYPE,
+						compareModulesByIdOrIdentifier(chunkGraph)
+					);
+					if (modules) {
+						for (const module of modules) {
+							try {
+								const codeGenResult = codeGenerationResults.get(
+									module,
+									chunk.runtime
+								);
+								const buildInfo = /** @type {BuildInfo} */ (module.buildInfo);
+								const data =
+									/** @type {NonNullable} */
+									(codeGenResult.data);
+								const errored = module.getNumberOfErrors() > 0;
+
+								/** @type {string} */
+								let entryFilename;
+								/** @type {AssetInfo} */
+								let entryInfo;
+								/** @type {string} */
+								let entryHash;
+
+								if (errored) {
+									const erroredModule = /** @type {NormalModule} */ (module);
+									const AssetGenerator = getAssetGenerator();
+									const [fullContentHash, contentHash] =
+										AssetGenerator.getFullContentHash(
+											erroredModule,
+											runtimeTemplate
+										);
+									const { filename, assetInfo } =
+										AssetGenerator.getFilenameWithInfo(
+											erroredModule,
+											{
+												filename:
+													erroredModule.generatorOptions &&
+													erroredModule.generatorOptions.filename,
+												outputPath:
+													erroredModule.generatorOptions &&
+													erroredModule.generatorOptions.outputPath
+											},
+											{
+												runtime: chunk.runtime,
+												runtimeTemplate,
+												chunkGraph
+											},
+											contentHash
+										);
+									entryFilename = filename;
+									entryInfo = assetInfo;
+									entryHash = fullContentHash;
+								} else {
+									entryFilename = buildInfo.filename || data.get("filename");
+									entryInfo = buildInfo.assetInfo || data.get("assetInfo");
+									entryHash =
+										buildInfo.fullContentHash || data.get("fullContentHash");
+								}
+
+								result.push({
+									render: () =>
+										/** @type {Source} */ (codeGenResult.sources.get(type)),
+									filename: entryFilename,
+									info: entryInfo,
+									auxiliary: true,
+									identifier: `assetModule${chunkGraph.getModuleId(module)}`,
+									hash: entryHash
+								});
+							} catch (err) {
+								/** @type {Error} */ (err).message +=
+									`\nduring rendering of asset ${module.identifier()}`;
+								throw err;
+							}
+						}
+					}
+
+					return result;
+				});
+
+				compilation.hooks.prepareModuleExecution.tap(
+					"AssetModulesPlugin",
+					(options, context) => {
+						const { codeGenerationResult } = options;
+						const source = codeGenerationResult.sources.get(ASSET_MODULE_TYPE);
+						if (source === undefined) return;
+						const data =
+							/** @type {NonNullable} */
+							(codeGenerationResult.data);
+						context.assets.set(data.get("filename"), {
+							source,
+							info: data.get("assetInfo")
+						});
+					}
+				);
+			}
+		);
+	}
+}
+
+module.exports = AssetModulesPlugin;
diff --git a/lib/asset/AssetParser.js b/lib/asset/AssetParser.js
new file mode 100644
index 00000000000..b4f1d534948
--- /dev/null
+++ b/lib/asset/AssetParser.js
@@ -0,0 +1,65 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Yuta Hiroto @hiroppy
+*/
+
+"use strict";
+
+const Parser = require("../Parser");
+
+/** @typedef {import("../../declarations/WebpackOptions").AssetParserDataUrlOptions} AssetParserDataUrlOptions */
+/** @typedef {import("../../declarations/WebpackOptions").AssetParserOptions} AssetParserOptions */
+/** @typedef {import("../Module").BuildInfo} BuildInfo */
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
+/** @typedef {import("../Parser").ParserState} ParserState */
+/** @typedef {import("../Parser").PreparsedAst} PreparsedAst */
+
+class AssetParser extends Parser {
+	/**
+	 * @param {AssetParserOptions["dataUrlCondition"] | boolean} dataUrlCondition condition for inlining as DataUrl
+	 */
+	constructor(dataUrlCondition) {
+		super();
+		this.dataUrlCondition = dataUrlCondition;
+	}
+
+	/**
+	 * @param {string | Buffer | PreparsedAst} source the source to parse
+	 * @param {ParserState} state the parser state
+	 * @returns {ParserState} the parser state
+	 */
+	parse(source, state) {
+		if (typeof source === "object" && !Buffer.isBuffer(source)) {
+			throw new Error("AssetParser doesn't accept preparsed AST");
+		}
+
+		const buildInfo = /** @type {BuildInfo} */ (state.module.buildInfo);
+		buildInfo.strict = true;
+		const buildMeta = /** @type {BuildMeta} */ (state.module.buildMeta);
+		buildMeta.exportsType = "default";
+		buildMeta.defaultObject = false;
+
+		if (typeof this.dataUrlCondition === "function") {
+			buildInfo.dataUrl = this.dataUrlCondition(source, {
+				filename: state.module.matchResource || state.module.resource,
+				module: state.module
+			});
+		} else if (typeof this.dataUrlCondition === "boolean") {
+			buildInfo.dataUrl = this.dataUrlCondition;
+		} else if (
+			this.dataUrlCondition &&
+			typeof this.dataUrlCondition === "object"
+		) {
+			buildInfo.dataUrl =
+				Buffer.byteLength(source) <=
+				/** @type {NonNullable} */
+				(this.dataUrlCondition.maxSize);
+		} else {
+			throw new Error("Unexpected dataUrlCondition type");
+		}
+
+		return state;
+	}
+}
+
+module.exports = AssetParser;
diff --git a/lib/asset/AssetSourceGenerator.js b/lib/asset/AssetSourceGenerator.js
new file mode 100644
index 00000000000..2135e9e694c
--- /dev/null
+++ b/lib/asset/AssetSourceGenerator.js
@@ -0,0 +1,164 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Sergey Melyukov @smelukov
+*/
+
+"use strict";
+
+const { RawSource } = require("webpack-sources");
+const ConcatenationScope = require("../ConcatenationScope");
+const Generator = require("../Generator");
+const {
+	NO_TYPES,
+	CSS_URL_TYPES,
+	JS_TYPES,
+	JS_AND_CSS_URL_TYPES
+} = require("../ModuleSourceTypesConstants");
+const RuntimeGlobals = require("../RuntimeGlobals");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../Generator").GenerateContext} GenerateContext */
+/** @typedef {import("../Module").ConcatenationBailoutReasonContext} ConcatenationBailoutReasonContext */
+/** @typedef {import("../Module").SourceTypes} SourceTypes */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../NormalModule")} NormalModule */
+
+class AssetSourceGenerator extends Generator {
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 */
+	constructor(moduleGraph) {
+		super();
+
+		this._moduleGraph = moduleGraph;
+	}
+
+	/**
+	 * @param {NormalModule} module module for which the code should be generated
+	 * @param {GenerateContext} generateContext context for generate
+	 * @returns {Source | null} generated code
+	 */
+	generate(
+		module,
+		{ type, concatenationScope, getData, runtimeTemplate, runtimeRequirements }
+	) {
+		const originalSource = module.originalSource();
+		const data = getData ? getData() : undefined;
+
+		switch (type) {
+			case "javascript": {
+				if (!originalSource) {
+					return new RawSource("");
+				}
+
+				const content = originalSource.source();
+				const encodedSource =
+					typeof content === "string" ? content : content.toString("utf-8");
+
+				let sourceContent;
+				if (concatenationScope) {
+					concatenationScope.registerNamespaceExport(
+						ConcatenationScope.NAMESPACE_OBJECT_EXPORT
+					);
+					sourceContent = `${runtimeTemplate.supportsConst() ? "const" : "var"} ${
+						ConcatenationScope.NAMESPACE_OBJECT_EXPORT
+					} = ${JSON.stringify(encodedSource)};`;
+				} else {
+					runtimeRequirements.add(RuntimeGlobals.module);
+					sourceContent = `${RuntimeGlobals.module}.exports = ${JSON.stringify(
+						encodedSource
+					)};`;
+				}
+				return new RawSource(sourceContent);
+			}
+			case "css-url": {
+				if (!originalSource) {
+					return null;
+				}
+
+				const content = originalSource.source();
+				const encodedSource =
+					typeof content === "string" ? content : content.toString("utf-8");
+
+				if (data) {
+					data.set("url", { [type]: encodedSource });
+				}
+				return null;
+			}
+			default:
+				return null;
+		}
+	}
+
+	/**
+	 * @param {Error} error the error
+	 * @param {NormalModule} module module for which the code should be generated
+	 * @param {GenerateContext} generateContext context for generate
+	 * @returns {Source | null} generated code
+	 */
+	generateError(error, module, generateContext) {
+		switch (generateContext.type) {
+			case "javascript": {
+				return new RawSource(
+					`throw new Error(${JSON.stringify(error.message)});`
+				);
+			}
+			default:
+				return null;
+		}
+	}
+
+	/**
+	 * @param {NormalModule} module module for which the bailout reason should be determined
+	 * @param {ConcatenationBailoutReasonContext} context context
+	 * @returns {string | undefined} reason why this module can't be concatenated, undefined when it can be concatenated
+	 */
+	getConcatenationBailoutReason(module, context) {
+		return undefined;
+	}
+
+	/**
+	 * @param {NormalModule} module fresh module
+	 * @returns {SourceTypes} available types (do not mutate)
+	 */
+	getTypes(module) {
+		const sourceTypes = new Set();
+		const connections = this._moduleGraph.getIncomingConnections(module);
+
+		for (const connection of connections) {
+			if (!connection.originModule) {
+				continue;
+			}
+
+			sourceTypes.add(connection.originModule.type.split("/")[0]);
+		}
+
+		if (sourceTypes.has("javascript") && sourceTypes.has("css")) {
+			return JS_AND_CSS_URL_TYPES;
+		} else if (sourceTypes.has("javascript")) {
+			return JS_TYPES;
+		} else if (sourceTypes.has("css")) {
+			return CSS_URL_TYPES;
+		}
+
+		return NO_TYPES;
+	}
+
+	/**
+	 * @param {NormalModule} module the module
+	 * @param {string=} type source type
+	 * @returns {number} estimate size of the module
+	 */
+	getSize(module, type) {
+		const originalSource = module.originalSource();
+
+		if (!originalSource) {
+			return 0;
+		}
+
+		// Example: m.exports="abcd"
+		return originalSource.size() + 12;
+	}
+}
+
+module.exports = AssetSourceGenerator;
diff --git a/lib/asset/AssetSourceParser.js b/lib/asset/AssetSourceParser.js
new file mode 100644
index 00000000000..c122f0ea4e4
--- /dev/null
+++ b/lib/asset/AssetSourceParser.js
@@ -0,0 +1,37 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Yuta Hiroto @hiroppy
+*/
+
+"use strict";
+
+const Parser = require("../Parser");
+
+/** @typedef {import("../Module").BuildInfo} BuildInfo */
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
+/** @typedef {import("../Parser").ParserState} ParserState */
+/** @typedef {import("../Parser").PreparsedAst} PreparsedAst */
+
+class AssetSourceParser extends Parser {
+	/**
+	 * @param {string | Buffer | PreparsedAst} source the source to parse
+	 * @param {ParserState} state the parser state
+	 * @returns {ParserState} the parser state
+	 */
+	parse(source, state) {
+		if (typeof source === "object" && !Buffer.isBuffer(source)) {
+			throw new Error("AssetSourceParser doesn't accept preparsed AST");
+		}
+		const { module } = state;
+		/** @type {BuildInfo} */
+		(module.buildInfo).strict = true;
+		/** @type {BuildMeta} */
+		(module.buildMeta).exportsType = "default";
+		/** @type {BuildMeta} */
+		(state.module.buildMeta).defaultObject = false;
+
+		return state;
+	}
+}
+
+module.exports = AssetSourceParser;
diff --git a/lib/asset/RawDataUrlModule.js b/lib/asset/RawDataUrlModule.js
new file mode 100644
index 00000000000..fd5af3d750d
--- /dev/null
+++ b/lib/asset/RawDataUrlModule.js
@@ -0,0 +1,165 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { RawSource } = require("webpack-sources");
+const Module = require("../Module");
+const { JS_TYPES } = require("../ModuleSourceTypesConstants");
+const { ASSET_MODULE_TYPE_RAW_DATA_URL } = require("../ModuleTypeConstants");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const makeSerializable = require("../util/makeSerializable");
+
+/** @typedef {import("../../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../Module").BuildCallback} BuildCallback */
+/** @typedef {import("../Module").CodeGenerationContext} CodeGenerationContext */
+/** @typedef {import("../Module").CodeGenerationResult} CodeGenerationResult */
+/** @typedef {import("../Module").NeedBuildCallback} NeedBuildCallback */
+/** @typedef {import("../Module").NeedBuildContext} NeedBuildContext */
+/** @typedef {import("../Module").SourceTypes} SourceTypes */
+/** @typedef {import("../RequestShortener")} RequestShortener */
+/** @typedef {import("../ResolverFactory").ResolverWithOptions} ResolverWithOptions */
+/** @typedef {import("../WebpackError")} WebpackError */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("../util/fs").InputFileSystem} InputFileSystem */
+
+class RawDataUrlModule extends Module {
+	/**
+	 * @param {string} url raw url
+	 * @param {string} identifier unique identifier
+	 * @param {string=} readableIdentifier readable identifier
+	 */
+	constructor(url, identifier, readableIdentifier) {
+		super(ASSET_MODULE_TYPE_RAW_DATA_URL, null);
+		this.url = url;
+		this.urlBuffer = url ? Buffer.from(url) : undefined;
+		this.identifierStr = identifier || this.url;
+		this.readableIdentifierStr = readableIdentifier || this.identifierStr;
+	}
+
+	/**
+	 * @returns {SourceTypes} types available (do not mutate)
+	 */
+	getSourceTypes() {
+		return JS_TYPES;
+	}
+
+	/**
+	 * @returns {string} a unique identifier of the module
+	 */
+	identifier() {
+		return this.identifierStr;
+	}
+
+	/**
+	 * @param {string=} type the source type for which the size should be estimated
+	 * @returns {number} the estimated size of the module (must be non-zero)
+	 */
+	size(type) {
+		if (this.url === undefined)
+			this.url = /** @type {Buffer} */ (this.urlBuffer).toString();
+		return Math.max(1, this.url.length);
+	}
+
+	/**
+	 * @param {RequestShortener} requestShortener the request shortener
+	 * @returns {string} a user readable identifier of the module
+	 */
+	readableIdentifier(requestShortener) {
+		return /** @type {string} */ (
+			requestShortener.shorten(this.readableIdentifierStr)
+		);
+	}
+
+	/**
+	 * @param {NeedBuildContext} context context info
+	 * @param {NeedBuildCallback} callback callback function, returns true, if the module needs a rebuild
+	 * @returns {void}
+	 */
+	needBuild(context, callback) {
+		return callback(null, !this.buildMeta);
+	}
+
+	/**
+	 * @param {WebpackOptions} options webpack options
+	 * @param {Compilation} compilation the compilation
+	 * @param {ResolverWithOptions} resolver the resolver
+	 * @param {InputFileSystem} fs the file system
+	 * @param {BuildCallback} callback callback function
+	 * @returns {void}
+	 */
+	build(options, compilation, resolver, fs, callback) {
+		this.buildMeta = {};
+		this.buildInfo = {
+			cacheable: true
+		};
+		callback();
+	}
+
+	/**
+	 * @param {CodeGenerationContext} context context for code generation
+	 * @returns {CodeGenerationResult} result
+	 */
+	codeGeneration(context) {
+		if (this.url === undefined)
+			this.url = /** @type {Buffer} */ (this.urlBuffer).toString();
+		const sources = new Map();
+		sources.set(
+			"javascript",
+			new RawSource(`module.exports = ${JSON.stringify(this.url)};`)
+		);
+		const data = new Map();
+		data.set("url", {
+			javascript: this.url
+		});
+		const runtimeRequirements = new Set();
+		runtimeRequirements.add(RuntimeGlobals.module);
+		return { sources, runtimeRequirements, data };
+	}
+
+	/**
+	 * @param {Hash} hash the hash used to track dependencies
+	 * @param {UpdateHashContext} context context
+	 * @returns {void}
+	 */
+	updateHash(hash, context) {
+		hash.update(/** @type {Buffer} */ (this.urlBuffer));
+		super.updateHash(hash, context);
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+
+		write(this.urlBuffer);
+		write(this.identifierStr);
+		write(this.readableIdentifierStr);
+
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+
+		this.urlBuffer = read();
+		this.identifierStr = read();
+		this.readableIdentifierStr = read();
+
+		super.deserialize(context);
+	}
+}
+
+makeSerializable(RawDataUrlModule, "webpack/lib/asset/RawDataUrlModule");
+
+module.exports = RawDataUrlModule;
diff --git a/lib/async-modules/AwaitDependenciesInitFragment.js b/lib/async-modules/AwaitDependenciesInitFragment.js
new file mode 100644
index 00000000000..84abf28107d
--- /dev/null
+++ b/lib/async-modules/AwaitDependenciesInitFragment.js
@@ -0,0 +1,72 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const InitFragment = require("../InitFragment");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../Generator").GenerateContext} GenerateContext */
+
+/**
+ * @extends {InitFragment}
+ */
+class AwaitDependenciesInitFragment extends InitFragment {
+	/**
+	 * @param {Set} promises the promises that should be awaited
+	 */
+	constructor(promises) {
+		super(
+			undefined,
+			InitFragment.STAGE_ASYNC_DEPENDENCIES,
+			0,
+			"await-dependencies"
+		);
+		this.promises = promises;
+	}
+
+	/**
+	 * @param {AwaitDependenciesInitFragment} other other AwaitDependenciesInitFragment
+	 * @returns {AwaitDependenciesInitFragment} AwaitDependenciesInitFragment
+	 */
+	merge(other) {
+		const promises = new Set(other.promises);
+		for (const p of this.promises) {
+			promises.add(p);
+		}
+		return new AwaitDependenciesInitFragment(promises);
+	}
+
+	/**
+	 * @param {GenerateContext} context context
+	 * @returns {string | Source | undefined} the source code that will be included as initialization code
+	 */
+	getContent({ runtimeRequirements }) {
+		runtimeRequirements.add(RuntimeGlobals.module);
+		const promises = this.promises;
+		if (promises.size === 0) {
+			return "";
+		}
+		if (promises.size === 1) {
+			const [p] = promises;
+			return Template.asString([
+				`var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([${p}]);`,
+				`${p} = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0];`,
+				""
+			]);
+		}
+		const sepPromises = Array.from(promises).join(", ");
+		// TODO check if destructuring is supported
+		return Template.asString([
+			`var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([${sepPromises}]);`,
+			`([${sepPromises}] = __webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__);`,
+			""
+		]);
+	}
+}
+
+module.exports = AwaitDependenciesInitFragment;
diff --git a/lib/async-modules/InferAsyncModulesPlugin.js b/lib/async-modules/InferAsyncModulesPlugin.js
new file mode 100644
index 00000000000..f585aac5c98
--- /dev/null
+++ b/lib/async-modules/InferAsyncModulesPlugin.js
@@ -0,0 +1,54 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const HarmonyImportDependency = require("../dependencies/HarmonyImportDependency");
+
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Module")} Module */
+
+const PLUGIN_NAME = "InferAsyncModulesPlugin";
+
+class InferAsyncModulesPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			const { moduleGraph } = compilation;
+			compilation.hooks.finishModules.tap(PLUGIN_NAME, modules => {
+				/** @type {Set} */
+				const queue = new Set();
+				for (const module of modules) {
+					if (module.buildMeta && module.buildMeta.async) {
+						queue.add(module);
+					}
+				}
+				for (const module of queue) {
+					moduleGraph.setAsync(module);
+					for (const [
+						originModule,
+						connections
+					] of moduleGraph.getIncomingConnectionsByOriginModule(module)) {
+						if (
+							connections.some(
+								c =>
+									c.dependency instanceof HarmonyImportDependency &&
+									c.isTargetActive(undefined)
+							)
+						) {
+							queue.add(/** @type {Module} */ (originModule));
+						}
+					}
+				}
+			});
+		});
+	}
+}
+
+module.exports = InferAsyncModulesPlugin;
diff --git a/lib/buildChunkGraph.js b/lib/buildChunkGraph.js
new file mode 100644
index 00000000000..853b5f14b4f
--- /dev/null
+++ b/lib/buildChunkGraph.js
@@ -0,0 +1,1359 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const AsyncDependencyToInitialChunkError = require("./AsyncDependencyToInitialChunkError");
+const { connectChunkGroupParentAndChild } = require("./GraphHelpers");
+const ModuleGraphConnection = require("./ModuleGraphConnection");
+const { getEntryRuntime, mergeRuntime } = require("./util/runtime");
+
+/** @typedef {import("./AsyncDependenciesBlock")} AsyncDependenciesBlock */
+/** @typedef {import("./Chunk")} Chunk */
+/** @typedef {import("./ChunkGroup")} ChunkGroup */
+/** @typedef {import("./Compilation")} Compilation */
+/** @typedef {import("./DependenciesBlock")} DependenciesBlock */
+/** @typedef {import("./Dependency")} Dependency */
+/** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("./Entrypoint")} Entrypoint */
+/** @typedef {import("./Module")} Module */
+/** @typedef {import("./ModuleGraph")} ModuleGraph */
+/** @typedef {import("./ModuleGraphConnection").ConnectionState} ConnectionState */
+/** @typedef {import("./logging/Logger").Logger} Logger */
+/** @typedef {import("./util/runtime").RuntimeSpec} RuntimeSpec */
+
+/**
+ * @typedef {object} QueueItem
+ * @property {number} action
+ * @property {DependenciesBlock} block
+ * @property {Module} module
+ * @property {Chunk} chunk
+ * @property {ChunkGroup} chunkGroup
+ * @property {ChunkGroupInfo} chunkGroupInfo
+ */
+
+/**
+ * @typedef {object} ChunkGroupInfo
+ * @property {ChunkGroup} chunkGroup the chunk group
+ * @property {RuntimeSpec} runtime the runtimes
+ * @property {boolean} initialized is this chunk group initialized
+ * @property {bigint | undefined} minAvailableModules current minimal set of modules available at this point
+ * @property {bigint[]} availableModulesToBeMerged enqueued updates to the minimal set of available modules
+ * @property {Set=} skippedItems modules that were skipped because module is already available in parent chunks (need to reconsider when minAvailableModules is shrinking)
+ * @property {Set<[Module, ModuleGraphConnection[]]>=} skippedModuleConnections referenced modules that where skipped because they were not active in this runtime
+ * @property {bigint | undefined} resultingAvailableModules set of modules available including modules from this chunk group
+ * @property {Set | undefined} children set of children chunk groups, that will be revisited when availableModules shrink
+ * @property {Set | undefined} availableSources set of chunk groups that are the source for minAvailableModules
+ * @property {Set | undefined} availableChildren set of chunk groups which depend on the this chunk group as availableSource
+ * @property {number} preOrderIndex next pre order index
+ * @property {number} postOrderIndex next post order index
+ * @property {boolean} chunkLoading has a chunk loading mechanism
+ * @property {boolean} asyncChunks create async chunks
+ */
+
+/**
+ * @typedef {object} BlockChunkGroupConnection
+ * @property {ChunkGroupInfo} originChunkGroupInfo origin chunk group
+ * @property {ChunkGroup} chunkGroup referenced chunk group
+ */
+
+/** @typedef {(Module | ConnectionState | ModuleGraphConnection)[]} BlockModulesInTuples */
+/** @typedef {(Module | ConnectionState | ModuleGraphConnection[])[]} BlockModulesInFlattenTuples */
+/** @typedef {Map} BlockModulesMap */
+/** @typedef {Map} MaskByChunk */
+/** @typedef {Set} BlocksWithNestedBlocks */
+/** @typedef {Map} BlockConnections */
+/** @typedef {Map} ChunkGroupInfoMap */
+/** @typedef {Set} AllCreatedChunkGroups */
+/** @typedef {Map} InputEntrypointsAndModules */
+
+const ZERO_BIGINT = BigInt(0);
+const ONE_BIGINT = BigInt(1);
+
+/**
+ * @param {bigint} mask The mask to test
+ * @param {number} ordinal The ordinal of the bit to test
+ * @returns {boolean} If the ordinal-th bit is set in the mask
+ */
+const isOrdinalSetInMask = (mask, ordinal) =>
+	BigInt.asUintN(1, mask >> BigInt(ordinal)) !== ZERO_BIGINT;
+
+/**
+ * @param {ModuleGraphConnection[]} connections list of connections
+ * @param {RuntimeSpec} runtime for which runtime
+ * @returns {ConnectionState} connection state
+ */
+const getActiveStateOfConnections = (connections, runtime) => {
+	let merged = connections[0].getActiveState(runtime);
+	if (merged === true) return true;
+	for (let i = 1; i < connections.length; i++) {
+		const c = connections[i];
+		merged = ModuleGraphConnection.addConnectionStates(
+			merged,
+			c.getActiveState(runtime)
+		);
+		if (merged === true) return true;
+	}
+	return merged;
+};
+
+/**
+ * @param {Module} module module
+ * @param {ModuleGraph} moduleGraph module graph
+ * @param {RuntimeSpec} runtime runtime
+ * @param {BlockModulesMap} blockModulesMap block modules map
+ */
+const extractBlockModules = (module, moduleGraph, runtime, blockModulesMap) => {
+	/** @type {DependenciesBlock | undefined} */
+	let blockCache;
+	/** @type {BlockModulesInTuples | undefined} */
+	let modules;
+
+	/** @type {BlockModulesInTuples[]} */
+	const arrays = [];
+
+	/** @type {DependenciesBlock[]} */
+	const queue = [module];
+	while (queue.length > 0) {
+		const block = /** @type {DependenciesBlock} */ (queue.pop());
+		/** @type {Module[]} */
+		const arr = [];
+		arrays.push(arr);
+		blockModulesMap.set(block, arr);
+		for (const b of block.blocks) {
+			queue.push(b);
+		}
+	}
+
+	for (const connection of moduleGraph.getOutgoingConnections(module)) {
+		const d = connection.dependency;
+		// We skip connections without dependency
+		if (!d) continue;
+		const m = connection.module;
+		// We skip connections without Module pointer
+		if (!m) continue;
+		// We skip weak connections
+		if (connection.weak) continue;
+
+		const block = moduleGraph.getParentBlock(d);
+		let index = moduleGraph.getParentBlockIndex(d);
+
+		// deprecated fallback
+		if (index < 0) {
+			index = /** @type {DependenciesBlock} */ (block).dependencies.indexOf(d);
+		}
+
+		if (blockCache !== block) {
+			modules =
+				/** @type {BlockModulesInTuples} */
+				(
+					blockModulesMap.get(
+						(blockCache = /** @type {DependenciesBlock} */ (block))
+					)
+				);
+		}
+
+		const i = index * 3;
+		/** @type {BlockModulesInTuples} */
+		(modules)[i] = m;
+		/** @type {BlockModulesInTuples} */
+		(modules)[i + 1] = connection.getActiveState(runtime);
+		/** @type {BlockModulesInTuples} */
+		(modules)[i + 2] = connection;
+	}
+
+	for (const modules of arrays) {
+		if (modules.length === 0) continue;
+		let indexMap;
+		let length = 0;
+		outer: for (let j = 0; j < modules.length; j += 3) {
+			const m = modules[j];
+			if (m === undefined) continue;
+			const state = /** @type {ConnectionState} */ (modules[j + 1]);
+			const connection = /** @type {ModuleGraphConnection} */ (modules[j + 2]);
+			if (indexMap === undefined) {
+				let i = 0;
+				for (; i < length; i += 3) {
+					if (modules[i] === m) {
+						const merged = /** @type {ConnectionState} */ (modules[i + 1]);
+						/** @type {ModuleGraphConnection[]} */
+						(/** @type {unknown} */ (modules[i + 2])).push(connection);
+						if (merged === true) continue outer;
+						modules[i + 1] = ModuleGraphConnection.addConnectionStates(
+							merged,
+							state
+						);
+						continue outer;
+					}
+				}
+				modules[length] = m;
+				length++;
+				modules[length] = state;
+				length++;
+				/** @type {ModuleGraphConnection[]} */
+				(/** @type {unknown} */ (modules[length])) = [connection];
+				length++;
+				if (length > 30) {
+					// To avoid worse case performance, we will use an index map for
+					// linear cost access, which allows to maintain O(n) complexity
+					// while keeping allocations down to a minimum
+					indexMap = new Map();
+					for (let i = 0; i < length; i += 3) {
+						indexMap.set(modules[i], i + 1);
+					}
+				}
+			} else {
+				const idx = indexMap.get(m);
+				if (idx !== undefined) {
+					const merged = /** @type {ConnectionState} */ (modules[idx]);
+					/** @type {ModuleGraphConnection[]} */
+					(/** @type {unknown} */ (modules[idx + 1])).push(connection);
+					if (merged === true) continue;
+					modules[idx] = ModuleGraphConnection.addConnectionStates(
+						merged,
+						state
+					);
+				} else {
+					modules[length] = m;
+					length++;
+					modules[length] = state;
+					indexMap.set(m, length);
+					length++;
+					/** @type {ModuleGraphConnection[]} */
+					(
+						/** @type {unknown} */
+						(modules[length])
+					) = [connection];
+					length++;
+				}
+			}
+		}
+		modules.length = length;
+	}
+};
+
+/**
+ * @param {Logger} logger a logger
+ * @param {Compilation} compilation the compilation
+ * @param {InputEntrypointsAndModules} inputEntrypointsAndModules chunk groups which are processed with the modules
+ * @param {ChunkGroupInfoMap} chunkGroupInfoMap mapping from chunk group to available modules
+ * @param {BlockConnections} blockConnections connection for blocks
+ * @param {BlocksWithNestedBlocks} blocksWithNestedBlocks flag for blocks that have nested blocks
+ * @param {AllCreatedChunkGroups} allCreatedChunkGroups filled with all chunk groups that are created here
+ * @param {MaskByChunk} maskByChunk module content mask by chunk
+ */
+const visitModules = (
+	logger,
+	compilation,
+	inputEntrypointsAndModules,
+	chunkGroupInfoMap,
+	blockConnections,
+	blocksWithNestedBlocks,
+	allCreatedChunkGroups,
+	maskByChunk
+) => {
+	const { moduleGraph, chunkGraph, moduleMemCaches } = compilation;
+
+	/** @type {Map} */
+	const blockModulesRuntimeMap = new Map();
+
+	/** @type {BlockModulesMap | undefined} */
+	let blockModulesMap;
+
+	/** @type {Map} */
+	const ordinalByModule = new Map();
+
+	/**
+	 * @param {Module} module The module to look up
+	 * @returns {number} The ordinal of the module in masks
+	 */
+	const getModuleOrdinal = module => {
+		let ordinal = ordinalByModule.get(module);
+		if (ordinal === undefined) {
+			ordinal = ordinalByModule.size;
+			ordinalByModule.set(module, ordinal);
+		}
+		return ordinal;
+	};
+
+	for (const chunk of compilation.chunks) {
+		let mask = ZERO_BIGINT;
+		for (const m of chunkGraph.getChunkModulesIterable(chunk)) {
+			mask |= ONE_BIGINT << BigInt(getModuleOrdinal(m));
+		}
+		maskByChunk.set(chunk, mask);
+	}
+
+	/**
+	 * @param {DependenciesBlock} block block
+	 * @param {RuntimeSpec} runtime runtime
+	 * @returns {BlockModulesInFlattenTuples | undefined} block modules in flatten tuples
+	 */
+	const getBlockModules = (block, runtime) => {
+		blockModulesMap = blockModulesRuntimeMap.get(runtime);
+		if (blockModulesMap === undefined) {
+			/** @type {BlockModulesMap} */
+			blockModulesMap = new Map();
+			blockModulesRuntimeMap.set(runtime, blockModulesMap);
+		}
+		let blockModules = blockModulesMap.get(block);
+		if (blockModules !== undefined) return blockModules;
+		const module = /** @type {Module} */ (block.getRootBlock());
+		const memCache = moduleMemCaches && moduleMemCaches.get(module);
+		if (memCache !== undefined) {
+			/** @type {BlockModulesMap} */
+			const map = memCache.provide(
+				"bundleChunkGraph.blockModules",
+				runtime,
+				() => {
+					logger.time("visitModules: prepare");
+					const map = new Map();
+					extractBlockModules(module, moduleGraph, runtime, map);
+					logger.timeAggregate("visitModules: prepare");
+					return map;
+				}
+			);
+			for (const [block, blockModules] of map)
+				blockModulesMap.set(block, blockModules);
+			return map.get(block);
+		}
+		logger.time("visitModules: prepare");
+		extractBlockModules(module, moduleGraph, runtime, blockModulesMap);
+		blockModules =
+			/** @type {BlockModulesInFlattenTuples} */
+			(blockModulesMap.get(block));
+		logger.timeAggregate("visitModules: prepare");
+		return blockModules;
+	};
+
+	let statProcessedQueueItems = 0;
+	let statProcessedBlocks = 0;
+	let statConnectedChunkGroups = 0;
+	let statProcessedChunkGroupsForMerging = 0;
+	let statMergedAvailableModuleSets = 0;
+	const statForkedAvailableModules = 0;
+	const statForkedAvailableModulesCount = 0;
+	const statForkedAvailableModulesCountPlus = 0;
+	const statForkedMergedModulesCount = 0;
+	const statForkedMergedModulesCountPlus = 0;
+	const statForkedResultModulesCount = 0;
+	let statChunkGroupInfoUpdated = 0;
+	let statChildChunkGroupsReconnected = 0;
+
+	let nextChunkGroupIndex = 0;
+	let nextFreeModulePreOrderIndex = 0;
+	let nextFreeModulePostOrderIndex = 0;
+
+	/** @type {Map} */
+	const blockChunkGroups = new Map();
+
+	/** @type {Map>} */
+	const blocksByChunkGroups = new Map();
+
+	/** @type {Map} */
+	const namedChunkGroups = new Map();
+
+	/** @type {Map} */
+	const namedAsyncEntrypoints = new Map();
+
+	/** @type {Set} */
+	const outdatedOrderIndexChunkGroups = new Set();
+
+	const ADD_AND_ENTER_ENTRY_MODULE = 0;
+	const ADD_AND_ENTER_MODULE = 1;
+	const ENTER_MODULE = 2;
+	const PROCESS_BLOCK = 3;
+	const PROCESS_ENTRY_BLOCK = 4;
+	const LEAVE_MODULE = 5;
+
+	/** @type {QueueItem[]} */
+	let queue = [];
+
+	/** @type {Map>} */
+	const queueConnect = new Map();
+	/** @type {Set} */
+	const chunkGroupsForCombining = new Set();
+
+	// Fill queue with entrypoint modules
+	// Create ChunkGroupInfo for entrypoints
+	for (const [chunkGroup, modules] of inputEntrypointsAndModules) {
+		const runtime = getEntryRuntime(
+			compilation,
+			/** @type {string} */ (chunkGroup.name),
+			chunkGroup.options
+		);
+		/** @type {ChunkGroupInfo} */
+		const chunkGroupInfo = {
+			initialized: false,
+			chunkGroup,
+			runtime,
+			minAvailableModules: undefined,
+			availableModulesToBeMerged: [],
+			skippedItems: undefined,
+			resultingAvailableModules: undefined,
+			children: undefined,
+			availableSources: undefined,
+			availableChildren: undefined,
+			preOrderIndex: 0,
+			postOrderIndex: 0,
+			chunkLoading:
+				chunkGroup.options.chunkLoading !== undefined
+					? chunkGroup.options.chunkLoading !== false
+					: compilation.outputOptions.chunkLoading !== false,
+			asyncChunks:
+				chunkGroup.options.asyncChunks !== undefined
+					? chunkGroup.options.asyncChunks
+					: compilation.outputOptions.asyncChunks !== false
+		};
+		chunkGroup.index = nextChunkGroupIndex++;
+		if (chunkGroup.getNumberOfParents() > 0) {
+			// minAvailableModules for child entrypoints are unknown yet, set to undefined.
+			// This means no module is added until other sets are merged into
+			// this minAvailableModules (by the parent entrypoints)
+			const skippedItems = new Set(modules);
+			chunkGroupInfo.skippedItems = skippedItems;
+			chunkGroupsForCombining.add(chunkGroupInfo);
+		} else {
+			// The application may start here: We start with an empty list of available modules
+			chunkGroupInfo.minAvailableModules = ZERO_BIGINT;
+			const chunk = chunkGroup.getEntrypointChunk();
+			for (const module of modules) {
+				queue.push({
+					action: ADD_AND_ENTER_MODULE,
+					block: module,
+					module,
+					chunk,
+					chunkGroup,
+					chunkGroupInfo
+				});
+			}
+		}
+		chunkGroupInfoMap.set(chunkGroup, chunkGroupInfo);
+		if (chunkGroup.name) {
+			namedChunkGroups.set(chunkGroup.name, chunkGroupInfo);
+		}
+	}
+	// Fill availableSources with parent-child dependencies between entrypoints
+	for (const chunkGroupInfo of chunkGroupsForCombining) {
+		const { chunkGroup } = chunkGroupInfo;
+		chunkGroupInfo.availableSources = new Set();
+		for (const parent of chunkGroup.parentsIterable) {
+			const parentChunkGroupInfo =
+				/** @type {ChunkGroupInfo} */
+				(chunkGroupInfoMap.get(parent));
+			chunkGroupInfo.availableSources.add(parentChunkGroupInfo);
+			if (parentChunkGroupInfo.availableChildren === undefined) {
+				parentChunkGroupInfo.availableChildren = new Set();
+			}
+			parentChunkGroupInfo.availableChildren.add(chunkGroupInfo);
+		}
+	}
+	// pop() is used to read from the queue
+	// so it need to be reversed to be iterated in
+	// correct order
+	queue.reverse();
+
+	/** @type {Set} */
+	const outdatedChunkGroupInfo = new Set();
+	/** @type {Set<[ChunkGroupInfo, QueueItem | null]>} */
+	const chunkGroupsForMerging = new Set();
+	/** @type {QueueItem[]} */
+	let queueDelayed = [];
+
+	/** @type {[Module, ModuleGraphConnection[]][]} */
+	const skipConnectionBuffer = [];
+	/** @type {Module[]} */
+	const skipBuffer = [];
+	/** @type {QueueItem[]} */
+	const queueBuffer = [];
+
+	/** @type {Module} */
+	let module;
+	/** @type {Chunk} */
+	let chunk;
+	/** @type {ChunkGroup} */
+	let chunkGroup;
+	/** @type {DependenciesBlock} */
+	let block;
+	/** @type {ChunkGroupInfo} */
+	let chunkGroupInfo;
+
+	// For each async Block in graph
+	/**
+	 * @param {AsyncDependenciesBlock} b iterating over each Async DepBlock
+	 * @returns {void}
+	 */
+	const iteratorBlock = b => {
+		// 1. We create a chunk group with single chunk in it for this Block
+		// but only once (blockChunkGroups map)
+		/** @type {ChunkGroupInfo | undefined} */
+		let cgi = blockChunkGroups.get(b);
+		/** @type {ChunkGroup | undefined} */
+		let c;
+		/** @type {Entrypoint | undefined} */
+		let entrypoint;
+		const entryOptions = b.groupOptions && b.groupOptions.entryOptions;
+		if (cgi === undefined) {
+			const chunkName = (b.groupOptions && b.groupOptions.name) || b.chunkName;
+			if (entryOptions) {
+				cgi = namedAsyncEntrypoints.get(/** @type {string} */ (chunkName));
+				if (!cgi) {
+					entrypoint = compilation.addAsyncEntrypoint(
+						entryOptions,
+						module,
+						/** @type {DependencyLocation} */ (b.loc),
+						/** @type {string} */ (b.request)
+					);
+					maskByChunk.set(entrypoint.chunks[0], ZERO_BIGINT);
+					entrypoint.index = nextChunkGroupIndex++;
+					cgi = {
+						chunkGroup: entrypoint,
+						initialized: false,
+						runtime:
+							entrypoint.options.runtime ||
+							/** @type {string | undefined} */ (entrypoint.name),
+						minAvailableModules: ZERO_BIGINT,
+						availableModulesToBeMerged: [],
+						skippedItems: undefined,
+						resultingAvailableModules: undefined,
+						children: undefined,
+						availableSources: undefined,
+						availableChildren: undefined,
+						preOrderIndex: 0,
+						postOrderIndex: 0,
+						chunkLoading:
+							entryOptions.chunkLoading !== undefined
+								? entryOptions.chunkLoading !== false
+								: chunkGroupInfo.chunkLoading,
+						asyncChunks:
+							entryOptions.asyncChunks !== undefined
+								? entryOptions.asyncChunks
+								: chunkGroupInfo.asyncChunks
+					};
+					chunkGroupInfoMap.set(
+						entrypoint,
+						/** @type {ChunkGroupInfo} */
+						(cgi)
+					);
+
+					chunkGraph.connectBlockAndChunkGroup(b, entrypoint);
+					if (chunkName) {
+						namedAsyncEntrypoints.set(
+							chunkName,
+							/** @type {ChunkGroupInfo} */
+							(cgi)
+						);
+					}
+				} else {
+					entrypoint = /** @type {Entrypoint} */ (cgi.chunkGroup);
+					// TODO merge entryOptions
+					entrypoint.addOrigin(
+						module,
+						/** @type {DependencyLocation} */ (b.loc),
+						/** @type {string} */ (b.request)
+					);
+					chunkGraph.connectBlockAndChunkGroup(b, entrypoint);
+				}
+
+				// 2. We enqueue the DependenciesBlock for traversal
+				queueDelayed.push({
+					action: PROCESS_ENTRY_BLOCK,
+					block: b,
+					module,
+					chunk: entrypoint.chunks[0],
+					chunkGroup: entrypoint,
+					chunkGroupInfo: /** @type {ChunkGroupInfo} */ (cgi)
+				});
+			} else if (!chunkGroupInfo.asyncChunks || !chunkGroupInfo.chunkLoading) {
+				// Just queue the block into the current chunk group
+				queue.push({
+					action: PROCESS_BLOCK,
+					block: b,
+					module,
+					chunk,
+					chunkGroup,
+					chunkGroupInfo
+				});
+			} else {
+				cgi = chunkName ? namedChunkGroups.get(chunkName) : undefined;
+				if (!cgi) {
+					c = compilation.addChunkInGroup(
+						b.groupOptions || b.chunkName,
+						module,
+						/** @type {DependencyLocation} */ (b.loc),
+						/** @type {string} */ (b.request)
+					);
+					maskByChunk.set(c.chunks[0], ZERO_BIGINT);
+					c.index = nextChunkGroupIndex++;
+					cgi = {
+						initialized: false,
+						chunkGroup: c,
+						runtime: chunkGroupInfo.runtime,
+						minAvailableModules: undefined,
+						availableModulesToBeMerged: [],
+						skippedItems: undefined,
+						resultingAvailableModules: undefined,
+						children: undefined,
+						availableSources: undefined,
+						availableChildren: undefined,
+						preOrderIndex: 0,
+						postOrderIndex: 0,
+						chunkLoading: chunkGroupInfo.chunkLoading,
+						asyncChunks: chunkGroupInfo.asyncChunks
+					};
+					allCreatedChunkGroups.add(c);
+					chunkGroupInfoMap.set(c, cgi);
+					if (chunkName) {
+						namedChunkGroups.set(chunkName, cgi);
+					}
+				} else {
+					c = cgi.chunkGroup;
+					if (c.isInitial()) {
+						compilation.errors.push(
+							new AsyncDependencyToInitialChunkError(
+								/** @type {string} */ (chunkName),
+								module,
+								/** @type {DependencyLocation} */ (b.loc)
+							)
+						);
+						c = chunkGroup;
+					} else {
+						c.addOptions(b.groupOptions);
+					}
+					c.addOrigin(
+						module,
+						/** @type {DependencyLocation} */ (b.loc),
+						/** @type {string} */ (b.request)
+					);
+				}
+				blockConnections.set(b, []);
+			}
+			blockChunkGroups.set(b, /** @type {ChunkGroupInfo} */ (cgi));
+		} else if (entryOptions) {
+			entrypoint = /** @type {Entrypoint} */ (cgi.chunkGroup);
+		} else {
+			c = cgi.chunkGroup;
+		}
+
+		if (c !== undefined) {
+			// 2. We store the connection for the block
+			// to connect it later if needed
+			/** @type {BlockChunkGroupConnection[]} */
+			(blockConnections.get(b)).push({
+				originChunkGroupInfo: chunkGroupInfo,
+				chunkGroup: c
+			});
+
+			// 3. We enqueue the chunk group info creation/updating
+			let connectList = queueConnect.get(chunkGroupInfo);
+			if (connectList === undefined) {
+				connectList = new Set();
+				queueConnect.set(chunkGroupInfo, connectList);
+			}
+			connectList.add([
+				/** @type {ChunkGroupInfo} */ (cgi),
+				{
+					action: PROCESS_BLOCK,
+					block: b,
+					module,
+					chunk: c.chunks[0],
+					chunkGroup: c,
+					chunkGroupInfo: /** @type {ChunkGroupInfo} */ (cgi)
+				}
+			]);
+		} else if (entrypoint !== undefined) {
+			chunkGroupInfo.chunkGroup.addAsyncEntrypoint(entrypoint);
+		}
+	};
+
+	/**
+	 * @param {DependenciesBlock} block the block
+	 * @returns {void}
+	 */
+	const processBlock = block => {
+		statProcessedBlocks++;
+		// get prepared block info
+		const blockModules = getBlockModules(block, chunkGroupInfo.runtime);
+
+		if (blockModules !== undefined) {
+			const minAvailableModules =
+				/** @type {bigint} */
+				(chunkGroupInfo.minAvailableModules);
+			// Buffer items because order need to be reversed to get indices correct
+			// Traverse all referenced modules
+			for (let i = 0, len = blockModules.length; i < len; i += 3) {
+				const refModule = /** @type {Module} */ (blockModules[i]);
+				// For single comparisons this might be cheaper
+				const isModuleInChunk = chunkGraph.isModuleInChunk(refModule, chunk);
+
+				if (isModuleInChunk) {
+					// skip early if already connected
+					continue;
+				}
+
+				const refOrdinal = /** @type {number} */ getModuleOrdinal(refModule);
+				const activeState = /** @type {ConnectionState} */ (
+					blockModules[i + 1]
+				);
+				if (activeState !== true) {
+					const connections = /** @type {ModuleGraphConnection[]} */ (
+						blockModules[i + 2]
+					);
+					skipConnectionBuffer.push([refModule, connections]);
+					// We skip inactive connections
+					if (activeState === false) continue;
+				} else if (isOrdinalSetInMask(minAvailableModules, refOrdinal)) {
+					// already in parent chunks, skip it for now
+					skipBuffer.push(refModule);
+					continue;
+				}
+				// enqueue, then add and enter to be in the correct order
+				// this is relevant with circular dependencies
+				queueBuffer.push({
+					action: activeState === true ? ADD_AND_ENTER_MODULE : PROCESS_BLOCK,
+					block: refModule,
+					module: refModule,
+					chunk,
+					chunkGroup,
+					chunkGroupInfo
+				});
+			}
+			// Add buffered items in reverse order
+			if (skipConnectionBuffer.length > 0) {
+				let { skippedModuleConnections } = chunkGroupInfo;
+				if (skippedModuleConnections === undefined) {
+					chunkGroupInfo.skippedModuleConnections = skippedModuleConnections =
+						new Set();
+				}
+				for (let i = skipConnectionBuffer.length - 1; i >= 0; i--) {
+					skippedModuleConnections.add(skipConnectionBuffer[i]);
+				}
+				skipConnectionBuffer.length = 0;
+			}
+			if (skipBuffer.length > 0) {
+				let { skippedItems } = chunkGroupInfo;
+				if (skippedItems === undefined) {
+					chunkGroupInfo.skippedItems = skippedItems = new Set();
+				}
+				for (let i = skipBuffer.length - 1; i >= 0; i--) {
+					skippedItems.add(skipBuffer[i]);
+				}
+				skipBuffer.length = 0;
+			}
+			if (queueBuffer.length > 0) {
+				for (let i = queueBuffer.length - 1; i >= 0; i--) {
+					queue.push(queueBuffer[i]);
+				}
+				queueBuffer.length = 0;
+			}
+		}
+
+		// Traverse all Blocks
+		for (const b of block.blocks) {
+			iteratorBlock(b);
+		}
+
+		if (block.blocks.length > 0 && module !== block) {
+			blocksWithNestedBlocks.add(block);
+		}
+	};
+
+	/**
+	 * @param {DependenciesBlock} block the block
+	 * @returns {void}
+	 */
+	const processEntryBlock = block => {
+		statProcessedBlocks++;
+		// get prepared block info
+		const blockModules = getBlockModules(block, chunkGroupInfo.runtime);
+
+		if (blockModules !== undefined) {
+			// Traverse all referenced modules in reverse order
+			for (let i = blockModules.length - 3; i >= 0; i -= 3) {
+				const refModule = /** @type {Module} */ (blockModules[i]);
+				const activeState = /** @type {ConnectionState} */ (
+					blockModules[i + 1]
+				);
+				// enqueue, then add and enter to be in the correct order
+				// this is relevant with circular dependencies
+				queue.push({
+					action:
+						activeState === true ? ADD_AND_ENTER_ENTRY_MODULE : PROCESS_BLOCK,
+					block: refModule,
+					module: refModule,
+					chunk,
+					chunkGroup,
+					chunkGroupInfo
+				});
+			}
+		}
+
+		// Traverse all Blocks
+		for (const b of block.blocks) {
+			iteratorBlock(b);
+		}
+
+		if (block.blocks.length > 0 && module !== block) {
+			blocksWithNestedBlocks.add(block);
+		}
+	};
+
+	const processQueue = () => {
+		while (queue.length) {
+			statProcessedQueueItems++;
+			const queueItem = /** @type {QueueItem} */ (queue.pop());
+			module = queueItem.module;
+			block = queueItem.block;
+			chunk = queueItem.chunk;
+			chunkGroup = queueItem.chunkGroup;
+			chunkGroupInfo = queueItem.chunkGroupInfo;
+
+			switch (queueItem.action) {
+				case ADD_AND_ENTER_ENTRY_MODULE:
+					chunkGraph.connectChunkAndEntryModule(
+						chunk,
+						module,
+						/** @type {Entrypoint} */ (chunkGroup)
+					);
+				// fallthrough
+				case ADD_AND_ENTER_MODULE: {
+					const isModuleInChunk = chunkGraph.isModuleInChunk(module, chunk);
+
+					if (isModuleInChunk) {
+						// already connected, skip it
+						break;
+					}
+					// We connect Module and Chunk
+					chunkGraph.connectChunkAndModule(chunk, module);
+					const moduleOrdinal = getModuleOrdinal(module);
+					let chunkMask = /** @type {bigint} */ (maskByChunk.get(chunk));
+					chunkMask |= ONE_BIGINT << BigInt(moduleOrdinal);
+					maskByChunk.set(chunk, chunkMask);
+				}
+				// fallthrough
+				case ENTER_MODULE: {
+					const index = chunkGroup.getModulePreOrderIndex(module);
+					if (index === undefined) {
+						chunkGroup.setModulePreOrderIndex(
+							module,
+							chunkGroupInfo.preOrderIndex++
+						);
+					}
+
+					if (
+						moduleGraph.setPreOrderIndexIfUnset(
+							module,
+							nextFreeModulePreOrderIndex
+						)
+					) {
+						nextFreeModulePreOrderIndex++;
+					}
+
+					// reuse queueItem
+					queueItem.action = LEAVE_MODULE;
+					queue.push(queueItem);
+				}
+				// fallthrough
+				case PROCESS_BLOCK: {
+					processBlock(block);
+					break;
+				}
+				case PROCESS_ENTRY_BLOCK: {
+					processEntryBlock(block);
+					break;
+				}
+				case LEAVE_MODULE: {
+					const index = chunkGroup.getModulePostOrderIndex(module);
+					if (index === undefined) {
+						chunkGroup.setModulePostOrderIndex(
+							module,
+							chunkGroupInfo.postOrderIndex++
+						);
+					}
+
+					if (
+						moduleGraph.setPostOrderIndexIfUnset(
+							module,
+							nextFreeModulePostOrderIndex
+						)
+					) {
+						nextFreeModulePostOrderIndex++;
+					}
+					break;
+				}
+			}
+		}
+	};
+
+	/**
+	 * @param {ChunkGroupInfo} chunkGroupInfo The info object for the chunk group
+	 * @returns {bigint} The mask of available modules after the chunk group
+	 */
+	const calculateResultingAvailableModules = chunkGroupInfo => {
+		if (chunkGroupInfo.resultingAvailableModules !== undefined)
+			return chunkGroupInfo.resultingAvailableModules;
+
+		let resultingAvailableModules = /** @type {bigint} */ (
+			chunkGroupInfo.minAvailableModules
+		);
+
+		// add the modules from the chunk group to the set
+		for (const chunk of chunkGroupInfo.chunkGroup.chunks) {
+			const mask = /** @type {bigint} */ (maskByChunk.get(chunk));
+			resultingAvailableModules |= mask;
+		}
+
+		return (chunkGroupInfo.resultingAvailableModules =
+			resultingAvailableModules);
+	};
+
+	const processConnectQueue = () => {
+		// Figure out new parents for chunk groups
+		// to get new available modules for these children
+		for (const [chunkGroupInfo, targets] of queueConnect) {
+			// 1. Add new targets to the list of children
+			if (chunkGroupInfo.children === undefined) {
+				chunkGroupInfo.children = new Set();
+			}
+			for (const [target] of targets) {
+				chunkGroupInfo.children.add(target);
+			}
+
+			// 2. Calculate resulting available modules
+			const resultingAvailableModules =
+				calculateResultingAvailableModules(chunkGroupInfo);
+
+			const runtime = chunkGroupInfo.runtime;
+
+			// 3. Update chunk group info
+			for (const [target, processBlock] of targets) {
+				target.availableModulesToBeMerged.push(resultingAvailableModules);
+				chunkGroupsForMerging.add([target, processBlock]);
+				const oldRuntime = target.runtime;
+				const newRuntime = mergeRuntime(oldRuntime, runtime);
+				if (oldRuntime !== newRuntime) {
+					target.runtime = newRuntime;
+					outdatedChunkGroupInfo.add(target);
+				}
+			}
+
+			statConnectedChunkGroups += targets.size;
+		}
+		queueConnect.clear();
+	};
+
+	const processChunkGroupsForMerging = () => {
+		statProcessedChunkGroupsForMerging += chunkGroupsForMerging.size;
+
+		// Execute the merge
+		for (const [info, processBlock] of chunkGroupsForMerging) {
+			const availableModulesToBeMerged = info.availableModulesToBeMerged;
+			const cachedMinAvailableModules = info.minAvailableModules;
+			let minAvailableModules = cachedMinAvailableModules;
+
+			statMergedAvailableModuleSets += availableModulesToBeMerged.length;
+
+			for (const availableModules of availableModulesToBeMerged) {
+				if (minAvailableModules === undefined) {
+					minAvailableModules = availableModules;
+				} else {
+					minAvailableModules &= availableModules;
+				}
+			}
+
+			const changed = minAvailableModules !== cachedMinAvailableModules;
+
+			availableModulesToBeMerged.length = 0;
+			if (changed) {
+				info.minAvailableModules = minAvailableModules;
+				info.resultingAvailableModules = undefined;
+				outdatedChunkGroupInfo.add(info);
+			}
+
+			if (processBlock) {
+				let blocks = blocksByChunkGroups.get(info);
+				if (!blocks) {
+					blocksByChunkGroups.set(info, (blocks = new Set()));
+				}
+
+				// Whether to walk block depends on minAvailableModules and input block.
+				// We can treat creating chunk group as a function with 2 input, entry block and minAvailableModules
+				// If input is the same, we can skip re-walk
+				let needWalkBlock = !info.initialized || changed;
+				if (!blocks.has(processBlock.block)) {
+					needWalkBlock = true;
+					blocks.add(processBlock.block);
+				}
+
+				if (needWalkBlock) {
+					info.initialized = true;
+					queueDelayed.push(processBlock);
+				}
+			}
+		}
+		chunkGroupsForMerging.clear();
+	};
+
+	const processChunkGroupsForCombining = () => {
+		for (const info of chunkGroupsForCombining) {
+			for (const source of /** @type {Set} */ (
+				info.availableSources
+			)) {
+				if (source.minAvailableModules === undefined) {
+					chunkGroupsForCombining.delete(info);
+					break;
+				}
+			}
+		}
+
+		for (const info of chunkGroupsForCombining) {
+			let availableModules = ZERO_BIGINT;
+			// combine minAvailableModules from all resultingAvailableModules
+			for (const source of /** @type {Set} */ (
+				info.availableSources
+			)) {
+				const resultingAvailableModules =
+					calculateResultingAvailableModules(source);
+				availableModules |= resultingAvailableModules;
+			}
+			info.minAvailableModules = availableModules;
+			info.resultingAvailableModules = undefined;
+			outdatedChunkGroupInfo.add(info);
+		}
+		chunkGroupsForCombining.clear();
+	};
+
+	const processOutdatedChunkGroupInfo = () => {
+		statChunkGroupInfoUpdated += outdatedChunkGroupInfo.size;
+		// Revisit skipped elements
+		for (const info of outdatedChunkGroupInfo) {
+			// 1. Reconsider skipped items
+			if (info.skippedItems !== undefined) {
+				const minAvailableModules =
+					/** @type {bigint} */
+					(info.minAvailableModules);
+				for (const module of info.skippedItems) {
+					const ordinal = getModuleOrdinal(module);
+					if (!isOrdinalSetInMask(minAvailableModules, ordinal)) {
+						queue.push({
+							action: ADD_AND_ENTER_MODULE,
+							block: module,
+							module,
+							chunk: info.chunkGroup.chunks[0],
+							chunkGroup: info.chunkGroup,
+							chunkGroupInfo: info
+						});
+						info.skippedItems.delete(module);
+					}
+				}
+			}
+
+			// 2. Reconsider skipped connections
+			if (info.skippedModuleConnections !== undefined) {
+				const minAvailableModules =
+					/** @type {bigint} */
+					(info.minAvailableModules);
+				for (const entry of info.skippedModuleConnections) {
+					const [module, connections] = entry;
+					const activeState = getActiveStateOfConnections(
+						connections,
+						info.runtime
+					);
+					if (activeState === false) continue;
+					if (activeState === true) {
+						const ordinal = getModuleOrdinal(module);
+						info.skippedModuleConnections.delete(entry);
+						if (isOrdinalSetInMask(minAvailableModules, ordinal)) {
+							/** @type {NonNullable} */
+							(info.skippedItems).add(module);
+							continue;
+						}
+					}
+					queue.push({
+						action: activeState === true ? ADD_AND_ENTER_MODULE : PROCESS_BLOCK,
+						block: module,
+						module,
+						chunk: info.chunkGroup.chunks[0],
+						chunkGroup: info.chunkGroup,
+						chunkGroupInfo: info
+					});
+				}
+			}
+
+			// 2. Reconsider children chunk groups
+			if (info.children !== undefined) {
+				statChildChunkGroupsReconnected += info.children.size;
+				for (const cgi of info.children) {
+					let connectList = queueConnect.get(info);
+					if (connectList === undefined) {
+						connectList = new Set();
+						queueConnect.set(info, connectList);
+					}
+					connectList.add([cgi, null]);
+				}
+			}
+
+			// 3. Reconsider chunk groups for combining
+			if (info.availableChildren !== undefined) {
+				for (const cgi of info.availableChildren) {
+					chunkGroupsForCombining.add(cgi);
+				}
+			}
+			outdatedOrderIndexChunkGroups.add(info);
+		}
+		outdatedChunkGroupInfo.clear();
+	};
+
+	// Iterative traversal of the Module graph
+	// Recursive would be simpler to write but could result in Stack Overflows
+	while (queue.length || queueConnect.size) {
+		logger.time("visitModules: visiting");
+		processQueue();
+		logger.timeAggregateEnd("visitModules: prepare");
+		logger.timeEnd("visitModules: visiting");
+
+		if (chunkGroupsForCombining.size > 0) {
+			logger.time("visitModules: combine available modules");
+			processChunkGroupsForCombining();
+			logger.timeEnd("visitModules: combine available modules");
+		}
+
+		if (queueConnect.size > 0) {
+			logger.time("visitModules: calculating available modules");
+			processConnectQueue();
+			logger.timeEnd("visitModules: calculating available modules");
+
+			if (chunkGroupsForMerging.size > 0) {
+				logger.time("visitModules: merging available modules");
+				processChunkGroupsForMerging();
+				logger.timeEnd("visitModules: merging available modules");
+			}
+		}
+
+		if (outdatedChunkGroupInfo.size > 0) {
+			logger.time("visitModules: check modules for revisit");
+			processOutdatedChunkGroupInfo();
+			logger.timeEnd("visitModules: check modules for revisit");
+		}
+
+		// Run queueDelayed when all items of the queue are processed
+		// This is important to get the global indexing correct
+		// Async blocks should be processed after all sync blocks are processed
+		if (queue.length === 0) {
+			const tempQueue = queue;
+			queue = queueDelayed.reverse();
+			queueDelayed = tempQueue;
+		}
+	}
+
+	for (const info of outdatedOrderIndexChunkGroups) {
+		const { chunkGroup, runtime } = info;
+
+		const blocks = blocksByChunkGroups.get(info);
+
+		if (!blocks) {
+			continue;
+		}
+
+		for (const block of blocks) {
+			let preOrderIndex = 0;
+			let postOrderIndex = 0;
+			/**
+			 * @param {DependenciesBlock} current current
+			 * @param {BlocksWithNestedBlocks} visited visited dependencies blocks
+			 */
+			const process = (current, visited) => {
+				const blockModules =
+					/** @type {BlockModulesInFlattenTuples} */
+					(getBlockModules(current, runtime));
+				for (let i = 0, len = blockModules.length; i < len; i += 3) {
+					const activeState = /** @type {ConnectionState} */ (
+						blockModules[i + 1]
+					);
+					if (activeState === false) {
+						continue;
+					}
+					const refModule = /** @type {Module} */ (blockModules[i]);
+					if (visited.has(refModule)) {
+						continue;
+					}
+
+					visited.add(refModule);
+
+					if (refModule) {
+						chunkGroup.setModulePreOrderIndex(refModule, preOrderIndex++);
+						process(refModule, visited);
+						chunkGroup.setModulePostOrderIndex(refModule, postOrderIndex++);
+					}
+				}
+			};
+			process(block, new Set());
+		}
+	}
+	outdatedOrderIndexChunkGroups.clear();
+	ordinalByModule.clear();
+
+	logger.log(
+		`${statProcessedQueueItems} queue items processed (${statProcessedBlocks} blocks)`
+	);
+	logger.log(`${statConnectedChunkGroups} chunk groups connected`);
+	logger.log(
+		`${statProcessedChunkGroupsForMerging} chunk groups processed for merging (${statMergedAvailableModuleSets} module sets, ${statForkedAvailableModules} forked, ${statForkedAvailableModulesCount} + ${statForkedAvailableModulesCountPlus} modules forked, ${statForkedMergedModulesCount} + ${statForkedMergedModulesCountPlus} modules merged into fork, ${statForkedResultModulesCount} resulting modules)`
+	);
+	logger.log(
+		`${statChunkGroupInfoUpdated} chunk group info updated (${statChildChunkGroupsReconnected} already connected chunk groups reconnected)`
+	);
+};
+
+/**
+ * @param {Compilation} compilation the compilation
+ * @param {BlocksWithNestedBlocks} blocksWithNestedBlocks flag for blocks that have nested blocks
+ * @param {BlockConnections} blockConnections connection for blocks
+ * @param {MaskByChunk} maskByChunk mapping from chunk to module mask
+ */
+const connectChunkGroups = (
+	compilation,
+	blocksWithNestedBlocks,
+	blockConnections,
+	maskByChunk
+) => {
+	const { chunkGraph } = compilation;
+
+	/**
+	 * Helper function to check if all modules of a chunk are available
+	 * @param {ChunkGroup} chunkGroup the chunkGroup to scan
+	 * @param {bigint} availableModules the comparator set
+	 * @returns {boolean} return true if all modules of a chunk are available
+	 */
+	const areModulesAvailable = (chunkGroup, availableModules) => {
+		for (const chunk of chunkGroup.chunks) {
+			const chunkMask = /** @type {bigint} */ (maskByChunk.get(chunk));
+			if ((chunkMask & availableModules) !== chunkMask) return false;
+		}
+		return true;
+	};
+
+	// For each edge in the basic chunk graph
+	for (const [block, connections] of blockConnections) {
+		// 1. Check if connection is needed
+		// When none of the dependencies need to be connected
+		// we can skip all of them
+		// It's not possible to filter each item so it doesn't create inconsistent
+		// connections and modules can only create one version
+		// TODO maybe decide this per runtime
+		if (
+			// TODO is this needed?
+			!blocksWithNestedBlocks.has(block) &&
+			connections.every(({ chunkGroup, originChunkGroupInfo }) =>
+				areModulesAvailable(
+					chunkGroup,
+					/** @type {bigint} */ (originChunkGroupInfo.resultingAvailableModules)
+				)
+			)
+		) {
+			continue;
+		}
+
+		// 2. Foreach edge
+		for (let i = 0; i < connections.length; i++) {
+			const { chunkGroup, originChunkGroupInfo } = connections[i];
+
+			// 3. Connect block with chunk
+			chunkGraph.connectBlockAndChunkGroup(block, chunkGroup);
+
+			// 4. Connect chunk with parent
+			connectChunkGroupParentAndChild(
+				originChunkGroupInfo.chunkGroup,
+				chunkGroup
+			);
+		}
+	}
+};
+
+/**
+ * Remove all unconnected chunk groups
+ * @param {Compilation} compilation the compilation
+ * @param {Iterable} allCreatedChunkGroups all chunk groups that where created before
+ */
+const cleanupUnconnectedGroups = (compilation, allCreatedChunkGroups) => {
+	const { chunkGraph } = compilation;
+
+	for (const chunkGroup of allCreatedChunkGroups) {
+		if (chunkGroup.getNumberOfParents() === 0) {
+			for (const chunk of chunkGroup.chunks) {
+				compilation.chunks.delete(chunk);
+				chunkGraph.disconnectChunk(chunk);
+			}
+			chunkGraph.disconnectChunkGroup(chunkGroup);
+			chunkGroup.remove();
+		}
+	}
+};
+
+/**
+ * This method creates the Chunk graph from the Module graph
+ * @param {Compilation} compilation the compilation
+ * @param {InputEntrypointsAndModules} inputEntrypointsAndModules chunk groups which are processed with the modules
+ * @returns {void}
+ */
+const buildChunkGraph = (compilation, inputEntrypointsAndModules) => {
+	const logger = compilation.getLogger("webpack.buildChunkGraph");
+
+	// SHARED STATE
+
+	/** @type {BlockConnections} */
+	const blockConnections = new Map();
+
+	/** @type {AllCreatedChunkGroups} */
+	const allCreatedChunkGroups = new Set();
+
+	/** @type {ChunkGroupInfoMap} */
+	const chunkGroupInfoMap = new Map();
+
+	/** @type {BlocksWithNestedBlocks} */
+	const blocksWithNestedBlocks = new Set();
+
+	/** @type {MaskByChunk} */
+	const maskByChunk = new Map();
+
+	// PART ONE
+
+	logger.time("visitModules");
+	visitModules(
+		logger,
+		compilation,
+		inputEntrypointsAndModules,
+		chunkGroupInfoMap,
+		blockConnections,
+		blocksWithNestedBlocks,
+		allCreatedChunkGroups,
+		maskByChunk
+	);
+	logger.timeEnd("visitModules");
+
+	// PART TWO
+
+	logger.time("connectChunkGroups");
+	connectChunkGroups(
+		compilation,
+		blocksWithNestedBlocks,
+		blockConnections,
+		maskByChunk
+	);
+	logger.timeEnd("connectChunkGroups");
+
+	for (const [chunkGroup, chunkGroupInfo] of chunkGroupInfoMap) {
+		for (const chunk of chunkGroup.chunks)
+			chunk.runtime = mergeRuntime(chunk.runtime, chunkGroupInfo.runtime);
+	}
+
+	// Cleanup work
+
+	logger.time("cleanup");
+	cleanupUnconnectedGroups(compilation, allCreatedChunkGroups);
+	logger.timeEnd("cleanup");
+};
+
+module.exports = buildChunkGraph;
diff --git a/lib/cache/AddBuildDependenciesPlugin.js b/lib/cache/AddBuildDependenciesPlugin.js
new file mode 100644
index 00000000000..f2283ffcc0d
--- /dev/null
+++ b/lib/cache/AddBuildDependenciesPlugin.js
@@ -0,0 +1,33 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+/** @typedef {import("../Compiler")} Compiler */
+
+class AddBuildDependenciesPlugin {
+	/**
+	 * @param {Iterable} buildDependencies list of build dependencies
+	 */
+	constructor(buildDependencies) {
+		this.buildDependencies = new Set(buildDependencies);
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(
+			"AddBuildDependenciesPlugin",
+			compilation => {
+				compilation.buildDependencies.addAll(this.buildDependencies);
+			}
+		);
+	}
+}
+
+module.exports = AddBuildDependenciesPlugin;
diff --git a/lib/cache/AddManagedPathsPlugin.js b/lib/cache/AddManagedPathsPlugin.js
new file mode 100644
index 00000000000..d8e860f5272
--- /dev/null
+++ b/lib/cache/AddManagedPathsPlugin.js
@@ -0,0 +1,40 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+/** @typedef {import("../Compiler")} Compiler */
+
+class AddManagedPathsPlugin {
+	/**
+	 * @param {Iterable} managedPaths list of managed paths
+	 * @param {Iterable} immutablePaths list of immutable paths
+	 * @param {Iterable} unmanagedPaths list of unmanaged paths
+	 */
+	constructor(managedPaths, immutablePaths, unmanagedPaths) {
+		this.managedPaths = new Set(managedPaths);
+		this.immutablePaths = new Set(immutablePaths);
+		this.unmanagedPaths = new Set(unmanagedPaths);
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		for (const managedPath of this.managedPaths) {
+			compiler.managedPaths.add(managedPath);
+		}
+		for (const immutablePath of this.immutablePaths) {
+			compiler.immutablePaths.add(immutablePath);
+		}
+		for (const unmanagedPath of this.unmanagedPaths) {
+			compiler.unmanagedPaths.add(unmanagedPath);
+		}
+	}
+}
+
+module.exports = AddManagedPathsPlugin;
diff --git a/lib/cache/IdleFileCachePlugin.js b/lib/cache/IdleFileCachePlugin.js
new file mode 100644
index 00000000000..2fa1cc25504
--- /dev/null
+++ b/lib/cache/IdleFileCachePlugin.js
@@ -0,0 +1,239 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const Cache = require("../Cache");
+const ProgressPlugin = require("../ProgressPlugin");
+
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("./PackFileCacheStrategy")} PackFileCacheStrategy */
+
+const BUILD_DEPENDENCIES_KEY = Symbol("build dependencies key");
+const PLUGIN_NAME = "IdleFileCachePlugin";
+
+class IdleFileCachePlugin {
+	/**
+	 * @param {PackFileCacheStrategy} strategy cache strategy
+	 * @param {number} idleTimeout timeout
+	 * @param {number} idleTimeoutForInitialStore initial timeout
+	 * @param {number} idleTimeoutAfterLargeChanges timeout after changes
+	 */
+	constructor(
+		strategy,
+		idleTimeout,
+		idleTimeoutForInitialStore,
+		idleTimeoutAfterLargeChanges
+	) {
+		this.strategy = strategy;
+		this.idleTimeout = idleTimeout;
+		this.idleTimeoutForInitialStore = idleTimeoutForInitialStore;
+		this.idleTimeoutAfterLargeChanges = idleTimeoutAfterLargeChanges;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		const strategy = this.strategy;
+		const idleTimeout = this.idleTimeout;
+		const idleTimeoutForInitialStore = Math.min(
+			idleTimeout,
+			this.idleTimeoutForInitialStore
+		);
+		const idleTimeoutAfterLargeChanges = this.idleTimeoutAfterLargeChanges;
+		const resolvedPromise = Promise.resolve();
+
+		let timeSpendInBuild = 0;
+		let timeSpendInStore = 0;
+		let avgTimeSpendInStore = 0;
+
+		/** @type {Map Promise>} */
+		const pendingIdleTasks = new Map();
+
+		compiler.cache.hooks.store.tap(
+			{ name: PLUGIN_NAME, stage: Cache.STAGE_DISK },
+			(identifier, etag, data) => {
+				pendingIdleTasks.set(identifier, () =>
+					strategy.store(identifier, etag, data)
+				);
+			}
+		);
+
+		compiler.cache.hooks.get.tapPromise(
+			{ name: PLUGIN_NAME, stage: Cache.STAGE_DISK },
+			(identifier, etag, gotHandlers) => {
+				const restore = () =>
+					strategy.restore(identifier, etag).then(cacheEntry => {
+						if (cacheEntry === undefined) {
+							gotHandlers.push((result, callback) => {
+								if (result !== undefined) {
+									pendingIdleTasks.set(identifier, () =>
+										strategy.store(identifier, etag, result)
+									);
+								}
+								callback();
+							});
+						} else {
+							return cacheEntry;
+						}
+					});
+				const pendingTask = pendingIdleTasks.get(identifier);
+				if (pendingTask !== undefined) {
+					pendingIdleTasks.delete(identifier);
+					return pendingTask().then(restore);
+				}
+				return restore();
+			}
+		);
+
+		compiler.cache.hooks.storeBuildDependencies.tap(
+			{ name: PLUGIN_NAME, stage: Cache.STAGE_DISK },
+			dependencies => {
+				pendingIdleTasks.set(BUILD_DEPENDENCIES_KEY, () =>
+					Promise.resolve().then(() =>
+						strategy.storeBuildDependencies(dependencies)
+					)
+				);
+			}
+		);
+
+		compiler.cache.hooks.shutdown.tapPromise(
+			{ name: PLUGIN_NAME, stage: Cache.STAGE_DISK },
+			() => {
+				if (idleTimer) {
+					clearTimeout(idleTimer);
+					idleTimer = undefined;
+				}
+				isIdle = false;
+				const reportProgress = ProgressPlugin.getReporter(compiler);
+				const jobs = Array.from(pendingIdleTasks.values());
+				if (reportProgress) reportProgress(0, "process pending cache items");
+				const promises = jobs.map(fn => fn());
+				pendingIdleTasks.clear();
+				promises.push(currentIdlePromise);
+				const promise = Promise.all(promises);
+				currentIdlePromise = promise.then(() => strategy.afterAllStored());
+				if (reportProgress) {
+					currentIdlePromise = currentIdlePromise.then(() => {
+						reportProgress(1, "stored");
+					});
+				}
+				return currentIdlePromise.then(() => {
+					// Reset strategy
+					if (strategy.clear) strategy.clear();
+				});
+			}
+		);
+
+		/** @type {Promise} */
+		let currentIdlePromise = resolvedPromise;
+		let isIdle = false;
+		let isInitialStore = true;
+		const processIdleTasks = () => {
+			if (isIdle) {
+				const startTime = Date.now();
+				if (pendingIdleTasks.size > 0) {
+					const promises = [currentIdlePromise];
+					const maxTime = startTime + 100;
+					let maxCount = 100;
+					for (const [filename, factory] of pendingIdleTasks) {
+						pendingIdleTasks.delete(filename);
+						promises.push(factory());
+						if (maxCount-- <= 0 || Date.now() > maxTime) break;
+					}
+					currentIdlePromise = Promise.all(promises);
+					currentIdlePromise.then(() => {
+						timeSpendInStore += Date.now() - startTime;
+						// Allow to exit the process between
+						idleTimer = setTimeout(processIdleTasks, 0);
+						idleTimer.unref();
+					});
+					return;
+				}
+				currentIdlePromise = currentIdlePromise
+					.then(async () => {
+						await strategy.afterAllStored();
+						timeSpendInStore += Date.now() - startTime;
+						avgTimeSpendInStore =
+							Math.max(avgTimeSpendInStore, timeSpendInStore) * 0.9 +
+							timeSpendInStore * 0.1;
+						timeSpendInStore = 0;
+						timeSpendInBuild = 0;
+					})
+					.catch(err => {
+						const logger = compiler.getInfrastructureLogger(PLUGIN_NAME);
+						logger.warn(`Background tasks during idle failed: ${err.message}`);
+						logger.debug(err.stack);
+					});
+				isInitialStore = false;
+			}
+		};
+		/** @type {ReturnType | undefined} */
+		let idleTimer;
+		compiler.cache.hooks.beginIdle.tap(
+			{ name: PLUGIN_NAME, stage: Cache.STAGE_DISK },
+			() => {
+				const isLargeChange = timeSpendInBuild > avgTimeSpendInStore * 2;
+				if (isInitialStore && idleTimeoutForInitialStore < idleTimeout) {
+					compiler
+						.getInfrastructureLogger(PLUGIN_NAME)
+						.log(
+							`Initial cache was generated and cache will be persisted in ${
+								idleTimeoutForInitialStore / 1000
+							}s.`
+						);
+				} else if (
+					isLargeChange &&
+					idleTimeoutAfterLargeChanges < idleTimeout
+				) {
+					compiler
+						.getInfrastructureLogger(PLUGIN_NAME)
+						.log(
+							`Spend ${Math.round(timeSpendInBuild) / 1000}s in build and ${
+								Math.round(avgTimeSpendInStore) / 1000
+							}s in average in cache store. This is considered as large change and cache will be persisted in ${
+								idleTimeoutAfterLargeChanges / 1000
+							}s.`
+						);
+				}
+				idleTimer = setTimeout(
+					() => {
+						idleTimer = undefined;
+						isIdle = true;
+						resolvedPromise.then(processIdleTasks);
+					},
+					Math.min(
+						isInitialStore ? idleTimeoutForInitialStore : Infinity,
+						isLargeChange ? idleTimeoutAfterLargeChanges : Infinity,
+						idleTimeout
+					)
+				);
+				idleTimer.unref();
+			}
+		);
+		compiler.cache.hooks.endIdle.tap(
+			{ name: PLUGIN_NAME, stage: Cache.STAGE_DISK },
+			() => {
+				if (idleTimer) {
+					clearTimeout(idleTimer);
+					idleTimer = undefined;
+				}
+				isIdle = false;
+			}
+		);
+		compiler.hooks.done.tap(PLUGIN_NAME, stats => {
+			// 10% build overhead is ignored, as it's not cacheable
+			timeSpendInBuild *= 0.9;
+			timeSpendInBuild +=
+				/** @type {number} */ (stats.endTime) -
+				/** @type {number} */ (stats.startTime);
+		});
+	}
+}
+
+module.exports = IdleFileCachePlugin;
diff --git a/lib/cache/MemoryCachePlugin.js b/lib/cache/MemoryCachePlugin.js
new file mode 100644
index 00000000000..6e498fe258d
--- /dev/null
+++ b/lib/cache/MemoryCachePlugin.js
@@ -0,0 +1,58 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const Cache = require("../Cache");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../Cache").Data} Data */
+/** @typedef {import("../Cache").Etag} Etag */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Module")} Module */
+
+class MemoryCachePlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		/** @type {Map} */
+		const cache = new Map();
+		compiler.cache.hooks.store.tap(
+			{ name: "MemoryCachePlugin", stage: Cache.STAGE_MEMORY },
+			(identifier, etag, data) => {
+				cache.set(identifier, { etag, data });
+			}
+		);
+		compiler.cache.hooks.get.tap(
+			{ name: "MemoryCachePlugin", stage: Cache.STAGE_MEMORY },
+			(identifier, etag, gotHandlers) => {
+				const cacheEntry = cache.get(identifier);
+				if (cacheEntry === null) {
+					return null;
+				} else if (cacheEntry !== undefined) {
+					return cacheEntry.etag === etag ? cacheEntry.data : null;
+				}
+				gotHandlers.push((result, callback) => {
+					if (result === undefined) {
+						cache.set(identifier, null);
+					} else {
+						cache.set(identifier, { etag, data: result });
+					}
+					return callback();
+				});
+			}
+		);
+		compiler.cache.hooks.shutdown.tap(
+			{ name: "MemoryCachePlugin", stage: Cache.STAGE_MEMORY },
+			() => {
+				cache.clear();
+			}
+		);
+	}
+}
+module.exports = MemoryCachePlugin;
diff --git a/lib/cache/MemoryWithGcCachePlugin.js b/lib/cache/MemoryWithGcCachePlugin.js
new file mode 100644
index 00000000000..aa2aaf4442f
--- /dev/null
+++ b/lib/cache/MemoryWithGcCachePlugin.js
@@ -0,0 +1,142 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const Cache = require("../Cache");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../Cache").Data} Data */
+/** @typedef {import("../Cache").Etag} Etag */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Module")} Module */
+
+/**
+ * @typedef {object} MemoryWithGcCachePluginOptions
+ * @property {number} maxGenerations max generations
+ */
+
+const PLUGIN_NAME = "MemoryWithGcCachePlugin";
+
+class MemoryWithGcCachePlugin {
+	/**
+	 * @param {MemoryWithGcCachePluginOptions} options options
+	 */
+	constructor({ maxGenerations }) {
+		this._maxGenerations = maxGenerations;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		const maxGenerations = this._maxGenerations;
+		/** @type {Map} */
+		const cache = new Map();
+		/** @type {Map} */
+		const oldCache = new Map();
+		let generation = 0;
+		let cachePosition = 0;
+		const logger = compiler.getInfrastructureLogger(PLUGIN_NAME);
+		compiler.hooks.afterDone.tap(PLUGIN_NAME, () => {
+			generation++;
+			let clearedEntries = 0;
+			let lastClearedIdentifier;
+			// Avoid coverage problems due indirect changes
+			/* istanbul ignore next */
+			for (const [identifier, entry] of oldCache) {
+				if (entry.until > generation) break;
+
+				oldCache.delete(identifier);
+				if (cache.get(identifier) === undefined) {
+					cache.delete(identifier);
+					clearedEntries++;
+					lastClearedIdentifier = identifier;
+				}
+			}
+			if (clearedEntries > 0 || oldCache.size > 0) {
+				logger.log(
+					`${cache.size - oldCache.size} active entries, ${
+						oldCache.size
+					} recently unused cached entries${
+						clearedEntries > 0
+							? `, ${clearedEntries} old unused cache entries removed e. g. ${lastClearedIdentifier}`
+							: ""
+					}`
+				);
+			}
+			let i = (cache.size / maxGenerations) | 0;
+			let j = cachePosition >= cache.size ? 0 : cachePosition;
+			cachePosition = j + i;
+			for (const [identifier, entry] of cache) {
+				if (j !== 0) {
+					j--;
+					continue;
+				}
+				if (entry !== undefined) {
+					// We don't delete the cache entry, but set it to undefined instead
+					// This reserves the location in the data table and avoids rehashing
+					// when constantly adding and removing entries.
+					// It will be deleted when removed from oldCache.
+					cache.set(identifier, undefined);
+					oldCache.delete(identifier);
+					oldCache.set(identifier, {
+						entry,
+						until: generation + maxGenerations
+					});
+					if (i-- === 0) break;
+				}
+			}
+		});
+		compiler.cache.hooks.store.tap(
+			{ name: PLUGIN_NAME, stage: Cache.STAGE_MEMORY },
+			(identifier, etag, data) => {
+				cache.set(identifier, { etag, data });
+			}
+		);
+		compiler.cache.hooks.get.tap(
+			{ name: PLUGIN_NAME, stage: Cache.STAGE_MEMORY },
+			(identifier, etag, gotHandlers) => {
+				const cacheEntry = cache.get(identifier);
+				if (cacheEntry === null) {
+					return null;
+				} else if (cacheEntry !== undefined) {
+					return cacheEntry.etag === etag ? cacheEntry.data : null;
+				}
+				const oldCacheEntry = oldCache.get(identifier);
+				if (oldCacheEntry !== undefined) {
+					const cacheEntry = oldCacheEntry.entry;
+					if (cacheEntry === null) {
+						oldCache.delete(identifier);
+						cache.set(identifier, cacheEntry);
+						return null;
+					}
+					if (cacheEntry.etag !== etag) return null;
+					oldCache.delete(identifier);
+					cache.set(identifier, cacheEntry);
+					return cacheEntry.data;
+				}
+				gotHandlers.push((result, callback) => {
+					if (result === undefined) {
+						cache.set(identifier, null);
+					} else {
+						cache.set(identifier, { etag, data: result });
+					}
+					return callback();
+				});
+			}
+		);
+		compiler.cache.hooks.shutdown.tap(
+			{ name: PLUGIN_NAME, stage: Cache.STAGE_MEMORY },
+			() => {
+				cache.clear();
+				oldCache.clear();
+			}
+		);
+	}
+}
+module.exports = MemoryWithGcCachePlugin;
diff --git a/lib/cache/PackFileCacheStrategy.js b/lib/cache/PackFileCacheStrategy.js
new file mode 100644
index 00000000000..eca497b116d
--- /dev/null
+++ b/lib/cache/PackFileCacheStrategy.js
@@ -0,0 +1,1547 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const FileSystemInfo = require("../FileSystemInfo");
+const ProgressPlugin = require("../ProgressPlugin");
+const { formatSize } = require("../SizeFormatHelpers");
+const SerializerMiddleware = require("../serialization/SerializerMiddleware");
+const LazySet = require("../util/LazySet");
+const makeSerializable = require("../util/makeSerializable");
+const memoize = require("../util/memoize");
+const {
+	createFileSerializer,
+	NOT_SERIALIZABLE
+} = require("../util/serialization");
+
+/** @typedef {import("../../declarations/WebpackOptions").SnapshotOptions} SnapshotOptions */
+/** @typedef {import("../Cache").Data} Data */
+/** @typedef {import("../Cache").Etag} Etag */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../FileSystemInfo").ResolveBuildDependenciesResult} ResolveBuildDependenciesResult */
+/** @typedef {import("../FileSystemInfo").ResolveResults} ResolveResults */
+/** @typedef {import("../FileSystemInfo").Snapshot} Snapshot */
+/** @typedef {import("../logging/Logger").Logger} Logger */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {typeof import("../util/Hash")} Hash */
+/** @typedef {import("../util/fs").IntermediateFileSystem} IntermediateFileSystem */
+
+/** @typedef {Set} Items */
+/** @typedef {Set} BuildDependencies */
+/** @typedef {Map} ItemInfo */
+
+class PackContainer {
+	/**
+	 * @param {Pack} data stored data
+	 * @param {string} version version identifier
+	 * @param {Snapshot} buildSnapshot snapshot of all build dependencies
+	 * @param {BuildDependencies} buildDependencies list of all unresolved build dependencies captured
+	 * @param {ResolveResults} resolveResults result of the resolved build dependencies
+	 * @param {Snapshot} resolveBuildDependenciesSnapshot snapshot of the dependencies of the build dependencies resolving
+	 */
+	constructor(
+		data,
+		version,
+		buildSnapshot,
+		buildDependencies,
+		resolveResults,
+		resolveBuildDependenciesSnapshot
+	) {
+		this.data = data;
+		this.version = version;
+		this.buildSnapshot = buildSnapshot;
+		this.buildDependencies = buildDependencies;
+		this.resolveResults = resolveResults;
+		this.resolveBuildDependenciesSnapshot = resolveBuildDependenciesSnapshot;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize({ write, writeLazy }) {
+		write(this.version);
+		write(this.buildSnapshot);
+		write(this.buildDependencies);
+		write(this.resolveResults);
+		write(this.resolveBuildDependenciesSnapshot);
+		/** @type {NonNullable} */
+		(writeLazy)(this.data);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize({ read }) {
+		this.version = read();
+		this.buildSnapshot = read();
+		this.buildDependencies = read();
+		this.resolveResults = read();
+		this.resolveBuildDependenciesSnapshot = read();
+		this.data = read();
+	}
+}
+
+makeSerializable(
+	PackContainer,
+	"webpack/lib/cache/PackFileCacheStrategy",
+	"PackContainer"
+);
+
+const MIN_CONTENT_SIZE = 1024 * 1024; // 1 MB
+const CONTENT_COUNT_TO_MERGE = 10;
+const MIN_ITEMS_IN_FRESH_PACK = 100;
+const MAX_ITEMS_IN_FRESH_PACK = 50000;
+const MAX_TIME_IN_FRESH_PACK = 1 * 60 * 1000; // 1 min
+
+class PackItemInfo {
+	/**
+	 * @param {string} identifier identifier of item
+	 * @param {string | null | undefined} etag etag of item
+	 * @param {Data} value fresh value of item
+	 */
+	constructor(identifier, etag, value) {
+		this.identifier = identifier;
+		this.etag = etag;
+		this.location = -1;
+		this.lastAccess = Date.now();
+		this.freshValue = value;
+	}
+}
+
+class Pack {
+	/**
+	 * @param {Logger} logger a logger
+	 * @param {number} maxAge max age of cache items
+	 */
+	constructor(logger, maxAge) {
+		/** @type {ItemInfo} */
+		this.itemInfo = new Map();
+		/** @type {(string | undefined)[]} */
+		this.requests = [];
+		this.requestsTimeout = undefined;
+		/** @type {ItemInfo} */
+		this.freshContent = new Map();
+		/** @type {(undefined | PackContent)[]} */
+		this.content = [];
+		this.invalid = false;
+		this.logger = logger;
+		this.maxAge = maxAge;
+	}
+
+	/**
+	 * @param {string} identifier identifier
+	 */
+	_addRequest(identifier) {
+		this.requests.push(identifier);
+		if (this.requestsTimeout === undefined) {
+			this.requestsTimeout = setTimeout(() => {
+				this.requests.push(undefined);
+				this.requestsTimeout = undefined;
+			}, MAX_TIME_IN_FRESH_PACK);
+			if (this.requestsTimeout.unref) this.requestsTimeout.unref();
+		}
+	}
+
+	stopCapturingRequests() {
+		if (this.requestsTimeout !== undefined) {
+			clearTimeout(this.requestsTimeout);
+			this.requestsTimeout = undefined;
+		}
+	}
+
+	/**
+	 * @param {string} identifier unique name for the resource
+	 * @param {string | null} etag etag of the resource
+	 * @returns {Data} cached content
+	 */
+	get(identifier, etag) {
+		const info = this.itemInfo.get(identifier);
+		this._addRequest(identifier);
+		if (info === undefined) {
+			return;
+		}
+		if (info.etag !== etag) return null;
+		info.lastAccess = Date.now();
+		const loc = info.location;
+		if (loc === -1) {
+			return info.freshValue;
+		}
+		if (!this.content[loc]) {
+			return;
+		}
+		return /** @type {PackContent} */ (this.content[loc]).get(identifier);
+	}
+
+	/**
+	 * @param {string} identifier unique name for the resource
+	 * @param {string | null} etag etag of the resource
+	 * @param {Data} data cached content
+	 * @returns {void}
+	 */
+	set(identifier, etag, data) {
+		if (!this.invalid) {
+			this.invalid = true;
+			this.logger.log(`Pack got invalid because of write to: ${identifier}`);
+		}
+		const info = this.itemInfo.get(identifier);
+		if (info === undefined) {
+			const newInfo = new PackItemInfo(identifier, etag, data);
+			this.itemInfo.set(identifier, newInfo);
+			this._addRequest(identifier);
+			this.freshContent.set(identifier, newInfo);
+		} else {
+			const loc = info.location;
+			if (loc >= 0) {
+				this._addRequest(identifier);
+				this.freshContent.set(identifier, info);
+				const content = /** @type {PackContent} */ (this.content[loc]);
+				content.delete(identifier);
+				if (content.items.size === 0) {
+					this.content[loc] = undefined;
+					this.logger.debug("Pack %d got empty and is removed", loc);
+				}
+			}
+			info.freshValue = data;
+			info.lastAccess = Date.now();
+			info.etag = etag;
+			info.location = -1;
+		}
+	}
+
+	getContentStats() {
+		let count = 0;
+		let size = 0;
+		for (const content of this.content) {
+			if (content !== undefined) {
+				count++;
+				const s = content.getSize();
+				if (s > 0) {
+					size += s;
+				}
+			}
+		}
+		return { count, size };
+	}
+
+	/**
+	 * @returns {number} new location of data entries
+	 */
+	_findLocation() {
+		let i;
+		for (i = 0; i < this.content.length && this.content[i] !== undefined; i++);
+		return i;
+	}
+
+	/**
+	 * @private
+	 * @param {Items} items items
+	 * @param {Items} usedItems used items
+	 * @param {number} newLoc new location
+	 */
+	_gcAndUpdateLocation(items, usedItems, newLoc) {
+		let count = 0;
+		let lastGC;
+		const now = Date.now();
+		for (const identifier of items) {
+			const info = /** @type {PackItemInfo} */ (this.itemInfo.get(identifier));
+			if (now - info.lastAccess > this.maxAge) {
+				this.itemInfo.delete(identifier);
+				items.delete(identifier);
+				usedItems.delete(identifier);
+				count++;
+				lastGC = identifier;
+			} else {
+				info.location = newLoc;
+			}
+		}
+		if (count > 0) {
+			this.logger.log(
+				"Garbage Collected %d old items at pack %d (%d items remaining) e. g. %s",
+				count,
+				newLoc,
+				items.size,
+				lastGC
+			);
+		}
+	}
+
+	_persistFreshContent() {
+		/** @typedef {{ items: Items, map: Content, loc: number }} PackItem */
+		const itemsCount = this.freshContent.size;
+		if (itemsCount > 0) {
+			const packCount = Math.ceil(itemsCount / MAX_ITEMS_IN_FRESH_PACK);
+			const itemsPerPack = Math.ceil(itemsCount / packCount);
+			/** @type {PackItem[]} */
+			const packs = [];
+			let i = 0;
+			let ignoreNextTimeTick = false;
+			const createNextPack = () => {
+				const loc = this._findLocation();
+				this.content[loc] = /** @type {EXPECTED_ANY} */ (null); // reserve
+				/** @type {PackItem} */
+				const pack = {
+					items: new Set(),
+					map: new Map(),
+					loc
+				};
+				packs.push(pack);
+				return pack;
+			};
+			let pack = createNextPack();
+			if (this.requestsTimeout !== undefined)
+				clearTimeout(this.requestsTimeout);
+			for (const identifier of this.requests) {
+				if (identifier === undefined) {
+					if (ignoreNextTimeTick) {
+						ignoreNextTimeTick = false;
+					} else if (pack.items.size >= MIN_ITEMS_IN_FRESH_PACK) {
+						i = 0;
+						pack = createNextPack();
+					}
+					continue;
+				}
+				const info = this.freshContent.get(identifier);
+				if (info === undefined) continue;
+				pack.items.add(identifier);
+				pack.map.set(identifier, info.freshValue);
+				info.location = pack.loc;
+				info.freshValue = undefined;
+				this.freshContent.delete(identifier);
+				if (++i > itemsPerPack) {
+					i = 0;
+					pack = createNextPack();
+					ignoreNextTimeTick = true;
+				}
+			}
+			this.requests.length = 0;
+			for (const pack of packs) {
+				this.content[pack.loc] = new PackContent(
+					pack.items,
+					new Set(pack.items),
+					new PackContentItems(pack.map)
+				);
+			}
+			this.logger.log(
+				`${itemsCount} fresh items in cache put into pack ${
+					packs.length > 1
+						? packs
+								.map(pack => `${pack.loc} (${pack.items.size} items)`)
+								.join(", ")
+						: packs[0].loc
+				}`
+			);
+		}
+	}
+
+	/**
+	 * Merges small content files to a single content file
+	 */
+	_optimizeSmallContent() {
+		// 1. Find all small content files
+		// Treat unused content files separately to avoid
+		// a merge-split cycle
+		/** @type {number[]} */
+		const smallUsedContents = [];
+		/** @type {number} */
+		let smallUsedContentSize = 0;
+		/** @type {number[]} */
+		const smallUnusedContents = [];
+		/** @type {number} */
+		let smallUnusedContentSize = 0;
+		for (let i = 0; i < this.content.length; i++) {
+			const content = this.content[i];
+			if (content === undefined) continue;
+			if (content.outdated) continue;
+			const size = content.getSize();
+			if (size < 0 || size > MIN_CONTENT_SIZE) continue;
+			if (content.used.size > 0) {
+				smallUsedContents.push(i);
+				smallUsedContentSize += size;
+			} else {
+				smallUnusedContents.push(i);
+				smallUnusedContentSize += size;
+			}
+		}
+
+		// 2. Check if minimum number is reached
+		let mergedIndices;
+		if (
+			smallUsedContents.length >= CONTENT_COUNT_TO_MERGE ||
+			smallUsedContentSize > MIN_CONTENT_SIZE
+		) {
+			mergedIndices = smallUsedContents;
+		} else if (
+			smallUnusedContents.length >= CONTENT_COUNT_TO_MERGE ||
+			smallUnusedContentSize > MIN_CONTENT_SIZE
+		) {
+			mergedIndices = smallUnusedContents;
+		} else return;
+
+		/** @type {PackContent[] } */
+		const mergedContent = [];
+
+		// 3. Remove old content entries
+		for (const i of mergedIndices) {
+			mergedContent.push(/** @type {PackContent} */ (this.content[i]));
+			this.content[i] = undefined;
+		}
+
+		// 4. Determine merged items
+		/** @type {Items} */
+		const mergedItems = new Set();
+		/** @type {Items} */
+		const mergedUsedItems = new Set();
+		/** @type {((map: Content) => Promise)[]} */
+		const addToMergedMap = [];
+		for (const content of mergedContent) {
+			for (const identifier of content.items) {
+				mergedItems.add(identifier);
+			}
+			for (const identifier of content.used) {
+				mergedUsedItems.add(identifier);
+			}
+			addToMergedMap.push(async map => {
+				// unpack existing content
+				// after that values are accessible in .content
+				await content.unpack(
+					"it should be merged with other small pack contents"
+				);
+				for (const [identifier, value] of /** @type {Content} */ (
+					content.content
+				)) {
+					map.set(identifier, value);
+				}
+			});
+		}
+
+		// 5. GC and update location of merged items
+		const newLoc = this._findLocation();
+		this._gcAndUpdateLocation(mergedItems, mergedUsedItems, newLoc);
+
+		// 6. If not empty, store content somewhere
+		if (mergedItems.size > 0) {
+			this.content[newLoc] = new PackContent(
+				mergedItems,
+				mergedUsedItems,
+				memoize(async () => {
+					/** @type {Content} */
+					const map = new Map();
+					await Promise.all(addToMergedMap.map(fn => fn(map)));
+					return new PackContentItems(map);
+				})
+			);
+			this.logger.log(
+				"Merged %d small files with %d cache items into pack %d",
+				mergedContent.length,
+				mergedItems.size,
+				newLoc
+			);
+		}
+	}
+
+	/**
+	 * Split large content files with used and unused items
+	 * into two parts to separate used from unused items
+	 */
+	_optimizeUnusedContent() {
+		// 1. Find a large content file with used and unused items
+		for (let i = 0; i < this.content.length; i++) {
+			const content = this.content[i];
+			if (content === undefined) continue;
+			const size = content.getSize();
+			if (size < MIN_CONTENT_SIZE) continue;
+			const used = content.used.size;
+			const total = content.items.size;
+			if (used > 0 && used < total) {
+				// 2. Remove this content
+				this.content[i] = undefined;
+
+				// 3. Determine items for the used content file
+				const usedItems = new Set(content.used);
+				const newLoc = this._findLocation();
+				this._gcAndUpdateLocation(usedItems, usedItems, newLoc);
+
+				// 4. Create content file for used items
+				if (usedItems.size > 0) {
+					this.content[newLoc] = new PackContent(
+						usedItems,
+						new Set(usedItems),
+						async () => {
+							await content.unpack(
+								"it should be splitted into used and unused items"
+							);
+							/** @type {Content} */
+							const map = new Map();
+							for (const identifier of usedItems) {
+								map.set(
+									identifier,
+									/** @type {Content} */
+									(content.content).get(identifier)
+								);
+							}
+							return new PackContentItems(map);
+						}
+					);
+				}
+
+				// 5. Determine items for the unused content file
+				const unusedItems = new Set(content.items);
+				const usedOfUnusedItems = new Set();
+				for (const identifier of usedItems) {
+					unusedItems.delete(identifier);
+				}
+				const newUnusedLoc = this._findLocation();
+				this._gcAndUpdateLocation(unusedItems, usedOfUnusedItems, newUnusedLoc);
+
+				// 6. Create content file for unused items
+				if (unusedItems.size > 0) {
+					this.content[newUnusedLoc] = new PackContent(
+						unusedItems,
+						usedOfUnusedItems,
+						async () => {
+							await content.unpack(
+								"it should be splitted into used and unused items"
+							);
+							const map = new Map();
+							for (const identifier of unusedItems) {
+								map.set(
+									identifier,
+									/** @type {Content} */
+									(content.content).get(identifier)
+								);
+							}
+							return new PackContentItems(map);
+						}
+					);
+				}
+
+				this.logger.log(
+					"Split pack %d into pack %d with %d used items and pack %d with %d unused items",
+					i,
+					newLoc,
+					usedItems.size,
+					newUnusedLoc,
+					unusedItems.size
+				);
+
+				// optimizing only one of them is good enough and
+				// reduces the amount of serialization needed
+				return;
+			}
+		}
+	}
+
+	/**
+	 * Find the content with the oldest item and run GC on that.
+	 * Only runs for one content to avoid large invalidation.
+	 */
+	_gcOldestContent() {
+		/** @type {PackItemInfo | undefined} */
+		let oldest;
+		for (const info of this.itemInfo.values()) {
+			if (oldest === undefined || info.lastAccess < oldest.lastAccess) {
+				oldest = info;
+			}
+		}
+		if (
+			Date.now() - /** @type {PackItemInfo} */ (oldest).lastAccess >
+			this.maxAge
+		) {
+			const loc = /** @type {PackItemInfo} */ (oldest).location;
+			if (loc < 0) return;
+			const content = /** @type {PackContent} */ (this.content[loc]);
+			const items = new Set(content.items);
+			const usedItems = new Set(content.used);
+			this._gcAndUpdateLocation(items, usedItems, loc);
+
+			this.content[loc] =
+				items.size > 0
+					? new PackContent(items, usedItems, async () => {
+							await content.unpack(
+								"it contains old items that should be garbage collected"
+							);
+							const map = new Map();
+							for (const identifier of items) {
+								map.set(
+									identifier,
+									/** @type {Content} */
+									(content.content).get(identifier)
+								);
+							}
+							return new PackContentItems(map);
+						})
+					: undefined;
+		}
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize({ write, writeSeparate }) {
+		this._persistFreshContent();
+		this._optimizeSmallContent();
+		this._optimizeUnusedContent();
+		this._gcOldestContent();
+		for (const identifier of this.itemInfo.keys()) {
+			write(identifier);
+		}
+		write(null); // null as marker of the end of keys
+		for (const info of this.itemInfo.values()) {
+			write(info.etag);
+		}
+		for (const info of this.itemInfo.values()) {
+			write(info.lastAccess);
+		}
+		for (let i = 0; i < this.content.length; i++) {
+			const content = this.content[i];
+			if (content !== undefined) {
+				write(content.items);
+				content.writeLazy(lazy =>
+					/** @type {NonNullable} */
+					(writeSeparate)(lazy, { name: `${i}` })
+				);
+			} else {
+				write(undefined); // undefined marks an empty content slot
+			}
+		}
+		write(null); // null as marker of the end of items
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext & { logger: Logger }} context context
+	 */
+	deserialize({ read, logger }) {
+		this.logger = logger;
+		{
+			const items = [];
+			let item = read();
+			while (item !== null) {
+				items.push(item);
+				item = read();
+			}
+			this.itemInfo.clear();
+			const infoItems = items.map(identifier => {
+				const info = new PackItemInfo(identifier, undefined, undefined);
+				this.itemInfo.set(identifier, info);
+				return info;
+			});
+			for (const info of infoItems) {
+				info.etag = read();
+			}
+			for (const info of infoItems) {
+				info.lastAccess = read();
+			}
+		}
+		this.content.length = 0;
+		let items = read();
+		while (items !== null) {
+			if (items === undefined) {
+				this.content.push(items);
+			} else {
+				const idx = this.content.length;
+				const lazy = read();
+				this.content.push(
+					new PackContent(
+						items,
+						new Set(),
+						lazy,
+						logger,
+						`${this.content.length}`
+					)
+				);
+				for (const identifier of items) {
+					/** @type {PackItemInfo} */
+					(this.itemInfo.get(identifier)).location = idx;
+				}
+			}
+			items = read();
+		}
+	}
+}
+
+makeSerializable(Pack, "webpack/lib/cache/PackFileCacheStrategy", "Pack");
+
+/** @typedef {Map} Content */
+
+class PackContentItems {
+	/**
+	 * @param {Content} map items
+	 */
+	constructor(map) {
+		this.map = map;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext & { logger: Logger, profile: boolean | undefined  }} context context
+	 */
+	serialize({ write, snapshot, rollback, logger, profile }) {
+		if (profile) {
+			write(false);
+			for (const [key, value] of this.map) {
+				const s = snapshot();
+				try {
+					write(key);
+					const start = process.hrtime();
+					write(value);
+					const durationHr = process.hrtime(start);
+					const duration = durationHr[0] * 1000 + durationHr[1] / 1e6;
+					if (duration > 1) {
+						if (duration > 500)
+							logger.error(`Serialization of '${key}': ${duration} ms`);
+						else if (duration > 50)
+							logger.warn(`Serialization of '${key}': ${duration} ms`);
+						else if (duration > 10)
+							logger.info(`Serialization of '${key}': ${duration} ms`);
+						else if (duration > 5)
+							logger.log(`Serialization of '${key}': ${duration} ms`);
+						else logger.debug(`Serialization of '${key}': ${duration} ms`);
+					}
+				} catch (err) {
+					rollback(s);
+					if (err === NOT_SERIALIZABLE) continue;
+					const msg = "Skipped not serializable cache item";
+					const notSerializableErr = /** @type {Error} */ (err);
+					if (notSerializableErr.message.includes("ModuleBuildError")) {
+						logger.log(
+							`${msg} (in build error): ${notSerializableErr.message}`
+						);
+						logger.debug(
+							`${msg} '${key}' (in build error): ${notSerializableErr.stack}`
+						);
+					} else {
+						logger.warn(`${msg}: ${notSerializableErr.message}`);
+						logger.debug(`${msg} '${key}': ${notSerializableErr.stack}`);
+					}
+				}
+			}
+			write(null);
+			return;
+		}
+		// Try to serialize all at once
+		const s = snapshot();
+		try {
+			write(true);
+			write(this.map);
+		} catch (_err) {
+			rollback(s);
+
+			// Try to serialize each item on it's own
+			write(false);
+			for (const [key, value] of this.map) {
+				const s = snapshot();
+				try {
+					write(key);
+					write(value);
+				} catch (err) {
+					rollback(s);
+					if (err === NOT_SERIALIZABLE) continue;
+					const notSerializableErr = /** @type {Error} */ (err);
+					logger.warn(
+						`Skipped not serializable cache item '${key}': ${notSerializableErr.message}`
+					);
+					logger.debug(notSerializableErr.stack);
+				}
+			}
+			write(null);
+		}
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext & { logger: Logger, profile: boolean | undefined }} context context
+	 */
+	deserialize({ read, logger, profile }) {
+		if (read()) {
+			this.map = read();
+		} else if (profile) {
+			const map = new Map();
+			let key = read();
+			while (key !== null) {
+				const start = process.hrtime();
+				const value = read();
+				const durationHr = process.hrtime(start);
+				const duration = durationHr[0] * 1000 + durationHr[1] / 1e6;
+				if (duration > 1) {
+					if (duration > 100)
+						logger.error(`Deserialization of '${key}': ${duration} ms`);
+					else if (duration > 20)
+						logger.warn(`Deserialization of '${key}': ${duration} ms`);
+					else if (duration > 5)
+						logger.info(`Deserialization of '${key}': ${duration} ms`);
+					else if (duration > 2)
+						logger.log(`Deserialization of '${key}': ${duration} ms`);
+					else logger.debug(`Deserialization of '${key}': ${duration} ms`);
+				}
+				map.set(key, value);
+				key = read();
+			}
+			this.map = map;
+		} else {
+			const map = new Map();
+			let key = read();
+			while (key !== null) {
+				map.set(key, read());
+				key = read();
+			}
+			this.map = map;
+		}
+	}
+}
+
+makeSerializable(
+	PackContentItems,
+	"webpack/lib/cache/PackFileCacheStrategy",
+	"PackContentItems"
+);
+
+/** @typedef {(() => Promise | PackContentItems) & Partial<{ options: { size?: number }}>} LazyFunction */
+
+class PackContent {
+	/*
+		This class can be in these states:
+		   |   this.lazy    | this.content | this.outdated | state
+		A1 |   undefined    |     Map      |     false     | fresh content
+		A2 |   undefined    |     Map      |     true      | (will not happen)
+		B1 | lazy () => {}  |  undefined   |     false     | not deserialized
+		B2 | lazy () => {}  |  undefined   |     true      | not deserialized, but some items has been removed
+		C1 | lazy* () => {} |     Map      |     false     | deserialized
+		C2 | lazy* () => {} |     Map      |     true      | deserialized, and some items has been removed
+
+		this.used is a subset of this.items.
+		this.items is a subset of this.content.keys() resp. this.lazy().map.keys()
+		When this.outdated === false, this.items === this.content.keys() resp. this.lazy().map.keys()
+		When this.outdated === true, this.items should be used to recreated this.lazy/this.content.
+		When this.lazy and this.content is set, they contain the same data.
+		this.get must only be called with a valid item from this.items.
+		In state C this.lazy is unMemoized
+	*/
+
+	/**
+	 * @param {Items} items keys
+	 * @param {Items} usedItems used keys
+	 * @param {PackContentItems | (() => Promise)} dataOrFn sync or async content
+	 * @param {Logger=} logger logger for logging
+	 * @param {string=} lazyName name of dataOrFn for logging
+	 */
+	constructor(items, usedItems, dataOrFn, logger, lazyName) {
+		this.items = items;
+		/** @type {LazyFunction | undefined} */
+		this.lazy = typeof dataOrFn === "function" ? dataOrFn : undefined;
+		/** @type {Content | undefined} */
+		this.content = typeof dataOrFn === "function" ? undefined : dataOrFn.map;
+		this.outdated = false;
+		this.used = usedItems;
+		this.logger = logger;
+		this.lazyName = lazyName;
+	}
+
+	/**
+	 * @param {string} identifier identifier
+	 * @returns {string | Promise} result
+	 */
+	get(identifier) {
+		this.used.add(identifier);
+		if (this.content) {
+			return this.content.get(identifier);
+		}
+
+		const logger = /** @type {Logger} */ (this.logger);
+		// We are in state B
+		const { lazyName } = this;
+		/** @type {string | undefined} */
+		let timeMessage;
+		if (lazyName) {
+			// only log once
+			this.lazyName = undefined;
+			timeMessage = `restore cache content ${lazyName} (${formatSize(
+				this.getSize()
+			)})`;
+			logger.log(
+				`starting to restore cache content ${lazyName} (${formatSize(
+					this.getSize()
+				)}) because of request to: ${identifier}`
+			);
+			logger.time(timeMessage);
+		}
+		const value = /** @type {LazyFunction} */ (this.lazy)();
+		if ("then" in value) {
+			return value.then(data => {
+				const map = data.map;
+				if (timeMessage) {
+					logger.timeEnd(timeMessage);
+				}
+				// Move to state C
+				this.content = map;
+				this.lazy = SerializerMiddleware.unMemoizeLazy(this.lazy);
+				return map.get(identifier);
+			});
+		}
+
+		const map = value.map;
+		if (timeMessage) {
+			logger.timeEnd(timeMessage);
+		}
+		// Move to state C
+		this.content = map;
+		this.lazy = SerializerMiddleware.unMemoizeLazy(this.lazy);
+		return map.get(identifier);
+	}
+
+	/**
+	 * @param {string} reason explanation why unpack is necessary
+	 * @returns {void | Promise} maybe a promise if lazy
+	 */
+	unpack(reason) {
+		if (this.content) return;
+
+		const logger = /** @type {Logger} */ (this.logger);
+		// Move from state B to C
+		if (this.lazy) {
+			const { lazyName } = this;
+			/** @type {string | undefined} */
+			let timeMessage;
+			if (lazyName) {
+				// only log once
+				this.lazyName = undefined;
+				timeMessage = `unpack cache content ${lazyName} (${formatSize(
+					this.getSize()
+				)})`;
+				logger.log(
+					`starting to unpack cache content ${lazyName} (${formatSize(
+						this.getSize()
+					)}) because ${reason}`
+				);
+				logger.time(timeMessage);
+			}
+			const value =
+				/** @type {PackContentItems | Promise} */
+				(this.lazy());
+			if ("then" in value) {
+				return value.then(data => {
+					if (timeMessage) {
+						logger.timeEnd(timeMessage);
+					}
+					this.content = data.map;
+				});
+			}
+			if (timeMessage) {
+				logger.timeEnd(timeMessage);
+			}
+			this.content = value.map;
+		}
+	}
+
+	/**
+	 * @returns {number} size of the content or -1 if not known
+	 */
+	getSize() {
+		if (!this.lazy) return -1;
+		const options =
+			/** @type {{ options: { size?: number } }} */
+			(this.lazy).options;
+		if (!options) return -1;
+		const size = options.size;
+		if (typeof size !== "number") return -1;
+		return size;
+	}
+
+	/**
+	 * @param {string} identifier identifier
+	 */
+	delete(identifier) {
+		this.items.delete(identifier);
+		this.used.delete(identifier);
+		this.outdated = true;
+	}
+
+	/**
+	 * @param {(lazy: LazyFunction) => (() => PackContentItems | Promise)} write write function
+	 * @returns {void}
+	 */
+	writeLazy(write) {
+		if (!this.outdated && this.lazy) {
+			// State B1 or C1
+			// this.lazy is still the valid deserialized version
+			write(this.lazy);
+			return;
+		}
+		if (!this.outdated && this.content) {
+			// State A1
+			const map = new Map(this.content);
+			// Move to state C1
+			this.lazy = SerializerMiddleware.unMemoizeLazy(
+				write(() => new PackContentItems(map))
+			);
+			return;
+		}
+		if (this.content) {
+			// State A2 or C2
+			/** @type {Content} */
+			const map = new Map();
+			for (const item of this.items) {
+				map.set(item, this.content.get(item));
+			}
+			// Move to state C1
+			this.outdated = false;
+			this.content = map;
+			this.lazy = SerializerMiddleware.unMemoizeLazy(
+				write(() => new PackContentItems(map))
+			);
+			return;
+		}
+		const logger = /** @type {Logger} */ (this.logger);
+		// State B2
+		const { lazyName } = this;
+		/** @type {string | undefined} */
+		let timeMessage;
+		if (lazyName) {
+			// only log once
+			this.lazyName = undefined;
+			timeMessage = `unpack cache content ${lazyName} (${formatSize(
+				this.getSize()
+			)})`;
+			logger.log(
+				`starting to unpack cache content ${lazyName} (${formatSize(
+					this.getSize()
+				)}) because it's outdated and need to be serialized`
+			);
+			logger.time(timeMessage);
+		}
+		const value = /** @type {LazyFunction} */ (this.lazy)();
+		this.outdated = false;
+		if ("then" in value) {
+			// Move to state B1
+			this.lazy = write(() =>
+				value.then(data => {
+					if (timeMessage) {
+						logger.timeEnd(timeMessage);
+					}
+					const oldMap = data.map;
+					/** @type {Content} */
+					const map = new Map();
+					for (const item of this.items) {
+						map.set(item, oldMap.get(item));
+					}
+					// Move to state C1 (or maybe C2)
+					this.content = map;
+					this.lazy = SerializerMiddleware.unMemoizeLazy(this.lazy);
+
+					return new PackContentItems(map);
+				})
+			);
+		} else {
+			// Move to state C1
+			if (timeMessage) {
+				logger.timeEnd(timeMessage);
+			}
+			const oldMap = value.map;
+			/** @type {Content} */
+			const map = new Map();
+			for (const item of this.items) {
+				map.set(item, oldMap.get(item));
+			}
+			this.content = map;
+			this.lazy = write(() => new PackContentItems(map));
+		}
+	}
+}
+
+/**
+ * @param {Buffer} buf buffer
+ * @returns {Buffer} buffer that can be collected
+ */
+const allowCollectingMemory = buf => {
+	const wasted = buf.buffer.byteLength - buf.byteLength;
+	if (wasted > 8192 && (wasted > 1048576 || wasted > buf.byteLength)) {
+		return Buffer.from(buf);
+	}
+	return buf;
+};
+
+class PackFileCacheStrategy {
+	/**
+	 * @param {object} options options
+	 * @param {Compiler} options.compiler the compiler
+	 * @param {IntermediateFileSystem} options.fs the filesystem
+	 * @param {string} options.context the context directory
+	 * @param {string} options.cacheLocation the location of the cache data
+	 * @param {string} options.version version identifier
+	 * @param {Logger} options.logger a logger
+	 * @param {SnapshotOptions} options.snapshot options regarding snapshotting
+	 * @param {number} options.maxAge max age of cache items
+	 * @param {boolean | undefined} options.profile track and log detailed timing information for individual cache items
+	 * @param {boolean | undefined} options.allowCollectingMemory allow to collect unused memory created during deserialization
+	 * @param {false | "gzip" | "brotli" | undefined} options.compression compression used
+	 * @param {boolean | undefined} options.readonly disable storing cache into filesystem
+	 */
+	constructor({
+		compiler,
+		fs,
+		context,
+		cacheLocation,
+		version,
+		logger,
+		snapshot,
+		maxAge,
+		profile,
+		allowCollectingMemory,
+		compression,
+		readonly
+	}) {
+		/** @type {import("../serialization/Serializer")} */
+		this.fileSerializer = createFileSerializer(
+			fs,
+			/** @type {string | Hash} */
+			(compiler.options.output.hashFunction)
+		);
+		this.fileSystemInfo = new FileSystemInfo(fs, {
+			managedPaths: snapshot.managedPaths,
+			immutablePaths: snapshot.immutablePaths,
+			logger: logger.getChildLogger("webpack.FileSystemInfo"),
+			hashFunction: compiler.options.output.hashFunction
+		});
+		this.compiler = compiler;
+		this.context = context;
+		this.cacheLocation = cacheLocation;
+		this.version = version;
+		this.logger = logger;
+		this.maxAge = maxAge;
+		this.profile = profile;
+		this.readonly = readonly;
+		this.allowCollectingMemory = allowCollectingMemory;
+		this.compression = compression;
+		this._extension =
+			compression === "brotli"
+				? ".pack.br"
+				: compression === "gzip"
+					? ".pack.gz"
+					: ".pack";
+		this.snapshot = snapshot;
+		/** @type {BuildDependencies} */
+		this.buildDependencies = new Set();
+		/** @type {LazySet} */
+		this.newBuildDependencies = new LazySet();
+		/** @type {Snapshot | undefined} */
+		this.resolveBuildDependenciesSnapshot = undefined;
+		/** @type {ResolveResults | undefined} */
+		this.resolveResults = undefined;
+		/** @type {Snapshot | undefined} */
+		this.buildSnapshot = undefined;
+		/** @type {Promise | undefined} */
+		this.packPromise = this._openPack();
+		this.storePromise = Promise.resolve();
+	}
+
+	/**
+	 * @returns {Promise} pack
+	 */
+	_getPack() {
+		if (this.packPromise === undefined) {
+			this.packPromise = this.storePromise.then(() => this._openPack());
+		}
+		return this.packPromise;
+	}
+
+	/**
+	 * @returns {Promise} the pack
+	 */
+	_openPack() {
+		const { logger, profile, cacheLocation, version } = this;
+		/** @type {Snapshot} */
+		let buildSnapshot;
+		/** @type {BuildDependencies} */
+		let buildDependencies;
+		/** @type {BuildDependencies} */
+		let newBuildDependencies;
+		/** @type {Snapshot} */
+		let resolveBuildDependenciesSnapshot;
+		/** @type {ResolveResults | undefined} */
+		let resolveResults;
+		logger.time("restore cache container");
+		return this.fileSerializer
+			.deserialize(null, {
+				filename: `${cacheLocation}/index${this._extension}`,
+				extension: `${this._extension}`,
+				logger,
+				profile,
+				retainedBuffer: this.allowCollectingMemory
+					? allowCollectingMemory
+					: undefined
+			})
+			.catch(err => {
+				if (err.code !== "ENOENT") {
+					logger.warn(
+						`Restoring pack failed from ${cacheLocation}${this._extension}: ${err}`
+					);
+					logger.debug(err.stack);
+				} else {
+					logger.debug(
+						`No pack exists at ${cacheLocation}${this._extension}: ${err}`
+					);
+				}
+				return undefined;
+			})
+			.then(packContainer => {
+				logger.timeEnd("restore cache container");
+				if (!packContainer) return;
+				if (!(packContainer instanceof PackContainer)) {
+					logger.warn(
+						`Restored pack from ${cacheLocation}${this._extension}, but contained content is unexpected.`,
+						packContainer
+					);
+					return;
+				}
+				if (packContainer.version !== version) {
+					logger.log(
+						`Restored pack from ${cacheLocation}${this._extension}, but version doesn't match.`
+					);
+					return;
+				}
+				logger.time("check build dependencies");
+				return Promise.all([
+					new Promise((resolve, reject) => {
+						this.fileSystemInfo.checkSnapshotValid(
+							packContainer.buildSnapshot,
+							(err, valid) => {
+								if (err) {
+									logger.log(
+										`Restored pack from ${cacheLocation}${this._extension}, but checking snapshot of build dependencies errored: ${err}.`
+									);
+									logger.debug(err.stack);
+									return resolve(false);
+								}
+								if (!valid) {
+									logger.log(
+										`Restored pack from ${cacheLocation}${this._extension}, but build dependencies have changed.`
+									);
+									return resolve(false);
+								}
+								buildSnapshot = packContainer.buildSnapshot;
+								return resolve(true);
+							}
+						);
+					}),
+					new Promise((resolve, reject) => {
+						this.fileSystemInfo.checkSnapshotValid(
+							packContainer.resolveBuildDependenciesSnapshot,
+							(err, valid) => {
+								if (err) {
+									logger.log(
+										`Restored pack from ${cacheLocation}${this._extension}, but checking snapshot of resolving of build dependencies errored: ${err}.`
+									);
+									logger.debug(err.stack);
+									return resolve(false);
+								}
+								if (valid) {
+									resolveBuildDependenciesSnapshot =
+										packContainer.resolveBuildDependenciesSnapshot;
+									buildDependencies = packContainer.buildDependencies;
+									resolveResults = packContainer.resolveResults;
+									return resolve(true);
+								}
+								logger.log(
+									"resolving of build dependencies is invalid, will re-resolve build dependencies"
+								);
+								this.fileSystemInfo.checkResolveResultsValid(
+									packContainer.resolveResults,
+									(err, valid) => {
+										if (err) {
+											logger.log(
+												`Restored pack from ${cacheLocation}${this._extension}, but resolving of build dependencies errored: ${err}.`
+											);
+											logger.debug(err.stack);
+											return resolve(false);
+										}
+										if (valid) {
+											newBuildDependencies = packContainer.buildDependencies;
+											resolveResults = packContainer.resolveResults;
+											return resolve(true);
+										}
+										logger.log(
+											`Restored pack from ${cacheLocation}${this._extension}, but build dependencies resolve to different locations.`
+										);
+										return resolve(false);
+									}
+								);
+							}
+						);
+					})
+				])
+					.catch(err => {
+						logger.timeEnd("check build dependencies");
+						throw err;
+					})
+					.then(([buildSnapshotValid, resolveValid]) => {
+						logger.timeEnd("check build dependencies");
+						if (buildSnapshotValid && resolveValid) {
+							logger.time("restore cache content metadata");
+							const d = /** @type {TODO} */ (packContainer).data();
+							logger.timeEnd("restore cache content metadata");
+							return d;
+						}
+						return undefined;
+					});
+			})
+			.then(pack => {
+				if (pack) {
+					pack.maxAge = this.maxAge;
+					this.buildSnapshot = buildSnapshot;
+					if (buildDependencies) this.buildDependencies = buildDependencies;
+					if (newBuildDependencies)
+						this.newBuildDependencies.addAll(newBuildDependencies);
+					this.resolveResults = resolveResults;
+					this.resolveBuildDependenciesSnapshot =
+						resolveBuildDependenciesSnapshot;
+					return pack;
+				}
+				return new Pack(logger, this.maxAge);
+			})
+			.catch(err => {
+				this.logger.warn(
+					`Restoring pack from ${cacheLocation}${this._extension} failed: ${err}`
+				);
+				this.logger.debug(err.stack);
+				return new Pack(logger, this.maxAge);
+			});
+	}
+
+	/**
+	 * @param {string} identifier unique name for the resource
+	 * @param {Etag | null} etag etag of the resource
+	 * @param {Data} data cached content
+	 * @returns {Promise} promise
+	 */
+	store(identifier, etag, data) {
+		if (this.readonly) return Promise.resolve();
+
+		return this._getPack().then(pack => {
+			pack.set(identifier, etag === null ? null : etag.toString(), data);
+		});
+	}
+
+	/**
+	 * @param {string} identifier unique name for the resource
+	 * @param {Etag | null} etag etag of the resource
+	 * @returns {Promise} promise to the cached content
+	 */
+	restore(identifier, etag) {
+		return this._getPack()
+			.then(pack =>
+				pack.get(identifier, etag === null ? null : etag.toString())
+			)
+			.catch(err => {
+				if (err && err.code !== "ENOENT") {
+					this.logger.warn(
+						`Restoring failed for ${identifier} from pack: ${err}`
+					);
+					this.logger.debug(err.stack);
+				}
+			});
+	}
+
+	/**
+	 * @param {LazySet | Iterable} dependencies dependencies to store
+	 */
+	storeBuildDependencies(dependencies) {
+		if (this.readonly) return;
+		this.newBuildDependencies.addAll(dependencies);
+	}
+
+	afterAllStored() {
+		const packPromise = this.packPromise;
+		if (packPromise === undefined) return Promise.resolve();
+		const reportProgress = ProgressPlugin.getReporter(this.compiler);
+		return (this.storePromise = packPromise
+			.then(pack => {
+				pack.stopCapturingRequests();
+				if (!pack.invalid) return;
+				this.packPromise = undefined;
+				this.logger.log("Storing pack...");
+				let promise;
+				const newBuildDependencies = new Set();
+				for (const dep of this.newBuildDependencies) {
+					if (!this.buildDependencies.has(dep)) {
+						newBuildDependencies.add(dep);
+					}
+				}
+				if (newBuildDependencies.size > 0 || !this.buildSnapshot) {
+					if (reportProgress) reportProgress(0.5, "resolve build dependencies");
+					this.logger.debug(
+						`Capturing build dependencies... (${Array.from(
+							newBuildDependencies
+						).join(", ")})`
+					);
+					promise = new Promise(
+						/**
+						 * @param {(value?: undefined) => void} resolve resolve
+						 * @param {(reason?: Error) => void} reject reject
+						 */
+						(resolve, reject) => {
+							this.logger.time("resolve build dependencies");
+							this.fileSystemInfo.resolveBuildDependencies(
+								this.context,
+								newBuildDependencies,
+								(err, result) => {
+									this.logger.timeEnd("resolve build dependencies");
+									if (err) return reject(err);
+
+									this.logger.time("snapshot build dependencies");
+									const {
+										files,
+										directories,
+										missing,
+										resolveResults,
+										resolveDependencies
+									} = /** @type {ResolveBuildDependenciesResult} */ (result);
+									if (this.resolveResults) {
+										for (const [key, value] of resolveResults) {
+											this.resolveResults.set(key, value);
+										}
+									} else {
+										this.resolveResults = resolveResults;
+									}
+									if (reportProgress) {
+										reportProgress(
+											0.6,
+											"snapshot build dependencies",
+											"resolving"
+										);
+									}
+									this.fileSystemInfo.createSnapshot(
+										undefined,
+										resolveDependencies.files,
+										resolveDependencies.directories,
+										resolveDependencies.missing,
+										this.snapshot.resolveBuildDependencies,
+										(err, snapshot) => {
+											if (err) {
+												this.logger.timeEnd("snapshot build dependencies");
+												return reject(err);
+											}
+											if (!snapshot) {
+												this.logger.timeEnd("snapshot build dependencies");
+												return reject(
+													new Error("Unable to snapshot resolve dependencies")
+												);
+											}
+											if (this.resolveBuildDependenciesSnapshot) {
+												this.resolveBuildDependenciesSnapshot =
+													this.fileSystemInfo.mergeSnapshots(
+														this.resolveBuildDependenciesSnapshot,
+														snapshot
+													);
+											} else {
+												this.resolveBuildDependenciesSnapshot = snapshot;
+											}
+											if (reportProgress) {
+												reportProgress(
+													0.7,
+													"snapshot build dependencies",
+													"modules"
+												);
+											}
+											this.fileSystemInfo.createSnapshot(
+												undefined,
+												files,
+												directories,
+												missing,
+												this.snapshot.buildDependencies,
+												(err, snapshot) => {
+													this.logger.timeEnd("snapshot build dependencies");
+													if (err) return reject(err);
+													if (!snapshot) {
+														return reject(
+															new Error("Unable to snapshot build dependencies")
+														);
+													}
+													this.logger.debug("Captured build dependencies");
+
+													if (this.buildSnapshot) {
+														this.buildSnapshot =
+															this.fileSystemInfo.mergeSnapshots(
+																this.buildSnapshot,
+																snapshot
+															);
+													} else {
+														this.buildSnapshot = snapshot;
+													}
+
+													resolve();
+												}
+											);
+										}
+									);
+								}
+							);
+						}
+					);
+				} else {
+					promise = Promise.resolve();
+				}
+				return promise.then(() => {
+					if (reportProgress) reportProgress(0.8, "serialize pack");
+					this.logger.time("store pack");
+					const updatedBuildDependencies = new Set(this.buildDependencies);
+					for (const dep of newBuildDependencies) {
+						updatedBuildDependencies.add(dep);
+					}
+					const content = new PackContainer(
+						pack,
+						this.version,
+						/** @type {Snapshot} */
+						(this.buildSnapshot),
+						updatedBuildDependencies,
+						/** @type {ResolveResults} */
+						(this.resolveResults),
+						/** @type {Snapshot} */
+						(this.resolveBuildDependenciesSnapshot)
+					);
+					return this.fileSerializer
+						.serialize(content, {
+							filename: `${this.cacheLocation}/index${this._extension}`,
+							extension: `${this._extension}`,
+							logger: this.logger,
+							profile: this.profile
+						})
+						.then(() => {
+							for (const dep of newBuildDependencies) {
+								this.buildDependencies.add(dep);
+							}
+							this.newBuildDependencies.clear();
+							this.logger.timeEnd("store pack");
+							const stats = pack.getContentStats();
+							this.logger.log(
+								"Stored pack (%d items, %d files, %d MiB)",
+								pack.itemInfo.size,
+								stats.count,
+								Math.round(stats.size / 1024 / 1024)
+							);
+						})
+						.catch(err => {
+							this.logger.timeEnd("store pack");
+							this.logger.warn(`Caching failed for pack: ${err}`);
+							this.logger.debug(err.stack);
+						});
+				});
+			})
+			.catch(err => {
+				this.logger.warn(`Caching failed for pack: ${err}`);
+				this.logger.debug(err.stack);
+			}));
+	}
+
+	clear() {
+		this.fileSystemInfo.clear();
+		this.buildDependencies.clear();
+		this.newBuildDependencies.clear();
+		this.resolveBuildDependenciesSnapshot = undefined;
+		this.resolveResults = undefined;
+		this.buildSnapshot = undefined;
+		this.packPromise = undefined;
+	}
+}
+
+module.exports = PackFileCacheStrategy;
diff --git a/lib/cache/ResolverCachePlugin.js b/lib/cache/ResolverCachePlugin.js
new file mode 100644
index 00000000000..013838a507e
--- /dev/null
+++ b/lib/cache/ResolverCachePlugin.js
@@ -0,0 +1,448 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const LazySet = require("../util/LazySet");
+const makeSerializable = require("../util/makeSerializable");
+
+/** @typedef {import("enhanced-resolve").ResolveContext} ResolveContext */
+/** @typedef {import("enhanced-resolve").ResolveOptions} ResolveOptions */
+/** @typedef {import("enhanced-resolve").ResolveRequest} ResolveRequest */
+/** @typedef {import("enhanced-resolve").Resolver} Resolver */
+/** @typedef {import("../CacheFacade").ItemCacheFacade} ItemCacheFacade */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../FileSystemInfo")} FileSystemInfo */
+/** @typedef {import("../FileSystemInfo").Snapshot} Snapshot */
+/** @typedef {import("../FileSystemInfo").SnapshotOptions} SnapshotOptions */
+/** @typedef {import("../ResolverFactory").ResolveOptionsWithDependencyType} ResolveOptionsWithDependencyType */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
+/**
+ * @template T
+ * @typedef {import("tapable").SyncHook} SyncHook
+ */
+
+/**
+ * @template H
+ * @typedef {import("tapable").HookMapInterceptor} HookMapInterceptor
+ */
+
+class CacheEntry {
+	/**
+	 * @param {ResolveRequest} result result
+	 * @param {Snapshot} snapshot snapshot
+	 */
+	constructor(result, snapshot) {
+		this.result = result;
+		this.snapshot = snapshot;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize({ write }) {
+		write(this.result);
+		write(this.snapshot);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize({ read }) {
+		this.result = read();
+		this.snapshot = read();
+	}
+}
+
+makeSerializable(CacheEntry, "webpack/lib/cache/ResolverCachePlugin");
+
+/**
+ * @template T
+ * @param {Set | LazySet} set set to add items to
+ * @param {Set | LazySet | Iterable} otherSet set to add items from
+ * @returns {void}
+ */
+const addAllToSet = (set, otherSet) => {
+	if (set instanceof LazySet) {
+		set.addAll(otherSet);
+	} else {
+		for (const item of otherSet) {
+			set.add(item);
+		}
+	}
+};
+
+/**
+ * @template {object} T
+ * @param {T} object an object
+ * @param {boolean} excludeContext if true, context is not included in string
+ * @returns {string} stringified version
+ */
+const objectToString = (object, excludeContext) => {
+	let str = "";
+	for (const key in object) {
+		if (excludeContext && key === "context") continue;
+		const value = object[key];
+		str +=
+			typeof value === "object" && value !== null
+				? `|${key}=[${objectToString(value, false)}|]`
+				: `|${key}=|${value}`;
+	}
+	return str;
+};
+
+/** @typedef {NonNullable} Yield */
+
+const PLUGIN_NAME = "ResolverCachePlugin";
+
+class ResolverCachePlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		const cache = compiler.getCache(PLUGIN_NAME);
+		/** @type {FileSystemInfo} */
+		let fileSystemInfo;
+		/** @type {SnapshotOptions | undefined} */
+		let snapshotOptions;
+		let realResolves = 0;
+		let cachedResolves = 0;
+		let cacheInvalidResolves = 0;
+		let concurrentResolves = 0;
+		compiler.hooks.thisCompilation.tap(PLUGIN_NAME, compilation => {
+			snapshotOptions = compilation.options.snapshot.resolve;
+			fileSystemInfo = compilation.fileSystemInfo;
+			compilation.hooks.finishModules.tap(PLUGIN_NAME, () => {
+				if (realResolves + cachedResolves > 0) {
+					const logger = compilation.getLogger(`webpack.${PLUGIN_NAME}`);
+					logger.log(
+						`${Math.round(
+							(100 * realResolves) / (realResolves + cachedResolves)
+						)}% really resolved (${realResolves} real resolves with ${cacheInvalidResolves} cached but invalid, ${cachedResolves} cached valid, ${concurrentResolves} concurrent)`
+					);
+					realResolves = 0;
+					cachedResolves = 0;
+					cacheInvalidResolves = 0;
+					concurrentResolves = 0;
+				}
+			});
+		});
+
+		/** @typedef {(err?: Error | null, resolveRequest?: ResolveRequest | null) => void} Callback */
+		/** @typedef {ResolveRequest & { _ResolverCachePluginCacheMiss: true }} ResolveRequestWithCacheMiss */
+
+		/**
+		 * @param {ItemCacheFacade} itemCache cache
+		 * @param {Resolver} resolver the resolver
+		 * @param {ResolveContext} resolveContext context for resolving meta info
+		 * @param {ResolveRequest} request the request info object
+		 * @param {Callback} callback callback function
+		 * @returns {void}
+		 */
+		const doRealResolve = (
+			itemCache,
+			resolver,
+			resolveContext,
+			request,
+			callback
+		) => {
+			realResolves++;
+			const newRequest =
+				/** @type {ResolveRequestWithCacheMiss} */
+				({
+					_ResolverCachePluginCacheMiss: true,
+					...request
+				});
+			/** @type {ResolveContext} */
+			const newResolveContext = {
+				...resolveContext,
+				stack: new Set(),
+				/** @type {LazySet} */
+				missingDependencies: new LazySet(),
+				/** @type {LazySet} */
+				fileDependencies: new LazySet(),
+				/** @type {LazySet} */
+				contextDependencies: new LazySet()
+			};
+			/** @type {ResolveRequest[] | undefined} */
+			let yieldResult;
+			let withYield = false;
+			if (typeof newResolveContext.yield === "function") {
+				yieldResult = [];
+				withYield = true;
+				newResolveContext.yield = obj =>
+					/** @type {ResolveRequest[]} */
+					(yieldResult).push(obj);
+			}
+			/**
+			 * @param {"fileDependencies" | "contextDependencies" | "missingDependencies"} key key
+			 */
+			const propagate = key => {
+				if (resolveContext[key]) {
+					addAllToSet(
+						/** @type {Set} */ (resolveContext[key]),
+						/** @type {Set} */ (newResolveContext[key])
+					);
+				}
+			};
+			const resolveTime = Date.now();
+			resolver.doResolve(
+				resolver.hooks.resolve,
+				newRequest,
+				"Cache miss",
+				newResolveContext,
+				(err, result) => {
+					propagate("fileDependencies");
+					propagate("contextDependencies");
+					propagate("missingDependencies");
+					if (err) return callback(err);
+					const fileDependencies = newResolveContext.fileDependencies;
+					const contextDependencies = newResolveContext.contextDependencies;
+					const missingDependencies = newResolveContext.missingDependencies;
+					fileSystemInfo.createSnapshot(
+						resolveTime,
+						/** @type {Set} */
+						(fileDependencies),
+						/** @type {Set} */
+						(contextDependencies),
+						/** @type {Set} */
+						(missingDependencies),
+						snapshotOptions,
+						(err, snapshot) => {
+							if (err) return callback(err);
+							const resolveResult = withYield ? yieldResult : result;
+							// since we intercept resolve hook
+							// we still can get result in callback
+							if (withYield && result)
+								/** @type {ResolveRequest[]} */ (yieldResult).push(result);
+							if (!snapshot) {
+								if (resolveResult)
+									return callback(
+										null,
+										/** @type {ResolveRequest} */
+										(resolveResult)
+									);
+								return callback();
+							}
+							itemCache.store(
+								new CacheEntry(
+									/** @type {ResolveRequest} */
+									(resolveResult),
+									snapshot
+								),
+								storeErr => {
+									if (storeErr) return callback(storeErr);
+									if (resolveResult)
+										return callback(
+											null,
+											/** @type {ResolveRequest} */
+											(resolveResult)
+										);
+									callback();
+								}
+							);
+						}
+					);
+				}
+			);
+		};
+		compiler.resolverFactory.hooks.resolver.intercept({
+			factory(type, _hook) {
+				/** @typedef {(err?: Error, resolveRequest?: ResolveRequest) => void} ActiveRequest */
+				/** @type {Map} */
+				const activeRequests = new Map();
+				/** @type {Map} */
+				const activeRequestsWithYield = new Map();
+				const hook =
+					/** @type {SyncHook<[Resolver, ResolveOptions, ResolveOptionsWithDependencyType]>} */
+					(_hook);
+				hook.tap(PLUGIN_NAME, (resolver, options, userOptions) => {
+					if (
+						/** @type {ResolveOptions & { cache: boolean }} */
+						(options).cache !== true
+					)
+						return;
+					const optionsIdent = objectToString(userOptions, false);
+					const cacheWithContext =
+						options.cacheWithContext !== undefined
+							? options.cacheWithContext
+							: false;
+					resolver.hooks.resolve.tapAsync(
+						{
+							name: PLUGIN_NAME,
+							stage: -100
+						},
+						(request, resolveContext, callback) => {
+							if (
+								/** @type {ResolveRequestWithCacheMiss} */
+								(request)._ResolverCachePluginCacheMiss ||
+								!fileSystemInfo
+							) {
+								return callback();
+							}
+							const withYield = typeof resolveContext.yield === "function";
+							const identifier = `${type}${
+								withYield ? "|yield" : "|default"
+							}${optionsIdent}${objectToString(request, !cacheWithContext)}`;
+
+							if (withYield) {
+								const activeRequest = activeRequestsWithYield.get(identifier);
+								if (activeRequest) {
+									activeRequest[0].push(callback);
+									activeRequest[1].push(
+										/** @type {Yield} */
+										(resolveContext.yield)
+									);
+									return;
+								}
+							} else {
+								const activeRequest = activeRequests.get(identifier);
+								if (activeRequest) {
+									activeRequest.push(callback);
+									return;
+								}
+							}
+							const itemCache = cache.getItemCache(identifier, null);
+							/** @type {Callback[] | false | undefined} */
+							let callbacks;
+							/** @type {Yield[] | undefined} */
+							let yields;
+
+							/**
+							 * @type {(err?: Error | null, result?: ResolveRequest | ResolveRequest[] | null) => void}
+							 */
+							const done = withYield
+								? (err, result) => {
+										if (callbacks === undefined) {
+											if (err) {
+												callback(err);
+											} else {
+												if (result)
+													for (const r of /** @type {ResolveRequest[]} */ (
+														result
+													)) {
+														/** @type {Yield} */
+														(resolveContext.yield)(r);
+													}
+												callback(null, null);
+											}
+											yields = undefined;
+											callbacks = false;
+										} else {
+											const definedCallbacks =
+												/** @type {Callback[]} */
+												(callbacks);
+
+											if (err) {
+												for (const cb of definedCallbacks) cb(err);
+											} else {
+												for (let i = 0; i < definedCallbacks.length; i++) {
+													const cb = definedCallbacks[i];
+													const yield_ = /** @type {Yield[]} */ (yields)[i];
+													if (result)
+														for (const r of /** @type {ResolveRequest[]} */ (
+															result
+														))
+															yield_(r);
+													cb(null, null);
+												}
+											}
+											activeRequestsWithYield.delete(identifier);
+											yields = undefined;
+											callbacks = false;
+										}
+									}
+								: (err, result) => {
+										if (callbacks === undefined) {
+											callback(err, /** @type {ResolveRequest} */ (result));
+											callbacks = false;
+										} else {
+											for (const callback of /** @type {Callback[]} */ (
+												callbacks
+											)) {
+												callback(err, /** @type {ResolveRequest} */ (result));
+											}
+											activeRequests.delete(identifier);
+											callbacks = false;
+										}
+									};
+							/**
+							 * @param {(Error | null)=} err error if any
+							 * @param {(CacheEntry | null)=} cacheEntry cache entry
+							 * @returns {void}
+							 */
+							const processCacheResult = (err, cacheEntry) => {
+								if (err) return done(err);
+
+								if (cacheEntry) {
+									const { snapshot, result } = cacheEntry;
+									fileSystemInfo.checkSnapshotValid(snapshot, (err, valid) => {
+										if (err || !valid) {
+											cacheInvalidResolves++;
+											return doRealResolve(
+												itemCache,
+												resolver,
+												resolveContext,
+												request,
+												done
+											);
+										}
+										cachedResolves++;
+										if (resolveContext.missingDependencies) {
+											addAllToSet(
+												/** @type {Set} */
+												(resolveContext.missingDependencies),
+												snapshot.getMissingIterable()
+											);
+										}
+										if (resolveContext.fileDependencies) {
+											addAllToSet(
+												/** @type {Set} */
+												(resolveContext.fileDependencies),
+												snapshot.getFileIterable()
+											);
+										}
+										if (resolveContext.contextDependencies) {
+											addAllToSet(
+												/** @type {Set} */
+												(resolveContext.contextDependencies),
+												snapshot.getContextIterable()
+											);
+										}
+										done(null, result);
+									});
+								} else {
+									doRealResolve(
+										itemCache,
+										resolver,
+										resolveContext,
+										request,
+										done
+									);
+								}
+							};
+							itemCache.get(processCacheResult);
+							if (withYield && callbacks === undefined) {
+								callbacks = [callback];
+								yields = [/** @type {Yield} */ (resolveContext.yield)];
+								activeRequestsWithYield.set(identifier, [callbacks, yields]);
+							} else if (callbacks === undefined) {
+								callbacks = [callback];
+								activeRequests.set(identifier, callbacks);
+							}
+						}
+					);
+				});
+				return hook;
+			}
+		});
+	}
+}
+
+module.exports = ResolverCachePlugin;
diff --git a/lib/cache/getLazyHashedEtag.js b/lib/cache/getLazyHashedEtag.js
new file mode 100644
index 00000000000..3007754db74
--- /dev/null
+++ b/lib/cache/getLazyHashedEtag.js
@@ -0,0 +1,82 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { DEFAULTS } = require("../config/defaults");
+const createHash = require("../util/createHash");
+
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {typeof import("../util/Hash")} HashConstructor */
+
+/**
+ * @typedef {object} HashableObject
+ * @property {(hash: Hash) => void} updateHash
+ */
+
+class LazyHashedEtag {
+	/**
+	 * @param {HashableObject} obj object with updateHash method
+	 * @param {string | HashConstructor} hashFunction the hash function to use
+	 */
+	constructor(obj, hashFunction = DEFAULTS.HASH_FUNCTION) {
+		this._obj = obj;
+		this._hash = undefined;
+		this._hashFunction = hashFunction;
+	}
+
+	/**
+	 * @returns {string} hash of object
+	 */
+	toString() {
+		if (this._hash === undefined) {
+			const hash = createHash(this._hashFunction);
+			this._obj.updateHash(hash);
+			this._hash = /** @type {string} */ (hash.digest("base64"));
+		}
+		return this._hash;
+	}
+}
+
+/** @type {Map>} */
+const mapStrings = new Map();
+
+/** @type {WeakMap>} */
+const mapObjects = new WeakMap();
+
+/**
+ * @param {HashableObject} obj object with updateHash method
+ * @param {(string | HashConstructor)=} hashFunction the hash function to use
+ * @returns {LazyHashedEtag} etag
+ */
+const getter = (obj, hashFunction = DEFAULTS.HASH_FUNCTION) => {
+	let innerMap;
+	if (typeof hashFunction === "string") {
+		innerMap = mapStrings.get(hashFunction);
+		if (innerMap === undefined) {
+			const newHash = new LazyHashedEtag(obj, hashFunction);
+			innerMap = new WeakMap();
+			innerMap.set(obj, newHash);
+			mapStrings.set(hashFunction, innerMap);
+			return newHash;
+		}
+	} else {
+		innerMap = mapObjects.get(hashFunction);
+		if (innerMap === undefined) {
+			const newHash = new LazyHashedEtag(obj, hashFunction);
+			innerMap = new WeakMap();
+			innerMap.set(obj, newHash);
+			mapObjects.set(hashFunction, innerMap);
+			return newHash;
+		}
+	}
+	const hash = innerMap.get(obj);
+	if (hash !== undefined) return hash;
+	const newHash = new LazyHashedEtag(obj, hashFunction);
+	innerMap.set(obj, newHash);
+	return newHash;
+};
+
+module.exports = getter;
diff --git a/lib/cache/mergeEtags.js b/lib/cache/mergeEtags.js
new file mode 100644
index 00000000000..9a212f218a4
--- /dev/null
+++ b/lib/cache/mergeEtags.js
@@ -0,0 +1,69 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+/** @typedef {import("../Cache").Etag} Etag */
+
+class MergedEtag {
+	/**
+	 * @param {Etag} a first
+	 * @param {Etag} b second
+	 */
+	constructor(a, b) {
+		this.a = a;
+		this.b = b;
+	}
+
+	toString() {
+		return `${this.a.toString()}|${this.b.toString()}`;
+	}
+}
+
+const dualObjectMap = new WeakMap();
+const objectStringMap = new WeakMap();
+
+/**
+ * @param {Etag} a first
+ * @param {Etag} b second
+ * @returns {Etag} result
+ */
+const mergeEtags = (a, b) => {
+	if (typeof a === "string") {
+		if (typeof b === "string") {
+			return `${a}|${b}`;
+		}
+		const temp = b;
+		b = a;
+		a = temp;
+	} else if (typeof b !== "string") {
+		// both a and b are objects
+		let map = dualObjectMap.get(a);
+		if (map === undefined) {
+			dualObjectMap.set(a, (map = new WeakMap()));
+		}
+		const mergedEtag = map.get(b);
+		if (mergedEtag === undefined) {
+			const newMergedEtag = new MergedEtag(a, b);
+			map.set(b, newMergedEtag);
+			return newMergedEtag;
+		}
+		return mergedEtag;
+	}
+	// a is object, b is string
+	let map = objectStringMap.get(a);
+	if (map === undefined) {
+		objectStringMap.set(a, (map = new Map()));
+	}
+	const mergedEtag = map.get(b);
+	if (mergedEtag === undefined) {
+		const newMergedEtag = new MergedEtag(a, b);
+		map.set(b, newMergedEtag);
+		return newMergedEtag;
+	}
+	return mergedEtag;
+};
+
+module.exports = mergeEtags;
diff --git a/lib/cli.js b/lib/cli.js
new file mode 100644
index 00000000000..168bdef7ad2
--- /dev/null
+++ b/lib/cli.js
@@ -0,0 +1,711 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const path = require("path");
+const webpackSchema = require("../schemas/WebpackOptions.json");
+
+/** @typedef {import("json-schema").JSONSchema4} JSONSchema4 */
+/** @typedef {import("json-schema").JSONSchema6} JSONSchema6 */
+/** @typedef {import("json-schema").JSONSchema7} JSONSchema7 */
+/** @typedef {JSONSchema4 | JSONSchema6 | JSONSchema7} JSONSchema */
+/** @typedef {JSONSchema & { absolutePath: boolean, instanceof: string, cli: { helper?: boolean, exclude?: boolean, description?: string, negatedDescription?: string, resetDescription?: string } }} Schema */
+
+// TODO add originPath to PathItem for better errors
+/**
+ * @typedef {object} PathItem
+ * @property {Schema} schema the part of the schema
+ * @property {string} path the path in the config
+ */
+
+/** @typedef {"unknown-argument" | "unexpected-non-array-in-path" | "unexpected-non-object-in-path" | "multiple-values-unexpected" | "invalid-value"} ProblemType */
+
+/** @typedef {string | number | boolean | RegExp} Value */
+
+/**
+ * @typedef {object} Problem
+ * @property {ProblemType} type
+ * @property {string} path
+ * @property {string} argument
+ * @property {Value=} value
+ * @property {number=} index
+ * @property {string=} expected
+ */
+
+/**
+ * @typedef {object} LocalProblem
+ * @property {ProblemType} type
+ * @property {string} path
+ * @property {string=} expected
+ */
+
+/** @typedef {{ [key: string]: EnumValue }} EnumValueObject */
+/** @typedef {EnumValue[]} EnumValueArray */
+/** @typedef {string | number | boolean | EnumValueObject | EnumValueArray | null} EnumValue */
+
+/**
+ * @typedef {object} ArgumentConfig
+ * @property {string=} description
+ * @property {string=} negatedDescription
+ * @property {string} path
+ * @property {boolean} multiple
+ * @property {"enum" | "string" | "path" | "number" | "boolean" | "RegExp" | "reset"} type
+ * @property {EnumValue[]=} values
+ */
+
+/** @typedef {"string" | "number" | "boolean"} SimpleType */
+
+/**
+ * @typedef {object} Argument
+ * @property {string | undefined} description
+ * @property {SimpleType} simpleType
+ * @property {boolean} multiple
+ * @property {ArgumentConfig[]} configs
+ */
+
+/** @typedef {Record} Flags */
+
+/**
+ * @param {Schema=} schema a json schema to create arguments for (by default webpack schema is used)
+ * @returns {Flags} object of arguments
+ */
+const getArguments = (schema = webpackSchema) => {
+	/** @type {Flags} */
+	const flags = {};
+
+	/**
+	 * @param {string} input input
+	 * @returns {string} result
+	 */
+	const pathToArgumentName = input =>
+		input
+			.replace(/\./g, "-")
+			.replace(/\[\]/g, "")
+			.replace(
+				/(\p{Uppercase_Letter}+|\p{Lowercase_Letter}|\d)(\p{Uppercase_Letter}+)/gu,
+				"$1-$2"
+			)
+			.replace(/-?[^\p{Uppercase_Letter}\p{Lowercase_Letter}\d]+/gu, "-")
+			.toLowerCase();
+
+	/**
+	 * @param {string} path path
+	 * @returns {Schema} schema part
+	 */
+	const getSchemaPart = path => {
+		const newPath = path.split("/");
+
+		let schemaPart = schema;
+
+		for (let i = 1; i < newPath.length; i++) {
+			const inner = schemaPart[/** @type {keyof Schema} */ (newPath[i])];
+
+			if (!inner) {
+				break;
+			}
+
+			schemaPart = inner;
+		}
+
+		return schemaPart;
+	};
+
+	/**
+	 * @param {PathItem[]} path path in the schema
+	 * @returns {string | undefined} description
+	 */
+	const getDescription = path => {
+		for (const { schema } of path) {
+			if (schema.cli) {
+				if (schema.cli.helper) continue;
+				if (schema.cli.description) return schema.cli.description;
+			}
+			if (schema.description) return schema.description;
+		}
+	};
+
+	/**
+	 * @param {PathItem[]} path path in the schema
+	 * @returns {string | undefined} negative description
+	 */
+	const getNegatedDescription = path => {
+		for (const { schema } of path) {
+			if (schema.cli) {
+				if (schema.cli.helper) continue;
+				if (schema.cli.negatedDescription) return schema.cli.negatedDescription;
+			}
+		}
+	};
+
+	/**
+	 * @param {PathItem[]} path path in the schema
+	 * @returns {string | undefined} reset description
+	 */
+	const getResetDescription = path => {
+		for (const { schema } of path) {
+			if (schema.cli) {
+				if (schema.cli.helper) continue;
+				if (schema.cli.resetDescription) return schema.cli.resetDescription;
+			}
+		}
+	};
+
+	/**
+	 * @param {Schema} schemaPart schema
+	 * @returns {Pick | undefined} partial argument config
+	 */
+	const schemaToArgumentConfig = schemaPart => {
+		if (schemaPart.enum) {
+			return {
+				type: "enum",
+				values: schemaPart.enum
+			};
+		}
+		switch (schemaPart.type) {
+			case "number":
+				return {
+					type: "number"
+				};
+			case "string":
+				return {
+					type: schemaPart.absolutePath ? "path" : "string"
+				};
+			case "boolean":
+				return {
+					type: "boolean"
+				};
+		}
+		if (schemaPart.instanceof === "RegExp") {
+			return {
+				type: "RegExp"
+			};
+		}
+		return undefined;
+	};
+
+	/**
+	 * @param {PathItem[]} path path in the schema
+	 * @returns {void}
+	 */
+	const addResetFlag = path => {
+		const schemaPath = path[0].path;
+		const name = pathToArgumentName(`${schemaPath}.reset`);
+		const description =
+			getResetDescription(path) ||
+			`Clear all items provided in '${schemaPath}' configuration. ${getDescription(
+				path
+			)}`;
+		flags[name] = {
+			configs: [
+				{
+					type: "reset",
+					multiple: false,
+					description,
+					path: schemaPath
+				}
+			],
+			description: undefined,
+			simpleType:
+				/** @type {SimpleType} */
+				(/** @type {unknown} */ (undefined)),
+			multiple: /** @type {boolean} */ (/** @type {unknown} */ (undefined))
+		};
+	};
+
+	/**
+	 * @param {PathItem[]} path full path in schema
+	 * @param {boolean} multiple inside of an array
+	 * @returns {number} number of arguments added
+	 */
+	const addFlag = (path, multiple) => {
+		const argConfigBase = schemaToArgumentConfig(path[0].schema);
+		if (!argConfigBase) return 0;
+
+		const negatedDescription = getNegatedDescription(path);
+		const name = pathToArgumentName(path[0].path);
+		/** @type {ArgumentConfig} */
+		const argConfig = {
+			...argConfigBase,
+			multiple,
+			description: getDescription(path),
+			path: path[0].path
+		};
+
+		if (negatedDescription) {
+			argConfig.negatedDescription = negatedDescription;
+		}
+
+		if (!flags[name]) {
+			flags[name] = {
+				configs: [],
+				description: undefined,
+				simpleType:
+					/** @type {SimpleType} */
+					(/** @type {unknown} */ (undefined)),
+				multiple: /** @type {boolean} */ (/** @type {unknown} */ (undefined))
+			};
+		}
+
+		if (
+			flags[name].configs.some(
+				item => JSON.stringify(item) === JSON.stringify(argConfig)
+			)
+		) {
+			return 0;
+		}
+
+		if (
+			flags[name].configs.some(
+				item => item.type === argConfig.type && item.multiple !== multiple
+			)
+		) {
+			if (multiple) {
+				throw new Error(
+					`Conflicting schema for ${path[0].path} with ${argConfig.type} type (array type must be before single item type)`
+				);
+			}
+			return 0;
+		}
+
+		flags[name].configs.push(argConfig);
+
+		return 1;
+	};
+
+	// TODO support `not` and `if/then/else`
+	// TODO support `const`, but we don't use it on our schema
+	/**
+	 * @param {Schema} schemaPart the current schema
+	 * @param {string} schemaPath the current path in the schema
+	 * @param {PathItem[]} path all previous visited schemaParts
+	 * @param {string | null} inArray if inside of an array, the path to the array
+	 * @returns {number} added arguments
+	 */
+	const traverse = (schemaPart, schemaPath = "", path = [], inArray = null) => {
+		while (schemaPart.$ref) {
+			schemaPart = getSchemaPart(schemaPart.$ref);
+		}
+
+		const repetitions = path.filter(({ schema }) => schema === schemaPart);
+		if (
+			repetitions.length >= 2 ||
+			repetitions.some(({ path }) => path === schemaPath)
+		) {
+			return 0;
+		}
+
+		if (schemaPart.cli && schemaPart.cli.exclude) return 0;
+
+		/** @type {PathItem[]} */
+		const fullPath = [{ schema: schemaPart, path: schemaPath }, ...path];
+
+		let addedArguments = 0;
+
+		addedArguments += addFlag(fullPath, Boolean(inArray));
+
+		if (schemaPart.type === "object") {
+			if (schemaPart.properties) {
+				for (const property of Object.keys(schemaPart.properties)) {
+					addedArguments += traverse(
+						/** @type {Schema} */
+						(schemaPart.properties[property]),
+						schemaPath ? `${schemaPath}.${property}` : property,
+						fullPath,
+						inArray
+					);
+				}
+			}
+
+			return addedArguments;
+		}
+
+		if (schemaPart.type === "array") {
+			if (inArray) {
+				return 0;
+			}
+			if (Array.isArray(schemaPart.items)) {
+				const i = 0;
+				for (const item of schemaPart.items) {
+					addedArguments += traverse(
+						/** @type {Schema} */
+						(item),
+						`${schemaPath}.${i}`,
+						fullPath,
+						schemaPath
+					);
+				}
+
+				return addedArguments;
+			}
+
+			addedArguments += traverse(
+				/** @type {Schema} */
+				(schemaPart.items),
+				`${schemaPath}[]`,
+				fullPath,
+				schemaPath
+			);
+
+			if (addedArguments > 0) {
+				addResetFlag(fullPath);
+				addedArguments++;
+			}
+
+			return addedArguments;
+		}
+
+		const maybeOf = schemaPart.oneOf || schemaPart.anyOf || schemaPart.allOf;
+
+		if (maybeOf) {
+			const items = maybeOf;
+
+			for (let i = 0; i < items.length; i++) {
+				addedArguments += traverse(
+					/** @type {Schema} */
+					(items[i]),
+					schemaPath,
+					fullPath,
+					inArray
+				);
+			}
+
+			return addedArguments;
+		}
+
+		return addedArguments;
+	};
+
+	traverse(schema);
+
+	// Summarize flags
+	for (const name of Object.keys(flags)) {
+		/** @type {Argument} */
+		const argument = flags[name];
+		argument.description = argument.configs.reduce((desc, { description }) => {
+			if (!desc) return description;
+			if (!description) return desc;
+			if (desc.includes(description)) return desc;
+			return `${desc} ${description}`;
+		}, /** @type {string | undefined} */ (undefined));
+		argument.simpleType =
+			/** @type {SimpleType} */
+			(
+				argument.configs.reduce((t, argConfig) => {
+					/** @type {SimpleType} */
+					let type = "string";
+					switch (argConfig.type) {
+						case "number":
+							type = "number";
+							break;
+						case "reset":
+						case "boolean":
+							type = "boolean";
+							break;
+						case "enum": {
+							const values =
+								/** @type {NonNullable} */
+								(argConfig.values);
+
+							if (values.every(v => typeof v === "boolean")) type = "boolean";
+							if (values.every(v => typeof v === "number")) type = "number";
+							break;
+						}
+					}
+					if (t === undefined) return type;
+					return t === type ? t : "string";
+				}, /** @type {SimpleType | undefined} */ (undefined))
+			);
+		argument.multiple = argument.configs.some(c => c.multiple);
+	}
+
+	return flags;
+};
+
+const cliAddedItems = new WeakMap();
+
+/** @typedef {string | number} Property */
+
+/**
+ * @param {Configuration} config configuration
+ * @param {string} schemaPath path in the config
+ * @param {number | undefined} index index of value when multiple values are provided, otherwise undefined
+ * @returns {{ problem?: LocalProblem, object?: TODO, property?: Property, value?: EXPECTED_OBJECT | EXPECTED_ANY[] }} problem or object with property and value
+ */
+const getObjectAndProperty = (config, schemaPath, index = 0) => {
+	if (!schemaPath) return { value: config };
+	const parts = schemaPath.split(".");
+	const property = /** @type {string} */ (parts.pop());
+	let current = config;
+	let i = 0;
+	for (const part of parts) {
+		const isArray = part.endsWith("[]");
+		const name = isArray ? part.slice(0, -2) : part;
+		let value = current[name];
+		if (isArray) {
+			if (value === undefined) {
+				value = {};
+				current[name] = [...Array.from({ length: index }), value];
+				cliAddedItems.set(current[name], index + 1);
+			} else if (!Array.isArray(value)) {
+				return {
+					problem: {
+						type: "unexpected-non-array-in-path",
+						path: parts.slice(0, i).join(".")
+					}
+				};
+			} else {
+				let addedItems = cliAddedItems.get(value) || 0;
+				while (addedItems <= index) {
+					value.push(undefined);
+					addedItems++;
+				}
+				cliAddedItems.set(value, addedItems);
+				const x = value.length - addedItems + index;
+				if (value[x] === undefined) {
+					value[x] = {};
+				} else if (value[x] === null || typeof value[x] !== "object") {
+					return {
+						problem: {
+							type: "unexpected-non-object-in-path",
+							path: parts.slice(0, i).join(".")
+						}
+					};
+				}
+				value = value[x];
+			}
+		} else if (value === undefined) {
+			value = current[name] = {};
+		} else if (value === null || typeof value !== "object") {
+			return {
+				problem: {
+					type: "unexpected-non-object-in-path",
+					path: parts.slice(0, i).join(".")
+				}
+			};
+		}
+		current = value;
+		i++;
+	}
+	const value = current[property];
+	if (property.endsWith("[]")) {
+		const name = property.slice(0, -2);
+		const value = current[name];
+		if (value === undefined) {
+			current[name] = [...Array.from({ length: index }), undefined];
+			cliAddedItems.set(current[name], index + 1);
+			return { object: current[name], property: index, value: undefined };
+		} else if (!Array.isArray(value)) {
+			current[name] = [value, ...Array.from({ length: index }), undefined];
+			cliAddedItems.set(current[name], index + 1);
+			return { object: current[name], property: index + 1, value: undefined };
+		}
+		let addedItems = cliAddedItems.get(value) || 0;
+		while (addedItems <= index) {
+			value.push(undefined);
+			addedItems++;
+		}
+		cliAddedItems.set(value, addedItems);
+		const x = value.length - addedItems + index;
+		if (value[x] === undefined) {
+			value[x] = {};
+		} else if (value[x] === null || typeof value[x] !== "object") {
+			return {
+				problem: {
+					type: "unexpected-non-object-in-path",
+					path: schemaPath
+				}
+			};
+		}
+		return {
+			object: value,
+			property: x,
+			value: value[x]
+		};
+	}
+	return { object: current, property, value };
+};
+
+/**
+ * @param {Configuration} config configuration
+ * @param {string} schemaPath path in the config
+ * @param {ParsedValue} value parsed value
+ * @param {number | undefined} index index of value when multiple values are provided, otherwise undefined
+ * @returns {LocalProblem | null} problem or null for success
+ */
+const setValue = (config, schemaPath, value, index) => {
+	const { problem, object, property } = getObjectAndProperty(
+		config,
+		schemaPath,
+		index
+	);
+	if (problem) return problem;
+	object[/** @type {Property} */ (property)] = value;
+	return null;
+};
+
+/**
+ * @param {ArgumentConfig} argConfig processing instructions
+ * @param {Configuration} config configuration
+ * @param {Value} value the value
+ * @param {number | undefined} index the index if multiple values provided
+ * @returns {LocalProblem | null} a problem if any
+ */
+const processArgumentConfig = (argConfig, config, value, index) => {
+	if (index !== undefined && !argConfig.multiple) {
+		return {
+			type: "multiple-values-unexpected",
+			path: argConfig.path
+		};
+	}
+	const parsed = parseValueForArgumentConfig(argConfig, value);
+	if (parsed === undefined) {
+		return {
+			type: "invalid-value",
+			path: argConfig.path,
+			expected: getExpectedValue(argConfig)
+		};
+	}
+	const problem = setValue(config, argConfig.path, parsed, index);
+	if (problem) return problem;
+	return null;
+};
+
+/**
+ * @param {ArgumentConfig} argConfig processing instructions
+ * @returns {string | undefined} expected message
+ */
+const getExpectedValue = argConfig => {
+	switch (argConfig.type) {
+		case "boolean":
+			return "true | false";
+		case "RegExp":
+			return "regular expression (example: /ab?c*/)";
+		case "enum":
+			return /** @type {NonNullable} */ (
+				argConfig.values
+			)
+				.map(v => `${v}`)
+				.join(" | ");
+		case "reset":
+			return "true (will reset the previous value to an empty array)";
+		default:
+			return argConfig.type;
+	}
+};
+
+/** @typedef {null | string | number | boolean | RegExp | EnumValue | []} ParsedValue */
+
+/**
+ * @param {ArgumentConfig} argConfig processing instructions
+ * @param {Value} value the value
+ * @returns {ParsedValue | undefined} parsed value
+ */
+const parseValueForArgumentConfig = (argConfig, value) => {
+	switch (argConfig.type) {
+		case "string":
+			if (typeof value === "string") {
+				return value;
+			}
+			break;
+		case "path":
+			if (typeof value === "string") {
+				return path.resolve(value);
+			}
+			break;
+		case "number":
+			if (typeof value === "number") return value;
+			if (typeof value === "string" && /^[+-]?\d*(\.\d*)[eE]\d+$/) {
+				const n = Number(value);
+				if (!Number.isNaN(n)) return n;
+			}
+			break;
+		case "boolean":
+			if (typeof value === "boolean") return value;
+			if (value === "true") return true;
+			if (value === "false") return false;
+			break;
+		case "RegExp":
+			if (value instanceof RegExp) return value;
+			if (typeof value === "string") {
+				// cspell:word yugi
+				const match = /^\/(.*)\/([yugi]*)$/.exec(value);
+				if (match && !/[^\\]\//.test(match[1]))
+					return new RegExp(match[1], match[2]);
+			}
+			break;
+		case "enum": {
+			const values =
+				/** @type {EnumValue[]} */
+				(argConfig.values);
+			if (values.includes(/** @type {Exclude} */ (value)))
+				return value;
+			for (const item of values) {
+				if (`${item}` === value) return item;
+			}
+			break;
+		}
+		case "reset":
+			if (value === true) return [];
+			break;
+	}
+};
+
+/** @typedef {TODO} Configuration */
+
+/**
+ * @param {Flags} args object of arguments
+ * @param {Configuration} config configuration
+ * @param {Record} values object with values
+ * @returns {Problem[] | null} problems or null for success
+ */
+const processArguments = (args, config, values) => {
+	/** @type {Problem[]} */
+	const problems = [];
+	for (const key of Object.keys(values)) {
+		const arg = args[key];
+		if (!arg) {
+			problems.push({
+				type: "unknown-argument",
+				path: "",
+				argument: key
+			});
+			continue;
+		}
+		/**
+		 * @param {Value} value value
+		 * @param {number | undefined} i index
+		 */
+		const processValue = (value, i) => {
+			const currentProblems = [];
+			for (const argConfig of arg.configs) {
+				const problem = processArgumentConfig(argConfig, config, value, i);
+				if (!problem) {
+					return;
+				}
+				currentProblems.push({
+					...problem,
+					argument: key,
+					value,
+					index: i
+				});
+			}
+			problems.push(...currentProblems);
+		};
+		const value = values[key];
+		if (Array.isArray(value)) {
+			for (let i = 0; i < value.length; i++) {
+				processValue(value[i], i);
+			}
+		} else {
+			processValue(value, undefined);
+		}
+	}
+	if (problems.length === 0) return null;
+	return problems;
+};
+
+module.exports.getArguments = getArguments;
+module.exports.processArguments = processArguments;
diff --git a/lib/compareLocations.js b/lib/compareLocations.js
deleted file mode 100644
index 3840eb893ad..00000000000
--- a/lib/compareLocations.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-/** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
-
-// TODO webpack 5 remove string type from a and b
-/**
- * Compare two locations
- * @param {string|DependencyLocation} a A location node
- * @param {string|DependencyLocation} b A location node
- * @returns {-1|0|1} sorting comparator value
- */
-module.exports = (a, b) => {
-	if (typeof a === "string") {
-		if (typeof b === "string") {
-			if (a < b) return -1;
-			if (a > b) return 1;
-			return 0;
-		} else if (typeof b === "object") {
-			return 1;
-		} else {
-			return 0;
-		}
-	} else if (typeof a === "object") {
-		if (typeof b === "string") {
-			return -1;
-		} else if (typeof b === "object") {
-			if ("start" in a && "start" in b) {
-				const ap = a.start;
-				const bp = b.start;
-				if (ap.line < bp.line) return -1;
-				if (ap.line > bp.line) return 1;
-				if (ap.column < bp.column) return -1;
-				if (ap.column > bp.column) return 1;
-			}
-			if ("name" in a && "name" in b) {
-				if (a.name < b.name) return -1;
-				if (a.name > b.name) return 1;
-			}
-			if ("index" in a && "index" in b) {
-				if (a.index < b.index) return -1;
-				if (a.index > b.index) return 1;
-			}
-			return 0;
-		} else {
-			return 0;
-		}
-	}
-};
diff --git a/lib/config/browserslistTargetHandler.js b/lib/config/browserslistTargetHandler.js
new file mode 100644
index 00000000000..51b0896ab0c
--- /dev/null
+++ b/lib/config/browserslistTargetHandler.js
@@ -0,0 +1,363 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Sergey Melyukov @smelukov
+*/
+
+"use strict";
+
+const browserslist = require("browserslist");
+const path = require("path");
+
+/** @typedef {import("./target").ApiTargetProperties} ApiTargetProperties */
+/** @typedef {import("./target").EcmaTargetProperties} EcmaTargetProperties */
+/** @typedef {import("./target").PlatformTargetProperties} PlatformTargetProperties */
+
+// [[C:]/path/to/config][:env]
+const inputRx = /^(?:((?:[A-Z]:)?[/\\].*?))?(?::(.+?))?$/i;
+
+/**
+ * @typedef {object} BrowserslistHandlerConfig
+ * @property {string=} configPath
+ * @property {string=} env
+ * @property {string=} query
+ */
+
+/**
+ * @param {string | null | undefined} input input string
+ * @param {string} context the context directory
+ * @returns {BrowserslistHandlerConfig} config
+ */
+const parse = (input, context) => {
+	if (!input) {
+		return {};
+	}
+
+	if (path.isAbsolute(input)) {
+		const [, configPath, env] = inputRx.exec(input) || [];
+		return { configPath, env };
+	}
+
+	const config = browserslist.findConfig(context);
+
+	if (config && Object.keys(config).includes(input)) {
+		return { env: input };
+	}
+
+	return { query: input };
+};
+
+/**
+ * @param {string | null | undefined} input input string
+ * @param {string} context the context directory
+ * @returns {string[] | undefined} selected browsers
+ */
+const load = (input, context) => {
+	const { configPath, env, query } = parse(input, context);
+
+	// if a query is specified, then use it, else
+	// if a path to a config is specified then load it, else
+	// find a nearest config
+	const config =
+		query ||
+		(configPath
+			? browserslist.loadConfig({
+					config: configPath,
+					env
+				})
+			: browserslist.loadConfig({ path: context, env }));
+
+	if (!config) return;
+	return browserslist(config);
+};
+
+/**
+ * @param {string[]} browsers supported browsers list
+ * @returns {EcmaTargetProperties & PlatformTargetProperties & ApiTargetProperties} target properties
+ */
+const resolve = browsers => {
+	/**
+	 * Checks all against a version number
+	 * @param {Record} versions first supported version
+	 * @returns {boolean} true if supports
+	 */
+	const rawChecker = versions =>
+		browsers.every(v => {
+			const [name, parsedVersion] = v.split(" ");
+			if (!name) return false;
+			const requiredVersion = versions[name];
+			if (!requiredVersion) return false;
+			const [parsedMajor, parserMinor] =
+				// safari TP supports all features for normal safari
+				parsedVersion === "TP"
+					? [Infinity, Infinity]
+					: parsedVersion.includes("-")
+						? parsedVersion.split("-")[0].split(".")
+						: parsedVersion.split(".");
+			if (typeof requiredVersion === "number") {
+				return Number(parsedMajor) >= requiredVersion;
+			}
+			return requiredVersion[0] === Number(parsedMajor)
+				? Number(parserMinor) >= requiredVersion[1]
+				: Number(parsedMajor) > requiredVersion[0];
+		});
+	const anyNode = browsers.some(b => b.startsWith("node "));
+	const anyBrowser = browsers.some(b => /^(?!node)/.test(b));
+	const browserProperty = !anyBrowser ? false : anyNode ? null : true;
+	const nodeProperty = !anyNode ? false : anyBrowser ? null : true;
+	// Internet Explorer Mobile, Blackberry browser and Opera Mini are very old browsers, they do not support new features
+	const es6DynamicImport = rawChecker({
+		/* eslint-disable camelcase */
+		chrome: 63,
+		and_chr: 63,
+		edge: 79,
+		firefox: 67,
+		and_ff: 67,
+		// ie: Not supported
+		opera: 50,
+		op_mob: 46,
+		safari: [11, 1],
+		ios_saf: [11, 3],
+		samsung: [8, 2],
+		android: 63,
+		and_qq: [10, 4],
+		baidu: [13, 18],
+		and_uc: [15, 5],
+		kaios: [3, 0],
+		node: [12, 17]
+		/* eslint-enable camelcase */
+	});
+
+	return {
+		/* eslint-disable camelcase */
+		const: rawChecker({
+			chrome: 49,
+			and_chr: 49,
+			edge: 12,
+			// Prior to Firefox 13, const is implemented, but re-assignment is not failing.
+			// Prior to Firefox 46, a TypeError was thrown on redeclaration instead of a SyntaxError.
+			firefox: 36,
+			and_ff: 36,
+			// Not supported in for-in and for-of loops
+			// ie: Not supported
+			opera: 36,
+			op_mob: 36,
+			safari: [10, 0],
+			ios_saf: [10, 0],
+			// Before 5.0 supported correctly in strict mode, otherwise supported without block scope
+			samsung: [5, 0],
+			android: 37,
+			and_qq: [10, 4],
+			// Supported correctly in strict mode, otherwise supported without block scope
+			baidu: [13, 18],
+			and_uc: [12, 12],
+			kaios: [2, 5],
+			node: [6, 0]
+		}),
+		arrowFunction: rawChecker({
+			chrome: 45,
+			and_chr: 45,
+			edge: 12,
+			// The initial implementation of arrow functions in Firefox made them automatically strict. This has been changed as of Firefox 24. The use of 'use strict'; is now required.
+			// Prior to Firefox 39, a line terminator (\\n) was incorrectly allowed after arrow function arguments. This has been fixed to conform to the ES2015 specification and code like () \\n => {} will now throw a SyntaxError in this and later versions.
+			firefox: 39,
+			and_ff: 39,
+			// ie: Not supported,
+			opera: 32,
+			op_mob: 32,
+			safari: 10,
+			ios_saf: 10,
+			samsung: [5, 0],
+			android: 45,
+			and_qq: [10, 4],
+			baidu: [7, 12],
+			and_uc: [12, 12],
+			kaios: [2, 5],
+			node: [6, 0]
+		}),
+		forOf: rawChecker({
+			chrome: 38,
+			and_chr: 38,
+			edge: 12,
+			// Prior to Firefox 51, using the for...of loop construct with the const keyword threw a SyntaxError ("missing = in const declaration").
+			firefox: 51,
+			and_ff: 51,
+			// ie: Not supported,
+			opera: 25,
+			op_mob: 25,
+			safari: 7,
+			ios_saf: 7,
+			samsung: [3, 0],
+			android: 38,
+			// and_qq: Unknown support
+			// baidu: Unknown support
+			// and_uc: Unknown support
+			kaios: [3, 0],
+			node: [0, 12]
+		}),
+		destructuring: rawChecker({
+			chrome: 49,
+			and_chr: 49,
+			edge: 14,
+			firefox: 41,
+			and_ff: 41,
+			// ie: Not supported,
+			opera: 36,
+			op_mob: 36,
+			safari: 8,
+			ios_saf: 8,
+			samsung: [5, 0],
+			android: 49,
+			// and_qq: Unknown support
+			// baidu: Unknown support
+			// and_uc: Unknown support
+			kaios: [2, 5],
+			node: [6, 0]
+		}),
+		bigIntLiteral: rawChecker({
+			chrome: 67,
+			and_chr: 67,
+			edge: 79,
+			firefox: 68,
+			and_ff: 68,
+			// ie: Not supported,
+			opera: 54,
+			op_mob: 48,
+			safari: 14,
+			ios_saf: 14,
+			samsung: [9, 2],
+			android: 67,
+			and_qq: [13, 1],
+			baidu: [13, 18],
+			and_uc: [15, 5],
+			kaios: [3, 0],
+			node: [10, 4]
+		}),
+		// Support syntax `import` and `export` and no limitations and bugs on Node.js
+		// Not include `export * as namespace`
+		module: rawChecker({
+			chrome: 61,
+			and_chr: 61,
+			edge: 16,
+			firefox: 60,
+			and_ff: 60,
+			// ie: Not supported,
+			opera: 48,
+			op_mob: 45,
+			safari: [10, 1],
+			ios_saf: [10, 3],
+			samsung: [8, 0],
+			android: 61,
+			and_qq: [10, 4],
+			baidu: [13, 18],
+			and_uc: [15, 5],
+			kaios: [3, 0],
+			node: [12, 17]
+		}),
+		dynamicImport: es6DynamicImport,
+		dynamicImportInWorker: es6DynamicImport && !anyNode,
+		// browserslist does not have info about globalThis
+		// so this is based on mdn-browser-compat-data
+		globalThis: rawChecker({
+			chrome: 71,
+			and_chr: 71,
+			edge: 79,
+			firefox: 65,
+			and_ff: 65,
+			// ie: Not supported,
+			opera: 58,
+			op_mob: 50,
+			safari: [12, 1],
+			ios_saf: [12, 2],
+			samsung: [10, 1],
+			android: 71,
+			// and_qq: Unknown support
+			// baidu: Unknown support
+			// and_uc: Unknown support
+			kaios: [3, 0],
+			node: 12
+		}),
+		optionalChaining: rawChecker({
+			chrome: 80,
+			and_chr: 80,
+			edge: 80,
+			firefox: 74,
+			and_ff: 79,
+			// ie: Not supported,
+			opera: 67,
+			op_mob: 64,
+			safari: [13, 1],
+			ios_saf: [13, 4],
+			samsung: 13,
+			android: 80,
+			// and_qq: Not supported
+			// baidu: Not supported
+			// and_uc: Not supported
+			kaios: [3, 0],
+			node: 14
+		}),
+		templateLiteral: rawChecker({
+			chrome: 41,
+			and_chr: 41,
+			edge: 13,
+			firefox: 34,
+			and_ff: 34,
+			// ie: Not supported,
+			opera: 29,
+			op_mob: 64,
+			safari: [9, 1],
+			ios_saf: 9,
+			samsung: 4,
+			android: 41,
+			and_qq: [10, 4],
+			baidu: [7, 12],
+			and_uc: [12, 12],
+			kaios: [2, 5],
+			node: 4
+		}),
+		asyncFunction: rawChecker({
+			chrome: 55,
+			and_chr: 55,
+			edge: 15,
+			firefox: 52,
+			and_ff: 52,
+			// ie: Not supported,
+			opera: 42,
+			op_mob: 42,
+			safari: 11,
+			ios_saf: 11,
+			samsung: [6, 2],
+			android: 55,
+			and_qq: [13, 1],
+			baidu: [13, 18],
+			and_uc: [15, 5],
+			kaios: 3,
+			node: [7, 6]
+		}),
+		/* eslint-enable camelcase */
+		browser: browserProperty,
+		electron: false,
+		node: nodeProperty,
+		nwjs: false,
+		web: browserProperty,
+		webworker: false,
+
+		document: browserProperty,
+		fetchWasm: browserProperty,
+		global: nodeProperty,
+		importScripts: false,
+		importScriptsInWorker: true,
+		nodeBuiltins: nodeProperty,
+		nodePrefixForCoreModules:
+			nodeProperty &&
+			!browsers.some(b => b.startsWith("node 15")) &&
+			rawChecker({
+				node: [14, 18]
+			}),
+		require: nodeProperty
+	};
+};
+
+module.exports = {
+	resolve,
+	load
+};
diff --git a/lib/config/defaults.js b/lib/config/defaults.js
new file mode 100644
index 00000000000..40ef46ebd94
--- /dev/null
+++ b/lib/config/defaults.js
@@ -0,0 +1,1744 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const fs = require("fs");
+const path = require("path");
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_ESM,
+	JAVASCRIPT_MODULE_TYPE_DYNAMIC,
+	JSON_MODULE_TYPE,
+	WEBASSEMBLY_MODULE_TYPE_ASYNC,
+	WEBASSEMBLY_MODULE_TYPE_SYNC,
+	ASSET_MODULE_TYPE,
+	ASSET_MODULE_TYPE_INLINE,
+	ASSET_MODULE_TYPE_RESOURCE,
+	CSS_MODULE_TYPE_AUTO,
+	CSS_MODULE_TYPE,
+	CSS_MODULE_TYPE_MODULE,
+	CSS_MODULE_TYPE_GLOBAL
+} = require("../ModuleTypeConstants");
+const Template = require("../Template");
+const { cleverMerge } = require("../util/cleverMerge");
+const {
+	getTargetsProperties,
+	getTargetProperties,
+	getDefaultTarget
+} = require("./target");
+
+/** @typedef {import("../../declarations/WebpackOptions").CacheOptions} CacheOptions */
+/** @typedef {import("../../declarations/WebpackOptions").CacheOptionsNormalized} CacheOptionsNormalized */
+/** @typedef {import("../../declarations/WebpackOptions").Context} Context */
+/** @typedef {import("../../declarations/WebpackOptions").CssGeneratorOptions} CssGeneratorOptions */
+/** @typedef {import("../../declarations/WebpackOptions").CssParserOptions} CssParserOptions */
+/** @typedef {import("../../declarations/WebpackOptions").EntryDescription} EntryDescription */
+/** @typedef {import("../../declarations/WebpackOptions").EntryNormalized} Entry */
+/** @typedef {import("../../declarations/WebpackOptions").EntryStaticNormalized} EntryStaticNormalized */
+/** @typedef {import("../../declarations/WebpackOptions").Environment} Environment */
+/** @typedef {import("../../declarations/WebpackOptions").Experiments} Experiments */
+/** @typedef {import("../../declarations/WebpackOptions").ExperimentsNormalized} ExperimentsNormalized */
+/** @typedef {import("../../declarations/WebpackOptions").ExternalsPresets} ExternalsPresets */
+/** @typedef {import("../../declarations/WebpackOptions").ExternalsType} ExternalsType */
+/** @typedef {import("../../declarations/WebpackOptions").FileCacheOptions} FileCacheOptions */
+/** @typedef {import("../../declarations/WebpackOptions").GeneratorOptionsByModuleTypeKnown} GeneratorOptionsByModuleTypeKnown */
+/** @typedef {import("../../declarations/WebpackOptions").InfrastructureLogging} InfrastructureLogging */
+/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
+/** @typedef {import("../../declarations/WebpackOptions").JsonGeneratorOptions} JsonGeneratorOptions */
+/** @typedef {import("../../declarations/WebpackOptions").Library} Library */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryName} LibraryName */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryOptions} LibraryOptions */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryType} LibraryType */
+/** @typedef {import("../../declarations/WebpackOptions").Loader} Loader */
+/** @typedef {import("../../declarations/WebpackOptions").Mode} Mode */
+/** @typedef {import("../../declarations/WebpackOptions").ModuleOptionsNormalized} ModuleOptions */
+/** @typedef {import("../../declarations/WebpackOptions").Node} WebpackNode */
+/** @typedef {import("../../declarations/WebpackOptions").Optimization} Optimization */
+/** @typedef {import("../../declarations/WebpackOptions").OptimizationSplitChunksOptions} OptimizationSplitChunksOptions */
+/** @typedef {import("../../declarations/WebpackOptions").OutputNormalized} Output */
+/** @typedef {import("../../declarations/WebpackOptions").ParserOptionsByModuleTypeKnown} ParserOptionsByModuleTypeKnown */
+/** @typedef {import("../../declarations/WebpackOptions").Performance} Performance */
+/** @typedef {import("../../declarations/WebpackOptions").ResolveOptions} ResolveOptions */
+/** @typedef {import("../../declarations/WebpackOptions").RuleSetRules} RuleSetRules */
+/** @typedef {import("../../declarations/WebpackOptions").SnapshotOptions} SnapshotOptions */
+/** @typedef {import("../../declarations/WebpackOptions").Target} Target */
+/** @typedef {import("../../declarations/WebpackOptions").WebpackOptions} WebpackOptions */
+/** @typedef {import("../../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptionsNormalized */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("./target").PlatformTargetProperties} PlatformTargetProperties */
+/** @typedef {import("./target").TargetProperties} TargetProperties */
+
+/**
+ * @typedef {object} ResolvedOptions
+ * @property {PlatformTargetProperties | false} platform - platform target properties
+ */
+
+const NODE_MODULES_REGEXP = /[\\/]node_modules[\\/]/i;
+const DEFAULT_CACHE_NAME = "default";
+const DEFAULTS = {
+	// TODO webpack 6 - use xxhash64
+	HASH_FUNCTION: "md4"
+};
+
+/**
+ * Sets a constant default value when undefined
+ * @template T
+ * @template {keyof T} P
+ * @param {T} obj an object
+ * @param {P} prop a property of this object
+ * @param {T[P]} value a default value of the property
+ * @returns {void}
+ */
+const D = (obj, prop, value) => {
+	if (obj[prop] === undefined) {
+		obj[prop] = value;
+	}
+};
+
+/**
+ * Sets a dynamic default value when undefined, by calling the factory function
+ * @template T
+ * @template {keyof T} P
+ * @param {T} obj an object
+ * @param {P} prop a property of this object
+ * @param {() => T[P]} factory a default value factory for the property
+ * @returns {void}
+ */
+const F = (obj, prop, factory) => {
+	if (obj[prop] === undefined) {
+		obj[prop] = factory();
+	}
+};
+
+/**
+ * Sets a dynamic default value when undefined, by calling the factory function.
+ * factory must return an array or undefined
+ * When the current value is already an array an contains "..." it's replaced with
+ * the result of the factory function
+ * @template T
+ * @template {keyof T} P
+ * @param {T} obj an object
+ * @param {P} prop a property of this object
+ * @param {() => T[P]} factory a default value factory for the property
+ * @returns {void}
+ */
+const A = (obj, prop, factory) => {
+	const value = obj[prop];
+	if (value === undefined) {
+		obj[prop] = factory();
+	} else if (Array.isArray(value)) {
+		/** @type {EXPECTED_ANY[] | undefined} */
+		let newArray;
+		for (let i = 0; i < value.length; i++) {
+			const item = value[i];
+			if (item === "...") {
+				if (newArray === undefined) {
+					newArray = value.slice(0, i);
+					obj[prop] = /** @type {T[P]} */ (/** @type {unknown} */ (newArray));
+				}
+				const items = /** @type {EXPECTED_ANY[]} */ (
+					/** @type {unknown} */ (factory())
+				);
+				if (items !== undefined) {
+					for (const item of items) {
+						newArray.push(item);
+					}
+				}
+			} else if (newArray !== undefined) {
+				newArray.push(item);
+			}
+		}
+	}
+};
+
+/**
+ * @param {WebpackOptionsNormalized} options options to be modified
+ * @returns {void}
+ */
+const applyWebpackOptionsBaseDefaults = options => {
+	F(options, "context", () => process.cwd());
+	applyInfrastructureLoggingDefaults(options.infrastructureLogging);
+};
+
+/**
+ * @param {WebpackOptionsNormalized} options options to be modified
+ * @param {number=} compilerIndex index of compiler
+ * @returns {ResolvedOptions} Resolved options after apply defaults
+ */
+const applyWebpackOptionsDefaults = (options, compilerIndex) => {
+	F(options, "context", () => process.cwd());
+	F(options, "target", () =>
+		getDefaultTarget(/** @type {string} */ (options.context))
+	);
+
+	const { mode, name, target } = options;
+
+	const targetProperties =
+		target === false
+			? /** @type {false} */ (false)
+			: typeof target === "string"
+				? getTargetProperties(target, /** @type {Context} */ (options.context))
+				: getTargetsProperties(
+						/** @type {string[]} */ (target),
+						/** @type {Context} */ (options.context)
+					);
+
+	const development = mode === "development";
+	const production = mode === "production" || !mode;
+
+	if (typeof options.entry !== "function") {
+		for (const key of Object.keys(options.entry)) {
+			F(
+				options.entry[key],
+				"import",
+				() => /** @type {[string]} */ (["./src"])
+			);
+		}
+	}
+
+	F(options, "devtool", () => (development ? "eval" : false));
+	D(options, "watch", false);
+	D(options, "profile", false);
+	D(options, "parallelism", 100);
+	D(options, "recordsInputPath", false);
+	D(options, "recordsOutputPath", false);
+
+	applyExperimentsDefaults(options.experiments, {
+		production,
+		development,
+		targetProperties
+	});
+
+	const futureDefaults =
+		/** @type {NonNullable} */
+		(options.experiments.futureDefaults);
+
+	F(options, "cache", () =>
+		development ? { type: /** @type {"memory"} */ ("memory") } : false
+	);
+	applyCacheDefaults(options.cache, {
+		name: name || DEFAULT_CACHE_NAME,
+		mode: mode || "production",
+		development,
+		cacheUnaffected: options.experiments.cacheUnaffected,
+		futureDefaults,
+		compilerIndex
+	});
+	const cache = Boolean(options.cache);
+
+	applySnapshotDefaults(options.snapshot, {
+		production,
+		futureDefaults
+	});
+
+	applyOutputDefaults(options.output, {
+		context: /** @type {Context} */ (options.context),
+		targetProperties,
+		isAffectedByBrowserslist:
+			target === undefined ||
+			(typeof target === "string" && target.startsWith("browserslist")) ||
+			(Array.isArray(target) &&
+				target.some(target => target.startsWith("browserslist"))),
+		outputModule:
+			/** @type {NonNullable} */
+			(options.experiments.outputModule),
+		development,
+		entry: options.entry,
+		futureDefaults,
+		asyncWebAssembly:
+			/** @type {NonNullable} */
+			(options.experiments.asyncWebAssembly)
+	});
+
+	applyModuleDefaults(options.module, {
+		cache,
+		syncWebAssembly:
+			/** @type {NonNullable} */
+			(options.experiments.syncWebAssembly),
+		asyncWebAssembly:
+			/** @type {NonNullable} */
+			(options.experiments.asyncWebAssembly),
+		css:
+			/** @type {NonNullable} */
+			(options.experiments.css),
+		futureDefaults,
+		isNode: targetProperties && targetProperties.node === true,
+		uniqueName: /** @type {string} */ (options.output.uniqueName),
+		targetProperties,
+		mode: options.mode
+	});
+
+	applyExternalsPresetsDefaults(options.externalsPresets, {
+		targetProperties,
+		buildHttp: Boolean(options.experiments.buildHttp)
+	});
+
+	applyLoaderDefaults(
+		/** @type {NonNullable} */ (
+			options.loader
+		),
+		{ targetProperties, environment: options.output.environment }
+	);
+
+	F(options, "externalsType", () => {
+		const validExternalTypes = require("../../schemas/WebpackOptions.json")
+			.definitions.ExternalsType.enum;
+		return options.output.library &&
+			validExternalTypes.includes(options.output.library.type)
+			? /** @type {ExternalsType} */ (options.output.library.type)
+			: options.output.module
+				? "module-import"
+				: "var";
+	});
+
+	applyNodeDefaults(options.node, {
+		futureDefaults:
+			/** @type {NonNullable} */
+			(options.experiments.futureDefaults),
+		outputModule:
+			/** @type {NonNullable} */
+			(options.output.module),
+		targetProperties
+	});
+
+	F(options, "performance", () =>
+		production &&
+		targetProperties &&
+		(targetProperties.browser || targetProperties.browser === null)
+			? {}
+			: false
+	);
+	applyPerformanceDefaults(
+		/** @type {NonNullable} */
+		(options.performance),
+		{
+			production
+		}
+	);
+
+	applyOptimizationDefaults(options.optimization, {
+		development,
+		production,
+		css:
+			/** @type {NonNullable} */
+			(options.experiments.css),
+		records: Boolean(options.recordsInputPath || options.recordsOutputPath)
+	});
+
+	options.resolve = cleverMerge(
+		getResolveDefaults({
+			cache,
+			context: /** @type {Context} */ (options.context),
+			targetProperties,
+			mode: /** @type {Mode} */ (options.mode),
+			css:
+				/** @type {NonNullable} */
+				(options.experiments.css)
+		}),
+		options.resolve
+	);
+
+	options.resolveLoader = cleverMerge(
+		getResolveLoaderDefaults({ cache }),
+		options.resolveLoader
+	);
+
+	return {
+		platform:
+			targetProperties === false
+				? targetProperties
+				: {
+						web: targetProperties.web,
+						browser: targetProperties.browser,
+						webworker: targetProperties.webworker,
+						node: targetProperties.node,
+						nwjs: targetProperties.nwjs,
+						electron: targetProperties.electron
+					}
+	};
+};
+
+/**
+ * @param {ExperimentsNormalized} experiments options
+ * @param {object} options options
+ * @param {boolean} options.production is production
+ * @param {boolean} options.development is development mode
+ * @param {TargetProperties | false} options.targetProperties target properties
+ * @returns {void}
+ */
+const applyExperimentsDefaults = (
+	experiments,
+	{ production, development, targetProperties }
+) => {
+	D(experiments, "futureDefaults", false);
+	D(experiments, "backCompat", !experiments.futureDefaults);
+	D(experiments, "syncWebAssembly", false);
+	D(experiments, "asyncWebAssembly", experiments.futureDefaults);
+	D(experiments, "outputModule", false);
+	D(experiments, "layers", false);
+	D(experiments, "lazyCompilation", undefined);
+	D(experiments, "buildHttp", undefined);
+	D(experiments, "cacheUnaffected", experiments.futureDefaults);
+	F(experiments, "css", () => (experiments.futureDefaults ? true : undefined));
+
+	// TODO webpack 6: remove this. topLevelAwait should be enabled by default
+	let shouldEnableTopLevelAwait = true;
+	if (typeof experiments.topLevelAwait === "boolean") {
+		shouldEnableTopLevelAwait = experiments.topLevelAwait;
+	}
+	D(experiments, "topLevelAwait", shouldEnableTopLevelAwait);
+
+	if (typeof experiments.buildHttp === "object") {
+		D(experiments.buildHttp, "frozen", production);
+		D(experiments.buildHttp, "upgrade", false);
+	}
+};
+
+/**
+ * @param {CacheOptionsNormalized} cache options
+ * @param {object} options options
+ * @param {string} options.name name
+ * @param {Mode} options.mode mode
+ * @param {boolean} options.futureDefaults is future defaults enabled
+ * @param {boolean} options.development is development mode
+ * @param {number=} options.compilerIndex index of compiler
+ * @param {Experiments["cacheUnaffected"]} options.cacheUnaffected the cacheUnaffected experiment is enabled
+ * @returns {void}
+ */
+const applyCacheDefaults = (
+	cache,
+	{ name, mode, development, cacheUnaffected, compilerIndex, futureDefaults }
+) => {
+	if (cache === false) return;
+	switch (cache.type) {
+		case "filesystem":
+			F(cache, "name", () =>
+				compilerIndex !== undefined
+					? `${`${name}-${mode}`}__compiler${compilerIndex + 1}__`
+					: `${name}-${mode}`
+			);
+			D(cache, "version", "");
+			F(cache, "cacheDirectory", () => {
+				const cwd = process.cwd();
+				/** @type {string | undefined} */
+				let dir = cwd;
+				for (;;) {
+					try {
+						if (fs.statSync(path.join(dir, "package.json")).isFile()) break;
+						// eslint-disable-next-line no-empty
+					} catch (_err) {}
+					const parent = path.dirname(dir);
+					if (dir === parent) {
+						dir = undefined;
+						break;
+					}
+					dir = parent;
+				}
+				if (!dir) {
+					return path.resolve(cwd, ".cache/webpack");
+				} else if (process.versions.pnp === "1") {
+					return path.resolve(dir, ".pnp/.cache/webpack");
+				} else if (process.versions.pnp === "3") {
+					return path.resolve(dir, ".yarn/.cache/webpack");
+				}
+				return path.resolve(dir, "node_modules/.cache/webpack");
+			});
+			F(cache, "cacheLocation", () =>
+				path.resolve(
+					/** @type {NonNullable} */
+					(cache.cacheDirectory),
+					/** @type {NonNullable} */ (cache.name)
+				)
+			);
+			D(cache, "hashAlgorithm", futureDefaults ? "xxhash64" : "md4");
+			D(cache, "store", "pack");
+			D(cache, "compression", false);
+			D(cache, "profile", false);
+			D(cache, "idleTimeout", 60000);
+			D(cache, "idleTimeoutForInitialStore", 5000);
+			D(cache, "idleTimeoutAfterLargeChanges", 1000);
+			D(cache, "maxMemoryGenerations", development ? 5 : Infinity);
+			D(cache, "maxAge", 1000 * 60 * 60 * 24 * 60); // 1 month
+			D(cache, "allowCollectingMemory", development);
+			D(cache, "memoryCacheUnaffected", development && cacheUnaffected);
+			D(cache, "readonly", false);
+			D(
+				/** @type {NonNullable} */
+				(cache.buildDependencies),
+				"defaultWebpack",
+				[path.resolve(__dirname, "..") + path.sep]
+			);
+			break;
+		case "memory":
+			D(cache, "maxGenerations", Infinity);
+			D(cache, "cacheUnaffected", development && cacheUnaffected);
+			break;
+	}
+};
+
+/**
+ * @param {SnapshotOptions} snapshot options
+ * @param {object} options options
+ * @param {boolean} options.production is production
+ * @param {boolean} options.futureDefaults is future defaults enabled
+ * @returns {void}
+ */
+const applySnapshotDefaults = (snapshot, { production, futureDefaults }) => {
+	if (futureDefaults) {
+		F(snapshot, "managedPaths", () =>
+			process.versions.pnp === "3"
+				? [
+						/^(.+?(?:[\\/]\.yarn[\\/]unplugged[\\/][^\\/]+)?[\\/]node_modules[\\/])/
+					]
+				: [/^(.+?[\\/]node_modules[\\/])/]
+		);
+		F(snapshot, "immutablePaths", () =>
+			process.versions.pnp === "3"
+				? [/^(.+?[\\/]cache[\\/][^\\/]+\.zip[\\/]node_modules[\\/])/]
+				: []
+		);
+	} else {
+		A(snapshot, "managedPaths", () => {
+			if (process.versions.pnp === "3") {
+				const match =
+					/^(.+?)[\\/]cache[\\/]watchpack-npm-[^\\/]+\.zip[\\/]node_modules[\\/]/.exec(
+						require.resolve("watchpack")
+					);
+				if (match) {
+					return [path.resolve(match[1], "unplugged")];
+				}
+			} else {
+				const match = /^(.+?[\\/]node_modules[\\/])/.exec(
+					require.resolve("watchpack")
+				);
+				if (match) {
+					return [match[1]];
+				}
+			}
+			return [];
+		});
+		A(snapshot, "immutablePaths", () => {
+			if (process.versions.pnp === "1") {
+				const match =
+					/^(.+?[\\/]v4)[\\/]npm-watchpack-[^\\/]+-[\da-f]{40}[\\/]node_modules[\\/]/.exec(
+						require.resolve("watchpack")
+					);
+				if (match) {
+					return [match[1]];
+				}
+			} else if (process.versions.pnp === "3") {
+				const match =
+					/^(.+?)[\\/]watchpack-npm-[^\\/]+\.zip[\\/]node_modules[\\/]/.exec(
+						require.resolve("watchpack")
+					);
+				if (match) {
+					return [match[1]];
+				}
+			}
+			return [];
+		});
+	}
+	F(snapshot, "unmanagedPaths", () => []);
+	F(snapshot, "resolveBuildDependencies", () => ({
+		timestamp: true,
+		hash: true
+	}));
+	F(snapshot, "buildDependencies", () => ({ timestamp: true, hash: true }));
+	F(snapshot, "module", () =>
+		production ? { timestamp: true, hash: true } : { timestamp: true }
+	);
+	F(snapshot, "resolve", () =>
+		production ? { timestamp: true, hash: true } : { timestamp: true }
+	);
+};
+
+/**
+ * @param {JavascriptParserOptions} parserOptions parser options
+ * @param {object} options options
+ * @param {boolean} options.futureDefaults is future defaults enabled
+ * @param {boolean} options.isNode is node target platform
+ * @returns {void}
+ */
+const applyJavascriptParserOptionsDefaults = (
+	parserOptions,
+	{ futureDefaults, isNode }
+) => {
+	D(parserOptions, "unknownContextRequest", ".");
+	D(parserOptions, "unknownContextRegExp", false);
+	D(parserOptions, "unknownContextRecursive", true);
+	D(parserOptions, "unknownContextCritical", true);
+	D(parserOptions, "exprContextRequest", ".");
+	D(parserOptions, "exprContextRegExp", false);
+	D(parserOptions, "exprContextRecursive", true);
+	D(parserOptions, "exprContextCritical", true);
+	D(parserOptions, "wrappedContextRegExp", /.*/);
+	D(parserOptions, "wrappedContextRecursive", true);
+	D(parserOptions, "wrappedContextCritical", false);
+	D(parserOptions, "strictThisContextOnImports", false);
+	D(parserOptions, "importMeta", true);
+	D(parserOptions, "dynamicImportMode", "lazy");
+	D(parserOptions, "dynamicImportPrefetch", false);
+	D(parserOptions, "dynamicImportPreload", false);
+	D(parserOptions, "dynamicImportFetchPriority", false);
+	D(parserOptions, "createRequire", isNode);
+	if (futureDefaults) D(parserOptions, "exportsPresence", "error");
+};
+
+/**
+ * @param {JsonGeneratorOptions} generatorOptions generator options
+ * @returns {void}
+ */
+const applyJsonGeneratorOptionsDefaults = generatorOptions => {
+	D(generatorOptions, "JSONParse", true);
+};
+
+/**
+ * @param {CssGeneratorOptions} generatorOptions generator options
+ * @param {object} options options
+ * @param {TargetProperties | false} options.targetProperties target properties
+ * @returns {void}
+ */
+const applyCssGeneratorOptionsDefaults = (
+	generatorOptions,
+	{ targetProperties }
+) => {
+	D(
+		generatorOptions,
+		"exportsOnly",
+		!targetProperties || targetProperties.document === false
+	);
+	D(generatorOptions, "esModule", true);
+};
+
+/**
+ * @param {ModuleOptions} module options
+ * @param {object} options options
+ * @param {boolean} options.cache is caching enabled
+ * @param {boolean} options.syncWebAssembly is syncWebAssembly enabled
+ * @param {boolean} options.asyncWebAssembly is asyncWebAssembly enabled
+ * @param {boolean} options.css is css enabled
+ * @param {boolean} options.futureDefaults is future defaults enabled
+ * @param {string} options.uniqueName the unique name
+ * @param {boolean} options.isNode is node target platform
+ * @param {TargetProperties | false} options.targetProperties target properties
+ * @param {Mode | undefined} options.mode mode
+ * @returns {void}
+ */
+const applyModuleDefaults = (
+	module,
+	{
+		cache,
+		syncWebAssembly,
+		asyncWebAssembly,
+		css,
+		futureDefaults,
+		isNode,
+		uniqueName,
+		targetProperties,
+		mode
+	}
+) => {
+	if (cache) {
+		D(
+			module,
+			"unsafeCache",
+			/**
+			 * @param {Module} module module
+			 * @returns {boolean} true, if we want to cache the module
+			 */
+			module => {
+				const name = module.nameForCondition();
+				if (!name) {
+					return false;
+				}
+				return NODE_MODULES_REGEXP.test(name);
+			}
+		);
+	} else {
+		D(module, "unsafeCache", false);
+	}
+
+	F(module.parser, ASSET_MODULE_TYPE, () => ({}));
+	F(
+		/** @type {NonNullable} */
+		(module.parser[ASSET_MODULE_TYPE]),
+		"dataUrlCondition",
+		() => ({})
+	);
+	if (
+		typeof (
+			/** @type {NonNullable} */
+			(module.parser[ASSET_MODULE_TYPE]).dataUrlCondition
+		) === "object"
+	) {
+		D(
+			/** @type {NonNullable} */
+			(module.parser[ASSET_MODULE_TYPE]).dataUrlCondition,
+			"maxSize",
+			8096
+		);
+	}
+
+	F(module.parser, "javascript", () => ({}));
+	F(module.parser, JSON_MODULE_TYPE, () => ({}));
+	D(
+		/** @type {NonNullable} */
+		(module.parser[JSON_MODULE_TYPE]),
+		"exportsDepth",
+		mode === "development" ? 1 : Infinity
+	);
+
+	applyJavascriptParserOptionsDefaults(
+		/** @type {NonNullable} */
+		(module.parser.javascript),
+		{
+			futureDefaults,
+			isNode
+		}
+	);
+
+	F(module.generator, "json", () => ({}));
+	applyJsonGeneratorOptionsDefaults(
+		/** @type {NonNullable} */
+		(module.generator.json)
+	);
+
+	if (css) {
+		F(module.parser, CSS_MODULE_TYPE, () => ({}));
+
+		D(
+			/** @type {NonNullable} */
+			(module.parser[CSS_MODULE_TYPE]),
+			"import",
+			true
+		);
+		D(
+			/** @type {NonNullable} */
+			(module.parser[CSS_MODULE_TYPE]),
+			"url",
+			true
+		);
+		D(
+			/** @type {NonNullable} */
+			(module.parser[CSS_MODULE_TYPE]),
+			"namedExports",
+			true
+		);
+
+		F(module.generator, CSS_MODULE_TYPE, () => ({}));
+
+		applyCssGeneratorOptionsDefaults(
+			/** @type {NonNullable} */
+			(module.generator[CSS_MODULE_TYPE]),
+			{ targetProperties }
+		);
+
+		const localIdentName =
+			uniqueName.length > 0 ? "[uniqueName]-[id]-[local]" : "[id]-[local]";
+
+		F(module.generator, CSS_MODULE_TYPE_AUTO, () => ({}));
+		D(
+			/** @type {NonNullable} */
+			(module.generator[CSS_MODULE_TYPE_AUTO]),
+			"localIdentName",
+			localIdentName
+		);
+		D(
+			/** @type {NonNullable} */
+			(module.generator[CSS_MODULE_TYPE_AUTO]),
+			"exportsConvention",
+			"as-is"
+		);
+
+		F(module.generator, CSS_MODULE_TYPE_MODULE, () => ({}));
+		D(
+			/** @type {NonNullable} */
+			(module.generator[CSS_MODULE_TYPE_MODULE]),
+			"localIdentName",
+			localIdentName
+		);
+		D(
+			/** @type {NonNullable} */
+			(module.generator[CSS_MODULE_TYPE_MODULE]),
+			"exportsConvention",
+			"as-is"
+		);
+
+		F(module.generator, CSS_MODULE_TYPE_GLOBAL, () => ({}));
+		D(
+			/** @type {NonNullable} */
+			(module.generator[CSS_MODULE_TYPE_GLOBAL]),
+			"localIdentName",
+			localIdentName
+		);
+		D(
+			/** @type {NonNullable} */
+			(module.generator[CSS_MODULE_TYPE_GLOBAL]),
+			"exportsConvention",
+			"as-is"
+		);
+	}
+
+	A(module, "defaultRules", () => {
+		const esm = {
+			type: JAVASCRIPT_MODULE_TYPE_ESM,
+			resolve: {
+				byDependency: {
+					esm: {
+						fullySpecified: true
+					}
+				}
+			}
+		};
+		const commonjs = {
+			type: JAVASCRIPT_MODULE_TYPE_DYNAMIC
+		};
+		/** @type {RuleSetRules} */
+		const rules = [
+			{
+				mimetype: "application/node",
+				type: JAVASCRIPT_MODULE_TYPE_AUTO
+			},
+			{
+				test: /\.json$/i,
+				type: JSON_MODULE_TYPE
+			},
+			{
+				mimetype: "application/json",
+				type: JSON_MODULE_TYPE
+			},
+			{
+				test: /\.mjs$/i,
+				...esm
+			},
+			{
+				test: /\.js$/i,
+				descriptionData: {
+					type: "module"
+				},
+				...esm
+			},
+			{
+				test: /\.cjs$/i,
+				...commonjs
+			},
+			{
+				test: /\.js$/i,
+				descriptionData: {
+					type: "commonjs"
+				},
+				...commonjs
+			},
+			{
+				mimetype: {
+					or: ["text/javascript", "application/javascript"]
+				},
+				...esm
+			}
+		];
+		if (asyncWebAssembly) {
+			const wasm = {
+				type: WEBASSEMBLY_MODULE_TYPE_ASYNC,
+				rules: [
+					{
+						descriptionData: {
+							type: "module"
+						},
+						resolve: {
+							fullySpecified: true
+						}
+					}
+				]
+			};
+			rules.push({
+				test: /\.wasm$/i,
+				...wasm
+			});
+			rules.push({
+				mimetype: "application/wasm",
+				...wasm
+			});
+		} else if (syncWebAssembly) {
+			const wasm = {
+				type: WEBASSEMBLY_MODULE_TYPE_SYNC,
+				rules: [
+					{
+						descriptionData: {
+							type: "module"
+						},
+						resolve: {
+							fullySpecified: true
+						}
+					}
+				]
+			};
+			rules.push({
+				test: /\.wasm$/i,
+				...wasm
+			});
+			rules.push({
+				mimetype: "application/wasm",
+				...wasm
+			});
+		}
+		if (css) {
+			const resolve = {
+				fullySpecified: true,
+				preferRelative: true
+			};
+			rules.push({
+				test: /\.css$/i,
+				type: CSS_MODULE_TYPE_AUTO,
+				resolve
+			});
+			rules.push({
+				mimetype: "text/css+module",
+				type: CSS_MODULE_TYPE_MODULE,
+				resolve
+			});
+			rules.push({
+				mimetype: "text/css",
+				type: CSS_MODULE_TYPE,
+				resolve
+			});
+		}
+		rules.push(
+			{
+				dependency: "url",
+				oneOf: [
+					{
+						scheme: /^data$/,
+						type: ASSET_MODULE_TYPE_INLINE
+					},
+					{
+						type: ASSET_MODULE_TYPE_RESOURCE
+					}
+				]
+			},
+			{
+				assert: { type: JSON_MODULE_TYPE },
+				type: JSON_MODULE_TYPE
+			},
+			{
+				with: { type: JSON_MODULE_TYPE },
+				type: JSON_MODULE_TYPE
+			}
+		);
+		return rules;
+	});
+};
+
+/**
+ * @param {Output} output options
+ * @param {object} options options
+ * @param {string} options.context context
+ * @param {TargetProperties | false} options.targetProperties target properties
+ * @param {boolean} options.isAffectedByBrowserslist is affected by browserslist
+ * @param {boolean} options.outputModule is outputModule experiment enabled
+ * @param {boolean} options.development is development mode
+ * @param {Entry} options.entry entry option
+ * @param {boolean} options.futureDefaults is future defaults enabled
+ * @param {boolean} options.asyncWebAssembly is asyncWebAssembly enabled
+ * @returns {void}
+ */
+const applyOutputDefaults = (
+	output,
+	{
+		context,
+		targetProperties: tp,
+		isAffectedByBrowserslist,
+		outputModule,
+		development,
+		entry,
+		futureDefaults,
+		asyncWebAssembly
+	}
+) => {
+	/**
+	 * @param {Library=} library the library option
+	 * @returns {string} a readable library name
+	 */
+	const getLibraryName = library => {
+		const libraryName =
+			typeof library === "object" &&
+			library &&
+			!Array.isArray(library) &&
+			"type" in library
+				? library.name
+				: /** @type {LibraryName} */ (library);
+		if (Array.isArray(libraryName)) {
+			return libraryName.join(".");
+		} else if (typeof libraryName === "object") {
+			return getLibraryName(libraryName.root);
+		} else if (typeof libraryName === "string") {
+			return libraryName;
+		}
+		return "";
+	};
+
+	F(output, "uniqueName", () => {
+		const libraryName = getLibraryName(output.library).replace(
+			/^\[(\\*[\w:]+\\*)\](\.)|(\.)\[(\\*[\w:]+\\*)\](?=\.|$)|\[(\\*[\w:]+\\*)\]/g,
+			(m, a, d1, d2, b, c) => {
+				const content = a || b || c;
+				return content.startsWith("\\") && content.endsWith("\\")
+					? `${d2 || ""}[${content.slice(1, -1)}]${d1 || ""}`
+					: "";
+			}
+		);
+		if (libraryName) return libraryName;
+		const pkgPath = path.resolve(context, "package.json");
+		try {
+			const packageInfo = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
+			return packageInfo.name || "";
+		} catch (err) {
+			if (/** @type {Error & { code: string }} */ (err).code !== "ENOENT") {
+				/** @type {Error & { code: string }} */
+				(err).message +=
+					`\nwhile determining default 'output.uniqueName' from 'name' in ${pkgPath}`;
+				throw err;
+			}
+			return "";
+		}
+	});
+
+	F(output, "module", () => Boolean(outputModule));
+
+	const environment = /** @type {Environment} */ (output.environment);
+	/**
+	 * @param {boolean | undefined} v value
+	 * @returns {boolean} true, when v is truthy or undefined
+	 */
+	const optimistic = v => v || v === undefined;
+	/**
+	 * @param {boolean | undefined} v value
+	 * @param {boolean | undefined} c condition
+	 * @returns {boolean | undefined} true, when v is truthy or undefined, or c is truthy
+	 */
+	const conditionallyOptimistic = (v, c) => (v === undefined && c) || v;
+
+	F(
+		environment,
+		"globalThis",
+		() => /** @type {boolean | undefined} */ (tp && tp.globalThis)
+	);
+	F(
+		environment,
+		"bigIntLiteral",
+		() =>
+			tp && optimistic(/** @type {boolean | undefined} */ (tp.bigIntLiteral))
+	);
+	F(
+		environment,
+		"const",
+		() => tp && optimistic(/** @type {boolean | undefined} */ (tp.const))
+	);
+	F(
+		environment,
+		"arrowFunction",
+		() =>
+			tp && optimistic(/** @type {boolean | undefined} */ (tp.arrowFunction))
+	);
+	F(
+		environment,
+		"asyncFunction",
+		() =>
+			tp && optimistic(/** @type {boolean | undefined} */ (tp.asyncFunction))
+	);
+	F(
+		environment,
+		"forOf",
+		() => tp && optimistic(/** @type {boolean | undefined} */ (tp.forOf))
+	);
+	F(
+		environment,
+		"destructuring",
+		() =>
+			tp && optimistic(/** @type {boolean | undefined} */ (tp.destructuring))
+	);
+	F(
+		environment,
+		"optionalChaining",
+		() =>
+			tp && optimistic(/** @type {boolean | undefined} */ (tp.optionalChaining))
+	);
+	F(
+		environment,
+		"nodePrefixForCoreModules",
+		() =>
+			tp &&
+			optimistic(
+				/** @type {boolean | undefined} */ (tp.nodePrefixForCoreModules)
+			)
+	);
+	F(
+		environment,
+		"templateLiteral",
+		() =>
+			tp && optimistic(/** @type {boolean | undefined} */ (tp.templateLiteral))
+	);
+	F(environment, "dynamicImport", () =>
+		conditionallyOptimistic(
+			/** @type {boolean | undefined} */ (tp && tp.dynamicImport),
+			output.module
+		)
+	);
+	F(environment, "dynamicImportInWorker", () =>
+		conditionallyOptimistic(
+			/** @type {boolean | undefined} */ (tp && tp.dynamicImportInWorker),
+			output.module
+		)
+	);
+	F(environment, "module", () =>
+		conditionallyOptimistic(
+			/** @type {boolean | undefined} */ (tp && tp.module),
+			output.module
+		)
+	);
+	F(
+		environment,
+		"document",
+		() => tp && optimistic(/** @type {boolean | undefined} */ (tp.document))
+	);
+
+	D(output, "filename", output.module ? "[name].mjs" : "[name].js");
+	F(output, "iife", () => !output.module);
+	D(output, "importFunctionName", "import");
+	D(output, "importMetaName", "import.meta");
+	F(output, "chunkFilename", () => {
+		const filename =
+			/** @type {NonNullable} */
+			(output.filename);
+		if (typeof filename !== "function") {
+			const hasName = filename.includes("[name]");
+			const hasId = filename.includes("[id]");
+			const hasChunkHash = filename.includes("[chunkhash]");
+			const hasContentHash = filename.includes("[contenthash]");
+			// Anything changing depending on chunk is fine
+			if (hasChunkHash || hasContentHash || hasName || hasId) return filename;
+			// Otherwise prefix "[id]." in front of the basename to make it changing
+			return filename.replace(/(^|\/)([^/]*(?:\?|$))/, "$1[id].$2");
+		}
+		return output.module ? "[id].mjs" : "[id].js";
+	});
+	F(output, "cssFilename", () => {
+		const filename =
+			/** @type {NonNullable} */
+			(output.filename);
+		if (typeof filename !== "function") {
+			return filename.replace(/\.[mc]?js(\?|$)/, ".css$1");
+		}
+		return "[id].css";
+	});
+	F(output, "cssChunkFilename", () => {
+		const chunkFilename =
+			/** @type {NonNullable} */
+			(output.chunkFilename);
+		if (typeof chunkFilename !== "function") {
+			return chunkFilename.replace(/\.[mc]?js(\?|$)/, ".css$1");
+		}
+		return "[id].css";
+	});
+	D(output, "assetModuleFilename", "[hash][ext][query]");
+	D(output, "webassemblyModuleFilename", "[hash].module.wasm");
+	D(output, "compareBeforeEmit", true);
+	D(output, "charset", !futureDefaults);
+	const uniqueNameId = Template.toIdentifier(
+		/** @type {NonNullable} */ (output.uniqueName)
+	);
+	F(output, "hotUpdateGlobal", () => `webpackHotUpdate${uniqueNameId}`);
+	F(output, "chunkLoadingGlobal", () => `webpackChunk${uniqueNameId}`);
+	F(output, "globalObject", () => {
+		if (tp) {
+			if (tp.global) return "global";
+			if (tp.globalThis) return "globalThis";
+		}
+		return "self";
+	});
+	F(output, "chunkFormat", () => {
+		if (tp) {
+			const helpMessage = isAffectedByBrowserslist
+				? "Make sure that your 'browserslist' includes only platforms that support these features or select an appropriate 'target' to allow selecting a chunk format by default. Alternatively specify the 'output.chunkFormat' directly."
+				: "Select an appropriate 'target' to allow selecting one by default, or specify the 'output.chunkFormat' directly.";
+			if (output.module) {
+				if (environment.dynamicImport) return "module";
+				if (tp.document) return "array-push";
+				throw new Error(
+					"For the selected environment is no default ESM chunk format available:\n" +
+						"ESM exports can be chosen when 'import()' is available.\n" +
+						`JSONP Array push can be chosen when 'document' is available.\n${
+							helpMessage
+						}`
+				);
+			} else {
+				if (tp.document) return "array-push";
+				if (tp.require) return "commonjs";
+				if (tp.nodeBuiltins) return "commonjs";
+				if (tp.importScripts) return "array-push";
+				throw new Error(
+					"For the selected environment is no default script chunk format available:\n" +
+						"JSONP Array push can be chosen when 'document' or 'importScripts' is available.\n" +
+						`CommonJs exports can be chosen when 'require' or node builtins are available.\n${
+							helpMessage
+						}`
+				);
+			}
+		}
+		throw new Error(
+			"Chunk format can't be selected by default when no target is specified"
+		);
+	});
+	D(output, "asyncChunks", true);
+	F(output, "chunkLoading", () => {
+		if (tp) {
+			switch (output.chunkFormat) {
+				case "array-push":
+					if (tp.document) return "jsonp";
+					if (tp.importScripts) return "import-scripts";
+					break;
+				case "commonjs":
+					if (tp.require) return "require";
+					if (tp.nodeBuiltins) return "async-node";
+					break;
+				case "module":
+					if (environment.dynamicImport) return "import";
+					break;
+			}
+			if (
+				(tp.require === null ||
+					tp.nodeBuiltins === null ||
+					tp.document === null ||
+					tp.importScripts === null) &&
+				output.module &&
+				environment.dynamicImport
+			) {
+				return "universal";
+			}
+		}
+		return false;
+	});
+	F(output, "workerChunkLoading", () => {
+		if (tp) {
+			switch (output.chunkFormat) {
+				case "array-push":
+					if (tp.importScriptsInWorker) return "import-scripts";
+					break;
+				case "commonjs":
+					if (tp.require) return "require";
+					if (tp.nodeBuiltins) return "async-node";
+					break;
+				case "module":
+					if (environment.dynamicImportInWorker) return "import";
+					break;
+			}
+			if (
+				(tp.require === null ||
+					tp.nodeBuiltins === null ||
+					tp.importScriptsInWorker === null) &&
+				output.module &&
+				environment.dynamicImport
+			) {
+				return "universal";
+			}
+		}
+		return false;
+	});
+	F(output, "wasmLoading", () => {
+		if (tp) {
+			if (tp.fetchWasm) return "fetch";
+			if (tp.nodeBuiltins) return "async-node";
+			if (
+				(tp.nodeBuiltins === null || tp.fetchWasm === null) &&
+				asyncWebAssembly &&
+				output.module &&
+				environment.dynamicImport
+			) {
+				return "universal";
+			}
+		}
+		return false;
+	});
+	F(output, "workerWasmLoading", () => output.wasmLoading);
+	F(output, "devtoolNamespace", () => output.uniqueName);
+	if (output.library) {
+		F(output.library, "type", () => (output.module ? "module" : "var"));
+	}
+	F(output, "path", () => path.join(process.cwd(), "dist"));
+	F(output, "pathinfo", () => development);
+	D(output, "sourceMapFilename", "[file].map[query]");
+	D(
+		output,
+		"hotUpdateChunkFilename",
+		`[id].[fullhash].hot-update.${output.module ? "mjs" : "js"}`
+	);
+	D(output, "hotUpdateMainFilename", "[runtime].[fullhash].hot-update.json");
+	D(output, "crossOriginLoading", false);
+	F(output, "scriptType", () => (output.module ? "module" : false));
+	D(
+		output,
+		"publicPath",
+		(tp && (tp.document || tp.importScripts)) || output.scriptType === "module"
+			? "auto"
+			: ""
+	);
+	D(output, "workerPublicPath", "");
+	D(output, "chunkLoadTimeout", 120000);
+	F(output, "hashFunction", () => {
+		if (futureDefaults) {
+			DEFAULTS.HASH_FUNCTION = "xxhash64";
+			return "xxhash64";
+		}
+
+		return "md4";
+	});
+	D(output, "hashDigest", "hex");
+	D(output, "hashDigestLength", futureDefaults ? 16 : 20);
+	D(output, "strictModuleErrorHandling", false);
+	D(output, "strictModuleExceptionHandling", false);
+
+	const { trustedTypes } = output;
+	if (trustedTypes) {
+		F(
+			trustedTypes,
+			"policyName",
+			() =>
+				/** @type {NonNullable} */
+				(output.uniqueName).replace(/[^a-zA-Z0-9\-#=_/@.%]+/g, "_") || "webpack"
+		);
+		D(trustedTypes, "onPolicyCreationFailure", "stop");
+	}
+
+	/**
+	 * @param {(entryDescription: EntryDescription) => void} fn iterator
+	 * @returns {void}
+	 */
+	const forEachEntry = fn => {
+		for (const name of Object.keys(entry)) {
+			fn(/** @type {{[k: string] : EntryDescription}} */ (entry)[name]);
+		}
+	};
+	A(output, "enabledLibraryTypes", () => {
+		/** @type {LibraryType[]} */
+		const enabledLibraryTypes = [];
+		if (output.library) {
+			enabledLibraryTypes.push(output.library.type);
+		}
+		forEachEntry(desc => {
+			if (desc.library) {
+				enabledLibraryTypes.push(desc.library.type);
+			}
+		});
+		return enabledLibraryTypes;
+	});
+
+	A(output, "enabledChunkLoadingTypes", () => {
+		const enabledChunkLoadingTypes = new Set();
+		if (output.chunkLoading) {
+			enabledChunkLoadingTypes.add(output.chunkLoading);
+		}
+		if (output.workerChunkLoading) {
+			enabledChunkLoadingTypes.add(output.workerChunkLoading);
+		}
+		forEachEntry(desc => {
+			if (desc.chunkLoading) {
+				enabledChunkLoadingTypes.add(desc.chunkLoading);
+			}
+		});
+		return Array.from(enabledChunkLoadingTypes);
+	});
+
+	A(output, "enabledWasmLoadingTypes", () => {
+		const enabledWasmLoadingTypes = new Set();
+		if (output.wasmLoading) {
+			enabledWasmLoadingTypes.add(output.wasmLoading);
+		}
+		if (output.workerWasmLoading) {
+			enabledWasmLoadingTypes.add(output.workerWasmLoading);
+		}
+		forEachEntry(desc => {
+			if (desc.wasmLoading) {
+				enabledWasmLoadingTypes.add(desc.wasmLoading);
+			}
+		});
+		return Array.from(enabledWasmLoadingTypes);
+	});
+};
+
+/**
+ * @param {ExternalsPresets} externalsPresets options
+ * @param {object} options options
+ * @param {TargetProperties | false} options.targetProperties target properties
+ * @param {boolean} options.buildHttp buildHttp experiment enabled
+ * @returns {void}
+ */
+const applyExternalsPresetsDefaults = (
+	externalsPresets,
+	{ targetProperties, buildHttp }
+) => {
+	D(
+		externalsPresets,
+		"web",
+		/** @type {boolean | undefined} */
+		(!buildHttp && targetProperties && targetProperties.web)
+	);
+	D(
+		externalsPresets,
+		"node",
+		/** @type {boolean | undefined} */
+		(targetProperties && targetProperties.node)
+	);
+	D(
+		externalsPresets,
+		"nwjs",
+		/** @type {boolean | undefined} */
+		(targetProperties && targetProperties.nwjs)
+	);
+	D(
+		externalsPresets,
+		"electron",
+		/** @type {boolean | undefined} */
+		(targetProperties && targetProperties.electron)
+	);
+	D(
+		externalsPresets,
+		"electronMain",
+		/** @type {boolean | undefined} */
+		(
+			targetProperties &&
+				targetProperties.electron &&
+				targetProperties.electronMain
+		)
+	);
+	D(
+		externalsPresets,
+		"electronPreload",
+		/** @type {boolean | undefined} */
+		(
+			targetProperties &&
+				targetProperties.electron &&
+				targetProperties.electronPreload
+		)
+	);
+	D(
+		externalsPresets,
+		"electronRenderer",
+		/** @type {boolean | undefined} */
+		(
+			targetProperties &&
+				targetProperties.electron &&
+				targetProperties.electronRenderer
+		)
+	);
+};
+
+/**
+ * @param {Loader} loader options
+ * @param {object} options options
+ * @param {TargetProperties | false} options.targetProperties target properties
+ * @param {Environment} options.environment environment
+ * @returns {void}
+ */
+const applyLoaderDefaults = (loader, { targetProperties, environment }) => {
+	F(loader, "target", () => {
+		if (targetProperties) {
+			if (targetProperties.electron) {
+				if (targetProperties.electronMain) return "electron-main";
+				if (targetProperties.electronPreload) return "electron-preload";
+				if (targetProperties.electronRenderer) return "electron-renderer";
+				return "electron";
+			}
+			if (targetProperties.nwjs) return "nwjs";
+			if (targetProperties.node) return "node";
+			if (targetProperties.web) return "web";
+		}
+	});
+	D(loader, "environment", environment);
+};
+
+/**
+ * @param {WebpackNode} node options
+ * @param {object} options options
+ * @param {TargetProperties | false} options.targetProperties target properties
+ * @param {boolean} options.futureDefaults is future defaults enabled
+ * @param {boolean} options.outputModule is output type is module
+ * @returns {void}
+ */
+const applyNodeDefaults = (
+	node,
+	{ futureDefaults, outputModule, targetProperties }
+) => {
+	if (node === false) return;
+
+	F(node, "global", () => {
+		if (targetProperties && targetProperties.global) return false;
+		// TODO webpack 6 should always default to false
+		return futureDefaults ? "warn" : true;
+	});
+
+	const handlerForNames = () => {
+		if (targetProperties && targetProperties.node)
+			return outputModule ? "node-module" : "eval-only";
+		// TODO webpack 6 should always default to false
+		return futureDefaults ? "warn-mock" : "mock";
+	};
+
+	F(node, "__filename", handlerForNames);
+	F(node, "__dirname", handlerForNames);
+};
+
+/**
+ * @param {Performance} performance options
+ * @param {object} options options
+ * @param {boolean} options.production is production
+ * @returns {void}
+ */
+const applyPerformanceDefaults = (performance, { production }) => {
+	if (performance === false) return;
+	D(performance, "maxAssetSize", 250000);
+	D(performance, "maxEntrypointSize", 250000);
+	F(performance, "hints", () => (production ? "warning" : false));
+};
+
+/**
+ * @param {Optimization} optimization options
+ * @param {object} options options
+ * @param {boolean} options.production is production
+ * @param {boolean} options.development is development
+ * @param {boolean} options.css is css enabled
+ * @param {boolean} options.records using records
+ * @returns {void}
+ */
+const applyOptimizationDefaults = (
+	optimization,
+	{ production, development, css, records }
+) => {
+	D(optimization, "removeAvailableModules", false);
+	D(optimization, "removeEmptyChunks", true);
+	D(optimization, "mergeDuplicateChunks", true);
+	D(optimization, "flagIncludedChunks", production);
+	F(optimization, "moduleIds", () => {
+		if (production) return "deterministic";
+		if (development) return "named";
+		return "natural";
+	});
+	F(optimization, "chunkIds", () => {
+		if (production) return "deterministic";
+		if (development) return "named";
+		return "natural";
+	});
+	F(optimization, "sideEffects", () => (production ? true : "flag"));
+	D(optimization, "providedExports", true);
+	D(optimization, "usedExports", production);
+	D(optimization, "innerGraph", production);
+	D(optimization, "mangleExports", production);
+	D(optimization, "concatenateModules", production);
+	D(optimization, "avoidEntryIife", production);
+	D(optimization, "runtimeChunk", false);
+	D(optimization, "emitOnErrors", !production);
+	D(optimization, "checkWasmTypes", production);
+	D(optimization, "mangleWasmImports", false);
+	D(optimization, "portableRecords", records);
+	D(optimization, "realContentHash", production);
+	D(optimization, "minimize", production);
+	A(optimization, "minimizer", () => [
+		{
+			apply: compiler => {
+				// Lazy load the Terser plugin
+				const TerserPlugin = require("terser-webpack-plugin");
+				new TerserPlugin({
+					terserOptions: {
+						compress: {
+							passes: 2
+						}
+					}
+				}).apply(/** @type {EXPECTED_ANY} */ (compiler));
+			}
+		}
+	]);
+	F(optimization, "nodeEnv", () => {
+		if (production) return "production";
+		if (development) return "development";
+		return false;
+	});
+	const { splitChunks } = optimization;
+	if (splitChunks) {
+		A(splitChunks, "defaultSizeTypes", () =>
+			css ? ["javascript", "css", "unknown"] : ["javascript", "unknown"]
+		);
+		D(splitChunks, "hidePathInfo", production);
+		D(splitChunks, "chunks", "async");
+		D(splitChunks, "usedExports", optimization.usedExports === true);
+		D(splitChunks, "minChunks", 1);
+		F(splitChunks, "minSize", () => (production ? 20000 : 10000));
+		F(splitChunks, "minRemainingSize", () => (development ? 0 : undefined));
+		F(splitChunks, "enforceSizeThreshold", () => (production ? 50000 : 30000));
+		F(splitChunks, "maxAsyncRequests", () => (production ? 30 : Infinity));
+		F(splitChunks, "maxInitialRequests", () => (production ? 30 : Infinity));
+		D(splitChunks, "automaticNameDelimiter", "-");
+		const cacheGroups =
+			/** @type {NonNullable} */
+			(splitChunks.cacheGroups);
+		F(cacheGroups, "default", () => ({
+			idHint: "",
+			reuseExistingChunk: true,
+			minChunks: 2,
+			priority: -20
+		}));
+		F(cacheGroups, "defaultVendors", () => ({
+			idHint: "vendors",
+			reuseExistingChunk: true,
+			test: NODE_MODULES_REGEXP,
+			priority: -10
+		}));
+	}
+};
+
+/**
+ * @param {object} options options
+ * @param {boolean} options.cache is cache enable
+ * @param {string} options.context build context
+ * @param {TargetProperties | false} options.targetProperties target properties
+ * @param {Mode} options.mode mode
+ * @param {boolean} options.css is css enabled
+ * @returns {ResolveOptions} resolve options
+ */
+const getResolveDefaults = ({
+	cache,
+	context,
+	targetProperties,
+	mode,
+	css
+}) => {
+	/** @type {string[]} */
+	const conditions = ["webpack"];
+
+	conditions.push(mode === "development" ? "development" : "production");
+
+	if (targetProperties) {
+		if (targetProperties.webworker) conditions.push("worker");
+		if (targetProperties.node) conditions.push("node");
+		if (targetProperties.web) conditions.push("browser");
+		if (targetProperties.electron) conditions.push("electron");
+		if (targetProperties.nwjs) conditions.push("nwjs");
+	}
+
+	const jsExtensions = [".js", ".json", ".wasm"];
+
+	const tp = targetProperties;
+	const browserField =
+		tp && tp.web && (!tp.node || (tp.electron && tp.electronRenderer));
+
+	/** @type {() => ResolveOptions} */
+	const cjsDeps = () => ({
+		aliasFields: browserField ? ["browser"] : [],
+		mainFields: browserField ? ["browser", "module", "..."] : ["module", "..."],
+		conditionNames: ["require", "module", "..."],
+		extensions: [...jsExtensions]
+	});
+	/** @type {() => ResolveOptions} */
+	const esmDeps = () => ({
+		aliasFields: browserField ? ["browser"] : [],
+		mainFields: browserField ? ["browser", "module", "..."] : ["module", "..."],
+		conditionNames: ["import", "module", "..."],
+		extensions: [...jsExtensions]
+	});
+
+	/** @type {ResolveOptions} */
+	const resolveOptions = {
+		cache,
+		modules: ["node_modules"],
+		conditionNames: conditions,
+		mainFiles: ["index"],
+		extensions: [],
+		aliasFields: [],
+		exportsFields: ["exports"],
+		roots: [context],
+		mainFields: ["main"],
+		importsFields: ["imports"],
+		byDependency: {
+			wasm: esmDeps(),
+			esm: esmDeps(),
+			loaderImport: esmDeps(),
+			url: {
+				preferRelative: true
+			},
+			worker: {
+				...esmDeps(),
+				preferRelative: true
+			},
+			commonjs: cjsDeps(),
+			amd: cjsDeps(),
+			// for backward-compat: loadModule
+			loader: cjsDeps(),
+			// for backward-compat: Custom Dependency
+			unknown: cjsDeps(),
+			// for backward-compat: getResolve without dependencyType
+			undefined: cjsDeps()
+		}
+	};
+
+	if (css) {
+		const styleConditions = [];
+
+		styleConditions.push("webpack");
+		styleConditions.push(mode === "development" ? "development" : "production");
+		styleConditions.push("style");
+
+		/** @type {NonNullable} */
+		(resolveOptions.byDependency)["css-import"] = {
+			// We avoid using any main files because we have to be consistent with CSS `@import`
+			// and CSS `@import` does not handle `main` files in directories,
+			// you should always specify the full URL for styles
+			mainFiles: [],
+			mainFields: ["style", "..."],
+			conditionNames: styleConditions,
+			extensions: [".css"],
+			preferRelative: true
+		};
+	}
+
+	return resolveOptions;
+};
+
+/**
+ * @param {object} options options
+ * @param {boolean} options.cache is cache enable
+ * @returns {ResolveOptions} resolve options
+ */
+const getResolveLoaderDefaults = ({ cache }) => {
+	/** @type {ResolveOptions} */
+	const resolveOptions = {
+		cache,
+		conditionNames: ["loader", "require", "node"],
+		exportsFields: ["exports"],
+		mainFields: ["loader", "main"],
+		extensions: [".js"],
+		mainFiles: ["index"]
+	};
+
+	return resolveOptions;
+};
+
+/**
+ * @param {InfrastructureLogging} infrastructureLogging options
+ * @returns {void}
+ */
+const applyInfrastructureLoggingDefaults = infrastructureLogging => {
+	F(infrastructureLogging, "stream", () => process.stderr);
+	const tty =
+		/** @type {NonNullable} */
+		(infrastructureLogging.stream).isTTY && process.env.TERM !== "dumb";
+	D(infrastructureLogging, "level", "info");
+	D(infrastructureLogging, "debug", false);
+	D(infrastructureLogging, "colors", tty);
+	D(infrastructureLogging, "appendOnly", !tty);
+};
+
+module.exports.applyWebpackOptionsBaseDefaults =
+	applyWebpackOptionsBaseDefaults;
+module.exports.applyWebpackOptionsDefaults = applyWebpackOptionsDefaults;
+module.exports.DEFAULTS = DEFAULTS;
diff --git a/lib/config/normalization.js b/lib/config/normalization.js
new file mode 100644
index 00000000000..bfc0a93abee
--- /dev/null
+++ b/lib/config/normalization.js
@@ -0,0 +1,565 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const util = require("util");
+
+/** @typedef {import("../../declarations/WebpackOptions").CacheOptionsNormalized} CacheOptions */
+/** @typedef {import("../../declarations/WebpackOptions").EntryDescriptionNormalized} EntryDescriptionNormalized */
+/** @typedef {import("../../declarations/WebpackOptions").EntryStatic} EntryStatic */
+/** @typedef {import("../../declarations/WebpackOptions").EntryStaticNormalized} EntryStaticNormalized */
+/** @typedef {import("../../declarations/WebpackOptions").Externals} Externals */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryName} LibraryName */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryOptions} LibraryOptions */
+/** @typedef {import("../../declarations/WebpackOptions").ModuleOptionsNormalized} ModuleOptionsNormalized */
+/** @typedef {import("../../declarations/WebpackOptions").OptimizationRuntimeChunk} OptimizationRuntimeChunk */
+/** @typedef {import("../../declarations/WebpackOptions").OptimizationRuntimeChunkNormalized} OptimizationRuntimeChunkNormalized */
+/** @typedef {import("../../declarations/WebpackOptions").OutputNormalized} OutputNormalized */
+/** @typedef {import("../../declarations/WebpackOptions").Plugins} Plugins */
+/** @typedef {import("../../declarations/WebpackOptions").WebpackOptions} WebpackOptions */
+/** @typedef {import("../../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptionsNormalized */
+/** @typedef {import("../Entrypoint")} Entrypoint */
+/** @typedef {import("../WebpackError")} WebpackError */
+
+const handledDeprecatedNoEmitOnErrors = util.deprecate(
+	/**
+	 * @param {boolean} noEmitOnErrors no emit on errors
+	 * @param {boolean | undefined} emitOnErrors emit on errors
+	 * @returns {boolean} emit on errors
+	 */
+	(noEmitOnErrors, emitOnErrors) => {
+		if (emitOnErrors !== undefined && !noEmitOnErrors === !emitOnErrors) {
+			throw new Error(
+				"Conflicting use of 'optimization.noEmitOnErrors' and 'optimization.emitOnErrors'. Remove deprecated 'optimization.noEmitOnErrors' from config."
+			);
+		}
+		return !noEmitOnErrors;
+	},
+	"optimization.noEmitOnErrors is deprecated in favor of optimization.emitOnErrors",
+	"DEP_WEBPACK_CONFIGURATION_OPTIMIZATION_NO_EMIT_ON_ERRORS"
+);
+
+/**
+ * @template T
+ * @template R
+ * @param {T | undefined} value value or not
+ * @param {(value: T) => R} fn nested handler
+ * @returns {R} result value
+ */
+const nestedConfig = (value, fn) =>
+	value === undefined ? fn(/** @type {T} */ ({})) : fn(value);
+
+/**
+ * @template T
+ * @param {T|undefined} value value or not
+ * @returns {T} result value
+ */
+const cloneObject = value => /** @type {T} */ ({ ...value });
+/**
+ * @template T
+ * @template R
+ * @param {T | undefined} value value or not
+ * @param {(value: T) => R} fn nested handler
+ * @returns {R | undefined} result value
+ */
+const optionalNestedConfig = (value, fn) =>
+	value === undefined ? undefined : fn(value);
+
+/**
+ * @template T
+ * @template R
+ * @param {T[] | undefined} value array or not
+ * @param {(value: T[]) => R[]} fn nested handler
+ * @returns {R[] | undefined} cloned value
+ */
+const nestedArray = (value, fn) => (Array.isArray(value) ? fn(value) : fn([]));
+
+/**
+ * @template T
+ * @template R
+ * @param {T[] | undefined} value array or not
+ * @param {(value: T[]) => R[]} fn nested handler
+ * @returns {R[] | undefined} cloned value
+ */
+const optionalNestedArray = (value, fn) =>
+	Array.isArray(value) ? fn(value) : undefined;
+
+/**
+ * @template T
+ * @template R
+ * @param {Record|undefined} value value or not
+ * @param {(value: T) => R} fn nested handler
+ * @param {Record R>=} customKeys custom nested handler for some keys
+ * @returns {Record} result value
+ */
+const keyedNestedConfig = (value, fn, customKeys) => {
+	/* eslint-disable no-sequences */
+	const result =
+		value === undefined
+			? {}
+			: Object.keys(value).reduce(
+					(obj, key) => (
+						(obj[key] = (
+							customKeys && key in customKeys ? customKeys[key] : fn
+						)(value[key])),
+						obj
+					),
+					/** @type {Record} */ ({})
+				);
+	/* eslint-enable no-sequences */
+	if (customKeys) {
+		for (const key of Object.keys(customKeys)) {
+			if (!(key in result)) {
+				result[key] = customKeys[key](/** @type {T} */ ({}));
+			}
+		}
+	}
+	return result;
+};
+
+/**
+ * @param {WebpackOptions} config input config
+ * @returns {WebpackOptionsNormalized} normalized options
+ */
+const getNormalizedWebpackOptions = config => ({
+	amd: config.amd,
+	bail: config.bail,
+	cache:
+		/** @type {NonNullable} */
+		(
+			optionalNestedConfig(config.cache, cache => {
+				if (cache === false) return false;
+				if (cache === true) {
+					return {
+						type: "memory",
+						maxGenerations: undefined
+					};
+				}
+				switch (cache.type) {
+					case "filesystem":
+						return {
+							type: "filesystem",
+							allowCollectingMemory: cache.allowCollectingMemory,
+							maxMemoryGenerations: cache.maxMemoryGenerations,
+							maxAge: cache.maxAge,
+							profile: cache.profile,
+							buildDependencies: cloneObject(cache.buildDependencies),
+							cacheDirectory: cache.cacheDirectory,
+							cacheLocation: cache.cacheLocation,
+							hashAlgorithm: cache.hashAlgorithm,
+							compression: cache.compression,
+							idleTimeout: cache.idleTimeout,
+							idleTimeoutForInitialStore: cache.idleTimeoutForInitialStore,
+							idleTimeoutAfterLargeChanges: cache.idleTimeoutAfterLargeChanges,
+							name: cache.name,
+							store: cache.store,
+							version: cache.version,
+							readonly: cache.readonly
+						};
+					case undefined:
+					case "memory":
+						return {
+							type: "memory",
+							maxGenerations: cache.maxGenerations
+						};
+					default:
+						// @ts-expect-error Property 'type' does not exist on type 'never'. ts(2339)
+						throw new Error(`Not implemented cache.type ${cache.type}`);
+				}
+			})
+		),
+	context: config.context,
+	dependencies: config.dependencies,
+	devServer: optionalNestedConfig(config.devServer, devServer => {
+		if (devServer === false) return false;
+		return { ...devServer };
+	}),
+	devtool: config.devtool,
+	entry:
+		config.entry === undefined
+			? { main: {} }
+			: typeof config.entry === "function"
+				? (
+						fn => () =>
+							Promise.resolve().then(fn).then(getNormalizedEntryStatic)
+					)(config.entry)
+				: getNormalizedEntryStatic(config.entry),
+	experiments: nestedConfig(config.experiments, experiments => ({
+		...experiments,
+		buildHttp: optionalNestedConfig(experiments.buildHttp, options =>
+			Array.isArray(options) ? { allowedUris: options } : options
+		),
+		lazyCompilation: optionalNestedConfig(
+			experiments.lazyCompilation,
+			options => (options === true ? {} : options)
+		)
+	})),
+	externals: /** @type {NonNullable} */ (config.externals),
+	externalsPresets: cloneObject(config.externalsPresets),
+	externalsType: config.externalsType,
+	ignoreWarnings: config.ignoreWarnings
+		? config.ignoreWarnings.map(ignore => {
+				if (typeof ignore === "function") return ignore;
+				const i = ignore instanceof RegExp ? { message: ignore } : ignore;
+				return (warning, { requestShortener }) => {
+					if (!i.message && !i.module && !i.file) return false;
+					if (i.message && !i.message.test(warning.message)) {
+						return false;
+					}
+					if (
+						i.module &&
+						(!(/** @type {WebpackError} */ (warning).module) ||
+							!i.module.test(
+								/** @type {WebpackError} */
+								(warning).module.readableIdentifier(requestShortener)
+							))
+					) {
+						return false;
+					}
+					if (
+						i.file &&
+						(!(/** @type {WebpackError} */ (warning).file) ||
+							!i.file.test(/** @type {WebpackError} */ (warning).file))
+					) {
+						return false;
+					}
+					return true;
+				};
+			})
+		: undefined,
+	infrastructureLogging: cloneObject(config.infrastructureLogging),
+	loader: cloneObject(config.loader),
+	mode: config.mode,
+	module:
+		/** @type {ModuleOptionsNormalized} */
+		(
+			nestedConfig(config.module, module => ({
+				noParse: module.noParse,
+				unsafeCache: module.unsafeCache,
+				parser: keyedNestedConfig(module.parser, cloneObject, {
+					javascript: parserOptions => ({
+						unknownContextRequest: module.unknownContextRequest,
+						unknownContextRegExp: module.unknownContextRegExp,
+						unknownContextRecursive: module.unknownContextRecursive,
+						unknownContextCritical: module.unknownContextCritical,
+						exprContextRequest: module.exprContextRequest,
+						exprContextRegExp: module.exprContextRegExp,
+						exprContextRecursive: module.exprContextRecursive,
+						exprContextCritical: module.exprContextCritical,
+						wrappedContextRegExp: module.wrappedContextRegExp,
+						wrappedContextRecursive: module.wrappedContextRecursive,
+						wrappedContextCritical: module.wrappedContextCritical,
+						// TODO webpack 6 remove
+						strictExportPresence: module.strictExportPresence,
+						strictThisContextOnImports: module.strictThisContextOnImports,
+						...parserOptions
+					})
+				}),
+				generator: cloneObject(module.generator),
+				defaultRules: optionalNestedArray(module.defaultRules, r => [...r]),
+				rules: nestedArray(module.rules, r => [...r])
+			}))
+		),
+	name: config.name,
+	node: nestedConfig(
+		config.node,
+		node =>
+			node && {
+				...node
+			}
+	),
+	optimization: nestedConfig(config.optimization, optimization => ({
+		...optimization,
+		runtimeChunk: getNormalizedOptimizationRuntimeChunk(
+			optimization.runtimeChunk
+		),
+		splitChunks: nestedConfig(
+			optimization.splitChunks,
+			splitChunks =>
+				splitChunks && {
+					...splitChunks,
+					defaultSizeTypes: splitChunks.defaultSizeTypes
+						? [...splitChunks.defaultSizeTypes]
+						: ["..."],
+					cacheGroups: cloneObject(splitChunks.cacheGroups)
+				}
+		),
+		emitOnErrors:
+			optimization.noEmitOnErrors !== undefined
+				? handledDeprecatedNoEmitOnErrors(
+						optimization.noEmitOnErrors,
+						optimization.emitOnErrors
+					)
+				: optimization.emitOnErrors
+	})),
+	output: nestedConfig(config.output, output => {
+		const { library } = output;
+		const libraryAsName = /** @type {LibraryName} */ (library);
+		const libraryBase =
+			typeof library === "object" &&
+			library &&
+			!Array.isArray(library) &&
+			"type" in library
+				? library
+				: libraryAsName || output.libraryTarget
+					? /** @type {LibraryOptions} */ ({
+							name: libraryAsName
+						})
+					: undefined;
+		/** @type {OutputNormalized} */
+		const result = {
+			assetModuleFilename: output.assetModuleFilename,
+			asyncChunks: output.asyncChunks,
+			charset: output.charset,
+			chunkFilename: output.chunkFilename,
+			chunkFormat: output.chunkFormat,
+			chunkLoading: output.chunkLoading,
+			chunkLoadingGlobal: output.chunkLoadingGlobal,
+			chunkLoadTimeout: output.chunkLoadTimeout,
+			cssFilename: output.cssFilename,
+			cssChunkFilename: output.cssChunkFilename,
+			clean: output.clean,
+			compareBeforeEmit: output.compareBeforeEmit,
+			crossOriginLoading: output.crossOriginLoading,
+			devtoolFallbackModuleFilenameTemplate:
+				output.devtoolFallbackModuleFilenameTemplate,
+			devtoolModuleFilenameTemplate: output.devtoolModuleFilenameTemplate,
+			devtoolNamespace: output.devtoolNamespace,
+			environment: cloneObject(output.environment),
+			enabledChunkLoadingTypes: output.enabledChunkLoadingTypes
+				? [...output.enabledChunkLoadingTypes]
+				: ["..."],
+			enabledLibraryTypes: output.enabledLibraryTypes
+				? [...output.enabledLibraryTypes]
+				: ["..."],
+			enabledWasmLoadingTypes: output.enabledWasmLoadingTypes
+				? [...output.enabledWasmLoadingTypes]
+				: ["..."],
+			filename: output.filename,
+			globalObject: output.globalObject,
+			hashDigest: output.hashDigest,
+			hashDigestLength: output.hashDigestLength,
+			hashFunction: output.hashFunction,
+			hashSalt: output.hashSalt,
+			hotUpdateChunkFilename: output.hotUpdateChunkFilename,
+			hotUpdateGlobal: output.hotUpdateGlobal,
+			hotUpdateMainFilename: output.hotUpdateMainFilename,
+			ignoreBrowserWarnings: output.ignoreBrowserWarnings,
+			iife: output.iife,
+			importFunctionName: output.importFunctionName,
+			importMetaName: output.importMetaName,
+			scriptType: output.scriptType,
+			// TODO webpack6 remove `libraryTarget`/`auxiliaryComment`/`amdContainer`/etc in favor of the `library` option
+			library: libraryBase && {
+				type:
+					output.libraryTarget !== undefined
+						? output.libraryTarget
+						: libraryBase.type,
+				auxiliaryComment:
+					output.auxiliaryComment !== undefined
+						? output.auxiliaryComment
+						: libraryBase.auxiliaryComment,
+				amdContainer:
+					output.amdContainer !== undefined
+						? output.amdContainer
+						: libraryBase.amdContainer,
+				export:
+					output.libraryExport !== undefined
+						? output.libraryExport
+						: libraryBase.export,
+				name: libraryBase.name,
+				umdNamedDefine:
+					output.umdNamedDefine !== undefined
+						? output.umdNamedDefine
+						: libraryBase.umdNamedDefine
+			},
+			module: output.module,
+			path: output.path,
+			pathinfo: output.pathinfo,
+			publicPath: output.publicPath,
+			sourceMapFilename: output.sourceMapFilename,
+			sourcePrefix: output.sourcePrefix,
+			strictModuleErrorHandling: output.strictModuleErrorHandling,
+			strictModuleExceptionHandling: output.strictModuleExceptionHandling,
+			trustedTypes: optionalNestedConfig(output.trustedTypes, trustedTypes => {
+				if (trustedTypes === true) return {};
+				if (typeof trustedTypes === "string")
+					return { policyName: trustedTypes };
+				return { ...trustedTypes };
+			}),
+			uniqueName: output.uniqueName,
+			wasmLoading: output.wasmLoading,
+			webassemblyModuleFilename: output.webassemblyModuleFilename,
+			workerPublicPath: output.workerPublicPath,
+			workerChunkLoading: output.workerChunkLoading,
+			workerWasmLoading: output.workerWasmLoading
+		};
+		return result;
+	}),
+	parallelism: config.parallelism,
+	performance: optionalNestedConfig(config.performance, performance => {
+		if (performance === false) return false;
+		return {
+			...performance
+		};
+	}),
+	plugins: /** @type {Plugins} */ (nestedArray(config.plugins, p => [...p])),
+	profile: config.profile,
+	recordsInputPath:
+		config.recordsInputPath !== undefined
+			? config.recordsInputPath
+			: config.recordsPath,
+	recordsOutputPath:
+		config.recordsOutputPath !== undefined
+			? config.recordsOutputPath
+			: config.recordsPath,
+	resolve: nestedConfig(config.resolve, resolve => ({
+		...resolve,
+		byDependency: keyedNestedConfig(resolve.byDependency, cloneObject)
+	})),
+	resolveLoader: cloneObject(config.resolveLoader),
+	snapshot: nestedConfig(config.snapshot, snapshot => ({
+		resolveBuildDependencies: optionalNestedConfig(
+			snapshot.resolveBuildDependencies,
+			resolveBuildDependencies => ({
+				timestamp: resolveBuildDependencies.timestamp,
+				hash: resolveBuildDependencies.hash
+			})
+		),
+		buildDependencies: optionalNestedConfig(
+			snapshot.buildDependencies,
+			buildDependencies => ({
+				timestamp: buildDependencies.timestamp,
+				hash: buildDependencies.hash
+			})
+		),
+		resolve: optionalNestedConfig(snapshot.resolve, resolve => ({
+			timestamp: resolve.timestamp,
+			hash: resolve.hash
+		})),
+		module: optionalNestedConfig(snapshot.module, module => ({
+			timestamp: module.timestamp,
+			hash: module.hash
+		})),
+		immutablePaths: optionalNestedArray(snapshot.immutablePaths, p => [...p]),
+		managedPaths: optionalNestedArray(snapshot.managedPaths, p => [...p]),
+		unmanagedPaths: optionalNestedArray(snapshot.unmanagedPaths, p => [...p])
+	})),
+	stats: nestedConfig(config.stats, stats => {
+		if (stats === false) {
+			return {
+				preset: "none"
+			};
+		}
+		if (stats === true) {
+			return {
+				preset: "normal"
+			};
+		}
+		if (typeof stats === "string") {
+			return {
+				preset: stats
+			};
+		}
+		return {
+			...stats
+		};
+	}),
+	target: config.target,
+	watch: config.watch,
+	watchOptions: cloneObject(config.watchOptions)
+});
+
+/**
+ * @param {EntryStatic} entry static entry options
+ * @returns {EntryStaticNormalized} normalized static entry options
+ */
+const getNormalizedEntryStatic = entry => {
+	if (typeof entry === "string") {
+		return {
+			main: {
+				import: [entry]
+			}
+		};
+	}
+	if (Array.isArray(entry)) {
+		return {
+			main: {
+				import: entry
+			}
+		};
+	}
+	/** @type {EntryStaticNormalized} */
+	const result = {};
+	for (const key of Object.keys(entry)) {
+		const value = entry[key];
+		if (typeof value === "string") {
+			result[key] = {
+				import: [value]
+			};
+		} else if (Array.isArray(value)) {
+			result[key] = {
+				import: value
+			};
+		} else {
+			result[key] = {
+				import:
+					/** @type {EntryDescriptionNormalized["import"]} */
+					(
+						value.import &&
+							(Array.isArray(value.import) ? value.import : [value.import])
+					),
+				filename: value.filename,
+				layer: value.layer,
+				runtime: value.runtime,
+				baseUri: value.baseUri,
+				publicPath: value.publicPath,
+				chunkLoading: value.chunkLoading,
+				asyncChunks: value.asyncChunks,
+				wasmLoading: value.wasmLoading,
+				dependOn:
+					/** @type {EntryDescriptionNormalized["dependOn"]} */
+					(
+						value.dependOn &&
+							(Array.isArray(value.dependOn)
+								? value.dependOn
+								: [value.dependOn])
+					),
+				library: value.library
+			};
+		}
+	}
+	return result;
+};
+
+/**
+ * @param {OptimizationRuntimeChunk=} runtimeChunk runtimeChunk option
+ * @returns {OptimizationRuntimeChunkNormalized=} normalized runtimeChunk option
+ */
+const getNormalizedOptimizationRuntimeChunk = runtimeChunk => {
+	if (runtimeChunk === undefined) return;
+	if (runtimeChunk === false) return false;
+	if (runtimeChunk === "single") {
+		return {
+			name: () => "runtime"
+		};
+	}
+	if (runtimeChunk === true || runtimeChunk === "multiple") {
+		return {
+			name: entrypoint => `runtime~${entrypoint.name}`
+		};
+	}
+	const { name } = runtimeChunk;
+	return {
+		name:
+			typeof name === "function"
+				? /** @type {Exclude["name"]} */
+					(name)
+				: () => /** @type {string} */ (name)
+	};
+};
+
+module.exports.getNormalizedWebpackOptions = getNormalizedWebpackOptions;
diff --git a/lib/config/target.js b/lib/config/target.js
new file mode 100644
index 00000000000..230808b9cef
--- /dev/null
+++ b/lib/config/target.js
@@ -0,0 +1,377 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const memoize = require("../util/memoize");
+
+const getBrowserslistTargetHandler = memoize(() =>
+	require("./browserslistTargetHandler")
+);
+
+/**
+ * @param {string} context the context directory
+ * @returns {string} default target
+ */
+const getDefaultTarget = context => {
+	const browsers = getBrowserslistTargetHandler().load(null, context);
+	return browsers ? "browserslist" : "web";
+};
+
+/**
+ * @typedef {object} PlatformTargetProperties
+ * @property {boolean | null=} web web platform, importing of http(s) and std: is available
+ * @property {boolean | null=} browser browser platform, running in a normal web browser
+ * @property {boolean | null=} webworker (Web)Worker platform, running in a web/shared/service worker
+ * @property {boolean | null=} node node platform, require of node built-in modules is available
+ * @property {boolean | null=} nwjs nwjs platform, require of legacy nw.gui is available
+ * @property {boolean | null=} electron electron platform, require of some electron built-in modules is available
+ */
+
+/**
+ * @typedef {object} ElectronContextTargetProperties
+ * @property {boolean | null} electronMain in main context
+ * @property {boolean | null} electronPreload in preload context
+ * @property {boolean | null} electronRenderer in renderer context with node integration
+ */
+
+/**
+ * @typedef {object} ApiTargetProperties
+ * @property {boolean | null} require has require function available
+ * @property {boolean | null} nodeBuiltins has node.js built-in modules available
+ * @property {boolean | null} nodePrefixForCoreModules node.js allows to use `node:` prefix for core modules
+ * @property {boolean | null} document has document available (allows script tags)
+ * @property {boolean | null} importScripts has importScripts available
+ * @property {boolean | null} importScriptsInWorker has importScripts available when creating a worker
+ * @property {boolean | null} fetchWasm has fetch function available for WebAssembly
+ * @property {boolean | null} global has global variable available
+ */
+
+/**
+ * @typedef {object} EcmaTargetProperties
+ * @property {boolean | null} globalThis has globalThis variable available
+ * @property {boolean | null} bigIntLiteral big int literal syntax is available
+ * @property {boolean | null} const const and let variable declarations are available
+ * @property {boolean | null} arrowFunction arrow functions are available
+ * @property {boolean | null} forOf for of iteration is available
+ * @property {boolean | null} destructuring destructuring is available
+ * @property {boolean | null} dynamicImport async import() is available
+ * @property {boolean | null} dynamicImportInWorker async import() is available when creating a worker
+ * @property {boolean | null} module ESM syntax is available (when in module)
+ * @property {boolean | null} optionalChaining optional chaining is available
+ * @property {boolean | null} templateLiteral template literal is available
+ * @property {boolean | null} asyncFunction async functions and await are available
+ */
+
+/**
+ * @template T
+ * @typedef {{ [P in keyof T]?: never }} Never
+ */
+
+/**
+ * @template A
+ * @template B
+ * @typedef {(A & Never) | (Never & B) | (A & B)} Mix
+ */
+
+/** @typedef {Mix, Mix>} TargetProperties */
+
+/**
+ * @param {string} major major version
+ * @param {string | undefined} minor minor version
+ * @returns {(vMajor: number, vMinor?: number) => boolean | undefined} check if version is greater or equal
+ */
+const versionDependent = (major, minor) => {
+	if (!major) {
+		return () => /** @type {undefined} */ (undefined);
+	}
+	/** @type {number} */
+	const nMajor = Number(major);
+	/** @type {number} */
+	const nMinor = minor ? Number(minor) : 0;
+	return (vMajor, vMinor = 0) =>
+		nMajor > vMajor || (nMajor === vMajor && nMinor >= vMinor);
+};
+
+/** @type {[string, string, RegExp, (...args: string[]) => Partial][]} */
+const TARGETS = [
+	[
+		"browserslist / browserslist:env / browserslist:query / browserslist:path-to-config / browserslist:path-to-config:env",
+		"Resolve features from browserslist. Will resolve browserslist config automatically. Only browser or node queries are supported (electron is not supported). Examples: 'browserslist:modern' to use 'modern' environment from browserslist config",
+		/^browserslist(?::(.+))?$/,
+		(rest, context) => {
+			const browserslistTargetHandler = getBrowserslistTargetHandler();
+			const browsers = browserslistTargetHandler.load(
+				rest ? rest.trim() : null,
+				context
+			);
+			if (!browsers) {
+				throw new Error(`No browserslist config found to handle the 'browserslist' target.
+See https://github.com/browserslist/browserslist#queries for possible ways to provide a config.
+The recommended way is to add a 'browserslist' key to your package.json and list supported browsers (resp. node.js versions).
+You can also more options via the 'target' option: 'browserslist' / 'browserslist:env' / 'browserslist:query' / 'browserslist:path-to-config' / 'browserslist:path-to-config:env'`);
+			}
+
+			return browserslistTargetHandler.resolve(browsers);
+		}
+	],
+	[
+		"web",
+		"Web browser.",
+		/^web$/,
+		() => ({
+			node: false,
+			web: true,
+			webworker: null,
+			browser: true,
+			electron: false,
+			nwjs: false,
+
+			document: true,
+			importScriptsInWorker: true,
+			fetchWasm: true,
+			nodeBuiltins: false,
+			importScripts: false,
+			require: false,
+			global: false
+		})
+	],
+	[
+		"webworker",
+		"Web Worker, SharedWorker or Service Worker.",
+		/^webworker$/,
+		() => ({
+			node: false,
+			web: true,
+			webworker: true,
+			browser: true,
+			electron: false,
+			nwjs: false,
+
+			importScripts: true,
+			importScriptsInWorker: true,
+			fetchWasm: true,
+			nodeBuiltins: false,
+			require: false,
+			document: false,
+			global: false
+		})
+	],
+	[
+		"[async-]node[X[.Y]]",
+		"Node.js in version X.Y. The 'async-' prefix will load chunks asynchronously via 'fs' and 'vm' instead of 'require()'. Examples: node14.5, async-node10.",
+		/^(async-)?node((\d+)(?:\.(\d+))?)?$/,
+		(asyncFlag, _, major, minor) => {
+			const v = versionDependent(major, minor);
+			// see https://node.green/
+			return {
+				node: true,
+				web: false,
+				webworker: false,
+				browser: false,
+				electron: false,
+				nwjs: false,
+
+				require: !asyncFlag,
+				nodeBuiltins: true,
+				// v16.0.0, v14.18.0
+				nodePrefixForCoreModules: Number(major) < 15 ? v(14, 18) : v(16),
+				global: true,
+				document: false,
+				fetchWasm: false,
+				importScripts: false,
+				importScriptsInWorker: false,
+
+				globalThis: v(12),
+				const: v(6),
+				templateLiteral: v(4),
+				optionalChaining: v(14),
+				arrowFunction: v(6),
+				asyncFunction: v(7, 6),
+				forOf: v(5),
+				destructuring: v(6),
+				bigIntLiteral: v(10, 4),
+				dynamicImport: v(12, 17),
+				dynamicImportInWorker: major ? false : undefined,
+				module: v(12, 17)
+			};
+		}
+	],
+	[
+		"electron[X[.Y]]-main/preload/renderer",
+		"Electron in version X.Y. Script is running in main, preload resp. renderer context.",
+		/^electron((\d+)(?:\.(\d+))?)?-(main|preload|renderer)$/,
+		(_, major, minor, context) => {
+			const v = versionDependent(major, minor);
+			// see https://node.green/ + https://github.com/electron/releases
+			return {
+				node: true,
+				web: context !== "main",
+				webworker: false,
+				browser: false,
+				electron: true,
+				nwjs: false,
+
+				electronMain: context === "main",
+				electronPreload: context === "preload",
+				electronRenderer: context === "renderer",
+
+				global: true,
+				nodeBuiltins: true,
+				// 15.0.0	- Node.js	v16.5
+				// 14.0.0 - Mode.js v14.17, but prefixes only since v14.18
+				nodePrefixForCoreModules: v(15),
+
+				require: true,
+				document: context === "renderer",
+				fetchWasm: context === "renderer",
+				importScripts: false,
+				importScriptsInWorker: true,
+
+				globalThis: v(5),
+				const: v(1, 1),
+				templateLiteral: v(1, 1),
+				optionalChaining: v(8),
+				arrowFunction: v(1, 1),
+				asyncFunction: v(1, 7),
+				forOf: v(0, 36),
+				destructuring: v(1, 1),
+				bigIntLiteral: v(4),
+				dynamicImport: v(11),
+				dynamicImportInWorker: major ? false : undefined,
+				module: v(11)
+			};
+		}
+	],
+	[
+		"nwjs[X[.Y]] / node-webkit[X[.Y]]",
+		"NW.js in version X.Y.",
+		/^(?:nwjs|node-webkit)((\d+)(?:\.(\d+))?)?$/,
+		(_, major, minor) => {
+			const v = versionDependent(major, minor);
+			// see https://node.green/ + https://github.com/nwjs/nw.js/blob/nw48/CHANGELOG.md
+			return {
+				node: true,
+				web: true,
+				webworker: null,
+				browser: false,
+				electron: false,
+				nwjs: true,
+
+				global: true,
+				nodeBuiltins: true,
+				document: false,
+				importScriptsInWorker: false,
+				fetchWasm: false,
+				importScripts: false,
+				require: false,
+
+				globalThis: v(0, 43),
+				const: v(0, 15),
+				templateLiteral: v(0, 13),
+				optionalChaining: v(0, 44),
+				arrowFunction: v(0, 15),
+				asyncFunction: v(0, 21),
+				forOf: v(0, 13),
+				destructuring: v(0, 15),
+				bigIntLiteral: v(0, 32),
+				dynamicImport: v(0, 43),
+				dynamicImportInWorker: major ? false : undefined,
+				module: v(0, 43)
+			};
+		}
+	],
+	[
+		"esX",
+		"EcmaScript in this version. Examples: es2020, es5.",
+		/^es(\d+)$/,
+		version => {
+			let v = Number(version);
+			if (v < 1000) v = v + 2009;
+			return {
+				const: v >= 2015,
+				templateLiteral: v >= 2015,
+				optionalChaining: v >= 2020,
+				arrowFunction: v >= 2015,
+				forOf: v >= 2015,
+				destructuring: v >= 2015,
+				module: v >= 2015,
+				asyncFunction: v >= 2017,
+				globalThis: v >= 2020,
+				bigIntLiteral: v >= 2020,
+				dynamicImport: v >= 2020,
+				dynamicImportInWorker: v >= 2020
+			};
+		}
+	]
+];
+
+/**
+ * @param {string} target the target
+ * @param {string} context the context directory
+ * @returns {TargetProperties} target properties
+ */
+const getTargetProperties = (target, context) => {
+	for (const [, , regExp, handler] of TARGETS) {
+		const match = regExp.exec(target);
+		if (match) {
+			const [, ...args] = match;
+			const result = handler(...args, context);
+			if (result) return /** @type {TargetProperties} */ (result);
+		}
+	}
+	throw new Error(
+		`Unknown target '${target}'. The following targets are supported:\n${TARGETS.map(
+			([name, description]) => `* ${name}: ${description}`
+		).join("\n")}`
+	);
+};
+
+/**
+ * @param {TargetProperties[]} targetProperties array of target properties
+ * @returns {TargetProperties} merged target properties
+ */
+const mergeTargetProperties = targetProperties => {
+	/** @type {Set} */
+	const keys = new Set();
+	for (const tp of targetProperties) {
+		for (const key of Object.keys(tp)) {
+			keys.add(/** @type {keyof TargetProperties} */ (key));
+		}
+	}
+	/** @type {TargetProperties} */
+	const result = {};
+	for (const key of keys) {
+		let hasTrue = false;
+		let hasFalse = false;
+		for (const tp of targetProperties) {
+			const value = tp[key];
+			switch (value) {
+				case true:
+					hasTrue = true;
+					break;
+				case false:
+					hasFalse = true;
+					break;
+			}
+		}
+		if (hasTrue || hasFalse)
+			/** @type {TargetProperties} */
+			(result)[key] = hasFalse && hasTrue ? null : Boolean(hasTrue);
+	}
+	return result;
+};
+
+/**
+ * @param {string[]} targets the targets
+ * @param {string} context the context directory
+ * @returns {TargetProperties} target properties
+ */
+const getTargetsProperties = (targets, context) =>
+	mergeTargetProperties(targets.map(t => getTargetProperties(t, context)));
+
+module.exports.getDefaultTarget = getDefaultTarget;
+module.exports.getTargetProperties = getTargetProperties;
+module.exports.getTargetsProperties = getTargetsProperties;
diff --git a/lib/container/ContainerEntryDependency.js b/lib/container/ContainerEntryDependency.js
new file mode 100644
index 00000000000..787d99cffac
--- /dev/null
+++ b/lib/container/ContainerEntryDependency.js
@@ -0,0 +1,48 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra, Zackary Jackson @ScriptedAlchemy, Marais Rossouw @maraisr
+*/
+
+"use strict";
+
+const Dependency = require("../Dependency");
+const makeSerializable = require("../util/makeSerializable");
+
+/** @typedef {import("./ContainerEntryModule").ExposeOptions} ExposeOptions */
+/** @typedef {import("./ContainerEntryModule").ExposesList} ExposesList */
+
+class ContainerEntryDependency extends Dependency {
+	/**
+	 * @param {string} name entry name
+	 * @param {ExposesList} exposes list of exposed modules
+	 * @param {string} shareScope name of the share scope
+	 */
+	constructor(name, exposes, shareScope) {
+		super();
+		this.name = name;
+		this.exposes = exposes;
+		this.shareScope = shareScope;
+	}
+
+	/**
+	 * @returns {string | null} an identifier to merge equal requests
+	 */
+	getResourceIdentifier() {
+		return `container-entry-${this.name}`;
+	}
+
+	get type() {
+		return "container entry";
+	}
+
+	get category() {
+		return "esm";
+	}
+}
+
+makeSerializable(
+	ContainerEntryDependency,
+	"webpack/lib/container/ContainerEntryDependency"
+);
+
+module.exports = ContainerEntryDependency;
diff --git a/lib/container/ContainerEntryModule.js b/lib/container/ContainerEntryModule.js
new file mode 100644
index 00000000000..0395372e84e
--- /dev/null
+++ b/lib/container/ContainerEntryModule.js
@@ -0,0 +1,297 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra, Zackary Jackson @ScriptedAlchemy, Marais Rossouw @maraisr
+*/
+
+"use strict";
+
+const { OriginalSource, RawSource } = require("webpack-sources");
+const AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
+const Module = require("../Module");
+const { JS_TYPES } = require("../ModuleSourceTypesConstants");
+const { JAVASCRIPT_MODULE_TYPE_DYNAMIC } = require("../ModuleTypeConstants");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+const StaticExportsDependency = require("../dependencies/StaticExportsDependency");
+const makeSerializable = require("../util/makeSerializable");
+const ContainerExposedDependency = require("./ContainerExposedDependency");
+
+/** @typedef {import("../../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../ChunkGroup")} ChunkGroup */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Module").BuildCallback} BuildCallback */
+/** @typedef {import("../Module").CodeGenerationContext} CodeGenerationContext */
+/** @typedef {import("../Module").CodeGenerationResult} CodeGenerationResult */
+/** @typedef {import("../Module").LibIdentOptions} LibIdentOptions */
+/** @typedef {import("../Module").NeedBuildCallback} NeedBuildCallback */
+/** @typedef {import("../Module").NeedBuildContext} NeedBuildContext */
+/** @typedef {import("../Module").SourceTypes} SourceTypes */
+/** @typedef {import("../RequestShortener")} RequestShortener */
+/** @typedef {import("../ResolverFactory").ResolverWithOptions} ResolverWithOptions */
+/** @typedef {import("../WebpackError")} WebpackError */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("../util/fs").InputFileSystem} InputFileSystem */
+/** @typedef {import("./ContainerEntryDependency")} ContainerEntryDependency */
+
+/**
+ * @typedef {object} ExposeOptions
+ * @property {string[]} import requests to exposed modules (last one is exported)
+ * @property {string} name custom chunk name for the exposed module
+ */
+
+/** @typedef {[string, ExposeOptions][]} ExposesList */
+
+class ContainerEntryModule extends Module {
+	/**
+	 * @param {string} name container entry name
+	 * @param {ExposesList} exposes list of exposed modules
+	 * @param {string} shareScope name of the share scope
+	 */
+	constructor(name, exposes, shareScope) {
+		super(JAVASCRIPT_MODULE_TYPE_DYNAMIC, null);
+		this._name = name;
+		this._exposes = exposes;
+		this._shareScope = shareScope;
+	}
+
+	/**
+	 * @returns {SourceTypes} types available (do not mutate)
+	 */
+	getSourceTypes() {
+		return JS_TYPES;
+	}
+
+	/**
+	 * @returns {string} a unique identifier of the module
+	 */
+	identifier() {
+		return `container entry (${this._shareScope}) ${JSON.stringify(
+			this._exposes
+		)}`;
+	}
+
+	/**
+	 * @param {RequestShortener} requestShortener the request shortener
+	 * @returns {string} a user readable identifier of the module
+	 */
+	readableIdentifier(requestShortener) {
+		return "container entry";
+	}
+
+	/**
+	 * @param {LibIdentOptions} options options
+	 * @returns {string | null} an identifier for library inclusion
+	 */
+	libIdent(options) {
+		return `${this.layer ? `(${this.layer})/` : ""}webpack/container/entry/${
+			this._name
+		}`;
+	}
+
+	/**
+	 * @param {NeedBuildContext} context context info
+	 * @param {NeedBuildCallback} callback callback function, returns true, if the module needs a rebuild
+	 * @returns {void}
+	 */
+	needBuild(context, callback) {
+		return callback(null, !this.buildMeta);
+	}
+
+	/**
+	 * @param {WebpackOptions} options webpack options
+	 * @param {Compilation} compilation the compilation
+	 * @param {ResolverWithOptions} resolver the resolver
+	 * @param {InputFileSystem} fs the file system
+	 * @param {BuildCallback} callback callback function
+	 * @returns {void}
+	 */
+	build(options, compilation, resolver, fs, callback) {
+		this.buildMeta = {};
+		this.buildInfo = {
+			strict: true,
+			topLevelDeclarations: new Set(["moduleMap", "get", "init"])
+		};
+		this.buildMeta.exportsType = "namespace";
+
+		this.clearDependenciesAndBlocks();
+
+		for (const [name, options] of this._exposes) {
+			const block = new AsyncDependenciesBlock(
+				{
+					name: options.name
+				},
+				{ name },
+				options.import[options.import.length - 1]
+			);
+			let idx = 0;
+			for (const request of options.import) {
+				const dep = new ContainerExposedDependency(name, request);
+				dep.loc = {
+					name,
+					index: idx++
+				};
+
+				block.addDependency(dep);
+			}
+			this.addBlock(block);
+		}
+		this.addDependency(new StaticExportsDependency(["get", "init"], false));
+
+		callback();
+	}
+
+	/**
+	 * @param {CodeGenerationContext} context context for code generation
+	 * @returns {CodeGenerationResult} result
+	 */
+	codeGeneration({ moduleGraph, chunkGraph, runtimeTemplate }) {
+		const sources = new Map();
+		const runtimeRequirements = new Set([
+			RuntimeGlobals.definePropertyGetters,
+			RuntimeGlobals.hasOwnProperty,
+			RuntimeGlobals.exports
+		]);
+		const getters = [];
+
+		for (const block of this.blocks) {
+			const { dependencies } = block;
+
+			const modules = dependencies.map(dependency => {
+				const dep = /** @type {ContainerExposedDependency} */ (dependency);
+				return {
+					name: dep.exposedName,
+					module: moduleGraph.getModule(dep),
+					request: dep.userRequest
+				};
+			});
+
+			let str;
+
+			if (modules.some(m => !m.module)) {
+				str = runtimeTemplate.throwMissingModuleErrorBlock({
+					request: modules.map(m => m.request).join(", ")
+				});
+			} else {
+				str = `return ${runtimeTemplate.blockPromise({
+					block,
+					message: "",
+					chunkGraph,
+					runtimeRequirements
+				})}.then(${runtimeTemplate.returningFunction(
+					runtimeTemplate.returningFunction(
+						`(${modules
+							.map(({ module, request }) =>
+								runtimeTemplate.moduleRaw({
+									module,
+									chunkGraph,
+									request,
+									weak: false,
+									runtimeRequirements
+								})
+							)
+							.join(", ")})`
+					)
+				)});`;
+			}
+
+			getters.push(
+				`${JSON.stringify(modules[0].name)}: ${runtimeTemplate.basicFunction(
+					"",
+					str
+				)}`
+			);
+		}
+
+		const source = Template.asString([
+			"var moduleMap = {",
+			Template.indent(getters.join(",\n")),
+			"};",
+			`var get = ${runtimeTemplate.basicFunction("module, getScope", [
+				`${RuntimeGlobals.currentRemoteGetScope} = getScope;`,
+				// reusing the getScope variable to avoid creating a new var (and module is also used later)
+				"getScope = (",
+				Template.indent([
+					`${RuntimeGlobals.hasOwnProperty}(moduleMap, module)`,
+					Template.indent([
+						"? moduleMap[module]()",
+						`: Promise.resolve().then(${runtimeTemplate.basicFunction(
+							"",
+							"throw new Error('Module \"' + module + '\" does not exist in container.');"
+						)})`
+					])
+				]),
+				");",
+				`${RuntimeGlobals.currentRemoteGetScope} = undefined;`,
+				"return getScope;"
+			])};`,
+			`var init = ${runtimeTemplate.basicFunction("shareScope, initScope", [
+				`if (!${RuntimeGlobals.shareScopeMap}) return;`,
+				`var name = ${JSON.stringify(this._shareScope)}`,
+				`var oldScope = ${RuntimeGlobals.shareScopeMap}[name];`,
+				'if(oldScope && oldScope !== shareScope) throw new Error("Container initialization failed as it has already been initialized with a different share scope");',
+				`${RuntimeGlobals.shareScopeMap}[name] = shareScope;`,
+				`return ${RuntimeGlobals.initializeSharing}(name, initScope);`
+			])};`,
+			"",
+			"// This exports getters to disallow modifications",
+			`${RuntimeGlobals.definePropertyGetters}(exports, {`,
+			Template.indent([
+				`get: ${runtimeTemplate.returningFunction("get")},`,
+				`init: ${runtimeTemplate.returningFunction("init")}`
+			]),
+			"});"
+		]);
+
+		sources.set(
+			"javascript",
+			this.useSourceMap || this.useSimpleSourceMap
+				? new OriginalSource(source, "webpack/container-entry")
+				: new RawSource(source)
+		);
+
+		return {
+			sources,
+			runtimeRequirements
+		};
+	}
+
+	/**
+	 * @param {string=} type the source type for which the size should be estimated
+	 * @returns {number} the estimated size of the module (must be non-zero)
+	 */
+	size(type) {
+		return 42;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this._name);
+		write(this._exposes);
+		write(this._shareScope);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 * @returns {ContainerEntryModule} deserialized container entry module
+	 */
+	static deserialize(context) {
+		const { read } = context;
+		const obj = new ContainerEntryModule(read(), read(), read());
+		obj.deserialize(context);
+		return obj;
+	}
+}
+
+makeSerializable(
+	ContainerEntryModule,
+	"webpack/lib/container/ContainerEntryModule"
+);
+
+module.exports = ContainerEntryModule;
diff --git a/lib/container/ContainerEntryModuleFactory.js b/lib/container/ContainerEntryModuleFactory.js
new file mode 100644
index 00000000000..cff347bfd1d
--- /dev/null
+++ b/lib/container/ContainerEntryModuleFactory.js
@@ -0,0 +1,27 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra, Zackary Jackson @ScriptedAlchemy, Marais Rossouw @maraisr
+*/
+
+"use strict";
+
+const ModuleFactory = require("../ModuleFactory");
+const ContainerEntryModule = require("./ContainerEntryModule");
+
+/** @typedef {import("../ModuleFactory").ModuleFactoryCallback} ModuleFactoryCallback */
+/** @typedef {import("../ModuleFactory").ModuleFactoryCreateData} ModuleFactoryCreateData */
+/** @typedef {import("./ContainerEntryDependency")} ContainerEntryDependency */
+
+module.exports = class ContainerEntryModuleFactory extends ModuleFactory {
+	/**
+	 * @param {ModuleFactoryCreateData} data data object
+	 * @param {ModuleFactoryCallback} callback callback
+	 * @returns {void}
+	 */
+	create({ dependencies: [dependency] }, callback) {
+		const dep = /** @type {ContainerEntryDependency} */ (dependency);
+		callback(null, {
+			module: new ContainerEntryModule(dep.name, dep.exposes, dep.shareScope)
+		});
+	}
+};
diff --git a/lib/container/ContainerExposedDependency.js b/lib/container/ContainerExposedDependency.js
new file mode 100644
index 00000000000..2cbf04a694d
--- /dev/null
+++ b/lib/container/ContainerExposedDependency.js
@@ -0,0 +1,61 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra, Zackary Jackson @ScriptedAlchemy, Marais Rossouw @maraisr
+*/
+
+"use strict";
+
+const ModuleDependency = require("../dependencies/ModuleDependency");
+const makeSerializable = require("../util/makeSerializable");
+
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
+class ContainerExposedDependency extends ModuleDependency {
+	/**
+	 * @param {string} exposedName public name
+	 * @param {string} request request to module
+	 */
+	constructor(exposedName, request) {
+		super(request);
+		this.exposedName = exposedName;
+	}
+
+	get type() {
+		return "container exposed";
+	}
+
+	get category() {
+		return "esm";
+	}
+
+	/**
+	 * @returns {string | null} an identifier to merge equal requests
+	 */
+	getResourceIdentifier() {
+		return `exposed dependency ${this.exposedName}=${this.request}`;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		context.write(this.exposedName);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		this.exposedName = context.read();
+		super.deserialize(context);
+	}
+}
+
+makeSerializable(
+	ContainerExposedDependency,
+	"webpack/lib/container/ContainerExposedDependency"
+);
+
+module.exports = ContainerExposedDependency;
diff --git a/lib/container/ContainerPlugin.js b/lib/container/ContainerPlugin.js
new file mode 100644
index 00000000000..ec3fe84091d
--- /dev/null
+++ b/lib/container/ContainerPlugin.js
@@ -0,0 +1,119 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra, Zackary Jackson @ScriptedAlchemy, Marais Rossouw @maraisr
+*/
+
+"use strict";
+
+const createSchemaValidation = require("../util/create-schema-validation");
+const memoize = require("../util/memoize");
+const ContainerEntryDependency = require("./ContainerEntryDependency");
+const ContainerEntryModuleFactory = require("./ContainerEntryModuleFactory");
+const ContainerExposedDependency = require("./ContainerExposedDependency");
+const { parseOptions } = require("./options");
+
+/** @typedef {import("../../declarations/plugins/container/ContainerPlugin").ContainerPluginOptions} ContainerPluginOptions */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("./ContainerEntryModule").ExposeOptions} ExposeOptions */
+/** @typedef {import("./ContainerEntryModule").ExposesList} ExposesList */
+
+const getModuleFederationPlugin = memoize(() =>
+	require("./ModuleFederationPlugin")
+);
+
+const validate = createSchemaValidation(
+	require("../../schemas/plugins/container/ContainerPlugin.check.js"),
+	() => require("../../schemas/plugins/container/ContainerPlugin.json"),
+	{
+		name: "Container Plugin",
+		baseDataPath: "options"
+	}
+);
+
+const PLUGIN_NAME = "ContainerPlugin";
+
+class ContainerPlugin {
+	/**
+	 * @param {ContainerPluginOptions} options options
+	 */
+	constructor(options) {
+		validate(options);
+
+		this._options = {
+			name: options.name,
+			shareScope: options.shareScope || "default",
+			library: options.library || {
+				type: "var",
+				name: options.name
+			},
+			runtime: options.runtime,
+			filename: options.filename || undefined,
+			exposes: /** @type {ExposesList} */ (
+				parseOptions(
+					options.exposes,
+					item => ({
+						import: Array.isArray(item) ? item : [item],
+						name: undefined
+					}),
+					item => ({
+						import: Array.isArray(item.import) ? item.import : [item.import],
+						name: item.name || undefined
+					})
+				)
+			)
+		};
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		const { name, exposes, shareScope, filename, library, runtime } =
+			this._options;
+
+		if (!compiler.options.output.enabledLibraryTypes.includes(library.type)) {
+			compiler.options.output.enabledLibraryTypes.push(library.type);
+		}
+
+		compiler.hooks.make.tapAsync(PLUGIN_NAME, (compilation, callback) => {
+			const hooks =
+				getModuleFederationPlugin().getCompilationHooks(compilation);
+			const dep = new ContainerEntryDependency(name, exposes, shareScope);
+			dep.loc = { name };
+			compilation.addEntry(
+				/** @type {string} */ (compilation.options.context),
+				dep,
+				{
+					name,
+					filename,
+					runtime,
+					library
+				},
+				error => {
+					if (error) return callback(error);
+					hooks.addContainerEntryDependency.call(dep);
+					callback();
+				}
+			);
+		});
+
+		compiler.hooks.thisCompilation.tap(
+			PLUGIN_NAME,
+			(compilation, { normalModuleFactory }) => {
+				compilation.dependencyFactories.set(
+					ContainerEntryDependency,
+					new ContainerEntryModuleFactory()
+				);
+
+				compilation.dependencyFactories.set(
+					ContainerExposedDependency,
+					normalModuleFactory
+				);
+			}
+		);
+	}
+}
+
+module.exports = ContainerPlugin;
diff --git a/lib/container/ContainerReferencePlugin.js b/lib/container/ContainerReferencePlugin.js
new file mode 100644
index 00000000000..ba7bb011bbf
--- /dev/null
+++ b/lib/container/ContainerReferencePlugin.js
@@ -0,0 +1,140 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra and Zackary Jackson @ScriptedAlchemy
+*/
+
+"use strict";
+
+const ExternalsPlugin = require("../ExternalsPlugin");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const createSchemaValidation = require("../util/create-schema-validation");
+const FallbackDependency = require("./FallbackDependency");
+const FallbackItemDependency = require("./FallbackItemDependency");
+const FallbackModuleFactory = require("./FallbackModuleFactory");
+const RemoteModule = require("./RemoteModule");
+const RemoteRuntimeModule = require("./RemoteRuntimeModule");
+const RemoteToExternalDependency = require("./RemoteToExternalDependency");
+const { parseOptions } = require("./options");
+
+/** @typedef {import("../../declarations/plugins/container/ContainerReferencePlugin").ContainerReferencePluginOptions} ContainerReferencePluginOptions */
+/** @typedef {import("../../declarations/plugins/container/ContainerReferencePlugin").RemotesConfig} RemotesConfig */
+/** @typedef {import("../Compiler")} Compiler */
+
+const validate = createSchemaValidation(
+	require("../../schemas/plugins/container/ContainerReferencePlugin.check.js"),
+	() =>
+		require("../../schemas/plugins/container/ContainerReferencePlugin.json"),
+	{
+		name: "Container Reference Plugin",
+		baseDataPath: "options"
+	}
+);
+
+const slashCode = "/".charCodeAt(0);
+const PLUGIN_NAME = "ContainerReferencePlugin";
+
+class ContainerReferencePlugin {
+	/**
+	 * @param {ContainerReferencePluginOptions} options options
+	 */
+	constructor(options) {
+		validate(options);
+
+		this._remoteType = options.remoteType;
+		this._remotes = parseOptions(
+			options.remotes,
+			item => ({
+				external: Array.isArray(item) ? item : [item],
+				shareScope: options.shareScope || "default"
+			}),
+			item => ({
+				external: Array.isArray(item.external)
+					? item.external
+					: [item.external],
+				shareScope: item.shareScope || options.shareScope || "default"
+			})
+		);
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		const { _remotes: remotes, _remoteType: remoteType } = this;
+
+		/** @type {Record} */
+		const remoteExternals = {};
+		for (const [key, config] of remotes) {
+			let i = 0;
+			for (const external of config.external) {
+				if (external.startsWith("internal ")) continue;
+				remoteExternals[
+					`webpack/container/reference/${key}${i ? `/fallback-${i}` : ""}`
+				] = external;
+				i++;
+			}
+		}
+
+		new ExternalsPlugin(remoteType, remoteExternals).apply(compiler);
+
+		compiler.hooks.compilation.tap(
+			PLUGIN_NAME,
+			(compilation, { normalModuleFactory }) => {
+				compilation.dependencyFactories.set(
+					RemoteToExternalDependency,
+					normalModuleFactory
+				);
+
+				compilation.dependencyFactories.set(
+					FallbackItemDependency,
+					normalModuleFactory
+				);
+
+				compilation.dependencyFactories.set(
+					FallbackDependency,
+					new FallbackModuleFactory()
+				);
+
+				normalModuleFactory.hooks.factorize.tap(PLUGIN_NAME, data => {
+					if (!data.request.includes("!")) {
+						for (const [key, config] of remotes) {
+							if (
+								data.request.startsWith(`${key}`) &&
+								(data.request.length === key.length ||
+									data.request.charCodeAt(key.length) === slashCode)
+							) {
+								return new RemoteModule(
+									data.request,
+									config.external.map((external, i) =>
+										external.startsWith("internal ")
+											? external.slice(9)
+											: `webpack/container/reference/${key}${
+													i ? `/fallback-${i}` : ""
+												}`
+									),
+									`.${data.request.slice(key.length)}`,
+									config.shareScope
+								);
+							}
+						}
+					}
+				});
+
+				compilation.hooks.runtimeRequirementInTree
+					.for(RuntimeGlobals.ensureChunkHandlers)
+					.tap(PLUGIN_NAME, (chunk, set) => {
+						set.add(RuntimeGlobals.module);
+						set.add(RuntimeGlobals.moduleFactoriesAddOnly);
+						set.add(RuntimeGlobals.hasOwnProperty);
+						set.add(RuntimeGlobals.initializeSharing);
+						set.add(RuntimeGlobals.shareScopeMap);
+						compilation.addRuntimeModule(chunk, new RemoteRuntimeModule());
+					});
+			}
+		);
+	}
+}
+
+module.exports = ContainerReferencePlugin;
diff --git a/lib/container/FallbackDependency.js b/lib/container/FallbackDependency.js
new file mode 100644
index 00000000000..088720f5e32
--- /dev/null
+++ b/lib/container/FallbackDependency.js
@@ -0,0 +1,64 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const Dependency = require("../Dependency");
+const makeSerializable = require("../util/makeSerializable");
+
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
+class FallbackDependency extends Dependency {
+	/**
+	 * @param {string[]} requests requests
+	 */
+	constructor(requests) {
+		super();
+		this.requests = requests;
+	}
+
+	/**
+	 * @returns {string | null} an identifier to merge equal requests
+	 */
+	getResourceIdentifier() {
+		return `fallback ${this.requests.join(" ")}`;
+	}
+
+	get type() {
+		return "fallback";
+	}
+
+	get category() {
+		return "esm";
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.requests);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 * @returns {FallbackDependency} deserialize fallback dependency
+	 */
+	static deserialize(context) {
+		const { read } = context;
+		const obj = new FallbackDependency(read());
+		obj.deserialize(context);
+		return obj;
+	}
+}
+
+makeSerializable(
+	FallbackDependency,
+	"webpack/lib/container/FallbackDependency"
+);
+
+module.exports = FallbackDependency;
diff --git a/lib/container/FallbackItemDependency.js b/lib/container/FallbackItemDependency.js
new file mode 100644
index 00000000000..f09f8cf8c3c
--- /dev/null
+++ b/lib/container/FallbackItemDependency.js
@@ -0,0 +1,33 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const ModuleDependency = require("../dependencies/ModuleDependency");
+const makeSerializable = require("../util/makeSerializable");
+
+class FallbackItemDependency extends ModuleDependency {
+	/**
+	 * @param {string} request request
+	 */
+	constructor(request) {
+		super(request);
+	}
+
+	get type() {
+		return "fallback item";
+	}
+
+	get category() {
+		return "esm";
+	}
+}
+
+makeSerializable(
+	FallbackItemDependency,
+	"webpack/lib/container/FallbackItemDependency"
+);
+
+module.exports = FallbackItemDependency;
diff --git a/lib/container/FallbackModule.js b/lib/container/FallbackModule.js
new file mode 100644
index 00000000000..07963382944
--- /dev/null
+++ b/lib/container/FallbackModule.js
@@ -0,0 +1,186 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra and Zackary Jackson @ScriptedAlchemy
+*/
+
+"use strict";
+
+const { RawSource } = require("webpack-sources");
+const Module = require("../Module");
+const { JS_TYPES } = require("../ModuleSourceTypesConstants");
+const { WEBPACK_MODULE_TYPE_FALLBACK } = require("../ModuleTypeConstants");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+const makeSerializable = require("../util/makeSerializable");
+const FallbackItemDependency = require("./FallbackItemDependency");
+
+/** @typedef {import("../../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../ChunkGroup")} ChunkGroup */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Module").BuildCallback} BuildCallback */
+/** @typedef {import("../Module").CodeGenerationContext} CodeGenerationContext */
+/** @typedef {import("../Module").CodeGenerationResult} CodeGenerationResult */
+/** @typedef {import("../Module").LibIdentOptions} LibIdentOptions */
+/** @typedef {import("../Module").NeedBuildCallback} NeedBuildCallback */
+/** @typedef {import("../Module").NeedBuildContext} NeedBuildContext */
+/** @typedef {import("../Module").SourceTypes} SourceTypes */
+/** @typedef {import("../RequestShortener")} RequestShortener */
+/** @typedef {import("../ResolverFactory").ResolverWithOptions} ResolverWithOptions */
+/** @typedef {import("../WebpackError")} WebpackError */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("../util/fs").InputFileSystem} InputFileSystem */
+
+const RUNTIME_REQUIREMENTS = new Set([RuntimeGlobals.module]);
+
+class FallbackModule extends Module {
+	/**
+	 * @param {string[]} requests list of requests to choose one
+	 */
+	constructor(requests) {
+		super(WEBPACK_MODULE_TYPE_FALLBACK);
+		this.requests = requests;
+		this._identifier = `fallback ${this.requests.join(" ")}`;
+	}
+
+	/**
+	 * @returns {string} a unique identifier of the module
+	 */
+	identifier() {
+		return this._identifier;
+	}
+
+	/**
+	 * @param {RequestShortener} requestShortener the request shortener
+	 * @returns {string} a user readable identifier of the module
+	 */
+	readableIdentifier(requestShortener) {
+		return this._identifier;
+	}
+
+	/**
+	 * @param {LibIdentOptions} options options
+	 * @returns {string | null} an identifier for library inclusion
+	 */
+	libIdent(options) {
+		return `${this.layer ? `(${this.layer})/` : ""}webpack/container/fallback/${
+			this.requests[0]
+		}/and ${this.requests.length - 1} more`;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk which condition should be checked
+	 * @param {Compilation} compilation the compilation
+	 * @returns {boolean} true, if the chunk is ok for the module
+	 */
+	chunkCondition(chunk, { chunkGraph }) {
+		return chunkGraph.getNumberOfEntryModules(chunk) > 0;
+	}
+
+	/**
+	 * @param {NeedBuildContext} context context info
+	 * @param {NeedBuildCallback} callback callback function, returns true, if the module needs a rebuild
+	 * @returns {void}
+	 */
+	needBuild(context, callback) {
+		callback(null, !this.buildInfo);
+	}
+
+	/**
+	 * @param {WebpackOptions} options webpack options
+	 * @param {Compilation} compilation the compilation
+	 * @param {ResolverWithOptions} resolver the resolver
+	 * @param {InputFileSystem} fs the file system
+	 * @param {BuildCallback} callback callback function
+	 * @returns {void}
+	 */
+	build(options, compilation, resolver, fs, callback) {
+		this.buildMeta = {};
+		this.buildInfo = {
+			strict: true
+		};
+
+		this.clearDependenciesAndBlocks();
+		for (const request of this.requests)
+			this.addDependency(new FallbackItemDependency(request));
+
+		callback();
+	}
+
+	/**
+	 * @param {string=} type the source type for which the size should be estimated
+	 * @returns {number} the estimated size of the module (must be non-zero)
+	 */
+	size(type) {
+		return this.requests.length * 5 + 42;
+	}
+
+	/**
+	 * @returns {SourceTypes} types available (do not mutate)
+	 */
+	getSourceTypes() {
+		return JS_TYPES;
+	}
+
+	/**
+	 * @param {CodeGenerationContext} context context for code generation
+	 * @returns {CodeGenerationResult} result
+	 */
+	codeGeneration({ runtimeTemplate, moduleGraph, chunkGraph }) {
+		const ids = this.dependencies.map(dep =>
+			chunkGraph.getModuleId(/** @type {Module} */ (moduleGraph.getModule(dep)))
+		);
+		const code = Template.asString([
+			`var ids = ${JSON.stringify(ids)};`,
+			"var error, result, i = 0;",
+			`var loop = ${runtimeTemplate.basicFunction("next", [
+				"while(i < ids.length) {",
+				Template.indent([
+					`try { next = ${RuntimeGlobals.require}(ids[i++]); } catch(e) { return handleError(e); }`,
+					"if(next) return next.then ? next.then(handleResult, handleError) : handleResult(next);"
+				]),
+				"}",
+				"if(error) throw error;"
+			])}`,
+			`var handleResult = ${runtimeTemplate.basicFunction("result", [
+				"if(result) return result;",
+				"return loop();"
+			])};`,
+			`var handleError = ${runtimeTemplate.basicFunction("e", [
+				"error = e;",
+				"return loop();"
+			])};`,
+			"module.exports = loop();"
+		]);
+		const sources = new Map();
+		sources.set("javascript", new RawSource(code));
+		return { sources, runtimeRequirements: RUNTIME_REQUIREMENTS };
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.requests);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 * @returns {FallbackModule} deserialized fallback module
+	 */
+	static deserialize(context) {
+		const { read } = context;
+		const obj = new FallbackModule(read());
+		obj.deserialize(context);
+		return obj;
+	}
+}
+
+makeSerializable(FallbackModule, "webpack/lib/container/FallbackModule");
+
+module.exports = FallbackModule;
diff --git a/lib/container/FallbackModuleFactory.js b/lib/container/FallbackModuleFactory.js
new file mode 100644
index 00000000000..9ae5d427f32
--- /dev/null
+++ b/lib/container/FallbackModuleFactory.js
@@ -0,0 +1,27 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra, Zackary Jackson @ScriptedAlchemy, Marais Rossouw @maraisr
+*/
+
+"use strict";
+
+const ModuleFactory = require("../ModuleFactory");
+const FallbackModule = require("./FallbackModule");
+
+/** @typedef {import("../ModuleFactory").ModuleFactoryCallback} ModuleFactoryCallback */
+/** @typedef {import("../ModuleFactory").ModuleFactoryCreateData} ModuleFactoryCreateData */
+/** @typedef {import("./FallbackDependency")} FallbackDependency */
+
+module.exports = class FallbackModuleFactory extends ModuleFactory {
+	/**
+	 * @param {ModuleFactoryCreateData} data data object
+	 * @param {ModuleFactoryCallback} callback callback
+	 * @returns {void}
+	 */
+	create({ dependencies: [dependency] }, callback) {
+		const dep = /** @type {FallbackDependency} */ (dependency);
+		callback(null, {
+			module: new FallbackModule(dep.requests)
+		});
+	}
+};
diff --git a/lib/container/HoistContainerReferencesPlugin.js b/lib/container/HoistContainerReferencesPlugin.js
new file mode 100644
index 00000000000..3435c98ef2f
--- /dev/null
+++ b/lib/container/HoistContainerReferencesPlugin.js
@@ -0,0 +1,250 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Zackary Jackson @ScriptedAlchemy
+*/
+
+"use strict";
+
+const AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
+const ExternalModule = require("../ExternalModule");
+const { STAGE_ADVANCED } = require("../OptimizationStages");
+const memoize = require("../util/memoize");
+const { forEachRuntime } = require("../util/runtime");
+
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Module")} Module */
+
+const getModuleFederationPlugin = memoize(() =>
+	require("./ModuleFederationPlugin")
+);
+
+const PLUGIN_NAME = "HoistContainerReferences";
+
+/**
+ * This class is used to hoist container references in the code.
+ */
+class HoistContainerReferences {
+	/**
+	 * Apply the plugin to the compiler.
+	 * @param {Compiler} compiler The webpack compiler instance.
+	 */
+	apply(compiler) {
+		compiler.hooks.thisCompilation.tap(PLUGIN_NAME, compilation => {
+			const hooks =
+				getModuleFederationPlugin().getCompilationHooks(compilation);
+			const depsToTrace = new Set();
+			const entryExternalsToHoist = new Set();
+			hooks.addContainerEntryDependency.tap(PLUGIN_NAME, dep => {
+				depsToTrace.add(dep);
+			});
+			hooks.addFederationRuntimeDependency.tap(PLUGIN_NAME, dep => {
+				depsToTrace.add(dep);
+			});
+
+			compilation.hooks.addEntry.tap(PLUGIN_NAME, entryDep => {
+				if (entryDep.type === "entry") {
+					entryExternalsToHoist.add(entryDep);
+				}
+			});
+
+			// Hook into the optimizeChunks phase
+			compilation.hooks.optimizeChunks.tap(
+				{
+					name: PLUGIN_NAME,
+					// advanced stage is where SplitChunksPlugin runs.
+					stage: STAGE_ADVANCED + 1
+				},
+				chunks => {
+					this.hoistModulesInChunks(
+						compilation,
+						depsToTrace,
+						entryExternalsToHoist
+					);
+				}
+			);
+		});
+	}
+
+	/**
+	 * Hoist modules in chunks.
+	 * @param {Compilation} compilation The webpack compilation instance.
+	 * @param {Set} depsToTrace Set of container entry dependencies.
+	 * @param {Set} entryExternalsToHoist Set of container entry dependencies to hoist.
+	 */
+	hoistModulesInChunks(compilation, depsToTrace, entryExternalsToHoist) {
+		const { chunkGraph, moduleGraph } = compilation;
+
+		// loop over entry points
+		for (const dep of entryExternalsToHoist) {
+			const entryModule = moduleGraph.getModule(dep);
+			if (!entryModule) continue;
+			// get all the external module types and hoist them to the runtime chunk, this will get RemoteModule externals
+			const allReferencedModules = getAllReferencedModules(
+				compilation,
+				entryModule,
+				"external",
+				false
+			);
+
+			const containerRuntimes = chunkGraph.getModuleRuntimes(entryModule);
+			const runtimes = new Set();
+
+			for (const runtimeSpec of containerRuntimes) {
+				forEachRuntime(runtimeSpec, runtimeKey => {
+					if (runtimeKey) {
+						runtimes.add(runtimeKey);
+					}
+				});
+			}
+
+			for (const runtime of runtimes) {
+				const runtimeChunk = compilation.namedChunks.get(runtime);
+				if (!runtimeChunk) continue;
+
+				for (const module of allReferencedModules) {
+					if (!chunkGraph.isModuleInChunk(module, runtimeChunk)) {
+						chunkGraph.connectChunkAndModule(runtimeChunk, module);
+					}
+				}
+			}
+			this.cleanUpChunks(compilation, allReferencedModules);
+		}
+
+		// handle container entry specifically
+		for (const dep of depsToTrace) {
+			const containerEntryModule = moduleGraph.getModule(dep);
+			if (!containerEntryModule) continue;
+			const allReferencedModules = getAllReferencedModules(
+				compilation,
+				containerEntryModule,
+				"initial",
+				false
+			);
+
+			const allRemoteReferences = getAllReferencedModules(
+				compilation,
+				containerEntryModule,
+				"external",
+				false
+			);
+
+			for (const remote of allRemoteReferences) {
+				allReferencedModules.add(remote);
+			}
+
+			const containerRuntimes =
+				chunkGraph.getModuleRuntimes(containerEntryModule);
+			const runtimes = new Set();
+
+			for (const runtimeSpec of containerRuntimes) {
+				forEachRuntime(runtimeSpec, runtimeKey => {
+					if (runtimeKey) {
+						runtimes.add(runtimeKey);
+					}
+				});
+			}
+
+			for (const runtime of runtimes) {
+				const runtimeChunk = compilation.namedChunks.get(runtime);
+				if (!runtimeChunk) continue;
+
+				for (const module of allReferencedModules) {
+					if (!chunkGraph.isModuleInChunk(module, runtimeChunk)) {
+						chunkGraph.connectChunkAndModule(runtimeChunk, module);
+					}
+				}
+			}
+			this.cleanUpChunks(compilation, allReferencedModules);
+		}
+	}
+
+	/**
+	 * Clean up chunks by disconnecting unused modules.
+	 * @param {Compilation} compilation The webpack compilation instance.
+	 * @param {Set} modules Set of modules to clean up.
+	 */
+	cleanUpChunks(compilation, modules) {
+		const { chunkGraph } = compilation;
+		for (const module of modules) {
+			for (const chunk of chunkGraph.getModuleChunks(module)) {
+				if (!chunk.hasRuntime()) {
+					chunkGraph.disconnectChunkAndModule(chunk, module);
+					if (
+						chunkGraph.getNumberOfChunkModules(chunk) === 0 &&
+						chunkGraph.getNumberOfEntryModules(chunk) === 0
+					) {
+						chunkGraph.disconnectChunk(chunk);
+						compilation.chunks.delete(chunk);
+						if (chunk.name) {
+							compilation.namedChunks.delete(chunk.name);
+						}
+					}
+				}
+			}
+		}
+		modules.clear();
+	}
+}
+
+/**
+ * Helper method to collect all referenced modules recursively.
+ * @param {Compilation} compilation The webpack compilation instance.
+ * @param {Module} module The module to start collecting from.
+ * @param {string} type The type of modules to collect ("initial", "external", or "all").
+ * @param {boolean} includeInitial Should include the referenced module passed
+ * @returns {Set} Set of collected modules.
+ */
+function getAllReferencedModules(compilation, module, type, includeInitial) {
+	const collectedModules = new Set(includeInitial ? [module] : []);
+	const visitedModules = new WeakSet([module]);
+	const stack = [module];
+
+	while (stack.length > 0) {
+		const currentModule = stack.pop();
+		if (!currentModule) continue;
+
+		const outgoingConnections =
+			compilation.moduleGraph.getOutgoingConnections(currentModule);
+		if (outgoingConnections) {
+			for (const connection of outgoingConnections) {
+				const connectedModule = connection.module;
+
+				// Skip if module has already been visited
+				if (!connectedModule || visitedModules.has(connectedModule)) {
+					continue;
+				}
+
+				// Handle 'initial' type (skipping async blocks)
+				if (type === "initial") {
+					const parentBlock = compilation.moduleGraph.getParentBlock(
+						/** @type {Dependency} */
+						(connection.dependency)
+					);
+					if (parentBlock instanceof AsyncDependenciesBlock) {
+						continue;
+					}
+				}
+
+				// Handle 'external' type (collecting only external modules)
+				if (type === "external") {
+					if (connection.module instanceof ExternalModule) {
+						collectedModules.add(connectedModule);
+					}
+				} else {
+					// Handle 'all' or unspecified types
+					collectedModules.add(connectedModule);
+				}
+
+				// Add connected module to the stack and mark it as visited
+				visitedModules.add(connectedModule);
+				stack.push(connectedModule);
+			}
+		}
+	}
+
+	return collectedModules;
+}
+
+module.exports = HoistContainerReferences;
diff --git a/lib/container/ModuleFederationPlugin.js b/lib/container/ModuleFederationPlugin.js
new file mode 100644
index 00000000000..adbf36e1e2c
--- /dev/null
+++ b/lib/container/ModuleFederationPlugin.js
@@ -0,0 +1,132 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra and Zackary Jackson @ScriptedAlchemy
+*/
+
+"use strict";
+
+const { SyncHook } = require("tapable");
+const isValidExternalsType = require("../../schemas/plugins/container/ExternalsType.check.js");
+const Compilation = require("../Compilation");
+const SharePlugin = require("../sharing/SharePlugin");
+const createSchemaValidation = require("../util/create-schema-validation");
+const ContainerPlugin = require("./ContainerPlugin");
+const ContainerReferencePlugin = require("./ContainerReferencePlugin");
+const HoistContainerReferences = require("./HoistContainerReferencesPlugin");
+
+/** @typedef {import("../../declarations/plugins/container/ModuleFederationPlugin").ExternalsType} ExternalsType */
+/** @typedef {import("../../declarations/plugins/container/ModuleFederationPlugin").ModuleFederationPluginOptions} ModuleFederationPluginOptions */
+/** @typedef {import("../../declarations/plugins/container/ModuleFederationPlugin").Shared} Shared */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Dependency")} Dependency */
+
+/**
+ * @typedef {object} CompilationHooks
+ * @property {SyncHook} addContainerEntryDependency
+ * @property {SyncHook} addFederationRuntimeDependency
+ */
+
+const validate = createSchemaValidation(
+	require("../../schemas/plugins/container/ModuleFederationPlugin.check.js"),
+	() => require("../../schemas/plugins/container/ModuleFederationPlugin.json"),
+	{
+		name: "Module Federation Plugin",
+		baseDataPath: "options"
+	}
+);
+
+/** @type {WeakMap} */
+const compilationHooksMap = new WeakMap();
+const PLUGIN_NAME = "ModuleFederationPlugin";
+
+class ModuleFederationPlugin {
+	/**
+	 * @param {ModuleFederationPluginOptions} options options
+	 */
+	constructor(options) {
+		validate(options);
+
+		this._options = options;
+	}
+
+	/**
+	 * Get the compilation hooks associated with this plugin.
+	 * @param {Compilation} compilation The compilation instance.
+	 * @returns {CompilationHooks} The hooks for the compilation.
+	 */
+	static getCompilationHooks(compilation) {
+		if (!(compilation instanceof Compilation)) {
+			throw new TypeError(
+				"The 'compilation' argument must be an instance of Compilation"
+			);
+		}
+		let hooks = compilationHooksMap.get(compilation);
+		if (!hooks) {
+			hooks = {
+				addContainerEntryDependency: new SyncHook(["dependency"]),
+				addFederationRuntimeDependency: new SyncHook(["dependency"])
+			};
+			compilationHooksMap.set(compilation, hooks);
+		}
+		return hooks;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		const { _options: options } = this;
+		const library = options.library || { type: "var", name: options.name };
+		const remoteType =
+			options.remoteType ||
+			(options.library && isValidExternalsType(options.library.type)
+				? /** @type {ExternalsType} */ (options.library.type)
+				: "script");
+		if (
+			library &&
+			!compiler.options.output.enabledLibraryTypes.includes(library.type)
+		) {
+			compiler.options.output.enabledLibraryTypes.push(library.type);
+		}
+		compiler.hooks.afterPlugins.tap(PLUGIN_NAME, () => {
+			if (
+				options.exposes &&
+				(Array.isArray(options.exposes)
+					? options.exposes.length > 0
+					: Object.keys(options.exposes).length > 0)
+			) {
+				new ContainerPlugin({
+					name: /** @type {string} */ (options.name),
+					library,
+					filename: options.filename,
+					runtime: options.runtime,
+					shareScope: options.shareScope,
+					exposes: options.exposes
+				}).apply(compiler);
+			}
+			if (
+				options.remotes &&
+				(Array.isArray(options.remotes)
+					? options.remotes.length > 0
+					: Object.keys(options.remotes).length > 0)
+			) {
+				new ContainerReferencePlugin({
+					remoteType,
+					shareScope: options.shareScope,
+					remotes: options.remotes
+				}).apply(compiler);
+			}
+			if (options.shared) {
+				new SharePlugin({
+					shared: options.shared,
+					shareScope: options.shareScope
+				}).apply(compiler);
+			}
+			new HoistContainerReferences().apply(compiler);
+		});
+	}
+}
+
+module.exports = ModuleFederationPlugin;
diff --git a/lib/container/RemoteModule.js b/lib/container/RemoteModule.js
new file mode 100644
index 00000000000..9ff13fcfc0f
--- /dev/null
+++ b/lib/container/RemoteModule.js
@@ -0,0 +1,186 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra and Zackary Jackson @ScriptedAlchemy
+*/
+
+"use strict";
+
+const { RawSource } = require("webpack-sources");
+const Module = require("../Module");
+const {
+	REMOTE_AND_SHARE_INIT_TYPES
+} = require("../ModuleSourceTypesConstants");
+const { WEBPACK_MODULE_TYPE_REMOTE } = require("../ModuleTypeConstants");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const makeSerializable = require("../util/makeSerializable");
+const FallbackDependency = require("./FallbackDependency");
+const RemoteToExternalDependency = require("./RemoteToExternalDependency");
+
+/** @typedef {import("../../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../ChunkGroup")} ChunkGroup */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Module").BuildCallback} BuildCallback */
+/** @typedef {import("../Module").CodeGenerationContext} CodeGenerationContext */
+/** @typedef {import("../Module").CodeGenerationResult} CodeGenerationResult */
+/** @typedef {import("../Module").LibIdentOptions} LibIdentOptions */
+/** @typedef {import("../Module").NeedBuildCallback} NeedBuildCallback */
+/** @typedef {import("../Module").NeedBuildContext} NeedBuildContext */
+/** @typedef {import("../Module").SourceTypes} SourceTypes */
+/** @typedef {import("../RequestShortener")} RequestShortener */
+/** @typedef {import("../ResolverFactory").ResolverWithOptions} ResolverWithOptions */
+/** @typedef {import("../WebpackError")} WebpackError */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("../util/fs").InputFileSystem} InputFileSystem */
+
+const RUNTIME_REQUIREMENTS = new Set([RuntimeGlobals.module]);
+
+class RemoteModule extends Module {
+	/**
+	 * @param {string} request request string
+	 * @param {string[]} externalRequests list of external requests to containers
+	 * @param {string} internalRequest name of exposed module in container
+	 * @param {string} shareScope the used share scope name
+	 */
+	constructor(request, externalRequests, internalRequest, shareScope) {
+		super(WEBPACK_MODULE_TYPE_REMOTE);
+		this.request = request;
+		this.externalRequests = externalRequests;
+		this.internalRequest = internalRequest;
+		this.shareScope = shareScope;
+		this._identifier = `remote (${shareScope}) ${this.externalRequests.join(
+			" "
+		)} ${this.internalRequest}`;
+	}
+
+	/**
+	 * @returns {string} a unique identifier of the module
+	 */
+	identifier() {
+		return this._identifier;
+	}
+
+	/**
+	 * @param {RequestShortener} requestShortener the request shortener
+	 * @returns {string} a user readable identifier of the module
+	 */
+	readableIdentifier(requestShortener) {
+		return `remote ${this.request}`;
+	}
+
+	/**
+	 * @param {LibIdentOptions} options options
+	 * @returns {string | null} an identifier for library inclusion
+	 */
+	libIdent(options) {
+		return `${this.layer ? `(${this.layer})/` : ""}webpack/container/remote/${
+			this.request
+		}`;
+	}
+
+	/**
+	 * @param {NeedBuildContext} context context info
+	 * @param {NeedBuildCallback} callback callback function, returns true, if the module needs a rebuild
+	 * @returns {void}
+	 */
+	needBuild(context, callback) {
+		callback(null, !this.buildInfo);
+	}
+
+	/**
+	 * @param {WebpackOptions} options webpack options
+	 * @param {Compilation} compilation the compilation
+	 * @param {ResolverWithOptions} resolver the resolver
+	 * @param {InputFileSystem} fs the file system
+	 * @param {BuildCallback} callback callback function
+	 * @returns {void}
+	 */
+	build(options, compilation, resolver, fs, callback) {
+		this.buildMeta = {};
+		this.buildInfo = {
+			strict: true
+		};
+
+		this.clearDependenciesAndBlocks();
+		if (this.externalRequests.length === 1) {
+			this.addDependency(
+				new RemoteToExternalDependency(this.externalRequests[0])
+			);
+		} else {
+			this.addDependency(new FallbackDependency(this.externalRequests));
+		}
+
+		callback();
+	}
+
+	/**
+	 * @param {string=} type the source type for which the size should be estimated
+	 * @returns {number} the estimated size of the module (must be non-zero)
+	 */
+	size(type) {
+		return 6;
+	}
+
+	/**
+	 * @returns {SourceTypes} types available (do not mutate)
+	 */
+	getSourceTypes() {
+		return REMOTE_AND_SHARE_INIT_TYPES;
+	}
+
+	/**
+	 * @returns {string | null} absolute path which should be used for condition matching (usually the resource path)
+	 */
+	nameForCondition() {
+		return this.request;
+	}
+
+	/**
+	 * @param {CodeGenerationContext} context context for code generation
+	 * @returns {CodeGenerationResult} result
+	 */
+	codeGeneration({ runtimeTemplate, moduleGraph, chunkGraph }) {
+		const module = moduleGraph.getModule(this.dependencies[0]);
+		const id = module && chunkGraph.getModuleId(module);
+		const sources = new Map();
+		sources.set("remote", new RawSource(""));
+		const data = new Map();
+		data.set("share-init", [
+			{
+				shareScope: this.shareScope,
+				initStage: 20,
+				init: id === undefined ? "" : `initExternal(${JSON.stringify(id)});`
+			}
+		]);
+		return { sources, data, runtimeRequirements: RUNTIME_REQUIREMENTS };
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.request);
+		write(this.externalRequests);
+		write(this.internalRequest);
+		write(this.shareScope);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 * @returns {RemoteModule} deserialized module
+	 */
+	static deserialize(context) {
+		const { read } = context;
+		const obj = new RemoteModule(read(), read(), read(), read());
+		obj.deserialize(context);
+		return obj;
+	}
+}
+
+makeSerializable(RemoteModule, "webpack/lib/container/RemoteModule");
+
+module.exports = RemoteModule;
diff --git a/lib/container/RemoteRuntimeModule.js b/lib/container/RemoteRuntimeModule.js
new file mode 100644
index 00000000000..1e871e2da2f
--- /dev/null
+++ b/lib/container/RemoteRuntimeModule.js
@@ -0,0 +1,144 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+const Template = require("../Template");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Chunk").ChunkId} ChunkId */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../ChunkGraph").ModuleId} ModuleId */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("./RemoteModule")} RemoteModule */
+
+class RemoteRuntimeModule extends RuntimeModule {
+	constructor() {
+		super("remotes loading");
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const chunkGraph = /** @type {ChunkGraph} */ (this.chunkGraph);
+		const { runtimeTemplate, moduleGraph } = compilation;
+		/** @type {Record} */
+		const chunkToRemotesMapping = {};
+		/** @type {Record} */
+		const idToExternalAndNameMapping = {};
+		for (const chunk of /** @type {Chunk} */ (
+			this.chunk
+		).getAllReferencedChunks()) {
+			const modules = chunkGraph.getChunkModulesIterableBySourceType(
+				chunk,
+				"remote"
+			);
+			if (!modules) continue;
+			/** @type {ModuleId[]} */
+			const remotes = (chunkToRemotesMapping[
+				/** @type {ChunkId} */
+				(chunk.id)
+			] = []);
+			for (const m of modules) {
+				const module = /** @type {RemoteModule} */ (m);
+				const name = module.internalRequest;
+				const id = /** @type {ModuleId} */ (chunkGraph.getModuleId(module));
+				const shareScope = module.shareScope;
+				const dep = module.dependencies[0];
+				const externalModule = moduleGraph.getModule(dep);
+				const externalModuleId =
+					/** @type {ModuleId} */
+					(externalModule && chunkGraph.getModuleId(externalModule));
+				remotes.push(id);
+				idToExternalAndNameMapping[id] = [shareScope, name, externalModuleId];
+			}
+		}
+		return Template.asString([
+			`var chunkMapping = ${JSON.stringify(
+				chunkToRemotesMapping,
+				null,
+				"\t"
+			)};`,
+			`var idToExternalAndNameMapping = ${JSON.stringify(
+				idToExternalAndNameMapping,
+				null,
+				"\t"
+			)};`,
+			`${
+				RuntimeGlobals.ensureChunkHandlers
+			}.remotes = ${runtimeTemplate.basicFunction("chunkId, promises", [
+				`if(${RuntimeGlobals.hasOwnProperty}(chunkMapping, chunkId)) {`,
+				Template.indent([
+					`chunkMapping[chunkId].forEach(${runtimeTemplate.basicFunction("id", [
+						`var getScope = ${RuntimeGlobals.currentRemoteGetScope};`,
+						"if(!getScope) getScope = [];",
+						"var data = idToExternalAndNameMapping[id];",
+						"if(getScope.indexOf(data) >= 0) return;",
+						"getScope.push(data);",
+						"if(data.p) return promises.push(data.p);",
+						`var onError = ${runtimeTemplate.basicFunction("error", [
+							'if(!error) error = new Error("Container missing");',
+							'if(typeof error.message === "string")',
+							Template.indent(
+								"error.message += '\\nwhile loading \"' + data[1] + '\" from ' + data[2];"
+							),
+							`${
+								RuntimeGlobals.moduleFactories
+							}[id] = ${runtimeTemplate.basicFunction("", ["throw error;"])}`,
+							"data.p = 0;"
+						])};`,
+						`var handleFunction = ${runtimeTemplate.basicFunction(
+							"fn, arg1, arg2, d, next, first",
+							[
+								"try {",
+								Template.indent([
+									"var promise = fn(arg1, arg2);",
+									"if(promise && promise.then) {",
+									Template.indent([
+										`var p = promise.then(${runtimeTemplate.returningFunction(
+											"next(result, d)",
+											"result"
+										)}, onError);`,
+										"if(first) promises.push(data.p = p); else return p;"
+									]),
+									"} else {",
+									Template.indent(["return next(promise, d, first);"]),
+									"}"
+								]),
+								"} catch(error) {",
+								Template.indent(["onError(error);"]),
+								"}"
+							]
+						)}`,
+						`var onExternal = ${runtimeTemplate.returningFunction(
+							`external ? handleFunction(${RuntimeGlobals.initializeSharing}, data[0], 0, external, onInitialized, first) : onError()`,
+							"external, _, first"
+						)};`,
+						`var onInitialized = ${runtimeTemplate.returningFunction(
+							"handleFunction(external.get, data[1], getScope, 0, onFactory, first)",
+							"_, external, first"
+						)};`,
+						`var onFactory = ${runtimeTemplate.basicFunction("factory", [
+							"data.p = 1;",
+							`${
+								RuntimeGlobals.moduleFactories
+							}[id] = ${runtimeTemplate.basicFunction("module", [
+								"module.exports = factory();"
+							])}`
+						])};`,
+						`handleFunction(${RuntimeGlobals.require}, data[2], 0, 0, onExternal, 1);`
+					])});`
+				]),
+				"}"
+			])}`
+		]);
+	}
+}
+
+module.exports = RemoteRuntimeModule;
diff --git a/lib/container/RemoteToExternalDependency.js b/lib/container/RemoteToExternalDependency.js
new file mode 100644
index 00000000000..df7fd1f8158
--- /dev/null
+++ b/lib/container/RemoteToExternalDependency.js
@@ -0,0 +1,33 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const ModuleDependency = require("../dependencies/ModuleDependency");
+const makeSerializable = require("../util/makeSerializable");
+
+class RemoteToExternalDependency extends ModuleDependency {
+	/**
+	 * @param {string} request request
+	 */
+	constructor(request) {
+		super(request);
+	}
+
+	get type() {
+		return "remote to external";
+	}
+
+	get category() {
+		return "esm";
+	}
+}
+
+makeSerializable(
+	RemoteToExternalDependency,
+	"webpack/lib/container/RemoteToExternalDependency"
+);
+
+module.exports = RemoteToExternalDependency;
diff --git a/lib/container/options.js b/lib/container/options.js
new file mode 100644
index 00000000000..367d622613e
--- /dev/null
+++ b/lib/container/options.js
@@ -0,0 +1,105 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+/**
+ * @template T
+ * @typedef {Record} Item
+ */
+
+/**
+ * @template T
+ * @typedef {(string | Item)[] | Item} ContainerOptionsFormat
+ */
+
+/**
+ * @template T
+ * @template N
+ * @param {ContainerOptionsFormat} options options passed by the user
+ * @param {(item: string | string[], itemOrKey: string) => N} normalizeSimple normalize a simple item
+ * @param {(value: T, key: string) => N} normalizeOptions normalize a complex item
+ * @param {(item: string, normalized: N) => void} fn processing function
+ * @returns {void}
+ */
+const process = (options, normalizeSimple, normalizeOptions, fn) => {
+	/**
+	 * @param {(string | Item)[]} items items
+	 */
+	const array = items => {
+		for (const item of items) {
+			if (typeof item === "string") {
+				fn(item, normalizeSimple(item, item));
+			} else if (item && typeof item === "object") {
+				object(item);
+			} else {
+				throw new Error("Unexpected options format");
+			}
+		}
+	};
+	/**
+	 * @param {Item} obj an object
+	 */
+	const object = obj => {
+		for (const [key, value] of Object.entries(obj)) {
+			if (typeof value === "string" || Array.isArray(value)) {
+				fn(key, normalizeSimple(value, key));
+			} else {
+				fn(key, normalizeOptions(value, key));
+			}
+		}
+	};
+	if (!options) {
+		// Do nothing
+	} else if (Array.isArray(options)) {
+		array(options);
+	} else if (typeof options === "object") {
+		object(options);
+	} else {
+		throw new Error("Unexpected options format");
+	}
+};
+
+/**
+ * @template T
+ * @template R
+ * @param {ContainerOptionsFormat} options options passed by the user
+ * @param {(item: string | string[], itemOrKey: string) => R} normalizeSimple normalize a simple item
+ * @param {(value: T, key: string) => R} normalizeOptions normalize a complex item
+ * @returns {[string, R][]} parsed options
+ */
+const parseOptions = (options, normalizeSimple, normalizeOptions) => {
+	/** @type {[string, R][]} */
+	const items = [];
+	process(options, normalizeSimple, normalizeOptions, (key, value) => {
+		items.push([key, value]);
+	});
+	return items;
+};
+
+/**
+ * @template T
+ * @param {string} scope scope name
+ * @param {ContainerOptionsFormat} options options passed by the user
+ * @returns {Record} options to spread or pass
+ */
+const scope = (scope, options) => {
+	/** @type {Record} */
+	const obj = {};
+	process(
+		options,
+		item => /** @type {string | string[] | T} */ (item),
+		item => /** @type {string | string[] | T} */ (item),
+		(key, value) => {
+			obj[
+				key.startsWith("./") ? `${scope}${key.slice(1)}` : `${scope}/${key}`
+			] = value;
+		}
+	);
+	return obj;
+};
+
+module.exports.parseOptions = parseOptions;
+module.exports.scope = scope;
diff --git a/lib/css/CssGenerator.js b/lib/css/CssGenerator.js
new file mode 100644
index 00000000000..d717d9b4899
--- /dev/null
+++ b/lib/css/CssGenerator.js
@@ -0,0 +1,323 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Sergey Melyukov @smelukov
+*/
+
+"use strict";
+
+const { ReplaceSource, RawSource, ConcatSource } = require("webpack-sources");
+const { UsageState } = require("../ExportsInfo");
+const Generator = require("../Generator");
+const InitFragment = require("../InitFragment");
+const {
+	JS_AND_CSS_EXPORT_TYPES,
+	JS_AND_CSS_TYPES,
+	CSS_TYPES,
+	JS_TYPE,
+	CSS_TYPE
+} = require("../ModuleSourceTypesConstants");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../../declarations/WebpackOptions").CssAutoGeneratorOptions} CssAutoGeneratorOptions */
+/** @typedef {import("../../declarations/WebpackOptions").CssGlobalGeneratorOptions} CssGlobalGeneratorOptions */
+/** @typedef {import("../../declarations/WebpackOptions").CssModuleGeneratorOptions} CssModuleGeneratorOptions */
+/** @typedef {import("../CodeGenerationResults")} CodeGenerationResults */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../DependencyTemplate").CssData} CssData */
+/** @typedef {import("../DependencyTemplate").CssDependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../Generator").GenerateContext} GenerateContext */
+/** @typedef {import("../Generator").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../Module").BuildInfo} BuildInfo */
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
+/** @typedef {import("../Module").ConcatenationBailoutReasonContext} ConcatenationBailoutReasonContext */
+/** @typedef {import("../Module").SourceTypes} SourceTypes */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../NormalModule")} NormalModule */
+/** @typedef {import("../util/Hash")} Hash */
+
+class CssGenerator extends Generator {
+	/**
+	 * @param {CssAutoGeneratorOptions | CssGlobalGeneratorOptions | CssModuleGeneratorOptions} options options
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 */
+	constructor(options, moduleGraph) {
+		super();
+		this.convention = options.exportsConvention;
+		this.localIdentName = options.localIdentName;
+		this.exportsOnly = options.exportsOnly;
+		this.esModule = options.esModule;
+		this._moduleGraph = moduleGraph;
+	}
+
+	/**
+	 * @param {NormalModule} module module for which the bailout reason should be determined
+	 * @param {ConcatenationBailoutReasonContext} context context
+	 * @returns {string | undefined} reason why this module can't be concatenated, undefined when it can be concatenated
+	 */
+	getConcatenationBailoutReason(module, context) {
+		if (!this.esModule) {
+			return "Module is not an ECMAScript module";
+		}
+
+		return undefined;
+	}
+
+	/**
+	 * @param {NormalModule} module module for which the code should be generated
+	 * @param {GenerateContext} generateContext context for generate
+	 * @returns {Source | null} generated code
+	 */
+	generate(module, generateContext) {
+		const source =
+			generateContext.type === "javascript"
+				? new ReplaceSource(new RawSource(""))
+				: new ReplaceSource(/** @type {Source} */ (module.originalSource()));
+
+		/** @type {InitFragment[]} */
+		const initFragments = [];
+		/** @type {CssData} */
+		const cssData = {
+			esModule: /** @type {boolean} */ (this.esModule),
+			exports: new Map()
+		};
+
+		/** @type {InitFragment[] | undefined} */
+		let chunkInitFragments;
+		/** @type {DependencyTemplateContext} */
+		const templateContext = {
+			runtimeTemplate: generateContext.runtimeTemplate,
+			dependencyTemplates: generateContext.dependencyTemplates,
+			moduleGraph: generateContext.moduleGraph,
+			chunkGraph: generateContext.chunkGraph,
+			module,
+			runtime: generateContext.runtime,
+			runtimeRequirements: generateContext.runtimeRequirements,
+			concatenationScope: generateContext.concatenationScope,
+			codeGenerationResults:
+				/** @type {CodeGenerationResults} */
+				(generateContext.codeGenerationResults),
+			initFragments,
+			cssData,
+			get chunkInitFragments() {
+				if (!chunkInitFragments) {
+					const data =
+						/** @type {NonNullable} */
+						(generateContext.getData)();
+					chunkInitFragments = data.get("chunkInitFragments");
+					if (!chunkInitFragments) {
+						chunkInitFragments = [];
+						data.set("chunkInitFragments", chunkInitFragments);
+					}
+				}
+
+				return chunkInitFragments;
+			}
+		};
+
+		/**
+		 * @param {Dependency} dependency dependency
+		 */
+		const handleDependency = dependency => {
+			const constructor =
+				/** @type {new (...args: EXPECTED_ANY[]) => Dependency} */
+				(dependency.constructor);
+			const template = generateContext.dependencyTemplates.get(constructor);
+			if (!template) {
+				throw new Error(
+					`No template for dependency: ${dependency.constructor.name}`
+				);
+			}
+
+			template.apply(dependency, source, templateContext);
+		};
+
+		for (const dependency of module.dependencies) {
+			handleDependency(dependency);
+		}
+
+		switch (generateContext.type) {
+			case "javascript": {
+				/** @type {BuildInfo} */
+				(module.buildInfo).cssData = cssData;
+
+				generateContext.runtimeRequirements.add(RuntimeGlobals.module);
+
+				if (generateContext.concatenationScope) {
+					const source = new ConcatSource();
+					const usedIdentifiers = new Set();
+					for (const [name, v] of cssData.exports) {
+						const usedName = generateContext.moduleGraph
+							.getExportInfo(module, name)
+							.getUsedName(name, generateContext.runtime);
+						if (!usedName) {
+							continue;
+						}
+						let identifier = Template.toIdentifier(usedName);
+						const { RESERVED_IDENTIFIER } = require("../util/propertyName");
+						if (RESERVED_IDENTIFIER.has(identifier)) {
+							identifier = `_${identifier}`;
+						}
+						const i = 0;
+						while (usedIdentifiers.has(identifier)) {
+							identifier = Template.toIdentifier(name + i);
+						}
+						usedIdentifiers.add(identifier);
+						generateContext.concatenationScope.registerExport(name, identifier);
+						source.add(
+							`${
+								generateContext.runtimeTemplate.supportsConst()
+									? "const"
+									: "var"
+							} ${identifier} = ${JSON.stringify(v)};\n`
+						);
+					}
+					return source;
+				}
+
+				if (
+					cssData.exports.size === 0 &&
+					!(/** @type {BuildMeta} */ (module.buildMeta).isCSSModule)
+				) {
+					return new RawSource("");
+				}
+
+				const needNsObj =
+					this.esModule &&
+					generateContext.moduleGraph
+						.getExportsInfo(module)
+						.otherExportsInfo.getUsed(generateContext.runtime) !==
+						UsageState.Unused;
+
+				if (needNsObj) {
+					generateContext.runtimeRequirements.add(
+						RuntimeGlobals.makeNamespaceObject
+					);
+				}
+
+				const exports = [];
+
+				for (const [name, v] of cssData.exports) {
+					exports.push(`\t${JSON.stringify(name)}: ${JSON.stringify(v)}`);
+				}
+
+				return new RawSource(
+					`${needNsObj ? `${RuntimeGlobals.makeNamespaceObject}(` : ""}${
+						module.moduleArgument
+					}.exports = {\n${exports.join(",\n")}\n}${needNsObj ? ")" : ""};`
+				);
+			}
+			case "css": {
+				if (module.presentationalDependencies !== undefined) {
+					for (const dependency of module.presentationalDependencies) {
+						handleDependency(dependency);
+					}
+				}
+
+				generateContext.runtimeRequirements.add(RuntimeGlobals.hasCssModules);
+
+				return InitFragment.addToSource(source, initFragments, generateContext);
+			}
+			default:
+				return null;
+		}
+	}
+
+	/**
+	 * @param {Error} error the error
+	 * @param {NormalModule} module module for which the code should be generated
+	 * @param {GenerateContext} generateContext context for generate
+	 * @returns {Source | null} generated code
+	 */
+	generateError(error, module, generateContext) {
+		switch (generateContext.type) {
+			case "javascript": {
+				return new RawSource(
+					`throw new Error(${JSON.stringify(error.message)});`
+				);
+			}
+			case "css": {
+				return new RawSource(`/**\n ${error.message} \n**/`);
+			}
+			default:
+				return null;
+		}
+	}
+
+	/**
+	 * @param {NormalModule} module fresh module
+	 * @returns {SourceTypes} available types (do not mutate)
+	 */
+	getTypes(module) {
+		// TODO, find a better way to prevent the original module from being removed after concatenation, maybe it is a bug
+		if (this.exportsOnly) {
+			return JS_AND_CSS_EXPORT_TYPES;
+		}
+		const sourceTypes = new Set();
+		const connections = this._moduleGraph.getIncomingConnections(module);
+		for (const connection of connections) {
+			if (!connection.originModule) {
+				continue;
+			}
+			if (connection.originModule.type.split("/")[0] !== CSS_TYPE)
+				sourceTypes.add(JS_TYPE);
+		}
+		if (sourceTypes.has(JS_TYPE)) {
+			return JS_AND_CSS_TYPES;
+		}
+		return CSS_TYPES;
+	}
+
+	/**
+	 * @param {NormalModule} module the module
+	 * @param {string=} type source type
+	 * @returns {number} estimate size of the module
+	 */
+	getSize(module, type) {
+		switch (type) {
+			case "javascript": {
+				const cssData = /** @type {BuildInfo} */ (module.buildInfo).cssData;
+				if (!cssData) {
+					return 42;
+				}
+				if (cssData.exports.size === 0) {
+					if (/** @type {BuildMeta} */ (module.buildMeta).isCSSModule) {
+						return 42;
+					}
+					return 0;
+				}
+				const exports = cssData.exports;
+				const stringifiedExports = JSON.stringify(
+					Array.from(exports).reduce((obj, [key, value]) => {
+						obj[key] = value;
+						return obj;
+					}, /** @type {Record} */ ({}))
+				);
+
+				return stringifiedExports.length + 42;
+			}
+			case "css": {
+				const originalSource = module.originalSource();
+
+				if (!originalSource) {
+					return 0;
+				}
+
+				return originalSource.size();
+			}
+			default:
+				return 0;
+		}
+	}
+
+	/**
+	 * @param {Hash} hash hash that will be modified
+	 * @param {UpdateHashContext} updateHashContext context for updating hash
+	 */
+	updateHash(hash, { module }) {
+		hash.update(/** @type {boolean} */ (this.esModule).toString());
+	}
+}
+
+module.exports = CssGenerator;
diff --git a/lib/css/CssLoadingRuntimeModule.js b/lib/css/CssLoadingRuntimeModule.js
new file mode 100644
index 00000000000..1c46eebe552
--- /dev/null
+++ b/lib/css/CssLoadingRuntimeModule.js
@@ -0,0 +1,506 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { SyncWaterfallHook } = require("tapable");
+const Compilation = require("../Compilation");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+const Template = require("../Template");
+const compileBooleanMatcher = require("../util/compileBooleanMatcher");
+const { chunkHasCss } = require("./CssModulesPlugin");
+
+/** @typedef {import("../../declarations/WebpackOptions").Environment} Environment */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Compilation").RuntimeRequirementsContext} RuntimeRequirementsContext */
+/** @typedef {import("../Module").ReadOnlyRuntimeRequirements} ReadOnlyRuntimeRequirements */
+
+/**
+ * @typedef {object} CssLoadingRuntimeModulePluginHooks
+ * @property {SyncWaterfallHook<[string, Chunk]>} createStylesheet
+ * @property {SyncWaterfallHook<[string, Chunk]>} linkPreload
+ * @property {SyncWaterfallHook<[string, Chunk]>} linkPrefetch
+ */
+
+/** @type {WeakMap} */
+const compilationHooksMap = new WeakMap();
+
+class CssLoadingRuntimeModule extends RuntimeModule {
+	/**
+	 * @param {Compilation} compilation the compilation
+	 * @returns {CssLoadingRuntimeModulePluginHooks} hooks
+	 */
+	static getCompilationHooks(compilation) {
+		if (!(compilation instanceof Compilation)) {
+			throw new TypeError(
+				"The 'compilation' argument must be an instance of Compilation"
+			);
+		}
+		let hooks = compilationHooksMap.get(compilation);
+		if (hooks === undefined) {
+			hooks = {
+				createStylesheet: new SyncWaterfallHook(["source", "chunk"]),
+				linkPreload: new SyncWaterfallHook(["source", "chunk"]),
+				linkPrefetch: new SyncWaterfallHook(["source", "chunk"])
+			};
+			compilationHooksMap.set(compilation, hooks);
+		}
+		return hooks;
+	}
+
+	/**
+	 * @param {ReadOnlyRuntimeRequirements} runtimeRequirements runtime requirements
+	 */
+	constructor(runtimeRequirements) {
+		super("css loading", 10);
+
+		this._runtimeRequirements = runtimeRequirements;
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const { _runtimeRequirements } = this;
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const chunk = /** @type {Chunk} */ (this.chunk);
+		const {
+			chunkGraph,
+			runtimeTemplate,
+			outputOptions: {
+				crossOriginLoading,
+				uniqueName,
+				chunkLoadTimeout: loadTimeout,
+				charset
+			}
+		} = compilation;
+		const fn = RuntimeGlobals.ensureChunkHandlers;
+		const conditionMap = chunkGraph.getChunkConditionMap(
+			/** @type {Chunk} */ (chunk),
+			/**
+			 * @param {Chunk} chunk the chunk
+			 * @param {ChunkGraph} chunkGraph the chunk graph
+			 * @returns {boolean} true, if the chunk has css
+			 */
+			(chunk, chunkGraph) =>
+				Boolean(chunkGraph.getChunkModulesIterableBySourceType(chunk, "css"))
+		);
+		const hasCssMatcher = compileBooleanMatcher(conditionMap);
+
+		const withLoading =
+			_runtimeRequirements.has(RuntimeGlobals.ensureChunkHandlers) &&
+			hasCssMatcher !== false;
+		/** @type {boolean} */
+		const withHmr = _runtimeRequirements.has(
+			RuntimeGlobals.hmrDownloadUpdateHandlers
+		);
+		/** @type {Set} */
+		const initialChunkIds = new Set();
+		for (const c of /** @type {Chunk} */ (chunk).getAllInitialChunks()) {
+			if (chunkHasCss(c, chunkGraph)) {
+				initialChunkIds.add(c.id);
+			}
+		}
+
+		if (!withLoading && !withHmr) {
+			return null;
+		}
+
+		const environment =
+			/** @type {Environment} */
+			(compilation.outputOptions.environment);
+		const isNeutralPlatform = runtimeTemplate.isNeutralPlatform();
+		const withPrefetch =
+			this._runtimeRequirements.has(RuntimeGlobals.prefetchChunkHandlers) &&
+			(environment.document || isNeutralPlatform) &&
+			chunk.hasChildByOrder(chunkGraph, "prefetch", true, chunkHasCss);
+		const withPreload =
+			this._runtimeRequirements.has(RuntimeGlobals.preloadChunkHandlers) &&
+			(environment.document || isNeutralPlatform) &&
+			chunk.hasChildByOrder(chunkGraph, "preload", true, chunkHasCss);
+
+		const { linkPreload, linkPrefetch } =
+			CssLoadingRuntimeModule.getCompilationHooks(compilation);
+
+		const withFetchPriority = _runtimeRequirements.has(
+			RuntimeGlobals.hasFetchPriority
+		);
+
+		const { createStylesheet } =
+			CssLoadingRuntimeModule.getCompilationHooks(compilation);
+
+		const stateExpression = withHmr
+			? `${RuntimeGlobals.hmrRuntimeStatePrefix}_css`
+			: undefined;
+
+		const code = Template.asString([
+			"link = document.createElement('link');",
+			charset ? "link.charset = 'utf-8';" : "",
+			`if (${RuntimeGlobals.scriptNonce}) {`,
+			Template.indent(
+				`link.setAttribute("nonce", ${RuntimeGlobals.scriptNonce});`
+			),
+			"}",
+			uniqueName
+				? 'link.setAttribute("data-webpack", uniqueName + ":" + key);'
+				: "",
+			withFetchPriority
+				? Template.asString([
+						"if(fetchPriority) {",
+						Template.indent(
+							'link.setAttribute("fetchpriority", fetchPriority);'
+						),
+						"}"
+					])
+				: "",
+			"link.setAttribute(loadingAttribute, 1);",
+			'link.rel = "stylesheet";',
+			"link.href = url;",
+			crossOriginLoading
+				? crossOriginLoading === "use-credentials"
+					? 'link.crossOrigin = "use-credentials";'
+					: Template.asString([
+							"if (link.href.indexOf(window.location.origin + '/') !== 0) {",
+							Template.indent(
+								`link.crossOrigin = ${JSON.stringify(crossOriginLoading)};`
+							),
+							"}"
+						])
+				: ""
+		]);
+
+		return Template.asString([
+			"// object to store loaded and loading chunks",
+			"// undefined = chunk not loaded, null = chunk preloaded/prefetched",
+			"// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded",
+			`var installedChunks = ${
+				stateExpression ? `${stateExpression} = ${stateExpression} || ` : ""
+			}{`,
+			Template.indent(
+				Array.from(initialChunkIds, id => `${JSON.stringify(id)}: 0`).join(
+					",\n"
+				)
+			),
+			"};",
+			"",
+			uniqueName
+				? `var uniqueName = ${JSON.stringify(
+						runtimeTemplate.outputOptions.uniqueName
+					)};`
+				: "// data-webpack is not used as build has no uniqueName",
+			withLoading || withHmr
+				? Template.asString([
+						'var loadingAttribute = "data-webpack-loading";',
+						`var loadStylesheet = ${runtimeTemplate.basicFunction(
+							`chunkId, url, done${
+								withFetchPriority ? ", fetchPriority" : ""
+							}${withHmr ? ", hmr" : ""}`,
+							[
+								'var link, needAttach, key = "chunk-" + chunkId;',
+								withHmr ? "if(!hmr) {" : "",
+								'var links = document.getElementsByTagName("link");',
+								"for(var i = 0; i < links.length; i++) {",
+								Template.indent([
+									"var l = links[i];",
+									`if(l.rel == "stylesheet" && (${
+										withHmr
+											? 'l.href.startsWith(url) || l.getAttribute("href").startsWith(url)'
+											: 'l.href == url || l.getAttribute("href") == url'
+									}${
+										uniqueName
+											? ' || l.getAttribute("data-webpack") == uniqueName + ":" + key'
+											: ""
+									})) { link = l; break; }`
+								]),
+								"}",
+								"if(!done) return link;",
+								withHmr ? "}" : "",
+								"if(!link) {",
+								Template.indent([
+									"needAttach = true;",
+									createStylesheet.call(code, /** @type {Chunk} */ (this.chunk))
+								]),
+								"}",
+								`var onLinkComplete = ${runtimeTemplate.basicFunction(
+									"prev, event",
+									Template.asString([
+										"link.onerror = link.onload = null;",
+										"link.removeAttribute(loadingAttribute);",
+										"clearTimeout(timeout);",
+										'if(event && event.type != "load") link.parentNode.removeChild(link)',
+										"done(event);",
+										"if(prev) return prev(event);"
+									])
+								)};`,
+								"if(link.getAttribute(loadingAttribute)) {",
+								Template.indent([
+									`var timeout = setTimeout(onLinkComplete.bind(null, undefined, { type: 'timeout', target: link }), ${loadTimeout});`,
+									"link.onerror = onLinkComplete.bind(null, link.onerror);",
+									"link.onload = onLinkComplete.bind(null, link.onload);"
+								]),
+								"} else onLinkComplete(undefined, { type: 'load', target: link });", // We assume any existing stylesheet is render blocking
+								withHmr && withFetchPriority
+									? 'if (hmr && hmr.getAttribute("fetchpriority")) link.setAttribute("fetchpriority", hmr.getAttribute("fetchpriority"));'
+									: "",
+								withHmr ? "hmr ? document.head.insertBefore(link, hmr) :" : "",
+								"needAttach && document.head.appendChild(link);",
+								"return link;"
+							]
+						)};`
+					])
+				: "",
+			withLoading
+				? Template.asString([
+						`${fn}.css = ${runtimeTemplate.basicFunction(
+							`chunkId, promises${withFetchPriority ? " , fetchPriority" : ""}`,
+							[
+								"// css chunk loading",
+								`var installedChunkData = ${RuntimeGlobals.hasOwnProperty}(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;`,
+								'if(installedChunkData !== 0) { // 0 means "already installed".',
+								Template.indent([
+									"",
+									'// a Promise means "currently loading".',
+									"if(installedChunkData) {",
+									Template.indent(["promises.push(installedChunkData[2]);"]),
+									"} else {",
+									Template.indent([
+										hasCssMatcher === true
+											? "if(true) { // all chunks have CSS"
+											: `if(${hasCssMatcher("chunkId")}) {`,
+										Template.indent([
+											"// setup Promise in chunk cache",
+											`var promise = new Promise(${runtimeTemplate.expressionFunction(
+												"installedChunkData = installedChunks[chunkId] = [resolve, reject]",
+												"resolve, reject"
+											)});`,
+											"promises.push(installedChunkData[2] = promise);",
+											"",
+											"// start chunk loading",
+											`var url = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.getChunkCssFilename}(chunkId);`,
+											"// create error before stack unwound to get useful stacktrace later",
+											"var error = new Error();",
+											`var loadingEnded = ${runtimeTemplate.basicFunction(
+												"event",
+												[
+													`if(${RuntimeGlobals.hasOwnProperty}(installedChunks, chunkId)) {`,
+													Template.indent([
+														"installedChunkData = installedChunks[chunkId];",
+														"if(installedChunkData !== 0) installedChunks[chunkId] = undefined;",
+														"if(installedChunkData) {",
+														Template.indent([
+															'if(event.type !== "load") {',
+															Template.indent([
+																"var errorType = event && event.type;",
+																"var realHref = event && event.target && event.target.href;",
+																"error.message = 'Loading css chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realHref + ')';",
+																"error.name = 'ChunkLoadError';",
+																"error.type = errorType;",
+																"error.request = realHref;",
+																"installedChunkData[1](error);"
+															]),
+															"} else {",
+															Template.indent([
+																"installedChunks[chunkId] = 0;",
+																"installedChunkData[0]();"
+															]),
+															"}"
+														]),
+														"}"
+													]),
+													"}"
+												]
+											)};`,
+											isNeutralPlatform
+												? "if (typeof document !== 'undefined') {"
+												: "",
+											Template.indent([
+												`loadStylesheet(chunkId, url, loadingEnded${
+													withFetchPriority ? ", fetchPriority" : ""
+												});`
+											]),
+											isNeutralPlatform
+												? "} else { loadingEnded({ type: 'load' }); }"
+												: ""
+										]),
+										"} else installedChunks[chunkId] = 0;"
+									]),
+									"}"
+								]),
+								"}"
+							]
+						)};`
+					])
+				: "// no chunk loading",
+			"",
+			withPrefetch && hasCssMatcher !== false
+				? `${
+						RuntimeGlobals.prefetchChunkHandlers
+					}.s = ${runtimeTemplate.basicFunction("chunkId", [
+						`if((!${
+							RuntimeGlobals.hasOwnProperty
+						}(installedChunks, chunkId) || installedChunks[chunkId] === undefined) && ${
+							hasCssMatcher === true ? "true" : hasCssMatcher("chunkId")
+						}) {`,
+						Template.indent([
+							"installedChunks[chunkId] = null;",
+							isNeutralPlatform
+								? "if (typeof document === 'undefined') return;"
+								: "",
+							linkPrefetch.call(
+								Template.asString([
+									"var link = document.createElement('link');",
+									charset ? "link.charset = 'utf-8';" : "",
+									crossOriginLoading
+										? `link.crossOrigin = ${JSON.stringify(
+												crossOriginLoading
+											)};`
+										: "",
+									`if (${RuntimeGlobals.scriptNonce}) {`,
+									Template.indent(
+										`link.setAttribute("nonce", ${RuntimeGlobals.scriptNonce});`
+									),
+									"}",
+									'link.rel = "prefetch";',
+									'link.as = "style";',
+									`link.href = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.getChunkCssFilename}(chunkId);`
+								]),
+								chunk
+							),
+							"document.head.appendChild(link);"
+						]),
+						"}"
+					])};`
+				: "// no prefetching",
+			"",
+			withPreload && hasCssMatcher !== false
+				? `${
+						RuntimeGlobals.preloadChunkHandlers
+					}.s = ${runtimeTemplate.basicFunction("chunkId", [
+						`if((!${
+							RuntimeGlobals.hasOwnProperty
+						}(installedChunks, chunkId) || installedChunks[chunkId] === undefined) && ${
+							hasCssMatcher === true ? "true" : hasCssMatcher("chunkId")
+						}) {`,
+						Template.indent([
+							"installedChunks[chunkId] = null;",
+							isNeutralPlatform
+								? "if (typeof document === 'undefined') return;"
+								: "",
+							linkPreload.call(
+								Template.asString([
+									"var link = document.createElement('link');",
+									charset ? "link.charset = 'utf-8';" : "",
+									`if (${RuntimeGlobals.scriptNonce}) {`,
+									Template.indent(
+										`link.setAttribute("nonce", ${RuntimeGlobals.scriptNonce});`
+									),
+									"}",
+									'link.rel = "preload";',
+									'link.as = "style";',
+									`link.href = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.getChunkCssFilename}(chunkId);`,
+									crossOriginLoading
+										? crossOriginLoading === "use-credentials"
+											? 'link.crossOrigin = "use-credentials";'
+											: Template.asString([
+													"if (link.href.indexOf(window.location.origin + '/') !== 0) {",
+													Template.indent(
+														`link.crossOrigin = ${JSON.stringify(
+															crossOriginLoading
+														)};`
+													),
+													"}"
+												])
+										: ""
+								]),
+								chunk
+							),
+							"document.head.appendChild(link);"
+						]),
+						"}"
+					])};`
+				: "// no preloaded",
+			withHmr
+				? Template.asString([
+						"var oldTags = [];",
+						"var newTags = [];",
+						`var applyHandler = ${runtimeTemplate.basicFunction("options", [
+							`return { dispose: ${runtimeTemplate.basicFunction("", [
+								"while(oldTags.length) {",
+								Template.indent([
+									"var oldTag = oldTags.pop();",
+									"if(oldTag.parentNode) oldTag.parentNode.removeChild(oldTag);"
+								]),
+								"}"
+							])}, apply: ${runtimeTemplate.basicFunction("", [
+								"while(newTags.length) {",
+								Template.indent([
+									"var newTag = newTags.pop();",
+									"newTag.sheet.disabled = false"
+								]),
+								"}"
+							])} };`
+						])}`,
+						`var cssTextKey = ${runtimeTemplate.returningFunction(
+							`Array.from(link.sheet.cssRules, ${runtimeTemplate.returningFunction(
+								"r.cssText",
+								"r"
+							)}).join()`,
+							"link"
+						)};`,
+						`${
+							RuntimeGlobals.hmrDownloadUpdateHandlers
+						}.css = ${runtimeTemplate.basicFunction(
+							"chunkIds, removedChunks, removedModules, promises, applyHandlers, updatedModulesList",
+							[
+								isNeutralPlatform
+									? "if (typeof document === 'undefined') return;"
+									: "",
+								"applyHandlers.push(applyHandler);",
+								`chunkIds.forEach(${runtimeTemplate.basicFunction("chunkId", [
+									`var filename = ${RuntimeGlobals.getChunkCssFilename}(chunkId);`,
+									`var url = ${RuntimeGlobals.publicPath} + filename;`,
+									"var oldTag = loadStylesheet(chunkId, url);",
+									"if(!oldTag) return;",
+									`promises.push(new Promise(${runtimeTemplate.basicFunction(
+										"resolve, reject",
+										[
+											`var link = loadStylesheet(chunkId, url + (url.indexOf("?") < 0 ? "?" : "&") + "hmr=" + Date.now(), ${runtimeTemplate.basicFunction(
+												"event",
+												[
+													'if(event.type !== "load") {',
+													Template.indent([
+														"var errorType = event && event.type;",
+														"var realHref = event && event.target && event.target.href;",
+														"error.message = 'Loading css hot update chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realHref + ')';",
+														"error.name = 'ChunkLoadError';",
+														"error.type = errorType;",
+														"error.request = realHref;",
+														"reject(error);"
+													]),
+													"} else {",
+													Template.indent([
+														"try { if(cssTextKey(oldTag) == cssTextKey(link)) { if(link.parentNode) link.parentNode.removeChild(link); return resolve(); } } catch(e) {}",
+														"link.sheet.disabled = true;",
+														"oldTags.push(oldTag);",
+														"newTags.push(link);",
+														"resolve();"
+													]),
+													"}"
+												]
+											)}, ${withFetchPriority ? "undefined," : ""} oldTag);`
+										]
+									)}));`
+								])});`
+							]
+						)}`
+					])
+				: "// no hmr"
+		]);
+	}
+}
+
+module.exports = CssLoadingRuntimeModule;
diff --git a/lib/css/CssModulesPlugin.js b/lib/css/CssModulesPlugin.js
new file mode 100644
index 00000000000..4e0a569adab
--- /dev/null
+++ b/lib/css/CssModulesPlugin.js
@@ -0,0 +1,921 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { SyncWaterfallHook, SyncHook } = require("tapable");
+const {
+	ConcatSource,
+	PrefixSource,
+	ReplaceSource,
+	CachedSource,
+	RawSource
+} = require("webpack-sources");
+const Compilation = require("../Compilation");
+const CssModule = require("../CssModule");
+const { tryRunOrWebpackError } = require("../HookWebpackError");
+const HotUpdateChunk = require("../HotUpdateChunk");
+const {
+	CSS_MODULE_TYPE,
+	CSS_MODULE_TYPE_GLOBAL,
+	CSS_MODULE_TYPE_MODULE,
+	CSS_MODULE_TYPE_AUTO
+} = require("../ModuleTypeConstants");
+const NormalModule = require("../NormalModule");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const SelfModuleFactory = require("../SelfModuleFactory");
+const Template = require("../Template");
+const WebpackError = require("../WebpackError");
+const CssIcssExportDependency = require("../dependencies/CssIcssExportDependency");
+const CssIcssImportDependency = require("../dependencies/CssIcssImportDependency");
+const CssIcssSymbolDependency = require("../dependencies/CssIcssSymbolDependency");
+const CssImportDependency = require("../dependencies/CssImportDependency");
+const CssLocalIdentifierDependency = require("../dependencies/CssLocalIdentifierDependency");
+const CssSelfLocalIdentifierDependency = require("../dependencies/CssSelfLocalIdentifierDependency");
+const CssUrlDependency = require("../dependencies/CssUrlDependency");
+const StaticExportsDependency = require("../dependencies/StaticExportsDependency");
+const JavascriptModulesPlugin = require("../javascript/JavascriptModulesPlugin");
+const { compareModulesByIdOrIdentifier } = require("../util/comparators");
+const createSchemaValidation = require("../util/create-schema-validation");
+const createHash = require("../util/createHash");
+const { getUndoPath } = require("../util/identifier");
+const memoize = require("../util/memoize");
+const nonNumericOnlyHash = require("../util/nonNumericOnlyHash");
+const removeBOM = require("../util/removeBOM");
+const CssGenerator = require("./CssGenerator");
+const CssParser = require("./CssParser");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../../declarations/WebpackOptions").HashFunction} HashFunction */
+/** @typedef {import("../../declarations/WebpackOptions").OutputNormalized} OutputOptions */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../CodeGenerationResults")} CodeGenerationResults */
+/** @typedef {import("../Compilation").ChunkHashContext} ChunkHashContext */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../CssModule").Inheritance} Inheritance */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../Module").BuildInfo} BuildInfo */
+/** @typedef {import("../Template").RuntimeTemplate} RuntimeTemplate */
+/** @typedef {import("../TemplatedPathPlugin").TemplatePath} TemplatePath */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("../util/memoize")} Memoize */
+
+/**
+ * @typedef {object} RenderContext
+ * @property {Chunk} chunk the chunk
+ * @property {ChunkGraph} chunkGraph the chunk graph
+ * @property {CodeGenerationResults} codeGenerationResults results of code generation
+ * @property {RuntimeTemplate} runtimeTemplate the runtime template
+ * @property {string} uniqueName the unique name
+ * @property {string} undoPath undo path to css file
+ * @property {CssModule[]} modules modules
+ */
+
+/**
+ * @typedef {object} ChunkRenderContext
+ * @property {Chunk} chunk the chunk
+ * @property {ChunkGraph} chunkGraph the chunk graph
+ * @property {CodeGenerationResults} codeGenerationResults results of code generation
+ * @property {RuntimeTemplate} runtimeTemplate the runtime template
+ * @property {string} undoPath undo path to css file
+ */
+
+/**
+ * @typedef {object} CompilationHooks
+ * @property {SyncWaterfallHook<[Source, Module, ChunkRenderContext]>} renderModulePackage
+ * @property {SyncHook<[Chunk, Hash, ChunkHashContext]>} chunkHash
+ */
+
+const getCssLoadingRuntimeModule = memoize(() =>
+	require("./CssLoadingRuntimeModule")
+);
+
+/**
+ * @param {string} name name
+ * @returns {{ oneOf: [{ $ref: string }], definitions: import("../../schemas/WebpackOptions.json")["definitions"] }} schema
+ */
+const getSchema = name => {
+	const { definitions } = require("../../schemas/WebpackOptions.json");
+	return {
+		definitions,
+		oneOf: [{ $ref: `#/definitions/${name}` }]
+	};
+};
+
+const generatorValidationOptions = {
+	name: "Css Modules Plugin",
+	baseDataPath: "generator"
+};
+const validateGeneratorOptions = {
+	css: createSchemaValidation(
+		require("../../schemas/plugins/css/CssGeneratorOptions.check.js"),
+		() => getSchema("CssGeneratorOptions"),
+		generatorValidationOptions
+	),
+	"css/auto": createSchemaValidation(
+		require("../../schemas/plugins/css/CssAutoGeneratorOptions.check.js"),
+		() => getSchema("CssAutoGeneratorOptions"),
+		generatorValidationOptions
+	),
+	"css/module": createSchemaValidation(
+		require("../../schemas/plugins/css/CssModuleGeneratorOptions.check.js"),
+		() => getSchema("CssModuleGeneratorOptions"),
+		generatorValidationOptions
+	),
+	"css/global": createSchemaValidation(
+		require("../../schemas/plugins/css/CssGlobalGeneratorOptions.check.js"),
+		() => getSchema("CssGlobalGeneratorOptions"),
+		generatorValidationOptions
+	)
+};
+
+const parserValidationOptions = {
+	name: "Css Modules Plugin",
+	baseDataPath: "parser"
+};
+const validateParserOptions = {
+	css: createSchemaValidation(
+		require("../../schemas/plugins/css/CssParserOptions.check.js"),
+		() => getSchema("CssParserOptions"),
+		parserValidationOptions
+	),
+	"css/auto": createSchemaValidation(
+		require("../../schemas/plugins/css/CssAutoParserOptions.check.js"),
+		() => getSchema("CssAutoParserOptions"),
+		parserValidationOptions
+	),
+	"css/module": createSchemaValidation(
+		require("../../schemas/plugins/css/CssModuleParserOptions.check.js"),
+		() => getSchema("CssModuleParserOptions"),
+		parserValidationOptions
+	),
+	"css/global": createSchemaValidation(
+		require("../../schemas/plugins/css/CssGlobalParserOptions.check.js"),
+		() => getSchema("CssGlobalParserOptions"),
+		parserValidationOptions
+	)
+};
+
+/** @type {WeakMap} */
+const compilationHooksMap = new WeakMap();
+
+const PLUGIN_NAME = "CssModulesPlugin";
+
+class CssModulesPlugin {
+	/**
+	 * @param {Compilation} compilation the compilation
+	 * @returns {CompilationHooks} the attached hooks
+	 */
+	static getCompilationHooks(compilation) {
+		if (!(compilation instanceof Compilation)) {
+			throw new TypeError(
+				"The 'compilation' argument must be an instance of Compilation"
+			);
+		}
+		let hooks = compilationHooksMap.get(compilation);
+		if (hooks === undefined) {
+			hooks = {
+				renderModulePackage: new SyncWaterfallHook([
+					"source",
+					"module",
+					"renderContext"
+				]),
+				chunkHash: new SyncHook(["chunk", "hash", "context"])
+			};
+			compilationHooksMap.set(compilation, hooks);
+		}
+		return hooks;
+	}
+
+	constructor() {
+		/** @type {WeakMap} */
+		this._moduleFactoryCache = new WeakMap();
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(
+			PLUGIN_NAME,
+			(compilation, { normalModuleFactory }) => {
+				const hooks = CssModulesPlugin.getCompilationHooks(compilation);
+				const selfFactory = new SelfModuleFactory(compilation.moduleGraph);
+				compilation.dependencyFactories.set(
+					CssImportDependency,
+					normalModuleFactory
+				);
+				compilation.dependencyTemplates.set(
+					CssImportDependency,
+					new CssImportDependency.Template()
+				);
+				compilation.dependencyFactories.set(
+					CssUrlDependency,
+					normalModuleFactory
+				);
+				compilation.dependencyTemplates.set(
+					CssUrlDependency,
+					new CssUrlDependency.Template()
+				);
+				compilation.dependencyTemplates.set(
+					CssLocalIdentifierDependency,
+					new CssLocalIdentifierDependency.Template()
+				);
+				compilation.dependencyFactories.set(
+					CssSelfLocalIdentifierDependency,
+					selfFactory
+				);
+				compilation.dependencyTemplates.set(
+					CssSelfLocalIdentifierDependency,
+					new CssSelfLocalIdentifierDependency.Template()
+				);
+				compilation.dependencyFactories.set(
+					CssIcssImportDependency,
+					normalModuleFactory
+				);
+				compilation.dependencyTemplates.set(
+					CssIcssImportDependency,
+					new CssIcssImportDependency.Template()
+				);
+				compilation.dependencyTemplates.set(
+					CssIcssExportDependency,
+					new CssIcssExportDependency.Template()
+				);
+				compilation.dependencyTemplates.set(
+					CssIcssSymbolDependency,
+					new CssIcssSymbolDependency.Template()
+				);
+				compilation.dependencyTemplates.set(
+					StaticExportsDependency,
+					new StaticExportsDependency.Template()
+				);
+				for (const type of [
+					CSS_MODULE_TYPE,
+					CSS_MODULE_TYPE_GLOBAL,
+					CSS_MODULE_TYPE_MODULE,
+					CSS_MODULE_TYPE_AUTO
+				]) {
+					normalModuleFactory.hooks.createParser
+						.for(type)
+						.tap(PLUGIN_NAME, parserOptions => {
+							validateParserOptions[type](parserOptions);
+							const { url, import: importOption, namedExports } = parserOptions;
+
+							switch (type) {
+								case CSS_MODULE_TYPE:
+									return new CssParser({
+										importOption,
+										url,
+										namedExports
+									});
+								case CSS_MODULE_TYPE_GLOBAL:
+									return new CssParser({
+										defaultMode: "global",
+										importOption,
+										url,
+										namedExports
+									});
+								case CSS_MODULE_TYPE_MODULE:
+									return new CssParser({
+										defaultMode: "local",
+										importOption,
+										url,
+										namedExports
+									});
+								case CSS_MODULE_TYPE_AUTO:
+									return new CssParser({
+										defaultMode: "auto",
+										importOption,
+										url,
+										namedExports
+									});
+							}
+						});
+					normalModuleFactory.hooks.createGenerator
+						.for(type)
+						.tap(PLUGIN_NAME, generatorOptions => {
+							validateGeneratorOptions[type](generatorOptions);
+
+							return new CssGenerator(
+								generatorOptions,
+								compilation.moduleGraph
+							);
+						});
+					normalModuleFactory.hooks.createModuleClass
+						.for(type)
+						.tap(PLUGIN_NAME, (createData, resolveData) => {
+							if (resolveData.dependencies.length > 0) {
+								// When CSS is imported from CSS there is only one dependency
+								const dependency = resolveData.dependencies[0];
+
+								if (dependency instanceof CssImportDependency) {
+									const parent =
+										/** @type {CssModule} */
+										(compilation.moduleGraph.getParentModule(dependency));
+
+									if (parent instanceof CssModule) {
+										/** @type {import("../CssModule").Inheritance | undefined} */
+										let inheritance;
+
+										if (
+											parent.cssLayer !== undefined ||
+											parent.supports ||
+											parent.media
+										) {
+											if (!inheritance) {
+												inheritance = [];
+											}
+
+											inheritance.push([
+												parent.cssLayer,
+												parent.supports,
+												parent.media
+											]);
+										}
+
+										if (parent.inheritance) {
+											if (!inheritance) {
+												inheritance = [];
+											}
+
+											inheritance.push(...parent.inheritance);
+										}
+
+										return new CssModule({
+											...createData,
+											cssLayer: dependency.layer,
+											supports: dependency.supports,
+											media: dependency.media,
+											inheritance
+										});
+									}
+
+									return new CssModule({
+										...createData,
+										cssLayer: dependency.layer,
+										supports: dependency.supports,
+										media: dependency.media
+									});
+								}
+							}
+
+							return new CssModule(createData);
+						});
+
+					NormalModule.getCompilationHooks(compilation).processResult.tap(
+						PLUGIN_NAME,
+						(result, module) => {
+							if (module.type === type) {
+								const [source, ...rest] = result;
+
+								return [removeBOM(source), ...rest];
+							}
+
+							return result;
+						}
+					);
+				}
+
+				JavascriptModulesPlugin.getCompilationHooks(
+					compilation
+				).renderModuleContent.tap(PLUGIN_NAME, (source, module) => {
+					if (module instanceof CssModule && module.hot) {
+						const cssData = /** @type {BuildInfo} */ (module.buildInfo).cssData;
+						if (!cssData) {
+							return source;
+						}
+						const exports = cssData.exports;
+						const stringifiedExports = JSON.stringify(
+							JSON.stringify(
+								Array.from(exports).reduce((obj, [key, value]) => {
+									obj[key] = value;
+									return obj;
+								}, /** @type {Record} */ ({}))
+							)
+						);
+
+						const hmrCode = Template.asString([
+							"",
+							`var __webpack_css_exports__ = ${stringifiedExports};`,
+							"// only invalidate when locals change",
+							"if (module.hot.data && module.hot.data.__webpack_css_exports__ && module.hot.data.__webpack_css_exports__ != __webpack_css_exports__) {",
+							Template.indent("module.hot.invalidate();"),
+							"} else {",
+							Template.indent("module.hot.accept();"),
+							"}",
+							"module.hot.dispose(function(data) { data.__webpack_css_exports__ = __webpack_css_exports__; });"
+						]);
+
+						return new ConcatSource(source, "\n", new RawSource(hmrCode));
+					}
+
+					return source;
+				});
+				const orderedCssModulesPerChunk = new WeakMap();
+				compilation.hooks.afterCodeGeneration.tap(PLUGIN_NAME, () => {
+					const { chunkGraph } = compilation;
+					for (const chunk of compilation.chunks) {
+						if (CssModulesPlugin.chunkHasCss(chunk, chunkGraph)) {
+							orderedCssModulesPerChunk.set(
+								chunk,
+								this.getOrderedChunkCssModules(chunk, chunkGraph, compilation)
+							);
+						}
+					}
+				});
+				compilation.hooks.chunkHash.tap(PLUGIN_NAME, (chunk, hash, context) => {
+					hooks.chunkHash.call(chunk, hash, context);
+				});
+				compilation.hooks.contentHash.tap(PLUGIN_NAME, chunk => {
+					const {
+						chunkGraph,
+						codeGenerationResults,
+						moduleGraph,
+						runtimeTemplate,
+						outputOptions: {
+							hashSalt,
+							hashDigest,
+							hashDigestLength,
+							hashFunction
+						}
+					} = compilation;
+					const hash = createHash(/** @type {HashFunction} */ (hashFunction));
+					if (hashSalt) hash.update(hashSalt);
+					hooks.chunkHash.call(chunk, hash, {
+						chunkGraph,
+						codeGenerationResults,
+						moduleGraph,
+						runtimeTemplate
+					});
+					const modules = orderedCssModulesPerChunk.get(chunk);
+					if (modules) {
+						for (const module of modules) {
+							hash.update(chunkGraph.getModuleHash(module, chunk.runtime));
+						}
+					}
+					const digest = /** @type {string} */ (hash.digest(hashDigest));
+					chunk.contentHash.css = nonNumericOnlyHash(
+						digest,
+						/** @type {number} */
+						(hashDigestLength)
+					);
+				});
+				compilation.hooks.renderManifest.tap(PLUGIN_NAME, (result, options) => {
+					const { chunkGraph } = compilation;
+					const { hash, chunk, codeGenerationResults, runtimeTemplate } =
+						options;
+
+					if (chunk instanceof HotUpdateChunk) return result;
+
+					/** @type {CssModule[] | undefined} */
+					const modules = orderedCssModulesPerChunk.get(chunk);
+					if (modules !== undefined) {
+						const { path: filename, info } = compilation.getPathWithInfo(
+							CssModulesPlugin.getChunkFilenameTemplate(
+								chunk,
+								compilation.outputOptions
+							),
+							{
+								hash,
+								runtime: chunk.runtime,
+								chunk,
+								contentHashType: "css"
+							}
+						);
+						const undoPath = getUndoPath(
+							filename,
+							/** @type {string} */
+							(compilation.outputOptions.path),
+							false
+						);
+						result.push({
+							render: () =>
+								this.renderChunk(
+									{
+										chunk,
+										chunkGraph,
+										codeGenerationResults,
+										uniqueName:
+											/** @type {string} */
+											(compilation.outputOptions.uniqueName),
+										undoPath,
+										modules,
+										runtimeTemplate
+									},
+									hooks
+								),
+							filename,
+							info,
+							identifier: `css${chunk.id}`,
+							hash: chunk.contentHash.css
+						});
+					}
+					return result;
+				});
+				const globalChunkLoading = compilation.outputOptions.chunkLoading;
+				/**
+				 * @param {Chunk} chunk the chunk
+				 * @returns {boolean} true, when enabled
+				 */
+				const isEnabledForChunk = chunk => {
+					const options = chunk.getEntryOptions();
+					const chunkLoading =
+						options && options.chunkLoading !== undefined
+							? options.chunkLoading
+							: globalChunkLoading;
+					return chunkLoading === "jsonp" || chunkLoading === "import";
+				};
+				const onceForChunkSet = new WeakSet();
+				/**
+				 * @param {Chunk} chunk chunk to check
+				 * @param {Set} set runtime requirements
+				 */
+				const handler = (chunk, set) => {
+					if (onceForChunkSet.has(chunk)) return;
+					onceForChunkSet.add(chunk);
+					if (!isEnabledForChunk(chunk)) return;
+
+					set.add(RuntimeGlobals.makeNamespaceObject);
+
+					const CssLoadingRuntimeModule = getCssLoadingRuntimeModule();
+					compilation.addRuntimeModule(chunk, new CssLoadingRuntimeModule(set));
+				};
+				compilation.hooks.runtimeRequirementInTree
+					.for(RuntimeGlobals.hasCssModules)
+					.tap(PLUGIN_NAME, handler);
+				compilation.hooks.runtimeRequirementInTree
+					.for(RuntimeGlobals.ensureChunkHandlers)
+					.tap(PLUGIN_NAME, (chunk, set, { chunkGraph }) => {
+						if (!isEnabledForChunk(chunk)) return;
+						if (
+							!chunkGraph.hasModuleInGraph(
+								chunk,
+								m =>
+									m.type === CSS_MODULE_TYPE ||
+									m.type === CSS_MODULE_TYPE_GLOBAL ||
+									m.type === CSS_MODULE_TYPE_MODULE ||
+									m.type === CSS_MODULE_TYPE_AUTO
+							)
+						) {
+							return;
+						}
+
+						set.add(RuntimeGlobals.hasOwnProperty);
+						set.add(RuntimeGlobals.publicPath);
+						set.add(RuntimeGlobals.getChunkCssFilename);
+					});
+				compilation.hooks.runtimeRequirementInTree
+					.for(RuntimeGlobals.hmrDownloadUpdateHandlers)
+					.tap(PLUGIN_NAME, (chunk, set, { chunkGraph }) => {
+						if (!isEnabledForChunk(chunk)) return;
+						if (
+							!chunkGraph.hasModuleInGraph(
+								chunk,
+								m =>
+									m.type === CSS_MODULE_TYPE ||
+									m.type === CSS_MODULE_TYPE_GLOBAL ||
+									m.type === CSS_MODULE_TYPE_MODULE ||
+									m.type === CSS_MODULE_TYPE_AUTO
+							)
+						) {
+							return;
+						}
+						set.add(RuntimeGlobals.publicPath);
+						set.add(RuntimeGlobals.getChunkCssFilename);
+					});
+			}
+		);
+	}
+
+	/**
+	 * @param {Chunk} chunk chunk
+	 * @param {Iterable} modules unordered modules
+	 * @param {Compilation} compilation compilation
+	 * @returns {Module[]} ordered modules
+	 */
+	getModulesInOrder(chunk, modules, compilation) {
+		if (!modules) return [];
+
+		/** @type {Module[]} */
+		const modulesList = [...modules];
+
+		// Get ordered list of modules per chunk group
+		// Lists are in reverse order to allow to use Array.pop()
+		const modulesByChunkGroup = Array.from(chunk.groupsIterable, chunkGroup => {
+			const sortedModules = modulesList
+				.map(module => ({
+					module,
+					index: chunkGroup.getModulePostOrderIndex(module)
+				}))
+				.filter(item => item.index !== undefined)
+				.sort(
+					(a, b) =>
+						/** @type {number} */ (b.index) - /** @type {number} */ (a.index)
+				)
+				.map(item => item.module);
+
+			return { list: sortedModules, set: new Set(sortedModules) };
+		});
+
+		if (modulesByChunkGroup.length === 1)
+			return modulesByChunkGroup[0].list.reverse();
+
+		const boundCompareModulesByIdOrIdentifier = compareModulesByIdOrIdentifier(
+			compilation.chunkGraph
+		);
+
+		/**
+		 * @param {{ list: Module[] }} a a
+		 * @param {{ list: Module[] }} b b
+		 * @returns {-1 | 0 | 1} result
+		 */
+		const compareModuleLists = ({ list: a }, { list: b }) => {
+			if (a.length === 0) {
+				return b.length === 0 ? 0 : 1;
+			}
+			if (b.length === 0) return -1;
+			return boundCompareModulesByIdOrIdentifier(
+				a[a.length - 1],
+				b[b.length - 1]
+			);
+		};
+
+		modulesByChunkGroup.sort(compareModuleLists);
+
+		/** @type {Module[]} */
+		const finalModules = [];
+
+		for (;;) {
+			const failedModules = new Set();
+			const list = modulesByChunkGroup[0].list;
+			if (list.length === 0) {
+				// done, everything empty
+				break;
+			}
+			/** @type {Module} */
+			let selectedModule = list[list.length - 1];
+			let hasFailed;
+			outer: for (;;) {
+				for (const { list, set } of modulesByChunkGroup) {
+					if (list.length === 0) continue;
+					const lastModule = list[list.length - 1];
+					if (lastModule === selectedModule) continue;
+					if (!set.has(selectedModule)) continue;
+					failedModules.add(selectedModule);
+					if (failedModules.has(lastModule)) {
+						// There is a conflict, try other alternatives
+						hasFailed = lastModule;
+						continue;
+					}
+					selectedModule = lastModule;
+					hasFailed = false;
+					continue outer; // restart
+				}
+				break;
+			}
+			if (hasFailed) {
+				// There is a not resolve-able conflict with the selectedModule
+				// TODO print better warning
+				compilation.warnings.push(
+					new WebpackError(
+						`chunk ${chunk.name || chunk.id}\nConflicting order between ${
+							/** @type {Module} */
+							(hasFailed).readableIdentifier(compilation.requestShortener)
+						} and ${selectedModule.readableIdentifier(
+							compilation.requestShortener
+						)}`
+					)
+				);
+				selectedModule = /** @type {Module} */ (hasFailed);
+			}
+			// Insert the selected module into the final modules list
+			finalModules.push(selectedModule);
+			// Remove the selected module from all lists
+			for (const { list, set } of modulesByChunkGroup) {
+				const lastModule = list[list.length - 1];
+				if (lastModule === selectedModule) list.pop();
+				else if (hasFailed && set.has(selectedModule)) {
+					const idx = list.indexOf(selectedModule);
+					if (idx >= 0) list.splice(idx, 1);
+				}
+			}
+			modulesByChunkGroup.sort(compareModuleLists);
+		}
+		return finalModules;
+	}
+
+	/**
+	 * @param {Chunk} chunk chunk
+	 * @param {ChunkGraph} chunkGraph chunk graph
+	 * @param {Compilation} compilation compilation
+	 * @returns {Module[]} ordered css modules
+	 */
+	getOrderedChunkCssModules(chunk, chunkGraph, compilation) {
+		return [
+			...this.getModulesInOrder(
+				chunk,
+				/** @type {Iterable} */
+				(
+					chunkGraph.getOrderedChunkModulesIterableBySourceType(
+						chunk,
+						"css-import",
+						compareModulesByIdOrIdentifier(chunkGraph)
+					)
+				),
+				compilation
+			),
+			...this.getModulesInOrder(
+				chunk,
+				/** @type {Iterable} */
+				(
+					chunkGraph.getOrderedChunkModulesIterableBySourceType(
+						chunk,
+						"css",
+						compareModulesByIdOrIdentifier(chunkGraph)
+					)
+				),
+				compilation
+			)
+		];
+	}
+
+	/**
+	 * @param {CssModule} module css module
+	 * @param {ChunkRenderContext} renderContext options object
+	 * @param {CompilationHooks} hooks hooks
+	 * @returns {Source} css module source
+	 */
+	renderModule(module, renderContext, hooks) {
+		const { codeGenerationResults, chunk, undoPath } = renderContext;
+		const codeGenResult = codeGenerationResults.get(module, chunk.runtime);
+		const moduleSourceContent =
+			/** @type {Source} */
+			(
+				codeGenResult.sources.get("css") ||
+					codeGenResult.sources.get("css-import")
+			);
+		const cacheEntry = this._moduleFactoryCache.get(moduleSourceContent);
+
+		/** @type {Inheritance} */
+		const inheritance = [[module.cssLayer, module.supports, module.media]];
+		if (module.inheritance) {
+			inheritance.push(...module.inheritance);
+		}
+
+		let source;
+		if (
+			cacheEntry &&
+			cacheEntry.undoPath === undoPath &&
+			cacheEntry.inheritance.every(([layer, supports, media], i) => {
+				const item = inheritance[i];
+				if (Array.isArray(item)) {
+					return layer === item[0] && supports === item[1] && media === item[2];
+				}
+				return false;
+			})
+		) {
+			source = cacheEntry.source;
+		} else {
+			const moduleSourceCode =
+				/** @type {string} */
+				(moduleSourceContent.source());
+			const publicPathAutoRegex = new RegExp(
+				CssUrlDependency.PUBLIC_PATH_AUTO,
+				"g"
+			);
+			/** @type {Source} */
+			let moduleSource = new ReplaceSource(moduleSourceContent);
+			let match;
+			while ((match = publicPathAutoRegex.exec(moduleSourceCode))) {
+				/** @type {ReplaceSource} */ (moduleSource).replace(
+					match.index,
+					(match.index += match[0].length - 1),
+					undoPath
+				);
+			}
+
+			for (let i = 0; i < inheritance.length; i++) {
+				const layer = inheritance[i][0];
+				const supports = inheritance[i][1];
+				const media = inheritance[i][2];
+
+				if (media) {
+					moduleSource = new ConcatSource(
+						`@media ${media} {\n`,
+						new PrefixSource("\t", moduleSource),
+						"}\n"
+					);
+				}
+
+				if (supports) {
+					moduleSource = new ConcatSource(
+						`@supports (${supports}) {\n`,
+						new PrefixSource("\t", moduleSource),
+						"}\n"
+					);
+				}
+
+				// Layer can be anonymous
+				if (layer !== undefined && layer !== null) {
+					moduleSource = new ConcatSource(
+						`@layer${layer ? ` ${layer}` : ""} {\n`,
+						new PrefixSource("\t", moduleSource),
+						"}\n"
+					);
+				}
+			}
+
+			if (moduleSource) {
+				moduleSource = new ConcatSource(moduleSource, "\n");
+			}
+
+			source = new CachedSource(moduleSource);
+			this._moduleFactoryCache.set(moduleSourceContent, {
+				inheritance,
+				undoPath,
+				source
+			});
+		}
+
+		return tryRunOrWebpackError(
+			() => hooks.renderModulePackage.call(source, module, renderContext),
+			"CssModulesPlugin.getCompilationHooks().renderModulePackage"
+		);
+	}
+
+	/**
+	 * @param {RenderContext} renderContext the render context
+	 * @param {CompilationHooks} hooks hooks
+	 * @returns {Source} generated source
+	 */
+	renderChunk(
+		{
+			undoPath,
+			chunk,
+			chunkGraph,
+			codeGenerationResults,
+			modules,
+			runtimeTemplate
+		},
+		hooks
+	) {
+		const source = new ConcatSource();
+		for (const module of modules) {
+			try {
+				const moduleSource = this.renderModule(
+					module,
+					{
+						undoPath,
+						chunk,
+						chunkGraph,
+						codeGenerationResults,
+						runtimeTemplate
+					},
+					hooks
+				);
+				source.add(moduleSource);
+			} catch (err) {
+				/** @type {Error} */
+				(err).message += `\nduring rendering of css ${module.identifier()}`;
+				throw err;
+			}
+		}
+		chunk.rendered = true;
+		return source;
+	}
+
+	/**
+	 * @param {Chunk} chunk chunk
+	 * @param {OutputOptions} outputOptions output options
+	 * @returns {TemplatePath} used filename template
+	 */
+	static getChunkFilenameTemplate(chunk, outputOptions) {
+		if (chunk.cssFilenameTemplate) {
+			return chunk.cssFilenameTemplate;
+		} else if (chunk.canBeInitial()) {
+			return /** @type {TemplatePath} */ (outputOptions.cssFilename);
+		}
+		return /** @type {TemplatePath} */ (outputOptions.cssChunkFilename);
+	}
+
+	/**
+	 * @param {Chunk} chunk chunk
+	 * @param {ChunkGraph} chunkGraph chunk graph
+	 * @returns {boolean} true, when the chunk has css
+	 */
+	static chunkHasCss(chunk, chunkGraph) {
+		return (
+			Boolean(chunkGraph.getChunkModulesIterableBySourceType(chunk, "css")) ||
+			Boolean(
+				chunkGraph.getChunkModulesIterableBySourceType(chunk, "css-import")
+			)
+		);
+	}
+}
+
+module.exports = CssModulesPlugin;
diff --git a/lib/css/CssParser.js b/lib/css/CssParser.js
new file mode 100644
index 00000000000..f04a9ee2fd4
--- /dev/null
+++ b/lib/css/CssParser.js
@@ -0,0 +1,1622 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const vm = require("vm");
+const CommentCompilationWarning = require("../CommentCompilationWarning");
+const ModuleDependencyWarning = require("../ModuleDependencyWarning");
+const { CSS_MODULE_TYPE_AUTO } = require("../ModuleTypeConstants");
+const Parser = require("../Parser");
+const UnsupportedFeatureWarning = require("../UnsupportedFeatureWarning");
+const WebpackError = require("../WebpackError");
+const ConstDependency = require("../dependencies/ConstDependency");
+const CssIcssExportDependency = require("../dependencies/CssIcssExportDependency");
+const CssIcssImportDependency = require("../dependencies/CssIcssImportDependency");
+const CssIcssSymbolDependency = require("../dependencies/CssIcssSymbolDependency");
+const CssImportDependency = require("../dependencies/CssImportDependency");
+const CssLocalIdentifierDependency = require("../dependencies/CssLocalIdentifierDependency");
+const CssSelfLocalIdentifierDependency = require("../dependencies/CssSelfLocalIdentifierDependency");
+const CssUrlDependency = require("../dependencies/CssUrlDependency");
+const StaticExportsDependency = require("../dependencies/StaticExportsDependency");
+const binarySearchBounds = require("../util/binarySearchBounds");
+const { parseResource } = require("../util/identifier");
+const {
+	webpackCommentRegExp,
+	createMagicCommentContext
+} = require("../util/magicComment");
+const walkCssTokens = require("./walkCssTokens");
+
+/** @typedef {import("../Module").BuildInfo} BuildInfo */
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
+/** @typedef {import("../Parser").ParserState} ParserState */
+/** @typedef {import("../Parser").PreparsedAst} PreparsedAst */
+/** @typedef {import("./walkCssTokens").CssTokenCallbacks} CssTokenCallbacks */
+
+/** @typedef {[number, number]} Range */
+/** @typedef {{ line: number, column: number }} Position */
+/** @typedef {{ value: string, range: Range, loc: { start: Position, end: Position } }} Comment */
+
+const CC_COLON = ":".charCodeAt(0);
+const CC_SLASH = "/".charCodeAt(0);
+const CC_LEFT_PARENTHESIS = "(".charCodeAt(0);
+const CC_RIGHT_PARENTHESIS = ")".charCodeAt(0);
+const CC_LOWER_F = "f".charCodeAt(0);
+const CC_UPPER_F = "F".charCodeAt(0);
+
+// https://www.w3.org/TR/css-syntax-3/#newline
+// We don't have `preprocessing` stage, so we need specify all of them
+const STRING_MULTILINE = /\\[\n\r\f]/g;
+// https://www.w3.org/TR/css-syntax-3/#whitespace
+const TRIM_WHITE_SPACES = /(^[ \t\n\r\f]*|[ \t\n\r\f]*$)/g;
+const UNESCAPE = /\\([0-9a-fA-F]{1,6}[ \t\n\r\f]?|[\s\S])/g;
+const IMAGE_SET_FUNCTION = /^(-\w+-)?image-set$/i;
+const OPTIONALLY_VENDOR_PREFIXED_KEYFRAMES_AT_RULE = /^@(-\w+-)?keyframes$/;
+const OPTIONALLY_VENDOR_PREFIXED_ANIMATION_PROPERTY =
+	/^(-\w+-)?animation(-name)?$/i;
+const IS_MODULES = /\.module(s)?\.[^.]+$/i;
+const CSS_COMMENT = /\/\*((?!\*\/).*?)\*\//g;
+
+/**
+ * @param {string} str url string
+ * @param {boolean} isString is url wrapped in quotes
+ * @returns {string} normalized url
+ */
+const normalizeUrl = (str, isString) => {
+	// Remove extra spaces and newlines:
+	// `url("im\
+	// g.png")`
+	if (isString) {
+		str = str.replace(STRING_MULTILINE, "");
+	}
+
+	str = str
+		// Remove unnecessary spaces from `url("   img.png	 ")`
+		.replace(TRIM_WHITE_SPACES, "")
+		// Unescape
+		.replace(UNESCAPE, match => {
+			if (match.length > 2) {
+				return String.fromCharCode(Number.parseInt(match.slice(1).trim(), 16));
+			}
+			return match[1];
+		});
+
+	if (/^data:/i.test(str)) {
+		return str;
+	}
+
+	if (str.includes("%")) {
+		// Convert `url('%2E/img.png')` -> `url('./img.png')`
+		try {
+			str = decodeURIComponent(str);
+		} catch (_err) {
+			// Ignore
+		}
+	}
+
+	return str;
+};
+
+// eslint-disable-next-line no-useless-escape
+const regexSingleEscape = /[ -,.\/:-@[\]\^`{-~]/;
+const regexExcessiveSpaces =
+	/(^|\\+)?(\\[A-F0-9]{1,6})\u0020(?![a-fA-F0-9\u0020])/g;
+
+/**
+ * @param {string} str string
+ * @returns {string} escaped identifier
+ */
+const escapeIdentifier = str => {
+	let output = "";
+	let counter = 0;
+
+	while (counter < str.length) {
+		const character = str.charAt(counter++);
+
+		let value;
+
+		if (/[\t\n\f\r\u000B]/.test(character)) {
+			const codePoint = character.charCodeAt(0);
+
+			value = `\\${codePoint.toString(16).toUpperCase()} `;
+		} else if (character === "\\" || regexSingleEscape.test(character)) {
+			value = `\\${character}`;
+		} else {
+			value = character;
+		}
+
+		output += value;
+	}
+
+	const firstChar = str.charAt(0);
+
+	if (/^-[-\d]/.test(output)) {
+		output = `\\-${output.slice(1)}`;
+	} else if (/\d/.test(firstChar)) {
+		output = `\\3${firstChar} ${output.slice(1)}`;
+	}
+
+	// Remove spaces after `\HEX` escapes that are not followed by a hex digit,
+	// since they’re redundant. Note that this is only possible if the escape
+	// sequence isn’t preceded by an odd number of backslashes.
+	output = output.replace(regexExcessiveSpaces, ($0, $1, $2) => {
+		if ($1 && $1.length % 2) {
+			// It’s not safe to remove the space, so don’t.
+			return $0;
+		}
+
+		// Strip the space.
+		return ($1 || "") + $2;
+	});
+
+	return output;
+};
+
+const CONTAINS_ESCAPE = /\\/;
+
+/**
+ * @param {string} str string
+ * @returns {[string, number] | undefined} hex
+ */
+const gobbleHex = str => {
+	const lower = str.toLowerCase();
+	let hex = "";
+	let spaceTerminated = false;
+
+	for (let i = 0; i < 6 && lower[i] !== undefined; i++) {
+		const code = lower.charCodeAt(i);
+		// check to see if we are dealing with a valid hex char [a-f|0-9]
+		const valid = (code >= 97 && code <= 102) || (code >= 48 && code <= 57);
+		// https://drafts.csswg.org/css-syntax/#consume-escaped-code-point
+		spaceTerminated = code === 32;
+		if (!valid) break;
+		hex += lower[i];
+	}
+
+	if (hex.length === 0) return undefined;
+
+	const codePoint = Number.parseInt(hex, 16);
+	const isSurrogate = codePoint >= 0xd800 && codePoint <= 0xdfff;
+
+	// Add special case for
+	// "If this number is zero, or is for a surrogate, or is greater than the maximum allowed code point"
+	// https://drafts.csswg.org/css-syntax/#maximum-allowed-code-point
+	if (isSurrogate || codePoint === 0x0000 || codePoint > 0x10ffff) {
+		return ["\uFFFD", hex.length + (spaceTerminated ? 1 : 0)];
+	}
+
+	return [
+		String.fromCodePoint(codePoint),
+		hex.length + (spaceTerminated ? 1 : 0)
+	];
+};
+
+/**
+ * @param {string} str string
+ * @returns {string} unescaped string
+ */
+const unescapeIdentifier = str => {
+	const needToProcess = CONTAINS_ESCAPE.test(str);
+	if (!needToProcess) return str;
+	let ret = "";
+	for (let i = 0; i < str.length; i++) {
+		if (str[i] === "\\") {
+			const gobbled = gobbleHex(str.slice(i + 1, i + 7));
+			if (gobbled !== undefined) {
+				ret += gobbled[0];
+				i += gobbled[1];
+				continue;
+			}
+			// Retain a pair of \\ if double escaped `\\\\`
+			// https://github.com/postcss/postcss-selector-parser/commit/268c9a7656fb53f543dc620aa5b73a30ec3ff20e
+			if (str[i + 1] === "\\") {
+				ret += "\\";
+				i += 1;
+				continue;
+			}
+			// if \\ is at the end of the string retain it
+			// https://github.com/postcss/postcss-selector-parser/commit/01a6b346e3612ce1ab20219acc26abdc259ccefb
+			if (str.length === i + 1) {
+				ret += str[i];
+			}
+			continue;
+		}
+		ret += str[i];
+	}
+
+	return ret;
+};
+
+class LocConverter {
+	/**
+	 * @param {string} input input
+	 */
+	constructor(input) {
+		this._input = input;
+		this.line = 1;
+		this.column = 0;
+		this.pos = 0;
+	}
+
+	/**
+	 * @param {number} pos position
+	 * @returns {LocConverter} location converter
+	 */
+	get(pos) {
+		if (this.pos !== pos) {
+			if (this.pos < pos) {
+				const str = this._input.slice(this.pos, pos);
+				let i = str.lastIndexOf("\n");
+				if (i === -1) {
+					this.column += str.length;
+				} else {
+					this.column = str.length - i - 1;
+					this.line++;
+					while (i > 0 && (i = str.lastIndexOf("\n", i - 1)) !== -1)
+						this.line++;
+				}
+			} else {
+				let i = this._input.lastIndexOf("\n", this.pos);
+				while (i >= pos) {
+					this.line--;
+					i = i > 0 ? this._input.lastIndexOf("\n", i - 1) : -1;
+				}
+				this.column = pos - i;
+			}
+			this.pos = pos;
+		}
+		return this;
+	}
+}
+
+const EMPTY_COMMENT_OPTIONS = {
+	options: null,
+	errors: null
+};
+
+const CSS_MODE_TOP_LEVEL = 0;
+const CSS_MODE_IN_BLOCK = 1;
+
+const eatUntilSemi = walkCssTokens.eatUntil(";");
+const eatUntilLeftCurly = walkCssTokens.eatUntil("{");
+const eatSemi = walkCssTokens.eatUntil(";");
+
+/**
+ * @typedef {object} CssParserOptions
+ * @property {boolean=} importOption need handle `@import`
+ * @property {boolean=} url need handle URLs
+ * @property {("pure" | "global" | "local" | "auto")=} defaultMode default mode
+ * @property {boolean=} namedExports is named exports
+ */
+
+class CssParser extends Parser {
+	/**
+	 * @param {CssParserOptions=} options options
+	 */
+	constructor({
+		defaultMode = "pure",
+		importOption = true,
+		url = true,
+		namedExports = true
+	} = {}) {
+		super();
+		this.defaultMode = defaultMode;
+		this.import = importOption;
+		this.url = url;
+		this.namedExports = namedExports;
+		/** @type {Comment[] | undefined} */
+		this.comments = undefined;
+		this.magicCommentContext = createMagicCommentContext();
+	}
+
+	/**
+	 * @param {ParserState} state parser state
+	 * @param {string} message warning message
+	 * @param {LocConverter} locConverter location converter
+	 * @param {number} start start offset
+	 * @param {number} end end offset
+	 */
+	_emitWarning(state, message, locConverter, start, end) {
+		const { line: sl, column: sc } = locConverter.get(start);
+		const { line: el, column: ec } = locConverter.get(end);
+
+		state.current.addWarning(
+			new ModuleDependencyWarning(state.module, new WebpackError(message), {
+				start: { line: sl, column: sc },
+				end: { line: el, column: ec }
+			})
+		);
+	}
+
+	/**
+	 * @param {string | Buffer | PreparsedAst} source the source to parse
+	 * @param {ParserState} state the parser state
+	 * @returns {ParserState} the parser state
+	 */
+	parse(source, state) {
+		if (Buffer.isBuffer(source)) {
+			source = source.toString("utf-8");
+		} else if (typeof source === "object") {
+			throw new Error("webpackAst is unexpected for the CssParser");
+		}
+		if (source[0] === "\uFEFF") {
+			source = source.slice(1);
+		}
+
+		let mode = this.defaultMode;
+
+		const module = state.module;
+
+		if (
+			mode === "auto" &&
+			module.type === CSS_MODULE_TYPE_AUTO &&
+			IS_MODULES.test(
+				parseResource(module.matchResource || module.resource).path
+			)
+		) {
+			mode = "local";
+		}
+
+		const isModules = mode === "global" || mode === "local";
+
+		/** @type {BuildMeta} */
+		(module.buildMeta).isCSSModule = isModules;
+
+		const locConverter = new LocConverter(source);
+
+		/** @type {number} */
+		let scope = CSS_MODE_TOP_LEVEL;
+		/** @type {boolean} */
+		let allowImportAtRule = true;
+		/** @type [string, number, number][] */
+		const balanced = [];
+		let lastTokenEndForComments = 0;
+
+		/** @type {boolean} */
+		let isNextRulePrelude = isModules;
+		/** @type {number} */
+		let blockNestingLevel = 0;
+		/** @type {"local" | "global" | undefined} */
+		let modeData;
+		/** @type {boolean} */
+		let inAnimationProperty = false;
+		/** @type {[number, number, boolean] | undefined} */
+		let lastIdentifier;
+		/** @type {Set} */
+		const declaredCssVariables = new Set();
+		/** @typedef {{ path?: string, value: string }} IcssDefinition */
+		/** @type {Map} */
+		const icssDefinitions = new Map();
+
+		/**
+		 * @param {string} input input
+		 * @param {number} pos position
+		 * @returns {boolean} true, when next is nested syntax
+		 */
+		const isNextNestedSyntax = (input, pos) => {
+			pos = walkCssTokens.eatWhitespaceAndComments(input, pos);
+
+			if (input[pos] === "}") {
+				return false;
+			}
+
+			// According spec only identifier can be used as a property name
+			const isIdentifier = walkCssTokens.isIdentStartCodePoint(
+				input.charCodeAt(pos)
+			);
+
+			return !isIdentifier;
+		};
+		/**
+		 * @returns {boolean} true, when in local scope
+		 */
+		const isLocalMode = () =>
+			modeData === "local" || (mode === "local" && modeData === undefined);
+
+		/**
+		 * @param {string} input input
+		 * @param {number} pos start position
+		 * @param {(input: string, pos: number) => number} eater eater
+		 * @returns {[number,string]} new position and text
+		 */
+		const eatText = (input, pos, eater) => {
+			let text = "";
+			for (;;) {
+				if (input.charCodeAt(pos) === CC_SLASH) {
+					const newPos = walkCssTokens.eatComments(input, pos);
+					if (pos !== newPos) {
+						pos = newPos;
+						if (pos === input.length) break;
+					} else {
+						text += "/";
+						pos++;
+						if (pos === input.length) break;
+					}
+				}
+				const newPos = eater(input, pos);
+				if (pos !== newPos) {
+					text += input.slice(pos, newPos);
+					pos = newPos;
+				} else {
+					break;
+				}
+				if (pos === input.length) break;
+			}
+			return [pos, text.trimEnd()];
+		};
+
+		/**
+		 * @param {0 | 1} type import or export
+		 * @param {string} input input
+		 * @param {number} pos start position
+		 * @returns {number} position after parse
+		 */
+		const parseImportOrExport = (type, input, pos) => {
+			pos = walkCssTokens.eatWhitespaceAndComments(input, pos);
+			/** @type {string | undefined} */
+			let importPath;
+			if (type === 0) {
+				let cc = input.charCodeAt(pos);
+				if (cc !== CC_LEFT_PARENTHESIS) {
+					this._emitWarning(
+						state,
+						`Unexpected '${input[pos]}' at ${pos} during parsing of ':import' (expected '(')`,
+						locConverter,
+						pos,
+						pos
+					);
+					return pos;
+				}
+				pos++;
+				const stringStart = pos;
+				const str = walkCssTokens.eatString(input, pos);
+				if (!str) {
+					this._emitWarning(
+						state,
+						`Unexpected '${input[pos]}' at ${pos} during parsing of ':import' (expected string)`,
+						locConverter,
+						stringStart,
+						pos
+					);
+					return pos;
+				}
+				importPath = input.slice(str[0] + 1, str[1] - 1);
+				pos = str[1];
+				pos = walkCssTokens.eatWhitespaceAndComments(input, pos);
+				cc = input.charCodeAt(pos);
+				if (cc !== CC_RIGHT_PARENTHESIS) {
+					this._emitWarning(
+						state,
+						`Unexpected '${input[pos]}' at ${pos} during parsing of ':import' (expected ')')`,
+						locConverter,
+						pos,
+						pos
+					);
+					return pos;
+				}
+				pos++;
+				pos = walkCssTokens.eatWhitespaceAndComments(input, pos);
+			}
+
+			/**
+			 * @param {string} name name
+			 * @param {string} value value
+			 * @param {number} start start of position
+			 * @param {number} end end of position
+			 */
+			const createDep = (name, value, start, end) => {
+				if (type === 0) {
+					icssDefinitions.set(name, {
+						path: /** @type {string} */ (importPath),
+						value
+					});
+				} else if (type === 1) {
+					const dep = new CssIcssExportDependency(name, value);
+					const { line: sl, column: sc } = locConverter.get(start);
+					const { line: el, column: ec } = locConverter.get(end);
+					dep.setLoc(sl, sc, el, ec);
+					module.addDependency(dep);
+				}
+			};
+
+			let needTerminate = false;
+			let balanced = 0;
+			/** @type {undefined | 0 | 1 | 2} */
+			let scope;
+
+			/** @typedef {[number, number]} Name */
+
+			/** @type {Name | undefined} */
+			let name;
+			/** @type {number | undefined} */
+			let value;
+
+			/** @type {CssTokenCallbacks} */
+			const callbacks = {
+				leftCurlyBracket: (_input, _start, end) => {
+					balanced++;
+
+					if (scope === undefined) {
+						scope = 0;
+					}
+
+					return end;
+				},
+				rightCurlyBracket: (_input, _start, end) => {
+					balanced--;
+
+					if (scope === 2) {
+						const [nameStart, nameEnd] = /** @type {Name} */ (name);
+						createDep(
+							input.slice(nameStart, nameEnd),
+							input.slice(value, end - 1).trim(),
+							nameEnd,
+							end - 1
+						);
+						scope = 0;
+					}
+
+					if (balanced === 0 && scope === 0) {
+						needTerminate = true;
+					}
+
+					return end;
+				},
+				identifier: (_input, start, end) => {
+					if (scope === 0) {
+						name = [start, end];
+						scope = 1;
+					}
+
+					return end;
+				},
+				colon: (_input, _start, end) => {
+					if (scope === 1) {
+						scope = 2;
+						value = walkCssTokens.eatWhitespace(input, end);
+						return value;
+					}
+
+					return end;
+				},
+				semicolon: (input, _start, end) => {
+					if (scope === 2) {
+						const [nameStart, nameEnd] = /** @type {Name} */ (name);
+						createDep(
+							input.slice(nameStart, nameEnd),
+							input.slice(value, end - 1),
+							nameEnd,
+							end - 1
+						);
+						scope = 0;
+					}
+
+					return end;
+				},
+				needTerminate: () => needTerminate
+			};
+
+			pos = walkCssTokens(input, pos, callbacks);
+			pos = walkCssTokens.eatWhiteLine(input, pos);
+
+			return pos;
+		};
+		const eatPropertyName = walkCssTokens.eatUntil(":{};");
+		/**
+		 * @param {string} input input
+		 * @param {number} pos name start position
+		 * @param {number} end name end position
+		 * @returns {number} position after handling
+		 */
+		const processLocalDeclaration = (input, pos, end) => {
+			modeData = undefined;
+			pos = walkCssTokens.eatWhitespaceAndComments(input, pos);
+			const propertyNameStart = pos;
+			const [propertyNameEnd, propertyName] = eatText(
+				input,
+				pos,
+				eatPropertyName
+			);
+			if (input.charCodeAt(propertyNameEnd) !== CC_COLON) return end;
+			pos = propertyNameEnd + 1;
+			if (propertyName.startsWith("--") && propertyName.length >= 3) {
+				// CSS Variable
+				const { line: sl, column: sc } = locConverter.get(propertyNameStart);
+				const { line: el, column: ec } = locConverter.get(propertyNameEnd);
+				const name = unescapeIdentifier(propertyName.slice(2));
+				const dep = new CssLocalIdentifierDependency(
+					name,
+					[propertyNameStart, propertyNameEnd],
+					"--"
+				);
+				dep.setLoc(sl, sc, el, ec);
+				module.addDependency(dep);
+				declaredCssVariables.add(name);
+			} else if (
+				OPTIONALLY_VENDOR_PREFIXED_ANIMATION_PROPERTY.test(propertyName)
+			) {
+				inAnimationProperty = true;
+			}
+			return pos;
+		};
+		/**
+		 * @param {string} input input
+		 */
+		const processDeclarationValueDone = input => {
+			if (inAnimationProperty && lastIdentifier) {
+				const { line: sl, column: sc } = locConverter.get(lastIdentifier[0]);
+				const { line: el, column: ec } = locConverter.get(lastIdentifier[1]);
+				const name = unescapeIdentifier(
+					lastIdentifier[2]
+						? input.slice(lastIdentifier[0], lastIdentifier[1])
+						: input.slice(lastIdentifier[0] + 1, lastIdentifier[1] - 1)
+				);
+				const dep = new CssSelfLocalIdentifierDependency(name, [
+					lastIdentifier[0],
+					lastIdentifier[1]
+				]);
+				dep.setLoc(sl, sc, el, ec);
+				module.addDependency(dep);
+				lastIdentifier = undefined;
+			}
+		};
+
+		/**
+		 * @param {string} input input
+		 * @param {number} start start
+		 * @param {number} end end
+		 * @returns {number} end
+		 */
+		const comment = (input, start, end) => {
+			if (!this.comments) this.comments = [];
+			const { line: sl, column: sc } = locConverter.get(start);
+			const { line: el, column: ec } = locConverter.get(end);
+
+			/** @type {Comment} */
+			const comment = {
+				value: input.slice(start + 2, end - 2),
+				range: [start, end],
+				loc: {
+					start: { line: sl, column: sc },
+					end: { line: el, column: ec }
+				}
+			};
+			this.comments.push(comment);
+			return end;
+		};
+
+		walkCssTokens(source, 0, {
+			comment,
+			leftCurlyBracket: (input, start, end) => {
+				switch (scope) {
+					case CSS_MODE_TOP_LEVEL: {
+						allowImportAtRule = false;
+						scope = CSS_MODE_IN_BLOCK;
+
+						if (isModules) {
+							blockNestingLevel = 1;
+							isNextRulePrelude = isNextNestedSyntax(input, end);
+						}
+
+						break;
+					}
+					case CSS_MODE_IN_BLOCK: {
+						if (isModules) {
+							blockNestingLevel++;
+							isNextRulePrelude = isNextNestedSyntax(input, end);
+						}
+						break;
+					}
+				}
+				return end;
+			},
+			rightCurlyBracket: (input, start, end) => {
+				switch (scope) {
+					case CSS_MODE_IN_BLOCK: {
+						if (--blockNestingLevel === 0) {
+							scope = CSS_MODE_TOP_LEVEL;
+
+							if (isModules) {
+								isNextRulePrelude = true;
+								modeData = undefined;
+							}
+						} else if (isModules) {
+							if (isLocalMode()) {
+								processDeclarationValueDone(input);
+								inAnimationProperty = false;
+							}
+
+							isNextRulePrelude = isNextNestedSyntax(input, end);
+						}
+						break;
+					}
+				}
+				return end;
+			},
+			url: (input, start, end, contentStart, contentEnd) => {
+				if (!this.url) {
+					return end;
+				}
+
+				const { options, errors: commentErrors } = this.parseCommentOptions([
+					lastTokenEndForComments,
+					end
+				]);
+				if (commentErrors) {
+					for (const e of commentErrors) {
+						const { comment } = e;
+						state.module.addWarning(
+							new CommentCompilationWarning(
+								`Compilation error while processing magic comment(-s): /*${comment.value}*/: ${e.message}`,
+								comment.loc
+							)
+						);
+					}
+				}
+				if (options && options.webpackIgnore !== undefined) {
+					if (typeof options.webpackIgnore !== "boolean") {
+						const { line: sl, column: sc } = locConverter.get(
+							lastTokenEndForComments
+						);
+						const { line: el, column: ec } = locConverter.get(end);
+
+						state.module.addWarning(
+							new UnsupportedFeatureWarning(
+								`\`webpackIgnore\` expected a boolean, but received: ${options.webpackIgnore}.`,
+								{
+									start: { line: sl, column: sc },
+									end: { line: el, column: ec }
+								}
+							)
+						);
+					} else if (options.webpackIgnore) {
+						return end;
+					}
+				}
+				const value = normalizeUrl(
+					input.slice(contentStart, contentEnd),
+					false
+				);
+				// Ignore `url()`, `url('')` and `url("")`, they are valid by spec
+				if (value.length === 0) return end;
+				const dep = new CssUrlDependency(value, [start, end], "url");
+				const { line: sl, column: sc } = locConverter.get(start);
+				const { line: el, column: ec } = locConverter.get(end);
+				dep.setLoc(sl, sc, el, ec);
+				module.addDependency(dep);
+				module.addCodeGenerationDependency(dep);
+				return end;
+			},
+			string: (_input, start, end) => {
+				switch (scope) {
+					case CSS_MODE_IN_BLOCK: {
+						if (inAnimationProperty && balanced.length === 0) {
+							lastIdentifier = [start, end, false];
+						}
+					}
+				}
+				return end;
+			},
+			atKeyword: (input, start, end) => {
+				const name = input.slice(start, end).toLowerCase();
+
+				switch (name) {
+					case "@namespace": {
+						this._emitWarning(
+							state,
+							"'@namespace' is not supported in bundled CSS",
+							locConverter,
+							start,
+							end
+						);
+
+						return eatUntilSemi(input, start);
+					}
+					case "@import": {
+						if (!this.import) {
+							return eatSemi(input, end);
+						}
+
+						if (!allowImportAtRule) {
+							this._emitWarning(
+								state,
+								"Any '@import' rules must precede all other rules",
+								locConverter,
+								start,
+								end
+							);
+							return end;
+						}
+
+						const tokens = walkCssTokens.eatImportTokens(input, end, {
+							comment
+						});
+						if (!tokens[3]) return end;
+						const semi = tokens[3][1];
+						if (!tokens[0]) {
+							this._emitWarning(
+								state,
+								`Expected URL in '${input.slice(start, semi)}'`,
+								locConverter,
+								start,
+								semi
+							);
+							return end;
+						}
+
+						const urlToken = tokens[0];
+						const url = normalizeUrl(
+							input.slice(urlToken[2], urlToken[3]),
+							true
+						);
+						const newline = walkCssTokens.eatWhiteLine(input, semi);
+						const { options, errors: commentErrors } = this.parseCommentOptions(
+							[end, urlToken[1]]
+						);
+						if (commentErrors) {
+							for (const e of commentErrors) {
+								const { comment } = e;
+								state.module.addWarning(
+									new CommentCompilationWarning(
+										`Compilation error while processing magic comment(-s): /*${comment.value}*/: ${e.message}`,
+										comment.loc
+									)
+								);
+							}
+						}
+						if (options && options.webpackIgnore !== undefined) {
+							if (typeof options.webpackIgnore !== "boolean") {
+								const { line: sl, column: sc } = locConverter.get(start);
+								const { line: el, column: ec } = locConverter.get(newline);
+
+								state.module.addWarning(
+									new UnsupportedFeatureWarning(
+										`\`webpackIgnore\` expected a boolean, but received: ${options.webpackIgnore}.`,
+										{
+											start: { line: sl, column: sc },
+											end: { line: el, column: ec }
+										}
+									)
+								);
+							} else if (options.webpackIgnore) {
+								return newline;
+							}
+						}
+						if (url.length === 0) {
+							const { line: sl, column: sc } = locConverter.get(start);
+							const { line: el, column: ec } = locConverter.get(newline);
+							const dep = new ConstDependency("", [start, newline]);
+							module.addPresentationalDependency(dep);
+							dep.setLoc(sl, sc, el, ec);
+
+							return newline;
+						}
+
+						let layer;
+
+						if (tokens[1]) {
+							layer = input.slice(tokens[1][0] + 6, tokens[1][1] - 1).trim();
+						}
+
+						let supports;
+
+						if (tokens[2]) {
+							supports = input.slice(tokens[2][0] + 9, tokens[2][1] - 1).trim();
+						}
+
+						const last = tokens[2] || tokens[1] || tokens[0];
+						const mediaStart = walkCssTokens.eatWhitespaceAndComments(
+							input,
+							last[1]
+						);
+
+						let media;
+
+						if (mediaStart !== semi - 1) {
+							media = input.slice(mediaStart, semi - 1).trim();
+						}
+
+						const { line: sl, column: sc } = locConverter.get(start);
+						const { line: el, column: ec } = locConverter.get(newline);
+						const dep = new CssImportDependency(
+							url,
+							[start, newline],
+							layer,
+							supports && supports.length > 0 ? supports : undefined,
+							media && media.length > 0 ? media : undefined
+						);
+						dep.setLoc(sl, sc, el, ec);
+						module.addDependency(dep);
+
+						return newline;
+					}
+					default: {
+						if (isModules) {
+							if (name === "@value") {
+								const semi = eatUntilSemi(input, end);
+								const atRuleEnd = semi + 1;
+								const params = input.slice(end, semi);
+								let [alias, from] = params.split(/\s*from\s*/);
+
+								if (from) {
+									const aliases = alias
+										.replace(CSS_COMMENT, " ")
+										.trim()
+										.replace(/^\(|\)$/g, "")
+										.split(/\s*,\s*/);
+
+									from = from.replace(CSS_COMMENT, "").trim();
+
+									const isExplicitImport = from[0] === "'" || from[0] === '"';
+
+									if (isExplicitImport) {
+										from = from.slice(1, -1);
+									}
+
+									for (const alias of aliases) {
+										const [name, aliasName] = alias.split(/\s*as\s*/);
+
+										icssDefinitions.set(aliasName || name, {
+											value: name,
+											path: from
+										});
+									}
+								} else {
+									const ident = walkCssTokens.eatIdentSequence(alias, 0);
+
+									if (!ident) {
+										this._emitWarning(
+											state,
+											`Broken '@value' at-rule: ${input.slice(
+												start,
+												atRuleEnd
+											)}'`,
+											locConverter,
+											start,
+											atRuleEnd
+										);
+
+										const dep = new ConstDependency("", [start, atRuleEnd]);
+										module.addPresentationalDependency(dep);
+										return atRuleEnd;
+									}
+
+									const pos = walkCssTokens.eatWhitespaceAndComments(
+										alias,
+										ident[1]
+									);
+
+									const name = alias.slice(ident[0], ident[1]);
+									let value =
+										alias.charCodeAt(pos) === CC_COLON
+											? alias.slice(pos + 1)
+											: alias.slice(ident[1]);
+
+									if (value && !/^\s+$/.test(value)) {
+										value = value.trim();
+									}
+
+									if (icssDefinitions.has(value)) {
+										const def =
+											/** @type {IcssDefinition} */
+											(icssDefinitions.get(value));
+
+										value = def.value;
+									}
+
+									icssDefinitions.set(name, { value });
+
+									const dep = new CssIcssExportDependency(name, value);
+									const { line: sl, column: sc } = locConverter.get(start);
+									const { line: el, column: ec } = locConverter.get(end);
+									dep.setLoc(sl, sc, el, ec);
+									module.addDependency(dep);
+								}
+
+								const dep = new ConstDependency("", [start, atRuleEnd]);
+								module.addPresentationalDependency(dep);
+								return atRuleEnd;
+							} else if (
+								OPTIONALLY_VENDOR_PREFIXED_KEYFRAMES_AT_RULE.test(name) &&
+								isLocalMode()
+							) {
+								const ident = walkCssTokens.eatIdentSequenceOrString(
+									input,
+									end
+								);
+								if (!ident) return end;
+								const name = unescapeIdentifier(
+									ident[2] === true
+										? input.slice(ident[0], ident[1])
+										: input.slice(ident[0] + 1, ident[1] - 1)
+								);
+								const { line: sl, column: sc } = locConverter.get(ident[0]);
+								const { line: el, column: ec } = locConverter.get(ident[1]);
+								const dep = new CssLocalIdentifierDependency(name, [
+									ident[0],
+									ident[1]
+								]);
+								dep.setLoc(sl, sc, el, ec);
+								module.addDependency(dep);
+								return ident[1];
+							} else if (name === "@property" && isLocalMode()) {
+								const ident = walkCssTokens.eatIdentSequence(input, end);
+								if (!ident) return end;
+								let name = input.slice(ident[0], ident[1]);
+								if (!name.startsWith("--") || name.length < 3) return end;
+								name = unescapeIdentifier(name.slice(2));
+								declaredCssVariables.add(name);
+								const { line: sl, column: sc } = locConverter.get(ident[0]);
+								const { line: el, column: ec } = locConverter.get(ident[1]);
+								const dep = new CssLocalIdentifierDependency(
+									name,
+									[ident[0], ident[1]],
+									"--"
+								);
+								dep.setLoc(sl, sc, el, ec);
+								module.addDependency(dep);
+								return ident[1];
+							} else if (name === "@scope") {
+								isNextRulePrelude = true;
+								return end;
+							}
+
+							isNextRulePrelude = false;
+						}
+					}
+				}
+
+				return end;
+			},
+			semicolon: (input, start, end) => {
+				if (isModules && scope === CSS_MODE_IN_BLOCK) {
+					if (isLocalMode()) {
+						processDeclarationValueDone(input);
+						inAnimationProperty = false;
+					}
+
+					isNextRulePrelude = isNextNestedSyntax(input, end);
+				}
+				return end;
+			},
+			identifier: (input, start, end) => {
+				if (isModules) {
+					const name = input.slice(start, end);
+
+					if (icssDefinitions.has(name)) {
+						let { path, value } =
+							/** @type {IcssDefinition} */
+							(icssDefinitions.get(name));
+
+						if (path) {
+							if (icssDefinitions.has(path)) {
+								const definition =
+									/** @type {IcssDefinition} */
+									(icssDefinitions.get(path));
+
+								path = definition.value.slice(1, -1);
+							}
+
+							const dep = new CssIcssImportDependency(path, value, [
+								start,
+								end - 1
+							]);
+							const { line: sl, column: sc } = locConverter.get(start);
+							const { line: el, column: ec } = locConverter.get(end - 1);
+							dep.setLoc(sl, sc, el, ec);
+							module.addDependency(dep);
+						} else {
+							const { line: sl, column: sc } = locConverter.get(start);
+							const { line: el, column: ec } = locConverter.get(end);
+							const dep = new CssIcssSymbolDependency(name, value, [
+								start,
+								end
+							]);
+							dep.setLoc(sl, sc, el, ec);
+							module.addDependency(dep);
+						}
+
+						return end;
+					}
+
+					switch (scope) {
+						case CSS_MODE_IN_BLOCK: {
+							if (isLocalMode()) {
+								// Handle only top level values and not inside functions
+								if (inAnimationProperty && balanced.length === 0) {
+									lastIdentifier = [start, end, true];
+								} else {
+									return processLocalDeclaration(input, start, end);
+								}
+							}
+							break;
+						}
+					}
+				}
+
+				return end;
+			},
+			delim: (input, start, end) => {
+				if (isNextRulePrelude && isLocalMode()) {
+					const ident = walkCssTokens.skipCommentsAndEatIdentSequence(
+						input,
+						end
+					);
+					if (!ident) return end;
+					const name = unescapeIdentifier(input.slice(ident[0], ident[1]));
+					const dep = new CssLocalIdentifierDependency(name, [
+						ident[0],
+						ident[1]
+					]);
+					const { line: sl, column: sc } = locConverter.get(ident[0]);
+					const { line: el, column: ec } = locConverter.get(ident[1]);
+					dep.setLoc(sl, sc, el, ec);
+					module.addDependency(dep);
+					return ident[1];
+				}
+
+				return end;
+			},
+			hash: (input, start, end, isID) => {
+				if (isNextRulePrelude && isLocalMode() && isID) {
+					const valueStart = start + 1;
+					const name = unescapeIdentifier(input.slice(valueStart, end));
+					const dep = new CssLocalIdentifierDependency(name, [valueStart, end]);
+					const { line: sl, column: sc } = locConverter.get(start);
+					const { line: el, column: ec } = locConverter.get(end);
+					dep.setLoc(sl, sc, el, ec);
+					module.addDependency(dep);
+				}
+
+				return end;
+			},
+			colon: (input, start, end) => {
+				if (isModules) {
+					const ident = walkCssTokens.skipCommentsAndEatIdentSequence(
+						input,
+						end
+					);
+					if (!ident) return end;
+					const name = input.slice(ident[0], ident[1]).toLowerCase();
+
+					switch (scope) {
+						case CSS_MODE_TOP_LEVEL: {
+							if (name === "import") {
+								const pos = parseImportOrExport(0, input, ident[1]);
+								const dep = new ConstDependency("", [start, pos]);
+								module.addPresentationalDependency(dep);
+								return pos;
+							} else if (name === "export") {
+								const pos = parseImportOrExport(1, input, ident[1]);
+								const dep = new ConstDependency("", [start, pos]);
+								module.addPresentationalDependency(dep);
+								return pos;
+							}
+						}
+						// falls through
+						default: {
+							if (isNextRulePrelude) {
+								const isFn = input.charCodeAt(ident[1]) === CC_LEFT_PARENTHESIS;
+
+								if (isFn && name === "local") {
+									const end = ident[1] + 1;
+									modeData = "local";
+									const dep = new ConstDependency("", [start, end]);
+									module.addPresentationalDependency(dep);
+									balanced.push([":local", start, end]);
+									return end;
+								} else if (name === "local") {
+									modeData = "local";
+									// Eat extra whitespace
+									end = walkCssTokens.eatWhitespace(input, ident[1]);
+
+									if (ident[1] === end) {
+										this._emitWarning(
+											state,
+											`Missing whitespace after ':local' in '${input.slice(
+												start,
+												eatUntilLeftCurly(input, end) + 1
+											)}'`,
+											locConverter,
+											start,
+											end
+										);
+									}
+
+									const dep = new ConstDependency("", [start, end]);
+									module.addPresentationalDependency(dep);
+									return end;
+								} else if (isFn && name === "global") {
+									const end = ident[1] + 1;
+									modeData = "global";
+									const dep = new ConstDependency("", [start, end]);
+									module.addPresentationalDependency(dep);
+									balanced.push([":global", start, end]);
+									return end;
+								} else if (name === "global") {
+									modeData = "global";
+									// Eat extra whitespace
+									end = walkCssTokens.eatWhitespace(input, ident[1]);
+
+									if (ident[1] === end) {
+										this._emitWarning(
+											state,
+											`Missing whitespace after ':global' in '${input.slice(
+												start,
+												eatUntilLeftCurly(input, end) + 1
+											)}'`,
+											locConverter,
+											start,
+											end
+										);
+									}
+
+									const dep = new ConstDependency("", [start, end]);
+									module.addPresentationalDependency(dep);
+									return end;
+								}
+							}
+						}
+					}
+				}
+
+				lastTokenEndForComments = end;
+
+				return end;
+			},
+			function: (input, start, end) => {
+				const name = input
+					.slice(start, end - 1)
+					.replace(/\\/g, "")
+					.toLowerCase();
+
+				balanced.push([name, start, end]);
+
+				switch (name) {
+					case "src":
+					case "url": {
+						if (!this.url) {
+							return end;
+						}
+
+						const string = walkCssTokens.eatString(input, end);
+						if (!string) return end;
+						const { options, errors: commentErrors } = this.parseCommentOptions(
+							[lastTokenEndForComments, end]
+						);
+						if (commentErrors) {
+							for (const e of commentErrors) {
+								const { comment } = e;
+								state.module.addWarning(
+									new CommentCompilationWarning(
+										`Compilation error while processing magic comment(-s): /*${comment.value}*/: ${e.message}`,
+										comment.loc
+									)
+								);
+							}
+						}
+						if (options && options.webpackIgnore !== undefined) {
+							if (typeof options.webpackIgnore !== "boolean") {
+								const { line: sl, column: sc } = locConverter.get(string[0]);
+								const { line: el, column: ec } = locConverter.get(string[1]);
+
+								state.module.addWarning(
+									new UnsupportedFeatureWarning(
+										`\`webpackIgnore\` expected a boolean, but received: ${options.webpackIgnore}.`,
+										{
+											start: { line: sl, column: sc },
+											end: { line: el, column: ec }
+										}
+									)
+								);
+							} else if (options.webpackIgnore) {
+								return end;
+							}
+						}
+						const value = normalizeUrl(
+							input.slice(string[0] + 1, string[1] - 1),
+							true
+						);
+						// Ignore `url()`, `url('')` and `url("")`, they are valid by spec
+						if (value.length === 0) return end;
+						const isUrl = name === "url" || name === "src";
+						const dep = new CssUrlDependency(
+							value,
+							[string[0], string[1]],
+							isUrl ? "string" : "url"
+						);
+						const { line: sl, column: sc } = locConverter.get(string[0]);
+						const { line: el, column: ec } = locConverter.get(string[1]);
+						dep.setLoc(sl, sc, el, ec);
+						module.addDependency(dep);
+						module.addCodeGenerationDependency(dep);
+						return string[1];
+					}
+					default: {
+						if (this.url && IMAGE_SET_FUNCTION.test(name)) {
+							lastTokenEndForComments = end;
+							const values = walkCssTokens.eatImageSetStrings(input, end, {
+								comment
+							});
+							if (values.length === 0) return end;
+							for (const [index, string] of values.entries()) {
+								const value = normalizeUrl(
+									input.slice(string[0] + 1, string[1] - 1),
+									true
+								);
+								if (value.length === 0) return end;
+								const { options, errors: commentErrors } =
+									this.parseCommentOptions([
+										index === 0 ? start : values[index - 1][1],
+										string[1]
+									]);
+								if (commentErrors) {
+									for (const e of commentErrors) {
+										const { comment } = e;
+										state.module.addWarning(
+											new CommentCompilationWarning(
+												`Compilation error while processing magic comment(-s): /*${comment.value}*/: ${e.message}`,
+												comment.loc
+											)
+										);
+									}
+								}
+								if (options && options.webpackIgnore !== undefined) {
+									if (typeof options.webpackIgnore !== "boolean") {
+										const { line: sl, column: sc } = locConverter.get(
+											string[0]
+										);
+										const { line: el, column: ec } = locConverter.get(
+											string[1]
+										);
+
+										state.module.addWarning(
+											new UnsupportedFeatureWarning(
+												`\`webpackIgnore\` expected a boolean, but received: ${options.webpackIgnore}.`,
+												{
+													start: { line: sl, column: sc },
+													end: { line: el, column: ec }
+												}
+											)
+										);
+									} else if (options.webpackIgnore) {
+										continue;
+									}
+								}
+								const dep = new CssUrlDependency(
+									value,
+									[string[0], string[1]],
+									"url"
+								);
+								const { line: sl, column: sc } = locConverter.get(string[0]);
+								const { line: el, column: ec } = locConverter.get(string[1]);
+								dep.setLoc(sl, sc, el, ec);
+								module.addDependency(dep);
+								module.addCodeGenerationDependency(dep);
+							}
+							// Can contain `url()` inside, so let's return end to allow parse them
+							return end;
+						} else if (isLocalMode()) {
+							// Don't rename animation name when we have `var()` function
+							if (inAnimationProperty && balanced.length === 1) {
+								lastIdentifier = undefined;
+							}
+
+							if (name === "var") {
+								const customIdent = walkCssTokens.eatIdentSequence(input, end);
+								if (!customIdent) return end;
+								let name = input.slice(customIdent[0], customIdent[1]);
+								// A custom property is any property whose name starts with two dashes (U+002D HYPHEN-MINUS), like --foo.
+								// The  production corresponds to this:
+								// it’s defined as any  (a valid identifier that starts with two dashes),
+								// except -- itself, which is reserved for future use by CSS.
+								if (!name.startsWith("--") || name.length < 3) return end;
+								name = unescapeIdentifier(
+									input.slice(customIdent[0] + 2, customIdent[1])
+								);
+								const afterCustomIdent = walkCssTokens.eatWhitespaceAndComments(
+									input,
+									customIdent[1]
+								);
+								if (
+									input.charCodeAt(afterCustomIdent) === CC_LOWER_F ||
+									input.charCodeAt(afterCustomIdent) === CC_UPPER_F
+								) {
+									const fromWord = walkCssTokens.eatIdentSequence(
+										input,
+										afterCustomIdent
+									);
+									if (
+										!fromWord ||
+										input.slice(fromWord[0], fromWord[1]).toLowerCase() !==
+											"from"
+									) {
+										return end;
+									}
+									const from = walkCssTokens.eatIdentSequenceOrString(
+										input,
+										walkCssTokens.eatWhitespaceAndComments(input, fromWord[1])
+									);
+									if (!from) {
+										return end;
+									}
+									const path = input.slice(from[0], from[1]);
+									if (from[2] === true && path === "global") {
+										const dep = new ConstDependency("", [
+											customIdent[1],
+											from[1]
+										]);
+										module.addPresentationalDependency(dep);
+										return end;
+									} else if (from[2] === false) {
+										const dep = new CssIcssImportDependency(
+											path.slice(1, -1),
+											name,
+											[customIdent[0], from[1] - 1]
+										);
+										const { line: sl, column: sc } = locConverter.get(
+											customIdent[0]
+										);
+										const { line: el, column: ec } = locConverter.get(
+											from[1] - 1
+										);
+										dep.setLoc(sl, sc, el, ec);
+										module.addDependency(dep);
+									}
+								} else {
+									const { line: sl, column: sc } = locConverter.get(
+										customIdent[0]
+									);
+									const { line: el, column: ec } = locConverter.get(
+										customIdent[1]
+									);
+									const dep = new CssSelfLocalIdentifierDependency(
+										name,
+										[customIdent[0], customIdent[1]],
+										"--",
+										declaredCssVariables
+									);
+									dep.setLoc(sl, sc, el, ec);
+									module.addDependency(dep);
+									return end;
+								}
+							}
+						}
+					}
+				}
+
+				return end;
+			},
+			leftParenthesis: (input, start, end) => {
+				balanced.push(["(", start, end]);
+
+				return end;
+			},
+			rightParenthesis: (input, start, end) => {
+				const popped = balanced.pop();
+
+				if (
+					isModules &&
+					popped &&
+					(popped[0] === ":local" || popped[0] === ":global")
+				) {
+					modeData = balanced[balanced.length - 1]
+						? /** @type {"local" | "global"} */
+							(balanced[balanced.length - 1][0])
+						: undefined;
+					const dep = new ConstDependency("", [start, end]);
+					module.addPresentationalDependency(dep);
+				}
+
+				return end;
+			},
+			comma: (input, start, end) => {
+				if (isModules) {
+					// Reset stack for `:global .class :local .class-other` selector after
+					modeData = undefined;
+
+					if (scope === CSS_MODE_IN_BLOCK && isLocalMode()) {
+						processDeclarationValueDone(input);
+					}
+				}
+
+				lastTokenEndForComments = start;
+
+				return end;
+			}
+		});
+
+		/** @type {BuildInfo} */
+		(module.buildInfo).strict = true;
+		/** @type {BuildMeta} */
+		(module.buildMeta).exportsType = this.namedExports
+			? "namespace"
+			: "default";
+
+		if (!this.namedExports) {
+			/** @type {BuildMeta} */
+			(module.buildMeta).defaultObject = "redirect";
+		}
+
+		module.addDependency(new StaticExportsDependency([], true));
+		return state;
+	}
+
+	/**
+	 * @param {Range} range range
+	 * @returns {Comment[]} comments in the range
+	 */
+	getComments(range) {
+		if (!this.comments) return [];
+		const [rangeStart, rangeEnd] = range;
+		/**
+		 * @param {Comment} comment comment
+		 * @param {number} needle needle
+		 * @returns {number} compared
+		 */
+		const compare = (comment, needle) =>
+			/** @type {Range} */ (comment.range)[0] - needle;
+		const comments = /** @type {Comment[]} */ (this.comments);
+		let idx = binarySearchBounds.ge(comments, rangeStart, compare);
+		/** @type {Comment[]} */
+		const commentsInRange = [];
+		while (
+			comments[idx] &&
+			/** @type {Range} */ (comments[idx].range)[1] <= rangeEnd
+		) {
+			commentsInRange.push(comments[idx]);
+			idx++;
+		}
+
+		return commentsInRange;
+	}
+
+	/**
+	 * @param {Range} range range of the comment
+	 * @returns {{ options: Record | null, errors: (Error & { comment: Comment })[] | null }} result
+	 */
+	parseCommentOptions(range) {
+		const comments = this.getComments(range);
+		if (comments.length === 0) {
+			return EMPTY_COMMENT_OPTIONS;
+		}
+		/** @type {Record } */
+		const options = {};
+		/** @type {(Error & { comment: Comment })[]} */
+		const errors = [];
+		for (const comment of comments) {
+			const { value } = comment;
+			if (value && webpackCommentRegExp.test(value)) {
+				// try compile only if webpack options comment is present
+				try {
+					for (let [key, val] of Object.entries(
+						vm.runInContext(
+							`(function(){return {${value}};})()`,
+							this.magicCommentContext
+						)
+					)) {
+						if (typeof val === "object" && val !== null) {
+							val =
+								val.constructor.name === "RegExp"
+									? new RegExp(val)
+									: JSON.parse(JSON.stringify(val));
+						}
+						options[key] = val;
+					}
+				} catch (err) {
+					const newErr = new Error(String(/** @type {Error} */ (err).message));
+					newErr.stack = String(/** @type {Error} */ (err).stack);
+					Object.assign(newErr, { comment });
+					errors.push(/** @type (Error & { comment: Comment }) */ (newErr));
+				}
+			}
+		}
+		return { options, errors };
+	}
+}
+
+module.exports = CssParser;
+module.exports.escapeIdentifier = escapeIdentifier;
+module.exports.unescapeIdentifier = unescapeIdentifier;
diff --git a/lib/css/walkCssTokens.js b/lib/css/walkCssTokens.js
new file mode 100644
index 00000000000..ea019b3e4b6
--- /dev/null
+++ b/lib/css/walkCssTokens.js
@@ -0,0 +1,1627 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+/**
+ * @typedef {object} CssTokenCallbacks
+ * @property {((input: string, start: number, end: number, innerStart: number, innerEnd: number) => number)=} url
+ * @property {((input: string, start: number, end: number) => number)=} comment
+ * @property {((input: string, start: number, end: number) => number)=} string
+ * @property {((input: string, start: number, end: number) => number)=} leftParenthesis
+ * @property {((input: string, start: number, end: number) => number)=} rightParenthesis
+ * @property {((input: string, start: number, end: number) => number)=} function
+ * @property {((input: string, start: number, end: number) => number)=} colon
+ * @property {((input: string, start: number, end: number) => number)=} atKeyword
+ * @property {((input: string, start: number, end: number) => number)=} delim
+ * @property {((input: string, start: number, end: number) => number)=} identifier
+ * @property {((input: string, start: number, end: number, isId: boolean) => number)=} hash
+ * @property {((input: string, start: number, end: number) => number)=} leftCurlyBracket
+ * @property {((input: string, start: number, end: number) => number)=} rightCurlyBracket
+ * @property {((input: string, start: number, end: number) => number)=} semicolon
+ * @property {((input: string, start: number, end: number) => number)=} comma
+ * @property {(() => boolean)=} needTerminate
+ */
+
+/** @typedef {(input: string, pos: number, callbacks: CssTokenCallbacks) => number} CharHandler */
+
+// spec: https://drafts.csswg.org/css-syntax/
+
+const CC_LINE_FEED = "\n".charCodeAt(0);
+const CC_CARRIAGE_RETURN = "\r".charCodeAt(0);
+const CC_FORM_FEED = "\f".charCodeAt(0);
+
+const CC_TAB = "\t".charCodeAt(0);
+const CC_SPACE = " ".charCodeAt(0);
+
+const CC_SOLIDUS = "/".charCodeAt(0);
+const CC_REVERSE_SOLIDUS = "\\".charCodeAt(0);
+const CC_ASTERISK = "*".charCodeAt(0);
+
+const CC_LEFT_PARENTHESIS = "(".charCodeAt(0);
+const CC_RIGHT_PARENTHESIS = ")".charCodeAt(0);
+const CC_LEFT_CURLY = "{".charCodeAt(0);
+const CC_RIGHT_CURLY = "}".charCodeAt(0);
+const CC_LEFT_SQUARE = "[".charCodeAt(0);
+const CC_RIGHT_SQUARE = "]".charCodeAt(0);
+
+const CC_QUOTATION_MARK = '"'.charCodeAt(0);
+const CC_APOSTROPHE = "'".charCodeAt(0);
+
+const CC_FULL_STOP = ".".charCodeAt(0);
+const CC_COLON = ":".charCodeAt(0);
+const CC_SEMICOLON = ";".charCodeAt(0);
+const CC_COMMA = ",".charCodeAt(0);
+const CC_PERCENTAGE = "%".charCodeAt(0);
+const CC_AT_SIGN = "@".charCodeAt(0);
+
+const CC_LOW_LINE = "_".charCodeAt(0);
+const CC_LOWER_A = "a".charCodeAt(0);
+const CC_LOWER_F = "f".charCodeAt(0);
+const CC_LOWER_E = "e".charCodeAt(0);
+const CC_LOWER_U = "u".charCodeAt(0);
+const CC_LOWER_Z = "z".charCodeAt(0);
+const CC_UPPER_A = "A".charCodeAt(0);
+const CC_UPPER_F = "F".charCodeAt(0);
+const CC_UPPER_E = "E".charCodeAt(0);
+const CC_UPPER_U = "E".charCodeAt(0);
+const CC_UPPER_Z = "Z".charCodeAt(0);
+const CC_0 = "0".charCodeAt(0);
+const CC_9 = "9".charCodeAt(0);
+
+const CC_NUMBER_SIGN = "#".charCodeAt(0);
+const CC_PLUS_SIGN = "+".charCodeAt(0);
+const CC_HYPHEN_MINUS = "-".charCodeAt(0);
+
+const CC_LESS_THAN_SIGN = "<".charCodeAt(0);
+const CC_GREATER_THAN_SIGN = ">".charCodeAt(0);
+
+/** @type {CharHandler} */
+const consumeSpace = (input, pos, _callbacks) => {
+	// Consume as much whitespace as possible.
+	while (_isWhiteSpace(input.charCodeAt(pos))) {
+		pos++;
+	}
+
+	// Return a .
+	return pos;
+};
+
+// U+000A LINE FEED. Note that U+000D CARRIAGE RETURN and U+000C FORM FEED are not included in this definition,
+// as they are converted to U+000A LINE FEED during preprocessing.
+//
+// Replace any U+000D CARRIAGE RETURN (CR) code points, U+000C FORM FEED (FF) code points, or pairs of U+000D CARRIAGE RETURN (CR) followed by U+000A LINE FEED (LF) in input by a single U+000A LINE FEED (LF) code point.
+
+/**
+ * @param {number} cc char code
+ * @returns {boolean} true, if cc is a newline
+ */
+const _isNewline = cc =>
+	cc === CC_LINE_FEED || cc === CC_CARRIAGE_RETURN || cc === CC_FORM_FEED;
+
+/**
+ * @param {number} cc char code
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {number} position
+ */
+const consumeExtraNewline = (cc, input, pos) => {
+	if (cc === CC_CARRIAGE_RETURN && input.charCodeAt(pos) === CC_LINE_FEED) {
+		pos++;
+	}
+
+	return pos;
+};
+
+/**
+ * @param {number} cc char code
+ * @returns {boolean} true, if cc is a space (U+0009 CHARACTER TABULATION or U+0020 SPACE)
+ */
+const _isSpace = cc => cc === CC_TAB || cc === CC_SPACE;
+
+/**
+ * @param {number} cc char code
+ * @returns {boolean} true, if cc is a whitespace
+ */
+const _isWhiteSpace = cc => _isNewline(cc) || _isSpace(cc);
+
+/**
+ * ident-start code point
+ *
+ * A letter, a non-ASCII code point, or U+005F LOW LINE (_).
+ * @param {number} cc char code
+ * @returns {boolean} true, if cc is a start code point of an identifier
+ */
+const isIdentStartCodePoint = cc =>
+	(cc >= CC_LOWER_A && cc <= CC_LOWER_Z) ||
+	(cc >= CC_UPPER_A && cc <= CC_UPPER_Z) ||
+	cc === CC_LOW_LINE ||
+	cc >= 0x80;
+
+/** @type {CharHandler} */
+const consumeDelimToken = (input, pos, _callbacks) =>
+	// Return a  with its value set to the current input code point.
+	pos;
+
+/** @type {CharHandler} */
+const consumeComments = (input, pos, callbacks) => {
+	// This section describes how to consume comments from a stream of code points. It returns nothing.
+	// If the next two input code point are U+002F SOLIDUS (/) followed by a U+002A ASTERISK (*),
+	// consume them and all following code points up to and including the first U+002A ASTERISK (*)
+	// followed by a U+002F SOLIDUS (/), or up to an EOF code point.
+	// Return to the start of this step.
+	while (
+		input.charCodeAt(pos) === CC_SOLIDUS &&
+		input.charCodeAt(pos + 1) === CC_ASTERISK
+	) {
+		const start = pos;
+		pos += 2;
+
+		for (;;) {
+			if (pos === input.length) {
+				// If the preceding paragraph ended by consuming an EOF code point, this is a parse error.
+				return pos;
+			}
+
+			if (
+				input.charCodeAt(pos) === CC_ASTERISK &&
+				input.charCodeAt(pos + 1) === CC_SOLIDUS
+			) {
+				pos += 2;
+
+				if (callbacks.comment) {
+					pos = callbacks.comment(input, start, pos);
+				}
+
+				break;
+			}
+
+			pos++;
+		}
+	}
+
+	return pos;
+};
+
+/**
+ * @param {number} cc char code
+ * @returns {boolean} true, if cc is a hex digit
+ */
+const _isHexDigit = cc =>
+	_isDigit(cc) ||
+	(cc >= CC_UPPER_A && cc <= CC_UPPER_F) ||
+	(cc >= CC_LOWER_A && cc <= CC_LOWER_F);
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {number} position
+ */
+const _consumeAnEscapedCodePoint = (input, pos) => {
+	// This section describes how to consume an escaped code point.
+	// It assumes that the U+005C REVERSE SOLIDUS (\) has already been consumed and that the next input code point has already been verified to be part of a valid escape.
+	// It will return a code point.
+
+	// Consume the next input code point.
+	const cc = input.charCodeAt(pos);
+	pos++;
+
+	// EOF
+	// This is a parse error. Return U+FFFD REPLACEMENT CHARACTER (�).
+	if (pos === input.length) {
+		return pos;
+	}
+
+	// hex digit
+	// Consume as many hex digits as possible, but no more than 5.
+	// Note that this means 1-6 hex digits have been consumed in total.
+	// If the next input code point is whitespace, consume it as well.
+	// Interpret the hex digits as a hexadecimal number.
+	// If this number is zero, or is for a surrogate, or is greater than the maximum allowed code point, return U+FFFD REPLACEMENT CHARACTER (�).
+	// Otherwise, return the code point with that value.
+	if (_isHexDigit(cc)) {
+		for (let i = 0; i < 5; i++) {
+			if (_isHexDigit(input.charCodeAt(pos))) {
+				pos++;
+			}
+		}
+
+		const cc = input.charCodeAt(pos);
+
+		if (_isWhiteSpace(cc)) {
+			pos++;
+			pos = consumeExtraNewline(cc, input, pos);
+		}
+
+		return pos;
+	}
+
+	// anything else
+	// Return the current input code point.
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeAStringToken = (input, pos, callbacks) => {
+	// This section describes how to consume a string token from a stream of code points.
+	// It returns either a  or .
+	//
+	// This algorithm may be called with an ending code point, which denotes the code point that ends the string.
+	// If an ending code point is not specified, the current input code point is used.
+	const start = pos - 1;
+	const endingCodePoint = input.charCodeAt(pos - 1);
+
+	// Initially create a  with its value set to the empty string.
+
+	// Repeatedly consume the next input code point from the stream:
+	for (;;) {
+		// EOF
+		// This is a parse error. Return the .
+		if (pos === input.length) {
+			if (callbacks.string !== undefined) {
+				return callbacks.string(input, start, pos);
+			}
+
+			return pos;
+		}
+
+		const cc = input.charCodeAt(pos);
+		pos++;
+
+		// ending code point
+		// Return the .
+		if (cc === endingCodePoint) {
+			if (callbacks.string !== undefined) {
+				return callbacks.string(input, start, pos);
+			}
+
+			return pos;
+		}
+		// newline
+		// This is a parse error.
+		// Reconsume the current input code point, create a , and return it.
+		else if (_isNewline(cc)) {
+			pos--;
+			// bad string
+			return pos;
+		}
+		// U+005C REVERSE SOLIDUS (\)
+		else if (cc === CC_REVERSE_SOLIDUS) {
+			// If the next input code point is EOF, do nothing.
+			if (pos === input.length) {
+				return pos;
+			}
+			// Otherwise, if the next input code point is a newline, consume it.
+			else if (_isNewline(input.charCodeAt(pos))) {
+				const cc = input.charCodeAt(pos);
+				pos++;
+				pos = consumeExtraNewline(cc, input, pos);
+			}
+			// Otherwise, (the stream starts with a valid escape) consume an escaped code point and append the returned code point to the ’s value.
+			else if (_ifTwoCodePointsAreValidEscape(input, pos)) {
+				pos = _consumeAnEscapedCodePoint(input, pos);
+			}
+		}
+		// anything else
+		// Append the current input code point to the ’s value.
+		else {
+			// Append
+		}
+	}
+};
+
+/**
+ * @param {number} cc char code
+ * @param {number} q char code
+ * @returns {boolean} is non-ASCII code point
+ */
+const isNonASCIICodePoint = (cc, q) =>
+	// Simplify
+	cc > 0x80;
+/**
+ * @param {number} cc char code
+ * @returns {boolean} is letter
+ */
+const isLetter = cc =>
+	(cc >= CC_LOWER_A && cc <= CC_LOWER_Z) ||
+	(cc >= CC_UPPER_A && cc <= CC_UPPER_Z);
+
+/**
+ * @param {number} cc char code
+ * @param {number} q char code
+ * @returns {boolean} is identifier start code
+ */
+const _isIdentStartCodePoint = (cc, q) =>
+	isLetter(cc) || isNonASCIICodePoint(cc, q) || cc === CC_LOW_LINE;
+
+/**
+ * @param {number} cc char code
+ * @param {number} q char code
+ * @returns {boolean} is identifier code
+ */
+const _isIdentCodePoint = (cc, q) =>
+	_isIdentStartCodePoint(cc, q) || _isDigit(cc) || cc === CC_HYPHEN_MINUS;
+/**
+ * @param {number} cc char code
+ * @returns {boolean} is digit
+ */
+const _isDigit = cc => cc >= CC_0 && cc <= CC_9;
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @param {number=} f first code point
+ * @param {number=} s second code point
+ * @returns {boolean} true if two code points are a valid escape
+ */
+const _ifTwoCodePointsAreValidEscape = (input, pos, f, s) => {
+	// This section describes how to check if two code points are a valid escape.
+	// The algorithm described here can be called explicitly with two code points, or can be called with the input stream itself.
+	// In the latter case, the two code points in question are the current input code point and the next input code point, in that order.
+
+	// Note: This algorithm will not consume any additional code point.
+	const first = f || input.charCodeAt(pos - 1);
+	const second = s || input.charCodeAt(pos);
+
+	// If the first code point is not U+005C REVERSE SOLIDUS (\), return false.
+	if (first !== CC_REVERSE_SOLIDUS) return false;
+	// Otherwise, if the second code point is a newline, return false.
+	if (_isNewline(second)) return false;
+	// Otherwise, return true.
+	return true;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @param {number=} f first
+ * @param {number=} s second
+ * @param {number=} t third
+ * @returns {boolean} true, if input at pos starts an identifier
+ */
+const _ifThreeCodePointsWouldStartAnIdentSequence = (input, pos, f, s, t) => {
+	// This section describes how to check if three code points would start an ident sequence.
+	// The algorithm described here can be called explicitly with three code points, or can be called with the input stream itself.
+	// In the latter case, the three code points in question are the current input code point and the next two input code points, in that order.
+
+	// Note: This algorithm will not consume any additional code points.
+
+	const first = f || input.charCodeAt(pos - 1);
+	const second = s || input.charCodeAt(pos);
+	const third = t || input.charCodeAt(pos + 1);
+
+	// Look at the first code point:
+
+	// U+002D HYPHEN-MINUS
+	if (first === CC_HYPHEN_MINUS) {
+		// If the second code point is an ident-start code point or a U+002D HYPHEN-MINUS
+		// or a U+002D HYPHEN-MINUS, or the second and third code points are a valid escape, return true.
+		if (
+			_isIdentStartCodePoint(second, pos) ||
+			second === CC_HYPHEN_MINUS ||
+			_ifTwoCodePointsAreValidEscape(input, pos, second, third)
+		) {
+			return true;
+		}
+		return false;
+	}
+	// ident-start code point
+	else if (_isIdentStartCodePoint(first, pos - 1)) {
+		return true;
+	}
+	// U+005C REVERSE SOLIDUS (\)
+	// If the first and second code points are a valid escape, return true. Otherwise, return false.
+	else if (first === CC_REVERSE_SOLIDUS) {
+		if (_ifTwoCodePointsAreValidEscape(input, pos, first, second)) {
+			return true;
+		}
+
+		return false;
+	}
+	// anything else
+	// Return false.
+	return false;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @param {number=} f first
+ * @param {number=} s second
+ * @param {number=} t third
+ * @returns {boolean} true, if input at pos starts an identifier
+ */
+const _ifThreeCodePointsWouldStartANumber = (input, pos, f, s, t) => {
+	// This section describes how to check if three code points would start a number.
+	// The algorithm described here can be called explicitly with three code points, or can be called with the input stream itself.
+	// In the latter case, the three code points in question are the current input code point and the next two input code points, in that order.
+
+	// Note: This algorithm will not consume any additional code points.
+
+	const first = f || input.charCodeAt(pos - 1);
+	const second = s || input.charCodeAt(pos);
+	const third = t || input.charCodeAt(pos);
+
+	// Look at the first code point:
+
+	// U+002B PLUS SIGN (+)
+	// U+002D HYPHEN-MINUS (-)
+	//
+	// If the second code point is a digit, return true.
+	// Otherwise, if the second code point is a U+002E FULL STOP (.) and the third code point is a digit, return true.
+	// Otherwise, return false.
+	if (first === CC_PLUS_SIGN || first === CC_HYPHEN_MINUS) {
+		if (_isDigit(second)) {
+			return true;
+		} else if (second === CC_FULL_STOP && _isDigit(third)) {
+			return true;
+		}
+
+		return false;
+	}
+	// U+002E FULL STOP (.)
+	// If the second code point is a digit, return true. Otherwise, return false.
+	else if (first === CC_FULL_STOP) {
+		if (_isDigit(second)) {
+			return true;
+		}
+
+		return false;
+	}
+	// digit
+	// Return true.
+	else if (_isDigit(first)) {
+		return true;
+	}
+
+	// anything else
+	// Return false.
+	return false;
+};
+
+/** @type {CharHandler} */
+const consumeNumberSign = (input, pos, callbacks) => {
+	// If the next input code point is an ident code point or the next two input code points are a valid escape, then:
+	// - Create a .
+	// - If the next 3 input code points would start an ident sequence, set the ’s type flag to "id".
+	// - Consume an ident sequence, and set the ’s value to the returned string.
+	// - Return the .
+	const start = pos - 1;
+	const first = input.charCodeAt(pos);
+	const second = input.charCodeAt(pos + 1);
+
+	if (
+		_isIdentCodePoint(first, pos - 1) ||
+		_ifTwoCodePointsAreValidEscape(input, pos, first, second)
+	) {
+		const third = input.charCodeAt(pos + 2);
+		let isId = false;
+
+		if (
+			_ifThreeCodePointsWouldStartAnIdentSequence(
+				input,
+				pos,
+				first,
+				second,
+				third
+			)
+		) {
+			isId = true;
+		}
+
+		pos = _consumeAnIdentSequence(input, pos, callbacks);
+
+		if (callbacks.hash !== undefined) {
+			return callbacks.hash(input, start, pos, isId);
+		}
+
+		return pos;
+	}
+
+	// Otherwise, return a  with its value set to the current input code point.
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeHyphenMinus = (input, pos, callbacks) => {
+	// If the input stream starts with a number, reconsume the current input code point, consume a numeric token, and return it.
+	if (_ifThreeCodePointsWouldStartANumber(input, pos)) {
+		pos--;
+		return consumeANumericToken(input, pos, callbacks);
+	}
+	// Otherwise, if the next 2 input code points are U+002D HYPHEN-MINUS U+003E GREATER-THAN SIGN (->), consume them and return a .
+	else if (
+		input.charCodeAt(pos) === CC_HYPHEN_MINUS &&
+		input.charCodeAt(pos + 1) === CC_GREATER_THAN_SIGN
+	) {
+		return pos + 2;
+	}
+	// Otherwise, if the input stream starts with an ident sequence, reconsume the current input code point, consume an ident-like token, and return it.
+	else if (_ifThreeCodePointsWouldStartAnIdentSequence(input, pos)) {
+		pos--;
+		return consumeAnIdentLikeToken(input, pos, callbacks);
+	}
+
+	// Otherwise, return a  with its value set to the current input code point.
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeFullStop = (input, pos, callbacks) => {
+	const start = pos - 1;
+
+	// If the input stream starts with a number, reconsume the current input code point, consume a numeric token, and return it.
+	if (_ifThreeCodePointsWouldStartANumber(input, pos)) {
+		pos--;
+		return consumeANumericToken(input, pos, callbacks);
+	}
+
+	// Otherwise, return a  with its value set to the current input code point.
+	if (callbacks.delim !== undefined) {
+		return callbacks.delim(input, start, pos);
+	}
+
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumePlusSign = (input, pos, callbacks) => {
+	// If the input stream starts with a number, reconsume the current input code point, consume a numeric token, and return it.
+	if (_ifThreeCodePointsWouldStartANumber(input, pos)) {
+		pos--;
+		return consumeANumericToken(input, pos, callbacks);
+	}
+
+	// Otherwise, return a  with its value set to the current input code point.
+	return pos;
+};
+
+/** @type {CharHandler} */
+const _consumeANumber = (input, pos) => {
+	// This section describes how to consume a number from a stream of code points.
+	// It returns a numeric value, and a type which is either "integer" or "number".
+
+	// Execute the following steps in order:
+	// Initially set type to "integer". Let repr be the empty string.
+
+	// If the next input code point is U+002B PLUS SIGN (+) or U+002D HYPHEN-MINUS (-), consume it and append it to repr.
+	if (
+		input.charCodeAt(pos) === CC_HYPHEN_MINUS ||
+		input.charCodeAt(pos) === CC_PLUS_SIGN
+	) {
+		pos++;
+	}
+
+	// While the next input code point is a digit, consume it and append it to repr.
+	while (_isDigit(input.charCodeAt(pos))) {
+		pos++;
+	}
+
+	// If the next 2 input code points are U+002E FULL STOP (.) followed by a digit, then:
+	// 1. Consume the next input code point and append it to number part.
+	// 2. While the next input code point is a digit, consume it and append it to number part.
+	// 3. Set type to "number".
+	if (
+		input.charCodeAt(pos) === CC_FULL_STOP &&
+		_isDigit(input.charCodeAt(pos + 1))
+	) {
+		pos++;
+
+		while (_isDigit(input.charCodeAt(pos))) {
+			pos++;
+		}
+	}
+
+	// If the next 2 or 3 input code points are U+0045 LATIN CAPITAL LETTER E (E) or U+0065 LATIN SMALL LETTER E (e), optionally followed by U+002D HYPHEN-MINUS (-) or U+002B PLUS SIGN (+), followed by a digit, then:
+	// 1. Consume the next input code point.
+	// 2. If the next input code point is "+" or "-", consume it and append it to exponent part.
+	// 3. While the next input code point is a digit, consume it and append it to exponent part.
+	// 4. Set type to "number".
+	if (
+		(input.charCodeAt(pos) === CC_LOWER_E ||
+			input.charCodeAt(pos) === CC_UPPER_E) &&
+		(((input.charCodeAt(pos + 1) === CC_HYPHEN_MINUS ||
+			input.charCodeAt(pos + 1) === CC_PLUS_SIGN) &&
+			_isDigit(input.charCodeAt(pos + 2))) ||
+			_isDigit(input.charCodeAt(pos + 1)))
+	) {
+		pos++;
+
+		if (
+			input.charCodeAt(pos) === CC_PLUS_SIGN ||
+			input.charCodeAt(pos) === CC_HYPHEN_MINUS
+		) {
+			pos++;
+		}
+
+		while (_isDigit(input.charCodeAt(pos))) {
+			pos++;
+		}
+	}
+
+	// Let value be the result of interpreting number part as a base-10 number.
+
+	// If exponent part is non-empty, interpret it as a base-10 integer, then raise 10 to the power of the result, multiply it by value, and set value to that result.
+
+	// Return value and type.
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeANumericToken = (input, pos, callbacks) => {
+	// This section describes how to consume a numeric token from a stream of code points.
+	// It returns either a , , or .
+
+	// Consume a number and let number be the result.
+	pos = _consumeANumber(input, pos, callbacks);
+
+	// If the next 3 input code points would start an ident sequence, then:
+	//
+	// - Create a  with the same value and type flag as number, and a unit set initially to the empty string.
+	// - Consume an ident sequence. Set the ’s unit to the returned value.
+	// - Return the .
+
+	const first = input.charCodeAt(pos);
+	const second = input.charCodeAt(pos + 1);
+	const third = input.charCodeAt(pos + 2);
+
+	if (
+		_ifThreeCodePointsWouldStartAnIdentSequence(
+			input,
+			pos,
+			first,
+			second,
+			third
+		)
+	) {
+		return _consumeAnIdentSequence(input, pos, callbacks);
+	}
+	// Otherwise, if the next input code point is U+0025 PERCENTAGE SIGN (%), consume it.
+	// Create a  with the same value as number, and return it.
+	else if (first === CC_PERCENTAGE) {
+		return pos + 1;
+	}
+
+	// Otherwise, create a  with the same value and type flag as number, and return it.
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeColon = (input, pos, callbacks) => {
+	// Return a .
+	if (callbacks.colon !== undefined) {
+		return callbacks.colon(input, pos - 1, pos);
+	}
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeLeftParenthesis = (input, pos, callbacks) => {
+	// Return a <(-token>.
+	if (callbacks.leftParenthesis !== undefined) {
+		return callbacks.leftParenthesis(input, pos - 1, pos);
+	}
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeRightParenthesis = (input, pos, callbacks) => {
+	// Return a <)-token>.
+	if (callbacks.rightParenthesis !== undefined) {
+		return callbacks.rightParenthesis(input, pos - 1, pos);
+	}
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeLeftSquareBracket = (input, pos, callbacks) =>
+	// Return a <]-token>.
+	pos;
+
+/** @type {CharHandler} */
+const consumeRightSquareBracket = (input, pos, callbacks) =>
+	// Return a <]-token>.
+	pos;
+
+/** @type {CharHandler} */
+const consumeLeftCurlyBracket = (input, pos, callbacks) => {
+	// Return a <{-token>.
+	if (callbacks.leftCurlyBracket !== undefined) {
+		return callbacks.leftCurlyBracket(input, pos - 1, pos);
+	}
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeRightCurlyBracket = (input, pos, callbacks) => {
+	// Return a <}-token>.
+	if (callbacks.rightCurlyBracket !== undefined) {
+		return callbacks.rightCurlyBracket(input, pos - 1, pos);
+	}
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeSemicolon = (input, pos, callbacks) => {
+	// Return a .
+	if (callbacks.semicolon !== undefined) {
+		return callbacks.semicolon(input, pos - 1, pos);
+	}
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeComma = (input, pos, callbacks) => {
+	// Return a .
+	if (callbacks.comma !== undefined) {
+		return callbacks.comma(input, pos - 1, pos);
+	}
+	return pos;
+};
+
+/** @type {CharHandler} */
+const _consumeAnIdentSequence = (input, pos) => {
+	// This section describes how to consume an ident sequence from a stream of code points.
+	// It returns a string containing the largest name that can be formed from adjacent code points in the stream, starting from the first.
+
+	// Note: This algorithm does not do the verification of the first few code points that are necessary to ensure the returned code points would constitute an .
+	// If that is the intended use, ensure that the stream starts with an ident sequence before calling this algorithm.
+
+	// Let result initially be an empty string.
+
+	// Repeatedly consume the next input code point from the stream:
+	for (;;) {
+		const cc = input.charCodeAt(pos);
+		pos++;
+
+		// ident code point
+		// Append the code point to result.
+		if (_isIdentCodePoint(cc, pos - 1)) {
+			// Nothing
+		}
+		// the stream starts with a valid escape
+		// Consume an escaped code point. Append the returned code point to result.
+		else if (_ifTwoCodePointsAreValidEscape(input, pos)) {
+			pos = _consumeAnEscapedCodePoint(input, pos);
+		}
+		// anything else
+		// Reconsume the current input code point. Return result.
+		else {
+			return pos - 1;
+		}
+	}
+};
+
+/**
+ * @param {number} cc char code
+ * @returns {boolean} true, when cc is the non-printable code point, otherwise false
+ */
+const _isNonPrintableCodePoint = cc =>
+	(cc >= 0x00 && cc <= 0x08) ||
+	cc === 0x0b ||
+	(cc >= 0x0e && cc <= 0x1f) ||
+	cc === 0x7f;
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {number} position
+ */
+const consumeTheRemnantsOfABadUrl = (input, pos) => {
+	// This section describes how to consume the remnants of a bad url from a stream of code points,
+	// "cleaning up" after the tokenizer realizes that it’s in the middle of a  rather than a .
+	// It returns nothing; its sole use is to consume enough of the input stream to reach a recovery point where normal tokenizing can resume.
+
+	// Repeatedly consume the next input code point from the stream:
+	for (;;) {
+		// EOF
+		// Return.
+		if (pos === input.length) {
+			return pos;
+		}
+
+		const cc = input.charCodeAt(pos);
+		pos++;
+
+		// U+0029 RIGHT PARENTHESIS ())
+		// Return.
+		if (cc === CC_RIGHT_PARENTHESIS) {
+			return pos;
+		}
+		// the input stream starts with a valid escape
+		// Consume an escaped code point.
+		// This allows an escaped right parenthesis ("\)") to be encountered without ending the .
+		// This is otherwise identical to the "anything else" clause.
+		else if (_ifTwoCodePointsAreValidEscape(input, pos)) {
+			pos = _consumeAnEscapedCodePoint(input, pos);
+		}
+		// anything else
+		// Do nothing.
+		else {
+			// Do nothing.
+		}
+	}
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @param {number} fnStart start
+ * @param {CssTokenCallbacks} callbacks callbacks
+ * @returns {pos} pos
+ */
+const consumeAUrlToken = (input, pos, fnStart, callbacks) => {
+	// This section describes how to consume a url token from a stream of code points.
+	// It returns either a  or a .
+
+	// Note: This algorithm assumes that the initial "url(" has already been consumed.
+	// This algorithm also assumes that it’s being called to consume an "unquoted" value, like url(foo).
+	// A quoted value, like url("foo"), is parsed as a .
+	// Consume an ident-like token automatically handles this distinction; this algorithm shouldn’t be called directly otherwise.
+
+	// Initially create a  with its value set to the empty string.
+
+	// Consume as much whitespace as possible.
+	while (_isWhiteSpace(input.charCodeAt(pos))) {
+		pos++;
+	}
+
+	const contentStart = pos;
+
+	// Repeatedly consume the next input code point from the stream:
+	for (;;) {
+		// EOF
+		// This is a parse error. Return the .
+		if (pos === input.length) {
+			if (callbacks.url !== undefined) {
+				return callbacks.url(input, fnStart, pos, contentStart, pos - 1);
+			}
+
+			return pos;
+		}
+
+		const cc = input.charCodeAt(pos);
+		pos++;
+
+		// U+0029 RIGHT PARENTHESIS ())
+		// Return the .
+		if (cc === CC_RIGHT_PARENTHESIS) {
+			if (callbacks.url !== undefined) {
+				return callbacks.url(input, fnStart, pos, contentStart, pos - 1);
+			}
+
+			return pos;
+		}
+		// whitespace
+		// Consume as much whitespace as possible.
+		// If the next input code point is U+0029 RIGHT PARENTHESIS ()) or EOF, consume it and return the 
+		// (if EOF was encountered, this is a parse error); otherwise, consume the remnants of a bad url, create a , and return it.
+		else if (_isWhiteSpace(cc)) {
+			const end = pos - 1;
+
+			while (_isWhiteSpace(input.charCodeAt(pos))) {
+				pos++;
+			}
+
+			if (pos === input.length) {
+				if (callbacks.url !== undefined) {
+					return callbacks.url(input, fnStart, pos, contentStart, end);
+				}
+
+				return pos;
+			}
+
+			if (input.charCodeAt(pos) === CC_RIGHT_PARENTHESIS) {
+				pos++;
+
+				if (callbacks.url !== undefined) {
+					return callbacks.url(input, fnStart, pos, contentStart, end);
+				}
+
+				return pos;
+			}
+
+			// Don't handle bad urls
+			return consumeTheRemnantsOfABadUrl(input, pos);
+		}
+		// U+0022 QUOTATION MARK (")
+		// U+0027 APOSTROPHE (')
+		// U+0028 LEFT PARENTHESIS (()
+		// non-printable code point
+		// This is a parse error. Consume the remnants of a bad url, create a , and return it.
+		else if (
+			cc === CC_QUOTATION_MARK ||
+			cc === CC_APOSTROPHE ||
+			cc === CC_LEFT_PARENTHESIS ||
+			_isNonPrintableCodePoint(cc)
+		) {
+			// Don't handle bad urls
+			return consumeTheRemnantsOfABadUrl(input, pos);
+		}
+		// // U+005C REVERSE SOLIDUS (\)
+		// // If the stream starts with a valid escape, consume an escaped code point and append the returned code point to the ’s value.
+		// // Otherwise, this is a parse error. Consume the remnants of a bad url, create a , and return it.
+		else if (cc === CC_REVERSE_SOLIDUS) {
+			if (_ifTwoCodePointsAreValidEscape(input, pos)) {
+				pos = _consumeAnEscapedCodePoint(input, pos);
+			} else {
+				// Don't handle bad urls
+				return consumeTheRemnantsOfABadUrl(input, pos);
+			}
+		}
+		// anything else
+		// Append the current input code point to the ’s value.
+		else {
+			// Nothing
+		}
+	}
+};
+
+/** @type {CharHandler} */
+const consumeAnIdentLikeToken = (input, pos, callbacks) => {
+	const start = pos;
+	// This section describes how to consume an ident-like token from a stream of code points.
+	// It returns an , , , or .
+	pos = _consumeAnIdentSequence(input, pos, callbacks);
+
+	// If string’s value is an ASCII case-insensitive match for "url", and the next input code point is U+0028 LEFT PARENTHESIS ((), consume it.
+	// While the next two input code points are whitespace, consume the next input code point.
+	// If the next one or two input code points are U+0022 QUOTATION MARK ("), U+0027 APOSTROPHE ('), or whitespace followed by U+0022 QUOTATION MARK (") or U+0027 APOSTROPHE ('), then create a  with its value set to string and return it.
+	// Otherwise, consume a url token, and return it.
+	if (
+		input.slice(start, pos).toLowerCase() === "url" &&
+		input.charCodeAt(pos) === CC_LEFT_PARENTHESIS
+	) {
+		pos++;
+		const end = pos;
+
+		while (
+			_isWhiteSpace(input.charCodeAt(pos)) &&
+			_isWhiteSpace(input.charCodeAt(pos + 1))
+		) {
+			pos++;
+		}
+
+		if (
+			input.charCodeAt(pos) === CC_QUOTATION_MARK ||
+			input.charCodeAt(pos) === CC_APOSTROPHE ||
+			(_isWhiteSpace(input.charCodeAt(pos)) &&
+				(input.charCodeAt(pos + 1) === CC_QUOTATION_MARK ||
+					input.charCodeAt(pos + 1) === CC_APOSTROPHE))
+		) {
+			if (callbacks.function !== undefined) {
+				return callbacks.function(input, start, end);
+			}
+
+			return pos;
+		}
+
+		return consumeAUrlToken(input, pos, start, callbacks);
+	}
+
+	// Otherwise, if the next input code point is U+0028 LEFT PARENTHESIS ((), consume it.
+	// Create a  with its value set to string and return it.
+	if (input.charCodeAt(pos) === CC_LEFT_PARENTHESIS) {
+		pos++;
+
+		if (callbacks.function !== undefined) {
+			return callbacks.function(input, start, pos);
+		}
+
+		return pos;
+	}
+
+	// Otherwise, create an  with its value set to string and return it.
+	if (callbacks.identifier !== undefined) {
+		return callbacks.identifier(input, start, pos);
+	}
+
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeLessThan = (input, pos, _callbacks) => {
+	// If the next 3 input code points are U+0021 EXCLAMATION MARK U+002D HYPHEN-MINUS U+002D HYPHEN-MINUS (!--), consume them and return a .
+	if (input.slice(pos, pos + 3) === "!--") {
+		return pos + 3;
+	}
+
+	// Otherwise, return a  with its value set to the current input code point.
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeCommercialAt = (input, pos, callbacks) => {
+	const start = pos - 1;
+
+	// If the next 3 input code points would start an ident sequence, consume an ident sequence, create an  with its value set to the returned value, and return it.
+	if (
+		_ifThreeCodePointsWouldStartAnIdentSequence(
+			input,
+			pos,
+			input.charCodeAt(pos),
+			input.charCodeAt(pos + 1),
+			input.charCodeAt(pos + 2)
+		)
+	) {
+		pos = _consumeAnIdentSequence(input, pos, callbacks);
+
+		if (callbacks.atKeyword !== undefined) {
+			pos = callbacks.atKeyword(input, start, pos);
+		}
+
+		return pos;
+	}
+
+	// Otherwise, return a  with its value set to the current input code point.
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeReverseSolidus = (input, pos, callbacks) => {
+	// If the input stream starts with a valid escape, reconsume the current input code point, consume an ident-like token, and return it.
+	if (_ifTwoCodePointsAreValidEscape(input, pos)) {
+		pos--;
+		return consumeAnIdentLikeToken(input, pos, callbacks);
+	}
+
+	// Otherwise, this is a parse error. Return a  with its value set to the current input code point.
+	return pos;
+};
+
+/** @type {CharHandler} */
+const consumeAToken = (input, pos, callbacks) => {
+	const cc = input.charCodeAt(pos - 1);
+
+	// https://drafts.csswg.org/css-syntax/#consume-token
+	switch (cc) {
+		// whitespace
+		case CC_LINE_FEED:
+		case CC_CARRIAGE_RETURN:
+		case CC_FORM_FEED:
+		case CC_TAB:
+		case CC_SPACE:
+			return consumeSpace(input, pos, callbacks);
+		// U+0022 QUOTATION MARK (")
+		case CC_QUOTATION_MARK:
+			return consumeAStringToken(input, pos, callbacks);
+		// U+0023 NUMBER SIGN (#)
+		case CC_NUMBER_SIGN:
+			return consumeNumberSign(input, pos, callbacks);
+		// U+0027 APOSTROPHE (')
+		case CC_APOSTROPHE:
+			return consumeAStringToken(input, pos, callbacks);
+		// U+0028 LEFT PARENTHESIS (()
+		case CC_LEFT_PARENTHESIS:
+			return consumeLeftParenthesis(input, pos, callbacks);
+		// U+0029 RIGHT PARENTHESIS ())
+		case CC_RIGHT_PARENTHESIS:
+			return consumeRightParenthesis(input, pos, callbacks);
+		// U+002B PLUS SIGN (+)
+		case CC_PLUS_SIGN:
+			return consumePlusSign(input, pos, callbacks);
+		// U+002C COMMA (,)
+		case CC_COMMA:
+			return consumeComma(input, pos, callbacks);
+		// U+002D HYPHEN-MINUS (-)
+		case CC_HYPHEN_MINUS:
+			return consumeHyphenMinus(input, pos, callbacks);
+		// U+002E FULL STOP (.)
+		case CC_FULL_STOP:
+			return consumeFullStop(input, pos, callbacks);
+		// U+003A COLON (:)
+		case CC_COLON:
+			return consumeColon(input, pos, callbacks);
+		// U+003B SEMICOLON (;)
+		case CC_SEMICOLON:
+			return consumeSemicolon(input, pos, callbacks);
+		// U+003C LESS-THAN SIGN (<)
+		case CC_LESS_THAN_SIGN:
+			return consumeLessThan(input, pos, callbacks);
+		// U+0040 COMMERCIAL AT (@)
+		case CC_AT_SIGN:
+			return consumeCommercialAt(input, pos, callbacks);
+		// U+005B LEFT SQUARE BRACKET ([)
+		case CC_LEFT_SQUARE:
+			return consumeLeftSquareBracket(input, pos, callbacks);
+		// U+005C REVERSE SOLIDUS (\)
+		case CC_REVERSE_SOLIDUS:
+			return consumeReverseSolidus(input, pos, callbacks);
+		// U+005D RIGHT SQUARE BRACKET (])
+		case CC_RIGHT_SQUARE:
+			return consumeRightSquareBracket(input, pos, callbacks);
+		// U+007B LEFT CURLY BRACKET ({)
+		case CC_LEFT_CURLY:
+			return consumeLeftCurlyBracket(input, pos, callbacks);
+		// U+007D RIGHT CURLY BRACKET (})
+		case CC_RIGHT_CURLY:
+			return consumeRightCurlyBracket(input, pos, callbacks);
+		default:
+			// digit
+			// Reconsume the current input code point, consume a numeric token, and return it.
+			if (_isDigit(cc)) {
+				pos--;
+				return consumeANumericToken(input, pos, callbacks);
+			} else if (cc === CC_LOWER_U || cc === CC_UPPER_U) {
+				// If unicode ranges allowed is true and the input stream would start a unicode-range,
+				// reconsume the current input code point, consume a unicode-range token, and return it.
+				// Skip now
+				// if (_ifThreeCodePointsWouldStartAUnicodeRange(input, pos)) {
+				// 	pos--;
+				// 	return consumeAUnicodeRangeToken(input, pos, callbacks);
+				// }
+
+				// Otherwise, reconsume the current input code point, consume an ident-like token, and return it.
+				pos--;
+				return consumeAnIdentLikeToken(input, pos, callbacks);
+			}
+			// ident-start code point
+			// Reconsume the current input code point, consume an ident-like token, and return it.
+			else if (isIdentStartCodePoint(cc)) {
+				pos--;
+				return consumeAnIdentLikeToken(input, pos, callbacks);
+			}
+
+			// EOF, but we don't have it
+
+			// anything else
+			// Return a  with its value set to the current input code point.
+			return consumeDelimToken(input, pos, callbacks);
+	}
+};
+
+/**
+ * @param {string} input input css
+ * @param {number=} pos pos
+ * @param {CssTokenCallbacks=} callbacks callbacks
+ * @returns {number} pos
+ */
+module.exports = (input, pos = 0, callbacks = {}) => {
+	// This section describes how to consume a token from a stream of code points. It will return a single token of any type.
+	while (pos < input.length) {
+		// Consume comments.
+		pos = consumeComments(input, pos, callbacks);
+
+		// Consume the next input code point.
+		pos++;
+		pos = consumeAToken(input, pos, callbacks);
+
+		if (callbacks.needTerminate && callbacks.needTerminate()) {
+			break;
+		}
+	}
+
+	return pos;
+};
+
+module.exports.isIdentStartCodePoint = isIdentStartCodePoint;
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {number} position after comments
+ */
+module.exports.eatComments = (input, pos) => {
+	for (;;) {
+		const originalPos = pos;
+		pos = consumeComments(input, pos, {});
+		if (originalPos === pos) {
+			break;
+		}
+	}
+
+	return pos;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {number} position after whitespace
+ */
+module.exports.eatWhitespace = (input, pos) => {
+	while (_isWhiteSpace(input.charCodeAt(pos))) {
+		pos++;
+	}
+
+	return pos;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {number} position after whitespace and comments
+ */
+module.exports.eatWhitespaceAndComments = (input, pos) => {
+	for (;;) {
+		const originalPos = pos;
+		pos = consumeComments(input, pos, {});
+		while (_isWhiteSpace(input.charCodeAt(pos))) {
+			pos++;
+		}
+		if (originalPos === pos) {
+			break;
+		}
+	}
+
+	return pos;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {number} position after whitespace and comments
+ */
+module.exports.eatComments = (input, pos) => {
+	for (;;) {
+		const originalPos = pos;
+		pos = consumeComments(input, pos, {});
+		if (originalPos === pos) {
+			break;
+		}
+	}
+
+	return pos;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {number} position after whitespace
+ */
+module.exports.eatWhiteLine = (input, pos) => {
+	for (;;) {
+		const cc = input.charCodeAt(pos);
+		if (_isSpace(cc)) {
+			pos++;
+			continue;
+		}
+		if (_isNewline(cc)) pos++;
+		pos = consumeExtraNewline(cc, input, pos);
+		break;
+	}
+
+	return pos;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {[number, number] | undefined} positions of ident sequence
+ */
+module.exports.skipCommentsAndEatIdentSequence = (input, pos) => {
+	pos = module.exports.eatComments(input, pos);
+
+	const start = pos;
+
+	if (
+		_ifThreeCodePointsWouldStartAnIdentSequence(
+			input,
+			pos,
+			input.charCodeAt(pos),
+			input.charCodeAt(pos + 1),
+			input.charCodeAt(pos + 2)
+		)
+	) {
+		return [start, _consumeAnIdentSequence(input, pos, {})];
+	}
+
+	return undefined;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {[number, number] | undefined} positions of ident sequence
+ */
+module.exports.eatString = (input, pos) => {
+	pos = module.exports.eatWhitespaceAndComments(input, pos);
+
+	const start = pos;
+
+	if (
+		input.charCodeAt(pos) === CC_QUOTATION_MARK ||
+		input.charCodeAt(pos) === CC_APOSTROPHE
+	) {
+		return [start, consumeAStringToken(input, pos + 1, {})];
+	}
+
+	return undefined;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @param {CssTokenCallbacks} cbs callbacks
+ * @returns {[number, number][]} positions of ident sequence
+ */
+module.exports.eatImageSetStrings = (input, pos, cbs) => {
+	/** @type {[number, number][]} */
+	const result = [];
+
+	let isFirst = true;
+	let needStop = false;
+	// We already in `func(` token
+	let balanced = 1;
+
+	/** @type {CssTokenCallbacks} */
+	const callbacks = {
+		...cbs,
+		string: (_input, start, end) => {
+			if (isFirst && balanced === 1) {
+				result.push([start, end]);
+				isFirst = false;
+			}
+
+			return end;
+		},
+		comma: (_input, _start, end) => {
+			if (balanced === 1) {
+				isFirst = true;
+			}
+
+			return end;
+		},
+		leftParenthesis: (input, start, end) => {
+			balanced++;
+
+			return end;
+		},
+		function: (_input, start, end) => {
+			balanced++;
+
+			return end;
+		},
+		rightParenthesis: (_input, _start, end) => {
+			balanced--;
+
+			if (balanced === 0) {
+				needStop = true;
+			}
+
+			return end;
+		}
+	};
+
+	while (pos < input.length) {
+		// Consume comments.
+		pos = consumeComments(input, pos, callbacks);
+
+		// Consume the next input code point.
+		pos++;
+		pos = consumeAToken(input, pos, callbacks);
+
+		if (needStop) {
+			break;
+		}
+	}
+
+	return result;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @param {CssTokenCallbacks} cbs callbacks
+ * @returns {[[number, number, number, number] | undefined, [number, number] | undefined, [number, number] | undefined, [number, number] | undefined]} positions of top level tokens
+ */
+module.exports.eatImportTokens = (input, pos, cbs) => {
+	const result =
+		/** @type {[[number, number, number, number] | undefined, [number, number] | undefined, [number, number] | undefined, [number, number] | undefined]} */
+		(new Array(4));
+
+	/** @type {0 | 1 | 2 | undefined} */
+	let scope;
+	let needStop = false;
+	let balanced = 0;
+
+	/** @type {CssTokenCallbacks} */
+	const callbacks = {
+		...cbs,
+		url: (_input, start, end, contentStart, contentEnd) => {
+			if (
+				result[0] === undefined &&
+				balanced === 0 &&
+				result[1] === undefined &&
+				result[2] === undefined &&
+				result[3] === undefined
+			) {
+				result[0] = [start, end, contentStart, contentEnd];
+				scope = undefined;
+			}
+
+			return end;
+		},
+		string: (_input, start, end) => {
+			if (
+				balanced === 0 &&
+				result[0] === undefined &&
+				result[1] === undefined &&
+				result[2] === undefined &&
+				result[3] === undefined
+			) {
+				result[0] = [start, end, start + 1, end - 1];
+				scope = undefined;
+			} else if (result[0] !== undefined && scope === 0) {
+				result[0][2] = start + 1;
+				result[0][3] = end - 1;
+			}
+
+			return end;
+		},
+		leftParenthesis: (_input, _start, end) => {
+			balanced++;
+
+			return end;
+		},
+		rightParenthesis: (_input, _start, end) => {
+			balanced--;
+
+			if (balanced === 0 && scope !== undefined) {
+				/** @type {[number, number]} */
+				(result[scope])[1] = end;
+				scope = undefined;
+			}
+
+			return end;
+		},
+		function: (input, start, end) => {
+			if (balanced === 0) {
+				const name = input
+					.slice(start, end - 1)
+					.replace(/\\/g, "")
+					.toLowerCase();
+
+				if (
+					name === "url" &&
+					result[0] === undefined &&
+					result[1] === undefined &&
+					result[2] === undefined &&
+					result[3] === undefined
+				) {
+					scope = 0;
+					result[scope] = [start, end + 1, end + 1, end + 1];
+				} else if (
+					name === "layer" &&
+					result[1] === undefined &&
+					result[2] === undefined
+				) {
+					scope = 1;
+					result[scope] = [start, end];
+				} else if (name === "supports" && result[2] === undefined) {
+					scope = 2;
+					result[scope] = [start, end];
+				} else {
+					scope = undefined;
+				}
+			}
+
+			balanced++;
+
+			return end;
+		},
+		identifier: (input, start, end) => {
+			if (
+				balanced === 0 &&
+				result[1] === undefined &&
+				result[2] === undefined
+			) {
+				const name = input.slice(start, end).replace(/\\/g, "").toLowerCase();
+
+				if (name === "layer") {
+					result[1] = [start, end];
+					scope = undefined;
+				}
+			}
+
+			return end;
+		},
+		semicolon: (_input, start, end) => {
+			if (balanced === 0) {
+				needStop = true;
+				result[3] = [start, end];
+			}
+
+			return end;
+		}
+	};
+
+	while (pos < input.length) {
+		// Consume comments.
+		pos = consumeComments(input, pos, callbacks);
+
+		// Consume the next input code point.
+		pos++;
+		pos = consumeAToken(input, pos, callbacks);
+
+		if (needStop) {
+			break;
+		}
+	}
+
+	return result;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {[number, number] | undefined} positions of ident sequence
+ */
+module.exports.eatIdentSequence = (input, pos) => {
+	pos = module.exports.eatWhitespaceAndComments(input, pos);
+
+	const start = pos;
+
+	if (
+		_ifThreeCodePointsWouldStartAnIdentSequence(
+			input,
+			pos,
+			input.charCodeAt(pos),
+			input.charCodeAt(pos + 1),
+			input.charCodeAt(pos + 2)
+		)
+	) {
+		return [start, _consumeAnIdentSequence(input, pos, {})];
+	}
+
+	return undefined;
+};
+
+/**
+ * @param {string} input input
+ * @param {number} pos position
+ * @returns {[number, number, boolean] | undefined} positions of ident sequence or string
+ */
+module.exports.eatIdentSequenceOrString = (input, pos) => {
+	pos = module.exports.eatWhitespaceAndComments(input, pos);
+
+	const start = pos;
+
+	if (
+		input.charCodeAt(pos) === CC_QUOTATION_MARK ||
+		input.charCodeAt(pos) === CC_APOSTROPHE
+	) {
+		return [start, consumeAStringToken(input, pos + 1, {}), false];
+	} else if (
+		_ifThreeCodePointsWouldStartAnIdentSequence(
+			input,
+			pos,
+			input.charCodeAt(pos),
+			input.charCodeAt(pos + 1),
+			input.charCodeAt(pos + 2)
+		)
+	) {
+		return [start, _consumeAnIdentSequence(input, pos, {}), true];
+	}
+
+	return undefined;
+};
+
+/**
+ * @param {string} chars characters
+ * @returns {(input: string, pos: number) => number} function to eat characters
+ */
+module.exports.eatUntil = chars => {
+	const charCodes = Array.from({ length: chars.length }, (_, i) =>
+		chars.charCodeAt(i)
+	);
+	const arr = Array.from(
+		{ length: charCodes.reduce((a, b) => Math.max(a, b), 0) + 1 },
+		() => false
+	);
+	for (const cc of charCodes) {
+		arr[cc] = true;
+	}
+
+	return (input, pos) => {
+		for (;;) {
+			const cc = input.charCodeAt(pos);
+			if (cc < arr.length && arr[cc]) {
+				return pos;
+			}
+			pos++;
+			if (pos === input.length) return pos;
+		}
+	};
+};
diff --git a/lib/debug/ProfilingPlugin.js b/lib/debug/ProfilingPlugin.js
index 561b56f2da0..23efe5d3007 100644
--- a/lib/debug/ProfilingPlugin.js
+++ b/lib/debug/ProfilingPlugin.js
@@ -1,25 +1,62 @@
-const fs = require("fs");
-const path = require("path");
-const mkdirp = require("mkdirp");
-const { Tracer } = require("chrome-trace-event");
-const validateOptions = require("schema-utils");
-const schema = require("../../schemas/plugins/debug/ProfilingPlugin.json");
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
 
+const { Tracer } = require("chrome-trace-event");
+const {
+	JAVASCRIPT_MODULES,
+	CSS_MODULES,
+	WEBASSEMBLY_MODULES,
+	JSON_MODULE_TYPE
+} = require("../ModuleTypeConstants");
+const createSchemaValidation = require("../util/create-schema-validation");
+const { dirname, mkdirpSync } = require("../util/fs");
+
+/** @typedef {import("inspector").Session} Session */
+/** @typedef {import("tapable").FullTap} FullTap */
 /** @typedef {import("../../declarations/plugins/debug/ProfilingPlugin").ProfilingPluginOptions} ProfilingPluginOptions */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../ContextModuleFactory")} ContextModuleFactory */
+/** @typedef {import("../ModuleFactory")} ModuleFactory */
+/** @typedef {import("../NormalModuleFactory")} NormalModuleFactory */
+/** @typedef {import("../Parser")} Parser */
+/** @typedef {import("../ResolverFactory")} ResolverFactory */
+/** @typedef {import("../util/fs").IntermediateFileSystem} IntermediateFileSystem */
+
+const validate = createSchemaValidation(
+	require("../../schemas/plugins/debug/ProfilingPlugin.check.js"),
+	() => require("../../schemas/plugins/debug/ProfilingPlugin.json"),
+	{
+		name: "Profiling Plugin",
+		baseDataPath: "options"
+	}
+);
+
+/** @typedef {{ Session: typeof import("inspector").Session }} Inspector */
 
-let inspector = undefined;
+/** @type {Inspector | undefined} */
+let inspector;
 
 try {
-	// eslint-disable-next-line node/no-unsupported-features/node-builtins
+	// eslint-disable-next-line n/no-unsupported-features/node-builtins
 	inspector = require("inspector");
-} catch (e) {
+} catch (_err) {
+	// eslint-disable-next-line no-console
 	console.log("Unable to CPU profile in < node 8.0");
 }
 
 class Profiler {
+	/**
+	 * @param {Inspector} inspector inspector
+	 */
 	constructor(inspector) {
+		/** @type {undefined | Session} */
 		this.session = undefined;
 		this.inspector = inspector;
+		this._startTime = 0;
 	}
 
 	hasSession() {
@@ -32,13 +69,17 @@ class Profiler {
 		}
 
 		try {
-			this.session = new inspector.Session();
-			this.session.connect();
+			this.session = new /** @type {Inspector} */ (inspector).Session();
+			/** @type {Session} */
+			(this.session).connect();
 		} catch (_) {
 			this.session = undefined;
 			return Promise.resolve();
 		}
 
+		const hrtime = process.hrtime();
+		this._startTime = hrtime[0] * 1000000 + Math.round(hrtime[1] / 1000);
+
 		return Promise.all([
 			this.sendCommand("Profiler.setSamplingInterval", {
 				interval: 100
@@ -48,10 +89,16 @@ class Profiler {
 		]);
 	}
 
+	/**
+	 * @param {string} method method name
+	 * @param {EXPECTED_OBJECT=} params params
+	 * @returns {Promise} Promise for the result
+	 */
 	sendCommand(method, params) {
 		if (this.hasSession()) {
 			return new Promise((res, rej) => {
-				return this.session.post(method, params, (err, params) => {
+				/** @type {Session} */
+				(this.session).post(method, params, (err, params) => {
 					if (err !== null) {
 						rej(err);
 					} else {
@@ -59,45 +106,61 @@ class Profiler {
 					}
 				});
 			});
-		} else {
-			return Promise.resolve();
 		}
+		return Promise.resolve();
 	}
 
 	destroy() {
 		if (this.hasSession()) {
-			this.session.disconnect();
+			/** @type {Session} */
+			(this.session).disconnect();
 		}
 
 		return Promise.resolve();
 	}
 
 	stopProfiling() {
-		return this.sendCommand("Profiler.stop");
+		return this.sendCommand("Profiler.stop").then(({ profile }) => {
+			const hrtime = process.hrtime();
+			const endTime = hrtime[0] * 1000000 + Math.round(hrtime[1] / 1000);
+			// Avoid coverage problems due indirect changes
+			/* istanbul ignore next */
+			if (profile.startTime < this._startTime || profile.endTime > endTime) {
+				// In some cases timestamps mismatch and we need to adjust them
+				// Both process.hrtime and the inspector timestamps claim to be relative
+				// to a unknown point in time. But they do not guarantee that this is the
+				// same point in time.
+				const duration = profile.endTime - profile.startTime;
+				const ownDuration = endTime - this._startTime;
+				const untracked = Math.max(0, ownDuration - duration);
+				profile.startTime = this._startTime + untracked / 2;
+				profile.endTime = endTime - untracked / 2;
+			}
+			return { profile };
+		});
 	}
 }
 
 /**
- * @typedef {Object} Trace
- * @description an object that wraps Tracer and Profiler with a counter
+ * an object that wraps Tracer and Profiler with a counter
+ * @typedef {object} Trace
  * @property {Tracer} trace instance of Tracer
  * @property {number} counter Counter
  * @property {Profiler} profiler instance of Profiler
- * @property {Function} end the end function
+ * @property {(callback: (err?: null | Error) => void) => void} end the end function
  */
 
 /**
+ * @param {IntermediateFileSystem} fs filesystem used for output
  * @param {string} outputPath The location where to write the log.
  * @returns {Trace} The trace object
  */
-const createTrace = outputPath => {
-	const trace = new Tracer({
-		noStream: true
-	});
-	const profiler = new Profiler(inspector);
+const createTrace = (fs, outputPath) => {
+	const trace = new Tracer();
+	const profiler = new Profiler(/** @type {Inspector} */ (inspector));
 	if (/\/|\\/.test(outputPath)) {
-		const dirPath = path.dirname(outputPath);
-		mkdirp.sync(dirPath);
+		const dirPath = dirname(fs, outputPath);
+		mkdirpSync(fs, dirPath);
 	}
 	const fsStream = fs.createWriteStream(outputPath);
 
@@ -141,8 +204,9 @@ const createTrace = outputPath => {
 		counter,
 		profiler,
 		end: callback => {
+			trace.push("]");
 			// Wait until the write stream finishes.
-			fsStream.on("finish", () => {
+			fsStream.on("close", () => {
 				callback();
 			});
 			// Tear down the readable trace stream.
@@ -151,37 +215,52 @@ const createTrace = outputPath => {
 	};
 };
 
-const pluginName = "ProfilingPlugin";
+const PLUGIN_NAME = "ProfilingPlugin";
 
 class ProfilingPlugin {
 	/**
-	 * @param {ProfilingPluginOptions=} opts options object
+	 * @param {ProfilingPluginOptions=} options options object
 	 */
-	constructor(opts) {
-		validateOptions(schema, opts || {}, "Profiling plugin");
-		opts = opts || {};
-		this.outputPath = opts.outputPath || "events.json";
+	constructor(options = {}) {
+		validate(options);
+		this.outputPath = options.outputPath || "events.json";
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		const tracer = createTrace(this.outputPath);
+		const tracer = createTrace(
+			/** @type {IntermediateFileSystem} */
+			(compiler.intermediateFileSystem),
+			this.outputPath
+		);
 		tracer.profiler.startProfiling();
 
 		// Compiler Hooks
-		Object.keys(compiler.hooks).forEach(hookName => {
-			compiler.hooks[hookName].intercept(
-				makeInterceptorFor("Compiler", tracer)(hookName)
-			);
-		});
+		for (const hookName of Object.keys(compiler.hooks)) {
+			const hook =
+				compiler.hooks[/** @type {keyof Compiler["hooks"]} */ (hookName)];
+			if (hook) {
+				hook.intercept(makeInterceptorFor("Compiler", tracer)(hookName));
+			}
+		}
 
-		Object.keys(compiler.resolverFactory.hooks).forEach(hookName => {
-			compiler.resolverFactory.hooks[hookName].intercept(
-				makeInterceptorFor("Resolver", tracer)(hookName)
-			);
-		});
+		for (const hookName of Object.keys(compiler.resolverFactory.hooks)) {
+			const hook =
+				compiler.resolverFactory.hooks[
+					/** @type {keyof ResolverFactory["hooks"]} */
+					(hookName)
+				];
+			if (hook) {
+				hook.intercept(makeInterceptorFor("Resolver", tracer)(hookName));
+			}
+		}
 
 		compiler.hooks.compilation.tap(
-			pluginName,
+			PLUGIN_NAME,
 			(compilation, { normalModuleFactory, contextModuleFactory }) => {
 				interceptAllHooksFor(compilation, tracer, "Compilation");
 				interceptAllHooksFor(
@@ -195,21 +274,23 @@ class ProfilingPlugin {
 					"Context Module Factory"
 				);
 				interceptAllParserHooks(normalModuleFactory, tracer);
-				interceptTemplateInstancesFrom(compilation, tracer);
+				interceptAllGeneratorHooks(normalModuleFactory, tracer);
+				interceptAllJavascriptModulesPluginHooks(compilation, tracer);
+				interceptAllCssModulesPluginHooks(compilation, tracer);
 			}
 		);
 
 		// We need to write out the CPU profile when we are all done.
 		compiler.hooks.done.tapAsync(
 			{
-				name: pluginName,
+				name: PLUGIN_NAME,
 				stage: Infinity
 			},
 			(stats, callback) => {
+				if (compiler.watchMode) return callback();
 				tracer.profiler.stopProfiling().then(parsedResults => {
 					if (parsedResults === undefined) {
 						tracer.profiler.destroy();
-						tracer.trace.flush();
 						tracer.end(callback);
 						return;
 					}
@@ -223,7 +304,9 @@ class ProfilingPlugin {
 						cat: ["toplevel"],
 						ts: cpuStartTime,
 						args: {
+							// eslint-disable-next-line camelcase
 							src_file: "../../ipc/ipc_moji_bootstrap.cc",
+							// eslint-disable-next-line camelcase
 							src_func: "Accept"
 						}
 					});
@@ -257,7 +340,6 @@ class ProfilingPlugin {
 					});
 
 					tracer.profiler.destroy();
-					tracer.trace.flush();
 					tracer.end(callback);
 				});
 			}
@@ -265,99 +347,128 @@ class ProfilingPlugin {
 	}
 }
 
-const interceptTemplateInstancesFrom = (compilation, tracer) => {
-	const {
-		mainTemplate,
-		chunkTemplate,
-		hotUpdateChunkTemplate,
-		moduleTemplates
-	} = compilation;
-
-	const { javascript, webassembly } = moduleTemplates;
-
-	[
-		{
-			instance: mainTemplate,
-			name: "MainTemplate"
-		},
-		{
-			instance: chunkTemplate,
-			name: "ChunkTemplate"
-		},
-		{
-			instance: hotUpdateChunkTemplate,
-			name: "HotUpdateChunkTemplate"
-		},
-		{
-			instance: javascript,
-			name: "JavaScriptModuleTemplate"
-		},
-		{
-			instance: webassembly,
-			name: "WebAssemblyModuleTemplate"
-		}
-	].forEach(templateObject => {
-		Object.keys(templateObject.instance.hooks).forEach(hookName => {
-			templateObject.instance.hooks[hookName].intercept(
-				makeInterceptorFor(templateObject.name, tracer)(hookName)
-			);
-		});
-	});
-};
-
+/**
+ * @param {EXPECTED_ANY & { hooks: TODO }} instance instance
+ * @param {Trace} tracer tracer
+ * @param {string} logLabel log label
+ */
 const interceptAllHooksFor = (instance, tracer, logLabel) => {
 	if (Reflect.has(instance, "hooks")) {
-		Object.keys(instance.hooks).forEach(hookName => {
-			instance.hooks[hookName].intercept(
-				makeInterceptorFor(logLabel, tracer)(hookName)
-			);
-		});
+		for (const hookName of Object.keys(instance.hooks)) {
+			const hook = instance.hooks[hookName];
+			if (hook && !hook._fakeHook) {
+				hook.intercept(makeInterceptorFor(logLabel, tracer)(hookName));
+			}
+		}
 	}
 };
 
+/**
+ * @param {NormalModuleFactory} moduleFactory normal module factory
+ * @param {Trace} tracer tracer
+ */
 const interceptAllParserHooks = (moduleFactory, tracer) => {
 	const moduleTypes = [
-		"javascript/auto",
-		"javascript/dynamic",
-		"javascript/esm",
-		"json",
-		"webassembly/experimental"
+		...JAVASCRIPT_MODULES,
+		JSON_MODULE_TYPE,
+		...WEBASSEMBLY_MODULES,
+		...CSS_MODULES
 	];
 
-	moduleTypes.forEach(moduleType => {
+	for (const moduleType of moduleTypes) {
 		moduleFactory.hooks.parser
 			.for(moduleType)
-			.tap("ProfilingPlugin", (parser, parserOpts) => {
+			.tap(PLUGIN_NAME, (parser, parserOpts) => {
 				interceptAllHooksFor(parser, tracer, "Parser");
 			});
-	});
+	}
+};
+
+/**
+ * @param {NormalModuleFactory} moduleFactory normal module factory
+ * @param {Trace} tracer tracer
+ */
+const interceptAllGeneratorHooks = (moduleFactory, tracer) => {
+	const moduleTypes = [
+		...JAVASCRIPT_MODULES,
+		JSON_MODULE_TYPE,
+		...WEBASSEMBLY_MODULES,
+		...CSS_MODULES
+	];
+
+	for (const moduleType of moduleTypes) {
+		moduleFactory.hooks.generator
+			.for(moduleType)
+			.tap(PLUGIN_NAME, (parser, parserOpts) => {
+				interceptAllHooksFor(parser, tracer, "Generator");
+			});
+	}
+};
+
+/**
+ * @param {Compilation} compilation compilation
+ * @param {Trace} tracer tracer
+ */
+const interceptAllJavascriptModulesPluginHooks = (compilation, tracer) => {
+	interceptAllHooksFor(
+		{
+			hooks:
+				require("../javascript/JavascriptModulesPlugin").getCompilationHooks(
+					compilation
+				)
+		},
+		tracer,
+		"JavascriptModulesPlugin"
+	);
+};
+
+/**
+ * @param {Compilation} compilation compilation
+ * @param {Trace} tracer tracer
+ */
+const interceptAllCssModulesPluginHooks = (compilation, tracer) => {
+	interceptAllHooksFor(
+		{
+			hooks: require("../css/CssModulesPlugin").getCompilationHooks(compilation)
+		},
+		tracer,
+		"CssModulesPlugin"
+	);
 };
 
+/** @typedef {(...args: EXPECTED_ANY[]) => EXPECTED_ANY | Promise<(...args: EXPECTED_ANY[]) => EXPECTED_ANY>} PluginFunction */
+
+/**
+ * @param {string} instance instance
+ * @param {Trace} tracer tracer
+ * @returns {(hookName: string) => TODO} interceptor
+ */
 const makeInterceptorFor = (instance, tracer) => hookName => ({
-	register: ({ name, type, context, fn }) => {
-		const newFn = makeNewProfiledTapFn(hookName, tracer, {
-			name,
-			type,
-			fn
-		});
-		return {
-			name,
-			type,
-			context,
-			fn: newFn
-		};
+	/**
+	 * @param {FullTap} tapInfo tap info
+	 * @returns {FullTap} modified full tap
+	 */
+	register: tapInfo => {
+		const { name, type, fn: internalFn } = tapInfo;
+		const newFn =
+			// Don't tap our own hooks to ensure stream can close cleanly
+			name === PLUGIN_NAME
+				? internalFn
+				: makeNewProfiledTapFn(hookName, tracer, {
+						name,
+						type,
+						fn: /** @type {PluginFunction} */ (internalFn)
+					});
+		return { ...tapInfo, fn: newFn };
 	}
 });
 
-// TODO improve typing
-/** @typedef {(...args: TODO[]) => void | Promise} PluginFunction */
-
 /**
  * @param {string} hookName Name of the hook to profile.
  * @param {Trace} tracer The trace object.
  * @param {object} options Options for the profiled fn.
  * @param {string} options.name Plugin name
- * @param {string} options.type Plugin type (sync | async | promise)
+ * @param {"sync" | "async" | "promise"} options.type Plugin type (sync | async | promise)
  * @param {PluginFunction} options.fn Plugin function
  * @returns {PluginFunction} Chainable hooked function.
  */
@@ -373,7 +484,9 @@ const makeNewProfiledTapFn = (hookName, tracer, { name, type, fn }) => {
 					id,
 					cat: defaultCategory
 				});
-				const promise = /** @type {Promise<*>} */ (fn(...args));
+				const promise =
+					/** @type {Promise<(...args: EXPECTED_ANY[]) => EXPECTED_ANY>} */
+					(fn(...args));
 				return promise.then(r => {
 					tracer.trace.end({
 						name,
@@ -391,22 +504,28 @@ const makeNewProfiledTapFn = (hookName, tracer, { name, type, fn }) => {
 					id,
 					cat: defaultCategory
 				});
-				fn(...args, (...r) => {
-					const callback = args.pop();
-					tracer.trace.end({
-						name,
-						id,
-						cat: defaultCategory
-					});
-					callback(...r);
-				});
+				const callback = args.pop();
+				fn(
+					...args,
+					/**
+					 * @param {...EXPECTED_ANY[]} r result
+					 */
+					(...r) => {
+						tracer.trace.end({
+							name,
+							id,
+							cat: defaultCategory
+						});
+						callback(...r);
+					}
+				);
 			};
 		case "sync":
 			return (...args) => {
 				const id = ++tracer.counter;
 				// Do not instrument ourself due to the CPU
 				// profile needing to be the last event in the trace.
-				if (name === pluginName) {
+				if (name === PLUGIN_NAME) {
 					return fn(...args);
 				}
 
@@ -418,13 +537,13 @@ const makeNewProfiledTapFn = (hookName, tracer, { name, type, fn }) => {
 				let r;
 				try {
 					r = fn(...args);
-				} catch (error) {
+				} catch (err) {
 					tracer.trace.end({
 						name,
 						id,
 						cat: defaultCategory
 					});
-					throw error;
+					throw err;
 				}
 				tracer.trace.end({
 					name,
@@ -434,7 +553,7 @@ const makeNewProfiledTapFn = (hookName, tracer, { name, type, fn }) => {
 				return r;
 			};
 		default:
-			break;
+			return fn;
 	}
 };
 
diff --git a/lib/dependencies/AMDDefineDependency.js b/lib/dependencies/AMDDefineDependency.js
index fcec365d518..4acb1525271 100644
--- a/lib/dependencies/AMDDefineDependency.js
+++ b/lib/dependencies/AMDDefineDependency.js
@@ -2,10 +2,117 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const makeSerializable = require("../util/makeSerializable");
 const NullDependency = require("./NullDependency");
 
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
+/** @type {Record} */
+const DEFINITIONS = {
+	f: {
+		definition: "var __WEBPACK_AMD_DEFINE_RESULT__;",
+		content: `!(__WEBPACK_AMD_DEFINE_RESULT__ = (#).call(exports, ${RuntimeGlobals.require}, exports, module),
+		__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))`,
+		requests: [
+			RuntimeGlobals.require,
+			RuntimeGlobals.exports,
+			RuntimeGlobals.module
+		]
+	},
+	o: {
+		definition: "",
+		content: "!(module.exports = #)",
+		requests: [RuntimeGlobals.module]
+	},
+	of: {
+		definition:
+			"var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;",
+		content: `!(__WEBPACK_AMD_DEFINE_FACTORY__ = (#),
+		__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+		(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, ${RuntimeGlobals.require}, exports, module)) :
+		__WEBPACK_AMD_DEFINE_FACTORY__),
+		__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))`,
+		requests: [
+			RuntimeGlobals.require,
+			RuntimeGlobals.exports,
+			RuntimeGlobals.module
+		]
+	},
+	af: {
+		definition:
+			"var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;",
+		content: `!(__WEBPACK_AMD_DEFINE_ARRAY__ = #, __WEBPACK_AMD_DEFINE_RESULT__ = (#).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
+		__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))`,
+		requests: [RuntimeGlobals.exports, RuntimeGlobals.module]
+	},
+	ao: {
+		definition: "",
+		content: "!(#, module.exports = #)",
+		requests: [RuntimeGlobals.module]
+	},
+	aof: {
+		definition:
+			"var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;",
+		content: `!(__WEBPACK_AMD_DEFINE_ARRAY__ = #, __WEBPACK_AMD_DEFINE_FACTORY__ = (#),
+		__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
+		(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
+		__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))`,
+		requests: [RuntimeGlobals.exports, RuntimeGlobals.module]
+	},
+	lf: {
+		definition: "var XXX, XXXmodule;",
+		content: `!(XXXmodule = { id: YYY, exports: {}, loaded: false }, XXX = (#).call(XXXmodule.exports, ${RuntimeGlobals.require}, XXXmodule.exports, XXXmodule), XXXmodule.loaded = true, XXX === undefined && (XXX = XXXmodule.exports))`,
+		requests: [RuntimeGlobals.require, RuntimeGlobals.module]
+	},
+	lo: {
+		definition: "var XXX;",
+		content: "!(XXX = #)",
+		requests: []
+	},
+	lof: {
+		definition: "var XXX, XXXfactory, XXXmodule;",
+		content: `!(XXXfactory = (#), (typeof XXXfactory === 'function' ? ((XXXmodule = { id: YYY, exports: {}, loaded: false }), (XXX = XXXfactory.call(XXXmodule.exports, ${RuntimeGlobals.require}, XXXmodule.exports, XXXmodule)), (XXXmodule.loaded = true), XXX === undefined && (XXX = XXXmodule.exports)) : XXX = XXXfactory))`,
+		requests: [RuntimeGlobals.require, RuntimeGlobals.module]
+	},
+	laf: {
+		definition: "var __WEBPACK_AMD_DEFINE_ARRAY__, XXX, XXXexports;",
+		content:
+			"!(__WEBPACK_AMD_DEFINE_ARRAY__ = #, XXX = (#).apply(XXXexports = {}, __WEBPACK_AMD_DEFINE_ARRAY__), XXX === undefined && (XXX = XXXexports))",
+		requests: []
+	},
+	lao: {
+		definition: "var XXX;",
+		content: "!(#, XXX = #)",
+		requests: []
+	},
+	laof: {
+		definition: "var XXXarray, XXXfactory, XXXexports, XXX;",
+		content: `!(XXXarray = #, XXXfactory = (#),
+		(typeof XXXfactory === 'function' ?
+			((XXX = XXXfactory.apply(XXXexports = {}, XXXarray)), XXX === undefined && (XXX = XXXexports)) :
+			(XXX = XXXfactory)
+		))`,
+		requests: []
+	}
+};
+
 class AMDDefineDependency extends NullDependency {
+	/**
+	 * @param {Range} range range
+	 * @param {Range | null} arrayRange array range
+	 * @param {Range | null} functionRange function range
+	 * @param {Range | null} objectRange object range
+	 * @param {string | null} namedModule true, when define is called with a name
+	 */
 	constructor(range, arrayRange, functionRange, objectRange, namedModule) {
 		super();
 		this.range = range;
@@ -19,69 +126,64 @@ class AMDDefineDependency extends NullDependency {
 	get type() {
 		return "amd define";
 	}
-}
 
-AMDDefineDependency.Template = class AMDDefineDependencyTemplate {
-	get definitions() {
-		return {
-			f: [
-				"var __WEBPACK_AMD_DEFINE_RESULT__;",
-				`!(__WEBPACK_AMD_DEFINE_RESULT__ = (#).call(exports, __webpack_require__, exports, module),
-				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))`
-			],
-			o: ["", "!(module.exports = #)"],
-			of: [
-				"var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;",
-				`!(__WEBPACK_AMD_DEFINE_FACTORY__ = (#),
-				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
-				(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :
-				__WEBPACK_AMD_DEFINE_FACTORY__),
-				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))`
-			],
-			af: [
-				"var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;",
-				`!(__WEBPACK_AMD_DEFINE_ARRAY__ = #, __WEBPACK_AMD_DEFINE_RESULT__ = (#).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
-				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))`
-			],
-			ao: ["", "!(#, module.exports = #)"],
-			aof: [
-				"var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;",
-				`!(__WEBPACK_AMD_DEFINE_ARRAY__ = #, __WEBPACK_AMD_DEFINE_FACTORY__ = (#),
-				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
-				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
-				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))`
-			],
-			lf: [
-				"var XXX, XXXmodule;",
-				"!(XXXmodule = { id: YYY, exports: {}, loaded: false }, XXX = #.call(XXXmodule.exports, __webpack_require__, XXXmodule.exports, XXXmodule), XXXmodule.loaded = true, XXX === undefined && (XXX = XXXmodule.exports))"
-			],
-			lo: ["var XXX;", "!(XXX = #)"],
-			lof: [
-				"var XXX, XXXfactory, XXXmodule;",
-				"!(XXXfactory = (#), (XXXmodule = { id: YYY, exports: {}, loaded: false }), XXX = (typeof XXXfactory === 'function' ? (XXXfactory.call(XXXmodule.exports, __webpack_require__, XXXmodule.exports, XXXmodule)) : XXXfactory), (XXXmodule.loaded = true), XXX === undefined && (XXX = XXXmodule.exports))"
-			],
-			laf: [
-				"var __WEBPACK_AMD_DEFINE_ARRAY__, XXX;",
-				"!(__WEBPACK_AMD_DEFINE_ARRAY__ = #, XXX = ((#).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)))"
-			],
-			lao: ["var XXX;", "!(#, XXX = #)"],
-			laof: [
-				"var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_FACTORY__, XXX;",
-				`!(__WEBPACK_AMD_DEFINE_ARRAY__ = #, __WEBPACK_AMD_DEFINE_FACTORY__ = (#),
-				XXX = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
-				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__))`
-			]
-		};
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.range);
+		write(this.arrayRange);
+		write(this.functionRange);
+		write(this.objectRange);
+		write(this.namedModule);
+		write(this.localModule);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.range = read();
+		this.arrayRange = read();
+		this.functionRange = read();
+		this.objectRange = read();
+		this.namedModule = read();
+		this.localModule = read();
+		super.deserialize(context);
 	}
+}
 
-	apply(dependency, source) {
-		const branch = this.branch(dependency);
-		const defAndText = this.definitions[branch];
-		const definitions = defAndText[0];
-		const text = defAndText[1];
-		this.replace(dependency, source, definitions, text);
+makeSerializable(
+	AMDDefineDependency,
+	"webpack/lib/dependencies/AMDDefineDependency"
+);
+
+AMDDefineDependency.Template = class AMDDefineDependencyTemplate extends (
+	NullDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, { runtimeRequirements }) {
+		const dep = /** @type {AMDDefineDependency} */ (dependency);
+		const branch = this.branch(dep);
+		const { definition, content, requests } = DEFINITIONS[branch];
+		for (const req of requests) {
+			runtimeRequirements.add(req);
+		}
+		this.replace(dep, source, definition, content);
 	}
 
+	/**
+	 * @param {AMDDefineDependency} dependency dependency
+	 * @returns {string} variable name
+	 */
 	localModuleVar(dependency) {
 		return (
 			dependency.localModule &&
@@ -90,6 +192,10 @@ AMDDefineDependency.Template = class AMDDefineDependencyTemplate {
 		);
 	}
 
+	/**
+	 * @param {AMDDefineDependency} dependency dependency
+	 * @returns {string} branch
+	 */
 	branch(dependency) {
 		const localModuleVar = this.localModuleVar(dependency) ? "l" : "";
 		const arrayRange = dependency.arrayRange ? "a" : "";
@@ -98,6 +204,12 @@ AMDDefineDependency.Template = class AMDDefineDependencyTemplate {
 		return localModuleVar + arrayRange + objectRange + functionRange;
 	}
 
+	/**
+	 * @param {AMDDefineDependency} dependency dependency
+	 * @param {ReplaceSource} source source
+	 * @param {string} definition definition
+	 * @param {string} text text
+	 */
 	replace(dependency, source, definition, text) {
 		const localModuleVar = this.localModuleVar(dependency);
 		if (localModuleVar) {
@@ -118,18 +230,34 @@ AMDDefineDependency.Template = class AMDDefineDependencyTemplate {
 
 		let current = dependency.range[0];
 		if (dependency.arrayRange) {
-			source.replace(current, dependency.arrayRange[0] - 1, texts.shift());
+			source.replace(
+				current,
+				dependency.arrayRange[0] - 1,
+				/** @type {string} */ (texts.shift())
+			);
 			current = dependency.arrayRange[1];
 		}
 
 		if (dependency.objectRange) {
-			source.replace(current, dependency.objectRange[0] - 1, texts.shift());
+			source.replace(
+				current,
+				dependency.objectRange[0] - 1,
+				/** @type {string} */ (texts.shift())
+			);
 			current = dependency.objectRange[1];
 		} else if (dependency.functionRange) {
-			source.replace(current, dependency.functionRange[0] - 1, texts.shift());
+			source.replace(
+				current,
+				dependency.functionRange[0] - 1,
+				/** @type {string} */ (texts.shift())
+			);
 			current = dependency.functionRange[1];
 		}
-		source.replace(current, dependency.range[1] - 1, texts.shift());
+		source.replace(
+			current,
+			dependency.range[1] - 1,
+			/** @type {string} */ (texts.shift())
+		);
 		if (texts.length > 0) throw new Error("Implementation error");
 	}
 };
diff --git a/lib/dependencies/AMDDefineDependencyParserPlugin.js b/lib/dependencies/AMDDefineDependencyParserPlugin.js
index 99a1528a55b..f509d05c7c0 100644
--- a/lib/dependencies/AMDDefineDependencyParserPlugin.js
+++ b/lib/dependencies/AMDDefineDependencyParserPlugin.js
@@ -2,17 +2,40 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const AMDRequireItemDependency = require("./AMDRequireItemDependency");
-const AMDRequireContextDependency = require("./AMDRequireContextDependency");
-const ConstDependency = require("./ConstDependency");
+const RuntimeGlobals = require("../RuntimeGlobals");
 const AMDDefineDependency = require("./AMDDefineDependency");
 const AMDRequireArrayDependency = require("./AMDRequireArrayDependency");
-const LocalModuleDependency = require("./LocalModuleDependency");
+const AMDRequireContextDependency = require("./AMDRequireContextDependency");
+const AMDRequireItemDependency = require("./AMDRequireItemDependency");
+const ConstDependency = require("./ConstDependency");
 const ContextDependencyHelpers = require("./ContextDependencyHelpers");
-const LocalModulesHelpers = require("./LocalModulesHelpers");
+const DynamicExports = require("./DynamicExports");
+const LocalModuleDependency = require("./LocalModuleDependency");
+const { addLocalModule, getLocalModule } = require("./LocalModulesHelpers");
 
+/** @typedef {import("estree").ArrowFunctionExpression} ArrowFunctionExpression */
+/** @typedef {import("estree").CallExpression} CallExpression */
+/** @typedef {import("estree").Expression} Expression */
+/** @typedef {import("estree").FunctionExpression} FunctionExpression */
+/** @typedef {import("estree").Identifier} Identifier */
+/** @typedef {import("estree").Literal} Literal */
+/** @typedef {import("estree").MemberExpression} MemberExpression */
+/** @typedef {import("estree").ObjectExpression} ObjectExpression */
+/** @typedef {import("estree").SimpleCallExpression} SimpleCallExpression */
+/** @typedef {import("estree").SpreadElement} SpreadElement */
+/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("../javascript/BasicEvaluatedExpression")} BasicEvaluatedExpression */
+/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+
+/**
+ * @param {Expression | SpreadElement} expr expression
+ * @returns {expr is CallExpression} true if it's a bound function expression
+ */
 const isBoundFunctionExpression = expr => {
 	if (expr.type !== "CallExpression") return false;
 	if (expr.callee.type !== "MemberExpression") return false;
@@ -23,12 +46,22 @@ const isBoundFunctionExpression = expr => {
 	return true;
 };
 
+/** @typedef {FunctionExpression | ArrowFunctionExpression} UnboundFunctionExpression */
+
+/**
+ * @param {Expression | SpreadElement} expr expression
+ * @returns {expr is FunctionExpression | ArrowFunctionExpression} true when unbound function expression
+ */
 const isUnboundFunctionExpression = expr => {
 	if (expr.type === "FunctionExpression") return true;
 	if (expr.type === "ArrowFunctionExpression") return true;
 	return false;
 };
 
+/**
+ * @param {Expression | SpreadElement} expr expression
+ * @returns {expr is FunctionExpression | ArrowFunctionExpression | CallExpression} true when callable
+ */
 const isCallable = expr => {
 	if (isUnboundFunctionExpression(expr)) return true;
 	if (isBoundFunctionExpression(expr)) return true;
@@ -36,10 +69,17 @@ const isCallable = expr => {
 };
 
 class AMDDefineDependencyParserPlugin {
+	/**
+	 * @param {JavascriptParserOptions} options parserOptions
+	 */
 	constructor(options) {
 		this.options = options;
 	}
 
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @returns {void}
+	 */
 	apply(parser) {
 		parser.hooks.call
 			.for("define")
@@ -49,106 +89,173 @@ class AMDDefineDependencyParserPlugin {
 			);
 	}
 
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @param {CallExpression} expr call expression
+	 * @param {BasicEvaluatedExpression} param param
+	 * @param {Record} identifiers identifiers
+	 * @param {string=} namedModule named module
+	 * @returns {boolean | undefined} result
+	 */
 	processArray(parser, expr, param, identifiers, namedModule) {
 		if (param.isArray()) {
-			param.items.forEach((param, idx) => {
+			const items = /** @type {BasicEvaluatedExpression[]} */ (param.items);
+			for (const [idx, item] of items.entries()) {
 				if (
-					param.isString() &&
-					["require", "module", "exports"].includes(param.string)
+					item.isString() &&
+					["require", "module", "exports"].includes(
+						/** @type {string} */ (item.string)
+					)
 				)
-					identifiers[idx] = param.string;
-				const result = this.processItem(parser, expr, param, namedModule);
+					identifiers[/** @type {number} */ (idx)] = /** @type {string} */ (
+						item.string
+					);
+				const result = this.processItem(parser, expr, item, namedModule);
 				if (result === undefined) {
-					this.processContext(parser, expr, param);
+					this.processContext(parser, expr, item);
 				}
-			});
+			}
 			return true;
 		} else if (param.isConstArray()) {
+			/** @type {(string | LocalModuleDependency | AMDRequireItemDependency)[]} */
 			const deps = [];
-			param.array.forEach((request, idx) => {
+			const array = /** @type {string[]} */ (param.array);
+			for (const [idx, request] of array.entries()) {
 				let dep;
 				let localModule;
 				if (request === "require") {
 					identifiers[idx] = request;
-					dep = "__webpack_require__";
+					dep = RuntimeGlobals.require;
 				} else if (["exports", "module"].includes(request)) {
 					identifiers[idx] = request;
 					dep = request;
-				} else if (
-					(localModule = LocalModulesHelpers.getLocalModule(
-						parser.state,
-						request
-					))
-				) {
+				} else if ((localModule = getLocalModule(parser.state, request))) {
+					localModule.flagUsed();
 					dep = new LocalModuleDependency(localModule, undefined, false);
-					dep.loc = expr.loc;
-					parser.state.current.addDependency(dep);
+					dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+					parser.state.module.addPresentationalDependency(dep);
 				} else {
 					dep = this.newRequireItemDependency(request);
-					dep.loc = expr.loc;
-					dep.optional = !!parser.scope.inTry;
+					dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+					dep.optional = Boolean(parser.scope.inTry);
 					parser.state.current.addDependency(dep);
 				}
 				deps.push(dep);
-			});
-			const dep = this.newRequireArrayDependency(deps, param.range);
-			dep.loc = expr.loc;
-			dep.optional = !!parser.scope.inTry;
-			parser.state.current.addDependency(dep);
+			}
+			const dep = this.newRequireArrayDependency(
+				deps,
+				/** @type {Range} */ (param.range)
+			);
+			dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+			dep.optional = Boolean(parser.scope.inTry);
+			parser.state.module.addPresentationalDependency(dep);
 			return true;
 		}
 	}
+
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @param {CallExpression} expr call expression
+	 * @param {BasicEvaluatedExpression} param param
+	 * @param {string=} namedModule named module
+	 * @returns {boolean | undefined} result
+	 */
 	processItem(parser, expr, param, namedModule) {
 		if (param.isConditional()) {
-			param.options.forEach(param => {
-				const result = this.processItem(parser, expr, param);
+			const options = /** @type {BasicEvaluatedExpression[]} */ (param.options);
+			for (const item of options) {
+				const result = this.processItem(parser, expr, item);
 				if (result === undefined) {
-					this.processContext(parser, expr, param);
+					this.processContext(parser, expr, item);
 				}
-			});
+			}
+
 			return true;
 		} else if (param.isString()) {
-			let dep, localModule;
+			let dep;
+			let localModule;
+
 			if (param.string === "require") {
-				dep = new ConstDependency("__webpack_require__", param.range);
-			} else if (["require", "exports", "module"].includes(param.string)) {
-				dep = new ConstDependency(param.string, param.range);
+				dep = new ConstDependency(
+					RuntimeGlobals.require,
+					/** @type {Range} */ (param.range),
+					[RuntimeGlobals.require]
+				);
+			} else if (param.string === "exports") {
+				dep = new ConstDependency(
+					"exports",
+					/** @type {Range} */ (param.range),
+					[RuntimeGlobals.exports]
+				);
+			} else if (param.string === "module") {
+				dep = new ConstDependency(
+					"module",
+					/** @type {Range} */ (param.range),
+					[RuntimeGlobals.module]
+				);
 			} else if (
-				(localModule = LocalModulesHelpers.getLocalModule(
+				(localModule = getLocalModule(
 					parser.state,
-					param.string,
+					/** @type {string} */ (param.string),
 					namedModule
 				))
 			) {
+				localModule.flagUsed();
 				dep = new LocalModuleDependency(localModule, param.range, false);
 			} else {
-				dep = this.newRequireItemDependency(param.string, param.range);
+				dep = this.newRequireItemDependency(
+					/** @type {string} */ (param.string),
+					param.range
+				);
+				dep.optional = Boolean(parser.scope.inTry);
+				parser.state.current.addDependency(dep);
+				return true;
 			}
-			dep.loc = expr.loc;
-			dep.optional = !!parser.scope.inTry;
-			parser.state.current.addDependency(dep);
+			dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+			parser.state.module.addPresentationalDependency(dep);
 			return true;
 		}
 	}
+
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @param {CallExpression} expr call expression
+	 * @param {BasicEvaluatedExpression} param param
+	 * @returns {boolean | undefined} result
+	 */
 	processContext(parser, expr, param) {
 		const dep = ContextDependencyHelpers.create(
 			AMDRequireContextDependency,
-			param.range,
+			/** @type {Range} */ (param.range),
 			param,
 			expr,
 			this.options,
-			{},
+			{
+				category: "amd"
+			},
 			parser
 		);
 		if (!dep) return;
-		dep.loc = expr.loc;
-		dep.optional = !!parser.scope.inTry;
+		dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+		dep.optional = Boolean(parser.scope.inTry);
 		parser.state.current.addDependency(dep);
 		return true;
 	}
 
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @param {CallExpression} expr call expression
+	 * @returns {boolean | undefined} result
+	 */
 	processCallDefine(parser, expr) {
-		let array, fn, obj, namedModule;
+		/** @type {Expression | SpreadElement | undefined} */
+		let array;
+		/** @type {FunctionExpression | ArrowFunctionExpression | CallExpression | Identifier | undefined} */
+		let fn;
+		/** @type {ObjectExpression | Identifier | undefined} */
+		let obj;
+		/** @type {string | undefined} */
+		let namedModule;
 		switch (expr.arguments.length) {
 			case 1:
 				if (isCallable(expr.arguments[0])) {
@@ -160,12 +267,12 @@ class AMDDefineDependencyParserPlugin {
 				} else {
 					// define(expr)
 					// unclear if function or object
-					obj = fn = expr.arguments[0];
+					obj = fn = /** @type {Identifier} */ (expr.arguments[0]);
 				}
 				break;
 			case 2:
 				if (expr.arguments[0].type === "Literal") {
-					namedModule = expr.arguments[0].value;
+					namedModule = /** @type {string} */ (expr.arguments[0].value);
 					// define("…", …)
 					if (isCallable(expr.arguments[1])) {
 						// define("…", f() {…})
@@ -176,7 +283,7 @@ class AMDDefineDependencyParserPlugin {
 					} else {
 						// define("…", expr)
 						// unclear if function or object
-						obj = fn = expr.arguments[1];
+						obj = fn = /** @type {Identifier} */ (expr.arguments[1]);
 					}
 				} else {
 					array = expr.arguments[0];
@@ -189,13 +296,18 @@ class AMDDefineDependencyParserPlugin {
 					} else {
 						// define([…], expr)
 						// unclear if function or object
-						obj = fn = expr.arguments[1];
+						obj = fn = /** @type {Identifier} */ (expr.arguments[1]);
 					}
 				}
 				break;
 			case 3:
 				// define("…", […], f() {…})
-				namedModule = expr.arguments[0].value;
+				namedModule =
+					/** @type {string} */
+					(
+						/** @type {Literal} */
+						(expr.arguments[0]).value
+					);
 				array = expr.arguments[1];
 				if (isCallable(expr.arguments[2])) {
 					// define("…", […], f() {})
@@ -206,27 +318,38 @@ class AMDDefineDependencyParserPlugin {
 				} else {
 					// define("…", […], expr)
 					// unclear if function or object
-					obj = fn = expr.arguments[2];
+					obj = fn = /** @type {Identifier} */ (expr.arguments[2]);
 				}
 				break;
 			default:
 				return;
 		}
+		DynamicExports.bailout(parser.state);
+		/** @type {Identifier[] | null} */
 		let fnParams = null;
 		let fnParamsOffset = 0;
 		if (fn) {
 			if (isUnboundFunctionExpression(fn)) {
-				fnParams = fn.params;
+				fnParams =
+					/** @type {Identifier[]} */
+					(fn.params);
 			} else if (isBoundFunctionExpression(fn)) {
-				fnParams = fn.callee.object.params;
+				const object =
+					/** @type {FunctionExpression} */
+					(/** @type {MemberExpression} */ (fn.callee).object);
+
+				fnParams =
+					/** @type {Identifier[]} */
+					(object.params);
 				fnParamsOffset = fn.arguments.length - 1;
 				if (fnParamsOffset < 0) {
 					fnParamsOffset = 0;
 				}
 			}
 		}
-		let fnRenames = parser.scope.renames.createChild();
+		const fnRenames = new Map();
 		if (array) {
+			/** @type {Record} */
 			const identifiers = {};
 			const param = parser.evaluateExpression(array);
 			const result = this.processArray(
@@ -240,7 +363,7 @@ class AMDDefineDependencyParserPlugin {
 			if (fnParams) {
 				fnParams = fnParams.slice(fnParamsOffset).filter((param, idx) => {
 					if (identifiers[idx]) {
-						fnRenames.set(param.name, identifiers[idx]);
+						fnRenames.set(param.name, parser.getVariableInfo(identifiers[idx]));
 						return false;
 					}
 					return true;
@@ -251,20 +374,27 @@ class AMDDefineDependencyParserPlugin {
 			if (fnParams) {
 				fnParams = fnParams.slice(fnParamsOffset).filter((param, idx) => {
 					if (identifiers[idx]) {
-						fnRenames.set(param.name, identifiers[idx]);
+						fnRenames.set(param.name, parser.getVariableInfo(identifiers[idx]));
 						return false;
 					}
 					return true;
 				});
 			}
 		}
+		/** @type {boolean | undefined} */
 		let inTry;
 		if (fn && isUnboundFunctionExpression(fn)) {
 			inTry = parser.scope.inTry;
-			parser.inScope(fnParams, () => {
-				parser.scope.renames = fnRenames;
-				parser.scope.inTry = inTry;
+			parser.inScope(/** @type {Identifier[]} */ (fnParams), () => {
+				for (const [name, varInfo] of fnRenames) {
+					parser.setVariable(name, varInfo);
+				}
+				parser.scope.inTry = /** @type {boolean} */ (inTry);
 				if (fn.body.type === "BlockStatement") {
+					parser.detectMode(fn.body.body);
+					const prev = parser.prevStatement;
+					parser.preWalkStatement(fn.body);
+					parser.prevStatement = prev;
 					parser.walkStatement(fn.body);
 				} else {
 					parser.walkExpression(fn.body);
@@ -272,17 +402,33 @@ class AMDDefineDependencyParserPlugin {
 			});
 		} else if (fn && isBoundFunctionExpression(fn)) {
 			inTry = parser.scope.inTry;
+
+			const object =
+				/** @type {FunctionExpression} */
+				(/** @type {MemberExpression} */ (fn.callee).object);
+
 			parser.inScope(
-				fn.callee.object.params.filter(
+				/** @type {Identifier[]} */
+				(object.params).filter(
 					i => !["require", "module", "exports"].includes(i.name)
 				),
 				() => {
-					parser.scope.renames = fnRenames;
-					parser.scope.inTry = inTry;
-					if (fn.callee.object.body.type === "BlockStatement") {
-						parser.walkStatement(fn.callee.object.body);
+					for (const [name, varInfo] of fnRenames) {
+						parser.setVariable(name, varInfo);
+					}
+					parser.scope.inTry = /** @type {boolean} */ (inTry);
+
+					if (object.body.type === "BlockStatement") {
+						parser.detectMode(object.body.body);
+						const prev = parser.prevStatement;
+						parser.preWalkStatement(object.body);
+						parser.prevStatement = prev;
+						parser.walkStatement(object.body);
 					} else {
-						parser.walkExpression(fn.callee.object.body);
+						parser.walkExpression(
+							/** @type {TODO} */
+							(object.body)
+						);
 					}
 				}
 			);
@@ -290,27 +436,35 @@ class AMDDefineDependencyParserPlugin {
 				parser.walkExpressions(fn.arguments);
 			}
 		} else if (fn || obj) {
-			parser.walkExpression(fn || obj);
+			parser.walkExpression(
+				/** @type {FunctionExpression | ArrowFunctionExpression | CallExpression | ObjectExpression | Identifier} */
+				(fn || obj)
+			);
 		}
 
 		const dep = this.newDefineDependency(
-			expr.range,
-			array ? array.range : null,
-			fn ? fn.range : null,
-			obj ? obj.range : null,
-			namedModule ? namedModule : null
+			/** @type {Range} */ (expr.range),
+			array ? /** @type {Range} */ (array.range) : null,
+			fn ? /** @type {Range} */ (fn.range) : null,
+			obj ? /** @type {Range} */ (obj.range) : null,
+			namedModule || null
 		);
-		dep.loc = expr.loc;
+		dep.loc = /** @type {DependencyLocation} */ (expr.loc);
 		if (namedModule) {
-			dep.localModule = LocalModulesHelpers.addLocalModule(
-				parser.state,
-				namedModule
-			);
+			dep.localModule = addLocalModule(parser.state, namedModule);
 		}
-		parser.state.current.addDependency(dep);
+		parser.state.module.addPresentationalDependency(dep);
 		return true;
 	}
 
+	/**
+	 * @param {Range} range range
+	 * @param {Range | null} arrayRange array range
+	 * @param {Range | null} functionRange function range
+	 * @param {Range | null} objectRange object range
+	 * @param {string | null} namedModule true, when define is called with a name
+	 * @returns {AMDDefineDependency} AMDDefineDependency
+	 */
 	newDefineDependency(
 		range,
 		arrayRange,
@@ -326,11 +480,24 @@ class AMDDefineDependencyParserPlugin {
 			namedModule
 		);
 	}
+
+	/**
+	 * @param {(string | LocalModuleDependency | AMDRequireItemDependency)[]} depsArray deps array
+	 * @param {Range} range range
+	 * @returns {AMDRequireArrayDependency} AMDRequireArrayDependency
+	 */
 	newRequireArrayDependency(depsArray, range) {
 		return new AMDRequireArrayDependency(depsArray, range);
 	}
+
+	/**
+	 * @param {string} request request
+	 * @param {Range=} range range
+	 * @returns {AMDRequireItemDependency} AMDRequireItemDependency
+	 */
 	newRequireItemDependency(request, range) {
 		return new AMDRequireItemDependency(request, range);
 	}
 }
+
 module.exports = AMDDefineDependencyParserPlugin;
diff --git a/lib/dependencies/AMDPlugin.js b/lib/dependencies/AMDPlugin.js
index d113491c969..03137d843a5 100644
--- a/lib/dependencies/AMDPlugin.js
+++ b/lib/dependencies/AMDPlugin.js
@@ -2,42 +2,66 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const path = require("path");
-const AMDRequireDependency = require("./AMDRequireDependency");
-const AMDRequireItemDependency = require("./AMDRequireItemDependency");
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_DYNAMIC
+} = require("../ModuleTypeConstants");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const {
+	approve,
+	evaluateToIdentifier,
+	evaluateToString,
+	toConstantDependency
+} = require("../javascript/JavascriptParserHelpers");
+
+const AMDDefineDependency = require("./AMDDefineDependency");
+const AMDDefineDependencyParserPlugin = require("./AMDDefineDependencyParserPlugin");
 const AMDRequireArrayDependency = require("./AMDRequireArrayDependency");
 const AMDRequireContextDependency = require("./AMDRequireContextDependency");
-const AMDDefineDependency = require("./AMDDefineDependency");
-const UnsupportedDependency = require("./UnsupportedDependency");
+const AMDRequireDependenciesBlockParserPlugin = require("./AMDRequireDependenciesBlockParserPlugin");
+const AMDRequireDependency = require("./AMDRequireDependency");
+const AMDRequireItemDependency = require("./AMDRequireItemDependency");
+const {
+	AMDDefineRuntimeModule,
+	AMDOptionsRuntimeModule
+} = require("./AMDRuntimeModules");
+const ConstDependency = require("./ConstDependency");
 const LocalModuleDependency = require("./LocalModuleDependency");
+const UnsupportedDependency = require("./UnsupportedDependency");
 
-const NullFactory = require("../NullFactory");
+/** @typedef {import("../../declarations/WebpackOptions").Amd} Amd */
+/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
+/** @typedef {import("../../declarations/WebpackOptions").ModuleOptionsNormalized} ModuleOptions */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("../javascript/JavascriptParser")} Parser */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
 
-const AMDRequireDependenciesBlockParserPlugin = require("./AMDRequireDependenciesBlockParserPlugin");
-const AMDDefineDependencyParserPlugin = require("./AMDDefineDependencyParserPlugin");
+const PLUGIN_NAME = "AMDPlugin";
 
-const AliasPlugin = require("enhanced-resolve/lib/AliasPlugin");
-
-const ParserHelpers = require("../ParserHelpers");
+/** @typedef {Record} AmdOptions */
 
 class AMDPlugin {
-	constructor(options, amdOptions) {
+	/**
+	 * @param {AmdOptions} amdOptions the AMD options
+	 */
+	constructor(amdOptions) {
 		this.amdOptions = amdOptions;
-		this.options = options;
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		const options = this.options;
 		const amdOptions = this.amdOptions;
 		compiler.hooks.compilation.tap(
-			"AMDPlugin",
+			PLUGIN_NAME,
 			(compilation, { contextModuleFactory, normalModuleFactory }) => {
-				compilation.dependencyFactories.set(
-					AMDRequireDependency,
-					new NullFactory()
-				);
 				compilation.dependencyTemplates.set(
 					AMDRequireDependency,
 					new AMDRequireDependency.Template()
@@ -52,10 +76,6 @@ class AMDPlugin {
 					new AMDRequireItemDependency.Template()
 				);
 
-				compilation.dependencyFactories.set(
-					AMDRequireArrayDependency,
-					new NullFactory()
-				);
 				compilation.dependencyTemplates.set(
 					AMDRequireArrayDependency,
 					new AMDRequireArrayDependency.Template()
@@ -70,180 +90,150 @@ class AMDPlugin {
 					new AMDRequireContextDependency.Template()
 				);
 
-				compilation.dependencyFactories.set(
-					AMDDefineDependency,
-					new NullFactory()
-				);
 				compilation.dependencyTemplates.set(
 					AMDDefineDependency,
 					new AMDDefineDependency.Template()
 				);
 
-				compilation.dependencyFactories.set(
-					UnsupportedDependency,
-					new NullFactory()
-				);
 				compilation.dependencyTemplates.set(
 					UnsupportedDependency,
 					new UnsupportedDependency.Template()
 				);
 
-				compilation.dependencyFactories.set(
-					LocalModuleDependency,
-					new NullFactory()
-				);
 				compilation.dependencyTemplates.set(
 					LocalModuleDependency,
 					new LocalModuleDependency.Template()
 				);
 
+				compilation.hooks.runtimeRequirementInModule
+					.for(RuntimeGlobals.amdDefine)
+					.tap(PLUGIN_NAME, (module, set) => {
+						set.add(RuntimeGlobals.require);
+					});
+
+				compilation.hooks.runtimeRequirementInModule
+					.for(RuntimeGlobals.amdOptions)
+					.tap(PLUGIN_NAME, (module, set) => {
+						set.add(RuntimeGlobals.requireScope);
+					});
+
+				compilation.hooks.runtimeRequirementInTree
+					.for(RuntimeGlobals.amdDefine)
+					.tap(PLUGIN_NAME, (chunk, set) => {
+						compilation.addRuntimeModule(chunk, new AMDDefineRuntimeModule());
+					});
+
+				compilation.hooks.runtimeRequirementInTree
+					.for(RuntimeGlobals.amdOptions)
+					.tap(PLUGIN_NAME, (chunk, set) => {
+						compilation.addRuntimeModule(
+							chunk,
+							new AMDOptionsRuntimeModule(amdOptions)
+						);
+					});
+
+				/**
+				 * @param {Parser} parser parser parser
+				 * @param {JavascriptParserOptions} parserOptions parserOptions
+				 * @returns {void}
+				 */
 				const handler = (parser, parserOptions) => {
 					if (parserOptions.amd !== undefined && !parserOptions.amd) return;
 
-					const setExpressionToModule = (outerExpr, module) => {
-						parser.hooks.expression.for(outerExpr).tap("AMDPlugin", expr => {
-							const dep = new AMDRequireItemDependency(module, expr.range);
-							dep.userRequest = outerExpr;
-							dep.loc = expr.loc;
-							parser.state.current.addDependency(dep);
-							return true;
-						});
+					/**
+					 * @param {string} optionExpr option expression
+					 * @param {string} rootName root name
+					 * @param {() => TODO} getMembers callback
+					 */
+					const tapOptionsHooks = (optionExpr, rootName, getMembers) => {
+						parser.hooks.expression
+							.for(optionExpr)
+							.tap(
+								PLUGIN_NAME,
+								toConstantDependency(parser, RuntimeGlobals.amdOptions, [
+									RuntimeGlobals.amdOptions
+								])
+							);
+						parser.hooks.evaluateIdentifier
+							.for(optionExpr)
+							.tap(
+								PLUGIN_NAME,
+								evaluateToIdentifier(optionExpr, rootName, getMembers, true)
+							);
+						parser.hooks.evaluateTypeof
+							.for(optionExpr)
+							.tap(PLUGIN_NAME, evaluateToString("object"));
+						parser.hooks.typeof
+							.for(optionExpr)
+							.tap(
+								PLUGIN_NAME,
+								toConstantDependency(parser, JSON.stringify("object"))
+							);
 					};
 
-					new AMDRequireDependenciesBlockParserPlugin(options).apply(parser);
-					new AMDDefineDependencyParserPlugin(options).apply(parser);
-
-					setExpressionToModule("require.amd", "!!webpack amd options");
-					setExpressionToModule("define.amd", "!!webpack amd options");
-					setExpressionToModule("define", "!!webpack amd define");
-
-					parser.hooks.expression
-						.for("__webpack_amd_options__")
-						.tap("AMDPlugin", () =>
-							parser.state.current.addVariable(
-								"__webpack_amd_options__",
-								JSON.stringify(amdOptions)
-							)
-						);
-					parser.hooks.evaluateTypeof
-						.for("define.amd")
-						.tap(
-							"AMDPlugin",
-							ParserHelpers.evaluateToString(typeof amdOptions)
-						);
-					parser.hooks.evaluateTypeof
-						.for("require.amd")
-						.tap(
-							"AMDPlugin",
-							ParserHelpers.evaluateToString(typeof amdOptions)
-						);
-					parser.hooks.evaluateIdentifier
-						.for("define.amd")
-						.tap(
-							"AMDPlugin",
-							ParserHelpers.evaluateToIdentifier("define.amd", true)
-						);
-					parser.hooks.evaluateIdentifier
-						.for("require.amd")
-						.tap(
-							"AMDPlugin",
-							ParserHelpers.evaluateToIdentifier("require.amd", true)
+					new AMDRequireDependenciesBlockParserPlugin(parserOptions).apply(
+						parser
+					);
+					new AMDDefineDependencyParserPlugin(parserOptions).apply(parser);
+
+					tapOptionsHooks("define.amd", "define", () => "amd");
+					tapOptionsHooks("require.amd", "require", () => ["amd"]);
+					tapOptionsHooks(
+						"__webpack_amd_options__",
+						"__webpack_amd_options__",
+						() => []
+					);
+
+					parser.hooks.expression.for("define").tap(PLUGIN_NAME, expr => {
+						const dep = new ConstDependency(
+							RuntimeGlobals.amdDefine,
+							/** @type {Range} */ (expr.range),
+							[RuntimeGlobals.amdDefine]
 						);
+						dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+						parser.state.module.addPresentationalDependency(dep);
+						return true;
+					});
 					parser.hooks.typeof
 						.for("define")
 						.tap(
-							"AMDPlugin",
-							ParserHelpers.toConstantDependency(
-								parser,
-								JSON.stringify("function")
-							)
+							PLUGIN_NAME,
+							toConstantDependency(parser, JSON.stringify("function"))
 						);
 					parser.hooks.evaluateTypeof
 						.for("define")
-						.tap("AMDPlugin", ParserHelpers.evaluateToString("function"));
-					parser.hooks.canRename
-						.for("define")
-						.tap("AMDPlugin", ParserHelpers.approve);
-					parser.hooks.rename.for("define").tap("AMDPlugin", expr => {
-						const dep = new AMDRequireItemDependency(
-							"!!webpack amd define",
-							expr.range
+						.tap(PLUGIN_NAME, evaluateToString("function"));
+					parser.hooks.canRename.for("define").tap(PLUGIN_NAME, approve);
+					parser.hooks.rename.for("define").tap(PLUGIN_NAME, expr => {
+						const dep = new ConstDependency(
+							RuntimeGlobals.amdDefine,
+							/** @type {Range} */ (expr.range),
+							[RuntimeGlobals.amdDefine]
 						);
-						dep.userRequest = "define";
-						dep.loc = expr.loc;
-						parser.state.current.addDependency(dep);
+						dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+						parser.state.module.addPresentationalDependency(dep);
 						return false;
 					});
 					parser.hooks.typeof
 						.for("require")
 						.tap(
-							"AMDPlugin",
-							ParserHelpers.toConstantDependency(
-								parser,
-								JSON.stringify("function")
-							)
+							PLUGIN_NAME,
+							toConstantDependency(parser, JSON.stringify("function"))
 						);
 					parser.hooks.evaluateTypeof
 						.for("require")
-						.tap("AMDPlugin", ParserHelpers.evaluateToString("function"));
+						.tap(PLUGIN_NAME, evaluateToString("function"));
 				};
 
 				normalModuleFactory.hooks.parser
-					.for("javascript/auto")
-					.tap("AMDPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, handler);
 				normalModuleFactory.hooks.parser
-					.for("javascript/dynamic")
-					.tap("AMDPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
+					.tap(PLUGIN_NAME, handler);
 			}
 		);
-		compiler.hooks.afterResolvers.tap("AMDPlugin", () => {
-			compiler.resolverFactory.hooks.resolver
-				.for("normal")
-				.tap("AMDPlugin", resolver => {
-					new AliasPlugin(
-						"described-resolve",
-						{
-							name: "amdefine",
-							alias: path.join(
-								__dirname,
-								"..",
-								"..",
-								"buildin",
-								"amd-define.js"
-							)
-						},
-						"resolve"
-					).apply(resolver);
-					new AliasPlugin(
-						"described-resolve",
-						{
-							name: "webpack amd options",
-							alias: path.join(
-								__dirname,
-								"..",
-								"..",
-								"buildin",
-								"amd-options.js"
-							)
-						},
-						"resolve"
-					).apply(resolver);
-					new AliasPlugin(
-						"described-resolve",
-						{
-							name: "webpack amd define",
-							alias: path.join(
-								__dirname,
-								"..",
-								"..",
-								"buildin",
-								"amd-define.js"
-							)
-						},
-						"resolve"
-					).apply(resolver);
-				});
-		});
 	}
 }
+
 module.exports = AMDPlugin;
diff --git a/lib/dependencies/AMDRequireArrayDependency.js b/lib/dependencies/AMDRequireArrayDependency.js
index ddb9c293f61..1df80723d10 100644
--- a/lib/dependencies/AMDRequireArrayDependency.js
+++ b/lib/dependencies/AMDRequireArrayDependency.js
@@ -2,12 +2,30 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
-const Dependency = require("../Dependency");
 
-class AMDRequireArrayDependency extends Dependency {
+const DependencyTemplate = require("../DependencyTemplate");
+const makeSerializable = require("../util/makeSerializable");
+const LocalModuleDependency = require("./LocalModuleDependency");
+const NullDependency = require("./NullDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("./AMDRequireItemDependency")} AMDRequireItemDependency */
+
+class AMDRequireArrayDependency extends NullDependency {
+	/**
+	 * @param {(string | LocalModuleDependency | AMDRequireItemDependency)[]} depsArray deps array
+	 * @param {Range} range range
+	 */
 	constructor(depsArray, range) {
 		super();
+
 		this.depsArray = depsArray;
 		this.range = range;
 	}
@@ -15,34 +33,91 @@ class AMDRequireArrayDependency extends Dependency {
 	get type() {
 		return "amd require array";
 	}
+
+	get category() {
+		return "amd";
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+
+		write(this.depsArray);
+		write(this.range);
+
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+
+		this.depsArray = read();
+		this.range = read();
+
+		super.deserialize(context);
+	}
 }
 
-AMDRequireArrayDependency.Template = class AMDRequireArrayDependencyTemplate {
-	apply(dep, source, runtime) {
-		const content = this.getContent(dep, runtime);
+makeSerializable(
+	AMDRequireArrayDependency,
+	"webpack/lib/dependencies/AMDRequireArrayDependency"
+);
+
+AMDRequireArrayDependency.Template = class AMDRequireArrayDependencyTemplate extends (
+	DependencyTemplate
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, templateContext) {
+		const dep = /** @type {AMDRequireArrayDependency} */ (dependency);
+		const content = this.getContent(dep, templateContext);
 		source.replace(dep.range[0], dep.range[1] - 1, content);
 	}
 
-	getContent(dep, runtime) {
-		const requires = dep.depsArray.map(dependency => {
-			return this.contentForDependency(dependency, runtime);
-		});
+	/**
+	 * @param {AMDRequireArrayDependency} dep the dependency for which the template should be applied
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {string} content
+	 */
+	getContent(dep, templateContext) {
+		const requires = dep.depsArray.map(dependency =>
+			this.contentForDependency(dependency, templateContext)
+		);
 		return `[${requires.join(", ")}]`;
 	}
 
-	contentForDependency(dep, runtime) {
+	/**
+	 * @param {string | LocalModuleDependency | AMDRequireItemDependency} dep the dependency for which the template should be applied
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {string} content
+	 */
+	contentForDependency(
+		dep,
+		{ runtimeTemplate, moduleGraph, chunkGraph, runtimeRequirements }
+	) {
 		if (typeof dep === "string") {
 			return dep;
 		}
 
-		if (dep.localModule) {
+		if (dep instanceof LocalModuleDependency) {
 			return dep.localModule.variableName();
-		} else {
-			return runtime.moduleExports({
-				module: dep.module,
-				request: dep.request
-			});
 		}
+
+		return runtimeTemplate.moduleExports({
+			module: moduleGraph.getModule(dep),
+			chunkGraph,
+			request: dep.request,
+			runtimeRequirements
+		});
 	}
 };
 
diff --git a/lib/dependencies/AMDRequireContextDependency.js b/lib/dependencies/AMDRequireContextDependency.js
index b2e60b5b966..91f30c41b89 100644
--- a/lib/dependencies/AMDRequireContextDependency.js
+++ b/lib/dependencies/AMDRequireContextDependency.js
@@ -2,12 +2,26 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const makeSerializable = require("../util/makeSerializable");
 const ContextDependency = require("./ContextDependency");
+
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("./ContextDependency").ContextDependencyOptions} ContextDependencyOptions */
+
 class AMDRequireContextDependency extends ContextDependency {
+	/**
+	 * @param {ContextDependencyOptions} options options
+	 * @param {Range} range range
+	 * @param {Range} valueRange value range
+	 */
 	constructor(options, range, valueRange) {
 		super(options);
+
 		this.range = range;
 		this.valueRange = valueRange;
 	}
@@ -15,6 +29,41 @@ class AMDRequireContextDependency extends ContextDependency {
 	get type() {
 		return "amd require context";
 	}
+
+	get category() {
+		return "amd";
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+
+		write(this.range);
+		write(this.valueRange);
+
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+
+		this.range = read();
+		this.valueRange = read();
+
+		super.deserialize(context);
+	}
 }
+
+makeSerializable(
+	AMDRequireContextDependency,
+	"webpack/lib/dependencies/AMDRequireContextDependency"
+);
+
 AMDRequireContextDependency.Template = require("./ContextDependencyTemplateAsRequireCall");
+
 module.exports = AMDRequireContextDependency;
diff --git a/lib/dependencies/AMDRequireDependenciesBlock.js b/lib/dependencies/AMDRequireDependenciesBlock.js
index bd7e7b84a5c..615660c3c9e 100644
--- a/lib/dependencies/AMDRequireDependenciesBlock.js
+++ b/lib/dependencies/AMDRequireDependenciesBlock.js
@@ -2,46 +2,27 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
 const AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
-const AMDRequireDependency = require("./AMDRequireDependency");
+const makeSerializable = require("../util/makeSerializable");
 
-module.exports = class AMDRequireDependenciesBlock extends AsyncDependenciesBlock {
-	constructor(
-		expr,
-		arrayRange,
-		functionRange,
-		errorCallbackRange,
-		module,
-		loc,
-		request
-	) {
-		super(null, module, loc, request);
-		this.expr = expr;
-		this.outerRange = expr.range;
-		this.arrayRange = arrayRange;
-		this.functionBindThis = false;
-		this.functionRange = functionRange;
-		this.errorCallbackBindThis = false;
-		this.errorCallbackRange = errorCallbackRange;
-		this.bindThis = true;
-		if (arrayRange && functionRange && errorCallbackRange) {
-			this.range = [arrayRange[0], errorCallbackRange[1]];
-		} else if (arrayRange && functionRange) {
-			this.range = [arrayRange[0], functionRange[1]];
-		} else if (arrayRange) {
-			this.range = arrayRange;
-		} else if (functionRange) {
-			this.range = functionRange;
-		} else {
-			this.range = expr.range;
-		}
-		const dep = this.newRequireDependency();
-		dep.loc = loc;
-		this.addDependency(dep);
-	}
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
 
-	newRequireDependency() {
-		return new AMDRequireDependency(this);
+class AMDRequireDependenciesBlock extends AsyncDependenciesBlock {
+	/**
+	 * @param {DependencyLocation} loc location info
+	 * @param {string=} request request
+	 */
+	constructor(loc, request) {
+		super(null, loc, request);
 	}
-};
+}
+
+makeSerializable(
+	AMDRequireDependenciesBlock,
+	"webpack/lib/dependencies/AMDRequireDependenciesBlock"
+);
+
+module.exports = AMDRequireDependenciesBlock;
diff --git a/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js b/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js
index ea52d819ad5..b65b4e7bc71 100644
--- a/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js
+++ b/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js
@@ -2,33 +2,59 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const AMDRequireItemDependency = require("./AMDRequireItemDependency");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const UnsupportedFeatureWarning = require("../UnsupportedFeatureWarning");
 const AMDRequireArrayDependency = require("./AMDRequireArrayDependency");
 const AMDRequireContextDependency = require("./AMDRequireContextDependency");
 const AMDRequireDependenciesBlock = require("./AMDRequireDependenciesBlock");
-const UnsupportedDependency = require("./UnsupportedDependency");
-const LocalModuleDependency = require("./LocalModuleDependency");
-const ContextDependencyHelpers = require("./ContextDependencyHelpers");
-const LocalModulesHelpers = require("./LocalModulesHelpers");
+const AMDRequireDependency = require("./AMDRequireDependency");
+const AMDRequireItemDependency = require("./AMDRequireItemDependency");
 const ConstDependency = require("./ConstDependency");
+const ContextDependencyHelpers = require("./ContextDependencyHelpers");
+const LocalModuleDependency = require("./LocalModuleDependency");
+const { getLocalModule } = require("./LocalModulesHelpers");
+const UnsupportedDependency = require("./UnsupportedDependency");
 const getFunctionExpression = require("./getFunctionExpression");
-const UnsupportedFeatureWarning = require("../UnsupportedFeatureWarning");
+
+/** @typedef {import("estree").CallExpression} CallExpression */
+/** @typedef {import("estree").Expression} Expression */
+/** @typedef {import("estree").Identifier} Identifier */
+/** @typedef {import("estree").SourceLocation} SourceLocation */
+/** @typedef {import("estree").SpreadElement} SpreadElement */
+/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("../Module").BuildInfo} BuildInfo */
+/** @typedef {import("../javascript/BasicEvaluatedExpression")} BasicEvaluatedExpression */
+/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
 
 class AMDRequireDependenciesBlockParserPlugin {
+	/**
+	 * @param {JavascriptParserOptions} options parserOptions
+	 */
 	constructor(options) {
 		this.options = options;
 	}
 
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @param {Expression | SpreadElement} expression expression
+	 * @returns {boolean} need bind this
+	 */
 	processFunctionArgument(parser, expression) {
 		let bindThis = true;
 		const fnData = getFunctionExpression(expression);
 		if (fnData) {
 			parser.inScope(
-				fnData.fn.params.filter(i => {
-					return !["require", "module", "exports"].includes(i.name);
-				}),
+				fnData.fn.params.filter(
+					i =>
+						!["require", "module", "exports"].includes(
+							/** @type {Identifier} */ (i).name
+						)
+				),
 				() => {
 					if (fnData.fn.body.type === "BlockStatement") {
 						parser.walkStatement(fnData.fn.body);
@@ -47,6 +73,10 @@ class AMDRequireDependenciesBlockParserPlugin {
 		return bindThis;
 	}
 
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @returns {void}
+	 */
 	apply(parser) {
 		parser.hooks.call
 			.for("require")
@@ -56,9 +86,15 @@ class AMDRequireDependenciesBlockParserPlugin {
 			);
 	}
 
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @param {CallExpression} expr call expression
+	 * @param {BasicEvaluatedExpression} param param
+	 * @returns {boolean | undefined} result
+	 */
 	processArray(parser, expr, param) {
 		if (param.isArray()) {
-			for (const p of param.items) {
+			for (const p of /** @type {BasicEvaluatedExpression[]} */ (param.items)) {
 				const result = this.processItem(parser, expr, p);
 				if (result === undefined) {
 					this.processContext(parser, expr, p);
@@ -66,40 +102,50 @@ class AMDRequireDependenciesBlockParserPlugin {
 			}
 			return true;
 		} else if (param.isConstArray()) {
+			/** @type {(string | LocalModuleDependency | AMDRequireItemDependency)[]} */
 			const deps = [];
-			for (const request of param.array) {
-				let dep, localModule;
+			for (const request of /** @type {EXPECTED_ANY[]} */ (param.array)) {
+				let dep;
+				let localModule;
 				if (request === "require") {
-					dep = "__webpack_require__";
+					dep = RuntimeGlobals.require;
 				} else if (["exports", "module"].includes(request)) {
 					dep = request;
-				} else if (
-					(localModule = LocalModulesHelpers.getLocalModule(
-						parser.state,
-						request
-					))
-				) {
+				} else if ((localModule = getLocalModule(parser.state, request))) {
+					localModule.flagUsed();
 					dep = new LocalModuleDependency(localModule, undefined, false);
-					dep.loc = expr.loc;
-					parser.state.current.addDependency(dep);
+					dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+					parser.state.module.addPresentationalDependency(dep);
 				} else {
 					dep = this.newRequireItemDependency(request);
-					dep.loc = expr.loc;
-					dep.optional = !!parser.scope.inTry;
+					dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+					dep.optional = Boolean(parser.scope.inTry);
 					parser.state.current.addDependency(dep);
 				}
 				deps.push(dep);
 			}
-			const dep = this.newRequireArrayDependency(deps, param.range);
-			dep.loc = expr.loc;
-			dep.optional = !!parser.scope.inTry;
-			parser.state.current.addDependency(dep);
+			const dep = this.newRequireArrayDependency(
+				deps,
+				/** @type {Range} */ (param.range)
+			);
+			dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+			dep.optional = Boolean(parser.scope.inTry);
+			parser.state.module.addPresentationalDependency(dep);
 			return true;
 		}
 	}
+
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @param {CallExpression} expr call expression
+	 * @param {BasicEvaluatedExpression} param param
+	 * @returns {boolean | undefined} result
+	 */
 	processItem(parser, expr, param) {
 		if (param.isConditional()) {
-			for (const p of param.options) {
+			for (const p of /** @type {BasicEvaluatedExpression[]} */ (
+				param.options
+			)) {
 				const result = this.processItem(parser, expr, p);
 				if (result === undefined) {
 					this.processContext(parser, expr, p);
@@ -107,166 +153,264 @@ class AMDRequireDependenciesBlockParserPlugin {
 			}
 			return true;
 		} else if (param.isString()) {
-			let dep, localModule;
+			let dep;
+			let localModule;
 			if (param.string === "require") {
-				dep = new ConstDependency("__webpack_require__", param.string);
+				dep = new ConstDependency(
+					RuntimeGlobals.require,
+					/** @type {TODO} */
+					(param.string),
+					[RuntimeGlobals.require]
+				);
 			} else if (param.string === "module") {
 				dep = new ConstDependency(
-					parser.state.module.buildInfo.moduleArgument,
-					param.range
+					/** @type {string} */
+					(
+						/** @type {BuildInfo} */
+						(parser.state.module.buildInfo).moduleArgument
+					),
+					/** @type {Range} */ (param.range),
+					[RuntimeGlobals.module]
 				);
 			} else if (param.string === "exports") {
 				dep = new ConstDependency(
-					parser.state.module.buildInfo.exportsArgument,
-					param.range
+					/** @type {string} */
+					(
+						/** @type {BuildInfo} */
+						(parser.state.module.buildInfo).exportsArgument
+					),
+					/** @type {Range} */ (param.range),
+					[RuntimeGlobals.exports]
 				);
 			} else if (
-				(localModule = LocalModulesHelpers.getLocalModule(
+				(localModule = getLocalModule(
 					parser.state,
-					param.string
+					/** @type {string} */ (param.string)
 				))
 			) {
+				localModule.flagUsed();
 				dep = new LocalModuleDependency(localModule, param.range, false);
 			} else {
-				dep = this.newRequireItemDependency(param.string, param.range);
+				dep = this.newRequireItemDependency(
+					/** @type {string} */ (param.string),
+					param.range
+				);
+				dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+				dep.optional = Boolean(parser.scope.inTry);
+				parser.state.current.addDependency(dep);
+				return true;
 			}
-			dep.loc = expr.loc;
-			dep.optional = !!parser.scope.inTry;
-			parser.state.current.addDependency(dep);
+			dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+			parser.state.module.addPresentationalDependency(dep);
 			return true;
 		}
 	}
+
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @param {CallExpression} expr call expression
+	 * @param {BasicEvaluatedExpression} param param
+	 * @returns {boolean | undefined} result
+	 */
 	processContext(parser, expr, param) {
 		const dep = ContextDependencyHelpers.create(
 			AMDRequireContextDependency,
-			param.range,
+			/** @type {Range} */
+			(param.range),
 			param,
 			expr,
 			this.options,
-			{},
+			{
+				category: "amd"
+			},
 			parser
 		);
 		if (!dep) return;
-		dep.loc = expr.loc;
-		dep.optional = !!parser.scope.inTry;
+		dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+		dep.optional = Boolean(parser.scope.inTry);
 		parser.state.current.addDependency(dep);
 		return true;
 	}
 
+	/**
+	 * @param {BasicEvaluatedExpression} param param
+	 * @returns {string | undefined} result
+	 */
 	processArrayForRequestString(param) {
 		if (param.isArray()) {
-			const result = param.items.map(item =>
-				this.processItemForRequestString(item)
-			);
+			const result =
+				/** @type {BasicEvaluatedExpression[]} */
+				(param.items).map(item => this.processItemForRequestString(item));
 			if (result.every(Boolean)) return result.join(" ");
 		} else if (param.isConstArray()) {
-			return param.array.join(" ");
+			return /** @type {string[]} */ (param.array).join(" ");
 		}
 	}
 
+	/**
+	 * @param {BasicEvaluatedExpression} param param
+	 * @returns {string | undefined} result
+	 */
 	processItemForRequestString(param) {
 		if (param.isConditional()) {
-			const result = param.options.map(item =>
-				this.processItemForRequestString(item)
-			);
+			const result =
+				/** @type {BasicEvaluatedExpression[]} */
+				(param.options).map(item => this.processItemForRequestString(item));
 			if (result.every(Boolean)) return result.join("|");
 		} else if (param.isString()) {
 			return param.string;
 		}
 	}
 
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @param {CallExpression} expr call expression
+	 * @returns {boolean | undefined} result
+	 */
 	processCallRequire(parser, expr) {
+		/** @type {BasicEvaluatedExpression | undefined} */
 		let param;
+		/** @type {AMDRequireDependenciesBlock | undefined | null} */
+		let depBlock;
+		/** @type {AMDRequireDependency | undefined} */
 		let dep;
+		/** @type {boolean | undefined} */
 		let result;
 
 		const old = parser.state.current;
 
 		if (expr.arguments.length >= 1) {
-			param = parser.evaluateExpression(expr.arguments[0]);
-			dep = this.newRequireDependenciesBlock(
-				expr,
-				param.range,
-				expr.arguments.length > 1 ? expr.arguments[1].range : null,
-				expr.arguments.length > 2 ? expr.arguments[2].range : null,
-				parser.state.module,
-				expr.loc,
+			param = parser.evaluateExpression(
+				/** @type {Expression} */ (expr.arguments[0])
+			);
+			depBlock = this.newRequireDependenciesBlock(
+				/** @type {DependencyLocation} */ (expr.loc),
 				this.processArrayForRequestString(param)
 			);
-			parser.state.current = dep;
+			dep = this.newRequireDependency(
+				/** @type {Range} */ (expr.range),
+				/** @type {Range} */ (param.range),
+				expr.arguments.length > 1
+					? /** @type {Range} */ (expr.arguments[1].range)
+					: null,
+				expr.arguments.length > 2
+					? /** @type {Range} */ (expr.arguments[2].range)
+					: null
+			);
+			dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+			depBlock.addDependency(dep);
+
+			parser.state.current = /** @type {TODO} */ (depBlock);
 		}
 
 		if (expr.arguments.length === 1) {
 			parser.inScope([], () => {
-				result = this.processArray(parser, expr, param);
+				result = this.processArray(
+					parser,
+					expr,
+					/** @type {BasicEvaluatedExpression} */ (param)
+				);
 			});
 			parser.state.current = old;
 			if (!result) return;
-			parser.state.current.addBlock(dep);
+			parser.state.current.addBlock(
+				/** @type {AMDRequireDependenciesBlock} */ (depBlock)
+			);
 			return true;
 		}
 
 		if (expr.arguments.length === 2 || expr.arguments.length === 3) {
 			try {
 				parser.inScope([], () => {
-					result = this.processArray(parser, expr, param);
+					result = this.processArray(
+						parser,
+						expr,
+						/** @type {BasicEvaluatedExpression} */ (param)
+					);
 				});
 				if (!result) {
-					dep = new UnsupportedDependency("unsupported", expr.range);
-					old.addDependency(dep);
+					const dep = new UnsupportedDependency(
+						"unsupported",
+						/** @type {Range} */ (expr.range)
+					);
+					old.addPresentationalDependency(dep);
 					if (parser.state.module) {
-						parser.state.module.errors.push(
+						parser.state.module.addError(
 							new UnsupportedFeatureWarning(
-								parser.state.module,
-								"Cannot statically analyse 'require(…, …)' in line " +
-									expr.loc.start.line,
-								expr.loc
+								`Cannot statically analyse 'require(…, …)' in line ${
+									/** @type {SourceLocation} */ (expr.loc).start.line
+								}`,
+								/** @type {DependencyLocation} */ (expr.loc)
 							)
 						);
 					}
-					dep = null;
+					depBlock = null;
 					return true;
 				}
-				dep.functionBindThis = this.processFunctionArgument(
+				/** @type {AMDRequireDependency} */
+				(dep).functionBindThis = this.processFunctionArgument(
 					parser,
 					expr.arguments[1]
 				);
 				if (expr.arguments.length === 3) {
-					dep.errorCallbackBindThis = this.processFunctionArgument(
+					/** @type {AMDRequireDependency} */
+					(dep).errorCallbackBindThis = this.processFunctionArgument(
 						parser,
 						expr.arguments[2]
 					);
 				}
 			} finally {
 				parser.state.current = old;
-				if (dep) parser.state.current.addBlock(dep);
+				if (depBlock) parser.state.current.addBlock(depBlock);
 			}
 			return true;
 		}
 	}
 
-	newRequireDependenciesBlock(
-		expr,
+	/**
+	 * @param {DependencyLocation} loc location
+	 * @param {string=} request request
+	 * @returns {AMDRequireDependenciesBlock} AMDRequireDependenciesBlock
+	 */
+	newRequireDependenciesBlock(loc, request) {
+		return new AMDRequireDependenciesBlock(loc, request);
+	}
+
+	/**
+	 * @param {Range} outerRange outer range
+	 * @param {Range} arrayRange array range
+	 * @param {Range | null} functionRange function range
+	 * @param {Range | null} errorCallbackRange error callback range
+	 * @returns {AMDRequireDependency} dependency
+	 */
+	newRequireDependency(
+		outerRange,
 		arrayRange,
 		functionRange,
-		errorCallbackRange,
-		module,
-		loc,
-		request
+		errorCallbackRange
 	) {
-		return new AMDRequireDependenciesBlock(
-			expr,
+		return new AMDRequireDependency(
+			outerRange,
 			arrayRange,
 			functionRange,
-			errorCallbackRange,
-			module,
-			loc,
-			request
+			errorCallbackRange
 		);
 	}
+
+	/**
+	 * @param {string} request request
+	 * @param {Range=} range range
+	 * @returns {AMDRequireItemDependency} AMDRequireItemDependency
+	 */
 	newRequireItemDependency(request, range) {
 		return new AMDRequireItemDependency(request, range);
 	}
+
+	/**
+	 * @param {(string | LocalModuleDependency | AMDRequireItemDependency)[]} depsArray deps array
+	 * @param {Range} range range
+	 * @returns {AMDRequireArrayDependency} AMDRequireArrayDependency
+	 */
 	newRequireArrayDependency(depsArray, range) {
 		return new AMDRequireArrayDependency(depsArray, range);
 	}
diff --git a/lib/dependencies/AMDRequireDependency.js b/lib/dependencies/AMDRequireDependency.js
index fd514e25fe8..930348fc948 100644
--- a/lib/dependencies/AMDRequireDependency.js
+++ b/lib/dependencies/AMDRequireDependency.js
@@ -2,132 +2,186 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const makeSerializable = require("../util/makeSerializable");
 const NullDependency = require("./NullDependency");
 
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../AsyncDependenciesBlock")} AsyncDependenciesBlock */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
 class AMDRequireDependency extends NullDependency {
-	constructor(block) {
+	/**
+	 * @param {Range} outerRange outer range
+	 * @param {Range} arrayRange array range
+	 * @param {Range | null} functionRange function range
+	 * @param {Range | null} errorCallbackRange error callback range
+	 */
+	constructor(outerRange, arrayRange, functionRange, errorCallbackRange) {
 		super();
-		this.block = block;
+
+		this.outerRange = outerRange;
+		this.arrayRange = arrayRange;
+		this.functionRange = functionRange;
+		this.errorCallbackRange = errorCallbackRange;
+		this.functionBindThis = false;
+		this.errorCallbackBindThis = false;
+	}
+
+	get category() {
+		return "amd";
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+
+		write(this.outerRange);
+		write(this.arrayRange);
+		write(this.functionRange);
+		write(this.errorCallbackRange);
+		write(this.functionBindThis);
+		write(this.errorCallbackBindThis);
+
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+
+		this.outerRange = read();
+		this.arrayRange = read();
+		this.functionRange = read();
+		this.errorCallbackRange = read();
+		this.functionBindThis = read();
+		this.errorCallbackBindThis = read();
+
+		super.deserialize(context);
 	}
 }
 
-AMDRequireDependency.Template = class AMDRequireDependencyTemplate {
-	apply(dep, source, runtime) {
-		const depBlock = dep.block;
-		const promise = runtime.blockPromise({
+makeSerializable(
+	AMDRequireDependency,
+	"webpack/lib/dependencies/AMDRequireDependency"
+);
+
+AMDRequireDependency.Template = class AMDRequireDependencyTemplate extends (
+	NullDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(
+		dependency,
+		source,
+		{ runtimeTemplate, moduleGraph, chunkGraph, runtimeRequirements }
+	) {
+		const dep = /** @type {AMDRequireDependency} */ (dependency);
+		const depBlock = /** @type {AsyncDependenciesBlock} */ (
+			moduleGraph.getParentBlock(dep)
+		);
+		const promise = runtimeTemplate.blockPromise({
+			chunkGraph,
 			block: depBlock,
-			message: "AMD require"
+			message: "AMD require",
+			runtimeRequirements
 		});
 
 		// has array range but no function range
-		if (depBlock.arrayRange && !depBlock.functionRange) {
+		if (dep.arrayRange && !dep.functionRange) {
 			const startBlock = `${promise}.then(function() {`;
-			const endBlock = `;}).catch(${runtime.onError()})`;
-			source.replace(
-				depBlock.outerRange[0],
-				depBlock.arrayRange[0] - 1,
-				startBlock
-			);
-			source.replace(
-				depBlock.arrayRange[1],
-				depBlock.outerRange[1] - 1,
-				endBlock
-			);
+			const endBlock = `;})['catch'](${RuntimeGlobals.uncaughtErrorHandler})`;
+			runtimeRequirements.add(RuntimeGlobals.uncaughtErrorHandler);
+
+			source.replace(dep.outerRange[0], dep.arrayRange[0] - 1, startBlock);
+
+			source.replace(dep.arrayRange[1], dep.outerRange[1] - 1, endBlock);
+
 			return;
 		}
 
 		// has function range but no array range
-		if (depBlock.functionRange && !depBlock.arrayRange) {
+		if (dep.functionRange && !dep.arrayRange) {
 			const startBlock = `${promise}.then((`;
-			const endBlock = `).bind(exports, __webpack_require__, exports, module)).catch(${runtime.onError()})`;
-			source.replace(
-				depBlock.outerRange[0],
-				depBlock.functionRange[0] - 1,
-				startBlock
-			);
-			source.replace(
-				depBlock.functionRange[1],
-				depBlock.outerRange[1] - 1,
-				endBlock
-			);
+			const endBlock = `).bind(exports, ${RuntimeGlobals.require}, exports, module))['catch'](${RuntimeGlobals.uncaughtErrorHandler})`;
+			runtimeRequirements.add(RuntimeGlobals.uncaughtErrorHandler);
+
+			source.replace(dep.outerRange[0], dep.functionRange[0] - 1, startBlock);
+
+			source.replace(dep.functionRange[1], dep.outerRange[1] - 1, endBlock);
+
 			return;
 		}
 
 		// has array range, function range, and errorCallbackRange
-		if (
-			depBlock.arrayRange &&
-			depBlock.functionRange &&
-			depBlock.errorCallbackRange
-		) {
+		if (dep.arrayRange && dep.functionRange && dep.errorCallbackRange) {
 			const startBlock = `${promise}.then(function() { `;
 			const errorRangeBlock = `}${
-				depBlock.functionBindThis ? ".bind(this)" : ""
-			}).catch(`;
-			const endBlock = `${
-				depBlock.errorCallbackBindThis ? ".bind(this)" : ""
-			})`;
+				dep.functionBindThis ? ".bind(this)" : ""
+			})['catch'](`;
+			const endBlock = `${dep.errorCallbackBindThis ? ".bind(this)" : ""})`;
+
+			source.replace(dep.outerRange[0], dep.arrayRange[0] - 1, startBlock);
+
+			source.insert(dep.arrayRange[0], "var __WEBPACK_AMD_REQUIRE_ARRAY__ = ");
+
+			source.replace(dep.arrayRange[1], dep.functionRange[0] - 1, "; (");
 
-			source.replace(
-				depBlock.outerRange[0],
-				depBlock.arrayRange[0] - 1,
-				startBlock
-			);
-			source.insert(
-				depBlock.arrayRange[0] + 0.9,
-				"var __WEBPACK_AMD_REQUIRE_ARRAY__ = "
-			);
-			source.replace(
-				depBlock.arrayRange[1],
-				depBlock.functionRange[0] - 1,
-				"; ("
-			);
 			source.insert(
-				depBlock.functionRange[1],
+				dep.functionRange[1],
 				").apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__);"
 			);
+
 			source.replace(
-				depBlock.functionRange[1],
-				depBlock.errorCallbackRange[0] - 1,
+				dep.functionRange[1],
+				dep.errorCallbackRange[0] - 1,
 				errorRangeBlock
 			);
+
 			source.replace(
-				depBlock.errorCallbackRange[1],
-				depBlock.outerRange[1] - 1,
+				dep.errorCallbackRange[1],
+				dep.outerRange[1] - 1,
 				endBlock
 			);
+
 			return;
 		}
 
 		// has array range, function range, but no errorCallbackRange
-		if (depBlock.arrayRange && depBlock.functionRange) {
+		if (dep.arrayRange && dep.functionRange) {
 			const startBlock = `${promise}.then(function() { `;
 			const endBlock = `}${
-				depBlock.functionBindThis ? ".bind(this)" : ""
-			}).catch(${runtime.onError()})`;
-			source.replace(
-				depBlock.outerRange[0],
-				depBlock.arrayRange[0] - 1,
-				startBlock
-			);
-			source.insert(
-				depBlock.arrayRange[0] + 0.9,
-				"var __WEBPACK_AMD_REQUIRE_ARRAY__ = "
-			);
-			source.replace(
-				depBlock.arrayRange[1],
-				depBlock.functionRange[0] - 1,
-				"; ("
-			);
+				dep.functionBindThis ? ".bind(this)" : ""
+			})['catch'](${RuntimeGlobals.uncaughtErrorHandler})`;
+			runtimeRequirements.add(RuntimeGlobals.uncaughtErrorHandler);
+
+			source.replace(dep.outerRange[0], dep.arrayRange[0] - 1, startBlock);
+
+			source.insert(dep.arrayRange[0], "var __WEBPACK_AMD_REQUIRE_ARRAY__ = ");
+
+			source.replace(dep.arrayRange[1], dep.functionRange[0] - 1, "; (");
+
 			source.insert(
-				depBlock.functionRange[1],
+				dep.functionRange[1],
 				").apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__);"
 			);
-			source.replace(
-				depBlock.functionRange[1],
-				depBlock.outerRange[1] - 1,
-				endBlock
-			);
+
+			source.replace(dep.functionRange[1], dep.outerRange[1] - 1, endBlock);
 		}
 	}
 };
diff --git a/lib/dependencies/AMDRequireItemDependency.js b/lib/dependencies/AMDRequireItemDependency.js
index d033a90d8ed..614633ad324 100644
--- a/lib/dependencies/AMDRequireItemDependency.js
+++ b/lib/dependencies/AMDRequireItemDependency.js
@@ -2,21 +2,40 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const makeSerializable = require("../util/makeSerializable");
 const ModuleDependency = require("./ModuleDependency");
 const ModuleDependencyTemplateAsRequireId = require("./ModuleDependencyTemplateAsRequireId");
 
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+
 class AMDRequireItemDependency extends ModuleDependency {
+	/**
+	 * @param {string} request the request string
+	 * @param {Range=} range location in source code
+	 */
 	constructor(request, range) {
 		super(request);
+
 		this.range = range;
 	}
 
 	get type() {
 		return "amd require";
 	}
+
+	get category() {
+		return "amd";
+	}
 }
 
+makeSerializable(
+	AMDRequireItemDependency,
+	"webpack/lib/dependencies/AMDRequireItemDependency"
+);
+
 AMDRequireItemDependency.Template = ModuleDependencyTemplateAsRequireId;
 
 module.exports = AMDRequireItemDependency;
diff --git a/lib/dependencies/AMDRuntimeModules.js b/lib/dependencies/AMDRuntimeModules.js
new file mode 100644
index 00000000000..9a685851f4a
--- /dev/null
+++ b/lib/dependencies/AMDRuntimeModules.js
@@ -0,0 +1,50 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+const Template = require("../Template");
+
+/** @typedef {import("./AMDPlugin").AmdOptions} AmdOptions */
+
+class AMDDefineRuntimeModule extends RuntimeModule {
+	constructor() {
+		super("amd define");
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		return Template.asString([
+			`${RuntimeGlobals.amdDefine} = function () {`,
+			Template.indent("throw new Error('define cannot be used indirect');"),
+			"};"
+		]);
+	}
+}
+
+class AMDOptionsRuntimeModule extends RuntimeModule {
+	/**
+	 * @param {AmdOptions} options the AMD options
+	 */
+	constructor(options) {
+		super("amd options");
+		this.options = options;
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		return Template.asString([
+			`${RuntimeGlobals.amdOptions} = ${JSON.stringify(this.options)};`
+		]);
+	}
+}
+
+module.exports.AMDDefineRuntimeModule = AMDDefineRuntimeModule;
+module.exports.AMDOptionsRuntimeModule = AMDOptionsRuntimeModule;
diff --git a/lib/dependencies/CachedConstDependency.js b/lib/dependencies/CachedConstDependency.js
new file mode 100644
index 00000000000..913904abc94
--- /dev/null
+++ b/lib/dependencies/CachedConstDependency.js
@@ -0,0 +1,128 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Florent Cailhol @ooflorent
+*/
+
+"use strict";
+
+const DependencyTemplate = require("../DependencyTemplate");
+const InitFragment = require("../InitFragment");
+const makeSerializable = require("../util/makeSerializable");
+const NullDependency = require("./NullDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../DependencyTemplates")} DependencyTemplates */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+
+class CachedConstDependency extends NullDependency {
+	/**
+	 * @param {string} expression expression
+	 * @param {Range} range range
+	 * @param {string} identifier identifier
+	 */
+	constructor(expression, range, identifier) {
+		super();
+
+		this.expression = expression;
+		this.range = range;
+		this.identifier = identifier;
+		this._hashUpdate = undefined;
+	}
+
+	/**
+	 * @returns {string} hash update
+	 */
+	_createHashUpdate() {
+		return `${this.identifier}${this.range}${this.expression}`;
+	}
+
+	/**
+	 * Update the hash
+	 * @param {Hash} hash hash to be updated
+	 * @param {UpdateHashContext} context context
+	 * @returns {void}
+	 */
+	updateHash(hash, context) {
+		if (this._hashUpdate === undefined) {
+			this._hashUpdate = this._createHashUpdate();
+		}
+		hash.update(this._hashUpdate);
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+
+		write(this.expression);
+		write(this.range);
+		write(this.identifier);
+
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+
+		this.expression = read();
+		this.range = read();
+		this.identifier = read();
+
+		super.deserialize(context);
+	}
+}
+
+makeSerializable(
+	CachedConstDependency,
+	"webpack/lib/dependencies/CachedConstDependency"
+);
+
+CachedConstDependency.Template = class CachedConstDependencyTemplate extends (
+	DependencyTemplate
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(
+		dependency,
+		source,
+		{ runtimeTemplate, dependencyTemplates, initFragments }
+	) {
+		const dep = /** @type {CachedConstDependency} */ (dependency);
+
+		initFragments.push(
+			new InitFragment(
+				`var ${dep.identifier} = ${dep.expression};\n`,
+				InitFragment.STAGE_CONSTANTS,
+				0,
+				`const ${dep.identifier}`
+			)
+		);
+
+		if (typeof dep.range === "number") {
+			source.insert(dep.range, dep.identifier);
+
+			return;
+		}
+
+		source.replace(dep.range[0], dep.range[1] - 1, dep.identifier);
+	}
+};
+
+module.exports = CachedConstDependency;
diff --git a/lib/dependencies/CommonJsDependencyHelpers.js b/lib/dependencies/CommonJsDependencyHelpers.js
new file mode 100644
index 00000000000..0cd457ee73a
--- /dev/null
+++ b/lib/dependencies/CommonJsDependencyHelpers.js
@@ -0,0 +1,63 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../Module").RuntimeRequirements} RuntimeRequirements */
+/** @typedef {"exports" | "module.exports" | "this" | "Object.defineProperty(exports)" | "Object.defineProperty(module.exports)" | "Object.defineProperty(this)"} CommonJSDependencyBaseKeywords */
+
+/**
+ * @param {CommonJSDependencyBaseKeywords} depBase commonjs dependency base
+ * @param {Module} module module
+ * @param {RuntimeRequirements} runtimeRequirements runtime requirements
+ * @returns {[string, string]} type and base
+ */
+module.exports.handleDependencyBase = (
+	depBase,
+	module,
+	runtimeRequirements
+) => {
+	let base;
+	let type;
+	switch (depBase) {
+		case "exports":
+			runtimeRequirements.add(RuntimeGlobals.exports);
+			base = module.exportsArgument;
+			type = "expression";
+			break;
+		case "module.exports":
+			runtimeRequirements.add(RuntimeGlobals.module);
+			base = `${module.moduleArgument}.exports`;
+			type = "expression";
+			break;
+		case "this":
+			runtimeRequirements.add(RuntimeGlobals.thisAsExports);
+			base = "this";
+			type = "expression";
+			break;
+		case "Object.defineProperty(exports)":
+			runtimeRequirements.add(RuntimeGlobals.exports);
+			base = module.exportsArgument;
+			type = "Object.defineProperty";
+			break;
+		case "Object.defineProperty(module.exports)":
+			runtimeRequirements.add(RuntimeGlobals.module);
+			base = `${module.moduleArgument}.exports`;
+			type = "Object.defineProperty";
+			break;
+		case "Object.defineProperty(this)":
+			runtimeRequirements.add(RuntimeGlobals.thisAsExports);
+			base = "this";
+			type = "Object.defineProperty";
+			break;
+		default:
+			throw new Error(`Unsupported base ${depBase}`);
+	}
+
+	return [type, base];
+};
diff --git a/lib/dependencies/CommonJsExportRequireDependency.js b/lib/dependencies/CommonJsExportRequireDependency.js
new file mode 100644
index 00000000000..cf00ffae801
--- /dev/null
+++ b/lib/dependencies/CommonJsExportRequireDependency.js
@@ -0,0 +1,403 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const Dependency = require("../Dependency");
+const { UsageState } = require("../ExportsInfo");
+const Template = require("../Template");
+const { equals } = require("../util/ArrayHelpers");
+const makeSerializable = require("../util/makeSerializable");
+const propertyAccess = require("../util/propertyAccess");
+const { handleDependencyBase } = require("./CommonJsDependencyHelpers");
+const ModuleDependency = require("./ModuleDependency");
+const processExportInfo = require("./processExportInfo");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency").ExportsSpec} ExportsSpec */
+/** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
+/** @typedef {import("../Dependency").TRANSITIVE} TRANSITIVE */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../ExportsInfo")} ExportsInfo */
+/** @typedef {import("../ExportsInfo").ExportInfo} ExportInfo */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+/** @typedef {import("./CommonJsDependencyHelpers").CommonJSDependencyBaseKeywords} CommonJSDependencyBaseKeywords */
+
+const idsSymbol = Symbol("CommonJsExportRequireDependency.ids");
+
+const EMPTY_OBJECT = {};
+
+class CommonJsExportRequireDependency extends ModuleDependency {
+	/**
+	 * @param {Range} range range
+	 * @param {Range | null} valueRange value range
+	 * @param {CommonJSDependencyBaseKeywords} base base
+	 * @param {string[]} names names
+	 * @param {string} request request
+	 * @param {string[]} ids ids
+	 * @param {boolean} resultUsed true, when the result is used
+	 */
+	constructor(range, valueRange, base, names, request, ids, resultUsed) {
+		super(request);
+		this.range = range;
+		this.valueRange = valueRange;
+		this.base = base;
+		this.names = names;
+		this.ids = ids;
+		this.resultUsed = resultUsed;
+		this.asiSafe = undefined;
+	}
+
+	get type() {
+		return "cjs export require";
+	}
+
+	/**
+	 * @returns {boolean | TRANSITIVE} true, when changes to the referenced module could affect the referencing module; TRANSITIVE, when changes to the referenced module could affect referencing modules of the referencing module
+	 */
+	couldAffectReferencingModule() {
+		return Dependency.TRANSITIVE;
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @returns {string[]} the imported id
+	 */
+	getIds(moduleGraph) {
+		return moduleGraph.getMeta(this)[idsSymbol] || this.ids;
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @param {string[]} ids the imported ids
+	 * @returns {void}
+	 */
+	setIds(moduleGraph, ids) {
+		moduleGraph.getMeta(this)[idsSymbol] = ids;
+	}
+
+	/**
+	 * Returns list of exports referenced by this dependency
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @param {RuntimeSpec} runtime the runtime for which the module is analysed
+	 * @returns {(string[] | ReferencedExport)[]} referenced exports
+	 */
+	getReferencedExports(moduleGraph, runtime) {
+		const ids = this.getIds(moduleGraph);
+		const getFullResult = () => {
+			if (ids.length === 0) {
+				return Dependency.EXPORTS_OBJECT_REFERENCED;
+			}
+			return [
+				{
+					name: ids,
+					canMangle: false
+				}
+			];
+		};
+		if (this.resultUsed) return getFullResult();
+		/** @type {ExportsInfo | undefined} */
+		let exportsInfo = moduleGraph.getExportsInfo(
+			/** @type {Module} */ (moduleGraph.getParentModule(this))
+		);
+		for (const name of this.names) {
+			const exportInfo = /** @type {ExportInfo} */ (
+				exportsInfo.getReadOnlyExportInfo(name)
+			);
+			const used = exportInfo.getUsed(runtime);
+			if (used === UsageState.Unused) return Dependency.NO_EXPORTS_REFERENCED;
+			if (used !== UsageState.OnlyPropertiesUsed) return getFullResult();
+			exportsInfo = exportInfo.exportsInfo;
+			if (!exportsInfo) return getFullResult();
+		}
+		if (exportsInfo.otherExportsInfo.getUsed(runtime) !== UsageState.Unused) {
+			return getFullResult();
+		}
+		/** @type {string[][]} */
+		const referencedExports = [];
+		for (const exportInfo of exportsInfo.orderedExports) {
+			processExportInfo(
+				runtime,
+				referencedExports,
+				ids.concat(exportInfo.name),
+				exportInfo,
+				false
+			);
+		}
+		return referencedExports.map(name => ({
+			name,
+			canMangle: false
+		}));
+	}
+
+	/**
+	 * Returns the exported names
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {ExportsSpec | undefined} export names
+	 */
+	getExports(moduleGraph) {
+		if (this.names.length === 1) {
+			const ids = this.getIds(moduleGraph);
+			const name = this.names[0];
+			const from = moduleGraph.getConnection(this);
+			if (!from) return;
+			return {
+				exports: [
+					{
+						name,
+						from,
+						export: ids.length === 0 ? null : ids,
+						// we can't mangle names that are in an empty object
+						// because one could access the prototype property
+						// when export isn't set yet
+						canMangle: !(name in EMPTY_OBJECT) && false
+					}
+				],
+				dependencies: [from.module]
+			};
+		} else if (this.names.length > 0) {
+			const name = this.names[0];
+			return {
+				exports: [
+					{
+						name,
+						// we can't mangle names that are in an empty object
+						// because one could access the prototype property
+						// when export isn't set yet
+						canMangle: !(name in EMPTY_OBJECT) && false
+					}
+				],
+				dependencies: undefined
+			};
+		}
+		const from = moduleGraph.getConnection(this);
+		if (!from) return;
+		const reexportInfo = this.getStarReexports(
+			moduleGraph,
+			undefined,
+			from.module
+		);
+		const ids = this.getIds(moduleGraph);
+		if (reexportInfo) {
+			return {
+				exports: Array.from(
+					/** @type {Set} */
+					(reexportInfo.exports),
+					name => ({
+						name,
+						from,
+						export: ids.concat(name),
+						canMangle: !(name in EMPTY_OBJECT) && false
+					})
+				),
+				// TODO handle deep reexports
+				dependencies: [from.module]
+			};
+		}
+		return {
+			exports: true,
+			from: ids.length === 0 ? from : undefined,
+			canMangle: false,
+			dependencies: [from.module]
+		};
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @param {Module} importedModule the imported module (optional)
+	 * @returns {{exports?: Set, checked?: Set} | undefined} information
+	 */
+	getStarReexports(
+		moduleGraph,
+		runtime,
+		importedModule = /** @type {Module} */ (moduleGraph.getModule(this))
+	) {
+		/** @type {ExportsInfo | undefined} */
+		let importedExportsInfo = moduleGraph.getExportsInfo(importedModule);
+		const ids = this.getIds(moduleGraph);
+		if (ids.length > 0)
+			importedExportsInfo = importedExportsInfo.getNestedExportsInfo(ids);
+		/** @type {ExportsInfo | undefined} */
+		let exportsInfo = moduleGraph.getExportsInfo(
+			/** @type {Module} */ (moduleGraph.getParentModule(this))
+		);
+		if (this.names.length > 0)
+			exportsInfo = exportsInfo.getNestedExportsInfo(this.names);
+
+		const noExtraExports =
+			importedExportsInfo &&
+			importedExportsInfo.otherExportsInfo.provided === false;
+		const noExtraImports =
+			exportsInfo &&
+			exportsInfo.otherExportsInfo.getUsed(runtime) === UsageState.Unused;
+
+		if (!noExtraExports && !noExtraImports) {
+			return;
+		}
+
+		const isNamespaceImport =
+			importedModule.getExportsType(moduleGraph, false) === "namespace";
+
+		/** @type {Set} */
+		const exports = new Set();
+		/** @type {Set} */
+		const checked = new Set();
+
+		if (noExtraImports) {
+			for (const exportInfo of /** @type {ExportsInfo} */ (exportsInfo)
+				.orderedExports) {
+				const name = exportInfo.name;
+				if (exportInfo.getUsed(runtime) === UsageState.Unused) continue;
+				if (name === "__esModule" && isNamespaceImport) {
+					exports.add(name);
+				} else if (importedExportsInfo) {
+					const importedExportInfo =
+						importedExportsInfo.getReadOnlyExportInfo(name);
+					if (importedExportInfo.provided === false) continue;
+					exports.add(name);
+					if (importedExportInfo.provided === true) continue;
+					checked.add(name);
+				} else {
+					exports.add(name);
+					checked.add(name);
+				}
+			}
+		} else if (noExtraExports) {
+			for (const importedExportInfo of /** @type {ExportsInfo} */ (
+				importedExportsInfo
+			).orderedExports) {
+				const name = importedExportInfo.name;
+				if (importedExportInfo.provided === false) continue;
+				if (exportsInfo) {
+					const exportInfo = exportsInfo.getReadOnlyExportInfo(name);
+					if (exportInfo.getUsed(runtime) === UsageState.Unused) continue;
+				}
+				exports.add(name);
+				if (importedExportInfo.provided === true) continue;
+				checked.add(name);
+			}
+			if (isNamespaceImport) {
+				exports.add("__esModule");
+				checked.delete("__esModule");
+			}
+		}
+
+		return { exports, checked };
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.asiSafe);
+		write(this.range);
+		write(this.valueRange);
+		write(this.base);
+		write(this.names);
+		write(this.ids);
+		write(this.resultUsed);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.asiSafe = read();
+		this.range = read();
+		this.valueRange = read();
+		this.base = read();
+		this.names = read();
+		this.ids = read();
+		this.resultUsed = read();
+		super.deserialize(context);
+	}
+}
+
+makeSerializable(
+	CommonJsExportRequireDependency,
+	"webpack/lib/dependencies/CommonJsExportRequireDependency"
+);
+
+CommonJsExportRequireDependency.Template = class CommonJsExportRequireDependencyTemplate extends (
+	ModuleDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(
+		dependency,
+		source,
+		{
+			module,
+			runtimeTemplate,
+			chunkGraph,
+			moduleGraph,
+			runtimeRequirements,
+			runtime
+		}
+	) {
+		const dep = /** @type {CommonJsExportRequireDependency} */ (dependency);
+		const used = moduleGraph
+			.getExportsInfo(module)
+			.getUsedName(dep.names, runtime);
+
+		const [type, base] = handleDependencyBase(
+			dep.base,
+			module,
+			runtimeRequirements
+		);
+
+		const importedModule = moduleGraph.getModule(dep);
+		let requireExpr = runtimeTemplate.moduleExports({
+			module: importedModule,
+			chunkGraph,
+			request: dep.request,
+			weak: dep.weak,
+			runtimeRequirements
+		});
+		if (importedModule) {
+			const ids = dep.getIds(moduleGraph);
+			const usedImported = moduleGraph
+				.getExportsInfo(importedModule)
+				.getUsedName(ids, runtime);
+			if (usedImported) {
+				const comment = equals(usedImported, ids)
+					? ""
+					: `${Template.toNormalComment(propertyAccess(ids))} `;
+				requireExpr += `${comment}${propertyAccess(usedImported)}`;
+			}
+		}
+
+		switch (type) {
+			case "expression":
+				source.replace(
+					dep.range[0],
+					dep.range[1] - 1,
+					used
+						? `${base}${propertyAccess(used)} = ${requireExpr}`
+						: `/* unused reexport */ ${requireExpr}`
+				);
+				return;
+			case "Object.defineProperty":
+				throw new Error("TODO");
+			default:
+				throw new Error("Unexpected type");
+		}
+	}
+};
+
+module.exports = CommonJsExportRequireDependency;
diff --git a/lib/dependencies/CommonJsExportsDependency.js b/lib/dependencies/CommonJsExportsDependency.js
new file mode 100644
index 00000000000..93c831b5dfd
--- /dev/null
+++ b/lib/dependencies/CommonJsExportsDependency.js
@@ -0,0 +1,183 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const InitFragment = require("../InitFragment");
+const makeSerializable = require("../util/makeSerializable");
+const propertyAccess = require("../util/propertyAccess");
+const { handleDependencyBase } = require("./CommonJsDependencyHelpers");
+const NullDependency = require("./NullDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").ExportsSpec} ExportsSpec */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("./CommonJsDependencyHelpers").CommonJSDependencyBaseKeywords} CommonJSDependencyBaseKeywords */
+
+const EMPTY_OBJECT = {};
+
+class CommonJsExportsDependency extends NullDependency {
+	/**
+	 * @param {Range} range range
+	 * @param {Range | null} valueRange value range
+	 * @param {CommonJSDependencyBaseKeywords} base base
+	 * @param {string[]} names names
+	 */
+	constructor(range, valueRange, base, names) {
+		super();
+		this.range = range;
+		this.valueRange = valueRange;
+		this.base = base;
+		this.names = names;
+	}
+
+	get type() {
+		return "cjs exports";
+	}
+
+	/**
+	 * Returns the exported names
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {ExportsSpec | undefined} export names
+	 */
+	getExports(moduleGraph) {
+		const name = this.names[0];
+		return {
+			exports: [
+				{
+					name,
+					// we can't mangle names that are in an empty object
+					// because one could access the prototype property
+					// when export isn't set yet
+					canMangle: !(name in EMPTY_OBJECT)
+				}
+			],
+			dependencies: undefined
+		};
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.range);
+		write(this.valueRange);
+		write(this.base);
+		write(this.names);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.range = read();
+		this.valueRange = read();
+		this.base = read();
+		this.names = read();
+		super.deserialize(context);
+	}
+}
+
+makeSerializable(
+	CommonJsExportsDependency,
+	"webpack/lib/dependencies/CommonJsExportsDependency"
+);
+
+CommonJsExportsDependency.Template = class CommonJsExportsDependencyTemplate extends (
+	NullDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(
+		dependency,
+		source,
+		{ module, moduleGraph, initFragments, runtimeRequirements, runtime }
+	) {
+		const dep = /** @type {CommonJsExportsDependency} */ (dependency);
+		const used = moduleGraph
+			.getExportsInfo(module)
+			.getUsedName(dep.names, runtime);
+
+		const [type, base] = handleDependencyBase(
+			dep.base,
+			module,
+			runtimeRequirements
+		);
+
+		switch (type) {
+			case "expression":
+				if (!used) {
+					initFragments.push(
+						new InitFragment(
+							"var __webpack_unused_export__;\n",
+							InitFragment.STAGE_CONSTANTS,
+							0,
+							"__webpack_unused_export__"
+						)
+					);
+					source.replace(
+						dep.range[0],
+						dep.range[1] - 1,
+						"__webpack_unused_export__"
+					);
+					return;
+				}
+				source.replace(
+					dep.range[0],
+					dep.range[1] - 1,
+					`${base}${propertyAccess(used)}`
+				);
+				return;
+			case "Object.defineProperty":
+				if (!used) {
+					initFragments.push(
+						new InitFragment(
+							"var __webpack_unused_export__;\n",
+							InitFragment.STAGE_CONSTANTS,
+							0,
+							"__webpack_unused_export__"
+						)
+					);
+					source.replace(
+						dep.range[0],
+						/** @type {Range} */ (dep.valueRange)[0] - 1,
+						"__webpack_unused_export__ = ("
+					);
+					source.replace(
+						/** @type {Range} */ (dep.valueRange)[1],
+						dep.range[1] - 1,
+						")"
+					);
+					return;
+				}
+				source.replace(
+					dep.range[0],
+					/** @type {Range} */ (dep.valueRange)[0] - 1,
+					`Object.defineProperty(${base}${propertyAccess(
+						used.slice(0, -1)
+					)}, ${JSON.stringify(used[used.length - 1])}, (`
+				);
+				source.replace(
+					/** @type {Range} */ (dep.valueRange)[1],
+					dep.range[1] - 1,
+					"))"
+				);
+		}
+	}
+};
+
+module.exports = CommonJsExportsDependency;
diff --git a/lib/dependencies/CommonJsExportsParserPlugin.js b/lib/dependencies/CommonJsExportsParserPlugin.js
new file mode 100644
index 00000000000..60f506edea7
--- /dev/null
+++ b/lib/dependencies/CommonJsExportsParserPlugin.js
@@ -0,0 +1,411 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const formatLocation = require("../formatLocation");
+const { evaluateToString } = require("../javascript/JavascriptParserHelpers");
+const propertyAccess = require("../util/propertyAccess");
+const CommonJsExportRequireDependency = require("./CommonJsExportRequireDependency");
+const CommonJsExportsDependency = require("./CommonJsExportsDependency");
+const CommonJsSelfReferenceDependency = require("./CommonJsSelfReferenceDependency");
+const DynamicExports = require("./DynamicExports");
+const HarmonyExports = require("./HarmonyExports");
+const ModuleDecoratorDependency = require("./ModuleDecoratorDependency");
+
+/** @typedef {import("estree").AssignmentExpression} AssignmentExpression */
+/** @typedef {import("estree").CallExpression} CallExpression */
+/** @typedef {import("estree").Expression} Expression */
+/** @typedef {import("estree").Super} Super */
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../NormalModule")} NormalModule */
+/** @typedef {import("../javascript/BasicEvaluatedExpression")} BasicEvaluatedExpression */
+/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../javascript/JavascriptParser").StatementPath} StatementPath */
+/** @typedef {import("./CommonJsDependencyHelpers").CommonJSDependencyBaseKeywords} CommonJSDependencyBaseKeywords */
+
+/**
+ * This function takes a generic expression and detects whether it is an ObjectExpression.
+ * This is used in the context of parsing CommonJS exports to get the value of the property descriptor
+ * when the `exports` object is assigned to `Object.defineProperty`.
+ *
+ * In CommonJS modules, the `exports` object can be assigned to `Object.defineProperty` and therefore
+ * webpack has to detect this case and get the value key of the property descriptor. See the following example
+ * for more information: https://astexplorer.net/#/gist/83ce51a4e96e59d777df315a6d111da6/8058ead48a1bb53c097738225db0967ef7f70e57
+ *
+ * This would be an example of a CommonJS module that exports an object with a property descriptor:
+ * ```js
+ * Object.defineProperty(exports, "__esModule", { value: true });
+ * exports.foo = void 0;
+ * exports.foo = "bar";
+ * ```
+ * @param {Expression} expr expression
+ * @returns {Expression | undefined} returns the value of property descriptor
+ */
+const getValueOfPropertyDescription = expr => {
+	if (expr.type !== "ObjectExpression") return;
+	for (const property of expr.properties) {
+		if (property.type === "SpreadElement" || property.computed) continue;
+		const key = property.key;
+		if (key.type !== "Identifier" || key.name !== "value") continue;
+		return /** @type {Expression} */ (property.value);
+	}
+};
+
+/**
+ * The purpose of this function is to check whether an expression is a truthy literal or not. This is
+ * useful when parsing CommonJS exports, because CommonJS modules can export any value, including falsy
+ * values like `null` and `false`. However, exports should only be created if the exported value is truthy.
+ * @param {Expression} expr expression being checked
+ * @returns {boolean} true, when the expression is a truthy literal
+ */
+const isTruthyLiteral = expr => {
+	switch (expr.type) {
+		case "Literal":
+			return Boolean(expr.value);
+		case "UnaryExpression":
+			if (expr.operator === "!") return isFalsyLiteral(expr.argument);
+	}
+	return false;
+};
+
+/**
+ * The purpose of this function is to check whether an expression is a falsy literal or not. This is
+ * useful when parsing CommonJS exports, because CommonJS modules can export any value, including falsy
+ * values like `null` and `false`. However, exports should only be created if the exported value is truthy.
+ * @param {Expression} expr expression being checked
+ * @returns {boolean} true, when the expression is a falsy literal
+ */
+const isFalsyLiteral = expr => {
+	switch (expr.type) {
+		case "Literal":
+			return !expr.value;
+		case "UnaryExpression":
+			if (expr.operator === "!") return isTruthyLiteral(expr.argument);
+	}
+	return false;
+};
+
+/**
+ * @param {JavascriptParser} parser the parser
+ * @param {Expression} expr expression
+ * @returns {{ argument: BasicEvaluatedExpression, ids: string[] } | undefined} parsed call
+ */
+const parseRequireCall = (parser, expr) => {
+	const ids = [];
+	while (expr.type === "MemberExpression") {
+		if (expr.object.type === "Super") return;
+		if (!expr.property) return;
+		const prop = expr.property;
+		if (expr.computed) {
+			if (prop.type !== "Literal") return;
+			ids.push(`${prop.value}`);
+		} else {
+			if (prop.type !== "Identifier") return;
+			ids.push(prop.name);
+		}
+		expr = expr.object;
+	}
+	if (expr.type !== "CallExpression" || expr.arguments.length !== 1) return;
+	const callee = expr.callee;
+	if (
+		callee.type !== "Identifier" ||
+		parser.getVariableInfo(callee.name) !== "require"
+	) {
+		return;
+	}
+	const arg = expr.arguments[0];
+	if (arg.type === "SpreadElement") return;
+	const argValue = parser.evaluateExpression(arg);
+	return { argument: argValue, ids: ids.reverse() };
+};
+
+class CommonJsExportsParserPlugin {
+	/**
+	 * @param {ModuleGraph} moduleGraph module graph
+	 */
+	constructor(moduleGraph) {
+		this.moduleGraph = moduleGraph;
+	}
+
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @returns {void}
+	 */
+	apply(parser) {
+		const enableStructuredExports = () => {
+			DynamicExports.enable(parser.state);
+		};
+
+		/**
+		 * @param {boolean} topLevel true, when the export is on top level
+		 * @param {string[]} members members of the export
+		 * @param {Expression | undefined} valueExpr expression for the value
+		 * @returns {void}
+		 */
+		const checkNamespace = (topLevel, members, valueExpr) => {
+			if (!DynamicExports.isEnabled(parser.state)) return;
+			if (members.length > 0 && members[0] === "__esModule") {
+				if (valueExpr && isTruthyLiteral(valueExpr) && topLevel) {
+					DynamicExports.setFlagged(parser.state);
+				} else {
+					DynamicExports.setDynamic(parser.state);
+				}
+			}
+		};
+		/**
+		 * @param {string=} reason reason
+		 */
+		const bailout = reason => {
+			DynamicExports.bailout(parser.state);
+			if (reason) bailoutHint(reason);
+		};
+		/**
+		 * @param {string} reason reason
+		 */
+		const bailoutHint = reason => {
+			this.moduleGraph
+				.getOptimizationBailout(parser.state.module)
+				.push(`CommonJS bailout: ${reason}`);
+		};
+
+		// metadata //
+		parser.hooks.evaluateTypeof
+			.for("module")
+			.tap("CommonJsExportsParserPlugin", evaluateToString("object"));
+		parser.hooks.evaluateTypeof
+			.for("exports")
+			.tap("CommonJsPlugin", evaluateToString("object"));
+
+		// exporting //
+
+		/**
+		 * @param {AssignmentExpression} expr expression
+		 * @param {CommonJSDependencyBaseKeywords} base commonjs base keywords
+		 * @param {string[]} members members of the export
+		 * @returns {boolean | undefined} true, when the expression was handled
+		 */
+		const handleAssignExport = (expr, base, members) => {
+			if (HarmonyExports.isEnabled(parser.state)) return;
+			// Handle reexporting
+			const requireCall = parseRequireCall(parser, expr.right);
+			if (
+				requireCall &&
+				requireCall.argument.isString() &&
+				(members.length === 0 || members[0] !== "__esModule")
+			) {
+				enableStructuredExports();
+				// It's possible to reexport __esModule, so we must convert to a dynamic module
+				if (members.length === 0) DynamicExports.setDynamic(parser.state);
+				const dep = new CommonJsExportRequireDependency(
+					/** @type {Range} */ (expr.range),
+					null,
+					base,
+					members,
+					/** @type {string} */ (requireCall.argument.string),
+					requireCall.ids,
+					!parser.isStatementLevelExpression(expr)
+				);
+				dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+				dep.optional = Boolean(parser.scope.inTry);
+				parser.state.module.addDependency(dep);
+				return true;
+			}
+			if (members.length === 0) return;
+			enableStructuredExports();
+			const remainingMembers = members;
+			checkNamespace(
+				/** @type {StatementPath} */
+				(parser.statementPath).length === 1 &&
+					parser.isStatementLevelExpression(expr),
+				remainingMembers,
+				expr.right
+			);
+			const dep = new CommonJsExportsDependency(
+				/** @type {Range} */ (expr.left.range),
+				null,
+				base,
+				remainingMembers
+			);
+			dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+			parser.state.module.addDependency(dep);
+			parser.walkExpression(expr.right);
+			return true;
+		};
+		parser.hooks.assignMemberChain
+			.for("exports")
+			.tap("CommonJsExportsParserPlugin", (expr, members) =>
+				handleAssignExport(expr, "exports", members)
+			);
+		parser.hooks.assignMemberChain
+			.for("this")
+			.tap("CommonJsExportsParserPlugin", (expr, members) => {
+				if (!parser.scope.topLevelScope) return;
+				return handleAssignExport(expr, "this", members);
+			});
+		parser.hooks.assignMemberChain
+			.for("module")
+			.tap("CommonJsExportsParserPlugin", (expr, members) => {
+				if (members[0] !== "exports") return;
+				return handleAssignExport(expr, "module.exports", members.slice(1));
+			});
+		parser.hooks.call
+			.for("Object.defineProperty")
+			.tap("CommonJsExportsParserPlugin", expression => {
+				const expr = /** @type {CallExpression} */ (expression);
+				if (!parser.isStatementLevelExpression(expr)) return;
+				if (expr.arguments.length !== 3) return;
+				if (expr.arguments[0].type === "SpreadElement") return;
+				if (expr.arguments[1].type === "SpreadElement") return;
+				if (expr.arguments[2].type === "SpreadElement") return;
+				const exportsArg = parser.evaluateExpression(expr.arguments[0]);
+				if (!exportsArg.isIdentifier()) return;
+				if (
+					exportsArg.identifier !== "exports" &&
+					exportsArg.identifier !== "module.exports" &&
+					(exportsArg.identifier !== "this" || !parser.scope.topLevelScope)
+				) {
+					return;
+				}
+				const propertyArg = parser.evaluateExpression(expr.arguments[1]);
+				const property = propertyArg.asString();
+				if (typeof property !== "string") return;
+				enableStructuredExports();
+				const descArg = expr.arguments[2];
+				checkNamespace(
+					/** @type {StatementPath} */
+					(parser.statementPath).length === 1,
+					[property],
+					getValueOfPropertyDescription(descArg)
+				);
+				const dep = new CommonJsExportsDependency(
+					/** @type {Range} */ (expr.range),
+					/** @type {Range} */ (expr.arguments[2].range),
+					`Object.defineProperty(${exportsArg.identifier})`,
+					[property]
+				);
+				dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+				parser.state.module.addDependency(dep);
+
+				parser.walkExpression(expr.arguments[2]);
+				return true;
+			});
+
+		// Self reference //
+
+		/**
+		 * @param {Expression | Super} expr expression
+		 * @param {CommonJSDependencyBaseKeywords} base commonjs base keywords
+		 * @param {string[]} members members of the export
+		 * @param {CallExpression=} call call expression
+		 * @returns {boolean | void} true, when the expression was handled
+		 */
+		const handleAccessExport = (expr, base, members, call) => {
+			if (HarmonyExports.isEnabled(parser.state)) return;
+			if (members.length === 0) {
+				bailout(
+					`${base} is used directly at ${formatLocation(
+						/** @type {DependencyLocation} */ (expr.loc)
+					)}`
+				);
+			}
+			if (call && members.length === 1) {
+				bailoutHint(
+					`${base}${propertyAccess(
+						members
+					)}(...) prevents optimization as ${base} is passed as call context at ${formatLocation(
+						/** @type {DependencyLocation} */ (expr.loc)
+					)}`
+				);
+			}
+			const dep = new CommonJsSelfReferenceDependency(
+				/** @type {Range} */ (expr.range),
+				base,
+				members,
+				Boolean(call)
+			);
+			dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+			parser.state.module.addDependency(dep);
+			if (call) {
+				parser.walkExpressions(call.arguments);
+			}
+			return true;
+		};
+		parser.hooks.callMemberChain
+			.for("exports")
+			.tap("CommonJsExportsParserPlugin", (expr, members) =>
+				handleAccessExport(expr.callee, "exports", members, expr)
+			);
+		parser.hooks.expressionMemberChain
+			.for("exports")
+			.tap("CommonJsExportsParserPlugin", (expr, members) =>
+				handleAccessExport(expr, "exports", members)
+			);
+		parser.hooks.expression
+			.for("exports")
+			.tap("CommonJsExportsParserPlugin", expr =>
+				handleAccessExport(expr, "exports", [])
+			);
+		parser.hooks.callMemberChain
+			.for("module")
+			.tap("CommonJsExportsParserPlugin", (expr, members) => {
+				if (members[0] !== "exports") return;
+				return handleAccessExport(
+					expr.callee,
+					"module.exports",
+					members.slice(1),
+					expr
+				);
+			});
+		parser.hooks.expressionMemberChain
+			.for("module")
+			.tap("CommonJsExportsParserPlugin", (expr, members) => {
+				if (members[0] !== "exports") return;
+				return handleAccessExport(expr, "module.exports", members.slice(1));
+			});
+		parser.hooks.expression
+			.for("module.exports")
+			.tap("CommonJsExportsParserPlugin", expr =>
+				handleAccessExport(expr, "module.exports", [])
+			);
+		parser.hooks.callMemberChain
+			.for("this")
+			.tap("CommonJsExportsParserPlugin", (expr, members) => {
+				if (!parser.scope.topLevelScope) return;
+				return handleAccessExport(expr.callee, "this", members, expr);
+			});
+		parser.hooks.expressionMemberChain
+			.for("this")
+			.tap("CommonJsExportsParserPlugin", (expr, members) => {
+				if (!parser.scope.topLevelScope) return;
+				return handleAccessExport(expr, "this", members);
+			});
+		parser.hooks.expression
+			.for("this")
+			.tap("CommonJsExportsParserPlugin", expr => {
+				if (!parser.scope.topLevelScope) return;
+				return handleAccessExport(expr, "this", []);
+			});
+
+		// Bailouts //
+		parser.hooks.expression.for("module").tap("CommonJsPlugin", expr => {
+			bailout();
+			const isHarmony = HarmonyExports.isEnabled(parser.state);
+			const dep = new ModuleDecoratorDependency(
+				isHarmony
+					? RuntimeGlobals.harmonyModuleDecorator
+					: RuntimeGlobals.nodeModuleDecorator,
+				!isHarmony
+			);
+			dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+			parser.state.module.addDependency(dep);
+			return true;
+		});
+	}
+}
+module.exports = CommonJsExportsParserPlugin;
diff --git a/lib/dependencies/CommonJsFullRequireDependency.js b/lib/dependencies/CommonJsFullRequireDependency.js
new file mode 100644
index 00000000000..1164eee150e
--- /dev/null
+++ b/lib/dependencies/CommonJsFullRequireDependency.js
@@ -0,0 +1,166 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const Template = require("../Template");
+const { equals } = require("../util/ArrayHelpers");
+const { getTrimmedIdsAndRange } = require("../util/chainedImports");
+const makeSerializable = require("../util/makeSerializable");
+const propertyAccess = require("../util/propertyAccess");
+const ModuleDependency = require("./ModuleDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+
+class CommonJsFullRequireDependency extends ModuleDependency {
+	/**
+	 * @param {string} request the request string
+	 * @param {Range} range location in source code
+	 * @param {string[]} names accessed properties on module
+	 * @param {Range[]=} idRanges ranges for members of ids; the two arrays are right-aligned
+	 */
+	constructor(
+		request,
+		range,
+		names,
+		idRanges /* TODO webpack 6 make this non-optional. It must always be set to properly trim ids. */
+	) {
+		super(request);
+		this.range = range;
+		this.names = names;
+		this.idRanges = idRanges;
+		this.call = false;
+		this.asiSafe = undefined;
+	}
+
+	/**
+	 * Returns list of exports referenced by this dependency
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @param {RuntimeSpec} runtime the runtime for which the module is analysed
+	 * @returns {(string[] | ReferencedExport)[]} referenced exports
+	 */
+	getReferencedExports(moduleGraph, runtime) {
+		if (this.call) {
+			const importedModule = moduleGraph.getModule(this);
+			if (
+				!importedModule ||
+				importedModule.getExportsType(moduleGraph, false) !== "namespace"
+			) {
+				return [this.names.slice(0, -1)];
+			}
+		}
+		return [this.names];
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.names);
+		write(this.idRanges);
+		write(this.call);
+		write(this.asiSafe);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.names = read();
+		this.idRanges = read();
+		this.call = read();
+		this.asiSafe = read();
+		super.deserialize(context);
+	}
+
+	get type() {
+		return "cjs full require";
+	}
+
+	get category() {
+		return "commonjs";
+	}
+}
+
+CommonJsFullRequireDependency.Template = class CommonJsFullRequireDependencyTemplate extends (
+	ModuleDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(
+		dependency,
+		source,
+		{
+			module,
+			runtimeTemplate,
+			moduleGraph,
+			chunkGraph,
+			runtimeRequirements,
+			runtime,
+			initFragments
+		}
+	) {
+		const dep = /** @type {CommonJsFullRequireDependency} */ (dependency);
+		if (!dep.range) return;
+		const importedModule = moduleGraph.getModule(dep);
+		let requireExpr = runtimeTemplate.moduleExports({
+			module: importedModule,
+			chunkGraph,
+			request: dep.request,
+			weak: dep.weak,
+			runtimeRequirements
+		});
+
+		const {
+			trimmedRange: [trimmedRangeStart, trimmedRangeEnd],
+			trimmedIds
+		} = getTrimmedIdsAndRange(
+			dep.names,
+			dep.range,
+			dep.idRanges,
+			moduleGraph,
+			dep
+		);
+
+		if (importedModule) {
+			const usedImported = moduleGraph
+				.getExportsInfo(importedModule)
+				.getUsedName(trimmedIds, runtime);
+			if (usedImported) {
+				const comment = equals(usedImported, trimmedIds)
+					? ""
+					: `${Template.toNormalComment(propertyAccess(trimmedIds))} `;
+				const access = `${comment}${propertyAccess(usedImported)}`;
+				requireExpr =
+					dep.asiSafe === true
+						? `(${requireExpr}${access})`
+						: `${requireExpr}${access}`;
+			}
+		}
+		source.replace(trimmedRangeStart, trimmedRangeEnd - 1, requireExpr);
+	}
+};
+
+makeSerializable(
+	CommonJsFullRequireDependency,
+	"webpack/lib/dependencies/CommonJsFullRequireDependency"
+);
+
+module.exports = CommonJsFullRequireDependency;
diff --git a/lib/dependencies/CommonJsImportsParserPlugin.js b/lib/dependencies/CommonJsImportsParserPlugin.js
new file mode 100644
index 00000000000..f5ff981e7a6
--- /dev/null
+++ b/lib/dependencies/CommonJsImportsParserPlugin.js
@@ -0,0 +1,814 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { fileURLToPath } = require("url");
+const CommentCompilationWarning = require("../CommentCompilationWarning");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const UnsupportedFeatureWarning = require("../UnsupportedFeatureWarning");
+const WebpackError = require("../WebpackError");
+const BasicEvaluatedExpression = require("../javascript/BasicEvaluatedExpression");
+const { VariableInfo } = require("../javascript/JavascriptParser");
+const {
+	evaluateToIdentifier,
+	evaluateToString,
+	expressionIsUnsupported,
+	toConstantDependency
+} = require("../javascript/JavascriptParserHelpers");
+const CommonJsFullRequireDependency = require("./CommonJsFullRequireDependency");
+const CommonJsRequireContextDependency = require("./CommonJsRequireContextDependency");
+const CommonJsRequireDependency = require("./CommonJsRequireDependency");
+const ConstDependency = require("./ConstDependency");
+const ContextDependencyHelpers = require("./ContextDependencyHelpers");
+const LocalModuleDependency = require("./LocalModuleDependency");
+const { getLocalModule } = require("./LocalModulesHelpers");
+const RequireHeaderDependency = require("./RequireHeaderDependency");
+const RequireResolveContextDependency = require("./RequireResolveContextDependency");
+const RequireResolveDependency = require("./RequireResolveDependency");
+const RequireResolveHeaderDependency = require("./RequireResolveHeaderDependency");
+
+/** @typedef {import("estree").CallExpression} CallExpression */
+/** @typedef {import("estree").Expression} Expression */
+/** @typedef {import("estree").NewExpression} NewExpression */
+/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("../javascript/JavascriptParser").ImportSource} ImportSource */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+
+const createRequireSpecifierTag = Symbol("createRequire");
+const createdRequireIdentifierTag = Symbol("createRequire()");
+
+class CommonJsImportsParserPlugin {
+	/**
+	 * @param {JavascriptParserOptions} options parser options
+	 */
+	constructor(options) {
+		this.options = options;
+	}
+
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @returns {void}
+	 */
+	apply(parser) {
+		const options = this.options;
+
+		const getContext = () => {
+			if (parser.currentTagData) {
+				const { context } = parser.currentTagData;
+				return context;
+			}
+		};
+
+		// #region metadata
+		/**
+		 * @param {string} expression expression
+		 * @param {() => string[]} getMembers get members
+		 */
+		const tapRequireExpression = (expression, getMembers) => {
+			parser.hooks.typeof
+				.for(expression)
+				.tap(
+					"CommonJsImportsParserPlugin",
+					toConstantDependency(parser, JSON.stringify("function"))
+				);
+			parser.hooks.evaluateTypeof
+				.for(expression)
+				.tap("CommonJsImportsParserPlugin", evaluateToString("function"));
+			parser.hooks.evaluateIdentifier
+				.for(expression)
+				.tap(
+					"CommonJsImportsParserPlugin",
+					evaluateToIdentifier(expression, "require", getMembers, true)
+				);
+		};
+		/**
+		 * @param {string | symbol} tag tag
+		 */
+		const tapRequireExpressionTag = tag => {
+			parser.hooks.typeof
+				.for(tag)
+				.tap(
+					"CommonJsImportsParserPlugin",
+					toConstantDependency(parser, JSON.stringify("function"))
+				);
+			parser.hooks.evaluateTypeof
+				.for(tag)
+				.tap("CommonJsImportsParserPlugin", evaluateToString("function"));
+		};
+		tapRequireExpression("require", () => []);
+		tapRequireExpression("require.resolve", () => ["resolve"]);
+		tapRequireExpression("require.resolveWeak", () => ["resolveWeak"]);
+		// #endregion
+
+		// Weird stuff //
+		parser.hooks.assign
+			.for("require")
+			.tap("CommonJsImportsParserPlugin", expr => {
+				// to not leak to global "require", we need to define a local require here.
+				const dep = new ConstDependency("var require;", 0);
+				dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+				parser.state.module.addPresentationalDependency(dep);
+				return true;
+			});
+
+		// #region Unsupported
+		parser.hooks.expression
+			.for("require.main")
+			.tap(
+				"CommonJsImportsParserPlugin",
+				expressionIsUnsupported(
+					parser,
+					"require.main is not supported by webpack."
+				)
+			);
+		parser.hooks.call
+			.for("require.main.require")
+			.tap(
+				"CommonJsImportsParserPlugin",
+				expressionIsUnsupported(
+					parser,
+					"require.main.require is not supported by webpack."
+				)
+			);
+		parser.hooks.expression
+			.for("module.parent.require")
+			.tap(
+				"CommonJsImportsParserPlugin",
+				expressionIsUnsupported(
+					parser,
+					"module.parent.require is not supported by webpack."
+				)
+			);
+		parser.hooks.call
+			.for("module.parent.require")
+			.tap(
+				"CommonJsImportsParserPlugin",
+				expressionIsUnsupported(
+					parser,
+					"module.parent.require is not supported by webpack."
+				)
+			);
+		// #endregion
+
+		// #region Renaming
+		/**
+		 * @param {Expression} expr expression
+		 * @returns {boolean} true when set undefined
+		 */
+		const defineUndefined = expr => {
+			// To avoid "not defined" error, replace the value with undefined
+			const dep = new ConstDependency(
+				"undefined",
+				/** @type {Range} */ (expr.range)
+			);
+			dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+			parser.state.module.addPresentationalDependency(dep);
+			return false;
+		};
+		parser.hooks.canRename
+			.for("require")
+			.tap("CommonJsImportsParserPlugin", () => true);
+		parser.hooks.rename
+			.for("require")
+			.tap("CommonJsImportsParserPlugin", defineUndefined);
+		// #endregion
+
+		// #region Inspection
+		const requireCache = toConstantDependency(
+			parser,
+			RuntimeGlobals.moduleCache,
+			[
+				RuntimeGlobals.moduleCache,
+				RuntimeGlobals.moduleId,
+				RuntimeGlobals.moduleLoaded
+			]
+		);
+
+		parser.hooks.expression
+			.for("require.cache")
+			.tap("CommonJsImportsParserPlugin", requireCache);
+		// #endregion
+
+		// #region Require as expression
+		/**
+		 * @param {Expression} expr expression
+		 * @returns {boolean} true when handled
+		 */
+		const requireAsExpressionHandler = expr => {
+			const dep = new CommonJsRequireContextDependency(
+				{
+					request: /** @type {string} */ (options.unknownContextRequest),
+					recursive: /** @type {boolean} */ (options.unknownContextRecursive),
+					regExp: /** @type {RegExp} */ (options.unknownContextRegExp),
+					mode: "sync"
+				},
+				/** @type {Range} */ (expr.range),
+				undefined,
+				parser.scope.inShorthand,
+				getContext()
+			);
+			dep.critical =
+				options.unknownContextCritical &&
+				"require function is used in a way in which dependencies cannot be statically extracted";
+			dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+			dep.optional = Boolean(parser.scope.inTry);
+			parser.state.current.addDependency(dep);
+			return true;
+		};
+		parser.hooks.expression
+			.for("require")
+			.tap("CommonJsImportsParserPlugin", requireAsExpressionHandler);
+		// #endregion
+
+		// #region Require
+		/**
+		 * @param {CallExpression | NewExpression} expr expression
+		 * @param {BasicEvaluatedExpression} param param
+		 * @returns {boolean | void} true when handled
+		 */
+		const processRequireItem = (expr, param) => {
+			if (param.isString()) {
+				const dep = new CommonJsRequireDependency(
+					/** @type {string} */ (param.string),
+					/** @type {Range} */ (param.range),
+					getContext()
+				);
+				dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+				dep.optional = Boolean(parser.scope.inTry);
+				parser.state.current.addDependency(dep);
+				return true;
+			}
+		};
+		/**
+		 * @param {CallExpression | NewExpression} expr expression
+		 * @param {BasicEvaluatedExpression} param param
+		 * @returns {boolean | void} true when handled
+		 */
+		const processRequireContext = (expr, param) => {
+			const dep = ContextDependencyHelpers.create(
+				CommonJsRequireContextDependency,
+				/** @type {Range} */ (expr.range),
+				param,
+				expr,
+				options,
+				{
+					category: "commonjs"
+				},
+				parser,
+				undefined,
+				getContext()
+			);
+			if (!dep) return;
+			dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+			dep.optional = Boolean(parser.scope.inTry);
+			parser.state.current.addDependency(dep);
+			return true;
+		};
+		/**
+		 * @param {boolean} callNew true, when require is called with new
+		 * @returns {(expr: CallExpression | NewExpression) => (boolean | void)} handler
+		 */
+		const createRequireHandler = callNew => expr => {
+			if (options.commonjsMagicComments) {
+				const { options: requireOptions, errors: commentErrors } =
+					parser.parseCommentOptions(/** @type {Range} */ (expr.range));
+
+				if (commentErrors) {
+					for (const e of commentErrors) {
+						const { comment } = e;
+						parser.state.module.addWarning(
+							new CommentCompilationWarning(
+								`Compilation error while processing magic comment(-s): /*${comment.value}*/: ${e.message}`,
+								/** @type {DependencyLocation} */ (comment.loc)
+							)
+						);
+					}
+				}
+				if (requireOptions && requireOptions.webpackIgnore !== undefined) {
+					if (typeof requireOptions.webpackIgnore !== "boolean") {
+						parser.state.module.addWarning(
+							new UnsupportedFeatureWarning(
+								`\`webpackIgnore\` expected a boolean, but received: ${requireOptions.webpackIgnore}.`,
+								/** @type {DependencyLocation} */ (expr.loc)
+							)
+						);
+					} else if (requireOptions.webpackIgnore) {
+						// Do not instrument `require()` if `webpackIgnore` is `true`
+						return true;
+					}
+				}
+			}
+
+			if (expr.arguments.length !== 1) return;
+			let localModule;
+			const param = parser.evaluateExpression(expr.arguments[0]);
+			if (param.isConditional()) {
+				let isExpression = false;
+				for (const p of /** @type {BasicEvaluatedExpression[]} */ (
+					param.options
+				)) {
+					const result = processRequireItem(expr, p);
+					if (result === undefined) {
+						isExpression = true;
+					}
+				}
+				if (!isExpression) {
+					const dep = new RequireHeaderDependency(
+						/** @type {Range} */ (expr.callee.range)
+					);
+					dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+					parser.state.module.addPresentationalDependency(dep);
+					return true;
+				}
+			}
+			if (
+				param.isString() &&
+				(localModule = getLocalModule(
+					parser.state,
+					/** @type {string} */ (param.string)
+				))
+			) {
+				localModule.flagUsed();
+				const dep = new LocalModuleDependency(
+					localModule,
+					/** @type {Range} */ (expr.range),
+					callNew
+				);
+				dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+				parser.state.module.addPresentationalDependency(dep);
+			} else {
+				const result = processRequireItem(expr, param);
+				if (result === undefined) {
+					processRequireContext(expr, param);
+				} else {
+					const dep = new RequireHeaderDependency(
+						/** @type {Range} */ (expr.callee.range)
+					);
+					dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+					parser.state.module.addPresentationalDependency(dep);
+				}
+			}
+			return true;
+		};
+		parser.hooks.call
+			.for("require")
+			.tap("CommonJsImportsParserPlugin", createRequireHandler(false));
+		parser.hooks.new
+			.for("require")
+			.tap("CommonJsImportsParserPlugin", createRequireHandler(true));
+		parser.hooks.call
+			.for("module.require")
+			.tap("CommonJsImportsParserPlugin", createRequireHandler(false));
+		parser.hooks.new
+			.for("module.require")
+			.tap("CommonJsImportsParserPlugin", createRequireHandler(true));
+		// #endregion
+
+		// #region Require with property access
+		/**
+		 * @param {Expression} expr expression
+		 * @param {string[]} calleeMembers callee members
+		 * @param {CallExpression} callExpr call expression
+		 * @param {string[]} members members
+		 * @param {Range[]} memberRanges member ranges
+		 * @returns {boolean | void} true when handled
+		 */
+		const chainHandler = (
+			expr,
+			calleeMembers,
+			callExpr,
+			members,
+			memberRanges
+		) => {
+			if (callExpr.arguments.length !== 1) return;
+			const param = parser.evaluateExpression(callExpr.arguments[0]);
+			if (
+				param.isString() &&
+				!getLocalModule(parser.state, /** @type {string} */ (param.string))
+			) {
+				const dep = new CommonJsFullRequireDependency(
+					/** @type {string} */ (param.string),
+					/** @type {Range} */ (expr.range),
+					members,
+					/** @type {Range[]} */ memberRanges
+				);
+				dep.asiSafe = !parser.isAsiPosition(
+					/** @type {Range} */ (expr.range)[0]
+				);
+				dep.optional = Boolean(parser.scope.inTry);
+				dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+				parser.state.current.addDependency(dep);
+				return true;
+			}
+		};
+		/**
+		 * @param {CallExpression} expr expression
+		 * @param {string[]} calleeMembers callee members
+		 * @param {CallExpression} callExpr call expression
+		 * @param {string[]} members members
+		 * @param {Range[]} memberRanges member ranges
+		 * @returns {boolean | void} true when handled
+		 */
+		const callChainHandler = (
+			expr,
+			calleeMembers,
+			callExpr,
+			members,
+			memberRanges
+		) => {
+			if (callExpr.arguments.length !== 1) return;
+			const param = parser.evaluateExpression(callExpr.arguments[0]);
+			if (
+				param.isString() &&
+				!getLocalModule(parser.state, /** @type {string} */ (param.string))
+			) {
+				const dep = new CommonJsFullRequireDependency(
+					/** @type {string} */ (param.string),
+					/** @type {Range} */ (expr.callee.range),
+					members,
+					/** @type {Range[]} */ memberRanges
+				);
+				dep.call = true;
+				dep.asiSafe = !parser.isAsiPosition(
+					/** @type {Range} */ (expr.range)[0]
+				);
+				dep.optional = Boolean(parser.scope.inTry);
+				dep.loc = /** @type {DependencyLocation} */ (expr.callee.loc);
+				parser.state.current.addDependency(dep);
+				parser.walkExpressions(expr.arguments);
+				return true;
+			}
+		};
+		parser.hooks.memberChainOfCallMemberChain
+			.for("require")
+			.tap("CommonJsImportsParserPlugin", chainHandler);
+		parser.hooks.memberChainOfCallMemberChain
+			.for("module.require")
+			.tap("CommonJsImportsParserPlugin", chainHandler);
+		parser.hooks.callMemberChainOfCallMemberChain
+			.for("require")
+			.tap("CommonJsImportsParserPlugin", callChainHandler);
+		parser.hooks.callMemberChainOfCallMemberChain
+			.for("module.require")
+			.tap("CommonJsImportsParserPlugin", callChainHandler);
+		// #endregion
+
+		// #region Require.resolve
+		/**
+		 * @param {CallExpression} expr call expression
+		 * @param {boolean} weak weak
+		 * @returns {boolean | void} true when handled
+		 */
+		const processResolve = (expr, weak) => {
+			if (!weak && options.commonjsMagicComments) {
+				const { options: requireOptions, errors: commentErrors } =
+					parser.parseCommentOptions(/** @type {Range} */ (expr.range));
+
+				if (commentErrors) {
+					for (const e of commentErrors) {
+						const { comment } = e;
+						parser.state.module.addWarning(
+							new CommentCompilationWarning(
+								`Compilation error while processing magic comment(-s): /*${comment.value}*/: ${e.message}`,
+								/** @type {DependencyLocation} */ (comment.loc)
+							)
+						);
+					}
+				}
+				if (requireOptions && requireOptions.webpackIgnore !== undefined) {
+					if (typeof requireOptions.webpackIgnore !== "boolean") {
+						parser.state.module.addWarning(
+							new UnsupportedFeatureWarning(
+								`\`webpackIgnore\` expected a boolean, but received: ${requireOptions.webpackIgnore}.`,
+								/** @type {DependencyLocation} */ (expr.loc)
+							)
+						);
+					} else if (requireOptions.webpackIgnore) {
+						// Do not instrument `require()` if `webpackIgnore` is `true`
+						return true;
+					}
+				}
+			}
+
+			if (expr.arguments.length !== 1) return;
+			const param = parser.evaluateExpression(expr.arguments[0]);
+			if (param.isConditional()) {
+				for (const option of /** @type {BasicEvaluatedExpression[]} */ (
+					param.options
+				)) {
+					const result = processResolveItem(expr, option, weak);
+					if (result === undefined) {
+						processResolveContext(expr, option, weak);
+					}
+				}
+				const dep = new RequireResolveHeaderDependency(
+					/** @type {Range} */ (expr.callee.range)
+				);
+				dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+				parser.state.module.addPresentationalDependency(dep);
+				return true;
+			}
+			const result = processResolveItem(expr, param, weak);
+			if (result === undefined) {
+				processResolveContext(expr, param, weak);
+			}
+			const dep = new RequireResolveHeaderDependency(
+				/** @type {Range} */ (expr.callee.range)
+			);
+			dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+			parser.state.module.addPresentationalDependency(dep);
+			return true;
+		};
+		/**
+		 * @param {CallExpression} expr call expression
+		 * @param {BasicEvaluatedExpression} param param
+		 * @param {boolean} weak weak
+		 * @returns {boolean | void} true when handled
+		 */
+		const processResolveItem = (expr, param, weak) => {
+			if (param.isString()) {
+				const dep = new RequireResolveDependency(
+					/** @type {string} */ (param.string),
+					/** @type {Range} */ (param.range),
+					getContext()
+				);
+				dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+				dep.optional = Boolean(parser.scope.inTry);
+				dep.weak = weak;
+				parser.state.current.addDependency(dep);
+				return true;
+			}
+		};
+		/**
+		 * @param {CallExpression} expr call expression
+		 * @param {BasicEvaluatedExpression} param param
+		 * @param {boolean} weak weak
+		 * @returns {boolean | void} true when handled
+		 */
+		const processResolveContext = (expr, param, weak) => {
+			const dep = ContextDependencyHelpers.create(
+				RequireResolveContextDependency,
+				/** @type {Range} */ (param.range),
+				param,
+				expr,
+				options,
+				{
+					category: "commonjs",
+					mode: weak ? "weak" : "sync"
+				},
+				parser,
+				getContext()
+			);
+			if (!dep) return;
+			dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+			dep.optional = Boolean(parser.scope.inTry);
+			parser.state.current.addDependency(dep);
+			return true;
+		};
+
+		parser.hooks.call
+			.for("require.resolve")
+			.tap("CommonJsImportsParserPlugin", expr => processResolve(expr, false));
+		parser.hooks.call
+			.for("require.resolveWeak")
+			.tap("CommonJsImportsParserPlugin", expr => processResolve(expr, true));
+		// #endregion
+
+		// #region Create require
+
+		if (!options.createRequire) return;
+
+		/** @type {ImportSource[]} */
+		let moduleName = [];
+		/** @type {string | undefined} */
+		let specifierName;
+
+		if (options.createRequire === true) {
+			moduleName = ["module", "node:module"];
+			specifierName = "createRequire";
+		} else {
+			let moduleName;
+			const match = /^(.*) from (.*)$/.exec(options.createRequire);
+			if (match) {
+				[, specifierName, moduleName] = match;
+			}
+			if (!specifierName || !moduleName) {
+				const err = new WebpackError(
+					`Parsing javascript parser option "createRequire" failed, got ${JSON.stringify(
+						options.createRequire
+					)}`
+				);
+				err.details =
+					'Expected string in format "createRequire from module", where "createRequire" is specifier name and "module" name of the module';
+				throw err;
+			}
+		}
+
+		tapRequireExpressionTag(createdRequireIdentifierTag);
+		tapRequireExpressionTag(createRequireSpecifierTag);
+		parser.hooks.evaluateCallExpression
+			.for(createRequireSpecifierTag)
+			.tap("CommonJsImportsParserPlugin", expr => {
+				const context = parseCreateRequireArguments(expr);
+				if (context === undefined) return;
+				const ident = parser.evaluatedVariable({
+					tag: createdRequireIdentifierTag,
+					data: { context },
+					next: undefined
+				});
+
+				return new BasicEvaluatedExpression()
+					.setIdentifier(ident, ident, () => [])
+					.setSideEffects(false)
+					.setRange(/** @type {Range} */ (expr.range));
+			});
+		parser.hooks.unhandledExpressionMemberChain
+			.for(createdRequireIdentifierTag)
+			.tap("CommonJsImportsParserPlugin", (expr, members) =>
+				expressionIsUnsupported(
+					parser,
+					`createRequire().${members.join(".")} is not supported by webpack.`
+				)(expr)
+			);
+		parser.hooks.canRename
+			.for(createdRequireIdentifierTag)
+			.tap("CommonJsImportsParserPlugin", () => true);
+		parser.hooks.canRename
+			.for(createRequireSpecifierTag)
+			.tap("CommonJsImportsParserPlugin", () => true);
+		parser.hooks.rename
+			.for(createRequireSpecifierTag)
+			.tap("CommonJsImportsParserPlugin", defineUndefined);
+		parser.hooks.expression
+			.for(createdRequireIdentifierTag)
+			.tap("CommonJsImportsParserPlugin", requireAsExpressionHandler);
+		parser.hooks.call
+			.for(createdRequireIdentifierTag)
+			.tap("CommonJsImportsParserPlugin", createRequireHandler(false));
+		/**
+		 * @param {CallExpression} expr call expression
+		 * @returns {string | void} context
+		 */
+		const parseCreateRequireArguments = expr => {
+			const args = expr.arguments;
+			if (args.length !== 1) {
+				const err = new WebpackError(
+					"module.createRequire supports only one argument."
+				);
+				err.loc = /** @type {DependencyLocation} */ (expr.loc);
+				parser.state.module.addWarning(err);
+				return;
+			}
+			const arg = args[0];
+			const evaluated = parser.evaluateExpression(arg);
+			if (!evaluated.isString()) {
+				const err = new WebpackError(
+					"module.createRequire failed parsing argument."
+				);
+				err.loc = /** @type {DependencyLocation} */ (arg.loc);
+				parser.state.module.addWarning(err);
+				return;
+			}
+			const ctx = /** @type {string} */ (evaluated.string).startsWith("file://")
+				? fileURLToPath(/** @type {string} */ (evaluated.string))
+				: /** @type {string} */ (evaluated.string);
+			// argument always should be a filename
+			return ctx.slice(0, ctx.lastIndexOf(ctx.startsWith("/") ? "/" : "\\"));
+		};
+
+		parser.hooks.import.tap(
+			{
+				name: "CommonJsImportsParserPlugin",
+				stage: -10
+			},
+			(statement, source) => {
+				if (
+					!moduleName.includes(source) ||
+					statement.specifiers.length !== 1 ||
+					statement.specifiers[0].type !== "ImportSpecifier" ||
+					statement.specifiers[0].imported.type !== "Identifier" ||
+					statement.specifiers[0].imported.name !== specifierName
+				)
+					return;
+				// clear for 'import { createRequire as x } from "module"'
+				// if any other specifier was used import module
+				const clearDep = new ConstDependency(
+					parser.isAsiPosition(/** @type {Range} */ (statement.range)[0])
+						? ";"
+						: "",
+					/** @type {Range} */ (statement.range)
+				);
+				clearDep.loc = /** @type {DependencyLocation} */ (statement.loc);
+				parser.state.module.addPresentationalDependency(clearDep);
+				parser.unsetAsiPosition(/** @type {Range} */ (statement.range)[1]);
+				return true;
+			}
+		);
+		parser.hooks.importSpecifier.tap(
+			{
+				name: "CommonJsImportsParserPlugin",
+				stage: -10
+			},
+			(statement, source, id, name) => {
+				if (!moduleName.includes(source) || id !== specifierName) return;
+				parser.tagVariable(name, createRequireSpecifierTag);
+				return true;
+			}
+		);
+		parser.hooks.preDeclarator.tap(
+			"CommonJsImportsParserPlugin",
+			declarator => {
+				if (
+					declarator.id.type !== "Identifier" ||
+					!declarator.init ||
+					declarator.init.type !== "CallExpression" ||
+					declarator.init.callee.type !== "Identifier"
+				)
+					return;
+				const variableInfo = parser.getVariableInfo(
+					declarator.init.callee.name
+				);
+				if (
+					variableInfo instanceof VariableInfo &&
+					variableInfo.tagInfo &&
+					variableInfo.tagInfo.tag === createRequireSpecifierTag
+				) {
+					const context = parseCreateRequireArguments(declarator.init);
+					if (context === undefined) return;
+					parser.tagVariable(declarator.id.name, createdRequireIdentifierTag, {
+						name: declarator.id.name,
+						context
+					});
+					return true;
+				}
+			}
+		);
+
+		parser.hooks.memberChainOfCallMemberChain
+			.for(createRequireSpecifierTag)
+			.tap(
+				"CommonJsImportsParserPlugin",
+				(expr, calleeMembers, callExpr, members) => {
+					if (
+						calleeMembers.length !== 0 ||
+						members.length !== 1 ||
+						members[0] !== "cache"
+					)
+						return;
+					// createRequire().cache
+					const context = parseCreateRequireArguments(callExpr);
+					if (context === undefined) return;
+					return requireCache(expr);
+				}
+			);
+		parser.hooks.callMemberChainOfCallMemberChain
+			.for(createRequireSpecifierTag)
+			.tap(
+				"CommonJsImportsParserPlugin",
+				(expr, calleeMembers, innerCallExpression, members) => {
+					if (
+						calleeMembers.length !== 0 ||
+						members.length !== 1 ||
+						members[0] !== "resolve"
+					)
+						return;
+					// createRequire().resolve()
+					return processResolve(expr, false);
+				}
+			);
+		parser.hooks.expressionMemberChain
+			.for(createdRequireIdentifierTag)
+			.tap("CommonJsImportsParserPlugin", (expr, members) => {
+				// require.cache
+				if (members.length === 1 && members[0] === "cache") {
+					return requireCache(expr);
+				}
+			});
+		parser.hooks.callMemberChain
+			.for(createdRequireIdentifierTag)
+			.tap("CommonJsImportsParserPlugin", (expr, members) => {
+				// require.resolve()
+				if (members.length === 1 && members[0] === "resolve") {
+					return processResolve(expr, false);
+				}
+			});
+		parser.hooks.call
+			.for(createRequireSpecifierTag)
+			.tap("CommonJsImportsParserPlugin", expr => {
+				const clearDep = new ConstDependency(
+					"/* createRequire() */ undefined",
+					/** @type {Range} */ (expr.range)
+				);
+				clearDep.loc = /** @type {DependencyLocation} */ (expr.loc);
+				parser.state.module.addPresentationalDependency(clearDep);
+				return true;
+			});
+		// #endregion
+	}
+}
+module.exports = CommonJsImportsParserPlugin;
diff --git a/lib/dependencies/CommonJsPlugin.js b/lib/dependencies/CommonJsPlugin.js
index 6d441a872d9..b148b17b0b9 100644
--- a/lib/dependencies/CommonJsPlugin.js
+++ b/lib/dependencies/CommonJsPlugin.js
@@ -2,31 +2,56 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
-const ConstDependency = require("./ConstDependency");
-const CommonJsRequireDependency = require("./CommonJsRequireDependency");
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+const SelfModuleFactory = require("../SelfModuleFactory");
+const Template = require("../Template");
+const CommonJsExportsDependency = require("./CommonJsExportsDependency");
+const CommonJsFullRequireDependency = require("./CommonJsFullRequireDependency");
 const CommonJsRequireContextDependency = require("./CommonJsRequireContextDependency");
-const RequireResolveDependency = require("./RequireResolveDependency");
+const CommonJsRequireDependency = require("./CommonJsRequireDependency");
+const CommonJsSelfReferenceDependency = require("./CommonJsSelfReferenceDependency");
+const ModuleDecoratorDependency = require("./ModuleDecoratorDependency");
+const RequireHeaderDependency = require("./RequireHeaderDependency");
 const RequireResolveContextDependency = require("./RequireResolveContextDependency");
+const RequireResolveDependency = require("./RequireResolveDependency");
 const RequireResolveHeaderDependency = require("./RequireResolveHeaderDependency");
-const RequireHeaderDependency = require("./RequireHeaderDependency");
+const RuntimeRequirementsDependency = require("./RuntimeRequirementsDependency");
 
-const NullFactory = require("../NullFactory");
+const CommonJsExportsParserPlugin = require("./CommonJsExportsParserPlugin");
+const CommonJsImportsParserPlugin = require("./CommonJsImportsParserPlugin");
 
-const RequireResolveDependencyParserPlugin = require("./RequireResolveDependencyParserPlugin");
-const CommonJsRequireDependencyParserPlugin = require("./CommonJsRequireDependencyParserPlugin");
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_DYNAMIC
+} = require("../ModuleTypeConstants");
+const {
+	evaluateToIdentifier,
+	toConstantDependency
+} = require("../javascript/JavascriptParserHelpers");
+const CommonJsExportRequireDependency = require("./CommonJsExportRequireDependency");
 
-const ParserHelpers = require("../ParserHelpers");
+/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("../Module").BuildInfo} BuildInfo */
+/** @typedef {import("../javascript/JavascriptParser")} Parser */
 
-class CommonJsPlugin {
-	constructor(options) {
-		this.options = options;
-	}
+const PLUGIN_NAME = "CommonJsPlugin";
 
+class CommonJsPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		const options = this.options;
 		compiler.hooks.compilation.tap(
-			"CommonJsPlugin",
+			PLUGIN_NAME,
 			(compilation, { contextModuleFactory, normalModuleFactory }) => {
 				compilation.dependencyFactories.set(
 					CommonJsRequireDependency,
@@ -37,6 +62,15 @@ class CommonJsPlugin {
 					new CommonJsRequireDependency.Template()
 				);
 
+				compilation.dependencyFactories.set(
+					CommonJsFullRequireDependency,
+					normalModuleFactory
+				);
+				compilation.dependencyTemplates.set(
+					CommonJsFullRequireDependency,
+					new CommonJsFullRequireDependency.Template()
+				);
+
 				compilation.dependencyFactories.set(
 					CommonJsRequireContextDependency,
 					contextModuleFactory
@@ -64,95 +98,208 @@ class CommonJsPlugin {
 					new RequireResolveContextDependency.Template()
 				);
 
-				compilation.dependencyFactories.set(
-					RequireResolveHeaderDependency,
-					new NullFactory()
-				);
 				compilation.dependencyTemplates.set(
 					RequireResolveHeaderDependency,
 					new RequireResolveHeaderDependency.Template()
 				);
 
-				compilation.dependencyFactories.set(
-					RequireHeaderDependency,
-					new NullFactory()
-				);
 				compilation.dependencyTemplates.set(
 					RequireHeaderDependency,
 					new RequireHeaderDependency.Template()
 				);
 
+				compilation.dependencyTemplates.set(
+					CommonJsExportsDependency,
+					new CommonJsExportsDependency.Template()
+				);
+
+				compilation.dependencyFactories.set(
+					CommonJsExportRequireDependency,
+					normalModuleFactory
+				);
+				compilation.dependencyTemplates.set(
+					CommonJsExportRequireDependency,
+					new CommonJsExportRequireDependency.Template()
+				);
+
+				const selfFactory = new SelfModuleFactory(compilation.moduleGraph);
+
+				compilation.dependencyFactories.set(
+					CommonJsSelfReferenceDependency,
+					selfFactory
+				);
+				compilation.dependencyTemplates.set(
+					CommonJsSelfReferenceDependency,
+					new CommonJsSelfReferenceDependency.Template()
+				);
+
+				compilation.dependencyFactories.set(
+					ModuleDecoratorDependency,
+					selfFactory
+				);
+				compilation.dependencyTemplates.set(
+					ModuleDecoratorDependency,
+					new ModuleDecoratorDependency.Template()
+				);
+
+				compilation.hooks.runtimeRequirementInModule
+					.for(RuntimeGlobals.harmonyModuleDecorator)
+					.tap(PLUGIN_NAME, (module, set) => {
+						set.add(RuntimeGlobals.module);
+						set.add(RuntimeGlobals.requireScope);
+					});
+
+				compilation.hooks.runtimeRequirementInModule
+					.for(RuntimeGlobals.nodeModuleDecorator)
+					.tap(PLUGIN_NAME, (module, set) => {
+						set.add(RuntimeGlobals.module);
+						set.add(RuntimeGlobals.requireScope);
+					});
+
+				compilation.hooks.runtimeRequirementInTree
+					.for(RuntimeGlobals.harmonyModuleDecorator)
+					.tap(PLUGIN_NAME, (chunk, set) => {
+						compilation.addRuntimeModule(
+							chunk,
+							new HarmonyModuleDecoratorRuntimeModule()
+						);
+					});
+
+				compilation.hooks.runtimeRequirementInTree
+					.for(RuntimeGlobals.nodeModuleDecorator)
+					.tap(PLUGIN_NAME, (chunk, set) => {
+						compilation.addRuntimeModule(
+							chunk,
+							new NodeModuleDecoratorRuntimeModule()
+						);
+					});
+
+				/**
+				 * @param {Parser} parser parser parser
+				 * @param {JavascriptParserOptions} parserOptions parserOptions
+				 * @returns {void}
+				 */
 				const handler = (parser, parserOptions) => {
 					if (parserOptions.commonjs !== undefined && !parserOptions.commonjs)
 						return;
-
-					const requireExpressions = [
-						"require",
-						"require.resolve",
-						"require.resolveWeak"
-					];
-					for (let expression of requireExpressions) {
-						parser.hooks.typeof
-							.for(expression)
-							.tap(
-								"CommonJsPlugin",
-								ParserHelpers.toConstantDependency(
-									parser,
-									JSON.stringify("function")
-								)
-							);
-						parser.hooks.evaluateTypeof
-							.for(expression)
-							.tap(
-								"CommonJsPlugin",
-								ParserHelpers.evaluateToString("function")
-							);
-						parser.hooks.evaluateIdentifier
-							.for(expression)
-							.tap(
-								"CommonJsPlugin",
-								ParserHelpers.evaluateToIdentifier(expression, true)
-							);
-					}
-
-					parser.hooks.evaluateTypeof
+					parser.hooks.typeof
 						.for("module")
-						.tap("CommonJsPlugin", ParserHelpers.evaluateToString("object"));
-					parser.hooks.assign.for("require").tap("CommonJsPlugin", expr => {
-						// to not leak to global "require", we need to define a local require here.
-						const dep = new ConstDependency("var require;", 0);
-						dep.loc = expr.loc;
-						parser.state.current.addDependency(dep);
-						parser.scope.definitions.add("require");
-						return true;
-					});
-					parser.hooks.canRename
-						.for("require")
-						.tap("CommonJsPlugin", () => true);
-					parser.hooks.rename.for("require").tap("CommonJsPlugin", expr => {
-						// define the require variable. It's still undefined, but not "not defined".
-						const dep = new ConstDependency("var require;", 0);
-						dep.loc = expr.loc;
-						parser.state.current.addDependency(dep);
-						return false;
-					});
-					parser.hooks.typeof.for("module").tap("CommonJsPlugin", () => true);
-					parser.hooks.evaluateTypeof
-						.for("exports")
-						.tap("CommonJsPlugin", ParserHelpers.evaluateToString("object"));
+						.tap(
+							PLUGIN_NAME,
+							toConstantDependency(parser, JSON.stringify("object"))
+						);
+
+					parser.hooks.expression
+						.for("require.main")
+						.tap(
+							PLUGIN_NAME,
+							toConstantDependency(
+								parser,
+								`${RuntimeGlobals.moduleCache}[${RuntimeGlobals.entryModuleId}]`,
+								[RuntimeGlobals.moduleCache, RuntimeGlobals.entryModuleId]
+							)
+						);
+					parser.hooks.expression
+						.for(RuntimeGlobals.moduleLoaded)
+						.tap(PLUGIN_NAME, expr => {
+							/** @type {BuildInfo} */
+							(parser.state.module.buildInfo).moduleConcatenationBailout =
+								RuntimeGlobals.moduleLoaded;
+							const dep = new RuntimeRequirementsDependency([
+								RuntimeGlobals.moduleLoaded
+							]);
+							dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+							parser.state.module.addPresentationalDependency(dep);
+							return true;
+						});
+
+					parser.hooks.expression
+						.for(RuntimeGlobals.moduleId)
+						.tap(PLUGIN_NAME, expr => {
+							/** @type {BuildInfo} */
+							(parser.state.module.buildInfo).moduleConcatenationBailout =
+								RuntimeGlobals.moduleId;
+							const dep = new RuntimeRequirementsDependency([
+								RuntimeGlobals.moduleId
+							]);
+							dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+							parser.state.module.addPresentationalDependency(dep);
+							return true;
+						});
 
-					new CommonJsRequireDependencyParserPlugin(options).apply(parser);
-					new RequireResolveDependencyParserPlugin(options).apply(parser);
+					parser.hooks.evaluateIdentifier.for("module.hot").tap(
+						PLUGIN_NAME,
+						evaluateToIdentifier("module.hot", "module", () => ["hot"], null)
+					);
+
+					new CommonJsImportsParserPlugin(parserOptions).apply(parser);
+					new CommonJsExportsParserPlugin(compilation.moduleGraph).apply(
+						parser
+					);
 				};
 
 				normalModuleFactory.hooks.parser
-					.for("javascript/auto")
-					.tap("CommonJsPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, handler);
 				normalModuleFactory.hooks.parser
-					.for("javascript/dynamic")
-					.tap("CommonJsPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
+					.tap(PLUGIN_NAME, handler);
 			}
 		);
 	}
 }
+
+class HarmonyModuleDecoratorRuntimeModule extends RuntimeModule {
+	constructor() {
+		super("harmony module decorator");
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const { runtimeTemplate } = /** @type {Compilation} */ (this.compilation);
+		return Template.asString([
+			`${
+				RuntimeGlobals.harmonyModuleDecorator
+			} = ${runtimeTemplate.basicFunction("module", [
+				"module = Object.create(module);",
+				"if (!module.children) module.children = [];",
+				"Object.defineProperty(module, 'exports', {",
+				Template.indent([
+					"enumerable: true,",
+					`set: ${runtimeTemplate.basicFunction("", [
+						"throw new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);"
+					])}`
+				]),
+				"});",
+				"return module;"
+			])};`
+		]);
+	}
+}
+
+class NodeModuleDecoratorRuntimeModule extends RuntimeModule {
+	constructor() {
+		super("node module decorator");
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const { runtimeTemplate } = /** @type {Compilation} */ (this.compilation);
+		return Template.asString([
+			`${RuntimeGlobals.nodeModuleDecorator} = ${runtimeTemplate.basicFunction(
+				"module",
+				[
+					"module.paths = [];",
+					"if (!module.children) module.children = [];",
+					"return module;"
+				]
+			)};`
+		]);
+	}
+}
+
 module.exports = CommonJsPlugin;
diff --git a/lib/dependencies/CommonJsRequireContextDependency.js b/lib/dependencies/CommonJsRequireContextDependency.js
index 723a849e750..68f9e66407f 100644
--- a/lib/dependencies/CommonJsRequireContextDependency.js
+++ b/lib/dependencies/CommonJsRequireContextDependency.js
@@ -2,22 +2,72 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const makeSerializable = require("../util/makeSerializable");
 const ContextDependency = require("./ContextDependency");
 const ContextDependencyTemplateAsRequireCall = require("./ContextDependencyTemplateAsRequireCall");
 
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("./ContextDependency").ContextDependencyOptions} ContextDependencyOptions */
+
 class CommonJsRequireContextDependency extends ContextDependency {
-	constructor(options, range, valueRange) {
-		super(options);
+	/**
+	 * @param {ContextDependencyOptions} options options for the context module
+	 * @param {Range} range location in source code
+	 * @param {Range | undefined} valueRange location of the require call
+	 * @param {boolean | string } inShorthand true or name
+	 * @param {string} context context
+	 */
+	constructor(options, range, valueRange, inShorthand, context) {
+		super(options, context);
+
 		this.range = range;
 		this.valueRange = valueRange;
+		// inShorthand must be serialized by subclasses that use it
+		this.inShorthand = inShorthand;
 	}
 
 	get type() {
 		return "cjs require context";
 	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+
+		write(this.range);
+		write(this.valueRange);
+		write(this.inShorthand);
+
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+
+		this.range = read();
+		this.valueRange = read();
+		this.inShorthand = read();
+
+		super.deserialize(context);
+	}
 }
 
-CommonJsRequireContextDependency.Template = ContextDependencyTemplateAsRequireCall;
+makeSerializable(
+	CommonJsRequireContextDependency,
+	"webpack/lib/dependencies/CommonJsRequireContextDependency"
+);
+
+CommonJsRequireContextDependency.Template =
+	ContextDependencyTemplateAsRequireCall;
 
 module.exports = CommonJsRequireContextDependency;
diff --git a/lib/dependencies/CommonJsRequireDependency.js b/lib/dependencies/CommonJsRequireDependency.js
index 29a30f34356..09545a86e5e 100644
--- a/lib/dependencies/CommonJsRequireDependency.js
+++ b/lib/dependencies/CommonJsRequireDependency.js
@@ -2,21 +2,41 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const makeSerializable = require("../util/makeSerializable");
 const ModuleDependency = require("./ModuleDependency");
 const ModuleDependencyTemplateAsId = require("./ModuleDependencyTemplateAsId");
 
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+
 class CommonJsRequireDependency extends ModuleDependency {
-	constructor(request, range) {
+	/**
+	 * @param {string} request request
+	 * @param {Range=} range location in source code
+	 * @param {string=} context request context
+	 */
+	constructor(request, range, context) {
 		super(request);
 		this.range = range;
+		this._context = context;
 	}
 
 	get type() {
 		return "cjs require";
 	}
+
+	get category() {
+		return "commonjs";
+	}
 }
 
 CommonJsRequireDependency.Template = ModuleDependencyTemplateAsId;
 
+makeSerializable(
+	CommonJsRequireDependency,
+	"webpack/lib/dependencies/CommonJsRequireDependency"
+);
+
 module.exports = CommonJsRequireDependency;
diff --git a/lib/dependencies/CommonJsRequireDependencyParserPlugin.js b/lib/dependencies/CommonJsRequireDependencyParserPlugin.js
deleted file mode 100644
index b0faa1a338d..00000000000
--- a/lib/dependencies/CommonJsRequireDependencyParserPlugin.js
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const CommonJsRequireDependency = require("./CommonJsRequireDependency");
-const CommonJsRequireContextDependency = require("./CommonJsRequireContextDependency");
-const RequireHeaderDependency = require("./RequireHeaderDependency");
-const LocalModuleDependency = require("./LocalModuleDependency");
-const ContextDependencyHelpers = require("./ContextDependencyHelpers");
-const LocalModulesHelpers = require("./LocalModulesHelpers");
-const ParserHelpers = require("../ParserHelpers");
-
-class CommonJsRequireDependencyParserPlugin {
-	constructor(options) {
-		this.options = options;
-	}
-
-	apply(parser) {
-		const options = this.options;
-
-		const processItem = (expr, param) => {
-			if (param.isString()) {
-				const dep = new CommonJsRequireDependency(param.string, param.range);
-				dep.loc = expr.loc;
-				dep.optional = !!parser.scope.inTry;
-				parser.state.current.addDependency(dep);
-				return true;
-			}
-		};
-		const processContext = (expr, param) => {
-			const dep = ContextDependencyHelpers.create(
-				CommonJsRequireContextDependency,
-				expr.range,
-				param,
-				expr,
-				options,
-				{},
-				parser
-			);
-			if (!dep) return;
-			dep.loc = expr.loc;
-			dep.optional = !!parser.scope.inTry;
-			parser.state.current.addDependency(dep);
-			return true;
-		};
-
-		parser.hooks.expression
-			.for("require.cache")
-			.tap(
-				"CommonJsRequireDependencyParserPlugin",
-				ParserHelpers.toConstantDependencyWithWebpackRequire(
-					parser,
-					"__webpack_require__.c"
-				)
-			);
-		parser.hooks.expression
-			.for("require")
-			.tap("CommonJsRequireDependencyParserPlugin", expr => {
-				const dep = new CommonJsRequireContextDependency(
-					{
-						request: options.unknownContextRequest,
-						recursive: options.unknownContextRecursive,
-						regExp: options.unknownContextRegExp,
-						mode: "sync"
-					},
-					expr.range
-				);
-				dep.critical =
-					options.unknownContextCritical &&
-					"require function is used in a way in which dependencies cannot be statically extracted";
-				dep.loc = expr.loc;
-				dep.optional = !!parser.scope.inTry;
-				parser.state.current.addDependency(dep);
-				return true;
-			});
-
-		const createHandler = callNew => expr => {
-			if (expr.arguments.length !== 1) return;
-			let localModule;
-			const param = parser.evaluateExpression(expr.arguments[0]);
-			if (param.isConditional()) {
-				let isExpression = false;
-				const prevLength = parser.state.current.dependencies.length;
-				const dep = new RequireHeaderDependency(expr.callee.range);
-				dep.loc = expr.loc;
-				parser.state.current.addDependency(dep);
-				for (const p of param.options) {
-					const result = processItem(expr, p);
-					if (result === undefined) {
-						isExpression = true;
-					}
-				}
-				if (isExpression) {
-					parser.state.current.dependencies.length = prevLength;
-				} else {
-					return true;
-				}
-			}
-			if (
-				param.isString() &&
-				(localModule = LocalModulesHelpers.getLocalModule(
-					parser.state,
-					param.string
-				))
-			) {
-				const dep = new LocalModuleDependency(localModule, expr.range, callNew);
-				dep.loc = expr.loc;
-				parser.state.current.addDependency(dep);
-				return true;
-			} else {
-				const result = processItem(expr, param);
-				if (result === undefined) {
-					processContext(expr, param);
-				} else {
-					const dep = new RequireHeaderDependency(expr.callee.range);
-					dep.loc = expr.loc;
-					parser.state.current.addDependency(dep);
-				}
-				return true;
-			}
-		};
-		parser.hooks.call
-			.for("require")
-			.tap("CommonJsRequireDependencyParserPlugin", createHandler(false));
-		parser.hooks.new
-			.for("require")
-			.tap("CommonJsRequireDependencyParserPlugin", createHandler(true));
-		parser.hooks.call
-			.for("module.require")
-			.tap("CommonJsRequireDependencyParserPlugin", createHandler(false));
-		parser.hooks.new
-			.for("module.require")
-			.tap("CommonJsRequireDependencyParserPlugin", createHandler(true));
-	}
-}
-module.exports = CommonJsRequireDependencyParserPlugin;
diff --git a/lib/dependencies/CommonJsSelfReferenceDependency.js b/lib/dependencies/CommonJsSelfReferenceDependency.js
new file mode 100644
index 00000000000..b1b368ead67
--- /dev/null
+++ b/lib/dependencies/CommonJsSelfReferenceDependency.js
@@ -0,0 +1,155 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const { equals } = require("../util/ArrayHelpers");
+const makeSerializable = require("../util/makeSerializable");
+const propertyAccess = require("../util/propertyAccess");
+const NullDependency = require("./NullDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").ExportsSpec} ExportsSpec */
+/** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+/** @typedef {import("./CommonJsDependencyHelpers").CommonJSDependencyBaseKeywords} CommonJSDependencyBaseKeywords */
+
+class CommonJsSelfReferenceDependency extends NullDependency {
+	/**
+	 * @param {Range} range range
+	 * @param {CommonJSDependencyBaseKeywords} base base
+	 * @param {string[]} names names
+	 * @param {boolean} call is a call
+	 */
+	constructor(range, base, names, call) {
+		super();
+		this.range = range;
+		this.base = base;
+		this.names = names;
+		this.call = call;
+	}
+
+	get type() {
+		return "cjs self exports reference";
+	}
+
+	get category() {
+		return "self";
+	}
+
+	/**
+	 * @returns {string | null} an identifier to merge equal requests
+	 */
+	getResourceIdentifier() {
+		return "self";
+	}
+
+	/**
+	 * Returns list of exports referenced by this dependency
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @param {RuntimeSpec} runtime the runtime for which the module is analysed
+	 * @returns {(string[] | ReferencedExport)[]} referenced exports
+	 */
+	getReferencedExports(moduleGraph, runtime) {
+		return [this.call ? this.names.slice(0, -1) : this.names];
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.range);
+		write(this.base);
+		write(this.names);
+		write(this.call);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.range = read();
+		this.base = read();
+		this.names = read();
+		this.call = read();
+		super.deserialize(context);
+	}
+}
+
+makeSerializable(
+	CommonJsSelfReferenceDependency,
+	"webpack/lib/dependencies/CommonJsSelfReferenceDependency"
+);
+
+CommonJsSelfReferenceDependency.Template = class CommonJsSelfReferenceDependencyTemplate extends (
+	NullDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(
+		dependency,
+		source,
+		{ module, moduleGraph, runtime, runtimeRequirements }
+	) {
+		const dep = /** @type {CommonJsSelfReferenceDependency} */ (dependency);
+		const used =
+			dep.names.length === 0
+				? dep.names
+				: moduleGraph.getExportsInfo(module).getUsedName(dep.names, runtime);
+		if (!used) {
+			throw new Error(
+				"Self-reference dependency has unused export name: This should not happen"
+			);
+		}
+
+		let base;
+		switch (dep.base) {
+			case "exports":
+				runtimeRequirements.add(RuntimeGlobals.exports);
+				base = module.exportsArgument;
+				break;
+			case "module.exports":
+				runtimeRequirements.add(RuntimeGlobals.module);
+				base = `${module.moduleArgument}.exports`;
+				break;
+			case "this":
+				runtimeRequirements.add(RuntimeGlobals.thisAsExports);
+				base = "this";
+				break;
+			default:
+				throw new Error(`Unsupported base ${dep.base}`);
+		}
+
+		if (base === dep.base && equals(used, dep.names)) {
+			// Nothing has to be changed
+			// We don't use a replacement for compat reasons
+			// for plugins that update `module._source` which they
+			// shouldn't do!
+			return;
+		}
+
+		source.replace(
+			dep.range[0],
+			dep.range[1] - 1,
+			`${base}${propertyAccess(used)}`
+		);
+	}
+};
+
+module.exports = CommonJsSelfReferenceDependency;
diff --git a/lib/dependencies/ConstDependency.js b/lib/dependencies/ConstDependency.js
index 22edb8e23bc..e41acef3acc 100644
--- a/lib/dependencies/ConstDependency.js
+++ b/lib/dependencies/ConstDependency.js
@@ -2,25 +2,109 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const makeSerializable = require("../util/makeSerializable");
 const NullDependency = require("./NullDependency");
 
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../ModuleGraphConnection").ConnectionState} ConnectionState */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+
 class ConstDependency extends NullDependency {
-	constructor(expression, range, requireWebpackRequire) {
+	/**
+	 * @param {string} expression the expression
+	 * @param {number | Range} range the source range
+	 * @param {(string[] | null)=} runtimeRequirements runtime requirements
+	 */
+	constructor(expression, range, runtimeRequirements) {
 		super();
 		this.expression = expression;
 		this.range = range;
-		this.requireWebpackRequire = requireWebpackRequire;
+		this.runtimeRequirements = runtimeRequirements
+			? new Set(runtimeRequirements)
+			: null;
+		this._hashUpdate = undefined;
+	}
+
+	/**
+	 * Update the hash
+	 * @param {Hash} hash hash to be updated
+	 * @param {UpdateHashContext} context context
+	 * @returns {void}
+	 */
+	updateHash(hash, context) {
+		if (this._hashUpdate === undefined) {
+			let hashUpdate = `${this.range}|${this.expression}`;
+			if (this.runtimeRequirements) {
+				for (const item of this.runtimeRequirements) {
+					hashUpdate += "|";
+					hashUpdate += item;
+				}
+			}
+			this._hashUpdate = hashUpdate;
+		}
+		hash.update(this._hashUpdate);
 	}
 
-	updateHash(hash) {
-		hash.update(this.range + "");
-		hash.update(this.expression + "");
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @returns {ConnectionState} how this dependency connects the module to referencing modules
+	 */
+	getModuleEvaluationSideEffectsState(moduleGraph) {
+		return false;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.expression);
+		write(this.range);
+		write(this.runtimeRequirements);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.expression = read();
+		this.range = read();
+		this.runtimeRequirements = read();
+		super.deserialize(context);
 	}
 }
 
-ConstDependency.Template = class ConstDependencyTemplate {
-	apply(dep, source) {
+makeSerializable(ConstDependency, "webpack/lib/dependencies/ConstDependency");
+
+ConstDependency.Template = class ConstDependencyTemplate extends (
+	NullDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, templateContext) {
+		const dep = /** @type {ConstDependency} */ (dependency);
+		if (dep.runtimeRequirements) {
+			for (const req of dep.runtimeRequirements) {
+				templateContext.runtimeRequirements.add(req);
+			}
+		}
 		if (typeof dep.range === "number") {
 			source.insert(dep.range, dep.expression);
 			return;
diff --git a/lib/dependencies/ContextDependency.js b/lib/dependencies/ContextDependency.js
index 10c2fea9915..e1d94b5ece7 100644
--- a/lib/dependencies/ContextDependency.js
+++ b/lib/dependencies/ContextDependency.js
@@ -2,67 +2,177 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
 const Dependency = require("../Dependency");
-const CriticalDependencyWarning = require("./CriticalDependencyWarning");
+const DependencyTemplate = require("../DependencyTemplate");
+const makeSerializable = require("../util/makeSerializable");
+const memoize = require("../util/memoize");
+
+/** @typedef {import("../ContextModule").ContextOptions} ContextOptions */
+/** @typedef {import("../Dependency").TRANSITIVE} TRANSITIVE */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../WebpackError")} WebpackError */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
+const getCriticalDependencyWarning = memoize(() =>
+	require("./CriticalDependencyWarning")
+);
 
-const regExpToString = r => (r ? r + "" : "");
+/** @typedef {ContextOptions & { request: string }} ContextDependencyOptions */
+
+/**
+ * @param {RegExp | null | undefined} r regexp
+ * @returns {string} stringified regexp
+ */
+const regExpToString = r => (r ? String(r) : "");
 
 class ContextDependency extends Dependency {
-	// options: { request, recursive, regExp, include, exclude, mode, chunkName, groupOptions }
-	constructor(options) {
+	/**
+	 * @param {ContextDependencyOptions} options options for the context module
+	 * @param {string=} context request context
+	 */
+	constructor(options, context) {
 		super();
+
 		this.options = options;
-		this.userRequest = this.options.request;
-		/** @type {false | string} */
+		this.userRequest = this.options && this.options.request;
+		/** @type {false | undefined | string} */
 		this.critical = false;
 		this.hadGlobalOrStickyRegExp = false;
-		if (this.options.regExp.global || this.options.regExp.sticky) {
-			this.options.regExp = null;
+
+		if (
+			this.options &&
+			(this.options.regExp.global || this.options.regExp.sticky)
+		) {
+			this.options = { ...this.options, regExp: null };
 			this.hadGlobalOrStickyRegExp = true;
 		}
+
+		this.request = undefined;
+		this.range = undefined;
+		this.valueRange = undefined;
+		/** @type {boolean | string | undefined} */
+		this.inShorthand = undefined;
+		// TODO refactor this
+		this.replaces = undefined;
+		this._requestContext = context;
 	}
 
+	/**
+	 * @returns {string | undefined} a request context
+	 */
+	getContext() {
+		return this._requestContext;
+	}
+
+	get category() {
+		return "commonjs";
+	}
+
+	/**
+	 * @returns {boolean | TRANSITIVE} true, when changes to the referenced module could affect the referencing module; TRANSITIVE, when changes to the referenced module could affect referencing modules of the referencing module
+	 */
+	couldAffectReferencingModule() {
+		return true;
+	}
+
+	/**
+	 * @returns {string | null} an identifier to merge equal requests
+	 */
 	getResourceIdentifier() {
 		return (
-			`context${this.options.request} ${this.options.recursive} ` +
+			`context${this._requestContext || ""}|ctx request${
+				this.options.request
+			} ${this.options.recursive} ` +
 			`${regExpToString(this.options.regExp)} ${regExpToString(
 				this.options.include
 			)} ${regExpToString(this.options.exclude)} ` +
 			`${this.options.mode} ${this.options.chunkName} ` +
-			`${JSON.stringify(this.options.groupOptions)}`
+			`${JSON.stringify(this.options.groupOptions)}` +
+			`${
+				this.options.referencedExports
+					? ` ${JSON.stringify(this.options.referencedExports)}`
+					: ""
+			}`
 		);
 	}
 
-	getWarnings() {
-		let warnings = super.getWarnings() || [];
+	/**
+	 * Returns warnings
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {WebpackError[] | null | undefined} warnings
+	 */
+	getWarnings(moduleGraph) {
+		let warnings = super.getWarnings(moduleGraph);
+
 		if (this.critical) {
+			if (!warnings) warnings = [];
+			const CriticalDependencyWarning = getCriticalDependencyWarning();
 			warnings.push(new CriticalDependencyWarning(this.critical));
 		}
+
 		if (this.hadGlobalOrStickyRegExp) {
+			if (!warnings) warnings = [];
+			const CriticalDependencyWarning = getCriticalDependencyWarning();
 			warnings.push(
 				new CriticalDependencyWarning(
 					"Contexts can't use RegExps with the 'g' or 'y' flags."
 				)
 			);
 		}
+
 		return warnings;
 	}
-}
 
-// TODO remove in webpack 5
-Object.defineProperty(ContextDependency.prototype, "async", {
-	configurable: false,
-	get() {
-		throw new Error(
-			"ContextDependency.async was removed. Use ContextDependency.options.mode instead."
-		);
-	},
-	set() {
-		throw new Error(
-			"ContextDependency.async was removed. Pass options.mode to constructor instead"
-		);
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+
+		write(this.options);
+		write(this.userRequest);
+		write(this.critical);
+		write(this.hadGlobalOrStickyRegExp);
+		write(this.request);
+		write(this._requestContext);
+		write(this.range);
+		write(this.valueRange);
+		write(this.prepend);
+		write(this.replaces);
+
+		super.serialize(context);
 	}
-});
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+
+		this.options = read();
+		this.userRequest = read();
+		this.critical = read();
+		this.hadGlobalOrStickyRegExp = read();
+		this.request = read();
+		this._requestContext = read();
+		this.range = read();
+		this.valueRange = read();
+		this.prepend = read();
+		this.replaces = read();
+
+		super.deserialize(context);
+	}
+}
+
+makeSerializable(
+	ContextDependency,
+	"webpack/lib/dependencies/ContextDependency"
+);
+
+ContextDependency.Template = DependencyTemplate;
 
 module.exports = ContextDependency;
diff --git a/lib/dependencies/ContextDependencyHelpers.js b/lib/dependencies/ContextDependencyHelpers.js
index 377425b2531..e7ecc8652af 100644
--- a/lib/dependencies/ContextDependencyHelpers.js
+++ b/lib/dependencies/ContextDependencyHelpers.js
@@ -2,25 +2,38 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const ContextDependencyHelpers = exports;
+const { parseResource } = require("../util/identifier");
+
+/** @typedef {import("estree").Expression} Expression */
+/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
+/** @typedef {import("../../declarations/WebpackOptions").ModuleOptionsNormalized} ModuleOptions */
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("../javascript/BasicEvaluatedExpression")} BasicEvaluatedExpression */
+/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("./ContextDependency")} ContextDependency */
+/** @typedef {import("./ContextDependency").ContextDependencyOptions} ContextDependencyOptions */
 
 /**
  * Escapes regular expression metacharacters
  * @param {string} str String to quote
  * @returns {string} Escaped string
  */
-const quotemeta = str => {
-	return str.replace(/[-[\]\\/{}()*+?.^$|]/g, "\\$&");
-};
+const quoteMeta = str => str.replace(/[-[\]\\/{}()*+?.^$|]/g, "\\$&");
 
+/**
+ * @param {string} prefix prefix
+ * @returns {{prefix: string, context: string}} result
+ */
 const splitContextFromPrefix = prefix => {
 	const idx = prefix.lastIndexOf("/");
 	let context = ".";
 	if (idx >= 0) {
-		context = prefix.substr(0, idx);
-		prefix = `.${prefix.substr(idx)}`;
+		context = prefix.slice(0, idx);
+		prefix = `.${prefix.slice(idx)}`;
 	}
 	return {
 		context,
@@ -28,104 +41,122 @@ const splitContextFromPrefix = prefix => {
 	};
 };
 
-const splitQueryFromPostfix = postfix => {
-	const idx = postfix.indexOf("?");
-	let query = "";
-	if (idx >= 0) {
-		query = postfix.substr(idx);
-		postfix = postfix.substr(0, idx);
-	}
-	return {
-		postfix,
-		query
-	};
-};
+/** @typedef {Partial>} PartialContextDependencyOptions */
+/** @typedef {{ new(options: ContextDependencyOptions, range: Range, valueRange: Range, ...args: any[]): ContextDependency }} ContextDependencyConstructor */
 
-ContextDependencyHelpers.create = (
+/**
+ * @param {ContextDependencyConstructor} Dep the Dependency class
+ * @param {Range} range source range
+ * @param {BasicEvaluatedExpression} param context param
+ * @param {Expression} expr expr
+ * @param {Pick} options options for context creation
+ * @param {PartialContextDependencyOptions} contextOptions options for the ContextModule
+ * @param {JavascriptParser} parser the parser
+ * @param {...EXPECTED_ANY} depArgs depArgs
+ * @returns {ContextDependency} the created Dependency
+ */
+module.exports.create = (
 	Dep,
 	range,
 	param,
 	expr,
 	options,
 	contextOptions,
-	// when parser is not passed in, expressions won't be walked
-	parser = null
+	parser,
+	...depArgs
 ) => {
 	if (param.isTemplateString()) {
-		let prefixRaw = param.quasis[0].string;
-		let postfixRaw =
-			param.quasis.length > 1
-				? param.quasis[param.quasis.length - 1].string
-				: "";
+		const quasis = /** @type {BasicEvaluatedExpression[]} */ (param.quasis);
+		const prefixRaw = /** @type {string} */ (quasis[0].string);
+		const postfixRaw =
+			/** @type {string} */
+			(quasis.length > 1 ? quasis[quasis.length - 1].string : "");
 
-		const valueRange = param.range;
+		const valueRange = /** @type {Range} */ (param.range);
 		const { context, prefix } = splitContextFromPrefix(prefixRaw);
-		const { postfix, query } = splitQueryFromPostfix(postfixRaw);
+		const {
+			path: postfix,
+			query,
+			fragment
+		} = parseResource(postfixRaw, parser);
 
 		// When there are more than two quasis, the generated RegExp can be more precise
 		// We join the quasis with the expression regexp
-		const innerQuasis = param.quasis.slice(1, param.quasis.length - 1);
+		const innerQuasis = quasis.slice(1, -1);
 		const innerRegExp =
-			options.wrappedContextRegExp.source +
+			/** @type {RegExp} */ (options.wrappedContextRegExp).source +
 			innerQuasis
-				.map(q => quotemeta(q.string) + options.wrappedContextRegExp.source)
+				.map(
+					q =>
+						quoteMeta(/** @type {string} */ (q.string)) +
+						/** @type {RegExp} */ (options.wrappedContextRegExp).source
+				)
 				.join("");
 
-		// Example: `./context/pre${e}inner${e}inner2${e}post?query`
+		// Example: `./context/pre${e}inner${e}inner2${e}post?query#frag`
 		// context: "./context"
 		// prefix: "./pre"
 		// innerQuasis: [BEE("inner"), BEE("inner2")]
 		// (BEE = BasicEvaluatedExpression)
 		// postfix: "post"
 		// query: "?query"
+		// fragment: "#frag"
 		// regExp: /^\.\/pre.*inner.*inner2.*post$/
 		const regExp = new RegExp(
-			`^${quotemeta(prefix)}${innerRegExp}${quotemeta(postfix)}$`
+			`^${quoteMeta(prefix)}${innerRegExp}${quoteMeta(postfix)}$`
 		);
 		const dep = new Dep(
-			Object.assign(
-				{
-					request: context + query,
-					recursive: options.wrappedContextRecursive,
-					regExp,
-					mode: "sync"
-				},
-				contextOptions
-			),
+			{
+				request: context + query + fragment,
+				recursive: /** @type {boolean} */ (options.wrappedContextRecursive),
+				regExp,
+				mode: "sync",
+				...contextOptions
+			},
 			range,
-			valueRange
+			valueRange,
+			...depArgs
 		);
-		dep.loc = expr.loc;
+		dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+
+		/** @type {{ value: string, range: Range }[]} */
 		const replaces = [];
+		const parts = /** @type {BasicEvaluatedExpression[]} */ (param.parts);
 
-		param.parts.forEach((part, i) => {
+		for (const [i, part] of parts.entries()) {
 			if (i % 2 === 0) {
 				// Quasis or merged quasi
-				let range = part.range;
-				let value = part.string;
+				let range = /** @type {Range} */ (part.range);
+				let value = /** @type {string} */ (part.string);
 				if (param.templateStringKind === "cooked") {
 					value = JSON.stringify(value);
-					value = value.slice(1, value.length - 1);
+					value = value.slice(1, -1);
 				}
 				if (i === 0) {
 					// prefix
 					value = prefix;
-					range = [param.range[0], part.range[1]];
+					range = [
+						/** @type {Range} */ (param.range)[0],
+						/** @type {Range} */ (part.range)[1]
+					];
 					value =
 						(param.templateStringKind === "cooked" ? "`" : "String.raw`") +
 						value;
-				} else if (i === param.parts.length - 1) {
+				} else if (i === parts.length - 1) {
 					// postfix
 					value = postfix;
-					range = [part.range[0], param.range[1]];
-					value = value + "`";
+					range = [
+						/** @type {Range} */ (part.range)[0],
+						/** @type {Range} */ (param.range)[1]
+					];
+					value = `${value}\``;
 				} else if (
 					part.expression &&
 					part.expression.type === "TemplateElement" &&
 					part.expression.value.raw === value
 				) {
 					// Shortcut when it's a single quasi and doesn't need to be replaced
-					return;
+					continue;
 				}
 				replaces.push({
 					range,
@@ -133,11 +164,12 @@ ContextDependencyHelpers.create = (
 				});
 			} else {
 				// Expression
-				if (parser) {
-					parser.walkExpression(part.expression);
-				}
+				parser.walkExpression(
+					/** @type {Expression} */
+					(part.expression)
+				);
 			}
-		});
+		}
 
 		dep.replaces = replaces;
 		dep.critical =
@@ -149,36 +181,41 @@ ContextDependencyHelpers.create = (
 		((param.prefix && param.prefix.isString()) ||
 			(param.postfix && param.postfix.isString()))
 	) {
-		let prefixRaw =
-			param.prefix && param.prefix.isString() ? param.prefix.string : "";
-		let postfixRaw =
-			param.postfix && param.postfix.isString() ? param.postfix.string : "";
+		const prefixRaw =
+			/** @type {string} */
+			(param.prefix && param.prefix.isString() ? param.prefix.string : "");
+		const postfixRaw =
+			/** @type {string} */
+			(param.postfix && param.postfix.isString() ? param.postfix.string : "");
 		const prefixRange =
 			param.prefix && param.prefix.isString() ? param.prefix.range : null;
 		const postfixRange =
 			param.postfix && param.postfix.isString() ? param.postfix.range : null;
-		const valueRange = param.range;
+		const valueRange = /** @type {Range} */ (param.range);
 		const { context, prefix } = splitContextFromPrefix(prefixRaw);
-		const { postfix, query } = splitQueryFromPostfix(postfixRaw);
+		const {
+			path: postfix,
+			query,
+			fragment
+		} = parseResource(postfixRaw, parser);
 		const regExp = new RegExp(
-			`^${quotemeta(prefix)}${options.wrappedContextRegExp.source}${quotemeta(
-				postfix
-			)}$`
+			`^${quoteMeta(prefix)}${
+				/** @type {RegExp} */ (options.wrappedContextRegExp).source
+			}${quoteMeta(postfix)}$`
 		);
 		const dep = new Dep(
-			Object.assign(
-				{
-					request: context + query,
-					recursive: options.wrappedContextRecursive,
-					regExp,
-					mode: "sync"
-				},
-				contextOptions
-			),
+			{
+				request: context + query + fragment,
+				recursive: /** @type {boolean} */ (options.wrappedContextRecursive),
+				regExp,
+				mode: "sync",
+				...contextOptions
+			},
 			range,
-			valueRange
+			valueRange,
+			...depArgs
 		);
-		dep.loc = expr.loc;
+		dep.loc = /** @type {DependencyLocation} */ (expr.loc);
 		const replaces = [];
 		if (prefixRange) {
 			replaces.push({
@@ -199,34 +236,34 @@ ContextDependencyHelpers.create = (
 
 		if (parser && param.wrappedInnerExpressions) {
 			for (const part of param.wrappedInnerExpressions) {
-				if (part.expression) parser.walkExpression(part.expression);
+				if (part.expression)
+					parser.walkExpression(
+						/** @type {Expression} */
+						(part.expression)
+					);
 			}
 		}
 
 		return dep;
-	} else {
-		const dep = new Dep(
-			Object.assign(
-				{
-					request: options.exprContextRequest,
-					recursive: options.exprContextRecursive,
-					regExp: options.exprContextRegExp,
-					mode: "sync"
-				},
-				contextOptions
-			),
-			range,
-			param.range
-		);
-		dep.loc = expr.loc;
-		dep.critical =
-			options.exprContextCritical &&
-			"the request of a dependency is an expression";
+	}
+	const dep = new Dep(
+		{
+			request: /** @type {string} */ (options.exprContextRequest),
+			recursive: /** @type {boolean} */ (options.exprContextRecursive),
+			regExp: /** @type {RegExp} */ (options.exprContextRegExp),
+			mode: "sync",
+			...contextOptions
+		},
+		range,
+		/** @type {Range} */ (param.range),
+		...depArgs
+	);
+	dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+	dep.critical =
+		options.exprContextCritical &&
+		"the request of a dependency is an expression";
 
-		if (parser) {
-			parser.walkExpression(param.expression);
-		}
+	parser.walkExpression(/** @type {Expression} */ (param.expression));
 
-		return dep;
-	}
+	return dep;
 };
diff --git a/lib/dependencies/ContextDependencyTemplateAsId.js b/lib/dependencies/ContextDependencyTemplateAsId.js
index 1ee83ff9915..b0eb8b2c318 100644
--- a/lib/dependencies/ContextDependencyTemplateAsId.js
+++ b/lib/dependencies/ContextDependencyTemplateAsId.js
@@ -2,16 +2,38 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-class ContextDependencyTemplateAsId {
-	apply(dep, source, runtime) {
-		const moduleExports = runtime.moduleExports({
-			module: dep.module,
-			request: dep.request
+const ContextDependency = require("./ContextDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+
+class ContextDependencyTemplateAsId extends ContextDependency.Template {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(
+		dependency,
+		source,
+		{ runtimeTemplate, moduleGraph, chunkGraph, runtimeRequirements }
+	) {
+		const dep = /** @type {ContextDependency} */ (dependency);
+		const module = moduleGraph.getModule(dep);
+		const moduleExports = runtimeTemplate.moduleExports({
+			module,
+			chunkGraph,
+			request: dep.request,
+			weak: dep.weak,
+			runtimeRequirements
 		});
 
-		if (dep.module) {
+		if (module) {
 			if (dep.valueRange) {
 				if (Array.isArray(dep.replaces)) {
 					for (let i = 0; i < dep.replaces.length; i++) {
@@ -20,13 +42,10 @@ class ContextDependencyTemplateAsId {
 					}
 				}
 				source.replace(dep.valueRange[1], dep.range[1] - 1, ")");
-				// TODO webpack 5 remove `prepend` it's no longer used
 				source.replace(
 					dep.range[0],
 					dep.valueRange[0] - 1,
-					`${moduleExports}.resolve(${
-						typeof dep.prepend === "string" ? JSON.stringify(dep.prepend) : ""
-					}`
+					`${moduleExports}.resolve(`
 				);
 			} else {
 				source.replace(
diff --git a/lib/dependencies/ContextDependencyTemplateAsRequireCall.js b/lib/dependencies/ContextDependencyTemplateAsRequireCall.js
index 6d833ac83f6..8907f9f55d8 100644
--- a/lib/dependencies/ContextDependencyTemplateAsRequireCall.js
+++ b/lib/dependencies/ContextDependencyTemplateAsRequireCall.js
@@ -2,16 +2,39 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-class ContextDependencyTemplateAsRequireCall {
-	apply(dep, source, runtime) {
-		const moduleExports = runtime.moduleExports({
-			module: dep.module,
-			request: dep.request
+const ContextDependency = require("./ContextDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+
+class ContextDependencyTemplateAsRequireCall extends ContextDependency.Template {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(
+		dependency,
+		source,
+		{ runtimeTemplate, moduleGraph, chunkGraph, runtimeRequirements }
+	) {
+		const dep = /** @type {ContextDependency} */ (dependency);
+		let moduleExports = runtimeTemplate.moduleExports({
+			module: moduleGraph.getModule(dep),
+			chunkGraph,
+			request: dep.request,
+			runtimeRequirements
 		});
 
-		if (dep.module) {
+		if (dep.inShorthand) {
+			moduleExports = `${dep.inShorthand}: ${moduleExports}`;
+		}
+		if (moduleGraph.getModule(dep)) {
 			if (dep.valueRange) {
 				if (Array.isArray(dep.replaces)) {
 					for (let i = 0; i < dep.replaces.length; i++) {
@@ -20,13 +43,10 @@ class ContextDependencyTemplateAsRequireCall {
 					}
 				}
 				source.replace(dep.valueRange[1], dep.range[1] - 1, ")");
-				// TODO webpack 5 remove `prepend` it's no longer used
 				source.replace(
 					dep.range[0],
 					dep.valueRange[0] - 1,
-					`${moduleExports}(${
-						typeof dep.prepend === "string" ? JSON.stringify(dep.prepend) : ""
-					}`
+					`${moduleExports}(`
 				);
 			} else {
 				source.replace(dep.range[0], dep.range[1] - 1, moduleExports);
diff --git a/lib/dependencies/ContextElementDependency.js b/lib/dependencies/ContextElementDependency.js
index 258770490ba..abe3d73b796 100644
--- a/lib/dependencies/ContextElementDependency.js
+++ b/lib/dependencies/ContextElementDependency.js
@@ -2,20 +2,134 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const Dependency = require("../Dependency");
+const makeSerializable = require("../util/makeSerializable");
 const ModuleDependency = require("./ModuleDependency");
 
+/** @typedef {import("../ContextModule")} ContextModule */
+/** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+
 class ContextElementDependency extends ModuleDependency {
-	constructor(request, userRequest) {
+	/**
+	 * @param {string} request request
+	 * @param {string | undefined} userRequest user request
+	 * @param {string | undefined} typePrefix type prefix
+	 * @param {string} category category
+	 * @param {(string[][] | null)=} referencedExports referenced exports
+	 * @param {string=} context context
+	 * @param {ImportAttributes=} attributes import assertions
+	 */
+	constructor(
+		request,
+		userRequest,
+		typePrefix,
+		category,
+		referencedExports,
+		context,
+		attributes
+	) {
 		super(request);
+		this.referencedExports = referencedExports;
+		this._typePrefix = typePrefix;
+		this._category = category;
+		this._context = context || undefined;
+
 		if (userRequest) {
 			this.userRequest = userRequest;
 		}
+
+		this.assertions = attributes;
 	}
 
 	get type() {
+		if (this._typePrefix) {
+			return `${this._typePrefix} context element`;
+		}
+
 		return "context element";
 	}
+
+	get category() {
+		return this._category;
+	}
+
+	/**
+	 * Returns list of exports referenced by this dependency
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @param {RuntimeSpec} runtime the runtime for which the module is analysed
+	 * @returns {(string[] | ReferencedExport)[]} referenced exports
+	 */
+	getReferencedExports(moduleGraph, runtime) {
+		if (!this.referencedExports) return Dependency.EXPORTS_OBJECT_REFERENCED;
+		const refs = [];
+		for (const referencedExport of this.referencedExports) {
+			if (
+				this._typePrefix === "import()" &&
+				referencedExport[0] === "default"
+			) {
+				const selfModule =
+					/** @type {ContextModule} */
+					(moduleGraph.getParentModule(this));
+				const importedModule =
+					/** @type {Module} */
+					(moduleGraph.getModule(this));
+				const exportsType = importedModule.getExportsType(
+					moduleGraph,
+					selfModule.options.namespaceObject === "strict"
+				);
+				if (
+					exportsType === "default-only" ||
+					exportsType === "default-with-named"
+				) {
+					return Dependency.EXPORTS_OBJECT_REFERENCED;
+				}
+			}
+			refs.push({
+				name: referencedExport,
+				canMangle: false
+			});
+		}
+		return refs;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this._typePrefix);
+		write(this._category);
+		write(this.referencedExports);
+		write(this.assertions);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this._typePrefix = read();
+		this._category = read();
+		this.referencedExports = read();
+		this.assertions = read();
+		super.deserialize(context);
+	}
 }
 
+makeSerializable(
+	ContextElementDependency,
+	"webpack/lib/dependencies/ContextElementDependency"
+);
+
 module.exports = ContextElementDependency;
diff --git a/lib/dependencies/CreateScriptUrlDependency.js b/lib/dependencies/CreateScriptUrlDependency.js
new file mode 100644
index 00000000000..9abb5c50cf4
--- /dev/null
+++ b/lib/dependencies/CreateScriptUrlDependency.js
@@ -0,0 +1,75 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const makeSerializable = require("../util/makeSerializable");
+const NullDependency = require("./NullDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
+class CreateScriptUrlDependency extends NullDependency {
+	/**
+	 * @param {Range} range range
+	 */
+	constructor(range) {
+		super();
+		this.range = range;
+	}
+
+	get type() {
+		return "create script url";
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.range);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.range = read();
+		super.deserialize(context);
+	}
+}
+
+CreateScriptUrlDependency.Template = class CreateScriptUrlDependencyTemplate extends (
+	NullDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, { runtimeRequirements }) {
+		const dep = /** @type {CreateScriptUrlDependency} */ (dependency);
+
+		runtimeRequirements.add(RuntimeGlobals.createScriptUrl);
+
+		source.insert(dep.range[0], `${RuntimeGlobals.createScriptUrl}(`);
+		source.insert(dep.range[1], ")");
+	}
+};
+
+makeSerializable(
+	CreateScriptUrlDependency,
+	"webpack/lib/dependencies/CreateScriptUrlDependency"
+);
+
+module.exports = CreateScriptUrlDependency;
diff --git a/lib/dependencies/CriticalDependencyWarning.js b/lib/dependencies/CriticalDependencyWarning.js
index 43bd5686e37..3299150bd97 100644
--- a/lib/dependencies/CriticalDependencyWarning.js
+++ b/lib/dependencies/CriticalDependencyWarning.js
@@ -2,19 +2,27 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const WebpackError = require("../WebpackError");
+const makeSerializable = require("../util/makeSerializable");
 
 class CriticalDependencyWarning extends WebpackError {
+	/**
+	 * @param {string} message message
+	 */
 	constructor(message) {
 		super();
 
 		this.name = "CriticalDependencyWarning";
-		this.message = "Critical dependency: " + message;
-
-		Error.captureStackTrace(this, this.constructor);
+		this.message = `Critical dependency: ${message}`;
 	}
 }
 
+makeSerializable(
+	CriticalDependencyWarning,
+	"webpack/lib/dependencies/CriticalDependencyWarning"
+);
+
 module.exports = CriticalDependencyWarning;
diff --git a/lib/dependencies/CssIcssExportDependency.js b/lib/dependencies/CssIcssExportDependency.js
new file mode 100644
index 00000000000..eae414c6403
--- /dev/null
+++ b/lib/dependencies/CssIcssExportDependency.js
@@ -0,0 +1,159 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const { cssExportConvention } = require("../util/conventions");
+const makeSerializable = require("../util/makeSerializable");
+const NullDependency = require("./NullDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../../declarations/WebpackOptions").CssGeneratorExportsConvention} CssGeneratorExportsConvention */
+/** @typedef {import("../CssModule")} CssModule */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").ExportsSpec} ExportsSpec */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../DependencyTemplate").CssDependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../css/CssGenerator")} CssGenerator */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+
+class CssIcssExportDependency extends NullDependency {
+	/**
+	 * @param {string} name name
+	 * @param {string} value value
+	 */
+	constructor(name, value) {
+		super();
+		this.name = name;
+		this.value = value;
+		this._hashUpdate = undefined;
+	}
+
+	get type() {
+		return "css :export";
+	}
+
+	/**
+	 * @param {string} name export name
+	 * @param {CssGeneratorExportsConvention} convention convention of the export name
+	 * @returns {string[]} convention results
+	 */
+	getExportsConventionNames(name, convention) {
+		if (this._conventionNames) {
+			return this._conventionNames;
+		}
+		this._conventionNames = cssExportConvention(name, convention);
+		return this._conventionNames;
+	}
+
+	/**
+	 * Returns the exported names
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {ExportsSpec | undefined} export names
+	 */
+	getExports(moduleGraph) {
+		const module = /** @type {CssModule} */ (moduleGraph.getParentModule(this));
+		const generator = /** @type {CssGenerator} */ (module.generator);
+		const names = this.getExportsConventionNames(
+			this.name,
+			/** @type {CssGeneratorExportsConvention} */
+			(generator.convention)
+		);
+		return {
+			exports: names.map(name => ({
+				name,
+				canMangle: true
+			})),
+			dependencies: undefined
+		};
+	}
+
+	/**
+	 * Update the hash
+	 * @param {Hash} hash hash to be updated
+	 * @param {UpdateHashContext} context context
+	 * @returns {void}
+	 */
+	updateHash(hash, { chunkGraph }) {
+		if (this._hashUpdate === undefined) {
+			const module =
+				/** @type {CssModule} */
+				(chunkGraph.moduleGraph.getParentModule(this));
+			const generator = /** @type {CssGenerator} */ (module.generator);
+			const names = this.getExportsConventionNames(
+				this.name,
+				/** @type {CssGeneratorExportsConvention} */
+				(generator.convention)
+			);
+			this._hashUpdate = JSON.stringify(names);
+		}
+		hash.update("exportsConvention");
+		hash.update(this._hashUpdate);
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.name);
+		write(this.value);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.name = read();
+		this.value = read();
+		super.deserialize(context);
+	}
+}
+
+CssIcssExportDependency.Template = class CssIcssExportDependencyTemplate extends (
+	NullDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, { cssData, module: m, runtime, moduleGraph }) {
+		const dep = /** @type {CssIcssExportDependency} */ (dependency);
+		const module = /** @type {CssModule} */ (m);
+		const generator = /** @type {CssGenerator} */ (module.generator);
+		const names = dep.getExportsConventionNames(
+			dep.name,
+			/** @type {CssGeneratorExportsConvention} */
+			(generator.convention)
+		);
+		const usedNames =
+			/** @type {string[]} */
+			(
+				names
+					.map(name =>
+						moduleGraph.getExportInfo(module, name).getUsedName(name, runtime)
+					)
+					.filter(Boolean)
+			);
+
+		for (const used of usedNames.concat(names)) {
+			cssData.exports.set(used, dep.value);
+		}
+	}
+};
+
+makeSerializable(
+	CssIcssExportDependency,
+	"webpack/lib/dependencies/CssIcssExportDependency"
+);
+
+module.exports = CssIcssExportDependency;
diff --git a/lib/dependencies/CssIcssImportDependency.js b/lib/dependencies/CssIcssImportDependency.js
new file mode 100644
index 00000000000..3bfe6676798
--- /dev/null
+++ b/lib/dependencies/CssIcssImportDependency.js
@@ -0,0 +1,122 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const makeSerializable = require("../util/makeSerializable");
+const CssIcssExportDependency = require("./CssIcssExportDependency");
+const CssLocalIdentifierDependency = require("./CssLocalIdentifierDependency");
+const ModuleDependency = require("./ModuleDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").ExportsSpec} ExportsSpec */
+/** @typedef {import("../DependencyTemplate").CssDependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
+class CssIcssImportDependency extends ModuleDependency {
+	/**
+	 * Example of dependency:
+	 *
+	 *:import('./style.css') { IMPORTED_NAME: v-primary }
+	 * @param {string} request request request path which needs resolving
+	 * @param {string} exportName export name
+	 * @param {Range} range the range of dependency
+	 */
+	constructor(request, exportName, range) {
+		super(request);
+		this.exportName = exportName;
+		this.range = range;
+	}
+
+	get type() {
+		return "css :import";
+	}
+
+	get category() {
+		return "css-import";
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.range);
+		write(this.exportName);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.range = read();
+		this.exportName = read();
+		super.deserialize(context);
+	}
+}
+
+CssIcssImportDependency.Template = class CssIcssImportDependencyTemplate extends (
+	ModuleDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, templateContext) {
+		const dep = /** @type {CssIcssImportDependency} */ (dependency);
+		const { range } = dep;
+		const module =
+			/** @type {Module} */
+			(templateContext.moduleGraph.getModule(dep));
+		let value;
+
+		for (const item of module.dependencies) {
+			if (
+				item instanceof CssLocalIdentifierDependency &&
+				dep.exportName === item.name
+			) {
+				value = CssLocalIdentifierDependency.Template.getIdentifier(
+					item,
+					dep.exportName,
+					{
+						...templateContext,
+						module
+					}
+				);
+				break;
+			} else if (
+				item instanceof CssIcssExportDependency &&
+				dep.exportName === item.name
+			) {
+				value = item.value;
+				break;
+			}
+		}
+
+		if (!value) {
+			throw new Error(
+				`Imported '${dep.exportName}' name from '${dep.request}' not found`
+			);
+		}
+
+		source.replace(range[0], range[1], value);
+	}
+};
+
+makeSerializable(
+	CssIcssImportDependency,
+	"webpack/lib/dependencies/CssIcssImportDependency"
+);
+
+module.exports = CssIcssImportDependency;
diff --git a/lib/dependencies/CssIcssSymbolDependency.js b/lib/dependencies/CssIcssSymbolDependency.js
new file mode 100644
index 00000000000..298e5d1cdc5
--- /dev/null
+++ b/lib/dependencies/CssIcssSymbolDependency.js
@@ -0,0 +1,132 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Alexander Akait @alexander-akait
+*/
+
+"use strict";
+
+const makeSerializable = require("../util/makeSerializable");
+const NullDependency = require("./NullDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").ExportsSpec} ExportsSpec */
+/** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../DependencyTemplate").CssDependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../css/CssParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+
+class CssIcssSymbolDependency extends NullDependency {
+	/**
+	 * @param {string} name name
+	 * @param {string} value value
+	 * @param {Range} range range
+	 */
+	constructor(name, value, range) {
+		super();
+		this.name = name;
+		this.value = value;
+		this.range = range;
+		this._hashUpdate = undefined;
+	}
+
+	get type() {
+		return "css @value identifier";
+	}
+
+	get category() {
+		return "self";
+	}
+
+	/**
+	 * Update the hash
+	 * @param {Hash} hash hash to be updated
+	 * @param {UpdateHashContext} context context
+	 * @returns {void}
+	 */
+	updateHash(hash, context) {
+		if (this._hashUpdate === undefined) {
+			this._hashUpdate = `${this.range}${this.name}${this.value}`;
+		}
+		hash.update(this._hashUpdate);
+	}
+
+	/**
+	 * Returns the exported names
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {ExportsSpec | undefined} export names
+	 */
+	getExports(moduleGraph) {
+		return {
+			exports: [
+				{
+					name: this.name,
+					canMangle: true
+				}
+			],
+			dependencies: undefined
+		};
+	}
+
+	/**
+	 * Returns list of exports referenced by this dependency
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @param {RuntimeSpec} runtime the runtime for which the module is analysed
+	 * @returns {(string[] | ReferencedExport)[]} referenced exports
+	 */
+	getReferencedExports(moduleGraph, runtime) {
+		return [[this.name]];
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.name);
+		write(this.value);
+		write(this.range);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.name = read();
+		this.value = read();
+		this.range = read();
+		super.deserialize(context);
+	}
+}
+
+CssIcssSymbolDependency.Template = class CssValueAtRuleDependencyTemplate extends (
+	NullDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, { cssData }) {
+		const dep = /** @type {CssIcssSymbolDependency} */ (dependency);
+
+		source.replace(dep.range[0], dep.range[1] - 1, dep.value);
+
+		cssData.exports.set(dep.name, dep.value);
+	}
+};
+
+makeSerializable(
+	CssIcssSymbolDependency,
+	"webpack/lib/dependencies/CssIcssSymbolDependency"
+);
+
+module.exports = CssIcssSymbolDependency;
diff --git a/lib/dependencies/CssImportDependency.js b/lib/dependencies/CssImportDependency.js
new file mode 100644
index 00000000000..b6a0772d2ba
--- /dev/null
+++ b/lib/dependencies/CssImportDependency.js
@@ -0,0 +1,117 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const makeSerializable = require("../util/makeSerializable");
+const ModuleDependency = require("./ModuleDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */
+/** @typedef {import("../ModuleGraphConnection").ConnectionState} ConnectionState */
+/** @typedef {import("../css/CssParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+
+class CssImportDependency extends ModuleDependency {
+	/**
+	 * Example of dependency:
+	 * \@import url("landscape.css") layer(forms) screen and (orientation: landscape) screen and (orientation: landscape);
+	 * @param {string} request request
+	 * @param {Range} range range of the argument
+	 * @param {string | undefined} layer layer
+	 * @param {string | undefined} supports list of supports conditions
+	 * @param {string | undefined} media list of media conditions
+	 */
+	constructor(request, range, layer, supports, media) {
+		super(request);
+		this.range = range;
+		this.layer = layer;
+		this.supports = supports;
+		this.media = media;
+	}
+
+	get type() {
+		return "css @import";
+	}
+
+	get category() {
+		return "css-import";
+	}
+
+	/**
+	 * @returns {string | null} an identifier to merge equal requests
+	 */
+	getResourceIdentifier() {
+		let str = `context${this._context || ""}|module${this.request}`;
+
+		if (this.layer) {
+			str += `|layer${this.layer}`;
+		}
+
+		if (this.supports) {
+			str += `|supports${this.supports}`;
+		}
+
+		if (this.media) {
+			str += `|media${this.media}`;
+		}
+
+		return str;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.layer);
+		write(this.supports);
+		write(this.media);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.layer = read();
+		this.supports = read();
+		this.media = read();
+		super.deserialize(context);
+	}
+}
+
+CssImportDependency.Template = class CssImportDependencyTemplate extends (
+	ModuleDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, templateContext) {
+		const dep = /** @type {CssImportDependency} */ (dependency);
+
+		source.replace(dep.range[0], dep.range[1] - 1, "");
+	}
+};
+
+makeSerializable(
+	CssImportDependency,
+	"webpack/lib/dependencies/CssImportDependency"
+);
+
+module.exports = CssImportDependency;
diff --git a/lib/dependencies/CssLocalIdentifierDependency.js b/lib/dependencies/CssLocalIdentifierDependency.js
new file mode 100644
index 00000000000..21e76e8b25b
--- /dev/null
+++ b/lib/dependencies/CssLocalIdentifierDependency.js
@@ -0,0 +1,253 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const { cssExportConvention } = require("../util/conventions");
+const createHash = require("../util/createHash");
+const { makePathsRelative } = require("../util/identifier");
+const makeSerializable = require("../util/makeSerializable");
+const memoize = require("../util/memoize");
+const NullDependency = require("./NullDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../../declarations/WebpackOptions").CssGeneratorExportsConvention} CssGeneratorExportsConvention */
+/** @typedef {import("../../declarations/WebpackOptions").CssGeneratorLocalIdentName} CssGeneratorLocalIdentName */
+/** @typedef {import("../../declarations/WebpackOptions").HashFunction} HashFunction */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../CssModule")} CssModule */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").ExportsSpec} ExportsSpec */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../DependencyTemplate").CssDependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../NormalModuleFactory").ResourceDataWithData} ResourceDataWithData */
+/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
+/** @typedef {import("../css/CssGenerator")} CssGenerator */
+/** @typedef {import("../css/CssParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+
+const getCssParser = memoize(() => require("../css/CssParser"));
+
+/**
+ * @param {string} local css local
+ * @param {CssModule} module module
+ * @param {ChunkGraph} chunkGraph chunk graph
+ * @param {RuntimeTemplate} runtimeTemplate runtime template
+ * @returns {string} local ident
+ */
+const getLocalIdent = (local, module, chunkGraph, runtimeTemplate) => {
+	const generator = /** @type {CssGenerator} */ (module.generator);
+	const localIdentName =
+		/** @type {CssGeneratorLocalIdentName} */
+		(generator.localIdentName);
+	const relativeResourcePath = makePathsRelative(
+		/** @type {string} */
+		(module.context),
+		module.matchResource || module.resource,
+		runtimeTemplate.compilation.compiler.root
+	);
+	const { hashFunction, hashDigest, hashDigestLength, hashSalt, uniqueName } =
+		runtimeTemplate.outputOptions;
+	const hash = createHash(/** @type {HashFunction} */ (hashFunction));
+
+	if (hashSalt) {
+		hash.update(hashSalt);
+	}
+
+	hash.update(relativeResourcePath);
+
+	if (!/\[local\]/.test(localIdentName)) {
+		hash.update(local);
+	}
+
+	const localIdentHash =
+		/** @type {string} */
+		(hash.digest(hashDigest)).slice(0, hashDigestLength);
+
+	return runtimeTemplate.compilation
+		.getPath(localIdentName, {
+			filename: relativeResourcePath,
+			hash: localIdentHash,
+			contentHash: localIdentHash,
+			chunkGraph,
+			module
+		})
+		.replace(/\[local\]/g, local)
+		.replace(/\[uniqueName\]/g, /** @type {string} */ (uniqueName))
+		.replace(/^((-?[0-9])|--)/, "_$1");
+};
+
+class CssLocalIdentifierDependency extends NullDependency {
+	/**
+	 * @param {string} name name
+	 * @param {Range} range range
+	 * @param {string=} prefix prefix
+	 */
+	constructor(name, range, prefix = "") {
+		super();
+		this.name = name;
+		this.range = range;
+		this.prefix = prefix;
+		this._conventionNames = undefined;
+		this._hashUpdate = undefined;
+	}
+
+	get type() {
+		return "css local identifier";
+	}
+
+	/**
+	 * @param {string} name export name
+	 * @param {CssGeneratorExportsConvention} convention convention of the export name
+	 * @returns {string[]} convention results
+	 */
+	getExportsConventionNames(name, convention) {
+		if (this._conventionNames) {
+			return this._conventionNames;
+		}
+		this._conventionNames = cssExportConvention(this.name, convention);
+		return this._conventionNames;
+	}
+
+	/**
+	 * Returns the exported names
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {ExportsSpec | undefined} export names
+	 */
+	getExports(moduleGraph) {
+		const module = /** @type {CssModule} */ (moduleGraph.getParentModule(this));
+		const generator = /** @type {CssGenerator} */ (module.generator);
+		const names = this.getExportsConventionNames(
+			this.name,
+			/** @type {CssGeneratorExportsConvention} */ (generator.convention)
+		);
+		return {
+			exports: names.map(name => ({
+				name,
+				canMangle: true
+			})),
+			dependencies: undefined
+		};
+	}
+
+	/**
+	 * Update the hash
+	 * @param {Hash} hash hash to be updated
+	 * @param {UpdateHashContext} context context
+	 * @returns {void}
+	 */
+	updateHash(hash, { chunkGraph }) {
+		if (this._hashUpdate === undefined) {
+			const module =
+				/** @type {CssModule} */
+				(chunkGraph.moduleGraph.getParentModule(this));
+			const generator = /** @type {CssGenerator} */ (module.generator);
+			const names = this.getExportsConventionNames(
+				this.name,
+				/** @type {CssGeneratorExportsConvention} */
+				(generator.convention)
+			);
+			this._hashUpdate = `exportsConvention|${JSON.stringify(names)}|localIdentName|${JSON.stringify(generator.localIdentName)}`;
+		}
+		hash.update(this._hashUpdate);
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.name);
+		write(this.range);
+		write(this.prefix);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.name = read();
+		this.range = read();
+		this.prefix = read();
+		super.deserialize(context);
+	}
+}
+
+CssLocalIdentifierDependency.Template = class CssLocalIdentifierDependencyTemplate extends (
+	NullDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {string} local local name
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {string} identifier
+	 */
+	static getIdentifier(
+		dependency,
+		local,
+		{ module: m, chunkGraph, runtimeTemplate }
+	) {
+		const dep = /** @type {CssLocalIdentifierDependency} */ (dependency);
+		const module = /** @type {CssModule} */ (m);
+
+		return (
+			dep.prefix +
+			getCssParser().escapeIdentifier(
+				getLocalIdent(local, module, chunkGraph, runtimeTemplate)
+			)
+		);
+	}
+
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, templateContext) {
+		const { module: m, moduleGraph, runtime, cssData } = templateContext;
+		const dep = /** @type {CssLocalIdentifierDependency} */ (dependency);
+		const module = /** @type {CssModule} */ (m);
+		const generator = /** @type {CssGenerator} */ (module.generator);
+		const names = dep.getExportsConventionNames(
+			dep.name,
+			/** @type {CssGeneratorExportsConvention} */
+			(generator.convention)
+		);
+		const usedNames =
+			/** @type {(string)[]} */
+			(
+				names
+					.map(name =>
+						moduleGraph.getExportInfo(module, name).getUsedName(name, runtime)
+					)
+					.filter(Boolean)
+			);
+		const local = usedNames.length === 0 ? names[0] : usedNames[0];
+		const identifier = CssLocalIdentifierDependencyTemplate.getIdentifier(
+			dep,
+			local,
+			templateContext
+		);
+
+		source.replace(dep.range[0], dep.range[1] - 1, identifier);
+
+		for (const used of usedNames.concat(names)) {
+			cssData.exports.set(used, getCssParser().unescapeIdentifier(identifier));
+		}
+	}
+};
+
+makeSerializable(
+	CssLocalIdentifierDependency,
+	"webpack/lib/dependencies/CssLocalIdentifierDependency"
+);
+
+module.exports = CssLocalIdentifierDependency;
diff --git a/lib/dependencies/CssSelfLocalIdentifierDependency.js b/lib/dependencies/CssSelfLocalIdentifierDependency.js
new file mode 100644
index 00000000000..b63ff53a74e
--- /dev/null
+++ b/lib/dependencies/CssSelfLocalIdentifierDependency.js
@@ -0,0 +1,111 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const Dependency = require("../Dependency");
+const makeSerializable = require("../util/makeSerializable");
+const CssLocalIdentifierDependency = require("./CssLocalIdentifierDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency").ExportsSpec} ExportsSpec */
+/** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
+/** @typedef {import("../DependencyTemplate").CssDependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../css/CssParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+
+class CssSelfLocalIdentifierDependency extends CssLocalIdentifierDependency {
+	/**
+	 * @param {string} name name
+	 * @param {Range} range range
+	 * @param {string=} prefix prefix
+	 * @param {Set=} declaredSet set of declared names (will only be active when in declared set)
+	 */
+	constructor(name, range, prefix = "", declaredSet = undefined) {
+		super(name, range, prefix);
+		this.declaredSet = declaredSet;
+	}
+
+	get type() {
+		return "css self local identifier";
+	}
+
+	get category() {
+		return "self";
+	}
+
+	/**
+	 * @returns {string | null} an identifier to merge equal requests
+	 */
+	getResourceIdentifier() {
+		return "self";
+	}
+
+	/**
+	 * Returns the exported names
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {ExportsSpec | undefined} export names
+	 */
+	getExports(moduleGraph) {
+		if (this.declaredSet && !this.declaredSet.has(this.name)) return;
+		return super.getExports(moduleGraph);
+	}
+
+	/**
+	 * Returns list of exports referenced by this dependency
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @param {RuntimeSpec} runtime the runtime for which the module is analysed
+	 * @returns {(string[] | ReferencedExport)[]} referenced exports
+	 */
+	getReferencedExports(moduleGraph, runtime) {
+		if (this.declaredSet && !this.declaredSet.has(this.name))
+			return Dependency.NO_EXPORTS_REFERENCED;
+		return [[this.name]];
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.declaredSet);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.declaredSet = read();
+		super.deserialize(context);
+	}
+}
+
+CssSelfLocalIdentifierDependency.Template = class CssSelfLocalIdentifierDependencyTemplate extends (
+	CssLocalIdentifierDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, templateContext) {
+		const dep = /** @type {CssSelfLocalIdentifierDependency} */ (dependency);
+		if (dep.declaredSet && !dep.declaredSet.has(dep.name)) return;
+		super.apply(dependency, source, templateContext);
+	}
+};
+
+makeSerializable(
+	CssSelfLocalIdentifierDependency,
+	"webpack/lib/dependencies/CssSelfLocalIdentifierDependency"
+);
+
+module.exports = CssSelfLocalIdentifierDependency;
diff --git a/lib/dependencies/CssUrlDependency.js b/lib/dependencies/CssUrlDependency.js
new file mode 100644
index 00000000000..ad3ec31feef
--- /dev/null
+++ b/lib/dependencies/CssUrlDependency.js
@@ -0,0 +1,195 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const RawDataUrlModule = require("../asset/RawDataUrlModule");
+const makeSerializable = require("../util/makeSerializable");
+const memoize = require("../util/memoize");
+const ModuleDependency = require("./ModuleDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../CodeGenerationResults")} CodeGenerationResults */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../Module").CodeGenerationResult} CodeGenerationResult */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */
+/** @typedef {import("../ModuleGraphConnection").ConnectionState} ConnectionState */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+
+const getIgnoredRawDataUrlModule = memoize(
+	() => new RawDataUrlModule("data:,", "ignored-asset", "(ignored asset)")
+);
+
+class CssUrlDependency extends ModuleDependency {
+	/**
+	 * @param {string} request request
+	 * @param {Range} range range of the argument
+	 * @param {"string" | "url" | "src"} urlType dependency type e.g. url() or string
+	 */
+	constructor(request, range, urlType) {
+		super(request);
+		this.range = range;
+		this.urlType = urlType;
+	}
+
+	get type() {
+		return "css url()";
+	}
+
+	get category() {
+		return "url";
+	}
+
+	/**
+	 * @param {string} context context directory
+	 * @returns {Module} ignored module
+	 */
+	createIgnoredModule(context) {
+		return getIgnoredRawDataUrlModule();
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.urlType);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.urlType = read();
+		super.deserialize(context);
+	}
+}
+
+/**
+ * @param {string} str string
+ * @returns {string} string in quotes if needed
+ */
+const cssEscapeString = str => {
+	let countWhiteOrBracket = 0;
+	let countQuotation = 0;
+	let countApostrophe = 0;
+	for (let i = 0; i < str.length; i++) {
+		const cc = str.charCodeAt(i);
+		switch (cc) {
+			case 9: // tab
+			case 10: // nl
+			case 32: // space
+			case 40: // (
+			case 41: // )
+				countWhiteOrBracket++;
+				break;
+			case 34:
+				countQuotation++;
+				break;
+			case 39:
+				countApostrophe++;
+				break;
+		}
+	}
+	if (countWhiteOrBracket < 2) {
+		return str.replace(/[\n\t ()'"\\]/g, m => `\\${m}`);
+	} else if (countQuotation <= countApostrophe) {
+		return `"${str.replace(/[\n"\\]/g, m => `\\${m}`)}"`;
+	}
+	return `'${str.replace(/[\n'\\]/g, m => `\\${m}`)}'`;
+};
+
+CssUrlDependency.Template = class CssUrlDependencyTemplate extends (
+	ModuleDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(
+		dependency,
+		source,
+		{ moduleGraph, runtimeTemplate, codeGenerationResults }
+	) {
+		const dep = /** @type {CssUrlDependency} */ (dependency);
+		const module = /** @type {Module} */ (moduleGraph.getModule(dep));
+
+		/** @type {string | undefined} */
+		let newValue;
+
+		switch (dep.urlType) {
+			case "string":
+				newValue = cssEscapeString(
+					this.assetUrl({
+						module,
+						codeGenerationResults
+					})
+				);
+				break;
+			case "url":
+				newValue = `url(${cssEscapeString(
+					this.assetUrl({
+						module,
+						codeGenerationResults
+					})
+				)})`;
+				break;
+			case "src":
+				newValue = `src(${cssEscapeString(
+					this.assetUrl({
+						module,
+						codeGenerationResults
+					})
+				)})`;
+				break;
+		}
+
+		source.replace(
+			dep.range[0],
+			dep.range[1] - 1,
+			/** @type {string} */ (newValue)
+		);
+	}
+
+	/**
+	 * @param {object} options options object
+	 * @param {Module} options.module the module
+	 * @param {RuntimeSpec=} options.runtime runtime
+	 * @param {CodeGenerationResults} options.codeGenerationResults the code generation results
+	 * @returns {string} the url of the asset
+	 */
+	assetUrl({ runtime, module, codeGenerationResults }) {
+		if (!module) {
+			return "data:,";
+		}
+		const codeGen = codeGenerationResults.get(module, runtime);
+		const data =
+			/** @type {NonNullable} */
+			(codeGen.data);
+		if (!data) return "data:,";
+		const url = data.get("url");
+		if (!url || !url["css-url"]) return "data:,";
+		return url["css-url"];
+	}
+};
+
+makeSerializable(CssUrlDependency, "webpack/lib/dependencies/CssUrlDependency");
+
+CssUrlDependency.PUBLIC_PATH_AUTO = "__WEBPACK_CSS_PUBLIC_PATH_AUTO__";
+
+module.exports = CssUrlDependency;
diff --git a/lib/dependencies/DelegatedExportsDependency.js b/lib/dependencies/DelegatedExportsDependency.js
deleted file mode 100644
index fcacedb4283..00000000000
--- a/lib/dependencies/DelegatedExportsDependency.js
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const DependencyReference = require("./DependencyReference");
-const NullDependency = require("./NullDependency");
-
-class DelegatedExportsDependency extends NullDependency {
-	constructor(originModule, exports) {
-		super();
-		this.originModule = originModule;
-		this.exports = exports;
-	}
-
-	get type() {
-		return "delegated exports";
-	}
-
-	getReference() {
-		return new DependencyReference(this.originModule, true, false);
-	}
-
-	getExports() {
-		return {
-			exports: this.exports,
-			dependencies: undefined
-		};
-	}
-}
-
-module.exports = DelegatedExportsDependency;
diff --git a/lib/dependencies/DelegatedSourceDependency.js b/lib/dependencies/DelegatedSourceDependency.js
index 7b0b9de5e59..737f60e7727 100644
--- a/lib/dependencies/DelegatedSourceDependency.js
+++ b/lib/dependencies/DelegatedSourceDependency.js
@@ -2,10 +2,16 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const makeSerializable = require("../util/makeSerializable");
 const ModuleDependency = require("./ModuleDependency");
 
 class DelegatedSourceDependency extends ModuleDependency {
+	/**
+	 * @param {string} request the request string
+	 */
 	constructor(request) {
 		super(request);
 	}
@@ -13,6 +19,15 @@ class DelegatedSourceDependency extends ModuleDependency {
 	get type() {
 		return "delegated source";
 	}
+
+	get category() {
+		return "esm";
+	}
 }
 
+makeSerializable(
+	DelegatedSourceDependency,
+	"webpack/lib/dependencies/DelegatedSourceDependency"
+);
+
 module.exports = DelegatedSourceDependency;
diff --git a/lib/dependencies/DependencyReference.js b/lib/dependencies/DependencyReference.js
deleted file mode 100644
index a8f6afae069..00000000000
--- a/lib/dependencies/DependencyReference.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Florent Cailhol @ooflorent
-*/
-"use strict";
-
-/** @typedef {import("../Module")} Module */
-
-class DependencyReference {
-	// TODO webpack 5: module must be dynamic, you must pass a function returning a module
-	// This is needed to remove the hack in ConcatenatedModule
-	// The problem is that the `module` in Dependency could be replaced i. e. because of Scope Hoisting
-	/**
-	 *
-	 * @param {Module} module the referenced module
-	 * @param {string[] | boolean} importedNames imported named from the module
-	 * @param {boolean=} weak if this is a weak reference
-	 * @param {number} order the order information or NaN if don't care
-	 */
-	constructor(module, importedNames, weak = false, order = NaN) {
-		// TODO webpack 5: make it a getter
-		this.module = module;
-		// true: full object
-		// false: only sideeffects/no export
-		// array of strings: the exports with this names
-		this.importedNames = importedNames;
-		this.weak = !!weak;
-		this.order = order;
-	}
-
-	/**
-	 * @param {DependencyReference[]} array an array (will be modified)
-	 * @returns {DependencyReference[]} the array again
-	 */
-	static sort(array) {
-		/** @type {WeakMap} */
-		const originalOrder = new WeakMap();
-		let i = 0;
-		for (const ref of array) {
-			originalOrder.set(ref, i++);
-		}
-		return array.sort((a, b) => {
-			const aOrder = a.order;
-			const bOrder = b.order;
-			if (isNaN(aOrder)) {
-				if (!isNaN(bOrder)) {
-					return 1;
-				}
-			} else {
-				if (isNaN(bOrder)) {
-					return -1;
-				}
-				if (aOrder !== bOrder) {
-					return aOrder - bOrder;
-				}
-			}
-			const aOrg = originalOrder.get(a);
-			const bOrg = originalOrder.get(b);
-			return aOrg - bOrg;
-		});
-	}
-}
-
-module.exports = DependencyReference;
diff --git a/lib/dependencies/DllEntryDependency.js b/lib/dependencies/DllEntryDependency.js
index 47c6acc0a4a..74697042150 100644
--- a/lib/dependencies/DllEntryDependency.js
+++ b/lib/dependencies/DllEntryDependency.js
@@ -2,12 +2,24 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
 const Dependency = require("../Dependency");
+const makeSerializable = require("../util/makeSerializable");
+
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("./EntryDependency")} EntryDependency */
 
 class DllEntryDependency extends Dependency {
+	/**
+	 * @param {EntryDependency[]} dependencies dependencies
+	 * @param {string} name name
+	 */
 	constructor(dependencies, name) {
 		super();
+
 		this.dependencies = dependencies;
 		this.name = name;
 	}
@@ -15,6 +27,35 @@ class DllEntryDependency extends Dependency {
 	get type() {
 		return "dll entry";
 	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+
+		write(this.dependencies);
+		write(this.name);
+
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+
+		this.dependencies = read();
+		this.name = read();
+
+		super.deserialize(context);
+	}
 }
 
+makeSerializable(
+	DllEntryDependency,
+	"webpack/lib/dependencies/DllEntryDependency"
+);
+
 module.exports = DllEntryDependency;
diff --git a/lib/dependencies/DynamicExports.js b/lib/dependencies/DynamicExports.js
new file mode 100644
index 00000000000..cdc5e9c9820
--- /dev/null
+++ b/lib/dependencies/DynamicExports.js
@@ -0,0 +1,73 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
+/** @typedef {import("../Parser").ParserState} ParserState */
+
+/** @type {WeakMap} */
+const parserStateExportsState = new WeakMap();
+
+/**
+ * @param {ParserState} parserState parser state
+ * @returns {void}
+ */
+module.exports.bailout = parserState => {
+	const value = parserStateExportsState.get(parserState);
+	parserStateExportsState.set(parserState, false);
+	if (value === true) {
+		const buildMeta = /** @type {BuildMeta} */ (parserState.module.buildMeta);
+		buildMeta.exportsType = undefined;
+		buildMeta.defaultObject = false;
+	}
+};
+
+/**
+ * @param {ParserState} parserState parser state
+ * @returns {void}
+ */
+module.exports.enable = parserState => {
+	const value = parserStateExportsState.get(parserState);
+	if (value === false) return;
+	parserStateExportsState.set(parserState, true);
+	if (value !== true) {
+		const buildMeta = /** @type {BuildMeta} */ (parserState.module.buildMeta);
+		buildMeta.exportsType = "default";
+		buildMeta.defaultObject = "redirect";
+	}
+};
+
+/**
+ * @param {ParserState} parserState parser state
+ * @returns {void}
+ */
+module.exports.setFlagged = parserState => {
+	const value = parserStateExportsState.get(parserState);
+	if (value !== true) return;
+	const buildMeta = /** @type {BuildMeta} */ (parserState.module.buildMeta);
+	if (buildMeta.exportsType === "dynamic") return;
+	buildMeta.exportsType = "flagged";
+};
+
+/**
+ * @param {ParserState} parserState parser state
+ * @returns {void}
+ */
+module.exports.setDynamic = parserState => {
+	const value = parserStateExportsState.get(parserState);
+	if (value !== true) return;
+	/** @type {BuildMeta} */
+	(parserState.module.buildMeta).exportsType = "dynamic";
+};
+
+/**
+ * @param {ParserState} parserState parser state
+ * @returns {boolean} true, when enabled
+ */
+module.exports.isEnabled = parserState => {
+	const value = parserStateExportsState.get(parserState);
+	return value === true;
+};
diff --git a/lib/dependencies/EntryDependency.js b/lib/dependencies/EntryDependency.js
new file mode 100644
index 00000000000..f46444945b7
--- /dev/null
+++ b/lib/dependencies/EntryDependency.js
@@ -0,0 +1,30 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const makeSerializable = require("../util/makeSerializable");
+const ModuleDependency = require("./ModuleDependency");
+
+class EntryDependency extends ModuleDependency {
+	/**
+	 * @param {string} request request path for entry
+	 */
+	constructor(request) {
+		super(request);
+	}
+
+	get type() {
+		return "entry";
+	}
+
+	get category() {
+		return "esm";
+	}
+}
+
+makeSerializable(EntryDependency, "webpack/lib/dependencies/EntryDependency");
+
+module.exports = EntryDependency;
diff --git a/lib/dependencies/ExportsInfoDependency.js b/lib/dependencies/ExportsInfoDependency.js
new file mode 100644
index 00000000000..7fa1a4f56a3
--- /dev/null
+++ b/lib/dependencies/ExportsInfoDependency.js
@@ -0,0 +1,163 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { UsageState } = require("../ExportsInfo");
+const makeSerializable = require("../util/makeSerializable");
+const NullDependency = require("./NullDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+
+/**
+ * @template T
+ * @typedef {import("../util/SortableSet")} SortableSet
+ */
+
+/**
+ * @param {ModuleGraph} moduleGraph the module graph
+ * @param {Module} module the module
+ * @param {string[] | null} _exportName name of the export if any
+ * @param {string | null} property name of the requested property
+ * @param {RuntimeSpec} runtime for which runtime
+ * @returns {undefined | null | number | boolean | string[] | SortableSet} value of the property
+ */
+const getProperty = (moduleGraph, module, _exportName, property, runtime) => {
+	if (!_exportName) {
+		switch (property) {
+			case "usedExports": {
+				const usedExports = moduleGraph
+					.getExportsInfo(module)
+					.getUsedExports(runtime);
+				if (
+					typeof usedExports === "boolean" ||
+					usedExports === undefined ||
+					usedExports === null
+				) {
+					return usedExports;
+				}
+				return Array.from(usedExports).sort();
+			}
+		}
+	}
+	const exportName = /** @type {string[]} */ (_exportName);
+	switch (property) {
+		case "canMangle": {
+			const exportsInfo = moduleGraph.getExportsInfo(module);
+			const exportInfo = exportsInfo.getReadOnlyExportInfoRecursive(exportName);
+			if (exportInfo) return exportInfo.canMangle;
+			return exportsInfo.otherExportsInfo.canMangle;
+		}
+		case "used":
+			return (
+				moduleGraph.getExportsInfo(module).getUsed(exportName, runtime) !==
+				UsageState.Unused
+			);
+		case "useInfo": {
+			const state = moduleGraph
+				.getExportsInfo(module)
+				.getUsed(exportName, runtime);
+			switch (state) {
+				case UsageState.Used:
+				case UsageState.OnlyPropertiesUsed:
+					return true;
+				case UsageState.Unused:
+					return false;
+				case UsageState.NoInfo:
+					return;
+				case UsageState.Unknown:
+					return null;
+				default:
+					throw new Error(`Unexpected UsageState ${state}`);
+			}
+		}
+		case "provideInfo":
+			return moduleGraph.getExportsInfo(module).isExportProvided(exportName);
+	}
+};
+
+class ExportsInfoDependency extends NullDependency {
+	/**
+	 * @param {Range} range range
+	 * @param {string[] | null} exportName export name
+	 * @param {string | null} property property
+	 */
+	constructor(range, exportName, property) {
+		super();
+		this.range = range;
+		this.exportName = exportName;
+		this.property = property;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.range);
+		write(this.exportName);
+		write(this.property);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 * @returns {ExportsInfoDependency} ExportsInfoDependency
+	 */
+	static deserialize(context) {
+		const obj = new ExportsInfoDependency(
+			context.read(),
+			context.read(),
+			context.read()
+		);
+		obj.deserialize(context);
+		return obj;
+	}
+}
+
+makeSerializable(
+	ExportsInfoDependency,
+	"webpack/lib/dependencies/ExportsInfoDependency"
+);
+
+ExportsInfoDependency.Template = class ExportsInfoDependencyTemplate extends (
+	NullDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, { module, moduleGraph, runtime }) {
+		const dep = /** @type {ExportsInfoDependency} */ (dependency);
+
+		const value = getProperty(
+			moduleGraph,
+			module,
+			dep.exportName,
+			dep.property,
+			runtime
+		);
+		source.replace(
+			dep.range[0],
+			dep.range[1] - 1,
+			value === undefined ? "undefined" : JSON.stringify(value)
+		);
+	}
+};
+
+module.exports = ExportsInfoDependency;
diff --git a/lib/dependencies/ExternalModuleDependency.js b/lib/dependencies/ExternalModuleDependency.js
new file mode 100644
index 00000000000..ce3e3785846
--- /dev/null
+++ b/lib/dependencies/ExternalModuleDependency.js
@@ -0,0 +1,109 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const makeSerializable = require("../util/makeSerializable");
+const CachedConstDependency = require("./CachedConstDependency");
+const ExternalModuleInitFragment = require("./ExternalModuleInitFragment");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../javascript/JavascriptModulesPlugin").ChunkRenderContext} ChunkRenderContext */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+
+class ExternalModuleDependency extends CachedConstDependency {
+	/**
+	 * @param {string} module module
+	 * @param {{ name: string, value: string }[]} importSpecifiers import specifiers
+	 * @param {string | undefined} defaultImport default import
+	 * @param {string} expression expression
+	 * @param {Range} range range
+	 * @param {string} identifier identifier
+	 */
+	constructor(
+		module,
+		importSpecifiers,
+		defaultImport,
+		expression,
+		range,
+		identifier
+	) {
+		super(expression, range, identifier);
+
+		this.importedModule = module;
+		this.specifiers = importSpecifiers;
+		this.default = defaultImport;
+	}
+
+	/**
+	 * @returns {string} hash update
+	 */
+	_createHashUpdate() {
+		return `${this.importedModule}${JSON.stringify(this.specifiers)}${
+			this.default || "null"
+		}${super._createHashUpdate()}`;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		super.serialize(context);
+		const { write } = context;
+		write(this.importedModule);
+		write(this.specifiers);
+		write(this.default);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		super.deserialize(context);
+		const { read } = context;
+		this.importedModule = read();
+		this.specifiers = read();
+		this.default = read();
+	}
+}
+
+makeSerializable(
+	ExternalModuleDependency,
+	"webpack/lib/dependencies/ExternalModuleDependency"
+);
+
+ExternalModuleDependency.Template = class ExternalModuleDependencyTemplate extends (
+	CachedConstDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, templateContext) {
+		super.apply(dependency, source, templateContext);
+		const dep = /** @type {ExternalModuleDependency} */ (dependency);
+		const { chunkInitFragments, runtimeTemplate } = templateContext;
+
+		chunkInitFragments.push(
+			new ExternalModuleInitFragment(
+				`${runtimeTemplate.supportNodePrefixForCoreModules() ? "node:" : ""}${
+					dep.importedModule
+				}`,
+				dep.specifiers,
+				dep.default
+			)
+		);
+	}
+};
+
+module.exports = ExternalModuleDependency;
diff --git a/lib/dependencies/ExternalModuleInitFragment.js b/lib/dependencies/ExternalModuleInitFragment.js
new file mode 100644
index 00000000000..41bbe538e14
--- /dev/null
+++ b/lib/dependencies/ExternalModuleInitFragment.js
@@ -0,0 +1,133 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const InitFragment = require("../InitFragment");
+const makeSerializable = require("../util/makeSerializable");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../Generator").GenerateContext} GenerateContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {Map>} ImportSpecifiers */
+
+/**
+ * @extends {InitFragment}
+ */
+class ExternalModuleInitFragment extends InitFragment {
+	/**
+	 * @param {string} importedModule imported module
+	 * @param {Array<{ name: string, value?: string }> | ImportSpecifiers} specifiers import specifiers
+	 * @param {string=} defaultImport default import
+	 */
+	constructor(importedModule, specifiers, defaultImport) {
+		super(
+			undefined,
+			InitFragment.STAGE_CONSTANTS,
+			0,
+			`external module imports|${importedModule}|${defaultImport || "null"}`
+		);
+		this.importedModule = importedModule;
+		if (Array.isArray(specifiers)) {
+			/** @type {ImportSpecifiers} */
+			this.specifiers = new Map();
+			for (const { name, value } of specifiers) {
+				let specifiers = this.specifiers.get(name);
+				if (!specifiers) {
+					specifiers = new Set();
+					this.specifiers.set(name, specifiers);
+				}
+				specifiers.add(value || name);
+			}
+		} else {
+			this.specifiers = specifiers;
+		}
+		this.defaultImport = defaultImport;
+	}
+
+	/**
+	 * @param {ExternalModuleInitFragment} other other
+	 * @returns {ExternalModuleInitFragment} ExternalModuleInitFragment
+	 */
+	merge(other) {
+		const newSpecifiersMap = new Map(this.specifiers);
+		for (const [name, specifiers] of other.specifiers) {
+			if (newSpecifiersMap.has(name)) {
+				const currentSpecifiers =
+					/** @type {Set} */
+					(newSpecifiersMap.get(name));
+				for (const spec of specifiers) currentSpecifiers.add(spec);
+			} else {
+				newSpecifiersMap.set(name, specifiers);
+			}
+		}
+		return new ExternalModuleInitFragment(
+			this.importedModule,
+			newSpecifiersMap,
+			this.defaultImport
+		);
+	}
+
+	/**
+	 * @param {GenerateContext} context context
+	 * @returns {string | Source | undefined} the source code that will be included as initialization code
+	 */
+	getContent({ runtimeRequirements }) {
+		const namedImports = [];
+
+		for (const [name, specifiers] of this.specifiers) {
+			for (const spec of specifiers) {
+				if (spec === name) {
+					namedImports.push(name);
+				} else {
+					namedImports.push(`${name} as ${spec}`);
+				}
+			}
+		}
+
+		let importsString =
+			namedImports.length > 0 ? `{${namedImports.join(",")}}` : "";
+
+		if (this.defaultImport) {
+			importsString = `${this.defaultImport}${
+				importsString ? `, ${importsString}` : ""
+			}`;
+		}
+
+		return `import ${importsString} from ${JSON.stringify(
+			this.importedModule
+		)};`;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		super.serialize(context);
+		const { write } = context;
+		write(this.importedModule);
+		write(this.specifiers);
+		write(this.defaultImport);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		super.deserialize(context);
+		const { read } = context;
+		this.importedModule = read();
+		this.specifiers = read();
+		this.defaultImport = read();
+	}
+}
+
+makeSerializable(
+	ExternalModuleInitFragment,
+	"webpack/lib/dependencies/ExternalModuleInitFragment"
+);
+
+module.exports = ExternalModuleInitFragment;
diff --git a/lib/dependencies/HarmonyAcceptDependency.js b/lib/dependencies/HarmonyAcceptDependency.js
index f152efb8fc0..4817b722d7e 100644
--- a/lib/dependencies/HarmonyAcceptDependency.js
+++ b/lib/dependencies/HarmonyAcceptDependency.js
@@ -2,12 +2,28 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const NullDependency = require("./NullDependency");
+const Template = require("../Template");
+const makeSerializable = require("../util/makeSerializable");
 const HarmonyImportDependency = require("./HarmonyImportDependency");
+const NullDependency = require("./NullDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("./HarmonyAcceptImportDependency")} HarmonyAcceptImportDependency */
 
 class HarmonyAcceptDependency extends NullDependency {
+	/**
+	 * @param {Range} range expression range
+	 * @param {HarmonyAcceptImportDependency[]} dependencies import dependencies
+	 * @param {boolean} hasCallback true, if the range wraps an existing callback
+	 */
 	constructor(range, dependencies, hasCallback) {
 		super();
 		this.range = range;
@@ -18,27 +34,109 @@ class HarmonyAcceptDependency extends NullDependency {
 	get type() {
 		return "accepted harmony modules";
 	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.range);
+		write(this.dependencies);
+		write(this.hasCallback);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.range = read();
+		this.dependencies = read();
+		this.hasCallback = read();
+		super.deserialize(context);
+	}
 }
 
-HarmonyAcceptDependency.Template = class HarmonyAcceptDependencyTemplate {
-	apply(dep, source, runtime) {
+makeSerializable(
+	HarmonyAcceptDependency,
+	"webpack/lib/dependencies/HarmonyAcceptDependency"
+);
+
+HarmonyAcceptDependency.Template = class HarmonyAcceptDependencyTemplate extends (
+	NullDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, templateContext) {
+		const dep = /** @type {HarmonyAcceptDependency} */ (dependency);
+		const {
+			module,
+			runtime,
+			runtimeRequirements,
+			runtimeTemplate,
+			moduleGraph,
+			chunkGraph
+		} = templateContext;
 		const content = dep.dependencies
-			.filter(dependency =>
-				HarmonyImportDependency.Template.isImportEmitted(dependency, source)
-			)
-			.map(dependency => dependency.getImportStatement(true, runtime))
+			.map(dependency => {
+				const referencedModule = moduleGraph.getModule(dependency);
+				return {
+					dependency,
+					runtimeCondition: referencedModule
+						? HarmonyImportDependency.Template.getImportEmittedRuntime(
+								module,
+								referencedModule
+							)
+						: false
+				};
+			})
+			.filter(({ runtimeCondition }) => runtimeCondition !== false)
+			.map(({ dependency, runtimeCondition }) => {
+				const condition = runtimeTemplate.runtimeConditionExpression({
+					chunkGraph,
+					runtime,
+					runtimeCondition,
+					runtimeRequirements
+				});
+				const s = dependency.getImportStatement(true, templateContext);
+				const code = s[0] + s[1];
+				if (condition !== "true") {
+					return `if (${condition}) {\n${Template.indent(code)}\n}\n`;
+				}
+				return code;
+			})
 			.join("");
 
 		if (dep.hasCallback) {
-			source.insert(
-				dep.range[0],
-				`function(__WEBPACK_OUTDATED_DEPENDENCIES__) { ${content}(`
-			);
-			source.insert(dep.range[1], ")(__WEBPACK_OUTDATED_DEPENDENCIES__); }");
+			if (runtimeTemplate.supportsArrowFunction()) {
+				source.insert(
+					dep.range[0],
+					`__WEBPACK_OUTDATED_DEPENDENCIES__ => { ${content}(`
+				);
+				source.insert(dep.range[1], ")(__WEBPACK_OUTDATED_DEPENDENCIES__); }");
+			} else {
+				source.insert(
+					dep.range[0],
+					`function(__WEBPACK_OUTDATED_DEPENDENCIES__) { ${content}(`
+				);
+				source.insert(
+					dep.range[1],
+					")(__WEBPACK_OUTDATED_DEPENDENCIES__); }.bind(this)"
+				);
+			}
 			return;
 		}
 
-		source.insert(dep.range[1] - 0.5, `, function() { ${content} }`);
+		const arrow = runtimeTemplate.supportsArrowFunction();
+		source.insert(
+			dep.range[1] - 0.5,
+			`, ${arrow ? "() =>" : "function()"} { ${content} }`
+		);
 	}
 };
 
diff --git a/lib/dependencies/HarmonyAcceptImportDependency.js b/lib/dependencies/HarmonyAcceptImportDependency.js
index 62bd00cf4d1..03cb0002ddc 100644
--- a/lib/dependencies/HarmonyAcceptImportDependency.js
+++ b/lib/dependencies/HarmonyAcceptImportDependency.js
@@ -2,12 +2,23 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const makeSerializable = require("../util/makeSerializable");
 const HarmonyImportDependency = require("./HarmonyImportDependency");
+const NullDependency = require("./NullDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
 
 class HarmonyAcceptImportDependency extends HarmonyImportDependency {
-	constructor(request, originModule, parserScope) {
-		super(request, originModule, NaN, parserScope);
+	/**
+	 * @param {string} request the request string
+	 */
+	constructor(request) {
+		super(request, Number.NaN);
 		this.weak = true;
 	}
 
@@ -16,8 +27,14 @@ class HarmonyAcceptImportDependency extends HarmonyImportDependency {
 	}
 }
 
-HarmonyAcceptImportDependency.Template = class HarmonyAcceptImportDependencyTemplate extends HarmonyImportDependency.Template {
-	apply(dep, source, runtime) {}
-};
+makeSerializable(
+	HarmonyAcceptImportDependency,
+	"webpack/lib/dependencies/HarmonyAcceptImportDependency"
+);
+
+HarmonyAcceptImportDependency.Template =
+	/** @type {typeof HarmonyImportDependency.Template} */ (
+		NullDependency.Template
+	);
 
 module.exports = HarmonyAcceptImportDependency;
diff --git a/lib/dependencies/HarmonyCompatibilityDependency.js b/lib/dependencies/HarmonyCompatibilityDependency.js
index d6febb5ac11..5464f91b1f0 100644
--- a/lib/dependencies/HarmonyCompatibilityDependency.js
+++ b/lib/dependencies/HarmonyCompatibilityDependency.js
@@ -2,28 +2,89 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const { UsageState } = require("../ExportsInfo");
+const InitFragment = require("../InitFragment");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const makeSerializable = require("../util/makeSerializable");
 const NullDependency = require("./NullDependency");
 
-class HarmonyCompatibilityDependency extends NullDependency {
-	constructor(originModule) {
-		super();
-		this.originModule = originModule;
-	}
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
 
+class HarmonyCompatibilityDependency extends NullDependency {
 	get type() {
 		return "harmony export header";
 	}
 }
 
-HarmonyCompatibilityDependency.Template = class HarmonyExportDependencyTemplate {
-	apply(dep, source, runtime) {
-		const usedExports = dep.originModule.usedExports;
-		if (usedExports !== false && !Array.isArray(usedExports)) {
-			const content = runtime.defineEsModuleFlagStatement({
-				exportsArgument: dep.originModule.exportsArgument
+makeSerializable(
+	HarmonyCompatibilityDependency,
+	"webpack/lib/dependencies/HarmonyCompatibilityDependency"
+);
+
+HarmonyCompatibilityDependency.Template = class HarmonyExportDependencyTemplate extends (
+	NullDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(
+		dependency,
+		source,
+		{
+			module,
+			runtimeTemplate,
+			moduleGraph,
+			initFragments,
+			runtimeRequirements,
+			runtime,
+			concatenationScope
+		}
+	) {
+		if (concatenationScope) return;
+		const exportsInfo = moduleGraph.getExportsInfo(module);
+		if (
+			exportsInfo.getReadOnlyExportInfo("__esModule").getUsed(runtime) !==
+			UsageState.Unused
+		) {
+			const content = runtimeTemplate.defineEsModuleFlagStatement({
+				exportsArgument: module.exportsArgument,
+				runtimeRequirements
 			});
-			source.insert(-10, content);
+			initFragments.push(
+				new InitFragment(
+					content,
+					InitFragment.STAGE_HARMONY_EXPORTS,
+					0,
+					"harmony compatibility"
+				)
+			);
+		}
+		if (moduleGraph.isAsync(module)) {
+			runtimeRequirements.add(RuntimeGlobals.module);
+			runtimeRequirements.add(RuntimeGlobals.asyncModule);
+			initFragments.push(
+				new InitFragment(
+					runtimeTemplate.supportsArrowFunction()
+						? `${RuntimeGlobals.asyncModule}(${module.moduleArgument}, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try {\n`
+						: `${RuntimeGlobals.asyncModule}(${module.moduleArgument}, async function (__webpack_handle_async_dependencies__, __webpack_async_result__) { try {\n`,
+					InitFragment.STAGE_ASYNC_BOUNDARY,
+					0,
+					undefined,
+					`\n__webpack_async_result__();\n} catch(e) { __webpack_async_result__(e); } }${
+						/** @type {BuildMeta} */ (module.buildMeta).async ? ", 1" : ""
+					});`
+				)
+			);
 		}
 	}
 };
diff --git a/lib/dependencies/HarmonyDetectionParserPlugin.js b/lib/dependencies/HarmonyDetectionParserPlugin.js
index 1a0872f1980..dcb2d145c20 100644
--- a/lib/dependencies/HarmonyDetectionParserPlugin.js
+++ b/lib/dependencies/HarmonyDetectionParserPlugin.js
@@ -2,15 +2,38 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const EnvironmentNotSupportAsyncWarning = require("../EnvironmentNotSupportAsyncWarning");
+const { JAVASCRIPT_MODULE_TYPE_ESM } = require("../ModuleTypeConstants");
+const DynamicExports = require("./DynamicExports");
 const HarmonyCompatibilityDependency = require("./HarmonyCompatibilityDependency");
-const HarmonyInitDependency = require("./HarmonyInitDependency");
+const HarmonyExports = require("./HarmonyExports");
+
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
+/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("./HarmonyModulesPlugin").HarmonyModulesPluginOptions} HarmonyModulesPluginOptions */
+
+const PLUGIN_NAME = "HarmonyDetectionParserPlugin";
 
 module.exports = class HarmonyDetectionParserPlugin {
+	/**
+	 * @param {HarmonyModulesPluginOptions} options options
+	 */
+	constructor(options) {
+		const { topLevelAwait = false } = options || {};
+		this.topLevelAwait = topLevelAwait;
+	}
+
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @returns {void}
+	 */
 	apply(parser) {
-		parser.hooks.program.tap("HarmonyDetectionParserPlugin", ast => {
-			const isStrictHarmony = parser.state.module.type === "javascript/esm";
+		parser.hooks.program.tap(PLUGIN_NAME, ast => {
+			const isStrictHarmony =
+				parser.state.module.type === JAVASCRIPT_MODULE_TYPE_ESM;
 			const isHarmony =
 				isStrictHarmony ||
 				ast.body.some(
@@ -22,7 +45,7 @@ module.exports = class HarmonyDetectionParserPlugin {
 				);
 			if (isHarmony) {
 				const module = parser.state.module;
-				const compatDep = new HarmonyCompatibilityDependency(module);
+				const compatDep = new HarmonyCompatibilityDependency();
 				compatDep.loc = {
 					start: {
 						line: -1,
@@ -34,63 +57,61 @@ module.exports = class HarmonyDetectionParserPlugin {
 					},
 					index: -3
 				};
-				module.addDependency(compatDep);
-				const initDep = new HarmonyInitDependency(module);
-				initDep.loc = {
-					start: {
-						line: -1,
-						column: 0
-					},
-					end: {
-						line: -1,
-						column: 0
-					},
-					index: -2
-				};
-				module.addDependency(initDep);
-				parser.state.harmonyParserScope = parser.state.harmonyParserScope || {};
+				module.addPresentationalDependency(compatDep);
+				DynamicExports.bailout(parser.state);
+				HarmonyExports.enable(parser.state, isStrictHarmony);
 				parser.scope.isStrict = true;
-				module.buildMeta.exportsType = "namespace";
-				module.buildInfo.strict = true;
-				module.buildInfo.exportsArgument = "__webpack_exports__";
-				if (isStrictHarmony) {
-					module.buildMeta.strictHarmonyModule = true;
-					module.buildInfo.moduleArgument = "__webpack_module__";
-				}
 			}
 		});
 
-		const skipInHarmony = () => {
+		parser.hooks.topLevelAwait.tap(PLUGIN_NAME, () => {
 			const module = parser.state.module;
-			if (module && module.buildMeta && module.buildMeta.exportsType) {
+			if (!this.topLevelAwait) {
+				throw new Error(
+					"The top-level-await experiment is not enabled (set experiments.topLevelAwait: true to enable it)"
+				);
+			}
+			if (!HarmonyExports.isEnabled(parser.state)) {
+				throw new Error(
+					"Top-level-await is only supported in EcmaScript Modules"
+				);
+			}
+			/** @type {BuildMeta} */
+			(module.buildMeta).async = true;
+			EnvironmentNotSupportAsyncWarning.check(
+				module,
+				parser.state.compilation.runtimeTemplate,
+				"topLevelAwait"
+			);
+		});
+
+		/**
+		 * @returns {boolean | undefined} true if in harmony
+		 */
+		const skipInHarmony = () => {
+			if (HarmonyExports.isEnabled(parser.state)) {
 				return true;
 			}
 		};
 
+		/**
+		 * @returns {null | undefined} null if in harmony
+		 */
 		const nullInHarmony = () => {
-			const module = parser.state.module;
-			if (module && module.buildMeta && module.buildMeta.exportsType) {
+			if (HarmonyExports.isEnabled(parser.state)) {
 				return null;
 			}
 		};
 
 		const nonHarmonyIdentifiers = ["define", "exports"];
-		for (const identifer of nonHarmonyIdentifiers) {
+		for (const identifier of nonHarmonyIdentifiers) {
 			parser.hooks.evaluateTypeof
-				.for(identifer)
-				.tap("HarmonyDetectionParserPlugin", nullInHarmony);
-			parser.hooks.typeof
-				.for(identifer)
-				.tap("HarmonyDetectionParserPlugin", skipInHarmony);
-			parser.hooks.evaluate
-				.for(identifer)
-				.tap("HarmonyDetectionParserPlugin", nullInHarmony);
-			parser.hooks.expression
-				.for(identifer)
-				.tap("HarmonyDetectionParserPlugin", skipInHarmony);
-			parser.hooks.call
-				.for(identifer)
-				.tap("HarmonyDetectionParserPlugin", skipInHarmony);
+				.for(identifier)
+				.tap(PLUGIN_NAME, nullInHarmony);
+			parser.hooks.typeof.for(identifier).tap(PLUGIN_NAME, skipInHarmony);
+			parser.hooks.evaluate.for(identifier).tap(PLUGIN_NAME, nullInHarmony);
+			parser.hooks.expression.for(identifier).tap(PLUGIN_NAME, skipInHarmony);
+			parser.hooks.call.for(identifier).tap(PLUGIN_NAME, skipInHarmony);
 		}
 	}
 };
diff --git a/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js b/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js
new file mode 100644
index 00000000000..58c1bef530d
--- /dev/null
+++ b/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency.js
@@ -0,0 +1,152 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const makeSerializable = require("../util/makeSerializable");
+const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
+/** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */
+/** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
+/**
+ * Dependency for static evaluating import specifier. e.g.
+ * @example
+ * import a from "a";
+ * "x" in a;
+ * a.x !== undefined; // if x value statically analyzable
+ */
+class HarmonyEvaluatedImportSpecifierDependency extends HarmonyImportSpecifierDependency {
+	/**
+	 * @param {string} request the request string
+	 * @param {number} sourceOrder source order
+	 * @param {string[]} ids ids
+	 * @param {string} name name
+	 * @param {Range} range location in source code
+	 * @param {ImportAttributes} attributes import assertions
+	 * @param {string} operator operator
+	 */
+	constructor(request, sourceOrder, ids, name, range, attributes, operator) {
+		super(request, sourceOrder, ids, name, range, false, attributes, []);
+		this.operator = operator;
+	}
+
+	get type() {
+		return `evaluated X ${this.operator} harmony import specifier`;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		super.serialize(context);
+		const { write } = context;
+		write(this.operator);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		super.deserialize(context);
+		const { read } = context;
+		this.operator = read();
+	}
+}
+
+makeSerializable(
+	HarmonyEvaluatedImportSpecifierDependency,
+	"webpack/lib/dependencies/HarmonyEvaluatedImportSpecifierDependency"
+);
+
+HarmonyEvaluatedImportSpecifierDependency.Template = class HarmonyEvaluatedImportSpecifierDependencyTemplate extends (
+	HarmonyImportSpecifierDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, templateContext) {
+		const dep =
+			/** @type {HarmonyEvaluatedImportSpecifierDependency} */
+			(dependency);
+		const { module, moduleGraph, runtime } = templateContext;
+		const connection = moduleGraph.getConnection(dep);
+		// Skip rendering depending when dependency is conditional
+		if (connection && !connection.isTargetActive(runtime)) return;
+
+		const exportsInfo = moduleGraph.getExportsInfo(
+			/** @type {ModuleGraphConnection} */ (connection).module
+		);
+		const ids = dep.getIds(moduleGraph);
+
+		let value;
+
+		const exportsType =
+			/** @type {ModuleGraphConnection} */
+			(connection).module.getExportsType(
+				moduleGraph,
+				/** @type {BuildMeta} */
+				(module.buildMeta).strictHarmonyModule
+			);
+		switch (exportsType) {
+			case "default-with-named": {
+				if (ids[0] === "default") {
+					value =
+						ids.length === 1 || exportsInfo.isExportProvided(ids.slice(1));
+				} else {
+					value = exportsInfo.isExportProvided(ids);
+				}
+				break;
+			}
+			case "namespace": {
+				value =
+					ids[0] === "__esModule"
+						? ids.length === 1 || undefined
+						: exportsInfo.isExportProvided(ids);
+				break;
+			}
+			case "dynamic": {
+				if (ids[0] !== "default") {
+					value = exportsInfo.isExportProvided(ids);
+				}
+				break;
+			}
+			// default-only could lead to runtime error, when default value is primitive
+		}
+
+		if (typeof value === "boolean") {
+			source.replace(dep.range[0], dep.range[1] - 1, ` ${value}`);
+		} else {
+			const usedName = exportsInfo.getUsedName(ids, runtime);
+
+			const code = this._getCodeForIds(
+				dep,
+				source,
+				templateContext,
+				ids.slice(0, -1)
+			);
+			source.replace(
+				dep.range[0],
+				dep.range[1] - 1,
+				`${
+					usedName ? JSON.stringify(usedName[usedName.length - 1]) : '""'
+				} in ${code}`
+			);
+		}
+	}
+};
+
+module.exports = HarmonyEvaluatedImportSpecifierDependency;
diff --git a/lib/dependencies/HarmonyExportDependencyParserPlugin.js b/lib/dependencies/HarmonyExportDependencyParserPlugin.js
index 6ab0c0fe154..65b4ec26b9c 100644
--- a/lib/dependencies/HarmonyExportDependencyParserPlugin.js
+++ b/lib/dependencies/HarmonyExportDependencyParserPlugin.js
@@ -2,31 +2,65 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const { getImportAttributes } = require("../javascript/JavascriptParser");
+const InnerGraph = require("../optimize/InnerGraph");
+const ConstDependency = require("./ConstDependency");
 const HarmonyExportExpressionDependency = require("./HarmonyExportExpressionDependency");
-const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency");
 const HarmonyExportHeaderDependency = require("./HarmonyExportHeaderDependency");
-const HarmonyExportSpecifierDependency = require("./HarmonyExportSpecifierDependency");
 const HarmonyExportImportedSpecifierDependency = require("./HarmonyExportImportedSpecifierDependency");
-const ConstDependency = require("./ConstDependency");
+const HarmonyExportSpecifierDependency = require("./HarmonyExportSpecifierDependency");
+const { ExportPresenceModes } = require("./HarmonyImportDependency");
+const {
+	harmonySpecifierTag
+} = require("./HarmonyImportDependencyParserPlugin");
+const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency");
+
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("../javascript/JavascriptParser").ClassDeclaration} ClassDeclaration */
+/** @typedef {import("../javascript/JavascriptParser").FunctionDeclaration} FunctionDeclaration */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+
+const { HarmonyStarExportsList } = HarmonyExportImportedSpecifierDependency;
 
 module.exports = class HarmonyExportDependencyParserPlugin {
-	constructor(moduleOptions) {
-		this.strictExportPresence = moduleOptions.strictExportPresence;
+	/**
+	 * @param {import("../../declarations/WebpackOptions").JavascriptParserOptions} options options
+	 */
+	constructor(options) {
+		this.exportPresenceMode =
+			options.reexportExportsPresence !== undefined
+				? ExportPresenceModes.fromUserOption(options.reexportExportsPresence)
+				: options.exportsPresence !== undefined
+					? ExportPresenceModes.fromUserOption(options.exportsPresence)
+					: options.strictExportPresence
+						? ExportPresenceModes.ERROR
+						: ExportPresenceModes.AUTO;
 	}
 
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @returns {void}
+	 */
 	apply(parser) {
+		const { exportPresenceMode } = this;
 		parser.hooks.export.tap(
 			"HarmonyExportDependencyParserPlugin",
 			statement => {
 				const dep = new HarmonyExportHeaderDependency(
-					statement.declaration && statement.declaration.range,
-					statement.range
+					/** @type {Range | false} */ (
+						statement.declaration && statement.declaration.range
+					),
+					/** @type {Range} */ (statement.range)
+				);
+				dep.loc = Object.create(
+					/** @type {DependencyLocation} */ (statement.loc)
 				);
-				dep.loc = Object.create(statement.loc);
 				dep.loc.index = -1;
-				parser.state.current.addDependency(dep);
+				parser.state.module.addPresentationalDependency(dep);
 				return true;
 			}
 		);
@@ -35,17 +69,21 @@ module.exports = class HarmonyExportDependencyParserPlugin {
 			(statement, source) => {
 				parser.state.lastHarmonyImportOrder =
 					(parser.state.lastHarmonyImportOrder || 0) + 1;
-				const clearDep = new ConstDependency("", statement.range);
-				clearDep.loc = Object.create(statement.loc);
+				const clearDep = new ConstDependency(
+					"",
+					/** @type {Range} */ (statement.range)
+				);
+				clearDep.loc = /** @type {DependencyLocation} */ (statement.loc);
 				clearDep.loc.index = -1;
-				parser.state.current.addDependency(clearDep);
+				parser.state.module.addPresentationalDependency(clearDep);
 				const sideEffectDep = new HarmonyImportSideEffectDependency(
-					source,
-					parser.state.module,
+					/** @type {string} */ (source),
 					parser.state.lastHarmonyImportOrder,
-					parser.state.harmonyParserScope
+					getImportAttributes(statement)
+				);
+				sideEffectDep.loc = Object.create(
+					/** @type {DependencyLocation} */ (statement.loc)
 				);
-				sideEffectDep.loc = Object.create(statement.loc);
 				sideEffectDep.loc.index = -1;
 				parser.state.current.addDependency(sideEffectDep);
 				return true;
@@ -53,15 +91,14 @@ module.exports = class HarmonyExportDependencyParserPlugin {
 		);
 		parser.hooks.exportExpression.tap(
 			"HarmonyExportDependencyParserPlugin",
-			(statement, expr) => {
-				const comments = parser.getComments([
-					statement.range[0],
-					expr.range[0]
-				]);
+			(statement, node) => {
+				const isFunctionDeclaration = node.type === "FunctionDeclaration";
+				const exprRange = /** @type {Range} */ (node.range);
+				const statementRange = /** @type {Range} */ (statement.range);
+				const comments = parser.getComments([statementRange[0], exprRange[0]]);
 				const dep = new HarmonyExportExpressionDependency(
-					parser.state.module,
-					expr.range,
-					statement.range,
+					exprRange,
+					statementRange,
 					comments
 						.map(c => {
 							switch (c.type) {
@@ -72,48 +109,75 @@ module.exports = class HarmonyExportDependencyParserPlugin {
 							}
 							return "";
 						})
-						.join("")
+						.join(""),
+					node.type.endsWith("Declaration") &&
+					/** @type {FunctionDeclaration | ClassDeclaration} */ (node).id
+						? /** @type {FunctionDeclaration | ClassDeclaration} */
+							(node).id.name
+						: isFunctionDeclaration
+							? {
+									range: [
+										exprRange[0],
+										node.params.length > 0
+											? /** @type {Range} */ (node.params[0].range)[0]
+											: /** @type {Range} */ (node.body.range)[0]
+									],
+									prefix: `${node.async ? "async " : ""}function${
+										node.generator ? "*" : ""
+									} `,
+									suffix: `(${node.params.length > 0 ? "" : ") "}`
+								}
+							: undefined
+				);
+				dep.loc = Object.create(
+					/** @type {DependencyLocation} */ (statement.loc)
 				);
-				dep.loc = Object.create(statement.loc);
 				dep.loc.index = -1;
 				parser.state.current.addDependency(dep);
+				InnerGraph.addVariableUsage(
+					parser,
+					node.type.endsWith("Declaration") &&
+						/** @type {FunctionDeclaration | ClassDeclaration} */ (node).id
+						? /** @type {FunctionDeclaration | ClassDeclaration} */ (node).id
+								.name
+						: "*default*",
+					"default"
+				);
 				return true;
 			}
 		);
-		parser.hooks.exportDeclaration.tap(
-			"HarmonyExportDependencyParserPlugin",
-			statement => {}
-		);
 		parser.hooks.exportSpecifier.tap(
 			"HarmonyExportDependencyParserPlugin",
 			(statement, id, name, idx) => {
-				const rename = parser.scope.renames.get(id);
-				let dep;
+				const settings = parser.getTagData(id, harmonySpecifierTag);
 				const harmonyNamedExports = (parser.state.harmonyNamedExports =
 					parser.state.harmonyNamedExports || new Set());
 				harmonyNamedExports.add(name);
-				if (rename === "imported var") {
-					const settings = parser.state.harmonySpecifier.get(id);
-					dep = new HarmonyExportImportedSpecifierDependency(
-						settings.source,
-						parser.state.module,
-						settings.sourceOrder,
-						parser.state.harmonyParserScope,
-						settings.id,
-						name,
-						harmonyNamedExports,
-						null,
-						this.strictExportPresence
-					);
-				} else {
-					dep = new HarmonyExportSpecifierDependency(
-						parser.state.module,
-						id,
-						name
-					);
-				}
-				dep.loc = Object.create(statement.loc);
+				InnerGraph.addVariableUsage(parser, id, name);
+				const dep = settings
+					? new HarmonyExportImportedSpecifierDependency(
+							settings.source,
+							settings.sourceOrder,
+							settings.ids,
+							name,
+							harmonyNamedExports,
+							null,
+							exportPresenceMode,
+							null,
+							settings.attributes
+						)
+					: new HarmonyExportSpecifierDependency(id, name);
+				dep.loc = Object.create(
+					/** @type {DependencyLocation} */ (statement.loc)
+				);
 				dep.loc.index = idx;
+				const isAsiSafe = !parser.isAsiPosition(
+					/** @type {Range} */
+					(statement.range)[0]
+				);
+				if (!isAsiSafe) {
+					parser.setAsiPosition(/** @type {Range} */ (statement.range)[1]);
+				}
 				parser.state.current.addDependency(dep);
 				return true;
 			}
@@ -128,24 +192,34 @@ module.exports = class HarmonyExportDependencyParserPlugin {
 					harmonyNamedExports.add(name);
 				} else {
 					harmonyStarExports = parser.state.harmonyStarExports =
-						parser.state.harmonyStarExports || [];
+						parser.state.harmonyStarExports || new HarmonyStarExportsList();
 				}
+				const attributes = getImportAttributes(statement);
 				const dep = new HarmonyExportImportedSpecifierDependency(
-					source,
-					parser.state.module,
+					/** @type {string} */ (source),
 					parser.state.lastHarmonyImportOrder,
-					parser.state.harmonyParserScope,
-					id,
+					id ? [id] : [],
 					name,
 					harmonyNamedExports,
 					harmonyStarExports && harmonyStarExports.slice(),
-					this.strictExportPresence
+					exportPresenceMode,
+					harmonyStarExports,
+					attributes
 				);
 				if (harmonyStarExports) {
 					harmonyStarExports.push(dep);
 				}
-				dep.loc = Object.create(statement.loc);
+				dep.loc = Object.create(
+					/** @type {DependencyLocation} */ (statement.loc)
+				);
 				dep.loc.index = idx;
+				const isAsiSafe = !parser.isAsiPosition(
+					/** @type {Range} */
+					(statement.range)[0]
+				);
+				if (!isAsiSafe) {
+					parser.setAsiPosition(/** @type {Range} */ (statement.range)[1]);
+				}
 				parser.state.current.addDependency(dep);
 				return true;
 			}
diff --git a/lib/dependencies/HarmonyExportExpressionDependency.js b/lib/dependencies/HarmonyExportExpressionDependency.js
index dfb499add64..5de97a18a44 100644
--- a/lib/dependencies/HarmonyExportExpressionDependency.js
+++ b/lib/dependencies/HarmonyExportExpressionDependency.js
@@ -2,56 +2,205 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const ConcatenationScope = require("../ConcatenationScope");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const makeSerializable = require("../util/makeSerializable");
+const propertyAccess = require("../util/propertyAccess");
+const HarmonyExportInitFragment = require("./HarmonyExportInitFragment");
 const NullDependency = require("./NullDependency");
 
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").ExportsSpec} ExportsSpec */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../ModuleGraphConnection").ConnectionState} ConnectionState */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
 class HarmonyExportExpressionDependency extends NullDependency {
-	constructor(originModule, range, rangeStatement, prefix) {
+	/**
+	 * @param {Range} range range
+	 * @param {Range} rangeStatement range statement
+	 * @param {string} prefix prefix
+	 * @param {string | { range: Range, prefix: string, suffix: string }=} declarationId declaration id
+	 */
+	constructor(range, rangeStatement, prefix, declarationId) {
 		super();
-		this.originModule = originModule;
 		this.range = range;
 		this.rangeStatement = rangeStatement;
 		this.prefix = prefix;
+		this.declarationId = declarationId;
 	}
 
 	get type() {
 		return "harmony export expression";
 	}
 
-	getExports() {
+	/**
+	 * Returns the exported names
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {ExportsSpec | undefined} export names
+	 */
+	getExports(moduleGraph) {
 		return {
 			exports: ["default"],
+			priority: 1,
+			terminalBinding: true,
 			dependencies: undefined
 		};
 	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @returns {ConnectionState} how this dependency connects the module to referencing modules
+	 */
+	getModuleEvaluationSideEffectsState(moduleGraph) {
+		// The expression/declaration is already covered by SideEffectsFlagPlugin
+		return false;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.range);
+		write(this.rangeStatement);
+		write(this.prefix);
+		write(this.declarationId);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.range = read();
+		this.rangeStatement = read();
+		this.prefix = read();
+		this.declarationId = read();
+		super.deserialize(context);
+	}
 }
 
-HarmonyExportExpressionDependency.Template = class HarmonyExportDependencyTemplate {
-	apply(dep, source) {
-		const used = dep.originModule.isUsed("default");
-		const content = this.getContent(dep.originModule, used);
+makeSerializable(
+	HarmonyExportExpressionDependency,
+	"webpack/lib/dependencies/HarmonyExportExpressionDependency"
+);
+
+HarmonyExportExpressionDependency.Template = class HarmonyExportDependencyTemplate extends (
+	NullDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(
+		dependency,
+		source,
+		{
+			module,
+			moduleGraph,
+			runtimeTemplate,
+			runtimeRequirements,
+			initFragments,
+			runtime,
+			concatenationScope
+		}
+	) {
+		const dep = /** @type {HarmonyExportExpressionDependency} */ (dependency);
+		const { declarationId } = dep;
+		const exportsName = module.exportsArgument;
+		if (declarationId) {
+			let name;
+			if (typeof declarationId === "string") {
+				name = declarationId;
+			} else {
+				name = ConcatenationScope.DEFAULT_EXPORT;
+				source.replace(
+					declarationId.range[0],
+					declarationId.range[1] - 1,
+					`${declarationId.prefix}${name}${declarationId.suffix}`
+				);
+			}
+
+			if (concatenationScope) {
+				concatenationScope.registerExport("default", name);
+			} else {
+				const used = moduleGraph
+					.getExportsInfo(module)
+					.getUsedName("default", runtime);
+				if (used) {
+					const map = new Map();
+					map.set(used, `/* export default binding */ ${name}`);
+					initFragments.push(new HarmonyExportInitFragment(exportsName, map));
+				}
+			}
 
-		if (dep.range) {
 			source.replace(
 				dep.rangeStatement[0],
 				dep.range[0] - 1,
-				content + "(" + dep.prefix
+				`/* harmony default export */ ${dep.prefix}`
 			);
-			source.replace(dep.range[1], dep.rangeStatement[1] - 1, ");");
-			return;
-		}
+		} else {
+			/** @type {string} */
+			let content;
+			const name = ConcatenationScope.DEFAULT_EXPORT;
+			if (runtimeTemplate.supportsConst()) {
+				content = `/* harmony default export */ const ${name} = `;
+				if (concatenationScope) {
+					concatenationScope.registerExport("default", name);
+				} else {
+					const used = moduleGraph
+						.getExportsInfo(module)
+						.getUsedName("default", runtime);
+					if (used) {
+						runtimeRequirements.add(RuntimeGlobals.exports);
+						const map = new Map();
+						map.set(used, name);
+						initFragments.push(new HarmonyExportInitFragment(exportsName, map));
+					} else {
+						content = `/* unused harmony default export */ var ${name} = `;
+					}
+				}
+			} else if (concatenationScope) {
+				content = `/* harmony default export */ var ${name} = `;
+				concatenationScope.registerExport("default", name);
+			} else {
+				const used = moduleGraph
+					.getExportsInfo(module)
+					.getUsedName("default", runtime);
+				if (used) {
+					runtimeRequirements.add(RuntimeGlobals.exports);
+					// This is a little bit incorrect as TDZ is not correct, but we can't use const.
+					content = `/* harmony default export */ ${exportsName}${propertyAccess(
+						typeof used === "string" ? [used] : used
+					)} = `;
+				} else {
+					content = `/* unused harmony default export */ var ${name} = `;
+				}
+			}
 
-		source.replace(dep.rangeStatement[0], dep.rangeStatement[1] - 1, content);
-	}
+			if (dep.range) {
+				source.replace(
+					dep.rangeStatement[0],
+					dep.range[0] - 1,
+					`${content}(${dep.prefix}`
+				);
+				source.replace(dep.range[1], dep.rangeStatement[1] - 0.5, ");");
+				return;
+			}
 
-	getContent(module, used) {
-		const exportsName = module.exportsArgument;
-		if (used) {
-			return `/* harmony default export */ ${exportsName}[${JSON.stringify(
-				used
-			)}] = `;
+			source.replace(dep.rangeStatement[0], dep.rangeStatement[1] - 1, content);
 		}
-		return "/* unused harmony default export */ var _unused_webpack_default_export = ";
 	}
 };
 
diff --git a/lib/dependencies/HarmonyExportHeaderDependency.js b/lib/dependencies/HarmonyExportHeaderDependency.js
index a0e9918bd58..ae649796686 100644
--- a/lib/dependencies/HarmonyExportHeaderDependency.js
+++ b/lib/dependencies/HarmonyExportHeaderDependency.js
@@ -2,10 +2,24 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const makeSerializable = require("../util/makeSerializable");
 const NullDependency = require("./NullDependency");
 
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
 class HarmonyExportHeaderDependency extends NullDependency {
+	/**
+	 * @param {Range | false} range range
+	 * @param {Range} rangeStatement range statement
+	 */
 	constructor(range, rangeStatement) {
 		super();
 		this.range = range;
@@ -15,10 +29,44 @@ class HarmonyExportHeaderDependency extends NullDependency {
 	get type() {
 		return "harmony export header";
 	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.range);
+		write(this.rangeStatement);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.range = read();
+		this.rangeStatement = read();
+		super.deserialize(context);
+	}
 }
 
-HarmonyExportHeaderDependency.Template = class HarmonyExportDependencyTemplate {
-	apply(dep, source) {
+makeSerializable(
+	HarmonyExportHeaderDependency,
+	"webpack/lib/dependencies/HarmonyExportHeaderDependency"
+);
+
+HarmonyExportHeaderDependency.Template = class HarmonyExportDependencyTemplate extends (
+	NullDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, templateContext) {
+		const dep = /** @type {HarmonyExportHeaderDependency} */ (dependency);
 		const content = "";
 		const replaceUntil = dep.range
 			? dep.range[0] - 1
diff --git a/lib/dependencies/HarmonyExportImportedSpecifierDependency.js b/lib/dependencies/HarmonyExportImportedSpecifierDependency.js
index 1965d0dbb8d..aca20541628 100644
--- a/lib/dependencies/HarmonyExportImportedSpecifierDependency.js
+++ b/lib/dependencies/HarmonyExportImportedSpecifierDependency.js
@@ -2,19 +2,83 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const DependencyReference = require("./DependencyReference");
-const HarmonyImportDependency = require("./HarmonyImportDependency");
-const Template = require("../Template");
+const ConditionalInitFragment = require("../ConditionalInitFragment");
+const Dependency = require("../Dependency");
+const { UsageState } = require("../ExportsInfo");
 const HarmonyLinkingError = require("../HarmonyLinkingError");
-
+const InitFragment = require("../InitFragment");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+const { countIterable } = require("../util/IterableHelpers");
+const { first, combine } = require("../util/SetHelpers");
+const makeSerializable = require("../util/makeSerializable");
+const propertyAccess = require("../util/propertyAccess");
+const { propertyName } = require("../util/propertyName");
+const {
+	getRuntimeKey,
+	keyToRuntime,
+	filterRuntime
+} = require("../util/runtime");
+const HarmonyExportInitFragment = require("./HarmonyExportInitFragment");
+const HarmonyImportDependency = require("./HarmonyImportDependency");
+const processExportInfo = require("./processExportInfo");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Dependency").ExportsSpec} ExportsSpec */
+/** @typedef {import("../Dependency").GetConditionFn} GetConditionFn */
+/** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
+/** @typedef {import("../Dependency").TRANSITIVE} TRANSITIVE */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../ExportsInfo")} ExportsInfo */
+/** @typedef {import("../ExportsInfo").ExportInfo} ExportInfo */
+/** @typedef {import("../ExportsInfo").UsedName} UsedName */
+/** @typedef {import("../Generator").GenerateContext} GenerateContext */
 /** @typedef {import("../Module")} Module */
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
+/** @typedef {import("../Module").RuntimeRequirements} RuntimeRequirements */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */
+/** @typedef {import("../ModuleGraphConnection").ConnectionState} ConnectionState */
+/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
+/** @typedef {import("../WebpackError")} WebpackError */
+/** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+/** @typedef {import("./HarmonyImportDependency").ExportPresenceMode} ExportPresenceMode */
+/** @typedef {import("./processExportInfo").ReferencedExports} ReferencedExports */
+
+/** @typedef {"missing"|"unused"|"empty-star"|"reexport-dynamic-default"|"reexport-named-default"|"reexport-namespace-object"|"reexport-fake-namespace-object"|"reexport-undefined"|"normal-reexport"|"dynamic-reexport"} ExportModeType */
+
+const { ExportPresenceModes } = HarmonyImportDependency;
+
+const idsSymbol = Symbol("HarmonyExportImportedSpecifierDependency.ids");
+
+class NormalReexportItem {
+	/**
+	 * @param {string} name export name
+	 * @param {string[]} ids reexported ids from other module
+	 * @param {ExportInfo} exportInfo export info from other module
+	 * @param {boolean} checked true, if it should be checked at runtime if this export exists
+	 * @param {boolean} hidden true, if it is hidden behind another active export in the same module
+	 */
+	constructor(name, ids, exportInfo, checked, hidden) {
+		this.name = name;
+		this.ids = ids;
+		this.exportInfo = exportInfo;
+		this.checked = checked;
+		this.hidden = hidden;
+	}
+}
 
-/** @typedef {"missing"|"unused"|"empty-star"|"reexport-non-harmony-default"|"reexport-named-default"|"reexport-namespace-object"|"reexport-non-harmony-default-strict"|"reexport-fake-namespace-object"|"rexport-non-harmony-undefined"|"safe-reexport"|"checked-reexport"|"dynamic-reexport"} ExportModeType */
-
-/** @type {Map} */
-const EMPTY_MAP = new Map();
+/** @typedef {Set} ExportModeIgnored */
+/** @typedef {Set} ExportModeHidden */
 
 class ExportMode {
 	/**
@@ -23,577 +87,1157 @@ class ExportMode {
 	constructor(type) {
 		/** @type {ExportModeType} */
 		this.type = type;
-		/** @type {string|null} */
+
+		// for "normal-reexport":
+		/** @type {NormalReexportItem[] | null} */
+		this.items = null;
+
+		// for "reexport-named-default" | "reexport-fake-namespace-object" | "reexport-namespace-object"
+		/** @type {string | null} */
 		this.name = null;
-		/** @type {Map} */
-		this.map = EMPTY_MAP;
-		/** @type {Module|null} */
-		this.module = null;
-		/** @type {string|null} */
+		/** @type {ExportInfo | null} */
+		this.partialNamespaceExportInfo = null;
+
+		// for "dynamic-reexport":
+		/** @type {ExportModeIgnored | null} */
+		this.ignored = null;
+
+		// for "dynamic-reexport" | "empty-star":
+		/** @type {ExportModeHidden | undefined | null} */
+		this.hidden = null;
+
+		// for "missing":
+		/** @type {string | null} */
 		this.userRequest = null;
+
+		// for "reexport-fake-namespace-object":
+		/** @type {number} */
+		this.fakeType = 0;
 	}
 }
 
-const EMPTY_STAR_MODE = new ExportMode("empty-star");
-
-class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency {
-	constructor(
-		request,
-		originModule,
-		sourceOrder,
-		parserScope,
-		id,
-		name,
-		activeExports,
-		otherStarExports,
-		strictExportPresence
-	) {
-		super(request, originModule, sourceOrder, parserScope);
-		this.id = id;
-		this.name = name;
-		this.activeExports = activeExports;
-		this.otherStarExports = otherStarExports;
-		this.strictExportPresence = strictExportPresence;
+/** @typedef {string[]} Names */
+/** @typedef {number[]} DependencyIndices */
+
+/**
+ * @param {ModuleGraph} moduleGraph module graph
+ * @param {HarmonyExportImportedSpecifierDependency[]} dependencies dependencies
+ * @param {TODO=} additionalDependency additional dependency
+ * @returns {{ names: Names, dependencyIndices: DependencyIndices }} result
+ */
+const determineExportAssignments = (
+	moduleGraph,
+	dependencies,
+	additionalDependency
+) => {
+	const names = new Set();
+	/** @type {number[]} */
+	const dependencyIndices = [];
+
+	if (additionalDependency) {
+		dependencies = dependencies.concat(additionalDependency);
 	}
 
-	get type() {
-		return "harmony export imported specifier";
+	for (const dep of dependencies) {
+		const i = dependencyIndices.length;
+		dependencyIndices[i] = names.size;
+		const otherImportedModule = moduleGraph.getModule(dep);
+		if (otherImportedModule) {
+			const exportsInfo = moduleGraph.getExportsInfo(otherImportedModule);
+			for (const exportInfo of exportsInfo.exports) {
+				if (
+					exportInfo.provided === true &&
+					exportInfo.name !== "default" &&
+					!names.has(exportInfo.name)
+				) {
+					names.add(exportInfo.name);
+					dependencyIndices[i] = names.size;
+				}
+			}
+		}
 	}
+	dependencyIndices.push(names.size);
 
-	getMode(ignoreUnused) {
-		const name = this.name;
-		const id = this.id;
-		const used = this.originModule.isUsed(name);
-		const importedModule = this._module;
+	return { names: Array.from(names), dependencyIndices };
+};
 
-		if (!importedModule) {
-			const mode = new ExportMode("missing");
-			mode.userRequest = this.userRequest;
-			return mode;
+/**
+ * @param {object} options options
+ * @param {Names} options.names names
+ * @param {DependencyIndices} options.dependencyIndices dependency indices
+ * @param {string} name name
+ * @param {Iterable} dependencies dependencies
+ * @returns {HarmonyExportImportedSpecifierDependency | undefined} found dependency or nothing
+ */
+const findDependencyForName = (
+	{ names, dependencyIndices },
+	name,
+	dependencies
+) => {
+	const dependenciesIt = dependencies[Symbol.iterator]();
+	const dependencyIndicesIt = dependencyIndices[Symbol.iterator]();
+	let dependenciesItResult = dependenciesIt.next();
+	let dependencyIndicesItResult = dependencyIndicesIt.next();
+	if (dependencyIndicesItResult.done) return;
+	for (let i = 0; i < names.length; i++) {
+		while (i >= dependencyIndicesItResult.value) {
+			dependenciesItResult = dependenciesIt.next();
+			dependencyIndicesItResult = dependencyIndicesIt.next();
+			if (dependencyIndicesItResult.done) return;
 		}
+		if (names[i] === name) return dependenciesItResult.value;
+	}
+	return undefined;
+};
 
-		if (
-			!ignoreUnused &&
-			(name ? !used : this.originModule.usedExports === false)
-		) {
-			const mode = new ExportMode("unused");
-			mode.name = name || "*";
-			return mode;
-		}
+/**
+ * @param {ModuleGraph} moduleGraph the module graph
+ * @param {HarmonyExportImportedSpecifierDependency} dep the dependency
+ * @param {string} runtimeKey the runtime key
+ * @returns {ExportMode} the export mode
+ */
+const getMode = (moduleGraph, dep, runtimeKey) => {
+	const importedModule = moduleGraph.getModule(dep);
+
+	if (!importedModule) {
+		const mode = new ExportMode("missing");
+
+		mode.userRequest = dep.userRequest;
+
+		return mode;
+	}
+
+	const name = dep.name;
+	const runtime = keyToRuntime(runtimeKey);
+	const parentModule = /** @type {Module} */ (moduleGraph.getParentModule(dep));
+	const exportsInfo = moduleGraph.getExportsInfo(parentModule);
+
+	if (
+		name
+			? exportsInfo.getUsed(name, runtime) === UsageState.Unused
+			: exportsInfo.isUsed(runtime) === false
+	) {
+		const mode = new ExportMode("unused");
+
+		mode.name = name || "*";
+
+		return mode;
+	}
+
+	const importedExportsType = importedModule.getExportsType(
+		moduleGraph,
+		/** @type {BuildMeta} */
+		(parentModule.buildMeta).strictHarmonyModule
+	);
+
+	const ids = dep.getIds(moduleGraph);
+
+	// Special handling for reexporting the default export
+	// from non-namespace modules
+	if (name && ids.length > 0 && ids[0] === "default") {
+		switch (importedExportsType) {
+			case "dynamic": {
+				const mode = new ExportMode("reexport-dynamic-default");
 
-		const strictHarmonyModule = this.originModule.buildMeta.strictHarmonyModule;
-		if (name && id === "default" && importedModule.buildMeta) {
-			if (!importedModule.buildMeta.exportsType) {
-				const mode = new ExportMode(
-					strictHarmonyModule
-						? "reexport-non-harmony-default-strict"
-						: "reexport-non-harmony-default"
-				);
 				mode.name = name;
-				mode.module = importedModule;
+
 				return mode;
-			} else if (importedModule.buildMeta.exportsType === "named") {
+			}
+			case "default-only":
+			case "default-with-named": {
+				const exportInfo = exportsInfo.getReadOnlyExportInfo(name);
 				const mode = new ExportMode("reexport-named-default");
+
 				mode.name = name;
-				mode.module = importedModule;
+				mode.partialNamespaceExportInfo = exportInfo;
+
 				return mode;
 			}
 		}
+	}
 
-		const isNotAHarmonyModule =
-			importedModule.buildMeta && !importedModule.buildMeta.exportsType;
-		if (name) {
-			let mode;
-			if (id) {
-				// export { name as name }
-				if (isNotAHarmonyModule && strictHarmonyModule) {
-					mode = new ExportMode("rexport-non-harmony-undefined");
+	// reexporting with a fixed name
+	if (name) {
+		let mode;
+		const exportInfo = exportsInfo.getReadOnlyExportInfo(name);
+
+		if (ids.length > 0) {
+			// export { name as name }
+			switch (importedExportsType) {
+				case "default-only":
+					mode = new ExportMode("reexport-undefined");
 					mode.name = name;
-				} else {
-					mode = new ExportMode("safe-reexport");
-					mode.map = new Map([[name, id]]);
-				}
-			} else {
-				// export { * as name }
-				if (isNotAHarmonyModule && strictHarmonyModule) {
+					break;
+				default:
+					mode = new ExportMode("normal-reexport");
+					mode.items = [
+						new NormalReexportItem(name, ids, exportInfo, false, false)
+					];
+					break;
+			}
+		} else {
+			// export * as name
+			switch (importedExportsType) {
+				case "default-only":
+					mode = new ExportMode("reexport-fake-namespace-object");
+					mode.name = name;
+					mode.partialNamespaceExportInfo = exportInfo;
+					mode.fakeType = 0;
+					break;
+				case "default-with-named":
 					mode = new ExportMode("reexport-fake-namespace-object");
 					mode.name = name;
-				} else {
+					mode.partialNamespaceExportInfo = exportInfo;
+					mode.fakeType = 2;
+					break;
+				case "dynamic":
+				default:
 					mode = new ExportMode("reexport-namespace-object");
 					mode.name = name;
-				}
+					mode.partialNamespaceExportInfo = exportInfo;
 			}
-			mode.module = importedModule;
-			return mode;
 		}
 
-		const hasUsedExports = Array.isArray(this.originModule.usedExports);
-		const hasProvidedExports = Array.isArray(
-			importedModule.buildMeta.providedExports
-		);
-		const activeFromOtherStarExports = this._discoverActiveExportsFromOtherStartExports();
-
-		// export *
-		if (hasUsedExports) {
-			// reexport * with known used exports
-			if (hasProvidedExports) {
-				const map = new Map(
-					this.originModule.usedExports
-						.filter(id => {
-							if (id === "default") return false;
-							if (this.activeExports.has(id)) return false;
-							if (activeFromOtherStarExports.has(id)) return false;
-							if (!importedModule.buildMeta.providedExports.includes(id))
-								return false;
-							return true;
-						})
-						.map(item => [item, item])
-				);
+		return mode;
+	}
 
-				if (map.size === 0) {
-					return EMPTY_STAR_MODE;
-				}
+	// Star reexporting
 
-				const mode = new ExportMode("safe-reexport");
-				mode.module = importedModule;
-				mode.map = map;
-				return mode;
-			}
+	const { ignoredExports, exports, checked, hidden } = dep.getStarReexports(
+		moduleGraph,
+		runtime,
+		exportsInfo,
+		importedModule
+	);
+	if (!exports) {
+		// We have too few info about the modules
+		// Delegate the logic to the runtime code
 
-			const map = new Map(
-				this.originModule.usedExports
-					.filter(id => {
-						if (id === "default") return false;
-						if (this.activeExports.has(id)) return false;
-						if (activeFromOtherStarExports.has(id)) return false;
+		const mode = new ExportMode("dynamic-reexport");
+		mode.ignored = ignoredExports;
+		mode.hidden = hidden;
 
-						return true;
-					})
-					.map(item => [item, item])
-			);
+		return mode;
+	}
 
-			if (map.size === 0) {
-				return EMPTY_STAR_MODE;
-			}
+	if (exports.size === 0) {
+		const mode = new ExportMode("empty-star");
+		mode.hidden = hidden;
 
-			const mode = new ExportMode("checked-reexport");
-			mode.module = importedModule;
-			mode.map = map;
-			return mode;
-		}
+		return mode;
+	}
 
-		if (hasProvidedExports) {
-			const map = new Map(
-				importedModule.buildMeta.providedExports
-					.filter(id => {
-						if (id === "default") return false;
-						if (this.activeExports.has(id)) return false;
-						if (activeFromOtherStarExports.has(id)) return false;
-
-						return true;
-					})
-					.map(item => [item, item])
+	const mode = new ExportMode("normal-reexport");
+
+	mode.items = Array.from(
+		exports,
+		exportName =>
+			new NormalReexportItem(
+				exportName,
+				[exportName],
+				exportsInfo.getReadOnlyExportInfo(exportName),
+				/** @type {Set} */
+				(checked).has(exportName),
+				false
+			)
+	);
+	if (hidden !== undefined) {
+		for (const exportName of hidden) {
+			mode.items.push(
+				new NormalReexportItem(
+					exportName,
+					[exportName],
+					exportsInfo.getReadOnlyExportInfo(exportName),
+					false,
+					true
+				)
 			);
+		}
+	}
+
+	return mode;
+};
+
+/** @typedef {string[]} Ids */
+/** @typedef {Set} Exports */
+/** @typedef {Set} Checked */
+/** @typedef {Set} Hidden */
+/** @typedef {Set} IgnoredExports */
+
+class HarmonyExportImportedSpecifierDependency extends HarmonyImportDependency {
+	/**
+	 * @param {string} request the request string
+	 * @param {number} sourceOrder the order in the original source file
+	 * @param {Ids} ids the requested export name of the imported module
+	 * @param {string | null} name the export name of for this module
+	 * @param {Set} activeExports other named exports in the module
+	 * @param {ReadonlyArray | Iterable | null} otherStarExports other star exports in the module before this import
+	 * @param {ExportPresenceMode} exportPresenceMode mode of checking export names
+	 * @param {HarmonyStarExportsList | null} allStarExports all star exports in the module
+	 * @param {ImportAttributes=} attributes import attributes
+	 */
+	constructor(
+		request,
+		sourceOrder,
+		ids,
+		name,
+		activeExports,
+		otherStarExports,
+		exportPresenceMode,
+		allStarExports,
+		attributes
+	) {
+		super(request, sourceOrder, attributes);
 
-			if (map.size === 0) {
-				return EMPTY_STAR_MODE;
+		this.ids = ids;
+		this.name = name;
+		this.activeExports = activeExports;
+		this.otherStarExports = otherStarExports;
+		this.exportPresenceMode = exportPresenceMode;
+		this.allStarExports = allStarExports;
+	}
+
+	/**
+	 * @returns {boolean | TRANSITIVE} true, when changes to the referenced module could affect the referencing module; TRANSITIVE, when changes to the referenced module could affect referencing modules of the referencing module
+	 */
+	couldAffectReferencingModule() {
+		return Dependency.TRANSITIVE;
+	}
+
+	// TODO webpack 6 remove
+	get id() {
+		throw new Error("id was renamed to ids and type changed to string[]");
+	}
+
+	// TODO webpack 6 remove
+	getId() {
+		throw new Error("id was renamed to ids and type changed to string[]");
+	}
+
+	// TODO webpack 6 remove
+	setId() {
+		throw new Error("id was renamed to ids and type changed to string[]");
+	}
+
+	get type() {
+		return "harmony export imported specifier";
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @returns {Ids} the imported id
+	 */
+	getIds(moduleGraph) {
+		return moduleGraph.getMeta(this)[idsSymbol] || this.ids;
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @param {Ids} ids the imported ids
+	 * @returns {void}
+	 */
+	setIds(moduleGraph, ids) {
+		moduleGraph.getMeta(this)[idsSymbol] = ids;
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {ExportMode} the export mode
+	 */
+	getMode(moduleGraph, runtime) {
+		return moduleGraph.dependencyCacheProvide(
+			this,
+			getRuntimeKey(runtime),
+			getMode
+		);
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @param {ExportsInfo} exportsInfo exports info about the current module (optional)
+	 * @param {Module} importedModule the imported module (optional)
+	 * @returns {{exports?: Exports, checked?: Checked, ignoredExports: IgnoredExports, hidden?: Hidden}} information
+	 */
+	getStarReexports(
+		moduleGraph,
+		runtime,
+		exportsInfo = moduleGraph.getExportsInfo(
+			/** @type {Module} */ (moduleGraph.getParentModule(this))
+		),
+		importedModule = /** @type {Module} */ (moduleGraph.getModule(this))
+	) {
+		const importedExportsInfo = moduleGraph.getExportsInfo(importedModule);
+		const noExtraExports =
+			importedExportsInfo.otherExportsInfo.provided === false;
+		const noExtraImports =
+			exportsInfo.otherExportsInfo.getUsed(runtime) === UsageState.Unused;
+
+		const ignoredExports = new Set(["default", ...this.activeExports]);
+
+		let hiddenExports;
+		const otherStarExports =
+			this._discoverActiveExportsFromOtherStarExports(moduleGraph);
+		if (otherStarExports !== undefined) {
+			hiddenExports = new Set();
+			for (let i = 0; i < otherStarExports.namesSlice; i++) {
+				hiddenExports.add(otherStarExports.names[i]);
 			}
+			for (const e of ignoredExports) hiddenExports.delete(e);
+		}
 
-			const mode = new ExportMode("safe-reexport");
-			mode.module = importedModule;
-			mode.map = map;
-			return mode;
+		if (!noExtraExports && !noExtraImports) {
+			return {
+				ignoredExports,
+				hidden: hiddenExports
+			};
 		}
 
-		const mode = new ExportMode("dynamic-reexport");
-		mode.module = importedModule;
-		return mode;
+		/** @type {Exports} */
+		const exports = new Set();
+		/** @type {Checked} */
+		const checked = new Set();
+		/** @type {Hidden | undefined} */
+		const hidden = hiddenExports !== undefined ? new Set() : undefined;
+
+		if (noExtraImports) {
+			for (const exportInfo of exportsInfo.orderedExports) {
+				const name = exportInfo.name;
+				if (ignoredExports.has(name)) continue;
+				if (exportInfo.getUsed(runtime) === UsageState.Unused) continue;
+				const importedExportInfo =
+					importedExportsInfo.getReadOnlyExportInfo(name);
+				if (importedExportInfo.provided === false) continue;
+				if (hiddenExports !== undefined && hiddenExports.has(name)) {
+					/** @type {Set} */
+					(hidden).add(name);
+					continue;
+				}
+				exports.add(name);
+				if (importedExportInfo.provided === true) continue;
+				checked.add(name);
+			}
+		} else if (noExtraExports) {
+			for (const importedExportInfo of importedExportsInfo.orderedExports) {
+				const name = importedExportInfo.name;
+				if (ignoredExports.has(name)) continue;
+				if (importedExportInfo.provided === false) continue;
+				const exportInfo = exportsInfo.getReadOnlyExportInfo(name);
+				if (exportInfo.getUsed(runtime) === UsageState.Unused) continue;
+				if (hiddenExports !== undefined && hiddenExports.has(name)) {
+					/** @type {ExportModeHidden} */
+					(hidden).add(name);
+					continue;
+				}
+				exports.add(name);
+				if (importedExportInfo.provided === true) continue;
+				checked.add(name);
+			}
+		}
+
+		return { ignoredExports, exports, checked, hidden };
 	}
 
-	getReference() {
-		const mode = this.getMode(false);
+	/**
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {null | false | GetConditionFn} function to determine if the connection is active
+	 */
+	getCondition(moduleGraph) {
+		return (connection, runtime) => {
+			const mode = this.getMode(moduleGraph, runtime);
+			return mode.type !== "unused" && mode.type !== "empty-star";
+		};
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @returns {ConnectionState} how this dependency connects the module to referencing modules
+	 */
+	getModuleEvaluationSideEffectsState(moduleGraph) {
+		return false;
+	}
+
+	/**
+	 * Returns list of exports referenced by this dependency
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @param {RuntimeSpec} runtime the runtime for which the module is analysed
+	 * @returns {(string[] | ReferencedExport)[]} referenced exports
+	 */
+	getReferencedExports(moduleGraph, runtime) {
+		const mode = this.getMode(moduleGraph, runtime);
 
 		switch (mode.type) {
 			case "missing":
 			case "unused":
 			case "empty-star":
-				return null;
-
-			case "reexport-non-harmony-default":
-			case "reexport-named-default":
-				return new DependencyReference(
-					mode.module,
-					["default"],
-					false,
-					this.sourceOrder
+			case "reexport-undefined":
+				return Dependency.NO_EXPORTS_REFERENCED;
+
+			case "reexport-dynamic-default":
+				return Dependency.EXPORTS_OBJECT_REFERENCED;
+
+			case "reexport-named-default": {
+				if (!mode.partialNamespaceExportInfo)
+					return Dependency.EXPORTS_OBJECT_REFERENCED;
+				/** @type {ReferencedExports} */
+				const referencedExports = [];
+				processExportInfo(
+					runtime,
+					referencedExports,
+					[],
+					/** @type {ExportInfo} */ (mode.partialNamespaceExportInfo)
 				);
+				return referencedExports;
+			}
 
 			case "reexport-namespace-object":
-			case "reexport-non-harmony-default-strict":
-			case "reexport-fake-namespace-object":
-			case "rexport-non-harmony-undefined":
-				return new DependencyReference(
-					mode.module,
-					true,
-					false,
-					this.sourceOrder
-				);
-
-			case "safe-reexport":
-			case "checked-reexport":
-				return new DependencyReference(
-					mode.module,
-					Array.from(mode.map.values()),
-					false,
-					this.sourceOrder
+			case "reexport-fake-namespace-object": {
+				if (!mode.partialNamespaceExportInfo)
+					return Dependency.EXPORTS_OBJECT_REFERENCED;
+				/** @type {ReferencedExports} */
+				const referencedExports = [];
+				processExportInfo(
+					runtime,
+					referencedExports,
+					[],
+					/** @type {ExportInfo} */ (mode.partialNamespaceExportInfo),
+					mode.type === "reexport-fake-namespace-object"
 				);
+				return referencedExports;
+			}
 
 			case "dynamic-reexport":
-				return new DependencyReference(
-					mode.module,
-					true,
-					false,
-					this.sourceOrder
-				);
+				return Dependency.EXPORTS_OBJECT_REFERENCED;
+
+			case "normal-reexport": {
+				/** @type {ReferencedExports} */
+				const referencedExports = [];
+				for (const {
+					ids,
+					exportInfo,
+					hidden
+				} of /** @type {NormalReexportItem[]} */ (mode.items)) {
+					if (hidden) continue;
+					processExportInfo(runtime, referencedExports, ids, exportInfo, false);
+				}
+				return referencedExports;
+			}
 
 			default:
 				throw new Error(`Unknown mode ${mode.type}`);
 		}
 	}
 
-	_discoverActiveExportsFromOtherStartExports() {
-		if (!this.otherStarExports) return new Set();
-		const result = new Set();
-		// try to learn impossible exports from other star exports with provided exports
-		for (const otherStarExport of this.otherStarExports) {
-			const otherImportedModule = otherStarExport._module;
-			if (
-				otherImportedModule &&
-				Array.isArray(otherImportedModule.buildMeta.providedExports)
-			) {
-				for (const exportName of otherImportedModule.buildMeta
-					.providedExports) {
-					result.add(exportName);
-				}
-			}
-		}
-		return result;
-	}
-
-	getExports() {
-		if (this.name) {
-			return {
-				exports: [this.name],
-				dependencies: undefined
-			};
-		}
-
-		const importedModule = this.module;
-
-		if (!importedModule) {
-			// no imported module available
-			return {
-				exports: null,
-				dependencies: undefined
-			};
-		}
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @returns {{ names: Names, namesSlice: number, dependencyIndices: DependencyIndices, dependencyIndex: number } | undefined} exported names and their origin dependency
+	 */
+	_discoverActiveExportsFromOtherStarExports(moduleGraph) {
+		if (!this.otherStarExports) return;
+
+		const i =
+			"length" in this.otherStarExports
+				? this.otherStarExports.length
+				: countIterable(this.otherStarExports);
+		if (i === 0) return;
+
+		if (this.allStarExports) {
+			const { names, dependencyIndices } = moduleGraph.cached(
+				determineExportAssignments,
+				this.allStarExports.dependencies
+			);
 
-		if (Array.isArray(importedModule.buildMeta.providedExports)) {
 			return {
-				exports: importedModule.buildMeta.providedExports.filter(
-					id => id !== "default"
-				),
-				dependencies: [importedModule]
+				names,
+				namesSlice: dependencyIndices[i - 1],
+				dependencyIndices,
+				dependencyIndex: i
 			};
 		}
 
-		if (importedModule.buildMeta.providedExports) {
-			return {
-				exports: true,
-				dependencies: undefined
-			};
-		}
+		const { names, dependencyIndices } = moduleGraph.cached(
+			determineExportAssignments,
+			this.otherStarExports,
+			this
+		);
 
 		return {
-			exports: null,
-			dependencies: [importedModule]
+			names,
+			namesSlice: dependencyIndices[i - 1],
+			dependencyIndices,
+			dependencyIndex: i
 		};
 	}
 
-	getWarnings() {
-		if (
-			this.strictExportPresence ||
-			this.originModule.buildMeta.strictHarmonyModule
-		) {
-			return [];
+	/**
+	 * Returns the exported names
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {ExportsSpec | undefined} export names
+	 */
+	getExports(moduleGraph) {
+		const mode = this.getMode(moduleGraph, undefined);
+
+		switch (mode.type) {
+			case "missing":
+				return;
+			case "dynamic-reexport": {
+				const from =
+					/** @type {ModuleGraphConnection} */
+					(moduleGraph.getConnection(this));
+				return {
+					exports: true,
+					from,
+					canMangle: false,
+					excludeExports: mode.hidden
+						? combine(
+								/** @type {ExportModeIgnored} */ (mode.ignored),
+								mode.hidden
+							)
+						: /** @type {ExportModeIgnored} */ (mode.ignored),
+					hideExports: mode.hidden,
+					dependencies: [from.module]
+				};
+			}
+			case "empty-star":
+				return {
+					exports: [],
+					hideExports: mode.hidden,
+					dependencies: [/** @type {Module} */ (moduleGraph.getModule(this))]
+				};
+			// falls through
+			case "normal-reexport": {
+				const from =
+					/** @type {ModuleGraphConnection} */
+					(moduleGraph.getConnection(this));
+				return {
+					exports: Array.from(
+						/** @type {NormalReexportItem[]} */ (mode.items),
+						item => ({
+							name: item.name,
+							from,
+							export: item.ids,
+							hidden: item.hidden
+						})
+					),
+					priority: 1,
+					dependencies: [from.module]
+				};
+			}
+			case "reexport-dynamic-default": {
+				const from =
+					/** @type {ModuleGraphConnection} */
+					(moduleGraph.getConnection(this));
+				return {
+					exports: [
+						{
+							name: /** @type {string} */ (mode.name),
+							from,
+							export: ["default"]
+						}
+					],
+					priority: 1,
+					dependencies: [from.module]
+				};
+			}
+			case "reexport-undefined":
+				return {
+					exports: [/** @type {string} */ (mode.name)],
+					dependencies: [/** @type {Module} */ (moduleGraph.getModule(this))]
+				};
+			case "reexport-fake-namespace-object": {
+				const from =
+					/** @type {ModuleGraphConnection} */
+					(moduleGraph.getConnection(this));
+				return {
+					exports: [
+						{
+							name: /** @type {string} */ (mode.name),
+							from,
+							export: null,
+							exports: [
+								{
+									name: "default",
+									canMangle: false,
+									from,
+									export: null
+								}
+							]
+						}
+					],
+					priority: 1,
+					dependencies: [from.module]
+				};
+			}
+			case "reexport-namespace-object": {
+				const from =
+					/** @type {ModuleGraphConnection} */
+					(moduleGraph.getConnection(this));
+				return {
+					exports: [
+						{
+							name: /** @type {string} */ (mode.name),
+							from,
+							export: null
+						}
+					],
+					priority: 1,
+					dependencies: [from.module]
+				};
+			}
+			case "reexport-named-default": {
+				const from =
+					/** @type {ModuleGraphConnection} */
+					(moduleGraph.getConnection(this));
+				return {
+					exports: [
+						{
+							name: /** @type {string} */ (mode.name),
+							from,
+							export: ["default"]
+						}
+					],
+					priority: 1,
+					dependencies: [from.module]
+				};
+			}
+			default:
+				throw new Error(`Unknown mode ${mode.type}`);
 		}
-		return this._getErrors();
 	}
 
-	getErrors() {
-		if (
-			this.strictExportPresence ||
-			this.originModule.buildMeta.strictHarmonyModule
-		) {
-			return this._getErrors();
+	/**
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {ExportPresenceMode} effective mode
+	 */
+	_getEffectiveExportPresenceLevel(moduleGraph) {
+		if (this.exportPresenceMode !== ExportPresenceModes.AUTO)
+			return this.exportPresenceMode;
+		const module = /** @type {Module} */ (moduleGraph.getParentModule(this));
+		return /** @type {BuildMeta} */ (module.buildMeta).strictHarmonyModule
+			? ExportPresenceModes.ERROR
+			: ExportPresenceModes.WARN;
+	}
+
+	/**
+	 * Returns warnings
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {WebpackError[] | null | undefined} warnings
+	 */
+	getWarnings(moduleGraph) {
+		const exportsPresence = this._getEffectiveExportPresenceLevel(moduleGraph);
+		if (exportsPresence === ExportPresenceModes.WARN) {
+			return this._getErrors(moduleGraph);
 		}
-		return [];
+		return null;
 	}
 
-	_getErrors() {
-		const importedModule = this._module;
-		if (!importedModule) {
-			return;
+	/**
+	 * Returns errors
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {WebpackError[] | null | undefined} errors
+	 */
+	getErrors(moduleGraph) {
+		const exportsPresence = this._getEffectiveExportPresenceLevel(moduleGraph);
+		if (exportsPresence === ExportPresenceModes.ERROR) {
+			return this._getErrors(moduleGraph);
 		}
+		return null;
+	}
 
-		if (!importedModule.buildMeta || !importedModule.buildMeta.exportsType) {
-			// It's not an harmony module
-			if (
-				this.originModule.buildMeta.strictHarmonyModule &&
-				this.id !== "default"
-			) {
-				// In strict harmony modules we only support the default export
-				const exportName = this.id
-					? `the named export '${this.id}'`
-					: "the namespace object";
-				return [
-					new HarmonyLinkingError(
-						`Can't reexport ${exportName} from non EcmaScript module (only default export is available)`
+	/**
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {WebpackError[] | undefined} errors
+	 */
+	_getErrors(moduleGraph) {
+		const ids = this.getIds(moduleGraph);
+		let errors = this.getLinkingErrors(
+			moduleGraph,
+			ids,
+			`(reexported as '${this.name}')`
+		);
+		if (ids.length === 0 && this.name === null) {
+			const potentialConflicts =
+				this._discoverActiveExportsFromOtherStarExports(moduleGraph);
+			if (potentialConflicts && potentialConflicts.namesSlice > 0) {
+				const ownNames = new Set(
+					potentialConflicts.names.slice(
+						potentialConflicts.namesSlice,
+						potentialConflicts.dependencyIndices[
+							potentialConflicts.dependencyIndex
+						]
 					)
-				];
+				);
+				const importedModule = moduleGraph.getModule(this);
+				if (importedModule) {
+					const exportsInfo = moduleGraph.getExportsInfo(importedModule);
+					/** @type {Map} */
+					const conflicts = new Map();
+					for (const exportInfo of exportsInfo.orderedExports) {
+						if (exportInfo.provided !== true) continue;
+						if (exportInfo.name === "default") continue;
+						if (this.activeExports.has(exportInfo.name)) continue;
+						if (ownNames.has(exportInfo.name)) continue;
+						const conflictingDependency = findDependencyForName(
+							potentialConflicts,
+							exportInfo.name,
+							this.allStarExports
+								? this.allStarExports.dependencies
+								: [
+										.../** @type {Iterable} */
+										(this.otherStarExports),
+										this
+									]
+						);
+						if (!conflictingDependency) continue;
+						const target = exportInfo.getTerminalBinding(moduleGraph);
+						if (!target) continue;
+						const conflictingModule =
+							/** @type {Module} */
+							(moduleGraph.getModule(conflictingDependency));
+						if (conflictingModule === importedModule) continue;
+						const conflictingExportInfo = moduleGraph.getExportInfo(
+							conflictingModule,
+							exportInfo.name
+						);
+						const conflictingTarget =
+							conflictingExportInfo.getTerminalBinding(moduleGraph);
+						if (!conflictingTarget) continue;
+						if (target === conflictingTarget) continue;
+						const list = conflicts.get(conflictingDependency.request);
+						if (list === undefined) {
+							conflicts.set(conflictingDependency.request, [exportInfo.name]);
+						} else {
+							list.push(exportInfo.name);
+						}
+					}
+					for (const [request, exports] of conflicts) {
+						if (!errors) errors = [];
+						errors.push(
+							new HarmonyLinkingError(
+								`The requested module '${
+									this.request
+								}' contains conflicting star exports for the ${
+									exports.length > 1 ? "names" : "name"
+								} ${exports
+									.map(e => `'${e}'`)
+									.join(", ")} with the previous requested module '${request}'`
+							)
+						);
+					}
+				}
 			}
-			return;
-		}
-
-		if (!this.id) {
-			return;
 		}
-
-		if (importedModule.isProvided(this.id) !== false) {
-			// It's provided or we are not sure
-			return;
-		}
-
-		// We are sure that it's not provided
-		const idIsNotNameMessage =
-			this.id !== this.name ? ` (reexported as '${this.name}')` : "";
-		const errorMessage = `"export '${
-			this.id
-		}'${idIsNotNameMessage} was not found in '${this.userRequest}'`;
-		return [new HarmonyLinkingError(errorMessage)];
+		return errors;
 	}
 
-	updateHash(hash) {
-		super.updateHash(hash);
-		const hashValue = this.getHashValue(this._module);
-		hash.update(hashValue);
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write, setCircularReference } = context;
+
+		setCircularReference(this);
+		write(this.ids);
+		write(this.name);
+		write(this.activeExports);
+		write(this.otherStarExports);
+		write(this.exportPresenceMode);
+		write(this.allStarExports);
+
+		super.serialize(context);
 	}
 
-	getHashValue(importedModule) {
-		if (!importedModule) {
-			return "";
-		}
-
-		const stringifiedUsedExport = JSON.stringify(importedModule.usedExports);
-		const stringifiedProvidedExport = JSON.stringify(
-			importedModule.buildMeta.providedExports
-		);
-		return (
-			importedModule.used + stringifiedUsedExport + stringifiedProvidedExport
-		);
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read, setCircularReference } = context;
+
+		setCircularReference(this);
+		this.ids = read();
+		this.name = read();
+		this.activeExports = read();
+		this.otherStarExports = read();
+		this.exportPresenceMode = read();
+		this.allStarExports = read();
+
+		super.deserialize(context);
 	}
 }
 
+makeSerializable(
+	HarmonyExportImportedSpecifierDependency,
+	"webpack/lib/dependencies/HarmonyExportImportedSpecifierDependency"
+);
+
 module.exports = HarmonyExportImportedSpecifierDependency;
 
-HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedSpecifierDependencyTemplate extends HarmonyImportDependency.Template {
-	harmonyInit(dep, source, runtime, dependencyTemplates) {
-		super.harmonyInit(dep, source, runtime, dependencyTemplates);
-		const content = this.getContent(dep);
-		source.insert(-1, content);
-	}
+HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedSpecifierDependencyTemplate extends (
+	HarmonyImportDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, templateContext) {
+		const { moduleGraph, runtime, concatenationScope } = templateContext;
 
-	getHarmonyInitOrder(dep) {
-		if (dep.name) {
-			const used = dep.originModule.isUsed(dep.name);
-			if (!used) return NaN;
-		} else {
-			const importedModule = dep._module;
-
-			const activeFromOtherStarExports = dep._discoverActiveExportsFromOtherStartExports();
-
-			if (Array.isArray(dep.originModule.usedExports)) {
-				// we know which exports are used
-
-				const unused = dep.originModule.usedExports.every(id => {
-					if (id === "default") return true;
-					if (dep.activeExports.has(id)) return true;
-					if (importedModule.isProvided(id) === false) return true;
-					if (activeFromOtherStarExports.has(id)) return true;
-					return false;
-				});
-				if (unused) return NaN;
-			} else if (
-				dep.originModule.usedExports &&
-				importedModule &&
-				Array.isArray(importedModule.buildMeta.providedExports)
-			) {
-				// not sure which exports are used, but we know which are provided
-
-				const unused = importedModule.buildMeta.providedExports.every(id => {
-					if (id === "default") return true;
-					if (dep.activeExports.has(id)) return true;
-					if (activeFromOtherStarExports.has(id)) return true;
-					return false;
-				});
-				if (unused) return NaN;
+		const dep = /** @type {HarmonyExportImportedSpecifierDependency} */ (
+			dependency
+		);
+
+		const mode = dep.getMode(moduleGraph, runtime);
+
+		if (concatenationScope) {
+			switch (mode.type) {
+				case "reexport-undefined":
+					concatenationScope.registerRawExport(
+						/** @type {NonNullable} */ (mode.name),
+						"/* reexport non-default export from non-harmony */ undefined"
+					);
 			}
+			return;
+		}
+
+		if (mode.type !== "unused" && mode.type !== "empty-star") {
+			super.apply(dependency, source, templateContext);
+
+			this._addExportFragments(
+				templateContext.initFragments,
+				dep,
+				mode,
+				templateContext.module,
+				moduleGraph,
+				runtime,
+				templateContext.runtimeTemplate,
+				templateContext.runtimeRequirements
+			);
 		}
-		return super.getHarmonyInitOrder(dep);
 	}
 
-	getContent(dep) {
-		const mode = dep.getMode(false);
-		const module = dep.originModule;
-		const importedModule = dep._module;
-		const importVar = dep.getImportVar();
+	/**
+	 * @param {InitFragment[]} initFragments target array for init fragments
+	 * @param {HarmonyExportImportedSpecifierDependency} dep dependency
+	 * @param {ExportMode} mode the export mode
+	 * @param {Module} module the current module
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @param {RuntimeTemplate} runtimeTemplate the runtime template
+	 * @param {RuntimeRequirements} runtimeRequirements runtime requirements
+	 * @returns {void}
+	 */
+	_addExportFragments(
+		initFragments,
+		dep,
+		mode,
+		module,
+		moduleGraph,
+		runtime,
+		runtimeTemplate,
+		runtimeRequirements
+	) {
+		const importedModule = /** @type {Module} */ (moduleGraph.getModule(dep));
+		const importVar = dep.getImportVar(moduleGraph);
 
 		switch (mode.type) {
 			case "missing":
-				return `throw new Error(${JSON.stringify(
-					`Cannot find module '${mode.userRequest}'`
-				)});\n`;
+			case "empty-star":
+				initFragments.push(
+					new InitFragment(
+						"/* empty/unused harmony star reexport */\n",
+						InitFragment.STAGE_HARMONY_EXPORTS,
+						1
+					)
+				);
+				break;
 
 			case "unused":
-				return `${Template.toNormalComment(
-					`unused harmony reexport ${mode.name}`
-				)}\n`;
-
-			case "reexport-non-harmony-default":
-				return (
-					"/* harmony reexport (default from non-harmony) */ " +
-					this.getReexportStatement(
-						module,
-						module.isUsed(mode.name),
-						importVar,
-						null
+				initFragments.push(
+					new InitFragment(
+						`${Template.toNormalComment(
+							`unused harmony reexport ${mode.name}`
+						)}\n`,
+						InitFragment.STAGE_HARMONY_EXPORTS,
+						1
 					)
 				);
+				break;
 
-			case "reexport-named-default":
-				return (
-					"/* harmony reexport (default from named exports) */ " +
-					this.getReexportStatement(
+			case "reexport-dynamic-default":
+				initFragments.push(
+					this.getReexportFragment(
 						module,
-						module.isUsed(mode.name),
+						"reexport default from dynamic",
+						moduleGraph
+							.getExportsInfo(module)
+							.getUsedName(/** @type {string} */ (mode.name), runtime),
 						importVar,
-						""
+						null,
+						runtimeRequirements
 					)
 				);
+				break;
 
 			case "reexport-fake-namespace-object":
-				return (
-					"/* harmony reexport (fake namespace object from non-harmony) */ " +
-					this.getReexportFakeNamespaceObjectStatement(
+				initFragments.push(
+					...this.getReexportFakeNamespaceObjectFragments(
 						module,
-						module.isUsed(mode.name),
-						importVar
+						moduleGraph
+							.getExportsInfo(module)
+							.getUsedName(/** @type {string} */ (mode.name), runtime),
+						importVar,
+						mode.fakeType,
+						runtimeRequirements
 					)
 				);
+				break;
 
-			case "rexport-non-harmony-undefined":
-				return (
-					"/* harmony reexport (non default export from non-harmony) */ " +
-					this.getReexportStatement(
+			case "reexport-undefined":
+				initFragments.push(
+					this.getReexportFragment(
 						module,
-						module.isUsed(mode.name),
+						"reexport non-default export from non-harmony",
+						moduleGraph
+							.getExportsInfo(module)
+							.getUsedName(/** @type {string} */ (mode.name), runtime),
 						"undefined",
-						""
+						"",
+						runtimeRequirements
 					)
 				);
+				break;
 
-			case "reexport-non-harmony-default-strict":
-				return (
-					"/* harmony reexport (default from non-harmony) */ " +
-					this.getReexportStatement(
+			case "reexport-named-default":
+				initFragments.push(
+					this.getReexportFragment(
 						module,
-						module.isUsed(mode.name),
+						"reexport default export from named module",
+						moduleGraph
+							.getExportsInfo(module)
+							.getUsedName(/** @type {string} */ (mode.name), runtime),
 						importVar,
-						""
+						"",
+						runtimeRequirements
 					)
 				);
+				break;
 
 			case "reexport-namespace-object":
-				return (
-					"/* harmony reexport (module object) */ " +
-					this.getReexportStatement(
+				initFragments.push(
+					this.getReexportFragment(
 						module,
-						module.isUsed(mode.name),
+						"reexport module object",
+						moduleGraph
+							.getExportsInfo(module)
+							.getUsedName(/** @type {string} */ (mode.name), runtime),
 						importVar,
-						""
+						"",
+						runtimeRequirements
 					)
 				);
-
-			case "empty-star":
-				return "/* empty/unused harmony star reexport */";
-
-			case "safe-reexport":
-				return Array.from(mode.map.entries())
-					.map(item => {
-						return (
-							"/* harmony reexport (safe) */ " +
-							this.getReexportStatement(
-								module,
-								module.isUsed(item[0]),
-								importVar,
-								importedModule.isUsed(item[1])
-							) +
-							"\n"
+				break;
+
+			case "normal-reexport":
+				for (const {
+					name,
+					ids,
+					checked,
+					hidden
+				} of /** @type {NormalReexportItem[]} */ (mode.items)) {
+					if (hidden) continue;
+					if (checked) {
+						const connection = moduleGraph.getConnection(dep);
+						const key = `harmony reexport (checked) ${importVar} ${name}`;
+						const runtimeCondition = dep.weak
+							? false
+							: connection
+								? filterRuntime(runtime, r => connection.isTargetActive(r))
+								: true;
+						initFragments.push(
+							new ConditionalInitFragment(
+								`/* harmony reexport (checked) */ ${this.getConditionalReexportStatement(
+									module,
+									name,
+									importVar,
+									ids,
+									runtimeRequirements
+								)}`,
+								moduleGraph.isAsync(importedModule)
+									? InitFragment.STAGE_ASYNC_HARMONY_IMPORTS
+									: InitFragment.STAGE_HARMONY_IMPORTS,
+								dep.sourceOrder,
+								key,
+								runtimeCondition
+							)
 						);
-					})
-					.join("");
-
-			case "checked-reexport":
-				return Array.from(mode.map.entries())
-					.map(item => {
-						return (
-							"/* harmony reexport (checked) */ " +
-							this.getConditionalReexportStatement(
+					} else {
+						initFragments.push(
+							this.getReexportFragment(
 								module,
-								item[0],
+								"reexport safe",
+								moduleGraph.getExportsInfo(module).getUsedName(name, runtime),
 								importVar,
-								item[1]
-							) +
-							"\n"
+								moduleGraph
+									.getExportsInfo(importedModule)
+									.getUsedName(ids, runtime),
+								runtimeRequirements
+							)
 						);
-					})
-					.join("");
+					}
+				}
+				break;
 
 			case "dynamic-reexport": {
-				const activeExports = new Set([
-					...dep.activeExports,
-					...dep._discoverActiveExportsFromOtherStartExports()
-				]);
+				const ignored = mode.hidden
+					? combine(
+							/** @type {ExportModeIgnored} */
+							(mode.ignored),
+							mode.hidden
+						)
+					: /** @type {ExportModeIgnored} */ (mode.ignored);
+				const modern =
+					runtimeTemplate.supportsConst() &&
+					runtimeTemplate.supportsArrowFunction();
 				let content =
-					"/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in " +
-					importVar +
-					") ";
+					"/* harmony reexport (unknown) */ var __WEBPACK_REEXPORT_OBJECT__ = {};\n" +
+					`/* harmony reexport (unknown) */ for(${
+						modern ? "const" : "var"
+					} __WEBPACK_IMPORT_KEY__ in ${importVar}) `;
 
 				// Filter out exports which are defined by other exports
 				// and filter out default export because it cannot be reexported with *
-				if (activeExports.size > 0) {
-					content +=
-						"if(" +
-						JSON.stringify(Array.from(activeExports).concat("default")) +
-						".indexOf(__WEBPACK_IMPORT_KEY__) < 0) ";
-				} else {
-					content += "if(__WEBPACK_IMPORT_KEY__ !== 'default') ";
+				if (ignored.size > 1) {
+					content += `if(${JSON.stringify(
+						Array.from(ignored)
+					)}.indexOf(__WEBPACK_IMPORT_KEY__) < 0) `;
+				} else if (ignored.size === 1) {
+					content += `if(__WEBPACK_IMPORT_KEY__ !== ${JSON.stringify(
+						first(ignored)
+					)}) `;
 				}
-				const exportsName = dep.originModule.exportsArgument;
-				return (
-					content +
-					`(function(key) { __webpack_require__.d(${exportsName}, key, function() { return ${importVar}[key]; }) }(__WEBPACK_IMPORT_KEY__));\n`
+
+				content += "__WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = ";
+				content += modern
+					? `() => ${importVar}[__WEBPACK_IMPORT_KEY__]`
+					: `function(key) { return ${importVar}[key]; }.bind(0, __WEBPACK_IMPORT_KEY__)`;
+
+				runtimeRequirements.add(RuntimeGlobals.exports);
+				runtimeRequirements.add(RuntimeGlobals.definePropertyGetters);
+
+				const exportsName = module.exportsArgument;
+				initFragments.push(
+					new InitFragment(
+						`${content}\n/* harmony reexport (unknown) */ ${RuntimeGlobals.definePropertyGetters}(${exportsName}, __WEBPACK_REEXPORT_OBJECT__);\n`,
+						moduleGraph.isAsync(importedModule)
+							? InitFragment.STAGE_ASYNC_HARMONY_IMPORTS
+							: InitFragment.STAGE_HARMONY_IMPORTS,
+						dep.sourceOrder
+					)
 				);
+				break;
 			}
 
 			default:
@@ -601,45 +1245,168 @@ HarmonyExportImportedSpecifierDependency.Template = class HarmonyExportImportedS
 		}
 	}
 
-	getReexportStatement(module, key, name, valueKey) {
-		const exportsName = module.exportsArgument;
+	/**
+	 * @param {Module} module the current module
+	 * @param {string} comment comment
+	 * @param {UsedName} key key
+	 * @param {string} name name
+	 * @param {string | string[] | null | false} valueKey value key
+	 * @param {RuntimeRequirements} runtimeRequirements runtime requirements
+	 * @returns {HarmonyExportInitFragment} harmony export init fragment
+	 */
+	getReexportFragment(
+		module,
+		comment,
+		key,
+		name,
+		valueKey,
+		runtimeRequirements
+	) {
 		const returnValue = this.getReturnValue(name, valueKey);
-		return `__webpack_require__.d(${exportsName}, ${JSON.stringify(
-			key
-		)}, function() { return ${returnValue}; });\n`;
+
+		runtimeRequirements.add(RuntimeGlobals.exports);
+		runtimeRequirements.add(RuntimeGlobals.definePropertyGetters);
+
+		const map = new Map();
+		map.set(key, `/* ${comment} */ ${returnValue}`);
+
+		return new HarmonyExportInitFragment(module.exportsArgument, map);
 	}
 
-	getReexportFakeNamespaceObjectStatement(module, key, name) {
-		const exportsName = module.exportsArgument;
-		return `__webpack_require__.d(${exportsName}, ${JSON.stringify(
-			key
-		)}, function() { return __webpack_require__.t(${name}); });\n`;
+	/**
+	 * @param {Module} module module
+	 * @param {string | string[] | false} key key
+	 * @param {string} name name
+	 * @param {number} fakeType fake type
+	 * @param {RuntimeRequirements} runtimeRequirements runtime requirements
+	 * @returns {[InitFragment, HarmonyExportInitFragment]} init fragments
+	 */
+	getReexportFakeNamespaceObjectFragments(
+		module,
+		key,
+		name,
+		fakeType,
+		runtimeRequirements
+	) {
+		runtimeRequirements.add(RuntimeGlobals.exports);
+		runtimeRequirements.add(RuntimeGlobals.definePropertyGetters);
+		runtimeRequirements.add(RuntimeGlobals.createFakeNamespaceObject);
+
+		const map = new Map();
+		map.set(
+			key,
+			`/* reexport fake namespace object from non-harmony */ ${name}_namespace_cache || (${name}_namespace_cache = ${
+				RuntimeGlobals.createFakeNamespaceObject
+			}(${name}${fakeType ? `, ${fakeType}` : ""}))`
+		);
+
+		return [
+			new InitFragment(
+				`var ${name}_namespace_cache;\n`,
+				InitFragment.STAGE_CONSTANTS,
+				-1,
+				`${name}_namespace_cache`
+			),
+			new HarmonyExportInitFragment(module.exportsArgument, map)
+		];
 	}
 
-	getConditionalReexportStatement(module, key, name, valueKey) {
+	/**
+	 * @param {Module} module module
+	 * @param {string} key key
+	 * @param {string} name name
+	 * @param {string | string[] | false} valueKey value key
+	 * @param {RuntimeRequirements} runtimeRequirements runtime requirements
+	 * @returns {string} result
+	 */
+	getConditionalReexportStatement(
+		module,
+		key,
+		name,
+		valueKey,
+		runtimeRequirements
+	) {
 		if (valueKey === false) {
 			return "/* unused export */\n";
 		}
+
 		const exportsName = module.exportsArgument;
 		const returnValue = this.getReturnValue(name, valueKey);
-		return `if(__webpack_require__.o(${name}, ${JSON.stringify(
-			valueKey
-		)})) __webpack_require__.d(${exportsName}, ${JSON.stringify(
+
+		runtimeRequirements.add(RuntimeGlobals.exports);
+		runtimeRequirements.add(RuntimeGlobals.definePropertyGetters);
+		runtimeRequirements.add(RuntimeGlobals.hasOwnProperty);
+
+		return `if(${RuntimeGlobals.hasOwnProperty}(${name}, ${JSON.stringify(
+			valueKey[0]
+		)})) ${
+			RuntimeGlobals.definePropertyGetters
+		}(${exportsName}, { ${propertyName(
 			key
-		)}, function() { return ${returnValue}; });\n`;
+		)}: function() { return ${returnValue}; } });\n`;
 	}
 
+	/**
+	 * @param {string} name name
+	 * @param {null | false | string | string[]} valueKey value key
+	 * @returns {string | undefined} value
+	 */
 	getReturnValue(name, valueKey) {
 		if (valueKey === null) {
 			return `${name}_default.a`;
 		}
+
 		if (valueKey === "") {
 			return name;
 		}
+
 		if (valueKey === false) {
 			return "/* unused export */ undefined";
 		}
 
-		return `${name}[${JSON.stringify(valueKey)}]`;
+		return `${name}${propertyAccess(valueKey)}`;
 	}
 };
+
+class HarmonyStarExportsList {
+	constructor() {
+		/** @type {HarmonyExportImportedSpecifierDependency[]} */
+		this.dependencies = [];
+	}
+
+	/**
+	 * @param {HarmonyExportImportedSpecifierDependency} dep dependency
+	 * @returns {void}
+	 */
+	push(dep) {
+		this.dependencies.push(dep);
+	}
+
+	slice() {
+		return this.dependencies.slice();
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize({ write, setCircularReference }) {
+		setCircularReference(this);
+		write(this.dependencies);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize({ read, setCircularReference }) {
+		setCircularReference(this);
+		this.dependencies = read();
+	}
+}
+
+makeSerializable(
+	HarmonyStarExportsList,
+	"webpack/lib/dependencies/HarmonyExportImportedSpecifierDependency",
+	"HarmonyStarExportsList"
+);
+
+module.exports.HarmonyStarExportsList = HarmonyStarExportsList;
diff --git a/lib/dependencies/HarmonyExportInitFragment.js b/lib/dependencies/HarmonyExportInitFragment.js
new file mode 100644
index 00000000000..8125cc2db8b
--- /dev/null
+++ b/lib/dependencies/HarmonyExportInitFragment.js
@@ -0,0 +1,177 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const InitFragment = require("../InitFragment");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const { first } = require("../util/SetHelpers");
+const { propertyName } = require("../util/propertyName");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../Generator").GenerateContext} GenerateContext */
+
+/**
+ * @param {Iterable} iterable iterable strings
+ * @returns {string} result
+ */
+const joinIterableWithComma = iterable => {
+	// This is more performant than Array.from().join(", ")
+	// as it doesn't create an array
+	let str = "";
+	let first = true;
+	for (const item of iterable) {
+		if (first) {
+			first = false;
+		} else {
+			str += ", ";
+		}
+		str += item;
+	}
+	return str;
+};
+
+const EMPTY_MAP = new Map();
+const EMPTY_SET = new Set();
+
+/**
+ * @extends {InitFragment} Context
+ */
+class HarmonyExportInitFragment extends InitFragment {
+	/**
+	 * @param {string} exportsArgument the exports identifier
+	 * @param {Map} exportMap mapping from used name to exposed variable name
+	 * @param {Set} unusedExports list of unused export names
+	 */
+	constructor(
+		exportsArgument,
+		exportMap = EMPTY_MAP,
+		unusedExports = EMPTY_SET
+	) {
+		super(undefined, InitFragment.STAGE_HARMONY_EXPORTS, 1, "harmony-exports");
+		this.exportsArgument = exportsArgument;
+		this.exportMap = exportMap;
+		this.unusedExports = unusedExports;
+	}
+
+	/**
+	 * @param {HarmonyExportInitFragment[]} fragments all fragments to merge
+	 * @returns {HarmonyExportInitFragment} merged fragment
+	 */
+	mergeAll(fragments) {
+		let exportMap;
+		let exportMapOwned = false;
+		let unusedExports;
+		let unusedExportsOwned = false;
+
+		for (const fragment of fragments) {
+			if (fragment.exportMap.size !== 0) {
+				if (exportMap === undefined) {
+					exportMap = fragment.exportMap;
+					exportMapOwned = false;
+				} else {
+					if (!exportMapOwned) {
+						exportMap = new Map(exportMap);
+						exportMapOwned = true;
+					}
+					for (const [key, value] of fragment.exportMap) {
+						if (!exportMap.has(key)) exportMap.set(key, value);
+					}
+				}
+			}
+			if (fragment.unusedExports.size !== 0) {
+				if (unusedExports === undefined) {
+					unusedExports = fragment.unusedExports;
+					unusedExportsOwned = false;
+				} else {
+					if (!unusedExportsOwned) {
+						unusedExports = new Set(unusedExports);
+						unusedExportsOwned = true;
+					}
+					for (const value of fragment.unusedExports) {
+						unusedExports.add(value);
+					}
+				}
+			}
+		}
+		return new HarmonyExportInitFragment(
+			this.exportsArgument,
+			exportMap,
+			unusedExports
+		);
+	}
+
+	/**
+	 * @param {HarmonyExportInitFragment} other other
+	 * @returns {HarmonyExportInitFragment} merged result
+	 */
+	merge(other) {
+		let exportMap;
+		if (this.exportMap.size === 0) {
+			exportMap = other.exportMap;
+		} else if (other.exportMap.size === 0) {
+			exportMap = this.exportMap;
+		} else {
+			exportMap = new Map(other.exportMap);
+			for (const [key, value] of this.exportMap) {
+				if (!exportMap.has(key)) exportMap.set(key, value);
+			}
+		}
+		let unusedExports;
+		if (this.unusedExports.size === 0) {
+			unusedExports = other.unusedExports;
+		} else if (other.unusedExports.size === 0) {
+			unusedExports = this.unusedExports;
+		} else {
+			unusedExports = new Set(other.unusedExports);
+			for (const value of this.unusedExports) {
+				unusedExports.add(value);
+			}
+		}
+		return new HarmonyExportInitFragment(
+			this.exportsArgument,
+			exportMap,
+			unusedExports
+		);
+	}
+
+	/**
+	 * @param {GenerateContext} context context
+	 * @returns {string | Source | undefined} the source code that will be included as initialization code
+	 */
+	getContent({ runtimeTemplate, runtimeRequirements }) {
+		runtimeRequirements.add(RuntimeGlobals.exports);
+		runtimeRequirements.add(RuntimeGlobals.definePropertyGetters);
+
+		const unusedPart =
+			this.unusedExports.size > 1
+				? `/* unused harmony exports ${joinIterableWithComma(
+						this.unusedExports
+					)} */\n`
+				: this.unusedExports.size > 0
+					? `/* unused harmony export ${first(this.unusedExports)} */\n`
+					: "";
+		const definitions = [];
+		const orderedExportMap = Array.from(this.exportMap).sort(([a], [b]) =>
+			a < b ? -1 : 1
+		);
+		for (const [key, value] of orderedExportMap) {
+			definitions.push(
+				`\n/* harmony export */   ${propertyName(
+					key
+				)}: ${runtimeTemplate.returningFunction(value)}`
+			);
+		}
+		const definePart =
+			this.exportMap.size > 0
+				? `/* harmony export */ ${RuntimeGlobals.definePropertyGetters}(${
+						this.exportsArgument
+					}, {${definitions.join(",")}\n/* harmony export */ });\n`
+				: "";
+		return `${definePart}${unusedPart}`;
+	}
+}
+
+module.exports = HarmonyExportInitFragment;
diff --git a/lib/dependencies/HarmonyExportSpecifierDependency.js b/lib/dependencies/HarmonyExportSpecifierDependency.js
index 1bf6a3fe6d1..b15d0846e3d 100644
--- a/lib/dependencies/HarmonyExportSpecifierDependency.js
+++ b/lib/dependencies/HarmonyExportSpecifierDependency.js
@@ -2,13 +2,29 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const makeSerializable = require("../util/makeSerializable");
+const HarmonyExportInitFragment = require("./HarmonyExportInitFragment");
 const NullDependency = require("./NullDependency");
 
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").ExportsSpec} ExportsSpec */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../ModuleGraphConnection").ConnectionState} ConnectionState */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
 class HarmonyExportSpecifierDependency extends NullDependency {
-	constructor(originModule, id, name) {
+	/**
+	 * @param {string} id the id
+	 * @param {string} name the name
+	 */
+	constructor(id, name) {
 		super();
-		this.originModule = originModule;
 		this.id = id;
 		this.name = name;
 	}
@@ -17,37 +33,90 @@ class HarmonyExportSpecifierDependency extends NullDependency {
 		return "harmony export specifier";
 	}
 
-	getExports() {
+	/**
+	 * Returns the exported names
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {ExportsSpec | undefined} export names
+	 */
+	getExports(moduleGraph) {
 		return {
 			exports: [this.name],
+			priority: 1,
+			terminalBinding: true,
 			dependencies: undefined
 		};
 	}
-}
 
-HarmonyExportSpecifierDependency.Template = class HarmonyExportSpecifierDependencyTemplate {
-	apply(dep, source) {}
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @returns {ConnectionState} how this dependency connects the module to referencing modules
+	 */
+	getModuleEvaluationSideEffectsState(moduleGraph) {
+		return false;
+	}
 
-	getHarmonyInitOrder(dep) {
-		return 0;
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.id);
+		write(this.name);
+		super.serialize(context);
 	}
 
-	harmonyInit(dep, source, runtime) {
-		const content = this.getContent(dep);
-		source.insert(-1, content);
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.id = read();
+		this.name = read();
+		super.deserialize(context);
 	}
+}
+
+makeSerializable(
+	HarmonyExportSpecifierDependency,
+	"webpack/lib/dependencies/HarmonyExportSpecifierDependency"
+);
 
-	getContent(dep) {
-		const used = dep.originModule.isUsed(dep.name);
+HarmonyExportSpecifierDependency.Template = class HarmonyExportSpecifierDependencyTemplate extends (
+	NullDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(
+		dependency,
+		source,
+		{ module, moduleGraph, initFragments, runtime, concatenationScope }
+	) {
+		const dep = /** @type {HarmonyExportSpecifierDependency} */ (dependency);
+		if (concatenationScope) {
+			concatenationScope.registerExport(dep.name, dep.id);
+			return;
+		}
+		const used = moduleGraph
+			.getExportsInfo(module)
+			.getUsedName(dep.name, runtime);
 		if (!used) {
-			return `/* unused harmony export ${dep.name || "namespace"} */\n`;
+			const set = new Set();
+			set.add(dep.name || "namespace");
+			initFragments.push(
+				new HarmonyExportInitFragment(module.exportsArgument, undefined, set)
+			);
+			return;
 		}
 
-		const exportsName = dep.originModule.exportsArgument;
-
-		return `/* harmony export (binding) */ __webpack_require__.d(${exportsName}, ${JSON.stringify(
-			used
-		)}, function() { return ${dep.id}; });\n`;
+		const map = new Map();
+		map.set(used, `/* binding */ ${dep.id}`);
+		initFragments.push(
+			new HarmonyExportInitFragment(module.exportsArgument, map, undefined)
+		);
 	}
 };
 
diff --git a/lib/dependencies/HarmonyExports.js b/lib/dependencies/HarmonyExports.js
new file mode 100644
index 00000000000..1f6e6d4acb9
--- /dev/null
+++ b/lib/dependencies/HarmonyExports.js
@@ -0,0 +1,46 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+
+/** @typedef {import("../Module").BuildInfo} BuildInfo */
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
+/** @typedef {import("../Parser").ParserState} ParserState */
+
+/** @type {WeakMap} */
+const parserStateExportsState = new WeakMap();
+
+/**
+ * @param {ParserState} parserState parser state
+ * @param {boolean} isStrictHarmony strict harmony mode should be enabled
+ * @returns {void}
+ */
+module.exports.enable = (parserState, isStrictHarmony) => {
+	const value = parserStateExportsState.get(parserState);
+	if (value === false) return;
+	parserStateExportsState.set(parserState, true);
+	if (value !== true) {
+		const buildMeta = /** @type {BuildMeta} */ (parserState.module.buildMeta);
+		buildMeta.exportsType = "namespace";
+		const buildInfo = /** @type {BuildInfo} */ (parserState.module.buildInfo);
+		buildInfo.strict = true;
+		buildInfo.exportsArgument = RuntimeGlobals.exports;
+		if (isStrictHarmony) {
+			buildMeta.strictHarmonyModule = true;
+			buildInfo.moduleArgument = "__webpack_module__";
+		}
+	}
+};
+
+/**
+ * @param {ParserState} parserState parser state
+ * @returns {boolean} true, when enabled
+ */
+module.exports.isEnabled = parserState => {
+	const value = parserStateExportsState.get(parserState);
+	return value === true;
+};
diff --git a/lib/dependencies/HarmonyImportDependency.js b/lib/dependencies/HarmonyImportDependency.js
index 97fd9bf6c20..fab851ee831 100644
--- a/lib/dependencies/HarmonyImportDependency.js
+++ b/lib/dependencies/HarmonyImportDependency.js
@@ -2,108 +2,383 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const DependencyReference = require("./DependencyReference");
-const ModuleDependency = require("./ModuleDependency");
+const ConditionalInitFragment = require("../ConditionalInitFragment");
+const Dependency = require("../Dependency");
+const HarmonyLinkingError = require("../HarmonyLinkingError");
+const InitFragment = require("../InitFragment");
 const Template = require("../Template");
+const AwaitDependenciesInitFragment = require("../async-modules/AwaitDependenciesInitFragment");
+const { filterRuntime, mergeRuntime } = require("../util/runtime");
+const ModuleDependency = require("./ModuleDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../ExportsInfo")} ExportsInfo */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
+/** @typedef {import("../WebpackError")} WebpackError */
+/** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+
+/** @typedef {0 | 1 | 2 | 3 | false} ExportPresenceMode */
+
+const ExportPresenceModes = {
+	NONE: /** @type {ExportPresenceMode} */ (0),
+	WARN: /** @type {ExportPresenceMode} */ (1),
+	AUTO: /** @type {ExportPresenceMode} */ (2),
+	ERROR: /** @type {ExportPresenceMode} */ (3),
+	/**
+	 * @param {string | false} str param
+	 * @returns {ExportPresenceMode} result
+	 */
+	fromUserOption(str) {
+		switch (str) {
+			case "error":
+				return ExportPresenceModes.ERROR;
+			case "warn":
+				return ExportPresenceModes.WARN;
+			case "auto":
+				return ExportPresenceModes.AUTO;
+			case false:
+				return ExportPresenceModes.NONE;
+			default:
+				throw new Error(`Invalid export presence value ${str}`);
+		}
+	}
+};
 
 class HarmonyImportDependency extends ModuleDependency {
-	constructor(request, originModule, sourceOrder, parserScope) {
+	/**
+	 * @param {string} request request string
+	 * @param {number} sourceOrder source order
+	 * @param {ImportAttributes=} attributes import attributes
+	 */
+	constructor(request, sourceOrder, attributes) {
 		super(request);
-		this.redirectedModule = undefined;
-		this.originModule = originModule;
 		this.sourceOrder = sourceOrder;
-		this.parserScope = parserScope;
+		this.assertions = attributes;
 	}
 
-	get _module() {
-		return this.redirectedModule || this.module;
+	get category() {
+		return "esm";
 	}
 
-	getReference() {
-		if (!this._module) return null;
-		return new DependencyReference(
-			this._module,
-			false,
-			this.weak,
-			this.sourceOrder
-		);
+	/**
+	 * Returns list of exports referenced by this dependency
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @param {RuntimeSpec} runtime the runtime for which the module is analysed
+	 * @returns {(string[] | ReferencedExport)[]} referenced exports
+	 */
+	getReferencedExports(moduleGraph, runtime) {
+		return Dependency.NO_EXPORTS_REFERENCED;
 	}
 
-	getImportVar() {
-		let importVarMap = this.parserScope.importVarMap;
-		if (!importVarMap) this.parserScope.importVarMap = importVarMap = new Map();
-		let importVar = importVarMap.get(this._module);
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @returns {string} name of the variable for the import
+	 */
+	getImportVar(moduleGraph) {
+		const module = /** @type {Module} */ (moduleGraph.getParentModule(this));
+		const meta = moduleGraph.getMeta(module);
+		let importVarMap = meta.importVarMap;
+		if (!importVarMap) meta.importVarMap = importVarMap = new Map();
+		let importVar = importVarMap.get(
+			/** @type {Module} */ (moduleGraph.getModule(this))
+		);
 		if (importVar) return importVar;
 		importVar = `${Template.toIdentifier(
 			`${this.userRequest}`
 		)}__WEBPACK_IMPORTED_MODULE_${importVarMap.size}__`;
-		importVarMap.set(this._module, importVar);
+		importVarMap.set(
+			/** @type {Module} */ (moduleGraph.getModule(this)),
+			importVar
+		);
 		return importVar;
 	}
 
-	getImportStatement(update, runtime) {
-		return runtime.importStatement({
+	/**
+	 * @param {boolean} update create new variables or update existing one
+	 * @param {DependencyTemplateContext} templateContext the template context
+	 * @returns {[string, string]} the import statement and the compat statement
+	 */
+	getImportStatement(
+		update,
+		{ runtimeTemplate, module, moduleGraph, chunkGraph, runtimeRequirements }
+	) {
+		return runtimeTemplate.importStatement({
 			update,
-			module: this._module,
-			importVar: this.getImportVar(),
+			module: /** @type {Module} */ (moduleGraph.getModule(this)),
+			chunkGraph,
+			importVar: this.getImportVar(moduleGraph),
 			request: this.request,
-			originModule: this.originModule
+			originModule: module,
+			runtimeRequirements
 		});
 	}
 
-	updateHash(hash) {
-		super.updateHash(hash);
-		const importedModule = this._module;
-		hash.update(
-			(importedModule &&
-				(!importedModule.buildMeta || importedModule.buildMeta.exportsType)) +
-				""
+	/**
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @param {string[]} ids imported ids
+	 * @param {string} additionalMessage extra info included in the error message
+	 * @returns {WebpackError[] | undefined} errors
+	 */
+	getLinkingErrors(moduleGraph, ids, additionalMessage) {
+		const importedModule = moduleGraph.getModule(this);
+		// ignore errors for missing or failed modules
+		if (!importedModule || importedModule.getNumberOfErrors() > 0) {
+			return;
+		}
+
+		const parentModule =
+			/** @type {Module} */
+			(moduleGraph.getParentModule(this));
+		const exportsType = importedModule.getExportsType(
+			moduleGraph,
+			/** @type {BuildMeta} */ (parentModule.buildMeta).strictHarmonyModule
 		);
-		hash.update((importedModule && importedModule.id) + "");
+		if (exportsType === "namespace" || exportsType === "default-with-named") {
+			if (ids.length === 0) {
+				return;
+			}
+
+			if (
+				(exportsType !== "default-with-named" || ids[0] !== "default") &&
+				moduleGraph.isExportProvided(importedModule, ids) === false
+			) {
+				// We are sure that it's not provided
+
+				// Try to provide detailed info in the error message
+				let pos = 0;
+				let exportsInfo = moduleGraph.getExportsInfo(importedModule);
+				while (pos < ids.length && exportsInfo) {
+					const id = ids[pos++];
+					const exportInfo = exportsInfo.getReadOnlyExportInfo(id);
+					if (exportInfo.provided === false) {
+						// We are sure that it's not provided
+						const providedExports = exportsInfo.getProvidedExports();
+						const moreInfo = !Array.isArray(providedExports)
+							? " (possible exports unknown)"
+							: providedExports.length === 0
+								? " (module has no exports)"
+								: ` (possible exports: ${providedExports.join(", ")})`;
+						return [
+							new HarmonyLinkingError(
+								`export ${ids
+									.slice(0, pos)
+									.map(id => `'${id}'`)
+									.join(".")} ${additionalMessage} was not found in '${
+									this.userRequest
+								}'${moreInfo}`
+							)
+						];
+					}
+					exportsInfo =
+						/** @type {ExportsInfo} */
+						(exportInfo.getNestedExportsInfo());
+				}
+
+				// General error message
+				return [
+					new HarmonyLinkingError(
+						`export ${ids
+							.map(id => `'${id}'`)
+							.join(".")} ${additionalMessage} was not found in '${
+							this.userRequest
+						}'`
+					)
+				];
+			}
+		}
+		switch (exportsType) {
+			case "default-only":
+				// It's has only a default export
+				if (ids.length > 0 && ids[0] !== "default") {
+					// In strict harmony modules we only support the default export
+					return [
+						new HarmonyLinkingError(
+							`Can't import the named export ${ids
+								.map(id => `'${id}'`)
+								.join(
+									"."
+								)} ${additionalMessage} from default-exporting module (only default export is available)`
+						)
+					];
+				}
+				break;
+			case "default-with-named":
+				// It has a default export and named properties redirect
+				// In some cases we still want to warn here
+				if (
+					ids.length > 0 &&
+					ids[0] !== "default" &&
+					/** @type {BuildMeta} */
+					(importedModule.buildMeta).defaultObject === "redirect-warn"
+				) {
+					// For these modules only the default export is supported
+					return [
+						new HarmonyLinkingError(
+							`Should not import the named export ${ids
+								.map(id => `'${id}'`)
+								.join(
+									"."
+								)} ${additionalMessage} from default-exporting module (only default export is available soon)`
+						)
+					];
+				}
+				break;
+		}
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.sourceOrder);
+		write(this.assertions);
+		super.serialize(context);
 	}
 
-	disconnect() {
-		super.disconnect();
-		this.redirectedModule = undefined;
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.sourceOrder = read();
+		this.assertions = read();
+		super.deserialize(context);
 	}
 }
 
 module.exports = HarmonyImportDependency;
 
+/** @type {WeakMap>} */
 const importEmittedMap = new WeakMap();
 
-HarmonyImportDependency.Template = class HarmonyImportDependencyTemplate {
-	apply(dep, source, runtime) {
-		// no-op
-	}
+HarmonyImportDependency.Template = class HarmonyImportDependencyTemplate extends (
+	ModuleDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, templateContext) {
+		const dep = /** @type {HarmonyImportDependency} */ (dependency);
+		const { module, chunkGraph, moduleGraph, runtime } = templateContext;
 
-	getHarmonyInitOrder(dep) {
-		return dep.sourceOrder;
-	}
+		const connection = moduleGraph.getConnection(dep);
+		if (connection && !connection.isTargetActive(runtime)) return;
 
-	static isImportEmitted(dep, source) {
-		let sourceInfo = importEmittedMap.get(source);
-		if (!sourceInfo) return false;
-		const key = dep._module || dep.request;
-		return key && sourceInfo.emittedImports.get(key);
-	}
+		const referencedModule = connection && connection.module;
+
+		if (
+			connection &&
+			connection.weak &&
+			referencedModule &&
+			chunkGraph.getModuleId(referencedModule) === null
+		) {
+			// in weak references, module might not be in any chunk
+			// but that's ok, we don't need that logic in this case
+			return;
+		}
+
+		const moduleKey = referencedModule
+			? referencedModule.identifier()
+			: dep.request;
+		const key = `harmony import ${moduleKey}`;
 
-	harmonyInit(dep, source, runtime, dependencyTemplates) {
-		let sourceInfo = importEmittedMap.get(source);
-		if (!sourceInfo) {
-			importEmittedMap.set(
-				source,
-				(sourceInfo = {
-					emittedImports: new Map()
-				})
+		const runtimeCondition = dep.weak
+			? false
+			: connection
+				? filterRuntime(runtime, r => connection.isTargetActive(r))
+				: true;
+
+		if (module && referencedModule) {
+			let emittedModules = importEmittedMap.get(module);
+			if (emittedModules === undefined) {
+				emittedModules = new WeakMap();
+				importEmittedMap.set(module, emittedModules);
+			}
+			let mergedRuntimeCondition = runtimeCondition;
+			const oldRuntimeCondition = emittedModules.get(referencedModule) || false;
+			if (oldRuntimeCondition !== false && mergedRuntimeCondition !== true) {
+				if (mergedRuntimeCondition === false || oldRuntimeCondition === true) {
+					mergedRuntimeCondition = oldRuntimeCondition;
+				} else {
+					mergedRuntimeCondition = mergeRuntime(
+						oldRuntimeCondition,
+						mergedRuntimeCondition
+					);
+				}
+			}
+			emittedModules.set(referencedModule, mergedRuntimeCondition);
+		}
+
+		const importStatement = dep.getImportStatement(false, templateContext);
+		if (
+			referencedModule &&
+			templateContext.moduleGraph.isAsync(referencedModule)
+		) {
+			templateContext.initFragments.push(
+				new ConditionalInitFragment(
+					importStatement[0],
+					InitFragment.STAGE_HARMONY_IMPORTS,
+					dep.sourceOrder,
+					key,
+					runtimeCondition
+				)
+			);
+			templateContext.initFragments.push(
+				new AwaitDependenciesInitFragment(
+					new Set([dep.getImportVar(templateContext.moduleGraph)])
+				)
+			);
+			templateContext.initFragments.push(
+				new ConditionalInitFragment(
+					importStatement[1],
+					InitFragment.STAGE_ASYNC_HARMONY_IMPORTS,
+					dep.sourceOrder,
+					`${key} compat`,
+					runtimeCondition
+				)
+			);
+		} else {
+			templateContext.initFragments.push(
+				new ConditionalInitFragment(
+					importStatement[0] + importStatement[1],
+					InitFragment.STAGE_HARMONY_IMPORTS,
+					dep.sourceOrder,
+					key,
+					runtimeCondition
+				)
 			);
 		}
-		const key = dep._module || dep.request;
-		if (key && sourceInfo.emittedImports.get(key)) return;
-		sourceInfo.emittedImports.set(key, true);
-		const content = dep.getImportStatement(false, runtime);
-		source.insert(-1, content);
+	}
+
+	/**
+	 * @param {Module} module the module
+	 * @param {Module} referencedModule the referenced module
+	 * @returns {RuntimeSpec | boolean} runtimeCondition in which this import has been emitted
+	 */
+	static getImportEmittedRuntime(module, referencedModule) {
+		const emittedModules = importEmittedMap.get(module);
+		if (emittedModules === undefined) return false;
+		return emittedModules.get(referencedModule) || false;
 	}
 };
+
+module.exports.ExportPresenceModes = ExportPresenceModes;
diff --git a/lib/dependencies/HarmonyImportDependencyParserPlugin.js b/lib/dependencies/HarmonyImportDependencyParserPlugin.js
index 7f9fcde20d0..7fc43c6b228 100644
--- a/lib/dependencies/HarmonyImportDependencyParserPlugin.js
+++ b/lib/dependencies/HarmonyImportDependencyParserPlugin.js
@@ -2,37 +2,131 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const { SyncBailHook } = require("tapable");
+const HotModuleReplacementPlugin = require("../HotModuleReplacementPlugin");
+const { getImportAttributes } = require("../javascript/JavascriptParser");
+const InnerGraph = require("../optimize/InnerGraph");
+const ConstDependency = require("./ConstDependency");
+const HarmonyAcceptDependency = require("./HarmonyAcceptDependency");
+const HarmonyAcceptImportDependency = require("./HarmonyAcceptImportDependency");
+const HarmonyEvaluatedImportSpecifierDependency = require("./HarmonyEvaluatedImportSpecifierDependency");
+const HarmonyExports = require("./HarmonyExports");
+const { ExportPresenceModes } = require("./HarmonyImportDependency");
 const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency");
 const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDependency");
-const HarmonyAcceptImportDependency = require("./HarmonyAcceptImportDependency");
-const HarmonyAcceptDependency = require("./HarmonyAcceptDependency");
-const ConstDependency = require("./ConstDependency");
+
+/** @typedef {import("estree").Expression} Expression */
+/** @typedef {import("estree").Identifier} Identifier */
+/** @typedef {import("estree").Literal} Literal */
+/** @typedef {import("estree").MemberExpression} MemberExpression */
+/** @typedef {import("estree").ObjectExpression} ObjectExpression */
+/** @typedef {import("estree").Property} Property */
+/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("../javascript/BasicEvaluatedExpression")} BasicEvaluatedExpression */
+/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("../javascript/JavascriptParser").DestructuringAssignmentProperty} DestructuringAssignmentProperty */
+/** @typedef {import("../javascript/JavascriptParser").ExportAllDeclaration} ExportAllDeclaration */
+/** @typedef {import("../javascript/JavascriptParser").ExportNamedDeclaration} ExportNamedDeclaration */
+/** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */
+/** @typedef {import("../javascript/JavascriptParser").ImportDeclaration} ImportDeclaration */
+/** @typedef {import("../javascript/JavascriptParser").ImportExpression} ImportExpression */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../javascript/JavascriptParser").TagData} TagData */
+/** @typedef {import("../optimize/InnerGraph").InnerGraph} InnerGraph */
+/** @typedef {import("../optimize/InnerGraph").TopLevelSymbol} TopLevelSymbol */
+/** @typedef {import("./HarmonyImportDependency")} HarmonyImportDependency */
+
+const harmonySpecifierTag = Symbol("harmony import");
+
+/**
+ * @typedef {object} HarmonySettings
+ * @property {string[]} ids
+ * @property {string} source
+ * @property {number} sourceOrder
+ * @property {string} name
+ * @property {boolean} await
+ * @property {ImportAttributes=} attributes
+ */
 
 module.exports = class HarmonyImportDependencyParserPlugin {
-	constructor(moduleOptions) {
-		this.strictExportPresence = moduleOptions.strictExportPresence;
-		this.strictThisContextOnImports = moduleOptions.strictThisContextOnImports;
+	/**
+	 * @param {JavascriptParserOptions} options options
+	 */
+	constructor(options) {
+		this.exportPresenceMode =
+			options.importExportsPresence !== undefined
+				? ExportPresenceModes.fromUserOption(options.importExportsPresence)
+				: options.exportsPresence !== undefined
+					? ExportPresenceModes.fromUserOption(options.exportsPresence)
+					: options.strictExportPresence
+						? ExportPresenceModes.ERROR
+						: ExportPresenceModes.AUTO;
+		this.strictThisContextOnImports = options.strictThisContextOnImports;
 	}
 
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @returns {void}
+	 */
 	apply(parser) {
+		const { exportPresenceMode } = this;
+
+		/**
+		 * @param {string[]} members members
+		 * @param {boolean[]} membersOptionals members Optionals
+		 * @returns {string[]} a non optional part
+		 */
+		function getNonOptionalPart(members, membersOptionals) {
+			let i = 0;
+			while (i < members.length && membersOptionals[i] === false) i++;
+			return i !== members.length ? members.slice(0, i) : members;
+		}
+
+		/**
+		 * @param {TODO} node member expression
+		 * @param {number} count count
+		 * @returns {Expression} member expression
+		 */
+		function getNonOptionalMemberChain(node, count) {
+			while (count--) node = node.object;
+			return node;
+		}
+
+		parser.hooks.isPure
+			.for("Identifier")
+			.tap("HarmonyImportDependencyParserPlugin", expression => {
+				const expr = /** @type {Identifier} */ (expression);
+				if (
+					parser.isVariableDefined(expr.name) ||
+					parser.getTagData(expr.name, harmonySpecifierTag)
+				) {
+					return true;
+				}
+			});
 		parser.hooks.import.tap(
 			"HarmonyImportDependencyParserPlugin",
 			(statement, source) => {
 				parser.state.lastHarmonyImportOrder =
 					(parser.state.lastHarmonyImportOrder || 0) + 1;
-				const clearDep = new ConstDependency("", statement.range);
-				clearDep.loc = statement.loc;
-				parser.state.module.addDependency(clearDep);
+				const clearDep = new ConstDependency(
+					parser.isAsiPosition(/** @type {Range} */ (statement.range)[0])
+						? ";"
+						: "",
+					/** @type {Range} */ (statement.range)
+				);
+				clearDep.loc = /** @type {DependencyLocation} */ (statement.loc);
+				parser.state.module.addPresentationalDependency(clearDep);
+				parser.unsetAsiPosition(/** @type {Range} */ (statement.range)[1]);
+				const attributes = getImportAttributes(statement);
 				const sideEffectDep = new HarmonyImportSideEffectDependency(
-					source,
-					parser.state.module,
+					/** @type {string} */ (source),
 					parser.state.lastHarmonyImportOrder,
-					parser.state.harmonyParserScope
+					attributes
 				);
-				sideEffectDep.loc = statement.loc;
+				sideEffectDep.loc = /** @type {DependencyLocation} */ (statement.loc);
 				parser.state.module.addDependency(sideEffectDep);
 				return true;
 			}
@@ -40,183 +134,242 @@ module.exports = class HarmonyImportDependencyParserPlugin {
 		parser.hooks.importSpecifier.tap(
 			"HarmonyImportDependencyParserPlugin",
 			(statement, source, id, name) => {
-				parser.scope.definitions.delete(name);
-				parser.scope.renames.set(name, "imported var");
-				if (!parser.state.harmonySpecifier) {
-					parser.state.harmonySpecifier = new Map();
-				}
-				parser.state.harmonySpecifier.set(name, {
+				const ids = id === null ? [] : [id];
+				parser.tagVariable(name, harmonySpecifierTag, {
+					name,
 					source,
-					id,
-					sourceOrder: parser.state.lastHarmonyImportOrder
+					ids,
+					sourceOrder: parser.state.lastHarmonyImportOrder,
+					attributes: getImportAttributes(statement)
 				});
 				return true;
 			}
 		);
-		parser.hooks.expression
-			.for("imported var")
-			.tap("HarmonyImportDependencyParserPlugin", expr => {
-				const name = expr.name;
-				const settings = parser.state.harmonySpecifier.get(name);
-				const dep = new HarmonyImportSpecifierDependency(
+		parser.hooks.binaryExpression.tap(
+			"HarmonyImportDependencyParserPlugin",
+			expression => {
+				if (expression.operator !== "in") return;
+
+				const leftPartEvaluated = parser.evaluateExpression(expression.left);
+				if (leftPartEvaluated.couldHaveSideEffects()) return;
+				const leftPart = leftPartEvaluated.asString();
+				if (!leftPart) return;
+
+				const rightPart = parser.evaluateExpression(expression.right);
+				if (!rightPart.isIdentifier()) return;
+
+				const rootInfo = rightPart.rootInfo;
+				if (
+					typeof rootInfo === "string" ||
+					!rootInfo ||
+					!rootInfo.tagInfo ||
+					rootInfo.tagInfo.tag !== harmonySpecifierTag
+				)
+					return;
+				const settings = /** @type {TagData} */ (rootInfo.tagInfo.data);
+				const members =
+					/** @type {(() => string[])} */
+					(rightPart.getMembers)();
+				const dep = new HarmonyEvaluatedImportSpecifierDependency(
 					settings.source,
-					parser.state.module,
 					settings.sourceOrder,
-					parser.state.harmonyParserScope,
-					settings.id,
-					name,
-					expr.range,
-					this.strictExportPresence
+					settings.ids.concat(members).concat([leftPart]),
+					settings.name,
+					/** @type {Range} */ (expression.range),
+					settings.attributes,
+					"in"
 				);
-				dep.shorthand = parser.scope.inShorthand;
-				dep.directImport = true;
-				dep.loc = expr.loc;
+				dep.directImport = members.length === 0;
+				dep.asiSafe = !parser.isAsiPosition(
+					/** @type {Range} */ (expression.range)[0]
+				);
+				dep.loc = /** @type {DependencyLocation} */ (expression.loc);
 				parser.state.module.addDependency(dep);
+				InnerGraph.onUsage(parser.state, e => (dep.usedByExports = e));
 				return true;
-			});
-		parser.hooks.expressionAnyMember
-			.for("imported var")
+			}
+		);
+		parser.hooks.expression
+			.for(harmonySpecifierTag)
 			.tap("HarmonyImportDependencyParserPlugin", expr => {
-				const name = expr.object.name;
-				const settings = parser.state.harmonySpecifier.get(name);
-				if (settings.id !== null) return false;
+				const settings = /** @type {HarmonySettings} */ (parser.currentTagData);
 				const dep = new HarmonyImportSpecifierDependency(
 					settings.source,
-					parser.state.module,
 					settings.sourceOrder,
-					parser.state.harmonyParserScope,
-					expr.property.name || expr.property.value,
-					name,
-					expr.range,
-					this.strictExportPresence
+					settings.ids,
+					settings.name,
+					/** @type {Range} */
+					(expr.range),
+					exportPresenceMode,
+					settings.attributes,
+					[]
 				);
+				dep.referencedPropertiesInDestructuring =
+					parser.destructuringAssignmentPropertiesFor(expr);
 				dep.shorthand = parser.scope.inShorthand;
-				dep.directImport = false;
-				dep.loc = expr.loc;
+				dep.directImport = true;
+				dep.asiSafe = !parser.isAsiPosition(
+					/** @type {Range} */ (expr.range)[0]
+				);
+				dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+				dep.call = parser.scope.inTaggedTemplateTag;
 				parser.state.module.addDependency(dep);
+				InnerGraph.onUsage(parser.state, e => (dep.usedByExports = e));
 				return true;
 			});
-		if (this.strictThisContextOnImports) {
-			// only in case when we strictly follow the spec we need a special case here
-			parser.hooks.callAnyMember
-				.for("imported var")
-				.tap("HarmonyImportDependencyParserPlugin", expr => {
-					if (expr.callee.type !== "MemberExpression") return;
-					if (expr.callee.object.type !== "Identifier") return;
-					const name = expr.callee.object.name;
-					const settings = parser.state.harmonySpecifier.get(name);
-					if (settings.id !== null) return false;
+		parser.hooks.expressionMemberChain
+			.for(harmonySpecifierTag)
+			.tap(
+				"HarmonyImportDependencyParserPlugin",
+				(expression, members, membersOptionals, memberRanges) => {
+					const settings =
+						/** @type {HarmonySettings} */
+						(parser.currentTagData);
+					const nonOptionalMembers = getNonOptionalPart(
+						members,
+						membersOptionals
+					);
+					/** @type {Range[]} */
+					const ranges = memberRanges.slice(
+						0,
+						memberRanges.length - (members.length - nonOptionalMembers.length)
+					);
+					const expr =
+						nonOptionalMembers !== members
+							? getNonOptionalMemberChain(
+									expression,
+									members.length - nonOptionalMembers.length
+								)
+							: expression;
+					const ids = settings.ids.concat(nonOptionalMembers);
 					const dep = new HarmonyImportSpecifierDependency(
 						settings.source,
-						parser.state.module,
 						settings.sourceOrder,
-						parser.state.harmonyParserScope,
-						expr.callee.property.name || expr.callee.property.value,
-						name,
-						expr.callee.range,
-						this.strictExportPresence
+						ids,
+						settings.name,
+						/** @type {Range} */
+						(expr.range),
+						exportPresenceMode,
+						settings.attributes,
+						ranges
 					);
-					dep.shorthand = parser.scope.inShorthand;
-					dep.directImport = false;
-					dep.namespaceObjectAsContext = true;
-					dep.loc = expr.callee.loc;
+					dep.referencedPropertiesInDestructuring =
+						parser.destructuringAssignmentPropertiesFor(expr);
+					dep.asiSafe = !parser.isAsiPosition(
+						/** @type {Range} */
+						(expr.range)[0]
+					);
+					dep.loc = /** @type {DependencyLocation} */ (expr.loc);
 					parser.state.module.addDependency(dep);
-					if (expr.arguments) parser.walkExpressions(expr.arguments);
+					InnerGraph.onUsage(parser.state, e => (dep.usedByExports = e));
 					return true;
-				});
-		}
-		parser.hooks.call
-			.for("imported var")
-			.tap("HarmonyImportDependencyParserPlugin", expr => {
-				const args = expr.arguments;
-				const fullExpr = expr;
-				expr = expr.callee;
-				if (expr.type !== "Identifier") return;
-				const name = expr.name;
-				const settings = parser.state.harmonySpecifier.get(name);
-				const dep = new HarmonyImportSpecifierDependency(
-					settings.source,
-					parser.state.module,
-					settings.sourceOrder,
-					parser.state.harmonyParserScope,
-					settings.id,
-					name,
-					expr.range,
-					this.strictExportPresence
-				);
-				dep.directImport = true;
-				dep.callArgs = args;
-				dep.call = fullExpr;
-				dep.loc = expr.loc;
-				parser.state.module.addDependency(dep);
-				if (args) parser.walkExpressions(args);
-				return true;
-			});
-		// TODO webpack 5: refactor this, no custom hooks
-		if (!parser.hooks.hotAcceptCallback) {
-			parser.hooks.hotAcceptCallback = new SyncBailHook([
-				"expression",
-				"requests"
-			]);
-		}
-		if (!parser.hooks.hotAcceptWithoutCallback) {
-			parser.hooks.hotAcceptWithoutCallback = new SyncBailHook([
-				"expression",
-				"requests"
-			]);
-		}
-		parser.hooks.hotAcceptCallback.tap(
+				}
+			);
+		parser.hooks.callMemberChain
+			.for(harmonySpecifierTag)
+			.tap(
+				"HarmonyImportDependencyParserPlugin",
+				(expression, members, membersOptionals, memberRanges) => {
+					const { arguments: args, callee } = expression;
+					const settings = /** @type {HarmonySettings} */ (
+						parser.currentTagData
+					);
+					const nonOptionalMembers = getNonOptionalPart(
+						members,
+						membersOptionals
+					);
+					/** @type {Range[]} */
+					const ranges = memberRanges.slice(
+						0,
+						memberRanges.length - (members.length - nonOptionalMembers.length)
+					);
+					const expr =
+						nonOptionalMembers !== members
+							? getNonOptionalMemberChain(
+									callee,
+									members.length - nonOptionalMembers.length
+								)
+							: callee;
+					const ids = settings.ids.concat(nonOptionalMembers);
+					const dep = new HarmonyImportSpecifierDependency(
+						settings.source,
+						settings.sourceOrder,
+						ids,
+						settings.name,
+						/** @type {Range} */ (expr.range),
+						exportPresenceMode,
+						settings.attributes,
+						ranges
+					);
+					dep.directImport = members.length === 0;
+					dep.call = true;
+					dep.asiSafe = !parser.isAsiPosition(
+						/** @type {Range} */ (expr.range)[0]
+					);
+					// only in case when we strictly follow the spec we need a special case here
+					dep.namespaceObjectAsContext =
+						members.length > 0 &&
+						/** @type {boolean} */ (this.strictThisContextOnImports);
+					dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+					parser.state.module.addDependency(dep);
+					if (args) parser.walkExpressions(args);
+					InnerGraph.onUsage(parser.state, e => (dep.usedByExports = e));
+					return true;
+				}
+			);
+		const { hotAcceptCallback, hotAcceptWithoutCallback } =
+			HotModuleReplacementPlugin.getParserHooks(parser);
+		hotAcceptCallback.tap(
 			"HarmonyImportDependencyParserPlugin",
 			(expr, requests) => {
-				const harmonyParserScope = parser.state.harmonyParserScope;
-				if (!harmonyParserScope) {
+				if (!HarmonyExports.isEnabled(parser.state)) {
 					// This is not a harmony module, skip it
 					return;
 				}
 				const dependencies = requests.map(request => {
-					const dep = new HarmonyAcceptImportDependency(
-						request,
-						parser.state.module,
-						harmonyParserScope
-					);
-					dep.loc = expr.loc;
+					const dep = new HarmonyAcceptImportDependency(request);
+					dep.loc = /** @type {DependencyLocation} */ (expr.loc);
 					parser.state.module.addDependency(dep);
 					return dep;
 				});
 				if (dependencies.length > 0) {
 					const dep = new HarmonyAcceptDependency(
-						expr.range,
+						/** @type {Range} */
+						(expr.range),
 						dependencies,
 						true
 					);
-					dep.loc = expr.loc;
+					dep.loc = /** @type {DependencyLocation} */ (expr.loc);
 					parser.state.module.addDependency(dep);
 				}
 			}
 		);
-		parser.hooks.hotAcceptWithoutCallback.tap(
+		hotAcceptWithoutCallback.tap(
 			"HarmonyImportDependencyParserPlugin",
 			(expr, requests) => {
+				if (!HarmonyExports.isEnabled(parser.state)) {
+					// This is not a harmony module, skip it
+					return;
+				}
 				const dependencies = requests.map(request => {
-					const dep = new HarmonyAcceptImportDependency(
-						request,
-						parser.state.module,
-						parser.state.harmonyParserScope
-					);
-					dep.loc = expr.loc;
+					const dep = new HarmonyAcceptImportDependency(request);
+					dep.loc = /** @type {DependencyLocation} */ (expr.loc);
 					parser.state.module.addDependency(dep);
 					return dep;
 				});
 				if (dependencies.length > 0) {
 					const dep = new HarmonyAcceptDependency(
-						expr.range,
+						/** @type {Range} */
+						(expr.range),
 						dependencies,
 						false
 					);
-					dep.loc = expr.loc;
+					dep.loc = /** @type {DependencyLocation} */ (expr.loc);
 					parser.state.module.addDependency(dep);
 				}
 			}
 		);
 	}
 };
+
+module.exports.harmonySpecifierTag = harmonySpecifierTag;
diff --git a/lib/dependencies/HarmonyImportSideEffectDependency.js b/lib/dependencies/HarmonyImportSideEffectDependency.js
index a41c1b95bc6..bf691745ed3 100644
--- a/lib/dependencies/HarmonyImportSideEffectDependency.js
+++ b/lib/dependencies/HarmonyImportSideEffectDependency.js
@@ -2,29 +2,84 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const makeSerializable = require("../util/makeSerializable");
 const HarmonyImportDependency = require("./HarmonyImportDependency");
 
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").GetConditionFn} GetConditionFn */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */
+/** @typedef {import("../ModuleGraphConnection").ConnectionState} ConnectionState */
+/** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+
 class HarmonyImportSideEffectDependency extends HarmonyImportDependency {
-	constructor(request, originModule, sourceOrder, parserScope) {
-		super(request, originModule, sourceOrder, parserScope);
+	/**
+	 * @param {string} request the request string
+	 * @param {number} sourceOrder source order
+	 * @param {ImportAttributes=} attributes import attributes
+	 */
+	constructor(request, sourceOrder, attributes) {
+		super(request, sourceOrder, attributes);
 	}
 
-	getReference() {
-		if (this._module && this._module.factoryMeta.sideEffectFree) return null;
+	get type() {
+		return "harmony side effect evaluation";
+	}
 
-		return super.getReference();
+	/**
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {null | false | GetConditionFn} function to determine if the connection is active
+	 */
+	getCondition(moduleGraph) {
+		return connection => {
+			const refModule = connection.resolvedModule;
+			if (!refModule) return true;
+			return refModule.getSideEffectsConnectionState(moduleGraph);
+		};
 	}
 
-	get type() {
-		return "harmony side effect evaluation";
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @returns {ConnectionState} how this dependency connects the module to referencing modules
+	 */
+	getModuleEvaluationSideEffectsState(moduleGraph) {
+		const refModule = moduleGraph.getModule(this);
+		if (!refModule) return true;
+		return refModule.getSideEffectsConnectionState(moduleGraph);
 	}
 }
 
-HarmonyImportSideEffectDependency.Template = class HarmonyImportSideEffectDependencyTemplate extends HarmonyImportDependency.Template {
-	getHarmonyInitOrder(dep) {
-		if (dep._module && dep._module.factoryMeta.sideEffectFree) return NaN;
-		return super.getHarmonyInitOrder(dep);
+makeSerializable(
+	HarmonyImportSideEffectDependency,
+	"webpack/lib/dependencies/HarmonyImportSideEffectDependency"
+);
+
+HarmonyImportSideEffectDependency.Template = class HarmonyImportSideEffectDependencyTemplate extends (
+	HarmonyImportDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, templateContext) {
+		const { moduleGraph, concatenationScope } = templateContext;
+		if (concatenationScope) {
+			const module = /** @type {Module} */ (moduleGraph.getModule(dependency));
+			if (concatenationScope.isModuleInScope(module)) {
+				return;
+			}
+		}
+		super.apply(dependency, source, templateContext);
 	}
 };
 
diff --git a/lib/dependencies/HarmonyImportSpecifierDependency.js b/lib/dependencies/HarmonyImportSpecifierDependency.js
index 769711932d6..cef28d8e5d4 100644
--- a/lib/dependencies/HarmonyImportSpecifierDependency.js
+++ b/lib/dependencies/HarmonyImportSpecifierDependency.js
@@ -2,165 +2,466 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const DependencyReference = require("./DependencyReference");
+const Dependency = require("../Dependency");
+const Template = require("../Template");
+const {
+	getDependencyUsedByExportsCondition
+} = require("../optimize/InnerGraph");
+const { getTrimmedIdsAndRange } = require("../util/chainedImports");
+const makeSerializable = require("../util/makeSerializable");
+const propertyAccess = require("../util/propertyAccess");
 const HarmonyImportDependency = require("./HarmonyImportDependency");
-const HarmonyLinkingError = require("../HarmonyLinkingError");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Dependency").ExportsSpec} ExportsSpec */
+/** @typedef {import("../Dependency").GetConditionFn} GetConditionFn */
+/** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */
+/** @typedef {import("../ModuleGraphConnection").ConnectionState} ConnectionState */
+/** @typedef {import("../WebpackError")} WebpackError */
+/** @typedef {import("../javascript/JavascriptParser").DestructuringAssignmentProperty} DestructuringAssignmentProperty */
+/** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+/** @typedef {import("./HarmonyImportDependency").ExportPresenceMode} ExportPresenceMode */
+
+const idsSymbol = Symbol("HarmonyImportSpecifierDependency.ids");
+
+const { ExportPresenceModes } = HarmonyImportDependency;
 
 class HarmonyImportSpecifierDependency extends HarmonyImportDependency {
+	/**
+	 * @param {string} request request
+	 * @param {number} sourceOrder source order
+	 * @param {string[]} ids ids
+	 * @param {string} name name
+	 * @param {Range} range range
+	 * @param {ExportPresenceMode} exportPresenceMode export presence mode
+	 * @param {ImportAttributes | undefined} attributes import attributes
+	 * @param {Range[] | undefined} idRanges ranges for members of ids; the two arrays are right-aligned
+	 */
 	constructor(
 		request,
-		originModule,
 		sourceOrder,
-		parserScope,
-		id,
+		ids,
 		name,
 		range,
-		strictExportPresence
+		exportPresenceMode,
+		attributes,
+		idRanges // TODO webpack 6 make this non-optional. It must always be set to properly trim ids.
 	) {
-		super(request, originModule, sourceOrder, parserScope);
-		this.id = id === null ? null : `${id}`;
-		this.redirectedId = undefined;
+		super(request, sourceOrder, attributes);
+		this.ids = ids;
 		this.name = name;
 		this.range = range;
-		this.strictExportPresence = strictExportPresence;
+		this.idRanges = idRanges;
+		this.exportPresenceMode = exportPresenceMode;
 		this.namespaceObjectAsContext = false;
-		this.callArgs = undefined;
 		this.call = undefined;
 		this.directImport = undefined;
 		this.shorthand = undefined;
+		this.asiSafe = undefined;
+		/** @type {Set | boolean | undefined} */
+		this.usedByExports = undefined;
+		/** @type {Set | undefined} */
+		this.referencedPropertiesInDestructuring = undefined;
+	}
+
+	// TODO webpack 6 remove
+	get id() {
+		throw new Error("id was renamed to ids and type changed to string[]");
+	}
+
+	// TODO webpack 6 remove
+	getId() {
+		throw new Error("id was renamed to ids and type changed to string[]");
+	}
+
+	// TODO webpack 6 remove
+	setId() {
+		throw new Error("id was renamed to ids and type changed to string[]");
 	}
 
 	get type() {
 		return "harmony import specifier";
 	}
 
-	get _id() {
-		return this.redirectedId || this.id;
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @returns {string[]} the imported ids
+	 */
+	getIds(moduleGraph) {
+		const meta = moduleGraph.getMetaIfExisting(this);
+		if (meta === undefined) return this.ids;
+		const ids = meta[idsSymbol];
+		return ids !== undefined ? ids : this.ids;
 	}
 
-	getReference() {
-		if (!this._module) return null;
-		return new DependencyReference(
-			this._module,
-			this._id && !this.namespaceObjectAsContext ? [this._id] : true,
-			false,
-			this.sourceOrder
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @param {string[]} ids the imported ids
+	 * @returns {void}
+	 */
+	setIds(moduleGraph, ids) {
+		moduleGraph.getMeta(this)[idsSymbol] = ids;
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {null | false | GetConditionFn} function to determine if the connection is active
+	 */
+	getCondition(moduleGraph) {
+		return getDependencyUsedByExportsCondition(
+			this,
+			this.usedByExports,
+			moduleGraph
 		);
 	}
 
-	getWarnings() {
-		if (
-			this.strictExportPresence ||
-			this.originModule.buildMeta.strictHarmonyModule
-		) {
-			return [];
-		}
-		return this._getErrors();
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @returns {ConnectionState} how this dependency connects the module to referencing modules
+	 */
+	getModuleEvaluationSideEffectsState(moduleGraph) {
+		return false;
 	}
 
-	getErrors() {
+	/**
+	 * Returns list of exports referenced by this dependency
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @param {RuntimeSpec} runtime the runtime for which the module is analysed
+	 * @returns {(string[] | ReferencedExport)[]} referenced exports
+	 */
+	getReferencedExports(moduleGraph, runtime) {
+		let ids = this.getIds(moduleGraph);
+		if (ids.length === 0) return this._getReferencedExportsInDestructuring();
+		let namespaceObjectAsContext = this.namespaceObjectAsContext;
+		if (ids[0] === "default") {
+			const selfModule =
+				/** @type {Module} */
+				(moduleGraph.getParentModule(this));
+			const importedModule =
+				/** @type {Module} */
+				(moduleGraph.getModule(this));
+			switch (
+				importedModule.getExportsType(
+					moduleGraph,
+					/** @type {BuildMeta} */
+					(selfModule.buildMeta).strictHarmonyModule
+				)
+			) {
+				case "default-only":
+				case "default-with-named":
+					if (ids.length === 1)
+						return this._getReferencedExportsInDestructuring();
+					ids = ids.slice(1);
+					namespaceObjectAsContext = true;
+					break;
+				case "dynamic":
+					return Dependency.EXPORTS_OBJECT_REFERENCED;
+			}
+		}
+
 		if (
-			this.strictExportPresence ||
-			this.originModule.buildMeta.strictHarmonyModule
+			this.call &&
+			!this.directImport &&
+			(namespaceObjectAsContext || ids.length > 1)
 		) {
-			return this._getErrors();
+			if (ids.length === 1) return Dependency.EXPORTS_OBJECT_REFERENCED;
+			ids = ids.slice(0, -1);
 		}
-		return [];
-	}
 
-	_getErrors() {
-		const importedModule = this._module;
-		if (!importedModule) {
-			return;
-		}
+		return this._getReferencedExportsInDestructuring(ids);
+	}
 
-		if (!importedModule.buildMeta || !importedModule.buildMeta.exportsType) {
-			// It's not an harmony module
-			if (
-				this.originModule.buildMeta.strictHarmonyModule &&
-				this._id !== "default"
-			) {
-				// In strict harmony modules we only support the default export
-				const exportName = this._id
-					? `the named export '${this._id}'`
-					: "the namespace object";
-				return [
-					new HarmonyLinkingError(
-						`Can't import ${exportName} from non EcmaScript module (only default export is available)`
-					)
-				];
+	/**
+	 * @param {string[]=} ids ids
+	 * @returns {string[][]} referenced exports
+	 */
+	_getReferencedExportsInDestructuring(ids) {
+		if (this.referencedPropertiesInDestructuring) {
+			/** @type {string[][]} */
+			const refs = [];
+			for (const { id } of this.referencedPropertiesInDestructuring) {
+				refs.push(ids ? ids.concat([id]) : [id]);
 			}
-			return;
+			return refs;
 		}
+		return ids ? [ids] : Dependency.EXPORTS_OBJECT_REFERENCED;
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {ExportPresenceMode} effective mode
+	 */
+	_getEffectiveExportPresenceLevel(moduleGraph) {
+		if (this.exportPresenceMode !== ExportPresenceModes.AUTO)
+			return this.exportPresenceMode;
+		const buildMeta =
+			/** @type {BuildMeta} */
+			(
+				/** @type {Module} */
+				(moduleGraph.getParentModule(this)).buildMeta
+			);
+		return buildMeta.strictHarmonyModule
+			? ExportPresenceModes.ERROR
+			: ExportPresenceModes.WARN;
+	}
 
-		if (!this._id) {
-			return;
+	/**
+	 * Returns warnings
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {WebpackError[] | null | undefined} warnings
+	 */
+	getWarnings(moduleGraph) {
+		const exportsPresence = this._getEffectiveExportPresenceLevel(moduleGraph);
+		if (exportsPresence === ExportPresenceModes.WARN) {
+			return this._getErrors(moduleGraph);
 		}
+		return null;
+	}
 
-		if (importedModule.isProvided(this._id) !== false) {
-			// It's provided or we are not sure
-			return;
+	/**
+	 * Returns errors
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {WebpackError[] | null | undefined} errors
+	 */
+	getErrors(moduleGraph) {
+		const exportsPresence = this._getEffectiveExportPresenceLevel(moduleGraph);
+		if (exportsPresence === ExportPresenceModes.ERROR) {
+			return this._getErrors(moduleGraph);
 		}
+		return null;
+	}
 
-		// We are sure that it's not provided
-		const idIsNotNameMessage =
-			this._id !== this.name ? ` (imported as '${this.name}')` : "";
-		const errorMessage = `"export '${
-			this._id
-		}'${idIsNotNameMessage} was not found in '${this.userRequest}'`;
-		return [new HarmonyLinkingError(errorMessage)];
+	/**
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {WebpackError[] | undefined} errors
+	 */
+	_getErrors(moduleGraph) {
+		const ids = this.getIds(moduleGraph);
+		return this.getLinkingErrors(
+			moduleGraph,
+			ids,
+			`(imported as '${this.name}')`
+		);
 	}
 
-	// implement this method to allow the occurrence order plugin to count correctly
+	/**
+	 * implement this method to allow the occurrence order plugin to count correctly
+	 * @returns {number} count how often the id is used in this dependency
+	 */
 	getNumberOfIdOccurrences() {
 		return 0;
 	}
 
-	updateHash(hash) {
-		super.updateHash(hash);
-		const importedModule = this._module;
-		hash.update((importedModule && this._id) + "");
-		hash.update(
-			(importedModule && this._id && importedModule.isUsed(this._id)) + ""
-		);
-		hash.update(
-			(importedModule &&
-				(!importedModule.buildMeta || importedModule.buildMeta.exportsType)) +
-				""
-		);
-		hash.update(
-			(importedModule &&
-				importedModule.used + JSON.stringify(importedModule.usedExports)) + ""
-		);
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.ids);
+		write(this.name);
+		write(this.range);
+		write(this.idRanges);
+		write(this.exportPresenceMode);
+		write(this.namespaceObjectAsContext);
+		write(this.call);
+		write(this.directImport);
+		write(this.shorthand);
+		write(this.asiSafe);
+		write(this.usedByExports);
+		write(this.referencedPropertiesInDestructuring);
+		super.serialize(context);
 	}
 
-	disconnect() {
-		super.disconnect();
-		this.redirectedId = undefined;
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.ids = read();
+		this.name = read();
+		this.range = read();
+		this.idRanges = read();
+		this.exportPresenceMode = read();
+		this.namespaceObjectAsContext = read();
+		this.call = read();
+		this.directImport = read();
+		this.shorthand = read();
+		this.asiSafe = read();
+		this.usedByExports = read();
+		this.referencedPropertiesInDestructuring = read();
+		super.deserialize(context);
 	}
 }
 
-HarmonyImportSpecifierDependency.Template = class HarmonyImportSpecifierDependencyTemplate extends HarmonyImportDependency.Template {
-	apply(dep, source, runtime) {
-		super.apply(dep, source, runtime);
-		const content = this.getContent(dep, runtime);
-		source.replace(dep.range[0], dep.range[1] - 1, content);
-	}
-
-	getContent(dep, runtime) {
-		const exportExpr = runtime.exportFromImport({
-			module: dep._module,
-			request: dep.request,
-			exportName: dep._id,
-			originModule: dep.originModule,
-			asiSafe: dep.shorthand,
-			isCall: dep.call,
-			callContext: !dep.directImport,
-			importVar: dep.getImportVar()
-		});
-		return dep.shorthand ? `${dep.name}: ${exportExpr}` : exportExpr;
+makeSerializable(
+	HarmonyImportSpecifierDependency,
+	"webpack/lib/dependencies/HarmonyImportSpecifierDependency"
+);
+
+HarmonyImportSpecifierDependency.Template = class HarmonyImportSpecifierDependencyTemplate extends (
+	HarmonyImportDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, templateContext) {
+		const dep = /** @type {HarmonyImportSpecifierDependency} */ (dependency);
+		const { moduleGraph, runtime } = templateContext;
+		const connection = moduleGraph.getConnection(dep);
+		// Skip rendering depending when dependency is conditional
+		if (connection && !connection.isTargetActive(runtime)) return;
+
+		const ids = dep.getIds(moduleGraph);
+		const {
+			trimmedRange: [trimmedRangeStart, trimmedRangeEnd],
+			trimmedIds
+		} = getTrimmedIdsAndRange(ids, dep.range, dep.idRanges, moduleGraph, dep);
+
+		const exportExpr = this._getCodeForIds(
+			dep,
+			source,
+			templateContext,
+			trimmedIds
+		);
+		if (dep.shorthand) {
+			source.insert(trimmedRangeEnd, `: ${exportExpr}`);
+		} else {
+			source.replace(trimmedRangeStart, trimmedRangeEnd - 1, exportExpr);
+		}
+
+		if (dep.referencedPropertiesInDestructuring) {
+			let prefixedIds = ids;
+
+			if (ids[0] === "default") {
+				const selfModule =
+					/** @type {Module} */
+					(moduleGraph.getParentModule(dep));
+				const importedModule =
+					/** @type {Module} */
+					(moduleGraph.getModule(dep));
+				const exportsType = importedModule.getExportsType(
+					moduleGraph,
+					/** @type {BuildMeta} */
+					(selfModule.buildMeta).strictHarmonyModule
+				);
+				if (
+					(exportsType === "default-only" ||
+						exportsType === "default-with-named") &&
+					ids.length >= 1
+				) {
+					prefixedIds = ids.slice(1);
+				}
+			}
+
+			for (const {
+				id,
+				shorthand,
+				range
+			} of dep.referencedPropertiesInDestructuring) {
+				const concatedIds = prefixedIds.concat([id]);
+				const module = /** @type {Module} */ (moduleGraph.getModule(dep));
+				const used = moduleGraph
+					.getExportsInfo(module)
+					.getUsedName(concatedIds, runtime);
+				if (!used) return;
+				const newName = used[used.length - 1];
+				const name = concatedIds[concatedIds.length - 1];
+				if (newName === name) continue;
+
+				const comment = `${Template.toNormalComment(name)} `;
+				const key = comment + JSON.stringify(newName);
+				source.replace(
+					/** @type {Range} */
+					(range)[0],
+					/** @type {Range} */
+					(range)[1] - 1,
+					shorthand ? `${key}: ${name}` : `${key}`
+				);
+			}
+		}
+	}
+
+	/**
+	 * @param {HarmonyImportSpecifierDependency} dep dependency
+	 * @param {ReplaceSource} source source
+	 * @param {DependencyTemplateContext} templateContext context
+	 * @param {string[]} ids ids
+	 * @returns {string} generated code
+	 */
+	_getCodeForIds(dep, source, templateContext, ids) {
+		const { moduleGraph, module, runtime, concatenationScope } =
+			templateContext;
+		const connection = moduleGraph.getConnection(dep);
+		let exportExpr;
+		if (
+			connection &&
+			concatenationScope &&
+			concatenationScope.isModuleInScope(connection.module)
+		) {
+			if (ids.length === 0) {
+				exportExpr = concatenationScope.createModuleReference(
+					connection.module,
+					{
+						asiSafe: dep.asiSafe
+					}
+				);
+			} else if (dep.namespaceObjectAsContext && ids.length === 1) {
+				exportExpr =
+					concatenationScope.createModuleReference(connection.module, {
+						asiSafe: dep.asiSafe
+					}) + propertyAccess(ids);
+			} else {
+				exportExpr = concatenationScope.createModuleReference(
+					connection.module,
+					{
+						ids,
+						call: dep.call,
+						directImport: dep.directImport,
+						asiSafe: dep.asiSafe
+					}
+				);
+			}
+		} else {
+			super.apply(dep, source, templateContext);
+
+			const { runtimeTemplate, initFragments, runtimeRequirements } =
+				templateContext;
+
+			exportExpr = runtimeTemplate.exportFromImport({
+				moduleGraph,
+				module: /** @type {Module} */ (moduleGraph.getModule(dep)),
+				request: dep.request,
+				exportName: ids,
+				originModule: module,
+				asiSafe: dep.shorthand ? true : dep.asiSafe,
+				isCall: dep.call,
+				callContext: !dep.directImport,
+				defaultInterop: true,
+				importVar: dep.getImportVar(moduleGraph),
+				initFragments,
+				runtime,
+				runtimeRequirements
+			});
+		}
+		return exportExpr;
 	}
 };
 
diff --git a/lib/dependencies/HarmonyInitDependency.js b/lib/dependencies/HarmonyInitDependency.js
deleted file mode 100644
index 73239c8b9fe..00000000000
--- a/lib/dependencies/HarmonyInitDependency.js
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const NullDependency = require("./NullDependency");
-
-class HarmonyInitDependency extends NullDependency {
-	constructor(originModule) {
-		super();
-		this.originModule = originModule;
-	}
-
-	get type() {
-		return "harmony init";
-	}
-}
-
-module.exports = HarmonyInitDependency;
-
-HarmonyInitDependency.Template = class HarmonyInitDependencyTemplate {
-	apply(dep, source, runtime, dependencyTemplates) {
-		const module = dep.originModule;
-		const list = [];
-		for (const dependency of module.dependencies) {
-			const template = dependencyTemplates.get(dependency.constructor);
-			if (
-				template &&
-				typeof template.harmonyInit === "function" &&
-				typeof template.getHarmonyInitOrder === "function"
-			) {
-				const order = template.getHarmonyInitOrder(dependency);
-				if (!isNaN(order)) {
-					list.push({
-						order,
-						listOrder: list.length,
-						dependency,
-						template
-					});
-				}
-			}
-		}
-
-		list.sort((a, b) => {
-			const x = a.order - b.order;
-			if (x) return x;
-			return a.listOrder - b.listOrder;
-		});
-
-		for (const item of list) {
-			item.template.harmonyInit(
-				item.dependency,
-				source,
-				runtime,
-				dependencyTemplates
-			);
-		}
-	}
-};
diff --git a/lib/dependencies/HarmonyModulesPlugin.js b/lib/dependencies/HarmonyModulesPlugin.js
index 43a8d4c0c1d..a3bbd98de82 100644
--- a/lib/dependencies/HarmonyModulesPlugin.js
+++ b/lib/dependencies/HarmonyModulesPlugin.js
@@ -2,52 +2,59 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const HarmonyAcceptDependency = require("./HarmonyAcceptDependency");
+const HarmonyAcceptImportDependency = require("./HarmonyAcceptImportDependency");
 const HarmonyCompatibilityDependency = require("./HarmonyCompatibilityDependency");
-const HarmonyInitDependency = require("./HarmonyInitDependency");
-const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDependency");
-const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency");
-const HarmonyExportHeaderDependency = require("./HarmonyExportHeaderDependency");
+const HarmonyEvaluatedImportSpecifierDependency = require("./HarmonyEvaluatedImportSpecifierDependency");
 const HarmonyExportExpressionDependency = require("./HarmonyExportExpressionDependency");
-const HarmonyExportSpecifierDependency = require("./HarmonyExportSpecifierDependency");
+const HarmonyExportHeaderDependency = require("./HarmonyExportHeaderDependency");
 const HarmonyExportImportedSpecifierDependency = require("./HarmonyExportImportedSpecifierDependency");
-const HarmonyAcceptDependency = require("./HarmonyAcceptDependency");
-const HarmonyAcceptImportDependency = require("./HarmonyAcceptImportDependency");
-
-const NullFactory = require("../NullFactory");
+const HarmonyExportSpecifierDependency = require("./HarmonyExportSpecifierDependency");
+const HarmonyImportSideEffectDependency = require("./HarmonyImportSideEffectDependency");
+const HarmonyImportSpecifierDependency = require("./HarmonyImportSpecifierDependency");
 
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_ESM
+} = require("../ModuleTypeConstants");
 const HarmonyDetectionParserPlugin = require("./HarmonyDetectionParserPlugin");
-const HarmonyImportDependencyParserPlugin = require("./HarmonyImportDependencyParserPlugin");
 const HarmonyExportDependencyParserPlugin = require("./HarmonyExportDependencyParserPlugin");
+const HarmonyImportDependencyParserPlugin = require("./HarmonyImportDependencyParserPlugin");
 const HarmonyTopLevelThisParserPlugin = require("./HarmonyTopLevelThisParserPlugin");
 
+/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../javascript/JavascriptParser")} Parser */
+
+const PLUGIN_NAME = "HarmonyModulesPlugin";
+
+/** @typedef {{ topLevelAwait?: boolean }} HarmonyModulesPluginOptions */
+
 class HarmonyModulesPlugin {
+	/**
+	 * @param {HarmonyModulesPluginOptions} options options
+	 */
 	constructor(options) {
 		this.options = options;
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		compiler.hooks.compilation.tap(
-			"HarmonyModulesPlugin",
+			PLUGIN_NAME,
 			(compilation, { normalModuleFactory }) => {
-				compilation.dependencyFactories.set(
-					HarmonyCompatibilityDependency,
-					new NullFactory()
-				);
 				compilation.dependencyTemplates.set(
 					HarmonyCompatibilityDependency,
 					new HarmonyCompatibilityDependency.Template()
 				);
 
-				compilation.dependencyFactories.set(
-					HarmonyInitDependency,
-					new NullFactory()
-				);
-				compilation.dependencyTemplates.set(
-					HarmonyInitDependency,
-					new HarmonyInitDependency.Template()
-				);
-
 				compilation.dependencyFactories.set(
 					HarmonyImportSideEffectDependency,
 					normalModuleFactory
@@ -67,27 +74,24 @@ class HarmonyModulesPlugin {
 				);
 
 				compilation.dependencyFactories.set(
-					HarmonyExportHeaderDependency,
-					new NullFactory()
+					HarmonyEvaluatedImportSpecifierDependency,
+					normalModuleFactory
 				);
+				compilation.dependencyTemplates.set(
+					HarmonyEvaluatedImportSpecifierDependency,
+					new HarmonyEvaluatedImportSpecifierDependency.Template()
+				);
+
 				compilation.dependencyTemplates.set(
 					HarmonyExportHeaderDependency,
 					new HarmonyExportHeaderDependency.Template()
 				);
 
-				compilation.dependencyFactories.set(
-					HarmonyExportExpressionDependency,
-					new NullFactory()
-				);
 				compilation.dependencyTemplates.set(
 					HarmonyExportExpressionDependency,
 					new HarmonyExportExpressionDependency.Template()
 				);
 
-				compilation.dependencyFactories.set(
-					HarmonyExportSpecifierDependency,
-					new NullFactory()
-				);
 				compilation.dependencyTemplates.set(
 					HarmonyExportSpecifierDependency,
 					new HarmonyExportSpecifierDependency.Template()
@@ -102,10 +106,6 @@ class HarmonyModulesPlugin {
 					new HarmonyExportImportedSpecifierDependency.Template()
 				);
 
-				compilation.dependencyFactories.set(
-					HarmonyAcceptDependency,
-					new NullFactory()
-				);
 				compilation.dependencyTemplates.set(
 					HarmonyAcceptDependency,
 					new HarmonyAcceptDependency.Template()
@@ -120,22 +120,28 @@ class HarmonyModulesPlugin {
 					new HarmonyAcceptImportDependency.Template()
 				);
 
+				/**
+				 * @param {Parser} parser parser parser
+				 * @param {JavascriptParserOptions} parserOptions parserOptions
+				 * @returns {void}
+				 */
 				const handler = (parser, parserOptions) => {
+					// TODO webpack 6: rename harmony to esm or module
 					if (parserOptions.harmony !== undefined && !parserOptions.harmony)
 						return;
 
-					new HarmonyDetectionParserPlugin().apply(parser);
-					new HarmonyImportDependencyParserPlugin(this.options).apply(parser);
-					new HarmonyExportDependencyParserPlugin(this.options).apply(parser);
+					new HarmonyDetectionParserPlugin(this.options).apply(parser);
+					new HarmonyImportDependencyParserPlugin(parserOptions).apply(parser);
+					new HarmonyExportDependencyParserPlugin(parserOptions).apply(parser);
 					new HarmonyTopLevelThisParserPlugin().apply(parser);
 				};
 
 				normalModuleFactory.hooks.parser
-					.for("javascript/auto")
-					.tap("HarmonyModulesPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, handler);
 				normalModuleFactory.hooks.parser
-					.for("javascript/esm")
-					.tap("HarmonyModulesPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_ESM)
+					.tap(PLUGIN_NAME, handler);
 			}
 		);
 	}
diff --git a/lib/dependencies/HarmonyTopLevelThisParserPlugin.js b/lib/dependencies/HarmonyTopLevelThisParserPlugin.js
index f036009304d..c8a3061a0be 100644
--- a/lib/dependencies/HarmonyTopLevelThisParserPlugin.js
+++ b/lib/dependencies/HarmonyTopLevelThisParserPlugin.js
@@ -2,24 +2,37 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Florent Cailhol @ooflorent
 */
+
 "use strict";
 
 const ConstDependency = require("./ConstDependency");
+const HarmonyExports = require("./HarmonyExports");
+
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+
+const PLUGIN_NAME = "HarmonyTopLevelThisParserPlugin";
 
 class HarmonyTopLevelThisParserPlugin {
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @returns {void}
+	 */
 	apply(parser) {
-		parser.hooks.expression
-			.for("this")
-			.tap("HarmonyTopLevelThisParserPlugin", node => {
-				if (!parser.scope.topLevelScope) return;
-				const module = parser.state.module;
-				const isHarmony = !!(module.buildMeta && module.buildMeta.exportsType);
-				if (isHarmony) {
-					const dep = new ConstDependency("undefined", node.range, false);
-					dep.loc = node.loc;
-					parser.state.current.addDependency(dep);
-				}
-			});
+		parser.hooks.expression.for("this").tap(PLUGIN_NAME, node => {
+			if (!parser.scope.topLevelScope) return;
+			if (HarmonyExports.isEnabled(parser.state)) {
+				const dep = new ConstDependency(
+					"undefined",
+					/** @type {Range} */ (node.range),
+					null
+				);
+				dep.loc = /** @type {DependencyLocation} */ (node.loc);
+				parser.state.module.addPresentationalDependency(dep);
+				return true;
+			}
+		});
 	}
 }
 
diff --git a/lib/dependencies/ImportContextDependency.js b/lib/dependencies/ImportContextDependency.js
index f25a28a1532..cdade589cbd 100644
--- a/lib/dependencies/ImportContextDependency.js
+++ b/lib/dependencies/ImportContextDependency.js
@@ -2,13 +2,27 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const makeSerializable = require("../util/makeSerializable");
 const ContextDependency = require("./ContextDependency");
 const ContextDependencyTemplateAsRequireCall = require("./ContextDependencyTemplateAsRequireCall");
 
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("./ContextDependency").ContextDependencyOptions} ContextDependencyOptions */
+
 class ImportContextDependency extends ContextDependency {
+	/**
+	 * @param {ContextDependencyOptions} options options
+	 * @param {Range} range range
+	 * @param {Range} valueRange value range
+	 */
 	constructor(options, range, valueRange) {
 		super(options);
+
 		this.range = range;
 		this.valueRange = valueRange;
 	}
@@ -16,8 +30,39 @@ class ImportContextDependency extends ContextDependency {
 	get type() {
 		return `import() context ${this.options.mode}`;
 	}
+
+	get category() {
+		return "esm";
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+
+		write(this.valueRange);
+
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+
+		this.valueRange = read();
+
+		super.deserialize(context);
+	}
 }
 
+makeSerializable(
+	ImportContextDependency,
+	"webpack/lib/dependencies/ImportContextDependency"
+);
+
 ImportContextDependency.Template = ContextDependencyTemplateAsRequireCall;
 
 module.exports = ImportContextDependency;
diff --git a/lib/dependencies/ImportDependenciesBlock.js b/lib/dependencies/ImportDependenciesBlock.js
deleted file mode 100644
index 61e6bb27234..00000000000
--- a/lib/dependencies/ImportDependenciesBlock.js
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-const AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
-const ImportDependency = require("./ImportDependency");
-
-module.exports = class ImportDependenciesBlock extends AsyncDependenciesBlock {
-	// TODO webpack 5 reorganize arguments
-	constructor(request, range, groupOptions, module, loc, originModule) {
-		super(groupOptions, module, loc, request);
-		this.range = range;
-		const dep = new ImportDependency(request, originModule, this);
-		dep.loc = loc;
-		this.addDependency(dep);
-	}
-};
diff --git a/lib/dependencies/ImportDependency.js b/lib/dependencies/ImportDependency.js
index 520bed21839..1368d405a10 100644
--- a/lib/dependencies/ImportDependency.js
+++ b/lib/dependencies/ImportDependency.js
@@ -2,32 +2,137 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const Dependency = require("../Dependency");
+const makeSerializable = require("../util/makeSerializable");
 const ModuleDependency = require("./ModuleDependency");
 
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../AsyncDependenciesBlock")} AsyncDependenciesBlock */
+/** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+
 class ImportDependency extends ModuleDependency {
-	constructor(request, originModule, block) {
+	/**
+	 * @param {string} request the request
+	 * @param {Range} range expression range
+	 * @param {(string[][] | null)=} referencedExports list of referenced exports
+	 * @param {ImportAttributes=} attributes import attributes
+	 */
+	constructor(request, range, referencedExports, attributes) {
 		super(request);
-		this.originModule = originModule;
-		this.block = block;
+		this.range = range;
+		this.referencedExports = referencedExports;
+		this.assertions = attributes;
 	}
 
 	get type() {
 		return "import()";
 	}
+
+	get category() {
+		return "esm";
+	}
+
+	/**
+	 * Returns list of exports referenced by this dependency
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @param {RuntimeSpec} runtime the runtime for which the module is analysed
+	 * @returns {(string[] | ReferencedExport)[]} referenced exports
+	 */
+	getReferencedExports(moduleGraph, runtime) {
+		if (!this.referencedExports) return Dependency.EXPORTS_OBJECT_REFERENCED;
+		const refs = [];
+		for (const referencedExport of this.referencedExports) {
+			if (referencedExport[0] === "default") {
+				const selfModule =
+					/** @type {Module} */
+					(moduleGraph.getParentModule(this));
+				const importedModule =
+					/** @type {Module} */
+					(moduleGraph.getModule(this));
+				const exportsType = importedModule.getExportsType(
+					moduleGraph,
+					/** @type {BuildMeta} */
+					(selfModule.buildMeta).strictHarmonyModule
+				);
+				if (
+					exportsType === "default-only" ||
+					exportsType === "default-with-named"
+				) {
+					return Dependency.EXPORTS_OBJECT_REFERENCED;
+				}
+			}
+			refs.push({
+				name: referencedExport,
+				canMangle: false
+			});
+		}
+		return refs;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		context.write(this.range);
+		context.write(this.referencedExports);
+		context.write(this.assertions);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		this.range = context.read();
+		this.referencedExports = context.read();
+		this.assertions = context.read();
+		super.deserialize(context);
+	}
 }
 
-ImportDependency.Template = class ImportDependencyTemplate {
-	apply(dep, source, runtime) {
-		const content = runtime.moduleNamespacePromise({
-			block: dep.block,
-			module: dep.module,
+makeSerializable(ImportDependency, "webpack/lib/dependencies/ImportDependency");
+
+ImportDependency.Template = class ImportDependencyTemplate extends (
+	ModuleDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(
+		dependency,
+		source,
+		{ runtimeTemplate, module, moduleGraph, chunkGraph, runtimeRequirements }
+	) {
+		const dep = /** @type {ImportDependency} */ (dependency);
+		const block = /** @type {AsyncDependenciesBlock} */ (
+			moduleGraph.getParentBlock(dep)
+		);
+		const content = runtimeTemplate.moduleNamespacePromise({
+			chunkGraph,
+			block,
+			module: /** @type {Module} */ (moduleGraph.getModule(dep)),
 			request: dep.request,
-			strict: dep.originModule.buildMeta.strictHarmonyModule,
-			message: "import()"
+			strict: /** @type {BuildMeta} */ (module.buildMeta).strictHarmonyModule,
+			message: "import()",
+			runtimeRequirements
 		});
 
-		source.replace(dep.block.range[0], dep.block.range[1] - 1, content);
+		source.replace(dep.range[0], dep.range[1] - 1, content);
 	}
 };
 
diff --git a/lib/dependencies/ImportEagerDependency.js b/lib/dependencies/ImportEagerDependency.js
index 0671d5dc0cf..dd607302029 100644
--- a/lib/dependencies/ImportEagerDependency.js
+++ b/lib/dependencies/ImportEagerDependency.js
@@ -2,29 +2,71 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
-const ModuleDependency = require("./ModuleDependency");
 
-class ImportEagerDependency extends ModuleDependency {
-	constructor(request, originModule, range) {
-		super(request);
-		this.originModule = originModule;
-		this.range = range;
+const makeSerializable = require("../util/makeSerializable");
+const ImportDependency = require("./ImportDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+
+class ImportEagerDependency extends ImportDependency {
+	/**
+	 * @param {string} request the request
+	 * @param {Range} range expression range
+	 * @param {(string[][] | null)=} referencedExports list of referenced exports
+	 * @param {ImportAttributes=} attributes import attributes
+	 */
+	constructor(request, range, referencedExports, attributes) {
+		super(request, range, referencedExports, attributes);
 	}
 
 	get type() {
 		return "import() eager";
 	}
+
+	get category() {
+		return "esm";
+	}
 }
 
-ImportEagerDependency.Template = class ImportEagerDependencyTemplate {
-	apply(dep, source, runtime) {
-		const content = runtime.moduleNamespacePromise({
-			module: dep.module,
+makeSerializable(
+	ImportEagerDependency,
+	"webpack/lib/dependencies/ImportEagerDependency"
+);
+
+ImportEagerDependency.Template = class ImportEagerDependencyTemplate extends (
+	ImportDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(
+		dependency,
+		source,
+		{ runtimeTemplate, module, moduleGraph, chunkGraph, runtimeRequirements }
+	) {
+		const dep = /** @type {ImportEagerDependency} */ (dependency);
+		const content = runtimeTemplate.moduleNamespacePromise({
+			chunkGraph,
+			module: /** @type {Module} */ (moduleGraph.getModule(dep)),
 			request: dep.request,
-			strict: dep.originModule.buildMeta.strictHarmonyModule,
-			message: "import() eager"
+			strict: /** @type {BuildMeta} */ (module.buildMeta).strictHarmonyModule,
+			message: "import() eager",
+			runtimeRequirements
 		});
+
 		source.replace(dep.range[0], dep.range[1] - 1, content);
 	}
 };
diff --git a/lib/dependencies/ImportMetaContextDependency.js b/lib/dependencies/ImportMetaContextDependency.js
new file mode 100644
index 00000000000..ee27ee1573f
--- /dev/null
+++ b/lib/dependencies/ImportMetaContextDependency.js
@@ -0,0 +1,42 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const makeSerializable = require("../util/makeSerializable");
+const ContextDependency = require("./ContextDependency");
+const ModuleDependencyTemplateAsRequireId = require("./ModuleDependencyTemplateAsRequireId");
+
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("./ContextDependency").ContextDependencyOptions} ContextDependencyOptions */
+
+class ImportMetaContextDependency extends ContextDependency {
+	/**
+	 * @param {ContextDependencyOptions} options options
+	 * @param {Range} range range
+	 */
+	constructor(options, range) {
+		super(options);
+
+		this.range = range;
+	}
+
+	get category() {
+		return "esm";
+	}
+
+	get type() {
+		return `import.meta.webpackContext ${this.options.mode}`;
+	}
+}
+
+makeSerializable(
+	ImportMetaContextDependency,
+	"webpack/lib/dependencies/ImportMetaContextDependency"
+);
+
+ImportMetaContextDependency.Template = ModuleDependencyTemplateAsRequireId;
+
+module.exports = ImportMetaContextDependency;
diff --git a/lib/dependencies/ImportMetaContextDependencyParserPlugin.js b/lib/dependencies/ImportMetaContextDependencyParserPlugin.js
new file mode 100644
index 00000000000..1ad181a7baf
--- /dev/null
+++ b/lib/dependencies/ImportMetaContextDependencyParserPlugin.js
@@ -0,0 +1,307 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const WebpackError = require("../WebpackError");
+const {
+	evaluateToIdentifier
+} = require("../javascript/JavascriptParserHelpers");
+const ImportMetaContextDependency = require("./ImportMetaContextDependency");
+
+/** @typedef {import("estree").Expression} Expression */
+/** @typedef {import("estree").ObjectExpression} ObjectExpression */
+/** @typedef {import("estree").Property} Property */
+/** @typedef {import("estree").Identifier} Identifier */
+/** @typedef {import("estree").SourceLocation} SourceLocation */
+/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../ContextModule").ContextModuleOptions} ContextModuleOptions */
+/** @typedef {import("../ChunkGroup").RawChunkGroupOptions} RawChunkGroupOptions */
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("../javascript/BasicEvaluatedExpression")} BasicEvaluatedExpression */
+/** @typedef {Pick&{groupOptions: RawChunkGroupOptions, exports?: ContextModuleOptions["referencedExports"]}} ImportMetaContextOptions */
+
+/**
+ * @param {Property} prop property
+ * @param {string} expect except message
+ * @returns {WebpackError} error
+ */
+function createPropertyParseError(prop, expect) {
+	return createError(
+		`Parsing import.meta.webpackContext options failed. Unknown value for property ${JSON.stringify(
+			/** @type {Identifier} */
+			(prop.key).name
+		)}, expected type ${expect}.`,
+		/** @type {DependencyLocation} */
+		(prop.value.loc)
+	);
+}
+
+/**
+ * @param {string} msg message
+ * @param {DependencyLocation} loc location
+ * @returns {WebpackError} error
+ */
+function createError(msg, loc) {
+	const error = new WebpackError(msg);
+	error.name = "ImportMetaContextError";
+	error.loc = loc;
+	return error;
+}
+
+const PLUGIN_NAME = "ImportMetaContextDependencyParserPlugin";
+
+module.exports = class ImportMetaContextDependencyParserPlugin {
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @returns {void}
+	 */
+	apply(parser) {
+		parser.hooks.evaluateIdentifier
+			.for("import.meta.webpackContext")
+			.tap(PLUGIN_NAME, expr =>
+				evaluateToIdentifier(
+					"import.meta.webpackContext",
+					"import.meta",
+					() => ["webpackContext"],
+					true
+				)(expr)
+			);
+		parser.hooks.call
+			.for("import.meta.webpackContext")
+			.tap(PLUGIN_NAME, expr => {
+				if (expr.arguments.length < 1 || expr.arguments.length > 2) return;
+				const [directoryNode, optionsNode] = expr.arguments;
+				if (optionsNode && optionsNode.type !== "ObjectExpression") return;
+				const requestExpr = parser.evaluateExpression(
+					/** @type {Expression} */ (directoryNode)
+				);
+				if (!requestExpr.isString()) return;
+				const request = /** @type {string} */ (requestExpr.string);
+				const errors = [];
+				let regExp = /^\.\/.*$/;
+				let recursive = true;
+				/** @type {ContextModuleOptions["mode"]} */
+				let mode = "sync";
+				/** @type {ContextModuleOptions["include"]} */
+				let include;
+				/** @type {ContextModuleOptions["exclude"]} */
+				let exclude;
+				/** @type {RawChunkGroupOptions} */
+				const groupOptions = {};
+				/** @type {ContextModuleOptions["chunkName"]} */
+				let chunkName;
+				/** @type {ContextModuleOptions["referencedExports"]} */
+				let exports;
+				if (optionsNode) {
+					for (const prop of /** @type {ObjectExpression} */ (optionsNode)
+						.properties) {
+						if (prop.type !== "Property" || prop.key.type !== "Identifier") {
+							errors.push(
+								createError(
+									"Parsing import.meta.webpackContext options failed.",
+									/** @type {DependencyLocation} */
+									(optionsNode.loc)
+								)
+							);
+							break;
+						}
+						switch (prop.key.name) {
+							case "regExp": {
+								const regExpExpr = parser.evaluateExpression(
+									/** @type {Expression} */ (prop.value)
+								);
+								if (!regExpExpr.isRegExp()) {
+									errors.push(createPropertyParseError(prop, "RegExp"));
+								} else {
+									regExp = /** @type {RegExp} */ (regExpExpr.regExp);
+								}
+								break;
+							}
+							case "include": {
+								const regExpExpr = parser.evaluateExpression(
+									/** @type {Expression} */ (prop.value)
+								);
+								if (!regExpExpr.isRegExp()) {
+									errors.push(createPropertyParseError(prop, "RegExp"));
+								} else {
+									include = regExpExpr.regExp;
+								}
+								break;
+							}
+							case "exclude": {
+								const regExpExpr = parser.evaluateExpression(
+									/** @type {Expression} */ (prop.value)
+								);
+								if (!regExpExpr.isRegExp()) {
+									errors.push(createPropertyParseError(prop, "RegExp"));
+								} else {
+									exclude = regExpExpr.regExp;
+								}
+								break;
+							}
+							case "mode": {
+								const modeExpr = parser.evaluateExpression(
+									/** @type {Expression} */ (prop.value)
+								);
+								if (!modeExpr.isString()) {
+									errors.push(createPropertyParseError(prop, "string"));
+								} else {
+									mode = /** @type {ContextModuleOptions["mode"]} */ (
+										modeExpr.string
+									);
+								}
+								break;
+							}
+							case "chunkName": {
+								const expr = parser.evaluateExpression(
+									/** @type {Expression} */ (prop.value)
+								);
+								if (!expr.isString()) {
+									errors.push(createPropertyParseError(prop, "string"));
+								} else {
+									chunkName = expr.string;
+								}
+								break;
+							}
+							case "exports": {
+								const expr = parser.evaluateExpression(
+									/** @type {Expression} */ (prop.value)
+								);
+								if (expr.isString()) {
+									exports = [[/** @type {string} */ (expr.string)]];
+								} else if (expr.isArray()) {
+									const items =
+										/** @type {BasicEvaluatedExpression[]} */
+										(expr.items);
+									if (
+										items.every(i => {
+											if (!i.isArray()) return false;
+											const innerItems =
+												/** @type {BasicEvaluatedExpression[]} */ (i.items);
+											return innerItems.every(i => i.isString());
+										})
+									) {
+										exports = [];
+										for (const i1 of items) {
+											/** @type {string[]} */
+											const export_ = [];
+											for (const i2 of /** @type {BasicEvaluatedExpression[]} */ (
+												i1.items
+											)) {
+												export_.push(/** @type {string} */ (i2.string));
+											}
+											exports.push(export_);
+										}
+									} else {
+										errors.push(
+											createPropertyParseError(prop, "string|string[][]")
+										);
+									}
+								} else {
+									errors.push(
+										createPropertyParseError(prop, "string|string[][]")
+									);
+								}
+								break;
+							}
+							case "prefetch": {
+								const expr = parser.evaluateExpression(
+									/** @type {Expression} */ (prop.value)
+								);
+								if (expr.isBoolean()) {
+									groupOptions.prefetchOrder = 0;
+								} else if (expr.isNumber()) {
+									groupOptions.prefetchOrder = expr.number;
+								} else {
+									errors.push(createPropertyParseError(prop, "boolean|number"));
+								}
+								break;
+							}
+							case "preload": {
+								const expr = parser.evaluateExpression(
+									/** @type {Expression} */ (prop.value)
+								);
+								if (expr.isBoolean()) {
+									groupOptions.preloadOrder = 0;
+								} else if (expr.isNumber()) {
+									groupOptions.preloadOrder = expr.number;
+								} else {
+									errors.push(createPropertyParseError(prop, "boolean|number"));
+								}
+								break;
+							}
+							case "fetchPriority": {
+								const expr = parser.evaluateExpression(
+									/** @type {Expression} */ (prop.value)
+								);
+								if (
+									expr.isString() &&
+									["high", "low", "auto"].includes(
+										/** @type {string} */ (expr.string)
+									)
+								) {
+									groupOptions.fetchPriority =
+										/** @type {RawChunkGroupOptions["fetchPriority"]} */ (
+											expr.string
+										);
+								} else {
+									errors.push(
+										createPropertyParseError(prop, '"high"|"low"|"auto"')
+									);
+								}
+								break;
+							}
+							case "recursive": {
+								const recursiveExpr = parser.evaluateExpression(
+									/** @type {Expression} */ (prop.value)
+								);
+								if (!recursiveExpr.isBoolean()) {
+									errors.push(createPropertyParseError(prop, "boolean"));
+								} else {
+									recursive = /** @type {boolean} */ (recursiveExpr.bool);
+								}
+								break;
+							}
+							default:
+								errors.push(
+									createError(
+										`Parsing import.meta.webpackContext options failed. Unknown property ${JSON.stringify(
+											prop.key.name
+										)}.`,
+										/** @type {DependencyLocation} */ (optionsNode.loc)
+									)
+								);
+						}
+					}
+				}
+				if (errors.length) {
+					for (const error of errors) parser.state.current.addError(error);
+					return;
+				}
+
+				const dep = new ImportMetaContextDependency(
+					{
+						request,
+						include,
+						exclude,
+						recursive,
+						regExp,
+						groupOptions,
+						chunkName,
+						referencedExports: exports,
+						mode,
+						category: "esm"
+					},
+					/** @type {Range} */ (expr.range)
+				);
+				dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+				dep.optional = Boolean(parser.scope.inTry);
+				parser.state.current.addDependency(dep);
+				return true;
+			});
+	}
+};
diff --git a/lib/dependencies/ImportMetaContextPlugin.js b/lib/dependencies/ImportMetaContextPlugin.js
new file mode 100644
index 00000000000..ed9ac05da53
--- /dev/null
+++ b/lib/dependencies/ImportMetaContextPlugin.js
@@ -0,0 +1,72 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_ESM
+} = require("../ModuleTypeConstants");
+const ContextElementDependency = require("./ContextElementDependency");
+const ImportMetaContextDependency = require("./ImportMetaContextDependency");
+const ImportMetaContextDependencyParserPlugin = require("./ImportMetaContextDependencyParserPlugin");
+
+/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
+/** @typedef {import("../../declarations/WebpackOptions").ResolveOptions} ResolveOptions */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../javascript/JavascriptParser")} Parser */
+
+const PLUGIN_NAME = "ImportMetaContextPlugin";
+
+class ImportMetaContextPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(
+			PLUGIN_NAME,
+			(compilation, { contextModuleFactory, normalModuleFactory }) => {
+				compilation.dependencyFactories.set(
+					ImportMetaContextDependency,
+					contextModuleFactory
+				);
+				compilation.dependencyTemplates.set(
+					ImportMetaContextDependency,
+					new ImportMetaContextDependency.Template()
+				);
+				compilation.dependencyFactories.set(
+					ContextElementDependency,
+					normalModuleFactory
+				);
+
+				/**
+				 * @param {Parser} parser parser parser
+				 * @param {JavascriptParserOptions} parserOptions parserOptions
+				 * @returns {void}
+				 */
+				const handler = (parser, parserOptions) => {
+					if (
+						parserOptions.importMetaContext !== undefined &&
+						!parserOptions.importMetaContext
+					)
+						return;
+
+					new ImportMetaContextDependencyParserPlugin().apply(parser);
+				};
+
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, handler);
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_ESM)
+					.tap(PLUGIN_NAME, handler);
+			}
+		);
+	}
+}
+
+module.exports = ImportMetaContextPlugin;
diff --git a/lib/dependencies/ImportMetaHotAcceptDependency.js b/lib/dependencies/ImportMetaHotAcceptDependency.js
new file mode 100644
index 00000000000..70d8199338d
--- /dev/null
+++ b/lib/dependencies/ImportMetaHotAcceptDependency.js
@@ -0,0 +1,41 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const makeSerializable = require("../util/makeSerializable");
+const ModuleDependency = require("./ModuleDependency");
+const ModuleDependencyTemplateAsId = require("./ModuleDependencyTemplateAsId");
+
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+
+class ImportMetaHotAcceptDependency extends ModuleDependency {
+	/**
+	 * @param {string} request the request string
+	 * @param {Range} range location in source code
+	 */
+	constructor(request, range) {
+		super(request);
+		this.range = range;
+		this.weak = true;
+	}
+
+	get type() {
+		return "import.meta.webpackHot.accept";
+	}
+
+	get category() {
+		return "esm";
+	}
+}
+
+makeSerializable(
+	ImportMetaHotAcceptDependency,
+	"webpack/lib/dependencies/ImportMetaHotAcceptDependency"
+);
+
+ImportMetaHotAcceptDependency.Template = ModuleDependencyTemplateAsId;
+
+module.exports = ImportMetaHotAcceptDependency;
diff --git a/lib/dependencies/ImportMetaHotDeclineDependency.js b/lib/dependencies/ImportMetaHotDeclineDependency.js
new file mode 100644
index 00000000000..c6c35a250ce
--- /dev/null
+++ b/lib/dependencies/ImportMetaHotDeclineDependency.js
@@ -0,0 +1,42 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const makeSerializable = require("../util/makeSerializable");
+const ModuleDependency = require("./ModuleDependency");
+const ModuleDependencyTemplateAsId = require("./ModuleDependencyTemplateAsId");
+
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+
+class ImportMetaHotDeclineDependency extends ModuleDependency {
+	/**
+	 * @param {string} request the request string
+	 * @param {Range} range location in source code
+	 */
+	constructor(request, range) {
+		super(request);
+
+		this.range = range;
+		this.weak = true;
+	}
+
+	get type() {
+		return "import.meta.webpackHot.decline";
+	}
+
+	get category() {
+		return "esm";
+	}
+}
+
+makeSerializable(
+	ImportMetaHotDeclineDependency,
+	"webpack/lib/dependencies/ImportMetaHotDeclineDependency"
+);
+
+ImportMetaHotDeclineDependency.Template = ModuleDependencyTemplateAsId;
+
+module.exports = ImportMetaHotDeclineDependency;
diff --git a/lib/dependencies/ImportMetaPlugin.js b/lib/dependencies/ImportMetaPlugin.js
new file mode 100644
index 00000000000..ff9231d21d0
--- /dev/null
+++ b/lib/dependencies/ImportMetaPlugin.js
@@ -0,0 +1,253 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const { pathToFileURL } = require("url");
+const ModuleDependencyWarning = require("../ModuleDependencyWarning");
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_ESM
+} = require("../ModuleTypeConstants");
+const Template = require("../Template");
+const BasicEvaluatedExpression = require("../javascript/BasicEvaluatedExpression");
+const {
+	evaluateToIdentifier,
+	toConstantDependency,
+	evaluateToString,
+	evaluateToNumber
+} = require("../javascript/JavascriptParserHelpers");
+const memoize = require("../util/memoize");
+const propertyAccess = require("../util/propertyAccess");
+const ConstDependency = require("./ConstDependency");
+
+/** @typedef {import("estree").MemberExpression} MemberExpression */
+/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("../NormalModule")} NormalModule */
+/** @typedef {import("../javascript/JavascriptParser")} Parser */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+
+const getCriticalDependencyWarning = memoize(() =>
+	require("./CriticalDependencyWarning")
+);
+
+const PLUGIN_NAME = "ImportMetaPlugin";
+
+class ImportMetaPlugin {
+	/**
+	 * @param {Compiler} compiler compiler
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(
+			PLUGIN_NAME,
+			(compilation, { normalModuleFactory }) => {
+				/**
+				 * @param {NormalModule} module module
+				 * @returns {string} file url
+				 */
+				const getUrl = module => pathToFileURL(module.resource).toString();
+				/**
+				 * @param {Parser} parser parser parser
+				 * @param {JavascriptParserOptions} parserOptions parserOptions
+				 * @returns {void}
+				 */
+				const parserHandler = (parser, { importMeta }) => {
+					if (importMeta === false) {
+						const { importMetaName } = compilation.outputOptions;
+						if (importMetaName === "import.meta") return;
+
+						parser.hooks.expression
+							.for("import.meta")
+							.tap(PLUGIN_NAME, metaProperty => {
+								const dep = new ConstDependency(
+									/** @type {string} */ (importMetaName),
+									/** @type {Range} */ (metaProperty.range)
+								);
+								dep.loc = /** @type {DependencyLocation} */ (metaProperty.loc);
+								parser.state.module.addPresentationalDependency(dep);
+								return true;
+							});
+						return;
+					}
+
+					// import.meta direct
+					const webpackVersion = Number.parseInt(
+						require("../../package.json").version,
+						10
+					);
+					const importMetaUrl = () =>
+						JSON.stringify(getUrl(parser.state.module));
+					const importMetaWebpackVersion = () => JSON.stringify(webpackVersion);
+					/**
+					 * @param {string[]} members members
+					 * @returns {string} error message
+					 */
+					const importMetaUnknownProperty = members =>
+						`${Template.toNormalComment(
+							`unsupported import.meta.${members.join(".")}`
+						)} undefined${propertyAccess(members, 1)}`;
+					parser.hooks.typeof
+						.for("import.meta")
+						.tap(
+							PLUGIN_NAME,
+							toConstantDependency(parser, JSON.stringify("object"))
+						);
+					parser.hooks.expression
+						.for("import.meta")
+						.tap(PLUGIN_NAME, metaProperty => {
+							const referencedPropertiesInDestructuring =
+								parser.destructuringAssignmentPropertiesFor(metaProperty);
+							if (!referencedPropertiesInDestructuring) {
+								const CriticalDependencyWarning =
+									getCriticalDependencyWarning();
+								parser.state.module.addWarning(
+									new ModuleDependencyWarning(
+										parser.state.module,
+										new CriticalDependencyWarning(
+											"Accessing import.meta directly is unsupported (only property access or destructuring is supported)"
+										),
+										/** @type {DependencyLocation} */ (metaProperty.loc)
+									)
+								);
+								const dep = new ConstDependency(
+									`${
+										parser.isAsiPosition(
+											/** @type {Range} */ (metaProperty.range)[0]
+										)
+											? ";"
+											: ""
+									}({})`,
+									/** @type {Range} */ (metaProperty.range)
+								);
+								dep.loc = /** @type {DependencyLocation} */ (metaProperty.loc);
+								parser.state.module.addPresentationalDependency(dep);
+								return true;
+							}
+
+							let str = "";
+							for (const { id: prop } of referencedPropertiesInDestructuring) {
+								switch (prop) {
+									case "url":
+										str += `url: ${importMetaUrl()},`;
+										break;
+									case "webpack":
+										str += `webpack: ${importMetaWebpackVersion()},`;
+										break;
+									default:
+										str += `[${JSON.stringify(
+											prop
+										)}]: ${importMetaUnknownProperty([prop])},`;
+										break;
+								}
+							}
+							const dep = new ConstDependency(
+								`({${str}})`,
+								/** @type {Range} */ (metaProperty.range)
+							);
+							dep.loc = /** @type {DependencyLocation} */ (metaProperty.loc);
+							parser.state.module.addPresentationalDependency(dep);
+							return true;
+						});
+					parser.hooks.evaluateTypeof
+						.for("import.meta")
+						.tap(PLUGIN_NAME, evaluateToString("object"));
+					parser.hooks.evaluateIdentifier.for("import.meta").tap(
+						PLUGIN_NAME,
+						evaluateToIdentifier("import.meta", "import.meta", () => [], true)
+					);
+
+					// import.meta.url
+					parser.hooks.typeof
+						.for("import.meta.url")
+						.tap(
+							PLUGIN_NAME,
+							toConstantDependency(parser, JSON.stringify("string"))
+						);
+					parser.hooks.expression
+						.for("import.meta.url")
+						.tap(PLUGIN_NAME, expr => {
+							const dep = new ConstDependency(
+								importMetaUrl(),
+								/** @type {Range} */ (expr.range)
+							);
+							dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+							parser.state.module.addPresentationalDependency(dep);
+							return true;
+						});
+					parser.hooks.evaluateTypeof
+						.for("import.meta.url")
+						.tap(PLUGIN_NAME, evaluateToString("string"));
+					parser.hooks.evaluateIdentifier
+						.for("import.meta.url")
+						.tap(PLUGIN_NAME, expr =>
+							new BasicEvaluatedExpression()
+								.setString(getUrl(parser.state.module))
+								.setRange(/** @type {Range} */ (expr.range))
+						);
+
+					// import.meta.webpack
+					parser.hooks.typeof
+						.for("import.meta.webpack")
+						.tap(
+							PLUGIN_NAME,
+							toConstantDependency(parser, JSON.stringify("number"))
+						);
+					parser.hooks.expression
+						.for("import.meta.webpack")
+						.tap(
+							PLUGIN_NAME,
+							toConstantDependency(parser, importMetaWebpackVersion())
+						);
+					parser.hooks.evaluateTypeof
+						.for("import.meta.webpack")
+						.tap(PLUGIN_NAME, evaluateToString("number"));
+					parser.hooks.evaluateIdentifier
+						.for("import.meta.webpack")
+						.tap(PLUGIN_NAME, evaluateToNumber(webpackVersion));
+
+					// Unknown properties
+					parser.hooks.unhandledExpressionMemberChain
+						.for("import.meta")
+						.tap(PLUGIN_NAME, (expr, members) => {
+							const dep = new ConstDependency(
+								importMetaUnknownProperty(members),
+								/** @type {Range} */ (expr.range)
+							);
+							dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+							parser.state.module.addPresentationalDependency(dep);
+							return true;
+						});
+					parser.hooks.evaluate
+						.for("MemberExpression")
+						.tap(PLUGIN_NAME, expression => {
+							const expr = /** @type {MemberExpression} */ (expression);
+							if (
+								expr.object.type === "MetaProperty" &&
+								expr.object.meta.name === "import" &&
+								expr.object.property.name === "meta" &&
+								expr.property.type ===
+									(expr.computed ? "Literal" : "Identifier")
+							) {
+								return new BasicEvaluatedExpression()
+									.setUndefined()
+									.setRange(/** @type {Range} */ (expr.range));
+							}
+						});
+				};
+
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, parserHandler);
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_ESM)
+					.tap(PLUGIN_NAME, parserHandler);
+			}
+		);
+	}
+}
+
+module.exports = ImportMetaPlugin;
diff --git a/lib/dependencies/ImportParserPlugin.js b/lib/dependencies/ImportParserPlugin.js
index db22574f693..52fdb9317ca 100644
--- a/lib/dependencies/ImportParserPlugin.js
+++ b/lib/dependencies/ImportParserPlugin.js
@@ -2,52 +2,90 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
+const CommentCompilationWarning = require("../CommentCompilationWarning");
+const UnsupportedFeatureWarning = require("../UnsupportedFeatureWarning");
+const { getImportAttributes } = require("../javascript/JavascriptParser");
+const ContextDependencyHelpers = require("./ContextDependencyHelpers");
 const ImportContextDependency = require("./ImportContextDependency");
-const ImportWeakDependency = require("./ImportWeakDependency");
-const ImportDependenciesBlock = require("./ImportDependenciesBlock");
+const ImportDependency = require("./ImportDependency");
 const ImportEagerDependency = require("./ImportEagerDependency");
-const ContextDependencyHelpers = require("./ContextDependencyHelpers");
-const UnsupportedFeatureWarning = require("../UnsupportedFeatureWarning");
-const CommentCompilationWarning = require("../CommentCompilationWarning");
+const ImportWeakDependency = require("./ImportWeakDependency");
+
+/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
+/** @typedef {import("../ChunkGroup").RawChunkGroupOptions} RawChunkGroupOptions */
+/** @typedef {import("../ContextModule").ContextMode} ContextMode */
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
+/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("../javascript/JavascriptParser").ImportExpression} ImportExpression */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
 
 class ImportParserPlugin {
+	/**
+	 * @param {JavascriptParserOptions} options options
+	 */
 	constructor(options) {
 		this.options = options;
 	}
 
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @returns {void}
+	 */
 	apply(parser) {
+		/**
+		 * @template T
+		 * @param {Iterable} enumerable enumerable
+		 * @returns {T[][]} array of array
+		 */
+		const exportsFromEnumerable = enumerable =>
+			Array.from(enumerable, e => [e]);
 		parser.hooks.importCall.tap("ImportParserPlugin", expr => {
-			if (expr.arguments.length !== 1) {
-				throw new Error(
-					"Incorrect number of arguments provided to 'import(module: string) -> Promise'."
-				);
-			}
-
-			const param = parser.evaluateExpression(expr.arguments[0]);
+			const param = parser.evaluateExpression(expr.source);
 
 			let chunkName = null;
-			let mode = "lazy";
+			let mode = /** @type {ContextMode} */ (this.options.dynamicImportMode);
 			let include = null;
 			let exclude = null;
+			/** @type {string[][] | null} */
+			let exports = null;
+			/** @type {RawChunkGroupOptions} */
 			const groupOptions = {};
 
 			const {
-				options: importOptions,
-				errors: commentErrors
-			} = parser.parseCommentOptions(expr.range);
+				dynamicImportPreload,
+				dynamicImportPrefetch,
+				dynamicImportFetchPriority
+			} = this.options;
+			if (dynamicImportPreload !== undefined && dynamicImportPreload !== false)
+				groupOptions.preloadOrder =
+					dynamicImportPreload === true ? 0 : dynamicImportPreload;
+			if (
+				dynamicImportPrefetch !== undefined &&
+				dynamicImportPrefetch !== false
+			)
+				groupOptions.prefetchOrder =
+					dynamicImportPrefetch === true ? 0 : dynamicImportPrefetch;
+			if (
+				dynamicImportFetchPriority !== undefined &&
+				dynamicImportFetchPriority !== false
+			)
+				groupOptions.fetchPriority = dynamicImportFetchPriority;
+
+			const { options: importOptions, errors: commentErrors } =
+				parser.parseCommentOptions(/** @type {Range} */ (expr.range));
 
 			if (commentErrors) {
 				for (const e of commentErrors) {
 					const { comment } = e;
-					parser.state.module.warnings.push(
+					parser.state.module.addWarning(
 						new CommentCompilationWarning(
-							`Compilation error while processing magic comment(-s): /*${
-								comment.value
-							}*/: ${e.message}`,
-							parser.state.module,
-							comment.loc
+							`Compilation error while processing magic comment(-s): /*${comment.value}*/: ${e.message}`,
+							/** @type {DependencyLocation} */ (comment.loc)
 						)
 					);
 				}
@@ -56,31 +94,23 @@ class ImportParserPlugin {
 			if (importOptions) {
 				if (importOptions.webpackIgnore !== undefined) {
 					if (typeof importOptions.webpackIgnore !== "boolean") {
-						parser.state.module.warnings.push(
+						parser.state.module.addWarning(
 							new UnsupportedFeatureWarning(
-								parser.state.module,
-								`\`webpackIgnore\` expected a boolean, but received: ${
-									importOptions.webpackIgnore
-								}.`,
-								expr.loc
+								`\`webpackIgnore\` expected a boolean, but received: ${importOptions.webpackIgnore}.`,
+								/** @type {DependencyLocation} */ (expr.loc)
 							)
 						);
-					} else {
+					} else if (importOptions.webpackIgnore) {
 						// Do not instrument `import()` if `webpackIgnore` is `true`
-						if (importOptions.webpackIgnore) {
-							return false;
-						}
+						return false;
 					}
 				}
 				if (importOptions.webpackChunkName !== undefined) {
 					if (typeof importOptions.webpackChunkName !== "string") {
-						parser.state.module.warnings.push(
+						parser.state.module.addWarning(
 							new UnsupportedFeatureWarning(
-								parser.state.module,
-								`\`webpackChunkName\` expected a string, but received: ${
-									importOptions.webpackChunkName
-								}.`,
-								expr.loc
+								`\`webpackChunkName\` expected a string, but received: ${importOptions.webpackChunkName}.`,
+								/** @type {DependencyLocation} */ (expr.loc)
 							)
 						);
 					} else {
@@ -89,17 +119,14 @@ class ImportParserPlugin {
 				}
 				if (importOptions.webpackMode !== undefined) {
 					if (typeof importOptions.webpackMode !== "string") {
-						parser.state.module.warnings.push(
+						parser.state.module.addWarning(
 							new UnsupportedFeatureWarning(
-								parser.state.module,
-								`\`webpackMode\` expected a string, but received: ${
-									importOptions.webpackMode
-								}.`,
-								expr.loc
+								`\`webpackMode\` expected a string, but received: ${importOptions.webpackMode}.`,
+								/** @type {DependencyLocation} */ (expr.loc)
 							)
 						);
 					} else {
-						mode = importOptions.webpackMode;
+						mode = /** @type {ContextMode} */ (importOptions.webpackMode);
 					}
 				}
 				if (importOptions.webpackPrefetch !== undefined) {
@@ -108,13 +135,10 @@ class ImportParserPlugin {
 					} else if (typeof importOptions.webpackPrefetch === "number") {
 						groupOptions.prefetchOrder = importOptions.webpackPrefetch;
 					} else {
-						parser.state.module.warnings.push(
+						parser.state.module.addWarning(
 							new UnsupportedFeatureWarning(
-								parser.state.module,
-								`\`webpackPrefetch\` expected true or a number, but received: ${
-									importOptions.webpackPrefetch
-								}.`,
-								expr.loc
+								`\`webpackPrefetch\` expected true or a number, but received: ${importOptions.webpackPrefetch}.`,
+								/** @type {DependencyLocation} */ (expr.loc)
 							)
 						);
 					}
@@ -125,13 +149,27 @@ class ImportParserPlugin {
 					} else if (typeof importOptions.webpackPreload === "number") {
 						groupOptions.preloadOrder = importOptions.webpackPreload;
 					} else {
-						parser.state.module.warnings.push(
+						parser.state.module.addWarning(
+							new UnsupportedFeatureWarning(
+								`\`webpackPreload\` expected true or a number, but received: ${importOptions.webpackPreload}.`,
+								/** @type {DependencyLocation} */ (expr.loc)
+							)
+						);
+					}
+				}
+				if (importOptions.webpackFetchPriority !== undefined) {
+					if (
+						typeof importOptions.webpackFetchPriority === "string" &&
+						["high", "low", "auto"].includes(importOptions.webpackFetchPriority)
+					) {
+						groupOptions.fetchPriority =
+							/** @type {"low" | "high" | "auto"} */
+							(importOptions.webpackFetchPriority);
+					} else {
+						parser.state.module.addWarning(
 							new UnsupportedFeatureWarning(
-								parser.state.module,
-								`\`webpackPreload\` expected true or a number, but received: ${
-									importOptions.webpackPreload
-								}.`,
-								expr.loc
+								`\`webpackFetchPriority\` expected true or "low", "high" or "auto", but received: ${importOptions.webpackFetchPriority}.`,
+								/** @type {DependencyLocation} */ (expr.loc)
 							)
 						);
 					}
@@ -139,124 +177,161 @@ class ImportParserPlugin {
 				if (importOptions.webpackInclude !== undefined) {
 					if (
 						!importOptions.webpackInclude ||
-						importOptions.webpackInclude.constructor.name !== "RegExp"
+						!(importOptions.webpackInclude instanceof RegExp)
 					) {
-						parser.state.module.warnings.push(
+						parser.state.module.addWarning(
 							new UnsupportedFeatureWarning(
-								parser.state.module,
-								`\`webpackInclude\` expected a regular expression, but received: ${
-									importOptions.webpackInclude
-								}.`,
-								expr.loc
+								`\`webpackInclude\` expected a regular expression, but received: ${importOptions.webpackInclude}.`,
+								/** @type {DependencyLocation} */ (expr.loc)
 							)
 						);
 					} else {
-						include = new RegExp(importOptions.webpackInclude);
+						include = importOptions.webpackInclude;
 					}
 				}
 				if (importOptions.webpackExclude !== undefined) {
 					if (
 						!importOptions.webpackExclude ||
-						importOptions.webpackExclude.constructor.name !== "RegExp"
+						!(importOptions.webpackExclude instanceof RegExp)
+					) {
+						parser.state.module.addWarning(
+							new UnsupportedFeatureWarning(
+								`\`webpackExclude\` expected a regular expression, but received: ${importOptions.webpackExclude}.`,
+								/** @type {DependencyLocation} */ (expr.loc)
+							)
+						);
+					} else {
+						exclude = importOptions.webpackExclude;
+					}
+				}
+				if (importOptions.webpackExports !== undefined) {
+					if (
+						!(
+							typeof importOptions.webpackExports === "string" ||
+							(Array.isArray(importOptions.webpackExports) &&
+								/** @type {string[]} */ (importOptions.webpackExports).every(
+									item => typeof item === "string"
+								))
+						)
 					) {
-						parser.state.module.warnings.push(
+						parser.state.module.addWarning(
 							new UnsupportedFeatureWarning(
-								parser.state.module,
-								`\`webpackExclude\` expected a regular expression, but received: ${
-									importOptions.webpackExclude
-								}.`,
-								expr.loc
+								`\`webpackExports\` expected a string or an array of strings, but received: ${importOptions.webpackExports}.`,
+								/** @type {DependencyLocation} */ (expr.loc)
 							)
 						);
+					} else if (typeof importOptions.webpackExports === "string") {
+						exports = [[importOptions.webpackExports]];
 					} else {
-						exclude = new RegExp(importOptions.webpackExclude);
+						exports = exportsFromEnumerable(importOptions.webpackExports);
 					}
 				}
 			}
 
-			if (param.isString()) {
-				if (mode !== "lazy" && mode !== "eager" && mode !== "weak") {
-					parser.state.module.warnings.push(
+			if (
+				mode !== "lazy" &&
+				mode !== "lazy-once" &&
+				mode !== "eager" &&
+				mode !== "weak"
+			) {
+				parser.state.module.addWarning(
+					new UnsupportedFeatureWarning(
+						`\`webpackMode\` expected 'lazy', 'lazy-once', 'eager' or 'weak', but received: ${mode}.`,
+						/** @type {DependencyLocation} */ (expr.loc)
+					)
+				);
+				mode = "lazy";
+			}
+
+			const referencedPropertiesInDestructuring =
+				parser.destructuringAssignmentPropertiesFor(expr);
+			if (referencedPropertiesInDestructuring) {
+				if (exports) {
+					parser.state.module.addWarning(
 						new UnsupportedFeatureWarning(
-							parser.state.module,
-							`\`webpackMode\` expected 'lazy', 'eager' or 'weak', but received: ${mode}.`,
-							expr.loc
+							"`webpackExports` could not be used with destructuring assignment.",
+							/** @type {DependencyLocation} */ (expr.loc)
 						)
 					);
 				}
+				exports = exportsFromEnumerable(
+					[...referencedPropertiesInDestructuring].map(({ id }) => id)
+				);
+			}
+
+			if (param.isString()) {
+				const attributes = getImportAttributes(expr);
 
 				if (mode === "eager") {
 					const dep = new ImportEagerDependency(
-						param.string,
-						parser.state.module,
-						expr.range
+						/** @type {string} */ (param.string),
+						/** @type {Range} */ (expr.range),
+						exports,
+						attributes
 					);
 					parser.state.current.addDependency(dep);
 				} else if (mode === "weak") {
 					const dep = new ImportWeakDependency(
-						param.string,
-						parser.state.module,
-						expr.range
+						/** @type {string} */ (param.string),
+						/** @type {Range} */ (expr.range),
+						exports,
+						attributes
 					);
 					parser.state.current.addDependency(dep);
 				} else {
-					const depBlock = new ImportDependenciesBlock(
-						param.string,
-						expr.range,
-						Object.assign(groupOptions, {
+					const depBlock = new AsyncDependenciesBlock(
+						{
+							...groupOptions,
 							name: chunkName
-						}),
-						parser.state.module,
-						expr.loc,
-						parser.state.module
+						},
+						/** @type {DependencyLocation} */ (expr.loc),
+						param.string
 					);
-					parser.state.current.addBlock(depBlock);
-				}
-				return true;
-			} else {
-				if (
-					mode !== "lazy" &&
-					mode !== "lazy-once" &&
-					mode !== "eager" &&
-					mode !== "weak"
-				) {
-					parser.state.module.warnings.push(
-						new UnsupportedFeatureWarning(
-							parser.state.module,
-							`\`webpackMode\` expected 'lazy', 'lazy-once', 'eager' or 'weak', but received: ${mode}.`,
-							expr.loc
-						)
+					const dep = new ImportDependency(
+						/** @type {string} */ (param.string),
+						/** @type {Range} */ (expr.range),
+						exports,
+						attributes
 					);
-					mode = "lazy";
-				}
-
-				if (mode === "weak") {
-					mode = "async-weak";
+					dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+					dep.optional = Boolean(parser.scope.inTry);
+					depBlock.addDependency(dep);
+					parser.state.current.addBlock(depBlock);
 				}
-				const dep = ContextDependencyHelpers.create(
-					ImportContextDependency,
-					expr.range,
-					param,
-					expr,
-					this.options,
-					{
-						chunkName,
-						groupOptions,
-						include,
-						exclude,
-						mode,
-						namespaceObject: parser.state.module.buildMeta.strictHarmonyModule
-							? "strict"
-							: true
-					},
-					parser
-				);
-				if (!dep) return;
-				dep.loc = expr.loc;
-				dep.optional = !!parser.scope.inTry;
-				parser.state.current.addDependency(dep);
 				return true;
 			}
+			if (mode === "weak") {
+				mode = "async-weak";
+			}
+			const dep = ContextDependencyHelpers.create(
+				ImportContextDependency,
+				/** @type {Range} */ (expr.range),
+				param,
+				expr,
+				this.options,
+				{
+					chunkName,
+					groupOptions,
+					include,
+					exclude,
+					mode,
+					namespaceObject: /** @type {BuildMeta} */ (
+						parser.state.module.buildMeta
+					).strictHarmonyModule
+						? "strict"
+						: true,
+					typePrefix: "import()",
+					category: "esm",
+					referencedExports: exports,
+					attributes: getImportAttributes(expr)
+				},
+				parser
+			);
+			if (!dep) return;
+			dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+			dep.optional = Boolean(parser.scope.inTry);
+			parser.state.current.addDependency(dep);
+			return true;
 		});
 	}
 }
diff --git a/lib/dependencies/ImportPlugin.js b/lib/dependencies/ImportPlugin.js
index 1647192595b..4ee51a8f748 100644
--- a/lib/dependencies/ImportPlugin.js
+++ b/lib/dependencies/ImportPlugin.js
@@ -2,23 +2,35 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_DYNAMIC,
+	JAVASCRIPT_MODULE_TYPE_ESM
+} = require("../ModuleTypeConstants");
+const ImportContextDependency = require("./ImportContextDependency");
 const ImportDependency = require("./ImportDependency");
 const ImportEagerDependency = require("./ImportEagerDependency");
-const ImportWeakDependency = require("./ImportWeakDependency");
-const ImportContextDependency = require("./ImportContextDependency");
 const ImportParserPlugin = require("./ImportParserPlugin");
+const ImportWeakDependency = require("./ImportWeakDependency");
 
-class ImportPlugin {
-	constructor(options) {
-		this.options = options;
-	}
+/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../javascript/JavascriptParser")} Parser */
 
+const PLUGIN_NAME = "ImportPlugin";
+
+class ImportPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		const options = this.options;
 		compiler.hooks.compilation.tap(
-			"ImportPlugin",
+			PLUGIN_NAME,
 			(compilation, { contextModuleFactory, normalModuleFactory }) => {
 				compilation.dependencyFactories.set(
 					ImportDependency,
@@ -56,22 +68,27 @@ class ImportPlugin {
 					new ImportContextDependency.Template()
 				);
 
+				/**
+				 * @param {Parser} parser parser parser
+				 * @param {JavascriptParserOptions} parserOptions parserOptions
+				 * @returns {void}
+				 */
 				const handler = (parser, parserOptions) => {
 					if (parserOptions.import !== undefined && !parserOptions.import)
 						return;
 
-					new ImportParserPlugin(options).apply(parser);
+					new ImportParserPlugin(parserOptions).apply(parser);
 				};
 
 				normalModuleFactory.hooks.parser
-					.for("javascript/auto")
-					.tap("ImportPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, handler);
 				normalModuleFactory.hooks.parser
-					.for("javascript/dynamic")
-					.tap("ImportPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
+					.tap(PLUGIN_NAME, handler);
 				normalModuleFactory.hooks.parser
-					.for("javascript/esm")
-					.tap("ImportPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_ESM)
+					.tap(PLUGIN_NAME, handler);
 			}
 		);
 	}
diff --git a/lib/dependencies/ImportWeakDependency.js b/lib/dependencies/ImportWeakDependency.js
index d48400001d1..0ed3b053f96 100644
--- a/lib/dependencies/ImportWeakDependency.js
+++ b/lib/dependencies/ImportWeakDependency.js
@@ -2,14 +2,31 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
-const ModuleDependency = require("./ModuleDependency");
 
-class ImportWeakDependency extends ModuleDependency {
-	constructor(request, originModule, range) {
-		super(request);
-		this.originModule = originModule;
-		this.range = range;
+const makeSerializable = require("../util/makeSerializable");
+const ImportDependency = require("./ImportDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+
+class ImportWeakDependency extends ImportDependency {
+	/**
+	 * @param {string} request the request
+	 * @param {Range} range expression range
+	 * @param {(string[][] | null)=} referencedExports list of referenced exports
+	 * @param {ImportAttributes=} attributes import attributes
+	 */
+	constructor(request, range, referencedExports, attributes) {
+		super(request, range, referencedExports, attributes);
 		this.weak = true;
 	}
 
@@ -18,15 +35,36 @@ class ImportWeakDependency extends ModuleDependency {
 	}
 }
 
-ImportWeakDependency.Template = class ImportDependencyTemplate {
-	apply(dep, source, runtime) {
-		const content = runtime.moduleNamespacePromise({
-			module: dep.module,
+makeSerializable(
+	ImportWeakDependency,
+	"webpack/lib/dependencies/ImportWeakDependency"
+);
+
+ImportWeakDependency.Template = class ImportDependencyTemplate extends (
+	ImportDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(
+		dependency,
+		source,
+		{ runtimeTemplate, module, moduleGraph, chunkGraph, runtimeRequirements }
+	) {
+		const dep = /** @type {ImportWeakDependency} */ (dependency);
+		const content = runtimeTemplate.moduleNamespacePromise({
+			chunkGraph,
+			module: /** @type {Module} */ (moduleGraph.getModule(dep)),
 			request: dep.request,
-			strict: dep.originModule.buildMeta.strictHarmonyModule,
+			strict: /** @type {BuildMeta} */ (module.buildMeta).strictHarmonyModule,
 			message: "import() weak",
-			weak: true
+			weak: true,
+			runtimeRequirements
 		});
+
 		source.replace(dep.range[0], dep.range[1] - 1, content);
 	}
 };
diff --git a/lib/dependencies/JsonExportsDependency.js b/lib/dependencies/JsonExportsDependency.js
index 9e17bfb5ac9..08e062ab300 100644
--- a/lib/dependencies/JsonExportsDependency.js
+++ b/lib/dependencies/JsonExportsDependency.js
@@ -2,25 +2,132 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const makeSerializable = require("../util/makeSerializable");
 const NullDependency = require("./NullDependency");
 
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Dependency").ExportSpec} ExportSpec */
+/** @typedef {import("../Dependency").ExportsSpec} ExportsSpec */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../json/JsonData")} JsonData */
+/** @typedef {import("../json/JsonData").JsonValue} JsonValue */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+
+/**
+ * @callback GetExportsFromDataFn
+ * @param {JsonValue} data raw json data
+ * @param {number=} curDepth current depth
+ * @returns {ExportSpec[] | null} export spec or nothing
+ */
+
+/**
+ * @param {number} exportsDepth exportsDepth
+ * @returns {GetExportsFromDataFn} value
+ */
+const getExportsWithDepth = exportsDepth =>
+	/** @type {GetExportsFromDataFn} */
+	function getExportsFromData(data, curDepth = 1) {
+		if (curDepth > exportsDepth) {
+			return null;
+		}
+
+		if (data && typeof data === "object") {
+			if (Array.isArray(data)) {
+				return data.length < 100
+					? data.map((item, idx) => ({
+							name: `${idx}`,
+							canMangle: true,
+							exports: getExportsFromData(item, curDepth + 1) || undefined
+						}))
+					: null;
+			}
+
+			/** @type {ExportSpec[]} */
+			const exports = [];
+
+			for (const key of Object.keys(data)) {
+				exports.push({
+					name: key,
+					canMangle: true,
+					exports: getExportsFromData(data[key], curDepth + 1) || undefined
+				});
+			}
+
+			return exports;
+		}
+
+		return null;
+	};
+
 class JsonExportsDependency extends NullDependency {
-	constructor(exports) {
+	/**
+	 * @param {JsonData} data json data
+	 * @param {number} exportsDepth the depth of json exports to analyze
+	 */
+	constructor(data, exportsDepth) {
 		super();
-		this.exports = exports;
+		this.data = data;
+		this.exportsDepth = exportsDepth;
 	}
 
 	get type() {
 		return "json exports";
 	}
 
-	getExports() {
+	/**
+	 * Returns the exported names
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {ExportsSpec | undefined} export names
+	 */
+	getExports(moduleGraph) {
 		return {
-			exports: this.exports,
+			exports: getExportsWithDepth(this.exportsDepth)(
+				this.data && /** @type {JsonValue} */ (this.data.get())
+			),
 			dependencies: undefined
 		};
 	}
+
+	/**
+	 * Update the hash
+	 * @param {Hash} hash hash to be updated
+	 * @param {UpdateHashContext} context context
+	 * @returns {void}
+	 */
+	updateHash(hash, context) {
+		this.data.updateHash(hash);
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.data);
+		write(this.exportsDepth);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.data = read();
+		this.exportsDepth = read();
+		super.deserialize(context);
+	}
 }
 
+makeSerializable(
+	JsonExportsDependency,
+	"webpack/lib/dependencies/JsonExportsDependency"
+);
+
 module.exports = JsonExportsDependency;
diff --git a/lib/dependencies/LoaderDependency.js b/lib/dependencies/LoaderDependency.js
index 9d0876bcee0..7ae66b3d2b0 100644
--- a/lib/dependencies/LoaderDependency.js
+++ b/lib/dependencies/LoaderDependency.js
@@ -2,9 +2,17 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
 const ModuleDependency = require("./ModuleDependency");
 
+/** @typedef {import("../Dependency").GetConditionFn} GetConditionFn */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */
+/** @typedef {import("../ModuleGraphConnection").ConnectionState} ConnectionState */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+
 class LoaderDependency extends ModuleDependency {
 	/**
 	 * @param {string} request request string
@@ -16,6 +24,18 @@ class LoaderDependency extends ModuleDependency {
 	get type() {
 		return "loader";
 	}
+
+	get category() {
+		return "loader";
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {null | false | GetConditionFn} function to determine if the connection is active
+	 */
+	getCondition(moduleGraph) {
+		return false;
+	}
 }
 
 module.exports = LoaderDependency;
diff --git a/lib/dependencies/LoaderImportDependency.js b/lib/dependencies/LoaderImportDependency.js
new file mode 100644
index 00000000000..94937922d60
--- /dev/null
+++ b/lib/dependencies/LoaderImportDependency.js
@@ -0,0 +1,42 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const ModuleDependency = require("./ModuleDependency");
+
+/** @typedef {import("../Dependency").GetConditionFn} GetConditionFn */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */
+/** @typedef {import("../ModuleGraphConnection").ConnectionState} ConnectionState */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+
+class LoaderImportDependency extends ModuleDependency {
+	/**
+	 * @param {string} request request string
+	 */
+	constructor(request) {
+		super(request);
+		this.weak = true;
+	}
+
+	get type() {
+		return "loader import";
+	}
+
+	get category() {
+		return "loaderImport";
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {null | false | GetConditionFn} function to determine if the connection is active
+	 */
+	getCondition(moduleGraph) {
+		return false;
+	}
+}
+
+module.exports = LoaderImportDependency;
diff --git a/lib/dependencies/LoaderPlugin.js b/lib/dependencies/LoaderPlugin.js
index c781d063605..fe7cdd51fe2 100644
--- a/lib/dependencies/LoaderPlugin.js
+++ b/lib/dependencies/LoaderPlugin.js
@@ -2,113 +2,280 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const LoaderDependency = require("./LoaderDependency");
 const NormalModule = require("../NormalModule");
+const LazySet = require("../util/LazySet");
+const LoaderDependency = require("./LoaderDependency");
+const LoaderImportDependency = require("./LoaderImportDependency");
 
+/** @typedef {import("../../declarations/LoaderContext").LoaderPluginLoaderContext} LoaderPluginLoaderContext */
+/** @typedef {import("../Compilation").DepConstructor} DepConstructor */
+/** @typedef {import("../Compilation").ExecuteModuleExports} ExecuteModuleExports */
+/** @typedef {import("../Compilation").ExecuteModuleResult} ExecuteModuleResult */
+/** @typedef {import("../Compiler")} Compiler */
 /** @typedef {import("../Module")} Module */
+/** @typedef {import("../Module").BuildInfo} BuildInfo */
+
+/**
+ * @callback ImportModuleCallback
+ * @param {(Error | null)=} err error object
+ * @param {ExecuteModuleExports=} exports exports of the evaluated module
+ */
 
 /**
- * @callback LoadModuleCallback
- * @param {Error=} err error object
- * @param {string=} source source code
- * @param {object=} map source map
- * @param {Module=} module loaded module if successful
+ * @typedef {object} ImportModuleOptions
+ * @property {string=} layer the target layer
+ * @property {string=} publicPath the target public path
+ * @property {string=} baseUri target base uri
  */
 
+const PLUGIN_NAME = "LoaderPlugin";
+
 class LoaderPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		compiler.hooks.compilation.tap(
-			"LoaderPlugin",
+			PLUGIN_NAME,
 			(compilation, { normalModuleFactory }) => {
 				compilation.dependencyFactories.set(
 					LoaderDependency,
 					normalModuleFactory
 				);
+				compilation.dependencyFactories.set(
+					LoaderImportDependency,
+					normalModuleFactory
+				);
 			}
 		);
 
-		compiler.hooks.compilation.tap("LoaderPlugin", compilation => {
-			compilation.hooks.normalModuleLoader.tap(
-				"LoaderPlugin",
-				(loaderContext, module) => {
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			const moduleGraph = compilation.moduleGraph;
+			NormalModule.getCompilationHooks(compilation).loader.tap(
+				PLUGIN_NAME,
+				loaderContext => {
+					loaderContext.loadModule = (request, callback) => {
+						const dep = new LoaderDependency(request);
+						dep.loc = {
+							name: request
+						};
+						const factory = compilation.dependencyFactories.get(
+							/** @type {DepConstructor} */ (dep.constructor)
+						);
+						if (factory === undefined) {
+							return callback(
+								new Error(
+									`No module factory available for dependency type: ${dep.constructor.name}`
+								)
+							);
+						}
+						const oldFactorizeQueueContext =
+							compilation.factorizeQueue.getContext();
+						compilation.factorizeQueue.setContext("load-module");
+						const oldAddModuleQueueContext =
+							compilation.addModuleQueue.getContext();
+						compilation.addModuleQueue.setContext("load-module");
+						compilation.buildQueue.increaseParallelism();
+						compilation.handleModuleCreation(
+							{
+								factory,
+								dependencies: [dep],
+								originModule:
+									/** @type {NormalModule} */
+									(loaderContext._module),
+								context: loaderContext.context,
+								recursive: false
+							},
+							err => {
+								compilation.factorizeQueue.setContext(oldFactorizeQueueContext);
+								compilation.addModuleQueue.setContext(oldAddModuleQueueContext);
+								compilation.buildQueue.decreaseParallelism();
+								if (err) {
+									return callback(err);
+								}
+								const referencedModule = moduleGraph.getModule(dep);
+								if (!referencedModule) {
+									return callback(new Error("Cannot load the module"));
+								}
+								if (referencedModule.getNumberOfErrors() > 0) {
+									return callback(
+										new Error("The loaded module contains errors")
+									);
+								}
+								const moduleSource = referencedModule.originalSource();
+								if (!moduleSource) {
+									return callback(
+										new Error(
+											"The module created for a LoaderDependency must have an original source"
+										)
+									);
+								}
+								let map;
+								let source;
+								if (moduleSource.sourceAndMap) {
+									const sourceAndMap = moduleSource.sourceAndMap();
+									map = sourceAndMap.map;
+									source = sourceAndMap.source;
+								} else {
+									map = moduleSource.map();
+									source = moduleSource.source();
+								}
+								const fileDependencies = new LazySet();
+								const contextDependencies = new LazySet();
+								const missingDependencies = new LazySet();
+								const buildDependencies = new LazySet();
+								referencedModule.addCacheDependencies(
+									fileDependencies,
+									contextDependencies,
+									missingDependencies,
+									buildDependencies
+								);
+
+								for (const d of fileDependencies) {
+									loaderContext.addDependency(d);
+								}
+								for (const d of contextDependencies) {
+									loaderContext.addContextDependency(d);
+								}
+								for (const d of missingDependencies) {
+									loaderContext.addMissingDependency(d);
+								}
+								for (const d of buildDependencies) {
+									loaderContext.addBuildDependency(d);
+								}
+								return callback(null, source, map, referencedModule);
+							}
+						);
+					};
+
 					/**
 					 * @param {string} request the request string to load the module from
-					 * @param {LoadModuleCallback} callback callback returning the loaded module or error
+					 * @param {ImportModuleOptions} options options
+					 * @param {ImportModuleCallback} callback callback returning the exports
 					 * @returns {void}
 					 */
-					loaderContext.loadModule = (request, callback) => {
-						const dep = new LoaderDependency(request);
+					const importModule = (request, options, callback) => {
+						const dep = new LoaderImportDependency(request);
 						dep.loc = {
 							name: request
 						};
 						const factory = compilation.dependencyFactories.get(
-							dep.constructor
+							/** @type {DepConstructor} */ (dep.constructor)
 						);
 						if (factory === undefined) {
 							return callback(
 								new Error(
-									`No module factory available for dependency type: ${
-										dep.constructor.name
-									}`
+									`No module factory available for dependency type: ${dep.constructor.name}`
 								)
 							);
 						}
-						compilation.semaphore.release();
-						compilation.addModuleDependencies(
-							module,
-							[
-								{
-									factory,
-									dependencies: [dep]
-								}
-							],
-							true,
-							"lm",
-							true,
+
+						const oldFactorizeQueueContext =
+							compilation.factorizeQueue.getContext();
+						compilation.factorizeQueue.setContext("import-module");
+						const oldAddModuleQueueContext =
+							compilation.addModuleQueue.getContext();
+						compilation.addModuleQueue.setContext("import-module");
+						compilation.buildQueue.increaseParallelism();
+						compilation.handleModuleCreation(
+							{
+								factory,
+								dependencies: [dep],
+								originModule:
+									/** @type {NormalModule} */
+									(loaderContext._module),
+								contextInfo: {
+									issuerLayer: options.layer
+								},
+								context: loaderContext.context,
+								connectOrigin: false,
+								checkCycle: true
+							},
 							err => {
-								compilation.semaphore.acquire(() => {
-									if (err) {
-										return callback(err);
-									}
-									if (!dep.module) {
-										return callback(new Error("Cannot load the module"));
-									}
-									// TODO consider removing this in webpack 5
-									if (dep.module instanceof NormalModule && dep.module.error) {
-										return callback(dep.module.error);
-									}
-									if (!dep.module._source) {
-										throw new Error(
-											"The module created for a LoaderDependency must have a property _source"
-										);
-									}
-									let source, map;
-									const moduleSource = dep.module._source;
-									if (moduleSource.sourceAndMap) {
-										const sourceAndMap = moduleSource.sourceAndMap();
-										map = sourceAndMap.map;
-										source = sourceAndMap.source;
-									} else {
-										map = moduleSource.map();
-										source = moduleSource.source();
-									}
-									if (dep.module.buildInfo.fileDependencies) {
-										for (const d of dep.module.buildInfo.fileDependencies) {
+								compilation.factorizeQueue.setContext(oldFactorizeQueueContext);
+								compilation.addModuleQueue.setContext(oldAddModuleQueueContext);
+								compilation.buildQueue.decreaseParallelism();
+								if (err) {
+									return callback(err);
+								}
+								const referencedModule = moduleGraph.getModule(dep);
+								if (!referencedModule) {
+									return callback(new Error("Cannot load the module"));
+								}
+								compilation.buildQueue.increaseParallelism();
+								compilation.executeModule(
+									referencedModule,
+									{
+										entryOptions: {
+											baseUri: options.baseUri,
+											publicPath: options.publicPath
+										}
+									},
+									(err, result) => {
+										compilation.buildQueue.decreaseParallelism();
+										if (err) return callback(err);
+										const {
+											fileDependencies,
+											contextDependencies,
+											missingDependencies,
+											buildDependencies,
+											cacheable,
+											assets,
+											exports
+										} = /** @type {ExecuteModuleResult} */ (result);
+										for (const d of fileDependencies) {
 											loaderContext.addDependency(d);
 										}
-									}
-									if (dep.module.buildInfo.contextDependencies) {
-										for (const d of dep.module.buildInfo.contextDependencies) {
+										for (const d of contextDependencies) {
 											loaderContext.addContextDependency(d);
 										}
+										for (const d of missingDependencies) {
+											loaderContext.addMissingDependency(d);
+										}
+										for (const d of buildDependencies) {
+											loaderContext.addBuildDependency(d);
+										}
+										if (cacheable === false) loaderContext.cacheable(false);
+										for (const [name, { source, info }] of assets) {
+											const buildInfo =
+												/** @type {BuildInfo} */
+												(
+													/** @type {NormalModule} */ (loaderContext._module)
+														.buildInfo
+												);
+											if (!buildInfo.assets) {
+												buildInfo.assets = Object.create(null);
+												buildInfo.assetsInfo = new Map();
+											}
+											/** @type {NonNullable} */
+											(buildInfo.assets)[name] = source;
+											/** @type {NonNullable} */
+											(buildInfo.assetsInfo).set(name, info);
+										}
+										callback(null, exports);
 									}
-									return callback(null, source, map, dep.module);
-								});
+								);
 							}
 						);
 					};
+
+					// @ts-expect-error overloading doesn't work
+					loaderContext.importModule = (request, options, callback) => {
+						if (!callback) {
+							return new Promise((resolve, reject) => {
+								importModule(request, options || {}, (err, result) => {
+									if (err) reject(err);
+									else resolve(result);
+								});
+							});
+						}
+						return importModule(request, options || {}, callback);
+					};
 				}
 			);
 		});
diff --git a/lib/dependencies/LocalModule.js b/lib/dependencies/LocalModule.js
index 06e5385fbd3..7748a06ba6a 100644
--- a/lib/dependencies/LocalModule.js
+++ b/lib/dependencies/LocalModule.js
@@ -2,11 +2,20 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const makeSerializable = require("../util/makeSerializable");
+
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
 class LocalModule {
-	constructor(module, name, idx) {
-		this.module = module;
+	/**
+	 * @param {string} name name
+	 * @param {number} idx index
+	 */
+	constructor(name, idx) {
 		this.name = name;
 		this.idx = idx;
 		this.used = false;
@@ -16,8 +25,36 @@ class LocalModule {
 		this.used = true;
 	}
 
+	/**
+	 * @returns {string} variable name
+	 */
 	variableName() {
-		return "__WEBPACK_LOCAL_MODULE_" + this.idx + "__";
+		return `__WEBPACK_LOCAL_MODULE_${this.idx}__`;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+
+		write(this.name);
+		write(this.idx);
+		write(this.used);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+
+		this.name = read();
+		this.idx = read();
+		this.used = read();
 	}
 }
+
+makeSerializable(LocalModule, "webpack/lib/dependencies/LocalModule");
+
 module.exports = LocalModule;
diff --git a/lib/dependencies/LocalModuleDependency.js b/lib/dependencies/LocalModuleDependency.js
index 5d1e56bb9be..2cde22fe145 100644
--- a/lib/dependencies/LocalModuleDependency.js
+++ b/lib/dependencies/LocalModuleDependency.js
@@ -2,21 +2,77 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const makeSerializable = require("../util/makeSerializable");
 const NullDependency = require("./NullDependency");
 
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("./LocalModule")} LocalModule */
+
 class LocalModuleDependency extends NullDependency {
+	/**
+	 * @param {LocalModule} localModule local module
+	 * @param {Range | undefined} range range
+	 * @param {boolean} callNew true, when the local module should be called with new
+	 */
 	constructor(localModule, range, callNew) {
 		super();
-		localModule.flagUsed();
+
 		this.localModule = localModule;
 		this.range = range;
 		this.callNew = callNew;
 	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+
+		write(this.localModule);
+		write(this.range);
+		write(this.callNew);
+
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+
+		this.localModule = read();
+		this.range = read();
+		this.callNew = read();
+
+		super.deserialize(context);
+	}
 }
 
-LocalModuleDependency.Template = class LocalModuleDependencyTemplate {
-	apply(dep, source) {
+makeSerializable(
+	LocalModuleDependency,
+	"webpack/lib/dependencies/LocalModuleDependency"
+);
+
+LocalModuleDependency.Template = class LocalModuleDependencyTemplate extends (
+	NullDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, templateContext) {
+		const dep = /** @type {LocalModuleDependency} */ (dependency);
 		if (!dep.range) return;
 		const moduleInstance = dep.callNew
 			? `new (function () { return ${dep.localModule.variableName()}; })()`
diff --git a/lib/dependencies/LocalModulesHelpers.js b/lib/dependencies/LocalModulesHelpers.js
index 05662270448..b94d149386f 100644
--- a/lib/dependencies/LocalModulesHelpers.js
+++ b/lib/dependencies/LocalModulesHelpers.js
@@ -2,20 +2,27 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const LocalModule = require("./LocalModule");
-const LocalModulesHelpers = exports;
 
+/** @typedef {import("../javascript/JavascriptParser").ParserState} ParserState */
+
+/**
+ * @param {string} parent parent module
+ * @param {string} mod module to resolve
+ * @returns {string} resolved module
+ */
 const lookup = (parent, mod) => {
 	if (mod.charAt(0) !== ".") return mod;
 
-	var path = parent.split("/");
-	var segs = mod.split("/");
+	const path = parent.split("/");
+	const segments = mod.split("/");
 	path.pop();
 
-	for (let i = 0; i < segs.length; i++) {
-		const seg = segs[i];
+	for (let i = 0; i < segments.length; i++) {
+		const seg = segments[i];
 		if (seg === "..") {
 			path.pop();
 		} else if (seg !== ".") {
@@ -26,16 +33,27 @@ const lookup = (parent, mod) => {
 	return path.join("/");
 };
 
-LocalModulesHelpers.addLocalModule = (state, name) => {
+/**
+ * @param {ParserState} state parser state
+ * @param {string} name name
+ * @returns {LocalModule} local module
+ */
+module.exports.addLocalModule = (state, name) => {
 	if (!state.localModules) {
 		state.localModules = [];
 	}
-	const m = new LocalModule(state.module, name, state.localModules.length);
+	const m = new LocalModule(name, state.localModules.length);
 	state.localModules.push(m);
 	return m;
 };
 
-LocalModulesHelpers.getLocalModule = (state, name, namedModule) => {
+/**
+ * @param {ParserState} state parser state
+ * @param {string} name name
+ * @param {string=} namedModule named module
+ * @returns {LocalModule | null} local module or null
+ */
+module.exports.getLocalModule = (state, name, namedModule) => {
 	if (!state.localModules) return null;
 	if (namedModule) {
 		// resolve dependency name relative to the defining named module
@@ -48,5 +66,3 @@ LocalModulesHelpers.getLocalModule = (state, name, namedModule) => {
 	}
 	return null;
 };
-
-module.exports = LocalModulesHelpers;
diff --git a/lib/dependencies/ModuleDecoratorDependency.js b/lib/dependencies/ModuleDecoratorDependency.js
new file mode 100644
index 00000000000..fd2b3fe5f73
--- /dev/null
+++ b/lib/dependencies/ModuleDecoratorDependency.js
@@ -0,0 +1,137 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const Dependency = require("../Dependency");
+const InitFragment = require("../InitFragment");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const makeSerializable = require("../util/makeSerializable");
+const NullDependency = require("./NullDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../DependencyTemplates")} DependencyTemplates */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+
+class ModuleDecoratorDependency extends NullDependency {
+	/**
+	 * @param {string} decorator the decorator requirement
+	 * @param {boolean} allowExportsAccess allow to access exports from module
+	 */
+	constructor(decorator, allowExportsAccess) {
+		super();
+		this.decorator = decorator;
+		this.allowExportsAccess = allowExportsAccess;
+		this._hashUpdate = undefined;
+	}
+
+	/**
+	 * @returns {string} a display name for the type of dependency
+	 */
+	get type() {
+		return "module decorator";
+	}
+
+	get category() {
+		return "self";
+	}
+
+	/**
+	 * @returns {string | null} an identifier to merge equal requests
+	 */
+	getResourceIdentifier() {
+		return "self";
+	}
+
+	/**
+	 * Returns list of exports referenced by this dependency
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @param {RuntimeSpec} runtime the runtime for which the module is analysed
+	 * @returns {(string[] | ReferencedExport)[]} referenced exports
+	 */
+	getReferencedExports(moduleGraph, runtime) {
+		return this.allowExportsAccess
+			? Dependency.EXPORTS_OBJECT_REFERENCED
+			: Dependency.NO_EXPORTS_REFERENCED;
+	}
+
+	/**
+	 * Update the hash
+	 * @param {Hash} hash hash to be updated
+	 * @param {UpdateHashContext} context context
+	 * @returns {void}
+	 */
+	updateHash(hash, context) {
+		if (this._hashUpdate === undefined) {
+			this._hashUpdate = `${this.decorator}${this.allowExportsAccess}`;
+		}
+		hash.update(this._hashUpdate);
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.decorator);
+		write(this.allowExportsAccess);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.decorator = read();
+		this.allowExportsAccess = read();
+		super.deserialize(context);
+	}
+}
+
+makeSerializable(
+	ModuleDecoratorDependency,
+	"webpack/lib/dependencies/ModuleDecoratorDependency"
+);
+
+ModuleDecoratorDependency.Template = class ModuleDecoratorDependencyTemplate extends (
+	NullDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(
+		dependency,
+		source,
+		{ module, chunkGraph, initFragments, runtimeRequirements }
+	) {
+		const dep = /** @type {ModuleDecoratorDependency} */ (dependency);
+		runtimeRequirements.add(RuntimeGlobals.moduleLoaded);
+		runtimeRequirements.add(RuntimeGlobals.moduleId);
+		runtimeRequirements.add(RuntimeGlobals.module);
+		runtimeRequirements.add(dep.decorator);
+		initFragments.push(
+			new InitFragment(
+				`/* module decorator */ ${module.moduleArgument} = ${dep.decorator}(${module.moduleArgument});\n`,
+				InitFragment.STAGE_PROVIDES,
+				0,
+				`module decorator ${chunkGraph.getModuleId(module)}`
+			)
+		);
+	}
+};
+
+module.exports = ModuleDecoratorDependency;
diff --git a/lib/dependencies/ModuleDependency.js b/lib/dependencies/ModuleDependency.js
index f325e7a98d6..6a56292370f 100644
--- a/lib/dependencies/ModuleDependency.js
+++ b/lib/dependencies/ModuleDependency.js
@@ -2,8 +2,18 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
 const Dependency = require("../Dependency");
+const DependencyTemplate = require("../DependencyTemplate");
+const RawModule = require("../RawModule");
+
+/** @typedef {import("../Dependency").TRANSITIVE} TRANSITIVE */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../javascript/JavascriptParser").ImportAttributes} ImportAttributes */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
 
 class ModuleDependency extends Dependency {
 	/**
@@ -13,11 +23,76 @@ class ModuleDependency extends Dependency {
 		super();
 		this.request = request;
 		this.userRequest = request;
+		this.range = undefined;
+		// TODO move it to subclasses and rename
+		// assertions must be serialized by subclasses that use it
+		/** @type {ImportAttributes | undefined} */
+		this.assertions = undefined;
+		this._context = undefined;
+	}
+
+	/**
+	 * @returns {string | undefined} a request context
+	 */
+	getContext() {
+		return this._context;
 	}
 
+	/**
+	 * @returns {string | null} an identifier to merge equal requests
+	 */
 	getResourceIdentifier() {
-		return `module${this.request}`;
+		let str = `context${this._context || ""}|module${this.request}`;
+		if (this.assertions !== undefined) {
+			str += JSON.stringify(this.assertions);
+		}
+		return str;
+	}
+
+	/**
+	 * @returns {boolean | TRANSITIVE} true, when changes to the referenced module could affect the referencing module; TRANSITIVE, when changes to the referenced module could affect referencing modules of the referencing module
+	 */
+	couldAffectReferencingModule() {
+		return true;
+	}
+
+	/**
+	 * @param {string} context context directory
+	 * @returns {Module} ignored module
+	 */
+	createIgnoredModule(context) {
+		return new RawModule(
+			"/* (ignored) */",
+			`ignored|${context}|${this.request}`,
+			`${this.request} (ignored)`
+		);
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.request);
+		write(this.userRequest);
+		write(this._context);
+		write(this.range);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.request = read();
+		this.userRequest = read();
+		this._context = read();
+		this.range = read();
+		super.deserialize(context);
 	}
 }
 
+ModuleDependency.Template = DependencyTemplate;
+
 module.exports = ModuleDependency;
diff --git a/lib/dependencies/ModuleDependencyTemplateAsId.js b/lib/dependencies/ModuleDependencyTemplateAsId.js
index 82bc6b5d6cf..8086fc79717 100644
--- a/lib/dependencies/ModuleDependencyTemplateAsId.js
+++ b/lib/dependencies/ModuleDependencyTemplateAsId.js
@@ -2,16 +2,34 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-class ModuleDependencyTemplateAsId {
-	apply(dep, source, runtime) {
+const ModuleDependency = require("./ModuleDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../Module")} Module */
+
+class ModuleDependencyTemplateAsId extends ModuleDependency.Template {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, { runtimeTemplate, moduleGraph, chunkGraph }) {
+		const dep = /** @type {ModuleDependency} */ (dependency);
 		if (!dep.range) return;
-		const content = runtime.moduleId({
-			module: dep.module,
-			request: dep.request
+		const content = runtimeTemplate.moduleId({
+			module: /** @type {Module} */ (moduleGraph.getModule(dep)),
+			chunkGraph,
+			request: dep.request,
+			weak: dep.weak
 		});
 		source.replace(dep.range[0], dep.range[1] - 1, content);
 	}
 }
+
 module.exports = ModuleDependencyTemplateAsId;
diff --git a/lib/dependencies/ModuleDependencyTemplateAsRequireId.js b/lib/dependencies/ModuleDependencyTemplateAsRequireId.js
index db74b895fd9..9e05906cfe1 100644
--- a/lib/dependencies/ModuleDependencyTemplateAsRequireId.js
+++ b/lib/dependencies/ModuleDependencyTemplateAsRequireId.js
@@ -2,14 +2,35 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-class ModuleDependencyTemplateAsRequireId {
-	apply(dep, source, runtime) {
+const ModuleDependency = require("./ModuleDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+
+class ModuleDependencyTemplateAsRequireId extends ModuleDependency.Template {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(
+		dependency,
+		source,
+		{ runtimeTemplate, moduleGraph, chunkGraph, runtimeRequirements }
+	) {
+		const dep = /** @type {ModuleDependency} */ (dependency);
 		if (!dep.range) return;
-		const content = runtime.moduleExports({
-			module: dep.module,
-			request: dep.request
+		const content = runtimeTemplate.moduleExports({
+			module: moduleGraph.getModule(dep),
+			chunkGraph,
+			request: dep.request,
+			weak: dep.weak,
+			runtimeRequirements
 		});
 		source.replace(dep.range[0], dep.range[1] - 1, content);
 	}
diff --git a/lib/dependencies/ModuleHotAcceptDependency.js b/lib/dependencies/ModuleHotAcceptDependency.js
index 403f7f1a021..1916a7e2563 100644
--- a/lib/dependencies/ModuleHotAcceptDependency.js
+++ b/lib/dependencies/ModuleHotAcceptDependency.js
@@ -2,11 +2,20 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const makeSerializable = require("../util/makeSerializable");
 const ModuleDependency = require("./ModuleDependency");
 const ModuleDependencyTemplateAsId = require("./ModuleDependencyTemplateAsId");
 
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+
 class ModuleHotAcceptDependency extends ModuleDependency {
+	/**
+	 * @param {string} request the request string
+	 * @param {Range} range location in source code
+	 */
 	constructor(request, range) {
 		super(request);
 		this.range = range;
@@ -16,8 +25,17 @@ class ModuleHotAcceptDependency extends ModuleDependency {
 	get type() {
 		return "module.hot.accept";
 	}
+
+	get category() {
+		return "commonjs";
+	}
 }
 
+makeSerializable(
+	ModuleHotAcceptDependency,
+	"webpack/lib/dependencies/ModuleHotAcceptDependency"
+);
+
 ModuleHotAcceptDependency.Template = ModuleDependencyTemplateAsId;
 
 module.exports = ModuleHotAcceptDependency;
diff --git a/lib/dependencies/ModuleHotDeclineDependency.js b/lib/dependencies/ModuleHotDeclineDependency.js
index 49bf0af98c0..70423774b4e 100644
--- a/lib/dependencies/ModuleHotDeclineDependency.js
+++ b/lib/dependencies/ModuleHotDeclineDependency.js
@@ -2,13 +2,23 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const makeSerializable = require("../util/makeSerializable");
 const ModuleDependency = require("./ModuleDependency");
 const ModuleDependencyTemplateAsId = require("./ModuleDependencyTemplateAsId");
 
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+
 class ModuleHotDeclineDependency extends ModuleDependency {
+	/**
+	 * @param {string} request the request string
+	 * @param {Range} range location in source code
+	 */
 	constructor(request, range) {
 		super(request);
+
 		this.range = range;
 		this.weak = true;
 	}
@@ -16,8 +26,17 @@ class ModuleHotDeclineDependency extends ModuleDependency {
 	get type() {
 		return "module.hot.decline";
 	}
+
+	get category() {
+		return "commonjs";
+	}
 }
 
+makeSerializable(
+	ModuleHotDeclineDependency,
+	"webpack/lib/dependencies/ModuleHotDeclineDependency"
+);
+
 ModuleHotDeclineDependency.Template = ModuleDependencyTemplateAsId;
 
 module.exports = ModuleHotDeclineDependency;
diff --git a/lib/dependencies/MultiEntryDependency.js b/lib/dependencies/MultiEntryDependency.js
deleted file mode 100644
index 712d3ff1f22..00000000000
--- a/lib/dependencies/MultiEntryDependency.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-/** @typedef {import("./SingleEntryDependency")} SingleEntryDependency */
-const Dependency = require("../Dependency");
-
-class MultiEntryDependency extends Dependency {
-	/**
-	 * @param {SingleEntryDependency[]} dependencies an array of SingleEntryDependencies
-	 * @param {string} name entry name
-	 */
-	constructor(dependencies, name) {
-		super();
-		this.dependencies = dependencies;
-		this.name = name;
-	}
-
-	get type() {
-		return "multi entry";
-	}
-}
-
-module.exports = MultiEntryDependency;
diff --git a/lib/dependencies/NullDependency.js b/lib/dependencies/NullDependency.js
index 585f5fc0c84..c22cafc7c7a 100644
--- a/lib/dependencies/NullDependency.js
+++ b/lib/dependencies/NullDependency.js
@@ -2,19 +2,39 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
 const Dependency = require("../Dependency");
+const DependencyTemplate = require("../DependencyTemplate");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency").TRANSITIVE} TRANSITIVE */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
 
 class NullDependency extends Dependency {
 	get type() {
 		return "null";
 	}
 
-	updateHash() {}
+	/**
+	 * @returns {boolean | TRANSITIVE} true, when changes to the referenced module could affect the referencing module; TRANSITIVE, when changes to the referenced module could affect referencing modules of the referencing module
+	 */
+	couldAffectReferencingModule() {
+		return false;
+	}
 }
 
-NullDependency.Template = class NullDependencyTemplate {
-	apply() {}
+NullDependency.Template = class NullDependencyTemplate extends (
+	DependencyTemplate
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, templateContext) {}
 };
 
 module.exports = NullDependency;
diff --git a/lib/dependencies/PrefetchDependency.js b/lib/dependencies/PrefetchDependency.js
index 7107d83c15a..59e22c59a79 100644
--- a/lib/dependencies/PrefetchDependency.js
+++ b/lib/dependencies/PrefetchDependency.js
@@ -2,10 +2,15 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
 const ModuleDependency = require("./ModuleDependency");
 
 class PrefetchDependency extends ModuleDependency {
+	/**
+	 * @param {string} request the request string
+	 */
 	constructor(request) {
 		super(request);
 	}
@@ -13,6 +18,10 @@ class PrefetchDependency extends ModuleDependency {
 	get type() {
 		return "prefetch";
 	}
+
+	get category() {
+		return "esm";
+	}
 }
 
 module.exports = PrefetchDependency;
diff --git a/lib/dependencies/ProvidedDependency.js b/lib/dependencies/ProvidedDependency.js
new file mode 100644
index 00000000000..9f1d3f6e7dc
--- /dev/null
+++ b/lib/dependencies/ProvidedDependency.js
@@ -0,0 +1,157 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Florent Cailhol @ooflorent
+*/
+
+"use strict";
+
+const Dependency = require("../Dependency");
+const InitFragment = require("../InitFragment");
+const makeSerializable = require("../util/makeSerializable");
+const ModuleDependency = require("./ModuleDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../DependencyTemplates")} DependencyTemplates */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */
+/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+
+/**
+ * @param {string[]|null} path the property path array
+ * @returns {string} the converted path
+ */
+const pathToString = path =>
+	path !== null && path.length > 0
+		? path.map(part => `[${JSON.stringify(part)}]`).join("")
+		: "";
+
+class ProvidedDependency extends ModuleDependency {
+	/**
+	 * @param {string} request request
+	 * @param {string} identifier identifier
+	 * @param {string[]} ids ids
+	 * @param {Range} range range
+	 */
+	constructor(request, identifier, ids, range) {
+		super(request);
+		this.identifier = identifier;
+		this.ids = ids;
+		this.range = range;
+		this._hashUpdate = undefined;
+	}
+
+	get type() {
+		return "provided";
+	}
+
+	get category() {
+		return "esm";
+	}
+
+	/**
+	 * Returns list of exports referenced by this dependency
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @param {RuntimeSpec} runtime the runtime for which the module is analysed
+	 * @returns {(string[] | ReferencedExport)[]} referenced exports
+	 */
+	getReferencedExports(moduleGraph, runtime) {
+		const ids = this.ids;
+		if (ids.length === 0) return Dependency.EXPORTS_OBJECT_REFERENCED;
+		return [ids];
+	}
+
+	/**
+	 * Update the hash
+	 * @param {Hash} hash hash to be updated
+	 * @param {UpdateHashContext} context context
+	 * @returns {void}
+	 */
+	updateHash(hash, context) {
+		if (this._hashUpdate === undefined) {
+			this._hashUpdate = this.identifier + (this.ids ? this.ids.join(",") : "");
+		}
+		hash.update(this._hashUpdate);
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.identifier);
+		write(this.ids);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.identifier = read();
+		this.ids = read();
+		super.deserialize(context);
+	}
+}
+
+makeSerializable(
+	ProvidedDependency,
+	"webpack/lib/dependencies/ProvidedDependency"
+);
+
+class ProvidedDependencyTemplate extends ModuleDependency.Template {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(
+		dependency,
+		source,
+		{
+			runtime,
+			runtimeTemplate,
+			moduleGraph,
+			chunkGraph,
+			initFragments,
+			runtimeRequirements
+		}
+	) {
+		const dep = /** @type {ProvidedDependency} */ (dependency);
+		const connection =
+			/** @type {ModuleGraphConnection} */
+			(moduleGraph.getConnection(dep));
+		const exportsInfo = moduleGraph.getExportsInfo(connection.module);
+		const usedName = exportsInfo.getUsedName(dep.ids, runtime);
+		initFragments.push(
+			new InitFragment(
+				`/* provided dependency */ var ${
+					dep.identifier
+				} = ${runtimeTemplate.moduleExports({
+					module: moduleGraph.getModule(dep),
+					chunkGraph,
+					request: dep.request,
+					runtimeRequirements
+				})}${pathToString(/** @type {string[]} */ (usedName))};\n`,
+				InitFragment.STAGE_PROVIDES,
+				1,
+				`provided ${dep.identifier}`
+			)
+		);
+		source.replace(dep.range[0], dep.range[1] - 1, dep.identifier);
+	}
+}
+
+ProvidedDependency.Template = ProvidedDependencyTemplate;
+
+module.exports = ProvidedDependency;
diff --git a/lib/dependencies/PureExpressionDependency.js b/lib/dependencies/PureExpressionDependency.js
new file mode 100644
index 00000000000..3c4312c9847
--- /dev/null
+++ b/lib/dependencies/PureExpressionDependency.js
@@ -0,0 +1,162 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { UsageState } = require("../ExportsInfo");
+const makeSerializable = require("../util/makeSerializable");
+const { filterRuntime, runtimeToString } = require("../util/runtime");
+const NullDependency = require("./NullDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").RuntimeSpec} RuntimeSpec */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../ModuleGraphConnection").ConnectionState} ConnectionState */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+
+class PureExpressionDependency extends NullDependency {
+	/**
+	 * @param {Range} range the source range
+	 */
+	constructor(range) {
+		super();
+		this.range = range;
+		/** @type {Set | false} */
+		this.usedByExports = false;
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @param {RuntimeSpec} runtime current runtimes
+	 * @returns {boolean | RuntimeSpec} runtime condition
+	 */
+	_getRuntimeCondition(moduleGraph, runtime) {
+		const usedByExports = this.usedByExports;
+		if (usedByExports !== false) {
+			const selfModule =
+				/** @type {Module} */
+				(moduleGraph.getParentModule(this));
+			const exportsInfo = moduleGraph.getExportsInfo(selfModule);
+			const runtimeCondition = filterRuntime(runtime, runtime => {
+				for (const exportName of usedByExports) {
+					if (exportsInfo.getUsed(exportName, runtime) !== UsageState.Unused) {
+						return true;
+					}
+				}
+				return false;
+			});
+			return runtimeCondition;
+		}
+		return false;
+	}
+
+	/**
+	 * Update the hash
+	 * @param {Hash} hash hash to be updated
+	 * @param {UpdateHashContext} context context
+	 * @returns {void}
+	 */
+	updateHash(hash, context) {
+		const runtimeCondition = this._getRuntimeCondition(
+			context.chunkGraph.moduleGraph,
+			context.runtime
+		);
+		if (runtimeCondition === true) {
+			return;
+		} else if (runtimeCondition === false) {
+			hash.update("null");
+		} else {
+			hash.update(
+				`${runtimeToString(runtimeCondition)}|${runtimeToString(
+					context.runtime
+				)}`
+			);
+		}
+		hash.update(String(this.range));
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @returns {ConnectionState} how this dependency connects the module to referencing modules
+	 */
+	getModuleEvaluationSideEffectsState(moduleGraph) {
+		return false;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.range);
+		write(this.usedByExports);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.range = read();
+		this.usedByExports = read();
+		super.deserialize(context);
+	}
+}
+
+makeSerializable(
+	PureExpressionDependency,
+	"webpack/lib/dependencies/PureExpressionDependency"
+);
+
+PureExpressionDependency.Template = class PureExpressionDependencyTemplate extends (
+	NullDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(
+		dependency,
+		source,
+		{ chunkGraph, moduleGraph, runtime, runtimeTemplate, runtimeRequirements }
+	) {
+		const dep = /** @type {PureExpressionDependency} */ (dependency);
+		const runtimeCondition = dep._getRuntimeCondition(moduleGraph, runtime);
+		if (runtimeCondition === true) {
+			// Do nothing
+		} else if (runtimeCondition === false) {
+			source.insert(
+				dep.range[0],
+				"(/* unused pure expression or super */ null && ("
+			);
+			source.insert(dep.range[1], "))");
+		} else {
+			const condition = runtimeTemplate.runtimeConditionExpression({
+				chunkGraph,
+				runtime,
+				runtimeCondition,
+				runtimeRequirements
+			});
+			source.insert(
+				dep.range[0],
+				`(/* runtime-dependent pure expression or super */ ${condition} ? (`
+			);
+			source.insert(dep.range[1], ") : null)");
+		}
+	}
+};
+
+module.exports = PureExpressionDependency;
diff --git a/lib/dependencies/RequireContextDependency.js b/lib/dependencies/RequireContextDependency.js
index fd2e728fb1c..87885a49870 100644
--- a/lib/dependencies/RequireContextDependency.js
+++ b/lib/dependencies/RequireContextDependency.js
@@ -2,13 +2,24 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const makeSerializable = require("../util/makeSerializable");
 const ContextDependency = require("./ContextDependency");
 const ModuleDependencyTemplateAsRequireId = require("./ModuleDependencyTemplateAsRequireId");
 
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("./ContextDependency").ContextDependencyOptions} ContextDependencyOptions */
+
 class RequireContextDependency extends ContextDependency {
+	/**
+	 * @param {ContextDependencyOptions} options options
+	 * @param {Range} range range
+	 */
 	constructor(options, range) {
 		super(options);
+
 		this.range = range;
 	}
 
@@ -17,6 +28,11 @@ class RequireContextDependency extends ContextDependency {
 	}
 }
 
+makeSerializable(
+	RequireContextDependency,
+	"webpack/lib/dependencies/RequireContextDependency"
+);
+
 RequireContextDependency.Template = ModuleDependencyTemplateAsRequireId;
 
 module.exports = RequireContextDependency;
diff --git a/lib/dependencies/RequireContextDependencyParserPlugin.js b/lib/dependencies/RequireContextDependencyParserPlugin.js
index 1071fc01dc2..9f794ba6dbc 100644
--- a/lib/dependencies/RequireContextDependencyParserPlugin.js
+++ b/lib/dependencies/RequireContextDependencyParserPlugin.js
@@ -2,55 +2,68 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const RequireContextDependency = require("./RequireContextDependency");
 
+/** @typedef {import("../ContextModule").ContextMode} ContextMode */
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+
+const PLUGIN_NAME = "RequireContextDependencyParserPlugin";
+
 module.exports = class RequireContextDependencyParserPlugin {
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @returns {void}
+	 */
 	apply(parser) {
-		parser.hooks.call
-			.for("require.context")
-			.tap("RequireContextDependencyParserPlugin", expr => {
-				let regExp = /^\.\/.*$/;
-				let recursive = true;
-				let mode = "sync";
-				switch (expr.arguments.length) {
-					case 4: {
-						const modeExpr = parser.evaluateExpression(expr.arguments[3]);
-						if (!modeExpr.isString()) return;
-						mode = modeExpr.string;
-					}
-					// falls through
-					case 3: {
-						const regExpExpr = parser.evaluateExpression(expr.arguments[2]);
-						if (!regExpExpr.isRegExp()) return;
-						regExp = regExpExpr.regExp;
-					}
-					// falls through
-					case 2: {
-						const recursiveExpr = parser.evaluateExpression(expr.arguments[1]);
-						if (!recursiveExpr.isBoolean()) return;
-						recursive = recursiveExpr.bool;
-					}
-					// falls through
-					case 1: {
-						const requestExpr = parser.evaluateExpression(expr.arguments[0]);
-						if (!requestExpr.isString()) return;
-						const dep = new RequireContextDependency(
-							{
-								request: requestExpr.string,
-								recursive,
-								regExp,
-								mode
-							},
-							expr.range
-						);
-						dep.loc = expr.loc;
-						dep.optional = parser.scope.inTry;
-						parser.state.current.addDependency(dep);
-						return true;
-					}
+		parser.hooks.call.for("require.context").tap(PLUGIN_NAME, expr => {
+			let regExp = /^\.\/.*$/;
+			let recursive = true;
+			/** @type {ContextMode} */
+			let mode = "sync";
+			switch (expr.arguments.length) {
+				case 4: {
+					const modeExpr = parser.evaluateExpression(expr.arguments[3]);
+					if (!modeExpr.isString()) return;
+					mode = /** @type {ContextMode} */ (modeExpr.string);
+				}
+				// falls through
+				case 3: {
+					const regExpExpr = parser.evaluateExpression(expr.arguments[2]);
+					if (!regExpExpr.isRegExp()) return;
+					regExp = /** @type {RegExp} */ (regExpExpr.regExp);
+				}
+				// falls through
+				case 2: {
+					const recursiveExpr = parser.evaluateExpression(expr.arguments[1]);
+					if (!recursiveExpr.isBoolean()) return;
+					recursive = /** @type {boolean} */ (recursiveExpr.bool);
+				}
+				// falls through
+				case 1: {
+					const requestExpr = parser.evaluateExpression(expr.arguments[0]);
+					if (!requestExpr.isString()) return;
+					const dep = new RequireContextDependency(
+						{
+							request: /** @type {string} */ (requestExpr.string),
+							recursive,
+							regExp,
+							mode,
+							category: "commonjs"
+						},
+						/** @type {Range} */
+						(expr.range)
+					);
+					dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+					dep.optional = Boolean(parser.scope.inTry);
+					parser.state.current.addDependency(dep);
+					return true;
 				}
-			});
+			}
+		});
 	}
 };
diff --git a/lib/dependencies/RequireContextPlugin.js b/lib/dependencies/RequireContextPlugin.js
index 4e44e87117a..5add053d062 100644
--- a/lib/dependencies/RequireContextPlugin.js
+++ b/lib/dependencies/RequireContextPlugin.js
@@ -2,29 +2,37 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const RequireContextDependency = require("./RequireContextDependency");
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_DYNAMIC
+} = require("../ModuleTypeConstants");
+const { cachedSetProperty } = require("../util/cleverMerge");
 const ContextElementDependency = require("./ContextElementDependency");
-
+const RequireContextDependency = require("./RequireContextDependency");
 const RequireContextDependencyParserPlugin = require("./RequireContextDependencyParserPlugin");
 
-class RequireContextPlugin {
-	constructor(modulesDirectories, extensions, mainFiles) {
-		if (!Array.isArray(modulesDirectories)) {
-			throw new Error("modulesDirectories must be an array");
-		}
-		if (!Array.isArray(extensions)) {
-			throw new Error("extensions must be an array");
-		}
-		this.modulesDirectories = modulesDirectories;
-		this.extensions = extensions;
-		this.mainFiles = mainFiles;
-	}
+/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
+/** @typedef {import("../../declarations/WebpackOptions").ResolveOptions} ResolveOptions */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../javascript/JavascriptParser")} Parser */
 
+/** @type {ResolveOptions} */
+const EMPTY_RESOLVE_OPTIONS = {};
+
+const PLUGIN_NAME = "RequireContextPlugin";
+
+class RequireContextPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		compiler.hooks.compilation.tap(
-			"RequireContextPlugin",
+			PLUGIN_NAME,
 			(compilation, { contextModuleFactory, normalModuleFactory }) => {
 				compilation.dependencyFactories.set(
 					RequireContextDependency,
@@ -40,6 +48,11 @@ class RequireContextPlugin {
 					normalModuleFactory
 				);
 
+				/**
+				 * @param {Parser} parser parser parser
+				 * @param {JavascriptParserOptions} parserOptions parserOptions
+				 * @returns {void}
+				 */
 				const handler = (parser, parserOptions) => {
 					if (
 						parserOptions.requireContext !== undefined &&
@@ -51,89 +64,97 @@ class RequireContextPlugin {
 				};
 
 				normalModuleFactory.hooks.parser
-					.for("javascript/auto")
-					.tap("RequireContextPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, handler);
 				normalModuleFactory.hooks.parser
-					.for("javascript/dynamic")
-					.tap("RequireContextPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
+					.tap(PLUGIN_NAME, handler);
 
-				contextModuleFactory.hooks.alternatives.tap(
-					"RequireContextPlugin",
-					items => {
+				contextModuleFactory.hooks.alternativeRequests.tap(
+					PLUGIN_NAME,
+					(items, options) => {
 						if (items.length === 0) return items;
-						return items
-							.map(obj => {
-								return this.extensions
-									.filter(ext => {
-										const l = obj.request.length;
-										return (
-											l > ext.length &&
-											obj.request.substr(l - ext.length, l) === ext
-										);
-									})
-									.map(ext => {
-										const l = obj.request.length;
-										return {
-											context: obj.context,
-											request: obj.request.substr(0, l - ext.length)
-										};
-									})
-									.concat(obj);
-							})
-							.reduce((a, b) => a.concat(b), []);
-					}
-				);
 
-				contextModuleFactory.hooks.alternatives.tap(
-					"RequireContextPlugin",
-					items => {
-						if (items.length === 0) return items;
-						return items
-							.map(obj => {
-								return this.mainFiles
-									.filter(mainFile => {
-										const l = obj.request.length;
-										return (
-											l > mainFile.length + 1 &&
-											obj.request.substr(l - mainFile.length - 1, l) ===
-												"/" + mainFile
-										);
-									})
-									.map(mainFile => {
-										const l = obj.request.length;
-										return [
-											{
-												context: obj.context,
-												request: obj.request.substr(0, l - mainFile.length)
-											},
-											{
-												context: obj.context,
-												request: obj.request.substr(0, l - mainFile.length - 1)
-											}
-										];
-									})
-									.reduce((a, b) => a.concat(b), [])
-									.concat(obj);
-							})
-							.reduce((a, b) => a.concat(b), []);
-					}
-				);
+						const finalResolveOptions = compiler.resolverFactory.get(
+							"normal",
+							cachedSetProperty(
+								options.resolveOptions || EMPTY_RESOLVE_OPTIONS,
+								"dependencyType",
+								/** @type {string} */
+								(options.category)
+							)
+						).options;
 
-				contextModuleFactory.hooks.alternatives.tap(
-					"RequireContextPlugin",
-					items => {
-						if (items.length === 0) return items;
-						return items.map(obj => {
-							for (let i = 0; i < this.modulesDirectories.length; i++) {
-								const dir = this.modulesDirectories[i];
-								const idx = obj.request.indexOf("./" + dir + "/");
-								if (idx === 0) {
-									obj.request = obj.request.slice(dir.length + 3);
-									break;
+						let newItems;
+						if (!finalResolveOptions.fullySpecified) {
+							newItems = [];
+							for (const item of items) {
+								const { request, context } = item;
+								for (const ext of finalResolveOptions.extensions) {
+									if (request.endsWith(ext)) {
+										newItems.push({
+											context,
+											request: request.slice(0, -ext.length)
+										});
+									}
 								}
+								if (!finalResolveOptions.enforceExtension) {
+									newItems.push(item);
+								}
+							}
+							items = newItems;
+
+							newItems = [];
+							for (const obj of items) {
+								const { request, context } = obj;
+								for (const mainFile of finalResolveOptions.mainFiles) {
+									if (request.endsWith(`/${mainFile}`)) {
+										newItems.push({
+											context,
+											request: request.slice(0, -mainFile.length)
+										});
+										newItems.push({
+											context,
+											request: request.slice(0, -mainFile.length - 1)
+										});
+									}
+								}
+								newItems.push(obj);
+							}
+							items = newItems;
+						}
+
+						newItems = [];
+						for (const item of items) {
+							let hideOriginal = false;
+							for (const modulesItems of finalResolveOptions.modules) {
+								if (Array.isArray(modulesItems)) {
+									for (const dir of modulesItems) {
+										if (item.request.startsWith(`./${dir}/`)) {
+											newItems.push({
+												context: item.context,
+												request: item.request.slice(dir.length + 3)
+											});
+											hideOriginal = true;
+										}
+									}
+								} else {
+									const dir = modulesItems.replace(/\\/g, "/");
+									const fullPath =
+										item.context.replace(/\\/g, "/") + item.request.slice(1);
+									if (fullPath.startsWith(dir)) {
+										newItems.push({
+											context: item.context,
+											request: fullPath.slice(dir.length + 1)
+										});
+									}
+								}
+							}
+							if (!hideOriginal) {
+								newItems.push(item);
 							}
-							return obj;
-						});
+						}
+						return newItems;
 					}
 				);
 			}
diff --git a/lib/dependencies/RequireEnsureDependenciesBlock.js b/lib/dependencies/RequireEnsureDependenciesBlock.js
index 2a5dde704de..da36d8546dd 100644
--- a/lib/dependencies/RequireEnsureDependenciesBlock.js
+++ b/lib/dependencies/RequireEnsureDependenciesBlock.js
@@ -2,32 +2,29 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
 const AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
-const RequireEnsureDependency = require("./RequireEnsureDependency");
+const makeSerializable = require("../util/makeSerializable");
+
+/** @typedef {import("../AsyncDependenciesBlock").GroupOptions} GroupOptions */
+/** @typedef {import("../ChunkGroup").ChunkGroupOptions} ChunkGroupOptions */
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
 
-module.exports = class RequireEnsureDependenciesBlock extends AsyncDependenciesBlock {
-	constructor(
-		expr,
-		successExpression,
-		errorExpression,
-		chunkName,
-		chunkNameRange,
-		module,
-		loc
-	) {
-		super(chunkName, module, loc, null);
-		this.expr = expr;
-		const successBodyRange =
-			successExpression &&
-			successExpression.body &&
-			successExpression.body.range;
-		if (successBodyRange) {
-			this.range = [successBodyRange[0] + 1, successBodyRange[1] - 1];
-		}
-		this.chunkNameRange = chunkNameRange;
-		const dep = new RequireEnsureDependency(this);
-		dep.loc = loc;
-		this.addDependency(dep);
+class RequireEnsureDependenciesBlock extends AsyncDependenciesBlock {
+	/**
+	 * @param {GroupOptions | null} chunkName chunk name
+	 * @param {(DependencyLocation | null)=} loc location info
+	 */
+	constructor(chunkName, loc) {
+		super(chunkName, loc, null);
 	}
-};
+}
+
+makeSerializable(
+	RequireEnsureDependenciesBlock,
+	"webpack/lib/dependencies/RequireEnsureDependenciesBlock"
+);
+
+module.exports = RequireEnsureDependenciesBlock;
diff --git a/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js b/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js
index 213eaac0a92..7455031117c 100644
--- a/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js
+++ b/lib/dependencies/RequireEnsureDependenciesBlockParserPlugin.js
@@ -2,115 +2,137 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const RequireEnsureDependenciesBlock = require("./RequireEnsureDependenciesBlock");
+const RequireEnsureDependency = require("./RequireEnsureDependency");
 const RequireEnsureItemDependency = require("./RequireEnsureItemDependency");
 const getFunctionExpression = require("./getFunctionExpression");
 
+/** @typedef {import("../AsyncDependenciesBlock").GroupOptions} GroupOptions */
+/** @typedef {import("../ChunkGroup").ChunkGroupOptions} ChunkGroupOptions */
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("../javascript/BasicEvaluatedExpression")} BasicEvaluatedExpression */
+/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+
+const PLUGIN_NAME = "RequireEnsureDependenciesBlockParserPlugin";
+
 module.exports = class RequireEnsureDependenciesBlockParserPlugin {
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @returns {void}
+	 */
 	apply(parser) {
-		parser.hooks.call
-			.for("require.ensure")
-			.tap("RequireEnsureDependenciesBlockParserPlugin", expr => {
-				let chunkName = null;
-				let chunkNameRange = null;
-				let errorExpressionArg = null;
-				let errorExpression = null;
-				switch (expr.arguments.length) {
-					case 4: {
-						const chunkNameExpr = parser.evaluateExpression(expr.arguments[3]);
-						if (!chunkNameExpr.isString()) return;
-						chunkNameRange = chunkNameExpr.range;
-						chunkName = chunkNameExpr.string;
-					}
-					// falls through
-					case 3: {
-						errorExpressionArg = expr.arguments[2];
-						errorExpression = getFunctionExpression(errorExpressionArg);
+		parser.hooks.call.for("require.ensure").tap(PLUGIN_NAME, expr => {
+			/** @type {string | GroupOptions | null} */
+			let chunkName = null;
+			let errorExpressionArg = null;
+			let errorExpression = null;
+			switch (expr.arguments.length) {
+				case 4: {
+					const chunkNameExpr = parser.evaluateExpression(expr.arguments[3]);
+					if (!chunkNameExpr.isString()) return;
+					chunkName =
+						/** @type {string} */
+						(chunkNameExpr.string);
+				}
+				// falls through
+				case 3: {
+					errorExpressionArg = expr.arguments[2];
+					errorExpression = getFunctionExpression(errorExpressionArg);
 
-						if (!errorExpression && !chunkName) {
-							const chunkNameExpr = parser.evaluateExpression(
-								expr.arguments[2]
-							);
-							if (!chunkNameExpr.isString()) return;
-							chunkNameRange = chunkNameExpr.range;
-							chunkName = chunkNameExpr.string;
-						}
+					if (!errorExpression && !chunkName) {
+						const chunkNameExpr = parser.evaluateExpression(expr.arguments[2]);
+						if (!chunkNameExpr.isString()) return;
+						chunkName =
+							/** @type {string} */
+							(chunkNameExpr.string);
 					}
-					// falls through
-					case 2: {
-						const dependenciesExpr = parser.evaluateExpression(
-							expr.arguments[0]
-						);
-						const dependenciesItems = dependenciesExpr.isArray()
+				}
+				// falls through
+				case 2: {
+					const dependenciesExpr = parser.evaluateExpression(expr.arguments[0]);
+					const dependenciesItems = /** @type {BasicEvaluatedExpression[]} */ (
+						dependenciesExpr.isArray()
 							? dependenciesExpr.items
-							: [dependenciesExpr];
-						const successExpressionArg = expr.arguments[1];
-						const successExpression = getFunctionExpression(
-							successExpressionArg
-						);
+							: [dependenciesExpr]
+					);
+					const successExpressionArg = expr.arguments[1];
+					const successExpression = getFunctionExpression(successExpressionArg);
 
-						if (successExpression) {
-							parser.walkExpressions(successExpression.expressions);
-						}
-						if (errorExpression) {
-							parser.walkExpressions(errorExpression.expressions);
-						}
+					if (successExpression) {
+						parser.walkExpressions(successExpression.expressions);
+					}
+					if (errorExpression) {
+						parser.walkExpressions(errorExpression.expressions);
+					}
 
-						const dep = new RequireEnsureDependenciesBlock(
-							expr,
-							successExpression ? successExpression.fn : successExpressionArg,
-							errorExpression ? errorExpression.fn : errorExpressionArg,
-							chunkName,
-							chunkNameRange,
-							parser.state.module,
-							expr.loc
-						);
-						const old = parser.state.current;
-						parser.state.current = dep;
-						try {
-							let failed = false;
-							parser.inScope([], () => {
-								for (const ee of dependenciesItems) {
-									if (ee.isString()) {
-										const edep = new RequireEnsureItemDependency(ee.string);
-										edep.loc = dep.loc;
-										dep.addDependency(edep);
-									} else {
-										failed = true;
-									}
-								}
-							});
-							if (failed) {
-								return;
-							}
-							if (successExpression) {
-								if (successExpression.fn.body.type === "BlockStatement") {
-									parser.walkStatement(successExpression.fn.body);
+					const depBlock = new RequireEnsureDependenciesBlock(
+						chunkName,
+						/** @type {DependencyLocation} */
+						(expr.loc)
+					);
+					const errorCallbackExists =
+						expr.arguments.length === 4 ||
+						(!chunkName && expr.arguments.length === 3);
+					const dep = new RequireEnsureDependency(
+						/** @type {Range} */ (expr.range),
+						/** @type {Range} */ (expr.arguments[1].range),
+						errorCallbackExists &&
+							/** @type {Range} */ (expr.arguments[2].range)
+					);
+					dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+					depBlock.addDependency(dep);
+					const old = parser.state.current;
+					parser.state.current = /** @type {TODO} */ (depBlock);
+					try {
+						let failed = false;
+						parser.inScope([], () => {
+							for (const ee of dependenciesItems) {
+								if (ee.isString()) {
+									const ensureDependency = new RequireEnsureItemDependency(
+										/** @type {string} */ (ee.string)
+									);
+									ensureDependency.loc =
+										/** @type {DependencyLocation} */
+										(expr.loc);
+									depBlock.addDependency(ensureDependency);
 								} else {
-									parser.walkExpression(successExpression.fn.body);
+									failed = true;
 								}
 							}
-							old.addBlock(dep);
-						} finally {
-							parser.state.current = old;
+						});
+						if (failed) {
+							return;
 						}
-						if (!successExpression) {
-							parser.walkExpression(successExpressionArg);
-						}
-						if (errorExpression) {
-							if (errorExpression.fn.body.type === "BlockStatement") {
-								parser.walkStatement(errorExpression.fn.body);
+						if (successExpression) {
+							if (successExpression.fn.body.type === "BlockStatement") {
+								parser.walkStatement(successExpression.fn.body);
 							} else {
-								parser.walkExpression(errorExpression.fn.body);
+								parser.walkExpression(successExpression.fn.body);
 							}
-						} else if (errorExpressionArg) {
-							parser.walkExpression(errorExpressionArg);
 						}
-						return true;
+						old.addBlock(depBlock);
+					} finally {
+						parser.state.current = old;
+					}
+					if (!successExpression) {
+						parser.walkExpression(successExpressionArg);
+					}
+					if (errorExpression) {
+						if (errorExpression.fn.body.type === "BlockStatement") {
+							parser.walkStatement(errorExpression.fn.body);
+						} else {
+							parser.walkExpression(errorExpression.fn.body);
+						}
+					} else if (errorExpressionArg) {
+						parser.walkExpression(errorExpressionArg);
 					}
+					return true;
 				}
-			});
+			}
+		});
 	}
 };
diff --git a/lib/dependencies/RequireEnsureDependency.js b/lib/dependencies/RequireEnsureDependency.js
index 84013051989..4fcec7731ce 100644
--- a/lib/dependencies/RequireEnsureDependency.js
+++ b/lib/dependencies/RequireEnsureDependency.js
@@ -2,54 +2,111 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const makeSerializable = require("../util/makeSerializable");
 const NullDependency = require("./NullDependency");
 
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../AsyncDependenciesBlock")} AsyncDependenciesBlock */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
 class RequireEnsureDependency extends NullDependency {
-	constructor(block) {
+	/**
+	 * @param {Range} range range
+	 * @param {Range} contentRange content range
+	 * @param {Range | false} errorHandlerRange error handler range
+	 */
+	constructor(range, contentRange, errorHandlerRange) {
 		super();
-		this.block = block;
+
+		this.range = range;
+		this.contentRange = contentRange;
+		this.errorHandlerRange = errorHandlerRange;
 	}
 
 	get type() {
 		return "require.ensure";
 	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+
+		write(this.range);
+		write(this.contentRange);
+		write(this.errorHandlerRange);
+
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+
+		this.range = read();
+		this.contentRange = read();
+		this.errorHandlerRange = read();
+
+		super.deserialize(context);
+	}
 }
 
-RequireEnsureDependency.Template = class RequireEnsureDependencyTemplate {
-	apply(dep, source, runtime) {
-		const depBlock = dep.block;
-		const promise = runtime.blockPromise({
+makeSerializable(
+	RequireEnsureDependency,
+	"webpack/lib/dependencies/RequireEnsureDependency"
+);
+
+RequireEnsureDependency.Template = class RequireEnsureDependencyTemplate extends (
+	NullDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(
+		dependency,
+		source,
+		{ runtimeTemplate, moduleGraph, chunkGraph, runtimeRequirements }
+	) {
+		const dep = /** @type {RequireEnsureDependency} */ (dependency);
+		const depBlock = /** @type {AsyncDependenciesBlock} */ (
+			moduleGraph.getParentBlock(dep)
+		);
+		const promise = runtimeTemplate.blockPromise({
+			chunkGraph,
 			block: depBlock,
-			message: "require.ensure"
+			message: "require.ensure",
+			runtimeRequirements
 		});
-		const errorCallbackExists =
-			depBlock.expr.arguments.length === 4 ||
-			(!depBlock.chunkName && depBlock.expr.arguments.length === 3);
-		const startBlock = `${promise}.then((`;
-		const middleBlock = ").bind(null, __webpack_require__)).catch(";
-		const endBlock = `).bind(null, __webpack_require__)).catch(${runtime.onError()})`;
-		source.replace(
-			depBlock.expr.range[0],
-			depBlock.expr.arguments[1].range[0] - 1,
-			startBlock
-		);
-		if (errorCallbackExists) {
-			source.replace(
-				depBlock.expr.arguments[1].range[1],
-				depBlock.expr.arguments[2].range[0] - 1,
-				middleBlock
-			);
+		const range = dep.range;
+		const contentRange = dep.contentRange;
+		const errorHandlerRange = dep.errorHandlerRange;
+		source.replace(range[0], contentRange[0] - 1, `${promise}.then((`);
+		if (errorHandlerRange) {
 			source.replace(
-				depBlock.expr.arguments[2].range[1],
-				depBlock.expr.range[1] - 1,
-				")"
+				contentRange[1],
+				errorHandlerRange[0] - 1,
+				`).bind(null, ${RuntimeGlobals.require}))['catch'](`
 			);
+			source.replace(errorHandlerRange[1], range[1] - 1, ")");
 		} else {
 			source.replace(
-				depBlock.expr.arguments[1].range[1],
-				depBlock.expr.range[1] - 1,
-				endBlock
+				contentRange[1],
+				range[1] - 1,
+				`).bind(null, ${RuntimeGlobals.require}))['catch'](${RuntimeGlobals.uncaughtErrorHandler})`
 			);
 		}
 	}
diff --git a/lib/dependencies/RequireEnsureItemDependency.js b/lib/dependencies/RequireEnsureItemDependency.js
index b4b620bf091..f9a465a55c9 100644
--- a/lib/dependencies/RequireEnsureItemDependency.js
+++ b/lib/dependencies/RequireEnsureItemDependency.js
@@ -2,11 +2,17 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const makeSerializable = require("../util/makeSerializable");
 const ModuleDependency = require("./ModuleDependency");
 const NullDependency = require("./NullDependency");
 
 class RequireEnsureItemDependency extends ModuleDependency {
+	/**
+	 * @param {string} request the request string
+	 */
 	constructor(request) {
 		super(request);
 	}
@@ -14,8 +20,17 @@ class RequireEnsureItemDependency extends ModuleDependency {
 	get type() {
 		return "require.ensure item";
 	}
+
+	get category() {
+		return "commonjs";
+	}
 }
 
+makeSerializable(
+	RequireEnsureItemDependency,
+	"webpack/lib/dependencies/RequireEnsureItemDependency"
+);
+
 RequireEnsureItemDependency.Template = NullDependency.Template;
 
 module.exports = RequireEnsureItemDependency;
diff --git a/lib/dependencies/RequireEnsurePlugin.js b/lib/dependencies/RequireEnsurePlugin.js
index c818e91bc1d..5a1dc31dbdd 100644
--- a/lib/dependencies/RequireEnsurePlugin.js
+++ b/lib/dependencies/RequireEnsurePlugin.js
@@ -2,21 +2,38 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const RequireEnsureItemDependency = require("./RequireEnsureItemDependency");
 const RequireEnsureDependency = require("./RequireEnsureDependency");
-
-const NullFactory = require("../NullFactory");
+const RequireEnsureItemDependency = require("./RequireEnsureItemDependency");
 
 const RequireEnsureDependenciesBlockParserPlugin = require("./RequireEnsureDependenciesBlockParserPlugin");
 
-const ParserHelpers = require("../ParserHelpers");
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_DYNAMIC
+} = require("../ModuleTypeConstants");
+const {
+	evaluateToString,
+	toConstantDependency
+} = require("../javascript/JavascriptParserHelpers");
+
+/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../javascript/JavascriptParser")} Parser */
+
+const PLUGIN_NAME = "RequireEnsurePlugin";
 
 class RequireEnsurePlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		compiler.hooks.compilation.tap(
-			"RequireEnsurePlugin",
+			PLUGIN_NAME,
 			(compilation, { normalModuleFactory }) => {
 				compilation.dependencyFactories.set(
 					RequireEnsureItemDependency,
@@ -27,15 +44,16 @@ class RequireEnsurePlugin {
 					new RequireEnsureItemDependency.Template()
 				);
 
-				compilation.dependencyFactories.set(
-					RequireEnsureDependency,
-					new NullFactory()
-				);
 				compilation.dependencyTemplates.set(
 					RequireEnsureDependency,
 					new RequireEnsureDependency.Template()
 				);
 
+				/**
+				 * @param {Parser} parser parser parser
+				 * @param {JavascriptParserOptions} parserOptions parserOptions
+				 * @returns {void}
+				 */
 				const handler = (parser, parserOptions) => {
 					if (
 						parserOptions.requireEnsure !== undefined &&
@@ -46,27 +64,21 @@ class RequireEnsurePlugin {
 					new RequireEnsureDependenciesBlockParserPlugin().apply(parser);
 					parser.hooks.evaluateTypeof
 						.for("require.ensure")
-						.tap(
-							"RequireEnsurePlugin",
-							ParserHelpers.evaluateToString("function")
-						);
+						.tap(PLUGIN_NAME, evaluateToString("function"));
 					parser.hooks.typeof
 						.for("require.ensure")
 						.tap(
-							"RequireEnsurePlugin",
-							ParserHelpers.toConstantDependency(
-								parser,
-								JSON.stringify("function")
-							)
+							PLUGIN_NAME,
+							toConstantDependency(parser, JSON.stringify("function"))
 						);
 				};
 
 				normalModuleFactory.hooks.parser
-					.for("javascript/auto")
-					.tap("RequireEnsurePlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, handler);
 				normalModuleFactory.hooks.parser
-					.for("javascript/dynamic")
-					.tap("RequireEnsurePlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
+					.tap(PLUGIN_NAME, handler);
 			}
 		);
 	}
diff --git a/lib/dependencies/RequireHeaderDependency.js b/lib/dependencies/RequireHeaderDependency.js
index 6dddd062392..7bf75603593 100644
--- a/lib/dependencies/RequireHeaderDependency.js
+++ b/lib/dependencies/RequireHeaderDependency.js
@@ -2,24 +2,68 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const makeSerializable = require("../util/makeSerializable");
 const NullDependency = require("./NullDependency");
 
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
 class RequireHeaderDependency extends NullDependency {
+	/**
+	 * @param {Range} range range
+	 */
 	constructor(range) {
 		super();
 		if (!Array.isArray(range)) throw new Error("range must be valid");
 		this.range = range;
 	}
-}
 
-RequireHeaderDependency.Template = class RequireHeaderDependencyTemplate {
-	apply(dep, source) {
-		source.replace(dep.range[0], dep.range[1] - 1, "__webpack_require__");
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.range);
+		super.serialize(context);
 	}
 
-	applyAsTemplateArgument(name, dep, source) {
-		source.replace(dep.range[0], dep.range[1] - 1, "require");
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 * @returns {RequireHeaderDependency} RequireHeaderDependency
+	 */
+	static deserialize(context) {
+		const obj = new RequireHeaderDependency(context.read());
+		obj.deserialize(context);
+		return obj;
+	}
+}
+
+makeSerializable(
+	RequireHeaderDependency,
+	"webpack/lib/dependencies/RequireHeaderDependency"
+);
+
+RequireHeaderDependency.Template = class RequireHeaderDependencyTemplate extends (
+	NullDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, { runtimeRequirements }) {
+		const dep = /** @type {RequireHeaderDependency} */ (dependency);
+		runtimeRequirements.add(RuntimeGlobals.require);
+		source.replace(dep.range[0], dep.range[1] - 1, RuntimeGlobals.require);
 	}
 };
 
diff --git a/lib/dependencies/RequireIncludeDependency.js b/lib/dependencies/RequireIncludeDependency.js
index 9eca576283f..3a25e84a8ff 100644
--- a/lib/dependencies/RequireIncludeDependency.js
+++ b/lib/dependencies/RequireIncludeDependency.js
@@ -2,36 +2,76 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const DependencyReference = require("./DependencyReference");
-const ModuleDependency = require("./ModuleDependency");
+const Dependency = require("../Dependency");
 const Template = require("../Template");
+const makeSerializable = require("../util/makeSerializable");
+const ModuleDependency = require("./ModuleDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
 
 class RequireIncludeDependency extends ModuleDependency {
+	/**
+	 * @param {string} request the request string
+	 * @param {Range} range location in source code
+	 */
 	constructor(request, range) {
 		super(request);
+
 		this.range = range;
 	}
 
-	getReference() {
-		if (!this.module) return null;
+	/**
+	 * Returns list of exports referenced by this dependency
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @param {RuntimeSpec} runtime the runtime for which the module is analysed
+	 * @returns {(string[] | ReferencedExport)[]} referenced exports
+	 */
+	getReferencedExports(moduleGraph, runtime) {
 		// This doesn't use any export
-		return new DependencyReference(this.module, [], false);
+		return Dependency.NO_EXPORTS_REFERENCED;
 	}
 
 	get type() {
 		return "require.include";
 	}
+
+	get category() {
+		return "commonjs";
+	}
 }
 
-RequireIncludeDependency.Template = class RequireIncludeDependencyTemplate {
-	apply(dep, source, runtime) {
-		const comment = runtime.outputOptions.pathinfo
+makeSerializable(
+	RequireIncludeDependency,
+	"webpack/lib/dependencies/RequireIncludeDependency"
+);
+
+RequireIncludeDependency.Template = class RequireIncludeDependencyTemplate extends (
+	ModuleDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, { runtimeTemplate }) {
+		const dep = /** @type {RequireIncludeDependency} */ (dependency);
+		const comment = runtimeTemplate.outputOptions.pathinfo
 			? Template.toComment(
-					`require.include ${runtime.requestShortener.shorten(dep.request)}`
-			  )
+					`require.include ${runtimeTemplate.requestShortener.shorten(
+						dep.request
+					)}`
+				)
 			: "";
+
 		source.replace(dep.range[0], dep.range[1] - 1, `undefined${comment}`);
 	}
 };
diff --git a/lib/dependencies/RequireIncludeDependencyParserPlugin.js b/lib/dependencies/RequireIncludeDependencyParserPlugin.js
index 117e204514c..7b9de2c9324 100644
--- a/lib/dependencies/RequireIncludeDependencyParserPlugin.js
+++ b/lib/dependencies/RequireIncludeDependencyParserPlugin.js
@@ -2,22 +2,100 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const WebpackError = require("../WebpackError");
+const {
+	evaluateToString,
+	toConstantDependency
+} = require("../javascript/JavascriptParserHelpers");
+const makeSerializable = require("../util/makeSerializable");
 const RequireIncludeDependency = require("./RequireIncludeDependency");
 
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+
 module.exports = class RequireIncludeDependencyParserPlugin {
+	/**
+	 * @param {boolean} warn true: warn about deprecation, false: don't warn
+	 */
+	constructor(warn) {
+		this.warn = warn;
+	}
+
+	/**
+	 * @param {JavascriptParser} parser the parser
+	 * @returns {void}
+	 */
 	apply(parser) {
+		const { warn } = this;
 		parser.hooks.call
 			.for("require.include")
 			.tap("RequireIncludeDependencyParserPlugin", expr => {
 				if (expr.arguments.length !== 1) return;
 				const param = parser.evaluateExpression(expr.arguments[0]);
 				if (!param.isString()) return;
-				const dep = new RequireIncludeDependency(param.string, expr.range);
-				dep.loc = expr.loc;
+
+				if (warn) {
+					parser.state.module.addWarning(
+						new RequireIncludeDeprecationWarning(
+							/** @type {DependencyLocation} */ (expr.loc)
+						)
+					);
+				}
+
+				const dep = new RequireIncludeDependency(
+					/** @type {string} */ (param.string),
+					/** @type {Range} */ (expr.range)
+				);
+				dep.loc = /** @type {DependencyLocation} */ (expr.loc);
 				parser.state.current.addDependency(dep);
 				return true;
 			});
+		parser.hooks.evaluateTypeof
+			.for("require.include")
+			.tap("RequireIncludePlugin", expr => {
+				if (warn) {
+					parser.state.module.addWarning(
+						new RequireIncludeDeprecationWarning(
+							/** @type {DependencyLocation} */ (expr.loc)
+						)
+					);
+				}
+				return evaluateToString("function")(expr);
+			});
+		parser.hooks.typeof
+			.for("require.include")
+			.tap("RequireIncludePlugin", expr => {
+				if (warn) {
+					parser.state.module.addWarning(
+						new RequireIncludeDeprecationWarning(
+							/** @type {DependencyLocation} */ (expr.loc)
+						)
+					);
+				}
+				return toConstantDependency(parser, JSON.stringify("function"))(expr);
+			});
 	}
 };
+
+class RequireIncludeDeprecationWarning extends WebpackError {
+	/**
+	 * @param {DependencyLocation} loc location
+	 */
+	constructor(loc) {
+		super("require.include() is deprecated and will be removed soon.");
+
+		this.name = "RequireIncludeDeprecationWarning";
+
+		this.loc = loc;
+	}
+}
+
+makeSerializable(
+	RequireIncludeDeprecationWarning,
+	"webpack/lib/dependencies/RequireIncludeDependencyParserPlugin",
+	"RequireIncludeDeprecationWarning"
+);
diff --git a/lib/dependencies/RequireIncludePlugin.js b/lib/dependencies/RequireIncludePlugin.js
index e7d535bc3a0..af5bd0215fd 100644
--- a/lib/dependencies/RequireIncludePlugin.js
+++ b/lib/dependencies/RequireIncludePlugin.js
@@ -2,17 +2,31 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_DYNAMIC
+} = require("../ModuleTypeConstants");
 const RequireIncludeDependency = require("./RequireIncludeDependency");
 const RequireIncludeDependencyParserPlugin = require("./RequireIncludeDependencyParserPlugin");
 
-const ParserHelpers = require("../ParserHelpers");
+/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../javascript/JavascriptParser")} Parser */
+
+const PLUGIN_NAME = "RequireIncludePlugin";
 
 class RequireIncludePlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		compiler.hooks.compilation.tap(
-			"RequireIncludePlugin",
+			PLUGIN_NAME,
 			(compilation, { normalModuleFactory }) => {
 				compilation.dependencyFactories.set(
 					RequireIncludeDependency,
@@ -23,37 +37,24 @@ class RequireIncludePlugin {
 					new RequireIncludeDependency.Template()
 				);
 
+				/**
+				 * @param {Parser} parser parser parser
+				 * @param {JavascriptParserOptions} parserOptions parserOptions
+				 * @returns {void}
+				 */
 				const handler = (parser, parserOptions) => {
-					if (
-						parserOptions.requireInclude !== undefined &&
-						!parserOptions.requireInclude
-					)
-						return;
-
-					new RequireIncludeDependencyParserPlugin().apply(parser);
-					parser.hooks.evaluateTypeof
-						.for("require.include")
-						.tap(
-							"RequireIncludePlugin",
-							ParserHelpers.evaluateToString("function")
-						);
-					parser.hooks.typeof
-						.for("require.include")
-						.tap(
-							"RequireIncludePlugin",
-							ParserHelpers.toConstantDependency(
-								parser,
-								JSON.stringify("function")
-							)
-						);
+					if (parserOptions.requireInclude === false) return;
+					const warn = parserOptions.requireInclude === undefined;
+
+					new RequireIncludeDependencyParserPlugin(warn).apply(parser);
 				};
 
 				normalModuleFactory.hooks.parser
-					.for("javascript/auto")
-					.tap("RequireIncludePlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, handler);
 				normalModuleFactory.hooks.parser
-					.for("javascript/dynamic")
-					.tap("RequireIncludePlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
+					.tap(PLUGIN_NAME, handler);
 			}
 		);
 	}
diff --git a/lib/dependencies/RequireResolveContextDependency.js b/lib/dependencies/RequireResolveContextDependency.js
index cc40451c96e..5745be89016 100644
--- a/lib/dependencies/RequireResolveContextDependency.js
+++ b/lib/dependencies/RequireResolveContextDependency.js
@@ -2,13 +2,28 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const makeSerializable = require("../util/makeSerializable");
 const ContextDependency = require("./ContextDependency");
 const ContextDependencyTemplateAsId = require("./ContextDependencyTemplateAsId");
 
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("./ContextDependency").ContextDependencyOptions} ContextDependencyOptions */
+
 class RequireResolveContextDependency extends ContextDependency {
-	constructor(options, range, valueRange) {
-		super(options);
+	/**
+	 * @param {ContextDependencyOptions} options options
+	 * @param {Range} range range
+	 * @param {Range} valueRange value range
+	 * @param {string=} context context
+	 */
+	constructor(options, range, valueRange, context) {
+		super(options, context);
+
 		this.range = range;
 		this.valueRange = valueRange;
 	}
@@ -16,8 +31,37 @@ class RequireResolveContextDependency extends ContextDependency {
 	get type() {
 		return "amd require context";
 	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+
+		write(this.range);
+		write(this.valueRange);
+
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+
+		this.range = read();
+		this.valueRange = read();
+
+		super.deserialize(context);
+	}
 }
 
+makeSerializable(
+	RequireResolveContextDependency,
+	"webpack/lib/dependencies/RequireResolveContextDependency"
+);
+
 RequireResolveContextDependency.Template = ContextDependencyTemplateAsId;
 
 module.exports = RequireResolveContextDependency;
diff --git a/lib/dependencies/RequireResolveDependency.js b/lib/dependencies/RequireResolveDependency.js
index 3933baa4bee..3205925d2eb 100644
--- a/lib/dependencies/RequireResolveDependency.js
+++ b/lib/dependencies/RequireResolveDependency.js
@@ -2,21 +2,57 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const Dependency = require("../Dependency");
+const makeSerializable = require("../util/makeSerializable");
 const ModuleDependency = require("./ModuleDependency");
 const ModuleDependencyAsId = require("./ModuleDependencyTemplateAsId");
 
+/** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+
 class RequireResolveDependency extends ModuleDependency {
-	constructor(request, range) {
+	/**
+	 * @param {string} request the request string
+	 * @param {Range} range location in source code
+	 * @param {string=} context context
+	 */
+	constructor(request, range, context) {
 		super(request);
+
 		this.range = range;
+		this._context = context;
 	}
 
 	get type() {
 		return "require.resolve";
 	}
+
+	get category() {
+		return "commonjs";
+	}
+
+	/**
+	 * Returns list of exports referenced by this dependency
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @param {RuntimeSpec} runtime the runtime for which the module is analysed
+	 * @returns {(string[] | ReferencedExport)[]} referenced exports
+	 */
+	getReferencedExports(moduleGraph, runtime) {
+		// This doesn't use any export
+		return Dependency.NO_EXPORTS_REFERENCED;
+	}
 }
 
+makeSerializable(
+	RequireResolveDependency,
+	"webpack/lib/dependencies/RequireResolveDependency"
+);
+
 RequireResolveDependency.Template = ModuleDependencyAsId;
 
 module.exports = RequireResolveDependency;
diff --git a/lib/dependencies/RequireResolveDependencyParserPlugin.js b/lib/dependencies/RequireResolveDependencyParserPlugin.js
deleted file mode 100644
index 0d356cf5cd0..00000000000
--- a/lib/dependencies/RequireResolveDependencyParserPlugin.js
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const RequireResolveDependency = require("./RequireResolveDependency");
-const RequireResolveContextDependency = require("./RequireResolveContextDependency");
-const RequireResolveHeaderDependency = require("./RequireResolveHeaderDependency");
-const ContextDependencyHelpers = require("./ContextDependencyHelpers");
-
-class RequireResolveDependencyParserPlugin {
-	constructor(options) {
-		this.options = options;
-	}
-
-	apply(parser) {
-		const options = this.options;
-
-		const process = (expr, weak) => {
-			if (expr.arguments.length !== 1) return;
-			const param = parser.evaluateExpression(expr.arguments[0]);
-			if (param.isConditional()) {
-				for (const option of param.options) {
-					const result = processItem(expr, option, weak);
-					if (result === undefined) {
-						processContext(expr, option, weak);
-					}
-				}
-				const dep = new RequireResolveHeaderDependency(expr.callee.range);
-				dep.loc = expr.loc;
-				parser.state.current.addDependency(dep);
-				return true;
-			} else {
-				const result = processItem(expr, param, weak);
-				if (result === undefined) {
-					processContext(expr, param, weak);
-				}
-				const dep = new RequireResolveHeaderDependency(expr.callee.range);
-				dep.loc = expr.loc;
-				parser.state.current.addDependency(dep);
-				return true;
-			}
-		};
-		const processItem = (expr, param, weak) => {
-			if (param.isString()) {
-				const dep = new RequireResolveDependency(param.string, param.range);
-				dep.loc = expr.loc;
-				dep.optional = !!parser.scope.inTry;
-				dep.weak = weak;
-				parser.state.current.addDependency(dep);
-				return true;
-			}
-		};
-		const processContext = (expr, param, weak) => {
-			const dep = ContextDependencyHelpers.create(
-				RequireResolveContextDependency,
-				param.range,
-				param,
-				expr,
-				options,
-				{
-					mode: weak ? "weak" : "sync"
-				},
-				parser
-			);
-			if (!dep) return;
-			dep.loc = expr.loc;
-			dep.optional = !!parser.scope.inTry;
-			parser.state.current.addDependency(dep);
-			return true;
-		};
-
-		parser.hooks.call
-			.for("require.resolve")
-			.tap("RequireResolveDependencyParserPlugin", expr => {
-				return process(expr, false);
-			});
-		parser.hooks.call
-			.for("require.resolveWeak")
-			.tap("RequireResolveDependencyParserPlugin", expr => {
-				return process(expr, true);
-			});
-	}
-}
-module.exports = RequireResolveDependencyParserPlugin;
diff --git a/lib/dependencies/RequireResolveHeaderDependency.js b/lib/dependencies/RequireResolveHeaderDependency.js
index 05fe86d69d9..2c9524c98ee 100644
--- a/lib/dependencies/RequireResolveHeaderDependency.js
+++ b/lib/dependencies/RequireResolveHeaderDependency.js
@@ -2,22 +2,77 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const makeSerializable = require("../util/makeSerializable");
 const NullDependency = require("./NullDependency");
 
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
 class RequireResolveHeaderDependency extends NullDependency {
+	/**
+	 * @param {Range} range range
+	 */
 	constructor(range) {
 		super();
+
 		if (!Array.isArray(range)) throw new Error("range must be valid");
+
 		this.range = range;
 	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+
+		write(this.range);
+
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 * @returns {RequireResolveHeaderDependency} RequireResolveHeaderDependency
+	 */
+	static deserialize(context) {
+		const obj = new RequireResolveHeaderDependency(context.read());
+		obj.deserialize(context);
+		return obj;
+	}
 }
 
-RequireResolveHeaderDependency.Template = class RequireResolveHeaderDependencyTemplate {
-	apply(dep, source) {
+makeSerializable(
+	RequireResolveHeaderDependency,
+	"webpack/lib/dependencies/RequireResolveHeaderDependency"
+);
+
+RequireResolveHeaderDependency.Template = class RequireResolveHeaderDependencyTemplate extends (
+	NullDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, templateContext) {
+		const dep = /** @type {RequireResolveHeaderDependency} */ (dependency);
 		source.replace(dep.range[0], dep.range[1] - 1, "/*require.resolve*/");
 	}
 
+	/**
+	 * @param {string} name name
+	 * @param {RequireResolveHeaderDependency} dep dependency
+	 * @param {ReplaceSource} source source
+	 */
 	applyAsTemplateArgument(name, dep, source) {
 		source.replace(dep.range[0], dep.range[1] - 1, "/*require.resolve*/");
 	}
diff --git a/lib/dependencies/RuntimeRequirementsDependency.js b/lib/dependencies/RuntimeRequirementsDependency.js
new file mode 100644
index 00000000000..714567b7140
--- /dev/null
+++ b/lib/dependencies/RuntimeRequirementsDependency.js
@@ -0,0 +1,85 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const makeSerializable = require("../util/makeSerializable");
+const NullDependency = require("./NullDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+
+class RuntimeRequirementsDependency extends NullDependency {
+	/**
+	 * @param {string[]} runtimeRequirements runtime requirements
+	 */
+	constructor(runtimeRequirements) {
+		super();
+		this.runtimeRequirements = new Set(runtimeRequirements);
+		this._hashUpdate = undefined;
+	}
+
+	/**
+	 * Update the hash
+	 * @param {Hash} hash hash to be updated
+	 * @param {UpdateHashContext} context context
+	 * @returns {void}
+	 */
+	updateHash(hash, context) {
+		if (this._hashUpdate === undefined) {
+			this._hashUpdate = `${Array.from(this.runtimeRequirements).join()}`;
+		}
+		hash.update(this._hashUpdate);
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.runtimeRequirements);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.runtimeRequirements = read();
+		super.deserialize(context);
+	}
+}
+
+makeSerializable(
+	RuntimeRequirementsDependency,
+	"webpack/lib/dependencies/RuntimeRequirementsDependency"
+);
+
+RuntimeRequirementsDependency.Template = class RuntimeRequirementsDependencyTemplate extends (
+	NullDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, { runtimeRequirements }) {
+		const dep = /** @type {RuntimeRequirementsDependency} */ (dependency);
+		for (const req of dep.runtimeRequirements) {
+			runtimeRequirements.add(req);
+		}
+	}
+};
+
+module.exports = RuntimeRequirementsDependency;
diff --git a/lib/dependencies/SingleEntryDependency.js b/lib/dependencies/SingleEntryDependency.js
deleted file mode 100644
index 75a8c080fec..00000000000
--- a/lib/dependencies/SingleEntryDependency.js
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-const ModuleDependency = require("./ModuleDependency");
-
-class SingleEntryDependency extends ModuleDependency {
-	/**
-	 * @param {string} request request path for entry
-	 */
-	constructor(request) {
-		super(request);
-	}
-
-	get type() {
-		return "single entry";
-	}
-}
-
-module.exports = SingleEntryDependency;
diff --git a/lib/dependencies/StaticExportsDependency.js b/lib/dependencies/StaticExportsDependency.js
new file mode 100644
index 00000000000..d91b5e43da5
--- /dev/null
+++ b/lib/dependencies/StaticExportsDependency.js
@@ -0,0 +1,74 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const makeSerializable = require("../util/makeSerializable");
+const NullDependency = require("./NullDependency");
+
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Dependency").ExportSpec} ExportSpec */
+/** @typedef {import("../Dependency").ExportsSpec} ExportsSpec */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+
+class StaticExportsDependency extends NullDependency {
+	/**
+	 * @param {string[] | true} exports export names
+	 * @param {boolean} canMangle true, if mangling exports names is allowed
+	 */
+	constructor(exports, canMangle) {
+		super();
+		this.exports = exports;
+		this.canMangle = canMangle;
+	}
+
+	get type() {
+		return "static exports";
+	}
+
+	/**
+	 * Returns the exported names
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {ExportsSpec | undefined} export names
+	 */
+	getExports(moduleGraph) {
+		return {
+			exports: this.exports,
+			canMangle: this.canMangle,
+			dependencies: undefined
+		};
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.exports);
+		write(this.canMangle);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.exports = read();
+		this.canMangle = read();
+		super.deserialize(context);
+	}
+}
+
+makeSerializable(
+	StaticExportsDependency,
+	"webpack/lib/dependencies/StaticExportsDependency"
+);
+
+module.exports = StaticExportsDependency;
diff --git a/lib/dependencies/SystemPlugin.js b/lib/dependencies/SystemPlugin.js
index 0e3419b5748..367020d64a9 100644
--- a/lib/dependencies/SystemPlugin.js
+++ b/lib/dependencies/SystemPlugin.js
@@ -2,37 +2,78 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const ParserHelpers = require("../ParserHelpers");
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_DYNAMIC
+} = require("../ModuleTypeConstants");
+const RuntimeGlobals = require("../RuntimeGlobals");
 const WebpackError = require("../WebpackError");
+const {
+	evaluateToString,
+	expressionIsUnsupported,
+	toConstantDependency
+} = require("../javascript/JavascriptParserHelpers");
+const makeSerializable = require("../util/makeSerializable");
+const ConstDependency = require("./ConstDependency");
+const SystemRuntimeModule = require("./SystemRuntimeModule");
+
+/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("../javascript/JavascriptParser")} Parser */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+
+const PLUGIN_NAME = "SystemPlugin";
 
 class SystemPlugin {
-	constructor(options) {
-		this.options = options;
-	}
-
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		compiler.hooks.compilation.tap(
-			"SystemPlugin",
+			PLUGIN_NAME,
 			(compilation, { normalModuleFactory }) => {
+				compilation.hooks.runtimeRequirementInModule
+					.for(RuntimeGlobals.system)
+					.tap(PLUGIN_NAME, (module, set) => {
+						set.add(RuntimeGlobals.requireScope);
+					});
+
+				compilation.hooks.runtimeRequirementInTree
+					.for(RuntimeGlobals.system)
+					.tap(PLUGIN_NAME, (chunk, set) => {
+						compilation.addRuntimeModule(chunk, new SystemRuntimeModule());
+					});
+
+				/**
+				 * @param {Parser} parser parser parser
+				 * @param {JavascriptParserOptions} parserOptions parserOptions
+				 * @returns {void}
+				 */
 				const handler = (parser, parserOptions) => {
-					if (parserOptions.system !== undefined && !parserOptions.system)
+					if (parserOptions.system === undefined || !parserOptions.system) {
 						return;
+					}
 
-					const shouldWarn = parserOptions.system === undefined;
-
+					/**
+					 * @param {string} name name
+					 */
 					const setNotSupported = name => {
 						parser.hooks.evaluateTypeof
 							.for(name)
-							.tap("SystemPlugin", ParserHelpers.evaluateToString("undefined"));
+							.tap(PLUGIN_NAME, evaluateToString("undefined"));
 						parser.hooks.expression
 							.for(name)
 							.tap(
-								"SystemPlugin",
-								ParserHelpers.expressionIsUnsupported(
+								PLUGIN_NAME,
+								expressionIsUnsupported(
 									parser,
-									name + " is not supported by webpack."
+									`${name} is not supported by webpack.`
 								)
 							);
 					};
@@ -40,71 +81,72 @@ class SystemPlugin {
 					parser.hooks.typeof
 						.for("System.import")
 						.tap(
-							"SystemPlugin",
-							ParserHelpers.toConstantDependency(
-								parser,
-								JSON.stringify("function")
-							)
+							PLUGIN_NAME,
+							toConstantDependency(parser, JSON.stringify("function"))
 						);
 					parser.hooks.evaluateTypeof
 						.for("System.import")
-						.tap("SystemPlugin", ParserHelpers.evaluateToString("function"));
+						.tap(PLUGIN_NAME, evaluateToString("function"));
 					parser.hooks.typeof
 						.for("System")
 						.tap(
-							"SystemPlugin",
-							ParserHelpers.toConstantDependency(
-								parser,
-								JSON.stringify("object")
-							)
+							PLUGIN_NAME,
+							toConstantDependency(parser, JSON.stringify("object"))
 						);
 					parser.hooks.evaluateTypeof
 						.for("System")
-						.tap("SystemPlugin", ParserHelpers.evaluateToString("object"));
+						.tap(PLUGIN_NAME, evaluateToString("object"));
 
 					setNotSupported("System.set");
 					setNotSupported("System.get");
 					setNotSupported("System.register");
 
-					parser.hooks.expression.for("System").tap("SystemPlugin", () => {
-						const systemPolyfillRequire = ParserHelpers.requireFileAsExpression(
-							parser.state.module.context,
-							require.resolve("../../buildin/system")
-						);
-						return ParserHelpers.addParsedVariableToModule(
-							parser,
-							"System",
-							systemPolyfillRequire
+					parser.hooks.expression.for("System").tap(PLUGIN_NAME, expr => {
+						const dep = new ConstDependency(
+							RuntimeGlobals.system,
+							/** @type {Range} */ (expr.range),
+							[RuntimeGlobals.system]
 						);
+						dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+						parser.state.module.addPresentationalDependency(dep);
+						return true;
 					});
 
-					parser.hooks.call.for("System.import").tap("SystemPlugin", expr => {
-						if (shouldWarn) {
-							parser.state.module.warnings.push(
-								new SystemImportDeprecationWarning(
-									parser.state.module,
-									expr.loc
-								)
-							);
-						}
+					parser.hooks.call.for("System.import").tap(PLUGIN_NAME, expr => {
+						parser.state.module.addWarning(
+							new SystemImportDeprecationWarning(
+								/** @type {DependencyLocation} */ (expr.loc)
+							)
+						);
 
-						return parser.hooks.importCall.call(expr);
+						return parser.hooks.importCall.call({
+							type: "ImportExpression",
+							source:
+								/** @type {import("estree").Literal} */
+								(expr.arguments[0]),
+							loc: expr.loc,
+							range: expr.range,
+							options: null
+						});
 					});
 				};
 
 				normalModuleFactory.hooks.parser
-					.for("javascript/auto")
-					.tap("SystemPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, handler);
 				normalModuleFactory.hooks.parser
-					.for("javascript/dynamic")
-					.tap("SystemPlugin", handler);
+					.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
+					.tap(PLUGIN_NAME, handler);
 			}
 		);
 	}
 }
 
 class SystemImportDeprecationWarning extends WebpackError {
-	constructor(module, loc) {
+	/**
+	 * @param {DependencyLocation} loc location
+	 */
+	constructor(loc) {
 		super(
 			"System.import() is deprecated and will be removed soon. Use import() instead.\n" +
 				"For more info visit https://webpack.js.org/guides/code-splitting/"
@@ -112,11 +154,15 @@ class SystemImportDeprecationWarning extends WebpackError {
 
 		this.name = "SystemImportDeprecationWarning";
 
-		this.module = module;
 		this.loc = loc;
-
-		Error.captureStackTrace(this, this.constructor);
 	}
 }
 
+makeSerializable(
+	SystemImportDeprecationWarning,
+	"webpack/lib/dependencies/SystemPlugin",
+	"SystemImportDeprecationWarning"
+);
+
 module.exports = SystemPlugin;
+module.exports.SystemImportDeprecationWarning = SystemImportDeprecationWarning;
diff --git a/lib/dependencies/SystemRuntimeModule.js b/lib/dependencies/SystemRuntimeModule.js
new file mode 100644
index 00000000000..a7c3fba72f9
--- /dev/null
+++ b/lib/dependencies/SystemRuntimeModule.js
@@ -0,0 +1,35 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Florent Cailhol @ooflorent
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+const Template = require("../Template");
+
+class SystemRuntimeModule extends RuntimeModule {
+	constructor() {
+		super("system");
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		return Template.asString([
+			`${RuntimeGlobals.system} = {`,
+			Template.indent([
+				"import: function () {",
+				Template.indent(
+					"throw new Error('System.import cannot be used indirectly');"
+				),
+				"}"
+			]),
+			"};"
+		]);
+	}
+}
+
+module.exports = SystemRuntimeModule;
diff --git a/lib/dependencies/URLDependency.js b/lib/dependencies/URLDependency.js
new file mode 100644
index 00000000000..f105e0cf592
--- /dev/null
+++ b/lib/dependencies/URLDependency.js
@@ -0,0 +1,170 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RawDataUrlModule = require("../asset/RawDataUrlModule");
+const {
+	getDependencyUsedByExportsCondition
+} = require("../optimize/InnerGraph");
+const makeSerializable = require("../util/makeSerializable");
+const memoize = require("../util/memoize");
+const ModuleDependency = require("./ModuleDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").GetConditionFn} GetConditionFn */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */
+/** @typedef {import("../ModuleGraphConnection").ConnectionState} ConnectionState */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+
+const getIgnoredRawDataUrlModule = memoize(
+	() => new RawDataUrlModule("data:,", "ignored-asset", "(ignored asset)")
+);
+
+class URLDependency extends ModuleDependency {
+	/**
+	 * @param {string} request request
+	 * @param {Range} range range of the arguments of new URL( |> ... <| )
+	 * @param {Range} outerRange range of the full |> new URL(...) <|
+	 * @param {boolean=} relative use relative urls instead of absolute with base uri
+	 */
+	constructor(request, range, outerRange, relative) {
+		super(request);
+		this.range = range;
+		this.outerRange = outerRange;
+		this.relative = relative || false;
+		/** @type {Set | boolean | undefined} */
+		this.usedByExports = undefined;
+	}
+
+	get type() {
+		return "new URL()";
+	}
+
+	get category() {
+		return "url";
+	}
+
+	/**
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {null | false | GetConditionFn} function to determine if the connection is active
+	 */
+	getCondition(moduleGraph) {
+		return getDependencyUsedByExportsCondition(
+			this,
+			this.usedByExports,
+			moduleGraph
+		);
+	}
+
+	/**
+	 * @param {string} context context directory
+	 * @returns {Module} ignored module
+	 */
+	createIgnoredModule(context) {
+		return getIgnoredRawDataUrlModule();
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.outerRange);
+		write(this.relative);
+		write(this.usedByExports);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.outerRange = read();
+		this.relative = read();
+		this.usedByExports = read();
+		super.deserialize(context);
+	}
+}
+
+URLDependency.Template = class URLDependencyTemplate extends (
+	ModuleDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, templateContext) {
+		const {
+			chunkGraph,
+			moduleGraph,
+			runtimeRequirements,
+			runtimeTemplate,
+			runtime
+		} = templateContext;
+		const dep = /** @type {URLDependency} */ (dependency);
+		const connection = moduleGraph.getConnection(dep);
+		// Skip rendering depending when dependency is conditional
+		if (connection && !connection.isTargetActive(runtime)) {
+			source.replace(
+				dep.outerRange[0],
+				dep.outerRange[1] - 1,
+				"/* unused asset import */ undefined"
+			);
+			return;
+		}
+
+		runtimeRequirements.add(RuntimeGlobals.require);
+
+		if (dep.relative) {
+			runtimeRequirements.add(RuntimeGlobals.relativeUrl);
+			source.replace(
+				dep.outerRange[0],
+				dep.outerRange[1] - 1,
+				`/* asset import */ new ${
+					RuntimeGlobals.relativeUrl
+				}(${runtimeTemplate.moduleRaw({
+					chunkGraph,
+					module: moduleGraph.getModule(dep),
+					request: dep.request,
+					runtimeRequirements,
+					weak: false
+				})})`
+			);
+		} else {
+			runtimeRequirements.add(RuntimeGlobals.baseURI);
+
+			source.replace(
+				dep.range[0],
+				dep.range[1] - 1,
+				`/* asset import */ ${runtimeTemplate.moduleRaw({
+					chunkGraph,
+					module: moduleGraph.getModule(dep),
+					request: dep.request,
+					runtimeRequirements,
+					weak: false
+				})}, ${RuntimeGlobals.baseURI}`
+			);
+		}
+	}
+};
+
+makeSerializable(URLDependency, "webpack/lib/dependencies/URLDependency");
+
+module.exports = URLDependency;
diff --git a/lib/dependencies/URLPlugin.js b/lib/dependencies/URLPlugin.js
new file mode 100644
index 00000000000..0409f0689b6
--- /dev/null
+++ b/lib/dependencies/URLPlugin.js
@@ -0,0 +1,208 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const { pathToFileURL } = require("url");
+const CommentCompilationWarning = require("../CommentCompilationWarning");
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_ESM
+} = require("../ModuleTypeConstants");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const UnsupportedFeatureWarning = require("../UnsupportedFeatureWarning");
+const BasicEvaluatedExpression = require("../javascript/BasicEvaluatedExpression");
+const { approve } = require("../javascript/JavascriptParserHelpers");
+const InnerGraph = require("../optimize/InnerGraph");
+const ConstDependency = require("./ConstDependency");
+const URLDependency = require("./URLDependency");
+
+/** @typedef {import("estree").MemberExpression} MemberExpression */
+/** @typedef {import("estree").NewExpression} NewExpressionNode */
+/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("../NormalModule")} NormalModule */
+/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("../javascript/JavascriptParser")} Parser */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+
+const PLUGIN_NAME = "URLPlugin";
+
+class URLPlugin {
+	/**
+	 * @param {Compiler} compiler compiler
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(
+			PLUGIN_NAME,
+			(compilation, { normalModuleFactory }) => {
+				compilation.dependencyFactories.set(URLDependency, normalModuleFactory);
+				compilation.dependencyTemplates.set(
+					URLDependency,
+					new URLDependency.Template()
+				);
+
+				/**
+				 * @param {NormalModule} module module
+				 * @returns {URL} file url
+				 */
+				const getUrl = module => pathToFileURL(module.resource);
+
+				/**
+				 * @param {Parser} parser parser parser
+				 * @param {MemberExpression} arg arg
+				 * @returns {boolean} true when it is `meta.url`, otherwise false
+				 */
+				const isMetaUrl = (parser, arg) => {
+					const chain = parser.extractMemberExpressionChain(arg);
+
+					if (
+						chain.members.length !== 1 ||
+						chain.object.type !== "MetaProperty" ||
+						chain.object.meta.name !== "import" ||
+						chain.object.property.name !== "meta" ||
+						chain.members[0] !== "url"
+					)
+						return false;
+
+					return true;
+				};
+
+				/**
+				 * @param {Parser} parser parser parser
+				 * @param {JavascriptParserOptions} parserOptions parserOptions
+				 * @returns {void}
+				 */
+				const parserCallback = (parser, parserOptions) => {
+					if (parserOptions.url === false) return;
+					const relative = parserOptions.url === "relative";
+
+					/**
+					 * @param {NewExpressionNode} expr expression
+					 * @returns {undefined | string} request
+					 */
+					const getUrlRequest = expr => {
+						if (expr.arguments.length !== 2) return;
+
+						const [arg1, arg2] = expr.arguments;
+
+						if (
+							arg2.type !== "MemberExpression" ||
+							arg1.type === "SpreadElement"
+						)
+							return;
+
+						if (!isMetaUrl(parser, arg2)) return;
+
+						return parser.evaluateExpression(arg1).asString();
+					};
+
+					parser.hooks.canRename.for("URL").tap(PLUGIN_NAME, approve);
+					parser.hooks.evaluateNewExpression
+						.for("URL")
+						.tap(PLUGIN_NAME, expr => {
+							const request = getUrlRequest(expr);
+							if (!request) return;
+							const url = new URL(request, getUrl(parser.state.module));
+
+							return new BasicEvaluatedExpression()
+								.setString(url.toString())
+								.setRange(/** @type {Range} */ (expr.range));
+						});
+					parser.hooks.new.for("URL").tap(PLUGIN_NAME, _expr => {
+						const expr = /** @type {NewExpressionNode} */ (_expr);
+						const { options: importOptions, errors: commentErrors } =
+							parser.parseCommentOptions(/** @type {Range} */ (expr.range));
+
+						if (commentErrors) {
+							for (const e of commentErrors) {
+								const { comment } = e;
+								parser.state.module.addWarning(
+									new CommentCompilationWarning(
+										`Compilation error while processing magic comment(-s): /*${comment.value}*/: ${e.message}`,
+										/** @type {DependencyLocation} */ (comment.loc)
+									)
+								);
+							}
+						}
+
+						if (importOptions && importOptions.webpackIgnore !== undefined) {
+							if (typeof importOptions.webpackIgnore !== "boolean") {
+								parser.state.module.addWarning(
+									new UnsupportedFeatureWarning(
+										`\`webpackIgnore\` expected a boolean, but received: ${importOptions.webpackIgnore}.`,
+										/** @type {DependencyLocation} */ (expr.loc)
+									)
+								);
+								return;
+							} else if (importOptions.webpackIgnore) {
+								if (expr.arguments.length !== 2) return;
+
+								const [, arg2] = expr.arguments;
+
+								if (
+									arg2.type !== "MemberExpression" ||
+									!isMetaUrl(parser, arg2)
+								)
+									return;
+
+								const dep = new ConstDependency(
+									RuntimeGlobals.baseURI,
+									/** @type {Range} */ (arg2.range),
+									[RuntimeGlobals.baseURI]
+								);
+								dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+								parser.state.module.addPresentationalDependency(dep);
+
+								return true;
+							}
+						}
+
+						const request = getUrlRequest(expr);
+
+						if (!request) return;
+
+						const [arg1, arg2] = expr.arguments;
+						const dep = new URLDependency(
+							request,
+							[
+								/** @type {Range} */ (arg1.range)[0],
+								/** @type {Range} */ (arg2.range)[1]
+							],
+							/** @type {Range} */ (expr.range),
+							relative
+						);
+						dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+						parser.state.current.addDependency(dep);
+						InnerGraph.onUsage(parser.state, e => (dep.usedByExports = e));
+						return true;
+					});
+					parser.hooks.isPure.for("NewExpression").tap(PLUGIN_NAME, _expr => {
+						const expr = /** @type {NewExpressionNode} */ (_expr);
+						const { callee } = expr;
+						if (callee.type !== "Identifier") return;
+						const calleeInfo = parser.getFreeInfoFromVariable(callee.name);
+						if (!calleeInfo || calleeInfo.name !== "URL") return;
+
+						const request = getUrlRequest(expr);
+
+						if (request) return true;
+					});
+				};
+
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, parserCallback);
+
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_ESM)
+					.tap(PLUGIN_NAME, parserCallback);
+			}
+		);
+	}
+}
+
+module.exports = URLPlugin;
diff --git a/lib/dependencies/UnsupportedDependency.js b/lib/dependencies/UnsupportedDependency.js
index 614af783e1c..6796634c9b4 100644
--- a/lib/dependencies/UnsupportedDependency.js
+++ b/lib/dependencies/UnsupportedDependency.js
@@ -2,24 +2,79 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
+
+const makeSerializable = require("../util/makeSerializable");
 const NullDependency = require("./NullDependency");
-const webpackMissingModule = require("./WebpackMissingModule").module;
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
 
 class UnsupportedDependency extends NullDependency {
+	/**
+	 * @param {string} request the request string
+	 * @param {Range} range location in source code
+	 */
 	constructor(request, range) {
 		super();
+
 		this.request = request;
 		this.range = range;
 	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+
+		write(this.request);
+		write(this.range);
+
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+
+		this.request = read();
+		this.range = read();
+
+		super.deserialize(context);
+	}
 }
 
-UnsupportedDependency.Template = class UnsupportedDependencyTemplate {
-	apply(dep, source, runtime) {
+makeSerializable(
+	UnsupportedDependency,
+	"webpack/lib/dependencies/UnsupportedDependency"
+);
+
+UnsupportedDependency.Template = class UnsupportedDependencyTemplate extends (
+	NullDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, { runtimeTemplate }) {
+		const dep = /** @type {UnsupportedDependency} */ (dependency);
+
 		source.replace(
 			dep.range[0],
 			dep.range[1],
-			webpackMissingModule(dep.request)
+			runtimeTemplate.missingModule({
+				request: dep.request
+			})
 		);
 	}
 };
diff --git a/lib/dependencies/WebAssemblyExportImportedDependency.js b/lib/dependencies/WebAssemblyExportImportedDependency.js
index 9fa55f2bf21..4ae5bd881aa 100644
--- a/lib/dependencies/WebAssemblyExportImportedDependency.js
+++ b/lib/dependencies/WebAssemblyExportImportedDependency.js
@@ -2,12 +2,27 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const DependencyReference = require("./DependencyReference");
+const Dependency = require("../Dependency");
+const makeSerializable = require("../util/makeSerializable");
 const ModuleDependency = require("./ModuleDependency");
 
+/** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
+/** @typedef {import("../Dependency").TRANSITIVE} TRANSITIVE */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+
 class WebAssemblyExportImportedDependency extends ModuleDependency {
+	/**
+	 * @param {string} exportName export name
+	 * @param {string} request request
+	 * @param {string} name name
+	 * @param {string} valueType value type
+	 */
 	constructor(exportName, request, name, valueType) {
 		super(request);
 		/** @type {string} */
@@ -18,14 +33,61 @@ class WebAssemblyExportImportedDependency extends ModuleDependency {
 		this.valueType = valueType;
 	}
 
-	getReference() {
-		if (!this.module) return null;
-		return new DependencyReference(this.module, [this.name], false);
+	/**
+	 * @returns {boolean | TRANSITIVE} true, when changes to the referenced module could affect the referencing module; TRANSITIVE, when changes to the referenced module could affect referencing modules of the referencing module
+	 */
+	couldAffectReferencingModule() {
+		return Dependency.TRANSITIVE;
+	}
+
+	/**
+	 * Returns list of exports referenced by this dependency
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @param {RuntimeSpec} runtime the runtime for which the module is analysed
+	 * @returns {(string[] | ReferencedExport)[]} referenced exports
+	 */
+	getReferencedExports(moduleGraph, runtime) {
+		return [[this.name]];
 	}
 
 	get type() {
 		return "wasm export import";
 	}
+
+	get category() {
+		return "wasm";
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+
+		write(this.exportName);
+		write(this.name);
+		write(this.valueType);
+
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+
+		this.exportName = read();
+		this.name = read();
+		this.valueType = read();
+
+		super.deserialize(context);
+	}
 }
 
+makeSerializable(
+	WebAssemblyExportImportedDependency,
+	"webpack/lib/dependencies/WebAssemblyExportImportedDependency"
+);
+
 module.exports = WebAssemblyExportImportedDependency;
diff --git a/lib/dependencies/WebAssemblyImportDependency.js b/lib/dependencies/WebAssemblyImportDependency.js
index d765b0db067..de23f76f19a 100644
--- a/lib/dependencies/WebAssemblyImportDependency.js
+++ b/lib/dependencies/WebAssemblyImportDependency.js
@@ -2,13 +2,20 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const DependencyReference = require("./DependencyReference");
+const makeSerializable = require("../util/makeSerializable");
+const UnsupportedWebAssemblyFeatureError = require("../wasm-sync/UnsupportedWebAssemblyFeatureError");
 const ModuleDependency = require("./ModuleDependency");
-const UnsupportedWebAssemblyFeatureError = require("../wasm/UnsupportedWebAssemblyFeatureError");
 
 /** @typedef {import("@webassemblyjs/ast").ModuleImportDescription} ModuleImportDescription */
+/** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../WebpackError")} WebpackError */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
 
 class WebAssemblyImportDependency extends ModuleDependency {
 	/**
@@ -27,30 +34,75 @@ class WebAssemblyImportDependency extends ModuleDependency {
 		this.onlyDirectImport = onlyDirectImport;
 	}
 
-	getReference() {
-		if (!this.module) return null;
-		return new DependencyReference(this.module, [this.name], false);
+	get type() {
+		return "wasm import";
 	}
 
-	getErrors() {
+	get category() {
+		return "wasm";
+	}
+
+	/**
+	 * Returns list of exports referenced by this dependency
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @param {RuntimeSpec} runtime the runtime for which the module is analysed
+	 * @returns {(string[] | ReferencedExport)[]} referenced exports
+	 */
+	getReferencedExports(moduleGraph, runtime) {
+		return [[this.name]];
+	}
+
+	/**
+	 * Returns errors
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @returns {WebpackError[] | null | undefined} errors
+	 */
+	getErrors(moduleGraph) {
+		const module = moduleGraph.getModule(this);
+
 		if (
 			this.onlyDirectImport &&
-			this.module &&
-			!this.module.type.startsWith("webassembly")
+			module &&
+			!module.type.startsWith("webassembly")
 		) {
 			return [
 				new UnsupportedWebAssemblyFeatureError(
-					`Import "${this.name}" from "${this.request}" with ${
-						this.onlyDirectImport
-					} can only be used for direct wasm to wasm dependencies`
+					`Import "${this.name}" from "${this.request}" with ${this.onlyDirectImport} can only be used for direct wasm to wasm dependencies`
 				)
 			];
 		}
 	}
 
-	get type() {
-		return "wasm import";
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+
+		write(this.name);
+		write(this.description);
+		write(this.onlyDirectImport);
+
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+
+		this.name = read();
+		this.description = read();
+		this.onlyDirectImport = read();
+
+		super.deserialize(context);
 	}
 }
 
+makeSerializable(
+	WebAssemblyImportDependency,
+	"webpack/lib/dependencies/WebAssemblyImportDependency"
+);
+
 module.exports = WebAssemblyImportDependency;
diff --git a/lib/dependencies/WebpackIsIncludedDependency.js b/lib/dependencies/WebpackIsIncludedDependency.js
new file mode 100644
index 00000000000..0b308734ee7
--- /dev/null
+++ b/lib/dependencies/WebpackIsIncludedDependency.js
@@ -0,0 +1,85 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const Dependency = require("../Dependency");
+const Template = require("../Template");
+const makeSerializable = require("../util/makeSerializable");
+const ModuleDependency = require("./ModuleDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+
+class WebpackIsIncludedDependency extends ModuleDependency {
+	/**
+	 * @param {string} request the request string
+	 * @param {Range} range location in source code
+	 */
+	constructor(request, range) {
+		super(request);
+
+		this.weak = true;
+		this.range = range;
+	}
+
+	/**
+	 * Returns list of exports referenced by this dependency
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @param {RuntimeSpec} runtime the runtime for which the module is analysed
+	 * @returns {(string[] | ReferencedExport)[]} referenced exports
+	 */
+	getReferencedExports(moduleGraph, runtime) {
+		// This doesn't use any export
+		return Dependency.NO_EXPORTS_REFERENCED;
+	}
+
+	get type() {
+		return "__webpack_is_included__";
+	}
+}
+
+makeSerializable(
+	WebpackIsIncludedDependency,
+	"webpack/lib/dependencies/WebpackIsIncludedDependency"
+);
+
+WebpackIsIncludedDependency.Template = class WebpackIsIncludedDependencyTemplate extends (
+	ModuleDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, { runtimeTemplate, chunkGraph, moduleGraph }) {
+		const dep = /** @type {WebpackIsIncludedDependency} */ (dependency);
+		const connection = moduleGraph.getConnection(dep);
+		const included = connection
+			? chunkGraph.getNumberOfModuleChunks(connection.module) > 0
+			: false;
+		const comment = runtimeTemplate.outputOptions.pathinfo
+			? Template.toComment(
+					`__webpack_is_included__ ${runtimeTemplate.requestShortener.shorten(
+						dep.request
+					)}`
+				)
+			: "";
+
+		source.replace(
+			dep.range[0],
+			dep.range[1] - 1,
+			`${comment}${JSON.stringify(included)}`
+		);
+	}
+};
+
+module.exports = WebpackIsIncludedDependency;
diff --git a/lib/dependencies/WebpackMissingModule.js b/lib/dependencies/WebpackMissingModule.js
deleted file mode 100644
index a55c9ec087f..00000000000
--- a/lib/dependencies/WebpackMissingModule.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-const toErrorCode = err =>
-	`var e = new Error(${JSON.stringify(err)}); e.code = 'MODULE_NOT_FOUND';`;
-
-exports.module = request =>
-	`!(function webpackMissingModule() { ${exports.moduleCode(request)} }())`;
-
-exports.promise = request => {
-	const errorCode = toErrorCode(`Cannot find module '${request}'`);
-	return `Promise.reject(function webpackMissingModule() { ${errorCode} return e; }())`;
-};
-
-exports.moduleCode = request => {
-	const errorCode = toErrorCode(`Cannot find module '${request}'`);
-	return `${errorCode} throw e;`;
-};
diff --git a/lib/dependencies/WorkerDependency.js b/lib/dependencies/WorkerDependency.js
new file mode 100644
index 00000000000..eafc653d95c
--- /dev/null
+++ b/lib/dependencies/WorkerDependency.js
@@ -0,0 +1,136 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const Dependency = require("../Dependency");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const makeSerializable = require("../util/makeSerializable");
+const ModuleDependency = require("./ModuleDependency");
+
+/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */
+/** @typedef {import("../AsyncDependenciesBlock")} AsyncDependenciesBlock */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Dependency").ReferencedExport} ReferencedExport */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../Entrypoint")} Entrypoint */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+
+class WorkerDependency extends ModuleDependency {
+	/**
+	 * @param {string} request request
+	 * @param {Range} range range
+	 * @param {object} workerDependencyOptions options
+	 * @param {string=} workerDependencyOptions.publicPath public path for the worker
+	 * @param {boolean=} workerDependencyOptions.needNewUrl need generate `new URL(...)`
+	 */
+	constructor(request, range, workerDependencyOptions) {
+		super(request);
+		this.range = range;
+		// If options are updated, don't forget to update the hash and serialization functions
+		this.options = workerDependencyOptions;
+		/** Cache the hash */
+		this._hashUpdate = undefined;
+	}
+
+	/**
+	 * Returns list of exports referenced by this dependency
+	 * @param {ModuleGraph} moduleGraph module graph
+	 * @param {RuntimeSpec} runtime the runtime for which the module is analysed
+	 * @returns {(string[] | ReferencedExport)[]} referenced exports
+	 */
+	getReferencedExports(moduleGraph, runtime) {
+		return Dependency.NO_EXPORTS_REFERENCED;
+	}
+
+	get type() {
+		return "new Worker()";
+	}
+
+	get category() {
+		return "worker";
+	}
+
+	/**
+	 * Update the hash
+	 * @param {Hash} hash hash to be updated
+	 * @param {UpdateHashContext} context context
+	 * @returns {void}
+	 */
+	updateHash(hash, context) {
+		if (this._hashUpdate === undefined) {
+			this._hashUpdate = JSON.stringify(this.options);
+		}
+		hash.update(this._hashUpdate);
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.options);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.options = read();
+		super.deserialize(context);
+	}
+}
+
+WorkerDependency.Template = class WorkerDependencyTemplate extends (
+	ModuleDependency.Template
+) {
+	/**
+	 * @param {Dependency} dependency the dependency for which the template should be applied
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {DependencyTemplateContext} templateContext the context object
+	 * @returns {void}
+	 */
+	apply(dependency, source, templateContext) {
+		const { chunkGraph, moduleGraph, runtimeRequirements } = templateContext;
+		const dep = /** @type {WorkerDependency} */ (dependency);
+		const block = /** @type {AsyncDependenciesBlock} */ (
+			moduleGraph.getParentBlock(dependency)
+		);
+		const entrypoint = /** @type {Entrypoint} */ (
+			chunkGraph.getBlockChunkGroup(block)
+		);
+		const chunk = entrypoint.getEntrypointChunk();
+		// We use the workerPublicPath option if provided, else we fallback to the RuntimeGlobal publicPath
+		const workerImportBaseUrl = dep.options.publicPath
+			? `"${dep.options.publicPath}"`
+			: RuntimeGlobals.publicPath;
+
+		runtimeRequirements.add(RuntimeGlobals.publicPath);
+		runtimeRequirements.add(RuntimeGlobals.baseURI);
+		runtimeRequirements.add(RuntimeGlobals.getChunkScriptFilename);
+
+		const workerImportStr = `/* worker import */ ${workerImportBaseUrl} + ${
+			RuntimeGlobals.getChunkScriptFilename
+		}(${JSON.stringify(chunk.id)}), ${RuntimeGlobals.baseURI}`;
+
+		source.replace(
+			dep.range[0],
+			dep.range[1] - 1,
+			dep.options.needNewUrl ? `new URL(${workerImportStr})` : workerImportStr
+		);
+	}
+};
+
+makeSerializable(WorkerDependency, "webpack/lib/dependencies/WorkerDependency");
+
+module.exports = WorkerDependency;
diff --git a/lib/dependencies/WorkerPlugin.js b/lib/dependencies/WorkerPlugin.js
new file mode 100644
index 00000000000..9205d3147bf
--- /dev/null
+++ b/lib/dependencies/WorkerPlugin.js
@@ -0,0 +1,559 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { pathToFileURL } = require("url");
+const AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
+const CommentCompilationWarning = require("../CommentCompilationWarning");
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_ESM
+} = require("../ModuleTypeConstants");
+const UnsupportedFeatureWarning = require("../UnsupportedFeatureWarning");
+const EnableChunkLoadingPlugin = require("../javascript/EnableChunkLoadingPlugin");
+const { equals } = require("../util/ArrayHelpers");
+const createHash = require("../util/createHash");
+const { contextify } = require("../util/identifier");
+const EnableWasmLoadingPlugin = require("../wasm/EnableWasmLoadingPlugin");
+const ConstDependency = require("./ConstDependency");
+const CreateScriptUrlDependency = require("./CreateScriptUrlDependency");
+const {
+	harmonySpecifierTag
+} = require("./HarmonyImportDependencyParserPlugin");
+const WorkerDependency = require("./WorkerDependency");
+
+/** @typedef {import("estree").CallExpression} CallExpression */
+/** @typedef {import("estree").Expression} Expression */
+/** @typedef {import("estree").Identifier} Identifier */
+/** @typedef {import("estree").MemberExpression} MemberExpression */
+/** @typedef {import("estree").ObjectExpression} ObjectExpression */
+/** @typedef {import("estree").Pattern} Pattern */
+/** @typedef {import("estree").Property} Property */
+/** @typedef {import("estree").SpreadElement} SpreadElement */
+/** @typedef {import("../../declarations/WebpackOptions").ChunkLoading} ChunkLoading */
+/** @typedef {import("../../declarations/WebpackOptions").HashFunction} HashFunction */
+/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
+/** @typedef {import("../../declarations/WebpackOptions").OutputModule} OutputModule */
+/** @typedef {import("../../declarations/WebpackOptions").WasmLoading} WasmLoading */
+/** @typedef {import("../../declarations/WebpackOptions").WorkerPublicPath} WorkerPublicPath */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("../Entrypoint").EntryOptions} EntryOptions */
+/** @typedef {import("../NormalModule")} NormalModule */
+/** @typedef {import("../Parser").ParserState} ParserState */
+/** @typedef {import("../javascript/BasicEvaluatedExpression")} BasicEvaluatedExpression */
+/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("../javascript/JavascriptParser")} Parser */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("./HarmonyImportDependencyParserPlugin").HarmonySettings} HarmonySettings */
+
+/**
+ * @param {NormalModule} module module
+ * @returns {string} url
+ */
+const getUrl = module => pathToFileURL(module.resource).toString();
+
+const WorkerSpecifierTag = Symbol("worker specifier tag");
+
+const DEFAULT_SYNTAX = [
+	"Worker",
+	"SharedWorker",
+	"navigator.serviceWorker.register()",
+	"Worker from worker_threads"
+];
+
+/** @type {WeakMap} */
+const workerIndexMap = new WeakMap();
+
+const PLUGIN_NAME = "WorkerPlugin";
+
+class WorkerPlugin {
+	/**
+	 * @param {ChunkLoading=} chunkLoading chunk loading
+	 * @param {WasmLoading=} wasmLoading wasm loading
+	 * @param {OutputModule=} module output module
+	 * @param {WorkerPublicPath=} workerPublicPath worker public path
+	 */
+	constructor(chunkLoading, wasmLoading, module, workerPublicPath) {
+		this._chunkLoading = chunkLoading;
+		this._wasmLoading = wasmLoading;
+		this._module = module;
+		this._workerPublicPath = workerPublicPath;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		if (this._chunkLoading) {
+			new EnableChunkLoadingPlugin(this._chunkLoading).apply(compiler);
+		}
+		if (this._wasmLoading) {
+			new EnableWasmLoadingPlugin(this._wasmLoading).apply(compiler);
+		}
+		const cachedContextify = contextify.bindContextCache(
+			compiler.context,
+			compiler.root
+		);
+		compiler.hooks.thisCompilation.tap(
+			PLUGIN_NAME,
+			(compilation, { normalModuleFactory }) => {
+				compilation.dependencyFactories.set(
+					WorkerDependency,
+					normalModuleFactory
+				);
+				compilation.dependencyTemplates.set(
+					WorkerDependency,
+					new WorkerDependency.Template()
+				);
+				compilation.dependencyTemplates.set(
+					CreateScriptUrlDependency,
+					new CreateScriptUrlDependency.Template()
+				);
+
+				/**
+				 * @param {JavascriptParser} parser the parser
+				 * @param {Expression} expr expression
+				 * @returns {[string, Range] | void} parsed
+				 */
+				const parseModuleUrl = (parser, expr) => {
+					if (expr.type !== "NewExpression" || expr.callee.type === "Super")
+						return;
+					if (
+						expr.arguments.length === 1 &&
+						expr.arguments[0].type === "MemberExpression" &&
+						isMetaUrl(parser, expr.arguments[0])
+					) {
+						const arg1 = expr.arguments[0];
+						return [
+							getUrl(parser.state.module),
+							[
+								/** @type {Range} */ (arg1.range)[0],
+								/** @type {Range} */ (arg1.range)[1]
+							]
+						];
+					} else if (expr.arguments.length === 2) {
+						const [arg1, arg2] = expr.arguments;
+						if (arg1.type === "SpreadElement") return;
+						if (arg2.type === "SpreadElement") return;
+						const callee = parser.evaluateExpression(expr.callee);
+						if (!callee.isIdentifier() || callee.identifier !== "URL") return;
+						const arg2Value = parser.evaluateExpression(arg2);
+						if (
+							!arg2Value.isString() ||
+							!(
+								/** @type {string} */ (arg2Value.string).startsWith("file://")
+							) ||
+							arg2Value.string !== getUrl(parser.state.module)
+						) {
+							return;
+						}
+						const arg1Value = parser.evaluateExpression(arg1);
+						if (!arg1Value.isString()) return;
+						return [
+							/** @type {string} */ (arg1Value.string),
+							[
+								/** @type {Range} */ (arg1.range)[0],
+								/** @type {Range} */ (arg2.range)[1]
+							]
+						];
+					}
+				};
+
+				/**
+				 * @param {JavascriptParser} parser the parser
+				 * @param {MemberExpression} expr expression
+				 * @returns {boolean} is `import.meta.url`
+				 */
+				const isMetaUrl = (parser, expr) => {
+					const chain = parser.extractMemberExpressionChain(expr);
+
+					if (
+						chain.members.length !== 1 ||
+						chain.object.type !== "MetaProperty" ||
+						chain.object.meta.name !== "import" ||
+						chain.object.property.name !== "meta" ||
+						chain.members[0] !== "url"
+					)
+						return false;
+
+					return true;
+				};
+
+				/** @typedef {Record} Values */
+
+				/**
+				 * @param {JavascriptParser} parser the parser
+				 * @param {ObjectExpression} expr expression
+				 * @returns {{ expressions: Record, otherElements: (Property | SpreadElement)[], values: Values, spread: boolean, insertType: "comma" | "single", insertLocation: number }} parsed object
+				 */
+				const parseObjectExpression = (parser, expr) => {
+					/** @type {Values} */
+					const values = {};
+					/** @type {Record} */
+					const expressions = {};
+					/** @type {(Property | SpreadElement)[]} */
+					const otherElements = [];
+					let spread = false;
+					for (const prop of expr.properties) {
+						if (prop.type === "SpreadElement") {
+							spread = true;
+						} else if (
+							prop.type === "Property" &&
+							!prop.method &&
+							!prop.computed &&
+							prop.key.type === "Identifier"
+						) {
+							expressions[prop.key.name] = prop.value;
+							if (!prop.shorthand && !prop.value.type.endsWith("Pattern")) {
+								const value = parser.evaluateExpression(
+									/** @type {Expression} */
+									(prop.value)
+								);
+								if (value.isCompileTimeValue())
+									values[prop.key.name] = value.asCompileTimeValue();
+							}
+						} else {
+							otherElements.push(prop);
+						}
+					}
+					const insertType = expr.properties.length > 0 ? "comma" : "single";
+					const insertLocation = /** @type {Range} */ (
+						expr.properties[expr.properties.length - 1].range
+					)[1];
+					return {
+						expressions,
+						otherElements,
+						values,
+						spread,
+						insertType,
+						insertLocation
+					};
+				};
+
+				/**
+				 * @param {Parser} parser parser parser
+				 * @param {JavascriptParserOptions} parserOptions parserOptions
+				 * @returns {void}
+				 */
+				const parserPlugin = (parser, parserOptions) => {
+					if (parserOptions.worker === false) return;
+					const options = !Array.isArray(parserOptions.worker)
+						? ["..."]
+						: parserOptions.worker;
+					/**
+					 * @param {CallExpression} expr expression
+					 * @returns {boolean | void} true when handled
+					 */
+					const handleNewWorker = expr => {
+						if (expr.arguments.length === 0 || expr.arguments.length > 2)
+							return;
+						const [arg1, arg2] = expr.arguments;
+						if (arg1.type === "SpreadElement") return;
+						if (arg2 && arg2.type === "SpreadElement") return;
+
+						/** @type {string} */
+						let url;
+						/** @type {Range} */
+						let range;
+						/** @type {boolean} */
+						let needNewUrl = false;
+
+						if (arg1.type === "MemberExpression" && isMetaUrl(parser, arg1)) {
+							url = getUrl(parser.state.module);
+							range = [
+								/** @type {Range} */ (arg1.range)[0],
+								/** @type {Range} */ (arg1.range)[1]
+							];
+							needNewUrl = true;
+						} else {
+							const parsedUrl = parseModuleUrl(parser, arg1);
+							if (!parsedUrl) return;
+							[url, range] = parsedUrl;
+						}
+
+						const {
+							expressions,
+							otherElements,
+							values: options,
+							spread: hasSpreadInOptions,
+							insertType,
+							insertLocation
+						} = arg2 && arg2.type === "ObjectExpression"
+							? parseObjectExpression(parser, arg2)
+							: {
+									/** @type {Record} */
+									expressions: {},
+									otherElements: [],
+									/** @type {Values} */
+									values: {},
+									spread: false,
+									insertType: arg2 ? "spread" : "argument",
+									insertLocation: arg2
+										? /** @type {Range} */ (arg2.range)
+										: /** @type {Range} */ (arg1.range)[1]
+								};
+						const { options: importOptions, errors: commentErrors } =
+							parser.parseCommentOptions(/** @type {Range} */ (expr.range));
+
+						if (commentErrors) {
+							for (const e of commentErrors) {
+								const { comment } = e;
+								parser.state.module.addWarning(
+									new CommentCompilationWarning(
+										`Compilation error while processing magic comment(-s): /*${comment.value}*/: ${e.message}`,
+										/** @type {DependencyLocation} */ (comment.loc)
+									)
+								);
+							}
+						}
+
+						/** @type {EntryOptions} */
+						const entryOptions = {};
+
+						if (importOptions) {
+							if (importOptions.webpackIgnore !== undefined) {
+								if (typeof importOptions.webpackIgnore !== "boolean") {
+									parser.state.module.addWarning(
+										new UnsupportedFeatureWarning(
+											`\`webpackIgnore\` expected a boolean, but received: ${importOptions.webpackIgnore}.`,
+											/** @type {DependencyLocation} */ (expr.loc)
+										)
+									);
+								} else if (importOptions.webpackIgnore) {
+									return false;
+								}
+							}
+							if (importOptions.webpackEntryOptions !== undefined) {
+								if (
+									typeof importOptions.webpackEntryOptions !== "object" ||
+									importOptions.webpackEntryOptions === null
+								) {
+									parser.state.module.addWarning(
+										new UnsupportedFeatureWarning(
+											`\`webpackEntryOptions\` expected a object, but received: ${importOptions.webpackEntryOptions}.`,
+											/** @type {DependencyLocation} */ (expr.loc)
+										)
+									);
+								} else {
+									Object.assign(
+										entryOptions,
+										importOptions.webpackEntryOptions
+									);
+								}
+							}
+							if (importOptions.webpackChunkName !== undefined) {
+								if (typeof importOptions.webpackChunkName !== "string") {
+									parser.state.module.addWarning(
+										new UnsupportedFeatureWarning(
+											`\`webpackChunkName\` expected a string, but received: ${importOptions.webpackChunkName}.`,
+											/** @type {DependencyLocation} */ (expr.loc)
+										)
+									);
+								} else {
+									entryOptions.name = importOptions.webpackChunkName;
+								}
+							}
+						}
+
+						if (
+							!Object.prototype.hasOwnProperty.call(entryOptions, "name") &&
+							options &&
+							typeof options.name === "string"
+						) {
+							entryOptions.name = options.name;
+						}
+
+						if (entryOptions.runtime === undefined) {
+							const i = workerIndexMap.get(parser.state) || 0;
+							workerIndexMap.set(parser.state, i + 1);
+							const name = `${cachedContextify(
+								parser.state.module.identifier()
+							)}|${i}`;
+							const hash = createHash(
+								/** @type {HashFunction} */
+								(compilation.outputOptions.hashFunction)
+							);
+							hash.update(name);
+							const digest =
+								/** @type {string} */
+								(hash.digest(compilation.outputOptions.hashDigest));
+							entryOptions.runtime = digest.slice(
+								0,
+								compilation.outputOptions.hashDigestLength
+							);
+						}
+
+						const block = new AsyncDependenciesBlock({
+							name: entryOptions.name,
+							entryOptions: {
+								chunkLoading: this._chunkLoading,
+								wasmLoading: this._wasmLoading,
+								...entryOptions
+							}
+						});
+						block.loc = expr.loc;
+						const dep = new WorkerDependency(url, range, {
+							publicPath: this._workerPublicPath,
+							needNewUrl
+						});
+						dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+						block.addDependency(dep);
+						parser.state.module.addBlock(block);
+
+						if (compilation.outputOptions.trustedTypes) {
+							const dep = new CreateScriptUrlDependency(
+								/** @type {Range} */ (expr.arguments[0].range)
+							);
+							dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+							parser.state.module.addDependency(dep);
+						}
+
+						if (expressions.type) {
+							const expr = expressions.type;
+							if (options.type !== false) {
+								const dep = new ConstDependency(
+									this._module ? '"module"' : "undefined",
+									/** @type {Range} */ (expr.range)
+								);
+								dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+								parser.state.module.addPresentationalDependency(dep);
+								/** @type {EXPECTED_ANY} */
+								(expressions).type = undefined;
+							}
+						} else if (insertType === "comma") {
+							if (this._module || hasSpreadInOptions) {
+								const dep = new ConstDependency(
+									`, type: ${this._module ? '"module"' : "undefined"}`,
+									insertLocation
+								);
+								dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+								parser.state.module.addPresentationalDependency(dep);
+							}
+						} else if (insertType === "spread") {
+							const dep1 = new ConstDependency(
+								"Object.assign({}, ",
+								/** @type {Range} */ (insertLocation)[0]
+							);
+							const dep2 = new ConstDependency(
+								`, { type: ${this._module ? '"module"' : "undefined"} })`,
+								/** @type {Range} */ (insertLocation)[1]
+							);
+							dep1.loc = /** @type {DependencyLocation} */ (expr.loc);
+							dep2.loc = /** @type {DependencyLocation} */ (expr.loc);
+							parser.state.module.addPresentationalDependency(dep1);
+							parser.state.module.addPresentationalDependency(dep2);
+						} else if (insertType === "argument" && this._module) {
+							const dep = new ConstDependency(
+								', { type: "module" }',
+								insertLocation
+							);
+							dep.loc = /** @type {DependencyLocation} */ (expr.loc);
+							parser.state.module.addPresentationalDependency(dep);
+						}
+
+						parser.walkExpression(expr.callee);
+						for (const key of Object.keys(expressions)) {
+							if (expressions[key]) {
+								if (expressions[key].type.endsWith("Pattern")) continue;
+								parser.walkExpression(
+									/** @type {Expression} */
+									(expressions[key])
+								);
+							}
+						}
+						for (const prop of otherElements) {
+							parser.walkProperty(prop);
+						}
+						if (insertType === "spread") {
+							parser.walkExpression(arg2);
+						}
+
+						return true;
+					};
+					/**
+					 * @param {string} item item
+					 */
+					const processItem = item => {
+						if (
+							item.startsWith("*") &&
+							item.includes(".") &&
+							item.endsWith("()")
+						) {
+							const firstDot = item.indexOf(".");
+							const pattern = item.slice(1, firstDot);
+							const itemMembers = item.slice(firstDot + 1, -2);
+
+							parser.hooks.preDeclarator.tap(PLUGIN_NAME, (decl, statement) => {
+								if (decl.id.type === "Identifier" && decl.id.name === pattern) {
+									parser.tagVariable(decl.id.name, WorkerSpecifierTag);
+									return true;
+								}
+							});
+							parser.hooks.pattern.for(pattern).tap(PLUGIN_NAME, pattern => {
+								parser.tagVariable(pattern.name, WorkerSpecifierTag);
+								return true;
+							});
+							parser.hooks.callMemberChain
+								.for(WorkerSpecifierTag)
+								.tap(PLUGIN_NAME, (expression, members) => {
+									if (itemMembers !== members.join(".")) {
+										return;
+									}
+
+									return handleNewWorker(expression);
+								});
+						} else if (item.endsWith("()")) {
+							parser.hooks.call
+								.for(item.slice(0, -2))
+								.tap(PLUGIN_NAME, handleNewWorker);
+						} else {
+							const match = /^(.+?)(\(\))?\s+from\s+(.+)$/.exec(item);
+							if (match) {
+								const ids = match[1].split(".");
+								const call = match[2];
+								const source = match[3];
+								(call ? parser.hooks.call : parser.hooks.new)
+									.for(harmonySpecifierTag)
+									.tap(PLUGIN_NAME, expr => {
+										const settings = /** @type {HarmonySettings} */ (
+											parser.currentTagData
+										);
+										if (
+											!settings ||
+											settings.source !== source ||
+											!equals(settings.ids, ids)
+										) {
+											return;
+										}
+										return handleNewWorker(expr);
+									});
+							} else {
+								parser.hooks.new.for(item).tap(PLUGIN_NAME, handleNewWorker);
+							}
+						}
+					};
+					for (const item of options) {
+						if (item === "...") {
+							for (const itemFromDefault of DEFAULT_SYNTAX) {
+								processItem(itemFromDefault);
+							}
+						} else processItem(item);
+					}
+				};
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, parserPlugin);
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_ESM)
+					.tap(PLUGIN_NAME, parserPlugin);
+			}
+		);
+	}
+}
+module.exports = WorkerPlugin;
diff --git a/lib/dependencies/getFunctionExpression.js b/lib/dependencies/getFunctionExpression.js
index 0e73840e504..f4495b500ff 100644
--- a/lib/dependencies/getFunctionExpression.js
+++ b/lib/dependencies/getFunctionExpression.js
@@ -2,6 +2,18 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
+"use strict";
+
+/** @typedef {import("estree").ArrowFunctionExpression} ArrowFunctionExpression */
+/** @typedef {import("estree").Expression} Expression */
+/** @typedef {import("estree").FunctionExpression} FunctionExpression */
+/** @typedef {import("estree").SpreadElement} SpreadElement */
+
+/**
+ * @param {Expression | SpreadElement} expr expressions
+ * @returns {{fn: FunctionExpression | ArrowFunctionExpression, expressions: (Expression | SpreadElement)[], needThis: boolean | undefined } | undefined} function expression with additional information
+ */
 module.exports = expr => {
 	// 
 	if (
diff --git a/lib/dependencies/processExportInfo.js b/lib/dependencies/processExportInfo.js
new file mode 100644
index 00000000000..9bafcae635a
--- /dev/null
+++ b/lib/dependencies/processExportInfo.js
@@ -0,0 +1,67 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { UsageState } = require("../ExportsInfo");
+
+/** @typedef {import("../ExportsInfo").ExportInfo} ExportInfo */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+
+/** @typedef {string[][]} ReferencedExports */
+
+/**
+ * @param {RuntimeSpec} runtime the runtime
+ * @param {ReferencedExports} referencedExports list of referenced exports, will be added to
+ * @param {string[]} prefix export prefix
+ * @param {ExportInfo=} exportInfo the export info
+ * @param {boolean} defaultPointsToSelf when true, using default will reference itself
+ * @param {Set} alreadyVisited already visited export info (to handle circular reexports)
+ */
+const processExportInfo = (
+	runtime,
+	referencedExports,
+	prefix,
+	exportInfo,
+	defaultPointsToSelf = false,
+	alreadyVisited = new Set()
+) => {
+	if (!exportInfo) {
+		referencedExports.push(prefix);
+		return;
+	}
+	const used = exportInfo.getUsed(runtime);
+	if (used === UsageState.Unused) return;
+	if (alreadyVisited.has(exportInfo)) {
+		referencedExports.push(prefix);
+		return;
+	}
+	alreadyVisited.add(exportInfo);
+	if (
+		used !== UsageState.OnlyPropertiesUsed ||
+		!exportInfo.exportsInfo ||
+		exportInfo.exportsInfo.otherExportsInfo.getUsed(runtime) !==
+			UsageState.Unused
+	) {
+		alreadyVisited.delete(exportInfo);
+		referencedExports.push(prefix);
+		return;
+	}
+	const exportsInfo = exportInfo.exportsInfo;
+	for (const exportInfo of exportsInfo.orderedExports) {
+		processExportInfo(
+			runtime,
+			referencedExports,
+			defaultPointsToSelf && exportInfo.name === "default"
+				? prefix
+				: prefix.concat(exportInfo.name),
+			exportInfo,
+			false,
+			alreadyVisited
+		);
+	}
+	alreadyVisited.delete(exportInfo);
+};
+module.exports = processExportInfo;
diff --git a/lib/electron/ElectronTargetPlugin.js b/lib/electron/ElectronTargetPlugin.js
new file mode 100644
index 00000000000..e8c4e844a87
--- /dev/null
+++ b/lib/electron/ElectronTargetPlugin.js
@@ -0,0 +1,69 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const ExternalsPlugin = require("../ExternalsPlugin");
+
+/** @typedef {import("../Compiler")} Compiler */
+
+class ElectronTargetPlugin {
+	/**
+	 * @param {"main" | "preload" | "renderer"=} context in main, preload or renderer context?
+	 */
+	constructor(context) {
+		this._context = context;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		new ExternalsPlugin("node-commonjs", [
+			"clipboard",
+			"crash-reporter",
+			"electron",
+			"ipc",
+			"native-image",
+			"original-fs",
+			"screen",
+			"shell"
+		]).apply(compiler);
+		switch (this._context) {
+			case "main":
+				new ExternalsPlugin("node-commonjs", [
+					"app",
+					"auto-updater",
+					"browser-window",
+					"content-tracing",
+					"dialog",
+					"global-shortcut",
+					"ipc-main",
+					"menu",
+					"menu-item",
+					"power-monitor",
+					"power-save-blocker",
+					"protocol",
+					"session",
+					"tray",
+					"web-contents"
+				]).apply(compiler);
+				break;
+			case "preload":
+			case "renderer":
+				new ExternalsPlugin("node-commonjs", [
+					"desktop-capturer",
+					"ipc-renderer",
+					"remote",
+					"web-frame"
+				]).apply(compiler);
+				break;
+		}
+	}
+}
+
+module.exports = ElectronTargetPlugin;
diff --git a/lib/errors/BuildCycleError.js b/lib/errors/BuildCycleError.js
new file mode 100644
index 00000000000..a235fcebbe4
--- /dev/null
+++ b/lib/errors/BuildCycleError.js
@@ -0,0 +1,27 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const WebpackError = require("../WebpackError");
+
+/** @typedef {import("../Module")} Module */
+
+class BuildCycleError extends WebpackError {
+	/**
+	 * Creates an instance of ModuleDependencyError.
+	 * @param {Module} module the module starting the cycle
+	 */
+	constructor(module) {
+		super(
+			"There is a circular build dependency, which makes it impossible to create this module"
+		);
+
+		this.name = "BuildCycleError";
+		this.module = module;
+	}
+}
+
+module.exports = BuildCycleError;
diff --git a/lib/esm/ExportWebpackRequireRuntimeModule.js b/lib/esm/ExportWebpackRequireRuntimeModule.js
new file mode 100644
index 00000000000..30a275fa432
--- /dev/null
+++ b/lib/esm/ExportWebpackRequireRuntimeModule.js
@@ -0,0 +1,30 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+
+class ExportWebpackRequireRuntimeModule extends RuntimeModule {
+	constructor() {
+		super("export webpack runtime", RuntimeModule.STAGE_ATTACH);
+	}
+
+	/**
+	 * @returns {boolean} true, if the runtime module should get it's own scope
+	 */
+	shouldIsolate() {
+		return false;
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		return `export default ${RuntimeGlobals.require};`;
+	}
+}
+
+module.exports = ExportWebpackRequireRuntimeModule;
diff --git a/lib/esm/ModuleChunkFormatPlugin.js b/lib/esm/ModuleChunkFormatPlugin.js
new file mode 100644
index 00000000000..b7aa73bdbab
--- /dev/null
+++ b/lib/esm/ModuleChunkFormatPlugin.js
@@ -0,0 +1,223 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { ConcatSource } = require("webpack-sources");
+const { RuntimeGlobals } = require("..");
+const HotUpdateChunk = require("../HotUpdateChunk");
+const Template = require("../Template");
+const { getAllChunks } = require("../javascript/ChunkHelpers");
+const {
+	chunkHasJs,
+	getCompilationHooks,
+	getChunkFilenameTemplate
+} = require("../javascript/JavascriptModulesPlugin");
+const { updateHashForEntryStartup } = require("../javascript/StartupHelpers");
+const { getUndoPath } = require("../util/identifier");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Entrypoint")} Entrypoint */
+
+class ModuleChunkFormatPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.thisCompilation.tap(
+			"ModuleChunkFormatPlugin",
+			compilation => {
+				compilation.hooks.additionalChunkRuntimeRequirements.tap(
+					"ModuleChunkFormatPlugin",
+					(chunk, set) => {
+						if (chunk.hasRuntime()) return;
+						if (compilation.chunkGraph.getNumberOfEntryModules(chunk) > 0) {
+							set.add(RuntimeGlobals.require);
+							set.add(RuntimeGlobals.startupEntrypoint);
+							set.add(RuntimeGlobals.externalInstallChunk);
+						}
+					}
+				);
+				const hooks = getCompilationHooks(compilation);
+				hooks.renderChunk.tap(
+					"ModuleChunkFormatPlugin",
+					(modules, renderContext) => {
+						const { chunk, chunkGraph, runtimeTemplate } = renderContext;
+						const hotUpdateChunk =
+							chunk instanceof HotUpdateChunk ? chunk : null;
+						const source = new ConcatSource();
+						if (hotUpdateChunk) {
+							throw new Error(
+								"HMR is not implemented for module chunk format yet"
+							);
+						} else {
+							source.add(
+								`export const __webpack_id__ = ${JSON.stringify(chunk.id)};\n`
+							);
+							source.add(
+								`export const __webpack_ids__ = ${JSON.stringify(chunk.ids)};\n`
+							);
+							source.add("export const __webpack_modules__ = ");
+							source.add(modules);
+							source.add(";\n");
+							const runtimeModules =
+								chunkGraph.getChunkRuntimeModulesInOrder(chunk);
+							if (runtimeModules.length > 0) {
+								source.add("export const __webpack_runtime__ =\n");
+								source.add(
+									Template.renderChunkRuntimeModules(
+										runtimeModules,
+										renderContext
+									)
+								);
+							}
+							const entries = Array.from(
+								chunkGraph.getChunkEntryModulesWithChunkGroupIterable(chunk)
+							);
+							if (entries.length > 0) {
+								const runtimeChunk =
+									/** @type {Entrypoint[][]} */
+									(entries)[0][1].getRuntimeChunk();
+								const currentOutputName = compilation
+									.getPath(
+										getChunkFilenameTemplate(chunk, compilation.outputOptions),
+										{
+											chunk,
+											contentHashType: "javascript"
+										}
+									)
+									.replace(/^\/+/g, "")
+									.split("/");
+
+								/**
+								 * @param {Chunk} chunk the chunk
+								 * @returns {string} the relative path
+								 */
+								const getRelativePath = chunk => {
+									const baseOutputName = currentOutputName.slice();
+									const chunkOutputName = compilation
+										.getPath(
+											getChunkFilenameTemplate(
+												chunk,
+												compilation.outputOptions
+											),
+											{
+												chunk,
+												contentHashType: "javascript"
+											}
+										)
+										.replace(/^\/+/g, "")
+										.split("/");
+
+									// remove common parts except filename
+									while (
+										baseOutputName.length > 1 &&
+										chunkOutputName.length > 1 &&
+										baseOutputName[0] === chunkOutputName[0]
+									) {
+										baseOutputName.shift();
+										chunkOutputName.shift();
+									}
+									const last = chunkOutputName.join("/");
+									// create final path
+									return (
+										getUndoPath(baseOutputName.join("/"), last, true) + last
+									);
+								};
+
+								const entrySource = new ConcatSource();
+								entrySource.add(source);
+								entrySource.add(";\n\n// load runtime\n");
+								entrySource.add(
+									`import ${RuntimeGlobals.require} from ${JSON.stringify(
+										getRelativePath(/** @type {Chunk} */ (runtimeChunk))
+									)};\n`
+								);
+
+								const startupSource = new ConcatSource();
+								startupSource.add(
+									`var __webpack_exec__ = ${runtimeTemplate.returningFunction(
+										`${RuntimeGlobals.require}(${RuntimeGlobals.entryModuleId} = moduleId)`,
+										"moduleId"
+									)}\n`
+								);
+
+								const loadedChunks = new Set();
+								let index = 0;
+								for (let i = 0; i < entries.length; i++) {
+									const [module, entrypoint] = entries[i];
+									if (
+										!chunkGraph.getModuleSourceTypes(module).has("javascript")
+									) {
+										continue;
+									}
+									const final = i + 1 === entries.length;
+									const moduleId = chunkGraph.getModuleId(module);
+									const chunks = getAllChunks(
+										/** @type {Entrypoint} */ (entrypoint),
+										/** @type {Chunk} */ (runtimeChunk),
+										undefined
+									);
+									for (const chunk of chunks) {
+										if (
+											loadedChunks.has(chunk) ||
+											!chunkHasJs(chunk, chunkGraph)
+										)
+											continue;
+										loadedChunks.add(chunk);
+										startupSource.add(
+											`import * as __webpack_chunk_${index}__ from ${JSON.stringify(
+												getRelativePath(chunk)
+											)};\n`
+										);
+										startupSource.add(
+											`${RuntimeGlobals.externalInstallChunk}(__webpack_chunk_${index}__);\n`
+										);
+										index++;
+									}
+									startupSource.add(
+										`${
+											final ? `var ${RuntimeGlobals.exports} = ` : ""
+										}__webpack_exec__(${JSON.stringify(moduleId)});\n`
+									);
+								}
+
+								entrySource.add(
+									hooks.renderStartup.call(
+										startupSource,
+										entries[entries.length - 1][0],
+										{
+											...renderContext,
+											inlined: false
+										}
+									)
+								);
+								return entrySource;
+							}
+						}
+						return source;
+					}
+				);
+				hooks.chunkHash.tap(
+					"ModuleChunkFormatPlugin",
+					(chunk, hash, { chunkGraph, runtimeTemplate }) => {
+						if (chunk.hasRuntime()) return;
+						hash.update("ModuleChunkFormatPlugin");
+						hash.update("1");
+						const entries = Array.from(
+							chunkGraph.getChunkEntryModulesWithChunkGroupIterable(chunk)
+						);
+						updateHashForEntryStartup(hash, chunkGraph, entries, chunk);
+					}
+				);
+			}
+		);
+	}
+}
+
+module.exports = ModuleChunkFormatPlugin;
diff --git a/lib/esm/ModuleChunkLoadingPlugin.js b/lib/esm/ModuleChunkLoadingPlugin.js
new file mode 100644
index 00000000000..79df4ce5cc5
--- /dev/null
+++ b/lib/esm/ModuleChunkLoadingPlugin.js
@@ -0,0 +1,106 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const ExportWebpackRequireRuntimeModule = require("./ExportWebpackRequireRuntimeModule");
+const ModuleChunkLoadingRuntimeModule = require("./ModuleChunkLoadingRuntimeModule");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compiler")} Compiler */
+
+const PLUGIN_NAME = "ModuleChunkLoadingPlugin";
+
+class ModuleChunkLoadingPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.thisCompilation.tap(PLUGIN_NAME, compilation => {
+			const globalChunkLoading = compilation.outputOptions.chunkLoading;
+			/**
+			 * @param {Chunk} chunk chunk to check
+			 * @returns {boolean} true, when the plugin is enabled for the chunk
+			 */
+			const isEnabledForChunk = chunk => {
+				const options = chunk.getEntryOptions();
+				const chunkLoading =
+					options && options.chunkLoading !== undefined
+						? options.chunkLoading
+						: globalChunkLoading;
+				return chunkLoading === "import";
+			};
+			const onceForChunkSet = new WeakSet();
+			/**
+			 * @param {Chunk} chunk chunk to check
+			 * @param {Set} set runtime requirements
+			 */
+			const handler = (chunk, set) => {
+				if (onceForChunkSet.has(chunk)) return;
+				onceForChunkSet.add(chunk);
+				if (!isEnabledForChunk(chunk)) return;
+				set.add(RuntimeGlobals.moduleFactoriesAddOnly);
+				set.add(RuntimeGlobals.hasOwnProperty);
+				compilation.addRuntimeModule(
+					chunk,
+					new ModuleChunkLoadingRuntimeModule(set)
+				);
+			};
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.ensureChunkHandlers)
+				.tap(PLUGIN_NAME, handler);
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.baseURI)
+				.tap(PLUGIN_NAME, handler);
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.externalInstallChunk)
+				.tap(PLUGIN_NAME, handler);
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.onChunksLoaded)
+				.tap(PLUGIN_NAME, handler);
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.externalInstallChunk)
+				.tap(PLUGIN_NAME, (chunk, set) => {
+					if (!isEnabledForChunk(chunk)) return;
+					compilation.addRuntimeModule(
+						chunk,
+						new ExportWebpackRequireRuntimeModule()
+					);
+				});
+
+			// We need public path only when we prefetch/preload chunk or public path is not `auto`
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.prefetchChunkHandlers)
+				.tap(PLUGIN_NAME, (chunk, set) => {
+					if (!isEnabledForChunk(chunk)) return;
+					set.add(RuntimeGlobals.publicPath);
+				});
+
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.preloadChunkHandlers)
+				.tap(PLUGIN_NAME, (chunk, set) => {
+					if (!isEnabledForChunk(chunk)) return;
+					set.add(RuntimeGlobals.publicPath);
+				});
+
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.ensureChunkHandlers)
+				.tap(PLUGIN_NAME, (chunk, set) => {
+					if (!isEnabledForChunk(chunk)) return;
+
+					if (compilation.outputOptions.publicPath !== "auto") {
+						set.add(RuntimeGlobals.publicPath);
+					}
+
+					set.add(RuntimeGlobals.getChunkScriptFilename);
+				});
+		});
+	}
+}
+
+module.exports = ModuleChunkLoadingPlugin;
diff --git a/lib/esm/ModuleChunkLoadingRuntimeModule.js b/lib/esm/ModuleChunkLoadingRuntimeModule.js
new file mode 100644
index 00000000000..347e49c5a2c
--- /dev/null
+++ b/lib/esm/ModuleChunkLoadingRuntimeModule.js
@@ -0,0 +1,354 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const { SyncWaterfallHook } = require("tapable");
+const Compilation = require("../Compilation");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+const Template = require("../Template");
+const {
+	getChunkFilenameTemplate,
+	chunkHasJs
+} = require("../javascript/JavascriptModulesPlugin");
+const { getInitialChunkIds } = require("../javascript/StartupHelpers");
+const compileBooleanMatcher = require("../util/compileBooleanMatcher");
+const { getUndoPath } = require("../util/identifier");
+
+/** @typedef {import("../../declarations/WebpackOptions").Environment} Environment */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Module").ReadOnlyRuntimeRequirements} ReadOnlyRuntimeRequirements */
+
+/**
+ * @typedef {object} JsonpCompilationPluginHooks
+ * @property {SyncWaterfallHook<[string, Chunk]>} linkPreload
+ * @property {SyncWaterfallHook<[string, Chunk]>} linkPrefetch
+ */
+
+/** @type {WeakMap} */
+const compilationHooksMap = new WeakMap();
+
+class ModuleChunkLoadingRuntimeModule extends RuntimeModule {
+	/**
+	 * @param {Compilation} compilation the compilation
+	 * @returns {JsonpCompilationPluginHooks} hooks
+	 */
+	static getCompilationHooks(compilation) {
+		if (!(compilation instanceof Compilation)) {
+			throw new TypeError(
+				"The 'compilation' argument must be an instance of Compilation"
+			);
+		}
+		let hooks = compilationHooksMap.get(compilation);
+		if (hooks === undefined) {
+			hooks = {
+				linkPreload: new SyncWaterfallHook(["source", "chunk"]),
+				linkPrefetch: new SyncWaterfallHook(["source", "chunk"])
+			};
+			compilationHooksMap.set(compilation, hooks);
+		}
+		return hooks;
+	}
+
+	/**
+	 * @param {ReadOnlyRuntimeRequirements} runtimeRequirements runtime requirements
+	 */
+	constructor(runtimeRequirements) {
+		super("import chunk loading", RuntimeModule.STAGE_ATTACH);
+		this._runtimeRequirements = runtimeRequirements;
+	}
+
+	/**
+	 * @private
+	 * @param {Chunk} chunk chunk
+	 * @param {string} rootOutputDir root output directory
+	 * @returns {string} generated code
+	 */
+	_generateBaseUri(chunk, rootOutputDir) {
+		const options = chunk.getEntryOptions();
+		if (options && options.baseUri) {
+			return `${RuntimeGlobals.baseURI} = ${JSON.stringify(options.baseUri)};`;
+		}
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const {
+			outputOptions: { importMetaName }
+		} = compilation;
+		return `${RuntimeGlobals.baseURI} = new URL(${JSON.stringify(
+			rootOutputDir
+		)}, ${importMetaName}.url);`;
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const chunkGraph = /** @type {ChunkGraph} */ (this.chunkGraph);
+		const chunk = /** @type {Chunk} */ (this.chunk);
+		const environment =
+			/** @type {Environment} */
+			(compilation.outputOptions.environment);
+		const {
+			runtimeTemplate,
+			outputOptions: { importFunctionName, crossOriginLoading, charset }
+		} = compilation;
+		const fn = RuntimeGlobals.ensureChunkHandlers;
+		const withBaseURI = this._runtimeRequirements.has(RuntimeGlobals.baseURI);
+		const withExternalInstallChunk = this._runtimeRequirements.has(
+			RuntimeGlobals.externalInstallChunk
+		);
+		const withLoading = this._runtimeRequirements.has(
+			RuntimeGlobals.ensureChunkHandlers
+		);
+		const withOnChunkLoad = this._runtimeRequirements.has(
+			RuntimeGlobals.onChunksLoaded
+		);
+		const withHmr = this._runtimeRequirements.has(
+			RuntimeGlobals.hmrDownloadUpdateHandlers
+		);
+		const { linkPreload, linkPrefetch } =
+			ModuleChunkLoadingRuntimeModule.getCompilationHooks(compilation);
+		const isNeutralPlatform = runtimeTemplate.isNeutralPlatform();
+		const withPrefetch =
+			(environment.document || isNeutralPlatform) &&
+			this._runtimeRequirements.has(RuntimeGlobals.prefetchChunkHandlers) &&
+			chunk.hasChildByOrder(chunkGraph, "prefetch", true, chunkHasJs);
+		const withPreload =
+			(environment.document || isNeutralPlatform) &&
+			this._runtimeRequirements.has(RuntimeGlobals.preloadChunkHandlers) &&
+			chunk.hasChildByOrder(chunkGraph, "preload", true, chunkHasJs);
+		const conditionMap = chunkGraph.getChunkConditionMap(chunk, chunkHasJs);
+		const hasJsMatcher = compileBooleanMatcher(conditionMap);
+		const initialChunkIds = getInitialChunkIds(chunk, chunkGraph, chunkHasJs);
+
+		const outputName = compilation.getPath(
+			getChunkFilenameTemplate(chunk, compilation.outputOptions),
+			{
+				chunk,
+				contentHashType: "javascript"
+			}
+		);
+		const rootOutputDir = getUndoPath(
+			outputName,
+			/** @type {string} */ (compilation.outputOptions.path),
+			true
+		);
+
+		const stateExpression = withHmr
+			? `${RuntimeGlobals.hmrRuntimeStatePrefix}_module`
+			: undefined;
+
+		return Template.asString([
+			withBaseURI
+				? this._generateBaseUri(chunk, rootOutputDir)
+				: "// no baseURI",
+			"",
+			"// object to store loaded and loading chunks",
+			"// undefined = chunk not loaded, null = chunk preloaded/prefetched",
+			"// [resolve, Promise] = chunk loading, 0 = chunk loaded",
+			`var installedChunks = ${
+				stateExpression ? `${stateExpression} = ${stateExpression} || ` : ""
+			}{`,
+			Template.indent(
+				Array.from(initialChunkIds, id => `${JSON.stringify(id)}: 0`).join(
+					",\n"
+				)
+			),
+			"};",
+			"",
+			withLoading || withExternalInstallChunk
+				? `var installChunk = ${runtimeTemplate.basicFunction("data", [
+						runtimeTemplate.destructureObject(
+							["__webpack_ids__", "__webpack_modules__", "__webpack_runtime__"],
+							"data"
+						),
+						'// add "modules" to the modules object,',
+						'// then flag all "ids" as loaded and fire callback',
+						"var moduleId, chunkId, i = 0;",
+						"for(moduleId in __webpack_modules__) {",
+						Template.indent([
+							`if(${RuntimeGlobals.hasOwnProperty}(__webpack_modules__, moduleId)) {`,
+							Template.indent(
+								`${RuntimeGlobals.moduleFactories}[moduleId] = __webpack_modules__[moduleId];`
+							),
+							"}"
+						]),
+						"}",
+						`if(__webpack_runtime__) __webpack_runtime__(${RuntimeGlobals.require});`,
+						"for(;i < __webpack_ids__.length; i++) {",
+						Template.indent([
+							"chunkId = __webpack_ids__[i];",
+							`if(${RuntimeGlobals.hasOwnProperty}(installedChunks, chunkId) && installedChunks[chunkId]) {`,
+							Template.indent("installedChunks[chunkId][0]();"),
+							"}",
+							"installedChunks[__webpack_ids__[i]] = 0;"
+						]),
+						"}",
+						withOnChunkLoad ? `${RuntimeGlobals.onChunksLoaded}();` : ""
+					])}`
+				: "// no install chunk",
+			"",
+			withLoading
+				? Template.asString([
+						`${fn}.j = ${runtimeTemplate.basicFunction(
+							"chunkId, promises",
+							hasJsMatcher !== false
+								? Template.indent([
+										"// import() chunk loading for javascript",
+										`var installedChunkData = ${RuntimeGlobals.hasOwnProperty}(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;`,
+										'if(installedChunkData !== 0) { // 0 means "already installed".',
+										Template.indent([
+											"",
+											'// a Promise means "currently loading".',
+											"if(installedChunkData) {",
+											Template.indent([
+												"promises.push(installedChunkData[1]);"
+											]),
+											"} else {",
+											Template.indent([
+												hasJsMatcher === true
+													? "if(true) { // all chunks have JS"
+													: `if(${hasJsMatcher("chunkId")}) {`,
+												Template.indent([
+													"// setup Promise in chunk cache",
+													`var promise = ${importFunctionName}(${
+														compilation.outputOptions.publicPath === "auto"
+															? ""
+															: `${RuntimeGlobals.publicPath} + `
+													}${JSON.stringify(rootOutputDir)} + ${
+														RuntimeGlobals.getChunkScriptFilename
+													}(chunkId)).then(installChunk, ${runtimeTemplate.basicFunction(
+														"e",
+														[
+															"if(installedChunks[chunkId] !== 0) installedChunks[chunkId] = undefined;",
+															"throw e;"
+														]
+													)});`,
+													`var promise = Promise.race([promise, new Promise(${runtimeTemplate.expressionFunction(
+														"installedChunkData = installedChunks[chunkId] = [resolve]",
+														"resolve"
+													)})])`,
+													"promises.push(installedChunkData[1] = promise);"
+												]),
+												hasJsMatcher === true
+													? "}"
+													: "} else installedChunks[chunkId] = 0;"
+											]),
+											"}"
+										]),
+										"}"
+									])
+								: Template.indent(["installedChunks[chunkId] = 0;"])
+						)};`
+					])
+				: "// no chunk on demand loading",
+			"",
+			withPrefetch && hasJsMatcher !== false
+				? `${
+						RuntimeGlobals.prefetchChunkHandlers
+					}.j = ${runtimeTemplate.basicFunction("chunkId", [
+						isNeutralPlatform
+							? "if (typeof document === 'undefined') return;"
+							: "",
+						`if((!${
+							RuntimeGlobals.hasOwnProperty
+						}(installedChunks, chunkId) || installedChunks[chunkId] === undefined) && ${
+							hasJsMatcher === true ? "true" : hasJsMatcher("chunkId")
+						}) {`,
+						Template.indent([
+							"installedChunks[chunkId] = null;",
+							linkPrefetch.call(
+								Template.asString([
+									"var link = document.createElement('link');",
+									charset ? "link.charset = 'utf-8';" : "",
+									crossOriginLoading
+										? `link.crossOrigin = ${JSON.stringify(
+												crossOriginLoading
+											)};`
+										: "",
+									`if (${RuntimeGlobals.scriptNonce}) {`,
+									Template.indent(
+										`link.setAttribute("nonce", ${RuntimeGlobals.scriptNonce});`
+									),
+									"}",
+									'link.rel = "prefetch";',
+									'link.as = "script";',
+									`link.href = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.getChunkScriptFilename}(chunkId);`
+								]),
+								chunk
+							),
+							"document.head.appendChild(link);"
+						]),
+						"}"
+					])};`
+				: "// no prefetching",
+			"",
+			withPreload && hasJsMatcher !== false
+				? `${
+						RuntimeGlobals.preloadChunkHandlers
+					}.j = ${runtimeTemplate.basicFunction("chunkId", [
+						isNeutralPlatform
+							? "if (typeof document === 'undefined') return;"
+							: "",
+						`if((!${
+							RuntimeGlobals.hasOwnProperty
+						}(installedChunks, chunkId) || installedChunks[chunkId] === undefined) && ${
+							hasJsMatcher === true ? "true" : hasJsMatcher("chunkId")
+						}) {`,
+						Template.indent([
+							"installedChunks[chunkId] = null;",
+							linkPreload.call(
+								Template.asString([
+									"var link = document.createElement('link');",
+									charset ? "link.charset = 'utf-8';" : "",
+									`if (${RuntimeGlobals.scriptNonce}) {`,
+									Template.indent(
+										`link.setAttribute("nonce", ${RuntimeGlobals.scriptNonce});`
+									),
+									"}",
+									'link.rel = "modulepreload";',
+									`link.href = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.getChunkScriptFilename}(chunkId);`,
+									crossOriginLoading
+										? crossOriginLoading === "use-credentials"
+											? 'link.crossOrigin = "use-credentials";'
+											: Template.asString([
+													"if (link.href.indexOf(window.location.origin + '/') !== 0) {",
+													Template.indent(
+														`link.crossOrigin = ${JSON.stringify(
+															crossOriginLoading
+														)};`
+													),
+													"}"
+												])
+										: ""
+								]),
+								chunk
+							),
+							"document.head.appendChild(link);"
+						]),
+						"}"
+					])};`
+				: "// no preloaded",
+			"",
+			withExternalInstallChunk
+				? Template.asString([
+						`${RuntimeGlobals.externalInstallChunk} = installChunk;`
+					])
+				: "// no external install chunk",
+			"",
+			withOnChunkLoad
+				? `${
+						RuntimeGlobals.onChunksLoaded
+					}.j = ${runtimeTemplate.returningFunction(
+						"installedChunks[chunkId] === 0",
+						"chunkId"
+					)};`
+				: "// no on chunks loaded"
+		]);
+	}
+}
+
+module.exports = ModuleChunkLoadingRuntimeModule;
diff --git a/lib/formatLocation.js b/lib/formatLocation.js
index f608cd496dc..780d4a475ca 100644
--- a/lib/formatLocation.js
+++ b/lib/formatLocation.js
@@ -8,42 +8,27 @@
 /** @typedef {import("./Dependency").DependencyLocation} DependencyLocation */
 /** @typedef {import("./Dependency").SourcePosition} SourcePosition */
 
-// TODO webpack 5: pos must be SourcePosition
 /**
- * @param {SourcePosition|DependencyLocation|string} pos position
+ * @param {SourcePosition} pos position
  * @returns {string} formatted position
  */
 const formatPosition = pos => {
-	if (pos === null) return "";
-	// TODO webpack 5: Simplify this
-	if (typeof pos === "string") return pos;
-	if (typeof pos === "number") return `${pos}`;
-	if (typeof pos === "object") {
+	if (pos && typeof pos === "object") {
 		if ("line" in pos && "column" in pos) {
 			return `${pos.line}:${pos.column}`;
 		} else if ("line" in pos) {
 			return `${pos.line}:?`;
-		} else if ("index" in pos) {
-			// TODO webpack 5 remove this case
-			return `+${pos.index}`;
-		} else {
-			return "";
 		}
 	}
 	return "";
 };
 
-// TODO webpack 5: loc must be DependencyLocation
 /**
- * @param {DependencyLocation|SourcePosition|string} loc location
+ * @param {DependencyLocation} loc location
  * @returns {string} formatted location
  */
 const formatLocation = loc => {
-	if (loc === null) return "";
-	// TODO webpack 5: Simplify this
-	if (typeof loc === "string") return loc;
-	if (typeof loc === "number") return `${loc}`;
-	if (typeof loc === "object") {
+	if (loc && typeof loc === "object") {
 		if ("start" in loc && loc.start && "end" in loc && loc.end) {
 			if (
 				typeof loc.start === "object" &&
@@ -54,9 +39,17 @@ const formatLocation = loc => {
 				loc.start.line === loc.end.line
 			) {
 				return `${formatPosition(loc.start)}-${loc.end.column}`;
-			} else {
-				return `${formatPosition(loc.start)}-${formatPosition(loc.end)}`;
+			} else if (
+				typeof loc.start === "object" &&
+				typeof loc.start.line === "number" &&
+				typeof loc.start.column !== "number" &&
+				typeof loc.end === "object" &&
+				typeof loc.end.line === "number" &&
+				typeof loc.end.column !== "number"
+			) {
+				return `${loc.start.line}-${loc.end.line}`;
 			}
+			return `${formatPosition(loc.start)}-${formatPosition(loc.end)}`;
 		}
 		if ("start" in loc && loc.start) {
 			return formatPosition(loc.start);
@@ -67,7 +60,6 @@ const formatLocation = loc => {
 		if ("name" in loc) {
 			return loc.name;
 		}
-		return formatPosition(loc);
 	}
 	return "";
 };
diff --git a/lib/hmr/HotModuleReplacement.runtime.js b/lib/hmr/HotModuleReplacement.runtime.js
new file mode 100644
index 00000000000..e9fec891700
--- /dev/null
+++ b/lib/hmr/HotModuleReplacement.runtime.js
@@ -0,0 +1,407 @@
+// @ts-nocheck
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+var $interceptModuleExecution$ = undefined;
+var $moduleCache$ = undefined;
+// eslint-disable-next-line no-unused-vars
+var $hmrModuleData$ = undefined;
+/** @type {() => Promise}  */
+var $hmrDownloadManifest$ = undefined;
+var $hmrDownloadUpdateHandlers$ = undefined;
+var $hmrInvalidateModuleHandlers$ = undefined;
+var __webpack_require__ = undefined;
+
+module.exports = function () {
+	var currentModuleData = {};
+	var installedModules = $moduleCache$;
+
+	// module and require creation
+	var currentChildModule;
+	var currentParents = [];
+
+	// status
+	var registeredStatusHandlers = [];
+	var currentStatus = "idle";
+
+	// while downloading
+	var blockingPromises = 0;
+	var blockingPromisesWaiting = [];
+
+	// The update info
+	var currentUpdateApplyHandlers;
+	var queuedInvalidatedModules;
+
+	$hmrModuleData$ = currentModuleData;
+
+	$interceptModuleExecution$.push(function (options) {
+		var module = options.module;
+		var require = createRequire(options.require, options.id);
+		module.hot = createModuleHotObject(options.id, module);
+		module.parents = currentParents;
+		module.children = [];
+		currentParents = [];
+		options.require = require;
+	});
+
+	$hmrDownloadUpdateHandlers$ = {};
+	$hmrInvalidateModuleHandlers$ = {};
+
+	function createRequire(require, moduleId) {
+		var me = installedModules[moduleId];
+		if (!me) return require;
+		var fn = function (request) {
+			if (me.hot.active) {
+				if (installedModules[request]) {
+					var parents = installedModules[request].parents;
+					if (parents.indexOf(moduleId) === -1) {
+						parents.push(moduleId);
+					}
+				} else {
+					currentParents = [moduleId];
+					currentChildModule = request;
+				}
+				if (me.children.indexOf(request) === -1) {
+					me.children.push(request);
+				}
+			} else {
+				console.warn(
+					"[HMR] unexpected require(" +
+						request +
+						") from disposed module " +
+						moduleId
+				);
+				currentParents = [];
+			}
+			return require(request);
+		};
+		var createPropertyDescriptor = function (name) {
+			return {
+				configurable: true,
+				enumerable: true,
+				get: function () {
+					return require[name];
+				},
+				set: function (value) {
+					require[name] = value;
+				}
+			};
+		};
+		for (var name in require) {
+			if (Object.prototype.hasOwnProperty.call(require, name) && name !== "e") {
+				Object.defineProperty(fn, name, createPropertyDescriptor(name));
+			}
+		}
+		fn.e = function (chunkId, fetchPriority) {
+			return trackBlockingPromise(require.e(chunkId, fetchPriority));
+		};
+		return fn;
+	}
+
+	function createModuleHotObject(moduleId, me) {
+		var _main = currentChildModule !== moduleId;
+		var hot = {
+			// private stuff
+			_acceptedDependencies: {},
+			_acceptedErrorHandlers: {},
+			_declinedDependencies: {},
+			_selfAccepted: false,
+			_selfDeclined: false,
+			_selfInvalidated: false,
+			_disposeHandlers: [],
+			_main: _main,
+			_requireSelf: function () {
+				currentParents = me.parents.slice();
+				currentChildModule = _main ? undefined : moduleId;
+				__webpack_require__(moduleId);
+			},
+
+			// Module API
+			active: true,
+			accept: function (dep, callback, errorHandler) {
+				if (dep === undefined) hot._selfAccepted = true;
+				else if (typeof dep === "function") hot._selfAccepted = dep;
+				else if (typeof dep === "object" && dep !== null) {
+					for (var i = 0; i < dep.length; i++) {
+						hot._acceptedDependencies[dep[i]] = callback || function () {};
+						hot._acceptedErrorHandlers[dep[i]] = errorHandler;
+					}
+				} else {
+					hot._acceptedDependencies[dep] = callback || function () {};
+					hot._acceptedErrorHandlers[dep] = errorHandler;
+				}
+			},
+			decline: function (dep) {
+				if (dep === undefined) hot._selfDeclined = true;
+				else if (typeof dep === "object" && dep !== null)
+					for (var i = 0; i < dep.length; i++)
+						hot._declinedDependencies[dep[i]] = true;
+				else hot._declinedDependencies[dep] = true;
+			},
+			dispose: function (callback) {
+				hot._disposeHandlers.push(callback);
+			},
+			addDisposeHandler: function (callback) {
+				hot._disposeHandlers.push(callback);
+			},
+			removeDisposeHandler: function (callback) {
+				var idx = hot._disposeHandlers.indexOf(callback);
+				if (idx >= 0) hot._disposeHandlers.splice(idx, 1);
+			},
+			invalidate: function () {
+				this._selfInvalidated = true;
+				switch (currentStatus) {
+					case "idle":
+						currentUpdateApplyHandlers = [];
+						Object.keys($hmrInvalidateModuleHandlers$).forEach(function (key) {
+							$hmrInvalidateModuleHandlers$[key](
+								moduleId,
+								currentUpdateApplyHandlers
+							);
+						});
+						setStatus("ready");
+						break;
+					case "ready":
+						Object.keys($hmrInvalidateModuleHandlers$).forEach(function (key) {
+							$hmrInvalidateModuleHandlers$[key](
+								moduleId,
+								currentUpdateApplyHandlers
+							);
+						});
+						break;
+					case "prepare":
+					case "check":
+					case "dispose":
+					case "apply":
+						(queuedInvalidatedModules = queuedInvalidatedModules || []).push(
+							moduleId
+						);
+						break;
+					default:
+						// ignore requests in error states
+						break;
+				}
+			},
+
+			// Management API
+			check: hotCheck,
+			apply: hotApply,
+			status: function (l) {
+				if (!l) return currentStatus;
+				registeredStatusHandlers.push(l);
+			},
+			addStatusHandler: function (l) {
+				registeredStatusHandlers.push(l);
+			},
+			removeStatusHandler: function (l) {
+				var idx = registeredStatusHandlers.indexOf(l);
+				if (idx >= 0) registeredStatusHandlers.splice(idx, 1);
+			},
+
+			// inherit from previous dispose call
+			data: currentModuleData[moduleId]
+		};
+		currentChildModule = undefined;
+		return hot;
+	}
+
+	function setStatus(newStatus) {
+		currentStatus = newStatus;
+		var results = [];
+
+		for (var i = 0; i < registeredStatusHandlers.length; i++)
+			results[i] = registeredStatusHandlers[i].call(null, newStatus);
+
+		return Promise.all(results).then(function () {});
+	}
+
+	function unblock() {
+		if (--blockingPromises === 0) {
+			setStatus("ready").then(function () {
+				if (blockingPromises === 0) {
+					var list = blockingPromisesWaiting;
+					blockingPromisesWaiting = [];
+					for (var i = 0; i < list.length; i++) {
+						list[i]();
+					}
+				}
+			});
+		}
+	}
+
+	function trackBlockingPromise(promise) {
+		switch (currentStatus) {
+			case "ready":
+				setStatus("prepare");
+			/* fallthrough */
+			case "prepare":
+				blockingPromises++;
+				promise.then(unblock, unblock);
+				return promise;
+			default:
+				return promise;
+		}
+	}
+
+	function waitForBlockingPromises(fn) {
+		if (blockingPromises === 0) return fn();
+		return new Promise(function (resolve) {
+			blockingPromisesWaiting.push(function () {
+				resolve(fn());
+			});
+		});
+	}
+
+	function hotCheck(applyOnUpdate) {
+		if (currentStatus !== "idle") {
+			throw new Error("check() is only allowed in idle status");
+		}
+		return setStatus("check")
+			.then($hmrDownloadManifest$)
+			.then(function (update) {
+				if (!update) {
+					return setStatus(applyInvalidatedModules() ? "ready" : "idle").then(
+						function () {
+							return null;
+						}
+					);
+				}
+
+				return setStatus("prepare").then(function () {
+					var updatedModules = [];
+					currentUpdateApplyHandlers = [];
+
+					return Promise.all(
+						Object.keys($hmrDownloadUpdateHandlers$).reduce(function (
+							promises,
+							key
+						) {
+							$hmrDownloadUpdateHandlers$[key](
+								update.c,
+								update.r,
+								update.m,
+								promises,
+								currentUpdateApplyHandlers,
+								updatedModules
+							);
+							return promises;
+						}, [])
+					).then(function () {
+						return waitForBlockingPromises(function () {
+							if (applyOnUpdate) {
+								return internalApply(applyOnUpdate);
+							}
+							return setStatus("ready").then(function () {
+								return updatedModules;
+							});
+						});
+					});
+				});
+			});
+	}
+
+	function hotApply(options) {
+		if (currentStatus !== "ready") {
+			return Promise.resolve().then(function () {
+				throw new Error(
+					"apply() is only allowed in ready status (state: " +
+						currentStatus +
+						")"
+				);
+			});
+		}
+		return internalApply(options);
+	}
+
+	function internalApply(options) {
+		options = options || {};
+
+		applyInvalidatedModules();
+
+		var results = currentUpdateApplyHandlers.map(function (handler) {
+			return handler(options);
+		});
+		currentUpdateApplyHandlers = undefined;
+
+		var errors = results
+			.map(function (r) {
+				return r.error;
+			})
+			.filter(Boolean);
+
+		if (errors.length > 0) {
+			return setStatus("abort").then(function () {
+				throw errors[0];
+			});
+		}
+
+		// Now in "dispose" phase
+		var disposePromise = setStatus("dispose");
+
+		results.forEach(function (result) {
+			if (result.dispose) result.dispose();
+		});
+
+		// Now in "apply" phase
+		var applyPromise = setStatus("apply");
+
+		var error;
+		var reportError = function (err) {
+			if (!error) error = err;
+		};
+
+		var outdatedModules = [];
+		results.forEach(function (result) {
+			if (result.apply) {
+				var modules = result.apply(reportError);
+				if (modules) {
+					for (var i = 0; i < modules.length; i++) {
+						outdatedModules.push(modules[i]);
+					}
+				}
+			}
+		});
+
+		return Promise.all([disposePromise, applyPromise]).then(function () {
+			// handle errors in accept handlers and self accepted module load
+			if (error) {
+				return setStatus("fail").then(function () {
+					throw error;
+				});
+			}
+
+			if (queuedInvalidatedModules) {
+				return internalApply(options).then(function (list) {
+					outdatedModules.forEach(function (moduleId) {
+						if (list.indexOf(moduleId) < 0) list.push(moduleId);
+					});
+					return list;
+				});
+			}
+
+			return setStatus("idle").then(function () {
+				return outdatedModules;
+			});
+		});
+	}
+
+	function applyInvalidatedModules() {
+		if (queuedInvalidatedModules) {
+			if (!currentUpdateApplyHandlers) currentUpdateApplyHandlers = [];
+			Object.keys($hmrInvalidateModuleHandlers$).forEach(function (key) {
+				queuedInvalidatedModules.forEach(function (moduleId) {
+					$hmrInvalidateModuleHandlers$[key](
+						moduleId,
+						currentUpdateApplyHandlers
+					);
+				});
+			});
+			queuedInvalidatedModules = undefined;
+			return true;
+		}
+	}
+};
diff --git a/lib/hmr/HotModuleReplacementRuntimeModule.js b/lib/hmr/HotModuleReplacementRuntimeModule.js
new file mode 100644
index 00000000000..b1a254b6db9
--- /dev/null
+++ b/lib/hmr/HotModuleReplacementRuntimeModule.js
@@ -0,0 +1,42 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+const Template = require("../Template");
+
+class HotModuleReplacementRuntimeModule extends RuntimeModule {
+	constructor() {
+		super("hot module replacement", RuntimeModule.STAGE_BASIC);
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		return Template.getFunctionContent(
+			require("./HotModuleReplacement.runtime.js")
+		)
+			.replace(
+				/\$interceptModuleExecution\$/g,
+				RuntimeGlobals.interceptModuleExecution
+			)
+			.replace(/\$moduleCache\$/g, RuntimeGlobals.moduleCache)
+			.replace(/\$hmrModuleData\$/g, RuntimeGlobals.hmrModuleData)
+			.replace(/\$hmrDownloadManifest\$/g, RuntimeGlobals.hmrDownloadManifest)
+			.replace(
+				/\$hmrInvalidateModuleHandlers\$/g,
+				RuntimeGlobals.hmrInvalidateModuleHandlers
+			)
+			.replace(
+				/\$hmrDownloadUpdateHandlers\$/g,
+				RuntimeGlobals.hmrDownloadUpdateHandlers
+			);
+	}
+}
+
+module.exports = HotModuleReplacementRuntimeModule;
diff --git a/lib/hmr/JavascriptHotModuleReplacement.runtime.js b/lib/hmr/JavascriptHotModuleReplacement.runtime.js
new file mode 100644
index 00000000000..109a2cea695
--- /dev/null
+++ b/lib/hmr/JavascriptHotModuleReplacement.runtime.js
@@ -0,0 +1,460 @@
+// @ts-nocheck
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+var $installedChunks$ = undefined;
+var $loadUpdateChunk$ = undefined;
+var $moduleCache$ = undefined;
+var $moduleFactories$ = undefined;
+var $ensureChunkHandlers$ = undefined;
+var $hasOwnProperty$ = undefined;
+var $hmrModuleData$ = undefined;
+var $hmrDownloadUpdateHandlers$ = undefined;
+var $hmrInvalidateModuleHandlers$ = undefined;
+var __webpack_require__ = undefined;
+
+module.exports = function () {
+	var currentUpdateChunks;
+	var currentUpdate;
+	var currentUpdateRemovedChunks;
+	var currentUpdateRuntime;
+	function applyHandler(options) {
+		if ($ensureChunkHandlers$) delete $ensureChunkHandlers$.$key$Hmr;
+		currentUpdateChunks = undefined;
+		function getAffectedModuleEffects(updateModuleId) {
+			var outdatedModules = [updateModuleId];
+			var outdatedDependencies = {};
+
+			var queue = outdatedModules.map(function (id) {
+				return {
+					chain: [id],
+					id: id
+				};
+			});
+			while (queue.length > 0) {
+				var queueItem = queue.pop();
+				var moduleId = queueItem.id;
+				var chain = queueItem.chain;
+				var module = $moduleCache$[moduleId];
+				if (
+					!module ||
+					(module.hot._selfAccepted && !module.hot._selfInvalidated)
+				)
+					continue;
+				if (module.hot._selfDeclined) {
+					return {
+						type: "self-declined",
+						chain: chain,
+						moduleId: moduleId
+					};
+				}
+				if (module.hot._main) {
+					return {
+						type: "unaccepted",
+						chain: chain,
+						moduleId: moduleId
+					};
+				}
+				for (var i = 0; i < module.parents.length; i++) {
+					var parentId = module.parents[i];
+					var parent = $moduleCache$[parentId];
+					if (!parent) continue;
+					if (parent.hot._declinedDependencies[moduleId]) {
+						return {
+							type: "declined",
+							chain: chain.concat([parentId]),
+							moduleId: moduleId,
+							parentId: parentId
+						};
+					}
+					if (outdatedModules.indexOf(parentId) !== -1) continue;
+					if (parent.hot._acceptedDependencies[moduleId]) {
+						if (!outdatedDependencies[parentId])
+							outdatedDependencies[parentId] = [];
+						addAllToSet(outdatedDependencies[parentId], [moduleId]);
+						continue;
+					}
+					delete outdatedDependencies[parentId];
+					outdatedModules.push(parentId);
+					queue.push({
+						chain: chain.concat([parentId]),
+						id: parentId
+					});
+				}
+			}
+
+			return {
+				type: "accepted",
+				moduleId: updateModuleId,
+				outdatedModules: outdatedModules,
+				outdatedDependencies: outdatedDependencies
+			};
+		}
+
+		function addAllToSet(a, b) {
+			for (var i = 0; i < b.length; i++) {
+				var item = b[i];
+				if (a.indexOf(item) === -1) a.push(item);
+			}
+		}
+
+		// at begin all updates modules are outdated
+		// the "outdated" status can propagate to parents if they don't accept the children
+		var outdatedDependencies = {};
+		var outdatedModules = [];
+		var appliedUpdate = {};
+
+		var warnUnexpectedRequire = function warnUnexpectedRequire(module) {
+			console.warn(
+				"[HMR] unexpected require(" + module.id + ") to disposed module"
+			);
+		};
+
+		for (var moduleId in currentUpdate) {
+			if ($hasOwnProperty$(currentUpdate, moduleId)) {
+				var newModuleFactory = currentUpdate[moduleId];
+				var result = newModuleFactory
+					? getAffectedModuleEffects(moduleId)
+					: {
+							type: "disposed",
+							moduleId: moduleId
+						};
+				/** @type {Error|false} */
+				var abortError = false;
+				var doApply = false;
+				var doDispose = false;
+				var chainInfo = "";
+				if (result.chain) {
+					chainInfo = "\nUpdate propagation: " + result.chain.join(" -> ");
+				}
+				switch (result.type) {
+					case "self-declined":
+						if (options.onDeclined) options.onDeclined(result);
+						if (!options.ignoreDeclined)
+							abortError = new Error(
+								"Aborted because of self decline: " +
+									result.moduleId +
+									chainInfo
+							);
+						break;
+					case "declined":
+						if (options.onDeclined) options.onDeclined(result);
+						if (!options.ignoreDeclined)
+							abortError = new Error(
+								"Aborted because of declined dependency: " +
+									result.moduleId +
+									" in " +
+									result.parentId +
+									chainInfo
+							);
+						break;
+					case "unaccepted":
+						if (options.onUnaccepted) options.onUnaccepted(result);
+						if (!options.ignoreUnaccepted)
+							abortError = new Error(
+								"Aborted because " + moduleId + " is not accepted" + chainInfo
+							);
+						break;
+					case "accepted":
+						if (options.onAccepted) options.onAccepted(result);
+						doApply = true;
+						break;
+					case "disposed":
+						if (options.onDisposed) options.onDisposed(result);
+						doDispose = true;
+						break;
+					default:
+						throw new Error("Unexception type " + result.type);
+				}
+				if (abortError) {
+					return {
+						error: abortError
+					};
+				}
+				if (doApply) {
+					appliedUpdate[moduleId] = newModuleFactory;
+					addAllToSet(outdatedModules, result.outdatedModules);
+					for (moduleId in result.outdatedDependencies) {
+						if ($hasOwnProperty$(result.outdatedDependencies, moduleId)) {
+							if (!outdatedDependencies[moduleId])
+								outdatedDependencies[moduleId] = [];
+							addAllToSet(
+								outdatedDependencies[moduleId],
+								result.outdatedDependencies[moduleId]
+							);
+						}
+					}
+				}
+				if (doDispose) {
+					addAllToSet(outdatedModules, [result.moduleId]);
+					appliedUpdate[moduleId] = warnUnexpectedRequire;
+				}
+			}
+		}
+		currentUpdate = undefined;
+
+		// Store self accepted outdated modules to require them later by the module system
+		var outdatedSelfAcceptedModules = [];
+		for (var j = 0; j < outdatedModules.length; j++) {
+			var outdatedModuleId = outdatedModules[j];
+			var module = $moduleCache$[outdatedModuleId];
+			if (
+				module &&
+				(module.hot._selfAccepted || module.hot._main) &&
+				// removed self-accepted modules should not be required
+				appliedUpdate[outdatedModuleId] !== warnUnexpectedRequire &&
+				// when called invalidate self-accepting is not possible
+				!module.hot._selfInvalidated
+			) {
+				outdatedSelfAcceptedModules.push({
+					module: outdatedModuleId,
+					require: module.hot._requireSelf,
+					errorHandler: module.hot._selfAccepted
+				});
+			}
+		}
+
+		var moduleOutdatedDependencies;
+
+		return {
+			dispose: function () {
+				currentUpdateRemovedChunks.forEach(function (chunkId) {
+					delete $installedChunks$[chunkId];
+				});
+				currentUpdateRemovedChunks = undefined;
+
+				var idx;
+				var queue = outdatedModules.slice();
+				while (queue.length > 0) {
+					var moduleId = queue.pop();
+					var module = $moduleCache$[moduleId];
+					if (!module) continue;
+
+					var data = {};
+
+					// Call dispose handlers
+					var disposeHandlers = module.hot._disposeHandlers;
+					for (j = 0; j < disposeHandlers.length; j++) {
+						disposeHandlers[j].call(null, data);
+					}
+					$hmrModuleData$[moduleId] = data;
+
+					// disable module (this disables requires from this module)
+					module.hot.active = false;
+
+					// remove module from cache
+					delete $moduleCache$[moduleId];
+
+					// when disposing there is no need to call dispose handler
+					delete outdatedDependencies[moduleId];
+
+					// remove "parents" references from all children
+					for (j = 0; j < module.children.length; j++) {
+						var child = $moduleCache$[module.children[j]];
+						if (!child) continue;
+						idx = child.parents.indexOf(moduleId);
+						if (idx >= 0) {
+							child.parents.splice(idx, 1);
+						}
+					}
+				}
+
+				// remove outdated dependency from module children
+				var dependency;
+				for (var outdatedModuleId in outdatedDependencies) {
+					if ($hasOwnProperty$(outdatedDependencies, outdatedModuleId)) {
+						module = $moduleCache$[outdatedModuleId];
+						if (module) {
+							moduleOutdatedDependencies =
+								outdatedDependencies[outdatedModuleId];
+							for (j = 0; j < moduleOutdatedDependencies.length; j++) {
+								dependency = moduleOutdatedDependencies[j];
+								idx = module.children.indexOf(dependency);
+								if (idx >= 0) module.children.splice(idx, 1);
+							}
+						}
+					}
+				}
+			},
+			apply: function (reportError) {
+				// insert new code
+				for (var updateModuleId in appliedUpdate) {
+					if ($hasOwnProperty$(appliedUpdate, updateModuleId)) {
+						$moduleFactories$[updateModuleId] = appliedUpdate[updateModuleId];
+					}
+				}
+
+				// run new runtime modules
+				for (var i = 0; i < currentUpdateRuntime.length; i++) {
+					currentUpdateRuntime[i](__webpack_require__);
+				}
+
+				// call accept handlers
+				for (var outdatedModuleId in outdatedDependencies) {
+					if ($hasOwnProperty$(outdatedDependencies, outdatedModuleId)) {
+						var module = $moduleCache$[outdatedModuleId];
+						if (module) {
+							moduleOutdatedDependencies =
+								outdatedDependencies[outdatedModuleId];
+							var callbacks = [];
+							var errorHandlers = [];
+							var dependenciesForCallbacks = [];
+							for (var j = 0; j < moduleOutdatedDependencies.length; j++) {
+								var dependency = moduleOutdatedDependencies[j];
+								var acceptCallback =
+									module.hot._acceptedDependencies[dependency];
+								var errorHandler =
+									module.hot._acceptedErrorHandlers[dependency];
+								if (acceptCallback) {
+									if (callbacks.indexOf(acceptCallback) !== -1) continue;
+									callbacks.push(acceptCallback);
+									errorHandlers.push(errorHandler);
+									dependenciesForCallbacks.push(dependency);
+								}
+							}
+							for (var k = 0; k < callbacks.length; k++) {
+								try {
+									callbacks[k].call(null, moduleOutdatedDependencies);
+								} catch (err) {
+									if (typeof errorHandlers[k] === "function") {
+										try {
+											errorHandlers[k](err, {
+												moduleId: outdatedModuleId,
+												dependencyId: dependenciesForCallbacks[k]
+											});
+										} catch (err2) {
+											if (options.onErrored) {
+												options.onErrored({
+													type: "accept-error-handler-errored",
+													moduleId: outdatedModuleId,
+													dependencyId: dependenciesForCallbacks[k],
+													error: err2,
+													originalError: err
+												});
+											}
+											if (!options.ignoreErrored) {
+												reportError(err2);
+												reportError(err);
+											}
+										}
+									} else {
+										if (options.onErrored) {
+											options.onErrored({
+												type: "accept-errored",
+												moduleId: outdatedModuleId,
+												dependencyId: dependenciesForCallbacks[k],
+												error: err
+											});
+										}
+										if (!options.ignoreErrored) {
+											reportError(err);
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+
+				// Load self accepted modules
+				for (var o = 0; o < outdatedSelfAcceptedModules.length; o++) {
+					var item = outdatedSelfAcceptedModules[o];
+					var moduleId = item.module;
+					try {
+						item.require(moduleId);
+					} catch (err) {
+						if (typeof item.errorHandler === "function") {
+							try {
+								item.errorHandler(err, {
+									moduleId: moduleId,
+									module: $moduleCache$[moduleId]
+								});
+							} catch (err1) {
+								if (options.onErrored) {
+									options.onErrored({
+										type: "self-accept-error-handler-errored",
+										moduleId: moduleId,
+										error: err1,
+										originalError: err
+									});
+								}
+								if (!options.ignoreErrored) {
+									reportError(err1);
+									reportError(err);
+								}
+							}
+						} else {
+							if (options.onErrored) {
+								options.onErrored({
+									type: "self-accept-errored",
+									moduleId: moduleId,
+									error: err
+								});
+							}
+							if (!options.ignoreErrored) {
+								reportError(err);
+							}
+						}
+					}
+				}
+
+				return outdatedModules;
+			}
+		};
+	}
+	$hmrInvalidateModuleHandlers$.$key$ = function (moduleId, applyHandlers) {
+		if (!currentUpdate) {
+			currentUpdate = {};
+			currentUpdateRuntime = [];
+			currentUpdateRemovedChunks = [];
+			applyHandlers.push(applyHandler);
+		}
+		if (!$hasOwnProperty$(currentUpdate, moduleId)) {
+			currentUpdate[moduleId] = $moduleFactories$[moduleId];
+		}
+	};
+	$hmrDownloadUpdateHandlers$.$key$ = function (
+		chunkIds,
+		removedChunks,
+		removedModules,
+		promises,
+		applyHandlers,
+		updatedModulesList
+	) {
+		applyHandlers.push(applyHandler);
+		currentUpdateChunks = {};
+		currentUpdateRemovedChunks = removedChunks;
+		currentUpdate = removedModules.reduce(function (obj, key) {
+			obj[key] = false;
+			return obj;
+		}, {});
+		currentUpdateRuntime = [];
+		chunkIds.forEach(function (chunkId) {
+			if (
+				$hasOwnProperty$($installedChunks$, chunkId) &&
+				$installedChunks$[chunkId] !== undefined
+			) {
+				promises.push($loadUpdateChunk$(chunkId, updatedModulesList));
+				currentUpdateChunks[chunkId] = true;
+			} else {
+				currentUpdateChunks[chunkId] = false;
+			}
+		});
+		if ($ensureChunkHandlers$) {
+			$ensureChunkHandlers$.$key$Hmr = function (chunkId, promises) {
+				if (
+					currentUpdateChunks &&
+					$hasOwnProperty$(currentUpdateChunks, chunkId) &&
+					!currentUpdateChunks[chunkId]
+				) {
+					promises.push($loadUpdateChunk$(chunkId));
+					currentUpdateChunks[chunkId] = true;
+				}
+			};
+		}
+	};
+};
diff --git a/lib/hmr/LazyCompilationPlugin.js b/lib/hmr/LazyCompilationPlugin.js
new file mode 100644
index 00000000000..f4a3f704327
--- /dev/null
+++ b/lib/hmr/LazyCompilationPlugin.js
@@ -0,0 +1,462 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { RawSource } = require("webpack-sources");
+const AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
+const Dependency = require("../Dependency");
+const Module = require("../Module");
+const ModuleFactory = require("../ModuleFactory");
+const { JS_TYPES } = require("../ModuleSourceTypesConstants");
+const {
+	WEBPACK_MODULE_TYPE_LAZY_COMPILATION_PROXY
+} = require("../ModuleTypeConstants");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+const CommonJsRequireDependency = require("../dependencies/CommonJsRequireDependency");
+const { registerNotSerializable } = require("../util/serialization");
+
+/** @typedef {import("../../declarations/WebpackOptions")} WebpackOptions */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../Module").BuildCallback} BuildCallback */
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
+/** @typedef {import("../Module").CodeGenerationContext} CodeGenerationContext */
+/** @typedef {import("../Module").CodeGenerationResult} CodeGenerationResult */
+/** @typedef {import("../Module").LibIdentOptions} LibIdentOptions */
+/** @typedef {import("../Module").NeedBuildCallback} NeedBuildCallback */
+/** @typedef {import("../Module").NeedBuildContext} NeedBuildContext */
+/** @typedef {import("../Module").SourceTypes} SourceTypes */
+/** @typedef {import("../ModuleFactory").ModuleFactoryCallback} ModuleFactoryCallback */
+/** @typedef {import("../ModuleFactory").ModuleFactoryCreateData} ModuleFactoryCreateData */
+/** @typedef {import("../RequestShortener")} RequestShortener */
+/** @typedef {import("../ResolverFactory").ResolverWithOptions} ResolverWithOptions */
+/** @typedef {import("../WebpackError")} WebpackError */
+/** @typedef {import("../dependencies/HarmonyImportDependency")} HarmonyImportDependency */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("../util/fs").InputFileSystem} InputFileSystem */
+
+/** @typedef {{ client: string, data: string, active: boolean }} ModuleResult */
+
+/**
+ * @typedef {object} BackendApi
+ * @property {(callback: (err?: (Error | null)) => void) => void} dispose
+ * @property {(module: Module) => ModuleResult} module
+ */
+
+const HMR_DEPENDENCY_TYPES = new Set([
+	"import.meta.webpackHot.accept",
+	"import.meta.webpackHot.decline",
+	"module.hot.accept",
+	"module.hot.decline"
+]);
+
+/**
+ * @param {Options["test"]} test test option
+ * @param {Module} module the module
+ * @returns {boolean | null | string} true, if the module should be selected
+ */
+const checkTest = (test, module) => {
+	if (test === undefined) return true;
+	if (typeof test === "function") {
+		return test(module);
+	}
+	if (typeof test === "string") {
+		const name = module.nameForCondition();
+		return name && name.startsWith(test);
+	}
+	if (test instanceof RegExp) {
+		const name = module.nameForCondition();
+		return name && test.test(name);
+	}
+	return false;
+};
+
+class LazyCompilationDependency extends Dependency {
+	/**
+	 * @param {LazyCompilationProxyModule} proxyModule proxy module
+	 */
+	constructor(proxyModule) {
+		super();
+		this.proxyModule = proxyModule;
+	}
+
+	get category() {
+		return "esm";
+	}
+
+	get type() {
+		return "lazy import()";
+	}
+
+	/**
+	 * @returns {string | null} an identifier to merge equal requests
+	 */
+	getResourceIdentifier() {
+		return this.proxyModule.originalModule.identifier();
+	}
+}
+
+registerNotSerializable(LazyCompilationDependency);
+
+class LazyCompilationProxyModule extends Module {
+	/**
+	 * @param {string} context context
+	 * @param {Module} originalModule an original module
+	 * @param {string} request request
+	 * @param {ModuleResult["client"]} client client
+	 * @param {ModuleResult["data"]} data data
+	 * @param {ModuleResult["active"]} active true when active, otherwise false
+	 */
+	constructor(context, originalModule, request, client, data, active) {
+		super(
+			WEBPACK_MODULE_TYPE_LAZY_COMPILATION_PROXY,
+			context,
+			originalModule.layer
+		);
+		this.originalModule = originalModule;
+		this.request = request;
+		this.client = client;
+		this.data = data;
+		this.active = active;
+	}
+
+	/**
+	 * @returns {string} a unique identifier of the module
+	 */
+	identifier() {
+		return `${WEBPACK_MODULE_TYPE_LAZY_COMPILATION_PROXY}|${this.originalModule.identifier()}`;
+	}
+
+	/**
+	 * @param {RequestShortener} requestShortener the request shortener
+	 * @returns {string} a user readable identifier of the module
+	 */
+	readableIdentifier(requestShortener) {
+		return `${WEBPACK_MODULE_TYPE_LAZY_COMPILATION_PROXY} ${this.originalModule.readableIdentifier(
+			requestShortener
+		)}`;
+	}
+
+	/**
+	 * Assuming this module is in the cache. Update the (cached) module with
+	 * the fresh module from the factory. Usually updates internal references
+	 * and properties.
+	 * @param {Module} module fresh module
+	 * @returns {void}
+	 */
+	updateCacheModule(module) {
+		super.updateCacheModule(module);
+		const m = /** @type {LazyCompilationProxyModule} */ (module);
+		this.originalModule = m.originalModule;
+		this.request = m.request;
+		this.client = m.client;
+		this.data = m.data;
+		this.active = m.active;
+	}
+
+	/**
+	 * @param {LibIdentOptions} options options
+	 * @returns {string | null} an identifier for library inclusion
+	 */
+	libIdent(options) {
+		return `${this.originalModule.libIdent(
+			options
+		)}!${WEBPACK_MODULE_TYPE_LAZY_COMPILATION_PROXY}`;
+	}
+
+	/**
+	 * @param {NeedBuildContext} context context info
+	 * @param {NeedBuildCallback} callback callback function, returns true, if the module needs a rebuild
+	 * @returns {void}
+	 */
+	needBuild(context, callback) {
+		callback(null, !this.buildInfo || this.buildInfo.active !== this.active);
+	}
+
+	/**
+	 * @param {WebpackOptions} options webpack options
+	 * @param {Compilation} compilation the compilation
+	 * @param {ResolverWithOptions} resolver the resolver
+	 * @param {InputFileSystem} fs the file system
+	 * @param {BuildCallback} callback callback function
+	 * @returns {void}
+	 */
+	build(options, compilation, resolver, fs, callback) {
+		this.buildInfo = {
+			active: this.active
+		};
+		/** @type {BuildMeta} */
+		this.buildMeta = {};
+		this.clearDependenciesAndBlocks();
+		const dep = new CommonJsRequireDependency(this.client);
+		this.addDependency(dep);
+		if (this.active) {
+			const dep = new LazyCompilationDependency(this);
+			const block = new AsyncDependenciesBlock({});
+			block.addDependency(dep);
+			this.addBlock(block);
+		}
+		callback();
+	}
+
+	/**
+	 * @returns {SourceTypes} types available (do not mutate)
+	 */
+	getSourceTypes() {
+		return JS_TYPES;
+	}
+
+	/**
+	 * @param {string=} type the source type for which the size should be estimated
+	 * @returns {number} the estimated size of the module (must be non-zero)
+	 */
+	size(type) {
+		return 200;
+	}
+
+	/**
+	 * @param {CodeGenerationContext} context context for code generation
+	 * @returns {CodeGenerationResult} result
+	 */
+	codeGeneration({ runtimeTemplate, chunkGraph, moduleGraph }) {
+		const sources = new Map();
+		const runtimeRequirements = new Set();
+		runtimeRequirements.add(RuntimeGlobals.module);
+		const clientDep = /** @type {CommonJsRequireDependency} */ (
+			this.dependencies[0]
+		);
+		const clientModule = moduleGraph.getModule(clientDep);
+		const block = this.blocks[0];
+		const client = Template.asString([
+			`var client = ${runtimeTemplate.moduleExports({
+				module: clientModule,
+				chunkGraph,
+				request: clientDep.userRequest,
+				runtimeRequirements
+			})}`,
+			`var data = ${JSON.stringify(this.data)};`
+		]);
+		const keepActive = Template.asString([
+			`var dispose = client.keepAlive({ data: data, active: ${JSON.stringify(
+				Boolean(block)
+			)}, module: module, onError: onError });`
+		]);
+		let source;
+		if (block) {
+			const dep = block.dependencies[0];
+			const module = /** @type {Module} */ (moduleGraph.getModule(dep));
+			source = Template.asString([
+				client,
+				`module.exports = ${runtimeTemplate.moduleNamespacePromise({
+					chunkGraph,
+					block,
+					module,
+					request: this.request,
+					strict: false, // TODO this should be inherited from the original module
+					message: "import()",
+					runtimeRequirements
+				})};`,
+				"if (module.hot) {",
+				Template.indent([
+					"module.hot.accept();",
+					`module.hot.accept(${JSON.stringify(
+						chunkGraph.getModuleId(module)
+					)}, function() { module.hot.invalidate(); });`,
+					"module.hot.dispose(function(data) { delete data.resolveSelf; dispose(data); });",
+					"if (module.hot.data && module.hot.data.resolveSelf) module.hot.data.resolveSelf(module.exports);"
+				]),
+				"}",
+				"function onError() { /* ignore */ }",
+				keepActive
+			]);
+		} else {
+			source = Template.asString([
+				client,
+				"var resolveSelf, onError;",
+				"module.exports = new Promise(function(resolve, reject) { resolveSelf = resolve; onError = reject; });",
+				"if (module.hot) {",
+				Template.indent([
+					"module.hot.accept();",
+					"if (module.hot.data && module.hot.data.resolveSelf) module.hot.data.resolveSelf(module.exports);",
+					"module.hot.dispose(function(data) { data.resolveSelf = resolveSelf; dispose(data); });"
+				]),
+				"}",
+				keepActive
+			]);
+		}
+		sources.set("javascript", new RawSource(source));
+		return {
+			sources,
+			runtimeRequirements
+		};
+	}
+
+	/**
+	 * @param {Hash} hash the hash used to track dependencies
+	 * @param {UpdateHashContext} context context
+	 * @returns {void}
+	 */
+	updateHash(hash, context) {
+		super.updateHash(hash, context);
+		hash.update(this.active ? "active" : "");
+		hash.update(JSON.stringify(this.data));
+	}
+}
+
+registerNotSerializable(LazyCompilationProxyModule);
+
+class LazyCompilationDependencyFactory extends ModuleFactory {
+	constructor() {
+		super();
+	}
+
+	/**
+	 * @param {ModuleFactoryCreateData} data data object
+	 * @param {ModuleFactoryCallback} callback callback
+	 * @returns {void}
+	 */
+	create(data, callback) {
+		const dependency =
+			/** @type {LazyCompilationDependency} */
+			(data.dependencies[0]);
+		callback(null, {
+			module: dependency.proxyModule.originalModule
+		});
+	}
+}
+
+/**
+ * @callback BackendHandler
+ * @param {Compiler} compiler compiler
+ * @param {(err: Error | null, backendApi?: BackendApi) => void} callback callback
+ * @returns {void}
+ */
+
+/**
+ * @callback PromiseBackendHandler
+ * @param {Compiler} compiler compiler
+ * @returns {Promise} backend
+ */
+
+/** @typedef {BackendHandler | PromiseBackendHandler} BackEnd */
+
+/**
+ * @typedef {object} Options options
+ * @property {BackEnd} backend the backend
+ * @property {boolean=} entries
+ * @property {boolean=} imports
+ * @property {(RegExp | string | ((module: Module) => boolean))=} test additional filter for lazy compiled entrypoint modules
+ */
+
+const PLUGIN_NAME = "LazyCompilationPlugin";
+
+class LazyCompilationPlugin {
+	/**
+	 * @param {Options} options options
+	 */
+	constructor({ backend, entries, imports, test }) {
+		this.backend = backend;
+		this.entries = entries;
+		this.imports = imports;
+		this.test = test;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		/** @type {BackendApi} */
+		let backend;
+		compiler.hooks.beforeCompile.tapAsync(PLUGIN_NAME, (params, callback) => {
+			if (backend !== undefined) return callback();
+			const promise = this.backend(compiler, (err, result) => {
+				if (err) return callback(err);
+				backend = /** @type {BackendApi} */ (result);
+				callback();
+			});
+			if (promise && promise.then) {
+				promise.then(b => {
+					backend = b;
+					callback();
+				}, callback);
+			}
+		});
+		compiler.hooks.thisCompilation.tap(
+			PLUGIN_NAME,
+			(compilation, { normalModuleFactory }) => {
+				normalModuleFactory.hooks.module.tap(
+					PLUGIN_NAME,
+					(module, createData, resolveData) => {
+						if (
+							resolveData.dependencies.every(dep =>
+								HMR_DEPENDENCY_TYPES.has(dep.type)
+							)
+						) {
+							// for HMR only resolving, try to determine if the HMR accept/decline refers to
+							// an import() or not
+							const hmrDep = resolveData.dependencies[0];
+							const originModule =
+								/** @type {Module} */
+								(compilation.moduleGraph.getParentModule(hmrDep));
+							const isReferringToDynamicImport = originModule.blocks.some(
+								block =>
+									block.dependencies.some(
+										dep =>
+											dep.type === "import()" &&
+											/** @type {HarmonyImportDependency} */ (dep).request ===
+												hmrDep.request
+									)
+							);
+							if (!isReferringToDynamicImport) return module;
+						} else if (
+							!resolveData.dependencies.every(
+								dep =>
+									HMR_DEPENDENCY_TYPES.has(dep.type) ||
+									(this.imports &&
+										(dep.type === "import()" ||
+											dep.type === "import() context element")) ||
+									(this.entries && dep.type === "entry")
+							)
+						)
+							return module;
+						if (
+							/webpack[/\\]hot[/\\]|webpack-dev-server[/\\]client|webpack-hot-middleware[/\\]client/.test(
+								resolveData.request
+							) ||
+							!checkTest(this.test, module)
+						)
+							return module;
+						const moduleInfo = backend.module(module);
+						if (!moduleInfo) return module;
+						const { client, data, active } = moduleInfo;
+
+						return new LazyCompilationProxyModule(
+							compiler.context,
+							module,
+							resolveData.request,
+							client,
+							data,
+							active
+						);
+					}
+				);
+				compilation.dependencyFactories.set(
+					LazyCompilationDependency,
+					new LazyCompilationDependencyFactory()
+				);
+			}
+		);
+		compiler.hooks.shutdown.tapAsync(PLUGIN_NAME, callback => {
+			backend.dispose(callback);
+		});
+	}
+}
+
+module.exports = LazyCompilationPlugin;
diff --git a/lib/hmr/lazyCompilationBackend.js b/lib/hmr/lazyCompilationBackend.js
new file mode 100644
index 00000000000..479e3cd599f
--- /dev/null
+++ b/lib/hmr/lazyCompilationBackend.js
@@ -0,0 +1,161 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+/** @typedef {import("http").IncomingMessage} IncomingMessage */
+/** @typedef {import("http").RequestListener} RequestListener */
+/** @typedef {import("http").ServerOptions} HttpServerOptions */
+/** @typedef {import("http").ServerResponse} ServerResponse */
+/** @typedef {import("https").ServerOptions} HttpsServerOptions */
+/** @typedef {import("net").AddressInfo} AddressInfo */
+/** @typedef {import("net").Server} Server */
+/** @typedef {import("../../declarations/WebpackOptions").LazyCompilationDefaultBackendOptions} LazyCompilationDefaultBackendOptions */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("./LazyCompilationPlugin").BackendApi} BackendApi */
+/** @typedef {import("./LazyCompilationPlugin").BackendHandler} BackendHandler */
+
+/**
+ * @param {Omit & { client: NonNullable}} options additional options for the backend
+ * @returns {BackendHandler} backend
+ */
+module.exports = options => (compiler, callback) => {
+	const logger = compiler.getInfrastructureLogger("LazyCompilationBackend");
+	const activeModules = new Map();
+	const prefix = "/lazy-compilation-using-";
+
+	const isHttps =
+		options.protocol === "https" ||
+		(typeof options.server === "object" &&
+			("key" in options.server || "pfx" in options.server));
+
+	const createServer =
+		typeof options.server === "function"
+			? options.server
+			: (() => {
+					const http = isHttps ? require("https") : require("http");
+					return http.createServer.bind(
+						http,
+						/** @type {HttpServerOptions | HttpsServerOptions} */
+						(options.server)
+					);
+				})();
+	/** @type {(server: Server) => void} */
+	const listen =
+		typeof options.listen === "function"
+			? options.listen
+			: server => {
+					let listen = options.listen;
+					if (typeof listen === "object" && !("port" in listen))
+						listen = { ...listen, port: undefined };
+					server.listen(listen);
+				};
+
+	const protocol = options.protocol || (isHttps ? "https" : "http");
+
+	/** @type {RequestListener} */
+	const requestListener = (req, res) => {
+		if (req.url === undefined) return;
+		const keys = req.url.slice(prefix.length).split("@");
+		req.socket.on("close", () => {
+			setTimeout(() => {
+				for (const key of keys) {
+					const oldValue = activeModules.get(key) || 0;
+					activeModules.set(key, oldValue - 1);
+					if (oldValue === 1) {
+						logger.log(
+							`${key} is no longer in use. Next compilation will skip this module.`
+						);
+					}
+				}
+			}, 120000);
+		});
+		req.socket.setNoDelay(true);
+		res.writeHead(200, {
+			"content-type": "text/event-stream",
+			"Access-Control-Allow-Origin": "*",
+			"Access-Control-Allow-Methods": "*",
+			"Access-Control-Allow-Headers": "*"
+		});
+		res.write("\n");
+		let moduleActivated = false;
+		for (const key of keys) {
+			const oldValue = activeModules.get(key) || 0;
+			activeModules.set(key, oldValue + 1);
+			if (oldValue === 0) {
+				logger.log(`${key} is now in use and will be compiled.`);
+				moduleActivated = true;
+			}
+		}
+		if (moduleActivated && compiler.watching) compiler.watching.invalidate();
+	};
+
+	const server = /** @type {Server} */ (createServer());
+	server.on("request", requestListener);
+
+	let isClosing = false;
+	/** @type {Set} */
+	const sockets = new Set();
+	server.on("connection", socket => {
+		sockets.add(socket);
+		socket.on("close", () => {
+			sockets.delete(socket);
+		});
+		if (isClosing) socket.destroy();
+	});
+	server.on("clientError", e => {
+		if (e.message !== "Server is disposing") logger.warn(e);
+	});
+
+	server.on(
+		"listening",
+		/**
+		 * @param {Error} err error
+		 * @returns {void}
+		 */
+		err => {
+			if (err) return callback(err);
+			const _addr = server.address();
+			if (typeof _addr === "string")
+				throw new Error("addr must not be a string");
+			const addr = /** @type {AddressInfo} */ (_addr);
+			const urlBase =
+				addr.address === "::" || addr.address === "0.0.0.0"
+					? `${protocol}://localhost:${addr.port}`
+					: addr.family === "IPv6"
+						? `${protocol}://[${addr.address}]:${addr.port}`
+						: `${protocol}://${addr.address}:${addr.port}`;
+			logger.log(
+				`Server-Sent-Events server for lazy compilation open at ${urlBase}.`
+			);
+			callback(null, {
+				dispose(callback) {
+					isClosing = true;
+					// Removing the listener is a workaround for a memory leak in node.js
+					server.off("request", requestListener);
+					server.close(err => {
+						callback(err);
+					});
+					for (const socket of sockets) {
+						socket.destroy(new Error("Server is disposing"));
+					}
+				},
+				module(originalModule) {
+					const key = `${encodeURIComponent(
+						originalModule.identifier().replace(/\\/g, "/").replace(/@/g, "_")
+					).replace(/%(2F|3A|24|26|2B|2C|3B|3D)/g, decodeURIComponent)}`;
+					const active = activeModules.get(key) > 0;
+					return {
+						client: `${options.client}?${encodeURIComponent(urlBase + prefix)}`,
+						data: key,
+						active
+					};
+				}
+			});
+		}
+	);
+	listen(server);
+};
diff --git a/lib/ids/ChunkModuleIdRangePlugin.js b/lib/ids/ChunkModuleIdRangePlugin.js
new file mode 100644
index 00000000000..01894e08395
--- /dev/null
+++ b/lib/ids/ChunkModuleIdRangePlugin.js
@@ -0,0 +1,89 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { find } = require("../util/SetHelpers");
+const {
+	compareModulesByPreOrderIndexOrIdentifier,
+	compareModulesByPostOrderIndexOrIdentifier
+} = require("../util/comparators");
+
+/** @typedef {import("../Compiler")} Compiler */
+
+/**
+ * @typedef {object} ChunkModuleIdRangePluginOptions
+ * @property {string} name the chunk name
+ * @property {("index" | "index2" | "preOrderIndex" | "postOrderIndex")=} order order
+ * @property {number=} start start id
+ * @property {number=} end end id
+ */
+
+const PLUGIN_NAME = "ChunkModuleIdRangePlugin";
+
+class ChunkModuleIdRangePlugin {
+	/**
+	 * @param {ChunkModuleIdRangePluginOptions} options options object
+	 */
+	constructor(options) {
+		this.options = options;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		const options = this.options;
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			const moduleGraph = compilation.moduleGraph;
+			compilation.hooks.moduleIds.tap(PLUGIN_NAME, modules => {
+				const chunkGraph = compilation.chunkGraph;
+				const chunk = find(
+					compilation.chunks,
+					chunk => chunk.name === options.name
+				);
+				if (!chunk) {
+					throw new Error(
+						`${PLUGIN_NAME}: Chunk with name '${options.name}"' was not found`
+					);
+				}
+
+				let chunkModules;
+				if (options.order) {
+					let cmpFn;
+					switch (options.order) {
+						case "index":
+						case "preOrderIndex":
+							cmpFn = compareModulesByPreOrderIndexOrIdentifier(moduleGraph);
+							break;
+						case "index2":
+						case "postOrderIndex":
+							cmpFn = compareModulesByPostOrderIndexOrIdentifier(moduleGraph);
+							break;
+						default:
+							throw new Error(`${PLUGIN_NAME}: unexpected value of order`);
+					}
+					chunkModules = chunkGraph.getOrderedChunkModules(chunk, cmpFn);
+				} else {
+					chunkModules = Array.from(modules)
+						.filter(m => chunkGraph.isModuleInChunk(m, chunk))
+						.sort(compareModulesByPreOrderIndexOrIdentifier(moduleGraph));
+				}
+
+				let currentId = options.start || 0;
+				for (let i = 0; i < chunkModules.length; i++) {
+					const m = chunkModules[i];
+					if (m.needId && chunkGraph.getModuleId(m) === null) {
+						chunkGraph.setModuleId(m, currentId++);
+					}
+					if (options.end && currentId > options.end) break;
+				}
+			});
+		});
+	}
+}
+module.exports = ChunkModuleIdRangePlugin;
diff --git a/lib/ids/DeterministicChunkIdsPlugin.js b/lib/ids/DeterministicChunkIdsPlugin.js
new file mode 100644
index 00000000000..ab3f821cd1f
--- /dev/null
+++ b/lib/ids/DeterministicChunkIdsPlugin.js
@@ -0,0 +1,77 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Florent Cailhol @ooflorent
+*/
+
+"use strict";
+
+const { compareChunksNatural } = require("../util/comparators");
+const {
+	getFullChunkName,
+	getUsedChunkIds,
+	assignDeterministicIds
+} = require("./IdHelpers");
+
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Module")} Module */
+
+/**
+ * @typedef {object} DeterministicChunkIdsPluginOptions
+ * @property {string=} context context for ids
+ * @property {number=} maxLength maximum length of ids
+ */
+
+class DeterministicChunkIdsPlugin {
+	/**
+	 * @param {DeterministicChunkIdsPluginOptions=} options options
+	 */
+	constructor(options = {}) {
+		this.options = options;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(
+			"DeterministicChunkIdsPlugin",
+			compilation => {
+				compilation.hooks.chunkIds.tap(
+					"DeterministicChunkIdsPlugin",
+					chunks => {
+						const chunkGraph = compilation.chunkGraph;
+						const context = this.options.context
+							? this.options.context
+							: compiler.context;
+						const maxLength = this.options.maxLength || 3;
+
+						const compareNatural = compareChunksNatural(chunkGraph);
+
+						const usedIds = getUsedChunkIds(compilation);
+						assignDeterministicIds(
+							Array.from(chunks).filter(chunk => chunk.id === null),
+							chunk =>
+								getFullChunkName(chunk, chunkGraph, context, compiler.root),
+							compareNatural,
+							(chunk, id) => {
+								const size = usedIds.size;
+								usedIds.add(`${id}`);
+								if (size === usedIds.size) return false;
+								chunk.id = id;
+								chunk.ids = [id];
+								return true;
+							},
+							[10 ** maxLength],
+							10,
+							usedIds.size
+						);
+					}
+				);
+			}
+		);
+	}
+}
+
+module.exports = DeterministicChunkIdsPlugin;
diff --git a/lib/ids/DeterministicModuleIdsPlugin.js b/lib/ids/DeterministicModuleIdsPlugin.js
new file mode 100644
index 00000000000..bc3ad4dcc92
--- /dev/null
+++ b/lib/ids/DeterministicModuleIdsPlugin.js
@@ -0,0 +1,96 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Florent Cailhol @ooflorent
+*/
+
+"use strict";
+
+const {
+	compareModulesByPreOrderIndexOrIdentifier
+} = require("../util/comparators");
+const {
+	getUsedModuleIdsAndModules,
+	getFullModuleName,
+	assignDeterministicIds
+} = require("./IdHelpers");
+
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Module")} Module */
+
+/**
+ * @typedef {object} DeterministicModuleIdsPluginOptions
+ * @property {string=} context context relative to which module identifiers are computed
+ * @property {((module: Module) => boolean)=} test selector function for modules
+ * @property {number=} maxLength maximum id length in digits (used as starting point)
+ * @property {number=} salt hash salt for ids
+ * @property {boolean=} fixedLength do not increase the maxLength to find an optimal id space size
+ * @property {boolean=} failOnConflict throw an error when id conflicts occur (instead of rehashing)
+ */
+
+const PLUGIN_NAME = "DeterministicModuleIdsPlugin";
+
+class DeterministicModuleIdsPlugin {
+	/**
+	 * @param {DeterministicModuleIdsPluginOptions=} options options
+	 */
+	constructor(options = {}) {
+		this.options = options;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			compilation.hooks.moduleIds.tap(PLUGIN_NAME, () => {
+				const chunkGraph = compilation.chunkGraph;
+				const context = this.options.context
+					? this.options.context
+					: compiler.context;
+				const maxLength = this.options.maxLength || 3;
+				const failOnConflict = this.options.failOnConflict || false;
+				const fixedLength = this.options.fixedLength || false;
+				const salt = this.options.salt || 0;
+				let conflicts = 0;
+
+				const [usedIds, modules] = getUsedModuleIdsAndModules(
+					compilation,
+					this.options.test
+				);
+				assignDeterministicIds(
+					modules,
+					module => getFullModuleName(module, context, compiler.root),
+					failOnConflict
+						? () => 0
+						: compareModulesByPreOrderIndexOrIdentifier(
+								compilation.moduleGraph
+							),
+					(module, id) => {
+						const size = usedIds.size;
+						usedIds.add(`${id}`);
+						if (size === usedIds.size) {
+							conflicts++;
+							return false;
+						}
+						chunkGraph.setModuleId(module, id);
+						return true;
+					},
+					[10 ** maxLength],
+					fixedLength ? 0 : 10,
+					usedIds.size,
+					salt
+				);
+				if (failOnConflict && conflicts)
+					throw new Error(
+						`Assigning deterministic module ids has lead to ${conflicts} conflict${
+							conflicts > 1 ? "s" : ""
+						}.\nIncrease the 'maxLength' to increase the id space and make conflicts less likely (recommended when there are many conflicts or application is expected to grow), or add an 'salt' number to try another hash starting value in the same id space (recommended when there is only a single conflict).`
+					);
+			});
+		});
+	}
+}
+
+module.exports = DeterministicModuleIdsPlugin;
diff --git a/lib/ids/HashedModuleIdsPlugin.js b/lib/ids/HashedModuleIdsPlugin.js
new file mode 100644
index 00000000000..2bbb3d1a093
--- /dev/null
+++ b/lib/ids/HashedModuleIdsPlugin.js
@@ -0,0 +1,91 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { DEFAULTS } = require("../config/defaults");
+const {
+	compareModulesByPreOrderIndexOrIdentifier
+} = require("../util/comparators");
+const createSchemaValidation = require("../util/create-schema-validation");
+const createHash = require("../util/createHash");
+const {
+	getUsedModuleIdsAndModules,
+	getFullModuleName
+} = require("./IdHelpers");
+
+/** @typedef {import("../../declarations/plugins/HashedModuleIdsPlugin").HashedModuleIdsPluginOptions} HashedModuleIdsPluginOptions */
+/** @typedef {import("../Compiler")} Compiler */
+
+const validate = createSchemaValidation(
+	require("../../schemas/plugins/HashedModuleIdsPlugin.check.js"),
+	() => require("../../schemas/plugins/HashedModuleIdsPlugin.json"),
+	{
+		name: "Hashed Module Ids Plugin",
+		baseDataPath: "options"
+	}
+);
+
+const PLUGIN_NAME = "HashedModuleIdsPlugin";
+
+class HashedModuleIdsPlugin {
+	/**
+	 * @param {HashedModuleIdsPluginOptions=} options options object
+	 */
+	constructor(options = {}) {
+		validate(options);
+
+		/** @type {HashedModuleIdsPluginOptions} */
+		this.options = {
+			context: undefined,
+			hashFunction: DEFAULTS.HASH_FUNCTION,
+			hashDigest: "base64",
+			hashDigestLength: 4,
+			...options
+		};
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		const options = this.options;
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			compilation.hooks.moduleIds.tap(PLUGIN_NAME, () => {
+				const chunkGraph = compilation.chunkGraph;
+				const context = this.options.context
+					? this.options.context
+					: compiler.context;
+
+				const [usedIds, modules] = getUsedModuleIdsAndModules(compilation);
+				const modulesInNaturalOrder = modules.sort(
+					compareModulesByPreOrderIndexOrIdentifier(compilation.moduleGraph)
+				);
+				for (const module of modulesInNaturalOrder) {
+					const ident = getFullModuleName(module, context, compiler.root);
+					const hash = createHash(
+						/** @type {NonNullable} */ (
+							options.hashFunction
+						)
+					);
+					hash.update(ident || "");
+					const hashId = /** @type {string} */ (
+						hash.digest(options.hashDigest)
+					);
+					let len = options.hashDigestLength;
+					while (usedIds.has(hashId.slice(0, len)))
+						/** @type {number} */ (len)++;
+					const moduleId = hashId.slice(0, len);
+					chunkGraph.setModuleId(module, moduleId);
+					usedIds.add(moduleId);
+				}
+			});
+		});
+	}
+}
+
+module.exports = HashedModuleIdsPlugin;
diff --git a/lib/ids/IdHelpers.js b/lib/ids/IdHelpers.js
new file mode 100644
index 00000000000..5a4c9f04bb3
--- /dev/null
+++ b/lib/ids/IdHelpers.js
@@ -0,0 +1,474 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const createHash = require("../util/createHash");
+const { makePathsRelative } = require("../util/identifier");
+const numberHash = require("../util/numberHash");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Module")} Module */
+/** @typedef {typeof import("../util/Hash")} Hash */
+/** @typedef {import("../util/identifier").AssociatedObjectForCache} AssociatedObjectForCache */
+
+/**
+ * @param {string} str string to hash
+ * @param {number} len max length of the hash
+ * @param {string | Hash} hashFunction hash function to use
+ * @returns {string} hash
+ */
+const getHash = (str, len, hashFunction) => {
+	const hash = createHash(hashFunction);
+	hash.update(str);
+	const digest = /** @type {string} */ (hash.digest("hex"));
+	return digest.slice(0, len);
+};
+
+/**
+ * @param {string} str the string
+ * @returns {string} string prefixed by an underscore if it is a number
+ */
+const avoidNumber = str => {
+	// max length of a number is 21 chars, bigger numbers a written as "...e+xx"
+	if (str.length > 21) return str;
+	const firstChar = str.charCodeAt(0);
+	// skip everything that doesn't look like a number
+	// charCodes: "-": 45, "1": 49, "9": 57
+	if (firstChar < 49) {
+		if (firstChar !== 45) return str;
+	} else if (firstChar > 57) {
+		return str;
+	}
+	if (str === String(Number(str))) {
+		return `_${str}`;
+	}
+	return str;
+};
+
+/**
+ * @param {string} request the request
+ * @returns {string} id representation
+ */
+const requestToId = request =>
+	request.replace(/^(\.\.?\/)+/, "").replace(/(^[.-]|[^a-zA-Z0-9_-])+/g, "_");
+module.exports.requestToId = requestToId;
+
+/**
+ * @param {string} string the string
+ * @param {string} delimiter separator for string and hash
+ * @param {string | Hash} hashFunction hash function to use
+ * @returns {string} string with limited max length to 100 chars
+ */
+const shortenLongString = (string, delimiter, hashFunction) => {
+	if (string.length < 100) return string;
+	return (
+		string.slice(0, 100 - 6 - delimiter.length) +
+		delimiter +
+		getHash(string, 6, hashFunction)
+	);
+};
+
+/**
+ * @param {Module} module the module
+ * @param {string} context context directory
+ * @param {AssociatedObjectForCache=} associatedObjectForCache an object to which the cache will be attached
+ * @returns {string} short module name
+ */
+const getShortModuleName = (module, context, associatedObjectForCache) => {
+	const libIdent = module.libIdent({ context, associatedObjectForCache });
+	if (libIdent) return avoidNumber(libIdent);
+	const nameForCondition = module.nameForCondition();
+	if (nameForCondition)
+		return avoidNumber(
+			makePathsRelative(context, nameForCondition, associatedObjectForCache)
+		);
+	return "";
+};
+module.exports.getShortModuleName = getShortModuleName;
+
+/**
+ * @param {string} shortName the short name
+ * @param {Module} module the module
+ * @param {string} context context directory
+ * @param {string | Hash} hashFunction hash function to use
+ * @param {AssociatedObjectForCache=} associatedObjectForCache an object to which the cache will be attached
+ * @returns {string} long module name
+ */
+const getLongModuleName = (
+	shortName,
+	module,
+	context,
+	hashFunction,
+	associatedObjectForCache
+) => {
+	const fullName = getFullModuleName(module, context, associatedObjectForCache);
+	return `${shortName}?${getHash(fullName, 4, hashFunction)}`;
+};
+module.exports.getLongModuleName = getLongModuleName;
+
+/**
+ * @param {Module} module the module
+ * @param {string} context context directory
+ * @param {AssociatedObjectForCache=} associatedObjectForCache an object to which the cache will be attached
+ * @returns {string} full module name
+ */
+const getFullModuleName = (module, context, associatedObjectForCache) =>
+	makePathsRelative(context, module.identifier(), associatedObjectForCache);
+module.exports.getFullModuleName = getFullModuleName;
+
+/**
+ * @param {Chunk} chunk the chunk
+ * @param {ChunkGraph} chunkGraph the chunk graph
+ * @param {string} context context directory
+ * @param {string} delimiter delimiter for names
+ * @param {string | Hash} hashFunction hash function to use
+ * @param {AssociatedObjectForCache=} associatedObjectForCache an object to which the cache will be attached
+ * @returns {string} short chunk name
+ */
+const getShortChunkName = (
+	chunk,
+	chunkGraph,
+	context,
+	delimiter,
+	hashFunction,
+	associatedObjectForCache
+) => {
+	const modules = chunkGraph.getChunkRootModules(chunk);
+	const shortModuleNames = modules.map(m =>
+		requestToId(getShortModuleName(m, context, associatedObjectForCache))
+	);
+	chunk.idNameHints.sort();
+	const chunkName = Array.from(chunk.idNameHints)
+		.concat(shortModuleNames)
+		.filter(Boolean)
+		.join(delimiter);
+	return shortenLongString(chunkName, delimiter, hashFunction);
+};
+module.exports.getShortChunkName = getShortChunkName;
+
+/**
+ * @param {Chunk} chunk the chunk
+ * @param {ChunkGraph} chunkGraph the chunk graph
+ * @param {string} context context directory
+ * @param {string} delimiter delimiter for names
+ * @param {string | Hash} hashFunction hash function to use
+ * @param {AssociatedObjectForCache=} associatedObjectForCache an object to which the cache will be attached
+ * @returns {string} short chunk name
+ */
+const getLongChunkName = (
+	chunk,
+	chunkGraph,
+	context,
+	delimiter,
+	hashFunction,
+	associatedObjectForCache
+) => {
+	const modules = chunkGraph.getChunkRootModules(chunk);
+	const shortModuleNames = modules.map(m =>
+		requestToId(getShortModuleName(m, context, associatedObjectForCache))
+	);
+	const longModuleNames = modules.map(m =>
+		requestToId(
+			getLongModuleName("", m, context, hashFunction, associatedObjectForCache)
+		)
+	);
+	chunk.idNameHints.sort();
+	const chunkName = Array.from(chunk.idNameHints)
+		.concat(shortModuleNames, longModuleNames)
+		.filter(Boolean)
+		.join(delimiter);
+	return shortenLongString(chunkName, delimiter, hashFunction);
+};
+module.exports.getLongChunkName = getLongChunkName;
+
+/**
+ * @param {Chunk} chunk the chunk
+ * @param {ChunkGraph} chunkGraph the chunk graph
+ * @param {string} context context directory
+ * @param {AssociatedObjectForCache=} associatedObjectForCache an object to which the cache will be attached
+ * @returns {string} full chunk name
+ */
+const getFullChunkName = (
+	chunk,
+	chunkGraph,
+	context,
+	associatedObjectForCache
+) => {
+	if (chunk.name) return chunk.name;
+	const modules = chunkGraph.getChunkRootModules(chunk);
+	const fullModuleNames = modules.map(m =>
+		makePathsRelative(context, m.identifier(), associatedObjectForCache)
+	);
+	return fullModuleNames.join();
+};
+module.exports.getFullChunkName = getFullChunkName;
+
+/**
+ * @template K
+ * @template V
+ * @param {Map} map a map from key to values
+ * @param {K} key key
+ * @param {V} value value
+ * @returns {void}
+ */
+const addToMapOfItems = (map, key, value) => {
+	let array = map.get(key);
+	if (array === undefined) {
+		array = [];
+		map.set(key, array);
+	}
+	array.push(value);
+};
+
+/**
+ * @param {Compilation} compilation the compilation
+ * @param {((module: Module) => boolean)=} filter filter modules
+ * @returns {[Set, Module[]]} used module ids as strings and modules without id matching the filter
+ */
+const getUsedModuleIdsAndModules = (compilation, filter) => {
+	const chunkGraph = compilation.chunkGraph;
+
+	const modules = [];
+
+	/** @type {Set} */
+	const usedIds = new Set();
+	if (compilation.usedModuleIds) {
+		for (const id of compilation.usedModuleIds) {
+			usedIds.add(String(id));
+		}
+	}
+
+	for (const module of compilation.modules) {
+		if (!module.needId) continue;
+		const moduleId = chunkGraph.getModuleId(module);
+		if (moduleId !== null) {
+			usedIds.add(String(moduleId));
+		} else if (
+			(!filter || filter(module)) &&
+			chunkGraph.getNumberOfModuleChunks(module) !== 0
+		) {
+			modules.push(module);
+		}
+	}
+
+	return [usedIds, modules];
+};
+module.exports.getUsedModuleIdsAndModules = getUsedModuleIdsAndModules;
+
+/**
+ * @param {Compilation} compilation the compilation
+ * @returns {Set} used chunk ids as strings
+ */
+const getUsedChunkIds = compilation => {
+	/** @type {Set} */
+	const usedIds = new Set();
+	if (compilation.usedChunkIds) {
+		for (const id of compilation.usedChunkIds) {
+			usedIds.add(String(id));
+		}
+	}
+
+	for (const chunk of compilation.chunks) {
+		const chunkId = chunk.id;
+		if (chunkId !== null) {
+			usedIds.add(String(chunkId));
+		}
+	}
+
+	return usedIds;
+};
+module.exports.getUsedChunkIds = getUsedChunkIds;
+
+/**
+ * @template T
+ * @param {Iterable} items list of items to be named
+ * @param {(item: T) => string} getShortName get a short name for an item
+ * @param {(item: T, name: string) => string} getLongName get a long name for an item
+ * @param {(a: T, b: T) => -1 | 0 | 1} comparator order of items
+ * @param {Set} usedIds already used ids, will not be assigned
+ * @param {(item: T, name: string) => void} assignName assign a name to an item
+ * @returns {T[]} list of items without a name
+ */
+const assignNames = (
+	items,
+	getShortName,
+	getLongName,
+	comparator,
+	usedIds,
+	assignName
+) => {
+	/** @type {Map} */
+	const nameToItems = new Map();
+
+	for (const item of items) {
+		const name = getShortName(item);
+		addToMapOfItems(nameToItems, name, item);
+	}
+
+	/** @type {Map} */
+	const nameToItems2 = new Map();
+
+	for (const [name, items] of nameToItems) {
+		if (items.length > 1 || !name) {
+			for (const item of items) {
+				const longName = getLongName(item, name);
+				addToMapOfItems(nameToItems2, longName, item);
+			}
+		} else {
+			addToMapOfItems(nameToItems2, name, items[0]);
+		}
+	}
+
+	/** @type {T[]} */
+	const unnamedItems = [];
+
+	for (const [name, items] of nameToItems2) {
+		if (!name) {
+			for (const item of items) {
+				unnamedItems.push(item);
+			}
+		} else if (items.length === 1 && !usedIds.has(name)) {
+			assignName(items[0], name);
+			usedIds.add(name);
+		} else {
+			items.sort(comparator);
+			let i = 0;
+			for (const item of items) {
+				while (nameToItems2.has(name + i) && usedIds.has(name + i)) i++;
+				assignName(item, name + i);
+				usedIds.add(name + i);
+				i++;
+			}
+		}
+	}
+
+	unnamedItems.sort(comparator);
+	return unnamedItems;
+};
+module.exports.assignNames = assignNames;
+
+/**
+ * @template T
+ * @param {T[]} items list of items to be named
+ * @param {(item: T) => string} getName get a name for an item
+ * @param {(a: T, n: T) => -1 | 0 | 1} comparator order of items
+ * @param {(item: T, id: number) => boolean} assignId assign an id to an item
+ * @param {number[]} ranges usable ranges for ids
+ * @param {number} expandFactor factor to create more ranges
+ * @param {number} extraSpace extra space to allocate, i. e. when some ids are already used
+ * @param {number} salt salting number to initialize hashing
+ * @returns {void}
+ */
+const assignDeterministicIds = (
+	items,
+	getName,
+	comparator,
+	assignId,
+	ranges = [10],
+	expandFactor = 10,
+	extraSpace = 0,
+	salt = 0
+) => {
+	items.sort(comparator);
+
+	// max 5% fill rate
+	const optimalRange = Math.min(
+		items.length * 20 + extraSpace,
+		Number.MAX_SAFE_INTEGER
+	);
+
+	let i = 0;
+	let range = ranges[i];
+	while (range < optimalRange) {
+		i++;
+		if (i < ranges.length) {
+			range = Math.min(ranges[i], Number.MAX_SAFE_INTEGER);
+		} else if (expandFactor) {
+			range = Math.min(range * expandFactor, Number.MAX_SAFE_INTEGER);
+		} else {
+			break;
+		}
+	}
+
+	for (const item of items) {
+		const ident = getName(item);
+		let id;
+		let i = salt;
+		do {
+			id = numberHash(ident + i++, range);
+		} while (!assignId(item, id));
+	}
+};
+module.exports.assignDeterministicIds = assignDeterministicIds;
+
+/**
+ * @param {Set} usedIds used ids
+ * @param {Iterable} modules the modules
+ * @param {Compilation} compilation the compilation
+ * @returns {void}
+ */
+const assignAscendingModuleIds = (usedIds, modules, compilation) => {
+	const chunkGraph = compilation.chunkGraph;
+
+	let nextId = 0;
+	let assignId;
+	if (usedIds.size > 0) {
+		/**
+		 * @param {Module} module the module
+		 */
+		assignId = module => {
+			if (chunkGraph.getModuleId(module) === null) {
+				while (usedIds.has(String(nextId))) nextId++;
+				chunkGraph.setModuleId(module, nextId++);
+			}
+		};
+	} else {
+		/**
+		 * @param {Module} module the module
+		 */
+		assignId = module => {
+			if (chunkGraph.getModuleId(module) === null) {
+				chunkGraph.setModuleId(module, nextId++);
+			}
+		};
+	}
+	for (const module of modules) {
+		assignId(module);
+	}
+};
+module.exports.assignAscendingModuleIds = assignAscendingModuleIds;
+
+/**
+ * @param {Iterable} chunks the chunks
+ * @param {Compilation} compilation the compilation
+ * @returns {void}
+ */
+const assignAscendingChunkIds = (chunks, compilation) => {
+	const usedIds = getUsedChunkIds(compilation);
+
+	let nextId = 0;
+	if (usedIds.size > 0) {
+		for (const chunk of chunks) {
+			if (chunk.id === null) {
+				while (usedIds.has(String(nextId))) nextId++;
+				chunk.id = nextId;
+				chunk.ids = [nextId];
+				nextId++;
+			}
+		}
+	} else {
+		for (const chunk of chunks) {
+			if (chunk.id === null) {
+				chunk.id = nextId;
+				chunk.ids = [nextId];
+				nextId++;
+			}
+		}
+	}
+};
+module.exports.assignAscendingChunkIds = assignAscendingChunkIds;
diff --git a/lib/ids/NamedChunkIdsPlugin.js b/lib/ids/NamedChunkIdsPlugin.js
new file mode 100644
index 00000000000..d1c342aa223
--- /dev/null
+++ b/lib/ids/NamedChunkIdsPlugin.js
@@ -0,0 +1,95 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { compareChunksNatural } = require("../util/comparators");
+const {
+	getShortChunkName,
+	getLongChunkName,
+	assignNames,
+	getUsedChunkIds,
+	assignAscendingChunkIds
+} = require("./IdHelpers");
+
+/** @typedef {import("../../declarations/WebpackOptions").OutputNormalized} Output */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Module")} Module */
+
+/**
+ * @typedef {object} NamedChunkIdsPluginOptions
+ * @property {string=} context context
+ * @property {string=} delimiter delimiter
+ */
+
+const PLUGIN_NAME = "NamedChunkIdsPlugin";
+
+class NamedChunkIdsPlugin {
+	/**
+	 * @param {NamedChunkIdsPluginOptions=} options options
+	 */
+	constructor(options) {
+		this.delimiter = (options && options.delimiter) || "-";
+		this.context = options && options.context;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			const hashFunction =
+				/** @type {NonNullable} */
+				(compilation.outputOptions.hashFunction);
+			compilation.hooks.chunkIds.tap(PLUGIN_NAME, chunks => {
+				const chunkGraph = compilation.chunkGraph;
+				const context = this.context ? this.context : compiler.context;
+				const delimiter = this.delimiter;
+
+				const unnamedChunks = assignNames(
+					Array.from(chunks).filter(chunk => {
+						if (chunk.name) {
+							chunk.id = chunk.name;
+							chunk.ids = [chunk.name];
+						}
+						return chunk.id === null;
+					}),
+					chunk =>
+						getShortChunkName(
+							chunk,
+							chunkGraph,
+							context,
+							delimiter,
+							hashFunction,
+							compiler.root
+						),
+					chunk =>
+						getLongChunkName(
+							chunk,
+							chunkGraph,
+							context,
+							delimiter,
+							hashFunction,
+							compiler.root
+						),
+					compareChunksNatural(chunkGraph),
+					getUsedChunkIds(compilation),
+					(chunk, name) => {
+						chunk.id = name;
+						chunk.ids = [name];
+					}
+				);
+				if (unnamedChunks.length > 0) {
+					assignAscendingChunkIds(unnamedChunks, compilation);
+				}
+			});
+		});
+	}
+}
+
+module.exports = NamedChunkIdsPlugin;
diff --git a/lib/ids/NamedModuleIdsPlugin.js b/lib/ids/NamedModuleIdsPlugin.js
new file mode 100644
index 00000000000..f52493b2b6e
--- /dev/null
+++ b/lib/ids/NamedModuleIdsPlugin.js
@@ -0,0 +1,71 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { compareModulesByIdentifier } = require("../util/comparators");
+const {
+	getShortModuleName,
+	getLongModuleName,
+	assignNames,
+	getUsedModuleIdsAndModules,
+	assignAscendingModuleIds
+} = require("./IdHelpers");
+
+/** @typedef {import("../../declarations/WebpackOptions").OutputNormalized} Output */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Module")} Module */
+
+/**
+ * @typedef {object} NamedModuleIdsPluginOptions
+ * @property {string=} context context
+ */
+
+const PLUGIN_NAME = "NamedModuleIdsPlugin";
+
+class NamedModuleIdsPlugin {
+	/**
+	 * @param {NamedModuleIdsPluginOptions=} options options
+	 */
+	constructor(options = {}) {
+		this.options = options;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		const { root } = compiler;
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			const hashFunction =
+				/** @type {NonNullable} */
+				(compilation.outputOptions.hashFunction);
+			compilation.hooks.moduleIds.tap(PLUGIN_NAME, () => {
+				const chunkGraph = compilation.chunkGraph;
+				const context = this.options.context
+					? this.options.context
+					: compiler.context;
+
+				const [usedIds, modules] = getUsedModuleIdsAndModules(compilation);
+				const unnamedModules = assignNames(
+					modules,
+					m => getShortModuleName(m, context, root),
+					(m, shortName) =>
+						getLongModuleName(shortName, m, context, hashFunction, root),
+					compareModulesByIdentifier,
+					usedIds,
+					(m, name) => chunkGraph.setModuleId(m, name)
+				);
+				if (unnamedModules.length > 0) {
+					assignAscendingModuleIds(usedIds, unnamedModules, compilation);
+				}
+			});
+		});
+	}
+}
+
+module.exports = NamedModuleIdsPlugin;
diff --git a/lib/ids/NaturalChunkIdsPlugin.js b/lib/ids/NaturalChunkIdsPlugin.js
new file mode 100644
index 00000000000..1b24d3cdaf9
--- /dev/null
+++ b/lib/ids/NaturalChunkIdsPlugin.js
@@ -0,0 +1,35 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { compareChunksNatural } = require("../util/comparators");
+const { assignAscendingChunkIds } = require("./IdHelpers");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Module")} Module */
+
+const PLUGIN_NAME = "NaturalChunkIdsPlugin";
+
+class NaturalChunkIdsPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			compilation.hooks.chunkIds.tap(PLUGIN_NAME, chunks => {
+				const chunkGraph = compilation.chunkGraph;
+				const compareNatural = compareChunksNatural(chunkGraph);
+				const chunksInNaturalOrder = Array.from(chunks).sort(compareNatural);
+				assignAscendingChunkIds(chunksInNaturalOrder, compilation);
+			});
+		});
+	}
+}
+
+module.exports = NaturalChunkIdsPlugin;
diff --git a/lib/ids/NaturalModuleIdsPlugin.js b/lib/ids/NaturalModuleIdsPlugin.js
new file mode 100644
index 00000000000..e12b69b61d6
--- /dev/null
+++ b/lib/ids/NaturalModuleIdsPlugin.js
@@ -0,0 +1,41 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Florent Cailhol @ooflorent
+*/
+
+"use strict";
+
+const {
+	compareModulesByPreOrderIndexOrIdentifier
+} = require("../util/comparators");
+const {
+	assignAscendingModuleIds,
+	getUsedModuleIdsAndModules
+} = require("./IdHelpers");
+
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Module")} Module */
+
+const PLUGIN_NAME = "NaturalModuleIdsPlugin";
+
+class NaturalModuleIdsPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			compilation.hooks.moduleIds.tap(PLUGIN_NAME, modules => {
+				const [usedIds, modulesInNaturalOrder] =
+					getUsedModuleIdsAndModules(compilation);
+				modulesInNaturalOrder.sort(
+					compareModulesByPreOrderIndexOrIdentifier(compilation.moduleGraph)
+				);
+				assignAscendingModuleIds(usedIds, modulesInNaturalOrder, compilation);
+			});
+		});
+	}
+}
+
+module.exports = NaturalModuleIdsPlugin;
diff --git a/lib/ids/OccurrenceChunkIdsPlugin.js b/lib/ids/OccurrenceChunkIdsPlugin.js
new file mode 100644
index 00000000000..3034e32f2a4
--- /dev/null
+++ b/lib/ids/OccurrenceChunkIdsPlugin.js
@@ -0,0 +1,86 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { compareChunksNatural } = require("../util/comparators");
+const createSchemaValidation = require("../util/create-schema-validation");
+const { assignAscendingChunkIds } = require("./IdHelpers");
+
+/** @typedef {import("../../declarations/plugins/ids/OccurrenceChunkIdsPlugin").OccurrenceChunkIdsPluginOptions} OccurrenceChunkIdsPluginOptions */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Module")} Module */
+
+const validate = createSchemaValidation(
+	require("../../schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.js"),
+	() => require("../../schemas/plugins/ids/OccurrenceChunkIdsPlugin.json"),
+	{
+		name: "Occurrence Order Chunk Ids Plugin",
+		baseDataPath: "options"
+	}
+);
+
+const PLUGIN_NAME = "OccurrenceChunkIdsPlugin";
+
+class OccurrenceChunkIdsPlugin {
+	/**
+	 * @param {OccurrenceChunkIdsPluginOptions=} options options object
+	 */
+	constructor(options = {}) {
+		validate(options);
+		this.options = options;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		const prioritiseInitial = this.options.prioritiseInitial;
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			compilation.hooks.chunkIds.tap(PLUGIN_NAME, chunks => {
+				const chunkGraph = compilation.chunkGraph;
+
+				/** @type {Map} */
+				const occursInInitialChunksMap = new Map();
+
+				const compareNatural = compareChunksNatural(chunkGraph);
+
+				for (const c of chunks) {
+					let occurs = 0;
+					for (const chunkGroup of c.groupsIterable) {
+						for (const parent of chunkGroup.parentsIterable) {
+							if (parent.isInitial()) occurs++;
+						}
+					}
+					occursInInitialChunksMap.set(c, occurs);
+				}
+
+				const chunksInOccurrenceOrder = Array.from(chunks).sort((a, b) => {
+					if (prioritiseInitial) {
+						const aEntryOccurs =
+							/** @type {number} */
+							(occursInInitialChunksMap.get(a));
+						const bEntryOccurs =
+							/** @type {number} */
+							(occursInInitialChunksMap.get(b));
+						if (aEntryOccurs > bEntryOccurs) return -1;
+						if (aEntryOccurs < bEntryOccurs) return 1;
+					}
+					const aOccurs = a.getNumberOfGroups();
+					const bOccurs = b.getNumberOfGroups();
+					if (aOccurs > bOccurs) return -1;
+					if (aOccurs < bOccurs) return 1;
+					return compareNatural(a, b);
+				});
+				assignAscendingChunkIds(chunksInOccurrenceOrder, compilation);
+			});
+		});
+	}
+}
+
+module.exports = OccurrenceChunkIdsPlugin;
diff --git a/lib/ids/OccurrenceModuleIdsPlugin.js b/lib/ids/OccurrenceModuleIdsPlugin.js
new file mode 100644
index 00000000000..72ddd41bcab
--- /dev/null
+++ b/lib/ids/OccurrenceModuleIdsPlugin.js
@@ -0,0 +1,161 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const {
+	compareModulesByPreOrderIndexOrIdentifier
+} = require("../util/comparators");
+const createSchemaValidation = require("../util/create-schema-validation");
+const {
+	assignAscendingModuleIds,
+	getUsedModuleIdsAndModules
+} = require("./IdHelpers");
+
+/** @typedef {import("../../declarations/plugins/ids/OccurrenceModuleIdsPlugin").OccurrenceModuleIdsPluginOptions} OccurrenceModuleIdsPluginOptions */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */
+
+const validate = createSchemaValidation(
+	require("../../schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.js"),
+	() => require("../../schemas/plugins/ids/OccurrenceModuleIdsPlugin.json"),
+	{
+		name: "Occurrence Order Module Ids Plugin",
+		baseDataPath: "options"
+	}
+);
+
+const PLUGIN_NAME = "OccurrenceModuleIdsPlugin";
+
+class OccurrenceModuleIdsPlugin {
+	/**
+	 * @param {OccurrenceModuleIdsPluginOptions=} options options object
+	 */
+	constructor(options = {}) {
+		validate(options);
+		this.options = options;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		const prioritiseInitial = this.options.prioritiseInitial;
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			const moduleGraph = compilation.moduleGraph;
+
+			compilation.hooks.moduleIds.tap(PLUGIN_NAME, () => {
+				const chunkGraph = compilation.chunkGraph;
+
+				const [usedIds, modulesInOccurrenceOrder] =
+					getUsedModuleIdsAndModules(compilation);
+
+				const occursInInitialChunksMap = new Map();
+				const occursInAllChunksMap = new Map();
+
+				const initialChunkChunkMap = new Map();
+				const entryCountMap = new Map();
+				for (const m of modulesInOccurrenceOrder) {
+					let initial = 0;
+					let entry = 0;
+					for (const c of chunkGraph.getModuleChunksIterable(m)) {
+						if (c.canBeInitial()) initial++;
+						if (chunkGraph.isEntryModuleInChunk(m, c)) entry++;
+					}
+					initialChunkChunkMap.set(m, initial);
+					entryCountMap.set(m, entry);
+				}
+
+				/**
+				 * @param {Module} module module
+				 * @returns {number} count of occurs
+				 */
+				const countOccursInEntry = module => {
+					let sum = 0;
+					for (const [
+						originModule,
+						connections
+					] of moduleGraph.getIncomingConnectionsByOriginModule(module)) {
+						if (!originModule) continue;
+						if (!connections.some(c => c.isTargetActive(undefined))) continue;
+						sum += initialChunkChunkMap.get(originModule) || 0;
+					}
+					return sum;
+				};
+
+				/**
+				 * @param {Module} module module
+				 * @returns {number} count of occurs
+				 */
+				const countOccurs = module => {
+					let sum = 0;
+					for (const [
+						originModule,
+						connections
+					] of moduleGraph.getIncomingConnectionsByOriginModule(module)) {
+						if (!originModule) continue;
+						const chunkModules =
+							chunkGraph.getNumberOfModuleChunks(originModule);
+						for (const c of connections) {
+							if (!c.isTargetActive(undefined)) continue;
+							if (!c.dependency) continue;
+							const factor = c.dependency.getNumberOfIdOccurrences();
+							if (factor === 0) continue;
+							sum += factor * chunkModules;
+						}
+					}
+					return sum;
+				};
+
+				if (prioritiseInitial) {
+					for (const m of modulesInOccurrenceOrder) {
+						const result =
+							countOccursInEntry(m) +
+							initialChunkChunkMap.get(m) +
+							entryCountMap.get(m);
+						occursInInitialChunksMap.set(m, result);
+					}
+				}
+
+				for (const m of modulesInOccurrenceOrder) {
+					const result =
+						countOccurs(m) +
+						chunkGraph.getNumberOfModuleChunks(m) +
+						entryCountMap.get(m);
+					occursInAllChunksMap.set(m, result);
+				}
+
+				const naturalCompare = compareModulesByPreOrderIndexOrIdentifier(
+					compilation.moduleGraph
+				);
+
+				modulesInOccurrenceOrder.sort((a, b) => {
+					if (prioritiseInitial) {
+						const aEntryOccurs = occursInInitialChunksMap.get(a);
+						const bEntryOccurs = occursInInitialChunksMap.get(b);
+						if (aEntryOccurs > bEntryOccurs) return -1;
+						if (aEntryOccurs < bEntryOccurs) return 1;
+					}
+					const aOccurs = occursInAllChunksMap.get(a);
+					const bOccurs = occursInAllChunksMap.get(b);
+					if (aOccurs > bOccurs) return -1;
+					if (aOccurs < bOccurs) return 1;
+					return naturalCompare(a, b);
+				});
+
+				assignAscendingModuleIds(
+					usedIds,
+					modulesInOccurrenceOrder,
+					compilation
+				);
+			});
+		});
+	}
+}
+
+module.exports = OccurrenceModuleIdsPlugin;
diff --git a/lib/ids/SyncModuleIdsPlugin.js b/lib/ids/SyncModuleIdsPlugin.js
new file mode 100644
index 00000000000..c29c42c0c49
--- /dev/null
+++ b/lib/ids/SyncModuleIdsPlugin.js
@@ -0,0 +1,150 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { WebpackError } = require("..");
+const { getUsedModuleIdsAndModules } = require("./IdHelpers");
+
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../util/fs").IntermediateFileSystem} IntermediateFileSystem */
+
+const plugin = "SyncModuleIdsPlugin";
+
+/**
+ * @typedef {object} SyncModuleIdsPluginOptions
+ * @property {string} path path to file
+ * @property {string=} context context for module names
+ * @property {((module: Module) => boolean)=} test selector for modules
+ * @property {"read" | "create" | "merge" | "update"=} mode operation mode (defaults to merge)
+ */
+
+class SyncModuleIdsPlugin {
+	/**
+	 * @param {SyncModuleIdsPluginOptions} options options
+	 */
+	constructor({ path, context, test, mode }) {
+		this._path = path;
+		this._context = context;
+		this._test = test || (() => true);
+		const readAndWrite = !mode || mode === "merge" || mode === "update";
+		this._read = readAndWrite || mode === "read";
+		this._write = readAndWrite || mode === "create";
+		this._prune = mode === "update";
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		/** @type {Map} */
+		let data;
+		let dataChanged = false;
+		if (this._read) {
+			compiler.hooks.readRecords.tapAsync(plugin, callback => {
+				const fs =
+					/** @type {IntermediateFileSystem} */
+					(compiler.intermediateFileSystem);
+				fs.readFile(this._path, (err, buffer) => {
+					if (err) {
+						if (err.code !== "ENOENT") {
+							return callback(err);
+						}
+						return callback();
+					}
+					const json = JSON.parse(/** @type {Buffer} */ (buffer).toString());
+					data = new Map();
+					for (const key of Object.keys(json)) {
+						data.set(key, json[key]);
+					}
+					dataChanged = false;
+					return callback();
+				});
+			});
+		}
+		if (this._write) {
+			compiler.hooks.emitRecords.tapAsync(plugin, callback => {
+				if (!data || !dataChanged) return callback();
+				/** @type {{[key: string]: string | number}} */
+				const json = {};
+				const sorted = Array.from(data).sort(([a], [b]) => (a < b ? -1 : 1));
+				for (const [key, value] of sorted) {
+					json[key] = value;
+				}
+				const fs =
+					/** @type {IntermediateFileSystem} */
+					(compiler.intermediateFileSystem);
+				fs.writeFile(this._path, JSON.stringify(json), callback);
+			});
+		}
+		compiler.hooks.thisCompilation.tap(plugin, compilation => {
+			const associatedObjectForCache = compiler.root;
+			const context = this._context || compiler.context;
+			if (this._read) {
+				compilation.hooks.reviveModules.tap(plugin, (_1, _2) => {
+					if (!data) return;
+					const { chunkGraph } = compilation;
+					const [usedIds, modules] = getUsedModuleIdsAndModules(
+						compilation,
+						this._test
+					);
+					for (const module of modules) {
+						const name = module.libIdent({
+							context,
+							associatedObjectForCache
+						});
+						if (!name) continue;
+						const id = data.get(name);
+						const idAsString = `${id}`;
+						if (usedIds.has(idAsString)) {
+							const err = new WebpackError(
+								`SyncModuleIdsPlugin: Unable to restore id '${id}' from '${this._path}' as it's already used.`
+							);
+							err.module = module;
+							compilation.errors.push(err);
+						}
+						chunkGraph.setModuleId(module, /** @type {string | number} */ (id));
+						usedIds.add(idAsString);
+					}
+				});
+			}
+			if (this._write) {
+				compilation.hooks.recordModules.tap(plugin, modules => {
+					const { chunkGraph } = compilation;
+					let oldData = data;
+					if (!oldData) {
+						oldData = data = new Map();
+					} else if (this._prune) {
+						data = new Map();
+					}
+					for (const module of modules) {
+						if (this._test(module)) {
+							const name = module.libIdent({
+								context,
+								associatedObjectForCache
+							});
+							if (!name) continue;
+							const id = chunkGraph.getModuleId(module);
+							if (id === null) continue;
+							const oldId = oldData.get(name);
+							if (oldId !== id) {
+								dataChanged = true;
+							} else if (data === oldData) {
+								continue;
+							}
+							data.set(name, id);
+						}
+					}
+					if (data.size !== oldData.size) dataChanged = true;
+				});
+			}
+		});
+	}
+}
+
+module.exports = SyncModuleIdsPlugin;
diff --git a/lib/index.js b/lib/index.js
new file mode 100644
index 00000000000..ed0c34149e2
--- /dev/null
+++ b/lib/index.js
@@ -0,0 +1,652 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const util = require("util");
+const memoize = require("./util/memoize");
+
+/** @typedef {import("../declarations/WebpackOptions").Entry} Entry */
+/** @typedef {import("../declarations/WebpackOptions").EntryNormalized} EntryNormalized */
+/** @typedef {import("../declarations/WebpackOptions").EntryObject} EntryObject */
+/** @typedef {import("../declarations/WebpackOptions").ExternalItem} ExternalItem */
+/** @typedef {import("../declarations/WebpackOptions").ExternalItemFunction} ExternalItemFunction */
+/** @typedef {import("../declarations/WebpackOptions").ExternalItemFunctionCallback} ExternalItemFunctionCallback */
+/** @typedef {import("../declarations/WebpackOptions").ExternalItemFunctionData} ExternalItemFunctionData */
+/** @typedef {import("../declarations/WebpackOptions").ExternalItemFunctionDataGetResolve} ExternalItemFunctionDataGetResolve */
+/** @typedef {import("../declarations/WebpackOptions").ExternalItemFunctionDataGetResolveCallbackResult} ExternalItemFunctionDataGetResolveCallbackResult */
+/** @typedef {import("../declarations/WebpackOptions").ExternalItemFunctionDataGetResolveResult} ExternalItemFunctionDataGetResolveResult */
+/** @typedef {import("../declarations/WebpackOptions").ExternalItemFunctionPromise} ExternalItemFunctionPromise */
+/** @typedef {import("../declarations/WebpackOptions").ExternalItemObjectKnown} ExternalItemObjectKnown */
+/** @typedef {import("../declarations/WebpackOptions").ExternalItemObjectUnknown} ExternalItemObjectUnknown */
+/** @typedef {import("../declarations/WebpackOptions").ExternalItemValue} ExternalItemValue */
+/** @typedef {import("../declarations/WebpackOptions").Externals} Externals */
+/** @typedef {import("../declarations/WebpackOptions").FileCacheOptions} FileCacheOptions */
+/** @typedef {import("../declarations/WebpackOptions").GeneratorOptionsByModuleTypeKnown} GeneratorOptionsByModuleTypeKnown */
+/** @typedef {import("../declarations/WebpackOptions").LibraryOptions} LibraryOptions */
+/** @typedef {import("../declarations/WebpackOptions").MemoryCacheOptions} MemoryCacheOptions */
+/** @typedef {import("../declarations/WebpackOptions").ModuleOptions} ModuleOptions */
+/** @typedef {import("../declarations/WebpackOptions").ParserOptionsByModuleTypeKnown} ParserOptionsByModuleTypeKnown */
+/** @typedef {import("../declarations/WebpackOptions").ResolveOptions} ResolveOptions */
+/** @typedef {import("../declarations/WebpackOptions").RuleSetCondition} RuleSetCondition */
+/** @typedef {import("../declarations/WebpackOptions").RuleSetConditionAbsolute} RuleSetConditionAbsolute */
+/** @typedef {import("../declarations/WebpackOptions").RuleSetRule} RuleSetRule */
+/** @typedef {import("../declarations/WebpackOptions").RuleSetUse} RuleSetUse */
+/** @typedef {import("../declarations/WebpackOptions").RuleSetUseFunction} RuleSetUseFunction */
+/** @typedef {import("../declarations/WebpackOptions").RuleSetUseItem} RuleSetUseItem */
+/** @typedef {import("../declarations/WebpackOptions").StatsOptions} StatsOptions */
+/** @typedef {import("../declarations/WebpackOptions").WebpackOptions} Configuration */
+/** @typedef {import("../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptionsNormalized */
+/** @typedef {import("../declarations/WebpackOptions").WebpackPluginFunction} WebpackPluginFunction */
+/** @typedef {import("../declarations/WebpackOptions").WebpackPluginInstance} WebpackPluginInstance */
+/** @typedef {import("./ChunkGroup")} ChunkGroup */
+/** @typedef {import("./Compilation").Asset} Asset */
+/** @typedef {import("./Compilation").AssetInfo} AssetInfo */
+/** @typedef {import("./Compilation").EntryOptions} EntryOptions */
+/** @typedef {import("./Compilation").PathData} PathData */
+/** @typedef {import("./Compiler").AssetEmittedInfo} AssetEmittedInfo */
+/** @typedef {import("./Entrypoint")} Entrypoint */
+/** @typedef {import("./MultiCompiler").MultiCompilerOptions} MultiCompilerOptions */
+/** @typedef {import("./MultiStats")} MultiStats */
+/** @typedef {import("./NormalModuleFactory").ResolveData} ResolveData */
+/** @typedef {import("./Parser").ParserState} ParserState */
+/** @typedef {import("./ResolverFactory").ResolvePluginInstance} ResolvePluginInstance */
+/** @typedef {import("./ResolverFactory").Resolver} Resolver */
+/** @typedef {import("./Watching")} Watching */
+/** @typedef {import("./cli").Argument} Argument */
+/** @typedef {import("./cli").Problem} Problem */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsAsset} StatsAsset */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsChunk} StatsChunk */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsChunkGroup} StatsChunkGroup */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsChunkOrigin} StatsChunkOrigin */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsCompilation} StatsCompilation */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsError} StatsError */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsLogging} StatsLogging */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsLoggingEntry} StatsLoggingEntry */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsModule} StatsModule */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsModuleIssuer} StatsModuleIssuer */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsModuleReason} StatsModuleReason */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsModuleTraceDependency} StatsModuleTraceDependency */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsModuleTraceItem} StatsModuleTraceItem */
+/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsProfile} StatsProfile */
+/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
+/** @typedef {import("./util/fs").OutputFileSystem} OutputFileSystem */
+
+/**
+ * @template {EXPECTED_FUNCTION} T
+ * @param {() => T} factory factory function
+ * @returns {T} function
+ */
+const lazyFunction = factory => {
+	const fac = memoize(factory);
+	const f = /** @type {unknown} */ (
+		/**
+		 * @param {...EXPECTED_ANY} args args
+		 * @returns {T} result
+		 */
+		(...args) => fac()(...args)
+	);
+	return /** @type {T} */ (f);
+};
+
+/**
+ * @template A
+ * @template B
+ * @param {A} obj input a
+ * @param {B} exports input b
+ * @returns {A & B} merged
+ */
+const mergeExports = (obj, exports) => {
+	const descriptors = Object.getOwnPropertyDescriptors(exports);
+	for (const name of Object.keys(descriptors)) {
+		const descriptor = descriptors[name];
+		if (descriptor.get) {
+			const fn = descriptor.get;
+			Object.defineProperty(obj, name, {
+				configurable: false,
+				enumerable: true,
+				get: memoize(fn)
+			});
+		} else if (typeof descriptor.value === "object") {
+			Object.defineProperty(obj, name, {
+				configurable: false,
+				enumerable: true,
+				writable: false,
+				value: mergeExports({}, descriptor.value)
+			});
+		} else {
+			throw new Error(
+				"Exposed values must be either a getter or an nested object"
+			);
+		}
+	}
+	return /** @type {A & B} */ (Object.freeze(obj));
+};
+
+const fn = lazyFunction(() => require("./webpack"));
+module.exports = mergeExports(fn, {
+	get webpack() {
+		return require("./webpack");
+	},
+	/**
+	 * @returns {(configuration: Configuration | Configuration[]) => void} validate fn
+	 */
+	get validate() {
+		const webpackOptionsSchemaCheck = require("../schemas/WebpackOptions.check.js");
+		const getRealValidate = memoize(
+			/**
+			 * @returns {(configuration: Configuration | Configuration[]) => void} validate fn
+			 */
+			() => {
+				const validateSchema = require("./validateSchema");
+				const webpackOptionsSchema = require("../schemas/WebpackOptions.json");
+				return options => validateSchema(webpackOptionsSchema, options);
+			}
+		);
+		return options => {
+			if (!webpackOptionsSchemaCheck(/** @type {TODO} */ (options)))
+				getRealValidate()(options);
+		};
+	},
+	get validateSchema() {
+		const validateSchema = require("./validateSchema");
+		return validateSchema;
+	},
+	get version() {
+		return /** @type {string} */ (require("../package.json").version);
+	},
+
+	get cli() {
+		return require("./cli");
+	},
+	get AutomaticPrefetchPlugin() {
+		return require("./AutomaticPrefetchPlugin");
+	},
+	get AsyncDependenciesBlock() {
+		return require("./AsyncDependenciesBlock");
+	},
+	get BannerPlugin() {
+		return require("./BannerPlugin");
+	},
+	get Cache() {
+		return require("./Cache");
+	},
+	get Chunk() {
+		return require("./Chunk");
+	},
+	get ChunkGraph() {
+		return require("./ChunkGraph");
+	},
+	get CleanPlugin() {
+		return require("./CleanPlugin");
+	},
+	get Compilation() {
+		return require("./Compilation");
+	},
+	get Compiler() {
+		return require("./Compiler");
+	},
+	get ConcatenationScope() {
+		return require("./ConcatenationScope");
+	},
+	get ContextExclusionPlugin() {
+		return require("./ContextExclusionPlugin");
+	},
+	get ContextReplacementPlugin() {
+		return require("./ContextReplacementPlugin");
+	},
+	get DefinePlugin() {
+		return require("./DefinePlugin");
+	},
+	get DelegatedPlugin() {
+		return require("./DelegatedPlugin");
+	},
+	get Dependency() {
+		return require("./Dependency");
+	},
+	get DllPlugin() {
+		return require("./DllPlugin");
+	},
+	get DllReferencePlugin() {
+		return require("./DllReferencePlugin");
+	},
+	get DynamicEntryPlugin() {
+		return require("./DynamicEntryPlugin");
+	},
+	get EntryOptionPlugin() {
+		return require("./EntryOptionPlugin");
+	},
+	get EntryPlugin() {
+		return require("./EntryPlugin");
+	},
+	get EnvironmentPlugin() {
+		return require("./EnvironmentPlugin");
+	},
+	get EvalDevToolModulePlugin() {
+		return require("./EvalDevToolModulePlugin");
+	},
+	get EvalSourceMapDevToolPlugin() {
+		return require("./EvalSourceMapDevToolPlugin");
+	},
+	get ExternalModule() {
+		return require("./ExternalModule");
+	},
+	get ExternalsPlugin() {
+		return require("./ExternalsPlugin");
+	},
+	get Generator() {
+		return require("./Generator");
+	},
+	get HotUpdateChunk() {
+		return require("./HotUpdateChunk");
+	},
+	get HotModuleReplacementPlugin() {
+		return require("./HotModuleReplacementPlugin");
+	},
+	get InitFragment() {
+		return require("./InitFragment");
+	},
+	get IgnorePlugin() {
+		return require("./IgnorePlugin");
+	},
+	get JavascriptModulesPlugin() {
+		return util.deprecate(
+			() => require("./javascript/JavascriptModulesPlugin"),
+			"webpack.JavascriptModulesPlugin has moved to webpack.javascript.JavascriptModulesPlugin",
+			"DEP_WEBPACK_JAVASCRIPT_MODULES_PLUGIN"
+		)();
+	},
+	get LibManifestPlugin() {
+		return require("./LibManifestPlugin");
+	},
+	get LibraryTemplatePlugin() {
+		return util.deprecate(
+			() => require("./LibraryTemplatePlugin"),
+			"webpack.LibraryTemplatePlugin is deprecated and has been replaced by compilation.outputOptions.library or compilation.addEntry + passing a library option",
+			"DEP_WEBPACK_LIBRARY_TEMPLATE_PLUGIN"
+		)();
+	},
+	get LoaderOptionsPlugin() {
+		return require("./LoaderOptionsPlugin");
+	},
+	get LoaderTargetPlugin() {
+		return require("./LoaderTargetPlugin");
+	},
+	get Module() {
+		return require("./Module");
+	},
+	get ModuleFilenameHelpers() {
+		return require("./ModuleFilenameHelpers");
+	},
+	get ModuleGraph() {
+		return require("./ModuleGraph");
+	},
+	get ModuleGraphConnection() {
+		return require("./ModuleGraphConnection");
+	},
+	get NoEmitOnErrorsPlugin() {
+		return require("./NoEmitOnErrorsPlugin");
+	},
+	get NormalModule() {
+		return require("./NormalModule");
+	},
+	get NormalModuleReplacementPlugin() {
+		return require("./NormalModuleReplacementPlugin");
+	},
+	get MultiCompiler() {
+		return require("./MultiCompiler");
+	},
+	get OptimizationStages() {
+		return require("./OptimizationStages");
+	},
+	get Parser() {
+		return require("./Parser");
+	},
+	get PlatformPlugin() {
+		return require("./PlatformPlugin");
+	},
+	get PrefetchPlugin() {
+		return require("./PrefetchPlugin");
+	},
+	get ProgressPlugin() {
+		return require("./ProgressPlugin");
+	},
+	get ProvidePlugin() {
+		return require("./ProvidePlugin");
+	},
+	get RuntimeGlobals() {
+		return require("./RuntimeGlobals");
+	},
+	get RuntimeModule() {
+		return require("./RuntimeModule");
+	},
+	get SingleEntryPlugin() {
+		return util.deprecate(
+			() => require("./EntryPlugin"),
+			"SingleEntryPlugin was renamed to EntryPlugin",
+			"DEP_WEBPACK_SINGLE_ENTRY_PLUGIN"
+		)();
+	},
+	get SourceMapDevToolPlugin() {
+		return require("./SourceMapDevToolPlugin");
+	},
+	get Stats() {
+		return require("./Stats");
+	},
+	get Template() {
+		return require("./Template");
+	},
+	get UsageState() {
+		return require("./ExportsInfo").UsageState;
+	},
+	get WatchIgnorePlugin() {
+		return require("./WatchIgnorePlugin");
+	},
+	get WebpackError() {
+		return require("./WebpackError");
+	},
+	get WebpackOptionsApply() {
+		return require("./WebpackOptionsApply");
+	},
+	get WebpackOptionsDefaulter() {
+		return util.deprecate(
+			() => require("./WebpackOptionsDefaulter"),
+			"webpack.WebpackOptionsDefaulter is deprecated and has been replaced by webpack.config.getNormalizedWebpackOptions and webpack.config.applyWebpackOptionsDefaults",
+			"DEP_WEBPACK_OPTIONS_DEFAULTER"
+		)();
+	},
+	// TODO webpack 6 deprecate
+	get WebpackOptionsValidationError() {
+		return require("schema-utils").ValidationError;
+	},
+	get ValidationError() {
+		return require("schema-utils").ValidationError;
+	},
+
+	cache: {
+		get MemoryCachePlugin() {
+			return require("./cache/MemoryCachePlugin");
+		}
+	},
+
+	config: {
+		get getNormalizedWebpackOptions() {
+			return require("./config/normalization").getNormalizedWebpackOptions;
+		},
+		get applyWebpackOptionsDefaults() {
+			return require("./config/defaults").applyWebpackOptionsDefaults;
+		}
+	},
+
+	dependencies: {
+		get ModuleDependency() {
+			return require("./dependencies/ModuleDependency");
+		},
+		get HarmonyImportDependency() {
+			return require("./dependencies/HarmonyImportDependency");
+		},
+		get ConstDependency() {
+			return require("./dependencies/ConstDependency");
+		},
+		get NullDependency() {
+			return require("./dependencies/NullDependency");
+		}
+	},
+
+	ids: {
+		get ChunkModuleIdRangePlugin() {
+			return require("./ids/ChunkModuleIdRangePlugin");
+		},
+		get NaturalModuleIdsPlugin() {
+			return require("./ids/NaturalModuleIdsPlugin");
+		},
+		get OccurrenceModuleIdsPlugin() {
+			return require("./ids/OccurrenceModuleIdsPlugin");
+		},
+		get NamedModuleIdsPlugin() {
+			return require("./ids/NamedModuleIdsPlugin");
+		},
+		get DeterministicChunkIdsPlugin() {
+			return require("./ids/DeterministicChunkIdsPlugin");
+		},
+		get DeterministicModuleIdsPlugin() {
+			return require("./ids/DeterministicModuleIdsPlugin");
+		},
+		get NamedChunkIdsPlugin() {
+			return require("./ids/NamedChunkIdsPlugin");
+		},
+		get OccurrenceChunkIdsPlugin() {
+			return require("./ids/OccurrenceChunkIdsPlugin");
+		},
+		get HashedModuleIdsPlugin() {
+			return require("./ids/HashedModuleIdsPlugin");
+		}
+	},
+
+	javascript: {
+		get EnableChunkLoadingPlugin() {
+			return require("./javascript/EnableChunkLoadingPlugin");
+		},
+		get JavascriptModulesPlugin() {
+			return require("./javascript/JavascriptModulesPlugin");
+		},
+		get JavascriptParser() {
+			return require("./javascript/JavascriptParser");
+		}
+	},
+
+	optimize: {
+		get AggressiveMergingPlugin() {
+			return require("./optimize/AggressiveMergingPlugin");
+		},
+		get AggressiveSplittingPlugin() {
+			return util.deprecate(
+				() => require("./optimize/AggressiveSplittingPlugin"),
+				"AggressiveSplittingPlugin is deprecated in favor of SplitChunksPlugin",
+				"DEP_WEBPACK_AGGRESSIVE_SPLITTING_PLUGIN"
+			)();
+		},
+		get InnerGraph() {
+			return require("./optimize/InnerGraph");
+		},
+		get LimitChunkCountPlugin() {
+			return require("./optimize/LimitChunkCountPlugin");
+		},
+		get MergeDuplicateChunksPlugin() {
+			return require("./optimize/MergeDuplicateChunksPlugin.js");
+		},
+		get MinChunkSizePlugin() {
+			return require("./optimize/MinChunkSizePlugin");
+		},
+		get ModuleConcatenationPlugin() {
+			return require("./optimize/ModuleConcatenationPlugin");
+		},
+		get RealContentHashPlugin() {
+			return require("./optimize/RealContentHashPlugin");
+		},
+		get RuntimeChunkPlugin() {
+			return require("./optimize/RuntimeChunkPlugin");
+		},
+		get SideEffectsFlagPlugin() {
+			return require("./optimize/SideEffectsFlagPlugin");
+		},
+		get SplitChunksPlugin() {
+			return require("./optimize/SplitChunksPlugin");
+		}
+	},
+
+	runtime: {
+		get GetChunkFilenameRuntimeModule() {
+			return require("./runtime/GetChunkFilenameRuntimeModule");
+		},
+		get LoadScriptRuntimeModule() {
+			return require("./runtime/LoadScriptRuntimeModule");
+		}
+	},
+
+	prefetch: {
+		get ChunkPrefetchPreloadPlugin() {
+			return require("./prefetch/ChunkPrefetchPreloadPlugin");
+		}
+	},
+
+	web: {
+		get FetchCompileWasmPlugin() {
+			return require("./web/FetchCompileWasmPlugin");
+		},
+		get FetchCompileAsyncWasmPlugin() {
+			return require("./web/FetchCompileAsyncWasmPlugin");
+		},
+		get JsonpChunkLoadingRuntimeModule() {
+			return require("./web/JsonpChunkLoadingRuntimeModule");
+		},
+		get JsonpTemplatePlugin() {
+			return require("./web/JsonpTemplatePlugin");
+		},
+		get CssLoadingRuntimeModule() {
+			return require("./css/CssLoadingRuntimeModule");
+		}
+	},
+
+	esm: {
+		get ModuleChunkLoadingRuntimeModule() {
+			return require("./esm/ModuleChunkLoadingRuntimeModule");
+		}
+	},
+
+	webworker: {
+		get WebWorkerTemplatePlugin() {
+			return require("./webworker/WebWorkerTemplatePlugin");
+		}
+	},
+
+	node: {
+		get NodeEnvironmentPlugin() {
+			return require("./node/NodeEnvironmentPlugin");
+		},
+		get NodeSourcePlugin() {
+			return require("./node/NodeSourcePlugin");
+		},
+		get NodeTargetPlugin() {
+			return require("./node/NodeTargetPlugin");
+		},
+		get NodeTemplatePlugin() {
+			return require("./node/NodeTemplatePlugin");
+		},
+		get ReadFileCompileWasmPlugin() {
+			return require("./node/ReadFileCompileWasmPlugin");
+		},
+		get ReadFileCompileAsyncWasmPlugin() {
+			return require("./node/ReadFileCompileAsyncWasmPlugin");
+		}
+	},
+
+	electron: {
+		get ElectronTargetPlugin() {
+			return require("./electron/ElectronTargetPlugin");
+		}
+	},
+
+	wasm: {
+		get AsyncWebAssemblyModulesPlugin() {
+			return require("./wasm-async/AsyncWebAssemblyModulesPlugin");
+		},
+		get EnableWasmLoadingPlugin() {
+			return require("./wasm/EnableWasmLoadingPlugin");
+		}
+	},
+
+	css: {
+		get CssModulesPlugin() {
+			return require("./css/CssModulesPlugin");
+		}
+	},
+
+	library: {
+		get AbstractLibraryPlugin() {
+			return require("./library/AbstractLibraryPlugin");
+		},
+		get EnableLibraryPlugin() {
+			return require("./library/EnableLibraryPlugin");
+		}
+	},
+
+	container: {
+		get ContainerPlugin() {
+			return require("./container/ContainerPlugin");
+		},
+		get ContainerReferencePlugin() {
+			return require("./container/ContainerReferencePlugin");
+		},
+		get ModuleFederationPlugin() {
+			return require("./container/ModuleFederationPlugin");
+		},
+		get scope() {
+			return require("./container/options").scope;
+		}
+	},
+
+	sharing: {
+		get ConsumeSharedPlugin() {
+			return require("./sharing/ConsumeSharedPlugin");
+		},
+		get ProvideSharedPlugin() {
+			return require("./sharing/ProvideSharedPlugin");
+		},
+		get SharePlugin() {
+			return require("./sharing/SharePlugin");
+		},
+		get scope() {
+			return require("./container/options").scope;
+		}
+	},
+
+	debug: {
+		get ProfilingPlugin() {
+			return require("./debug/ProfilingPlugin");
+		}
+	},
+
+	util: {
+		get createHash() {
+			return require("./util/createHash");
+		},
+		get comparators() {
+			return require("./util/comparators");
+		},
+		get runtime() {
+			return require("./util/runtime");
+		},
+		get serialization() {
+			return require("./util/serialization");
+		},
+		get cleverMerge() {
+			return require("./util/cleverMerge").cachedCleverMerge;
+		},
+		get LazySet() {
+			return require("./util/LazySet");
+		},
+		get compileBooleanMatcher() {
+			return require("./util/compileBooleanMatcher");
+		}
+	},
+
+	get sources() {
+		return require("webpack-sources");
+	},
+
+	experiments: {
+		schemes: {
+			get HttpUriPlugin() {
+				return require("./schemes/HttpUriPlugin");
+			}
+		},
+		ids: {
+			get SyncModuleIdsPlugin() {
+				return require("./ids/SyncModuleIdsPlugin");
+			}
+		}
+	}
+});
diff --git a/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js b/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js
new file mode 100644
index 00000000000..1bb04abaffb
--- /dev/null
+++ b/lib/javascript/ArrayPushCallbackChunkFormatPlugin.js
@@ -0,0 +1,156 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { ConcatSource, PrefixSource, RawSource } = require("webpack-sources");
+const { RuntimeGlobals } = require("..");
+const HotUpdateChunk = require("../HotUpdateChunk");
+const Template = require("../Template");
+const { getCompilationHooks } = require("./JavascriptModulesPlugin");
+const {
+	generateEntryStartup,
+	updateHashForEntryStartup
+} = require("./StartupHelpers");
+
+/** @typedef {import("../Compiler")} Compiler */
+
+class ArrayPushCallbackChunkFormatPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.thisCompilation.tap(
+			"ArrayPushCallbackChunkFormatPlugin",
+			compilation => {
+				compilation.hooks.additionalChunkRuntimeRequirements.tap(
+					"ArrayPushCallbackChunkFormatPlugin",
+					(chunk, set, { chunkGraph }) => {
+						if (chunk.hasRuntime()) return;
+						if (chunkGraph.getNumberOfEntryModules(chunk) > 0) {
+							set.add(RuntimeGlobals.onChunksLoaded);
+							set.add(RuntimeGlobals.exports);
+							set.add(RuntimeGlobals.require);
+						}
+						set.add(RuntimeGlobals.chunkCallback);
+					}
+				);
+				const hooks = getCompilationHooks(compilation);
+				hooks.renderChunk.tap(
+					"ArrayPushCallbackChunkFormatPlugin",
+					(modules, renderContext) => {
+						const { chunk, chunkGraph, runtimeTemplate } = renderContext;
+						const hotUpdateChunk =
+							chunk instanceof HotUpdateChunk ? chunk : null;
+						const globalObject = runtimeTemplate.globalObject;
+						const source = new ConcatSource();
+						const runtimeModules =
+							chunkGraph.getChunkRuntimeModulesInOrder(chunk);
+						if (hotUpdateChunk) {
+							const hotUpdateGlobal =
+								runtimeTemplate.outputOptions.hotUpdateGlobal;
+							source.add(
+								`${globalObject}[${JSON.stringify(hotUpdateGlobal)}](`
+							);
+							source.add(`${JSON.stringify(chunk.id)},`);
+							source.add(modules);
+							if (runtimeModules.length > 0) {
+								source.add(",\n");
+								const runtimePart = Template.renderChunkRuntimeModules(
+									runtimeModules,
+									renderContext
+								);
+								source.add(runtimePart);
+							}
+							source.add(")");
+						} else {
+							const chunkLoadingGlobal =
+								runtimeTemplate.outputOptions.chunkLoadingGlobal;
+							source.add(
+								`(${globalObject}[${JSON.stringify(
+									chunkLoadingGlobal
+								)}] = ${globalObject}[${JSON.stringify(
+									chunkLoadingGlobal
+								)}] || []).push([`
+							);
+							source.add(`${JSON.stringify(chunk.ids)},`);
+							source.add(modules);
+							const entries = Array.from(
+								chunkGraph.getChunkEntryModulesWithChunkGroupIterable(chunk)
+							);
+							if (runtimeModules.length > 0 || entries.length > 0) {
+								const runtime = new ConcatSource(
+									`${
+										runtimeTemplate.supportsArrowFunction()
+											? `${RuntimeGlobals.require} =>`
+											: `function(${RuntimeGlobals.require})`
+									} { // webpackRuntimeModules\n`
+								);
+								if (runtimeModules.length > 0) {
+									runtime.add(
+										Template.renderRuntimeModules(runtimeModules, {
+											...renderContext,
+											codeGenerationResults: compilation.codeGenerationResults
+										})
+									);
+								}
+								if (entries.length > 0) {
+									const startupSource = new RawSource(
+										generateEntryStartup(
+											chunkGraph,
+											runtimeTemplate,
+											entries,
+											chunk,
+											true
+										)
+									);
+									runtime.add(
+										hooks.renderStartup.call(
+											startupSource,
+											entries[entries.length - 1][0],
+											{
+												...renderContext,
+												inlined: false
+											}
+										)
+									);
+									if (
+										chunkGraph
+											.getChunkRuntimeRequirements(chunk)
+											.has(RuntimeGlobals.returnExportsFromRuntime)
+									) {
+										runtime.add(`return ${RuntimeGlobals.exports};\n`);
+									}
+								}
+								runtime.add("}\n");
+								source.add(",\n");
+								source.add(new PrefixSource("/******/ ", runtime));
+							}
+							source.add("])");
+						}
+						return source;
+					}
+				);
+				hooks.chunkHash.tap(
+					"ArrayPushCallbackChunkFormatPlugin",
+					(chunk, hash, { chunkGraph, runtimeTemplate }) => {
+						if (chunk.hasRuntime()) return;
+						hash.update(
+							`ArrayPushCallbackChunkFormatPlugin1${runtimeTemplate.outputOptions.chunkLoadingGlobal}${runtimeTemplate.outputOptions.hotUpdateGlobal}${runtimeTemplate.globalObject}`
+						);
+						const entries = Array.from(
+							chunkGraph.getChunkEntryModulesWithChunkGroupIterable(chunk)
+						);
+						updateHashForEntryStartup(hash, chunkGraph, entries, chunk);
+					}
+				);
+			}
+		);
+	}
+}
+
+module.exports = ArrayPushCallbackChunkFormatPlugin;
diff --git a/lib/javascript/BasicEvaluatedExpression.js b/lib/javascript/BasicEvaluatedExpression.js
new file mode 100644
index 00000000000..6615c5bd1b6
--- /dev/null
+++ b/lib/javascript/BasicEvaluatedExpression.js
@@ -0,0 +1,594 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+/** @typedef {import("estree").Node} Node */
+/** @typedef {import("./JavascriptParser").Range} Range */
+/** @typedef {import("./JavascriptParser").VariableInfo} VariableInfo */
+
+const TypeUnknown = 0;
+const TypeUndefined = 1;
+const TypeNull = 2;
+const TypeString = 3;
+const TypeNumber = 4;
+const TypeBoolean = 5;
+const TypeRegExp = 6;
+const TypeConditional = 7;
+const TypeArray = 8;
+const TypeConstArray = 9;
+const TypeIdentifier = 10;
+const TypeWrapped = 11;
+const TypeTemplateString = 12;
+const TypeBigInt = 13;
+
+class BasicEvaluatedExpression {
+	constructor() {
+		this.type = TypeUnknown;
+		/** @type {Range | undefined} */
+		this.range = undefined;
+		/** @type {boolean} */
+		this.falsy = false;
+		/** @type {boolean} */
+		this.truthy = false;
+		/** @type {boolean | undefined} */
+		this.nullish = undefined;
+		/** @type {boolean} */
+		this.sideEffects = true;
+		/** @type {boolean | undefined} */
+		this.bool = undefined;
+		/** @type {number | undefined} */
+		this.number = undefined;
+		/** @type {bigint | undefined} */
+		this.bigint = undefined;
+		/** @type {RegExp | undefined} */
+		this.regExp = undefined;
+		/** @type {string | undefined} */
+		this.string = undefined;
+		/** @type {BasicEvaluatedExpression[] | undefined} */
+		this.quasis = undefined;
+		/** @type {BasicEvaluatedExpression[] | undefined} */
+		this.parts = undefined;
+		/** @type {EXPECTED_ANY[] | undefined} */
+		this.array = undefined;
+		/** @type {BasicEvaluatedExpression[] | undefined} */
+		this.items = undefined;
+		/** @type {BasicEvaluatedExpression[] | undefined} */
+		this.options = undefined;
+		/** @type {BasicEvaluatedExpression | undefined | null} */
+		this.prefix = undefined;
+		/** @type {BasicEvaluatedExpression | undefined | null} */
+		this.postfix = undefined;
+		/** @type {BasicEvaluatedExpression[] | undefined} */
+		this.wrappedInnerExpressions = undefined;
+		/** @type {string | VariableInfo | undefined} */
+		this.identifier = undefined;
+		/** @type {string | VariableInfo | undefined} */
+		this.rootInfo = undefined;
+		/** @type {(() => string[]) | undefined} */
+		this.getMembers = undefined;
+		/** @type {(() => boolean[]) | undefined} */
+		this.getMembersOptionals = undefined;
+		/** @type {(() => Range[]) | undefined} */
+		this.getMemberRanges = undefined;
+		/** @type {Node | undefined} */
+		this.expression = undefined;
+	}
+
+	isUnknown() {
+		return this.type === TypeUnknown;
+	}
+
+	isNull() {
+		return this.type === TypeNull;
+	}
+
+	isUndefined() {
+		return this.type === TypeUndefined;
+	}
+
+	isString() {
+		return this.type === TypeString;
+	}
+
+	isNumber() {
+		return this.type === TypeNumber;
+	}
+
+	isBigInt() {
+		return this.type === TypeBigInt;
+	}
+
+	isBoolean() {
+		return this.type === TypeBoolean;
+	}
+
+	isRegExp() {
+		return this.type === TypeRegExp;
+	}
+
+	isConditional() {
+		return this.type === TypeConditional;
+	}
+
+	isArray() {
+		return this.type === TypeArray;
+	}
+
+	isConstArray() {
+		return this.type === TypeConstArray;
+	}
+
+	isIdentifier() {
+		return this.type === TypeIdentifier;
+	}
+
+	isWrapped() {
+		return this.type === TypeWrapped;
+	}
+
+	isTemplateString() {
+		return this.type === TypeTemplateString;
+	}
+
+	/**
+	 * Is expression a primitive or an object type value?
+	 * @returns {boolean | undefined} true: primitive type, false: object type, undefined: unknown/runtime-defined
+	 */
+	isPrimitiveType() {
+		switch (this.type) {
+			case TypeUndefined:
+			case TypeNull:
+			case TypeString:
+			case TypeNumber:
+			case TypeBoolean:
+			case TypeBigInt:
+			case TypeWrapped:
+			case TypeTemplateString:
+				return true;
+			case TypeRegExp:
+			case TypeArray:
+			case TypeConstArray:
+				return false;
+			default:
+				return undefined;
+		}
+	}
+
+	/**
+	 * Is expression a runtime or compile-time value?
+	 * @returns {boolean} true: compile time value, false: runtime value
+	 */
+	isCompileTimeValue() {
+		switch (this.type) {
+			case TypeUndefined:
+			case TypeNull:
+			case TypeString:
+			case TypeNumber:
+			case TypeBoolean:
+			case TypeRegExp:
+			case TypeConstArray:
+			case TypeBigInt:
+				return true;
+			default:
+				return false;
+		}
+	}
+
+	/**
+	 * Gets the compile-time value of the expression
+	 * @returns {undefined | null | string | number | boolean | RegExp | EXPECTED_ANY[] | bigint} the javascript value
+	 */
+	asCompileTimeValue() {
+		switch (this.type) {
+			case TypeUndefined:
+				return;
+			case TypeNull:
+				return null;
+			case TypeString:
+				return this.string;
+			case TypeNumber:
+				return this.number;
+			case TypeBoolean:
+				return this.bool;
+			case TypeRegExp:
+				return this.regExp;
+			case TypeConstArray:
+				return this.array;
+			case TypeBigInt:
+				return this.bigint;
+			default:
+				throw new Error(
+					"asCompileTimeValue must only be called for compile-time values"
+				);
+		}
+	}
+
+	isTruthy() {
+		return this.truthy;
+	}
+
+	isFalsy() {
+		return this.falsy;
+	}
+
+	isNullish() {
+		return this.nullish;
+	}
+
+	/**
+	 * Can this expression have side effects?
+	 * @returns {boolean} false: never has side effects
+	 */
+	couldHaveSideEffects() {
+		return this.sideEffects;
+	}
+
+	/**
+	 * Creates a boolean representation of this evaluated expression.
+	 * @returns {boolean | undefined} true: truthy, false: falsy, undefined: unknown
+	 */
+	asBool() {
+		if (this.truthy) return true;
+		if (this.falsy || this.nullish) return false;
+		if (this.isBoolean()) return this.bool;
+		if (this.isNull()) return false;
+		if (this.isUndefined()) return false;
+		if (this.isString()) return this.string !== "";
+		if (this.isNumber()) return this.number !== 0;
+		if (this.isBigInt()) return this.bigint !== BigInt(0);
+		if (this.isRegExp()) return true;
+		if (this.isArray()) return true;
+		if (this.isConstArray()) return true;
+		if (this.isWrapped()) {
+			return (this.prefix && this.prefix.asBool()) ||
+				(this.postfix && this.postfix.asBool())
+				? true
+				: undefined;
+		}
+		if (this.isTemplateString()) {
+			const str = this.asString();
+			if (typeof str === "string") return str !== "";
+		}
+	}
+
+	/**
+	 * Creates a nullish coalescing representation of this evaluated expression.
+	 * @returns {boolean | undefined} true: nullish, false: not nullish, undefined: unknown
+	 */
+	asNullish() {
+		const nullish = this.isNullish();
+
+		if (nullish === true || this.isNull() || this.isUndefined()) return true;
+
+		if (nullish === false) return false;
+		if (this.isTruthy()) return false;
+		if (this.isBoolean()) return false;
+		if (this.isString()) return false;
+		if (this.isNumber()) return false;
+		if (this.isBigInt()) return false;
+		if (this.isRegExp()) return false;
+		if (this.isArray()) return false;
+		if (this.isConstArray()) return false;
+		if (this.isTemplateString()) return false;
+		if (this.isRegExp()) return false;
+	}
+
+	/**
+	 * Creates a string representation of this evaluated expression.
+	 * @returns {string | undefined} the string representation or undefined if not possible
+	 */
+	asString() {
+		if (this.isBoolean()) return `${this.bool}`;
+		if (this.isNull()) return "null";
+		if (this.isUndefined()) return "undefined";
+		if (this.isString()) return this.string;
+		if (this.isNumber()) return `${this.number}`;
+		if (this.isBigInt()) return `${this.bigint}`;
+		if (this.isRegExp()) return `${this.regExp}`;
+		if (this.isArray()) {
+			const array = [];
+			for (const item of /** @type {BasicEvaluatedExpression[]} */ (
+				this.items
+			)) {
+				const itemStr = item.asString();
+				if (itemStr === undefined) return;
+				array.push(itemStr);
+			}
+			return `${array}`;
+		}
+		if (this.isConstArray()) return `${this.array}`;
+		if (this.isTemplateString()) {
+			let str = "";
+			for (const part of /** @type {BasicEvaluatedExpression[]} */ (
+				this.parts
+			)) {
+				const partStr = part.asString();
+				if (partStr === undefined) return;
+				str += partStr;
+			}
+			return str;
+		}
+	}
+
+	/**
+	 * @param {string} string value
+	 * @returns {BasicEvaluatedExpression} basic evaluated expression
+	 */
+	setString(string) {
+		this.type = TypeString;
+		this.string = string;
+		this.sideEffects = false;
+		return this;
+	}
+
+	setUndefined() {
+		this.type = TypeUndefined;
+		this.sideEffects = false;
+		return this;
+	}
+
+	setNull() {
+		this.type = TypeNull;
+		this.sideEffects = false;
+		return this;
+	}
+
+	/**
+	 * Set's the value of this expression to a number
+	 * @param {number} number number to set
+	 * @returns {this} this
+	 */
+	setNumber(number) {
+		this.type = TypeNumber;
+		this.number = number;
+		this.sideEffects = false;
+		return this;
+	}
+
+	/**
+	 * Set's the value of this expression to a BigInt
+	 * @param {bigint} bigint bigint to set
+	 * @returns {this} this
+	 */
+	setBigInt(bigint) {
+		this.type = TypeBigInt;
+		this.bigint = bigint;
+		this.sideEffects = false;
+		return this;
+	}
+
+	/**
+	 * Set's the value of this expression to a boolean
+	 * @param {boolean} bool boolean to set
+	 * @returns {this} this
+	 */
+	setBoolean(bool) {
+		this.type = TypeBoolean;
+		this.bool = bool;
+		this.sideEffects = false;
+		return this;
+	}
+
+	/**
+	 * Set's the value of this expression to a regular expression
+	 * @param {RegExp} regExp regular expression to set
+	 * @returns {this} this
+	 */
+	setRegExp(regExp) {
+		this.type = TypeRegExp;
+		this.regExp = regExp;
+		this.sideEffects = false;
+		return this;
+	}
+
+	/**
+	 * Set's the value of this expression to a particular identifier and its members.
+	 * @param {string | VariableInfo} identifier identifier to set
+	 * @param {string | VariableInfo} rootInfo root info
+	 * @param {() => string[]} getMembers members
+	 * @param {() => boolean[]=} getMembersOptionals optional members
+	 * @param {() => Range[]=} getMemberRanges ranges of progressively increasing sub-expressions
+	 * @returns {this} this
+	 */
+	setIdentifier(
+		identifier,
+		rootInfo,
+		getMembers,
+		getMembersOptionals,
+		getMemberRanges
+	) {
+		this.type = TypeIdentifier;
+		this.identifier = identifier;
+		this.rootInfo = rootInfo;
+		this.getMembers = getMembers;
+		this.getMembersOptionals = getMembersOptionals;
+		this.getMemberRanges = getMemberRanges;
+		this.sideEffects = true;
+		return this;
+	}
+
+	/**
+	 * Wraps an array of expressions with a prefix and postfix expression.
+	 * @param {BasicEvaluatedExpression | null | undefined} prefix Expression to be added before the innerExpressions
+	 * @param {BasicEvaluatedExpression | null | undefined} postfix Expression to be added after the innerExpressions
+	 * @param {BasicEvaluatedExpression[] | undefined} innerExpressions Expressions to be wrapped
+	 * @returns {this} this
+	 */
+	setWrapped(prefix, postfix, innerExpressions) {
+		this.type = TypeWrapped;
+		this.prefix = prefix;
+		this.postfix = postfix;
+		this.wrappedInnerExpressions = innerExpressions;
+		this.sideEffects = true;
+		return this;
+	}
+
+	/**
+	 * Stores the options of a conditional expression.
+	 * @param {BasicEvaluatedExpression[]} options optional (consequent/alternate) expressions to be set
+	 * @returns {this} this
+	 */
+	setOptions(options) {
+		this.type = TypeConditional;
+		this.options = options;
+		this.sideEffects = true;
+		return this;
+	}
+
+	/**
+	 * Adds options to a conditional expression.
+	 * @param {BasicEvaluatedExpression[]} options optional (consequent/alternate) expressions to be added
+	 * @returns {this} this
+	 */
+	addOptions(options) {
+		if (!this.options) {
+			this.type = TypeConditional;
+			this.options = [];
+			this.sideEffects = true;
+		}
+		for (const item of options) {
+			this.options.push(item);
+		}
+		return this;
+	}
+
+	/**
+	 * Set's the value of this expression to an array of expressions.
+	 * @param {BasicEvaluatedExpression[]} items expressions to set
+	 * @returns {this} this
+	 */
+	setItems(items) {
+		this.type = TypeArray;
+		this.items = items;
+		this.sideEffects = items.some(i => i.couldHaveSideEffects());
+		return this;
+	}
+
+	/**
+	 * Set's the value of this expression to an array of strings.
+	 * @param {string[]} array array to set
+	 * @returns {this} this
+	 */
+	setArray(array) {
+		this.type = TypeConstArray;
+		this.array = array;
+		this.sideEffects = false;
+		return this;
+	}
+
+	/**
+	 * Set's the value of this expression to a processed/unprocessed template string. Used
+	 * for evaluating TemplateLiteral expressions in the JavaScript Parser.
+	 * @param {BasicEvaluatedExpression[]} quasis template string quasis
+	 * @param {BasicEvaluatedExpression[]} parts template string parts
+	 * @param {"cooked" | "raw"} kind template string kind
+	 * @returns {this} this
+	 */
+	setTemplateString(quasis, parts, kind) {
+		this.type = TypeTemplateString;
+		this.quasis = quasis;
+		this.parts = parts;
+		this.templateStringKind = kind;
+		this.sideEffects = parts.some(p => p.sideEffects);
+		return this;
+	}
+
+	setTruthy() {
+		this.falsy = false;
+		this.truthy = true;
+		this.nullish = false;
+		return this;
+	}
+
+	setFalsy() {
+		this.falsy = true;
+		this.truthy = false;
+		return this;
+	}
+
+	/**
+	 * Set's the value of the expression to nullish.
+	 * @param {boolean} value true, if the expression is nullish
+	 * @returns {this} this
+	 */
+	setNullish(value) {
+		this.nullish = value;
+
+		if (value) return this.setFalsy();
+
+		return this;
+	}
+
+	/**
+	 * Set's the range for the expression.
+	 * @param {Range} range range to set
+	 * @returns {this} this
+	 */
+	setRange(range) {
+		this.range = range;
+		return this;
+	}
+
+	/**
+	 * Set whether or not the expression has side effects.
+	 * @param {boolean} sideEffects true, if the expression has side effects
+	 * @returns {this} this
+	 */
+	setSideEffects(sideEffects = true) {
+		this.sideEffects = sideEffects;
+		return this;
+	}
+
+	/**
+	 * Set the expression node for the expression.
+	 * @param {Node | undefined} expression expression
+	 * @returns {this} this
+	 */
+	setExpression(expression) {
+		this.expression = expression;
+		return this;
+	}
+}
+
+/**
+ * @param {string} flags regexp flags
+ * @returns {boolean} is valid flags
+ */
+BasicEvaluatedExpression.isValidRegExpFlags = flags => {
+	const len = flags.length;
+
+	if (len === 0) return true;
+	if (len > 4) return false;
+
+	// cspell:word gimy
+	let remaining = 0b0000; // bit per RegExp flag: gimy
+
+	for (let i = 0; i < len; i++)
+		switch (flags.charCodeAt(i)) {
+			case 103 /* g */:
+				if (remaining & 0b1000) return false;
+				remaining |= 0b1000;
+				break;
+			case 105 /* i */:
+				if (remaining & 0b0100) return false;
+				remaining |= 0b0100;
+				break;
+			case 109 /* m */:
+				if (remaining & 0b0010) return false;
+				remaining |= 0b0010;
+				break;
+			case 121 /* y */:
+				if (remaining & 0b0001) return false;
+				remaining |= 0b0001;
+				break;
+			default:
+				return false;
+		}
+
+	return true;
+};
+
+module.exports = BasicEvaluatedExpression;
diff --git a/lib/javascript/ChunkHelpers.js b/lib/javascript/ChunkHelpers.js
new file mode 100644
index 00000000000..f2e8a12a996
--- /dev/null
+++ b/lib/javascript/ChunkHelpers.js
@@ -0,0 +1,33 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const Entrypoint = require("../Entrypoint");
+
+/** @typedef {import("../Chunk")} Chunk */
+
+/**
+ * @param {Entrypoint} entrypoint a chunk group
+ * @param {(Chunk | null)=} excludedChunk1 current chunk which is excluded
+ * @param {(Chunk | null)=} excludedChunk2 runtime chunk which is excluded
+ * @returns {Set} chunks
+ */
+const getAllChunks = (entrypoint, excludedChunk1, excludedChunk2) => {
+	const queue = new Set([entrypoint]);
+	const chunks = new Set();
+	for (const entrypoint of queue) {
+		for (const chunk of entrypoint.chunks) {
+			if (chunk === excludedChunk1) continue;
+			if (chunk === excludedChunk2) continue;
+			chunks.add(chunk);
+		}
+		for (const parent of entrypoint.parentsIterable) {
+			if (parent instanceof Entrypoint) queue.add(parent);
+		}
+	}
+	return chunks;
+};
+module.exports.getAllChunks = getAllChunks;
diff --git a/lib/javascript/CommonJsChunkFormatPlugin.js b/lib/javascript/CommonJsChunkFormatPlugin.js
new file mode 100644
index 00000000000..75384ab9a50
--- /dev/null
+++ b/lib/javascript/CommonJsChunkFormatPlugin.js
@@ -0,0 +1,175 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { ConcatSource, RawSource } = require("webpack-sources");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+const { getUndoPath } = require("../util/identifier");
+const {
+	getChunkFilenameTemplate,
+	getCompilationHooks
+} = require("./JavascriptModulesPlugin");
+const {
+	generateEntryStartup,
+	updateHashForEntryStartup
+} = require("./StartupHelpers");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Entrypoint")} Entrypoint */
+
+class CommonJsChunkFormatPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.thisCompilation.tap(
+			"CommonJsChunkFormatPlugin",
+			compilation => {
+				compilation.hooks.additionalChunkRuntimeRequirements.tap(
+					"CommonJsChunkFormatPlugin",
+					(chunk, set, { chunkGraph }) => {
+						if (chunk.hasRuntime()) return;
+						if (chunkGraph.getNumberOfEntryModules(chunk) > 0) {
+							set.add(RuntimeGlobals.require);
+							set.add(RuntimeGlobals.startupEntrypoint);
+							set.add(RuntimeGlobals.externalInstallChunk);
+						}
+					}
+				);
+				const hooks = getCompilationHooks(compilation);
+				hooks.renderChunk.tap(
+					"CommonJsChunkFormatPlugin",
+					(modules, renderContext) => {
+						const { chunk, chunkGraph, runtimeTemplate } = renderContext;
+						const source = new ConcatSource();
+						source.add(`exports.id = ${JSON.stringify(chunk.id)};\n`);
+						source.add(`exports.ids = ${JSON.stringify(chunk.ids)};\n`);
+						source.add("exports.modules = ");
+						source.add(modules);
+						source.add(";\n");
+						const runtimeModules =
+							chunkGraph.getChunkRuntimeModulesInOrder(chunk);
+						if (runtimeModules.length > 0) {
+							source.add("exports.runtime =\n");
+							source.add(
+								Template.renderChunkRuntimeModules(
+									runtimeModules,
+									renderContext
+								)
+							);
+						}
+						const entries = Array.from(
+							chunkGraph.getChunkEntryModulesWithChunkGroupIterable(chunk)
+						);
+						if (entries.length > 0) {
+							const runtimeChunk =
+								/** @type {Entrypoint} */
+								(entries[0][1]).getRuntimeChunk();
+							const currentOutputName = compilation
+								.getPath(
+									getChunkFilenameTemplate(chunk, compilation.outputOptions),
+									{
+										chunk,
+										contentHashType: "javascript"
+									}
+								)
+								.replace(/^\/+/g, "")
+								.split("/");
+							const runtimeOutputName = compilation
+								.getPath(
+									getChunkFilenameTemplate(
+										/** @type {Chunk} */
+										(runtimeChunk),
+										compilation.outputOptions
+									),
+									{
+										chunk: /** @type {Chunk} */ (runtimeChunk),
+										contentHashType: "javascript"
+									}
+								)
+								.replace(/^\/+/g, "")
+								.split("/");
+
+							// remove common parts
+							while (
+								currentOutputName.length > 1 &&
+								runtimeOutputName.length > 1 &&
+								currentOutputName[0] === runtimeOutputName[0]
+							) {
+								currentOutputName.shift();
+								runtimeOutputName.shift();
+							}
+							const last = runtimeOutputName.join("/");
+							// create final path
+							const runtimePath =
+								getUndoPath(currentOutputName.join("/"), last, true) + last;
+
+							const entrySource = new ConcatSource();
+							entrySource.add(
+								`(${
+									runtimeTemplate.supportsArrowFunction()
+										? "() => "
+										: "function() "
+								}{\n`
+							);
+							entrySource.add("var exports = {};\n");
+							entrySource.add(source);
+							entrySource.add(";\n\n// load runtime\n");
+							entrySource.add(
+								`var ${RuntimeGlobals.require} = require(${JSON.stringify(
+									runtimePath
+								)});\n`
+							);
+							entrySource.add(
+								`${RuntimeGlobals.externalInstallChunk}(exports);\n`
+							);
+							const startupSource = new RawSource(
+								generateEntryStartup(
+									chunkGraph,
+									runtimeTemplate,
+									entries,
+									chunk,
+									false
+								)
+							);
+							entrySource.add(
+								hooks.renderStartup.call(
+									startupSource,
+									entries[entries.length - 1][0],
+									{
+										...renderContext,
+										inlined: false
+									}
+								)
+							);
+							entrySource.add("\n})()");
+							return entrySource;
+						}
+						return source;
+					}
+				);
+				hooks.chunkHash.tap(
+					"CommonJsChunkFormatPlugin",
+					(chunk, hash, { chunkGraph }) => {
+						if (chunk.hasRuntime()) return;
+						hash.update("CommonJsChunkFormatPlugin");
+						hash.update("1");
+						const entries = Array.from(
+							chunkGraph.getChunkEntryModulesWithChunkGroupIterable(chunk)
+						);
+						updateHashForEntryStartup(hash, chunkGraph, entries, chunk);
+					}
+				);
+			}
+		);
+	}
+}
+
+module.exports = CommonJsChunkFormatPlugin;
diff --git a/lib/javascript/EnableChunkLoadingPlugin.js b/lib/javascript/EnableChunkLoadingPlugin.js
new file mode 100644
index 00000000000..4e7263a5309
--- /dev/null
+++ b/lib/javascript/EnableChunkLoadingPlugin.js
@@ -0,0 +1,121 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+/** @typedef {import("../../declarations/WebpackOptions").ChunkLoadingType} ChunkLoadingType */
+/** @typedef {import("../Compiler")} Compiler */
+
+/** @type {WeakMap>} */
+const enabledTypes = new WeakMap();
+
+/**
+ * @param {Compiler} compiler compiler
+ * @returns {Set} enabled types
+ */
+const getEnabledTypes = compiler => {
+	let set = enabledTypes.get(compiler);
+	if (set === undefined) {
+		set = new Set();
+		enabledTypes.set(compiler, set);
+	}
+	return set;
+};
+
+class EnableChunkLoadingPlugin {
+	/**
+	 * @param {ChunkLoadingType} type library type that should be available
+	 */
+	constructor(type) {
+		this.type = type;
+	}
+
+	/**
+	 * @param {Compiler} compiler the compiler instance
+	 * @param {ChunkLoadingType} type type of library
+	 * @returns {void}
+	 */
+	static setEnabled(compiler, type) {
+		getEnabledTypes(compiler).add(type);
+	}
+
+	/**
+	 * @param {Compiler} compiler the compiler instance
+	 * @param {ChunkLoadingType} type type of library
+	 * @returns {void}
+	 */
+	static checkEnabled(compiler, type) {
+		if (!getEnabledTypes(compiler).has(type)) {
+			throw new Error(
+				`Chunk loading type "${type}" is not enabled. ` +
+					"EnableChunkLoadingPlugin need to be used to enable this type of chunk loading. " +
+					'This usually happens through the "output.enabledChunkLoadingTypes" option. ' +
+					'If you are using a function as entry which sets "chunkLoading", you need to add all potential chunk loading types to "output.enabledChunkLoadingTypes". ' +
+					`These types are enabled: ${Array.from(
+						getEnabledTypes(compiler)
+					).join(", ")}`
+			);
+		}
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		const { type } = this;
+
+		// Only enable once
+		const enabled = getEnabledTypes(compiler);
+		if (enabled.has(type)) return;
+		enabled.add(type);
+
+		if (typeof type === "string") {
+			switch (type) {
+				case "jsonp": {
+					const JsonpChunkLoadingPlugin = require("../web/JsonpChunkLoadingPlugin");
+					new JsonpChunkLoadingPlugin().apply(compiler);
+					break;
+				}
+				case "import-scripts": {
+					const ImportScriptsChunkLoadingPlugin = require("../webworker/ImportScriptsChunkLoadingPlugin");
+					new ImportScriptsChunkLoadingPlugin().apply(compiler);
+					break;
+				}
+				case "require": {
+					// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+					const CommonJsChunkLoadingPlugin = require("../node/CommonJsChunkLoadingPlugin");
+					new CommonJsChunkLoadingPlugin({
+						asyncChunkLoading: false
+					}).apply(compiler);
+					break;
+				}
+				case "async-node": {
+					// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+					const CommonJsChunkLoadingPlugin = require("../node/CommonJsChunkLoadingPlugin");
+					new CommonJsChunkLoadingPlugin({
+						asyncChunkLoading: true
+					}).apply(compiler);
+					break;
+				}
+				case "import":
+				case "universal": {
+					const ModuleChunkLoadingPlugin = require("../esm/ModuleChunkLoadingPlugin");
+					new ModuleChunkLoadingPlugin().apply(compiler);
+					break;
+				}
+				default:
+					throw new Error(`Unsupported chunk loading type ${type}.
+Plugins which provide custom chunk loading types must call EnableChunkLoadingPlugin.setEnabled(compiler, type) to disable this error.`);
+			}
+		} else {
+			// TODO support plugin instances here
+			// apply them to the compiler
+		}
+	}
+}
+
+module.exports = EnableChunkLoadingPlugin;
diff --git a/lib/javascript/JavascriptGenerator.js b/lib/javascript/JavascriptGenerator.js
new file mode 100644
index 00000000000..56dcdd46fa3
--- /dev/null
+++ b/lib/javascript/JavascriptGenerator.js
@@ -0,0 +1,265 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const util = require("util");
+const { RawSource, ReplaceSource } = require("webpack-sources");
+const Generator = require("../Generator");
+const InitFragment = require("../InitFragment");
+const { JS_TYPES } = require("../ModuleSourceTypesConstants");
+const HarmonyCompatibilityDependency = require("../dependencies/HarmonyCompatibilityDependency");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../DependenciesBlock")} DependenciesBlock */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../DependencyTemplate")} DependencyTemplate */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../DependencyTemplates")} DependencyTemplates */
+/** @typedef {import("../Generator").GenerateContext} GenerateContext */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../Module").ConcatenationBailoutReasonContext} ConcatenationBailoutReasonContext */
+/** @typedef {import("../Module").SourceTypes} SourceTypes */
+/** @typedef {import("../NormalModule")} NormalModule */
+/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
+
+// TODO: clean up this file
+// replace with newer constructs
+
+const deprecatedGetInitFragments = util.deprecate(
+	/**
+	 * @param {DependencyTemplate} template template
+	 * @param {Dependency} dependency dependency
+	 * @param {DependencyTemplateContext} templateContext template context
+	 * @returns {InitFragment[]} init fragments
+	 */
+	(template, dependency, templateContext) =>
+		/** @type {DependencyTemplate & { getInitFragments: (dependency: Dependency, dependencyTemplateContext: DependencyTemplateContext) => InitFragment[] }} */
+		(template).getInitFragments(dependency, templateContext),
+	"DependencyTemplate.getInitFragment is deprecated (use apply(dep, source, { initFragments }) instead)",
+	"DEP_WEBPACK_JAVASCRIPT_GENERATOR_GET_INIT_FRAGMENTS"
+);
+
+class JavascriptGenerator extends Generator {
+	/**
+	 * @param {NormalModule} module fresh module
+	 * @returns {SourceTypes} available types (do not mutate)
+	 */
+	getTypes(module) {
+		return JS_TYPES;
+	}
+
+	/**
+	 * @param {NormalModule} module the module
+	 * @param {string=} type source type
+	 * @returns {number} estimate size of the module
+	 */
+	getSize(module, type) {
+		const originalSource = module.originalSource();
+		if (!originalSource) {
+			return 39;
+		}
+		return originalSource.size();
+	}
+
+	/**
+	 * @param {NormalModule} module module for which the bailout reason should be determined
+	 * @param {ConcatenationBailoutReasonContext} context context
+	 * @returns {string | undefined} reason why this module can't be concatenated, undefined when it can be concatenated
+	 */
+	getConcatenationBailoutReason(module, context) {
+		// Only harmony modules are valid for optimization
+		if (
+			!module.buildMeta ||
+			module.buildMeta.exportsType !== "namespace" ||
+			module.presentationalDependencies === undefined ||
+			!module.presentationalDependencies.some(
+				d => d instanceof HarmonyCompatibilityDependency
+			)
+		) {
+			return "Module is not an ECMAScript module";
+		}
+
+		// Some expressions are not compatible with module concatenation
+		// because they may produce unexpected results. The plugin bails out
+		// if some were detected upfront.
+		if (module.buildInfo && module.buildInfo.moduleConcatenationBailout) {
+			return `Module uses ${module.buildInfo.moduleConcatenationBailout}`;
+		}
+	}
+
+	/**
+	 * @param {NormalModule} module module for which the code should be generated
+	 * @param {GenerateContext} generateContext context for generate
+	 * @returns {Source | null} generated code
+	 */
+	generate(module, generateContext) {
+		const originalSource = module.originalSource();
+		if (!originalSource) {
+			return new RawSource("throw new Error('No source available');");
+		}
+
+		const source = new ReplaceSource(originalSource);
+		/** @type {InitFragment[]} */
+		const initFragments = [];
+
+		this.sourceModule(module, initFragments, source, generateContext);
+
+		return InitFragment.addToSource(source, initFragments, generateContext);
+	}
+
+	/**
+	 * @param {Error} error the error
+	 * @param {NormalModule} module module for which the code should be generated
+	 * @param {GenerateContext} generateContext context for generate
+	 * @returns {Source | null} generated code
+	 */
+	generateError(error, module, generateContext) {
+		return new RawSource(`throw new Error(${JSON.stringify(error.message)});`);
+	}
+
+	/**
+	 * @param {Module} module the module to generate
+	 * @param {InitFragment[]} initFragments mutable list of init fragments
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {GenerateContext} generateContext the generateContext
+	 * @returns {void}
+	 */
+	sourceModule(module, initFragments, source, generateContext) {
+		for (const dependency of module.dependencies) {
+			this.sourceDependency(
+				module,
+				dependency,
+				initFragments,
+				source,
+				generateContext
+			);
+		}
+
+		if (module.presentationalDependencies !== undefined) {
+			for (const dependency of module.presentationalDependencies) {
+				this.sourceDependency(
+					module,
+					dependency,
+					initFragments,
+					source,
+					generateContext
+				);
+			}
+		}
+
+		for (const childBlock of module.blocks) {
+			this.sourceBlock(
+				module,
+				childBlock,
+				initFragments,
+				source,
+				generateContext
+			);
+		}
+	}
+
+	/**
+	 * @param {Module} module the module to generate
+	 * @param {DependenciesBlock} block the dependencies block which will be processed
+	 * @param {InitFragment[]} initFragments mutable list of init fragments
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {GenerateContext} generateContext the generateContext
+	 * @returns {void}
+	 */
+	sourceBlock(module, block, initFragments, source, generateContext) {
+		for (const dependency of block.dependencies) {
+			this.sourceDependency(
+				module,
+				dependency,
+				initFragments,
+				source,
+				generateContext
+			);
+		}
+
+		for (const childBlock of block.blocks) {
+			this.sourceBlock(
+				module,
+				childBlock,
+				initFragments,
+				source,
+				generateContext
+			);
+		}
+	}
+
+	/**
+	 * @param {Module} module the current module
+	 * @param {Dependency} dependency the dependency to generate
+	 * @param {InitFragment[]} initFragments mutable list of init fragments
+	 * @param {ReplaceSource} source the current replace source which can be modified
+	 * @param {GenerateContext} generateContext the render context
+	 * @returns {void}
+	 */
+	sourceDependency(module, dependency, initFragments, source, generateContext) {
+		const constructor =
+			/** @type {new (...args: EXPECTED_ANY[]) => Dependency} */
+			(dependency.constructor);
+		const template = generateContext.dependencyTemplates.get(constructor);
+		if (!template) {
+			throw new Error(
+				`No template for dependency: ${dependency.constructor.name}`
+			);
+		}
+
+		/** @type {InitFragment[] | undefined} */
+		let chunkInitFragments;
+
+		/** @type {DependencyTemplateContext} */
+		const templateContext = {
+			runtimeTemplate: generateContext.runtimeTemplate,
+			dependencyTemplates: generateContext.dependencyTemplates,
+			moduleGraph: generateContext.moduleGraph,
+			chunkGraph: generateContext.chunkGraph,
+			module,
+			runtime: generateContext.runtime,
+			runtimeRequirements: generateContext.runtimeRequirements,
+			concatenationScope: generateContext.concatenationScope,
+			codeGenerationResults:
+				/** @type {NonNullable} */
+				(generateContext.codeGenerationResults),
+			initFragments,
+			get chunkInitFragments() {
+				if (!chunkInitFragments) {
+					const data =
+						/** @type {NonNullable} */
+						(generateContext.getData)();
+					chunkInitFragments = data.get("chunkInitFragments");
+					if (!chunkInitFragments) {
+						chunkInitFragments = [];
+						data.set("chunkInitFragments", chunkInitFragments);
+					}
+				}
+
+				return chunkInitFragments;
+			}
+		};
+
+		template.apply(dependency, source, templateContext);
+
+		// TODO remove in webpack 6
+		if ("getInitFragments" in template) {
+			const fragments = deprecatedGetInitFragments(
+				template,
+				dependency,
+				templateContext
+			);
+
+			if (fragments) {
+				for (const fragment of fragments) {
+					initFragments.push(fragment);
+				}
+			}
+		}
+	}
+}
+
+module.exports = JavascriptGenerator;
diff --git a/lib/javascript/JavascriptModulesPlugin.js b/lib/javascript/JavascriptModulesPlugin.js
new file mode 100644
index 00000000000..909968b2a8a
--- /dev/null
+++ b/lib/javascript/JavascriptModulesPlugin.js
@@ -0,0 +1,1671 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const eslintScope = require("eslint-scope");
+const { SyncWaterfallHook, SyncHook, SyncBailHook } = require("tapable");
+const vm = require("vm");
+const {
+	ConcatSource,
+	OriginalSource,
+	PrefixSource,
+	RawSource,
+	CachedSource,
+	ReplaceSource
+} = require("webpack-sources");
+const Compilation = require("../Compilation");
+const { tryRunOrWebpackError } = require("../HookWebpackError");
+const HotUpdateChunk = require("../HotUpdateChunk");
+const InitFragment = require("../InitFragment");
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_DYNAMIC,
+	JAVASCRIPT_MODULE_TYPE_ESM,
+	WEBPACK_MODULE_TYPE_RUNTIME
+} = require("../ModuleTypeConstants");
+const NormalModule = require("../NormalModule");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+const { last, someInIterable } = require("../util/IterableHelpers");
+const StringXor = require("../util/StringXor");
+const { compareModulesByIdOrIdentifier } = require("../util/comparators");
+const {
+	getPathInAst,
+	getAllReferences,
+	RESERVED_NAMES,
+	findNewName,
+	addScopeSymbols,
+	getUsedNamesInScopeInfo
+} = require("../util/concatenate");
+const createHash = require("../util/createHash");
+const nonNumericOnlyHash = require("../util/nonNumericOnlyHash");
+const removeBOM = require("../util/removeBOM");
+const { intersectRuntime } = require("../util/runtime");
+const JavascriptGenerator = require("./JavascriptGenerator");
+const JavascriptParser = require("./JavascriptParser");
+
+/** @typedef {import("eslint-scope").Reference} Reference */
+/** @typedef {import("eslint-scope").Scope} Scope */
+/** @typedef {import("eslint-scope").Variable} Variable */
+/** @typedef {import("estree").Program} Program */
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../../declarations/WebpackOptions").HashFunction} HashFunction */
+/** @typedef {import("../../declarations/WebpackOptions").Output} OutputOptions */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../CodeGenerationResults")} CodeGenerationResults */
+/** @typedef {import("../Compilation").ChunkHashContext} ChunkHashContext */
+/** @typedef {import("../Compilation").ExecuteModuleObject} ExecuteModuleObject */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../DependencyTemplates")} DependencyTemplates */
+/** @typedef {import("../Entrypoint")} Entrypoint */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../Module").BuildInfo} BuildInfo */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
+/** @typedef {import("../TemplatedPathPlugin").TemplatePath} TemplatePath */
+/** @typedef {import("../WebpackError")} WebpackError */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../util/Hash")} Hash */
+
+/**
+ * @param {Chunk} chunk a chunk
+ * @param {ChunkGraph} chunkGraph the chunk graph
+ * @returns {boolean} true, when a JS file is needed for this chunk
+ */
+const chunkHasJs = (chunk, chunkGraph) => {
+	if (chunkGraph.getNumberOfEntryModules(chunk) > 0) return true;
+
+	return Boolean(
+		chunkGraph.getChunkModulesIterableBySourceType(chunk, "javascript")
+	);
+};
+
+/**
+ * @param {Chunk} chunk a chunk
+ * @param {ChunkGraph} chunkGraph the chunk graph
+ * @returns {boolean} true, when a JS file is needed for this chunk
+ */
+const chunkHasRuntimeOrJs = (chunk, chunkGraph) => {
+	if (
+		chunkGraph.getChunkModulesIterableBySourceType(
+			chunk,
+			WEBPACK_MODULE_TYPE_RUNTIME
+		)
+	)
+		return true;
+
+	return Boolean(
+		chunkGraph.getChunkModulesIterableBySourceType(chunk, "javascript")
+	);
+};
+
+/**
+ * @param {Module} module a module
+ * @param {string} code the code
+ * @returns {string} generated code for the stack
+ */
+const printGeneratedCodeForStack = (module, code) => {
+	const lines = code.split("\n");
+	const n = `${lines.length}`.length;
+	return `\n\nGenerated code for ${module.identifier()}\n${lines
+		.map(
+			/**
+			 * @param {string} line the line
+			 * @param {number} i the index
+			 * @param {string[]} lines the lines
+			 * @returns {string} the line with line number
+			 */
+			(line, i, lines) => {
+				const iStr = `${i + 1}`;
+				return `${" ".repeat(n - iStr.length)}${iStr} | ${line}`;
+			}
+		)
+		.join("\n")}`;
+};
+
+/**
+ * @typedef {object} RenderContext
+ * @property {Chunk} chunk the chunk
+ * @property {DependencyTemplates} dependencyTemplates the dependency templates
+ * @property {RuntimeTemplate} runtimeTemplate the runtime template
+ * @property {ModuleGraph} moduleGraph the module graph
+ * @property {ChunkGraph} chunkGraph the chunk graph
+ * @property {CodeGenerationResults} codeGenerationResults results of code generation
+ * @property {boolean | undefined} strictMode rendering in strict context
+ */
+
+/**
+ * @typedef {object} MainRenderContext
+ * @property {Chunk} chunk the chunk
+ * @property {DependencyTemplates} dependencyTemplates the dependency templates
+ * @property {RuntimeTemplate} runtimeTemplate the runtime template
+ * @property {ModuleGraph} moduleGraph the module graph
+ * @property {ChunkGraph} chunkGraph the chunk graph
+ * @property {CodeGenerationResults} codeGenerationResults results of code generation
+ * @property {string} hash hash to be used for render call
+ * @property {boolean | undefined} strictMode rendering in strict context
+ */
+
+/**
+ * @typedef {object} ChunkRenderContext
+ * @property {Chunk} chunk the chunk
+ * @property {DependencyTemplates} dependencyTemplates the dependency templates
+ * @property {RuntimeTemplate} runtimeTemplate the runtime template
+ * @property {ModuleGraph} moduleGraph the module graph
+ * @property {ChunkGraph} chunkGraph the chunk graph
+ * @property {CodeGenerationResults} codeGenerationResults results of code generation
+ * @property {InitFragment[]} chunkInitFragments init fragments for the chunk
+ * @property {boolean | undefined} strictMode rendering in strict context
+ */
+
+/**
+ * @typedef {object} RenderBootstrapContext
+ * @property {Chunk} chunk the chunk
+ * @property {CodeGenerationResults} codeGenerationResults results of code generation
+ * @property {RuntimeTemplate} runtimeTemplate the runtime template
+ * @property {ModuleGraph} moduleGraph the module graph
+ * @property {ChunkGraph} chunkGraph the chunk graph
+ * @property {string} hash hash to be used for render call
+ */
+
+/** @typedef {RenderContext & { inlined: boolean }} StartupRenderContext */
+
+/**
+ * @typedef {object} CompilationHooks
+ * @property {SyncWaterfallHook<[Source, Module, ChunkRenderContext]>} renderModuleContent
+ * @property {SyncWaterfallHook<[Source, Module, ChunkRenderContext]>} renderModuleContainer
+ * @property {SyncWaterfallHook<[Source, Module, ChunkRenderContext]>} renderModulePackage
+ * @property {SyncWaterfallHook<[Source, RenderContext]>} renderChunk
+ * @property {SyncWaterfallHook<[Source, RenderContext]>} renderMain
+ * @property {SyncWaterfallHook<[Source, RenderContext]>} renderContent
+ * @property {SyncWaterfallHook<[Source, RenderContext]>} render
+ * @property {SyncWaterfallHook<[Source, Module, StartupRenderContext]>} renderStartup
+ * @property {SyncWaterfallHook<[string, RenderBootstrapContext]>} renderRequire
+ * @property {SyncBailHook<[Module, RenderBootstrapContext], string | void>} inlineInRuntimeBailout
+ * @property {SyncBailHook<[Module, RenderContext], string | void>} embedInRuntimeBailout
+ * @property {SyncBailHook<[RenderContext], string | void>} strictRuntimeBailout
+ * @property {SyncHook<[Chunk, Hash, ChunkHashContext]>} chunkHash
+ * @property {SyncBailHook<[Chunk, RenderContext], boolean | void>} useSourceMap
+ */
+
+/** @type {WeakMap} */
+const compilationHooksMap = new WeakMap();
+
+const PLUGIN_NAME = "JavascriptModulesPlugin";
+
+/** @typedef {{ header: string[], beforeStartup: string[], startup: string[], afterStartup: string[], allowInlineStartup: boolean }} Bootstrap */
+
+class JavascriptModulesPlugin {
+	/**
+	 * @param {Compilation} compilation the compilation
+	 * @returns {CompilationHooks} the attached hooks
+	 */
+	static getCompilationHooks(compilation) {
+		if (!(compilation instanceof Compilation)) {
+			throw new TypeError(
+				"The 'compilation' argument must be an instance of Compilation"
+			);
+		}
+		let hooks = compilationHooksMap.get(compilation);
+		if (hooks === undefined) {
+			hooks = {
+				renderModuleContent: new SyncWaterfallHook([
+					"source",
+					"module",
+					"renderContext"
+				]),
+				renderModuleContainer: new SyncWaterfallHook([
+					"source",
+					"module",
+					"renderContext"
+				]),
+				renderModulePackage: new SyncWaterfallHook([
+					"source",
+					"module",
+					"renderContext"
+				]),
+				render: new SyncWaterfallHook(["source", "renderContext"]),
+				renderContent: new SyncWaterfallHook(["source", "renderContext"]),
+				renderStartup: new SyncWaterfallHook([
+					"source",
+					"module",
+					"startupRenderContext"
+				]),
+				renderChunk: new SyncWaterfallHook(["source", "renderContext"]),
+				renderMain: new SyncWaterfallHook(["source", "renderContext"]),
+				renderRequire: new SyncWaterfallHook(["code", "renderContext"]),
+				inlineInRuntimeBailout: new SyncBailHook(["module", "renderContext"]),
+				embedInRuntimeBailout: new SyncBailHook(["module", "renderContext"]),
+				strictRuntimeBailout: new SyncBailHook(["renderContext"]),
+				chunkHash: new SyncHook(["chunk", "hash", "context"]),
+				useSourceMap: new SyncBailHook(["chunk", "renderContext"])
+			};
+			compilationHooksMap.set(compilation, hooks);
+		}
+		return hooks;
+	}
+
+	constructor(options = {}) {
+		this.options = options;
+		/** @type {WeakMap} */
+		this._moduleFactoryCache = new WeakMap();
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(
+			PLUGIN_NAME,
+			(compilation, { normalModuleFactory }) => {
+				const hooks = JavascriptModulesPlugin.getCompilationHooks(compilation);
+
+				for (const type of [
+					JAVASCRIPT_MODULE_TYPE_AUTO,
+					JAVASCRIPT_MODULE_TYPE_DYNAMIC,
+					JAVASCRIPT_MODULE_TYPE_ESM
+				]) {
+					normalModuleFactory.hooks.createParser
+						.for(type)
+						.tap(PLUGIN_NAME, _options => {
+							switch (type) {
+								case JAVASCRIPT_MODULE_TYPE_AUTO: {
+									return new JavascriptParser("auto");
+								}
+								case JAVASCRIPT_MODULE_TYPE_DYNAMIC: {
+									return new JavascriptParser("script");
+								}
+								case JAVASCRIPT_MODULE_TYPE_ESM: {
+									return new JavascriptParser("module");
+								}
+							}
+						});
+					normalModuleFactory.hooks.createGenerator
+						.for(type)
+						.tap(PLUGIN_NAME, () => new JavascriptGenerator());
+
+					NormalModule.getCompilationHooks(compilation).processResult.tap(
+						PLUGIN_NAME,
+						(result, module) => {
+							if (module.type === type) {
+								const [source, ...rest] = result;
+
+								return [removeBOM(source), ...rest];
+							}
+
+							return result;
+						}
+					);
+				}
+
+				compilation.hooks.renderManifest.tap(PLUGIN_NAME, (result, options) => {
+					const {
+						hash,
+						chunk,
+						chunkGraph,
+						moduleGraph,
+						runtimeTemplate,
+						dependencyTemplates,
+						outputOptions,
+						codeGenerationResults
+					} = options;
+
+					const hotUpdateChunk = chunk instanceof HotUpdateChunk ? chunk : null;
+					const filenameTemplate =
+						JavascriptModulesPlugin.getChunkFilenameTemplate(
+							chunk,
+							outputOptions
+						);
+
+					let render;
+
+					if (hotUpdateChunk) {
+						render = () =>
+							this.renderChunk(
+								{
+									chunk,
+									dependencyTemplates,
+									runtimeTemplate,
+									moduleGraph,
+									chunkGraph,
+									codeGenerationResults,
+									strictMode: runtimeTemplate.isModule()
+								},
+								hooks
+							);
+					} else if (chunk.hasRuntime()) {
+						if (!chunkHasRuntimeOrJs(chunk, chunkGraph)) {
+							return result;
+						}
+
+						render = () =>
+							this.renderMain(
+								{
+									hash,
+									chunk,
+									dependencyTemplates,
+									runtimeTemplate,
+									moduleGraph,
+									chunkGraph,
+									codeGenerationResults,
+									strictMode: runtimeTemplate.isModule()
+								},
+								hooks,
+								compilation
+							);
+					} else {
+						if (!chunkHasJs(chunk, chunkGraph)) {
+							return result;
+						}
+
+						render = () =>
+							this.renderChunk(
+								{
+									chunk,
+									dependencyTemplates,
+									runtimeTemplate,
+									moduleGraph,
+									chunkGraph,
+									codeGenerationResults,
+									strictMode: runtimeTemplate.isModule()
+								},
+								hooks
+							);
+					}
+
+					result.push({
+						render,
+						filenameTemplate,
+						pathOptions: {
+							hash,
+							runtime: chunk.runtime,
+							chunk,
+							contentHashType: "javascript"
+						},
+						info: {
+							javascriptModule: compilation.runtimeTemplate.isModule()
+						},
+						identifier: hotUpdateChunk
+							? `hotupdatechunk${chunk.id}`
+							: `chunk${chunk.id}`,
+						hash: chunk.contentHash.javascript
+					});
+
+					return result;
+				});
+				compilation.hooks.chunkHash.tap(PLUGIN_NAME, (chunk, hash, context) => {
+					hooks.chunkHash.call(chunk, hash, context);
+					if (chunk.hasRuntime()) {
+						this.updateHashWithBootstrap(
+							hash,
+							{
+								hash: "0000",
+								chunk,
+								codeGenerationResults: context.codeGenerationResults,
+								chunkGraph: context.chunkGraph,
+								moduleGraph: context.moduleGraph,
+								runtimeTemplate: context.runtimeTemplate
+							},
+							hooks
+						);
+					}
+				});
+				compilation.hooks.contentHash.tap(PLUGIN_NAME, chunk => {
+					const {
+						chunkGraph,
+						codeGenerationResults,
+						moduleGraph,
+						runtimeTemplate,
+						outputOptions: {
+							hashSalt,
+							hashDigest,
+							hashDigestLength,
+							hashFunction
+						}
+					} = compilation;
+					const hash = createHash(/** @type {HashFunction} */ (hashFunction));
+					if (hashSalt) hash.update(hashSalt);
+					if (chunk.hasRuntime()) {
+						this.updateHashWithBootstrap(
+							hash,
+							{
+								hash: "0000",
+								chunk,
+								codeGenerationResults,
+								chunkGraph: compilation.chunkGraph,
+								moduleGraph: compilation.moduleGraph,
+								runtimeTemplate: compilation.runtimeTemplate
+							},
+							hooks
+						);
+					} else {
+						hash.update(`${chunk.id} `);
+						hash.update(chunk.ids ? chunk.ids.join(",") : "");
+					}
+					hooks.chunkHash.call(chunk, hash, {
+						chunkGraph,
+						codeGenerationResults,
+						moduleGraph,
+						runtimeTemplate
+					});
+					const modules = chunkGraph.getChunkModulesIterableBySourceType(
+						chunk,
+						"javascript"
+					);
+					if (modules) {
+						const xor = new StringXor();
+						for (const m of modules) {
+							xor.add(chunkGraph.getModuleHash(m, chunk.runtime));
+						}
+						xor.updateHash(hash);
+					}
+					const runtimeModules = chunkGraph.getChunkModulesIterableBySourceType(
+						chunk,
+						WEBPACK_MODULE_TYPE_RUNTIME
+					);
+					if (runtimeModules) {
+						const xor = new StringXor();
+						for (const m of runtimeModules) {
+							xor.add(chunkGraph.getModuleHash(m, chunk.runtime));
+						}
+						xor.updateHash(hash);
+					}
+					const digest = /** @type {string} */ (hash.digest(hashDigest));
+					chunk.contentHash.javascript = nonNumericOnlyHash(
+						digest,
+						/** @type {number} */
+						(hashDigestLength)
+					);
+				});
+				compilation.hooks.additionalTreeRuntimeRequirements.tap(
+					PLUGIN_NAME,
+					(chunk, set, { chunkGraph }) => {
+						if (
+							!set.has(RuntimeGlobals.startupNoDefault) &&
+							chunkGraph.hasChunkEntryDependentChunks(chunk)
+						) {
+							set.add(RuntimeGlobals.onChunksLoaded);
+							set.add(RuntimeGlobals.exports);
+							set.add(RuntimeGlobals.require);
+						}
+					}
+				);
+				compilation.hooks.executeModule.tap(PLUGIN_NAME, (options, context) => {
+					const source = options.codeGenerationResult.sources.get("javascript");
+					if (source === undefined) return;
+					const { module } = options;
+					const code = source.source();
+
+					const fn = vm.runInThisContext(
+						`(function(${module.moduleArgument}, ${module.exportsArgument}, ${RuntimeGlobals.require}) {\n${code}\n/**/})`,
+						{
+							filename: module.identifier(),
+							lineOffset: -1
+						}
+					);
+
+					const moduleObject =
+						/** @type {ExecuteModuleObject} */
+						(options.moduleObject);
+
+					try {
+						fn.call(
+							moduleObject.exports,
+							moduleObject,
+							moduleObject.exports,
+							context.__webpack_require__
+						);
+					} catch (err) {
+						/** @type {Error} */
+						(err).stack += printGeneratedCodeForStack(
+							options.module,
+							/** @type {string} */ (code)
+						);
+						throw err;
+					}
+				});
+				compilation.hooks.executeModule.tap(PLUGIN_NAME, (options, context) => {
+					const source = options.codeGenerationResult.sources.get("runtime");
+					if (source === undefined) return;
+					let code = source.source();
+					if (typeof code !== "string") code = code.toString();
+
+					const fn = vm.runInThisContext(
+						`(function(${RuntimeGlobals.require}) {\n${code}\n/**/})`,
+						{
+							filename: options.module.identifier(),
+							lineOffset: -1
+						}
+					);
+					try {
+						// eslint-disable-next-line no-useless-call
+						fn.call(null, context.__webpack_require__);
+					} catch (err) {
+						/** @type {Error} */
+						(err).stack += printGeneratedCodeForStack(options.module, code);
+						throw err;
+					}
+				});
+			}
+		);
+	}
+
+	/**
+	 * @param {Chunk} chunk chunk
+	 * @param {OutputOptions} outputOptions output options
+	 * @returns {TemplatePath} used filename template
+	 */
+	static getChunkFilenameTemplate(chunk, outputOptions) {
+		if (chunk.filenameTemplate) {
+			return chunk.filenameTemplate;
+		} else if (chunk instanceof HotUpdateChunk) {
+			return /** @type {TemplatePath} */ (outputOptions.hotUpdateChunkFilename);
+		} else if (chunk.canBeInitial()) {
+			return /** @type {TemplatePath} */ (outputOptions.filename);
+		}
+		return /** @type {TemplatePath} */ (outputOptions.chunkFilename);
+	}
+
+	/**
+	 * @param {Module} module the rendered module
+	 * @param {ChunkRenderContext} renderContext options object
+	 * @param {CompilationHooks} hooks hooks
+	 * @param {boolean} factory true: renders as factory method, false: pure module content
+	 * @returns {Source | null} the newly generated source from rendering
+	 */
+	renderModule(module, renderContext, hooks, factory) {
+		const {
+			chunk,
+			chunkGraph,
+			runtimeTemplate,
+			codeGenerationResults,
+			strictMode
+		} = renderContext;
+		try {
+			const codeGenResult = codeGenerationResults.get(module, chunk.runtime);
+			const moduleSource = codeGenResult.sources.get("javascript");
+			if (!moduleSource) return null;
+			if (codeGenResult.data !== undefined) {
+				const chunkInitFragments = codeGenResult.data.get("chunkInitFragments");
+				if (chunkInitFragments) {
+					for (const i of chunkInitFragments)
+						renderContext.chunkInitFragments.push(i);
+				}
+			}
+			const moduleSourcePostContent = tryRunOrWebpackError(
+				() =>
+					hooks.renderModuleContent.call(moduleSource, module, renderContext),
+				"JavascriptModulesPlugin.getCompilationHooks().renderModuleContent"
+			);
+			let moduleSourcePostContainer;
+			if (factory) {
+				const runtimeRequirements = chunkGraph.getModuleRuntimeRequirements(
+					module,
+					chunk.runtime
+				);
+				const needModule = runtimeRequirements.has(RuntimeGlobals.module);
+				const needExports = runtimeRequirements.has(RuntimeGlobals.exports);
+				const needRequire =
+					runtimeRequirements.has(RuntimeGlobals.require) ||
+					runtimeRequirements.has(RuntimeGlobals.requireScope);
+				const needThisAsExports = runtimeRequirements.has(
+					RuntimeGlobals.thisAsExports
+				);
+				const needStrict =
+					/** @type {BuildInfo} */
+					(module.buildInfo).strict && !strictMode;
+				const cacheEntry = this._moduleFactoryCache.get(
+					moduleSourcePostContent
+				);
+				let source;
+				if (
+					cacheEntry &&
+					cacheEntry.needModule === needModule &&
+					cacheEntry.needExports === needExports &&
+					cacheEntry.needRequire === needRequire &&
+					cacheEntry.needThisAsExports === needThisAsExports &&
+					cacheEntry.needStrict === needStrict
+				) {
+					source = cacheEntry.source;
+				} else {
+					const factorySource = new ConcatSource();
+					const args = [];
+					if (needExports || needRequire || needModule)
+						args.push(
+							needModule
+								? module.moduleArgument
+								: `__unused_webpack_${module.moduleArgument}`
+						);
+					if (needExports || needRequire)
+						args.push(
+							needExports
+								? module.exportsArgument
+								: `__unused_webpack_${module.exportsArgument}`
+						);
+					if (needRequire) args.push(RuntimeGlobals.require);
+					if (!needThisAsExports && runtimeTemplate.supportsArrowFunction()) {
+						factorySource.add(`/***/ ((${args.join(", ")}) => {\n\n`);
+					} else {
+						factorySource.add(`/***/ (function(${args.join(", ")}) {\n\n`);
+					}
+					if (needStrict) {
+						factorySource.add('"use strict";\n');
+					}
+					factorySource.add(moduleSourcePostContent);
+					factorySource.add("\n\n/***/ })");
+					source = new CachedSource(factorySource);
+					this._moduleFactoryCache.set(moduleSourcePostContent, {
+						source,
+						needModule,
+						needExports,
+						needRequire,
+						needThisAsExports,
+						needStrict
+					});
+				}
+				moduleSourcePostContainer = tryRunOrWebpackError(
+					() => hooks.renderModuleContainer.call(source, module, renderContext),
+					"JavascriptModulesPlugin.getCompilationHooks().renderModuleContainer"
+				);
+			} else {
+				moduleSourcePostContainer = moduleSourcePostContent;
+			}
+			return tryRunOrWebpackError(
+				() =>
+					hooks.renderModulePackage.call(
+						moduleSourcePostContainer,
+						module,
+						renderContext
+					),
+				"JavascriptModulesPlugin.getCompilationHooks().renderModulePackage"
+			);
+		} catch (err) {
+			/** @type {WebpackError} */
+			(err).module = module;
+			throw err;
+		}
+	}
+
+	/**
+	 * @param {RenderContext} renderContext the render context
+	 * @param {CompilationHooks} hooks hooks
+	 * @returns {Source} the rendered source
+	 */
+	renderChunk(renderContext, hooks) {
+		const { chunk, chunkGraph } = renderContext;
+		const modules = chunkGraph.getOrderedChunkModulesIterableBySourceType(
+			chunk,
+			"javascript",
+			compareModulesByIdOrIdentifier(chunkGraph)
+		);
+		const allModules = modules ? Array.from(modules) : [];
+		let strictHeader;
+		let allStrict = renderContext.strictMode;
+		if (
+			!allStrict &&
+			allModules.every(m => /** @type {BuildInfo} */ (m.buildInfo).strict)
+		) {
+			const strictBailout = hooks.strictRuntimeBailout.call(renderContext);
+			strictHeader = strictBailout
+				? `// runtime can't be in strict mode because ${strictBailout}.\n`
+				: '"use strict";\n';
+			if (!strictBailout) allStrict = true;
+		}
+		/** @type {ChunkRenderContext} */
+		const chunkRenderContext = {
+			...renderContext,
+			chunkInitFragments: [],
+			strictMode: allStrict
+		};
+		const moduleSources =
+			Template.renderChunkModules(chunkRenderContext, allModules, module =>
+				this.renderModule(module, chunkRenderContext, hooks, true)
+			) || new RawSource("{}");
+		let source = tryRunOrWebpackError(
+			() => hooks.renderChunk.call(moduleSources, chunkRenderContext),
+			"JavascriptModulesPlugin.getCompilationHooks().renderChunk"
+		);
+		source = tryRunOrWebpackError(
+			() => hooks.renderContent.call(source, chunkRenderContext),
+			"JavascriptModulesPlugin.getCompilationHooks().renderContent"
+		);
+		if (!source) {
+			throw new Error(
+				"JavascriptModulesPlugin error: JavascriptModulesPlugin.getCompilationHooks().renderContent plugins should return something"
+			);
+		}
+		source = InitFragment.addToSource(
+			source,
+			chunkRenderContext.chunkInitFragments,
+			chunkRenderContext
+		);
+		source = tryRunOrWebpackError(
+			() => hooks.render.call(source, chunkRenderContext),
+			"JavascriptModulesPlugin.getCompilationHooks().render"
+		);
+		if (!source) {
+			throw new Error(
+				"JavascriptModulesPlugin error: JavascriptModulesPlugin.getCompilationHooks().render plugins should return something"
+			);
+		}
+		chunk.rendered = true;
+		return strictHeader
+			? new ConcatSource(strictHeader, source, ";")
+			: renderContext.runtimeTemplate.isModule()
+				? source
+				: new ConcatSource(source, ";");
+	}
+
+	/**
+	 * @param {MainRenderContext} renderContext options object
+	 * @param {CompilationHooks} hooks hooks
+	 * @param {Compilation} compilation the compilation
+	 * @returns {Source} the newly generated source from rendering
+	 */
+	renderMain(renderContext, hooks, compilation) {
+		const { chunk, chunkGraph, runtimeTemplate } = renderContext;
+
+		const runtimeRequirements = chunkGraph.getTreeRuntimeRequirements(chunk);
+		const iife = runtimeTemplate.isIIFE();
+
+		const bootstrap = this.renderBootstrap(renderContext, hooks);
+		const useSourceMap = hooks.useSourceMap.call(chunk, renderContext);
+
+		const allModules = Array.from(
+			chunkGraph.getOrderedChunkModulesIterableBySourceType(
+				chunk,
+				"javascript",
+				compareModulesByIdOrIdentifier(chunkGraph)
+			) || []
+		);
+
+		const hasEntryModules = chunkGraph.getNumberOfEntryModules(chunk) > 0;
+		/** @type {Set | undefined} */
+		let inlinedModules;
+		if (bootstrap.allowInlineStartup && hasEntryModules) {
+			inlinedModules = new Set(chunkGraph.getChunkEntryModulesIterable(chunk));
+		}
+
+		const source = new ConcatSource();
+		let prefix;
+		if (iife) {
+			if (runtimeTemplate.supportsArrowFunction()) {
+				source.add("/******/ (() => { // webpackBootstrap\n");
+			} else {
+				source.add("/******/ (function() { // webpackBootstrap\n");
+			}
+			prefix = "/******/ \t";
+		} else {
+			prefix = "/******/ ";
+		}
+		let allStrict = renderContext.strictMode;
+		if (
+			!allStrict &&
+			allModules.every(m => /** @type {BuildInfo} */ (m.buildInfo).strict)
+		) {
+			const strictBailout = hooks.strictRuntimeBailout.call(renderContext);
+			if (strictBailout) {
+				source.add(
+					`${
+						prefix
+					}// runtime can't be in strict mode because ${strictBailout}.\n`
+				);
+			} else {
+				allStrict = true;
+				source.add(`${prefix}"use strict";\n`);
+			}
+		}
+
+		/** @type {ChunkRenderContext} */
+		const chunkRenderContext = {
+			...renderContext,
+			chunkInitFragments: [],
+			strictMode: allStrict
+		};
+
+		const chunkModules = Template.renderChunkModules(
+			chunkRenderContext,
+			inlinedModules
+				? allModules.filter(
+						m => !(/** @type {Set} */ (inlinedModules).has(m))
+					)
+				: allModules,
+			module => this.renderModule(module, chunkRenderContext, hooks, true),
+			prefix
+		);
+		if (
+			chunkModules ||
+			runtimeRequirements.has(RuntimeGlobals.moduleFactories) ||
+			runtimeRequirements.has(RuntimeGlobals.moduleFactoriesAddOnly) ||
+			runtimeRequirements.has(RuntimeGlobals.require)
+		) {
+			source.add(`${prefix}var __webpack_modules__ = (`);
+			source.add(chunkModules || "{}");
+			source.add(");\n");
+			source.add(
+				"/************************************************************************/\n"
+			);
+		}
+
+		if (bootstrap.header.length > 0) {
+			const header = `${Template.asString(bootstrap.header)}\n`;
+			source.add(
+				new PrefixSource(
+					prefix,
+					useSourceMap
+						? new OriginalSource(header, "webpack/bootstrap")
+						: new RawSource(header)
+				)
+			);
+			source.add(
+				"/************************************************************************/\n"
+			);
+		}
+
+		const runtimeModules =
+			renderContext.chunkGraph.getChunkRuntimeModulesInOrder(chunk);
+
+		if (runtimeModules.length > 0) {
+			source.add(
+				new PrefixSource(
+					prefix,
+					Template.renderRuntimeModules(runtimeModules, chunkRenderContext)
+				)
+			);
+			source.add(
+				"/************************************************************************/\n"
+			);
+			// runtimeRuntimeModules calls codeGeneration
+			for (const module of runtimeModules) {
+				compilation.codeGeneratedModules.add(module);
+			}
+		}
+		if (inlinedModules) {
+			if (bootstrap.beforeStartup.length > 0) {
+				const beforeStartup = `${Template.asString(bootstrap.beforeStartup)}\n`;
+				source.add(
+					new PrefixSource(
+						prefix,
+						useSourceMap
+							? new OriginalSource(beforeStartup, "webpack/before-startup")
+							: new RawSource(beforeStartup)
+					)
+				);
+			}
+			const lastInlinedModule = /** @type {Module} */ (last(inlinedModules));
+			const startupSource = new ConcatSource();
+
+			if (runtimeRequirements.has(RuntimeGlobals.exports)) {
+				startupSource.add(`var ${RuntimeGlobals.exports} = {};\n`);
+			}
+
+			const avoidEntryIife = compilation.options.optimization.avoidEntryIife;
+			/** @type {Map | false} */
+			let renamedInlinedModule = false;
+			if (avoidEntryIife) {
+				renamedInlinedModule = this.getRenamedInlineModule(
+					allModules,
+					renderContext,
+					inlinedModules,
+					chunkRenderContext,
+					hooks,
+					allStrict,
+					Boolean(chunkModules)
+				);
+			}
+
+			for (const m of inlinedModules) {
+				const renderedModule = renamedInlinedModule
+					? renamedInlinedModule.get(m)
+					: this.renderModule(m, chunkRenderContext, hooks, false);
+
+				if (renderedModule) {
+					const innerStrict =
+						!allStrict && /** @type {BuildInfo} */ (m.buildInfo).strict;
+					const runtimeRequirements = chunkGraph.getModuleRuntimeRequirements(
+						m,
+						chunk.runtime
+					);
+					const exports = runtimeRequirements.has(RuntimeGlobals.exports);
+					const webpackExports =
+						exports && m.exportsArgument === RuntimeGlobals.exports;
+					const iife = innerStrict
+						? "it needs to be in strict mode."
+						: inlinedModules.size > 1
+							? // TODO check globals and top-level declarations of other entries and chunk modules
+								// to make a better decision
+								"it needs to be isolated against other entry modules."
+							: chunkModules && !renamedInlinedModule
+								? "it needs to be isolated against other modules in the chunk."
+								: exports && !webpackExports
+									? `it uses a non-standard name for the exports (${m.exportsArgument}).`
+									: hooks.embedInRuntimeBailout.call(m, renderContext);
+					let footer;
+					if (iife !== undefined) {
+						startupSource.add(
+							`// This entry needs to be wrapped in an IIFE because ${iife}\n`
+						);
+						const arrow = runtimeTemplate.supportsArrowFunction();
+						if (arrow) {
+							startupSource.add("(() => {\n");
+							footer = "\n})();\n\n";
+						} else {
+							startupSource.add("!function() {\n");
+							footer = "\n}();\n";
+						}
+						if (innerStrict) startupSource.add('"use strict";\n');
+					} else {
+						footer = "\n";
+					}
+					if (exports) {
+						if (m !== lastInlinedModule)
+							startupSource.add(`var ${m.exportsArgument} = {};\n`);
+						else if (m.exportsArgument !== RuntimeGlobals.exports)
+							startupSource.add(
+								`var ${m.exportsArgument} = ${RuntimeGlobals.exports};\n`
+							);
+					}
+					startupSource.add(renderedModule);
+					startupSource.add(footer);
+				}
+			}
+			if (runtimeRequirements.has(RuntimeGlobals.onChunksLoaded)) {
+				startupSource.add(
+					`${RuntimeGlobals.exports} = ${RuntimeGlobals.onChunksLoaded}(${RuntimeGlobals.exports});\n`
+				);
+			}
+			source.add(
+				hooks.renderStartup.call(startupSource, lastInlinedModule, {
+					...renderContext,
+					inlined: true
+				})
+			);
+			if (bootstrap.afterStartup.length > 0) {
+				const afterStartup = `${Template.asString(bootstrap.afterStartup)}\n`;
+				source.add(
+					new PrefixSource(
+						prefix,
+						useSourceMap
+							? new OriginalSource(afterStartup, "webpack/after-startup")
+							: new RawSource(afterStartup)
+					)
+				);
+			}
+		} else {
+			const lastEntryModule =
+				/** @type {Module} */
+				(last(chunkGraph.getChunkEntryModulesIterable(chunk)));
+			/** @type {(content: string[], name: string) => Source} */
+			const toSource = useSourceMap
+				? (content, name) =>
+						new OriginalSource(Template.asString(content), name)
+				: content => new RawSource(Template.asString(content));
+			source.add(
+				new PrefixSource(
+					prefix,
+					new ConcatSource(
+						toSource(bootstrap.beforeStartup, "webpack/before-startup"),
+						"\n",
+						hooks.renderStartup.call(
+							toSource(bootstrap.startup.concat(""), "webpack/startup"),
+							lastEntryModule,
+							{
+								...renderContext,
+								inlined: false
+							}
+						),
+						toSource(bootstrap.afterStartup, "webpack/after-startup"),
+						"\n"
+					)
+				)
+			);
+		}
+		if (
+			hasEntryModules &&
+			runtimeRequirements.has(RuntimeGlobals.returnExportsFromRuntime)
+		) {
+			source.add(`${prefix}return ${RuntimeGlobals.exports};\n`);
+		}
+		if (iife) {
+			source.add("/******/ })()\n");
+		}
+
+		/** @type {Source} */
+		let finalSource = tryRunOrWebpackError(
+			() => hooks.renderMain.call(source, renderContext),
+			"JavascriptModulesPlugin.getCompilationHooks().renderMain"
+		);
+		if (!finalSource) {
+			throw new Error(
+				"JavascriptModulesPlugin error: JavascriptModulesPlugin.getCompilationHooks().renderMain plugins should return something"
+			);
+		}
+		finalSource = tryRunOrWebpackError(
+			() => hooks.renderContent.call(finalSource, renderContext),
+			"JavascriptModulesPlugin.getCompilationHooks().renderContent"
+		);
+		if (!finalSource) {
+			throw new Error(
+				"JavascriptModulesPlugin error: JavascriptModulesPlugin.getCompilationHooks().renderContent plugins should return something"
+			);
+		}
+
+		finalSource = InitFragment.addToSource(
+			finalSource,
+			chunkRenderContext.chunkInitFragments,
+			chunkRenderContext
+		);
+		finalSource = tryRunOrWebpackError(
+			() => hooks.render.call(finalSource, renderContext),
+			"JavascriptModulesPlugin.getCompilationHooks().render"
+		);
+		if (!finalSource) {
+			throw new Error(
+				"JavascriptModulesPlugin error: JavascriptModulesPlugin.getCompilationHooks().render plugins should return something"
+			);
+		}
+		chunk.rendered = true;
+		return iife ? new ConcatSource(finalSource, ";") : finalSource;
+	}
+
+	/**
+	 * @param {Hash} hash the hash to be updated
+	 * @param {RenderBootstrapContext} renderContext options object
+	 * @param {CompilationHooks} hooks hooks
+	 */
+	updateHashWithBootstrap(hash, renderContext, hooks) {
+		const bootstrap = this.renderBootstrap(renderContext, hooks);
+		for (const _k of Object.keys(bootstrap)) {
+			const key = /** @type {keyof Bootstrap} */ (_k);
+			hash.update(key);
+			if (Array.isArray(bootstrap[key])) {
+				for (const line of bootstrap[key]) {
+					hash.update(line);
+				}
+			} else {
+				hash.update(JSON.stringify(bootstrap[key]));
+			}
+		}
+	}
+
+	/**
+	 * @param {RenderBootstrapContext} renderContext options object
+	 * @param {CompilationHooks} hooks hooks
+	 * @returns {Bootstrap} the generated source of the bootstrap code
+	 */
+	renderBootstrap(renderContext, hooks) {
+		const {
+			chunkGraph,
+			codeGenerationResults,
+			moduleGraph,
+			chunk,
+			runtimeTemplate
+		} = renderContext;
+
+		const runtimeRequirements = chunkGraph.getTreeRuntimeRequirements(chunk);
+
+		const requireFunction = runtimeRequirements.has(RuntimeGlobals.require);
+		const moduleCache = runtimeRequirements.has(RuntimeGlobals.moduleCache);
+		const moduleFactories = runtimeRequirements.has(
+			RuntimeGlobals.moduleFactories
+		);
+		const moduleUsed = runtimeRequirements.has(RuntimeGlobals.module);
+		const requireScopeUsed = runtimeRequirements.has(
+			RuntimeGlobals.requireScope
+		);
+		const interceptModuleExecution = runtimeRequirements.has(
+			RuntimeGlobals.interceptModuleExecution
+		);
+
+		const useRequire =
+			requireFunction || interceptModuleExecution || moduleUsed;
+
+		/**
+		 * @type {{startup: string[], beforeStartup: string[], header: string[], afterStartup: string[], allowInlineStartup: boolean}}
+		 */
+		const result = {
+			header: [],
+			beforeStartup: [],
+			startup: [],
+			afterStartup: [],
+			allowInlineStartup: true
+		};
+
+		const { header: buf, startup, beforeStartup, afterStartup } = result;
+
+		if (result.allowInlineStartup && moduleFactories) {
+			startup.push(
+				"// module factories are used so entry inlining is disabled"
+			);
+			result.allowInlineStartup = false;
+		}
+		if (result.allowInlineStartup && moduleCache) {
+			startup.push("// module cache are used so entry inlining is disabled");
+			result.allowInlineStartup = false;
+		}
+		if (result.allowInlineStartup && interceptModuleExecution) {
+			startup.push(
+				"// module execution is intercepted so entry inlining is disabled"
+			);
+			result.allowInlineStartup = false;
+		}
+
+		if (useRequire || moduleCache) {
+			buf.push("// The module cache");
+			buf.push("var __webpack_module_cache__ = {};");
+			buf.push("");
+		}
+
+		if (useRequire) {
+			buf.push("// The require function");
+			buf.push(`function ${RuntimeGlobals.require}(moduleId) {`);
+			buf.push(Template.indent(this.renderRequire(renderContext, hooks)));
+			buf.push("}");
+			buf.push("");
+		} else if (runtimeRequirements.has(RuntimeGlobals.requireScope)) {
+			buf.push("// The require scope");
+			buf.push(`var ${RuntimeGlobals.require} = {};`);
+			buf.push("");
+		}
+
+		if (
+			moduleFactories ||
+			runtimeRequirements.has(RuntimeGlobals.moduleFactoriesAddOnly)
+		) {
+			buf.push("// expose the modules object (__webpack_modules__)");
+			buf.push(`${RuntimeGlobals.moduleFactories} = __webpack_modules__;`);
+			buf.push("");
+		}
+
+		if (moduleCache) {
+			buf.push("// expose the module cache");
+			buf.push(`${RuntimeGlobals.moduleCache} = __webpack_module_cache__;`);
+			buf.push("");
+		}
+
+		if (interceptModuleExecution) {
+			buf.push("// expose the module execution interceptor");
+			buf.push(`${RuntimeGlobals.interceptModuleExecution} = [];`);
+			buf.push("");
+		}
+
+		if (!runtimeRequirements.has(RuntimeGlobals.startupNoDefault)) {
+			if (chunkGraph.getNumberOfEntryModules(chunk) > 0) {
+				/** @type {string[]} */
+				const buf2 = [];
+				const runtimeRequirements =
+					chunkGraph.getTreeRuntimeRequirements(chunk);
+				buf2.push("// Load entry module and return exports");
+				let i = chunkGraph.getNumberOfEntryModules(chunk);
+				for (const [
+					entryModule,
+					entrypoint
+				] of chunkGraph.getChunkEntryModulesWithChunkGroupIterable(chunk)) {
+					if (!chunkGraph.getModuleSourceTypes(entryModule).has("javascript")) {
+						i--;
+						continue;
+					}
+					const chunks =
+						/** @type {Entrypoint} */
+						(entrypoint).chunks.filter(c => c !== chunk);
+					if (result.allowInlineStartup && chunks.length > 0) {
+						buf2.push(
+							"// This entry module depends on other loaded chunks and execution need to be delayed"
+						);
+						result.allowInlineStartup = false;
+					}
+					if (
+						result.allowInlineStartup &&
+						someInIterable(
+							moduleGraph.getIncomingConnectionsByOriginModule(entryModule),
+							([originModule, connections]) =>
+								originModule &&
+								connections.some(c => c.isTargetActive(chunk.runtime)) &&
+								someInIterable(
+									chunkGraph.getModuleRuntimes(originModule),
+									runtime =>
+										intersectRuntime(runtime, chunk.runtime) !== undefined
+								)
+						)
+					) {
+						buf2.push(
+							"// This entry module is referenced by other modules so it can't be inlined"
+						);
+						result.allowInlineStartup = false;
+					}
+
+					let data;
+					if (codeGenerationResults.has(entryModule, chunk.runtime)) {
+						const result = codeGenerationResults.get(
+							entryModule,
+							chunk.runtime
+						);
+						data = result.data;
+					}
+					if (
+						result.allowInlineStartup &&
+						(!data || !data.get("topLevelDeclarations")) &&
+						(!entryModule.buildInfo ||
+							!entryModule.buildInfo.topLevelDeclarations)
+					) {
+						buf2.push(
+							"// This entry module doesn't tell about it's top-level declarations so it can't be inlined"
+						);
+						result.allowInlineStartup = false;
+					}
+					if (result.allowInlineStartup) {
+						const bailout = hooks.inlineInRuntimeBailout.call(
+							entryModule,
+							renderContext
+						);
+						if (bailout !== undefined) {
+							buf2.push(
+								`// This entry module can't be inlined because ${bailout}`
+							);
+							result.allowInlineStartup = false;
+						}
+					}
+					i--;
+					const moduleId = chunkGraph.getModuleId(entryModule);
+					const entryRuntimeRequirements =
+						chunkGraph.getModuleRuntimeRequirements(entryModule, chunk.runtime);
+					let moduleIdExpr = JSON.stringify(moduleId);
+					if (runtimeRequirements.has(RuntimeGlobals.entryModuleId)) {
+						moduleIdExpr = `${RuntimeGlobals.entryModuleId} = ${moduleIdExpr}`;
+					}
+					if (
+						result.allowInlineStartup &&
+						entryRuntimeRequirements.has(RuntimeGlobals.module)
+					) {
+						result.allowInlineStartup = false;
+						buf2.push(
+							"// This entry module used 'module' so it can't be inlined"
+						);
+					}
+					if (chunks.length > 0) {
+						buf2.push(
+							`${i === 0 ? `var ${RuntimeGlobals.exports} = ` : ""}${
+								RuntimeGlobals.onChunksLoaded
+							}(undefined, ${JSON.stringify(
+								chunks.map(c => c.id)
+							)}, ${runtimeTemplate.returningFunction(
+								`${RuntimeGlobals.require}(${moduleIdExpr})`
+							)})`
+						);
+					} else if (useRequire) {
+						buf2.push(
+							`${i === 0 ? `var ${RuntimeGlobals.exports} = ` : ""}${
+								RuntimeGlobals.require
+							}(${moduleIdExpr});`
+						);
+					} else {
+						if (i === 0) buf2.push(`var ${RuntimeGlobals.exports} = {};`);
+						if (requireScopeUsed) {
+							buf2.push(
+								`__webpack_modules__[${moduleIdExpr}](0, ${
+									i === 0 ? RuntimeGlobals.exports : "{}"
+								}, ${RuntimeGlobals.require});`
+							);
+						} else if (entryRuntimeRequirements.has(RuntimeGlobals.exports)) {
+							buf2.push(
+								`__webpack_modules__[${moduleIdExpr}](0, ${
+									i === 0 ? RuntimeGlobals.exports : "{}"
+								});`
+							);
+						} else {
+							buf2.push(`__webpack_modules__[${moduleIdExpr}]();`);
+						}
+					}
+				}
+				if (runtimeRequirements.has(RuntimeGlobals.onChunksLoaded)) {
+					buf2.push(
+						`${RuntimeGlobals.exports} = ${RuntimeGlobals.onChunksLoaded}(${RuntimeGlobals.exports});`
+					);
+				}
+				if (
+					runtimeRequirements.has(RuntimeGlobals.startup) ||
+					(runtimeRequirements.has(RuntimeGlobals.startupOnlyBefore) &&
+						runtimeRequirements.has(RuntimeGlobals.startupOnlyAfter))
+				) {
+					result.allowInlineStartup = false;
+					buf.push("// the startup function");
+					buf.push(
+						`${RuntimeGlobals.startup} = ${runtimeTemplate.basicFunction("", [
+							...buf2,
+							`return ${RuntimeGlobals.exports};`
+						])};`
+					);
+					buf.push("");
+					startup.push("// run startup");
+					startup.push(
+						`var ${RuntimeGlobals.exports} = ${RuntimeGlobals.startup}();`
+					);
+				} else if (runtimeRequirements.has(RuntimeGlobals.startupOnlyBefore)) {
+					buf.push("// the startup function");
+					buf.push(
+						`${RuntimeGlobals.startup} = ${runtimeTemplate.emptyFunction()};`
+					);
+					beforeStartup.push("// run runtime startup");
+					beforeStartup.push(`${RuntimeGlobals.startup}();`);
+					startup.push("// startup");
+					startup.push(Template.asString(buf2));
+				} else if (runtimeRequirements.has(RuntimeGlobals.startupOnlyAfter)) {
+					buf.push("// the startup function");
+					buf.push(
+						`${RuntimeGlobals.startup} = ${runtimeTemplate.emptyFunction()};`
+					);
+					startup.push("// startup");
+					startup.push(Template.asString(buf2));
+					afterStartup.push("// run runtime startup");
+					afterStartup.push(`${RuntimeGlobals.startup}();`);
+				} else {
+					startup.push("// startup");
+					startup.push(Template.asString(buf2));
+				}
+			} else if (
+				runtimeRequirements.has(RuntimeGlobals.startup) ||
+				runtimeRequirements.has(RuntimeGlobals.startupOnlyBefore) ||
+				runtimeRequirements.has(RuntimeGlobals.startupOnlyAfter)
+			) {
+				buf.push(
+					"// the startup function",
+					"// It's empty as no entry modules are in this chunk",
+					`${RuntimeGlobals.startup} = ${runtimeTemplate.emptyFunction()};`,
+					""
+				);
+			}
+		} else if (
+			runtimeRequirements.has(RuntimeGlobals.startup) ||
+			runtimeRequirements.has(RuntimeGlobals.startupOnlyBefore) ||
+			runtimeRequirements.has(RuntimeGlobals.startupOnlyAfter)
+		) {
+			result.allowInlineStartup = false;
+			buf.push(
+				"// the startup function",
+				"// It's empty as some runtime module handles the default behavior",
+				`${RuntimeGlobals.startup} = ${runtimeTemplate.emptyFunction()};`
+			);
+			startup.push("// run startup");
+			startup.push(
+				`var ${RuntimeGlobals.exports} = ${RuntimeGlobals.startup}();`
+			);
+		}
+		return result;
+	}
+
+	/**
+	 * @param {RenderBootstrapContext} renderContext options object
+	 * @param {CompilationHooks} hooks hooks
+	 * @returns {string} the generated source of the require function
+	 */
+	renderRequire(renderContext, hooks) {
+		const {
+			chunk,
+			chunkGraph,
+			runtimeTemplate: { outputOptions }
+		} = renderContext;
+		const runtimeRequirements = chunkGraph.getTreeRuntimeRequirements(chunk);
+		const moduleExecution = runtimeRequirements.has(
+			RuntimeGlobals.interceptModuleExecution
+		)
+			? Template.asString([
+					`var execOptions = { id: moduleId, module: module, factory: __webpack_modules__[moduleId], require: ${RuntimeGlobals.require} };`,
+					`${RuntimeGlobals.interceptModuleExecution}.forEach(function(handler) { handler(execOptions); });`,
+					"module = execOptions.module;",
+					"execOptions.factory.call(module.exports, module, module.exports, execOptions.require);"
+				])
+			: runtimeRequirements.has(RuntimeGlobals.thisAsExports)
+				? Template.asString([
+						`__webpack_modules__[moduleId].call(module.exports, module, module.exports, ${RuntimeGlobals.require});`
+					])
+				: Template.asString([
+						`__webpack_modules__[moduleId](module, module.exports, ${RuntimeGlobals.require});`
+					]);
+		const needModuleId = runtimeRequirements.has(RuntimeGlobals.moduleId);
+		const needModuleLoaded = runtimeRequirements.has(
+			RuntimeGlobals.moduleLoaded
+		);
+		const content = Template.asString([
+			"// Check if module is in cache",
+			"var cachedModule = __webpack_module_cache__[moduleId];",
+			"if (cachedModule !== undefined) {",
+			outputOptions.strictModuleErrorHandling
+				? Template.indent([
+						"if (cachedModule.error !== undefined) throw cachedModule.error;",
+						"return cachedModule.exports;"
+					])
+				: Template.indent("return cachedModule.exports;"),
+			"}",
+			"// Create a new module (and put it into the cache)",
+			"var module = __webpack_module_cache__[moduleId] = {",
+			Template.indent([
+				needModuleId ? "id: moduleId," : "// no module.id needed",
+				needModuleLoaded ? "loaded: false," : "// no module.loaded needed",
+				"exports: {}"
+			]),
+			"};",
+			"",
+			outputOptions.strictModuleExceptionHandling
+				? Template.asString([
+						"// Execute the module function",
+						"var threw = true;",
+						"try {",
+						Template.indent([moduleExecution, "threw = false;"]),
+						"} finally {",
+						Template.indent([
+							"if(threw) delete __webpack_module_cache__[moduleId];"
+						]),
+						"}"
+					])
+				: outputOptions.strictModuleErrorHandling
+					? Template.asString([
+							"// Execute the module function",
+							"try {",
+							Template.indent(moduleExecution),
+							"} catch(e) {",
+							Template.indent(["module.error = e;", "throw e;"]),
+							"}"
+						])
+					: Template.asString([
+							"// Execute the module function",
+							moduleExecution
+						]),
+			needModuleLoaded
+				? Template.asString([
+						"",
+						"// Flag the module as loaded",
+						`${RuntimeGlobals.moduleLoaded} = true;`,
+						""
+					])
+				: "",
+			"// Return the exports of the module",
+			"return module.exports;"
+		]);
+		return tryRunOrWebpackError(
+			() => hooks.renderRequire.call(content, renderContext),
+			"JavascriptModulesPlugin.getCompilationHooks().renderRequire"
+		);
+	}
+
+	/**
+	 * @param {Module[]} allModules allModules
+	 * @param {MainRenderContext} renderContext renderContext
+	 * @param {Set} inlinedModules inlinedModules
+	 * @param {ChunkRenderContext} chunkRenderContext chunkRenderContext
+	 * @param {CompilationHooks} hooks hooks
+	 * @param {boolean | undefined} allStrict allStrict
+	 * @param {boolean} hasChunkModules hasChunkModules
+	 * @returns {Map | false} renamed inlined modules
+	 */
+	getRenamedInlineModule(
+		allModules,
+		renderContext,
+		inlinedModules,
+		chunkRenderContext,
+		hooks,
+		allStrict,
+		hasChunkModules
+	) {
+		const innerStrict =
+			!allStrict &&
+			allModules.every(m => /** @type {BuildInfo} */ (m.buildInfo).strict);
+		const isMultipleEntries = inlinedModules.size > 1;
+		const singleEntryWithModules = inlinedModules.size === 1 && hasChunkModules;
+
+		// TODO:
+		// This step is before the IIFE reason calculation. Ideally, it should only be executed when this function can optimize the
+		// IIFE reason. Otherwise, it should directly return false. There are four reasons now, we have skipped two already, the left
+		// one is 'it uses a non-standard name for the exports'.
+		if (isMultipleEntries || innerStrict || !singleEntryWithModules) {
+			return false;
+		}
+
+		/** @type {Map} */
+		const renamedInlinedModules = new Map();
+		const { runtimeTemplate } = renderContext;
+
+		/** @typedef {{ source: Source, module: Module, ast: Program, variables: Set, through: Set, usedInNonInlined: Set, moduleScope: Scope }} Info */
+		/** @type {Map} */
+		const inlinedModulesToInfo = new Map();
+		/** @type {Set} */
+		const nonInlinedModuleThroughIdentifiers = new Set();
+		/** @type {Map} */
+
+		for (const m of allModules) {
+			const isInlinedModule = inlinedModules && inlinedModules.has(m);
+			const moduleSource = this.renderModule(
+				m,
+				chunkRenderContext,
+				hooks,
+				!isInlinedModule
+			);
+
+			if (!moduleSource) continue;
+			const code = /** @type {string} */ (moduleSource.source());
+			const ast = JavascriptParser._parse(code, {
+				sourceType: "auto"
+			});
+
+			const scopeManager = eslintScope.analyze(ast, {
+				ecmaVersion: 6,
+				sourceType: "module",
+				optimistic: true,
+				ignoreEval: true
+			});
+
+			const globalScope = /** @type {Scope} */ (scopeManager.acquire(ast));
+			if (inlinedModules && inlinedModules.has(m)) {
+				const moduleScope = globalScope.childScopes[0];
+				inlinedModulesToInfo.set(m, {
+					source: moduleSource,
+					ast,
+					module: m,
+					variables: new Set(moduleScope.variables),
+					through: new Set(moduleScope.through),
+					usedInNonInlined: new Set(),
+					moduleScope
+				});
+			} else {
+				for (const ref of globalScope.through) {
+					nonInlinedModuleThroughIdentifiers.add(ref.identifier.name);
+				}
+			}
+		}
+
+		for (const [, { variables, usedInNonInlined }] of inlinedModulesToInfo) {
+			for (const variable of variables) {
+				if (
+					nonInlinedModuleThroughIdentifiers.has(variable.name) ||
+					RESERVED_NAMES.has(variable.name)
+				) {
+					usedInNonInlined.add(variable);
+				}
+			}
+		}
+
+		for (const [m, moduleInfo] of inlinedModulesToInfo) {
+			const { ast, source: _source, usedInNonInlined } = moduleInfo;
+			const source = new ReplaceSource(_source);
+			if (usedInNonInlined.size === 0) {
+				renamedInlinedModules.set(m, source);
+				continue;
+			}
+
+			const info = /** @type {Info} */ (inlinedModulesToInfo.get(m));
+			const allUsedNames = new Set(
+				Array.from(info.through, v => v.identifier.name)
+			);
+
+			for (const variable of usedInNonInlined) {
+				allUsedNames.add(variable.name);
+			}
+
+			for (const variable of info.variables) {
+				const usedNamesInScopeInfo = new Map();
+				const ignoredScopes = new Set();
+
+				const name = variable.name;
+				const { usedNames, alreadyCheckedScopes } = getUsedNamesInScopeInfo(
+					usedNamesInScopeInfo,
+					info.module.identifier(),
+					name
+				);
+
+				if (allUsedNames.has(name) || usedNames.has(name)) {
+					const references = getAllReferences(variable);
+					const allIdentifiers = new Set(
+						references.map(r => r.identifier).concat(variable.identifiers)
+					);
+					for (const ref of references) {
+						addScopeSymbols(
+							ref.from,
+							usedNames,
+							alreadyCheckedScopes,
+							ignoredScopes
+						);
+					}
+
+					const newName = findNewName(
+						variable.name,
+						allUsedNames,
+						usedNames,
+						m.readableIdentifier(runtimeTemplate.requestShortener)
+					);
+					allUsedNames.add(newName);
+					for (const identifier of allIdentifiers) {
+						const r = /** @type {Range} */ (identifier.range);
+						const path = getPathInAst(ast, identifier);
+						if (path && path.length > 1) {
+							const maybeProperty =
+								path[1].type === "AssignmentPattern" && path[1].left === path[0]
+									? path[2]
+									: path[1];
+							if (
+								maybeProperty.type === "Property" &&
+								maybeProperty.shorthand
+							) {
+								source.insert(r[1], `: ${newName}`);
+								continue;
+							}
+						}
+						source.replace(r[0], r[1] - 1, newName);
+					}
+				}
+				allUsedNames.add(name);
+			}
+
+			renamedInlinedModules.set(m, source);
+		}
+
+		return renamedInlinedModules;
+	}
+}
+
+module.exports = JavascriptModulesPlugin;
+module.exports.chunkHasJs = chunkHasJs;
diff --git a/lib/javascript/JavascriptParser.js b/lib/javascript/JavascriptParser.js
new file mode 100644
index 00000000000..1e2b3253883
--- /dev/null
+++ b/lib/javascript/JavascriptParser.js
@@ -0,0 +1,5099 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { Parser: AcornParser, tokTypes } = require("acorn");
+const { SyncBailHook, HookMap } = require("tapable");
+const vm = require("vm");
+const Parser = require("../Parser");
+const StackedMap = require("../util/StackedMap");
+const binarySearchBounds = require("../util/binarySearchBounds");
+const {
+	webpackCommentRegExp,
+	createMagicCommentContext
+} = require("../util/magicComment");
+const memoize = require("../util/memoize");
+const BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
+
+/** @typedef {import("acorn").Options} AcornOptions */
+/** @typedef {import("estree").AssignmentExpression} AssignmentExpression */
+/** @typedef {import("estree").BinaryExpression} BinaryExpression */
+/** @typedef {import("estree").BlockStatement} BlockStatement */
+/** @typedef {import("estree").SequenceExpression} SequenceExpression */
+/** @typedef {import("estree").CallExpression} CallExpression */
+/** @typedef {import("estree").BaseCallExpression} BaseCallExpression */
+/** @typedef {import("estree").StaticBlock} StaticBlock */
+/** @typedef {import("estree").ClassDeclaration} ClassDeclaration */
+/** @typedef {import("estree").ForStatement} ForStatement */
+/** @typedef {import("estree").SwitchStatement} SwitchStatement */
+/** @typedef {import("estree").ClassExpression} ClassExpression */
+/** @typedef {import("estree").Comment} Comment */
+/** @typedef {import("estree").ConditionalExpression} ConditionalExpression */
+/** @typedef {import("estree").Declaration} Declaration */
+/** @typedef {import("estree").PrivateIdentifier} PrivateIdentifier */
+/** @typedef {import("estree").PropertyDefinition} PropertyDefinition */
+/** @typedef {import("estree").Expression} Expression */
+/** @typedef {import("estree").Identifier} Identifier */
+/** @typedef {import("estree").VariableDeclaration} VariableDeclaration */
+/** @typedef {import("estree").IfStatement} IfStatement */
+/** @typedef {import("estree").LabeledStatement} LabeledStatement */
+/** @typedef {import("estree").Literal} Literal */
+/** @typedef {import("estree").LogicalExpression} LogicalExpression */
+/** @typedef {import("estree").ChainExpression} ChainExpression */
+/** @typedef {import("estree").MemberExpression} MemberExpression */
+/** @typedef {import("estree").YieldExpression} YieldExpression */
+/** @typedef {import("estree").MetaProperty} MetaProperty */
+/** @typedef {import("estree").Property} Property */
+/** @typedef {import("estree").AssignmentPattern} AssignmentPattern */
+/** @typedef {import("estree").ChainElement} ChainElement */
+/** @typedef {import("estree").Pattern} Pattern */
+/** @typedef {import("estree").UpdateExpression} UpdateExpression */
+/** @typedef {import("estree").ObjectExpression} ObjectExpression */
+/** @typedef {import("estree").UnaryExpression} UnaryExpression */
+/** @typedef {import("estree").ArrayExpression} ArrayExpression */
+/** @typedef {import("estree").ArrayPattern} ArrayPattern */
+/** @typedef {import("estree").AwaitExpression} AwaitExpression */
+/** @typedef {import("estree").ThisExpression} ThisExpression */
+/** @typedef {import("estree").RestElement} RestElement */
+/** @typedef {import("estree").ObjectPattern} ObjectPattern */
+/** @typedef {import("estree").SwitchCase} SwitchCase */
+/** @typedef {import("estree").CatchClause} CatchClause */
+/** @typedef {import("estree").VariableDeclarator} VariableDeclarator */
+/** @typedef {import("estree").ForInStatement} ForInStatement */
+/** @typedef {import("estree").ForOfStatement} ForOfStatement */
+/** @typedef {import("estree").ReturnStatement} ReturnStatement */
+/** @typedef {import("estree").WithStatement} WithStatement */
+/** @typedef {import("estree").ThrowStatement} ThrowStatement */
+/** @typedef {import("estree").MethodDefinition} MethodDefinition */
+/** @typedef {import("estree").NewExpression} NewExpression */
+/** @typedef {import("estree").SpreadElement} SpreadElement */
+/** @typedef {import("estree").FunctionExpression} FunctionExpression */
+/** @typedef {import("estree").WhileStatement} WhileStatement */
+/** @typedef {import("estree").ArrowFunctionExpression} ArrowFunctionExpression */
+/** @typedef {import("estree").ExpressionStatement} ExpressionStatement */
+/** @typedef {import("estree").FunctionDeclaration} FunctionDeclaration */
+/** @typedef {import("estree").DoWhileStatement} DoWhileStatement */
+/** @typedef {import("estree").TryStatement} TryStatement */
+/** @typedef {import("estree").Node} Node */
+/** @typedef {import("estree").Program} Program */
+/** @typedef {import("estree").Directive} Directive */
+/** @typedef {import("estree").Statement} Statement */
+/** @typedef {import("estree").ExportDefaultDeclaration} ExportDefaultDeclaration */
+/** @typedef {import("estree").Super} Super */
+/** @typedef {import("estree").TaggedTemplateExpression} TaggedTemplateExpression */
+/** @typedef {import("estree").TemplateLiteral} TemplateLiteral */
+/** @typedef {import("estree").AssignmentProperty} AssignmentProperty */
+/** @typedef {import("estree").MaybeNamedFunctionDeclaration} MaybeNamedFunctionDeclaration */
+/** @typedef {import("estree").MaybeNamedClassDeclaration} MaybeNamedClassDeclaration */
+/**
+ * @template T
+ * @typedef {import("tapable").AsArray} AsArray
+ */
+/** @typedef {import("../Parser").ParserState} ParserState */
+/** @typedef {import("../Parser").PreparsedAst} PreparsedAst */
+/** @typedef {{ name: string | VariableInfo, rootInfo: string | VariableInfo, getMembers: () => string[], getMembersOptionals: () => boolean[], getMemberRanges: () => Range[] }} GetInfoResult */
+/** @typedef {Statement | ModuleDeclaration | Expression | MaybeNamedFunctionDeclaration | MaybeNamedClassDeclaration} StatementPathItem */
+/** @typedef {(ident: string) => void} OnIdentString */
+/** @typedef {(ident: string, identifier: Identifier) => void} OnIdent */
+/** @typedef {StatementPathItem[]} StatementPath */
+
+// TODO remove cast when @types/estree has been updated to import assertions
+/** @typedef {import("estree").BaseNode & { type: "ImportAttribute", key: Identifier | Literal, value: Literal }} ImportAttribute */
+/** @typedef {import("estree").ImportDeclaration & { attributes?: Array }} ImportDeclaration */
+/** @typedef {import("estree").ExportNamedDeclaration & { attributes?: Array }} ExportNamedDeclaration */
+/** @typedef {import("estree").ExportAllDeclaration & { attributes?: Array }} ExportAllDeclaration */
+/** @typedef {import("estree").ImportExpression & { options?: Expression | null }} ImportExpression */
+/** @typedef {ImportDeclaration | ExportNamedDeclaration | ExportDefaultDeclaration | ExportAllDeclaration} ModuleDeclaration */
+
+/** @type {string[]} */
+const EMPTY_ARRAY = [];
+const ALLOWED_MEMBER_TYPES_CALL_EXPRESSION = 0b01;
+const ALLOWED_MEMBER_TYPES_EXPRESSION = 0b10;
+const ALLOWED_MEMBER_TYPES_ALL = 0b11;
+
+const LEGACY_ASSERT_ATTRIBUTES = Symbol("assert");
+
+/** @type {(BaseParser: typeof AcornParser) => typeof AcornParser} */
+const importAssertions = Parser =>
+	class extends Parser {
+		/**
+		 * @this {TODO}
+		 * @returns {ImportAttribute[]} import attributes
+		 */
+		parseWithClause() {
+			/** @type {ImportAttribute[]} */
+			const nodes = [];
+
+			const isAssertLegacy = this.value === "assert";
+
+			if (isAssertLegacy) {
+				if (!this.eat(tokTypes.name)) {
+					return nodes;
+				}
+			} else if (!this.eat(tokTypes._with)) {
+				return nodes;
+			}
+
+			this.expect(tokTypes.braceL);
+
+			/** @type {Record} */
+			const attributeKeys = {};
+			let first = true;
+
+			while (!this.eat(tokTypes.braceR)) {
+				if (!first) {
+					this.expect(tokTypes.comma);
+					if (this.afterTrailingComma(tokTypes.braceR)) {
+						break;
+					}
+				} else {
+					first = false;
+				}
+
+				const attr =
+					/** @type {ImportAttribute} */
+					this.parseImportAttribute();
+				const keyName =
+					attr.key.type === "Identifier" ? attr.key.name : attr.key.value;
+
+				if (Object.prototype.hasOwnProperty.call(attributeKeys, keyName)) {
+					this.raiseRecoverable(
+						attr.key.start,
+						`Duplicate attribute key '${keyName}'`
+					);
+				}
+
+				attributeKeys[keyName] = true;
+				nodes.push(attr);
+			}
+
+			if (isAssertLegacy) {
+				/** @type {EXPECTED_ANY} */
+				(nodes)[LEGACY_ASSERT_ATTRIBUTES] = true;
+			}
+
+			return nodes;
+		}
+	};
+
+// Syntax: https://developer.mozilla.org/en/SpiderMonkey/Parser_API
+const parser = AcornParser.extend(importAssertions);
+
+/** @typedef {Record & { _isLegacyAssert?: boolean }} ImportAttributes */
+
+/**
+ * @param {ImportDeclaration | ExportNamedDeclaration | ExportAllDeclaration | ImportExpression} node node with assertions
+ * @returns {ImportAttributes | undefined} import attributes
+ */
+const getImportAttributes = node => {
+	if (node.type === "ImportExpression") {
+		if (
+			node.options &&
+			node.options.type === "ObjectExpression" &&
+			node.options.properties[0] &&
+			node.options.properties[0].type === "Property" &&
+			node.options.properties[0].key.type === "Identifier" &&
+			(node.options.properties[0].key.name === "with" ||
+				node.options.properties[0].key.name === "assert") &&
+			node.options.properties[0].value.type === "ObjectExpression" &&
+			node.options.properties[0].value.properties.length > 0
+		) {
+			const properties =
+				/** @type {Property[]} */
+				(node.options.properties[0].value.properties);
+			const result = /** @type {ImportAttributes} */ ({});
+			for (const property of properties) {
+				const key =
+					/** @type {string} */
+					(
+						property.key.type === "Identifier"
+							? property.key.name
+							: /** @type {Literal} */ (property.key).value
+					);
+				result[key] =
+					/** @type {string} */
+					(/** @type {Literal} */ (property.value).value);
+			}
+			const key =
+				node.options.properties[0].key.type === "Identifier"
+					? node.options.properties[0].key.name
+					: /** @type {Literal} */ (node.options.properties[0].key).value;
+
+			if (key === "assert") {
+				result._isLegacyAssert = true;
+			}
+
+			return result;
+		}
+
+		return;
+	}
+
+	if (node.attributes === undefined || node.attributes.length === 0) {
+		return;
+	}
+
+	const result = /** @type {ImportAttributes} */ ({});
+
+	for (const attribute of node.attributes) {
+		const key =
+			/** @type {string} */
+			(
+				attribute.key.type === "Identifier"
+					? attribute.key.name
+					: attribute.key.value
+			);
+
+		result[key] = /** @type {string} */ (attribute.value.value);
+	}
+
+	if (/** @type {EXPECTED_ANY} */ (node.attributes)[LEGACY_ASSERT_ATTRIBUTES]) {
+		result._isLegacyAssert = true;
+	}
+
+	return result;
+};
+
+class VariableInfo {
+	/**
+	 * @param {ScopeInfo} declaredScope scope in which the variable is declared
+	 * @param {string | true | undefined} freeName which free name the variable aliases, or true when none
+	 * @param {TagInfo | undefined} tagInfo info about tags
+	 */
+	constructor(declaredScope, freeName, tagInfo) {
+		this.declaredScope = declaredScope;
+		this.freeName = freeName;
+		this.tagInfo = tagInfo;
+	}
+}
+
+/** @typedef {string | ScopeInfo | VariableInfo} ExportedVariableInfo */
+/** @typedef {Literal | string | null | undefined} ImportSource */
+/** @typedef {Omit & { sourceType: "module" | "script" | "auto", ecmaVersion?: AcornOptions["ecmaVersion"] }} ParseOptions */
+
+/** @typedef {symbol} Tag */
+/** @typedef {Record} TagData */
+
+/**
+ * @typedef {object} TagInfo
+ * @property {Tag} tag
+ * @property {TagData=} data
+ * @property {TagInfo | undefined} next
+ */
+
+const SCOPE_INFO_TERMINATED_RETURN = 1;
+const SCOPE_INFO_TERMINATED_THROW = 2;
+
+/**
+ * @typedef {object} ScopeInfo
+ * @property {StackedMap} definitions
+ * @property {boolean | "arrow"} topLevelScope
+ * @property {boolean | string} inShorthand
+ * @property {boolean} inTaggedTemplateTag
+ * @property {boolean} inTry
+ * @property {boolean} isStrict
+ * @property {boolean} isAsmJs
+ * @property {undefined | 1 | 2} terminated
+ */
+
+/** @typedef {[number, number]} Range */
+
+/**
+ * @typedef {object} DestructuringAssignmentProperty
+ * @property {string} id
+ * @property {Range | undefined=} range
+ * @property {boolean | string} shorthand
+ */
+
+/**
+ * Helper function for joining two ranges into a single range. This is useful
+ * when working with AST nodes, as it allows you to combine the ranges of child nodes
+ * to create the range of the _parent node_.
+ * @param {Range} startRange start range to join
+ * @param {Range} endRange end range to join
+ * @returns {Range} joined range
+ * @example
+ * ```js
+ * 	const startRange = [0, 5];
+ * 	const endRange = [10, 15];
+ * 	const joinedRange = joinRanges(startRange, endRange);
+ * 	console.log(joinedRange); // [0, 15]
+ * ```
+ */
+const joinRanges = (startRange, endRange) => {
+	if (!endRange) return startRange;
+	if (!startRange) return endRange;
+	return [startRange[0], endRange[1]];
+};
+
+/**
+ * Helper function used to generate a string representation of a
+ * [member expression](https://github.com/estree/estree/blob/master/es5.md#memberexpression).
+ * @param {string} object object to name
+ * @param {string[]} membersReversed reversed list of members
+ * @returns {string} member expression as a string
+ * @example
+ * ```js
+ * const membersReversed = ["property1", "property2", "property3"]; // Members parsed from the AST
+ * const name = objectAndMembersToName("myObject", membersReversed);
+ *
+ * console.log(name); // "myObject.property1.property2.property3"
+ * ```
+ */
+const objectAndMembersToName = (object, membersReversed) => {
+	let name = object;
+	for (let i = membersReversed.length - 1; i >= 0; i--) {
+		name = `${name}.${membersReversed[i]}`;
+	}
+	return name;
+};
+
+/**
+ * Grabs the name of a given expression and returns it as a string or undefined. Has particular
+ * handling for [Identifiers](https://github.com/estree/estree/blob/master/es5.md#identifier),
+ * [ThisExpressions](https://github.com/estree/estree/blob/master/es5.md#identifier), and
+ * [MetaProperties](https://github.com/estree/estree/blob/master/es2015.md#metaproperty) which is
+ * specifically for handling the `new.target` meta property.
+ * @param {Expression | SpreadElement | Super} expression expression
+ * @returns {string | "this" | undefined} name or variable info
+ */
+const getRootName = expression => {
+	switch (expression.type) {
+		case "Identifier":
+			return expression.name;
+		case "ThisExpression":
+			return "this";
+		case "MetaProperty":
+			return `${expression.meta.name}.${expression.property.name}`;
+		default:
+			return undefined;
+	}
+};
+
+/** @type {AcornOptions} */
+const defaultParserOptions = {
+	ranges: true,
+	locations: true,
+	ecmaVersion: "latest",
+	sourceType: "module",
+	// https://github.com/tc39/proposal-hashbang
+	allowHashBang: true,
+	onComment: undefined
+};
+
+const EMPTY_COMMENT_OPTIONS = {
+	options: null,
+	errors: null
+};
+
+const CLASS_NAME = "JavascriptParser";
+
+class JavascriptParser extends Parser {
+	/**
+	 * @param {"module" | "script" | "auto"} sourceType default source type
+	 */
+	constructor(sourceType = "auto") {
+		super();
+		this.hooks = Object.freeze({
+			/** @type {HookMap>} */
+			evaluateTypeof: new HookMap(() => new SyncBailHook(["expression"])),
+			/** @type {HookMap>} */
+			evaluate: new HookMap(() => new SyncBailHook(["expression"])),
+			/** @type {HookMap>} */
+			evaluateIdentifier: new HookMap(() => new SyncBailHook(["expression"])),
+			/** @type {HookMap>} */
+			evaluateDefinedIdentifier: new HookMap(
+				() => new SyncBailHook(["expression"])
+			),
+			/** @type {HookMap>} */
+			evaluateNewExpression: new HookMap(
+				() => new SyncBailHook(["expression"])
+			),
+			/** @type {HookMap>} */
+			evaluateCallExpression: new HookMap(
+				() => new SyncBailHook(["expression"])
+			),
+			/** @type {HookMap>} */
+			evaluateCallExpressionMember: new HookMap(
+				() => new SyncBailHook(["expression", "param"])
+			),
+			/** @type {HookMap>} */
+			isPure: new HookMap(
+				() => new SyncBailHook(["expression", "commentsStartPosition"])
+			),
+			/** @type {SyncBailHook<[Statement | ModuleDeclaration | MaybeNamedClassDeclaration | MaybeNamedFunctionDeclaration], boolean | void>} */
+			preStatement: new SyncBailHook(["statement"]),
+
+			/** @type {SyncBailHook<[Statement | ModuleDeclaration | MaybeNamedClassDeclaration | MaybeNamedFunctionDeclaration], boolean | void>} */
+			blockPreStatement: new SyncBailHook(["declaration"]),
+			/** @type {SyncBailHook<[Statement | ModuleDeclaration | MaybeNamedFunctionDeclaration | MaybeNamedClassDeclaration], boolean | void>} */
+			statement: new SyncBailHook(["statement"]),
+			/** @type {SyncBailHook<[IfStatement], boolean | void>} */
+			statementIf: new SyncBailHook(["statement"]),
+			/** @type {SyncBailHook<[Expression, ClassExpression | ClassDeclaration | MaybeNamedClassDeclaration], boolean | void>} */
+			classExtendsExpression: new SyncBailHook([
+				"expression",
+				"classDefinition"
+			]),
+			/** @type {SyncBailHook<[MethodDefinition | PropertyDefinition | StaticBlock, ClassExpression | ClassDeclaration | MaybeNamedClassDeclaration], boolean | void>} */
+			classBodyElement: new SyncBailHook(["element", "classDefinition"]),
+			/** @type {SyncBailHook<[Expression, MethodDefinition | PropertyDefinition, ClassExpression | ClassDeclaration | MaybeNamedClassDeclaration], boolean | void>} */
+			classBodyValue: new SyncBailHook([
+				"expression",
+				"element",
+				"classDefinition"
+			]),
+			/** @type {HookMap>} */
+			label: new HookMap(() => new SyncBailHook(["statement"])),
+			/** @type {SyncBailHook<[ImportDeclaration, ImportSource], boolean | void>} */
+			import: new SyncBailHook(["statement", "source"]),
+			/** @type {SyncBailHook<[ImportDeclaration, ImportSource, string | null, string], boolean | void>} */
+			importSpecifier: new SyncBailHook([
+				"statement",
+				"source",
+				"exportName",
+				"identifierName"
+			]),
+			/** @type {SyncBailHook<[ExportDefaultDeclaration | ExportNamedDeclaration], boolean | void>} */
+			export: new SyncBailHook(["statement"]),
+			/** @type {SyncBailHook<[ExportNamedDeclaration | ExportAllDeclaration, ImportSource], boolean | void>} */
+			exportImport: new SyncBailHook(["statement", "source"]),
+			/** @type {SyncBailHook<[ExportDefaultDeclaration | ExportNamedDeclaration | ExportAllDeclaration, Declaration], boolean | void>} */
+			exportDeclaration: new SyncBailHook(["statement", "declaration"]),
+			/** @type {SyncBailHook<[ExportDefaultDeclaration, MaybeNamedFunctionDeclaration | MaybeNamedClassDeclaration | Expression], boolean | void>} */
+			exportExpression: new SyncBailHook(["statement", "node"]),
+			/** @type {SyncBailHook<[ExportDefaultDeclaration | ExportNamedDeclaration | ExportAllDeclaration, string, string, number | undefined], boolean | void>} */
+			exportSpecifier: new SyncBailHook([
+				"statement",
+				"identifierName",
+				"exportName",
+				"index"
+			]),
+			/** @type {SyncBailHook<[ExportNamedDeclaration | ExportAllDeclaration, ImportSource, string | null, string | null, number | undefined], boolean | void>} */
+			exportImportSpecifier: new SyncBailHook([
+				"statement",
+				"source",
+				"identifierName",
+				"exportName",
+				"index"
+			]),
+			/** @type {SyncBailHook<[VariableDeclarator, Statement], boolean | void>} */
+			preDeclarator: new SyncBailHook(["declarator", "statement"]),
+			/** @type {SyncBailHook<[VariableDeclarator, Statement], boolean | void>} */
+			declarator: new SyncBailHook(["declarator", "statement"]),
+			/** @type {HookMap>} */
+			varDeclaration: new HookMap(() => new SyncBailHook(["declaration"])),
+			/** @type {HookMap>} */
+			varDeclarationLet: new HookMap(() => new SyncBailHook(["declaration"])),
+			/** @type {HookMap>} */
+			varDeclarationConst: new HookMap(() => new SyncBailHook(["declaration"])),
+			/** @type {HookMap>} */
+			varDeclarationVar: new HookMap(() => new SyncBailHook(["declaration"])),
+			/** @type {HookMap>} */
+			pattern: new HookMap(() => new SyncBailHook(["pattern"])),
+			/** @type {HookMap>} */
+			canRename: new HookMap(() => new SyncBailHook(["initExpression"])),
+			/** @type {HookMap>} */
+			rename: new HookMap(() => new SyncBailHook(["initExpression"])),
+			/** @type {HookMap>} */
+			assign: new HookMap(() => new SyncBailHook(["expression"])),
+			/** @type {HookMap>} */
+			assignMemberChain: new HookMap(
+				() => new SyncBailHook(["expression", "members"])
+			),
+			/** @type {HookMap>} */
+			typeof: new HookMap(() => new SyncBailHook(["expression"])),
+			/** @type {SyncBailHook<[ImportExpression], boolean | void>} */
+			importCall: new SyncBailHook(["expression"]),
+			/** @type {SyncBailHook<[Expression | ForOfStatement], boolean | void>} */
+			topLevelAwait: new SyncBailHook(["expression"]),
+			/** @type {HookMap>} */
+			call: new HookMap(() => new SyncBailHook(["expression"])),
+			/** Something like "a.b()" */
+			/** @type {HookMap>} */
+			callMemberChain: new HookMap(
+				() =>
+					new SyncBailHook([
+						"expression",
+						"members",
+						"membersOptionals",
+						"memberRanges"
+					])
+			),
+			/** Something like "a.b().c.d" */
+			/** @type {HookMap>} */
+			memberChainOfCallMemberChain: new HookMap(
+				() =>
+					new SyncBailHook([
+						"expression",
+						"calleeMembers",
+						"callExpression",
+						"members",
+						"memberRanges"
+					])
+			),
+			/** Something like "a.b().c.d()"" */
+			/** @type {HookMap>} */
+			callMemberChainOfCallMemberChain: new HookMap(
+				() =>
+					new SyncBailHook([
+						"expression",
+						"calleeMembers",
+						"innerCallExpression",
+						"members",
+						"memberRanges"
+					])
+			),
+			/** @type {SyncBailHook<[ChainExpression], boolean | void>} */
+			optionalChaining: new SyncBailHook(["optionalChaining"]),
+			/** @type {HookMap>} */
+			new: new HookMap(() => new SyncBailHook(["expression"])),
+			/** @type {SyncBailHook<[BinaryExpression], boolean | void>} */
+			binaryExpression: new SyncBailHook(["binaryExpression"]),
+			/** @type {HookMap>} */
+			expression: new HookMap(() => new SyncBailHook(["expression"])),
+			/** @type {HookMap>} */
+			expressionMemberChain: new HookMap(
+				() =>
+					new SyncBailHook([
+						"expression",
+						"members",
+						"membersOptionals",
+						"memberRanges"
+					])
+			),
+			/** @type {HookMap>} */
+			unhandledExpressionMemberChain: new HookMap(
+				() => new SyncBailHook(["expression", "members"])
+			),
+			/** @type {SyncBailHook<[ConditionalExpression], boolean | void>} */
+			expressionConditionalOperator: new SyncBailHook(["expression"]),
+			/** @type {SyncBailHook<[LogicalExpression], boolean | void>} */
+			expressionLogicalOperator: new SyncBailHook(["expression"]),
+			/** @type {SyncBailHook<[Program, Comment[]], boolean | void>} */
+			program: new SyncBailHook(["ast", "comments"]),
+			/** @type {SyncBailHook<[ThrowStatement | ReturnStatement], boolean | void>} */
+			terminate: new SyncBailHook(["statement"]),
+			/** @type {SyncBailHook<[Program, Comment[]], boolean | void>} */
+			finish: new SyncBailHook(["ast", "comments"])
+		});
+		this.sourceType = sourceType;
+		/** @type {ScopeInfo} */
+		this.scope = /** @type {TODO} */ (undefined);
+		/** @type {ParserState} */
+		this.state = /** @type {TODO} */ (undefined);
+		/** @type {Comment[] | undefined} */
+		this.comments = undefined;
+		/** @type {Set | undefined} */
+		this.semicolons = undefined;
+		/** @type {StatementPath | undefined} */
+		this.statementPath = undefined;
+		/** @type {Statement | ModuleDeclaration | Expression | MaybeNamedFunctionDeclaration | MaybeNamedClassDeclaration | undefined} */
+		this.prevStatement = undefined;
+		/** @type {WeakMap> | undefined} */
+		this.destructuringAssignmentProperties = undefined;
+		/** @type {TagData | undefined} */
+		this.currentTagData = undefined;
+		this.magicCommentContext = createMagicCommentContext();
+		this._initializeEvaluating();
+	}
+
+	_initializeEvaluating() {
+		this.hooks.evaluate.for("Literal").tap(CLASS_NAME, _expr => {
+			const expr = /** @type {Literal} */ (_expr);
+
+			switch (typeof expr.value) {
+				case "number":
+					return new BasicEvaluatedExpression()
+						.setNumber(expr.value)
+						.setRange(/** @type {Range} */ (expr.range));
+				case "bigint":
+					return new BasicEvaluatedExpression()
+						.setBigInt(expr.value)
+						.setRange(/** @type {Range} */ (expr.range));
+				case "string":
+					return new BasicEvaluatedExpression()
+						.setString(expr.value)
+						.setRange(/** @type {Range} */ (expr.range));
+				case "boolean":
+					return new BasicEvaluatedExpression()
+						.setBoolean(expr.value)
+						.setRange(/** @type {Range} */ (expr.range));
+			}
+			if (expr.value === null) {
+				return new BasicEvaluatedExpression()
+					.setNull()
+					.setRange(/** @type {Range} */ (expr.range));
+			}
+			if (expr.value instanceof RegExp) {
+				return new BasicEvaluatedExpression()
+					.setRegExp(expr.value)
+					.setRange(/** @type {Range} */ (expr.range));
+			}
+		});
+		this.hooks.evaluate.for("NewExpression").tap(CLASS_NAME, _expr => {
+			const expr = /** @type {NewExpression} */ (_expr);
+			const callee = expr.callee;
+			if (callee.type !== "Identifier") return;
+			if (callee.name !== "RegExp") {
+				return this.callHooksForName(
+					this.hooks.evaluateNewExpression,
+					callee.name,
+					expr
+				);
+			} else if (
+				expr.arguments.length > 2 ||
+				this.getVariableInfo("RegExp") !== "RegExp"
+			)
+				return;
+
+			let regExp;
+			const arg1 = expr.arguments[0];
+
+			if (arg1) {
+				if (arg1.type === "SpreadElement") return;
+
+				const evaluatedRegExp = this.evaluateExpression(arg1);
+
+				if (!evaluatedRegExp) return;
+
+				regExp = evaluatedRegExp.asString();
+
+				if (!regExp) return;
+			} else {
+				return (
+					new BasicEvaluatedExpression()
+						// eslint-disable-next-line prefer-regex-literals
+						.setRegExp(new RegExp(""))
+						.setRange(/** @type {Range} */ (expr.range))
+				);
+			}
+
+			let flags;
+			const arg2 = expr.arguments[1];
+
+			if (arg2) {
+				if (arg2.type === "SpreadElement") return;
+
+				const evaluatedFlags = this.evaluateExpression(arg2);
+
+				if (!evaluatedFlags) return;
+
+				if (!evaluatedFlags.isUndefined()) {
+					flags = evaluatedFlags.asString();
+
+					if (
+						flags === undefined ||
+						!BasicEvaluatedExpression.isValidRegExpFlags(flags)
+					)
+						return;
+				}
+			}
+
+			return new BasicEvaluatedExpression()
+				.setRegExp(flags ? new RegExp(regExp, flags) : new RegExp(regExp))
+				.setRange(/** @type {Range} */ (expr.range));
+		});
+		this.hooks.evaluate.for("LogicalExpression").tap(CLASS_NAME, _expr => {
+			const expr = /** @type {LogicalExpression} */ (_expr);
+
+			const left = this.evaluateExpression(expr.left);
+			let returnRight = false;
+			/** @type {boolean | undefined} */
+			let allowedRight;
+			if (expr.operator === "&&") {
+				const leftAsBool = left.asBool();
+				if (leftAsBool === false)
+					return left.setRange(/** @type {Range} */ (expr.range));
+				returnRight = leftAsBool === true;
+				allowedRight = false;
+			} else if (expr.operator === "||") {
+				const leftAsBool = left.asBool();
+				if (leftAsBool === true)
+					return left.setRange(/** @type {Range} */ (expr.range));
+				returnRight = leftAsBool === false;
+				allowedRight = true;
+			} else if (expr.operator === "??") {
+				const leftAsNullish = left.asNullish();
+				if (leftAsNullish === false)
+					return left.setRange(/** @type {Range} */ (expr.range));
+				if (leftAsNullish !== true) return;
+				returnRight = true;
+			} else return;
+			const right = this.evaluateExpression(expr.right);
+			if (returnRight) {
+				if (left.couldHaveSideEffects()) right.setSideEffects();
+				return right.setRange(/** @type {Range} */ (expr.range));
+			}
+
+			const asBool = right.asBool();
+
+			if (allowedRight === true && asBool === true) {
+				return new BasicEvaluatedExpression()
+					.setRange(/** @type {Range} */ (expr.range))
+					.setTruthy();
+			} else if (allowedRight === false && asBool === false) {
+				return new BasicEvaluatedExpression()
+					.setRange(/** @type {Range} */ (expr.range))
+					.setFalsy();
+			}
+		});
+
+		/**
+		 * In simple logical cases, we can use valueAsExpression to assist us in evaluating the expression on
+		 * either side of a [BinaryExpression](https://github.com/estree/estree/blob/master/es5.md#binaryexpression).
+		 * This supports scenarios in webpack like conditionally `import()`'ing modules based on some simple evaluation:
+		 *
+		 * ```js
+		 * if (1 === 3) {
+		 *  import("./moduleA"); // webpack will auto evaluate this and not import the modules
+		 * }
+		 * ```
+		 *
+		 * Additional scenarios include evaluation of strings inside of dynamic import statements:
+		 *
+		 * ```js
+		 * const foo = "foo";
+		 * const bar = "bar";
+		 *
+		 * import("./" + foo + bar); // webpack will auto evaluate this into import("./foobar")
+		 * ```
+		 * @param {boolean | number | bigint | string} value the value to convert to an expression
+		 * @param {BinaryExpression | UnaryExpression} expr the expression being evaluated
+		 * @param {boolean} sideEffects whether the expression has side effects
+		 * @returns {BasicEvaluatedExpression | undefined} the evaluated expression
+		 * @example
+		 *
+		 * ```js
+		 * const binaryExpr = new BinaryExpression("+",
+		 * 	{ type: "Literal", value: 2 },
+		 * 	{ type: "Literal", value: 3 }
+		 * );
+		 *
+		 * const leftValue = 2;
+		 * const rightValue = 3;
+		 *
+		 * const leftExpr = valueAsExpression(leftValue, binaryExpr.left, false);
+		 * const rightExpr = valueAsExpression(rightValue, binaryExpr.right, false);
+		 * const result = new BasicEvaluatedExpression()
+		 * 	.setNumber(leftExpr.number + rightExpr.number)
+		 * 	.setRange(binaryExpr.range);
+		 *
+		 * console.log(result.number); // Output: 5
+		 * ```
+		 */
+		const valueAsExpression = (value, expr, sideEffects) => {
+			switch (typeof value) {
+				case "boolean":
+					return new BasicEvaluatedExpression()
+						.setBoolean(value)
+						.setSideEffects(sideEffects)
+						.setRange(/** @type {Range} */ (expr.range));
+				case "number":
+					return new BasicEvaluatedExpression()
+						.setNumber(value)
+						.setSideEffects(sideEffects)
+						.setRange(/** @type {Range} */ (expr.range));
+				case "bigint":
+					return new BasicEvaluatedExpression()
+						.setBigInt(value)
+						.setSideEffects(sideEffects)
+						.setRange(/** @type {Range} */ (expr.range));
+				case "string":
+					return new BasicEvaluatedExpression()
+						.setString(value)
+						.setSideEffects(sideEffects)
+						.setRange(/** @type {Range} */ (expr.range));
+			}
+		};
+
+		this.hooks.evaluate.for("BinaryExpression").tap(CLASS_NAME, _expr => {
+			const expr = /** @type {BinaryExpression} */ (_expr);
+
+			/**
+			 * Evaluates a binary expression if and only if it is a const operation (e.g. 1 + 2, "a" + "b", etc.).
+			 * @template T
+			 * @param {(leftOperand: T, rightOperand: T) => boolean | number | bigint | string} operandHandler the handler for the operation (e.g. (a, b) => a + b)
+			 * @returns {BasicEvaluatedExpression | undefined} the evaluated expression
+			 */
+			const handleConstOperation = operandHandler => {
+				const left = this.evaluateExpression(expr.left);
+				if (!left.isCompileTimeValue()) return;
+
+				const right = this.evaluateExpression(expr.right);
+				if (!right.isCompileTimeValue()) return;
+
+				const result = operandHandler(
+					/** @type {T} */ (left.asCompileTimeValue()),
+					/** @type {T} */ (right.asCompileTimeValue())
+				);
+				return valueAsExpression(
+					result,
+					expr,
+					left.couldHaveSideEffects() || right.couldHaveSideEffects()
+				);
+			};
+
+			/**
+			 * Helper function to determine if two booleans are always different. This is used in `handleStrictEqualityComparison`
+			 * to determine if an expressions boolean or nullish conversion is equal or not.
+			 * @param {boolean} a first boolean to compare
+			 * @param {boolean} b second boolean to compare
+			 * @returns {boolean} true if the two booleans are always different, false otherwise
+			 */
+			const isAlwaysDifferent = (a, b) =>
+				(a === true && b === false) || (a === false && b === true);
+
+			/**
+			 * @param {BasicEvaluatedExpression} left left
+			 * @param {BasicEvaluatedExpression} right right
+			 * @param {BasicEvaluatedExpression} res res
+			 * @param {boolean} eql true for "===" and false for "!=="
+			 * @returns {BasicEvaluatedExpression | undefined} result
+			 */
+			const handleTemplateStringCompare = (left, right, res, eql) => {
+				/**
+				 * @param {BasicEvaluatedExpression[]} parts parts
+				 * @returns {string} value
+				 */
+				const getPrefix = parts => {
+					let value = "";
+					for (const p of parts) {
+						const v = p.asString();
+						if (v !== undefined) value += v;
+						else break;
+					}
+					return value;
+				};
+				/**
+				 * @param {BasicEvaluatedExpression[]} parts parts
+				 * @returns {string} value
+				 */
+				const getSuffix = parts => {
+					let value = "";
+					for (let i = parts.length - 1; i >= 0; i--) {
+						const v = parts[i].asString();
+						if (v !== undefined) value = v + value;
+						else break;
+					}
+					return value;
+				};
+				const leftPrefix = getPrefix(
+					/** @type {BasicEvaluatedExpression[]} */ (left.parts)
+				);
+				const rightPrefix = getPrefix(
+					/** @type {BasicEvaluatedExpression[]} */ (right.parts)
+				);
+				const leftSuffix = getSuffix(
+					/** @type {BasicEvaluatedExpression[]} */ (left.parts)
+				);
+				const rightSuffix = getSuffix(
+					/** @type {BasicEvaluatedExpression[]} */ (right.parts)
+				);
+				const lenPrefix = Math.min(leftPrefix.length, rightPrefix.length);
+				const lenSuffix = Math.min(leftSuffix.length, rightSuffix.length);
+				const prefixMismatch =
+					lenPrefix > 0 &&
+					leftPrefix.slice(0, lenPrefix) !== rightPrefix.slice(0, lenPrefix);
+				const suffixMismatch =
+					lenSuffix > 0 &&
+					leftSuffix.slice(-lenSuffix) !== rightSuffix.slice(-lenSuffix);
+				if (prefixMismatch || suffixMismatch) {
+					return res
+						.setBoolean(!eql)
+						.setSideEffects(
+							left.couldHaveSideEffects() || right.couldHaveSideEffects()
+						);
+				}
+			};
+
+			/**
+			 * Helper function to handle BinaryExpressions using strict equality comparisons (e.g. "===" and "!==").
+			 * @param {boolean} eql true for "===" and false for "!=="
+			 * @returns {BasicEvaluatedExpression | undefined} the evaluated expression
+			 */
+			const handleStrictEqualityComparison = eql => {
+				const left = this.evaluateExpression(expr.left);
+				const right = this.evaluateExpression(expr.right);
+				const res = new BasicEvaluatedExpression();
+				res.setRange(/** @type {Range} */ (expr.range));
+
+				const leftConst = left.isCompileTimeValue();
+				const rightConst = right.isCompileTimeValue();
+
+				if (leftConst && rightConst) {
+					return res
+						.setBoolean(
+							eql === (left.asCompileTimeValue() === right.asCompileTimeValue())
+						)
+						.setSideEffects(
+							left.couldHaveSideEffects() || right.couldHaveSideEffects()
+						);
+				}
+
+				if (left.isArray() && right.isArray()) {
+					return res
+						.setBoolean(!eql)
+						.setSideEffects(
+							left.couldHaveSideEffects() || right.couldHaveSideEffects()
+						);
+				}
+				if (left.isTemplateString() && right.isTemplateString()) {
+					return handleTemplateStringCompare(left, right, res, eql);
+				}
+
+				const leftPrimitive = left.isPrimitiveType();
+				const rightPrimitive = right.isPrimitiveType();
+
+				if (
+					// Primitive !== Object or
+					// compile-time object types are never equal to something at runtime
+					(leftPrimitive === false && (leftConst || rightPrimitive === true)) ||
+					(rightPrimitive === false &&
+						(rightConst || leftPrimitive === true)) ||
+					// Different nullish or boolish status also means not equal
+					isAlwaysDifferent(
+						/** @type {boolean} */ (left.asBool()),
+						/** @type {boolean} */ (right.asBool())
+					) ||
+					isAlwaysDifferent(
+						/** @type {boolean} */ (left.asNullish()),
+						/** @type {boolean} */ (right.asNullish())
+					)
+				) {
+					return res
+						.setBoolean(!eql)
+						.setSideEffects(
+							left.couldHaveSideEffects() || right.couldHaveSideEffects()
+						);
+				}
+			};
+
+			/**
+			 * Helper function to handle BinaryExpressions using abstract equality comparisons (e.g. "==" and "!=").
+			 * @param {boolean} eql true for "==" and false for "!="
+			 * @returns {BasicEvaluatedExpression | undefined} the evaluated expression
+			 */
+			const handleAbstractEqualityComparison = eql => {
+				const left = this.evaluateExpression(expr.left);
+				const right = this.evaluateExpression(expr.right);
+				const res = new BasicEvaluatedExpression();
+				res.setRange(/** @type {Range} */ (expr.range));
+
+				const leftConst = left.isCompileTimeValue();
+				const rightConst = right.isCompileTimeValue();
+
+				if (leftConst && rightConst) {
+					return res
+						.setBoolean(
+							eql ===
+								// eslint-disable-next-line eqeqeq
+								(left.asCompileTimeValue() == right.asCompileTimeValue())
+						)
+						.setSideEffects(
+							left.couldHaveSideEffects() || right.couldHaveSideEffects()
+						);
+				}
+
+				if (left.isArray() && right.isArray()) {
+					return res
+						.setBoolean(!eql)
+						.setSideEffects(
+							left.couldHaveSideEffects() || right.couldHaveSideEffects()
+						);
+				}
+				if (left.isTemplateString() && right.isTemplateString()) {
+					return handleTemplateStringCompare(left, right, res, eql);
+				}
+			};
+
+			if (expr.operator === "+") {
+				const left = this.evaluateExpression(expr.left);
+				const right = this.evaluateExpression(expr.right);
+				const res = new BasicEvaluatedExpression();
+				if (left.isString()) {
+					if (right.isString()) {
+						res.setString(
+							/** @type {string} */ (left.string) +
+								/** @type {string} */ (right.string)
+						);
+					} else if (right.isNumber()) {
+						res.setString(/** @type {string} */ (left.string) + right.number);
+					} else if (
+						right.isWrapped() &&
+						right.prefix &&
+						right.prefix.isString()
+					) {
+						// "left" + ("prefix" + inner + "postfix")
+						// => ("leftPrefix" + inner + "postfix")
+						res.setWrapped(
+							new BasicEvaluatedExpression()
+								.setString(
+									/** @type {string} */ (left.string) +
+										/** @type {string} */ (right.prefix.string)
+								)
+								.setRange(
+									joinRanges(
+										/** @type {Range} */ (left.range),
+										/** @type {Range} */ (right.prefix.range)
+									)
+								),
+							right.postfix,
+							right.wrappedInnerExpressions
+						);
+					} else if (right.isWrapped()) {
+						// "left" + ([null] + inner + "postfix")
+						// => ("left" + inner + "postfix")
+						res.setWrapped(left, right.postfix, right.wrappedInnerExpressions);
+					} else {
+						// "left" + expr
+						// => ("left" + expr + "")
+						res.setWrapped(left, null, [right]);
+					}
+				} else if (left.isNumber()) {
+					if (right.isString()) {
+						res.setString(left.number + /** @type {string} */ (right.string));
+					} else if (right.isNumber()) {
+						res.setNumber(
+							/** @type {number} */ (left.number) +
+								/** @type {number} */ (right.number)
+						);
+					} else {
+						return;
+					}
+				} else if (left.isBigInt()) {
+					if (right.isBigInt()) {
+						res.setBigInt(
+							/** @type {bigint} */ (left.bigint) +
+								/** @type {bigint} */ (right.bigint)
+						);
+					}
+				} else if (left.isWrapped()) {
+					if (left.postfix && left.postfix.isString() && right.isString()) {
+						// ("prefix" + inner + "postfix") + "right"
+						// => ("prefix" + inner + "postfixRight")
+						res.setWrapped(
+							left.prefix,
+							new BasicEvaluatedExpression()
+								.setString(
+									/** @type {string} */ (left.postfix.string) +
+										/** @type {string} */ (right.string)
+								)
+								.setRange(
+									joinRanges(
+										/** @type {Range} */ (left.postfix.range),
+										/** @type {Range} */ (right.range)
+									)
+								),
+							left.wrappedInnerExpressions
+						);
+					} else if (
+						left.postfix &&
+						left.postfix.isString() &&
+						right.isNumber()
+					) {
+						// ("prefix" + inner + "postfix") + 123
+						// => ("prefix" + inner + "postfix123")
+						res.setWrapped(
+							left.prefix,
+							new BasicEvaluatedExpression()
+								.setString(
+									/** @type {string} */ (left.postfix.string) +
+										/** @type {number} */ (right.number)
+								)
+								.setRange(
+									joinRanges(
+										/** @type {Range} */ (left.postfix.range),
+										/** @type {Range} */ (right.range)
+									)
+								),
+							left.wrappedInnerExpressions
+						);
+					} else if (right.isString()) {
+						// ("prefix" + inner + [null]) + "right"
+						// => ("prefix" + inner + "right")
+						res.setWrapped(left.prefix, right, left.wrappedInnerExpressions);
+					} else if (right.isNumber()) {
+						// ("prefix" + inner + [null]) + 123
+						// => ("prefix" + inner + "123")
+						res.setWrapped(
+							left.prefix,
+							new BasicEvaluatedExpression()
+								.setString(String(right.number))
+								.setRange(/** @type {Range} */ (right.range)),
+							left.wrappedInnerExpressions
+						);
+					} else if (right.isWrapped()) {
+						// ("prefix1" + inner1 + "postfix1") + ("prefix2" + inner2 + "postfix2")
+						// ("prefix1" + inner1 + "postfix1" + "prefix2" + inner2 + "postfix2")
+						res.setWrapped(
+							left.prefix,
+							right.postfix,
+							left.wrappedInnerExpressions &&
+								right.wrappedInnerExpressions &&
+								left.wrappedInnerExpressions
+									.concat(left.postfix ? [left.postfix] : [])
+									.concat(right.prefix ? [right.prefix] : [])
+									.concat(right.wrappedInnerExpressions)
+						);
+					} else {
+						// ("prefix" + inner + postfix) + expr
+						// => ("prefix" + inner + postfix + expr + [null])
+						res.setWrapped(
+							left.prefix,
+							null,
+							left.wrappedInnerExpressions &&
+								left.wrappedInnerExpressions.concat(
+									left.postfix ? [left.postfix, right] : [right]
+								)
+						);
+					}
+				} else if (right.isString()) {
+					// left + "right"
+					// => ([null] + left + "right")
+					res.setWrapped(null, right, [left]);
+				} else if (right.isWrapped()) {
+					// left + (prefix + inner + "postfix")
+					// => ([null] + left + prefix + inner + "postfix")
+					res.setWrapped(
+						null,
+						right.postfix,
+						right.wrappedInnerExpressions &&
+							(right.prefix ? [left, right.prefix] : [left]).concat(
+								right.wrappedInnerExpressions
+							)
+					);
+				} else {
+					return;
+				}
+				if (left.couldHaveSideEffects() || right.couldHaveSideEffects())
+					res.setSideEffects();
+				res.setRange(/** @type {Range} */ (expr.range));
+				return res;
+			} else if (expr.operator === "-") {
+				return handleConstOperation((l, r) => l - r);
+			} else if (expr.operator === "*") {
+				return handleConstOperation((l, r) => l * r);
+			} else if (expr.operator === "/") {
+				return handleConstOperation((l, r) => l / r);
+			} else if (expr.operator === "**") {
+				return handleConstOperation((l, r) => l ** r);
+			} else if (expr.operator === "===") {
+				return handleStrictEqualityComparison(true);
+			} else if (expr.operator === "==") {
+				return handleAbstractEqualityComparison(true);
+			} else if (expr.operator === "!==") {
+				return handleStrictEqualityComparison(false);
+			} else if (expr.operator === "!=") {
+				return handleAbstractEqualityComparison(false);
+			} else if (expr.operator === "&") {
+				return handleConstOperation((l, r) => l & r);
+			} else if (expr.operator === "|") {
+				return handleConstOperation((l, r) => l | r);
+			} else if (expr.operator === "^") {
+				return handleConstOperation((l, r) => l ^ r);
+			} else if (expr.operator === ">>>") {
+				return handleConstOperation((l, r) => l >>> r);
+			} else if (expr.operator === ">>") {
+				return handleConstOperation((l, r) => l >> r);
+			} else if (expr.operator === "<<") {
+				return handleConstOperation((l, r) => l << r);
+			} else if (expr.operator === "<") {
+				return handleConstOperation((l, r) => l < r);
+			} else if (expr.operator === ">") {
+				return handleConstOperation((l, r) => l > r);
+			} else if (expr.operator === "<=") {
+				return handleConstOperation((l, r) => l <= r);
+			} else if (expr.operator === ">=") {
+				return handleConstOperation((l, r) => l >= r);
+			}
+		});
+		this.hooks.evaluate.for("UnaryExpression").tap(CLASS_NAME, _expr => {
+			const expr = /** @type {UnaryExpression} */ (_expr);
+
+			/**
+			 * Evaluates a UnaryExpression if and only if it is a basic const operator (e.g. +a, -a, ~a).
+			 * @template T
+			 * @param {(operand: T) => boolean | number | bigint | string} operandHandler handler for the operand
+			 * @returns {BasicEvaluatedExpression | undefined} evaluated expression
+			 */
+			const handleConstOperation = operandHandler => {
+				const argument = this.evaluateExpression(expr.argument);
+				if (!argument.isCompileTimeValue()) return;
+				const result = operandHandler(
+					/** @type {T} */ (argument.asCompileTimeValue())
+				);
+				return valueAsExpression(result, expr, argument.couldHaveSideEffects());
+			};
+
+			if (expr.operator === "typeof") {
+				switch (expr.argument.type) {
+					case "Identifier": {
+						const res = this.callHooksForName(
+							this.hooks.evaluateTypeof,
+							expr.argument.name,
+							expr
+						);
+						if (res !== undefined) return res;
+						break;
+					}
+					case "MetaProperty": {
+						const res = this.callHooksForName(
+							this.hooks.evaluateTypeof,
+							/** @type {string} */
+							(getRootName(expr.argument)),
+							expr
+						);
+						if (res !== undefined) return res;
+						break;
+					}
+					case "MemberExpression": {
+						const res = this.callHooksForExpression(
+							this.hooks.evaluateTypeof,
+							expr.argument,
+							expr
+						);
+						if (res !== undefined) return res;
+						break;
+					}
+					case "ChainExpression": {
+						const res = this.callHooksForExpression(
+							this.hooks.evaluateTypeof,
+							expr.argument.expression,
+							expr
+						);
+						if (res !== undefined) return res;
+						break;
+					}
+					case "FunctionExpression": {
+						return new BasicEvaluatedExpression()
+							.setString("function")
+							.setRange(/** @type {Range} */ (expr.range));
+					}
+				}
+				const arg = this.evaluateExpression(expr.argument);
+				if (arg.isUnknown()) return;
+				if (arg.isString()) {
+					return new BasicEvaluatedExpression()
+						.setString("string")
+						.setRange(/** @type {Range} */ (expr.range));
+				}
+				if (arg.isWrapped()) {
+					return new BasicEvaluatedExpression()
+						.setString("string")
+						.setSideEffects()
+						.setRange(/** @type {Range} */ (expr.range));
+				}
+				if (arg.isUndefined()) {
+					return new BasicEvaluatedExpression()
+						.setString("undefined")
+						.setRange(/** @type {Range} */ (expr.range));
+				}
+				if (arg.isNumber()) {
+					return new BasicEvaluatedExpression()
+						.setString("number")
+						.setRange(/** @type {Range} */ (expr.range));
+				}
+				if (arg.isBigInt()) {
+					return new BasicEvaluatedExpression()
+						.setString("bigint")
+						.setRange(/** @type {Range} */ (expr.range));
+				}
+				if (arg.isBoolean()) {
+					return new BasicEvaluatedExpression()
+						.setString("boolean")
+						.setRange(/** @type {Range} */ (expr.range));
+				}
+				if (arg.isConstArray() || arg.isRegExp() || arg.isNull()) {
+					return new BasicEvaluatedExpression()
+						.setString("object")
+						.setRange(/** @type {Range} */ (expr.range));
+				}
+				if (arg.isArray()) {
+					return new BasicEvaluatedExpression()
+						.setString("object")
+						.setSideEffects(arg.couldHaveSideEffects())
+						.setRange(/** @type {Range} */ (expr.range));
+				}
+			} else if (expr.operator === "!") {
+				const argument = this.evaluateExpression(expr.argument);
+				const bool = argument.asBool();
+				if (typeof bool !== "boolean") return;
+				return new BasicEvaluatedExpression()
+					.setBoolean(!bool)
+					.setSideEffects(argument.couldHaveSideEffects())
+					.setRange(/** @type {Range} */ (expr.range));
+			} else if (expr.operator === "~") {
+				return handleConstOperation(v => ~v);
+			} else if (expr.operator === "+") {
+				// eslint-disable-next-line no-implicit-coercion
+				return handleConstOperation(v => +v);
+			} else if (expr.operator === "-") {
+				return handleConstOperation(v => -v);
+			}
+		});
+		this.hooks.evaluateTypeof
+			.for("undefined")
+			.tap(CLASS_NAME, expr =>
+				new BasicEvaluatedExpression()
+					.setString("undefined")
+					.setRange(/** @type {Range} */ (expr.range))
+			);
+		this.hooks.evaluate.for("Identifier").tap(CLASS_NAME, expr => {
+			if (/** @type {Identifier} */ (expr).name === "undefined") {
+				return new BasicEvaluatedExpression()
+					.setUndefined()
+					.setRange(/** @type {Range} */ (expr.range));
+			}
+		});
+		/**
+		 * @param {"Identifier" | "ThisExpression" | "MemberExpression"} exprType expression type name
+		 * @param {(node: Expression | SpreadElement) => GetInfoResult | undefined} getInfo get info
+		 * @returns {void}
+		 */
+		const tapEvaluateWithVariableInfo = (exprType, getInfo) => {
+			/** @type {Expression | undefined} */
+			let cachedExpression;
+			/** @type {GetInfoResult | undefined} */
+			let cachedInfo;
+			this.hooks.evaluate.for(exprType).tap(CLASS_NAME, expr => {
+				const expression =
+					/** @type {Identifier | ThisExpression | MemberExpression} */ (expr);
+
+				const info = getInfo(expression);
+				if (info !== undefined) {
+					return this.callHooksForInfoWithFallback(
+						this.hooks.evaluateIdentifier,
+						info.name,
+						name => {
+							cachedExpression = expression;
+							cachedInfo = info;
+						},
+						name => {
+							const hook = this.hooks.evaluateDefinedIdentifier.get(name);
+							if (hook !== undefined) {
+								return hook.call(expression);
+							}
+						},
+						expression
+					);
+				}
+			});
+			this.hooks.evaluate
+				.for(exprType)
+				.tap({ name: CLASS_NAME, stage: 100 }, expr => {
+					const expression =
+						/** @type {Identifier | ThisExpression | MemberExpression} */
+						(expr);
+					const info =
+						cachedExpression === expression ? cachedInfo : getInfo(expression);
+					if (info !== undefined) {
+						return new BasicEvaluatedExpression()
+							.setIdentifier(
+								info.name,
+								info.rootInfo,
+								info.getMembers,
+								info.getMembersOptionals,
+								info.getMemberRanges
+							)
+							.setRange(/** @type {Range} */ (expression.range));
+					}
+				});
+			this.hooks.finish.tap(CLASS_NAME, () => {
+				// Cleanup for GC
+				cachedExpression = cachedInfo = undefined;
+			});
+		};
+		tapEvaluateWithVariableInfo("Identifier", expr => {
+			const info = this.getVariableInfo(/** @type {Identifier} */ (expr).name);
+			if (
+				typeof info === "string" ||
+				(info instanceof VariableInfo && typeof info.freeName === "string")
+			) {
+				return {
+					name: info,
+					rootInfo: info,
+					getMembers: () => [],
+					getMembersOptionals: () => [],
+					getMemberRanges: () => []
+				};
+			}
+		});
+		tapEvaluateWithVariableInfo("ThisExpression", expr => {
+			const info = this.getVariableInfo("this");
+			if (
+				typeof info === "string" ||
+				(info instanceof VariableInfo && typeof info.freeName === "string")
+			) {
+				return {
+					name: info,
+					rootInfo: info,
+					getMembers: () => [],
+					getMembersOptionals: () => [],
+					getMemberRanges: () => []
+				};
+			}
+		});
+		this.hooks.evaluate.for("MetaProperty").tap(CLASS_NAME, expr => {
+			const metaProperty = /** @type {MetaProperty} */ (expr);
+
+			return this.callHooksForName(
+				this.hooks.evaluateIdentifier,
+				/** @type {string} */
+				(getRootName(metaProperty)),
+				metaProperty
+			);
+		});
+		tapEvaluateWithVariableInfo("MemberExpression", expr =>
+			this.getMemberExpressionInfo(
+				/** @type {MemberExpression} */ (expr),
+				ALLOWED_MEMBER_TYPES_EXPRESSION
+			)
+		);
+
+		this.hooks.evaluate.for("CallExpression").tap(CLASS_NAME, _expr => {
+			const expr = /** @type {CallExpression} */ (_expr);
+			if (
+				expr.callee.type === "MemberExpression" &&
+				expr.callee.property.type ===
+					(expr.callee.computed ? "Literal" : "Identifier")
+			) {
+				// type Super also possible here
+				const param = this.evaluateExpression(
+					/** @type {Expression} */ (expr.callee.object)
+				);
+				const property =
+					expr.callee.property.type === "Literal"
+						? `${expr.callee.property.value}`
+						: expr.callee.property.name;
+				const hook = this.hooks.evaluateCallExpressionMember.get(property);
+				if (hook !== undefined) {
+					return hook.call(expr, param);
+				}
+			} else if (expr.callee.type === "Identifier") {
+				return this.callHooksForName(
+					this.hooks.evaluateCallExpression,
+					expr.callee.name,
+					expr
+				);
+			}
+		});
+		this.hooks.evaluateCallExpressionMember
+			.for("indexOf")
+			.tap(CLASS_NAME, (expr, param) => {
+				if (!param.isString()) return;
+				if (expr.arguments.length === 0) return;
+				const [arg1, arg2] = expr.arguments;
+				if (arg1.type === "SpreadElement") return;
+				const arg1Eval = this.evaluateExpression(arg1);
+				if (!arg1Eval.isString()) return;
+				const arg1Value = /** @type {string} */ (arg1Eval.string);
+
+				let result;
+				if (arg2) {
+					if (arg2.type === "SpreadElement") return;
+					const arg2Eval = this.evaluateExpression(arg2);
+					if (!arg2Eval.isNumber()) return;
+					result = /** @type {string} */ (param.string).indexOf(
+						arg1Value,
+						arg2Eval.number
+					);
+				} else {
+					result = /** @type {string} */ (param.string).indexOf(arg1Value);
+				}
+				return new BasicEvaluatedExpression()
+					.setNumber(result)
+					.setSideEffects(param.couldHaveSideEffects())
+					.setRange(/** @type {Range} */ (expr.range));
+			});
+		this.hooks.evaluateCallExpressionMember
+			.for("replace")
+			.tap(CLASS_NAME, (expr, param) => {
+				if (!param.isString()) return;
+				if (expr.arguments.length !== 2) return;
+				if (expr.arguments[0].type === "SpreadElement") return;
+				if (expr.arguments[1].type === "SpreadElement") return;
+				const arg1 = this.evaluateExpression(expr.arguments[0]);
+				const arg2 = this.evaluateExpression(expr.arguments[1]);
+				if (!arg1.isString() && !arg1.isRegExp()) return;
+				const arg1Value = /** @type {string | RegExp} */ (
+					arg1.regExp || arg1.string
+				);
+				if (!arg2.isString()) return;
+				const arg2Value = /** @type {string} */ (arg2.string);
+				return new BasicEvaluatedExpression()
+					.setString(
+						/** @type {string} */ (param.string).replace(arg1Value, arg2Value)
+					)
+					.setSideEffects(param.couldHaveSideEffects())
+					.setRange(/** @type {Range} */ (expr.range));
+			});
+		for (const fn of ["substr", "substring", "slice"]) {
+			this.hooks.evaluateCallExpressionMember
+				.for(fn)
+				.tap(CLASS_NAME, (expr, param) => {
+					if (!param.isString()) return;
+					let arg1;
+					let result;
+					const str = /** @type {string} */ (param.string);
+					switch (expr.arguments.length) {
+						case 1:
+							if (expr.arguments[0].type === "SpreadElement") return;
+							arg1 = this.evaluateExpression(expr.arguments[0]);
+							if (!arg1.isNumber()) return;
+							result = str[
+								/** @type {"substr" | "substring" | "slice"} */ (fn)
+							](/** @type {number} */ (arg1.number));
+							break;
+						case 2: {
+							if (expr.arguments[0].type === "SpreadElement") return;
+							if (expr.arguments[1].type === "SpreadElement") return;
+							arg1 = this.evaluateExpression(expr.arguments[0]);
+							const arg2 = this.evaluateExpression(expr.arguments[1]);
+							if (!arg1.isNumber()) return;
+							if (!arg2.isNumber()) return;
+							result = str[
+								/** @type {"substr" | "substring" | "slice"} */ (fn)
+							](
+								/** @type {number} */ (arg1.number),
+								/** @type {number} */ (arg2.number)
+							);
+							break;
+						}
+						default:
+							return;
+					}
+					return new BasicEvaluatedExpression()
+						.setString(result)
+						.setSideEffects(param.couldHaveSideEffects())
+						.setRange(/** @type {Range} */ (expr.range));
+				});
+		}
+
+		/**
+		 * @param {"cooked" | "raw"} kind kind of values to get
+		 * @param {TemplateLiteral} templateLiteralExpr TemplateLiteral expr
+		 * @returns {{quasis: BasicEvaluatedExpression[], parts: BasicEvaluatedExpression[]}} Simplified template
+		 */
+		const getSimplifiedTemplateResult = (kind, templateLiteralExpr) => {
+			/** @type {BasicEvaluatedExpression[]} */
+			const quasis = [];
+			/** @type {BasicEvaluatedExpression[]} */
+			const parts = [];
+
+			for (let i = 0; i < templateLiteralExpr.quasis.length; i++) {
+				const quasiExpr = templateLiteralExpr.quasis[i];
+				const quasi = quasiExpr.value[kind];
+
+				if (i > 0) {
+					const prevExpr = parts[parts.length - 1];
+					const expr = this.evaluateExpression(
+						templateLiteralExpr.expressions[i - 1]
+					);
+					const exprAsString = expr.asString();
+					if (
+						typeof exprAsString === "string" &&
+						!expr.couldHaveSideEffects()
+					) {
+						// We can merge quasi + expr + quasi when expr
+						// is a const string
+
+						prevExpr.setString(prevExpr.string + exprAsString + quasi);
+						prevExpr.setRange([
+							/** @type {Range} */ (prevExpr.range)[0],
+							/** @type {Range} */ (quasiExpr.range)[1]
+						]);
+						// We unset the expression as it doesn't match to a single expression
+						prevExpr.setExpression(undefined);
+						continue;
+					}
+					parts.push(expr);
+				}
+
+				const part = new BasicEvaluatedExpression()
+					.setString(/** @type {string} */ (quasi))
+					.setRange(/** @type {Range} */ (quasiExpr.range))
+					.setExpression(quasiExpr);
+				quasis.push(part);
+				parts.push(part);
+			}
+			return {
+				quasis,
+				parts
+			};
+		};
+
+		this.hooks.evaluate.for("TemplateLiteral").tap(CLASS_NAME, _node => {
+			const node = /** @type {TemplateLiteral} */ (_node);
+
+			const { quasis, parts } = getSimplifiedTemplateResult("cooked", node);
+			if (parts.length === 1) {
+				return parts[0].setRange(/** @type {Range} */ (node.range));
+			}
+			return new BasicEvaluatedExpression()
+				.setTemplateString(quasis, parts, "cooked")
+				.setRange(/** @type {Range} */ (node.range));
+		});
+		this.hooks.evaluate
+			.for("TaggedTemplateExpression")
+			.tap(CLASS_NAME, _node => {
+				const node = /** @type {TaggedTemplateExpression} */ (_node);
+				const tag = this.evaluateExpression(node.tag);
+
+				if (tag.isIdentifier() && tag.identifier === "String.raw") {
+					const { quasis, parts } = getSimplifiedTemplateResult(
+						"raw",
+						node.quasi
+					);
+					return new BasicEvaluatedExpression()
+						.setTemplateString(quasis, parts, "raw")
+						.setRange(/** @type {Range} */ (node.range));
+				}
+			});
+
+		this.hooks.evaluateCallExpressionMember
+			.for("concat")
+			.tap(CLASS_NAME, (expr, param) => {
+				if (!param.isString() && !param.isWrapped()) return;
+				let stringSuffix = null;
+				let hasUnknownParams = false;
+				const innerExpressions = [];
+				for (let i = expr.arguments.length - 1; i >= 0; i--) {
+					const arg = expr.arguments[i];
+					if (arg.type === "SpreadElement") return;
+					const argExpr = this.evaluateExpression(arg);
+					if (
+						hasUnknownParams ||
+						(!argExpr.isString() && !argExpr.isNumber())
+					) {
+						hasUnknownParams = true;
+						innerExpressions.push(argExpr);
+						continue;
+					}
+
+					const value = argExpr.isString()
+						? /** @type {string} */ (argExpr.string)
+						: String(argExpr.number);
+
+					/** @type {string} */
+					const newString =
+						value +
+						(stringSuffix ? /** @type {string} */ (stringSuffix.string) : "");
+					const newRange = /** @type {Range} */ ([
+						/** @type {Range} */ (argExpr.range)[0],
+						/** @type {Range} */ ((stringSuffix || argExpr).range)[1]
+					]);
+					stringSuffix = new BasicEvaluatedExpression()
+						.setString(newString)
+						.setSideEffects(
+							(stringSuffix && stringSuffix.couldHaveSideEffects()) ||
+								argExpr.couldHaveSideEffects()
+						)
+						.setRange(newRange);
+				}
+
+				if (hasUnknownParams) {
+					const prefix = param.isString() ? param : param.prefix;
+					const inner =
+						param.isWrapped() && param.wrappedInnerExpressions
+							? param.wrappedInnerExpressions.concat(innerExpressions.reverse())
+							: innerExpressions.reverse();
+					return new BasicEvaluatedExpression()
+						.setWrapped(prefix, stringSuffix, inner)
+						.setRange(/** @type {Range} */ (expr.range));
+				} else if (param.isWrapped()) {
+					const postfix = stringSuffix || param.postfix;
+					const inner = param.wrappedInnerExpressions
+						? param.wrappedInnerExpressions.concat(innerExpressions.reverse())
+						: innerExpressions.reverse();
+					return new BasicEvaluatedExpression()
+						.setWrapped(param.prefix, postfix, inner)
+						.setRange(/** @type {Range} */ (expr.range));
+				}
+				const newString =
+					/** @type {string} */ (param.string) +
+					(stringSuffix ? stringSuffix.string : "");
+				return new BasicEvaluatedExpression()
+					.setString(newString)
+					.setSideEffects(
+						(stringSuffix && stringSuffix.couldHaveSideEffects()) ||
+							param.couldHaveSideEffects()
+					)
+					.setRange(/** @type {Range} */ (expr.range));
+			});
+		this.hooks.evaluateCallExpressionMember
+			.for("split")
+			.tap(CLASS_NAME, (expr, param) => {
+				if (!param.isString()) return;
+				if (expr.arguments.length !== 1) return;
+				if (expr.arguments[0].type === "SpreadElement") return;
+				let result;
+				const arg = this.evaluateExpression(expr.arguments[0]);
+				if (arg.isString()) {
+					result =
+						/** @type {string} */
+						(param.string).split(/** @type {string} */ (arg.string));
+				} else if (arg.isRegExp()) {
+					result = /** @type {string} */ (param.string).split(
+						/** @type {RegExp} */ (arg.regExp)
+					);
+				} else {
+					return;
+				}
+				return new BasicEvaluatedExpression()
+					.setArray(result)
+					.setSideEffects(param.couldHaveSideEffects())
+					.setRange(/** @type {Range} */ (expr.range));
+			});
+		this.hooks.evaluate.for("ConditionalExpression").tap(CLASS_NAME, _expr => {
+			const expr = /** @type {ConditionalExpression} */ (_expr);
+
+			const condition = this.evaluateExpression(expr.test);
+			const conditionValue = condition.asBool();
+			let res;
+			if (conditionValue === undefined) {
+				const consequent = this.evaluateExpression(expr.consequent);
+				const alternate = this.evaluateExpression(expr.alternate);
+				res = new BasicEvaluatedExpression();
+				if (consequent.isConditional()) {
+					res.setOptions(
+						/** @type {BasicEvaluatedExpression[]} */ (consequent.options)
+					);
+				} else {
+					res.setOptions([consequent]);
+				}
+				if (alternate.isConditional()) {
+					res.addOptions(
+						/** @type {BasicEvaluatedExpression[]} */ (alternate.options)
+					);
+				} else {
+					res.addOptions([alternate]);
+				}
+			} else {
+				res = this.evaluateExpression(
+					conditionValue ? expr.consequent : expr.alternate
+				);
+				if (condition.couldHaveSideEffects()) res.setSideEffects();
+			}
+			res.setRange(/** @type {Range} */ (expr.range));
+			return res;
+		});
+		this.hooks.evaluate.for("ArrayExpression").tap(CLASS_NAME, _expr => {
+			const expr = /** @type {ArrayExpression} */ (_expr);
+
+			const items = expr.elements.map(
+				element =>
+					element !== null &&
+					element.type !== "SpreadElement" &&
+					this.evaluateExpression(element)
+			);
+			if (!items.every(Boolean)) return;
+			return new BasicEvaluatedExpression()
+				.setItems(/** @type {BasicEvaluatedExpression[]} */ (items))
+				.setRange(/** @type {Range} */ (expr.range));
+		});
+		this.hooks.evaluate.for("ChainExpression").tap(CLASS_NAME, _expr => {
+			const expr = /** @type {ChainExpression} */ (_expr);
+			/** @type {Expression[]} */
+			const optionalExpressionsStack = [];
+			/** @type {Expression|Super} */
+			let next = expr.expression;
+
+			while (
+				next.type === "MemberExpression" ||
+				next.type === "CallExpression"
+			) {
+				if (next.type === "MemberExpression") {
+					if (next.optional) {
+						// SuperNode can not be optional
+						optionalExpressionsStack.push(
+							/** @type {Expression} */ (next.object)
+						);
+					}
+					next = next.object;
+				} else {
+					if (next.optional) {
+						// SuperNode can not be optional
+						optionalExpressionsStack.push(
+							/** @type {Expression} */ (next.callee)
+						);
+					}
+					next = next.callee;
+				}
+			}
+
+			while (optionalExpressionsStack.length > 0) {
+				const expression =
+					/** @type {Expression} */
+					(optionalExpressionsStack.pop());
+				const evaluated = this.evaluateExpression(expression);
+
+				if (evaluated.asNullish()) {
+					return evaluated.setRange(/** @type {Range} */ (_expr.range));
+				}
+			}
+			return this.evaluateExpression(expr.expression);
+		});
+	}
+
+	/**
+	 * @param {Expression} node node
+	 * @returns {Set | undefined} destructured identifiers
+	 */
+	destructuringAssignmentPropertiesFor(node) {
+		if (!this.destructuringAssignmentProperties) return;
+		return this.destructuringAssignmentProperties.get(node);
+	}
+
+	/**
+	 * @param {Expression | SpreadElement} expr expression
+	 * @returns {string | VariableInfo | undefined} identifier
+	 */
+	getRenameIdentifier(expr) {
+		const result = this.evaluateExpression(expr);
+		if (result.isIdentifier()) {
+			return result.identifier;
+		}
+	}
+
+	/**
+	 * @param {ClassExpression | ClassDeclaration | MaybeNamedClassDeclaration} classy a class node
+	 * @returns {void}
+	 */
+	walkClass(classy) {
+		if (
+			classy.superClass &&
+			!this.hooks.classExtendsExpression.call(classy.superClass, classy)
+		) {
+			this.walkExpression(classy.superClass);
+		}
+		if (classy.body && classy.body.type === "ClassBody") {
+			const scopeParams = [];
+			// Add class name in scope for recursive calls
+			if (classy.id) {
+				scopeParams.push(classy.id);
+			}
+			this.inClassScope(true, scopeParams, () => {
+				for (const classElement of /** @type {TODO} */ (classy.body.body)) {
+					if (!this.hooks.classBodyElement.call(classElement, classy)) {
+						if (classElement.computed && classElement.key) {
+							this.walkExpression(classElement.key);
+						}
+						if (classElement.value) {
+							if (
+								!this.hooks.classBodyValue.call(
+									classElement.value,
+									classElement,
+									classy
+								)
+							) {
+								const wasTopLevel = this.scope.topLevelScope;
+								this.scope.topLevelScope = false;
+								this.walkExpression(classElement.value);
+								this.scope.topLevelScope = wasTopLevel;
+							}
+						} else if (classElement.type === "StaticBlock") {
+							const wasTopLevel = this.scope.topLevelScope;
+							this.scope.topLevelScope = false;
+							this.walkBlockStatement(classElement);
+							this.scope.topLevelScope = wasTopLevel;
+						}
+					}
+				}
+			});
+		}
+	}
+
+	/**
+	 * Pre walking iterates the scope for variable declarations
+	 * @param {(Statement | ModuleDeclaration)[]} statements statements
+	 */
+	preWalkStatements(statements) {
+		for (let index = 0, len = statements.length; index < len; index++) {
+			const statement = statements[index];
+			this.preWalkStatement(statement);
+		}
+	}
+
+	/**
+	 * Block pre walking iterates the scope for block variable declarations
+	 * @param {(Statement | ModuleDeclaration)[]} statements statements
+	 */
+	blockPreWalkStatements(statements) {
+		for (let index = 0, len = statements.length; index < len; index++) {
+			const statement = statements[index];
+			this.blockPreWalkStatement(statement);
+		}
+	}
+
+	/**
+	 * Walking iterates the statements and expressions and processes them
+	 * @param {(Statement | ModuleDeclaration)[]} statements statements
+	 */
+	walkStatements(statements) {
+		let onlyFunctionDeclaration = false;
+
+		for (let index = 0, len = statements.length; index < len; index++) {
+			const statement = statements[index];
+
+			if (onlyFunctionDeclaration && statement.type !== "FunctionDeclaration")
+				continue;
+
+			this.walkStatement(statement);
+
+			if (this.scope.terminated) {
+				onlyFunctionDeclaration = true;
+			}
+		}
+	}
+
+	/**
+	 * Walking iterates the statements and expressions and processes them
+	 * @param {Statement | ModuleDeclaration | MaybeNamedClassDeclaration | MaybeNamedFunctionDeclaration} statement statement
+	 */
+	preWalkStatement(statement) {
+		/** @type {StatementPath} */
+		(this.statementPath).push(statement);
+		if (this.hooks.preStatement.call(statement)) {
+			this.prevStatement =
+				/** @type {StatementPath} */
+				(this.statementPath).pop();
+			return;
+		}
+		switch (statement.type) {
+			case "BlockStatement":
+				this.preWalkBlockStatement(statement);
+				break;
+			case "DoWhileStatement":
+				this.preWalkDoWhileStatement(statement);
+				break;
+			case "ForInStatement":
+				this.preWalkForInStatement(statement);
+				break;
+			case "ForOfStatement":
+				this.preWalkForOfStatement(statement);
+				break;
+			case "ForStatement":
+				this.preWalkForStatement(statement);
+				break;
+			case "FunctionDeclaration":
+				this.preWalkFunctionDeclaration(statement);
+				break;
+			case "IfStatement":
+				this.preWalkIfStatement(statement);
+				break;
+			case "LabeledStatement":
+				this.preWalkLabeledStatement(statement);
+				break;
+			case "SwitchStatement":
+				this.preWalkSwitchStatement(statement);
+				break;
+			case "TryStatement":
+				this.preWalkTryStatement(statement);
+				break;
+			case "VariableDeclaration":
+				this.preWalkVariableDeclaration(statement);
+				break;
+			case "WhileStatement":
+				this.preWalkWhileStatement(statement);
+				break;
+			case "WithStatement":
+				this.preWalkWithStatement(statement);
+				break;
+		}
+		this.prevStatement =
+			/** @type {StatementPath} */
+			(this.statementPath).pop();
+	}
+
+	/**
+	 * @param {Statement | ModuleDeclaration | MaybeNamedClassDeclaration | MaybeNamedFunctionDeclaration} statement statement
+	 */
+	blockPreWalkStatement(statement) {
+		/** @type {StatementPath} */
+		(this.statementPath).push(statement);
+		if (this.hooks.blockPreStatement.call(statement)) {
+			this.prevStatement =
+				/** @type {StatementPath} */
+				(this.statementPath).pop();
+			return;
+		}
+		switch (statement.type) {
+			case "ImportDeclaration":
+				this.blockPreWalkImportDeclaration(statement);
+				break;
+			case "ExportAllDeclaration":
+				this.blockPreWalkExportAllDeclaration(statement);
+				break;
+			case "ExportDefaultDeclaration":
+				this.blockPreWalkExportDefaultDeclaration(statement);
+				break;
+			case "ExportNamedDeclaration":
+				this.blockPreWalkExportNamedDeclaration(statement);
+				break;
+			case "VariableDeclaration":
+				this.blockPreWalkVariableDeclaration(statement);
+				break;
+			case "ClassDeclaration":
+				this.blockPreWalkClassDeclaration(statement);
+				break;
+			case "ExpressionStatement":
+				this.blockPreWalkExpressionStatement(statement);
+		}
+		this.prevStatement =
+			/** @type {StatementPath} */
+			(this.statementPath).pop();
+	}
+
+	/**
+	 * @param {Statement | ModuleDeclaration | MaybeNamedFunctionDeclaration | MaybeNamedClassDeclaration} statement statement
+	 */
+	walkStatement(statement) {
+		/** @type {StatementPath} */
+		(this.statementPath).push(statement);
+		if (this.hooks.statement.call(statement) !== undefined) {
+			this.prevStatement =
+				/** @type {StatementPath} */
+				(this.statementPath).pop();
+			return;
+		}
+		switch (statement.type) {
+			case "BlockStatement":
+				this.walkBlockStatement(statement);
+				break;
+			case "ClassDeclaration":
+				this.walkClassDeclaration(statement);
+				break;
+			case "DoWhileStatement":
+				this.walkDoWhileStatement(statement);
+				break;
+			case "ExportDefaultDeclaration":
+				this.walkExportDefaultDeclaration(statement);
+				break;
+			case "ExportNamedDeclaration":
+				this.walkExportNamedDeclaration(statement);
+				break;
+			case "ExpressionStatement":
+				this.walkExpressionStatement(statement);
+				break;
+			case "ForInStatement":
+				this.walkForInStatement(statement);
+				break;
+			case "ForOfStatement":
+				this.walkForOfStatement(statement);
+				break;
+			case "ForStatement":
+				this.walkForStatement(statement);
+				break;
+			case "FunctionDeclaration":
+				this.walkFunctionDeclaration(statement);
+				break;
+			case "IfStatement":
+				this.walkIfStatement(statement);
+				break;
+			case "LabeledStatement":
+				this.walkLabeledStatement(statement);
+				break;
+			case "ReturnStatement":
+				this.walkReturnStatement(statement);
+				break;
+			case "SwitchStatement":
+				this.walkSwitchStatement(statement);
+				break;
+			case "ThrowStatement":
+				this.walkThrowStatement(statement);
+				break;
+			case "TryStatement":
+				this.walkTryStatement(statement);
+				break;
+			case "VariableDeclaration":
+				this.walkVariableDeclaration(statement);
+				break;
+			case "WhileStatement":
+				this.walkWhileStatement(statement);
+				break;
+			case "WithStatement":
+				this.walkWithStatement(statement);
+				break;
+		}
+		this.prevStatement =
+			/** @type {StatementPath} */
+			(this.statementPath).pop();
+	}
+
+	/**
+	 * Walks a statements that is nested within a parent statement
+	 * and can potentially be a non-block statement.
+	 * This enforces the nested statement to never be in ASI position.
+	 * @param {Statement} statement the nested statement
+	 */
+	walkNestedStatement(statement) {
+		this.prevStatement = undefined;
+		this.walkStatement(statement);
+	}
+
+	// Real Statements
+	/**
+	 * @param {BlockStatement} statement block statement
+	 */
+	preWalkBlockStatement(statement) {
+		this.preWalkStatements(statement.body);
+	}
+
+	/**
+	 * @param {BlockStatement} statement block statement
+	 */
+	walkBlockStatement(statement) {
+		this.inBlockScope(() => {
+			const body = statement.body;
+			const prev = this.prevStatement;
+			this.blockPreWalkStatements(body);
+			this.prevStatement = prev;
+			this.walkStatements(body);
+		}, true);
+	}
+
+	/**
+	 * @param {ExpressionStatement} statement expression statement
+	 */
+	walkExpressionStatement(statement) {
+		this.walkExpression(statement.expression);
+	}
+
+	/**
+	 * @param {IfStatement} statement if statement
+	 */
+	preWalkIfStatement(statement) {
+		this.preWalkStatement(statement.consequent);
+		if (statement.alternate) {
+			this.preWalkStatement(statement.alternate);
+		}
+	}
+
+	/**
+	 * @param {IfStatement} statement if statement
+	 */
+	walkIfStatement(statement) {
+		const result = this.hooks.statementIf.call(statement);
+		if (result === undefined) {
+			this.walkExpression(statement.test);
+			this.walkNestedStatement(statement.consequent);
+
+			const consequentTerminated = this.scope.terminated;
+			this.scope.terminated = undefined;
+
+			if (statement.alternate) {
+				this.walkNestedStatement(statement.alternate);
+			}
+
+			const alternateTerminated = this.scope.terminated;
+
+			this.scope.terminated =
+				consequentTerminated && alternateTerminated
+					? alternateTerminated
+					: undefined;
+		} else if (result) {
+			this.walkNestedStatement(statement.consequent);
+		} else if (statement.alternate) {
+			this.walkNestedStatement(statement.alternate);
+		}
+	}
+
+	/**
+	 * @param {LabeledStatement} statement with statement
+	 */
+	preWalkLabeledStatement(statement) {
+		this.preWalkStatement(statement.body);
+	}
+
+	/**
+	 * @param {LabeledStatement} statement with statement
+	 */
+	walkLabeledStatement(statement) {
+		const hook = this.hooks.label.get(statement.label.name);
+		if (hook !== undefined) {
+			const result = hook.call(statement);
+			if (result === true) return;
+		}
+		this.inBlockScope(() => {
+			this.walkNestedStatement(statement.body);
+		});
+	}
+
+	/**
+	 * @param {WithStatement} statement with statement
+	 */
+	preWalkWithStatement(statement) {
+		this.preWalkStatement(statement.body);
+	}
+
+	/**
+	 * @param {WithStatement} statement with statement
+	 */
+	walkWithStatement(statement) {
+		this.inBlockScope(() => {
+			this.walkExpression(statement.object);
+			this.walkNestedStatement(statement.body);
+		});
+	}
+
+	/**
+	 * @param {SwitchStatement} statement switch statement
+	 */
+	preWalkSwitchStatement(statement) {
+		this.preWalkSwitchCases(statement.cases);
+	}
+
+	/**
+	 * @param {SwitchStatement} statement switch statement
+	 */
+	walkSwitchStatement(statement) {
+		this.walkExpression(statement.discriminant);
+		this.walkSwitchCases(statement.cases);
+	}
+
+	/**
+	 * @param {ReturnStatement | ThrowStatement} statement return or throw statement
+	 */
+	walkTerminatingStatement(statement) {
+		if (statement.argument) this.walkExpression(statement.argument);
+		// Skip top level scope because to handle `export` and `module.exports` after terminate
+		if (this.scope.topLevelScope === true) return;
+		if (this.hooks.terminate.call(statement)) {
+			this.scope.terminated =
+				statement.type === "ReturnStatement"
+					? SCOPE_INFO_TERMINATED_RETURN
+					: SCOPE_INFO_TERMINATED_THROW;
+		}
+	}
+
+	/**
+	 * @param {ReturnStatement} statement return statement
+	 */
+	walkReturnStatement(statement) {
+		this.walkTerminatingStatement(statement);
+	}
+
+	/**
+	 * @param {ThrowStatement} statement return statement
+	 */
+	walkThrowStatement(statement) {
+		this.walkTerminatingStatement(statement);
+	}
+
+	/**
+	 * @param {TryStatement} statement try statement
+	 */
+	preWalkTryStatement(statement) {
+		this.preWalkStatement(statement.block);
+		if (statement.handler) this.preWalkCatchClause(statement.handler);
+		if (statement.finalizer) this.preWalkStatement(statement.finalizer);
+	}
+
+	/**
+	 * @param {TryStatement} statement try statement
+	 */
+	walkTryStatement(statement) {
+		if (this.scope.inTry) {
+			this.walkStatement(statement.block);
+		} else {
+			this.scope.inTry = true;
+			this.walkStatement(statement.block);
+			this.scope.inTry = false;
+		}
+
+		const tryTerminated = this.scope.terminated;
+		this.scope.terminated = undefined;
+
+		if (statement.handler) this.walkCatchClause(statement.handler);
+
+		const handlerTerminated = this.scope.terminated;
+		this.scope.terminated = undefined;
+
+		if (statement.finalizer) {
+			this.walkStatement(statement.finalizer);
+		}
+
+		const finalizerTerminated = this.scope.terminated;
+		this.scope.terminated = undefined;
+
+		if (finalizerTerminated) {
+			this.scope.terminated = finalizerTerminated;
+		} else if (
+			tryTerminated &&
+			(statement.handler ? handlerTerminated : true)
+		) {
+			this.scope.terminated = handlerTerminated || tryTerminated;
+		}
+	}
+
+	/**
+	 * @param {WhileStatement} statement while statement
+	 */
+	preWalkWhileStatement(statement) {
+		this.preWalkStatement(statement.body);
+	}
+
+	/**
+	 * @param {WhileStatement} statement while statement
+	 */
+	walkWhileStatement(statement) {
+		this.inBlockScope(() => {
+			this.walkExpression(statement.test);
+			this.walkNestedStatement(statement.body);
+		});
+	}
+
+	/**
+	 * @param {DoWhileStatement} statement do while statement
+	 */
+	preWalkDoWhileStatement(statement) {
+		this.preWalkStatement(statement.body);
+	}
+
+	/**
+	 * @param {DoWhileStatement} statement do while statement
+	 */
+	walkDoWhileStatement(statement) {
+		this.inBlockScope(() => {
+			this.walkNestedStatement(statement.body);
+			this.walkExpression(statement.test);
+		});
+	}
+
+	/**
+	 * @param {ForStatement} statement for statement
+	 */
+	preWalkForStatement(statement) {
+		if (statement.init && statement.init.type === "VariableDeclaration") {
+			this.preWalkStatement(statement.init);
+		}
+		this.preWalkStatement(statement.body);
+	}
+
+	/**
+	 * @param {ForStatement} statement for statement
+	 */
+	walkForStatement(statement) {
+		this.inBlockScope(() => {
+			if (statement.init) {
+				if (statement.init.type === "VariableDeclaration") {
+					this.blockPreWalkVariableDeclaration(statement.init);
+					this.prevStatement = undefined;
+					this.walkStatement(statement.init);
+				} else {
+					this.walkExpression(statement.init);
+				}
+			}
+			if (statement.test) {
+				this.walkExpression(statement.test);
+			}
+			if (statement.update) {
+				this.walkExpression(statement.update);
+			}
+
+			const body = statement.body;
+
+			if (body.type === "BlockStatement") {
+				// no need to add additional scope
+				const prev = this.prevStatement;
+				this.blockPreWalkStatements(body.body);
+				this.prevStatement = prev;
+				this.walkStatements(body.body);
+			} else {
+				this.walkNestedStatement(body);
+			}
+		});
+	}
+
+	/**
+	 * @param {ForInStatement} statement for statement
+	 */
+	preWalkForInStatement(statement) {
+		if (statement.left.type === "VariableDeclaration") {
+			this.preWalkVariableDeclaration(statement.left);
+		}
+		this.preWalkStatement(statement.body);
+	}
+
+	/**
+	 * @param {ForInStatement} statement for statement
+	 */
+	walkForInStatement(statement) {
+		this.inBlockScope(() => {
+			if (statement.left.type === "VariableDeclaration") {
+				this.blockPreWalkVariableDeclaration(statement.left);
+				this.walkVariableDeclaration(statement.left);
+			} else {
+				this.walkPattern(statement.left);
+			}
+
+			this.walkExpression(statement.right);
+
+			const body = statement.body;
+
+			if (body.type === "BlockStatement") {
+				// no need to add additional scope
+				const prev = this.prevStatement;
+				this.blockPreWalkStatements(body.body);
+				this.prevStatement = prev;
+				this.walkStatements(body.body);
+			} else {
+				this.walkNestedStatement(body);
+			}
+		});
+	}
+
+	/**
+	 * @param {ForOfStatement} statement statement
+	 */
+	preWalkForOfStatement(statement) {
+		if (statement.await && this.scope.topLevelScope === true) {
+			this.hooks.topLevelAwait.call(statement);
+		}
+		if (statement.left.type === "VariableDeclaration") {
+			this.preWalkVariableDeclaration(statement.left);
+		}
+		this.preWalkStatement(statement.body);
+	}
+
+	/**
+	 * @param {ForOfStatement} statement for statement
+	 */
+	walkForOfStatement(statement) {
+		this.inBlockScope(() => {
+			if (statement.left.type === "VariableDeclaration") {
+				this.blockPreWalkVariableDeclaration(statement.left);
+				this.walkVariableDeclaration(statement.left);
+			} else {
+				this.walkPattern(statement.left);
+			}
+
+			this.walkExpression(statement.right);
+
+			const body = statement.body;
+
+			if (body.type === "BlockStatement") {
+				// no need to add additional scope
+				const prev = this.prevStatement;
+				this.blockPreWalkStatements(body.body);
+				this.prevStatement = prev;
+				this.walkStatements(body.body);
+			} else {
+				this.walkNestedStatement(body);
+			}
+		});
+	}
+
+	/**
+	 * @param {FunctionDeclaration | MaybeNamedFunctionDeclaration} statement function declaration
+	 */
+	preWalkFunctionDeclaration(statement) {
+		if (statement.id) {
+			this.defineVariable(statement.id.name);
+		}
+	}
+
+	/**
+	 * @param {FunctionDeclaration | MaybeNamedFunctionDeclaration} statement function declaration
+	 */
+	walkFunctionDeclaration(statement) {
+		const wasTopLevel = this.scope.topLevelScope;
+		this.scope.topLevelScope = false;
+		this.inFunctionScope(true, statement.params, () => {
+			for (const param of statement.params) {
+				this.walkPattern(param);
+			}
+
+			this.detectMode(statement.body.body);
+
+			const prev = this.prevStatement;
+
+			this.preWalkStatement(statement.body);
+			this.prevStatement = prev;
+			this.walkStatement(statement.body);
+		});
+		this.scope.topLevelScope = wasTopLevel;
+	}
+
+	/**
+	 * @param {ExpressionStatement} statement expression statement
+	 */
+	blockPreWalkExpressionStatement(statement) {
+		const expression = statement.expression;
+		switch (expression.type) {
+			case "AssignmentExpression":
+				this.preWalkAssignmentExpression(expression);
+		}
+	}
+
+	/**
+	 * @param {AssignmentExpression} expression assignment expression
+	 */
+	preWalkAssignmentExpression(expression) {
+		if (
+			expression.left.type !== "ObjectPattern" ||
+			!this.destructuringAssignmentProperties
+		)
+			return;
+		const keys = this._preWalkObjectPattern(expression.left);
+		if (!keys) return;
+
+		// check multiple assignments
+		if (this.destructuringAssignmentProperties.has(expression)) {
+			const set =
+				/** @type {Set} */
+				(this.destructuringAssignmentProperties.get(expression));
+			this.destructuringAssignmentProperties.delete(expression);
+			for (const id of set) keys.add(id);
+		}
+
+		this.destructuringAssignmentProperties.set(
+			expression.right.type === "AwaitExpression"
+				? expression.right.argument
+				: expression.right,
+			keys
+		);
+
+		if (expression.right.type === "AssignmentExpression") {
+			this.preWalkAssignmentExpression(expression.right);
+		}
+	}
+
+	/**
+	 * @param {ImportDeclaration} statement statement
+	 */
+	blockPreWalkImportDeclaration(statement) {
+		const source = /** @type {ImportSource} */ (statement.source.value);
+		this.hooks.import.call(statement, source);
+		for (const specifier of statement.specifiers) {
+			const name = specifier.local.name;
+			switch (specifier.type) {
+				case "ImportDefaultSpecifier":
+					if (
+						!this.hooks.importSpecifier.call(statement, source, "default", name)
+					) {
+						this.defineVariable(name);
+					}
+					break;
+				case "ImportSpecifier":
+					if (
+						!this.hooks.importSpecifier.call(
+							statement,
+							source,
+							/** @type {Identifier} */
+							(specifier.imported).name ||
+								/** @type {string} */
+								(
+									/** @type {Literal} */
+									(specifier.imported).value
+								),
+							name
+						)
+					) {
+						this.defineVariable(name);
+					}
+					break;
+				case "ImportNamespaceSpecifier":
+					if (!this.hooks.importSpecifier.call(statement, source, null, name)) {
+						this.defineVariable(name);
+					}
+					break;
+				default:
+					this.defineVariable(name);
+			}
+		}
+	}
+
+	/**
+	 * @param {Declaration} declaration declaration
+	 * @param {OnIdent} onIdent on ident callback
+	 */
+	enterDeclaration(declaration, onIdent) {
+		switch (declaration.type) {
+			case "VariableDeclaration":
+				for (const declarator of declaration.declarations) {
+					switch (declarator.type) {
+						case "VariableDeclarator": {
+							this.enterPattern(declarator.id, onIdent);
+							break;
+						}
+					}
+				}
+				break;
+			case "FunctionDeclaration":
+				this.enterPattern(declaration.id, onIdent);
+				break;
+			case "ClassDeclaration":
+				this.enterPattern(declaration.id, onIdent);
+				break;
+		}
+	}
+
+	/**
+	 * @param {ExportNamedDeclaration} statement statement
+	 */
+	blockPreWalkExportNamedDeclaration(statement) {
+		let source;
+		if (statement.source) {
+			source = /** @type {ImportSource} */ (statement.source.value);
+			this.hooks.exportImport.call(statement, source);
+		} else {
+			this.hooks.export.call(statement);
+		}
+		if (
+			statement.declaration &&
+			!this.hooks.exportDeclaration.call(statement, statement.declaration)
+		) {
+			const prev = this.prevStatement;
+			this.preWalkStatement(statement.declaration);
+			this.prevStatement = prev;
+			this.blockPreWalkStatement(statement.declaration);
+			let index = 0;
+			this.enterDeclaration(statement.declaration, def => {
+				this.hooks.exportSpecifier.call(statement, def, def, index++);
+			});
+		}
+		if (statement.specifiers) {
+			for (
+				let specifierIndex = 0;
+				specifierIndex < statement.specifiers.length;
+				specifierIndex++
+			) {
+				const specifier = statement.specifiers[specifierIndex];
+				switch (specifier.type) {
+					case "ExportSpecifier": {
+						const localName =
+							/** @type {Identifier} */ (specifier.local).name ||
+							/** @type {string} */ (
+								/** @type {Literal} */ (specifier.local).value
+							);
+						const name =
+							/** @type {Identifier} */
+							(specifier.exported).name ||
+							/** @type {string} */
+							(/** @type {Literal} */ (specifier.exported).value);
+						if (source) {
+							this.hooks.exportImportSpecifier.call(
+								statement,
+								source,
+								localName,
+								name,
+								specifierIndex
+							);
+						} else {
+							this.hooks.exportSpecifier.call(
+								statement,
+								localName,
+								name,
+								specifierIndex
+							);
+						}
+						break;
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * @param {ExportNamedDeclaration} statement the statement
+	 */
+	walkExportNamedDeclaration(statement) {
+		if (statement.declaration) {
+			this.walkStatement(statement.declaration);
+		}
+	}
+
+	/**
+	 * @param {ExportDefaultDeclaration} statement statement
+	 */
+	blockPreWalkExportDefaultDeclaration(statement) {
+		const prev = this.prevStatement;
+
+		this.preWalkStatement(/** @type {TODO} */ (statement.declaration));
+		this.prevStatement = prev;
+		this.blockPreWalkStatement(/** @type {TODO} */ (statement.declaration));
+
+		if (
+			/** @type {MaybeNamedFunctionDeclaration | MaybeNamedClassDeclaration} */
+			(statement.declaration).id &&
+			statement.declaration.type !== "FunctionExpression" &&
+			statement.declaration.type !== "ClassExpression"
+		) {
+			const declaration =
+				/** @type {MaybeNamedFunctionDeclaration | MaybeNamedClassDeclaration} */
+				(statement.declaration);
+
+			this.hooks.exportSpecifier.call(
+				statement,
+				/** @type {Identifier} */
+				(declaration.id).name,
+				"default",
+				undefined
+			);
+		}
+	}
+
+	/**
+	 * @param {ExportDefaultDeclaration} statement statement
+	 */
+	walkExportDefaultDeclaration(statement) {
+		this.hooks.export.call(statement);
+		if (
+			/** @type {FunctionDeclaration | ClassDeclaration} */
+			(statement.declaration).id &&
+			statement.declaration.type !== "FunctionExpression" &&
+			statement.declaration.type !== "ClassExpression"
+		) {
+			const declaration =
+				/** @type {FunctionDeclaration | ClassDeclaration} */
+				(statement.declaration);
+			if (!this.hooks.exportDeclaration.call(statement, declaration)) {
+				this.walkStatement(declaration);
+			}
+		} else {
+			// Acorn parses `export default function() {}` as `FunctionDeclaration` and
+			// `export default class {}` as `ClassDeclaration`, both with `id = null`.
+			// These nodes must be treated as expressions.
+			if (
+				statement.declaration.type === "FunctionDeclaration" ||
+				statement.declaration.type === "ClassDeclaration"
+			) {
+				this.walkStatement(statement.declaration);
+			} else {
+				this.walkExpression(statement.declaration);
+			}
+
+			if (!this.hooks.exportExpression.call(statement, statement.declaration)) {
+				this.hooks.exportSpecifier.call(
+					statement,
+					/** @type {TODO} */
+					(statement.declaration),
+					"default",
+					undefined
+				);
+			}
+		}
+	}
+
+	/**
+	 * @param {ExportAllDeclaration} statement statement
+	 */
+	blockPreWalkExportAllDeclaration(statement) {
+		const source = /** @type {ImportSource} */ (statement.source.value);
+		const name = statement.exported
+			? /** @type {Identifier} */
+				(statement.exported).name ||
+				/** @type {string} */
+				(/** @type {Literal} */ (statement.exported).value)
+			: null;
+		this.hooks.exportImport.call(statement, source);
+		this.hooks.exportImportSpecifier.call(statement, source, null, name, 0);
+	}
+
+	/**
+	 * @param {VariableDeclaration} statement variable declaration
+	 */
+	preWalkVariableDeclaration(statement) {
+		if (statement.kind !== "var") return;
+		this._preWalkVariableDeclaration(statement, this.hooks.varDeclarationVar);
+	}
+
+	/**
+	 * @param {VariableDeclaration} statement variable declaration
+	 */
+	blockPreWalkVariableDeclaration(statement) {
+		if (statement.kind === "var") return;
+		const hookMap =
+			statement.kind === "const"
+				? this.hooks.varDeclarationConst
+				: this.hooks.varDeclarationLet;
+		this._preWalkVariableDeclaration(statement, hookMap);
+	}
+
+	/**
+	 * @param {VariableDeclaration} statement variable declaration
+	 * @param {TODO} hookMap map of hooks
+	 */
+	_preWalkVariableDeclaration(statement, hookMap) {
+		for (const declarator of statement.declarations) {
+			switch (declarator.type) {
+				case "VariableDeclarator": {
+					this.preWalkVariableDeclarator(declarator);
+					if (!this.hooks.preDeclarator.call(declarator, statement)) {
+						this.enterPattern(declarator.id, (name, decl) => {
+							let hook = hookMap.get(name);
+							if (hook === undefined || !hook.call(decl)) {
+								hook = this.hooks.varDeclaration.get(name);
+								if (hook === undefined || !hook.call(decl)) {
+									this.defineVariable(name);
+								}
+							}
+						});
+					}
+					break;
+				}
+			}
+		}
+	}
+
+	/**
+	 * @param {ObjectPattern} objectPattern object pattern
+	 * @returns {Set | undefined} set of names or undefined if not all keys are identifiers
+	 */
+	_preWalkObjectPattern(objectPattern) {
+		/** @type {Set} */
+		const props = new Set();
+		const properties = objectPattern.properties;
+		for (let i = 0; i < properties.length; i++) {
+			const property = properties[i];
+			if (property.type !== "Property") return;
+			if (property.shorthand) {
+				if (property.value.type === "Identifier") {
+					this.scope.inShorthand = property.value.name;
+				} else if (
+					property.value.type === "AssignmentPattern" &&
+					property.value.left.type === "Identifier"
+				) {
+					this.scope.inShorthand = property.value.left.name;
+				}
+			}
+			const key = property.key;
+			if (key.type === "Identifier" && !property.computed) {
+				props.add({
+					id: key.name,
+					range: key.range,
+					shorthand: this.scope.inShorthand
+				});
+			} else {
+				const id = this.evaluateExpression(key);
+				const str = id.asString();
+				if (str) {
+					props.add({
+						id: str,
+						range: key.range,
+						shorthand: this.scope.inShorthand
+					});
+				} else {
+					// could not evaluate key
+					return;
+				}
+			}
+			this.scope.inShorthand = false;
+		}
+
+		return props;
+	}
+
+	/**
+	 * @param {VariableDeclarator} declarator variable declarator
+	 */
+	preWalkVariableDeclarator(declarator) {
+		if (
+			!declarator.init ||
+			declarator.id.type !== "ObjectPattern" ||
+			!this.destructuringAssignmentProperties
+		)
+			return;
+		const keys = this._preWalkObjectPattern(declarator.id);
+
+		if (!keys) return;
+		this.destructuringAssignmentProperties.set(
+			declarator.init.type === "AwaitExpression"
+				? declarator.init.argument
+				: declarator.init,
+			keys
+		);
+
+		if (declarator.init.type === "AssignmentExpression") {
+			this.preWalkAssignmentExpression(declarator.init);
+		}
+	}
+
+	/**
+	 * @param {VariableDeclaration} statement variable declaration
+	 */
+	walkVariableDeclaration(statement) {
+		for (const declarator of statement.declarations) {
+			switch (declarator.type) {
+				case "VariableDeclarator": {
+					const renameIdentifier =
+						declarator.init && this.getRenameIdentifier(declarator.init);
+					if (renameIdentifier && declarator.id.type === "Identifier") {
+						const hook = this.hooks.canRename.get(renameIdentifier);
+						if (
+							hook !== undefined &&
+							hook.call(/** @type {Expression} */ (declarator.init))
+						) {
+							// renaming with "var a = b;"
+							const hook = this.hooks.rename.get(renameIdentifier);
+							if (
+								hook === undefined ||
+								!hook.call(/** @type {Expression} */ (declarator.init))
+							) {
+								this.setVariable(declarator.id.name, renameIdentifier);
+							}
+							break;
+						}
+					}
+					if (!this.hooks.declarator.call(declarator, statement)) {
+						this.walkPattern(declarator.id);
+						if (declarator.init) this.walkExpression(declarator.init);
+					}
+					break;
+				}
+			}
+		}
+	}
+
+	/**
+	 * @param {ClassDeclaration | MaybeNamedClassDeclaration} statement class declaration
+	 */
+	blockPreWalkClassDeclaration(statement) {
+		if (statement.id) {
+			this.defineVariable(statement.id.name);
+		}
+	}
+
+	/**
+	 * @param {ClassDeclaration | MaybeNamedClassDeclaration} statement class declaration
+	 */
+	walkClassDeclaration(statement) {
+		this.walkClass(statement);
+	}
+
+	/**
+	 * @param {SwitchCase[]} switchCases switch statement
+	 */
+	preWalkSwitchCases(switchCases) {
+		for (let index = 0, len = switchCases.length; index < len; index++) {
+			const switchCase = switchCases[index];
+			this.preWalkStatements(switchCase.consequent);
+		}
+	}
+
+	/**
+	 * @param {SwitchCase[]} switchCases switch statement
+	 */
+	walkSwitchCases(switchCases) {
+		this.inBlockScope(() => {
+			const len = switchCases.length;
+
+			// we need to pre walk all statements first since we can have invalid code
+			// import A from "module";
+			// switch(1) {
+			//    case 1:
+			//      console.log(A); // should fail at runtime
+			//    case 2:
+			//      const A = 1;
+			// }
+			for (let index = 0; index < len; index++) {
+				const switchCase = switchCases[index];
+
+				if (switchCase.consequent.length > 0) {
+					const prev = this.prevStatement;
+					this.blockPreWalkStatements(switchCase.consequent);
+					this.prevStatement = prev;
+				}
+			}
+
+			for (let index = 0; index < len; index++) {
+				const switchCase = switchCases[index];
+
+				if (switchCase.test) {
+					this.walkExpression(switchCase.test);
+				}
+
+				if (switchCase.consequent.length > 0) {
+					this.walkStatements(switchCase.consequent);
+					this.scope.terminated = undefined;
+				}
+			}
+		});
+	}
+
+	/**
+	 * @param {CatchClause} catchClause catch clause
+	 */
+	preWalkCatchClause(catchClause) {
+		this.preWalkStatement(catchClause.body);
+	}
+
+	/**
+	 * @param {CatchClause} catchClause catch clause
+	 */
+	walkCatchClause(catchClause) {
+		this.inBlockScope(() => {
+			// Error binding is optional in catch clause since ECMAScript 2019
+			if (catchClause.param !== null) {
+				this.enterPattern(catchClause.param, ident => {
+					this.defineVariable(ident);
+				});
+				this.walkPattern(catchClause.param);
+			}
+			const prev = this.prevStatement;
+			this.blockPreWalkStatement(catchClause.body);
+			this.prevStatement = prev;
+			this.walkStatement(catchClause.body);
+		}, true);
+	}
+
+	/**
+	 * @param {Pattern} pattern pattern
+	 */
+	walkPattern(pattern) {
+		switch (pattern.type) {
+			case "ArrayPattern":
+				this.walkArrayPattern(pattern);
+				break;
+			case "AssignmentPattern":
+				this.walkAssignmentPattern(pattern);
+				break;
+			case "MemberExpression":
+				this.walkMemberExpression(pattern);
+				break;
+			case "ObjectPattern":
+				this.walkObjectPattern(pattern);
+				break;
+			case "RestElement":
+				this.walkRestElement(pattern);
+				break;
+		}
+	}
+
+	/**
+	 * @param {AssignmentPattern} pattern assignment pattern
+	 */
+	walkAssignmentPattern(pattern) {
+		this.walkExpression(pattern.right);
+		this.walkPattern(pattern.left);
+	}
+
+	/**
+	 * @param {ObjectPattern} pattern pattern
+	 */
+	walkObjectPattern(pattern) {
+		for (let i = 0, len = pattern.properties.length; i < len; i++) {
+			const prop = pattern.properties[i];
+			if (prop) {
+				if (prop.type === "RestElement") {
+					continue;
+				}
+				if (prop.computed) this.walkExpression(prop.key);
+				if (prop.value) this.walkPattern(prop.value);
+			}
+		}
+	}
+
+	/**
+	 * @param {ArrayPattern} pattern array pattern
+	 */
+	walkArrayPattern(pattern) {
+		for (let i = 0, len = pattern.elements.length; i < len; i++) {
+			const element = pattern.elements[i];
+			if (element) this.walkPattern(element);
+		}
+	}
+
+	/**
+	 * @param {RestElement} pattern rest element
+	 */
+	walkRestElement(pattern) {
+		this.walkPattern(pattern.argument);
+	}
+
+	/**
+	 * @param {(Expression | SpreadElement | null)[]} expressions expressions
+	 */
+	walkExpressions(expressions) {
+		for (const expression of expressions) {
+			if (expression) {
+				this.walkExpression(expression);
+			}
+		}
+	}
+
+	/**
+	 * @param {Expression | SpreadElement | PrivateIdentifier | Super} expression expression
+	 */
+	walkExpression(expression) {
+		switch (expression.type) {
+			case "ArrayExpression":
+				this.walkArrayExpression(expression);
+				break;
+			case "ArrowFunctionExpression":
+				this.walkArrowFunctionExpression(expression);
+				break;
+			case "AssignmentExpression":
+				this.walkAssignmentExpression(expression);
+				break;
+			case "AwaitExpression":
+				this.walkAwaitExpression(expression);
+				break;
+			case "BinaryExpression":
+				this.walkBinaryExpression(expression);
+				break;
+			case "CallExpression":
+				this.walkCallExpression(expression);
+				break;
+			case "ChainExpression":
+				this.walkChainExpression(expression);
+				break;
+			case "ClassExpression":
+				this.walkClassExpression(expression);
+				break;
+			case "ConditionalExpression":
+				this.walkConditionalExpression(expression);
+				break;
+			case "FunctionExpression":
+				this.walkFunctionExpression(expression);
+				break;
+			case "Identifier":
+				this.walkIdentifier(expression);
+				break;
+			case "ImportExpression":
+				this.walkImportExpression(expression);
+				break;
+			case "LogicalExpression":
+				this.walkLogicalExpression(expression);
+				break;
+			case "MetaProperty":
+				this.walkMetaProperty(expression);
+				break;
+			case "MemberExpression":
+				this.walkMemberExpression(expression);
+				break;
+			case "NewExpression":
+				this.walkNewExpression(expression);
+				break;
+			case "ObjectExpression":
+				this.walkObjectExpression(expression);
+				break;
+			case "SequenceExpression":
+				this.walkSequenceExpression(expression);
+				break;
+			case "SpreadElement":
+				this.walkSpreadElement(expression);
+				break;
+			case "TaggedTemplateExpression":
+				this.walkTaggedTemplateExpression(expression);
+				break;
+			case "TemplateLiteral":
+				this.walkTemplateLiteral(expression);
+				break;
+			case "ThisExpression":
+				this.walkThisExpression(expression);
+				break;
+			case "UnaryExpression":
+				this.walkUnaryExpression(expression);
+				break;
+			case "UpdateExpression":
+				this.walkUpdateExpression(expression);
+				break;
+			case "YieldExpression":
+				this.walkYieldExpression(expression);
+				break;
+		}
+	}
+
+	/**
+	 * @param {AwaitExpression} expression await expression
+	 */
+	walkAwaitExpression(expression) {
+		if (this.scope.topLevelScope === true)
+			this.hooks.topLevelAwait.call(expression);
+		this.walkExpression(expression.argument);
+	}
+
+	/**
+	 * @param {ArrayExpression} expression array expression
+	 */
+	walkArrayExpression(expression) {
+		if (expression.elements) {
+			this.walkExpressions(expression.elements);
+		}
+	}
+
+	/**
+	 * @param {SpreadElement} expression spread element
+	 */
+	walkSpreadElement(expression) {
+		if (expression.argument) {
+			this.walkExpression(expression.argument);
+		}
+	}
+
+	/**
+	 * @param {ObjectExpression} expression object expression
+	 */
+	walkObjectExpression(expression) {
+		for (
+			let propIndex = 0, len = expression.properties.length;
+			propIndex < len;
+			propIndex++
+		) {
+			const prop = expression.properties[propIndex];
+			this.walkProperty(prop);
+		}
+	}
+
+	/**
+	 * @param {Property | SpreadElement} prop property or spread element
+	 */
+	walkProperty(prop) {
+		if (prop.type === "SpreadElement") {
+			this.walkExpression(prop.argument);
+			return;
+		}
+		if (prop.computed) {
+			this.walkExpression(prop.key);
+		}
+		if (prop.shorthand && prop.value && prop.value.type === "Identifier") {
+			this.scope.inShorthand = prop.value.name;
+			this.walkIdentifier(prop.value);
+			this.scope.inShorthand = false;
+		} else {
+			this.walkExpression(
+				/** @type {Exclude} */
+				(prop.value)
+			);
+		}
+	}
+
+	/**
+	 * @param {FunctionExpression} expression arrow function expression
+	 */
+	walkFunctionExpression(expression) {
+		const wasTopLevel = this.scope.topLevelScope;
+		this.scope.topLevelScope = false;
+		const scopeParams = [...expression.params];
+
+		// Add function name in scope for recursive calls
+		if (expression.id) {
+			scopeParams.push(expression.id);
+		}
+
+		this.inFunctionScope(true, scopeParams, () => {
+			for (const param of expression.params) {
+				this.walkPattern(param);
+			}
+
+			this.detectMode(expression.body.body);
+
+			const prev = this.prevStatement;
+
+			this.preWalkStatement(expression.body);
+			this.prevStatement = prev;
+			this.walkStatement(expression.body);
+		});
+		this.scope.topLevelScope = wasTopLevel;
+	}
+
+	/**
+	 * @param {ArrowFunctionExpression} expression arrow function expression
+	 */
+	walkArrowFunctionExpression(expression) {
+		const wasTopLevel = this.scope.topLevelScope;
+		this.scope.topLevelScope = wasTopLevel ? "arrow" : false;
+		this.inFunctionScope(false, expression.params, () => {
+			for (const param of expression.params) {
+				this.walkPattern(param);
+			}
+			if (expression.body.type === "BlockStatement") {
+				this.detectMode(expression.body.body);
+				const prev = this.prevStatement;
+				this.preWalkStatement(expression.body);
+				this.prevStatement = prev;
+				this.walkStatement(expression.body);
+			} else {
+				this.walkExpression(expression.body);
+			}
+		});
+		this.scope.topLevelScope = wasTopLevel;
+	}
+
+	/**
+	 * @param {SequenceExpression} expression the sequence
+	 */
+	walkSequenceExpression(expression) {
+		if (!expression.expressions) return;
+		// We treat sequence expressions like statements when they are one statement level
+		// This has some benefits for optimizations that only work on statement level
+		const currentStatement =
+			/** @type {StatementPath} */
+			(this.statementPath)[
+				/** @type {StatementPath} */
+				(this.statementPath).length - 1
+			];
+		if (
+			currentStatement === expression ||
+			(currentStatement.type === "ExpressionStatement" &&
+				currentStatement.expression === expression)
+		) {
+			const old =
+				/** @type {StatementPathItem} */
+				(/** @type {StatementPath} */ (this.statementPath).pop());
+			const prev = this.prevStatement;
+			for (const expr of expression.expressions) {
+				/** @type {StatementPath} */
+				(this.statementPath).push(expr);
+				this.walkExpression(expr);
+				this.prevStatement =
+					/** @type {StatementPath} */
+					(this.statementPath).pop();
+			}
+			this.prevStatement = prev;
+			/** @type {StatementPath} */
+			(this.statementPath).push(old);
+		} else {
+			this.walkExpressions(expression.expressions);
+		}
+	}
+
+	/**
+	 * @param {UpdateExpression} expression the update expression
+	 */
+	walkUpdateExpression(expression) {
+		this.walkExpression(expression.argument);
+	}
+
+	/**
+	 * @param {UnaryExpression} expression the unary expression
+	 */
+	walkUnaryExpression(expression) {
+		if (expression.operator === "typeof") {
+			const result = this.callHooksForExpression(
+				this.hooks.typeof,
+				expression.argument,
+				expression
+			);
+			if (result === true) return;
+			if (expression.argument.type === "ChainExpression") {
+				const result = this.callHooksForExpression(
+					this.hooks.typeof,
+					expression.argument.expression,
+					expression
+				);
+				if (result === true) return;
+			}
+		}
+		this.walkExpression(expression.argument);
+	}
+
+	/**
+	 * @param {LogicalExpression | BinaryExpression} expression the expression
+	 */
+	walkLeftRightExpression(expression) {
+		this.walkExpression(expression.left);
+		this.walkExpression(expression.right);
+	}
+
+	/**
+	 * @param {BinaryExpression} expression the binary expression
+	 */
+	walkBinaryExpression(expression) {
+		if (this.hooks.binaryExpression.call(expression) === undefined) {
+			this.walkLeftRightExpression(expression);
+		}
+	}
+
+	/**
+	 * @param {LogicalExpression} expression the logical expression
+	 */
+	walkLogicalExpression(expression) {
+		const result = this.hooks.expressionLogicalOperator.call(expression);
+		if (result === undefined) {
+			this.walkLeftRightExpression(expression);
+		} else if (result) {
+			this.walkExpression(expression.right);
+		}
+	}
+
+	/**
+	 * @param {AssignmentExpression} expression assignment expression
+	 */
+	walkAssignmentExpression(expression) {
+		if (expression.left.type === "Identifier") {
+			const renameIdentifier = this.getRenameIdentifier(expression.right);
+			if (
+				renameIdentifier &&
+				this.callHooksForInfo(
+					this.hooks.canRename,
+					renameIdentifier,
+					expression.right
+				)
+			) {
+				// renaming "a = b;"
+				if (
+					!this.callHooksForInfo(
+						this.hooks.rename,
+						renameIdentifier,
+						expression.right
+					)
+				) {
+					this.setVariable(
+						expression.left.name,
+						typeof renameIdentifier === "string"
+							? this.getVariableInfo(renameIdentifier)
+							: renameIdentifier
+					);
+				}
+				return;
+			}
+			this.walkExpression(expression.right);
+			this.enterPattern(expression.left, (name, decl) => {
+				if (!this.callHooksForName(this.hooks.assign, name, expression)) {
+					this.walkExpression(
+						/** @type {MemberExpression} */
+						(expression.left)
+					);
+				}
+			});
+		} else if (expression.left.type.endsWith("Pattern")) {
+			this.walkExpression(expression.right);
+			this.enterPattern(expression.left, (name, decl) => {
+				if (!this.callHooksForName(this.hooks.assign, name, expression)) {
+					this.defineVariable(name);
+				}
+			});
+			this.walkPattern(expression.left);
+		} else if (expression.left.type === "MemberExpression") {
+			const exprName = this.getMemberExpressionInfo(
+				expression.left,
+				ALLOWED_MEMBER_TYPES_EXPRESSION
+			);
+			if (
+				exprName &&
+				this.callHooksForInfo(
+					this.hooks.assignMemberChain,
+					exprName.rootInfo,
+					expression,
+					exprName.getMembers()
+				)
+			) {
+				return;
+			}
+			this.walkExpression(expression.right);
+			this.walkExpression(expression.left);
+		} else {
+			this.walkExpression(expression.right);
+			this.walkExpression(
+				/** @type {Exclude} */
+				(expression.left)
+			);
+		}
+	}
+
+	/**
+	 * @param {ConditionalExpression} expression conditional expression
+	 */
+	walkConditionalExpression(expression) {
+		const result = this.hooks.expressionConditionalOperator.call(expression);
+		if (result === undefined) {
+			this.walkExpression(expression.test);
+			this.walkExpression(expression.consequent);
+
+			if (expression.alternate) {
+				this.walkExpression(expression.alternate);
+			}
+		} else if (result) {
+			this.walkExpression(expression.consequent);
+		} else if (expression.alternate) {
+			this.walkExpression(expression.alternate);
+		}
+	}
+
+	/**
+	 * @param {NewExpression} expression new expression
+	 */
+	walkNewExpression(expression) {
+		const result = this.callHooksForExpression(
+			this.hooks.new,
+			expression.callee,
+			expression
+		);
+		if (result === true) return;
+		this.walkExpression(expression.callee);
+		if (expression.arguments) {
+			this.walkExpressions(expression.arguments);
+		}
+	}
+
+	/**
+	 * @param {YieldExpression} expression yield expression
+	 */
+	walkYieldExpression(expression) {
+		if (expression.argument) {
+			this.walkExpression(expression.argument);
+		}
+	}
+
+	/**
+	 * @param {TemplateLiteral} expression template literal
+	 */
+	walkTemplateLiteral(expression) {
+		if (expression.expressions) {
+			this.walkExpressions(expression.expressions);
+		}
+	}
+
+	/**
+	 * @param {TaggedTemplateExpression} expression tagged template expression
+	 */
+	walkTaggedTemplateExpression(expression) {
+		if (expression.tag) {
+			this.scope.inTaggedTemplateTag = true;
+			this.walkExpression(expression.tag);
+			this.scope.inTaggedTemplateTag = false;
+		}
+		if (expression.quasi && expression.quasi.expressions) {
+			this.walkExpressions(expression.quasi.expressions);
+		}
+	}
+
+	/**
+	 * @param {ClassExpression} expression the class expression
+	 */
+	walkClassExpression(expression) {
+		this.walkClass(expression);
+	}
+
+	/**
+	 * @param {ChainExpression} expression expression
+	 */
+	walkChainExpression(expression) {
+		const result = this.hooks.optionalChaining.call(expression);
+
+		if (result === undefined) {
+			if (expression.expression.type === "CallExpression") {
+				this.walkCallExpression(expression.expression);
+			} else {
+				this.walkMemberExpression(expression.expression);
+			}
+		}
+	}
+
+	/**
+	 * @private
+	 * @param {FunctionExpression | ArrowFunctionExpression} functionExpression function expression
+	 * @param {(Expression | SpreadElement)[]} options options
+	 * @param {Expression | SpreadElement | null} currentThis current this
+	 */
+	_walkIIFE(functionExpression, options, currentThis) {
+		/**
+		 * @param {Expression | SpreadElement} argOrThis arg or this
+		 * @returns {string | VariableInfo | undefined} var info
+		 */
+		const getVarInfo = argOrThis => {
+			const renameIdentifier = this.getRenameIdentifier(argOrThis);
+			if (
+				renameIdentifier &&
+				this.callHooksForInfo(
+					this.hooks.canRename,
+					renameIdentifier,
+					/** @type {Expression} */
+					(argOrThis)
+				) &&
+				!this.callHooksForInfo(
+					this.hooks.rename,
+					renameIdentifier,
+					/** @type {Expression} */
+					(argOrThis)
+				)
+			) {
+				return typeof renameIdentifier === "string"
+					? /** @type {string} */ (this.getVariableInfo(renameIdentifier))
+					: renameIdentifier;
+			}
+			this.walkExpression(argOrThis);
+		};
+		const { params, type } = functionExpression;
+		const arrow = type === "ArrowFunctionExpression";
+		const renameThis = currentThis ? getVarInfo(currentThis) : null;
+		const varInfoForArgs = options.map(getVarInfo);
+		const wasTopLevel = this.scope.topLevelScope;
+		this.scope.topLevelScope = wasTopLevel && arrow ? "arrow" : false;
+		const scopeParams =
+			/** @type {(Identifier | string)[]} */
+			(params.filter((identifier, idx) => !varInfoForArgs[idx]));
+
+		// Add function name in scope for recursive calls
+		if (
+			functionExpression.type === "FunctionExpression" &&
+			functionExpression.id
+		) {
+			scopeParams.push(functionExpression.id.name);
+		}
+
+		this.inFunctionScope(true, scopeParams, () => {
+			if (renameThis && !arrow) {
+				this.setVariable("this", renameThis);
+			}
+			for (let i = 0; i < varInfoForArgs.length; i++) {
+				const varInfo = varInfoForArgs[i];
+				if (!varInfo) continue;
+				if (!params[i] || params[i].type !== "Identifier") continue;
+				this.setVariable(/** @type {Identifier} */ (params[i]).name, varInfo);
+			}
+			if (functionExpression.body.type === "BlockStatement") {
+				this.detectMode(functionExpression.body.body);
+				const prev = this.prevStatement;
+				this.preWalkStatement(functionExpression.body);
+				this.prevStatement = prev;
+				this.walkStatement(functionExpression.body);
+			} else {
+				this.walkExpression(functionExpression.body);
+			}
+		});
+		this.scope.topLevelScope = wasTopLevel;
+	}
+
+	/**
+	 * @param {ImportExpression} expression import expression
+	 */
+	walkImportExpression(expression) {
+		const result = this.hooks.importCall.call(expression);
+		if (result === true) return;
+
+		this.walkExpression(expression.source);
+	}
+
+	/**
+	 * @param {CallExpression} expression expression
+	 */
+	walkCallExpression(expression) {
+		/**
+		 * @param {FunctionExpression | ArrowFunctionExpression} fn function
+		 * @returns {boolean} true when simple function
+		 */
+		const isSimpleFunction = fn =>
+			fn.params.every(p => p.type === "Identifier");
+		if (
+			expression.callee.type === "MemberExpression" &&
+			expression.callee.object.type.endsWith("FunctionExpression") &&
+			!expression.callee.computed &&
+			/** @type {boolean} */
+			(
+				/** @type {Identifier} */
+				(expression.callee.property).name === "call" ||
+					/** @type {Identifier} */
+					(expression.callee.property).name === "bind"
+			) &&
+			expression.arguments.length > 0 &&
+			isSimpleFunction(
+				/** @type {FunctionExpression | ArrowFunctionExpression} */
+				(expression.callee.object)
+			)
+		) {
+			// (function(…) { }.call/bind(?, …))
+			this._walkIIFE(
+				/** @type {FunctionExpression | ArrowFunctionExpression} */
+				(expression.callee.object),
+				expression.arguments.slice(1),
+				expression.arguments[0]
+			);
+		} else if (
+			expression.callee.type.endsWith("FunctionExpression") &&
+			isSimpleFunction(
+				/** @type {FunctionExpression | ArrowFunctionExpression} */
+				(expression.callee)
+			)
+		) {
+			// (function(…) { }(…))
+			this._walkIIFE(
+				/** @type {FunctionExpression | ArrowFunctionExpression} */
+				(expression.callee),
+				expression.arguments,
+				null
+			);
+		} else {
+			if (expression.callee.type === "MemberExpression") {
+				const exprInfo = this.getMemberExpressionInfo(
+					expression.callee,
+					ALLOWED_MEMBER_TYPES_CALL_EXPRESSION
+				);
+				if (exprInfo && exprInfo.type === "call") {
+					const result = this.callHooksForInfo(
+						this.hooks.callMemberChainOfCallMemberChain,
+						exprInfo.rootInfo,
+						expression,
+						exprInfo.getCalleeMembers(),
+						exprInfo.call,
+						exprInfo.getMembers(),
+						exprInfo.getMemberRanges()
+					);
+					if (result === true) return;
+				}
+			}
+			const callee = this.evaluateExpression(expression.callee);
+			if (callee.isIdentifier()) {
+				const result1 = this.callHooksForInfo(
+					this.hooks.callMemberChain,
+					/** @type {NonNullable} */
+					(callee.rootInfo),
+					expression,
+					/** @type {NonNullable} */
+					(callee.getMembers)(),
+					callee.getMembersOptionals
+						? callee.getMembersOptionals()
+						: /** @type {NonNullable} */
+							(callee.getMembers)().map(() => false),
+					callee.getMemberRanges ? callee.getMemberRanges() : []
+				);
+				if (result1 === true) return;
+				const result2 = this.callHooksForInfo(
+					this.hooks.call,
+					/** @type {NonNullable} */
+					(callee.identifier),
+					expression
+				);
+				if (result2 === true) return;
+			}
+
+			if (expression.callee) {
+				if (expression.callee.type === "MemberExpression") {
+					// because of call context we need to walk the call context as expression
+					this.walkExpression(expression.callee.object);
+					if (expression.callee.computed === true)
+						this.walkExpression(expression.callee.property);
+				} else {
+					this.walkExpression(expression.callee);
+				}
+			}
+			if (expression.arguments) this.walkExpressions(expression.arguments);
+		}
+	}
+
+	/**
+	 * @param {MemberExpression} expression member expression
+	 */
+	walkMemberExpression(expression) {
+		const exprInfo = this.getMemberExpressionInfo(
+			expression,
+			ALLOWED_MEMBER_TYPES_ALL
+		);
+		if (exprInfo) {
+			switch (exprInfo.type) {
+				case "expression": {
+					const result1 = this.callHooksForInfo(
+						this.hooks.expression,
+						exprInfo.name,
+						expression
+					);
+					if (result1 === true) return;
+					const members = exprInfo.getMembers();
+					const membersOptionals = exprInfo.getMembersOptionals();
+					const memberRanges = exprInfo.getMemberRanges();
+					const result2 = this.callHooksForInfo(
+						this.hooks.expressionMemberChain,
+						exprInfo.rootInfo,
+						expression,
+						members,
+						membersOptionals,
+						memberRanges
+					);
+					if (result2 === true) return;
+					this.walkMemberExpressionWithExpressionName(
+						expression,
+						exprInfo.name,
+						exprInfo.rootInfo,
+						members.slice(),
+						() =>
+							this.callHooksForInfo(
+								this.hooks.unhandledExpressionMemberChain,
+								exprInfo.rootInfo,
+								expression,
+								members
+							)
+					);
+					return;
+				}
+				case "call": {
+					const result = this.callHooksForInfo(
+						this.hooks.memberChainOfCallMemberChain,
+						exprInfo.rootInfo,
+						expression,
+						exprInfo.getCalleeMembers(),
+						exprInfo.call,
+						exprInfo.getMembers(),
+						exprInfo.getMemberRanges()
+					);
+					if (result === true) return;
+					// Fast skip over the member chain as we already called memberChainOfCallMemberChain
+					// and call computed property are literals anyway
+					this.walkExpression(exprInfo.call);
+					return;
+				}
+			}
+		}
+		this.walkExpression(expression.object);
+		if (expression.computed === true) this.walkExpression(expression.property);
+	}
+
+	/**
+	 * @template R
+	 * @param {MemberExpression} expression member expression
+	 * @param {string} name name
+	 * @param {string | VariableInfo} rootInfo root info
+	 * @param {string[]} members members
+	 * @param {() => R | undefined} onUnhandled on unhandled callback
+	 */
+	walkMemberExpressionWithExpressionName(
+		expression,
+		name,
+		rootInfo,
+		members,
+		onUnhandled
+	) {
+		if (expression.object.type === "MemberExpression") {
+			// optimize the case where expression.object is a MemberExpression too.
+			// we can keep info here when calling walkMemberExpression directly
+			const property =
+				/** @type {Identifier} */
+				(expression.property).name ||
+				`${/** @type {Literal} */ (expression.property).value}`;
+			name = name.slice(0, -property.length - 1);
+			members.pop();
+			const result = this.callHooksForInfo(
+				this.hooks.expression,
+				name,
+				expression.object
+			);
+			if (result === true) return;
+			this.walkMemberExpressionWithExpressionName(
+				expression.object,
+				name,
+				rootInfo,
+				members,
+				onUnhandled
+			);
+		} else if (!onUnhandled || !onUnhandled()) {
+			this.walkExpression(expression.object);
+		}
+		if (expression.computed === true) this.walkExpression(expression.property);
+	}
+
+	/**
+	 * @param {ThisExpression} expression this expression
+	 */
+	walkThisExpression(expression) {
+		this.callHooksForName(this.hooks.expression, "this", expression);
+	}
+
+	/**
+	 * @param {Identifier} expression identifier
+	 */
+	walkIdentifier(expression) {
+		this.callHooksForName(this.hooks.expression, expression.name, expression);
+	}
+
+	/**
+	 * @param {MetaProperty} metaProperty meta property
+	 */
+	walkMetaProperty(metaProperty) {
+		this.hooks.expression.for(getRootName(metaProperty)).call(metaProperty);
+	}
+
+	/**
+	 * @template T
+	 * @template R
+	 * @param {HookMap>} hookMap hooks the should be called
+	 * @param {Expression | Super} expr expression
+	 * @param {AsArray} args args for the hook
+	 * @returns {R | undefined} result of hook
+	 */
+	callHooksForExpression(hookMap, expr, ...args) {
+		return this.callHooksForExpressionWithFallback(
+			hookMap,
+			expr,
+			undefined,
+			undefined,
+			...args
+		);
+	}
+
+	/**
+	 * @template T
+	 * @template R
+	 * @param {HookMap>} hookMap hooks the should be called
+	 * @param {Expression | Super} expr expression info
+	 * @param {((name: string, rootInfo: string | ScopeInfo | VariableInfo, getMembers: () => string[]) => TODO) | undefined} fallback callback when variable in not handled by hooks
+	 * @param {((result?: string) => R | undefined) | undefined} defined callback when variable is defined
+	 * @param {AsArray} args args for the hook
+	 * @returns {R | undefined} result of hook
+	 */
+	callHooksForExpressionWithFallback(
+		hookMap,
+		expr,
+		fallback,
+		defined,
+		...args
+	) {
+		const exprName = this.getMemberExpressionInfo(
+			expr,
+			ALLOWED_MEMBER_TYPES_EXPRESSION
+		);
+		if (exprName !== undefined) {
+			const members = exprName.getMembers();
+			return this.callHooksForInfoWithFallback(
+				hookMap,
+				members.length === 0 ? exprName.rootInfo : exprName.name,
+				fallback &&
+					(name => fallback(name, exprName.rootInfo, exprName.getMembers)),
+				defined && (() => defined(exprName.name)),
+				...args
+			);
+		}
+	}
+
+	/**
+	 * @template T
+	 * @template R
+	 * @param {HookMap>} hookMap hooks the should be called
+	 * @param {string} name key in map
+	 * @param {AsArray} args args for the hook
+	 * @returns {R | undefined} result of hook
+	 */
+	callHooksForName(hookMap, name, ...args) {
+		return this.callHooksForNameWithFallback(
+			hookMap,
+			name,
+			undefined,
+			undefined,
+			...args
+		);
+	}
+
+	/**
+	 * @template T
+	 * @template R
+	 * @param {HookMap>} hookMap hooks that should be called
+	 * @param {ExportedVariableInfo} info variable info
+	 * @param {AsArray} args args for the hook
+	 * @returns {R | undefined} result of hook
+	 */
+	callHooksForInfo(hookMap, info, ...args) {
+		return this.callHooksForInfoWithFallback(
+			hookMap,
+			info,
+			undefined,
+			undefined,
+			...args
+		);
+	}
+
+	/**
+	 * @template T
+	 * @template R
+	 * @param {HookMap>} hookMap hooks the should be called
+	 * @param {ExportedVariableInfo} info variable info
+	 * @param {((name: string) => TODO) | undefined} fallback callback when variable in not handled by hooks
+	 * @param {((result?: string) => TODO) | undefined} defined callback when variable is defined
+	 * @param {AsArray} args args for the hook
+	 * @returns {R | undefined} result of hook
+	 */
+	callHooksForInfoWithFallback(hookMap, info, fallback, defined, ...args) {
+		let name;
+		if (typeof info === "string") {
+			name = info;
+		} else {
+			if (!(info instanceof VariableInfo)) {
+				if (defined !== undefined) {
+					return defined();
+				}
+				return;
+			}
+			let tagInfo = info.tagInfo;
+			while (tagInfo !== undefined) {
+				const hook = hookMap.get(tagInfo.tag);
+				if (hook !== undefined) {
+					this.currentTagData = tagInfo.data;
+					const result = hook.call(...args);
+					this.currentTagData = undefined;
+					if (result !== undefined) return result;
+				}
+				tagInfo = tagInfo.next;
+			}
+			if (info.freeName === true) {
+				if (defined !== undefined) {
+					return defined();
+				}
+				return;
+			}
+			name = info.freeName;
+		}
+		const hook = hookMap.get(name);
+		if (hook !== undefined) {
+			const result = hook.call(...args);
+			if (result !== undefined) return result;
+		}
+		if (fallback !== undefined) {
+			return fallback(/** @type {string} */ (name));
+		}
+	}
+
+	/**
+	 * @template T
+	 * @template R
+	 * @param {HookMap>} hookMap hooks the should be called
+	 * @param {string} name key in map
+	 * @param {((value: string) => R | undefined) | undefined} fallback callback when variable in not handled by hooks
+	 * @param {(() => R) | undefined} defined callback when variable is defined
+	 * @param {AsArray} args args for the hook
+	 * @returns {R | undefined} result of hook
+	 */
+	callHooksForNameWithFallback(hookMap, name, fallback, defined, ...args) {
+		return this.callHooksForInfoWithFallback(
+			hookMap,
+			this.getVariableInfo(name),
+			fallback,
+			defined,
+			...args
+		);
+	}
+
+	/**
+	 * @deprecated
+	 * @param {(string | Pattern | Property)[]} params scope params
+	 * @param {() => void} fn inner function
+	 * @returns {void}
+	 */
+	inScope(params, fn) {
+		const oldScope = this.scope;
+		this.scope = {
+			topLevelScope: oldScope.topLevelScope,
+			inTry: false,
+			inShorthand: false,
+			inTaggedTemplateTag: false,
+			isStrict: oldScope.isStrict,
+			isAsmJs: oldScope.isAsmJs,
+			terminated: undefined,
+			definitions: oldScope.definitions.createChild()
+		};
+
+		this.undefineVariable("this");
+
+		this.enterPatterns(params, ident => {
+			this.defineVariable(ident);
+		});
+
+		fn();
+
+		this.scope = oldScope;
+	}
+
+	/**
+	 * @param {boolean} hasThis true, when this is defined
+	 * @param {Identifier[]} params scope params
+	 * @param {() => void} fn inner function
+	 * @returns {void}
+	 */
+	inClassScope(hasThis, params, fn) {
+		const oldScope = this.scope;
+		this.scope = {
+			topLevelScope: oldScope.topLevelScope,
+			inTry: false,
+			inShorthand: false,
+			inTaggedTemplateTag: false,
+			isStrict: oldScope.isStrict,
+			isAsmJs: oldScope.isAsmJs,
+			terminated: undefined,
+			definitions: oldScope.definitions.createChild()
+		};
+
+		if (hasThis) {
+			this.undefineVariable("this");
+		}
+
+		this.enterPatterns(params, ident => {
+			this.defineVariable(ident);
+		});
+
+		fn();
+
+		this.scope = oldScope;
+	}
+
+	/**
+	 * @param {boolean} hasThis true, when this is defined
+	 * @param {(Pattern | string)[]} params scope params
+	 * @param {() => void} fn inner function
+	 * @returns {void}
+	 */
+	inFunctionScope(hasThis, params, fn) {
+		const oldScope = this.scope;
+		this.scope = {
+			topLevelScope: oldScope.topLevelScope,
+			inTry: false,
+			inShorthand: false,
+			inTaggedTemplateTag: false,
+			isStrict: oldScope.isStrict,
+			isAsmJs: oldScope.isAsmJs,
+			terminated: undefined,
+			definitions: oldScope.definitions.createChild()
+		};
+
+		if (hasThis) {
+			this.undefineVariable("this");
+		}
+
+		this.enterPatterns(params, ident => {
+			this.defineVariable(ident);
+		});
+
+		fn();
+
+		this.scope = oldScope;
+	}
+
+	/**
+	 * @param {() => void} fn inner function
+	 * @param {boolean} inExecutedPath executed state
+	 * @returns {void}
+	 */
+	inBlockScope(fn, inExecutedPath = false) {
+		const oldScope = this.scope;
+		this.scope = {
+			topLevelScope: oldScope.topLevelScope,
+			inTry: oldScope.inTry,
+			inShorthand: false,
+			inTaggedTemplateTag: false,
+			isStrict: oldScope.isStrict,
+			isAsmJs: oldScope.isAsmJs,
+			terminated: oldScope.terminated,
+			definitions: oldScope.definitions.createChild()
+		};
+
+		fn();
+
+		const terminated = this.scope.terminated;
+
+		if (inExecutedPath && terminated) {
+			oldScope.terminated = terminated;
+		}
+
+		this.scope = oldScope;
+	}
+
+	/**
+	 * @param {Array} statements statements
+	 */
+	detectMode(statements) {
+		const isLiteral =
+			statements.length >= 1 &&
+			statements[0].type === "ExpressionStatement" &&
+			statements[0].expression.type === "Literal";
+		if (
+			isLiteral &&
+			/** @type {Literal} */
+			(/** @type {ExpressionStatement} */ (statements[0]).expression).value ===
+				"use strict"
+		) {
+			this.scope.isStrict = true;
+		}
+		if (
+			isLiteral &&
+			/** @type {Literal} */
+			(/** @type {ExpressionStatement} */ (statements[0]).expression).value ===
+				"use asm"
+		) {
+			this.scope.isAsmJs = true;
+		}
+	}
+
+	/**
+	 * @param {(string | Pattern | Property)[]} patterns patterns
+	 * @param {OnIdentString} onIdent on ident callback
+	 */
+	enterPatterns(patterns, onIdent) {
+		for (const pattern of patterns) {
+			if (typeof pattern !== "string") {
+				this.enterPattern(pattern, onIdent);
+			} else if (pattern) {
+				onIdent(pattern);
+			}
+		}
+	}
+
+	/**
+	 * @param {Pattern | Property} pattern pattern
+	 * @param {OnIdent} onIdent on ident callback
+	 */
+	enterPattern(pattern, onIdent) {
+		if (!pattern) return;
+		switch (pattern.type) {
+			case "ArrayPattern":
+				this.enterArrayPattern(pattern, onIdent);
+				break;
+			case "AssignmentPattern":
+				this.enterAssignmentPattern(pattern, onIdent);
+				break;
+			case "Identifier":
+				this.enterIdentifier(pattern, onIdent);
+				break;
+			case "ObjectPattern":
+				this.enterObjectPattern(pattern, onIdent);
+				break;
+			case "RestElement":
+				this.enterRestElement(pattern, onIdent);
+				break;
+			case "Property":
+				if (pattern.shorthand && pattern.value.type === "Identifier") {
+					this.scope.inShorthand = pattern.value.name;
+					this.enterIdentifier(pattern.value, onIdent);
+					this.scope.inShorthand = false;
+				} else {
+					this.enterPattern(/** @type {Pattern} */ (pattern.value), onIdent);
+				}
+				break;
+		}
+	}
+
+	/**
+	 * @param {Identifier} pattern identifier pattern
+	 * @param {OnIdent} onIdent callback
+	 */
+	enterIdentifier(pattern, onIdent) {
+		if (!this.callHooksForName(this.hooks.pattern, pattern.name, pattern)) {
+			onIdent(pattern.name, pattern);
+		}
+	}
+
+	/**
+	 * @param {ObjectPattern} pattern object pattern
+	 * @param {OnIdent} onIdent callback
+	 */
+	enterObjectPattern(pattern, onIdent) {
+		for (
+			let propIndex = 0, len = pattern.properties.length;
+			propIndex < len;
+			propIndex++
+		) {
+			const prop = pattern.properties[propIndex];
+			this.enterPattern(prop, onIdent);
+		}
+	}
+
+	/**
+	 * @param {ArrayPattern} pattern object pattern
+	 * @param {OnIdent} onIdent callback
+	 */
+	enterArrayPattern(pattern, onIdent) {
+		for (
+			let elementIndex = 0, len = pattern.elements.length;
+			elementIndex < len;
+			elementIndex++
+		) {
+			const element = pattern.elements[elementIndex];
+
+			if (element) {
+				this.enterPattern(element, onIdent);
+			}
+		}
+	}
+
+	/**
+	 * @param {RestElement} pattern object pattern
+	 * @param {OnIdent} onIdent callback
+	 */
+	enterRestElement(pattern, onIdent) {
+		this.enterPattern(pattern.argument, onIdent);
+	}
+
+	/**
+	 * @param {AssignmentPattern} pattern object pattern
+	 * @param {OnIdent} onIdent callback
+	 */
+	enterAssignmentPattern(pattern, onIdent) {
+		this.enterPattern(pattern.left, onIdent);
+	}
+
+	/**
+	 * @param {Expression | SpreadElement | PrivateIdentifier | Super} expression expression node
+	 * @returns {BasicEvaluatedExpression} evaluation result
+	 */
+	evaluateExpression(expression) {
+		try {
+			const hook = this.hooks.evaluate.get(expression.type);
+			if (hook !== undefined) {
+				const result = hook.call(expression);
+				if (result !== undefined && result !== null) {
+					result.setExpression(expression);
+					return result;
+				}
+			}
+		} catch (err) {
+			// eslint-disable-next-line no-console
+			console.warn(err);
+			// ignore error
+		}
+		return new BasicEvaluatedExpression()
+			.setRange(/** @type {Range} */ (expression.range))
+			.setExpression(expression);
+	}
+
+	/**
+	 * @param {Expression} expression expression
+	 * @returns {string} parsed string
+	 */
+	parseString(expression) {
+		switch (expression.type) {
+			case "BinaryExpression":
+				if (expression.operator === "+") {
+					return (
+						this.parseString(/** @type {Expression} */ (expression.left)) +
+						this.parseString(expression.right)
+					);
+				}
+				break;
+			case "Literal":
+				return String(expression.value);
+		}
+		throw new Error(
+			`${expression.type} is not supported as parameter for require`
+		);
+	}
+
+	/**
+	 * @param {Expression} expression expression
+	 * @returns {{ range?: Range, value: string, code: boolean, conditional: boolean | TODO }} result
+	 */
+	parseCalculatedString(expression) {
+		switch (expression.type) {
+			case "BinaryExpression":
+				if (expression.operator === "+") {
+					const left = this.parseCalculatedString(
+						/** @type {Expression} */
+						(expression.left)
+					);
+					const right = this.parseCalculatedString(expression.right);
+					if (left.code) {
+						return {
+							range: left.range,
+							value: left.value,
+							code: true,
+							conditional: false
+						};
+					} else if (right.code) {
+						return {
+							range: [
+								/** @type {Range} */
+								(left.range)[0],
+								right.range
+									? right.range[1]
+									: /** @type {Range} */ (left.range)[1]
+							],
+							value: left.value + right.value,
+							code: true,
+							conditional: false
+						};
+					}
+					return {
+						range: [
+							/** @type {Range} */
+							(left.range)[0],
+							/** @type {Range} */
+							(right.range)[1]
+						],
+						value: left.value + right.value,
+						code: false,
+						conditional: false
+					};
+				}
+				break;
+			case "ConditionalExpression": {
+				const consequent = this.parseCalculatedString(expression.consequent);
+				const alternate = this.parseCalculatedString(expression.alternate);
+				const items = [];
+				if (consequent.conditional) {
+					items.push(...consequent.conditional);
+				} else if (!consequent.code) {
+					items.push(consequent);
+				} else {
+					break;
+				}
+				if (alternate.conditional) {
+					items.push(...alternate.conditional);
+				} else if (!alternate.code) {
+					items.push(alternate);
+				} else {
+					break;
+				}
+				return {
+					range: undefined,
+					value: "",
+					code: true,
+					conditional: items
+				};
+			}
+			case "Literal":
+				return {
+					range: expression.range,
+					value: String(expression.value),
+					code: false,
+					conditional: false
+				};
+		}
+		return {
+			range: undefined,
+			value: "",
+			code: true,
+			conditional: false
+		};
+	}
+
+	/**
+	 * @param {string | Buffer | PreparsedAst} source the source to parse
+	 * @param {ParserState} state the parser state
+	 * @returns {ParserState} the parser state
+	 */
+	parse(source, state) {
+		let ast;
+		/** @type {import("acorn").Comment[]} */
+		let comments;
+		const semicolons = new Set();
+		if (source === null) {
+			throw new Error("source must not be null");
+		}
+		if (Buffer.isBuffer(source)) {
+			source = source.toString("utf-8");
+		}
+		if (typeof source === "object") {
+			ast = /** @type {Program} */ (source);
+			comments = source.comments;
+			if (source.semicolons) {
+				// Forward semicolon information from the preparsed AST if present
+				// This ensures the output is consistent with that of a fresh AST
+				for (const pos of source.semicolons) {
+					semicolons.add(pos);
+				}
+			}
+		} else {
+			comments = [];
+			ast = JavascriptParser._parse(source, {
+				sourceType: this.sourceType,
+				onComment: comments,
+				onInsertedSemicolon: pos => semicolons.add(pos)
+			});
+		}
+
+		const oldScope = this.scope;
+		const oldState = this.state;
+		const oldComments = this.comments;
+		const oldSemicolons = this.semicolons;
+		const oldStatementPath = this.statementPath;
+		const oldPrevStatement = this.prevStatement;
+		this.scope = {
+			topLevelScope: true,
+			inTry: false,
+			inShorthand: false,
+			inTaggedTemplateTag: false,
+			isStrict: false,
+			isAsmJs: false,
+			terminated: undefined,
+			definitions: new StackedMap()
+		};
+		this.state = /** @type {ParserState} */ (state);
+		this.comments = comments;
+		this.semicolons = semicolons;
+		this.statementPath = [];
+		this.prevStatement = undefined;
+		if (this.hooks.program.call(ast, comments) === undefined) {
+			this.destructuringAssignmentProperties = new WeakMap();
+			this.detectMode(ast.body);
+			this.preWalkStatements(ast.body);
+			this.prevStatement = undefined;
+			this.blockPreWalkStatements(ast.body);
+			this.prevStatement = undefined;
+			this.walkStatements(ast.body);
+			this.destructuringAssignmentProperties = undefined;
+		}
+		this.hooks.finish.call(ast, comments);
+		this.scope = oldScope;
+		this.state = oldState;
+		this.comments = oldComments;
+		this.semicolons = oldSemicolons;
+		this.statementPath = oldStatementPath;
+		this.prevStatement = oldPrevStatement;
+		return state;
+	}
+
+	/**
+	 * @param {string} source source code
+	 * @returns {BasicEvaluatedExpression} evaluation result
+	 */
+	evaluate(source) {
+		const ast = JavascriptParser._parse(`(${source})`, {
+			sourceType: this.sourceType,
+			locations: false
+		});
+		if (ast.body.length !== 1 || ast.body[0].type !== "ExpressionStatement") {
+			throw new Error("evaluate: Source is not a expression");
+		}
+		return this.evaluateExpression(ast.body[0].expression);
+	}
+
+	/**
+	 * @param {Expression | Declaration | PrivateIdentifier | MaybeNamedFunctionDeclaration | MaybeNamedClassDeclaration | null | undefined} expr an expression
+	 * @param {number} commentsStartPos source position from which annotation comments are checked
+	 * @returns {boolean} true, when the expression is pure
+	 */
+	isPure(expr, commentsStartPos) {
+		if (!expr) return true;
+		const result = this.hooks.isPure
+			.for(expr.type)
+			.call(expr, commentsStartPos);
+		if (typeof result === "boolean") return result;
+		switch (expr.type) {
+			// TODO handle more cases
+			case "ClassDeclaration":
+			case "ClassExpression": {
+				if (expr.body.type !== "ClassBody") return false;
+				if (
+					expr.superClass &&
+					!this.isPure(expr.superClass, /** @type {Range} */ (expr.range)[0])
+				) {
+					return false;
+				}
+				const items =
+					/** @type {TODO[]} */
+					(expr.body.body);
+				return items.every(item => {
+					if (
+						item.computed &&
+						item.key &&
+						!this.isPure(item.key, item.range[0])
+					) {
+						return false;
+					}
+
+					if (
+						item.static &&
+						item.value &&
+						!this.isPure(
+							item.value,
+							item.key ? item.key.range[1] : item.range[0]
+						)
+					) {
+						return false;
+					}
+
+					if (item.type === "StaticBlock") {
+						return false;
+					}
+
+					if (
+						expr.superClass &&
+						item.type === "MethodDefinition" &&
+						item.kind === "constructor"
+					) {
+						return false;
+					}
+
+					return true;
+				});
+			}
+
+			case "FunctionDeclaration":
+			case "FunctionExpression":
+			case "ArrowFunctionExpression":
+			case "ThisExpression":
+			case "Literal":
+			case "TemplateLiteral":
+			case "Identifier":
+			case "PrivateIdentifier":
+				return true;
+
+			case "VariableDeclaration":
+				return expr.declarations.every(decl =>
+					this.isPure(decl.init, /** @type {Range} */ (decl.range)[0])
+				);
+
+			case "ConditionalExpression":
+				return (
+					this.isPure(expr.test, commentsStartPos) &&
+					this.isPure(
+						expr.consequent,
+						/** @type {Range} */ (expr.test.range)[1]
+					) &&
+					this.isPure(
+						expr.alternate,
+						/** @type {Range} */ (expr.consequent.range)[1]
+					)
+				);
+
+			case "LogicalExpression":
+				return (
+					this.isPure(expr.left, commentsStartPos) &&
+					this.isPure(expr.right, /** @type {Range} */ (expr.left.range)[1])
+				);
+
+			case "SequenceExpression":
+				return expr.expressions.every(expr => {
+					const pureFlag = this.isPure(expr, commentsStartPos);
+					commentsStartPos = /** @type {Range} */ (expr.range)[1];
+					return pureFlag;
+				});
+
+			case "CallExpression": {
+				const pureFlag =
+					/** @type {Range} */ (expr.range)[0] - commentsStartPos > 12 &&
+					this.getComments([
+						commentsStartPos,
+						/** @type {Range} */ (expr.range)[0]
+					]).some(
+						comment =>
+							comment.type === "Block" &&
+							/^\s*(#|@)__PURE__\s*$/.test(comment.value)
+					);
+				if (!pureFlag) return false;
+				commentsStartPos = /** @type {Range} */ (expr.callee.range)[1];
+				return expr.arguments.every(arg => {
+					if (arg.type === "SpreadElement") return false;
+					const pureFlag = this.isPure(arg, commentsStartPos);
+					commentsStartPos = /** @type {Range} */ (arg.range)[1];
+					return pureFlag;
+				});
+			}
+		}
+		const evaluated = this.evaluateExpression(expr);
+		return !evaluated.couldHaveSideEffects();
+	}
+
+	/**
+	 * @param {Range} range range
+	 * @returns {Comment[]} comments in the range
+	 */
+	getComments(range) {
+		const [rangeStart, rangeEnd] = range;
+		/**
+		 * @param {Comment} comment comment
+		 * @param {number} needle needle
+		 * @returns {number} compared
+		 */
+		const compare = (comment, needle) =>
+			/** @type {Range} */ (comment.range)[0] - needle;
+		const comments = /** @type {Comment[]} */ (this.comments);
+		let idx = binarySearchBounds.ge(comments, rangeStart, compare);
+		/** @type {Comment[]} */
+		const commentsInRange = [];
+		while (
+			comments[idx] &&
+			/** @type {Range} */ (comments[idx].range)[1] <= rangeEnd
+		) {
+			commentsInRange.push(comments[idx]);
+			idx++;
+		}
+
+		return commentsInRange;
+	}
+
+	/**
+	 * @param {number} pos source code position
+	 * @returns {boolean} true when a semicolon has been inserted before this position, false if not
+	 */
+	isAsiPosition(pos) {
+		const currentStatement =
+			/** @type {StatementPath} */
+			(this.statementPath)[
+				/** @type {StatementPath} */
+				(this.statementPath).length - 1
+			];
+		if (currentStatement === undefined) throw new Error("Not in statement");
+		const range = /** @type {Range} */ (currentStatement.range);
+
+		return (
+			// Either asking directly for the end position of the current statement
+			(range[1] === pos &&
+				/** @type {Set} */ (this.semicolons).has(pos)) ||
+			// Or asking for the start position of the current statement,
+			// here we have to check multiple things
+			(range[0] === pos &&
+				// is there a previous statement which might be relevant?
+				this.prevStatement !== undefined &&
+				// is the end position of the previous statement an ASI position?
+				/** @type {Set} */ (this.semicolons).has(
+					/** @type {Range} */ (this.prevStatement.range)[1]
+				))
+		);
+	}
+
+	/**
+	 * @param {number} pos source code position
+	 * @returns {void}
+	 */
+	setAsiPosition(pos) {
+		/** @type {Set} */ (this.semicolons).add(pos);
+	}
+
+	/**
+	 * @param {number} pos source code position
+	 * @returns {void}
+	 */
+	unsetAsiPosition(pos) {
+		/** @type {Set} */ (this.semicolons).delete(pos);
+	}
+
+	/**
+	 * @param {Expression} expr expression
+	 * @returns {boolean} true, when the expression is a statement level expression
+	 */
+	isStatementLevelExpression(expr) {
+		const currentStatement =
+			/** @type {StatementPath} */
+			(this.statementPath)[
+				/** @type {StatementPath} */
+				(this.statementPath).length - 1
+			];
+		return (
+			expr === currentStatement ||
+			(currentStatement.type === "ExpressionStatement" &&
+				currentStatement.expression === expr)
+		);
+	}
+
+	/**
+	 * @param {string} name name
+	 * @param {Tag} tag tag info
+	 * @returns {TagData | undefined} tag data
+	 */
+	getTagData(name, tag) {
+		const info = this.scope.definitions.get(name);
+		if (info instanceof VariableInfo) {
+			let tagInfo = info.tagInfo;
+			while (tagInfo !== undefined) {
+				if (tagInfo.tag === tag) return tagInfo.data;
+				tagInfo = tagInfo.next;
+			}
+		}
+	}
+
+	/**
+	 * @param {string} name name
+	 * @param {Tag} tag tag info
+	 * @param {TagData=} data data
+	 */
+	tagVariable(name, tag, data) {
+		const oldInfo = this.scope.definitions.get(name);
+		/** @type {VariableInfo} */
+		let newInfo;
+		if (oldInfo === undefined) {
+			newInfo = new VariableInfo(this.scope, name, {
+				tag,
+				data,
+				next: undefined
+			});
+		} else if (oldInfo instanceof VariableInfo) {
+			newInfo = new VariableInfo(oldInfo.declaredScope, oldInfo.freeName, {
+				tag,
+				data,
+				next: oldInfo.tagInfo
+			});
+		} else {
+			newInfo = new VariableInfo(oldInfo, true, {
+				tag,
+				data,
+				next: undefined
+			});
+		}
+		this.scope.definitions.set(name, newInfo);
+	}
+
+	/**
+	 * @param {string} name variable name
+	 */
+	defineVariable(name) {
+		const oldInfo = this.scope.definitions.get(name);
+		// Don't redefine variable in same scope to keep existing tags
+		if (oldInfo instanceof VariableInfo && oldInfo.declaredScope === this.scope)
+			return;
+		this.scope.definitions.set(name, this.scope);
+	}
+
+	/**
+	 * @param {string} name variable name
+	 */
+	undefineVariable(name) {
+		this.scope.definitions.delete(name);
+	}
+
+	/**
+	 * @param {string} name variable name
+	 * @returns {boolean} true, when variable is defined
+	 */
+	isVariableDefined(name) {
+		const info = this.scope.definitions.get(name);
+		if (info === undefined) return false;
+		if (info instanceof VariableInfo) {
+			return info.freeName === true;
+		}
+		return true;
+	}
+
+	/**
+	 * @param {string} name variable name
+	 * @returns {string | ExportedVariableInfo} info for this variable
+	 */
+	getVariableInfo(name) {
+		const value = this.scope.definitions.get(name);
+		if (value === undefined) {
+			return name;
+		}
+		return value;
+	}
+
+	/**
+	 * @param {string} name variable name
+	 * @param {string | ExportedVariableInfo} variableInfo new info for this variable
+	 * @returns {void}
+	 */
+	setVariable(name, variableInfo) {
+		if (typeof variableInfo === "string") {
+			if (variableInfo === name) {
+				this.scope.definitions.delete(name);
+			} else {
+				this.scope.definitions.set(
+					name,
+					new VariableInfo(this.scope, variableInfo, undefined)
+				);
+			}
+		} else {
+			this.scope.definitions.set(name, variableInfo);
+		}
+	}
+
+	/**
+	 * @param {TagInfo} tagInfo tag info
+	 * @returns {VariableInfo} variable info
+	 */
+	evaluatedVariable(tagInfo) {
+		return new VariableInfo(this.scope, undefined, tagInfo);
+	}
+
+	/**
+	 * @param {Range} range range of the comment
+	 * @returns {{ options: Record | null, errors: (Error & { comment: Comment })[] | null }} result
+	 */
+	parseCommentOptions(range) {
+		const comments = this.getComments(range);
+		if (comments.length === 0) {
+			return EMPTY_COMMENT_OPTIONS;
+		}
+		/** @type {Record } */
+		const options = {};
+		/** @type {(Error & { comment: Comment })[]} */
+		const errors = [];
+		for (const comment of comments) {
+			const { value } = comment;
+			if (value && webpackCommentRegExp.test(value)) {
+				// try compile only if webpack options comment is present
+				try {
+					for (let [key, val] of Object.entries(
+						vm.runInContext(
+							`(function(){return {${value}};})()`,
+							this.magicCommentContext
+						)
+					)) {
+						if (typeof val === "object" && val !== null) {
+							val =
+								val.constructor.name === "RegExp"
+									? new RegExp(val)
+									: JSON.parse(JSON.stringify(val));
+						}
+						options[key] = val;
+					}
+				} catch (err) {
+					const newErr = new Error(String(/** @type {Error} */ (err).message));
+					newErr.stack = String(/** @type {Error} */ (err).stack);
+					Object.assign(newErr, { comment });
+					errors.push(/** @type {(Error & { comment: Comment })} */ (newErr));
+				}
+			}
+		}
+		return { options, errors };
+	}
+
+	/**
+	 * @param {Expression | Super} expression a member expression
+	 * @returns {{ members: string[], object: Expression | Super, membersOptionals: boolean[], memberRanges: Range[] }} member names (reverse order) and remaining object
+	 */
+	extractMemberExpressionChain(expression) {
+		/** @type {Node} */
+		let expr = expression;
+		const members = [];
+		const membersOptionals = [];
+		const memberRanges = [];
+		while (expr.type === "MemberExpression") {
+			if (expr.computed) {
+				if (expr.property.type !== "Literal") break;
+				members.push(`${expr.property.value}`); // the literal
+				memberRanges.push(/** @type {Range} */ (expr.object.range)); // the range of the expression fragment before the literal
+			} else {
+				if (expr.property.type !== "Identifier") break;
+				members.push(expr.property.name); // the identifier
+				memberRanges.push(/** @type {Range} */ (expr.object.range)); // the range of the expression fragment before the identifier
+			}
+			membersOptionals.push(expr.optional);
+			expr = expr.object;
+		}
+
+		return {
+			members,
+			membersOptionals,
+			memberRanges,
+			object: expr
+		};
+	}
+
+	/**
+	 * @param {string} varName variable name
+	 * @returns {{name: string, info: VariableInfo | string} | undefined} name of the free variable and variable info for that
+	 */
+	getFreeInfoFromVariable(varName) {
+		const info = this.getVariableInfo(varName);
+		let name;
+		if (info instanceof VariableInfo) {
+			name = info.freeName;
+			if (typeof name !== "string") return;
+		} else if (typeof info !== "string") {
+			return;
+		} else {
+			name = info;
+		}
+		return { info, name };
+	}
+
+	/** @typedef {{ type: "call", call: CallExpression, calleeName: string, rootInfo: string | VariableInfo, getCalleeMembers: () => string[], name: string, getMembers: () => string[], getMembersOptionals: () => boolean[], getMemberRanges: () => Range[]}} CallExpressionInfo */
+	/** @typedef {{ type: "expression", rootInfo: string | VariableInfo, name: string, getMembers: () => string[], getMembersOptionals: () => boolean[], getMemberRanges: () => Range[]}} ExpressionExpressionInfo */
+
+	/**
+	 * @param {Expression | Super} expression a member expression
+	 * @param {number} allowedTypes which types should be returned, presented in bit mask
+	 * @returns {CallExpressionInfo | ExpressionExpressionInfo | undefined} expression info
+	 */
+	getMemberExpressionInfo(expression, allowedTypes) {
+		const { object, members, membersOptionals, memberRanges } =
+			this.extractMemberExpressionChain(expression);
+		switch (object.type) {
+			case "CallExpression": {
+				if ((allowedTypes & ALLOWED_MEMBER_TYPES_CALL_EXPRESSION) === 0) return;
+				let callee = object.callee;
+				let rootMembers = EMPTY_ARRAY;
+				if (callee.type === "MemberExpression") {
+					({ object: callee, members: rootMembers } =
+						this.extractMemberExpressionChain(callee));
+				}
+				const rootName = getRootName(callee);
+				if (!rootName) return;
+				const result = this.getFreeInfoFromVariable(rootName);
+				if (!result) return;
+				const { info: rootInfo, name: resolvedRoot } = result;
+				const calleeName = objectAndMembersToName(resolvedRoot, rootMembers);
+				return {
+					type: "call",
+					call: object,
+					calleeName,
+					rootInfo,
+					getCalleeMembers: memoize(() => rootMembers.reverse()),
+					name: objectAndMembersToName(`${calleeName}()`, members),
+					getMembers: memoize(() => members.reverse()),
+					getMembersOptionals: memoize(() => membersOptionals.reverse()),
+					getMemberRanges: memoize(() => memberRanges.reverse())
+				};
+			}
+			case "Identifier":
+			case "MetaProperty":
+			case "ThisExpression": {
+				if ((allowedTypes & ALLOWED_MEMBER_TYPES_EXPRESSION) === 0) return;
+				const rootName = getRootName(object);
+				if (!rootName) return;
+
+				const result = this.getFreeInfoFromVariable(rootName);
+				if (!result) return;
+				const { info: rootInfo, name: resolvedRoot } = result;
+				return {
+					type: "expression",
+					name: objectAndMembersToName(resolvedRoot, members),
+					rootInfo,
+					getMembers: memoize(() => members.reverse()),
+					getMembersOptionals: memoize(() => membersOptionals.reverse()),
+					getMemberRanges: memoize(() => memberRanges.reverse())
+				};
+			}
+		}
+	}
+
+	/**
+	 * @param {MemberExpression} expression an expression
+	 * @returns {{ name: string, rootInfo: ExportedVariableInfo, getMembers: () => string[]} | undefined} name info
+	 */
+	getNameForExpression(expression) {
+		return this.getMemberExpressionInfo(
+			expression,
+			ALLOWED_MEMBER_TYPES_EXPRESSION
+		);
+	}
+
+	/**
+	 * @param {string} code source code
+	 * @param {ParseOptions} options parsing options
+	 * @returns {Program} parsed ast
+	 */
+	static _parse(code, options) {
+		const type = options ? options.sourceType : "module";
+		/** @type {AcornOptions} */
+		const parserOptions = {
+			...defaultParserOptions,
+			allowReturnOutsideFunction: type === "script",
+			...options,
+			sourceType: type === "auto" ? "module" : type
+		};
+
+		/** @type {import("acorn").Program | undefined} */
+		let ast;
+		let error;
+		let threw = false;
+		try {
+			ast = parser.parse(code, parserOptions);
+		} catch (err) {
+			error = err;
+			threw = true;
+		}
+
+		if (threw && type === "auto") {
+			parserOptions.sourceType = "script";
+			if (!("allowReturnOutsideFunction" in options)) {
+				parserOptions.allowReturnOutsideFunction = true;
+			}
+			if (Array.isArray(parserOptions.onComment)) {
+				parserOptions.onComment.length = 0;
+			}
+			try {
+				ast = parser.parse(code, parserOptions);
+				threw = false;
+			} catch (_err) {
+				// we use the error from first parse try
+				// so nothing to do here
+			}
+		}
+
+		if (threw) {
+			throw error;
+		}
+
+		return /** @type {Program} */ (ast);
+	}
+}
+
+module.exports = JavascriptParser;
+module.exports.ALLOWED_MEMBER_TYPES_ALL = ALLOWED_MEMBER_TYPES_ALL;
+module.exports.ALLOWED_MEMBER_TYPES_EXPRESSION =
+	ALLOWED_MEMBER_TYPES_EXPRESSION;
+module.exports.ALLOWED_MEMBER_TYPES_CALL_EXPRESSION =
+	ALLOWED_MEMBER_TYPES_CALL_EXPRESSION;
+module.exports.getImportAttributes = getImportAttributes;
+module.exports.VariableInfo = VariableInfo;
diff --git a/lib/javascript/JavascriptParserHelpers.js b/lib/javascript/JavascriptParserHelpers.js
new file mode 100644
index 00000000000..ebd912c0250
--- /dev/null
+++ b/lib/javascript/JavascriptParserHelpers.js
@@ -0,0 +1,129 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const UnsupportedFeatureWarning = require("../UnsupportedFeatureWarning");
+const ConstDependency = require("../dependencies/ConstDependency");
+const BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
+
+/** @typedef {import("estree").Expression} Expression */
+/** @typedef {import("estree").Node} Node */
+/** @typedef {import("estree").SourceLocation} SourceLocation */
+/** @typedef {import("./JavascriptParser")} JavascriptParser */
+/** @typedef {import("./JavascriptParser").Range} Range */
+
+/**
+ * @param {JavascriptParser} parser the parser
+ * @param {string} value the const value
+ * @param {(string[] | null)=} runtimeRequirements runtime requirements
+ * @returns {(expression: Expression) => true} plugin function
+ */
+module.exports.toConstantDependency = (parser, value, runtimeRequirements) =>
+	function constDependency(expr) {
+		const dep = new ConstDependency(
+			value,
+			/** @type {Range} */
+			(expr.range),
+			runtimeRequirements
+		);
+		dep.loc = /** @type {SourceLocation} */ (expr.loc);
+		parser.state.module.addPresentationalDependency(dep);
+		return true;
+	};
+
+/**
+ * @param {string} value the string value
+ * @returns {(expression: Expression) => BasicEvaluatedExpression} plugin function
+ */
+module.exports.evaluateToString = value =>
+	function stringExpression(expr) {
+		return new BasicEvaluatedExpression()
+			.setString(value)
+			.setRange(/** @type {Range} */ (expr.range));
+	};
+
+/**
+ * @param {number} value the number value
+ * @returns {(expression: Expression) => BasicEvaluatedExpression} plugin function
+ */
+module.exports.evaluateToNumber = value =>
+	function stringExpression(expr) {
+		return new BasicEvaluatedExpression()
+			.setNumber(value)
+			.setRange(/** @type {Range} */ (expr.range));
+	};
+
+/**
+ * @param {boolean} value the boolean value
+ * @returns {(expression: Expression) => BasicEvaluatedExpression} plugin function
+ */
+module.exports.evaluateToBoolean = value =>
+	function booleanExpression(expr) {
+		return new BasicEvaluatedExpression()
+			.setBoolean(value)
+			.setRange(/** @type {Range} */ (expr.range));
+	};
+
+/**
+ * @param {string} identifier identifier
+ * @param {string} rootInfo rootInfo
+ * @param {() => string[]} getMembers getMembers
+ * @param {boolean | null=} truthy is truthy, null if nullish
+ * @returns {(expression: Expression) => BasicEvaluatedExpression} callback
+ */
+module.exports.evaluateToIdentifier = (
+	identifier,
+	rootInfo,
+	getMembers,
+	truthy
+) =>
+	function identifierExpression(expr) {
+		const evaluatedExpression = new BasicEvaluatedExpression()
+			.setIdentifier(identifier, rootInfo, getMembers)
+			.setSideEffects(false)
+			.setRange(/** @type {Range} */ (expr.range));
+		switch (truthy) {
+			case true:
+				evaluatedExpression.setTruthy();
+				break;
+			case null:
+				evaluatedExpression.setNullish(true);
+				break;
+			case false:
+				evaluatedExpression.setFalsy();
+				break;
+		}
+
+		return evaluatedExpression;
+	};
+
+/**
+ * @param {JavascriptParser} parser the parser
+ * @param {string} message the message
+ * @returns {(expression: Expression) => boolean | undefined} callback to handle unsupported expression
+ */
+module.exports.expressionIsUnsupported = (parser, message) =>
+	function unsupportedExpression(expr) {
+		const dep = new ConstDependency(
+			"(void 0)",
+			/** @type {Range} */ (expr.range),
+			null
+		);
+		dep.loc = /** @type {SourceLocation} */ (expr.loc);
+		parser.state.module.addPresentationalDependency(dep);
+		if (!parser.state.module) return;
+		parser.state.module.addWarning(
+			new UnsupportedFeatureWarning(
+				message,
+				/** @type {SourceLocation} */ (expr.loc)
+			)
+		);
+		return true;
+	};
+
+module.exports.skipTraversal = () => true;
+
+module.exports.approve = () => true;
diff --git a/lib/javascript/StartupHelpers.js b/lib/javascript/StartupHelpers.js
new file mode 100644
index 00000000000..fe6a05c4a40
--- /dev/null
+++ b/lib/javascript/StartupHelpers.js
@@ -0,0 +1,180 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+const { isSubset } = require("../util/SetHelpers");
+const { getAllChunks } = require("./ChunkHelpers");
+
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Chunk").ChunkId} ChunkId */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../ChunkGraph").ModuleId} ModuleId */
+/** @typedef {import("../Entrypoint")} Entrypoint */
+/** @typedef {import("../ChunkGraph").EntryModuleWithChunkGroup} EntryModuleWithChunkGroup */
+/** @typedef {import("../ChunkGroup")} ChunkGroup */
+/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
+/** @typedef {(string|number)[]} EntryItem */
+
+const EXPORT_PREFIX = `var ${RuntimeGlobals.exports} = `;
+
+/** @typedef {Set} Chunks */
+/** @typedef {ModuleId[]} ModuleIds */
+
+/**
+ * @param {ChunkGraph} chunkGraph chunkGraph
+ * @param {RuntimeTemplate} runtimeTemplate runtimeTemplate
+ * @param {EntryModuleWithChunkGroup[]} entries entries
+ * @param {Chunk} chunk chunk
+ * @param {boolean} passive true: passive startup with on chunks loaded
+ * @returns {string} runtime code
+ */
+module.exports.generateEntryStartup = (
+	chunkGraph,
+	runtimeTemplate,
+	entries,
+	chunk,
+	passive
+) => {
+	/** @type {string[]} */
+	const runtime = [
+		`var __webpack_exec__ = ${runtimeTemplate.returningFunction(
+			`${RuntimeGlobals.require}(${RuntimeGlobals.entryModuleId} = moduleId)`,
+			"moduleId"
+		)}`
+	];
+
+	/**
+	 * @param {ModuleId} id id
+	 * @returns {string} fn to execute
+	 */
+	const runModule = id => `__webpack_exec__(${JSON.stringify(id)})`;
+	/**
+	 * @param {Chunks} chunks chunks
+	 * @param {ModuleIds} moduleIds module ids
+	 * @param {boolean=} final true when final, otherwise false
+	 */
+	const outputCombination = (chunks, moduleIds, final) => {
+		if (chunks.size === 0) {
+			runtime.push(
+				`${final ? EXPORT_PREFIX : ""}(${moduleIds.map(runModule).join(", ")});`
+			);
+		} else {
+			const fn = runtimeTemplate.returningFunction(
+				moduleIds.map(runModule).join(", ")
+			);
+			runtime.push(
+				`${final && !passive ? EXPORT_PREFIX : ""}${
+					passive
+						? RuntimeGlobals.onChunksLoaded
+						: RuntimeGlobals.startupEntrypoint
+				}(0, ${JSON.stringify(Array.from(chunks, c => c.id))}, ${fn});`
+			);
+			if (final && passive) {
+				runtime.push(`${EXPORT_PREFIX}${RuntimeGlobals.onChunksLoaded}();`);
+			}
+		}
+	};
+
+	/** @type {Chunks | undefined} */
+	let currentChunks;
+	/** @type {ModuleIds | undefined} */
+	let currentModuleIds;
+
+	for (const [module, entrypoint] of entries) {
+		if (!chunkGraph.getModuleSourceTypes(module).has("javascript")) {
+			continue;
+		}
+		const runtimeChunk =
+			/** @type {Entrypoint} */
+			(entrypoint).getRuntimeChunk();
+		const moduleId = /** @type {ModuleId} */ (chunkGraph.getModuleId(module));
+		const chunks = getAllChunks(
+			/** @type {Entrypoint} */
+			(entrypoint),
+			chunk,
+			runtimeChunk
+		);
+		if (
+			currentChunks &&
+			currentChunks.size === chunks.size &&
+			isSubset(currentChunks, chunks)
+		) {
+			/** @type {ModuleIds} */
+			(currentModuleIds).push(moduleId);
+		} else {
+			if (currentChunks) {
+				outputCombination(
+					currentChunks,
+					/** @type {ModuleIds} */ (currentModuleIds)
+				);
+			}
+			currentChunks = chunks;
+			currentModuleIds = [moduleId];
+		}
+	}
+
+	// output current modules with export prefix
+	if (currentChunks) {
+		outputCombination(
+			currentChunks,
+			/** @type {ModuleIds} */
+			(currentModuleIds),
+			true
+		);
+	}
+	runtime.push("");
+	return Template.asString(runtime);
+};
+
+/**
+ * @param {Hash} hash the hash to update
+ * @param {ChunkGraph} chunkGraph chunkGraph
+ * @param {EntryModuleWithChunkGroup[]} entries entries
+ * @param {Chunk} chunk chunk
+ * @returns {void}
+ */
+module.exports.updateHashForEntryStartup = (
+	hash,
+	chunkGraph,
+	entries,
+	chunk
+) => {
+	for (const [module, entrypoint] of entries) {
+		const runtimeChunk =
+			/** @type {Entrypoint} */
+			(entrypoint).getRuntimeChunk();
+		const moduleId = chunkGraph.getModuleId(module);
+		hash.update(`${moduleId}`);
+		for (const c of getAllChunks(
+			/** @type {Entrypoint} */ (entrypoint),
+			chunk,
+			/** @type {Chunk} */ (runtimeChunk)
+		)) {
+			hash.update(`${c.id}`);
+		}
+	}
+};
+
+/**
+ * @param {Chunk} chunk the chunk
+ * @param {ChunkGraph} chunkGraph the chunk graph
+ * @param {(chunk: Chunk, chunkGraph: ChunkGraph) => boolean} filterFn filter function
+ * @returns {Set} initially fulfilled chunk ids
+ */
+module.exports.getInitialChunkIds = (chunk, chunkGraph, filterFn) => {
+	const initialChunkIds = new Set(chunk.ids);
+	for (const c of chunk.getAllInitialChunks()) {
+		if (c === chunk || filterFn(c, chunkGraph)) continue;
+		for (const id of /** @type {ChunkId[]} */ (c.ids)) {
+			initialChunkIds.add(id);
+		}
+	}
+	return initialChunkIds;
+};
diff --git a/lib/json/JsonData.js b/lib/json/JsonData.js
new file mode 100644
index 00000000000..c46bdeb6355
--- /dev/null
+++ b/lib/json/JsonData.js
@@ -0,0 +1,74 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { register } = require("../util/serialization");
+
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("./JsonModulesPlugin").JsonValue} JsonValue */
+
+class JsonData {
+	/**
+	 * @param {Buffer | JsonValue} data JSON data
+	 */
+	constructor(data) {
+		/** @type {Buffer | undefined} */
+		this._buffer = undefined;
+		/** @type {JsonValue | undefined} */
+		this._data = undefined;
+		if (Buffer.isBuffer(data)) {
+			this._buffer = data;
+		} else {
+			this._data = data;
+		}
+	}
+
+	/**
+	 * @returns {JsonValue | undefined} Raw JSON data
+	 */
+	get() {
+		if (this._data === undefined && this._buffer !== undefined) {
+			this._data = JSON.parse(this._buffer.toString());
+		}
+		return this._data;
+	}
+
+	/**
+	 * @param {Hash} hash hash to be updated
+	 * @returns {void} the updated hash
+	 */
+	updateHash(hash) {
+		if (this._buffer === undefined && this._data !== undefined) {
+			this._buffer = Buffer.from(JSON.stringify(this._data));
+		}
+
+		if (this._buffer) hash.update(this._buffer);
+	}
+}
+
+register(JsonData, "webpack/lib/json/JsonData", null, {
+	/**
+	 * @param {JsonData} obj JSONData object
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(obj, { write }) {
+		if (obj._buffer === undefined && obj._data !== undefined) {
+			obj._buffer = Buffer.from(JSON.stringify(obj._data));
+		}
+		write(obj._buffer);
+	},
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 * @returns {JsonData} deserialized JSON data
+	 */
+	deserialize({ read }) {
+		return new JsonData(read());
+	}
+});
+
+module.exports = JsonData;
diff --git a/lib/json/JsonGenerator.js b/lib/json/JsonGenerator.js
new file mode 100644
index 00000000000..bbe64926710
--- /dev/null
+++ b/lib/json/JsonGenerator.js
@@ -0,0 +1,231 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { RawSource } = require("webpack-sources");
+const ConcatenationScope = require("../ConcatenationScope");
+const { UsageState } = require("../ExportsInfo");
+const Generator = require("../Generator");
+const { JS_TYPES } = require("../ModuleSourceTypesConstants");
+const RuntimeGlobals = require("../RuntimeGlobals");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../../declarations/WebpackOptions").JsonGeneratorOptions} JsonGeneratorOptions */
+/** @typedef {import("../ExportsInfo")} ExportsInfo */
+/** @typedef {import("../Generator").GenerateContext} GenerateContext */
+/** @typedef {import("../Module").ConcatenationBailoutReasonContext} ConcatenationBailoutReasonContext */
+/** @typedef {import("../Module").SourceTypes} SourceTypes */
+/** @typedef {import("../NormalModule")} NormalModule */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+/** @typedef {import("./JsonData")} JsonData */
+/** @typedef {import("./JsonModulesPlugin").JsonArray} JsonArray */
+/** @typedef {import("./JsonModulesPlugin").JsonObject} JsonObject */
+/** @typedef {import("./JsonModulesPlugin").JsonValue} JsonValue */
+
+/**
+ * @param {JsonValue} data Raw JSON data
+ * @returns {undefined|string} stringified data
+ */
+const stringifySafe = data => {
+	const stringified = JSON.stringify(data);
+	if (!stringified) {
+		return; // Invalid JSON
+	}
+
+	return stringified.replace(/\u2028|\u2029/g, str =>
+		str === "\u2029" ? "\\u2029" : "\\u2028"
+	); // invalid in JavaScript but valid JSON
+};
+
+/**
+ * @param {JsonObject | JsonArray} data Raw JSON data (always an object or array)
+ * @param {ExportsInfo} exportsInfo exports info
+ * @param {RuntimeSpec} runtime the runtime
+ * @returns {JsonObject | JsonArray} reduced data
+ */
+const createObjectForExportsInfo = (data, exportsInfo, runtime) => {
+	if (exportsInfo.otherExportsInfo.getUsed(runtime) !== UsageState.Unused)
+		return data;
+	const isArray = Array.isArray(data);
+	/** @type {JsonObject | JsonArray} */
+	const reducedData = isArray ? [] : {};
+	for (const key of Object.keys(data)) {
+		const exportInfo = exportsInfo.getReadOnlyExportInfo(key);
+		const used = exportInfo.getUsed(runtime);
+		if (used === UsageState.Unused) continue;
+
+		// The real type is `JsonObject | JsonArray`, but typescript doesn't work `Object.keys(['string', 'other-string', 'etc'])` properly
+		const newData = /** @type {JsonObject} */ (data)[key];
+		const value =
+			used === UsageState.OnlyPropertiesUsed &&
+			exportInfo.exportsInfo &&
+			typeof newData === "object" &&
+			newData
+				? createObjectForExportsInfo(newData, exportInfo.exportsInfo, runtime)
+				: newData;
+
+		const name = /** @type {string} */ (exportInfo.getUsedName(key, runtime));
+		/** @type {JsonObject} */
+		(reducedData)[name] = value;
+	}
+	if (isArray) {
+		const arrayLengthWhenUsed =
+			exportsInfo.getReadOnlyExportInfo("length").getUsed(runtime) !==
+			UsageState.Unused
+				? data.length
+				: undefined;
+
+		let sizeObjectMinusArray = 0;
+		const reducedDataLength =
+			/** @type {JsonArray} */
+			(reducedData).length;
+		for (let i = 0; i < reducedDataLength; i++) {
+			if (/** @type {JsonArray} */ (reducedData)[i] === undefined) {
+				sizeObjectMinusArray -= 2;
+			} else {
+				sizeObjectMinusArray += `${i}`.length + 3;
+			}
+		}
+		if (arrayLengthWhenUsed !== undefined) {
+			sizeObjectMinusArray +=
+				`${arrayLengthWhenUsed}`.length +
+				8 -
+				(arrayLengthWhenUsed - reducedDataLength) * 2;
+		}
+		if (sizeObjectMinusArray < 0)
+			return Object.assign(
+				arrayLengthWhenUsed === undefined
+					? {}
+					: { length: arrayLengthWhenUsed },
+				reducedData
+			);
+		/** @type {number} */
+		const generatedLength =
+			arrayLengthWhenUsed !== undefined
+				? Math.max(arrayLengthWhenUsed, reducedDataLength)
+				: reducedDataLength;
+		for (let i = 0; i < generatedLength; i++) {
+			if (/** @type {JsonArray} */ (reducedData)[i] === undefined) {
+				/** @type {JsonArray} */
+				(reducedData)[i] = 0;
+			}
+		}
+	}
+	return reducedData;
+};
+
+class JsonGenerator extends Generator {
+	/**
+	 * @param {JsonGeneratorOptions} options options
+	 */
+	constructor(options) {
+		super();
+		this.options = options;
+	}
+
+	/**
+	 * @param {NormalModule} module fresh module
+	 * @returns {SourceTypes} available types (do not mutate)
+	 */
+	getTypes(module) {
+		return JS_TYPES;
+	}
+
+	/**
+	 * @param {NormalModule} module the module
+	 * @param {string=} type source type
+	 * @returns {number} estimate size of the module
+	 */
+	getSize(module, type) {
+		/** @type {JsonValue | undefined} */
+		const data =
+			module.buildInfo &&
+			module.buildInfo.jsonData &&
+			module.buildInfo.jsonData.get();
+		if (!data) return 0;
+		return /** @type {string} */ (stringifySafe(data)).length + 10;
+	}
+
+	/**
+	 * @param {NormalModule} module module for which the bailout reason should be determined
+	 * @param {ConcatenationBailoutReasonContext} context context
+	 * @returns {string | undefined} reason why this module can't be concatenated, undefined when it can be concatenated
+	 */
+	getConcatenationBailoutReason(module, context) {
+		return undefined;
+	}
+
+	/**
+	 * @param {NormalModule} module module for which the code should be generated
+	 * @param {GenerateContext} generateContext context for generate
+	 * @returns {Source | null} generated code
+	 */
+	generate(
+		module,
+		{
+			moduleGraph,
+			runtimeTemplate,
+			runtimeRequirements,
+			runtime,
+			concatenationScope
+		}
+	) {
+		/** @type {JsonValue | undefined} */
+		const data =
+			module.buildInfo &&
+			module.buildInfo.jsonData &&
+			module.buildInfo.jsonData.get();
+		if (data === undefined) {
+			return new RawSource(
+				runtimeTemplate.missingModuleStatement({
+					request: module.rawRequest
+				})
+			);
+		}
+		const exportsInfo = moduleGraph.getExportsInfo(module);
+		/** @type {JsonValue} */
+		const finalJson =
+			typeof data === "object" &&
+			data &&
+			exportsInfo.otherExportsInfo.getUsed(runtime) === UsageState.Unused
+				? createObjectForExportsInfo(data, exportsInfo, runtime)
+				: data;
+		// Use JSON because JSON.parse() is much faster than JavaScript evaluation
+		const jsonStr = /** @type {string} */ (stringifySafe(finalJson));
+		const jsonExpr =
+			this.options.JSONParse &&
+			jsonStr.length > 20 &&
+			typeof finalJson === "object"
+				? `/*#__PURE__*/JSON.parse('${jsonStr.replace(/[\\']/g, "\\$&")}')`
+				: jsonStr.replace(/"__proto__":/g, '["__proto__"]:');
+		/** @type {string} */
+		let content;
+		if (concatenationScope) {
+			content = `${runtimeTemplate.supportsConst() ? "const" : "var"} ${
+				ConcatenationScope.NAMESPACE_OBJECT_EXPORT
+			} = ${jsonExpr};`;
+			concatenationScope.registerNamespaceExport(
+				ConcatenationScope.NAMESPACE_OBJECT_EXPORT
+			);
+		} else {
+			runtimeRequirements.add(RuntimeGlobals.module);
+			content = `${module.moduleArgument}.exports = ${jsonExpr};`;
+		}
+		return new RawSource(content);
+	}
+
+	/**
+	 * @param {Error} error the error
+	 * @param {NormalModule} module module for which the code should be generated
+	 * @param {GenerateContext} generateContext context for generate
+	 * @returns {Source | null} generated code
+	 */
+	generateError(error, module, generateContext) {
+		return new RawSource(`throw new Error(${JSON.stringify(error.message)});`);
+	}
+}
+
+module.exports = JsonGenerator;
diff --git a/lib/json/JsonModulesPlugin.js b/lib/json/JsonModulesPlugin.js
new file mode 100644
index 00000000000..b4a6cfcfdc9
--- /dev/null
+++ b/lib/json/JsonModulesPlugin.js
@@ -0,0 +1,69 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { JSON_MODULE_TYPE } = require("../ModuleTypeConstants");
+const createSchemaValidation = require("../util/create-schema-validation");
+const JsonGenerator = require("./JsonGenerator");
+const JsonParser = require("./JsonParser");
+
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../util/fs").JsonArray} JsonArray */
+/** @typedef {import("../util/fs").JsonObject} JsonObject */
+/** @typedef {import("../util/fs").JsonValue} JsonValue */
+
+const validate = createSchemaValidation(
+	require("../../schemas/plugins/json/JsonModulesPluginParser.check.js"),
+	() => require("../../schemas/plugins/json/JsonModulesPluginParser.json"),
+	{
+		name: "Json Modules Plugin",
+		baseDataPath: "parser"
+	}
+);
+
+const validateGenerator = createSchemaValidation(
+	require("../../schemas/plugins/json/JsonModulesPluginGenerator.check.js"),
+	() => require("../../schemas/plugins/json/JsonModulesPluginGenerator.json"),
+	{
+		name: "Json Modules Plugin",
+		baseDataPath: "generator"
+	}
+);
+
+const PLUGIN_NAME = "JsonModulesPlugin";
+
+/**
+ * The JsonModulesPlugin is the entrypoint plugin for the json modules feature.
+ * It adds the json module type to the compiler and registers the json parser and generator.
+ */
+class JsonModulesPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(
+			PLUGIN_NAME,
+			(compilation, { normalModuleFactory }) => {
+				normalModuleFactory.hooks.createParser
+					.for(JSON_MODULE_TYPE)
+					.tap(PLUGIN_NAME, parserOptions => {
+						validate(parserOptions);
+						return new JsonParser(parserOptions);
+					});
+				normalModuleFactory.hooks.createGenerator
+					.for(JSON_MODULE_TYPE)
+					.tap(PLUGIN_NAME, generatorOptions => {
+						validateGenerator(generatorOptions);
+						return new JsonGenerator(generatorOptions);
+					});
+			}
+		);
+	}
+}
+
+module.exports = JsonModulesPlugin;
diff --git a/lib/json/JsonParser.js b/lib/json/JsonParser.js
new file mode 100644
index 00000000000..4dbe0fa573c
--- /dev/null
+++ b/lib/json/JsonParser.js
@@ -0,0 +1,77 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const Parser = require("../Parser");
+const JsonExportsDependency = require("../dependencies/JsonExportsDependency");
+const memoize = require("../util/memoize");
+const JsonData = require("./JsonData");
+
+/** @typedef {import("../../declarations/plugins/JsonModulesPluginParser").JsonModulesPluginParserOptions} JsonModulesPluginParserOptions */
+/** @typedef {import("../Module").BuildInfo} BuildInfo */
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
+/** @typedef {import("../Parser").ParserState} ParserState */
+/** @typedef {import("../Parser").PreparsedAst} PreparsedAst */
+/** @typedef {import("./JsonModulesPlugin").JsonValue} JsonValue */
+
+const getParseJson = memoize(() => require("json-parse-even-better-errors"));
+
+class JsonParser extends Parser {
+	/**
+	 * @param {JsonModulesPluginParserOptions} options parser options
+	 */
+	constructor(options) {
+		super();
+		this.options = options || {};
+	}
+
+	/**
+	 * @param {string | Buffer | PreparsedAst} source the source to parse
+	 * @param {ParserState} state the parser state
+	 * @returns {ParserState} the parser state
+	 */
+	parse(source, state) {
+		if (Buffer.isBuffer(source)) {
+			source = source.toString("utf-8");
+		}
+
+		/** @type {NonNullable} */
+		const parseFn =
+			typeof this.options.parse === "function"
+				? this.options.parse
+				: getParseJson();
+		/** @type {Buffer | JsonValue | undefined} */
+		let data;
+		try {
+			data =
+				typeof source === "object"
+					? source
+					: parseFn(source[0] === "\uFEFF" ? source.slice(1) : source);
+		} catch (err) {
+			throw new Error(
+				`Cannot parse JSON: ${/** @type {Error} */ (err).message}`
+			);
+		}
+		const jsonData = new JsonData(/** @type {Buffer | JsonValue} */ (data));
+		const buildInfo = /** @type {BuildInfo} */ (state.module.buildInfo);
+		buildInfo.jsonData = jsonData;
+		buildInfo.strict = true;
+		const buildMeta = /** @type {BuildMeta} */ (state.module.buildMeta);
+		buildMeta.exportsType = "default";
+		buildMeta.defaultObject =
+			typeof data === "object" ? "redirect-warn" : false;
+		state.module.addDependency(
+			new JsonExportsDependency(
+				jsonData,
+				/** @type {number} */
+				(this.options.exportsDepth)
+			)
+		);
+		return state;
+	}
+}
+
+module.exports = JsonParser;
diff --git a/lib/library/AbstractLibraryPlugin.js b/lib/library/AbstractLibraryPlugin.js
new file mode 100644
index 00000000000..647c92c031f
--- /dev/null
+++ b/lib/library/AbstractLibraryPlugin.js
@@ -0,0 +1,305 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const JavascriptModulesPlugin = require("../javascript/JavascriptModulesPlugin");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryOptions} LibraryOptions */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryType} LibraryType */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Compilation").ChunkHashContext} ChunkHashContext */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../javascript/JavascriptModulesPlugin").RenderContext} RenderContext */
+/** @typedef {import("../javascript/JavascriptModulesPlugin").StartupRenderContext} StartupRenderContext */
+/** @typedef {import("../util/Hash")} Hash */
+
+const COMMON_LIBRARY_NAME_MESSAGE =
+	"Common configuration options that specific library names are 'output.library[.name]', 'entry.xyz.library[.name]', 'ModuleFederationPlugin.name' and 'ModuleFederationPlugin.library[.name]'.";
+
+/**
+ * @template T
+ * @typedef {object} LibraryContext
+ * @property {Compilation} compilation
+ * @property {ChunkGraph} chunkGraph
+ * @property {T} options
+ */
+
+/**
+ * @typedef {object} AbstractLibraryPluginOptions
+ * @property {string} pluginName name of the plugin
+ * @property {LibraryType} type used library type
+ */
+
+/**
+ * @template T
+ */
+class AbstractLibraryPlugin {
+	/**
+	 * @param {AbstractLibraryPluginOptions} options options
+	 */
+	constructor({ pluginName, type }) {
+		this._pluginName = pluginName;
+		this._type = type;
+		this._parseCache = new WeakMap();
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		const { _pluginName } = this;
+		compiler.hooks.thisCompilation.tap(_pluginName, compilation => {
+			compilation.hooks.finishModules.tap(
+				{ name: _pluginName, stage: 10 },
+				() => {
+					for (const [
+						name,
+						{
+							dependencies: deps,
+							options: { library }
+						}
+					] of compilation.entries) {
+						const options = this._parseOptionsCached(
+							library !== undefined
+								? library
+								: compilation.outputOptions.library
+						);
+						if (options !== false) {
+							const dep = deps[deps.length - 1];
+							if (dep) {
+								const module = compilation.moduleGraph.getModule(dep);
+								if (module) {
+									this.finishEntryModule(module, name, {
+										options,
+										compilation,
+										chunkGraph: compilation.chunkGraph
+									});
+								}
+							}
+						}
+					}
+				}
+			);
+
+			/**
+			 * @param {Chunk} chunk chunk
+			 * @returns {T | false} options for the chunk
+			 */
+			const getOptionsForChunk = chunk => {
+				if (compilation.chunkGraph.getNumberOfEntryModules(chunk) === 0)
+					return false;
+				const options = chunk.getEntryOptions();
+				const library = options && options.library;
+				return this._parseOptionsCached(
+					library !== undefined ? library : compilation.outputOptions.library
+				);
+			};
+
+			if (
+				this.render !== AbstractLibraryPlugin.prototype.render ||
+				this.runtimeRequirements !==
+					AbstractLibraryPlugin.prototype.runtimeRequirements
+			) {
+				compilation.hooks.additionalChunkRuntimeRequirements.tap(
+					_pluginName,
+					(chunk, set, { chunkGraph }) => {
+						const options = getOptionsForChunk(chunk);
+						if (options !== false) {
+							this.runtimeRequirements(chunk, set, {
+								options,
+								compilation,
+								chunkGraph
+							});
+						}
+					}
+				);
+			}
+
+			const hooks = JavascriptModulesPlugin.getCompilationHooks(compilation);
+
+			if (this.render !== AbstractLibraryPlugin.prototype.render) {
+				hooks.render.tap(_pluginName, (source, renderContext) => {
+					const options = getOptionsForChunk(renderContext.chunk);
+					if (options === false) return source;
+					return this.render(source, renderContext, {
+						options,
+						compilation,
+						chunkGraph: compilation.chunkGraph
+					});
+				});
+			}
+
+			if (
+				this.embedInRuntimeBailout !==
+				AbstractLibraryPlugin.prototype.embedInRuntimeBailout
+			) {
+				hooks.embedInRuntimeBailout.tap(
+					_pluginName,
+					(module, renderContext) => {
+						const options = getOptionsForChunk(renderContext.chunk);
+						if (options === false) return;
+						return this.embedInRuntimeBailout(module, renderContext, {
+							options,
+							compilation,
+							chunkGraph: compilation.chunkGraph
+						});
+					}
+				);
+			}
+
+			if (
+				this.strictRuntimeBailout !==
+				AbstractLibraryPlugin.prototype.strictRuntimeBailout
+			) {
+				hooks.strictRuntimeBailout.tap(_pluginName, renderContext => {
+					const options = getOptionsForChunk(renderContext.chunk);
+					if (options === false) return;
+					return this.strictRuntimeBailout(renderContext, {
+						options,
+						compilation,
+						chunkGraph: compilation.chunkGraph
+					});
+				});
+			}
+
+			if (
+				this.renderStartup !== AbstractLibraryPlugin.prototype.renderStartup
+			) {
+				hooks.renderStartup.tap(
+					_pluginName,
+					(source, module, renderContext) => {
+						const options = getOptionsForChunk(renderContext.chunk);
+						if (options === false) return source;
+						return this.renderStartup(source, module, renderContext, {
+							options,
+							compilation,
+							chunkGraph: compilation.chunkGraph
+						});
+					}
+				);
+			}
+
+			hooks.chunkHash.tap(_pluginName, (chunk, hash, context) => {
+				const options = getOptionsForChunk(chunk);
+				if (options === false) return;
+				this.chunkHash(chunk, hash, context, {
+					options,
+					compilation,
+					chunkGraph: compilation.chunkGraph
+				});
+			});
+		});
+	}
+
+	/**
+	 * @param {LibraryOptions=} library normalized library option
+	 * @returns {T | false} preprocess as needed by overriding
+	 */
+	_parseOptionsCached(library) {
+		if (!library) return false;
+		if (library.type !== this._type) return false;
+		const cacheEntry = this._parseCache.get(library);
+		if (cacheEntry !== undefined) return cacheEntry;
+		const result = this.parseOptions(library);
+		this._parseCache.set(library, result);
+		return result;
+	}
+
+	/* istanbul ignore next */
+	/**
+	 * @abstract
+	 * @param {LibraryOptions} library normalized library option
+	 * @returns {T | false} preprocess as needed by overriding
+	 */
+	parseOptions(library) {
+		const AbstractMethodError = require("../AbstractMethodError");
+		throw new AbstractMethodError();
+	}
+
+	/**
+	 * @param {Module} module the exporting entry module
+	 * @param {string} entryName the name of the entrypoint
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {void}
+	 */
+	finishEntryModule(module, entryName, libraryContext) {}
+
+	/**
+	 * @param {Module} module the exporting entry module
+	 * @param {RenderContext} renderContext render context
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {string | undefined} bailout reason
+	 */
+	embedInRuntimeBailout(module, renderContext, libraryContext) {
+		return undefined;
+	}
+
+	/**
+	 * @param {RenderContext} renderContext render context
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {string | undefined} bailout reason
+	 */
+	strictRuntimeBailout(renderContext, libraryContext) {
+		return undefined;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {Set} set runtime requirements
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {void}
+	 */
+	runtimeRequirements(chunk, set, libraryContext) {
+		if (this.render !== AbstractLibraryPlugin.prototype.render)
+			set.add(RuntimeGlobals.returnExportsFromRuntime);
+	}
+
+	/**
+	 * @param {Source} source source
+	 * @param {RenderContext} renderContext render context
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {Source} source with library export
+	 */
+	render(source, renderContext, libraryContext) {
+		return source;
+	}
+
+	/**
+	 * @param {Source} source source
+	 * @param {Module} module module
+	 * @param {StartupRenderContext} renderContext render context
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {Source} source with library export
+	 */
+	renderStartup(source, module, renderContext, libraryContext) {
+		return source;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {Hash} hash hash
+	 * @param {ChunkHashContext} chunkHashContext chunk hash context
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {void}
+	 */
+	chunkHash(chunk, hash, chunkHashContext, libraryContext) {
+		const options = this._parseOptionsCached(
+			libraryContext.compilation.outputOptions.library
+		);
+		hash.update(this._pluginName);
+		hash.update(JSON.stringify(options));
+	}
+}
+
+AbstractLibraryPlugin.COMMON_LIBRARY_NAME_MESSAGE = COMMON_LIBRARY_NAME_MESSAGE;
+module.exports = AbstractLibraryPlugin;
diff --git a/lib/library/AmdLibraryPlugin.js b/lib/library/AmdLibraryPlugin.js
new file mode 100644
index 00000000000..d604c036c77
--- /dev/null
+++ b/lib/library/AmdLibraryPlugin.js
@@ -0,0 +1,178 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { ConcatSource } = require("webpack-sources");
+const ExternalModule = require("../ExternalModule");
+const Template = require("../Template");
+const AbstractLibraryPlugin = require("./AbstractLibraryPlugin");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryOptions} LibraryOptions */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryType} LibraryType */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compilation").ChunkHashContext} ChunkHashContext */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../javascript/JavascriptModulesPlugin").RenderContext} RenderContext */
+/** @typedef {import("../util/Hash")} Hash */
+/** @template T @typedef {import("./AbstractLibraryPlugin").LibraryContext} LibraryContext */
+
+/**
+ * @typedef {object} AmdLibraryPluginOptions
+ * @property {LibraryType} type
+ * @property {boolean=} requireAsWrapper
+ */
+
+/**
+ * @typedef {object} AmdLibraryPluginParsed
+ * @property {string} name
+ * @property {string} amdContainer
+ */
+
+/**
+ * @typedef {AmdLibraryPluginParsed} T
+ * @extends {AbstractLibraryPlugin}
+ */
+class AmdLibraryPlugin extends AbstractLibraryPlugin {
+	/**
+	 * @param {AmdLibraryPluginOptions} options the plugin options
+	 */
+	constructor(options) {
+		super({
+			pluginName: "AmdLibraryPlugin",
+			type: options.type
+		});
+		this.requireAsWrapper = options.requireAsWrapper;
+	}
+
+	/**
+	 * @param {LibraryOptions} library normalized library option
+	 * @returns {T | false} preprocess as needed by overriding
+	 */
+	parseOptions(library) {
+		const { name, amdContainer } = library;
+		if (this.requireAsWrapper) {
+			if (name) {
+				throw new Error(
+					`AMD library name must be unset. ${AbstractLibraryPlugin.COMMON_LIBRARY_NAME_MESSAGE}`
+				);
+			}
+		} else if (name && typeof name !== "string") {
+			throw new Error(
+				`AMD library name must be a simple string or unset. ${AbstractLibraryPlugin.COMMON_LIBRARY_NAME_MESSAGE}`
+			);
+		}
+		const _name = /** @type {string} */ (name);
+		const _amdContainer = /** @type {string} */ (amdContainer);
+		return { name: _name, amdContainer: _amdContainer };
+	}
+
+	/**
+	 * @param {Source} source source
+	 * @param {RenderContext} renderContext render context
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {Source} source with library export
+	 */
+	render(
+		source,
+		{ chunkGraph, chunk, runtimeTemplate },
+		{ options, compilation }
+	) {
+		const modern = runtimeTemplate.supportsArrowFunction();
+		const modules = chunkGraph
+			.getChunkModules(chunk)
+			.filter(
+				m =>
+					m instanceof ExternalModule &&
+					(m.externalType === "amd" || m.externalType === "amd-require")
+			);
+		const externals = /** @type {ExternalModule[]} */ (modules);
+		const externalsDepsArray = JSON.stringify(
+			externals.map(m =>
+				typeof m.request === "object" && !Array.isArray(m.request)
+					? m.request.amd
+					: m.request
+			)
+		);
+		const externalsArguments = externals
+			.map(
+				m =>
+					`__WEBPACK_EXTERNAL_MODULE_${Template.toIdentifier(
+						`${chunkGraph.getModuleId(m)}`
+					)}__`
+			)
+			.join(", ");
+
+		const iife = runtimeTemplate.isIIFE();
+		const fnStart =
+			(modern
+				? `(${externalsArguments}) => {`
+				: `function(${externalsArguments}) {`) +
+			(iife || !chunk.hasRuntime() ? " return " : "\n");
+		const fnEnd = iife ? ";\n}" : "\n}";
+
+		let amdContainerPrefix = "";
+		if (options.amdContainer) {
+			amdContainerPrefix = `${options.amdContainer}.`;
+		}
+
+		if (this.requireAsWrapper) {
+			return new ConcatSource(
+				`${amdContainerPrefix}require(${externalsDepsArray}, ${fnStart}`,
+				source,
+				`${fnEnd});`
+			);
+		} else if (options.name) {
+			const name = compilation.getPath(options.name, {
+				chunk
+			});
+
+			return new ConcatSource(
+				`${amdContainerPrefix}define(${JSON.stringify(
+					name
+				)}, ${externalsDepsArray}, ${fnStart}`,
+				source,
+				`${fnEnd});`
+			);
+		} else if (externalsArguments) {
+			return new ConcatSource(
+				`${amdContainerPrefix}define(${externalsDepsArray}, ${fnStart}`,
+				source,
+				`${fnEnd});`
+			);
+		}
+		return new ConcatSource(
+			`${amdContainerPrefix}define(${fnStart}`,
+			source,
+			`${fnEnd});`
+		);
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {Hash} hash hash
+	 * @param {ChunkHashContext} chunkHashContext chunk hash context
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {void}
+	 */
+	chunkHash(chunk, hash, chunkHashContext, { options, compilation }) {
+		hash.update("AmdLibraryPlugin");
+		if (this.requireAsWrapper) {
+			hash.update("requireAsWrapper");
+		} else if (options.name) {
+			hash.update("named");
+			const name = compilation.getPath(options.name, {
+				chunk
+			});
+			hash.update(name);
+		} else if (options.amdContainer) {
+			hash.update("amdContainer");
+			hash.update(options.amdContainer);
+		}
+	}
+}
+
+module.exports = AmdLibraryPlugin;
diff --git a/lib/library/AssignLibraryPlugin.js b/lib/library/AssignLibraryPlugin.js
new file mode 100644
index 00000000000..e7d3d761159
--- /dev/null
+++ b/lib/library/AssignLibraryPlugin.js
@@ -0,0 +1,415 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { ConcatSource } = require("webpack-sources");
+const { UsageState } = require("../ExportsInfo");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+const propertyAccess = require("../util/propertyAccess");
+const { getEntryRuntime } = require("../util/runtime");
+const AbstractLibraryPlugin = require("./AbstractLibraryPlugin");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryOptions} LibraryOptions */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryType} LibraryType */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Compilation").ChunkHashContext} ChunkHashContext */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../javascript/JavascriptModulesPlugin").RenderContext} RenderContext */
+/** @typedef {import("../javascript/JavascriptModulesPlugin").StartupRenderContext} StartupRenderContext */
+/** @typedef {import("../util/Hash")} Hash */
+/** @template T @typedef {import("./AbstractLibraryPlugin").LibraryContext} LibraryContext */
+
+const KEYWORD_REGEX =
+	/^(await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|function|if|implements|import|in|instanceof|interface|let|new|null|package|private|protected|public|return|super|switch|static|this|throw|try|true|typeof|var|void|while|with|yield)$/;
+const IDENTIFIER_REGEX =
+	/^[\p{L}\p{Nl}$_][\p{L}\p{Nl}$\p{Mn}\p{Mc}\p{Nd}\p{Pc}]*$/iu;
+
+/**
+ * Validates the library name by checking for keywords and valid characters
+ * @param {string} name name to be validated
+ * @returns {boolean} true, when valid
+ */
+const isNameValid = name =>
+	!KEYWORD_REGEX.test(name) && IDENTIFIER_REGEX.test(name);
+
+/**
+ * @param {string[]} accessor variable plus properties
+ * @param {number} existingLength items of accessor that are existing already
+ * @param {boolean=} initLast if the last property should also be initialized to an object
+ * @returns {string} code to access the accessor while initializing
+ */
+const accessWithInit = (accessor, existingLength, initLast = false) => {
+	// This generates for [a, b, c, d]:
+	// (((a = typeof a === "undefined" ? {} : a).b = a.b || {}).c = a.b.c || {}).d
+	const base = accessor[0];
+	if (accessor.length === 1 && !initLast) return base;
+	let current =
+		existingLength > 0
+			? base
+			: `(${base} = typeof ${base} === "undefined" ? {} : ${base})`;
+
+	// i is the current position in accessor that has been printed
+	let i = 1;
+
+	// all properties printed so far (excluding base)
+	/** @type {string[] | undefined} */
+	let propsSoFar;
+
+	// if there is existingLength, print all properties until this position as property access
+	if (existingLength > i) {
+		propsSoFar = accessor.slice(1, existingLength);
+		i = existingLength;
+		current += propertyAccess(propsSoFar);
+	} else {
+		propsSoFar = [];
+	}
+
+	// all remaining properties (except the last one when initLast is not set)
+	// should be printed as initializer
+	const initUntil = initLast ? accessor.length : accessor.length - 1;
+	for (; i < initUntil; i++) {
+		const prop = accessor[i];
+		propsSoFar.push(prop);
+		current = `(${current}${propertyAccess([prop])} = ${base}${propertyAccess(
+			propsSoFar
+		)} || {})`;
+	}
+
+	// print the last property as property access if not yet printed
+	if (i < accessor.length)
+		current = `${current}${propertyAccess([accessor[accessor.length - 1]])}`;
+
+	return current;
+};
+
+/**
+ * @typedef {object} AssignLibraryPluginOptions
+ * @property {LibraryType} type
+ * @property {string[] | "global"} prefix name prefix
+ * @property {string | false} declare declare name as variable
+ * @property {"error"|"static"|"copy"|"assign"} unnamed behavior for unnamed library name
+ * @property {"copy"|"assign"=} named behavior for named library name
+ */
+
+/**
+ * @typedef {object} AssignLibraryPluginParsed
+ * @property {string | string[]} name
+ * @property {string | string[] | undefined} export
+ */
+
+/**
+ * @typedef {AssignLibraryPluginParsed} T
+ * @extends {AbstractLibraryPlugin}
+ */
+class AssignLibraryPlugin extends AbstractLibraryPlugin {
+	/**
+	 * @param {AssignLibraryPluginOptions} options the plugin options
+	 */
+	constructor(options) {
+		super({
+			pluginName: "AssignLibraryPlugin",
+			type: options.type
+		});
+		this.prefix = options.prefix;
+		this.declare = options.declare;
+		this.unnamed = options.unnamed;
+		this.named = options.named || "assign";
+	}
+
+	/**
+	 * @param {LibraryOptions} library normalized library option
+	 * @returns {T | false} preprocess as needed by overriding
+	 */
+	parseOptions(library) {
+		const { name } = library;
+		if (this.unnamed === "error") {
+			if (typeof name !== "string" && !Array.isArray(name)) {
+				throw new Error(
+					`Library name must be a string or string array. ${AbstractLibraryPlugin.COMMON_LIBRARY_NAME_MESSAGE}`
+				);
+			}
+		} else if (name && typeof name !== "string" && !Array.isArray(name)) {
+			throw new Error(
+				`Library name must be a string, string array or unset. ${AbstractLibraryPlugin.COMMON_LIBRARY_NAME_MESSAGE}`
+			);
+		}
+		const _name = /** @type {string | string[]} */ (name);
+		return {
+			name: _name,
+			export: library.export
+		};
+	}
+
+	/**
+	 * @param {Module} module the exporting entry module
+	 * @param {string} entryName the name of the entrypoint
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {void}
+	 */
+	finishEntryModule(
+		module,
+		entryName,
+		{ options, compilation, compilation: { moduleGraph } }
+	) {
+		const runtime = getEntryRuntime(compilation, entryName);
+		if (options.export) {
+			const exportsInfo = moduleGraph.getExportInfo(
+				module,
+				Array.isArray(options.export) ? options.export[0] : options.export
+			);
+			exportsInfo.setUsed(UsageState.Used, runtime);
+			exportsInfo.canMangleUse = false;
+		} else {
+			const exportsInfo = moduleGraph.getExportsInfo(module);
+			exportsInfo.setUsedInUnknownWay(runtime);
+		}
+		moduleGraph.addExtraReason(module, "used as library export");
+	}
+
+	/**
+	 * @param {Compilation} compilation the compilation
+	 * @returns {string[]} the prefix
+	 */
+	_getPrefix(compilation) {
+		return this.prefix === "global"
+			? [compilation.runtimeTemplate.globalObject]
+			: this.prefix;
+	}
+
+	/**
+	 * @param {AssignLibraryPluginParsed} options the library options
+	 * @param {Chunk} chunk the chunk
+	 * @param {Compilation} compilation the compilation
+	 * @returns {Array} the resolved full name
+	 */
+	_getResolvedFullName(options, chunk, compilation) {
+		const prefix = this._getPrefix(compilation);
+		const fullName = options.name ? prefix.concat(options.name) : prefix;
+		return fullName.map(n =>
+			compilation.getPath(n, {
+				chunk
+			})
+		);
+	}
+
+	/**
+	 * @param {Source} source source
+	 * @param {RenderContext} renderContext render context
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {Source} source with library export
+	 */
+	render(source, { chunk }, { options, compilation }) {
+		const fullNameResolved = this._getResolvedFullName(
+			options,
+			chunk,
+			compilation
+		);
+		if (this.declare) {
+			const base = fullNameResolved[0];
+			if (!isNameValid(base)) {
+				throw new Error(
+					`Library name base (${base}) must be a valid identifier when using a var declaring library type. Either use a valid identifier (e. g. ${Template.toIdentifier(
+						base
+					)}) or use a different library type (e. g. 'type: "global"', which assign a property on the global scope instead of declaring a variable). ${
+						AbstractLibraryPlugin.COMMON_LIBRARY_NAME_MESSAGE
+					}`
+				);
+			}
+			source = new ConcatSource(`${this.declare} ${base};\n`, source);
+		}
+		return source;
+	}
+
+	/**
+	 * @param {Module} module the exporting entry module
+	 * @param {RenderContext} renderContext render context
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {string | undefined} bailout reason
+	 */
+	embedInRuntimeBailout(
+		module,
+		{ chunk, codeGenerationResults },
+		{ options, compilation }
+	) {
+		const { data } = codeGenerationResults.get(module, chunk.runtime);
+		const topLevelDeclarations =
+			(data && data.get("topLevelDeclarations")) ||
+			(module.buildInfo && module.buildInfo.topLevelDeclarations);
+		if (!topLevelDeclarations)
+			return "it doesn't tell about top level declarations.";
+		const fullNameResolved = this._getResolvedFullName(
+			options,
+			chunk,
+			compilation
+		);
+		const base = fullNameResolved[0];
+		if (topLevelDeclarations.has(base))
+			return `it declares '${base}' on top-level, which conflicts with the current library output.`;
+	}
+
+	/**
+	 * @param {RenderContext} renderContext render context
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {string | undefined} bailout reason
+	 */
+	strictRuntimeBailout({ chunk }, { options, compilation }) {
+		if (
+			this.declare ||
+			this.prefix === "global" ||
+			this.prefix.length > 0 ||
+			!options.name
+		) {
+			return;
+		}
+		return "a global variable is assign and maybe created";
+	}
+
+	/**
+	 * @param {Source} source source
+	 * @param {Module} module module
+	 * @param {StartupRenderContext} renderContext render context
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {Source} source with library export
+	 */
+	renderStartup(
+		source,
+		module,
+		{ moduleGraph, chunk },
+		{ options, compilation }
+	) {
+		const fullNameResolved = this._getResolvedFullName(
+			options,
+			chunk,
+			compilation
+		);
+		const staticExports = this.unnamed === "static";
+		const exportAccess = options.export
+			? propertyAccess(
+					Array.isArray(options.export) ? options.export : [options.export]
+				)
+			: "";
+		const result = new ConcatSource(source);
+		if (staticExports) {
+			const exportsInfo = moduleGraph.getExportsInfo(module);
+			const exportTarget = accessWithInit(
+				fullNameResolved,
+				this._getPrefix(compilation).length,
+				true
+			);
+
+			/** @type {string[]} */
+			const provided = [];
+			for (const exportInfo of exportsInfo.orderedExports) {
+				if (!exportInfo.provided) continue;
+				const nameAccess = propertyAccess([exportInfo.name]);
+				result.add(
+					`${exportTarget}${nameAccess} = ${RuntimeGlobals.exports}${exportAccess}${nameAccess};\n`
+				);
+				provided.push(exportInfo.name);
+			}
+
+			const webpackExportTarget = accessWithInit(
+				fullNameResolved,
+				this._getPrefix(compilation).length,
+				true
+			);
+			/** @type {string} */
+			let exports = RuntimeGlobals.exports;
+			if (exportAccess) {
+				result.add(
+					`var __webpack_exports_export__ = ${RuntimeGlobals.exports}${exportAccess};\n`
+				);
+				exports = "__webpack_exports_export__";
+			}
+			result.add(`for(var __webpack_i__ in ${exports}) {\n`);
+			const hasProvided = provided.length > 0;
+			if (hasProvided) {
+				result.add(
+					`  if (${JSON.stringify(provided)}.indexOf(__webpack_i__) === -1) {\n`
+				);
+			}
+			result.add(
+				`  ${hasProvided ? "  " : ""}${webpackExportTarget}[__webpack_i__] = ${exports}[__webpack_i__];\n`
+			);
+			result.add(hasProvided ? "  }\n}\n" : "\n");
+			result.add(
+				`Object.defineProperty(${exportTarget}, "__esModule", { value: true });\n`
+			);
+		} else if (options.name ? this.named === "copy" : this.unnamed === "copy") {
+			result.add(
+				`var __webpack_export_target__ = ${accessWithInit(
+					fullNameResolved,
+					this._getPrefix(compilation).length,
+					true
+				)};\n`
+			);
+			/** @type {string} */
+			let exports = RuntimeGlobals.exports;
+			if (exportAccess) {
+				result.add(
+					`var __webpack_exports_export__ = ${RuntimeGlobals.exports}${exportAccess};\n`
+				);
+				exports = "__webpack_exports_export__";
+			}
+			result.add(
+				`for(var __webpack_i__ in ${exports}) __webpack_export_target__[__webpack_i__] = ${exports}[__webpack_i__];\n`
+			);
+			result.add(
+				`if(${exports}.__esModule) Object.defineProperty(__webpack_export_target__, "__esModule", { value: true });\n`
+			);
+		} else {
+			result.add(
+				`${accessWithInit(
+					fullNameResolved,
+					this._getPrefix(compilation).length,
+					false
+				)} = ${RuntimeGlobals.exports}${exportAccess};\n`
+			);
+		}
+		return result;
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {Set} set runtime requirements
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {void}
+	 */
+	runtimeRequirements(chunk, set, libraryContext) {
+		set.add(RuntimeGlobals.exports);
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {Hash} hash hash
+	 * @param {ChunkHashContext} chunkHashContext chunk hash context
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {void}
+	 */
+	chunkHash(chunk, hash, chunkHashContext, { options, compilation }) {
+		hash.update("AssignLibraryPlugin");
+		const fullNameResolved = this._getResolvedFullName(
+			options,
+			chunk,
+			compilation
+		);
+		if (options.name ? this.named === "copy" : this.unnamed === "copy") {
+			hash.update("copy");
+		}
+		if (this.declare) {
+			hash.update(this.declare);
+		}
+		hash.update(fullNameResolved.join("."));
+		if (options.export) {
+			hash.update(`${options.export}`);
+		}
+	}
+}
+
+module.exports = AssignLibraryPlugin;
diff --git a/lib/library/EnableLibraryPlugin.js b/lib/library/EnableLibraryPlugin.js
new file mode 100644
index 00000000000..0b87737b176
--- /dev/null
+++ b/lib/library/EnableLibraryPlugin.js
@@ -0,0 +1,289 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+/** @typedef {import("../../declarations/WebpackOptions").LibraryOptions} LibraryOptions */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryType} LibraryType */
+/** @typedef {import("../Compiler")} Compiler */
+
+/** @type {WeakMap>} */
+const enabledTypes = new WeakMap();
+
+/**
+ * @typedef {object} EnableLibraryPluginOptions
+ * @property {() => void=} additionalApply function that runs when applying the current plugin.
+ */
+
+/**
+ * @param {Compiler} compiler the compiler instance
+ * @returns {Set} enabled types
+ */
+const getEnabledTypes = compiler => {
+	let set = enabledTypes.get(compiler);
+	if (set === undefined) {
+		set = new Set();
+		enabledTypes.set(compiler, set);
+	}
+	return set;
+};
+
+class EnableLibraryPlugin {
+	/**
+	 * @param {LibraryType} type library type that should be available
+	 * @param {EnableLibraryPluginOptions} options options of EnableLibraryPlugin
+	 */
+	constructor(type, options = {}) {
+		/** @type {LibraryType} */
+		this.type = type;
+		/** @type {EnableLibraryPluginOptions} */
+		this.options = options;
+	}
+
+	/**
+	 * @param {Compiler} compiler the compiler instance
+	 * @param {LibraryType} type type of library
+	 * @returns {void}
+	 */
+	static setEnabled(compiler, type) {
+		getEnabledTypes(compiler).add(type);
+	}
+
+	/**
+	 * @param {Compiler} compiler the compiler instance
+	 * @param {LibraryType} type type of library
+	 * @returns {void}
+	 */
+	static checkEnabled(compiler, type) {
+		if (!getEnabledTypes(compiler).has(type)) {
+			throw new Error(
+				`Library type "${type}" is not enabled. ` +
+					"EnableLibraryPlugin need to be used to enable this type of library. " +
+					'This usually happens through the "output.enabledLibraryTypes" option. ' +
+					'If you are using a function as entry which sets "library", you need to add all potential library types to "output.enabledLibraryTypes". ' +
+					`These types are enabled: ${Array.from(
+						getEnabledTypes(compiler)
+					).join(", ")}`
+			);
+		}
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		const { type, options } = this;
+
+		// Only enable once
+		const enabled = getEnabledTypes(compiler);
+		if (enabled.has(type)) return;
+		enabled.add(type);
+
+		if (typeof options.additionalApply === "function") {
+			options.additionalApply();
+		}
+
+		if (typeof type === "string") {
+			const enableExportProperty = () => {
+				const ExportPropertyTemplatePlugin = require("./ExportPropertyLibraryPlugin");
+				new ExportPropertyTemplatePlugin({
+					type,
+					nsObjectUsed: !["module", "modern-module"].includes(type),
+					runtimeExportsUsed: !["module", "modern-module"].includes(type),
+					renderStartupUsed: !["module", "modern-module"].includes(type)
+				}).apply(compiler);
+			};
+			switch (type) {
+				case "var": {
+					// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+					const AssignLibraryPlugin = require("./AssignLibraryPlugin");
+					new AssignLibraryPlugin({
+						type,
+						prefix: [],
+						declare: "var",
+						unnamed: "error"
+					}).apply(compiler);
+					break;
+				}
+				case "assign-properties": {
+					// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+					const AssignLibraryPlugin = require("./AssignLibraryPlugin");
+					new AssignLibraryPlugin({
+						type,
+						prefix: [],
+						declare: false,
+						unnamed: "error",
+						named: "copy"
+					}).apply(compiler);
+					break;
+				}
+				case "assign": {
+					// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+					const AssignLibraryPlugin = require("./AssignLibraryPlugin");
+					new AssignLibraryPlugin({
+						type,
+						prefix: [],
+						declare: false,
+						unnamed: "error"
+					}).apply(compiler);
+					break;
+				}
+				case "this": {
+					// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+					const AssignLibraryPlugin = require("./AssignLibraryPlugin");
+					new AssignLibraryPlugin({
+						type,
+						prefix: ["this"],
+						declare: false,
+						unnamed: "copy"
+					}).apply(compiler);
+					break;
+				}
+				case "window": {
+					// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+					const AssignLibraryPlugin = require("./AssignLibraryPlugin");
+					new AssignLibraryPlugin({
+						type,
+						prefix: ["window"],
+						declare: false,
+						unnamed: "copy"
+					}).apply(compiler);
+					break;
+				}
+				case "self": {
+					// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+					const AssignLibraryPlugin = require("./AssignLibraryPlugin");
+					new AssignLibraryPlugin({
+						type,
+						prefix: ["self"],
+						declare: false,
+						unnamed: "copy"
+					}).apply(compiler);
+					break;
+				}
+				case "global": {
+					// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+					const AssignLibraryPlugin = require("./AssignLibraryPlugin");
+					new AssignLibraryPlugin({
+						type,
+						prefix: "global",
+						declare: false,
+						unnamed: "copy"
+					}).apply(compiler);
+					break;
+				}
+				case "commonjs": {
+					// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+					const AssignLibraryPlugin = require("./AssignLibraryPlugin");
+					new AssignLibraryPlugin({
+						type,
+						prefix: ["exports"],
+						declare: false,
+						unnamed: "copy"
+					}).apply(compiler);
+					break;
+				}
+				case "commonjs-static": {
+					// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+					const AssignLibraryPlugin = require("./AssignLibraryPlugin");
+					new AssignLibraryPlugin({
+						type,
+						prefix: ["exports"],
+						declare: false,
+						unnamed: "static"
+					}).apply(compiler);
+					break;
+				}
+				case "commonjs2":
+				case "commonjs-module": {
+					// @ts-expect-error https://github.com/microsoft/TypeScript/issues/41697
+					const AssignLibraryPlugin = require("./AssignLibraryPlugin");
+					new AssignLibraryPlugin({
+						type,
+						prefix: ["module", "exports"],
+						declare: false,
+						unnamed: "assign"
+					}).apply(compiler);
+					break;
+				}
+				case "amd":
+				case "amd-require": {
+					enableExportProperty();
+					const AmdLibraryPlugin = require("./AmdLibraryPlugin");
+					new AmdLibraryPlugin({
+						type,
+						requireAsWrapper: type === "amd-require"
+					}).apply(compiler);
+					break;
+				}
+				case "umd":
+				case "umd2": {
+					if (compiler.options.output.iife === false) {
+						compiler.options.output.iife = true;
+
+						class WarnFalseIifeUmdPlugin {
+							/**
+							 * @param {Compiler} compiler the compiler instance
+							 */
+							apply(compiler) {
+								compiler.hooks.thisCompilation.tap(
+									"WarnFalseIifeUmdPlugin",
+									compilation => {
+										const FalseIIFEUmdWarning = require("../FalseIIFEUmdWarning");
+										compilation.warnings.push(new FalseIIFEUmdWarning());
+									}
+								);
+							}
+						}
+
+						new WarnFalseIifeUmdPlugin().apply(compiler);
+					}
+					enableExportProperty();
+					const UmdLibraryPlugin = require("./UmdLibraryPlugin");
+					new UmdLibraryPlugin({
+						type,
+						optionalAmdExternalAsGlobal: type === "umd2"
+					}).apply(compiler);
+					break;
+				}
+				case "system": {
+					enableExportProperty();
+					const SystemLibraryPlugin = require("./SystemLibraryPlugin");
+					new SystemLibraryPlugin({
+						type
+					}).apply(compiler);
+					break;
+				}
+				case "jsonp": {
+					enableExportProperty();
+					const JsonpLibraryPlugin = require("./JsonpLibraryPlugin");
+					new JsonpLibraryPlugin({
+						type
+					}).apply(compiler);
+					break;
+				}
+				case "module":
+				case "modern-module": {
+					enableExportProperty();
+					const ModuleLibraryPlugin = require("./ModuleLibraryPlugin");
+					new ModuleLibraryPlugin({
+						type
+					}).apply(compiler);
+					break;
+				}
+				default:
+					throw new Error(`Unsupported library type ${type}.
+Plugins which provide custom library types must call EnableLibraryPlugin.setEnabled(compiler, type) to disable this error.`);
+			}
+		} else {
+			// TODO support plugin instances here
+			// apply them to the compiler
+		}
+	}
+}
+
+module.exports = EnableLibraryPlugin;
diff --git a/lib/library/ExportPropertyLibraryPlugin.js b/lib/library/ExportPropertyLibraryPlugin.js
new file mode 100644
index 00000000000..8825bc08967
--- /dev/null
+++ b/lib/library/ExportPropertyLibraryPlugin.js
@@ -0,0 +1,125 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { ConcatSource } = require("webpack-sources");
+const { UsageState } = require("../ExportsInfo");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const propertyAccess = require("../util/propertyAccess");
+const { getEntryRuntime } = require("../util/runtime");
+const AbstractLibraryPlugin = require("./AbstractLibraryPlugin");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryOptions} LibraryOptions */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryType} LibraryType */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../javascript/JavascriptModulesPlugin").StartupRenderContext} StartupRenderContext */
+/** @template T @typedef {import("./AbstractLibraryPlugin").LibraryContext} LibraryContext */
+
+/**
+ * @typedef {object} ExportPropertyLibraryPluginParsed
+ * @property {string | string[]} export
+ */
+
+/**
+ * @typedef {object} ExportPropertyLibraryPluginOptions
+ * @property {LibraryType} type
+ * @property {boolean} nsObjectUsed the namespace object is used
+ * @property {boolean} runtimeExportsUsed runtime exports are used
+ * @property {boolean} renderStartupUsed render startup is used
+ */
+/**
+ * @typedef {ExportPropertyLibraryPluginParsed} T
+ * @extends {AbstractLibraryPlugin}
+ */
+class ExportPropertyLibraryPlugin extends AbstractLibraryPlugin {
+	/**
+	 * @param {ExportPropertyLibraryPluginOptions} options options
+	 */
+	constructor({ type, nsObjectUsed, runtimeExportsUsed, renderStartupUsed }) {
+		super({
+			pluginName: "ExportPropertyLibraryPlugin",
+			type
+		});
+		this.nsObjectUsed = nsObjectUsed;
+		this.runtimeExportsUsed = runtimeExportsUsed;
+		this.renderStartupUsed = renderStartupUsed;
+	}
+
+	/**
+	 * @param {LibraryOptions} library normalized library option
+	 * @returns {T | false} preprocess as needed by overriding
+	 */
+	parseOptions(library) {
+		return {
+			export: /** @type {string | string[]} */ (library.export)
+		};
+	}
+
+	/**
+	 * @param {Module} module the exporting entry module
+	 * @param {string} entryName the name of the entrypoint
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {void}
+	 */
+	finishEntryModule(
+		module,
+		entryName,
+		{ options, compilation, compilation: { moduleGraph } }
+	) {
+		const runtime = getEntryRuntime(compilation, entryName);
+		if (options.export) {
+			const exportsInfo = moduleGraph.getExportInfo(
+				module,
+				Array.isArray(options.export) ? options.export[0] : options.export
+			);
+			exportsInfo.setUsed(UsageState.Used, runtime);
+			exportsInfo.canMangleUse = false;
+		} else {
+			const exportsInfo = moduleGraph.getExportsInfo(module);
+			if (this.nsObjectUsed) {
+				exportsInfo.setUsedInUnknownWay(runtime);
+			} else {
+				exportsInfo.setAllKnownExportsUsed(runtime);
+			}
+		}
+		moduleGraph.addExtraReason(module, "used as library export");
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {Set} set runtime requirements
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {void}
+	 */
+	runtimeRequirements(chunk, set, libraryContext) {
+		if (this.runtimeExportsUsed) {
+			set.add(RuntimeGlobals.exports);
+		}
+	}
+
+	/**
+	 * @param {Source} source source
+	 * @param {Module} module module
+	 * @param {StartupRenderContext} renderContext render context
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {Source} source with library export
+	 */
+	renderStartup(source, module, renderContext, { options }) {
+		if (!this.renderStartupUsed) return source;
+		if (!options.export) return source;
+		const postfix = `${RuntimeGlobals.exports} = ${
+			RuntimeGlobals.exports
+		}${propertyAccess(
+			Array.isArray(options.export) ? options.export : [options.export]
+		)};\n`;
+		return new ConcatSource(source, postfix);
+	}
+}
+
+module.exports = ExportPropertyLibraryPlugin;
diff --git a/lib/library/JsonpLibraryPlugin.js b/lib/library/JsonpLibraryPlugin.js
new file mode 100644
index 00000000000..9757874232d
--- /dev/null
+++ b/lib/library/JsonpLibraryPlugin.js
@@ -0,0 +1,89 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { ConcatSource } = require("webpack-sources");
+const AbstractLibraryPlugin = require("./AbstractLibraryPlugin");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryOptions} LibraryOptions */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryType} LibraryType */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compilation").ChunkHashContext} ChunkHashContext */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../javascript/JavascriptModulesPlugin").RenderContext} RenderContext */
+/** @typedef {import("../util/Hash")} Hash */
+/** @template T @typedef {import("./AbstractLibraryPlugin").LibraryContext} LibraryContext */
+
+/**
+ * @typedef {object} JsonpLibraryPluginOptions
+ * @property {LibraryType} type
+ */
+
+/**
+ * @typedef {object} JsonpLibraryPluginParsed
+ * @property {string} name
+ */
+
+/**
+ * @typedef {JsonpLibraryPluginParsed} T
+ * @extends {AbstractLibraryPlugin}
+ */
+class JsonpLibraryPlugin extends AbstractLibraryPlugin {
+	/**
+	 * @param {JsonpLibraryPluginOptions} options the plugin options
+	 */
+	constructor(options) {
+		super({
+			pluginName: "JsonpLibraryPlugin",
+			type: options.type
+		});
+	}
+
+	/**
+	 * @param {LibraryOptions} library normalized library option
+	 * @returns {T | false} preprocess as needed by overriding
+	 */
+	parseOptions(library) {
+		const { name } = library;
+		if (typeof name !== "string") {
+			throw new Error(
+				`Jsonp library name must be a simple string. ${AbstractLibraryPlugin.COMMON_LIBRARY_NAME_MESSAGE}`
+			);
+		}
+		const _name = /** @type {string} */ (name);
+		return {
+			name: _name
+		};
+	}
+
+	/**
+	 * @param {Source} source source
+	 * @param {RenderContext} renderContext render context
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {Source} source with library export
+	 */
+	render(source, { chunk }, { options, compilation }) {
+		const name = compilation.getPath(options.name, {
+			chunk
+		});
+		return new ConcatSource(`${name}(`, source, ")");
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {Hash} hash hash
+	 * @param {ChunkHashContext} chunkHashContext chunk hash context
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {void}
+	 */
+	chunkHash(chunk, hash, chunkHashContext, { options, compilation }) {
+		hash.update("JsonpLibraryPlugin");
+		hash.update(compilation.getPath(options.name, { chunk }));
+	}
+}
+
+module.exports = JsonpLibraryPlugin;
diff --git a/lib/library/ModuleLibraryPlugin.js b/lib/library/ModuleLibraryPlugin.js
new file mode 100644
index 00000000000..e6af67615e1
--- /dev/null
+++ b/lib/library/ModuleLibraryPlugin.js
@@ -0,0 +1,241 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { ConcatSource } = require("webpack-sources");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+const ConcatenatedModule = require("../optimize/ConcatenatedModule");
+const propertyAccess = require("../util/propertyAccess");
+const AbstractLibraryPlugin = require("./AbstractLibraryPlugin");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryOptions} LibraryOptions */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryType} LibraryType */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compilation").ChunkHashContext} ChunkHashContext */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
+/** @typedef {import("../javascript/JavascriptModulesPlugin").StartupRenderContext} StartupRenderContext */
+/** @typedef {import("../util/Hash")} Hash */
+
+/**
+ * @template T
+ * @typedef {import("./AbstractLibraryPlugin").LibraryContext} LibraryContext
+ */
+
+/**
+ * @typedef {object} ModuleLibraryPluginOptions
+ * @property {LibraryType} type
+ */
+
+/**
+ * @typedef {object} ModuleLibraryPluginParsed
+ * @property {string} name
+ * @property {string | string[]=} export
+ */
+
+const PLUGIN_NAME = "ModuleLibraryPlugin";
+
+/**
+ * @typedef {ModuleLibraryPluginParsed} T
+ * @extends {AbstractLibraryPlugin}
+ */
+class ModuleLibraryPlugin extends AbstractLibraryPlugin {
+	/**
+	 * @param {ModuleLibraryPluginOptions} options the plugin options
+	 */
+	constructor(options) {
+		super({
+			pluginName: "ModuleLibraryPlugin",
+			type: options.type
+		});
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		super.apply(compiler);
+
+		compiler.hooks.thisCompilation.tap(PLUGIN_NAME, compilation => {
+			const { exportsDefinitions } =
+				ConcatenatedModule.getCompilationHooks(compilation);
+			exportsDefinitions.tap(PLUGIN_NAME, (definitions, module) => {
+				// If we have connections not all modules were concatenated, so we need the wrapper
+				const connections =
+					compilation.moduleGraph.getIncomingConnections(module);
+
+				for (const connection of connections) {
+					if (connection.originModule) {
+						return false;
+					}
+				}
+
+				// Runtime and splitting chunks now requires the wrapper too
+				for (const chunk of compilation.chunkGraph.getModuleChunksIterable(
+					module
+				)) {
+					if (
+						!chunk.hasRuntime() ||
+						compilation.chunkGraph.getNumberOfEntryModules(chunk) > 1
+					) {
+						return false;
+					}
+				}
+
+				return true;
+			});
+		});
+	}
+
+	/**
+	 * @param {LibraryOptions} library normalized library option
+	 * @returns {T | false} preprocess as needed by overriding
+	 */
+	parseOptions(library) {
+		const { name } = library;
+		if (name) {
+			throw new Error(
+				`Library name must be unset. ${AbstractLibraryPlugin.COMMON_LIBRARY_NAME_MESSAGE}`
+			);
+		}
+		const _name = /** @type {string} */ (name);
+		return {
+			name: _name,
+			export: library.export
+		};
+	}
+
+	/**
+	 * @param {Source} source source
+	 * @param {Module} module module
+	 * @param {StartupRenderContext} renderContext render context
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {Source} source with library export
+	 */
+	renderStartup(
+		source,
+		module,
+		{ moduleGraph, chunk, codeGenerationResults },
+		{ options, compilation }
+	) {
+		const result = new ConcatSource(source);
+		const exportsInfo = options.export
+			? [
+					moduleGraph.getExportInfo(
+						module,
+						Array.isArray(options.export) ? options.export[0] : options.export
+					)
+				]
+			: moduleGraph.getExportsInfo(module).orderedExports;
+		const definitions =
+			/** @type {BuildMeta} */
+			(module.buildMeta).exportsFinalName || {};
+		/** @type {string[]} */
+		const shortHandedExports = [];
+		/** @type {[string, string][]} */
+		const exports = [];
+		const isAsync = moduleGraph.isAsync(module);
+
+		if (isAsync) {
+			result.add(
+				`${RuntimeGlobals.exports} = await ${RuntimeGlobals.exports};\n`
+			);
+		}
+
+		const varType = compilation.outputOptions.environment.const
+			? "const"
+			: "var";
+
+		for (const exportInfo of exportsInfo) {
+			if (!exportInfo.provided) continue;
+
+			let shouldContinue = false;
+
+			const reexport = exportInfo.findTarget(moduleGraph, _m => true);
+
+			if (reexport) {
+				const exp = moduleGraph.getExportsInfo(reexport.module);
+
+				for (const reexportInfo of exp.orderedExports) {
+					if (
+						reexportInfo.provided === false &&
+						reexportInfo.name !== "default" &&
+						reexportInfo.name === /** @type {string[]} */ (reexport.export)[0]
+					) {
+						shouldContinue = true;
+					}
+				}
+			}
+
+			if (shouldContinue) continue;
+
+			const originalName = exportInfo.name;
+			const usedName =
+				/** @type {string} */
+				(exportInfo.getUsedName(originalName, chunk.runtime));
+			/** @type {string | undefined} */
+			const definition = definitions[usedName];
+			const finalName =
+				definition ||
+				`${RuntimeGlobals.exports}${Template.toIdentifier(originalName)}`;
+
+			if (!definition) {
+				result.add(
+					`${varType} ${finalName} = ${RuntimeGlobals.exports}${propertyAccess([
+						usedName
+					])};\n`
+				);
+			}
+
+			if (
+				finalName &&
+				(finalName.includes(".") ||
+					finalName.includes("[") ||
+					finalName.includes("("))
+			) {
+				if (exportInfo.isReexport()) {
+					const { data } = codeGenerationResults.get(module, chunk.runtime);
+					const topLevelDeclarations =
+						(data && data.get("topLevelDeclarations")) ||
+						(module.buildInfo && module.buildInfo.topLevelDeclarations);
+
+					if (topLevelDeclarations && topLevelDeclarations.has(originalName)) {
+						const name = `${RuntimeGlobals.exports}${Template.toIdentifier(originalName)}`;
+						result.add(`${varType} ${name} = ${finalName};\n`);
+						shortHandedExports.push(`${name} as ${originalName}`);
+					} else {
+						exports.push([originalName, finalName]);
+					}
+				} else {
+					exports.push([originalName, finalName]);
+				}
+			} else {
+				shortHandedExports.push(
+					definition && finalName === originalName
+						? finalName
+						: `${finalName} as ${originalName}`
+				);
+			}
+		}
+
+		if (shortHandedExports.length > 0) {
+			result.add(`export { ${shortHandedExports.join(", ")} };\n`);
+		}
+
+		for (const [exportName, final] of exports) {
+			result.add(`export ${varType} ${exportName} = ${final};\n`);
+		}
+
+		return result;
+	}
+}
+
+module.exports = ModuleLibraryPlugin;
diff --git a/lib/library/SystemLibraryPlugin.js b/lib/library/SystemLibraryPlugin.js
new file mode 100644
index 00000000000..701b870d5ea
--- /dev/null
+++ b/lib/library/SystemLibraryPlugin.js
@@ -0,0 +1,235 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Joel Denning @joeldenning
+*/
+
+"use strict";
+
+const { ConcatSource } = require("webpack-sources");
+const { UsageState } = require("../ExportsInfo");
+const ExternalModule = require("../ExternalModule");
+const Template = require("../Template");
+const propertyAccess = require("../util/propertyAccess");
+const AbstractLibraryPlugin = require("./AbstractLibraryPlugin");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryOptions} LibraryOptions */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryType} LibraryType */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compilation").ChunkHashContext} ChunkHashContext */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../javascript/JavascriptModulesPlugin").RenderContext} RenderContext */
+/** @typedef {import("../util/Hash")} Hash */
+/** @template T @typedef {import("./AbstractLibraryPlugin").LibraryContext} LibraryContext */
+
+/**
+ * @typedef {object} SystemLibraryPluginOptions
+ * @property {LibraryType} type
+ */
+
+/**
+ * @typedef {object} SystemLibraryPluginParsed
+ * @property {string} name
+ */
+
+/**
+ * @typedef {SystemLibraryPluginParsed} T
+ * @extends {AbstractLibraryPlugin}
+ */
+class SystemLibraryPlugin extends AbstractLibraryPlugin {
+	/**
+	 * @param {SystemLibraryPluginOptions} options the plugin options
+	 */
+	constructor(options) {
+		super({
+			pluginName: "SystemLibraryPlugin",
+			type: options.type
+		});
+	}
+
+	/**
+	 * @param {LibraryOptions} library normalized library option
+	 * @returns {T | false} preprocess as needed by overriding
+	 */
+	parseOptions(library) {
+		const { name } = library;
+		if (name && typeof name !== "string") {
+			throw new Error(
+				`System.js library name must be a simple string or unset. ${AbstractLibraryPlugin.COMMON_LIBRARY_NAME_MESSAGE}`
+			);
+		}
+		const _name = /** @type {string} */ (name);
+		return {
+			name: _name
+		};
+	}
+
+	/**
+	 * @param {Source} source source
+	 * @param {RenderContext} renderContext render context
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {Source} source with library export
+	 */
+	render(source, { chunkGraph, moduleGraph, chunk }, { options, compilation }) {
+		const modules = chunkGraph
+			.getChunkModules(chunk)
+			.filter(m => m instanceof ExternalModule && m.externalType === "system");
+		const externals = /** @type {ExternalModule[]} */ (modules);
+
+		// The name this bundle should be registered as with System
+		const name = options.name
+			? `${JSON.stringify(compilation.getPath(options.name, { chunk }))}, `
+			: "";
+
+		// The array of dependencies that are external to webpack and will be provided by System
+		const systemDependencies = JSON.stringify(
+			externals.map(m =>
+				typeof m.request === "object" && !Array.isArray(m.request)
+					? m.request.amd
+					: m.request
+			)
+		);
+
+		// The name of the variable provided by System for exporting
+		const dynamicExport = "__WEBPACK_DYNAMIC_EXPORT__";
+
+		// An array of the internal variable names for the webpack externals
+		const externalWebpackNames = externals.map(
+			m =>
+				`__WEBPACK_EXTERNAL_MODULE_${Template.toIdentifier(
+					`${chunkGraph.getModuleId(m)}`
+				)}__`
+		);
+
+		// Declaring variables for the internal variable names for the webpack externals
+		const externalVarDeclarations = externalWebpackNames
+			.map(name => `var ${name} = {};`)
+			.join("\n");
+
+		// Define __esModule flag on all internal variables and helpers
+		/** @type {string[]} */
+		const externalVarInitialization = [];
+
+		// The system.register format requires an array of setter functions for externals.
+		const setters =
+			externalWebpackNames.length === 0
+				? ""
+				: Template.asString([
+						"setters: [",
+						Template.indent(
+							externals
+								.map((module, i) => {
+									const external = externalWebpackNames[i];
+									const exportsInfo = moduleGraph.getExportsInfo(module);
+									const otherUnused =
+										exportsInfo.otherExportsInfo.getUsed(chunk.runtime) ===
+										UsageState.Unused;
+									const instructions = [];
+									const handledNames = [];
+									for (const exportInfo of exportsInfo.orderedExports) {
+										const used = exportInfo.getUsedName(
+											undefined,
+											chunk.runtime
+										);
+										if (used) {
+											if (otherUnused || used !== exportInfo.name) {
+												instructions.push(
+													`${external}${propertyAccess([
+														used
+													])} = module${propertyAccess([exportInfo.name])};`
+												);
+												handledNames.push(exportInfo.name);
+											}
+										} else {
+											handledNames.push(exportInfo.name);
+										}
+									}
+									if (!otherUnused) {
+										if (
+											!Array.isArray(module.request) ||
+											module.request.length === 1
+										) {
+											externalVarInitialization.push(
+												`Object.defineProperty(${external}, "__esModule", { value: true });`
+											);
+										}
+										if (handledNames.length > 0) {
+											const name = `${external}handledNames`;
+											externalVarInitialization.push(
+												`var ${name} = ${JSON.stringify(handledNames)};`
+											);
+											instructions.push(
+												Template.asString([
+													"Object.keys(module).forEach(function(key) {",
+													Template.indent([
+														`if(${name}.indexOf(key) >= 0)`,
+														Template.indent(`${external}[key] = module[key];`)
+													]),
+													"});"
+												])
+											);
+										} else {
+											instructions.push(
+												Template.asString([
+													"Object.keys(module).forEach(function(key) {",
+													Template.indent([`${external}[key] = module[key];`]),
+													"});"
+												])
+											);
+										}
+									}
+									if (instructions.length === 0) return "function() {}";
+									return Template.asString([
+										"function(module) {",
+										Template.indent(instructions),
+										"}"
+									]);
+								})
+								.join(",\n")
+						),
+						"],"
+					]);
+
+		return new ConcatSource(
+			Template.asString([
+				`System.register(${name}${systemDependencies}, function(${dynamicExport}, __system_context__) {`,
+				Template.indent([
+					externalVarDeclarations,
+					Template.asString(externalVarInitialization),
+					"return {",
+					Template.indent([
+						setters,
+						"execute: function() {",
+						Template.indent(`${dynamicExport}(`)
+					])
+				]),
+				""
+			]),
+			source,
+			Template.asString([
+				"",
+				Template.indent([
+					Template.indent([Template.indent([");"]), "}"]),
+					"};"
+				]),
+				"})"
+			])
+		);
+	}
+
+	/**
+	 * @param {Chunk} chunk the chunk
+	 * @param {Hash} hash hash
+	 * @param {ChunkHashContext} chunkHashContext chunk hash context
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {void}
+	 */
+	chunkHash(chunk, hash, chunkHashContext, { options, compilation }) {
+		hash.update("SystemLibraryPlugin");
+		if (options.name) {
+			hash.update(compilation.getPath(options.name, { chunk }));
+		}
+	}
+}
+
+module.exports = SystemLibraryPlugin;
diff --git a/lib/library/UmdLibraryPlugin.js b/lib/library/UmdLibraryPlugin.js
new file mode 100644
index 00000000000..b21066d3934
--- /dev/null
+++ b/lib/library/UmdLibraryPlugin.js
@@ -0,0 +1,351 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { ConcatSource, OriginalSource } = require("webpack-sources");
+const ExternalModule = require("../ExternalModule");
+const Template = require("../Template");
+const AbstractLibraryPlugin = require("./AbstractLibraryPlugin");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryCustomUmdCommentObject} LibraryCustomUmdCommentObject */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryCustomUmdObject} LibraryCustomUmdObject */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryName} LibraryName */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryOptions} LibraryOptions */
+/** @typedef {import("../../declarations/WebpackOptions").LibraryType} LibraryType */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../javascript/JavascriptModulesPlugin").RenderContext} RenderContext */
+/** @typedef {import("../ExternalModule").RequestRecord} RequestRecord */
+/** @typedef {import("../util/Hash")} Hash */
+/**
+ * @template T
+ * @typedef {import("./AbstractLibraryPlugin").LibraryContext}
+ * LibraryContext
+ */
+
+/**
+ * @param {string[]} accessor the accessor to convert to path
+ * @returns {string} the path
+ */
+const accessorToObjectAccess = accessor =>
+	accessor.map(a => `[${JSON.stringify(a)}]`).join("");
+
+/**
+ * @param {string|undefined} base the path prefix
+ * @param {string|string[]} accessor the accessor
+ * @param {string=} joinWith the element separator
+ * @returns {string} the path
+ */
+const accessorAccess = (base, accessor, joinWith = ", ") => {
+	const accessors = Array.isArray(accessor) ? accessor : [accessor];
+	return accessors
+		.map((_, idx) => {
+			const a = base
+				? base + accessorToObjectAccess(accessors.slice(0, idx + 1))
+				: accessors[0] + accessorToObjectAccess(accessors.slice(1, idx + 1));
+			if (idx === accessors.length - 1) return a;
+			if (idx === 0 && base === undefined)
+				return `${a} = typeof ${a} === "object" ? ${a} : {}`;
+			return `${a} = ${a} || {}`;
+		})
+		.join(joinWith);
+};
+
+/** @typedef {string | string[] | LibraryCustomUmdObject} UmdLibraryPluginName */
+
+/**
+ * @typedef {object} UmdLibraryPluginOptions
+ * @property {LibraryType} type
+ * @property {boolean=} optionalAmdExternalAsGlobal
+ */
+
+/**
+ * @typedef {object} UmdLibraryPluginParsed
+ * @property {string | string[] | undefined} name
+ * @property {LibraryCustomUmdObject} names
+ * @property {string | LibraryCustomUmdCommentObject | undefined} auxiliaryComment
+ * @property {boolean | undefined} namedDefine
+ */
+
+/**
+ * @typedef {UmdLibraryPluginParsed} T
+ * @extends {AbstractLibraryPlugin}
+ */
+class UmdLibraryPlugin extends AbstractLibraryPlugin {
+	/**
+	 * @param {UmdLibraryPluginOptions} options the plugin option
+	 */
+	constructor(options) {
+		super({
+			pluginName: "UmdLibraryPlugin",
+			type: options.type
+		});
+
+		this.optionalAmdExternalAsGlobal = options.optionalAmdExternalAsGlobal;
+	}
+
+	/**
+	 * @param {LibraryOptions} library normalized library option
+	 * @returns {T | false} preprocess as needed by overriding
+	 */
+	parseOptions(library) {
+		/** @type {LibraryName | undefined} */
+		let name;
+		/** @type {LibraryCustomUmdObject} */
+		let names;
+		if (typeof library.name === "object" && !Array.isArray(library.name)) {
+			name = library.name.root || library.name.amd || library.name.commonjs;
+			names = library.name;
+		} else {
+			name = library.name;
+			const singleName = Array.isArray(name) ? name[0] : name;
+			names = {
+				commonjs: singleName,
+				root: library.name,
+				amd: singleName
+			};
+		}
+		return {
+			name,
+			names,
+			auxiliaryComment: library.auxiliaryComment,
+			namedDefine: library.umdNamedDefine
+		};
+	}
+
+	/**
+	 * @param {Source} source source
+	 * @param {RenderContext} renderContext render context
+	 * @param {LibraryContext} libraryContext context
+	 * @returns {Source} source with library export
+	 */
+	render(
+		source,
+		{ chunkGraph, runtimeTemplate, chunk, moduleGraph },
+		{ options, compilation }
+	) {
+		const modules = chunkGraph
+			.getChunkModules(chunk)
+			.filter(
+				m =>
+					m instanceof ExternalModule &&
+					(m.externalType === "umd" || m.externalType === "umd2")
+			);
+		let externals = /** @type {ExternalModule[]} */ (modules);
+		/** @type {ExternalModule[]} */
+		const optionalExternals = [];
+		/** @type {ExternalModule[]} */
+		let requiredExternals = [];
+		if (this.optionalAmdExternalAsGlobal) {
+			for (const m of externals) {
+				if (m.isOptional(moduleGraph)) {
+					optionalExternals.push(m);
+				} else {
+					requiredExternals.push(m);
+				}
+			}
+			externals = requiredExternals.concat(optionalExternals);
+		} else {
+			requiredExternals = externals;
+		}
+
+		/**
+		 * @param {string} str the string to replace
+		 * @returns {string} the replaced keys
+		 */
+		const replaceKeys = str =>
+			compilation.getPath(str, {
+				chunk
+			});
+
+		/**
+		 * @param {ExternalModule[]} modules external modules
+		 * @returns {string} result
+		 */
+		const externalsDepsArray = modules =>
+			`[${replaceKeys(
+				modules
+					.map(m =>
+						JSON.stringify(
+							typeof m.request === "object"
+								? /** @type {RequestRecord} */
+									(m.request).amd
+								: m.request
+						)
+					)
+					.join(", ")
+			)}]`;
+
+		/**
+		 * @param {ExternalModule[]} modules external modules
+		 * @returns {string} result
+		 */
+		const externalsRootArray = modules =>
+			replaceKeys(
+				modules
+					.map(m => {
+						let request = m.request;
+						if (typeof request === "object")
+							request =
+								/** @type {RequestRecord} */
+								(request).root;
+						return `root${accessorToObjectAccess(/** @type {string[]} */ ([]).concat(request))}`;
+					})
+					.join(", ")
+			);
+
+		/**
+		 * @param {string} type the type
+		 * @returns {string} external require array
+		 */
+		const externalsRequireArray = type =>
+			replaceKeys(
+				externals
+					.map(m => {
+						let expr;
+						let request = m.request;
+						if (typeof request === "object") {
+							request =
+								/** @type {RequestRecord} */
+								(request)[type];
+						}
+						if (request === undefined) {
+							throw new Error(
+								`Missing external configuration for type:${type}`
+							);
+						}
+						expr = Array.isArray(request)
+							? `require(${JSON.stringify(
+									request[0]
+								)})${accessorToObjectAccess(request.slice(1))}`
+							: `require(${JSON.stringify(request)})`;
+						if (m.isOptional(moduleGraph)) {
+							expr = `(function webpackLoadOptionalExternalModule() { try { return ${expr}; } catch(e) {} }())`;
+						}
+						return expr;
+					})
+					.join(", ")
+			);
+
+		/**
+		 * @param {ExternalModule[]} modules external modules
+		 * @returns {string} arguments
+		 */
+		const externalsArguments = modules =>
+			modules
+				.map(
+					m =>
+						`__WEBPACK_EXTERNAL_MODULE_${Template.toIdentifier(
+							`${chunkGraph.getModuleId(m)}`
+						)}__`
+				)
+				.join(", ");
+
+		/**
+		 * @param {string| string[]} library library name
+		 * @returns {string} stringified library name
+		 */
+		const libraryName = library =>
+			JSON.stringify(
+				replaceKeys(
+					/** @type {string} */
+					(/** @type {string[]} */ ([]).concat(library).pop())
+				)
+			);
+
+		let amdFactory;
+		if (optionalExternals.length > 0) {
+			const wrapperArguments = externalsArguments(requiredExternals);
+			const factoryArguments =
+				requiredExternals.length > 0
+					? `${externalsArguments(requiredExternals)}, ${externalsRootArray(
+							optionalExternals
+						)}`
+					: externalsRootArray(optionalExternals);
+			amdFactory =
+				`function webpackLoadOptionalExternalModuleAmd(${wrapperArguments}) {\n` +
+				`			return factory(${factoryArguments});\n` +
+				"		}";
+		} else {
+			amdFactory = "factory";
+		}
+
+		const { auxiliaryComment, namedDefine, names } = options;
+
+		/**
+		 * @param {keyof LibraryCustomUmdCommentObject} type type
+		 * @returns {string} comment
+		 */
+		const getAuxiliaryComment = type => {
+			if (auxiliaryComment) {
+				if (typeof auxiliaryComment === "string")
+					return `\t//${auxiliaryComment}\n`;
+				if (auxiliaryComment[type]) return `\t//${auxiliaryComment[type]}\n`;
+			}
+			return "";
+		};
+
+		return new ConcatSource(
+			new OriginalSource(
+				`(function webpackUniversalModuleDefinition(root, factory) {\n${getAuxiliaryComment(
+					"commonjs2"
+				)}	if(typeof exports === 'object' && typeof module === 'object')\n` +
+					`		module.exports = factory(${externalsRequireArray(
+						"commonjs2"
+					)});\n${getAuxiliaryComment(
+						"amd"
+					)}	else if(typeof define === 'function' && define.amd)\n${
+						requiredExternals.length > 0
+							? names.amd && namedDefine === true
+								? `		define(${libraryName(names.amd)}, ${externalsDepsArray(
+										requiredExternals
+									)}, ${amdFactory});\n`
+								: `		define(${externalsDepsArray(requiredExternals)}, ${
+										amdFactory
+									});\n`
+							: names.amd && namedDefine === true
+								? `		define(${libraryName(names.amd)}, [], ${amdFactory});\n`
+								: `		define([], ${amdFactory});\n`
+					}${
+						names.root || names.commonjs
+							? `${getAuxiliaryComment(
+									"commonjs"
+								)}	else if(typeof exports === 'object')\n` +
+								`		exports[${libraryName(
+									/** @type {string | string[]} */
+									(names.commonjs || names.root)
+								)}] = factory(${externalsRequireArray(
+									"commonjs"
+								)});\n${getAuxiliaryComment("root")}	else\n` +
+								`		${replaceKeys(
+									accessorAccess(
+										"root",
+										/** @type {string | string[]} */
+										(names.root || names.commonjs)
+									)
+								)} = factory(${externalsRootArray(externals)});\n`
+							: `	else {\n${
+									externals.length > 0
+										? `		var a = typeof exports === 'object' ? factory(${externalsRequireArray(
+												"commonjs"
+											)}) : factory(${externalsRootArray(externals)});\n`
+										: "		var a = factory();\n"
+								}		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n` +
+								"	}\n"
+					}})(${runtimeTemplate.outputOptions.globalObject}, ${
+						runtimeTemplate.supportsArrowFunction()
+							? `(${externalsArguments(externals)}) =>`
+							: `function(${externalsArguments(externals)})`
+					} {\nreturn `,
+				"webpack/universalModuleDefinition"
+			),
+			source,
+			";\n})"
+		);
+	}
+}
+
+module.exports = UmdLibraryPlugin;
diff --git a/lib/logging/Logger.js b/lib/logging/Logger.js
new file mode 100644
index 00000000000..d785e0c0008
--- /dev/null
+++ b/lib/logging/Logger.js
@@ -0,0 +1,216 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const LogType = Object.freeze({
+	error: /** @type {"error"} */ ("error"), // message, c style arguments
+	warn: /** @type {"warn"} */ ("warn"), // message, c style arguments
+	info: /** @type {"info"} */ ("info"), // message, c style arguments
+	log: /** @type {"log"} */ ("log"), // message, c style arguments
+	debug: /** @type {"debug"} */ ("debug"), // message, c style arguments
+
+	trace: /** @type {"trace"} */ ("trace"), // no arguments
+
+	group: /** @type {"group"} */ ("group"), // [label]
+	groupCollapsed: /** @type {"groupCollapsed"} */ ("groupCollapsed"), // [label]
+	groupEnd: /** @type {"groupEnd"} */ ("groupEnd"), // [label]
+
+	profile: /** @type {"profile"} */ ("profile"), // [profileName]
+	profileEnd: /** @type {"profileEnd"} */ ("profileEnd"), // [profileName]
+
+	time: /** @type {"time"} */ ("time"), // name, time as [seconds, nanoseconds]
+
+	clear: /** @type {"clear"} */ ("clear"), // no arguments
+	status: /** @type {"status"} */ ("status") // message, arguments
+});
+
+module.exports.LogType = LogType;
+
+/** @typedef {typeof LogType[keyof typeof LogType]} LogTypeEnum */
+
+const LOG_SYMBOL = Symbol("webpack logger raw log method");
+const TIMERS_SYMBOL = Symbol("webpack logger times");
+const TIMERS_AGGREGATES_SYMBOL = Symbol("webpack logger aggregated times");
+
+class WebpackLogger {
+	/**
+	 * @param {(type: LogTypeEnum, args?: EXPECTED_ANY[]) => void} log log function
+	 * @param {(name: string | (() => string)) => WebpackLogger} getChildLogger function to create child logger
+	 */
+	constructor(log, getChildLogger) {
+		this[LOG_SYMBOL] = log;
+		this.getChildLogger = getChildLogger;
+	}
+
+	/**
+	 * @param {...EXPECTED_ANY} args args
+	 */
+	error(...args) {
+		this[LOG_SYMBOL](LogType.error, args);
+	}
+
+	/**
+	 * @param {...EXPECTED_ANY} args args
+	 */
+	warn(...args) {
+		this[LOG_SYMBOL](LogType.warn, args);
+	}
+
+	/**
+	 * @param {...EXPECTED_ANY} args args
+	 */
+	info(...args) {
+		this[LOG_SYMBOL](LogType.info, args);
+	}
+
+	/**
+	 * @param {...EXPECTED_ANY} args args
+	 */
+	log(...args) {
+		this[LOG_SYMBOL](LogType.log, args);
+	}
+
+	/**
+	 * @param {...EXPECTED_ANY} args args
+	 */
+	debug(...args) {
+		this[LOG_SYMBOL](LogType.debug, args);
+	}
+
+	/**
+	 * @param {EXPECTED_ANY} assertion assertion
+	 * @param {...EXPECTED_ANY} args args
+	 */
+	assert(assertion, ...args) {
+		if (!assertion) {
+			this[LOG_SYMBOL](LogType.error, args);
+		}
+	}
+
+	trace() {
+		this[LOG_SYMBOL](LogType.trace, ["Trace"]);
+	}
+
+	clear() {
+		this[LOG_SYMBOL](LogType.clear);
+	}
+
+	/**
+	 * @param {...EXPECTED_ANY} args args
+	 */
+	status(...args) {
+		this[LOG_SYMBOL](LogType.status, args);
+	}
+
+	/**
+	 * @param {...EXPECTED_ANY} args args
+	 */
+	group(...args) {
+		this[LOG_SYMBOL](LogType.group, args);
+	}
+
+	/**
+	 * @param {...EXPECTED_ANY} args args
+	 */
+	groupCollapsed(...args) {
+		this[LOG_SYMBOL](LogType.groupCollapsed, args);
+	}
+
+	groupEnd() {
+		this[LOG_SYMBOL](LogType.groupEnd);
+	}
+
+	/**
+	 * @param {string=} label label
+	 */
+	profile(label) {
+		this[LOG_SYMBOL](LogType.profile, [label]);
+	}
+
+	/**
+	 * @param {string=} label label
+	 */
+	profileEnd(label) {
+		this[LOG_SYMBOL](LogType.profileEnd, [label]);
+	}
+
+	/**
+	 * @param {string} label label
+	 */
+	time(label) {
+		/** @type {Map} */
+		this[TIMERS_SYMBOL] = this[TIMERS_SYMBOL] || new Map();
+		this[TIMERS_SYMBOL].set(label, process.hrtime());
+	}
+
+	/**
+	 * @param {string=} label label
+	 */
+	timeLog(label) {
+		const prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label);
+		if (!prev) {
+			throw new Error(`No such label '${label}' for WebpackLogger.timeLog()`);
+		}
+		const time = process.hrtime(prev);
+		this[LOG_SYMBOL](LogType.time, [label, ...time]);
+	}
+
+	/**
+	 * @param {string=} label label
+	 */
+	timeEnd(label) {
+		const prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label);
+		if (!prev) {
+			throw new Error(`No such label '${label}' for WebpackLogger.timeEnd()`);
+		}
+		const time = process.hrtime(prev);
+		/** @type {Map} */
+		(this[TIMERS_SYMBOL]).delete(label);
+		this[LOG_SYMBOL](LogType.time, [label, ...time]);
+	}
+
+	/**
+	 * @param {string=} label label
+	 */
+	timeAggregate(label) {
+		const prev = this[TIMERS_SYMBOL] && this[TIMERS_SYMBOL].get(label);
+		if (!prev) {
+			throw new Error(
+				`No such label '${label}' for WebpackLogger.timeAggregate()`
+			);
+		}
+		const time = process.hrtime(prev);
+		/** @type {Map} */
+		(this[TIMERS_SYMBOL]).delete(label);
+		/** @type {Map} */
+		this[TIMERS_AGGREGATES_SYMBOL] =
+			this[TIMERS_AGGREGATES_SYMBOL] || new Map();
+		const current = this[TIMERS_AGGREGATES_SYMBOL].get(label);
+		if (current !== undefined) {
+			if (time[1] + current[1] > 1e9) {
+				time[0] += current[0] + 1;
+				time[1] = time[1] - 1e9 + current[1];
+			} else {
+				time[0] += current[0];
+				time[1] += current[1];
+			}
+		}
+		this[TIMERS_AGGREGATES_SYMBOL].set(label, time);
+	}
+
+	/**
+	 * @param {string=} label label
+	 */
+	timeAggregateEnd(label) {
+		if (this[TIMERS_AGGREGATES_SYMBOL] === undefined) return;
+		const time = this[TIMERS_AGGREGATES_SYMBOL].get(label);
+		if (time === undefined) return;
+		this[TIMERS_AGGREGATES_SYMBOL].delete(label);
+		this[LOG_SYMBOL](LogType.time, [label, ...time]);
+	}
+}
+
+module.exports.Logger = WebpackLogger;
diff --git a/lib/logging/createConsoleLogger.js b/lib/logging/createConsoleLogger.js
new file mode 100644
index 00000000000..28596fed321
--- /dev/null
+++ b/lib/logging/createConsoleLogger.js
@@ -0,0 +1,212 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { LogType } = require("./Logger");
+
+/** @typedef {import("../../declarations/WebpackOptions").FilterItemTypes} FilterItemTypes */
+/** @typedef {import("../../declarations/WebpackOptions").FilterTypes} FilterTypes */
+/** @typedef {import("./Logger").LogTypeEnum} LogTypeEnum */
+
+/** @typedef {(item: string) => boolean} FilterFunction */
+/** @typedef {(value: string, type: LogTypeEnum, args?: EXPECTED_ANY[]) => void} LoggingFunction */
+
+/**
+ * @typedef {object} LoggerConsole
+ * @property {() => void} clear
+ * @property {() => void} trace
+ * @property {(...args: EXPECTED_ANY[]) => void} info
+ * @property {(...args: EXPECTED_ANY[]) => void} log
+ * @property {(...args: EXPECTED_ANY[]) => void} warn
+ * @property {(...args: EXPECTED_ANY[]) => void} error
+ * @property {(...args: EXPECTED_ANY[]) => void=} debug
+ * @property {(...args: EXPECTED_ANY[]) => void=} group
+ * @property {(...args: EXPECTED_ANY[]) => void=} groupCollapsed
+ * @property {(...args: EXPECTED_ANY[]) => void=} groupEnd
+ * @property {(...args: EXPECTED_ANY[]) => void=} status
+ * @property {(...args: EXPECTED_ANY[]) => void=} profile
+ * @property {(...args: EXPECTED_ANY[]) => void=} profileEnd
+ * @property {(...args: EXPECTED_ANY[]) => void=} logTime
+ */
+
+/**
+ * @typedef {object} LoggerOptions
+ * @property {false|true|"none"|"error"|"warn"|"info"|"log"|"verbose"} level loglevel
+ * @property {FilterTypes|boolean} debug filter for debug logging
+ * @property {LoggerConsole} console the console to log to
+ */
+
+/**
+ * @param {FilterItemTypes} item an input item
+ * @returns {FilterFunction | undefined} filter function
+ */
+const filterToFunction = item => {
+	if (typeof item === "string") {
+		const regExp = new RegExp(
+			`[\\\\/]${item.replace(/[-[\]{}()*+?.\\^$|]/g, "\\$&")}([\\\\/]|$|!|\\?)`
+		);
+		return ident => regExp.test(ident);
+	}
+	if (item && typeof item === "object" && typeof item.test === "function") {
+		return ident => item.test(ident);
+	}
+	if (typeof item === "function") {
+		return item;
+	}
+	if (typeof item === "boolean") {
+		return () => item;
+	}
+};
+
+/**
+ * @enum {number}
+ */
+const LogLevel = {
+	none: 6,
+	false: 6,
+	error: 5,
+	warn: 4,
+	info: 3,
+	log: 2,
+	true: 2,
+	verbose: 1
+};
+
+/**
+ * @param {LoggerOptions} options options object
+ * @returns {LoggingFunction} logging function
+ */
+module.exports = ({ level = "info", debug = false, console }) => {
+	const debugFilters =
+		/** @type {FilterFunction[]} */
+		(
+			typeof debug === "boolean"
+				? [() => debug]
+				: /** @type {FilterItemTypes[]} */ ([])
+						.concat(debug)
+						.map(filterToFunction)
+		);
+	const loglevel = LogLevel[`${level}`] || 0;
+
+	/**
+	 * @param {string} name name of the logger
+	 * @param {LogTypeEnum} type type of the log entry
+	 * @param {EXPECTED_ANY[]=} args arguments of the log entry
+	 * @returns {void}
+	 */
+	const logger = (name, type, args) => {
+		const labeledArgs = () => {
+			if (Array.isArray(args)) {
+				if (args.length > 0 && typeof args[0] === "string") {
+					return [`[${name}] ${args[0]}`, ...args.slice(1)];
+				}
+				return [`[${name}]`, ...args];
+			}
+			return [];
+		};
+		const debug = debugFilters.some(f => f(name));
+		switch (type) {
+			case LogType.debug:
+				if (!debug) return;
+				if (typeof console.debug === "function") {
+					console.debug(...labeledArgs());
+				} else {
+					console.log(...labeledArgs());
+				}
+				break;
+			case LogType.log:
+				if (!debug && loglevel > LogLevel.log) return;
+				console.log(...labeledArgs());
+				break;
+			case LogType.info:
+				if (!debug && loglevel > LogLevel.info) return;
+				console.info(...labeledArgs());
+				break;
+			case LogType.warn:
+				if (!debug && loglevel > LogLevel.warn) return;
+				console.warn(...labeledArgs());
+				break;
+			case LogType.error:
+				if (!debug && loglevel > LogLevel.error) return;
+				console.error(...labeledArgs());
+				break;
+			case LogType.trace:
+				if (!debug) return;
+				console.trace();
+				break;
+			case LogType.groupCollapsed:
+				if (!debug && loglevel > LogLevel.log) return;
+				if (!debug && loglevel > LogLevel.verbose) {
+					if (typeof console.groupCollapsed === "function") {
+						console.groupCollapsed(...labeledArgs());
+					} else {
+						console.log(...labeledArgs());
+					}
+					break;
+				}
+			// falls through
+			case LogType.group:
+				if (!debug && loglevel > LogLevel.log) return;
+				if (typeof console.group === "function") {
+					console.group(...labeledArgs());
+				} else {
+					console.log(...labeledArgs());
+				}
+				break;
+			case LogType.groupEnd:
+				if (!debug && loglevel > LogLevel.log) return;
+				if (typeof console.groupEnd === "function") {
+					console.groupEnd();
+				}
+				break;
+			case LogType.time: {
+				if (!debug && loglevel > LogLevel.log) return;
+				const [label, start, end] =
+					/** @type {[string, number, number]} */
+					(args);
+				const ms = start * 1000 + end / 1000000;
+				const msg = `[${name}] ${label}: ${ms} ms`;
+				if (typeof console.logTime === "function") {
+					console.logTime(msg);
+				} else {
+					console.log(msg);
+				}
+				break;
+			}
+			case LogType.profile:
+				if (typeof console.profile === "function") {
+					console.profile(...labeledArgs());
+				}
+				break;
+			case LogType.profileEnd:
+				if (typeof console.profileEnd === "function") {
+					console.profileEnd(...labeledArgs());
+				}
+				break;
+			case LogType.clear:
+				if (!debug && loglevel > LogLevel.log) return;
+				if (typeof console.clear === "function") {
+					console.clear();
+				}
+				break;
+			case LogType.status:
+				if (!debug && loglevel > LogLevel.info) return;
+				if (typeof console.status === "function") {
+					if (!args || args.length === 0) {
+						console.status();
+					} else {
+						console.status(...labeledArgs());
+					}
+				} else if (args && args.length !== 0) {
+					console.info(...labeledArgs());
+				}
+				break;
+			default:
+				throw new Error(`Unexpected LogType ${type}`);
+		}
+	};
+	return logger;
+};
diff --git a/lib/logging/runtime.js b/lib/logging/runtime.js
new file mode 100644
index 00000000000..b0c614081f0
--- /dev/null
+++ b/lib/logging/runtime.js
@@ -0,0 +1,45 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { SyncBailHook } = require("tapable");
+const { Logger } = require("./Logger");
+const createConsoleLogger = require("./createConsoleLogger");
+
+/** @type {createConsoleLogger.LoggerOptions} */
+const currentDefaultLoggerOptions = {
+	level: "info",
+	debug: false,
+	console
+};
+let currentDefaultLogger = createConsoleLogger(currentDefaultLoggerOptions);
+
+/**
+ * @param {string} name name of the logger
+ * @returns {Logger} a logger
+ */
+module.exports.getLogger = name =>
+	new Logger(
+		(type, args) => {
+			if (module.exports.hooks.log.call(name, type, args) === undefined) {
+				currentDefaultLogger(name, type, args);
+			}
+		},
+		childName => module.exports.getLogger(`${name}/${childName}`)
+	);
+
+/**
+ * @param {createConsoleLogger.LoggerOptions} options new options, merge with old options
+ * @returns {void}
+ */
+module.exports.configureDefaultLogger = options => {
+	Object.assign(currentDefaultLoggerOptions, options);
+	currentDefaultLogger = createConsoleLogger(currentDefaultLoggerOptions);
+};
+
+module.exports.hooks = {
+	log: new SyncBailHook(["origin", "type", "args"])
+};
diff --git a/lib/logging/truncateArgs.js b/lib/logging/truncateArgs.js
new file mode 100644
index 00000000000..148ac7ae12b
--- /dev/null
+++ b/lib/logging/truncateArgs.js
@@ -0,0 +1,83 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+/**
+ * @param {Array} array array of numbers
+ * @returns {number} sum of all numbers in array
+ */
+const arraySum = array => {
+	let sum = 0;
+	for (const item of array) sum += item;
+	return sum;
+};
+
+/**
+ * @param {EXPECTED_ANY[]} args items to be truncated
+ * @param {number} maxLength maximum length of args including spaces between
+ * @returns {string[]} truncated args
+ */
+const truncateArgs = (args, maxLength) => {
+	const lengths = args.map(a => `${a}`.length);
+	const availableLength = maxLength - lengths.length + 1;
+
+	if (availableLength > 0 && args.length === 1) {
+		if (availableLength >= args[0].length) {
+			return args;
+		} else if (availableLength > 3) {
+			return [`...${args[0].slice(-availableLength + 3)}`];
+		}
+		return [args[0].slice(-availableLength)];
+	}
+
+	// Check if there is space for at least 4 chars per arg
+	if (availableLength < arraySum(lengths.map(i => Math.min(i, 6)))) {
+		// remove args
+		if (args.length > 1) return truncateArgs(args.slice(0, -1), maxLength);
+		return [];
+	}
+
+	let currentLength = arraySum(lengths);
+
+	// Check if all fits into maxLength
+	if (currentLength <= availableLength) return args;
+
+	// Try to remove chars from the longest items until it fits
+	while (currentLength > availableLength) {
+		const maxLength = Math.max(...lengths);
+		const shorterItems = lengths.filter(l => l !== maxLength);
+		const nextToMaxLength =
+			shorterItems.length > 0 ? Math.max(...shorterItems) : 0;
+		const maxReduce = maxLength - nextToMaxLength;
+		let maxItems = lengths.length - shorterItems.length;
+		let overrun = currentLength - availableLength;
+		for (let i = 0; i < lengths.length; i++) {
+			if (lengths[i] === maxLength) {
+				const reduce = Math.min(Math.floor(overrun / maxItems), maxReduce);
+				lengths[i] -= reduce;
+				currentLength -= reduce;
+				overrun -= reduce;
+				maxItems--;
+			}
+		}
+	}
+
+	// Return args reduced to length in lengths
+	return args.map((a, i) => {
+		const str = `${a}`;
+		const length = lengths[i];
+		if (str.length === length) {
+			return str;
+		} else if (length > 5) {
+			return `...${str.slice(-length + 3)}`;
+		} else if (length > 0) {
+			return str.slice(-length);
+		}
+		return "";
+	});
+};
+
+module.exports = truncateArgs;
diff --git a/lib/node/CommonJsChunkLoadingPlugin.js b/lib/node/CommonJsChunkLoadingPlugin.js
new file mode 100644
index 00000000000..c008a7be3ab
--- /dev/null
+++ b/lib/node/CommonJsChunkLoadingPlugin.js
@@ -0,0 +1,117 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const StartupChunkDependenciesPlugin = require("../runtime/StartupChunkDependenciesPlugin");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compiler")} Compiler */
+
+/**
+ * @typedef {object} CommonJsChunkLoadingPluginOptions
+ * @property {boolean=} asyncChunkLoading enable async chunk loading
+ */
+
+const PLUGIN_NAME = "CommonJsChunkLoadingPlugin";
+
+class CommonJsChunkLoadingPlugin {
+	/**
+	 * @param {CommonJsChunkLoadingPluginOptions=} options options
+	 */
+	constructor(options = {}) {
+		this._asyncChunkLoading = options.asyncChunkLoading;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		const ChunkLoadingRuntimeModule = this._asyncChunkLoading
+			? require("./ReadFileChunkLoadingRuntimeModule")
+			: require("./RequireChunkLoadingRuntimeModule");
+		const chunkLoadingValue = this._asyncChunkLoading
+			? "async-node"
+			: "require";
+		new StartupChunkDependenciesPlugin({
+			chunkLoading: chunkLoadingValue,
+			asyncChunkLoading: this._asyncChunkLoading
+		}).apply(compiler);
+		compiler.hooks.thisCompilation.tap(PLUGIN_NAME, compilation => {
+			const globalChunkLoading = compilation.outputOptions.chunkLoading;
+			/**
+			 * @param {Chunk} chunk chunk
+			 * @returns {boolean} true, if wasm loading is enabled for the chunk
+			 */
+			const isEnabledForChunk = chunk => {
+				const options = chunk.getEntryOptions();
+				const chunkLoading =
+					options && options.chunkLoading !== undefined
+						? options.chunkLoading
+						: globalChunkLoading;
+				return chunkLoading === chunkLoadingValue;
+			};
+			const onceForChunkSet = new WeakSet();
+			/**
+			 * @param {Chunk} chunk chunk
+			 * @param {Set} set runtime requirements
+			 */
+			const handler = (chunk, set) => {
+				if (onceForChunkSet.has(chunk)) return;
+				onceForChunkSet.add(chunk);
+				if (!isEnabledForChunk(chunk)) return;
+				set.add(RuntimeGlobals.moduleFactoriesAddOnly);
+				set.add(RuntimeGlobals.hasOwnProperty);
+				compilation.addRuntimeModule(chunk, new ChunkLoadingRuntimeModule(set));
+			};
+
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.ensureChunkHandlers)
+				.tap(PLUGIN_NAME, handler);
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.hmrDownloadUpdateHandlers)
+				.tap(PLUGIN_NAME, handler);
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.hmrDownloadManifest)
+				.tap(PLUGIN_NAME, handler);
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.baseURI)
+				.tap(PLUGIN_NAME, handler);
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.externalInstallChunk)
+				.tap(PLUGIN_NAME, handler);
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.onChunksLoaded)
+				.tap(PLUGIN_NAME, handler);
+
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.ensureChunkHandlers)
+				.tap(PLUGIN_NAME, (chunk, set) => {
+					if (!isEnabledForChunk(chunk)) return;
+					set.add(RuntimeGlobals.getChunkScriptFilename);
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.hmrDownloadUpdateHandlers)
+				.tap(PLUGIN_NAME, (chunk, set) => {
+					if (!isEnabledForChunk(chunk)) return;
+					set.add(RuntimeGlobals.getChunkUpdateScriptFilename);
+					set.add(RuntimeGlobals.moduleCache);
+					set.add(RuntimeGlobals.hmrModuleData);
+					set.add(RuntimeGlobals.moduleFactoriesAddOnly);
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.hmrDownloadManifest)
+				.tap(PLUGIN_NAME, (chunk, set) => {
+					if (!isEnabledForChunk(chunk)) return;
+					set.add(RuntimeGlobals.getUpdateManifestFilename);
+				});
+		});
+	}
+}
+
+module.exports = CommonJsChunkLoadingPlugin;
diff --git a/lib/node/NodeChunkTemplatePlugin.js b/lib/node/NodeChunkTemplatePlugin.js
deleted file mode 100644
index 292182a970a..00000000000
--- a/lib/node/NodeChunkTemplatePlugin.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-
-"use strict";
-
-const { ConcatSource } = require("webpack-sources");
-
-class NodeChunkTemplatePlugin {
-	apply(chunkTemplate) {
-		chunkTemplate.hooks.render.tap(
-			"NodeChunkTemplatePlugin",
-			(modules, chunk) => {
-				const source = new ConcatSource();
-				source.add(
-					`exports.ids = ${JSON.stringify(chunk.ids)};\nexports.modules = `
-				);
-				source.add(modules);
-				source.add(";");
-				return source;
-			}
-		);
-		chunkTemplate.hooks.hash.tap("NodeChunkTemplatePlugin", hash => {
-			hash.update("node");
-			hash.update("3");
-		});
-	}
-}
-
-module.exports = NodeChunkTemplatePlugin;
diff --git a/lib/node/NodeEnvironmentPlugin.js b/lib/node/NodeEnvironmentPlugin.js
index 3f76bffa533..c9474b90e0c 100644
--- a/lib/node/NodeEnvironmentPlugin.js
+++ b/lib/node/NodeEnvironmentPlugin.js
@@ -2,27 +2,71 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const CachedInputFileSystem = require("enhanced-resolve").CachedInputFileSystem;
+const fs = require("graceful-fs");
+const createConsoleLogger = require("../logging/createConsoleLogger");
 const NodeWatchFileSystem = require("./NodeWatchFileSystem");
-const NodeOutputFileSystem = require("./NodeOutputFileSystem");
-const NodeJsInputFileSystem = require("enhanced-resolve/lib/NodeJsInputFileSystem");
-const CachedInputFileSystem = require("enhanced-resolve/lib/CachedInputFileSystem");
+const nodeConsole = require("./nodeConsole");
+
+/** @typedef {import("../../declarations/WebpackOptions").InfrastructureLogging} InfrastructureLogging */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../util/fs").InputFileSystem} InputFileSystem */
+
+/**
+ * @typedef {object} NodeEnvironmentPluginOptions
+ * @property {InfrastructureLogging} infrastructureLogging infrastructure logging options
+ */
+
+const PLUGIN_NAME = "NodeEnvironmentPlugin";
 
 class NodeEnvironmentPlugin {
+	/**
+	 * @param {NodeEnvironmentPluginOptions} options options
+	 */
+	constructor(options) {
+		this.options = options;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		compiler.inputFileSystem = new CachedInputFileSystem(
-			new NodeJsInputFileSystem(),
-			60000
-		);
-		const inputFileSystem = compiler.inputFileSystem;
-		compiler.outputFileSystem = new NodeOutputFileSystem();
-		compiler.watchFileSystem = new NodeWatchFileSystem(
-			compiler.inputFileSystem
-		);
-		compiler.hooks.beforeRun.tap("NodeEnvironmentPlugin", compiler => {
-			if (compiler.inputFileSystem === inputFileSystem) inputFileSystem.purge();
+		const { infrastructureLogging } = this.options;
+		compiler.infrastructureLogger = createConsoleLogger({
+			level: infrastructureLogging.level || "info",
+			debug: infrastructureLogging.debug || false,
+			console:
+				infrastructureLogging.console ||
+				nodeConsole({
+					colors: infrastructureLogging.colors,
+					appendOnly: infrastructureLogging.appendOnly,
+					stream:
+						/** @type {NodeJS.WritableStream} */
+						(infrastructureLogging.stream)
+				})
+		});
+		compiler.inputFileSystem = new CachedInputFileSystem(fs, 60000);
+		const inputFileSystem =
+			/** @type {InputFileSystem} */
+			(compiler.inputFileSystem);
+		compiler.outputFileSystem = fs;
+		compiler.intermediateFileSystem = fs;
+		compiler.watchFileSystem = new NodeWatchFileSystem(inputFileSystem);
+		compiler.hooks.beforeRun.tap(PLUGIN_NAME, compiler => {
+			if (
+				compiler.inputFileSystem === inputFileSystem &&
+				inputFileSystem.purge
+			) {
+				compiler.fsStartTime = Date.now();
+				inputFileSystem.purge();
+			}
 		});
 	}
 }
+
 module.exports = NodeEnvironmentPlugin;
diff --git a/lib/node/NodeHotUpdateChunkTemplatePlugin.js b/lib/node/NodeHotUpdateChunkTemplatePlugin.js
deleted file mode 100644
index bbd2e12a6b8..00000000000
--- a/lib/node/NodeHotUpdateChunkTemplatePlugin.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const { ConcatSource } = require("webpack-sources");
-
-class NodeHotUpdateChunkTemplatePlugin {
-	apply(hotUpdateChunkTemplate) {
-		hotUpdateChunkTemplate.hooks.render.tap(
-			"NodeHotUpdateChunkTemplatePlugin",
-			(modulesSource, modules, removedModules, hash, id) => {
-				const source = new ConcatSource();
-				source.add(
-					"exports.id = " + JSON.stringify(id) + ";\nexports.modules = "
-				);
-				source.add(modulesSource);
-				source.add(";");
-				return source;
-			}
-		);
-		hotUpdateChunkTemplate.hooks.hash.tap(
-			"NodeHotUpdateChunkTemplatePlugin",
-			hash => {
-				hash.update("NodeHotUpdateChunkTemplatePlugin");
-				hash.update("3");
-				hash.update(
-					hotUpdateChunkTemplate.outputOptions.hotUpdateFunction + ""
-				);
-				hash.update(hotUpdateChunkTemplate.outputOptions.library + "");
-			}
-		);
-	}
-}
-module.exports = NodeHotUpdateChunkTemplatePlugin;
diff --git a/lib/node/NodeMainTemplate.runtime.js b/lib/node/NodeMainTemplate.runtime.js
deleted file mode 100644
index d34388bf76f..00000000000
--- a/lib/node/NodeMainTemplate.runtime.js
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-/*global installedChunks $hotChunkFilename$ hotAddUpdateChunk $hotMainFilename$ */
-module.exports = function() {
-	// eslint-disable-next-line no-unused-vars
-	function hotDownloadUpdateChunk(chunkId) {
-		var chunk = require("./" + $hotChunkFilename$);
-		hotAddUpdateChunk(chunk.id, chunk.modules);
-	}
-
-	// eslint-disable-next-line no-unused-vars
-	function hotDownloadManifest() {
-		try {
-			var update = require("./" + $hotMainFilename$);
-		} catch (e) {
-			return Promise.resolve();
-		}
-		return Promise.resolve(update);
-	}
-
-	//eslint-disable-next-line no-unused-vars
-	function hotDisposeChunk(chunkId) {
-		delete installedChunks[chunkId];
-	}
-};
diff --git a/lib/node/NodeMainTemplateAsync.runtime.js b/lib/node/NodeMainTemplateAsync.runtime.js
deleted file mode 100644
index 35eb47b665e..00000000000
--- a/lib/node/NodeMainTemplateAsync.runtime.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-/*global installedChunks $hotChunkFilename$ $require$ hotAddUpdateChunk $hotMainFilename$ */
-module.exports = function() {
-	// eslint-disable-next-line no-unused-vars
-	function hotDownloadUpdateChunk(chunkId) {
-		var filename = require("path").join(__dirname, $hotChunkFilename$);
-		require("fs").readFile(filename, "utf-8", function(err, content) {
-			if (err) {
-				if ($require$.onError) return $require$.oe(err);
-				throw err;
-			}
-			var chunk = {};
-			require("vm").runInThisContext(
-				"(function(exports) {" + content + "\n})",
-				{ filename: filename }
-			)(chunk);
-			hotAddUpdateChunk(chunk.id, chunk.modules);
-		});
-	}
-
-	// eslint-disable-next-line no-unused-vars
-	function hotDownloadManifest() {
-		var filename = require("path").join(__dirname, $hotMainFilename$);
-		return new Promise(function(resolve, reject) {
-			require("fs").readFile(filename, "utf-8", function(err, content) {
-				if (err) return resolve();
-				try {
-					var update = JSON.parse(content);
-				} catch (e) {
-					return reject(e);
-				}
-				resolve(update);
-			});
-		});
-	}
-
-	// eslint-disable-next-line no-unused-vars
-	function hotDisposeChunk(chunkId) {
-		delete installedChunks[chunkId];
-	}
-};
diff --git a/lib/node/NodeMainTemplatePlugin.js b/lib/node/NodeMainTemplatePlugin.js
deleted file mode 100644
index a2702969975..00000000000
--- a/lib/node/NodeMainTemplatePlugin.js
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const Template = require("../Template");
-
-module.exports = class NodeMainTemplatePlugin {
-	constructor(asyncChunkLoading) {
-		this.asyncChunkLoading = asyncChunkLoading;
-	}
-
-	apply(mainTemplate) {
-		const needChunkOnDemandLoadingCode = chunk => {
-			for (const chunkGroup of chunk.groupsIterable) {
-				if (chunkGroup.getNumberOfChildren() > 0) return true;
-			}
-			return false;
-		};
-		const asyncChunkLoading = this.asyncChunkLoading;
-		mainTemplate.hooks.localVars.tap(
-			"NodeMainTemplatePlugin",
-			(source, chunk) => {
-				if (needChunkOnDemandLoadingCode(chunk)) {
-					return Template.asString([
-						source,
-						"",
-						"// object to store loaded chunks",
-						'// "0" means "already loaded"',
-						"var installedChunks = {",
-						Template.indent(
-							chunk.ids.map(id => `${JSON.stringify(id)}: 0`).join(",\n")
-						),
-						"};"
-					]);
-				}
-				return source;
-			}
-		);
-		mainTemplate.hooks.requireExtensions.tap(
-			"NodeMainTemplatePlugin",
-			(source, chunk) => {
-				if (needChunkOnDemandLoadingCode(chunk)) {
-					return Template.asString([
-						source,
-						"",
-						"// uncaught error handler for webpack runtime",
-						`${mainTemplate.requireFn}.oe = function(err) {`,
-						Template.indent([
-							"process.nextTick(function() {",
-							Template.indent(
-								"throw err; // catch this error by using import().catch()"
-							),
-							"});"
-						]),
-						"};"
-					]);
-				}
-				return source;
-			}
-		);
-		mainTemplate.hooks.requireEnsure.tap(
-			"NodeMainTemplatePlugin",
-			(source, chunk, hash) => {
-				const chunkFilename = mainTemplate.outputOptions.chunkFilename;
-				const chunkMaps = chunk.getChunkMaps();
-				const insertMoreModules = [
-					"var moreModules = chunk.modules, chunkIds = chunk.ids;",
-					"for(var moduleId in moreModules) {",
-					Template.indent(
-						mainTemplate.renderAddModule(
-							hash,
-							chunk,
-							"moduleId",
-							"moreModules[moduleId]"
-						)
-					),
-					"}"
-				];
-				if (asyncChunkLoading) {
-					return Template.asString([
-						source,
-						"",
-						"// ReadFile + VM.run chunk loading for javascript",
-						"",
-						"var installedChunkData = installedChunks[chunkId];",
-						'if(installedChunkData !== 0) { // 0 means "already installed".',
-						Template.indent([
-							'// array of [resolve, reject, promise] means "currently loading"',
-							"if(installedChunkData) {",
-							Template.indent(["promises.push(installedChunkData[2]);"]),
-							"} else {",
-							Template.indent([
-								"// load the chunk and return promise to it",
-								"var promise = new Promise(function(resolve, reject) {",
-								Template.indent([
-									"installedChunkData = installedChunks[chunkId] = [resolve, reject];",
-									"var filename = require('path').join(__dirname, " +
-										mainTemplate.getAssetPath(
-											JSON.stringify(`/${chunkFilename}`),
-											{
-												hash: `" + ${mainTemplate.renderCurrentHashCode(
-													hash
-												)} + "`,
-												hashWithLength: length =>
-													`" + ${mainTemplate.renderCurrentHashCode(
-														hash,
-														length
-													)} + "`,
-												chunk: {
-													id: '" + chunkId + "',
-													hash: `" + ${JSON.stringify(
-														chunkMaps.hash
-													)}[chunkId] + "`,
-													hashWithLength: length => {
-														const shortChunkHashMap = {};
-														for (const chunkId of Object.keys(chunkMaps.hash)) {
-															if (typeof chunkMaps.hash[chunkId] === "string") {
-																shortChunkHashMap[chunkId] = chunkMaps.hash[
-																	chunkId
-																].substr(0, length);
-															}
-														}
-														return `" + ${JSON.stringify(
-															shortChunkHashMap
-														)}[chunkId] + "`;
-													},
-													contentHash: {
-														javascript: `" + ${JSON.stringify(
-															chunkMaps.contentHash.javascript
-														)}[chunkId] + "`
-													},
-													contentHashWithLength: {
-														javascript: length => {
-															const shortContentHashMap = {};
-															const contentHash =
-																chunkMaps.contentHash.javascript;
-															for (const chunkId of Object.keys(contentHash)) {
-																if (typeof contentHash[chunkId] === "string") {
-																	shortContentHashMap[chunkId] = contentHash[
-																		chunkId
-																	].substr(0, length);
-																}
-															}
-															return `" + ${JSON.stringify(
-																shortContentHashMap
-															)}[chunkId] + "`;
-														}
-													},
-													name: `" + (${JSON.stringify(
-														chunkMaps.name
-													)}[chunkId]||chunkId) + "`
-												},
-												contentHashType: "javascript"
-											}
-										) +
-										");",
-									"require('fs').readFile(filename, 'utf-8',  function(err, content) {",
-									Template.indent(
-										[
-											"if(err) return reject(err);",
-											"var chunk = {};",
-											"require('vm').runInThisContext('(function(exports, require, __dirname, __filename) {' + content + '\\n})', filename)" +
-												"(chunk, require, require('path').dirname(filename), filename);"
-										]
-											.concat(insertMoreModules)
-											.concat([
-												"var callbacks = [];",
-												"for(var i = 0; i < chunkIds.length; i++) {",
-												Template.indent([
-													"if(installedChunks[chunkIds[i]])",
-													Template.indent([
-														"callbacks = callbacks.concat(installedChunks[chunkIds[i]][0]);"
-													]),
-													"installedChunks[chunkIds[i]] = 0;"
-												]),
-												"}",
-												"for(i = 0; i < callbacks.length; i++)",
-												Template.indent("callbacks[i]();")
-											])
-									),
-									"});"
-								]),
-								"});",
-								"promises.push(installedChunkData[2] = promise);"
-							]),
-							"}"
-						]),
-						"}"
-					]);
-				} else {
-					const request = mainTemplate.getAssetPath(
-						JSON.stringify(`./${chunkFilename}`),
-						{
-							hash: `" + ${mainTemplate.renderCurrentHashCode(hash)} + "`,
-							hashWithLength: length =>
-								`" + ${mainTemplate.renderCurrentHashCode(hash, length)} + "`,
-							chunk: {
-								id: '" + chunkId + "',
-								hash: `" + ${JSON.stringify(chunkMaps.hash)}[chunkId] + "`,
-								hashWithLength: length => {
-									const shortChunkHashMap = {};
-									for (const chunkId of Object.keys(chunkMaps.hash)) {
-										if (typeof chunkMaps.hash[chunkId] === "string") {
-											shortChunkHashMap[chunkId] = chunkMaps.hash[
-												chunkId
-											].substr(0, length);
-										}
-									}
-									return `" + ${JSON.stringify(
-										shortChunkHashMap
-									)}[chunkId] + "`;
-								},
-								contentHash: {
-									javascript: `" + ${JSON.stringify(
-										chunkMaps.contentHash.javascript
-									)}[chunkId] + "`
-								},
-								contentHashWithLength: {
-									javascript: length => {
-										const shortContentHashMap = {};
-										const contentHash = chunkMaps.contentHash.javascript;
-										for (const chunkId of Object.keys(contentHash)) {
-											if (typeof contentHash[chunkId] === "string") {
-												shortContentHashMap[chunkId] = contentHash[
-													chunkId
-												].substr(0, length);
-											}
-										}
-										return `" + ${JSON.stringify(
-											shortContentHashMap
-										)}[chunkId] + "`;
-									}
-								},
-								name: `" + (${JSON.stringify(
-									chunkMaps.name
-								)}[chunkId]||chunkId) + "`
-							},
-							contentHashType: "javascript"
-						}
-					);
-					return Template.asString([
-						source,
-						"",
-						"// require() chunk loading for javascript",
-						"",
-						'// "0" is the signal for "already loaded"',
-						"if(installedChunks[chunkId] !== 0) {",
-						Template.indent(
-							[`var chunk = require(${request});`]
-								.concat(insertMoreModules)
-								.concat([
-									"for(var i = 0; i < chunkIds.length; i++)",
-									Template.indent("installedChunks[chunkIds[i]] = 0;")
-								])
-						),
-						"}"
-					]);
-				}
-			}
-		);
-		mainTemplate.hooks.hotBootstrap.tap(
-			"NodeMainTemplatePlugin",
-			(source, chunk, hash) => {
-				const hotUpdateChunkFilename =
-					mainTemplate.outputOptions.hotUpdateChunkFilename;
-				const hotUpdateMainFilename =
-					mainTemplate.outputOptions.hotUpdateMainFilename;
-				const chunkMaps = chunk.getChunkMaps();
-				const currentHotUpdateChunkFilename = mainTemplate.getAssetPath(
-					JSON.stringify(hotUpdateChunkFilename),
-					{
-						hash: `" + ${mainTemplate.renderCurrentHashCode(hash)} + "`,
-						hashWithLength: length =>
-							`" + ${mainTemplate.renderCurrentHashCode(hash, length)} + "`,
-						chunk: {
-							id: '" + chunkId + "',
-							hash: `" + ${JSON.stringify(chunkMaps.hash)}[chunkId] + "`,
-							hashWithLength: length => {
-								const shortChunkHashMap = {};
-								for (const chunkId of Object.keys(chunkMaps.hash)) {
-									if (typeof chunkMaps.hash[chunkId] === "string") {
-										shortChunkHashMap[chunkId] = chunkMaps.hash[chunkId].substr(
-											0,
-											length
-										);
-									}
-								}
-								return `" + ${JSON.stringify(shortChunkHashMap)}[chunkId] + "`;
-							},
-							name: `" + (${JSON.stringify(
-								chunkMaps.name
-							)}[chunkId]||chunkId) + "`
-						}
-					}
-				);
-				const currentHotUpdateMainFilename = mainTemplate.getAssetPath(
-					JSON.stringify(hotUpdateMainFilename),
-					{
-						hash: `" + ${mainTemplate.renderCurrentHashCode(hash)} + "`,
-						hashWithLength: length =>
-							`" + ${mainTemplate.renderCurrentHashCode(hash, length)} + "`
-					}
-				);
-				return Template.getFunctionContent(
-					asyncChunkLoading
-						? require("./NodeMainTemplateAsync.runtime")
-						: require("./NodeMainTemplate.runtime")
-				)
-					.replace(/\$require\$/g, mainTemplate.requireFn)
-					.replace(/\$hotMainFilename\$/g, currentHotUpdateMainFilename)
-					.replace(/\$hotChunkFilename\$/g, currentHotUpdateChunkFilename);
-			}
-		);
-		mainTemplate.hooks.hash.tap("NodeMainTemplatePlugin", hash => {
-			hash.update("node");
-			hash.update("4");
-		});
-	}
-};
diff --git a/lib/node/NodeOutputFileSystem.js b/lib/node/NodeOutputFileSystem.js
deleted file mode 100644
index 2789b576a62..00000000000
--- a/lib/node/NodeOutputFileSystem.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const fs = require("fs");
-const path = require("path");
-const mkdirp = require("mkdirp");
-
-class NodeOutputFileSystem {
-	constructor() {
-		this.mkdirp = mkdirp;
-		this.mkdir = fs.mkdir.bind(fs);
-		this.rmdir = fs.rmdir.bind(fs);
-		this.unlink = fs.unlink.bind(fs);
-		this.writeFile = fs.writeFile.bind(fs);
-		this.join = path.join.bind(path);
-	}
-}
-
-module.exports = NodeOutputFileSystem;
diff --git a/lib/node/NodeSourcePlugin.js b/lib/node/NodeSourcePlugin.js
index 081e1a6efd1..fca1fc9caaf 100644
--- a/lib/node/NodeSourcePlugin.js
+++ b/lib/node/NodeSourcePlugin.js
@@ -2,140 +2,18 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
-"use strict";
-const AliasPlugin = require("enhanced-resolve/lib/AliasPlugin");
-const ParserHelpers = require("../ParserHelpers");
-const nodeLibsBrowser = require("node-libs-browser");
-
-module.exports = class NodeSourcePlugin {
-	constructor(options) {
-		this.options = options;
-	}
-	apply(compiler) {
-		const options = this.options;
-		if (options === false) {
-			// allow single kill switch to turn off this plugin
-			return;
-		}
 
-		const getPathToModule = (module, type) => {
-			if (type === true || (type === undefined && nodeLibsBrowser[module])) {
-				if (!nodeLibsBrowser[module]) {
-					throw new Error(
-						`No browser version for node.js core module ${module} available`
-					);
-				}
-				return nodeLibsBrowser[module];
-			} else if (type === "mock") {
-				return require.resolve(`node-libs-browser/mock/${module}`);
-			} else if (type === "empty") {
-				return require.resolve("node-libs-browser/mock/empty");
-			} else {
-				return module;
-			}
-		};
+"use strict";
 
-		const addExpression = (parser, name, module, type, suffix) => {
-			suffix = suffix || "";
-			parser.hooks.expression.for(name).tap("NodeSourcePlugin", () => {
-				if (
-					parser.state.module &&
-					parser.state.module.resource === getPathToModule(module, type)
-				)
-					return;
-				const mockModule = ParserHelpers.requireFileAsExpression(
-					parser.state.module.context,
-					getPathToModule(module, type)
-				);
-				return ParserHelpers.addParsedVariableToModule(
-					parser,
-					name,
-					mockModule + suffix
-				);
-			});
-		};
+/** @typedef {import("../Compiler")} Compiler */
 
-		compiler.hooks.compilation.tap(
-			"NodeSourcePlugin",
-			(compilation, { normalModuleFactory }) => {
-				const handler = (parser, parserOptions) => {
-					if (parserOptions.node === false) return;
+class NodeSourcePlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {}
+}
 
-					let localOptions = options;
-					if (parserOptions.node) {
-						localOptions = Object.assign({}, localOptions, parserOptions.node);
-					}
-					if (localOptions.global) {
-						parser.hooks.expression
-							.for("global")
-							.tap("NodeSourcePlugin", () => {
-								const retrieveGlobalModule = ParserHelpers.requireFileAsExpression(
-									parser.state.module.context,
-									require.resolve("../../buildin/global")
-								);
-								return ParserHelpers.addParsedVariableToModule(
-									parser,
-									"global",
-									retrieveGlobalModule
-								);
-							});
-					}
-					if (localOptions.process) {
-						const processType = localOptions.process;
-						addExpression(parser, "process", "process", processType);
-					}
-					if (localOptions.console) {
-						const consoleType = localOptions.console;
-						addExpression(parser, "console", "console", consoleType);
-					}
-					const bufferType = localOptions.Buffer;
-					if (bufferType) {
-						addExpression(parser, "Buffer", "buffer", bufferType, ".Buffer");
-					}
-					if (localOptions.setImmediate) {
-						const setImmediateType = localOptions.setImmediate;
-						addExpression(
-							parser,
-							"setImmediate",
-							"timers",
-							setImmediateType,
-							".setImmediate"
-						);
-						addExpression(
-							parser,
-							"clearImmediate",
-							"timers",
-							setImmediateType,
-							".clearImmediate"
-						);
-					}
-				};
-				normalModuleFactory.hooks.parser
-					.for("javascript/auto")
-					.tap("NodeSourcePlugin", handler);
-				normalModuleFactory.hooks.parser
-					.for("javascript/dynamic")
-					.tap("NodeSourcePlugin", handler);
-			}
-		);
-		compiler.hooks.afterResolvers.tap("NodeSourcePlugin", compiler => {
-			for (const lib of Object.keys(nodeLibsBrowser)) {
-				if (options[lib] !== false) {
-					compiler.resolverFactory.hooks.resolver
-						.for("normal")
-						.tap("NodeSourcePlugin", resolver => {
-							new AliasPlugin(
-								"described-resolve",
-								{
-									name: lib,
-									onlyModule: true,
-									alias: getPathToModule(lib, options[lib])
-								},
-								"resolve"
-							).apply(resolver);
-						});
-				}
-			}
-		});
-	}
-};
+module.exports = NodeSourcePlugin;
diff --git a/lib/node/NodeTargetPlugin.js b/lib/node/NodeTargetPlugin.js
index 1ac5d8a5fac..1cc01810daa 100644
--- a/lib/node/NodeTargetPlugin.js
+++ b/lib/node/NodeTargetPlugin.js
@@ -2,17 +2,83 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
 const ExternalsPlugin = require("../ExternalsPlugin");
 
-const builtins =
-	// eslint-disable-next-line node/no-unsupported-features/node-builtins,node/no-deprecated-api
-	require("module").builtinModules || Object.keys(process.binding("natives"));
+/** @typedef {import("../Compiler")} Compiler */
+
+const builtins = [
+	"assert",
+	"assert/strict",
+	"async_hooks",
+	"buffer",
+	"child_process",
+	"cluster",
+	"console",
+	"constants",
+	"crypto",
+	"dgram",
+	"diagnostics_channel",
+	"dns",
+	"dns/promises",
+	"domain",
+	"events",
+	"fs",
+	"fs/promises",
+	"http",
+	"http2",
+	"https",
+	"inspector",
+	"inspector/promises",
+	"module",
+	"net",
+	"os",
+	"path",
+	"path/posix",
+	"path/win32",
+	"perf_hooks",
+	"process",
+	"punycode",
+	"querystring",
+	"readline",
+	"readline/promises",
+	"repl",
+	"stream",
+	"stream/consumers",
+	"stream/promises",
+	"stream/web",
+	"string_decoder",
+	"sys",
+	"timers",
+	"timers/promises",
+	"tls",
+	"trace_events",
+	"tty",
+	"url",
+	"util",
+	"util/types",
+	"v8",
+	"vm",
+	"wasi",
+	"worker_threads",
+	"zlib",
+	/^node:/,
+
+	// cspell:word pnpapi
+	// Yarn PnP adds pnpapi as "builtin"
+	"pnpapi"
+];
 
 class NodeTargetPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		new ExternalsPlugin("commonjs", builtins).apply(compiler);
+		new ExternalsPlugin("node-commonjs", builtins).apply(compiler);
 	}
 }
 
diff --git a/lib/node/NodeTemplatePlugin.js b/lib/node/NodeTemplatePlugin.js
index cdb1076b99a..03877443abc 100644
--- a/lib/node/NodeTemplatePlugin.js
+++ b/lib/node/NodeTemplatePlugin.js
@@ -5,26 +5,36 @@
 
 "use strict";
 
-const NodeMainTemplatePlugin = require("./NodeMainTemplatePlugin");
-const NodeChunkTemplatePlugin = require("./NodeChunkTemplatePlugin");
-const NodeHotUpdateChunkTemplatePlugin = require("./NodeHotUpdateChunkTemplatePlugin");
+const CommonJsChunkFormatPlugin = require("../javascript/CommonJsChunkFormatPlugin");
+const EnableChunkLoadingPlugin = require("../javascript/EnableChunkLoadingPlugin");
+
+/** @typedef {import("../Compiler")} Compiler */
+
+/**
+ * @typedef {object} NodeTemplatePluginOptions
+ * @property {boolean=} asyncChunkLoading enable async chunk loading
+ */
 
 class NodeTemplatePlugin {
-	constructor(options) {
-		options = options || {};
-		this.asyncChunkLoading = options.asyncChunkLoading;
+	/**
+	 * @param {NodeTemplatePluginOptions=} options options object
+	 */
+	constructor(options = {}) {
+		this._options = options;
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		compiler.hooks.thisCompilation.tap("NodeTemplatePlugin", compilation => {
-			new NodeMainTemplatePlugin(this.asyncChunkLoading).apply(
-				compilation.mainTemplate
-			);
-			new NodeChunkTemplatePlugin().apply(compilation.chunkTemplate);
-			new NodeHotUpdateChunkTemplatePlugin().apply(
-				compilation.hotUpdateChunkTemplate
-			);
-		});
+		const chunkLoading = this._options.asyncChunkLoading
+			? "async-node"
+			: "require";
+		compiler.options.output.chunkLoading = chunkLoading;
+		new CommonJsChunkFormatPlugin().apply(compiler);
+		new EnableChunkLoadingPlugin(chunkLoading).apply(compiler);
 	}
 }
 
diff --git a/lib/node/NodeWatchFileSystem.js b/lib/node/NodeWatchFileSystem.js
index 235e0f062fa..091864a2b94 100644
--- a/lib/node/NodeWatchFileSystem.js
+++ b/lib/node/NodeWatchFileSystem.js
@@ -2,28 +2,47 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const util = require("util");
 const Watchpack = require("watchpack");
-const objectToMap = require("../util/objectToMap");
+
+/** @typedef {import("../../declarations/WebpackOptions").WatchOptions} WatchOptions */
+/** @typedef {import("../FileSystemInfo").FileSystemInfoEntry} FileSystemInfoEntry */
+/** @typedef {import("../util/fs").InputFileSystem} InputFileSystem */
+/** @typedef {import("../util/fs").WatchMethod} WatchMethod */
 
 class NodeWatchFileSystem {
+	/**
+	 * @param {InputFileSystem} inputFileSystem input filesystem
+	 */
 	constructor(inputFileSystem) {
 		this.inputFileSystem = inputFileSystem;
 		this.watcherOptions = {
 			aggregateTimeout: 0
 		};
+		/** @type {Watchpack | null} */
 		this.watcher = new Watchpack(this.watcherOptions);
 	}
 
-	watch(files, dirs, missing, startTime, options, callback, callbackUndelayed) {
-		if (!Array.isArray(files)) {
+	/** @type {WatchMethod} */
+	watch(
+		files,
+		directories,
+		missing,
+		startTime,
+		options,
+		callback,
+		callbackUndelayed
+	) {
+		if (!files || typeof files[Symbol.iterator] !== "function") {
 			throw new Error("Invalid arguments: 'files'");
 		}
-		if (!Array.isArray(dirs)) {
-			throw new Error("Invalid arguments: 'dirs'");
+		if (!directories || typeof directories[Symbol.iterator] !== "function") {
+			throw new Error("Invalid arguments: 'directories'");
 		}
-		if (!Array.isArray(missing)) {
+		if (!missing || typeof missing[Symbol.iterator] !== "function") {
 			throw new Error("Invalid arguments: 'missing'");
 		}
 		if (typeof callback !== "function") {
@@ -44,35 +63,51 @@ class NodeWatchFileSystem {
 		if (callbackUndelayed) {
 			this.watcher.once("change", callbackUndelayed);
 		}
-		const cachedFiles = files;
-		const cachedDirs = dirs;
-		this.watcher.once("aggregated", (changes, removals) => {
-			changes = changes.concat(removals);
-			if (this.inputFileSystem && this.inputFileSystem.purge) {
-				this.inputFileSystem.purge(changes);
+
+		const fetchTimeInfo = () => {
+			const fileTimeInfoEntries = new Map();
+			const contextTimeInfoEntries = new Map();
+			if (this.watcher) {
+				this.watcher.collectTimeInfoEntries(
+					fileTimeInfoEntries,
+					contextTimeInfoEntries
+				);
 			}
-			const times = objectToMap(this.watcher.getTimes());
-			files = new Set(files);
-			dirs = new Set(dirs);
-			missing = new Set(missing);
-			removals = new Set(removals.filter(file => files.has(file)));
-			callback(
-				null,
-				changes.filter(file => files.has(file)).sort(),
-				changes.filter(file => dirs.has(file)).sort(),
-				changes.filter(file => missing.has(file)).sort(),
-				times,
-				times,
-				removals
-			);
-		});
+			return { fileTimeInfoEntries, contextTimeInfoEntries };
+		};
+		this.watcher.once(
+			"aggregated",
+			/**
+			 * @param {Set} changes changes
+			 * @param {Set} removals removals
+			 */
+			(changes, removals) => {
+				// pause emitting events (avoids clearing aggregated changes and removals on timeout)
+				/** @type {Watchpack} */
+				(this.watcher).pause();
 
-		this.watcher.watch(
-			cachedFiles.concat(missing),
-			cachedDirs.concat(missing),
-			startTime
+				const fs = this.inputFileSystem;
+				if (fs && fs.purge) {
+					for (const item of changes) {
+						fs.purge(item);
+					}
+					for (const item of removals) {
+						fs.purge(item);
+					}
+				}
+				const { fileTimeInfoEntries, contextTimeInfoEntries } = fetchTimeInfo();
+				callback(
+					null,
+					fileTimeInfoEntries,
+					contextTimeInfoEntries,
+					changes,
+					removals
+				);
+			}
 		);
 
+		this.watcher.watch({ files, directories, missing, startTime });
+
 		if (oldWatcher) {
 			oldWatcher.close();
 		}
@@ -88,19 +123,67 @@ class NodeWatchFileSystem {
 					this.watcher.pause();
 				}
 			},
-			getFileTimestamps: () => {
-				if (this.watcher) {
-					return objectToMap(this.watcher.getTimes());
-				} else {
-					return new Map();
-				}
-			},
-			getContextTimestamps: () => {
-				if (this.watcher) {
-					return objectToMap(this.watcher.getTimes());
-				} else {
-					return new Map();
+			getAggregatedRemovals: util.deprecate(
+				() => {
+					const items = this.watcher && this.watcher.aggregatedRemovals;
+					const fs = this.inputFileSystem;
+					if (items && fs && fs.purge) {
+						for (const item of items) {
+							fs.purge(item);
+						}
+					}
+					return items;
+				},
+				"Watcher.getAggregatedRemovals is deprecated in favor of Watcher.getInfo since that's more performant.",
+				"DEP_WEBPACK_WATCHER_GET_AGGREGATED_REMOVALS"
+			),
+			getAggregatedChanges: util.deprecate(
+				() => {
+					const items = this.watcher && this.watcher.aggregatedChanges;
+					const fs = this.inputFileSystem;
+					if (items && fs && fs.purge) {
+						for (const item of items) {
+							fs.purge(item);
+						}
+					}
+					return items;
+				},
+				"Watcher.getAggregatedChanges is deprecated in favor of Watcher.getInfo since that's more performant.",
+				"DEP_WEBPACK_WATCHER_GET_AGGREGATED_CHANGES"
+			),
+			getFileTimeInfoEntries: util.deprecate(
+				() => fetchTimeInfo().fileTimeInfoEntries,
+				"Watcher.getFileTimeInfoEntries is deprecated in favor of Watcher.getInfo since that's more performant.",
+				"DEP_WEBPACK_WATCHER_FILE_TIME_INFO_ENTRIES"
+			),
+			getContextTimeInfoEntries: util.deprecate(
+				() => fetchTimeInfo().contextTimeInfoEntries,
+				"Watcher.getContextTimeInfoEntries is deprecated in favor of Watcher.getInfo since that's more performant.",
+				"DEP_WEBPACK_WATCHER_CONTEXT_TIME_INFO_ENTRIES"
+			),
+			getInfo: () => {
+				const removals = this.watcher && this.watcher.aggregatedRemovals;
+				const changes = this.watcher && this.watcher.aggregatedChanges;
+				const fs = this.inputFileSystem;
+				if (fs && fs.purge) {
+					if (removals) {
+						for (const item of removals) {
+							fs.purge(item);
+						}
+					}
+					if (changes) {
+						for (const item of changes) {
+							fs.purge(item);
+						}
+					}
 				}
+				const { fileTimeInfoEntries, contextTimeInfoEntries } = fetchTimeInfo();
+				return {
+					changes,
+					removals,
+					fileTimeInfoEntries,
+					contextTimeInfoEntries
+				};
 			}
 		};
 	}
diff --git a/lib/node/ReadFileChunkLoadingRuntimeModule.js b/lib/node/ReadFileChunkLoadingRuntimeModule.js
new file mode 100644
index 00000000000..fd138b2e899
--- /dev/null
+++ b/lib/node/ReadFileChunkLoadingRuntimeModule.js
@@ -0,0 +1,301 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+const Template = require("../Template");
+const {
+	chunkHasJs,
+	getChunkFilenameTemplate
+} = require("../javascript/JavascriptModulesPlugin");
+const { getInitialChunkIds } = require("../javascript/StartupHelpers");
+const compileBooleanMatcher = require("../util/compileBooleanMatcher");
+const { getUndoPath } = require("../util/identifier");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Module").ReadOnlyRuntimeRequirements} ReadOnlyRuntimeRequirements */
+
+class ReadFileChunkLoadingRuntimeModule extends RuntimeModule {
+	/**
+	 * @param {ReadOnlyRuntimeRequirements} runtimeRequirements runtime requirements
+	 */
+	constructor(runtimeRequirements) {
+		super("readFile chunk loading", RuntimeModule.STAGE_ATTACH);
+		this.runtimeRequirements = runtimeRequirements;
+	}
+
+	/**
+	 * @private
+	 * @param {Chunk} chunk chunk
+	 * @param {string} rootOutputDir root output directory
+	 * @returns {string} generated code
+	 */
+	_generateBaseUri(chunk, rootOutputDir) {
+		const options = chunk.getEntryOptions();
+		if (options && options.baseUri) {
+			return `${RuntimeGlobals.baseURI} = ${JSON.stringify(options.baseUri)};`;
+		}
+
+		return `${RuntimeGlobals.baseURI} = require("url").pathToFileURL(${
+			rootOutputDir
+				? `__dirname + ${JSON.stringify(`/${rootOutputDir}`)}`
+				: "__filename"
+		});`;
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const chunkGraph = /** @type {ChunkGraph} */ (this.chunkGraph);
+		const chunk = /** @type {Chunk} */ (this.chunk);
+		const { runtimeTemplate } = compilation;
+		const fn = RuntimeGlobals.ensureChunkHandlers;
+		const withBaseURI = this.runtimeRequirements.has(RuntimeGlobals.baseURI);
+		const withExternalInstallChunk = this.runtimeRequirements.has(
+			RuntimeGlobals.externalInstallChunk
+		);
+		const withOnChunkLoad = this.runtimeRequirements.has(
+			RuntimeGlobals.onChunksLoaded
+		);
+		const withLoading = this.runtimeRequirements.has(
+			RuntimeGlobals.ensureChunkHandlers
+		);
+		const withHmr = this.runtimeRequirements.has(
+			RuntimeGlobals.hmrDownloadUpdateHandlers
+		);
+		const withHmrManifest = this.runtimeRequirements.has(
+			RuntimeGlobals.hmrDownloadManifest
+		);
+		const conditionMap = chunkGraph.getChunkConditionMap(chunk, chunkHasJs);
+		const hasJsMatcher = compileBooleanMatcher(conditionMap);
+		const initialChunkIds = getInitialChunkIds(chunk, chunkGraph, chunkHasJs);
+
+		const outputName = compilation.getPath(
+			getChunkFilenameTemplate(chunk, compilation.outputOptions),
+			{
+				chunk,
+				contentHashType: "javascript"
+			}
+		);
+		const rootOutputDir = getUndoPath(
+			outputName,
+			/** @type {string} */ (compilation.outputOptions.path),
+			false
+		);
+
+		const stateExpression = withHmr
+			? `${RuntimeGlobals.hmrRuntimeStatePrefix}_readFileVm`
+			: undefined;
+
+		return Template.asString([
+			withBaseURI
+				? this._generateBaseUri(chunk, rootOutputDir)
+				: "// no baseURI",
+			"",
+			"// object to store loaded chunks",
+			'// "0" means "already loaded", Promise means loading',
+			`var installedChunks = ${
+				stateExpression ? `${stateExpression} = ${stateExpression} || ` : ""
+			}{`,
+			Template.indent(
+				Array.from(initialChunkIds, id => `${JSON.stringify(id)}: 0`).join(
+					",\n"
+				)
+			),
+			"};",
+			"",
+			withOnChunkLoad
+				? `${
+						RuntimeGlobals.onChunksLoaded
+					}.readFileVm = ${runtimeTemplate.returningFunction(
+						"installedChunks[chunkId] === 0",
+						"chunkId"
+					)};`
+				: "// no on chunks loaded",
+			"",
+			withLoading || withExternalInstallChunk
+				? `var installChunk = ${runtimeTemplate.basicFunction("chunk", [
+						"var moreModules = chunk.modules, chunkIds = chunk.ids, runtime = chunk.runtime;",
+						"for(var moduleId in moreModules) {",
+						Template.indent([
+							`if(${RuntimeGlobals.hasOwnProperty}(moreModules, moduleId)) {`,
+							Template.indent([
+								`${RuntimeGlobals.moduleFactories}[moduleId] = moreModules[moduleId];`
+							]),
+							"}"
+						]),
+						"}",
+						`if(runtime) runtime(${RuntimeGlobals.require});`,
+						"for(var i = 0; i < chunkIds.length; i++) {",
+						Template.indent([
+							"if(installedChunks[chunkIds[i]]) {",
+							Template.indent(["installedChunks[chunkIds[i]][0]();"]),
+							"}",
+							"installedChunks[chunkIds[i]] = 0;"
+						]),
+						"}",
+						withOnChunkLoad ? `${RuntimeGlobals.onChunksLoaded}();` : ""
+					])};`
+				: "// no chunk install function needed",
+			"",
+			withLoading
+				? Template.asString([
+						"// ReadFile + VM.run chunk loading for javascript",
+						`${fn}.readFileVm = function(chunkId, promises) {`,
+						hasJsMatcher !== false
+							? Template.indent([
+									"",
+									"var installedChunkData = installedChunks[chunkId];",
+									'if(installedChunkData !== 0) { // 0 means "already installed".',
+									Template.indent([
+										'// array of [resolve, reject, promise] means "currently loading"',
+										"if(installedChunkData) {",
+										Template.indent(["promises.push(installedChunkData[2]);"]),
+										"} else {",
+										Template.indent([
+											hasJsMatcher === true
+												? "if(true) { // all chunks have JS"
+												: `if(${hasJsMatcher("chunkId")}) {`,
+											Template.indent([
+												"// load the chunk and return promise to it",
+												"var promise = new Promise(function(resolve, reject) {",
+												Template.indent([
+													"installedChunkData = installedChunks[chunkId] = [resolve, reject];",
+													`var filename = require('path').join(__dirname, ${JSON.stringify(
+														rootOutputDir
+													)} + ${
+														RuntimeGlobals.getChunkScriptFilename
+													}(chunkId));`,
+													"require('fs').readFile(filename, 'utf-8', function(err, content) {",
+													Template.indent([
+														"if(err) return reject(err);",
+														"var chunk = {};",
+														"require('vm').runInThisContext('(function(exports, require, __dirname, __filename) {' + content + '\\n})', filename)" +
+															"(chunk, require, require('path').dirname(filename), filename);",
+														"installChunk(chunk);"
+													]),
+													"});"
+												]),
+												"});",
+												"promises.push(installedChunkData[2] = promise);"
+											]),
+											hasJsMatcher === true
+												? "}"
+												: "} else installedChunks[chunkId] = 0;"
+										]),
+										"}"
+									]),
+									"}"
+								])
+							: Template.indent(["installedChunks[chunkId] = 0;"]),
+						"};"
+					])
+				: "// no chunk loading",
+			"",
+			withExternalInstallChunk
+				? Template.asString([
+						`module.exports = ${RuntimeGlobals.require};`,
+						`${RuntimeGlobals.externalInstallChunk} = installChunk;`
+					])
+				: "// no external install chunk",
+			"",
+			withHmr
+				? Template.asString([
+						"function loadUpdateChunk(chunkId, updatedModulesList) {",
+						Template.indent([
+							"return new Promise(function(resolve, reject) {",
+							Template.indent([
+								`var filename = require('path').join(__dirname, ${JSON.stringify(
+									rootOutputDir
+								)} + ${RuntimeGlobals.getChunkUpdateScriptFilename}(chunkId));`,
+								"require('fs').readFile(filename, 'utf-8', function(err, content) {",
+								Template.indent([
+									"if(err) return reject(err);",
+									"var update = {};",
+									"require('vm').runInThisContext('(function(exports, require, __dirname, __filename) {' + content + '\\n})', filename)" +
+										"(update, require, require('path').dirname(filename), filename);",
+									"var updatedModules = update.modules;",
+									"var runtime = update.runtime;",
+									"for(var moduleId in updatedModules) {",
+									Template.indent([
+										`if(${RuntimeGlobals.hasOwnProperty}(updatedModules, moduleId)) {`,
+										Template.indent([
+											"currentUpdate[moduleId] = updatedModules[moduleId];",
+											"if(updatedModulesList) updatedModulesList.push(moduleId);"
+										]),
+										"}"
+									]),
+									"}",
+									"if(runtime) currentUpdateRuntime.push(runtime);",
+									"resolve();"
+								]),
+								"});"
+							]),
+							"});"
+						]),
+						"}",
+						"",
+						Template.getFunctionContent(
+							require("../hmr/JavascriptHotModuleReplacement.runtime.js")
+						)
+							.replace(/\$key\$/g, "readFileVm")
+							.replace(/\$installedChunks\$/g, "installedChunks")
+							.replace(/\$loadUpdateChunk\$/g, "loadUpdateChunk")
+							.replace(/\$moduleCache\$/g, RuntimeGlobals.moduleCache)
+							.replace(/\$moduleFactories\$/g, RuntimeGlobals.moduleFactories)
+							.replace(
+								/\$ensureChunkHandlers\$/g,
+								RuntimeGlobals.ensureChunkHandlers
+							)
+							.replace(/\$hasOwnProperty\$/g, RuntimeGlobals.hasOwnProperty)
+							.replace(/\$hmrModuleData\$/g, RuntimeGlobals.hmrModuleData)
+							.replace(
+								/\$hmrDownloadUpdateHandlers\$/g,
+								RuntimeGlobals.hmrDownloadUpdateHandlers
+							)
+							.replace(
+								/\$hmrInvalidateModuleHandlers\$/g,
+								RuntimeGlobals.hmrInvalidateModuleHandlers
+							)
+					])
+				: "// no HMR",
+			"",
+			withHmrManifest
+				? Template.asString([
+						`${RuntimeGlobals.hmrDownloadManifest} = function() {`,
+						Template.indent([
+							"return new Promise(function(resolve, reject) {",
+							Template.indent([
+								`var filename = require('path').join(__dirname, ${JSON.stringify(
+									rootOutputDir
+								)} + ${RuntimeGlobals.getUpdateManifestFilename}());`,
+								"require('fs').readFile(filename, 'utf-8', function(err, content) {",
+								Template.indent([
+									"if(err) {",
+									Template.indent([
+										'if(err.code === "ENOENT") return resolve();',
+										"return reject(err);"
+									]),
+									"}",
+									"try { resolve(JSON.parse(content)); }",
+									"catch(e) { reject(e); }"
+								]),
+								"});"
+							]),
+							"});"
+						]),
+						"}"
+					])
+				: "// no HMR manifest"
+		]);
+	}
+}
+
+module.exports = ReadFileChunkLoadingRuntimeModule;
diff --git a/lib/node/ReadFileCompileAsyncWasmPlugin.js b/lib/node/ReadFileCompileAsyncWasmPlugin.js
new file mode 100644
index 00000000000..57da42bf446
--- /dev/null
+++ b/lib/node/ReadFileCompileAsyncWasmPlugin.js
@@ -0,0 +1,122 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { WEBASSEMBLY_MODULE_TYPE_ASYNC } = require("../ModuleTypeConstants");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+const AsyncWasmLoadingRuntimeModule = require("../wasm-async/AsyncWasmLoadingRuntimeModule");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compiler")} Compiler */
+
+/**
+ * @typedef {object} ReadFileCompileAsyncWasmPluginOptions
+ * @property {boolean=} import use import?
+ */
+
+const PLUGIN_NAME = "ReadFileCompileAsyncWasmPlugin";
+
+class ReadFileCompileAsyncWasmPlugin {
+	/**
+	 * @param {ReadFileCompileAsyncWasmPluginOptions=} options options object
+	 */
+	constructor({ import: useImport = false } = {}) {
+		this._import = useImport;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.thisCompilation.tap(PLUGIN_NAME, compilation => {
+			const globalWasmLoading = compilation.outputOptions.wasmLoading;
+			/**
+			 * @param {Chunk} chunk chunk
+			 * @returns {boolean} true, if wasm loading is enabled for the chunk
+			 */
+			const isEnabledForChunk = chunk => {
+				const options = chunk.getEntryOptions();
+				const wasmLoading =
+					options && options.wasmLoading !== undefined
+						? options.wasmLoading
+						: globalWasmLoading;
+				return wasmLoading === "async-node";
+			};
+
+			/**
+			 * @type {(path: string) => string} callback to generate code to load the wasm file
+			 */
+			const generateLoadBinaryCode = this._import
+				? path =>
+						Template.asString([
+							"Promise.all([import('fs'), import('url')]).then(([{ readFile }, { URL }]) => new Promise((resolve, reject) => {",
+							Template.indent([
+								`readFile(new URL(${path}, ${compilation.outputOptions.importMetaName}.url), (err, buffer) => {`,
+								Template.indent([
+									"if (err) return reject(err);",
+									"",
+									"// Fake fetch response",
+									"resolve({",
+									Template.indent(["arrayBuffer() { return buffer; }"]),
+									"});"
+								]),
+								"});"
+							]),
+							"}))"
+						])
+				: path =>
+						Template.asString([
+							"new Promise(function (resolve, reject) {",
+							Template.indent([
+								"try {",
+								Template.indent([
+									"var { readFile } = require('fs');",
+									"var { join } = require('path');",
+									"",
+									`readFile(join(__dirname, ${path}), function(err, buffer){`,
+									Template.indent([
+										"if (err) return reject(err);",
+										"",
+										"// Fake fetch response",
+										"resolve({",
+										Template.indent(["arrayBuffer() { return buffer; }"]),
+										"});"
+									]),
+									"});"
+								]),
+								"} catch (err) { reject(err); }"
+							]),
+							"})"
+						]);
+
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.instantiateWasm)
+				.tap(PLUGIN_NAME, (chunk, set, { chunkGraph }) => {
+					if (!isEnabledForChunk(chunk)) return;
+					if (
+						!chunkGraph.hasModuleInGraph(
+							chunk,
+							m => m.type === WEBASSEMBLY_MODULE_TYPE_ASYNC
+						)
+					) {
+						return;
+					}
+					compilation.addRuntimeModule(
+						chunk,
+						new AsyncWasmLoadingRuntimeModule({
+							generateLoadBinaryCode,
+							supportsStreaming: false
+						})
+					);
+				});
+		});
+	}
+}
+
+module.exports = ReadFileCompileAsyncWasmPlugin;
diff --git a/lib/node/ReadFileCompileWasmPlugin.js b/lib/node/ReadFileCompileWasmPlugin.js
new file mode 100644
index 00000000000..5ef4feb3f6b
--- /dev/null
+++ b/lib/node/ReadFileCompileWasmPlugin.js
@@ -0,0 +1,128 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { WEBASSEMBLY_MODULE_TYPE_SYNC } = require("../ModuleTypeConstants");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+const WasmChunkLoadingRuntimeModule = require("../wasm-sync/WasmChunkLoadingRuntimeModule");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compiler")} Compiler */
+
+/**
+ * @typedef {object} ReadFileCompileWasmPluginOptions
+ * @property {boolean=} mangleImports mangle imports
+ * @property {boolean=} import use import?
+ */
+
+// TODO webpack 6 remove
+
+const PLUGIN_NAME = "ReadFileCompileWasmPlugin";
+
+class ReadFileCompileWasmPlugin {
+	/**
+	 * @param {ReadFileCompileWasmPluginOptions=} options options object
+	 */
+	constructor(options = {}) {
+		this.options = options;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.thisCompilation.tap(PLUGIN_NAME, compilation => {
+			const globalWasmLoading = compilation.outputOptions.wasmLoading;
+			/**
+			 * @param {Chunk} chunk chunk
+			 * @returns {boolean} true, when wasm loading is enabled for the chunk
+			 */
+			const isEnabledForChunk = chunk => {
+				const options = chunk.getEntryOptions();
+				const wasmLoading =
+					options && options.wasmLoading !== undefined
+						? options.wasmLoading
+						: globalWasmLoading;
+				return wasmLoading === "async-node";
+			};
+
+			/**
+			 * @type {(path: string) => string} callback to generate code to load the wasm file
+			 */
+			const generateLoadBinaryCode = this.options.import
+				? path =>
+						Template.asString([
+							"Promise.all([import('fs'), import('url')]).then(([{ readFile }, { URL }]) => new Promise((resolve, reject) => {",
+							Template.indent([
+								`readFile(new URL(${path}, ${compilation.outputOptions.importMetaName}.url), (err, buffer) => {`,
+								Template.indent([
+									"if (err) return reject(err);",
+									"",
+									"// Fake fetch response",
+									"resolve({",
+									Template.indent(["arrayBuffer() { return buffer; }"]),
+									"});"
+								]),
+								"});"
+							]),
+							"}))"
+						])
+				: path =>
+						Template.asString([
+							"new Promise(function (resolve, reject) {",
+							Template.indent([
+								"var { readFile } = require('fs');",
+								"var { join } = require('path');",
+								"",
+								"try {",
+								Template.indent([
+									`readFile(join(__dirname, ${path}), function(err, buffer){`,
+									Template.indent([
+										"if (err) return reject(err);",
+										"",
+										"// Fake fetch response",
+										"resolve({",
+										Template.indent(["arrayBuffer() { return buffer; }"]),
+										"});"
+									]),
+									"});"
+								]),
+								"} catch (err) { reject(err); }"
+							]),
+							"})"
+						]);
+
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.ensureChunkHandlers)
+				.tap(PLUGIN_NAME, (chunk, set, { chunkGraph }) => {
+					if (!isEnabledForChunk(chunk)) return;
+					if (
+						!chunkGraph.hasModuleInGraph(
+							chunk,
+							m => m.type === WEBASSEMBLY_MODULE_TYPE_SYNC
+						)
+					) {
+						return;
+					}
+					set.add(RuntimeGlobals.moduleCache);
+					compilation.addRuntimeModule(
+						chunk,
+						new WasmChunkLoadingRuntimeModule({
+							generateLoadBinaryCode,
+							supportsStreaming: false,
+							mangleImports: this.options.mangleImports,
+							runtimeRequirements: set
+						})
+					);
+				});
+		});
+	}
+}
+
+module.exports = ReadFileCompileWasmPlugin;
diff --git a/lib/node/ReadFileCompileWasmTemplatePlugin.js b/lib/node/ReadFileCompileWasmTemplatePlugin.js
deleted file mode 100644
index a7566b81f47..00000000000
--- a/lib/node/ReadFileCompileWasmTemplatePlugin.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const Template = require("../Template");
-const WasmMainTemplatePlugin = require("../wasm/WasmMainTemplatePlugin");
-
-class ReadFileCompileWasmTemplatePlugin {
-	constructor(options) {
-		this.options = options || {};
-	}
-
-	apply(compiler) {
-		compiler.hooks.thisCompilation.tap(
-			"ReadFileCompileWasmTemplatePlugin",
-			compilation => {
-				const generateLoadBinaryCode = path =>
-					Template.asString([
-						"new Promise(function (resolve, reject) {",
-						Template.indent([
-							"var { readFile } = require('fs');",
-							"var { join } = require('path');",
-							"",
-							"try {",
-							Template.indent([
-								`readFile(join(__dirname, ${path}), function(err, buffer){`,
-								Template.indent([
-									"if (err) return reject(err);",
-									"",
-									"// Fake fetch response",
-									"resolve({",
-									Template.indent([
-										"arrayBuffer() { return Promise.resolve(buffer); }"
-									]),
-									"});"
-								]),
-								"});"
-							]),
-							"} catch (err) { reject(err); }"
-						]),
-						"})"
-					]);
-
-				const plugin = new WasmMainTemplatePlugin(
-					Object.assign(
-						{
-							generateLoadBinaryCode,
-							supportsStreaming: false
-						},
-						this.options
-					)
-				);
-				plugin.apply(compilation.mainTemplate);
-			}
-		);
-	}
-}
-
-module.exports = ReadFileCompileWasmTemplatePlugin;
diff --git a/lib/node/RequireChunkLoadingRuntimeModule.js b/lib/node/RequireChunkLoadingRuntimeModule.js
new file mode 100644
index 00000000000..1d4959459d5
--- /dev/null
+++ b/lib/node/RequireChunkLoadingRuntimeModule.js
@@ -0,0 +1,246 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+const Template = require("../Template");
+const {
+	chunkHasJs,
+	getChunkFilenameTemplate
+} = require("../javascript/JavascriptModulesPlugin");
+const { getInitialChunkIds } = require("../javascript/StartupHelpers");
+const compileBooleanMatcher = require("../util/compileBooleanMatcher");
+const { getUndoPath } = require("../util/identifier");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Module").ReadOnlyRuntimeRequirements} ReadOnlyRuntimeRequirements */
+
+class RequireChunkLoadingRuntimeModule extends RuntimeModule {
+	/**
+	 * @param {ReadOnlyRuntimeRequirements} runtimeRequirements runtime requirements
+	 */
+	constructor(runtimeRequirements) {
+		super("require chunk loading", RuntimeModule.STAGE_ATTACH);
+		this.runtimeRequirements = runtimeRequirements;
+	}
+
+	/**
+	 * @private
+	 * @param {Chunk} chunk chunk
+	 * @param {string} rootOutputDir root output directory
+	 * @returns {string} generated code
+	 */
+	_generateBaseUri(chunk, rootOutputDir) {
+		const options = chunk.getEntryOptions();
+		if (options && options.baseUri) {
+			return `${RuntimeGlobals.baseURI} = ${JSON.stringify(options.baseUri)};`;
+		}
+
+		return `${RuntimeGlobals.baseURI} = require("url").pathToFileURL(${
+			rootOutputDir !== "./"
+				? `__dirname + ${JSON.stringify(`/${rootOutputDir}`)}`
+				: "__filename"
+		});`;
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const chunkGraph = /** @type {ChunkGraph} */ (this.chunkGraph);
+		const chunk = /** @type {Chunk} */ (this.chunk);
+		const { runtimeTemplate } = compilation;
+		const fn = RuntimeGlobals.ensureChunkHandlers;
+		const withBaseURI = this.runtimeRequirements.has(RuntimeGlobals.baseURI);
+		const withExternalInstallChunk = this.runtimeRequirements.has(
+			RuntimeGlobals.externalInstallChunk
+		);
+		const withOnChunkLoad = this.runtimeRequirements.has(
+			RuntimeGlobals.onChunksLoaded
+		);
+		const withLoading = this.runtimeRequirements.has(
+			RuntimeGlobals.ensureChunkHandlers
+		);
+		const withHmr = this.runtimeRequirements.has(
+			RuntimeGlobals.hmrDownloadUpdateHandlers
+		);
+		const withHmrManifest = this.runtimeRequirements.has(
+			RuntimeGlobals.hmrDownloadManifest
+		);
+		const conditionMap = chunkGraph.getChunkConditionMap(chunk, chunkHasJs);
+		const hasJsMatcher = compileBooleanMatcher(conditionMap);
+		const initialChunkIds = getInitialChunkIds(chunk, chunkGraph, chunkHasJs);
+
+		const outputName = compilation.getPath(
+			getChunkFilenameTemplate(chunk, compilation.outputOptions),
+			{
+				chunk,
+				contentHashType: "javascript"
+			}
+		);
+		const rootOutputDir = getUndoPath(
+			outputName,
+			/** @type {string} */ (compilation.outputOptions.path),
+			true
+		);
+
+		const stateExpression = withHmr
+			? `${RuntimeGlobals.hmrRuntimeStatePrefix}_require`
+			: undefined;
+
+		return Template.asString([
+			withBaseURI
+				? this._generateBaseUri(chunk, rootOutputDir)
+				: "// no baseURI",
+			"",
+			"// object to store loaded chunks",
+			'// "1" means "loaded", otherwise not loaded yet',
+			`var installedChunks = ${
+				stateExpression ? `${stateExpression} = ${stateExpression} || ` : ""
+			}{`,
+			Template.indent(
+				Array.from(initialChunkIds, id => `${JSON.stringify(id)}: 1`).join(
+					",\n"
+				)
+			),
+			"};",
+			"",
+			withOnChunkLoad
+				? `${
+						RuntimeGlobals.onChunksLoaded
+					}.require = ${runtimeTemplate.returningFunction(
+						"installedChunks[chunkId]",
+						"chunkId"
+					)};`
+				: "// no on chunks loaded",
+			"",
+			withLoading || withExternalInstallChunk
+				? `var installChunk = ${runtimeTemplate.basicFunction("chunk", [
+						"var moreModules = chunk.modules, chunkIds = chunk.ids, runtime = chunk.runtime;",
+						"for(var moduleId in moreModules) {",
+						Template.indent([
+							`if(${RuntimeGlobals.hasOwnProperty}(moreModules, moduleId)) {`,
+							Template.indent([
+								`${RuntimeGlobals.moduleFactories}[moduleId] = moreModules[moduleId];`
+							]),
+							"}"
+						]),
+						"}",
+						`if(runtime) runtime(${RuntimeGlobals.require});`,
+						"for(var i = 0; i < chunkIds.length; i++)",
+						Template.indent("installedChunks[chunkIds[i]] = 1;"),
+						withOnChunkLoad ? `${RuntimeGlobals.onChunksLoaded}();` : ""
+					])};`
+				: "// no chunk install function needed",
+			"",
+			withLoading
+				? Template.asString([
+						"// require() chunk loading for javascript",
+						`${fn}.require = ${runtimeTemplate.basicFunction(
+							"chunkId, promises",
+							hasJsMatcher !== false
+								? [
+										'// "1" is the signal for "already loaded"',
+										"if(!installedChunks[chunkId]) {",
+										Template.indent([
+											hasJsMatcher === true
+												? "if(true) { // all chunks have JS"
+												: `if(${hasJsMatcher("chunkId")}) {`,
+											Template.indent([
+												`installChunk(require(${JSON.stringify(
+													rootOutputDir
+												)} + ${
+													RuntimeGlobals.getChunkScriptFilename
+												}(chunkId)));`
+											]),
+											"} else installedChunks[chunkId] = 1;",
+											""
+										]),
+										"}"
+									]
+								: "installedChunks[chunkId] = 1;"
+						)};`
+					])
+				: "// no chunk loading",
+			"",
+			withExternalInstallChunk
+				? Template.asString([
+						`module.exports = ${RuntimeGlobals.require};`,
+						`${RuntimeGlobals.externalInstallChunk} = installChunk;`
+					])
+				: "// no external install chunk",
+			"",
+			withHmr
+				? Template.asString([
+						"function loadUpdateChunk(chunkId, updatedModulesList) {",
+						Template.indent([
+							`var update = require(${JSON.stringify(rootOutputDir)} + ${
+								RuntimeGlobals.getChunkUpdateScriptFilename
+							}(chunkId));`,
+							"var updatedModules = update.modules;",
+							"var runtime = update.runtime;",
+							"for(var moduleId in updatedModules) {",
+							Template.indent([
+								`if(${RuntimeGlobals.hasOwnProperty}(updatedModules, moduleId)) {`,
+								Template.indent([
+									"currentUpdate[moduleId] = updatedModules[moduleId];",
+									"if(updatedModulesList) updatedModulesList.push(moduleId);"
+								]),
+								"}"
+							]),
+							"}",
+							"if(runtime) currentUpdateRuntime.push(runtime);"
+						]),
+						"}",
+						"",
+						Template.getFunctionContent(
+							require("../hmr/JavascriptHotModuleReplacement.runtime.js")
+						)
+							.replace(/\$key\$/g, "require")
+							.replace(/\$installedChunks\$/g, "installedChunks")
+							.replace(/\$loadUpdateChunk\$/g, "loadUpdateChunk")
+							.replace(/\$moduleCache\$/g, RuntimeGlobals.moduleCache)
+							.replace(/\$moduleFactories\$/g, RuntimeGlobals.moduleFactories)
+							.replace(
+								/\$ensureChunkHandlers\$/g,
+								RuntimeGlobals.ensureChunkHandlers
+							)
+							.replace(/\$hasOwnProperty\$/g, RuntimeGlobals.hasOwnProperty)
+							.replace(/\$hmrModuleData\$/g, RuntimeGlobals.hmrModuleData)
+							.replace(
+								/\$hmrDownloadUpdateHandlers\$/g,
+								RuntimeGlobals.hmrDownloadUpdateHandlers
+							)
+							.replace(
+								/\$hmrInvalidateModuleHandlers\$/g,
+								RuntimeGlobals.hmrInvalidateModuleHandlers
+							)
+					])
+				: "// no HMR",
+			"",
+			withHmrManifest
+				? Template.asString([
+						`${RuntimeGlobals.hmrDownloadManifest} = function() {`,
+						Template.indent([
+							"return Promise.resolve().then(function() {",
+							Template.indent([
+								`return require(${JSON.stringify(rootOutputDir)} + ${
+									RuntimeGlobals.getUpdateManifestFilename
+								}());`
+							]),
+							"})['catch'](function(err) { if(err.code !== 'MODULE_NOT_FOUND') throw err; });"
+						]),
+						"}"
+					])
+				: "// no HMR manifest"
+		]);
+	}
+}
+
+module.exports = RequireChunkLoadingRuntimeModule;
diff --git a/lib/node/nodeConsole.js b/lib/node/nodeConsole.js
new file mode 100644
index 00000000000..f1ddda00c3b
--- /dev/null
+++ b/lib/node/nodeConsole.js
@@ -0,0 +1,166 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const util = require("util");
+const truncateArgs = require("../logging/truncateArgs");
+
+/** @typedef {import("../../declarations/WebpackOptions").InfrastructureLogging} InfrastructureLogging */
+/** @typedef {import("../logging/createConsoleLogger").LoggerConsole} LoggerConsole */
+
+/* eslint-disable no-console */
+
+/**
+ * @param {object} options options
+ * @param {boolean=} options.colors colors
+ * @param {boolean=} options.appendOnly append only
+ * @param {NonNullable} options.stream stream
+ * @returns {LoggerConsole} logger function
+ */
+module.exports = ({ colors, appendOnly, stream }) => {
+	/** @type {string[] | undefined} */
+	let currentStatusMessage;
+	let hasStatusMessage = false;
+	let currentIndent = "";
+	let currentCollapsed = 0;
+
+	/**
+	 * @param {string} str string
+	 * @param {string} prefix prefix
+	 * @param {string} colorPrefix color prefix
+	 * @param {string} colorSuffix color suffix
+	 * @returns {string} indented string
+	 */
+	const indent = (str, prefix, colorPrefix, colorSuffix) => {
+		if (str === "") return str;
+		prefix = currentIndent + prefix;
+		if (colors) {
+			return (
+				prefix +
+				colorPrefix +
+				str.replace(/\n/g, `${colorSuffix}\n${prefix}${colorPrefix}`) +
+				colorSuffix
+			);
+		}
+
+		return prefix + str.replace(/\n/g, `\n${prefix}`);
+	};
+
+	const clearStatusMessage = () => {
+		if (hasStatusMessage) {
+			stream.write("\u001B[2K\r");
+			hasStatusMessage = false;
+		}
+	};
+
+	const writeStatusMessage = () => {
+		if (!currentStatusMessage) return;
+		const l = stream.columns || 40;
+		const args = truncateArgs(currentStatusMessage, l - 1);
+		const str = args.join(" ");
+		const coloredStr = `\u001B[1m${str}\u001B[39m\u001B[22m`;
+		stream.write(`\u001B[2K\r${coloredStr}`);
+		hasStatusMessage = true;
+	};
+
+	/**
+	 * @param {string} prefix prefix
+	 * @param {string} colorPrefix color prefix
+	 * @param {string} colorSuffix color suffix
+	 * @returns {(...args: EXPECTED_ANY[]) => void} function to write with colors
+	 */
+	const writeColored =
+		(prefix, colorPrefix, colorSuffix) =>
+		(...args) => {
+			if (currentCollapsed > 0) return;
+			clearStatusMessage();
+			const str = indent(
+				util.format(...args),
+				prefix,
+				colorPrefix,
+				colorSuffix
+			);
+			stream.write(`${str}\n`);
+			writeStatusMessage();
+		};
+
+	const writeGroupMessage = writeColored(
+		"<-> ",
+		"\u001B[1m\u001B[36m",
+		"\u001B[39m\u001B[22m"
+	);
+
+	const writeGroupCollapsedMessage = writeColored(
+		"<+> ",
+		"\u001B[1m\u001B[36m",
+		"\u001B[39m\u001B[22m"
+	);
+
+	return {
+		log: writeColored("    ", "\u001B[1m", "\u001B[22m"),
+		debug: writeColored("    ", "", ""),
+		trace: writeColored("    ", "", ""),
+		info: writeColored(" ", "\u001B[1m\u001B[32m", "\u001B[39m\u001B[22m"),
+		warn: writeColored(" ", "\u001B[1m\u001B[33m", "\u001B[39m\u001B[22m"),
+		error: writeColored(" ", "\u001B[1m\u001B[31m", "\u001B[39m\u001B[22m"),
+		logTime: writeColored(
+			" ",
+			"\u001B[1m\u001B[35m",
+			"\u001B[39m\u001B[22m"
+		),
+		group: (...args) => {
+			writeGroupMessage(...args);
+			if (currentCollapsed > 0) {
+				currentCollapsed++;
+			} else {
+				currentIndent += "  ";
+			}
+		},
+		groupCollapsed: (...args) => {
+			writeGroupCollapsedMessage(...args);
+			currentCollapsed++;
+		},
+		groupEnd: () => {
+			if (currentCollapsed > 0) currentCollapsed--;
+			else if (currentIndent.length >= 2)
+				currentIndent = currentIndent.slice(0, -2);
+		},
+		profile: console.profile && (name => console.profile(name)),
+		profileEnd: console.profileEnd && (name => console.profileEnd(name)),
+		clear:
+			/** @type {() => void} */
+			(
+				!appendOnly &&
+					console.clear &&
+					(() => {
+						clearStatusMessage();
+						console.clear();
+						writeStatusMessage();
+					})
+			),
+		status: appendOnly
+			? writeColored(" ", "", "")
+			: (name, ...args) => {
+					args = args.filter(Boolean);
+					if (name === undefined && args.length === 0) {
+						clearStatusMessage();
+						currentStatusMessage = undefined;
+					} else if (
+						typeof name === "string" &&
+						name.startsWith("[webpack.Progress] ")
+					) {
+						currentStatusMessage = [name.slice(19), ...args];
+						writeStatusMessage();
+					} else if (name === "[webpack.Progress]") {
+						currentStatusMessage = [...args];
+						writeStatusMessage();
+					} else {
+						currentStatusMessage = [name, ...args];
+						writeStatusMessage();
+					}
+				}
+	};
+};
diff --git a/lib/optimize/AggressiveMergingPlugin.js b/lib/optimize/AggressiveMergingPlugin.js
index e3a4c37eee6..9c5147cf384 100644
--- a/lib/optimize/AggressiveMergingPlugin.js
+++ b/lib/optimize/AggressiveMergingPlugin.js
@@ -2,9 +2,23 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const { STAGE_ADVANCED } = require("../OptimizationStages");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compiler")} Compiler */
+
+/**
+ * @typedef {object} AggressiveMergingPluginOptions
+ * @property {number=} minSizeReduce minimal size reduction to trigger merging
+ */
+
 class AggressiveMergingPlugin {
+	/**
+	 * @param {AggressiveMergingPluginOptions=} options options object
+	 */
 	constructor(options) {
 		if (
 			(options !== undefined && typeof options !== "object") ||
@@ -17,6 +31,11 @@ class AggressiveMergingPlugin {
 		this.options = options || {};
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		const options = this.options;
 		const minSizeReduce = options.minSizeReduce || 1.5;
@@ -24,59 +43,51 @@ class AggressiveMergingPlugin {
 		compiler.hooks.thisCompilation.tap(
 			"AggressiveMergingPlugin",
 			compilation => {
-				compilation.hooks.optimizeChunksAdvanced.tap(
-					"AggressiveMergingPlugin",
+				compilation.hooks.optimizeChunks.tap(
+					{
+						name: "AggressiveMergingPlugin",
+						stage: STAGE_ADVANCED
+					},
 					chunks => {
-						let combinations = [];
-						chunks.forEach((a, idx) => {
-							if (a.canBeInitial()) return;
-							for (let i = 0; i < idx; i++) {
-								const b = chunks[i];
+						const chunkGraph = compilation.chunkGraph;
+						/** @type {{a: Chunk, b: Chunk, improvement: number}[]} */
+						const combinations = [];
+						for (const a of chunks) {
+							if (a.canBeInitial()) continue;
+							for (const b of chunks) {
 								if (b.canBeInitial()) continue;
+								if (b === a) break;
+								if (!chunkGraph.canChunksBeIntegrated(a, b)) {
+									continue;
+								}
+								const aSize = chunkGraph.getChunkSize(b, {
+									chunkOverhead: 0
+								});
+								const bSize = chunkGraph.getChunkSize(a, {
+									chunkOverhead: 0
+								});
+								const abSize = chunkGraph.getIntegratedChunksSize(b, a, {
+									chunkOverhead: 0
+								});
+								const improvement = (aSize + bSize) / abSize;
 								combinations.push({
 									a,
 									b,
-									improvement: undefined
+									improvement
 								});
 							}
-						});
-
-						for (const pair of combinations) {
-							const a = pair.b.size({
-								chunkOverhead: 0
-							});
-							const b = pair.a.size({
-								chunkOverhead: 0
-							});
-							const ab = pair.b.integratedSize(pair.a, {
-								chunkOverhead: 0
-							});
-							let newSize;
-							if (ab === false) {
-								pair.improvement = false;
-								return;
-							} else {
-								newSize = ab;
-							}
-
-							pair.improvement = (a + b) / newSize;
 						}
-						combinations = combinations.filter(pair => {
-							return pair.improvement !== false;
-						});
-						combinations.sort((a, b) => {
-							return b.improvement - a.improvement;
-						});
+
+						combinations.sort((a, b) => b.improvement - a.improvement);
 
 						const pair = combinations[0];
 
 						if (!pair) return;
 						if (pair.improvement < minSizeReduce) return;
 
-						if (pair.b.integrate(pair.a, "aggressive-merge")) {
-							chunks.splice(chunks.indexOf(pair.a), 1);
-							return true;
-						}
+						chunkGraph.integrateChunks(pair.b, pair.a);
+						compilation.chunks.delete(pair.a);
+						return true;
 					}
 				);
 			}
diff --git a/lib/optimize/AggressiveSplittingPlugin.js b/lib/optimize/AggressiveSplittingPlugin.js
index 3843878538a..e2a85c7e7ad 100644
--- a/lib/optimize/AggressiveSplittingPlugin.js
+++ b/lib/optimize/AggressiveSplittingPlugin.js
@@ -2,35 +2,64 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const identifierUtils = require("../util/identifier");
+const { STAGE_ADVANCED } = require("../OptimizationStages");
 const { intersect } = require("../util/SetHelpers");
-const validateOptions = require("schema-utils");
-const schema = require("../../schemas/plugins/optimize/AggressiveSplittingPlugin.json");
+const {
+	compareModulesByIdentifier,
+	compareChunks
+} = require("../util/comparators");
+const createSchemaValidation = require("../util/create-schema-validation");
+const identifierUtils = require("../util/identifier");
 
 /** @typedef {import("../../declarations/plugins/optimize/AggressiveSplittingPlugin").AggressiveSplittingPluginOptions} AggressiveSplittingPluginOptions */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Module")} Module */
 
-const moveModuleBetween = (oldChunk, newChunk) => {
-	return module => {
-		oldChunk.moveModule(module, newChunk);
-	};
-};
+const validate = createSchemaValidation(
+	require("../../schemas/plugins/optimize/AggressiveSplittingPlugin.check.js"),
+	() =>
+		require("../../schemas/plugins/optimize/AggressiveSplittingPlugin.json"),
+	{
+		name: "Aggressive Splitting Plugin",
+		baseDataPath: "options"
+	}
+);
 
-const isNotAEntryModule = entryModule => {
-	return module => {
-		return entryModule !== module;
-	};
+/**
+ * @param {ChunkGraph} chunkGraph the chunk graph
+ * @param {Chunk} oldChunk the old chunk
+ * @param {Chunk} newChunk the new chunk
+ * @returns {(module: Module) => void} function to move module between chunks
+ */
+const moveModuleBetween = (chunkGraph, oldChunk, newChunk) => module => {
+	chunkGraph.disconnectChunkAndModule(oldChunk, module);
+	chunkGraph.connectChunkAndModule(newChunk, module);
 };
 
+/**
+ * @param {ChunkGraph} chunkGraph the chunk graph
+ * @param {Chunk} chunk the chunk
+ * @returns {(module: Module) => boolean} filter for entry module
+ */
+const isNotAEntryModule = (chunkGraph, chunk) => module =>
+	!chunkGraph.isEntryModuleInChunk(module, chunk);
+
+/** @type {WeakSet} */
+const recordedChunks = new WeakSet();
+
+const PLUGIN_NAME = "AggressiveSplittingPlugin";
+
 class AggressiveSplittingPlugin {
 	/**
 	 * @param {AggressiveSplittingPluginOptions=} options options object
 	 */
-	constructor(options) {
-		if (!options) options = {};
-
-		validateOptions(schema, options, "Aggressive Splitting Plugin");
+	constructor(options = {}) {
+		validate(options);
 
 		this.options = options;
 		if (typeof this.options.minSize !== "number") {
@@ -46,249 +75,266 @@ class AggressiveSplittingPlugin {
 			this.options.entryChunkMultiplicator = 1;
 		}
 	}
+
+	/**
+	 * @param {Chunk} chunk the chunk to test
+	 * @returns {boolean} true if the chunk was recorded
+	 */
+	static wasChunkRecorded(chunk) {
+		return recordedChunks.has(chunk);
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		compiler.hooks.thisCompilation.tap(
-			"AggressiveSplittingPlugin",
-			compilation => {
-				let needAdditionalSeal = false;
-				let newSplits;
-				let fromAggressiveSplittingSet;
-				let chunkSplitDataMap;
-				compilation.hooks.optimize.tap("AggressiveSplittingPlugin", () => {
-					newSplits = [];
-					fromAggressiveSplittingSet = new Set();
-					chunkSplitDataMap = new Map();
-				});
-				compilation.hooks.optimizeChunksAdvanced.tap(
-					"AggressiveSplittingPlugin",
-					chunks => {
-						// Precompute stuff
-						const nameToModuleMap = new Map();
-						const moduleToNameMap = new Map();
-						for (const m of compilation.modules) {
-							const name = identifierUtils.makePathsRelative(
-								compiler.context,
-								m.identifier(),
-								compilation.cache
-							);
-							nameToModuleMap.set(name, m);
-							moduleToNameMap.set(m, name);
-						}
+		compiler.hooks.thisCompilation.tap(PLUGIN_NAME, compilation => {
+			let needAdditionalSeal = false;
+			/** @typedef {{ id?: NonNullable, hash?: NonNullable, modules: Module[], size: number }} SplitData */
+			/** @type {SplitData[]} */
+			let newSplits;
+			/** @type {Set} */
+			let fromAggressiveSplittingSet;
+			/** @type {Map} */
+			let chunkSplitDataMap;
+			compilation.hooks.optimize.tap(PLUGIN_NAME, () => {
+				newSplits = [];
+				fromAggressiveSplittingSet = new Set();
+				chunkSplitDataMap = new Map();
+			});
+			compilation.hooks.optimizeChunks.tap(
+				{
+					name: PLUGIN_NAME,
+					stage: STAGE_ADVANCED
+				},
+				chunks => {
+					const chunkGraph = compilation.chunkGraph;
+					// Precompute stuff
+					const nameToModuleMap = new Map();
+					const moduleToNameMap = new Map();
+					const makePathsRelative =
+						identifierUtils.makePathsRelative.bindContextCache(
+							compiler.context,
+							compiler.root
+						);
+					for (const m of compilation.modules) {
+						const name = makePathsRelative(m.identifier());
+						nameToModuleMap.set(name, m);
+						moduleToNameMap.set(m, name);
+					}
+
+					// Check used chunk ids
+					const usedIds = new Set();
+					for (const chunk of chunks) {
+						usedIds.add(chunk.id);
+					}
+
+					const recordedSplits =
+						(compilation.records && compilation.records.aggressiveSplits) || [];
+					const usedSplits = newSplits
+						? recordedSplits.concat(newSplits)
+						: recordedSplits;
+
+					const minSize = /** @type {number} */ (this.options.minSize);
+					const maxSize = /** @type {number} */ (this.options.maxSize);
 
-						// Check used chunk ids
-						const usedIds = new Set();
-						for (const chunk of chunks) {
-							usedIds.add(chunk.id);
+					/**
+					 * @param {SplitData} splitData split data
+					 * @returns {boolean} true when applied, otherwise false
+					 */
+					const applySplit = splitData => {
+						// Cannot split if id is already taken
+						if (splitData.id !== undefined && usedIds.has(splitData.id)) {
+							return false;
 						}
 
-						const recordedSplits =
-							(compilation.records && compilation.records.aggressiveSplits) ||
-							[];
-						const usedSplits = newSplits
-							? recordedSplits.concat(newSplits)
-							: recordedSplits;
+						// Get module objects from names
+						const selectedModules = splitData.modules.map(name =>
+							nameToModuleMap.get(name)
+						);
 
-						const minSize = this.options.minSize;
-						const maxSize = this.options.maxSize;
+						// Does the modules exist at all?
+						if (!selectedModules.every(Boolean)) return false;
 
-						const applySplit = splitData => {
-							// Cannot split if id is already taken
-							if (splitData.id !== undefined && usedIds.has(splitData.id)) {
-								return false;
-							}
+						// Check if size matches (faster than waiting for hash)
+						let size = 0;
+						for (const m of selectedModules) size += m.size();
+						if (size !== splitData.size) return false;
 
-							// Get module objects from names
-							const selectedModules = splitData.modules.map(name =>
-								nameToModuleMap.get(name)
-							);
-
-							// Does the modules exist at all?
-							if (!selectedModules.every(Boolean)) return false;
-
-							// Check if size matches (faster than waiting for hash)
-							const size = selectedModules.reduce(
-								(sum, m) => sum + m.size(),
-								0
-							);
-							if (size !== splitData.size) return false;
-
-							// get chunks with all modules
-							const selectedChunks = intersect(
-								selectedModules.map(m => new Set(m.chunksIterable))
-							);
-
-							// No relevant chunks found
-							if (selectedChunks.size === 0) return false;
-
-							// The found chunk is already the split or similar
-							if (
-								selectedChunks.size === 1 &&
-								Array.from(selectedChunks)[0].getNumberOfModules() ===
-									selectedModules.length
-							) {
-								const chunk = Array.from(selectedChunks)[0];
-								if (fromAggressiveSplittingSet.has(chunk)) return false;
-								fromAggressiveSplittingSet.add(chunk);
-								chunkSplitDataMap.set(chunk, splitData);
-								return true;
-							}
+						// get chunks with all modules
+						const selectedChunks = intersect(
+							selectedModules.map(
+								m => new Set(chunkGraph.getModuleChunksIterable(m))
+							)
+						);
 
-							// split the chunk into two parts
-							const newChunk = compilation.addChunk();
-							newChunk.chunkReason = "aggressive splitted";
-							for (const chunk of selectedChunks) {
-								selectedModules.forEach(moveModuleBetween(chunk, newChunk));
-								chunk.split(newChunk);
-								chunk.name = null;
-							}
-							fromAggressiveSplittingSet.add(newChunk);
-							chunkSplitDataMap.set(newChunk, splitData);
+						// No relevant chunks found
+						if (selectedChunks.size === 0) return false;
 
-							if (splitData.id !== null && splitData.id !== undefined) {
-								newChunk.id = splitData.id;
-							}
+						// The found chunk is already the split or similar
+						if (
+							selectedChunks.size === 1 &&
+							chunkGraph.getNumberOfChunkModules(
+								Array.from(selectedChunks)[0]
+							) === selectedModules.length
+						) {
+							const chunk = Array.from(selectedChunks)[0];
+							if (fromAggressiveSplittingSet.has(chunk)) return false;
+							fromAggressiveSplittingSet.add(chunk);
+							chunkSplitDataMap.set(chunk, splitData);
 							return true;
-						};
-
-						// try to restore to recorded splitting
-						let changed = false;
-						for (let j = 0; j < usedSplits.length; j++) {
-							const splitData = usedSplits[j];
-							if (applySplit(splitData)) changed = true;
 						}
 
-						// for any chunk which isn't splitted yet, split it and create a new entry
-						// start with the biggest chunk
-						const sortedChunks = chunks.slice().sort((a, b) => {
-							const diff1 = b.modulesSize() - a.modulesSize();
-							if (diff1) return diff1;
-							const diff2 = a.getNumberOfModules() - b.getNumberOfModules();
-							if (diff2) return diff2;
-							const modulesA = Array.from(a.modulesIterable);
-							const modulesB = Array.from(b.modulesIterable);
-							modulesA.sort();
-							modulesB.sort();
-							const aI = modulesA[Symbol.iterator]();
-							const bI = modulesB[Symbol.iterator]();
-							// eslint-disable-next-line no-constant-condition
-							while (true) {
-								const aItem = aI.next();
-								const bItem = bI.next();
-								if (aItem.done) return 0;
-								const aModuleIdentifier = aItem.value.identifier();
-								const bModuleIdentifier = bItem.value.identifier();
-								if (aModuleIdentifier > bModuleIdentifier) return -1;
-								if (aModuleIdentifier < bModuleIdentifier) return 1;
-							}
-						});
-						for (const chunk of sortedChunks) {
-							if (fromAggressiveSplittingSet.has(chunk)) continue;
-							const size = chunk.modulesSize();
-							if (size > maxSize && chunk.getNumberOfModules() > 1) {
-								const modules = chunk
-									.getModules()
-									.filter(isNotAEntryModule(chunk.entryModule))
-									.sort((a, b) => {
-										a = a.identifier();
-										b = b.identifier();
-										if (a > b) return 1;
-										if (a < b) return -1;
-										return 0;
-									});
-								const selectedModules = [];
-								let selectedModulesSize = 0;
-								for (let k = 0; k < modules.length; k++) {
-									const module = modules[k];
-									const newSize = selectedModulesSize + module.size();
-									if (newSize > maxSize && selectedModulesSize >= minSize) {
-										break;
-									}
-									selectedModulesSize = newSize;
-									selectedModules.push(module);
-								}
-								if (selectedModules.length === 0) continue;
-								const splitData = {
-									modules: selectedModules
-										.map(m => moduleToNameMap.get(m))
-										.sort(),
-									size: selectedModulesSize
-								};
-
-								if (applySplit(splitData)) {
-									newSplits = (newSplits || []).concat(splitData);
-									changed = true;
-								}
+						// split the chunk into two parts
+						const newChunk = compilation.addChunk();
+						newChunk.chunkReason = "aggressive splitted";
+						for (const chunk of selectedChunks) {
+							for (const module of selectedModules) {
+								moveModuleBetween(chunkGraph, chunk, newChunk)(module);
 							}
+							chunk.split(newChunk);
+							chunk.name = null;
 						}
-						if (changed) return true;
-					}
-				);
-				compilation.hooks.recordHash.tap(
-					"AggressiveSplittingPlugin",
-					records => {
-						// 4. save made splittings to records
-						const allSplits = new Set();
-						const invalidSplits = new Set();
-
-						// Check if some splittings are invalid
-						// We remove invalid splittings and try again
-						for (const chunk of compilation.chunks) {
-							const splitData = chunkSplitDataMap.get(chunk);
-							if (splitData !== undefined) {
-								if (splitData.hash && chunk.hash !== splitData.hash) {
-									// Split was successful, but hash doesn't equal
-									// We can throw away the split since it's useless now
-									invalidSplits.add(splitData);
-								}
-							}
+						fromAggressiveSplittingSet.add(newChunk);
+						chunkSplitDataMap.set(newChunk, splitData);
+
+						if (splitData.id !== null && splitData.id !== undefined) {
+							newChunk.id = splitData.id;
+							newChunk.ids = [splitData.id];
 						}
+						return true;
+					};
+
+					// try to restore to recorded splitting
+					let changed = false;
+					for (let j = 0; j < usedSplits.length; j++) {
+						const splitData = usedSplits[j];
+						if (applySplit(splitData)) changed = true;
+					}
 
-						if (invalidSplits.size > 0) {
-							records.aggressiveSplits = records.aggressiveSplits.filter(
-								splitData => !invalidSplits.has(splitData)
-							);
-							needAdditionalSeal = true;
-						} else {
-							// set hash and id values on all (new) splittings
-							for (const chunk of compilation.chunks) {
-								const splitData = chunkSplitDataMap.get(chunk);
-								if (splitData !== undefined) {
-									splitData.hash = chunk.hash;
-									splitData.id = chunk.id;
-									allSplits.add(splitData);
-									// set flag for stats
-									chunk.recorded = true;
+					// for any chunk which isn't splitted yet, split it and create a new entry
+					// start with the biggest chunk
+					const cmpFn = compareChunks(chunkGraph);
+					const sortedChunks = Array.from(chunks).sort((a, b) => {
+						const diff1 =
+							chunkGraph.getChunkModulesSize(b) -
+							chunkGraph.getChunkModulesSize(a);
+						if (diff1) return diff1;
+						const diff2 =
+							chunkGraph.getNumberOfChunkModules(a) -
+							chunkGraph.getNumberOfChunkModules(b);
+						if (diff2) return diff2;
+						return cmpFn(a, b);
+					});
+					for (const chunk of sortedChunks) {
+						if (fromAggressiveSplittingSet.has(chunk)) continue;
+						const size = chunkGraph.getChunkModulesSize(chunk);
+						if (
+							size > maxSize &&
+							chunkGraph.getNumberOfChunkModules(chunk) > 1
+						) {
+							const modules = chunkGraph
+								.getOrderedChunkModules(chunk, compareModulesByIdentifier)
+								.filter(isNotAEntryModule(chunkGraph, chunk));
+							const selectedModules = [];
+							let selectedModulesSize = 0;
+							for (let k = 0; k < modules.length; k++) {
+								const module = modules[k];
+								const newSize = selectedModulesSize + module.size();
+								if (newSize > maxSize && selectedModulesSize >= minSize) {
+									break;
 								}
+								selectedModulesSize = newSize;
+								selectedModules.push(module);
 							}
+							if (selectedModules.length === 0) continue;
+							/** @type {SplitData} */
+							const splitData = {
+								modules: selectedModules
+									.map(m => moduleToNameMap.get(m))
+									.sort(),
+								size: selectedModulesSize
+							};
 
-							// Also add all unused historial splits (after the used ones)
-							// They can still be used in some future compilation
-							const recordedSplits =
-								compilation.records && compilation.records.aggressiveSplits;
-							if (recordedSplits) {
-								for (const splitData of recordedSplits) {
-									if (!invalidSplits.has(splitData)) allSplits.add(splitData);
-								}
+							if (applySplit(splitData)) {
+								newSplits = (newSplits || []).concat(splitData);
+								changed = true;
 							}
+						}
+					}
+					if (changed) return true;
+				}
+			);
+			compilation.hooks.recordHash.tap(PLUGIN_NAME, records => {
+				// 4. save made splittings to records
+				const allSplits = new Set();
+				/** @type {Set} */
+				const invalidSplits = new Set();
 
-							// record all splits
-							records.aggressiveSplits = Array.from(allSplits);
+				// Check if some splittings are invalid
+				// We remove invalid splittings and try again
+				for (const chunk of compilation.chunks) {
+					const splitData = chunkSplitDataMap.get(chunk);
+					if (
+						splitData !== undefined &&
+						splitData.hash &&
+						chunk.hash !== splitData.hash
+					) {
+						// Split was successful, but hash doesn't equal
+						// We can throw away the split since it's useless now
+						invalidSplits.add(splitData);
+					}
+				}
 
-							needAdditionalSeal = false;
+				if (invalidSplits.size > 0) {
+					records.aggressiveSplits =
+						/** @type {SplitData[]} */
+						(records.aggressiveSplits).filter(
+							splitData => !invalidSplits.has(splitData)
+						);
+					needAdditionalSeal = true;
+				} else {
+					// set hash and id values on all (new) splittings
+					for (const chunk of compilation.chunks) {
+						const splitData = chunkSplitDataMap.get(chunk);
+						if (splitData !== undefined) {
+							splitData.hash =
+								/** @type {NonNullable} */
+								(chunk.hash);
+							splitData.id =
+								/** @type {NonNullable} */
+								(chunk.id);
+							allSplits.add(splitData);
+							// set flag for stats
+							recordedChunks.add(chunk);
 						}
 					}
-				);
-				compilation.hooks.needAdditionalSeal.tap(
-					"AggressiveSplittingPlugin",
-					() => {
-						if (needAdditionalSeal) {
-							needAdditionalSeal = false;
-							return true;
+
+					// Also add all unused historical splits (after the used ones)
+					// They can still be used in some future compilation
+					const recordedSplits =
+						compilation.records && compilation.records.aggressiveSplits;
+					if (recordedSplits) {
+						for (const splitData of recordedSplits) {
+							if (!invalidSplits.has(splitData)) allSplits.add(splitData);
 						}
 					}
-				);
-			}
-		);
+
+					// record all splits
+					records.aggressiveSplits = Array.from(allSplits);
+
+					needAdditionalSeal = false;
+				}
+			});
+			compilation.hooks.needAdditionalSeal.tap(PLUGIN_NAME, () => {
+				if (needAdditionalSeal) {
+					needAdditionalSeal = false;
+					return true;
+				}
+			});
+		});
 	}
 }
 module.exports = AggressiveSplittingPlugin;
diff --git a/lib/optimize/ChunkModuleIdRangePlugin.js b/lib/optimize/ChunkModuleIdRangePlugin.js
deleted file mode 100644
index f507e426c52..00000000000
--- a/lib/optimize/ChunkModuleIdRangePlugin.js
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const sortByIndex = (a, b) => {
-	return a.index - b.index;
-};
-
-const sortByIndex2 = (a, b) => {
-	return a.index2 - b.index2;
-};
-
-class ChunkModuleIdRangePlugin {
-	constructor(options) {
-		this.options = options;
-	}
-
-	apply(compiler) {
-		const options = this.options;
-		compiler.hooks.compilation.tap("ChunkModuleIdRangePlugin", compilation => {
-			compilation.hooks.moduleIds.tap("ChunkModuleIdRangePlugin", modules => {
-				const chunk = compilation.chunks.find(
-					chunk => chunk.name === options.name
-				);
-				if (!chunk) {
-					throw new Error(
-						`ChunkModuleIdRangePlugin: Chunk with name '${
-							options.name
-						}"' was not found`
-					);
-				}
-
-				let chunkModules;
-				if (options.order) {
-					chunkModules = Array.from(chunk.modulesIterable);
-					switch (options.order) {
-						case "index":
-							chunkModules.sort(sortByIndex);
-							break;
-						case "index2":
-							chunkModules.sort(sortByIndex2);
-							break;
-						default:
-							throw new Error(
-								"ChunkModuleIdRangePlugin: unexpected value of order"
-							);
-					}
-				} else {
-					chunkModules = modules.filter(m => {
-						return m.chunksIterable.has(chunk);
-					});
-				}
-
-				let currentId = options.start || 0;
-				for (let i = 0; i < chunkModules.length; i++) {
-					const m = chunkModules[i];
-					if (m.id === null) {
-						m.id = currentId++;
-					}
-					if (options.end && currentId > options.end) break;
-				}
-			});
-		});
-	}
-}
-module.exports = ChunkModuleIdRangePlugin;
diff --git a/lib/optimize/ConcatenatedModule.js b/lib/optimize/ConcatenatedModule.js
index f5ae70cd872..22d0e653ef5 100644
--- a/lib/optimize/ConcatenatedModule.js
+++ b/lib/optimize/ConcatenatedModule.js
@@ -2,1502 +2,1909 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const eslintScope = require("eslint-scope");
+const Referencer = require("eslint-scope/lib/referencer");
+const { SyncBailHook } = require("tapable");
+const {
+	CachedSource,
+	ConcatSource,
+	ReplaceSource
+} = require("webpack-sources");
+const ConcatenationScope = require("../ConcatenationScope");
+const { UsageState } = require("../ExportsInfo");
 const Module = require("../Module");
+const { JS_TYPES } = require("../ModuleSourceTypesConstants");
+const { JAVASCRIPT_MODULE_TYPE_ESM } = require("../ModuleTypeConstants");
+const RuntimeGlobals = require("../RuntimeGlobals");
 const Template = require("../Template");
-const Parser = require("../Parser");
-const eslintScope = require("eslint-scope");
-const { ConcatSource, ReplaceSource } = require("webpack-sources");
-const DependencyReference = require("../dependencies/DependencyReference");
+const { DEFAULTS } = require("../config/defaults");
 const HarmonyImportDependency = require("../dependencies/HarmonyImportDependency");
-const HarmonyImportSideEffectDependency = require("../dependencies/HarmonyImportSideEffectDependency");
-const HarmonyImportSpecifierDependency = require("../dependencies/HarmonyImportSpecifierDependency");
-const HarmonyExportSpecifierDependency = require("../dependencies/HarmonyExportSpecifierDependency");
-const HarmonyExportExpressionDependency = require("../dependencies/HarmonyExportExpressionDependency");
-const HarmonyExportImportedSpecifierDependency = require("../dependencies/HarmonyExportImportedSpecifierDependency");
-const HarmonyCompatibilityDependency = require("../dependencies/HarmonyCompatibilityDependency");
+const JavascriptParser = require("../javascript/JavascriptParser");
+const { equals } = require("../util/ArrayHelpers");
+const LazySet = require("../util/LazySet");
+const { concatComparators } = require("../util/comparators");
+const {
+	RESERVED_NAMES,
+	findNewName,
+	addScopeSymbols,
+	getAllReferences,
+	getPathInAst,
+	getUsedNamesInScopeInfo
+} = require("../util/concatenate");
 const createHash = require("../util/createHash");
-
-/** @typedef {import("../Dependency")} Dependency */
+const { makePathsRelative } = require("../util/identifier");
+const makeSerializable = require("../util/makeSerializable");
+const propertyAccess = require("../util/propertyAccess");
+const { propertyName } = require("../util/propertyName");
+const {
+	filterRuntime,
+	intersectRuntime,
+	mergeRuntimeCondition,
+	mergeRuntimeConditionNonFalse,
+	runtimeConditionToString,
+	subtractRuntimeCondition
+} = require("../util/runtime");
+
+/** @typedef {import("eslint-scope").Reference} Reference */
+/** @typedef {import("eslint-scope").Scope} Scope */
+/** @typedef {import("eslint-scope").Variable} Variable */
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../CodeGenerationResults")} CodeGenerationResults */
 /** @typedef {import("../Compilation")} Compilation */
-/** @typedef {import("../util/createHash").Hash} Hash */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../DependencyTemplate").DependencyTemplateContext} DependencyTemplateContext */
+/** @typedef {import("../DependencyTemplates")} DependencyTemplates */
+/** @typedef {import("../ExportsInfo").ExportInfo} ExportInfo */
+/** @typedef {import("../Module").BuildCallback} BuildCallback */
+/** @typedef {import("../Module").BuildInfo} BuildInfo */
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
+/** @typedef {import("../Module").CodeGenerationContext} CodeGenerationContext */
+/** @typedef {import("../Module").CodeGenerationResult} CodeGenerationResult */
+/** @typedef {import("../Module").LibIdentOptions} LibIdentOptions */
+/** @typedef {import("../Module").ReadOnlyRuntimeRequirements} ReadOnlyRuntimeRequirements */
+/** @typedef {import("../Module").RuntimeRequirements} RuntimeRequirements */
+/** @typedef {import("../Module").SourceTypes} SourceTypes */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */
+/** @typedef {import("../ModuleGraphConnection").ConnectionState} ConnectionState */
+/** @typedef {import("../ModuleParseError")} ModuleParseError */
+/** @typedef {import("../RequestShortener")} RequestShortener */
+/** @typedef {import("../ResolverFactory").ResolverWithOptions} ResolverWithOptions */
+/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
+/** @typedef {import("../WebpackError")} WebpackError */
+/** @typedef {import("../javascript/JavascriptModulesPlugin").ChunkRenderContext} ChunkRenderContext */
+/** @typedef {import("../javascript/JavascriptParser").Program} Program */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {typeof import("../util/Hash")} HashConstructor */
+/** @typedef {import("../util/concatenate").ScopeInfo} ScopeInfo */
+/** @typedef {import("../util/concatenate").UsedNames} UsedNames */
+/** @typedef {import("../util/fs").InputFileSystem} InputFileSystem */
+/** @typedef {import("../util/identifier").AssociatedObjectForCache} AssociatedObjectForCache */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
 
 /**
- * @typedef {Object} ConcatenationEntry
- * @property {"concatenated" | "external"} type
+ * @template T
+ * @typedef {import("../InitFragment")} InitFragment
+ */
+
+/**
+ * @template T
+ * @typedef {import("../util/comparators").Comparator} Comparator
+ */
+
+// fix eslint-scope to support class properties correctly
+// cspell:word Referencer
+const ReferencerClass = /** @type {EXPECTED_ANY} */ (Referencer);
+if (!ReferencerClass.prototype.PropertyDefinition) {
+	ReferencerClass.prototype.PropertyDefinition =
+		ReferencerClass.prototype.Property;
+}
+
+/**
+ * @typedef {object} ReexportInfo
  * @property {Module} module
+ * @property {string[]} export
  */
 
-const ensureNsObjSource = (
-	info,
-	moduleToInfoMap,
-	requestShortener,
-	strictHarmonyModule
-) => {
-	if (!info.hasNamespaceObject) {
-		info.hasNamespaceObject = true;
-		const name = info.exportMap.get(true);
-		const nsObj = [`var ${name} = {};`, `__webpack_require__.r(${name});`];
-		for (const exportName of info.module.buildMeta.providedExports) {
-			const finalName = getFinalName(
-				info,
-				exportName,
-				moduleToInfoMap,
-				requestShortener,
-				false,
-				strictHarmonyModule
-			);
-			nsObj.push(
-				`__webpack_require__.d(${name}, ${JSON.stringify(
-					exportName
-				)}, function() { return ${finalName}; });`
-			);
+/** @typedef {RawBinding | SymbolBinding} Binding */
+
+/**
+ * @typedef {object} RawBinding
+ * @property {ModuleInfo} info
+ * @property {string} rawName
+ * @property {string=} comment
+ * @property {string[]} ids
+ * @property {string[]} exportName
+ */
+
+/**
+ * @typedef {object} SymbolBinding
+ * @property {ConcatenatedModuleInfo} info
+ * @property {string} name
+ * @property {string=} comment
+ * @property {string[]} ids
+ * @property {string[]} exportName
+ */
+
+/** @typedef {ConcatenatedModuleInfo | ExternalModuleInfo } ModuleInfo */
+/** @typedef {ConcatenatedModuleInfo | ExternalModuleInfo | ReferenceToModuleInfo } ModuleInfoOrReference */
+
+/**
+ * @typedef {object} ConcatenatedModuleInfo
+ * @property {"concatenated"} type
+ * @property {Module} module
+ * @property {number} index
+ * @property {Program | undefined} ast
+ * @property {Source | undefined} internalSource
+ * @property {ReplaceSource | undefined} source
+ * @property {InitFragment[]=} chunkInitFragments
+ * @property {ReadOnlyRuntimeRequirements | undefined} runtimeRequirements
+ * @property {Scope | undefined} globalScope
+ * @property {Scope | undefined} moduleScope
+ * @property {Map} internalNames
+ * @property {Map | undefined} exportMap
+ * @property {Map | undefined} rawExportMap
+ * @property {string=} namespaceExportSymbol
+ * @property {string | undefined} namespaceObjectName
+ * @property {boolean} interopNamespaceObjectUsed
+ * @property {string | undefined} interopNamespaceObjectName
+ * @property {boolean} interopNamespaceObject2Used
+ * @property {string | undefined} interopNamespaceObject2Name
+ * @property {boolean} interopDefaultAccessUsed
+ * @property {string | undefined} interopDefaultAccessName
+ */
+
+/**
+ * @typedef {object} ExternalModuleInfo
+ * @property {"external"} type
+ * @property {Module} module
+ * @property {RuntimeSpec | boolean} runtimeCondition
+ * @property {number} index
+ * @property {string | undefined} name
+ * @property {boolean} interopNamespaceObjectUsed
+ * @property {string | undefined} interopNamespaceObjectName
+ * @property {boolean} interopNamespaceObject2Used
+ * @property {string | undefined} interopNamespaceObject2Name
+ * @property {boolean} interopDefaultAccessUsed
+ * @property {string | undefined} interopDefaultAccessName
+ */
+
+/**
+ * @typedef {object} ReferenceToModuleInfo
+ * @property {"reference"} type
+ * @property {RuntimeSpec | boolean} runtimeCondition
+ * @property {ModuleInfo} target
+ */
+
+/**
+ * @template T
+ * @param {string} property property
+ * @param {function(T[keyof T], T[keyof T]): 0 | 1 | -1} comparator comparator
+ * @returns {Comparator} comparator
+ */
+
+const createComparator = (property, comparator) => (a, b) =>
+	comparator(
+		a[/** @type {keyof T} */ (property)],
+		b[/** @type {keyof T} */ (property)]
+	);
+
+/**
+ * @param {number} a a
+ * @param {number} b b
+ * @returns {0 | 1 | -1} result
+ */
+const compareNumbers = (a, b) => {
+	if (Number.isNaN(a)) {
+		if (!Number.isNaN(b)) {
+			return 1;
+		}
+	} else {
+		if (Number.isNaN(b)) {
+			return -1;
+		}
+		if (a !== b) {
+			return a < b ? -1 : 1;
 		}
-		info.namespaceObjectSource = nsObj.join("\n") + "\n";
 	}
+	return 0;
 };
+const bySourceOrder = createComparator("sourceOrder", compareNumbers);
+const byRangeStart = createComparator("rangeStart", compareNumbers);
 
-const getExternalImport = (
-	importedModule,
-	info,
-	exportName,
-	asCall,
-	strictHarmonyModule
-) => {
-	const used = importedModule.isUsed(exportName);
-	if (!used) return "/* unused reexport */undefined";
-	const comment =
-		used !== exportName ? ` ${Template.toNormalComment(exportName)}` : "";
-	switch (importedModule.buildMeta.exportsType) {
-		case "named":
-			if (exportName === "default") {
-				return info.name;
-			} else if (exportName === true) {
-				info.interopNamespaceObjectUsed = true;
-				return info.interopNamespaceObjectName;
-			} else {
-				break;
-			}
-		case "namespace":
-			if (exportName === true) {
-				return info.name;
-			} else {
-				break;
-			}
-		default:
-			if (strictHarmonyModule) {
-				if (exportName === "default") {
-					return info.name;
-				} else if (exportName === true) {
-					info.interopNamespaceObjectUsed = true;
-					return info.interopNamespaceObjectName;
-				} else {
-					return "/* non-default import from non-esm module */undefined";
-				}
-			} else {
-				if (exportName === "default") {
-					info.interopDefaultAccessUsed = true;
-					return asCall
-						? `${info.interopDefaultAccessName}()`
-						: `${info.interopDefaultAccessName}.a`;
-				} else if (exportName === true) {
-					return info.name;
-				} else {
-					break;
-				}
-			}
+/**
+ * @param {Iterable} iterable iterable object
+ * @returns {string} joined iterable object
+ */
+const joinIterableWithComma = iterable => {
+	// This is more performant than Array.from().join(", ")
+	// as it doesn't create an array
+	let str = "";
+	let first = true;
+	for (const item of iterable) {
+		if (first) {
+			first = false;
+		} else {
+			str += ", ";
+		}
+		str += item;
 	}
-	const reference = `${info.name}[${JSON.stringify(used)}${comment}]`;
-	if (asCall) return `Object(${reference})`;
-	return reference;
+	return str;
 };
 
-const getFinalName = (
+/**
+ * @typedef {object} ConcatenationEntry
+ * @property {"concatenated" | "external"} type
+ * @property {Module} module
+ * @property {RuntimeSpec | boolean} runtimeCondition
+ */
+
+/**
+ * @param {ModuleGraph} moduleGraph the module graph
+ * @param {ModuleInfo} info module info
+ * @param {string[]} exportName exportName
+ * @param {Map} moduleToInfoMap moduleToInfoMap
+ * @param {RuntimeSpec} runtime for which runtime
+ * @param {RequestShortener} requestShortener the request shortener
+ * @param {RuntimeTemplate} runtimeTemplate the runtime template
+ * @param {Set} neededNamespaceObjects modules for which a namespace object should be generated
+ * @param {boolean} asCall asCall
+ * @param {boolean | undefined} strictHarmonyModule strictHarmonyModule
+ * @param {boolean | undefined} asiSafe asiSafe
+ * @param {Set} alreadyVisited alreadyVisited
+ * @returns {Binding} the final variable
+ */
+const getFinalBinding = (
+	moduleGraph,
 	info,
 	exportName,
 	moduleToInfoMap,
+	runtime,
 	requestShortener,
+	runtimeTemplate,
+	neededNamespaceObjects,
 	asCall,
 	strictHarmonyModule,
+	asiSafe,
 	alreadyVisited = new Set()
 ) => {
+	const exportsType = info.module.getExportsType(
+		moduleGraph,
+		strictHarmonyModule
+	);
+	if (exportName.length === 0) {
+		switch (exportsType) {
+			case "default-only":
+				info.interopNamespaceObject2Used = true;
+				return {
+					info,
+					rawName: /** @type {string} */ (info.interopNamespaceObject2Name),
+					ids: exportName,
+					exportName
+				};
+			case "default-with-named":
+				info.interopNamespaceObjectUsed = true;
+				return {
+					info,
+					rawName: /** @type {string} */ (info.interopNamespaceObjectName),
+					ids: exportName,
+					exportName
+				};
+			case "namespace":
+			case "dynamic":
+				break;
+			default:
+				throw new Error(`Unexpected exportsType ${exportsType}`);
+		}
+	} else {
+		switch (exportsType) {
+			case "namespace":
+				break;
+			case "default-with-named":
+				switch (exportName[0]) {
+					case "default":
+						exportName = exportName.slice(1);
+						break;
+					case "__esModule":
+						return {
+							info,
+							rawName: "/* __esModule */true",
+							ids: exportName.slice(1),
+							exportName
+						};
+				}
+				break;
+			case "default-only": {
+				const exportId = exportName[0];
+				if (exportId === "__esModule") {
+					return {
+						info,
+						rawName: "/* __esModule */true",
+						ids: exportName.slice(1),
+						exportName
+					};
+				}
+				exportName = exportName.slice(1);
+				if (exportId !== "default") {
+					return {
+						info,
+						rawName:
+							"/* non-default import from default-exporting module */undefined",
+						ids: exportName,
+						exportName
+					};
+				}
+				break;
+			}
+			case "dynamic":
+				switch (exportName[0]) {
+					case "default": {
+						exportName = exportName.slice(1);
+						info.interopDefaultAccessUsed = true;
+						const defaultExport = asCall
+							? `${info.interopDefaultAccessName}()`
+							: asiSafe
+								? `(${info.interopDefaultAccessName}())`
+								: asiSafe === false
+									? `;(${info.interopDefaultAccessName}())`
+									: `${info.interopDefaultAccessName}.a`;
+						return {
+							info,
+							rawName: defaultExport,
+							ids: exportName,
+							exportName
+						};
+					}
+					case "__esModule":
+						return {
+							info,
+							rawName: "/* __esModule */true",
+							ids: exportName.slice(1),
+							exportName
+						};
+				}
+				break;
+			default:
+				throw new Error(`Unexpected exportsType ${exportsType}`);
+		}
+	}
+	if (exportName.length === 0) {
+		switch (info.type) {
+			case "concatenated":
+				neededNamespaceObjects.add(info);
+				return {
+					info,
+					rawName:
+						/** @type {NonNullable} */
+						(info.namespaceObjectName),
+					ids: exportName,
+					exportName
+				};
+			case "external":
+				return {
+					info,
+					rawName:
+						/** @type {NonNullable} */
+						(info.name),
+					ids: exportName,
+					exportName
+				};
+		}
+	}
+	const exportsInfo = moduleGraph.getExportsInfo(info.module);
+	const exportInfo = exportsInfo.getExportInfo(exportName[0]);
+	if (alreadyVisited.has(exportInfo)) {
+		return {
+			info,
+			rawName: "/* circular reexport */ Object(function x() { x() }())",
+			ids: [],
+			exportName
+		};
+	}
+	alreadyVisited.add(exportInfo);
 	switch (info.type) {
 		case "concatenated": {
-			const directExport = info.exportMap.get(exportName);
+			const exportId = exportName[0];
+			if (exportInfo.provided === false) {
+				// It's not provided, but it could be on the prototype
+				neededNamespaceObjects.add(info);
+				return {
+					info,
+					rawName: /** @type {string} */ (info.namespaceObjectName),
+					ids: exportName,
+					exportName
+				};
+			}
+			const directExport = info.exportMap && info.exportMap.get(exportId);
 			if (directExport) {
-				if (exportName === true) {
-					ensureNsObjSource(
+				const usedName = /** @type {string[]} */ (
+					exportsInfo.getUsedName(exportName, runtime)
+				);
+				if (!usedName) {
+					return {
 						info,
-						moduleToInfoMap,
-						requestShortener,
-						strictHarmonyModule
-					);
-				} else if (!info.module.isUsed(exportName)) {
-					return "/* unused export */ undefined";
-				}
-				if (info.globalExports.has(directExport)) {
-					return directExport;
-				}
-				const name = info.internalNames.get(directExport);
-				if (!name) {
-					throw new Error(
-						`The export "${directExport}" in "${info.module.readableIdentifier(
-							requestShortener
-						)}" has no internal name`
-					);
+						rawName: "/* unused export */ undefined",
+						ids: exportName.slice(1),
+						exportName
+					};
 				}
-				return name;
+				return {
+					info,
+					name: directExport,
+					ids: usedName.slice(1),
+					exportName
+				};
+			}
+			const rawExport = info.rawExportMap && info.rawExportMap.get(exportId);
+			if (rawExport) {
+				return {
+					info,
+					rawName: rawExport,
+					ids: exportName.slice(1),
+					exportName
+				};
+			}
+			const reexport = exportInfo.findTarget(moduleGraph, module =>
+				moduleToInfoMap.has(module)
+			);
+			if (reexport === false) {
+				throw new Error(
+					`Target module of reexport from '${info.module.readableIdentifier(
+						requestShortener
+					)}' is not part of the concatenation (export '${exportId}')\nModules in the concatenation:\n${Array.from(
+						moduleToInfoMap,
+						([m, info]) =>
+							` * ${info.type} ${m.readableIdentifier(requestShortener)}`
+					).join("\n")}`
+				);
 			}
-			const reexport = info.reexportMap.get(exportName);
 			if (reexport) {
-				if (alreadyVisited.has(reexport)) {
-					throw new Error(
-						`Circular reexports ${Array.from(
-							alreadyVisited,
-							e =>
-								`"${e.module.readableIdentifier(requestShortener)}".${
-									e.exportName
-								}`
-						).join(
-							" --> "
-						)} -(circular)-> "${reexport.module.readableIdentifier(
-							requestShortener
-						)}".${reexport.exportName}`
-					);
-				}
-				alreadyVisited.add(reexport);
 				const refInfo = moduleToInfoMap.get(reexport.module);
-				if (refInfo) {
-					// module is in the concatenation
-					return getFinalName(
-						refInfo,
-						reexport.exportName,
-						moduleToInfoMap,
-						requestShortener,
-						asCall,
-						strictHarmonyModule,
-						alreadyVisited
-					);
-				}
+				return getFinalBinding(
+					moduleGraph,
+					/** @type {ModuleInfo} */ (refInfo),
+					reexport.export
+						? [...reexport.export, ...exportName.slice(1)]
+						: exportName.slice(1),
+					moduleToInfoMap,
+					runtime,
+					requestShortener,
+					runtimeTemplate,
+					neededNamespaceObjects,
+					asCall,
+					/** @type {BuildMeta} */
+					(info.module.buildMeta).strictHarmonyModule,
+					asiSafe,
+					alreadyVisited
+				);
 			}
-			const problem =
-				`Cannot get final name for export "${exportName}" in "${info.module.readableIdentifier(
-					requestShortener
-				)}"` +
-				` (known exports: ${Array.from(info.exportMap.keys())
-					.filter(name => name !== true)
-					.join(" ")}, ` +
-				`known reexports: ${Array.from(info.reexportMap.keys()).join(" ")})`;
-			return `${Template.toNormalComment(problem)} undefined`;
+			if (info.namespaceExportSymbol) {
+				const usedName = /** @type {string[]} */ (
+					exportsInfo.getUsedName(exportName, runtime)
+				);
+				return {
+					info,
+					rawName: /** @type {string} */ (info.namespaceObjectName),
+					ids: usedName,
+					exportName
+				};
+			}
+			throw new Error(
+				`Cannot get final name for export '${exportName.join(
+					"."
+				)}' of ${info.module.readableIdentifier(requestShortener)}`
+			);
 		}
+
 		case "external": {
-			const importedModule = info.module;
-			return getExternalImport(
-				importedModule,
-				info,
-				exportName,
-				asCall,
-				strictHarmonyModule
+			const used = /** @type {string[]} */ (
+				exportsInfo.getUsedName(exportName, runtime)
 			);
+			if (!used) {
+				return {
+					info,
+					rawName: "/* unused export */ undefined",
+					ids: exportName.slice(1),
+					exportName
+				};
+			}
+			const comment = equals(used, exportName)
+				? ""
+				: Template.toNormalComment(`${exportName.join(".")}`);
+			return { info, rawName: info.name + comment, ids: used, exportName };
 		}
 	}
 };
 
-const addScopeSymbols1 = (s, nameSet, scopeSet) => {
-	let scope = s;
-	while (scope) {
-		if (scopeSet.has(scope)) break;
-		scopeSet.add(scope);
-		for (const variable of scope.variables) {
-			nameSet.add(variable.name);
+/**
+ * @param {ModuleGraph} moduleGraph the module graph
+ * @param {ModuleInfo} info module info
+ * @param {string[]} exportName exportName
+ * @param {Map} moduleToInfoMap moduleToInfoMap
+ * @param {RuntimeSpec} runtime for which runtime
+ * @param {RequestShortener} requestShortener the request shortener
+ * @param {RuntimeTemplate} runtimeTemplate the runtime template
+ * @param {Set} neededNamespaceObjects modules for which a namespace object should be generated
+ * @param {boolean} asCall asCall
+ * @param {boolean | undefined} callContext callContext
+ * @param {boolean | undefined} strictHarmonyModule strictHarmonyModule
+ * @param {boolean | undefined} asiSafe asiSafe
+ * @returns {string} the final name
+ */
+const getFinalName = (
+	moduleGraph,
+	info,
+	exportName,
+	moduleToInfoMap,
+	runtime,
+	requestShortener,
+	runtimeTemplate,
+	neededNamespaceObjects,
+	asCall,
+	callContext,
+	strictHarmonyModule,
+	asiSafe
+) => {
+	const binding = getFinalBinding(
+		moduleGraph,
+		info,
+		exportName,
+		moduleToInfoMap,
+		runtime,
+		requestShortener,
+		runtimeTemplate,
+		neededNamespaceObjects,
+		asCall,
+		strictHarmonyModule,
+		asiSafe
+	);
+	{
+		const { ids, comment } = binding;
+		let reference;
+		let isPropertyAccess;
+		if ("rawName" in binding) {
+			reference = `${binding.rawName}${comment || ""}${propertyAccess(ids)}`;
+			isPropertyAccess = ids.length > 0;
+		} else {
+			const { info, name: exportId } = binding;
+			const name = info.internalNames.get(exportId);
+			if (!name) {
+				throw new Error(
+					`The export "${exportId}" in "${info.module.readableIdentifier(
+						requestShortener
+					)}" has no internal name (existing names: ${
+						Array.from(
+							info.internalNames,
+							([name, symbol]) => `${name}: ${symbol}`
+						).join(", ") || "none"
+					})`
+				);
+			}
+			reference = `${name}${comment || ""}${propertyAccess(ids)}`;
+			isPropertyAccess = ids.length > 1;
 		}
-		scope = scope.upper;
-	}
-};
-
-const addScopeSymbols2 = (s, nameSet, scopeSet1, scopeSet2) => {
-	let scope = s;
-	while (scope) {
-		if (scopeSet1.has(scope)) break;
-		if (scopeSet2.has(scope)) break;
-		scopeSet1.add(scope);
-		for (const variable of scope.variables) {
-			nameSet.add(variable.name);
+		if (isPropertyAccess && asCall && callContext === false) {
+			return asiSafe
+				? `(0,${reference})`
+				: asiSafe === false
+					? `;(0,${reference})`
+					: `/*#__PURE__*/Object(${reference})`;
 		}
-		scope = scope.upper;
+		return reference;
 	}
 };
 
-const getAllReferences = variable => {
-	let set = variable.references;
-	// Look for inner scope variables too (like in class Foo { t() { Foo } })
-	const identifiers = new Set(variable.identifiers);
-	for (const scope of variable.scope.childScopes) {
-		for (const innerVar of scope.variables) {
-			if (innerVar.identifiers.some(id => identifiers.has(id))) {
-				set = set.concat(innerVar.references);
-				break;
-			}
-		}
-	}
-	return set;
-};
+/**
+ * @typedef {object} ConcatenateModuleHooks
+ * @property {SyncBailHook<[Record, ConcatenatedModule], boolean | void>} exportsDefinitions
+ */
 
-const getPathInAst = (ast, node) => {
-	if (ast === node) {
-		return [];
+/** @type {WeakMap} */
+const compilationHooksMap = new WeakMap();
+
+class ConcatenatedModule extends Module {
+	/**
+	 * @param {Module} rootModule the root module of the concatenation
+	 * @param {Set} modules all modules in the concatenation (including the root module)
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @param {Compilation} compilation the compilation
+	 * @param {AssociatedObjectForCache=} associatedObjectForCache object for caching
+	 * @param {string | HashConstructor=} hashFunction hash function to use
+	 * @returns {ConcatenatedModule} the module
+	 */
+	static create(
+		rootModule,
+		modules,
+		runtime,
+		compilation,
+		associatedObjectForCache,
+		hashFunction = DEFAULTS.HASH_FUNCTION
+	) {
+		const identifier = ConcatenatedModule._createIdentifier(
+			rootModule,
+			modules,
+			associatedObjectForCache,
+			hashFunction
+		);
+		return new ConcatenatedModule({
+			identifier,
+			rootModule,
+			modules,
+			runtime,
+			compilation
+		});
 	}
 
-	const nr = node.range;
-
-	const enterNode = n => {
-		if (!n) return undefined;
-		const r = n.range;
-		if (r) {
-			if (r[0] <= nr[0] && r[1] >= nr[1]) {
-				const path = getPathInAst(n, node);
-				if (path) {
-					path.push(n);
-					return path;
-				}
-			}
-		}
-		return undefined;
-	};
-
-	var i;
-	if (Array.isArray(ast)) {
-		for (i = 0; i < ast.length; i++) {
-			const enterResult = enterNode(ast[i]);
-			if (enterResult !== undefined) return enterResult;
-		}
-	} else if (ast && typeof ast === "object") {
-		const keys = Object.keys(ast);
-		for (i = 0; i < keys.length; i++) {
-			const value = ast[keys[i]];
-			if (Array.isArray(value)) {
-				const pathResult = getPathInAst(value, node);
-				if (pathResult !== undefined) return pathResult;
-			} else if (value && typeof value === "object") {
-				const enterResult = enterNode(value);
-				if (enterResult !== undefined) return enterResult;
-			}
+	/**
+	 * @param {Compilation} compilation the compilation
+	 * @returns {ConcatenateModuleHooks} the attached hooks
+	 */
+	static getCompilationHooks(compilation) {
+		let hooks = compilationHooksMap.get(compilation);
+		if (hooks === undefined) {
+			hooks = {
+				exportsDefinitions: new SyncBailHook(["definitions", "module"])
+			};
+			compilationHooksMap.set(compilation, hooks);
 		}
+		return hooks;
 	}
-};
 
-class ConcatenatedModule extends Module {
-	constructor(rootModule, modules, concatenationList) {
-		super("javascript/esm", null);
-		super.setChunks(rootModule._chunks);
+	/**
+	 * @param {object} options options
+	 * @param {string} options.identifier the identifier of the module
+	 * @param {Module} options.rootModule the root module of the concatenation
+	 * @param {RuntimeSpec} options.runtime the selected runtime
+	 * @param {Set} options.modules all concatenated modules
+	 * @param {Compilation} options.compilation the compilation
+	 */
+	constructor({ identifier, rootModule, modules, runtime, compilation }) {
+		super(JAVASCRIPT_MODULE_TYPE_ESM, null, rootModule && rootModule.layer);
 
 		// Info from Factory
+		/** @type {string} */
+		this._identifier = identifier;
+		/** @type {Module} */
 		this.rootModule = rootModule;
-		this.factoryMeta = rootModule.factoryMeta;
-
-		// Info from Compilation
-		this.index = rootModule.index;
-		this.index2 = rootModule.index2;
-		this.depth = rootModule.depth;
-
-		// Info from Optimization
-		this.used = rootModule.used;
-		this.usedExports = rootModule.usedExports;
-
-		// Info from Build
-		this.buildInfo = {
-			strict: true,
-			cacheable: modules.every(m => m.buildInfo.cacheable),
-			moduleArgument: rootModule.buildInfo.moduleArgument,
-			exportsArgument: rootModule.buildInfo.exportsArgument,
-			fileDependencies: new Set(),
-			contextDependencies: new Set(),
-			assets: undefined
-		};
-		this.built = modules.some(m => m.built);
-		this.buildMeta = rootModule.buildMeta;
-
-		// Caching
-		this._numberOfConcatenatedModules = modules.length;
-
-		// Graph
-		const modulesSet = new Set(modules);
-		this.reasons = rootModule.reasons.filter(
-			reason =>
-				!(reason.dependency instanceof HarmonyImportDependency) ||
-				!modulesSet.has(reason.module)
-		);
-
-		this.dependencies = [];
+		/** @type {Set} */
+		this._modules = modules;
+		this._runtime = runtime;
+		this.factoryMeta = rootModule && rootModule.factoryMeta;
+		/** @type {Compilation | undefined} */
+		this.compilation = compilation;
+	}
 
-		this.warnings = [];
-		this.errors = [];
-		this._orderedConcatenationList =
-			concatenationList ||
-			ConcatenatedModule.createConcatenationList(rootModule, modulesSet, null);
-		for (const info of this._orderedConcatenationList) {
-			if (info.type === "concatenated") {
-				const m = info.module;
-
-				// populate dependencies
-				for (const d of m.dependencies.filter(
-					dep =>
-						!(dep instanceof HarmonyImportDependency) ||
-						!modulesSet.has(dep._module)
-				)) {
-					this.dependencies.push(d);
-				}
-				// populate file dependencies
-				if (m.buildInfo.fileDependencies) {
-					for (const file of m.buildInfo.fileDependencies) {
-						this.buildInfo.fileDependencies.add(file);
-					}
-				}
-				// populate context dependencies
-				if (m.buildInfo.contextDependencies) {
-					for (const context of m.buildInfo.contextDependencies) {
-						this.buildInfo.contextDependencies.add(context);
-					}
-				}
-				// populate warnings
-				for (const warning of m.warnings) {
-					this.warnings.push(warning);
-				}
-				// populate errors
-				for (const error of m.errors) {
-					this.errors.push(error);
-				}
+	/**
+	 * Assuming this module is in the cache. Update the (cached) module with
+	 * the fresh module from the factory. Usually updates internal references
+	 * and properties.
+	 * @param {Module} module fresh module
+	 * @returns {void}
+	 */
+	updateCacheModule(module) {
+		throw new Error("Must not be called");
+	}
 
-				if (m.buildInfo.assets) {
-					if (this.buildInfo.assets === undefined) {
-						this.buildInfo.assets = Object.create(null);
-					}
-					Object.assign(this.buildInfo.assets, m.buildInfo.assets);
-				}
-			}
-		}
-		this._identifier = this._createIdentifier();
+	/**
+	 * @returns {SourceTypes} types available (do not mutate)
+	 */
+	getSourceTypes() {
+		return JS_TYPES;
 	}
 
 	get modules() {
-		return this._orderedConcatenationList
-			.filter(info => info.type === "concatenated")
-			.map(info => info.module);
+		return Array.from(this._modules);
 	}
 
+	/**
+	 * @returns {string} a unique identifier of the module
+	 */
 	identifier() {
 		return this._identifier;
 	}
 
+	/**
+	 * @param {RequestShortener} requestShortener the request shortener
+	 * @returns {string} a user readable identifier of the module
+	 */
 	readableIdentifier(requestShortener) {
-		return (
-			this.rootModule.readableIdentifier(requestShortener) +
-			` + ${this._numberOfConcatenatedModules - 1} modules`
-		);
+		return `${this.rootModule.readableIdentifier(
+			requestShortener
+		)} + ${this._modules.size - 1} modules`;
 	}
 
+	/**
+	 * @param {LibIdentOptions} options options
+	 * @returns {string | null} an identifier for library inclusion
+	 */
 	libIdent(options) {
 		return this.rootModule.libIdent(options);
 	}
 
+	/**
+	 * @returns {string | null} absolute path which should be used for condition matching (usually the resource path)
+	 */
 	nameForCondition() {
 		return this.rootModule.nameForCondition();
 	}
 
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @returns {ConnectionState} how this module should be connected to referencing modules when consumed for side-effects only
+	 */
+	getSideEffectsConnectionState(moduleGraph) {
+		return this.rootModule.getSideEffectsConnectionState(moduleGraph);
+	}
+
+	/**
+	 * @param {WebpackOptions} options webpack options
+	 * @param {Compilation} compilation the compilation
+	 * @param {ResolverWithOptions} resolver the resolver
+	 * @param {InputFileSystem} fs the file system
+	 * @param {BuildCallback} callback callback function
+	 * @returns {void}
+	 */
 	build(options, compilation, resolver, fs, callback) {
-		throw new Error("Cannot build this module. It should be already built.");
+		const { rootModule } = this;
+		const { moduleArgument, exportsArgument } =
+			/** @type {BuildInfo} */
+			(rootModule.buildInfo);
+		this.buildInfo = {
+			strict: true,
+			cacheable: true,
+			moduleArgument,
+			exportsArgument,
+			fileDependencies: new LazySet(),
+			contextDependencies: new LazySet(),
+			missingDependencies: new LazySet(),
+			topLevelDeclarations: new Set(),
+			assets: undefined
+		};
+		this.buildMeta = rootModule.buildMeta;
+		this.clearDependenciesAndBlocks();
+		this.clearWarningsAndErrors();
+
+		for (const m of this._modules) {
+			// populate cacheable
+			if (!(/** @type {BuildInfo} */ (m.buildInfo).cacheable)) {
+				this.buildInfo.cacheable = false;
+			}
+
+			// populate dependencies
+			for (const d of m.dependencies.filter(
+				dep =>
+					!(dep instanceof HarmonyImportDependency) ||
+					!this._modules.has(
+						/** @type {Module} */ (compilation.moduleGraph.getModule(dep))
+					)
+			)) {
+				this.dependencies.push(d);
+			}
+			// populate blocks
+			for (const d of m.blocks) {
+				this.blocks.push(d);
+			}
+
+			// populate warnings
+			const warnings = m.getWarnings();
+			if (warnings !== undefined) {
+				for (const warning of warnings) {
+					this.addWarning(warning);
+				}
+			}
+
+			// populate errors
+			const errors = m.getErrors();
+			if (errors !== undefined) {
+				for (const error of errors) {
+					this.addError(error);
+				}
+			}
+
+			const { assets, assetsInfo, topLevelDeclarations } =
+				/** @type {BuildInfo} */ (m.buildInfo);
+
+			// populate topLevelDeclarations
+			if (topLevelDeclarations) {
+				const topLevelDeclarations = this.buildInfo.topLevelDeclarations;
+				if (topLevelDeclarations !== undefined) {
+					for (const decl of topLevelDeclarations) {
+						topLevelDeclarations.add(decl);
+					}
+				}
+			} else {
+				this.buildInfo.topLevelDeclarations = undefined;
+			}
+
+			// populate assets
+			if (assets) {
+				if (this.buildInfo.assets === undefined) {
+					this.buildInfo.assets = Object.create(null);
+				}
+				Object.assign(
+					/** @type {NonNullable} */
+					(
+						/** @type {BuildInfo} */
+						(this.buildInfo).assets
+					),
+					assets
+				);
+			}
+			if (assetsInfo) {
+				if (this.buildInfo.assetsInfo === undefined) {
+					this.buildInfo.assetsInfo = new Map();
+				}
+				for (const [key, value] of assetsInfo) {
+					this.buildInfo.assetsInfo.set(key, value);
+				}
+			}
+		}
+		callback();
 	}
 
-	size() {
+	/**
+	 * @param {string=} type the source type for which the size should be estimated
+	 * @returns {number} the estimated size of the module (must be non-zero)
+	 */
+	size(type) {
 		// Guess size from embedded modules
-		return this._orderedConcatenationList.reduce((sum, info) => {
-			switch (info.type) {
-				case "concatenated":
-					return sum + info.module.size();
-				case "external":
-					return sum + 5;
-			}
-			return sum;
-		}, 0);
+		let size = 0;
+		for (const module of this._modules) {
+			size += module.size(type);
+		}
+		return size;
 	}
 
 	/**
+	 * @private
 	 * @param {Module} rootModule the root of the concatenation
 	 * @param {Set} modulesSet a set of modules which should be concatenated
-	 * @param {Compilation} compilation the compilation context
+	 * @param {RuntimeSpec} runtime for this runtime
+	 * @param {ModuleGraph} moduleGraph the module graph
 	 * @returns {ConcatenationEntry[]} concatenation list
 	 */
-	static createConcatenationList(rootModule, modulesSet, compilation) {
+	_createConcatenationList(rootModule, modulesSet, runtime, moduleGraph) {
+		/** @type {ConcatenationEntry[]} */
 		const list = [];
-		const set = new Set();
+		/** @type {Map} */
+		const existingEntries = new Map();
 
 		/**
 		 * @param {Module} module a module
-		 * @returns {(function(): Module)[]} imported modules in order
+		 * @returns {Iterable<{ connection: ModuleGraphConnection, runtimeCondition: RuntimeSpec | true }>} imported modules in order
 		 */
 		const getConcatenatedImports = module => {
-			/** @type {WeakMap} */
-			const map = new WeakMap();
-			const references = module.dependencies
-				.filter(dep => dep instanceof HarmonyImportDependency)
-				.map(dep => {
-					const ref = compilation.getDependencyReference(module, dep);
-					if (ref) map.set(ref, dep);
-					return ref;
+			const connections = Array.from(
+				moduleGraph.getOutgoingConnections(module)
+			);
+			if (module === rootModule) {
+				for (const c of moduleGraph.getOutgoingConnections(this))
+					connections.push(c);
+			}
+			/**
+			 * @type {Array<{ connection: ModuleGraphConnection, sourceOrder: number, rangeStart: number }>}
+			 */
+			const references = connections
+				.filter(connection => {
+					if (!(connection.dependency instanceof HarmonyImportDependency))
+						return false;
+					return (
+						connection &&
+						connection.resolvedOriginModule === module &&
+						connection.module &&
+						connection.isTargetActive(runtime)
+					);
 				})
-				.filter(ref => ref);
-			DependencyReference.sort(references);
-			// TODO webpack 5: remove this hack, see also DependencyReference
-			return references.map(ref => {
-				const dep = map.get(ref);
-				return () => compilation.getDependencyReference(module, dep).module;
-			});
+				.map(connection => {
+					const dep = /** @type {HarmonyImportDependency} */ (
+						connection.dependency
+					);
+					return {
+						connection,
+						sourceOrder: dep.sourceOrder,
+						rangeStart: dep.range && dep.range[0]
+					};
+				});
+			/**
+			 * bySourceOrder
+			 * @example
+			 * import a from "a"; // sourceOrder=1
+			 * import b from "b"; // sourceOrder=2
+			 *
+			 * byRangeStart
+			 * @example
+			 * import {a, b} from "a"; // sourceOrder=1
+			 * a.a(); // first range
+			 * b.b(); // second range
+			 *
+			 * If there is no reexport, we have the same source.
+			 * If there is reexport, but module has side effects, this will lead to reexport module only.
+			 * If there is side-effects-free reexport, we can get simple deterministic result with range start comparison.
+			 */
+			references.sort(concatComparators(bySourceOrder, byRangeStart));
+			/** @type {Map} */
+			const referencesMap = new Map();
+			for (const { connection } of references) {
+				const runtimeCondition = filterRuntime(runtime, r =>
+					connection.isTargetActive(r)
+				);
+				if (runtimeCondition === false) continue;
+				const module = connection.module;
+				const entry = referencesMap.get(module);
+				if (entry === undefined) {
+					referencesMap.set(module, { connection, runtimeCondition });
+					continue;
+				}
+				entry.runtimeCondition = mergeRuntimeConditionNonFalse(
+					entry.runtimeCondition,
+					runtimeCondition,
+					runtime
+				);
+			}
+			return referencesMap.values();
 		};
 
-		const enterModule = getModule => {
-			const module = getModule();
+		/**
+		 * @param {ModuleGraphConnection} connection graph connection
+		 * @param {RuntimeSpec | true} runtimeCondition runtime condition
+		 * @returns {void}
+		 */
+		const enterModule = (connection, runtimeCondition) => {
+			const module = connection.module;
 			if (!module) return;
-			if (set.has(module)) return;
-			set.add(module);
+			const existingEntry = existingEntries.get(module);
+			if (existingEntry === true) {
+				return;
+			}
 			if (modulesSet.has(module)) {
+				existingEntries.set(module, true);
+				if (runtimeCondition !== true) {
+					throw new Error(
+						`Cannot runtime-conditional concatenate a module (${module.identifier()} in ${this.rootModule.identifier()}, ${runtimeConditionToString(
+							runtimeCondition
+						)}). This should not happen.`
+					);
+				}
 				const imports = getConcatenatedImports(module);
-				imports.forEach(enterModule);
+				for (const { connection, runtimeCondition } of imports)
+					enterModule(connection, runtimeCondition);
 				list.push({
 					type: "concatenated",
-					module
+					module: connection.module,
+					runtimeCondition
 				});
 			} else {
+				if (existingEntry !== undefined) {
+					const reducedRuntimeCondition = subtractRuntimeCondition(
+						runtimeCondition,
+						existingEntry,
+						runtime
+					);
+					if (reducedRuntimeCondition === false) return;
+					runtimeCondition = reducedRuntimeCondition;
+					existingEntries.set(
+						connection.module,
+						mergeRuntimeConditionNonFalse(
+							existingEntry,
+							runtimeCondition,
+							runtime
+						)
+					);
+				} else {
+					existingEntries.set(connection.module, runtimeCondition);
+				}
+				if (list.length > 0) {
+					const lastItem = list[list.length - 1];
+					if (
+						lastItem.type === "external" &&
+						lastItem.module === connection.module
+					) {
+						lastItem.runtimeCondition = mergeRuntimeCondition(
+							lastItem.runtimeCondition,
+							runtimeCondition,
+							runtime
+						);
+						return;
+					}
+				}
 				list.push({
 					type: "external",
 					get module() {
 						// We need to use a getter here, because the module in the dependency
 						// could be replaced by some other process (i. e. also replaced with a
 						// concatenated module)
-						return getModule();
-					}
+						return connection.module;
+					},
+					runtimeCondition
 				});
 			}
 		};
 
-		enterModule(() => rootModule);
+		existingEntries.set(rootModule, true);
+		const imports = getConcatenatedImports(rootModule);
+		for (const { connection, runtimeCondition } of imports)
+			enterModule(connection, runtimeCondition);
+		list.push({
+			type: "concatenated",
+			module: rootModule,
+			runtimeCondition: true
+		});
 
 		return list;
 	}
 
-	_createIdentifier() {
-		let orderedConcatenationListIdentifiers = "";
-		for (let i = 0; i < this._orderedConcatenationList.length; i++) {
-			if (this._orderedConcatenationList[i].type === "concatenated") {
-				orderedConcatenationListIdentifiers += this._orderedConcatenationList[
-					i
-				].module.identifier();
-				orderedConcatenationListIdentifiers += " ";
-			}
+	/**
+	 * @param {Module} rootModule the root module of the concatenation
+	 * @param {Set} modules all modules in the concatenation (including the root module)
+	 * @param {AssociatedObjectForCache=} associatedObjectForCache object for caching
+	 * @param {string | HashConstructor=} hashFunction hash function to use
+	 * @returns {string} the identifier
+	 */
+	static _createIdentifier(
+		rootModule,
+		modules,
+		associatedObjectForCache,
+		hashFunction = DEFAULTS.HASH_FUNCTION
+	) {
+		const cachedMakePathsRelative = makePathsRelative.bindContextCache(
+			/** @type {string} */ (rootModule.context),
+			associatedObjectForCache
+		);
+		const identifiers = [];
+		for (const module of modules) {
+			identifiers.push(cachedMakePathsRelative(module.identifier()));
 		}
-		const hash = createHash("md4");
-		hash.update(orderedConcatenationListIdentifiers);
-		return this.rootModule.identifier() + " " + hash.digest("hex");
+		identifiers.sort();
+		const hash = createHash(hashFunction);
+		hash.update(identifiers.join(" "));
+		return `${rootModule.identifier()}|${hash.digest("hex")}`;
 	}
 
-	source(dependencyTemplates, runtimeTemplate) {
-		const requestShortener = runtimeTemplate.requestShortener;
-		// Metainfo for each module
-		const modulesWithInfo = this._orderedConcatenationList.map((info, idx) => {
-			switch (info.type) {
-				case "concatenated": {
-					const exportMap = new Map();
-					const reexportMap = new Map();
-					for (const dep of info.module.dependencies) {
-						if (dep instanceof HarmonyExportSpecifierDependency) {
-							if (!exportMap.has(dep.name)) {
-								exportMap.set(dep.name, dep.id);
-							}
-						} else if (dep instanceof HarmonyExportExpressionDependency) {
-							if (!exportMap.has("default")) {
-								exportMap.set("default", "__WEBPACK_MODULE_DEFAULT_EXPORT__");
-							}
-						} else if (
-							dep instanceof HarmonyExportImportedSpecifierDependency
-						) {
-							const exportName = dep.name;
-							const importName = dep.id;
-							const importedModule = dep._module;
-							if (exportName && importName) {
-								if (!reexportMap.has(exportName)) {
-									reexportMap.set(exportName, {
-										module: importedModule,
-										exportName: importName,
-										dependency: dep
-									});
-								}
-							} else if (exportName) {
-								if (!reexportMap.has(exportName)) {
-									reexportMap.set(exportName, {
-										module: importedModule,
-										exportName: true,
-										dependency: dep
-									});
-								}
-							} else if (importedModule) {
-								for (const name of importedModule.buildMeta.providedExports) {
-									if (dep.activeExports.has(name) || name === "default") {
-										continue;
-									}
-									if (!reexportMap.has(name)) {
-										reexportMap.set(name, {
-											module: importedModule,
-											exportName: name,
-											dependency: dep
-										});
-									}
-								}
-							}
-						}
-					}
-					return {
-						type: "concatenated",
-						module: info.module,
-						index: idx,
-						ast: undefined,
-						internalSource: undefined,
-						source: undefined,
-						globalScope: undefined,
-						moduleScope: undefined,
-						internalNames: new Map(),
-						globalExports: new Set(),
-						exportMap: exportMap,
-						reexportMap: reexportMap,
-						hasNamespaceObject: false,
-						namespaceObjectSource: null
-					};
-				}
-				case "external":
-					return {
-						type: "external",
-						module: info.module,
-						index: idx,
-						name: undefined,
-						interopNamespaceObjectUsed: false,
-						interopNamespaceObjectName: undefined,
-						interopDefaultAccessUsed: false,
-						interopDefaultAccessName: undefined
-					};
-				default:
-					throw new Error(`Unsupported concatenation entry type ${info.type}`);
-			}
-		});
-
-		// Create mapping from module to info
-		const moduleToInfoMap = new Map();
-		for (const m of modulesWithInfo) {
-			moduleToInfoMap.set(m.module, m);
+	/**
+	 * @param {LazySet} fileDependencies set where file dependencies are added to
+	 * @param {LazySet} contextDependencies set where context dependencies are added to
+	 * @param {LazySet} missingDependencies set where missing dependencies are added to
+	 * @param {LazySet} buildDependencies set where build dependencies are added to
+	 */
+	addCacheDependencies(
+		fileDependencies,
+		contextDependencies,
+		missingDependencies,
+		buildDependencies
+	) {
+		for (const module of this._modules) {
+			module.addCacheDependencies(
+				fileDependencies,
+				contextDependencies,
+				missingDependencies,
+				buildDependencies
+			);
 		}
+	}
 
-		// Configure template decorators for dependencies
-		const innerDependencyTemplates = new Map(dependencyTemplates);
+	/**
+	 * @param {CodeGenerationContext} context context for code generation
+	 * @returns {CodeGenerationResult} result
+	 */
+	codeGeneration({
+		dependencyTemplates,
+		runtimeTemplate,
+		moduleGraph,
+		chunkGraph,
+		runtime: generationRuntime,
+		codeGenerationResults
+	}) {
+		/** @type {RuntimeRequirements} */
+		const runtimeRequirements = new Set();
+		const runtime = intersectRuntime(generationRuntime, this._runtime);
 
-		innerDependencyTemplates.set(
-			HarmonyImportSpecifierDependency,
-			new HarmonyImportSpecifierDependencyConcatenatedTemplate(
-				dependencyTemplates.get(HarmonyImportSpecifierDependency),
-				moduleToInfoMap
-			)
-		);
-		innerDependencyTemplates.set(
-			HarmonyImportSideEffectDependency,
-			new HarmonyImportSideEffectDependencyConcatenatedTemplate(
-				dependencyTemplates.get(HarmonyImportSideEffectDependency),
-				moduleToInfoMap
-			)
-		);
-		innerDependencyTemplates.set(
-			HarmonyExportSpecifierDependency,
-			new HarmonyExportSpecifierDependencyConcatenatedTemplate(
-				dependencyTemplates.get(HarmonyExportSpecifierDependency),
-				this.rootModule
-			)
-		);
-		innerDependencyTemplates.set(
-			HarmonyExportExpressionDependency,
-			new HarmonyExportExpressionDependencyConcatenatedTemplate(
-				dependencyTemplates.get(HarmonyExportExpressionDependency),
-				this.rootModule
-			)
-		);
-		innerDependencyTemplates.set(
-			HarmonyExportImportedSpecifierDependency,
-			new HarmonyExportImportedSpecifierDependencyConcatenatedTemplate(
-				dependencyTemplates.get(HarmonyExportImportedSpecifierDependency),
-				this.rootModule,
-				moduleToInfoMap
-			)
-		);
-		innerDependencyTemplates.set(
-			HarmonyCompatibilityDependency,
-			new HarmonyCompatibilityDependencyConcatenatedTemplate(
-				dependencyTemplates.get(HarmonyCompatibilityDependency),
-				this.rootModule,
-				moduleToInfoMap
-			)
+		const requestShortener = runtimeTemplate.requestShortener;
+		// Meta info for each module
+		const [modulesWithInfo, moduleToInfoMap] = this._getModulesWithInfo(
+			moduleGraph,
+			runtime
 		);
 
-		// Must use full identifier in our cache here to ensure that the source
-		// is updated should our dependencies list change.
-		// TODO webpack 5 refactor
-		innerDependencyTemplates.set(
-			"hash",
-			innerDependencyTemplates.get("hash") + this.identifier()
-		);
+		// Set with modules that need a generated namespace object
+		/** @type {Set} */
+		const neededNamespaceObjects = new Set();
 
 		// Generate source code and analyse scopes
 		// Prepare a ReplaceSource for the final source
-		for (const info of modulesWithInfo) {
-			if (info.type === "concatenated") {
-				const m = info.module;
-				const source = m.source(innerDependencyTemplates, runtimeTemplate);
-				const code = source.source();
-				let ast;
-				try {
-					ast = Parser.parse(code, {
-						sourceType: "module"
-					});
-				} catch (err) {
-					if (
-						err.loc &&
-						typeof err.loc === "object" &&
-						typeof err.loc.line === "number"
-					) {
-						const lineNumber = err.loc.line;
-						const lines = code.split("\n");
-						err.message +=
-							"\n| " +
-							lines
-								.slice(Math.max(0, lineNumber - 3), lineNumber + 2)
-								.join("\n| ");
-					}
-					throw err;
-				}
-				const scopeManager = eslintScope.analyze(ast, {
-					ecmaVersion: 6,
-					sourceType: "module",
-					optimistic: true,
-					ignoreEval: true,
-					impliedStrict: true
-				});
-				const globalScope = scopeManager.acquire(ast);
-				const moduleScope = globalScope.childScopes[0];
-				const resultSource = new ReplaceSource(source);
-				info.ast = ast;
-				info.internalSource = source;
-				info.source = resultSource;
-				info.globalScope = globalScope;
-				info.moduleScope = moduleScope;
-			}
+		for (const info of moduleToInfoMap.values()) {
+			this._analyseModule(
+				moduleToInfoMap,
+				info,
+				dependencyTemplates,
+				runtimeTemplate,
+				moduleGraph,
+				chunkGraph,
+				runtime,
+				/** @type {CodeGenerationResults} */
+				(codeGenerationResults)
+			);
 		}
 
 		// List of all used names to avoid conflicts
-		const allUsedNames = new Set([
-			"__WEBPACK_MODULE_DEFAULT_EXPORT__", // avoid using this internal name
-
-			"abstract",
-			"arguments",
-			"async",
-			"await",
-			"boolean",
-			"break",
-			"byte",
-			"case",
-			"catch",
-			"char",
-			"class",
-			"const",
-			"continue",
-			"debugger",
-			"default",
-			"delete",
-			"do",
-			"double",
-			"else",
-			"enum",
-			"eval",
-			"export",
-			"extends",
-			"false",
-			"final",
-			"finally",
-			"float",
-			"for",
-			"function",
-			"goto",
-			"if",
-			"implements",
-			"import",
-			"in",
-			"instanceof",
-			"int",
-			"interface",
-			"let",
-			"long",
-			"native",
-			"new",
-			"null",
-			"package",
-			"private",
-			"protected",
-			"public",
-			"return",
-			"short",
-			"static",
-			"super",
-			"switch",
-			"synchronized",
-			"this",
-			"throw",
-			"throws",
-			"transient",
-			"true",
-			"try",
-			"typeof",
-			"var",
-			"void",
-			"volatile",
-			"while",
-			"with",
-			"yield",
-
-			"module",
-			"__dirname",
-			"__filename",
-			"exports",
-
-			"Array",
-			"Date",
-			"eval",
-			"function",
-			"hasOwnProperty",
-			"Infinity",
-			"isFinite",
-			"isNaN",
-			"isPrototypeOf",
-			"length",
-			"Math",
-			"NaN",
-			"name",
-			"Number",
-			"Object",
-			"prototype",
-			"String",
-			"toString",
-			"undefined",
-			"valueOf",
-
-			"alert",
-			"all",
-			"anchor",
-			"anchors",
-			"area",
-			"assign",
-			"blur",
-			"button",
-			"checkbox",
-			"clearInterval",
-			"clearTimeout",
-			"clientInformation",
-			"close",
-			"closed",
-			"confirm",
-			"constructor",
-			"crypto",
-			"decodeURI",
-			"decodeURIComponent",
-			"defaultStatus",
-			"document",
-			"element",
-			"elements",
-			"embed",
-			"embeds",
-			"encodeURI",
-			"encodeURIComponent",
-			"escape",
-			"event",
-			"fileUpload",
-			"focus",
-			"form",
-			"forms",
-			"frame",
-			"innerHeight",
-			"innerWidth",
-			"layer",
-			"layers",
-			"link",
-			"location",
-			"mimeTypes",
-			"navigate",
-			"navigator",
-			"frames",
-			"frameRate",
-			"hidden",
-			"history",
-			"image",
-			"images",
-			"offscreenBuffering",
-			"open",
-			"opener",
-			"option",
-			"outerHeight",
-			"outerWidth",
-			"packages",
-			"pageXOffset",
-			"pageYOffset",
-			"parent",
-			"parseFloat",
-			"parseInt",
-			"password",
-			"pkcs11",
-			"plugin",
-			"prompt",
-			"propertyIsEnum",
-			"radio",
-			"reset",
-			"screenX",
-			"screenY",
-			"scroll",
-			"secure",
-			"select",
-			"self",
-			"setInterval",
-			"setTimeout",
-			"status",
-			"submit",
-			"taint",
-			"text",
-			"textarea",
-			"top",
-			"unescape",
-			"untaint",
-			"window",
-
-			"onblur",
-			"onclick",
-			"onerror",
-			"onfocus",
-			"onkeydown",
-			"onkeypress",
-			"onkeyup",
-			"onmouseover",
-			"onload",
-			"onmouseup",
-			"onmousedown",
-			"onsubmit"
-		]);
+		const allUsedNames = new Set(RESERVED_NAMES);
+		// Updated Top level declarations are created by renaming
+		const topLevelDeclarations = new Set();
+
+		// List of additional names in scope for module references
+		/** @type {Map} */
+		const usedNamesInScopeInfo = new Map();
 
 		// Set of already checked scopes
-		const alreadyCheckedScopes = new Set();
+		const ignoredScopes = new Set();
 
 		// get all global names
 		for (const info of modulesWithInfo) {
-			const superClassExpressions = [];
-
-			// ignore symbols from moduleScope
-			if (info.moduleScope) {
-				alreadyCheckedScopes.add(info.moduleScope);
+			if (info.type === "concatenated") {
+				// ignore symbols from moduleScope
+				if (info.moduleScope) {
+					ignoredScopes.add(info.moduleScope);
+				}
 
 				// The super class expression in class scopes behaves weird
-				// We store ranges of all super class expressions to make
+				// We get ranges of all super class expressions to make
 				// renaming to work correctly
-				for (const childScope of info.moduleScope.childScopes) {
-					if (childScope.type !== "class") continue;
-					if (!childScope.block.superClass) continue;
-					superClassExpressions.push({
-						range: childScope.block.superClass.range,
-						variables: childScope.variables
-					});
-				}
-			}
-
-			// add global symbols
-			if (info.globalScope) {
-				for (const reference of info.globalScope.through) {
-					const name = reference.identifier.name;
-					if (
-						/^__WEBPACK_MODULE_REFERENCE__\d+_([\da-f]+|ns)(_call)?(_strict)?__$/.test(
-							name
-						)
-					) {
-						for (const expr of superClassExpressions) {
-							if (
-								expr.range[0] <= reference.identifier.range[0] &&
-								expr.range[1] >= reference.identifier.range[1]
-							) {
-								for (const variable of expr.variables) {
-									allUsedNames.add(variable.name);
-								}
-							}
+				const superClassCache = new WeakMap();
+				/**
+				 * @param {Scope} scope scope
+				 * @returns {{ range: Range, variables: Variable[] }[]} result
+				 */
+				const getSuperClassExpressions = scope => {
+					const cacheEntry = superClassCache.get(scope);
+					if (cacheEntry !== undefined) return cacheEntry;
+					const superClassExpressions = [];
+					for (const childScope of scope.childScopes) {
+						if (childScope.type !== "class") continue;
+						const block = childScope.block;
+						if (
+							(block.type === "ClassDeclaration" ||
+								block.type === "ClassExpression") &&
+							block.superClass
+						) {
+							superClassExpressions.push({
+								range: /** @type {Range} */ (block.superClass.range),
+								variables: childScope.variables
+							});
 						}
-						addScopeSymbols1(
-							reference.from,
-							allUsedNames,
-							alreadyCheckedScopes
-						);
-					} else {
-						allUsedNames.add(name);
 					}
-				}
-			}
+					superClassCache.set(scope, superClassExpressions);
+					return superClassExpressions;
+				};
 
-			// add exported globals
-			if (info.type === "concatenated") {
-				const variables = new Set();
-				for (const variable of info.moduleScope.variables) {
-					variables.add(variable.name);
-				}
-				for (const [, variable] of info.exportMap) {
-					if (!variables.has(variable)) {
-						info.globalExports.add(variable);
+				// add global symbols
+				if (info.globalScope) {
+					for (const reference of info.globalScope.through) {
+						const name = reference.identifier.name;
+						if (ConcatenationScope.isModuleReference(name)) {
+							const match = ConcatenationScope.matchModuleReference(name);
+							if (!match) continue;
+							const referencedInfo = modulesWithInfo[match.index];
+							if (referencedInfo.type === "reference")
+								throw new Error("Module reference can't point to a reference");
+							const binding = getFinalBinding(
+								moduleGraph,
+								referencedInfo,
+								match.ids,
+								moduleToInfoMap,
+								runtime,
+								requestShortener,
+								runtimeTemplate,
+								neededNamespaceObjects,
+								false,
+								/** @type {BuildMeta} */
+								(info.module.buildMeta).strictHarmonyModule,
+								true
+							);
+							if (!binding.ids) continue;
+							const { usedNames, alreadyCheckedScopes } =
+								getUsedNamesInScopeInfo(
+									usedNamesInScopeInfo,
+									binding.info.module.identifier(),
+									"name" in binding ? binding.name : ""
+								);
+							for (const expr of getSuperClassExpressions(reference.from)) {
+								if (
+									expr.range[0] <=
+										/** @type {Range} */ (reference.identifier.range)[0] &&
+									expr.range[1] >=
+										/** @type {Range} */ (reference.identifier.range)[1]
+								) {
+									for (const variable of expr.variables) {
+										usedNames.add(variable.name);
+									}
+								}
+							}
+							addScopeSymbols(
+								reference.from,
+								usedNames,
+								alreadyCheckedScopes,
+								ignoredScopes
+							);
+						} else {
+							allUsedNames.add(name);
+						}
 					}
 				}
 			}
 		}
 
 		// generate names for symbols
-		for (const info of modulesWithInfo) {
+		for (const info of moduleToInfoMap.values()) {
+			const { usedNames: namespaceObjectUsedNames } = getUsedNamesInScopeInfo(
+				usedNamesInScopeInfo,
+				info.module.identifier(),
+				""
+			);
 			switch (info.type) {
 				case "concatenated": {
-					const namespaceObjectName = this.findNewName(
-						"namespaceObject",
-						allUsedNames,
-						null,
-						info.module.readableIdentifier(requestShortener)
-					);
-					allUsedNames.add(namespaceObjectName);
-					info.internalNames.set(namespaceObjectName, namespaceObjectName);
-					info.exportMap.set(true, namespaceObjectName);
-					for (const variable of info.moduleScope.variables) {
+					const variables = /** @type {Scope} */ (info.moduleScope).variables;
+					for (const variable of variables) {
 						const name = variable.name;
-						if (allUsedNames.has(name)) {
+						const { usedNames, alreadyCheckedScopes } = getUsedNamesInScopeInfo(
+							usedNamesInScopeInfo,
+							info.module.identifier(),
+							name
+						);
+						if (allUsedNames.has(name) || usedNames.has(name)) {
 							const references = getAllReferences(variable);
-							const symbolsInReferences = new Set();
-							const alreadyCheckedInnerScopes = new Set();
 							for (const ref of references) {
-								addScopeSymbols2(
+								addScopeSymbols(
 									ref.from,
-									symbolsInReferences,
-									alreadyCheckedInnerScopes,
-									alreadyCheckedScopes
+									usedNames,
+									alreadyCheckedScopes,
+									ignoredScopes
 								);
 							}
-							const newName = this.findNewName(
+							const newName = findNewName(
 								name,
 								allUsedNames,
-								symbolsInReferences,
+								usedNames,
 								info.module.readableIdentifier(requestShortener)
 							);
 							allUsedNames.add(newName);
 							info.internalNames.set(name, newName);
-							const source = info.source;
+							topLevelDeclarations.add(newName);
+							const source = /** @type {ReplaceSource} */ (info.source);
 							const allIdentifiers = new Set(
 								references.map(r => r.identifier).concat(variable.identifiers)
 							);
 							for (const identifier of allIdentifiers) {
-								const r = identifier.range;
-								const path = getPathInAst(info.ast, identifier);
-								if (
-									path &&
-									path.length > 1 &&
-									path[1].type === "Property" &&
-									path[1].shorthand
-								) {
-									source.insert(r[1], `: ${newName}`);
-								} else {
-									source.replace(r[0], r[1] - 1, newName);
+								const r = /** @type {Range} */ (identifier.range);
+								const path = getPathInAst(
+									/** @type {NonNullable} */
+									(info.ast),
+									identifier
+								);
+								if (path && path.length > 1) {
+									const maybeProperty =
+										path[1].type === "AssignmentPattern" &&
+										path[1].left === path[0]
+											? path[2]
+											: path[1];
+									if (
+										maybeProperty.type === "Property" &&
+										maybeProperty.shorthand
+									) {
+										source.insert(r[1], `: ${newName}`);
+										continue;
+									}
 								}
+								source.replace(r[0], r[1] - 1, newName);
 							}
 						} else {
 							allUsedNames.add(name);
 							info.internalNames.set(name, name);
+							topLevelDeclarations.add(name);
 						}
 					}
+					let namespaceObjectName;
+					if (info.namespaceExportSymbol) {
+						namespaceObjectName = info.internalNames.get(
+							info.namespaceExportSymbol
+						);
+					} else {
+						namespaceObjectName = findNewName(
+							"namespaceObject",
+							allUsedNames,
+							namespaceObjectUsedNames,
+							info.module.readableIdentifier(requestShortener)
+						);
+						allUsedNames.add(namespaceObjectName);
+					}
+					info.namespaceObjectName =
+						/** @type {string} */
+						(namespaceObjectName);
+					topLevelDeclarations.add(namespaceObjectName);
 					break;
 				}
 				case "external": {
-					const externalName = this.findNewName(
+					const externalName = findNewName(
 						"",
 						allUsedNames,
-						null,
+						namespaceObjectUsedNames,
 						info.module.readableIdentifier(requestShortener)
 					);
 					allUsedNames.add(externalName);
 					info.name = externalName;
-					if (
-						info.module.buildMeta.exportsType === "named" ||
-						!info.module.buildMeta.exportsType
-					) {
-						const externalNameInterop = this.findNewName(
-							"namespaceObject",
-							allUsedNames,
-							null,
-							info.module.readableIdentifier(requestShortener)
-						);
-						allUsedNames.add(externalNameInterop);
-						info.interopNamespaceObjectName = externalNameInterop;
-					}
-					if (!info.module.buildMeta.exportsType) {
-						const externalNameInterop = this.findNewName(
-							"default",
-							allUsedNames,
-							null,
-							info.module.readableIdentifier(requestShortener)
-						);
-						allUsedNames.add(externalNameInterop);
-						info.interopDefaultAccessName = externalNameInterop;
-					}
+					topLevelDeclarations.add(externalName);
 					break;
 				}
 			}
+			const buildMeta = /** @type {BuildMeta} */ (info.module.buildMeta);
+			if (buildMeta.exportsType !== "namespace") {
+				const externalNameInterop = findNewName(
+					"namespaceObject",
+					allUsedNames,
+					namespaceObjectUsedNames,
+					info.module.readableIdentifier(requestShortener)
+				);
+				allUsedNames.add(externalNameInterop);
+				info.interopNamespaceObjectName = externalNameInterop;
+				topLevelDeclarations.add(externalNameInterop);
+			}
+			if (
+				buildMeta.exportsType === "default" &&
+				buildMeta.defaultObject !== "redirect"
+			) {
+				const externalNameInterop = findNewName(
+					"namespaceObject2",
+					allUsedNames,
+					namespaceObjectUsedNames,
+					info.module.readableIdentifier(requestShortener)
+				);
+				allUsedNames.add(externalNameInterop);
+				info.interopNamespaceObject2Name = externalNameInterop;
+				topLevelDeclarations.add(externalNameInterop);
+			}
+			if (buildMeta.exportsType === "dynamic" || !buildMeta.exportsType) {
+				const externalNameInterop = findNewName(
+					"default",
+					allUsedNames,
+					namespaceObjectUsedNames,
+					info.module.readableIdentifier(requestShortener)
+				);
+				allUsedNames.add(externalNameInterop);
+				info.interopDefaultAccessName = externalNameInterop;
+				topLevelDeclarations.add(externalNameInterop);
+			}
 		}
 
-		// Find and replace referenced to modules
-		for (const info of modulesWithInfo) {
+		// Find and replace references to modules
+		for (const info of moduleToInfoMap.values()) {
 			if (info.type === "concatenated") {
-				for (const reference of info.globalScope.through) {
+				const globalScope = /** @type {Scope} */ (info.globalScope);
+				for (const reference of globalScope.through) {
 					const name = reference.identifier.name;
-					const match = /^__WEBPACK_MODULE_REFERENCE__(\d+)_([\da-f]+|ns)(_call)?(_strict)?__$/.exec(
-						name
-					);
+					const match = ConcatenationScope.matchModuleReference(name);
 					if (match) {
-						const referencedModule = modulesWithInfo[+match[1]];
-						let exportName;
-						if (match[2] === "ns") {
-							exportName = true;
-						} else {
-							const exportData = match[2];
-							exportName = Buffer.from(exportData, "hex").toString("utf-8");
-						}
-						const asCall = !!match[3];
-						const strictHarmonyModule = !!match[4];
+						const referencedInfo = modulesWithInfo[match.index];
+						if (referencedInfo.type === "reference")
+							throw new Error("Module reference can't point to a reference");
 						const finalName = getFinalName(
-							referencedModule,
-							exportName,
+							moduleGraph,
+							referencedInfo,
+							match.ids,
 							moduleToInfoMap,
+							runtime,
 							requestShortener,
-							asCall,
-							strictHarmonyModule
+							runtimeTemplate,
+							neededNamespaceObjects,
+							match.call,
+							!match.directImport,
+							/** @type {BuildMeta} */
+							(info.module.buildMeta).strictHarmonyModule,
+							match.asiSafe
 						);
-						const r = reference.identifier.range;
-						const source = info.source;
-						source.replace(r[0], r[1] - 1, finalName);
+						const r = /** @type {Range} */ (reference.identifier.range);
+						const source = /** @type {ReplaceSource} */ (info.source);
+						// range is extended by 2 chars to cover the appended "._"
+						source.replace(r[0], r[1] + 1, finalName);
 					}
 				}
 			}
 		}
 
+		// Map with all root exposed used exports
+		/** @type {Map string>} */
+		const exportsMap = new Map();
+
+		// Set with all root exposed unused exports
+		/** @type {Set} */
+		const unusedExports = new Set();
+
+		const rootInfo =
+			/** @type {ConcatenatedModuleInfo} */
+			(moduleToInfoMap.get(this.rootModule));
+		const strictHarmonyModule =
+			/** @type {BuildMeta} */
+			(rootInfo.module.buildMeta).strictHarmonyModule;
+		const exportsInfo = moduleGraph.getExportsInfo(rootInfo.module);
+		/** @type {Record} */
+		const exportsFinalName = {};
+		for (const exportInfo of exportsInfo.orderedExports) {
+			const name = exportInfo.name;
+			if (exportInfo.provided === false) continue;
+			const used = exportInfo.getUsedName(undefined, runtime);
+			if (!used) {
+				unusedExports.add(name);
+				continue;
+			}
+			exportsMap.set(used, requestShortener => {
+				try {
+					const finalName = getFinalName(
+						moduleGraph,
+						rootInfo,
+						[name],
+						moduleToInfoMap,
+						runtime,
+						requestShortener,
+						runtimeTemplate,
+						neededNamespaceObjects,
+						false,
+						false,
+						strictHarmonyModule,
+						true
+					);
+					exportsFinalName[used] = finalName;
+					return `/* ${
+						exportInfo.isReexport() ? "reexport" : "binding"
+					} */ ${finalName}`;
+				} catch (err) {
+					/** @type {Error} */
+					(err).message +=
+						`\nwhile generating the root export '${name}' (used name: '${used}')`;
+					throw err;
+				}
+			});
+		}
+
 		const result = new ConcatSource();
 
 		// add harmony compatibility flag (must be first because of possible circular dependencies)
-		const usedExports = this.rootModule.usedExports;
-		if (usedExports === true || usedExports === null) {
+		let shouldAddHarmonyFlag = false;
+		if (
+			moduleGraph.getExportsInfo(this).otherExportsInfo.getUsed(runtime) !==
+			UsageState.Unused
+		) {
+			shouldAddHarmonyFlag = true;
+		}
+
+		// define exports
+		if (exportsMap.size > 0) {
+			const { exportsDefinitions } = ConcatenatedModule.getCompilationHooks(
+				/** @type {Compilation} */
+				(this.compilation)
+			);
+
+			const definitions = [];
+			for (const [key, value] of exportsMap) {
+				definitions.push(
+					`\n  ${propertyName(key)}: ${runtimeTemplate.returningFunction(
+						value(requestShortener)
+					)}`
+				);
+			}
+
+			const shouldSkipRenderDefinitions = exportsDefinitions.call(
+				exportsFinalName,
+				this
+			);
+
+			if (!shouldSkipRenderDefinitions) {
+				runtimeRequirements.add(RuntimeGlobals.exports);
+				runtimeRequirements.add(RuntimeGlobals.definePropertyGetters);
+
+				if (shouldAddHarmonyFlag) {
+					result.add("// ESM COMPAT FLAG\n");
+					result.add(
+						runtimeTemplate.defineEsModuleFlagStatement({
+							exportsArgument: this.exportsArgument,
+							runtimeRequirements
+						})
+					);
+				}
+
+				result.add("\n// EXPORTS\n");
+				result.add(
+					`${RuntimeGlobals.definePropertyGetters}(${
+						this.exportsArgument
+					}, {${definitions.join(",")}\n});\n`
+				);
+			} else {
+				/** @type {BuildMeta} */
+				(this.buildMeta).exportsFinalName = exportsFinalName;
+			}
+		}
+
+		// list unused exports
+		if (unusedExports.size > 0) {
 			result.add(
-				runtimeTemplate.defineEsModuleFlagStatement({
-					exportsArgument: this.exportsArgument
-				})
+				`\n// UNUSED EXPORTS: ${joinIterableWithComma(unusedExports)}\n`
+			);
+		}
+
+		// generate namespace objects
+		const namespaceObjectSources = new Map();
+		for (const info of neededNamespaceObjects) {
+			if (info.namespaceExportSymbol) continue;
+			const nsObj = [];
+			const exportsInfo = moduleGraph.getExportsInfo(info.module);
+			for (const exportInfo of exportsInfo.orderedExports) {
+				if (exportInfo.provided === false) continue;
+				const usedName = exportInfo.getUsedName(undefined, runtime);
+				if (usedName) {
+					const finalName = getFinalName(
+						moduleGraph,
+						info,
+						[exportInfo.name],
+						moduleToInfoMap,
+						runtime,
+						requestShortener,
+						runtimeTemplate,
+						neededNamespaceObjects,
+						false,
+						undefined,
+						/** @type {BuildMeta} */
+						(info.module.buildMeta).strictHarmonyModule,
+						true
+					);
+					nsObj.push(
+						`\n  ${propertyName(usedName)}: ${runtimeTemplate.returningFunction(
+							finalName
+						)}`
+					);
+				}
+			}
+			const name = info.namespaceObjectName;
+			const defineGetters =
+				nsObj.length > 0
+					? `${RuntimeGlobals.definePropertyGetters}(${name}, {${nsObj.join(
+							","
+						)}\n});\n`
+					: "";
+			if (nsObj.length > 0)
+				runtimeRequirements.add(RuntimeGlobals.definePropertyGetters);
+			namespaceObjectSources.set(
+				info,
+				`
+// NAMESPACE OBJECT: ${info.module.readableIdentifier(requestShortener)}
+var ${name} = {};
+${RuntimeGlobals.makeNamespaceObject}(${name});
+${defineGetters}`
 			);
+			runtimeRequirements.add(RuntimeGlobals.makeNamespaceObject);
 		}
 
 		// define required namespace objects (must be before evaluation modules)
 		for (const info of modulesWithInfo) {
-			if (info.namespaceObjectSource) {
-				result.add(info.namespaceObjectSource);
+			if (info.type === "concatenated") {
+				const source = namespaceObjectSources.get(info);
+				if (!source) continue;
+				result.add(source);
 			}
 		}
 
+		const chunkInitFragments = [];
+
 		// evaluate modules in order
-		for (const info of modulesWithInfo) {
+		for (const rawInfo of modulesWithInfo) {
+			let name;
+			let isConditional = false;
+			const info = rawInfo.type === "reference" ? rawInfo.target : rawInfo;
 			switch (info.type) {
-				case "concatenated":
+				case "concatenated": {
 					result.add(
-						`\n// CONCATENATED MODULE: ${info.module.readableIdentifier(
-							requestShortener
-						)}\n`
+						`\n;// ${info.module.readableIdentifier(requestShortener)}\n`
 					);
-					result.add(info.source);
+					result.add(/** @type {ReplaceSource} */ (info.source));
+					if (info.chunkInitFragments) {
+						for (const f of info.chunkInitFragments) chunkInitFragments.push(f);
+					}
+					if (info.runtimeRequirements) {
+						for (const r of info.runtimeRequirements) {
+							runtimeRequirements.add(r);
+						}
+					}
+					name = info.namespaceObjectName;
 					break;
-				case "external":
+				}
+				case "external": {
 					result.add(
 						`\n// EXTERNAL MODULE: ${info.module.readableIdentifier(
 							requestShortener
 						)}\n`
 					);
+					runtimeRequirements.add(RuntimeGlobals.require);
+					const { runtimeCondition } =
+						/** @type {ExternalModuleInfo | ReferenceToModuleInfo} */
+						(rawInfo);
+					const condition = runtimeTemplate.runtimeConditionExpression({
+						chunkGraph,
+						runtimeCondition,
+						runtime,
+						runtimeRequirements
+					});
+					if (condition !== "true") {
+						isConditional = true;
+						result.add(`if (${condition}) {\n`);
+					}
 					result.add(
-						`var ${info.name} = __webpack_require__(${JSON.stringify(
-							info.module.id
-						)});\n`
+						`var ${info.name} = ${RuntimeGlobals.require}(${JSON.stringify(
+							chunkGraph.getModuleId(info.module)
+						)});`
 					);
-					if (info.interopNamespaceObjectUsed) {
-						if (info.module.buildMeta.exportsType === "named") {
-							result.add(
-								`var ${
-									info.interopNamespaceObjectName
-								} = /*#__PURE__*/__webpack_require__.t(${info.name}, 2);\n`
-							);
-						} else if (!info.module.buildMeta.exportsType) {
-							result.add(
-								`var ${
-									info.interopNamespaceObjectName
-								} = /*#__PURE__*/__webpack_require__.t(${info.name});\n`
-							);
-						}
-					}
-					if (info.interopDefaultAccessUsed) {
-						result.add(
-							`var ${
-								info.interopDefaultAccessName
-							} = /*#__PURE__*/__webpack_require__.n(${info.name});\n`
-						);
-					}
+					name = info.name;
 					break;
+				}
 				default:
+					// @ts-expect-error never is expected here
 					throw new Error(`Unsupported concatenation entry type ${info.type}`);
 			}
+			if (info.interopNamespaceObjectUsed) {
+				runtimeRequirements.add(RuntimeGlobals.createFakeNamespaceObject);
+				result.add(
+					`\nvar ${info.interopNamespaceObjectName} = /*#__PURE__*/${RuntimeGlobals.createFakeNamespaceObject}(${name}, 2);`
+				);
+			}
+			if (info.interopNamespaceObject2Used) {
+				runtimeRequirements.add(RuntimeGlobals.createFakeNamespaceObject);
+				result.add(
+					`\nvar ${info.interopNamespaceObject2Name} = /*#__PURE__*/${RuntimeGlobals.createFakeNamespaceObject}(${name});`
+				);
+			}
+			if (info.interopDefaultAccessUsed) {
+				runtimeRequirements.add(RuntimeGlobals.compatGetDefaultExport);
+				result.add(
+					`\nvar ${info.interopDefaultAccessName} = /*#__PURE__*/${RuntimeGlobals.compatGetDefaultExport}(${name});`
+				);
+			}
+			if (isConditional) {
+				result.add("\n}");
+			}
 		}
 
-		return result;
-	}
-
-	findNewName(oldName, usedNamed1, usedNamed2, extraInfo) {
-		let name = oldName;
+		const data = new Map();
+		if (chunkInitFragments.length > 0)
+			data.set("chunkInitFragments", chunkInitFragments);
+		data.set("topLevelDeclarations", topLevelDeclarations);
 
-		if (name === "__WEBPACK_MODULE_DEFAULT_EXPORT__") name = "";
+		/** @type {CodeGenerationResult} */
+		const resultEntry = {
+			sources: new Map([["javascript", new CachedSource(result)]]),
+			data,
+			runtimeRequirements
+		};
 
-		// Remove uncool stuff
-		extraInfo = extraInfo.replace(
-			/\.+\/|(\/index)?\.([a-zA-Z0-9]{1,4})($|\s|\?)|\s*\+\s*\d+\s*modules/g,
-			""
-		);
+		return resultEntry;
+	}
 
-		const splittedInfo = extraInfo.split("/");
-		while (splittedInfo.length) {
-			name = splittedInfo.pop() + (name ? "_" + name : "");
-			const nameIdent = Template.toIdentifier(name);
-			if (
-				!usedNamed1.has(nameIdent) &&
-				(!usedNamed2 || !usedNamed2.has(nameIdent))
-			)
-				return nameIdent;
+	/**
+	 * @param {Map} modulesMap modulesMap
+	 * @param {ModuleInfo} info info
+	 * @param {DependencyTemplates} dependencyTemplates dependencyTemplates
+	 * @param {RuntimeTemplate} runtimeTemplate runtimeTemplate
+	 * @param {ModuleGraph} moduleGraph moduleGraph
+	 * @param {ChunkGraph} chunkGraph chunkGraph
+	 * @param {RuntimeSpec} runtime runtime
+	 * @param {CodeGenerationResults} codeGenerationResults codeGenerationResults
+	 */
+	_analyseModule(
+		modulesMap,
+		info,
+		dependencyTemplates,
+		runtimeTemplate,
+		moduleGraph,
+		chunkGraph,
+		runtime,
+		codeGenerationResults
+	) {
+		if (info.type === "concatenated") {
+			const m = info.module;
+			try {
+				// Create a concatenation scope to track and capture information
+				const concatenationScope = new ConcatenationScope(modulesMap, info);
+
+				// TODO cache codeGeneration results
+				const codeGenResult = m.codeGeneration({
+					dependencyTemplates,
+					runtimeTemplate,
+					moduleGraph,
+					chunkGraph,
+					runtime,
+					concatenationScope,
+					codeGenerationResults,
+					sourceTypes: JS_TYPES
+				});
+				const source =
+					/** @type {Source} */
+					(codeGenResult.sources.get("javascript"));
+				const data = codeGenResult.data;
+				const chunkInitFragments = data && data.get("chunkInitFragments");
+				const code = source.source().toString();
+				let ast;
+				try {
+					ast = JavascriptParser._parse(code, {
+						sourceType: "module"
+					});
+				} catch (_err) {
+					const err =
+						/** @type {Error & { loc?: { line: number, column: number } }} */
+						(_err);
+					if (
+						err.loc &&
+						typeof err.loc === "object" &&
+						typeof err.loc.line === "number"
+					) {
+						const lineNumber = err.loc.line;
+						const lines = code.split("\n");
+						err.message += `\n| ${lines
+							.slice(Math.max(0, lineNumber - 3), lineNumber + 2)
+							.join("\n| ")}`;
+					}
+					throw err;
+				}
+				const scopeManager = eslintScope.analyze(ast, {
+					ecmaVersion: 6,
+					sourceType: "module",
+					optimistic: true,
+					ignoreEval: true,
+					impliedStrict: true
+				});
+				const globalScope = /** @type {Scope} */ (scopeManager.acquire(ast));
+				const moduleScope = globalScope.childScopes[0];
+				const resultSource = new ReplaceSource(source);
+				info.runtimeRequirements =
+					/** @type {ReadOnlyRuntimeRequirements} */
+					(codeGenResult.runtimeRequirements);
+				info.ast = ast;
+				info.internalSource = source;
+				info.source = resultSource;
+				info.chunkInitFragments = chunkInitFragments;
+				info.globalScope = globalScope;
+				info.moduleScope = moduleScope;
+			} catch (err) {
+				/** @type {Error} */
+				(err).message +=
+					`\nwhile analyzing module ${m.identifier()} for concatenation`;
+				throw err;
+			}
 		}
+	}
 
-		let i = 0;
-		let nameWithNumber = Template.toIdentifier(`${name}_${i}`);
-		while (
-			usedNamed1.has(nameWithNumber) ||
-			(usedNamed2 && usedNamed2.has(nameWithNumber))
-		) {
-			i++;
-			nameWithNumber = Template.toIdentifier(`${name}_${i}`);
-		}
-		return nameWithNumber;
+	/**
+	 * @param {ModuleGraph} moduleGraph the module graph
+	 * @param {RuntimeSpec} runtime the runtime
+	 * @returns {[ModuleInfoOrReference[], Map]} module info items
+	 */
+	_getModulesWithInfo(moduleGraph, runtime) {
+		const orderedConcatenationList = this._createConcatenationList(
+			this.rootModule,
+			this._modules,
+			runtime,
+			moduleGraph
+		);
+		/** @type {Map} */
+		const map = new Map();
+		const list = orderedConcatenationList.map((info, index) => {
+			let item = map.get(info.module);
+			if (item === undefined) {
+				switch (info.type) {
+					case "concatenated":
+						item = {
+							type: "concatenated",
+							module: info.module,
+							index,
+							ast: undefined,
+							internalSource: undefined,
+							runtimeRequirements: undefined,
+							source: undefined,
+							globalScope: undefined,
+							moduleScope: undefined,
+							internalNames: new Map(),
+							exportMap: undefined,
+							rawExportMap: undefined,
+							namespaceExportSymbol: undefined,
+							namespaceObjectName: undefined,
+							interopNamespaceObjectUsed: false,
+							interopNamespaceObjectName: undefined,
+							interopNamespaceObject2Used: false,
+							interopNamespaceObject2Name: undefined,
+							interopDefaultAccessUsed: false,
+							interopDefaultAccessName: undefined
+						};
+						break;
+					case "external":
+						item = {
+							type: "external",
+							module: info.module,
+							runtimeCondition: info.runtimeCondition,
+							index,
+							name: undefined,
+							interopNamespaceObjectUsed: false,
+							interopNamespaceObjectName: undefined,
+							interopNamespaceObject2Used: false,
+							interopNamespaceObject2Name: undefined,
+							interopDefaultAccessUsed: false,
+							interopDefaultAccessName: undefined
+						};
+						break;
+					default:
+						throw new Error(
+							`Unsupported concatenation entry type ${info.type}`
+						);
+				}
+				map.set(
+					/** @type {ModuleInfo} */ (item).module,
+					/** @type {ModuleInfo} */ (item)
+				);
+				return /** @type {ModuleInfo} */ (item);
+			}
+			/** @type {ReferenceToModuleInfo} */
+			const ref = {
+				type: "reference",
+				runtimeCondition: info.runtimeCondition,
+				target: item
+			};
+			return ref;
+		});
+		return [list, map];
 	}
 
 	/**
 	 * @param {Hash} hash the hash used to track dependencies
+	 * @param {UpdateHashContext} context context
 	 * @returns {void}
 	 */
-	updateHash(hash) {
-		for (const info of this._orderedConcatenationList) {
+	updateHash(hash, context) {
+		const { chunkGraph, runtime } = context;
+		for (const info of this._createConcatenationList(
+			this.rootModule,
+			this._modules,
+			intersectRuntime(runtime, this._runtime),
+			chunkGraph.moduleGraph
+		)) {
 			switch (info.type) {
 				case "concatenated":
-					info.module.updateHash(hash);
+					info.module.updateHash(hash, context);
 					break;
 				case "external":
-					hash.update(`${info.module.id}`);
+					hash.update(`${chunkGraph.getModuleId(info.module)}`);
+					// TODO runtimeCondition
 					break;
 			}
 		}
-		super.updateHash(hash);
-	}
-}
-
-class HarmonyImportSpecifierDependencyConcatenatedTemplate {
-	constructor(originalTemplate, modulesMap) {
-		this.originalTemplate = originalTemplate;
-		this.modulesMap = modulesMap;
-	}
-
-	getHarmonyInitOrder(dep) {
-		const module = dep._module;
-		const info = this.modulesMap.get(module);
-		if (!info) {
-			return this.originalTemplate.getHarmonyInitOrder(dep);
-		}
-		return NaN;
-	}
-
-	harmonyInit(dep, source, runtimeTemplate, dependencyTemplates) {
-		const module = dep._module;
-		const info = this.modulesMap.get(module);
-		if (!info) {
-			this.originalTemplate.harmonyInit(
-				dep,
-				source,
-				runtimeTemplate,
-				dependencyTemplates
-			);
-			return;
-		}
-	}
-
-	apply(dep, source, runtime, dependencyTemplates) {
-		const module = dep._module;
-		const info = this.modulesMap.get(module);
-		if (!info) {
-			this.originalTemplate.apply(dep, source, runtime, dependencyTemplates);
-			return;
-		}
-		let content;
-		const callFlag = dep.call ? "_call" : "";
-		const strictFlag = dep.originModule.buildMeta.strictHarmonyModule
-			? "_strict"
-			: "";
-		if (dep._id === null) {
-			content = `__WEBPACK_MODULE_REFERENCE__${info.index}_ns${strictFlag}__`;
-		} else if (dep.namespaceObjectAsContext) {
-			content = `__WEBPACK_MODULE_REFERENCE__${
-				info.index
-			}_ns${strictFlag}__[${JSON.stringify(dep._id)}]`;
-		} else {
-			const exportData = Buffer.from(dep._id, "utf-8").toString("hex");
-			content = `__WEBPACK_MODULE_REFERENCE__${
-				info.index
-			}_${exportData}${callFlag}${strictFlag}__`;
-		}
-		if (dep.shorthand) {
-			content = dep.name + ": " + content;
-		}
-		source.replace(dep.range[0], dep.range[1] - 1, content);
-	}
-}
-
-class HarmonyImportSideEffectDependencyConcatenatedTemplate {
-	constructor(originalTemplate, modulesMap) {
-		this.originalTemplate = originalTemplate;
-		this.modulesMap = modulesMap;
-	}
-
-	getHarmonyInitOrder(dep) {
-		const module = dep._module;
-		const info = this.modulesMap.get(module);
-		if (!info) {
-			return this.originalTemplate.getHarmonyInitOrder(dep);
-		}
-		return NaN;
-	}
-
-	harmonyInit(dep, source, runtime, dependencyTemplates) {
-		const module = dep._module;
-		const info = this.modulesMap.get(module);
-		if (!info) {
-			this.originalTemplate.harmonyInit(
-				dep,
-				source,
-				runtime,
-				dependencyTemplates
-			);
-			return;
-		}
-	}
-
-	apply(dep, source, runtime, dependencyTemplates) {
-		const module = dep._module;
-		const info = this.modulesMap.get(module);
-		if (!info) {
-			this.originalTemplate.apply(dep, source, runtime, dependencyTemplates);
-			return;
-		}
-	}
-}
-
-class HarmonyExportSpecifierDependencyConcatenatedTemplate {
-	constructor(originalTemplate, rootModule) {
-		this.originalTemplate = originalTemplate;
-		this.rootModule = rootModule;
-	}
-
-	getHarmonyInitOrder(dep) {
-		if (dep.originModule === this.rootModule) {
-			return this.originalTemplate.getHarmonyInitOrder(dep);
-		}
-		return NaN;
-	}
-
-	harmonyInit(dep, source, runtime, dependencyTemplates) {
-		if (dep.originModule === this.rootModule) {
-			this.originalTemplate.harmonyInit(
-				dep,
-				source,
-				runtime,
-				dependencyTemplates
-			);
-			return;
-		}
-	}
-
-	apply(dep, source, runtime, dependencyTemplates) {
-		if (dep.originModule === this.rootModule) {
-			this.originalTemplate.apply(dep, source, runtime, dependencyTemplates);
-		}
-	}
-}
-
-class HarmonyExportExpressionDependencyConcatenatedTemplate {
-	constructor(originalTemplate, rootModule) {
-		this.originalTemplate = originalTemplate;
-		this.rootModule = rootModule;
-	}
-
-	apply(dep, source, runtime, dependencyTemplates) {
-		let content =
-			"/* harmony default export */ var __WEBPACK_MODULE_DEFAULT_EXPORT__ = ";
-		if (dep.originModule === this.rootModule) {
-			const used = dep.originModule.isUsed("default");
-			const exportsName = dep.originModule.exportsArgument;
-			if (used) content += `${exportsName}[${JSON.stringify(used)}] = `;
-		}
-
-		if (dep.range) {
-			source.replace(
-				dep.rangeStatement[0],
-				dep.range[0] - 1,
-				content + "(" + dep.prefix
-			);
-			source.replace(dep.range[1], dep.rangeStatement[1] - 1, ");");
-			return;
-		}
-
-		source.replace(
-			dep.rangeStatement[0],
-			dep.rangeStatement[1] - 1,
-			content + dep.prefix
-		);
-	}
-}
-
-class HarmonyExportImportedSpecifierDependencyConcatenatedTemplate {
-	constructor(originalTemplate, rootModule, modulesMap) {
-		this.originalTemplate = originalTemplate;
-		this.rootModule = rootModule;
-		this.modulesMap = modulesMap;
-	}
-
-	getExports(dep) {
-		const importModule = dep._module;
-		if (dep.id) {
-			// export { named } from "module"
-			return [
-				{
-					name: dep.name,
-					id: dep.id,
-					module: importModule
-				}
-			];
-		}
-		if (dep.name) {
-			// export * as abc from "module"
-			return [
-				{
-					name: dep.name,
-					id: true,
-					module: importModule
-				}
-			];
-		}
-		// export * from "module"
-		return importModule.buildMeta.providedExports
-			.filter(exp => exp !== "default" && !dep.activeExports.has(exp))
-			.map(exp => {
-				return {
-					name: exp,
-					id: exp,
-					module: importModule
-				};
-			});
-	}
-
-	getHarmonyInitOrder(dep) {
-		const module = dep._module;
-		const info = this.modulesMap.get(module);
-		if (!info) {
-			return this.originalTemplate.getHarmonyInitOrder(dep);
-		}
-		return NaN;
-	}
-
-	harmonyInit(dep, source, runtime, dependencyTemplates) {
-		const module = dep._module;
-		const info = this.modulesMap.get(module);
-		if (!info) {
-			this.originalTemplate.harmonyInit(
-				dep,
-				source,
-				runtime,
-				dependencyTemplates
-			);
-			return;
-		}
+		super.updateHash(hash, context);
 	}
 
-	apply(dep, source, runtime, dependencyTemplates) {
-		if (dep.originModule === this.rootModule) {
-			if (this.modulesMap.get(dep._module)) {
-				const exportDefs = this.getExports(dep);
-				for (const def of exportDefs) {
-					const info = this.modulesMap.get(def.module);
-					const used = dep.originModule.isUsed(def.name);
-					if (!used) {
-						source.insert(
-							-1,
-							`/* unused concated harmony import ${def.name} */\n`
-						);
-						continue;
-					}
-					let finalName;
-					const strictFlag = dep.originModule.buildMeta.strictHarmonyModule
-						? "_strict"
-						: "";
-					if (def.id === true) {
-						finalName = `__WEBPACK_MODULE_REFERENCE__${
-							info.index
-						}_ns${strictFlag}__`;
-					} else {
-						const exportData = Buffer.from(def.id, "utf-8").toString("hex");
-						finalName = `__WEBPACK_MODULE_REFERENCE__${
-							info.index
-						}_${exportData}${strictFlag}__`;
-					}
-					const exportsName = this.rootModule.exportsArgument;
-					const content =
-						`/* concated harmony reexport ${def.name} */` +
-						`__webpack_require__.d(${exportsName}, ` +
-						`${JSON.stringify(used)}, ` +
-						`function() { return ${finalName}; });\n`;
-					source.insert(-1, content);
-				}
-			} else {
-				this.originalTemplate.apply(dep, source, runtime, dependencyTemplates);
-			}
-		}
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 * @returns {ConcatenatedModule} ConcatenatedModule
+	 */
+	static deserialize(context) {
+		const obj = new ConcatenatedModule({
+			identifier: /** @type {EXPECTED_ANY} */ (undefined),
+			rootModule: /** @type {EXPECTED_ANY} */ (undefined),
+			modules: /** @type {EXPECTED_ANY} */ (undefined),
+			runtime: undefined,
+			compilation: /** @type {EXPECTED_ANY} */ (undefined)
+		});
+		obj.deserialize(context);
+		return obj;
 	}
 }
 
-class HarmonyCompatibilityDependencyConcatenatedTemplate {
-	constructor(originalTemplate, rootModule, modulesMap) {
-		this.originalTemplate = originalTemplate;
-		this.rootModule = rootModule;
-		this.modulesMap = modulesMap;
-	}
-
-	apply(dep, source, runtime, dependencyTemplates) {
-		// do nothing
-	}
-}
+makeSerializable(ConcatenatedModule, "webpack/lib/optimize/ConcatenatedModule");
 
 module.exports = ConcatenatedModule;
diff --git a/lib/optimize/EnsureChunkConditionsPlugin.js b/lib/optimize/EnsureChunkConditionsPlugin.js
index 5d05ec834c9..0bc8a384bb6 100644
--- a/lib/optimize/EnsureChunkConditionsPlugin.js
+++ b/lib/optimize/EnsureChunkConditionsPlugin.js
@@ -2,23 +2,40 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const GraphHelpers = require("../GraphHelpers");
+const { STAGE_BASIC } = require("../OptimizationStages");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../ChunkGroup")} ChunkGroup */
+/** @typedef {import("../Compiler")} Compiler */
 
 class EnsureChunkConditionsPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		compiler.hooks.compilation.tap(
 			"EnsureChunkConditionsPlugin",
 			compilation => {
+				/**
+				 * @param {Iterable} chunks the chunks
+				 */
 				const handler = chunks => {
-					let changed = false;
+					const chunkGraph = compilation.chunkGraph;
+					// These sets are hoisted here to save memory
+					// They are cleared at the end of every loop
+					/** @type {Set} */
+					const sourceChunks = new Set();
+					/** @type {Set} */
+					const chunkGroups = new Set();
 					for (const module of compilation.modules) {
-						if (!module.chunkCondition) continue;
-						const sourceChunks = new Set();
-						const chunkGroups = new Set();
-						for (const chunk of module.chunksIterable) {
-							if (!module.chunkCondition(chunk)) {
+						if (!module.hasChunkCondition()) continue;
+						for (const chunk of chunkGraph.getModuleChunksIterable(module)) {
+							if (!module.chunkCondition(chunk, compilation)) {
 								sourceChunks.add(chunk);
 								for (const group of chunk.groupsIterable) {
 									chunkGroups.add(group);
@@ -26,11 +43,12 @@ class EnsureChunkConditionsPlugin {
 							}
 						}
 						if (sourceChunks.size === 0) continue;
+						/** @type {Set} */
 						const targetChunks = new Set();
 						chunkGroupLoop: for (const chunkGroup of chunkGroups) {
 							// Can module be placed in a chunk of this group?
 							for (const chunk of chunkGroup.chunks) {
-								if (module.chunkCondition(chunk)) {
+								if (module.chunkCondition(chunk, compilation)) {
 									targetChunks.add(chunk);
 									continue chunkGroupLoop;
 								}
@@ -38,7 +56,7 @@ class EnsureChunkConditionsPlugin {
 							// We reached the entrypoint: fail
 							if (chunkGroup.isInitial()) {
 								throw new Error(
-									"Cannot fullfil chunk condition of " + module.identifier()
+									`Cannot fulfil chunk condition of ${module.identifier()}`
 								);
 							}
 							// Try placing in all parents
@@ -47,20 +65,20 @@ class EnsureChunkConditionsPlugin {
 							}
 						}
 						for (const sourceChunk of sourceChunks) {
-							GraphHelpers.disconnectChunkAndModule(sourceChunk, module);
+							chunkGraph.disconnectChunkAndModule(sourceChunk, module);
 						}
 						for (const targetChunk of targetChunks) {
-							GraphHelpers.connectChunkAndModule(targetChunk, module);
+							chunkGraph.connectChunkAndModule(targetChunk, module);
 						}
+						sourceChunks.clear();
+						chunkGroups.clear();
 					}
-					if (changed) return true;
 				};
-				compilation.hooks.optimizeChunksBasic.tap(
-					"EnsureChunkConditionsPlugin",
-					handler
-				);
-				compilation.hooks.optimizeExtractedChunksBasic.tap(
-					"EnsureChunkConditionsPlugin",
+				compilation.hooks.optimizeChunks.tap(
+					{
+						name: "EnsureChunkConditionsPlugin",
+						stage: STAGE_BASIC
+					},
 					handler
 				);
 			}
diff --git a/lib/optimize/FlagIncludedChunksPlugin.js b/lib/optimize/FlagIncludedChunksPlugin.js
index 1890f0581eb..216e26cc559 100644
--- a/lib/optimize/FlagIncludedChunksPlugin.js
+++ b/lib/optimize/FlagIncludedChunksPlugin.js
@@ -2,97 +2,123 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const { compareIds } = require("../util/comparators");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Chunk").ChunkId} ChunkId */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Module")} Module */
+
+const PLUGIN_NAME = "FlagIncludedChunksPlugin";
+
 class FlagIncludedChunksPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		compiler.hooks.compilation.tap("FlagIncludedChunksPlugin", compilation => {
-			compilation.hooks.optimizeChunkIds.tap(
-				"FlagIncludedChunksPlugin",
-				chunks => {
-					// prepare two bit integers for each module
-					// 2^31 is the max number represented as SMI in v8
-					// we want the bits distributed this way:
-					// the bit 2^31 is pretty rar and only one module should get it
-					// so it has a probability of 1 / modulesCount
-					// the first bit (2^0) is the easiest and every module could get it
-					// if it doesn't get a better bit
-					// from bit 2^n to 2^(n+1) there is a probability of p
-					// so 1 / modulesCount == p^31
-					// <=> p = sqrt31(1 / modulesCount)
-					// so we use a modulo of 1 / sqrt31(1 / modulesCount)
-					const moduleBits = new WeakMap();
-					const modulesCount = compilation.modules.length;
-
-					// precalculate the modulo values for each bit
-					const modulo = 1 / Math.pow(1 / modulesCount, 1 / 31);
-					const modulos = Array.from(
-						{ length: 31 },
-						(x, i) => Math.pow(modulo, i) | 0
-					);
-
-					// iterate all modules to generate bit values
-					let i = 0;
-					for (const module of compilation.modules) {
-						let bit = 30;
-						while (i % modulos[bit] !== 0) {
-							bit--;
-						}
-						moduleBits.set(module, 1 << bit);
-						i++;
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			compilation.hooks.optimizeChunkIds.tap(PLUGIN_NAME, chunks => {
+				const chunkGraph = compilation.chunkGraph;
+
+				// prepare two bit integers for each module
+				// 2^31 is the max number represented as SMI in v8
+				// we want the bits distributed this way:
+				// the bit 2^31 is pretty rar and only one module should get it
+				// so it has a probability of 1 / modulesCount
+				// the first bit (2^0) is the easiest and every module could get it
+				// if it doesn't get a better bit
+				// from bit 2^n to 2^(n+1) there is a probability of p
+				// so 1 / modulesCount == p^31
+				// <=> p = sqrt31(1 / modulesCount)
+				// so we use a modulo of 1 / sqrt31(1 / modulesCount)
+				/** @type {WeakMap} */
+				const moduleBits = new WeakMap();
+				const modulesCount = compilation.modules.size;
+
+				// precalculate the modulo values for each bit
+				const modulo = 1 / (1 / modulesCount) ** (1 / 31);
+				const modulos = Array.from({ length: 31 }, (x, i) => (modulo ** i) | 0);
+
+				// iterate all modules to generate bit values
+				let i = 0;
+				for (const module of compilation.modules) {
+					let bit = 30;
+					while (i % modulos[bit] !== 0) {
+						bit--;
 					}
+					moduleBits.set(module, 1 << bit);
+					i++;
+				}
 
-					// interate all chunks to generate bitmaps
-					const chunkModulesHash = new WeakMap();
-					for (const chunk of chunks) {
-						let hash = 0;
-						for (const module of chunk.modulesIterable) {
-							hash |= moduleBits.get(module);
-						}
-						chunkModulesHash.set(chunk, hash);
+				// iterate all chunks to generate bitmaps
+				/** @type {WeakMap} */
+				const chunkModulesHash = new WeakMap();
+				for (const chunk of chunks) {
+					let hash = 0;
+					for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
+						hash |= /** @type {number} */ (moduleBits.get(module));
 					}
+					chunkModulesHash.set(chunk, hash);
+				}
 
-					for (const chunkA of chunks) {
-						const chunkAHash = chunkModulesHash.get(chunkA);
-						const chunkAModulesCount = chunkA.getNumberOfModules();
-						if (chunkAModulesCount === 0) continue;
-						let bestModule = undefined;
-						for (const module of chunkA.modulesIterable) {
-							if (
-								bestModule === undefined ||
-								bestModule.getNumberOfChunks() > module.getNumberOfChunks()
-							)
-								bestModule = module;
-						}
-						loopB: for (const chunkB of bestModule.chunksIterable) {
-							// as we iterate the same iterables twice
-							// skip if we find ourselves
-							if (chunkA === chunkB) continue;
+				for (const chunkA of chunks) {
+					const chunkAHash =
+						/** @type {number} */
+						(chunkModulesHash.get(chunkA));
+					const chunkAModulesCount = chunkGraph.getNumberOfChunkModules(chunkA);
+					if (chunkAModulesCount === 0) continue;
+					let bestModule;
+					for (const module of chunkGraph.getChunkModulesIterable(chunkA)) {
+						if (
+							bestModule === undefined ||
+							chunkGraph.getNumberOfModuleChunks(bestModule) >
+								chunkGraph.getNumberOfModuleChunks(module)
+						)
+							bestModule = module;
+					}
+					loopB: for (const chunkB of chunkGraph.getModuleChunksIterable(
+						/** @type {Module} */ (bestModule)
+					)) {
+						// as we iterate the same iterables twice
+						// skip if we find ourselves
+						if (chunkA === chunkB) continue;
 
-							const chunkBModulesCount = chunkB.getNumberOfModules();
+						const chunkBModulesCount =
+							chunkGraph.getNumberOfChunkModules(chunkB);
 
-							// ids for empty chunks are not included
-							if (chunkBModulesCount === 0) continue;
+						// ids for empty chunks are not included
+						if (chunkBModulesCount === 0) continue;
 
-							// instead of swapping A and B just bail
-							// as we loop twice the current A will be B and B then A
-							if (chunkAModulesCount > chunkBModulesCount) continue;
+						// instead of swapping A and B just bail
+						// as we loop twice the current A will be B and B then A
+						if (chunkAModulesCount > chunkBModulesCount) continue;
 
-							// is chunkA in chunkB?
+						// is chunkA in chunkB?
 
-							// we do a cheap check for the hash value
-							const chunkBHash = chunkModulesHash.get(chunkB);
-							if ((chunkBHash & chunkAHash) !== chunkAHash) continue;
+						// we do a cheap check for the hash value
+						const chunkBHash =
+							/** @type {number} */
+							(chunkModulesHash.get(chunkB));
+						if ((chunkBHash & chunkAHash) !== chunkAHash) continue;
 
-							// compare all modules
-							for (const m of chunkA.modulesIterable) {
-								if (!chunkB.containsModule(m)) continue loopB;
-							}
-							chunkB.ids.push(chunkA.id);
+						// compare all modules
+						for (const m of chunkGraph.getChunkModulesIterable(chunkA)) {
+							if (!chunkGraph.isModuleInChunk(m, chunkB)) continue loopB;
 						}
+
+						/** @type {ChunkId[]} */
+						(chunkB.ids).push(/** @type {ChunkId} */ (chunkA.id));
+						// https://github.com/webpack/webpack/issues/18837
+						/** @type {ChunkId[]} */
+						(chunkB.ids).sort(compareIds);
 					}
 				}
-			);
+			});
 		});
 	}
 }
diff --git a/lib/optimize/InnerGraph.js b/lib/optimize/InnerGraph.js
new file mode 100644
index 00000000000..b5c836fb827
--- /dev/null
+++ b/lib/optimize/InnerGraph.js
@@ -0,0 +1,352 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Sergey Melyukov @smelukov
+*/
+
+"use strict";
+
+const { UsageState } = require("../ExportsInfo");
+
+/** @typedef {import("estree").Node} AnyNode */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").GetConditionFn} GetConditionFn */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */
+/** @typedef {import("../ModuleGraphConnection").ConnectionState} ConnectionState */
+/** @typedef {import("../Parser").ParserState} ParserState */
+/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+
+/** @typedef {Map | true | undefined>} InnerGraph */
+/** @typedef {(value: boolean | Set | undefined) => void} UsageCallback */
+
+/**
+ * @typedef {object} StateObject
+ * @property {InnerGraph} innerGraph
+ * @property {TopLevelSymbol=} currentTopLevelSymbol
+ * @property {Map>} usageCallbackMap
+ */
+
+/** @typedef {false|StateObject} State */
+
+/** @type {WeakMap} */
+const parserStateMap = new WeakMap();
+const topLevelSymbolTag = Symbol("top level symbol");
+
+/**
+ * @param {ParserState} parserState parser state
+ * @returns {State | undefined} state
+ */
+function getState(parserState) {
+	return parserStateMap.get(parserState);
+}
+
+/**
+ * @param {ParserState} parserState parser state
+ * @returns {void}
+ */
+module.exports.bailout = parserState => {
+	parserStateMap.set(parserState, false);
+};
+
+/**
+ * @param {ParserState} parserState parser state
+ * @returns {void}
+ */
+module.exports.enable = parserState => {
+	const state = parserStateMap.get(parserState);
+	if (state === false) {
+		return;
+	}
+	parserStateMap.set(parserState, {
+		innerGraph: new Map(),
+		currentTopLevelSymbol: undefined,
+		usageCallbackMap: new Map()
+	});
+};
+
+/**
+ * @param {ParserState} parserState parser state
+ * @returns {boolean} true, when enabled
+ */
+module.exports.isEnabled = parserState => {
+	const state = parserStateMap.get(parserState);
+	return Boolean(state);
+};
+
+/**
+ * @param {ParserState} state parser state
+ * @param {TopLevelSymbol | null} symbol the symbol, or null for all symbols
+ * @param {string | TopLevelSymbol | true} usage usage data
+ * @returns {void}
+ */
+module.exports.addUsage = (state, symbol, usage) => {
+	const innerGraphState = getState(state);
+
+	if (innerGraphState) {
+		const { innerGraph } = innerGraphState;
+		const info = innerGraph.get(symbol);
+		if (usage === true) {
+			innerGraph.set(symbol, true);
+		} else if (info === undefined) {
+			innerGraph.set(symbol, new Set([usage]));
+		} else if (info !== true) {
+			info.add(usage);
+		}
+	}
+};
+
+/**
+ * @param {JavascriptParser} parser the parser
+ * @param {string} name name of variable
+ * @param {string | TopLevelSymbol | true} usage usage data
+ * @returns {void}
+ */
+module.exports.addVariableUsage = (parser, name, usage) => {
+	const symbol =
+		/** @type {TopLevelSymbol} */ (
+			parser.getTagData(name, topLevelSymbolTag)
+		) || module.exports.tagTopLevelSymbol(parser, name);
+	if (symbol) {
+		module.exports.addUsage(parser.state, symbol, usage);
+	}
+};
+
+/**
+ * @param {ParserState} state parser state
+ * @returns {void}
+ */
+module.exports.inferDependencyUsage = state => {
+	const innerGraphState = getState(state);
+
+	if (!innerGraphState) {
+		return;
+	}
+
+	const { innerGraph, usageCallbackMap } = innerGraphState;
+	const processed = new Map();
+	// flatten graph to terminal nodes (string, undefined or true)
+	const nonTerminal = new Set(innerGraph.keys());
+	while (nonTerminal.size > 0) {
+		for (const key of nonTerminal) {
+			/** @type {Set | true} */
+			let newSet = new Set();
+			let isTerminal = true;
+			const value = innerGraph.get(key);
+			let alreadyProcessed = processed.get(key);
+			if (alreadyProcessed === undefined) {
+				alreadyProcessed = new Set();
+				processed.set(key, alreadyProcessed);
+			}
+			if (value !== true && value !== undefined) {
+				for (const item of value) {
+					alreadyProcessed.add(item);
+				}
+				for (const item of value) {
+					if (typeof item === "string") {
+						newSet.add(item);
+					} else {
+						const itemValue = innerGraph.get(item);
+						if (itemValue === true) {
+							newSet = true;
+							break;
+						}
+						if (itemValue !== undefined) {
+							for (const i of itemValue) {
+								if (i === key) continue;
+								if (alreadyProcessed.has(i)) continue;
+								newSet.add(i);
+								if (typeof i !== "string") {
+									isTerminal = false;
+								}
+							}
+						}
+					}
+				}
+				if (newSet === true) {
+					innerGraph.set(key, true);
+				} else if (newSet.size === 0) {
+					innerGraph.set(key, undefined);
+				} else {
+					innerGraph.set(key, newSet);
+				}
+			}
+			if (isTerminal) {
+				nonTerminal.delete(key);
+
+				// For the global key, merge with all other keys
+				if (key === null) {
+					const globalValue = innerGraph.get(null);
+					if (globalValue) {
+						for (const [key, value] of innerGraph) {
+							if (key !== null && value !== true) {
+								if (globalValue === true) {
+									innerGraph.set(key, true);
+								} else {
+									const newSet = new Set(value);
+									for (const item of globalValue) {
+										newSet.add(item);
+									}
+									innerGraph.set(key, newSet);
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
+	/** @type {Map>} */
+	for (const [symbol, callbacks] of usageCallbackMap) {
+		const usage = /** @type {true | Set | undefined} */ (
+			innerGraph.get(symbol)
+		);
+		for (const callback of callbacks) {
+			callback(usage === undefined ? false : usage);
+		}
+	}
+};
+
+/**
+ * @param {ParserState} state parser state
+ * @param {UsageCallback} onUsageCallback on usage callback
+ */
+module.exports.onUsage = (state, onUsageCallback) => {
+	const innerGraphState = getState(state);
+
+	if (innerGraphState) {
+		const { usageCallbackMap, currentTopLevelSymbol } = innerGraphState;
+		if (currentTopLevelSymbol) {
+			let callbacks = usageCallbackMap.get(currentTopLevelSymbol);
+
+			if (callbacks === undefined) {
+				callbacks = new Set();
+				usageCallbackMap.set(currentTopLevelSymbol, callbacks);
+			}
+
+			callbacks.add(onUsageCallback);
+		} else {
+			onUsageCallback(true);
+		}
+	} else {
+		onUsageCallback(undefined);
+	}
+};
+
+/**
+ * @param {ParserState} state parser state
+ * @param {TopLevelSymbol | undefined} symbol the symbol
+ */
+module.exports.setTopLevelSymbol = (state, symbol) => {
+	const innerGraphState = getState(state);
+
+	if (innerGraphState) {
+		innerGraphState.currentTopLevelSymbol = symbol;
+	}
+};
+
+/**
+ * @param {ParserState} state parser state
+ * @returns {TopLevelSymbol|void} usage data
+ */
+module.exports.getTopLevelSymbol = state => {
+	const innerGraphState = getState(state);
+
+	if (innerGraphState) {
+		return innerGraphState.currentTopLevelSymbol;
+	}
+};
+
+/**
+ * @param {JavascriptParser} parser parser
+ * @param {string} name name of variable
+ * @returns {TopLevelSymbol | undefined} symbol
+ */
+module.exports.tagTopLevelSymbol = (parser, name) => {
+	const innerGraphState = getState(parser.state);
+	if (!innerGraphState) return;
+
+	parser.defineVariable(name);
+
+	const existingTag = /** @type {TopLevelSymbol} */ (
+		parser.getTagData(name, topLevelSymbolTag)
+	);
+	if (existingTag) {
+		return existingTag;
+	}
+
+	const fn = new TopLevelSymbol(name);
+	parser.tagVariable(name, topLevelSymbolTag, fn);
+	return fn;
+};
+
+/**
+ * @param {Dependency} dependency the dependency
+ * @param {Set | boolean} usedByExports usedByExports info
+ * @param {ModuleGraph} moduleGraph moduleGraph
+ * @param {RuntimeSpec} runtime runtime
+ * @returns {boolean} false, when unused. Otherwise true
+ */
+module.exports.isDependencyUsedByExports = (
+	dependency,
+	usedByExports,
+	moduleGraph,
+	runtime
+) => {
+	if (usedByExports === false) return false;
+	if (usedByExports !== true && usedByExports !== undefined) {
+		const selfModule =
+			/** @type {Module} */
+			(moduleGraph.getParentModule(dependency));
+		const exportsInfo = moduleGraph.getExportsInfo(selfModule);
+		let used = false;
+		for (const exportName of usedByExports) {
+			if (exportsInfo.getUsed(exportName, runtime) !== UsageState.Unused)
+				used = true;
+		}
+		if (!used) return false;
+	}
+	return true;
+};
+
+/**
+ * @param {Dependency} dependency the dependency
+ * @param {Set | boolean | undefined} usedByExports usedByExports info
+ * @param {ModuleGraph} moduleGraph moduleGraph
+ * @returns {null | false | GetConditionFn} function to determine if the connection is active
+ */
+module.exports.getDependencyUsedByExportsCondition = (
+	dependency,
+	usedByExports,
+	moduleGraph
+) => {
+	if (usedByExports === false) return false;
+	if (usedByExports !== true && usedByExports !== undefined) {
+		const selfModule =
+			/** @type {Module} */
+			(moduleGraph.getParentModule(dependency));
+		const exportsInfo = moduleGraph.getExportsInfo(selfModule);
+		return (connections, runtime) => {
+			for (const exportName of usedByExports) {
+				if (exportsInfo.getUsed(exportName, runtime) !== UsageState.Unused)
+					return true;
+			}
+			return false;
+		};
+	}
+	return null;
+};
+
+class TopLevelSymbol {
+	/**
+	 * @param {string} name name of the variable
+	 */
+	constructor(name) {
+		this.name = name;
+	}
+}
+
+module.exports.TopLevelSymbol = TopLevelSymbol;
+module.exports.topLevelSymbolTag = topLevelSymbolTag;
diff --git a/lib/optimize/InnerGraphPlugin.js b/lib/optimize/InnerGraphPlugin.js
new file mode 100644
index 00000000000..168f5bf4d64
--- /dev/null
+++ b/lib/optimize/InnerGraphPlugin.js
@@ -0,0 +1,456 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_ESM
+} = require("../ModuleTypeConstants");
+const PureExpressionDependency = require("../dependencies/PureExpressionDependency");
+const InnerGraph = require("./InnerGraph");
+
+/** @typedef {import("estree").ClassDeclaration} ClassDeclaration */
+/** @typedef {import("estree").ClassExpression} ClassExpression */
+/** @typedef {import("estree").Expression} Expression */
+/** @typedef {import("estree").MaybeNamedClassDeclaration} MaybeNamedClassDeclaration */
+/** @typedef {import("estree").MaybeNamedFunctionDeclaration} MaybeNamedFunctionDeclaration */
+/** @typedef {import("estree").Node} Node */
+/** @typedef {import("estree").VariableDeclarator} VariableDeclarator */
+/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("../dependencies/HarmonyImportSpecifierDependency")} HarmonyImportSpecifierDependency */
+/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
+/** @typedef {import("./InnerGraph").InnerGraph} InnerGraph */
+/** @typedef {import("./InnerGraph").TopLevelSymbol} TopLevelSymbol */
+
+const { topLevelSymbolTag } = InnerGraph;
+
+const PLUGIN_NAME = "InnerGraphPlugin";
+
+class InnerGraphPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(
+			PLUGIN_NAME,
+			(compilation, { normalModuleFactory }) => {
+				const logger = compilation.getLogger("webpack.InnerGraphPlugin");
+
+				compilation.dependencyTemplates.set(
+					PureExpressionDependency,
+					new PureExpressionDependency.Template()
+				);
+
+				/**
+				 * @param {JavascriptParser} parser the parser
+				 * @param {JavascriptParserOptions} parserOptions options
+				 * @returns {void}
+				 */
+				const handler = (parser, parserOptions) => {
+					/**
+					 * @param {Expression} sup sup
+					 */
+					const onUsageSuper = sup => {
+						InnerGraph.onUsage(parser.state, usedByExports => {
+							switch (usedByExports) {
+								case undefined:
+								case true:
+									return;
+								default: {
+									const dep = new PureExpressionDependency(
+										/** @type {Range} */
+										(sup.range)
+									);
+									dep.loc = /** @type {DependencyLocation} */ (sup.loc);
+									dep.usedByExports = usedByExports;
+									parser.state.module.addDependency(dep);
+									break;
+								}
+							}
+						});
+					};
+
+					parser.hooks.program.tap(PLUGIN_NAME, () => {
+						InnerGraph.enable(parser.state);
+					});
+
+					parser.hooks.finish.tap(PLUGIN_NAME, () => {
+						if (!InnerGraph.isEnabled(parser.state)) return;
+
+						logger.time("infer dependency usage");
+						InnerGraph.inferDependencyUsage(parser.state);
+						logger.timeAggregate("infer dependency usage");
+					});
+
+					// During prewalking the following datastructures are filled with
+					// nodes that have a TopLevelSymbol assigned and
+					// variables are tagged with the assigned TopLevelSymbol
+
+					// We differ 3 types of nodes:
+					// 1. full statements (export default, function declaration)
+					// 2. classes (class declaration, class expression)
+					// 3. variable declarators (const x = ...)
+
+					/** @type {WeakMap} */
+					const statementWithTopLevelSymbol = new WeakMap();
+					/** @type {WeakMap} */
+					const statementPurePart = new WeakMap();
+
+					/** @type {WeakMap} */
+					const classWithTopLevelSymbol = new WeakMap();
+
+					/** @type {WeakMap} */
+					const declWithTopLevelSymbol = new WeakMap();
+					/** @type {WeakSet} */
+					const pureDeclarators = new WeakSet();
+
+					// The following hooks are used during prewalking:
+
+					parser.hooks.preStatement.tap(PLUGIN_NAME, statement => {
+						if (!InnerGraph.isEnabled(parser.state)) return;
+
+						if (
+							parser.scope.topLevelScope === true &&
+							statement.type === "FunctionDeclaration"
+						) {
+							const name = statement.id ? statement.id.name : "*default*";
+							const fn =
+								/** @type {TopLevelSymbol} */
+								(InnerGraph.tagTopLevelSymbol(parser, name));
+							statementWithTopLevelSymbol.set(statement, fn);
+							return true;
+						}
+					});
+
+					parser.hooks.blockPreStatement.tap(PLUGIN_NAME, statement => {
+						if (!InnerGraph.isEnabled(parser.state)) return;
+
+						if (parser.scope.topLevelScope === true) {
+							if (
+								statement.type === "ClassDeclaration" &&
+								parser.isPure(
+									statement,
+									/** @type {Range} */ (statement.range)[0]
+								)
+							) {
+								const name = statement.id ? statement.id.name : "*default*";
+								const fn = /** @type {TopLevelSymbol} */ (
+									InnerGraph.tagTopLevelSymbol(parser, name)
+								);
+								classWithTopLevelSymbol.set(statement, fn);
+								return true;
+							}
+							if (statement.type === "ExportDefaultDeclaration") {
+								const name = "*default*";
+								const fn =
+									/** @type {TopLevelSymbol} */
+									(InnerGraph.tagTopLevelSymbol(parser, name));
+								const decl = statement.declaration;
+								if (
+									(decl.type === "ClassExpression" ||
+										decl.type === "ClassDeclaration") &&
+									parser.isPure(
+										/** @type {ClassExpression | ClassDeclaration} */
+										(decl),
+										/** @type {Range} */
+										(decl.range)[0]
+									)
+								) {
+									classWithTopLevelSymbol.set(
+										/** @type {ClassExpression | ClassDeclaration} */
+										(decl),
+										fn
+									);
+								} else if (
+									parser.isPure(
+										/** @type {Expression} */
+										(decl),
+										/** @type {Range} */
+										(statement.range)[0]
+									)
+								) {
+									statementWithTopLevelSymbol.set(statement, fn);
+									if (
+										!decl.type.endsWith("FunctionExpression") &&
+										!decl.type.endsWith("Declaration") &&
+										decl.type !== "Literal"
+									) {
+										statementPurePart.set(
+											statement,
+											/** @type {Expression} */
+											(decl)
+										);
+									}
+								}
+							}
+						}
+					});
+
+					parser.hooks.preDeclarator.tap(PLUGIN_NAME, (decl, statement) => {
+						if (!InnerGraph.isEnabled(parser.state)) return;
+						if (
+							parser.scope.topLevelScope === true &&
+							decl.init &&
+							decl.id.type === "Identifier"
+						) {
+							const name = decl.id.name;
+							if (
+								decl.init.type === "ClassExpression" &&
+								parser.isPure(
+									decl.init,
+									/** @type {Range} */ (decl.id.range)[1]
+								)
+							) {
+								const fn =
+									/** @type {TopLevelSymbol} */
+									(InnerGraph.tagTopLevelSymbol(parser, name));
+								classWithTopLevelSymbol.set(decl.init, fn);
+							} else if (
+								parser.isPure(
+									decl.init,
+									/** @type {Range} */ (decl.id.range)[1]
+								)
+							) {
+								const fn =
+									/** @type {TopLevelSymbol} */
+									(InnerGraph.tagTopLevelSymbol(parser, name));
+								declWithTopLevelSymbol.set(decl, fn);
+								if (
+									!decl.init.type.endsWith("FunctionExpression") &&
+									decl.init.type !== "Literal"
+								) {
+									pureDeclarators.add(decl);
+								}
+							}
+						}
+					});
+
+					// During real walking we set the TopLevelSymbol state to the assigned
+					// TopLevelSymbol by using the fill datastructures.
+
+					// In addition to tracking TopLevelSymbols, we sometimes need to
+					// add a PureExpressionDependency. This is needed to skip execution
+					// of pure expressions, even when they are not dropped due to
+					// minimizing. Otherwise symbols used there might not exist anymore
+					// as they are removed as unused by this optimization
+
+					// When we find a reference to a TopLevelSymbol, we register a
+					// TopLevelSymbol dependency from TopLevelSymbol in state to the
+					// referenced TopLevelSymbol. This way we get a graph of all
+					// TopLevelSymbols.
+
+					// The following hooks are called during walking:
+
+					parser.hooks.statement.tap(PLUGIN_NAME, statement => {
+						if (!InnerGraph.isEnabled(parser.state)) return;
+						if (parser.scope.topLevelScope === true) {
+							InnerGraph.setTopLevelSymbol(parser.state, undefined);
+
+							const fn = statementWithTopLevelSymbol.get(statement);
+							if (fn) {
+								InnerGraph.setTopLevelSymbol(parser.state, fn);
+								const purePart = statementPurePart.get(statement);
+								if (purePart) {
+									InnerGraph.onUsage(parser.state, usedByExports => {
+										switch (usedByExports) {
+											case undefined:
+											case true:
+												return;
+											default: {
+												const dep = new PureExpressionDependency(
+													/** @type {Range} */ (purePart.range)
+												);
+												dep.loc =
+													/** @type {DependencyLocation} */
+													(statement.loc);
+												dep.usedByExports = usedByExports;
+												parser.state.module.addDependency(dep);
+												break;
+											}
+										}
+									});
+								}
+							}
+						}
+					});
+
+					parser.hooks.classExtendsExpression.tap(
+						PLUGIN_NAME,
+						(expr, statement) => {
+							if (!InnerGraph.isEnabled(parser.state)) return;
+							if (parser.scope.topLevelScope === true) {
+								const fn = classWithTopLevelSymbol.get(statement);
+								if (
+									fn &&
+									parser.isPure(
+										expr,
+										statement.id
+											? /** @type {Range} */ (statement.id.range)[1]
+											: /** @type {Range} */ (statement.range)[0]
+									)
+								) {
+									InnerGraph.setTopLevelSymbol(parser.state, fn);
+									onUsageSuper(expr);
+								}
+							}
+						}
+					);
+
+					parser.hooks.classBodyElement.tap(
+						PLUGIN_NAME,
+						(element, classDefinition) => {
+							if (!InnerGraph.isEnabled(parser.state)) return;
+							if (parser.scope.topLevelScope === true) {
+								const fn = classWithTopLevelSymbol.get(classDefinition);
+								if (fn) {
+									InnerGraph.setTopLevelSymbol(parser.state, undefined);
+								}
+							}
+						}
+					);
+
+					parser.hooks.classBodyValue.tap(
+						PLUGIN_NAME,
+						(expression, element, classDefinition) => {
+							if (!InnerGraph.isEnabled(parser.state)) return;
+							if (parser.scope.topLevelScope === true) {
+								const fn = classWithTopLevelSymbol.get(classDefinition);
+								if (fn) {
+									if (
+										!element.static ||
+										parser.isPure(
+											expression,
+											element.key
+												? /** @type {Range} */ (element.key.range)[1]
+												: /** @type {Range} */ (element.range)[0]
+										)
+									) {
+										InnerGraph.setTopLevelSymbol(parser.state, fn);
+										if (element.type !== "MethodDefinition" && element.static) {
+											InnerGraph.onUsage(parser.state, usedByExports => {
+												switch (usedByExports) {
+													case undefined:
+													case true:
+														return;
+													default: {
+														const dep = new PureExpressionDependency(
+															/** @type {Range} */ (expression.range)
+														);
+														dep.loc =
+															/** @type {DependencyLocation} */
+															(expression.loc);
+														dep.usedByExports = usedByExports;
+														parser.state.module.addDependency(dep);
+														break;
+													}
+												}
+											});
+										}
+									} else {
+										InnerGraph.setTopLevelSymbol(parser.state, undefined);
+									}
+								}
+							}
+						}
+					);
+
+					parser.hooks.declarator.tap(PLUGIN_NAME, (decl, statement) => {
+						if (!InnerGraph.isEnabled(parser.state)) return;
+						const fn = declWithTopLevelSymbol.get(decl);
+
+						if (fn) {
+							InnerGraph.setTopLevelSymbol(parser.state, fn);
+							if (pureDeclarators.has(decl)) {
+								if (
+									/** @type {ClassExpression} */
+									(decl.init).type === "ClassExpression"
+								) {
+									if (decl.init.superClass) {
+										onUsageSuper(decl.init.superClass);
+									}
+								} else {
+									InnerGraph.onUsage(parser.state, usedByExports => {
+										switch (usedByExports) {
+											case undefined:
+											case true:
+												return;
+											default: {
+												const dep = new PureExpressionDependency(
+													/** @type {Range} */ (
+														/** @type {ClassExpression} */
+														(decl.init).range
+													)
+												);
+												dep.loc = /** @type {DependencyLocation} */ (decl.loc);
+												dep.usedByExports = usedByExports;
+												parser.state.module.addDependency(dep);
+												break;
+											}
+										}
+									});
+								}
+							}
+							parser.walkExpression(
+								/** @type {NonNullable} */ (
+									decl.init
+								)
+							);
+							InnerGraph.setTopLevelSymbol(parser.state, undefined);
+							return true;
+						} else if (
+							decl.id.type === "Identifier" &&
+							decl.init &&
+							decl.init.type === "ClassExpression" &&
+							classWithTopLevelSymbol.has(decl.init)
+						) {
+							parser.walkExpression(decl.init);
+							InnerGraph.setTopLevelSymbol(parser.state, undefined);
+							return true;
+						}
+					});
+
+					parser.hooks.expression
+						.for(topLevelSymbolTag)
+						.tap(PLUGIN_NAME, () => {
+							const topLevelSymbol = /** @type {TopLevelSymbol} */ (
+								parser.currentTagData
+							);
+							const currentTopLevelSymbol = InnerGraph.getTopLevelSymbol(
+								parser.state
+							);
+							InnerGraph.addUsage(
+								parser.state,
+								topLevelSymbol,
+								currentTopLevelSymbol || true
+							);
+						});
+					parser.hooks.assign.for(topLevelSymbolTag).tap(PLUGIN_NAME, expr => {
+						if (!InnerGraph.isEnabled(parser.state)) return;
+						if (expr.operator === "=") return true;
+					});
+				};
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_AUTO)
+					.tap(PLUGIN_NAME, handler);
+				normalModuleFactory.hooks.parser
+					.for(JAVASCRIPT_MODULE_TYPE_ESM)
+					.tap(PLUGIN_NAME, handler);
+
+				compilation.hooks.finishModules.tap(PLUGIN_NAME, () => {
+					logger.timeAggregateEnd("infer dependency usage");
+				});
+			}
+		);
+	}
+}
+
+module.exports = InnerGraphPlugin;
diff --git a/lib/optimize/LimitChunkCountPlugin.js b/lib/optimize/LimitChunkCountPlugin.js
index 0f8bd6dcbe5..f20acb86d01 100644
--- a/lib/optimize/LimitChunkCountPlugin.js
+++ b/lib/optimize/LimitChunkCountPlugin.js
@@ -2,75 +2,295 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const validateOptions = require("schema-utils");
-const schema = require("../../schemas/plugins/optimize/LimitChunkCountPlugin.json");
+const { STAGE_ADVANCED } = require("../OptimizationStages");
+const LazyBucketSortedSet = require("../util/LazyBucketSortedSet");
+const { compareChunks } = require("../util/comparators");
+const createSchemaValidation = require("../util/create-schema-validation");
 
 /** @typedef {import("../../declarations/plugins/optimize/LimitChunkCountPlugin").LimitChunkCountPluginOptions} LimitChunkCountPluginOptions */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compiler")} Compiler */
+
+const validate = createSchemaValidation(
+	require("../../schemas/plugins/optimize/LimitChunkCountPlugin.check.js"),
+	() => require("../../schemas/plugins/optimize/LimitChunkCountPlugin.json"),
+	{
+		name: "Limit Chunk Count Plugin",
+		baseDataPath: "options"
+	}
+);
+
+/**
+ * @typedef {object} ChunkCombination
+ * @property {boolean} deleted this is set to true when combination was removed
+ * @property {number} sizeDiff
+ * @property {number} integratedSize
+ * @property {Chunk} a
+ * @property {Chunk} b
+ * @property {number} aIdx
+ * @property {number} bIdx
+ * @property {number} aSize
+ * @property {number} bSize
+ */
+
+/**
+ * @template K, V
+ * @param {Map>} map map
+ * @param {K} key key
+ * @param {V} value value
+ */
+const addToSetMap = (map, key, value) => {
+	const set = map.get(key);
+	if (set === undefined) {
+		map.set(key, new Set([value]));
+	} else {
+		set.add(value);
+	}
+};
+
+const PLUGIN_NAME = "LimitChunkCountPlugin";
 
 class LimitChunkCountPlugin {
 	/**
 	 * @param {LimitChunkCountPluginOptions=} options options object
 	 */
 	constructor(options) {
-		if (!options) options = {};
-
-		validateOptions(schema, options, "Limit Chunk Count Plugin");
-		this.options = options;
+		validate(options);
+		this.options = /** @type {LimitChunkCountPluginOptions} */ (options);
 	}
+
+	/**
+	 * @param {Compiler} compiler the webpack compiler
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		const options = this.options;
-		compiler.hooks.compilation.tap("LimitChunkCountPlugin", compilation => {
-			compilation.hooks.optimizeChunksAdvanced.tap(
-				"LimitChunkCountPlugin",
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			compilation.hooks.optimizeChunks.tap(
+				{
+					name: PLUGIN_NAME,
+					stage: STAGE_ADVANCED
+				},
 				chunks => {
+					const chunkGraph = compilation.chunkGraph;
 					const maxChunks = options.maxChunks;
 					if (!maxChunks) return;
 					if (maxChunks < 1) return;
-					if (chunks.length <= maxChunks) return;
+					if (compilation.chunks.size <= maxChunks) return;
+
+					let remainingChunksToMerge = compilation.chunks.size - maxChunks;
+
+					// order chunks in a deterministic way
+					const compareChunksWithGraph = compareChunks(chunkGraph);
+					const orderedChunks = Array.from(chunks).sort(compareChunksWithGraph);
+
+					// create a lazy sorted data structure to keep all combinations
+					// this is large. Size = chunks * (chunks - 1) / 2
+					// It uses a multi layer bucket sort plus normal sort in the last layer
+					// It's also lazy so only accessed buckets are sorted
+					/** @type {LazyBucketSortedSet} */
+					const combinations = new LazyBucketSortedSet(
+						// Layer 1: ordered by largest size benefit
+						c => c.sizeDiff,
+						(a, b) => b - a,
+
+						// Layer 2: ordered by smallest combined size
+						/**
+						 * @param {ChunkCombination} c combination
+						 * @returns {number} integrated size
+						 */
+						c => c.integratedSize,
+						/**
+						 * @param {number} a a
+						 * @param {number} b b
+						 * @returns {number} result
+						 */
+						(a, b) => a - b,
+
+						// Layer 3: ordered by position difference in orderedChunk (-> to be deterministic)
+						/**
+						 * @param {ChunkCombination} c combination
+						 * @returns {number} position difference
+						 */
+						c => c.bIdx - c.aIdx,
+						/**
+						 * @param {number} a a
+						 * @param {number} b b
+						 * @returns {number} result
+						 */
+						(a, b) => a - b,
+
+						// Layer 4: ordered by position in orderedChunk (-> to be deterministic)
+						/**
+						 * @param {ChunkCombination} a a
+						 * @param {ChunkCombination} b b
+						 * @returns {number} result
+						 */
+						(a, b) => a.bIdx - b.bIdx
+					);
+
+					// we keep a mapping from chunk to all combinations
+					// but this mapping is not kept up-to-date with deletions
+					// so `deleted` flag need to be considered when iterating this
+					/** @type {Map>} */
+					const combinationsByChunk = new Map();
+
+					for (const [bIdx, b] of orderedChunks.entries()) {
+						// create combination pairs with size and integrated size
+						for (let aIdx = 0; aIdx < bIdx; aIdx++) {
+							const a = orderedChunks[aIdx];
+							// filter pairs that can not be integrated!
+							if (!chunkGraph.canChunksBeIntegrated(a, b)) continue;
+
+							const integratedSize = chunkGraph.getIntegratedChunksSize(
+								a,
+								b,
+								options
+							);
+
+							const aSize = chunkGraph.getChunkSize(a, options);
+							const bSize = chunkGraph.getChunkSize(b, options);
+							/** @type {ChunkCombination} */
+							const c = {
+								deleted: false,
+								sizeDiff: aSize + bSize - integratedSize,
+								integratedSize,
+								a,
+								b,
+								aIdx,
+								bIdx,
+								aSize,
+								bSize
+							};
+							combinations.add(c);
+							addToSetMap(combinationsByChunk, a, c);
+							addToSetMap(combinationsByChunk, b, c);
+						}
+					}
+
+					// list of modified chunks during this run
+					// combinations affected by this change are skipped to allow
+					// further optimizations
+					/** @type {Set} */
+					const modifiedChunks = new Set();
+
+					let changed = false;
+					loop: while (true) {
+						const combination = combinations.popFirst();
+						if (combination === undefined) break;
+
+						combination.deleted = true;
+						const { a, b, integratedSize } = combination;
+
+						// skip over pair when
+						// one of the already merged chunks is a parent of one of the chunks
+						if (modifiedChunks.size > 0) {
+							const queue = new Set(a.groupsIterable);
+							for (const group of b.groupsIterable) {
+								queue.add(group);
+							}
+							for (const group of queue) {
+								for (const mChunk of modifiedChunks) {
+									if (mChunk !== a && mChunk !== b && mChunk.isInGroup(group)) {
+										// This is a potential pair which needs recalculation
+										// We can't do that now, but it merge before following pairs
+										// so we leave space for it, and consider chunks as modified
+										// just for the worse case
+										remainingChunksToMerge--;
+										if (remainingChunksToMerge <= 0) break loop;
+										modifiedChunks.add(a);
+										modifiedChunks.add(b);
+										continue loop;
+									}
+								}
+								for (const parent of group.parentsIterable) {
+									queue.add(parent);
+								}
+							}
+						}
+
+						// merge the chunks
+						if (chunkGraph.canChunksBeIntegrated(a, b)) {
+							chunkGraph.integrateChunks(a, b);
+							compilation.chunks.delete(b);
+
+							// flag chunk a as modified as further optimization are possible for all children here
+							modifiedChunks.add(a);
+
+							changed = true;
+							remainingChunksToMerge--;
+							if (remainingChunksToMerge <= 0) break;
+
+							// Update all affected combinations
+							// delete all combination with the removed chunk
+							// we will use combinations with the kept chunk instead
+							for (const combination of /** @type {Set} */ (
+								combinationsByChunk.get(a)
+							)) {
+								if (combination.deleted) continue;
+								combination.deleted = true;
+								combinations.delete(combination);
+							}
 
-					const orderedChunks = chunks.slice().sort((a, b) => a.compareTo(b));
+							// Update combinations with the kept chunk with new sizes
+							for (const combination of /** @type {Set} */ (
+								combinationsByChunk.get(b)
+							)) {
+								if (combination.deleted) continue;
+								if (combination.a === b) {
+									if (!chunkGraph.canChunksBeIntegrated(a, combination.b)) {
+										combination.deleted = true;
+										combinations.delete(combination);
+										continue;
+									}
+									// Update size
+									const newIntegratedSize = chunkGraph.getIntegratedChunksSize(
+										a,
+										combination.b,
+										options
+									);
+									const finishUpdate = combinations.startUpdate(combination);
+									combination.a = a;
+									combination.integratedSize = newIntegratedSize;
+									combination.aSize = integratedSize;
+									combination.sizeDiff =
+										combination.bSize + integratedSize - newIntegratedSize;
+									finishUpdate();
+								} else if (combination.b === b) {
+									if (!chunkGraph.canChunksBeIntegrated(combination.a, a)) {
+										combination.deleted = true;
+										combinations.delete(combination);
+										continue;
+									}
+									// Update size
+									const newIntegratedSize = chunkGraph.getIntegratedChunksSize(
+										combination.a,
+										a,
+										options
+									);
 
-					const sortedExtendedPairCombinations = orderedChunks
-						.reduce((combinations, a, idx) => {
-							// create combination pairs
-							for (let i = 0; i < idx; i++) {
-								const b = orderedChunks[i];
-								combinations.push([b, a]);
+									const finishUpdate = combinations.startUpdate(combination);
+									combination.b = a;
+									combination.integratedSize = newIntegratedSize;
+									combination.bSize = integratedSize;
+									combination.sizeDiff =
+										integratedSize + combination.aSize - newIntegratedSize;
+									finishUpdate();
+								}
 							}
-							return combinations;
-						}, [])
-						.map(pair => {
-							// extend combination pairs with size and integrated size
-							const a = pair[0].size(options);
-							const b = pair[1].size(options);
-							const ab = pair[0].integratedSize(pair[1], options);
-							return [a + b - ab, ab, pair[0], pair[1], a, b];
-						})
-						.filter(extendedPair => {
-							// filter pairs that do not have an integratedSize
-							// meaning they can NOT be integrated!
-							return extendedPair[1] !== false;
-						})
-						.sort((a, b) => {
-							// sadly javascript does an inplace sort here
-							// sort them by size
-							const diff1 = b[0] - a[0];
-							if (diff1 !== 0) return diff1;
-							const diff2 = a[1] - b[1];
-							if (diff2 !== 0) return diff2;
-							const diff3 = a[2].compareTo(b[2]);
-							if (diff3 !== 0) return diff3;
-							return a[3].compareTo(b[3]);
-						});
-
-					const pair = sortedExtendedPairCombinations[0];
-
-					if (pair && pair[2].integrate(pair[3], "limit")) {
-						chunks.splice(chunks.indexOf(pair[3]), 1);
-						return true;
+							combinationsByChunk.set(
+								a,
+								/** @type {Set} */ (
+									combinationsByChunk.get(b)
+								)
+							);
+							combinationsByChunk.delete(b);
+						}
 					}
+					if (changed) return true;
 				}
 			);
 		});
diff --git a/lib/optimize/MangleExportsPlugin.js b/lib/optimize/MangleExportsPlugin.js
new file mode 100644
index 00000000000..18ec2864ee9
--- /dev/null
+++ b/lib/optimize/MangleExportsPlugin.js
@@ -0,0 +1,181 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { UsageState } = require("../ExportsInfo");
+const {
+	numberToIdentifier,
+	NUMBER_OF_IDENTIFIER_START_CHARS,
+	NUMBER_OF_IDENTIFIER_CONTINUATION_CHARS
+} = require("../Template");
+const { assignDeterministicIds } = require("../ids/IdHelpers");
+const { compareSelect, compareStringsNumeric } = require("../util/comparators");
+
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../ExportsInfo")} ExportsInfo */
+/** @typedef {import("../ExportsInfo").ExportInfo} ExportInfo */
+
+/**
+ * @param {ExportsInfo} exportsInfo exports info
+ * @returns {boolean} mangle is possible
+ */
+const canMangle = exportsInfo => {
+	if (exportsInfo.otherExportsInfo.getUsed(undefined) !== UsageState.Unused)
+		return false;
+	let hasSomethingToMangle = false;
+	for (const exportInfo of exportsInfo.exports) {
+		if (exportInfo.canMangle === true) {
+			hasSomethingToMangle = true;
+		}
+	}
+	return hasSomethingToMangle;
+};
+
+// Sort by name
+const comparator = compareSelect(e => e.name, compareStringsNumeric);
+/**
+ * @param {boolean} deterministic use deterministic names
+ * @param {ExportsInfo} exportsInfo exports info
+ * @param {boolean | undefined} isNamespace is namespace object
+ * @returns {void}
+ */
+const mangleExportsInfo = (deterministic, exportsInfo, isNamespace) => {
+	if (!canMangle(exportsInfo)) return;
+	const usedNames = new Set();
+	/** @type {ExportInfo[]} */
+	const mangleableExports = [];
+
+	// Avoid to renamed exports that are not provided when
+	// 1. it's not a namespace export: non-provided exports can be found in prototype chain
+	// 2. there are other provided exports and deterministic mode is chosen:
+	//    non-provided exports would break the determinism
+	let avoidMangleNonProvided = !isNamespace;
+	if (!avoidMangleNonProvided && deterministic) {
+		for (const exportInfo of exportsInfo.ownedExports) {
+			if (exportInfo.provided !== false) {
+				avoidMangleNonProvided = true;
+				break;
+			}
+		}
+	}
+	for (const exportInfo of exportsInfo.ownedExports) {
+		const name = exportInfo.name;
+		if (!exportInfo.hasUsedName()) {
+			if (
+				// Can the export be mangled?
+				exportInfo.canMangle !== true ||
+				// Never rename 1 char exports
+				(name.length === 1 && /^[a-zA-Z0-9_$]/.test(name)) ||
+				// Don't rename 2 char exports in deterministic mode
+				(deterministic &&
+					name.length === 2 &&
+					/^[a-zA-Z_$][a-zA-Z0-9_$]|^[1-9][0-9]/.test(name)) ||
+				// Don't rename exports that are not provided
+				(avoidMangleNonProvided && exportInfo.provided !== true)
+			) {
+				exportInfo.setUsedName(name);
+				usedNames.add(name);
+			} else {
+				mangleableExports.push(exportInfo);
+			}
+		}
+		if (exportInfo.exportsInfoOwned) {
+			const used = exportInfo.getUsed(undefined);
+			if (
+				used === UsageState.OnlyPropertiesUsed ||
+				used === UsageState.Unused
+			) {
+				mangleExportsInfo(
+					deterministic,
+					/** @type {ExportsInfo} */ (exportInfo.exportsInfo),
+					false
+				);
+			}
+		}
+	}
+	if (deterministic) {
+		assignDeterministicIds(
+			mangleableExports,
+			e => e.name,
+			comparator,
+			(e, id) => {
+				const name = numberToIdentifier(id);
+				const size = usedNames.size;
+				usedNames.add(name);
+				if (size === usedNames.size) return false;
+				e.setUsedName(name);
+				return true;
+			},
+			[
+				NUMBER_OF_IDENTIFIER_START_CHARS,
+				NUMBER_OF_IDENTIFIER_START_CHARS *
+					NUMBER_OF_IDENTIFIER_CONTINUATION_CHARS
+			],
+			NUMBER_OF_IDENTIFIER_CONTINUATION_CHARS,
+			usedNames.size
+		);
+	} else {
+		const usedExports = [];
+		const unusedExports = [];
+		for (const exportInfo of mangleableExports) {
+			if (exportInfo.getUsed(undefined) === UsageState.Unused) {
+				unusedExports.push(exportInfo);
+			} else {
+				usedExports.push(exportInfo);
+			}
+		}
+		usedExports.sort(comparator);
+		unusedExports.sort(comparator);
+		let i = 0;
+		for (const list of [usedExports, unusedExports]) {
+			for (const exportInfo of list) {
+				let name;
+				do {
+					name = numberToIdentifier(i++);
+				} while (usedNames.has(name));
+				exportInfo.setUsedName(name);
+			}
+		}
+	}
+};
+
+const PLUGIN_NAME = "MangleExportsPlugin";
+
+class MangleExportsPlugin {
+	/**
+	 * @param {boolean} deterministic use deterministic names
+	 */
+	constructor(deterministic) {
+		this._deterministic = deterministic;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		const { _deterministic: deterministic } = this;
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			const moduleGraph = compilation.moduleGraph;
+			compilation.hooks.optimizeCodeGeneration.tap(PLUGIN_NAME, modules => {
+				if (compilation.moduleMemCaches) {
+					throw new Error(
+						"optimization.mangleExports can't be used with cacheUnaffected as export mangling is a global effect"
+					);
+				}
+				for (const module of modules) {
+					const isNamespace =
+						module.buildMeta && module.buildMeta.exportsType === "namespace";
+					const exportsInfo = moduleGraph.getExportsInfo(module);
+					mangleExportsInfo(deterministic, exportsInfo, isNamespace);
+				}
+			});
+		});
+	}
+}
+
+module.exports = MangleExportsPlugin;
diff --git a/lib/optimize/MergeDuplicateChunksPlugin.js b/lib/optimize/MergeDuplicateChunksPlugin.js
index 1c3e23aa3e9..08db56823a2 100644
--- a/lib/optimize/MergeDuplicateChunksPlugin.js
+++ b/lib/optimize/MergeDuplicateChunksPlugin.js
@@ -2,16 +2,51 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const { STAGE_BASIC } = require("../OptimizationStages");
+const createSchemaValidation = require("../util/create-schema-validation");
+const { runtimeEqual } = require("../util/runtime");
+
+/** @typedef {import("../../declarations/plugins/optimize/MergeDuplicateChunksPlugin").MergeDuplicateChunksPluginOptions} MergeDuplicateChunksPluginOptions */
+/** @typedef {import("../Compiler")} Compiler */
+
+const validate = createSchemaValidation(
+	require("../../schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.js"),
+	() =>
+		require("../../schemas/plugins/optimize/MergeDuplicateChunksPlugin.json"),
+	{
+		name: "Merge Duplicate Chunks Plugin",
+		baseDataPath: "options"
+	}
+);
+
 class MergeDuplicateChunksPlugin {
+	/**
+	 * @param {MergeDuplicateChunksPluginOptions} options options object
+	 */
+	constructor(options = { stage: STAGE_BASIC }) {
+		validate(options);
+		this.options = options;
+	}
+
+	/**
+	 * @param {Compiler} compiler the compiler
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		compiler.hooks.compilation.tap(
 			"MergeDuplicateChunksPlugin",
 			compilation => {
-				compilation.hooks.optimizeChunksBasic.tap(
-					"MergeDuplicateChunksPlugin",
+				compilation.hooks.optimizeChunks.tap(
+					{
+						name: "MergeDuplicateChunksPlugin",
+						stage: this.options.stage
+					},
 					chunks => {
+						const { chunkGraph, moduleGraph } = compilation;
+
 						// remember already tested chunks for performance
 						const notDuplicates = new Set();
 
@@ -19,15 +54,18 @@ class MergeDuplicateChunksPlugin {
 						for (const chunk of chunks) {
 							// track a Set of all chunk that could be duplicates
 							let possibleDuplicates;
-							for (const module of chunk.modulesIterable) {
+							for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
 								if (possibleDuplicates === undefined) {
 									// when possibleDuplicates is not yet set,
 									// create a new Set from chunks of the current module
 									// including only chunks with the same number of modules
-									for (const dup of module.chunksIterable) {
+									for (const dup of chunkGraph.getModuleChunksIterable(
+										module
+									)) {
 										if (
 											dup !== chunk &&
-											chunk.getNumberOfModules() === dup.getNumberOfModules() &&
+											chunkGraph.getNumberOfChunkModules(chunk) ===
+												chunkGraph.getNumberOfChunkModules(dup) &&
 											!notDuplicates.has(dup)
 										) {
 											// delay allocating the new Set until here, reduce memory pressure
@@ -43,7 +81,7 @@ class MergeDuplicateChunksPlugin {
 									// validate existing possible duplicates
 									for (const dup of possibleDuplicates) {
 										// remove possible duplicate when module is not contained
-										if (!dup.containsModule(module)) {
+										if (!chunkGraph.isModuleInChunk(module, dup)) {
 											possibleDuplicates.delete(dup);
 										}
 									}
@@ -57,11 +95,30 @@ class MergeDuplicateChunksPlugin {
 								possibleDuplicates !== undefined &&
 								possibleDuplicates.size > 0
 							) {
-								for (const otherChunk of possibleDuplicates) {
+								outer: for (const otherChunk of possibleDuplicates) {
 									if (otherChunk.hasRuntime() !== chunk.hasRuntime()) continue;
+									if (chunkGraph.getNumberOfEntryModules(chunk) > 0) continue;
+									if (chunkGraph.getNumberOfEntryModules(otherChunk) > 0)
+										continue;
+									if (!runtimeEqual(chunk.runtime, otherChunk.runtime)) {
+										for (const module of chunkGraph.getChunkModulesIterable(
+											chunk
+										)) {
+											const exportsInfo = moduleGraph.getExportsInfo(module);
+											if (
+												!exportsInfo.isEquallyUsed(
+													chunk.runtime,
+													otherChunk.runtime
+												)
+											) {
+												continue outer;
+											}
+										}
+									}
 									// merge them
-									if (chunk.integrate(otherChunk, "duplicate")) {
-										chunks.splice(chunks.indexOf(otherChunk), 1);
+									if (chunkGraph.canChunksBeIntegrated(chunk, otherChunk)) {
+										chunkGraph.integrateChunks(chunk, otherChunk);
+										compilation.chunks.delete(otherChunk);
 									}
 								}
 							}
diff --git a/lib/optimize/MinChunkSizePlugin.js b/lib/optimize/MinChunkSizePlugin.js
index 144af278ace..44ba8d389fe 100644
--- a/lib/optimize/MinChunkSizePlugin.js
+++ b/lib/optimize/MinChunkSizePlugin.js
@@ -2,65 +2,98 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const validateOptions = require("schema-utils");
-const schema = require("../../schemas/plugins/optimize/MinChunkSizePlugin.json");
+const { STAGE_ADVANCED } = require("../OptimizationStages");
+const createSchemaValidation = require("../util/create-schema-validation");
 
 /** @typedef {import("../../declarations/plugins/optimize/MinChunkSizePlugin").MinChunkSizePluginOptions} MinChunkSizePluginOptions */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compiler")} Compiler */
+
+const validate = createSchemaValidation(
+	require("../../schemas/plugins/optimize/MinChunkSizePlugin.check.js"),
+	() => require("../../schemas/plugins/optimize/MinChunkSizePlugin.json"),
+	{
+		name: "Min Chunk Size Plugin",
+		baseDataPath: "options"
+	}
+);
+
+const PLUGIN_NAME = "MinChunkSizePlugin";
 
 class MinChunkSizePlugin {
 	/**
 	 * @param {MinChunkSizePluginOptions} options options object
 	 */
 	constructor(options) {
-		validateOptions(schema, options, "Min Chunk Size Plugin");
+		validate(options);
 		this.options = options;
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		const options = this.options;
 		const minChunkSize = options.minChunkSize;
-		compiler.hooks.compilation.tap("MinChunkSizePlugin", compilation => {
-			compilation.hooks.optimizeChunksAdvanced.tap(
-				"MinChunkSizePlugin",
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			compilation.hooks.optimizeChunks.tap(
+				{
+					name: PLUGIN_NAME,
+					stage: STAGE_ADVANCED
+				},
 				chunks => {
+					const chunkGraph = compilation.chunkGraph;
 					const equalOptions = {
 						chunkOverhead: 1,
 						entryChunkMultiplicator: 1
 					};
 
-					const sortedSizeFilteredExtendedPairCombinations = chunks
-						.reduce((combinations, a, idx) => {
-							// create combination pairs
-							for (let i = 0; i < idx; i++) {
-								const b = chunks[i];
-								combinations.push([b, a]);
+					const chunkSizesMap = new Map();
+					/** @type {[Chunk, Chunk][]} */
+					const combinations = [];
+					/** @type {Chunk[]} */
+					const smallChunks = [];
+					const visitedChunks = [];
+					for (const a of chunks) {
+						// check if one of the chunks sizes is smaller than the minChunkSize
+						// and filter pairs that can NOT be integrated!
+						if (chunkGraph.getChunkSize(a, equalOptions) < minChunkSize) {
+							smallChunks.push(a);
+							for (const b of visitedChunks) {
+								if (chunkGraph.canChunksBeIntegrated(b, a))
+									combinations.push([b, a]);
 							}
-							return combinations;
-						}, [])
-						.filter(pair => {
-							// check if one of the chunks sizes is smaller than the minChunkSize
-							const p0SmallerThanMinChunkSize =
-								pair[0].size(equalOptions) < minChunkSize;
-							const p1SmallerThanMinChunkSize =
-								pair[1].size(equalOptions) < minChunkSize;
-							return p0SmallerThanMinChunkSize || p1SmallerThanMinChunkSize;
-						})
+						} else {
+							for (const b of smallChunks) {
+								if (chunkGraph.canChunksBeIntegrated(b, a))
+									combinations.push([b, a]);
+							}
+						}
+						chunkSizesMap.set(a, chunkGraph.getChunkSize(a, options));
+						visitedChunks.push(a);
+					}
+
+					const sortedSizeFilteredExtendedPairCombinations = combinations
 						.map(pair => {
 							// extend combination pairs with size and integrated size
-							const a = pair[0].size(options);
-							const b = pair[1].size(options);
-							const ab = pair[0].integratedSize(pair[1], options);
-							return [a + b - ab, ab, pair[0], pair[1]];
-						})
-						.filter(pair => {
-							// filter pairs that do not have an integratedSize
-							// meaning they can NOT be integrated!
-							return pair[1] !== false;
+							const a = chunkSizesMap.get(pair[0]);
+							const b = chunkSizesMap.get(pair[1]);
+							const ab = chunkGraph.getIntegratedChunksSize(
+								pair[0],
+								pair[1],
+								options
+							);
+							/** @type {[number, number, Chunk, Chunk]} */
+							const extendedPair = [a + b - ab, ab, pair[0], pair[1]];
+							return extendedPair;
 						})
 						.sort((a, b) => {
-							// sadly javascript does an inplace sort here
+							// sadly javascript does an in place sort here
 							// sort by size
 							const diff = b[0] - a[0];
 							if (diff !== 0) return diff;
@@ -71,8 +104,8 @@ class MinChunkSizePlugin {
 
 					const pair = sortedSizeFilteredExtendedPairCombinations[0];
 
-					pair[2].integrate(pair[3], "min-size");
-					chunks.splice(chunks.indexOf(pair[3]), 1);
+					chunkGraph.integrateChunks(pair[2], pair[3]);
+					compilation.chunks.delete(pair[3]);
 					return true;
 				}
 			);
diff --git a/lib/optimize/MinMaxSizeWarning.js b/lib/optimize/MinMaxSizeWarning.js
index 255e918773f..2cc845eb9f0 100644
--- a/lib/optimize/MinMaxSizeWarning.js
+++ b/lib/optimize/MinMaxSizeWarning.js
@@ -2,12 +2,18 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const WebpackError = require("../WebpackError");
 const SizeFormatHelpers = require("../SizeFormatHelpers");
+const WebpackError = require("../WebpackError");
 
 class MinMaxSizeWarning extends WebpackError {
+	/**
+	 * @param {string[] | undefined} keys keys
+	 * @param {number} minSize minimum size
+	 * @param {number} maxSize maximum size
+	 */
 	constructor(keys, minSize, maxSize) {
 		let keysMessage = "Fallback cache group";
 		if (keys) {
@@ -17,11 +23,11 @@ class MinMaxSizeWarning extends WebpackError {
 					: `Cache group ${keys[0]}`;
 		}
 		super(
-			`SplitChunksPlugin\n` +
+			"SplitChunksPlugin\n" +
 				`${keysMessage}\n` +
 				`Configured minSize (${SizeFormatHelpers.formatSize(minSize)}) is ` +
 				`bigger than maxSize (${SizeFormatHelpers.formatSize(maxSize)}).\n` +
-				"This seem to be a invalid optimiziation.splitChunks configuration."
+				"This seem to be a invalid optimization.splitChunks configuration."
 		);
 	}
 }
diff --git a/lib/optimize/ModuleConcatenationPlugin.js b/lib/optimize/ModuleConcatenationPlugin.js
index 15b7d796a39..93dc1795927 100644
--- a/lib/optimize/ModuleConcatenationPlugin.js
+++ b/lib/optimize/ModuleConcatenationPlugin.js
@@ -2,445 +2,881 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const asyncLib = require("neo-async");
+const ChunkGraph = require("../ChunkGraph");
+const ModuleGraph = require("../ModuleGraph");
+const { JS_TYPE } = require("../ModuleSourceTypesConstants");
+const { STAGE_DEFAULT } = require("../OptimizationStages");
 const HarmonyImportDependency = require("../dependencies/HarmonyImportDependency");
-const ModuleHotAcceptDependency = require("../dependencies/ModuleHotAcceptDependency");
-const ModuleHotDeclineDependency = require("../dependencies/ModuleHotDeclineDependency");
+const { compareModulesByIdentifier } = require("../util/comparators");
+const {
+	intersectRuntime,
+	mergeRuntimeOwned,
+	filterRuntime,
+	runtimeToString,
+	mergeRuntime
+} = require("../util/runtime");
 const ConcatenatedModule = require("./ConcatenatedModule");
-const HarmonyCompatibilityDependency = require("../dependencies/HarmonyCompatibilityDependency");
-const StackedSetMap = require("../util/StackedSetMap");
 
-const formatBailoutReason = msg => {
-	return "ModuleConcatenation bailout: " + msg;
-};
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../Module").BuildInfo} BuildInfo */
+/** @typedef {import("../RequestShortener")} RequestShortener */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+
+/**
+ * @typedef {object} Statistics
+ * @property {number} cached
+ * @property {number} alreadyInConfig
+ * @property {number} invalidModule
+ * @property {number} incorrectChunks
+ * @property {number} incorrectDependency
+ * @property {number} incorrectModuleDependency
+ * @property {number} incorrectChunksOfImporter
+ * @property {number} incorrectRuntimeCondition
+ * @property {number} importerFailed
+ * @property {number} added
+ */
+
+/**
+ * @param {string} msg message
+ * @returns {string} formatted message
+ */
+const formatBailoutReason = msg => `ModuleConcatenation bailout: ${msg}`;
+
+const PLUGIN_NAME = "ModuleConcatenationPlugin";
 
 class ModuleConcatenationPlugin {
-	constructor(options) {
-		if (typeof options !== "object") options = {};
-		this.options = options;
-	}
-
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		compiler.hooks.compilation.tap(
-			"ModuleConcatenationPlugin",
-			(compilation, { normalModuleFactory }) => {
-				const handler = (parser, parserOptions) => {
-					parser.hooks.call.for("eval").tap("ModuleConcatenationPlugin", () => {
-						// Because of variable renaming we can't use modules with eval.
-						parser.state.module.buildMeta.moduleConcatenationBailout = "eval()";
-					});
-				};
-
-				normalModuleFactory.hooks.parser
-					.for("javascript/auto")
-					.tap("ModuleConcatenationPlugin", handler);
-				normalModuleFactory.hooks.parser
-					.for("javascript/dynamic")
-					.tap("ModuleConcatenationPlugin", handler);
-				normalModuleFactory.hooks.parser
-					.for("javascript/esm")
-					.tap("ModuleConcatenationPlugin", handler);
-
-				const bailoutReasonMap = new Map();
-
-				const setBailoutReason = (module, reason) => {
-					bailoutReasonMap.set(module, reason);
-					module.optimizationBailout.push(
+		const { _backCompat: backCompat } = compiler;
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			if (compilation.moduleMemCaches) {
+				throw new Error(
+					"optimization.concatenateModules can't be used with cacheUnaffected as module concatenation is a global effect"
+				);
+			}
+			const moduleGraph = compilation.moduleGraph;
+			/** @type {Map string)>} */
+			const bailoutReasonMap = new Map();
+
+			/**
+			 * @param {Module} module the module
+			 * @param {string | ((requestShortener: RequestShortener) => string)} reason the reason
+			 */
+			const setBailoutReason = (module, reason) => {
+				setInnerBailoutReason(module, reason);
+				moduleGraph
+					.getOptimizationBailout(module)
+					.push(
 						typeof reason === "function"
 							? rs => formatBailoutReason(reason(rs))
 							: formatBailoutReason(reason)
 					);
-				};
+			};
+
+			/**
+			 * @param {Module} module the module
+			 * @param {string | ((requestShortener: RequestShortener) => string)} reason the reason
+			 */
+			const setInnerBailoutReason = (module, reason) => {
+				bailoutReasonMap.set(module, reason);
+			};
+
+			/**
+			 * @param {Module} module the module
+			 * @param {RequestShortener} requestShortener the request shortener
+			 * @returns {string | ((requestShortener: RequestShortener) => string) | undefined} the reason
+			 */
+			const getInnerBailoutReason = (module, requestShortener) => {
+				const reason = bailoutReasonMap.get(module);
+				if (typeof reason === "function") return reason(requestShortener);
+				return reason;
+			};
+
+			/**
+			 * @param {Module} module the module
+			 * @param {Module | ((requestShortener: RequestShortener) => string)} problem the problem
+			 * @returns {(requestShortener: RequestShortener) => string} the reason
+			 */
+			const formatBailoutWarning = (module, problem) => requestShortener => {
+				if (typeof problem === "function") {
+					return formatBailoutReason(
+						`Cannot concat with ${module.readableIdentifier(
+							requestShortener
+						)}: ${problem(requestShortener)}`
+					);
+				}
+				const reason = getInnerBailoutReason(module, requestShortener);
+				const reasonWithPrefix = reason ? `: ${reason}` : "";
+				if (module === problem) {
+					return formatBailoutReason(
+						`Cannot concat with ${module.readableIdentifier(
+							requestShortener
+						)}${reasonWithPrefix}`
+					);
+				}
+				return formatBailoutReason(
+					`Cannot concat with ${module.readableIdentifier(
+						requestShortener
+					)} because of ${problem.readableIdentifier(
+						requestShortener
+					)}${reasonWithPrefix}`
+				);
+			};
+
+			compilation.hooks.optimizeChunkModules.tapAsync(
+				{
+					name: PLUGIN_NAME,
+					stage: STAGE_DEFAULT
+				},
+				(allChunks, modules, callback) => {
+					const logger = compilation.getLogger(
+						"webpack.ModuleConcatenationPlugin"
+					);
+					const { chunkGraph, moduleGraph } = compilation;
+					const relevantModules = [];
+					const possibleInners = new Set();
+					const context = {
+						chunkGraph,
+						moduleGraph
+					};
+					logger.time("select relevant modules");
+					for (const module of modules) {
+						let canBeRoot = true;
+						let canBeInner = true;
+
+						const bailoutReason = module.getConcatenationBailoutReason(context);
+						if (bailoutReason) {
+							setBailoutReason(module, bailoutReason);
+							continue;
+						}
 
-				const getBailoutReason = (module, requestShortener) => {
-					const reason = bailoutReasonMap.get(module);
-					if (typeof reason === "function") return reason(requestShortener);
-					return reason;
-				};
+						// Must not be an async module
+						if (moduleGraph.isAsync(module)) {
+							setBailoutReason(module, "Module is async");
+							continue;
+						}
 
-				compilation.hooks.optimizeChunkModules.tap(
-					"ModuleConcatenationPlugin",
-					(chunks, modules) => {
-						const relevantModules = [];
-						const possibleInners = new Set();
-						for (const module of modules) {
-							// Only harmony modules are valid for optimization
-							if (
-								!module.buildMeta ||
-								module.buildMeta.exportsType !== "namespace" ||
-								!module.dependencies.some(
-									d => d instanceof HarmonyCompatibilityDependency
-								)
-							) {
-								setBailoutReason(module, "Module is not an ECMAScript module");
-								continue;
-							}
+						// Must be in strict mode
+						if (!(/** @type {BuildInfo} */ (module.buildInfo).strict)) {
+							setBailoutReason(module, "Module is not in strict mode");
+							continue;
+						}
 
-							// Some expressions are not compatible with module concatenation
-							// because they may produce unexpected results. The plugin bails out
-							// if some were detected upfront.
-							if (
-								module.buildMeta &&
-								module.buildMeta.moduleConcatenationBailout
-							) {
-								setBailoutReason(
-									module,
-									`Module uses ${module.buildMeta.moduleConcatenationBailout}`
-								);
-								continue;
-							}
+						// Module must be in any chunk (we don't want to do useless work)
+						if (chunkGraph.getNumberOfModuleChunks(module) === 0) {
+							setBailoutReason(module, "Module is not in any chunk");
+							continue;
+						}
 
-							// Exports must be known (and not dynamic)
-							if (!Array.isArray(module.buildMeta.providedExports)) {
-								setBailoutReason(module, "Module exports are unknown");
-								continue;
-							}
+						// Exports must be known (and not dynamic)
+						const exportsInfo = moduleGraph.getExportsInfo(module);
+						const relevantExports = exportsInfo.getRelevantExports(undefined);
+						const unknownReexports = relevantExports.filter(
+							exportInfo =>
+								exportInfo.isReexport() && !exportInfo.getTarget(moduleGraph)
+						);
+						if (unknownReexports.length > 0) {
+							setBailoutReason(
+								module,
+								`Reexports in this module do not have a static target (${Array.from(
+									unknownReexports,
+									exportInfo =>
+										`${
+											exportInfo.name || "other exports"
+										}: ${exportInfo.getUsedInfo()}`
+								).join(", ")})`
+							);
+							continue;
+						}
 
-							// Using dependency variables is not possible as this wraps the code in a function
-							if (module.variables.length > 0) {
-								setBailoutReason(
-									module,
-									`Module uses injected variables (${module.variables
-										.map(v => v.name)
-										.join(", ")})`
-								);
-								continue;
-							}
+						// Root modules must have a static list of exports
+						const unknownProvidedExports = relevantExports.filter(
+							exportInfo => exportInfo.provided !== true
+						);
+						if (unknownProvidedExports.length > 0) {
+							setBailoutReason(
+								module,
+								`List of module exports is dynamic (${Array.from(
+									unknownProvidedExports,
+									exportInfo =>
+										`${
+											exportInfo.name || "other exports"
+										}: ${exportInfo.getProvidedInfo()} and ${exportInfo.getUsedInfo()}`
+								).join(", ")})`
+							);
+							canBeRoot = false;
+						}
 
-							// Hot Module Replacement need it's own module to work correctly
-							if (
-								module.dependencies.some(
-									dep =>
-										dep instanceof ModuleHotAcceptDependency ||
-										dep instanceof ModuleHotDeclineDependency
-								)
-							) {
-								setBailoutReason(module, "Module uses Hot Module Replacement");
-								continue;
-							}
+						// Module must not be an entry point
+						if (chunkGraph.isEntryModule(module)) {
+							setInnerBailoutReason(module, "Module is an entry point");
+							canBeInner = false;
+						}
+
+						if (canBeRoot) relevantModules.push(module);
+						if (canBeInner) possibleInners.add(module);
+					}
+					logger.timeEnd("select relevant modules");
+					logger.debug(
+						`${relevantModules.length} potential root modules, ${possibleInners.size} potential inner modules`
+					);
+					// sort by depth
+					// modules with lower depth are more likely suited as roots
+					// this improves performance, because modules already selected as inner are skipped
+					logger.time("sort relevant modules");
+					relevantModules.sort(
+						(a, b) =>
+							/** @type {number} */ (moduleGraph.getDepth(a)) -
+							/** @type {number} */ (moduleGraph.getDepth(b))
+					);
+					logger.timeEnd("sort relevant modules");
+
+					/** @type {Statistics} */
+					const stats = {
+						cached: 0,
+						alreadyInConfig: 0,
+						invalidModule: 0,
+						incorrectChunks: 0,
+						incorrectDependency: 0,
+						incorrectModuleDependency: 0,
+						incorrectChunksOfImporter: 0,
+						incorrectRuntimeCondition: 0,
+						importerFailed: 0,
+						added: 0
+					};
+					let statsCandidates = 0;
+					let statsSizeSum = 0;
+					let statsEmptyConfigurations = 0;
+
+					logger.time("find modules to concatenate");
+					const concatConfigurations = [];
+					const usedAsInner = new Set();
+					for (const currentRoot of relevantModules) {
+						// when used by another configuration as inner:
+						// the other configuration is better and we can skip this one
+						// TODO reconsider that when it's only used in a different runtime
+						if (usedAsInner.has(currentRoot)) continue;
+
+						let chunkRuntime;
+						for (const r of chunkGraph.getModuleRuntimes(currentRoot)) {
+							chunkRuntime = mergeRuntimeOwned(chunkRuntime, r);
+						}
+						const exportsInfo = moduleGraph.getExportsInfo(currentRoot);
+						const filteredRuntime = filterRuntime(chunkRuntime, r =>
+							exportsInfo.isModuleUsed(r)
+						);
+						const activeRuntime =
+							filteredRuntime === true
+								? chunkRuntime
+								: filteredRuntime === false
+									? undefined
+									: filteredRuntime;
+
+						// create a configuration with the root
+						const currentConfiguration = new ConcatConfiguration(
+							currentRoot,
+							activeRuntime
+						);
 
-							relevantModules.push(module);
+						// cache failures to add modules
+						const failureCache = new Map();
 
-							// Module must not be the entry points
-							if (module.isEntryModule()) {
-								setBailoutReason(module, "Module is an entry point");
-								continue;
-							}
+						// potential optional import candidates
+						/** @type {Set} */
+						const candidates = new Set();
 
-							// Module must be in any chunk (we don't want to do useless work)
-							if (module.getNumberOfChunks() === 0) {
-								setBailoutReason(module, "Module is not in any chunk");
-								continue;
-							}
+						// try to add all imports
+						for (const imp of this._getImports(
+							compilation,
+							currentRoot,
+							activeRuntime
+						)) {
+							candidates.add(imp);
+						}
 
-							// Module must only be used by Harmony Imports
-							const nonHarmonyReasons = module.reasons.filter(
-								reason =>
-									!reason.dependency ||
-									!(reason.dependency instanceof HarmonyImportDependency)
+						for (const imp of candidates) {
+							const impCandidates = new Set();
+							const problem = this._tryToAdd(
+								compilation,
+								currentConfiguration,
+								imp,
+								chunkRuntime,
+								activeRuntime,
+								possibleInners,
+								impCandidates,
+								failureCache,
+								chunkGraph,
+								true,
+								stats
 							);
-							if (nonHarmonyReasons.length > 0) {
-								const importingModules = new Set(
-									nonHarmonyReasons.map(r => r.module).filter(Boolean)
-								);
-								const importingExplanations = new Set(
-									nonHarmonyReasons.map(r => r.explanation).filter(Boolean)
-								);
-								const importingModuleTypes = new Map(
-									Array.from(importingModules).map(
-										m => /** @type {[string, Set]} */ ([
-											m,
-											new Set(
-												nonHarmonyReasons
-													.filter(r => r.module === m)
-													.map(r => r.dependency.type)
-													.sort()
-											)
-										])
-									)
-								);
-								setBailoutReason(module, requestShortener => {
-									const names = Array.from(importingModules)
-										.map(
-											m =>
-												`${m.readableIdentifier(
-													requestShortener
-												)} (referenced with ${Array.from(
-													importingModuleTypes.get(m)
-												).join(", ")})`
-										)
-										.sort();
-									const explanations = Array.from(importingExplanations).sort();
-									if (names.length > 0 && explanations.length === 0) {
-										return `Module is referenced from these modules with unsupported syntax: ${names.join(
-											", "
-										)}`;
-									} else if (names.length === 0 && explanations.length > 0) {
-										return `Module is referenced by: ${explanations.join(
-											", "
-										)}`;
-									} else if (names.length > 0 && explanations.length > 0) {
-										return `Module is referenced from these modules with unsupported syntax: ${names.join(
-											", "
-										)} and by: ${explanations.join(", ")}`;
-									} else {
-										return "Module is referenced in a unsupported way";
-									}
-								});
-								continue;
+							if (problem) {
+								failureCache.set(imp, problem);
+								currentConfiguration.addWarning(imp, problem);
+							} else {
+								for (const c of impCandidates) {
+									candidates.add(c);
+								}
 							}
-
-							possibleInners.add(module);
 						}
-						// sort by depth
-						// modules with lower depth are more likely suited as roots
-						// this improves performance, because modules already selected as inner are skipped
-						relevantModules.sort((a, b) => {
-							return a.depth - b.depth;
-						});
-						const concatConfigurations = [];
-						const usedAsInner = new Set();
-						for (const currentRoot of relevantModules) {
-							// when used by another configuration as inner:
-							// the other configuration is better and we can skip this one
-							if (usedAsInner.has(currentRoot)) continue;
-
-							// create a configuration with the root
-							const currentConfiguration = new ConcatConfiguration(currentRoot);
-
-							// cache failures to add modules
-							const failureCache = new Map();
-
-							// try to add all imports
-							for (const imp of this._getImports(compilation, currentRoot)) {
-								const problem = this._tryToAdd(
-									compilation,
-									currentConfiguration,
-									imp,
-									possibleInners,
-									failureCache
-								);
-								if (problem) {
-									failureCache.set(imp, problem);
-									currentConfiguration.addWarning(imp, problem);
+						statsCandidates += candidates.size;
+						if (!currentConfiguration.isEmpty()) {
+							const modules = currentConfiguration.getModules();
+							statsSizeSum += modules.size;
+							concatConfigurations.push(currentConfiguration);
+							for (const module of modules) {
+								if (module !== currentConfiguration.rootModule) {
+									usedAsInner.add(module);
 								}
 							}
-							if (!currentConfiguration.isEmpty()) {
-								concatConfigurations.push(currentConfiguration);
-								for (const module of currentConfiguration.getModules()) {
-									if (module !== currentConfiguration.rootModule) {
-										usedAsInner.add(module);
-									}
-								}
+						} else {
+							statsEmptyConfigurations++;
+							const optimizationBailouts =
+								moduleGraph.getOptimizationBailout(currentRoot);
+							for (const warning of currentConfiguration.getWarningsSorted()) {
+								optimizationBailouts.push(
+									formatBailoutWarning(warning[0], warning[1])
+								);
 							}
 						}
-						// HACK: Sort configurations by length and start with the longest one
-						// to get the biggers groups possible. Used modules are marked with usedModules
-						// TODO: Allow to reuse existing configuration while trying to add dependencies.
-						// This would improve performance. O(n^2) -> O(n)
-						concatConfigurations.sort((a, b) => {
-							return b.modules.size - a.modules.size;
-						});
-						const usedModules = new Set();
-						for (const concatConfiguration of concatConfigurations) {
-							if (usedModules.has(concatConfiguration.rootModule)) continue;
-							const modules = concatConfiguration.getModules();
+					}
+					logger.timeEnd("find modules to concatenate");
+					logger.debug(
+						`${
+							concatConfigurations.length
+						} successful concat configurations (avg size: ${
+							statsSizeSum / concatConfigurations.length
+						}), ${statsEmptyConfigurations} bailed out completely`
+					);
+					logger.debug(
+						`${statsCandidates} candidates were considered for adding (${stats.cached} cached failure, ${stats.alreadyInConfig} already in config, ${stats.invalidModule} invalid module, ${stats.incorrectChunks} incorrect chunks, ${stats.incorrectDependency} incorrect dependency, ${stats.incorrectChunksOfImporter} incorrect chunks of importer, ${stats.incorrectModuleDependency} incorrect module dependency, ${stats.incorrectRuntimeCondition} incorrect runtime condition, ${stats.importerFailed} importer failed, ${stats.added} added)`
+					);
+					// HACK: Sort configurations by length and start with the longest one
+					// to get the biggest groups possible. Used modules are marked with usedModules
+					// TODO: Allow to reuse existing configuration while trying to add dependencies.
+					// This would improve performance. O(n^2) -> O(n)
+					logger.time("sort concat configurations");
+					concatConfigurations.sort((a, b) => b.modules.size - a.modules.size);
+					logger.timeEnd("sort concat configurations");
+					const usedModules = new Set();
+
+					logger.time("create concatenated modules");
+					asyncLib.each(
+						concatConfigurations,
+						(concatConfiguration, callback) => {
 							const rootModule = concatConfiguration.rootModule;
-							const newModule = new ConcatenatedModule(
+
+							// Avoid overlapping configurations
+							// TODO: remove this when todo above is fixed
+							if (usedModules.has(rootModule)) return callback();
+							const modules = concatConfiguration.getModules();
+							for (const m of modules) {
+								usedModules.add(m);
+							}
+
+							// Create a new ConcatenatedModule
+							ConcatenatedModule.getCompilationHooks(compilation);
+							const newModule = ConcatenatedModule.create(
 								rootModule,
-								Array.from(modules),
-								ConcatenatedModule.createConcatenationList(
-									rootModule,
-									modules,
-									compilation
-								)
+								modules,
+								concatConfiguration.runtime,
+								compilation,
+								compiler.root,
+								compilation.outputOptions.hashFunction
 							);
-							for (const warning of concatConfiguration.getWarningsSorted()) {
-								newModule.optimizationBailout.push(requestShortener => {
-									const reason = getBailoutReason(warning[0], requestShortener);
-									const reasonWithPrefix = reason ? ` (<- ${reason})` : "";
-									if (warning[0] === warning[1]) {
-										return formatBailoutReason(
-											`Cannot concat with ${warning[0].readableIdentifier(
-												requestShortener
-											)}${reasonWithPrefix}`
-										);
-									} else {
-										return formatBailoutReason(
-											`Cannot concat with ${warning[0].readableIdentifier(
-												requestShortener
-											)} because of ${warning[1].readableIdentifier(
-												requestShortener
-											)}${reasonWithPrefix}`
-										);
+
+							const build = () => {
+								newModule.build(
+									compiler.options,
+									compilation,
+									/** @type {EXPECTED_ANY} */
+									(null),
+									/** @type {EXPECTED_ANY} */
+									(null),
+									err => {
+										if (err) {
+											if (!err.module) {
+												err.module = newModule;
+											}
+											return callback(err);
+										}
+										integrate();
 									}
-								});
-							}
-							const chunks = concatConfiguration.rootModule.getChunks();
-							for (const m of modules) {
-								usedModules.add(m);
-								for (const chunk of chunks) {
-									chunk.removeModule(m);
+								);
+							};
+
+							const integrate = () => {
+								if (backCompat) {
+									ChunkGraph.setChunkGraphForModule(newModule, chunkGraph);
+									ModuleGraph.setModuleGraphForModule(newModule, moduleGraph);
 								}
-							}
-							for (const chunk of chunks) {
-								chunk.addModule(newModule);
-								newModule.addChunk(chunk);
-								if (chunk.entryModule === concatConfiguration.rootModule) {
-									chunk.entryModule = newModule;
+
+								for (const warning of concatConfiguration.getWarningsSorted()) {
+									moduleGraph
+										.getOptimizationBailout(newModule)
+										.push(formatBailoutWarning(warning[0], warning[1]));
 								}
-							}
-							compilation.modules.push(newModule);
-							for (const reason of newModule.reasons) {
-								if (reason.dependency.module === concatConfiguration.rootModule)
-									reason.dependency.module = newModule;
-								if (
-									reason.dependency.redirectedModule ===
-									concatConfiguration.rootModule
-								)
-									reason.dependency.redirectedModule = newModule;
-							}
-							// TODO: remove when LTS node version contains fixed v8 version
-							// @see https://github.com/webpack/webpack/pull/6613
-							// Turbofan does not correctly inline for-of loops with polymorphic input arrays.
-							// Work around issue by using a standard for loop and assigning dep.module.reasons
-							for (let i = 0; i < newModule.dependencies.length; i++) {
-								let dep = newModule.dependencies[i];
-								if (dep.module) {
-									let reasons = dep.module.reasons;
-									for (let j = 0; j < reasons.length; j++) {
-										let reason = reasons[j];
-										if (reason.dependency === dep) {
-											reason.module = newModule;
+								moduleGraph.cloneModuleAttributes(rootModule, newModule);
+								for (const m of modules) {
+									// add to builtModules when one of the included modules was built
+									if (compilation.builtModules.has(m)) {
+										compilation.builtModules.add(newModule);
+									}
+									if (m !== rootModule) {
+										// attach external references to the concatenated module too
+										moduleGraph.copyOutgoingModuleConnections(
+											m,
+											newModule,
+											c =>
+												c.originModule === m &&
+												!(
+													c.dependency instanceof HarmonyImportDependency &&
+													modules.has(c.module)
+												)
+										);
+										// remove module from chunk
+										for (const chunk of chunkGraph.getModuleChunksIterable(
+											rootModule
+										)) {
+											const sourceTypes = chunkGraph.getChunkModuleSourceTypes(
+												chunk,
+												m
+											);
+											if (sourceTypes.size === 1) {
+												chunkGraph.disconnectChunkAndModule(chunk, m);
+											} else {
+												const newSourceTypes = new Set(sourceTypes);
+												newSourceTypes.delete(JS_TYPE);
+												chunkGraph.setChunkModuleSourceTypes(
+													chunk,
+													m,
+													newSourceTypes
+												);
+											}
 										}
 									}
 								}
-							}
+								compilation.modules.delete(rootModule);
+								ChunkGraph.clearChunkGraphForModule(rootModule);
+								ModuleGraph.clearModuleGraphForModule(rootModule);
+
+								// remove module from chunk
+								chunkGraph.replaceModule(rootModule, newModule);
+								// replace module references with the concatenated module
+								moduleGraph.moveModuleConnections(rootModule, newModule, c => {
+									const otherModule =
+										c.module === rootModule ? c.originModule : c.module;
+									const innerConnection =
+										c.dependency instanceof HarmonyImportDependency &&
+										modules.has(/** @type {Module} */ (otherModule));
+									return !innerConnection;
+								});
+								// add concatenated module to the compilation
+								compilation.modules.add(newModule);
+
+								callback();
+							};
+
+							build();
+						},
+						err => {
+							logger.timeEnd("create concatenated modules");
+							process.nextTick(callback.bind(null, err));
 						}
-						compilation.modules = compilation.modules.filter(
-							m => !usedModules.has(m)
-						);
-					}
-				);
-			}
-		);
+					);
+				}
+			);
+		});
 	}
 
-	_getImports(compilation, module) {
-		return new Set(
-			module.dependencies
-
-				// Get reference info only for harmony Dependencies
-				.map(dep => {
-					if (!(dep instanceof HarmonyImportDependency)) return null;
-					if (!compilation) return dep.getReference();
-					return compilation.getDependencyReference(module, dep);
-				})
-
-				// Reference is valid and has a module
-				// Dependencies are simple enough to concat them
-				.filter(
-					ref =>
-						ref &&
-						ref.module &&
-						(Array.isArray(ref.importedNames) ||
-							Array.isArray(ref.module.buildMeta.providedExports))
-				)
-
-				// Take the imported module
-				.map(ref => ref.module)
-		);
+	/**
+	 * @param {Compilation} compilation the compilation
+	 * @param {Module} module the module to be added
+	 * @param {RuntimeSpec} runtime the runtime scope
+	 * @returns {Set} the imported modules
+	 */
+	_getImports(compilation, module, runtime) {
+		const moduleGraph = compilation.moduleGraph;
+		const set = new Set();
+		for (const dep of module.dependencies) {
+			// Get reference info only for harmony Dependencies
+			if (!(dep instanceof HarmonyImportDependency)) continue;
+
+			const connection = moduleGraph.getConnection(dep);
+			// Reference is valid and has a module
+			if (
+				!connection ||
+				!connection.module ||
+				!connection.isTargetActive(runtime)
+			) {
+				continue;
+			}
+
+			const importedNames = compilation.getDependencyReferencedExports(
+				dep,
+				undefined
+			);
+
+			if (
+				importedNames.every(i =>
+					Array.isArray(i) ? i.length > 0 : i.name.length > 0
+				) ||
+				Array.isArray(moduleGraph.getProvidedExports(module))
+			) {
+				set.add(connection.module);
+			}
+		}
+		return set;
 	}
 
-	_tryToAdd(compilation, config, module, possibleModules, failureCache) {
+	/**
+	 * @param {Compilation} compilation webpack compilation
+	 * @param {ConcatConfiguration} config concat configuration (will be modified when added)
+	 * @param {Module} module the module to be added
+	 * @param {RuntimeSpec} runtime the runtime scope of the generated code
+	 * @param {RuntimeSpec} activeRuntime the runtime scope of the root module
+	 * @param {Set} possibleModules modules that are candidates
+	 * @param {Set} candidates list of potential candidates (will be added to)
+	 * @param {Map string)>} failureCache cache for problematic modules to be more performant
+	 * @param {ChunkGraph} chunkGraph the chunk graph
+	 * @param {boolean} avoidMutateOnFailure avoid mutating the config when adding fails
+	 * @param {Statistics} statistics gathering metrics
+	 * @returns {null | Module | ((requestShortener: RequestShortener) => string)} the problematic module
+	 */
+	_tryToAdd(
+		compilation,
+		config,
+		module,
+		runtime,
+		activeRuntime,
+		possibleModules,
+		candidates,
+		failureCache,
+		chunkGraph,
+		avoidMutateOnFailure,
+		statistics
+	) {
 		const cacheEntry = failureCache.get(module);
 		if (cacheEntry) {
+			statistics.cached++;
 			return cacheEntry;
 		}
 
 		// Already added?
 		if (config.has(module)) {
+			statistics.alreadyInConfig++;
 			return null;
 		}
 
 		// Not possible to add?
 		if (!possibleModules.has(module)) {
+			statistics.invalidModule++;
 			failureCache.set(module, module); // cache failures for performance
 			return module;
 		}
 
-		// module must be in the same chunks
-		if (!config.rootModule.hasEqualsChunks(module)) {
-			failureCache.set(module, module); // cache failures for performance
-			return module;
+		// Module must be in the correct chunks
+		const missingChunks = Array.from(
+			chunkGraph.getModuleChunksIterable(config.rootModule)
+		).filter(chunk => !chunkGraph.isModuleInChunk(module, chunk));
+		if (missingChunks.length > 0) {
+			/**
+			 * @param {RequestShortener} requestShortener request shortener
+			 * @returns {string} problem description
+			 */
+			const problem = requestShortener => {
+				const missingChunksList = Array.from(
+					new Set(missingChunks.map(chunk => chunk.name || "unnamed chunk(s)"))
+				).sort();
+				const chunks = Array.from(
+					new Set(
+						Array.from(chunkGraph.getModuleChunksIterable(module)).map(
+							chunk => chunk.name || "unnamed chunk(s)"
+						)
+					)
+				).sort();
+				return `Module ${module.readableIdentifier(
+					requestShortener
+				)} is not in the same chunk(s) (expected in chunk(s) ${missingChunksList.join(
+					", "
+				)}, module is in chunk(s) ${chunks.join(", ")})`;
+			};
+			statistics.incorrectChunks++;
+			failureCache.set(module, problem); // cache failures for performance
+			return problem;
 		}
 
-		// Clone config to make experimental changes
-		const testConfig = config.clone();
+		const moduleGraph = compilation.moduleGraph;
 
-		// Add the module
-		testConfig.add(module);
+		const incomingConnections =
+			moduleGraph.getIncomingConnectionsByOriginModule(module);
 
-		// Every module which depends on the added module must be in the configuration too.
-		for (const reason of module.reasons) {
-			// Modules that are not used can be ignored
-			if (
-				reason.module.factoryMeta.sideEffectFree &&
-				reason.module.used === false
-			)
-				continue;
+		const incomingConnectionsFromNonModules =
+			incomingConnections.get(null) || incomingConnections.get(undefined);
+		if (incomingConnectionsFromNonModules) {
+			const activeNonModulesConnections =
+				incomingConnectionsFromNonModules.filter(connection =>
+					// We are not interested in inactive connections
+					// or connections without dependency
+					connection.isActive(runtime)
+				);
+			if (activeNonModulesConnections.length > 0) {
+				/**
+				 * @param {RequestShortener} requestShortener request shortener
+				 * @returns {string} problem description
+				 */
+				const problem = requestShortener => {
+					const importingExplanations = new Set(
+						activeNonModulesConnections.map(c => c.explanation).filter(Boolean)
+					);
+					const explanations = Array.from(importingExplanations).sort();
+					return `Module ${module.readableIdentifier(
+						requestShortener
+					)} is referenced ${
+						explanations.length > 0
+							? `by: ${explanations.join(", ")}`
+							: "in an unsupported way"
+					}`;
+				};
+				statistics.incorrectDependency++;
+				failureCache.set(module, problem); // cache failures for performance
+				return problem;
+			}
+		}
 
-			const problem = this._tryToAdd(
-				compilation,
-				testConfig,
-				reason.module,
-				possibleModules,
-				failureCache
+		/** @type {Map} */
+		const incomingConnectionsFromModules = new Map();
+		for (const [originModule, connections] of incomingConnections) {
+			if (originModule) {
+				// Ignore connection from orphan modules
+				if (chunkGraph.getNumberOfModuleChunks(originModule) === 0) continue;
+
+				// We don't care for connections from other runtimes
+				let originRuntime;
+				for (const r of chunkGraph.getModuleRuntimes(originModule)) {
+					originRuntime = mergeRuntimeOwned(originRuntime, r);
+				}
+
+				if (!intersectRuntime(runtime, originRuntime)) continue;
+
+				// We are not interested in inactive connections
+				const activeConnections = connections.filter(connection =>
+					connection.isActive(runtime)
+				);
+				if (activeConnections.length > 0)
+					incomingConnectionsFromModules.set(originModule, activeConnections);
+			}
+		}
+
+		const incomingModules = Array.from(incomingConnectionsFromModules.keys());
+
+		// Module must be in the same chunks like the referencing module
+		const otherChunkModules = incomingModules.filter(originModule => {
+			for (const chunk of chunkGraph.getModuleChunksIterable(
+				config.rootModule
+			)) {
+				if (!chunkGraph.isModuleInChunk(originModule, chunk)) {
+					return true;
+				}
+			}
+			return false;
+		});
+		if (otherChunkModules.length > 0) {
+			/**
+			 * @param {RequestShortener} requestShortener request shortener
+			 * @returns {string} problem description
+			 */
+			const problem = requestShortener => {
+				const names = otherChunkModules
+					.map(m => m.readableIdentifier(requestShortener))
+					.sort();
+				return `Module ${module.readableIdentifier(
+					requestShortener
+				)} is referenced from different chunks by these modules: ${names.join(
+					", "
+				)}`;
+			};
+			statistics.incorrectChunksOfImporter++;
+			failureCache.set(module, problem); // cache failures for performance
+			return problem;
+		}
+
+		/** @type {Map} */
+		const nonHarmonyConnections = new Map();
+		for (const [originModule, connections] of incomingConnectionsFromModules) {
+			const selected = connections.filter(
+				connection =>
+					!connection.dependency ||
+					!(connection.dependency instanceof HarmonyImportDependency)
 			);
-			if (problem) {
+			if (selected.length > 0)
+				nonHarmonyConnections.set(originModule, connections);
+		}
+		if (nonHarmonyConnections.size > 0) {
+			/**
+			 * @param {RequestShortener} requestShortener request shortener
+			 * @returns {string} problem description
+			 */
+			const problem = requestShortener => {
+				const names = Array.from(nonHarmonyConnections)
+					.map(
+						([originModule, connections]) =>
+							`${originModule.readableIdentifier(
+								requestShortener
+							)} (referenced with ${Array.from(
+								new Set(
+									connections
+										.map(c => c.dependency && c.dependency.type)
+										.filter(Boolean)
+								)
+							)
+								.sort()
+								.join(", ")})`
+					)
+					.sort();
+				return `Module ${module.readableIdentifier(
+					requestShortener
+				)} is referenced from these modules with unsupported syntax: ${names.join(
+					", "
+				)}`;
+			};
+			statistics.incorrectModuleDependency++;
+			failureCache.set(module, problem); // cache failures for performance
+			return problem;
+		}
+
+		if (runtime !== undefined && typeof runtime !== "string") {
+			// Module must be consistently referenced in the same runtimes
+			/** @type {{ originModule: Module, runtimeCondition: RuntimeSpec }[]} */
+			const otherRuntimeConnections = [];
+			outer: for (const [
+				originModule,
+				connections
+			] of incomingConnectionsFromModules) {
+				/** @type {false | RuntimeSpec} */
+				let currentRuntimeCondition = false;
+				for (const connection of connections) {
+					const runtimeCondition = filterRuntime(runtime, runtime =>
+						connection.isTargetActive(runtime)
+					);
+					if (runtimeCondition === false) continue;
+					if (runtimeCondition === true) continue outer;
+					currentRuntimeCondition =
+						currentRuntimeCondition !== false
+							? mergeRuntime(currentRuntimeCondition, runtimeCondition)
+							: runtimeCondition;
+				}
+				if (currentRuntimeCondition !== false) {
+					otherRuntimeConnections.push({
+						originModule,
+						runtimeCondition: currentRuntimeCondition
+					});
+				}
+			}
+			if (otherRuntimeConnections.length > 0) {
+				/**
+				 * @param {RequestShortener} requestShortener request shortener
+				 * @returns {string} problem description
+				 */
+				const problem = requestShortener =>
+					`Module ${module.readableIdentifier(
+						requestShortener
+					)} is runtime-dependent referenced by these modules: ${Array.from(
+						otherRuntimeConnections,
+						({ originModule, runtimeCondition }) =>
+							`${originModule.readableIdentifier(
+								requestShortener
+							)} (expected runtime ${runtimeToString(
+								runtime
+							)}, module is only referenced in ${runtimeToString(
+								/** @type {RuntimeSpec} */ (runtimeCondition)
+							)})`
+					).join(", ")}`;
+				statistics.incorrectRuntimeCondition++;
 				failureCache.set(module, problem); // cache failures for performance
 				return problem;
 			}
 		}
 
-		// Commit experimental changes
-		config.set(testConfig);
+		let backup;
+		if (avoidMutateOnFailure) {
+			backup = config.snapshot();
+		}
+
+		// Add the module
+		config.add(module);
+
+		incomingModules.sort(compareModulesByIdentifier);
 
-		// Eagerly try to add imports too if possible
-		for (const imp of this._getImports(compilation, module)) {
+		// Every module which depends on the added module must be in the configuration too.
+		for (const originModule of incomingModules) {
 			const problem = this._tryToAdd(
 				compilation,
 				config,
-				imp,
+				originModule,
+				runtime,
+				activeRuntime,
 				possibleModules,
-				failureCache
+				candidates,
+				failureCache,
+				chunkGraph,
+				false,
+				statistics
 			);
 			if (problem) {
-				config.addWarning(imp, problem);
+				if (backup !== undefined) config.rollback(backup);
+				statistics.importerFailed++;
+				failureCache.set(module, problem); // cache failures for performance
+				return problem;
 			}
 		}
+
+		// Add imports to possible candidates list
+		for (const imp of this._getImports(compilation, module, runtime)) {
+			candidates.add(imp);
+		}
+		statistics.added++;
 		return null;
 	}
 }
 
+/** @typedef {Module | ((requestShortener: RequestShortener) => string)} Problem */
+
 class ConcatConfiguration {
-	constructor(rootModule, cloneFrom) {
+	/**
+	 * @param {Module} rootModule the root module
+	 * @param {RuntimeSpec} runtime the runtime
+	 */
+	constructor(rootModule, runtime) {
 		this.rootModule = rootModule;
-		if (cloneFrom) {
-			this.modules = cloneFrom.modules.createChild(5);
-			this.warnings = cloneFrom.warnings.createChild(5);
-		} else {
-			this.modules = new StackedSetMap();
-			this.modules.add(rootModule);
-			this.warnings = new StackedSetMap();
-		}
+		this.runtime = runtime;
+		/** @type {Set} */
+		this.modules = new Set();
+		this.modules.add(rootModule);
+		/** @type {Map} */
+		this.warnings = new Map();
 	}
 
+	/**
+	 * @param {Module} module the module
+	 */
 	add(module) {
 		this.modules.add(module);
 	}
 
+	/**
+	 * @param {Module} module the module
+	 * @returns {boolean} true, when the module is in the module set
+	 */
 	has(module) {
 		return this.modules.has(module);
 	}
@@ -449,13 +885,20 @@ class ConcatConfiguration {
 		return this.modules.size === 1;
 	}
 
+	/**
+	 * @param {Module} module the module
+	 * @param {Problem} problem the problem
+	 */
 	addWarning(module, problem) {
 		this.warnings.set(module, problem);
 	}
 
+	/**
+	 * @returns {Map} warnings
+	 */
 	getWarningsSorted() {
 		return new Map(
-			this.warnings.asPairArray().sort((a, b) => {
+			Array.from(this.warnings).sort((a, b) => {
 				const ai = a[0].identifier();
 				const bi = b[0].identifier();
 				if (ai < bi) return -1;
@@ -465,18 +908,29 @@ class ConcatConfiguration {
 		);
 	}
 
+	/**
+	 * @returns {Set} modules as set
+	 */
 	getModules() {
-		return this.modules.asSet();
+		return this.modules;
 	}
 
-	clone() {
-		return new ConcatConfiguration(this.rootModule, this);
+	snapshot() {
+		return this.modules.size;
 	}
 
-	set(config) {
-		this.rootModule = config.rootModule;
-		this.modules = config.modules;
-		this.warnings = config.warnings;
+	/**
+	 * @param {number} snapshot snapshot
+	 */
+	rollback(snapshot) {
+		const modules = this.modules;
+		for (const m of modules) {
+			if (snapshot === 0) {
+				modules.delete(m);
+			} else {
+				snapshot--;
+			}
+		}
 	}
 }
 
diff --git a/lib/optimize/NaturalChunkOrderPlugin.js b/lib/optimize/NaturalChunkOrderPlugin.js
deleted file mode 100644
index 00f8010d8b8..00000000000
--- a/lib/optimize/NaturalChunkOrderPlugin.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-/** @typedef {import("../Compiler")} Compiler */
-
-class NaturalChunkOrderPlugin {
-	/**
-	 * @param {Compiler} compiler webpack compiler
-	 * @returns {void}
-	 */
-	apply(compiler) {
-		compiler.hooks.compilation.tap("NaturalChunkOrderPlugin", compilation => {
-			compilation.hooks.optimizeChunkOrder.tap(
-				"NaturalChunkOrderPlugin",
-				chunks => {
-					chunks.sort((chunkA, chunkB) => {
-						const a = chunkA.modulesIterable[Symbol.iterator]();
-						const b = chunkB.modulesIterable[Symbol.iterator]();
-						// eslint-disable-next-line no-constant-condition
-						while (true) {
-							const aItem = a.next();
-							const bItem = b.next();
-							if (aItem.done && bItem.done) return 0;
-							if (aItem.done) return -1;
-							if (bItem.done) return 1;
-							const aModuleId = aItem.value.id;
-							const bModuleId = bItem.value.id;
-							if (aModuleId < bModuleId) return -1;
-							if (aModuleId > bModuleId) return 1;
-						}
-					});
-				}
-			);
-		});
-	}
-}
-
-module.exports = NaturalChunkOrderPlugin;
diff --git a/lib/optimize/OccurrenceChunkOrderPlugin.js b/lib/optimize/OccurrenceChunkOrderPlugin.js
deleted file mode 100644
index 4f7ec9a4fff..00000000000
--- a/lib/optimize/OccurrenceChunkOrderPlugin.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const validateOptions = require("schema-utils");
-const schema = require("../../schemas/plugins/optimize/OccurrenceOrderChunkIdsPlugin.json");
-
-/** @typedef {import("../../declarations/plugins/optimize/OccurrenceOrderChunkIdsPlugin").OccurrenceOrderChunkIdsPluginOptions} OccurrenceOrderChunkIdsPluginOptions */
-
-class OccurrenceOrderChunkIdsPlugin {
-	/**
-	 * @param {OccurrenceOrderChunkIdsPluginOptions=} options options object
-	 */
-	constructor(options = {}) {
-		validateOptions(schema, options, "Occurrence Order Chunk Ids Plugin");
-		this.options = options;
-	}
-
-	apply(compiler) {
-		const prioritiseInitial = this.options.prioritiseInitial;
-		compiler.hooks.compilation.tap(
-			"OccurrenceOrderChunkIdsPlugin",
-			compilation => {
-				compilation.hooks.optimizeChunkOrder.tap(
-					"OccurrenceOrderChunkIdsPlugin",
-					chunks => {
-						const occursInInitialChunksMap = new Map();
-						const originalOrder = new Map();
-
-						let i = 0;
-						for (const c of chunks) {
-							let occurs = 0;
-							for (const chunkGroup of c.groupsIterable) {
-								for (const parent of chunkGroup.parentsIterable) {
-									if (parent.isInitial()) occurs++;
-								}
-							}
-							occursInInitialChunksMap.set(c, occurs);
-							originalOrder.set(c, i++);
-						}
-
-						chunks.sort((a, b) => {
-							if (prioritiseInitial) {
-								const aEntryOccurs = occursInInitialChunksMap.get(a);
-								const bEntryOccurs = occursInInitialChunksMap.get(b);
-								if (aEntryOccurs > bEntryOccurs) return -1;
-								if (aEntryOccurs < bEntryOccurs) return 1;
-							}
-							const aOccurs = a.getNumberOfGroups();
-							const bOccurs = b.getNumberOfGroups();
-							if (aOccurs > bOccurs) return -1;
-							if (aOccurs < bOccurs) return 1;
-							const orgA = originalOrder.get(a);
-							const orgB = originalOrder.get(b);
-							return orgA - orgB;
-						});
-					}
-				);
-			}
-		);
-	}
-}
-
-module.exports = OccurrenceOrderChunkIdsPlugin;
diff --git a/lib/optimize/OccurrenceModuleOrderPlugin.js b/lib/optimize/OccurrenceModuleOrderPlugin.js
deleted file mode 100644
index cb9a3e8d034..00000000000
--- a/lib/optimize/OccurrenceModuleOrderPlugin.js
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-const validateOptions = require("schema-utils");
-const schema = require("../../schemas/plugins/optimize/OccurrenceOrderModuleIdsPlugin.json");
-
-/** @typedef {import("../../declarations/plugins/optimize/OccurrenceOrderModuleIdsPlugin").OccurrenceOrderModuleIdsPluginOptions} OccurrenceOrderModuleIdsPluginOptions */
-
-class OccurrenceOrderModuleIdsPlugin {
-	/**
-	 * @param {OccurrenceOrderModuleIdsPluginOptions=} options options object
-	 */
-	constructor(options = {}) {
-		validateOptions(schema, options, "Occurrence Order Module Ids Plugin");
-		this.options = options;
-	}
-
-	apply(compiler) {
-		const prioritiseInitial = this.options.prioritiseInitial;
-		compiler.hooks.compilation.tap(
-			"OccurrenceOrderModuleIdsPlugin",
-			compilation => {
-				compilation.hooks.optimizeModuleOrder.tap(
-					"OccurrenceOrderModuleIdsPlugin",
-					modules => {
-						const occursInInitialChunksMap = new Map();
-						const occursInAllChunksMap = new Map();
-
-						const initialChunkChunkMap = new Map();
-						const entryCountMap = new Map();
-						for (const m of modules) {
-							let initial = 0;
-							let entry = 0;
-							for (const c of m.chunksIterable) {
-								if (c.canBeInitial()) initial++;
-								if (c.entryModule === m) entry++;
-							}
-							initialChunkChunkMap.set(m, initial);
-							entryCountMap.set(m, entry);
-						}
-
-						const countOccursInEntry = (sum, r) => {
-							if (!r.module) {
-								return sum;
-							}
-							const count = initialChunkChunkMap.get(r.module);
-							if (!count) {
-								return sum;
-							}
-							return sum + count;
-						};
-						const countOccurs = (sum, r) => {
-							if (!r.module) {
-								return sum;
-							}
-							let factor = 1;
-							if (typeof r.dependency.getNumberOfIdOccurrences === "function") {
-								factor = r.dependency.getNumberOfIdOccurrences();
-							}
-							if (factor === 0) {
-								return sum;
-							}
-							return sum + factor * r.module.getNumberOfChunks();
-						};
-
-						if (prioritiseInitial) {
-							for (const m of modules) {
-								const result =
-									m.reasons.reduce(countOccursInEntry, 0) +
-									initialChunkChunkMap.get(m) +
-									entryCountMap.get(m);
-								occursInInitialChunksMap.set(m, result);
-							}
-						}
-
-						const originalOrder = new Map();
-						let i = 0;
-						for (const m of modules) {
-							const result =
-								m.reasons.reduce(countOccurs, 0) +
-								m.getNumberOfChunks() +
-								entryCountMap.get(m);
-							occursInAllChunksMap.set(m, result);
-							originalOrder.set(m, i++);
-						}
-
-						modules.sort((a, b) => {
-							if (prioritiseInitial) {
-								const aEntryOccurs = occursInInitialChunksMap.get(a);
-								const bEntryOccurs = occursInInitialChunksMap.get(b);
-								if (aEntryOccurs > bEntryOccurs) return -1;
-								if (aEntryOccurs < bEntryOccurs) return 1;
-							}
-							const aOccurs = occursInAllChunksMap.get(a);
-							const bOccurs = occursInAllChunksMap.get(b);
-							if (aOccurs > bOccurs) return -1;
-							if (aOccurs < bOccurs) return 1;
-							const orgA = originalOrder.get(a);
-							const orgB = originalOrder.get(b);
-							return orgA - orgB;
-						});
-					}
-				);
-			}
-		);
-	}
-}
-
-module.exports = OccurrenceOrderModuleIdsPlugin;
diff --git a/lib/optimize/OccurrenceOrderPlugin.js b/lib/optimize/OccurrenceOrderPlugin.js
deleted file mode 100644
index c73ec8e5750..00000000000
--- a/lib/optimize/OccurrenceOrderPlugin.js
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
-	MIT License http://www.opensource.org/licenses/mit-license.php
-	Author Tobias Koppers @sokra
-*/
-"use strict";
-
-// TODO webpack 5 remove this plugin
-// It has been splitted into separate plugins for modules and chunks
-class OccurrenceOrderPlugin {
-	constructor(preferEntry) {
-		if (preferEntry !== undefined && typeof preferEntry !== "boolean") {
-			throw new Error(
-				"Argument should be a boolean.\nFor more info on this plugin, see https://webpack.js.org/plugins/"
-			);
-		}
-		this.preferEntry = preferEntry;
-	}
-	apply(compiler) {
-		const preferEntry = this.preferEntry;
-		compiler.hooks.compilation.tap("OccurrenceOrderPlugin", compilation => {
-			compilation.hooks.optimizeModuleOrder.tap(
-				"OccurrenceOrderPlugin",
-				modules => {
-					const occursInInitialChunksMap = new Map();
-					const occursInAllChunksMap = new Map();
-
-					const initialChunkChunkMap = new Map();
-					const entryCountMap = new Map();
-					for (const m of modules) {
-						let initial = 0;
-						let entry = 0;
-						for (const c of m.chunksIterable) {
-							if (c.canBeInitial()) initial++;
-							if (c.entryModule === m) entry++;
-						}
-						initialChunkChunkMap.set(m, initial);
-						entryCountMap.set(m, entry);
-					}
-
-					const countOccursInEntry = (sum, r) => {
-						if (!r.module) {
-							return sum;
-						}
-						return sum + initialChunkChunkMap.get(r.module);
-					};
-					const countOccurs = (sum, r) => {
-						if (!r.module) {
-							return sum;
-						}
-						let factor = 1;
-						if (typeof r.dependency.getNumberOfIdOccurrences === "function") {
-							factor = r.dependency.getNumberOfIdOccurrences();
-						}
-						if (factor === 0) {
-							return sum;
-						}
-						return sum + factor * r.module.getNumberOfChunks();
-					};
-
-					if (preferEntry) {
-						for (const m of modules) {
-							const result =
-								m.reasons.reduce(countOccursInEntry, 0) +
-								initialChunkChunkMap.get(m) +
-								entryCountMap.get(m);
-							occursInInitialChunksMap.set(m, result);
-						}
-					}
-
-					const originalOrder = new Map();
-					let i = 0;
-					for (const m of modules) {
-						const result =
-							m.reasons.reduce(countOccurs, 0) +
-							m.getNumberOfChunks() +
-							entryCountMap.get(m);
-						occursInAllChunksMap.set(m, result);
-						originalOrder.set(m, i++);
-					}
-
-					modules.sort((a, b) => {
-						if (preferEntry) {
-							const aEntryOccurs = occursInInitialChunksMap.get(a);
-							const bEntryOccurs = occursInInitialChunksMap.get(b);
-							if (aEntryOccurs > bEntryOccurs) return -1;
-							if (aEntryOccurs < bEntryOccurs) return 1;
-						}
-						const aOccurs = occursInAllChunksMap.get(a);
-						const bOccurs = occursInAllChunksMap.get(b);
-						if (aOccurs > bOccurs) return -1;
-						if (aOccurs < bOccurs) return 1;
-						const orgA = originalOrder.get(a);
-						const orgB = originalOrder.get(b);
-						return orgA - orgB;
-					});
-				}
-			);
-			compilation.hooks.optimizeChunkOrder.tap(
-				"OccurrenceOrderPlugin",
-				chunks => {
-					const occursInInitialChunksMap = new Map();
-					const originalOrder = new Map();
-
-					let i = 0;
-					for (const c of chunks) {
-						let occurs = 0;
-						for (const chunkGroup of c.groupsIterable) {
-							for (const parent of chunkGroup.parentsIterable) {
-								if (parent.isInitial()) occurs++;
-							}
-						}
-						occursInInitialChunksMap.set(c, occurs);
-						originalOrder.set(c, i++);
-					}
-
-					chunks.sort((a, b) => {
-						const aEntryOccurs = occursInInitialChunksMap.get(a);
-						const bEntryOccurs = occursInInitialChunksMap.get(b);
-						if (aEntryOccurs > bEntryOccurs) return -1;
-						if (aEntryOccurs < bEntryOccurs) return 1;
-						const aOccurs = a.getNumberOfGroups();
-						const bOccurs = b.getNumberOfGroups();
-						if (aOccurs > bOccurs) return -1;
-						if (aOccurs < bOccurs) return 1;
-						const orgA = originalOrder.get(a);
-						const orgB = originalOrder.get(b);
-						return orgA - orgB;
-					});
-				}
-			);
-		});
-	}
-}
-
-module.exports = OccurrenceOrderPlugin;
diff --git a/lib/optimize/RealContentHashPlugin.js b/lib/optimize/RealContentHashPlugin.js
new file mode 100644
index 00000000000..66b568c8b18
--- /dev/null
+++ b/lib/optimize/RealContentHashPlugin.js
@@ -0,0 +1,470 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { SyncBailHook } = require("tapable");
+const { RawSource, CachedSource, CompatSource } = require("webpack-sources");
+const Compilation = require("../Compilation");
+const WebpackError = require("../WebpackError");
+const { compareSelect, compareStrings } = require("../util/comparators");
+const createHash = require("../util/createHash");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../Cache").Etag} Etag */
+/** @typedef {import("../Compilation").AssetInfo} AssetInfo */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {typeof import("../util/Hash")} Hash */
+
+const EMPTY_SET = new Set();
+
+/**
+ * @template T
+ * @param {T | T[]} itemOrItems item or items
+ * @param {Set} list list
+ */
+const addToList = (itemOrItems, list) => {
+	if (Array.isArray(itemOrItems)) {
+		for (const item of itemOrItems) {
+			list.add(item);
+		}
+	} else if (itemOrItems) {
+		list.add(itemOrItems);
+	}
+};
+
+/**
+ * @template T
+ * @param {T[]} input list
+ * @param {(item: T) => Buffer} fn map function
+ * @returns {Buffer[]} buffers without duplicates
+ */
+const mapAndDeduplicateBuffers = (input, fn) => {
+	// Buffer.equals compares size first so this should be efficient enough
+	// If it becomes a performance problem we can use a map and group by size
+	// instead of looping over all assets.
+	const result = [];
+	outer: for (const value of input) {
+		const buf = fn(value);
+		for (const other of result) {
+			if (buf.equals(other)) continue outer;
+		}
+		result.push(buf);
+	}
+	return result;
+};
+
+/**
+ * Escapes regular expression metacharacters
+ * @param {string} str String to quote
+ * @returns {string} Escaped string
+ */
+const quoteMeta = str => str.replace(/[-[\]\\/{}()*+?.^$|]/g, "\\$&");
+
+const cachedSourceMap = new WeakMap();
+
+/**
+ * @param {Source} source source
+ * @returns {CachedSource} cached source
+ */
+const toCachedSource = source => {
+	if (source instanceof CachedSource) {
+		return source;
+	}
+	const entry = cachedSourceMap.get(source);
+	if (entry !== undefined) return entry;
+	const newSource = new CachedSource(CompatSource.from(source));
+	cachedSourceMap.set(source, newSource);
+	return newSource;
+};
+
+/** @typedef {Set} OwnHashes */
+/** @typedef {Set} ReferencedHashes */
+/** @typedef {Set} Hashes */
+
+/**
+ * @typedef {object} AssetInfoForRealContentHash
+ * @property {string} name
+ * @property {AssetInfo} info
+ * @property {Source} source
+ * @property {RawSource | undefined} newSource
+ * @property {RawSource | undefined} newSourceWithoutOwn
+ * @property {string} content
+ * @property {OwnHashes | undefined} ownHashes
+ * @property {Promise | undefined} contentComputePromise
+ * @property {Promise | undefined} contentComputeWithoutOwnPromise
+ * @property {ReferencedHashes | undefined} referencedHashes
+ * @property {Hashes} hashes
+ */
+
+/**
+ * @typedef {object} CompilationHooks
+ * @property {SyncBailHook<[Buffer[], string], string | void>} updateHash
+ */
+
+/** @type {WeakMap} */
+const compilationHooksMap = new WeakMap();
+
+/**
+ * @typedef {object} RealContentHashPluginOptions
+ * @property {string | Hash} hashFunction the hash function to use
+ * @property {string=} hashDigest the hash digest to use
+ */
+
+const PLUGIN_NAME = "RealContentHashPlugin";
+
+class RealContentHashPlugin {
+	/**
+	 * @param {Compilation} compilation the compilation
+	 * @returns {CompilationHooks} the attached hooks
+	 */
+	static getCompilationHooks(compilation) {
+		if (!(compilation instanceof Compilation)) {
+			throw new TypeError(
+				"The 'compilation' argument must be an instance of Compilation"
+			);
+		}
+		let hooks = compilationHooksMap.get(compilation);
+		if (hooks === undefined) {
+			hooks = {
+				updateHash: new SyncBailHook(["content", "oldHash"])
+			};
+			compilationHooksMap.set(compilation, hooks);
+		}
+		return hooks;
+	}
+
+	/**
+	 * @param {RealContentHashPluginOptions} options options
+	 */
+	constructor({ hashFunction, hashDigest }) {
+		this._hashFunction = hashFunction;
+		this._hashDigest = hashDigest;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			const cacheAnalyse = compilation.getCache(
+				"RealContentHashPlugin|analyse"
+			);
+			const cacheGenerate = compilation.getCache(
+				"RealContentHashPlugin|generate"
+			);
+			const hooks = RealContentHashPlugin.getCompilationHooks(compilation);
+			compilation.hooks.processAssets.tapPromise(
+				{
+					name: PLUGIN_NAME,
+					stage: Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_HASH
+				},
+				async () => {
+					const assets = compilation.getAssets();
+					/** @type {AssetInfoForRealContentHash[]} */
+					const assetsWithInfo = [];
+					/** @type {Map} */
+					const hashToAssets = new Map();
+					for (const { source, info, name } of assets) {
+						const cachedSource = toCachedSource(source);
+						const content = /** @type {string} */ (cachedSource.source());
+						/** @type {Hashes} */
+						const hashes = new Set();
+						addToList(info.contenthash, hashes);
+						/** @type {AssetInfoForRealContentHash} */
+						const data = {
+							name,
+							info,
+							source: cachedSource,
+							newSource: undefined,
+							newSourceWithoutOwn: undefined,
+							content,
+							ownHashes: undefined,
+							contentComputePromise: undefined,
+							contentComputeWithoutOwnPromise: undefined,
+							referencedHashes: undefined,
+							hashes
+						};
+						assetsWithInfo.push(data);
+						for (const hash of hashes) {
+							const list = hashToAssets.get(hash);
+							if (list === undefined) {
+								hashToAssets.set(hash, [data]);
+							} else {
+								list.push(data);
+							}
+						}
+					}
+					if (hashToAssets.size === 0) return;
+					const hashRegExp = new RegExp(
+						Array.from(hashToAssets.keys(), quoteMeta).join("|"),
+						"g"
+					);
+					await Promise.all(
+						assetsWithInfo.map(async asset => {
+							const { name, source, content, hashes } = asset;
+							if (Buffer.isBuffer(content)) {
+								asset.referencedHashes = EMPTY_SET;
+								asset.ownHashes = EMPTY_SET;
+								return;
+							}
+							const etag = cacheAnalyse.mergeEtags(
+								cacheAnalyse.getLazyHashedEtag(source),
+								Array.from(hashes).join("|")
+							);
+							[asset.referencedHashes, asset.ownHashes] =
+								await cacheAnalyse.providePromise(name, etag, () => {
+									const referencedHashes = new Set();
+									const ownHashes = new Set();
+									const inContent = content.match(hashRegExp);
+									if (inContent) {
+										for (const hash of inContent) {
+											if (hashes.has(hash)) {
+												ownHashes.add(hash);
+												continue;
+											}
+											referencedHashes.add(hash);
+										}
+									}
+									return [referencedHashes, ownHashes];
+								});
+						})
+					);
+					/**
+					 * @param {string} hash the hash
+					 * @returns {undefined | ReferencedHashes} the referenced hashes
+					 */
+					const getDependencies = hash => {
+						const assets = hashToAssets.get(hash);
+						if (!assets) {
+							const referencingAssets = assetsWithInfo.filter(asset =>
+								/** @type {ReferencedHashes} */ (asset.referencedHashes).has(
+									hash
+								)
+							);
+							const err = new WebpackError(`RealContentHashPlugin
+Some kind of unexpected caching problem occurred.
+An asset was cached with a reference to another asset (${hash}) that's not in the compilation anymore.
+Either the asset was incorrectly cached, or the referenced asset should also be restored from cache.
+Referenced by:
+${referencingAssets
+	.map(a => {
+		const match = new RegExp(`.{0,20}${quoteMeta(hash)}.{0,20}`).exec(
+			a.content
+		);
+		return ` - ${a.name}: ...${match ? match[0] : "???"}...`;
+	})
+	.join("\n")}`);
+							compilation.errors.push(err);
+							return;
+						}
+						const hashes = new Set();
+						for (const { referencedHashes, ownHashes } of assets) {
+							if (!(/** @type {OwnHashes} */ (ownHashes).has(hash))) {
+								for (const hash of /** @type {OwnHashes} */ (ownHashes)) {
+									hashes.add(hash);
+								}
+							}
+							for (const hash of /** @type {ReferencedHashes} */ (
+								referencedHashes
+							)) {
+								hashes.add(hash);
+							}
+						}
+						return hashes;
+					};
+					/**
+					 * @param {string} hash the hash
+					 * @returns {string} the hash info
+					 */
+					const hashInfo = hash => {
+						const assets = hashToAssets.get(hash);
+						return `${hash} (${Array.from(
+							/** @type {AssetInfoForRealContentHash[]} */ (assets),
+							a => a.name
+						)})`;
+					};
+					const hashesInOrder = new Set();
+					for (const hash of hashToAssets.keys()) {
+						/**
+						 * @param {string} hash the hash
+						 * @param {Set} stack stack of hashes
+						 */
+						const add = (hash, stack) => {
+							const deps = getDependencies(hash);
+							if (!deps) return;
+							stack.add(hash);
+							for (const dep of deps) {
+								if (hashesInOrder.has(dep)) continue;
+								if (stack.has(dep)) {
+									throw new Error(
+										`Circular hash dependency ${Array.from(
+											stack,
+											hashInfo
+										).join(" -> ")} -> ${hashInfo(dep)}`
+									);
+								}
+								add(dep, stack);
+							}
+							hashesInOrder.add(hash);
+							stack.delete(hash);
+						};
+						if (hashesInOrder.has(hash)) continue;
+						add(hash, new Set());
+					}
+					const hashToNewHash = new Map();
+					/**
+					 * @param {AssetInfoForRealContentHash} asset asset info
+					 * @returns {Etag} etag
+					 */
+					const getEtag = asset =>
+						cacheGenerate.mergeEtags(
+							cacheGenerate.getLazyHashedEtag(asset.source),
+							Array.from(
+								/** @type {ReferencedHashes} */ (asset.referencedHashes),
+								hash => hashToNewHash.get(hash)
+							).join("|")
+						);
+					/**
+					 * @param {AssetInfoForRealContentHash} asset asset info
+					 * @returns {Promise}
+					 */
+					const computeNewContent = asset => {
+						if (asset.contentComputePromise) return asset.contentComputePromise;
+						return (asset.contentComputePromise = (async () => {
+							if (
+								/** @type {OwnHashes} */ (asset.ownHashes).size > 0 ||
+								Array.from(
+									/** @type {ReferencedHashes} */
+									(asset.referencedHashes)
+								).some(hash => hashToNewHash.get(hash) !== hash)
+							) {
+								const identifier = asset.name;
+								const etag = getEtag(asset);
+								asset.newSource = await cacheGenerate.providePromise(
+									identifier,
+									etag,
+									() => {
+										const newContent = asset.content.replace(hashRegExp, hash =>
+											hashToNewHash.get(hash)
+										);
+										return new RawSource(newContent);
+									}
+								);
+							}
+						})());
+					};
+					/**
+					 * @param {AssetInfoForRealContentHash} asset asset info
+					 * @returns {Promise}
+					 */
+					const computeNewContentWithoutOwn = asset => {
+						if (asset.contentComputeWithoutOwnPromise)
+							return asset.contentComputeWithoutOwnPromise;
+						return (asset.contentComputeWithoutOwnPromise = (async () => {
+							if (
+								/** @type {OwnHashes} */ (asset.ownHashes).size > 0 ||
+								Array.from(
+									/** @type {ReferencedHashes} */
+									(asset.referencedHashes)
+								).some(hash => hashToNewHash.get(hash) !== hash)
+							) {
+								const identifier = `${asset.name}|without-own`;
+								const etag = getEtag(asset);
+								asset.newSourceWithoutOwn = await cacheGenerate.providePromise(
+									identifier,
+									etag,
+									() => {
+										const newContent = asset.content.replace(
+											hashRegExp,
+											hash => {
+												if (
+													/** @type {OwnHashes} */ (asset.ownHashes).has(hash)
+												) {
+													return "";
+												}
+												return hashToNewHash.get(hash);
+											}
+										);
+										return new RawSource(newContent);
+									}
+								);
+							}
+						})());
+					};
+					const comparator = compareSelect(a => a.name, compareStrings);
+					for (const oldHash of hashesInOrder) {
+						const assets =
+							/** @type {AssetInfoForRealContentHash[]} */
+							(hashToAssets.get(oldHash));
+						assets.sort(comparator);
+						await Promise.all(
+							assets.map(asset =>
+								/** @type {OwnHashes} */ (asset.ownHashes).has(oldHash)
+									? computeNewContentWithoutOwn(asset)
+									: computeNewContent(asset)
+							)
+						);
+						const assetsContent = mapAndDeduplicateBuffers(assets, asset => {
+							if (/** @type {OwnHashes} */ (asset.ownHashes).has(oldHash)) {
+								return asset.newSourceWithoutOwn
+									? asset.newSourceWithoutOwn.buffer()
+									: asset.source.buffer();
+							}
+							return asset.newSource
+								? asset.newSource.buffer()
+								: asset.source.buffer();
+						});
+						let newHash = hooks.updateHash.call(assetsContent, oldHash);
+						if (!newHash) {
+							const hash = createHash(this._hashFunction);
+							if (compilation.outputOptions.hashSalt) {
+								hash.update(compilation.outputOptions.hashSalt);
+							}
+							for (const content of assetsContent) {
+								hash.update(content);
+							}
+							const digest = hash.digest(this._hashDigest);
+							newHash = /** @type {string} */ (digest.slice(0, oldHash.length));
+						}
+						hashToNewHash.set(oldHash, newHash);
+					}
+					await Promise.all(
+						assetsWithInfo.map(async asset => {
+							await computeNewContent(asset);
+							const newName = asset.name.replace(hashRegExp, hash =>
+								hashToNewHash.get(hash)
+							);
+
+							const infoUpdate = {};
+							const hash = asset.info.contenthash;
+							infoUpdate.contenthash = Array.isArray(hash)
+								? hash.map(hash => hashToNewHash.get(hash))
+								: hashToNewHash.get(hash);
+
+							if (asset.newSource !== undefined) {
+								compilation.updateAsset(
+									asset.name,
+									asset.newSource,
+									infoUpdate
+								);
+							} else {
+								compilation.updateAsset(asset.name, asset.source, infoUpdate);
+							}
+
+							if (asset.name !== newName) {
+								compilation.renameAsset(asset.name, newName);
+							}
+						})
+					);
+				}
+			);
+		});
+	}
+}
+
+module.exports = RealContentHashPlugin;
diff --git a/lib/optimize/RemoveEmptyChunksPlugin.js b/lib/optimize/RemoveEmptyChunksPlugin.js
index 42ba24a1574..c8ad85c617f 100644
--- a/lib/optimize/RemoveEmptyChunksPlugin.js
+++ b/lib/optimize/RemoveEmptyChunksPlugin.js
@@ -2,38 +2,55 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
+const { STAGE_BASIC, STAGE_ADVANCED } = require("../OptimizationStages");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compiler")} Compiler */
+
+const PLUGIN_NAME = "RemoveEmptyChunksPlugin";
+
 class RemoveEmptyChunksPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		compiler.hooks.compilation.tap("RemoveEmptyChunksPlugin", compilation => {
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			/**
+			 * @param {Iterable} chunks the chunks array
+			 * @returns {void}
+			 */
 			const handler = chunks => {
-				for (let i = chunks.length - 1; i >= 0; i--) {
-					const chunk = chunks[i];
+				const chunkGraph = compilation.chunkGraph;
+				for (const chunk of chunks) {
 					if (
-						chunk.isEmpty() &&
+						chunkGraph.getNumberOfChunkModules(chunk) === 0 &&
 						!chunk.hasRuntime() &&
-						!chunk.hasEntryModule()
+						chunkGraph.getNumberOfEntryModules(chunk) === 0
 					) {
-						chunk.remove("empty");
-						chunks.splice(i, 1);
+						compilation.chunkGraph.disconnectChunk(chunk);
+						compilation.chunks.delete(chunk);
 					}
 				}
 			};
-			compilation.hooks.optimizeChunksBasic.tap(
-				"RemoveEmptyChunksPlugin",
-				handler
-			);
-			compilation.hooks.optimizeChunksAdvanced.tap(
-				"RemoveEmptyChunksPlugin",
-				handler
-			);
-			compilation.hooks.optimizeExtractedChunksBasic.tap(
-				"RemoveEmptyChunksPlugin",
+
+			// TODO do it once
+			compilation.hooks.optimizeChunks.tap(
+				{
+					name: PLUGIN_NAME,
+					stage: STAGE_BASIC
+				},
 				handler
 			);
-			compilation.hooks.optimizeExtractedChunksAdvanced.tap(
-				"RemoveEmptyChunksPlugin",
+			compilation.hooks.optimizeChunks.tap(
+				{
+					name: PLUGIN_NAME,
+					stage: STAGE_ADVANCED
+				},
 				handler
 			);
 		});
diff --git a/lib/optimize/RemoveParentModulesPlugin.js b/lib/optimize/RemoveParentModulesPlugin.js
index 7fff59207b8..2cfd764d47d 100644
--- a/lib/optimize/RemoveParentModulesPlugin.js
+++ b/lib/optimize/RemoveParentModulesPlugin.js
@@ -2,123 +2,202 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const Queue = require("../util/Queue");
-const { intersect } = require("../util/SetHelpers");
+const { STAGE_BASIC } = require("../OptimizationStages");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../ChunkGroup")} ChunkGroup */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Module")} Module */
+
+/**
+ * Intersects multiple masks represented as bigints
+ * @param {bigint[]} masks The module masks to intersect
+ * @returns {bigint} The intersection of all masks
+ */
+function intersectMasks(masks) {
+	let result = masks[0];
+	for (let i = masks.length - 1; i >= 1; i--) {
+		result &= masks[i];
+	}
+	return result;
+}
 
-const getParentChunksWithModule = (currentChunk, module) => {
-	const chunks = [];
-	const stack = new Set(currentChunk.parentsIterable);
+const ZERO_BIGINT = BigInt(0);
+const ONE_BIGINT = BigInt(1);
+const THIRTY_TWO_BIGINT = BigInt(32);
 
-	for (const chunk of stack) {
-		if (chunk.containsModule(module)) {
-			chunks.push(chunk);
-		} else {
-			for (const parent of chunk.parentsIterable) {
-				stack.add(parent);
-			}
+/**
+ * Parses the module mask and returns the modules represented by it
+ * @param {bigint} mask the module mask
+ * @param {Module[]} ordinalModules the modules in the order they were added to the mask (LSB is index 0)
+ * @returns {Generator} the modules represented by the mask
+ */
+function* getModulesFromMask(mask, ordinalModules) {
+	let offset = 31;
+	while (mask !== ZERO_BIGINT) {
+		// Consider the last 32 bits, since that's what Math.clz32 can handle
+		let last32 = Number(BigInt.asUintN(32, mask));
+		while (last32 > 0) {
+			const last = Math.clz32(last32);
+			// The number of trailing zeros is the number trimmed off the input mask + 31 - the number of leading zeros
+			// The 32 is baked into the initial value of offset
+			const moduleIndex = offset - last;
+			// The number of trailing zeros is the index into the array generated by getOrCreateModuleMask
+			const module = ordinalModules[moduleIndex];
+			yield module;
+			// Remove the matched module from the mask
+			// Since we can only count leading zeros, not trailing, we can't just downshift the mask
+			last32 &= ~(1 << (31 - last));
 		}
+
+		// Remove the processed chunk from the mask
+		mask >>= THIRTY_TWO_BIGINT;
+		offset += 32;
 	}
+}
 
-	return chunks;
-};
+const PLUGIN_NAME = "RemoveParentModulesPlugin";
 
 class RemoveParentModulesPlugin {
+	/**
+	 * @param {Compiler} compiler the compiler
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		compiler.hooks.compilation.tap("RemoveParentModulesPlugin", compilation => {
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			/**
+			 * @param {Iterable} chunks the chunks
+			 * @param {ChunkGroup[]} chunkGroups the chunk groups
+			 */
 			const handler = (chunks, chunkGroups) => {
-				const queue = new Queue();
+				const chunkGraph = compilation.chunkGraph;
+				const queue = new Set();
 				const availableModulesMap = new WeakMap();
 
+				let nextModuleMask = ONE_BIGINT;
+				const maskByModule = new WeakMap();
+				/** @type {Module[]} */
+				const ordinalModules = [];
+
+				/**
+				 * Gets or creates a unique mask for a module
+				 * @param {Module} mod the module to get the mask for
+				 * @returns {bigint} the module mask to uniquely identify the module
+				 */
+				const getOrCreateModuleMask = mod => {
+					let id = maskByModule.get(mod);
+					if (id === undefined) {
+						id = nextModuleMask;
+						ordinalModules.push(mod);
+						maskByModule.set(mod, id);
+						nextModuleMask <<= ONE_BIGINT;
+					}
+					return id;
+				};
+
+				// Initialize masks by chunk and by chunk group for quicker comparisons
+				const chunkMasks = new WeakMap();
+				for (const chunk of chunks) {
+					let mask = ZERO_BIGINT;
+					for (const m of chunkGraph.getChunkModulesIterable(chunk)) {
+						const id = getOrCreateModuleMask(m);
+						mask |= id;
+					}
+					chunkMasks.set(chunk, mask);
+				}
+
+				const chunkGroupMasks = new WeakMap();
+				for (const chunkGroup of chunkGroups) {
+					let mask = ZERO_BIGINT;
+					for (const chunk of chunkGroup.chunks) {
+						const chunkMask = chunkMasks.get(chunk);
+						if (chunkMask !== undefined) {
+							mask |= chunkMask;
+						}
+					}
+					chunkGroupMasks.set(chunkGroup, mask);
+				}
+
 				for (const chunkGroup of compilation.entrypoints.values()) {
 					// initialize available modules for chunks without parents
-					availableModulesMap.set(chunkGroup, new Set());
+					availableModulesMap.set(chunkGroup, ZERO_BIGINT);
+					for (const child of chunkGroup.childrenIterable) {
+						queue.add(child);
+					}
+				}
+				for (const chunkGroup of compilation.asyncEntrypoints) {
+					// initialize available modules for chunks without parents
+					availableModulesMap.set(chunkGroup, ZERO_BIGINT);
 					for (const child of chunkGroup.childrenIterable) {
-						queue.enqueue(child);
+						queue.add(child);
 					}
 				}
 
-				while (queue.length > 0) {
-					const chunkGroup = queue.dequeue();
-					let availableModules = availableModulesMap.get(chunkGroup);
+				for (const chunkGroup of queue) {
+					let availableModulesMask = availableModulesMap.get(chunkGroup);
 					let changed = false;
 					for (const parent of chunkGroup.parentsIterable) {
 						const availableModulesInParent = availableModulesMap.get(parent);
 						if (availableModulesInParent !== undefined) {
+							const parentMask =
+								availableModulesInParent | chunkGroupMasks.get(parent);
 							// If we know the available modules in parent: process these
-							if (availableModules === undefined) {
+							if (availableModulesMask === undefined) {
 								// if we have not own info yet: create new entry
-								availableModules = new Set(availableModulesInParent);
-								for (const chunk of parent.chunks) {
-									for (const m of chunk.modulesIterable) {
-										availableModules.add(m);
-									}
-								}
-								availableModulesMap.set(chunkGroup, availableModules);
+								availableModulesMask = parentMask;
 								changed = true;
 							} else {
-								for (const m of availableModules) {
-									if (
-										!parent.containsModule(m) &&
-										!availableModulesInParent.has(m)
-									) {
-										availableModules.delete(m);
-										changed = true;
-									}
+								const newMask = availableModulesMask & parentMask;
+								if (newMask !== availableModulesMask) {
+									changed = true;
+									availableModulesMask = newMask;
 								}
 							}
 						}
 					}
+
 					if (changed) {
+						availableModulesMap.set(chunkGroup, availableModulesMask);
 						// if something changed: enqueue our children
 						for (const child of chunkGroup.childrenIterable) {
-							queue.enqueue(child);
+							// Push the child to the end of the queue
+							queue.delete(child);
+							queue.add(child);
 						}
 					}
 				}
 
 				// now we have available modules for every chunk
 				for (const chunk of chunks) {
+					const chunkMask = chunkMasks.get(chunk);
+					if (chunkMask === undefined) continue; // No info about this chunk
+
 					const availableModulesSets = Array.from(
 						chunk.groupsIterable,
 						chunkGroup => availableModulesMap.get(chunkGroup)
 					);
-					if (availableModulesSets.some(s => s === undefined)) continue; // No info about this chunk group
-					const availableModules =
-						availableModulesSets.length === 1
-							? availableModulesSets[0]
-							: intersect(availableModulesSets);
-					const numberOfModules = chunk.getNumberOfModules();
-					const toRemove = new Set();
-					if (numberOfModules < availableModules.size) {
-						for (const m of chunk.modulesIterable) {
-							if (availableModules.has(m)) {
-								toRemove.add(m);
-							}
-						}
-					} else {
-						for (const m of availableModules) {
-							if (chunk.containsModule(m)) {
-								toRemove.add(m);
-							}
+					if (availableModulesSets.includes(undefined)) continue; // No info about this chunk group
+
+					const availableModulesMask = intersectMasks(availableModulesSets);
+					const toRemoveMask = chunkMask & availableModulesMask;
+					if (toRemoveMask !== ZERO_BIGINT) {
+						for (const module of getModulesFromMask(
+							toRemoveMask,
+							ordinalModules
+						)) {
+							chunkGraph.disconnectChunkAndModule(chunk, module);
 						}
 					}
-					for (const module of toRemove) {
-						module.rewriteChunkInReasons(
-							chunk,
-							getParentChunksWithModule(chunk, module)
-						);
-						chunk.removeModule(module);
-					}
 				}
 			};
-			compilation.hooks.optimizeChunksBasic.tap(
-				"RemoveParentModulesPlugin",
-				handler
-			);
-			compilation.hooks.optimizeExtractedChunksBasic.tap(
-				"RemoveParentModulesPlugin",
+			compilation.hooks.optimizeChunks.tap(
+				{
+					name: PLUGIN_NAME,
+					stage: STAGE_BASIC
+				},
 				handler
 			);
 		});
diff --git a/lib/optimize/RuntimeChunkPlugin.js b/lib/optimize/RuntimeChunkPlugin.js
index 1325dfc7868..a51cd693a65 100644
--- a/lib/optimize/RuntimeChunkPlugin.js
+++ b/lib/optimize/RuntimeChunkPlugin.js
@@ -2,40 +2,54 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-module.exports = class RuntimeChunkPlugin {
+/** @typedef {import("../Compilation").EntryData} EntryData */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Entrypoint")} Entrypoint */
+
+const PLUGIN_NAME = "RuntimeChunkPlugin";
+
+/** @typedef {(entrypoint: { name: string }) => string} RuntimeChunkFunction */
+
+class RuntimeChunkPlugin {
+	/**
+	 * @param {{ name?: RuntimeChunkFunction }=} options options
+	 */
 	constructor(options) {
-		this.options = Object.assign(
-			{
-				name: entrypoint => `runtime~${entrypoint.name}`
-			},
-			options
-		);
+		this.options = {
+			/** @type {RuntimeChunkFunction} */
+			name: entrypoint => `runtime~${entrypoint.name}`,
+			...options
+		};
 	}
 
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		compiler.hooks.thisCompilation.tap("RuntimeChunkPlugin", compilation => {
-			compilation.hooks.optimizeChunksAdvanced.tap("RuntimeChunkPlugin", () => {
-				for (const entrypoint of compilation.entrypoints.values()) {
-					const chunk = entrypoint.getRuntimeChunk();
-					let name = this.options.name;
+		compiler.hooks.thisCompilation.tap(PLUGIN_NAME, compilation => {
+			compilation.hooks.addEntry.tap(PLUGIN_NAME, (_, { name: entryName }) => {
+				if (entryName === undefined) return;
+				const data =
+					/** @type {EntryData} */
+					(compilation.entries.get(entryName));
+				if (data.options.runtime === undefined && !data.options.dependOn) {
+					// Determine runtime chunk name
+					let name =
+						/** @type {string | RuntimeChunkFunction} */
+						(this.options.name);
 					if (typeof name === "function") {
-						name = name(entrypoint);
-					}
-					if (
-						chunk.getNumberOfModules() > 0 ||
-						!chunk.preventIntegration ||
-						chunk.name !== name
-					) {
-						const newChunk = compilation.addChunk(name);
-						newChunk.preventIntegration = true;
-						entrypoint.unshiftChunk(newChunk);
-						newChunk.addGroup(entrypoint);
-						entrypoint.setRuntimeChunk(newChunk);
+						name = name({ name: entryName });
 					}
+					data.options.runtime = name;
 				}
 			});
 		});
 	}
-};
+}
+
+module.exports = RuntimeChunkPlugin;
diff --git a/lib/optimize/SideEffectsFlagPlugin.js b/lib/optimize/SideEffectsFlagPlugin.js
index 4b618c2990b..9df089775ba 100644
--- a/lib/optimize/SideEffectsFlagPlugin.js
+++ b/lib/optimize/SideEffectsFlagPlugin.js
@@ -2,165 +2,400 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const mm = require("micromatch");
+const glob2regexp = require("glob-to-regexp");
+const {
+	JAVASCRIPT_MODULE_TYPE_AUTO,
+	JAVASCRIPT_MODULE_TYPE_ESM,
+	JAVASCRIPT_MODULE_TYPE_DYNAMIC
+} = require("../ModuleTypeConstants");
+const { STAGE_DEFAULT } = require("../OptimizationStages");
 const HarmonyExportImportedSpecifierDependency = require("../dependencies/HarmonyExportImportedSpecifierDependency");
-const HarmonyImportSideEffectDependency = require("../dependencies/HarmonyImportSideEffectDependency");
 const HarmonyImportSpecifierDependency = require("../dependencies/HarmonyImportSpecifierDependency");
+const formatLocation = require("../formatLocation");
 
-/** @typedef {import("../Module")} Module */
+/** @typedef {import("estree").MaybeNamedClassDeclaration} MaybeNamedClassDeclaration */
+/** @typedef {import("estree").MaybeNamedFunctionDeclaration} MaybeNamedFunctionDeclaration */
+/** @typedef {import("estree").ModuleDeclaration} ModuleDeclaration */
+/** @typedef {import("estree").Statement} Statement */
+/** @typedef {import("../Compiler")} Compiler */
 /** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../Module").BuildMeta} BuildMeta */
+/** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */
+/** @typedef {import("../NormalModuleFactory").ModuleSettings} ModuleSettings */
+/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
+/** @typedef {import("../javascript/JavascriptParser").Range} Range */
 
 /**
- * @typedef {Object} ExportInModule
+ * @typedef {object} ExportInModule
  * @property {Module} module the module
  * @property {string} exportName the name of the export
+ * @property {boolean} checked if the export is conditional
  */
 
+/**
+ * @typedef {object} ReexportInfo
+ * @property {Map} static
+ * @property {Map>} dynamic
+ */
+
+/** @typedef {Map} CacheItem */
+
+/** @type {WeakMap} */
+const globToRegexpCache = new WeakMap();
+
+/**
+ * @param {string} glob the pattern
+ * @param {Map} cache the glob to RegExp cache
+ * @returns {RegExp} a regular expression
+ */
+const globToRegexp = (glob, cache) => {
+	const cacheEntry = cache.get(glob);
+	if (cacheEntry !== undefined) return cacheEntry;
+	if (!glob.includes("/")) {
+		glob = `**/${glob}`;
+	}
+	const baseRegexp = glob2regexp(glob, { globstar: true, extended: true });
+	const regexpSource = baseRegexp.source;
+	const regexp = new RegExp(`^(\\./)?${regexpSource.slice(1)}`);
+	cache.set(glob, regexp);
+	return regexp;
+};
+
+const PLUGIN_NAME = "SideEffectsFlagPlugin";
+
 class SideEffectsFlagPlugin {
+	/**
+	 * @param {boolean} analyseSource analyse source code for side effects
+	 */
+	constructor(analyseSource = true) {
+		this._analyseSource = analyseSource;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
-		compiler.hooks.normalModuleFactory.tap("SideEffectsFlagPlugin", nmf => {
-			nmf.hooks.module.tap("SideEffectsFlagPlugin", (module, data) => {
-				const resolveData = data.resourceResolveData;
-				if (
-					resolveData &&
-					resolveData.descriptionFileData &&
-					resolveData.relativePath
-				) {
-					const sideEffects = resolveData.descriptionFileData.sideEffects;
-					const hasSideEffects = SideEffectsFlagPlugin.moduleHasSideEffects(
-						resolveData.relativePath,
-						sideEffects
-					);
-					if (!hasSideEffects) {
-						module.factoryMeta.sideEffectFree = true;
+		let cache = globToRegexpCache.get(compiler.root);
+		if (cache === undefined) {
+			cache = new Map();
+			globToRegexpCache.set(compiler.root, cache);
+		}
+		compiler.hooks.compilation.tap(
+			PLUGIN_NAME,
+			(compilation, { normalModuleFactory }) => {
+				const moduleGraph = compilation.moduleGraph;
+				normalModuleFactory.hooks.module.tap(PLUGIN_NAME, (module, data) => {
+					const resolveData = data.resourceResolveData;
+					if (
+						resolveData &&
+						resolveData.descriptionFileData &&
+						resolveData.relativePath
+					) {
+						const sideEffects = resolveData.descriptionFileData.sideEffects;
+						if (sideEffects !== undefined) {
+							if (module.factoryMeta === undefined) {
+								module.factoryMeta = {};
+							}
+							const hasSideEffects = SideEffectsFlagPlugin.moduleHasSideEffects(
+								resolveData.relativePath,
+								/** @type {string | boolean | string[] | undefined} */ (
+									sideEffects
+								),
+								/** @type {CacheItem} */ (cache)
+							);
+							module.factoryMeta.sideEffectFree = !hasSideEffects;
+						}
 					}
-				}
 
-				return module;
-			});
-			nmf.hooks.module.tap("SideEffectsFlagPlugin", (module, data) => {
-				if (data.settings.sideEffects === false) {
-					module.factoryMeta.sideEffectFree = true;
-				} else if (data.settings.sideEffects === true) {
-					module.factoryMeta.sideEffectFree = false;
-				}
-			});
-		});
-		compiler.hooks.compilation.tap("SideEffectsFlagPlugin", compilation => {
-			compilation.hooks.optimizeDependencies.tap(
-				"SideEffectsFlagPlugin",
-				modules => {
-					/** @type {Map>} */
-					const reexportMaps = new Map();
-
-					// Capture reexports of sideEffectFree modules
-					for (const module of modules) {
-						/** @type {Dependency[]} */
-						const removeDependencies = [];
-						for (const dep of module.dependencies) {
-							if (dep instanceof HarmonyImportSideEffectDependency) {
-								if (dep.module && dep.module.factoryMeta.sideEffectFree) {
-									removeDependencies.push(dep);
-								}
-							} else if (
-								dep instanceof HarmonyExportImportedSpecifierDependency
-							) {
-								if (module.factoryMeta.sideEffectFree) {
-									const mode = dep.getMode(true);
-									if (mode.type === "safe-reexport") {
-										let map = reexportMaps.get(module);
-										if (!map) {
-											reexportMaps.set(module, (map = new Map()));
+					return module;
+				});
+				normalModuleFactory.hooks.module.tap(PLUGIN_NAME, (module, data) => {
+					const settings = /** @type {ModuleSettings} */ (data.settings);
+					if (typeof settings.sideEffects === "boolean") {
+						if (module.factoryMeta === undefined) {
+							module.factoryMeta = {};
+						}
+						module.factoryMeta.sideEffectFree = !settings.sideEffects;
+					}
+					return module;
+				});
+				if (this._analyseSource) {
+					/**
+					 * @param {JavascriptParser} parser the parser
+					 * @returns {void}
+					 */
+					const parserHandler = parser => {
+						/** @type {undefined | Statement | ModuleDeclaration | MaybeNamedFunctionDeclaration | MaybeNamedClassDeclaration} */
+						let sideEffectsStatement;
+						parser.hooks.program.tap(PLUGIN_NAME, () => {
+							sideEffectsStatement = undefined;
+						});
+						parser.hooks.statement.tap(
+							{ name: PLUGIN_NAME, stage: -100 },
+							statement => {
+								if (sideEffectsStatement) return;
+								if (parser.scope.topLevelScope !== true) return;
+								switch (statement.type) {
+									case "ExpressionStatement":
+										if (
+											!parser.isPure(
+												statement.expression,
+												/** @type {Range} */
+												(statement.range)[0]
+											)
+										) {
+											sideEffectsStatement = statement;
 										}
-										for (const pair of mode.map) {
-											map.set(pair[0], {
-												module: mode.module,
-												exportName: pair[1]
-											});
+										break;
+									case "IfStatement":
+									case "WhileStatement":
+									case "DoWhileStatement":
+										if (
+											!parser.isPure(
+												statement.test,
+												/** @type {Range} */
+												(statement.range)[0]
+											)
+										) {
+											sideEffectsStatement = statement;
 										}
-									}
+										// statement hook will be called for child statements too
+										break;
+									case "ForStatement":
+										if (
+											!parser.isPure(
+												statement.init,
+												/** @type {Range} */ (statement.range)[0]
+											) ||
+											!parser.isPure(
+												statement.test,
+												statement.init
+													? /** @type {Range} */ (statement.init.range)[1]
+													: /** @type {Range} */ (statement.range)[0]
+											) ||
+											!parser.isPure(
+												statement.update,
+												statement.test
+													? /** @type {Range} */ (statement.test.range)[1]
+													: statement.init
+														? /** @type {Range} */ (statement.init.range)[1]
+														: /** @type {Range} */ (statement.range)[0]
+											)
+										) {
+											sideEffectsStatement = statement;
+										}
+										// statement hook will be called for child statements too
+										break;
+									case "SwitchStatement":
+										if (
+											!parser.isPure(
+												statement.discriminant,
+												/** @type {Range} */
+												(statement.range)[0]
+											)
+										) {
+											sideEffectsStatement = statement;
+										}
+										// statement hook will be called for child statements too
+										break;
+									case "VariableDeclaration":
+									case "ClassDeclaration":
+									case "FunctionDeclaration":
+										if (
+											!parser.isPure(
+												statement,
+												/** @type {Range} */ (statement.range)[0]
+											)
+										) {
+											sideEffectsStatement = statement;
+										}
+										break;
+									case "ExportNamedDeclaration":
+									case "ExportDefaultDeclaration":
+										if (
+											!parser.isPure(
+												statement.declaration,
+												/** @type {Range} */
+												(statement.range)[0]
+											)
+										) {
+											sideEffectsStatement = statement;
+										}
+										break;
+									case "LabeledStatement":
+									case "BlockStatement":
+										// statement hook will be called for child statements too
+										break;
+									case "EmptyStatement":
+										break;
+									case "ExportAllDeclaration":
+									case "ImportDeclaration":
+										// imports will be handled by the dependencies
+										break;
+									default:
+										sideEffectsStatement = statement;
+										break;
 								}
 							}
-						}
-					}
-
-					// Flatten reexports
-					for (const map of reexportMaps.values()) {
-						for (const pair of map) {
-							let mapping = pair[1];
-							while (mapping) {
-								const innerMap = reexportMaps.get(mapping.module);
-								if (!innerMap) break;
-								const newMapping = innerMap.get(mapping.exportName);
-								if (newMapping) {
-									map.set(pair[0], newMapping);
-								}
-								mapping = newMapping;
+						);
+						parser.hooks.finish.tap(PLUGIN_NAME, () => {
+							if (sideEffectsStatement === undefined) {
+								/** @type {BuildMeta} */
+								(parser.state.module.buildMeta).sideEffectFree = true;
+							} else {
+								const { loc, type } = sideEffectsStatement;
+								moduleGraph
+									.getOptimizationBailout(parser.state.module)
+									.push(
+										() =>
+											`Statement (${type}) with side effects in source code at ${formatLocation(
+												/** @type {DependencyLocation} */ (loc)
+											)}`
+									);
 							}
-						}
+						});
+					};
+					for (const key of [
+						JAVASCRIPT_MODULE_TYPE_AUTO,
+						JAVASCRIPT_MODULE_TYPE_ESM,
+						JAVASCRIPT_MODULE_TYPE_DYNAMIC
+					]) {
+						normalModuleFactory.hooks.parser
+							.for(key)
+							.tap(PLUGIN_NAME, parserHandler);
 					}
+				}
+				compilation.hooks.optimizeDependencies.tap(
+					{
+						name: PLUGIN_NAME,
+						stage: STAGE_DEFAULT
+					},
+					modules => {
+						const logger = compilation.getLogger(
+							"webpack.SideEffectsFlagPlugin"
+						);
 
-					// Update imports along the reexports from sideEffectFree modules
-					for (const pair of reexportMaps) {
-						const module = pair[0];
-						const map = pair[1];
-						let newReasons = undefined;
-						for (let i = 0; i < module.reasons.length; i++) {
-							const reason = module.reasons[i];
-							const dep = reason.dependency;
-							if (
-								dep instanceof HarmonyImportSpecifierDependency &&
-								!dep.namespaceObjectAsContext
-							) {
-								const mapping = map.get(dep.id);
-								if (mapping) {
-									dep.redirectedModule = mapping.module;
-									dep.redirectedId = mapping.exportName;
-									mapping.module.addReason(
-										reason.module,
-										dep,
-										reason.explanation
-											? reason.explanation +
-											  " (skipped side-effect-free modules)"
-											: "(skipped side-effect-free modules)"
-									);
-									// removing the currect reason, by not adding it to the newReasons array
-									// lazily create the newReasons array
-									if (newReasons === undefined) {
-										newReasons = i === 0 ? [] : module.reasons.slice(0, i);
+						logger.time("update dependencies");
+
+						const optimizedModules = new Set();
+
+						/**
+						 * @param {Module} module module
+						 */
+						const optimizeIncomingConnections = module => {
+							if (optimizedModules.has(module)) return;
+							optimizedModules.add(module);
+							if (module.getSideEffectsConnectionState(moduleGraph) === false) {
+								const exportsInfo = moduleGraph.getExportsInfo(module);
+								for (const connection of moduleGraph.getIncomingConnections(
+									module
+								)) {
+									const dep = connection.dependency;
+									let isReexport;
+									if (
+										(isReexport =
+											dep instanceof
+											HarmonyExportImportedSpecifierDependency) ||
+										(dep instanceof HarmonyImportSpecifierDependency &&
+											!dep.namespaceObjectAsContext)
+									) {
+										if (connection.originModule !== null) {
+											optimizeIncomingConnections(connection.originModule);
+										}
+										// TODO improve for export *
+										if (isReexport && dep.name) {
+											const exportInfo = moduleGraph.getExportInfo(
+												/** @type {Module} */ (connection.originModule),
+												dep.name
+											);
+											exportInfo.moveTarget(
+												moduleGraph,
+												({ module }) =>
+													module.getSideEffectsConnectionState(moduleGraph) ===
+													false,
+												({ module: newModule, export: exportName }) => {
+													moduleGraph.updateModule(dep, newModule);
+													moduleGraph.addExplanation(
+														dep,
+														"(skipped side-effect-free modules)"
+													);
+													const ids = dep.getIds(moduleGraph);
+													dep.setIds(
+														moduleGraph,
+														exportName
+															? [...exportName, ...ids.slice(1)]
+															: ids.slice(1)
+													);
+													return /** @type {ModuleGraphConnection} */ (
+														moduleGraph.getConnection(dep)
+													);
+												}
+											);
+											continue;
+										}
+										// TODO improve for nested imports
+										const ids = dep.getIds(moduleGraph);
+										if (ids.length > 0) {
+											const exportInfo = exportsInfo.getExportInfo(ids[0]);
+											const target = exportInfo.getTarget(
+												moduleGraph,
+												({ module }) =>
+													module.getSideEffectsConnectionState(moduleGraph) ===
+													false
+											);
+											if (!target) continue;
+
+											moduleGraph.updateModule(dep, target.module);
+											moduleGraph.addExplanation(
+												dep,
+												"(skipped side-effect-free modules)"
+											);
+											dep.setIds(
+												moduleGraph,
+												target.export
+													? [...target.export, ...ids.slice(1)]
+													: ids.slice(1)
+											);
+										}
 									}
-									continue;
 								}
 							}
-							if (newReasons !== undefined) newReasons.push(reason);
-						}
-						if (newReasons !== undefined) {
-							module.reasons = newReasons;
+						};
+
+						for (const module of modules) {
+							optimizeIncomingConnections(module);
 						}
+						logger.timeEnd("update dependencies");
 					}
-				}
-			);
-		});
+				);
+			}
+		);
 	}
 
-	static moduleHasSideEffects(moduleName, flagValue) {
+	/**
+	 * @param {string} moduleName the module name
+	 * @param {undefined | boolean | string | string[]} flagValue the flag value
+	 * @param {Map} cache cache for glob to regexp
+	 * @returns {boolean | undefined} true, when the module has side effects, undefined or false when not
+	 */
+	static moduleHasSideEffects(moduleName, flagValue, cache) {
 		switch (typeof flagValue) {
 			case "undefined":
 				return true;
 			case "boolean":
 				return flagValue;
 			case "string":
-				if (process.platform === "win32") {
-					flagValue = flagValue.replace(/\\/g, "/");
-				}
-				return mm.isMatch(moduleName, flagValue, {
-					matchBase: true
-				});
+				return globToRegexp(flagValue, cache).test(moduleName);
 			case "object":
 				return flagValue.some(glob =>
-					SideEffectsFlagPlugin.moduleHasSideEffects(moduleName, glob)
+					SideEffectsFlagPlugin.moduleHasSideEffects(moduleName, glob, cache)
 				);
 		}
 	}
diff --git a/lib/optimize/SplitChunksPlugin.js b/lib/optimize/SplitChunksPlugin.js
index 729c4eaa25b..3589d110223 100644
--- a/lib/optimize/SplitChunksPlugin.js
+++ b/lib/optimize/SplitChunksPlugin.js
@@ -2,38 +2,199 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Tobias Koppers @sokra
 */
+
 "use strict";
 
-const crypto = require("crypto");
-const SortableSet = require("../util/SortableSet");
-const GraphHelpers = require("../GraphHelpers");
+const Chunk = require("../Chunk");
+const { STAGE_ADVANCED } = require("../OptimizationStages");
+const WebpackError = require("../WebpackError");
+const { requestToId } = require("../ids/IdHelpers");
 const { isSubset } = require("../util/SetHelpers");
+const SortableSet = require("../util/SortableSet");
+const {
+	compareModulesByIdentifier,
+	compareIterables
+} = require("../util/comparators");
+const createHash = require("../util/createHash");
 const deterministicGrouping = require("../util/deterministicGrouping");
+const { makePathsRelative } = require("../util/identifier");
+const memoize = require("../util/memoize");
 const MinMaxSizeWarning = require("./MinMaxSizeWarning");
-const contextify = require("../util/identifier").contextify;
 
+/** @typedef {import("../../declarations/WebpackOptions").HashFunction} HashFunction */
+/** @typedef {import("../../declarations/WebpackOptions").OptimizationSplitChunksCacheGroup} OptimizationSplitChunksCacheGroup */
+/** @typedef {import("../../declarations/WebpackOptions").OptimizationSplitChunksGetCacheGroups} OptimizationSplitChunksGetCacheGroups */
+/** @typedef {import("../../declarations/WebpackOptions").OptimizationSplitChunksOptions} OptimizationSplitChunksOptions */
+/** @typedef {import("../../declarations/WebpackOptions").OptimizationSplitChunksSizes} OptimizationSplitChunksSizes */
+/** @typedef {import("../../declarations/WebpackOptions").Output} OutputOptions */
+/** @typedef {import("../Chunk").ChunkName} ChunkName */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../ChunkGroup")} ChunkGroup */
 /** @typedef {import("../Compiler")} Compiler */
-/** @typedef {import("../Chunk")} Chunk */
 /** @typedef {import("../Module")} Module */
-/** @typedef {import("../util/deterministicGrouping").Options} DeterministicGroupingOptionsForModule */
+/** @typedef {import("../ModuleGraph")} ModuleGraph */
+/** @typedef {import("../TemplatedPathPlugin").TemplatePath} TemplatePath */
 /** @typedef {import("../util/deterministicGrouping").GroupedItems} DeterministicGroupingGroupedItemsForModule */
+/** @typedef {import("../util/deterministicGrouping").Options} DeterministicGroupingOptionsForModule */
 
-const deterministicGroupingForModules = /** @type {function(DeterministicGroupingOptionsForModule): DeterministicGroupingGroupedItemsForModule[]} */ (deterministicGrouping);
+/** @typedef {Record} SplitChunksSizes */
 
-const hashFilename = name => {
-	return crypto
-		.createHash("md4")
-		.update(name)
-		.digest("hex")
-		.slice(0, 8);
-};
+/**
+ * @callback ChunkFilterFunction
+ * @param {Chunk} chunk
+ * @returns {boolean | undefined}
+ */
+
+/**
+ * @callback CombineSizeFunction
+ * @param {number} a
+ * @param {number} b
+ * @returns {number}
+ */
+
+/**
+ * @typedef {object} CacheGroupSource
+ * @property {string} key
+ * @property {number=} priority
+ * @property {GetName=} getName
+ * @property {ChunkFilterFunction=} chunksFilter
+ * @property {boolean=} enforce
+ * @property {SplitChunksSizes} minSize
+ * @property {SplitChunksSizes} minSizeReduction
+ * @property {SplitChunksSizes} minRemainingSize
+ * @property {SplitChunksSizes} enforceSizeThreshold
+ * @property {SplitChunksSizes} maxAsyncSize
+ * @property {SplitChunksSizes} maxInitialSize
+ * @property {number=} minChunks
+ * @property {number=} maxAsyncRequests
+ * @property {number=} maxInitialRequests
+ * @property {TemplatePath=} filename
+ * @property {string=} idHint
+ * @property {string=} automaticNameDelimiter
+ * @property {boolean=} reuseExistingChunk
+ * @property {boolean=} usedExports
+ */
+
+/**
+ * @typedef {object} CacheGroup
+ * @property {string} key
+ * @property {number} priority
+ * @property {GetName=} getName
+ * @property {ChunkFilterFunction} chunksFilter
+ * @property {SplitChunksSizes} minSize
+ * @property {SplitChunksSizes} minSizeReduction
+ * @property {SplitChunksSizes} minRemainingSize
+ * @property {SplitChunksSizes} enforceSizeThreshold
+ * @property {SplitChunksSizes} maxAsyncSize
+ * @property {SplitChunksSizes} maxInitialSize
+ * @property {number} minChunks
+ * @property {number} maxAsyncRequests
+ * @property {number} maxInitialRequests
+ * @property {TemplatePath=} filename
+ * @property {string} idHint
+ * @property {string} automaticNameDelimiter
+ * @property {boolean} reuseExistingChunk
+ * @property {boolean} usedExports
+ * @property {boolean} _validateSize
+ * @property {boolean} _validateRemainingSize
+ * @property {SplitChunksSizes} _minSizeForMaxSize
+ * @property {boolean} _conditionalEnforce
+ */
+
+/**
+ * @typedef {object} FallbackCacheGroup
+ * @property {ChunkFilterFunction} chunksFilter
+ * @property {SplitChunksSizes} minSize
+ * @property {SplitChunksSizes} maxAsyncSize
+ * @property {SplitChunksSizes} maxInitialSize
+ * @property {string} automaticNameDelimiter
+ */
+
+/**
+ * @typedef {object} CacheGroupsContext
+ * @property {ModuleGraph} moduleGraph
+ * @property {ChunkGraph} chunkGraph
+ */
 
-const sortByIdentifier = (a, b) => {
-	if (a.identifier() > b.identifier()) return 1;
-	if (a.identifier() < b.identifier()) return -1;
-	return 0;
+/**
+ * @callback GetCacheGroups
+ * @param {Module} module
+ * @param {CacheGroupsContext} context
+ * @returns {CacheGroupSource[] | null}
+ */
+
+/**
+ * @callback GetName
+ * @param {Module} module
+ * @param {Chunk[]} chunks
+ * @param {string} key
+ * @returns {string=}
+ */
+
+/**
+ * @typedef {object} SplitChunksOptions
+ * @property {ChunkFilterFunction} chunksFilter
+ * @property {string[]} defaultSizeTypes
+ * @property {SplitChunksSizes} minSize
+ * @property {SplitChunksSizes} minSizeReduction
+ * @property {SplitChunksSizes} minRemainingSize
+ * @property {SplitChunksSizes} enforceSizeThreshold
+ * @property {SplitChunksSizes} maxInitialSize
+ * @property {SplitChunksSizes} maxAsyncSize
+ * @property {number} minChunks
+ * @property {number} maxAsyncRequests
+ * @property {number} maxInitialRequests
+ * @property {boolean} hidePathInfo
+ * @property {TemplatePath=} filename
+ * @property {string} automaticNameDelimiter
+ * @property {GetCacheGroups} getCacheGroups
+ * @property {GetName} getName
+ * @property {boolean} usedExports
+ * @property {FallbackCacheGroup} fallbackCacheGroup
+ */
+
+/**
+ * @typedef {object} ChunksInfoItem
+ * @property {SortableSet} modules
+ * @property {CacheGroup} cacheGroup
+ * @property {number} cacheGroupIndex
+ * @property {string=} name
+ * @property {Record} sizes
+ * @property {Set} chunks
+ * @property {Set} reusableChunks
+ * @property {Set} chunksKeys
+ */
+
+/** @type {GetName} */
+const defaultGetName = () => undefined;
+
+const deterministicGroupingForModules =
+	/** @type {(options: DeterministicGroupingOptionsForModule) => DeterministicGroupingGroupedItemsForModule[]} */
+	(deterministicGrouping);
+
+/** @type {WeakMap} */
+const getKeyCache = new WeakMap();
+
+/**
+ * @param {string} name a filename to hash
+ * @param {OutputOptions} outputOptions hash function used
+ * @returns {string} hashed filename
+ */
+const hashFilename = (name, outputOptions) => {
+	const digest =
+		/** @type {string} */
+		(
+			createHash(/** @type {HashFunction} */ (outputOptions.hashFunction))
+				.update(name)
+				.digest(outputOptions.hashDigest)
+		);
+	return digest.slice(0, 8);
 };
 
+/**
+ * @param {Chunk} chunk the chunk
+ * @returns {number} the number of requests
+ */
 const getRequests = chunk => {
 	let requests = 0;
 	for (const chunkGroup of chunk.groupsIterable) {
@@ -42,12 +203,23 @@ const getRequests = chunk => {
 	return requests;
 };
 
-const getModulesSize = modules => {
-	let sum = 0;
-	for (const m of modules) {
-		sum += m.size();
+/**
+ * @template {object} T
+ * @template {object} R
+ * @param {T} obj obj an object
+ * @param {function(T[keyof T], keyof T): T[keyof T]} fn fn
+ * @returns {T} result
+ */
+const mapObject = (obj, fn) => {
+	const newObj = Object.create(null);
+	for (const key of Object.keys(obj)) {
+		newObj[key] = fn(
+			obj[/** @type {keyof T} */ (key)],
+			/** @type {keyof T} */
+			(key)
+		);
 	}
-	return sum;
+	return newObj;
 };
 
 /**
@@ -63,6 +235,13 @@ const isOverlap = (a, b) => {
 	return false;
 };
 
+const compareModuleIterables = compareIterables(compareModulesByIdentifier);
+
+/**
+ * @param {ChunksInfoItem} a item
+ * @param {ChunksInfoItem} b item
+ * @returns {number} compare result
+ */
 const compareEntries = (a, b) => {
 	// 1. by priority
 	const diffPriority = a.cacheGroup.priority - b.cacheGroup.priority;
@@ -71,312 +250,763 @@ const compareEntries = (a, b) => {
 	const diffCount = a.chunks.size - b.chunks.size;
 	if (diffCount) return diffCount;
 	// 3. by size reduction
-	const aSizeReduce = a.size * (a.chunks.size - 1);
-	const bSizeReduce = b.size * (b.chunks.size - 1);
+	const aSizeReduce = totalSize(a.sizes) * (a.chunks.size - 1);
+	const bSizeReduce = totalSize(b.sizes) * (b.chunks.size - 1);
 	const diffSizeReduce = aSizeReduce - bSizeReduce;
 	if (diffSizeReduce) return diffSizeReduce;
-	// 4. by number of modules (to be able to compare by identifier)
+	// 4. by cache group index
+	const indexDiff = b.cacheGroupIndex - a.cacheGroupIndex;
+	if (indexDiff) return indexDiff;
+	// 5. by number of modules (to be able to compare by identifier)
 	const modulesA = a.modules;
 	const modulesB = b.modules;
 	const diff = modulesA.size - modulesB.size;
 	if (diff) return diff;
-	// 5. by module identifiers
+	// 6. by module identifiers
 	modulesA.sort();
 	modulesB.sort();
-	const aI = modulesA[Symbol.iterator]();
-	const bI = modulesB[Symbol.iterator]();
-	// eslint-disable-next-line no-constant-condition
-	while (true) {
-		const aItem = aI.next();
-		const bItem = bI.next();
-		if (aItem.done) return 0;
-		const aModuleIdentifier = aItem.value.identifier();
-		const bModuleIdentifier = bItem.value.identifier();
-		if (aModuleIdentifier > bModuleIdentifier) return -1;
-		if (aModuleIdentifier < bModuleIdentifier) return 1;
-	}
+	return compareModuleIterables(modulesA, modulesB);
 };
 
-const compareNumbers = (a, b) => a - b;
-
+/**
+ * @param {Chunk} chunk the chunk
+ * @returns {boolean} true, if the chunk is an entry chunk
+ */
 const INITIAL_CHUNK_FILTER = chunk => chunk.canBeInitial();
+/**
+ * @param {Chunk} chunk the chunk
+ * @returns {boolean} true, if the chunk is an async chunk
+ */
 const ASYNC_CHUNK_FILTER = chunk => !chunk.canBeInitial();
+/**
+ * @param {Chunk} chunk the chunk
+ * @returns {boolean} always true
+ */
 const ALL_CHUNK_FILTER = chunk => true;
 
-module.exports = class SplitChunksPlugin {
-	constructor(options) {
-		this.options = SplitChunksPlugin.normalizeOptions(options);
+/**
+ * @param {OptimizationSplitChunksSizes | undefined} value the sizes
+ * @param {string[]} defaultSizeTypes the default size types
+ * @returns {SplitChunksSizes} normalized representation
+ */
+const normalizeSizes = (value, defaultSizeTypes) => {
+	if (typeof value === "number") {
+		/** @type {Record} */
+		const o = {};
+		for (const sizeType of defaultSizeTypes) o[sizeType] = value;
+		return o;
+	} else if (typeof value === "object" && value !== null) {
+		return { ...value };
 	}
+	return {};
+};
 
-	static normalizeOptions(options = {}) {
-		return {
-			chunksFilter: SplitChunksPlugin.normalizeChunksFilter(
-				options.chunks || "all"
-			),
-			minSize: options.minSize || 0,
-			maxSize: options.maxSize || 0,
-			minChunks: options.minChunks || 1,
-			maxAsyncRequests: options.maxAsyncRequests || 1,
-			maxInitialRequests: options.maxInitialRequests || 1,
-			hidePathInfo: options.hidePathInfo || false,
-			filename: options.filename || undefined,
-			getCacheGroups: SplitChunksPlugin.normalizeCacheGroups({
-				cacheGroups: options.cacheGroups,
-				name: options.name,
-				automaticNameDelimiter: options.automaticNameDelimiter
-			}),
-			automaticNameDelimiter: options.automaticNameDelimiter,
-			fallbackCacheGroup: SplitChunksPlugin.normalizeFallbackCacheGroup(
-				options.fallbackCacheGroup || {},
-				options
-			)
-		};
+/**
+ * @param {...(SplitChunksSizes | undefined)} sizes the sizes
+ * @returns {SplitChunksSizes} the merged sizes
+ */
+const mergeSizes = (...sizes) => {
+	/** @type {SplitChunksSizes} */
+	let merged = {};
+	for (let i = sizes.length - 1; i >= 0; i--) {
+		merged = Object.assign(merged, sizes[i]);
 	}
+	return merged;
+};
 
-	static normalizeName({ name, automaticNameDelimiter, automaticNamePrefix }) {
-		if (name === true) {
-			/** @type {WeakMap>} */
-			const cache = new WeakMap();
-			const fn = (module, chunks, cacheGroup) => {
-				let cacheEntry = cache.get(chunks);
-				if (cacheEntry === undefined) {
-					cacheEntry = {};
-					cache.set(chunks, cacheEntry);
-				} else if (cacheGroup in cacheEntry) {
-					return cacheEntry[cacheGroup];
-				}
-				const names = chunks.map(c => c.name);
-				if (!names.every(Boolean)) {
-					cacheEntry[cacheGroup] = undefined;
-					return;
-				}
-				names.sort();
-				const prefix =
-					typeof automaticNamePrefix === "string"
-						? automaticNamePrefix
-						: cacheGroup;
-				const namePrefix = prefix ? prefix + automaticNameDelimiter : "";
-				let name = namePrefix + names.join(automaticNameDelimiter);
-				// Filenames and paths can't be too long otherwise an
-				// ENAMETOOLONG error is raised. If the generated name if too
-				// long, it is truncated and a hash is appended. The limit has
-				// been set to 100 to prevent `[name].[chunkhash].[ext]` from
-				// generating a 256+ character string.
-				if (name.length > 100) {
-					name =
-						name.slice(0, 100) + automaticNameDelimiter + hashFilename(name);
-				}
-				cacheEntry[cacheGroup] = name;
-				return name;
-			};
-			return fn;
-		}
-		if (typeof name === "string") {
-			const fn = () => {
-				return name;
-			};
-			return fn;
-		}
-		if (typeof name === "function") return name;
+/**
+ * @param {SplitChunksSizes} sizes the sizes
+ * @returns {boolean} true, if there are sizes > 0
+ */
+const hasNonZeroSizes = sizes => {
+	for (const key of Object.keys(sizes)) {
+		if (sizes[key] > 0) return true;
 	}
+	return false;
+};
 
-	static normalizeChunksFilter(chunks) {
-		if (chunks === "initial") {
-			return INITIAL_CHUNK_FILTER;
-		}
-		if (chunks === "async") {
-			return ASYNC_CHUNK_FILTER;
-		}
-		if (chunks === "all") {
-			return ALL_CHUNK_FILTER;
+/**
+ * @param {SplitChunksSizes} a first sizes
+ * @param {SplitChunksSizes} b second sizes
+ * @param {CombineSizeFunction} combine a function to combine sizes
+ * @returns {SplitChunksSizes} the combine sizes
+ */
+const combineSizes = (a, b, combine) => {
+	const aKeys = new Set(Object.keys(a));
+	const bKeys = new Set(Object.keys(b));
+	/** @type {SplitChunksSizes} */
+	const result = {};
+	for (const key of aKeys) {
+		result[key] = bKeys.has(key) ? combine(a[key], b[key]) : a[key];
+	}
+	for (const key of bKeys) {
+		if (!aKeys.has(key)) {
+			result[key] = b[key];
 		}
-		if (typeof chunks === "function") return chunks;
-	}
-
-	static normalizeFallbackCacheGroup(
-		{
-			minSize = undefined,
-			maxSize = undefined,
-			automaticNameDelimiter = undefined
-		},
-		{
-			minSize: defaultMinSize = undefined,
-			maxSize: defaultMaxSize = undefined,
-			automaticNameDelimiter: defaultAutomaticNameDelimiter = undefined
+	}
+	return result;
+};
+
+/**
+ * @param {SplitChunksSizes} sizes the sizes
+ * @param {SplitChunksSizes} minSize the min sizes
+ * @returns {boolean} true if there are sizes and all existing sizes are at least `minSize`
+ */
+const checkMinSize = (sizes, minSize) => {
+	for (const key of Object.keys(minSize)) {
+		const size = sizes[key];
+		if (size === undefined || size === 0) continue;
+		if (size < minSize[key]) return false;
+	}
+	return true;
+};
+
+/**
+ * @param {SplitChunksSizes} sizes the sizes
+ * @param {SplitChunksSizes} minSizeReduction the min sizes
+ * @param {number} chunkCount number of chunks
+ * @returns {boolean} true if there are sizes and all existing sizes are at least `minSizeReduction`
+ */
+const checkMinSizeReduction = (sizes, minSizeReduction, chunkCount) => {
+	for (const key of Object.keys(minSizeReduction)) {
+		const size = sizes[key];
+		if (size === undefined || size === 0) continue;
+		if (size * chunkCount < minSizeReduction[key]) return false;
+	}
+	return true;
+};
+
+/**
+ * @param {SplitChunksSizes} sizes the sizes
+ * @param {SplitChunksSizes} minSize the min sizes
+ * @returns {undefined | string[]} list of size types that are below min size
+ */
+const getViolatingMinSizes = (sizes, minSize) => {
+	let list;
+	for (const key of Object.keys(minSize)) {
+		const size = sizes[key];
+		if (size === undefined || size === 0) continue;
+		if (size < minSize[key]) {
+			if (list === undefined) list = [key];
+			else list.push(key);
 		}
-	) {
-		return {
-			minSize: typeof minSize === "number" ? minSize : defaultMinSize || 0,
-			maxSize: typeof maxSize === "number" ? maxSize : defaultMaxSize || 0,
-			automaticNameDelimiter:
-				automaticNameDelimiter || defaultAutomaticNameDelimiter || "~"
-		};
 	}
+	return list;
+};
+
+/**
+ * @param {SplitChunksSizes} sizes the sizes
+ * @returns {number} the total size
+ */
+const totalSize = sizes => {
+	let size = 0;
+	for (const key of Object.keys(sizes)) {
+		size += sizes[key];
+	}
+	return size;
+};
+
+/**
+ * @param {OptimizationSplitChunksCacheGroup["name"]} name the chunk name
+ * @returns {GetName | undefined} a function to get the name of the chunk
+ */
+const normalizeName = name => {
+	if (typeof name === "string") {
+		return () => name;
+	}
+	if (typeof name === "function") {
+		return /** @type {GetName} */ (name);
+	}
+};
 
-	static normalizeCacheGroups({ cacheGroups, name, automaticNameDelimiter }) {
-		if (typeof cacheGroups === "function") {
-			// TODO webpack 5 remove this
-			if (cacheGroups.length !== 1) {
-				return module => cacheGroups(module, module.getChunks());
+/**
+ * @param {OptimizationSplitChunksCacheGroup["chunks"]} chunks the chunk filter option
+ * @returns {ChunkFilterFunction | undefined} the chunk filter function
+ */
+const normalizeChunksFilter = chunks => {
+	if (chunks === "initial") {
+		return INITIAL_CHUNK_FILTER;
+	}
+	if (chunks === "async") {
+		return ASYNC_CHUNK_FILTER;
+	}
+	if (chunks === "all") {
+		return ALL_CHUNK_FILTER;
+	}
+	if (chunks instanceof RegExp) {
+		return chunk => (chunk.name ? chunks.test(chunk.name) : false);
+	}
+	if (typeof chunks === "function") {
+		return chunks;
+	}
+};
+
+/**
+ * @param {undefined | GetCacheGroups | Record} cacheGroups the cache group options
+ * @param {string[]} defaultSizeTypes the default size types
+ * @returns {GetCacheGroups} a function to get the cache groups
+ */
+const normalizeCacheGroups = (cacheGroups, defaultSizeTypes) => {
+	if (typeof cacheGroups === "function") {
+		return cacheGroups;
+	}
+	if (typeof cacheGroups === "object" && cacheGroups !== null) {
+		/** @type {((module: Module, context: CacheGroupsContext, results: CacheGroupSource[]) => void)[]} */
+		const handlers = [];
+		for (const key of Object.keys(cacheGroups)) {
+			const option = cacheGroups[key];
+			if (option === false) {
+				continue;
 			}
-			return cacheGroups;
-		}
-		if (cacheGroups && typeof cacheGroups === "object") {
-			const fn = module => {
-				let results;
-				for (const key of Object.keys(cacheGroups)) {
-					let option = cacheGroups[key];
-					if (option === false) continue;
-					if (option instanceof RegExp || typeof option === "string") {
-						option = {
-							test: option
-						};
+			if (typeof option === "string" || option instanceof RegExp) {
+				const source = createCacheGroupSource({}, key, defaultSizeTypes);
+				handlers.push((module, context, results) => {
+					if (checkTest(option, module, context)) {
+						results.push(source);
 					}
-					if (typeof option === "function") {
-						let result = option(module);
-						if (result) {
-							if (results === undefined) results = [];
-							for (const r of Array.isArray(result) ? result : [result]) {
-								const result = Object.assign({ key }, r);
-								if (result.name) result.getName = () => result.name;
-								if (result.chunks) {
-									result.chunksFilter = SplitChunksPlugin.normalizeChunksFilter(
-										result.chunks
-									);
-								}
-								results.push(result);
+				});
+			} else if (typeof option === "function") {
+				const cache = new WeakMap();
+				handlers.push((module, context, results) => {
+					const result = option(module);
+					if (result) {
+						const groups = Array.isArray(result) ? result : [result];
+						for (const group of groups) {
+							const cachedSource = cache.get(group);
+							if (cachedSource !== undefined) {
+								results.push(cachedSource);
+							} else {
+								const source = createCacheGroupSource(
+									group,
+									key,
+									defaultSizeTypes
+								);
+								cache.set(group, source);
+								results.push(source);
 							}
 						}
-					} else if (SplitChunksPlugin.checkTest(option.test, module)) {
-						if (results === undefined) results = [];
-						results.push({
-							key: key,
-							priority: option.priority,
-							getName:
-								SplitChunksPlugin.normalizeName({
-									name: option.name || name,
-									automaticNameDelimiter:
-										typeof option.automaticNameDelimiter === "string"
-											? option.automaticNameDelimiter
-											: automaticNameDelimiter,
-									automaticNamePrefix: option.automaticNamePrefix
-								}) || (() => {}),
-							chunksFilter: SplitChunksPlugin.normalizeChunksFilter(
-								option.chunks
-							),
-							enforce: option.enforce,
-							minSize: option.minSize,
-							maxSize: option.maxSize,
-							minChunks: option.minChunks,
-							maxAsyncRequests: option.maxAsyncRequests,
-							maxInitialRequests: option.maxInitialRequests,
-							filename: option.filename,
-							reuseExistingChunk: option.reuseExistingChunk
-						});
 					}
-				}
-				return results;
-			};
-			return fn;
+				});
+			} else {
+				const source = createCacheGroupSource(option, key, defaultSizeTypes);
+				handlers.push((module, context, results) => {
+					if (
+						checkTest(option.test, module, context) &&
+						checkModuleType(option.type, module) &&
+						checkModuleLayer(option.layer, module)
+					) {
+						results.push(source);
+					}
+				});
+			}
 		}
-		const fn = () => {};
+		/**
+		 * @param {Module} module the current module
+		 * @param {CacheGroupsContext} context the current context
+		 * @returns {CacheGroupSource[]} the matching cache groups
+		 */
+		const fn = (module, context) => {
+			/** @type {CacheGroupSource[]} */
+			const results = [];
+			for (const fn of handlers) {
+				fn(module, context, results);
+			}
+			return results;
+		};
 		return fn;
 	}
+	return () => null;
+};
 
-	static checkTest(test, module) {
-		if (test === undefined) return true;
-		if (typeof test === "function") {
-			if (test.length !== 1) {
-				return test(module, module.getChunks());
-			}
-			return test(module);
-		}
-		if (typeof test === "boolean") return test;
-		if (typeof test === "string") {
-			if (
-				module.nameForCondition &&
-				module.nameForCondition().startsWith(test)
-			) {
-				return true;
-			}
-			for (const chunk of module.chunksIterable) {
-				if (chunk.name && chunk.name.startsWith(test)) {
-					return true;
-				}
-			}
-			return false;
-		}
-		if (test instanceof RegExp) {
-			if (module.nameForCondition && test.test(module.nameForCondition())) {
-				return true;
-			}
-			for (const chunk of module.chunksIterable) {
-				if (chunk.name && test.test(chunk.name)) {
-					return true;
-				}
+/**
+ * @param {OptimizationSplitChunksCacheGroup["test"]} test test option
+ * @param {Module} module the module
+ * @param {CacheGroupsContext} context context object
+ * @returns {boolean} true, if the module should be selected
+ */
+const checkTest = (test, module, context) => {
+	if (test === undefined) return true;
+	if (typeof test === "function") {
+		return test(module, context);
+	}
+	if (typeof test === "boolean") return test;
+	if (typeof test === "string") {
+		const name = module.nameForCondition();
+		return name ? name.startsWith(test) : false;
+	}
+	if (test instanceof RegExp) {
+		const name = module.nameForCondition();
+		return name ? test.test(name) : false;
+	}
+	return false;
+};
+
+/**
+ * @param {OptimizationSplitChunksCacheGroup["type"]} test type option
+ * @param {Module} module the module
+ * @returns {boolean} true, if the module should be selected
+ */
+const checkModuleType = (test, module) => {
+	if (test === undefined) return true;
+	if (typeof test === "function") {
+		return test(module.type);
+	}
+	if (typeof test === "string") {
+		const type = module.type;
+		return test === type;
+	}
+	if (test instanceof RegExp) {
+		const type = module.type;
+		return test.test(type);
+	}
+	return false;
+};
+
+/**
+ * @param {OptimizationSplitChunksCacheGroup["layer"]} test type option
+ * @param {Module} module the module
+ * @returns {boolean} true, if the module should be selected
+ */
+const checkModuleLayer = (test, module) => {
+	if (test === undefined) return true;
+	if (typeof test === "function") {
+		return test(module.layer);
+	}
+	if (typeof test === "string") {
+		const layer = module.layer;
+		return test === "" ? !layer : layer ? layer.startsWith(test) : false;
+	}
+	if (test instanceof RegExp) {
+		const layer = module.layer;
+		return layer ? test.test(layer) : false;
+	}
+	return false;
+};
+
+/**
+ * @param {OptimizationSplitChunksCacheGroup} options the group options
+ * @param {string} key key of cache group
+ * @param {string[]} defaultSizeTypes the default size types
+ * @returns {CacheGroupSource} the normalized cached group
+ */
+const createCacheGroupSource = (options, key, defaultSizeTypes) => {
+	const minSize = normalizeSizes(options.minSize, defaultSizeTypes);
+	const minSizeReduction = normalizeSizes(
+		options.minSizeReduction,
+		defaultSizeTypes
+	);
+	const maxSize = normalizeSizes(options.maxSize, defaultSizeTypes);
+	return {
+		key,
+		priority: options.priority,
+		getName: normalizeName(options.name),
+		chunksFilter: normalizeChunksFilter(options.chunks),
+		enforce: options.enforce,
+		minSize,
+		minSizeReduction,
+		minRemainingSize: mergeSizes(
+			normalizeSizes(options.minRemainingSize, defaultSizeTypes),
+			minSize
+		),
+		enforceSizeThreshold: normalizeSizes(
+			options.enforceSizeThreshold,
+			defaultSizeTypes
+		),
+		maxAsyncSize: mergeSizes(
+			normalizeSizes(options.maxAsyncSize, defaultSizeTypes),
+			maxSize
+		),
+		maxInitialSize: mergeSizes(
+			normalizeSizes(options.maxInitialSize, defaultSizeTypes),
+			maxSize
+		),
+		minChunks: options.minChunks,
+		maxAsyncRequests: options.maxAsyncRequests,
+		maxInitialRequests: options.maxInitialRequests,
+		filename: options.filename,
+		idHint: options.idHint,
+		automaticNameDelimiter: options.automaticNameDelimiter,
+		reuseExistingChunk: options.reuseExistingChunk,
+		usedExports: options.usedExports
+	};
+};
+
+const PLUGIN_NAME = "SplitChunksPlugin";
+
+module.exports = class SplitChunksPlugin {
+	/**
+	 * @param {OptimizationSplitChunksOptions=} options plugin options
+	 */
+	constructor(options = {}) {
+		const defaultSizeTypes = options.defaultSizeTypes || [
+			"javascript",
+			"unknown"
+		];
+		const fallbackCacheGroup = options.fallbackCacheGroup || {};
+		const minSize = normalizeSizes(options.minSize, defaultSizeTypes);
+		const minSizeReduction = normalizeSizes(
+			options.minSizeReduction,
+			defaultSizeTypes
+		);
+		const maxSize = normalizeSizes(options.maxSize, defaultSizeTypes);
+
+		/** @type {SplitChunksOptions} */
+		this.options = {
+			chunksFilter:
+				/** @type {ChunkFilterFunction} */
+				(normalizeChunksFilter(options.chunks || "all")),
+			defaultSizeTypes,
+			minSize,
+			minSizeReduction,
+			minRemainingSize: mergeSizes(
+				normalizeSizes(options.minRemainingSize, defaultSizeTypes),
+				minSize
+			),
+			enforceSizeThreshold: normalizeSizes(
+				options.enforceSizeThreshold,
+				defaultSizeTypes
+			),
+			maxAsyncSize: mergeSizes(
+				normalizeSizes(options.maxAsyncSize, defaultSizeTypes),
+				maxSize
+			),
+			maxInitialSize: mergeSizes(
+				normalizeSizes(options.maxInitialSize, defaultSizeTypes),
+				maxSize
+			),
+			minChunks: options.minChunks || 1,
+			maxAsyncRequests: options.maxAsyncRequests || 1,
+			maxInitialRequests: options.maxInitialRequests || 1,
+			hidePathInfo: options.hidePathInfo || false,
+			filename: options.filename || undefined,
+			getCacheGroups: normalizeCacheGroups(
+				options.cacheGroups,
+				defaultSizeTypes
+			),
+			getName: options.name
+				? /** @type {GetName} */ (normalizeName(options.name))
+				: defaultGetName,
+			automaticNameDelimiter: options.automaticNameDelimiter || "-",
+			usedExports: options.usedExports || false,
+			fallbackCacheGroup: {
+				chunksFilter:
+					/** @type {ChunkFilterFunction} */
+					(
+						normalizeChunksFilter(
+							fallbackCacheGroup.chunks || options.chunks || "all"
+						)
+					),
+				minSize: mergeSizes(
+					normalizeSizes(fallbackCacheGroup.minSize, defaultSizeTypes),
+					minSize
+				),
+				maxAsyncSize: mergeSizes(
+					normalizeSizes(fallbackCacheGroup.maxAsyncSize, defaultSizeTypes),
+					normalizeSizes(fallbackCacheGroup.maxSize, defaultSizeTypes),
+					normalizeSizes(options.maxAsyncSize, defaultSizeTypes),
+					normalizeSizes(options.maxSize, defaultSizeTypes)
+				),
+				maxInitialSize: mergeSizes(
+					normalizeSizes(fallbackCacheGroup.maxInitialSize, defaultSizeTypes),
+					normalizeSizes(fallbackCacheGroup.maxSize, defaultSizeTypes),
+					normalizeSizes(options.maxInitialSize, defaultSizeTypes),
+					normalizeSizes(options.maxSize, defaultSizeTypes)
+				),
+				automaticNameDelimiter:
+					fallbackCacheGroup.automaticNameDelimiter ||
+					options.automaticNameDelimiter ||
+					"~"
 			}
-			return false;
-		}
-		return false;
+		};
+
+		/** @type {WeakMap} */
+		this._cacheGroupCache = new WeakMap();
+	}
+
+	/**
+	 * @param {CacheGroupSource} cacheGroupSource source
+	 * @returns {CacheGroup} the cache group (cached)
+	 */
+	_getCacheGroup(cacheGroupSource) {
+		const cacheEntry = this._cacheGroupCache.get(cacheGroupSource);
+		if (cacheEntry !== undefined) return cacheEntry;
+		const minSize = mergeSizes(
+			cacheGroupSource.minSize,
+			cacheGroupSource.enforce ? undefined : this.options.minSize
+		);
+		const minSizeReduction = mergeSizes(
+			cacheGroupSource.minSizeReduction,
+			cacheGroupSource.enforce ? undefined : this.options.minSizeReduction
+		);
+		const minRemainingSize = mergeSizes(
+			cacheGroupSource.minRemainingSize,
+			cacheGroupSource.enforce ? undefined : this.options.minRemainingSize
+		);
+		const enforceSizeThreshold = mergeSizes(
+			cacheGroupSource.enforceSizeThreshold,
+			cacheGroupSource.enforce ? undefined : this.options.enforceSizeThreshold
+		);
+		/** @type {CacheGroup} */
+		const cacheGroup = {
+			key: cacheGroupSource.key,
+			priority: cacheGroupSource.priority || 0,
+			chunksFilter: cacheGroupSource.chunksFilter || this.options.chunksFilter,
+			minSize,
+			minSizeReduction,
+			minRemainingSize,
+			enforceSizeThreshold,
+			maxAsyncSize: mergeSizes(
+				cacheGroupSource.maxAsyncSize,
+				cacheGroupSource.enforce ? undefined : this.options.maxAsyncSize
+			),
+			maxInitialSize: mergeSizes(
+				cacheGroupSource.maxInitialSize,
+				cacheGroupSource.enforce ? undefined : this.options.maxInitialSize
+			),
+			minChunks:
+				cacheGroupSource.minChunks !== undefined
+					? cacheGroupSource.minChunks
+					: cacheGroupSource.enforce
+						? 1
+						: this.options.minChunks,
+			maxAsyncRequests:
+				cacheGroupSource.maxAsyncRequests !== undefined
+					? cacheGroupSource.maxAsyncRequests
+					: cacheGroupSource.enforce
+						? Infinity
+						: this.options.maxAsyncRequests,
+			maxInitialRequests:
+				cacheGroupSource.maxInitialRequests !== undefined
+					? cacheGroupSource.maxInitialRequests
+					: cacheGroupSource.enforce
+						? Infinity
+						: this.options.maxInitialRequests,
+			getName:
+				cacheGroupSource.getName !== undefined
+					? cacheGroupSource.getName
+					: this.options.getName,
+			usedExports:
+				cacheGroupSource.usedExports !== undefined
+					? cacheGroupSource.usedExports
+					: this.options.usedExports,
+			filename:
+				cacheGroupSource.filename !== undefined
+					? cacheGroupSource.filename
+					: this.options.filename,
+			automaticNameDelimiter:
+				cacheGroupSource.automaticNameDelimiter !== undefined
+					? cacheGroupSource.automaticNameDelimiter
+					: this.options.automaticNameDelimiter,
+			idHint:
+				cacheGroupSource.idHint !== undefined
+					? cacheGroupSource.idHint
+					: cacheGroupSource.key,
+			reuseExistingChunk: cacheGroupSource.reuseExistingChunk || false,
+			_validateSize: hasNonZeroSizes(minSize),
+			_validateRemainingSize: hasNonZeroSizes(minRemainingSize),
+			_minSizeForMaxSize: mergeSizes(
+				cacheGroupSource.minSize,
+				this.options.minSize
+			),
+			_conditionalEnforce: hasNonZeroSizes(enforceSizeThreshold)
+		};
+		this._cacheGroupCache.set(cacheGroupSource, cacheGroup);
+		return cacheGroup;
 	}
 
 	/**
-	 * @param {Compiler} compiler webpack compiler
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
 	 * @returns {void}
 	 */
 	apply(compiler) {
-		compiler.hooks.thisCompilation.tap("SplitChunksPlugin", compilation => {
+		const cachedMakePathsRelative = makePathsRelative.bindContextCache(
+			compiler.context,
+			compiler.root
+		);
+		compiler.hooks.thisCompilation.tap(PLUGIN_NAME, compilation => {
+			const logger = compilation.getLogger(`webpack.${PLUGIN_NAME}`);
 			let alreadyOptimized = false;
-			compilation.hooks.unseal.tap("SplitChunksPlugin", () => {
+			compilation.hooks.unseal.tap(PLUGIN_NAME, () => {
 				alreadyOptimized = false;
 			});
-			compilation.hooks.optimizeChunksAdvanced.tap(
-				"SplitChunksPlugin",
+			compilation.hooks.optimizeChunks.tap(
+				{
+					name: PLUGIN_NAME,
+					stage: STAGE_ADVANCED
+				},
 				chunks => {
 					if (alreadyOptimized) return;
 					alreadyOptimized = true;
+					logger.time("prepare");
+					const chunkGraph = compilation.chunkGraph;
+					const moduleGraph = compilation.moduleGraph;
 					// Give each selected chunk an index (to create strings from chunks)
-					const indexMap = new Map();
-					let index = 1;
+					/** @type {Map} */
+					const chunkIndexMap = new Map();
+					const ZERO = BigInt("0");
+					const ONE = BigInt("1");
+					const START = ONE << BigInt("31");
+					let index = START;
 					for (const chunk of chunks) {
-						indexMap.set(chunk, index++);
+						chunkIndexMap.set(
+							chunk,
+							index | BigInt((Math.random() * 0x7fffffff) | 0)
+						);
+						index = index << ONE;
 					}
+					/**
+					 * @param {Iterable} chunks list of chunks
+					 * @returns {bigint | Chunk} key of the chunks
+					 */
 					const getKey = chunks => {
-						return Array.from(chunks, c => indexMap.get(c))
-							.sort(compareNumbers)
-							.join();
+						const iterator = chunks[Symbol.iterator]();
+						let result = iterator.next();
+						if (result.done) return ZERO;
+						const first = result.value;
+						result = iterator.next();
+						if (result.done) return first;
+						let key =
+							/** @type {bigint} */ (chunkIndexMap.get(first)) |
+							/** @type {bigint} */ (chunkIndexMap.get(result.value));
+						while (!(result = iterator.next()).done) {
+							const raw = chunkIndexMap.get(result.value);
+							key = key ^ /** @type {bigint} */ (raw);
+						}
+						return key;
 					};
-					/** @type {Map>} */
-					const chunkSetsInGraph = new Map();
-					for (const module of compilation.modules) {
-						const chunksKey = getKey(module.chunksIterable);
-						if (!chunkSetsInGraph.has(chunksKey)) {
-							chunkSetsInGraph.set(chunksKey, new Set(module.chunksIterable));
+					/**
+					 * @param {bigint | Chunk} key key of the chunks
+					 * @returns {string} stringified key
+					 */
+					const keyToString = key => {
+						if (typeof key === "bigint") return key.toString(16);
+						return /** @type {bigint} */ (chunkIndexMap.get(key)).toString(16);
+					};
+
+					const getChunkSetsInGraph = memoize(() => {
+						/** @type {Map>} */
+						const chunkSetsInGraph = new Map();
+						/** @type {Set} */
+						const singleChunkSets = new Set();
+						for (const module of compilation.modules) {
+							const chunks = chunkGraph.getModuleChunksIterable(module);
+							const chunksKey = getKey(chunks);
+							if (typeof chunksKey === "bigint") {
+								if (!chunkSetsInGraph.has(chunksKey)) {
+									chunkSetsInGraph.set(chunksKey, new Set(chunks));
+								}
+							} else {
+								singleChunkSets.add(chunksKey);
+							}
 						}
-					}
+						return { chunkSetsInGraph, singleChunkSets };
+					});
+
+					/**
+					 * @param {Module} module the module
+					 * @returns {Iterable} groups of chunks with equal exports
+					 */
+					const groupChunksByExports = module => {
+						const exportsInfo = moduleGraph.getExportsInfo(module);
+						const groupedByUsedExports = new Map();
+						for (const chunk of chunkGraph.getModuleChunksIterable(module)) {
+							const key = exportsInfo.getUsageKey(chunk.runtime);
+							const list = groupedByUsedExports.get(key);
+							if (list !== undefined) {
+								list.push(chunk);
+							} else {
+								groupedByUsedExports.set(key, [chunk]);
+							}
+						}
+						return groupedByUsedExports.values();
+					};
+
+					/** @type {Map>} */
+					const groupedByExportsMap = new Map();
+
+					const getExportsChunkSetsInGraph = memoize(() => {
+						/** @type {Map>} */
+						const chunkSetsInGraph = new Map();
+						/** @type {Set} */
+						const singleChunkSets = new Set();
+						for (const module of compilation.modules) {
+							const groupedChunks = Array.from(groupChunksByExports(module));
+							groupedByExportsMap.set(module, groupedChunks);
+							for (const chunks of groupedChunks) {
+								if (chunks.length === 1) {
+									singleChunkSets.add(chunks[0]);
+								} else {
+									const chunksKey = getKey(chunks);
+									if (!chunkSetsInGraph.has(chunksKey)) {
+										chunkSetsInGraph.set(chunksKey, new Set(chunks));
+									}
+								}
+							}
+						}
+						return { chunkSetsInGraph, singleChunkSets };
+					});
 
 					// group these set of chunks by count
 					// to allow to check less sets via isSubset
 					// (only smaller sets can be subset)
-					/** @type {Map>>} */
-					const chunkSetsByCount = new Map();
-					for (const chunksSet of chunkSetsInGraph.values()) {
-						const count = chunksSet.size;
-						let array = chunkSetsByCount.get(count);
-						if (array === undefined) {
-							array = [];
-							chunkSetsByCount.set(count, array);
-						}
-						array.push(chunksSet);
-					}
+					/**
+					 * @param {IterableIterator>} chunkSets set of sets of chunks
+					 * @returns {Map>>} map of sets of chunks by count
+					 */
+					const groupChunkSetsByCount = chunkSets => {
+						/** @type {Map>>} */
+						const chunkSetsByCount = new Map();
+						for (const chunksSet of chunkSets) {
+							const count = chunksSet.size;
+							let array = chunkSetsByCount.get(count);
+							if (array === undefined) {
+								array = [];
+								chunkSetsByCount.set(count, array);
+							}
+							array.push(chunksSet);
+						}
+						return chunkSetsByCount;
+					};
+					const getChunkSetsByCount = memoize(() =>
+						groupChunkSetsByCount(
+							getChunkSetsInGraph().chunkSetsInGraph.values()
+						)
+					);
+					const getExportsChunkSetsByCount = memoize(() =>
+						groupChunkSetsByCount(
+							getExportsChunkSetsInGraph().chunkSetsInGraph.values()
+						)
+					);
 
 					// Create a list of possible combinations
-					const combinationsCache = new Map(); // Map[]>
+					/**
+					 * @param {Map>} chunkSets chunk sets
+					 * @param {Set} singleChunkSets single chunks sets
+					 * @param {Map[]>} chunkSetsByCount chunk sets by count
+					 * @returns {(key: bigint | Chunk) => (Set | Chunk)[]} combinations
+					 */
+					const createGetCombinations = (
+						chunkSets,
+						singleChunkSets,
+						chunkSetsByCount
+					) => {
+						/** @type {Map | Chunk)[]>} */
+						const combinationsCache = new Map();
 
-					const getCombinations = key => {
-						const chunksSet = chunkSetsInGraph.get(key);
-						var array = [chunksSet];
-						if (chunksSet.size > 1) {
+						return key => {
+							const cacheEntry = combinationsCache.get(key);
+							if (cacheEntry !== undefined) return cacheEntry;
+							if (key instanceof Chunk) {
+								const result = [key];
+								combinationsCache.set(key, result);
+								return result;
+							}
+							const chunksSet =
+								/** @type {Set} */
+								(chunkSets.get(key));
+							/** @type {(Set | Chunk)[]} */
+							const array = [chunksSet];
 							for (const [count, setArray] of chunkSetsByCount) {
 								// "equal" is not needed because they would have been merge in the first step
 								if (count < chunksSet.size) {
@@ -387,27 +1017,60 @@ module.exports = class SplitChunksPlugin {
 									}
 								}
 							}
-						}
-						return array;
+							for (const chunk of singleChunkSets) {
+								if (chunksSet.has(chunk)) {
+									array.push(chunk);
+								}
+							}
+							combinationsCache.set(key, array);
+							return array;
+						};
 					};
 
+					const getCombinationsFactory = memoize(() => {
+						const { chunkSetsInGraph, singleChunkSets } = getChunkSetsInGraph();
+						return createGetCombinations(
+							chunkSetsInGraph,
+							singleChunkSets,
+							getChunkSetsByCount()
+						);
+					});
+
 					/**
-					 * @typedef {Object} SelectedChunksResult
-					 * @property {Chunk[]} chunks the list of chunks
-					 * @property {string} key a key of the list
+					 * @param {bigint | Chunk} key key
+					 * @returns {(Set | Chunk)[]} combinations by key
 					 */
+					const getCombinations = key => getCombinationsFactory()(key);
 
+					const getExportsCombinationsFactory = memoize(() => {
+						const { chunkSetsInGraph, singleChunkSets } =
+							getExportsChunkSetsInGraph();
+						return createGetCombinations(
+							chunkSetsInGraph,
+							singleChunkSets,
+							getExportsChunkSetsByCount()
+						);
+					});
 					/**
-					 * @typedef {function(Chunk): boolean} ChunkFilterFunction
+					 * @param {bigint | Chunk} key key
+					 * @returns {(Set | Chunk)[]} exports combinations by key
 					 */
+					const getExportsCombinations = key =>
+						getExportsCombinationsFactory()(key);
 
-					/** @type {WeakMap, WeakMap>} */
+					/**
+					 * @typedef {object} SelectedChunksResult
+					 * @property {Chunk[]} chunks the list of chunks
+					 * @property {bigint | Chunk} key a key of the list
+					 */
+
+					/** @type {WeakMap | Chunk, WeakMap>} */
 					const selectedChunksCacheByChunksSet = new WeakMap();
 
 					/**
 					 * get list and key by applying the filter function to the list
 					 * It is cached for performance reasons
-					 * @param {Set} chunks list of chunks
+					 * @param {Set | Chunk} chunks list of chunks
 					 * @param {ChunkFilterFunction} chunkFilter filter function for chunks
 					 * @returns {SelectedChunksResult} list and key
 					 */
@@ -417,13 +1080,18 @@ module.exports = class SplitChunksPlugin {
 							entry = new WeakMap();
 							selectedChunksCacheByChunksSet.set(chunks, entry);
 						}
-						/** @type {SelectedChunksResult} */
-						let entry2 = entry.get(chunkFilter);
+						let entry2 =
+							/** @type {SelectedChunksResult} */
+							(entry.get(chunkFilter));
 						if (entry2 === undefined) {
 							/** @type {Chunk[]} */
 							const selectedChunks = [];
-							for (const chunk of chunks) {
-								if (chunkFilter(chunk)) selectedChunks.push(chunk);
+							if (chunks instanceof Chunk) {
+								if (chunkFilter(chunks)) selectedChunks.push(chunks);
+							} else {
+								for (const chunk of chunks) {
+									if (chunkFilter(chunk)) selectedChunks.push(chunk);
+								}
 							}
 							entry2 = {
 								chunks: selectedChunks,
@@ -434,17 +1102,10 @@ module.exports = class SplitChunksPlugin {
 						return entry2;
 					};
 
-					/**
-					 * @typedef {Object} ChunksInfoItem
-					 * @property {SortableSet} modules
-					 * @property {TODO} cacheGroup
-					 * @property {string} name
-					 * @property {boolean} validateSize
-					 * @property {number} size
-					 * @property {Set} chunks
-					 * @property {Set} reuseableChunks
-					 * @property {Set} chunksKeys
-					 */
+					/** @type {Map} */
+					const alreadyValidatedParents = new Map();
+					/** @type {Set} */
+					const alreadyReportedErrors = new Set();
 
 					// Map a list of chunks to a list of modules
 					// For the key the chunk "index" is used, the value is a SortableSet of modules
@@ -452,14 +1113,16 @@ module.exports = class SplitChunksPlugin {
 					const chunksInfoMap = new Map();
 
 					/**
-					 * @param {TODO} cacheGroup the current cache group
+					 * @param {CacheGroup} cacheGroup the current cache group
+					 * @param {number} cacheGroupIndex the index of the cache group of ordering
 					 * @param {Chunk[]} selectedChunks chunks selected for this module
-					 * @param {string} selectedChunksKey a key of selectedChunks
+					 * @param {bigint | Chunk} selectedChunksKey a key of selectedChunks
 					 * @param {Module} module the current module
 					 * @returns {void}
 					 */
 					const addModuleToChunksInfoMap = (
 						cacheGroup,
+						cacheGroupIndex,
 						selectedChunks,
 						selectedChunksKey,
 						module
@@ -467,149 +1130,245 @@ module.exports = class SplitChunksPlugin {
 						// Break if minimum number of chunks is not reached
 						if (selectedChunks.length < cacheGroup.minChunks) return;
 						// Determine name for split chunk
-						const name = cacheGroup.getName(
-							module,
-							selectedChunks,
-							cacheGroup.key
-						);
+
+						const name =
+							/** @type {GetName} */
+							(cacheGroup.getName)(module, selectedChunks, cacheGroup.key);
+						// Check if the name is ok
+						const existingChunk = name && compilation.namedChunks.get(name);
+						if (existingChunk) {
+							const parentValidationKey = `${name}|${
+								typeof selectedChunksKey === "bigint"
+									? selectedChunksKey
+									: selectedChunksKey.debugId
+							}`;
+							const valid = alreadyValidatedParents.get(parentValidationKey);
+							if (valid === false) return;
+							if (valid === undefined) {
+								// Module can only be moved into the existing chunk if the existing chunk
+								// is a parent of all selected chunks
+								let isInAllParents = true;
+								/** @type {Set} */
+								const queue = new Set();
+								for (const chunk of selectedChunks) {
+									for (const group of chunk.groupsIterable) {
+										queue.add(group);
+									}
+								}
+								for (const group of queue) {
+									if (existingChunk.isInGroup(group)) continue;
+									let hasParent = false;
+									for (const parent of group.parentsIterable) {
+										hasParent = true;
+										queue.add(parent);
+									}
+									if (!hasParent) {
+										isInAllParents = false;
+									}
+								}
+								const valid = isInAllParents;
+								alreadyValidatedParents.set(parentValidationKey, valid);
+								if (!valid) {
+									if (!alreadyReportedErrors.has(name)) {
+										alreadyReportedErrors.add(name);
+										compilation.errors.push(
+											new WebpackError(
+												`${PLUGIN_NAME}\n` +
+													`Cache group "${cacheGroup.key}" conflicts with existing chunk.\n` +
+													`Both have the same name "${name}" and existing chunk is not a parent of the selected modules.\n` +
+													"Use a different name for the cache group or make sure that the existing chunk is a parent (e. g. via dependOn).\n" +
+													'HINT: You can omit "name" to automatically create a name.\n' +
+													"BREAKING CHANGE: webpack < 5 used to allow to use an entrypoint as splitChunk. " +
+													"This is no longer allowed when the entrypoint is not a parent of the selected modules.\n" +
+													"Remove this entrypoint and add modules to cache group's 'test' instead. " +
+													"If you need modules to be evaluated on startup, add them to the existing entrypoints (make them arrays). " +
+													"See migration guide of more info."
+											)
+										);
+									}
+									return;
+								}
+							}
+						}
 						// Create key for maps
 						// When it has a name we use the name as key
-						// Elsewise we create the key from chunks and cache group key
+						// Otherwise we create the key from chunks and cache group key
 						// This automatically merges equal names
 						const key =
 							cacheGroup.key +
-							(name ? ` name:${name}` : ` chunks:${selectedChunksKey}`);
+							(name
+								? ` name:${name}`
+								: ` chunks:${keyToString(selectedChunksKey)}`);
 						// Add module to maps
 						let info = chunksInfoMap.get(key);
 						if (info === undefined) {
 							chunksInfoMap.set(
 								key,
 								(info = {
-									modules: new SortableSet(undefined, sortByIdentifier),
+									modules: new SortableSet(
+										undefined,
+										compareModulesByIdentifier
+									),
 									cacheGroup,
+									cacheGroupIndex,
 									name,
-									validateSize: cacheGroup.minSize > 0,
-									size: 0,
+									sizes: {},
 									chunks: new Set(),
-									reuseableChunks: new Set(),
+									reusableChunks: new Set(),
 									chunksKeys: new Set()
 								})
 							);
 						}
+						const oldSize = info.modules.size;
 						info.modules.add(module);
-						if (info.validateSize) {
-							info.size += module.size();
+						if (info.modules.size !== oldSize) {
+							for (const type of module.getSourceTypes()) {
+								info.sizes[type] = (info.sizes[type] || 0) + module.size(type);
+							}
 						}
-						if (!info.chunksKeys.has(selectedChunksKey)) {
-							info.chunksKeys.add(selectedChunksKey);
+						const oldChunksKeysSize = info.chunksKeys.size;
+						info.chunksKeys.add(selectedChunksKey);
+						if (oldChunksKeysSize !== info.chunksKeys.size) {
 							for (const chunk of selectedChunks) {
 								info.chunks.add(chunk);
 							}
 						}
 					};
 
+					const context = {
+						moduleGraph,
+						chunkGraph
+					};
+
+					logger.timeEnd("prepare");
+
+					logger.time("modules");
+
 					// Walk through all modules
 					for (const module of compilation.modules) {
 						// Get cache group
-						let cacheGroups = this.options.getCacheGroups(module);
+						const cacheGroups = this.options.getCacheGroups(module, context);
 						if (!Array.isArray(cacheGroups) || cacheGroups.length === 0) {
 							continue;
 						}
 
-						// Prepare some values
-						const chunksKey = getKey(module.chunksIterable);
-						let combs = combinationsCache.get(chunksKey);
-						if (combs === undefined) {
-							combs = getCombinations(chunksKey);
-							combinationsCache.set(chunksKey, combs);
-						}
+						// Prepare some values (usedExports = false)
+						const getCombs = memoize(() => {
+							const chunks = chunkGraph.getModuleChunksIterable(module);
+							const chunksKey = getKey(chunks);
+							return getCombinations(chunksKey);
+						});
 
+						// Prepare some values (usedExports = true)
+						const getCombsByUsedExports = memoize(() => {
+							// fill the groupedByExportsMap
+							getExportsChunkSetsInGraph();
+							/** @type {Set | Chunk>} */
+							const set = new Set();
+							const groupedByUsedExports =
+								/** @type {Iterable} */
+								(groupedByExportsMap.get(module));
+							for (const chunks of groupedByUsedExports) {
+								const chunksKey = getKey(chunks);
+								for (const comb of getExportsCombinations(chunksKey))
+									set.add(comb);
+							}
+							return set;
+						});
+
+						let cacheGroupIndex = 0;
 						for (const cacheGroupSource of cacheGroups) {
-							const cacheGroup = {
-								key: cacheGroupSource.key,
-								priority: cacheGroupSource.priority || 0,
-								chunksFilter:
-									cacheGroupSource.chunksFilter || this.options.chunksFilter,
-								minSize:
-									cacheGroupSource.minSize !== undefined
-										? cacheGroupSource.minSize
-										: cacheGroupSource.enforce
-											? 0
-											: this.options.minSize,
-								minSizeForMaxSize:
-									cacheGroupSource.minSize !== undefined
-										? cacheGroupSource.minSize
-										: this.options.minSize,
-								maxSize:
-									cacheGroupSource.maxSize !== undefined
-										? cacheGroupSource.maxSize
-										: cacheGroupSource.enforce
-											? 0
-											: this.options.maxSize,
-								minChunks:
-									cacheGroupSource.minChunks !== undefined
-										? cacheGroupSource.minChunks
-										: cacheGroupSource.enforce
-											? 1
-											: this.options.minChunks,
-								maxAsyncRequests:
-									cacheGroupSource.maxAsyncRequests !== undefined
-										? cacheGroupSource.maxAsyncRequests
-										: cacheGroupSource.enforce
-											? Infinity
-											: this.options.maxAsyncRequests,
-								maxInitialRequests:
-									cacheGroupSource.maxInitialRequests !== undefined
-										? cacheGroupSource.maxInitialRequests
-										: cacheGroupSource.enforce
-											? Infinity
-											: this.options.maxInitialRequests,
-								getName:
-									cacheGroupSource.getName !== undefined
-										? cacheGroupSource.getName
-										: this.options.getName,
-								filename:
-									cacheGroupSource.filename !== undefined
-										? cacheGroupSource.filename
-										: this.options.filename,
-								automaticNameDelimiter:
-									cacheGroupSource.automaticNameDelimiter !== undefined
-										? cacheGroupSource.automaticNameDelimiter
-										: this.options.automaticNameDelimiter,
-								reuseExistingChunk: cacheGroupSource.reuseExistingChunk
-							};
+							const cacheGroup = this._getCacheGroup(cacheGroupSource);
+
+							const combs = cacheGroup.usedExports
+								? getCombsByUsedExports()
+								: getCombs();
 							// For all combination of chunk selection
 							for (const chunkCombination of combs) {
 								// Break if minimum number of chunks is not reached
-								if (chunkCombination.size < cacheGroup.minChunks) continue;
+								const count =
+									chunkCombination instanceof Chunk ? 1 : chunkCombination.size;
+								if (count < cacheGroup.minChunks) continue;
 								// Select chunks by configuration
-								const {
-									chunks: selectedChunks,
-									key: selectedChunksKey
-								} = getSelectedChunks(
-									chunkCombination,
-									cacheGroup.chunksFilter
-								);
+								const { chunks: selectedChunks, key: selectedChunksKey } =
+									getSelectedChunks(
+										chunkCombination,
+										/** @type {ChunkFilterFunction} */
+										(cacheGroup.chunksFilter)
+									);
 
 								addModuleToChunksInfoMap(
 									cacheGroup,
+									cacheGroupIndex,
 									selectedChunks,
 									selectedChunksKey,
 									module
 								);
 							}
+							cacheGroupIndex++;
 						}
 					}
 
+					logger.timeEnd("modules");
+
+					logger.time("queue");
+
+					/**
+					 * @param {ChunksInfoItem} info entry
+					 * @param {string[]} sourceTypes source types to be removed
+					 */
+					const removeModulesWithSourceType = (info, sourceTypes) => {
+						for (const module of info.modules) {
+							const types = module.getSourceTypes();
+							if (sourceTypes.some(type => types.has(type))) {
+								info.modules.delete(module);
+								for (const type of types) {
+									info.sizes[type] -= module.size(type);
+								}
+							}
+						}
+					};
+
+					/**
+					 * @param {ChunksInfoItem} info entry
+					 * @returns {boolean} true, if entry become empty
+					 */
+					const removeMinSizeViolatingModules = info => {
+						if (!info.cacheGroup._validateSize) return false;
+						const violatingSizes = getViolatingMinSizes(
+							info.sizes,
+							info.cacheGroup.minSize
+						);
+						if (violatingSizes === undefined) return false;
+						removeModulesWithSourceType(info, violatingSizes);
+						return info.modules.size === 0;
+					};
+
 					// Filter items were size < minSize
-					for (const pair of chunksInfoMap) {
-						const info = pair[1];
-						if (info.validateSize && info.size < info.cacheGroup.minSize) {
-							chunksInfoMap.delete(pair[0]);
+					for (const [key, info] of chunksInfoMap) {
+						if (removeMinSizeViolatingModules(info)) {
+							chunksInfoMap.delete(key);
+						} else if (
+							!checkMinSizeReduction(
+								info.sizes,
+								info.cacheGroup.minSizeReduction,
+								info.chunks.size
+							)
+						) {
+							chunksInfoMap.delete(key);
 						}
 					}
 
-					/** @type {Map} */
+					/**
+					 * @typedef {object} MaxSizeQueueItem
+					 * @property {SplitChunksSizes} minSize
+					 * @property {SplitChunksSizes} maxAsyncSize
+					 * @property {SplitChunksSizes} maxInitialSize
+					 * @property {string} automaticNameDelimiter
+					 * @property {string[]} keys
+					 */
+
+					/** @type {Map} */
 					const maxSizeQueueMap = new Map();
 
 					while (chunksInfoMap.size > 0) {
@@ -619,30 +1378,52 @@ module.exports = class SplitChunksPlugin {
 						for (const pair of chunksInfoMap) {
 							const key = pair[0];
 							const info = pair[1];
-							if (bestEntry === undefined) {
-								bestEntry = info;
-								bestEntryKey = key;
-							} else if (compareEntries(bestEntry, info) < 0) {
+							if (
+								bestEntry === undefined ||
+								compareEntries(bestEntry, info) < 0
+							) {
 								bestEntry = info;
 								bestEntryKey = key;
 							}
 						}
 
-						const item = bestEntry;
-						chunksInfoMap.delete(bestEntryKey);
+						const item = /** @type {ChunksInfoItem} */ (bestEntry);
+						chunksInfoMap.delete(/** @type {string} */ (bestEntryKey));
 
+						/** @type {ChunkName | undefined} */
 						let chunkName = item.name;
 						// Variable for the new chunk (lazy created)
-						/** @type {Chunk} */
+						/** @type {Chunk | undefined} */
 						let newChunk;
 						// When no chunk name, check if we can reuse a chunk instead of creating a new one
-						let isReused = false;
-						if (item.cacheGroup.reuseExistingChunk) {
+						let isExistingChunk = false;
+						let isReusedWithAllModules = false;
+						if (chunkName) {
+							const chunkByName = compilation.namedChunks.get(chunkName);
+							if (chunkByName !== undefined) {
+								newChunk = chunkByName;
+								const oldSize = item.chunks.size;
+								item.chunks.delete(newChunk);
+								isExistingChunk = item.chunks.size !== oldSize;
+							}
+						} else if (item.cacheGroup.reuseExistingChunk) {
 							outer: for (const chunk of item.chunks) {
-								if (chunk.getNumberOfModules() !== item.modules.size) continue;
-								if (chunk.hasEntryModule()) continue;
+								if (
+									chunkGraph.getNumberOfChunkModules(chunk) !==
+									item.modules.size
+								) {
+									continue;
+								}
+								if (
+									item.chunks.size > 1 &&
+									chunkGraph.getNumberOfEntryModules(chunk) > 0
+								) {
+									continue;
+								}
 								for (const module of item.modules) {
-									if (!chunk.containsModule(module)) continue outer;
+									if (!chunkGraph.isModuleInChunk(module, chunk)) {
+										continue outer;
+									}
 								}
 								if (!newChunk || !newChunk.name) {
 									newChunk = chunk;
@@ -658,58 +1439,110 @@ module.exports = class SplitChunksPlugin {
 								) {
 									newChunk = chunk;
 								}
+							}
+							if (newChunk) {
+								item.chunks.delete(newChunk);
 								chunkName = undefined;
-								isReused = true;
+								isExistingChunk = true;
+								isReusedWithAllModules = true;
 							}
 						}
-						// Check if maxRequests condition can be fulfilled
 
-						const usedChunks = Array.from(item.chunks).filter(chunk => {
-							// skip if we address ourself
-							return (
-								(!chunkName || chunk.name !== chunkName) && chunk !== newChunk
-							);
-						});
+						const enforced =
+							item.cacheGroup._conditionalEnforce &&
+							checkMinSize(item.sizes, item.cacheGroup.enforceSizeThreshold);
 
-						// Skip when no chunk selected
-						if (usedChunks.length === 0) continue;
+						const usedChunks = new Set(item.chunks);
 
+						// Check if maxRequests condition can be fulfilled
 						if (
-							Number.isFinite(item.cacheGroup.maxInitialRequests) ||
-							Number.isFinite(item.cacheGroup.maxAsyncRequests)
+							!enforced &&
+							(Number.isFinite(item.cacheGroup.maxInitialRequests) ||
+								Number.isFinite(item.cacheGroup.maxAsyncRequests))
 						) {
-							const chunkInLimit = usedChunks.filter(chunk => {
-								// respect max requests when not enforced
+							for (const chunk of usedChunks) {
+								// respect max requests
 								const maxRequests = chunk.isOnlyInitial()
 									? item.cacheGroup.maxInitialRequests
 									: chunk.canBeInitial()
 										? Math.min(
 												item.cacheGroup.maxInitialRequests,
 												item.cacheGroup.maxAsyncRequests
-										  )
+											)
 										: item.cacheGroup.maxAsyncRequests;
-								return (
-									!isFinite(maxRequests) || getRequests(chunk) < maxRequests
-								);
-							});
+								if (
+									Number.isFinite(maxRequests) &&
+									getRequests(chunk) >= maxRequests
+								) {
+									usedChunks.delete(chunk);
+								}
+							}
+						}
 
-							if (chunkInLimit.length < usedChunks.length) {
-								if (chunkInLimit.length >= item.cacheGroup.minChunks) {
-									for (const module of item.modules) {
-										addModuleToChunksInfoMap(
-											item.cacheGroup,
-											chunkInLimit,
-											getKey(chunkInLimit),
-											module
-										);
+						outer: for (const chunk of usedChunks) {
+							for (const module of item.modules) {
+								if (chunkGraph.isModuleInChunk(module, chunk)) continue outer;
+							}
+							usedChunks.delete(chunk);
+						}
+
+						// Were some (invalid) chunks removed from usedChunks?
+						// => readd all modules to the queue, as things could have been changed
+						if (usedChunks.size < item.chunks.size) {
+							if (isExistingChunk)
+								usedChunks.add(/** @type {Chunk} */ (newChunk));
+							if (usedChunks.size >= item.cacheGroup.minChunks) {
+								const chunksArr = Array.from(usedChunks);
+								for (const module of item.modules) {
+									addModuleToChunksInfoMap(
+										item.cacheGroup,
+										item.cacheGroupIndex,
+										chunksArr,
+										getKey(usedChunks),
+										module
+									);
+								}
+							}
+							continue;
+						}
+
+						// Validate minRemainingSize constraint when a single chunk is left over
+						if (
+							!enforced &&
+							item.cacheGroup._validateRemainingSize &&
+							usedChunks.size === 1
+						) {
+							const [chunk] = usedChunks;
+							const chunkSizes = Object.create(null);
+							for (const module of chunkGraph.getChunkModulesIterable(chunk)) {
+								if (!item.modules.has(module)) {
+									for (const type of module.getSourceTypes()) {
+										chunkSizes[type] =
+											(chunkSizes[type] || 0) + module.size(type);
 									}
 								}
+							}
+							const violatingSizes = getViolatingMinSizes(
+								chunkSizes,
+								item.cacheGroup.minRemainingSize
+							);
+							if (violatingSizes !== undefined) {
+								const oldModulesSize = item.modules.size;
+								removeModulesWithSourceType(item, violatingSizes);
+								if (
+									item.modules.size > 0 &&
+									item.modules.size !== oldModulesSize
+								) {
+									// queue this item again to be processed again
+									// without violating modules
+									chunksInfoMap.set(/** @type {string} */ (bestEntryKey), item);
+								}
 								continue;
 							}
 						}
 
 						// Create the new chunk if not reusing one
-						if (!isReused) {
+						if (newChunk === undefined) {
 							newChunk = compilation.addChunk(chunkName);
 						}
 						// Walk through all chunks
@@ -719,68 +1552,70 @@ module.exports = class SplitChunksPlugin {
 						}
 
 						// Add a note to the chunk
-						newChunk.chunkReason = isReused
-							? "reused as split chunk"
-							: "split chunk";
+						newChunk.chunkReason =
+							(newChunk.chunkReason ? `${newChunk.chunkReason}, ` : "") +
+							(isReusedWithAllModules
+								? "reused as split chunk"
+								: "split chunk");
 						if (item.cacheGroup.key) {
 							newChunk.chunkReason += ` (cache group: ${item.cacheGroup.key})`;
 						}
 						if (chunkName) {
 							newChunk.chunkReason += ` (name: ${chunkName})`;
-							// If the chosen name is already an entry point we remove the entry point
-							const entrypoint = compilation.entrypoints.get(chunkName);
-							if (entrypoint) {
-								compilation.entrypoints.delete(chunkName);
-								entrypoint.remove();
-								newChunk.entryModule = undefined;
-							}
 						}
 						if (item.cacheGroup.filename) {
-							if (!newChunk.isOnlyInitial()) {
-								throw new Error(
-									"SplitChunksPlugin: You are trying to set a filename for a chunk which is (also) loaded on demand. " +
-										"The runtime can only handle loading of chunks which match the chunkFilename schema. " +
-										"Using a custom filename would fail at runtime. " +
-										`(cache group: ${item.cacheGroup.key})`
-								);
-							}
 							newChunk.filenameTemplate = item.cacheGroup.filename;
 						}
-						if (!isReused) {
+						if (item.cacheGroup.idHint) {
+							newChunk.idNameHints.add(item.cacheGroup.idHint);
+						}
+						if (!isReusedWithAllModules) {
 							// Add all modules to the new chunk
 							for (const module of item.modules) {
-								if (typeof module.chunkCondition === "function") {
-									if (!module.chunkCondition(newChunk)) continue;
-								}
+								if (!module.chunkCondition(newChunk, compilation)) continue;
 								// Add module to new chunk
-								GraphHelpers.connectChunkAndModule(newChunk, module);
+								chunkGraph.connectChunkAndModule(newChunk, module);
 								// Remove module from used chunks
 								for (const chunk of usedChunks) {
-									chunk.removeModule(module);
-									module.rewriteChunkInReasons(chunk, [newChunk]);
+									chunkGraph.disconnectChunkAndModule(chunk, module);
 								}
 							}
 						} else {
 							// Remove all modules from used chunks
 							for (const module of item.modules) {
 								for (const chunk of usedChunks) {
-									chunk.removeModule(module);
-									module.rewriteChunkInReasons(chunk, [newChunk]);
+									chunkGraph.disconnectChunkAndModule(chunk, module);
 								}
 							}
 						}
 
-						if (item.cacheGroup.maxSize > 0) {
+						if (
+							Object.keys(item.cacheGroup.maxAsyncSize).length > 0 ||
+							Object.keys(item.cacheGroup.maxInitialSize).length > 0
+						) {
 							const oldMaxSizeSettings = maxSizeQueueMap.get(newChunk);
 							maxSizeQueueMap.set(newChunk, {
-								minSize: Math.max(
-									oldMaxSizeSettings ? oldMaxSizeSettings.minSize : 0,
-									item.cacheGroup.minSizeForMaxSize
-								),
-								maxSize: Math.min(
-									oldMaxSizeSettings ? oldMaxSizeSettings.maxSize : Infinity,
-									item.cacheGroup.maxSize
-								),
+								minSize: oldMaxSizeSettings
+									? combineSizes(
+											oldMaxSizeSettings.minSize,
+											item.cacheGroup._minSizeForMaxSize,
+											Math.max
+										)
+									: item.cacheGroup.minSize,
+								maxAsyncSize: oldMaxSizeSettings
+									? combineSizes(
+											oldMaxSizeSettings.maxAsyncSize,
+											item.cacheGroup.maxAsyncSize,
+											Math.min
+										)
+									: item.cacheGroup.maxAsyncSize,
+								maxInitialSize: oldMaxSizeSettings
+									? combineSizes(
+											oldMaxSizeSettings.maxInitialSize,
+											item.cacheGroup.maxInitialSize,
+											Math.min
+										)
+									: item.cacheGroup.maxInitialSize,
 								automaticNameDelimiter: item.cacheGroup.automaticNameDelimiter,
 								keys: oldMaxSizeSettings
 									? oldMaxSizeSettings.keys.concat(item.cacheGroup.key)
@@ -790,85 +1625,135 @@ module.exports = class SplitChunksPlugin {
 
 						// remove all modules from other entries and update size
 						for (const [key, info] of chunksInfoMap) {
-							if (isOverlap(info.chunks, item.chunks)) {
-								if (info.validateSize) {
-									// update modules and total size
-									// may remove it from the map when < minSize
-									const oldSize = info.modules.size;
-									for (const module of item.modules) {
+							if (isOverlap(info.chunks, usedChunks)) {
+								// update modules and total size
+								// may remove it from the map when < minSize
+								let updated = false;
+								for (const module of item.modules) {
+									if (info.modules.has(module)) {
+										// remove module
 										info.modules.delete(module);
+										// update size
+										for (const key of module.getSourceTypes()) {
+											info.sizes[key] -= module.size(key);
+										}
+										updated = true;
 									}
+								}
+								if (updated) {
 									if (info.modules.size === 0) {
 										chunksInfoMap.delete(key);
 										continue;
 									}
-									if (info.modules.size !== oldSize) {
-										info.size = getModulesSize(info.modules);
-										if (info.size < info.cacheGroup.minSize) {
-											chunksInfoMap.delete(key);
-										}
-									}
-								} else {
-									// only update the modules
-									for (const module of item.modules) {
-										info.modules.delete(module);
-									}
-									if (info.modules.size === 0) {
+									if (
+										removeMinSizeViolatingModules(info) ||
+										!checkMinSizeReduction(
+											info.sizes,
+											info.cacheGroup.minSizeReduction,
+											info.chunks.size
+										)
+									) {
 										chunksInfoMap.delete(key);
+										continue;
 									}
 								}
 							}
 						}
 					}
 
+					logger.timeEnd("queue");
+
+					logger.time("maxSize");
+
+					/** @type {Set} */
 					const incorrectMinMaxSizeSet = new Set();
 
+					const { outputOptions } = compilation;
+
 					// Make sure that maxSize is fulfilled
-					for (const chunk of compilation.chunks.slice()) {
-						const { minSize, maxSize, automaticNameDelimiter, keys } =
-							maxSizeQueueMap.get(chunk) || this.options.fallbackCacheGroup;
-						if (!maxSize) continue;
-						if (minSize > maxSize) {
-							const warningKey = `${keys && keys.join()} ${minSize} ${maxSize}`;
-							if (!incorrectMinMaxSizeSet.has(warningKey)) {
-								incorrectMinMaxSizeSet.add(warningKey);
-								compilation.warnings.push(
-									new MinMaxSizeWarning(keys, minSize, maxSize)
-								);
+					const { fallbackCacheGroup } = this.options;
+					for (const chunk of Array.from(compilation.chunks)) {
+						const chunkConfig = maxSizeQueueMap.get(chunk);
+						const {
+							minSize,
+							maxAsyncSize,
+							maxInitialSize,
+							automaticNameDelimiter
+						} = chunkConfig || fallbackCacheGroup;
+						if (!chunkConfig && !fallbackCacheGroup.chunksFilter(chunk))
+							continue;
+						/** @type {SplitChunksSizes} */
+						let maxSize;
+						if (chunk.isOnlyInitial()) {
+							maxSize = maxInitialSize;
+						} else if (chunk.canBeInitial()) {
+							maxSize = combineSizes(maxAsyncSize, maxInitialSize, Math.min);
+						} else {
+							maxSize = maxAsyncSize;
+						}
+						if (Object.keys(maxSize).length === 0) {
+							continue;
+						}
+						for (const key of Object.keys(maxSize)) {
+							const maxSizeValue = maxSize[key];
+							const minSizeValue = minSize[key];
+							if (
+								typeof minSizeValue === "number" &&
+								minSizeValue > maxSizeValue
+							) {
+								const keys = chunkConfig && chunkConfig.keys;
+								const warningKey = `${
+									keys && keys.join()
+								} ${minSizeValue} ${maxSizeValue}`;
+								if (!incorrectMinMaxSizeSet.has(warningKey)) {
+									incorrectMinMaxSizeSet.add(warningKey);
+									compilation.warnings.push(
+										new MinMaxSizeWarning(keys, minSizeValue, maxSizeValue)
+									);
+								}
 							}
 						}
 						const results = deterministicGroupingForModules({
-							maxSize: Math.max(minSize, maxSize),
 							minSize,
-							items: chunk.modulesIterable,
+							maxSize: mapObject(maxSize, (value, key) => {
+								const minSizeValue = minSize[key];
+								return typeof minSizeValue === "number"
+									? Math.max(value, minSizeValue)
+									: value;
+							}),
+							items: chunkGraph.getChunkModulesIterable(chunk),
 							getKey(module) {
-								const ident = contextify(
-									compilation.options.context,
-									module.identifier()
-								);
-								const name = module.nameForCondition
-									? contextify(
-											compilation.options.context,
-											module.nameForCondition()
-									  )
+								const cache = getKeyCache.get(module);
+								if (cache !== undefined) return cache;
+								const ident = cachedMakePathsRelative(module.identifier());
+								const nameForCondition =
+									module.nameForCondition && module.nameForCondition();
+								const name = nameForCondition
+									? cachedMakePathsRelative(nameForCondition)
 									: ident.replace(/^.*!|\?[^?!]*$/g, "");
 								const fullKey =
-									name + automaticNameDelimiter + hashFilename(ident);
-								return fullKey.replace(/[\\/?]/g, "_");
+									name +
+									automaticNameDelimiter +
+									hashFilename(ident, outputOptions);
+								const key = requestToId(fullKey);
+								getKeyCache.set(module, key);
+								return key;
 							},
 							getSize(module) {
-								return module.size();
+								const size = Object.create(null);
+								for (const key of module.getSourceTypes()) {
+									size[key] = module.size(key);
+								}
+								return size;
 							}
 						});
-						results.sort((a, b) => {
-							if (a.key < b.key) return -1;
-							if (a.key > b.key) return 1;
-							return 0;
-						});
+						if (results.length <= 1) {
+							continue;
+						}
 						for (let i = 0; i < results.length; i++) {
 							const group = results[i];
 							const key = this.options.hidePathInfo
-								? hashFilename(group.key)
+								? hashFilename(group.key, outputOptions)
 								: group.key;
 							let name = chunk.name
 								? chunk.name + automaticNameDelimiter + key
@@ -877,31 +1762,32 @@ module.exports = class SplitChunksPlugin {
 								name =
 									name.slice(0, 100) +
 									automaticNameDelimiter +
-									hashFilename(name);
+									hashFilename(name, outputOptions);
 							}
-							let newPart;
 							if (i !== results.length - 1) {
-								newPart = compilation.addChunk(name);
+								const newPart = compilation.addChunk(name);
 								chunk.split(newPart);
 								newPart.chunkReason = chunk.chunkReason;
+								if (chunk.filenameTemplate) {
+									newPart.filenameTemplate = chunk.filenameTemplate;
+								}
 								// Add all modules to the new chunk
 								for (const module of group.items) {
-									if (typeof module.chunkCondition === "function") {
-										if (!module.chunkCondition(newPart)) continue;
+									if (!module.chunkCondition(newPart, compilation)) {
+										continue;
 									}
 									// Add module to new chunk
-									GraphHelpers.connectChunkAndModule(newPart, module);
+									chunkGraph.connectChunkAndModule(newPart, module);
 									// Remove module from used chunks
-									chunk.removeModule(module);
-									module.rewriteChunkInReasons(chunk, [newPart]);
+									chunkGraph.disconnectChunkAndModule(chunk, module);
 								}
 							} else {
 								// change the chunk to be a part
-								newPart = chunk;
 								chunk.name = name;
 							}
 						}
 					}
+					logger.timeEnd("maxSize");
 				}
 			);
 		});
diff --git a/lib/performance/AssetsOverSizeLimitWarning.js b/lib/performance/AssetsOverSizeLimitWarning.js
index aac8b65a9ee..5b414fc0dfd 100644
--- a/lib/performance/AssetsOverSizeLimitWarning.js
+++ b/lib/performance/AssetsOverSizeLimitWarning.js
@@ -2,21 +2,25 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Sean Larkin @thelarkinn
 */
+
 "use strict";
 
+const { formatSize } = require("../SizeFormatHelpers");
 const WebpackError = require("../WebpackError");
-const SizeFormatHelpers = require("../SizeFormatHelpers");
+
+/** @typedef {import("./SizeLimitsPlugin").AssetDetails} AssetDetails */
 
 module.exports = class AssetsOverSizeLimitWarning extends WebpackError {
+	/**
+	 * @param {AssetDetails[]} assetsOverSizeLimit the assets
+	 * @param {number} assetLimit the size limit
+	 */
 	constructor(assetsOverSizeLimit, assetLimit) {
 		const assetLists = assetsOverSizeLimit
-			.map(
-				asset =>
-					`\n  ${asset.name} (${SizeFormatHelpers.formatSize(asset.size)})`
-			)
+			.map(asset => `\n  ${asset.name} (${formatSize(asset.size)})`)
 			.join("");
 
-		super(`asset size limit: The following asset(s) exceed the recommended size limit (${SizeFormatHelpers.formatSize(
+		super(`asset size limit: The following asset(s) exceed the recommended size limit (${formatSize(
 			assetLimit
 		)}).
 This can impact web performance.
@@ -24,7 +28,5 @@ Assets: ${assetLists}`);
 
 		this.name = "AssetsOverSizeLimitWarning";
 		this.assets = assetsOverSizeLimit;
-
-		Error.captureStackTrace(this, this.constructor);
 	}
 };
diff --git a/lib/performance/EntrypointsOverSizeLimitWarning.js b/lib/performance/EntrypointsOverSizeLimitWarning.js
index 3c29553d207..270e8aaa708 100644
--- a/lib/performance/EntrypointsOverSizeLimitWarning.js
+++ b/lib/performance/EntrypointsOverSizeLimitWarning.js
@@ -2,29 +2,34 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Sean Larkin @thelarkinn
 */
+
 "use strict";
 
+const { formatSize } = require("../SizeFormatHelpers");
 const WebpackError = require("../WebpackError");
-const SizeFormatHelpers = require("../SizeFormatHelpers");
+
+/** @typedef {import("./SizeLimitsPlugin").EntrypointDetails} EntrypointDetails */
 
 module.exports = class EntrypointsOverSizeLimitWarning extends WebpackError {
+	/**
+	 * @param {EntrypointDetails[]} entrypoints the entrypoints
+	 * @param {number} entrypointLimit the size limit
+	 */
 	constructor(entrypoints, entrypointLimit) {
 		const entrypointList = entrypoints
 			.map(
 				entrypoint =>
-					`\n  ${entrypoint.name} (${SizeFormatHelpers.formatSize(
+					`\n  ${entrypoint.name} (${formatSize(
 						entrypoint.size
 					)})\n${entrypoint.files.map(asset => `      ${asset}`).join("\n")}`
 			)
 			.join("");
-		super(`entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (${SizeFormatHelpers.formatSize(
+		super(`entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (${formatSize(
 			entrypointLimit
 		)}). This can impact web performance.
 Entrypoints:${entrypointList}\n`);
 
 		this.name = "EntrypointsOverSizeLimitWarning";
 		this.entrypoints = entrypoints;
-
-		Error.captureStackTrace(this, this.constructor);
 	}
 };
diff --git a/lib/performance/NoAsyncChunksWarning.js b/lib/performance/NoAsyncChunksWarning.js
index c64475f9712..a7319d5950b 100644
--- a/lib/performance/NoAsyncChunksWarning.js
+++ b/lib/performance/NoAsyncChunksWarning.js
@@ -2,6 +2,7 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Sean Larkin @thelarkinn
 */
+
 "use strict";
 
 const WebpackError = require("../WebpackError");
@@ -15,7 +16,5 @@ module.exports = class NoAsyncChunksWarning extends WebpackError {
 		);
 
 		this.name = "NoAsyncChunksWarning";
-
-		Error.captureStackTrace(this, this.constructor);
 	}
 };
diff --git a/lib/performance/SizeLimitsPlugin.js b/lib/performance/SizeLimitsPlugin.js
index 93b43651fa6..19b2dcdc6e3 100644
--- a/lib/performance/SizeLimitsPlugin.js
+++ b/lib/performance/SizeLimitsPlugin.js
@@ -2,66 +2,138 @@
 	MIT License http://www.opensource.org/licenses/mit-license.php
 	Author Sean Larkin @thelarkinn
 */
+
 "use strict";
-const EntrypointsOverSizeLimitWarning = require("./EntrypointsOverSizeLimitWarning");
+
+const { find } = require("../util/SetHelpers");
 const AssetsOverSizeLimitWarning = require("./AssetsOverSizeLimitWarning");
+const EntrypointsOverSizeLimitWarning = require("./EntrypointsOverSizeLimitWarning");
 const NoAsyncChunksWarning = require("./NoAsyncChunksWarning");
 
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../../declarations/WebpackOptions").PerformanceOptions} PerformanceOptions */
+/** @typedef {import("../ChunkGroup")} ChunkGroup */
+/** @typedef {import("../Compilation").Asset} Asset */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Entrypoint")} Entrypoint */
+/** @typedef {import("../WebpackError")} WebpackError */
+
+/**
+ * @typedef {object} AssetDetails
+ * @property {string} name
+ * @property {number} size
+ */
+
+/**
+ * @typedef {object} EntrypointDetails
+ * @property {string} name
+ * @property {number} size
+ * @property {string[]} files
+ */
+
+const isOverSizeLimitSet = new WeakSet();
+
+/**
+ * @param {Asset["name"]} name the name
+ * @param {Asset["source"]} source the source
+ * @param {Asset["info"]} info the info
+ * @returns {boolean} result
+ */
+const excludeSourceMap = (name, source, info) => !info.development;
+
+const PLUGIN_NAME = "SizeLimitsPlugin";
+
 module.exports = class SizeLimitsPlugin {
+	/**
+	 * @param {PerformanceOptions} options the plugin options
+	 */
 	constructor(options) {
 		this.hints = options.hints;
 		this.maxAssetSize = options.maxAssetSize;
 		this.maxEntrypointSize = options.maxEntrypointSize;
 		this.assetFilter = options.assetFilter;
 	}
+
+	/**
+	 * @param {ChunkGroup | Source} thing the resource to test
+	 * @returns {boolean} true if over the limit
+	 */
+	static isOverSizeLimit(thing) {
+		return isOverSizeLimitSet.has(thing);
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
 	apply(compiler) {
 		const entrypointSizeLimit = this.maxEntrypointSize;
 		const assetSizeLimit = this.maxAssetSize;
 		const hints = this.hints;
-		const assetFilter = this.assetFilter || (asset => !asset.endsWith(".map"));
+		const assetFilter = this.assetFilter || excludeSourceMap;
 
-		compiler.hooks.afterEmit.tap("SizeLimitsPlugin", compilation => {
+		compiler.hooks.afterEmit.tap(PLUGIN_NAME, compilation => {
+			/** @type {WebpackError[]} */
 			const warnings = [];
 
-			const getEntrypointSize = entrypoint =>
-				entrypoint.getFiles().reduce((currentSize, file) => {
-					if (assetFilter(file) && compilation.assets[file]) {
-						return currentSize + compilation.assets[file].size();
+			/**
+			 * @param {Entrypoint} entrypoint an entrypoint
+			 * @returns {number} the size of the entrypoint
+			 */
+			const getEntrypointSize = entrypoint => {
+				let size = 0;
+				for (const file of entrypoint.getFiles()) {
+					const asset = compilation.getAsset(file);
+					if (
+						asset &&
+						assetFilter(asset.name, asset.source, asset.info) &&
+						asset.source
+					) {
+						size += asset.info.size || asset.source.size();
 					}
+				}
+				return size;
+			};
 
-					return currentSize;
-				}, 0);
-
+			/** @type {AssetDetails[]} */
 			const assetsOverSizeLimit = [];
-			for (const assetName of Object.keys(compilation.assets)) {
-				if (!assetFilter(assetName)) {
+			for (const { name, source, info } of compilation.getAssets()) {
+				if (!assetFilter(name, source, info) || !source) {
 					continue;
 				}
 
-				const asset = compilation.assets[assetName];
-				const size = asset.size();
-				if (size > assetSizeLimit) {
+				const size = info.size || source.size();
+				if (size > /** @type {number} */ (assetSizeLimit)) {
 					assetsOverSizeLimit.push({
-						name: assetName,
-						size: size
+						name,
+						size
 					});
-					asset.isOverSizeLimit = true;
+					isOverSizeLimitSet.add(source);
 				}
 			}
 
+			/**
+			 * @param {Asset["name"]} name the name
+			 * @returns {boolean | undefined} result
+			 */
+			const fileFilter = name => {
+				const asset = compilation.getAsset(name);
+				return asset && assetFilter(asset.name, asset.source, asset.info);
+			};
+
+			/** @type {EntrypointDetails[]} */
 			const entrypointsOverLimit = [];
-			for (const pair of compilation.entrypoints) {
-				const name = pair[0];
-				const entry = pair[1];
+			for (const [name, entry] of compilation.entrypoints) {
 				const size = getEntrypointSize(entry);
 
-				if (size > entrypointSizeLimit) {
+				if (size > /** @type {number} */ (entrypointSizeLimit)) {
 					entrypointsOverLimit.push({
-						name: name,
-						size: size,
-						files: entry.getFiles().filter(assetFilter)
+						name,
+						size,
+						files: entry.getFiles().filter(fileFilter)
 					});
-					entry.isOverSizeLimit = true;
+					isOverSizeLimitSet.add(entry);
 				}
 			}
 
@@ -72,24 +144,28 @@ module.exports = class SizeLimitsPlugin {
 				// if !1, then 2, if !2 return
 				if (assetsOverSizeLimit.length > 0) {
 					warnings.push(
-						new AssetsOverSizeLimitWarning(assetsOverSizeLimit, assetSizeLimit)
+						new AssetsOverSizeLimitWarning(
+							assetsOverSizeLimit,
+							/** @type {number} */ (assetSizeLimit)
+						)
 					);
 				}
 				if (entrypointsOverLimit.length > 0) {
 					warnings.push(
 						new EntrypointsOverSizeLimitWarning(
 							entrypointsOverLimit,
-							entrypointSizeLimit
+							/** @type {number} */ (entrypointSizeLimit)
 						)
 					);
 				}
 
 				if (warnings.length > 0) {
-					const hasAsyncChunks =
-						compilation.chunks.filter(chunk => !chunk.canBeInitial()).length >
-						0;
+					const someAsyncChunk = find(
+						compilation.chunks,
+						chunk => !chunk.canBeInitial()
+					);
 
-					if (!hasAsyncChunks) {
+					if (!someAsyncChunk) {
 						warnings.push(new NoAsyncChunksWarning());
 					}
 
diff --git a/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js b/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js
new file mode 100644
index 00000000000..a330b4a4d73
--- /dev/null
+++ b/lib/prefetch/ChunkPrefetchFunctionRuntimeModule.js
@@ -0,0 +1,46 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeModule = require("../RuntimeModule");
+const Template = require("../Template");
+
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
+
+class ChunkPrefetchFunctionRuntimeModule extends RuntimeModule {
+	/**
+	 * @param {string} childType TODO
+	 * @param {string} runtimeFunction TODO
+	 * @param {string} runtimeHandlers TODO
+	 */
+	constructor(childType, runtimeFunction, runtimeHandlers) {
+		super(`chunk ${childType} function`);
+		this.childType = childType;
+		this.runtimeFunction = runtimeFunction;
+		this.runtimeHandlers = runtimeHandlers;
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const { runtimeFunction, runtimeHandlers } = this;
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const { runtimeTemplate } = compilation;
+		return Template.asString([
+			`${runtimeHandlers} = {};`,
+			`${runtimeFunction} = ${runtimeTemplate.basicFunction("chunkId", [
+				// map is shorter than forEach
+				`Object.keys(${runtimeHandlers}).map(${runtimeTemplate.basicFunction(
+					"key",
+					`${runtimeHandlers}[key](chunkId);`
+				)});`
+			])}`
+		]);
+	}
+}
+
+module.exports = ChunkPrefetchFunctionRuntimeModule;
diff --git a/lib/prefetch/ChunkPrefetchPreloadPlugin.js b/lib/prefetch/ChunkPrefetchPreloadPlugin.js
new file mode 100644
index 00000000000..e475f082c0e
--- /dev/null
+++ b/lib/prefetch/ChunkPrefetchPreloadPlugin.js
@@ -0,0 +1,97 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const ChunkPrefetchFunctionRuntimeModule = require("./ChunkPrefetchFunctionRuntimeModule");
+const ChunkPrefetchStartupRuntimeModule = require("./ChunkPrefetchStartupRuntimeModule");
+const ChunkPrefetchTriggerRuntimeModule = require("./ChunkPrefetchTriggerRuntimeModule");
+const ChunkPreloadTriggerRuntimeModule = require("./ChunkPreloadTriggerRuntimeModule");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../ChunkGroup").RawChunkGroupOptions} RawChunkGroupOptions */
+/** @typedef {import("../Compiler")} Compiler */
+
+const PLUGIN_NAME = "ChunkPrefetchPreloadPlugin";
+
+class ChunkPrefetchPreloadPlugin {
+	/**
+	 * @param {Compiler} compiler the compiler
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			compilation.hooks.additionalChunkRuntimeRequirements.tap(
+				PLUGIN_NAME,
+				(chunk, set, { chunkGraph }) => {
+					if (chunkGraph.getNumberOfEntryModules(chunk) === 0) return;
+					const startupChildChunks = chunk.getChildrenOfTypeInOrder(
+						chunkGraph,
+						"prefetchOrder"
+					);
+					if (startupChildChunks) {
+						set.add(RuntimeGlobals.prefetchChunk);
+						set.add(RuntimeGlobals.onChunksLoaded);
+						set.add(RuntimeGlobals.exports);
+						compilation.addRuntimeModule(
+							chunk,
+							new ChunkPrefetchStartupRuntimeModule(startupChildChunks)
+						);
+					}
+				}
+			);
+			compilation.hooks.additionalTreeRuntimeRequirements.tap(
+				PLUGIN_NAME,
+				(chunk, set, { chunkGraph }) => {
+					const chunkMap = chunk.getChildIdsByOrdersMap(chunkGraph);
+
+					if (chunkMap.prefetch) {
+						set.add(RuntimeGlobals.prefetchChunk);
+						compilation.addRuntimeModule(
+							chunk,
+							new ChunkPrefetchTriggerRuntimeModule(chunkMap.prefetch)
+						);
+					}
+					if (chunkMap.preload) {
+						set.add(RuntimeGlobals.preloadChunk);
+						compilation.addRuntimeModule(
+							chunk,
+							new ChunkPreloadTriggerRuntimeModule(chunkMap.preload)
+						);
+					}
+				}
+			);
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.prefetchChunk)
+				.tap(PLUGIN_NAME, (chunk, set) => {
+					compilation.addRuntimeModule(
+						chunk,
+						new ChunkPrefetchFunctionRuntimeModule(
+							"prefetch",
+							RuntimeGlobals.prefetchChunk,
+							RuntimeGlobals.prefetchChunkHandlers
+						)
+					);
+					set.add(RuntimeGlobals.prefetchChunkHandlers);
+				});
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.preloadChunk)
+				.tap(PLUGIN_NAME, (chunk, set) => {
+					compilation.addRuntimeModule(
+						chunk,
+						new ChunkPrefetchFunctionRuntimeModule(
+							"preload",
+							RuntimeGlobals.preloadChunk,
+							RuntimeGlobals.preloadChunkHandlers
+						)
+					);
+					set.add(RuntimeGlobals.preloadChunkHandlers);
+				});
+		});
+	}
+}
+
+module.exports = ChunkPrefetchPreloadPlugin;
diff --git a/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js b/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js
new file mode 100644
index 00000000000..740bbe8c3c1
--- /dev/null
+++ b/lib/prefetch/ChunkPrefetchStartupRuntimeModule.js
@@ -0,0 +1,55 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+const Template = require("../Template");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
+
+class ChunkPrefetchStartupRuntimeModule extends RuntimeModule {
+	/**
+	 * @param {{ onChunks: Chunk[], chunks: Set }[]} startupChunks chunk ids to trigger when chunks are loaded
+	 */
+	constructor(startupChunks) {
+		super("startup prefetch", RuntimeModule.STAGE_TRIGGER);
+		this.startupChunks = startupChunks;
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const { startupChunks } = this;
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const chunk = /** @type {Chunk} */ (this.chunk);
+		const { runtimeTemplate } = compilation;
+		return Template.asString(
+			startupChunks.map(
+				({ onChunks, chunks }) =>
+					`${RuntimeGlobals.onChunksLoaded}(0, ${JSON.stringify(
+						// This need to include itself to delay execution after this chunk has been fully loaded
+						onChunks.filter(c => c === chunk).map(c => c.id)
+					)}, ${runtimeTemplate.basicFunction(
+						"",
+						chunks.size < 3
+							? Array.from(
+									chunks,
+									c =>
+										`${RuntimeGlobals.prefetchChunk}(${JSON.stringify(c.id)});`
+								)
+							: `${JSON.stringify(Array.from(chunks, c => c.id))}.map(${
+									RuntimeGlobals.prefetchChunk
+								});`
+					)}, 5);`
+			)
+		);
+	}
+}
+
+module.exports = ChunkPrefetchStartupRuntimeModule;
diff --git a/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js b/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js
new file mode 100644
index 00000000000..74eb2bc613f
--- /dev/null
+++ b/lib/prefetch/ChunkPrefetchTriggerRuntimeModule.js
@@ -0,0 +1,51 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+const Template = require("../Template");
+
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
+
+class ChunkPrefetchTriggerRuntimeModule extends RuntimeModule {
+	/**
+	 * @param {Record} chunkMap map from chunk to
+	 */
+	constructor(chunkMap) {
+		super("chunk prefetch trigger", RuntimeModule.STAGE_TRIGGER);
+		this.chunkMap = chunkMap;
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const { chunkMap } = this;
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const { runtimeTemplate } = compilation;
+		const body = [
+			"var chunks = chunkToChildrenMap[chunkId];",
+			`Array.isArray(chunks) && chunks.map(${RuntimeGlobals.prefetchChunk});`
+		];
+		return Template.asString([
+			Template.asString([
+				`var chunkToChildrenMap = ${JSON.stringify(chunkMap, null, "\t")};`,
+				`${
+					RuntimeGlobals.ensureChunkHandlers
+				}.prefetch = ${runtimeTemplate.expressionFunction(
+					`Promise.all(promises).then(${runtimeTemplate.basicFunction(
+						"",
+						body
+					)})`,
+					"chunkId, promises"
+				)};`
+			])
+		]);
+	}
+}
+
+module.exports = ChunkPrefetchTriggerRuntimeModule;
diff --git a/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js b/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js
new file mode 100644
index 00000000000..8509def176d
--- /dev/null
+++ b/lib/prefetch/ChunkPreloadTriggerRuntimeModule.js
@@ -0,0 +1,45 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+const Template = require("../Template");
+
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */
+
+class ChunkPreloadTriggerRuntimeModule extends RuntimeModule {
+	/**
+	 * @param {Record} chunkMap map from chunk to chunks
+	 */
+	constructor(chunkMap) {
+		super("chunk preload trigger", RuntimeModule.STAGE_TRIGGER);
+		this.chunkMap = chunkMap;
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const { chunkMap } = this;
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const { runtimeTemplate } = compilation;
+		const body = [
+			"var chunks = chunkToChildrenMap[chunkId];",
+			`Array.isArray(chunks) && chunks.map(${RuntimeGlobals.preloadChunk});`
+		];
+		return Template.asString([
+			Template.asString([
+				`var chunkToChildrenMap = ${JSON.stringify(chunkMap, null, "\t")};`,
+				`${
+					RuntimeGlobals.ensureChunkHandlers
+				}.preload = ${runtimeTemplate.basicFunction("chunkId", body)};`
+			])
+		]);
+	}
+}
+
+module.exports = ChunkPreloadTriggerRuntimeModule;
diff --git a/lib/rules/BasicEffectRulePlugin.js b/lib/rules/BasicEffectRulePlugin.js
new file mode 100644
index 00000000000..5d24bac5d12
--- /dev/null
+++ b/lib/rules/BasicEffectRulePlugin.js
@@ -0,0 +1,52 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+/** @typedef {import("../../declarations/WebpackOptions").RuleSetRule} RuleSetRule */
+/** @typedef {import("./RuleSetCompiler")} RuleSetCompiler */
+
+/**
+ * @template T
+ * @template {T[keyof T]} V
+ * @typedef {import("./RuleSetCompiler").KeysOfTypes} KeysOfTypes
+ */
+
+/** @typedef {KeysOfTypes} BasicEffectRuleKeys */
+
+class BasicEffectRulePlugin {
+	/**
+	 * @param {BasicEffectRuleKeys} ruleProperty the rule property
+	 * @param {string=} effectType the effect type
+	 */
+	constructor(ruleProperty, effectType) {
+		this.ruleProperty = ruleProperty;
+		this.effectType = effectType || ruleProperty;
+	}
+
+	/**
+	 * @param {RuleSetCompiler} ruleSetCompiler the rule set compiler
+	 * @returns {void}
+	 */
+	apply(ruleSetCompiler) {
+		ruleSetCompiler.hooks.rule.tap(
+			"BasicEffectRulePlugin",
+			(path, rule, unhandledProperties, result, references) => {
+				if (unhandledProperties.has(this.ruleProperty)) {
+					unhandledProperties.delete(this.ruleProperty);
+
+					const value = rule[this.ruleProperty];
+
+					result.effects.push({
+						type: this.effectType,
+						value
+					});
+				}
+			}
+		);
+	}
+}
+
+module.exports = BasicEffectRulePlugin;
diff --git a/lib/rules/BasicMatcherRulePlugin.js b/lib/rules/BasicMatcherRulePlugin.js
new file mode 100644
index 00000000000..4193ecfcb1d
--- /dev/null
+++ b/lib/rules/BasicMatcherRulePlugin.js
@@ -0,0 +1,65 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+/** @typedef {import("../../declarations/WebpackOptions").RuleSetConditionOrConditions} RuleSetConditionOrConditions */
+/** @typedef {import("../../declarations/WebpackOptions").RuleSetConditionOrConditionsAbsolute} RuleSetConditionOrConditionsAbsolute */
+/** @typedef {import("../../declarations/WebpackOptions").RuleSetLoaderOptions} RuleSetLoaderOptions */
+/** @typedef {import("../../declarations/WebpackOptions").RuleSetRule} RuleSetRule */
+/** @typedef {import("./RuleSetCompiler")} RuleSetCompiler */
+/** @typedef {import("./RuleSetCompiler").RuleCondition} RuleCondition */
+
+/**
+ * @template T
+ * @template {T[keyof T]} V
+ * @typedef {import("./RuleSetCompiler").KeysOfTypes} KeysOfTypes
+ */
+
+/** @typedef {KeysOfTypes} BasicMatcherRuleKeys */
+
+class BasicMatcherRulePlugin {
+	/**
+	 * @param {BasicMatcherRuleKeys} ruleProperty the rule property
+	 * @param {string=} dataProperty the data property
+	 * @param {boolean=} invert if true, inverts the condition
+	 */
+	constructor(ruleProperty, dataProperty, invert) {
+		this.ruleProperty = ruleProperty;
+		this.dataProperty = dataProperty || ruleProperty;
+		this.invert = invert || false;
+	}
+
+	/**
+	 * @param {RuleSetCompiler} ruleSetCompiler the rule set compiler
+	 * @returns {void}
+	 */
+	apply(ruleSetCompiler) {
+		ruleSetCompiler.hooks.rule.tap(
+			"BasicMatcherRulePlugin",
+			(path, rule, unhandledProperties, result) => {
+				if (unhandledProperties.has(this.ruleProperty)) {
+					unhandledProperties.delete(this.ruleProperty);
+					const value = rule[this.ruleProperty];
+					const condition = ruleSetCompiler.compileCondition(
+						`${path}.${this.ruleProperty}`,
+						/** @type {RuleSetConditionOrConditions | RuleSetConditionOrConditionsAbsolute} */
+						(value)
+					);
+					const fn = condition.fn;
+					result.conditions.push({
+						property: this.dataProperty,
+						matchWhenEmpty: this.invert
+							? !condition.matchWhenEmpty
+							: condition.matchWhenEmpty,
+						fn: this.invert ? v => !fn(v) : fn
+					});
+				}
+			}
+		);
+	}
+}
+
+module.exports = BasicMatcherRulePlugin;
diff --git a/lib/rules/ObjectMatcherRulePlugin.js b/lib/rules/ObjectMatcherRulePlugin.js
new file mode 100644
index 00000000000..9b56c0bf99b
--- /dev/null
+++ b/lib/rules/ObjectMatcherRulePlugin.js
@@ -0,0 +1,74 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+/** @typedef {import("../../declarations/WebpackOptions").RuleSetConditionOrConditions} RuleSetConditionOrConditions */
+/** @typedef {import("../../declarations/WebpackOptions").RuleSetRule} RuleSetRule */
+/** @typedef {import("./RuleSetCompiler")} RuleSetCompiler */
+/** @typedef {import("./RuleSetCompiler").EffectData} EffectData */
+/** @typedef {import("./RuleSetCompiler").RuleCondition} RuleCondition */
+/** @typedef {import("./RuleSetCompiler").RuleConditionFunction} RuleConditionFunction */
+
+/**
+ * @template T
+ * @template {T[keyof T]} V
+ * @typedef {import("./RuleSetCompiler").KeysOfTypes} KeysOfTypes
+ */
+
+/** @typedef {KeysOfTypes} ObjectMatcherRuleKeys */
+
+class ObjectMatcherRulePlugin {
+	/**
+	 * @param {ObjectMatcherRuleKeys} ruleProperty the rule property
+	 * @param {keyof EffectData=} dataProperty the data property
+	 * @param {RuleConditionFunction=} additionalConditionFunction need to check
+	 */
+	constructor(ruleProperty, dataProperty, additionalConditionFunction) {
+		this.ruleProperty = ruleProperty;
+		this.dataProperty = dataProperty || ruleProperty;
+		this.additionalConditionFunction = additionalConditionFunction;
+	}
+
+	/**
+	 * @param {RuleSetCompiler} ruleSetCompiler the rule set compiler
+	 * @returns {void}
+	 */
+	apply(ruleSetCompiler) {
+		const { ruleProperty, dataProperty } = this;
+		ruleSetCompiler.hooks.rule.tap(
+			"ObjectMatcherRulePlugin",
+			(path, rule, unhandledProperties, result) => {
+				if (unhandledProperties.has(ruleProperty)) {
+					unhandledProperties.delete(ruleProperty);
+					const value =
+						/** @type {Record} */
+						(rule[ruleProperty]);
+					for (const property of Object.keys(value)) {
+						const nestedDataProperties = property.split(".");
+						const condition = ruleSetCompiler.compileCondition(
+							`${path}.${ruleProperty}.${property}`,
+							value[property]
+						);
+						if (this.additionalConditionFunction) {
+							result.conditions.push({
+								property: [dataProperty],
+								matchWhenEmpty: condition.matchWhenEmpty,
+								fn: this.additionalConditionFunction
+							});
+						}
+						result.conditions.push({
+							property: [dataProperty, ...nestedDataProperties],
+							matchWhenEmpty: condition.matchWhenEmpty,
+							fn: condition.fn
+						});
+					}
+				}
+			}
+		);
+	}
+}
+
+module.exports = ObjectMatcherRulePlugin;
diff --git a/lib/rules/RuleSetCompiler.js b/lib/rules/RuleSetCompiler.js
new file mode 100644
index 00000000000..ab99b19b1ba
--- /dev/null
+++ b/lib/rules/RuleSetCompiler.js
@@ -0,0 +1,425 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { SyncHook } = require("tapable");
+
+/** @typedef {import("../../declarations/WebpackOptions").Falsy} Falsy */
+/** @typedef {import("../../declarations/WebpackOptions").RuleSetLoaderOptions} RuleSetLoaderOptions */
+/** @typedef {import("../../declarations/WebpackOptions").RuleSetRule} RuleSetRule */
+
+/** @typedef {(Falsy | RuleSetRule)[]} RuleSetRules */
+
+/**
+ * @typedef {(value: EffectData[keyof EffectData]) => boolean} RuleConditionFunction
+ */
+
+/**
+ * @typedef {object} RuleCondition
+ * @property {string | string[]} property
+ * @property {boolean} matchWhenEmpty
+ * @property {RuleConditionFunction} fn
+ */
+
+/**
+ * @typedef {object} Condition
+ * @property {boolean} matchWhenEmpty
+ * @property {RuleConditionFunction} fn
+ */
+
+/**
+ * @typedef {object} EffectData
+ * @property {string=} resource
+ * @property {string=} realResource
+ * @property {string=} resourceQuery
+ * @property {string=} resourceFragment
+ * @property {string=} scheme
+ * @property {ImportAttributes=} assertions
+ * @property {string=} mimetype
+ * @property {string} dependency
+ * @property {Record=} descriptionData
+ * @property {string=} compiler
+ * @property {string} issuer
+ * @property {string} issuerLayer
+ */
+
+/**
+ * @typedef {object} CompiledRule
+ * @property {RuleCondition[]} conditions
+ * @property {(Effect | ((effectData: EffectData) => Effect[]))[]} effects
+ * @property {CompiledRule[]=} rules
+ * @property {CompiledRule[]=} oneOf
+ */
+
+/**
+ * @typedef {object} Effect
+ * @property {string} type
+ * @property {TODO} value
+ */
+
+/** @typedef {Map} References */
+
+/**
+ * @typedef {object} RuleSet
+ * @property {References} references map of references in the rule set (may grow over time)
+ * @property {(effectData: EffectData) => Effect[]} exec execute the rule set
+ */
+
+/**
+ * @template T
+ * @template {T[keyof T]} V
+ * @typedef {({ [P in keyof Required]: Required[P] extends V ? P : never })[keyof T]} KeysOfTypes
+ */
+
+/** @typedef {{ apply: (ruleSetCompiler: RuleSetCompiler) => void }} RuleSetPlugin */
+
+class RuleSetCompiler {
+	/**
+	 * @param {RuleSetPlugin[]} plugins plugins
+	 */
+	constructor(plugins) {
+		this.hooks = Object.freeze({
+			/** @type {SyncHook<[string, RuleSetRule, Set, CompiledRule, References]>} */
+			rule: new SyncHook([
+				"path",
+				"rule",
+				"unhandledProperties",
+				"compiledRule",
+				"references"
+			])
+		});
+		if (plugins) {
+			for (const plugin of plugins) {
+				plugin.apply(this);
+			}
+		}
+	}
+
+	/**
+	 * @param {RuleSetRules} ruleSet raw user provided rules
+	 * @returns {RuleSet} compiled RuleSet
+	 */
+	compile(ruleSet) {
+		const refs = new Map();
+		const rules = this.compileRules("ruleSet", ruleSet, refs);
+
+		/**
+		 * @param {EffectData} data data passed in
+		 * @param {CompiledRule} rule the compiled rule
+		 * @param {Effect[]} effects an array where effects are pushed to
+		 * @returns {boolean} true, if the rule has matched
+		 */
+		const execRule = (data, rule, effects) => {
+			for (const condition of rule.conditions) {
+				const p = condition.property;
+				if (Array.isArray(p)) {
+					/** @type {EffectData | EffectData[keyof EffectData] | undefined} */
+					let current = data;
+					for (const subProperty of p) {
+						if (
+							current &&
+							typeof current === "object" &&
+							Object.prototype.hasOwnProperty.call(current, subProperty)
+						) {
+							current = current[/** @type {keyof EffectData} */ (subProperty)];
+						} else {
+							current = undefined;
+							break;
+						}
+					}
+					if (current !== undefined) {
+						if (!condition.fn(current)) return false;
+						continue;
+					}
+				} else if (p in data) {
+					const value = data[/** @type {keyof EffectData} */ (p)];
+					if (value !== undefined) {
+						if (!condition.fn(value)) return false;
+						continue;
+					}
+				}
+				if (!condition.matchWhenEmpty) {
+					return false;
+				}
+			}
+			for (const effect of rule.effects) {
+				if (typeof effect === "function") {
+					const returnedEffects = effect(data);
+					for (const effect of returnedEffects) {
+						effects.push(effect);
+					}
+				} else {
+					effects.push(effect);
+				}
+			}
+			if (rule.rules) {
+				for (const childRule of rule.rules) {
+					execRule(data, childRule, effects);
+				}
+			}
+			if (rule.oneOf) {
+				for (const childRule of rule.oneOf) {
+					if (execRule(data, childRule, effects)) {
+						break;
+					}
+				}
+			}
+			return true;
+		};
+
+		return {
+			references: refs,
+			exec: data => {
+				/** @type {Effect[]} */
+				const effects = [];
+				for (const rule of rules) {
+					execRule(data, rule, effects);
+				}
+				return effects;
+			}
+		};
+	}
+
+	/**
+	 * @param {string} path current path
+	 * @param {RuleSetRules} rules the raw rules provided by user
+	 * @param {References} refs references
+	 * @returns {CompiledRule[]} rules
+	 */
+	compileRules(path, rules, refs) {
+		return rules
+			.filter(Boolean)
+			.map((rule, i) =>
+				this.compileRule(
+					`${path}[${i}]`,
+					/** @type {RuleSetRule} */ (rule),
+					refs
+				)
+			);
+	}
+
+	/**
+	 * @param {string} path current path
+	 * @param {RuleSetRule} rule the raw rule provided by user
+	 * @param {References} refs references
+	 * @returns {CompiledRule} normalized and compiled rule for processing
+	 */
+	compileRule(path, rule, refs) {
+		const unhandledProperties = new Set(
+			Object.keys(rule).filter(
+				key => rule[/** @type {keyof RuleSetRule} */ (key)] !== undefined
+			)
+		);
+
+		/** @type {CompiledRule} */
+		const compiledRule = {
+			conditions: [],
+			effects: [],
+			rules: undefined,
+			oneOf: undefined
+		};
+
+		this.hooks.rule.call(path, rule, unhandledProperties, compiledRule, refs);
+
+		if (unhandledProperties.has("rules")) {
+			unhandledProperties.delete("rules");
+			const rules = rule.rules;
+			if (!Array.isArray(rules))
+				throw this.error(path, rules, "Rule.rules must be an array of rules");
+			compiledRule.rules = this.compileRules(`${path}.rules`, rules, refs);
+		}
+
+		if (unhandledProperties.has("oneOf")) {
+			unhandledProperties.delete("oneOf");
+			const oneOf = rule.oneOf;
+			if (!Array.isArray(oneOf))
+				throw this.error(path, oneOf, "Rule.oneOf must be an array of rules");
+			compiledRule.oneOf = this.compileRules(`${path}.oneOf`, oneOf, refs);
+		}
+
+		if (unhandledProperties.size > 0) {
+			throw this.error(
+				path,
+				rule,
+				`Properties ${Array.from(unhandledProperties).join(", ")} are unknown`
+			);
+		}
+
+		return compiledRule;
+	}
+
+	/**
+	 * @param {string} path current path
+	 * @param {RuleSetLoaderOptions} condition user provided condition value
+	 * @returns {Condition} compiled condition
+	 */
+	compileCondition(path, condition) {
+		if (condition === "") {
+			return {
+				matchWhenEmpty: true,
+				fn: str => str === ""
+			};
+		}
+		if (!condition) {
+			throw this.error(
+				path,
+				condition,
+				"Expected condition but got falsy value"
+			);
+		}
+		if (typeof condition === "string") {
+			return {
+				matchWhenEmpty: condition.length === 0,
+				fn: str => typeof str === "string" && str.startsWith(condition)
+			};
+		}
+		if (typeof condition === "function") {
+			try {
+				return {
+					matchWhenEmpty: condition(""),
+					fn: /** @type {RuleConditionFunction} */ (condition)
+				};
+			} catch (_err) {
+				throw this.error(
+					path,
+					condition,
+					"Evaluation of condition function threw error"
+				);
+			}
+		}
+		if (condition instanceof RegExp) {
+			return {
+				matchWhenEmpty: condition.test(""),
+				fn: v => typeof v === "string" && condition.test(v)
+			};
+		}
+		if (Array.isArray(condition)) {
+			const items = condition.map((c, i) =>
+				this.compileCondition(`${path}[${i}]`, c)
+			);
+			return this.combineConditionsOr(items);
+		}
+
+		if (typeof condition !== "object") {
+			throw this.error(
+				path,
+				condition,
+				`Unexpected ${typeof condition} when condition was expected`
+			);
+		}
+
+		const conditions = [];
+		for (const key of Object.keys(condition)) {
+			const value = condition[key];
+			switch (key) {
+				case "or":
+					if (value) {
+						if (!Array.isArray(value)) {
+							throw this.error(
+								`${path}.or`,
+								condition.or,
+								"Expected array of conditions"
+							);
+						}
+						conditions.push(this.compileCondition(`${path}.or`, value));
+					}
+					break;
+				case "and":
+					if (value) {
+						if (!Array.isArray(value)) {
+							throw this.error(
+								`${path}.and`,
+								condition.and,
+								"Expected array of conditions"
+							);
+						}
+						let i = 0;
+						for (const item of value) {
+							conditions.push(this.compileCondition(`${path}.and[${i}]`, item));
+							i++;
+						}
+					}
+					break;
+				case "not":
+					if (value) {
+						const matcher = this.compileCondition(`${path}.not`, value);
+						const fn = matcher.fn;
+						conditions.push({
+							matchWhenEmpty: !matcher.matchWhenEmpty,
+							fn: /** @type {RuleConditionFunction} */ (v => !fn(v))
+						});
+					}
+					break;
+				default:
+					throw this.error(
+						`${path}.${key}`,
+						condition[key],
+						`Unexpected property ${key} in condition`
+					);
+			}
+		}
+		if (conditions.length === 0) {
+			throw this.error(
+				path,
+				condition,
+				"Expected condition, but got empty thing"
+			);
+		}
+		return this.combineConditionsAnd(conditions);
+	}
+
+	/**
+	 * @param {Condition[]} conditions some conditions
+	 * @returns {Condition} merged condition
+	 */
+	combineConditionsOr(conditions) {
+		if (conditions.length === 0) {
+			return {
+				matchWhenEmpty: false,
+				fn: () => false
+			};
+		} else if (conditions.length === 1) {
+			return conditions[0];
+		}
+		return {
+			matchWhenEmpty: conditions.some(c => c.matchWhenEmpty),
+			fn: v => conditions.some(c => c.fn(v))
+		};
+	}
+
+	/**
+	 * @param {Condition[]} conditions some conditions
+	 * @returns {Condition} merged condition
+	 */
+	combineConditionsAnd(conditions) {
+		if (conditions.length === 0) {
+			return {
+				matchWhenEmpty: false,
+				fn: () => false
+			};
+		} else if (conditions.length === 1) {
+			return conditions[0];
+		}
+		return {
+			matchWhenEmpty: conditions.every(c => c.matchWhenEmpty),
+			fn: v => conditions.every(c => c.fn(v))
+		};
+	}
+
+	/**
+	 * @param {string} path current path
+	 * @param {EXPECTED_ANY} value value at the error location
+	 * @param {string} message message explaining the problem
+	 * @returns {Error} an error object
+	 */
+	error(path, value, message) {
+		return new Error(
+			`Compiling RuleSet failed: ${message} (at ${path}: ${value})`
+		);
+	}
+}
+
+module.exports = RuleSetCompiler;
diff --git a/lib/rules/UseEffectRulePlugin.js b/lib/rules/UseEffectRulePlugin.js
new file mode 100644
index 00000000000..60840a366e3
--- /dev/null
+++ b/lib/rules/UseEffectRulePlugin.js
@@ -0,0 +1,228 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const util = require("util");
+
+/** @typedef {import("../../declarations/WebpackOptions").Falsy} Falsy */
+/** @typedef {import("../../declarations/WebpackOptions").RuleSetLoader} RuleSetLoader */
+/** @typedef {import("../../declarations/WebpackOptions").RuleSetLoaderOptions} RuleSetLoaderOptions */
+/** @typedef {import("../../declarations/WebpackOptions").RuleSetRule} RuleSetRule */
+/** @typedef {import("../../declarations/WebpackOptions").RuleSetUse} RuleSetUse */
+/** @typedef {import("../../declarations/WebpackOptions").RuleSetUseItem} RuleSetUseItem */
+/** @typedef {import("./RuleSetCompiler")} RuleSetCompiler */
+/** @typedef {import("./RuleSetCompiler").Effect} Effect */
+/** @typedef {import("./RuleSetCompiler").EffectData} EffectData */
+
+class UseEffectRulePlugin {
+	/**
+	 * @param {RuleSetCompiler} ruleSetCompiler the rule set compiler
+	 * @returns {void}
+	 */
+	apply(ruleSetCompiler) {
+		ruleSetCompiler.hooks.rule.tap(
+			"UseEffectRulePlugin",
+			(path, rule, unhandledProperties, result, references) => {
+				/**
+				 * @param {keyof RuleSetRule} property property
+				 * @param {string} correctProperty correct property
+				 */
+				const conflictWith = (property, correctProperty) => {
+					if (unhandledProperties.has(property)) {
+						throw ruleSetCompiler.error(
+							`${path}.${property}`,
+							rule[property],
+							`A Rule must not have a '${property}' property when it has a '${correctProperty}' property`
+						);
+					}
+				};
+
+				if (unhandledProperties.has("use")) {
+					unhandledProperties.delete("use");
+					unhandledProperties.delete("enforce");
+
+					conflictWith("loader", "use");
+					conflictWith("options", "use");
+
+					const use = /** @type {RuleSetUse} */ (rule.use);
+					const enforce = rule.enforce;
+
+					const type = enforce ? `use-${enforce}` : "use";
+
+					/**
+					 * @param {string} path options path
+					 * @param {string} defaultIdent default ident when none is provided
+					 * @param {RuleSetUseItem} item user provided use value
+					 * @returns {(Effect | ((effectData: EffectData) => Effect[]))} effect
+					 */
+					const useToEffect = (path, defaultIdent, item) => {
+						if (typeof item === "function") {
+							return data =>
+								useToEffectsWithoutIdent(
+									path,
+									/** @type {RuleSetUseItem | RuleSetUseItem[]} */
+									(item(data))
+								);
+						}
+						return useToEffectRaw(path, defaultIdent, item);
+					};
+
+					/**
+					 * @param {string} path options path
+					 * @param {string} defaultIdent default ident when none is provided
+					 * @param {Exclude, EXPECTED_FUNCTION>} item user provided use value
+					 * @returns {Effect} effect
+					 */
+					const useToEffectRaw = (path, defaultIdent, item) => {
+						if (typeof item === "string") {
+							return {
+								type,
+								value: {
+									loader: item,
+									options: undefined,
+									ident: undefined
+								}
+							};
+						}
+						const loader = item.loader;
+						const options = item.options;
+						let ident = item.ident;
+						if (options && typeof options === "object") {
+							if (!ident) ident = defaultIdent;
+							references.set(ident, options);
+						}
+						if (typeof options === "string") {
+							util.deprecate(
+								() => {},
+								`Using a string as loader options is deprecated (${path}.options)`,
+								"DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING"
+							)();
+						}
+						return {
+							type: enforce ? `use-${enforce}` : "use",
+							value: {
+								loader,
+								options,
+								ident
+							}
+						};
+					};
+
+					/**
+					 * @param {string} path options path
+					 * @param {RuleSetUseItem | (Falsy | RuleSetUseItem)[]} items user provided use value
+					 * @returns {Effect[]} effects
+					 */
+					const useToEffectsWithoutIdent = (path, items) => {
+						if (Array.isArray(items)) {
+							return items.filter(Boolean).map((item, idx) =>
+								useToEffectRaw(
+									`${path}[${idx}]`,
+									"[[missing ident]]",
+									/** @type {Exclude} */
+									(item)
+								)
+							);
+						}
+						return [
+							useToEffectRaw(
+								path,
+								"[[missing ident]]",
+								/** @type {Exclude} */
+								(items)
+							)
+						];
+					};
+
+					/**
+					 * @param {string} path current path
+					 * @param {RuleSetUse} items user provided use value
+					 * @returns {(Effect | ((effectData: EffectData) => Effect[]))[]} effects
+					 */
+					const useToEffects = (path, items) => {
+						if (Array.isArray(items)) {
+							return items.filter(Boolean).map((item, idx) => {
+								const subPath = `${path}[${idx}]`;
+								return useToEffect(
+									subPath,
+									subPath,
+									/** @type {RuleSetUseItem} */
+									(item)
+								);
+							});
+						}
+						return [
+							useToEffect(path, path, /** @type {RuleSetUseItem} */ (items))
+						];
+					};
+
+					if (typeof use === "function") {
+						result.effects.push(data =>
+							useToEffectsWithoutIdent(`${path}.use`, use(data))
+						);
+					} else {
+						for (const effect of useToEffects(`${path}.use`, use)) {
+							result.effects.push(effect);
+						}
+					}
+				}
+
+				if (unhandledProperties.has("loader")) {
+					unhandledProperties.delete("loader");
+					unhandledProperties.delete("options");
+					unhandledProperties.delete("enforce");
+
+					const loader = /** @type {RuleSetLoader} */ (rule.loader);
+					const options = rule.options;
+					const enforce = rule.enforce;
+
+					if (loader.includes("!")) {
+						throw ruleSetCompiler.error(
+							`${path}.loader`,
+							loader,
+							"Exclamation mark separated loader lists has been removed in favor of the 'use' property with arrays"
+						);
+					}
+
+					if (loader.includes("?")) {
+						throw ruleSetCompiler.error(
+							`${path}.loader`,
+							loader,
+							"Query arguments on 'loader' has been removed in favor of the 'options' property"
+						);
+					}
+
+					if (typeof options === "string") {
+						util.deprecate(
+							() => {},
+							`Using a string as loader options is deprecated (${path}.options)`,
+							"DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING"
+						)();
+					}
+
+					const ident =
+						options && typeof options === "object" ? path : undefined;
+					references.set(
+						/** @type {TODO} */
+						(ident),
+						/** @type {RuleSetLoaderOptions} */
+						(options)
+					);
+					result.effects.push({
+						type: enforce ? `use-${enforce}` : "use",
+						value: {
+							loader,
+							options,
+							ident
+						}
+					});
+				}
+			}
+		);
+	}
+}
+
+module.exports = UseEffectRulePlugin;
diff --git a/lib/runtime/AsyncModuleRuntimeModule.js b/lib/runtime/AsyncModuleRuntimeModule.js
new file mode 100644
index 00000000000..79141c76f2e
--- /dev/null
+++ b/lib/runtime/AsyncModuleRuntimeModule.js
@@ -0,0 +1,133 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+const HelperRuntimeModule = require("./HelperRuntimeModule");
+
+/** @typedef {import("../Compilation")} Compilation */
+
+class AsyncModuleRuntimeModule extends HelperRuntimeModule {
+	constructor() {
+		super("async module");
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const { runtimeTemplate } = compilation;
+		const fn = RuntimeGlobals.asyncModule;
+		return Template.asString([
+			'var webpackQueues = typeof Symbol === "function" ? Symbol("webpack queues") : "__webpack_queues__";',
+			`var webpackExports = typeof Symbol === "function" ? Symbol("webpack exports") : "${RuntimeGlobals.exports}";`,
+			'var webpackError = typeof Symbol === "function" ? Symbol("webpack error") : "__webpack_error__";',
+			`var resolveQueue = ${runtimeTemplate.basicFunction("queue", [
+				"if(queue && queue.d < 1) {",
+				Template.indent([
+					"queue.d = 1;",
+					`queue.forEach(${runtimeTemplate.expressionFunction(
+						"fn.r--",
+						"fn"
+					)});`,
+					`queue.forEach(${runtimeTemplate.expressionFunction(
+						"fn.r-- ? fn.r++ : fn()",
+						"fn"
+					)});`
+				]),
+				"}"
+			])}`,
+			`var wrapDeps = ${runtimeTemplate.returningFunction(
+				`deps.map(${runtimeTemplate.basicFunction("dep", [
+					'if(dep !== null && typeof dep === "object") {',
+					Template.indent([
+						"if(dep[webpackQueues]) return dep;",
+						"if(dep.then) {",
+						Template.indent([
+							"var queue = [];",
+							"queue.d = 0;",
+							`dep.then(${runtimeTemplate.basicFunction("r", [
+								"obj[webpackExports] = r;",
+								"resolveQueue(queue);"
+							])}, ${runtimeTemplate.basicFunction("e", [
+								"obj[webpackError] = e;",
+								"resolveQueue(queue);"
+							])});`,
+							"var obj = {};",
+							`obj[webpackQueues] = ${runtimeTemplate.expressionFunction(
+								"fn(queue)",
+								"fn"
+							)};`,
+							"return obj;"
+						]),
+						"}"
+					]),
+					"}",
+					"var ret = {};",
+					`ret[webpackQueues] = ${runtimeTemplate.emptyFunction()};`,
+					"ret[webpackExports] = dep;",
+					"return ret;"
+				])})`,
+				"deps"
+			)};`,
+			`${fn} = ${runtimeTemplate.basicFunction("module, body, hasAwait", [
+				"var queue;",
+				"hasAwait && ((queue = []).d = -1);",
+				"var depQueues = new Set();",
+				"var exports = module.exports;",
+				"var currentDeps;",
+				"var outerResolve;",
+				"var reject;",
+				`var promise = new Promise(${runtimeTemplate.basicFunction(
+					"resolve, rej",
+					["reject = rej;", "outerResolve = resolve;"]
+				)});`,
+				"promise[webpackExports] = exports;",
+				`promise[webpackQueues] = ${runtimeTemplate.expressionFunction(
+					`queue && fn(queue), depQueues.forEach(fn), promise["catch"](${runtimeTemplate.emptyFunction()})`,
+					"fn"
+				)};`,
+				"module.exports = promise;",
+				`body(${runtimeTemplate.basicFunction("deps", [
+					"currentDeps = wrapDeps(deps);",
+					"var fn;",
+					`var getResult = ${runtimeTemplate.returningFunction(
+						`currentDeps.map(${runtimeTemplate.basicFunction("d", [
+							"if(d[webpackError]) throw d[webpackError];",
+							"return d[webpackExports];"
+						])})`
+					)}`,
+					`var promise = new Promise(${runtimeTemplate.basicFunction(
+						"resolve",
+						[
+							`fn = ${runtimeTemplate.expressionFunction(
+								"resolve(getResult)",
+								""
+							)};`,
+							"fn.r = 0;",
+							`var fnQueue = ${runtimeTemplate.expressionFunction(
+								"q !== queue && !depQueues.has(q) && (depQueues.add(q), q && !q.d && (fn.r++, q.push(fn)))",
+								"q"
+							)};`,
+							`currentDeps.map(${runtimeTemplate.expressionFunction(
+								"dep[webpackQueues](fnQueue)",
+								"dep"
+							)});`
+						]
+					)});`,
+					"return fn.r ? promise : getResult();"
+				])}, ${runtimeTemplate.expressionFunction(
+					"(err ? reject(promise[webpackError] = err) : outerResolve(exports)), resolveQueue(queue)",
+					"err"
+				)});`,
+				"queue && queue.d < 0 && (queue.d = 0);"
+			])};`
+		]);
+	}
+}
+
+module.exports = AsyncModuleRuntimeModule;
diff --git a/lib/runtime/AutoPublicPathRuntimeModule.js b/lib/runtime/AutoPublicPathRuntimeModule.js
new file mode 100644
index 00000000000..0433194fb09
--- /dev/null
+++ b/lib/runtime/AutoPublicPathRuntimeModule.js
@@ -0,0 +1,85 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+const Template = require("../Template");
+const JavascriptModulesPlugin = require("../javascript/JavascriptModulesPlugin");
+const { getUndoPath } = require("../util/identifier");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compilation")} Compilation */
+
+class AutoPublicPathRuntimeModule extends RuntimeModule {
+	constructor() {
+		super("publicPath", RuntimeModule.STAGE_BASIC);
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const { scriptType, importMetaName, path } = compilation.outputOptions;
+		const chunkName = compilation.getPath(
+			JavascriptModulesPlugin.getChunkFilenameTemplate(
+				/** @type {Chunk} */
+				(this.chunk),
+				compilation.outputOptions
+			),
+			{
+				chunk: this.chunk,
+				contentHashType: "javascript"
+			}
+		);
+		const undoPath = getUndoPath(
+			chunkName,
+			/** @type {string} */ (path),
+			false
+		);
+
+		return Template.asString([
+			"var scriptUrl;",
+			scriptType === "module"
+				? `if (typeof ${importMetaName}.url === "string") scriptUrl = ${importMetaName}.url`
+				: Template.asString([
+						`if (${RuntimeGlobals.global}.importScripts) scriptUrl = ${RuntimeGlobals.global}.location + "";`,
+						`var document = ${RuntimeGlobals.global}.document;`,
+						"if (!scriptUrl && document) {",
+						Template.indent([
+							// Technically we could use `document.currentScript instanceof window.HTMLScriptElement`,
+							// but an attacker could try to inject ``
+							// and use ``
+							"if (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')",
+							Template.indent("scriptUrl = document.currentScript.src;"),
+							"if (!scriptUrl) {",
+							Template.indent([
+								'var scripts = document.getElementsByTagName("script");',
+								"if(scripts.length) {",
+								Template.indent([
+									"var i = scripts.length - 1;",
+									"while (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;"
+								]),
+								"}"
+							]),
+							"}"
+						]),
+						"}"
+					]),
+			"// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration",
+			'// or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic.',
+			'if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser");',
+			'scriptUrl = scriptUrl.replace(/^blob:/, "").replace(/#.*$/, "").replace(/\\?.*$/, "").replace(/\\/[^\\/]+$/, "/");',
+			!undoPath
+				? `${RuntimeGlobals.publicPath} = scriptUrl;`
+				: `${RuntimeGlobals.publicPath} = scriptUrl + ${JSON.stringify(
+						undoPath
+					)};`
+		]);
+	}
+}
+
+module.exports = AutoPublicPathRuntimeModule;
diff --git a/lib/runtime/BaseUriRuntimeModule.js b/lib/runtime/BaseUriRuntimeModule.js
new file mode 100644
index 00000000000..99609b762bd
--- /dev/null
+++ b/lib/runtime/BaseUriRuntimeModule.js
@@ -0,0 +1,35 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+
+/** @typedef {import("../../declarations/WebpackOptions").EntryDescriptionNormalized} EntryDescriptionNormalized */
+/** @typedef {import("../Chunk")} Chunk */
+
+class BaseUriRuntimeModule extends RuntimeModule {
+	constructor() {
+		super("base uri", RuntimeModule.STAGE_ATTACH);
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const chunk = /** @type {Chunk} */ (this.chunk);
+		const options =
+			/** @type {EntryDescriptionNormalized} */
+			(chunk.getEntryOptions());
+		return `${RuntimeGlobals.baseURI} = ${
+			options.baseUri === undefined
+				? "undefined"
+				: JSON.stringify(options.baseUri)
+		};`;
+	}
+}
+
+module.exports = BaseUriRuntimeModule;
diff --git a/lib/runtime/ChunkNameRuntimeModule.js b/lib/runtime/ChunkNameRuntimeModule.js
new file mode 100644
index 00000000000..22149767907
--- /dev/null
+++ b/lib/runtime/ChunkNameRuntimeModule.js
@@ -0,0 +1,27 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+
+class ChunkNameRuntimeModule extends RuntimeModule {
+	/**
+	 * @param {string} chunkName the chunk's name
+	 */
+	constructor(chunkName) {
+		super("chunkName");
+		this.chunkName = chunkName;
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		return `${RuntimeGlobals.chunkName} = ${JSON.stringify(this.chunkName)};`;
+	}
+}
+
+module.exports = ChunkNameRuntimeModule;
diff --git a/lib/runtime/CompatGetDefaultExportRuntimeModule.js b/lib/runtime/CompatGetDefaultExportRuntimeModule.js
new file mode 100644
index 00000000000..1406e051fd9
--- /dev/null
+++ b/lib/runtime/CompatGetDefaultExportRuntimeModule.js
@@ -0,0 +1,40 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+const HelperRuntimeModule = require("./HelperRuntimeModule");
+
+/** @typedef {import("../Compilation")} Compilation */
+
+class CompatGetDefaultExportRuntimeModule extends HelperRuntimeModule {
+	constructor() {
+		super("compat get default export");
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const { runtimeTemplate } = compilation;
+		const fn = RuntimeGlobals.compatGetDefaultExport;
+		return Template.asString([
+			"// getDefaultExport function for compatibility with non-harmony modules",
+			`${fn} = ${runtimeTemplate.basicFunction("module", [
+				"var getter = module && module.__esModule ?",
+				Template.indent([
+					`${runtimeTemplate.returningFunction("module['default']")} :`,
+					`${runtimeTemplate.returningFunction("module")};`
+				]),
+				`${RuntimeGlobals.definePropertyGetters}(getter, { a: getter });`,
+				"return getter;"
+			])};`
+		]);
+	}
+}
+
+module.exports = CompatGetDefaultExportRuntimeModule;
diff --git a/lib/runtime/CompatRuntimeModule.js b/lib/runtime/CompatRuntimeModule.js
new file mode 100644
index 00000000000..cf386c0886b
--- /dev/null
+++ b/lib/runtime/CompatRuntimeModule.js
@@ -0,0 +1,83 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../MainTemplate")} MainTemplate */
+
+class CompatRuntimeModule extends RuntimeModule {
+	constructor() {
+		super("compat", RuntimeModule.STAGE_ATTACH);
+		this.fullHash = true;
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const chunkGraph = /** @type {ChunkGraph} */ (this.chunkGraph);
+		const chunk = /** @type {Chunk} */ (this.chunk);
+		const {
+			runtimeTemplate,
+			mainTemplate,
+			moduleTemplates,
+			dependencyTemplates
+		} = compilation;
+		const bootstrap = mainTemplate.hooks.bootstrap.call(
+			"",
+			chunk,
+			compilation.hash || "XXXX",
+			moduleTemplates.javascript,
+			dependencyTemplates
+		);
+		const localVars = mainTemplate.hooks.localVars.call(
+			"",
+			chunk,
+			compilation.hash || "XXXX"
+		);
+		const requireExtensions = mainTemplate.hooks.requireExtensions.call(
+			"",
+			chunk,
+			compilation.hash || "XXXX"
+		);
+		const runtimeRequirements = chunkGraph.getTreeRuntimeRequirements(chunk);
+		let requireEnsure = "";
+		if (runtimeRequirements.has(RuntimeGlobals.ensureChunk)) {
+			const requireEnsureHandler = mainTemplate.hooks.requireEnsure.call(
+				"",
+				chunk,
+				compilation.hash || "XXXX",
+				"chunkId"
+			);
+			if (requireEnsureHandler) {
+				requireEnsure = `${
+					RuntimeGlobals.ensureChunkHandlers
+				}.compat = ${runtimeTemplate.basicFunction(
+					"chunkId, promises",
+					requireEnsureHandler
+				)};`;
+			}
+		}
+		return [bootstrap, localVars, requireEnsure, requireExtensions]
+			.filter(Boolean)
+			.join("\n");
+	}
+
+	/**
+	 * @returns {boolean} true, if the runtime module should get it's own scope
+	 */
+	shouldIsolate() {
+		// We avoid isolating this to have better backward-compat
+		return false;
+	}
+}
+
+module.exports = CompatRuntimeModule;
diff --git a/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js b/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js
new file mode 100644
index 00000000000..05b811b19b0
--- /dev/null
+++ b/lib/runtime/CreateFakeNamespaceObjectRuntimeModule.js
@@ -0,0 +1,69 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+const HelperRuntimeModule = require("./HelperRuntimeModule");
+
+/** @typedef {import("../Compilation")} Compilation */
+
+class CreateFakeNamespaceObjectRuntimeModule extends HelperRuntimeModule {
+	constructor() {
+		super("create fake namespace object");
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const { runtimeTemplate } = compilation;
+		const fn = RuntimeGlobals.createFakeNamespaceObject;
+		return Template.asString([
+			`var getProto = Object.getPrototypeOf ? ${runtimeTemplate.returningFunction(
+				"Object.getPrototypeOf(obj)",
+				"obj"
+			)} : ${runtimeTemplate.returningFunction("obj.__proto__", "obj")};`,
+			"var leafPrototypes;",
+			"// create a fake namespace object",
+			"// mode & 1: value is a module id, require it",
+			"// mode & 2: merge all properties of value into the ns",
+			"// mode & 4: return value when already ns object",
+			"// mode & 16: return value when it's Promise-like",
+			"// mode & 8|1: behave like require",
+			// Note: must be a function (not arrow), because this is used in body!
+			`${fn} = function(value, mode) {`,
+			Template.indent([
+				"if(mode & 1) value = this(value);",
+				"if(mode & 8) return value;",
+				"if(typeof value === 'object' && value) {",
+				Template.indent([
+					"if((mode & 4) && value.__esModule) return value;",
+					"if((mode & 16) && typeof value.then === 'function') return value;"
+				]),
+				"}",
+				"var ns = Object.create(null);",
+				`${RuntimeGlobals.makeNamespaceObject}(ns);`,
+				"var def = {};",
+				"leafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];",
+				"for(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {",
+				Template.indent([
+					`Object.getOwnPropertyNames(current).forEach(${runtimeTemplate.expressionFunction(
+						`def[key] = ${runtimeTemplate.returningFunction("value[key]", "")}`,
+						"key"
+					)});`
+				]),
+				"}",
+				`def['default'] = ${runtimeTemplate.returningFunction("value", "")};`,
+				`${RuntimeGlobals.definePropertyGetters}(ns, def);`,
+				"return ns;"
+			]),
+			"};"
+		]);
+	}
+}
+
+module.exports = CreateFakeNamespaceObjectRuntimeModule;
diff --git a/lib/runtime/CreateScriptRuntimeModule.js b/lib/runtime/CreateScriptRuntimeModule.js
new file mode 100644
index 00000000000..7859e87d411
--- /dev/null
+++ b/lib/runtime/CreateScriptRuntimeModule.js
@@ -0,0 +1,38 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+const HelperRuntimeModule = require("./HelperRuntimeModule");
+
+/** @typedef {import("../Compilation")} Compilation */
+
+class CreateScriptRuntimeModule extends HelperRuntimeModule {
+	constructor() {
+		super("trusted types script");
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const { runtimeTemplate, outputOptions } = compilation;
+		const { trustedTypes } = outputOptions;
+		const fn = RuntimeGlobals.createScript;
+
+		return Template.asString(
+			`${fn} = ${runtimeTemplate.returningFunction(
+				trustedTypes
+					? `${RuntimeGlobals.getTrustedTypesPolicy}().createScript(script)`
+					: "script",
+				"script"
+			)};`
+		);
+	}
+}
+
+module.exports = CreateScriptRuntimeModule;
diff --git a/lib/runtime/CreateScriptUrlRuntimeModule.js b/lib/runtime/CreateScriptUrlRuntimeModule.js
new file mode 100644
index 00000000000..4c8960024d9
--- /dev/null
+++ b/lib/runtime/CreateScriptUrlRuntimeModule.js
@@ -0,0 +1,38 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+const HelperRuntimeModule = require("./HelperRuntimeModule");
+
+/** @typedef {import("../Compilation")} Compilation */
+
+class CreateScriptUrlRuntimeModule extends HelperRuntimeModule {
+	constructor() {
+		super("trusted types script url");
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const { runtimeTemplate, outputOptions } = compilation;
+		const { trustedTypes } = outputOptions;
+		const fn = RuntimeGlobals.createScriptUrl;
+
+		return Template.asString(
+			`${fn} = ${runtimeTemplate.returningFunction(
+				trustedTypes
+					? `${RuntimeGlobals.getTrustedTypesPolicy}().createScriptURL(url)`
+					: "url",
+				"url"
+			)};`
+		);
+	}
+}
+
+module.exports = CreateScriptUrlRuntimeModule;
diff --git a/lib/runtime/DefinePropertyGettersRuntimeModule.js b/lib/runtime/DefinePropertyGettersRuntimeModule.js
new file mode 100644
index 00000000000..4dad207a935
--- /dev/null
+++ b/lib/runtime/DefinePropertyGettersRuntimeModule.js
@@ -0,0 +1,42 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+const HelperRuntimeModule = require("./HelperRuntimeModule");
+
+/** @typedef {import("../Compilation")} Compilation */
+
+class DefinePropertyGettersRuntimeModule extends HelperRuntimeModule {
+	constructor() {
+		super("define property getters");
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const { runtimeTemplate } = compilation;
+		const fn = RuntimeGlobals.definePropertyGetters;
+		return Template.asString([
+			"// define getter functions for harmony exports",
+			`${fn} = ${runtimeTemplate.basicFunction("exports, definition", [
+				"for(var key in definition) {",
+				Template.indent([
+					`if(${RuntimeGlobals.hasOwnProperty}(definition, key) && !${RuntimeGlobals.hasOwnProperty}(exports, key)) {`,
+					Template.indent([
+						"Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });"
+					]),
+					"}"
+				]),
+				"}"
+			])};`
+		]);
+	}
+}
+
+module.exports = DefinePropertyGettersRuntimeModule;
diff --git a/lib/runtime/EnsureChunkRuntimeModule.js b/lib/runtime/EnsureChunkRuntimeModule.js
new file mode 100644
index 00000000000..bc6c0ecbdf1
--- /dev/null
+++ b/lib/runtime/EnsureChunkRuntimeModule.js
@@ -0,0 +1,68 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+const Template = require("../Template");
+
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Module").ReadOnlyRuntimeRequirements} ReadOnlyRuntimeRequirements */
+
+class EnsureChunkRuntimeModule extends RuntimeModule {
+	/**
+	 * @param {ReadOnlyRuntimeRequirements} runtimeRequirements runtime requirements
+	 */
+	constructor(runtimeRequirements) {
+		super("ensure chunk");
+		this.runtimeRequirements = runtimeRequirements;
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const { runtimeTemplate } = compilation;
+		// Check if there are non initial chunks which need to be imported using require-ensure
+		if (this.runtimeRequirements.has(RuntimeGlobals.ensureChunkHandlers)) {
+			const withFetchPriority = this.runtimeRequirements.has(
+				RuntimeGlobals.hasFetchPriority
+			);
+			const handlers = RuntimeGlobals.ensureChunkHandlers;
+			return Template.asString([
+				`${handlers} = {};`,
+				"// This file contains only the entry chunk.",
+				"// The chunk loading function for additional chunks",
+				`${RuntimeGlobals.ensureChunk} = ${runtimeTemplate.basicFunction(
+					`chunkId${withFetchPriority ? ", fetchPriority" : ""}`,
+					[
+						`return Promise.all(Object.keys(${handlers}).reduce(${runtimeTemplate.basicFunction(
+							"promises, key",
+							[
+								`${handlers}[key](chunkId, promises${
+									withFetchPriority ? ", fetchPriority" : ""
+								});`,
+								"return promises;"
+							]
+						)}, []));`
+					]
+				)};`
+			]);
+		}
+		// There ensureChunk is used somewhere in the tree, so we need an empty requireEnsure
+		// function. This can happen with multiple entrypoints.
+		return Template.asString([
+			"// The chunk loading function for additional chunks",
+			"// Since all referenced chunks are already included",
+			"// in this file, this function is empty here.",
+			`${RuntimeGlobals.ensureChunk} = ${runtimeTemplate.returningFunction(
+				"Promise.resolve()"
+			)};`
+		]);
+	}
+}
+
+module.exports = EnsureChunkRuntimeModule;
diff --git a/lib/runtime/GetChunkFilenameRuntimeModule.js b/lib/runtime/GetChunkFilenameRuntimeModule.js
new file mode 100644
index 00000000000..5058b853ca2
--- /dev/null
+++ b/lib/runtime/GetChunkFilenameRuntimeModule.js
@@ -0,0 +1,294 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+const Template = require("../Template");
+const { first } = require("../util/SetHelpers");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Chunk").ChunkId} ChunkId */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Compilation").AssetInfo} AssetInfo */
+/** @typedef {import("../TemplatedPathPlugin").TemplatePath} TemplatePath */
+
+class GetChunkFilenameRuntimeModule extends RuntimeModule {
+	/**
+	 * @param {string} contentType the contentType to use the content hash for
+	 * @param {string} name kind of filename
+	 * @param {string} global function name to be assigned
+	 * @param {(chunk: Chunk) => TemplatePath | false} getFilenameForChunk functor to get the filename or function
+	 * @param {boolean} allChunks when false, only async chunks are included
+	 */
+	constructor(contentType, name, global, getFilenameForChunk, allChunks) {
+		super(`get ${name} chunk filename`);
+		this.contentType = contentType;
+		this.global = global;
+		this.getFilenameForChunk = getFilenameForChunk;
+		this.allChunks = allChunks;
+		this.dependentHash = true;
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const { global, contentType, getFilenameForChunk, allChunks } = this;
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const chunkGraph = /** @type {ChunkGraph} */ (this.chunkGraph);
+		const chunk = /** @type {Chunk} */ (this.chunk);
+		const { runtimeTemplate } = compilation;
+
+		/** @type {Map>} */
+		const chunkFilenames = new Map();
+		let maxChunks = 0;
+		/** @type {string | undefined} */
+		let dynamicFilename;
+
+		/**
+		 * @param {Chunk} c the chunk
+		 * @returns {void}
+		 */
+		const addChunk = c => {
+			const chunkFilename = getFilenameForChunk(c);
+			if (chunkFilename) {
+				let set = chunkFilenames.get(chunkFilename);
+				if (set === undefined) {
+					chunkFilenames.set(chunkFilename, (set = new Set()));
+				}
+				set.add(c);
+				if (typeof chunkFilename === "string") {
+					if (set.size < maxChunks) return;
+					if (set.size === maxChunks) {
+						if (
+							chunkFilename.length <
+							/** @type {string} */ (dynamicFilename).length
+						) {
+							return;
+						}
+
+						if (
+							chunkFilename.length ===
+								/** @type {string} */ (dynamicFilename).length &&
+							chunkFilename < /** @type {string} */ (dynamicFilename)
+						) {
+							return;
+						}
+					}
+					maxChunks = set.size;
+					dynamicFilename = chunkFilename;
+				}
+			}
+		};
+
+		/** @type {string[]} */
+		const includedChunksMessages = [];
+		if (allChunks) {
+			includedChunksMessages.push("all chunks");
+			for (const c of chunk.getAllReferencedChunks()) {
+				addChunk(c);
+			}
+		} else {
+			includedChunksMessages.push("async chunks");
+			for (const c of chunk.getAllAsyncChunks()) {
+				addChunk(c);
+			}
+			const includeEntries = chunkGraph
+				.getTreeRuntimeRequirements(chunk)
+				.has(RuntimeGlobals.ensureChunkIncludeEntries);
+			if (includeEntries) {
+				includedChunksMessages.push("sibling chunks for the entrypoint");
+				for (const c of chunkGraph.getChunkEntryDependentChunksIterable(
+					chunk
+				)) {
+					addChunk(c);
+				}
+			}
+		}
+		for (const entrypoint of chunk.getAllReferencedAsyncEntrypoints()) {
+			addChunk(entrypoint.chunks[entrypoint.chunks.length - 1]);
+		}
+
+		/** @type {Map>} */
+		const staticUrls = new Map();
+		/** @type {Set} */
+		const dynamicUrlChunks = new Set();
+
+		/**
+		 * @param {Chunk} c the chunk
+		 * @param {string | TemplatePath} chunkFilename the filename template for the chunk
+		 * @returns {void}
+		 */
+		const addStaticUrl = (c, chunkFilename) => {
+			/**
+			 * @param {string | number} value a value
+			 * @returns {string} string to put in quotes
+			 */
+			const unquotedStringify = value => {
+				const str = `${value}`;
+				if (str.length >= 5 && str === `${c.id}`) {
+					// This is shorter and generates the same result
+					return '" + chunkId + "';
+				}
+				const s = JSON.stringify(str);
+				return s.slice(1, -1);
+			};
+			/**
+			 * @param {string} value string
+			 * @returns {(length: number) => string} string to put in quotes with length
+			 */
+			const unquotedStringifyWithLength = value => length =>
+				unquotedStringify(`${value}`.slice(0, length));
+			const chunkFilenameValue =
+				typeof chunkFilename === "function"
+					? JSON.stringify(
+							chunkFilename({
+								chunk: c,
+								contentHashType: contentType
+							})
+						)
+					: JSON.stringify(chunkFilename);
+			const staticChunkFilename = compilation.getPath(chunkFilenameValue, {
+				hash: `" + ${RuntimeGlobals.getFullHash}() + "`,
+				hashWithLength: length =>
+					`" + ${RuntimeGlobals.getFullHash}().slice(0, ${length}) + "`,
+				chunk: {
+					id: unquotedStringify(/** @type {ChunkId} */ (c.id)),
+					hash: unquotedStringify(/** @type {string} */ (c.renderedHash)),
+					hashWithLength: unquotedStringifyWithLength(
+						/** @type {string} */ (c.renderedHash)
+					),
+					name: unquotedStringify(c.name || /** @type {ChunkId} */ (c.id)),
+					contentHash: {
+						[contentType]: unquotedStringify(c.contentHash[contentType])
+					},
+					contentHashWithLength: {
+						[contentType]: unquotedStringifyWithLength(
+							c.contentHash[contentType]
+						)
+					}
+				},
+				contentHashType: contentType
+			});
+			let set = staticUrls.get(staticChunkFilename);
+			if (set === undefined) {
+				staticUrls.set(staticChunkFilename, (set = new Set()));
+			}
+			set.add(c.id);
+		};
+
+		for (const [filename, chunks] of chunkFilenames) {
+			if (filename !== dynamicFilename) {
+				for (const c of chunks) addStaticUrl(c, filename);
+			} else {
+				for (const c of chunks) dynamicUrlChunks.add(c);
+			}
+		}
+
+		/**
+		 * @param {(chunk: Chunk) => string | number} fn function from chunk to value
+		 * @returns {string} code with static mapping of results of fn
+		 */
+		const createMap = fn => {
+			/** @type {Record} */
+			const obj = {};
+			let useId = false;
+			/** @type {number | string | undefined} */
+			let lastKey;
+			let entries = 0;
+			for (const c of dynamicUrlChunks) {
+				const value = fn(c);
+				if (value === c.id) {
+					useId = true;
+				} else {
+					obj[/** @type {number | string} */ (c.id)] = value;
+					lastKey = /** @type {number | string} */ (c.id);
+					entries++;
+				}
+			}
+			if (entries === 0) return "chunkId";
+			if (entries === 1) {
+				return useId
+					? `(chunkId === ${JSON.stringify(lastKey)} ? ${JSON.stringify(
+							obj[/** @type {number | string} */ (lastKey)]
+						)} : chunkId)`
+					: JSON.stringify(obj[/** @type {number | string} */ (lastKey)]);
+			}
+			return useId
+				? `(${JSON.stringify(obj)}[chunkId] || chunkId)`
+				: `${JSON.stringify(obj)}[chunkId]`;
+		};
+
+		/**
+		 * @param {(chunk: Chunk) => string | number} fn function from chunk to value
+		 * @returns {string} code with static mapping of results of fn for including in quoted string
+		 */
+		const mapExpr = fn => `" + ${createMap(fn)} + "`;
+
+		/**
+		 * @param {(chunk: Chunk) => string | number} fn function from chunk to value
+		 * @returns {(length: number) => string} function which generates code with static mapping of results of fn for including in quoted string for specific length
+		 */
+		const mapExprWithLength = fn => length =>
+			`" + ${createMap(c => `${fn(c)}`.slice(0, length))} + "`;
+
+		const url =
+			dynamicFilename &&
+			compilation.getPath(JSON.stringify(dynamicFilename), {
+				hash: `" + ${RuntimeGlobals.getFullHash}() + "`,
+				hashWithLength: length =>
+					`" + ${RuntimeGlobals.getFullHash}().slice(0, ${length}) + "`,
+				chunk: {
+					id: '" + chunkId + "',
+					hash: mapExpr(c => /** @type {string} */ (c.renderedHash)),
+					hashWithLength: mapExprWithLength(
+						c => /** @type {string} */ (c.renderedHash)
+					),
+					name: mapExpr(c => c.name || /** @type {number | string} */ (c.id)),
+					contentHash: {
+						[contentType]: mapExpr(c => c.contentHash[contentType])
+					},
+					contentHashWithLength: {
+						[contentType]: mapExprWithLength(c => c.contentHash[contentType])
+					}
+				},
+				contentHashType: contentType
+			});
+
+		return Template.asString([
+			`// This function allow to reference ${includedChunksMessages.join(
+				" and "
+			)}`,
+			`${global} = ${runtimeTemplate.basicFunction(
+				"chunkId",
+
+				staticUrls.size > 0
+					? [
+							"// return url for filenames not based on template",
+							// it minimizes to `x===1?"...":x===2?"...":"..."`
+							Template.asString(
+								Array.from(staticUrls, ([url, ids]) => {
+									const condition =
+										ids.size === 1
+											? `chunkId === ${JSON.stringify(first(ids))}`
+											: `{${Array.from(
+													ids,
+													id => `${JSON.stringify(id)}:1`
+												).join(",")}}[chunkId]`;
+									return `if (${condition}) return ${url};`;
+								})
+							),
+							"// return url for filenames based on template",
+							`return ${url};`
+						]
+					: ["// return url for filenames based on template", `return ${url};`]
+			)};`
+		]);
+	}
+}
+
+module.exports = GetChunkFilenameRuntimeModule;
diff --git a/lib/runtime/GetFullHashRuntimeModule.js b/lib/runtime/GetFullHashRuntimeModule.js
new file mode 100644
index 00000000000..cf9949394fb
--- /dev/null
+++ b/lib/runtime/GetFullHashRuntimeModule.js
@@ -0,0 +1,30 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+
+/** @typedef {import("../Compilation")} Compilation */
+
+class GetFullHashRuntimeModule extends RuntimeModule {
+	constructor() {
+		super("getFullHash");
+		this.fullHash = true;
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const { runtimeTemplate } = compilation;
+		return `${RuntimeGlobals.getFullHash} = ${runtimeTemplate.returningFunction(
+			JSON.stringify(compilation.hash || "XXXX")
+		)}`;
+	}
+}
+
+module.exports = GetFullHashRuntimeModule;
diff --git a/lib/runtime/GetMainFilenameRuntimeModule.js b/lib/runtime/GetMainFilenameRuntimeModule.js
new file mode 100644
index 00000000000..0a9fdf50bb8
--- /dev/null
+++ b/lib/runtime/GetMainFilenameRuntimeModule.js
@@ -0,0 +1,47 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+const Template = require("../Template");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compilation")} Compilation */
+
+class GetMainFilenameRuntimeModule extends RuntimeModule {
+	/**
+	 * @param {string} name readable name
+	 * @param {string} global global object binding
+	 * @param {string} filename main file name
+	 */
+	constructor(name, global, filename) {
+		super(`get ${name} filename`);
+		this.global = global;
+		this.filename = filename;
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const { global, filename } = this;
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const chunk = /** @type {Chunk} */ (this.chunk);
+		const { runtimeTemplate } = compilation;
+		const url = compilation.getPath(JSON.stringify(filename), {
+			hash: `" + ${RuntimeGlobals.getFullHash}() + "`,
+			hashWithLength: length =>
+				`" + ${RuntimeGlobals.getFullHash}().slice(0, ${length}) + "`,
+			chunk,
+			runtime: chunk.runtime
+		});
+		return Template.asString([
+			`${global} = ${runtimeTemplate.returningFunction(url)};`
+		]);
+	}
+}
+
+module.exports = GetMainFilenameRuntimeModule;
diff --git a/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js b/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js
new file mode 100644
index 00000000000..e8342b3431c
--- /dev/null
+++ b/lib/runtime/GetTrustedTypesPolicyRuntimeModule.js
@@ -0,0 +1,98 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+const HelperRuntimeModule = require("./HelperRuntimeModule");
+
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Module").ReadOnlyRuntimeRequirements} ReadOnlyRuntimeRequirements */
+
+class GetTrustedTypesPolicyRuntimeModule extends HelperRuntimeModule {
+	/**
+	 * @param {ReadOnlyRuntimeRequirements} runtimeRequirements runtime requirements
+	 */
+	constructor(runtimeRequirements) {
+		super("trusted types policy");
+		this.runtimeRequirements = runtimeRequirements;
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const { runtimeTemplate, outputOptions } = compilation;
+		const { trustedTypes } = outputOptions;
+		const fn = RuntimeGlobals.getTrustedTypesPolicy;
+		const wrapPolicyCreationInTryCatch = trustedTypes
+			? trustedTypes.onPolicyCreationFailure === "continue"
+			: false;
+
+		return Template.asString([
+			"var policy;",
+			`${fn} = ${runtimeTemplate.basicFunction("", [
+				"// Create Trusted Type policy if Trusted Types are available and the policy doesn't exist yet.",
+				"if (policy === undefined) {",
+				Template.indent([
+					"policy = {",
+					Template.indent(
+						[
+							...(this.runtimeRequirements.has(RuntimeGlobals.createScript)
+								? [
+										`createScript: ${runtimeTemplate.returningFunction(
+											"script",
+											"script"
+										)}`
+									]
+								: []),
+							...(this.runtimeRequirements.has(RuntimeGlobals.createScriptUrl)
+								? [
+										`createScriptURL: ${runtimeTemplate.returningFunction(
+											"url",
+											"url"
+										)}`
+									]
+								: [])
+						].join(",\n")
+					),
+					"};",
+					...(trustedTypes
+						? [
+								'if (typeof trustedTypes !== "undefined" && trustedTypes.createPolicy) {',
+								Template.indent([
+									...(wrapPolicyCreationInTryCatch ? ["try {"] : []),
+									...[
+										`policy = trustedTypes.createPolicy(${JSON.stringify(
+											trustedTypes.policyName
+										)}, policy);`
+									].map(line =>
+										wrapPolicyCreationInTryCatch ? Template.indent(line) : line
+									),
+									...(wrapPolicyCreationInTryCatch
+										? [
+												"} catch (e) {",
+												Template.indent([
+													`console.warn('Could not create trusted-types policy ${JSON.stringify(
+														trustedTypes.policyName
+													)}');`
+												]),
+												"}"
+											]
+										: [])
+								]),
+								"}"
+							]
+						: [])
+				]),
+				"}",
+				"return policy;"
+			])};`
+		]);
+	}
+}
+
+module.exports = GetTrustedTypesPolicyRuntimeModule;
diff --git a/lib/runtime/GlobalRuntimeModule.js b/lib/runtime/GlobalRuntimeModule.js
new file mode 100644
index 00000000000..89e556c0858
--- /dev/null
+++ b/lib/runtime/GlobalRuntimeModule.js
@@ -0,0 +1,47 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+const Template = require("../Template");
+
+class GlobalRuntimeModule extends RuntimeModule {
+	constructor() {
+		super("global");
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		return Template.asString([
+			`${RuntimeGlobals.global} = (function() {`,
+			Template.indent([
+				"if (typeof globalThis === 'object') return globalThis;",
+				"try {",
+				Template.indent(
+					// This works in non-strict mode
+					// or
+					// This works if eval is allowed (see CSP)
+					"return this || new Function('return this')();"
+				),
+				"} catch (e) {",
+				Template.indent(
+					// This works if the window reference is available
+					"if (typeof window === 'object') return window;"
+				),
+				"}"
+				// It can still be `undefined`, but nothing to do about it...
+				// We return `undefined`, instead of nothing here, so it's
+				// easier to handle this case:
+				//   if (!global) { … }
+			]),
+			"})();"
+		]);
+	}
+}
+
+module.exports = GlobalRuntimeModule;
diff --git a/lib/runtime/HasOwnPropertyRuntimeModule.js b/lib/runtime/HasOwnPropertyRuntimeModule.js
new file mode 100644
index 00000000000..78bf3afeb95
--- /dev/null
+++ b/lib/runtime/HasOwnPropertyRuntimeModule.js
@@ -0,0 +1,35 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Sergey Melyukov @smelukov
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+const Template = require("../Template");
+
+/** @typedef {import("../Compilation")} Compilation */
+
+class HasOwnPropertyRuntimeModule extends RuntimeModule {
+	constructor() {
+		super("hasOwnProperty shorthand");
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const { runtimeTemplate } = compilation;
+
+		return Template.asString([
+			`${RuntimeGlobals.hasOwnProperty} = ${runtimeTemplate.returningFunction(
+				"Object.prototype.hasOwnProperty.call(obj, prop)",
+				"obj, prop"
+			)}`
+		]);
+	}
+}
+
+module.exports = HasOwnPropertyRuntimeModule;
diff --git a/lib/runtime/HelperRuntimeModule.js b/lib/runtime/HelperRuntimeModule.js
new file mode 100644
index 00000000000..012916c9228
--- /dev/null
+++ b/lib/runtime/HelperRuntimeModule.js
@@ -0,0 +1,18 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeModule = require("../RuntimeModule");
+
+class HelperRuntimeModule extends RuntimeModule {
+	/**
+	 * @param {string} name a readable name
+	 */
+	constructor(name) {
+		super(name);
+	}
+}
+
+module.exports = HelperRuntimeModule;
diff --git a/lib/runtime/LoadScriptRuntimeModule.js b/lib/runtime/LoadScriptRuntimeModule.js
new file mode 100644
index 00000000000..b6b2f3e381c
--- /dev/null
+++ b/lib/runtime/LoadScriptRuntimeModule.js
@@ -0,0 +1,174 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const { SyncWaterfallHook } = require("tapable");
+const Compilation = require("../Compilation");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+const HelperRuntimeModule = require("./HelperRuntimeModule");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compiler")} Compiler */
+
+/**
+ * @typedef {object} LoadScriptCompilationHooks
+ * @property {SyncWaterfallHook<[string, Chunk]>} createScript
+ */
+
+/** @type {WeakMap} */
+const compilationHooksMap = new WeakMap();
+
+class LoadScriptRuntimeModule extends HelperRuntimeModule {
+	/**
+	 * @param {Compilation} compilation the compilation
+	 * @returns {LoadScriptCompilationHooks} hooks
+	 */
+	static getCompilationHooks(compilation) {
+		if (!(compilation instanceof Compilation)) {
+			throw new TypeError(
+				"The 'compilation' argument must be an instance of Compilation"
+			);
+		}
+		let hooks = compilationHooksMap.get(compilation);
+		if (hooks === undefined) {
+			hooks = {
+				createScript: new SyncWaterfallHook(["source", "chunk"])
+			};
+			compilationHooksMap.set(compilation, hooks);
+		}
+		return hooks;
+	}
+
+	/**
+	 * @param {boolean=} withCreateScriptUrl use create script url for trusted types
+	 * @param {boolean=} withFetchPriority use `fetchPriority` attribute
+	 */
+	constructor(withCreateScriptUrl, withFetchPriority) {
+		super("load script");
+		this._withCreateScriptUrl = withCreateScriptUrl;
+		this._withFetchPriority = withFetchPriority;
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const { runtimeTemplate, outputOptions } = compilation;
+		const {
+			scriptType,
+			chunkLoadTimeout: loadTimeout,
+			crossOriginLoading,
+			uniqueName,
+			charset
+		} = outputOptions;
+		const fn = RuntimeGlobals.loadScript;
+
+		const { createScript } =
+			LoadScriptRuntimeModule.getCompilationHooks(compilation);
+
+		const code = Template.asString([
+			"script = document.createElement('script');",
+			scriptType ? `script.type = ${JSON.stringify(scriptType)};` : "",
+			charset ? "script.charset = 'utf-8';" : "",
+			`script.timeout = ${/** @type {number} */ (loadTimeout) / 1000};`,
+			`if (${RuntimeGlobals.scriptNonce}) {`,
+			Template.indent(
+				`script.setAttribute("nonce", ${RuntimeGlobals.scriptNonce});`
+			),
+			"}",
+			uniqueName
+				? 'script.setAttribute("data-webpack", dataWebpackPrefix + key);'
+				: "",
+			this._withFetchPriority
+				? Template.asString([
+						"if(fetchPriority) {",
+						Template.indent(
+							'script.setAttribute("fetchpriority", fetchPriority);'
+						),
+						"}"
+					])
+				: "",
+			`script.src = ${
+				this._withCreateScriptUrl
+					? `${RuntimeGlobals.createScriptUrl}(url)`
+					: "url"
+			};`,
+			crossOriginLoading
+				? crossOriginLoading === "use-credentials"
+					? 'script.crossOrigin = "use-credentials";'
+					: Template.asString([
+							"if (script.src.indexOf(window.location.origin + '/') !== 0) {",
+							Template.indent(
+								`script.crossOrigin = ${JSON.stringify(crossOriginLoading)};`
+							),
+							"}"
+						])
+				: ""
+		]);
+
+		return Template.asString([
+			"var inProgress = {};",
+			uniqueName
+				? `var dataWebpackPrefix = ${JSON.stringify(`${uniqueName}:`)};`
+				: "// data-webpack is not used as build has no uniqueName",
+			"// loadScript function to load a script via script tag",
+			`${fn} = ${runtimeTemplate.basicFunction(
+				`url, done, key, chunkId${
+					this._withFetchPriority ? ", fetchPriority" : ""
+				}`,
+				[
+					"if(inProgress[url]) { inProgress[url].push(done); return; }",
+					"var script, needAttach;",
+					"if(key !== undefined) {",
+					Template.indent([
+						'var scripts = document.getElementsByTagName("script");',
+						"for(var i = 0; i < scripts.length; i++) {",
+						Template.indent([
+							"var s = scripts[i];",
+							`if(s.getAttribute("src") == url${
+								uniqueName
+									? ' || s.getAttribute("data-webpack") == dataWebpackPrefix + key'
+									: ""
+							}) { script = s; break; }`
+						]),
+						"}"
+					]),
+					"}",
+					"if(!script) {",
+					Template.indent([
+						"needAttach = true;",
+						createScript.call(code, /** @type {Chunk} */ (this.chunk))
+					]),
+					"}",
+					"inProgress[url] = [done];",
+					`var onScriptComplete = ${runtimeTemplate.basicFunction(
+						"prev, event",
+						Template.asString([
+							"// avoid mem leaks in IE.",
+							"script.onerror = script.onload = null;",
+							"clearTimeout(timeout);",
+							"var doneFns = inProgress[url];",
+							"delete inProgress[url];",
+							"script.parentNode && script.parentNode.removeChild(script);",
+							`doneFns && doneFns.forEach(${runtimeTemplate.returningFunction(
+								"fn(event)",
+								"fn"
+							)});`,
+							"if(prev) return prev(event);"
+						])
+					)}`,
+					`var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), ${loadTimeout});`,
+					"script.onerror = onScriptComplete.bind(null, script.onerror);",
+					"script.onload = onScriptComplete.bind(null, script.onload);",
+					"needAttach && document.head.appendChild(script);"
+				]
+			)};`
+		]);
+	}
+}
+
+module.exports = LoadScriptRuntimeModule;
diff --git a/lib/runtime/MakeNamespaceObjectRuntimeModule.js b/lib/runtime/MakeNamespaceObjectRuntimeModule.js
new file mode 100644
index 00000000000..7b43080d020
--- /dev/null
+++ b/lib/runtime/MakeNamespaceObjectRuntimeModule.js
@@ -0,0 +1,39 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+const HelperRuntimeModule = require("./HelperRuntimeModule");
+
+/** @typedef {import("../Compilation")} Compilation */
+
+class MakeNamespaceObjectRuntimeModule extends HelperRuntimeModule {
+	constructor() {
+		super("make namespace object");
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const { runtimeTemplate } = compilation;
+		const fn = RuntimeGlobals.makeNamespaceObject;
+		return Template.asString([
+			"// define __esModule on exports",
+			`${fn} = ${runtimeTemplate.basicFunction("exports", [
+				"if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {",
+				Template.indent([
+					"Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });"
+				]),
+				"}",
+				"Object.defineProperty(exports, '__esModule', { value: true });"
+			])};`
+		]);
+	}
+}
+
+module.exports = MakeNamespaceObjectRuntimeModule;
diff --git a/lib/runtime/NonceRuntimeModule.js b/lib/runtime/NonceRuntimeModule.js
new file mode 100644
index 00000000000..238407c1ba6
--- /dev/null
+++ b/lib/runtime/NonceRuntimeModule.js
@@ -0,0 +1,24 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Ivan Kopeykin @vankop
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+
+class NonceRuntimeModule extends RuntimeModule {
+	constructor() {
+		super("nonce", RuntimeModule.STAGE_ATTACH);
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		return `${RuntimeGlobals.scriptNonce} = undefined;`;
+	}
+}
+
+module.exports = NonceRuntimeModule;
diff --git a/lib/runtime/OnChunksLoadedRuntimeModule.js b/lib/runtime/OnChunksLoadedRuntimeModule.js
new file mode 100644
index 00000000000..2224d02bb4a
--- /dev/null
+++ b/lib/runtime/OnChunksLoadedRuntimeModule.js
@@ -0,0 +1,78 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+const Template = require("../Template");
+
+/** @typedef {import("../Compilation")} Compilation */
+
+class OnChunksLoadedRuntimeModule extends RuntimeModule {
+	constructor() {
+		super("chunk loaded");
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const { runtimeTemplate } = compilation;
+		return Template.asString([
+			"var deferred = [];",
+			`${RuntimeGlobals.onChunksLoaded} = ${runtimeTemplate.basicFunction(
+				"result, chunkIds, fn, priority",
+				[
+					"if(chunkIds) {",
+					Template.indent([
+						"priority = priority || 0;",
+						"for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];",
+						"deferred[i] = [chunkIds, fn, priority];",
+						"return;"
+					]),
+					"}",
+					"var notFulfilled = Infinity;",
+					"for (var i = 0; i < deferred.length; i++) {",
+					Template.indent([
+						runtimeTemplate.destructureArray(
+							["chunkIds", "fn", "priority"],
+							"deferred[i]"
+						),
+						"var fulfilled = true;",
+						"for (var j = 0; j < chunkIds.length; j++) {",
+						Template.indent([
+							`if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(${
+								RuntimeGlobals.onChunksLoaded
+							}).every(${runtimeTemplate.returningFunction(
+								`${RuntimeGlobals.onChunksLoaded}[key](chunkIds[j])`,
+								"key"
+							)})) {`,
+							Template.indent(["chunkIds.splice(j--, 1);"]),
+							"} else {",
+							Template.indent([
+								"fulfilled = false;",
+								"if(priority < notFulfilled) notFulfilled = priority;"
+							]),
+							"}"
+						]),
+						"}",
+						"if(fulfilled) {",
+						Template.indent([
+							"deferred.splice(i--, 1)",
+							"var r = fn();",
+							"if (r !== undefined) result = r;"
+						]),
+						"}"
+					]),
+					"}",
+					"return result;"
+				]
+			)};`
+		]);
+	}
+}
+
+module.exports = OnChunksLoadedRuntimeModule;
diff --git a/lib/runtime/PublicPathRuntimeModule.js b/lib/runtime/PublicPathRuntimeModule.js
new file mode 100644
index 00000000000..7ea226161c9
--- /dev/null
+++ b/lib/runtime/PublicPathRuntimeModule.js
@@ -0,0 +1,37 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+
+/** @typedef {import("../../declarations/WebpackOptions").OutputNormalized} OutputOptions */
+/** @typedef {import("../Compilation")} Compilation */
+
+class PublicPathRuntimeModule extends RuntimeModule {
+	/**
+	 * @param {OutputOptions["publicPath"]} publicPath public path
+	 */
+	constructor(publicPath) {
+		super("publicPath", RuntimeModule.STAGE_BASIC);
+		this.publicPath = publicPath;
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const { publicPath } = this;
+		const compilation = /** @type {Compilation} */ (this.compilation);
+
+		return `${RuntimeGlobals.publicPath} = ${JSON.stringify(
+			compilation.getPath(publicPath || "", {
+				hash: compilation.hash || "XXXX"
+			})
+		)};`;
+	}
+}
+
+module.exports = PublicPathRuntimeModule;
diff --git a/lib/runtime/RelativeUrlRuntimeModule.js b/lib/runtime/RelativeUrlRuntimeModule.js
new file mode 100644
index 00000000000..92e32daed98
--- /dev/null
+++ b/lib/runtime/RelativeUrlRuntimeModule.js
@@ -0,0 +1,44 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const Template = require("../Template");
+const HelperRuntimeModule = require("./HelperRuntimeModule");
+
+/** @typedef {import("../Compilation")} Compilation */
+
+class RelativeUrlRuntimeModule extends HelperRuntimeModule {
+	constructor() {
+		super("relative url");
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const { runtimeTemplate } = compilation;
+		return Template.asString([
+			`${RuntimeGlobals.relativeUrl} = function RelativeURL(url) {`,
+			Template.indent([
+				'var realUrl = new URL(url, "x:/");',
+				"var values = {};",
+				"for (var key in realUrl) values[key] = realUrl[key];",
+				"values.href = url;",
+				'values.pathname = url.replace(/[?#].*/, "");',
+				'values.origin = values.protocol = "";',
+				`values.toString = values.toJSON = ${runtimeTemplate.returningFunction(
+					"url"
+				)};`,
+				"for (var key in values) Object.defineProperty(this, key, { enumerable: true, configurable: true, value: values[key] });"
+			]),
+			"};",
+			`${RuntimeGlobals.relativeUrl}.prototype = URL.prototype;`
+		]);
+	}
+}
+
+module.exports = RelativeUrlRuntimeModule;
diff --git a/lib/runtime/RuntimeIdRuntimeModule.js b/lib/runtime/RuntimeIdRuntimeModule.js
new file mode 100644
index 00000000000..1923bafca7e
--- /dev/null
+++ b/lib/runtime/RuntimeIdRuntimeModule.js
@@ -0,0 +1,32 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+
+class RuntimeIdRuntimeModule extends RuntimeModule {
+	constructor() {
+		super("runtimeId");
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const chunkGraph = /** @type {ChunkGraph} */ (this.chunkGraph);
+		const chunk = /** @type {Chunk} */ (this.chunk);
+		const runtime = chunk.runtime;
+		if (typeof runtime !== "string")
+			throw new Error("RuntimeIdRuntimeModule must be in a single runtime");
+		const id = chunkGraph.getRuntimeId(runtime);
+		return `${RuntimeGlobals.runtimeId} = ${JSON.stringify(id)};`;
+	}
+}
+
+module.exports = RuntimeIdRuntimeModule;
diff --git a/lib/runtime/StartupChunkDependenciesPlugin.js b/lib/runtime/StartupChunkDependenciesPlugin.js
new file mode 100644
index 00000000000..871a3ba3a78
--- /dev/null
+++ b/lib/runtime/StartupChunkDependenciesPlugin.js
@@ -0,0 +1,86 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const StartupChunkDependenciesRuntimeModule = require("./StartupChunkDependenciesRuntimeModule");
+const StartupEntrypointRuntimeModule = require("./StartupEntrypointRuntimeModule");
+
+/** @typedef {import("../../declarations/WebpackOptions").ChunkLoadingType} ChunkLoadingType */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Compiler")} Compiler */
+
+/**
+ * @typedef {object} Options
+ * @property {ChunkLoadingType} chunkLoading
+ * @property {boolean=} asyncChunkLoading
+ */
+
+const PLUGIN_NAME = "StartupChunkDependenciesPlugin";
+
+class StartupChunkDependenciesPlugin {
+	/**
+	 * @param {Options} options options
+	 */
+	constructor(options) {
+		this.chunkLoading = options.chunkLoading;
+		this.asyncChunkLoading =
+			typeof options.asyncChunkLoading === "boolean"
+				? options.asyncChunkLoading
+				: true;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.thisCompilation.tap(PLUGIN_NAME, compilation => {
+			const globalChunkLoading = compilation.outputOptions.chunkLoading;
+			/**
+			 * @param {Chunk} chunk chunk to check
+			 * @returns {boolean} true, when the plugin is enabled for the chunk
+			 */
+			const isEnabledForChunk = chunk => {
+				const options = chunk.getEntryOptions();
+				const chunkLoading =
+					options && options.chunkLoading !== undefined
+						? options.chunkLoading
+						: globalChunkLoading;
+				return chunkLoading === this.chunkLoading;
+			};
+			compilation.hooks.additionalTreeRuntimeRequirements.tap(
+				PLUGIN_NAME,
+				(chunk, set, { chunkGraph }) => {
+					if (!isEnabledForChunk(chunk)) return;
+					if (chunkGraph.hasChunkEntryDependentChunks(chunk)) {
+						set.add(RuntimeGlobals.startup);
+						set.add(RuntimeGlobals.ensureChunk);
+						set.add(RuntimeGlobals.ensureChunkIncludeEntries);
+						compilation.addRuntimeModule(
+							chunk,
+							new StartupChunkDependenciesRuntimeModule(this.asyncChunkLoading)
+						);
+					}
+				}
+			);
+			compilation.hooks.runtimeRequirementInTree
+				.for(RuntimeGlobals.startupEntrypoint)
+				.tap(PLUGIN_NAME, (chunk, set) => {
+					if (!isEnabledForChunk(chunk)) return;
+					set.add(RuntimeGlobals.require);
+					set.add(RuntimeGlobals.ensureChunk);
+					set.add(RuntimeGlobals.ensureChunkIncludeEntries);
+					compilation.addRuntimeModule(
+						chunk,
+						new StartupEntrypointRuntimeModule(this.asyncChunkLoading)
+					);
+				});
+		});
+	}
+}
+
+module.exports = StartupChunkDependenciesPlugin;
diff --git a/lib/runtime/StartupChunkDependenciesRuntimeModule.js b/lib/runtime/StartupChunkDependenciesRuntimeModule.js
new file mode 100644
index 00000000000..da2ec7548eb
--- /dev/null
+++ b/lib/runtime/StartupChunkDependenciesRuntimeModule.js
@@ -0,0 +1,75 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+const Template = require("../Template");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Compilation")} Compilation */
+
+class StartupChunkDependenciesRuntimeModule extends RuntimeModule {
+	/**
+	 * @param {boolean} asyncChunkLoading use async chunk loading
+	 */
+	constructor(asyncChunkLoading) {
+		super("startup chunk dependencies", RuntimeModule.STAGE_TRIGGER);
+		this.asyncChunkLoading = asyncChunkLoading;
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const chunkGraph = /** @type {ChunkGraph} */ (this.chunkGraph);
+		const chunk = /** @type {Chunk} */ (this.chunk);
+		const chunkIds = Array.from(
+			chunkGraph.getChunkEntryDependentChunksIterable(chunk)
+		).map(chunk => chunk.id);
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const { runtimeTemplate } = compilation;
+		return Template.asString([
+			`var next = ${RuntimeGlobals.startup};`,
+			`${RuntimeGlobals.startup} = ${runtimeTemplate.basicFunction(
+				"",
+				!this.asyncChunkLoading
+					? chunkIds
+							.map(
+								id => `${RuntimeGlobals.ensureChunk}(${JSON.stringify(id)});`
+							)
+							.concat("return next();")
+					: chunkIds.length === 1
+						? `return ${RuntimeGlobals.ensureChunk}(${JSON.stringify(
+								chunkIds[0]
+							)}).then(next);`
+						: chunkIds.length > 2
+							? [
+									// using map is shorter for 3 or more chunks
+									`return Promise.all(${JSON.stringify(chunkIds)}.map(${
+										RuntimeGlobals.ensureChunk
+									}, ${RuntimeGlobals.require})).then(next);`
+								]
+							: [
+									// calling ensureChunk directly is shorter for 0 - 2 chunks
+									"return Promise.all([",
+									Template.indent(
+										chunkIds
+											.map(
+												id =>
+													`${RuntimeGlobals.ensureChunk}(${JSON.stringify(id)})`
+											)
+											.join(",\n")
+									),
+									"]).then(next);"
+								]
+			)};`
+		]);
+	}
+}
+
+module.exports = StartupChunkDependenciesRuntimeModule;
diff --git a/lib/runtime/StartupEntrypointRuntimeModule.js b/lib/runtime/StartupEntrypointRuntimeModule.js
new file mode 100644
index 00000000000..5133767dab3
--- /dev/null
+++ b/lib/runtime/StartupEntrypointRuntimeModule.js
@@ -0,0 +1,54 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../MainTemplate")} MainTemplate */
+
+class StartupEntrypointRuntimeModule extends RuntimeModule {
+	/**
+	 * @param {boolean} asyncChunkLoading use async chunk loading
+	 */
+	constructor(asyncChunkLoading) {
+		super("startup entrypoint");
+		this.asyncChunkLoading = asyncChunkLoading;
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const { runtimeTemplate } = compilation;
+		return `${
+			RuntimeGlobals.startupEntrypoint
+		} = ${runtimeTemplate.basicFunction("result, chunkIds, fn", [
+			"// arguments: chunkIds, moduleId are deprecated",
+			"var moduleId = chunkIds;",
+			`if(!fn) chunkIds = result, fn = ${runtimeTemplate.returningFunction(
+				`${RuntimeGlobals.require}(${RuntimeGlobals.entryModuleId} = moduleId)`
+			)};`,
+			...(this.asyncChunkLoading
+				? [
+						`return Promise.all(chunkIds.map(${RuntimeGlobals.ensureChunk}, ${
+							RuntimeGlobals.require
+						})).then(${runtimeTemplate.basicFunction("", [
+							"var r = fn();",
+							"return r === undefined ? result : r;"
+						])})`
+					]
+				: [
+						`chunkIds.map(${RuntimeGlobals.ensureChunk}, ${RuntimeGlobals.require})`,
+						"var r = fn();",
+						"return r === undefined ? result : r;"
+					])
+		])}`;
+	}
+}
+
+module.exports = StartupEntrypointRuntimeModule;
diff --git a/lib/runtime/SystemContextRuntimeModule.js b/lib/runtime/SystemContextRuntimeModule.js
new file mode 100644
index 00000000000..b7663ffde1c
--- /dev/null
+++ b/lib/runtime/SystemContextRuntimeModule.js
@@ -0,0 +1,25 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+
+/** @typedef {import("../Compilation")} Compilation */
+
+class SystemContextRuntimeModule extends RuntimeModule {
+	constructor() {
+		super("__system_context__");
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		return `${RuntimeGlobals.systemContext} = __system_context__;`;
+	}
+}
+
+module.exports = SystemContextRuntimeModule;
diff --git a/lib/schemes/DataUriPlugin.js b/lib/schemes/DataUriPlugin.js
new file mode 100644
index 00000000000..3fd44f31292
--- /dev/null
+++ b/lib/schemes/DataUriPlugin.js
@@ -0,0 +1,73 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const NormalModule = require("../NormalModule");
+
+/** @typedef {import("../Compiler")} Compiler */
+
+// data URL scheme: "data:text/javascript;charset=utf-8;base64,some-string"
+// http://www.ietf.org/rfc/rfc2397.txt
+const URIRegEx = /^data:([^;,]+)?((?:;[^;,]+)*?)(?:;(base64)?)?,(.*)$/i;
+
+/**
+ * @param {string} uri data URI
+ * @returns {Buffer | null} decoded data
+ */
+const decodeDataURI = uri => {
+	const match = URIRegEx.exec(uri);
+	if (!match) return null;
+
+	const isBase64 = match[3];
+	const body = match[4];
+
+	if (isBase64) {
+		return Buffer.from(body, "base64");
+	}
+
+	// CSS allows to use `data:image/svg+xml;utf8,`
+	// so we return original body if we can't `decodeURIComponent`
+	try {
+		return Buffer.from(decodeURIComponent(body), "ascii");
+	} catch (_) {
+		return Buffer.from(body, "ascii");
+	}
+};
+
+const PLUGIN_NAME = "DataUriPlugin";
+
+class DataUriPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(
+			PLUGIN_NAME,
+			(compilation, { normalModuleFactory }) => {
+				normalModuleFactory.hooks.resolveForScheme
+					.for("data")
+					.tap(PLUGIN_NAME, resourceData => {
+						const match = URIRegEx.exec(resourceData.resource);
+						if (match) {
+							resourceData.data.mimetype = match[1] || "";
+							resourceData.data.parameters = match[2] || "";
+							resourceData.data.encoding = /** @type {"base64" | false} */ (
+								match[3] || false
+							);
+							resourceData.data.encodedContent = match[4] || "";
+						}
+					});
+				NormalModule.getCompilationHooks(compilation)
+					.readResourceForScheme.for("data")
+					.tap(PLUGIN_NAME, resource => decodeDataURI(resource));
+			}
+		);
+	}
+}
+
+module.exports = DataUriPlugin;
diff --git a/lib/schemes/FileUriPlugin.js b/lib/schemes/FileUriPlugin.js
new file mode 100644
index 00000000000..26758ac6e2b
--- /dev/null
+++ b/lib/schemes/FileUriPlugin.js
@@ -0,0 +1,51 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { URL, fileURLToPath } = require("url");
+const { NormalModule } = require("..");
+
+/** @typedef {import("../Compiler")} Compiler */
+
+const PLUGIN_NAME = "FileUriPlugin";
+
+class FileUriPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(
+			PLUGIN_NAME,
+			(compilation, { normalModuleFactory }) => {
+				normalModuleFactory.hooks.resolveForScheme
+					.for("file")
+					.tap(PLUGIN_NAME, resourceData => {
+						const url = new URL(resourceData.resource);
+						const path = fileURLToPath(url);
+						const query = url.search;
+						const fragment = url.hash;
+						resourceData.path = path;
+						resourceData.query = query;
+						resourceData.fragment = fragment;
+						resourceData.resource = path + query + fragment;
+						return true;
+					});
+				const hooks = NormalModule.getCompilationHooks(compilation);
+				hooks.readResource
+					.for(undefined)
+					.tapAsync(PLUGIN_NAME, (loaderContext, callback) => {
+						const { resourcePath } = loaderContext;
+						loaderContext.addDependency(resourcePath);
+						loaderContext.fs.readFile(resourcePath, callback);
+					});
+			}
+		);
+	}
+}
+
+module.exports = FileUriPlugin;
diff --git a/lib/schemes/HttpUriPlugin.js b/lib/schemes/HttpUriPlugin.js
new file mode 100644
index 00000000000..d9d8b5bb37c
--- /dev/null
+++ b/lib/schemes/HttpUriPlugin.js
@@ -0,0 +1,1290 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const EventEmitter = require("events");
+const { extname, basename } = require("path");
+const { URL } = require("url");
+const { createGunzip, createBrotliDecompress, createInflate } = require("zlib");
+const NormalModule = require("../NormalModule");
+const createSchemaValidation = require("../util/create-schema-validation");
+const createHash = require("../util/createHash");
+const { mkdirp, dirname, join } = require("../util/fs");
+const memoize = require("../util/memoize");
+
+/** @typedef {import("http").IncomingMessage} IncomingMessage */
+/** @typedef {import("http").OutgoingHttpHeaders} OutgoingHttpHeaders */
+/** @typedef {import("http").RequestOptions} RequestOptions */
+/** @typedef {import("net").Socket} Socket */
+/** @typedef {import("stream").Readable} Readable */
+/** @typedef {import("../../declarations/plugins/schemes/HttpUriPlugin").HttpUriPluginOptions} HttpUriPluginOptions */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../FileSystemInfo").Snapshot} Snapshot */
+/** @typedef {import("../Module").BuildInfo} BuildInfo */
+/** @typedef {import("../NormalModuleFactory").ResourceDataWithData} ResourceDataWithData */
+/** @typedef {import("../util/fs").IntermediateFileSystem} IntermediateFileSystem */
+
+const getHttp = memoize(() => require("http"));
+const getHttps = memoize(() => require("https"));
+
+/**
+ * @param {typeof import("http") | typeof import("https")} request request
+ * @param {string | { toString: () => string } | undefined} proxy proxy
+ * @returns {(url: URL, requestOptions: RequestOptions, callback: (incomingMessage: IncomingMessage) => void) => EventEmitter} fn
+ */
+const proxyFetch = (request, proxy) => (url, options, callback) => {
+	const eventEmitter = new EventEmitter();
+
+	/**
+	 * @param {Socket=} socket socket
+	 * @returns {void}
+	 */
+	const doRequest = socket => {
+		request
+			.get(url, { ...options, ...(socket && { socket }) }, callback)
+			.on("error", eventEmitter.emit.bind(eventEmitter, "error"));
+	};
+
+	if (proxy) {
+		const { hostname: host, port } = new URL(proxy);
+
+		getHttp()
+			.request({
+				host, // IP address of proxy server
+				port, // port of proxy server
+				method: "CONNECT",
+				path: url.host
+			})
+			.on("connect", (res, socket) => {
+				if (res.statusCode === 200) {
+					// connected to proxy server
+					doRequest(socket);
+				}
+			})
+			.on("error", err => {
+				eventEmitter.emit(
+					"error",
+					new Error(
+						`Failed to connect to proxy server "${proxy}": ${err.message}`
+					)
+				);
+			})
+			.end();
+	} else {
+		doRequest();
+	}
+
+	return eventEmitter;
+};
+
+/** @typedef {() => void} InProgressWriteItem */
+/** @type {InProgressWriteItem[] | undefined} */
+let inProgressWrite;
+
+const validate = createSchemaValidation(
+	require("../../schemas/plugins/schemes/HttpUriPlugin.check.js"),
+	() => require("../../schemas/plugins/schemes/HttpUriPlugin.json"),
+	{
+		name: "Http Uri Plugin",
+		baseDataPath: "options"
+	}
+);
+
+/**
+ * @param {string} str path
+ * @returns {string} safe path
+ */
+const toSafePath = str =>
+	str
+		.replace(/^[^a-zA-Z0-9]+|[^a-zA-Z0-9]+$/g, "")
+		.replace(/[^a-zA-Z0-9._-]+/g, "_");
+
+/**
+ * @param {Buffer} content content
+ * @returns {string} integrity
+ */
+const computeIntegrity = content => {
+	const hash = createHash("sha512");
+	hash.update(content);
+	const integrity = `sha512-${hash.digest("base64")}`;
+	return integrity;
+};
+
+/**
+ * @param {Buffer} content content
+ * @param {string} integrity integrity
+ * @returns {boolean} true, if integrity matches
+ */
+const verifyIntegrity = (content, integrity) => {
+	if (integrity === "ignore") return true;
+	return computeIntegrity(content) === integrity;
+};
+
+/**
+ * @param {string} str input
+ * @returns {Record} parsed
+ */
+const parseKeyValuePairs = str => {
+	/** @type {Record} */
+	const result = {};
+	for (const item of str.split(",")) {
+		const i = item.indexOf("=");
+		if (i >= 0) {
+			const key = item.slice(0, i).trim();
+			const value = item.slice(i + 1).trim();
+			result[key] = value;
+		} else {
+			const key = item.trim();
+			if (!key) continue;
+			result[key] = key;
+		}
+	}
+	return result;
+};
+
+/**
+ * @param {string | undefined} cacheControl Cache-Control header
+ * @param {number} requestTime timestamp of request
+ * @returns {{ storeCache: boolean, storeLock: boolean, validUntil: number }} Logic for storing in cache and lockfile cache
+ */
+const parseCacheControl = (cacheControl, requestTime) => {
+	// When false resource is not stored in cache
+	let storeCache = true;
+	// When false resource is not stored in lockfile cache
+	let storeLock = true;
+	// Resource is only revalidated, after that timestamp and when upgrade is chosen
+	let validUntil = 0;
+	if (cacheControl) {
+		const parsed = parseKeyValuePairs(cacheControl);
+		if (parsed["no-cache"]) storeCache = storeLock = false;
+		if (parsed["max-age"] && !Number.isNaN(Number(parsed["max-age"]))) {
+			validUntil = requestTime + Number(parsed["max-age"]) * 1000;
+		}
+		if (parsed["must-revalidate"]) validUntil = 0;
+	}
+	return {
+		storeLock,
+		storeCache,
+		validUntil
+	};
+};
+
+/**
+ * @typedef {object} LockfileEntry
+ * @property {string} resolved
+ * @property {string} integrity
+ * @property {string} contentType
+ */
+
+/**
+ * @param {LockfileEntry} a first lockfile entry
+ * @param {LockfileEntry} b second lockfile entry
+ * @returns {boolean} true when equal, otherwise false
+ */
+const areLockfileEntriesEqual = (a, b) =>
+	a.resolved === b.resolved &&
+	a.integrity === b.integrity &&
+	a.contentType === b.contentType;
+
+/**
+ * @param {LockfileEntry} entry lockfile entry
+ * @returns {`resolved: ${string}, integrity: ${string}, contentType: ${string}`} stringified entry
+ */
+const entryToString = entry =>
+	`resolved: ${entry.resolved}, integrity: ${entry.integrity}, contentType: ${entry.contentType}`;
+
+class Lockfile {
+	constructor() {
+		this.version = 1;
+		/** @type {Map} */
+		this.entries = new Map();
+	}
+
+	/**
+	 * @param {string} content content of the lockfile
+	 * @returns {Lockfile} lockfile
+	 */
+	static parse(content) {
+		// TODO handle merge conflicts
+		const data = JSON.parse(content);
+		if (data.version !== 1)
+			throw new Error(`Unsupported lockfile version ${data.version}`);
+		const lockfile = new Lockfile();
+		for (const key of Object.keys(data)) {
+			if (key === "version") continue;
+			const entry = data[key];
+			lockfile.entries.set(
+				key,
+				typeof entry === "string"
+					? entry
+					: {
+							resolved: key,
+							...entry
+						}
+			);
+		}
+		return lockfile;
+	}
+
+	/**
+	 * @returns {string} stringified lockfile
+	 */
+	toString() {
+		let str = "{\n";
+		const entries = Array.from(this.entries).sort(([a], [b]) =>
+			a < b ? -1 : 1
+		);
+		for (const [key, entry] of entries) {
+			if (typeof entry === "string") {
+				str += `  ${JSON.stringify(key)}: ${JSON.stringify(entry)},\n`;
+			} else {
+				str += `  ${JSON.stringify(key)}: { `;
+				if (entry.resolved !== key)
+					str += `"resolved": ${JSON.stringify(entry.resolved)}, `;
+				str += `"integrity": ${JSON.stringify(
+					entry.integrity
+				)}, "contentType": ${JSON.stringify(entry.contentType)} },\n`;
+			}
+		}
+		str += `  "version": ${this.version}\n}\n`;
+		return str;
+	}
+}
+
+/**
+ * @template R
+ * @typedef {(err: Error | null, result?: R) => void}  FnWithoutKeyCallback
+ */
+
+/**
+ * @template R
+ * @typedef {(callback: FnWithoutKeyCallback) => void} FnWithoutKey
+ */
+
+/**
+ * @template R
+ * @param {FnWithoutKey} fn function
+ * @returns {FnWithoutKey} cached function
+ */
+const cachedWithoutKey = fn => {
+	let inFlight = false;
+	/** @type {Error | undefined} */
+	let cachedError;
+	/** @type {R | undefined} */
+	let cachedResult;
+	/** @type {FnWithoutKeyCallback[] | undefined} */
+	let cachedCallbacks;
+	return callback => {
+		if (inFlight) {
+			if (cachedResult !== undefined) return callback(null, cachedResult);
+			if (cachedError !== undefined) return callback(cachedError);
+			if (cachedCallbacks === undefined) cachedCallbacks = [callback];
+			else cachedCallbacks.push(callback);
+			return;
+		}
+		inFlight = true;
+		fn((err, result) => {
+			if (err) cachedError = err;
+			else cachedResult = result;
+			const callbacks = cachedCallbacks;
+			cachedCallbacks = undefined;
+			callback(err, result);
+			if (callbacks !== undefined) for (const cb of callbacks) cb(err, result);
+		});
+	};
+};
+
+/**
+ * @template R
+ * @typedef {(err: Error | null, result?: R) => void} FnWithKeyCallback
+ */
+
+/**
+ * @template T
+ * @template R
+ * @typedef {(item: T, callback: FnWithKeyCallback) => void} FnWithKey
+ */
+
+/**
+ * @template T
+ * @template R
+ * @param {FnWithKey} fn function
+ * @param {FnWithKey=} forceFn function for the second try
+ * @returns {(FnWithKey) & { force: FnWithKey }} cached function
+ */
+const cachedWithKey = (fn, forceFn = fn) => {
+	/**
+	 * @template R
+	 * @typedef {{ result?: R, error?: Error, callbacks?: FnWithKeyCallback[], force?: true }} CacheEntry
+	 */
+	/** @type {Map>} */
+	const cache = new Map();
+	/**
+	 * @param {T} arg arg
+	 * @param {FnWithKeyCallback} callback callback
+	 * @returns {void}
+	 */
+	const resultFn = (arg, callback) => {
+		const cacheEntry = cache.get(arg);
+		if (cacheEntry !== undefined) {
+			if (cacheEntry.result !== undefined)
+				return callback(null, cacheEntry.result);
+			if (cacheEntry.error !== undefined) return callback(cacheEntry.error);
+			if (cacheEntry.callbacks === undefined) cacheEntry.callbacks = [callback];
+			else cacheEntry.callbacks.push(callback);
+			return;
+		}
+		/** @type {CacheEntry} */
+		const newCacheEntry = {
+			result: undefined,
+			error: undefined,
+			callbacks: undefined
+		};
+		cache.set(arg, newCacheEntry);
+		fn(arg, (err, result) => {
+			if (err) newCacheEntry.error = err;
+			else newCacheEntry.result = result;
+			const callbacks = newCacheEntry.callbacks;
+			newCacheEntry.callbacks = undefined;
+			callback(err, result);
+			if (callbacks !== undefined) for (const cb of callbacks) cb(err, result);
+		});
+	};
+	/**
+	 * @param {T} arg arg
+	 * @param {FnWithKeyCallback} callback callback
+	 * @returns {void}
+	 */
+	resultFn.force = (arg, callback) => {
+		const cacheEntry = cache.get(arg);
+		if (cacheEntry !== undefined && cacheEntry.force) {
+			if (cacheEntry.result !== undefined)
+				return callback(null, cacheEntry.result);
+			if (cacheEntry.error !== undefined) return callback(cacheEntry.error);
+			if (cacheEntry.callbacks === undefined) cacheEntry.callbacks = [callback];
+			else cacheEntry.callbacks.push(callback);
+			return;
+		}
+		/** @type {CacheEntry} */
+		const newCacheEntry = {
+			result: undefined,
+			error: undefined,
+			callbacks: undefined,
+			force: true
+		};
+		cache.set(arg, newCacheEntry);
+		forceFn(arg, (err, result) => {
+			if (err) newCacheEntry.error = err;
+			else newCacheEntry.result = result;
+			const callbacks = newCacheEntry.callbacks;
+			newCacheEntry.callbacks = undefined;
+			callback(err, result);
+			if (callbacks !== undefined) for (const cb of callbacks) cb(err, result);
+		});
+	};
+	return resultFn;
+};
+
+/**
+ * @typedef {object} LockfileCache
+ * @property {Lockfile} lockfile lockfile
+ * @property {Snapshot} snapshot snapshot
+ */
+
+/**
+ * @typedef {object} ResolveContentResult
+ * @property {LockfileEntry} entry lockfile entry
+ * @property {Buffer} content content
+ * @property {boolean} storeLock need store lockfile
+ */
+
+/** @typedef {{ storeCache: boolean, storeLock: boolean, validUntil: number, etag: string | undefined, fresh: boolean }} FetchResultMeta */
+/** @typedef {FetchResultMeta & { location: string }} RedirectFetchResult */
+/** @typedef {FetchResultMeta & { entry: LockfileEntry, content: Buffer }} ContentFetchResult */
+/** @typedef {RedirectFetchResult | ContentFetchResult} FetchResult */
+
+const PLUGIN_NAME = "HttpUriPlugin";
+
+class HttpUriPlugin {
+	/**
+	 * @param {HttpUriPluginOptions} options options
+	 */
+	constructor(options) {
+		validate(options);
+		this._lockfileLocation = options.lockfileLocation;
+		this._cacheLocation = options.cacheLocation;
+		this._upgrade = options.upgrade;
+		this._frozen = options.frozen;
+		this._allowedUris = options.allowedUris;
+		this._proxy = options.proxy;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		const proxy =
+			this._proxy || process.env.http_proxy || process.env.HTTP_PROXY;
+		const schemes = [
+			{
+				scheme: "http",
+				fetch: proxyFetch(getHttp(), proxy)
+			},
+			{
+				scheme: "https",
+				fetch: proxyFetch(getHttps(), proxy)
+			}
+		];
+		/** @type {LockfileCache} */
+		let lockfileCache;
+		compiler.hooks.compilation.tap(
+			PLUGIN_NAME,
+			(compilation, { normalModuleFactory }) => {
+				const intermediateFs =
+					/** @type {IntermediateFileSystem} */
+					(compiler.intermediateFileSystem);
+				const fs = compilation.inputFileSystem;
+				const cache = compilation.getCache(`webpack.${PLUGIN_NAME}`);
+				const logger = compilation.getLogger(`webpack.${PLUGIN_NAME}`);
+				/** @type {string} */
+				const lockfileLocation =
+					this._lockfileLocation ||
+					join(
+						intermediateFs,
+						compiler.context,
+						compiler.name
+							? `${toSafePath(compiler.name)}.webpack.lock`
+							: "webpack.lock"
+					);
+				/** @type {string | false} */
+				const cacheLocation =
+					this._cacheLocation !== undefined
+						? this._cacheLocation
+						: `${lockfileLocation}.data`;
+				const upgrade = this._upgrade || false;
+				const frozen = this._frozen || false;
+				const hashFunction = "sha512";
+				const hashDigest = "hex";
+				const hashDigestLength = 20;
+				const allowedUris = this._allowedUris;
+
+				let warnedAboutEol = false;
+
+				/** @type {Map} */
+				const cacheKeyCache = new Map();
+				/**
+				 * @param {string} url the url
+				 * @returns {string} the key
+				 */
+				const getCacheKey = url => {
+					const cachedResult = cacheKeyCache.get(url);
+					if (cachedResult !== undefined) return cachedResult;
+					const result = _getCacheKey(url);
+					cacheKeyCache.set(url, result);
+					return result;
+				};
+
+				/**
+				 * @param {string} url the url
+				 * @returns {string} the key
+				 */
+				const _getCacheKey = url => {
+					const parsedUrl = new URL(url);
+					const folder = toSafePath(parsedUrl.origin);
+					const name = toSafePath(parsedUrl.pathname);
+					const query = toSafePath(parsedUrl.search);
+					let ext = extname(name);
+					if (ext.length > 20) ext = "";
+					const basename = ext ? name.slice(0, -ext.length) : name;
+					const hash = createHash(hashFunction);
+					hash.update(url);
+					const digest = hash.digest(hashDigest).slice(0, hashDigestLength);
+					return `${folder.slice(-50)}/${`${basename}${
+						query ? `_${query}` : ""
+					}`.slice(0, 150)}_${digest}${ext}`;
+				};
+
+				const getLockfile = cachedWithoutKey(
+					/**
+					 * @param {(err: Error | null, lockfile?: Lockfile) => void} callback callback
+					 * @returns {void}
+					 */
+					callback => {
+						const readLockfile = () => {
+							intermediateFs.readFile(lockfileLocation, (err, buffer) => {
+								if (err && err.code !== "ENOENT") {
+									compilation.missingDependencies.add(lockfileLocation);
+									return callback(err);
+								}
+								compilation.fileDependencies.add(lockfileLocation);
+								compilation.fileSystemInfo.createSnapshot(
+									compiler.fsStartTime,
+									buffer ? [lockfileLocation] : [],
+									[],
+									buffer ? [] : [lockfileLocation],
+									{ timestamp: true },
+									(err, s) => {
+										if (err) return callback(err);
+										const lockfile = buffer
+											? Lockfile.parse(buffer.toString("utf-8"))
+											: new Lockfile();
+										lockfileCache = {
+											lockfile,
+											snapshot: /** @type {Snapshot} */ (s)
+										};
+										callback(null, lockfile);
+									}
+								);
+							});
+						};
+						if (lockfileCache) {
+							compilation.fileSystemInfo.checkSnapshotValid(
+								lockfileCache.snapshot,
+								(err, valid) => {
+									if (err) return callback(err);
+									if (!valid) return readLockfile();
+									callback(null, lockfileCache.lockfile);
+								}
+							);
+						} else {
+							readLockfile();
+						}
+					}
+				);
+
+				/** @typedef {Map} LockfileUpdates */
+
+				/** @type {LockfileUpdates | undefined} */
+				let lockfileUpdates;
+
+				/**
+				 * @param {Lockfile} lockfile lockfile instance
+				 * @param {string} url url to store
+				 * @param {LockfileEntry | "ignore" | "no-cache"} entry lockfile entry
+				 */
+				const storeLockEntry = (lockfile, url, entry) => {
+					const oldEntry = lockfile.entries.get(url);
+					if (lockfileUpdates === undefined) lockfileUpdates = new Map();
+					lockfileUpdates.set(url, entry);
+					lockfile.entries.set(url, entry);
+					if (!oldEntry) {
+						logger.log(`${url} added to lockfile`);
+					} else if (typeof oldEntry === "string") {
+						if (typeof entry === "string") {
+							logger.log(`${url} updated in lockfile: ${oldEntry} -> ${entry}`);
+						} else {
+							logger.log(
+								`${url} updated in lockfile: ${oldEntry} -> ${entry.resolved}`
+							);
+						}
+					} else if (typeof entry === "string") {
+						logger.log(
+							`${url} updated in lockfile: ${oldEntry.resolved} -> ${entry}`
+						);
+					} else if (oldEntry.resolved !== entry.resolved) {
+						logger.log(
+							`${url} updated in lockfile: ${oldEntry.resolved} -> ${entry.resolved}`
+						);
+					} else if (oldEntry.integrity !== entry.integrity) {
+						logger.log(`${url} updated in lockfile: content changed`);
+					} else if (oldEntry.contentType !== entry.contentType) {
+						logger.log(
+							`${url} updated in lockfile: ${oldEntry.contentType} -> ${entry.contentType}`
+						);
+					} else {
+						logger.log(`${url} updated in lockfile`);
+					}
+				};
+
+				/**
+				 * @param {Lockfile} lockfile lockfile
+				 * @param {string} url url
+				 * @param {ResolveContentResult} result result
+				 * @param {(err: Error | null, result?: ResolveContentResult) => void} callback callback
+				 * @returns {void}
+				 */
+				const storeResult = (lockfile, url, result, callback) => {
+					if (result.storeLock) {
+						storeLockEntry(lockfile, url, result.entry);
+						if (!cacheLocation || !result.content)
+							return callback(null, result);
+						const key = getCacheKey(result.entry.resolved);
+						const filePath = join(intermediateFs, cacheLocation, key);
+						mkdirp(intermediateFs, dirname(intermediateFs, filePath), err => {
+							if (err) return callback(err);
+							intermediateFs.writeFile(filePath, result.content, err => {
+								if (err) return callback(err);
+								callback(null, result);
+							});
+						});
+					} else {
+						storeLockEntry(lockfile, url, "no-cache");
+						callback(null, result);
+					}
+				};
+
+				for (const { scheme, fetch } of schemes) {
+					/**
+					 * @param {string} url URL
+					 * @param {string | null} integrity integrity
+					 * @param {(err: Error | null, resolveContentResult?: ResolveContentResult) => void} callback callback
+					 */
+					const resolveContent = (url, integrity, callback) => {
+						/**
+						 * @param {Error | null} err error
+						 * @param {FetchResult=} _result fetch result
+						 * @returns {void}
+						 */
+						const handleResult = (err, _result) => {
+							if (err) return callback(err);
+
+							const result = /** @type {FetchResult} */ (_result);
+
+							if ("location" in result) {
+								return resolveContent(
+									result.location,
+									integrity,
+									(err, innerResult) => {
+										if (err) return callback(err);
+										const { entry, content, storeLock } =
+											/** @type {ResolveContentResult} */ (innerResult);
+										callback(null, {
+											entry,
+											content,
+											storeLock: storeLock && result.storeLock
+										});
+									}
+								);
+							}
+
+							if (
+								!result.fresh &&
+								integrity &&
+								result.entry.integrity !== integrity &&
+								!verifyIntegrity(result.content, integrity)
+							) {
+								return fetchContent.force(url, handleResult);
+							}
+
+							return callback(null, {
+								entry: result.entry,
+								content: result.content,
+								storeLock: result.storeLock
+							});
+						};
+
+						fetchContent(url, handleResult);
+					};
+
+					/**
+					 * @param {string} url URL
+					 * @param {FetchResult | RedirectFetchResult | undefined} cachedResult result from cache
+					 * @param {(err: Error | null, fetchResult?: FetchResult) => void} callback callback
+					 * @returns {void}
+					 */
+					const fetchContentRaw = (url, cachedResult, callback) => {
+						const requestTime = Date.now();
+						/** @type {OutgoingHttpHeaders} */
+						const headers = {
+							"accept-encoding": "gzip, deflate, br",
+							"user-agent": "webpack"
+						};
+
+						if (cachedResult && cachedResult.etag) {
+							headers["if-none-match"] = cachedResult.etag;
+						}
+
+						fetch(new URL(url), { headers }, res => {
+							const etag = res.headers.etag;
+							const location = res.headers.location;
+							const cacheControl = res.headers["cache-control"];
+							const { storeLock, storeCache, validUntil } = parseCacheControl(
+								cacheControl,
+								requestTime
+							);
+							/**
+							 * @param {Partial> & (Pick | Pick)} partialResult result
+							 * @returns {void}
+							 */
+							const finishWith = partialResult => {
+								if ("location" in partialResult) {
+									logger.debug(
+										`GET ${url} [${res.statusCode}] -> ${partialResult.location}`
+									);
+								} else {
+									logger.debug(
+										`GET ${url} [${res.statusCode}] ${Math.ceil(
+											partialResult.content.length / 1024
+										)} kB${!storeLock ? " no-cache" : ""}`
+									);
+								}
+								const result = {
+									...partialResult,
+									fresh: true,
+									storeLock,
+									storeCache,
+									validUntil,
+									etag
+								};
+								if (!storeCache) {
+									logger.log(
+										`${url} can't be stored in cache, due to Cache-Control header: ${cacheControl}`
+									);
+									return callback(null, result);
+								}
+								cache.store(
+									url,
+									null,
+									{
+										...result,
+										fresh: false
+									},
+									err => {
+										if (err) {
+											logger.warn(
+												`${url} can't be stored in cache: ${err.message}`
+											);
+											logger.debug(err.stack);
+										}
+										callback(null, result);
+									}
+								);
+							};
+							if (res.statusCode === 304) {
+								const result = /** @type {FetchResult} */ (cachedResult);
+								if (
+									result.validUntil < validUntil ||
+									result.storeLock !== storeLock ||
+									result.storeCache !== storeCache ||
+									result.etag !== etag
+								) {
+									return finishWith(result);
+								}
+								logger.debug(`GET ${url} [${res.statusCode}] (unchanged)`);
+								return callback(null, { ...result, fresh: true });
+							}
+							if (
+								location &&
+								res.statusCode &&
+								res.statusCode >= 301 &&
+								res.statusCode <= 308
+							) {
+								const result = {
+									location: new URL(location, url).href
+								};
+								if (
+									!cachedResult ||
+									!("location" in cachedResult) ||
+									cachedResult.location !== result.location ||
+									cachedResult.validUntil < validUntil ||
+									cachedResult.storeLock !== storeLock ||
+									cachedResult.storeCache !== storeCache ||
+									cachedResult.etag !== etag
+								) {
+									return finishWith(result);
+								}
+								logger.debug(`GET ${url} [${res.statusCode}] (unchanged)`);
+								return callback(null, {
+									...result,
+									fresh: true,
+									storeLock,
+									storeCache,
+									validUntil,
+									etag
+								});
+							}
+							const contentType = res.headers["content-type"] || "";
+							/** @type {Buffer[]} */
+							const bufferArr = [];
+
+							const contentEncoding = res.headers["content-encoding"];
+							/** @type {Readable} */
+							let stream = res;
+							if (contentEncoding === "gzip") {
+								stream = stream.pipe(createGunzip());
+							} else if (contentEncoding === "br") {
+								stream = stream.pipe(createBrotliDecompress());
+							} else if (contentEncoding === "deflate") {
+								stream = stream.pipe(createInflate());
+							}
+
+							stream.on("data", chunk => {
+								bufferArr.push(chunk);
+							});
+
+							stream.on("end", () => {
+								if (!res.complete) {
+									logger.log(`GET ${url} [${res.statusCode}] (terminated)`);
+									return callback(new Error(`${url} request was terminated`));
+								}
+
+								const content = Buffer.concat(bufferArr);
+
+								if (res.statusCode !== 200) {
+									logger.log(`GET ${url} [${res.statusCode}]`);
+									return callback(
+										new Error(
+											`${url} request status code = ${
+												res.statusCode
+											}\n${content.toString("utf-8")}`
+										)
+									);
+								}
+
+								const integrity = computeIntegrity(content);
+								const entry = { resolved: url, integrity, contentType };
+
+								finishWith({
+									entry,
+									content
+								});
+							});
+						}).on("error", err => {
+							logger.log(`GET ${url} (error)`);
+							err.message += `\nwhile fetching ${url}`;
+							callback(err);
+						});
+					};
+
+					const fetchContent = cachedWithKey(
+						/**
+						 * @param {string} url URL
+						 * @param {(err: Error | null, result?: FetchResult) => void} callback callback
+						 * @returns {void}
+						 */
+						(url, callback) => {
+							cache.get(url, null, (err, cachedResult) => {
+								if (err) return callback(err);
+								if (cachedResult) {
+									const isValid = cachedResult.validUntil >= Date.now();
+									if (isValid) return callback(null, cachedResult);
+								}
+								fetchContentRaw(url, cachedResult, callback);
+							});
+						},
+						(url, callback) => fetchContentRaw(url, undefined, callback)
+					);
+
+					/**
+					 * @param {string} uri uri
+					 * @returns {boolean} true when allowed, otherwise false
+					 */
+					const isAllowed = uri => {
+						for (const allowed of allowedUris) {
+							if (typeof allowed === "string") {
+								if (uri.startsWith(allowed)) return true;
+							} else if (typeof allowed === "function") {
+								if (allowed(uri)) return true;
+							} else if (allowed.test(uri)) {
+								return true;
+							}
+						}
+						return false;
+					};
+
+					/** @typedef {{ entry: LockfileEntry, content: Buffer }} Info */
+
+					const getInfo = cachedWithKey(
+						/**
+						 * @param {string} url the url
+						 * @param {(err: Error | null, info?: Info) => void} callback callback
+						 * @returns {void}
+						 */
+						// eslint-disable-next-line no-loop-func
+						(url, callback) => {
+							if (!isAllowed(url)) {
+								return callback(
+									new Error(
+										`${url} doesn't match the allowedUris policy. These URIs are allowed:\n${allowedUris
+											.map(uri => ` - ${uri}`)
+											.join("\n")}`
+									)
+								);
+							}
+							getLockfile((err, _lockfile) => {
+								if (err) return callback(err);
+								const lockfile = /** @type {Lockfile} */ (_lockfile);
+								const entryOrString = lockfile.entries.get(url);
+								if (!entryOrString) {
+									if (frozen) {
+										return callback(
+											new Error(
+												`${url} has no lockfile entry and lockfile is frozen`
+											)
+										);
+									}
+									resolveContent(url, null, (err, result) => {
+										if (err) return callback(err);
+										storeResult(
+											/** @type {Lockfile} */
+											(lockfile),
+											url,
+											/** @type {ResolveContentResult} */
+											(result),
+											callback
+										);
+									});
+									return;
+								}
+								if (typeof entryOrString === "string") {
+									const entryTag = entryOrString;
+									resolveContent(url, null, (err, _result) => {
+										if (err) return callback(err);
+										const result =
+											/** @type {ResolveContentResult} */
+											(_result);
+										if (!result.storeLock || entryTag === "ignore")
+											return callback(null, result);
+										if (frozen) {
+											return callback(
+												new Error(
+													`${url} used to have ${entryTag} lockfile entry and has content now, but lockfile is frozen`
+												)
+											);
+										}
+										if (!upgrade) {
+											return callback(
+												new Error(
+													`${url} used to have ${entryTag} lockfile entry and has content now.
+This should be reflected in the lockfile, so this lockfile entry must be upgraded, but upgrading is not enabled.
+Remove this line from the lockfile to force upgrading.`
+												)
+											);
+										}
+										storeResult(lockfile, url, result, callback);
+									});
+									return;
+								}
+								let entry = entryOrString;
+								/**
+								 * @param {Buffer=} lockedContent locked content
+								 */
+								const doFetch = lockedContent => {
+									resolveContent(url, entry.integrity, (err, _result) => {
+										if (err) {
+											if (lockedContent) {
+												logger.warn(
+													`Upgrade request to ${url} failed: ${err.message}`
+												);
+												logger.debug(err.stack);
+												return callback(null, {
+													entry,
+													content: lockedContent
+												});
+											}
+											return callback(err);
+										}
+										const result =
+											/** @type {ResolveContentResult} */
+											(_result);
+										if (!result.storeLock) {
+											// When the lockfile entry should be no-cache
+											// we need to update the lockfile
+											if (frozen) {
+												return callback(
+													new Error(
+														`${url} has a lockfile entry and is no-cache now, but lockfile is frozen\nLockfile: ${entryToString(
+															entry
+														)}`
+													)
+												);
+											}
+											storeResult(lockfile, url, result, callback);
+											return;
+										}
+										if (!areLockfileEntriesEqual(result.entry, entry)) {
+											// When the lockfile entry is outdated
+											// we need to update the lockfile
+											if (frozen) {
+												return callback(
+													new Error(
+														`${url} has an outdated lockfile entry, but lockfile is frozen\nLockfile: ${entryToString(
+															entry
+														)}\nExpected: ${entryToString(result.entry)}`
+													)
+												);
+											}
+											storeResult(lockfile, url, result, callback);
+											return;
+										}
+										if (!lockedContent && cacheLocation) {
+											// When the lockfile cache content is missing
+											// we need to update the lockfile
+											if (frozen) {
+												return callback(
+													new Error(
+														`${url} is missing content in the lockfile cache, but lockfile is frozen\nLockfile: ${entryToString(
+															entry
+														)}`
+													)
+												);
+											}
+											storeResult(lockfile, url, result, callback);
+											return;
+										}
+										return callback(null, result);
+									});
+								};
+								if (cacheLocation) {
+									// When there is a lockfile cache
+									// we read the content from there
+									const key = getCacheKey(entry.resolved);
+									const filePath = join(intermediateFs, cacheLocation, key);
+									fs.readFile(filePath, (err, result) => {
+										if (err) {
+											if (err.code === "ENOENT") return doFetch();
+											return callback(err);
+										}
+										const content = /** @type {Buffer} */ (result);
+										/**
+										 * @param {Buffer | undefined} _result result
+										 * @returns {void}
+										 */
+										const continueWithCachedContent = _result => {
+											if (!upgrade) {
+												// When not in upgrade mode, we accept the result from the lockfile cache
+												return callback(null, { entry, content });
+											}
+											return doFetch(content);
+										};
+										if (!verifyIntegrity(content, entry.integrity)) {
+											/** @type {Buffer | undefined} */
+											let contentWithChangedEol;
+											let isEolChanged = false;
+											try {
+												contentWithChangedEol = Buffer.from(
+													content.toString("utf-8").replace(/\r\n/g, "\n")
+												);
+												isEolChanged = verifyIntegrity(
+													contentWithChangedEol,
+													entry.integrity
+												);
+											} catch (_err) {
+												// ignore
+											}
+											if (isEolChanged) {
+												if (!warnedAboutEol) {
+													const explainer = `Incorrect end of line sequence was detected in the lockfile cache.
+The lockfile cache is protected by integrity checks, so any external modification will lead to a corrupted lockfile cache.
+When using git make sure to configure .gitattributes correctly for the lockfile cache:
+  **/*webpack.lock.data/** -text
+This will avoid that the end of line sequence is changed by git on Windows.`;
+													if (frozen) {
+														logger.error(explainer);
+													} else {
+														logger.warn(explainer);
+														logger.info(
+															"Lockfile cache will be automatically fixed now, but when lockfile is frozen this would result in an error."
+														);
+													}
+													warnedAboutEol = true;
+												}
+												if (!frozen) {
+													// "fix" the end of line sequence of the lockfile content
+													logger.log(
+														`${filePath} fixed end of line sequence (\\r\\n instead of \\n).`
+													);
+													intermediateFs.writeFile(
+														filePath,
+														/** @type {Buffer} */
+														(contentWithChangedEol),
+														err => {
+															if (err) return callback(err);
+															continueWithCachedContent(
+																/** @type {Buffer} */
+																(contentWithChangedEol)
+															);
+														}
+													);
+													return;
+												}
+											}
+											if (frozen) {
+												return callback(
+													new Error(
+														`${
+															entry.resolved
+														} integrity mismatch, expected content with integrity ${
+															entry.integrity
+														} but got ${computeIntegrity(content)}.
+Lockfile corrupted (${
+															isEolChanged
+																? "end of line sequence was unexpectedly changed"
+																: "incorrectly merged? changed by other tools?"
+														}).
+Run build with un-frozen lockfile to automatically fix lockfile.`
+													)
+												);
+											}
+											// "fix" the lockfile entry to the correct integrity
+											// the content has priority over the integrity value
+											entry = {
+												...entry,
+												integrity: computeIntegrity(content)
+											};
+											storeLockEntry(lockfile, url, entry);
+										}
+										continueWithCachedContent(result);
+									});
+								} else {
+									doFetch();
+								}
+							});
+						}
+					);
+
+					/**
+					 * @param {URL} url url
+					 * @param {ResourceDataWithData} resourceData resource data
+					 * @param {(err: Error | null, result: true | void) => void} callback callback
+					 */
+					const respondWithUrlModule = (url, resourceData, callback) => {
+						getInfo(url.href, (err, _result) => {
+							if (err) return callback(err);
+							const result = /** @type {Info} */ (_result);
+							resourceData.resource = url.href;
+							resourceData.path = url.origin + url.pathname;
+							resourceData.query = url.search;
+							resourceData.fragment = url.hash;
+							resourceData.context = new URL(
+								".",
+								result.entry.resolved
+							).href.slice(0, -1);
+							resourceData.data.mimetype = result.entry.contentType;
+							callback(null, true);
+						});
+					};
+					normalModuleFactory.hooks.resolveForScheme
+						.for(scheme)
+						.tapAsync(PLUGIN_NAME, (resourceData, resolveData, callback) => {
+							respondWithUrlModule(
+								new URL(resourceData.resource),
+								resourceData,
+								callback
+							);
+						});
+					normalModuleFactory.hooks.resolveInScheme
+						.for(scheme)
+						.tapAsync(PLUGIN_NAME, (resourceData, data, callback) => {
+							// Only handle relative urls (./xxx, ../xxx, /xxx, //xxx)
+							if (
+								data.dependencyType !== "url" &&
+								!/^\.{0,2}\//.test(resourceData.resource)
+							) {
+								return callback();
+							}
+							respondWithUrlModule(
+								new URL(resourceData.resource, `${data.context}/`),
+								resourceData,
+								callback
+							);
+						});
+					const hooks = NormalModule.getCompilationHooks(compilation);
+					hooks.readResourceForScheme
+						.for(scheme)
+						.tapAsync(PLUGIN_NAME, (resource, module, callback) =>
+							getInfo(resource, (err, _result) => {
+								if (err) return callback(err);
+								const result = /** @type {Info} */ (_result);
+								/** @type {BuildInfo} */
+								(module.buildInfo).resourceIntegrity = result.entry.integrity;
+								callback(null, result.content);
+							})
+						);
+					hooks.needBuild.tapAsync(PLUGIN_NAME, (module, context, callback) => {
+						if (module.resource && module.resource.startsWith(`${scheme}://`)) {
+							getInfo(module.resource, (err, _result) => {
+								if (err) return callback(err);
+								const result = /** @type {Info} */ (_result);
+								if (
+									result.entry.integrity !==
+									/** @type {BuildInfo} */
+									(module.buildInfo).resourceIntegrity
+								) {
+									return callback(null, true);
+								}
+								callback();
+							});
+						} else {
+							return callback();
+						}
+					});
+				}
+				compilation.hooks.finishModules.tapAsync(
+					PLUGIN_NAME,
+					(modules, callback) => {
+						if (!lockfileUpdates) return callback();
+						const ext = extname(lockfileLocation);
+						const tempFile = join(
+							intermediateFs,
+							dirname(intermediateFs, lockfileLocation),
+							`.${basename(lockfileLocation, ext)}.${
+								(Math.random() * 10000) | 0
+							}${ext}`
+						);
+
+						const writeDone = () => {
+							const nextOperation =
+								/** @type {InProgressWriteItem[]} */
+								(inProgressWrite).shift();
+							if (nextOperation) {
+								nextOperation();
+							} else {
+								inProgressWrite = undefined;
+							}
+						};
+						const runWrite = () => {
+							intermediateFs.readFile(lockfileLocation, (err, buffer) => {
+								if (err && err.code !== "ENOENT") {
+									writeDone();
+									return callback(err);
+								}
+								const lockfile = buffer
+									? Lockfile.parse(buffer.toString("utf-8"))
+									: new Lockfile();
+								for (const [key, value] of /** @type {LockfileUpdates} */ (
+									lockfileUpdates
+								)) {
+									lockfile.entries.set(key, value);
+								}
+								intermediateFs.writeFile(tempFile, lockfile.toString(), err => {
+									if (err) {
+										writeDone();
+										return (
+											/** @type {NonNullable} */
+											(intermediateFs.unlink)(tempFile, () => callback(err))
+										);
+									}
+									intermediateFs.rename(tempFile, lockfileLocation, err => {
+										if (err) {
+											writeDone();
+											return (
+												/** @type {NonNullable} */
+												(intermediateFs.unlink)(tempFile, () => callback(err))
+											);
+										}
+										writeDone();
+										callback();
+									});
+								});
+							});
+						};
+						if (inProgressWrite) {
+							inProgressWrite.push(runWrite);
+						} else {
+							inProgressWrite = [];
+							runWrite();
+						}
+					}
+				);
+			}
+		);
+	}
+}
+
+module.exports = HttpUriPlugin;
diff --git a/lib/serialization/AggregateErrorSerializer.js b/lib/serialization/AggregateErrorSerializer.js
new file mode 100644
index 00000000000..bebf83362f8
--- /dev/null
+++ b/lib/serialization/AggregateErrorSerializer.js
@@ -0,0 +1,42 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+/** @typedef {import("./ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
+/** @typedef {Error & { cause: unknown, errors: EXPECTED_ANY[] }} AggregateError */
+
+class AggregateErrorSerializer {
+	/**
+	 * @param {AggregateError} obj error
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(obj, context) {
+		context.write(obj.errors);
+		context.write(obj.message);
+		context.write(obj.stack);
+		context.write(obj.cause);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 * @returns {AggregateError} error
+	 */
+	deserialize(context) {
+		const errors = context.read();
+		// @ts-expect-error ES2018 doesn't `AggregateError`, but it can be used by developers
+		// eslint-disable-next-line n/no-unsupported-features/es-builtins, n/no-unsupported-features/es-syntax
+		const err = new AggregateError(errors);
+
+		err.message = context.read();
+		err.stack = context.read();
+		err.cause = context.read();
+
+		return err;
+	}
+}
+
+module.exports = AggregateErrorSerializer;
diff --git a/lib/serialization/ArraySerializer.js b/lib/serialization/ArraySerializer.js
new file mode 100644
index 00000000000..021c82ca5d4
--- /dev/null
+++ b/lib/serialization/ArraySerializer.js
@@ -0,0 +1,38 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+/** @typedef {import("./ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
+class ArraySerializer {
+	/**
+	 * @template T
+	 * @param {T[]} array array
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(array, context) {
+		context.write(array.length);
+		for (const item of array) context.write(item);
+	}
+
+	/**
+	 * @template T
+	 * @param {ObjectDeserializerContext} context context
+	 * @returns {T[]} array
+	 */
+	deserialize(context) {
+		/** @type {number} */
+		const length = context.read();
+		/** @type {T[]} */
+		const array = [];
+		for (let i = 0; i < length; i++) {
+			array.push(context.read());
+		}
+		return array;
+	}
+}
+
+module.exports = ArraySerializer;
diff --git a/lib/serialization/BinaryMiddleware.js b/lib/serialization/BinaryMiddleware.js
new file mode 100644
index 00000000000..860b22f0f6f
--- /dev/null
+++ b/lib/serialization/BinaryMiddleware.js
@@ -0,0 +1,1159 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const memoize = require("../util/memoize");
+const SerializerMiddleware = require("./SerializerMiddleware");
+
+/** @typedef {import("./types").BufferSerializableType} BufferSerializableType */
+/** @typedef {import("./types").PrimitiveSerializableType} PrimitiveSerializableType */
+
+/*
+Format:
+
+File -> Section*
+
+Section -> NullsSection |
+					 BooleansSection |
+					 F64NumbersSection |
+					 I32NumbersSection |
+					 I8NumbersSection |
+					 ShortStringSection |
+					 BigIntSection |
+					 I32BigIntSection |
+					 I8BigIntSection
+					 StringSection |
+					 BufferSection |
+					 NopSection
+
+
+
+NullsSection ->
+	NullHeaderByte | Null2HeaderByte | Null3HeaderByte |
+	Nulls8HeaderByte 0xnn (n:count - 4) |
+	Nulls32HeaderByte n:ui32 (n:count - 260) |
+BooleansSection -> TrueHeaderByte | FalseHeaderByte | BooleansSectionHeaderByte BooleansCountAndBitsByte
+F64NumbersSection -> F64NumbersSectionHeaderByte f64*
+I32NumbersSection -> I32NumbersSectionHeaderByte i32*
+I8NumbersSection -> I8NumbersSectionHeaderByte i8*
+ShortStringSection -> ShortStringSectionHeaderByte ascii-byte*
+StringSection -> StringSectionHeaderByte i32:length utf8-byte*
+BufferSection -> BufferSectionHeaderByte i32:length byte*
+NopSection --> NopSectionHeaderByte
+BigIntSection -> BigIntSectionHeaderByte i32:length ascii-byte*
+I32BigIntSection -> I32BigIntSectionHeaderByte i32
+I8BigIntSection -> I8BigIntSectionHeaderByte i8
+
+ShortStringSectionHeaderByte -> 0b1nnn_nnnn (n:length)
+
+F64NumbersSectionHeaderByte -> 0b001n_nnnn (n:count - 1)
+I32NumbersSectionHeaderByte -> 0b010n_nnnn (n:count - 1)
+I8NumbersSectionHeaderByte -> 0b011n_nnnn (n:count - 1)
+
+NullsSectionHeaderByte -> 0b0001_nnnn (n:count - 1)
+BooleansCountAndBitsByte ->
+	0b0000_1xxx (count = 3) |
+	0b0001_xxxx (count = 4) |
+	0b001x_xxxx (count = 5) |
+	0b01xx_xxxx (count = 6) |
+	0b1nnn_nnnn (n:count - 7, 7 <= count <= 133)
+	0xff n:ui32 (n:count, 134 <= count < 2^32)
+
+StringSectionHeaderByte -> 0b0000_1110
+BufferSectionHeaderByte -> 0b0000_1111
+NopSectionHeaderByte -> 0b0000_1011
+BigIntSectionHeaderByte -> 0b0001_1010
+I32BigIntSectionHeaderByte -> 0b0001_1100
+I8BigIntSectionHeaderByte -> 0b0001_1011
+FalseHeaderByte -> 0b0000_1100
+TrueHeaderByte -> 0b0000_1101
+
+RawNumber -> n (n <= 10)
+
+*/
+
+const LAZY_HEADER = 0x0b;
+const TRUE_HEADER = 0x0c;
+const FALSE_HEADER = 0x0d;
+const BOOLEANS_HEADER = 0x0e;
+const NULL_HEADER = 0x10;
+const NULL2_HEADER = 0x11;
+const NULL3_HEADER = 0x12;
+const NULLS8_HEADER = 0x13;
+const NULLS32_HEADER = 0x14;
+const NULL_AND_I8_HEADER = 0x15;
+const NULL_AND_I32_HEADER = 0x16;
+const NULL_AND_TRUE_HEADER = 0x17;
+const NULL_AND_FALSE_HEADER = 0x18;
+const BIGINT_HEADER = 0x1a;
+const BIGINT_I8_HEADER = 0x1b;
+const BIGINT_I32_HEADER = 0x1c;
+const STRING_HEADER = 0x1e;
+const BUFFER_HEADER = 0x1f;
+const I8_HEADER = 0x60;
+const I32_HEADER = 0x40;
+const F64_HEADER = 0x20;
+const SHORT_STRING_HEADER = 0x80;
+
+/** Uplift high-order bits */
+const NUMBERS_HEADER_MASK = 0xe0; // 0b1010_0000
+const NUMBERS_COUNT_MASK = 0x1f; // 0b0001_1111
+const SHORT_STRING_LENGTH_MASK = 0x7f; // 0b0111_1111
+
+const HEADER_SIZE = 1;
+const I8_SIZE = 1;
+const I32_SIZE = 4;
+const F64_SIZE = 8;
+
+const MEASURE_START_OPERATION = Symbol("MEASURE_START_OPERATION");
+const MEASURE_END_OPERATION = Symbol("MEASURE_END_OPERATION");
+
+/** @typedef {typeof MEASURE_START_OPERATION} MEASURE_START_OPERATION_TYPE */
+/** @typedef {typeof MEASURE_END_OPERATION} MEASURE_END_OPERATION_TYPE */
+
+/**
+ * @param {number} n number
+ * @returns {0 | 1 | 2} type of number for serialization
+ */
+const identifyNumber = n => {
+	if (n === (n | 0)) {
+		if (n <= 127 && n >= -128) return 0;
+		if (n <= 2147483647 && n >= -2147483648) return 1;
+	}
+	return 2;
+};
+
+/**
+ * @param {bigint} n bigint
+ * @returns {0 | 1 | 2} type of bigint for serialization
+ */
+const identifyBigInt = n => {
+	if (n <= BigInt(127) && n >= BigInt(-128)) return 0;
+	if (n <= BigInt(2147483647) && n >= BigInt(-2147483648)) return 1;
+	return 2;
+};
+
+/** @typedef {PrimitiveSerializableType[]} DeserializedType */
+/** @typedef {BufferSerializableType[]} SerializedType} */
+/** @typedef {{ retainedBuffer?: (x: Buffer) => Buffer }} Context} */
+
+/**
+ * @template LazyInputValue
+ * @template LazyOutputValue
+ * @typedef {import("./SerializerMiddleware").LazyFunction} LazyFunction
+ */
+
+/**
+ * @extends {SerializerMiddleware}
+ */
+class BinaryMiddleware extends SerializerMiddleware {
+	/**
+	 * @param {DeserializedType} data data
+	 * @param {Context} context context object
+	 * @returns {SerializedType | Promise | null} serialized data
+	 */
+	serialize(data, context) {
+		return this._serialize(data, context);
+	}
+
+	/**
+	 * @param {LazyFunction} fn lazy function
+	 * @param {Context} context serialize function
+	 * @returns {LazyFunction} new lazy
+	 */
+	_serializeLazy(fn, context) {
+		return SerializerMiddleware.serializeLazy(fn, data =>
+			this._serialize(data, context)
+		);
+	}
+
+	/**
+	 * @param {DeserializedType} data data
+	 * @param {Context} context context object
+	 * @param {{ leftOverBuffer: Buffer | null, allocationSize: number, increaseCounter: number }} allocationScope allocation scope
+	 * @returns {SerializedType} serialized data
+	 */
+	_serialize(
+		data,
+		context,
+		allocationScope = {
+			allocationSize: 1024,
+			increaseCounter: 0,
+			leftOverBuffer: null
+		}
+	) {
+		/** @type {Buffer | null} */
+		let leftOverBuffer = null;
+		/** @type {BufferSerializableType[]} */
+		let buffers = [];
+		/** @type {Buffer | null} */
+		let currentBuffer = allocationScope ? allocationScope.leftOverBuffer : null;
+		allocationScope.leftOverBuffer = null;
+		let currentPosition = 0;
+		if (currentBuffer === null) {
+			currentBuffer = Buffer.allocUnsafe(allocationScope.allocationSize);
+		}
+		/**
+		 * @param {number} bytesNeeded bytes needed
+		 */
+		const allocate = bytesNeeded => {
+			if (currentBuffer !== null) {
+				if (currentBuffer.length - currentPosition >= bytesNeeded) return;
+				flush();
+			}
+			if (leftOverBuffer && leftOverBuffer.length >= bytesNeeded) {
+				currentBuffer = leftOverBuffer;
+				leftOverBuffer = null;
+			} else {
+				currentBuffer = Buffer.allocUnsafe(
+					Math.max(bytesNeeded, allocationScope.allocationSize)
+				);
+				if (
+					!(allocationScope.increaseCounter =
+						(allocationScope.increaseCounter + 1) % 4) &&
+					allocationScope.allocationSize < 16777216
+				) {
+					allocationScope.allocationSize = allocationScope.allocationSize << 1;
+				}
+			}
+		};
+		const flush = () => {
+			if (currentBuffer !== null) {
+				if (currentPosition > 0) {
+					buffers.push(
+						Buffer.from(
+							currentBuffer.buffer,
+							currentBuffer.byteOffset,
+							currentPosition
+						)
+					);
+				}
+				if (
+					!leftOverBuffer ||
+					leftOverBuffer.length < currentBuffer.length - currentPosition
+				) {
+					leftOverBuffer = Buffer.from(
+						currentBuffer.buffer,
+						currentBuffer.byteOffset + currentPosition,
+						currentBuffer.byteLength - currentPosition
+					);
+				}
+
+				currentBuffer = null;
+				currentPosition = 0;
+			}
+		};
+		/**
+		 * @param {number} byte byte
+		 */
+		const writeU8 = byte => {
+			/** @type {Buffer} */
+			(currentBuffer).writeUInt8(byte, currentPosition++);
+		};
+		/**
+		 * @param {number} ui32 ui32
+		 */
+		const writeU32 = ui32 => {
+			/** @type {Buffer} */
+			(currentBuffer).writeUInt32LE(ui32, currentPosition);
+			currentPosition += 4;
+		};
+		/** @type {number[]} */
+		const measureStack = [];
+		const measureStart = () => {
+			measureStack.push(buffers.length, currentPosition);
+		};
+		/**
+		 * @returns {number} size
+		 */
+		const measureEnd = () => {
+			const oldPos = /** @type {number} */ (measureStack.pop());
+			const buffersIndex = /** @type {number} */ (measureStack.pop());
+			let size = currentPosition - oldPos;
+			for (let i = buffersIndex; i < buffers.length; i++) {
+				size += buffers[i].length;
+			}
+			return size;
+		};
+		for (let i = 0; i < data.length; i++) {
+			const thing = data[i];
+			switch (typeof thing) {
+				case "function": {
+					if (!SerializerMiddleware.isLazy(thing))
+						throw new Error(`Unexpected function ${thing}`);
+					/** @type {SerializedType | LazyFunction | undefined} */
+					let serializedData =
+						SerializerMiddleware.getLazySerializedValue(thing);
+					if (serializedData === undefined) {
+						if (SerializerMiddleware.isLazy(thing, this)) {
+							flush();
+							allocationScope.leftOverBuffer = leftOverBuffer;
+							const result =
+								/** @type {PrimitiveSerializableType[]} */
+								(thing());
+							const data = this._serialize(result, context, allocationScope);
+							leftOverBuffer = allocationScope.leftOverBuffer;
+							allocationScope.leftOverBuffer = null;
+							SerializerMiddleware.setLazySerializedValue(thing, data);
+							serializedData = data;
+						} else {
+							serializedData = this._serializeLazy(thing, context);
+							flush();
+							buffers.push(serializedData);
+							break;
+						}
+					} else if (typeof serializedData === "function") {
+						flush();
+						buffers.push(serializedData);
+						break;
+					}
+					/** @type {number[]} */
+					const lengths = [];
+					for (const item of serializedData) {
+						let last;
+						if (typeof item === "function") {
+							lengths.push(0);
+						} else if (item.length === 0) {
+							// ignore
+						} else if (
+							lengths.length > 0 &&
+							(last = lengths[lengths.length - 1]) !== 0
+						) {
+							const remaining = 0xffffffff - last;
+							if (remaining >= item.length) {
+								lengths[lengths.length - 1] += item.length;
+							} else {
+								lengths.push(item.length - remaining);
+								lengths[lengths.length - 2] = 0xffffffff;
+							}
+						} else {
+							lengths.push(item.length);
+						}
+					}
+					allocate(5 + lengths.length * 4);
+					writeU8(LAZY_HEADER);
+					writeU32(lengths.length);
+					for (const l of lengths) {
+						writeU32(l);
+					}
+					flush();
+					for (const item of serializedData) {
+						buffers.push(item);
+					}
+					break;
+				}
+				case "string": {
+					const len = Buffer.byteLength(thing);
+					if (len >= 128 || len !== thing.length) {
+						allocate(len + HEADER_SIZE + I32_SIZE);
+						writeU8(STRING_HEADER);
+						writeU32(len);
+						currentBuffer.write(thing, currentPosition);
+						currentPosition += len;
+					} else if (len >= 70) {
+						allocate(len + HEADER_SIZE);
+						writeU8(SHORT_STRING_HEADER | len);
+
+						currentBuffer.write(thing, currentPosition, "latin1");
+						currentPosition += len;
+					} else {
+						allocate(len + HEADER_SIZE);
+						writeU8(SHORT_STRING_HEADER | len);
+
+						for (let i = 0; i < len; i++) {
+							currentBuffer[currentPosition++] = thing.charCodeAt(i);
+						}
+					}
+					break;
+				}
+				case "bigint": {
+					const type = identifyBigInt(thing);
+					if (type === 0 && thing >= 0 && thing <= BigInt(10)) {
+						// shortcut for very small bigints
+						allocate(HEADER_SIZE + I8_SIZE);
+						writeU8(BIGINT_I8_HEADER);
+						writeU8(Number(thing));
+						break;
+					}
+
+					switch (type) {
+						case 0: {
+							let n = 1;
+							allocate(HEADER_SIZE + I8_SIZE * n);
+							writeU8(BIGINT_I8_HEADER | (n - 1));
+							while (n > 0) {
+								currentBuffer.writeInt8(
+									Number(/** @type {bigint} */ (data[i])),
+									currentPosition
+								);
+								currentPosition += I8_SIZE;
+								n--;
+								i++;
+							}
+							i--;
+							break;
+						}
+						case 1: {
+							let n = 1;
+							allocate(HEADER_SIZE + I32_SIZE * n);
+							writeU8(BIGINT_I32_HEADER | (n - 1));
+							while (n > 0) {
+								currentBuffer.writeInt32LE(
+									Number(/** @type {bigint} */ (data[i])),
+									currentPosition
+								);
+								currentPosition += I32_SIZE;
+								n--;
+								i++;
+							}
+							i--;
+							break;
+						}
+						default: {
+							const value = thing.toString();
+							const len = Buffer.byteLength(value);
+							allocate(len + HEADER_SIZE + I32_SIZE);
+							writeU8(BIGINT_HEADER);
+							writeU32(len);
+							currentBuffer.write(value, currentPosition);
+							currentPosition += len;
+							break;
+						}
+					}
+					break;
+				}
+				case "number": {
+					const type = identifyNumber(thing);
+					if (type === 0 && thing >= 0 && thing <= 10) {
+						// shortcut for very small numbers
+						allocate(I8_SIZE);
+						writeU8(thing);
+						break;
+					}
+					/**
+					 * amount of numbers to write
+					 * @type {number}
+					 */
+					let n = 1;
+					for (; n < 32 && i + n < data.length; n++) {
+						const item = data[i + n];
+						if (typeof item !== "number") break;
+						if (identifyNumber(item) !== type) break;
+					}
+					switch (type) {
+						case 0:
+							allocate(HEADER_SIZE + I8_SIZE * n);
+							writeU8(I8_HEADER | (n - 1));
+							while (n > 0) {
+								currentBuffer.writeInt8(
+									/** @type {number} */ (data[i]),
+									currentPosition
+								);
+								currentPosition += I8_SIZE;
+								n--;
+								i++;
+							}
+							break;
+						case 1:
+							allocate(HEADER_SIZE + I32_SIZE * n);
+							writeU8(I32_HEADER | (n - 1));
+							while (n > 0) {
+								currentBuffer.writeInt32LE(
+									/** @type {number} */ (data[i]),
+									currentPosition
+								);
+								currentPosition += I32_SIZE;
+								n--;
+								i++;
+							}
+							break;
+						case 2:
+							allocate(HEADER_SIZE + F64_SIZE * n);
+							writeU8(F64_HEADER | (n - 1));
+							while (n > 0) {
+								currentBuffer.writeDoubleLE(
+									/** @type {number} */ (data[i]),
+									currentPosition
+								);
+								currentPosition += F64_SIZE;
+								n--;
+								i++;
+							}
+							break;
+					}
+
+					i--;
+					break;
+				}
+				case "boolean": {
+					let lastByte = thing === true ? 1 : 0;
+					const bytes = [];
+					let count = 1;
+					let n;
+					for (n = 1; n < 0xffffffff && i + n < data.length; n++) {
+						const item = data[i + n];
+						if (typeof item !== "boolean") break;
+						const pos = count & 0x7;
+						if (pos === 0) {
+							bytes.push(lastByte);
+							lastByte = item === true ? 1 : 0;
+						} else if (item === true) {
+							lastByte |= 1 << pos;
+						}
+						count++;
+					}
+					i += count - 1;
+					if (count === 1) {
+						allocate(HEADER_SIZE);
+						writeU8(lastByte === 1 ? TRUE_HEADER : FALSE_HEADER);
+					} else if (count === 2) {
+						allocate(HEADER_SIZE * 2);
+						writeU8(lastByte & 1 ? TRUE_HEADER : FALSE_HEADER);
+						writeU8(lastByte & 2 ? TRUE_HEADER : FALSE_HEADER);
+					} else if (count <= 6) {
+						allocate(HEADER_SIZE + I8_SIZE);
+						writeU8(BOOLEANS_HEADER);
+						writeU8((1 << count) | lastByte);
+					} else if (count <= 133) {
+						allocate(HEADER_SIZE + I8_SIZE + I8_SIZE * bytes.length + I8_SIZE);
+						writeU8(BOOLEANS_HEADER);
+						writeU8(0x80 | (count - 7));
+						for (const byte of bytes) writeU8(byte);
+						writeU8(lastByte);
+					} else {
+						allocate(
+							HEADER_SIZE +
+								I8_SIZE +
+								I32_SIZE +
+								I8_SIZE * bytes.length +
+								I8_SIZE
+						);
+						writeU8(BOOLEANS_HEADER);
+						writeU8(0xff);
+						writeU32(count);
+						for (const byte of bytes) writeU8(byte);
+						writeU8(lastByte);
+					}
+					break;
+				}
+				case "object": {
+					if (thing === null) {
+						let n;
+						for (n = 1; n < 0x100000104 && i + n < data.length; n++) {
+							const item = data[i + n];
+							if (item !== null) break;
+						}
+						i += n - 1;
+						if (n === 1) {
+							if (i + 1 < data.length) {
+								const next = data[i + 1];
+								if (next === true) {
+									allocate(HEADER_SIZE);
+									writeU8(NULL_AND_TRUE_HEADER);
+									i++;
+								} else if (next === false) {
+									allocate(HEADER_SIZE);
+									writeU8(NULL_AND_FALSE_HEADER);
+									i++;
+								} else if (typeof next === "number") {
+									const type = identifyNumber(next);
+									if (type === 0) {
+										allocate(HEADER_SIZE + I8_SIZE);
+										writeU8(NULL_AND_I8_HEADER);
+										currentBuffer.writeInt8(next, currentPosition);
+										currentPosition += I8_SIZE;
+										i++;
+									} else if (type === 1) {
+										allocate(HEADER_SIZE + I32_SIZE);
+										writeU8(NULL_AND_I32_HEADER);
+										currentBuffer.writeInt32LE(next, currentPosition);
+										currentPosition += I32_SIZE;
+										i++;
+									} else {
+										allocate(HEADER_SIZE);
+										writeU8(NULL_HEADER);
+									}
+								} else {
+									allocate(HEADER_SIZE);
+									writeU8(NULL_HEADER);
+								}
+							} else {
+								allocate(HEADER_SIZE);
+								writeU8(NULL_HEADER);
+							}
+						} else if (n === 2) {
+							allocate(HEADER_SIZE);
+							writeU8(NULL2_HEADER);
+						} else if (n === 3) {
+							allocate(HEADER_SIZE);
+							writeU8(NULL3_HEADER);
+						} else if (n < 260) {
+							allocate(HEADER_SIZE + I8_SIZE);
+							writeU8(NULLS8_HEADER);
+							writeU8(n - 4);
+						} else {
+							allocate(HEADER_SIZE + I32_SIZE);
+							writeU8(NULLS32_HEADER);
+							writeU32(n - 260);
+						}
+					} else if (Buffer.isBuffer(thing)) {
+						if (thing.length < 8192) {
+							allocate(HEADER_SIZE + I32_SIZE + thing.length);
+							writeU8(BUFFER_HEADER);
+							writeU32(thing.length);
+							thing.copy(currentBuffer, currentPosition);
+							currentPosition += thing.length;
+						} else {
+							allocate(HEADER_SIZE + I32_SIZE);
+							writeU8(BUFFER_HEADER);
+							writeU32(thing.length);
+							flush();
+							buffers.push(thing);
+						}
+					}
+					break;
+				}
+				case "symbol": {
+					if (thing === MEASURE_START_OPERATION) {
+						measureStart();
+					} else if (thing === MEASURE_END_OPERATION) {
+						const size = measureEnd();
+						allocate(HEADER_SIZE + I32_SIZE);
+						writeU8(I32_HEADER);
+						currentBuffer.writeInt32LE(size, currentPosition);
+						currentPosition += I32_SIZE;
+					}
+					break;
+				}
+				default: {
+					throw new Error(
+						`Unknown typeof "${typeof thing}" in binary middleware`
+					);
+				}
+			}
+		}
+		flush();
+
+		allocationScope.leftOverBuffer = leftOverBuffer;
+
+		// avoid leaking memory
+		currentBuffer = null;
+		leftOverBuffer = null;
+		allocationScope = /** @type {EXPECTED_ANY} */ (undefined);
+		const _buffers = buffers;
+		buffers = /** @type {EXPECTED_ANY} */ (undefined);
+		return _buffers;
+	}
+
+	/**
+	 * @param {SerializedType} data data
+	 * @param {Context} context context object
+	 * @returns {DeserializedType | Promise} deserialized data
+	 */
+	deserialize(data, context) {
+		return this._deserialize(data, context);
+	}
+
+	/**
+	 * @private
+	 * @param {SerializedType} content content
+	 * @param {Context} context context object
+	 * @returns {LazyFunction} lazy function
+	 */
+	_createLazyDeserialized(content, context) {
+		return SerializerMiddleware.createLazy(
+			memoize(() => this._deserialize(content, context)),
+			this,
+			undefined,
+			content
+		);
+	}
+
+	/**
+	 * @private
+	 * @param {LazyFunction} fn lazy function
+	 * @param {Context} context context object
+	 * @returns {LazyFunction} new lazy
+	 */
+	_deserializeLazy(fn, context) {
+		return SerializerMiddleware.deserializeLazy(fn, data =>
+			this._deserialize(data, context)
+		);
+	}
+
+	/**
+	 * @param {SerializedType} data data
+	 * @param {Context} context context object
+	 * @returns {DeserializedType} deserialized data
+	 */
+	_deserialize(data, context) {
+		let currentDataItem = 0;
+		/** @type {BufferSerializableType | null} */
+		let currentBuffer = data[0];
+		let currentIsBuffer = Buffer.isBuffer(currentBuffer);
+		let currentPosition = 0;
+
+		const retainedBuffer = context.retainedBuffer || (x => x);
+
+		const checkOverflow = () => {
+			if (currentPosition >= /** @type {Buffer} */ (currentBuffer).length) {
+				currentPosition = 0;
+				currentDataItem++;
+				currentBuffer =
+					currentDataItem < data.length ? data[currentDataItem] : null;
+				currentIsBuffer = Buffer.isBuffer(currentBuffer);
+			}
+		};
+		/**
+		 * @param {number} n n
+		 * @returns {boolean} true when in current buffer, otherwise false
+		 */
+		const isInCurrentBuffer = n =>
+			currentIsBuffer &&
+			n + currentPosition <= /** @type {Buffer} */ (currentBuffer).length;
+		const ensureBuffer = () => {
+			if (!currentIsBuffer) {
+				throw new Error(
+					currentBuffer === null
+						? "Unexpected end of stream"
+						: "Unexpected lazy element in stream"
+				);
+			}
+		};
+		/**
+		 * Reads n bytes
+		 * @param {number} n amount of bytes to read
+		 * @returns {Buffer} buffer with bytes
+		 */
+		const read = n => {
+			ensureBuffer();
+			const rem =
+				/** @type {Buffer} */ (currentBuffer).length - currentPosition;
+			if (rem < n) {
+				const buffers = [read(rem)];
+				n -= rem;
+				ensureBuffer();
+				while (/** @type {Buffer} */ (currentBuffer).length < n) {
+					const b = /** @type {Buffer} */ (currentBuffer);
+					buffers.push(b);
+					n -= b.length;
+					currentDataItem++;
+					currentBuffer =
+						currentDataItem < data.length ? data[currentDataItem] : null;
+					currentIsBuffer = Buffer.isBuffer(currentBuffer);
+					ensureBuffer();
+				}
+				buffers.push(read(n));
+				return Buffer.concat(buffers);
+			}
+			const b = /** @type {Buffer} */ (currentBuffer);
+			const res = Buffer.from(b.buffer, b.byteOffset + currentPosition, n);
+			currentPosition += n;
+			checkOverflow();
+			return res;
+		};
+		/**
+		 * Reads up to n bytes
+		 * @param {number} n amount of bytes to read
+		 * @returns {Buffer} buffer with bytes
+		 */
+		const readUpTo = n => {
+			ensureBuffer();
+			const rem =
+				/** @type {Buffer} */
+				(currentBuffer).length - currentPosition;
+			if (rem < n) {
+				n = rem;
+			}
+			const b = /** @type {Buffer} */ (currentBuffer);
+			const res = Buffer.from(b.buffer, b.byteOffset + currentPosition, n);
+			currentPosition += n;
+			checkOverflow();
+			return res;
+		};
+		/**
+		 * @returns {number} U8
+		 */
+		const readU8 = () => {
+			ensureBuffer();
+			/**
+			 * There is no need to check remaining buffer size here
+			 * since {@link checkOverflow} guarantees at least one byte remaining
+			 */
+			const byte =
+				/** @type {Buffer} */
+				(currentBuffer).readUInt8(currentPosition);
+			currentPosition += I8_SIZE;
+			checkOverflow();
+			return byte;
+		};
+		/**
+		 * @returns {number} U32
+		 */
+		const readU32 = () => read(I32_SIZE).readUInt32LE(0);
+		/**
+		 * @param {number} data data
+		 * @param {number} n n
+		 */
+		const readBits = (data, n) => {
+			let mask = 1;
+			while (n !== 0) {
+				result.push((data & mask) !== 0);
+				mask = mask << 1;
+				n--;
+			}
+		};
+		const dispatchTable = Array.from({ length: 256 }).map((_, header) => {
+			switch (header) {
+				case LAZY_HEADER:
+					return () => {
+						const count = readU32();
+						const lengths = Array.from({ length: count }).map(() => readU32());
+						/** @type {(Buffer | LazyFunction)[]} */
+						const content = [];
+						for (let l of lengths) {
+							if (l === 0) {
+								if (typeof currentBuffer !== "function") {
+									throw new Error("Unexpected non-lazy element in stream");
+								}
+								content.push(currentBuffer);
+								currentDataItem++;
+								currentBuffer =
+									currentDataItem < data.length ? data[currentDataItem] : null;
+								currentIsBuffer = Buffer.isBuffer(currentBuffer);
+							} else {
+								do {
+									const buf = readUpTo(l);
+									l -= buf.length;
+									content.push(retainedBuffer(buf));
+								} while (l > 0);
+							}
+						}
+						result.push(this._createLazyDeserialized(content, context));
+					};
+				case BUFFER_HEADER:
+					return () => {
+						const len = readU32();
+						result.push(retainedBuffer(read(len)));
+					};
+				case TRUE_HEADER:
+					return () => result.push(true);
+				case FALSE_HEADER:
+					return () => result.push(false);
+				case NULL3_HEADER:
+					return () => result.push(null, null, null);
+				case NULL2_HEADER:
+					return () => result.push(null, null);
+				case NULL_HEADER:
+					return () => result.push(null);
+				case NULL_AND_TRUE_HEADER:
+					return () => result.push(null, true);
+				case NULL_AND_FALSE_HEADER:
+					return () => result.push(null, false);
+				case NULL_AND_I8_HEADER:
+					return () => {
+						if (currentIsBuffer) {
+							result.push(
+								null,
+								/** @type {Buffer} */ (currentBuffer).readInt8(currentPosition)
+							);
+							currentPosition += I8_SIZE;
+							checkOverflow();
+						} else {
+							result.push(null, read(I8_SIZE).readInt8(0));
+						}
+					};
+				case NULL_AND_I32_HEADER:
+					return () => {
+						result.push(null);
+						if (isInCurrentBuffer(I32_SIZE)) {
+							result.push(
+								/** @type {Buffer} */ (currentBuffer).readInt32LE(
+									currentPosition
+								)
+							);
+							currentPosition += I32_SIZE;
+							checkOverflow();
+						} else {
+							result.push(read(I32_SIZE).readInt32LE(0));
+						}
+					};
+				case NULLS8_HEADER:
+					return () => {
+						const len = readU8() + 4;
+						for (let i = 0; i < len; i++) {
+							result.push(null);
+						}
+					};
+				case NULLS32_HEADER:
+					return () => {
+						const len = readU32() + 260;
+						for (let i = 0; i < len; i++) {
+							result.push(null);
+						}
+					};
+				case BOOLEANS_HEADER:
+					return () => {
+						const innerHeader = readU8();
+						if ((innerHeader & 0xf0) === 0) {
+							readBits(innerHeader, 3);
+						} else if ((innerHeader & 0xe0) === 0) {
+							readBits(innerHeader, 4);
+						} else if ((innerHeader & 0xc0) === 0) {
+							readBits(innerHeader, 5);
+						} else if ((innerHeader & 0x80) === 0) {
+							readBits(innerHeader, 6);
+						} else if (innerHeader !== 0xff) {
+							let count = (innerHeader & 0x7f) + 7;
+							while (count > 8) {
+								readBits(readU8(), 8);
+								count -= 8;
+							}
+							readBits(readU8(), count);
+						} else {
+							let count = readU32();
+							while (count > 8) {
+								readBits(readU8(), 8);
+								count -= 8;
+							}
+							readBits(readU8(), count);
+						}
+					};
+				case STRING_HEADER:
+					return () => {
+						const len = readU32();
+						if (isInCurrentBuffer(len) && currentPosition + len < 0x7fffffff) {
+							result.push(
+								/** @type {Buffer} */
+								(currentBuffer).toString(
+									undefined,
+									currentPosition,
+									currentPosition + len
+								)
+							);
+							currentPosition += len;
+							checkOverflow();
+						} else {
+							result.push(read(len).toString());
+						}
+					};
+				case SHORT_STRING_HEADER:
+					return () => result.push("");
+				case SHORT_STRING_HEADER | 1:
+					return () => {
+						if (currentIsBuffer && currentPosition < 0x7ffffffe) {
+							result.push(
+								/** @type {Buffer} */
+								(currentBuffer).toString(
+									"latin1",
+									currentPosition,
+									currentPosition + 1
+								)
+							);
+							currentPosition++;
+							checkOverflow();
+						} else {
+							result.push(read(1).toString("latin1"));
+						}
+					};
+				case I8_HEADER:
+					return () => {
+						if (currentIsBuffer) {
+							result.push(
+								/** @type {Buffer} */ (currentBuffer).readInt8(currentPosition)
+							);
+							currentPosition++;
+							checkOverflow();
+						} else {
+							result.push(read(1).readInt8(0));
+						}
+					};
+				case BIGINT_I8_HEADER: {
+					const len = 1;
+					return () => {
+						const need = I8_SIZE * len;
+
+						if (isInCurrentBuffer(need)) {
+							for (let i = 0; i < len; i++) {
+								const value =
+									/** @type {Buffer} */
+									(currentBuffer).readInt8(currentPosition);
+								result.push(BigInt(value));
+								currentPosition += I8_SIZE;
+							}
+							checkOverflow();
+						} else {
+							const buf = read(need);
+							for (let i = 0; i < len; i++) {
+								const value = buf.readInt8(i * I8_SIZE);
+								result.push(BigInt(value));
+							}
+						}
+					};
+				}
+				case BIGINT_I32_HEADER: {
+					const len = 1;
+					return () => {
+						const need = I32_SIZE * len;
+						if (isInCurrentBuffer(need)) {
+							for (let i = 0; i < len; i++) {
+								const value = /** @type {Buffer} */ (currentBuffer).readInt32LE(
+									currentPosition
+								);
+								result.push(BigInt(value));
+								currentPosition += I32_SIZE;
+							}
+							checkOverflow();
+						} else {
+							const buf = read(need);
+							for (let i = 0; i < len; i++) {
+								const value = buf.readInt32LE(i * I32_SIZE);
+								result.push(BigInt(value));
+							}
+						}
+					};
+				}
+				case BIGINT_HEADER: {
+					return () => {
+						const len = readU32();
+						if (isInCurrentBuffer(len) && currentPosition + len < 0x7fffffff) {
+							const value =
+								/** @type {Buffer} */
+								(currentBuffer).toString(
+									undefined,
+									currentPosition,
+									currentPosition + len
+								);
+
+							result.push(BigInt(value));
+							currentPosition += len;
+							checkOverflow();
+						} else {
+							const value = read(len).toString();
+							result.push(BigInt(value));
+						}
+					};
+				}
+				default:
+					if (header <= 10) {
+						return () => result.push(header);
+					} else if ((header & SHORT_STRING_HEADER) === SHORT_STRING_HEADER) {
+						const len = header & SHORT_STRING_LENGTH_MASK;
+						return () => {
+							if (
+								isInCurrentBuffer(len) &&
+								currentPosition + len < 0x7fffffff
+							) {
+								result.push(
+									/** @type {Buffer} */
+									(currentBuffer).toString(
+										"latin1",
+										currentPosition,
+										currentPosition + len
+									)
+								);
+								currentPosition += len;
+								checkOverflow();
+							} else {
+								result.push(read(len).toString("latin1"));
+							}
+						};
+					} else if ((header & NUMBERS_HEADER_MASK) === F64_HEADER) {
+						const len = (header & NUMBERS_COUNT_MASK) + 1;
+						return () => {
+							const need = F64_SIZE * len;
+							if (isInCurrentBuffer(need)) {
+								for (let i = 0; i < len; i++) {
+									result.push(
+										/** @type {Buffer} */ (currentBuffer).readDoubleLE(
+											currentPosition
+										)
+									);
+									currentPosition += F64_SIZE;
+								}
+								checkOverflow();
+							} else {
+								const buf = read(need);
+								for (let i = 0; i < len; i++) {
+									result.push(buf.readDoubleLE(i * F64_SIZE));
+								}
+							}
+						};
+					} else if ((header & NUMBERS_HEADER_MASK) === I32_HEADER) {
+						const len = (header & NUMBERS_COUNT_MASK) + 1;
+						return () => {
+							const need = I32_SIZE * len;
+							if (isInCurrentBuffer(need)) {
+								for (let i = 0; i < len; i++) {
+									result.push(
+										/** @type {Buffer} */ (currentBuffer).readInt32LE(
+											currentPosition
+										)
+									);
+									currentPosition += I32_SIZE;
+								}
+								checkOverflow();
+							} else {
+								const buf = read(need);
+								for (let i = 0; i < len; i++) {
+									result.push(buf.readInt32LE(i * I32_SIZE));
+								}
+							}
+						};
+					} else if ((header & NUMBERS_HEADER_MASK) === I8_HEADER) {
+						const len = (header & NUMBERS_COUNT_MASK) + 1;
+						return () => {
+							const need = I8_SIZE * len;
+							if (isInCurrentBuffer(need)) {
+								for (let i = 0; i < len; i++) {
+									result.push(
+										/** @type {Buffer} */ (currentBuffer).readInt8(
+											currentPosition
+										)
+									);
+									currentPosition += I8_SIZE;
+								}
+								checkOverflow();
+							} else {
+								const buf = read(need);
+								for (let i = 0; i < len; i++) {
+									result.push(buf.readInt8(i * I8_SIZE));
+								}
+							}
+						};
+					}
+					return () => {
+						throw new Error(`Unexpected header byte 0x${header.toString(16)}`);
+					};
+			}
+		});
+
+		/** @type {DeserializedType} */
+		let result = [];
+		while (currentBuffer !== null) {
+			if (typeof currentBuffer === "function") {
+				result.push(this._deserializeLazy(currentBuffer, context));
+				currentDataItem++;
+				currentBuffer =
+					currentDataItem < data.length ? data[currentDataItem] : null;
+				currentIsBuffer = Buffer.isBuffer(currentBuffer);
+			} else {
+				const header = readU8();
+				dispatchTable[header]();
+			}
+		}
+
+		// avoid leaking memory in context
+		// eslint-disable-next-line prefer-const
+		let _result = result;
+		result = /** @type {EXPECTED_ANY} */ (undefined);
+		return _result;
+	}
+}
+
+module.exports = BinaryMiddleware;
+
+module.exports.MEASURE_START_OPERATION = MEASURE_START_OPERATION;
+module.exports.MEASURE_END_OPERATION = MEASURE_END_OPERATION;
diff --git a/lib/serialization/DateObjectSerializer.js b/lib/serialization/DateObjectSerializer.js
new file mode 100644
index 00000000000..c69ccfe8c7c
--- /dev/null
+++ b/lib/serialization/DateObjectSerializer.js
@@ -0,0 +1,28 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+/** @typedef {import("./ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
+class DateObjectSerializer {
+	/**
+	 * @param {Date} obj date
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(obj, context) {
+		context.write(obj.getTime());
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 * @returns {Date} date
+	 */
+	deserialize(context) {
+		return new Date(context.read());
+	}
+}
+
+module.exports = DateObjectSerializer;
diff --git a/lib/serialization/ErrorObjectSerializer.js b/lib/serialization/ErrorObjectSerializer.js
new file mode 100644
index 00000000000..caf6192974e
--- /dev/null
+++ b/lib/serialization/ErrorObjectSerializer.js
@@ -0,0 +1,49 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+/** @typedef {import("./ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
+/** @typedef {Error & { cause?: unknown }} ErrorWithCause */
+
+class ErrorObjectSerializer {
+	/**
+	 * @param {ErrorConstructor | EvalErrorConstructor | RangeErrorConstructor | ReferenceErrorConstructor | SyntaxErrorConstructor | TypeErrorConstructor} Type error type
+	 */
+	constructor(Type) {
+		this.Type = Type;
+	}
+
+	/**
+	 * @param {Error | EvalError | RangeError | ReferenceError | SyntaxError | TypeError} obj error
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(obj, context) {
+		context.write(obj.message);
+		context.write(obj.stack);
+		context.write(
+			/** @type {ErrorWithCause} */
+			(obj).cause
+		);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 * @returns {Error | EvalError | RangeError | ReferenceError | SyntaxError | TypeError} error
+	 */
+	deserialize(context) {
+		const err = new this.Type();
+
+		err.message = context.read();
+		err.stack = context.read();
+		/** @type {ErrorWithCause} */
+		(err).cause = context.read();
+
+		return err;
+	}
+}
+
+module.exports = ErrorObjectSerializer;
diff --git a/lib/serialization/FileMiddleware.js b/lib/serialization/FileMiddleware.js
new file mode 100644
index 00000000000..375dc61a726
--- /dev/null
+++ b/lib/serialization/FileMiddleware.js
@@ -0,0 +1,757 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const { constants } = require("buffer");
+const { pipeline } = require("stream");
+const {
+	createBrotliCompress,
+	createBrotliDecompress,
+	createGzip,
+	createGunzip,
+	constants: zConstants
+} = require("zlib");
+const { DEFAULTS } = require("../config/defaults");
+const createHash = require("../util/createHash");
+const { dirname, join, mkdirp } = require("../util/fs");
+const memoize = require("../util/memoize");
+const SerializerMiddleware = require("./SerializerMiddleware");
+
+/** @typedef {typeof import("../util/Hash")} Hash */
+/** @typedef {import("../util/fs").IStats} IStats */
+/** @typedef {import("../util/fs").IntermediateFileSystem} IntermediateFileSystem */
+/** @typedef {import("./types").BufferSerializableType} BufferSerializableType */
+
+/*
+Format:
+
+File -> Header Section*
+
+Version -> u32
+AmountOfSections -> u32
+SectionSize -> i32 (if less than zero represents lazy value)
+
+Header -> Version AmountOfSections SectionSize*
+
+Buffer -> n bytes
+Section -> Buffer
+
+*/
+
+// "wpc" + 1 in little-endian
+const VERSION = 0x01637077;
+const WRITE_LIMIT_TOTAL = 0x7fff0000;
+const WRITE_LIMIT_CHUNK = 511 * 1024 * 1024;
+
+/**
+ * @param {Buffer[]} buffers buffers
+ * @param {string | Hash} hashFunction hash function to use
+ * @returns {string} hash
+ */
+const hashForName = (buffers, hashFunction) => {
+	const hash = createHash(hashFunction);
+	for (const buf of buffers) hash.update(buf);
+	return /** @type {string} */ (hash.digest("hex"));
+};
+
+const COMPRESSION_CHUNK_SIZE = 100 * 1024 * 1024;
+const DECOMPRESSION_CHUNK_SIZE = 100 * 1024 * 1024;
+
+/** @type {(buffer: Buffer, value: number, offset: number) => void} */
+const writeUInt64LE = Buffer.prototype.writeBigUInt64LE
+	? (buf, value, offset) => {
+			buf.writeBigUInt64LE(BigInt(value), offset);
+		}
+	: (buf, value, offset) => {
+			const low = value % 0x100000000;
+			const high = (value - low) / 0x100000000;
+			buf.writeUInt32LE(low, offset);
+			buf.writeUInt32LE(high, offset + 4);
+		};
+
+/** @type {(buffer: Buffer, offset: number) => void} */
+const readUInt64LE = Buffer.prototype.readBigUInt64LE
+	? (buf, offset) => Number(buf.readBigUInt64LE(offset))
+	: (buf, offset) => {
+			const low = buf.readUInt32LE(offset);
+			const high = buf.readUInt32LE(offset + 4);
+			return high * 0x100000000 + low;
+		};
+
+/** @typedef {Promise} BackgroundJob */
+
+/**
+ * @typedef {object} SerializeResult
+ * @property {string | false} name
+ * @property {number} size
+ * @property {BackgroundJob=} backgroundJob
+ */
+
+/** @typedef {{ name: string, size: number }} LazyOptions */
+/**
+ * @typedef {import("./SerializerMiddleware").LazyFunction} LazyFunction
+ */
+
+/**
+ * @param {FileMiddleware} middleware this
+ * @param {(BufferSerializableType | LazyFunction)[]} data data to be serialized
+ * @param {string | boolean} name file base name
+ * @param {(name: string | false, buffers: Buffer[], size: number) => Promise} writeFile writes a file
+ * @param {string | Hash} hashFunction hash function to use
+ * @returns {Promise} resulting file pointer and promise
+ */
+const serialize = async (
+	middleware,
+	data,
+	name,
+	writeFile,
+	hashFunction = DEFAULTS.HASH_FUNCTION
+) => {
+	/** @type {(Buffer[] | Buffer | Promise)[]} */
+	const processedData = [];
+	/** @type {WeakMap} */
+	const resultToLazy = new WeakMap();
+	/** @type {Buffer[] | undefined} */
+	let lastBuffers;
+	for (const item of await data) {
+		if (typeof item === "function") {
+			if (!SerializerMiddleware.isLazy(item))
+				throw new Error("Unexpected function");
+			if (!SerializerMiddleware.isLazy(item, middleware)) {
+				throw new Error(
+					"Unexpected lazy value with non-this target (can't pass through lazy values)"
+				);
+			}
+			lastBuffers = undefined;
+			const serializedInfo = SerializerMiddleware.getLazySerializedValue(item);
+			if (serializedInfo) {
+				if (typeof serializedInfo === "function") {
+					throw new Error(
+						"Unexpected lazy value with non-this target (can't pass through lazy values)"
+					);
+				} else {
+					processedData.push(serializedInfo);
+				}
+			} else {
+				const content = item();
+				if (content) {
+					const options = SerializerMiddleware.getLazyOptions(item);
+					processedData.push(
+						serialize(
+							middleware,
+							/** @type {BufferSerializableType[]} */
+							(content),
+							(options && options.name) || true,
+							writeFile,
+							hashFunction
+						).then(result => {
+							/** @type {LazyOptions} */
+							(item.options).size = result.size;
+							resultToLazy.set(result, item);
+							return result;
+						})
+					);
+				} else {
+					throw new Error(
+						"Unexpected falsy value returned by lazy value function"
+					);
+				}
+			}
+		} else if (item) {
+			if (lastBuffers) {
+				lastBuffers.push(item);
+			} else {
+				lastBuffers = [item];
+				processedData.push(lastBuffers);
+			}
+		} else {
+			throw new Error("Unexpected falsy value in items array");
+		}
+	}
+	/** @type {BackgroundJob[]} */
+	const backgroundJobs = [];
+	const resolvedData = (await Promise.all(processedData)).map(item => {
+		if (Array.isArray(item) || Buffer.isBuffer(item)) return item;
+
+		backgroundJobs.push(
+			/** @type {BackgroundJob} */
+			(item.backgroundJob)
+		);
+		// create pointer buffer from size and name
+		const name = /** @type {string} */ (item.name);
+		const nameBuffer = Buffer.from(name);
+		const buf = Buffer.allocUnsafe(8 + nameBuffer.length);
+		writeUInt64LE(buf, item.size, 0);
+		nameBuffer.copy(buf, 8, 0);
+		const lazy =
+			/** @type {LazyFunction} */
+			(resultToLazy.get(item));
+		SerializerMiddleware.setLazySerializedValue(lazy, buf);
+		return buf;
+	});
+	/** @type {number[]} */
+	const lengths = [];
+	for (const item of resolvedData) {
+		if (Array.isArray(item)) {
+			let l = 0;
+			for (const b of item) l += b.length;
+			while (l > 0x7fffffff) {
+				lengths.push(0x7fffffff);
+				l -= 0x7fffffff;
+			}
+			lengths.push(l);
+		} else if (item) {
+			lengths.push(-item.length);
+		} else {
+			throw new Error(`Unexpected falsy value in resolved data ${item}`);
+		}
+	}
+	const header = Buffer.allocUnsafe(8 + lengths.length * 4);
+	header.writeUInt32LE(VERSION, 0);
+	header.writeUInt32LE(lengths.length, 4);
+	for (let i = 0; i < lengths.length; i++) {
+		header.writeInt32LE(lengths[i], 8 + i * 4);
+	}
+	/** @type {Buffer[]} */
+	const buf = [header];
+	for (const item of resolvedData) {
+		if (Array.isArray(item)) {
+			for (const b of item) buf.push(b);
+		} else if (item) {
+			buf.push(item);
+		}
+	}
+	if (name === true) {
+		name = hashForName(buf, hashFunction);
+	}
+	let size = 0;
+	for (const b of buf) size += b.length;
+	backgroundJobs.push(writeFile(name, buf, size));
+	return {
+		size,
+		name,
+		backgroundJob:
+			backgroundJobs.length === 1
+				? backgroundJobs[0]
+				: /** @type {BackgroundJob} */ (Promise.all(backgroundJobs))
+	};
+};
+
+/**
+ * @param {FileMiddleware} middleware this
+ * @param {string | false} name filename
+ * @param {(name: string | false) => Promise} readFile read content of a file
+ * @returns {Promise} deserialized data
+ */
+const deserialize = async (middleware, name, readFile) => {
+	const contents = await readFile(name);
+	if (contents.length === 0) throw new Error(`Empty file ${name}`);
+	let contentsIndex = 0;
+	let contentItem = contents[0];
+	let contentItemLength = contentItem.length;
+	let contentPosition = 0;
+	if (contentItemLength === 0) throw new Error(`Empty file ${name}`);
+	const nextContent = () => {
+		contentsIndex++;
+		contentItem = contents[contentsIndex];
+		contentItemLength = contentItem.length;
+		contentPosition = 0;
+	};
+	/**
+	 * @param {number} n number of bytes to ensure
+	 */
+	const ensureData = n => {
+		if (contentPosition === contentItemLength) {
+			nextContent();
+		}
+		while (contentItemLength - contentPosition < n) {
+			const remaining = contentItem.slice(contentPosition);
+			let lengthFromNext = n - remaining.length;
+			const buffers = [remaining];
+			for (let i = contentsIndex + 1; i < contents.length; i++) {
+				const l = contents[i].length;
+				if (l > lengthFromNext) {
+					buffers.push(contents[i].slice(0, lengthFromNext));
+					contents[i] = contents[i].slice(lengthFromNext);
+					lengthFromNext = 0;
+					break;
+				} else {
+					buffers.push(contents[i]);
+					contentsIndex = i;
+					lengthFromNext -= l;
+				}
+			}
+			if (lengthFromNext > 0) throw new Error("Unexpected end of data");
+			contentItem = Buffer.concat(buffers, n);
+			contentItemLength = n;
+			contentPosition = 0;
+		}
+	};
+	/**
+	 * @returns {number} value value
+	 */
+	const readUInt32LE = () => {
+		ensureData(4);
+		const value = contentItem.readUInt32LE(contentPosition);
+		contentPosition += 4;
+		return value;
+	};
+	/**
+	 * @returns {number} value value
+	 */
+	const readInt32LE = () => {
+		ensureData(4);
+		const value = contentItem.readInt32LE(contentPosition);
+		contentPosition += 4;
+		return value;
+	};
+	/**
+	 * @param {number} l length
+	 * @returns {Buffer} buffer
+	 */
+	const readSlice = l => {
+		ensureData(l);
+		if (contentPosition === 0 && contentItemLength === l) {
+			const result = contentItem;
+			if (contentsIndex + 1 < contents.length) {
+				nextContent();
+			} else {
+				contentPosition = l;
+			}
+			return result;
+		}
+		const result = contentItem.slice(contentPosition, contentPosition + l);
+		contentPosition += l;
+		// we clone the buffer here to allow the original content to be garbage collected
+		return l * 2 < contentItem.buffer.byteLength ? Buffer.from(result) : result;
+	};
+	const version = readUInt32LE();
+	if (version !== VERSION) {
+		throw new Error("Invalid file version");
+	}
+	const sectionCount = readUInt32LE();
+	const lengths = [];
+	let lastLengthPositive = false;
+	for (let i = 0; i < sectionCount; i++) {
+		const value = readInt32LE();
+		const valuePositive = value >= 0;
+		if (lastLengthPositive && valuePositive) {
+			lengths[lengths.length - 1] += value;
+		} else {
+			lengths.push(value);
+			lastLengthPositive = valuePositive;
+		}
+	}
+	/** @type {BufferSerializableType[]} */
+	const result = [];
+	for (let length of lengths) {
+		if (length < 0) {
+			const slice = readSlice(-length);
+			const size = Number(readUInt64LE(slice, 0));
+			const nameBuffer = slice.slice(8);
+			const name = nameBuffer.toString();
+			const lazy =
+				/** @type {LazyFunction} */
+				(
+					SerializerMiddleware.createLazy(
+						memoize(() => deserialize(middleware, name, readFile)),
+						middleware,
+						{ name, size },
+						slice
+					)
+				);
+			result.push(lazy);
+		} else {
+			if (contentPosition === contentItemLength) {
+				nextContent();
+			} else if (contentPosition !== 0) {
+				if (length <= contentItemLength - contentPosition) {
+					result.push(
+						Buffer.from(
+							contentItem.buffer,
+							contentItem.byteOffset + contentPosition,
+							length
+						)
+					);
+					contentPosition += length;
+					length = 0;
+				} else {
+					const l = contentItemLength - contentPosition;
+					result.push(
+						Buffer.from(
+							contentItem.buffer,
+							contentItem.byteOffset + contentPosition,
+							l
+						)
+					);
+					length -= l;
+					contentPosition = contentItemLength;
+				}
+			} else if (length >= contentItemLength) {
+				result.push(contentItem);
+				length -= contentItemLength;
+				contentPosition = contentItemLength;
+			} else {
+				result.push(
+					Buffer.from(contentItem.buffer, contentItem.byteOffset, length)
+				);
+				contentPosition += length;
+				length = 0;
+			}
+			while (length > 0) {
+				nextContent();
+				if (length >= contentItemLength) {
+					result.push(contentItem);
+					length -= contentItemLength;
+					contentPosition = contentItemLength;
+				} else {
+					result.push(
+						Buffer.from(contentItem.buffer, contentItem.byteOffset, length)
+					);
+					contentPosition += length;
+					length = 0;
+				}
+			}
+		}
+	}
+	return result;
+};
+
+/** @typedef {BufferSerializableType[]} DeserializedType */
+/** @typedef {true} SerializedType */
+/** @typedef {{ filename: string, extension?: string }} Context */
+
+/**
+ * @extends {SerializerMiddleware}
+ */
+class FileMiddleware extends SerializerMiddleware {
+	/**
+	 * @param {IntermediateFileSystem} fs filesystem
+	 * @param {string | Hash} hashFunction hash function to use
+	 */
+	constructor(fs, hashFunction = DEFAULTS.HASH_FUNCTION) {
+		super();
+		this.fs = fs;
+		this._hashFunction = hashFunction;
+	}
+
+	/**
+	 * @param {DeserializedType} data data
+	 * @param {Context} context context object
+	 * @returns {SerializedType | Promise | null} serialized data
+	 */
+	serialize(data, context) {
+		const { filename, extension = "" } = context;
+		return new Promise((resolve, reject) => {
+			mkdirp(this.fs, dirname(this.fs, filename), err => {
+				if (err) return reject(err);
+
+				// It's important that we don't touch existing files during serialization
+				// because serialize may read existing files (when deserializing)
+				const allWrittenFiles = new Set();
+				/**
+				 * @param {string | false} name name
+				 * @param {Buffer[]} content content
+				 * @param {number} size size
+				 * @returns {Promise}
+				 */
+				const writeFile = async (name, content, size) => {
+					const file = name
+						? join(this.fs, filename, `../${name}${extension}`)
+						: filename;
+					await new Promise(
+						/**
+						 * @param {(value?: undefined) => void} resolve resolve
+						 * @param {(reason?: Error | null) => void} reject reject
+						 */
+						(resolve, reject) => {
+							let stream = this.fs.createWriteStream(`${file}_`);
+							let compression;
+							if (file.endsWith(".gz")) {
+								compression = createGzip({
+									chunkSize: COMPRESSION_CHUNK_SIZE,
+									level: zConstants.Z_BEST_SPEED
+								});
+							} else if (file.endsWith(".br")) {
+								compression = createBrotliCompress({
+									chunkSize: COMPRESSION_CHUNK_SIZE,
+									params: {
+										[zConstants.BROTLI_PARAM_MODE]: zConstants.BROTLI_MODE_TEXT,
+										[zConstants.BROTLI_PARAM_QUALITY]: 2,
+										[zConstants.BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING]: true,
+										[zConstants.BROTLI_PARAM_SIZE_HINT]: size
+									}
+								});
+							}
+							if (compression) {
+								pipeline(compression, stream, reject);
+								stream = compression;
+								stream.on("finish", () => resolve());
+							} else {
+								stream.on("error", err => reject(err));
+								stream.on("finish", () => resolve());
+							}
+							// split into chunks for WRITE_LIMIT_CHUNK size
+							/** @type {Buffer[]} */
+							const chunks = [];
+							for (const b of content) {
+								if (b.length < WRITE_LIMIT_CHUNK) {
+									chunks.push(b);
+								} else {
+									for (let i = 0; i < b.length; i += WRITE_LIMIT_CHUNK) {
+										chunks.push(b.slice(i, i + WRITE_LIMIT_CHUNK));
+									}
+								}
+							}
+
+							const len = chunks.length;
+							let i = 0;
+							/**
+							 * @param {(Error | null)=} err err
+							 */
+							const batchWrite = err => {
+								// will be handled in "on" error handler
+								if (err) return;
+
+								if (i === len) {
+									stream.end();
+									return;
+								}
+
+								// queue up a batch of chunks up to the write limit
+								// end is exclusive
+								let end = i;
+								let sum = chunks[end++].length;
+								while (end < len) {
+									sum += chunks[end].length;
+									if (sum > WRITE_LIMIT_TOTAL) break;
+									end++;
+								}
+								while (i < end - 1) {
+									stream.write(chunks[i++]);
+								}
+								stream.write(chunks[i++], batchWrite);
+							};
+							batchWrite();
+						}
+					);
+					if (name) allWrittenFiles.add(file);
+				};
+
+				resolve(
+					serialize(this, data, false, writeFile, this._hashFunction).then(
+						async ({ backgroundJob }) => {
+							await backgroundJob;
+
+							// Rename the index file to disallow access during inconsistent file state
+							await new Promise(
+								/**
+								 * @param {(value?: undefined) => void} resolve resolve
+								 */
+								resolve => {
+									this.fs.rename(filename, `${filename}.old`, err => {
+										resolve();
+									});
+								}
+							);
+
+							// update all written files
+							await Promise.all(
+								Array.from(
+									allWrittenFiles,
+									file =>
+										new Promise(
+											/**
+											 * @param {(value?: undefined) => void} resolve resolve
+											 * @param {(reason?: Error | null) => void} reject reject
+											 * @returns {void}
+											 */
+											(resolve, reject) => {
+												this.fs.rename(`${file}_`, file, err => {
+													if (err) return reject(err);
+													resolve();
+												});
+											}
+										)
+								)
+							);
+
+							// As final step automatically update the index file to have a consistent pack again
+							await new Promise(
+								/**
+								 * @param {(value?: undefined) => void} resolve resolve
+								 * @returns {void}
+								 */
+								resolve => {
+									this.fs.rename(`${filename}_`, filename, err => {
+										if (err) return reject(err);
+										resolve();
+									});
+								}
+							);
+							return /** @type {true} */ (true);
+						}
+					)
+				);
+			});
+		});
+	}
+
+	/**
+	 * @param {SerializedType} data data
+	 * @param {Context} context context object
+	 * @returns {DeserializedType | Promise} deserialized data
+	 */
+	deserialize(data, context) {
+		const { filename, extension = "" } = context;
+		/**
+		 * @param {string | boolean} name name
+		 * @returns {Promise} result
+		 */
+		const readFile = name =>
+			new Promise((resolve, reject) => {
+				const file = name
+					? join(this.fs, filename, `../${name}${extension}`)
+					: filename;
+				this.fs.stat(file, (err, stats) => {
+					if (err) {
+						reject(err);
+						return;
+					}
+					let remaining = /** @type {IStats} */ (stats).size;
+					/** @type {Buffer | undefined} */
+					let currentBuffer;
+					/** @type {number | undefined} */
+					let currentBufferUsed;
+					/** @type {Buffer[]} */
+					const buf = [];
+					/** @type {import("zlib").Zlib & import("stream").Transform | undefined} */
+					let decompression;
+					if (file.endsWith(".gz")) {
+						decompression = createGunzip({
+							chunkSize: DECOMPRESSION_CHUNK_SIZE
+						});
+					} else if (file.endsWith(".br")) {
+						decompression = createBrotliDecompress({
+							chunkSize: DECOMPRESSION_CHUNK_SIZE
+						});
+					}
+					if (decompression) {
+						/** @typedef {(value: Buffer[] | PromiseLike) => void} NewResolve */
+						/** @typedef {(reason?: Error) => void} NewReject */
+
+						/** @type {NewResolve | undefined} */
+						let newResolve;
+						/** @type {NewReject | undefined} */
+						let newReject;
+						resolve(
+							Promise.all([
+								new Promise((rs, rj) => {
+									newResolve = rs;
+									newReject = rj;
+								}),
+								new Promise(
+									/**
+									 * @param {(value?: undefined) => void} resolve resolve
+									 * @param {(reason?: Error) => void} reject reject
+									 */
+									(resolve, reject) => {
+										decompression.on("data", chunk => buf.push(chunk));
+										decompression.on("end", () => resolve());
+										decompression.on("error", err => reject(err));
+									}
+								)
+							]).then(() => buf)
+						);
+						resolve = /** @type {NewResolve} */ (newResolve);
+						reject = /** @type {NewReject} */ (newReject);
+					}
+					this.fs.open(file, "r", (err, _fd) => {
+						if (err) {
+							reject(err);
+							return;
+						}
+						const fd = /** @type {number} */ (_fd);
+						const read = () => {
+							if (currentBuffer === undefined) {
+								currentBuffer = Buffer.allocUnsafeSlow(
+									Math.min(
+										constants.MAX_LENGTH,
+										remaining,
+										decompression ? DECOMPRESSION_CHUNK_SIZE : Infinity
+									)
+								);
+								currentBufferUsed = 0;
+							}
+							let readBuffer = currentBuffer;
+							let readOffset = /** @type {number} */ (currentBufferUsed);
+							let readLength =
+								currentBuffer.length -
+								/** @type {number} */ (currentBufferUsed);
+							// values passed to fs.read must be valid int32 values
+							if (readOffset > 0x7fffffff) {
+								readBuffer = currentBuffer.slice(readOffset);
+								readOffset = 0;
+							}
+							if (readLength > 0x7fffffff) {
+								readLength = 0x7fffffff;
+							}
+							this.fs.read(
+								fd,
+								readBuffer,
+								readOffset,
+								readLength,
+								null,
+								(err, bytesRead) => {
+									if (err) {
+										this.fs.close(fd, () => {
+											reject(err);
+										});
+										return;
+									}
+									/** @type {number} */
+									(currentBufferUsed) += bytesRead;
+									remaining -= bytesRead;
+									if (
+										currentBufferUsed ===
+										/** @type {Buffer} */
+										(currentBuffer).length
+									) {
+										if (decompression) {
+											decompression.write(currentBuffer);
+										} else {
+											buf.push(
+												/** @type {Buffer} */
+												(currentBuffer)
+											);
+										}
+										currentBuffer = undefined;
+										if (remaining === 0) {
+											if (decompression) {
+												decompression.end();
+											}
+											this.fs.close(fd, err => {
+												if (err) {
+													reject(err);
+													return;
+												}
+												resolve(buf);
+											});
+											return;
+										}
+									}
+									read();
+								}
+							);
+						};
+						read();
+					});
+				});
+			});
+		return deserialize(this, false, readFile);
+	}
+}
+
+module.exports = FileMiddleware;
diff --git a/lib/serialization/MapObjectSerializer.js b/lib/serialization/MapObjectSerializer.js
new file mode 100644
index 00000000000..0b1f4182b96
--- /dev/null
+++ b/lib/serialization/MapObjectSerializer.js
@@ -0,0 +1,48 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+/** @typedef {import("./ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
+class MapObjectSerializer {
+	/**
+	 * @template K, V
+	 * @param {Map} obj map
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(obj, context) {
+		context.write(obj.size);
+		for (const key of obj.keys()) {
+			context.write(key);
+		}
+		for (const value of obj.values()) {
+			context.write(value);
+		}
+	}
+
+	/**
+	 * @template K, V
+	 * @param {ObjectDeserializerContext} context context
+	 * @returns {Map} map
+	 */
+	deserialize(context) {
+		/** @type {number} */
+		const size = context.read();
+		/** @type {Map} */
+		const map = new Map();
+		/** @type {K[]} */
+		const keys = [];
+		for (let i = 0; i < size; i++) {
+			keys.push(context.read());
+		}
+		for (let i = 0; i < size; i++) {
+			map.set(keys[i], context.read());
+		}
+		return map;
+	}
+}
+
+module.exports = MapObjectSerializer;
diff --git a/lib/serialization/NullPrototypeObjectSerializer.js b/lib/serialization/NullPrototypeObjectSerializer.js
new file mode 100644
index 00000000000..32adaeaaede
--- /dev/null
+++ b/lib/serialization/NullPrototypeObjectSerializer.js
@@ -0,0 +1,51 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+/** @typedef {import("./ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
+class NullPrototypeObjectSerializer {
+	/**
+	 * @template {object} T
+	 * @param {T} obj null object
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(obj, context) {
+		/** @type {string[]} */
+		const keys = Object.keys(obj);
+		for (const key of keys) {
+			context.write(key);
+		}
+		context.write(null);
+		for (const key of keys) {
+			context.write(obj[/** @type {keyof T} */ (key)]);
+		}
+	}
+
+	/**
+	 * @template {object} T
+	 * @param {ObjectDeserializerContext} context context
+	 * @returns {T} null object
+	 */
+	deserialize(context) {
+		/** @type {T} */
+		const obj = Object.create(null);
+		/** @type {string[]} */
+		const keys = [];
+		/** @type {string | null} */
+		let key = context.read();
+		while (key !== null) {
+			keys.push(key);
+			key = context.read();
+		}
+		for (const key of keys) {
+			obj[/** @type {keyof T} */ (key)] = context.read();
+		}
+		return obj;
+	}
+}
+
+module.exports = NullPrototypeObjectSerializer;
diff --git a/lib/serialization/ObjectMiddleware.js b/lib/serialization/ObjectMiddleware.js
new file mode 100644
index 00000000000..b79a76147b3
--- /dev/null
+++ b/lib/serialization/ObjectMiddleware.js
@@ -0,0 +1,839 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const { DEFAULTS } = require("../config/defaults");
+const createHash = require("../util/createHash");
+const AggregateErrorSerializer = require("./AggregateErrorSerializer");
+const ArraySerializer = require("./ArraySerializer");
+const DateObjectSerializer = require("./DateObjectSerializer");
+const ErrorObjectSerializer = require("./ErrorObjectSerializer");
+const MapObjectSerializer = require("./MapObjectSerializer");
+const NullPrototypeObjectSerializer = require("./NullPrototypeObjectSerializer");
+const PlainObjectSerializer = require("./PlainObjectSerializer");
+const RegExpObjectSerializer = require("./RegExpObjectSerializer");
+const SerializerMiddleware = require("./SerializerMiddleware");
+const SetObjectSerializer = require("./SetObjectSerializer");
+
+/** @typedef {import("../logging/Logger").Logger} Logger */
+/** @typedef {typeof import("../util/Hash")} Hash */
+/** @typedef {import("./SerializerMiddleware").LazyOptions} LazyOptions */
+/** @typedef {import("./types").ComplexSerializableType} ComplexSerializableType */
+/** @typedef {import("./types").PrimitiveSerializableType} PrimitiveSerializableType */
+
+/** @typedef {new (...params: EXPECTED_ANY[]) => EXPECTED_ANY} Constructor */
+
+/*
+
+Format:
+
+File -> Section*
+Section -> ObjectSection | ReferenceSection | EscapeSection | OtherSection
+
+ObjectSection -> ESCAPE (
+	number:relativeOffset (number > 0) |
+	string:request (string|null):export
+) Section:value* ESCAPE ESCAPE_END_OBJECT
+ReferenceSection -> ESCAPE number:relativeOffset (number < 0)
+EscapeSection -> ESCAPE ESCAPE_ESCAPE_VALUE (escaped value ESCAPE)
+EscapeSection -> ESCAPE ESCAPE_UNDEFINED (escaped value ESCAPE)
+OtherSection -> any (except ESCAPE)
+
+Why using null as escape value?
+Multiple null values can merged by the BinaryMiddleware, which makes it very efficient
+Technically any value can be used.
+
+*/
+
+/**
+ * @typedef {object} ObjectSerializerSnapshot
+ * @property {number} length
+ * @property {number} cycleStackSize
+ * @property {number} referenceableSize
+ * @property {number} currentPos
+ * @property {number} objectTypeLookupSize
+ * @property {number} currentPosTypeLookup
+ */
+/** @typedef {TODO} Value */
+/** @typedef {EXPECTED_OBJECT | string} ReferenceableItem */
+
+/**
+ * @typedef {object} ObjectSerializerContext
+ * @property {(value: Value) => void} write
+ * @property {(value: ReferenceableItem) => void} setCircularReference
+ * @property {() => ObjectSerializerSnapshot} snapshot
+ * @property {(snapshot: ObjectSerializerSnapshot) => void} rollback
+ * @property {((item: Value | (() => Value)) => void)=} writeLazy
+ * @property {((item: (Value | (() => Value)), obj: LazyOptions | undefined) => import("./SerializerMiddleware").LazyFunction)=} writeSeparate
+ */
+
+/**
+ * @typedef {object} ObjectDeserializerContext
+ * @property {() => Value} read
+ * @property {(value: ReferenceableItem) => void} setCircularReference
+ */
+
+/**
+ * @typedef {object} ObjectSerializer
+ * @property {(value: Value, context: ObjectSerializerContext) => void} serialize
+ * @property {(context: ObjectDeserializerContext) => Value} deserialize
+ */
+
+/**
+ * @template T
+ * @param {Set} set set
+ * @param {number} size count of items to keep
+ */
+const setSetSize = (set, size) => {
+	let i = 0;
+	for (const item of set) {
+		if (i++ >= size) {
+			set.delete(item);
+		}
+	}
+};
+
+/**
+ * @template K, X
+ * @param {Map} map map
+ * @param {number} size count of items to keep
+ */
+const setMapSize = (map, size) => {
+	let i = 0;
+	for (const item of map.keys()) {
+		if (i++ >= size) {
+			map.delete(item);
+		}
+	}
+};
+
+/**
+ * @param {Buffer} buffer buffer
+ * @param {string | Hash} hashFunction hash function to use
+ * @returns {string} hash
+ */
+const toHash = (buffer, hashFunction) => {
+	const hash = createHash(hashFunction);
+	hash.update(buffer);
+	return /** @type {string} */ (hash.digest("latin1"));
+};
+
+const ESCAPE = null;
+const ESCAPE_ESCAPE_VALUE = null;
+const ESCAPE_END_OBJECT = true;
+const ESCAPE_UNDEFINED = false;
+
+const CURRENT_VERSION = 2;
+
+/** @typedef {{ request?: string, name?: string | number | null, serializer?: ObjectSerializer }} SerializerConfig */
+/** @typedef {{ request?: string, name?: string | number | null, serializer: ObjectSerializer }} SerializerConfigWithSerializer */
+
+/** @type {Map} */
+const serializers = new Map();
+/** @type {Map} */
+const serializerInversed = new Map();
+
+/** @type {Set} */
+const loadedRequests = new Set();
+
+const NOT_SERIALIZABLE = {};
+
+const jsTypes = new Map();
+
+jsTypes.set(Object, new PlainObjectSerializer());
+jsTypes.set(Array, new ArraySerializer());
+jsTypes.set(null, new NullPrototypeObjectSerializer());
+jsTypes.set(Map, new MapObjectSerializer());
+jsTypes.set(Set, new SetObjectSerializer());
+jsTypes.set(Date, new DateObjectSerializer());
+jsTypes.set(RegExp, new RegExpObjectSerializer());
+jsTypes.set(Error, new ErrorObjectSerializer(Error));
+jsTypes.set(EvalError, new ErrorObjectSerializer(EvalError));
+jsTypes.set(RangeError, new ErrorObjectSerializer(RangeError));
+jsTypes.set(ReferenceError, new ErrorObjectSerializer(ReferenceError));
+jsTypes.set(SyntaxError, new ErrorObjectSerializer(SyntaxError));
+jsTypes.set(TypeError, new ErrorObjectSerializer(TypeError));
+
+// @ts-expect-error ES2018 doesn't `AggregateError`, but it can be used by developers
+// eslint-disable-next-line n/no-unsupported-features/es-builtins, n/no-unsupported-features/es-syntax
+if (typeof AggregateError !== "undefined") {
+	jsTypes.set(
+		// @ts-expect-error ES2018 doesn't `AggregateError`, but it can be used by developers
+		// eslint-disable-next-line n/no-unsupported-features/es-builtins, n/no-unsupported-features/es-syntax
+		AggregateError,
+		new AggregateErrorSerializer()
+	);
+}
+
+// If in a sandboxed environment (e.g. jest), this escapes the sandbox and registers
+// real Object and Array types to. These types may occur in the wild too, e.g. when
+// using Structured Clone in postMessage.
+// eslint-disable-next-line n/exports-style
+if (exports.constructor !== Object) {
+	// eslint-disable-next-line n/exports-style
+	const Obj = /** @type {ObjectConstructor} */ (exports.constructor);
+	const Fn = /** @type {FunctionConstructor} */ (Obj.constructor);
+	for (const [type, config] of Array.from(jsTypes)) {
+		if (type) {
+			const Type = new Fn(`return ${type.name};`)();
+			jsTypes.set(Type, config);
+		}
+	}
+}
+
+{
+	let i = 1;
+	for (const [type, serializer] of jsTypes) {
+		serializers.set(type, {
+			request: "",
+			name: i++,
+			serializer
+		});
+	}
+}
+
+for (const { request, name, serializer } of serializers.values()) {
+	serializerInversed.set(
+		`${request}/${name}`,
+		/** @type {ObjectSerializer} */ (serializer)
+	);
+}
+
+/** @type {Map boolean>} */
+const loaders = new Map();
+
+/** @typedef {ComplexSerializableType[]} DeserializedType */
+/** @typedef {PrimitiveSerializableType[]} SerializedType */
+/** @typedef {{ logger: Logger }} Context */
+
+/**
+ * @extends {SerializerMiddleware}
+ */
+class ObjectMiddleware extends SerializerMiddleware {
+	/**
+	 * @param {(context: ObjectSerializerContext | ObjectDeserializerContext) => void} extendContext context extensions
+	 * @param {string | Hash} hashFunction hash function to use
+	 */
+	constructor(extendContext, hashFunction = DEFAULTS.HASH_FUNCTION) {
+		super();
+		this.extendContext = extendContext;
+		this._hashFunction = hashFunction;
+	}
+
+	/**
+	 * @param {RegExp} regExp RegExp for which the request is tested
+	 * @param {(request: string) => boolean} loader loader to load the request, returns true when successful
+	 * @returns {void}
+	 */
+	static registerLoader(regExp, loader) {
+		loaders.set(regExp, loader);
+	}
+
+	/**
+	 * @param {Constructor} Constructor the constructor
+	 * @param {string} request the request which will be required when deserializing
+	 * @param {string | null} name the name to make multiple serializer unique when sharing a request
+	 * @param {ObjectSerializer} serializer the serializer
+	 * @returns {void}
+	 */
+	static register(Constructor, request, name, serializer) {
+		const key = `${request}/${name}`;
+
+		if (serializers.has(Constructor)) {
+			throw new Error(
+				`ObjectMiddleware.register: serializer for ${Constructor.name} is already registered`
+			);
+		}
+
+		if (serializerInversed.has(key)) {
+			throw new Error(
+				`ObjectMiddleware.register: serializer for ${key} is already registered`
+			);
+		}
+
+		serializers.set(Constructor, {
+			request,
+			name,
+			serializer
+		});
+
+		serializerInversed.set(key, serializer);
+	}
+
+	/**
+	 * @param {Constructor} Constructor the constructor
+	 * @returns {void}
+	 */
+	static registerNotSerializable(Constructor) {
+		if (serializers.has(Constructor)) {
+			throw new Error(
+				`ObjectMiddleware.registerNotSerializable: serializer for ${Constructor.name} is already registered`
+			);
+		}
+
+		serializers.set(Constructor, NOT_SERIALIZABLE);
+	}
+
+	/**
+	 * @param {Constructor} object for serialization
+	 * @returns {SerializerConfigWithSerializer} Serializer config
+	 */
+	static getSerializerFor(object) {
+		const proto = Object.getPrototypeOf(object);
+		let c;
+		if (proto === null) {
+			// Object created with Object.create(null)
+			c = null;
+		} else {
+			c = proto.constructor;
+			if (!c) {
+				throw new Error(
+					"Serialization of objects with prototype without valid constructor property not possible"
+				);
+			}
+		}
+		const config = serializers.get(c);
+
+		if (!config) throw new Error(`No serializer registered for ${c.name}`);
+		if (config === NOT_SERIALIZABLE) throw NOT_SERIALIZABLE;
+
+		return /** @type {SerializerConfigWithSerializer} */ (config);
+	}
+
+	/**
+	 * @param {string} request request
+	 * @param {string} name name
+	 * @returns {ObjectSerializer} serializer
+	 */
+	static getDeserializerFor(request, name) {
+		const key = `${request}/${name}`;
+		const serializer = serializerInversed.get(key);
+
+		if (serializer === undefined) {
+			throw new Error(`No deserializer registered for ${key}`);
+		}
+
+		return serializer;
+	}
+
+	/**
+	 * @param {string} request request
+	 * @param {string} name name
+	 * @returns {ObjectSerializer | undefined} serializer
+	 */
+	static _getDeserializerForWithoutError(request, name) {
+		const key = `${request}/${name}`;
+		const serializer = serializerInversed.get(key);
+		return serializer;
+	}
+
+	/**
+	 * @param {DeserializedType} data data
+	 * @param {Context} context context object
+	 * @returns {SerializedType | Promise | null} serialized data
+	 */
+	serialize(data, context) {
+		/** @type {Value[]} */
+		let result = [CURRENT_VERSION];
+		let currentPos = 0;
+		/** @type {Map} */
+		let referenceable = new Map();
+		/**
+		 * @param {ReferenceableItem} item referenceable item
+		 */
+		const addReferenceable = item => {
+			referenceable.set(item, currentPos++);
+		};
+		let bufferDedupeMap = new Map();
+		/**
+		 * @param {Buffer} buf buffer
+		 * @returns {Buffer} deduped buffer
+		 */
+		const dedupeBuffer = buf => {
+			const len = buf.length;
+			const entry = bufferDedupeMap.get(len);
+			if (entry === undefined) {
+				bufferDedupeMap.set(len, buf);
+				return buf;
+			}
+			if (Buffer.isBuffer(entry)) {
+				if (len < 32) {
+					if (buf.equals(entry)) {
+						return entry;
+					}
+					bufferDedupeMap.set(len, [entry, buf]);
+					return buf;
+				}
+				const hash = toHash(entry, this._hashFunction);
+				const newMap = new Map();
+				newMap.set(hash, entry);
+				bufferDedupeMap.set(len, newMap);
+				const hashBuf = toHash(buf, this._hashFunction);
+				if (hash === hashBuf) {
+					return entry;
+				}
+				return buf;
+			} else if (Array.isArray(entry)) {
+				if (entry.length < 16) {
+					for (const item of entry) {
+						if (buf.equals(item)) {
+							return item;
+						}
+					}
+					entry.push(buf);
+					return buf;
+				}
+				const newMap = new Map();
+				const hash = toHash(buf, this._hashFunction);
+				let found;
+				for (const item of entry) {
+					const itemHash = toHash(item, this._hashFunction);
+					newMap.set(itemHash, item);
+					if (found === undefined && itemHash === hash) found = item;
+				}
+				bufferDedupeMap.set(len, newMap);
+				if (found === undefined) {
+					newMap.set(hash, buf);
+					return buf;
+				}
+				return found;
+			}
+			const hash = toHash(buf, this._hashFunction);
+			const item = entry.get(hash);
+			if (item !== undefined) {
+				return item;
+			}
+			entry.set(hash, buf);
+			return buf;
+		};
+		let currentPosTypeLookup = 0;
+		let objectTypeLookup = new Map();
+		const cycleStack = new Set();
+		/**
+		 * @param {Value} item item to stack
+		 * @returns {string} stack
+		 */
+		const stackToString = item => {
+			const arr = Array.from(cycleStack);
+			arr.push(item);
+			return arr
+				.map(item => {
+					if (typeof item === "string") {
+						if (item.length > 100) {
+							return `String ${JSON.stringify(item.slice(0, 100)).slice(
+								0,
+								-1
+							)}..."`;
+						}
+						return `String ${JSON.stringify(item)}`;
+					}
+					try {
+						const { request, name } = ObjectMiddleware.getSerializerFor(item);
+						if (request) {
+							return `${request}${name ? `.${name}` : ""}`;
+						}
+					} catch (_err) {
+						// ignore -> fallback
+					}
+					if (typeof item === "object" && item !== null) {
+						if (item.constructor) {
+							if (item.constructor === Object)
+								return `Object { ${Object.keys(item).join(", ")} }`;
+							if (item.constructor === Map) return `Map { ${item.size} items }`;
+							if (item.constructor === Array)
+								return `Array { ${item.length} items }`;
+							if (item.constructor === Set) return `Set { ${item.size} items }`;
+							if (item.constructor === RegExp) return item.toString();
+							return `${item.constructor.name}`;
+						}
+						return `Object [null prototype] { ${Object.keys(item).join(
+							", "
+						)} }`;
+					}
+					if (typeof item === "bigint") {
+						return `BigInt ${item}n`;
+					}
+					try {
+						return `${item}`;
+					} catch (err) {
+						return `(${/** @type {Error} */ (err).message})`;
+					}
+				})
+				.join(" -> ");
+		};
+		/** @type {WeakSet} */
+		let hasDebugInfoAttached;
+		/** @type {ObjectSerializerContext} */
+		let ctx = {
+			write(value) {
+				try {
+					process(value);
+				} catch (err) {
+					if (err !== NOT_SERIALIZABLE) {
+						if (hasDebugInfoAttached === undefined)
+							hasDebugInfoAttached = new WeakSet();
+						if (!hasDebugInfoAttached.has(/** @type {Error} */ (err))) {
+							/** @type {Error} */
+							(err).message += `\nwhile serializing ${stackToString(value)}`;
+							hasDebugInfoAttached.add(/** @type {Error} */ (err));
+						}
+					}
+					throw err;
+				}
+			},
+			setCircularReference(ref) {
+				addReferenceable(ref);
+			},
+			snapshot() {
+				return {
+					length: result.length,
+					cycleStackSize: cycleStack.size,
+					referenceableSize: referenceable.size,
+					currentPos,
+					objectTypeLookupSize: objectTypeLookup.size,
+					currentPosTypeLookup
+				};
+			},
+			rollback(snapshot) {
+				result.length = snapshot.length;
+				setSetSize(cycleStack, snapshot.cycleStackSize);
+				setMapSize(referenceable, snapshot.referenceableSize);
+				currentPos = snapshot.currentPos;
+				setMapSize(objectTypeLookup, snapshot.objectTypeLookupSize);
+				currentPosTypeLookup = snapshot.currentPosTypeLookup;
+			},
+			...context
+		};
+		this.extendContext(ctx);
+		/**
+		 * @param {Value} item item to serialize
+		 */
+		const process = item => {
+			if (Buffer.isBuffer(item)) {
+				// check if we can emit a reference
+				const ref = referenceable.get(item);
+				if (ref !== undefined) {
+					result.push(ESCAPE, ref - currentPos);
+					return;
+				}
+				const alreadyUsedBuffer = dedupeBuffer(item);
+				if (alreadyUsedBuffer !== item) {
+					const ref = referenceable.get(alreadyUsedBuffer);
+					if (ref !== undefined) {
+						referenceable.set(item, ref);
+						result.push(ESCAPE, ref - currentPos);
+						return;
+					}
+					item = alreadyUsedBuffer;
+				}
+				addReferenceable(item);
+
+				result.push(item);
+			} else if (item === ESCAPE) {
+				result.push(ESCAPE, ESCAPE_ESCAPE_VALUE);
+			} else if (
+				typeof item === "object"
+				// We don't have to check for null as ESCAPE is null and this has been checked before
+			) {
+				// check if we can emit a reference
+				const ref = referenceable.get(item);
+				if (ref !== undefined) {
+					result.push(ESCAPE, ref - currentPos);
+					return;
+				}
+
+				if (cycleStack.has(item)) {
+					throw new Error(
+						"This is a circular references. To serialize circular references use 'setCircularReference' somewhere in the circle during serialize and deserialize."
+					);
+				}
+
+				const { request, name, serializer } =
+					ObjectMiddleware.getSerializerFor(item);
+				const key = `${request}/${name}`;
+				const lastIndex = objectTypeLookup.get(key);
+
+				if (lastIndex === undefined) {
+					objectTypeLookup.set(key, currentPosTypeLookup++);
+
+					result.push(ESCAPE, request, name);
+				} else {
+					result.push(ESCAPE, currentPosTypeLookup - lastIndex);
+				}
+
+				cycleStack.add(item);
+
+				try {
+					serializer.serialize(item, ctx);
+				} finally {
+					cycleStack.delete(item);
+				}
+
+				result.push(ESCAPE, ESCAPE_END_OBJECT);
+
+				addReferenceable(item);
+			} else if (typeof item === "string") {
+				if (item.length > 1) {
+					// short strings are shorter when not emitting a reference (this saves 1 byte per empty string)
+					// check if we can emit a reference
+					const ref = referenceable.get(item);
+					if (ref !== undefined) {
+						result.push(ESCAPE, ref - currentPos);
+						return;
+					}
+					addReferenceable(item);
+				}
+
+				if (item.length > 102400 && context.logger) {
+					context.logger.warn(
+						`Serializing big strings (${Math.round(
+							item.length / 1024
+						)}kiB) impacts deserialization performance (consider using Buffer instead and decode when needed)`
+					);
+				}
+
+				result.push(item);
+			} else if (typeof item === "function") {
+				if (!SerializerMiddleware.isLazy(item))
+					throw new Error(`Unexpected function ${item}`);
+
+				/** @type {SerializedType | undefined} */
+				const serializedData =
+					SerializerMiddleware.getLazySerializedValue(item);
+
+				if (serializedData !== undefined) {
+					if (typeof serializedData === "function") {
+						result.push(serializedData);
+					} else {
+						throw new Error("Not implemented");
+					}
+				} else if (SerializerMiddleware.isLazy(item, this)) {
+					throw new Error("Not implemented");
+				} else {
+					const data = SerializerMiddleware.serializeLazy(item, data =>
+						this.serialize([data], context)
+					);
+					SerializerMiddleware.setLazySerializedValue(item, data);
+					result.push(data);
+				}
+			} else if (item === undefined) {
+				result.push(ESCAPE, ESCAPE_UNDEFINED);
+			} else {
+				result.push(item);
+			}
+		};
+
+		try {
+			for (const item of data) {
+				process(item);
+			}
+			return result;
+		} catch (err) {
+			if (err === NOT_SERIALIZABLE) return null;
+
+			throw err;
+		} finally {
+			// Get rid of these references to avoid leaking memory
+			// This happens because the optimized code v8 generates
+			// is optimized for our "ctx.write" method so it will reference
+			// it from e. g. Dependency.prototype.serialize -(IC)-> ctx.write
+			data =
+				result =
+				referenceable =
+				bufferDedupeMap =
+				objectTypeLookup =
+				ctx =
+					/** @type {EXPECTED_ANY} */
+					(undefined);
+		}
+	}
+
+	/**
+	 * @param {SerializedType} data data
+	 * @param {Context} context context object
+	 * @returns {DeserializedType | Promise} deserialized data
+	 */
+	deserialize(data, context) {
+		let currentDataPos = 0;
+		const read = () => {
+			if (currentDataPos >= data.length)
+				throw new Error("Unexpected end of stream");
+
+			return data[currentDataPos++];
+		};
+
+		if (read() !== CURRENT_VERSION)
+			throw new Error("Version mismatch, serializer changed");
+
+		let currentPos = 0;
+		/** @type {ReferenceableItem[]} */
+		let referenceable = [];
+		/**
+		 * @param {Value} item referenceable item
+		 */
+		const addReferenceable = item => {
+			referenceable.push(item);
+			currentPos++;
+		};
+		let currentPosTypeLookup = 0;
+		/** @type {ObjectSerializer[]} */
+		let objectTypeLookup = [];
+		let result = [];
+		/** @type {ObjectDeserializerContext} */
+		let ctx = {
+			read() {
+				return decodeValue();
+			},
+			setCircularReference(ref) {
+				addReferenceable(ref);
+			},
+			...context
+		};
+		this.extendContext(ctx);
+		const decodeValue = () => {
+			const item = read();
+
+			if (item === ESCAPE) {
+				const nextItem = read();
+
+				if (nextItem === ESCAPE_ESCAPE_VALUE) {
+					return ESCAPE;
+				} else if (nextItem === ESCAPE_UNDEFINED) {
+					// Nothing
+				} else if (nextItem === ESCAPE_END_OBJECT) {
+					throw new Error(
+						`Unexpected end of object at position ${currentDataPos - 1}`
+					);
+				} else {
+					const request = nextItem;
+					let serializer;
+
+					if (typeof request === "number") {
+						if (request < 0) {
+							// relative reference
+							return referenceable[currentPos + request];
+						}
+						serializer = objectTypeLookup[currentPosTypeLookup - request];
+					} else {
+						if (typeof request !== "string") {
+							throw new Error(
+								`Unexpected type (${typeof request}) of request ` +
+									`at position ${currentDataPos - 1}`
+							);
+						}
+						const name = /** @type {string} */ (read());
+
+						serializer = ObjectMiddleware._getDeserializerForWithoutError(
+							request,
+							name
+						);
+
+						if (serializer === undefined) {
+							if (request && !loadedRequests.has(request)) {
+								let loaded = false;
+								for (const [regExp, loader] of loaders) {
+									if (regExp.test(request) && loader(request)) {
+										loaded = true;
+										break;
+									}
+								}
+								if (!loaded) {
+									require(request);
+								}
+
+								loadedRequests.add(request);
+							}
+
+							serializer = ObjectMiddleware.getDeserializerFor(request, name);
+						}
+
+						objectTypeLookup.push(serializer);
+						currentPosTypeLookup++;
+					}
+					try {
+						const item = serializer.deserialize(ctx);
+						const end1 = read();
+
+						if (end1 !== ESCAPE) {
+							throw new Error("Expected end of object");
+						}
+
+						const end2 = read();
+
+						if (end2 !== ESCAPE_END_OBJECT) {
+							throw new Error("Expected end of object");
+						}
+
+						addReferenceable(item);
+
+						return item;
+					} catch (err) {
+						// As this is only for error handling, we omit creating a Map for
+						// faster access to this information, as this would affect performance
+						// in the good case
+						let serializerEntry;
+						for (const entry of serializers) {
+							if (entry[1].serializer === serializer) {
+								serializerEntry = entry;
+								break;
+							}
+						}
+						const name = !serializerEntry
+							? "unknown"
+							: !serializerEntry[1].request
+								? serializerEntry[0].name
+								: serializerEntry[1].name
+									? `${serializerEntry[1].request} ${serializerEntry[1].name}`
+									: serializerEntry[1].request;
+						/** @type {Error} */
+						(err).message += `\n(during deserialization of ${name})`;
+						throw err;
+					}
+				}
+			} else if (typeof item === "string") {
+				if (item.length > 1) {
+					addReferenceable(item);
+				}
+
+				return item;
+			} else if (Buffer.isBuffer(item)) {
+				addReferenceable(item);
+
+				return item;
+			} else if (typeof item === "function") {
+				return SerializerMiddleware.deserializeLazy(
+					item,
+					data =>
+						/** @type {[DeserializedType]} */
+						(this.deserialize(data, context))[0]
+				);
+			} else {
+				return item;
+			}
+		};
+
+		try {
+			while (currentDataPos < data.length) {
+				result.push(decodeValue());
+			}
+			return result;
+		} finally {
+			// Get rid of these references to avoid leaking memory
+			// This happens because the optimized code v8 generates
+			// is optimized for our "ctx.read" method so it will reference
+			// it from e. g. Dependency.prototype.deserialize -(IC)-> ctx.read
+			result =
+				referenceable =
+				data =
+				objectTypeLookup =
+				ctx =
+					/** @type {EXPECTED_ANY} */
+					(undefined);
+		}
+	}
+}
+
+module.exports = ObjectMiddleware;
+module.exports.NOT_SERIALIZABLE = NOT_SERIALIZABLE;
diff --git a/lib/serialization/PlainObjectSerializer.js b/lib/serialization/PlainObjectSerializer.js
new file mode 100644
index 00000000000..2d04aa4a489
--- /dev/null
+++ b/lib/serialization/PlainObjectSerializer.js
@@ -0,0 +1,117 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+/** @typedef {import("./ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
+/** @typedef {EXPECTED_FUNCTION} CacheAssoc */
+
+/**
+ * @template T
+ * @typedef {WeakMap>}
+ */
+const cache = new WeakMap();
+
+/**
+ * @template T
+ */
+class ObjectStructure {
+	constructor() {
+		this.keys = undefined;
+		this.children = undefined;
+	}
+
+	/**
+	 * @param {keyof T[]} keys keys
+	 * @returns {keyof T[]} keys
+	 */
+	getKeys(keys) {
+		if (this.keys === undefined) this.keys = keys;
+		return this.keys;
+	}
+
+	/**
+	 * @param {keyof T} key key
+	 * @returns {ObjectStructure} object structure
+	 */
+	key(key) {
+		if (this.children === undefined) this.children = new Map();
+		const child = this.children.get(key);
+		if (child !== undefined) return child;
+		const newChild = new ObjectStructure();
+		this.children.set(key, newChild);
+		return newChild;
+	}
+}
+
+/**
+ * @template T
+ * @param {(keyof T)[]} keys keys
+ * @param {CacheAssoc} cacheAssoc cache assoc fn
+ * @returns {(keyof T)[]} keys
+ */
+const getCachedKeys = (keys, cacheAssoc) => {
+	let root = cache.get(cacheAssoc);
+	if (root === undefined) {
+		root = new ObjectStructure();
+		cache.set(cacheAssoc, root);
+	}
+	let current = root;
+	for (const key of keys) {
+		current = current.key(key);
+	}
+	return current.getKeys(keys);
+};
+
+class PlainObjectSerializer {
+	/**
+	 * @template {object} T
+	 * @param {T} obj plain object
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(obj, context) {
+		const keys = /** @type {(keyof T)[]} */ (Object.keys(obj));
+		if (keys.length > 128) {
+			// Objects with so many keys are unlikely to share structure
+			// with other objects
+			context.write(keys);
+			for (const key of keys) {
+				context.write(obj[key]);
+			}
+		} else if (keys.length > 1) {
+			context.write(getCachedKeys(keys, context.write));
+			for (const key of keys) {
+				context.write(obj[key]);
+			}
+		} else if (keys.length === 1) {
+			const key = keys[0];
+			context.write(key);
+			context.write(obj[key]);
+		} else {
+			context.write(null);
+		}
+	}
+
+	/**
+	 * @template {object} T
+	 * @param {ObjectDeserializerContext} context context
+	 * @returns {T} plain object
+	 */
+	deserialize(context) {
+		const keys = context.read();
+		const obj = /** @type {T} */ ({});
+		if (Array.isArray(keys)) {
+			for (const key of keys) {
+				obj[/** @type {keyof T} */ (key)] = context.read();
+			}
+		} else if (keys !== null) {
+			obj[/** @type {keyof T} */ (keys)] = context.read();
+		}
+		return obj;
+	}
+}
+
+module.exports = PlainObjectSerializer;
diff --git a/lib/serialization/RegExpObjectSerializer.js b/lib/serialization/RegExpObjectSerializer.js
new file mode 100644
index 00000000000..5ac7eec5105
--- /dev/null
+++ b/lib/serialization/RegExpObjectSerializer.js
@@ -0,0 +1,29 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+/** @typedef {import("./ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
+class RegExpObjectSerializer {
+	/**
+	 * @param {RegExp} obj regexp
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(obj, context) {
+		context.write(obj.source);
+		context.write(obj.flags);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 * @returns {RegExp} regexp
+	 */
+	deserialize(context) {
+		return new RegExp(context.read(), context.read());
+	}
+}
+
+module.exports = RegExpObjectSerializer;
diff --git a/lib/serialization/Serializer.js b/lib/serialization/Serializer.js
new file mode 100644
index 00000000000..fcbc002b3ac
--- /dev/null
+++ b/lib/serialization/Serializer.js
@@ -0,0 +1,80 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+/**
+ * @template T, K, C
+ * @typedef {import("./SerializerMiddleware")} SerializerMiddleware
+ */
+
+/**
+ * @template DeserializedValue
+ * @template SerializedValue
+ * @template Context
+ */
+class Serializer {
+	/**
+	 * @param {SerializerMiddleware[]} middlewares serializer middlewares
+	 * @param {Context=} context context
+	 */
+	constructor(middlewares, context) {
+		this.serializeMiddlewares = middlewares.slice();
+		this.deserializeMiddlewares = middlewares.slice().reverse();
+		this.context = context;
+	}
+
+	/**
+	 * @template ExtendedContext
+	 * @param {DeserializedValue | Promise} obj object
+	 * @param {Context & ExtendedContext} context context object
+	 * @returns {Promise} result
+	 */
+	serialize(obj, context) {
+		const ctx = { ...context, ...this.context };
+		let current = obj;
+		for (const middleware of this.serializeMiddlewares) {
+			if (
+				current &&
+				typeof (/** @type {Promise} */ (current).then) ===
+					"function"
+			) {
+				current =
+					/** @type {Promise} */
+					(current).then(data => data && middleware.serialize(data, ctx));
+			} else if (current) {
+				try {
+					current = middleware.serialize(current, ctx);
+				} catch (err) {
+					current = Promise.reject(err);
+				}
+			} else break;
+		}
+		return /** @type {Promise} */ (current);
+	}
+
+	/**
+	 * @template ExtendedContext
+	 * @param {SerializedValue | Promise} value value
+	 * @param {Context & ExtendedContext} context object
+	 * @returns {Promise} result
+	 */
+	deserialize(value, context) {
+		const ctx = { ...context, ...this.context };
+		let current = value;
+		for (const middleware of this.deserializeMiddlewares) {
+			current =
+				current &&
+				typeof (/** @type {Promise} */ (current).then) ===
+					"function"
+					? /** @type {Promise} */ (current).then(data =>
+							middleware.deserialize(data, ctx)
+						)
+					: middleware.deserialize(current, ctx);
+		}
+		return /** @type {Promise} */ (current);
+	}
+}
+
+module.exports = Serializer;
diff --git a/lib/serialization/SerializerMiddleware.js b/lib/serialization/SerializerMiddleware.js
new file mode 100644
index 00000000000..ab15c927989
--- /dev/null
+++ b/lib/serialization/SerializerMiddleware.js
@@ -0,0 +1,226 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const memoize = require("../util/memoize");
+
+const LAZY_TARGET = Symbol("lazy serialization target");
+const LAZY_SERIALIZED_VALUE = Symbol("lazy serialization data");
+
+/** @typedef {SerializerMiddleware>} LazyTarget */
+/** @typedef {Record} LazyOptions */
+
+/**
+ * @template InputValue
+ * @template OutputValue
+ * @template {LazyTarget} InternalLazyTarget
+ * @template {LazyOptions | undefined} InternalLazyOptions
+ * @typedef {(() => InputValue | Promise) & Partial<{ [LAZY_TARGET]: InternalLazyTarget, options: InternalLazyOptions, [LAZY_SERIALIZED_VALUE]?: OutputValue | LazyFunction | undefined }>} LazyFunction
+ */
+
+/**
+ * @template DeserializedType
+ * @template SerializedType
+ * @template Context
+ */
+class SerializerMiddleware {
+	/* istanbul ignore next */
+	/**
+	 * @abstract
+	 * @param {DeserializedType} data data
+	 * @param {Context} context context object
+	 * @returns {SerializedType | Promise | null} serialized data
+	 */
+	serialize(data, context) {
+		const AbstractMethodError = require("../AbstractMethodError");
+		throw new AbstractMethodError();
+	}
+
+	/* istanbul ignore next */
+	/**
+	 * @abstract
+	 * @param {SerializedType} data data
+	 * @param {Context} context context object
+	 * @returns {DeserializedType | Promise} deserialized data
+	 */
+	deserialize(data, context) {
+		const AbstractMethodError = require("../AbstractMethodError");
+		throw new AbstractMethodError();
+	}
+
+	/**
+	 * @template TLazyInputValue
+	 * @template TLazyOutputValue
+	 * @template {LazyTarget} TLazyTarget
+	 * @template {LazyOptions | undefined} TLazyOptions
+	 * @param {TLazyInputValue | (() => TLazyInputValue)} value contained value or function to value
+	 * @param {TLazyTarget} target target middleware
+	 * @param {TLazyOptions=} options lazy options
+	 * @param {TLazyOutputValue=} serializedValue serialized value
+	 * @returns {LazyFunction} lazy function
+	 */
+	static createLazy(
+		value,
+		target,
+		options = /** @type {TLazyOptions} */ ({}),
+		serializedValue = undefined
+	) {
+		if (SerializerMiddleware.isLazy(value, target)) return value;
+		const fn =
+			/** @type {LazyFunction} */
+			(typeof value === "function" ? value : () => value);
+		fn[LAZY_TARGET] = target;
+		fn.options = options;
+		fn[LAZY_SERIALIZED_VALUE] = serializedValue;
+		return fn;
+	}
+
+	/**
+	 * @template {LazyTarget} TLazyTarget
+	 * @param {EXPECTED_ANY} fn lazy function
+	 * @param {TLazyTarget=} target target middleware
+	 * @returns {fn is LazyFunction} true, when fn is a lazy function (optionally of that target)
+	 */
+	static isLazy(fn, target) {
+		if (typeof fn !== "function") return false;
+		const t = fn[LAZY_TARGET];
+		return target ? t === target : Boolean(t);
+	}
+
+	/**
+	 * @template TLazyInputValue
+	 * @template TLazyOutputValue
+	 * @template {LazyTarget} TLazyTarget
+	 * @template {Record} TLazyOptions
+	 * @template TLazySerializedValue
+	 * @param {LazyFunction} fn lazy function
+	 * @returns {LazyOptions | undefined} options
+	 */
+	static getLazyOptions(fn) {
+		if (typeof fn !== "function") return;
+		return fn.options;
+	}
+
+	/**
+	 * @template TLazyInputValue
+	 * @template TLazyOutputValue
+	 * @template {LazyTarget} TLazyTarget
+	 * @template {LazyOptions} TLazyOptions
+	 * @param {LazyFunction | EXPECTED_ANY} fn lazy function
+	 * @returns {TLazyOutputValue | undefined} serialized value
+	 */
+	static getLazySerializedValue(fn) {
+		if (typeof fn !== "function") return;
+		return fn[LAZY_SERIALIZED_VALUE];
+	}
+
+	/**
+	 * @template TLazyInputValue
+	 * @template TLazyOutputValue
+	 * @template {LazyTarget} TLazyTarget
+	 * @template {LazyOptions} TLazyOptions
+	 * @param {LazyFunction} fn lazy function
+	 * @param {TLazyOutputValue} value serialized value
+	 * @returns {void}
+	 */
+	static setLazySerializedValue(fn, value) {
+		fn[LAZY_SERIALIZED_VALUE] = value;
+	}
+
+	/**
+	 * @template TLazyInputValue DeserializedValue
+	 * @template TLazyOutputValue SerializedValue
+	 * @template {LazyTarget} TLazyTarget
+	 * @template {LazyOptions | undefined} TLazyOptions
+	 * @param {LazyFunction} lazy lazy function
+	 * @param {(value: TLazyInputValue) => TLazyOutputValue} serialize serialize function
+	 * @returns {LazyFunction} new lazy
+	 */
+	static serializeLazy(lazy, serialize) {
+		const fn =
+			/** @type {LazyFunction} */
+			(
+				memoize(() => {
+					const r = lazy();
+					if (
+						r &&
+						typeof (/** @type {Promise} */ (r).then) ===
+							"function"
+					) {
+						return (
+							/** @type {Promise} */
+							(r).then(data => data && serialize(data))
+						);
+					}
+					return serialize(/** @type {TLazyInputValue} */ (r));
+				})
+			);
+		fn[LAZY_TARGET] = lazy[LAZY_TARGET];
+		fn.options = lazy.options;
+		lazy[LAZY_SERIALIZED_VALUE] = fn;
+		return fn;
+	}
+
+	/**
+	 * @template TLazyInputValue SerializedValue
+	 * @template TLazyOutputValue DeserializedValue
+	 * @template SerializedValue
+	 * @template {LazyTarget} TLazyTarget
+	 * @template {LazyOptions | undefined} TLazyOptions
+	 * @param {LazyFunction} lazy lazy function
+	 * @param {(data: TLazyInputValue) => TLazyOutputValue} deserialize deserialize function
+	 * @returns {LazyFunction} new lazy
+	 */
+	static deserializeLazy(lazy, deserialize) {
+		const fn =
+			/** @type {LazyFunction} */ (
+				memoize(() => {
+					const r = lazy();
+					if (
+						r &&
+						typeof (/** @type {Promise} */ (r).then) ===
+							"function"
+					) {
+						return (
+							/** @type {Promise} */
+							(r).then(data => deserialize(data))
+						);
+					}
+					return deserialize(/** @type {TLazyInputValue} */ (r));
+				})
+			);
+		fn[LAZY_TARGET] = lazy[LAZY_TARGET];
+		fn.options = lazy.options;
+		fn[LAZY_SERIALIZED_VALUE] = lazy;
+		return fn;
+	}
+
+	/**
+	 * @template TLazyInputValue
+	 * @template TLazyOutputValue
+	 * @template {LazyTarget} TLazyTarget
+	 * @template {LazyOptions} TLazyOptions
+	 * @param {LazyFunction | undefined} lazy lazy function
+	 * @returns {LazyFunction | undefined} new lazy
+	 */
+	static unMemoizeLazy(lazy) {
+		if (!SerializerMiddleware.isLazy(lazy)) return lazy;
+		/** @type {LazyFunction} */
+		const fn = () => {
+			throw new Error(
+				"A lazy value that has been unmemorized can't be called again"
+			);
+		};
+		fn[LAZY_SERIALIZED_VALUE] = SerializerMiddleware.unMemoizeLazy(
+			/** @type {LazyFunction} */
+			(lazy[LAZY_SERIALIZED_VALUE])
+		);
+		fn[LAZY_TARGET] = lazy[LAZY_TARGET];
+		fn.options = lazy.options;
+		return fn;
+	}
+}
+
+module.exports = SerializerMiddleware;
diff --git a/lib/serialization/SetObjectSerializer.js b/lib/serialization/SetObjectSerializer.js
new file mode 100644
index 00000000000..66811b87d16
--- /dev/null
+++ b/lib/serialization/SetObjectSerializer.js
@@ -0,0 +1,40 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+/** @typedef {import("./ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("./ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
+class SetObjectSerializer {
+	/**
+	 * @template T
+	 * @param {Set} obj set
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(obj, context) {
+		context.write(obj.size);
+		for (const value of obj) {
+			context.write(value);
+		}
+	}
+
+	/**
+	 * @template T
+	 * @param {ObjectDeserializerContext} context context
+	 * @returns {Set} date
+	 */
+	deserialize(context) {
+		/** @type {number} */
+		const size = context.read();
+		/** @type {Set} */
+		const set = new Set();
+		for (let i = 0; i < size; i++) {
+			set.add(context.read());
+		}
+		return set;
+	}
+}
+
+module.exports = SetObjectSerializer;
diff --git a/lib/serialization/SingleItemMiddleware.js b/lib/serialization/SingleItemMiddleware.js
new file mode 100644
index 00000000000..43b1fe6ae9d
--- /dev/null
+++ b/lib/serialization/SingleItemMiddleware.js
@@ -0,0 +1,36 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+const SerializerMiddleware = require("./SerializerMiddleware");
+
+/** @typedef {EXPECTED_ANY} DeserializedType */
+/** @typedef {EXPECTED_ANY[]} SerializedType */
+/** @typedef {{}} Context */
+
+/**
+ * @extends {SerializerMiddleware}
+ */
+class SingleItemMiddleware extends SerializerMiddleware {
+	/**
+	 * @param {DeserializedType} data data
+	 * @param {Context} context context object
+	 * @returns {SerializedType | Promise | null} serialized data
+	 */
+	serialize(data, context) {
+		return [data];
+	}
+
+	/**
+	 * @param {SerializedType} data data
+	 * @param {Context} context context object
+	 * @returns {DeserializedType | Promise} deserialized data
+	 */
+	deserialize(data, context) {
+		return data[0];
+	}
+}
+
+module.exports = SingleItemMiddleware;
diff --git a/lib/serialization/types.js b/lib/serialization/types.js
new file mode 100644
index 00000000000..4c5a9de0d46
--- /dev/null
+++ b/lib/serialization/types.js
@@ -0,0 +1,13 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+*/
+
+"use strict";
+
+/** @typedef {undefined | null | number | string | boolean | Buffer | EXPECTED_OBJECT | (() => ComplexSerializableType[] | Promise)} ComplexSerializableType */
+
+/** @typedef {undefined | null | number | bigint | string | boolean | Buffer | (() => PrimitiveSerializableType[] | Promise)} PrimitiveSerializableType */
+
+/** @typedef {Buffer | (() => BufferSerializableType[] | Promise)} BufferSerializableType */
+
+module.exports = {};
diff --git a/lib/sharing/ConsumeSharedFallbackDependency.js b/lib/sharing/ConsumeSharedFallbackDependency.js
new file mode 100644
index 00000000000..bd6eefef13f
--- /dev/null
+++ b/lib/sharing/ConsumeSharedFallbackDependency.js
@@ -0,0 +1,33 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const ModuleDependency = require("../dependencies/ModuleDependency");
+const makeSerializable = require("../util/makeSerializable");
+
+class ConsumeSharedFallbackDependency extends ModuleDependency {
+	/**
+	 * @param {string} request the request
+	 */
+	constructor(request) {
+		super(request);
+	}
+
+	get type() {
+		return "consume shared fallback";
+	}
+
+	get category() {
+		return "esm";
+	}
+}
+
+makeSerializable(
+	ConsumeSharedFallbackDependency,
+	"webpack/lib/sharing/ConsumeSharedFallbackDependency"
+);
+
+module.exports = ConsumeSharedFallbackDependency;
diff --git a/lib/sharing/ConsumeSharedModule.js b/lib/sharing/ConsumeSharedModule.js
new file mode 100644
index 00000000000..20f8fda1ed3
--- /dev/null
+++ b/lib/sharing/ConsumeSharedModule.js
@@ -0,0 +1,269 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { RawSource } = require("webpack-sources");
+const AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
+const Module = require("../Module");
+const { CONSUME_SHARED_TYPES } = require("../ModuleSourceTypesConstants");
+const {
+	WEBPACK_MODULE_TYPE_CONSUME_SHARED_MODULE
+} = require("../ModuleTypeConstants");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const makeSerializable = require("../util/makeSerializable");
+const { rangeToString, stringifyHoley } = require("../util/semver");
+const ConsumeSharedFallbackDependency = require("./ConsumeSharedFallbackDependency");
+
+/** @typedef {import("../../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../ChunkGroup")} ChunkGroup */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Dependency").UpdateHashContext} UpdateHashContext */
+/** @typedef {import("../Module").BuildCallback} BuildCallback */
+/** @typedef {import("../Module").CodeGenerationContext} CodeGenerationContext */
+/** @typedef {import("../Module").CodeGenerationResult} CodeGenerationResult */
+/** @typedef {import("../Module").LibIdentOptions} LibIdentOptions */
+/** @typedef {import("../Module").NeedBuildCallback} NeedBuildCallback */
+/** @typedef {import("../Module").NeedBuildContext} NeedBuildContext */
+/** @typedef {import("../Module").SourceTypes} SourceTypes */
+/** @typedef {import("../RequestShortener")} RequestShortener */
+/** @typedef {import("../ResolverFactory").ResolverWithOptions} ResolverWithOptions */
+/** @typedef {import("../WebpackError")} WebpackError */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("../util/fs").InputFileSystem} InputFileSystem */
+/** @typedef {import("../util/semver").SemVerRange} SemVerRange */
+
+/**
+ * @typedef {object} ConsumeOptions
+ * @property {string=} import fallback request
+ * @property {string=} importResolved resolved fallback request
+ * @property {string} shareKey global share key
+ * @property {string} shareScope share scope
+ * @property {SemVerRange | false | undefined} requiredVersion version requirement
+ * @property {string=} packageName package name to determine required version automatically
+ * @property {boolean} strictVersion don't use shared version even if version isn't valid
+ * @property {boolean} singleton use single global version
+ * @property {boolean} eager include the fallback module in a sync way
+ */
+
+class ConsumeSharedModule extends Module {
+	/**
+	 * @param {string} context context
+	 * @param {ConsumeOptions} options consume options
+	 */
+	constructor(context, options) {
+		super(WEBPACK_MODULE_TYPE_CONSUME_SHARED_MODULE, context);
+		this.options = options;
+	}
+
+	/**
+	 * @returns {string} a unique identifier of the module
+	 */
+	identifier() {
+		const {
+			shareKey,
+			shareScope,
+			importResolved,
+			requiredVersion,
+			strictVersion,
+			singleton,
+			eager
+		} = this.options;
+		return `${WEBPACK_MODULE_TYPE_CONSUME_SHARED_MODULE}|${shareScope}|${shareKey}|${
+			requiredVersion && rangeToString(requiredVersion)
+		}|${strictVersion}|${importResolved}|${singleton}|${eager}`;
+	}
+
+	/**
+	 * @param {RequestShortener} requestShortener the request shortener
+	 * @returns {string} a user readable identifier of the module
+	 */
+	readableIdentifier(requestShortener) {
+		const {
+			shareKey,
+			shareScope,
+			importResolved,
+			requiredVersion,
+			strictVersion,
+			singleton,
+			eager
+		} = this.options;
+		return `consume shared module (${shareScope}) ${shareKey}@${
+			requiredVersion ? rangeToString(requiredVersion) : "*"
+		}${strictVersion ? " (strict)" : ""}${singleton ? " (singleton)" : ""}${
+			importResolved
+				? ` (fallback: ${requestShortener.shorten(importResolved)})`
+				: ""
+		}${eager ? " (eager)" : ""}`;
+	}
+
+	/**
+	 * @param {LibIdentOptions} options options
+	 * @returns {string | null} an identifier for library inclusion
+	 */
+	libIdent(options) {
+		const { shareKey, shareScope, import: request } = this.options;
+		return `${
+			this.layer ? `(${this.layer})/` : ""
+		}webpack/sharing/consume/${shareScope}/${shareKey}${
+			request ? `/${request}` : ""
+		}`;
+	}
+
+	/**
+	 * @param {NeedBuildContext} context context info
+	 * @param {NeedBuildCallback} callback callback function, returns true, if the module needs a rebuild
+	 * @returns {void}
+	 */
+	needBuild(context, callback) {
+		callback(null, !this.buildInfo);
+	}
+
+	/**
+	 * @param {WebpackOptions} options webpack options
+	 * @param {Compilation} compilation the compilation
+	 * @param {ResolverWithOptions} resolver the resolver
+	 * @param {InputFileSystem} fs the file system
+	 * @param {BuildCallback} callback callback function
+	 * @returns {void}
+	 */
+	build(options, compilation, resolver, fs, callback) {
+		this.buildMeta = {};
+		this.buildInfo = {};
+		if (this.options.import) {
+			const dep = new ConsumeSharedFallbackDependency(this.options.import);
+			if (this.options.eager) {
+				this.addDependency(dep);
+			} else {
+				const block = new AsyncDependenciesBlock({});
+				block.addDependency(dep);
+				this.addBlock(block);
+			}
+		}
+		callback();
+	}
+
+	/**
+	 * @returns {SourceTypes} types available (do not mutate)
+	 */
+	getSourceTypes() {
+		return CONSUME_SHARED_TYPES;
+	}
+
+	/**
+	 * @param {string=} type the source type for which the size should be estimated
+	 * @returns {number} the estimated size of the module (must be non-zero)
+	 */
+	size(type) {
+		return 42;
+	}
+
+	/**
+	 * @param {Hash} hash the hash used to track dependencies
+	 * @param {UpdateHashContext} context context
+	 * @returns {void}
+	 */
+	updateHash(hash, context) {
+		hash.update(JSON.stringify(this.options));
+		super.updateHash(hash, context);
+	}
+
+	/**
+	 * @param {CodeGenerationContext} context context for code generation
+	 * @returns {CodeGenerationResult} result
+	 */
+	codeGeneration({ chunkGraph, moduleGraph, runtimeTemplate }) {
+		const runtimeRequirements = new Set([RuntimeGlobals.shareScopeMap]);
+		const {
+			shareScope,
+			shareKey,
+			strictVersion,
+			requiredVersion,
+			import: request,
+			singleton,
+			eager
+		} = this.options;
+		let fallbackCode;
+		if (request) {
+			if (eager) {
+				const dep = this.dependencies[0];
+				fallbackCode = runtimeTemplate.syncModuleFactory({
+					dependency: dep,
+					chunkGraph,
+					runtimeRequirements,
+					request: this.options.import
+				});
+			} else {
+				const block = this.blocks[0];
+				fallbackCode = runtimeTemplate.asyncModuleFactory({
+					block,
+					chunkGraph,
+					runtimeRequirements,
+					request: this.options.import
+				});
+			}
+		}
+
+		const args = [
+			JSON.stringify(shareScope),
+			JSON.stringify(shareKey),
+			JSON.stringify(eager)
+		];
+		if (requiredVersion) {
+			args.push(stringifyHoley(requiredVersion));
+		}
+		if (fallbackCode) {
+			args.push(fallbackCode);
+		}
+
+		let fn;
+
+		if (requiredVersion) {
+			if (strictVersion) {
+				fn = singleton ? "loadStrictSingletonVersion" : "loadStrictVersion";
+			} else {
+				fn = singleton ? "loadSingletonVersion" : "loadVersion";
+			}
+		} else {
+			fn = singleton ? "loadSingleton" : "load";
+		}
+
+		const code = runtimeTemplate.returningFunction(`${fn}(${args.join(", ")})`);
+		const sources = new Map();
+		sources.set("consume-shared", new RawSource(code));
+		return {
+			runtimeRequirements,
+			sources
+		};
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this.options);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 */
+	deserialize(context) {
+		const { read } = context;
+		this.options = read();
+		super.deserialize(context);
+	}
+}
+
+makeSerializable(
+	ConsumeSharedModule,
+	"webpack/lib/sharing/ConsumeSharedModule"
+);
+
+module.exports = ConsumeSharedModule;
diff --git a/lib/sharing/ConsumeSharedPlugin.js b/lib/sharing/ConsumeSharedPlugin.js
new file mode 100644
index 00000000000..e6fab76f1d9
--- /dev/null
+++ b/lib/sharing/ConsumeSharedPlugin.js
@@ -0,0 +1,379 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const ModuleNotFoundError = require("../ModuleNotFoundError");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const WebpackError = require("../WebpackError");
+const { parseOptions } = require("../container/options");
+const LazySet = require("../util/LazySet");
+const createSchemaValidation = require("../util/create-schema-validation");
+const { parseRange } = require("../util/semver");
+const ConsumeSharedFallbackDependency = require("./ConsumeSharedFallbackDependency");
+const ConsumeSharedModule = require("./ConsumeSharedModule");
+const ConsumeSharedRuntimeModule = require("./ConsumeSharedRuntimeModule");
+const ProvideForSharedDependency = require("./ProvideForSharedDependency");
+const { resolveMatchedConfigs } = require("./resolveMatchedConfigs");
+const {
+	isRequiredVersion,
+	getDescriptionFile,
+	getRequiredVersionFromDescriptionFile
+} = require("./utils");
+
+/** @typedef {import("../../declarations/plugins/sharing/ConsumeSharedPlugin").ConsumeSharedPluginOptions} ConsumeSharedPluginOptions */
+/** @typedef {import("../../declarations/plugins/sharing/ConsumeSharedPlugin").ConsumesConfig} ConsumesConfig */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../ResolverFactory").ResolveOptionsWithDependencyType} ResolveOptionsWithDependencyType */
+/** @typedef {import("../util/semver").SemVerRange} SemVerRange */
+/** @typedef {import("./ConsumeSharedModule").ConsumeOptions} ConsumeOptions */
+/** @typedef {import("./utils").DescriptionFile} DescriptionFile */
+
+const validate = createSchemaValidation(
+	require("../../schemas/plugins/sharing/ConsumeSharedPlugin.check.js"),
+	() => require("../../schemas/plugins/sharing/ConsumeSharedPlugin.json"),
+	{
+		name: "Consume Shared Plugin",
+		baseDataPath: "options"
+	}
+);
+
+/** @type {ResolveOptionsWithDependencyType} */
+const RESOLVE_OPTIONS = { dependencyType: "esm" };
+const PLUGIN_NAME = "ConsumeSharedPlugin";
+
+class ConsumeSharedPlugin {
+	/**
+	 * @param {ConsumeSharedPluginOptions} options options
+	 */
+	constructor(options) {
+		if (typeof options !== "string") {
+			validate(options);
+		}
+
+		/** @type {[string, ConsumeOptions][]} */
+		this._consumes = parseOptions(
+			options.consumes,
+			(item, key) => {
+				if (Array.isArray(item)) throw new Error("Unexpected array in options");
+				/** @type {ConsumeOptions} */
+				const result =
+					item === key || !isRequiredVersion(item)
+						? // item is a request/key
+							{
+								import: key,
+								shareScope: options.shareScope || "default",
+								shareKey: key,
+								requiredVersion: undefined,
+								packageName: undefined,
+								strictVersion: false,
+								singleton: false,
+								eager: false
+							}
+						: // key is a request/key
+							// item is a version
+							{
+								import: key,
+								shareScope: options.shareScope || "default",
+								shareKey: key,
+								requiredVersion: parseRange(item),
+								strictVersion: true,
+								packageName: undefined,
+								singleton: false,
+								eager: false
+							};
+				return result;
+			},
+			(item, key) => ({
+				import: item.import === false ? undefined : item.import || key,
+				shareScope: item.shareScope || options.shareScope || "default",
+				shareKey: item.shareKey || key,
+				requiredVersion:
+					typeof item.requiredVersion === "string"
+						? parseRange(item.requiredVersion)
+						: item.requiredVersion,
+				strictVersion:
+					typeof item.strictVersion === "boolean"
+						? item.strictVersion
+						: item.import !== false && !item.singleton,
+				packageName: item.packageName,
+				singleton: Boolean(item.singleton),
+				eager: Boolean(item.eager)
+			})
+		);
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.thisCompilation.tap(
+			PLUGIN_NAME,
+			(compilation, { normalModuleFactory }) => {
+				compilation.dependencyFactories.set(
+					ConsumeSharedFallbackDependency,
+					normalModuleFactory
+				);
+
+				/** @type {Map} */
+				let unresolvedConsumes;
+				/** @type {Map} */
+				let resolvedConsumes;
+				/** @type {Map} */
+				let prefixedConsumes;
+				const promise = resolveMatchedConfigs(compilation, this._consumes).then(
+					({ resolved, unresolved, prefixed }) => {
+						resolvedConsumes = resolved;
+						unresolvedConsumes = unresolved;
+						prefixedConsumes = prefixed;
+					}
+				);
+
+				const resolver = compilation.resolverFactory.get(
+					"normal",
+					RESOLVE_OPTIONS
+				);
+
+				/**
+				 * @param {string} context issuer directory
+				 * @param {string} request request
+				 * @param {ConsumeOptions} config options
+				 * @returns {Promise} create module
+				 */
+				const createConsumeSharedModule = (context, request, config) => {
+					/**
+					 * @param {string} details details
+					 */
+					const requiredVersionWarning = details => {
+						const error = new WebpackError(
+							`No required version specified and unable to automatically determine one. ${details}`
+						);
+						error.file = `shared module ${request}`;
+						compilation.warnings.push(error);
+					};
+					const directFallback =
+						config.import &&
+						/^(\.\.?(\/|$)|\/|[A-Za-z]:|\\\\)/.test(config.import);
+					return Promise.all([
+						new Promise(
+							/**
+							 * @param {(value?: string) => void} resolve resolve
+							 */
+							resolve => {
+								if (!config.import) {
+									resolve();
+									return;
+								}
+								const resolveContext = {
+									/** @type {LazySet} */
+									fileDependencies: new LazySet(),
+									/** @type {LazySet} */
+									contextDependencies: new LazySet(),
+									/** @type {LazySet} */
+									missingDependencies: new LazySet()
+								};
+								resolver.resolve(
+									{},
+									directFallback ? compiler.context : context,
+									config.import,
+									resolveContext,
+									(err, result) => {
+										compilation.contextDependencies.addAll(
+											resolveContext.contextDependencies
+										);
+										compilation.fileDependencies.addAll(
+											resolveContext.fileDependencies
+										);
+										compilation.missingDependencies.addAll(
+											resolveContext.missingDependencies
+										);
+										if (err) {
+											compilation.errors.push(
+												new ModuleNotFoundError(null, err, {
+													name: `resolving fallback for shared module ${request}`
+												})
+											);
+											return resolve();
+										}
+										resolve(/** @type {string} */ (result));
+									}
+								);
+							}
+						),
+						new Promise(
+							/**
+							 * @param {(value?: SemVerRange) => void} resolve resolve
+							 */
+							resolve => {
+								if (config.requiredVersion !== undefined) {
+									resolve(/** @type {SemVerRange} */ (config.requiredVersion));
+									return;
+								}
+								let packageName = config.packageName;
+								if (packageName === undefined) {
+									if (/^(\/|[A-Za-z]:|\\\\)/.test(request)) {
+										// For relative or absolute requests we don't automatically use a packageName.
+										// If wished one can specify one with the packageName option.
+										resolve();
+										return;
+									}
+									const match = /^((?:@[^\\/]+[\\/])?[^\\/]+)/.exec(request);
+									if (!match) {
+										requiredVersionWarning(
+											"Unable to extract the package name from request."
+										);
+										resolve();
+										return;
+									}
+									packageName = match[0];
+								}
+
+								getDescriptionFile(
+									compilation.inputFileSystem,
+									context,
+									["package.json"],
+									(err, result, checkedDescriptionFilePaths) => {
+										if (err) {
+											requiredVersionWarning(
+												`Unable to read description file: ${err}`
+											);
+											return resolve();
+										}
+										const { data } =
+											/** @type {DescriptionFile} */
+											(result || {});
+										if (!data) {
+											if (checkedDescriptionFilePaths) {
+												requiredVersionWarning(
+													[
+														`Unable to find required version for "${packageName}" in description file/s`,
+														checkedDescriptionFilePaths.join("\n"),
+														"It need to be in dependencies, devDependencies or peerDependencies."
+													].join("\n")
+												);
+											} else {
+												requiredVersionWarning(
+													`Unable to find description file in ${context}.`
+												);
+											}
+
+											return resolve();
+										}
+										if (data.name === packageName) {
+											// Package self-referencing
+											return resolve();
+										}
+										const requiredVersion =
+											getRequiredVersionFromDescriptionFile(data, packageName);
+
+										if (requiredVersion) {
+											return resolve(parseRange(requiredVersion));
+										}
+
+										resolve();
+									},
+									result => {
+										if (!result) return false;
+										const maybeRequiredVersion =
+											getRequiredVersionFromDescriptionFile(
+												result.data,
+												packageName
+											);
+										return (
+											result.data.name === packageName ||
+											typeof maybeRequiredVersion === "string"
+										);
+									}
+								);
+							}
+						)
+					]).then(
+						([importResolved, requiredVersion]) =>
+							new ConsumeSharedModule(
+								directFallback ? compiler.context : context,
+								{
+									...config,
+									importResolved,
+									import: importResolved ? config.import : undefined,
+									requiredVersion
+								}
+							)
+					);
+				};
+
+				normalModuleFactory.hooks.factorize.tapPromise(
+					PLUGIN_NAME,
+					({ context, request, dependencies }) =>
+						// wait for resolving to be complete
+						promise.then(() => {
+							if (
+								dependencies[0] instanceof ConsumeSharedFallbackDependency ||
+								dependencies[0] instanceof ProvideForSharedDependency
+							) {
+								return;
+							}
+							const match = unresolvedConsumes.get(request);
+							if (match !== undefined) {
+								return createConsumeSharedModule(context, request, match);
+							}
+							for (const [prefix, options] of prefixedConsumes) {
+								if (request.startsWith(prefix)) {
+									const remainder = request.slice(prefix.length);
+									return createConsumeSharedModule(context, request, {
+										...options,
+										import: options.import
+											? options.import + remainder
+											: undefined,
+										shareKey: options.shareKey + remainder
+									});
+								}
+							}
+						})
+				);
+				normalModuleFactory.hooks.createModule.tapPromise(
+					PLUGIN_NAME,
+					({ resource }, { context, dependencies }) => {
+						if (
+							dependencies[0] instanceof ConsumeSharedFallbackDependency ||
+							dependencies[0] instanceof ProvideForSharedDependency
+						) {
+							return Promise.resolve();
+						}
+						const options = resolvedConsumes.get(
+							/** @type {string} */ (resource)
+						);
+						if (options !== undefined) {
+							return createConsumeSharedModule(
+								context,
+								/** @type {string} */ (resource),
+								options
+							);
+						}
+						return Promise.resolve();
+					}
+				);
+				compilation.hooks.additionalTreeRuntimeRequirements.tap(
+					PLUGIN_NAME,
+					(chunk, set) => {
+						set.add(RuntimeGlobals.module);
+						set.add(RuntimeGlobals.moduleCache);
+						set.add(RuntimeGlobals.moduleFactoriesAddOnly);
+						set.add(RuntimeGlobals.shareScopeMap);
+						set.add(RuntimeGlobals.initializeSharing);
+						set.add(RuntimeGlobals.hasOwnProperty);
+						compilation.addRuntimeModule(
+							chunk,
+							new ConsumeSharedRuntimeModule(set)
+						);
+					}
+				);
+			}
+		);
+	}
+}
+
+module.exports = ConsumeSharedPlugin;
diff --git a/lib/sharing/ConsumeSharedRuntimeModule.js b/lib/sharing/ConsumeSharedRuntimeModule.js
new file mode 100644
index 00000000000..095d24c099b
--- /dev/null
+++ b/lib/sharing/ConsumeSharedRuntimeModule.js
@@ -0,0 +1,355 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+const Template = require("../Template");
+const {
+	parseVersionRuntimeCode,
+	versionLtRuntimeCode,
+	rangeToStringRuntimeCode,
+	satisfyRuntimeCode
+} = require("../util/semver");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Chunk").ChunkId} ChunkId */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../ChunkGraph").ModuleId} ModuleId */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../Module").ReadOnlyRuntimeRequirements} ReadOnlyRuntimeRequirements */
+/** @typedef {import("./ConsumeSharedModule")} ConsumeSharedModule */
+
+class ConsumeSharedRuntimeModule extends RuntimeModule {
+	/**
+	 * @param {ReadOnlyRuntimeRequirements} runtimeRequirements runtime requirements
+	 */
+	constructor(runtimeRequirements) {
+		super("consumes", RuntimeModule.STAGE_ATTACH);
+		this._runtimeRequirements = runtimeRequirements;
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const chunkGraph = /** @type {ChunkGraph} */ (this.chunkGraph);
+		const { runtimeTemplate, codeGenerationResults } = compilation;
+		/** @type {Record} */
+		const chunkToModuleMapping = {};
+		/** @type {Map} */
+		const moduleIdToSourceMapping = new Map();
+		/** @type {(string | number)[]} */
+		const initialConsumes = [];
+		/**
+		 * @param {Iterable} modules modules
+		 * @param {Chunk} chunk the chunk
+		 * @param {(string | number)[]} list list of ids
+		 */
+		const addModules = (modules, chunk, list) => {
+			for (const m of modules) {
+				const module = m;
+				const id = /** @type {ModuleId} */ (chunkGraph.getModuleId(module));
+				list.push(id);
+				moduleIdToSourceMapping.set(
+					id,
+					codeGenerationResults.getSource(
+						module,
+						chunk.runtime,
+						"consume-shared"
+					)
+				);
+			}
+		};
+		for (const chunk of /** @type {Chunk} */ (
+			this.chunk
+		).getAllReferencedChunks()) {
+			const modules = chunkGraph.getChunkModulesIterableBySourceType(
+				chunk,
+				"consume-shared"
+			);
+			if (!modules) continue;
+			addModules(
+				modules,
+				chunk,
+				(chunkToModuleMapping[/** @type {ChunkId} */ (chunk.id)] = [])
+			);
+		}
+		for (const chunk of /** @type {Chunk} */ (
+			this.chunk
+		).getAllInitialChunks()) {
+			const modules = chunkGraph.getChunkModulesIterableBySourceType(
+				chunk,
+				"consume-shared"
+			);
+			if (!modules) continue;
+			addModules(modules, chunk, initialConsumes);
+		}
+		if (moduleIdToSourceMapping.size === 0) return null;
+		return Template.asString([
+			parseVersionRuntimeCode(runtimeTemplate),
+			versionLtRuntimeCode(runtimeTemplate),
+			rangeToStringRuntimeCode(runtimeTemplate),
+			satisfyRuntimeCode(runtimeTemplate),
+			`var exists = ${runtimeTemplate.basicFunction("scope, key", [
+				`return scope && ${RuntimeGlobals.hasOwnProperty}(scope, key);`
+			])}`,
+			`var get = ${runtimeTemplate.basicFunction("entry", [
+				"entry.loaded = 1;",
+				"return entry.get()"
+			])};`,
+			`var eagerOnly = ${runtimeTemplate.basicFunction("versions", [
+				`return Object.keys(versions).reduce(${runtimeTemplate.basicFunction(
+					"filtered, version",
+					Template.indent([
+						"if (versions[version].eager) {",
+						Template.indent(["filtered[version] = versions[version];"]),
+						"}",
+						"return filtered;"
+					])
+				)}, {});`
+			])};`,
+			`var findLatestVersion = ${runtimeTemplate.basicFunction(
+				"scope, key, eager",
+				[
+					"var versions = eager ? eagerOnly(scope[key]) : scope[key];",
+					`var key = Object.keys(versions).reduce(${runtimeTemplate.basicFunction(
+						"a, b",
+						["return !a || versionLt(a, b) ? b : a;"]
+					)}, 0);`,
+					"return key && versions[key];"
+				]
+			)};`,
+			`var findSatisfyingVersion = ${runtimeTemplate.basicFunction(
+				"scope, key, requiredVersion, eager",
+				[
+					"var versions = eager ? eagerOnly(scope[key]) : scope[key];",
+					`var key = Object.keys(versions).reduce(${runtimeTemplate.basicFunction(
+						"a, b",
+						[
+							"if (!satisfy(requiredVersion, b)) return a;",
+							"return !a || versionLt(a, b) ? b : a;"
+						]
+					)}, 0);`,
+					"return key && versions[key]"
+				]
+			)};`,
+			`var findSingletonVersionKey = ${runtimeTemplate.basicFunction(
+				"scope, key, eager",
+				[
+					"var versions = eager ? eagerOnly(scope[key]) : scope[key];",
+					`return Object.keys(versions).reduce(${runtimeTemplate.basicFunction(
+						"a, b",
+						["return !a || (!versions[a].loaded && versionLt(a, b)) ? b : a;"]
+					)}, 0);`
+				]
+			)};`,
+			`var getInvalidSingletonVersionMessage = ${runtimeTemplate.basicFunction(
+				"scope, key, version, requiredVersion",
+				[
+					'return "Unsatisfied version " + version + " from " + (version && scope[key][version].from) + " of shared singleton module " + key + " (required " + rangeToString(requiredVersion) + ")"'
+				]
+			)};`,
+			`var getInvalidVersionMessage = ${runtimeTemplate.basicFunction(
+				"scope, scopeName, key, requiredVersion, eager",
+				[
+					"var versions = scope[key];",
+					'return "No satisfying version (" + rangeToString(requiredVersion) + ")" + (eager ? " for eager consumption" : "") + " of shared module " + key + " found in shared scope " + scopeName + ".\\n" +',
+					`\t"Available versions: " + Object.keys(versions).map(${runtimeTemplate.basicFunction(
+						"key",
+						['return key + " from " + versions[key].from;']
+					)}).join(", ");`
+				]
+			)};`,
+			`var fail = ${runtimeTemplate.basicFunction("msg", [
+				"throw new Error(msg);"
+			])}`,
+			`var failAsNotExist = ${runtimeTemplate.basicFunction("scopeName, key", [
+				'return fail("Shared module " + key + " doesn\'t exist in shared scope " + scopeName);'
+			])}`,
+			`var warn = /*#__PURE__*/ ${
+				compilation.outputOptions.ignoreBrowserWarnings
+					? runtimeTemplate.basicFunction("", "")
+					: runtimeTemplate.basicFunction("msg", [
+							'if (typeof console !== "undefined" && console.warn) console.warn(msg);'
+						])
+			};`,
+			`var init = ${runtimeTemplate.returningFunction(
+				Template.asString([
+					"function(scopeName, key, eager, c, d) {",
+					Template.indent([
+						`var promise = ${RuntimeGlobals.initializeSharing}(scopeName);`,
+						// if we require eager shared, we expect it to be already loaded before it requested, no need to wait the whole scope loaded.
+						"if (promise && promise.then && !eager) { ",
+						Template.indent([
+							`return promise.then(fn.bind(fn, scopeName, ${RuntimeGlobals.shareScopeMap}[scopeName], key, false, c, d));`
+						]),
+						"}",
+						`return fn(scopeName, ${RuntimeGlobals.shareScopeMap}[scopeName], key, eager, c, d);`
+					]),
+					"}"
+				]),
+				"fn"
+			)};`,
+			"",
+			`var useFallback = ${runtimeTemplate.basicFunction(
+				"scopeName, key, fallback",
+				["return fallback ? fallback() : failAsNotExist(scopeName, key);"]
+			)}`,
+			`var load = /*#__PURE__*/ init(${runtimeTemplate.basicFunction(
+				"scopeName, scope, key, eager, fallback",
+				[
+					"if (!exists(scope, key)) return useFallback(scopeName, key, fallback);",
+					"return get(findLatestVersion(scope, key, eager));"
+				]
+			)});`,
+			`var loadVersion = /*#__PURE__*/ init(${runtimeTemplate.basicFunction(
+				"scopeName, scope, key, eager, requiredVersion, fallback",
+				[
+					"if (!exists(scope, key)) return useFallback(scopeName, key, fallback);",
+					"var satisfyingVersion = findSatisfyingVersion(scope, key, requiredVersion, eager);",
+					"if (satisfyingVersion) return get(satisfyingVersion);",
+					"warn(getInvalidVersionMessage(scope, scopeName, key, requiredVersion, eager))",
+					"return get(findLatestVersion(scope, key, eager));"
+				]
+			)});`,
+			`var loadStrictVersion = /*#__PURE__*/ init(${runtimeTemplate.basicFunction(
+				"scopeName, scope, key, eager, requiredVersion, fallback",
+				[
+					"if (!exists(scope, key)) return useFallback(scopeName, key, fallback);",
+					"var satisfyingVersion = findSatisfyingVersion(scope, key, requiredVersion, eager);",
+					"if (satisfyingVersion) return get(satisfyingVersion);",
+					"if (fallback) return fallback();",
+					"fail(getInvalidVersionMessage(scope, scopeName, key, requiredVersion, eager));"
+				]
+			)});`,
+			`var loadSingleton = /*#__PURE__*/ init(${runtimeTemplate.basicFunction(
+				"scopeName, scope, key, eager, fallback",
+				[
+					"if (!exists(scope, key)) return useFallback(scopeName, key, fallback);",
+					"var version = findSingletonVersionKey(scope, key, eager);",
+					"return get(scope[key][version]);"
+				]
+			)});`,
+			`var loadSingletonVersion = /*#__PURE__*/ init(${runtimeTemplate.basicFunction(
+				"scopeName, scope, key, eager, requiredVersion, fallback",
+				[
+					"if (!exists(scope, key)) return useFallback(scopeName, key, fallback);",
+					"var version = findSingletonVersionKey(scope, key, eager);",
+					"if (!satisfy(requiredVersion, version)) {",
+					Template.indent([
+						"warn(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion));"
+					]),
+					"}",
+					"return get(scope[key][version]);"
+				]
+			)});`,
+			`var loadStrictSingletonVersion = /*#__PURE__*/ init(${runtimeTemplate.basicFunction(
+				"scopeName, scope, key, eager, requiredVersion, fallback",
+				[
+					"if (!exists(scope, key)) return useFallback(scopeName, key, fallback);",
+					"var version = findSingletonVersionKey(scope, key, eager);",
+					"if (!satisfy(requiredVersion, version)) {",
+					Template.indent([
+						"fail(getInvalidSingletonVersionMessage(scope, key, version, requiredVersion));"
+					]),
+					"}",
+					"return get(scope[key][version]);"
+				]
+			)});`,
+			"var installedModules = {};",
+			"var moduleToHandlerMapping = {",
+			Template.indent(
+				Array.from(
+					moduleIdToSourceMapping,
+					([key, source]) => `${JSON.stringify(key)}: ${source.source()}`
+				).join(",\n")
+			),
+			"};",
+
+			initialConsumes.length > 0
+				? Template.asString([
+						`var initialConsumes = ${JSON.stringify(initialConsumes)};`,
+						`initialConsumes.forEach(${runtimeTemplate.basicFunction("id", [
+							`${
+								RuntimeGlobals.moduleFactories
+							}[id] = ${runtimeTemplate.basicFunction("module", [
+								"// Handle case when module is used sync",
+								"installedModules[id] = 0;",
+								`delete ${RuntimeGlobals.moduleCache}[id];`,
+								"var factory = moduleToHandlerMapping[id]();",
+								'if(typeof factory !== "function") throw new Error("Shared module is not available for eager consumption: " + id);',
+								"module.exports = factory();"
+							])}`
+						])});`
+					])
+				: "// no consumes in initial chunks",
+			this._runtimeRequirements.has(RuntimeGlobals.ensureChunkHandlers)
+				? Template.asString([
+						`var chunkMapping = ${JSON.stringify(
+							chunkToModuleMapping,
+							null,
+							"\t"
+						)};`,
+						"var startedInstallModules = {};",
+						`${
+							RuntimeGlobals.ensureChunkHandlers
+						}.consumes = ${runtimeTemplate.basicFunction("chunkId, promises", [
+							`if(${RuntimeGlobals.hasOwnProperty}(chunkMapping, chunkId)) {`,
+							Template.indent([
+								`chunkMapping[chunkId].forEach(${runtimeTemplate.basicFunction(
+									"id",
+									[
+										`if(${RuntimeGlobals.hasOwnProperty}(installedModules, id)) return promises.push(installedModules[id]);`,
+										"if(!startedInstallModules[id]) {",
+										`var onFactory = ${runtimeTemplate.basicFunction(
+											"factory",
+											[
+												"installedModules[id] = 0;",
+												`${
+													RuntimeGlobals.moduleFactories
+												}[id] = ${runtimeTemplate.basicFunction("module", [
+													`delete ${RuntimeGlobals.moduleCache}[id];`,
+													"module.exports = factory();"
+												])}`
+											]
+										)};`,
+										"startedInstallModules[id] = true;",
+										`var onError = ${runtimeTemplate.basicFunction("error", [
+											"delete installedModules[id];",
+											`${
+												RuntimeGlobals.moduleFactories
+											}[id] = ${runtimeTemplate.basicFunction("module", [
+												`delete ${RuntimeGlobals.moduleCache}[id];`,
+												"throw error;"
+											])}`
+										])};`,
+										"try {",
+										Template.indent([
+											"var promise = moduleToHandlerMapping[id]();",
+											"if(promise.then) {",
+											Template.indent(
+												"promises.push(installedModules[id] = promise.then(onFactory)['catch'](onError));"
+											),
+											"} else onFactory(promise);"
+										]),
+										"} catch(e) { onError(e); }",
+										"}"
+									]
+								)});`
+							]),
+							"}"
+						])}`
+					])
+				: "// no chunk loading of consumes"
+		]);
+	}
+}
+
+module.exports = ConsumeSharedRuntimeModule;
diff --git a/lib/sharing/ProvideForSharedDependency.js b/lib/sharing/ProvideForSharedDependency.js
new file mode 100644
index 00000000000..4de679a6a74
--- /dev/null
+++ b/lib/sharing/ProvideForSharedDependency.js
@@ -0,0 +1,33 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const ModuleDependency = require("../dependencies/ModuleDependency");
+const makeSerializable = require("../util/makeSerializable");
+
+class ProvideForSharedDependency extends ModuleDependency {
+	/**
+	 * @param {string} request request string
+	 */
+	constructor(request) {
+		super(request);
+	}
+
+	get type() {
+		return "provide module for shared";
+	}
+
+	get category() {
+		return "esm";
+	}
+}
+
+makeSerializable(
+	ProvideForSharedDependency,
+	"webpack/lib/sharing/ProvideForSharedDependency"
+);
+
+module.exports = ProvideForSharedDependency;
diff --git a/lib/sharing/ProvideSharedDependency.js b/lib/sharing/ProvideSharedDependency.js
new file mode 100644
index 00000000000..2df18a618ed
--- /dev/null
+++ b/lib/sharing/ProvideSharedDependency.js
@@ -0,0 +1,80 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const Dependency = require("../Dependency");
+const makeSerializable = require("../util/makeSerializable");
+
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+
+class ProvideSharedDependency extends Dependency {
+	/**
+	 * @param {string} shareScope share scope
+	 * @param {string} name module name
+	 * @param {string | false} version version
+	 * @param {string} request request
+	 * @param {boolean} eager true, if this is an eager dependency
+	 */
+	constructor(shareScope, name, version, request, eager) {
+		super();
+		this.shareScope = shareScope;
+		this.name = name;
+		this.version = version;
+		this.request = request;
+		this.eager = eager;
+	}
+
+	get type() {
+		return "provide shared module";
+	}
+
+	/**
+	 * @returns {string | null} an identifier to merge equal requests
+	 */
+	getResourceIdentifier() {
+		return `provide module (${this.shareScope}) ${this.request} as ${
+			this.name
+		} @ ${this.version}${this.eager ? " (eager)" : ""}`;
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		context.write(this.shareScope);
+		context.write(this.name);
+		context.write(this.request);
+		context.write(this.version);
+		context.write(this.eager);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 * @returns {ProvideSharedDependency} deserialize fallback dependency
+	 */
+	static deserialize(context) {
+		const { read } = context;
+		const obj = new ProvideSharedDependency(
+			read(),
+			read(),
+			read(),
+			read(),
+			read()
+		);
+		this.shareScope = context.read();
+		obj.deserialize(context);
+		return obj;
+	}
+}
+
+makeSerializable(
+	ProvideSharedDependency,
+	"webpack/lib/sharing/ProvideSharedDependency"
+);
+
+module.exports = ProvideSharedDependency;
diff --git a/lib/sharing/ProvideSharedModule.js b/lib/sharing/ProvideSharedModule.js
new file mode 100644
index 00000000000..1e67f79f4e0
--- /dev/null
+++ b/lib/sharing/ProvideSharedModule.js
@@ -0,0 +1,196 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra and Zackary Jackson @ScriptedAlchemy
+*/
+
+"use strict";
+
+const AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
+const Module = require("../Module");
+const { SHARED_INIT_TYPES } = require("../ModuleSourceTypesConstants");
+const { WEBPACK_MODULE_TYPE_PROVIDE } = require("../ModuleTypeConstants");
+const RuntimeGlobals = require("../RuntimeGlobals");
+const makeSerializable = require("../util/makeSerializable");
+const ProvideForSharedDependency = require("./ProvideForSharedDependency");
+
+/** @typedef {import("../../declarations/WebpackOptions").WebpackOptionsNormalized} WebpackOptions */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../ChunkGroup")} ChunkGroup */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Module").BuildCallback} BuildCallback */
+/** @typedef {import("../Module").CodeGenerationContext} CodeGenerationContext */
+/** @typedef {import("../Module").CodeGenerationResult} CodeGenerationResult */
+/** @typedef {import("../Module").LibIdentOptions} LibIdentOptions */
+/** @typedef {import("../Module").NeedBuildCallback} NeedBuildCallback */
+/** @typedef {import("../Module").NeedBuildContext} NeedBuildContext */
+/** @typedef {import("../Module").SourceTypes} SourceTypes */
+/** @typedef {import("../RequestShortener")} RequestShortener */
+/** @typedef {import("../ResolverFactory").ResolverWithOptions} ResolverWithOptions */
+/** @typedef {import("../WebpackError")} WebpackError */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
+/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
+/** @typedef {import("../util/Hash")} Hash */
+/** @typedef {import("../util/fs").InputFileSystem} InputFileSystem */
+
+class ProvideSharedModule extends Module {
+	/**
+	 * @param {string} shareScope shared scope name
+	 * @param {string} name shared key
+	 * @param {string | false} version version
+	 * @param {string} request request to the provided module
+	 * @param {boolean} eager include the module in sync way
+	 */
+	constructor(shareScope, name, version, request, eager) {
+		super(WEBPACK_MODULE_TYPE_PROVIDE);
+		this._shareScope = shareScope;
+		this._name = name;
+		this._version = version;
+		this._request = request;
+		this._eager = eager;
+	}
+
+	/**
+	 * @returns {string} a unique identifier of the module
+	 */
+	identifier() {
+		return `provide module (${this._shareScope}) ${this._name}@${this._version} = ${this._request}`;
+	}
+
+	/**
+	 * @param {RequestShortener} requestShortener the request shortener
+	 * @returns {string} a user readable identifier of the module
+	 */
+	readableIdentifier(requestShortener) {
+		return `provide shared module (${this._shareScope}) ${this._name}@${
+			this._version
+		} = ${requestShortener.shorten(this._request)}`;
+	}
+
+	/**
+	 * @param {LibIdentOptions} options options
+	 * @returns {string | null} an identifier for library inclusion
+	 */
+	libIdent(options) {
+		return `${this.layer ? `(${this.layer})/` : ""}webpack/sharing/provide/${
+			this._shareScope
+		}/${this._name}`;
+	}
+
+	/**
+	 * @param {NeedBuildContext} context context info
+	 * @param {NeedBuildCallback} callback callback function, returns true, if the module needs a rebuild
+	 * @returns {void}
+	 */
+	needBuild(context, callback) {
+		callback(null, !this.buildInfo);
+	}
+
+	/**
+	 * @param {WebpackOptions} options webpack options
+	 * @param {Compilation} compilation the compilation
+	 * @param {ResolverWithOptions} resolver the resolver
+	 * @param {InputFileSystem} fs the file system
+	 * @param {BuildCallback} callback callback function
+	 * @returns {void}
+	 */
+	build(options, compilation, resolver, fs, callback) {
+		this.buildMeta = {};
+		this.buildInfo = {
+			strict: true
+		};
+
+		this.clearDependenciesAndBlocks();
+		const dep = new ProvideForSharedDependency(this._request);
+		if (this._eager) {
+			this.addDependency(dep);
+		} else {
+			const block = new AsyncDependenciesBlock({});
+			block.addDependency(dep);
+			this.addBlock(block);
+		}
+
+		callback();
+	}
+
+	/**
+	 * @param {string=} type the source type for which the size should be estimated
+	 * @returns {number} the estimated size of the module (must be non-zero)
+	 */
+	size(type) {
+		return 42;
+	}
+
+	/**
+	 * @returns {SourceTypes} types available (do not mutate)
+	 */
+	getSourceTypes() {
+		return SHARED_INIT_TYPES;
+	}
+
+	/**
+	 * @param {CodeGenerationContext} context context for code generation
+	 * @returns {CodeGenerationResult} result
+	 */
+	codeGeneration({ runtimeTemplate, moduleGraph, chunkGraph }) {
+		const runtimeRequirements = new Set([RuntimeGlobals.initializeSharing]);
+		const code = `register(${JSON.stringify(this._name)}, ${JSON.stringify(
+			this._version || "0"
+		)}, ${
+			this._eager
+				? runtimeTemplate.syncModuleFactory({
+						dependency: this.dependencies[0],
+						chunkGraph,
+						request: this._request,
+						runtimeRequirements
+					})
+				: runtimeTemplate.asyncModuleFactory({
+						block: this.blocks[0],
+						chunkGraph,
+						request: this._request,
+						runtimeRequirements
+					})
+		}${this._eager ? ", 1" : ""});`;
+		const sources = new Map();
+		const data = new Map();
+		data.set("share-init", [
+			{
+				shareScope: this._shareScope,
+				initStage: 10,
+				init: code
+			}
+		]);
+		return { sources, data, runtimeRequirements };
+	}
+
+	/**
+	 * @param {ObjectSerializerContext} context context
+	 */
+	serialize(context) {
+		const { write } = context;
+		write(this._shareScope);
+		write(this._name);
+		write(this._version);
+		write(this._request);
+		write(this._eager);
+		super.serialize(context);
+	}
+
+	/**
+	 * @param {ObjectDeserializerContext} context context
+	 * @returns {ProvideSharedModule} deserialize fallback dependency
+	 */
+	static deserialize(context) {
+		const { read } = context;
+		const obj = new ProvideSharedModule(read(), read(), read(), read(), read());
+		obj.deserialize(context);
+		return obj;
+	}
+}
+
+makeSerializable(
+	ProvideSharedModule,
+	"webpack/lib/sharing/ProvideSharedModule"
+);
+
+module.exports = ProvideSharedModule;
diff --git a/lib/sharing/ProvideSharedModuleFactory.js b/lib/sharing/ProvideSharedModuleFactory.js
new file mode 100644
index 00000000000..b10b8f3996e
--- /dev/null
+++ b/lib/sharing/ProvideSharedModuleFactory.js
@@ -0,0 +1,37 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra and Zackary Jackson @ScriptedAlchemy
+*/
+
+"use strict";
+
+const ModuleFactory = require("../ModuleFactory");
+const ProvideSharedModule = require("./ProvideSharedModule");
+
+/** @typedef {import("../ModuleFactory").ModuleFactoryCallback} ModuleFactoryCallback */
+/** @typedef {import("../ModuleFactory").ModuleFactoryCreateData} ModuleFactoryCreateData */
+/** @typedef {import("./ProvideSharedDependency")} ProvideSharedDependency */
+
+class ProvideSharedModuleFactory extends ModuleFactory {
+	/**
+	 * @param {ModuleFactoryCreateData} data data object
+	 * @param {ModuleFactoryCallback} callback callback
+	 * @returns {void}
+	 */
+	create(data, callback) {
+		const dep =
+			/** @type {ProvideSharedDependency} */
+			(data.dependencies[0]);
+		callback(null, {
+			module: new ProvideSharedModule(
+				dep.shareScope,
+				dep.name,
+				dep.version,
+				dep.request,
+				dep.eager
+			)
+		});
+	}
+}
+
+module.exports = ProvideSharedModuleFactory;
diff --git a/lib/sharing/ProvideSharedPlugin.js b/lib/sharing/ProvideSharedPlugin.js
new file mode 100644
index 00000000000..b4977e6b026
--- /dev/null
+++ b/lib/sharing/ProvideSharedPlugin.js
@@ -0,0 +1,248 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra and Zackary Jackson @ScriptedAlchemy
+*/
+
+"use strict";
+
+const WebpackError = require("../WebpackError");
+const { parseOptions } = require("../container/options");
+const createSchemaValidation = require("../util/create-schema-validation");
+const ProvideForSharedDependency = require("./ProvideForSharedDependency");
+const ProvideSharedDependency = require("./ProvideSharedDependency");
+const ProvideSharedModuleFactory = require("./ProvideSharedModuleFactory");
+
+/** @typedef {import("../../declarations/plugins/sharing/ProvideSharedPlugin").ProvideSharedPluginOptions} ProvideSharedPluginOptions */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../NormalModuleFactory").NormalModuleCreateData} NormalModuleCreateData */
+
+const validate = createSchemaValidation(
+	require("../../schemas/plugins/sharing/ProvideSharedPlugin.check.js"),
+	() => require("../../schemas/plugins/sharing/ProvideSharedPlugin.json"),
+	{
+		name: "Provide Shared Plugin",
+		baseDataPath: "options"
+	}
+);
+
+/**
+ * @typedef {object} ProvideOptions
+ * @property {string} shareKey
+ * @property {string} shareScope
+ * @property {string | undefined | false} version
+ * @property {boolean} eager
+ */
+
+/** @typedef {Map} ResolvedProvideMap */
+
+const PLUGIN_NAME = "ProvideSharedPlugin";
+
+class ProvideSharedPlugin {
+	/**
+	 * @param {ProvideSharedPluginOptions} options options
+	 */
+	constructor(options) {
+		validate(options);
+
+		this._provides = /** @type {[string, ProvideOptions][]} */ (
+			parseOptions(
+				options.provides,
+				item => {
+					if (Array.isArray(item))
+						throw new Error("Unexpected array of provides");
+					/** @type {ProvideOptions} */
+					const result = {
+						shareKey: item,
+						version: undefined,
+						shareScope: options.shareScope || "default",
+						eager: false
+					};
+					return result;
+				},
+				item => ({
+					shareKey: item.shareKey,
+					version: item.version,
+					shareScope: item.shareScope || options.shareScope || "default",
+					eager: Boolean(item.eager)
+				})
+			)
+		);
+		this._provides.sort(([a], [b]) => {
+			if (a < b) return -1;
+			if (b < a) return 1;
+			return 0;
+		});
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		/** @type {WeakMap} */
+		const compilationData = new WeakMap();
+
+		compiler.hooks.compilation.tap(
+			PLUGIN_NAME,
+			(compilation, { normalModuleFactory }) => {
+				/** @type {ResolvedProvideMap} */
+				const resolvedProvideMap = new Map();
+				/** @type {Map} */
+				const matchProvides = new Map();
+				/** @type {Map} */
+				const prefixMatchProvides = new Map();
+				for (const [request, config] of this._provides) {
+					if (/^(\/|[A-Za-z]:\\|\\\\|\.\.?(\/|$))/.test(request)) {
+						// relative request
+						resolvedProvideMap.set(request, {
+							config,
+							version: config.version
+						});
+					} else if (/^(\/|[A-Za-z]:\\|\\\\)/.test(request)) {
+						// absolute path
+						resolvedProvideMap.set(request, {
+							config,
+							version: config.version
+						});
+					} else if (request.endsWith("/")) {
+						// module request prefix
+						prefixMatchProvides.set(request, config);
+					} else {
+						// module request
+						matchProvides.set(request, config);
+					}
+				}
+				compilationData.set(compilation, resolvedProvideMap);
+				/**
+				 * @param {string} key key
+				 * @param {ProvideOptions} config config
+				 * @param {NormalModuleCreateData["resource"]} resource resource
+				 * @param {NormalModuleCreateData["resourceResolveData"]} resourceResolveData resource resolve data
+				 */
+				const provideSharedModule = (
+					key,
+					config,
+					resource,
+					resourceResolveData
+				) => {
+					let version = config.version;
+					if (version === undefined) {
+						let details = "";
+						if (!resourceResolveData) {
+							details = "No resolve data provided from resolver.";
+						} else {
+							const descriptionFileData =
+								resourceResolveData.descriptionFileData;
+							if (!descriptionFileData) {
+								details =
+									"No description file (usually package.json) found. Add description file with name and version, or manually specify version in shared config.";
+							} else if (!descriptionFileData.version) {
+								details = `No version in description file (usually package.json). Add version to description file ${resourceResolveData.descriptionFilePath}, or manually specify version in shared config.`;
+							} else {
+								version = /** @type {string | false | undefined} */ (
+									descriptionFileData.version
+								);
+							}
+						}
+						if (!version) {
+							const error = new WebpackError(
+								`No version specified and unable to automatically determine one. ${details}`
+							);
+							error.file = `shared module ${key} -> ${resource}`;
+							compilation.warnings.push(error);
+						}
+					}
+					resolvedProvideMap.set(resource, {
+						config,
+						version
+					});
+				};
+				normalModuleFactory.hooks.module.tap(
+					PLUGIN_NAME,
+					(module, { resource, resourceResolveData }, resolveData) => {
+						if (resolvedProvideMap.has(/** @type {string} */ (resource))) {
+							return module;
+						}
+						const { request } = resolveData;
+						{
+							const config = matchProvides.get(request);
+							if (config !== undefined) {
+								provideSharedModule(
+									request,
+									config,
+									/** @type {string} */ (resource),
+									resourceResolveData
+								);
+								resolveData.cacheable = false;
+							}
+						}
+						for (const [prefix, config] of prefixMatchProvides) {
+							if (request.startsWith(prefix)) {
+								const remainder = request.slice(prefix.length);
+								provideSharedModule(
+									/** @type {string} */ (resource),
+									{
+										...config,
+										shareKey: config.shareKey + remainder
+									},
+									/** @type {string} */ (resource),
+									resourceResolveData
+								);
+								resolveData.cacheable = false;
+							}
+						}
+						return module;
+					}
+				);
+			}
+		);
+		compiler.hooks.finishMake.tapPromise(PLUGIN_NAME, compilation => {
+			const resolvedProvideMap = compilationData.get(compilation);
+			if (!resolvedProvideMap) return Promise.resolve();
+			return Promise.all(
+				Array.from(
+					resolvedProvideMap,
+					([resource, { config, version }]) =>
+						new Promise((resolve, reject) => {
+							compilation.addInclude(
+								compiler.context,
+								new ProvideSharedDependency(
+									config.shareScope,
+									config.shareKey,
+									version || false,
+									resource,
+									config.eager
+								),
+								{
+									name: undefined
+								},
+								err => {
+									if (err) return reject(err);
+									resolve(null);
+								}
+							);
+						})
+				)
+			).then(() => {});
+		});
+
+		compiler.hooks.compilation.tap(
+			PLUGIN_NAME,
+			(compilation, { normalModuleFactory }) => {
+				compilation.dependencyFactories.set(
+					ProvideForSharedDependency,
+					normalModuleFactory
+				);
+
+				compilation.dependencyFactories.set(
+					ProvideSharedDependency,
+					new ProvideSharedModuleFactory()
+				);
+			}
+		);
+	}
+}
+
+module.exports = ProvideSharedPlugin;
diff --git a/lib/sharing/SharePlugin.js b/lib/sharing/SharePlugin.js
new file mode 100644
index 00000000000..65935b30b99
--- /dev/null
+++ b/lib/sharing/SharePlugin.js
@@ -0,0 +1,92 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra and Zackary Jackson @ScriptedAlchemy
+*/
+
+"use strict";
+
+const { parseOptions } = require("../container/options");
+const ConsumeSharedPlugin = require("./ConsumeSharedPlugin");
+const ProvideSharedPlugin = require("./ProvideSharedPlugin");
+const { isRequiredVersion } = require("./utils");
+
+/** @typedef {import("../../declarations/plugins/sharing/ConsumeSharedPlugin").ConsumeSharedPluginOptions} ConsumeSharedPluginOptions */
+/** @typedef {import("../../declarations/plugins/sharing/ConsumeSharedPlugin").ConsumesConfig} ConsumesConfig */
+/** @typedef {import("../../declarations/plugins/sharing/ProvideSharedPlugin").ProvideSharedPluginOptions} ProvideSharedPluginOptions */
+/** @typedef {import("../../declarations/plugins/sharing/ProvideSharedPlugin").ProvidesConfig} ProvidesConfig */
+/** @typedef {import("../../declarations/plugins/sharing/SharePlugin").SharePluginOptions} SharePluginOptions */
+/** @typedef {import("../../declarations/plugins/sharing/SharePlugin").SharedConfig} SharedConfig */
+/** @typedef {import("../Compiler")} Compiler */
+
+class SharePlugin {
+	/**
+	 * @param {SharePluginOptions} options options
+	 */
+	constructor(options) {
+		/** @type {[string, SharedConfig][]} */
+		const sharedOptions = parseOptions(
+			options.shared,
+			(item, key) => {
+				if (typeof item !== "string")
+					throw new Error("Unexpected array in shared");
+				/** @type {SharedConfig} */
+				const config =
+					item === key || !isRequiredVersion(item)
+						? {
+								import: item
+							}
+						: {
+								import: key,
+								requiredVersion: item
+							};
+				return config;
+			},
+			item => item
+		);
+		/** @type {Record[]} */
+		const consumes = sharedOptions.map(([key, options]) => ({
+			[key]: {
+				import: options.import,
+				shareKey: options.shareKey || key,
+				shareScope: options.shareScope,
+				requiredVersion: options.requiredVersion,
+				strictVersion: options.strictVersion,
+				singleton: options.singleton,
+				packageName: options.packageName,
+				eager: options.eager
+			}
+		}));
+		/** @type {Record[]} */
+		const provides = sharedOptions
+			.filter(([, options]) => options.import !== false)
+			.map(([key, options]) => ({
+				[options.import || key]: {
+					shareKey: options.shareKey || key,
+					shareScope: options.shareScope,
+					version: options.version,
+					eager: options.eager
+				}
+			}));
+		this._shareScope = options.shareScope;
+		this._consumes = consumes;
+		this._provides = provides;
+	}
+
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		new ConsumeSharedPlugin({
+			shareScope: this._shareScope,
+			consumes: this._consumes
+		}).apply(compiler);
+		new ProvideSharedPlugin({
+			shareScope: this._shareScope,
+			provides: this._provides
+		}).apply(compiler);
+	}
+}
+
+module.exports = SharePlugin;
diff --git a/lib/sharing/ShareRuntimeModule.js b/lib/sharing/ShareRuntimeModule.js
new file mode 100644
index 00000000000..0f63ef68d7d
--- /dev/null
+++ b/lib/sharing/ShareRuntimeModule.js
@@ -0,0 +1,151 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const RuntimeGlobals = require("../RuntimeGlobals");
+const RuntimeModule = require("../RuntimeModule");
+const Template = require("../Template");
+const {
+	compareModulesByIdentifier,
+	compareStrings
+} = require("../util/comparators");
+
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../ChunkGraph")} ChunkGraph */
+/** @typedef {import("../Compilation")} Compilation */
+
+class ShareRuntimeModule extends RuntimeModule {
+	constructor() {
+		super("sharing");
+	}
+
+	/**
+	 * @returns {string | null} runtime code
+	 */
+	generate() {
+		const compilation = /** @type {Compilation} */ (this.compilation);
+		const {
+			runtimeTemplate,
+			codeGenerationResults,
+			outputOptions: { uniqueName, ignoreBrowserWarnings }
+		} = compilation;
+		const chunkGraph = /** @type {ChunkGraph} */ (this.chunkGraph);
+		/** @type {Map>>} */
+		const initCodePerScope = new Map();
+		for (const chunk of /** @type {Chunk} */ (
+			this.chunk
+		).getAllReferencedChunks()) {
+			const modules = chunkGraph.getOrderedChunkModulesIterableBySourceType(
+				chunk,
+				"share-init",
+				compareModulesByIdentifier
+			);
+			if (!modules) continue;
+			for (const m of modules) {
+				const data = codeGenerationResults.getData(
+					m,
+					chunk.runtime,
+					"share-init"
+				);
+				if (!data) continue;
+				for (const item of data) {
+					const { shareScope, initStage, init } = item;
+					let stages = initCodePerScope.get(shareScope);
+					if (stages === undefined) {
+						initCodePerScope.set(shareScope, (stages = new Map()));
+					}
+					let list = stages.get(initStage || 0);
+					if (list === undefined) {
+						stages.set(initStage || 0, (list = new Set()));
+					}
+					list.add(init);
+				}
+			}
+		}
+		return Template.asString([
+			`${RuntimeGlobals.shareScopeMap} = {};`,
+			"var initPromises = {};",
+			"var initTokens = {};",
+			`${RuntimeGlobals.initializeSharing} = ${runtimeTemplate.basicFunction(
+				"name, initScope",
+				[
+					"if(!initScope) initScope = [];",
+					"// handling circular init calls",
+					"var initToken = initTokens[name];",
+					"if(!initToken) initToken = initTokens[name] = {};",
+					"if(initScope.indexOf(initToken) >= 0) return;",
+					"initScope.push(initToken);",
+					"// only runs once",
+					"if(initPromises[name]) return initPromises[name];",
+					"// creates a new share scope if needed",
+					`if(!${RuntimeGlobals.hasOwnProperty}(${RuntimeGlobals.shareScopeMap}, name)) ${RuntimeGlobals.shareScopeMap}[name] = {};`,
+					"// runs all init snippets from all modules reachable",
+					`var scope = ${RuntimeGlobals.shareScopeMap}[name];`,
+					`var warn = ${
+						ignoreBrowserWarnings
+							? runtimeTemplate.basicFunction("", "")
+							: runtimeTemplate.basicFunction("msg", [
+									'if (typeof console !== "undefined" && console.warn) console.warn(msg);'
+								])
+					};`,
+					`var uniqueName = ${JSON.stringify(uniqueName || undefined)};`,
+					`var register = ${runtimeTemplate.basicFunction(
+						"name, version, factory, eager",
+						[
+							"var versions = scope[name] = scope[name] || {};",
+							"var activeVersion = versions[version];",
+							"if(!activeVersion || (!activeVersion.loaded && (!eager != !activeVersion.eager ? eager : uniqueName > activeVersion.from))) versions[version] = { get: factory, from: uniqueName, eager: !!eager };"
+						]
+					)};`,
+					`var initExternal = ${runtimeTemplate.basicFunction("id", [
+						`var handleError = ${runtimeTemplate.expressionFunction(
+							'warn("Initialization of sharing external failed: " + err)',
+							"err"
+						)};`,
+						"try {",
+						Template.indent([
+							`var module = ${RuntimeGlobals.require}(id);`,
+							"if(!module) return;",
+							`var initFn = ${runtimeTemplate.returningFunction(
+								`module && module.init && module.init(${RuntimeGlobals.shareScopeMap}[name], initScope)`,
+								"module"
+							)}`,
+							"if(module.then) return promises.push(module.then(initFn, handleError));",
+							"var initResult = initFn(module);",
+							"if(initResult && initResult.then) return promises.push(initResult['catch'](handleError));"
+						]),
+						"} catch(err) { handleError(err); }"
+					])}`,
+					"var promises = [];",
+					"switch(name) {",
+					...Array.from(initCodePerScope)
+						.sort(([a], [b]) => compareStrings(a, b))
+						.map(([name, stages]) =>
+							Template.indent([
+								`case ${JSON.stringify(name)}: {`,
+								Template.indent(
+									Array.from(stages)
+										.sort(([a], [b]) => a - b)
+										.map(([, initCode]) =>
+											Template.asString(Array.from(initCode))
+										)
+								),
+								"}",
+								"break;"
+							])
+						),
+					"}",
+					"if(!promises.length) return initPromises[name] = 1;",
+					`return initPromises[name] = Promise.all(promises).then(${runtimeTemplate.returningFunction(
+						"initPromises[name] = 1"
+					)});`
+				]
+			)};`
+		]);
+	}
+}
+
+module.exports = ShareRuntimeModule;
diff --git a/lib/sharing/resolveMatchedConfigs.js b/lib/sharing/resolveMatchedConfigs.js
new file mode 100644
index 00000000000..a54a76abb41
--- /dev/null
+++ b/lib/sharing/resolveMatchedConfigs.js
@@ -0,0 +1,92 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const ModuleNotFoundError = require("../ModuleNotFoundError");
+const LazySet = require("../util/LazySet");
+
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../ResolverFactory").ResolveOptionsWithDependencyType} ResolveOptionsWithDependencyType */
+
+/**
+ * @template T
+ * @typedef {object} MatchedConfigs
+ * @property {Map} resolved
+ * @property {Map} unresolved
+ * @property {Map} prefixed
+ */
+
+/** @type {ResolveOptionsWithDependencyType} */
+const RESOLVE_OPTIONS = { dependencyType: "esm" };
+
+/**
+ * @template T
+ * @param {Compilation} compilation the compilation
+ * @param {[string, T][]} configs to be processed configs
+ * @returns {Promise>} resolved matchers
+ */
+module.exports.resolveMatchedConfigs = (compilation, configs) => {
+	/** @type {Map} */
+	const resolved = new Map();
+	/** @type {Map} */
+	const unresolved = new Map();
+	/** @type {Map} */
+	const prefixed = new Map();
+	const resolveContext = {
+		/** @type {LazySet} */
+		fileDependencies: new LazySet(),
+		/** @type {LazySet} */
+		contextDependencies: new LazySet(),
+		/** @type {LazySet} */
+		missingDependencies: new LazySet()
+	};
+	const resolver = compilation.resolverFactory.get("normal", RESOLVE_OPTIONS);
+	const context = compilation.compiler.context;
+
+	return Promise.all(
+		// eslint-disable-next-line array-callback-return
+		configs.map(([request, config]) => {
+			if (/^\.\.?(\/|$)/.test(request)) {
+				// relative request
+				return new Promise(resolve => {
+					resolver.resolve(
+						{},
+						context,
+						request,
+						resolveContext,
+						(err, result) => {
+							if (err || result === false) {
+								err = err || new Error(`Can't resolve ${request}`);
+								compilation.errors.push(
+									new ModuleNotFoundError(null, err, {
+										name: `shared module ${request}`
+									})
+								);
+								return resolve(null);
+							}
+							resolved.set(/** @type {string} */ (result), config);
+							resolve(null);
+						}
+					);
+				});
+			} else if (/^(\/|[A-Za-z]:\\|\\\\)/.test(request)) {
+				// absolute path
+				resolved.set(request, config);
+			} else if (request.endsWith("/")) {
+				// module request prefix
+				prefixed.set(request, config);
+			} else {
+				// module request
+				unresolved.set(request, config);
+			}
+		})
+	).then(() => {
+		compilation.contextDependencies.addAll(resolveContext.contextDependencies);
+		compilation.fileDependencies.addAll(resolveContext.fileDependencies);
+		compilation.missingDependencies.addAll(resolveContext.missingDependencies);
+		return { resolved, unresolved, prefixed };
+	});
+};
diff --git a/lib/sharing/utils.js b/lib/sharing/utils.js
new file mode 100644
index 00000000000..037fcb17604
--- /dev/null
+++ b/lib/sharing/utils.js
@@ -0,0 +1,425 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const { join, dirname, readJson } = require("../util/fs");
+
+/** @typedef {import("../util/fs").InputFileSystem} InputFileSystem */
+/** @typedef {import("../util/fs").JsonObject} JsonObject */
+/** @typedef {import("../util/fs").JsonPrimitive} JsonPrimitive */
+
+// Extreme shorthand only for github. eg: foo/bar
+const RE_URL_GITHUB_EXTREME_SHORT = /^[^/@:.\s][^/@:\s]*\/[^@:\s]*[^/@:\s]#\S+/;
+
+// Short url with specific protocol. eg: github:foo/bar
+const RE_GIT_URL_SHORT = /^(github|gitlab|bitbucket|gist):\/?[^/.]+\/?/i;
+
+// Currently supported protocols
+const RE_PROTOCOL =
+	/^((git\+)?(ssh|https?|file)|git|github|gitlab|bitbucket|gist):$/i;
+
+// Has custom protocol
+const RE_CUSTOM_PROTOCOL = /^((git\+)?(ssh|https?|file)|git):\/\//i;
+
+// Valid hash format for npm / yarn ...
+const RE_URL_HASH_VERSION = /#(?:semver:)?(.+)/;
+
+// Simple hostname validate
+const RE_HOSTNAME = /^(?:[^/.]+(\.[^/]+)+|localhost)$/;
+
+// For hostname with colon. eg: ssh://user@github.com:foo/bar
+const RE_HOSTNAME_WITH_COLON =
+	/([^/@#:.]+(?:\.[^/@#:.]+)+|localhost):([^#/0-9]+)/;
+
+// Reg for url without protocol
+const RE_NO_PROTOCOL = /^([^/@#:.]+(?:\.[^/@#:.]+)+)/;
+
+// RegExp for version string
+const VERSION_PATTERN_REGEXP = /^([\d^=v<>~]|[*xX]$)/;
+
+// Specific protocol for short url without normal hostname
+const PROTOCOLS_FOR_SHORT = [
+	"github:",
+	"gitlab:",
+	"bitbucket:",
+	"gist:",
+	"file:"
+];
+
+// Default protocol for git url
+const DEF_GIT_PROTOCOL = "git+ssh://";
+
+// thanks to https://github.com/npm/hosted-git-info/blob/latest/git-host-info.js
+const extractCommithashByDomain = {
+	/**
+	 * @param {string} pathname pathname
+	 * @param {string} hash hash
+	 * @returns {string | undefined} hash
+	 */
+	"github.com": (pathname, hash) => {
+		let [, user, project, type, commithash] = pathname.split("/", 5);
+		if (type && type !== "tree") {
+			return;
+		}
+
+		commithash = !type ? hash : `#${commithash}`;
+
+		if (project && project.endsWith(".git")) {
+			project = project.slice(0, -4);
+		}
+
+		if (!user || !project) {
+			return;
+		}
+
+		return commithash;
+	},
+	/**
+	 * @param {string} pathname pathname
+	 * @param {string} hash hash
+	 * @returns {string | undefined} hash
+	 */
+	"gitlab.com": (pathname, hash) => {
+		const path = pathname.slice(1);
+		if (path.includes("/-/") || path.includes("/archive.tar.gz")) {
+			return;
+		}
+
+		const segments = path.split("/");
+		let project = /** @type {string} */ (segments.pop());
+		if (project.endsWith(".git")) {
+			project = project.slice(0, -4);
+		}
+
+		const user = segments.join("/");
+		if (!user || !project) {
+			return;
+		}
+
+		return hash;
+	},
+	/**
+	 * @param {string} pathname pathname
+	 * @param {string} hash hash
+	 * @returns {string | undefined} hash
+	 */
+	"bitbucket.org": (pathname, hash) => {
+		let [, user, project, aux] = pathname.split("/", 4);
+		if (["get"].includes(aux)) {
+			return;
+		}
+
+		if (project && project.endsWith(".git")) {
+			project = project.slice(0, -4);
+		}
+
+		if (!user || !project) {
+			return;
+		}
+
+		return hash;
+	},
+	/**
+	 * @param {string} pathname pathname
+	 * @param {string} hash hash
+	 * @returns {string | undefined} hash
+	 */
+	"gist.github.com": (pathname, hash) => {
+		let [, user, project, aux] = pathname.split("/", 4);
+		if (aux === "raw") {
+			return;
+		}
+
+		if (!project) {
+			if (!user) {
+				return;
+			}
+
+			project = user;
+		}
+
+		if (project.endsWith(".git")) {
+			project = project.slice(0, -4);
+		}
+
+		return hash;
+	}
+};
+
+/**
+ * extract commit hash from parsed url
+ * @inner
+ * @param {URL} urlParsed parsed url
+ * @returns {string} commithash
+ */
+function getCommithash(urlParsed) {
+	let { hostname, pathname, hash } = urlParsed;
+	hostname = hostname.replace(/^www\./, "");
+
+	try {
+		hash = decodeURIComponent(hash);
+		// eslint-disable-next-line no-empty
+	} catch (_err) {}
+
+	if (
+		extractCommithashByDomain[
+			/** @type {keyof extractCommithashByDomain} */ (hostname)
+		]
+	) {
+		return (
+			extractCommithashByDomain[
+				/** @type {keyof extractCommithashByDomain} */ (hostname)
+			](pathname, hash) || ""
+		);
+	}
+
+	return hash;
+}
+
+/**
+ * make url right for URL parse
+ * @inner
+ * @param {string} gitUrl git url
+ * @returns {string} fixed url
+ */
+function correctUrl(gitUrl) {
+	// like:
+	// proto://hostname.com:user/repo -> proto://hostname.com/user/repo
+	return gitUrl.replace(RE_HOSTNAME_WITH_COLON, "$1/$2");
+}
+
+/**
+ * make url protocol right for URL parse
+ * @inner
+ * @param {string} gitUrl git url
+ * @returns {string} fixed url
+ */
+function correctProtocol(gitUrl) {
+	// eg: github:foo/bar#v1.0. Should not add double slash, in case of error parsed `pathname`
+	if (RE_GIT_URL_SHORT.test(gitUrl)) {
+		return gitUrl;
+	}
+
+	// eg: user@github.com:foo/bar
+	if (!RE_CUSTOM_PROTOCOL.test(gitUrl)) {
+		return `${DEF_GIT_PROTOCOL}${gitUrl}`;
+	}
+
+	return gitUrl;
+}
+
+/**
+ * extract git dep version from hash
+ * @inner
+ * @param {string} hash hash
+ * @returns {string} git dep version
+ */
+function getVersionFromHash(hash) {
+	const matched = hash.match(RE_URL_HASH_VERSION);
+
+	return (matched && matched[1]) || "";
+}
+
+/**
+ * if string can be decoded
+ * @inner
+ * @param {string} str str to be checked
+ * @returns {boolean} if can be decoded
+ */
+function canBeDecoded(str) {
+	try {
+		decodeURIComponent(str);
+	} catch (_err) {
+		return false;
+	}
+
+	return true;
+}
+
+/**
+ * get right dep version from git url
+ * @inner
+ * @param {string} gitUrl git url
+ * @returns {string} dep version
+ */
+function getGitUrlVersion(gitUrl) {
+	const oriGitUrl = gitUrl;
+	// github extreme shorthand
+	gitUrl = RE_URL_GITHUB_EXTREME_SHORT.test(gitUrl)
+		? `github:${gitUrl}`
+		: correctProtocol(gitUrl);
+
+	gitUrl = correctUrl(gitUrl);
+
+	let parsed;
+	try {
+		parsed = new URL(gitUrl);
+		// eslint-disable-next-line no-empty
+	} catch (_err) {}
+
+	if (!parsed) {
+		return "";
+	}
+
+	const { protocol, hostname, pathname, username, password } = parsed;
+	if (!RE_PROTOCOL.test(protocol)) {
+		return "";
+	}
+
+	// pathname shouldn't be empty or URL malformed
+	if (!pathname || !canBeDecoded(pathname)) {
+		return "";
+	}
+
+	// without protocol, there should have auth info
+	if (RE_NO_PROTOCOL.test(oriGitUrl) && !username && !password) {
+		return "";
+	}
+
+	if (!PROTOCOLS_FOR_SHORT.includes(protocol.toLowerCase())) {
+		if (!RE_HOSTNAME.test(hostname)) {
+			return "";
+		}
+
+		const commithash = getCommithash(parsed);
+		return getVersionFromHash(commithash) || commithash;
+	}
+
+	// for protocol short
+	return getVersionFromHash(gitUrl);
+}
+
+/**
+ * @param {string} str maybe required version
+ * @returns {boolean} true, if it looks like a version
+ */
+function isRequiredVersion(str) {
+	return VERSION_PATTERN_REGEXP.test(str);
+}
+
+module.exports.isRequiredVersion = isRequiredVersion;
+
+/**
+ * @see https://docs.npmjs.com/cli/v7/configuring-npm/package-json#urls-as-dependencies
+ * @param {string} versionDesc version to be normalized
+ * @returns {string} normalized version
+ */
+function normalizeVersion(versionDesc) {
+	versionDesc = (versionDesc && versionDesc.trim()) || "";
+
+	if (isRequiredVersion(versionDesc)) {
+		return versionDesc;
+	}
+
+	// add handle for URL Dependencies
+	return getGitUrlVersion(versionDesc.toLowerCase());
+}
+
+module.exports.normalizeVersion = normalizeVersion;
+
+/** @typedef {{ data: JsonObject, path: string }} DescriptionFile */
+
+/**
+ * @param {InputFileSystem} fs file system
+ * @param {string} directory directory to start looking into
+ * @param {string[]} descriptionFiles possible description filenames
+ * @param {(err?: Error | null, descriptionFile?: DescriptionFile, paths?: string[]) => void} callback callback
+ * @param {(descriptionFile?: DescriptionFile) => boolean} satisfiesDescriptionFileData file data compliance check
+ * @param {Set} checkedFilePaths set of file paths that have been checked
+ */
+const getDescriptionFile = (
+	fs,
+	directory,
+	descriptionFiles,
+	callback,
+	satisfiesDescriptionFileData,
+	checkedFilePaths = new Set()
+) => {
+	let i = 0;
+
+	const satisfiesDescriptionFileDataInternal = {
+		check: satisfiesDescriptionFileData,
+		checkedFilePaths
+	};
+
+	const tryLoadCurrent = () => {
+		if (i >= descriptionFiles.length) {
+			const parentDirectory = dirname(fs, directory);
+			if (!parentDirectory || parentDirectory === directory) {
+				return callback(
+					null,
+					undefined,
+					Array.from(satisfiesDescriptionFileDataInternal.checkedFilePaths)
+				);
+			}
+			return getDescriptionFile(
+				fs,
+				parentDirectory,
+				descriptionFiles,
+				callback,
+				satisfiesDescriptionFileDataInternal.check,
+				satisfiesDescriptionFileDataInternal.checkedFilePaths
+			);
+		}
+		const filePath = join(fs, directory, descriptionFiles[i]);
+		readJson(fs, filePath, (err, data) => {
+			if (err) {
+				if ("code" in err && err.code === "ENOENT") {
+					i++;
+					return tryLoadCurrent();
+				}
+				return callback(err);
+			}
+			if (!data || typeof data !== "object" || Array.isArray(data)) {
+				return callback(
+					new Error(`Description file ${filePath} is not an object`)
+				);
+			}
+			if (
+				typeof satisfiesDescriptionFileDataInternal.check === "function" &&
+				!satisfiesDescriptionFileDataInternal.check({ data, path: filePath })
+			) {
+				i++;
+				satisfiesDescriptionFileDataInternal.checkedFilePaths.add(filePath);
+				return tryLoadCurrent();
+			}
+			callback(null, { data, path: filePath });
+		});
+	};
+	tryLoadCurrent();
+};
+module.exports.getDescriptionFile = getDescriptionFile;
+
+/**
+ * @param {JsonObject} data description file data i.e.: package.json
+ * @param {string} packageName name of the dependency
+ * @returns {string | undefined} normalized version
+ */
+const getRequiredVersionFromDescriptionFile = (data, packageName) => {
+	const dependencyTypes = [
+		"optionalDependencies",
+		"dependencies",
+		"peerDependencies",
+		"devDependencies"
+	];
+
+	for (const dependencyType of dependencyTypes) {
+		const dependency = /** @type {JsonObject} */ (data[dependencyType]);
+		if (
+			dependency &&
+			typeof dependency === "object" &&
+			packageName in dependency
+		) {
+			return normalizeVersion(
+				/** @type {Exclude} */ (
+					dependency[packageName]
+				)
+			);
+		}
+	}
+};
+module.exports.getRequiredVersionFromDescriptionFile =
+	getRequiredVersionFromDescriptionFile;
diff --git a/lib/stats/DefaultStatsFactoryPlugin.js b/lib/stats/DefaultStatsFactoryPlugin.js
new file mode 100644
index 00000000000..95826dd1cd3
--- /dev/null
+++ b/lib/stats/DefaultStatsFactoryPlugin.js
@@ -0,0 +1,2687 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const util = require("util");
+const { WEBPACK_MODULE_TYPE_RUNTIME } = require("../ModuleTypeConstants");
+const ModuleDependency = require("../dependencies/ModuleDependency");
+const formatLocation = require("../formatLocation");
+const { LogType } = require("../logging/Logger");
+const AggressiveSplittingPlugin = require("../optimize/AggressiveSplittingPlugin");
+const SizeLimitsPlugin = require("../performance/SizeLimitsPlugin");
+const { countIterable } = require("../util/IterableHelpers");
+const {
+	compareLocations,
+	compareChunksById,
+	compareNumbers,
+	compareIds,
+	concatComparators,
+	compareSelect,
+	compareModulesByIdentifier
+} = require("../util/comparators");
+const { makePathsRelative, parseResource } = require("../util/identifier");
+
+/** @typedef {import("webpack-sources").Source} Source */
+/** @typedef {import("../Chunk")} Chunk */
+/** @typedef {import("../Chunk").ChunkId} ChunkId */
+/** @typedef {import("../Chunk").ChunkName} ChunkName */
+/** @typedef {import("../ChunkGraph").ModuleId} ModuleId */
+/** @typedef {import("../ChunkGroup")} ChunkGroup */
+/** @typedef {import("../ChunkGroup").OriginRecord} OriginRecord */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Compilation").Asset} Asset */
+/** @typedef {import("../Compilation").AssetInfo} AssetInfo */
+/** @typedef {import("../Compilation").ExcludeModulesType} ExcludeModulesType */
+/** @typedef {import("../Compilation").KnownNormalizedStatsOptions} KnownNormalizedStatsOptions */
+/** @typedef {import("../Compilation").NormalizedStatsOptions} NormalizedStatsOptions */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../Dependency")} Dependency */
+/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
+/** @typedef {import("../Module")} Module */
+/** @typedef {import("../Module").BuildInfo} BuildInfo */
+/** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */
+/** @typedef {import("../ModuleProfile")} ModuleProfile */
+/** @typedef {import("../RequestShortener")} RequestShortener */
+/** @typedef {import("../TemplatedPathPlugin").TemplatePath} TemplatePath */
+/** @typedef {import("../WebpackError")} WebpackError */
+/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */
+/** @typedef {import("./StatsFactory")} StatsFactory */
+/** @typedef {import("./StatsFactory").StatsFactoryContext} StatsFactoryContext */
+
+/**
+ * @template T
+ * @typedef {import("../util/comparators").Comparator} Comparator
+ */
+
+/**
+ * @template T, R
+ * @typedef {import("../util/smartGrouping").GroupConfig} GroupConfig
+ */
+
+/** @typedef {KnownStatsCompilation & Record} StatsCompilation */
+/**
+ * @typedef {object} KnownStatsCompilation
+ * @property {Record=} env
+ * @property {string=} name
+ * @property {string=} hash
+ * @property {string=} version
+ * @property {number=} time
+ * @property {number=} builtAt
+ * @property {boolean=} needAdditionalPass
+ * @property {string=} publicPath
+ * @property {string=} outputPath
+ * @property {Record=} assetsByChunkName
+ * @property {StatsAsset[]=} assets
+ * @property {number=} filteredAssets
+ * @property {StatsChunk[]=} chunks
+ * @property {StatsModule[]=} modules
+ * @property {number=} filteredModules
+ * @property {Record=} entrypoints
+ * @property {Record=} namedChunkGroups
+ * @property {StatsError[]=} errors
+ * @property {number=} errorsCount
+ * @property {StatsError[]=} warnings
+ * @property {number=} warningsCount
+ * @property {StatsCompilation[]=} children
+ * @property {Record=} logging
+ * @property {number=} filteredWarningDetailsCount
+ * @property {number=} filteredErrorDetailsCount
+ */
+
+/** @typedef {KnownStatsLogging & Record} StatsLogging */
+/**
+ * @typedef {object} KnownStatsLogging
+ * @property {StatsLoggingEntry[]} entries
+ * @property {number} filteredEntries
+ * @property {boolean} debug
+ */
+
+/** @typedef {KnownStatsLoggingEntry & Record} StatsLoggingEntry */
+/**
+ * @typedef {object} KnownStatsLoggingEntry
+ * @property {string} type
+ * @property {string=} message
+ * @property {string[]=} trace
+ * @property {StatsLoggingEntry[]=} children
+ * @property {EXPECTED_ANY[]=} args
+ * @property {number=} time
+ */
+
+/** @typedef {KnownStatsAsset & Record} StatsAsset */
+/** @typedef {ChunkId} KnownStatsAssetChunk */
+/** @typedef {ChunkName} KnownStatsAssetChunkName */
+/** @typedef {string} KnownStatsAssetChunkIdHint */
+/**
+ * @typedef {object} KnownStatsAsset
+ * @property {string} type
+ * @property {string} name
+ * @property {AssetInfo} info
+ * @property {number} size
+ * @property {boolean} emitted
+ * @property {boolean} comparedForEmit
+ * @property {boolean} cached
+ * @property {StatsAsset[]=} related
+ * @property {KnownStatsAssetChunk[]=} chunks
+ * @property {KnownStatsAssetChunkName[]=} chunkNames
+ * @property {KnownStatsAssetChunkIdHint[]=} chunkIdHints
+ * @property {KnownStatsAssetChunk[]=} auxiliaryChunks
+ * @property {KnownStatsAssetChunkName[]=} auxiliaryChunkNames
+ * @property {KnownStatsAssetChunkIdHint[]=} auxiliaryChunkIdHints
+ * @property {number=} filteredRelated
+ * @property {boolean=} isOverSizeLimit
+ */
+
+/** @typedef {KnownStatsChunkGroup & Record} StatsChunkGroup */
+/**
+ * @typedef {object} KnownStatsChunkGroup
+ * @property {(string | null)=} name
+ * @property {(string | number)[]=} chunks
+ * @property {({ name: string, size?: number })[]=} assets
+ * @property {number=} filteredAssets
+ * @property {number=} assetsSize
+ * @property {({ name: string, size?: number })[]=} auxiliaryAssets
+ * @property {number=} filteredAuxiliaryAssets
+ * @property {number=} auxiliaryAssetsSize
+ * @property {{ [x: string]: StatsChunkGroup[] }=} children
+ * @property {{ [x: string]: string[] }=} childAssets
+ * @property {boolean=} isOverSizeLimit
+ */
+
+/** @typedef {Module[]} ModuleIssuerPath */
+/** @typedef {KnownStatsModule & Record} StatsModule */
+/**
+ * @typedef {object} KnownStatsModule
+ * @property {string=} type
+ * @property {string=} moduleType
+ * @property {(string | null)=} layer
+ * @property {string=} identifier
+ * @property {string=} name
+ * @property {(string | null)=} nameForCondition
+ * @property {number=} index
+ * @property {number=} preOrderIndex
+ * @property {number=} index2
+ * @property {number=} postOrderIndex
+ * @property {number=} size
+ * @property {{ [x: string]: number }=} sizes
+ * @property {boolean=} cacheable
+ * @property {boolean=} built
+ * @property {boolean=} codeGenerated
+ * @property {boolean=} buildTimeExecuted
+ * @property {boolean=} cached
+ * @property {boolean=} optional
+ * @property {boolean=} orphan
+ * @property {string | number=} id
+ * @property {string | number | null=} issuerId
+ * @property {(string | number)[]=} chunks
+ * @property {(string | number)[]=} assets
+ * @property {boolean=} dependent
+ * @property {(string | null)=} issuer
+ * @property {(string | null)=} issuerName
+ * @property {StatsModuleIssuer[] | null=} issuerPath
+ * @property {boolean=} failed
+ * @property {number=} errors
+ * @property {number=} warnings
+ * @property {StatsProfile=} profile
+ * @property {StatsModuleReason[]=} reasons
+ * @property {(boolean | null | string[])=} usedExports
+ * @property {(string[] | null)=} providedExports
+ * @property {string[]=} optimizationBailout
+ * @property {(number | null)=} depth
+ * @property {StatsModule[]=} modules
+ * @property {number=} filteredModules
+ * @property {ReturnType=} source
+ */
+
+/** @typedef {KnownStatsProfile & Record} StatsProfile */
+/**
+ * @typedef {object} KnownStatsProfile
+ * @property {number} total
+ * @property {number} resolving
+ * @property {number} restoring
+ * @property {number} building
+ * @property {number} integration
+ * @property {number} storing
+ * @property {number} additionalResolving
+ * @property {number} additionalIntegration
+ * @property {number} factory
+ * @property {number} dependencies
+ */
+
+/** @typedef {KnownStatsModuleIssuer & Record} StatsModuleIssuer */
+/**
+ * @typedef {object} KnownStatsModuleIssuer
+ * @property {string} identifier
+ * @property {string} name
+ * @property {(string|number)=} id
+ * @property {StatsProfile} profile
+ */
+
+/** @typedef {KnownStatsModuleReason & Record} StatsModuleReason */
+/**
+ * @typedef {object} KnownStatsModuleReason
+ * @property {string | null} moduleIdentifier
+ * @property {string | null} module
+ * @property {string | null} moduleName
+ * @property {string | null} resolvedModuleIdentifier
+ * @property {string | null} resolvedModule
+ * @property {string | null} type
+ * @property {boolean} active
+ * @property {string | null} explanation
+ * @property {string | null} userRequest
+ * @property {(string | null)=} loc
+ * @property {(string | number | null)=} moduleId
+ * @property {(string | number | null)=} resolvedModuleId
+ */
+
+/** @typedef {KnownStatsChunk & Record} StatsChunk */
+/**
+ * @typedef {object} KnownStatsChunk
+ * @property {boolean} rendered
+ * @property {boolean} initial
+ * @property {boolean} entry
+ * @property {boolean} recorded
+ * @property {string=} reason
+ * @property {number} size
+ * @property {Record} sizes
+ * @property {string[]} names
+ * @property {string[]} idHints
+ * @property {string[]=} runtime
+ * @property {string[]} files
+ * @property {string[]} auxiliaryFiles
+ * @property {string} hash
+ * @property {Record} childrenByOrder
+ * @property {(string|number)=} id
+ * @property {(string|number)[]=} siblings
+ * @property {(string|number)[]=} parents
+ * @property {(string|number)[]=} children
+ * @property {StatsModule[]=} modules
+ * @property {number=} filteredModules
+ * @property {StatsChunkOrigin[]=} origins
+ */
+
+/** @typedef {KnownStatsChunkOrigin & Record} StatsChunkOrigin */
+/**
+ * @typedef {object} KnownStatsChunkOrigin
+ * @property {string} module
+ * @property {string} moduleIdentifier
+ * @property {string} moduleName
+ * @property {string} loc
+ * @property {string} request
+ * @property {(string | number)=} moduleId
+ */
+
+/** @typedef {KnownStatsModuleTraceItem & Record} StatsModuleTraceItem */
+/**
+ * @typedef {object} KnownStatsModuleTraceItem
+ * @property {string=} originIdentifier
+ * @property {string=} originName
+ * @property {string=} moduleIdentifier
+ * @property {string=} moduleName
+ * @property {StatsModuleTraceDependency[]=} dependencies
+ * @property {(string|number)=} originId
+ * @property {(string|number)=} moduleId
+ */
+
+/** @typedef {KnownStatsModuleTraceDependency & Record} StatsModuleTraceDependency */
+/**
+ * @typedef {object} KnownStatsModuleTraceDependency
+ * @property {string=} loc
+ */
+
+/** @typedef {KnownStatsError & Record} StatsError */
+/**
+ * @typedef {object} KnownStatsError
+ * @property {string} message
+ * @property {string=} chunkName
+ * @property {boolean=} chunkEntry
+ * @property {boolean=} chunkInitial
+ * @property {string=} file
+ * @property {string=} moduleIdentifier
+ * @property {string=} moduleName
+ * @property {string=} loc
+ * @property {ChunkId=} chunkId
+ * @property {string|number=} moduleId
+ * @property {StatsModuleTraceItem[]=} moduleTrace
+ * @property {string=} details
+ * @property {string=} stack
+ * @property {KnownStatsError=} cause
+ * @property {KnownStatsError[]=} errors
+ * @property {string=} compilerPath
+ */
+
+/** @typedef {Asset & { type: string, related: PreprocessedAsset[] | undefined }} PreprocessedAsset */
+
+/**
+ * @template T
+ * @template O
+ * @typedef {Record void>} ExtractorsByOption
+ */
+
+/** @typedef {{ name: string, chunkGroup: ChunkGroup }} ChunkGroupInfoWithName */
+/** @typedef {{ origin: Module, module: Module }} ModuleTrace */
+
+/**
+ * @typedef {object} SimpleExtractors
+ * @property {ExtractorsByOption} compilation
+ * @property {ExtractorsByOption} asset
+ * @property {ExtractorsByOption} asset$visible
+ * @property {ExtractorsByOption} chunkGroup
+ * @property {ExtractorsByOption} module
+ * @property {ExtractorsByOption} module$visible
+ * @property {ExtractorsByOption} moduleIssuer
+ * @property {ExtractorsByOption} profile
+ * @property {ExtractorsByOption} moduleReason
+ * @property {ExtractorsByOption} chunk
+ * @property {ExtractorsByOption} chunkOrigin
+ * @property {ExtractorsByOption} error
+ * @property {ExtractorsByOption} warning
+ * @property {ExtractorsByOption} cause
+ * @property {ExtractorsByOption} moduleTraceItem
+ * @property {ExtractorsByOption} moduleTraceDependency
+ */
+
+/**
+ * @template T
+ * @template I
+ * @param {Iterable} items items to select from
+ * @param {(item: T) => Iterable} selector selector function to select values from item
+ * @returns {I[]} array of values
+ */
+const uniqueArray = (items, selector) => {
+	/** @type {Set} */
+	const set = new Set();
+	for (const item of items) {
+		for (const i of selector(item)) {
+			set.add(i);
+		}
+	}
+	return Array.from(set);
+};
+
+/**
+ * @template T
+ * @template I
+ * @param {Iterable} items items to select from
+ * @param {(item: T) => Iterable} selector selector function to select values from item
+ * @param {Comparator} comparator comparator function
+ * @returns {I[]} array of values
+ */
+const uniqueOrderedArray = (items, selector, comparator) =>
+	uniqueArray(items, selector).sort(comparator);
+
+/** @template T @template R @typedef {{ [P in keyof T]: R }} MappedValues */
+
+/**
+ * @template {object} T
+ * @template {object} R
+ * @param {T} obj object to be mapped
+ * @param {function(T[keyof T], keyof T): R} fn mapping function
+ * @returns {MappedValues} mapped object
+ */
+const mapObject = (obj, fn) => {
+	const newObj = Object.create(null);
+	for (const key of Object.keys(obj)) {
+		newObj[key] = fn(
+			obj[/** @type {keyof T} */ (key)],
+			/** @type {keyof T} */ (key)
+		);
+	}
+	return newObj;
+};
+
+/**
+ * @template T
+ * @param {Compilation} compilation the compilation
+ * @param {(compilation: Compilation, name: string) => T[]} getItems get items
+ * @returns {number} total number
+ */
+const countWithChildren = (compilation, getItems) => {
+	let count = getItems(compilation, "").length;
+	for (const child of compilation.children) {
+		count += countWithChildren(child, (c, type) =>
+			getItems(c, `.children[].compilation${type}`)
+		);
+	}
+	return count;
+};
+
+/** @typedef {Error & { cause?: unknown }} ErrorWithCause */
+/** @typedef {Error & { errors: EXPECTED_ANY[] }} AggregateError */
+
+/** @type {ExtractorsByOption} */
+const EXTRACT_ERROR = {
+	_: (object, error, context, { requestShortener }) => {
+		// TODO webpack 6 disallow strings in the errors/warnings list
+		if (typeof error === "string") {
+			object.message = error;
+		} else {
+			if (/** @type {WebpackError} */ (error).chunk) {
+				const chunk = /** @type {WebpackError} */ (error).chunk;
+				object.chunkName =
+					/** @type {string | undefined} */
+					(chunk.name);
+				object.chunkEntry = chunk.hasRuntime();
+				object.chunkInitial = chunk.canBeInitial();
+			}
+
+			if (/** @type {WebpackError} */ (error).file) {
+				object.file = /** @type {WebpackError} */ (error).file;
+			}
+
+			if (/** @type {WebpackError} */ (error).module) {
+				object.moduleIdentifier =
+					/** @type {WebpackError} */
+					(error).module.identifier();
+				object.moduleName =
+					/** @type {WebpackError} */
+					(error).module.readableIdentifier(requestShortener);
+			}
+
+			if (/** @type {WebpackError} */ (error).loc) {
+				object.loc = formatLocation(/** @type {WebpackError} */ (error).loc);
+			}
+
+			object.message = error.message;
+		}
+	},
+	ids: (object, error, { compilation: { chunkGraph } }) => {
+		if (typeof error !== "string") {
+			if (/** @type {WebpackError} */ (error).chunk) {
+				object.chunkId = /** @type {ChunkId} */ (
+					/** @type {WebpackError} */
+					(error).chunk.id
+				);
+			}
+
+			if (/** @type {WebpackError} */ (error).module) {
+				object.moduleId =
+					/** @type {ModuleId} */
+					(chunkGraph.getModuleId(/** @type {WebpackError} */ (error).module));
+			}
+		}
+	},
+	moduleTrace: (object, error, context, options, factory) => {
+		if (
+			typeof error !== "string" &&
+			/** @type {WebpackError} */ (error).module
+		) {
+			const {
+				type,
+				compilation: { moduleGraph }
+			} = context;
+			/** @type {Set} */
+			const visitedModules = new Set();
+			/** @type {ModuleTrace[]} */
+			const moduleTrace = [];
+			let current = /** @type {WebpackError} */ (error).module;
+			while (current) {
+				if (visitedModules.has(current)) break; // circular (technically impossible, but how knows)
+				visitedModules.add(current);
+				const origin = moduleGraph.getIssuer(current);
+				if (!origin) break;
+				moduleTrace.push({ origin, module: current });
+				current = origin;
+			}
+			object.moduleTrace = factory.create(
+				`${type}.moduleTrace`,
+				moduleTrace,
+				context
+			);
+		}
+	},
+	errorDetails: (
+		object,
+		error,
+		{ type, compilation, cachedGetErrors, cachedGetWarnings },
+		{ errorDetails }
+	) => {
+		if (
+			typeof error !== "string" &&
+			(errorDetails === true ||
+				(type.endsWith(".error") && cachedGetErrors(compilation).length < 3))
+		) {
+			object.details = /** @type {WebpackError} */ (error).details;
+		}
+	},
+	errorStack: (object, error) => {
+		if (typeof error !== "string") {
+			object.stack = error.stack;
+		}
+	},
+	errorCause: (object, error, context, options, factory) => {
+		if (
+			typeof error !== "string" &&
+			/** @type {ErrorWithCause} */ (error).cause
+		) {
+			const rawCause = /** @type {ErrorWithCause} */ (error).cause;
+			/** @type {Error} */
+			const cause =
+				typeof rawCause === "string"
+					? /** @type {Error} */ ({ message: rawCause })
+					: /** @type {Error} */ (rawCause);
+			const { type } = context;
+
+			object.cause = factory.create(`${type}.cause`, cause, context);
+		}
+	},
+	errorErrors: (object, error, context, options, factory) => {
+		if (
+			typeof error !== "string" &&
+			/** @type {AggregateError} */
+			(error).errors
+		) {
+			const { type } = context;
+			object.errors = factory.create(
+				`${type}.errors`,
+				/** @type {Error[]} */
+				(/** @type {AggregateError} */ (error).errors),
+				context
+			);
+		}
+	}
+};
+
+/** @type {SimpleExtractors} */
+const SIMPLE_EXTRACTORS = {
+	compilation: {
+		_: (object, compilation, context, options) => {
+			if (!context.makePathsRelative) {
+				context.makePathsRelative = makePathsRelative.bindContextCache(
+					compilation.compiler.context,
+					compilation.compiler.root
+				);
+			}
+			if (!context.cachedGetErrors) {
+				const map = new WeakMap();
+				context.cachedGetErrors = compilation =>
+					map.get(compilation) ||
+					// eslint-disable-next-line no-sequences
+					(errors => (map.set(compilation, errors), errors))(
+						compilation.getErrors()
+					);
+			}
+			if (!context.cachedGetWarnings) {
+				const map = new WeakMap();
+				context.cachedGetWarnings = compilation =>
+					map.get(compilation) ||
+					// eslint-disable-next-line no-sequences
+					(warnings => (map.set(compilation, warnings), warnings))(
+						compilation.getWarnings()
+					);
+			}
+			if (compilation.name) {
+				object.name = compilation.name;
+			}
+			if (compilation.needAdditionalPass) {
+				object.needAdditionalPass = true;
+			}
+
+			const { logging, loggingDebug, loggingTrace } = options;
+			if (logging || (loggingDebug && loggingDebug.length > 0)) {
+				const util = require("util");
+				object.logging = {};
+				let acceptedTypes;
+				let collapsedGroups = false;
+				switch (logging) {
+					case "error":
+						acceptedTypes = new Set([LogType.error]);
+						break;
+					case "warn":
+						acceptedTypes = new Set([LogType.error, LogType.warn]);
+						break;
+					case "info":
+						acceptedTypes = new Set([
+							LogType.error,
+							LogType.warn,
+							LogType.info
+						]);
+						break;
+					case "log":
+						acceptedTypes = new Set([
+							LogType.error,
+							LogType.warn,
+							LogType.info,
+							LogType.log,
+							LogType.group,
+							LogType.groupEnd,
+							LogType.groupCollapsed,
+							LogType.clear
+						]);
+						break;
+					case "verbose":
+						acceptedTypes = new Set([
+							LogType.error,
+							LogType.warn,
+							LogType.info,
+							LogType.log,
+							LogType.group,
+							LogType.groupEnd,
+							LogType.groupCollapsed,
+							LogType.profile,
+							LogType.profileEnd,
+							LogType.time,
+							LogType.status,
+							LogType.clear
+						]);
+						collapsedGroups = true;
+						break;
+					default:
+						acceptedTypes = new Set();
+						break;
+				}
+				const cachedMakePathsRelative = makePathsRelative.bindContextCache(
+					options.context,
+					compilation.compiler.root
+				);
+				let depthInCollapsedGroup = 0;
+				for (const [origin, logEntries] of compilation.logging) {
+					const debugMode = loggingDebug.some(fn => fn(origin));
+					if (logging === false && !debugMode) continue;
+					/** @type {KnownStatsLoggingEntry[]} */
+					const groupStack = [];
+					/** @type {KnownStatsLoggingEntry[]} */
+					const rootList = [];
+					let currentList = rootList;
+					let processedLogEntries = 0;
+					for (const entry of logEntries) {
+						let type = entry.type;
+						if (!debugMode && !acceptedTypes.has(type)) continue;
+
+						// Expand groups in verbose and debug modes
+						if (
+							type === LogType.groupCollapsed &&
+							(debugMode || collapsedGroups)
+						)
+							type = LogType.group;
+
+						if (depthInCollapsedGroup === 0) {
+							processedLogEntries++;
+						}
+
+						if (type === LogType.groupEnd) {
+							groupStack.pop();
+							currentList =
+								groupStack.length > 0
+									? /** @type {KnownStatsLoggingEntry[]} */ (
+											groupStack[groupStack.length - 1].children
+										)
+									: rootList;
+							if (depthInCollapsedGroup > 0) depthInCollapsedGroup--;
+							continue;
+						}
+						let message;
+						if (entry.type === LogType.time) {
+							const [label, first, second] =
+								/** @type {[string, number, number]} */
+								(entry.args);
+							message = `${label}: ${first * 1000 + second / 1000000} ms`;
+						} else if (entry.args && entry.args.length > 0) {
+							message = util.format(entry.args[0], ...entry.args.slice(1));
+						}
+						/** @type {KnownStatsLoggingEntry} */
+						const newEntry = {
+							...entry,
+							type,
+							message,
+							trace: loggingTrace ? entry.trace : undefined,
+							children:
+								type === LogType.group || type === LogType.groupCollapsed
+									? []
+									: undefined
+						};
+						currentList.push(newEntry);
+						if (newEntry.children) {
+							groupStack.push(newEntry);
+							currentList = newEntry.children;
+							if (depthInCollapsedGroup > 0) {
+								depthInCollapsedGroup++;
+							} else if (type === LogType.groupCollapsed) {
+								depthInCollapsedGroup = 1;
+							}
+						}
+					}
+					let name = cachedMakePathsRelative(origin).replace(/\|/g, " ");
+					if (name in object.logging) {
+						let i = 1;
+						while (`${name}#${i}` in object.logging) {
+							i++;
+						}
+						name = `${name}#${i}`;
+					}
+					object.logging[name] = {
+						entries: rootList,
+						filteredEntries: logEntries.length - processedLogEntries,
+						debug: debugMode
+					};
+				}
+			}
+		},
+		hash: (object, compilation) => {
+			object.hash = /** @type {string} */ (compilation.hash);
+		},
+		version: object => {
+			object.version = require("../../package.json").version;
+		},
+		env: (object, compilation, context, { _env }) => {
+			object.env = _env;
+		},
+		timings: (object, compilation) => {
+			object.time =
+				/** @type {number} */ (compilation.endTime) -
+				/** @type {number} */ (compilation.startTime);
+		},
+		builtAt: (object, compilation) => {
+			object.builtAt = /** @type {number} */ (compilation.endTime);
+		},
+		publicPath: (object, compilation) => {
+			object.publicPath = compilation.getPath(
+				/** @type {TemplatePath} */
+				(compilation.outputOptions.publicPath)
+			);
+		},
+		outputPath: (object, compilation) => {
+			object.outputPath = /** @type {string} */ (
+				compilation.outputOptions.path
+			);
+		},
+		assets: (object, compilation, context, options, factory) => {
+			const { type } = context;
+			/** @type {Map} */
+			const compilationFileToChunks = new Map();
+			/** @type {Map} */
+			const compilationAuxiliaryFileToChunks = new Map();
+			for (const chunk of compilation.chunks) {
+				for (const file of chunk.files) {
+					let array = compilationFileToChunks.get(file);
+					if (array === undefined) {
+						array = [];
+						compilationFileToChunks.set(file, array);
+					}
+					array.push(chunk);
+				}
+				for (const file of chunk.auxiliaryFiles) {
+					let array = compilationAuxiliaryFileToChunks.get(file);
+					if (array === undefined) {
+						array = [];
+						compilationAuxiliaryFileToChunks.set(file, array);
+					}
+					array.push(chunk);
+				}
+			}
+			/** @type {Map} */
+			const assetMap = new Map();
+			/** @type {Set} */
+			const assets = new Set();
+			for (const asset of compilation.getAssets()) {
+				/** @type {PreprocessedAsset} */
+				const item = {
+					...asset,
+					type: "asset",
+					related: undefined
+				};
+				assets.add(item);
+				assetMap.set(asset.name, item);
+			}
+			for (const item of assetMap.values()) {
+				const related = item.info.related;
+				if (!related) continue;
+				for (const type of Object.keys(related)) {
+					const relatedEntry = related[type];
+					const deps = Array.isArray(relatedEntry)
+						? relatedEntry
+						: [relatedEntry];
+					for (const dep of deps) {
+						const depItem = assetMap.get(dep);
+						if (!depItem) continue;
+						assets.delete(depItem);
+						depItem.type = type;
+						item.related = item.related || [];
+						item.related.push(depItem);
+					}
+				}
+			}
+
+			object.assetsByChunkName = {};
+			for (const [file, chunks] of compilationFileToChunks) {
+				for (const chunk of chunks) {
+					const name = chunk.name;
+					if (!name) continue;
+					if (
+						!Object.prototype.hasOwnProperty.call(
+							object.assetsByChunkName,
+							name
+						)
+					) {
+						object.assetsByChunkName[name] = [];
+					}
+					object.assetsByChunkName[name].push(file);
+				}
+			}
+
+			const groupedAssets = factory.create(
+				`${type}.assets`,
+				Array.from(assets),
+				{
+					...context,
+					compilationFileToChunks,
+					compilationAuxiliaryFileToChunks
+				}
+			);
+			const limited = spaceLimited(
+				groupedAssets,
+				/** @type {number} */ (options.assetsSpace)
+			);
+			object.assets = limited.children;
+			object.filteredAssets = limited.filteredChildren;
+		},
+		chunks: (object, compilation, context, options, factory) => {
+			const { type } = context;
+			object.chunks = factory.create(
+				`${type}.chunks`,
+				Array.from(compilation.chunks),
+				context
+			);
+		},
+		modules: (object, compilation, context, options, factory) => {
+			const { type } = context;
+			const array = Array.from(compilation.modules);
+			const groupedModules = factory.create(`${type}.modules`, array, context);
+			const limited = spaceLimited(groupedModules, options.modulesSpace);
+			object.modules = limited.children;
+			object.filteredModules = limited.filteredChildren;
+		},
+		entrypoints: (
+			object,
+			compilation,
+			context,
+			{ entrypoints, chunkGroups, chunkGroupAuxiliary, chunkGroupChildren },
+			factory
+		) => {
+			const { type } = context;
+			/** @type {ChunkGroupInfoWithName[]} */
+			const array = Array.from(compilation.entrypoints, ([key, value]) => ({
+				name: key,
+				chunkGroup: value
+			}));
+			if (entrypoints === "auto" && !chunkGroups) {
+				if (array.length > 5) return;
+				if (
+					!chunkGroupChildren &&
+					array.every(({ chunkGroup }) => {
+						if (chunkGroup.chunks.length !== 1) return false;
+						const chunk = chunkGroup.chunks[0];
+						return (
+							chunk.files.size === 1 &&
+							(!chunkGroupAuxiliary || chunk.auxiliaryFiles.size === 0)
+						);
+					})
+				) {
+					return;
+				}
+			}
+			object.entrypoints = factory.create(
+				`${type}.entrypoints`,
+				array,
+				context
+			);
+		},
+		chunkGroups: (object, compilation, context, options, factory) => {
+			const { type } = context;
+			const array = Array.from(
+				compilation.namedChunkGroups,
+				([key, value]) => ({
+					name: key,
+					chunkGroup: value
+				})
+			);
+			object.namedChunkGroups = factory.create(
+				`${type}.namedChunkGroups`,
+				array,
+				context
+			);
+		},
+		errors: (object, compilation, context, options, factory) => {
+			const { type, cachedGetErrors } = context;
+			const rawErrors = cachedGetErrors(compilation);
+			const factorizedErrors = factory.create(
+				`${type}.errors`,
+				cachedGetErrors(compilation),
+				context
+			);
+			let filtered = 0;
+			if (options.errorDetails === "auto" && rawErrors.length >= 3) {
+				filtered = rawErrors
+					.map(e => typeof e !== "string" && e.details)
+					.filter(Boolean).length;
+			}
+			if (
+				options.errorDetails === true ||
+				!Number.isFinite(options.errorsSpace)
+			) {
+				object.errors = factorizedErrors;
+				if (filtered) object.filteredErrorDetailsCount = filtered;
+				return;
+			}
+			const [errors, filteredBySpace] = errorsSpaceLimit(
+				factorizedErrors,
+				/** @type {number} */
+				(options.errorsSpace)
+			);
+			object.filteredErrorDetailsCount = filtered + filteredBySpace;
+			object.errors = errors;
+		},
+		errorsCount: (object, compilation, { cachedGetErrors }) => {
+			object.errorsCount = countWithChildren(compilation, c =>
+				cachedGetErrors(c)
+			);
+		},
+		warnings: (object, compilation, context, options, factory) => {
+			const { type, cachedGetWarnings } = context;
+			const rawWarnings = factory.create(
+				`${type}.warnings`,
+				cachedGetWarnings(compilation),
+				context
+			);
+			let filtered = 0;
+			if (options.errorDetails === "auto") {
+				filtered = cachedGetWarnings(compilation)
+					.map(e => typeof e !== "string" && e.details)
+					.filter(Boolean).length;
+			}
+			if (
+				options.errorDetails === true ||
+				!Number.isFinite(options.warningsSpace)
+			) {
+				object.warnings = rawWarnings;
+				if (filtered) object.filteredWarningDetailsCount = filtered;
+				return;
+			}
+			const [warnings, filteredBySpace] = errorsSpaceLimit(
+				rawWarnings,
+				/** @type {number} */
+				(options.warningsSpace)
+			);
+			object.filteredWarningDetailsCount = filtered + filteredBySpace;
+			object.warnings = warnings;
+		},
+		warningsCount: (
+			object,
+			compilation,
+			context,
+			{ warningsFilter },
+			factory
+		) => {
+			const { type, cachedGetWarnings } = context;
+			object.warningsCount = countWithChildren(compilation, (c, childType) => {
+				if (
+					!warningsFilter &&
+					/** @type {KnownNormalizedStatsOptions["warningsFilter"]} */
+					(warningsFilter).length === 0
+				)
+					// Type is wrong, because we don't need the real value for counting
+					return /** @type {EXPECTED_ANY[]} */ (cachedGetWarnings(c));
+				return factory
+					.create(`${type}${childType}.warnings`, cachedGetWarnings(c), context)
+					.filter(
+						/**
+						 * @param {StatsError} warning warning
+						 * @returns {boolean} result
+						 */
+						warning => {
+							const warningString = Object.keys(warning)
+								.map(
+									key =>
+										`${warning[/** @type {keyof KnownStatsError} */ (key)]}`
+								)
+								.join("\n");
+							return !warningsFilter.some(filter =>
+								filter(warning, warningString)
+							);
+						}
+					);
+			});
+		},
+		children: (object, compilation, context, options, factory) => {
+			const { type } = context;
+			object.children = factory.create(
+				`${type}.children`,
+				compilation.children,
+				context
+			);
+		}
+	},
+	asset: {
+		_: (object, asset, context, options, factory) => {
+			const { compilation } = context;
+			object.type = asset.type;
+			object.name = asset.name;
+			object.size = asset.source.size();
+			object.emitted = compilation.emittedAssets.has(asset.name);
+			object.comparedForEmit = compilation.comparedForEmitAssets.has(
+				asset.name
+			);
+			const cached = !object.emitted && !object.comparedForEmit;
+			object.cached = cached;
+			object.info = asset.info;
+			if (!cached || options.cachedAssets) {
+				Object.assign(
+					object,
+					factory.create(`${context.type}$visible`, asset, context)
+				);
+			}
+		}
+	},
+	asset$visible: {
+		_: (
+			object,
+			asset,
+			{ compilation, compilationFileToChunks, compilationAuxiliaryFileToChunks }
+		) => {
+			const chunks = compilationFileToChunks.get(asset.name) || [];
+			const auxiliaryChunks =
+				compilationAuxiliaryFileToChunks.get(asset.name) || [];
+			object.chunkNames = uniqueOrderedArray(
+				chunks,
+				c => (c.name ? [c.name] : []),
+				compareIds
+			);
+			object.chunkIdHints = uniqueOrderedArray(
+				chunks,
+				c => Array.from(c.idNameHints),
+				compareIds
+			);
+			object.auxiliaryChunkNames = uniqueOrderedArray(
+				auxiliaryChunks,
+				c => (c.name ? [c.name] : []),
+				compareIds
+			);
+			object.auxiliaryChunkIdHints = uniqueOrderedArray(
+				auxiliaryChunks,
+				c => Array.from(c.idNameHints),
+				compareIds
+			);
+			object.filteredRelated = asset.related ? asset.related.length : undefined;
+		},
+		relatedAssets: (object, asset, context, options, factory) => {
+			const { type } = context;
+			object.related = factory.create(
+				`${type.slice(0, -8)}.related`,
+				asset.related || [],
+				context
+			);
+			object.filteredRelated = asset.related
+				? asset.related.length -
+					/** @type {StatsAsset[]} */ (object.related).length
+				: undefined;
+		},
+		ids: (
+			object,
+			asset,
+			{ compilationFileToChunks, compilationAuxiliaryFileToChunks }
+		) => {
+			const chunks = compilationFileToChunks.get(asset.name) || [];
+			const auxiliaryChunks =
+				compilationAuxiliaryFileToChunks.get(asset.name) || [];
+			object.chunks = uniqueOrderedArray(
+				chunks,
+				c => /** @type {ChunkId[]} */ (c.ids),
+				compareIds
+			);
+			object.auxiliaryChunks = uniqueOrderedArray(
+				auxiliaryChunks,
+				c => /** @type {ChunkId[]} */ (c.ids),
+				compareIds
+			);
+		},
+		performance: (object, asset) => {
+			object.isOverSizeLimit = SizeLimitsPlugin.isOverSizeLimit(asset.source);
+		}
+	},
+	chunkGroup: {
+		_: (
+			object,
+			{ name, chunkGroup },
+			{ compilation, compilation: { moduleGraph, chunkGraph } },
+			{ ids, chunkGroupAuxiliary, chunkGroupChildren, chunkGroupMaxAssets }
+		) => {
+			const children =
+				chunkGroupChildren &&
+				chunkGroup.getChildrenByOrders(moduleGraph, chunkGraph);
+			/**
+			 * @param {string} name Name
+			 * @returns {{ name: string, size: number }} Asset object
+			 */
+			const toAsset = name => {
+				const asset = compilation.getAsset(name);
+				return {
+					name,
+					size: /** @type {number} */ (asset ? asset.info.size : -1)
+				};
+			};
+			/** @type {(total: number, asset: { size: number }) => number} */
+			const sizeReducer = (total, { size }) => total + size;
+			const assets = uniqueArray(chunkGroup.chunks, c => c.files).map(toAsset);
+			const auxiliaryAssets = uniqueOrderedArray(
+				chunkGroup.chunks,
+				c => c.auxiliaryFiles,
+				compareIds
+			).map(toAsset);
+			const assetsSize = assets.reduce(sizeReducer, 0);
+			const auxiliaryAssetsSize = auxiliaryAssets.reduce(sizeReducer, 0);
+			/** @type {KnownStatsChunkGroup} */
+			const statsChunkGroup = {
+				name,
+				chunks: ids
+					? /** @type {ChunkId[]} */ (chunkGroup.chunks.map(c => c.id))
+					: undefined,
+				assets: assets.length <= chunkGroupMaxAssets ? assets : undefined,
+				filteredAssets:
+					assets.length <= chunkGroupMaxAssets ? 0 : assets.length,
+				assetsSize,
+				auxiliaryAssets:
+					chunkGroupAuxiliary && auxiliaryAssets.length <= chunkGroupMaxAssets
+						? auxiliaryAssets
+						: undefined,
+				filteredAuxiliaryAssets:
+					chunkGroupAuxiliary && auxiliaryAssets.length <= chunkGroupMaxAssets
+						? 0
+						: auxiliaryAssets.length,
+				auxiliaryAssetsSize,
+				children: children
+					? mapObject(children, groups =>
+							groups.map(group => {
+								const assets = uniqueArray(group.chunks, c => c.files).map(
+									toAsset
+								);
+								const auxiliaryAssets = uniqueOrderedArray(
+									group.chunks,
+									c => c.auxiliaryFiles,
+									compareIds
+								).map(toAsset);
+
+								/** @type {KnownStatsChunkGroup} */
+								const childStatsChunkGroup = {
+									name: group.name,
+									chunks: ids
+										? /** @type {ChunkId[]} */
+											(group.chunks.map(c => c.id))
+										: undefined,
+									assets:
+										assets.length <= chunkGroupMaxAssets ? assets : undefined,
+									filteredAssets:
+										assets.length <= chunkGroupMaxAssets ? 0 : assets.length,
+									auxiliaryAssets:
+										chunkGroupAuxiliary &&
+										auxiliaryAssets.length <= chunkGroupMaxAssets
+											? auxiliaryAssets
+											: undefined,
+									filteredAuxiliaryAssets:
+										chunkGroupAuxiliary &&
+										auxiliaryAssets.length <= chunkGroupMaxAssets
+											? 0
+											: auxiliaryAssets.length
+								};
+
+								return childStatsChunkGroup;
+							})
+						)
+					: undefined,
+				childAssets: children
+					? mapObject(children, groups => {
+							/** @type {Set} */
+							const set = new Set();
+							for (const group of groups) {
+								for (const chunk of group.chunks) {
+									for (const asset of chunk.files) {
+										set.add(asset);
+									}
+								}
+							}
+							return Array.from(set);
+						})
+					: undefined
+			};
+			Object.assign(object, statsChunkGroup);
+		},
+		performance: (object, { chunkGroup }) => {
+			object.isOverSizeLimit = SizeLimitsPlugin.isOverSizeLimit(chunkGroup);
+		}
+	},
+	module: {
+		_: (object, module, context, options, factory) => {
+			const { type } = context;
+			const compilation = /** @type {Compilation} */ (context.compilation);
+			const built = compilation.builtModules.has(module);
+			const codeGenerated = compilation.codeGeneratedModules.has(module);
+			const buildTimeExecuted =
+				compilation.buildTimeExecutedModules.has(module);
+			/** @type {{[x: string]: number}} */
+			const sizes = {};
+			for (const sourceType of module.getSourceTypes()) {
+				sizes[sourceType] = module.size(sourceType);
+			}
+			/** @type {KnownStatsModule} */
+			const statsModule = {
+				type: "module",
+				moduleType: module.type,
+				layer: module.layer,
+				size: module.size(),
+				sizes,
+				built,
+				codeGenerated,
+				buildTimeExecuted,
+				cached: !built && !codeGenerated
+			};
+			Object.assign(object, statsModule);
+			if (built || codeGenerated || options.cachedModules) {
+				Object.assign(
+					object,
+					factory.create(`${type}$visible`, module, context)
+				);
+			}
+		}
+	},
+	module$visible: {
+		_: (object, module, context, { requestShortener }, factory) => {
+			const { type, rootModules } = context;
+			const compilation = /** @type {Compilation} */ (context.compilation);
+			const { moduleGraph } = compilation;
+			/** @type {ModuleIssuerPath} */
+			const path = [];
+			const issuer = moduleGraph.getIssuer(module);
+			let current = issuer;
+			while (current) {
+				path.push(current);
+				current = moduleGraph.getIssuer(current);
+			}
+			path.reverse();
+			const profile = moduleGraph.getProfile(module);
+			const errors = module.getErrors();
+			const errorsCount = errors !== undefined ? countIterable(errors) : 0;
+			const warnings = module.getWarnings();
+			const warningsCount =
+				warnings !== undefined ? countIterable(warnings) : 0;
+			/** @type {KnownStatsModule} */
+			const statsModule = {
+				identifier: module.identifier(),
+				name: module.readableIdentifier(requestShortener),
+				nameForCondition: module.nameForCondition(),
+				index: /** @type {number} */ (moduleGraph.getPreOrderIndex(module)),
+				preOrderIndex: /** @type {number} */ (
+					moduleGraph.getPreOrderIndex(module)
+				),
+				index2: /** @type {number} */ (moduleGraph.getPostOrderIndex(module)),
+				postOrderIndex: /** @type {number} */ (
+					moduleGraph.getPostOrderIndex(module)
+				),
+				cacheable: /** @type {BuildInfo} */ (module.buildInfo).cacheable,
+				optional: module.isOptional(moduleGraph),
+				orphan:
+					!type.endsWith("module.modules[].module$visible") &&
+					compilation.chunkGraph.getNumberOfModuleChunks(module) === 0,
+				dependent: rootModules ? !rootModules.has(module) : undefined,
+				issuer: issuer && issuer.identifier(),
+				issuerName: issuer && issuer.readableIdentifier(requestShortener),
+				issuerPath:
+					issuer &&
+					/** @type {StatsModuleIssuer[] | undefined} */
+					(factory.create(`${type.slice(0, -8)}.issuerPath`, path, context)),
+				failed: errorsCount > 0,
+				errors: errorsCount,
+				warnings: warningsCount
+			};
+			Object.assign(object, statsModule);
+			if (profile) {
+				object.profile = factory.create(
+					`${type.slice(0, -8)}.profile`,
+					profile,
+					context
+				);
+			}
+		},
+		ids: (object, module, { compilation: { chunkGraph, moduleGraph } }) => {
+			object.id = /** @type {ModuleId} */ (chunkGraph.getModuleId(module));
+			const issuer = moduleGraph.getIssuer(module);
+			object.issuerId = issuer && chunkGraph.getModuleId(issuer);
+			object.chunks =
+				/** @type {ChunkId[]} */
+				(
+					Array.from(
+						chunkGraph.getOrderedModuleChunksIterable(
+							module,
+							compareChunksById
+						),
+						chunk => chunk.id
+					)
+				);
+		},
+		moduleAssets: (object, module) => {
+			object.assets = /** @type {BuildInfo} */ (module.buildInfo).assets
+				? Object.keys(/** @type {BuildInfo} */ (module.buildInfo).assets)
+				: [];
+		},
+		reasons: (object, module, context, options, factory) => {
+			const {
+				type,
+				compilation: { moduleGraph }
+			} = context;
+			const groupsReasons = factory.create(
+				`${type.slice(0, -8)}.reasons`,
+				Array.from(moduleGraph.getIncomingConnections(module)),
+				context
+			);
+			const limited = spaceLimited(
+				groupsReasons,
+				/** @type {number} */
+				(options.reasonsSpace)
+			);
+			object.reasons = limited.children;
+			object.filteredReasons = limited.filteredChildren;
+		},
+		usedExports: (
+			object,
+			module,
+			{ runtime, compilation: { moduleGraph } }
+		) => {
+			const usedExports = moduleGraph.getUsedExports(module, runtime);
+			if (usedExports === null) {
+				object.usedExports = null;
+			} else if (typeof usedExports === "boolean") {
+				object.usedExports = usedExports;
+			} else {
+				object.usedExports = Array.from(usedExports);
+			}
+		},
+		providedExports: (object, module, { compilation: { moduleGraph } }) => {
+			const providedExports = moduleGraph.getProvidedExports(module);
+			object.providedExports = Array.isArray(providedExports)
+				? providedExports
+				: null;
+		},
+		optimizationBailout: (
+			object,
+			module,
+			{ compilation: { moduleGraph } },
+			{ requestShortener }
+		) => {
+			object.optimizationBailout = moduleGraph
+				.getOptimizationBailout(module)
+				.map(item => {
+					if (typeof item === "function") return item(requestShortener);
+					return item;
+				});
+		},
+		depth: (object, module, { compilation: { moduleGraph } }) => {
+			object.depth = moduleGraph.getDepth(module);
+		},
+		nestedModules: (object, module, context, options, factory) => {
+			const { type } = context;
+			const innerModules = /** @type {Module & { modules?: Module[] }} */ (
+				module
+			).modules;
+			if (Array.isArray(innerModules)) {
+				const groupedModules = factory.create(
+					`${type.slice(0, -8)}.modules`,
+					innerModules,
+					context
+				);
+				const limited = spaceLimited(
+					groupedModules,
+					options.nestedModulesSpace
+				);
+				object.modules = limited.children;
+				object.filteredModules = limited.filteredChildren;
+			}
+		},
+		source: (object, module) => {
+			const originalSource = module.originalSource();
+			if (originalSource) {
+				object.source = originalSource.source();
+			}
+		}
+	},
+	profile: {
+		_: (object, profile) => {
+			/** @type {KnownStatsProfile} */
+			const statsProfile = {
+				total:
+					profile.factory +
+					profile.restoring +
+					profile.integration +
+					profile.building +
+					profile.storing,
+				resolving: profile.factory,
+				restoring: profile.restoring,
+				building: profile.building,
+				integration: profile.integration,
+				storing: profile.storing,
+				additionalResolving: profile.additionalFactories,
+				additionalIntegration: profile.additionalIntegration,
+				// TODO remove this in webpack 6
+				factory: profile.factory,
+				// TODO remove this in webpack 6
+				dependencies: profile.additionalFactories
+			};
+			Object.assign(object, statsProfile);
+		}
+	},
+	moduleIssuer: {
+		_: (object, module, context, { requestShortener }, factory) => {
+			const { type } = context;
+			const compilation = /** @type {Compilation} */ (context.compilation);
+			const { moduleGraph } = compilation;
+			const profile = moduleGraph.getProfile(module);
+			/** @type {Partial} */
+			const statsModuleIssuer = {
+				identifier: module.identifier(),
+				name: module.readableIdentifier(requestShortener)
+			};
+			Object.assign(object, statsModuleIssuer);
+			if (profile) {
+				object.profile = factory.create(`${type}.profile`, profile, context);
+			}
+		},
+		ids: (object, module, { compilation: { chunkGraph } }) => {
+			object.id = /** @type {ModuleId} */ (chunkGraph.getModuleId(module));
+		}
+	},
+	moduleReason: {
+		_: (object, reason, { runtime }, { requestShortener }) => {
+			const dep = reason.dependency;
+			const moduleDep =
+				dep && dep instanceof ModuleDependency ? dep : undefined;
+			/** @type {KnownStatsModuleReason} */
+			const statsModuleReason = {
+				moduleIdentifier: reason.originModule
+					? reason.originModule.identifier()
+					: null,
+				module: reason.originModule
+					? reason.originModule.readableIdentifier(requestShortener)
+					: null,
+				moduleName: reason.originModule
+					? reason.originModule.readableIdentifier(requestShortener)
+					: null,
+				resolvedModuleIdentifier: reason.resolvedOriginModule
+					? reason.resolvedOriginModule.identifier()
+					: null,
+				resolvedModule: reason.resolvedOriginModule
+					? reason.resolvedOriginModule.readableIdentifier(requestShortener)
+					: null,
+				type: reason.dependency ? reason.dependency.type : null,
+				active: reason.isActive(runtime),
+				explanation: reason.explanation,
+				userRequest: (moduleDep && moduleDep.userRequest) || null
+			};
+			Object.assign(object, statsModuleReason);
+			if (reason.dependency) {
+				const locInfo = formatLocation(reason.dependency.loc);
+				if (locInfo) {
+					object.loc = locInfo;
+				}
+			}
+		},
+		ids: (object, reason, { compilation: { chunkGraph } }) => {
+			object.moduleId = reason.originModule
+				? chunkGraph.getModuleId(reason.originModule)
+				: null;
+			object.resolvedModuleId = reason.resolvedOriginModule
+				? chunkGraph.getModuleId(reason.resolvedOriginModule)
+				: null;
+		}
+	},
+	chunk: {
+		_: (object, chunk, { makePathsRelative, compilation: { chunkGraph } }) => {
+			const childIdByOrder = chunk.getChildIdsByOrders(chunkGraph);
+
+			/** @type {KnownStatsChunk} */
+			const statsChunk = {
+				rendered: chunk.rendered,
+				initial: chunk.canBeInitial(),
+				entry: chunk.hasRuntime(),
+				recorded: AggressiveSplittingPlugin.wasChunkRecorded(chunk),
+				reason: chunk.chunkReason,
+				size: chunkGraph.getChunkModulesSize(chunk),
+				sizes: chunkGraph.getChunkModulesSizes(chunk),
+				names: chunk.name ? [chunk.name] : [],
+				idHints: Array.from(chunk.idNameHints),
+				runtime:
+					chunk.runtime === undefined
+						? undefined
+						: typeof chunk.runtime === "string"
+							? [makePathsRelative(chunk.runtime)]
+							: Array.from(chunk.runtime.sort(), makePathsRelative),
+				files: Array.from(chunk.files),
+				auxiliaryFiles: Array.from(chunk.auxiliaryFiles).sort(compareIds),
+				hash: /** @type {string} */ (chunk.renderedHash),
+				childrenByOrder: childIdByOrder
+			};
+			Object.assign(object, statsChunk);
+		},
+		ids: (object, chunk) => {
+			object.id = /** @type {ChunkId} */ (chunk.id);
+		},
+		chunkRelations: (object, chunk, { compilation: { chunkGraph } }) => {
+			/** @type {Set} */
+			const parents = new Set();
+			/** @type {Set} */
+			const children = new Set();
+			/** @type {Set} */
+			const siblings = new Set();
+
+			for (const chunkGroup of chunk.groupsIterable) {
+				for (const parentGroup of chunkGroup.parentsIterable) {
+					for (const chunk of parentGroup.chunks) {
+						parents.add(/** @type {ChunkId} */ (chunk.id));
+					}
+				}
+				for (const childGroup of chunkGroup.childrenIterable) {
+					for (const chunk of childGroup.chunks) {
+						children.add(/** @type {ChunkId} */ (chunk.id));
+					}
+				}
+				for (const sibling of chunkGroup.chunks) {
+					if (sibling !== chunk)
+						siblings.add(/** @type {ChunkId} */ (sibling.id));
+				}
+			}
+			object.siblings = Array.from(siblings).sort(compareIds);
+			object.parents = Array.from(parents).sort(compareIds);
+			object.children = Array.from(children).sort(compareIds);
+		},
+		chunkModules: (object, chunk, context, options, factory) => {
+			const {
+				type,
+				compilation: { chunkGraph }
+			} = context;
+			const array = chunkGraph.getChunkModules(chunk);
+			const groupedModules = factory.create(`${type}.modules`, array, {
+				...context,
+				runtime: chunk.runtime,
+				rootModules: new Set(chunkGraph.getChunkRootModules(chunk))
+			});
+			const limited = spaceLimited(groupedModules, options.chunkModulesSpace);
+			object.modules = limited.children;
+			object.filteredModules = limited.filteredChildren;
+		},
+		chunkOrigins: (object, chunk, context, options, factory) => {
+			const {
+				type,
+				compilation: { chunkGraph }
+			} = context;
+			/** @type {Set} */
+			const originsKeySet = new Set();
+			/** @type {OriginRecord[]} */
+			const origins = [];
+			for (const g of chunk.groupsIterable) {
+				origins.push(...g.origins);
+			}
+			const array = origins.filter(origin => {
+				const key = [
+					origin.module ? chunkGraph.getModuleId(origin.module) : undefined,
+					formatLocation(origin.loc),
+					origin.request
+				].join();
+				if (originsKeySet.has(key)) return false;
+				originsKeySet.add(key);
+				return true;
+			});
+			object.origins = factory.create(`${type}.origins`, array, context);
+		}
+	},
+	chunkOrigin: {
+		_: (object, origin, context, { requestShortener }) => {
+			/** @type {KnownStatsChunkOrigin} */
+			const statsChunkOrigin = {
+				module: origin.module ? origin.module.identifier() : "",
+				moduleIdentifier: origin.module ? origin.module.identifier() : "",
+				moduleName: origin.module
+					? origin.module.readableIdentifier(requestShortener)
+					: "",
+				loc: formatLocation(origin.loc),
+				request: origin.request
+			};
+			Object.assign(object, statsChunkOrigin);
+		},
+		ids: (object, origin, { compilation: { chunkGraph } }) => {
+			object.moduleId = origin.module
+				? /** @type {ModuleId} */ (chunkGraph.getModuleId(origin.module))
+				: undefined;
+		}
+	},
+	error: EXTRACT_ERROR,
+	warning: EXTRACT_ERROR,
+	cause: EXTRACT_ERROR,
+	moduleTraceItem: {
+		_: (object, { origin, module }, context, { requestShortener }, factory) => {
+			const {
+				type,
+				compilation: { moduleGraph }
+			} = context;
+			object.originIdentifier = origin.identifier();
+			object.originName = origin.readableIdentifier(requestShortener);
+			object.moduleIdentifier = module.identifier();
+			object.moduleName = module.readableIdentifier(requestShortener);
+			const dependencies = Array.from(
+				moduleGraph.getIncomingConnections(module)
+			)
+				.filter(c => c.resolvedOriginModule === origin && c.dependency)
+				.map(c => c.dependency);
+			object.dependencies = factory.create(
+				`${type}.dependencies`,
+				/** @type {Dependency[]} */
+				(Array.from(new Set(dependencies))),
+				context
+			);
+		},
+		ids: (object, { origin, module }, { compilation: { chunkGraph } }) => {
+			object.originId =
+				/** @type {ModuleId} */
+				(chunkGraph.getModuleId(origin));
+			object.moduleId =
+				/** @type {ModuleId} */
+				(chunkGraph.getModuleId(module));
+		}
+	},
+	moduleTraceDependency: {
+		_: (object, dependency) => {
+			object.loc = formatLocation(dependency.loc);
+		}
+	}
+};
+
+/** @type {Record boolean | undefined>>} */
+const FILTER = {
+	"module.reasons": {
+		"!orphanModules": (reason, { compilation: { chunkGraph } }) => {
+			if (
+				reason.originModule &&
+				chunkGraph.getNumberOfModuleChunks(reason.originModule) === 0
+			) {
+				return false;
+			}
+		}
+	}
+};
+
+/** @type {Record boolean | undefined>>} */
+const FILTER_RESULTS = {
+	"compilation.warnings": {
+		warningsFilter: util.deprecate(
+			(warning, context, { warningsFilter }) => {
+				const warningString = Object.keys(warning)
+					.map(key => `${warning[/** @type {keyof KnownStatsError} */ (key)]}`)
+					.join("\n");
+				return !warningsFilter.some(filter => filter(warning, warningString));
+			},
+			"config.stats.warningsFilter is deprecated in favor of config.ignoreWarnings",
+			"DEP_WEBPACK_STATS_WARNINGS_FILTER"
+		)
+	}
+};
+
+/** @type {Record[], context: StatsFactoryContext) => void>} */
+const MODULES_SORTER = {
+	_: (comparators, { compilation: { moduleGraph } }) => {
+		comparators.push(
+			compareSelect(m => moduleGraph.getDepth(m), compareNumbers),
+			compareSelect(m => moduleGraph.getPreOrderIndex(m), compareNumbers),
+			compareSelect(m => m.identifier(), compareIds)
+		);
+	}
+};
+
+/** @type {Record[], context: StatsFactoryContext, options: NormalizedStatsOptions) => void>>} */
+const SORTERS = {
+	"compilation.chunks": {
+		_: comparators => {
+			comparators.push(compareSelect(c => c.id, compareIds));
+		}
+	},
+	"compilation.modules": MODULES_SORTER,
+	"chunk.rootModules": MODULES_SORTER,
+	"chunk.modules": MODULES_SORTER,
+	"module.modules": MODULES_SORTER,
+	"module.reasons": {
+		_: (comparators, { compilation: { chunkGraph } }) => {
+			comparators.push(
+				compareSelect(x => x.originModule, compareModulesByIdentifier)
+			);
+			comparators.push(
+				compareSelect(x => x.resolvedOriginModule, compareModulesByIdentifier)
+			);
+			comparators.push(
+				compareSelect(
+					x => x.dependency,
+					concatComparators(
+						compareSelect(
+							/**
+							 * @param {Dependency} x dependency
+							 * @returns {DependencyLocation} location
+							 */
+							x => x.loc,
+							compareLocations
+						),
+						compareSelect(x => x.type, compareIds)
+					)
+				)
+			);
+		}
+	},
+	"chunk.origins": {
+		_: (comparators, { compilation: { chunkGraph } }) => {
+			comparators.push(
+				compareSelect(
+					origin =>
+						origin.module ? chunkGraph.getModuleId(origin.module) : undefined,
+					compareIds
+				),
+				compareSelect(origin => formatLocation(origin.loc), compareIds),
+				compareSelect(origin => origin.request, compareIds)
+			);
+		}
+	}
+};
+
+/**
+ * @template T
+ * @typedef {T & { children?: Children[] | undefined, filteredChildren?: number }} Children
+ */
+
+/**
+ * @template T
+ * @param {Children} item item
+ * @returns {number} item size
+ */
+const getItemSize = item =>
+	// Each item takes 1 line
+	// + the size of the children
+	// + 1 extra line when it has children and filteredChildren
+	!item.children
+		? 1
+		: item.filteredChildren
+			? 2 + getTotalSize(item.children)
+			: 1 + getTotalSize(item.children);
+
+/**
+ * @template T
+ * @param {Children[]} children children
+ * @returns {number} total size
+ */
+const getTotalSize = children => {
+	let size = 0;
+	for (const child of children) {
+		size += getItemSize(child);
+	}
+	return size;
+};
+
+/**
+ * @template T
+ * @param {Children[]} children children
+ * @returns {number} total items
+ */
+const getTotalItems = children => {
+	let count = 0;
+	for (const child of children) {
+		if (!child.children && !child.filteredChildren) {
+			count++;
+		} else {
+			if (child.children) count += getTotalItems(child.children);
+			if (child.filteredChildren) count += child.filteredChildren;
+		}
+	}
+	return count;
+};
+
+/**
+ * @template T
+ * @param {Children[]} children children
+ * @returns {Children[]} collapsed children
+ */
+const collapse = children => {
+	// After collapse each child must take exactly one line
+	const newChildren = [];
+	for (const child of children) {
+		if (child.children) {
+			let filteredChildren = child.filteredChildren || 0;
+			filteredChildren += getTotalItems(child.children);
+			newChildren.push({
+				...child,
+				children: undefined,
+				filteredChildren
+			});
+		} else {
+			newChildren.push(child);
+		}
+	}
+	return newChildren;
+};
+
+/**
+ * @template T
+ * @param {Children[]} itemsAndGroups item and groups
+ * @param {number} max max
+ * @param {boolean=} filteredChildrenLineReserved filtered children line reserved
+ * @returns {Children} result
+ */
+const spaceLimited = (
+	itemsAndGroups,
+	max,
+	filteredChildrenLineReserved = false
+) => {
+	if (max < 1) {
+		return /** @type {Children} */ ({
+			children: undefined,
+			filteredChildren: getTotalItems(itemsAndGroups)
+		});
+	}
+	/** @type {Children[] | undefined} */
+	let children;
+	/** @type {number | undefined} */
+	let filteredChildren;
+	// This are the groups, which take 1+ lines each
+	/** @type {Children[] | undefined} */
+	const groups = [];
+	// The sizes of the groups are stored in groupSizes
+	/** @type {number[]} */
+	const groupSizes = [];
+	// This are the items, which take 1 line each
+	const items = [];
+	// The total of group sizes
+	let groupsSize = 0;
+
+	for (const itemOrGroup of itemsAndGroups) {
+		// is item
+		if (!itemOrGroup.children && !itemOrGroup.filteredChildren) {
+			items.push(itemOrGroup);
+		} else {
+			groups.push(itemOrGroup);
+			const size = getItemSize(itemOrGroup);
+			groupSizes.push(size);
+			groupsSize += size;
+		}
+	}
+
+	if (groupsSize + items.length <= max) {
+		// The total size in the current state fits into the max
+		// keep all
+		children = groups.length > 0 ? groups.concat(items) : items;
+	} else if (groups.length === 0) {
+		// slice items to max
+		// inner space marks that lines for filteredChildren already reserved
+		const limit = max - (filteredChildrenLineReserved ? 0 : 1);
+		filteredChildren = items.length - limit;
+		items.length = limit;
+		children = items;
+	} else {
+		// limit is the size when all groups are collapsed
+		const limit =
+			groups.length +
+			(filteredChildrenLineReserved || items.length === 0 ? 0 : 1);
+		if (limit < max) {
+			// calculate how much we are over the size limit
+			// this allows to approach the limit faster
+			let oversize;
+			// If each group would take 1 line the total would be below the maximum
+			// collapse some groups, keep items
+			while (
+				(oversize =
+					groupsSize +
+					items.length +
+					(filteredChildren && !filteredChildrenLineReserved ? 1 : 0) -
+					max) > 0
+			) {
+				// Find the maximum group and process only this one
+				const maxGroupSize = Math.max(...groupSizes);
+				if (maxGroupSize < items.length) {
+					filteredChildren = items.length;
+					items.length = 0;
+					continue;
+				}
+				for (let i = 0; i < groups.length; i++) {
+					if (groupSizes[i] === maxGroupSize) {
+						const group = groups[i];
+						// run this algorithm recursively and limit the size of the children to
+						// current size - oversize / number of groups
+						// So it should always end up being smaller
+						const headerSize = group.filteredChildren ? 2 : 1;
+						const limited = spaceLimited(
+							/** @type {Children[]} */ (group.children),
+							maxGroupSize -
+								// we should use ceil to always feet in max
+								Math.ceil(oversize / groups.length) -
+								// we substitute size of group head
+								headerSize,
+							headerSize === 2
+						);
+						groups[i] = {
+							...group,
+							children: limited.children,
+							filteredChildren: limited.filteredChildren
+								? (group.filteredChildren || 0) + limited.filteredChildren
+								: group.filteredChildren
+						};
+						const newSize = getItemSize(groups[i]);
+						groupsSize -= maxGroupSize - newSize;
+						groupSizes[i] = newSize;
+						break;
+					}
+				}
+			}
+			children = groups.concat(items);
+		} else if (limit === max) {
+			// If we have only enough space to show one line per group and one line for the filtered items
+			// collapse all groups and items
+			children = collapse(groups);
+			filteredChildren = items.length;
+		} else {
+			// If we have no space
+			// collapse complete group
+			filteredChildren = getTotalItems(itemsAndGroups);
+		}
+	}
+
+	return /** @type {Children} */ ({ children, filteredChildren });
+};
+
+/**
+ * @param {StatsError[]} errors errors
+ * @param {number} max max
+ * @returns {[StatsError[], number]} error space limit
+ */
+const errorsSpaceLimit = (errors, max) => {
+	let filtered = 0;
+	// Can not fit into limit
+	// print only messages
+	if (errors.length + 1 >= max)
+		return [
+			errors.map(error => {
+				if (typeof error === "string" || !error.details) return error;
+				filtered++;
+				return { ...error, details: "" };
+			}),
+			filtered
+		];
+	let fullLength = errors.length;
+	let result = errors;
+
+	let i = 0;
+	for (; i < errors.length; i++) {
+		const error = errors[i];
+		if (typeof error !== "string" && error.details) {
+			const splitted = error.details.split("\n");
+			const len = splitted.length;
+			fullLength += len;
+			if (fullLength > max) {
+				result = i > 0 ? errors.slice(0, i) : [];
+				const overLimit = fullLength - max + 1;
+				const error = errors[i++];
+				result.push({
+					...error,
+					details:
+						/** @type {string} */
+						(error.details).split("\n").slice(0, -overLimit).join("\n"),
+					filteredDetails: overLimit
+				});
+				filtered = errors.length - i;
+				for (; i < errors.length; i++) {
+					const error = errors[i];
+					if (typeof error === "string" || !error.details) result.push(error);
+					result.push({ ...error, details: "" });
+				}
+				break;
+			} else if (fullLength === max) {
+				result = errors.slice(0, ++i);
+				filtered = errors.length - i;
+				for (; i < errors.length; i++) {
+					const error = errors[i];
+					if (typeof error === "string" || !error.details) result.push(error);
+					result.push({ ...error, details: "" });
+				}
+				break;
+			}
+		}
+	}
+
+	return [result, filtered];
+};
+
+/**
+ * @template {{ size: number }} T
+ * @template {{ size: number }} R
+ * @param {(R | T)[]} children children
+ * @param {T[]} assets assets
+ * @returns {{ size: number }} asset size
+ */
+const assetGroup = (children, assets) => {
+	let size = 0;
+	for (const asset of children) {
+		size += asset.size;
+	}
+	return { size };
+};
+
+/**
+ * @template {{ size: number, sizes: Record }} T
+ * @param {Children[]} children children
+ * @param {KnownStatsModule[]} modules modules
+ * @returns {{ size: number, sizes: Record}} size and sizes
+ */
+const moduleGroup = (children, modules) => {
+	let size = 0;
+	/** @type {Record} */
+	const sizes = {};
+	for (const module of children) {
+		size += module.size;
+		for (const key of Object.keys(module.sizes)) {
+			sizes[key] = (sizes[key] || 0) + module.sizes[key];
+		}
+	}
+	return {
+		size,
+		sizes
+	};
+};
+
+/**
+ * @template {{ active: boolean }} T
+ * @param {Children[]} children children
+ * @param {KnownStatsModuleReason[]} reasons reasons
+ * @returns {{ active: boolean }} reason group
+ */
+const reasonGroup = (children, reasons) => {
+	let active = false;
+	for (const reason of children) {
+		active = active || reason.active;
+	}
+	return {
+		active
+	};
+};
+
+const GROUP_EXTENSION_REGEXP = /(\.[^.]+?)(?:\?|(?: \+ \d+ modules?)?$)/;
+const GROUP_PATH_REGEXP = /(.+)[/\\][^/\\]+?(?:\?|(?: \+ \d+ modules?)?$)/;
+
+/** @typedef {Record[], context: StatsFactoryContext, options: NormalizedStatsOptions) => void>} AssetsGroupers */
+
+/** @type {AssetsGroupers} */
+const ASSETS_GROUPERS = {
+	_: (groupConfigs, context, options) => {
+		/**
+		 * @param {keyof KnownStatsAsset} name name
+		 * @param {boolean=} exclude need exclude?
+		 */
+		const groupByFlag = (name, exclude) => {
+			groupConfigs.push({
+				getKeys: asset => (asset[name] ? ["1"] : undefined),
+				getOptions: () => ({
+					groupChildren: !exclude,
+					force: exclude
+				}),
+				createGroup: (key, children, assets) =>
+					exclude
+						? {
+								type: "assets by status",
+								[name]: Boolean(key),
+								filteredChildren: assets.length,
+								...assetGroup(children, assets)
+							}
+						: {
+								type: "assets by status",
+								[name]: Boolean(key),
+								children,
+								...assetGroup(children, assets)
+							}
+			});
+		};
+		const {
+			groupAssetsByEmitStatus,
+			groupAssetsByPath,
+			groupAssetsByExtension
+		} = options;
+		if (groupAssetsByEmitStatus) {
+			groupByFlag("emitted");
+			groupByFlag("comparedForEmit");
+			groupByFlag("isOverSizeLimit");
+		}
+		if (groupAssetsByEmitStatus || !options.cachedAssets) {
+			groupByFlag("cached", !options.cachedAssets);
+		}
+		if (groupAssetsByPath || groupAssetsByExtension) {
+			groupConfigs.push({
+				getKeys: asset => {
+					const extensionMatch =
+						groupAssetsByExtension && GROUP_EXTENSION_REGEXP.exec(asset.name);
+					const extension = extensionMatch ? extensionMatch[1] : "";
+					const pathMatch =
+						groupAssetsByPath && GROUP_PATH_REGEXP.exec(asset.name);
+					const path = pathMatch ? pathMatch[1].split(/[/\\]/) : [];
+					/** @type {string[]} */
+					const keys = [];
+					if (groupAssetsByPath) {
+						keys.push(".");
+						if (extension)
+							keys.push(
+								path.length
+									? `${path.join("/")}/*${extension}`
+									: `*${extension}`
+							);
+						while (path.length > 0) {
+							keys.push(`${path.join("/")}/`);
+							path.pop();
+						}
+					} else if (extension) {
+						keys.push(`*${extension}`);
+					}
+					return keys;
+				},
+				createGroup: (key, children, assets) => ({
+					type: groupAssetsByPath ? "assets by path" : "assets by extension",
+					name: key,
+					children,
+					...assetGroup(children, assets)
+				})
+			});
+		}
+	},
+	groupAssetsByInfo: (groupConfigs, context, options) => {
+		/**
+		 * @param {string} name name
+		 */
+		const groupByAssetInfoFlag = name => {
+			groupConfigs.push({
+				getKeys: asset => (asset.info && asset.info[name] ? ["1"] : undefined),
+				createGroup: (key, children, assets) => ({
+					type: "assets by info",
+					info: {
+						[name]: Boolean(key)
+					},
+					children,
+					...assetGroup(children, assets)
+				})
+			});
+		};
+		groupByAssetInfoFlag("immutable");
+		groupByAssetInfoFlag("development");
+		groupByAssetInfoFlag("hotModuleReplacement");
+	},
+	groupAssetsByChunk: (groupConfigs, context, options) => {
+		/**
+		 * @param {keyof KnownStatsAsset} name name
+		 */
+		const groupByNames = name => {
+			groupConfigs.push({
+				getKeys: asset => /** @type {string[]} */ (asset[name]),
+				createGroup: (key, children, assets) => ({
+					type: "assets by chunk",
+					[name]: [key],
+					children,
+					...assetGroup(children, assets)
+				})
+			});
+		};
+		groupByNames("chunkNames");
+		groupByNames("auxiliaryChunkNames");
+		groupByNames("chunkIdHints");
+		groupByNames("auxiliaryChunkIdHints");
+	},
+	excludeAssets: (groupConfigs, context, { excludeAssets }) => {
+		groupConfigs.push({
+			getKeys: asset => {
+				const ident = asset.name;
+				const excluded = excludeAssets.some(fn => fn(ident, asset));
+				if (excluded) return ["excluded"];
+			},
+			getOptions: () => ({
+				groupChildren: false,
+				force: true
+			}),
+			createGroup: (key, children, assets) => ({
+				type: "hidden assets",
+				filteredChildren: assets.length,
+				...assetGroup(children, assets)
+			})
+		});
+	}
+};
+
+/** @typedef {Record[], context: StatsFactoryContext, options: NormalizedStatsOptions) => void>} ModulesGroupers */
+
+/** @type {(type: ExcludeModulesType) => ModulesGroupers} */
+const MODULES_GROUPERS = type => ({
+	_: (groupConfigs, context, options) => {
+		/**
+		 * @param {keyof KnownStatsModule} name name
+		 * @param {string} type type
+		 * @param {boolean=} exclude need exclude?
+		 */
+		const groupByFlag = (name, type, exclude) => {
+			groupConfigs.push({
+				getKeys: module => (module[name] ? ["1"] : undefined),
+				getOptions: () => ({
+					groupChildren: !exclude,
+					force: exclude
+				}),
+				createGroup: (key, children, modules) => ({
+					type,
+					[name]: Boolean(key),
+					...(exclude ? { filteredChildren: modules.length } : { children }),
+					...moduleGroup(children, modules)
+				})
+			});
+		};
+		const {
+			groupModulesByCacheStatus,
+			groupModulesByLayer,
+			groupModulesByAttributes,
+			groupModulesByType,
+			groupModulesByPath,
+			groupModulesByExtension
+		} = options;
+		if (groupModulesByAttributes) {
+			groupByFlag("errors", "modules with errors");
+			groupByFlag("warnings", "modules with warnings");
+			groupByFlag("assets", "modules with assets");
+			groupByFlag("optional", "optional modules");
+		}
+		if (groupModulesByCacheStatus) {
+			groupByFlag("cacheable", "cacheable modules");
+			groupByFlag("built", "built modules");
+			groupByFlag("codeGenerated", "code generated modules");
+		}
+		if (groupModulesByCacheStatus || !options.cachedModules) {
+			groupByFlag("cached", "cached modules", !options.cachedModules);
+		}
+		if (groupModulesByAttributes || !options.orphanModules) {
+			groupByFlag("orphan", "orphan modules", !options.orphanModules);
+		}
+		if (groupModulesByAttributes || !options.dependentModules) {
+			groupByFlag("dependent", "dependent modules", !options.dependentModules);
+		}
+		if (groupModulesByType || !options.runtimeModules) {
+			groupConfigs.push({
+				getKeys: module => {
+					if (!module.moduleType) return;
+					if (groupModulesByType) {
+						return [module.moduleType.split("/", 1)[0]];
+					} else if (module.moduleType === WEBPACK_MODULE_TYPE_RUNTIME) {
+						return [WEBPACK_MODULE_TYPE_RUNTIME];
+					}
+				},
+				getOptions: key => {
+					const exclude =
+						key === WEBPACK_MODULE_TYPE_RUNTIME && !options.runtimeModules;
+					return {
+						groupChildren: !exclude,
+						force: exclude
+					};
+				},
+				createGroup: (key, children, modules) => {
+					const exclude =
+						key === WEBPACK_MODULE_TYPE_RUNTIME && !options.runtimeModules;
+					return {
+						type: `${key} modules`,
+						moduleType: key,
+						...(exclude ? { filteredChildren: modules.length } : { children }),
+						...moduleGroup(children, modules)
+					};
+				}
+			});
+		}
+		if (groupModulesByLayer) {
+			groupConfigs.push({
+				getKeys: module => /** @type {string[]} */ ([module.layer]),
+				createGroup: (key, children, modules) => ({
+					type: "modules by layer",
+					layer: key,
+					children,
+					...moduleGroup(children, modules)
+				})
+			});
+		}
+		if (groupModulesByPath || groupModulesByExtension) {
+			groupConfigs.push({
+				getKeys: module => {
+					if (!module.name) return;
+					const resource = parseResource(
+						/** @type {string} */ (module.name.split("!").pop())
+					).path;
+					const dataUrl = /^data:[^,;]+/.exec(resource);
+					if (dataUrl) return [dataUrl[0]];
+					const extensionMatch =
+						groupModulesByExtension && GROUP_EXTENSION_REGEXP.exec(resource);
+					const extension = extensionMatch ? extensionMatch[1] : "";
+					const pathMatch =
+						groupModulesByPath && GROUP_PATH_REGEXP.exec(resource);
+					const path = pathMatch ? pathMatch[1].split(/[/\\]/) : [];
+					const keys = [];
+					if (groupModulesByPath) {
+						if (extension)
+							keys.push(
+								path.length
+									? `${path.join("/")}/*${extension}`
+									: `*${extension}`
+							);
+						while (path.length > 0) {
+							keys.push(`${path.join("/")}/`);
+							path.pop();
+						}
+					} else if (extension) {
+						keys.push(`*${extension}`);
+					}
+					return keys;
+				},
+				createGroup: (key, children, modules) => {
+					const isDataUrl = key.startsWith("data:");
+					return {
+						type: isDataUrl
+							? "modules by mime type"
+							: groupModulesByPath
+								? "modules by path"
+								: "modules by extension",
+						name: isDataUrl ? key.slice(/* 'data:'.length */ 5) : key,
+						children,
+						...moduleGroup(children, modules)
+					};
+				}
+			});
+		}
+	},
+	excludeModules: (groupConfigs, context, { excludeModules }) => {
+		groupConfigs.push({
+			getKeys: module => {
+				const name = module.name;
+				if (name) {
+					const excluded = excludeModules.some(fn => fn(name, module, type));
+					if (excluded) return ["1"];
+				}
+			},
+			getOptions: () => ({
+				groupChildren: false,
+				force: true
+			}),
+			createGroup: (key, children, modules) => ({
+				type: "hidden modules",
+				filteredChildren: children.length,
+				...moduleGroup(children, modules)
+			})
+		});
+	}
+});
+
+/** @typedef {Record[], context: StatsFactoryContext, options: NormalizedStatsOptions) => void>} ModuleReasonsGroupers */
+
+/** @type {ModuleReasonsGroupers} */
+const MODULE_REASONS_GROUPERS = {
+	groupReasonsByOrigin: groupConfigs => {
+		groupConfigs.push({
+			getKeys: reason => /** @type {string[]} */ ([reason.module]),
+			createGroup: (key, children, reasons) => ({
+				type: "from origin",
+				module: key,
+				children,
+				...reasonGroup(children, reasons)
+			})
+		});
+	}
+};
+
+/** @type {Record} */
+const RESULT_GROUPERS = {
+	"compilation.assets": ASSETS_GROUPERS,
+	"asset.related": ASSETS_GROUPERS,
+	"compilation.modules": MODULES_GROUPERS("module"),
+	"chunk.modules": MODULES_GROUPERS("chunk"),
+	"chunk.rootModules": MODULES_GROUPERS("root-of-chunk"),
+	"module.modules": MODULES_GROUPERS("nested"),
+	"module.reasons": MODULE_REASONS_GROUPERS
+};
+
+// remove a prefixed "!" that can be specified to reverse sort order
+/**
+ * @param {string} field a field name
+ * @returns {field} normalized field
+ */
+const normalizeFieldKey = field => {
+	if (field[0] === "!") {
+		return field.slice(1);
+	}
+	return field;
+};
+
+// if a field is prefixed by a "!" reverse sort order
+/**
+ * @param {string} field a field name
+ * @returns {boolean} result
+ */
+const sortOrderRegular = field => {
+	if (field[0] === "!") {
+		return false;
+	}
+	return true;
+};
+
+/**
+ * @template T
+ * @param {string | false} field field name
+ * @returns {(a: T, b: T) => 0 | 1 | -1} comparators
+ */
+const sortByField = field => {
+	if (!field) {
+		/**
+		 * @param {T} a first
+		 * @param {T} b second
+		 * @returns {-1 | 0 | 1} zero
+		 */
+		const noSort = (a, b) => 0;
+		return noSort;
+	}
+
+	const fieldKey = normalizeFieldKey(field);
+
+	let sortFn = compareSelect(m => m[fieldKey], compareIds);
+
+	// if a field is prefixed with a "!" the sort is reversed!
+	const sortIsRegular = sortOrderRegular(field);
+
+	if (!sortIsRegular) {
+		const oldSortFn = sortFn;
+		sortFn = (a, b) => oldSortFn(b, a);
+	}
+
+	return sortFn;
+};
+
+/** @type {Record[], context: StatsFactoryContext, options: NormalizedStatsOptions) => void>} */
+const ASSET_SORTERS = {
+	assetsSort: (comparators, context, { assetsSort }) => {
+		comparators.push(sortByField(assetsSort));
+	},
+	_: comparators => {
+		comparators.push(compareSelect(a => a.name, compareIds));
+	}
+};
+
+/** @type {Record[], context: StatsFactoryContext, options: NormalizedStatsOptions) => void>>} */
+const RESULT_SORTERS = {
+	"compilation.chunks": {
+		chunksSort: (comparators, context, { chunksSort }) => {
+			comparators.push(sortByField(chunksSort));
+		}
+	},
+	"compilation.modules": {
+		modulesSort: (comparators, context, { modulesSort }) => {
+			comparators.push(sortByField(modulesSort));
+		}
+	},
+	"chunk.modules": {
+		chunkModulesSort: (comparators, context, { chunkModulesSort }) => {
+			comparators.push(sortByField(chunkModulesSort));
+		}
+	},
+	"module.modules": {
+		nestedModulesSort: (comparators, context, { nestedModulesSort }) => {
+			comparators.push(sortByField(nestedModulesSort));
+		}
+	},
+	"compilation.assets": ASSET_SORTERS,
+	"asset.related": ASSET_SORTERS
+};
+
+/**
+ * @template T
+ * @param {Record>} config the config see above
+ * @param {NormalizedStatsOptions} options stats options
+ * @param {(hookFor: string, fn: T) => void} fn handler function called for every active line in config
+ * @returns {void}
+ */
+const iterateConfig = (config, options, fn) => {
+	for (const hookFor of Object.keys(config)) {
+		const subConfig = config[hookFor];
+		for (const option of Object.keys(subConfig)) {
+			if (option !== "_") {
+				if (option.startsWith("!")) {
+					if (options[option.slice(1)]) continue;
+				} else {
+					const value = options[option];
+					if (
+						value === false ||
+						value === undefined ||
+						(Array.isArray(value) && value.length === 0)
+					)
+						continue;
+				}
+			}
+			fn(hookFor, subConfig[option]);
+		}
+	}
+};
+
+/** @type {Record} */
+const ITEM_NAMES = {
+	"compilation.children[]": "compilation",
+	"compilation.modules[]": "module",
+	"compilation.entrypoints[]": "chunkGroup",
+	"compilation.namedChunkGroups[]": "chunkGroup",
+	"compilation.errors[]": "error",
+	"compilation.warnings[]": "warning",
+	"error.errors[]": "error",
+	"warning.errors[]": "error",
+	"chunk.modules[]": "module",
+	"chunk.rootModules[]": "module",
+	"chunk.origins[]": "chunkOrigin",
+	"compilation.chunks[]": "chunk",
+	"compilation.assets[]": "asset",
+	"asset.related[]": "asset",
+	"module.issuerPath[]": "moduleIssuer",
+	"module.reasons[]": "moduleReason",
+	"module.modules[]": "module",
+	"module.children[]": "module",
+	"moduleTrace[]": "moduleTraceItem",
+	"moduleTraceItem.dependencies[]": "moduleTraceDependency"
+};
+
+/**
+ * @template T
+ * @typedef {{ name: T }} NamedObject
+ */
+
+/**
+ * @template {{ name: string }} T
+ * @param {T[]} items items to be merged
+ * @returns {NamedObject} an object
+ */
+const mergeToObject = items => {
+	const obj = Object.create(null);
+	for (const item of items) {
+		obj[item.name] = item;
+	}
+	return obj;
+};
+
+/**
+ * @template {{ name: string }} T
+ * @type {Record NamedObject>}
+ */
+const MERGER = {
+	"compilation.entrypoints": mergeToObject,
+	"compilation.namedChunkGroups": mergeToObject
+};
+
+const PLUGIN_NAME = "DefaultStatsFactoryPlugin";
+
+class DefaultStatsFactoryPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			compilation.hooks.statsFactory.tap(
+				PLUGIN_NAME,
+				/**
+				 * @param {StatsFactory} stats stats factory
+				 * @param {NormalizedStatsOptions} options stats options
+				 */
+				(stats, options) => {
+					iterateConfig(
+						/** @type {TODO} */
+						(SIMPLE_EXTRACTORS),
+						options,
+						(hookFor, fn) => {
+							stats.hooks.extract
+								.for(hookFor)
+								.tap(PLUGIN_NAME, (obj, data, ctx) =>
+									fn(obj, data, ctx, options, stats)
+								);
+						}
+					);
+					iterateConfig(FILTER, options, (hookFor, fn) => {
+						stats.hooks.filter
+							.for(hookFor)
+							.tap(PLUGIN_NAME, (item, ctx, idx, i) =>
+								fn(item, ctx, options, idx, i)
+							);
+					});
+					iterateConfig(FILTER_RESULTS, options, (hookFor, fn) => {
+						stats.hooks.filterResults
+							.for(hookFor)
+							.tap(PLUGIN_NAME, (item, ctx, idx, i) =>
+								fn(item, ctx, options, idx, i)
+							);
+					});
+					iterateConfig(SORTERS, options, (hookFor, fn) => {
+						stats.hooks.sort
+							.for(hookFor)
+							.tap(PLUGIN_NAME, (comparators, ctx) =>
+								fn(comparators, ctx, options)
+							);
+					});
+					iterateConfig(RESULT_SORTERS, options, (hookFor, fn) => {
+						stats.hooks.sortResults
+							.for(hookFor)
+							.tap(PLUGIN_NAME, (comparators, ctx) =>
+								fn(comparators, ctx, options)
+							);
+					});
+					iterateConfig(
+						/** @type {TODO} */
+						(RESULT_GROUPERS),
+						options,
+						(hookFor, fn) => {
+							stats.hooks.groupResults
+								.for(hookFor)
+								.tap(PLUGIN_NAME, (groupConfigs, ctx) =>
+									fn(groupConfigs, ctx, options)
+								);
+						}
+					);
+					for (const key of Object.keys(ITEM_NAMES)) {
+						const itemName = ITEM_NAMES[key];
+						stats.hooks.getItemName.for(key).tap(PLUGIN_NAME, () => itemName);
+					}
+					for (const key of Object.keys(MERGER)) {
+						const merger = MERGER[key];
+						stats.hooks.merge.for(key).tap(PLUGIN_NAME, merger);
+					}
+					if (options.children) {
+						if (Array.isArray(options.children)) {
+							stats.hooks.getItemFactory
+								.for("compilation.children[].compilation")
+								.tap(
+									PLUGIN_NAME,
+									/**
+									 * @param {Compilation} comp compilation
+									 * @param {StatsFactoryContext} options options
+									 * @returns {StatsFactory | undefined} stats factory
+									 */
+									(comp, { _index: idx }) => {
+										const children =
+											/** @type {TODO} */
+											(options.children);
+										if (idx < children.length) {
+											return compilation.createStatsFactory(
+												compilation.createStatsOptions(children[idx])
+											);
+										}
+									}
+								);
+						} else if (options.children !== true) {
+							const childFactory = compilation.createStatsFactory(
+								compilation.createStatsOptions(options.children)
+							);
+							stats.hooks.getItemFactory
+								.for("compilation.children[].compilation")
+								.tap(PLUGIN_NAME, () => childFactory);
+						}
+					}
+				}
+			);
+		});
+	}
+}
+module.exports = DefaultStatsFactoryPlugin;
diff --git a/lib/stats/DefaultStatsPresetPlugin.js b/lib/stats/DefaultStatsPresetPlugin.js
new file mode 100644
index 00000000000..c3d5ca21071
--- /dev/null
+++ b/lib/stats/DefaultStatsPresetPlugin.js
@@ -0,0 +1,411 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+const RequestShortener = require("../RequestShortener");
+
+/** @typedef {import("../../declarations/WebpackOptions").StatsOptions} StatsOptions */
+/** @typedef {import("../../declarations/WebpackOptions").StatsValue} StatsValue */
+/** @typedef {import("../Compilation")} Compilation */
+/** @typedef {import("../Compilation").CreateStatsOptionsContext} CreateStatsOptionsContext */
+/** @typedef {import("../Compilation").KnownNormalizedStatsOptions} KnownNormalizedStatsOptions */
+/** @typedef {import("../Compilation").NormalizedStatsOptions} NormalizedStatsOptions */
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("./DefaultStatsFactoryPlugin").StatsError} StatsError */
+
+/**
+ * @param {Partial} options options
+ * @param {StatsOptions} defaults default options
+ */
+const applyDefaults = (options, defaults) => {
+	for (const _k of Object.keys(defaults)) {
+		const key = /** @type {keyof StatsOptions} */ (_k);
+		if (typeof options[key] === "undefined") {
+			options[/** @type {keyof NormalizedStatsOptions} */ (key)] =
+				defaults[key];
+		}
+	}
+};
+
+/** @typedef {{ [Key in Exclude]: StatsOptions }} NamedPresets */
+
+/** @type {NamedPresets} */
+const NAMED_PRESETS = {
+	verbose: {
+		hash: true,
+		builtAt: true,
+		relatedAssets: true,
+		entrypoints: true,
+		chunkGroups: true,
+		ids: true,
+		modules: false,
+		chunks: true,
+		chunkRelations: true,
+		chunkModules: true,
+		dependentModules: true,
+		chunkOrigins: true,
+		depth: true,
+		env: true,
+		reasons: true,
+		usedExports: true,
+		providedExports: true,
+		optimizationBailout: true,
+		errorDetails: true,
+		errorStack: true,
+		errorCause: true,
+		errorErrors: true,
+		publicPath: true,
+		logging: "verbose",
+		orphanModules: true,
+		runtimeModules: true,
+		exclude: false,
+		errorsSpace: Infinity,
+		warningsSpace: Infinity,
+		modulesSpace: Infinity,
+		chunkModulesSpace: Infinity,
+		assetsSpace: Infinity,
+		reasonsSpace: Infinity,
+		children: true
+	},
+	detailed: {
+		hash: true,
+		builtAt: true,
+		relatedAssets: true,
+		entrypoints: true,
+		chunkGroups: true,
+		ids: true,
+		chunks: true,
+		chunkRelations: true,
+		chunkModules: false,
+		chunkOrigins: true,
+		depth: true,
+		usedExports: true,
+		providedExports: true,
+		optimizationBailout: true,
+		errorDetails: true,
+		errorCause: true,
+		errorErrors: true,
+		publicPath: true,
+		logging: true,
+		runtimeModules: true,
+		exclude: false,
+		errorsSpace: 1000,
+		warningsSpace: 1000,
+		modulesSpace: 1000,
+		assetsSpace: 1000,
+		reasonsSpace: 1000
+	},
+	minimal: {
+		all: false,
+		version: true,
+		timings: true,
+		modules: true,
+		errorsSpace: 0,
+		warningsSpace: 0,
+		modulesSpace: 0,
+		assets: true,
+		assetsSpace: 0,
+		errors: true,
+		errorsCount: true,
+		warnings: true,
+		warningsCount: true,
+		logging: "warn"
+	},
+	"errors-only": {
+		all: false,
+		errors: true,
+		errorsCount: true,
+		errorsSpace: Infinity,
+		moduleTrace: true,
+		logging: "error"
+	},
+	"errors-warnings": {
+		all: false,
+		errors: true,
+		errorsCount: true,
+		errorsSpace: Infinity,
+		warnings: true,
+		warningsCount: true,
+		warningsSpace: Infinity,
+		logging: "warn"
+	},
+	summary: {
+		all: false,
+		version: true,
+		errorsCount: true,
+		warningsCount: true
+	},
+	none: {
+		all: false
+	}
+};
+
+/**
+ * @param {Partial} all stats option
+ * @returns {boolean} true when enabled, otherwise false
+ */
+const NORMAL_ON = ({ all }) => all !== false;
+/**
+ * @param {Partial} all stats option
+ * @returns {boolean} true when enabled, otherwise false
+ */
+const NORMAL_OFF = ({ all }) => all === true;
+/**
+ * @param {Partial} all stats option
+ * @param {CreateStatsOptionsContext} forToString stats options context
+ * @returns {boolean} true when enabled, otherwise false
+ */
+const ON_FOR_TO_STRING = ({ all }, { forToString }) =>
+	forToString ? all !== false : all === true;
+/**
+ * @param {Partial} all stats option
+ * @param {CreateStatsOptionsContext} forToString stats options context
+ * @returns {boolean} true when enabled, otherwise false
+ */
+const OFF_FOR_TO_STRING = ({ all }, { forToString }) =>
+	forToString ? all === true : all !== false;
+/**
+ * @param {Partial} all stats option
+ * @param {CreateStatsOptionsContext} forToString stats options context
+ * @returns {boolean | "auto"} true when enabled, otherwise false
+ */
+const AUTO_FOR_TO_STRING = ({ all }, { forToString }) => {
+	if (all === false) return false;
+	if (all === true) return true;
+	if (forToString) return "auto";
+	return true;
+};
+
+/** @typedef {keyof NormalizedStatsOptions} DefaultsKeys */
+/** @typedef {{ [Key in DefaultsKeys]: (options: Partial, context: CreateStatsOptionsContext, compilation: Compilation) => NormalizedStatsOptions[Key] | RequestShortener }} Defaults */
+
+/** @type {Partial} */
+const DEFAULTS = {
+	context: (options, context, compilation) => compilation.compiler.context,
+	requestShortener: (options, context, compilation) =>
+		compilation.compiler.context === options.context
+			? compilation.requestShortener
+			: new RequestShortener(
+					/** @type {string} */
+					(options.context),
+					compilation.compiler.root
+				),
+	performance: NORMAL_ON,
+	hash: OFF_FOR_TO_STRING,
+	env: NORMAL_OFF,
+	version: NORMAL_ON,
+	timings: NORMAL_ON,
+	builtAt: OFF_FOR_TO_STRING,
+	assets: NORMAL_ON,
+	entrypoints: AUTO_FOR_TO_STRING,
+	chunkGroups: OFF_FOR_TO_STRING,
+	chunkGroupAuxiliary: OFF_FOR_TO_STRING,
+	chunkGroupChildren: OFF_FOR_TO_STRING,
+	chunkGroupMaxAssets: (o, { forToString }) => (forToString ? 5 : Infinity),
+	chunks: OFF_FOR_TO_STRING,
+	chunkRelations: OFF_FOR_TO_STRING,
+	chunkModules: ({ all, modules }) => {
+		if (all === false) return false;
+		if (all === true) return true;
+		if (modules) return false;
+		return true;
+	},
+	dependentModules: OFF_FOR_TO_STRING,
+	chunkOrigins: OFF_FOR_TO_STRING,
+	ids: OFF_FOR_TO_STRING,
+	modules: ({ all, chunks, chunkModules }, { forToString }) => {
+		if (all === false) return false;
+		if (all === true) return true;
+		if (forToString && chunks && chunkModules) return false;
+		return true;
+	},
+	nestedModules: OFF_FOR_TO_STRING,
+	groupModulesByType: ON_FOR_TO_STRING,
+	groupModulesByCacheStatus: ON_FOR_TO_STRING,
+	groupModulesByLayer: ON_FOR_TO_STRING,
+	groupModulesByAttributes: ON_FOR_TO_STRING,
+	groupModulesByPath: ON_FOR_TO_STRING,
+	groupModulesByExtension: ON_FOR_TO_STRING,
+	modulesSpace: (o, { forToString }) => (forToString ? 15 : Infinity),
+	chunkModulesSpace: (o, { forToString }) => (forToString ? 10 : Infinity),
+	nestedModulesSpace: (o, { forToString }) => (forToString ? 10 : Infinity),
+	relatedAssets: OFF_FOR_TO_STRING,
+	groupAssetsByEmitStatus: ON_FOR_TO_STRING,
+	groupAssetsByInfo: ON_FOR_TO_STRING,
+	groupAssetsByPath: ON_FOR_TO_STRING,
+	groupAssetsByExtension: ON_FOR_TO_STRING,
+	groupAssetsByChunk: ON_FOR_TO_STRING,
+	assetsSpace: (o, { forToString }) => (forToString ? 15 : Infinity),
+	orphanModules: OFF_FOR_TO_STRING,
+	runtimeModules: ({ all, runtime }, { forToString }) =>
+		runtime !== undefined
+			? runtime
+			: forToString
+				? all === true
+				: all !== false,
+	cachedModules: ({ all, cached }, { forToString }) =>
+		cached !== undefined ? cached : forToString ? all === true : all !== false,
+	moduleAssets: OFF_FOR_TO_STRING,
+	depth: OFF_FOR_TO_STRING,
+	cachedAssets: OFF_FOR_TO_STRING,
+	reasons: OFF_FOR_TO_STRING,
+	reasonsSpace: (o, { forToString }) => (forToString ? 15 : Infinity),
+	groupReasonsByOrigin: ON_FOR_TO_STRING,
+	usedExports: OFF_FOR_TO_STRING,
+	providedExports: OFF_FOR_TO_STRING,
+	optimizationBailout: OFF_FOR_TO_STRING,
+	children: OFF_FOR_TO_STRING,
+	source: NORMAL_OFF,
+	moduleTrace: NORMAL_ON,
+	errors: NORMAL_ON,
+	errorsCount: NORMAL_ON,
+	errorDetails: AUTO_FOR_TO_STRING,
+	errorStack: OFF_FOR_TO_STRING,
+	errorCause: AUTO_FOR_TO_STRING,
+	errorErrors: AUTO_FOR_TO_STRING,
+	warnings: NORMAL_ON,
+	warningsCount: NORMAL_ON,
+	publicPath: OFF_FOR_TO_STRING,
+	logging: ({ all }, { forToString }) =>
+		forToString && all !== false ? "info" : false,
+	loggingDebug: () => [],
+	loggingTrace: OFF_FOR_TO_STRING,
+	excludeModules: () => [],
+	excludeAssets: () => [],
+	modulesSort: () => "depth",
+	chunkModulesSort: () => "name",
+	nestedModulesSort: () => false,
+	chunksSort: () => false,
+	assetsSort: () => "!size",
+	outputPath: OFF_FOR_TO_STRING,
+	colors: () => false
+};
+
+/**
+ * @template {string} T
+ * @param {string | ({ test: (value: T) => boolean }) | ((value: T, ...args: EXPECTED_ANY[]) => boolean) | boolean} item item to normalize
+ * @returns {(value: T, ...args: EXPECTED_ANY[]) => boolean} normalize fn
+ */
+const normalizeFilter = item => {
+	if (typeof item === "string") {
+		const regExp = new RegExp(
+			`[\\\\/]${item.replace(/[-[\]{}()*+?.\\^$|]/g, "\\$&")}([\\\\/]|$|!|\\?)`
+		);
+		return ident => regExp.test(/** @type {T} */ (ident));
+	}
+	if (item && typeof item === "object" && typeof item.test === "function") {
+		return ident => item.test(ident);
+	}
+	if (typeof item === "boolean") {
+		return () => item;
+	}
+
+	return /** @type {(value: T, ...args: EXPECTED_ANY[]) => boolean} */ (item);
+};
+
+/** @typedef {keyof (KnownNormalizedStatsOptions | StatsOptions)} NormalizerKeys */
+/** @typedef {{ [Key in NormalizerKeys]: (value: StatsOptions[Key]) => KnownNormalizedStatsOptions[Key] }} Normalizers */
+
+/** @type {Partial} */
+const NORMALIZER = {
+	excludeModules: value => {
+		if (!Array.isArray(value)) {
+			value = value
+				? /** @type {KnownNormalizedStatsOptions["excludeModules"]} */ ([value])
+				: [];
+		}
+		return value.map(normalizeFilter);
+	},
+	excludeAssets: value => {
+		if (!Array.isArray(value)) {
+			value = value ? [value] : [];
+		}
+		return value.map(normalizeFilter);
+	},
+	warningsFilter: value => {
+		if (!Array.isArray(value)) {
+			value = value ? [value] : [];
+		}
+		/**
+		 * @callback WarningFilterFn
+		 * @param {StatsError} warning warning
+		 * @param {string} warningString warning string
+		 * @returns {boolean} result
+		 */
+		return value.map(
+			/**
+			 * @param {StatsOptions["warningsFilter"]} filter a warning filter
+			 * @returns {WarningFilterFn} result
+			 */
+			filter => {
+				if (typeof filter === "string") {
+					return (warning, warningString) => warningString.includes(filter);
+				}
+				if (filter instanceof RegExp) {
+					return (warning, warningString) => filter.test(warningString);
+				}
+				if (typeof filter === "function") {
+					return filter;
+				}
+				throw new Error(
+					`Can only filter warnings with Strings or RegExps. (Given: ${filter})`
+				);
+			}
+		);
+	},
+	logging: value => {
+		if (value === true) value = "log";
+		return /** @type {KnownNormalizedStatsOptions["logging"]} */ (value);
+	},
+	loggingDebug: value => {
+		if (!Array.isArray(value)) {
+			value = value
+				? /** @type {KnownNormalizedStatsOptions["loggingDebug"]} */ ([value])
+				: [];
+		}
+		return value.map(normalizeFilter);
+	}
+};
+
+const PLUGIN_NAME = "DefaultStatsPresetPlugin";
+
+class DefaultStatsPresetPlugin {
+	/**
+	 * Apply the plugin
+	 * @param {Compiler} compiler the compiler instance
+	 * @returns {void}
+	 */
+	apply(compiler) {
+		compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => {
+			for (const key of Object.keys(NAMED_PRESETS)) {
+				const defaults = NAMED_PRESETS[/** @type {keyof NamedPresets} */ (key)];
+				compilation.hooks.statsPreset
+					.for(key)
+					.tap(PLUGIN_NAME, (options, context) => {
+						applyDefaults(options, defaults);
+					});
+			}
+			compilation.hooks.statsNormalize.tap(PLUGIN_NAME, (options, context) => {
+				for (const key of Object.keys(DEFAULTS)) {
+					if (options[key] === undefined)
+						options[key] =
+							/** @type {Defaults[DefaultsKeys]} */
+							(DEFAULTS[/** @type {DefaultsKeys} */ (key)])(
+								options,
+								context,
+								compilation
+							);
+				}
+				for (const key of Object.keys(NORMALIZER)) {
+					options[key] =
+						/** @type {TODO} */
+						(NORMALIZER[/** @type {NormalizerKeys} */ (key)])(options[key]);
+				}
+			});
+		});
+	}
+}
+module.exports = DefaultStatsPresetPlugin;
diff --git a/lib/stats/DefaultStatsPrinterPlugin.js b/lib/stats/DefaultStatsPrinterPlugin.js
new file mode 100644
index 00000000000..4936714333e
--- /dev/null
+++ b/lib/stats/DefaultStatsPrinterPlugin.js
@@ -0,0 +1,1889 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+
+"use strict";
+
+/** @typedef {import("../Compiler")} Compiler */
+/** @typedef {import("../logging/Logger").LogTypeEnum} LogTypeEnum */
+/** @typedef {import("./DefaultStatsFactoryPlugin").ChunkId} ChunkId */
+/** @typedef {import("./DefaultStatsFactoryPlugin").ChunkName} ChunkName */
+/** @typedef {import("./DefaultStatsFactoryPlugin").KnownStatsAsset} KnownStatsAsset */
+/** @typedef {import("./DefaultStatsFactoryPlugin").KnownStatsAssetChunk} KnownStatsAssetChunk */
+/** @typedef {import("./DefaultStatsFactoryPlugin").KnownStatsAssetChunkIdHint} KnownStatsAssetChunkIdHint */
+/** @typedef {import("./DefaultStatsFactoryPlugin").KnownStatsAssetChunkName} KnownStatsAssetChunkName */
+/** @typedef {import("./DefaultStatsFactoryPlugin").KnownStatsChunk} KnownStatsChunk */
+/** @typedef {import("./DefaultStatsFactoryPlugin").KnownStatsChunkGroup} KnownStatsChunkGroup */
+/** @typedef {import("./DefaultStatsFactoryPlugin").KnownStatsChunkOrigin} KnownStatsChunkOrigin */
+/** @typedef {import("./DefaultStatsFactoryPlugin").KnownStatsCompilation} KnownStatsCompilation */
+/** @typedef {import("./DefaultStatsFactoryPlugin").KnownStatsError} KnownStatsError */
+/** @typedef {import("./DefaultStatsFactoryPlugin").KnownStatsLogging} KnownStatsLogging */
+/** @typedef {import("./DefaultStatsFactoryPlugin").KnownStatsLoggingEntry} KnownStatsLoggingEntry */
+/** @typedef {import("./DefaultStatsFactoryPlugin").KnownStatsModule} KnownStatsModule */
+/** @typedef {import("./DefaultStatsFactoryPlugin").KnownStatsModuleIssuer} KnownStatsModuleIssuer */
+/** @typedef {import("./DefaultStatsFactoryPlugin").KnownStatsModuleReason} KnownStatsModuleReason */
+/** @typedef {import("./DefaultStatsFactoryPlugin").KnownStatsModuleTraceDependency} KnownStatsModuleTraceDependency */
+/** @typedef {import("./DefaultStatsFactoryPlugin").KnownStatsModuleTraceItem} KnownStatsModuleTraceItem */
+/** @typedef {import("./DefaultStatsFactoryPlugin").KnownStatsProfile} KnownStatsProfile */
+/** @typedef {import("./DefaultStatsFactoryPlugin").StatsCompilation} StatsCompilation */
+/** @typedef {import("./StatsPrinter")} StatsPrinter */
+/** @typedef {import("./StatsPrinter").ColorFunction} ColorFunction */
+/** @typedef {import("./StatsPrinter").KnownStatsPrinterColorFunctions} KnownStatsPrinterColorFunctions */
+/** @typedef {import("./StatsPrinter").KnownStatsPrinterContext} KnownStatsPrinterContext */
+/** @typedef {import("./StatsPrinter").KnownStatsPrinterFormatters} KnownStatsPrinterFormatters */
+/** @typedef {import("./StatsPrinter").StatsPrinterContext} StatsPrinterContext */
+/** @typedef {import("./StatsPrinter").StatsPrinterContextWithExtra} StatsPrinterContextWithExtra */
+
+const DATA_URI_CONTENT_LENGTH = 16;
+const MAX_MODULE_IDENTIFIER_LENGTH = 80;
+
+/**
+ * @param {number} n a number
+ * @param {string} singular singular
+ * @param {string} plural plural
+ * @returns {string} if n is 1, singular, else plural
+ */
+const plural = (n, singular, plural) => (n === 1 ? singular : plural);
+
+/**
+ * @param {Record} sizes sizes by source type
+ * @param {StatsPrinterContext} options options
+ * @returns {string | undefined} text
+ */
+const printSizes = (sizes, { formatSize = n => `${n}` }) => {
+	const keys = Object.keys(sizes);
+	if (keys.length > 1) {
+		return keys.map(key => `${formatSize(sizes[key])} (${key})`).join(" ");
+	} else if (keys.length === 1) {
+		return formatSize(sizes[keys[0]]);
+	}
+};
+
+/**
+ * @param {string | null} resource resource
+ * @returns {string} resource name for display
+ */
+const getResourceName = resource => {
+	if (!resource) return "";
+	const dataUrl = /^data:[^,]+,/.exec(resource);
+	if (!dataUrl) return resource;
+
+	const len = dataUrl[0].length + DATA_URI_CONTENT_LENGTH;
+	if (resource.length < len) return resource;
+	return `${resource.slice(
+		0,
+		Math.min(resource.length - /* '..'.length */ 2, len)
+	)}..`;
+};
+
+/**
+ * @param {string} name module name
+ * @returns {[string,string]} prefix and module name
+ */
+const getModuleName = name => {
+	const [, prefix, resource] =
+		/** @type {[string, string, string]} */
+		(/** @type {unknown} */ (/^(.*!)?([^!]*)$/.exec(name)));
+
+	if (resource.length > MAX_MODULE_IDENTIFIER_LENGTH) {
+		const truncatedResource = `${resource.slice(
+			0,
+			Math.min(
+				resource.length - /* '...(truncated)'.length */ 14,
+				MAX_MODULE_IDENTIFIER_LENGTH
+			)
+		)}...(truncated)`;
+
+		return [prefix, getResourceName(truncatedResource)];
+	}
+
+	return [prefix, getResourceName(resource)];
+};
+
+/**
+ * @param {string} str string
+ * @param {(item: string) => string} fn function to apply to each line
+ * @returns {string} joined string
+ */
+const mapLines = (str, fn) => str.split("\n").map(fn).join("\n");
+
+/**
+ * @param {number} n a number
+ * @returns {string} number as two digit string, leading 0
+ */
+const twoDigit = n => (n >= 10 ? `${n}` : `0${n}`);
+
+/**
+ * @param {string | number | null} id an id
+ * @returns {id is string | number} is i
+ */
+const isValidId = id => {
+	if (typeof id === "number" || id) {
+		return true;
+	}
+
+	return false;
+};
+
+/**
+ * @template T
+ * @param {Array | undefined} list of items
+ * @param {number} count number of items to show
+ * @returns {string} string representation of list
+ */
+const moreCount = (list, count) =>
+	list && list.length > 0 ? `+ ${count}` : `${count}`;
+
+/**
+ * @template T
+ * @template {keyof T} K
+ * @typedef {{ [P in K]-?: T[P] }} WithRequired
+ */
+
+/**
+ * @template {keyof StatsPrinterContext} RequiredStatsPrinterContextKeys
+ * @typedef {StatsPrinterContextWithExtra & WithRequired} DefineStatsPrinterContext
+ */
+
+/**
+ * @template T
+ * @template {keyof StatsPrinterContext} RequiredStatsPrinterContextKeys
+ * @typedef {(thing: Exclude, context: DefineStatsPrinterContext, printer: StatsPrinter) => string | undefined} SimplePrinter
+ */
+
+/**
+ * @template T
+ * @typedef {T extends (infer U)[] ? U : T} Unpacked
+ */
+
+/**
+ * @template {object} O
+ * @template {keyof O} K
+ * @template {string} B
+ * @typedef {K extends string ? Exclude extends EXPECTED_ANY[] ? never : `${B}.${K}` : never} PropertyName
+ */
+
+/**
+ * @template {object} O
+ * @template {keyof O} K
+ * @template {string} B
+ * @typedef {K extends string ? NonNullable extends EXPECTED_ANY[] ? `${B}.${K}[]` : never : never} ArrayPropertyName
+ */
+
+/**
+ * @template {object} O
+ * @template {keyof O} K
+ * @template {string} B
+ * @typedef {K extends string ? Exclude extends EXPECTED_ANY[] ? `${B}.${K}` : never : never} MultiplePropertyName
+ */
+
+/**
+ * @template {object} O
+ * @template {string} K
+ * @template {string} E
+ * @typedef {{ [property in `${K}!`]?: SimplePrinter }} Exclamation
+ */
+
+/**
+ * @template {object} O
+ * @template {string} B
+ * @template {string} [R=B]
+ * @typedef {{ [K in keyof O as PropertyName]?: SimplePrinter } &
+ * { [K in keyof O as ArrayPropertyName]?: Exclude extends (infer I)[] ? SimplePrinter : never } &
+ * { [K in keyof O as MultiplePropertyName]?: SimplePrinter }
+ * } Printers
+ */
+
+/**
+ * @typedef {Printers &
+ * { ["compilation.summary!"]?: SimplePrinter } &
+ * { ["compilation.errorsInChildren!"]?: SimplePrinter } &
+ * { ["compilation.warningsInChildren!"]?: SimplePrinter }} CompilationSimplePrinters
+ */
+
+/**
+ * @type {CompilationSimplePrinters}
+ */
+const COMPILATION_SIMPLE_PRINTERS = {
+	"compilation.summary!": (
+		_,
+		{
+			type,
+			bold,
+			green,
+			red,
+			yellow,
+			formatDateTime,
+			formatTime,
+			compilation: {
+				name,
+				hash,
+				version,
+				time,
+				builtAt,
+				errorsCount,
+				warningsCount
+			}
+		}
+	) => {
+		const root = type === "compilation.summary!";
+		const warningsMessage =
+			/** @type {number} */ (warningsCount) > 0
+				? yellow(
+						`${warningsCount} ${plural(/** @type {number} */ (warningsCount), "warning", "warnings")}`
+					)
+				: "";
+		const errorsMessage =
+			/** @type {number} */ (errorsCount) > 0
+				? red(
+						`${errorsCount} ${plural(/** @type {number} */ (errorsCount), "error", "errors")}`
+					)
+				: "";
+		const timeMessage = root && time ? ` in ${formatTime(time)}` : "";
+		const hashMessage = hash ? ` (${hash})` : "";
+		const builtAtMessage =
+			root && builtAt ? `${formatDateTime(builtAt)}: ` : "";
+		const versionMessage = root && version ? `webpack ${version}` : "";
+		const nameMessage =
+			root && name
+				? bold(name)
+				: name
+					? `Child ${bold(name)}`
+					: root
+						? ""
+						: "Child";
+		const subjectMessage =
+			nameMessage && versionMessage
+				? `${nameMessage} (${versionMessage})`
+				: versionMessage || nameMessage || "webpack";
+		let statusMessage;
+		if (errorsMessage && warningsMessage) {
+			statusMessage = `compiled with ${errorsMessage} and ${warningsMessage}`;
+		} else if (errorsMessage) {
+			statusMessage = `compiled with ${errorsMessage}`;
+		} else if (warningsMessage) {
+			statusMessage = `compiled with ${warningsMessage}`;
+		} else if (errorsCount === 0 && warningsCount === 0) {
+			statusMessage = `compiled ${green("successfully")}`;
+		} else {
+			statusMessage = "compiled";
+		}
+		if (
+			builtAtMessage ||
+			versionMessage ||
+			errorsMessage ||
+			warningsMessage ||
+			(errorsCount === 0 && warningsCount === 0) ||
+			timeMessage ||
+			hashMessage
+		)
+			return `${builtAtMessage}${subjectMessage} ${statusMessage}${timeMessage}${hashMessage}`;
+	},
+	"compilation.filteredWarningDetailsCount": count =>
+		count
+			? `${count} ${plural(
+					count,
+					"warning has",
+					"warnings have"
+				)} detailed information that is not shown.\nUse 'stats.errorDetails: true' resp. '--stats-error-details' to show it.`
+			: undefined,
+	"compilation.filteredErrorDetailsCount": (count, { yellow }) =>
+		count
+			? yellow(
+					`${count} ${plural(
+						count,
+						"error has",
+						"errors have"
+					)} detailed information that is not shown.\nUse 'stats.errorDetails: true' resp. '--stats-error-details' to show it.`
+				)
+			: undefined,
+	"compilation.env": (env, { bold }) =>
+		env
+			? `Environment (--env): ${bold(JSON.stringify(env, null, 2))}`
+			: undefined,
+	"compilation.publicPath": (publicPath, { bold }) =>
+		`PublicPath: ${bold(publicPath || "(none)")}`,
+	"compilation.entrypoints": (entrypoints, context, printer) =>
+		Array.isArray(entrypoints)
+			? undefined
+			: printer.print(context.type, Object.values(entrypoints), {
+					...context,
+					chunkGroupKind: "Entrypoint"
+				}),
+	"compilation.namedChunkGroups": (namedChunkGroups, context, printer) => {
+		if (!Array.isArray(namedChunkGroups)) {
+			const {
+				compilation: { entrypoints }
+			} = context;
+			let chunkGroups = Object.values(namedChunkGroups);
+			if (entrypoints) {
+				chunkGroups = chunkGroups.filter(
+					group =>
+						!Object.prototype.hasOwnProperty.call(
+							entrypoints,
+							/** @type {string} */
+							(group.name)
+						)
+				);
+			}
+			return printer.print(context.type, chunkGroups, {
+				...context,
+				chunkGroupKind: "Chunk Group"
+			});
+		}
+	},
+	"compilation.assetsByChunkName": () => "",
+
+	"compilation.filteredModules": (
+		filteredModules,
+		{ compilation: { modules } }
+	) =>
+		filteredModules > 0
+			? `${moreCount(modules, filteredModules)} ${plural(
+					filteredModules,
+					"module",
+					"modules"
+				)}`
+			: undefined,
+	"compilation.filteredAssets": (
+		filteredAssets,
+		{ compilation: { assets } }
+	) =>
+		filteredAssets > 0
+			? `${moreCount(assets, filteredAssets)} ${plural(
+					filteredAssets,
+					"asset",
+					"assets"
+				)}`
+			: undefined,
+	"compilation.logging": (logging, context, printer) =>
+		Array.isArray(logging)
+			? undefined
+			: printer.print(
+					context.type,
+					Object.entries(logging).map(([name, value]) => ({ ...value, name })),
+					context
+				),
+	"compilation.warningsInChildren!": (_, { yellow, compilation }) => {
+		if (
+			!compilation.children &&
+			/** @type {number} */ (compilation.warningsCount) > 0 &&
+			compilation.warnings
+		) {
+			const childWarnings =
+				/** @type {number} */ (compilation.warningsCount) -
+				compilation.warnings.length;
+			if (childWarnings > 0) {
+				return yellow(
+					`${childWarnings} ${plural(
+						childWarnings,
+						"WARNING",
+						"WARNINGS"
+					)} in child compilations${
+						compilation.children
+							? ""
+							: " (Use 'stats.children: true' resp. '--stats-children' for more details)"
+					}`
+				);
+			}
+		}
+	},
+	"compilation.errorsInChildren!": (_, { red, compilation }) => {
+		if (
+			!compilation.children &&
+			/** @type {number} */ (compilation.errorsCount) > 0 &&
+			compilation.errors
+		) {
+			const childErrors =
+				/** @type {number} */ (compilation.errorsCount) -
+				compilation.errors.length;
+			if (childErrors > 0) {
+				return red(
+					`${childErrors} ${plural(
+						childErrors,
+						"ERROR",
+						"ERRORS"
+					)} in child compilations${
+						compilation.children
+							? ""
+							: " (Use 'stats.children: true' resp. '--stats-children' for more details)"
+					}`
+				);
+			}
+		}
+	}
+};
+
+/**
+ * @typedef {Printers &
+ * Printers &
+ * Exclamation &
+ * { ["asset.filteredChildren"]?: SimplePrinter } &
+ * { assetChunk?: SimplePrinter } &
+ * { assetChunkName?: SimplePrinter } &
+ * { assetChunkIdHint?: SimplePrinter }} AssetSimplePrinters
+ */
+
+/** @type {AssetSimplePrinters} */
+const ASSET_SIMPLE_PRINTERS = {
+	"asset.type": type => type,
+	"asset.name": (name, { formatFilename, asset: { isOverSizeLimit } }) =>
+		formatFilename(name, isOverSizeLimit),
+	"asset.size": (size, { asset: { isOverSizeLimit }, yellow, formatSize }) =>
+		isOverSizeLimit ? yellow(formatSize(size)) : formatSize(size),
+	"asset.emitted": (emitted, { green, formatFlag }) =>
+		emitted ? green(formatFlag("emitted")) : undefined,
+	"asset.comparedForEmit": (comparedForEmit, { yellow, formatFlag }) =>
+		comparedForEmit ? yellow(formatFlag("compared for emit")) : undefined,
+	"asset.cached": (cached, { green, formatFlag }) =>
+		cached ? green(formatFlag("cached")) : undefined,
+	"asset.isOverSizeLimit": (isOverSizeLimit, { yellow, formatFlag }) =>
+		isOverSizeLimit ? yellow(formatFlag("big")) : undefined,
+
+	"asset.info.immutable": (immutable, { green, formatFlag }) =>
+		immutable ? green(formatFlag("immutable")) : undefined,
+	"asset.info.javascriptModule": (javascriptModule, { formatFlag }) =>
+		javascriptModule ? formatFlag("javascript module") : undefined,
+	"asset.info.sourceFilename": (sourceFilename, { formatFlag }) =>
+		sourceFilename ? formatFlag(`from: ${sourceFilename}`) : undefined,
+	"asset.info.development": (development, { green, formatFlag }) =>
+		development ? green(formatFlag("dev")) : undefined,
+	"asset.info.hotModuleReplacement": (
+		hotModuleReplacement,
+		{ green, formatFlag }
+	) => (hotModuleReplacement ? green(formatFlag("hmr")) : undefined),
+	"asset.separator!": () => "\n",
+	"asset.filteredRelated": (filteredRelated, { asset: { related } }) =>
+		filteredRelated > 0
+			? `${moreCount(related, filteredRelated)} related ${plural(
+					filteredRelated,
+					"asset",
+					"assets"
+				)}`
+			: undefined,
+	"asset.filteredChildren": (filteredChildren, { asset: { children } }) =>
+		filteredChildren > 0
+			? `${moreCount(children, filteredChildren)} ${plural(
+					filteredChildren,
+					"asset",
+					"assets"
+				)}`
+			: undefined,
+
+	assetChunk: (id, { formatChunkId }) => formatChunkId(id),
+
+	assetChunkName: name => name || undefined,
+	assetChunkIdHint: name => name || undefined
+};
+
+/**
+ * @typedef {Printers &
+ * Exclamation &
+ * { ["module.filteredChildren"]?: SimplePrinter } &
+ * { ["module.filteredReasons"]?: SimplePrinter }} ModuleSimplePrinters
+ */
+
+/** @type {ModuleSimplePrinters} */
+const MODULE_SIMPLE_PRINTERS = {
+	"module.type": type => (type !== "module" ? type : undefined),
+	"module.id": (id, { formatModuleId }) =>
+		isValidId(id) ? formatModuleId(id) : undefined,
+	"module.name": (name, { bold }) => {
+		const [prefix, resource] = getModuleName(name);
+		return `${prefix || ""}${bold(resource || "")}`;
+	},
+	"module.identifier": identifier => undefined,
+	"module.layer": (layer, { formatLayer }) =>
+		layer ? formatLayer(layer) : undefined,
+	"module.sizes": printSizes,
+	"module.chunks[]": (id, { formatChunkId }) => formatChunkId(id),
+	"module.depth": (depth, { formatFlag }) =>
+		depth !== null ? formatFlag(`depth ${depth}`) : undefined,
+	"module.cacheable": (cacheable, { formatFlag, red }) =>
+		cacheable === false ? red(formatFlag("not cacheable")) : undefined,
+	"module.orphan": (orphan, { formatFlag, yellow }) =>
+		orphan ? yellow(formatFlag("orphan")) : undefined,
+	// "module.runtime": (runtime, { formatFlag, yellow }) =>
+	// 	runtime ? yellow(formatFlag("runtime")) : undefined,
+	"module.optional": (optional, { formatFlag, yellow }) =>
+		optional ? yellow(formatFlag("optional")) : undefined,
+	"module.dependent": (dependent, { formatFlag, cyan }) =>
+		dependent ? cyan(formatFlag("dependent")) : undefined,
+	"module.built": (built, { formatFlag, yellow }) =>
+		built ? yellow(formatFlag("built")) : undefined,
+	"module.codeGenerated": (codeGenerated, { formatFlag, yellow }) =>
+		codeGenerated ? yellow(formatFlag("code generated")) : undefined,
+	"module.buildTimeExecuted": (buildTimeExecuted, { formatFlag, green }) =>
+		buildTimeExecuted ? green(formatFlag("build time executed")) : undefined,
+	"module.cached": (cached, { formatFlag, green }) =>
+		cached ? green(formatFlag("cached")) : undefined,
+	"module.assets": (assets, { formatFlag, magenta }) =>
+		assets && assets.length
+			? magenta(
+					formatFlag(
+						`${assets.length} ${plural(assets.length, "asset", "assets")}`
+					)
+				)
+			: undefined,
+	"module.warnings": (warnings, { formatFlag, yellow }) =>
+		warnings
+			? yellow(
+					formatFlag(`${warnings} ${plural(warnings, "warning", "warnings")}`)
+				)
+			: undefined,
+	"module.errors": (errors, { formatFlag, red }) =>
+		errors
+			? red(formatFlag(`${errors} ${plural(errors, "error", "errors")}`))
+			: undefined,
+	"module.providedExports": (providedExports, { formatFlag, cyan }) => {
+		if (Array.isArray(providedExports)) {
+			if (providedExports.length === 0) return cyan(formatFlag("no exports"));
+			return cyan(formatFlag(`exports: ${providedExports.join(", ")}`));
+		}
+	},
+	"module.usedExports": (usedExports, { formatFlag, cyan, module }) => {
+		if (usedExports !== true) {
+			if (usedExports === null) return cyan(formatFlag("used exports unknown"));
+			if (usedExports === false) return cyan(formatFlag("module unused"));
+			if (Array.isArray(usedExports)) {
+				if (usedExports.length === 0)
+					return cyan(formatFlag("no exports used"));
+				const providedExportsCount = Array.isArray(module.providedExports)
+					? module.providedExports.length
+					: null;
+				if (
+					providedExportsCount !== null &&
+					providedExportsCount === usedExports.length
+				) {
+					return cyan(formatFlag("all exports used"));
+				}
+
+				return cyan(
+					formatFlag(`only some exports used: ${usedExports.join(", ")}`)
+				);
+			}
+		}
+	},
+	"module.optimizationBailout[]": (optimizationBailout, { yellow }) =>
+		yellow(optimizationBailout),
+	"module.issuerPath": (issuerPath, { module }) =>
+		module.profile ? undefined : "",
+	"module.profile": profile => undefined,
+	"module.filteredModules": (filteredModules, { module: { modules } }) =>
+		filteredModules > 0
+			? `${moreCount(modules, filteredModules)} nested ${plural(
+					filteredModules,
+					"module",
+					"modules"
+				)}`
+			: undefined,
+	"module.filteredReasons": (filteredReasons, { module: { reasons } }) =>
+		filteredReasons > 0
+			? `${moreCount(reasons, filteredReasons)} ${plural(
+					filteredReasons,
+					"reason",
+					"reasons"
+				)}`
+			: undefined,
+	"module.filteredChildren": (filteredChildren, { module: { children } }) =>
+		filteredChildren > 0
+			? `${moreCount(children, filteredChildren)} ${plural(
+					filteredChildren,
+					"module",
+					"modules"
+				)}`
+			: undefined,
+	"module.separator!": () => "\n"
+};
+
+/**
+ * @typedef {Printers &
+ * Printers} ModuleIssuerPrinters
+ */
+
+/** @type {ModuleIssuerPrinters} */
+const MODULE_ISSUER_PRINTERS = {
+	"moduleIssuer.id": (id, { formatModuleId }) => formatModuleId(id),
+	"moduleIssuer.profile.total": (value, { formatTime }) => formatTime(value)
+};
+
+/**
+ * @typedef {Printers &
+ * { ["moduleReason.filteredChildren"]?: SimplePrinter }} ModuleReasonsPrinters
+ */
+
+/** @type {ModuleReasonsPrinters} */
+const MODULE_REASON_PRINTERS = {
+	"moduleReason.type": type => type || undefined,
+	"moduleReason.userRequest": (userRequest, { cyan }) =>
+		cyan(getResourceName(userRequest)),
+	"moduleReason.moduleId": (moduleId, { formatModuleId }) =>
+		isValidId(moduleId) ? formatModuleId(moduleId) : undefined,
+	"moduleReason.module": (module, { magenta }) =>
+		module ? magenta(module) : undefined,
+	"moduleReason.loc": loc => loc || undefined,
+	"moduleReason.explanation": (explanation, { cyan }) =>
+		explanation ? cyan(explanation) : undefined,
+	"moduleReason.active": (active, { formatFlag }) =>
+		active ? undefined : formatFlag("inactive"),
+	"moduleReason.resolvedModule": (module, { magenta }) =>
+		module ? magenta(module) : undefined,
+	"moduleReason.filteredChildren": (
+		filteredChildren,
+		{ moduleReason: { children } }
+	) =>
+		filteredChildren > 0
+			? `${moreCount(children, filteredChildren)} ${plural(
+					filteredChildren,
+					"reason",
+					"reasons"
+				)}`
+			: undefined
+};
+
+/** @typedef {Printers} ModuleProfilePrinters */
+
+/** @type {ModuleProfilePrinters} */
+const MODULE_PROFILE_PRINTERS = {
+	"module.profile.total": (value, { formatTime }) => formatTime(value),
+	"module.profile.resolving": (value, { formatTime }) =>
+		`resolving: ${formatTime(value)}`,
+	"module.profile.restoring": (value, { formatTime }) =>
+		`restoring: ${formatTime(value)}`,
+	"module.profile.integration": (value, { formatTime }) =>
+		`integration: ${formatTime(value)}`,
+	"module.profile.building": (value, { formatTime }) =>
+		`building: ${formatTime(value)}`,
+	"module.profile.storing": (value, { formatTime }) =>
+		`storing: ${formatTime(value)}`,
+	"module.profile.additionalResolving": (value, { formatTime }) =>
+		value ? `additional resolving: ${formatTime(value)}` : undefined,
+	"module.profile.additionalIntegration": (value, { formatTime }) =>
+		value ? `additional integration: ${formatTime(value)}` : undefined
+};
+
+/**
+ * @typedef {Exclamation &
+ * Exclamation &
+ * Printers &
+ * Exclamation &
+ * Printers[number], "chunkGroupAsset" | "chunkGroup"> &
+ * { ['chunkGroupChildGroup.type']?: SimplePrinter } &
+ * { ['chunkGroupChild.assets[]']?: SimplePrinter } &
+ * { ['chunkGroupChild.chunks[]']?: SimplePrinter } &
+ * { ['chunkGroupChild.name']?: SimplePrinter }} ChunkGroupPrinters
+ */
+
+/** @type {ChunkGroupPrinters} */
+const CHUNK_GROUP_PRINTERS = {
+	"chunkGroup.kind!": (_, { chunkGroupKind }) => chunkGroupKind,
+	"chunkGroup.separator!": () => "\n",
+	"chunkGroup.name": (name, { bold }) => (name ? bold(name) : undefined),
+	"chunkGroup.isOverSizeLimit": (isOverSizeLimit, { formatFlag, yellow }) =>
+		isOverSizeLimit ? yellow(formatFlag("big")) : undefined,
+	"chunkGroup.assetsSize": (size, { formatSize }) =>
+		size ? formatSize(size) : undefined,
+	"chunkGroup.auxiliaryAssetsSize": (size, { formatSize }) =>
+		size ? `(${formatSize(size)})` : undefined,
+	"chunkGroup.filteredAssets": (n, { chunkGroup: { assets } }) =>
+		n > 0
+			? `${moreCount(assets, n)} ${plural(n, "asset", "assets")}`
+			: undefined,
+	"chunkGroup.filteredAuxiliaryAssets": (
+		n,
+		{ chunkGroup: { auxiliaryAssets } }
+	) =>
+		n > 0
+			? `${moreCount(auxiliaryAssets, n)} auxiliary ${plural(
+					n,
+					"asset",
+					"assets"
+				)}`
+			: undefined,
+	"chunkGroup.is!": () => "=",
+	"chunkGroupAsset.name": (asset, { green }) => green(asset),
+	"chunkGroupAsset.size": (size, { formatSize, chunkGroup }) =>
+		chunkGroup.assets &&
+		(chunkGroup.assets.length > 1 ||
+		(chunkGroup.auxiliaryAssets && chunkGroup.auxiliaryAssets.length > 0)
+			? formatSize(size)
+			: undefined),
+	"chunkGroup.children": (children, context, printer) =>
+		Array.isArray(children)
+			? undefined
+			: printer.print(
+					context.type,
+					Object.keys(children).map(key => ({
+						type: key,
+						children: children[key]
+					})),
+					context
+				),
+	"chunkGroupChildGroup.type": type => `${type}:`,
+	"chunkGroupChild.assets[]": (file, { formatFilename }) =>
+		formatFilename(file),
+	"chunkGroupChild.chunks[]": (id, { formatChunkId }) => formatChunkId(id),
+	"chunkGroupChild.name": name => (name ? `(name: ${name})` : undefined)
+};
+
+/**
+ * @typedef {Printers &
+ * { ["chunk.childrenByOrder[].type"]: SimplePrinter } &
+ * { ["chunk.childrenByOrder[].children[]"]: SimplePrinter } &
+ * Exclamation &
+ * Printers} ChunkPrinters
+ */
+
+/** @type {ChunkPrinters} */
+const CHUNK_PRINTERS = {
+	"chunk.id": (id, { formatChunkId }) => formatChunkId(id),
+	"chunk.files[]": (file, { formatFilename }) => formatFilename(file),
+	"chunk.names[]": name => name,
+	"chunk.idHints[]": name => name,
+	"chunk.runtime[]": name => name,
+	"chunk.sizes": (sizes, context) => printSizes(sizes, context),
+	"chunk.parents[]": (parents, context) =>
+		context.formatChunkId(parents, "parent"),
+	"chunk.siblings[]": (siblings, context) =>
+		context.formatChunkId(siblings, "sibling"),
+	"chunk.children[]": (children, context) =>
+		context.formatChunkId(children, "child"),
+	"chunk.childrenByOrder": (childrenByOrder, context, printer) =>
+		Array.isArray(childrenByOrder)
+			? undefined
+			: printer.print(
+					context.type,
+					Object.keys(childrenByOrder).map(key => ({
+						type: key,
+						children: childrenByOrder[key]
+					})),
+					context
+				),
+	"chunk.childrenByOrder[].type": type => `${type}:`,
+	"chunk.childrenByOrder[].children[]": (id, { formatChunkId }) =>
+		isValidId(id) ? formatChunkId(id) : undefined,
+	"chunk.entry": (entry, { formatFlag, yellow }) =>
+		entry ? yellow(formatFlag("entry")) : undefined,
+	"chunk.initial": (initial, { formatFlag, yellow }) =>
+		initial ? yellow(formatFlag("initial")) : undefined,
+	"chunk.rendered": (rendered, { formatFlag, green }) =>
+		rendered ? green(formatFlag("rendered")) : undefined,
+	"chunk.recorded": (recorded, { formatFlag, green }) =>
+		recorded ? green(formatFlag("recorded")) : undefined,
+	"chunk.reason": (reason, { yellow }) => (reason ? yellow(reason) : undefined),
+	"chunk.filteredModules": (filteredModules, { chunk: { modules } }) =>
+		filteredModules > 0
+			? `${moreCount(modules, filteredModules)} chunk ${plural(
+					filteredModules,
+					"module",
+					"modules"
+				)}`
+			: undefined,
+	"chunk.separator!": () => "\n",
+
+	"chunkOrigin.request": request => request,
+	"chunkOrigin.moduleId": (moduleId, { formatModuleId }) =>
+		isValidId(moduleId) ? formatModuleId(moduleId) : undefined,
+	"chunkOrigin.moduleName": (moduleName, { bold }) => bold(moduleName),
+	"chunkOrigin.loc": loc => loc
+};
+
+/**
+ * @typedef {Printers &
+ * { ["error.filteredDetails"]?: SimplePrinter } &
+ * Exclamation} ErrorPrinters
+ */
+
+/**
+ * @type {ErrorPrinters}
+ */
+const ERROR_PRINTERS = {
+	"error.compilerPath": (compilerPath, { bold }) =>
+		compilerPath ? bold(`(${compilerPath})`) : undefined,
+	"error.chunkId": (chunkId, { formatChunkId }) =>
+		isValidId(chunkId) ? formatChunkId(chunkId) : undefined,
+	"error.chunkEntry": (chunkEntry, { formatFlag }) =>
+		chunkEntry ? formatFlag("entry") : undefined,
+	"error.chunkInitial": (chunkInitial, { formatFlag }) =>
+		chunkInitial ? formatFlag("initial") : undefined,
+	"error.file": (file, { bold }) => bold(file),
+	"error.moduleName": (moduleName, { bold }) =>
+		moduleName.includes("!")
+			? `${bold(moduleName.replace(/^(\s|\S)*!/, ""))} (${moduleName})`
+			: `${bold(moduleName)}`,
+	"error.loc": (loc, { green }) => green(loc),
+	"error.message": (message, { bold, formatError }) =>
+		message.includes("\u001B[") ? message : bold(formatError(message)),
+	"error.details": (details, { formatError }) => formatError(details),
+	"error.filteredDetails": filteredDetails =>
+		filteredDetails ? `+ ${filteredDetails} hidden lines` : undefined,
+	"error.stack": stack => stack,
+	"error.cause": (cause, context, printer) =>
+		cause
+			? indent(
+					`[cause]: ${
+						/** @type {string} */
+						(printer.print(`${context.type}.error`, cause, context))
+					}`,
+					"  "
+				)
+			: undefined,
+	"error.moduleTrace": moduleTrace => undefined,
+	"error.separator!": () => "\n"
+};
+
+/**
+ * @typedef {Printers &
+ * { ["loggingEntry(clear).loggingEntry"]?: SimplePrinter } &
+ * { ["loggingEntry.trace[]"]?: SimplePrinter[number], "logging"> } &
+ * { loggingGroup?: SimplePrinter } &
+ * Printers &
+ * Exclamation} LogEntryPrinters
+ */
+
+/** @type {LogEntryPrinters} */
+const LOG_ENTRY_PRINTERS = {
+	"loggingEntry(error).loggingEntry.message": (message, { red }) =>
+		mapLines(message, x => ` ${red(x)}`),
+	"loggingEntry(warn).loggingEntry.message": (message, { yellow }) =>
+		mapLines(message, x => ` ${yellow(x)}`),
+	"loggingEntry(info).loggingEntry.message": (message, { green }) =>
+		mapLines(message, x => ` ${green(x)}`),
+	"loggingEntry(log).loggingEntry.message": (message, { bold }) =>
+		mapLines(message, x => `    ${bold(x)}`),
+	"loggingEntry(debug).loggingEntry.message": message =>
+		mapLines(message, x => `    ${x}`),
+	"loggingEntry(trace).loggingEntry.message": message =>
+		mapLines(message, x => `    ${x}`),
+	"loggingEntry(status).loggingEntry.message": (message, { magenta }) =>
+		mapLines(message, x => ` ${magenta(x)}`),
+	"loggingEntry(profile).loggingEntry.message": (message, { magenta }) =>
+		mapLines(message, x => `

${magenta(x)}`), + "loggingEntry(profileEnd).loggingEntry.message": (message, { magenta }) => + mapLines(message, x => `

${magenta(x)}`), + "loggingEntry(time).loggingEntry.message": (message, { magenta }) => + mapLines(message, x => ` ${magenta(x)}`), + "loggingEntry(group).loggingEntry.message": (message, { cyan }) => + mapLines(message, x => `<-> ${cyan(x)}`), + "loggingEntry(groupCollapsed).loggingEntry.message": (message, { cyan }) => + mapLines(message, x => `<+> ${cyan(x)}`), + "loggingEntry(clear).loggingEntry": () => " -------", + "loggingEntry(groupCollapsed).loggingEntry.children": () => "", + "loggingEntry.trace[]": trace => + trace ? mapLines(trace, x => `| ${x}`) : undefined, + + loggingGroup: loggingGroup => + loggingGroup.entries.length === 0 ? "" : undefined, + "loggingGroup.debug": (flag, { red }) => (flag ? red("DEBUG") : undefined), + "loggingGroup.name": (name, { bold }) => bold(`LOG from ${name}`), + "loggingGroup.separator!": () => "\n", + "loggingGroup.filteredEntries": filteredEntries => + filteredEntries > 0 ? `+ ${filteredEntries} hidden lines` : undefined +}; + +/** @typedef {Printers} ModuleTraceItemPrinters */ + +/** @type {ModuleTraceItemPrinters} */ +const MODULE_TRACE_ITEM_PRINTERS = { + "moduleTraceItem.originName": originName => originName +}; + +/** @typedef {Printers} ModuleTraceDependencyPrinters */ + +/** @type {ModuleTraceDependencyPrinters} */ +const MODULE_TRACE_DEPENDENCY_PRINTERS = { + "moduleTraceDependency.loc": loc => loc +}; + +/** + * @type {Record string)>} + */ +const ITEM_NAMES = { + "compilation.assets[]": "asset", + "compilation.modules[]": "module", + "compilation.chunks[]": "chunk", + "compilation.entrypoints[]": "chunkGroup", + "compilation.namedChunkGroups[]": "chunkGroup", + "compilation.errors[]": "error", + "compilation.warnings[]": "error", + "compilation.logging[]": "loggingGroup", + "compilation.children[]": "compilation", + "asset.related[]": "asset", + "asset.children[]": "asset", + "asset.chunks[]": "assetChunk", + "asset.auxiliaryChunks[]": "assetChunk", + "asset.chunkNames[]": "assetChunkName", + "asset.chunkIdHints[]": "assetChunkIdHint", + "asset.auxiliaryChunkNames[]": "assetChunkName", + "asset.auxiliaryChunkIdHints[]": "assetChunkIdHint", + "chunkGroup.assets[]": "chunkGroupAsset", + "chunkGroup.auxiliaryAssets[]": "chunkGroupAsset", + "chunkGroupChild.assets[]": "chunkGroupAsset", + "chunkGroupChild.auxiliaryAssets[]": "chunkGroupAsset", + "chunkGroup.children[]": "chunkGroupChildGroup", + "chunkGroupChildGroup.children[]": "chunkGroupChild", + "module.modules[]": "module", + "module.children[]": "module", + "module.reasons[]": "moduleReason", + "moduleReason.children[]": "moduleReason", + "module.issuerPath[]": "moduleIssuer", + "chunk.origins[]": "chunkOrigin", + "chunk.modules[]": "module", + "loggingGroup.entries[]": logEntry => + `loggingEntry(${logEntry.type}).loggingEntry`, + "loggingEntry.children[]": logEntry => + `loggingEntry(${logEntry.type}).loggingEntry`, + "error.moduleTrace[]": "moduleTraceItem", + "error.errors[]": "error", + "moduleTraceItem.dependencies[]": "moduleTraceDependency" +}; + +const ERROR_PREFERRED_ORDER = [ + "compilerPath", + "chunkId", + "chunkEntry", + "chunkInitial", + "file", + "separator!", + "moduleName", + "loc", + "separator!", + "message", + "separator!", + "details", + "separator!", + "filteredDetails", + "separator!", + "stack", + "separator!", + "cause", + "separator!", + "missing", + "separator!", + "moduleTrace" +]; + +/** @type {Record} */ +const PREFERRED_ORDERS = { + compilation: [ + "name", + "hash", + "version", + "time", + "builtAt", + "env", + "publicPath", + "assets", + "filteredAssets", + "entrypoints", + "namedChunkGroups", + "chunks", + "modules", + "filteredModules", + "children", + "logging", + "warnings", + "warningsInChildren!", + "filteredWarningDetailsCount", + "errors", + "errorsInChildren!", + "filteredErrorDetailsCount", + "summary!", + "needAdditionalPass" + ], + asset: [ + "type", + "name", + "size", + "chunks", + "auxiliaryChunks", + "emitted", + "comparedForEmit", + "cached", + "info", + "isOverSizeLimit", + "chunkNames", + "auxiliaryChunkNames", + "chunkIdHints", + "auxiliaryChunkIdHints", + "related", + "filteredRelated", + "children", + "filteredChildren" + ], + "asset.info": [ + "immutable", + "sourceFilename", + "javascriptModule", + "development", + "hotModuleReplacement" + ], + chunkGroup: [ + "kind!", + "name", + "isOverSizeLimit", + "assetsSize", + "auxiliaryAssetsSize", + "is!", + "assets", + "filteredAssets", + "auxiliaryAssets", + "filteredAuxiliaryAssets", + "separator!", + "children" + ], + chunkGroupAsset: ["name", "size"], + chunkGroupChildGroup: ["type", "children"], + chunkGroupChild: ["assets", "chunks", "name"], + module: [ + "type", + "name", + "identifier", + "id", + "layer", + "sizes", + "chunks", + "depth", + "cacheable", + "orphan", + "runtime", + "optional", + "dependent", + "built", + "codeGenerated", + "cached", + "assets", + "failed", + "warnings", + "errors", + "children", + "filteredChildren", + "providedExports", + "usedExports", + "optimizationBailout", + "reasons", + "filteredReasons", + "issuerPath", + "profile", + "modules", + "filteredModules" + ], + moduleReason: [ + "active", + "type", + "userRequest", + "moduleId", + "module", + "resolvedModule", + "loc", + "explanation", + "children", + "filteredChildren" + ], + "module.profile": [ + "total", + "separator!", + "resolving", + "restoring", + "integration", + "building", + "storing", + "additionalResolving", + "additionalIntegration" + ], + chunk: [ + "id", + "runtime", + "files", + "names", + "idHints", + "sizes", + "parents", + "siblings", + "children", + "childrenByOrder", + "entry", + "initial", + "rendered", + "recorded", + "reason", + "separator!", + "origins", + "separator!", + "modules", + "separator!", + "filteredModules" + ], + chunkOrigin: ["request", "moduleId", "moduleName", "loc"], + error: ERROR_PREFERRED_ORDER, + warning: ERROR_PREFERRED_ORDER, + "chunk.childrenByOrder[]": ["type", "children"], + loggingGroup: [ + "debug", + "name", + "separator!", + "entries", + "separator!", + "filteredEntries" + ], + loggingEntry: ["message", "trace", "children"] +}; + +/** @typedef {(items: string[]) => string | undefined} SimpleItemsJoiner */ + +/** @type {SimpleItemsJoiner} */ +const itemsJoinOneLine = items => items.filter(Boolean).join(" "); +/** @type {SimpleItemsJoiner} */ +const itemsJoinOneLineBrackets = items => + items.length > 0 ? `(${items.filter(Boolean).join(" ")})` : undefined; +/** @type {SimpleItemsJoiner} */ +const itemsJoinMoreSpacing = items => items.filter(Boolean).join("\n\n"); +/** @type {SimpleItemsJoiner} */ +const itemsJoinComma = items => items.filter(Boolean).join(", "); +/** @type {SimpleItemsJoiner} */ +const itemsJoinCommaBrackets = items => + items.length > 0 ? `(${items.filter(Boolean).join(", ")})` : undefined; +/** @type {(item: string) => SimpleItemsJoiner} */ +const itemsJoinCommaBracketsWithName = name => items => + items.length > 0 + ? `(${name}: ${items.filter(Boolean).join(", ")})` + : undefined; + +/** @type {Record} */ +const SIMPLE_ITEMS_JOINER = { + "chunk.parents": itemsJoinOneLine, + "chunk.siblings": itemsJoinOneLine, + "chunk.children": itemsJoinOneLine, + "chunk.names": itemsJoinCommaBrackets, + "chunk.idHints": itemsJoinCommaBracketsWithName("id hint"), + "chunk.runtime": itemsJoinCommaBracketsWithName("runtime"), + "chunk.files": itemsJoinComma, + "chunk.childrenByOrder": itemsJoinOneLine, + "chunk.childrenByOrder[].children": itemsJoinOneLine, + "chunkGroup.assets": itemsJoinOneLine, + "chunkGroup.auxiliaryAssets": itemsJoinOneLineBrackets, + "chunkGroupChildGroup.children": itemsJoinComma, + "chunkGroupChild.assets": itemsJoinOneLine, + "chunkGroupChild.auxiliaryAssets": itemsJoinOneLineBrackets, + "asset.chunks": itemsJoinComma, + "asset.auxiliaryChunks": itemsJoinCommaBrackets, + "asset.chunkNames": itemsJoinCommaBracketsWithName("name"), + "asset.auxiliaryChunkNames": itemsJoinCommaBracketsWithName("auxiliary name"), + "asset.chunkIdHints": itemsJoinCommaBracketsWithName("id hint"), + "asset.auxiliaryChunkIdHints": + itemsJoinCommaBracketsWithName("auxiliary id hint"), + "module.chunks": itemsJoinOneLine, + "module.issuerPath": items => + items + .filter(Boolean) + .map(item => `${item} ->`) + .join(" "), + "compilation.errors": itemsJoinMoreSpacing, + "compilation.warnings": itemsJoinMoreSpacing, + "compilation.logging": itemsJoinMoreSpacing, + "compilation.children": items => + indent(/** @type {string} */ (itemsJoinMoreSpacing(items)), " "), + "moduleTraceItem.dependencies": itemsJoinOneLine, + "loggingEntry.children": items => + indent(items.filter(Boolean).join("\n"), " ", false) +}; + +/** + * @param {Item[]} items items + * @returns {string} result + */ +const joinOneLine = items => + items + .map(item => item.content) + .filter(Boolean) + .join(" "); + +/** + * @param {Item[]} items items + * @returns {string} result + */ +const joinInBrackets = items => { + const res = []; + let mode = 0; + for (const item of items) { + if (item.element === "separator!") { + switch (mode) { + case 0: + case 1: + mode += 2; + break; + case 4: + res.push(")"); + mode = 3; + break; + } + } + if (!item.content) continue; + switch (mode) { + case 0: + mode = 1; + break; + case 1: + res.push(" "); + break; + case 2: + res.push("("); + mode = 4; + break; + case 3: + res.push(" ("); + mode = 4; + break; + case 4: + res.push(", "); + break; + } + res.push(item.content); + } + if (mode === 4) res.push(")"); + return res.join(""); +}; + +/** + * @param {string} str a string + * @param {string} prefix prefix + * @param {boolean=} noPrefixInFirstLine need prefix in the first line? + * @returns {string} result + */ +const indent = (str, prefix, noPrefixInFirstLine) => { + const rem = str.replace(/\n([^\n])/g, `\n${prefix}$1`); + if (noPrefixInFirstLine) return rem; + const ind = str[0] === "\n" ? "" : prefix; + return ind + rem; +}; + +/** + * @param {(false | Item)[]} items items + * @param {string} indenter indenter + * @returns {string} result + */ +const joinExplicitNewLine = (items, indenter) => { + let firstInLine = true; + let first = true; + return items + .map(item => { + if (!item || !item.content) return; + let content = indent(item.content, first ? "" : indenter, !firstInLine); + if (firstInLine) { + content = content.replace(/^\n+/, ""); + } + if (!content) return; + first = false; + const noJoiner = firstInLine || content.startsWith("\n"); + firstInLine = content.endsWith("\n"); + return noJoiner ? content : ` ${content}`; + }) + .filter(Boolean) + .join("") + .trim(); +}; + +/** + * @param {boolean} error is an error + * @returns {SimpleElementJoiner} joiner + */ +const joinError = + error => + /** + * @param {Item[]} items items + * @param {StatsPrinterContextWithExtra} ctx context + * @returns {string} result + */ + (items, { red, yellow }) => + `${error ? red("ERROR") : yellow("WARNING")} in ${joinExplicitNewLine( + items, + "" + )}`; + +/** @typedef {{ element: string, content: string | undefined }} Item */ +/** @typedef {(items: Item[], context: StatsPrinterContextWithExtra & Required) => string} SimpleElementJoiner */ + +/** @type {Record} */ +const SIMPLE_ELEMENT_JOINERS = { + compilation: items => { + const result = []; + let lastNeedMore = false; + for (const item of items) { + if (!item.content) continue; + const needMoreSpace = + item.element === "warnings" || + item.element === "filteredWarningDetailsCount" || + item.element === "errors" || + item.element === "filteredErrorDetailsCount" || + item.element === "logging"; + if (result.length !== 0) { + result.push(needMoreSpace || lastNeedMore ? "\n\n" : "\n"); + } + result.push(item.content); + lastNeedMore = needMoreSpace; + } + if (lastNeedMore) result.push("\n"); + return result.join(""); + }, + asset: items => + joinExplicitNewLine( + items.map(item => { + if ( + (item.element === "related" || item.element === "children") && + item.content + ) { + return { + ...item, + content: `\n${item.content}\n` + }; + } + return item; + }), + " " + ), + "asset.info": joinOneLine, + module: (items, { module }) => { + let hasName = false; + return joinExplicitNewLine( + items.map(item => { + switch (item.element) { + case "id": + if (module.id === module.name) { + if (hasName) return false; + if (item.content) hasName = true; + } + break; + case "name": + if (hasName) return false; + if (item.content) hasName = true; + break; + case "providedExports": + case "usedExports": + case "optimizationBailout": + case "reasons": + case "issuerPath": + case "profile": + case "children": + case "modules": + if (item.content) { + return { + ...item, + content: `\n${item.content}\n` + }; + } + break; + } + return item; + }), + " " + ); + }, + chunk: items => { + let hasEntry = false; + return `chunk ${joinExplicitNewLine( + items.filter(item => { + switch (item.element) { + case "entry": + if (item.content) hasEntry = true; + break; + case "initial": + if (hasEntry) return false; + break; + } + return true; + }), + " " + )}`; + }, + "chunk.childrenByOrder[]": items => `(${joinOneLine(items)})`, + chunkGroup: items => joinExplicitNewLine(items, " "), + chunkGroupAsset: joinOneLine, + chunkGroupChildGroup: joinOneLine, + chunkGroupChild: joinOneLine, + moduleReason: (items, { moduleReason }) => { + let hasName = false; + return joinExplicitNewLine( + items.map(item => { + switch (item.element) { + case "moduleId": + if (moduleReason.moduleId === moduleReason.module && item.content) + hasName = true; + break; + case "module": + if (hasName) return false; + break; + case "resolvedModule": + if (moduleReason.module === moduleReason.resolvedModule) + return false; + break; + case "children": + if (item.content) { + return { + ...item, + content: `\n${item.content}\n` + }; + } + break; + } + return item; + }), + " " + ); + }, + "module.profile": joinInBrackets, + moduleIssuer: joinOneLine, + chunkOrigin: items => `> ${joinOneLine(items)}`, + "errors[].error": joinError(true), + "warnings[].error": joinError(false), + error: items => joinExplicitNewLine(items, ""), + "error.errors[].error": items => + indent(`[errors]: ${joinExplicitNewLine(items, "")}`, " "), + loggingGroup: items => joinExplicitNewLine(items, "").trimEnd(), + moduleTraceItem: items => ` @ ${joinOneLine(items)}`, + moduleTraceDependency: joinOneLine +}; + +/** @type {Record} */ +const AVAILABLE_COLORS = { + bold: "\u001B[1m", + yellow: "\u001B[1m\u001B[33m", + red: "\u001B[1m\u001B[31m", + green: "\u001B[1m\u001B[32m", + cyan: "\u001B[1m\u001B[36m", + magenta: "\u001B[1m\u001B[35m" +}; + +/** @typedef {Required<{ [Key in keyof KnownStatsPrinterFormatters]: (value: Parameters>[0], options: Required & StatsPrinterContext, ...args: TODO[]) => string }>} AvailableFormats */ + +/** @type {AvailableFormats} */ +const AVAILABLE_FORMATS = { + formatChunkId: (id, { yellow }, direction) => { + switch (direction) { + case "parent": + return `<{${yellow(id)}}>`; + case "sibling": + return `={${yellow(id)}}=`; + case "child": + return `>{${yellow(id)}}<`; + default: + return `{${yellow(id)}}`; + } + }, + formatModuleId: id => `[${id}]`, + formatFilename: (filename, { green, yellow }, oversize) => + (oversize ? yellow : green)(filename), + formatFlag: flag => `[${flag}]`, + formatLayer: layer => `(in ${layer})`, + formatSize: require("../SizeFormatHelpers").formatSize, + formatDateTime: (dateTime, { bold }) => { + const d = new Date(dateTime); + const x = twoDigit; + const date = `${d.getFullYear()}-${x(d.getMonth() + 1)}-${x(d.getDate())}`; + const time = `${x(d.getHours())}:${x(d.getMinutes())}:${x(d.getSeconds())}`; + return `${date} ${bold(time)}`; + }, + formatTime: ( + time, + { timeReference, bold, green, yellow, red }, + boldQuantity + ) => { + const unit = " ms"; + if (timeReference && time !== timeReference) { + const times = [ + timeReference / 2, + timeReference / 4, + timeReference / 8, + timeReference / 16 + ]; + if (time < times[3]) return `${time}${unit}`; + else if (time < times[2]) return bold(`${time}${unit}`); + else if (time < times[1]) return green(`${time}${unit}`); + else if (time < times[0]) return yellow(`${time}${unit}`); + return red(`${time}${unit}`); + } + return `${boldQuantity ? bold(time) : time}${unit}`; + }, + formatError: (message, { green, yellow, red }) => { + if (message.includes("\u001B[")) return message; + const highlights = [ + { regExp: /(Did you mean .+)/g, format: green }, + { + regExp: /(Set 'mode' option to 'development' or 'production')/g, + format: green + }, + { regExp: /(\(module has no exports\))/g, format: red }, + { regExp: /\(possible exports: (.+)\)/g, format: green }, + { regExp: /(?:^|\n)(.* doesn't exist)/g, format: red }, + { regExp: /('\w+' option has not been set)/g, format: red }, + { + regExp: /(Emitted value instead of an instance of Error)/g, + format: yellow + }, + { regExp: /(Used? .+ instead)/gi, format: yellow }, + { regExp: /\b(deprecated|must|required)\b/g, format: yellow }, + { + regExp: /\b(BREAKING CHANGE)\b/gi, + format: red + }, + { + regExp: + /\b(error|failed|unexpected|invalid|not found|not supported|not available|not possible|not implemented|doesn't support|conflict|conflicting|not existing|duplicate)\b/gi, + format: red + } + ]; + for (const { regExp, format } of highlights) { + message = message.replace( + regExp, + /** + * @param {string} match match + * @param {string} content content + * @returns {string} result + */ + (match, content) => match.replace(content, format(content)) + ); + } + return message; + } +}; + +/** @typedef {(result: string) => string} ResultModifierFn */ +/** @type {Record} */ +const RESULT_MODIFIER = { + "module.modules": result => indent(result, "| ") +}; + +/** + * @param {string[]} array array + * @param {string[]} preferredOrder preferred order + * @returns {string[]} result + */ +const createOrder = (array, preferredOrder) => { + const originalArray = array.slice(); + /** @type {Set} */ + const set = new Set(array); + /** @type {Set} */ + const usedSet = new Set(); + array.length = 0; + for (const element of preferredOrder) { + if (element.endsWith("!") || set.has(element)) { + array.push(element); + usedSet.add(element); + } + } + for (const element of originalArray) { + if (!usedSet.has(element)) { + array.push(element); + } + } + return array; +}; + +const PLUGIN_NAME = "DefaultStatsPrinterPlugin"; + +class DefaultStatsPrinterPlugin { + /** + * Apply the plugin + * @param {Compiler} compiler the compiler instance + * @returns {void} + */ + apply(compiler) { + compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => { + compilation.hooks.statsPrinter.tap(PLUGIN_NAME, (stats, options) => { + // Put colors into context + stats.hooks.print + .for("compilation") + .tap(PLUGIN_NAME, (compilation, context) => { + for (const color of Object.keys(AVAILABLE_COLORS)) { + const name = + /** @type {keyof KnownStatsPrinterColorFunctions} */ + (color); + /** @type {string | undefined} */ + let start; + if (options.colors) { + if ( + typeof options.colors === "object" && + typeof options.colors[name] === "string" + ) { + start = options.colors[name]; + } else { + start = AVAILABLE_COLORS[name]; + } + } + if (start) { + /** @type {ColorFunction} */ + context[color] = str => + `${start}${ + typeof str === "string" + ? str.replace( + /((\u001B\[39m|\u001B\[22m|\u001B\[0m)+)/g, + `$1${start}` + ) + : str + }\u001B[39m\u001B[22m`; + } else { + /** + * @param {string} str string + * @returns {string} str string + */ + context[color] = str => str; + } + } + for (const format of Object.keys(AVAILABLE_FORMATS)) { + context[format] = + /** + * @param {string | number} content content + * @param {...TODO} args args + * @returns {string} result + */ + (content, ...args) => + /** @type {TODO} */ + ( + AVAILABLE_FORMATS[ + /** @type {keyof AvailableFormats} */ + (format) + ] + )( + content, + /** @type {StatsPrinterContext & Required} */ + (context), + ...args + ); + } + context.timeReference = compilation.time; + }); + + for (const key of Object.keys(COMPILATION_SIMPLE_PRINTERS)) { + stats.hooks.print.for(key).tap(PLUGIN_NAME, (obj, ctx) => + /** @type {TODO} */ + ( + COMPILATION_SIMPLE_PRINTERS[ + /** @type {keyof CompilationSimplePrinters} */ + (key) + ] + )( + obj, + /** @type {DefineStatsPrinterContext<"compilation">} */ + (ctx), + stats + ) + ); + } + + for (const key of Object.keys(ASSET_SIMPLE_PRINTERS)) { + stats.hooks.print.for(key).tap(PLUGIN_NAME, (obj, ctx) => + /** @type {NonNullable} */ + ( + ASSET_SIMPLE_PRINTERS[ + /** @type {keyof AssetSimplePrinters} */ + (key) + ] + )( + obj, + /** @type {DefineStatsPrinterContext<"asset" | "asset.info">} */ + (ctx), + stats + ) + ); + } + + for (const key of Object.keys(MODULE_SIMPLE_PRINTERS)) { + stats.hooks.print.for(key).tap(PLUGIN_NAME, (obj, ctx) => + /** @type {TODO} */ + ( + MODULE_SIMPLE_PRINTERS[ + /** @type {keyof ModuleSimplePrinters} */ + (key) + ] + )( + obj, + /** @type {DefineStatsPrinterContext<"module">} */ + (ctx), + stats + ) + ); + } + + for (const key of Object.keys(MODULE_ISSUER_PRINTERS)) { + stats.hooks.print.for(key).tap(PLUGIN_NAME, (obj, ctx) => + /** @type {NonNullable} */ + ( + MODULE_ISSUER_PRINTERS[ + /** @type {keyof ModuleIssuerPrinters} */ + (key) + ] + )( + obj, + /** @type {DefineStatsPrinterContext<"moduleIssuer">} */ + (ctx), + stats + ) + ); + } + + for (const key of Object.keys(MODULE_REASON_PRINTERS)) { + stats.hooks.print.for(key).tap(PLUGIN_NAME, (obj, ctx) => + /** @type {TODO} */ + ( + MODULE_REASON_PRINTERS[ + /** @type {keyof ModuleReasonsPrinters} */ + (key) + ] + )( + obj, + /** @type {DefineStatsPrinterContext<"moduleReason">} */ + (ctx), + stats + ) + ); + } + + for (const key of Object.keys(MODULE_PROFILE_PRINTERS)) { + stats.hooks.print.for(key).tap(PLUGIN_NAME, (obj, ctx) => + /** @type {NonNullable} */ + ( + MODULE_PROFILE_PRINTERS[ + /** @type {keyof ModuleProfilePrinters} */ + (key) + ] + )( + obj, + /** @type {DefineStatsPrinterContext<"profile">} */ + (ctx), + stats + ) + ); + } + + for (const key of Object.keys(CHUNK_GROUP_PRINTERS)) { + stats.hooks.print.for(key).tap(PLUGIN_NAME, (obj, ctx) => + /** @type {TODO} */ + ( + CHUNK_GROUP_PRINTERS[ + /** @type {keyof ChunkGroupPrinters} */ + (key) + ] + )( + obj, + /** @type {DefineStatsPrinterContext<"chunkGroupKind" | "chunkGroup">} */ + (ctx), + stats + ) + ); + } + + for (const key of Object.keys(CHUNK_PRINTERS)) { + stats.hooks.print.for(key).tap(PLUGIN_NAME, (obj, ctx) => + /** @type {TODO} */ + (CHUNK_PRINTERS[/** @type {keyof ChunkPrinters} */ (key)])( + obj, + /** @type {DefineStatsPrinterContext<"chunk">} */ + (ctx), + stats + ) + ); + } + + for (const key of Object.keys(ERROR_PRINTERS)) { + stats.hooks.print.for(key).tap(PLUGIN_NAME, (obj, ctx) => + /** @type {TODO} */ + (ERROR_PRINTERS[/** @type {keyof ErrorPrinters} */ (key)])( + obj, + /** @type {DefineStatsPrinterContext<"error">} */ + (ctx), + stats + ) + ); + } + + for (const key of Object.keys(LOG_ENTRY_PRINTERS)) { + stats.hooks.print.for(key).tap(PLUGIN_NAME, (obj, ctx) => + /** @type {TODO} */ + ( + LOG_ENTRY_PRINTERS[ + /** @type {keyof LogEntryPrinters} */ + (key) + ] + )( + obj, + /** @type {DefineStatsPrinterContext<"logging">} */ + (ctx), + stats + ) + ); + } + + for (const key of Object.keys(MODULE_TRACE_DEPENDENCY_PRINTERS)) { + stats.hooks.print.for(key).tap(PLUGIN_NAME, (obj, ctx) => + /** @type {NonNullable} */ + ( + MODULE_TRACE_DEPENDENCY_PRINTERS[ + /** @type {keyof ModuleTraceDependencyPrinters} */ + (key) + ] + )( + obj, + /** @type {DefineStatsPrinterContext<"moduleTraceDependency">} */ + (ctx), + stats + ) + ); + } + + for (const key of Object.keys(MODULE_TRACE_ITEM_PRINTERS)) { + stats.hooks.print.for(key).tap(PLUGIN_NAME, (obj, ctx) => + /** @type {NonNullable} */ + ( + MODULE_TRACE_ITEM_PRINTERS[ + /** @type {keyof ModuleTraceItemPrinters} */ + (key) + ] + )( + obj, + /** @type {DefineStatsPrinterContext<"moduleTraceItem">} */ + (ctx), + stats + ) + ); + } + + for (const key of Object.keys(PREFERRED_ORDERS)) { + const preferredOrder = PREFERRED_ORDERS[key]; + stats.hooks.sortElements + .for(key) + .tap(PLUGIN_NAME, (elements, context) => { + createOrder(elements, preferredOrder); + }); + } + + for (const key of Object.keys(ITEM_NAMES)) { + const itemName = ITEM_NAMES[key]; + stats.hooks.getItemName + .for(key) + .tap( + PLUGIN_NAME, + typeof itemName === "string" ? () => itemName : itemName + ); + } + + for (const key of Object.keys(SIMPLE_ITEMS_JOINER)) { + const joiner = SIMPLE_ITEMS_JOINER[key]; + stats.hooks.printItems.for(key).tap(PLUGIN_NAME, joiner); + } + + for (const key of Object.keys(SIMPLE_ELEMENT_JOINERS)) { + const joiner = SIMPLE_ELEMENT_JOINERS[key]; + stats.hooks.printElements + .for(key) + .tap(PLUGIN_NAME, /** @type {TODO} */ (joiner)); + } + + for (const key of Object.keys(RESULT_MODIFIER)) { + const modifier = RESULT_MODIFIER[key]; + stats.hooks.result.for(key).tap(PLUGIN_NAME, modifier); + } + }); + }); + } +} +module.exports = DefaultStatsPrinterPlugin; diff --git a/lib/stats/StatsFactory.js b/lib/stats/StatsFactory.js new file mode 100644 index 00000000000..e1dcf280d21 --- /dev/null +++ b/lib/stats/StatsFactory.js @@ -0,0 +1,400 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const { HookMap, SyncBailHook, SyncWaterfallHook } = require("tapable"); +const { concatComparators, keepOriginalOrder } = require("../util/comparators"); +const smartGrouping = require("../util/smartGrouping"); + +/** @typedef {import("../Chunk")} Chunk */ +/** @typedef {import("../ChunkGroup").OriginRecord} OriginRecord */ +/** @typedef {import("../Compilation")} Compilation */ +/** @typedef {import("../Compilation").Asset} Asset */ +/** @typedef {import("../Compilation").NormalizedStatsOptions} NormalizedStatsOptions */ +/** @typedef {import("../Dependency")} Dependency */ +/** @typedef {import("../Module")} Module */ +/** @typedef {import("../ModuleGraph").ModuleProfile} ModuleProfile */ +/** @typedef {import("../ModuleGraphConnection")} ModuleGraphConnection */ +/** @typedef {import("../WebpackError")} WebpackError */ +/** @typedef {import("../util/comparators").Comparator} Comparator */ +/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */ +/** @typedef {import("../util/smartGrouping").GroupConfig} GroupConfig */ +/** @typedef {import("./DefaultStatsFactoryPlugin").ChunkGroupInfoWithName} ChunkGroupInfoWithName */ +/** @typedef {import("./DefaultStatsFactoryPlugin").ModuleIssuerPath} ModuleIssuerPath */ +/** @typedef {import("./DefaultStatsFactoryPlugin").ModuleTrace} ModuleTrace */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsAsset} StatsAsset */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsChunk} StatsChunk */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsChunkGroup} StatsChunkGroup */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsChunkOrigin} StatsChunkOrigin */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsCompilation} StatsCompilation */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsError} StatsError */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsModule} StatsModule */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsModuleIssuer} StatsModuleIssuer */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsModuleReason} StatsModuleReason */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsModuleTraceDependency} StatsModuleTraceDependency */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsModuleTraceItem} StatsModuleTraceItem */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsProfile} StatsProfile */ + +/** + * @typedef {object} KnownStatsFactoryContext + * @property {string} type + * @property {(path: string) => string} makePathsRelative + * @property {Compilation} compilation + * @property {Set} rootModules + * @property {Map} compilationFileToChunks + * @property {Map} compilationAuxiliaryFileToChunks + * @property {RuntimeSpec} runtime + * @property {(compilation: Compilation) => WebpackError[]} cachedGetErrors + * @property {(compilation: Compilation) => WebpackError[]} cachedGetWarnings + */ + +/** @typedef {KnownStatsFactoryContext & Record} StatsFactoryContext */ + +// StatsLogging StatsLoggingEntry + +/** + * @template T + * @template F + * @typedef {T extends Compilation ? StatsCompilation : T extends ChunkGroupInfoWithName ? StatsChunkGroup : T extends Chunk ? StatsChunk : T extends OriginRecord ? StatsChunkOrigin : T extends Module ? StatsModule : T extends ModuleGraphConnection ? StatsModuleReason : T extends Asset ? StatsAsset : T extends ModuleTrace ? StatsModuleTraceItem : T extends Dependency ? StatsModuleTraceDependency : T extends Error ? StatsError : T extends ModuleProfile ? StatsProfile : F} StatsObject + */ + +/** + * @template T + * @template F + * @typedef {T extends ChunkGroupInfoWithName[] ? Record> : T extends (infer V)[] ? StatsObject[] : StatsObject} CreatedObject + */ + +/** @typedef {TODO} FactoryData */ +/** @typedef {TODO} FactoryDataItem */ +/** @typedef {TODO} Result */ +/** @typedef {Record} ObjectForExtract */ + +/** + * @typedef {object} StatsFactoryHooks + * @property {HookMap>} extract + * @property {HookMap>} filter + * @property {HookMap>} sort + * @property {HookMap>} filterSorted + * @property {HookMap>} groupResults + * @property {HookMap>} sortResults + * @property {HookMap>} filterResults + * @property {HookMap>} merge + * @property {HookMap>} result + * @property {HookMap>} getItemName + * @property {HookMap>} getItemFactory + */ + +/** + * @template T + * @typedef {Map} Caches + */ + +class StatsFactory { + constructor() { + /** @type {StatsFactoryHooks} */ + this.hooks = Object.freeze({ + extract: new HookMap( + () => new SyncBailHook(["object", "data", "context"]) + ), + filter: new HookMap( + () => new SyncBailHook(["item", "context", "index", "unfilteredIndex"]) + ), + sort: new HookMap(() => new SyncBailHook(["comparators", "context"])), + filterSorted: new HookMap( + () => new SyncBailHook(["item", "context", "index", "unfilteredIndex"]) + ), + groupResults: new HookMap( + () => new SyncBailHook(["groupConfigs", "context"]) + ), + sortResults: new HookMap( + () => new SyncBailHook(["comparators", "context"]) + ), + filterResults: new HookMap( + () => new SyncBailHook(["item", "context", "index", "unfilteredIndex"]) + ), + merge: new HookMap(() => new SyncBailHook(["items", "context"])), + result: new HookMap(() => new SyncWaterfallHook(["result", "context"])), + getItemName: new HookMap(() => new SyncBailHook(["item", "context"])), + getItemFactory: new HookMap(() => new SyncBailHook(["item", "context"])) + }); + const hooks = this.hooks; + this._caches = /** @type {TODO} */ ({}); + for (const key of Object.keys(hooks)) { + this._caches[/** @type {keyof StatsFactoryHooks} */ (key)] = new Map(); + } + this._inCreate = false; + } + + /** + * @template {StatsFactoryHooks[keyof StatsFactoryHooks]} HM + * @template {HM extends HookMap ? H : never} H + * @param {HM} hookMap hook map + * @param {Caches} cache cache + * @param {string} type type + * @returns {H[]} hooks + * @private + */ + _getAllLevelHooks(hookMap, cache, type) { + const cacheEntry = cache.get(type); + if (cacheEntry !== undefined) { + return cacheEntry; + } + const hooks = /** @type {H[]} */ ([]); + const typeParts = type.split("."); + for (let i = 0; i < typeParts.length; i++) { + const hook = /** @type {H} */ (hookMap.get(typeParts.slice(i).join("."))); + if (hook) { + hooks.push(hook); + } + } + cache.set(type, hooks); + return hooks; + } + + /** + * @template {StatsFactoryHooks[keyof StatsFactoryHooks]} HM + * @template {HM extends HookMap ? H : never} H + * @template {H extends import("tapable").Hook ? R : never} R + * @param {HM} hookMap hook map + * @param {Caches} cache cache + * @param {string} type type + * @param {(hook: H) => R | void} fn fn + * @returns {R | void} hook + * @private + */ + _forEachLevel(hookMap, cache, type, fn) { + for (const hook of this._getAllLevelHooks(hookMap, cache, type)) { + const result = fn(/** @type {H} */ (hook)); + if (result !== undefined) return result; + } + } + + /** + * @template {StatsFactoryHooks[keyof StatsFactoryHooks]} HM + * @template {HM extends HookMap ? H : never} H + * @param {HM} hookMap hook map + * @param {Caches} cache cache + * @param {string} type type + * @param {FactoryData} data data + * @param {(hook: H, factoryData: FactoryData) => FactoryData} fn fn + * @returns {FactoryData} data + * @private + */ + _forEachLevelWaterfall(hookMap, cache, type, data, fn) { + for (const hook of this._getAllLevelHooks(hookMap, cache, type)) { + data = fn(/** @type {H} */ (hook), data); + } + return data; + } + + /** + * @template {StatsFactoryHooks[keyof StatsFactoryHooks]} T + * @template {T extends HookMap ? H : never} H + * @template {H extends import("tapable").Hook ? R : never} R + * @param {T} hookMap hook map + * @param {Caches} cache cache + * @param {string} type type + * @param {Array} items items + * @param {(hook: H, item: R, idx: number, i: number) => R | undefined} fn fn + * @param {boolean} forceClone force clone + * @returns {R[]} result for each level + * @private + */ + _forEachLevelFilter(hookMap, cache, type, items, fn, forceClone) { + const hooks = this._getAllLevelHooks(hookMap, cache, type); + if (hooks.length === 0) return forceClone ? items.slice() : items; + let i = 0; + return items.filter((item, idx) => { + for (const hook of hooks) { + const r = fn(/** @type {H} */ (hook), item, idx, i); + if (r !== undefined) { + if (r) i++; + return r; + } + } + i++; + return true; + }); + } + + /** + * @template FactoryData + * @template FallbackCreatedObject + * @param {string} type type + * @param {FactoryData} data factory data + * @param {Omit} baseContext context used as base + * @returns {CreatedObject} created object + */ + create(type, data, baseContext) { + if (this._inCreate) { + return this._create(type, data, baseContext); + } + try { + this._inCreate = true; + return this._create(type, data, baseContext); + } finally { + for (const key of Object.keys(this._caches)) + this._caches[/** @type {keyof StatsFactoryHooks} */ (key)].clear(); + this._inCreate = false; + } + } + + /** + * @private + * @template FactoryData + * @template FallbackCreatedObject + * @param {string} type type + * @param {FactoryData} data factory data + * @param {Omit} baseContext context used as base + * @returns {CreatedObject} created object + */ + _create(type, data, baseContext) { + const context = /** @type {StatsFactoryContext} */ ({ + ...baseContext, + type, + [type]: data + }); + if (Array.isArray(data)) { + // run filter on unsorted items + const items = this._forEachLevelFilter( + this.hooks.filter, + this._caches.filter, + type, + data, + (h, r, idx, i) => h.call(r, context, idx, i), + true + ); + + // sort items + /** @type {Comparator[]} */ + const comparators = []; + this._forEachLevel(this.hooks.sort, this._caches.sort, type, h => + h.call(comparators, context) + ); + if (comparators.length > 0) { + items.sort( + // @ts-expect-error number of arguments is correct + concatComparators(...comparators, keepOriginalOrder(items)) + ); + } + + // run filter on sorted items + const items2 = this._forEachLevelFilter( + this.hooks.filterSorted, + this._caches.filterSorted, + type, + items, + (h, r, idx, i) => h.call(r, context, idx, i), + false + ); + + // for each item + let resultItems = items2.map((item, i) => { + /** @type {StatsFactoryContext} */ + const itemContext = { + ...context, + _index: i + }; + + // run getItemName + const itemName = this._forEachLevel( + this.hooks.getItemName, + this._caches.getItemName, + `${type}[]`, + h => h.call(item, itemContext) + ); + if (itemName) itemContext[itemName] = item; + const innerType = itemName ? `${type}[].${itemName}` : `${type}[]`; + + // run getItemFactory + const itemFactory = + this._forEachLevel( + this.hooks.getItemFactory, + this._caches.getItemFactory, + innerType, + h => h.call(item, itemContext) + ) || this; + + // run item factory + return itemFactory.create(innerType, item, itemContext); + }); + + // sort result items + /** @type {Comparator[]} */ + const comparators2 = []; + this._forEachLevel( + this.hooks.sortResults, + this._caches.sortResults, + type, + h => h.call(comparators2, context) + ); + if (comparators2.length > 0) { + resultItems.sort( + // @ts-expect-error number of arguments is correct + concatComparators(...comparators2, keepOriginalOrder(resultItems)) + ); + } + + // group result items + /** @type {GroupConfig[]} */ + const groupConfigs = []; + this._forEachLevel( + this.hooks.groupResults, + this._caches.groupResults, + type, + h => h.call(groupConfigs, context) + ); + if (groupConfigs.length > 0) { + resultItems = smartGrouping(resultItems, groupConfigs); + } + + // run filter on sorted result items + const finalResultItems = this._forEachLevelFilter( + this.hooks.filterResults, + this._caches.filterResults, + type, + resultItems, + (h, r, idx, i) => h.call(r, context, idx, i), + false + ); + + // run merge on mapped items + let result = this._forEachLevel( + this.hooks.merge, + this._caches.merge, + type, + h => h.call(finalResultItems, context) + ); + if (result === undefined) result = finalResultItems; + + // run result on merged items + return this._forEachLevelWaterfall( + this.hooks.result, + this._caches.result, + type, + result, + (h, r) => h.call(r, context) + ); + } + /** @type {ObjectForExtract} */ + const object = {}; + + // run extract on value + this._forEachLevel(this.hooks.extract, this._caches.extract, type, h => + h.call(object, data, context) + ); + + // run result on extracted object + return this._forEachLevelWaterfall( + this.hooks.result, + this._caches.result, + type, + object, + (h, r) => h.call(r, context) + ); + } +} +module.exports = StatsFactory; diff --git a/lib/stats/StatsPrinter.js b/lib/stats/StatsPrinter.js new file mode 100644 index 00000000000..40866edf5fe --- /dev/null +++ b/lib/stats/StatsPrinter.js @@ -0,0 +1,301 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const { HookMap, SyncWaterfallHook, SyncBailHook } = require("tapable"); + +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsAsset} StatsAsset */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsChunk} StatsChunk */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsChunkGroup} StatsChunkGroup */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsCompilation} StatsCompilation */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsError} StatsError */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsLogging} StatsLogging */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsModule} StatsModule */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsModuleIssuer} StatsModuleIssuer */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsModuleReason} StatsModuleReason */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsModuleTraceDependency} StatsModuleTraceDependency */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsModuleTraceItem} StatsModuleTraceItem */ +/** @typedef {import("./DefaultStatsFactoryPlugin").StatsProfile} StatsProfile */ + +/** + * @typedef {object} PrintedElement + * @property {string} element + * @property {string | undefined} content + */ + +/** + * @typedef {object} KnownStatsPrinterContext + * @property {string=} type + * @property {StatsCompilation=} compilation + * @property {StatsChunkGroup=} chunkGroup + * @property {string=} chunkGroupKind + * @property {StatsAsset=} asset + * @property {StatsModule=} module + * @property {StatsChunk=} chunk + * @property {StatsModuleReason=} moduleReason + * @property {StatsModuleIssuer=} moduleIssuer + * @property {StatsError=} error + * @property {StatsProfile=} profile + * @property {StatsLogging=} logging + * @property {StatsModuleTraceItem=} moduleTraceItem + * @property {StatsModuleTraceDependency=} moduleTraceDependency + */ + +/** @typedef {(value: string | number) => string} ColorFunction */ + +/** + * @typedef {object} KnownStatsPrinterColorFunctions + * @property {ColorFunction=} bold + * @property {ColorFunction=} yellow + * @property {ColorFunction=} red + * @property {ColorFunction=} green + * @property {ColorFunction=} magenta + * @property {ColorFunction=} cyan + */ + +/** + * @typedef {object} KnownStatsPrinterFormatters + * @property {(file: string, oversize?: boolean) => string=} formatFilename + * @property {(id: string | number) => string=} formatModuleId + * @property {(id: string | number, direction?: "parent" | "child" | "sibling") => string=} formatChunkId + * @property {(size: number) => string=} formatSize + * @property {(size: string) => string=} formatLayer + * @property {(dateTime: number) => string=} formatDateTime + * @property {(flag: string) => string=} formatFlag + * @property {(time: number, boldQuantity?: boolean) => string=} formatTime + * @property {(message: string) => string=} formatError + */ + +/** @typedef {KnownStatsPrinterColorFunctions & KnownStatsPrinterFormatters & KnownStatsPrinterContext & Record} StatsPrinterContext */ +/** @typedef {StatsPrinterContext & Required & Required & { type: string }} StatsPrinterContextWithExtra */ +/** @typedef {EXPECTED_ANY} PrintObject */ + +/** + * @typedef {object} StatsPrintHooks + * @property {HookMap>} sortElements + * @property {HookMap>} printElements + * @property {HookMap>} sortItems + * @property {HookMap>} getItemName + * @property {HookMap>} printItems + * @property {HookMap>} print + * @property {HookMap>} result + */ + +class StatsPrinter { + constructor() { + /** @type {StatsPrintHooks} */ + this.hooks = Object.freeze({ + sortElements: new HookMap( + () => new SyncBailHook(["elements", "context"]) + ), + printElements: new HookMap( + () => new SyncBailHook(["printedElements", "context"]) + ), + sortItems: new HookMap(() => new SyncBailHook(["items", "context"])), + getItemName: new HookMap(() => new SyncBailHook(["item", "context"])), + printItems: new HookMap( + () => new SyncBailHook(["printedItems", "context"]) + ), + print: new HookMap(() => new SyncBailHook(["object", "context"])), + result: new HookMap(() => new SyncWaterfallHook(["result", "context"])) + }); + /** + * @type {TODO} + */ + this._levelHookCache = new Map(); + this._inPrint = false; + } + + /** + * get all level hooks + * @private + * @template {StatsPrintHooks[keyof StatsPrintHooks]} HM + * @template {HM extends HookMap ? H : never} H + * @param {HM} hookMap hook map + * @param {string} type type + * @returns {H[]} hooks + */ + _getAllLevelHooks(hookMap, type) { + let cache = this._levelHookCache.get(hookMap); + if (cache === undefined) { + cache = new Map(); + this._levelHookCache.set(hookMap, cache); + } + const cacheEntry = cache.get(type); + if (cacheEntry !== undefined) { + return cacheEntry; + } + /** @type {H[]} */ + const hooks = []; + const typeParts = type.split("."); + for (let i = 0; i < typeParts.length; i++) { + const hook = /** @type {H} */ (hookMap.get(typeParts.slice(i).join("."))); + if (hook) { + hooks.push(hook); + } + } + cache.set(type, hooks); + return hooks; + } + + /** + * Run `fn` for each level + * @private + * @template {StatsPrintHooks[keyof StatsPrintHooks]} HM + * @template {HM extends HookMap ? H : never} H + * @template {H extends import("tapable").Hook ? R : never} R + * @param {HM} hookMap hook map + * @param {string} type type + * @param {(hooK: H) => R | undefined | void} fn fn + * @returns {R | undefined} hook + */ + _forEachLevel(hookMap, type, fn) { + for (const hook of this._getAllLevelHooks(hookMap, type)) { + const result = fn(/** @type {H} */ (hook)); + if (result !== undefined) return /** @type {R} */ (result); + } + } + + /** + * Run `fn` for each level + * @private + * @template {StatsPrintHooks[keyof StatsPrintHooks]} HM + * @template {HM extends HookMap ? H : never} H + * @param {HM} hookMap hook map + * @param {string} type type + * @param {string} data data + * @param {(hook: H, data: string) => string} fn fn + * @returns {string | undefined} result of `fn` + */ + _forEachLevelWaterfall(hookMap, type, data, fn) { + for (const hook of this._getAllLevelHooks(hookMap, type)) { + data = fn(/** @type {H} */ (hook), data); + } + return data; + } + + /** + * @param {string} type The type + * @param {PrintObject} object Object to print + * @param {StatsPrinterContext=} baseContext The base context + * @returns {string | undefined} printed result + */ + print(type, object, baseContext) { + if (this._inPrint) { + return this._print(type, object, baseContext); + } + try { + this._inPrint = true; + return this._print(type, object, baseContext); + } finally { + this._levelHookCache.clear(); + this._inPrint = false; + } + } + + /** + * @private + * @param {string} type type + * @param {PrintObject} object object + * @param {StatsPrinterContext=} baseContext context + * @returns {string | undefined} printed result + */ + _print(type, object, baseContext) { + /** @type {StatsPrinterContext} */ + const context = { + ...baseContext, + type, + [type]: object + }; + + /** @type {string | undefined} */ + let printResult = this._forEachLevel(this.hooks.print, type, hook => + hook.call(object, context) + ); + if (printResult === undefined) { + if (Array.isArray(object)) { + const sortedItems = object.slice(); + this._forEachLevel(this.hooks.sortItems, type, h => + h.call( + sortedItems, + /** @type {StatsPrinterContextWithExtra} */ + (context) + ) + ); + const printedItems = sortedItems.map((item, i) => { + const itemContext = + /** @type {StatsPrinterContextWithExtra} */ + ({ + ...context, + _index: i + }); + const itemName = this._forEachLevel( + this.hooks.getItemName, + `${type}[]`, + h => h.call(item, itemContext) + ); + if (itemName) itemContext[itemName] = item; + return this.print( + itemName ? `${type}[].${itemName}` : `${type}[]`, + item, + itemContext + ); + }); + printResult = this._forEachLevel(this.hooks.printItems, type, h => + h.call( + /** @type {string[]} */ (printedItems), + /** @type {StatsPrinterContextWithExtra} */ + (context) + ) + ); + if (printResult === undefined) { + const result = printedItems.filter(Boolean); + if (result.length > 0) printResult = result.join("\n"); + } + } else if (object !== null && typeof object === "object") { + const elements = Object.keys(object).filter( + key => object[key] !== undefined + ); + this._forEachLevel(this.hooks.sortElements, type, h => + h.call( + elements, + /** @type {StatsPrinterContextWithExtra} */ + (context) + ) + ); + const printedElements = elements.map(element => { + const content = this.print(`${type}.${element}`, object[element], { + ...context, + _parent: object, + _element: element, + [element]: object[element] + }); + return { element, content }; + }); + printResult = this._forEachLevel(this.hooks.printElements, type, h => + h.call( + printedElements, + /** @type {StatsPrinterContextWithExtra} */ + (context) + ) + ); + if (printResult === undefined) { + const result = printedElements.map(e => e.content).filter(Boolean); + if (result.length > 0) printResult = result.join("\n"); + } + } + } + + return this._forEachLevelWaterfall( + this.hooks.result, + type, + /** @type {string} */ + (printResult), + (h, r) => h.call(r, /** @type {StatsPrinterContextWithExtra} */ (context)) + ); + } +} +module.exports = StatsPrinter; diff --git a/lib/util/ArrayHelpers.js b/lib/util/ArrayHelpers.js new file mode 100644 index 00000000000..af9ac2df457 --- /dev/null +++ b/lib/util/ArrayHelpers.js @@ -0,0 +1,46 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +/** + * Compare two arrays or strings by performing strict equality check for each value. + * @template T + * @param {ArrayLike} a Array of values to be compared + * @param {ArrayLike} b Array of values to be compared + * @returns {boolean} returns true if all the elements of passed arrays are strictly equal. + */ +module.exports.equals = (a, b) => { + if (a.length !== b.length) return false; + for (let i = 0; i < a.length; i++) { + if (a[i] !== b[i]) return false; + } + return true; +}; + +/** + * Partition an array by calling a predicate function on each value. + * @template T + * @param {Array} arr Array of values to be partitioned + * @param {(value: T) => boolean} fn Partition function which partitions based on truthiness of result. + * @returns {[Array, Array]} returns the values of `arr` partitioned into two new arrays based on fn predicate. + */ +module.exports.groupBy = ( + // eslint-disable-next-line default-param-last + arr = [], + fn +) => + arr.reduce( + /** + * @param {[Array, Array]} groups An accumulator storing already partitioned values returned from previous call. + * @param {T} value The value of the current element + * @returns {[Array, Array]} returns an array of partitioned groups accumulator resulting from calling a predicate on the current value. + */ + (groups, value) => { + groups[fn(value) ? 0 : 1].push(value); + return groups; + }, + [[], []] + ); diff --git a/lib/util/ArrayQueue.js b/lib/util/ArrayQueue.js new file mode 100644 index 00000000000..522abf93de2 --- /dev/null +++ b/lib/util/ArrayQueue.js @@ -0,0 +1,104 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +/** + * @template T + */ +class ArrayQueue { + /** + * @param {Iterable=} items The initial elements. + */ + constructor(items) { + /** + * @private + * @type {T[]} + */ + this._list = items ? Array.from(items) : []; + /** + * @private + * @type {T[]} + */ + this._listReversed = []; + } + + /** + * Returns the number of elements in this queue. + * @returns {number} The number of elements in this queue. + */ + get length() { + return this._list.length + this._listReversed.length; + } + + /** + * Empties the queue. + */ + clear() { + this._list.length = 0; + this._listReversed.length = 0; + } + + /** + * Appends the specified element to this queue. + * @param {T} item The element to add. + * @returns {void} + */ + enqueue(item) { + this._list.push(item); + } + + /** + * Retrieves and removes the head of this queue. + * @returns {T | undefined} The head of the queue of `undefined` if this queue is empty. + */ + dequeue() { + if (this._listReversed.length === 0) { + if (this._list.length === 0) return; + if (this._list.length === 1) return this._list.pop(); + if (this._list.length < 16) return this._list.shift(); + const temp = this._listReversed; + this._listReversed = this._list; + this._listReversed.reverse(); + this._list = temp; + } + return this._listReversed.pop(); + } + + /** + * Finds and removes an item + * @param {T} item the item + * @returns {void} + */ + delete(item) { + const i = this._list.indexOf(item); + if (i >= 0) { + this._list.splice(i, 1); + } else { + const i = this._listReversed.indexOf(item); + if (i >= 0) this._listReversed.splice(i, 1); + } + } + + [Symbol.iterator]() { + return { + next: () => { + const item = this.dequeue(); + if (item) { + return { + done: false, + value: item + }; + } + return { + done: true, + value: undefined + }; + } + }; + } +} + +module.exports = ArrayQueue; diff --git a/lib/util/AsyncQueue.js b/lib/util/AsyncQueue.js new file mode 100644 index 00000000000..5fa5b669039 --- /dev/null +++ b/lib/util/AsyncQueue.js @@ -0,0 +1,410 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const { SyncHook, AsyncSeriesHook } = require("tapable"); +const { makeWebpackError } = require("../HookWebpackError"); +const WebpackError = require("../WebpackError"); +const ArrayQueue = require("./ArrayQueue"); + +const QUEUED_STATE = 0; +const PROCESSING_STATE = 1; +const DONE_STATE = 2; + +let inHandleResult = 0; + +/** + * @template T + * @callback Callback + * @param {(WebpackError | null)=} err + * @param {(T | null)=} result + */ + +/** + * @template T + * @template K + * @template R + */ +class AsyncQueueEntry { + /** + * @param {T} item the item + * @param {Callback} callback the callback + */ + constructor(item, callback) { + this.item = item; + /** @type {typeof QUEUED_STATE | typeof PROCESSING_STATE | typeof DONE_STATE} */ + this.state = QUEUED_STATE; + /** @type {Callback | undefined} */ + this.callback = callback; + /** @type {Callback[] | undefined} */ + this.callbacks = undefined; + /** @type {R | null | undefined} */ + this.result = undefined; + /** @type {WebpackError | null | undefined} */ + this.error = undefined; + } +} + +/** + * @template T, K + * @typedef {(item: T) => K} getKey + */ + +/** + * @template T, R + * @typedef {(item: T, callback: Callback) => void} Processor + */ + +/** + * @template T + * @template K + * @template R + */ +class AsyncQueue { + /** + * @param {object} options options object + * @param {string=} options.name name of the queue + * @param {number=} options.parallelism how many items should be processed at once + * @param {string=} options.context context of execution + * @param {AsyncQueue=} options.parent parent queue, which will have priority over this queue and with shared parallelism + * @param {getKey=} options.getKey extract key from item + * @param {Processor} options.processor async function to process items + */ + constructor({ name, context, parallelism, parent, processor, getKey }) { + this._name = name; + this._context = context || "normal"; + this._parallelism = parallelism || 1; + this._processor = processor; + this._getKey = + getKey || + /** @type {getKey} */ (item => /** @type {T & K} */ (item)); + /** @type {Map>} */ + this._entries = new Map(); + /** @type {ArrayQueue>} */ + this._queued = new ArrayQueue(); + /** @type {AsyncQueue[] | undefined} */ + this._children = undefined; + this._activeTasks = 0; + this._willEnsureProcessing = false; + this._needProcessing = false; + this._stopped = false; + /** @type {AsyncQueue} */ + this._root = parent ? parent._root : this; + if (parent) { + if (this._root._children === undefined) { + this._root._children = [this]; + } else { + this._root._children.push(this); + } + } + + this.hooks = { + /** @type {AsyncSeriesHook<[T]>} */ + beforeAdd: new AsyncSeriesHook(["item"]), + /** @type {SyncHook<[T]>} */ + added: new SyncHook(["item"]), + /** @type {AsyncSeriesHook<[T]>} */ + beforeStart: new AsyncSeriesHook(["item"]), + /** @type {SyncHook<[T]>} */ + started: new SyncHook(["item"]), + /** @type {SyncHook<[T, WebpackError | null | undefined, R | null | undefined]>} */ + result: new SyncHook(["item", "error", "result"]) + }; + + this._ensureProcessing = this._ensureProcessing.bind(this); + } + + /** + * @returns {string} context of execution + */ + getContext() { + return this._context; + } + + /** + * @param {string} value context of execution + */ + setContext(value) { + this._context = value; + } + + /** + * @param {T} item an item + * @param {Callback} callback callback function + * @returns {void} + */ + add(item, callback) { + if (this._stopped) return callback(new WebpackError("Queue was stopped")); + this.hooks.beforeAdd.callAsync(item, err => { + if (err) { + callback( + makeWebpackError(err, `AsyncQueue(${this._name}).hooks.beforeAdd`) + ); + return; + } + const key = this._getKey(item); + const entry = this._entries.get(key); + if (entry !== undefined) { + if (entry.state === DONE_STATE) { + if (inHandleResult++ > 3) { + process.nextTick(() => callback(entry.error, entry.result)); + } else { + callback(entry.error, entry.result); + } + inHandleResult--; + } else if (entry.callbacks === undefined) { + entry.callbacks = [callback]; + } else { + entry.callbacks.push(callback); + } + return; + } + const newEntry = new AsyncQueueEntry(item, callback); + if (this._stopped) { + this.hooks.added.call(item); + this._root._activeTasks++; + process.nextTick(() => + this._handleResult(newEntry, new WebpackError("Queue was stopped")) + ); + } else { + this._entries.set(key, newEntry); + this._queued.enqueue(newEntry); + const root = this._root; + root._needProcessing = true; + if (root._willEnsureProcessing === false) { + root._willEnsureProcessing = true; + setImmediate(root._ensureProcessing); + } + this.hooks.added.call(item); + } + }); + } + + /** + * @param {T} item an item + * @returns {void} + */ + invalidate(item) { + const key = this._getKey(item); + const entry = + /** @type {AsyncQueueEntry} */ + (this._entries.get(key)); + this._entries.delete(key); + if (entry.state === QUEUED_STATE) { + this._queued.delete(entry); + } + } + + /** + * Waits for an already started item + * @param {T} item an item + * @param {Callback} callback callback function + * @returns {void} + */ + waitFor(item, callback) { + const key = this._getKey(item); + const entry = this._entries.get(key); + if (entry === undefined) { + return callback( + new WebpackError( + "waitFor can only be called for an already started item" + ) + ); + } + if (entry.state === DONE_STATE) { + process.nextTick(() => callback(entry.error, entry.result)); + } else if (entry.callbacks === undefined) { + entry.callbacks = [callback]; + } else { + entry.callbacks.push(callback); + } + } + + /** + * @returns {void} + */ + stop() { + this._stopped = true; + const queue = this._queued; + this._queued = new ArrayQueue(); + const root = this._root; + for (const entry of queue) { + this._entries.delete( + this._getKey(/** @type {AsyncQueueEntry} */ (entry).item) + ); + root._activeTasks++; + this._handleResult( + /** @type {AsyncQueueEntry} */ (entry), + new WebpackError("Queue was stopped") + ); + } + } + + /** + * @returns {void} + */ + increaseParallelism() { + const root = this._root; + root._parallelism++; + /* istanbul ignore next */ + if (root._willEnsureProcessing === false && root._needProcessing) { + root._willEnsureProcessing = true; + setImmediate(root._ensureProcessing); + } + } + + /** + * @returns {void} + */ + decreaseParallelism() { + const root = this._root; + root._parallelism--; + } + + /** + * @param {T} item an item + * @returns {boolean} true, if the item is currently being processed + */ + isProcessing(item) { + const key = this._getKey(item); + const entry = this._entries.get(key); + return entry !== undefined && entry.state === PROCESSING_STATE; + } + + /** + * @param {T} item an item + * @returns {boolean} true, if the item is currently queued + */ + isQueued(item) { + const key = this._getKey(item); + const entry = this._entries.get(key); + return entry !== undefined && entry.state === QUEUED_STATE; + } + + /** + * @param {T} item an item + * @returns {boolean} true, if the item is currently queued + */ + isDone(item) { + const key = this._getKey(item); + const entry = this._entries.get(key); + return entry !== undefined && entry.state === DONE_STATE; + } + + /** + * @returns {void} + */ + _ensureProcessing() { + while (this._activeTasks < this._parallelism) { + const entry = this._queued.dequeue(); + if (entry === undefined) break; + this._activeTasks++; + entry.state = PROCESSING_STATE; + this._startProcessing(entry); + } + this._willEnsureProcessing = false; + if (this._queued.length > 0) return; + if (this._children !== undefined) { + for (const child of this._children) { + while (this._activeTasks < this._parallelism) { + const entry = child._queued.dequeue(); + if (entry === undefined) break; + this._activeTasks++; + entry.state = PROCESSING_STATE; + child._startProcessing(entry); + } + if (child._queued.length > 0) return; + } + } + if (!this._willEnsureProcessing) this._needProcessing = false; + } + + /** + * @param {AsyncQueueEntry} entry the entry + * @returns {void} + */ + _startProcessing(entry) { + this.hooks.beforeStart.callAsync(entry.item, err => { + if (err) { + this._handleResult( + entry, + makeWebpackError(err, `AsyncQueue(${this._name}).hooks.beforeStart`) + ); + return; + } + let inCallback = false; + try { + this._processor(entry.item, (e, r) => { + inCallback = true; + this._handleResult(entry, e, r); + }); + } catch (err) { + if (inCallback) throw err; + this._handleResult(entry, /** @type {WebpackError} */ (err), null); + } + this.hooks.started.call(entry.item); + }); + } + + /** + * @param {AsyncQueueEntry} entry the entry + * @param {(WebpackError | null)=} err error, if any + * @param {(R | null)=} result result, if any + * @returns {void} + */ + _handleResult(entry, err, result) { + this.hooks.result.callAsync(entry.item, err, result, hookError => { + const error = hookError + ? makeWebpackError(hookError, `AsyncQueue(${this._name}).hooks.result`) + : err; + + const callback = /** @type {Callback} */ (entry.callback); + const callbacks = entry.callbacks; + entry.state = DONE_STATE; + entry.callback = undefined; + entry.callbacks = undefined; + entry.result = result; + entry.error = error; + + const root = this._root; + root._activeTasks--; + if (root._willEnsureProcessing === false && root._needProcessing) { + root._willEnsureProcessing = true; + setImmediate(root._ensureProcessing); + } + + if (inHandleResult++ > 3) { + process.nextTick(() => { + callback(error, result); + if (callbacks !== undefined) { + for (const callback of callbacks) { + callback(error, result); + } + } + }); + } else { + callback(error, result); + if (callbacks !== undefined) { + for (const callback of callbacks) { + callback(error, result); + } + } + } + inHandleResult--; + }); + } + + clear() { + this._entries.clear(); + this._queued.clear(); + this._activeTasks = 0; + this._willEnsureProcessing = false; + this._needProcessing = false; + this._stopped = false; + } +} + +module.exports = AsyncQueue; diff --git a/lib/util/Hash.js b/lib/util/Hash.js new file mode 100644 index 00000000000..a0078275327 --- /dev/null +++ b/lib/util/Hash.js @@ -0,0 +1,35 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +class Hash { + /* istanbul ignore next */ + /** + * Update hash {@link https://nodejs.org/api/crypto.html#crypto_hash_update_data_inputencoding} + * @abstract + * @param {string|Buffer} data data + * @param {string=} inputEncoding data encoding + * @returns {this} updated hash + */ + update(data, inputEncoding) { + const AbstractMethodError = require("../AbstractMethodError"); + throw new AbstractMethodError(); + } + + /* istanbul ignore next */ + /** + * Calculates the digest {@link https://nodejs.org/api/crypto.html#crypto_hash_digest_encoding} + * @abstract + * @param {string=} encoding encoding of the return value + * @returns {string|Buffer} digest + */ + digest(encoding) { + const AbstractMethodError = require("../AbstractMethodError"); + throw new AbstractMethodError(); + } +} + +module.exports = Hash; diff --git a/lib/util/IterableHelpers.js b/lib/util/IterableHelpers.js new file mode 100644 index 00000000000..b981eca88ff --- /dev/null +++ b/lib/util/IterableHelpers.js @@ -0,0 +1,45 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +/** + * @template T + * @param {Iterable} set a set + * @returns {T | undefined} last item + */ +const last = set => { + let last; + for (const item of set) last = item; + return last; +}; + +/** + * @template T + * @param {Iterable} iterable iterable + * @param {(value: T) => boolean | null | undefined} filter predicate + * @returns {boolean} true, if some items match the filter predicate + */ +const someInIterable = (iterable, filter) => { + for (const item of iterable) { + if (filter(item)) return true; + } + return false; +}; + +/** + * @template T + * @param {Iterable} iterable an iterable + * @returns {number} count of items + */ +const countIterable = iterable => { + let i = 0; + for (const _ of iterable) i++; + return i; +}; + +module.exports.last = last; +module.exports.someInIterable = someInIterable; +module.exports.countIterable = countIterable; diff --git a/lib/util/LazyBucketSortedSet.js b/lib/util/LazyBucketSortedSet.js new file mode 100644 index 00000000000..c1cd0b0e9b4 --- /dev/null +++ b/lib/util/LazyBucketSortedSet.js @@ -0,0 +1,270 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const { first } = require("./SetHelpers"); +const SortableSet = require("./SortableSet"); + +/** + * @template T + * @template K + * @typedef {(item: T) => K} GetKey + */ + +/** + * @template T + * @typedef {(a: T, n: T) => number} Comparator + */ + +/** + * @template T + * @template K + * @typedef {LazyBucketSortedSet | SortableSet} Entry + */ + +/** + * @template T + * @template K + * @typedef {GetKey | Comparator | Comparator} Arg + */ + +/** + * Multi layer bucket sorted set: + * Supports adding non-existing items (DO NOT ADD ITEM TWICE), + * Supports removing exiting items (DO NOT REMOVE ITEM NOT IN SET), + * Supports popping the first items according to defined order, + * Supports iterating all items without order, + * Supports updating an item in an efficient way, + * Supports size property, which is the number of items, + * Items are lazy partially sorted when needed + * @template T + * @template K + */ +class LazyBucketSortedSet { + /** + * @param {GetKey} getKey function to get key from item + * @param {Comparator=} comparator comparator to sort keys + * @param {...Arg} args more pairs of getKey and comparator plus optional final comparator for the last layer + */ + constructor(getKey, comparator, ...args) { + this._getKey = getKey; + this._innerArgs = args; + this._leaf = args.length <= 1; + this._keys = new SortableSet(undefined, comparator); + /** @type {Map>} */ + this._map = new Map(); + this._unsortedItems = new Set(); + this.size = 0; + } + + /** + * @param {T} item an item + * @returns {void} + */ + add(item) { + this.size++; + this._unsortedItems.add(item); + } + + /** + * @param {K} key key of item + * @param {T} item the item + * @returns {void} + */ + _addInternal(key, item) { + let entry = this._map.get(key); + if (entry === undefined) { + entry = this._leaf + ? new SortableSet( + undefined, + /** @type {Comparator} */ + (this._innerArgs[0]) + ) + : new LazyBucketSortedSet( + .../** @type {[GetKey, Comparator]} */ + (this._innerArgs) + ); + this._keys.add(key); + this._map.set(key, entry); + } + entry.add(item); + } + + /** + * @param {T} item an item + * @returns {void} + */ + delete(item) { + this.size--; + if (this._unsortedItems.has(item)) { + this._unsortedItems.delete(item); + return; + } + const key = this._getKey(item); + const entry = /** @type {Entry} */ (this._map.get(key)); + entry.delete(item); + if (entry.size === 0) { + this._deleteKey(key); + } + } + + /** + * @param {K} key key to be removed + * @returns {void} + */ + _deleteKey(key) { + this._keys.delete(key); + this._map.delete(key); + } + + /** + * @returns {T | undefined} an item + */ + popFirst() { + if (this.size === 0) return; + this.size--; + if (this._unsortedItems.size > 0) { + for (const item of this._unsortedItems) { + const key = this._getKey(item); + this._addInternal(key, item); + } + this._unsortedItems.clear(); + } + this._keys.sort(); + const key = /** @type {K} */ (first(this._keys)); + const entry = this._map.get(key); + if (this._leaf) { + const leafEntry = /** @type {SortableSet} */ (entry); + leafEntry.sort(); + const item = /** @type {T} */ (first(leafEntry)); + leafEntry.delete(item); + if (leafEntry.size === 0) { + this._deleteKey(key); + } + return item; + } + const nodeEntry = + /** @type {LazyBucketSortedSet} */ + (entry); + const item = nodeEntry.popFirst(); + if (nodeEntry.size === 0) { + this._deleteKey(key); + } + return item; + } + + /** + * @param {T} item to be updated item + * @returns {(remove?: true) => void} finish update + */ + startUpdate(item) { + if (this._unsortedItems.has(item)) { + return remove => { + if (remove) { + this._unsortedItems.delete(item); + this.size--; + } + }; + } + const key = this._getKey(item); + if (this._leaf) { + const oldEntry = /** @type {SortableSet} */ (this._map.get(key)); + return remove => { + if (remove) { + this.size--; + oldEntry.delete(item); + if (oldEntry.size === 0) { + this._deleteKey(key); + } + return; + } + const newKey = this._getKey(item); + if (key === newKey) { + // This flags the sortable set as unordered + oldEntry.add(item); + } else { + oldEntry.delete(item); + if (oldEntry.size === 0) { + this._deleteKey(key); + } + this._addInternal(newKey, item); + } + }; + } + const oldEntry = + /** @type {LazyBucketSortedSet} */ + (this._map.get(key)); + const finishUpdate = oldEntry.startUpdate(item); + return remove => { + if (remove) { + this.size--; + finishUpdate(true); + if (oldEntry.size === 0) { + this._deleteKey(key); + } + return; + } + const newKey = this._getKey(item); + if (key === newKey) { + finishUpdate(); + } else { + finishUpdate(true); + if (oldEntry.size === 0) { + this._deleteKey(key); + } + this._addInternal(newKey, item); + } + }; + } + + /** + * @param {Iterator[]} iterators list of iterators to append to + * @returns {void} + */ + _appendIterators(iterators) { + if (this._unsortedItems.size > 0) + iterators.push(this._unsortedItems[Symbol.iterator]()); + for (const key of this._keys) { + const entry = this._map.get(key); + if (this._leaf) { + const leafEntry = /** @type {SortableSet} */ (entry); + const iterator = leafEntry[Symbol.iterator](); + iterators.push(iterator); + } else { + const nodeEntry = + /** @type {LazyBucketSortedSet} */ + (entry); + nodeEntry._appendIterators(iterators); + } + } + } + + /** + * @returns {Iterator} the iterator + */ + [Symbol.iterator]() { + /** @type {Iterator[]} */ + const iterators = []; + this._appendIterators(iterators); + iterators.reverse(); + let currentIterator = + /** @type {Iterator} */ + (iterators.pop()); + return { + next: () => { + const res = currentIterator.next(); + if (res.done) { + if (iterators.length === 0) return res; + currentIterator = /** @type {Iterator} */ (iterators.pop()); + return currentIterator.next(); + } + return res; + } + }; + } +} + +module.exports = LazyBucketSortedSet; diff --git a/lib/util/LazySet.js b/lib/util/LazySet.js new file mode 100644 index 00000000000..1ab56167eef --- /dev/null +++ b/lib/util/LazySet.js @@ -0,0 +1,230 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const makeSerializable = require("./makeSerializable.js"); + +/** + * @template T + * @param {Set} targetSet set where items should be added + * @param {Set>} toMerge iterables to be merged + * @returns {void} + */ +const merge = (targetSet, toMerge) => { + for (const set of toMerge) { + for (const item of set) { + targetSet.add(item); + } + } +}; + +/** + * @template T + * @param {Set>} targetSet set where iterables should be added + * @param {Array>} toDeepMerge lazy sets to be flattened + * @returns {void} + */ +const flatten = (targetSet, toDeepMerge) => { + for (const set of toDeepMerge) { + if (set._set.size > 0) targetSet.add(set._set); + if (set._needMerge) { + for (const mergedSet of set._toMerge) { + targetSet.add(mergedSet); + } + flatten(targetSet, set._toDeepMerge); + } + } +}; + +/** + * Like Set but with an addAll method to eventually add items from another iterable. + * Access methods make sure that all delayed operations are executed. + * Iteration methods deopts to normal Set performance until clear is called again (because of the chance of modifications during iteration). + * @template T + */ +class LazySet { + /** + * @param {Iterable=} iterable init iterable + */ + constructor(iterable) { + /** @type {Set} */ + this._set = new Set(iterable); + /** @type {Set>} */ + this._toMerge = new Set(); + /** @type {Array>} */ + this._toDeepMerge = []; + this._needMerge = false; + this._deopt = false; + } + + _flatten() { + flatten(this._toMerge, this._toDeepMerge); + this._toDeepMerge.length = 0; + } + + _merge() { + this._flatten(); + merge(this._set, this._toMerge); + this._toMerge.clear(); + this._needMerge = false; + } + + _isEmpty() { + return ( + this._set.size === 0 && + this._toMerge.size === 0 && + this._toDeepMerge.length === 0 + ); + } + + get size() { + if (this._needMerge) this._merge(); + return this._set.size; + } + + /** + * @param {T} item an item + * @returns {LazySet} itself + */ + add(item) { + this._set.add(item); + return this; + } + + /** + * @param {Iterable | LazySet} iterable a immutable iterable or another immutable LazySet which will eventually be merged into the Set + * @returns {LazySet} itself + */ + addAll(iterable) { + if (this._deopt) { + const _set = this._set; + for (const item of iterable) { + _set.add(item); + } + } else { + if (iterable instanceof LazySet) { + if (iterable._isEmpty()) return this; + this._toDeepMerge.push(iterable); + this._needMerge = true; + if (this._toDeepMerge.length > 100000) { + this._flatten(); + } + } else { + this._toMerge.add(iterable); + this._needMerge = true; + } + if (this._toMerge.size > 100000) this._merge(); + } + return this; + } + + clear() { + this._set.clear(); + this._toMerge.clear(); + this._toDeepMerge.length = 0; + this._needMerge = false; + this._deopt = false; + } + + /** + * @param {T} value an item + * @returns {boolean} true, if the value was in the Set before + */ + delete(value) { + if (this._needMerge) this._merge(); + return this._set.delete(value); + } + + /** + * @returns {IterableIterator<[T, T]>} entries + */ + entries() { + this._deopt = true; + if (this._needMerge) this._merge(); + return this._set.entries(); + } + + /** + * @template K + * @param {(value: T, value2: T, set: Set) => void} callbackFn function called for each entry + * @param {K} thisArg this argument for the callbackFn + * @returns {void} + */ + forEach(callbackFn, thisArg) { + this._deopt = true; + if (this._needMerge) this._merge(); + // eslint-disable-next-line unicorn/no-array-for-each + this._set.forEach(callbackFn, thisArg); + } + + /** + * @param {T} item an item + * @returns {boolean} true, when the item is in the Set + */ + has(item) { + if (this._needMerge) this._merge(); + return this._set.has(item); + } + + /** + * @returns {IterableIterator} keys + */ + keys() { + this._deopt = true; + if (this._needMerge) this._merge(); + return this._set.keys(); + } + + /** + * @returns {IterableIterator} values + */ + values() { + this._deopt = true; + if (this._needMerge) this._merge(); + return this._set.values(); + } + + /** + * @returns {IterableIterator} iterable iterator + */ + [Symbol.iterator]() { + this._deopt = true; + if (this._needMerge) this._merge(); + return this._set[Symbol.iterator](); + } + + /* istanbul ignore next */ + get [Symbol.toStringTag]() { + return "LazySet"; + } + + /** + * @param {import("../serialization/ObjectMiddleware").ObjectSerializerContext} context context + */ + serialize({ write }) { + if (this._needMerge) this._merge(); + write(this._set.size); + for (const item of this._set) write(item); + } + + /** + * @template T + * @param {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} context context + * @returns {LazySet} lazy set + */ + static deserialize({ read }) { + const count = read(); + const items = []; + for (let i = 0; i < count; i++) { + items.push(read()); + } + return new LazySet(items); + } +} + +makeSerializable(LazySet, "webpack/lib/util/LazySet"); + +module.exports = LazySet; diff --git a/lib/util/MapHelpers.js b/lib/util/MapHelpers.js new file mode 100644 index 00000000000..533436e2384 --- /dev/null +++ b/lib/util/MapHelpers.js @@ -0,0 +1,34 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +/** + * getOrInsert is a helper function for maps that allows you to get a value + * from a map if it exists, or insert a new value if it doesn't. If it value doesn't + * exist, it will be computed by the provided function. + * @template K + * @template V + * @param {Map} map The map object to check + * @param {K} key The key to check + * @param {() => V} computer function which will compute the value if it doesn't exist + * @returns {V} The value from the map, or the computed value + * @example + * ```js + * const map = new Map(); + * const value = getOrInsert(map, "key", () => "value"); + * console.log(value); // "value" + * ``` + */ +module.exports.getOrInsert = (map, key, computer) => { + // Grab key from map + const value = map.get(key); + // If the value already exists, return it + if (value !== undefined) return value; + // Otherwise compute the value, set it in the map, and return it + const newValue = computer(); + map.set(key, newValue); + return newValue; +}; diff --git a/lib/util/ParallelismFactorCalculator.js b/lib/util/ParallelismFactorCalculator.js new file mode 100644 index 00000000000..bfb9688f163 --- /dev/null +++ b/lib/util/ParallelismFactorCalculator.js @@ -0,0 +1,69 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const binarySearchBounds = require("./binarySearchBounds"); + +/** @typedef {(value: number) => void} Callback */ + +class ParallelismFactorCalculator { + constructor() { + /** @type {number[]} */ + this._rangePoints = []; + /** @type {Callback[]} */ + this._rangeCallbacks = []; + } + + /** + * @param {number} start range start + * @param {number} end range end + * @param {Callback} callback callback + * @returns {void} + */ + range(start, end, callback) { + if (start === end) return callback(1); + this._rangePoints.push(start); + this._rangePoints.push(end); + this._rangeCallbacks.push(callback); + } + + calculate() { + const segments = Array.from(new Set(this._rangePoints)).sort((a, b) => + a < b ? -1 : 1 + ); + const parallelism = segments.map(() => 0); + const rangeStartIndices = []; + for (let i = 0; i < this._rangePoints.length; i += 2) { + const start = this._rangePoints[i]; + const end = this._rangePoints[i + 1]; + let idx = binarySearchBounds.eq(segments, start); + rangeStartIndices.push(idx); + do { + parallelism[idx]++; + idx++; + } while (segments[idx] < end); + } + for (let i = 0; i < this._rangeCallbacks.length; i++) { + const start = this._rangePoints[i * 2]; + const end = this._rangePoints[i * 2 + 1]; + let idx = rangeStartIndices[i]; + let sum = 0; + let totalDuration = 0; + let current = start; + do { + const p = parallelism[idx]; + idx++; + const duration = segments[idx] - current; + totalDuration += duration; + current = segments[idx]; + sum += p * duration; + } while (current < end); + this._rangeCallbacks[i](sum / totalDuration); + } + } +} + +module.exports = ParallelismFactorCalculator; diff --git a/lib/util/Queue.js b/lib/util/Queue.js index 6615e9f7759..3820770655a 100644 --- a/lib/util/Queue.js +++ b/lib/util/Queue.js @@ -1,3 +1,8 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + "use strict"; /** @@ -8,10 +13,11 @@ class Queue { * @param {Iterable=} items The initial elements. */ constructor(items) { - /** @private @type {Set} */ - this.set = new Set(items); - /** @private @type {Iterator} */ - this.iterator = this.set[Symbol.iterator](); + /** + * @private + * @type {Set} + */ + this._set = new Set(items); } /** @@ -19,7 +25,7 @@ class Queue { * @returns {number} The number of elements in this queue. */ get length() { - return this.set.size; + return this._set.size; } /** @@ -28,7 +34,7 @@ class Queue { * @returns {void} */ enqueue(item) { - this.set.add(item); + this._set.add(item); } /** @@ -36,9 +42,9 @@ class Queue { * @returns {T | undefined} The head of the queue of `undefined` if this queue is empty. */ dequeue() { - const result = this.iterator.next(); - if (result.done) return undefined; - this.set.delete(result.value); + const result = this._set[Symbol.iterator]().next(); + if (result.done) return; + this._set.delete(result.value); return result.value; } } diff --git a/lib/util/Semaphore.js b/lib/util/Semaphore.js index d6c876651eb..66b9ad938e0 100644 --- a/lib/util/Semaphore.js +++ b/lib/util/Semaphore.js @@ -2,25 +2,25 @@ MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ + "use strict"; class Semaphore { /** * Creates an instance of Semaphore. - * * @param {number} available the amount available number of "tasks" * in the Semaphore */ constructor(available) { this.available = available; - /** @type {(function(): void)[]} */ + /** @type {(() => void)[]} */ this.waiters = []; /** @private */ this._continue = this._continue.bind(this); } /** - * @param {function(): void} callback function block to capture and run + * @param {() => void} callback function block to capture and run * @returns {void} */ acquire(callback) { @@ -40,12 +40,10 @@ class Semaphore { } _continue() { - if (this.available > 0) { - if (this.waiters.length > 0) { - this.available--; - const callback = this.waiters.pop(); - callback(); - } + if (this.available > 0 && this.waiters.length > 0) { + this.available--; + const callback = /** @type {(() => void)} */ (this.waiters.pop()); + callback(); } } } diff --git a/lib/util/SetHelpers.js b/lib/util/SetHelpers.js index 96c063c7edc..5876f1cb709 100644 --- a/lib/util/SetHelpers.js +++ b/lib/util/SetHelpers.js @@ -1,9 +1,15 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + "use strict"; /** * intersect creates Set containing the intersection of elements between all sets - * @param {Set[]} sets an array of sets being checked for shared elements - * @returns {Set} returns a new Set containing the intersecting items + * @template T + * @param {Set[]} sets an array of sets being checked for shared elements + * @returns {Set} returns a new Set containing the intersecting items */ const intersect = sets => { if (sets.length === 0) return new Set(); @@ -32,8 +38,9 @@ const intersect = sets => { /** * Checks if a set is the subset of another set - * @param {Set} bigSet a Set which contains the original elements to compare against - * @param {Set} smallSet the set whos elements might be contained inside of bigSet + * @template T + * @param {Set} bigSet a Set which contains the original elements to compare against + * @param {Set} smallSet the set whose elements might be contained inside of bigSet * @returns {boolean} returns true if smallSet contains all elements inside of the bigSet */ const isSubset = (bigSet, smallSet) => { @@ -44,5 +51,44 @@ const isSubset = (bigSet, smallSet) => { return true; }; -exports.intersect = intersect; -exports.isSubset = isSubset; +/** + * @template T + * @param {Set} set a set + * @param {(set: T) => boolean} fn selector function + * @returns {T | undefined} found item + */ +const find = (set, fn) => { + for (const item of set) { + if (fn(item)) return item; + } +}; + +/** + * @template T + * @param {Set | ReadonlySet} set a set + * @returns {T | undefined} first item + */ +const first = set => { + const entry = set.values().next(); + return entry.done ? undefined : entry.value; +}; + +/** + * @template T + * @param {Set} a first + * @param {Set} b second + * @returns {Set} combined set, may be identical to a or b + */ +const combine = (a, b) => { + if (b.size === 0) return a; + if (a.size === 0) return b; + const set = new Set(a); + for (const item of b) set.add(item); + return set; +}; + +module.exports.intersect = intersect; +module.exports.isSubset = isSubset; +module.exports.find = find; +module.exports.first = first; +module.exports.combine = combine; diff --git a/lib/util/SortableSet.js b/lib/util/SortableSet.js index 44b692f37ca..a8a5a0b6aae 100644 --- a/lib/util/SortableSet.js +++ b/lib/util/SortableSet.js @@ -1,5 +1,12 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + "use strict"; +const NONE = Symbol("not sorted"); + /** * A subset of Set that offers sorting functionality * @template T item type in set @@ -8,19 +15,34 @@ class SortableSet extends Set { /** * Create a new sortable set + * @template T + * @typedef {(a: T, b: T) => number} SortFunction * @param {Iterable=} initialIterable The initial iterable value - * @typedef {function(T, T): number} SortFunction - * @param {SortFunction=} defaultSort Default sorting function + * @param {SortFunction=} defaultSort Default sorting function */ constructor(initialIterable, defaultSort) { super(initialIterable); - /** @private @type {function(T, T): number}} */ + /** + * @private + * @type {undefined | SortFunction} + */ this._sortFn = defaultSort; - /** @private @type {function(T, T): number} | null} */ - this._lastActiveSortFn = null; - /** @private @type {Map | undefined} */ + /** + * @private + * @type {typeof NONE | undefined | ((a: T, b: T) => number)}} + */ + this._lastActiveSortFn = NONE; + /** + * @private + * @template R + * @type {Map<(set: SortableSet) => EXPECTED_ANY, EXPECTED_ANY> | undefined} + */ this._cache = undefined; - /** @private @type {Map | undefined} */ + /** + * @private + * @template R + * @type {Map<(set: SortableSet) => EXPECTED_ANY, EXPECTED_ANY> | undefined} + */ this._cacheOrderIndependent = undefined; } @@ -29,7 +51,7 @@ class SortableSet extends Set { * @returns {this} returns itself */ add(value) { - this._lastActiveSortFn = null; + this._lastActiveSortFn = NONE; this._invalidateCache(); this._invalidateOrderedCache(); super.add(value); @@ -57,7 +79,7 @@ class SortableSet extends Set { /** * Sort with a comparer function - * @param {SortFunction} sortFn Sorting comparer function + * @param {SortFunction | undefined} sortFn Sorting comparer function * @returns {void} */ sortWith(sortFn) { @@ -77,18 +99,21 @@ class SortableSet extends Set { sort() { this.sortWith(this._sortFn); + return this; } /** * Get data from cache - * @param {function(SortableSet): T[]} fn function to calculate value - * @returns {T[]} returns result of fn(this), cached until set changes + * @template {EXPECTED_ANY} R + * @param {(set: SortableSet) => R} fn function to calculate value + * @returns {R} returns result of fn(this), cached until set changes */ getFromCache(fn) { if (this._cache === undefined) { this._cache = new Map(); } else { - const data = this._cache.get(fn); + const result = this._cache.get(fn); + const data = /** @type {R} */ (result); if (data !== undefined) { return data; } @@ -99,14 +124,17 @@ class SortableSet extends Set { } /** - * @param {function(SortableSet): string|number|T[]} fn function to calculate value - * @returns {any} returns result of fn(this), cached until set changes + * Get data from cache (ignoring sorting) + * @template R + * @param {(set: SortableSet) => R} fn function to calculate value + * @returns {R} returns result of fn(this), cached until set changes */ getFromUnorderedCache(fn) { if (this._cacheOrderIndependent === undefined) { this._cacheOrderIndependent = new Map(); } else { - const data = this._cacheOrderIndependent.get(fn); + const result = this._cacheOrderIndependent.get(fn); + const data = /** @type {R} */ (result); if (data !== undefined) { return data; } @@ -135,6 +163,13 @@ class SortableSet extends Set { this._cacheOrderIndependent.clear(); } } + + /** + * @returns {T[]} the raw array + */ + toJSON() { + return Array.from(this); + } } module.exports = SortableSet; diff --git a/lib/util/StackedCacheMap.js b/lib/util/StackedCacheMap.js new file mode 100644 index 00000000000..820f0d1b3d8 --- /dev/null +++ b/lib/util/StackedCacheMap.js @@ -0,0 +1,140 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +/** + * The StackedCacheMap is a data structure designed as an alternative to a Map + * in situations where you need to handle multiple item additions and + * frequently access the largest map. + * + * It is particularly optimized for efficiently adding multiple items + * at once, which can be achieved using the `addAll` method. + * + * It has a fallback Map that is used when the map to be added is mutable. + * + * Note: `delete` and `has` are not supported for performance reasons. + * @example + * ```js + * const map = new StackedCacheMap(); + * map.addAll(new Map([["a", 1], ["b", 2]]), true); + * map.addAll(new Map([["c", 3], ["d", 4]]), true); + * map.get("a"); // 1 + * map.get("d"); // 4 + * for (const [key, value] of map) { + * console.log(key, value); + * } + * ``` + * @template K + * @template V + */ +class StackedCacheMap { + constructor() { + /** @type {Map} */ + this.map = new Map(); + /** @type {ReadonlyMap[]} */ + this.stack = []; + } + + /** + * If `immutable` is true, the map can be referenced by the StackedCacheMap + * and should not be changed afterwards. If the map is mutable, all items + * are copied into a fallback Map. + * @param {ReadonlyMap} map map to add + * @param {boolean=} immutable if 'map' is immutable and StackedCacheMap can keep referencing it + */ + addAll(map, immutable) { + if (immutable) { + this.stack.push(map); + + // largest map should go first + for (let i = this.stack.length - 1; i > 0; i--) { + const beforeLast = this.stack[i - 1]; + if (beforeLast.size >= map.size) break; + this.stack[i] = beforeLast; + this.stack[i - 1] = map; + } + } else { + for (const [key, value] of map) { + this.map.set(key, value); + } + } + } + + /** + * @param {K} item the key of the element to add + * @param {V} value the value of the element to add + * @returns {void} + */ + set(item, value) { + this.map.set(item, value); + } + + /** + * @param {K} item the item to delete + * @returns {void} + */ + delete(item) { + throw new Error("Items can't be deleted from a StackedCacheMap"); + } + + /** + * @param {K} item the item to test + * @returns {boolean} true if the item exists in this set + */ + has(item) { + throw new Error( + "Checking StackedCacheMap.has before reading is inefficient, use StackedCacheMap.get and check for undefined" + ); + } + + /** + * @param {K} item the key of the element to return + * @returns {V | undefined} the value of the element + */ + get(item) { + for (const map of this.stack) { + const value = map.get(item); + if (value !== undefined) return value; + } + return this.map.get(item); + } + + clear() { + this.stack.length = 0; + this.map.clear(); + } + + /** + * @returns {number} size of the map + */ + get size() { + let size = this.map.size; + for (const map of this.stack) { + size += map.size; + } + return size; + } + + /** + * @returns {Iterator<[K, V]>} iterator + */ + [Symbol.iterator]() { + const iterators = this.stack.map(map => map[Symbol.iterator]()); + let current = this.map[Symbol.iterator](); + return { + next() { + let result = current.next(); + while (result.done && iterators.length > 0) { + current = /** @type {IterableIterator<[K, V]>} */ (iterators.pop()); + result = current.next(); + } + return result; + } + }; + } +} + +module.exports = StackedCacheMap; diff --git a/lib/util/StackedMap.js b/lib/util/StackedMap.js new file mode 100644 index 00000000000..0f4011d0ce7 --- /dev/null +++ b/lib/util/StackedMap.js @@ -0,0 +1,164 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const TOMBSTONE = Symbol("tombstone"); +const UNDEFINED_MARKER = Symbol("undefined"); + +/** + * @template T + * @typedef {T | undefined} Cell + */ + +/** + * @template T + * @typedef {T | typeof TOMBSTONE | typeof UNDEFINED_MARKER} InternalCell + */ + +/** + * @template K + * @template V + * @param {[K, InternalCell]} pair the internal cell + * @returns {[K, Cell]} its “safe” representation + */ +const extractPair = pair => { + const key = pair[0]; + const val = pair[1]; + if (val === UNDEFINED_MARKER || val === TOMBSTONE) { + return [key, undefined]; + } + return /** @type {[K, Cell]} */ (pair); +}; + +/** + * @template K + * @template V + */ +class StackedMap { + /** + * @param {Map>[]=} parentStack an optional parent + */ + constructor(parentStack) { + /** @type {Map>} */ + this.map = new Map(); + /** @type {Map>[]} */ + this.stack = parentStack === undefined ? [] : parentStack.slice(); + this.stack.push(this.map); + } + + /** + * @param {K} item the key of the element to add + * @param {V} value the value of the element to add + * @returns {void} + */ + set(item, value) { + this.map.set(item, value === undefined ? UNDEFINED_MARKER : value); + } + + /** + * @param {K} item the item to delete + * @returns {void} + */ + delete(item) { + if (this.stack.length > 1) { + this.map.set(item, TOMBSTONE); + } else { + this.map.delete(item); + } + } + + /** + * @param {K} item the item to test + * @returns {boolean} true if the item exists in this set + */ + has(item) { + const topValue = this.map.get(item); + if (topValue !== undefined) { + return topValue !== TOMBSTONE; + } + if (this.stack.length > 1) { + for (let i = this.stack.length - 2; i >= 0; i--) { + const value = this.stack[i].get(item); + if (value !== undefined) { + this.map.set(item, value); + return value !== TOMBSTONE; + } + } + this.map.set(item, TOMBSTONE); + } + return false; + } + + /** + * @param {K} item the key of the element to return + * @returns {Cell} the value of the element + */ + get(item) { + const topValue = this.map.get(item); + if (topValue !== undefined) { + return topValue === TOMBSTONE || topValue === UNDEFINED_MARKER + ? undefined + : topValue; + } + if (this.stack.length > 1) { + for (let i = this.stack.length - 2; i >= 0; i--) { + const value = this.stack[i].get(item); + if (value !== undefined) { + this.map.set(item, value); + return value === TOMBSTONE || value === UNDEFINED_MARKER + ? undefined + : value; + } + } + this.map.set(item, TOMBSTONE); + } + } + + _compress() { + if (this.stack.length === 1) return; + this.map = new Map(); + for (const data of this.stack) { + for (const pair of data) { + if (pair[1] === TOMBSTONE) { + this.map.delete(pair[0]); + } else { + this.map.set(pair[0], pair[1]); + } + } + } + this.stack = [this.map]; + } + + asArray() { + this._compress(); + return Array.from(this.map.keys()); + } + + asSet() { + this._compress(); + return new Set(this.map.keys()); + } + + asPairArray() { + this._compress(); + return Array.from(this.map.entries(), extractPair); + } + + asMap() { + return new Map(this.asPairArray()); + } + + get size() { + this._compress(); + return this.map.size; + } + + createChild() { + return new StackedMap(this.stack); + } +} + +module.exports = StackedMap; diff --git a/lib/util/StackedSetMap.js b/lib/util/StackedSetMap.js deleted file mode 100644 index fcf628b0deb..00000000000 --- a/lib/util/StackedSetMap.js +++ /dev/null @@ -1,144 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -"use strict"; - -const util = require("util"); - -const TOMBSTONE = {}; -const UNDEFINED_MARKER = {}; - -class StackedSetMap { - constructor(parentStack) { - this.stack = parentStack === undefined ? [] : parentStack.slice(); - this.map = new Map(); - this.stack.push(this.map); - } - - add(item) { - this.map.set(item, true); - } - - set(item, value) { - this.map.set(item, value === undefined ? UNDEFINED_MARKER : value); - } - - delete(item) { - if (this.stack.length > 1) { - this.map.set(item, TOMBSTONE); - } else { - this.map.delete(item); - } - } - - has(item) { - const topValue = this.map.get(item); - if (topValue !== undefined) return topValue !== TOMBSTONE; - if (this.stack.length > 1) { - for (var i = this.stack.length - 2; i >= 0; i--) { - const value = this.stack[i].get(item); - if (value !== undefined) { - this.map.set(item, value); - return value !== TOMBSTONE; - } - } - this.map.set(item, TOMBSTONE); - } - return false; - } - - get(item) { - const topValue = this.map.get(item); - if (topValue !== undefined) { - return topValue === TOMBSTONE || topValue === UNDEFINED_MARKER - ? undefined - : topValue; - } - if (this.stack.length > 1) { - for (var i = this.stack.length - 2; i >= 0; i--) { - const value = this.stack[i].get(item); - if (value !== undefined) { - this.map.set(item, value); - return value === TOMBSTONE || value === UNDEFINED_MARKER - ? undefined - : value; - } - } - this.map.set(item, TOMBSTONE); - } - return undefined; - } - - _compress() { - if (this.stack.length === 1) return; - this.map = new Map(); - for (const data of this.stack) { - for (const pair of data) { - if (pair[1] === TOMBSTONE) { - this.map.delete(pair[0]); - } else { - this.map.set(pair[0], pair[1]); - } - } - } - this.stack = [this.map]; - } - - asArray() { - this._compress(); - return Array.from(this.map.entries(), pair => pair[0]); - } - - asSet() { - return new Set(this.asArray()); - } - - asPairArray() { - this._compress(); - return Array.from( - this.map.entries(), - pair => - /** @type {[TODO, TODO]} */ (pair[1] === UNDEFINED_MARKER - ? [pair[0], undefined] - : pair) - ); - } - - asMap() { - return new Map(this.asPairArray()); - } - - get size() { - this._compress(); - return this.map.size; - } - - createChild() { - return new StackedSetMap(this.stack); - } - - get length() { - throw new Error("This is no longer an Array"); - } - - set length(value) { - throw new Error("This is no longer an Array"); - } -} - -// TODO remove in webpack 5 -StackedSetMap.prototype.push = util.deprecate( - /** - * @deprecated - * @this {StackedSetMap} - * @param {any} item Item to add - * @returns {void} - */ - function(item) { - this.add(item); - }, - "This is no longer an Array: Use add instead." -); - -module.exports = StackedSetMap; diff --git a/lib/util/StringXor.js b/lib/util/StringXor.js new file mode 100644 index 00000000000..ea5c8f83544 --- /dev/null +++ b/lib/util/StringXor.js @@ -0,0 +1,101 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +/** @typedef {import("../util/Hash")} Hash */ + +/** + * StringXor class provides methods for performing + * [XOR operations](https://en.wikipedia.org/wiki/Exclusive_or) on strings. In this context + * we operating on the character codes of two strings, which are represented as + * [Buffer](https://nodejs.org/api/buffer.html) objects. + * + * We use [StringXor in webpack](https://github.com/webpack/webpack/commit/41a8e2ea483a544c4ccd3e6217bdfb80daffca39) + * to create a hash of the current state of the compilation. By XOR'ing the Module hashes, it + * doesn't matter if the Module hashes are sorted or not. This is useful because it allows us to avoid sorting the + * Module hashes. + * @example + * ```js + * const xor = new StringXor(); + * xor.add('hello'); + * xor.add('world'); + * console.log(xor.toString()); + * ``` + * @example + * ```js + * const xor = new StringXor(); + * xor.add('foo'); + * xor.add('bar'); + * const hash = createHash('sha256'); + * hash.update(xor.toString()); + * console.log(hash.digest('hex')); + * ``` + */ +class StringXor { + constructor() { + /** @type {Buffer|undefined} */ + this._value = undefined; + } + + /** + * Adds a string to the current StringXor object. + * @param {string} str string + * @returns {void} + */ + add(str) { + const len = str.length; + const value = this._value; + if (value === undefined) { + /** + * We are choosing to use Buffer.allocUnsafe() because it is often faster than Buffer.alloc() because + * it allocates a new buffer of the specified size without initializing the memory. + */ + const newValue = (this._value = Buffer.allocUnsafe(len)); + for (let i = 0; i < len; i++) { + newValue[i] = str.charCodeAt(i); + } + return; + } + const valueLen = value.length; + if (valueLen < len) { + const newValue = (this._value = Buffer.allocUnsafe(len)); + let i; + for (i = 0; i < valueLen; i++) { + newValue[i] = value[i] ^ str.charCodeAt(i); + } + for (; i < len; i++) { + newValue[i] = str.charCodeAt(i); + } + } else { + for (let i = 0; i < len; i++) { + value[i] = value[i] ^ str.charCodeAt(i); + } + } + } + + /** + * Returns a string that represents the current state of the StringXor object. We chose to use "latin1" encoding + * here because "latin1" encoding is a single-byte encoding that can represent all characters in the + * [ISO-8859-1 character set](https://en.wikipedia.org/wiki/ISO/IEC_8859-1). This is useful when working + * with binary data that needs to be represented as a string. + * @returns {string} Returns a string that represents the current state of the StringXor object. + */ + toString() { + const value = this._value; + return value === undefined ? "" : value.toString("latin1"); + } + + /** + * Updates the hash with the current state of the StringXor object. + * @param {Hash} hash Hash instance + */ + updateHash(hash) { + const value = this._value; + if (value !== undefined) hash.update(value); + } +} + +module.exports = StringXor; diff --git a/lib/util/TrackingSet.js b/lib/util/TrackingSet.js deleted file mode 100644 index b52a4409ed4..00000000000 --- a/lib/util/TrackingSet.js +++ /dev/null @@ -1,35 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -"use strict"; - -module.exports = class TrackingSet { - constructor(set) { - this.set = set; - this.set2 = new Set(); - this.stack = set.stack; - } - - add(item) { - this.set2.add(item); - return this.set.add(item); - } - - delete(item) { - this.set2.delete(item); - return this.set.delete(item); - } - - has(item) { - return this.set.has(item); - } - - createChild() { - return this.set.createChild(); - } - - getAddedItems() { - return this.set2; - } -}; diff --git a/lib/util/TupleQueue.js b/lib/util/TupleQueue.js new file mode 100644 index 00000000000..e446582a370 --- /dev/null +++ b/lib/util/TupleQueue.js @@ -0,0 +1,70 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const TupleSet = require("./TupleSet"); + +/** + * @template T + * @template V + */ +class TupleQueue { + /** + * @param {Iterable<[T, V, ...EXPECTED_ANY]>=} items The initial elements. + */ + constructor(items) { + /** + * @private + * @type {TupleSet} + */ + this._set = new TupleSet(items); + /** + * @private + * @type {Iterator<[T, V, ...EXPECTED_ANY]>} + */ + this._iterator = this._set[Symbol.iterator](); + } + + /** + * Returns the number of elements in this queue. + * @returns {number} The number of elements in this queue. + */ + get length() { + return this._set.size; + } + + /** + * Appends the specified element to this queue. + * @param {[T, V, ...EXPECTED_ANY]} item The element to add. + * @returns {void} + */ + enqueue(...item) { + this._set.add(...item); + } + + /** + * Retrieves and removes the head of this queue. + * @returns {[T, V, ...EXPECTED_ANY] | undefined} The head of the queue of `undefined` if this queue is empty. + */ + dequeue() { + const result = this._iterator.next(); + if (result.done) { + if (this._set.size > 0) { + this._iterator = this._set[Symbol.iterator](); + const value = + /** @type {[T, V, ...EXPECTED_ANY]} */ + (this._iterator.next().value); + this._set.delete(...value); + return value; + } + return; + } + this._set.delete(.../** @type {[T, V, ...EXPECTED_ANY]} */ (result.value)); + return result.value; + } +} + +module.exports = TupleQueue; diff --git a/lib/util/TupleSet.js b/lib/util/TupleSet.js new file mode 100644 index 00000000000..c5e12868ff4 --- /dev/null +++ b/lib/util/TupleSet.js @@ -0,0 +1,179 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +/** + * @template K + * @template V + * @typedef {Map | Set>} InnerMap + */ + +/** + * @template T + * @template V + */ +class TupleSet { + /** + * @param {Iterable<[T, V, ...EXPECTED_ANY]>=} init init + */ + constructor(init) { + /** @type {InnerMap} */ + this._map = new Map(); + this.size = 0; + if (init) { + for (const tuple of init) { + this.add(...tuple); + } + } + } + + /** + * @param {[T, V, ...EXPECTED_ANY]} args tuple + * @returns {void} + */ + add(...args) { + let map = this._map; + for (let i = 0; i < args.length - 2; i++) { + const arg = args[i]; + const innerMap = map.get(arg); + if (innerMap === undefined) { + map.set(arg, (map = new Map())); + } else { + map = /** @type {InnerMap} */ (innerMap); + } + } + + const beforeLast = args[args.length - 2]; + let set = /** @type {Set} */ (map.get(beforeLast)); + if (set === undefined) { + map.set(beforeLast, (set = new Set())); + } + + const last = args[args.length - 1]; + this.size -= set.size; + set.add(last); + this.size += set.size; + } + + /** + * @param {[T, V, ...EXPECTED_ANY]} args tuple + * @returns {boolean} true, if the tuple is in the Set + */ + has(...args) { + let map = this._map; + for (let i = 0; i < args.length - 2; i++) { + const arg = args[i]; + map = /** @type {InnerMap} */ (map.get(arg)); + if (map === undefined) { + return false; + } + } + + const beforeLast = args[args.length - 2]; + const set = map.get(beforeLast); + if (set === undefined) { + return false; + } + + const last = args[args.length - 1]; + return set.has(last); + } + + /** + * @param {[T, V, ...EXPECTED_ANY]} args tuple + * @returns {void} + */ + delete(...args) { + let map = this._map; + for (let i = 0; i < args.length - 2; i++) { + const arg = args[i]; + map = /** @type {InnerMap} */ (map.get(arg)); + if (map === undefined) { + return; + } + } + + const beforeLast = args[args.length - 2]; + const set = map.get(beforeLast); + if (set === undefined) { + return; + } + + const last = args[args.length - 1]; + this.size -= set.size; + set.delete(last); + this.size += set.size; + } + + /** + * @returns {Iterator<[T, V, ...EXPECTED_ANY]>} iterator + */ + [Symbol.iterator]() { + // This is difficult to type because we can have a map inside a map inside a map, etc. where the end is a set (each key is an argument) + // But in basic use we only have 2 arguments in our methods, so we have `Map>` + /** @type {MapIterator<[T, InnerMap | Set]>[]} */ + const iteratorStack = []; + /** @type {[T?, V?, ...EXPECTED_ANY]} */ + const tuple = []; + /** @type {SetIterator | undefined} */ + let currentSetIterator; + + /** + * @param {MapIterator<[T, InnerMap | Set]>} it iterator + * @returns {boolean} result + */ + const next = it => { + const result = it.next(); + if (result.done) { + if (iteratorStack.length === 0) return false; + tuple.pop(); + return next( + /** @type {MapIterator<[T, InnerMap | Set]>} */ + (iteratorStack.pop()) + ); + } + const [key, value] = result.value; + iteratorStack.push(it); + tuple.push(key); + if (value instanceof Set) { + currentSetIterator = value[Symbol.iterator](); + return true; + } + return next(value[Symbol.iterator]()); + }; + + next(this._map[Symbol.iterator]()); + + return { + next() { + while (currentSetIterator) { + const result = currentSetIterator.next(); + if (result.done) { + tuple.pop(); + if ( + !next( + /** @type {MapIterator<[T, InnerMap | Set]>} */ + (iteratorStack.pop()) + ) + ) { + currentSetIterator = undefined; + } + } else { + return { + done: false, + value: + /** @type {[T, V, ...EXPECTED_ANY]} */ + (tuple.concat(result.value)) + }; + } + } + return { done: true, value: undefined }; + } + }; + } +} + +module.exports = TupleSet; diff --git a/lib/util/URLAbsoluteSpecifier.js b/lib/util/URLAbsoluteSpecifier.js new file mode 100644 index 00000000000..f5cec7e4be0 --- /dev/null +++ b/lib/util/URLAbsoluteSpecifier.js @@ -0,0 +1,87 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Ivan Kopeykin @vankop +*/ + +"use strict"; + +/** @typedef {import("./fs").InputFileSystem} InputFileSystem */ +/** @typedef {(error: Error|null, result?: Buffer) => void} ErrorFirstCallback */ + +const backSlashCharCode = "\\".charCodeAt(0); +const slashCharCode = "/".charCodeAt(0); +const aLowerCaseCharCode = "a".charCodeAt(0); +const zLowerCaseCharCode = "z".charCodeAt(0); +const aUpperCaseCharCode = "A".charCodeAt(0); +const zUpperCaseCharCode = "Z".charCodeAt(0); +const _0CharCode = "0".charCodeAt(0); +const _9CharCode = "9".charCodeAt(0); +const plusCharCode = "+".charCodeAt(0); +const hyphenCharCode = "-".charCodeAt(0); +const colonCharCode = ":".charCodeAt(0); +const hashCharCode = "#".charCodeAt(0); +const queryCharCode = "?".charCodeAt(0); +/** + * Get scheme if specifier is an absolute URL specifier + * e.g. Absolute specifiers like 'file:///user/webpack/index.js' + * https://tools.ietf.org/html/rfc3986#section-3.1 + * @param {string} specifier specifier + * @returns {string|undefined} scheme if absolute URL specifier provided + */ +function getScheme(specifier) { + const start = specifier.charCodeAt(0); + + // First char maybe only a letter + if ( + (start < aLowerCaseCharCode || start > zLowerCaseCharCode) && + (start < aUpperCaseCharCode || start > zUpperCaseCharCode) + ) { + return; + } + + let i = 1; + let ch = specifier.charCodeAt(i); + + while ( + (ch >= aLowerCaseCharCode && ch <= zLowerCaseCharCode) || + (ch >= aUpperCaseCharCode && ch <= zUpperCaseCharCode) || + (ch >= _0CharCode && ch <= _9CharCode) || + ch === plusCharCode || + ch === hyphenCharCode + ) { + if (++i === specifier.length) return; + ch = specifier.charCodeAt(i); + } + + // Scheme must end with colon + if (ch !== colonCharCode) return; + + // Check for Windows absolute path + // https://url.spec.whatwg.org/#url-miscellaneous + if (i === 1) { + const nextChar = i + 1 < specifier.length ? specifier.charCodeAt(i + 1) : 0; + if ( + nextChar === 0 || + nextChar === backSlashCharCode || + nextChar === slashCharCode || + nextChar === hashCharCode || + nextChar === queryCharCode + ) { + return; + } + } + + return specifier.slice(0, i).toLowerCase(); +} + +/** + * @param {string} specifier specifier + * @returns {string | null | undefined} protocol if absolute URL specifier provided + */ +function getProtocol(specifier) { + const scheme = getScheme(specifier); + return scheme === undefined ? undefined : `${scheme}:`; +} + +module.exports.getScheme = getScheme; +module.exports.getProtocol = getProtocol; diff --git a/lib/util/WeakTupleMap.js b/lib/util/WeakTupleMap.js new file mode 100644 index 00000000000..5e0068f982e --- /dev/null +++ b/lib/util/WeakTupleMap.js @@ -0,0 +1,227 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +/** + * @template {EXPECTED_ANY[]} T + * @template V + * @typedef {Map>} M + */ + +/** + * @template {EXPECTED_ANY[]} T + * @template V + * @typedef {WeakMap>} W + */ + +/** + * @param {EXPECTED_ANY} thing thing + * @returns {boolean} true if is weak + */ +const isWeakKey = thing => typeof thing === "object" && thing !== null; + +/** + * @template {unknown[]} T + * @typedef {T extends readonly (infer ElementType)[] ? ElementType : never} ArrayElement + */ + +/** + * @template {EXPECTED_ANY[]} K + * @template V + */ +class WeakTupleMap { + constructor() { + /** @private */ + this.f = 0; + /** + * @private + * @type {V | undefined} + */ + this.v = undefined; + /** + * @private + * @type {M | undefined} + */ + this.m = undefined; + /** + * @private + * @type {W | undefined} + */ + this.w = undefined; + } + + /** + * @param {[...K, V]} args tuple + * @returns {void} + */ + set(...args) { + /** @type {WeakTupleMap} */ + let node = this; + for (let i = 0; i < args.length - 1; i++) { + node = node._get(/** @type {ArrayElement} */ (args[i])); + } + node._setValue(/** @type {V} */ (args[args.length - 1])); + } + + /** + * @param {K} args tuple + * @returns {boolean} true, if the tuple is in the Set + */ + has(...args) { + /** @type {WeakTupleMap | undefined} */ + let node = this; + for (let i = 0; i < args.length; i++) { + node = node._peek(/** @type {ArrayElement} */ (args[i])); + if (node === undefined) return false; + } + return node._hasValue(); + } + + /** + * @param {K} args tuple + * @returns {V | undefined} the value + */ + get(...args) { + /** @type {WeakTupleMap | undefined} */ + let node = this; + for (let i = 0; i < args.length; i++) { + node = node._peek(/** @type {ArrayElement} */ (args[i])); + if (node === undefined) return; + } + return node._getValue(); + } + + /** + * @param {[...K, (...args: K) => V]} args tuple + * @returns {V} the value + */ + provide(...args) { + /** @type {WeakTupleMap} */ + let node = this; + for (let i = 0; i < args.length - 1; i++) { + node = node._get(/** @type {ArrayElement} */ (args[i])); + } + if (node._hasValue()) return /** @type {V} */ (node._getValue()); + const fn = /** @type {(...args: K) => V} */ (args[args.length - 1]); + const newValue = fn(.../** @type {K} */ (args.slice(0, -1))); + node._setValue(newValue); + return newValue; + } + + /** + * @param {K} args tuple + * @returns {void} + */ + delete(...args) { + /** @type {WeakTupleMap | undefined} */ + let node = this; + for (let i = 0; i < args.length; i++) { + node = node._peek(/** @type {ArrayElement} */ (args[i])); + if (node === undefined) return; + } + node._deleteValue(); + } + + /** + * @returns {void} + */ + clear() { + this.f = 0; + this.v = undefined; + this.w = undefined; + this.m = undefined; + } + + _getValue() { + return this.v; + } + + _hasValue() { + return (this.f & 1) === 1; + } + + /** + * @param {V} v value + * @private + */ + _setValue(v) { + this.f |= 1; + this.v = v; + } + + _deleteValue() { + this.f &= 6; + this.v = undefined; + } + + /** + * @param {ArrayElement} thing thing + * @returns {WeakTupleMap | undefined} thing + * @private + */ + _peek(thing) { + if (isWeakKey(thing)) { + if ((this.f & 4) !== 4) return; + return /** @type {WeakMap, WeakTupleMap>} */ ( + this.w + ).get(thing); + } + if ((this.f & 2) !== 2) return; + return /** @type {Map, WeakTupleMap>} */ (this.m).get( + thing + ); + } + + /** + * @private + * @param {ArrayElement} thing thing + * @returns {WeakTupleMap} value + */ + _get(thing) { + if (isWeakKey(thing)) { + if ((this.f & 4) !== 4) { + /** @type {W} */ + const newMap = new WeakMap(); + this.f |= 4; + /** @type {WeakTupleMap} */ + const newNode = new WeakTupleMap(); + (this.w = newMap).set(thing, newNode); + return newNode; + } + const entry = /** @type {W} */ (this.w).get(thing); + if (entry !== undefined) { + return entry; + } + /** @type {WeakTupleMap} */ + const newNode = new WeakTupleMap(); + /** @type {W} */ + (this.w).set(thing, newNode); + return newNode; + } + if ((this.f & 2) !== 2) { + /** @type {M} */ + const newMap = new Map(); + this.f |= 2; + /** @type {WeakTupleMap} */ + const newNode = new WeakTupleMap(); + (this.m = newMap).set(thing, newNode); + return newNode; + } + const entry = + /** @type {M} */ + (this.m).get(thing); + if (entry !== undefined) { + return entry; + } + /** @type {WeakTupleMap} */ + const newNode = new WeakTupleMap(); + /** @type {M} */ + (this.m).set(thing, newNode); + return newNode; + } +} + +module.exports = WeakTupleMap; diff --git a/lib/util/binarySearchBounds.js b/lib/util/binarySearchBounds.js new file mode 100644 index 00000000000..040e9bcfc29 --- /dev/null +++ b/lib/util/binarySearchBounds.js @@ -0,0 +1,129 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Mikola Lysenko @mikolalysenko +*/ + +"use strict"; + +/* cspell:disable-next-line */ +// Refactor: Peter Somogyvari @petermetz + +/** @typedef {">=" | "<=" | "<" | ">" | "-" } BinarySearchPredicate */ +/** @typedef {"GE" | "GT" | "LT" | "LE" | "EQ" } SearchPredicateSuffix */ + +/** + * Helper function for compiling binary search functions. + * + * The generated code uses a while loop to repeatedly divide the search interval + * in half until the desired element is found, or the search interval is empty. + * + * The following is an example of a generated function for calling `compileSearch("P", "c(x,y)<=0", true, ["y", "c"], false)`: + * + * ```js + * function P(a,l,h,y,c){var i=l-1;while(l<=h){var m=(l+h)>>>1,x=a[m];if(c(x,y)<=0){i=m;l=m+1}else{h=m-1}}return i}; + * ``` + * @param {string} funcName The name of the function to be compiled. + * @param {string} predicate The predicate / comparison operator to be used in the binary search. + * @param {boolean} reversed Whether the search should be reversed. + * @param {string[]} extraArgs Extra arguments to be passed to the function. + * @param {boolean=} earlyOut Whether the search should return as soon as a match is found. + * @returns {string} The compiled binary search function. + */ +const compileSearch = (funcName, predicate, reversed, extraArgs, earlyOut) => { + const code = [ + "function ", + funcName, + "(a,l,h,", + extraArgs.join(","), + "){", + earlyOut ? "" : "var i=", + reversed ? "l-1" : "h+1", + ";while(l<=h){var m=(l+h)>>>1,x=a[m]" + ]; + + if (earlyOut) { + if (!predicate.includes("c")) { + code.push(";if(x===y){return m}else if(x<=y){"); + } else { + code.push(";var p=c(x,y);if(p===0){return m}else if(p<=0){"); + } + } else { + code.push(";if(", predicate, "){i=m;"); + } + if (reversed) { + code.push("l=m+1}else{h=m-1}"); + } else { + code.push("h=m-1}else{l=m+1}"); + } + code.push("}"); + if (earlyOut) { + code.push("return -1};"); + } else { + code.push("return i};"); + } + return code.join(""); +}; + +/** + * This helper functions generate code for two binary search functions: + * A(): Performs a binary search on an array using the comparison operator specified. + * P(): Performs a binary search on an array using a _custom comparison function_ + * `c(x,y)` **and** comparison operator specified by `predicate`. + * @template T + * @param {BinarySearchPredicate} predicate The predicate / comparison operator to be used in the binary search. + * @param {boolean} reversed Whether the search should be reversed. + * @param {SearchPredicateSuffix} suffix The suffix to be used in the function name. + * @param {boolean=} earlyOut Whether the search should return as soon as a match is found. + * @returns {(items: T[], start: number, compareFn?: number | ((item: T, needle: number) => number), l?: number, h?: number) => number} The compiled binary search function. + */ +const compileBoundsSearch = (predicate, reversed, suffix, earlyOut) => { + const arg1 = compileSearch("A", `x${predicate}y`, reversed, ["y"], earlyOut); + + const arg2 = compileSearch( + "P", + `c(x,y)${predicate}0`, + reversed, + ["y", "c"], + earlyOut + ); + + const fnHeader = "function dispatchBinarySearch"; + + const fnBody = + // eslint-disable-next-line no-multi-str + "(a,y,c,l,h){\ +if(typeof(c)==='function'){\ +return P(a,(l===void 0)?0:l|0,(h===void 0)?a.length-1:h|0,y,c)\ +}else{\ +return A(a,(c===void 0)?0:c|0,(l===void 0)?a.length-1:l|0,y)\ +}}\ +return dispatchBinarySearch"; + + const fnArgList = [arg1, arg2, fnHeader, suffix, fnBody, suffix]; + const fnSource = fnArgList.join(""); + // eslint-disable-next-line no-new-func + const result = new Function(fnSource); + return result(); +}; + +/** + * These functions are used to perform binary searches on arrays. + * @example + * ```js + * const { gt, le} = require("./binarySearchBounds"); + * const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; + * + * // Find the index of the first element greater than 5 + * const index1 = gt(arr, 5); // index1 === 3 + * + * // Find the index of the first element less than or equal to 5 + * const index2 = le(arr, 5); // index2 === 4 + * ``` + */ +module.exports = { + ge: compileBoundsSearch(">=", false, "GE"), + gt: compileBoundsSearch(">", false, "GT"), + lt: compileBoundsSearch("<", true, "LT"), + le: compileBoundsSearch("<=", true, "LE"), + eq: compileBoundsSearch("-", true, "EQ", true) +}; diff --git a/lib/util/cachedMerge.js b/lib/util/cachedMerge.js deleted file mode 100644 index 124f647a3f4..00000000000 --- a/lib/util/cachedMerge.js +++ /dev/null @@ -1,35 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -"use strict"; - -const mergeCache = new WeakMap(); - -/** - * Merges two given objects and caches the result to avoid computation if same objects passed as arguments again. - * @example - * // performs Object.assign(first, second), stores the result in WeakMap and returns result - * cachedMerge({a: 1}, {a: 2}) - * {a: 2} - * // when same arguments passed, gets the result from WeakMap and returns it. - * cachedMerge({a: 1}, {a: 2}) - * {a: 2} - * @param {object} first first object - * @param {object} second second object - * @returns {object} merged object of first and second object - */ -const cachedMerge = (first, second) => { - let innerCache = mergeCache.get(first); - if (innerCache === undefined) { - innerCache = new WeakMap(); - mergeCache.set(first, innerCache); - } - const prevMerge = innerCache.get(second); - if (prevMerge !== undefined) return prevMerge; - const newMerge = Object.assign({}, first, second); - innerCache.set(second, newMerge); - return newMerge; -}; - -module.exports = cachedMerge; diff --git a/lib/util/chainedImports.js b/lib/util/chainedImports.js new file mode 100644 index 00000000000..295233b7d1c --- /dev/null +++ b/lib/util/chainedImports.js @@ -0,0 +1,97 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +/** @typedef {import("../Dependency")} Dependency */ +/** @typedef {import("../Module")} Module */ +/** @typedef {import("../ModuleGraph")} ModuleGraph */ +/** @typedef {import("../javascript/JavascriptParser").Range} Range */ + +/** + * @summary Get the subset of ids and their corresponding range in an id chain that should be re-rendered by webpack. + * Only those in the chain that are actually referring to namespaces or imports should be re-rendered. + * Deeper member accessors on the imported object should not be re-rendered. If deeper member accessors are re-rendered, + * there is a potential loss of meaning with rendering a quoted accessor as an unquoted accessor, or vice versa, + * because minifiers treat quoted accessors differently. e.g. import { a } from "./module"; a["b"] vs a.b + * @param {string[]} untrimmedIds chained ids + * @param {Range} untrimmedRange range encompassing allIds + * @param {Range[] | undefined} ranges cumulative range of ids for each of allIds + * @param {ModuleGraph} moduleGraph moduleGraph + * @param {Dependency} dependency dependency + * @returns {{trimmedIds: string[], trimmedRange: Range}} computed trimmed ids and cumulative range of those ids + */ +module.exports.getTrimmedIdsAndRange = ( + untrimmedIds, + untrimmedRange, + ranges, + moduleGraph, + dependency +) => { + let trimmedIds = trimIdsToThoseImported( + untrimmedIds, + moduleGraph, + dependency + ); + let trimmedRange = untrimmedRange; + if (trimmedIds.length !== untrimmedIds.length) { + // The array returned from dep.idRanges is right-aligned with the array returned from dep.names. + // Meaning, the two arrays may not always have the same number of elements, but the last element of + // dep.idRanges corresponds to [the expression fragment to the left of] the last element of dep.names. + // Use this to find the correct replacement range based on the number of ids that were trimmed. + const idx = + ranges === undefined + ? -1 /* trigger failure case below */ + : ranges.length + (trimmedIds.length - untrimmedIds.length); + if (idx < 0 || idx >= /** @type {Range[]} */ (ranges).length) { + // cspell:ignore minifiers + // Should not happen but we can't throw an error here because of backward compatibility with + // external plugins in wp5. Instead, we just disable trimming for now. This may break some minifiers. + trimmedIds = untrimmedIds; + // TODO webpack 6 remove the "trimmedIds = ids" above and uncomment the following line instead. + // throw new Error("Missing range starts data for id replacement trimming."); + } else { + trimmedRange = /** @type {Range[]} */ (ranges)[idx]; + } + } + + return { trimmedIds, trimmedRange }; +}; + +/** + * @summary Determine which IDs in the id chain are actually referring to namespaces or imports, + * and which are deeper member accessors on the imported object. + * @param {string[]} ids untrimmed ids + * @param {ModuleGraph} moduleGraph moduleGraph + * @param {Dependency} dependency dependency + * @returns {string[]} trimmed ids + */ +function trimIdsToThoseImported(ids, moduleGraph, dependency) { + /** @type {string[]} */ + let trimmedIds = []; + let currentExportsInfo = moduleGraph.getExportsInfo( + /** @type {Module} */ (moduleGraph.getModule(dependency)) + ); + for (let i = 0; i < ids.length; i++) { + if (i === 0 && ids[i] === "default") { + continue; // ExportInfo for the next level under default is still at the root ExportsInfo, so don't advance currentExportsInfo + } + const exportInfo = currentExportsInfo.getExportInfo(ids[i]); + if (exportInfo.provided === false) { + // json imports have nested ExportInfo for elements that things that are not actually exported, so check .provided + trimmedIds = ids.slice(0, i); + break; + } + const nestedInfo = exportInfo.getNestedExportsInfo(); + if (!nestedInfo) { + // once all nested exports are traversed, the next item is the actual import so stop there + trimmedIds = ids.slice(0, i + 1); + break; + } + currentExportsInfo = nestedInfo; + } + // Never trim to nothing. This can happen for invalid imports (e.g. import { notThere } from "./module", or import { anything } from "./missingModule") + return trimmedIds.length ? trimmedIds : ids; +} diff --git a/lib/util/cleverMerge.js b/lib/util/cleverMerge.js new file mode 100644 index 00000000000..93fcdce88de --- /dev/null +++ b/lib/util/cleverMerge.js @@ -0,0 +1,637 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +/** @type {WeakMap>} */ +const mergeCache = new WeakMap(); +/** @type {WeakMap>>} */ +const setPropertyCache = new WeakMap(); +const DELETE = Symbol("DELETE"); +const DYNAMIC_INFO = Symbol("cleverMerge dynamic info"); + +/** + * Merges two given objects and caches the result to avoid computation if same objects passed as arguments again. + * @template T + * @template O + * @example + * // performs cleverMerge(first, second), stores the result in WeakMap and returns result + * cachedCleverMerge({a: 1}, {a: 2}) + * {a: 2} + * // when same arguments passed, gets the result from WeakMap and returns it. + * cachedCleverMerge({a: 1}, {a: 2}) + * {a: 2} + * @param {T | null | undefined} first first object + * @param {O | null | undefined} second second object + * @returns {T & O | T | O} merged object of first and second object + */ +const cachedCleverMerge = (first, second) => { + if (second === undefined) return /** @type {T} */ (first); + if (first === undefined) return /** @type {O} */ (second); + if (typeof second !== "object" || second === null) + return /** @type {O} */ (second); + if (typeof first !== "object" || first === null) + return /** @type {T} */ (first); + + let innerCache = mergeCache.get(first); + if (innerCache === undefined) { + innerCache = new WeakMap(); + mergeCache.set(first, innerCache); + } + const prevMerge = /** @type {T & O} */ (innerCache.get(second)); + if (prevMerge !== undefined) return prevMerge; + const newMerge = _cleverMerge(first, second, true); + innerCache.set(second, newMerge); + return newMerge; +}; + +/** + * @template T + * @param {Partial} obj object + * @param {string} property property + * @param {string | number | boolean} value assignment value + * @returns {T} new object + */ +const cachedSetProperty = (obj, property, value) => { + let mapByProperty = setPropertyCache.get(obj); + + if (mapByProperty === undefined) { + mapByProperty = new Map(); + setPropertyCache.set(obj, mapByProperty); + } + + let mapByValue = mapByProperty.get(property); + + if (mapByValue === undefined) { + mapByValue = new Map(); + mapByProperty.set(property, mapByValue); + } + + let result = mapByValue.get(value); + + if (result) return /** @type {T} */ (result); + + result = { + ...obj, + [property]: value + }; + mapByValue.set(value, result); + + return /** @type {T} */ (result); +}; + +/** + * @template V + * @typedef {Map} ByValues + */ + +/** + * @typedef {object} ObjectParsedPropertyEntry + * @property {TODO | undefined} base base value + * @property {string | undefined} byProperty the name of the selector property + * @property {ByValues} byValues value depending on selector property, merged with base + */ + +/** @typedef {(function(...EXPECTED_ANY): object) & { [DYNAMIC_INFO]: [DynamicFunction, object] }} DynamicFunction */ + +/** + * @typedef {object} ParsedObject + * @property {Map} static static properties (key is property name) + * @property {{ byProperty: string, fn: DynamicFunction } | undefined} dynamic dynamic part + */ + +/** @type {WeakMap} */ +const parseCache = new WeakMap(); + +/** + * @template {object} T + * @param {T} obj the object + * @returns {ParsedObject} parsed object + */ +const cachedParseObject = obj => { + const entry = parseCache.get(/** @type {EXPECTED_OBJECT} */ (obj)); + if (entry !== undefined) return entry; + const result = parseObject(obj); + parseCache.set(/** @type {EXPECTED_OBJECT} */ (obj), result); + return result; +}; + +/** + * @template {object} T + * @template V + * @param {T} obj the object + * @returns {ParsedObject} parsed object + */ +const parseObject = obj => { + const info = new Map(); + let dynamicInfo; + /** + * @param {string} p path + * @returns {Partial} object parsed property entry + */ + const getInfo = p => { + const entry = info.get(p); + if (entry !== undefined) return entry; + const newEntry = { + base: undefined, + byProperty: undefined, + byValues: undefined + }; + info.set(p, newEntry); + return newEntry; + }; + for (const key of Object.keys(obj)) { + if (key.startsWith("by")) { + const byProperty = /** @type {keyof T} */ (key); + const byObj = /** @type {TODO} */ (obj[byProperty]); + if (typeof byObj === "object") { + for (const byValue of Object.keys(byObj)) { + const obj = byObj[/** @type {keyof (keyof T)} */ (byValue)]; + for (const key of Object.keys(obj)) { + const entry = getInfo(key); + if (entry.byProperty === undefined) { + entry.byProperty = /** @type {string} */ (byProperty); + entry.byValues = new Map(); + } else if (entry.byProperty !== byProperty) { + throw new Error( + `${/** @type {string} */ (byProperty)} and ${entry.byProperty} for a single property is not supported` + ); + } + /** @type {ByValues} */ + (entry.byValues).set( + byValue, + obj[/** @type {keyof (keyof T)} */ (key)] + ); + if (byValue === "default") { + for (const otherByValue of Object.keys(byObj)) { + if ( + !( + /** @type {ByValues} */ + (entry.byValues).has(otherByValue) + ) + ) + /** @type {ByValues} */ + (entry.byValues).set(otherByValue, undefined); + } + } + } + } + } else if (typeof byObj === "function") { + if (dynamicInfo === undefined) { + dynamicInfo = { + byProperty: key, + fn: byObj + }; + } else { + throw new Error( + `${key} and ${dynamicInfo.byProperty} when both are functions is not supported` + ); + } + } else { + const entry = getInfo(key); + entry.base = obj[/** @type {keyof T} */ (key)]; + } + } else { + const entry = getInfo(key); + entry.base = obj[/** @type {keyof T} */ (key)]; + } + } + return { + static: info, + dynamic: dynamicInfo + }; +}; + +/** + * @template {object} T + * @param {Map} info static properties (key is property name) + * @param {{ byProperty: string, fn: (...args: EXPECTED_ANY[]) => T } | undefined} dynamicInfo dynamic part + * @returns {T} the object + */ +const serializeObject = (info, dynamicInfo) => { + const obj = /** @type {T} */ ({}); + // Setup byProperty structure + for (const entry of info.values()) { + if (entry.byProperty !== undefined) { + const byProperty = /** @type {keyof T} */ (entry.byProperty); + const byObj = (obj[byProperty] = + obj[byProperty] || /** @type {TODO} */ ({})); + for (const byValue of entry.byValues.keys()) { + byObj[byValue] = byObj[byValue] || {}; + } + } + } + for (const [key, entry] of info) { + if (entry.base !== undefined) { + obj[/** @type {keyof T} */ (key)] = entry.base; + } + // Fill byProperty structure + if (entry.byProperty !== undefined) { + const byProperty = /** @type {keyof T} */ (entry.byProperty); + const byObj = (obj[byProperty] = + obj[byProperty] || /** @type {TODO} */ ({})); + for (const byValue of Object.keys(byObj)) { + const value = getFromByValues(entry.byValues, byValue); + if (value !== undefined) byObj[byValue][key] = value; + } + } + } + if (dynamicInfo !== undefined) { + /** @type {TODO} */ + (obj)[dynamicInfo.byProperty] = dynamicInfo.fn; + } + return obj; +}; + +const VALUE_TYPE_UNDEFINED = 0; +const VALUE_TYPE_ATOM = 1; +const VALUE_TYPE_ARRAY_EXTEND = 2; +const VALUE_TYPE_OBJECT = 3; +const VALUE_TYPE_DELETE = 4; + +/** + * @template T + * @param {T} value a single value + * @returns {VALUE_TYPE_UNDEFINED | VALUE_TYPE_ATOM | VALUE_TYPE_ARRAY_EXTEND | VALUE_TYPE_OBJECT | VALUE_TYPE_DELETE} value type + */ +const getValueType = value => { + if (value === undefined) { + return VALUE_TYPE_UNDEFINED; + } else if (value === DELETE) { + return VALUE_TYPE_DELETE; + } else if (Array.isArray(value)) { + if (value.includes("...")) return VALUE_TYPE_ARRAY_EXTEND; + return VALUE_TYPE_ATOM; + } else if ( + typeof value === "object" && + value !== null && + (!value.constructor || value.constructor === Object) + ) { + return VALUE_TYPE_OBJECT; + } + return VALUE_TYPE_ATOM; +}; + +/** + * Merges two objects. Objects are deeply clever merged. + * Arrays might reference the old value with "...". + * Non-object values take preference over object values. + * @template T + * @template O + * @param {T} first first object + * @param {O} second second object + * @returns {T & O | T | O} merged object of first and second object + */ +const cleverMerge = (first, second) => { + if (second === undefined) return first; + if (first === undefined) return second; + if (typeof second !== "object" || second === null) return second; + if (typeof first !== "object" || first === null) return first; + + return /** @type {T & O} */ (_cleverMerge(first, second, false)); +}; + +/** + * @template {object} T + * @template {object} O + * Merges two objects. Objects are deeply clever merged. + * @param {T} first first + * @param {O} second second + * @param {boolean} internalCaching should parsing of objects and nested merges be cached + * @returns {T & O} merged object of first and second object + */ +const _cleverMerge = (first, second, internalCaching = false) => { + const firstObject = internalCaching + ? cachedParseObject(first) + : parseObject(first); + const { static: firstInfo, dynamic: firstDynamicInfo } = firstObject; + + // If the first argument has a dynamic part we modify the dynamic part to merge the second argument + if (firstDynamicInfo !== undefined) { + let { byProperty, fn } = firstDynamicInfo; + const fnInfo = fn[DYNAMIC_INFO]; + if (fnInfo) { + second = + /** @type {TODO} */ + ( + internalCaching + ? cachedCleverMerge(fnInfo[1], second) + : cleverMerge(fnInfo[1], second) + ); + fn = fnInfo[0]; + } + /** @type {DynamicFunction} */ + const newFn = (...args) => { + const fnResult = fn(...args); + return internalCaching + ? cachedCleverMerge(fnResult, second) + : cleverMerge(fnResult, second); + }; + newFn[DYNAMIC_INFO] = [fn, second]; + return /** @type {T & O} */ ( + serializeObject(firstObject.static, { byProperty, fn: newFn }) + ); + } + + // If the first part is static only, we merge the static parts and keep the dynamic part of the second argument + const secondObject = internalCaching + ? cachedParseObject(second) + : parseObject(second); + const { static: secondInfo, dynamic: secondDynamicInfo } = secondObject; + /** @type {Map} */ + const resultInfo = new Map(); + for (const [key, firstEntry] of firstInfo) { + const secondEntry = secondInfo.get(key); + const entry = + secondEntry !== undefined + ? mergeEntries(firstEntry, secondEntry, internalCaching) + : firstEntry; + resultInfo.set(key, entry); + } + for (const [key, secondEntry] of secondInfo) { + if (!firstInfo.has(key)) { + resultInfo.set(key, secondEntry); + } + } + return /** @type {T & O} */ (serializeObject(resultInfo, secondDynamicInfo)); +}; + +/** + * @param {ObjectParsedPropertyEntry} firstEntry a + * @param {ObjectParsedPropertyEntry} secondEntry b + * @param {boolean} internalCaching should parsing of objects and nested merges be cached + * @returns {ObjectParsedPropertyEntry} new entry + */ +const mergeEntries = (firstEntry, secondEntry, internalCaching) => { + switch (getValueType(secondEntry.base)) { + case VALUE_TYPE_ATOM: + case VALUE_TYPE_DELETE: + // No need to consider firstEntry at all + // second value override everything + // = second.base + second.byProperty + return secondEntry; + case VALUE_TYPE_UNDEFINED: + if (!firstEntry.byProperty) { + // = first.base + second.byProperty + return { + base: firstEntry.base, + byProperty: secondEntry.byProperty, + byValues: secondEntry.byValues + }; + } else if (firstEntry.byProperty !== secondEntry.byProperty) { + throw new Error( + `${firstEntry.byProperty} and ${secondEntry.byProperty} for a single property is not supported` + ); + } else { + // = first.base + (first.byProperty + second.byProperty) + // need to merge first and second byValues + const newByValues = new Map(firstEntry.byValues); + for (const [key, value] of secondEntry.byValues) { + const firstValue = getFromByValues(firstEntry.byValues, key); + newByValues.set( + key, + mergeSingleValue(firstValue, value, internalCaching) + ); + } + return { + base: firstEntry.base, + byProperty: firstEntry.byProperty, + byValues: newByValues + }; + } + default: { + if (!firstEntry.byProperty) { + // The simple case + // = (first.base + second.base) + second.byProperty + return { + base: mergeSingleValue( + firstEntry.base, + secondEntry.base, + internalCaching + ), + byProperty: secondEntry.byProperty, + byValues: secondEntry.byValues + }; + } + let newBase; + const intermediateByValues = new Map(firstEntry.byValues); + for (const [key, value] of intermediateByValues) { + intermediateByValues.set( + key, + mergeSingleValue(value, secondEntry.base, internalCaching) + ); + } + if ( + Array.from(firstEntry.byValues.values()).every(value => { + const type = getValueType(value); + return type === VALUE_TYPE_ATOM || type === VALUE_TYPE_DELETE; + }) + ) { + // = (first.base + second.base) + ((first.byProperty + second.base) + second.byProperty) + newBase = mergeSingleValue( + firstEntry.base, + secondEntry.base, + internalCaching + ); + } else { + // = first.base + ((first.byProperty (+default) + second.base) + second.byProperty) + newBase = firstEntry.base; + if (!intermediateByValues.has("default")) + intermediateByValues.set("default", secondEntry.base); + } + if (!secondEntry.byProperty) { + // = first.base + (first.byProperty + second.base) + return { + base: newBase, + byProperty: firstEntry.byProperty, + byValues: intermediateByValues + }; + } else if (firstEntry.byProperty !== secondEntry.byProperty) { + throw new Error( + `${firstEntry.byProperty} and ${secondEntry.byProperty} for a single property is not supported` + ); + } + const newByValues = new Map(intermediateByValues); + for (const [key, value] of secondEntry.byValues) { + const firstValue = getFromByValues(intermediateByValues, key); + newByValues.set( + key, + mergeSingleValue(firstValue, value, internalCaching) + ); + } + return { + base: newBase, + byProperty: firstEntry.byProperty, + byValues: newByValues + }; + } + } +}; + +/** + * @template V + * @param {ByValues} byValues all values + * @param {string} key value of the selector + * @returns {V | undefined} value + */ +const getFromByValues = (byValues, key) => { + if (key !== "default" && byValues.has(key)) { + return byValues.get(key); + } + return byValues.get("default"); +}; + +/** + * @template A + * @template B + * @param {A | A[]} a value + * @param {B | B[]} b value + * @param {boolean} internalCaching should parsing of objects and nested merges be cached + * @returns {A & B | (A | B)[] | A | A[] | B | B[]} value + */ +const mergeSingleValue = (a, b, internalCaching) => { + const bType = getValueType(b); + const aType = getValueType(a); + switch (bType) { + case VALUE_TYPE_DELETE: + case VALUE_TYPE_ATOM: + return b; + case VALUE_TYPE_OBJECT: { + return aType !== VALUE_TYPE_OBJECT + ? b + : internalCaching + ? cachedCleverMerge(a, b) + : cleverMerge(a, b); + } + case VALUE_TYPE_UNDEFINED: + return a; + case VALUE_TYPE_ARRAY_EXTEND: + switch ( + aType !== VALUE_TYPE_ATOM + ? aType + : Array.isArray(a) + ? VALUE_TYPE_ARRAY_EXTEND + : VALUE_TYPE_OBJECT + ) { + case VALUE_TYPE_UNDEFINED: + return b; + case VALUE_TYPE_DELETE: + return /** @type {B[]} */ (b).filter(item => item !== "..."); + case VALUE_TYPE_ARRAY_EXTEND: { + /** @type {(A | B)[]} */ + const newArray = []; + for (const item of /** @type {B[]} */ (b)) { + if (item === "...") { + for (const item of /** @type {A[]} */ (a)) { + newArray.push(item); + } + } else { + newArray.push(item); + } + } + return newArray; + } + case VALUE_TYPE_OBJECT: + return /** @type {(A | B)[]} */ (b).map(item => + item === "..." ? /** @type {A} */ (a) : item + ); + default: + throw new Error("Not implemented"); + } + default: + throw new Error("Not implemented"); + } +}; + +/** + * @template {object} T + * @param {T} obj the object + * @param {(keyof T)[]=} keysToKeepOriginalValue keys to keep original value + * @returns {T} the object without operations like "..." or DELETE + */ +const removeOperations = (obj, keysToKeepOriginalValue = []) => { + const newObj = /** @type {T} */ ({}); + for (const _key of Object.keys(obj)) { + const key = /** @type {keyof T} */ (_key); + const value = obj[key]; + const type = getValueType(value); + if (type === VALUE_TYPE_OBJECT && keysToKeepOriginalValue.includes(key)) { + newObj[key] = value; + continue; + } + switch (type) { + case VALUE_TYPE_UNDEFINED: + case VALUE_TYPE_DELETE: + break; + case VALUE_TYPE_OBJECT: + newObj[key] = + /** @type {T[keyof T]} */ + ( + removeOperations( + /** @type {T} */ + (value), + keysToKeepOriginalValue + ) + ); + break; + case VALUE_TYPE_ARRAY_EXTEND: + newObj[key] = + /** @type {T[keyof T]} */ + ( + /** @type {EXPECTED_ANY[]} */ + (value).filter(i => i !== "...") + ); + break; + default: + newObj[key] = value; + break; + } + } + return newObj; +}; + +/** + * @template T + * @template {keyof T} P + * @template V + * @param {T} obj the object + * @param {P} byProperty the by description + * @param {...V} values values + * @returns {Omit} object with merged byProperty + */ +const resolveByProperty = (obj, byProperty, ...values) => { + if (typeof obj !== "object" || obj === null || !(byProperty in obj)) { + return obj; + } + const { [byProperty]: _byValue, ..._remaining } = obj; + const remaining = /** @type {T} */ (_remaining); + const byValue = + /** @type {Record | ((...args: V[]) => T)} */ + (_byValue); + if (typeof byValue === "object") { + const key = /** @type {string} */ (values[0]); + if (key in byValue) { + return cachedCleverMerge(remaining, byValue[key]); + } else if ("default" in byValue) { + return cachedCleverMerge(remaining, byValue.default); + } + return remaining; + } else if (typeof byValue === "function") { + // eslint-disable-next-line prefer-spread + const result = byValue.apply(null, values); + return cachedCleverMerge( + remaining, + resolveByProperty(result, byProperty, ...values) + ); + } + return obj; +}; + +module.exports.cachedSetProperty = cachedSetProperty; +module.exports.cachedCleverMerge = cachedCleverMerge; +module.exports.cleverMerge = cleverMerge; +module.exports.resolveByProperty = resolveByProperty; +module.exports.removeOperations = removeOperations; +module.exports.DELETE = DELETE; diff --git a/lib/util/comparators.js b/lib/util/comparators.js new file mode 100644 index 00000000000..9e7df86c3e8 --- /dev/null +++ b/lib/util/comparators.js @@ -0,0 +1,523 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const { compareRuntime } = require("./runtime"); + +/** @typedef {import("../Chunk")} Chunk */ +/** @typedef {import("../Chunk").ChunkId} ChunkId */ +/** @typedef {import("../ChunkGraph")} ChunkGraph */ +/** @typedef {import("../ChunkGraph").ModuleId} ModuleId */ +/** @typedef {import("../ChunkGroup")} ChunkGroup */ +/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */ +/** @typedef {import("../Module")} Module */ +/** @typedef {import("../ModuleGraph")} ModuleGraph */ + +/** + * @template T + * @typedef {(a: T, b: T) => -1 | 0 | 1} Comparator + */ +/** + * @template {object} TArg + * @template T + * @typedef {(tArg: TArg, a: T, b: T) => -1 | 0 | 1} RawParameterizedComparator + */ +/** + * @template {object} TArg + * @template T + * @typedef {(tArg: TArg) => Comparator} ParameterizedComparator + */ + +/** + * @template {object} TArg + * @template {object} T + * @param {RawParameterizedComparator} fn comparator with argument + * @returns {ParameterizedComparator} comparator + */ +const createCachedParameterizedComparator = fn => { + /** @type {WeakMap>} */ + const map = new WeakMap(); + return arg => { + const cachedResult = map.get(/** @type {EXPECTED_OBJECT} */ (arg)); + if (cachedResult !== undefined) return cachedResult; + /** + * @param {T} a first item + * @param {T} b second item + * @returns {-1|0|1} compare result + */ + const result = fn.bind(null, arg); + map.set(/** @type {EXPECTED_OBJECT} */ (arg), result); + return result; + }; +}; + +/** + * @param {Chunk} a chunk + * @param {Chunk} b chunk + * @returns {-1|0|1} compare result + */ +module.exports.compareChunksById = (a, b) => + compareIds(/** @type {ChunkId} */ (a.id), /** @type {ChunkId} */ (b.id)); + +/** + * @param {Module} a module + * @param {Module} b module + * @returns {-1|0|1} compare result + */ +module.exports.compareModulesByIdentifier = (a, b) => + compareIds(a.identifier(), b.identifier()); + +/** + * @param {ChunkGraph} chunkGraph the chunk graph + * @param {Module} a module + * @param {Module} b module + * @returns {-1|0|1} compare result + */ +const compareModulesById = (chunkGraph, a, b) => + compareIds( + /** @type {ModuleId} */ (chunkGraph.getModuleId(a)), + /** @type {ModuleId} */ (chunkGraph.getModuleId(b)) + ); +/** @type {ParameterizedComparator} */ +module.exports.compareModulesById = + createCachedParameterizedComparator(compareModulesById); + +/** + * @param {number} a number + * @param {number} b number + * @returns {-1|0|1} compare result + */ +const compareNumbers = (a, b) => { + if (typeof a !== typeof b) { + return typeof a < typeof b ? -1 : 1; + } + if (a < b) return -1; + if (a > b) return 1; + return 0; +}; +module.exports.compareNumbers = compareNumbers; + +/** + * @param {string} a string + * @param {string} b string + * @returns {-1|0|1} compare result + */ +const compareStringsNumeric = (a, b) => { + const aLength = a.length; + const bLength = b.length; + + let aChar = 0; + let bChar = 0; + + let aIsDigit = false; + let bIsDigit = false; + let i = 0; + let j = 0; + while (i < aLength && j < bLength) { + aChar = a.charCodeAt(i); + bChar = b.charCodeAt(j); + + aIsDigit = aChar >= 48 && aChar <= 57; + bIsDigit = bChar >= 48 && bChar <= 57; + + if (!aIsDigit && !bIsDigit) { + if (aChar < bChar) return -1; + if (aChar > bChar) return 1; + i++; + j++; + } else if (aIsDigit && !bIsDigit) { + // This segment of a is shorter than in b + return 1; + } else if (!aIsDigit && bIsDigit) { + // This segment of b is shorter than in a + return -1; + } else { + let aNumber = aChar - 48; + let bNumber = bChar - 48; + + while (++i < aLength) { + aChar = a.charCodeAt(i); + if (aChar < 48 || aChar > 57) break; + aNumber = aNumber * 10 + aChar - 48; + } + + while (++j < bLength) { + bChar = b.charCodeAt(j); + if (bChar < 48 || bChar > 57) break; + bNumber = bNumber * 10 + bChar - 48; + } + + if (aNumber < bNumber) return -1; + if (aNumber > bNumber) return 1; + } + } + + if (j < bLength) { + // a is shorter than b + bChar = b.charCodeAt(j); + bIsDigit = bChar >= 48 && bChar <= 57; + return bIsDigit ? -1 : 1; + } + if (i < aLength) { + // b is shorter than a + aChar = a.charCodeAt(i); + aIsDigit = aChar >= 48 && aChar <= 57; + return aIsDigit ? 1 : -1; + } + + return 0; +}; +module.exports.compareStringsNumeric = compareStringsNumeric; + +/** + * @param {ModuleGraph} moduleGraph the module graph + * @param {Module} a module + * @param {Module} b module + * @returns {-1|0|1} compare result + */ +const compareModulesByPostOrderIndexOrIdentifier = (moduleGraph, a, b) => { + const cmp = compareNumbers( + /** @type {number} */ (moduleGraph.getPostOrderIndex(a)), + /** @type {number} */ (moduleGraph.getPostOrderIndex(b)) + ); + if (cmp !== 0) return cmp; + return compareIds(a.identifier(), b.identifier()); +}; +/** @type {ParameterizedComparator} */ +module.exports.compareModulesByPostOrderIndexOrIdentifier = + createCachedParameterizedComparator( + compareModulesByPostOrderIndexOrIdentifier + ); + +/** + * @param {ModuleGraph} moduleGraph the module graph + * @param {Module} a module + * @param {Module} b module + * @returns {-1|0|1} compare result + */ +const compareModulesByPreOrderIndexOrIdentifier = (moduleGraph, a, b) => { + const cmp = compareNumbers( + /** @type {number} */ (moduleGraph.getPreOrderIndex(a)), + /** @type {number} */ (moduleGraph.getPreOrderIndex(b)) + ); + if (cmp !== 0) return cmp; + return compareIds(a.identifier(), b.identifier()); +}; +/** @type {ParameterizedComparator} */ +module.exports.compareModulesByPreOrderIndexOrIdentifier = + createCachedParameterizedComparator( + compareModulesByPreOrderIndexOrIdentifier + ); + +/** + * @param {ChunkGraph} chunkGraph the chunk graph + * @param {Module} a module + * @param {Module} b module + * @returns {-1|0|1} compare result + */ +const compareModulesByIdOrIdentifier = (chunkGraph, a, b) => { + const cmp = compareIds( + /** @type {ModuleId} */ (chunkGraph.getModuleId(a)), + /** @type {ModuleId} */ (chunkGraph.getModuleId(b)) + ); + if (cmp !== 0) return cmp; + return compareIds(a.identifier(), b.identifier()); +}; +/** @type {ParameterizedComparator} */ +module.exports.compareModulesByIdOrIdentifier = + createCachedParameterizedComparator(compareModulesByIdOrIdentifier); + +/** + * @param {ChunkGraph} chunkGraph the chunk graph + * @param {Chunk} a chunk + * @param {Chunk} b chunk + * @returns {-1 | 0 | 1} compare result + */ +const compareChunks = (chunkGraph, a, b) => chunkGraph.compareChunks(a, b); +/** @type {ParameterizedComparator} */ +module.exports.compareChunks = + createCachedParameterizedComparator(compareChunks); + +/** + * @param {string | number} a first id + * @param {string | number} b second id + * @returns {-1 | 0 | 1} compare result + */ +const compareIds = (a, b) => { + if (typeof a !== typeof b) { + return typeof a < typeof b ? -1 : 1; + } + if (a < b) return -1; + if (a > b) return 1; + return 0; +}; + +module.exports.compareIds = compareIds; + +/** + * @param {string} a first string + * @param {string} b second string + * @returns {-1|0|1} compare result + */ +const compareStrings = (a, b) => { + if (a < b) return -1; + if (a > b) return 1; + return 0; +}; + +module.exports.compareStrings = compareStrings; + +/** + * @param {ChunkGroup} a first chunk group + * @param {ChunkGroup} b second chunk group + * @returns {-1 | 0 | 1} compare result + */ +const compareChunkGroupsByIndex = (a, b) => + /** @type {number} */ (a.index) < /** @type {number} */ (b.index) ? -1 : 1; +module.exports.compareChunkGroupsByIndex = compareChunkGroupsByIndex; + +/** + * @template {EXPECTED_OBJECT} K1 + * @template {EXPECTED_OBJECT} K2 + * @template T + */ +class TwoKeyWeakMap { + constructor() { + /** + * @private + * @type {WeakMap>} + */ + this._map = new WeakMap(); + } + + /** + * @param {K1} key1 first key + * @param {K2} key2 second key + * @returns {T | undefined} value + */ + get(key1, key2) { + const childMap = this._map.get(key1); + if (childMap === undefined) { + return; + } + return childMap.get(key2); + } + + /** + * @param {K1} key1 first key + * @param {K2} key2 second key + * @param {T | undefined} value new value + * @returns {void} + */ + set(key1, key2, value) { + let childMap = this._map.get(key1); + if (childMap === undefined) { + childMap = new WeakMap(); + this._map.set(key1, childMap); + } + childMap.set(key2, value); + } +} + +/** @type {TwoKeyWeakMap, Comparator, Comparator>}} */ +const concatComparatorsCache = new TwoKeyWeakMap(); + +/** + * @template T + * @param {Comparator} c1 comparator + * @param {Comparator} c2 comparator + * @param {Comparator[]} cRest comparators + * @returns {Comparator} comparator + */ +const concatComparators = (c1, c2, ...cRest) => { + if (cRest.length > 0) { + const [c3, ...cRest2] = cRest; + return concatComparators(c1, concatComparators(c2, c3, ...cRest2)); + } + const cacheEntry = /** @type {Comparator} */ ( + concatComparatorsCache.get(c1, c2) + ); + if (cacheEntry !== undefined) return cacheEntry; + /** + * @param {T} a first value + * @param {T} b second value + * @returns {-1|0|1} compare result + */ + const result = (a, b) => { + const res = c1(a, b); + if (res !== 0) return res; + return c2(a, b); + }; + concatComparatorsCache.set(c1, c2, result); + return result; +}; +module.exports.concatComparators = concatComparators; + +/** + * @template A, B + * @typedef {(input: A) => B | undefined | null} Selector + */ + +/** @type {TwoKeyWeakMap, Comparator, Comparator>}} */ +const compareSelectCache = new TwoKeyWeakMap(); + +/** + * @template T + * @template R + * @param {Selector} getter getter for value + * @param {Comparator} comparator comparator + * @returns {Comparator} comparator + */ +const compareSelect = (getter, comparator) => { + const cacheEntry = compareSelectCache.get(getter, comparator); + if (cacheEntry !== undefined) return cacheEntry; + /** + * @param {T} a first value + * @param {T} b second value + * @returns {-1|0|1} compare result + */ + const result = (a, b) => { + const aValue = getter(a); + const bValue = getter(b); + if (aValue !== undefined && aValue !== null) { + if (bValue !== undefined && bValue !== null) { + return comparator(aValue, bValue); + } + return -1; + } + if (bValue !== undefined && bValue !== null) { + return 1; + } + return 0; + }; + compareSelectCache.set(getter, comparator, result); + return result; +}; +module.exports.compareSelect = compareSelect; + +/** @type {WeakMap, Comparator>>} */ +const compareIteratorsCache = new WeakMap(); + +/** + * @template T + * @param {Comparator} elementComparator comparator for elements + * @returns {Comparator>} comparator for iterables of elements + */ +const compareIterables = elementComparator => { + const cacheEntry = compareIteratorsCache.get(elementComparator); + if (cacheEntry !== undefined) return cacheEntry; + /** + * @param {Iterable} a first value + * @param {Iterable} b second value + * @returns {-1|0|1} compare result + */ + const result = (a, b) => { + const aI = a[Symbol.iterator](); + const bI = b[Symbol.iterator](); + while (true) { + const aItem = aI.next(); + const bItem = bI.next(); + if (aItem.done) { + return bItem.done ? 0 : -1; + } else if (bItem.done) { + return 1; + } + const res = elementComparator(aItem.value, bItem.value); + if (res !== 0) return res; + } + }; + compareIteratorsCache.set(elementComparator, result); + return result; +}; +module.exports.compareIterables = compareIterables; + +// TODO this is no longer needed when minimum node.js version is >= 12 +// since these versions ship with a stable sort function +/** + * @template T + * @param {Iterable} iterable original ordered list + * @returns {Comparator} comparator + */ +module.exports.keepOriginalOrder = iterable => { + /** @type {Map} */ + const map = new Map(); + let i = 0; + for (const item of iterable) { + map.set(item, i++); + } + return (a, b) => + compareNumbers( + /** @type {number} */ (map.get(a)), + /** @type {number} */ (map.get(b)) + ); +}; + +/** + * @param {ChunkGraph} chunkGraph the chunk graph + * @returns {Comparator} comparator + */ +module.exports.compareChunksNatural = chunkGraph => { + const cmpFn = module.exports.compareModulesById(chunkGraph); + const cmpIterableFn = compareIterables(cmpFn); + return concatComparators( + compareSelect( + chunk => /** @type {string|number} */ (chunk.name), + compareIds + ), + compareSelect(chunk => chunk.runtime, compareRuntime), + compareSelect( + /** + * @param {Chunk} chunk a chunk + * @returns {Iterable} modules + */ + chunk => chunkGraph.getOrderedChunkModulesIterable(chunk, cmpFn), + cmpIterableFn + ) + ); +}; + +/** + * Compare two locations + * @param {DependencyLocation} a A location node + * @param {DependencyLocation} b A location node + * @returns {-1|0|1} sorting comparator value + */ +module.exports.compareLocations = (a, b) => { + const isObjectA = typeof a === "object" && a !== null; + const isObjectB = typeof b === "object" && b !== null; + if (!isObjectA || !isObjectB) { + if (isObjectA) return 1; + if (isObjectB) return -1; + return 0; + } + if ("start" in a) { + if ("start" in b) { + const ap = a.start; + const bp = b.start; + if (ap.line < bp.line) return -1; + if (ap.line > bp.line) return 1; + if (/** @type {number} */ (ap.column) < /** @type {number} */ (bp.column)) + return -1; + if (/** @type {number} */ (ap.column) > /** @type {number} */ (bp.column)) + return 1; + } else return -1; + } else if ("start" in b) return 1; + if ("name" in a) { + if ("name" in b) { + if (a.name < b.name) return -1; + if (a.name > b.name) return 1; + } else return -1; + } else if ("name" in b) return 1; + if ("index" in a) { + if ("index" in b) { + if (/** @type {number} */ (a.index) < /** @type {number} */ (b.index)) + return -1; + if (/** @type {number} */ (a.index) > /** @type {number} */ (b.index)) + return 1; + } else return -1; + } else if ("index" in b) return 1; + return 0; +}; diff --git a/lib/util/compileBooleanMatcher.js b/lib/util/compileBooleanMatcher.js new file mode 100644 index 00000000000..88b7883c55e --- /dev/null +++ b/lib/util/compileBooleanMatcher.js @@ -0,0 +1,234 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +/** + * @param {string} str string + * @returns {string} quoted meta + */ +const quoteMeta = str => str.replace(/[-[\]\\/{}()*+?.^$|]/g, "\\$&"); + +/** + * @param {string} str string + * @returns {string} string + */ +const toSimpleString = str => { + if (`${Number(str)}` === str) { + return str; + } + return JSON.stringify(str); +}; + +/** + * @param {Record} map value map + * @returns {boolean | ((value: string) => string)} true/false, when unconditionally true/false, or a template function to determine the value at runtime + */ +const compileBooleanMatcher = map => { + const positiveItems = Object.keys(map).filter(i => map[i]); + const negativeItems = Object.keys(map).filter(i => !map[i]); + if (positiveItems.length === 0) return false; + if (negativeItems.length === 0) return true; + return compileBooleanMatcherFromLists(positiveItems, negativeItems); +}; + +/** + * @param {string[]} positiveItems positive items + * @param {string[]} negativeItems negative items + * @returns {(value: string) => string} a template function to determine the value at runtime + */ +const compileBooleanMatcherFromLists = (positiveItems, negativeItems) => { + if (positiveItems.length === 0) return () => "false"; + if (negativeItems.length === 0) return () => "true"; + if (positiveItems.length === 1) + return value => `${toSimpleString(positiveItems[0])} == ${value}`; + if (negativeItems.length === 1) + return value => `${toSimpleString(negativeItems[0])} != ${value}`; + const positiveRegexp = itemsToRegexp(positiveItems); + const negativeRegexp = itemsToRegexp(negativeItems); + if (positiveRegexp.length <= negativeRegexp.length) { + return value => `/^${positiveRegexp}$/.test(${value})`; + } + return value => `!/^${negativeRegexp}$/.test(${value})`; +}; + +/** + * @param {Set} itemsSet items set + * @param {(str: string) => string | false} getKey get key function + * @param {(str: Array) => boolean} condition condition + * @returns {Array>} list of common items + */ +const popCommonItems = (itemsSet, getKey, condition) => { + /** @type {Map>} */ + const map = new Map(); + for (const item of itemsSet) { + const key = getKey(item); + if (key) { + let list = map.get(key); + if (list === undefined) { + /** @type {Array} */ + list = []; + map.set(key, list); + } + list.push(item); + } + } + /** @type {Array>} */ + const result = []; + for (const list of map.values()) { + if (condition(list)) { + for (const item of list) { + itemsSet.delete(item); + } + result.push(list); + } + } + return result; +}; + +/** + * @param {Array} items items + * @returns {string} common prefix + */ +const getCommonPrefix = items => { + let prefix = items[0]; + for (let i = 1; i < items.length; i++) { + const item = items[i]; + for (let p = 0; p < prefix.length; p++) { + if (item[p] !== prefix[p]) { + prefix = prefix.slice(0, p); + break; + } + } + } + return prefix; +}; + +/** + * @param {Array} items items + * @returns {string} common suffix + */ +const getCommonSuffix = items => { + let suffix = items[0]; + for (let i = 1; i < items.length; i++) { + const item = items[i]; + for (let p = item.length - 1, s = suffix.length - 1; s >= 0; p--, s--) { + if (item[p] !== suffix[s]) { + suffix = suffix.slice(s + 1); + break; + } + } + } + return suffix; +}; + +/** + * @param {Array} itemsArr array of items + * @returns {string} regexp + */ +const itemsToRegexp = itemsArr => { + if (itemsArr.length === 1) { + return quoteMeta(itemsArr[0]); + } + /** @type {Array} */ + const finishedItems = []; + + // merge single char items: (a|b|c|d|ef) => ([abcd]|ef) + let countOfSingleCharItems = 0; + for (const item of itemsArr) { + if (item.length === 1) { + countOfSingleCharItems++; + } + } + // special case for only single char items + if (countOfSingleCharItems === itemsArr.length) { + return `[${quoteMeta(itemsArr.sort().join(""))}]`; + } + const items = new Set(itemsArr.sort()); + if (countOfSingleCharItems > 2) { + let singleCharItems = ""; + for (const item of items) { + if (item.length === 1) { + singleCharItems += item; + items.delete(item); + } + } + finishedItems.push(`[${quoteMeta(singleCharItems)}]`); + } + + // special case for 2 items with common prefix/suffix + if (finishedItems.length === 0 && items.size === 2) { + const prefix = getCommonPrefix(itemsArr); + const suffix = getCommonSuffix( + itemsArr.map(item => item.slice(prefix.length)) + ); + if (prefix.length > 0 || suffix.length > 0) { + return `${quoteMeta(prefix)}${itemsToRegexp( + itemsArr.map(i => i.slice(prefix.length, -suffix.length || undefined)) + )}${quoteMeta(suffix)}`; + } + } + + // special case for 2 items with common suffix + if (finishedItems.length === 0 && items.size === 2) { + /** @type {Iterator} */ + const it = items[Symbol.iterator](); + const a = it.next().value; + const b = it.next().value; + if (a.length > 0 && b.length > 0 && a.slice(-1) === b.slice(-1)) { + return `${itemsToRegexp([a.slice(0, -1), b.slice(0, -1)])}${quoteMeta( + a.slice(-1) + )}`; + } + } + + // find common prefix: (a1|a2|a3|a4|b5) => (a(1|2|3|4)|b5) + const prefixed = popCommonItems( + items, + item => (item.length >= 1 ? item[0] : false), + list => { + if (list.length >= 3) return true; + if (list.length <= 1) return false; + return list[0][1] === list[1][1]; + } + ); + for (const prefixedItems of prefixed) { + const prefix = getCommonPrefix(prefixedItems); + finishedItems.push( + `${quoteMeta(prefix)}${itemsToRegexp( + prefixedItems.map(i => i.slice(prefix.length)) + )}` + ); + } + + // find common suffix: (a1|b1|c1|d1|e2) => ((a|b|c|d)1|e2) + const suffixed = popCommonItems( + items, + item => (item.length >= 1 ? item.slice(-1) : false), + list => { + if (list.length >= 3) return true; + if (list.length <= 1) return false; + return list[0].slice(-2) === list[1].slice(-2); + } + ); + for (const suffixedItems of suffixed) { + const suffix = getCommonSuffix(suffixedItems); + finishedItems.push( + `${itemsToRegexp( + suffixedItems.map(i => i.slice(0, -suffix.length)) + )}${quoteMeta(suffix)}` + ); + } + + // TODO further optimize regexp, i. e. + // use ranges: (1|2|3|4|a) => [1-4a] + const conditional = finishedItems.concat(Array.from(items, quoteMeta)); + if (conditional.length === 1) return conditional[0]; + return `(${conditional.join("|")})`; +}; + +compileBooleanMatcher.fromLists = compileBooleanMatcherFromLists; +compileBooleanMatcher.itemsToRegexp = itemsToRegexp; +module.exports = compileBooleanMatcher; diff --git a/lib/util/concatenate.js b/lib/util/concatenate.js new file mode 100644 index 00000000000..bc2297b0f23 --- /dev/null +++ b/lib/util/concatenate.js @@ -0,0 +1,231 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const Template = require("../Template"); + +/** @typedef {import("eslint-scope").Scope} Scope */ +/** @typedef {import("eslint-scope").Reference} Reference */ +/** @typedef {import("eslint-scope").Variable} Variable */ +/** @typedef {import("estree").Node} Node */ +/** @typedef {import("../javascript/JavascriptParser").Range} Range */ +/** @typedef {import("../javascript/JavascriptParser").Program} Program */ +/** @typedef {Set} UsedNames */ + +const DEFAULT_EXPORT = "__WEBPACK_DEFAULT_EXPORT__"; +const NAMESPACE_OBJECT_EXPORT = "__WEBPACK_NAMESPACE_OBJECT__"; + +/** + * @param {Variable} variable variable + * @returns {Reference[]} references + */ +const getAllReferences = variable => { + let set = variable.references; + // Look for inner scope variables too (like in class Foo { t() { Foo } }) + const identifiers = new Set(variable.identifiers); + for (const scope of variable.scope.childScopes) { + for (const innerVar of scope.variables) { + if (innerVar.identifiers.some(id => identifiers.has(id))) { + set = set.concat(innerVar.references); + break; + } + } + } + return set; +}; + +/** + * @param {Node | Node[]} ast ast + * @param {Node} node node + * @returns {undefined | Node[]} result + */ +const getPathInAst = (ast, node) => { + if (ast === node) { + return []; + } + + const nr = /** @type {Range} */ (node.range); + + /** + * @param {Node} n node + * @returns {Node[] | undefined} result + */ + const enterNode = n => { + if (!n) return; + const r = n.range; + if (r && r[0] <= nr[0] && r[1] >= nr[1]) { + const path = getPathInAst(n, node); + if (path) { + path.push(n); + return path; + } + } + }; + + if (Array.isArray(ast)) { + for (let i = 0; i < ast.length; i++) { + const enterResult = enterNode(ast[i]); + if (enterResult !== undefined) return enterResult; + } + } else if (ast && typeof ast === "object") { + const keys = + /** @type {Array} */ + (Object.keys(ast)); + for (let i = 0; i < keys.length; i++) { + // We are making the faster check in `enterNode` using `n.range` + const value = + ast[ + /** @type {Exclude} */ + (keys[i]) + ]; + if (Array.isArray(value)) { + const pathResult = getPathInAst(value, node); + if (pathResult !== undefined) return pathResult; + } else if (value && typeof value === "object") { + const enterResult = enterNode(value); + if (enterResult !== undefined) return enterResult; + } + } + } +}; + +/** + * @param {string} oldName old name + * @param {UsedNames} usedNamed1 used named 1 + * @param {UsedNames} usedNamed2 used named 2 + * @param {string} extraInfo extra info + * @returns {string} found new name + */ +function findNewName(oldName, usedNamed1, usedNamed2, extraInfo) { + let name = oldName; + + if (name === DEFAULT_EXPORT) { + name = ""; + } + if (name === NAMESPACE_OBJECT_EXPORT) { + name = "namespaceObject"; + } + + // Remove uncool stuff + extraInfo = extraInfo.replace( + /\.+\/|(\/index)?\.([a-zA-Z0-9]{1,4})($|\s|\?)|\s*\+\s*\d+\s*modules/g, + "" + ); + + const splittedInfo = extraInfo.split("/"); + while (splittedInfo.length) { + name = splittedInfo.pop() + (name ? `_${name}` : ""); + const nameIdent = Template.toIdentifier(name); + if ( + !usedNamed1.has(nameIdent) && + (!usedNamed2 || !usedNamed2.has(nameIdent)) + ) + return nameIdent; + } + + let i = 0; + let nameWithNumber = Template.toIdentifier(`${name}_${i}`); + while ( + usedNamed1.has(nameWithNumber) || + // eslint-disable-next-line no-unmodified-loop-condition + (usedNamed2 && usedNamed2.has(nameWithNumber)) + ) { + i++; + nameWithNumber = Template.toIdentifier(`${name}_${i}`); + } + return nameWithNumber; +} + +/** @typedef {Set} ScopeSet */ + +/** + * @param {Scope | null} s scope + * @param {UsedNames} nameSet name set + * @param {ScopeSet} scopeSet1 scope set 1 + * @param {ScopeSet} scopeSet2 scope set 2 + */ +const addScopeSymbols = (s, nameSet, scopeSet1, scopeSet2) => { + let scope = s; + while (scope) { + if (scopeSet1.has(scope)) break; + if (scopeSet2.has(scope)) break; + scopeSet1.add(scope); + for (const variable of scope.variables) { + nameSet.add(variable.name); + } + scope = scope.upper; + } +}; + +const RESERVED_NAMES = new Set( + [ + // internal names (should always be renamed) + DEFAULT_EXPORT, + NAMESPACE_OBJECT_EXPORT, + + // keywords + "abstract,arguments,async,await,boolean,break,byte,case,catch,char,class,const,continue", + "debugger,default,delete,do,double,else,enum,eval,export,extends,false,final,finally,float", + "for,function,goto,if,implements,import,in,instanceof,int,interface,let,long,native,new,null", + "package,private,protected,public,return,short,static,super,switch,synchronized,this,throw", + "throws,transient,true,try,typeof,var,void,volatile,while,with,yield", + + // commonjs/amd + "module,__dirname,__filename,exports,require,define", + + // js globals + "Array,Date,eval,function,hasOwnProperty,Infinity,isFinite,isNaN,isPrototypeOf,length,Math", + "NaN,name,Number,Object,prototype,String,Symbol,toString,undefined,valueOf", + + // browser globals + "alert,all,anchor,anchors,area,assign,blur,button,checkbox,clearInterval,clearTimeout", + "clientInformation,close,closed,confirm,constructor,crypto,decodeURI,decodeURIComponent", + "defaultStatus,document,element,elements,embed,embeds,encodeURI,encodeURIComponent,escape", + "event,fileUpload,focus,form,forms,frame,innerHeight,innerWidth,layer,layers,link,location", + "mimeTypes,navigate,navigator,frames,frameRate,hidden,history,image,images,offscreenBuffering", + "open,opener,option,outerHeight,outerWidth,packages,pageXOffset,pageYOffset,parent,parseFloat", + "parseInt,password,pkcs11,plugin,prompt,propertyIsEnum,radio,reset,screenX,screenY,scroll", + "secure,select,self,setInterval,setTimeout,status,submit,taint,text,textarea,top,unescape", + "untaint,window", + + // window events + "onblur,onclick,onerror,onfocus,onkeydown,onkeypress,onkeyup,onmouseover,onload,onmouseup,onmousedown,onsubmit" + ] + .join(",") + .split(",") +); + +/** @typedef {{ usedNames: UsedNames, alreadyCheckedScopes: ScopeSet }} ScopeInfo */ + +/** + * @param {Map} usedNamesInScopeInfo used names in scope info + * @param {string} module module identifier + * @param {string} id export id + * @returns {ScopeInfo} info + */ +const getUsedNamesInScopeInfo = (usedNamesInScopeInfo, module, id) => { + const key = `${module}-${id}`; + let info = usedNamesInScopeInfo.get(key); + if (info === undefined) { + info = { + usedNames: new Set(), + alreadyCheckedScopes: new Set() + }; + usedNamesInScopeInfo.set(key, info); + } + return info; +}; + +module.exports = { + getUsedNamesInScopeInfo, + findNewName, + getAllReferences, + getPathInAst, + NAMESPACE_OBJECT_EXPORT, + DEFAULT_EXPORT, + RESERVED_NAMES, + addScopeSymbols +}; diff --git a/lib/util/conventions.js b/lib/util/conventions.js new file mode 100644 index 00000000000..4f78df1c095 --- /dev/null +++ b/lib/util/conventions.js @@ -0,0 +1,126 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Gengkun He @ahabhgk +*/ + +"use strict"; + +/** @typedef {import("../../declarations/WebpackOptions").CssGeneratorExportsConvention} CssGeneratorExportsConvention */ + +/** + * @param {string} input input + * @param {CssGeneratorExportsConvention | undefined} convention convention + * @returns {string[]} results + */ +module.exports.cssExportConvention = (input, convention) => { + const set = new Set(); + if (typeof convention === "function") { + set.add(convention(input)); + } else { + switch (convention) { + case "camel-case": { + set.add(input); + set.add(module.exports.camelCase(input)); + break; + } + case "camel-case-only": { + set.add(module.exports.camelCase(input)); + break; + } + case "dashes": { + set.add(input); + set.add(module.exports.dashesCamelCase(input)); + break; + } + case "dashes-only": { + set.add(module.exports.dashesCamelCase(input)); + break; + } + case "as-is": { + set.add(input); + break; + } + } + } + return Array.from(set); +}; + +// Copy from css-loader +/** + * @param {string} input input + * @returns {string} result + */ +module.exports.dashesCamelCase = input => + input.replace(/-+(\w)/g, (match, firstLetter) => firstLetter.toUpperCase()); + +// Copy from css-loader +/** + * @param {string} input input + * @returns {string} result + */ +module.exports.camelCase = input => { + let result = input.trim(); + + if (result.length === 0) { + return ""; + } + + if (result.length === 1) { + return result.toLowerCase(); + } + + const hasUpperCase = result !== result.toLowerCase(); + + if (hasUpperCase) { + result = preserveCamelCase(result); + } + + return result + .replace(/^[_.\- ]+/, "") + .toLowerCase() + .replace(/[_.\- ]+([\p{Alpha}\p{N}_]|$)/gu, (_, p1) => p1.toUpperCase()) + .replace(/\d+([\p{Alpha}\p{N}_]|$)/gu, m => m.toUpperCase()); +}; + +// Copy from css-loader +/** + * @param {string} string string + * @returns {string} result + */ +const preserveCamelCase = string => { + let result = string; + let isLastCharLower = false; + let isLastCharUpper = false; + let isLastLastCharUpper = false; + + for (let i = 0; i < result.length; i++) { + const character = result[i]; + + if (isLastCharLower && /[\p{Lu}]/u.test(character)) { + result = `${result.slice(0, i)}-${result.slice(i)}`; + isLastCharLower = false; + isLastLastCharUpper = isLastCharUpper; + isLastCharUpper = true; + i += 1; + } else if ( + isLastCharUpper && + isLastLastCharUpper && + /[\p{Ll}]/u.test(character) + ) { + result = `${result.slice(0, i - 1)}-${result.slice(i - 1)}`; + isLastLastCharUpper = isLastCharUpper; + isLastCharUpper = false; + isLastCharLower = true; + } else { + isLastCharLower = + character.toLowerCase() === character && + character.toUpperCase() !== character; + isLastLastCharUpper = isLastCharUpper; + isLastCharUpper = + character.toUpperCase() === character && + character.toLowerCase() !== character; + } + } + + return result; +}; diff --git a/lib/util/create-schema-validation.js b/lib/util/create-schema-validation.js new file mode 100644 index 00000000000..27a0ab0be5e --- /dev/null +++ b/lib/util/create-schema-validation.js @@ -0,0 +1,41 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const memoize = require("./memoize"); + +/** @typedef {import("schema-utils/declarations/validate").ValidationErrorConfiguration} ValidationErrorConfiguration */ +/** @typedef {import("./fs").JsonObject} JsonObject */ + +const getValidate = memoize(() => require("schema-utils").validate); + +/** + * @template {object | object[]} T + * @param {((value: T) => boolean) | undefined} check check + * @param {() => JsonObject} getSchema get schema fn + * @param {ValidationErrorConfiguration} options options + * @returns {(value?: T) => void} validate + */ +const createSchemaValidation = (check, getSchema, options) => { + getSchema = memoize(getSchema); + return value => { + if (check && value && !check(value)) { + getValidate()( + getSchema(), + /** @type {EXPECTED_OBJECT | EXPECTED_OBJECT[]} */ + (value), + options + ); + require("util").deprecate( + () => {}, + "webpack bug: Pre-compiled schema reports error while real schema is happy. This has performance drawbacks.", + "DEP_WEBPACK_PRE_COMPILED_SCHEMA_INVALID" + )(); + } + }; +}; + +module.exports = createSchemaValidation; diff --git a/lib/util/createHash.js b/lib/util/createHash.js index bb5062c6721..098eacb4a8f 100644 --- a/lib/util/createHash.js +++ b/lib/util/createHash.js @@ -2,32 +2,54 @@ MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ + "use strict"; -/** @typedef {{new(): Hash}} HashConstructor */ -/** - * @typedef {Object} Hash - * @property {function(string|Buffer, string=): Hash} update - * @property {function(string): string} digest - */ +const Hash = require("./Hash"); -const BULK_SIZE = 1000; +/** @typedef {import("../../declarations/WebpackOptions").HashFunction} HashFunction */ -/** - * @implements {Hash} - */ -class BulkUpdateDecorator { - constructor(hash) { - this.hash = hash; +const BULK_SIZE = 2000; + +// We are using an object instead of a Map as this will stay static during the runtime +// so access to it can be optimized by v8 +/** @type {{[key: string]: Map}} */ +const digestCaches = {}; + +/** @typedef {() => Hash} HashFactory */ + +class BulkUpdateDecorator extends Hash { + /** + * @param {Hash | HashFactory} hashOrFactory function to create a hash + * @param {string=} hashKey key for caching + */ + constructor(hashOrFactory, hashKey) { + super(); + this.hashKey = hashKey; + if (typeof hashOrFactory === "function") { + this.hashFactory = hashOrFactory; + this.hash = undefined; + } else { + this.hashFactory = undefined; + this.hash = hashOrFactory; + } this.buffer = ""; } + /** + * Update hash {@link https://nodejs.org/api/crypto.html#crypto_hash_update_data_inputencoding} + * @param {string|Buffer} data data + * @param {string=} inputEncoding data encoding + * @returns {this} updated hash + */ update(data, inputEncoding) { if ( inputEncoding !== undefined || typeof data !== "string" || data.length > BULK_SIZE ) { + if (this.hash === undefined) + this.hash = /** @type {HashFactory} */ (this.hashFactory)(); if (this.buffer.length > 0) { this.hash.update(this.buffer); this.buffer = ""; @@ -36,6 +58,8 @@ class BulkUpdateDecorator { } else { this.buffer += data; if (this.buffer.length > BULK_SIZE) { + if (this.hash === undefined) + this.hash = /** @type {HashFactory} */ (this.hashFactory)(); this.hash.update(this.buffer); this.buffer = ""; } @@ -43,50 +67,128 @@ class BulkUpdateDecorator { return this; } + /** + * Calculates the digest {@link https://nodejs.org/api/crypto.html#crypto_hash_digest_encoding} + * @param {string=} encoding encoding of the return value + * @returns {string|Buffer} digest + */ digest(encoding) { - if (this.buffer.length > 0) { - this.hash.update(this.buffer); + let digestCache; + const buffer = this.buffer; + if (this.hash === undefined) { + // short data for hash, we can use caching + const cacheKey = `${this.hashKey}-${encoding}`; + digestCache = digestCaches[cacheKey]; + if (digestCache === undefined) { + digestCache = digestCaches[cacheKey] = new Map(); + } + const cacheEntry = digestCache.get(buffer); + if (cacheEntry !== undefined) return cacheEntry; + this.hash = /** @type {HashFactory} */ (this.hashFactory)(); + } + if (buffer.length > 0) { + this.hash.update(buffer); + } + const digestResult = this.hash.digest(encoding); + const result = + typeof digestResult === "string" ? digestResult : digestResult.toString(); + if (digestCache !== undefined) { + digestCache.set(buffer, result); } - var digestResult = this.hash.digest(encoding); - return typeof digestResult === "string" - ? digestResult - : digestResult.toString(); + return result; } } /* istanbul ignore next */ -class DebugHash { +class DebugHash extends Hash { constructor() { + super(); this.string = ""; } + /** + * Update hash {@link https://nodejs.org/api/crypto.html#crypto_hash_update_data_inputencoding} + * @param {string|Buffer} data data + * @param {string=} inputEncoding data encoding + * @returns {this} updated hash + */ update(data, inputEncoding) { if (typeof data !== "string") data = data.toString("utf-8"); - this.string += data; + const prefix = Buffer.from("@webpack-debug-digest@").toString("hex"); + if (data.startsWith(prefix)) { + data = Buffer.from(data.slice(prefix.length), "hex").toString(); + } + this.string += `[${data}](${ + /** @type {string} */ (new Error().stack).split("\n", 3)[2] + })\n`; return this; } + /** + * Calculates the digest {@link https://nodejs.org/api/crypto.html#crypto_hash_digest_encoding} + * @param {string=} encoding encoding of the return value + * @returns {string|Buffer} digest + */ digest(encoding) { - return this.string.replace(/[^a-z0-9]+/gi, m => - Buffer.from(m).toString("hex") - ); + return Buffer.from(`@webpack-debug-digest@${this.string}`).toString("hex"); } } +/** @type {typeof import("crypto") | undefined} */ +let crypto; +/** @type {typeof import("./hash/xxhash64") | undefined} */ +let createXXHash64; +/** @type {typeof import("./hash/md4") | undefined} */ +let createMd4; +/** @type {typeof import("./hash/BatchedHash") | undefined} */ +let BatchedHash; + /** * Creates a hash by name or function - * @param {string | HashConstructor} algorithm the algorithm name or a constructor creating a hash + * @param {HashFunction} algorithm the algorithm name or a constructor creating a hash * @returns {Hash} the hash */ module.exports = algorithm => { if (typeof algorithm === "function") { - return new BulkUpdateDecorator(new algorithm()); + // eslint-disable-next-line new-cap + return new BulkUpdateDecorator(() => new algorithm()); } switch (algorithm) { // TODO add non-cryptographic algorithm here case "debug": return new DebugHash(); + case "xxhash64": + if (createXXHash64 === undefined) { + createXXHash64 = require("./hash/xxhash64"); + if (BatchedHash === undefined) { + BatchedHash = require("./hash/BatchedHash"); + } + } + return new /** @type {typeof import("./hash/BatchedHash")} */ ( + BatchedHash + )(createXXHash64()); + case "md4": + if (createMd4 === undefined) { + createMd4 = require("./hash/md4"); + if (BatchedHash === undefined) { + BatchedHash = require("./hash/BatchedHash"); + } + } + return new /** @type {typeof import("./hash/BatchedHash")} */ ( + BatchedHash + )(createMd4()); + case "native-md4": + if (crypto === undefined) crypto = require("crypto"); + return new BulkUpdateDecorator( + () => /** @type {typeof import("crypto")} */ (crypto).createHash("md4"), + "md4" + ); default: - return new BulkUpdateDecorator(require("crypto").createHash(algorithm)); + if (crypto === undefined) crypto = require("crypto"); + return new BulkUpdateDecorator( + () => + /** @type {typeof import("crypto")} */ (crypto).createHash(algorithm), + algorithm + ); } }; diff --git a/lib/util/deprecation.js b/lib/util/deprecation.js new file mode 100644 index 00000000000..79dc4ae12fc --- /dev/null +++ b/lib/util/deprecation.js @@ -0,0 +1,349 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const util = require("util"); + +/** @type {Map void>} */ +const deprecationCache = new Map(); + +/** + * @typedef {object} FakeHookMarker + * @property {true} _fakeHook it's a fake hook + */ + +/** + * @template T + * @typedef {T & FakeHookMarker} FakeHook + */ + +/** + * @param {string} message deprecation message + * @param {string} code deprecation code + * @returns {() => void} function to trigger deprecation + */ +const createDeprecation = (message, code) => { + const cached = deprecationCache.get(message); + if (cached !== undefined) return cached; + const fn = util.deprecate( + () => {}, + message, + `DEP_WEBPACK_DEPRECATION_${code}` + ); + deprecationCache.set(message, fn); + return fn; +}; + +/** @typedef {"concat" | "entry" | "filter" | "find" | "findIndex" | "includes" | "indexOf" | "join" | "lastIndexOf" | "map" | "reduce" | "reduceRight" | "slice" | "some"} COPY_METHODS_NAMES */ + +/** @type {COPY_METHODS_NAMES[]} */ +const COPY_METHODS = [ + "concat", + "entry", + "filter", + "find", + "findIndex", + "includes", + "indexOf", + "join", + "lastIndexOf", + "map", + "reduce", + "reduceRight", + "slice", + "some" +]; + +/** @typedef {"copyWithin" | "entries" | "fill" | "keys" | "pop" | "reverse" | "shift" | "splice" | "sort" | "unshift"} DISABLED_METHODS_NAMES */ + +/** @type {DISABLED_METHODS_NAMES[]} */ +const DISABLED_METHODS = [ + "copyWithin", + "entries", + "fill", + "keys", + "pop", + "reverse", + "shift", + "splice", + "sort", + "unshift" +]; + +/** + * @template T + * @typedef {Set & {[Symbol.isConcatSpreadable]?: boolean} & { push?: (...items: T[]) => void } & { [P in DISABLED_METHODS_NAMES]?: () => void } & { [P in COPY_METHODS_NAMES]?: () => TODO }} SetWithDeprecatedArrayMethods + */ + +/** + * @template T + * @param {SetWithDeprecatedArrayMethods} set new set + * @param {string} name property name + * @returns {void} + */ +module.exports.arrayToSetDeprecation = (set, name) => { + for (const method of COPY_METHODS) { + if (set[method]) continue; + const d = createDeprecation( + `${name} was changed from Array to Set (using Array method '${method}' is deprecated)`, + "ARRAY_TO_SET" + ); + /** + * @deprecated + * @this {Set} + * @returns {number} count + */ + set[method] = function () { + d(); + const array = Array.from(this); + return Array.prototype[/** @type {keyof COPY_METHODS} */ (method)].apply( + array, + // eslint-disable-next-line prefer-rest-params + arguments + ); + }; + } + const dPush = createDeprecation( + `${name} was changed from Array to Set (using Array method 'push' is deprecated)`, + "ARRAY_TO_SET_PUSH" + ); + const dLength = createDeprecation( + `${name} was changed from Array to Set (using Array property 'length' is deprecated)`, + "ARRAY_TO_SET_LENGTH" + ); + const dIndexer = createDeprecation( + `${name} was changed from Array to Set (indexing Array is deprecated)`, + "ARRAY_TO_SET_INDEXER" + ); + /** + * @deprecated + * @this {Set} + * @returns {number} count + */ + set.push = function () { + dPush(); + // eslint-disable-next-line prefer-rest-params + for (const item of Array.from(arguments)) { + this.add(item); + } + return this.size; + }; + for (const method of DISABLED_METHODS) { + if (set[method]) continue; + + set[method] = () => { + throw new Error( + `${name} was changed from Array to Set (using Array method '${method}' is not possible)` + ); + }; + } + /** + * @param {number} index index + * @returns {() => T | undefined} value + */ + const createIndexGetter = index => { + /** + * @this {Set} a Set + * @returns {T | undefined} the value at this location + */ + // eslint-disable-next-line func-style + const fn = function () { + dIndexer(); + let i = 0; + for (const item of this) { + if (i++ === index) return item; + } + }; + return fn; + }; + /** + * @param {number} index index + */ + const defineIndexGetter = index => { + Object.defineProperty(set, index, { + get: createIndexGetter(index), + set(value) { + throw new Error( + `${name} was changed from Array to Set (indexing Array with write is not possible)` + ); + } + }); + }; + defineIndexGetter(0); + let indexerDefined = 1; + Object.defineProperty(set, "length", { + get() { + dLength(); + const length = this.size; + for (indexerDefined; indexerDefined < length + 1; indexerDefined++) { + defineIndexGetter(indexerDefined); + } + return length; + }, + set(value) { + throw new Error( + `${name} was changed from Array to Set (writing to Array property 'length' is not possible)` + ); + } + }); + set[Symbol.isConcatSpreadable] = true; +}; + +/** + * @template T + * @param {string} name name + * @returns {{ new (values?: readonly T[] | null): SetDeprecatedArray }} SetDeprecatedArray + */ +module.exports.createArrayToSetDeprecationSet = name => { + let initialized = false; + + /** + * @template T + */ + class SetDeprecatedArray extends Set { + /** + * @param {readonly T[] | null=} items items + */ + constructor(items) { + super(items); + if (!initialized) { + initialized = true; + module.exports.arrayToSetDeprecation( + SetDeprecatedArray.prototype, + name + ); + } + } + } + return SetDeprecatedArray; +}; + +/** + * @template {object} T + * @param {T} obj object + * @param {string} name property name + * @param {string} code deprecation code + * @param {string} note additional note + * @returns {T} frozen object with deprecation when modifying + */ +module.exports.soonFrozenObjectDeprecation = (obj, name, code, note = "") => { + const message = `${name} will be frozen in future, all modifications are deprecated.${ + note && `\n${note}` + }`; + return /** @type {T} */ ( + new Proxy(obj, { + set: util.deprecate( + /** + * @param {object} target target + * @param {string | symbol} property property + * @param {EXPECTED_ANY} value value + * @param {EXPECTED_ANY} receiver receiver + * @returns {boolean} result + */ + (target, property, value, receiver) => + Reflect.set(target, property, value, receiver), + message, + code + ), + defineProperty: util.deprecate( + /** + * @param {object} target target + * @param {string | symbol} property property + * @param {PropertyDescriptor} descriptor descriptor + * @returns {boolean} result + */ + (target, property, descriptor) => + Reflect.defineProperty(target, property, descriptor), + message, + code + ), + deleteProperty: util.deprecate( + /** + * @param {object} target target + * @param {string | symbol} property property + * @returns {boolean} result + */ + (target, property) => Reflect.deleteProperty(target, property), + message, + code + ), + setPrototypeOf: util.deprecate( + /** + * @param {object} target target + * @param {EXPECTED_OBJECT | null} proto proto + * @returns {boolean} result + */ + (target, proto) => Reflect.setPrototypeOf(target, proto), + message, + code + ) + }) + ); +}; + +/** + * @template T + * @param {T} obj object + * @param {string} message deprecation message + * @param {string} code deprecation code + * @returns {T} object with property access deprecated + */ +const deprecateAllProperties = (obj, message, code) => { + const newObj = {}; + const descriptors = Object.getOwnPropertyDescriptors(obj); + for (const name of Object.keys(descriptors)) { + const descriptor = descriptors[name]; + if (typeof descriptor.value === "function") { + Object.defineProperty(newObj, name, { + ...descriptor, + value: util.deprecate(descriptor.value, message, code) + }); + } else if (descriptor.get || descriptor.set) { + Object.defineProperty(newObj, name, { + ...descriptor, + get: descriptor.get && util.deprecate(descriptor.get, message, code), + set: descriptor.set && util.deprecate(descriptor.set, message, code) + }); + } else { + let value = descriptor.value; + Object.defineProperty(newObj, name, { + configurable: descriptor.configurable, + enumerable: descriptor.enumerable, + get: util.deprecate(() => value, message, code), + set: descriptor.writable + ? util.deprecate( + /** + * @template T + * @param {T} v value + * @returns {T} result + */ + v => (value = v), + message, + code + ) + : undefined + }); + } + } + return /** @type {T} */ (newObj); +}; +module.exports.deprecateAllProperties = deprecateAllProperties; + +/** + * @template {object} T + * @param {T} fakeHook fake hook implementation + * @param {string=} message deprecation message (not deprecated when unset) + * @param {string=} code deprecation code (not deprecated when unset) + * @returns {FakeHook} fake hook which redirects + */ +module.exports.createFakeHook = (fakeHook, message, code) => { + if (message && code) { + fakeHook = deprecateAllProperties(fakeHook, message, code); + } + return Object.freeze( + Object.assign(fakeHook, { _fakeHook: /** @type {true} */ (true) }) + ); +}; diff --git a/lib/util/deterministicGrouping.js b/lib/util/deterministicGrouping.js index 4fc6859cfb9..6978ef3014c 100644 --- a/lib/util/deterministicGrouping.js +++ b/lib/util/deterministicGrouping.js @@ -1,3 +1,8 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + "use strict"; // Simulations show these probabilities for a single change @@ -20,7 +25,6 @@ // 3.2% that 5 or more groups are invalidated /** - * * @param {string} a key * @param {string} b key * @returns {number} the similarity as number @@ -39,23 +43,141 @@ const similarity = (a, b) => { /** * @param {string} a key * @param {string} b key + * @param {Set} usedNames set of already used names * @returns {string} the common part and a single char for the difference */ -const getName = (a, b) => { +const getName = (a, b, usedNames) => { const l = Math.min(a.length, b.length); - let r = ""; - for (let i = 0; i < l; i++) { - const ca = a.charAt(i); - const cb = b.charAt(i); - r += ca; - if (ca === cb) { - continue; + let i = 0; + while (i < l) { + if (a.charCodeAt(i) !== b.charCodeAt(i)) { + i++; + break; + } + i++; + } + while (i < l) { + const name = a.slice(0, i); + const lowerName = name.toLowerCase(); + if (!usedNames.has(lowerName)) { + usedNames.add(lowerName); + return name; } - return r; + i++; } + // names always contain a hash, so this is always unique + // we don't need to check usedNames nor add it return a; }; +/** + * @param {Record} total total size + * @param {Record} size single size + * @returns {void} + */ +const addSizeTo = (total, size) => { + for (const key of Object.keys(size)) { + total[key] = (total[key] || 0) + size[key]; + } +}; + +/** + * @param {Record} total total size + * @param {Record} size single size + * @returns {void} + */ +const subtractSizeFrom = (total, size) => { + for (const key of Object.keys(size)) { + total[key] -= size[key]; + } +}; + +/** + * @template T + * @param {Iterable>} nodes some nodes + * @returns {Record} total size + */ +const sumSize = nodes => { + const sum = Object.create(null); + for (const node of nodes) { + addSizeTo(sum, node.size); + } + return sum; +}; + +/** + * @param {Record} size size + * @param {Record} maxSize minimum size + * @returns {boolean} true, when size is too big + */ +const isTooBig = (size, maxSize) => { + for (const key of Object.keys(size)) { + const s = size[key]; + if (s === 0) continue; + const maxSizeValue = maxSize[key]; + if (typeof maxSizeValue === "number" && s > maxSizeValue) return true; + } + return false; +}; + +/** + * @param {Record} size size + * @param {Record} minSize minimum size + * @returns {boolean} true, when size is too small + */ +const isTooSmall = (size, minSize) => { + for (const key of Object.keys(size)) { + const s = size[key]; + if (s === 0) continue; + const minSizeValue = minSize[key]; + if (typeof minSizeValue === "number" && s < minSizeValue) return true; + } + return false; +}; + +/** + * @param {Record} size size + * @param {Record} minSize minimum size + * @returns {Set} set of types that are too small + */ +const getTooSmallTypes = (size, minSize) => { + const types = new Set(); + for (const key of Object.keys(size)) { + const s = size[key]; + if (s === 0) continue; + const minSizeValue = minSize[key]; + if (typeof minSizeValue === "number" && s < minSizeValue) types.add(key); + } + return types; +}; + +/** + * @template {object} T + * @param {T} size size + * @param {Set} types types + * @returns {number} number of matching size types + */ +const getNumberOfMatchingSizeTypes = (size, types) => { + let i = 0; + for (const key of Object.keys(size)) { + if (size[/** @type {keyof T} */ (key)] !== 0 && types.has(key)) i++; + } + return i; +}; + +/** + * @param {Record} size size + * @param {Set} types types + * @returns {number} selective size sum + */ +const selectiveSizeSum = (size, types) => { + let sum = 0; + for (const key of Object.keys(size)) { + if (size[key] !== 0 && types.has(key)) sum += size[key]; + } + return sum; +}; + /** * @template T */ @@ -63,7 +185,7 @@ class Node { /** * @param {T} item item * @param {string} key key - * @param {number} size size + * @param {Record} size size */ constructor(item, key, size) { this.item = item; @@ -78,33 +200,85 @@ class Node { class Group { /** * @param {Node[]} nodes nodes - * @param {number[]} similarities similarities between the nodes (length = nodes.length - 1) + * @param {number[] | null} similarities similarities between the nodes (length = nodes.length - 1) + * @param {Record=} size size of the group */ - constructor(nodes, similarities) { + constructor(nodes, similarities, size) { this.nodes = nodes; this.similarities = similarities; - this.size = nodes.reduce((size, node) => size + node.size, 0); - /** @type {string} */ + this.size = size || sumSize(nodes); + /** @type {string | undefined} */ this.key = undefined; } + + /** + * @param {(node: Node) => boolean} filter filter function + * @returns {Node[] | undefined} removed nodes + */ + popNodes(filter) { + const newNodes = []; + const newSimilarities = []; + const resultNodes = []; + let lastNode; + for (let i = 0; i < this.nodes.length; i++) { + const node = this.nodes[i]; + if (filter(node)) { + resultNodes.push(node); + } else { + if (newNodes.length > 0) { + newSimilarities.push( + lastNode === this.nodes[i - 1] + ? /** @type {number[]} */ (this.similarities)[i - 1] + : similarity(/** @type {Node} */ (lastNode).key, node.key) + ); + } + newNodes.push(node); + lastNode = node; + } + } + if (resultNodes.length === this.nodes.length) return; + this.nodes = newNodes; + this.similarities = newSimilarities; + this.size = sumSize(newNodes); + return resultNodes; + } } /** * @template T - * @typedef {Object} GroupedItems + * @param {Iterable>} nodes nodes + * @returns {number[]} similarities + */ +const getSimilarities = nodes => { + // calculate similarities between lexically adjacent nodes + /** @type {number[]} */ + const similarities = []; + let last; + for (const node of nodes) { + if (last !== undefined) { + similarities.push(similarity(last.key, node.key)); + } + last = node; + } + return similarities; +}; + +/** + * @template T + * @typedef {object} GroupedItems * @property {string} key * @property {T[]} items - * @property {number} size + * @property {Record} size */ /** * @template T - * @typedef {Object} Options - * @property {number} maxSize maximum size of a group - * @property {number} minSize minimum size of a group (preferred over maximum size) + * @typedef {object} Options + * @property {Record} maxSize maximum size of a group + * @property {Record} minSize minimum size of a group (preferred over maximum size) * @property {Iterable} items a list of items - * @property {function(T): number} getSize function to get size of an item - * @property {function(T): string} getKey function to get the key of an item + * @property {(item: T) => Record} getSize function to get size of an item + * @property {(item: T) => string} getKey function to get the key of an item */ /** @@ -132,8 +306,9 @@ module.exports = ({ maxSize, minSize, items, getSize, getKey }) => { }); // return nodes bigger than maxSize directly as group + // But make sure that minSize is not violated for (const node of nodes) { - if (node.size >= maxSize) { + if (isTooBig(node.size, maxSize) && !isTooSmall(node.size, minSize)) { result.push(new Group([node], [])); } else { initialNodes.push(node); @@ -141,66 +316,122 @@ module.exports = ({ maxSize, minSize, items, getSize, getKey }) => { } if (initialNodes.length > 0) { - // calculate similarities between lexically adjacent nodes - /** @type {number[]} */ - const similarities = []; - for (let i = 1; i < initialNodes.length; i++) { - const a = initialNodes[i - 1]; - const b = initialNodes[i]; - similarities.push(similarity(a.key, b.key)); - } + const initialGroup = new Group(initialNodes, getSimilarities(initialNodes)); - const initialGroup = new Group(initialNodes, similarities); - - if (initialGroup.size < minSize) { - // We hit an edgecase where the working set is already smaller than minSize - // We merge it with the smallest result node to keep minSize intact - if (result.length > 0) { - const smallestGroup = result.reduce( - (min, group) => (min.size > group.size ? group : min) + /** + * @param {Group} group group + * @param {Record} consideredSize size of the group to consider + * @returns {boolean} true, if the group was modified + */ + const removeProblematicNodes = (group, consideredSize = group.size) => { + const problemTypes = getTooSmallTypes(consideredSize, minSize); + if (problemTypes.size > 0) { + // We hit an edge case where the working set is already smaller than minSize + // We merge problematic nodes with the smallest result node to keep minSize intact + const problemNodes = group.popNodes( + n => getNumberOfMatchingSizeTypes(n.size, problemTypes) > 0 ); - for (const node of initialGroup.nodes) smallestGroup.nodes.push(node); - smallestGroup.nodes.sort((a, b) => { - if (a.key < b.key) return -1; - if (a.key > b.key) return 1; - return 0; - }); - } else { - // There are no other nodes - // We use all nodes and have to accept that it's smaller than minSize - result.push(initialGroup); + if (problemNodes === undefined) return false; + // Only merge it with result nodes that have the problematic size type + const possibleResultGroups = result.filter( + n => getNumberOfMatchingSizeTypes(n.size, problemTypes) > 0 + ); + if (possibleResultGroups.length > 0) { + const bestGroup = possibleResultGroups.reduce((min, group) => { + const minMatches = getNumberOfMatchingSizeTypes(min, problemTypes); + const groupMatches = getNumberOfMatchingSizeTypes( + group, + problemTypes + ); + if (minMatches !== groupMatches) + return minMatches < groupMatches ? group : min; + if ( + selectiveSizeSum(min.size, problemTypes) > + selectiveSizeSum(group.size, problemTypes) + ) + return group; + return min; + }); + for (const node of problemNodes) bestGroup.nodes.push(node); + bestGroup.nodes.sort((a, b) => { + if (a.key < b.key) return -1; + if (a.key > b.key) return 1; + return 0; + }); + } else { + // There are no other nodes with the same size types + // We create a new group and have to accept that it's smaller than minSize + result.push(new Group(problemNodes, null)); + } + return true; } - } else { + return false; + }; + + if (initialGroup.nodes.length > 0) { const queue = [initialGroup]; while (queue.length) { - const group = queue.pop(); + const group = /** @type {Group} */ (queue.pop()); // only groups bigger than maxSize need to be splitted - if (group.size < maxSize) { + if (!isTooBig(group.size, maxSize)) { result.push(group); continue; } + // If the group is already too small + // we try to work only with the unproblematic nodes + if (removeProblematicNodes(group)) { + // This changed something, so we try this group again + queue.push(group); + continue; + } // find unsplittable area from left and right // going minSize from left and right // at least one node need to be included otherwise we get stuck - let left = 0; - let leftSize = 0; - while (leftSize <= minSize) { - leftSize += group.nodes[left].size; + let left = 1; + const leftSize = Object.create(null); + addSizeTo(leftSize, group.nodes[0].size); + while (left < group.nodes.length && isTooSmall(leftSize, minSize)) { + addSizeTo(leftSize, group.nodes[left].size); left++; } - let right = group.nodes.length - 1; - let rightSize = 0; - while (rightSize <= minSize) { - rightSize += group.nodes[right].size; + let right = group.nodes.length - 2; + const rightSize = Object.create(null); + addSizeTo(rightSize, group.nodes[group.nodes.length - 1].size); + while (right >= 0 && isTooSmall(rightSize, minSize)) { + addSizeTo(rightSize, group.nodes[right].size); right--; } + // left v v right + // [ O O O ] O O O [ O O O ] + // ^^^^^^^^^ leftSize + // rightSize ^^^^^^^^^ + // leftSize > minSize + // rightSize > minSize + + // Perfect split: [ O O O ] [ O O O ] + // right === left - 1 + if (left - 1 > right) { + // We try to remove some problematic nodes to "fix" that + let prevSize; + if (right < group.nodes.length - left) { + subtractSizeFrom(rightSize, group.nodes[right + 1].size); + prevSize = rightSize; + } else { + subtractSizeFrom(leftSize, group.nodes[left - 1].size); + prevSize = leftSize; + } + if (removeProblematicNodes(group, prevSize)) { + // This changed something, so we try this group again + queue.push(group); + continue; + } // can't split group while holding minSize // because minSize is preferred of maxSize we return - // the group here even while it's too big + // the problematic nodes as result here even while it's too big // To avoid this make sure maxSize > minSize * 3 result.push(group); continue; @@ -210,38 +441,67 @@ module.exports = ({ maxSize, minSize, items, getSize, getKey }) => { // we look for best split point // we split at the minimum similarity // here key space is separated the most - let best = left - 1; - let bestSimilarity = group.similarities[best]; - for (let i = left; i <= right; i++) { - const similarity = group.similarities[i]; - if (similarity < bestSimilarity) { - best = i; + // But we also need to make sure to not create too small groups + let best = -1; + let bestSimilarity = Infinity; + let pos = left; + const rightSize = sumSize(group.nodes.slice(pos)); + + // pos v v right + // [ O O O ] O O O [ O O O ] + // ^^^^^^^^^ leftSize + // rightSize ^^^^^^^^^^^^^^^ + + while (pos <= right + 1) { + const similarity = /** @type {number[]} */ (group.similarities)[ + pos - 1 + ]; + if ( + similarity < bestSimilarity && + !isTooSmall(leftSize, minSize) && + !isTooSmall(rightSize, minSize) + ) { + best = pos; bestSimilarity = similarity; } + addSizeTo(leftSize, group.nodes[pos].size); + subtractSizeFrom(rightSize, group.nodes[pos].size); + pos++; + } + if (best < 0) { + // This can't happen + // but if that assumption is wrong + // fallback to a big group + result.push(group); + continue; } - left = best + 1; - right = best; + left = best; + right = best - 1; } // create two new groups for left and right area // and queue them up const rightNodes = [group.nodes[right + 1]]; /** @type {number[]} */ - const rightSimilaries = []; + const rightSimilarities = []; for (let i = right + 2; i < group.nodes.length; i++) { - rightSimilaries.push(group.similarities[i - 1]); + rightSimilarities.push( + /** @type {number[]} */ (group.similarities)[i - 1] + ); rightNodes.push(group.nodes[i]); } - queue.push(new Group(rightNodes, rightSimilaries)); + queue.push(new Group(rightNodes, rightSimilarities)); const leftNodes = [group.nodes[0]]; /** @type {number[]} */ - const leftSimilaries = []; + const leftSimilarities = []; for (let i = 1; i < left; i++) { - leftSimilaries.push(group.similarities[i - 1]); + leftSimilarities.push( + /** @type {number[]} */ (group.similarities)[i - 1] + ); leftNodes.push(group.nodes[i]); } - queue.push(new Group(leftNodes, leftSimilaries)); + queue.push(new Group(leftNodes, leftSimilarities)); } } } @@ -254,21 +514,27 @@ module.exports = ({ maxSize, minSize, items, getSize, getKey }) => { }); // give every group a name + const usedNames = new Set(); for (let i = 0; i < result.length; i++) { const group = result[i]; - const first = group.nodes[0]; - const last = group.nodes[group.nodes.length - 1]; - let name = getName(first.key, last.key); - group.key = name; + if (group.nodes.length === 1) { + group.key = group.nodes[0].key; + } else { + const first = group.nodes[0]; + const last = group.nodes[group.nodes.length - 1]; + const name = getName(first.key, last.key, usedNames); + group.key = name; + } } // return the results - return result.map(group => { - /** @type {GroupedItems} */ - return { - key: group.key, - items: group.nodes.map(node => node.item), - size: group.size - }; - }); + return result.map( + group => + /** @type {GroupedItems} */ + ({ + key: group.key, + items: group.nodes.map(node => node.item), + size: group.size + }) + ); }; diff --git a/lib/util/extractUrlAndGlobal.js b/lib/util/extractUrlAndGlobal.js new file mode 100644 index 00000000000..ade0a7cf25c --- /dev/null +++ b/lib/util/extractUrlAndGlobal.js @@ -0,0 +1,18 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Sam Chen @chenxsan +*/ + +"use strict"; + +/** + * @param {string} urlAndGlobal the script request + * @returns {string[]} script url and its global variable + */ +module.exports = function extractUrlAndGlobal(urlAndGlobal) { + const index = urlAndGlobal.indexOf("@"); + if (index <= 0 || index === urlAndGlobal.length - 1) { + throw new Error(`Invalid request "${urlAndGlobal}"`); + } + return [urlAndGlobal.substring(index + 1), urlAndGlobal.substring(0, index)]; +}; diff --git a/lib/util/findGraphRoots.js b/lib/util/findGraphRoots.js new file mode 100644 index 00000000000..3db4c146bb3 --- /dev/null +++ b/lib/util/findGraphRoots.js @@ -0,0 +1,231 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const NO_MARKER = 0; +const IN_PROGRESS_MARKER = 1; +const DONE_MARKER = 2; +const DONE_MAYBE_ROOT_CYCLE_MARKER = 3; +const DONE_AND_ROOT_MARKER = 4; + +/** + * @template T + */ +class Node { + /** + * @param {T} item the value of the node + */ + constructor(item) { + this.item = item; + /** @type {Set>} */ + this.dependencies = new Set(); + this.marker = NO_MARKER; + /** @type {Cycle | undefined} */ + this.cycle = undefined; + this.incoming = 0; + } +} + +/** + * @template T + */ +class Cycle { + constructor() { + /** @type {Set>} */ + this.nodes = new Set(); + } +} + +/** + * @template T + * @typedef {object} StackEntry + * @property {Node} node + * @property {Node[]} openEdges + */ + +/** + * @template T + * @param {Iterable} items list of items + * @param {(item: T) => Iterable} getDependencies function to get dependencies of an item (items that are not in list are ignored) + * @returns {Iterable} graph roots of the items + */ +module.exports = (items, getDependencies) => { + /** @type {Map>} */ + const itemToNode = new Map(); + for (const item of items) { + const node = new Node(item); + itemToNode.set(item, node); + } + + // early exit when there is only a single item + if (itemToNode.size <= 1) return items; + + // grab all the dependencies + for (const node of itemToNode.values()) { + for (const dep of getDependencies(node.item)) { + const depNode = itemToNode.get(dep); + if (depNode !== undefined) { + node.dependencies.add(depNode); + } + } + } + + // Set of current root modules + // items will be removed if a new reference to it has been found + /** @type {Set>} */ + const roots = new Set(); + + // Set of current cycles without references to it + // cycles will be removed if a new reference to it has been found + // that is not part of the cycle + /** @type {Set>} */ + const rootCycles = new Set(); + + // For all non-marked nodes + for (const selectedNode of itemToNode.values()) { + if (selectedNode.marker === NO_MARKER) { + // deep-walk all referenced modules + // in a non-recursive way + + // start by entering the selected node + selectedNode.marker = IN_PROGRESS_MARKER; + + // keep a stack to avoid recursive walk + /** @type {StackEntry[]} */ + const stack = [ + { + node: selectedNode, + openEdges: Array.from(selectedNode.dependencies) + } + ]; + + // process the top item until stack is empty + while (stack.length > 0) { + const topOfStack = stack[stack.length - 1]; + + // Are there still edges unprocessed in the current node? + if (topOfStack.openEdges.length > 0) { + // Process one dependency + const dependency = + /** @type {Node} */ + (topOfStack.openEdges.pop()); + switch (dependency.marker) { + case NO_MARKER: + // dependency has not be visited yet + // mark it as in-progress and recurse + stack.push({ + node: dependency, + openEdges: Array.from(dependency.dependencies) + }); + dependency.marker = IN_PROGRESS_MARKER; + break; + case IN_PROGRESS_MARKER: { + // It's a in-progress cycle + let cycle = dependency.cycle; + if (!cycle) { + cycle = new Cycle(); + cycle.nodes.add(dependency); + dependency.cycle = cycle; + } + // set cycle property for each node in the cycle + // if nodes are already part of a cycle + // we merge the cycles to a shared cycle + for ( + let i = stack.length - 1; + stack[i].node !== dependency; + i-- + ) { + const node = stack[i].node; + if (node.cycle) { + if (node.cycle !== cycle) { + // merge cycles + for (const cycleNode of node.cycle.nodes) { + cycleNode.cycle = cycle; + cycle.nodes.add(cycleNode); + } + } + } else { + node.cycle = cycle; + cycle.nodes.add(node); + } + } + // don't recurse into dependencies + // these are already on the stack + break; + } + case DONE_AND_ROOT_MARKER: + // This node has be visited yet and is currently a root node + // But as this is a new reference to the node + // it's not really a root + // so we have to convert it to a normal node + dependency.marker = DONE_MARKER; + roots.delete(dependency); + break; + case DONE_MAYBE_ROOT_CYCLE_MARKER: + // This node has be visited yet and + // is maybe currently part of a completed root cycle + // we found a new reference to the cycle + // so it's not really a root cycle + // remove the cycle from the root cycles + // and convert it to a normal node + rootCycles.delete(/** @type {Cycle} */ (dependency.cycle)); + dependency.marker = DONE_MARKER; + break; + // DONE_MARKER: nothing to do, don't recurse into dependencies + } + } else { + // All dependencies of the current node has been visited + // we leave the node + stack.pop(); + topOfStack.node.marker = DONE_MARKER; + } + } + const cycle = selectedNode.cycle; + if (cycle) { + for (const node of cycle.nodes) { + node.marker = DONE_MAYBE_ROOT_CYCLE_MARKER; + } + rootCycles.add(cycle); + } else { + selectedNode.marker = DONE_AND_ROOT_MARKER; + roots.add(selectedNode); + } + } + } + + // Extract roots from root cycles + // We take the nodes with most incoming edges + // inside of the cycle + for (const cycle of rootCycles) { + let max = 0; + /** @type {Set>} */ + const cycleRoots = new Set(); + const nodes = cycle.nodes; + for (const node of nodes) { + for (const dep of node.dependencies) { + if (nodes.has(dep)) { + dep.incoming++; + if (dep.incoming < max) continue; + if (dep.incoming > max) { + cycleRoots.clear(); + max = dep.incoming; + } + cycleRoots.add(dep); + } + } + } + for (const cycleRoot of cycleRoots) { + roots.add(cycleRoot); + } + } + + // When roots were found, return them + if (roots.size > 0) { + return Array.from(roots, r => r.item); + } + + throw new Error("Implementation of findGraphRoots is broken"); +}; diff --git a/lib/util/fs.js b/lib/util/fs.js new file mode 100644 index 00000000000..7cf4a4abf85 --- /dev/null +++ b/lib/util/fs.js @@ -0,0 +1,651 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const path = require("path"); + +/** @typedef {import("../../declarations/WebpackOptions").WatchOptions} WatchOptions */ +/** @typedef {import("../FileSystemInfo").FileSystemInfoEntry} FileSystemInfoEntry */ + +/** + * @template T + * @typedef {object} IStatsBase + * @property {() => boolean} isFile + * @property {() => boolean} isDirectory + * @property {() => boolean} isBlockDevice + * @property {() => boolean} isCharacterDevice + * @property {() => boolean} isSymbolicLink + * @property {() => boolean} isFIFO + * @property {() => boolean} isSocket + * @property {T} dev + * @property {T} ino + * @property {T} mode + * @property {T} nlink + * @property {T} uid + * @property {T} gid + * @property {T} rdev + * @property {T} size + * @property {T} blksize + * @property {T} blocks + * @property {T} atimeMs + * @property {T} mtimeMs + * @property {T} ctimeMs + * @property {T} birthtimeMs + * @property {Date} atime + * @property {Date} mtime + * @property {Date} ctime + * @property {Date} birthtime + */ + +/** + * @typedef {IStatsBase} IStats + */ + +/** + * @typedef {IStatsBase & { atimeNs: bigint, mtimeNs: bigint, ctimeNs: bigint, birthtimeNs: bigint }} IBigIntStats + */ + +/** + * @typedef {object} Dirent + * @property {() => boolean} isFile + * @property {() => boolean} isDirectory + * @property {() => boolean} isBlockDevice + * @property {() => boolean} isCharacterDevice + * @property {() => boolean} isSymbolicLink + * @property {() => boolean} isFIFO + * @property {() => boolean} isSocket + * @property {string} name + * @property {string} path + */ + +/** @typedef {string | number | boolean | null} JsonPrimitive */ +/** @typedef {JsonValue[]} JsonArray */ +/** @typedef {{[Key in string]: JsonValue} & {[Key in string]?: JsonValue | undefined}} JsonObject */ +/** @typedef {JsonPrimitive | JsonObject | JsonArray} JsonValue */ + +/** @typedef {(err: NodeJS.ErrnoException | null) => void} NoParamCallback */ +/** @typedef {(err: NodeJS.ErrnoException | null, result?: string) => void} StringCallback */ +/** @typedef {(err: NodeJS.ErrnoException | null, result?: Buffer) => void} BufferCallback */ +/** @typedef {(err: NodeJS.ErrnoException | null, result?: string | Buffer) => void} StringOrBufferCallback */ +/** @typedef {(err: NodeJS.ErrnoException | null, result?: string[]) => void} ReaddirStringCallback */ +/** @typedef {(err: NodeJS.ErrnoException | null, result?: Buffer[]) => void} ReaddirBufferCallback */ +/** @typedef {(err: NodeJS.ErrnoException | null, result?: string[] | Buffer[]) => void} ReaddirStringOrBufferCallback */ +/** @typedef {(err: NodeJS.ErrnoException | null, result?: Dirent[]) => void} ReaddirDirentCallback */ +/** @typedef {(err: NodeJS.ErrnoException | null, result?: IStats) => void} StatsCallback */ +/** @typedef {(err: NodeJS.ErrnoException | null, result?: IBigIntStats) => void} BigIntStatsCallback */ +/** @typedef {(err: NodeJS.ErrnoException | null, result?: IStats | IBigIntStats) => void} StatsOrBigIntStatsCallback */ +/** @typedef {(err: NodeJS.ErrnoException | null, result?: number) => void} NumberCallback */ +/** @typedef {(err: NodeJS.ErrnoException | Error | null, result?: JsonObject) => void} ReadJsonCallback */ + +/** @typedef {Map} TimeInfoEntries */ + +/** + * @typedef {object} WatcherInfo + * @property {Set | null} changes get current aggregated changes that have not yet send to callback + * @property {Set | null} removals get current aggregated removals that have not yet send to callback + * @property {TimeInfoEntries} fileTimeInfoEntries get info about files + * @property {TimeInfoEntries} contextTimeInfoEntries get info about directories + */ + +/** @typedef {Set} Changes */ +/** @typedef {Set} Removals */ + +// TODO webpack 6 deprecate missing getInfo +/** + * @typedef {object} Watcher + * @property {() => void} close closes the watcher and all underlying file watchers + * @property {() => void} pause closes the watcher, but keeps underlying file watchers alive until the next watch call + * @property {(() => Changes | null)=} getAggregatedChanges get current aggregated changes that have not yet send to callback + * @property {(() => Removals | null)=} getAggregatedRemovals get current aggregated removals that have not yet send to callback + * @property {() => TimeInfoEntries} getFileTimeInfoEntries get info about files + * @property {() => TimeInfoEntries} getContextTimeInfoEntries get info about directories + * @property {() => WatcherInfo=} getInfo get info about timestamps and changes + */ + +/** + * @callback WatchMethod + * @param {Iterable} files watched files + * @param {Iterable} directories watched directories + * @param {Iterable} missing watched existence entries + * @param {number} startTime timestamp of start time + * @param {WatchOptions} options options object + * @param {(err: Error | null, timeInfoEntries1?: TimeInfoEntries, timeInfoEntries2?: TimeInfoEntries, changes?: Changes, removals?: Removals) => void} callback aggregated callback + * @param {(value: string, num: number) => void} callbackUndelayed callback when the first change was detected + * @returns {Watcher} a watcher + */ + +// TODO webpack 6 make optional methods required and avoid using non standard methods like `join`, `relative`, `dirname`, move IntermediateFileSystemExtras methods to InputFilesystem or OutputFilesystem + +/** + * @typedef {string | Buffer | URL} PathLike + */ + +/** + * @typedef {PathLike | number} PathOrFileDescriptor + */ + +/** + * @typedef {object} ObjectEncodingOptions + * @property {BufferEncoding | null | undefined=} encoding + */ + +/** + * @typedef {{ + * (path: PathOrFileDescriptor, options: ({ encoding?: null | undefined, flag?: string | undefined } & import("events").Abortable) | undefined | null, callback: BufferCallback): void; + * (path: PathOrFileDescriptor, options: ({ encoding: BufferEncoding, flag?: string | undefined } & import("events").Abortable) | BufferEncoding, callback: StringCallback): void; + * (path: PathOrFileDescriptor, options: (ObjectEncodingOptions & { flag?: string | undefined } & import("events").Abortable) | BufferEncoding | undefined | null, callback: StringOrBufferCallback): void; + * (path: PathOrFileDescriptor, callback: BufferCallback): void; + * }} ReadFile + */ + +/** + * @typedef {{ + * (path: PathOrFileDescriptor, options?: { encoding?: null | undefined, flag?: string | undefined } | null): Buffer; + * (path: PathOrFileDescriptor, options: { encoding: BufferEncoding, flag?: string | undefined } | BufferEncoding): string; + * (path: PathOrFileDescriptor, options?: (ObjectEncodingOptions & { flag?: string | undefined }) | BufferEncoding | null): string | Buffer; + * }} ReadFileSync + */ + +/** + * @typedef {ObjectEncodingOptions | BufferEncoding | undefined | null} EncodingOption + */ + +/** + * @typedef {'buffer'| { encoding: 'buffer' }} BufferEncodingOption + */ + +/** + * @typedef {object} StatOptions + * @property {(boolean | undefined)=} bigint + */ + +/** + * @typedef {object} StatSyncOptions + * @property {(boolean | undefined)=} bigint + * @property {(boolean | undefined)=} throwIfNoEntry + */ + +/** + * @typedef {{ + * (path: PathLike, options: EncodingOption, callback: StringCallback): void; + * (path: PathLike, options: BufferEncodingOption, callback: BufferCallback): void; + * (path: PathLike, options: EncodingOption, callback: StringOrBufferCallback): void; + * (path: PathLike, callback: StringCallback): void; + * }} Readlink + */ + +/** + * @typedef {{ + * (path: PathLike, options?: EncodingOption): string; + * (path: PathLike, options: BufferEncodingOption): Buffer; + * (path: PathLike, options?: EncodingOption): string | Buffer; + * }} ReadlinkSync + */ + +/** + * @typedef {{ + * (path: PathLike, options: { encoding: BufferEncoding | null, withFileTypes?: false | undefined, recursive?: boolean | undefined } | BufferEncoding | undefined | null, callback: ReaddirStringCallback): void; + * (path: PathLike, options: { encoding: 'buffer', withFileTypes?: false | undefined, recursive?: boolean | undefined } | 'buffer', callback: ReaddirBufferCallback): void; + * (path: PathLike, callback: ReaddirStringCallback): void; + * (path: PathLike, options: (ObjectEncodingOptions & { withFileTypes?: false | undefined, recursive?: boolean | undefined }) | BufferEncoding | undefined | null, callback: ReaddirStringOrBufferCallback): void; + * (path: PathLike, options: ObjectEncodingOptions & { withFileTypes: true, recursive?: boolean | undefined }, callback: ReaddirDirentCallback): void; + * }} Readdir + */ + +/** + * @typedef {{ + * (path: PathLike, options?: { encoding: BufferEncoding | null, withFileTypes?: false | undefined, recursive?: boolean | undefined } | BufferEncoding | null): string[]; + * (path: PathLike, options: { encoding: 'buffer', withFileTypes?: false | undefined, recursive?: boolean | undefined } | 'buffer'): Buffer[]; + * (path: PathLike, options?: (ObjectEncodingOptions & { withFileTypes?: false | undefined, recursive?: boolean | undefined }) | BufferEncoding | null): string[] | Buffer[]; + * (path: PathLike, options: ObjectEncodingOptions & { withFileTypes: true, recursive?: boolean | undefined }): Dirent[]; + * }} ReaddirSync + */ + +/** + * @typedef {{ + * (path: PathLike, callback: StatsCallback): void; + * (path: PathLike, options: (StatOptions & { bigint?: false | undefined }) | undefined, callback: StatsCallback): void; + * (path: PathLike, options: StatOptions & { bigint: true }, callback: BigIntStatsCallback): void; + * (path: PathLike, options: StatOptions | undefined, callback: StatsOrBigIntStatsCallback): void; + * }} Stat + */ + +/** + * @typedef {{ + * (path: PathLike, options?: undefined): IStats; + * (path: PathLike, options?: StatSyncOptions & { bigint?: false | undefined, throwIfNoEntry: false }): IStats | undefined; + * (path: PathLike, options: StatSyncOptions & { bigint: true, throwIfNoEntry: false }): IBigIntStats | undefined; + * (path: PathLike, options?: StatSyncOptions & { bigint?: false | undefined }): IStats; + * (path: PathLike, options: StatSyncOptions & { bigint: true }): IBigIntStats; + * (path: PathLike, options: StatSyncOptions & { bigint: boolean, throwIfNoEntry?: false | undefined }): IStats | IBigIntStats; + * (path: PathLike, options?: StatSyncOptions): IStats | IBigIntStats | undefined; + * }} StatSync + */ + +/** + * @typedef {{ + * (path: PathLike, callback: StatsCallback): void; + * (path: PathLike, options: (StatOptions & { bigint?: false | undefined }) | undefined, callback: StatsCallback): void; + * (path: PathLike, options: StatOptions & { bigint: true }, callback: BigIntStatsCallback): void; + * (path: PathLike, options: StatOptions | undefined, callback: StatsOrBigIntStatsCallback): void; + * }} LStat + */ + +/** + * @typedef {{ + * (path: PathLike, options?: undefined): IStats; + * (path: PathLike, options?: StatSyncOptions & { bigint?: false | undefined, throwIfNoEntry: false }): IStats | undefined; + * (path: PathLike, options: StatSyncOptions & { bigint: true, throwIfNoEntry: false }): IBigIntStats | undefined; + * (path: PathLike, options?: StatSyncOptions & { bigint?: false | undefined }): IStats; + * (path: PathLike, options: StatSyncOptions & { bigint: true }): IBigIntStats; + * (path: PathLike, options: StatSyncOptions & { bigint: boolean, throwIfNoEntry?: false | undefined }): IStats | IBigIntStats; + * (path: PathLike, options?: StatSyncOptions): IStats | IBigIntStats | undefined; + * }} LStatSync + */ + +/** + * @typedef {{ + * (path: PathLike, options: EncodingOption, callback: StringCallback): void; + * (path: PathLike, options: BufferEncodingOption, callback: BufferCallback): void; + * (path: PathLike, options: EncodingOption, callback: StringOrBufferCallback): void; + * (path: PathLike, callback: StringCallback): void; + * }} RealPath + */ + +/** + * @typedef {{ + * (path: PathLike, options?: EncodingOption): string; + * (path: PathLike, options: BufferEncodingOption): Buffer; + * (path: PathLike, options?: EncodingOption): string | Buffer; + * }} RealPathSync + */ + +/** + * @typedef {(pathOrFileDescriptor: PathOrFileDescriptor, callback: ReadJsonCallback) => void} ReadJson + */ + +/** + * @typedef {(pathOrFileDescriptor: PathOrFileDescriptor) => JsonObject} ReadJsonSync + */ + +/** + * @typedef {(value?: string | string[] | Set) => void} Purge + */ + +/** + * @typedef {object} InputFileSystem + * @property {ReadFile} readFile + * @property {ReadFileSync=} readFileSync + * @property {Readlink} readlink + * @property {ReadlinkSync=} readlinkSync + * @property {Readdir} readdir + * @property {ReaddirSync=} readdirSync + * @property {Stat} stat + * @property {StatSync=} statSync + * @property {LStat=} lstat + * @property {LStatSync=} lstatSync + * @property {RealPath=} realpath + * @property {RealPathSync=} realpathSync + * @property {ReadJson=} readJson + * @property {ReadJsonSync=} readJsonSync + * @property {Purge=} purge + * @property {((path1: string, path2: string) => string)=} join + * @property {((from: string, to: string) => string)=} relative + * @property {((dirname: string) => string)=} dirname + */ + +/** + * @typedef {number | string} Mode + */ + +/** + * @typedef {(ObjectEncodingOptions & import("events").Abortable & { mode?: Mode | undefined, flag?: string | undefined, flush?: boolean | undefined }) | BufferEncoding | null} WriteFileOptions + */ + +/** + * @typedef {{ + * (file: PathOrFileDescriptor, data: string | NodeJS.ArrayBufferView, options: WriteFileOptions, callback: NoParamCallback): void; + * (file: PathOrFileDescriptor, data: string | NodeJS.ArrayBufferView, callback: NoParamCallback): void; + * }} WriteFile + */ + +/** + * @typedef {{ recursive?: boolean | undefined, mode?: Mode | undefined }} MakeDirectoryOptions + */ + +/** + * @typedef {{ + * (file: PathLike, options: MakeDirectoryOptions & { recursive: true }, callback: StringCallback): void; + * (file: PathLike, options: Mode | (MakeDirectoryOptions & { recursive?: false | undefined; }) | null | undefined, callback: NoParamCallback): void; + * (file: PathLike, options: Mode | MakeDirectoryOptions | null | undefined, callback: StringCallback): void; + * (file: PathLike, callback: NoParamCallback): void; + * }} Mkdir + */ + +/** + * @typedef {{ maxRetries?: number | undefined, recursive?: boolean | undefined, retryDelay?: number | undefined }} RmDirOptions + */ + +/** + * @typedef {{ + * (file: PathLike, callback: NoParamCallback): void; + * (file: PathLike, options: RmDirOptions, callback: NoParamCallback): void; + * }} Rmdir + */ + +/** + * @typedef {(pathLike: PathLike, callback: NoParamCallback) => void} Unlink + */ + +/** + * @typedef {object} OutputFileSystem + * @property {WriteFile} writeFile + * @property {Mkdir} mkdir + * @property {Readdir=} readdir + * @property {Rmdir=} rmdir + * @property {Unlink=} unlink + * @property {Stat} stat + * @property {LStat=} lstat + * @property {ReadFile} readFile + * @property {((path1: string, path2: string) => string)=} join + * @property {((from: string, to: string) => string)=} relative + * @property {((dirname: string) => string)=} dirname + */ + +/** + * @typedef {object} WatchFileSystem + * @property {WatchMethod} watch + */ + +/** + * @typedef {{ + * (path: PathLike, options: MakeDirectoryOptions & { recursive: true }): string | undefined; + * (path: PathLike, options?: Mode | (MakeDirectoryOptions & { recursive?: false | undefined }) | null): void; + * (path: PathLike, options?: Mode | MakeDirectoryOptions | null): string | undefined; + * }} MkdirSync + */ + +/** + * @typedef {object} StreamOptions + * @property {(string | undefined)=} flags + * @property {(BufferEncoding | undefined)} encoding + * @property {(number | EXPECTED_ANY | undefined)=} fd + * @property {(number | undefined)=} mode + * @property {(boolean | undefined)=} autoClose + * @property {(boolean | undefined)=} emitClose + * @property {(number | undefined)=} start + * @property {(AbortSignal | null | undefined)=} signal + */ + +/** + * @typedef {object} FSImplementation + * @property {((...args: EXPECTED_ANY[]) => EXPECTED_ANY)=} open + * @property {((...args: EXPECTED_ANY[]) => EXPECTED_ANY)=} close + */ + +/** + * @typedef {FSImplementation & { write: (...args: EXPECTED_ANY[]) => EXPECTED_ANY; close?: (...args: EXPECTED_ANY[]) => EXPECTED_ANY }} CreateWriteStreamFSImplementation + */ + +/** + * @typedef {StreamOptions & { fs?: CreateWriteStreamFSImplementation | null | undefined }} WriteStreamOptions + */ + +/** + * @typedef {(pathLike: PathLike, result?: BufferEncoding | WriteStreamOptions) => NodeJS.WritableStream} CreateWriteStream + */ + +/** + * @typedef {number | string} OpenMode + */ + +/** + * @typedef {{ + * (file: PathLike, flags: OpenMode | undefined, mode: Mode | undefined | null, callback: NumberCallback): void; + * (file: PathLike, flags: OpenMode | undefined, callback: NumberCallback): void; + * (file: PathLike, callback: NumberCallback): void; + * }} Open + */ + +/** + * @typedef {number | bigint} ReadPosition + */ + +/** + * @typedef {object} ReadSyncOptions + * @property {(number | undefined)=} offset + * @property {(number | undefined)=} length + * @property {(ReadPosition | null | undefined)=} position + */ + +/** + * @template {NodeJS.ArrayBufferView} TBuffer + * @typedef {object} ReadAsyncOptions + * @property {(number | undefined)=} offset + * @property {(number | undefined)=} length + * @property {(ReadPosition | null | undefined)=} position + * @property {TBuffer=} buffer + */ + +/** + * @template {NodeJS.ArrayBufferView} [TBuffer=NodeJS.ArrayBufferView] + * @typedef {{ + * (fd: number, buffer: TBuffer, offset: number, length: number, position: ReadPosition | null, callback: (err: NodeJS.ErrnoException | null, bytesRead: number, buffer: TBuffer) => void): void; + * (fd: number, options: ReadAsyncOptions, callback: (err: NodeJS.ErrnoException | null, bytesRead: number, buffer: TBuffer) => void): void; + * (fd: number, callback: (err: NodeJS.ErrnoException | null, bytesRead: number, buffer: NodeJS.ArrayBufferView) => void): void; + * }} Read + */ + +/** @typedef {(df: number, callback: NoParamCallback) => void} Close */ + +/** @typedef {(a: PathLike, b: PathLike, callback: NoParamCallback) => void} Rename */ + +/** + * @typedef {object} IntermediateFileSystemExtras + * @property {MkdirSync} mkdirSync + * @property {CreateWriteStream} createWriteStream + * @property {Open} open + * @property {Read} read + * @property {Close} close + * @property {Rename} rename + */ + +/** @typedef {InputFileSystem & OutputFileSystem & IntermediateFileSystemExtras} IntermediateFileSystem */ + +/** + * @param {InputFileSystem|OutputFileSystem|undefined} fs a file system + * @param {string} rootPath the root path + * @param {string} targetPath the target path + * @returns {string} location of targetPath relative to rootPath + */ +const relative = (fs, rootPath, targetPath) => { + if (fs && fs.relative) { + return fs.relative(rootPath, targetPath); + } else if (path.posix.isAbsolute(rootPath)) { + return path.posix.relative(rootPath, targetPath); + } else if (path.win32.isAbsolute(rootPath)) { + return path.win32.relative(rootPath, targetPath); + } + throw new Error( + `${rootPath} is neither a posix nor a windows path, and there is no 'relative' method defined in the file system` + ); +}; +module.exports.relative = relative; + +/** + * @param {InputFileSystem|OutputFileSystem|undefined} fs a file system + * @param {string} rootPath a path + * @param {string} filename a filename + * @returns {string} the joined path + */ +const join = (fs, rootPath, filename) => { + if (fs && fs.join) { + return fs.join(rootPath, filename); + } else if (path.posix.isAbsolute(rootPath)) { + return path.posix.join(rootPath, filename); + } else if (path.win32.isAbsolute(rootPath)) { + return path.win32.join(rootPath, filename); + } + throw new Error( + `${rootPath} is neither a posix nor a windows path, and there is no 'join' method defined in the file system` + ); +}; +module.exports.join = join; + +/** + * @param {InputFileSystem|OutputFileSystem|undefined} fs a file system + * @param {string} absPath an absolute path + * @returns {string} the parent directory of the absolute path + */ +const dirname = (fs, absPath) => { + if (fs && fs.dirname) { + return fs.dirname(absPath); + } else if (path.posix.isAbsolute(absPath)) { + return path.posix.dirname(absPath); + } else if (path.win32.isAbsolute(absPath)) { + return path.win32.dirname(absPath); + } + throw new Error( + `${absPath} is neither a posix nor a windows path, and there is no 'dirname' method defined in the file system` + ); +}; +module.exports.dirname = dirname; + +/** + * @param {OutputFileSystem} fs a file system + * @param {string} p an absolute path + * @param {(err?: Error) => void} callback callback function for the error + * @returns {void} + */ +const mkdirp = (fs, p, callback) => { + fs.mkdir(p, err => { + if (err) { + if (err.code === "ENOENT") { + const dir = dirname(fs, p); + if (dir === p) { + callback(err); + return; + } + mkdirp(fs, dir, err => { + if (err) { + callback(err); + return; + } + fs.mkdir(p, err => { + if (err) { + if (err.code === "EEXIST") { + callback(); + return; + } + callback(err); + return; + } + callback(); + }); + }); + return; + } else if (err.code === "EEXIST") { + callback(); + return; + } + callback(err); + return; + } + callback(); + }); +}; +module.exports.mkdirp = mkdirp; + +/** + * @param {IntermediateFileSystem} fs a file system + * @param {string} p an absolute path + * @returns {void} + */ +const mkdirpSync = (fs, p) => { + try { + fs.mkdirSync(p); + } catch (err) { + if (err) { + if (/** @type {NodeJS.ErrnoException} */ (err).code === "ENOENT") { + const dir = dirname(fs, p); + if (dir === p) { + throw err; + } + mkdirpSync(fs, dir); + fs.mkdirSync(p); + return; + } else if (/** @type {NodeJS.ErrnoException} */ (err).code === "EEXIST") { + return; + } + throw err; + } + } +}; +module.exports.mkdirpSync = mkdirpSync; + +/** + * @param {InputFileSystem} fs a file system + * @param {string} p an absolute path + * @param {ReadJsonCallback} callback callback + * @returns {void} + */ +const readJson = (fs, p, callback) => { + if ("readJson" in fs) + return /** @type {NonNullable} */ ( + fs.readJson + )(p, callback); + fs.readFile(p, (err, buf) => { + if (err) return callback(err); + let data; + try { + data = JSON.parse(/** @type {Buffer} */ (buf).toString("utf-8")); + } catch (err1) { + return callback(/** @type {Error} */ (err1)); + } + return callback(null, data); + }); +}; +module.exports.readJson = readJson; + +/** + * @param {InputFileSystem} fs a file system + * @param {string} p an absolute path + * @param {(err: NodeJS.ErrnoException | Error | null, stats?: IStats | string) => void} callback callback + * @returns {void} + */ +const lstatReadlinkAbsolute = (fs, p, callback) => { + let i = 3; + const doReadLink = () => { + fs.readlink(p, (err, target) => { + if (err && --i > 0) { + // It might was just changed from symlink to file + // we retry 2 times to catch this case before throwing the error + return doStat(); + } + if (err) return callback(err); + const value = /** @type {string} */ (target).toString(); + callback(null, join(fs, dirname(fs, p), value)); + }); + }; + const doStat = () => { + if ("lstat" in fs) { + return /** @type {NonNullable} */ (fs.lstat)( + p, + (err, stats) => { + if (err) return callback(err); + if (/** @type {IStats} */ (stats).isSymbolicLink()) { + return doReadLink(); + } + callback(null, stats); + } + ); + } + return fs.stat(p, callback); + }; + if ("lstat" in fs) return doStat(); + doReadLink(); +}; +module.exports.lstatReadlinkAbsolute = lstatReadlinkAbsolute; diff --git a/lib/util/generateDebugId.js b/lib/util/generateDebugId.js new file mode 100644 index 00000000000..bd501f89a2d --- /dev/null +++ b/lib/util/generateDebugId.js @@ -0,0 +1,33 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Alexander Akait @alexander-akait +*/ + +"use strict"; + +const createHash = require("./createHash"); + +/** + * @param {string | Buffer} content content + * @param {string} file file + * @returns {string} generated debug id + */ +module.exports = (content, file) => { + // We need a uuid which is 128 bits so we need 2x 64 bit hashes. + // The first 64 bits is a hash of the source. + const sourceHash = createHash("xxhash64").update(content).digest("hex"); + // The next 64 bits is a hash of the filename and sourceHash + const hash128 = `${sourceHash}${createHash("xxhash64") + .update(file) + .update(sourceHash) + .digest("hex")}`; + + return [ + hash128.slice(0, 8), + hash128.slice(8, 12), + `4${hash128.slice(12, 15)}`, + ((Number.parseInt(hash128.slice(15, 16), 16) & 3) | 8).toString(16) + + hash128.slice(17, 20), + hash128.slice(20, 32) + ].join("-"); +}; diff --git a/lib/util/hash/BatchedHash.js b/lib/util/hash/BatchedHash.js new file mode 100644 index 00000000000..cc030f8bd7d --- /dev/null +++ b/lib/util/hash/BatchedHash.js @@ -0,0 +1,71 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const Hash = require("../Hash"); +const MAX_SHORT_STRING = require("./wasm-hash").MAX_SHORT_STRING; + +class BatchedHash extends Hash { + /** + * @param {Hash} hash hash + */ + constructor(hash) { + super(); + this.string = undefined; + this.encoding = undefined; + this.hash = hash; + } + + /** + * Update hash {@link https://nodejs.org/api/crypto.html#crypto_hash_update_data_inputencoding} + * @param {string|Buffer} data data + * @param {string=} inputEncoding data encoding + * @returns {this} updated hash + */ + update(data, inputEncoding) { + if (this.string !== undefined) { + if ( + typeof data === "string" && + inputEncoding === this.encoding && + this.string.length + data.length < MAX_SHORT_STRING + ) { + this.string += data; + return this; + } + this.hash.update(this.string, this.encoding); + this.string = undefined; + } + if (typeof data === "string") { + if ( + data.length < MAX_SHORT_STRING && + // base64 encoding is not valid since it may contain padding chars + (!inputEncoding || !inputEncoding.startsWith("ba")) + ) { + this.string = data; + this.encoding = inputEncoding; + } else { + this.hash.update(data, inputEncoding); + } + } else { + this.hash.update(data); + } + return this; + } + + /** + * Calculates the digest {@link https://nodejs.org/api/crypto.html#crypto_hash_digest_encoding} + * @param {string=} encoding encoding of the return value + * @returns {string|Buffer} digest + */ + digest(encoding) { + if (this.string !== undefined) { + this.hash.update(this.string, this.encoding); + } + return this.hash.digest(encoding); + } +} + +module.exports = BatchedHash; diff --git a/lib/util/hash/md4.js b/lib/util/hash/md4.js new file mode 100644 index 00000000000..425edc3b9ba --- /dev/null +++ b/lib/util/hash/md4.js @@ -0,0 +1,20 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const create = require("./wasm-hash"); + +// #region wasm code: md4 (../../../assembly/hash/md4.asm.ts) --initialMemory 1 +const md4 = new WebAssembly.Module( + Buffer.from( + // 2154 bytes + "AGFzbQEAAAABCAJgAX8AYAAAAwUEAQAAAAUDAQABBhoFfwFBAAt/AUEAC38BQQALfwFBAAt/AUEACwciBARpbml0AAAGdXBkYXRlAAIFZmluYWwAAwZtZW1vcnkCAAqJEAQmAEGBxpS6BiQBQYnXtv5+JAJB/rnrxXkkA0H2qMmBASQEQQAkAAvQCgEZfyMBIQUjAiECIwMhAyMEIQQDQCAAIAFLBEAgASgCBCIOIAQgAyABKAIAIg8gBSAEIAIgAyAEc3FzampBA3ciCCACIANzcXNqakEHdyEJIAEoAgwiBiACIAggASgCCCIQIAMgAiAJIAIgCHNxc2pqQQt3IgogCCAJc3FzampBE3chCyABKAIUIgcgCSAKIAEoAhAiESAIIAkgCyAJIApzcXNqakEDdyIMIAogC3Nxc2pqQQd3IQ0gASgCHCIJIAsgDCABKAIYIgggCiALIA0gCyAMc3FzampBC3ciEiAMIA1zcXNqakETdyETIAEoAiQiFCANIBIgASgCICIVIAwgDSATIA0gEnNxc2pqQQN3IgwgEiATc3FzampBB3chDSABKAIsIgsgEyAMIAEoAigiCiASIBMgDSAMIBNzcXNqakELdyISIAwgDXNxc2pqQRN3IRMgASgCNCIWIA0gEiABKAIwIhcgDCANIBMgDSASc3FzampBA3ciGCASIBNzcXNqakEHdyEZIBggASgCPCINIBMgGCABKAI4IgwgEiATIBkgEyAYc3FzampBC3ciEiAYIBlzcXNqakETdyITIBIgGXJxIBIgGXFyaiAPakGZ84nUBWpBA3ciGCATIBIgGSAYIBIgE3JxIBIgE3FyaiARakGZ84nUBWpBBXciEiATIBhycSATIBhxcmogFWpBmfOJ1AVqQQl3IhMgEiAYcnEgEiAYcXJqIBdqQZnzidQFakENdyIYIBIgE3JxIBIgE3FyaiAOakGZ84nUBWpBA3ciGSAYIBMgEiAZIBMgGHJxIBMgGHFyaiAHakGZ84nUBWpBBXciEiAYIBlycSAYIBlxcmogFGpBmfOJ1AVqQQl3IhMgEiAZcnEgEiAZcXJqIBZqQZnzidQFakENdyIYIBIgE3JxIBIgE3FyaiAQakGZ84nUBWpBA3ciGSAYIBMgEiAZIBMgGHJxIBMgGHFyaiAIakGZ84nUBWpBBXciEiAYIBlycSAYIBlxcmogCmpBmfOJ1AVqQQl3IhMgEiAZcnEgEiAZcXJqIAxqQZnzidQFakENdyIYIBIgE3JxIBIgE3FyaiAGakGZ84nUBWpBA3ciGSAYIBMgEiAZIBMgGHJxIBMgGHFyaiAJakGZ84nUBWpBBXciEiAYIBlycSAYIBlxcmogC2pBmfOJ1AVqQQl3IhMgEiAZcnEgEiAZcXJqIA1qQZnzidQFakENdyIYIBNzIBJzaiAPakGh1+f2BmpBA3ciDyAYIBMgEiAPIBhzIBNzaiAVakGh1+f2BmpBCXciEiAPcyAYc2ogEWpBodfn9gZqQQt3IhEgEnMgD3NqIBdqQaHX5/YGakEPdyIPIBFzIBJzaiAQakGh1+f2BmpBA3ciECAPIBEgEiAPIBBzIBFzaiAKakGh1+f2BmpBCXciCiAQcyAPc2ogCGpBodfn9gZqQQt3IgggCnMgEHNqIAxqQaHX5/YGakEPdyIMIAhzIApzaiAOakGh1+f2BmpBA3ciDiAMIAggCiAMIA5zIAhzaiAUakGh1+f2BmpBCXciCCAOcyAMc2ogB2pBodfn9gZqQQt3IgcgCHMgDnNqIBZqQaHX5/YGakEPdyIKIAdzIAhzaiAGakGh1+f2BmpBA3ciBiAFaiEFIAIgCiAHIAggBiAKcyAHc2ogC2pBodfn9gZqQQl3IgcgBnMgCnNqIAlqQaHX5/YGakELdyIIIAdzIAZzaiANakGh1+f2BmpBD3dqIQIgAyAIaiEDIAQgB2ohBCABQUBrIQEMAQsLIAUkASACJAIgAyQDIAQkBAsNACAAEAEjACAAaiQAC/8EAgN/AX4jACAAaq1CA4YhBCAAQcgAakFAcSICQQhrIQMgACIBQQFqIQAgAUGAAToAAANAIAAgAklBACAAQQdxGwRAIABBADoAACAAQQFqIQAMAQsLA0AgACACSQRAIABCADcDACAAQQhqIQAMAQsLIAMgBDcDACACEAFBACMBrSIEQv//A4MgBEKAgPz/D4NCEIaEIgRC/4GAgPAfgyAEQoD+g4CA4D+DQgiGhCIEQo+AvIDwgcAHg0IIhiAEQvCBwIeAnoD4AINCBIiEIgRChoyYsODAgYMGfEIEiEKBgoSIkKDAgAGDQid+IARCsODAgYOGjJgwhHw3AwBBCCMCrSIEQv//A4MgBEKAgPz/D4NCEIaEIgRC/4GAgPAfgyAEQoD+g4CA4D+DQgiGhCIEQo+AvIDwgcAHg0IIhiAEQvCBwIeAnoD4AINCBIiEIgRChoyYsODAgYMGfEIEiEKBgoSIkKDAgAGDQid+IARCsODAgYOGjJgwhHw3AwBBECMDrSIEQv//A4MgBEKAgPz/D4NCEIaEIgRC/4GAgPAfgyAEQoD+g4CA4D+DQgiGhCIEQo+AvIDwgcAHg0IIhiAEQvCBwIeAnoD4AINCBIiEIgRChoyYsODAgYMGfEIEiEKBgoSIkKDAgAGDQid+IARCsODAgYOGjJgwhHw3AwBBGCMErSIEQv//A4MgBEKAgPz/D4NCEIaEIgRC/4GAgPAfgyAEQoD+g4CA4D+DQgiGhCIEQo+AvIDwgcAHg0IIhiAEQvCBwIeAnoD4AINCBIiEIgRChoyYsODAgYMGfEIEiEKBgoSIkKDAgAGDQid+IARCsODAgYOGjJgwhHw3AwAL", + "base64" + ) +); +// #endregion + +module.exports = create.bind(null, md4, [], 64, 32); diff --git a/lib/util/hash/wasm-hash.js b/lib/util/hash/wasm-hash.js new file mode 100644 index 00000000000..289d6fb2081 --- /dev/null +++ b/lib/util/hash/wasm-hash.js @@ -0,0 +1,174 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +// 65536 is the size of a wasm memory page +// 64 is the maximum chunk size for every possible wasm hash implementation +// 4 is the maximum number of bytes per char for string encoding (max is utf-8) +// ~3 makes sure that it's always a block of 4 chars, so avoid partially encoded bytes for base64 +const MAX_SHORT_STRING = Math.floor((65536 - 64) / 4) & ~3; + +class WasmHash { + /** + * @param {WebAssembly.Instance} instance wasm instance + * @param {WebAssembly.Instance[]} instancesPool pool of instances + * @param {number} chunkSize size of data chunks passed to wasm + * @param {number} digestSize size of digest returned by wasm + */ + constructor(instance, instancesPool, chunkSize, digestSize) { + const exports = /** @type {EXPECTED_ANY} */ (instance.exports); + exports.init(); + this.exports = exports; + this.mem = Buffer.from(exports.memory.buffer, 0, 65536); + this.buffered = 0; + this.instancesPool = instancesPool; + this.chunkSize = chunkSize; + this.digestSize = digestSize; + } + + reset() { + this.buffered = 0; + this.exports.init(); + } + + /** + * @param {Buffer | string} data data + * @param {BufferEncoding=} encoding encoding + * @returns {this} itself + */ + update(data, encoding) { + if (typeof data === "string") { + while (data.length > MAX_SHORT_STRING) { + this._updateWithShortString(data.slice(0, MAX_SHORT_STRING), encoding); + data = data.slice(MAX_SHORT_STRING); + } + this._updateWithShortString(data, encoding); + return this; + } + this._updateWithBuffer(data); + return this; + } + + /** + * @param {string} data data + * @param {BufferEncoding=} encoding encoding + * @returns {void} + */ + _updateWithShortString(data, encoding) { + const { exports, buffered, mem, chunkSize } = this; + let endPos; + if (data.length < 70) { + if (!encoding || encoding === "utf-8" || encoding === "utf8") { + endPos = buffered; + for (let i = 0; i < data.length; i++) { + const cc = data.charCodeAt(i); + if (cc < 0x80) mem[endPos++] = cc; + else if (cc < 0x800) { + mem[endPos] = (cc >> 6) | 0xc0; + mem[endPos + 1] = (cc & 0x3f) | 0x80; + endPos += 2; + } else { + // bail-out for weird chars + endPos += mem.write(data.slice(i), endPos, encoding); + break; + } + } + } else if (encoding === "latin1") { + endPos = buffered; + for (let i = 0; i < data.length; i++) { + const cc = data.charCodeAt(i); + mem[endPos++] = cc; + } + } else { + endPos = buffered + mem.write(data, buffered, encoding); + } + } else { + endPos = buffered + mem.write(data, buffered, encoding); + } + if (endPos < chunkSize) { + this.buffered = endPos; + } else { + const l = endPos & ~(this.chunkSize - 1); + exports.update(l); + const newBuffered = endPos - l; + this.buffered = newBuffered; + if (newBuffered > 0) mem.copyWithin(0, l, endPos); + } + } + + /** + * @param {Buffer} data data + * @returns {void} + */ + _updateWithBuffer(data) { + const { exports, buffered, mem } = this; + const length = data.length; + if (buffered + length < this.chunkSize) { + data.copy(mem, buffered, 0, length); + this.buffered += length; + } else { + const l = (buffered + length) & ~(this.chunkSize - 1); + if (l > 65536) { + let i = 65536 - buffered; + data.copy(mem, buffered, 0, i); + exports.update(65536); + const stop = l - buffered - 65536; + while (i < stop) { + data.copy(mem, 0, i, i + 65536); + exports.update(65536); + i += 65536; + } + data.copy(mem, 0, i, l - buffered); + exports.update(l - buffered - i); + } else { + data.copy(mem, buffered, 0, l - buffered); + exports.update(l); + } + const newBuffered = length + buffered - l; + this.buffered = newBuffered; + if (newBuffered > 0) data.copy(mem, 0, length - newBuffered, length); + } + } + + /** + * @param {BufferEncoding} type type + * @returns {Buffer | string} digest + */ + digest(type) { + const { exports, buffered, mem, digestSize } = this; + exports.final(buffered); + this.instancesPool.push(this); + const hex = mem.toString("latin1", 0, digestSize); + if (type === "hex") return hex; + if (type === "binary" || !type) return Buffer.from(hex, "hex"); + return Buffer.from(hex, "hex").toString(type); + } +} + +/** + * @param {WebAssembly.Module} wasmModule wasm module + * @param {WasmHash[]} instancesPool pool of instances + * @param {number} chunkSize size of data chunks passed to wasm + * @param {number} digestSize size of digest returned by wasm + * @returns {WasmHash} wasm hash + */ +const create = (wasmModule, instancesPool, chunkSize, digestSize) => { + if (instancesPool.length > 0) { + const old = /** @type {WasmHash} */ (instancesPool.pop()); + old.reset(); + return old; + } + + return new WasmHash( + new WebAssembly.Instance(wasmModule), + instancesPool, + chunkSize, + digestSize + ); +}; + +module.exports = create; +module.exports.MAX_SHORT_STRING = MAX_SHORT_STRING; diff --git a/lib/util/hash/xxhash64.js b/lib/util/hash/xxhash64.js new file mode 100644 index 00000000000..b9262b8753c --- /dev/null +++ b/lib/util/hash/xxhash64.js @@ -0,0 +1,20 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const create = require("./wasm-hash"); + +// #region wasm code: xxhash64 (../../../assembly/hash/xxhash64.asm.ts) --initialMemory 1 +const xxhash64 = new WebAssembly.Module( + Buffer.from( + // 1160 bytes + "AGFzbQEAAAABCAJgAX8AYAAAAwQDAQAABQMBAAEGGgV+AUIAC34BQgALfgFCAAt+AUIAC34BQgALByIEBGluaXQAAAZ1cGRhdGUAAQVmaW5hbAACBm1lbW9yeQIACqgIAzAAQtbrgu7q/Yn14AAkAELP1tO+0ser2UIkAUIAJAJC+erQ0OfJoeThACQDQgAkBAvUAQIBfwR+IABFBEAPCyMEIACtfCQEIwAhAiMBIQMjAiEEIwMhBQNAIAIgASkDAELP1tO+0ser2UJ+fEIfiUKHla+vmLbem55/fiECIAMgASkDCELP1tO+0ser2UJ+fEIfiUKHla+vmLbem55/fiEDIAQgASkDEELP1tO+0ser2UJ+fEIfiUKHla+vmLbem55/fiEEIAUgASkDGELP1tO+0ser2UJ+fEIfiUKHla+vmLbem55/fiEFIAFBIGoiASAASQ0ACyACJAAgAyQBIAQkAiAFJAMLngYCAn8CfiMEQgBSBH4jAEIBiSMBQgeJfCMCQgyJfCMDQhKJfCMAQs/W077Sx6vZQn5CH4lCh5Wvr5i23puef36FQoeVr6+Ytt6bnn9+Qp2jteqDsY2K+gB9IwFCz9bTvtLHq9lCfkIfiUKHla+vmLbem55/foVCh5Wvr5i23puef35CnaO16oOxjYr6AH0jAkLP1tO+0ser2UJ+Qh+JQoeVr6+Ytt6bnn9+hUKHla+vmLbem55/fkKdo7Xqg7GNivoAfSMDQs/W077Sx6vZQn5CH4lCh5Wvr5i23puef36FQoeVr6+Ytt6bnn9+Qp2jteqDsY2K+gB9BULFz9my8eW66icLIwQgAK18fCEDA0AgAUEIaiICIABNBEAgAyABKQMAQs/W077Sx6vZQn5CH4lCh5Wvr5i23puef36FQhuJQoeVr6+Ytt6bnn9+Qp2jteqDsY2K+gB9IQMgAiEBDAELCyABQQRqIgIgAE0EQCADIAE1AgBCh5Wvr5i23puef36FQheJQs/W077Sx6vZQn5C+fPd8Zn2masWfCEDIAIhAQsDQCAAIAFHBEAgAyABMQAAQsXP2bLx5brqJ36FQguJQoeVr6+Ytt6bnn9+IQMgAUEBaiEBDAELC0EAIAMgA0IhiIVCz9bTvtLHq9lCfiIDQh2IIAOFQvnz3fGZ9pmrFn4iA0IgiCADhSIDQiCIIgRC//8Dg0IghiAEQoCA/P8Pg0IQiIQiBEL/gYCA8B+DQhCGIARCgP6DgIDgP4NCCIiEIgRCj4C8gPCBwAeDQgiGIARC8IHAh4CegPgAg0IEiIQiBEKGjJiw4MCBgwZ8QgSIQoGChIiQoMCAAYNCJ34gBEKw4MCBg4aMmDCEfDcDAEEIIANC/////w+DIgNC//8Dg0IghiADQoCA/P8Pg0IQiIQiA0L/gYCA8B+DQhCGIANCgP6DgIDgP4NCCIiEIgNCj4C8gPCBwAeDQgiGIANC8IHAh4CegPgAg0IEiIQiA0KGjJiw4MCBgwZ8QgSIQoGChIiQoMCAAYNCJ34gA0Kw4MCBg4aMmDCEfDcDAAs=", + "base64" + ) +); +// #endregion + +module.exports = create.bind(null, xxhash64, [], 32, 16); diff --git a/lib/util/identifier.js b/lib/util/identifier.js index 186bc064e53..99bff981bc8 100644 --- a/lib/util/identifier.js +++ b/lib/util/identifier.js @@ -1,103 +1,400 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php +*/ + "use strict"; + const path = require("path"); +const WINDOWS_ABS_PATH_REGEXP = /^[a-zA-Z]:[\\/]/; +const SEGMENTS_SPLIT_REGEXP = /([|!])/; +const WINDOWS_PATH_SEPARATOR_REGEXP = /\\/g; + /** - * @typedef {Object} MakeRelativePathsCache - * @property {Map>=} relativePaths + * @param {string} relativePath relative path + * @returns {string} request */ +const relativePathToRequest = relativePath => { + if (relativePath === "") return "./."; + if (relativePath === "..") return "../."; + if (relativePath.startsWith("../")) return relativePath; + return `./${relativePath}`; +}; /** - * - * @param {string} maybeAbsolutePath path to check - * @returns {boolean} returns true if path is "Absolute Path"-like + * @param {string} context context for relative path + * @param {string} maybeAbsolutePath path to make relative + * @returns {string} relative path in request style */ -const looksLikeAbsolutePath = maybeAbsolutePath => { - if (/^\/.*\/$/.test(maybeAbsolutePath)) { - // this 'path' is actually a regexp generated by dynamic requires. - // Don't treat it as an absolute path. - return false; +const absoluteToRequest = (context, maybeAbsolutePath) => { + if (maybeAbsolutePath[0] === "/") { + if ( + maybeAbsolutePath.length > 1 && + maybeAbsolutePath[maybeAbsolutePath.length - 1] === "/" + ) { + // this 'path' is actually a regexp generated by dynamic requires. + // Don't treat it as an absolute path. + return maybeAbsolutePath; + } + + const querySplitPos = maybeAbsolutePath.indexOf("?"); + let resource = + querySplitPos === -1 + ? maybeAbsolutePath + : maybeAbsolutePath.slice(0, querySplitPos); + resource = relativePathToRequest(path.posix.relative(context, resource)); + return querySplitPos === -1 + ? resource + : resource + maybeAbsolutePath.slice(querySplitPos); } - return /^(?:[a-z]:\\|\/)/i.test(maybeAbsolutePath); + + if (WINDOWS_ABS_PATH_REGEXP.test(maybeAbsolutePath)) { + const querySplitPos = maybeAbsolutePath.indexOf("?"); + let resource = + querySplitPos === -1 + ? maybeAbsolutePath + : maybeAbsolutePath.slice(0, querySplitPos); + resource = path.win32.relative(context, resource); + if (!WINDOWS_ABS_PATH_REGEXP.test(resource)) { + resource = relativePathToRequest( + resource.replace(WINDOWS_PATH_SEPARATOR_REGEXP, "/") + ); + } + return querySplitPos === -1 + ? resource + : resource + maybeAbsolutePath.slice(querySplitPos); + } + + // not an absolute path + return maybeAbsolutePath; +}; + +/** + * @param {string} context context for relative path + * @param {string} relativePath path + * @returns {string} absolute path + */ +const requestToAbsolute = (context, relativePath) => { + if (relativePath.startsWith("./") || relativePath.startsWith("../")) + return path.join(context, relativePath); + return relativePath; +}; + +/** @typedef {EXPECTED_OBJECT} AssociatedObjectForCache */ + +/** + * @template T + * @typedef {(value: string, cache?: AssociatedObjectForCache) => T} MakeCacheableResult + */ + +/** + * @template T + * @typedef {(value: string) => T} BindCacheResultFn + */ + +/** + * @template T + * @typedef {(cache: AssociatedObjectForCache) => BindCacheResultFn} BindCache + */ + +/** + * @template T + * @param {((value: string) => T)} realFn real function + * @returns {MakeCacheableResult & { bindCache: BindCache }} cacheable function + */ +const makeCacheable = realFn => { + /** + * @template T + * @typedef {Map} CacheItem + */ + /** @type {WeakMap>} */ + const cache = new WeakMap(); + + /** + * @param {AssociatedObjectForCache} associatedObjectForCache an object to which the cache will be attached + * @returns {CacheItem} cache item + */ + const getCache = associatedObjectForCache => { + const entry = cache.get(associatedObjectForCache); + if (entry !== undefined) return entry; + /** @type {Map} */ + const map = new Map(); + cache.set(associatedObjectForCache, map); + return map; + }; + + /** @type {MakeCacheableResult & { bindCache: BindCache }} */ + const fn = (str, associatedObjectForCache) => { + if (!associatedObjectForCache) return realFn(str); + const cache = getCache(associatedObjectForCache); + const entry = cache.get(str); + if (entry !== undefined) return entry; + const result = realFn(str); + cache.set(str, result); + return result; + }; + + /** @type {BindCache} */ + fn.bindCache = associatedObjectForCache => { + const cache = getCache(associatedObjectForCache); + /** + * @param {string} str string + * @returns {T} value + */ + return str => { + const entry = cache.get(str); + if (entry !== undefined) return entry; + const result = realFn(str); + cache.set(str, result); + return result; + }; + }; + + return fn; }; +/** @typedef {(context: string, value: string, associatedObjectForCache?: AssociatedObjectForCache) => string} MakeCacheableWithContextResult */ +/** @typedef {(context: string, value: string) => string} BindCacheForContextResultFn */ +/** @typedef {(value: string) => string} BindContextCacheForContextResultFn */ +/** @typedef {(associatedObjectForCache?: AssociatedObjectForCache) => BindCacheForContextResultFn} BindCacheForContext */ +/** @typedef {(value: string, associatedObjectForCache?: AssociatedObjectForCache) => BindContextCacheForContextResultFn} BindContextCacheForContext */ + /** - * - * @param {string} p path to normalize - * @returns {string} normalized version of path + * @param {(context: string, identifier: string) => string} fn function + * @returns {MakeCacheableWithContextResult & { bindCache: BindCacheForContext, bindContextCache: BindContextCacheForContext }} cacheable function with context */ -const normalizePathSeparator = p => p.replace(/\\/g, "/"); +const makeCacheableWithContext = fn => { + /** @type {WeakMap>>} */ + const cache = new WeakMap(); + + /** @type {MakeCacheableWithContextResult & { bindCache: BindCacheForContext, bindContextCache: BindContextCacheForContext }} */ + const cachedFn = (context, identifier, associatedObjectForCache) => { + if (!associatedObjectForCache) return fn(context, identifier); + + let innerCache = cache.get(associatedObjectForCache); + if (innerCache === undefined) { + innerCache = new Map(); + cache.set(associatedObjectForCache, innerCache); + } + + let cachedResult; + let innerSubCache = innerCache.get(context); + if (innerSubCache === undefined) { + innerCache.set(context, (innerSubCache = new Map())); + } else { + cachedResult = innerSubCache.get(identifier); + } + + if (cachedResult !== undefined) { + return cachedResult; + } + const result = fn(context, identifier); + innerSubCache.set(identifier, result); + return result; + }; + + /** @type {BindCacheForContext} */ + cachedFn.bindCache = associatedObjectForCache => { + let innerCache; + if (associatedObjectForCache) { + innerCache = cache.get(associatedObjectForCache); + if (innerCache === undefined) { + innerCache = new Map(); + cache.set(associatedObjectForCache, innerCache); + } + } else { + innerCache = new Map(); + } + + /** + * @param {string} context context used to create relative path + * @param {string} identifier identifier used to create relative path + * @returns {string} the returned relative path + */ + const boundFn = (context, identifier) => { + let cachedResult; + let innerSubCache = innerCache.get(context); + if (innerSubCache === undefined) { + innerCache.set(context, (innerSubCache = new Map())); + } else { + cachedResult = innerSubCache.get(identifier); + } + + if (cachedResult !== undefined) { + return cachedResult; + } + const result = fn(context, identifier); + innerSubCache.set(identifier, result); + return result; + }; + + return boundFn; + }; + + /** @type {BindContextCacheForContext} */ + cachedFn.bindContextCache = (context, associatedObjectForCache) => { + let innerSubCache; + if (associatedObjectForCache) { + let innerCache = cache.get(associatedObjectForCache); + if (innerCache === undefined) { + innerCache = new Map(); + cache.set(associatedObjectForCache, innerCache); + } + + innerSubCache = innerCache.get(context); + if (innerSubCache === undefined) { + innerCache.set(context, (innerSubCache = new Map())); + } + } else { + innerSubCache = new Map(); + } + + /** + * @param {string} identifier identifier used to create relative path + * @returns {string} the returned relative path + */ + const boundFn = identifier => { + const cachedResult = innerSubCache.get(identifier); + if (cachedResult !== undefined) { + return cachedResult; + } + const result = fn(context, identifier); + innerSubCache.set(identifier, result); + return result; + }; + + return boundFn; + }; + + return cachedFn; +}; /** - * * @param {string} context context for relative path * @param {string} identifier identifier for path * @returns {string} a converted relative path */ -const _makePathsRelative = (context, identifier) => { - return identifier - .split(/([|! ])/) - .map( - str => - looksLikeAbsolutePath(str) - ? normalizePathSeparator(path.relative(context, str)) - : str - ) +const _makePathsRelative = (context, identifier) => + identifier + .split(SEGMENTS_SPLIT_REGEXP) + .map(str => absoluteToRequest(context, str)) .join(""); -}; + +module.exports.makePathsRelative = makeCacheableWithContext(_makePathsRelative); /** - * - * @param {string} context context used to create relative path - * @param {string} identifier identifier used to create relative path - * @param {MakeRelativePathsCache=} cache the cache object being set - * @returns {string} the returned relative path + * @param {string} context context for relative path + * @param {string} identifier identifier for path + * @returns {string} a converted relative path */ -exports.makePathsRelative = (context, identifier, cache) => { - if (!cache) return _makePathsRelative(context, identifier); - - const relativePaths = - cache.relativePaths || (cache.relativePaths = new Map()); - - let cachedResult; - let contextCache = relativePaths.get(context); - if (contextCache === undefined) { - relativePaths.set(context, (contextCache = new Map())); - } else { - cachedResult = contextCache.get(identifier); - } +const _makePathsAbsolute = (context, identifier) => + identifier + .split(SEGMENTS_SPLIT_REGEXP) + .map(str => requestToAbsolute(context, str)) + .join(""); - if (cachedResult !== undefined) { - return cachedResult; - } else { - const relativePath = _makePathsRelative(context, identifier); - contextCache.set(identifier, relativePath); - return relativePath; - } -}; +module.exports.makePathsAbsolute = makeCacheableWithContext(_makePathsAbsolute); /** * @param {string} context absolute context path * @param {string} request any request string may containing absolute paths, query string, etc. * @returns {string} a new request string avoiding absolute paths when possible */ -exports.contextify = (context, request) => { - return request +const _contextify = (context, request) => + request .split("!") - .map(r => { - const splitPath = r.split("?", 2); - if (/^[a-zA-Z]:\\/.test(splitPath[0])) { - splitPath[0] = path.win32.relative(context, splitPath[0]); - if (!/^[a-zA-Z]:\\/.test(splitPath[0])) { - splitPath[0] = splitPath[0].replace(/\\/g, "/"); - } - } - if (/^\//.test(splitPath[0])) { - splitPath[0] = path.posix.relative(context, splitPath[0]); - } - if (!/^(\.\.\/|\/|[a-zA-Z]:\\)/.test(splitPath[0])) { - splitPath[0] = "./" + splitPath[0]; - } - return splitPath.join("?"); - }) + .map(r => absoluteToRequest(context, r)) + .join("!"); + +const contextify = makeCacheableWithContext(_contextify); +module.exports.contextify = contextify; + +/** + * @param {string} context absolute context path + * @param {string} request any request string + * @returns {string} a new request string using absolute paths when possible + */ +const _absolutify = (context, request) => + request + .split("!") + .map(r => requestToAbsolute(context, r)) .join("!"); + +const absolutify = makeCacheableWithContext(_absolutify); +module.exports.absolutify = absolutify; + +const PATH_QUERY_FRAGMENT_REGEXP = + /^((?:\0.|[^?#\0])*)(\?(?:\0.|[^#\0])*)?(#.*)?$/; +const PATH_QUERY_REGEXP = /^((?:\0.|[^?\0])*)(\?.*)?$/; + +/** @typedef {{ resource: string, path: string, query: string, fragment: string }} ParsedResource */ +/** @typedef {{ resource: string, path: string, query: string }} ParsedResourceWithoutFragment */ + +/** + * @param {string} str the path with query and fragment + * @returns {ParsedResource} parsed parts + */ +const _parseResource = str => { + const match = + /** @type {[string, string, string | undefined, string | undefined]} */ + (/** @type {unknown} */ (PATH_QUERY_FRAGMENT_REGEXP.exec(str))); + return { + resource: str, + path: match[1].replace(/\0(.)/g, "$1"), + query: match[2] ? match[2].replace(/\0(.)/g, "$1") : "", + fragment: match[3] || "" + }; +}; +module.exports.parseResource = makeCacheable(_parseResource); + +/** + * Parse resource, skips fragment part + * @param {string} str the path with query and fragment + * @returns {ParsedResourceWithoutFragment} parsed parts + */ +const _parseResourceWithoutFragment = str => { + const match = + /** @type {[string, string, string | undefined]} */ + (/** @type {unknown} */ (PATH_QUERY_REGEXP.exec(str))); + return { + resource: str, + path: match[1].replace(/\0(.)/g, "$1"), + query: match[2] ? match[2].replace(/\0(.)/g, "$1") : "" + }; +}; +module.exports.parseResourceWithoutFragment = makeCacheable( + _parseResourceWithoutFragment +); + +/** + * @param {string} filename the filename which should be undone + * @param {string} outputPath the output path that is restored (only relevant when filename contains "..") + * @param {boolean} enforceRelative true returns ./ for empty paths + * @returns {string} repeated ../ to leave the directory of the provided filename to be back on output dir + */ +module.exports.getUndoPath = (filename, outputPath, enforceRelative) => { + let depth = -1; + let append = ""; + outputPath = outputPath.replace(/[\\/]$/, ""); + for (const part of filename.split(/[/\\]+/)) { + if (part === "..") { + if (depth > -1) { + depth--; + } else { + const i = outputPath.lastIndexOf("/"); + const j = outputPath.lastIndexOf("\\"); + const pos = i < 0 ? j : j < 0 ? i : Math.max(i, j); + if (pos < 0) return `${outputPath}/`; + append = `${outputPath.slice(pos + 1)}/${append}`; + outputPath = outputPath.slice(0, pos); + } + } else if (part !== ".") { + depth++; + } + } + return depth > 0 + ? `${"../".repeat(depth)}${append}` + : enforceRelative + ? `./${append}` + : append; }; diff --git a/lib/util/internalSerializables.js b/lib/util/internalSerializables.js new file mode 100644 index 00000000000..3ca8f2b9178 --- /dev/null +++ b/lib/util/internalSerializables.js @@ -0,0 +1,224 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +// We need to include a list of requires here +// to allow webpack to be bundled with only static requires +// We could use a dynamic require(`../${request}`) but this +// would include too many modules and not every tool is able +// to process this +module.exports = { + AsyncDependenciesBlock: () => require("../AsyncDependenciesBlock"), + CommentCompilationWarning: () => require("../CommentCompilationWarning"), + ContextModule: () => require("../ContextModule"), + "cache/PackFileCacheStrategy": () => + require("../cache/PackFileCacheStrategy"), + "cache/ResolverCachePlugin": () => require("../cache/ResolverCachePlugin"), + "container/ContainerEntryDependency": () => + require("../container/ContainerEntryDependency"), + "container/ContainerEntryModule": () => + require("../container/ContainerEntryModule"), + "container/ContainerExposedDependency": () => + require("../container/ContainerExposedDependency"), + "container/FallbackDependency": () => + require("../container/FallbackDependency"), + "container/FallbackItemDependency": () => + require("../container/FallbackItemDependency"), + "container/FallbackModule": () => require("../container/FallbackModule"), + "container/RemoteModule": () => require("../container/RemoteModule"), + "container/RemoteToExternalDependency": () => + require("../container/RemoteToExternalDependency"), + "dependencies/AMDDefineDependency": () => + require("../dependencies/AMDDefineDependency"), + "dependencies/AMDRequireArrayDependency": () => + require("../dependencies/AMDRequireArrayDependency"), + "dependencies/AMDRequireContextDependency": () => + require("../dependencies/AMDRequireContextDependency"), + "dependencies/AMDRequireDependenciesBlock": () => + require("../dependencies/AMDRequireDependenciesBlock"), + "dependencies/AMDRequireDependency": () => + require("../dependencies/AMDRequireDependency"), + "dependencies/AMDRequireItemDependency": () => + require("../dependencies/AMDRequireItemDependency"), + "dependencies/CachedConstDependency": () => + require("../dependencies/CachedConstDependency"), + "dependencies/ExternalModuleDependency": () => + require("../dependencies/ExternalModuleDependency"), + "dependencies/ExternalModuleInitFragment": () => + require("../dependencies/ExternalModuleInitFragment"), + "dependencies/CreateScriptUrlDependency": () => + require("../dependencies/CreateScriptUrlDependency"), + "dependencies/CommonJsRequireContextDependency": () => + require("../dependencies/CommonJsRequireContextDependency"), + "dependencies/CommonJsExportRequireDependency": () => + require("../dependencies/CommonJsExportRequireDependency"), + "dependencies/CommonJsExportsDependency": () => + require("../dependencies/CommonJsExportsDependency"), + "dependencies/CommonJsFullRequireDependency": () => + require("../dependencies/CommonJsFullRequireDependency"), + "dependencies/CommonJsRequireDependency": () => + require("../dependencies/CommonJsRequireDependency"), + "dependencies/CommonJsSelfReferenceDependency": () => + require("../dependencies/CommonJsSelfReferenceDependency"), + "dependencies/ConstDependency": () => + require("../dependencies/ConstDependency"), + "dependencies/ContextDependency": () => + require("../dependencies/ContextDependency"), + "dependencies/ContextElementDependency": () => + require("../dependencies/ContextElementDependency"), + "dependencies/CriticalDependencyWarning": () => + require("../dependencies/CriticalDependencyWarning"), + "dependencies/CssImportDependency": () => + require("../dependencies/CssImportDependency"), + "dependencies/CssLocalIdentifierDependency": () => + require("../dependencies/CssLocalIdentifierDependency"), + "dependencies/CssSelfLocalIdentifierDependency": () => + require("../dependencies/CssSelfLocalIdentifierDependency"), + "dependencies/CssIcssImportDependency": () => + require("../dependencies/CssIcssImportDependency"), + "dependencies/CssIcssExportDependency": () => + require("../dependencies/CssIcssExportDependency"), + "dependencies/CssUrlDependency": () => + require("../dependencies/CssUrlDependency"), + "dependencies/CssIcssSymbolDependency": () => + require("../dependencies/CssIcssSymbolDependency"), + "dependencies/DelegatedSourceDependency": () => + require("../dependencies/DelegatedSourceDependency"), + "dependencies/DllEntryDependency": () => + require("../dependencies/DllEntryDependency"), + "dependencies/EntryDependency": () => + require("../dependencies/EntryDependency"), + "dependencies/ExportsInfoDependency": () => + require("../dependencies/ExportsInfoDependency"), + "dependencies/HarmonyAcceptDependency": () => + require("../dependencies/HarmonyAcceptDependency"), + "dependencies/HarmonyAcceptImportDependency": () => + require("../dependencies/HarmonyAcceptImportDependency"), + "dependencies/HarmonyCompatibilityDependency": () => + require("../dependencies/HarmonyCompatibilityDependency"), + "dependencies/HarmonyExportExpressionDependency": () => + require("../dependencies/HarmonyExportExpressionDependency"), + "dependencies/HarmonyExportHeaderDependency": () => + require("../dependencies/HarmonyExportHeaderDependency"), + "dependencies/HarmonyExportImportedSpecifierDependency": () => + require("../dependencies/HarmonyExportImportedSpecifierDependency"), + "dependencies/HarmonyExportSpecifierDependency": () => + require("../dependencies/HarmonyExportSpecifierDependency"), + "dependencies/HarmonyImportSideEffectDependency": () => + require("../dependencies/HarmonyImportSideEffectDependency"), + "dependencies/HarmonyImportSpecifierDependency": () => + require("../dependencies/HarmonyImportSpecifierDependency"), + "dependencies/HarmonyEvaluatedImportSpecifierDependency": () => + require("../dependencies/HarmonyEvaluatedImportSpecifierDependency"), + "dependencies/ImportContextDependency": () => + require("../dependencies/ImportContextDependency"), + "dependencies/ImportDependency": () => + require("../dependencies/ImportDependency"), + "dependencies/ImportEagerDependency": () => + require("../dependencies/ImportEagerDependency"), + "dependencies/ImportWeakDependency": () => + require("../dependencies/ImportWeakDependency"), + "dependencies/JsonExportsDependency": () => + require("../dependencies/JsonExportsDependency"), + "dependencies/LocalModule": () => require("../dependencies/LocalModule"), + "dependencies/LocalModuleDependency": () => + require("../dependencies/LocalModuleDependency"), + "dependencies/ModuleDecoratorDependency": () => + require("../dependencies/ModuleDecoratorDependency"), + "dependencies/ModuleHotAcceptDependency": () => + require("../dependencies/ModuleHotAcceptDependency"), + "dependencies/ModuleHotDeclineDependency": () => + require("../dependencies/ModuleHotDeclineDependency"), + "dependencies/ImportMetaHotAcceptDependency": () => + require("../dependencies/ImportMetaHotAcceptDependency"), + "dependencies/ImportMetaHotDeclineDependency": () => + require("../dependencies/ImportMetaHotDeclineDependency"), + "dependencies/ImportMetaContextDependency": () => + require("../dependencies/ImportMetaContextDependency"), + "dependencies/ProvidedDependency": () => + require("../dependencies/ProvidedDependency"), + "dependencies/PureExpressionDependency": () => + require("../dependencies/PureExpressionDependency"), + "dependencies/RequireContextDependency": () => + require("../dependencies/RequireContextDependency"), + "dependencies/RequireEnsureDependenciesBlock": () => + require("../dependencies/RequireEnsureDependenciesBlock"), + "dependencies/RequireEnsureDependency": () => + require("../dependencies/RequireEnsureDependency"), + "dependencies/RequireEnsureItemDependency": () => + require("../dependencies/RequireEnsureItemDependency"), + "dependencies/RequireHeaderDependency": () => + require("../dependencies/RequireHeaderDependency"), + "dependencies/RequireIncludeDependency": () => + require("../dependencies/RequireIncludeDependency"), + "dependencies/RequireIncludeDependencyParserPlugin": () => + require("../dependencies/RequireIncludeDependencyParserPlugin"), + "dependencies/RequireResolveContextDependency": () => + require("../dependencies/RequireResolveContextDependency"), + "dependencies/RequireResolveDependency": () => + require("../dependencies/RequireResolveDependency"), + "dependencies/RequireResolveHeaderDependency": () => + require("../dependencies/RequireResolveHeaderDependency"), + "dependencies/RuntimeRequirementsDependency": () => + require("../dependencies/RuntimeRequirementsDependency"), + "dependencies/StaticExportsDependency": () => + require("../dependencies/StaticExportsDependency"), + "dependencies/SystemPlugin": () => require("../dependencies/SystemPlugin"), + "dependencies/UnsupportedDependency": () => + require("../dependencies/UnsupportedDependency"), + "dependencies/URLDependency": () => require("../dependencies/URLDependency"), + "dependencies/WebAssemblyExportImportedDependency": () => + require("../dependencies/WebAssemblyExportImportedDependency"), + "dependencies/WebAssemblyImportDependency": () => + require("../dependencies/WebAssemblyImportDependency"), + "dependencies/WebpackIsIncludedDependency": () => + require("../dependencies/WebpackIsIncludedDependency"), + "dependencies/WorkerDependency": () => + require("../dependencies/WorkerDependency"), + "json/JsonData": () => require("../json/JsonData"), + "optimize/ConcatenatedModule": () => + require("../optimize/ConcatenatedModule"), + DelegatedModule: () => require("../DelegatedModule"), + DependenciesBlock: () => require("../DependenciesBlock"), + DllModule: () => require("../DllModule"), + ExternalModule: () => require("../ExternalModule"), + FileSystemInfo: () => require("../FileSystemInfo"), + InitFragment: () => require("../InitFragment"), + InvalidDependenciesModuleWarning: () => + require("../InvalidDependenciesModuleWarning"), + Module: () => require("../Module"), + ModuleBuildError: () => require("../ModuleBuildError"), + ModuleDependencyWarning: () => require("../ModuleDependencyWarning"), + ModuleError: () => require("../ModuleError"), + ModuleGraph: () => require("../ModuleGraph"), + ModuleParseError: () => require("../ModuleParseError"), + ModuleWarning: () => require("../ModuleWarning"), + NormalModule: () => require("../NormalModule"), + CssModule: () => require("../CssModule"), + RawDataUrlModule: () => require("../asset/RawDataUrlModule"), + RawModule: () => require("../RawModule"), + "sharing/ConsumeSharedModule": () => + require("../sharing/ConsumeSharedModule"), + "sharing/ConsumeSharedFallbackDependency": () => + require("../sharing/ConsumeSharedFallbackDependency"), + "sharing/ProvideSharedModule": () => + require("../sharing/ProvideSharedModule"), + "sharing/ProvideSharedDependency": () => + require("../sharing/ProvideSharedDependency"), + "sharing/ProvideForSharedDependency": () => + require("../sharing/ProvideForSharedDependency"), + UnsupportedFeatureWarning: () => require("../UnsupportedFeatureWarning"), + "util/LazySet": () => require("../util/LazySet"), + UnhandledSchemeError: () => require("../UnhandledSchemeError"), + NodeStuffInWebError: () => require("../NodeStuffInWebError"), + EnvironmentNotSupportAsyncWarning: () => + require("../EnvironmentNotSupportAsyncWarning"), + WebpackError: () => require("../WebpackError"), + + "util/registerExternalSerializer": () => { + // already registered + } +}; diff --git a/lib/util/magicComment.js b/lib/util/magicComment.js new file mode 100644 index 00000000000..c47cc5350f4 --- /dev/null +++ b/lib/util/magicComment.js @@ -0,0 +1,21 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Alexander Akait @alexander-akait +*/ + +"use strict"; + +// regexp to match at least one "magic comment" +module.exports.webpackCommentRegExp = new RegExp( + /(^|\W)webpack[A-Z]{1,}[A-Za-z]{1,}:/ +); + +// regexp to match at least one "magic comment" +/** + * @returns {import("vm").Context} magic comment context + */ +module.exports.createMagicCommentContext = () => + require("vm").createContext(undefined, { + name: "Webpack Magic Comment Parser", + codeGeneration: { strings: false, wasm: false } + }); diff --git a/lib/util/makeSerializable.js b/lib/util/makeSerializable.js new file mode 100644 index 00000000000..c5f08c113a6 --- /dev/null +++ b/lib/util/makeSerializable.js @@ -0,0 +1,60 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php +*/ + +"use strict"; + +const { register } = require("./serialization"); + +/** @typedef {import("../serialization/ObjectMiddleware").Constructor} Constructor */ +/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */ +/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */ + +/** @typedef {{ serialize: (context: ObjectSerializerContext) => void, deserialize: (context: ObjectDeserializerContext) => void }} SerializableClass */ +/** + * @template {SerializableClass} T + * @typedef {(new (...params: EXPECTED_ANY[]) => T) & { deserialize?: (context: ObjectDeserializerContext) => T }} SerializableClassConstructor + */ + +/** + * @template {SerializableClass} T + */ +class ClassSerializer { + /** + * @param {SerializableClassConstructor} Constructor constructor + */ + constructor(Constructor) { + this.Constructor = Constructor; + } + + /** + * @param {T} obj obj + * @param {ObjectSerializerContext} context context + */ + serialize(obj, context) { + obj.serialize(context); + } + + /** + * @param {ObjectDeserializerContext} context context + * @returns {T} obj + */ + deserialize(context) { + if (typeof this.Constructor.deserialize === "function") { + return this.Constructor.deserialize(context); + } + const obj = new this.Constructor(); + obj.deserialize(context); + return obj; + } +} + +/** + * @template {Constructor} T + * @param {T} Constructor the constructor + * @param {string} request the request which will be required when deserializing + * @param {string | null=} name the name to make multiple serializer unique when sharing a request + */ +module.exports = (Constructor, request, name = null) => { + register(Constructor, request, name, new ClassSerializer(Constructor)); +}; diff --git a/lib/util/memoize.js b/lib/util/memoize.js new file mode 100644 index 00000000000..5c58015f954 --- /dev/null +++ b/lib/util/memoize.js @@ -0,0 +1,36 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php +*/ + +"use strict"; + +/** + * @template T + * @typedef {() => T} FunctionReturning + */ + +/** + * @template T + * @param {FunctionReturning} fn memorized function + * @returns {FunctionReturning} new function + */ +const memoize = fn => { + let cache = false; + /** @type {T | undefined} */ + let result; + return () => { + if (cache) { + return /** @type {T} */ (result); + } + + result = fn(); + cache = true; + // Allow to clean up memory for fn + // and all dependent resources + /** @type {FunctionReturning | undefined} */ + (fn) = undefined; + return /** @type {T} */ (result); + }; +}; + +module.exports = memoize; diff --git a/lib/util/nonNumericOnlyHash.js b/lib/util/nonNumericOnlyHash.js new file mode 100644 index 00000000000..ec8ca745ffc --- /dev/null +++ b/lib/util/nonNumericOnlyHash.js @@ -0,0 +1,22 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Ivan Kopeykin @vankop +*/ + +"use strict"; + +const A_CODE = "a".charCodeAt(0); + +/** + * @param {string} hash hash + * @param {number} hashLength hash length + * @returns {string} returns hash that has at least one non numeric char + */ +module.exports = (hash, hashLength) => { + if (hashLength < 1) return ""; + const slice = hash.slice(0, hashLength); + if (/[^\d]/.test(slice)) return slice; + return `${String.fromCharCode( + A_CODE + (Number.parseInt(hash[0], 10) % 6) + )}${slice.slice(1)}`; +}; diff --git a/lib/util/numberHash.js b/lib/util/numberHash.js new file mode 100644 index 00000000000..950d14bf8bb --- /dev/null +++ b/lib/util/numberHash.js @@ -0,0 +1,95 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +/** + * Threshold for switching from 32-bit to 64-bit hashing. This is selected to ensure that the bias towards lower modulo results when using 32-bit hashing is <0.5%. + * @type {number} + */ +const FNV_64_THRESHOLD = 1 << 24; + +/** + * The FNV-1a offset basis for 32-bit hash values. + * @type {number} + */ +const FNV_OFFSET_32 = 2166136261; +/** + * The FNV-1a prime for 32-bit hash values. + * @type {number} + */ +const FNV_PRIME_32 = 16777619; +/** + * The mask for a positive 32-bit signed integer. + * @type {number} + */ +const MASK_31 = 0x7fffffff; + +/** + * The FNV-1a offset basis for 64-bit hash values. + * @type {bigint} + */ +const FNV_OFFSET_64 = BigInt("0xCBF29CE484222325"); +/** + * The FNV-1a prime for 64-bit hash values. + * @type {bigint} + */ +const FNV_PRIME_64 = BigInt("0x100000001B3"); + +/** + * Computes a 32-bit FNV-1a hash value for the given string. + * See https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function + * @param {string} str The input string to hash + * @returns {number} - The computed hash value. + */ +function fnv1a32(str) { + let hash = FNV_OFFSET_32; + for (let i = 0, len = str.length; i < len; i++) { + hash ^= str.charCodeAt(i); + // Use Math.imul to do c-style 32-bit multiplication and keep only the 32 least significant bits + hash = Math.imul(hash, FNV_PRIME_32); + } + // Force the result to be positive + return hash & MASK_31; +} + +/** + * Computes a 64-bit FNV-1a hash value for the given string. + * See https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function + * @param {string} str The input string to hash + * @returns {bigint} - The computed hash value. + */ +function fnv1a64(str) { + let hash = FNV_OFFSET_64; + for (let i = 0, len = str.length; i < len; i++) { + hash ^= BigInt(str.charCodeAt(i)); + hash = BigInt.asUintN(64, hash * FNV_PRIME_64); + } + return hash; +} + +/** + * Computes a hash value for the given string and range. This hashing algorithm is a modified + * version of the [FNV-1a algorithm](https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function). + * It is optimized for speed and does **not** generate a cryptographic hash value. + * + * We use `numberHash` in `lib/ids/IdHelpers.js` to generate hash values for the module identifier. The generated + * hash is used as a prefix for the module id's to avoid collisions with other modules. + * @param {string} str The input string to hash. + * @param {number} range The range of the hash value (0 to range-1). + * @returns {number} - The computed hash value. + * @example + * ```js + * const numberHash = require("webpack/lib/util/numberHash"); + * numberHash("hello", 1000); // 73 + * numberHash("hello world"); // 72 + * ``` + */ +module.exports = (str, range) => { + if (range < FNV_64_THRESHOLD) { + return fnv1a32(str) % range; + } + return Number(fnv1a64(str) % BigInt(range)); +}; diff --git a/lib/util/objectToMap.js b/lib/util/objectToMap.js index 31713646f61..bb8c870eac3 100644 --- a/lib/util/objectToMap.js +++ b/lib/util/objectToMap.js @@ -1,16 +1,15 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php +*/ + +"use strict"; + /** - * convert an object into its 2D array equivalent to be turned - * into an ES6 map - * - * @param {object} obj - any object type that works with Object.keys() - * @returns {Map} an ES6 Map of KV pairs + * Convert an object into an ES6 map + * @template {object} T + * @param {T} obj any object type that works with Object.entries() + * @returns {Map} an ES6 Map of KV pairs */ module.exports = function objectToMap(obj) { - return new Map( - Object.keys(obj).map(key => { - /** @type {[string, string]} */ - const pair = [key, obj[key]]; - return pair; - }) - ); + return new Map(Object.entries(obj)); }; diff --git a/lib/util/processAsyncTree.js b/lib/util/processAsyncTree.js new file mode 100644 index 00000000000..98ed0745e7d --- /dev/null +++ b/lib/util/processAsyncTree.js @@ -0,0 +1,68 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +/** + * @template T + * @template {Error} E + * @param {Iterable} items initial items + * @param {number} concurrency number of items running in parallel + * @param {(item: T, push: (item: T) => void, callback: (err?: E) => void) => void} processor worker which pushes more items + * @param {(err?: E) => void} callback all items processed + * @returns {void} + */ +const processAsyncTree = (items, concurrency, processor, callback) => { + const queue = Array.from(items); + if (queue.length === 0) return callback(); + let processing = 0; + let finished = false; + let processScheduled = true; + + /** + * @param {T} item item + */ + const push = item => { + queue.push(item); + if (!processScheduled && processing < concurrency) { + processScheduled = true; + process.nextTick(processQueue); + } + }; + + /** + * @param {E | null | undefined} err error + */ + const processorCallback = err => { + processing--; + if (err && !finished) { + finished = true; + callback(err); + return; + } + if (!processScheduled) { + processScheduled = true; + process.nextTick(processQueue); + } + }; + + const processQueue = () => { + if (finished) return; + while (processing < concurrency && queue.length > 0) { + processing++; + const item = /** @type {T} */ (queue.pop()); + processor(item, push, processorCallback); + } + processScheduled = false; + if (queue.length === 0 && processing === 0 && !finished) { + finished = true; + callback(); + } + }; + + processQueue(); +}; + +module.exports = processAsyncTree; diff --git a/lib/util/propertyAccess.js b/lib/util/propertyAccess.js new file mode 100644 index 00000000000..0cf647bd9e0 --- /dev/null +++ b/lib/util/propertyAccess.js @@ -0,0 +1,30 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const { SAFE_IDENTIFIER, RESERVED_IDENTIFIER } = require("./propertyName"); + +/** + * @param {ArrayLike} properties properties + * @param {number} start start index + * @returns {string} chain of property accesses + */ +const propertyAccess = (properties, start = 0) => { + let str = ""; + for (let i = start; i < properties.length; i++) { + const p = properties[i]; + if (`${Number(p)}` === p) { + str += `[${p}]`; + } else if (SAFE_IDENTIFIER.test(p) && !RESERVED_IDENTIFIER.has(p)) { + str += `.${p}`; + } else { + str += `[${JSON.stringify(p)}]`; + } + } + return str; +}; + +module.exports = propertyAccess; diff --git a/lib/util/propertyName.js b/lib/util/propertyName.js new file mode 100644 index 00000000000..a8d58c7d265 --- /dev/null +++ b/lib/util/propertyName.js @@ -0,0 +1,76 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const SAFE_IDENTIFIER = /^[_a-zA-Z$][_a-zA-Z$0-9]*$/; +const RESERVED_IDENTIFIER = new Set([ + "break", + "case", + "catch", + "class", + "const", + "continue", + "debugger", + "default", + "delete", + "do", + "else", + "export", + "extends", + "finally", + "for", + "function", + "if", + "import", + "in", + "instanceof", + "new", + "return", + "super", + "switch", + "this", + "throw", + "try", + "typeof", + "var", + "void", + "while", + "with", + "enum", + // strict mode + "implements", + "interface", + "let", + "package", + "private", + "protected", + "public", + "static", + "yield", + // module code + "await", + // skip future reserved keywords defined under ES1 till ES3 + // additional + "null", + "true", + "false" +]); + +/** + * @summary Returns a valid JS property name for the given property. + * Certain strings like "default", "null", and names with whitespace are not + * valid JS property names, so they are returned as strings. + * @param {string} prop property name to analyze + * @returns {string} valid JS property name + */ +const propertyName = prop => { + if (SAFE_IDENTIFIER.test(prop) && !RESERVED_IDENTIFIER.has(prop)) { + return prop; + } + return JSON.stringify(prop); +}; + +module.exports = { SAFE_IDENTIFIER, RESERVED_IDENTIFIER, propertyName }; diff --git a/lib/util/registerExternalSerializer.js b/lib/util/registerExternalSerializer.js new file mode 100644 index 00000000000..5e20a432535 --- /dev/null +++ b/lib/util/registerExternalSerializer.js @@ -0,0 +1,334 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const { register } = require("./serialization"); + +const Position = require("acorn").Position; +const SourceLocation = require("acorn").SourceLocation; +const ValidationError = require("schema-utils").ValidationError; +const { + CachedSource, + ConcatSource, + OriginalSource, + PrefixSource, + RawSource, + ReplaceSource, + SourceMapSource +} = require("webpack-sources"); + +/** @typedef {import("acorn").Position} Position */ +/** @typedef {import("../Dependency").RealDependencyLocation} RealDependencyLocation */ +/** @typedef {import("../Dependency").SourcePosition} SourcePosition */ +/** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */ +/** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */ + +const CURRENT_MODULE = "webpack/lib/util/registerExternalSerializer"; + +register( + CachedSource, + CURRENT_MODULE, + "webpack-sources/CachedSource", + new (class CachedSourceSerializer { + /** + * @param {CachedSource} source the cached source to be serialized + * @param {ObjectSerializerContext} context context + * @returns {void} + */ + serialize(source, { write, writeLazy }) { + if (writeLazy) { + writeLazy(source.originalLazy()); + } else { + write(source.original()); + } + write(source.getCachedData()); + } + + /** + * @param {ObjectDeserializerContext} context context + * @returns {CachedSource} cached source + */ + deserialize({ read }) { + const source = read(); + const cachedData = read(); + return new CachedSource(source, cachedData); + } + })() +); + +register( + RawSource, + CURRENT_MODULE, + "webpack-sources/RawSource", + new (class RawSourceSerializer { + /** + * @param {RawSource} source the raw source to be serialized + * @param {ObjectSerializerContext} context context + * @returns {void} + */ + serialize(source, { write }) { + write(source.buffer()); + write(!source.isBuffer()); + } + + /** + * @param {ObjectDeserializerContext} context context + * @returns {RawSource} raw source + */ + deserialize({ read }) { + const source = read(); + const convertToString = read(); + return new RawSource(source, convertToString); + } + })() +); + +register( + ConcatSource, + CURRENT_MODULE, + "webpack-sources/ConcatSource", + new (class ConcatSourceSerializer { + /** + * @param {ConcatSource} source the concat source to be serialized + * @param {ObjectSerializerContext} context context + * @returns {void} + */ + serialize(source, { write }) { + write(source.getChildren()); + } + + /** + * @param {ObjectDeserializerContext} context context + * @returns {ConcatSource} concat source + */ + deserialize({ read }) { + const source = new ConcatSource(); + source.addAllSkipOptimizing(read()); + return source; + } + })() +); + +register( + PrefixSource, + CURRENT_MODULE, + "webpack-sources/PrefixSource", + new (class PrefixSourceSerializer { + /** + * @param {PrefixSource} source the prefix source to be serialized + * @param {ObjectSerializerContext} context context + * @returns {void} + */ + serialize(source, { write }) { + write(source.getPrefix()); + write(source.original()); + } + + /** + * @param {ObjectDeserializerContext} context context + * @returns {PrefixSource} prefix source + */ + deserialize({ read }) { + return new PrefixSource(read(), read()); + } + })() +); + +register( + ReplaceSource, + CURRENT_MODULE, + "webpack-sources/ReplaceSource", + new (class ReplaceSourceSerializer { + /** + * @param {ReplaceSource} source the replace source to be serialized + * @param {ObjectSerializerContext} context context + * @returns {void} + */ + serialize(source, { write }) { + write(source.original()); + write(source.getName()); + const replacements = source.getReplacements(); + write(replacements.length); + for (const repl of replacements) { + write(repl.start); + write(repl.end); + } + for (const repl of replacements) { + write(repl.content); + write(repl.name); + } + } + + /** + * @param {ObjectDeserializerContext} context context + * @returns {ReplaceSource} replace source + */ + deserialize({ read }) { + const source = new ReplaceSource(read(), read()); + const len = read(); + const startEndBuffer = []; + for (let i = 0; i < len; i++) { + startEndBuffer.push(read(), read()); + } + let j = 0; + for (let i = 0; i < len; i++) { + source.replace( + startEndBuffer[j++], + startEndBuffer[j++], + read(), + read() + ); + } + return source; + } + })() +); + +register( + OriginalSource, + CURRENT_MODULE, + "webpack-sources/OriginalSource", + new (class OriginalSourceSerializer { + /** + * @param {OriginalSource} source the original source to be serialized + * @param {ObjectSerializerContext} context context + * @returns {void} + */ + serialize(source, { write }) { + write(source.buffer()); + write(source.getName()); + } + + /** + * @param {ObjectDeserializerContext} context context + * @returns {OriginalSource} original source + */ + deserialize({ read }) { + const buffer = read(); + const name = read(); + return new OriginalSource(buffer, name); + } + })() +); + +register( + SourceLocation, + CURRENT_MODULE, + "acorn/SourceLocation", + new (class SourceLocationSerializer { + /** + * @param {SourceLocation} loc the location to be serialized + * @param {ObjectSerializerContext} context context + * @returns {void} + */ + serialize(loc, { write }) { + write(loc.start.line); + write(loc.start.column); + write(loc.end.line); + write(loc.end.column); + } + + /** + * @param {ObjectDeserializerContext} context context + * @returns {RealDependencyLocation} location + */ + deserialize({ read }) { + return { + start: { + line: read(), + column: read() + }, + end: { + line: read(), + column: read() + } + }; + } + })() +); + +register( + Position, + CURRENT_MODULE, + "acorn/Position", + new (class PositionSerializer { + /** + * @param {Position} pos the position to be serialized + * @param {ObjectSerializerContext} context context + * @returns {void} + */ + serialize(pos, { write }) { + write(pos.line); + write(pos.column); + } + + /** + * @param {ObjectDeserializerContext} context context + * @returns {SourcePosition} position + */ + deserialize({ read }) { + return { + line: read(), + column: read() + }; + } + })() +); + +register( + SourceMapSource, + CURRENT_MODULE, + "webpack-sources/SourceMapSource", + new (class SourceMapSourceSerializer { + /** + * @param {SourceMapSource} source the source map source to be serialized + * @param {ObjectSerializerContext} context context + * @returns {void} + */ + serialize(source, { write }) { + write(source.getArgsAsBuffers()); + } + + /** + * @param {ObjectDeserializerContext} context context + * @returns {SourceMapSource} source source map source + */ + deserialize({ read }) { + // @ts-expect-error + return new SourceMapSource(...read()); + } + })() +); + +register( + ValidationError, + CURRENT_MODULE, + "schema-utils/ValidationError", + new (class ValidationErrorSerializer { + /** + * @param {ValidationError} error the source map source to be serialized + * @param {ObjectSerializerContext} context context + * @returns {void} + */ + serialize(error, { write }) { + write(error.errors); + write(error.schema); + write({ + name: error.headerName, + baseDataPath: error.baseDataPath, + postFormatter: error.postFormatter + }); + } + + /** + * @param {ObjectDeserializerContext} context context + * @returns {ValidationError} error + */ + deserialize({ read }) { + return new ValidationError(read(), read(), read()); + } + })() +); diff --git a/lib/util/removeBOM.js b/lib/util/removeBOM.js new file mode 100644 index 00000000000..f084ae85871 --- /dev/null +++ b/lib/util/removeBOM.js @@ -0,0 +1,25 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Alexander Akait @alexander-akait +*/ + +"use strict"; + +/** + * @param {string | Buffer} strOrBuffer string or buffer + * @returns {string | Buffer} result without BOM + */ +module.exports = strOrBuffer => { + if (typeof strOrBuffer === "string" && strOrBuffer.charCodeAt(0) === 0xfeff) { + return strOrBuffer.substr(1); + } else if ( + Buffer.isBuffer(strOrBuffer) && + strOrBuffer[0] === 0xef && + strOrBuffer[1] === 0xbb && + strOrBuffer[2] === 0xbf + ) { + return strOrBuffer.subarray(3); + } + + return strOrBuffer; +}; diff --git a/lib/util/runtime.js b/lib/util/runtime.js new file mode 100644 index 00000000000..36bc6a2a91b --- /dev/null +++ b/lib/util/runtime.js @@ -0,0 +1,695 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const SortableSet = require("./SortableSet"); + +/** @typedef {import("../Compilation")} Compilation */ +/** @typedef {import("../Entrypoint").EntryOptions} EntryOptions */ + +/** @typedef {string | SortableSet | undefined} RuntimeSpec */ +/** @typedef {RuntimeSpec | boolean} RuntimeCondition */ + +/** + * @param {Compilation} compilation the compilation + * @param {string} name name of the entry + * @param {EntryOptions=} options optionally already received entry options + * @returns {RuntimeSpec} runtime + */ +module.exports.getEntryRuntime = (compilation, name, options) => { + let dependOn; + let runtime; + if (options) { + ({ dependOn, runtime } = options); + } else { + const entry = compilation.entries.get(name); + if (!entry) return name; + ({ dependOn, runtime } = entry.options); + } + if (dependOn) { + /** @type {RuntimeSpec} */ + let result; + const queue = new Set(dependOn); + for (const name of queue) { + const dep = compilation.entries.get(name); + if (!dep) continue; + const { dependOn, runtime } = dep.options; + if (dependOn) { + for (const name of dependOn) { + queue.add(name); + } + } else { + result = mergeRuntimeOwned(result, runtime || name); + } + } + return result || name; + } + return runtime || name; +}; + +/** + * @param {RuntimeSpec} runtime runtime + * @param {(runtime: string | undefined) => void} fn functor + * @param {boolean} deterministicOrder enforce a deterministic order + * @returns {void} + */ +const forEachRuntime = (runtime, fn, deterministicOrder = false) => { + if (runtime === undefined) { + fn(undefined); + } else if (typeof runtime === "string") { + fn(runtime); + } else { + if (deterministicOrder) runtime.sort(); + for (const r of runtime) { + fn(r); + } + } +}; +module.exports.forEachRuntime = forEachRuntime; + +/** + * @template T + * @param {SortableSet} set set + * @returns {string} runtime key + */ +const getRuntimesKey = set => { + set.sort(); + return Array.from(set).join("\n"); +}; + +/** + * @param {RuntimeSpec} runtime runtime(s) + * @returns {string} key of runtimes + */ +const getRuntimeKey = runtime => { + if (runtime === undefined) return "*"; + if (typeof runtime === "string") return runtime; + return runtime.getFromUnorderedCache(getRuntimesKey); +}; +module.exports.getRuntimeKey = getRuntimeKey; + +/** + * @param {string} key key of runtimes + * @returns {RuntimeSpec} runtime(s) + */ +const keyToRuntime = key => { + if (key === "*") return; + const items = key.split("\n"); + if (items.length === 1) return items[0]; + return new SortableSet(items); +}; +module.exports.keyToRuntime = keyToRuntime; + +/** + * @template T + * @param {SortableSet} set set + * @returns {string} runtime string + */ +const getRuntimesString = set => { + set.sort(); + return Array.from(set).join("+"); +}; + +/** + * @param {RuntimeSpec} runtime runtime(s) + * @returns {string} readable version + */ +const runtimeToString = runtime => { + if (runtime === undefined) return "*"; + if (typeof runtime === "string") return runtime; + return runtime.getFromUnorderedCache(getRuntimesString); +}; +module.exports.runtimeToString = runtimeToString; + +/** + * @param {RuntimeCondition} runtimeCondition runtime condition + * @returns {string} readable version + */ +module.exports.runtimeConditionToString = runtimeCondition => { + if (runtimeCondition === true) return "true"; + if (runtimeCondition === false) return "false"; + return runtimeToString(runtimeCondition); +}; + +/** + * @param {RuntimeSpec} a first + * @param {RuntimeSpec} b second + * @returns {boolean} true, when they are equal + */ +const runtimeEqual = (a, b) => { + if (a === b) { + return true; + } else if ( + a === undefined || + b === undefined || + typeof a === "string" || + typeof b === "string" + ) { + return false; + } else if (a.size !== b.size) { + return false; + } + a.sort(); + b.sort(); + const aIt = a[Symbol.iterator](); + const bIt = b[Symbol.iterator](); + for (;;) { + const aV = aIt.next(); + if (aV.done) return true; + const bV = bIt.next(); + if (aV.value !== bV.value) return false; + } +}; +module.exports.runtimeEqual = runtimeEqual; + +/** + * @param {RuntimeSpec} a first + * @param {RuntimeSpec} b second + * @returns {-1|0|1} compare + */ +module.exports.compareRuntime = (a, b) => { + if (a === b) { + return 0; + } else if (a === undefined) { + return -1; + } else if (b === undefined) { + return 1; + } + const aKey = getRuntimeKey(a); + const bKey = getRuntimeKey(b); + if (aKey < bKey) return -1; + if (aKey > bKey) return 1; + return 0; +}; + +/** + * @param {RuntimeSpec} a first + * @param {RuntimeSpec} b second + * @returns {RuntimeSpec} merged + */ +const mergeRuntime = (a, b) => { + if (a === undefined) { + return b; + } else if (b === undefined) { + return a; + } else if (a === b) { + return a; + } else if (typeof a === "string") { + if (typeof b === "string") { + const set = new SortableSet(); + set.add(a); + set.add(b); + return set; + } else if (b.has(a)) { + return b; + } + const set = new SortableSet(b); + set.add(a); + return set; + } + if (typeof b === "string") { + if (a.has(b)) return a; + const set = new SortableSet(a); + set.add(b); + return set; + } + const set = new SortableSet(a); + for (const item of b) set.add(item); + if (set.size === a.size) return a; + return set; +}; +module.exports.mergeRuntime = mergeRuntime; + +/** + * @param {RuntimeCondition} a first + * @param {RuntimeCondition} b second + * @param {RuntimeSpec} runtime full runtime + * @returns {RuntimeCondition} result + */ +module.exports.mergeRuntimeCondition = (a, b, runtime) => { + if (a === false) return b; + if (b === false) return a; + if (a === true || b === true) return true; + const merged = mergeRuntime(a, b); + if (merged === undefined) return; + if (typeof merged === "string") { + if (typeof runtime === "string" && merged === runtime) return true; + return merged; + } + if (typeof runtime === "string" || runtime === undefined) return merged; + if (merged.size === runtime.size) return true; + return merged; +}; + +/** + * @param {RuntimeSpec | true} a first + * @param {RuntimeSpec | true} b second + * @param {RuntimeSpec} runtime full runtime + * @returns {RuntimeSpec | true} result + */ +module.exports.mergeRuntimeConditionNonFalse = (a, b, runtime) => { + if (a === true || b === true) return true; + const merged = mergeRuntime(a, b); + if (merged === undefined) return; + if (typeof merged === "string") { + if (typeof runtime === "string" && merged === runtime) return true; + return merged; + } + if (typeof runtime === "string" || runtime === undefined) return merged; + if (merged.size === runtime.size) return true; + return merged; +}; + +/** + * @param {RuntimeSpec} a first (may be modified) + * @param {RuntimeSpec} b second + * @returns {RuntimeSpec} merged + */ +const mergeRuntimeOwned = (a, b) => { + if (b === undefined) { + return a; + } else if (a === b) { + return a; + } else if (a === undefined) { + if (typeof b === "string") { + return b; + } + return new SortableSet(b); + } else if (typeof a === "string") { + if (typeof b === "string") { + const set = new SortableSet(); + set.add(a); + set.add(b); + return set; + } + const set = new SortableSet(b); + set.add(a); + return set; + } + if (typeof b === "string") { + a.add(b); + return a; + } + for (const item of b) a.add(item); + return a; +}; +module.exports.mergeRuntimeOwned = mergeRuntimeOwned; + +/** + * @param {RuntimeSpec} a first + * @param {RuntimeSpec} b second + * @returns {RuntimeSpec} merged + */ +module.exports.intersectRuntime = (a, b) => { + if (a === undefined) { + return b; + } else if (b === undefined) { + return a; + } else if (a === b) { + return a; + } else if (typeof a === "string") { + if (typeof b === "string") { + return; + } else if (b.has(a)) { + return a; + } + return; + } + if (typeof b === "string") { + if (a.has(b)) return b; + return; + } + const set = new SortableSet(); + for (const item of b) { + if (a.has(item)) set.add(item); + } + if (set.size === 0) return; + if (set.size === 1) { + const [item] = set; + return item; + } + return set; +}; + +/** + * @param {RuntimeSpec} a first + * @param {RuntimeSpec} b second + * @returns {RuntimeSpec} result + */ +const subtractRuntime = (a, b) => { + if (a === undefined) { + return; + } else if (b === undefined) { + return a; + } else if (a === b) { + return; + } else if (typeof a === "string") { + if (typeof b === "string") { + return a; + } else if (b.has(a)) { + return; + } + return a; + } + if (typeof b === "string") { + if (!a.has(b)) return a; + if (a.size === 2) { + for (const item of a) { + if (item !== b) return item; + } + } + const set = new SortableSet(a); + set.delete(b); + return set; + } + const set = new SortableSet(); + for (const item of a) { + if (!b.has(item)) set.add(item); + } + if (set.size === 0) return; + if (set.size === 1) { + const [item] = set; + return item; + } + return set; +}; +module.exports.subtractRuntime = subtractRuntime; + +/** + * @param {RuntimeCondition} a first + * @param {RuntimeCondition} b second + * @param {RuntimeSpec} runtime runtime + * @returns {RuntimeCondition} result + */ +module.exports.subtractRuntimeCondition = (a, b, runtime) => { + if (b === true) return false; + if (b === false) return a; + if (a === false) return false; + const result = subtractRuntime(a === true ? runtime : a, b); + return result === undefined ? false : result; +}; + +/** + * @param {RuntimeSpec} runtime runtime + * @param {(runtime?: RuntimeSpec) => boolean} filter filter function + * @returns {boolean | RuntimeSpec} true/false if filter is constant for all runtimes, otherwise runtimes that are active + */ +module.exports.filterRuntime = (runtime, filter) => { + if (runtime === undefined) return filter(); + if (typeof runtime === "string") return filter(runtime); + let some = false; + let every = true; + let result; + for (const r of runtime) { + const v = filter(r); + if (v) { + some = true; + result = mergeRuntimeOwned(result, r); + } else { + every = false; + } + } + if (!some) return false; + if (every) return true; + return result; +}; + +/** + * @template T + * @typedef {Map} RuntimeSpecMapInnerMap + */ + +/** + * @template T + * @template [R=T] + */ +class RuntimeSpecMap { + /** + * @param {RuntimeSpecMap=} clone copy form this + */ + constructor(clone) { + /** @type {0 | 1 | 2} */ + this._mode = clone ? clone._mode : 0; // 0 = empty, 1 = single entry, 2 = map + /** @type {RuntimeSpec} */ + this._singleRuntime = clone ? clone._singleRuntime : undefined; + /** @type {R | undefined} */ + this._singleValue = clone ? clone._singleValue : undefined; + /** @type {RuntimeSpecMapInnerMap | undefined} */ + this._map = clone && clone._map ? new Map(clone._map) : undefined; + } + + /** + * @param {RuntimeSpec} runtime the runtimes + * @returns {R | undefined} value + */ + get(runtime) { + switch (this._mode) { + case 0: + return; + case 1: + return runtimeEqual(this._singleRuntime, runtime) + ? this._singleValue + : undefined; + default: + return /** @type {RuntimeSpecMapInnerMap} */ (this._map).get( + getRuntimeKey(runtime) + ); + } + } + + /** + * @param {RuntimeSpec} runtime the runtimes + * @returns {boolean} true, when the runtime is stored + */ + has(runtime) { + switch (this._mode) { + case 0: + return false; + case 1: + return runtimeEqual(this._singleRuntime, runtime); + default: + return /** @type {RuntimeSpecMapInnerMap} */ (this._map).has( + getRuntimeKey(runtime) + ); + } + } + + /** + * @param {RuntimeSpec} runtime the runtimes + * @param {R} value the value + */ + set(runtime, value) { + switch (this._mode) { + case 0: + this._mode = 1; + this._singleRuntime = runtime; + this._singleValue = value; + break; + case 1: + if (runtimeEqual(this._singleRuntime, runtime)) { + this._singleValue = value; + break; + } + this._mode = 2; + this._map = new Map(); + this._map.set( + getRuntimeKey(this._singleRuntime), + /** @type {R} */ (this._singleValue) + ); + this._singleRuntime = undefined; + this._singleValue = undefined; + /* falls through */ + default: + /** @type {RuntimeSpecMapInnerMap} */ + (this._map).set(getRuntimeKey(runtime), value); + } + } + + /** + * @param {RuntimeSpec} runtime the runtimes + * @param {() => R} computer function to compute the value + * @returns {R} the new value + */ + provide(runtime, computer) { + switch (this._mode) { + case 0: + this._mode = 1; + this._singleRuntime = runtime; + return (this._singleValue = computer()); + case 1: { + if (runtimeEqual(this._singleRuntime, runtime)) { + return /** @type {R} */ (this._singleValue); + } + this._mode = 2; + this._map = new Map(); + this._map.set( + getRuntimeKey(this._singleRuntime), + /** @type {R} */ + (this._singleValue) + ); + this._singleRuntime = undefined; + this._singleValue = undefined; + const newValue = computer(); + this._map.set(getRuntimeKey(runtime), newValue); + return newValue; + } + default: { + const key = getRuntimeKey(runtime); + const value = + /** @type {RuntimeSpecMapInnerMap} */ + (this._map).get(key); + if (value !== undefined) return value; + const newValue = computer(); + /** @type {RuntimeSpecMapInnerMap} */ + (this._map).set(key, newValue); + return newValue; + } + } + } + + /** + * @param {RuntimeSpec} runtime the runtimes + */ + delete(runtime) { + switch (this._mode) { + case 0: + return; + case 1: + if (runtimeEqual(this._singleRuntime, runtime)) { + this._mode = 0; + this._singleRuntime = undefined; + this._singleValue = undefined; + } + return; + default: + /** @type {RuntimeSpecMapInnerMap} */ + (this._map).delete(getRuntimeKey(runtime)); + } + } + + /** + * @param {RuntimeSpec} runtime the runtimes + * @param {(value: R | undefined) => R} fn function to update the value + */ + update(runtime, fn) { + switch (this._mode) { + case 0: + throw new Error("runtime passed to update must exist"); + case 1: { + if (runtimeEqual(this._singleRuntime, runtime)) { + this._singleValue = fn(this._singleValue); + break; + } + const newValue = fn(undefined); + if (newValue !== undefined) { + this._mode = 2; + this._map = new Map(); + this._map.set( + getRuntimeKey(this._singleRuntime), + /** @type {R} */ + (this._singleValue) + ); + this._singleRuntime = undefined; + this._singleValue = undefined; + this._map.set(getRuntimeKey(runtime), newValue); + } + break; + } + default: { + const key = getRuntimeKey(runtime); + const oldValue = + /** @type {RuntimeSpecMapInnerMap} */ + (this._map).get(key); + const newValue = fn(oldValue); + if (newValue !== oldValue) + /** @type {RuntimeSpecMapInnerMap} */ + (this._map).set(key, newValue); + } + } + } + + keys() { + switch (this._mode) { + case 0: + return []; + case 1: + return [this._singleRuntime]; + default: + return Array.from( + /** @type {RuntimeSpecMapInnerMap} */ + (this._map).keys(), + keyToRuntime + ); + } + } + + /** + * @returns {IterableIterator} values + */ + values() { + switch (this._mode) { + case 0: + return [][Symbol.iterator](); + case 1: + return [/** @type {R} */ (this._singleValue)][Symbol.iterator](); + default: + return /** @type {RuntimeSpecMapInnerMap} */ (this._map).values(); + } + } + + get size() { + if (/** @type {number} */ (this._mode) <= 1) { + return /** @type {number} */ (this._mode); + } + + return /** @type {RuntimeSpecMapInnerMap} */ (this._map).size; + } +} + +module.exports.RuntimeSpecMap = RuntimeSpecMap; + +class RuntimeSpecSet { + /** + * @param {Iterable=} iterable iterable + */ + constructor(iterable) { + /** @type {Map} */ + this._map = new Map(); + if (iterable) { + for (const item of iterable) { + this.add(item); + } + } + } + + /** + * @param {RuntimeSpec} runtime runtime + */ + add(runtime) { + this._map.set(getRuntimeKey(runtime), runtime); + } + + /** + * @param {RuntimeSpec} runtime runtime + * @returns {boolean} true, when the runtime exists + */ + has(runtime) { + return this._map.has(getRuntimeKey(runtime)); + } + + /** + * @returns {IterableIterator} iterable iterator + */ + [Symbol.iterator]() { + return this._map.values(); + } + + get size() { + return this._map.size; + } +} + +module.exports.RuntimeSpecSet = RuntimeSpecSet; diff --git a/lib/util/semver.js b/lib/util/semver.js new file mode 100644 index 00000000000..86628eadd40 --- /dev/null +++ b/lib/util/semver.js @@ -0,0 +1,602 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */ +/** @typedef {string | number | undefined} SemVerRangeItem */ +/** @typedef {(SemVerRangeItem | SemVerRangeItem[])[]} SemVerRange */ + +/** + * @param {string} str version string + * @returns {SemVerRange} parsed version + */ +const parseVersion = str => { + /** + * @param {str} str str + * @returns {(string | number)[]} result + */ + var splitAndConvert = function (str) { + return str.split(".").map(function (item) { + // eslint-disable-next-line eqeqeq + return +item == /** @type {EXPECTED_ANY} */ (item) ? +item : item; + }); + }; + + var match = + /** @type {RegExpExecArray} */ + (/^([^-+]+)?(?:-([^+]+))?(?:\+(.+))?$/.exec(str)); + + /** @type {(string | number | undefined | [])[]} */ + var ver = match[1] ? splitAndConvert(match[1]) : []; + + if (match[2]) { + ver.length++; + ver.push.apply(ver, splitAndConvert(match[2])); + } + + if (match[3]) { + ver.push([]); + ver.push.apply(ver, splitAndConvert(match[3])); + } + + return ver; +}; +module.exports.parseVersion = parseVersion; + +/* eslint-disable eqeqeq */ +/** + * @param {string} a version + * @param {string} b version + * @returns {boolean} true, iff a < b + */ +const versionLt = (a, b) => { + // @ts-expect-error + a = parseVersion(a); + // @ts-expect-error + b = parseVersion(b); + var i = 0; + for (;;) { + // a b EOA object undefined number string + // EOA a == b a < b b < a a < b a < b + // object b < a (0) b < a a < b a < b + // undefined a < b a < b (0) a < b a < b + // number b < a b < a b < a (1) a < b + // string b < a b < a b < a b < a (1) + // EOA end of array + // (0) continue on + // (1) compare them via "<" + + // Handles first row in table + if (i >= a.length) return i < b.length && (typeof b[i])[0] != "u"; + + var aValue = a[i]; + var aType = (typeof aValue)[0]; + + // Handles first column in table + if (i >= b.length) return aType == "u"; + + var bValue = b[i]; + var bType = (typeof bValue)[0]; + + if (aType == bType) { + if (aType != "o" && aType != "u" && aValue != bValue) { + return aValue < bValue; + } + i++; + } else { + // Handles remaining cases + if (aType == "o" && bType == "n") return true; + return bType == "s" || aType == "u"; + } + } +}; +/* eslint-enable eqeqeq */ +module.exports.versionLt = versionLt; + +/** + * @param {string} str range string + * @returns {SemVerRange} parsed range + */ +module.exports.parseRange = str => { + /** + * @param {string} str str + * @returns {(string | number)[]} result + */ + const splitAndConvert = str => { + return str + .split(".") + .map(item => (item !== "NaN" && `${+item}` === item ? +item : item)); + }; + + // see https://docs.npmjs.com/misc/semver#range-grammar for grammar + /** + * @param {string} str str + * @returns {SemVerRangeItem[]} + */ + const parsePartial = str => { + const match = + /** @type {RegExpExecArray} */ + (/^([^-+]+)?(?:-([^+]+))?(?:\+(.+))?$/.exec(str)); + /** @type {SemVerRangeItem[]} */ + const ver = match[1] ? [0, ...splitAndConvert(match[1])] : [0]; + + if (match[2]) { + ver.length++; + ver.push.apply(ver, splitAndConvert(match[2])); + } + + // remove trailing any matchers + let last = ver[ver.length - 1]; + while ( + ver.length && + (last === undefined || /^[*xX]$/.test(/** @type {string} */ (last))) + ) { + ver.pop(); + last = ver[ver.length - 1]; + } + + return ver; + }; + + /** + * + * @param {SemVerRangeItem[]} range range + * @returns {SemVerRangeItem[]} + */ + const toFixed = range => { + if (range.length === 1) { + // Special case for "*" is "x.x.x" instead of "=" + return [0]; + } else if (range.length === 2) { + // Special case for "1" is "1.x.x" instead of "=1" + return [1, ...range.slice(1)]; + } else if (range.length === 3) { + // Special case for "1.2" is "1.2.x" instead of "=1.2" + return [2, ...range.slice(1)]; + } + + return [range.length, ...range.slice(1)]; + }; + + /** + * + * @param {SemVerRangeItem[]} range + * @returns {SemVerRangeItem[]} result + */ + const negate = range => { + return [-(/** @type { [number]} */ (range)[0]) - 1, ...range.slice(1)]; + }; + + /** + * @param {string} str str + * @returns {SemVerRange} + */ + const parseSimple = str => { + // simple ::= primitive | partial | tilde | caret + // primitive ::= ( '<' | '>' | '>=' | '<=' | '=' | '!' ) ( ' ' ) * partial + // tilde ::= '~' ( ' ' ) * partial + // caret ::= '^' ( ' ' ) * partial + const match = /^(\^|~|<=|<|>=|>|=|v|!)/.exec(str); + const start = match ? match[0] : ""; + const remainder = parsePartial( + start.length ? str.slice(start.length).trim() : str.trim() + ); + + switch (start) { + case "^": + if (remainder.length > 1 && remainder[1] === 0) { + if (remainder.length > 2 && remainder[2] === 0) { + return [3, ...remainder.slice(1)]; + } + return [2, ...remainder.slice(1)]; + } + return [1, ...remainder.slice(1)]; + case "~": + if (remainder.length === 2 && remainder[0] === 0) { + return [1, ...remainder.slice(1)]; + } + return [2, ...remainder.slice(1)]; + case ">=": + return remainder; + case "=": + case "v": + case "": + return toFixed(remainder); + case "<": + return negate(remainder); + case ">": { + // and( >=, not( = ) ) => >=, =, not, and + const fixed = toFixed(remainder); + // eslint-disable-next-line no-sparse-arrays + return [, fixed, 0, remainder, 2]; + } + case "<=": + // or( <, = ) => <, =, or + // eslint-disable-next-line no-sparse-arrays + return [, toFixed(remainder), negate(remainder), 1]; + case "!": { + // not = + const fixed = toFixed(remainder); + // eslint-disable-next-line no-sparse-arrays + return [, fixed, 0]; + } + default: + throw new Error("Unexpected start value"); + } + }; + + /** + * + * @param {SemVerRangeItem[][]} items items + * @param {number} fn fn + * @returns {SemVerRange} result + */ + const combine = (items, fn) => { + if (items.length === 1) return items[0]; + const arr = []; + for (const item of items.slice().reverse()) { + if (0 in item) { + arr.push(item); + } else { + arr.push(...item.slice(1)); + } + } + + // eslint-disable-next-line no-sparse-arrays + return [, ...arr, ...items.slice(1).map(() => fn)]; + }; + + /** + * @param {string} str str + * @returns {SemVerRange} + */ + const parseRange = str => { + // range ::= hyphen | simple ( ' ' ( ' ' ) * simple ) * | '' + // hyphen ::= partial ( ' ' ) * ' - ' ( ' ' ) * partial + const items = str.split(/\s+-\s+/); + + if (items.length === 1) { + str = str.trim(); + + /** @type {SemVerRangeItem[][]} */ + const items = []; + const r = /[-0-9A-Za-z]\s+/g; + var start = 0; + var match; + while ((match = r.exec(str))) { + const end = match.index + 1; + items.push( + /** @type {SemVerRangeItem[]} */ + (parseSimple(str.slice(start, end).trim())) + ); + start = end; + } + items.push( + /** @type {SemVerRangeItem[]} */ + (parseSimple(str.slice(start).trim())) + ); + return combine(items, 2); + } + + const a = parsePartial(items[0]); + const b = parsePartial(items[1]); + // >=a <=b => and( >=a, or( >=a, { + // range-set ::= range ( logical-or range ) * + // logical-or ::= ( ' ' ) * '||' ( ' ' ) * + const items = + /** @type {SemVerRangeItem[][]} */ + (str.split(/\s*\|\|\s*/).map(parseRange)); + + return combine(items, 1); + }; + + return parseLogicalOr(str); +}; + +/* eslint-disable eqeqeq */ +/** + * @param {SemVerRange} range + * @returns {string} + */ +const rangeToString = range => { + var fixCount = /** @type {number} */ (range[0]); + var str = ""; + if (range.length === 1) { + return "*"; + } else if (fixCount + 0.5) { + str += + fixCount == 0 + ? ">=" + : fixCount == -1 + ? "<" + : fixCount == 1 + ? "^" + : fixCount == 2 + ? "~" + : fixCount > 0 + ? "=" + : "!="; + var needDot = 1; + for (var i = 1; i < range.length; i++) { + var item = range[i]; + var t = (typeof item)[0]; + needDot--; + str += + t == "u" + ? // undefined: prerelease marker, add an "-" + "-" + : // number or string: add the item, set flag to add an "." between two of them + (needDot > 0 ? "." : "") + ((needDot = 2), item); + } + return str; + } + /** @type {string[]} */ + var stack = []; + // eslint-disable-next-line no-redeclare + for (var i = 1; i < range.length; i++) { + // eslint-disable-next-line no-redeclare + var item = range[i]; + stack.push( + item === 0 + ? "not(" + pop() + ")" + : item === 1 + ? "(" + pop() + " || " + pop() + ")" + : item === 2 + ? stack.pop() + " " + stack.pop() + : rangeToString(/** @type {SemVerRange} */ (item)) + ); + } + return pop(); + + function pop() { + return /** @type {string} */ (stack.pop()).replace(/^\((.+)\)$/, "$1"); + } +}; + +module.exports.rangeToString = rangeToString; + +/** + * @param {SemVerRange} range version range + * @param {string} version the version + * @returns {boolean} if version satisfy the range + */ +const satisfy = (range, version) => { + if (0 in range) { + // @ts-expect-error + version = parseVersion(version); + var fixCount = /** @type {number} */ (range[0]); + // when negated is set it swill set for < instead of >= + var negated = fixCount < 0; + if (negated) fixCount = -fixCount - 1; + for (var i = 0, j = 1, isEqual = true; ; j++, i++) { + // cspell:word nequal nequ + + // when isEqual = true: + // range version: EOA/object undefined number string + // EOA equal block big-ver big-ver + // undefined bigger next big-ver big-ver + // number smaller block cmp big-cmp + // fixed number smaller block cmp-fix differ + // string smaller block differ cmp + // fixed string smaller block small-cmp cmp-fix + + // when isEqual = false: + // range version: EOA/object undefined number string + // EOA nequal block next-ver next-ver + // undefined nequal block next-ver next-ver + // number nequal block next next + // fixed number nequal block next next (this never happens) + // string nequal block next next + // fixed string nequal block next next (this never happens) + + // EOA end of array + // equal (version is equal range): + // when !negated: return true, + // when negated: return false + // bigger (version is bigger as range): + // when fixed: return false, + // when !negated: return true, + // when negated: return false, + // smaller (version is smaller as range): + // when !negated: return false, + // when negated: return true + // nequal (version is not equal range (> resp <)): return true + // block (version is in different prerelease area): return false + // differ (version is different from fixed range (string vs. number)): return false + // next: continues to the next items + // next-ver: when fixed: return false, continues to the next item only for the version, sets isEqual=false + // big-ver: when fixed || negated: return false, continues to the next item only for the version, sets isEqual=false + // next-nequ: continues to the next items, sets isEqual=false + // cmp (negated === false): version < range => return false, version > range => next-nequ, else => next + // cmp (negated === true): version > range => return false, version < range => next-nequ, else => next + // cmp-fix: version == range => next, else => return false + // big-cmp: when negated => return false, else => next-nequ + // small-cmp: when negated => next-nequ, else => return false + + var rangeType = + /** @type {"s" | "n" | "u" | ""} */ + (j < range.length ? (typeof range[j])[0] : ""); + + /** @type {number | string | undefined} */ + var versionValue; + /** @type {"n" | "s" | "u" | "o" | undefined} */ + var versionType; + + // Handles first column in both tables (end of version or object) + if ( + i >= version.length || + ((versionValue = version[i]), + (versionType = /** @type {"n" | "s" | "u" | "o"} */ ( + (typeof versionValue)[0] + )) == "o") + ) { + // Handles nequal + if (!isEqual) return true; + // Handles bigger + if (rangeType == "u") return j > fixCount && !negated; + // Handles equal and smaller: (range === EOA) XOR negated + return (rangeType == "") != negated; // equal + smaller + } + + // Handles second column in both tables (version = undefined) + if (versionType == "u") { + if (!isEqual || rangeType != "u") { + return false; + } + } + + // switch between first and second table + else if (isEqual) { + // Handle diagonal + if (rangeType == versionType) { + if (j <= fixCount) { + // Handles "cmp-fix" cases + if (versionValue != range[j]) { + return false; + } + } else { + // Handles "cmp" cases + if ( + negated + ? versionValue > /** @type {(number | string)[]} */ (range)[j] + : versionValue < /** @type {(number | string)[]} */ (range)[j] + ) { + return false; + } + if (versionValue != range[j]) isEqual = false; + } + } + + // Handle big-ver + else if (rangeType != "s" && rangeType != "n") { + if (negated || j <= fixCount) return false; + isEqual = false; + j--; + } + + // Handle differ, big-cmp and small-cmp + else if (j <= fixCount || versionType < rangeType != negated) { + return false; + } else { + isEqual = false; + } + } else { + // Handles all "next-ver" cases in the second table + // eslint-disable-next-line no-lonely-if + if (rangeType != "s" && rangeType != "n") { + isEqual = false; + j--; + } + + // next is applied by default + } + } + } + + /** @type {(boolean | number)[]} */ + var stack = []; + var p = stack.pop.bind(stack); + // eslint-disable-next-line no-redeclare + for (var i = 1; i < range.length; i++) { + var item = /** @type {SemVerRangeItem[] | 0 | 1 | 2} */ (range[i]); + + stack.push( + item == 1 + ? /** @type {() => number} */ (p)() | /** @type {() => number} */ (p)() + : item == 2 + ? /** @type {() => number} */ (p)() & + /** @type {() => number} */ (p)() + : item + ? satisfy(item, version) + : !p() + ); + } + return !!p(); +}; +/* eslint-enable eqeqeq */ +module.exports.satisfy = satisfy; + +/** + * @param {SemVerRange | string | number | false | undefined} json + * @returns {string} + */ +module.exports.stringifyHoley = json => { + switch (typeof json) { + case "undefined": + return ""; + case "object": + if (Array.isArray(json)) { + let str = "["; + for (let i = 0; i < json.length; i++) { + if (i !== 0) str += ","; + str += this.stringifyHoley(json[i]); + } + str += "]"; + return str; + } + + return JSON.stringify(json); + default: + return JSON.stringify(json); + } +}; + +//#region runtime code: parseVersion +/** + * @param {RuntimeTemplate} runtimeTemplate + * @returns {string} + */ +exports.parseVersionRuntimeCode = runtimeTemplate => + `var parseVersion = ${runtimeTemplate.basicFunction("str", [ + "// see webpack/lib/util/semver.js for original code", + `var p=${runtimeTemplate.supportsArrowFunction() ? "p=>" : "function(p)"}{return p.split(".").map((${runtimeTemplate.supportsArrowFunction() ? "p=>" : "function(p)"}{return+p==p?+p:p}))},n=/^([^-+]+)?(?:-([^+]+))?(?:\\+(.+))?$/.exec(str),r=n[1]?p(n[1]):[];return n[2]&&(r.length++,r.push.apply(r,p(n[2]))),n[3]&&(r.push([]),r.push.apply(r,p(n[3]))),r;` + ])}`; +//#endregion + +//#region runtime code: versionLt +/** + * @param {RuntimeTemplate} runtimeTemplate + * @returns {string} + */ +exports.versionLtRuntimeCode = runtimeTemplate => + `var versionLt = ${runtimeTemplate.basicFunction("a, b", [ + "// see webpack/lib/util/semver.js for original code", + 'a=parseVersion(a),b=parseVersion(b);for(var r=0;;){if(r>=a.length)return r=b.length)return"u"==n;var t=b[r],f=(typeof t)[0];if(n!=f)return"o"==n&&"n"==f||("s"==f||"u"==n);if("o"!=n&&"u"!=n&&e!=t)return e + `var rangeToString = ${runtimeTemplate.basicFunction("range", [ + "// see webpack/lib/util/semver.js for original code", + 'var r=range[0],n="";if(1===range.length)return"*";if(r+.5){n+=0==r?">=":-1==r?"<":1==r?"^":2==r?"~":r>0?"=":"!=";for(var e=1,a=1;a0?".":"")+(e=2,t)}return n}var g=[];for(a=1;a + `var satisfy = ${runtimeTemplate.basicFunction("range, version", [ + "// see webpack/lib/util/semver.js for original code", + 'if(0 in range){version=parseVersion(version);var e=range[0],r=e<0;r&&(e=-e-1);for(var n=0,i=1,a=!0;;i++,n++){var f,s,g=i=version.length||"o"==(s=(typeof(f=version[n]))[0]))return!a||("u"==g?i>e&&!r:""==g!=r);if("u"==s){if(!a||"u"!=g)return!1}else if(a)if(g==s)if(i<=e){if(f!=range[i])return!1}else{if(r?f>range[i]:f} Serializer + */ + +const getBinaryMiddleware = memoize(() => + require("../serialization/BinaryMiddleware") +); +const getObjectMiddleware = memoize(() => + require("../serialization/ObjectMiddleware") +); +const getSingleItemMiddleware = memoize(() => + require("../serialization/SingleItemMiddleware") +); +const getSerializer = memoize(() => require("../serialization/Serializer")); +const getSerializerMiddleware = memoize(() => + require("../serialization/SerializerMiddleware") +); + +const getBinaryMiddlewareInstance = memoize( + () => new (getBinaryMiddleware())() +); + +const registerSerializers = memoize(() => { + require("./registerExternalSerializer"); + + // Load internal paths with a relative require + // This allows bundling all internal serializers + const internalSerializables = require("./internalSerializables"); + getObjectMiddleware().registerLoader(/^webpack\/lib\//, req => { + const loader = + internalSerializables[ + /** @type {keyof import("./internalSerializables")} */ + (req.slice("webpack/lib/".length)) + ]; + if (loader) { + loader(); + } else { + // eslint-disable-next-line no-console + console.warn(`${req} not found in internalSerializables`); + } + return true; + }); +}); + +/** + * @type {Serializer} + */ +let buffersSerializer; + +// Expose serialization API +module.exports = { + get register() { + return getObjectMiddleware().register; + }, + get registerLoader() { + return getObjectMiddleware().registerLoader; + }, + get registerNotSerializable() { + return getObjectMiddleware().registerNotSerializable; + }, + get NOT_SERIALIZABLE() { + return getObjectMiddleware().NOT_SERIALIZABLE; + }, + /** @type {MEASURE_START_OPERATION} */ + get MEASURE_START_OPERATION() { + return getBinaryMiddleware().MEASURE_START_OPERATION; + }, + /** @type {MEASURE_END_OPERATION} */ + get MEASURE_END_OPERATION() { + return getBinaryMiddleware().MEASURE_END_OPERATION; + }, + get buffersSerializer() { + if (buffersSerializer !== undefined) return buffersSerializer; + registerSerializers(); + const Serializer = getSerializer(); + const binaryMiddleware = getBinaryMiddlewareInstance(); + const SerializerMiddleware = getSerializerMiddleware(); + const SingleItemMiddleware = getSingleItemMiddleware(); + return /** @type {Serializer} */ ( + buffersSerializer = new Serializer([ + new SingleItemMiddleware(), + new (getObjectMiddleware())(context => { + if ("write" in context) { + context.writeLazy = value => { + context.write( + SerializerMiddleware.createLazy(value, binaryMiddleware) + ); + }; + } + }, DEFAULTS.HASH_FUNCTION), + binaryMiddleware + ]) + ); + }, + /** + * @template D, S, C + * @param {IntermediateFileSystem} fs filesystem + * @param {string | Hash} hashFunction hash function to use + * @returns {Serializer} file serializer + */ + createFileSerializer: (fs, hashFunction) => { + registerSerializers(); + const Serializer = getSerializer(); + const FileMiddleware = require("../serialization/FileMiddleware"); + const fileMiddleware = new FileMiddleware(fs, hashFunction); + const binaryMiddleware = getBinaryMiddlewareInstance(); + const SerializerMiddleware = getSerializerMiddleware(); + const SingleItemMiddleware = getSingleItemMiddleware(); + return /** @type {Serializer} */ ( + new Serializer([ + new SingleItemMiddleware(), + new (getObjectMiddleware())(context => { + if ("write" in context) { + context.writeLazy = value => { + context.write( + SerializerMiddleware.createLazy(value, binaryMiddleware) + ); + }; + context.writeSeparate = (value, options) => { + const lazy = SerializerMiddleware.createLazy( + value, + fileMiddleware, + options + ); + context.write(lazy); + return lazy; + }; + } + }, hashFunction), + binaryMiddleware, + fileMiddleware + ]) + ); + } +}; diff --git a/lib/util/smartGrouping.js b/lib/util/smartGrouping.js new file mode 100644 index 00000000000..7be36a5c602 --- /dev/null +++ b/lib/util/smartGrouping.js @@ -0,0 +1,206 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +/** + * @typedef {object} GroupOptions + * @property {boolean=} groupChildren + * @property {boolean=} force + * @property {number=} targetGroupCount + */ + +/** + * @template T + * @template R + * @typedef {object} GroupConfig + * @property {(item: T) => string[] | undefined} getKeys + * @property {(key: string, children: (R | T)[], items: T[]) => R} createGroup + * @property {(name: string, items: T[]) => GroupOptions=} getOptions + */ + +/** + * @template T + * @template R + * @typedef {object} ItemWithGroups + * @property {T} item + * @property {Set>} groups + */ + +/** + * @template T + * @template R + * @typedef {{ config: GroupConfig, name: string, alreadyGrouped: boolean, items: Set> | undefined }} Group + */ + +/** + * @template T + * @template R + * @param {T[]} items the list of items + * @param {GroupConfig[]} groupConfigs configuration + * @returns {(R | T)[]} grouped items + */ +const smartGrouping = (items, groupConfigs) => { + /** @type {Set>} */ + const itemsWithGroups = new Set(); + /** @type {Map>} */ + const allGroups = new Map(); + for (const item of items) { + /** @type {Set>} */ + const groups = new Set(); + for (let i = 0; i < groupConfigs.length; i++) { + const groupConfig = groupConfigs[i]; + const keys = groupConfig.getKeys(item); + if (keys) { + for (const name of keys) { + const key = `${i}:${name}`; + let group = allGroups.get(key); + if (group === undefined) { + allGroups.set( + key, + (group = { + config: groupConfig, + name, + alreadyGrouped: false, + items: undefined + }) + ); + } + groups.add(group); + } + } + } + itemsWithGroups.add({ + item, + groups + }); + } + /** + * @param {Set>} itemsWithGroups input items with groups + * @returns {(T | R)[]} groups items + */ + const runGrouping = itemsWithGroups => { + const totalSize = itemsWithGroups.size; + for (const entry of itemsWithGroups) { + for (const group of entry.groups) { + if (group.alreadyGrouped) continue; + const items = group.items; + if (items === undefined) { + group.items = new Set([entry]); + } else { + items.add(entry); + } + } + } + /** @type {Map, { items: Set>, options: GroupOptions | false | undefined, used: boolean }>} */ + const groupMap = new Map(); + for (const group of allGroups.values()) { + if (group.items) { + const items = group.items; + group.items = undefined; + groupMap.set(group, { + items, + options: undefined, + used: false + }); + } + } + /** @type {(T | R)[]} */ + const results = []; + for (;;) { + /** @type {Group | undefined} */ + let bestGroup; + let bestGroupSize = -1; + let bestGroupItems; + let bestGroupOptions; + for (const [group, state] of groupMap) { + const { items, used } = state; + let options = state.options; + if (options === undefined) { + const groupConfig = group.config; + state.options = options = + (groupConfig.getOptions && + groupConfig.getOptions( + group.name, + Array.from(items, ({ item }) => item) + )) || + false; + } + + const force = options && options.force; + if (!force) { + if (bestGroupOptions && bestGroupOptions.force) continue; + if (used) continue; + if (items.size <= 1 || totalSize - items.size <= 1) { + continue; + } + } + const targetGroupCount = (options && options.targetGroupCount) || 4; + const sizeValue = force + ? items.size + : Math.min( + items.size, + (totalSize * 2) / targetGroupCount + + itemsWithGroups.size - + items.size + ); + if ( + sizeValue > bestGroupSize || + (force && (!bestGroupOptions || !bestGroupOptions.force)) + ) { + bestGroup = group; + bestGroupSize = sizeValue; + bestGroupItems = items; + bestGroupOptions = options; + } + } + if (bestGroup === undefined) { + break; + } + const items = new Set(bestGroupItems); + const options = bestGroupOptions; + + const groupChildren = !options || options.groupChildren !== false; + + for (const item of items) { + itemsWithGroups.delete(item); + // Remove all groups that items have from the map to not select them again + for (const group of item.groups) { + const state = groupMap.get(group); + if (state !== undefined) { + state.items.delete(item); + if (state.items.size === 0) { + groupMap.delete(group); + } else { + state.options = undefined; + if (groupChildren) { + state.used = true; + } + } + } + } + } + groupMap.delete(bestGroup); + + const key = bestGroup.name; + const groupConfig = bestGroup.config; + + const allItems = Array.from(items, ({ item }) => item); + + bestGroup.alreadyGrouped = true; + const children = groupChildren ? runGrouping(items) : allItems; + bestGroup.alreadyGrouped = false; + + results.push(groupConfig.createGroup(key, children, allItems)); + } + for (const { item } of itemsWithGroups) { + results.push(item); + } + return results; + }; + return runGrouping(itemsWithGroups); +}; + +module.exports = smartGrouping; diff --git a/lib/util/source.js b/lib/util/source.js new file mode 100644 index 00000000000..b9516786ba1 --- /dev/null +++ b/lib/util/source.js @@ -0,0 +1,61 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +/** @typedef {import("webpack-sources").Source} Source */ + +/** @type {WeakMap>} */ +const equalityCache = new WeakMap(); + +/** + * @param {Source} a a source + * @param {Source} b another source + * @returns {boolean} true, when both sources are equal + */ +const _isSourceEqual = (a, b) => { + // prefer .buffer(), it's called anyway during emit + /** @type {Buffer|string} */ + let aSource = typeof a.buffer === "function" ? a.buffer() : a.source(); + /** @type {Buffer|string} */ + let bSource = typeof b.buffer === "function" ? b.buffer() : b.source(); + if (aSource === bSource) return true; + if (typeof aSource === "string" && typeof bSource === "string") return false; + if (!Buffer.isBuffer(aSource)) aSource = Buffer.from(aSource, "utf-8"); + if (!Buffer.isBuffer(bSource)) bSource = Buffer.from(bSource, "utf-8"); + return aSource.equals(bSource); +}; + +/** + * @param {Source} a a source + * @param {Source} b another source + * @returns {boolean} true, when both sources are equal + */ +const isSourceEqual = (a, b) => { + if (a === b) return true; + const cache1 = equalityCache.get(a); + if (cache1 !== undefined) { + const result = cache1.get(b); + if (result !== undefined) return result; + } + const result = _isSourceEqual(a, b); + if (cache1 !== undefined) { + cache1.set(b, result); + } else { + const map = new WeakMap(); + map.set(b, result); + equalityCache.set(a, map); + } + const cache2 = equalityCache.get(b); + if (cache2 !== undefined) { + cache2.set(a, result); + } else { + const map = new WeakMap(); + map.set(a, result); + equalityCache.set(b, map); + } + return result; +}; +module.exports.isSourceEqual = isSourceEqual; diff --git a/lib/validateSchema.js b/lib/validateSchema.js index b748c2c8ff1..83841b61119 100644 --- a/lib/validateSchema.js +++ b/lib/validateSchema.js @@ -1,67 +1,176 @@ /* MIT License http://www.opensource.org/licenses/mit-license.php - Author Gajus Kuizinas @gajus + Author Tobias Koppers @sokra */ + "use strict"; -const Ajv = require("ajv"); -const ajv = new Ajv({ - errorDataPath: "configuration", - allErrors: true, - verbose: true -}); -require("ajv-keywords")(ajv, ["instanceof"]); -require("../schemas/ajv.absolutePath")(ajv); +const { validate } = require("schema-utils"); -const validateSchema = (schema, options) => { - if (Array.isArray(options)) { - const errors = options.map(options => validateObject(schema, options)); - errors.forEach((list, idx) => { - const applyPrefix = err => { - err.dataPath = `[${idx}]${err.dataPath}`; - if (err.children) { - err.children.forEach(applyPrefix); - } - }; - list.forEach(applyPrefix); - }); - return errors.reduce((arr, items) => { - return arr.concat(items); - }, []); - } else { - return validateObject(schema, options); - } +/* cSpell:disable */ +const DID_YOU_MEAN = { + rules: "module.rules", + loaders: "module.rules or module.rules.*.use", + query: "module.rules.*.options (BREAKING CHANGE since webpack 5)", + noParse: "module.noParse", + filename: "output.filename or module.rules.*.generator.filename", + file: "output.filename", + chunkFilename: "output.chunkFilename", + chunkfilename: "output.chunkFilename", + ecmaVersion: + "output.environment (output.ecmaVersion was a temporary configuration option during webpack 5 beta)", + ecmaversion: + "output.environment (output.ecmaVersion was a temporary configuration option during webpack 5 beta)", + ecma: "output.environment (output.ecmaVersion was a temporary configuration option during webpack 5 beta)", + path: "output.path", + pathinfo: "output.pathinfo", + pathInfo: "output.pathinfo", + jsonpFunction: "output.chunkLoadingGlobal (BREAKING CHANGE since webpack 5)", + chunkCallbackName: + "output.chunkLoadingGlobal (BREAKING CHANGE since webpack 5)", + jsonpScriptType: "output.scriptType (BREAKING CHANGE since webpack 5)", + hotUpdateFunction: "output.hotUpdateGlobal (BREAKING CHANGE since webpack 5)", + splitChunks: "optimization.splitChunks", + immutablePaths: "snapshot.immutablePaths", + managedPaths: "snapshot.managedPaths", + maxModules: "stats.modulesSpace (BREAKING CHANGE since webpack 5)", + hashedModuleIds: + 'optimization.moduleIds: "hashed" (BREAKING CHANGE since webpack 5)', + namedChunks: + 'optimization.chunkIds: "named" (BREAKING CHANGE since webpack 5)', + namedModules: + 'optimization.moduleIds: "named" (BREAKING CHANGE since webpack 5)', + occurrenceOrder: + 'optimization.chunkIds: "size" and optimization.moduleIds: "size" (BREAKING CHANGE since webpack 5)', + automaticNamePrefix: + "optimization.splitChunks.[cacheGroups.*].idHint (BREAKING CHANGE since webpack 5)", + noEmitOnErrors: + "optimization.emitOnErrors (BREAKING CHANGE since webpack 5: logic is inverted to avoid negative flags)", + Buffer: + "to use the ProvidePlugin to process the Buffer variable to modules as polyfill\n" + + "BREAKING CHANGE: webpack 5 no longer provided Node.js polyfills by default.\n" + + "Note: if you are using 'node.Buffer: false', you can just remove that as this is the default behavior now.\n" + + "To provide a polyfill to modules use:\n" + + 'new ProvidePlugin({ Buffer: ["buffer", "Buffer"] }) and npm install buffer.', + process: + "to use the ProvidePlugin to process the process variable to modules as polyfill\n" + + "BREAKING CHANGE: webpack 5 no longer provided Node.js polyfills by default.\n" + + "Note: if you are using 'node.process: false', you can just remove that as this is the default behavior now.\n" + + "To provide a polyfill to modules use:\n" + + 'new ProvidePlugin({ process: "process" }) and npm install buffer.' }; -const validateObject = (schema, options) => { - const validate = ajv.compile(schema); - const valid = validate(options); - return valid ? [] : filterErrors(validate.errors); +const REMOVED = { + concord: + "BREAKING CHANGE: resolve.concord has been removed and is no longer available.", + devtoolLineToLine: + "BREAKING CHANGE: output.devtoolLineToLine has been removed and is no longer available." }; +/* cSpell:enable */ + +/** + * @param {Parameters[0]} schema a json schema + * @param {Parameters[1]} options the options that should be validated + * @param {Parameters[2]=} validationConfiguration configuration for generating errors + * @returns {void} + */ +const validateSchema = (schema, options, validationConfiguration) => { + validate( + schema, + options, + validationConfiguration || { + name: "Webpack", + postFormatter: (formattedError, error) => { + const children = error.children; + if ( + children && + children.some( + child => + child.keyword === "absolutePath" && + child.instancePath === "/output/filename" + ) + ) { + return `${formattedError}\nPlease use output.path to specify absolute path and output.filename for the file name.`; + } + + if ( + children && + children.some( + child => + child.keyword === "pattern" && child.instancePath === "/devtool" + ) + ) { + return ( + `${formattedError}\n` + + "BREAKING CHANGE since webpack 5: The devtool option is more strict.\n" + + "Please strictly follow the order of the keywords in the pattern." + ); + } -const filterErrors = errors => { - let newErrors = []; - for (const err of errors) { - const dataPath = err.dataPath; - let children = []; - newErrors = newErrors.filter(oldError => { - if (oldError.dataPath.includes(dataPath)) { - if (oldError.children) { - children = children.concat(oldError.children.slice(0)); + if (error.keyword === "additionalProperties") { + const params = error.params; + if ( + Object.prototype.hasOwnProperty.call( + DID_YOU_MEAN, + params.additionalProperty + ) + ) { + return `${formattedError}\nDid you mean ${ + DID_YOU_MEAN[ + /** @type {keyof DID_YOU_MEAN} */ (params.additionalProperty) + ] + }?`; + } + + if ( + Object.prototype.hasOwnProperty.call( + REMOVED, + params.additionalProperty + ) + ) { + return `${formattedError}\n${ + REMOVED[/** @type {keyof REMOVED} */ (params.additionalProperty)] + }?`; + } + + if (!error.instancePath) { + if (params.additionalProperty === "debug") { + return ( + `${formattedError}\n` + + "The 'debug' property was removed in webpack 2.0.0.\n" + + "Loaders should be updated to allow passing this option via loader options in module.rules.\n" + + "Until loaders are updated one can use the LoaderOptionsPlugin to switch loaders into debug mode:\n" + + "plugins: [\n" + + " new webpack.LoaderOptionsPlugin({\n" + + " debug: true\n" + + " })\n" + + "]" + ); + } + + if (params.additionalProperty) { + return ( + `${formattedError}\n` + + "For typos: please correct them.\n" + + "For loader options: webpack >= v2.0.0 no longer allows custom properties in configuration.\n" + + " Loaders should be updated to allow passing options via loader options in module.rules.\n" + + " Until loaders are updated one can use the LoaderOptionsPlugin to pass these options to the loader:\n" + + " plugins: [\n" + + " new webpack.LoaderOptionsPlugin({\n" + + " // test: /\\.xxx$/, // may apply this only for some modules\n" + + " options: {\n" + + ` ${params.additionalProperty}: …\n` + + " }\n" + + " })\n" + + " ]" + ); + } + } } - oldError.children = undefined; - children.push(oldError); - return false; + + return formattedError; } - return true; - }); - if (children.length) { - err.children = children; } - newErrors.push(err); - } - - return newErrors; + ); }; - module.exports = validateSchema; diff --git a/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js b/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js new file mode 100644 index 00000000000..472b7513ea9 --- /dev/null +++ b/lib/wasm-async/AsyncWasmLoadingRuntimeModule.js @@ -0,0 +1,142 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const RuntimeGlobals = require("../RuntimeGlobals"); +const RuntimeModule = require("../RuntimeModule"); +const Template = require("../Template"); + +/** @typedef {import("../Chunk")} Chunk */ +/** @typedef {import("../Compilation")} Compilation */ + +/** + * @typedef {object} AsyncWasmLoadingRuntimeModuleOptions + * @property {((wasmModuleSrcPath: string) => string)=} generateBeforeLoadBinaryCode + * @property {(wasmModuleSrcPath: string) => string} generateLoadBinaryCode + * @property {(() => string)=} generateBeforeInstantiateStreaming + * @property {boolean} supportsStreaming + */ + +class AsyncWasmLoadingRuntimeModule extends RuntimeModule { + /** + * @param {AsyncWasmLoadingRuntimeModuleOptions} options options + */ + constructor({ + generateLoadBinaryCode, + generateBeforeLoadBinaryCode, + generateBeforeInstantiateStreaming, + supportsStreaming + }) { + super("wasm loading", RuntimeModule.STAGE_NORMAL); + this.generateLoadBinaryCode = generateLoadBinaryCode; + this.generateBeforeLoadBinaryCode = generateBeforeLoadBinaryCode; + this.generateBeforeInstantiateStreaming = + generateBeforeInstantiateStreaming; + this.supportsStreaming = supportsStreaming; + } + + /** + * @returns {string | null} runtime code + */ + generate() { + const compilation = /** @type {Compilation} */ (this.compilation); + const chunk = /** @type {Chunk} */ (this.chunk); + const { outputOptions, runtimeTemplate } = compilation; + const fn = RuntimeGlobals.instantiateWasm; + const wasmModuleSrcPath = compilation.getPath( + JSON.stringify(outputOptions.webassemblyModuleFilename), + { + hash: `" + ${RuntimeGlobals.getFullHash}() + "`, + hashWithLength: length => + `" + ${RuntimeGlobals.getFullHash}}().slice(0, ${length}) + "`, + module: { + id: '" + wasmModuleId + "', + hash: '" + wasmModuleHash + "', + hashWithLength(length) { + return `" + wasmModuleHash.slice(0, ${length}) + "`; + } + }, + runtime: chunk.runtime + } + ); + + const loader = this.generateLoadBinaryCode(wasmModuleSrcPath); + const fallback = [ + `.then(${runtimeTemplate.returningFunction("x.arrayBuffer()", "x")})`, + `.then(${runtimeTemplate.returningFunction( + "WebAssembly.instantiate(bytes, importsObj)", + "bytes" + )})`, + `.then(${runtimeTemplate.returningFunction( + "Object.assign(exports, res.instance.exports)", + "res" + )})` + ]; + const getStreaming = () => { + const concat = (/** @type {string[]} */ ...text) => text.join(""); + return [ + this.generateBeforeLoadBinaryCode + ? this.generateBeforeLoadBinaryCode(wasmModuleSrcPath) + : "", + `var req = ${loader};`, + `var fallback = ${runtimeTemplate.returningFunction( + Template.asString(["req", Template.indent(fallback)]) + )};`, + concat( + "return req.then(", + runtimeTemplate.basicFunction("res", [ + 'if (typeof WebAssembly.instantiateStreaming === "function") {', + Template.indent( + this.generateBeforeInstantiateStreaming + ? this.generateBeforeInstantiateStreaming() + : "" + ), + Template.indent([ + "return WebAssembly.instantiateStreaming(res, importsObj)", + Template.indent([ + ".then(", + Template.indent([ + `${runtimeTemplate.returningFunction( + "Object.assign(exports, res.instance.exports)", + "res" + )},`, + runtimeTemplate.basicFunction("e", [ + 'if(res.headers.get("Content-Type") !== "application/wasm") {', + Template.indent([ + 'console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\\n", e);', + "return fallback();" + ]), + "}", + "throw e;" + ]) + ]), + ");" + ]) + ]), + "}", + "return fallback();" + ]), + ");" + ) + ]; + }; + + return `${fn} = ${runtimeTemplate.basicFunction( + "exports, wasmModuleId, wasmModuleHash, importsObj", + this.supportsStreaming + ? getStreaming() + : [ + this.generateBeforeLoadBinaryCode + ? this.generateBeforeLoadBinaryCode(wasmModuleSrcPath) + : "", + `return ${loader}`, + `${Template.indent(fallback)};` + ] + )};`; + } +} + +module.exports = AsyncWasmLoadingRuntimeModule; diff --git a/lib/wasm-async/AsyncWebAssemblyGenerator.js b/lib/wasm-async/AsyncWebAssemblyGenerator.js new file mode 100644 index 00000000000..f66d5e6d6a5 --- /dev/null +++ b/lib/wasm-async/AsyncWebAssemblyGenerator.js @@ -0,0 +1,72 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const { RawSource } = require("webpack-sources"); +const Generator = require("../Generator"); +const { WEBASSEMBLY_TYPES } = require("../ModuleSourceTypesConstants"); + +/** @typedef {import("webpack-sources").Source} Source */ +/** @typedef {import("../Generator").GenerateContext} GenerateContext */ +/** @typedef {import("../Module").SourceTypes} SourceTypes */ +/** @typedef {import("../NormalModule")} NormalModule */ + +/** + * @typedef {object} AsyncWebAssemblyGeneratorOptions + * @property {boolean=} mangleImports mangle imports + */ + +class AsyncWebAssemblyGenerator extends Generator { + /** + * @param {AsyncWebAssemblyGeneratorOptions} options options + */ + constructor(options) { + super(); + this.options = options; + } + + /** + * @param {NormalModule} module fresh module + * @returns {SourceTypes} available types (do not mutate) + */ + getTypes(module) { + return WEBASSEMBLY_TYPES; + } + + /** + * @param {NormalModule} module the module + * @param {string=} type source type + * @returns {number} estimate size of the module + */ + getSize(module, type) { + const originalSource = module.originalSource(); + if (!originalSource) { + return 0; + } + return originalSource.size(); + } + + /** + * @param {NormalModule} module module for which the code should be generated + * @param {GenerateContext} generateContext context for generate + * @returns {Source | null} generated code + */ + generate(module, generateContext) { + return /** @type {Source} */ (module.originalSource()); + } + + /** + * @param {Error} error the error + * @param {NormalModule} module module for which the code should be generated + * @param {GenerateContext} generateContext context for generate + * @returns {Source | null} generated code + */ + generateError(error, module, generateContext) { + return new RawSource(error.message); + } +} + +module.exports = AsyncWebAssemblyGenerator; diff --git a/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js b/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js new file mode 100644 index 00000000000..b4b3297299e --- /dev/null +++ b/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js @@ -0,0 +1,216 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const { RawSource } = require("webpack-sources"); +const Generator = require("../Generator"); +const InitFragment = require("../InitFragment"); +const { WEBASSEMBLY_TYPES } = require("../ModuleSourceTypesConstants"); +const RuntimeGlobals = require("../RuntimeGlobals"); +const Template = require("../Template"); +const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency"); + +/** @typedef {import("webpack-sources").Source} Source */ +/** @typedef {import("../../declarations/WebpackOptions").OutputNormalized} OutputOptions */ +/** @typedef {import("../DependencyTemplates")} DependencyTemplates */ +/** @typedef {import("../Generator").GenerateContext} GenerateContext */ +/** @typedef {import("../Module")} Module */ +/** @typedef {import("../Module").SourceTypes} SourceTypes */ +/** @typedef {import("../NormalModule")} NormalModule */ +/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */ + +/** + * @typedef {{ request: string, importVar: string }} ImportObjRequestItem + */ + +class AsyncWebAssemblyJavascriptGenerator extends Generator { + /** + * @param {OutputOptions["webassemblyModuleFilename"]} filenameTemplate template for the WebAssembly module filename + */ + constructor(filenameTemplate) { + super(); + this.filenameTemplate = filenameTemplate; + } + + /** + * @param {NormalModule} module fresh module + * @returns {SourceTypes} available types (do not mutate) + */ + getTypes(module) { + return WEBASSEMBLY_TYPES; + } + + /** + * @param {NormalModule} module the module + * @param {string=} type source type + * @returns {number} estimate size of the module + */ + getSize(module, type) { + return 40 + module.dependencies.length * 10; + } + + /** + * @param {NormalModule} module module for which the code should be generated + * @param {GenerateContext} generateContext context for generate + * @returns {Source | null} generated code + */ + generate(module, generateContext) { + const { + runtimeTemplate, + chunkGraph, + moduleGraph, + runtimeRequirements, + runtime + } = generateContext; + runtimeRequirements.add(RuntimeGlobals.module); + runtimeRequirements.add(RuntimeGlobals.moduleId); + runtimeRequirements.add(RuntimeGlobals.exports); + runtimeRequirements.add(RuntimeGlobals.instantiateWasm); + /** @type {InitFragment>[]} */ + const initFragments = []; + /** @type {Map} */ + const depModules = new Map(); + /** @type {Map} */ + const wasmDepsByRequest = new Map(); + for (const dep of module.dependencies) { + if (dep instanceof WebAssemblyImportDependency) { + const module = /** @type {Module} */ (moduleGraph.getModule(dep)); + if (!depModules.has(module)) { + depModules.set(module, { + request: dep.request, + importVar: `WEBPACK_IMPORTED_MODULE_${depModules.size}` + }); + } + let list = wasmDepsByRequest.get(dep.request); + if (list === undefined) { + list = []; + wasmDepsByRequest.set(dep.request, list); + } + list.push(dep); + } + } + + /** @type {Array} */ + const promises = []; + + const importStatements = Array.from( + depModules, + ([importedModule, { request, importVar }]) => { + if (moduleGraph.isAsync(importedModule)) { + promises.push(importVar); + } + return runtimeTemplate.importStatement({ + update: false, + module: importedModule, + chunkGraph, + request, + originModule: module, + importVar, + runtimeRequirements + }); + } + ); + const importsCode = importStatements.map(([x]) => x).join(""); + const importsCompatCode = importStatements.map(([_, x]) => x).join(""); + + const importObjRequestItems = Array.from( + wasmDepsByRequest, + ([request, deps]) => { + const exportItems = deps.map(dep => { + const importedModule = + /** @type {Module} */ + (moduleGraph.getModule(dep)); + const importVar = + /** @type {ImportObjRequestItem} */ + (depModules.get(importedModule)).importVar; + return `${JSON.stringify( + dep.name + )}: ${runtimeTemplate.exportFromImport({ + moduleGraph, + module: importedModule, + request, + exportName: dep.name, + originModule: module, + asiSafe: true, + isCall: false, + callContext: false, + defaultInterop: true, + importVar, + initFragments, + runtime, + runtimeRequirements + })}`; + }); + return Template.asString([ + `${JSON.stringify(request)}: {`, + Template.indent(exportItems.join(",\n")), + "}" + ]); + } + ); + + const importsObj = + importObjRequestItems.length > 0 + ? Template.asString([ + "{", + Template.indent(importObjRequestItems.join(",\n")), + "}" + ]) + : undefined; + + const instantiateCall = `${RuntimeGlobals.instantiateWasm}(${module.exportsArgument}, ${ + module.moduleArgument + }.id, ${JSON.stringify( + chunkGraph.getRenderedModuleHash(module, runtime) + )}${importsObj ? `, ${importsObj})` : ")"}`; + + if (promises.length > 0) + runtimeRequirements.add(RuntimeGlobals.asyncModule); + + const source = new RawSource( + promises.length > 0 + ? Template.asString([ + `var __webpack_instantiate__ = ${runtimeTemplate.basicFunction( + `[${promises.join(", ")}]`, + `${importsCompatCode}return ${instantiateCall};` + )}`, + `${RuntimeGlobals.asyncModule}(${ + module.moduleArgument + }, async ${runtimeTemplate.basicFunction( + "__webpack_handle_async_dependencies__, __webpack_async_result__", + [ + "try {", + importsCode, + `var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([${promises.join( + ", " + )}]);`, + `var [${promises.join( + ", " + )}] = __webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__;`, + `${importsCompatCode}await ${instantiateCall};`, + "__webpack_async_result__();", + "} catch(e) { __webpack_async_result__(e); }" + ] + )}, 1);` + ]) + : `${importsCode}${importsCompatCode}module.exports = ${instantiateCall};` + ); + + return InitFragment.addToSource(source, initFragments, generateContext); + } + + /** + * @param {Error} error the error + * @param {NormalModule} module module for which the code should be generated + * @param {GenerateContext} generateContext context for generate + * @returns {Source | null} generated code + */ + generateError(error, module, generateContext) { + return new RawSource(`throw new Error(${JSON.stringify(error.message)});`); + } +} + +module.exports = AsyncWebAssemblyJavascriptGenerator; diff --git a/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js b/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js new file mode 100644 index 00000000000..621457821de --- /dev/null +++ b/lib/wasm-async/AsyncWebAssemblyModulesPlugin.js @@ -0,0 +1,218 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const { SyncWaterfallHook } = require("tapable"); +const Compilation = require("../Compilation"); +const Generator = require("../Generator"); +const { tryRunOrWebpackError } = require("../HookWebpackError"); +const { WEBASSEMBLY_MODULE_TYPE_ASYNC } = require("../ModuleTypeConstants"); +const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency"); +const { compareModulesByIdOrIdentifier } = require("../util/comparators"); +const memoize = require("../util/memoize"); + +/** @typedef {import("webpack-sources").Source} Source */ +/** @typedef {import("../../declarations/WebpackOptions").OutputNormalized} OutputOptions */ +/** @typedef {import("../Chunk")} Chunk */ +/** @typedef {import("../ChunkGraph")} ChunkGraph */ +/** @typedef {import("../CodeGenerationResults")} CodeGenerationResults */ +/** @typedef {import("../Compiler")} Compiler */ +/** @typedef {import("../DependencyTemplates")} DependencyTemplates */ +/** @typedef {import("../Module")} Module */ +/** @typedef {import("../ModuleGraph")} ModuleGraph */ +/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */ +/** @typedef {import("../Template").RenderManifestEntry} RenderManifestEntry */ +/** @typedef {import("../Template").RenderManifestOptions} RenderManifestOptions */ +/** @typedef {import("../WebpackError")} WebpackError */ + +const getAsyncWebAssemblyGenerator = memoize(() => + require("./AsyncWebAssemblyGenerator") +); +const getAsyncWebAssemblyJavascriptGenerator = memoize(() => + require("./AsyncWebAssemblyJavascriptGenerator") +); +const getAsyncWebAssemblyParser = memoize(() => + require("./AsyncWebAssemblyParser") +); + +/** + * @typedef {object} WebAssemblyRenderContext + * @property {Chunk} chunk the chunk + * @property {DependencyTemplates} dependencyTemplates the dependency templates + * @property {RuntimeTemplate} runtimeTemplate the runtime template + * @property {ModuleGraph} moduleGraph the module graph + * @property {ChunkGraph} chunkGraph the chunk graph + * @property {CodeGenerationResults} codeGenerationResults results of code generation + */ + +/** + * @typedef {object} CompilationHooks + * @property {SyncWaterfallHook<[Source, Module, WebAssemblyRenderContext]>} renderModuleContent + */ + +/** + * @typedef {object} AsyncWebAssemblyModulesPluginOptions + * @property {boolean=} mangleImports mangle imports + */ + +/** @type {WeakMap} */ +const compilationHooksMap = new WeakMap(); + +const PLUGIN_NAME = "AsyncWebAssemblyModulesPlugin"; + +class AsyncWebAssemblyModulesPlugin { + /** + * @param {Compilation} compilation the compilation + * @returns {CompilationHooks} the attached hooks + */ + static getCompilationHooks(compilation) { + if (!(compilation instanceof Compilation)) { + throw new TypeError( + "The 'compilation' argument must be an instance of Compilation" + ); + } + let hooks = compilationHooksMap.get(compilation); + if (hooks === undefined) { + hooks = { + renderModuleContent: new SyncWaterfallHook([ + "source", + "module", + "renderContext" + ]) + }; + compilationHooksMap.set(compilation, hooks); + } + return hooks; + } + + /** + * @param {AsyncWebAssemblyModulesPluginOptions} options options + */ + constructor(options) { + this.options = options; + } + + /** + * Apply the plugin + * @param {Compiler} compiler the compiler instance + * @returns {void} + */ + apply(compiler) { + compiler.hooks.compilation.tap( + PLUGIN_NAME, + (compilation, { normalModuleFactory }) => { + const hooks = + AsyncWebAssemblyModulesPlugin.getCompilationHooks(compilation); + compilation.dependencyFactories.set( + WebAssemblyImportDependency, + normalModuleFactory + ); + + normalModuleFactory.hooks.createParser + .for(WEBASSEMBLY_MODULE_TYPE_ASYNC) + .tap(PLUGIN_NAME, () => { + const AsyncWebAssemblyParser = getAsyncWebAssemblyParser(); + + return new AsyncWebAssemblyParser(); + }); + normalModuleFactory.hooks.createGenerator + .for(WEBASSEMBLY_MODULE_TYPE_ASYNC) + .tap(PLUGIN_NAME, () => { + const AsyncWebAssemblyJavascriptGenerator = + getAsyncWebAssemblyJavascriptGenerator(); + const AsyncWebAssemblyGenerator = getAsyncWebAssemblyGenerator(); + + return Generator.byType({ + javascript: new AsyncWebAssemblyJavascriptGenerator( + compilation.outputOptions.webassemblyModuleFilename + ), + webassembly: new AsyncWebAssemblyGenerator(this.options) + }); + }); + + compilation.hooks.renderManifest.tap( + "WebAssemblyModulesPlugin", + (result, options) => { + const { moduleGraph, chunkGraph, runtimeTemplate } = compilation; + const { + chunk, + outputOptions, + dependencyTemplates, + codeGenerationResults + } = options; + + for (const module of chunkGraph.getOrderedChunkModulesIterable( + chunk, + compareModulesByIdOrIdentifier(chunkGraph) + )) { + if (module.type === WEBASSEMBLY_MODULE_TYPE_ASYNC) { + const filenameTemplate = + /** @type {NonNullable} */ + (outputOptions.webassemblyModuleFilename); + + result.push({ + render: () => + this.renderModule( + module, + { + chunk, + dependencyTemplates, + runtimeTemplate, + moduleGraph, + chunkGraph, + codeGenerationResults + }, + hooks + ), + filenameTemplate, + pathOptions: { + module, + runtime: chunk.runtime, + chunkGraph + }, + auxiliary: true, + identifier: `webassemblyAsyncModule${chunkGraph.getModuleId( + module + )}`, + hash: chunkGraph.getModuleHash(module, chunk.runtime) + }); + } + } + + return result; + } + ); + } + ); + } + + /** + * @param {Module} module the rendered module + * @param {WebAssemblyRenderContext} renderContext options object + * @param {CompilationHooks} hooks hooks + * @returns {Source} the newly generated source from rendering + */ + renderModule(module, renderContext, hooks) { + const { codeGenerationResults, chunk } = renderContext; + try { + const moduleSource = codeGenerationResults.getSource( + module, + chunk.runtime, + "webassembly" + ); + return tryRunOrWebpackError( + () => + hooks.renderModuleContent.call(moduleSource, module, renderContext), + "AsyncWebAssemblyModulesPlugin.getCompilationHooks().renderModuleContent" + ); + } catch (err) { + /** @type {WebpackError} */ (err).module = module; + throw err; + } + } +} + +module.exports = AsyncWebAssemblyModulesPlugin; diff --git a/lib/wasm-async/AsyncWebAssemblyParser.js b/lib/wasm-async/AsyncWebAssemblyParser.js new file mode 100644 index 00000000000..40f1c79eacc --- /dev/null +++ b/lib/wasm-async/AsyncWebAssemblyParser.js @@ -0,0 +1,88 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const t = require("@webassemblyjs/ast"); +const { decode } = require("@webassemblyjs/wasm-parser"); +const EnvironmentNotSupportAsyncWarning = require("../EnvironmentNotSupportAsyncWarning"); +const Parser = require("../Parser"); +const StaticExportsDependency = require("../dependencies/StaticExportsDependency"); +const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency"); + +/** @typedef {import("../Module").BuildInfo} BuildInfo */ +/** @typedef {import("../Module").BuildMeta} BuildMeta */ +/** @typedef {import("../Parser").ParserState} ParserState */ +/** @typedef {import("../Parser").PreparsedAst} PreparsedAst */ + +const decoderOpts = { + ignoreCodeSection: true, + ignoreDataSection: true, + + // this will avoid having to lookup with identifiers in the ModuleContext + ignoreCustomNameSection: true +}; + +class WebAssemblyParser extends Parser { + /** + * @param {{}=} options parser options + */ + constructor(options) { + super(); + this.hooks = Object.freeze({}); + this.options = options; + } + + /** + * @param {string | Buffer | PreparsedAst} source the source to parse + * @param {ParserState} state the parser state + * @returns {ParserState} the parser state + */ + parse(source, state) { + if (!Buffer.isBuffer(source)) { + throw new Error("WebAssemblyParser input must be a Buffer"); + } + + // flag it as async module + const buildInfo = /** @type {BuildInfo} */ (state.module.buildInfo); + buildInfo.strict = true; + const BuildMeta = /** @type {BuildMeta} */ (state.module.buildMeta); + BuildMeta.exportsType = "namespace"; + BuildMeta.async = true; + EnvironmentNotSupportAsyncWarning.check( + state.module, + state.compilation.runtimeTemplate, + "asyncWebAssembly" + ); + + // parse it + const program = decode(source, decoderOpts); + const module = program.body[0]; + /** @type {Array} */ + const exports = []; + t.traverse(module, { + ModuleExport({ node }) { + exports.push(node.name); + }, + + ModuleImport({ node }) { + const dep = new WebAssemblyImportDependency( + node.module, + node.name, + node.descr, + false + ); + + state.module.addDependency(dep); + } + }); + + state.module.addDependency(new StaticExportsDependency(exports, false)); + + return state; + } +} + +module.exports = WebAssemblyParser; diff --git a/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js b/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js new file mode 100644 index 00000000000..7d5fedf8b93 --- /dev/null +++ b/lib/wasm-async/UniversalCompileAsyncWasmPlugin.js @@ -0,0 +1,107 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Alexander Akait @alexander-akait +*/ + +"use strict"; + +const { WEBASSEMBLY_MODULE_TYPE_ASYNC } = require("../ModuleTypeConstants"); +const RuntimeGlobals = require("../RuntimeGlobals"); +const Template = require("../Template"); +const AsyncWasmLoadingRuntimeModule = require("../wasm-async/AsyncWasmLoadingRuntimeModule"); + +/** @typedef {import("../Chunk")} Chunk */ +/** @typedef {import("../Compiler")} Compiler */ + +const PLUGIN_NAME = "UniversalCompileAsyncWasmPlugin"; + +class UniversalCompileAsyncWasmPlugin { + /** + * Apply the plugin + * @param {Compiler} compiler the compiler instance + * @returns {void} + */ + apply(compiler) { + compiler.hooks.thisCompilation.tap(PLUGIN_NAME, compilation => { + const globalWasmLoading = compilation.outputOptions.wasmLoading; + /** + * @param {Chunk} chunk chunk + * @returns {boolean} true, if wasm loading is enabled for the chunk + */ + const isEnabledForChunk = chunk => { + const options = chunk.getEntryOptions(); + const wasmLoading = + options && options.wasmLoading !== undefined + ? options.wasmLoading + : globalWasmLoading; + return wasmLoading === "universal"; + }; + const generateBeforeInstantiateStreaming = () => + Template.asString([ + "if (!useFetch) {", + Template.indent(["return fallback();"]), + "}" + ]); + /** + * @param {string} path path + * @returns {string} code + */ + const generateBeforeLoadBinaryCode = path => + Template.asString([ + "var useFetch = typeof document !== 'undefined' || typeof self !== 'undefined';", + `var wasmUrl = ${path};` + ]); + /** + * @type {(path: string) => string} + */ + const generateLoadBinaryCode = () => + Template.asString([ + "(useFetch", + Template.indent([ + `? fetch(new URL(wasmUrl, ${compilation.outputOptions.importMetaName}.url))` + ]), + Template.indent([ + ": Promise.all([import('fs'), import('url')]).then(([{ readFile }, { URL }]) => new Promise((resolve, reject) => {", + Template.indent([ + `readFile(new URL(wasmUrl, ${compilation.outputOptions.importMetaName}.url), (err, buffer) => {`, + Template.indent([ + "if (err) return reject(err);", + "", + "// Fake fetch response", + "resolve({", + Template.indent(["arrayBuffer() { return buffer; }"]), + "});" + ]), + "});" + ]), + "})))" + ]) + ]); + + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.instantiateWasm) + .tap(PLUGIN_NAME, (chunk, set, { chunkGraph }) => { + if (!isEnabledForChunk(chunk)) return; + if ( + !chunkGraph.hasModuleInGraph( + chunk, + m => m.type === WEBASSEMBLY_MODULE_TYPE_ASYNC + ) + ) { + return; + } + compilation.addRuntimeModule( + chunk, + new AsyncWasmLoadingRuntimeModule({ + generateBeforeLoadBinaryCode, + generateLoadBinaryCode, + generateBeforeInstantiateStreaming, + supportsStreaming: true + }) + ); + }); + }); + } +} + +module.exports = UniversalCompileAsyncWasmPlugin; diff --git a/lib/wasm/UnsupportedWebAssemblyFeatureError.js b/lib/wasm-sync/UnsupportedWebAssemblyFeatureError.js similarity index 88% rename from lib/wasm/UnsupportedWebAssemblyFeatureError.js rename to lib/wasm-sync/UnsupportedWebAssemblyFeatureError.js index fede4eb21d4..5174862ca5c 100644 --- a/lib/wasm/UnsupportedWebAssemblyFeatureError.js +++ b/lib/wasm-sync/UnsupportedWebAssemblyFeatureError.js @@ -1,6 +1,7 @@ /* MIT License http://www.opensource.org/licenses/mit-license.php */ + "use strict"; const WebpackError = require("../WebpackError"); @@ -11,7 +12,5 @@ module.exports = class UnsupportedWebAssemblyFeatureError extends WebpackError { super(message); this.name = "UnsupportedWebAssemblyFeatureError"; this.hideStack = true; - - Error.captureStackTrace(this, this.constructor); } }; diff --git a/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js b/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js new file mode 100644 index 00000000000..594fb3de8ec --- /dev/null +++ b/lib/wasm-sync/WasmChunkLoadingRuntimeModule.js @@ -0,0 +1,413 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php +*/ + +"use strict"; + +const RuntimeGlobals = require("../RuntimeGlobals"); +const RuntimeModule = require("../RuntimeModule"); +const Template = require("../Template"); +const { compareModulesByIdentifier } = require("../util/comparators"); +const WebAssemblyUtils = require("./WebAssemblyUtils"); + +/** @typedef {import("@webassemblyjs/ast").Signature} Signature */ +/** @typedef {import("../Chunk")} Chunk */ +/** @typedef {import("../ChunkGraph")} ChunkGraph */ +/** @typedef {import("../ChunkGraph").ModuleId} ModuleId */ +/** @typedef {import("../Compilation")} Compilation */ +/** @typedef {import("../Module")} Module */ +/** @typedef {import("../Module").ReadOnlyRuntimeRequirements} ReadOnlyRuntimeRequirements */ +/** @typedef {import("../ModuleGraph")} ModuleGraph */ +/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */ + +// TODO webpack 6 remove the whole folder + +// Get all wasm modules +/** + * @param {ModuleGraph} moduleGraph the module graph + * @param {ChunkGraph} chunkGraph the chunk graph + * @param {Chunk} chunk the chunk + * @returns {Module[]} all wasm modules + */ +const getAllWasmModules = (moduleGraph, chunkGraph, chunk) => { + const wasmModules = chunk.getAllAsyncChunks(); + const array = []; + for (const chunk of wasmModules) { + for (const m of chunkGraph.getOrderedChunkModulesIterable( + chunk, + compareModulesByIdentifier + )) { + if (m.type.startsWith("webassembly")) { + array.push(m); + } + } + } + + return array; +}; + +/** + * generates the import object function for a module + * @param {ChunkGraph} chunkGraph the chunk graph + * @param {Module} module the module + * @param {boolean | undefined} mangle mangle imports + * @param {string[]} declarations array where declarations are pushed to + * @param {RuntimeSpec} runtime the runtime + * @returns {string} source code + */ +const generateImportObject = ( + chunkGraph, + module, + mangle, + declarations, + runtime +) => { + const moduleGraph = chunkGraph.moduleGraph; + /** @type {Map} */ + const waitForInstances = new Map(); + const properties = []; + const usedWasmDependencies = WebAssemblyUtils.getUsedDependencies( + moduleGraph, + module, + mangle + ); + for (const usedDep of usedWasmDependencies) { + const dep = usedDep.dependency; + const importedModule = moduleGraph.getModule(dep); + const exportName = dep.name; + const usedName = + importedModule && + moduleGraph + .getExportsInfo(importedModule) + .getUsedName(exportName, runtime); + const description = dep.description; + const direct = dep.onlyDirectImport; + + const module = usedDep.module; + const name = usedDep.name; + + if (direct) { + const instanceVar = `m${waitForInstances.size}`; + waitForInstances.set( + instanceVar, + /** @type {ModuleId} */ + (chunkGraph.getModuleId(/** @type {Module} */ (importedModule))) + ); + properties.push({ + module, + name, + value: `${instanceVar}[${JSON.stringify(usedName)}]` + }); + } else { + const params = + /** @type {Signature} */ + (description.signature).params.map( + (param, k) => `p${k}${param.valtype}` + ); + + const mod = `${RuntimeGlobals.moduleCache}[${JSON.stringify( + chunkGraph.getModuleId(/** @type {Module} */ (importedModule)) + )}]`; + const modExports = `${mod}.exports`; + + const cache = `wasmImportedFuncCache${declarations.length}`; + declarations.push(`var ${cache};`); + + const modCode = + /** @type {Module} */ + (importedModule).type.startsWith("webassembly") + ? `${mod} ? ${modExports}[${JSON.stringify(usedName)}] : ` + : ""; + + properties.push({ + module, + name, + value: Template.asString([ + `${modCode}function(${params}) {`, + Template.indent([ + `if(${cache} === undefined) ${cache} = ${modExports};`, + `return ${cache}[${JSON.stringify(usedName)}](${params});` + ]), + "}" + ]) + }); + } + } + + let importObject; + if (mangle) { + importObject = [ + "return {", + Template.indent([ + properties.map(p => `${JSON.stringify(p.name)}: ${p.value}`).join(",\n") + ]), + "};" + ]; + } else { + /** @type {Map>} */ + const propertiesByModule = new Map(); + for (const p of properties) { + let list = propertiesByModule.get(p.module); + if (list === undefined) { + propertiesByModule.set(p.module, (list = [])); + } + list.push(p); + } + importObject = [ + "return {", + Template.indent([ + Array.from(propertiesByModule, ([module, list]) => + Template.asString([ + `${JSON.stringify(module)}: {`, + Template.indent([ + list.map(p => `${JSON.stringify(p.name)}: ${p.value}`).join(",\n") + ]), + "}" + ]) + ).join(",\n") + ]), + "};" + ]; + } + + const moduleIdStringified = JSON.stringify(chunkGraph.getModuleId(module)); + if (waitForInstances.size === 1) { + const moduleId = Array.from(waitForInstances.values())[0]; + const promise = `installedWasmModules[${JSON.stringify(moduleId)}]`; + const variable = Array.from(waitForInstances.keys())[0]; + return Template.asString([ + `${moduleIdStringified}: function() {`, + Template.indent([ + `return promiseResolve().then(function() { return ${promise}; }).then(function(${variable}) {`, + Template.indent(importObject), + "});" + ]), + "}," + ]); + } else if (waitForInstances.size > 0) { + const promises = Array.from( + waitForInstances.values(), + id => `installedWasmModules[${JSON.stringify(id)}]` + ).join(", "); + const variables = Array.from( + waitForInstances.keys(), + (name, i) => `${name} = array[${i}]` + ).join(", "); + return Template.asString([ + `${moduleIdStringified}: function() {`, + Template.indent([ + `return promiseResolve().then(function() { return Promise.all([${promises}]); }).then(function(array) {`, + Template.indent([`var ${variables};`, ...importObject]), + "});" + ]), + "}," + ]); + } + return Template.asString([ + `${moduleIdStringified}: function() {`, + Template.indent(importObject), + "}," + ]); +}; + +/** + * @typedef {object} WasmChunkLoadingRuntimeModuleOptions + * @property {(path: string) => string} generateLoadBinaryCode + * @property {boolean=} supportsStreaming + * @property {boolean=} mangleImports + * @property {ReadOnlyRuntimeRequirements} runtimeRequirements + */ + +class WasmChunkLoadingRuntimeModule extends RuntimeModule { + /** + * @param {WasmChunkLoadingRuntimeModuleOptions} options options + */ + constructor({ + generateLoadBinaryCode, + supportsStreaming, + mangleImports, + runtimeRequirements + }) { + super("wasm chunk loading", RuntimeModule.STAGE_ATTACH); + this.generateLoadBinaryCode = generateLoadBinaryCode; + this.supportsStreaming = supportsStreaming; + this.mangleImports = mangleImports; + this._runtimeRequirements = runtimeRequirements; + } + + /** + * @returns {string | null} runtime code + */ + generate() { + const fn = RuntimeGlobals.ensureChunkHandlers; + const withHmr = this._runtimeRequirements.has( + RuntimeGlobals.hmrDownloadUpdateHandlers + ); + const compilation = /** @type {Compilation} */ (this.compilation); + const { moduleGraph, outputOptions } = compilation; + const chunkGraph = /** @type {ChunkGraph} */ (this.chunkGraph); + const chunk = /** @type {Chunk} */ (this.chunk); + const wasmModules = getAllWasmModules(moduleGraph, chunkGraph, chunk); + const { mangleImports } = this; + /** @type {string[]} */ + const declarations = []; + const importObjects = wasmModules.map(module => + generateImportObject( + chunkGraph, + module, + mangleImports, + declarations, + chunk.runtime + ) + ); + const chunkModuleIdMap = chunkGraph.getChunkModuleIdMap(chunk, m => + m.type.startsWith("webassembly") + ); + /** + * @param {string} content content + * @returns {string} created import object + */ + const createImportObject = content => + mangleImports + ? `{ ${JSON.stringify(WebAssemblyUtils.MANGLED_MODULE)}: ${content} }` + : content; + const wasmModuleSrcPath = compilation.getPath( + JSON.stringify(outputOptions.webassemblyModuleFilename), + { + hash: `" + ${RuntimeGlobals.getFullHash}() + "`, + hashWithLength: length => + `" + ${RuntimeGlobals.getFullHash}}().slice(0, ${length}) + "`, + module: { + id: '" + wasmModuleId + "', + hash: `" + ${JSON.stringify( + chunkGraph.getChunkModuleRenderedHashMap(chunk, m => + m.type.startsWith("webassembly") + ) + )}[chunkId][wasmModuleId] + "`, + hashWithLength(length) { + return `" + ${JSON.stringify( + chunkGraph.getChunkModuleRenderedHashMap( + chunk, + m => m.type.startsWith("webassembly"), + length + ) + )}[chunkId][wasmModuleId] + "`; + } + }, + runtime: chunk.runtime + } + ); + + const stateExpression = withHmr + ? `${RuntimeGlobals.hmrRuntimeStatePrefix}_wasm` + : undefined; + + return Template.asString([ + "// object to store loaded and loading wasm modules", + `var installedWasmModules = ${ + stateExpression ? `${stateExpression} = ${stateExpression} || ` : "" + }{};`, + "", + // This function is used to delay reading the installed wasm module promises + // by a microtask. Sorting them doesn't help because there are edge cases where + // sorting is not possible (modules splitted into different chunks). + // So we not even trying and solve this by a microtask delay. + "function promiseResolve() { return Promise.resolve(); }", + "", + Template.asString(declarations), + "var wasmImportObjects = {", + Template.indent(importObjects), + "};", + "", + `var wasmModuleMap = ${JSON.stringify( + chunkModuleIdMap, + undefined, + "\t" + )};`, + "", + "// object with all WebAssembly.instance exports", + `${RuntimeGlobals.wasmInstances} = {};`, + "", + "// Fetch + compile chunk loading for webassembly", + `${fn}.wasm = function(chunkId, promises) {`, + Template.indent([ + "", + "var wasmModules = wasmModuleMap[chunkId] || [];", + "", + "wasmModules.forEach(function(wasmModuleId, idx) {", + Template.indent([ + "var installedWasmModuleData = installedWasmModules[wasmModuleId];", + "", + '// a Promise means "currently loading" or "already loaded".', + "if(installedWasmModuleData)", + Template.indent(["promises.push(installedWasmModuleData);"]), + "else {", + Template.indent([ + "var importObject = wasmImportObjects[wasmModuleId]();", + `var req = ${this.generateLoadBinaryCode(wasmModuleSrcPath)};`, + "var promise;", + this.supportsStreaming + ? Template.asString([ + "if(importObject && typeof importObject.then === 'function' && typeof WebAssembly.compileStreaming === 'function') {", + Template.indent([ + "promise = Promise.all([WebAssembly.compileStreaming(req), importObject]).then(function(items) {", + Template.indent([ + `return WebAssembly.instantiate(items[0], ${createImportObject( + "items[1]" + )});` + ]), + "});" + ]), + "} else if(typeof WebAssembly.instantiateStreaming === 'function') {", + Template.indent([ + `promise = WebAssembly.instantiateStreaming(req, ${createImportObject( + "importObject" + )});` + ]) + ]) + : Template.asString([ + "if(importObject && typeof importObject.then === 'function') {", + Template.indent([ + "var bytesPromise = req.then(function(x) { return x.arrayBuffer(); });", + "promise = Promise.all([", + Template.indent([ + "bytesPromise.then(function(bytes) { return WebAssembly.compile(bytes); }),", + "importObject" + ]), + "]).then(function(items) {", + Template.indent([ + `return WebAssembly.instantiate(items[0], ${createImportObject( + "items[1]" + )});` + ]), + "});" + ]) + ]), + "} else {", + Template.indent([ + "var bytesPromise = req.then(function(x) { return x.arrayBuffer(); });", + "promise = bytesPromise.then(function(bytes) {", + Template.indent([ + `return WebAssembly.instantiate(bytes, ${createImportObject( + "importObject" + )});` + ]), + "});" + ]), + "}", + "promises.push(installedWasmModules[wasmModuleId] = promise.then(function(res) {", + Template.indent([ + `return ${RuntimeGlobals.wasmInstances}[wasmModuleId] = (res.instance || res).exports;` + ]), + "}));" + ]), + "}" + ]), + "});" + ]), + "};" + ]); + } +} + +module.exports = WasmChunkLoadingRuntimeModule; diff --git a/lib/wasm-sync/WasmFinalizeExportsPlugin.js b/lib/wasm-sync/WasmFinalizeExportsPlugin.js new file mode 100644 index 00000000000..c274b02fd81 --- /dev/null +++ b/lib/wasm-sync/WasmFinalizeExportsPlugin.js @@ -0,0 +1,91 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const formatLocation = require("../formatLocation"); +const UnsupportedWebAssemblyFeatureError = require("./UnsupportedWebAssemblyFeatureError"); + +/** @typedef {import("../Compiler")} Compiler */ +/** @typedef {import("../Dependency")} Dependency */ +/** @typedef {import("../Module")} Module */ +/** @typedef {import("../Module").BuildMeta} BuildMeta */ + +const PLUGIN_NAME = "WasmFinalizeExportsPlugin"; + +class WasmFinalizeExportsPlugin { + /** + * Apply the plugin + * @param {Compiler} compiler the compiler instance + * @returns {void} + */ + apply(compiler) { + compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => { + compilation.hooks.finishModules.tap(PLUGIN_NAME, modules => { + for (const module of modules) { + // 1. if a WebAssembly module + if (module.type.startsWith("webassembly") === true) { + const jsIncompatibleExports = + /** @type {BuildMeta} */ + (module.buildMeta).jsIncompatibleExports; + + if (jsIncompatibleExports === undefined) { + continue; + } + + for (const connection of compilation.moduleGraph.getIncomingConnections( + module + )) { + // 2. is active and referenced by a non-WebAssembly module + if ( + connection.isTargetActive(undefined) && + /** @type {Module} */ + (connection.originModule).type.startsWith("webassembly") === + false + ) { + const referencedExports = + compilation.getDependencyReferencedExports( + /** @type {Dependency} */ (connection.dependency), + undefined + ); + + for (const info of referencedExports) { + const names = Array.isArray(info) ? info : info.name; + if (names.length === 0) continue; + const name = names[0]; + if (typeof name === "object") continue; + // 3. and uses a func with an incompatible JS signature + if ( + Object.prototype.hasOwnProperty.call( + jsIncompatibleExports, + name + ) + ) { + // 4. error + const error = new UnsupportedWebAssemblyFeatureError( + `Export "${name}" with ${jsIncompatibleExports[name]} can only be used for direct wasm to wasm dependencies\n` + + `It's used from ${ + /** @type {Module} */ + (connection.originModule).readableIdentifier( + compilation.requestShortener + ) + } at ${formatLocation( + /** @type {Dependency} */ (connection.dependency).loc + )}.` + ); + error.module = module; + compilation.errors.push(error); + } + } + } + } + } + } + }); + }); + } +} + +module.exports = WasmFinalizeExportsPlugin; diff --git a/lib/wasm-sync/WebAssemblyGenerator.js b/lib/wasm-sync/WebAssemblyGenerator.js new file mode 100644 index 00000000000..a91cb35f82d --- /dev/null +++ b/lib/wasm-sync/WebAssemblyGenerator.js @@ -0,0 +1,536 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const t = require("@webassemblyjs/ast"); +const { moduleContextFromModuleAST } = require("@webassemblyjs/ast"); +const { editWithAST, addWithAST } = require("@webassemblyjs/wasm-edit"); +const { decode } = require("@webassemblyjs/wasm-parser"); +const { RawSource } = require("webpack-sources"); +const Generator = require("../Generator"); +const { WEBASSEMBLY_TYPES } = require("../ModuleSourceTypesConstants"); +const WebAssemblyUtils = require("./WebAssemblyUtils"); + +const WebAssemblyExportImportedDependency = require("../dependencies/WebAssemblyExportImportedDependency"); + +/** @typedef {import("webpack-sources").Source} Source */ +/** @typedef {import("../DependencyTemplates")} DependencyTemplates */ +/** @typedef {import("../Generator").GenerateContext} GenerateContext */ +/** @typedef {import("../Module")} Module */ +/** @typedef {import("../Module").SourceTypes} SourceTypes */ +/** @typedef {import("../ModuleGraph")} ModuleGraph */ +/** @typedef {import("../NormalModule")} NormalModule */ +/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */ +/** @typedef {import("../util/runtime").RuntimeSpec} RuntimeSpec */ +/** @typedef {import("./WebAssemblyUtils").UsedWasmDependency} UsedWasmDependency */ +/** @typedef {import("@webassemblyjs/ast").Instruction} Instruction */ +/** @typedef {import("@webassemblyjs/ast").ModuleImport} ModuleImport */ +/** @typedef {import("@webassemblyjs/ast").ModuleExport} ModuleExport */ +/** @typedef {import("@webassemblyjs/ast").Global} Global */ +/** @typedef {import("@webassemblyjs/ast").AST} AST */ +/** @typedef {import("@webassemblyjs/ast").GlobalType} GlobalType */ +/** + * @template T + * @typedef {import("@webassemblyjs/ast").NodePath} NodePath + */ + +/** + * @typedef {(buf: ArrayBuffer) => ArrayBuffer} ArrayBufferTransform + */ + +/** + * @template T + * @param {((prev: ArrayBuffer) => ArrayBuffer)[]} fns transforms + * @returns {ArrayBufferTransform} composed transform + */ +const compose = (...fns) => + fns.reduce( + (prevFn, nextFn) => value => nextFn(prevFn(value)), + value => value + ); + +/** + * Removes the start instruction + * @param {object} state state + * @param {AST} state.ast Module's ast + * @returns {ArrayBufferTransform} transform + */ +const removeStartFunc = state => bin => + editWithAST(state.ast, bin, { + Start(path) { + path.remove(); + } + }); + +/** + * Get imported globals + * @param {AST} ast Module's AST + * @returns {t.ModuleImport[]} - nodes + */ +const getImportedGlobals = ast => { + /** @type {t.ModuleImport[]} */ + const importedGlobals = []; + + t.traverse(ast, { + ModuleImport({ node }) { + if (t.isGlobalType(node.descr)) { + importedGlobals.push(node); + } + } + }); + + return importedGlobals; +}; + +/** + * Get the count for imported func + * @param {AST} ast Module's AST + * @returns {number} - count + */ +const getCountImportedFunc = ast => { + let count = 0; + + t.traverse(ast, { + ModuleImport({ node }) { + if (t.isFuncImportDescr(node.descr)) { + count++; + } + } + }); + + return count; +}; + +/** + * Get next type index + * @param {AST} ast Module's AST + * @returns {t.Index} - index + */ +const getNextTypeIndex = ast => { + const typeSectionMetadata = t.getSectionMetadata(ast, "type"); + + if (typeSectionMetadata === undefined) { + return t.indexLiteral(0); + } + + return t.indexLiteral(typeSectionMetadata.vectorOfSize.value); +}; + +/** + * Get next func index + * The Func section metadata provide information for implemented funcs + * in order to have the correct index we shift the index by number of external + * functions. + * @param {AST} ast Module's AST + * @param {number} countImportedFunc number of imported funcs + * @returns {t.Index} - index + */ +const getNextFuncIndex = (ast, countImportedFunc) => { + const funcSectionMetadata = t.getSectionMetadata(ast, "func"); + + if (funcSectionMetadata === undefined) { + return t.indexLiteral(0 + countImportedFunc); + } + + const vectorOfSize = funcSectionMetadata.vectorOfSize.value; + + return t.indexLiteral(vectorOfSize + countImportedFunc); +}; + +/** + * Creates an init instruction for a global type + * @param {t.GlobalType} globalType the global type + * @returns {t.Instruction} init expression + */ +const createDefaultInitForGlobal = globalType => { + if (globalType.valtype[0] === "i") { + // create NumberLiteral global initializer + return t.objectInstruction("const", globalType.valtype, [ + t.numberLiteralFromRaw(66) + ]); + } else if (globalType.valtype[0] === "f") { + // create FloatLiteral global initializer + return t.objectInstruction("const", globalType.valtype, [ + t.floatLiteral(66, false, false, "66") + ]); + } + throw new Error(`unknown type: ${globalType.valtype}`); +}; + +/** + * Rewrite the import globals: + * - removes the ModuleImport instruction + * - injects at the same offset a mutable global of the same type + * + * Since the imported globals are before the other global declarations, our + * indices will be preserved. + * + * Note that globals will become mutable. + * @param {object} state transformation state + * @param {AST} state.ast Module's ast + * @param {t.Instruction[]} state.additionalInitCode list of addition instructions for the init function + * @returns {ArrayBufferTransform} transform + */ +const rewriteImportedGlobals = state => bin => { + const additionalInitCode = state.additionalInitCode; + /** @type {Array} */ + const newGlobals = []; + + bin = editWithAST(state.ast, bin, { + ModuleImport(path) { + if (t.isGlobalType(path.node.descr)) { + const globalType = + /** @type {GlobalType} */ + (path.node.descr); + + globalType.mutability = "var"; + + const init = [ + createDefaultInitForGlobal(globalType), + t.instruction("end") + ]; + + newGlobals.push(t.global(globalType, init)); + + path.remove(); + } + }, + + // in order to preserve non-imported global's order we need to re-inject + // those as well + /** + * @param {NodePath} path path + */ + Global(path) { + const { node } = path; + const [init] = node.init; + + if (init.id === "get_global") { + node.globalType.mutability = "var"; + + const initialGlobalIdx = init.args[0]; + + node.init = [ + createDefaultInitForGlobal(node.globalType), + t.instruction("end") + ]; + + additionalInitCode.push( + /** + * get_global in global initializer only works for imported globals. + * They have the same indices as the init params, so use the + * same index. + */ + t.instruction("get_local", [initialGlobalIdx]), + t.instruction("set_global", [t.indexLiteral(newGlobals.length)]) + ); + } + + newGlobals.push(node); + + path.remove(); + } + }); + + // Add global declaration instructions + return addWithAST(state.ast, bin, newGlobals); +}; + +/** + * Rewrite the export names + * @param {object} state state + * @param {AST} state.ast Module's ast + * @param {Module} state.module Module + * @param {ModuleGraph} state.moduleGraph module graph + * @param {Set} state.externalExports Module + * @param {RuntimeSpec} state.runtime runtime + * @returns {ArrayBufferTransform} transform + */ +const rewriteExportNames = + ({ ast, moduleGraph, module, externalExports, runtime }) => + bin => + editWithAST(ast, bin, { + /** + * @param {NodePath} path path + */ + ModuleExport(path) { + const isExternal = externalExports.has(path.node.name); + if (isExternal) { + path.remove(); + return; + } + const usedName = moduleGraph + .getExportsInfo(module) + .getUsedName(path.node.name, runtime); + if (!usedName) { + path.remove(); + return; + } + path.node.name = /** @type {string} */ (usedName); + } + }); + +/** + * Mangle import names and modules + * @param {object} state state + * @param {AST} state.ast Module's ast + * @param {Map} state.usedDependencyMap mappings to mangle names + * @returns {ArrayBufferTransform} transform + */ +const rewriteImports = + ({ ast, usedDependencyMap }) => + bin => + editWithAST(ast, bin, { + /** + * @param {NodePath} path path + */ + ModuleImport(path) { + const result = usedDependencyMap.get( + `${path.node.module}:${path.node.name}` + ); + + if (result !== undefined) { + path.node.module = result.module; + path.node.name = result.name; + } + } + }); + +/** + * Add an init function. + * + * The init function fills the globals given input arguments. + * @param {object} state transformation state + * @param {AST} state.ast Module's ast + * @param {t.Identifier} state.initFuncId identifier of the init function + * @param {t.Index} state.startAtFuncOffset index of the start function + * @param {t.ModuleImport[]} state.importedGlobals list of imported globals + * @param {t.Instruction[]} state.additionalInitCode list of addition instructions for the init function + * @param {t.Index} state.nextFuncIndex index of the next function + * @param {t.Index} state.nextTypeIndex index of the next type + * @returns {ArrayBufferTransform} transform + */ +const addInitFunction = + ({ + ast, + initFuncId, + startAtFuncOffset, + importedGlobals, + additionalInitCode, + nextFuncIndex, + nextTypeIndex + }) => + bin => { + const funcParams = importedGlobals.map(importedGlobal => { + // used for debugging + const id = t.identifier( + `${importedGlobal.module}.${importedGlobal.name}` + ); + + return t.funcParam( + /** @type {string} */ (importedGlobal.descr.valtype), + id + ); + }); + + /** @type {Instruction[]} */ + const funcBody = []; + for (const [index, _importedGlobal] of importedGlobals.entries()) { + const args = [t.indexLiteral(index)]; + const body = [ + t.instruction("get_local", args), + t.instruction("set_global", args) + ]; + + funcBody.push(...body); + } + + if (typeof startAtFuncOffset === "number") { + funcBody.push( + t.callInstruction(t.numberLiteralFromRaw(startAtFuncOffset)) + ); + } + + for (const instr of additionalInitCode) { + funcBody.push(instr); + } + + funcBody.push(t.instruction("end")); + + /** @type {string[]} */ + const funcResults = []; + + // Code section + const funcSignature = t.signature(funcParams, funcResults); + const func = t.func(initFuncId, funcSignature, funcBody); + + // Type section + const functype = t.typeInstruction(undefined, funcSignature); + + // Func section + const funcindex = t.indexInFuncSection(nextTypeIndex); + + // Export section + const moduleExport = t.moduleExport( + initFuncId.value, + t.moduleExportDescr("Func", nextFuncIndex) + ); + + return addWithAST(ast, bin, [func, moduleExport, funcindex, functype]); + }; + +/** + * Extract mangle mappings from module + * @param {ModuleGraph} moduleGraph module graph + * @param {Module} module current module + * @param {boolean | undefined} mangle mangle imports + * @returns {Map} mappings to mangled names + */ +const getUsedDependencyMap = (moduleGraph, module, mangle) => { + /** @type {Map} */ + const map = new Map(); + for (const usedDep of WebAssemblyUtils.getUsedDependencies( + moduleGraph, + module, + mangle + )) { + const dep = usedDep.dependency; + const request = dep.request; + const exportName = dep.name; + map.set(`${request}:${exportName}`, usedDep); + } + return map; +}; + +/** + * @typedef {object} WebAssemblyGeneratorOptions + * @property {boolean=} mangleImports mangle imports + */ + +class WebAssemblyGenerator extends Generator { + /** + * @param {WebAssemblyGeneratorOptions} options options + */ + constructor(options) { + super(); + this.options = options; + } + + /** + * @param {NormalModule} module fresh module + * @returns {SourceTypes} available types (do not mutate) + */ + getTypes(module) { + return WEBASSEMBLY_TYPES; + } + + /** + * @param {NormalModule} module the module + * @param {string=} type source type + * @returns {number} estimate size of the module + */ + getSize(module, type) { + const originalSource = module.originalSource(); + if (!originalSource) { + return 0; + } + return originalSource.size(); + } + + /** + * @param {NormalModule} module module for which the code should be generated + * @param {GenerateContext} generateContext context for generate + * @returns {Source | null} generated code + */ + generate(module, { moduleGraph, runtime }) { + const bin = + /** @type {Buffer} */ + (/** @type {Source} */ (module.originalSource()).source()); + + const initFuncId = t.identifier(""); + + // parse it + const ast = decode(bin, { + ignoreDataSection: true, + ignoreCodeSection: true, + ignoreCustomNameSection: true + }); + + const moduleContext = moduleContextFromModuleAST(ast.body[0]); + + const importedGlobals = getImportedGlobals(ast); + const countImportedFunc = getCountImportedFunc(ast); + const startAtFuncOffset = moduleContext.getStart(); + const nextFuncIndex = getNextFuncIndex(ast, countImportedFunc); + const nextTypeIndex = getNextTypeIndex(ast); + + const usedDependencyMap = getUsedDependencyMap( + moduleGraph, + module, + this.options.mangleImports + ); + const externalExports = new Set( + module.dependencies + .filter(d => d instanceof WebAssemblyExportImportedDependency) + .map(d => { + const wasmDep = /** @type {WebAssemblyExportImportedDependency} */ ( + d + ); + return wasmDep.exportName; + }) + ); + + /** @type {t.Instruction[]} */ + const additionalInitCode = []; + + const transform = compose( + rewriteExportNames({ + ast, + moduleGraph, + module, + externalExports, + runtime + }), + + removeStartFunc({ ast }), + + rewriteImportedGlobals({ ast, additionalInitCode }), + + rewriteImports({ + ast, + usedDependencyMap + }), + + addInitFunction({ + ast, + initFuncId, + importedGlobals, + additionalInitCode, + startAtFuncOffset, + nextFuncIndex, + nextTypeIndex + }) + ); + + const newBin = transform(bin); + + const newBuf = Buffer.from(newBin); + + return new RawSource(newBuf); + } + + /** + * @param {Error} error the error + * @param {NormalModule} module module for which the code should be generated + * @param {GenerateContext} generateContext context for generate + * @returns {Source | null} generated code + */ + generateError(error, module, generateContext) { + return new RawSource(error.message); + } +} + +module.exports = WebAssemblyGenerator; diff --git a/lib/wasm-sync/WebAssemblyInInitialChunkError.js b/lib/wasm-sync/WebAssemblyInInitialChunkError.js new file mode 100644 index 00000000000..9d78ed205f4 --- /dev/null +++ b/lib/wasm-sync/WebAssemblyInInitialChunkError.js @@ -0,0 +1,106 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php +*/ + +"use strict"; + +const WebpackError = require("../WebpackError"); + +/** @typedef {import("../ChunkGraph")} ChunkGraph */ +/** @typedef {import("../Module")} Module */ +/** @typedef {import("../ModuleGraph")} ModuleGraph */ +/** @typedef {import("../RequestShortener")} RequestShortener */ + +/** + * @param {Module} module module to get chains from + * @param {ModuleGraph} moduleGraph the module graph + * @param {ChunkGraph} chunkGraph the chunk graph + * @param {RequestShortener} requestShortener to make readable identifiers + * @returns {string[]} all chains to the module + */ +const getInitialModuleChains = ( + module, + moduleGraph, + chunkGraph, + requestShortener +) => { + const queue = [ + { head: module, message: module.readableIdentifier(requestShortener) } + ]; + /** @type {Set} */ + const results = new Set(); + /** @type {Set} */ + const incompleteResults = new Set(); + /** @type {Set} */ + const visitedModules = new Set(); + + for (const chain of queue) { + const { head, message } = chain; + let final = true; + /** @type {Set} */ + const alreadyReferencedModules = new Set(); + for (const connection of moduleGraph.getIncomingConnections(head)) { + const newHead = connection.originModule; + if (newHead) { + if (!chunkGraph.getModuleChunks(newHead).some(c => c.canBeInitial())) + continue; + final = false; + if (alreadyReferencedModules.has(newHead)) continue; + alreadyReferencedModules.add(newHead); + const moduleName = newHead.readableIdentifier(requestShortener); + const detail = connection.explanation + ? ` (${connection.explanation})` + : ""; + const newMessage = `${moduleName}${detail} --> ${message}`; + if (visitedModules.has(newHead)) { + incompleteResults.add(`... --> ${newMessage}`); + continue; + } + visitedModules.add(newHead); + queue.push({ + head: newHead, + message: newMessage + }); + } else { + final = false; + const newMessage = connection.explanation + ? `(${connection.explanation}) --> ${message}` + : message; + results.add(newMessage); + } + } + if (final) { + results.add(message); + } + } + for (const result of incompleteResults) { + results.add(result); + } + return Array.from(results); +}; + +module.exports = class WebAssemblyInInitialChunkError extends WebpackError { + /** + * @param {Module} module WASM module + * @param {ModuleGraph} moduleGraph the module graph + * @param {ChunkGraph} chunkGraph the chunk graph + * @param {RequestShortener} requestShortener request shortener + */ + constructor(module, moduleGraph, chunkGraph, requestShortener) { + const moduleChains = getInitialModuleChains( + module, + moduleGraph, + chunkGraph, + requestShortener + ); + const message = `WebAssembly module is included in initial chunk. +This is not allowed, because WebAssembly download and compilation must happen asynchronous. +Add an async split point (i. e. import()) somewhere between your entrypoint and the WebAssembly module: +${moduleChains.map(s => `* ${s}`).join("\n")}`; + + super(message); + this.name = "WebAssemblyInInitialChunkError"; + this.hideStack = true; + this.module = module; + } +}; diff --git a/lib/wasm-sync/WebAssemblyJavascriptGenerator.js b/lib/wasm-sync/WebAssemblyJavascriptGenerator.js new file mode 100644 index 00000000000..eddef16eb5d --- /dev/null +++ b/lib/wasm-sync/WebAssemblyJavascriptGenerator.js @@ -0,0 +1,227 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const { RawSource } = require("webpack-sources"); +const { UsageState } = require("../ExportsInfo"); +const Generator = require("../Generator"); +const InitFragment = require("../InitFragment"); +const { WEBASSEMBLY_TYPES } = require("../ModuleSourceTypesConstants"); +const RuntimeGlobals = require("../RuntimeGlobals"); +const Template = require("../Template"); +const ModuleDependency = require("../dependencies/ModuleDependency"); +const WebAssemblyExportImportedDependency = require("../dependencies/WebAssemblyExportImportedDependency"); +const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency"); + +/** @typedef {import("webpack-sources").Source} Source */ +/** @typedef {import("../Dependency")} Dependency */ +/** @typedef {import("../DependencyTemplates")} DependencyTemplates */ +/** @typedef {import("../Generator").GenerateContext} GenerateContext */ +/** @typedef {import("../Module")} Module */ +/** @typedef {import("../Module").SourceTypes} SourceTypes */ +/** @typedef {import("../NormalModule")} NormalModule */ +/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */ + +class WebAssemblyJavascriptGenerator extends Generator { + /** + * @param {NormalModule} module fresh module + * @returns {SourceTypes} available types (do not mutate) + */ + getTypes(module) { + return WEBASSEMBLY_TYPES; + } + + /** + * @param {NormalModule} module the module + * @param {string=} type source type + * @returns {number} estimate size of the module + */ + getSize(module, type) { + return 95 + module.dependencies.length * 5; + } + + /** + * @param {NormalModule} module module for which the code should be generated + * @param {GenerateContext} generateContext context for generate + * @returns {Source | null} generated code + */ + generate(module, generateContext) { + const { + runtimeTemplate, + moduleGraph, + chunkGraph, + runtimeRequirements, + runtime + } = generateContext; + /** @type {InitFragment>[]} */ + const initFragments = []; + + const exportsInfo = moduleGraph.getExportsInfo(module); + + let needExportsCopy = false; + const importedModules = new Map(); + const initParams = []; + let index = 0; + for (const dep of module.dependencies) { + const moduleDep = + dep && dep instanceof ModuleDependency ? dep : undefined; + if (moduleGraph.getModule(dep)) { + let importData = importedModules.get(moduleGraph.getModule(dep)); + if (importData === undefined) { + importedModules.set( + moduleGraph.getModule(dep), + (importData = { + importVar: `m${index}`, + index, + request: (moduleDep && moduleDep.userRequest) || undefined, + names: new Set(), + reexports: [] + }) + ); + index++; + } + if (dep instanceof WebAssemblyImportDependency) { + importData.names.add(dep.name); + if (dep.description.type === "GlobalType") { + const exportName = dep.name; + const importedModule = moduleGraph.getModule(dep); + + if (importedModule) { + const usedName = moduleGraph + .getExportsInfo(importedModule) + .getUsedName(exportName, runtime); + if (usedName) { + initParams.push( + runtimeTemplate.exportFromImport({ + moduleGraph, + module: importedModule, + request: dep.request, + importVar: importData.importVar, + originModule: module, + exportName: dep.name, + asiSafe: true, + isCall: false, + callContext: null, + defaultInterop: true, + initFragments, + runtime, + runtimeRequirements + }) + ); + } + } + } + } + if (dep instanceof WebAssemblyExportImportedDependency) { + importData.names.add(dep.name); + const usedName = moduleGraph + .getExportsInfo(module) + .getUsedName(dep.exportName, runtime); + if (usedName) { + runtimeRequirements.add(RuntimeGlobals.exports); + const exportProp = `${module.exportsArgument}[${JSON.stringify( + usedName + )}]`; + const defineStatement = Template.asString([ + `${exportProp} = ${runtimeTemplate.exportFromImport({ + moduleGraph, + module: /** @type {Module} */ (moduleGraph.getModule(dep)), + request: dep.request, + importVar: importData.importVar, + originModule: module, + exportName: dep.name, + asiSafe: true, + isCall: false, + callContext: null, + defaultInterop: true, + initFragments, + runtime, + runtimeRequirements + })};`, + `if(WebAssembly.Global) ${exportProp} = ` + + `new WebAssembly.Global({ value: ${JSON.stringify( + dep.valueType + )} }, ${exportProp});` + ]); + importData.reexports.push(defineStatement); + needExportsCopy = true; + } + } + } + } + const importsCode = Template.asString( + Array.from( + importedModules, + ([module, { importVar, request, reexports }]) => { + const importStatement = runtimeTemplate.importStatement({ + module, + chunkGraph, + request, + importVar, + originModule: module, + runtimeRequirements + }); + return importStatement[0] + importStatement[1] + reexports.join("\n"); + } + ) + ); + + const copyAllExports = + exportsInfo.otherExportsInfo.getUsed(runtime) === UsageState.Unused && + !needExportsCopy; + + // need these globals + runtimeRequirements.add(RuntimeGlobals.module); + runtimeRequirements.add(RuntimeGlobals.moduleId); + runtimeRequirements.add(RuntimeGlobals.wasmInstances); + if (exportsInfo.otherExportsInfo.getUsed(runtime) !== UsageState.Unused) { + runtimeRequirements.add(RuntimeGlobals.makeNamespaceObject); + runtimeRequirements.add(RuntimeGlobals.exports); + } + if (!copyAllExports) { + runtimeRequirements.add(RuntimeGlobals.exports); + } + + // create source + const source = new RawSource( + [ + '"use strict";', + "// Instantiate WebAssembly module", + `var wasmExports = ${RuntimeGlobals.wasmInstances}[${module.moduleArgument}.id];`, + + exportsInfo.otherExportsInfo.getUsed(runtime) !== UsageState.Unused + ? `${RuntimeGlobals.makeNamespaceObject}(${module.exportsArgument});` + : "", + + // this must be before import for circular dependencies + "// export exports from WebAssembly module", + copyAllExports + ? `${module.moduleArgument}.exports = wasmExports;` + : "for(var name in wasmExports) " + + "if(name) " + + `${module.exportsArgument}[name] = wasmExports[name];`, + "// exec imports from WebAssembly module (for esm order)", + importsCode, + "", + "// exec wasm module", + `wasmExports[""](${initParams.join(", ")})` + ].join("\n") + ); + return InitFragment.addToSource(source, initFragments, generateContext); + } + + /** + * @param {Error} error the error + * @param {NormalModule} module module for which the code should be generated + * @param {GenerateContext} generateContext context for generate + * @returns {Source | null} generated code + */ + generateError(error, module, generateContext) { + return new RawSource(`throw new Error(${JSON.stringify(error.message)});`); + } +} + +module.exports = WebAssemblyJavascriptGenerator; diff --git a/lib/wasm-sync/WebAssemblyModulesPlugin.js b/lib/wasm-sync/WebAssemblyModulesPlugin.js new file mode 100644 index 00000000000..bdad089ddca --- /dev/null +++ b/lib/wasm-sync/WebAssemblyModulesPlugin.js @@ -0,0 +1,152 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const Generator = require("../Generator"); +const { WEBASSEMBLY_MODULE_TYPE_SYNC } = require("../ModuleTypeConstants"); +const WebAssemblyExportImportedDependency = require("../dependencies/WebAssemblyExportImportedDependency"); +const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency"); +const { compareModulesByIdOrIdentifier } = require("../util/comparators"); +const memoize = require("../util/memoize"); +const WebAssemblyInInitialChunkError = require("./WebAssemblyInInitialChunkError"); + +/** @typedef {import("webpack-sources").Source} Source */ +/** @typedef {import("../../declarations/WebpackOptions").OutputNormalized} OutputOptions */ +/** @typedef {import("../Compiler")} Compiler */ +/** @typedef {import("../Module")} Module */ +/** @typedef {import("../ModuleTemplate")} ModuleTemplate */ +/** @typedef {import("../javascript/JavascriptModulesPlugin").RenderContext} RenderContext */ + +const getWebAssemblyGenerator = memoize(() => + require("./WebAssemblyGenerator") +); +const getWebAssemblyJavascriptGenerator = memoize(() => + require("./WebAssemblyJavascriptGenerator") +); +const getWebAssemblyParser = memoize(() => require("./WebAssemblyParser")); + +const PLUGIN_NAME = "WebAssemblyModulesPlugin"; + +/** + * @typedef {object} WebAssemblyModulesPluginOptions + * @property {boolean=} mangleImports mangle imports + */ + +class WebAssemblyModulesPlugin { + /** + * @param {WebAssemblyModulesPluginOptions} options options + */ + constructor(options) { + this.options = options; + } + + /** + * Apply the plugin + * @param {Compiler} compiler the compiler instance + * @returns {void} + */ + apply(compiler) { + compiler.hooks.compilation.tap( + PLUGIN_NAME, + (compilation, { normalModuleFactory }) => { + compilation.dependencyFactories.set( + WebAssemblyImportDependency, + normalModuleFactory + ); + + compilation.dependencyFactories.set( + WebAssemblyExportImportedDependency, + normalModuleFactory + ); + + normalModuleFactory.hooks.createParser + .for(WEBASSEMBLY_MODULE_TYPE_SYNC) + .tap(PLUGIN_NAME, () => { + const WebAssemblyParser = getWebAssemblyParser(); + + return new WebAssemblyParser(); + }); + + normalModuleFactory.hooks.createGenerator + .for(WEBASSEMBLY_MODULE_TYPE_SYNC) + .tap(PLUGIN_NAME, () => { + const WebAssemblyJavascriptGenerator = + getWebAssemblyJavascriptGenerator(); + const WebAssemblyGenerator = getWebAssemblyGenerator(); + + return Generator.byType({ + javascript: new WebAssemblyJavascriptGenerator(), + webassembly: new WebAssemblyGenerator(this.options) + }); + }); + + compilation.hooks.renderManifest.tap(PLUGIN_NAME, (result, options) => { + const { chunkGraph } = compilation; + const { chunk, outputOptions, codeGenerationResults } = options; + + for (const module of chunkGraph.getOrderedChunkModulesIterable( + chunk, + compareModulesByIdOrIdentifier(chunkGraph) + )) { + if (module.type === WEBASSEMBLY_MODULE_TYPE_SYNC) { + const filenameTemplate = + /** @type {NonNullable} */ + (outputOptions.webassemblyModuleFilename); + + result.push({ + render: () => + codeGenerationResults.getSource( + module, + chunk.runtime, + "webassembly" + ), + filenameTemplate, + pathOptions: { + module, + runtime: chunk.runtime, + chunkGraph + }, + auxiliary: true, + identifier: `webassemblyModule${chunkGraph.getModuleId( + module + )}`, + hash: chunkGraph.getModuleHash(module, chunk.runtime) + }); + } + } + + return result; + }); + + compilation.hooks.afterChunks.tap(PLUGIN_NAME, () => { + const chunkGraph = compilation.chunkGraph; + const initialWasmModules = new Set(); + for (const chunk of compilation.chunks) { + if (chunk.canBeInitial()) { + for (const module of chunkGraph.getChunkModulesIterable(chunk)) { + if (module.type === WEBASSEMBLY_MODULE_TYPE_SYNC) { + initialWasmModules.add(module); + } + } + } + } + for (const module of initialWasmModules) { + compilation.errors.push( + new WebAssemblyInInitialChunkError( + module, + compilation.moduleGraph, + compilation.chunkGraph, + compilation.requestShortener + ) + ); + } + }); + } + ); + } +} + +module.exports = WebAssemblyModulesPlugin; diff --git a/lib/wasm-sync/WebAssemblyParser.js b/lib/wasm-sync/WebAssemblyParser.js new file mode 100644 index 00000000000..5dd887dfdc7 --- /dev/null +++ b/lib/wasm-sync/WebAssemblyParser.js @@ -0,0 +1,211 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const t = require("@webassemblyjs/ast"); +const { moduleContextFromModuleAST } = require("@webassemblyjs/ast"); +const { decode } = require("@webassemblyjs/wasm-parser"); +const Parser = require("../Parser"); +const StaticExportsDependency = require("../dependencies/StaticExportsDependency"); +const WebAssemblyExportImportedDependency = require("../dependencies/WebAssemblyExportImportedDependency"); +const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency"); + +/** @typedef {import("@webassemblyjs/ast").ModuleImport} ModuleImport */ +/** @typedef {import("@webassemblyjs/ast").NumberLiteral} NumberLiteral */ +/** @typedef {import("../Module")} Module */ +/** @typedef {import("../Module").BuildInfo} BuildInfo */ +/** @typedef {import("../Module").BuildMeta} BuildMeta */ +/** @typedef {import("../Parser").ParserState} ParserState */ +/** @typedef {import("../Parser").PreparsedAst} PreparsedAst */ + +const JS_COMPAT_TYPES = new Set(["i32", "i64", "f32", "f64", "externref"]); + +/** + * @param {t.Signature} signature the func signature + * @returns {null | string} the type incompatible with js types + */ +const getJsIncompatibleType = signature => { + for (const param of signature.params) { + if (!JS_COMPAT_TYPES.has(param.valtype)) { + return `${param.valtype} as parameter`; + } + } + for (const type of signature.results) { + if (!JS_COMPAT_TYPES.has(type)) return `${type} as result`; + } + return null; +}; + +/** + * TODO why are there two different Signature types? + * @param {t.FuncSignature} signature the func signature + * @returns {null | string} the type incompatible with js types + */ +const getJsIncompatibleTypeOfFuncSignature = signature => { + for (const param of signature.args) { + if (!JS_COMPAT_TYPES.has(param)) { + return `${param} as parameter`; + } + } + for (const type of signature.result) { + if (!JS_COMPAT_TYPES.has(type)) return `${type} as result`; + } + return null; +}; + +const decoderOpts = { + ignoreCodeSection: true, + ignoreDataSection: true, + + // this will avoid having to lookup with identifiers in the ModuleContext + ignoreCustomNameSection: true +}; + +class WebAssemblyParser extends Parser { + /** + * @param {{}=} options parser options + */ + constructor(options) { + super(); + this.hooks = Object.freeze({}); + this.options = options; + } + + /** + * @param {string | Buffer | PreparsedAst} source the source to parse + * @param {ParserState} state the parser state + * @returns {ParserState} the parser state + */ + parse(source, state) { + if (!Buffer.isBuffer(source)) { + throw new Error("WebAssemblyParser input must be a Buffer"); + } + + // flag it as ESM + /** @type {BuildInfo} */ + (state.module.buildInfo).strict = true; + /** @type {BuildMeta} */ + (state.module.buildMeta).exportsType = "namespace"; + + // parse it + const program = decode(source, decoderOpts); + const module = program.body[0]; + + const moduleContext = moduleContextFromModuleAST(module); + + // extract imports and exports + /** @type {string[]} */ + const exports = []; + const buildMeta = /** @type {BuildMeta} */ (state.module.buildMeta); + /** @type {Record | undefined} */ + let jsIncompatibleExports = (buildMeta.jsIncompatibleExports = undefined); + + /** @type {(ModuleImport | null)[]} */ + const importedGlobals = []; + + t.traverse(module, { + ModuleExport({ node }) { + const descriptor = node.descr; + + if (descriptor.exportType === "Func") { + const funcIdx = descriptor.id.value; + + /** @type {t.FuncSignature} */ + const funcSignature = moduleContext.getFunction(funcIdx); + + const incompatibleType = + getJsIncompatibleTypeOfFuncSignature(funcSignature); + + if (incompatibleType) { + if (jsIncompatibleExports === undefined) { + jsIncompatibleExports = + /** @type {BuildMeta} */ + (state.module.buildMeta).jsIncompatibleExports = {}; + } + jsIncompatibleExports[node.name] = incompatibleType; + } + } + + exports.push(node.name); + + if (node.descr && node.descr.exportType === "Global") { + const refNode = + importedGlobals[/** @type {NumberLiteral} */ (node.descr.id).value]; + if (refNode) { + const dep = new WebAssemblyExportImportedDependency( + node.name, + refNode.module, + refNode.name, + /** @type {string} */ + (refNode.descr.valtype) + ); + + state.module.addDependency(dep); + } + } + }, + + Global({ node }) { + const init = node.init[0]; + + let importNode = null; + + if (init.id === "get_global") { + const globalIdx = init.args[0].value; + + if (globalIdx < importedGlobals.length) { + importNode = importedGlobals[globalIdx]; + } + } + + importedGlobals.push(importNode); + }, + + ModuleImport({ node }) { + /** @type {false | string} */ + let onlyDirectImport = false; + + if (t.isMemory(node.descr) === true) { + onlyDirectImport = "Memory"; + } else if (t.isTable(node.descr) === true) { + onlyDirectImport = "Table"; + } else if (t.isFuncImportDescr(node.descr) === true) { + const incompatibleType = getJsIncompatibleType( + /** @type {t.Signature} */ + (node.descr.signature) + ); + if (incompatibleType) { + onlyDirectImport = `Non-JS-compatible Func Signature (${incompatibleType})`; + } + } else if (t.isGlobalType(node.descr) === true) { + const type = /** @type {string} */ (node.descr.valtype); + if (!JS_COMPAT_TYPES.has(type)) { + onlyDirectImport = `Non-JS-compatible Global Type (${type})`; + } + } + + const dep = new WebAssemblyImportDependency( + node.module, + node.name, + node.descr, + onlyDirectImport + ); + + state.module.addDependency(dep); + + if (t.isGlobalType(node.descr)) { + importedGlobals.push(node); + } + } + }); + + state.module.addDependency(new StaticExportsDependency(exports, false)); + + return state; + } +} + +module.exports = WebAssemblyParser; diff --git a/lib/wasm-sync/WebAssemblyUtils.js b/lib/wasm-sync/WebAssemblyUtils.js new file mode 100644 index 00000000000..a67f3557268 --- /dev/null +++ b/lib/wasm-sync/WebAssemblyUtils.js @@ -0,0 +1,66 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const Template = require("../Template"); +const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency"); + +/** @typedef {import("../Module")} Module */ +/** @typedef {import("../ModuleGraph")} ModuleGraph */ + +/** + * @typedef {object} UsedWasmDependency + * @property {WebAssemblyImportDependency} dependency the dependency + * @property {string} name the export name + * @property {string} module the module name + */ + +const MANGLED_MODULE = "a"; + +/** + * @param {ModuleGraph} moduleGraph the module graph + * @param {Module} module the module + * @param {boolean | undefined} mangle mangle module and export names + * @returns {UsedWasmDependency[]} used dependencies and (mangled) name + */ +const getUsedDependencies = (moduleGraph, module, mangle) => { + /** @type {UsedWasmDependency[]} */ + const array = []; + let importIndex = 0; + for (const dep of module.dependencies) { + if (dep instanceof WebAssemblyImportDependency) { + if ( + dep.description.type === "GlobalType" || + moduleGraph.getModule(dep) === null + ) { + continue; + } + + const exportName = dep.name; + // TODO add the following 3 lines when removing of ModuleExport is possible + // const importedModule = moduleGraph.getModule(dep); + // const usedName = importedModule && moduleGraph.getExportsInfo(importedModule).getUsedName(exportName, runtime); + // if (usedName !== false) { + if (mangle) { + array.push({ + dependency: dep, + name: Template.numberToIdentifier(importIndex++), + module: MANGLED_MODULE + }); + } else { + array.push({ + dependency: dep, + name: exportName, + module: dep.request + }); + } + } + } + return array; +}; + +module.exports.getUsedDependencies = getUsedDependencies; +module.exports.MANGLED_MODULE = MANGLED_MODULE; diff --git a/lib/wasm/EnableWasmLoadingPlugin.js b/lib/wasm/EnableWasmLoadingPlugin.js new file mode 100644 index 00000000000..4d4dace131b --- /dev/null +++ b/lib/wasm/EnableWasmLoadingPlugin.js @@ -0,0 +1,134 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +/** @typedef {import("../../declarations/WebpackOptions").LibraryOptions} LibraryOptions */ +/** @typedef {import("../../declarations/WebpackOptions").WasmLoadingType} WasmLoadingType */ +/** @typedef {import("../Compiler")} Compiler */ + +/** @type {WeakMap>} */ +const enabledTypes = new WeakMap(); + +/** + * @param {Compiler} compiler compiler instance + * @returns {Set} enabled types + */ +const getEnabledTypes = compiler => { + let set = enabledTypes.get(compiler); + if (set === undefined) { + set = new Set(); + enabledTypes.set(compiler, set); + } + return set; +}; + +class EnableWasmLoadingPlugin { + /** + * @param {WasmLoadingType} type library type that should be available + */ + constructor(type) { + this.type = type; + } + + /** + * @param {Compiler} compiler the compiler instance + * @param {WasmLoadingType} type type of library + * @returns {void} + */ + static setEnabled(compiler, type) { + getEnabledTypes(compiler).add(type); + } + + /** + * @param {Compiler} compiler the compiler instance + * @param {WasmLoadingType} type type of library + * @returns {void} + */ + static checkEnabled(compiler, type) { + if (!getEnabledTypes(compiler).has(type)) { + throw new Error( + `Library type "${type}" is not enabled. ` + + "EnableWasmLoadingPlugin need to be used to enable this type of wasm loading. " + + 'This usually happens through the "output.enabledWasmLoadingTypes" option. ' + + 'If you are using a function as entry which sets "wasmLoading", you need to add all potential library types to "output.enabledWasmLoadingTypes". ' + + `These types are enabled: ${Array.from( + getEnabledTypes(compiler) + ).join(", ")}` + ); + } + } + + /** + * Apply the plugin + * @param {Compiler} compiler the compiler instance + * @returns {void} + */ + apply(compiler) { + const { type } = this; + + // Only enable once + const enabled = getEnabledTypes(compiler); + if (enabled.has(type)) return; + enabled.add(type); + + if (typeof type === "string") { + switch (type) { + case "fetch": { + if (compiler.options.experiments.syncWebAssembly) { + // TODO webpack 6 remove FetchCompileWasmPlugin + const FetchCompileWasmPlugin = require("../web/FetchCompileWasmPlugin"); + new FetchCompileWasmPlugin({ + mangleImports: compiler.options.optimization.mangleWasmImports + }).apply(compiler); + } + + if (compiler.options.experiments.asyncWebAssembly) { + const FetchCompileAsyncWasmPlugin = require("../web/FetchCompileAsyncWasmPlugin"); + new FetchCompileAsyncWasmPlugin().apply(compiler); + } + + break; + } + case "async-node": { + if (compiler.options.experiments.syncWebAssembly) { + // TODO webpack 6 remove ReadFileCompileWasmPlugin + const ReadFileCompileWasmPlugin = require("../node/ReadFileCompileWasmPlugin"); + new ReadFileCompileWasmPlugin({ + mangleImports: compiler.options.optimization.mangleWasmImports, + import: + compiler.options.output.module && + compiler.options.output.environment.dynamicImport + }).apply(compiler); + } + + if (compiler.options.experiments.asyncWebAssembly) { + const ReadFileCompileAsyncWasmPlugin = require("../node/ReadFileCompileAsyncWasmPlugin"); + new ReadFileCompileAsyncWasmPlugin({ + import: + compiler.options.output.module && + compiler.options.output.environment.dynamicImport + }).apply(compiler); + } + + break; + } + case "universal": { + const UniversalCompileAsyncWasmPlugin = require("../wasm-async/UniversalCompileAsyncWasmPlugin"); + new UniversalCompileAsyncWasmPlugin().apply(compiler); + break; + } + default: + throw new Error(`Unsupported wasm loading type ${type}. +Plugins which provide custom wasm loading types must call EnableWasmLoadingPlugin.setEnabled(compiler, type) to disable this error.`); + } + } else { + // TODO support plugin instances here + // apply them to the compiler + } + } +} + +module.exports = EnableWasmLoadingPlugin; diff --git a/lib/wasm/WasmFinalizeExportsPlugin.js b/lib/wasm/WasmFinalizeExportsPlugin.js deleted file mode 100644 index 40491a9a6d3..00000000000 --- a/lib/wasm/WasmFinalizeExportsPlugin.js +++ /dev/null @@ -1,71 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra - */ -"use strict"; - -const UnsupportedWebAssemblyFeatureError = require("./UnsupportedWebAssemblyFeatureError"); - -class WasmFinalizeExportsPlugin { - apply(compiler) { - compiler.hooks.compilation.tap("WasmFinalizeExportsPlugin", compilation => { - compilation.hooks.finishModules.tap( - "WasmFinalizeExportsPlugin", - modules => { - for (const module of modules) { - // 1. if a WebAssembly module - if (module.type.startsWith("webassembly") === true) { - const jsIncompatibleExports = - module.buildMeta.jsIncompatibleExports; - - if (jsIncompatibleExports === undefined) { - continue; - } - - for (const reason of module.reasons) { - // 2. is referenced by a non-WebAssembly module - if (reason.module.type.startsWith("webassembly") === false) { - const ref = compilation.getDependencyReference( - reason.module, - reason.dependency - ); - - if (!ref) continue; - - const importedNames = ref.importedNames; - - if (Array.isArray(importedNames)) { - importedNames.forEach(name => { - // 3. and uses a func with an incompatible JS signature - if ( - Object.prototype.hasOwnProperty.call( - jsIncompatibleExports, - name - ) - ) { - // 4. error - /** @type {any} */ - const error = new UnsupportedWebAssemblyFeatureError( - `Export "${name}" with ${ - jsIncompatibleExports[name] - } can only be used for direct wasm to wasm dependencies` - ); - error.module = module; - error.origin = reason.module; - error.originLoc = reason.dependency.loc; - error.dependencies = [reason.dependency]; - compilation.errors.push(error); - } - }); - } - } - } - } - } - } - ); - }); - } -} - -module.exports = WasmFinalizeExportsPlugin; diff --git a/lib/wasm/WasmMainTemplatePlugin.js b/lib/wasm/WasmMainTemplatePlugin.js deleted file mode 100644 index fccfa819df4..00000000000 --- a/lib/wasm/WasmMainTemplatePlugin.js +++ /dev/null @@ -1,343 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -"use strict"; - -const Template = require("../Template"); -const WebAssemblyUtils = require("./WebAssemblyUtils"); - -/** @typedef {import("../Module")} Module */ -/** @typedef {import("../MainTemplate")} MainTemplate */ - -// Get all wasm modules -const getAllWasmModules = chunk => { - const wasmModules = chunk.getAllAsyncChunks(); - const array = []; - for (const chunk of wasmModules) { - for (const m of chunk.modulesIterable) { - if (m.type.startsWith("webassembly")) { - array.push(m); - } - } - } - - return array; -}; - -/** - * generates the import object function for a module - * @param {Module} module the module - * @param {boolean} mangle mangle imports - * @returns {string} source code - */ -const generateImportObject = (module, mangle) => { - const waitForInstances = new Map(); - const properties = []; - const usedWasmDependencies = WebAssemblyUtils.getUsedDependencies( - module, - mangle - ); - for (const usedDep of usedWasmDependencies) { - const dep = usedDep.dependency; - const importedModule = dep.module; - const exportName = dep.name; - const usedName = importedModule && importedModule.isUsed(exportName); - const description = dep.description; - const direct = dep.onlyDirectImport; - - const module = usedDep.module; - const name = usedDep.name; - - if (direct) { - const instanceVar = `m${waitForInstances.size}`; - waitForInstances.set(instanceVar, importedModule.id); - properties.push({ - module, - name, - value: `${instanceVar}[${JSON.stringify(usedName)}]` - }); - } else { - const params = description.signature.params.map( - (param, k) => "p" + k + param.valtype - ); - - const mod = `installedModules[${JSON.stringify(importedModule.id)}]`; - const func = `${mod}.exports[${JSON.stringify(usedName)}]`; - - properties.push({ - module, - name, - value: Template.asString([ - (importedModule.type.startsWith("webassembly") - ? `${mod} ? ${func} : ` - : "") + `function(${params}) {`, - Template.indent([`return ${func}(${params});`]), - "}" - ]) - }); - } - } - - let importObject; - if (mangle) { - importObject = [ - "return {", - Template.indent([ - properties.map(p => `${JSON.stringify(p.name)}: ${p.value}`).join(",\n") - ]), - "};" - ]; - } else { - const propertiesByModule = new Map(); - for (const p of properties) { - let list = propertiesByModule.get(p.module); - if (list === undefined) { - propertiesByModule.set(p.module, (list = [])); - } - list.push(p); - } - importObject = [ - "return {", - Template.indent([ - Array.from(propertiesByModule, ([module, list]) => { - return Template.asString([ - `${JSON.stringify(module)}: {`, - Template.indent([ - list.map(p => `${JSON.stringify(p.name)}: ${p.value}`).join(",\n") - ]), - "}" - ]); - }).join(",\n") - ]), - "};" - ]; - } - - if (waitForInstances.size === 1) { - const moduleId = Array.from(waitForInstances.values())[0]; - const promise = `installedWasmModules[${JSON.stringify(moduleId)}]`; - const variable = Array.from(waitForInstances.keys())[0]; - return Template.asString([ - `${JSON.stringify(module.id)}: function() {`, - Template.indent([ - `return promiseResolve().then(function() { return ${promise}; }).then(function(${variable}) {`, - Template.indent(importObject), - "});" - ]), - "}," - ]); - } else if (waitForInstances.size > 0) { - const promises = Array.from( - waitForInstances.values(), - id => `installedWasmModules[${JSON.stringify(id)}]` - ).join(", "); - const variables = Array.from( - waitForInstances.keys(), - (name, i) => `${name} = array[${i}]` - ).join(", "); - return Template.asString([ - `${JSON.stringify(module.id)}: function() {`, - Template.indent([ - `return promiseResolve().then(function() { return Promise.all([${promises}]); }).then(function(array) {`, - Template.indent([`var ${variables};`, ...importObject]), - "});" - ]), - "}," - ]); - } else { - return Template.asString([ - `${JSON.stringify(module.id)}: function() {`, - Template.indent(importObject), - "}," - ]); - } -}; - -class WasmMainTemplatePlugin { - constructor({ generateLoadBinaryCode, supportsStreaming, mangleImports }) { - this.generateLoadBinaryCode = generateLoadBinaryCode; - this.supportsStreaming = supportsStreaming; - this.mangleImports = mangleImports; - } - - /** - * @param {MainTemplate} mainTemplate main template - * @returns {void} - */ - apply(mainTemplate) { - mainTemplate.hooks.localVars.tap( - "WasmMainTemplatePlugin", - (source, chunk) => { - const wasmModules = getAllWasmModules(chunk); - if (wasmModules.length === 0) return source; - const importObjects = wasmModules.map(module => { - return generateImportObject(module, this.mangleImports); - }); - return Template.asString([ - source, - "", - "// object to store loaded and loading wasm modules", - "var installedWasmModules = {};", - "", - // This function is used to delay reading the installed wasm module promises - // by a microtask. Sorting them doesn't help because there are egdecases where - // sorting is not possible (modules splitted into different chunks). - // So we not even trying and solve this by a microtask delay. - "function promiseResolve() { return Promise.resolve(); }", - "", - "var wasmImportObjects = {", - Template.indent(importObjects), - "};" - ]); - } - ); - mainTemplate.hooks.requireEnsure.tap( - "WasmMainTemplatePlugin", - (source, chunk, hash) => { - const webassemblyModuleFilename = - mainTemplate.outputOptions.webassemblyModuleFilename; - - const chunkModuleMaps = chunk.getChunkModuleMaps(m => - m.type.startsWith("webassembly") - ); - if (Object.keys(chunkModuleMaps.id).length === 0) return source; - const wasmModuleSrcPath = mainTemplate.getAssetPath( - JSON.stringify(webassemblyModuleFilename), - { - hash: `" + ${mainTemplate.renderCurrentHashCode(hash)} + "`, - hashWithLength: length => - `" + ${mainTemplate.renderCurrentHashCode(hash, length)} + "`, - module: { - id: '" + wasmModuleId + "', - hash: `" + ${JSON.stringify( - chunkModuleMaps.hash - )}[wasmModuleId] + "`, - hashWithLength(length) { - const shortChunkHashMap = Object.create(null); - for (const wasmModuleId of Object.keys(chunkModuleMaps.hash)) { - if (typeof chunkModuleMaps.hash[wasmModuleId] === "string") { - shortChunkHashMap[wasmModuleId] = chunkModuleMaps.hash[ - wasmModuleId - ].substr(0, length); - } - } - return `" + ${JSON.stringify( - shortChunkHashMap - )}[wasmModuleId] + "`; - } - } - } - ); - const createImportObject = content => - this.mangleImports - ? `{ ${JSON.stringify( - WebAssemblyUtils.MANGLED_MODULE - )}: ${content} }` - : content; - return Template.asString([ - source, - "", - "// Fetch + compile chunk loading for webassembly", - "", - `var wasmModules = ${JSON.stringify( - chunkModuleMaps.id - )}[chunkId] || [];`, - "", - "wasmModules.forEach(function(wasmModuleId) {", - Template.indent([ - "var installedWasmModuleData = installedWasmModules[wasmModuleId];", - "", - '// a Promise means "currently loading" or "already loaded".', - "if(installedWasmModuleData)", - Template.indent(["promises.push(installedWasmModuleData);"]), - "else {", - Template.indent([ - `var importObject = wasmImportObjects[wasmModuleId]();`, - `var req = ${this.generateLoadBinaryCode(wasmModuleSrcPath)};`, - "var promise;", - this.supportsStreaming - ? Template.asString([ - "if(importObject instanceof Promise && typeof WebAssembly.compileStreaming === 'function') {", - Template.indent([ - "promise = Promise.all([WebAssembly.compileStreaming(req), importObject]).then(function(items) {", - Template.indent([ - `return WebAssembly.instantiate(items[0], ${createImportObject( - "items[1]" - )});` - ]), - "});" - ]), - "} else if(typeof WebAssembly.instantiateStreaming === 'function') {", - Template.indent([ - `promise = WebAssembly.instantiateStreaming(req, ${createImportObject( - "importObject" - )});` - ]) - ]) - : Template.asString([ - "if(importObject instanceof Promise) {", - Template.indent([ - "var bytesPromise = req.then(function(x) { return x.arrayBuffer(); });", - "promise = Promise.all([", - Template.indent([ - "bytesPromise.then(function(bytes) { return WebAssembly.compile(bytes); }),", - "importObject" - ]), - "]).then(function(items) {", - Template.indent([ - `return WebAssembly.instantiate(items[0], ${createImportObject( - "items[1]" - )});` - ]), - "});" - ]) - ]), - "} else {", - Template.indent([ - "var bytesPromise = req.then(function(x) { return x.arrayBuffer(); });", - "promise = bytesPromise.then(function(bytes) {", - Template.indent([ - `return WebAssembly.instantiate(bytes, ${createImportObject( - "importObject" - )});` - ]), - "});" - ]), - "}", - "promises.push(installedWasmModules[wasmModuleId] = promise.then(function(res) {", - Template.indent([ - `return ${ - mainTemplate.requireFn - }.w[wasmModuleId] = (res.instance || res).exports;` - ]), - "}));" - ]), - "}" - ]), - "});" - ]); - } - ); - mainTemplate.hooks.requireExtensions.tap( - "WasmMainTemplatePlugin", - (source, chunk) => { - if (!chunk.hasModuleInGraph(m => m.type.startsWith("webassembly"))) { - return source; - } - return Template.asString([ - source, - "", - "// object with all WebAssembly.instance exports", - `${mainTemplate.requireFn}.w = {};` - ]); - } - ); - mainTemplate.hooks.hash.tap("WasmMainTemplatePlugin", hash => { - hash.update("WasmMainTemplatePlugin"); - hash.update("2"); - }); - } -} - -module.exports = WasmMainTemplatePlugin; diff --git a/lib/wasm/WebAssemblyGenerator.js b/lib/wasm/WebAssemblyGenerator.js deleted file mode 100644 index 7df85a60159..00000000000 --- a/lib/wasm/WebAssemblyGenerator.js +++ /dev/null @@ -1,444 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -"use strict"; - -const Generator = require("../Generator"); -const Template = require("../Template"); -const WebAssemblyUtils = require("./WebAssemblyUtils"); -const { RawSource } = require("webpack-sources"); - -const { editWithAST, addWithAST } = require("@webassemblyjs/wasm-edit"); -const { decode } = require("@webassemblyjs/wasm-parser"); -const t = require("@webassemblyjs/ast"); -const { - moduleContextFromModuleAST -} = require("@webassemblyjs/helper-module-context"); - -const WebAssemblyExportImportedDependency = require("../dependencies/WebAssemblyExportImportedDependency"); - -/** @typedef {import("../Module")} Module */ -/** @typedef {import("./WebAssemblyUtils").UsedWasmDependency} UsedWasmDependency */ -/** @typedef {import("../NormalModule")} NormalModule */ -/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */ -/** @typedef {import("webpack-sources").Source} Source */ -/** @typedef {import("../Dependency").DependencyTemplate} DependencyTemplate */ - -/** - * @typedef {(ArrayBuffer) => ArrayBuffer} ArrayBufferTransform - */ - -/** - * @template T - * @param {Function[]} fns transforms - * @returns {Function} composed transform - */ -const compose = (...fns) => { - return fns.reduce( - (prevFn, nextFn) => { - return value => nextFn(prevFn(value)); - }, - value => value - ); -}; - -// TODO replace with @callback - -/** - * Removes the start instruction - * - * @param {Object} state - unused state - * @returns {ArrayBufferTransform} transform - */ -const removeStartFunc = state => bin => { - return editWithAST(state.ast, bin, { - Start(path) { - path.remove(); - } - }); -}; - -/** - * Get imported globals - * - * @param {Object} ast - Module's AST - * @returns {Array} - nodes - */ -const getImportedGlobals = ast => { - const importedGlobals = []; - - t.traverse(ast, { - ModuleImport({ node }) { - if (t.isGlobalType(node.descr) === true) { - importedGlobals.push(node); - } - } - }); - - return importedGlobals; -}; - -const getCountImportedFunc = ast => { - let count = 0; - - t.traverse(ast, { - ModuleImport({ node }) { - if (t.isFuncImportDescr(node.descr) === true) { - count++; - } - } - }); - - return count; -}; - -/** - * Get next type index - * - * @param {Object} ast - Module's AST - * @returns {t.Index} - index - */ -const getNextTypeIndex = ast => { - const typeSectionMetadata = t.getSectionMetadata(ast, "type"); - - if (typeSectionMetadata === undefined) { - return t.indexLiteral(0); - } - - return t.indexLiteral(typeSectionMetadata.vectorOfSize.value); -}; - -/** - * Get next func index - * - * The Func section metadata provide informations for implemented funcs - * in order to have the correct index we shift the index by number of external - * functions. - * - * @param {Object} ast - Module's AST - * @param {Number} countImportedFunc - number of imported funcs - * @returns {t.Index} - index - */ -const getNextFuncIndex = (ast, countImportedFunc) => { - const funcSectionMetadata = t.getSectionMetadata(ast, "func"); - - if (funcSectionMetadata === undefined) { - return t.indexLiteral(0 + countImportedFunc); - } - - const vectorOfSize = funcSectionMetadata.vectorOfSize.value; - - return t.indexLiteral(vectorOfSize + countImportedFunc); -}; - -/** - * Create a init instruction for a global - * @param {t.GlobalType} globalType the global type - * @returns {t.Instruction} init expression - */ -const createDefaultInitForGlobal = globalType => { - if (globalType.valtype[0] === "i") { - // create NumberLiteral global initializer - return t.objectInstruction("const", globalType.valtype, [ - t.numberLiteralFromRaw(66) - ]); - } else if (globalType.valtype[0] === "f") { - // create FloatLiteral global initializer - return t.objectInstruction("const", globalType.valtype, [ - t.floatLiteral(66, false, false, "66") - ]); - } else { - throw new Error("unknown type: " + globalType.valtype); - } -}; - -/** - * Rewrite the import globals: - * - removes the ModuleImport instruction - * - injects at the same offset a mutable global of the same time - * - * Since the imported globals are before the other global declarations, our - * indices will be preserved. - * - * Note that globals will become mutable. - * - * @param {Object} state - unused state - * @returns {ArrayBufferTransform} transform - */ -const rewriteImportedGlobals = state => bin => { - const additionalInitCode = state.additionalInitCode; - const newGlobals = []; - - bin = editWithAST(state.ast, bin, { - ModuleImport(path) { - if (t.isGlobalType(path.node.descr) === true) { - const globalType = path.node.descr; - - globalType.mutability = "var"; - - const init = createDefaultInitForGlobal(globalType); - - newGlobals.push(t.global(globalType, [init])); - - path.remove(); - } - }, - - // in order to preserve non-imported global's order we need to re-inject - // those as well - Global(path) { - const { node } = path; - const [init] = node.init; - - if (init.id === "get_global") { - node.globalType.mutability = "var"; - - const initialGlobalidx = init.args[0]; - - node.init = [createDefaultInitForGlobal(node.globalType)]; - - additionalInitCode.push( - /** - * get_global in global initilizer only work for imported globals. - * They have the same indices than the init params, so use the - * same index. - */ - t.instruction("get_local", [initialGlobalidx]), - t.instruction("set_global", [t.indexLiteral(newGlobals.length)]) - ); - } - - newGlobals.push(node); - - path.remove(); - } - }); - - // Add global declaration instructions - return addWithAST(state.ast, bin, newGlobals); -}; - -/** - * Rewrite the export names - * @param {Object} state state - * @param {Object} state.ast Module's ast - * @param {Module} state.module Module - * @param {Set} state.externalExports Module - * @returns {ArrayBufferTransform} transform - */ -const rewriteExportNames = ({ ast, module, externalExports }) => bin => { - return editWithAST(ast, bin, { - ModuleExport(path) { - const isExternal = externalExports.has(path.node.name); - if (isExternal) { - path.remove(); - return; - } - const usedName = module.isUsed(path.node.name); - if (!usedName) { - path.remove(); - return; - } - path.node.name = usedName; - } - }); -}; - -/** - * Mangle import names and modules - * @param {Object} state state - * @param {Object} state.ast Module's ast - * @param {Map} state.usedDependencyMap mappings to mangle names - * @returns {ArrayBufferTransform} transform - */ -const rewriteImports = ({ ast, usedDependencyMap }) => bin => { - return editWithAST(ast, bin, { - ModuleImport(path) { - const result = usedDependencyMap.get( - path.node.module + ":" + path.node.name - ); - - if (result !== undefined) { - path.node.module = result.module; - path.node.name = result.name; - } - } - }); -}; - -/** - * Add an init function. - * - * The init function fills the globals given input arguments. - * - * @param {Object} state transformation state - * @param {Object} state.ast - Module's ast - * @param {t.Identifier} state.initFuncId identifier of the init function - * @param {t.Index} state.startAtFuncOffset index of the start function - * @param {t.ModuleImport[]} state.importedGlobals list of imported globals - * @param {t.Instruction[]} state.additionalInitCode list of addition instructions for the init function - * @param {t.Index} state.nextFuncIndex index of the next function - * @param {t.Index} state.nextTypeIndex index of the next type - * @returns {ArrayBufferTransform} transform - */ -const addInitFunction = ({ - ast, - initFuncId, - startAtFuncOffset, - importedGlobals, - additionalInitCode, - nextFuncIndex, - nextTypeIndex -}) => bin => { - const funcParams = importedGlobals.map(importedGlobal => { - // used for debugging - const id = t.identifier(`${importedGlobal.module}.${importedGlobal.name}`); - - return t.funcParam(importedGlobal.descr.valtype, id); - }); - - const funcBody = importedGlobals.reduce((acc, importedGlobal, index) => { - const args = [t.indexLiteral(index)]; - const body = [ - t.instruction("get_local", args), - t.instruction("set_global", args) - ]; - - return [...acc, ...body]; - }, []); - - if (typeof startAtFuncOffset === "number") { - funcBody.push(t.callInstruction(t.numberLiteralFromRaw(startAtFuncOffset))); - } - - for (const instr of additionalInitCode) { - funcBody.push(instr); - } - - const funcResults = []; - - // Code section - const funcSignature = t.signature(funcParams, funcResults); - const func = t.func(initFuncId, funcSignature, funcBody); - - // Type section - const functype = t.typeInstruction(undefined, funcSignature); - - // Func section - const funcindex = t.indexInFuncSection(nextTypeIndex); - - // Export section - const moduleExport = t.moduleExport( - initFuncId.value, - t.moduleExportDescr("Func", nextFuncIndex) - ); - - return addWithAST(ast, bin, [func, moduleExport, funcindex, functype]); -}; - -/** - * Extract mangle mappings from module - * @param {Module} module current module - * @param {boolean} mangle mangle imports - * @returns {Map} mappings to mangled names - */ -const getUsedDependencyMap = (module, mangle) => { - /** @type {Map} */ - const map = new Map(); - for (const usedDep of WebAssemblyUtils.getUsedDependencies(module, mangle)) { - const dep = usedDep.dependency; - const request = dep.request; - const exportName = dep.name; - map.set(request + ":" + exportName, usedDep); - } - return map; -}; - -class WebAssemblyGenerator extends Generator { - constructor(options) { - super(); - this.options = options; - } - - /** - * @param {NormalModule} module module for which the code should be generated - * @param {Map} dependencyTemplates mapping from dependencies to templates - * @param {RuntimeTemplate} runtimeTemplate the runtime template - * @param {string} type which kind of code should be generated - * @returns {Source} generated code - */ - generate(module, dependencyTemplates, runtimeTemplate, type) { - let bin = module.originalSource().source(); - - const initFuncId = t.identifier( - Array.isArray(module.usedExports) - ? Template.numberToIdentifer(module.usedExports.length) - : "__webpack_init__" - ); - - // parse it - const ast = decode(bin, { - ignoreDataSection: true, - ignoreCodeSection: true, - ignoreCustomNameSection: true - }); - - const moduleContext = moduleContextFromModuleAST(ast.body[0]); - - const importedGlobals = getImportedGlobals(ast); - const countImportedFunc = getCountImportedFunc(ast); - const startAtFuncOffset = moduleContext.getStart(); - const nextFuncIndex = getNextFuncIndex(ast, countImportedFunc); - const nextTypeIndex = getNextTypeIndex(ast); - - const usedDependencyMap = getUsedDependencyMap( - module, - this.options.mangleImports - ); - const externalExports = new Set( - module.dependencies - .filter(d => d instanceof WebAssemblyExportImportedDependency) - .map(d => { - const wasmDep = /** @type {WebAssemblyExportImportedDependency} */ (d); - return wasmDep.exportName; - }) - ); - - /** @type {t.Instruction[]} */ - const additionalInitCode = []; - - const transform = compose( - rewriteExportNames({ - ast, - module, - externalExports - }), - - removeStartFunc({ ast }), - - rewriteImportedGlobals({ ast, additionalInitCode }), - - rewriteImports({ - ast, - usedDependencyMap - }), - - addInitFunction({ - ast, - initFuncId, - importedGlobals, - additionalInitCode, - startAtFuncOffset, - nextFuncIndex, - nextTypeIndex - }) - ); - - const newBin = transform(bin); - - return new RawSource(newBin); - } -} - -module.exports = WebAssemblyGenerator; diff --git a/lib/wasm/WebAssemblyInInitialChunkError.js b/lib/wasm/WebAssemblyInInitialChunkError.js deleted file mode 100644 index 319e757aece..00000000000 --- a/lib/wasm/WebAssemblyInInitialChunkError.js +++ /dev/null @@ -1,88 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php -*/ -"use strict"; - -const WebpackError = require("../WebpackError"); - -/** @typedef {import("../Module")} Module */ -/** @typedef {import("../RequestShortener")} RequestShortener */ - -/** - * @param {Module} module module to get chains from - * @param {RequestShortener} requestShortener to make readable identifiers - * @returns {string[]} all chains to the module - */ -const getInitialModuleChains = (module, requestShortener) => { - const queue = [ - { head: module, message: module.readableIdentifier(requestShortener) } - ]; - /** @type {Set} */ - const results = new Set(); - /** @type {Set} */ - const incompleteResults = new Set(); - /** @type {Set} */ - const visitedModules = new Set(); - - for (const chain of queue) { - const { head, message } = chain; - let final = true; - /** @type {Set} */ - const alreadyReferencedModules = new Set(); - for (const reason of head.reasons) { - const newHead = reason.module; - if (newHead) { - if (!newHead.getChunks().some(c => c.canBeInitial())) continue; - final = false; - if (alreadyReferencedModules.has(newHead)) continue; - alreadyReferencedModules.add(newHead); - const moduleName = newHead.readableIdentifier(requestShortener); - const detail = reason.explanation ? ` (${reason.explanation})` : ""; - const newMessage = `${moduleName}${detail} --> ${message}`; - if (visitedModules.has(newHead)) { - incompleteResults.add(`... --> ${newMessage}`); - continue; - } - visitedModules.add(newHead); - queue.push({ - head: newHead, - message: newMessage - }); - } else { - final = false; - const newMessage = reason.explanation - ? `(${reason.explanation}) --> ${message}` - : message; - results.add(newMessage); - } - } - if (final) { - results.add(message); - } - } - for (const result of incompleteResults) { - results.add(result); - } - return Array.from(results); -}; - -module.exports = class WebAssemblyInInitialChunkError extends WebpackError { - /** - * @param {Module} module WASM module - * @param {RequestShortener} requestShortener request shortener - */ - constructor(module, requestShortener) { - const moduleChains = getInitialModuleChains(module, requestShortener); - const message = `WebAssembly module is included in initial chunk. -This is not allowed, because WebAssembly download and compilation must happen asynchronous. -Add an async splitpoint (i. e. import()) somewhere between your entrypoint and the WebAssembly module: -${moduleChains.map(s => `* ${s}`).join("\n")}`; - - super(message); - this.name = "WebAssemblyInInitialChunkError"; - this.hideStack = true; - this.module = module; - - Error.captureStackTrace(this, this.constructor); - } -}; diff --git a/lib/wasm/WebAssemblyJavascriptGenerator.js b/lib/wasm/WebAssemblyJavascriptGenerator.js deleted file mode 100644 index 22dfb7910f2..00000000000 --- a/lib/wasm/WebAssemblyJavascriptGenerator.js +++ /dev/null @@ -1,152 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -"use strict"; - -const Generator = require("../Generator"); -const Template = require("../Template"); -const { RawSource } = require("webpack-sources"); -const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency"); -const WebAssemblyExportImportedDependency = require("../dependencies/WebAssemblyExportImportedDependency"); - -/** @typedef {import("../NormalModule")} NormalModule */ -/** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */ -/** @typedef {import("webpack-sources").Source} Source */ -/** @typedef {import("../Dependency").DependencyTemplate} DependencyTemplate */ - -class WebAssemblyJavascriptGenerator extends Generator { - /** - * @param {NormalModule} module module for which the code should be generated - * @param {Map} dependencyTemplates mapping from dependencies to templates - * @param {RuntimeTemplate} runtimeTemplate the runtime template - * @param {string} type which kind of code should be generated - * @returns {Source} generated code - */ - generate(module, dependencyTemplates, runtimeTemplate, type) { - const initIdentifer = Array.isArray(module.usedExports) - ? Template.numberToIdentifer(module.usedExports.length) - : "__webpack_init__"; - - let needExportsCopy = false; - const importedModules = new Map(); - const initParams = []; - let index = 0; - for (const dep of module.dependencies) { - const depAsAny = /** @type {any} */ (dep); - if (dep.module) { - let importData = importedModules.get(dep.module); - if (importData === undefined) { - importedModules.set( - dep.module, - (importData = { - importVar: `m${index}`, - index, - request: - "userRequest" in depAsAny ? depAsAny.userRequest : undefined, - names: new Set(), - reexports: [] - }) - ); - index++; - } - if (dep instanceof WebAssemblyImportDependency) { - importData.names.add(dep.name); - if (dep.description.type === "GlobalType") { - const exportName = dep.name; - const usedName = dep.module && dep.module.isUsed(exportName); - - if (dep.module) { - if (usedName) { - initParams.push( - runtimeTemplate.exportFromImport({ - module: dep.module, - request: dep.request, - importVar: importData.importVar, - originModule: module, - exportName: dep.name, - asiSafe: true, - isCall: false, - callContext: null - }) - ); - } - } - } - } - if (dep instanceof WebAssemblyExportImportedDependency) { - importData.names.add(dep.name); - const usedName = module.isUsed(dep.exportName); - if (usedName) { - const exportProp = `${module.exportsArgument}[${JSON.stringify( - usedName - )}]`; - const defineStatement = Template.asString([ - `${exportProp} = ${runtimeTemplate.exportFromImport({ - module: dep.module, - request: dep.request, - importVar: importData.importVar, - originModule: module, - exportName: dep.name, - asiSafe: true, - isCall: false, - callContext: null - })};`, - `if(WebAssembly.Global) ${exportProp} = ` + - `new WebAssembly.Global({ value: ${JSON.stringify( - dep.valueType - )} }, ${exportProp});` - ]); - importData.reexports.push(defineStatement); - needExportsCopy = true; - } - } - } - } - const importsCode = Template.asString( - Array.from( - importedModules, - ([module, { importVar, request, reexports }]) => { - const importStatement = runtimeTemplate.importStatement({ - module, - request, - importVar, - originModule: module - }); - return importStatement + reexports.join("\n"); - } - ) - ); - - // create source - const source = new RawSource( - [ - '"use strict";', - "// Instantiate WebAssembly module", - "var wasmExports = __webpack_require__.w[module.i];", - - !Array.isArray(module.usedExports) - ? `__webpack_require__.r(${module.exportsArgument});` - : "", - - // this must be before import for circular dependencies - "// export exports from WebAssembly module", - Array.isArray(module.usedExports) && !needExportsCopy - ? `${module.moduleArgument}.exports = wasmExports;` - : "for(var name in wasmExports) " + - `if(name != ${JSON.stringify(initIdentifer)}) ` + - `${module.exportsArgument}[name] = wasmExports[name];`, - "// exec imports from WebAssembly module (for esm order)", - importsCode, - "", - "// exec wasm module", - `wasmExports[${JSON.stringify(initIdentifer)}](${initParams.join( - ", " - )})` - ].join("\n") - ); - return source; - } -} - -module.exports = WebAssemblyJavascriptGenerator; diff --git a/lib/wasm/WebAssemblyModulesPlugin.js b/lib/wasm/WebAssemblyModulesPlugin.js deleted file mode 100644 index ca9bf26bce6..00000000000 --- a/lib/wasm/WebAssemblyModulesPlugin.js +++ /dev/null @@ -1,118 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -"use strict"; - -const Generator = require("../Generator"); -const WebAssemblyParser = require("./WebAssemblyParser"); -const WebAssemblyGenerator = require("./WebAssemblyGenerator"); -const WebAssemblyJavascriptGenerator = require("./WebAssemblyJavascriptGenerator"); -const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency"); -const WebAssemblyExportImportedDependency = require("../dependencies/WebAssemblyExportImportedDependency"); -const WebAssemblyInInitialChunkError = require("./WebAssemblyInInitialChunkError"); - -/** @typedef {import("../Compiler")} Compiler */ - -class WebAssemblyModulesPlugin { - constructor(options) { - this.options = options; - } - - /** - * @param {Compiler} compiler compiler - * @returns {void} - */ - apply(compiler) { - compiler.hooks.compilation.tap( - "WebAssemblyModulesPlugin", - (compilation, { normalModuleFactory }) => { - compilation.dependencyFactories.set( - WebAssemblyImportDependency, - normalModuleFactory - ); - - compilation.dependencyFactories.set( - WebAssemblyExportImportedDependency, - normalModuleFactory - ); - - normalModuleFactory.hooks.createParser - .for("webassembly/experimental") - .tap("WebAssemblyModulesPlugin", () => { - return new WebAssemblyParser(); - }); - - normalModuleFactory.hooks.createGenerator - .for("webassembly/experimental") - .tap("WebAssemblyModulesPlugin", () => { - return Generator.byType({ - javascript: new WebAssemblyJavascriptGenerator(), - webassembly: new WebAssemblyGenerator(this.options) - }); - }); - - compilation.chunkTemplate.hooks.renderManifest.tap( - "WebAssemblyModulesPlugin", - (result, options) => { - const chunk = options.chunk; - const outputOptions = options.outputOptions; - const moduleTemplates = options.moduleTemplates; - const dependencyTemplates = options.dependencyTemplates; - - for (const module of chunk.modulesIterable) { - if (module.type && module.type.startsWith("webassembly")) { - const filenameTemplate = - outputOptions.webassemblyModuleFilename; - - result.push({ - render: () => - this.renderWebAssembly( - module, - moduleTemplates.webassembly, - dependencyTemplates - ), - filenameTemplate, - pathOptions: { - module - }, - identifier: `webassemblyModule${module.id}`, - hash: module.hash - }); - } - } - - return result; - } - ); - - compilation.hooks.afterChunks.tap("WebAssemblyModulesPlugin", () => { - const initialWasmModules = new Set(); - for (const chunk of compilation.chunks) { - if (chunk.canBeInitial()) { - for (const module of chunk.modulesIterable) { - if (module.type.startsWith("webassembly")) { - initialWasmModules.add(module); - } - } - } - } - for (const module of initialWasmModules) { - compilation.errors.push( - new WebAssemblyInInitialChunkError( - module, - compilation.requestShortener - ) - ); - } - }); - } - ); - } - - renderWebAssembly(module, moduleTemplate, dependencyTemplates) { - return moduleTemplate.render(module, dependencyTemplates, {}); - } -} - -module.exports = WebAssemblyModulesPlugin; diff --git a/lib/wasm/WebAssemblyParser.js b/lib/wasm/WebAssemblyParser.js deleted file mode 100644 index eb49fb1326f..00000000000 --- a/lib/wasm/WebAssemblyParser.js +++ /dev/null @@ -1,175 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -"use strict"; - -const t = require("@webassemblyjs/ast"); -const { decode } = require("@webassemblyjs/wasm-parser"); -const { - moduleContextFromModuleAST -} = require("@webassemblyjs/helper-module-context"); - -const { Tapable } = require("tapable"); -const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency"); -const WebAssemblyExportImportedDependency = require("../dependencies/WebAssemblyExportImportedDependency"); - -/** @typedef {import("../Module")} Module */ - -const JS_COMPAT_TYPES = new Set(["i32", "f32", "f64"]); - -/** - * @param {t.Signature} signature the func signature - * @returns {null | string} the type incompatible with js types - */ -const getJsIncompatibleType = signature => { - for (const param of signature.params) { - if (!JS_COMPAT_TYPES.has(param.valtype)) { - return `${param.valtype} as parameter`; - } - } - for (const type of signature.results) { - if (!JS_COMPAT_TYPES.has(type)) return `${type} as result`; - } - return null; -}; - -/** - * TODO why are there two different Signature types? - * @param {t.FuncSignature} signature the func signature - * @returns {null | string} the type incompatible with js types - */ -const getJsIncompatibleTypeOfFuncSignature = signature => { - for (const param of signature.args) { - if (!JS_COMPAT_TYPES.has(param)) { - return `${param} as parameter`; - } - } - for (const type of signature.result) { - if (!JS_COMPAT_TYPES.has(type)) return `${type} as result`; - } - return null; -}; - -const decoderOpts = { - ignoreCodeSection: true, - ignoreDataSection: true, - - // this will avoid having to lookup with identifiers in the ModuleContext - ignoreCustomNameSection: true -}; - -class WebAssemblyParser extends Tapable { - constructor(options) { - super(); - this.hooks = {}; - this.options = options; - } - - parse(binary, state) { - // flag it as ESM - state.module.buildMeta.exportsType = "namespace"; - - // parse it - const program = decode(binary, decoderOpts); - const module = program.body[0]; - - const moduleContext = moduleContextFromModuleAST(module); - - // extract imports and exports - const exports = (state.module.buildMeta.providedExports = []); - const jsIncompatibleExports = (state.module.buildMeta.jsIncompatibleExports = []); - - const importedGlobals = []; - t.traverse(module, { - ModuleExport({ node }) { - const descriptor = node.descr; - - if (descriptor.exportType === "Func") { - const funcidx = descriptor.id.value; - - /** @type {t.FuncSignature} */ - const funcSignature = moduleContext.getFunction(funcidx); - - const incompatibleType = getJsIncompatibleTypeOfFuncSignature( - funcSignature - ); - - if (incompatibleType) { - jsIncompatibleExports[node.name] = incompatibleType; - } - } - - exports.push(node.name); - - if (node.descr && node.descr.exportType === "Global") { - const refNode = importedGlobals[node.descr.id.value]; - if (refNode) { - const dep = new WebAssemblyExportImportedDependency( - node.name, - refNode.module, - refNode.name, - refNode.descr.valtype - ); - - state.module.addDependency(dep); - } - } - }, - - Global({ node }) { - const init = node.init[0]; - - let importNode = null; - - if (init.id === "get_global") { - const globalIdx = init.args[0].value; - - if (globalIdx < importedGlobals.length) { - importNode = importedGlobals[globalIdx]; - } - } - - importedGlobals.push(importNode); - }, - - ModuleImport({ node }) { - /** @type {false | string} */ - let onlyDirectImport = false; - - if (t.isMemory(node.descr) === true) { - onlyDirectImport = "Memory"; - } else if (t.isTable(node.descr) === true) { - onlyDirectImport = "Table"; - } else if (t.isFuncImportDescr(node.descr) === true) { - const incompatibleType = getJsIncompatibleType(node.descr.signature); - if (incompatibleType) { - onlyDirectImport = `Non-JS-compatible Func Sigurature (${incompatibleType})`; - } - } else if (t.isGlobalType(node.descr) === true) { - const type = node.descr.valtype; - if (!JS_COMPAT_TYPES.has(type)) { - onlyDirectImport = `Non-JS-compatible Global Type (${type})`; - } - } - - const dep = new WebAssemblyImportDependency( - node.module, - node.name, - node.descr, - onlyDirectImport - ); - - state.module.addDependency(dep); - - if (t.isGlobalType(node.descr)) { - importedGlobals.push(node); - } - } - }); - - return state; - } -} - -module.exports = WebAssemblyParser; diff --git a/lib/wasm/WebAssemblyUtils.js b/lib/wasm/WebAssemblyUtils.js deleted file mode 100644 index 75eb6d29577..00000000000 --- a/lib/wasm/WebAssemblyUtils.js +++ /dev/null @@ -1,59 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -"use strict"; - -const Template = require("../Template"); -const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency"); - -/** @typedef {import("../Module")} Module */ - -/** @typedef {Object} UsedWasmDependency - * @property {WebAssemblyImportDependency} dependency the dependency - * @property {string} name the export name - * @property {string} module the module name - */ - -const MANGLED_MODULE = "a"; - -/** - * @param {Module} module the module - * @param {boolean} mangle mangle module and export names - * @returns {UsedWasmDependency[]} used dependencies and (mangled) name - */ -const getUsedDependencies = (module, mangle) => { - /** @type {UsedWasmDependency[]} */ - const array = []; - let importIndex = 0; - for (const dep of module.dependencies) { - if (dep instanceof WebAssemblyImportDependency) { - if (dep.description.type === "GlobalType" || dep.module === null) { - continue; - } - - const exportName = dep.name; - // TODO add the following 3 lines when removing of ModuleExport is possible - // const importedModule = dep.module; - // const usedName = importedModule && importedModule.isUsed(exportName); - // if (usedName !== false) { - if (mangle) { - array.push({ - dependency: dep, - name: Template.numberToIdentifer(importIndex++), - module: MANGLED_MODULE - }); - } else { - array.push({ - dependency: dep, - name: exportName, - module: dep.request - }); - } - } - } - return array; -}; - -exports.getUsedDependencies = getUsedDependencies; -exports.MANGLED_MODULE = MANGLED_MODULE; diff --git a/lib/web/FetchCompileAsyncWasmPlugin.js b/lib/web/FetchCompileAsyncWasmPlugin.js new file mode 100644 index 00000000000..dca39338c2b --- /dev/null +++ b/lib/web/FetchCompileAsyncWasmPlugin.js @@ -0,0 +1,70 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const { WEBASSEMBLY_MODULE_TYPE_ASYNC } = require("../ModuleTypeConstants"); +const RuntimeGlobals = require("../RuntimeGlobals"); +const AsyncWasmLoadingRuntimeModule = require("../wasm-async/AsyncWasmLoadingRuntimeModule"); + +/** @typedef {import("../Chunk")} Chunk */ +/** @typedef {import("../Compiler")} Compiler */ + +const PLUGIN_NAME = "FetchCompileAsyncWasmPlugin"; + +class FetchCompileAsyncWasmPlugin { + /** + * Apply the plugin + * @param {Compiler} compiler the compiler instance + * @returns {void} + */ + apply(compiler) { + compiler.hooks.thisCompilation.tap(PLUGIN_NAME, compilation => { + const globalWasmLoading = compilation.outputOptions.wasmLoading; + /** + * @param {Chunk} chunk chunk + * @returns {boolean} true, if wasm loading is enabled for the chunk + */ + const isEnabledForChunk = chunk => { + const options = chunk.getEntryOptions(); + const wasmLoading = + options && options.wasmLoading !== undefined + ? options.wasmLoading + : globalWasmLoading; + return wasmLoading === "fetch"; + }; + /** + * @param {string} path path to the wasm file + * @returns {string} code to load the wasm file + */ + const generateLoadBinaryCode = path => + `fetch(${RuntimeGlobals.publicPath} + ${path})`; + + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.instantiateWasm) + .tap(PLUGIN_NAME, (chunk, set, { chunkGraph }) => { + if (!isEnabledForChunk(chunk)) return; + if ( + !chunkGraph.hasModuleInGraph( + chunk, + m => m.type === WEBASSEMBLY_MODULE_TYPE_ASYNC + ) + ) { + return; + } + set.add(RuntimeGlobals.publicPath); + compilation.addRuntimeModule( + chunk, + new AsyncWasmLoadingRuntimeModule({ + generateLoadBinaryCode, + supportsStreaming: true + }) + ); + }); + }); + } +} + +module.exports = FetchCompileAsyncWasmPlugin; diff --git a/lib/web/FetchCompileWasmPlugin.js b/lib/web/FetchCompileWasmPlugin.js new file mode 100644 index 00000000000..d9461ef710d --- /dev/null +++ b/lib/web/FetchCompileWasmPlugin.js @@ -0,0 +1,87 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const { WEBASSEMBLY_MODULE_TYPE_SYNC } = require("../ModuleTypeConstants"); +const RuntimeGlobals = require("../RuntimeGlobals"); +const WasmChunkLoadingRuntimeModule = require("../wasm-sync/WasmChunkLoadingRuntimeModule"); + +/** @typedef {import("../Chunk")} Chunk */ +/** @typedef {import("../Compiler")} Compiler */ + +/** + * @typedef {object} FetchCompileWasmPluginOptions + * @property {boolean=} mangleImports mangle imports + */ + +// TODO webpack 6 remove + +const PLUGIN_NAME = "FetchCompileWasmPlugin"; + +class FetchCompileWasmPlugin { + /** + * @param {FetchCompileWasmPluginOptions=} options options + */ + constructor(options = {}) { + this.options = options; + } + + /** + * Apply the plugin + * @param {Compiler} compiler the compiler instance + * @returns {void} + */ + apply(compiler) { + compiler.hooks.thisCompilation.tap(PLUGIN_NAME, compilation => { + const globalWasmLoading = compilation.outputOptions.wasmLoading; + /** + * @param {Chunk} chunk chunk + * @returns {boolean} true, if wasm loading is enabled for the chunk + */ + const isEnabledForChunk = chunk => { + const options = chunk.getEntryOptions(); + const wasmLoading = + options && options.wasmLoading !== undefined + ? options.wasmLoading + : globalWasmLoading; + return wasmLoading === "fetch"; + }; + /** + * @param {string} path path to the wasm file + * @returns {string} code to load the wasm file + */ + const generateLoadBinaryCode = path => + `fetch(${RuntimeGlobals.publicPath} + ${path})`; + + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.ensureChunkHandlers) + .tap(PLUGIN_NAME, (chunk, set, { chunkGraph }) => { + if (!isEnabledForChunk(chunk)) return; + if ( + !chunkGraph.hasModuleInGraph( + chunk, + m => m.type === WEBASSEMBLY_MODULE_TYPE_SYNC + ) + ) { + return; + } + set.add(RuntimeGlobals.moduleCache); + set.add(RuntimeGlobals.publicPath); + compilation.addRuntimeModule( + chunk, + new WasmChunkLoadingRuntimeModule({ + generateLoadBinaryCode, + supportsStreaming: true, + mangleImports: this.options.mangleImports, + runtimeRequirements: set + }) + ); + }); + }); + } +} + +module.exports = FetchCompileWasmPlugin; diff --git a/lib/web/FetchCompileWasmTemplatePlugin.js b/lib/web/FetchCompileWasmTemplatePlugin.js deleted file mode 100644 index 025921fcf85..00000000000 --- a/lib/web/FetchCompileWasmTemplatePlugin.js +++ /dev/null @@ -1,37 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -"use strict"; - -const WasmMainTemplatePlugin = require("../wasm/WasmMainTemplatePlugin"); - -class FetchCompileWasmTemplatePlugin { - constructor(options) { - this.options = options || {}; - } - - apply(compiler) { - compiler.hooks.thisCompilation.tap( - "FetchCompileWasmTemplatePlugin", - compilation => { - const mainTemplate = compilation.mainTemplate; - const generateLoadBinaryCode = path => - `fetch(${mainTemplate.requireFn}.p + ${path})`; - - const plugin = new WasmMainTemplatePlugin( - Object.assign( - { - generateLoadBinaryCode, - supportsStreaming: true - }, - this.options - ) - ); - plugin.apply(mainTemplate); - } - ); - } -} - -module.exports = FetchCompileWasmTemplatePlugin; diff --git a/lib/web/JsonpChunkLoadingPlugin.js b/lib/web/JsonpChunkLoadingPlugin.js new file mode 100644 index 00000000000..6bc1f6d0691 --- /dev/null +++ b/lib/web/JsonpChunkLoadingPlugin.js @@ -0,0 +1,99 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const RuntimeGlobals = require("../RuntimeGlobals"); +const JsonpChunkLoadingRuntimeModule = require("./JsonpChunkLoadingRuntimeModule"); + +/** @typedef {import("../Chunk")} Chunk */ +/** @typedef {import("../Compiler")} Compiler */ + +const PLUGIN_NAME = "JsonpChunkLoadingPlugin"; + +class JsonpChunkLoadingPlugin { + /** + * Apply the plugin + * @param {Compiler} compiler the compiler instance + * @returns {void} + */ + apply(compiler) { + compiler.hooks.thisCompilation.tap(PLUGIN_NAME, compilation => { + const globalChunkLoading = compilation.outputOptions.chunkLoading; + /** + * @param {Chunk} chunk chunk + * @returns {boolean} true, if wasm loading is enabled for the chunk + */ + const isEnabledForChunk = chunk => { + const options = chunk.getEntryOptions(); + const chunkLoading = + options && options.chunkLoading !== undefined + ? options.chunkLoading + : globalChunkLoading; + return chunkLoading === "jsonp"; + }; + const onceForChunkSet = new WeakSet(); + /** + * @param {Chunk} chunk chunk + * @param {Set} set runtime requirements + */ + const handler = (chunk, set) => { + if (onceForChunkSet.has(chunk)) return; + onceForChunkSet.add(chunk); + if (!isEnabledForChunk(chunk)) return; + set.add(RuntimeGlobals.moduleFactoriesAddOnly); + set.add(RuntimeGlobals.hasOwnProperty); + compilation.addRuntimeModule( + chunk, + new JsonpChunkLoadingRuntimeModule(set) + ); + }; + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.ensureChunkHandlers) + .tap(PLUGIN_NAME, handler); + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.hmrDownloadUpdateHandlers) + .tap(PLUGIN_NAME, handler); + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.hmrDownloadManifest) + .tap(PLUGIN_NAME, handler); + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.baseURI) + .tap(PLUGIN_NAME, handler); + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.onChunksLoaded) + .tap(PLUGIN_NAME, handler); + + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.ensureChunkHandlers) + .tap(PLUGIN_NAME, (chunk, set) => { + if (!isEnabledForChunk(chunk)) return; + set.add(RuntimeGlobals.publicPath); + set.add(RuntimeGlobals.loadScript); + set.add(RuntimeGlobals.getChunkScriptFilename); + }); + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.hmrDownloadUpdateHandlers) + .tap(PLUGIN_NAME, (chunk, set) => { + if (!isEnabledForChunk(chunk)) return; + set.add(RuntimeGlobals.publicPath); + set.add(RuntimeGlobals.loadScript); + set.add(RuntimeGlobals.getChunkUpdateScriptFilename); + set.add(RuntimeGlobals.moduleCache); + set.add(RuntimeGlobals.hmrModuleData); + set.add(RuntimeGlobals.moduleFactoriesAddOnly); + }); + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.hmrDownloadManifest) + .tap(PLUGIN_NAME, (chunk, set) => { + if (!isEnabledForChunk(chunk)) return; + set.add(RuntimeGlobals.publicPath); + set.add(RuntimeGlobals.getUpdateManifestFilename); + }); + }); + } +} + +module.exports = JsonpChunkLoadingPlugin; diff --git a/lib/web/JsonpChunkLoadingRuntimeModule.js b/lib/web/JsonpChunkLoadingRuntimeModule.js new file mode 100644 index 00000000000..0b9cebd8407 --- /dev/null +++ b/lib/web/JsonpChunkLoadingRuntimeModule.js @@ -0,0 +1,472 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php +*/ + +"use strict"; + +const { SyncWaterfallHook } = require("tapable"); +const Compilation = require("../Compilation"); +const RuntimeGlobals = require("../RuntimeGlobals"); +const RuntimeModule = require("../RuntimeModule"); +const Template = require("../Template"); +const chunkHasJs = require("../javascript/JavascriptModulesPlugin").chunkHasJs; +const { getInitialChunkIds } = require("../javascript/StartupHelpers"); +const compileBooleanMatcher = require("../util/compileBooleanMatcher"); + +/** @typedef {import("../Chunk")} Chunk */ +/** @typedef {import("../ChunkGraph")} ChunkGraph */ +/** @typedef {import("../Module").ReadOnlyRuntimeRequirements} ReadOnlyRuntimeRequirements */ + +/** + * @typedef {object} JsonpCompilationPluginHooks + * @property {SyncWaterfallHook<[string, Chunk]>} linkPreload + * @property {SyncWaterfallHook<[string, Chunk]>} linkPrefetch + */ + +/** @type {WeakMap} */ +const compilationHooksMap = new WeakMap(); + +class JsonpChunkLoadingRuntimeModule extends RuntimeModule { + /** + * @param {Compilation} compilation the compilation + * @returns {JsonpCompilationPluginHooks} hooks + */ + static getCompilationHooks(compilation) { + if (!(compilation instanceof Compilation)) { + throw new TypeError( + "The 'compilation' argument must be an instance of Compilation" + ); + } + let hooks = compilationHooksMap.get(compilation); + if (hooks === undefined) { + hooks = { + linkPreload: new SyncWaterfallHook(["source", "chunk"]), + linkPrefetch: new SyncWaterfallHook(["source", "chunk"]) + }; + compilationHooksMap.set(compilation, hooks); + } + return hooks; + } + + /** + * @param {ReadOnlyRuntimeRequirements} runtimeRequirements runtime requirements + */ + constructor(runtimeRequirements) { + super("jsonp chunk loading", RuntimeModule.STAGE_ATTACH); + this._runtimeRequirements = runtimeRequirements; + } + + /** + * @private + * @param {Chunk} chunk chunk + * @returns {string} generated code + */ + _generateBaseUri(chunk) { + const options = chunk.getEntryOptions(); + if (options && options.baseUri) { + return `${RuntimeGlobals.baseURI} = ${JSON.stringify(options.baseUri)};`; + } + return `${RuntimeGlobals.baseURI} = document.baseURI || self.location.href;`; + } + + /** + * @returns {string | null} runtime code + */ + generate() { + const compilation = /** @type {Compilation} */ (this.compilation); + const { + runtimeTemplate, + outputOptions: { + chunkLoadingGlobal, + hotUpdateGlobal, + crossOriginLoading, + scriptType, + charset + } + } = compilation; + const globalObject = runtimeTemplate.globalObject; + const { linkPreload, linkPrefetch } = + JsonpChunkLoadingRuntimeModule.getCompilationHooks(compilation); + const fn = RuntimeGlobals.ensureChunkHandlers; + const withBaseURI = this._runtimeRequirements.has(RuntimeGlobals.baseURI); + const withLoading = this._runtimeRequirements.has( + RuntimeGlobals.ensureChunkHandlers + ); + const withCallback = this._runtimeRequirements.has( + RuntimeGlobals.chunkCallback + ); + const withOnChunkLoad = this._runtimeRequirements.has( + RuntimeGlobals.onChunksLoaded + ); + const withHmr = this._runtimeRequirements.has( + RuntimeGlobals.hmrDownloadUpdateHandlers + ); + const withHmrManifest = this._runtimeRequirements.has( + RuntimeGlobals.hmrDownloadManifest + ); + const withFetchPriority = this._runtimeRequirements.has( + RuntimeGlobals.hasFetchPriority + ); + const chunkLoadingGlobalExpr = `${globalObject}[${JSON.stringify( + chunkLoadingGlobal + )}]`; + const chunkGraph = /** @type {ChunkGraph} */ (this.chunkGraph); + const chunk = /** @type {Chunk} */ (this.chunk); + const withPrefetch = + this._runtimeRequirements.has(RuntimeGlobals.prefetchChunkHandlers) && + chunk.hasChildByOrder(chunkGraph, "prefetch", true, chunkHasJs); + const withPreload = + this._runtimeRequirements.has(RuntimeGlobals.preloadChunkHandlers) && + chunk.hasChildByOrder(chunkGraph, "preload", true, chunkHasJs); + const conditionMap = chunkGraph.getChunkConditionMap(chunk, chunkHasJs); + const hasJsMatcher = compileBooleanMatcher(conditionMap); + const initialChunkIds = getInitialChunkIds(chunk, chunkGraph, chunkHasJs); + + const stateExpression = withHmr + ? `${RuntimeGlobals.hmrRuntimeStatePrefix}_jsonp` + : undefined; + + return Template.asString([ + withBaseURI ? this._generateBaseUri(chunk) : "// no baseURI", + "", + "// object to store loaded and loading chunks", + "// undefined = chunk not loaded, null = chunk preloaded/prefetched", + "// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded", + `var installedChunks = ${ + stateExpression ? `${stateExpression} = ${stateExpression} || ` : "" + }{`, + Template.indent( + Array.from(initialChunkIds, id => `${JSON.stringify(id)}: 0`).join( + ",\n" + ) + ), + "};", + "", + withLoading + ? Template.asString([ + `${fn}.j = ${runtimeTemplate.basicFunction( + `chunkId, promises${withFetchPriority ? ", fetchPriority" : ""}`, + hasJsMatcher !== false + ? Template.indent([ + "// JSONP chunk loading for javascript", + `var installedChunkData = ${RuntimeGlobals.hasOwnProperty}(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;`, + 'if(installedChunkData !== 0) { // 0 means "already installed".', + Template.indent([ + "", + '// a Promise means "currently loading".', + "if(installedChunkData) {", + Template.indent([ + "promises.push(installedChunkData[2]);" + ]), + "} else {", + Template.indent([ + hasJsMatcher === true + ? "if(true) { // all chunks have JS" + : `if(${hasJsMatcher("chunkId")}) {`, + Template.indent([ + "// setup Promise in chunk cache", + `var promise = new Promise(${runtimeTemplate.expressionFunction( + "installedChunkData = installedChunks[chunkId] = [resolve, reject]", + "resolve, reject" + )});`, + "promises.push(installedChunkData[2] = promise);", + "", + "// start chunk loading", + `var url = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.getChunkScriptFilename}(chunkId);`, + "// create error before stack unwound to get useful stacktrace later", + "var error = new Error();", + `var loadingEnded = ${runtimeTemplate.basicFunction( + "event", + [ + `if(${RuntimeGlobals.hasOwnProperty}(installedChunks, chunkId)) {`, + Template.indent([ + "installedChunkData = installedChunks[chunkId];", + "if(installedChunkData !== 0) installedChunks[chunkId] = undefined;", + "if(installedChunkData) {", + Template.indent([ + "var errorType = event && (event.type === 'load' ? 'missing' : event.type);", + "var realSrc = event && event.target && event.target.src;", + "error.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';", + "error.name = 'ChunkLoadError';", + "error.type = errorType;", + "error.request = realSrc;", + "installedChunkData[1](error);" + ]), + "}" + ]), + "}" + ] + )};`, + `${ + RuntimeGlobals.loadScript + }(url, loadingEnded, "chunk-" + chunkId, chunkId${ + withFetchPriority ? ", fetchPriority" : "" + });` + ]), + hasJsMatcher === true + ? "}" + : "} else installedChunks[chunkId] = 0;" + ]), + "}" + ]), + "}" + ]) + : Template.indent(["installedChunks[chunkId] = 0;"]) + )};` + ]) + : "// no chunk on demand loading", + "", + withPrefetch && hasJsMatcher !== false + ? `${ + RuntimeGlobals.prefetchChunkHandlers + }.j = ${runtimeTemplate.basicFunction("chunkId", [ + `if((!${ + RuntimeGlobals.hasOwnProperty + }(installedChunks, chunkId) || installedChunks[chunkId] === undefined) && ${ + hasJsMatcher === true ? "true" : hasJsMatcher("chunkId") + }) {`, + Template.indent([ + "installedChunks[chunkId] = null;", + linkPrefetch.call( + Template.asString([ + "var link = document.createElement('link');", + charset ? "link.charset = 'utf-8';" : "", + crossOriginLoading + ? `link.crossOrigin = ${JSON.stringify( + crossOriginLoading + )};` + : "", + `if (${RuntimeGlobals.scriptNonce}) {`, + Template.indent( + `link.setAttribute("nonce", ${RuntimeGlobals.scriptNonce});` + ), + "}", + 'link.rel = "prefetch";', + 'link.as = "script";', + `link.href = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.getChunkScriptFilename}(chunkId);` + ]), + chunk + ), + "document.head.appendChild(link);" + ]), + "}" + ])};` + : "// no prefetching", + "", + withPreload && hasJsMatcher !== false + ? `${ + RuntimeGlobals.preloadChunkHandlers + }.j = ${runtimeTemplate.basicFunction("chunkId", [ + `if((!${ + RuntimeGlobals.hasOwnProperty + }(installedChunks, chunkId) || installedChunks[chunkId] === undefined) && ${ + hasJsMatcher === true ? "true" : hasJsMatcher("chunkId") + }) {`, + Template.indent([ + "installedChunks[chunkId] = null;", + linkPreload.call( + Template.asString([ + "var link = document.createElement('link');", + scriptType && scriptType !== "module" + ? `link.type = ${JSON.stringify(scriptType)};` + : "", + charset ? "link.charset = 'utf-8';" : "", + `if (${RuntimeGlobals.scriptNonce}) {`, + Template.indent( + `link.setAttribute("nonce", ${RuntimeGlobals.scriptNonce});` + ), + "}", + scriptType === "module" + ? 'link.rel = "modulepreload";' + : 'link.rel = "preload";', + scriptType === "module" ? "" : 'link.as = "script";', + `link.href = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.getChunkScriptFilename}(chunkId);`, + crossOriginLoading + ? crossOriginLoading === "use-credentials" + ? 'link.crossOrigin = "use-credentials";' + : Template.asString([ + "if (link.href.indexOf(window.location.origin + '/') !== 0) {", + Template.indent( + `link.crossOrigin = ${JSON.stringify( + crossOriginLoading + )};` + ), + "}" + ]) + : "" + ]), + chunk + ), + "document.head.appendChild(link);" + ]), + "}" + ])};` + : "// no preloaded", + "", + withHmr + ? Template.asString([ + "var currentUpdatedModulesList;", + "var waitingUpdateResolves = {};", + "function loadUpdateChunk(chunkId, updatedModulesList) {", + Template.indent([ + "currentUpdatedModulesList = updatedModulesList;", + `return new Promise(${runtimeTemplate.basicFunction( + "resolve, reject", + [ + "waitingUpdateResolves[chunkId] = resolve;", + "// start update chunk loading", + `var url = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.getChunkUpdateScriptFilename}(chunkId);`, + "// create error before stack unwound to get useful stacktrace later", + "var error = new Error();", + `var loadingEnded = ${runtimeTemplate.basicFunction("event", [ + "if(waitingUpdateResolves[chunkId]) {", + Template.indent([ + "waitingUpdateResolves[chunkId] = undefined", + "var errorType = event && (event.type === 'load' ? 'missing' : event.type);", + "var realSrc = event && event.target && event.target.src;", + "error.message = 'Loading hot update chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';", + "error.name = 'ChunkLoadError';", + "error.type = errorType;", + "error.request = realSrc;", + "reject(error);" + ]), + "}" + ])};`, + `${RuntimeGlobals.loadScript}(url, loadingEnded);` + ] + )});` + ]), + "}", + "", + `${globalObject}[${JSON.stringify( + hotUpdateGlobal + )}] = ${runtimeTemplate.basicFunction( + "chunkId, moreModules, runtime", + [ + "for(var moduleId in moreModules) {", + Template.indent([ + `if(${RuntimeGlobals.hasOwnProperty}(moreModules, moduleId)) {`, + Template.indent([ + "currentUpdate[moduleId] = moreModules[moduleId];", + "if(currentUpdatedModulesList) currentUpdatedModulesList.push(moduleId);" + ]), + "}" + ]), + "}", + "if(runtime) currentUpdateRuntime.push(runtime);", + "if(waitingUpdateResolves[chunkId]) {", + Template.indent([ + "waitingUpdateResolves[chunkId]();", + "waitingUpdateResolves[chunkId] = undefined;" + ]), + "}" + ] + )};`, + "", + Template.getFunctionContent( + require("../hmr/JavascriptHotModuleReplacement.runtime.js") + ) + .replace(/\$key\$/g, "jsonp") + .replace(/\$installedChunks\$/g, "installedChunks") + .replace(/\$loadUpdateChunk\$/g, "loadUpdateChunk") + .replace(/\$moduleCache\$/g, RuntimeGlobals.moduleCache) + .replace(/\$moduleFactories\$/g, RuntimeGlobals.moduleFactories) + .replace( + /\$ensureChunkHandlers\$/g, + RuntimeGlobals.ensureChunkHandlers + ) + .replace(/\$hasOwnProperty\$/g, RuntimeGlobals.hasOwnProperty) + .replace(/\$hmrModuleData\$/g, RuntimeGlobals.hmrModuleData) + .replace( + /\$hmrDownloadUpdateHandlers\$/g, + RuntimeGlobals.hmrDownloadUpdateHandlers + ) + .replace( + /\$hmrInvalidateModuleHandlers\$/g, + RuntimeGlobals.hmrInvalidateModuleHandlers + ) + ]) + : "// no HMR", + "", + withHmrManifest + ? Template.asString([ + `${ + RuntimeGlobals.hmrDownloadManifest + } = ${runtimeTemplate.basicFunction("", [ + 'if (typeof fetch === "undefined") throw new Error("No browser support: need fetch API");', + `return fetch(${RuntimeGlobals.publicPath} + ${ + RuntimeGlobals.getUpdateManifestFilename + }()).then(${runtimeTemplate.basicFunction("response", [ + "if(response.status === 404) return; // no update available", + 'if(!response.ok) throw new Error("Failed to fetch update manifest " + response.statusText);', + "return response.json();" + ])});` + ])};` + ]) + : "// no HMR manifest", + "", + withOnChunkLoad + ? `${ + RuntimeGlobals.onChunksLoaded + }.j = ${runtimeTemplate.returningFunction( + "installedChunks[chunkId] === 0", + "chunkId" + )};` + : "// no on chunks loaded", + "", + withCallback || withLoading + ? Template.asString([ + "// install a JSONP callback for chunk loading", + `var webpackJsonpCallback = ${runtimeTemplate.basicFunction( + "parentChunkLoadingFunction, data", + [ + runtimeTemplate.destructureArray( + ["chunkIds", "moreModules", "runtime"], + "data" + ), + '// add "moreModules" to the modules object,', + '// then flag all "chunkIds" as loaded and fire callback', + "var moduleId, chunkId, i = 0;", + `if(chunkIds.some(${runtimeTemplate.returningFunction( + "installedChunks[id] !== 0", + "id" + )})) {`, + Template.indent([ + "for(moduleId in moreModules) {", + Template.indent([ + `if(${RuntimeGlobals.hasOwnProperty}(moreModules, moduleId)) {`, + Template.indent( + `${RuntimeGlobals.moduleFactories}[moduleId] = moreModules[moduleId];` + ), + "}" + ]), + "}", + `if(runtime) var result = runtime(${RuntimeGlobals.require});` + ]), + "}", + "if(parentChunkLoadingFunction) parentChunkLoadingFunction(data);", + "for(;i < chunkIds.length; i++) {", + Template.indent([ + "chunkId = chunkIds[i];", + `if(${RuntimeGlobals.hasOwnProperty}(installedChunks, chunkId) && installedChunks[chunkId]) {`, + Template.indent("installedChunks[chunkId][0]();"), + "}", + "installedChunks[chunkId] = 0;" + ]), + "}", + withOnChunkLoad + ? `return ${RuntimeGlobals.onChunksLoaded}(result);` + : "" + ] + )}`, + "", + `var chunkLoadingGlobal = ${chunkLoadingGlobalExpr} = ${chunkLoadingGlobalExpr} || [];`, + "chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));", + "chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));" + ]) + : "// no jsonp function" + ]); + } +} + +module.exports = JsonpChunkLoadingRuntimeModule; diff --git a/lib/web/JsonpChunkTemplatePlugin.js b/lib/web/JsonpChunkTemplatePlugin.js deleted file mode 100644 index 123dd52046a..00000000000 --- a/lib/web/JsonpChunkTemplatePlugin.js +++ /dev/null @@ -1,71 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -"use strict"; - -const { ConcatSource } = require("webpack-sources"); - -/** @typedef {import("../ChunkTemplate")} ChunkTemplate */ - -const getEntryInfo = chunk => { - return [chunk.entryModule].filter(Boolean).map(m => - [m.id].concat( - Array.from(chunk.groupsIterable)[0] - .chunks.filter(c => c !== chunk) - .map(c => c.id) - ) - ); -}; - -class JsonpChunkTemplatePlugin { - /** - * @param {ChunkTemplate} chunkTemplate the chunk template - * @returns {void} - */ - apply(chunkTemplate) { - chunkTemplate.hooks.render.tap( - "JsonpChunkTemplatePlugin", - (modules, chunk) => { - const jsonpFunction = chunkTemplate.outputOptions.jsonpFunction; - const globalObject = chunkTemplate.outputOptions.globalObject; - const source = new ConcatSource(); - const prefetchChunks = chunk.getChildIdsByOrders().prefetch; - source.add( - `(${globalObject}[${JSON.stringify( - jsonpFunction - )}] = ${globalObject}[${JSON.stringify( - jsonpFunction - )}] || []).push([${JSON.stringify(chunk.ids)},` - ); - source.add(modules); - const entries = getEntryInfo(chunk); - if (entries.length > 0) { - source.add(`,${JSON.stringify(entries)}`); - } else if (prefetchChunks && prefetchChunks.length) { - source.add(`,0`); - } - - if (prefetchChunks && prefetchChunks.length) { - source.add(`,${JSON.stringify(prefetchChunks)}`); - } - source.add("])"); - return source; - } - ); - chunkTemplate.hooks.hash.tap("JsonpChunkTemplatePlugin", hash => { - hash.update("JsonpChunkTemplatePlugin"); - hash.update("4"); - hash.update(`${chunkTemplate.outputOptions.jsonpFunction}`); - hash.update(`${chunkTemplate.outputOptions.globalObject}`); - }); - chunkTemplate.hooks.hashForChunk.tap( - "JsonpChunkTemplatePlugin", - (hash, chunk) => { - hash.update(JSON.stringify(getEntryInfo(chunk))); - hash.update(JSON.stringify(chunk.getChildIdsByOrders().prefetch) || ""); - } - ); - } -} -module.exports = JsonpChunkTemplatePlugin; diff --git a/lib/web/JsonpExportMainTemplatePlugin.js b/lib/web/JsonpExportMainTemplatePlugin.js deleted file mode 100644 index 064b249e3f8..00000000000 --- a/lib/web/JsonpExportMainTemplatePlugin.js +++ /dev/null @@ -1,50 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -"use strict"; - -const { ConcatSource } = require("webpack-sources"); - -class JsonpExportMainTemplatePlugin { - /** - * @param {string} name jsonp function name - */ - constructor(name) { - this.name = name; - } - - apply(compilation) { - const { mainTemplate, chunkTemplate } = compilation; - - const onRenderWithEntry = (source, chunk, hash) => { - const name = mainTemplate.getAssetPath(this.name || "", { - hash, - chunk - }); - return new ConcatSource(`${name}(`, source, ");"); - }; - - for (const template of [mainTemplate, chunkTemplate]) { - template.hooks.renderWithEntry.tap( - "JsonpExportMainTemplatePlugin", - onRenderWithEntry - ); - } - - mainTemplate.hooks.globalHashPaths.tap( - "JsonpExportMainTemplatePlugin", - paths => { - if (this.name) paths.push(this.name); - return paths; - } - ); - - mainTemplate.hooks.hash.tap("JsonpExportMainTemplatePlugin", hash => { - hash.update("jsonp export"); - hash.update(`${this.name}`); - }); - } -} - -module.exports = JsonpExportMainTemplatePlugin; diff --git a/lib/web/JsonpHotUpdateChunkTemplatePlugin.js b/lib/web/JsonpHotUpdateChunkTemplatePlugin.js deleted file mode 100644 index bff023c05a7..00000000000 --- a/lib/web/JsonpHotUpdateChunkTemplatePlugin.js +++ /dev/null @@ -1,39 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -"use strict"; - -const { ConcatSource } = require("webpack-sources"); - -class JsonpHotUpdateChunkTemplatePlugin { - apply(hotUpdateChunkTemplate) { - hotUpdateChunkTemplate.hooks.render.tap( - "JsonpHotUpdateChunkTemplatePlugin", - (modulesSource, modules, removedModules, hash, id) => { - const source = new ConcatSource(); - source.add( - `${ - hotUpdateChunkTemplate.outputOptions.hotUpdateFunction - }(${JSON.stringify(id)},` - ); - source.add(modulesSource); - source.add(")"); - return source; - } - ); - hotUpdateChunkTemplate.hooks.hash.tap( - "JsonpHotUpdateChunkTemplatePlugin", - hash => { - hash.update("JsonpHotUpdateChunkTemplatePlugin"); - hash.update("3"); - hash.update( - `${hotUpdateChunkTemplate.outputOptions.hotUpdateFunction}` - ); - hash.update(`${hotUpdateChunkTemplate.outputOptions.library}`); - } - ); - } -} - -module.exports = JsonpHotUpdateChunkTemplatePlugin; diff --git a/lib/web/JsonpMainTemplate.runtime.js b/lib/web/JsonpMainTemplate.runtime.js deleted file mode 100644 index 58dcf8312f1..00000000000 --- a/lib/web/JsonpMainTemplate.runtime.js +++ /dev/null @@ -1,64 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -/*globals hotAddUpdateChunk parentHotUpdateCallback document XMLHttpRequest $require$ $hotChunkFilename$ $hotMainFilename$ $crossOriginLoading$ */ -module.exports = function() { - // eslint-disable-next-line no-unused-vars - function webpackHotUpdateCallback(chunkId, moreModules) { - hotAddUpdateChunk(chunkId, moreModules); - if (parentHotUpdateCallback) parentHotUpdateCallback(chunkId, moreModules); - } //$semicolon - - // eslint-disable-next-line no-unused-vars - function hotDownloadUpdateChunk(chunkId) { - var script = document.createElement("script"); - script.charset = "utf-8"; - script.src = $require$.p + $hotChunkFilename$; - if ($crossOriginLoading$) script.crossOrigin = $crossOriginLoading$; - document.head.appendChild(script); - } - - // eslint-disable-next-line no-unused-vars - function hotDownloadManifest(requestTimeout) { - requestTimeout = requestTimeout || 10000; - return new Promise(function(resolve, reject) { - if (typeof XMLHttpRequest === "undefined") { - return reject(new Error("No browser support")); - } - try { - var request = new XMLHttpRequest(); - var requestPath = $require$.p + $hotMainFilename$; - request.open("GET", requestPath, true); - request.timeout = requestTimeout; - request.send(null); - } catch (err) { - return reject(err); - } - request.onreadystatechange = function() { - if (request.readyState !== 4) return; - if (request.status === 0) { - // timeout - reject( - new Error("Manifest request to " + requestPath + " timed out.") - ); - } else if (request.status === 404) { - // no update available - resolve(); - } else if (request.status !== 200 && request.status !== 304) { - // other failure - reject(new Error("Manifest request to " + requestPath + " failed.")); - } else { - // success - try { - var update = JSON.parse(request.responseText); - } catch (e) { - reject(e); - return; - } - resolve(update); - } - }; - }); - } -}; diff --git a/lib/web/JsonpMainTemplatePlugin.js b/lib/web/JsonpMainTemplatePlugin.js deleted file mode 100644 index 6466ff7667a..00000000000 --- a/lib/web/JsonpMainTemplatePlugin.js +++ /dev/null @@ -1,583 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -"use strict"; - -const { SyncWaterfallHook } = require("tapable"); -const Template = require("../Template"); - -class JsonpMainTemplatePlugin { - apply(mainTemplate) { - const needChunkOnDemandLoadingCode = chunk => { - for (const chunkGroup of chunk.groupsIterable) { - if (chunkGroup.getNumberOfChildren() > 0) return true; - } - return false; - }; - const needChunkLoadingCode = chunk => { - for (const chunkGroup of chunk.groupsIterable) { - if (chunkGroup.chunks.length > 1) return true; - if (chunkGroup.getNumberOfChildren() > 0) return true; - } - return false; - }; - const needEntryDeferringCode = chunk => { - for (const chunkGroup of chunk.groupsIterable) { - if (chunkGroup.chunks.length > 1) return true; - } - return false; - }; - const needPrefetchingCode = chunk => { - const allPrefetchChunks = chunk.getChildIdsByOrdersMap(true).prefetch; - return allPrefetchChunks && Object.keys(allPrefetchChunks).length; - }; - - // TODO webpack 5, no adding to .hooks, use WeakMap and static methods - ["jsonpScript", "linkPreload", "linkPrefetch"].forEach(hook => { - if (!mainTemplate.hooks[hook]) { - mainTemplate.hooks[hook] = new SyncWaterfallHook([ - "source", - "chunk", - "hash" - ]); - } - }); - - const getScriptSrcPath = (hash, chunk, chunkIdExpression) => { - const chunkFilename = mainTemplate.outputOptions.chunkFilename; - const chunkMaps = chunk.getChunkMaps(); - return mainTemplate.getAssetPath(JSON.stringify(chunkFilename), { - hash: `" + ${mainTemplate.renderCurrentHashCode(hash)} + "`, - hashWithLength: length => - `" + ${mainTemplate.renderCurrentHashCode(hash, length)} + "`, - chunk: { - id: `" + ${chunkIdExpression} + "`, - hash: `" + ${JSON.stringify( - chunkMaps.hash - )}[${chunkIdExpression}] + "`, - hashWithLength(length) { - const shortChunkHashMap = Object.create(null); - for (const chunkId of Object.keys(chunkMaps.hash)) { - if (typeof chunkMaps.hash[chunkId] === "string") { - shortChunkHashMap[chunkId] = chunkMaps.hash[chunkId].substr( - 0, - length - ); - } - } - return `" + ${JSON.stringify( - shortChunkHashMap - )}[${chunkIdExpression}] + "`; - }, - name: `" + (${JSON.stringify( - chunkMaps.name - )}[${chunkIdExpression}]||${chunkIdExpression}) + "`, - contentHash: { - javascript: `" + ${JSON.stringify( - chunkMaps.contentHash.javascript - )}[${chunkIdExpression}] + "` - }, - contentHashWithLength: { - javascript: length => { - const shortContentHashMap = {}; - const contentHash = chunkMaps.contentHash.javascript; - for (const chunkId of Object.keys(contentHash)) { - if (typeof contentHash[chunkId] === "string") { - shortContentHashMap[chunkId] = contentHash[chunkId].substr( - 0, - length - ); - } - } - return `" + ${JSON.stringify( - shortContentHashMap - )}[${chunkIdExpression}] + "`; - } - } - }, - contentHashType: "javascript" - }); - }; - mainTemplate.hooks.localVars.tap( - "JsonpMainTemplatePlugin", - (source, chunk, hash) => { - const extraCode = []; - if (needChunkLoadingCode(chunk)) { - extraCode.push( - "", - "// object to store loaded and loading chunks", - "// undefined = chunk not loaded, null = chunk preloaded/prefetched", - "// Promise = chunk loading, 0 = chunk loaded", - "var installedChunks = {", - Template.indent( - chunk.ids.map(id => `${JSON.stringify(id)}: 0`).join(",\n") - ), - "};", - "", - needEntryDeferringCode(chunk) ? "var deferredModules = [];" : "" - ); - } - if (needChunkOnDemandLoadingCode(chunk)) { - extraCode.push( - "", - "// script path function", - "function jsonpScriptSrc(chunkId) {", - Template.indent([ - `return ${mainTemplate.requireFn}.p + ${getScriptSrcPath( - hash, - chunk, - "chunkId" - )}` - ]), - "}" - ); - } - if (extraCode.length === 0) return source; - return Template.asString([source, ...extraCode]); - } - ); - - mainTemplate.hooks.jsonpScript.tap( - "JsonpMainTemplatePlugin", - (_, chunk, hash) => { - const crossOriginLoading = - mainTemplate.outputOptions.crossOriginLoading; - const chunkLoadTimeout = mainTemplate.outputOptions.chunkLoadTimeout; - const jsonpScriptType = mainTemplate.outputOptions.jsonpScriptType; - - return Template.asString([ - "var script = document.createElement('script');", - "var onScriptComplete;", - jsonpScriptType - ? `script.type = ${JSON.stringify(jsonpScriptType)};` - : "", - "script.charset = 'utf-8';", - `script.timeout = ${chunkLoadTimeout / 1000};`, - `if (${mainTemplate.requireFn}.nc) {`, - Template.indent( - `script.setAttribute("nonce", ${mainTemplate.requireFn}.nc);` - ), - "}", - "script.src = jsonpScriptSrc(chunkId);", - crossOriginLoading - ? Template.asString([ - "if (script.src.indexOf(window.location.origin + '/') !== 0) {", - Template.indent( - `script.crossOrigin = ${JSON.stringify(crossOriginLoading)};` - ), - "}" - ]) - : "", - "onScriptComplete = function (event) {", - Template.indent([ - "// avoid mem leaks in IE.", - "script.onerror = script.onload = null;", - "clearTimeout(timeout);", - "var chunk = installedChunks[chunkId];", - "if(chunk !== 0) {", - Template.indent([ - "if(chunk) {", - Template.indent([ - "var errorType = event && (event.type === 'load' ? 'missing' : event.type);", - "var realSrc = event && event.target && event.target.src;", - "var error = new Error('Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')');", - "error.type = errorType;", - "error.request = realSrc;", - "chunk[1](error);" - ]), - "}", - "installedChunks[chunkId] = undefined;" - ]), - "}" - ]), - "};", - "var timeout = setTimeout(function(){", - Template.indent([ - "onScriptComplete({ type: 'timeout', target: script });" - ]), - `}, ${chunkLoadTimeout});`, - "script.onerror = script.onload = onScriptComplete;" - ]); - } - ); - mainTemplate.hooks.linkPreload.tap( - "JsonpMainTemplatePlugin", - (_, chunk, hash) => { - const crossOriginLoading = - mainTemplate.outputOptions.crossOriginLoading; - const jsonpScriptType = mainTemplate.outputOptions.jsonpScriptType; - - return Template.asString([ - "var link = document.createElement('link');", - jsonpScriptType - ? `link.type = ${JSON.stringify(jsonpScriptType)};` - : "", - "link.charset = 'utf-8';", - `if (${mainTemplate.requireFn}.nc) {`, - Template.indent( - `link.setAttribute("nonce", ${mainTemplate.requireFn}.nc);` - ), - "}", - 'link.rel = "preload";', - 'link.as = "script";', - "link.href = jsonpScriptSrc(chunkId);", - crossOriginLoading - ? Template.asString([ - "if (link.href.indexOf(window.location.origin + '/') !== 0) {", - Template.indent( - `link.crossOrigin = ${JSON.stringify(crossOriginLoading)};` - ), - "}" - ]) - : "" - ]); - } - ); - mainTemplate.hooks.linkPrefetch.tap( - "JsonpMainTemplatePlugin", - (_, chunk, hash) => { - const crossOriginLoading = - mainTemplate.outputOptions.crossOriginLoading; - - return Template.asString([ - "var link = document.createElement('link');", - crossOriginLoading - ? `link.crossOrigin = ${JSON.stringify(crossOriginLoading)};` - : "", - `if (${mainTemplate.requireFn}.nc) {`, - Template.indent( - `link.setAttribute("nonce", ${mainTemplate.requireFn}.nc);` - ), - "}", - 'link.rel = "prefetch";', - 'link.as = "script";', - "link.href = jsonpScriptSrc(chunkId);" - ]); - } - ); - mainTemplate.hooks.requireEnsure.tap( - "JsonpMainTemplatePlugin load", - (source, chunk, hash) => { - return Template.asString([ - source, - "", - "// JSONP chunk loading for javascript", - "", - "var installedChunkData = installedChunks[chunkId];", - 'if(installedChunkData !== 0) { // 0 means "already installed".', - Template.indent([ - "", - '// a Promise means "currently loading".', - "if(installedChunkData) {", - Template.indent(["promises.push(installedChunkData[2]);"]), - "} else {", - Template.indent([ - "// setup Promise in chunk cache", - "var promise = new Promise(function(resolve, reject) {", - Template.indent([ - "installedChunkData = installedChunks[chunkId] = [resolve, reject];" - ]), - "});", - "promises.push(installedChunkData[2] = promise);", - "", - "// start chunk loading", - mainTemplate.hooks.jsonpScript.call("", chunk, hash), - "document.head.appendChild(script);" - ]), - "}" - ]), - "}" - ]); - } - ); - mainTemplate.hooks.requireEnsure.tap( - { - name: "JsonpMainTemplatePlugin preload", - stage: 10 - }, - (source, chunk, hash) => { - const chunkMap = chunk.getChildIdsByOrdersMap().preload; - if (!chunkMap || Object.keys(chunkMap).length === 0) return source; - return Template.asString([ - source, - "", - "// chunk preloadng for javascript", - "", - `var chunkPreloadMap = ${JSON.stringify(chunkMap, null, "\t")};`, - "", - "var chunkPreloadData = chunkPreloadMap[chunkId];", - "if(chunkPreloadData) {", - Template.indent([ - "chunkPreloadData.forEach(function(chunkId) {", - Template.indent([ - "if(installedChunks[chunkId] === undefined) {", - Template.indent([ - "installedChunks[chunkId] = null;", - mainTemplate.hooks.linkPreload.call("", chunk, hash), - "document.head.appendChild(link);" - ]), - "}" - ]), - "});" - ]), - "}" - ]); - } - ); - mainTemplate.hooks.requireExtensions.tap( - "JsonpMainTemplatePlugin", - (source, chunk) => { - if (!needChunkOnDemandLoadingCode(chunk)) return source; - - return Template.asString([ - source, - "", - "// on error function for async loading", - `${ - mainTemplate.requireFn - }.oe = function(err) { console.error(err); throw err; };` - ]); - } - ); - mainTemplate.hooks.bootstrap.tap( - "JsonpMainTemplatePlugin", - (source, chunk, hash) => { - if (needChunkLoadingCode(chunk)) { - const withDefer = needEntryDeferringCode(chunk); - const withPrefetch = needPrefetchingCode(chunk); - return Template.asString([ - source, - "", - "// install a JSONP callback for chunk loading", - "function webpackJsonpCallback(data) {", - Template.indent([ - "var chunkIds = data[0];", - "var moreModules = data[1];", - withDefer ? "var executeModules = data[2];" : "", - withPrefetch ? "var prefetchChunks = data[3] || [];" : "", - '// add "moreModules" to the modules object,', - '// then flag all "chunkIds" as loaded and fire callback', - "var moduleId, chunkId, i = 0, resolves = [];", - "for(;i < chunkIds.length; i++) {", - Template.indent([ - "chunkId = chunkIds[i];", - "if(installedChunks[chunkId]) {", - Template.indent("resolves.push(installedChunks[chunkId][0]);"), - "}", - "installedChunks[chunkId] = 0;" - ]), - "}", - "for(moduleId in moreModules) {", - Template.indent([ - "if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {", - Template.indent( - mainTemplate.renderAddModule( - hash, - chunk, - "moduleId", - "moreModules[moduleId]" - ) - ), - "}" - ]), - "}", - "if(parentJsonpFunction) parentJsonpFunction(data);", - withPrefetch - ? Template.asString([ - "// chunk prefetching for javascript", - "prefetchChunks.forEach(function(chunkId) {", - Template.indent([ - "if(installedChunks[chunkId] === undefined) {", - Template.indent([ - "installedChunks[chunkId] = null;", - mainTemplate.hooks.linkPrefetch.call("", chunk, hash), - "document.head.appendChild(link);" - ]), - "}" - ]), - "});" - ]) - : "", - "while(resolves.length) {", - Template.indent("resolves.shift()();"), - "}", - withDefer - ? Template.asString([ - "", - "// add entry modules from loaded chunk to deferred list", - "deferredModules.push.apply(deferredModules, executeModules || []);", - "", - "// run deferred modules when all chunks ready", - "return checkDeferredModules();" - ]) - : "" - ]), - "};", - withDefer - ? Template.asString([ - "function checkDeferredModules() {", - Template.indent([ - "var result;", - "for(var i = 0; i < deferredModules.length; i++) {", - Template.indent([ - "var deferredModule = deferredModules[i];", - "var fulfilled = true;", - "for(var j = 1; j < deferredModule.length; j++) {", - Template.indent([ - "var depId = deferredModule[j];", - "if(installedChunks[depId] !== 0) fulfilled = false;" - ]), - "}", - "if(fulfilled) {", - Template.indent([ - "deferredModules.splice(i--, 1);", - "result = " + - mainTemplate.requireFn + - "(" + - mainTemplate.requireFn + - ".s = deferredModule[0]);" - ]), - "}" - ]), - "}", - "return result;" - ]), - "}" - ]) - : "" - ]); - } - return source; - } - ); - mainTemplate.hooks.beforeStartup.tap( - "JsonpMainTemplatePlugin", - (source, chunk, hash) => { - if (needChunkLoadingCode(chunk)) { - var jsonpFunction = mainTemplate.outputOptions.jsonpFunction; - var globalObject = mainTemplate.outputOptions.globalObject; - return Template.asString([ - `var jsonpArray = ${globalObject}[${JSON.stringify( - jsonpFunction - )}] = ${globalObject}[${JSON.stringify(jsonpFunction)}] || [];`, - "var oldJsonpFunction = jsonpArray.push.bind(jsonpArray);", - "jsonpArray.push = webpackJsonpCallback;", - "jsonpArray = jsonpArray.slice();", - "for(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);", - "var parentJsonpFunction = oldJsonpFunction;", - "", - source - ]); - } - return source; - } - ); - mainTemplate.hooks.beforeStartup.tap( - "JsonpMainTemplatePlugin", - (source, chunk, hash) => { - const prefetchChunks = chunk.getChildIdsByOrders().prefetch; - if ( - needChunkLoadingCode(chunk) && - prefetchChunks && - prefetchChunks.length - ) { - return Template.asString([ - source, - `webpackJsonpCallback([[], {}, 0, ${JSON.stringify( - prefetchChunks - )}]);` - ]); - } - return source; - } - ); - mainTemplate.hooks.startup.tap( - "JsonpMainTemplatePlugin", - (source, chunk, hash) => { - if (needEntryDeferringCode(chunk)) { - if (chunk.hasEntryModule()) { - const entries = [chunk.entryModule].filter(Boolean).map(m => - [m.id].concat( - Array.from(chunk.groupsIterable)[0] - .chunks.filter(c => c !== chunk) - .map(c => c.id) - ) - ); - return Template.asString([ - "// add entry module to deferred list", - `deferredModules.push(${entries - .map(e => JSON.stringify(e)) - .join(", ")});`, - "// run deferred modules when ready", - "return checkDeferredModules();" - ]); - } else { - return Template.asString([ - "// run deferred modules from other chunks", - "checkDeferredModules();" - ]); - } - } - return source; - } - ); - mainTemplate.hooks.hotBootstrap.tap( - "JsonpMainTemplatePlugin", - (source, chunk, hash) => { - const globalObject = mainTemplate.outputOptions.globalObject; - const hotUpdateChunkFilename = - mainTemplate.outputOptions.hotUpdateChunkFilename; - const hotUpdateMainFilename = - mainTemplate.outputOptions.hotUpdateMainFilename; - const crossOriginLoading = - mainTemplate.outputOptions.crossOriginLoading; - const hotUpdateFunction = mainTemplate.outputOptions.hotUpdateFunction; - const currentHotUpdateChunkFilename = mainTemplate.getAssetPath( - JSON.stringify(hotUpdateChunkFilename), - { - hash: `" + ${mainTemplate.renderCurrentHashCode(hash)} + "`, - hashWithLength: length => - `" + ${mainTemplate.renderCurrentHashCode(hash, length)} + "`, - chunk: { - id: '" + chunkId + "' - } - } - ); - const currentHotUpdateMainFilename = mainTemplate.getAssetPath( - JSON.stringify(hotUpdateMainFilename), - { - hash: `" + ${mainTemplate.renderCurrentHashCode(hash)} + "`, - hashWithLength: length => - `" + ${mainTemplate.renderCurrentHashCode(hash, length)} + "` - } - ); - const runtimeSource = Template.getFunctionContent( - require("./JsonpMainTemplate.runtime") - ) - .replace(/\/\/\$semicolon/g, ";") - .replace(/\$require\$/g, mainTemplate.requireFn) - .replace( - /\$crossOriginLoading\$/g, - crossOriginLoading ? JSON.stringify(crossOriginLoading) : "null" - ) - .replace(/\$hotMainFilename\$/g, currentHotUpdateMainFilename) - .replace(/\$hotChunkFilename\$/g, currentHotUpdateChunkFilename) - .replace(/\$hash\$/g, JSON.stringify(hash)); - return `${source} -function hotDisposeChunk(chunkId) { - delete installedChunks[chunkId]; -} -var parentHotUpdateCallback = ${globalObject}[${JSON.stringify( - hotUpdateFunction - )}]; -${globalObject}[${JSON.stringify(hotUpdateFunction)}] = ${runtimeSource}`; - } - ); - mainTemplate.hooks.hash.tap("JsonpMainTemplatePlugin", hash => { - hash.update("jsonp"); - hash.update("6"); - }); - } -} -module.exports = JsonpMainTemplatePlugin; diff --git a/lib/web/JsonpTemplatePlugin.js b/lib/web/JsonpTemplatePlugin.js index 80a6b5b406b..eeed68a28ba 100644 --- a/lib/web/JsonpTemplatePlugin.js +++ b/lib/web/JsonpTemplatePlugin.js @@ -2,21 +2,36 @@ MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ + "use strict"; -const JsonpMainTemplatePlugin = require("./JsonpMainTemplatePlugin"); -const JsonpChunkTemplatePlugin = require("./JsonpChunkTemplatePlugin"); -const JsonpHotUpdateChunkTemplatePlugin = require("./JsonpHotUpdateChunkTemplatePlugin"); +const ArrayPushCallbackChunkFormatPlugin = require("../javascript/ArrayPushCallbackChunkFormatPlugin"); +const EnableChunkLoadingPlugin = require("../javascript/EnableChunkLoadingPlugin"); +const JsonpChunkLoadingRuntimeModule = require("./JsonpChunkLoadingRuntimeModule"); + +/** @typedef {import("../Chunk")} Chunk */ +/** @typedef {import("../Compilation")} Compilation */ +/** @typedef {import("../Compiler")} Compiler */ class JsonpTemplatePlugin { + /** + * @deprecated use JsonpChunkLoadingRuntimeModule.getCompilationHooks instead + * @param {Compilation} compilation the compilation + * @returns {JsonpChunkLoadingRuntimeModule.JsonpCompilationPluginHooks} hooks + */ + static getCompilationHooks(compilation) { + return JsonpChunkLoadingRuntimeModule.getCompilationHooks(compilation); + } + + /** + * Apply the plugin + * @param {Compiler} compiler the compiler instance + * @returns {void} + */ apply(compiler) { - compiler.hooks.thisCompilation.tap("JsonpTemplatePlugin", compilation => { - new JsonpMainTemplatePlugin().apply(compilation.mainTemplate); - new JsonpChunkTemplatePlugin().apply(compilation.chunkTemplate); - new JsonpHotUpdateChunkTemplatePlugin().apply( - compilation.hotUpdateChunkTemplate - ); - }); + compiler.options.output.chunkLoading = "jsonp"; + new ArrayPushCallbackChunkFormatPlugin().apply(compiler); + new EnableChunkLoadingPlugin("jsonp").apply(compiler); } } diff --git a/lib/web/WebEnvironmentPlugin.js b/lib/web/WebEnvironmentPlugin.js deleted file mode 100644 index 9b0df5746f9..00000000000 --- a/lib/web/WebEnvironmentPlugin.js +++ /dev/null @@ -1,18 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -"use strict"; - -class WebEnvironmentPlugin { - constructor(inputFileSystem, outputFileSystem) { - this.inputFileSystem = inputFileSystem; - this.outputFileSystem = outputFileSystem; - } - - apply(compiler) { - compiler.outputFileSystem = this.outputFileSystem; - } -} - -module.exports = WebEnvironmentPlugin; diff --git a/lib/webpack.js b/lib/webpack.js index 2362951c4d9..b4205d74cc3 100644 --- a/lib/webpack.js +++ b/lib/webpack.js @@ -2,201 +2,194 @@ MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ + "use strict"; +const util = require("util"); +const webpackOptionsSchemaCheck = require("../schemas/WebpackOptions.check.js"); +const webpackOptionsSchema = require("../schemas/WebpackOptions.json"); const Compiler = require("./Compiler"); const MultiCompiler = require("./MultiCompiler"); -const NodeEnvironmentPlugin = require("./node/NodeEnvironmentPlugin"); const WebpackOptionsApply = require("./WebpackOptionsApply"); -const WebpackOptionsDefaulter = require("./WebpackOptionsDefaulter"); -const validateSchema = require("./validateSchema"); -const WebpackOptionsValidationError = require("./WebpackOptionsValidationError"); -const webpackOptionsSchema = require("../schemas/WebpackOptions.json"); -const RemovedPluginError = require("./RemovedPluginError"); -const version = require("../package.json").version; +const { + applyWebpackOptionsDefaults, + applyWebpackOptionsBaseDefaults +} = require("./config/defaults"); +const { getNormalizedWebpackOptions } = require("./config/normalization"); +const NodeEnvironmentPlugin = require("./node/NodeEnvironmentPlugin"); +const memoize = require("./util/memoize"); /** @typedef {import("../declarations/WebpackOptions").WebpackOptions} WebpackOptions */ +/** @typedef {import("../declarations/WebpackOptions").WebpackPluginFunction} WebpackPluginFunction */ +/** @typedef {import("./Compiler").WatchOptions} WatchOptions */ +/** @typedef {import("./MultiCompiler").MultiCompilerOptions} MultiCompilerOptions */ +/** @typedef {import("./MultiStats")} MultiStats */ +/** @typedef {import("./Stats")} Stats */ + +const getValidateSchema = memoize(() => require("./validateSchema")); /** - * @param {WebpackOptions} options options object - * @param {function(Error=, Stats=): void=} callback callback - * @returns {Compiler | MultiCompiler} the compiler object + * @template T + * @callback Callback + * @param {Error | null} err + * @param {T=} stats + * @returns {void} */ -const webpack = (options, callback) => { - const webpackOptionsValidationErrors = validateSchema( - webpackOptionsSchema, - options + +/** + * @param {ReadonlyArray} childOptions options array + * @param {MultiCompilerOptions} options options + * @returns {MultiCompiler} a multi-compiler + */ +const createMultiCompiler = (childOptions, options) => { + const compilers = childOptions.map((options, index) => + createCompiler(options, index) ); - if (webpackOptionsValidationErrors.length) { - throw new WebpackOptionsValidationError(webpackOptionsValidationErrors); + const compiler = new MultiCompiler(compilers, options); + for (const childCompiler of compilers) { + if (childCompiler.options.dependencies) { + compiler.setDependencies( + childCompiler, + childCompiler.options.dependencies + ); + } } - let compiler; - if (Array.isArray(options)) { - compiler = new MultiCompiler(options.map(options => webpack(options))); - } else if (typeof options === "object") { - options = new WebpackOptionsDefaulter().process(options); + return compiler; +}; - compiler = new Compiler(options.context); - compiler.options = options; - new NodeEnvironmentPlugin().apply(compiler); - if (options.plugins && Array.isArray(options.plugins)) { - for (const plugin of options.plugins) { - if (typeof plugin === "function") { - plugin.call(compiler, compiler); - } else { - plugin.apply(compiler); - } +/** + * @param {WebpackOptions} rawOptions options object + * @param {number=} compilerIndex index of compiler + * @returns {Compiler} a compiler + */ +const createCompiler = (rawOptions, compilerIndex) => { + const options = getNormalizedWebpackOptions(rawOptions); + applyWebpackOptionsBaseDefaults(options); + const compiler = new Compiler( + /** @type {string} */ (options.context), + options + ); + new NodeEnvironmentPlugin({ + infrastructureLogging: options.infrastructureLogging + }).apply(compiler); + if (Array.isArray(options.plugins)) { + for (const plugin of options.plugins) { + if (typeof plugin === "function") { + /** @type {WebpackPluginFunction} */ + (plugin).call(compiler, compiler); + } else if (plugin) { + plugin.apply(compiler); } } - compiler.hooks.environment.call(); - compiler.hooks.afterEnvironment.call(); - compiler.options = new WebpackOptionsApply().process(options, compiler); - } else { - throw new Error("Invalid argument: options"); } - if (callback) { - if (typeof callback !== "function") { - throw new Error("Invalid argument: callback"); - } - if ( - options.watch === true || - (Array.isArray(options) && options.some(o => o.watch)) - ) { - const watchOptions = Array.isArray(options) - ? options.map(o => o.watchOptions || {}) - : options.watchOptions || {}; - return compiler.watch(watchOptions, callback); - } - compiler.run(callback); + const resolvedDefaultOptions = applyWebpackOptionsDefaults( + options, + compilerIndex + ); + if (resolvedDefaultOptions.platform) { + compiler.platform = resolvedDefaultOptions.platform; } + compiler.hooks.environment.call(); + compiler.hooks.afterEnvironment.call(); + new WebpackOptionsApply().process(options, compiler); + compiler.hooks.initialize.call(); return compiler; }; -exports = module.exports = webpack; -exports.version = version; - -webpack.WebpackOptionsDefaulter = WebpackOptionsDefaulter; -webpack.WebpackOptionsApply = WebpackOptionsApply; -webpack.Compiler = Compiler; -webpack.MultiCompiler = MultiCompiler; -webpack.NodeEnvironmentPlugin = NodeEnvironmentPlugin; -// @ts-ignore Global @this directive is not supported -webpack.validate = validateSchema.bind(this, webpackOptionsSchema); -webpack.validateSchema = validateSchema; -webpack.WebpackOptionsValidationError = WebpackOptionsValidationError; +/** + * @callback WebpackFunctionSingle + * @param {WebpackOptions} options options object + * @param {Callback=} callback callback + * @returns {Compiler} the compiler object + */ -const exportPlugins = (obj, mappings) => { - for (const name of Object.keys(mappings)) { - Object.defineProperty(obj, name, { - configurable: false, - enumerable: true, - get: mappings[name] - }); - } -}; +/** + * @callback WebpackFunctionMulti + * @param {ReadonlyArray & MultiCompilerOptions} options options objects + * @param {Callback=} callback callback + * @returns {MultiCompiler} the multi compiler object + */ -exportPlugins(exports, { - AutomaticPrefetchPlugin: () => require("./AutomaticPrefetchPlugin"), - BannerPlugin: () => require("./BannerPlugin"), - CachePlugin: () => require("./CachePlugin"), - ContextExclusionPlugin: () => require("./ContextExclusionPlugin"), - ContextReplacementPlugin: () => require("./ContextReplacementPlugin"), - DefinePlugin: () => require("./DefinePlugin"), - Dependency: () => require("./Dependency"), - DllPlugin: () => require("./DllPlugin"), - DllReferencePlugin: () => require("./DllReferencePlugin"), - EnvironmentPlugin: () => require("./EnvironmentPlugin"), - EvalDevToolModulePlugin: () => require("./EvalDevToolModulePlugin"), - EvalSourceMapDevToolPlugin: () => require("./EvalSourceMapDevToolPlugin"), - ExtendedAPIPlugin: () => require("./ExtendedAPIPlugin"), - ExternalsPlugin: () => require("./ExternalsPlugin"), - HashedModuleIdsPlugin: () => require("./HashedModuleIdsPlugin"), - HotModuleReplacementPlugin: () => require("./HotModuleReplacementPlugin"), - IgnorePlugin: () => require("./IgnorePlugin"), - LibraryTemplatePlugin: () => require("./LibraryTemplatePlugin"), - LoaderOptionsPlugin: () => require("./LoaderOptionsPlugin"), - LoaderTargetPlugin: () => require("./LoaderTargetPlugin"), - MemoryOutputFileSystem: () => require("./MemoryOutputFileSystem"), - Module: () => require("./Module"), - ModuleFilenameHelpers: () => require("./ModuleFilenameHelpers"), - NamedChunksPlugin: () => require("./NamedChunksPlugin"), - NamedModulesPlugin: () => require("./NamedModulesPlugin"), - NoEmitOnErrorsPlugin: () => require("./NoEmitOnErrorsPlugin"), - NormalModuleReplacementPlugin: () => - require("./NormalModuleReplacementPlugin"), - PrefetchPlugin: () => require("./PrefetchPlugin"), - ProgressPlugin: () => require("./ProgressPlugin"), - ProvidePlugin: () => require("./ProvidePlugin"), - SetVarMainTemplatePlugin: () => require("./SetVarMainTemplatePlugin"), - SingleEntryPlugin: () => require("./SingleEntryPlugin"), - SourceMapDevToolPlugin: () => require("./SourceMapDevToolPlugin"), - Stats: () => require("./Stats"), - Template: () => require("./Template"), - UmdMainTemplatePlugin: () => require("./UmdMainTemplatePlugin"), - WatchIgnorePlugin: () => require("./WatchIgnorePlugin") -}); -exportPlugins((exports.dependencies = {}), { - DependencyReference: () => require("./dependencies/DependencyReference") -}); -exportPlugins((exports.optimize = {}), { - AggressiveMergingPlugin: () => require("./optimize/AggressiveMergingPlugin"), - AggressiveSplittingPlugin: () => - require("./optimize/AggressiveSplittingPlugin"), - ChunkModuleIdRangePlugin: () => - require("./optimize/ChunkModuleIdRangePlugin"), - LimitChunkCountPlugin: () => require("./optimize/LimitChunkCountPlugin"), - MinChunkSizePlugin: () => require("./optimize/MinChunkSizePlugin"), - ModuleConcatenationPlugin: () => - require("./optimize/ModuleConcatenationPlugin"), - OccurrenceOrderPlugin: () => require("./optimize/OccurrenceOrderPlugin"), - OccurrenceModuleOrderPlugin: () => - require("./optimize/OccurrenceModuleOrderPlugin"), - OccurrenceChunkOrderPlugin: () => - require("./optimize/OccurrenceChunkOrderPlugin"), - RuntimeChunkPlugin: () => require("./optimize/RuntimeChunkPlugin"), - SideEffectsFlagPlugin: () => require("./optimize/SideEffectsFlagPlugin"), - SplitChunksPlugin: () => require("./optimize/SplitChunksPlugin") -}); -exportPlugins((exports.web = {}), { - FetchCompileWasmTemplatePlugin: () => - require("./web/FetchCompileWasmTemplatePlugin"), - JsonpTemplatePlugin: () => require("./web/JsonpTemplatePlugin") -}); -exportPlugins((exports.webworker = {}), { - WebWorkerTemplatePlugin: () => require("./webworker/WebWorkerTemplatePlugin") -}); -exportPlugins((exports.node = {}), { - NodeTemplatePlugin: () => require("./node/NodeTemplatePlugin"), - ReadFileCompileWasmTemplatePlugin: () => - require("./node/ReadFileCompileWasmTemplatePlugin") -}); -exportPlugins((exports.debug = {}), { - ProfilingPlugin: () => require("./debug/ProfilingPlugin") -}); -exportPlugins((exports.util = {}), { - createHash: () => require("./util/createHash") -}); +/** + * @template T + * @param {Array | T} options options + * @returns {Array} array of options + */ +const asArray = options => + Array.isArray(options) ? Array.from(options) : [options]; -const defineMissingPluginError = (namespace, pluginName, errorMessage) => { - Object.defineProperty(namespace, pluginName, { - configurable: false, - enumerable: true, - get() { - throw new RemovedPluginError(errorMessage); +const webpack = /** @type {WebpackFunctionSingle & WebpackFunctionMulti} */ ( + /** + * @param {WebpackOptions | (ReadonlyArray & MultiCompilerOptions)} options options + * @param {Callback & Callback=} callback callback + * @returns {Compiler | MultiCompiler | null} Compiler or MultiCompiler + */ + (options, callback) => { + const create = () => { + if (!asArray(options).every(webpackOptionsSchemaCheck)) { + getValidateSchema()(webpackOptionsSchema, options); + util.deprecate( + () => {}, + "webpack bug: Pre-compiled schema reports error while real schema is happy. This has performance drawbacks.", + "DEP_WEBPACK_PRE_COMPILED_SCHEMA_INVALID" + )(); + } + /** @type {MultiCompiler|Compiler} */ + let compiler; + /** @type {boolean | undefined} */ + let watch = false; + /** @type {WatchOptions|WatchOptions[]} */ + let watchOptions; + if (Array.isArray(options)) { + /** @type {MultiCompiler} */ + compiler = createMultiCompiler( + options, + /** @type {MultiCompilerOptions} */ (options) + ); + watch = options.some(options => options.watch); + watchOptions = options.map(options => options.watchOptions || {}); + } else { + const webpackOptions = /** @type {WebpackOptions} */ (options); + /** @type {Compiler} */ + compiler = createCompiler(webpackOptions); + watch = webpackOptions.watch; + watchOptions = webpackOptions.watchOptions || {}; + } + return { compiler, watch, watchOptions }; + }; + if (callback) { + try { + const { compiler, watch, watchOptions } = create(); + if (watch) { + compiler.watch(watchOptions, callback); + } else { + compiler.run((err, stats) => { + compiler.close(err2 => { + callback( + err || err2, + /** @type {options extends WebpackOptions ? Stats : MultiStats} */ + (stats) + ); + }); + }); + } + return compiler; + } catch (err) { + process.nextTick(() => callback(/** @type {Error} */ (err))); + return null; + } + } else { + const { compiler, watch } = create(); + if (watch) { + util.deprecate( + () => {}, + "A 'callback' argument needs to be provided to the 'webpack(options, callback)' function when the 'watch' option is set. There is no way to handle the 'watch' option without a callback.", + "DEP_WEBPACK_WATCH_WITHOUT_CALLBACK" + )(); + } + return compiler; } - }); -}; - -// TODO remove in webpack 5 -defineMissingPluginError( - exports.optimize, - "UglifyJsPlugin", - "webpack.optimize.UglifyJsPlugin has been removed, please use config.optimization.minimize instead." + } ); -// TODO remove in webpack 5 -defineMissingPluginError( - exports.optimize, - "CommonsChunkPlugin", - "webpack.optimize.CommonsChunkPlugin has been removed, please use config.optimization.splitChunks instead." -); +module.exports = webpack; diff --git a/lib/webpack.web.js b/lib/webpack.web.js deleted file mode 100644 index 1f60eab7f45..00000000000 --- a/lib/webpack.web.js +++ /dev/null @@ -1,31 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -"use strict"; - -const Compiler = require("./Compiler"); -const WebEnvironmentPlugin = require("./web/WebEnvironmentPlugin"); -const WebpackOptionsApply = require("./WebpackOptionsApply"); -const WebpackOptionsDefaulter = require("./WebpackOptionsDefaulter"); - -const webpack = (options, callback) => { - new WebpackOptionsDefaulter().process(options); - - const compiler = new Compiler(); - compiler.options = new WebpackOptionsApply().process(options, compiler); - new WebEnvironmentPlugin( - options.inputFileSystem, - options.outputFileSystem - ).apply(compiler); - if (callback) { - compiler.run(callback); - } - return compiler; -}; -module.exports = webpack; - -webpack.WebpackOptionsDefaulter = WebpackOptionsDefaulter; -webpack.WebpackOptionsApply = WebpackOptionsApply; -webpack.Compiler = Compiler; -webpack.WebEnvironmentPlugin = WebEnvironmentPlugin; diff --git a/lib/webworker/ImportScriptsChunkLoadingPlugin.js b/lib/webworker/ImportScriptsChunkLoadingPlugin.js new file mode 100644 index 00000000000..c26e7f602c8 --- /dev/null +++ b/lib/webworker/ImportScriptsChunkLoadingPlugin.js @@ -0,0 +1,107 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const RuntimeGlobals = require("../RuntimeGlobals"); +const StartupChunkDependenciesPlugin = require("../runtime/StartupChunkDependenciesPlugin"); +const ImportScriptsChunkLoadingRuntimeModule = require("./ImportScriptsChunkLoadingRuntimeModule"); + +/** @typedef {import("../Chunk")} Chunk */ +/** @typedef {import("../Compiler")} Compiler */ + +const PLUGIN_NAME = "ImportScriptsChunkLoadingPlugin"; + +class ImportScriptsChunkLoadingPlugin { + /** + * Apply the plugin + * @param {Compiler} compiler the compiler instance + * @returns {void} + */ + apply(compiler) { + new StartupChunkDependenciesPlugin({ + chunkLoading: "import-scripts", + asyncChunkLoading: true + }).apply(compiler); + compiler.hooks.thisCompilation.tap(PLUGIN_NAME, compilation => { + const globalChunkLoading = compilation.outputOptions.chunkLoading; + /** + * @param {Chunk} chunk chunk + * @returns {boolean} true, if wasm loading is enabled for the chunk + */ + const isEnabledForChunk = chunk => { + const options = chunk.getEntryOptions(); + const chunkLoading = + options && options.chunkLoading !== undefined + ? options.chunkLoading + : globalChunkLoading; + return chunkLoading === "import-scripts"; + }; + const onceForChunkSet = new WeakSet(); + /** + * @param {Chunk} chunk chunk + * @param {Set} set runtime requirements + */ + const handler = (chunk, set) => { + if (onceForChunkSet.has(chunk)) return; + onceForChunkSet.add(chunk); + if (!isEnabledForChunk(chunk)) return; + const withCreateScriptUrl = Boolean( + compilation.outputOptions.trustedTypes + ); + set.add(RuntimeGlobals.moduleFactoriesAddOnly); + set.add(RuntimeGlobals.hasOwnProperty); + if (withCreateScriptUrl) { + set.add(RuntimeGlobals.createScriptUrl); + } + compilation.addRuntimeModule( + chunk, + new ImportScriptsChunkLoadingRuntimeModule(set, withCreateScriptUrl) + ); + }; + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.ensureChunkHandlers) + .tap(PLUGIN_NAME, handler); + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.hmrDownloadUpdateHandlers) + .tap(PLUGIN_NAME, handler); + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.hmrDownloadManifest) + .tap(PLUGIN_NAME, handler); + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.baseURI) + .tap(PLUGIN_NAME, handler); + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.onChunksLoaded) + .tap(PLUGIN_NAME, handler); + + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.ensureChunkHandlers) + .tap(PLUGIN_NAME, (chunk, set) => { + if (!isEnabledForChunk(chunk)) return; + set.add(RuntimeGlobals.publicPath); + set.add(RuntimeGlobals.getChunkScriptFilename); + }); + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.hmrDownloadUpdateHandlers) + .tap(PLUGIN_NAME, (chunk, set) => { + if (!isEnabledForChunk(chunk)) return; + set.add(RuntimeGlobals.publicPath); + set.add(RuntimeGlobals.getChunkUpdateScriptFilename); + set.add(RuntimeGlobals.moduleCache); + set.add(RuntimeGlobals.hmrModuleData); + set.add(RuntimeGlobals.moduleFactoriesAddOnly); + }); + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.hmrDownloadManifest) + .tap(PLUGIN_NAME, (chunk, set) => { + if (!isEnabledForChunk(chunk)) return; + set.add(RuntimeGlobals.publicPath); + set.add(RuntimeGlobals.getUpdateManifestFilename); + }); + }); + } +} +module.exports = ImportScriptsChunkLoadingPlugin; diff --git a/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js b/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js new file mode 100644 index 00000000000..06e1815cb78 --- /dev/null +++ b/lib/webworker/ImportScriptsChunkLoadingRuntimeModule.js @@ -0,0 +1,247 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php +*/ + +"use strict"; + +const RuntimeGlobals = require("../RuntimeGlobals"); +const RuntimeModule = require("../RuntimeModule"); +const Template = require("../Template"); +const { + getChunkFilenameTemplate, + chunkHasJs +} = require("../javascript/JavascriptModulesPlugin"); +const { getInitialChunkIds } = require("../javascript/StartupHelpers"); +const compileBooleanMatcher = require("../util/compileBooleanMatcher"); +const { getUndoPath } = require("../util/identifier"); + +/** @typedef {import("../Chunk")} Chunk */ +/** @typedef {import("../ChunkGraph")} ChunkGraph */ +/** @typedef {import("../Compilation")} Compilation */ +/** @typedef {import("../Module").ReadOnlyRuntimeRequirements} ReadOnlyRuntimeRequirements */ + +class ImportScriptsChunkLoadingRuntimeModule extends RuntimeModule { + /** + * @param {ReadOnlyRuntimeRequirements} runtimeRequirements runtime requirements + * @param {boolean} withCreateScriptUrl with createScriptUrl support + */ + constructor(runtimeRequirements, withCreateScriptUrl) { + super("importScripts chunk loading", RuntimeModule.STAGE_ATTACH); + this.runtimeRequirements = runtimeRequirements; + this._withCreateScriptUrl = withCreateScriptUrl; + } + + /** + * @private + * @param {Chunk} chunk chunk + * @returns {string} generated code + */ + _generateBaseUri(chunk) { + const options = chunk.getEntryOptions(); + if (options && options.baseUri) { + return `${RuntimeGlobals.baseURI} = ${JSON.stringify(options.baseUri)};`; + } + const compilation = /** @type {Compilation} */ (this.compilation); + const outputName = compilation.getPath( + getChunkFilenameTemplate(chunk, compilation.outputOptions), + { + chunk, + contentHashType: "javascript" + } + ); + const rootOutputDir = getUndoPath( + outputName, + /** @type {string} */ (compilation.outputOptions.path), + false + ); + return `${RuntimeGlobals.baseURI} = self.location + ${JSON.stringify( + rootOutputDir ? `/../${rootOutputDir}` : "" + )};`; + } + + /** + * @returns {string | null} runtime code + */ + generate() { + const compilation = /** @type {Compilation} */ (this.compilation); + const fn = RuntimeGlobals.ensureChunkHandlers; + const withBaseURI = this.runtimeRequirements.has(RuntimeGlobals.baseURI); + const withLoading = this.runtimeRequirements.has( + RuntimeGlobals.ensureChunkHandlers + ); + const withCallback = this.runtimeRequirements.has( + RuntimeGlobals.chunkCallback + ); + const withHmr = this.runtimeRequirements.has( + RuntimeGlobals.hmrDownloadUpdateHandlers + ); + const withHmrManifest = this.runtimeRequirements.has( + RuntimeGlobals.hmrDownloadManifest + ); + const globalObject = compilation.runtimeTemplate.globalObject; + const chunkLoadingGlobalExpr = `${globalObject}[${JSON.stringify( + compilation.outputOptions.chunkLoadingGlobal + )}]`; + const chunkGraph = /** @type {ChunkGraph} */ (this.chunkGraph); + const chunk = /** @type {Chunk} */ (this.chunk); + const hasJsMatcher = compileBooleanMatcher( + chunkGraph.getChunkConditionMap(chunk, chunkHasJs) + ); + const initialChunkIds = getInitialChunkIds(chunk, chunkGraph, chunkHasJs); + + const stateExpression = withHmr + ? `${RuntimeGlobals.hmrRuntimeStatePrefix}_importScripts` + : undefined; + const runtimeTemplate = compilation.runtimeTemplate; + const { _withCreateScriptUrl: withCreateScriptUrl } = this; + + return Template.asString([ + withBaseURI ? this._generateBaseUri(chunk) : "// no baseURI", + "", + "// object to store loaded chunks", + '// "1" means "already loaded"', + `var installedChunks = ${ + stateExpression ? `${stateExpression} = ${stateExpression} || ` : "" + }{`, + Template.indent( + Array.from(initialChunkIds, id => `${JSON.stringify(id)}: 1`).join( + ",\n" + ) + ), + "};", + "", + withCallback || withLoading + ? Template.asString([ + "// importScripts chunk loading", + `var installChunk = ${runtimeTemplate.basicFunction("data", [ + runtimeTemplate.destructureArray( + ["chunkIds", "moreModules", "runtime"], + "data" + ), + "for(var moduleId in moreModules) {", + Template.indent([ + `if(${RuntimeGlobals.hasOwnProperty}(moreModules, moduleId)) {`, + Template.indent( + `${RuntimeGlobals.moduleFactories}[moduleId] = moreModules[moduleId];` + ), + "}" + ]), + "}", + `if(runtime) runtime(${RuntimeGlobals.require});`, + "while(chunkIds.length)", + Template.indent("installedChunks[chunkIds.pop()] = 1;"), + "parentChunkLoadingFunction(data);" + ])};` + ]) + : "// no chunk install function needed", + withCallback || withLoading + ? Template.asString([ + withLoading + ? `${fn}.i = ${runtimeTemplate.basicFunction( + "chunkId, promises", + hasJsMatcher !== false + ? [ + '// "1" is the signal for "already loaded"', + "if(!installedChunks[chunkId]) {", + Template.indent([ + hasJsMatcher === true + ? "if(true) { // all chunks have JS" + : `if(${hasJsMatcher("chunkId")}) {`, + Template.indent( + `importScripts(${ + withCreateScriptUrl + ? `${RuntimeGlobals.createScriptUrl}(${RuntimeGlobals.publicPath} + ${RuntimeGlobals.getChunkScriptFilename}(chunkId))` + : `${RuntimeGlobals.publicPath} + ${RuntimeGlobals.getChunkScriptFilename}(chunkId)` + });` + ), + "}" + ]), + "}" + ] + : "installedChunks[chunkId] = 1;" + )};` + : "", + "", + `var chunkLoadingGlobal = ${chunkLoadingGlobalExpr} = ${chunkLoadingGlobalExpr} || [];`, + "var parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);", + "chunkLoadingGlobal.push = installChunk;" + ]) + : "// no chunk loading", + "", + withHmr + ? Template.asString([ + "function loadUpdateChunk(chunkId, updatedModulesList) {", + Template.indent([ + "var success = false;", + `${globalObject}[${JSON.stringify( + compilation.outputOptions.hotUpdateGlobal + )}] = ${runtimeTemplate.basicFunction("_, moreModules, runtime", [ + "for(var moduleId in moreModules) {", + Template.indent([ + `if(${RuntimeGlobals.hasOwnProperty}(moreModules, moduleId)) {`, + Template.indent([ + "currentUpdate[moduleId] = moreModules[moduleId];", + "if(updatedModulesList) updatedModulesList.push(moduleId);" + ]), + "}" + ]), + "}", + "if(runtime) currentUpdateRuntime.push(runtime);", + "success = true;" + ])};`, + "// start update chunk loading", + `importScripts(${ + withCreateScriptUrl + ? `${RuntimeGlobals.createScriptUrl}(${RuntimeGlobals.publicPath} + ${RuntimeGlobals.getChunkUpdateScriptFilename}(chunkId))` + : `${RuntimeGlobals.publicPath} + ${RuntimeGlobals.getChunkUpdateScriptFilename}(chunkId)` + });`, + 'if(!success) throw new Error("Loading update chunk failed for unknown reason");' + ]), + "}", + "", + Template.getFunctionContent( + require("../hmr/JavascriptHotModuleReplacement.runtime.js") + ) + .replace(/\$key\$/g, "importScripts") + .replace(/\$installedChunks\$/g, "installedChunks") + .replace(/\$loadUpdateChunk\$/g, "loadUpdateChunk") + .replace(/\$moduleCache\$/g, RuntimeGlobals.moduleCache) + .replace(/\$moduleFactories\$/g, RuntimeGlobals.moduleFactories) + .replace( + /\$ensureChunkHandlers\$/g, + RuntimeGlobals.ensureChunkHandlers + ) + .replace(/\$hasOwnProperty\$/g, RuntimeGlobals.hasOwnProperty) + .replace(/\$hmrModuleData\$/g, RuntimeGlobals.hmrModuleData) + .replace( + /\$hmrDownloadUpdateHandlers\$/g, + RuntimeGlobals.hmrDownloadUpdateHandlers + ) + .replace( + /\$hmrInvalidateModuleHandlers\$/g, + RuntimeGlobals.hmrInvalidateModuleHandlers + ) + ]) + : "// no HMR", + "", + withHmrManifest + ? Template.asString([ + `${ + RuntimeGlobals.hmrDownloadManifest + } = ${runtimeTemplate.basicFunction("", [ + 'if (typeof fetch === "undefined") throw new Error("No browser support: need fetch API");', + `return fetch(${RuntimeGlobals.publicPath} + ${ + RuntimeGlobals.getUpdateManifestFilename + }()).then(${runtimeTemplate.basicFunction("response", [ + "if(response.status === 404) return; // no update available", + 'if(!response.ok) throw new Error("Failed to fetch update manifest " + response.statusText);', + "return response.json();" + ])});` + ])};` + ]) + : "// no HMR manifest" + ]); + } +} + +module.exports = ImportScriptsChunkLoadingRuntimeModule; diff --git a/lib/webworker/WebWorkerChunkTemplatePlugin.js b/lib/webworker/WebWorkerChunkTemplatePlugin.js deleted file mode 100644 index f44ca26cdf7..00000000000 --- a/lib/webworker/WebWorkerChunkTemplatePlugin.js +++ /dev/null @@ -1,35 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -"use strict"; - -const { ConcatSource } = require("webpack-sources"); - -class WebWorkerChunkTemplatePlugin { - apply(chunkTemplate) { - chunkTemplate.hooks.render.tap( - "WebWorkerChunkTemplatePlugin", - (modules, chunk) => { - const chunkCallbackName = chunkTemplate.outputOptions.chunkCallbackName; - const globalObject = chunkTemplate.outputOptions.globalObject; - const source = new ConcatSource(); - source.add( - `${globalObject}[${JSON.stringify( - chunkCallbackName - )}](${JSON.stringify(chunk.ids)},` - ); - source.add(modules); - source.add(")"); - return source; - } - ); - chunkTemplate.hooks.hash.tap("WebWorkerChunkTemplatePlugin", hash => { - hash.update("webworker"); - hash.update("3"); - hash.update(`${chunkTemplate.outputOptions.chunkCallbackName}`); - hash.update(`${chunkTemplate.outputOptions.globalObject}`); - }); - } -} -module.exports = WebWorkerChunkTemplatePlugin; diff --git a/lib/webworker/WebWorkerHotUpdateChunkTemplatePlugin.js b/lib/webworker/WebWorkerHotUpdateChunkTemplatePlugin.js deleted file mode 100644 index 8b0261194df..00000000000 --- a/lib/webworker/WebWorkerHotUpdateChunkTemplatePlugin.js +++ /dev/null @@ -1,40 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -"use strict"; -const { ConcatSource } = require("webpack-sources"); - -class WebWorkerHotUpdateChunkTemplatePlugin { - apply(hotUpdateChunkTemplate) { - hotUpdateChunkTemplate.hooks.render.tap( - "WebWorkerHotUpdateChunkTemplatePlugin", - (modulesSource, modules, removedModules, hash, id) => { - const hotUpdateFunction = - hotUpdateChunkTemplate.outputOptions.hotUpdateFunction; - const globalObject = hotUpdateChunkTemplate.outputOptions.globalObject; - const source = new ConcatSource(); - source.add( - `${globalObject}[${JSON.stringify( - hotUpdateFunction - )}](${JSON.stringify(id)},` - ); - source.add(modulesSource); - source.add(")"); - return source; - } - ); - hotUpdateChunkTemplate.hooks.hash.tap( - "WebWorkerHotUpdateChunkTemplatePlugin", - hash => { - hash.update("WebWorkerHotUpdateChunkTemplatePlugin"); - hash.update("3"); - hash.update( - hotUpdateChunkTemplate.outputOptions.hotUpdateFunction + "" - ); - hash.update(hotUpdateChunkTemplate.outputOptions.globalObject + ""); - } - ); - } -} -module.exports = WebWorkerHotUpdateChunkTemplatePlugin; diff --git a/lib/webworker/WebWorkerMainTemplate.runtime.js b/lib/webworker/WebWorkerMainTemplate.runtime.js deleted file mode 100644 index 8c63f7729e3..00000000000 --- a/lib/webworker/WebWorkerMainTemplate.runtime.js +++ /dev/null @@ -1,65 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -/*globals installedChunks hotAddUpdateChunk parentHotUpdateCallback importScripts XMLHttpRequest $require$ $hotChunkFilename$ $hotMainFilename$ */ -module.exports = function() { - // eslint-disable-next-line no-unused-vars - function webpackHotUpdateCallback(chunkId, moreModules) { - hotAddUpdateChunk(chunkId, moreModules); - if (parentHotUpdateCallback) parentHotUpdateCallback(chunkId, moreModules); - } //$semicolon - - // eslint-disable-next-line no-unused-vars - function hotDownloadUpdateChunk(chunkId) { - importScripts($require$.p + $hotChunkFilename$); - } - - // eslint-disable-next-line no-unused-vars - function hotDownloadManifest(requestTimeout) { - requestTimeout = requestTimeout || 10000; - return new Promise(function(resolve, reject) { - if (typeof XMLHttpRequest === "undefined") { - return reject(new Error("No browser support")); - } - try { - var request = new XMLHttpRequest(); - var requestPath = $require$.p + $hotMainFilename$; - request.open("GET", requestPath, true); - request.timeout = requestTimeout; - request.send(null); - } catch (err) { - return reject(err); - } - request.onreadystatechange = function() { - if (request.readyState !== 4) return; - if (request.status === 0) { - // timeout - reject( - new Error("Manifest request to " + requestPath + " timed out.") - ); - } else if (request.status === 404) { - // no update available - resolve(); - } else if (request.status !== 200 && request.status !== 304) { - // other failure - reject(new Error("Manifest request to " + requestPath + " failed.")); - } else { - // success - try { - var update = JSON.parse(request.responseText); - } catch (e) { - reject(e); - return; - } - resolve(update); - } - }; - }); - } - - //eslint-disable-next-line no-unused-vars - function hotDisposeChunk(chunkId) { - delete installedChunks[chunkId]; - } -}; diff --git a/lib/webworker/WebWorkerMainTemplatePlugin.js b/lib/webworker/WebWorkerMainTemplatePlugin.js deleted file mode 100644 index 39f7dabbd09..00000000000 --- a/lib/webworker/WebWorkerMainTemplatePlugin.js +++ /dev/null @@ -1,191 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -"use strict"; - -const Template = require("../Template"); - -class WebWorkerMainTemplatePlugin { - apply(mainTemplate) { - const needChunkOnDemandLoadingCode = chunk => { - for (const chunkGroup of chunk.groupsIterable) { - if (chunkGroup.getNumberOfChildren() > 0) return true; - } - return false; - }; - mainTemplate.hooks.localVars.tap( - "WebWorkerMainTemplatePlugin", - (source, chunk) => { - if (needChunkOnDemandLoadingCode(chunk)) { - return Template.asString([ - source, - "", - "// object to store loaded chunks", - '// "1" means "already loaded"', - "var installedChunks = {", - Template.indent( - chunk.ids.map(id => `${JSON.stringify(id)}: 1`).join(",\n") - ), - "};" - ]); - } - return source; - } - ); - mainTemplate.hooks.requireEnsure.tap( - "WebWorkerMainTemplatePlugin", - (_, chunk, hash) => { - const chunkFilename = mainTemplate.outputOptions.chunkFilename; - const chunkMaps = chunk.getChunkMaps(); - return Template.asString([ - "promises.push(Promise.resolve().then(function() {", - Template.indent([ - '// "1" is the signal for "already loaded"', - "if(!installedChunks[chunkId]) {", - Template.indent([ - "importScripts(" + - mainTemplate.getAssetPath(JSON.stringify(chunkFilename), { - hash: `" + ${mainTemplate.renderCurrentHashCode(hash)} + "`, - hashWithLength: length => - `" + ${mainTemplate.renderCurrentHashCode( - hash, - length - )} + "`, - chunk: { - id: '" + chunkId + "', - hash: `" + ${JSON.stringify(chunkMaps.hash)}[chunkId] + "`, - hashWithLength(length) { - const shortChunkHashMap = Object.create(null); - for (const chunkId of Object.keys(chunkMaps.hash)) { - if (typeof chunkMaps.hash[chunkId] === "string") { - shortChunkHashMap[chunkId] = chunkMaps.hash[ - chunkId - ].substr(0, length); - } - } - return `" + ${JSON.stringify( - shortChunkHashMap - )}[chunkId] + "`; - }, - contentHash: { - javascript: `" + ${JSON.stringify( - chunkMaps.contentHash.javascript - )}[chunkId] + "` - }, - contentHashWithLength: { - javascript: length => { - const shortContentHashMap = {}; - const contentHash = chunkMaps.contentHash.javascript; - for (const chunkId of Object.keys(contentHash)) { - if (typeof contentHash[chunkId] === "string") { - shortContentHashMap[chunkId] = contentHash[ - chunkId - ].substr(0, length); - } - } - return `" + ${JSON.stringify( - shortContentHashMap - )}[chunkId] + "`; - } - }, - name: `" + (${JSON.stringify( - chunkMaps.name - )}[chunkId]||chunkId) + "` - }, - contentHashType: "javascript" - }) + - ");" - ]), - "}" - ]), - "}));" - ]); - } - ); - mainTemplate.hooks.bootstrap.tap( - "WebWorkerMainTemplatePlugin", - (source, chunk, hash) => { - if (needChunkOnDemandLoadingCode(chunk)) { - const chunkCallbackName = - mainTemplate.outputOptions.chunkCallbackName; - const globalObject = mainTemplate.outputOptions.globalObject; - return Template.asString([ - source, - `${globalObject}[${JSON.stringify( - chunkCallbackName - )}] = function webpackChunkCallback(chunkIds, moreModules) {`, - Template.indent([ - "for(var moduleId in moreModules) {", - Template.indent( - mainTemplate.renderAddModule( - hash, - chunk, - "moduleId", - "moreModules[moduleId]" - ) - ), - "}", - "while(chunkIds.length)", - Template.indent("installedChunks[chunkIds.pop()] = 1;") - ]), - "};" - ]); - } - return source; - } - ); - mainTemplate.hooks.hotBootstrap.tap( - "WebWorkerMainTemplatePlugin", - (source, chunk, hash) => { - const hotUpdateChunkFilename = - mainTemplate.outputOptions.hotUpdateChunkFilename; - const hotUpdateMainFilename = - mainTemplate.outputOptions.hotUpdateMainFilename; - const hotUpdateFunction = mainTemplate.outputOptions.hotUpdateFunction; - const globalObject = mainTemplate.outputOptions.globalObject; - const currentHotUpdateChunkFilename = mainTemplate.getAssetPath( - JSON.stringify(hotUpdateChunkFilename), - { - hash: `" + ${mainTemplate.renderCurrentHashCode(hash)} + "`, - hashWithLength: length => - `" + ${mainTemplate.renderCurrentHashCode(hash, length)} + "`, - chunk: { - id: '" + chunkId + "' - } - } - ); - const currentHotUpdateMainFilename = mainTemplate.getAssetPath( - JSON.stringify(hotUpdateMainFilename), - { - hash: `" + ${mainTemplate.renderCurrentHashCode(hash)} + "`, - hashWithLength: length => - `" + ${mainTemplate.renderCurrentHashCode(hash, length)} + "` - } - ); - - return ( - source + - "\n" + - `var parentHotUpdateCallback = ${globalObject}[${JSON.stringify( - hotUpdateFunction - )}];\n` + - `${globalObject}[${JSON.stringify(hotUpdateFunction)}] = ` + - Template.getFunctionContent( - require("./WebWorkerMainTemplate.runtime") - ) - .replace(/\/\/\$semicolon/g, ";") - .replace(/\$require\$/g, mainTemplate.requireFn) - .replace(/\$hotMainFilename\$/g, currentHotUpdateMainFilename) - .replace(/\$hotChunkFilename\$/g, currentHotUpdateChunkFilename) - .replace(/\$hash\$/g, JSON.stringify(hash)) - ); - } - ); - mainTemplate.hooks.hash.tap("WebWorkerMainTemplatePlugin", hash => { - hash.update("webworker"); - hash.update("4"); - }); - } -} -module.exports = WebWorkerMainTemplatePlugin; diff --git a/lib/webworker/WebWorkerTemplatePlugin.js b/lib/webworker/WebWorkerTemplatePlugin.js index 5ad89f37a8b..382c81243e8 100644 --- a/lib/webworker/WebWorkerTemplatePlugin.js +++ b/lib/webworker/WebWorkerTemplatePlugin.js @@ -2,24 +2,24 @@ MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ + "use strict"; -const WebWorkerMainTemplatePlugin = require("./WebWorkerMainTemplatePlugin"); -const WebWorkerChunkTemplatePlugin = require("./WebWorkerChunkTemplatePlugin"); -const WebWorkerHotUpdateChunkTemplatePlugin = require("./WebWorkerHotUpdateChunkTemplatePlugin"); +const ArrayPushCallbackChunkFormatPlugin = require("../javascript/ArrayPushCallbackChunkFormatPlugin"); +const EnableChunkLoadingPlugin = require("../javascript/EnableChunkLoadingPlugin"); + +/** @typedef {import("../Compiler")} Compiler */ class WebWorkerTemplatePlugin { + /** + * Apply the plugin + * @param {Compiler} compiler the compiler instance + * @returns {void} + */ apply(compiler) { - compiler.hooks.thisCompilation.tap( - "WebWorkerTemplatePlugin", - compilation => { - new WebWorkerMainTemplatePlugin().apply(compilation.mainTemplate); - new WebWorkerChunkTemplatePlugin().apply(compilation.chunkTemplate); - new WebWorkerHotUpdateChunkTemplatePlugin().apply( - compilation.hotUpdateChunkTemplate - ); - } - ); + compiler.options.output.chunkLoading = "import-scripts"; + new ArrayPushCallbackChunkFormatPlugin().apply(compiler); + new EnableChunkLoadingPlugin("import-scripts").apply(compiler); } } module.exports = WebWorkerTemplatePlugin; diff --git a/module.d.ts b/module.d.ts new file mode 100644 index 00000000000..a175caf3398 --- /dev/null +++ b/module.d.ts @@ -0,0 +1,233 @@ +declare namespace webpack { + type DeclinedEvent = + | { + type: "declined"; + /** The module in question. */ + moduleId: number | string; + /** the chain from where the update was propagated. */ + chain: (number | string)[]; + /** the module id of the declining parent */ + parentId: number | string; + } + | { + type: "self-declined"; + /** The module in question. */ + moduleId: number | string; + /** the chain from where the update was propagated. */ + chain: (number | string)[]; + }; + + type UnacceptedEvent = { + type: "unaccepted"; + /** The module in question. */ + moduleId: number | string; + /** the chain from where the update was propagated. */ + chain: (number | string)[]; + }; + + type AcceptedEvent = { + type: "accepted"; + /** The module in question. */ + moduleId: number | string; + /** the modules that are outdated and will be disposed */ + outdatedModules: (number | string)[]; + /** the accepted dependencies that are outdated */ + outdatedDependencies: { + [id: number]: (number | string)[]; + }; + }; + + type DisposedEvent = { + type: "disposed"; + /** The module in question. */ + moduleId: number | string; + }; + + type ErroredEvent = + | { + type: "accept-error-handler-errored"; + /** The module in question. */ + moduleId: number | string; + /** the module id owning the accept handler. */ + dependencyId: number | string; + /** the thrown error */ + error: Error; + /** the error thrown by the module before the error handler tried to handle it. */ + originalError: Error; + } + | { + type: "self-accept-error-handler-errored"; + /** The module in question. */ + moduleId: number | string; + /** the thrown error */ + error: Error; + /** the error thrown by the module before the error handler tried to handle it. */ + originalError: Error; + } + | { + type: "accept-errored"; + /** The module in question. */ + moduleId: number | string; + /** the module id owning the accept handler. */ + dependencyId: number | string; + /** the thrown error */ + error: Error; + } + | { + type: "self-accept-errored"; + /** The module in question. */ + moduleId: number | string; + /** the thrown error */ + error: Error; + }; + + type HotEvent = + | DeclinedEvent + | UnacceptedEvent + | AcceptedEvent + | DisposedEvent + | ErroredEvent; + + interface ApplyOptions { + ignoreUnaccepted?: boolean; + ignoreDeclined?: boolean; + ignoreErrored?: boolean; + onDeclined?: (event: DeclinedEvent) => void; + onUnaccepted?: (event: UnacceptedEvent) => void; + onAccepted?: (event: AcceptedEvent) => void; + onDisposed?: (event: DisposedEvent) => void; + onErrored?: (event: ErroredEvent) => void; + } + + const enum HotUpdateStatus { + idle = "idle", + check = "check", + prepare = "prepare", + ready = "ready", + dispose = "dispose", + apply = "apply", + abort = "abort", + fail = "fail" + } + + interface Hot { + accept: { + ( + modules: string | string[], + callback?: (outdatedDependencies: string[]) => void, + errorHandler?: ( + err: Error, + context: { moduleId: string | number; dependencyId: string | number } + ) => void + ): void; + ( + errorHandler?: ( + err: Error, + ids: { moduleId: string | number; module: NodeJS.Module } + ) => void + ): void; + }; + status(): HotUpdateStatus; + decline(module?: string | string[]): void; + dispose(callback: (data: object) => void): void; + addDisposeHandler(callback: (data: object) => void): void; + removeDisposeHandler(callback: (data: object) => void): void; + invalidate(): void; + addStatusHandler(callback: (status: HotUpdateStatus) => void): void; + removeStatusHandler(callback: (status: HotUpdateStatus) => void): void; + data: object; + check( + autoApply?: boolean | ApplyOptions + ): Promise<(string | number)[] | null>; + apply(options?: ApplyOptions): Promise<(string | number)[] | null>; + } + + interface ExportInfo { + used: boolean; + provideInfo: boolean | null | undefined; + useInfo: boolean | null | undefined; + canMangle: boolean; + } + + interface ExportsInfo { + [k: string]: ExportInfo & ExportsInfo; + } + + interface Context { + resolve(dependency: string): string | number; + keys(): Array; + id: string | number; + (dependency: string): unknown; + } +} + +interface ImportMeta { + url: string; + webpack: number; + webpackHot: webpack.Hot; + webpackContext: ( + request: string, + options?: { + recursive?: boolean; + regExp?: RegExp; + include?: RegExp; + exclude?: RegExp; + preload?: boolean | number; + prefetch?: boolean | number; + fetchPriority?: "low" | "high" | "auto"; + chunkName?: string; + exports?: string | string[][]; + mode?: "sync" | "eager" | "weak" | "lazy" | "lazy-once"; + } + ) => webpack.Context; +} + +declare const __resourceQuery: string; +declare var __webpack_public_path__: string; +declare var __webpack_nonce__: string; +declare const __webpack_chunkname__: string; +declare var __webpack_base_uri__: string; +declare var __webpack_runtime_id__: string; +declare const __webpack_hash__: string; +declare const __webpack_modules__: Record; +declare const __webpack_require__: (id: string | number) => unknown; +declare var __webpack_chunk_load__: (chunkId: string | number) => Promise; +declare var __webpack_get_script_filename__: ( + chunkId: string | number +) => string; +declare var __webpack_is_included__: (request: string) => boolean; +declare var __webpack_exports_info__: webpack.ExportsInfo; +declare const __webpack_share_scopes__: Record< + string, + Record< + string, + { loaded?: 1; get: () => Promise; from: string; eager: boolean } + > +>; +declare var __webpack_init_sharing__: (scope: string) => Promise; +declare var __non_webpack_require__: (id: any) => unknown; +declare const __system_context__: object; + +declare namespace NodeJS { + interface Module { + hot: webpack.Hot; + } + + interface Require { + ensure( + dependencies: string[], + callback: (require: (module: string) => void) => void, + errorCallback?: (error: Error) => void, + chunkName?: string + ): void; + context( + request: string, + includeSubdirectories?: boolean, + filter?: RegExp, + mode?: "sync" | "eager" | "weak" | "lazy" | "lazy-once" + ): webpack.Context; + include(dependency: string): void; + resolveWeak(dependency: string): void; + onError?: (error: Error) => void; + } +} diff --git a/open-bot.yaml b/open-bot.yaml index a099b9ecd70..34b6acf1d69 100644 --- a/open-bot.yaml +++ b/open-bot.yaml @@ -1,355 +1,5 @@ bot: "webpack-bot" rules: - # Add ci-ok, ci-not-ok labels depending on travis status - # comment to point the user to the results - # comment in case of success - - filters: - open: true - pull_request: - mergeable: true - status_1: - context: "continuous-integration/travis-ci/pr" - status_2: - context: "continuous-integration/appveyor/pr" - ensure_1: - value: "{{status_1.state}}" - equals: "success" - ensure_2: - value: "{{status_2.state}}" - equals: "success" - actions: - label: - add: "PR: CI-ok" - remove: "PR: CI-not-ok" - comment: - identifier: "ci-result" - message: |- - Thank you for your pull request! The most important CI builds succeeded, we’ll review the pull request soon. - - filters: - open: true - pull_request: - mergeable: true - status_1: - context: "continuous-integration/travis-ci/pr" - status_2: - context: "continuous-integration/appveyor/pr" - any: - ensure_1: - value: "{{status_1.state}}" - equals: "failure" - ensure_2: - value: "{{status_2.state}}" - equals: "failure" - not: - any: - ensure_3: - value: "{{status_1.state}}" - equals: "pending" - ensure_4: - value: "{{status_2.state}}" - equals: "pending" - actions: - label: - add: "PR: CI-not-ok" - remove: "PR: CI-ok" - set: - id: report_ci - value: yep - - # Report specific error message if jest for basic tests fails - - filters: - ensure: - value: "{{report_ci}}" - equals: yep - commit: true - status: - context: "continuous-integration/travis-ci/pr" - travis_job: - state: "failed" - allow_failure: false - config: - env: JOB_PART=basic - fetch: travis_job.log - string_cleanup: - id: logResult - value: "{{{fetch}}}" - remove: - - ".\\[2K.\\[1G|.\\[999D.\\[K" - - "^[\\s\\S]+?\\$ yarn travis:\\$JOB_PART.*\n" - - "\\$ node --max-old-space-size=4096.*\n" - - ".+rimraf coverage" - - "yarn run.+\n" - - "\\(node:\\d+\\) (\\[DEP0005\\]|DeprecationWarning).+\n" - - "\\$ yarn (cover|test):.+\n" - - "Ran all test suites.\n[\\s\\S]*" - - "error Command failed with exit code \\d+.\n" - - "info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.\n" - - "Force exiting Jest\n\nHave you considered.+" - - "=============================== Coverage summary ===============================[\\s\\S]+?================================================================================" - - " *PASS *test/.*\n" - - "^\\s+\n|\\s+$" - string_cleanup_1: - id: firstError - value: "{{{logResult}}}" - remove: - - "\n\n( ●| FAIL)[\\s\\S]*" - - "Test Suites:[\\s\\S]*" - - "\\s+$" - string_cleanup_2: - id: remainingErrors - value: "{{{logResult}}}" - remove: - - "^[\\s\\S]+?(?=\n\n( ●| FAIL)|$)" - - "^\n+" - - "Test Suites:[\\s\\S]*" - - "\\s+$" - string_cleanup_3: - id: summary - value: "{{{logResult}}}" - remove: - - "^[\\s\\S]+?(?=Test Suites:)" - - "\\s+$" - actions: - comment: - identifier: "ci-result" - message: |- - The basic integration tests failed. - - @{{commit.author.login}} Please review the following output log for errors: - - ```text - {{{firstError}}} - ``` - {{#if remainingErrors}} -
- Show remaining errors - - ```text - {{{remainingErrors}}} - ``` -
- {{/if}} - - ```text - {{{summary}}} - ``` - - See [complete report here]({{status.target_url}}). - set: - id: report_ci - value: nope - - # Report specific error message if jest for integration tests fails - - filters: - ensure: - value: "{{report_ci}}" - equals: yep - commit: true - status: - context: "continuous-integration/travis-ci/pr" - travis_job: - state: "failed" - allow_failure: false - config: - env: JOB_PART=integration - fetch: travis_job.log - string_cleanup: - id: logResult - value: "{{{fetch}}}" - remove: - - ".\\[2K.\\[1G|.\\[999D.\\[K" - - "^[\\s\\S]+?\\$ yarn travis:\\$JOB_PART.*\n" - - "\\$ node --max-old-space-size=4096.*\n" - - ".+rimraf coverage" - - "yarn run.+\n" - - "\\(node:\\d+\\) (\\[DEP0005\\]|DeprecationWarning).+\n" - - "\\$ yarn (cover|test):.+\n" - - "The command \"yarn travis:\\$JOB_PART\" exited[\\s\\S]*" - - "Ran all test suites.+\n" - - "error Command failed with exit code \\d+.\n" - - "info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.\n" - - "Force exiting Jest\n\nHave you considered.+" - - "=============================== Coverage summary ===============================[\\s\\S]+?================================================================================" - - " *PASS *test/.*\n" - - "^\\s+\n|\\s+$" - string_cleanup_1: - id: firstError - value: "{{{logResult}}}" - remove: - - "\n\n( ●| FAIL)[\\s\\S]*" - - "Test Suites:[\\s\\S]*" - - "\\s+$" - string_cleanup_2: - id: remainingErrors - value: "{{{logResult}}}" - remove: - - "^[\\s\\S]+?(?=\n\n( ●| FAIL)|$)" - - "^\n+" - - "Test Suites:[\\s\\S]*" - - "\\s+$" - string_cleanup_3: - id: summary - value: "{{{logResult}}}" - remove: - - "^[\\s\\S]+?(?=Test Suites:)" - - "\\s+$" - actions: - comment: - identifier: "ci-result" - message: |- - The basic integration tests succeeded, but the full suite failed. - - @{{commit.author.login}} Please review the following output log for errors: - - ```text - {{{firstError}}} - ``` - {{#if remainingErrors}} -
- Show remaining errors - - ```text - {{{remainingErrors}}} - ``` -
- {{/if}} - - ```text - {{{summary}}} - ``` - - See [complete report here]({{status.target_url}}). - set: - id: report_ci - value: nope - - # Report specific error message if jest for unit tests or liniting fails - - filters: - ensure: - value: "{{report_ci}}" - equals: yep - commit: true - status: - context: "continuous-integration/travis-ci/pr" - travis_job: - state: "failed" - allow_failure: false - config: - env: JOB_PART=lint-unit - fetch: travis_job.log - string_cleanup: - id: logResult - value: "{{{fetch}}}" - remove: - - ".\\[2K.\\[1G|.\\[999D.\\[K" - - "^[\\s\\S]+?\\$ yarn travis:\\$JOB_PART.*\n" - - "\\$ node --max-old-space-size=4096.*\n" - - ".+rimraf coverage" - - "yarn run.+\n" - - "\\(node:\\d+\\) (\\[DEP0005\\]|DeprecationWarning).+\n" - - "\\$ yarn (unit|lint).+\n" - - "The command \"yarn travis:\\$JOB_PART\" exited[\\s\\S]*" - - "Ran all test suites.+\n" - - "error Command failed with exit code \\d+.\n" - - "info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.\n" - - "Force exiting Jest\n\nHave you considered.+" - - "=============================== Coverage summary ===============================[\\s\\S]+?================================================================================" - - " *PASS *test/.*\n" - - "^\\s+\n|\\s+$" - actions: - comment: - identifier: "ci-result" - message: |- - The integration tests look fine, but there are code style issues or unit test failures in the Pull Request. - - @{{commit.author.login}} Please review the following output log for errors: - - ``` text - {{{logResult}}} - ``` - - If the unit tests are outdated, you can choose to delete them and add integration tests instead. That would be great. - - See [complete report here]({{status.target_url}}). - set: - id: report_ci - value: nope - - # Report a general error message - - filters: - ensure: - value: "{{report_ci}}" - equals: yep - commit: true - status_1: - context: "continuous-integration/travis-ci/pr" - status_2: - context: "continuous-integration/appveyor/pr" - actions: - comment: - identifier: "ci-result" - message: |- - @{{commit.author.login}} The most important CI builds failed. This way your PR can't be merged. - - Please take a look at the CI results from [travis]({{status_1.target_url}}) ({{status_1.state}}) and [appveyor]({{status_2.target_url}}) ({{status_2.state}}) and fix these issues. - - # Add tests-needed label depending on codecov status - # comment to point the user writing test cases - # comment in case of success - - filters: - open: true - pull_request: - mergeable: true - status: - context: "codecov/patch/integration" - ensure: - value: "{{status.state}}" - equals: "success" - label: "PR: tests-needed" - actions: - label: - remove: "PR: tests-needed" - comment: - identifier: "tests-result" - message: |- - The minimum test ratio has been reached. Thanks! - - filters: - open: true - pull_request: - mergeable: true - status: - context: "codecov/patch/integration" - ensure: - value: "{{status.state}}" - equals: "failure" - actions: - label: - add: "PR: tests-needed" - - filters: - open: true - pull_request: - mergeable: true - status: - context: "codecov/patch/integration" - ensure: - value: "{{status.state}}" - equals: "failure" - age: - value: "{{status.created_at}}" - minimum: 1h - permission: "read|none" - actions: - comment: - identifier: "tests-result" - message: |- - It looks like this Pull Request doesn't include [enough test cases]({{status.target_url}}) (based on Code Coverage analysis of the PR diff). - - A PR need to be covered by tests if you add a new feature (we want to make sure that your feature is working) or if you fix a bug (we want to make sure that we don't run into a regression in future). - - @{{issue.user.login}} Please check if this is appliable to your PR and if you can add more test cases. - - Read the [test readme](https://github.com/webpack/webpack/blob/master/test/README.md) for details how to write test cases. - # add conflict label to pull requests with conflict # on conflict all result labels are removed - filters: @@ -359,10 +9,6 @@ rules: actions: label: add: "PR: conflict" - remove: - - "PR: tests-needed" - - "PR: CI-ok" - - "PR: CI-not-ok" - filters: open: true pull_request: @@ -448,47 +94,77 @@ rules: actions: label: "PR: unreviewed" - # add non-master and next label to pull request to other branch + # add non-main, dev-1, webpack-4 and next label to pull request to other branch + - filters: + pull_request: + base_ref: "^main$" + actions: + label: + remove: + - "PR: next" + - "PR: dev-1" + - "PR: webpack-4" + - "PR: non-main" - filters: pull_request: - base_ref: "^master$" + base_ref: "^dev-1$" actions: label: - remove: "PR: non-master" + add: "PR: dev-1" + remove: + - "PR: next" + - "PR: webpack-4" + - "PR: non-main" - filters: pull_request: base_ref: "^next$" actions: label: add: "PR: next" - remove: "PR: non-master" + remove: + - "PR: dev-1" + - "PR: webpack-4" + - "PR: non-main" + - filters: + pull_request: + base_ref: "^webpack-4$" + actions: + label: + add: "PR: webpack-4" + remove: + - "PR: dev-1" + - "PR: next" + - "PR: non-main" - filters: pull_request: - base_ref: "^(?!master$)(?!next$)" + base_ref: "^(?!main$)(?!webpack-4$)(?!next$)" actions: label: - add: "PR: non-master" - remove: "PR: next" + add: "PR: non-main" + remove: + - "PR: dev-1" + - "PR: next" + - "PR: webpack-4" - # add non-master label to pull request to other branch + # show hint about contributing - filters: open: true age: minimum: 1d maximum: 1w pull_request: - head_ref: "^master$" + head_ref: "^main$" permission: "read|none" actions: comment: - identifier: "head-master" + identifier: "head-main" edit: true message: |- Hi @{{pull_request.user.login}}. Just a little hint from a friendly bot about the best practice when submitting pull requests: - > Don't submit pull request from your own `master` branch. It's recommended to create a feature branch for the PR. + > Don't submit pull request from your own `main` branch. It's recommended to create a feature branch for the PR. *You don't have to change it for this PR, just make sure to follow this hint the next time you submit a PR.* @@ -538,12 +214,12 @@ rules: ensure: value: "{{issue.reactions.[+1]}}" range: "< 10" - last_action_age: 26w # half a year + last_action_age: 13w # three months actions: comment: - identifer: inactive-warning + identifier: inactive-warning message: |- - **This issue had no activity for at least half a year.** + **This issue had no activity for at least three months.** It's subject to automatic issue closing if there is no activity in the next 15 days. label: inactive @@ -551,7 +227,7 @@ rules: open: true label: inactive last_action_age: - maximum: 26w # half a year + maximum: 13w # three months actions: label: remove: @@ -565,7 +241,7 @@ rules: actions: close: true comment: - identifer: inactive-close + identifier: inactive-close message: |- Issue was closed because of inactivity. @@ -585,7 +261,8 @@ rules: message: |- *For maintainers only:* - * [ ] This need to be documented (issue in webpack/webpack.js.org will be filed when merged) + * [ ] This needs to be documented (issue in webpack/webpack.js.org will be filed when merged) + * [ ] This needs to be backported to webpack 4 (issue will be created when merged) # When a pull request need to be documented, create an issue in webpack/webpack.js.org when merged - filters: @@ -617,6 +294,32 @@ rules: message: |- I've created an issue to document this in webpack/webpack.js.org. + # When a pull request need to be backported, create an issue in webpack/webpack when merged + - filters: + pull_request: + merged: true + comment: + author: webpack-bot + matching: "\\* \\[x\\] " + not: + comment_1: + author: webpack-bot + matching: admin-action-webpack-4-backport-executed + actions: + new_issue: + target: webpack/webpack + title: "Backport to webpack 4: {{{pull_request.title}}}" + body: |- + {{{pull_request.html_url}}} needs to be backported to webpack 4. + + Send a PR. + + cc @{{pull_request.user.login}} + comment: + identifier: admin-action-webpack-4-backport-executed + message: |- + I've created an issue to backport this. + # Check open issues and pull requests every day - filters: open: true diff --git a/package.json b/package.json index 16c6b09e090..455ecb628cc 100644 --- a/package.json +++ b/package.json @@ -1,197 +1,198 @@ { "name": "webpack", - "version": "4.29.0", + "version": "5.99.8", "author": "Tobias Koppers @sokra", - "description": "Packs CommonJs/AMD modules for the browser. Allows to split your codebase into multiple bundles, which can be loaded on demand. Support loaders to preprocess files, i.e. json, jsx, es7, css, less, ... and your custom stuff.", + "description": "Packs ECMAScript/CommonJs/AMD modules for the browser. Allows you to split your codebase into multiple bundles, which can be loaded on demand. Supports loaders to preprocess files, i.e. json, jsx, es7, css, less, ... and your custom stuff.", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/wasm-edit": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", - "acorn": "^6.0.5", - "acorn-dynamic-import": "^4.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", - "schema-utils": "^0.4.4", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.2", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } }, "devDependencies": { - "@types/node": "^9.6.4", - "@types/tapable": "^1.0.1", - "@types/webpack-sources": "^0.1.4", - "benchmark": "^2.1.1", - "bundle-loader": "~0.5.0", - "codacy-coverage": "^2.0.1", - "coffee-loader": "^0.9.0", - "coffeescript": "^1.10.0", - "coveralls": "^3.0.2", - "css-loader": "^0.28.3", - "es6-promise-polyfill": "^1.1.1", - "eslint": "^5.8.0", - "eslint-config-prettier": "^3.1.0", - "eslint-plugin-jest": "^21.26.2", - "eslint-plugin-node": "^8.0.0", - "eslint-plugin-prettier": "^3.0.0", - "express": "~4.13.1", - "file-loader": "^1.1.6", - "glob": "^7.1.3", - "husky": "^1.1.3", - "i18n-webpack-plugin": "^1.0.0", + "@babel/core": "^7.27.1", + "@babel/preset-react": "^7.27.1", + "@codspeed/tinybench-plugin": "^4.0.1", + "@eslint/js": "^9.21.0", + "@stylistic/eslint-plugin": "^4.2.0", + "@types/glob-to-regexp": "^0.4.4", + "@types/jest": "^29.5.11", + "@types/mime-types": "^2.1.4", + "@types/node": "^22.15.11", + "@types/xxhashjs": "^0.2.4", + "assemblyscript": "^0.27.34", + "babel-loader": "^10.0.0", + "bundle-loader": "^0.5.6", + "coffee-loader": "^5.0.0", + "coffeescript": "^2.5.1", + "core-js": "^3.6.5", + "cspell": "^9.0.1", + "css-loader": "^7.1.2", + "date-fns": "^4.0.0", + "es5-ext": "^0.10.53", + "es6-promise-polyfill": "^1.2.0", + "eslint": "^9.21.0", + "eslint-config-prettier": "^10.1.1", + "eslint-plugin-jest": "^28.6.0", + "eslint-plugin-jsdoc": "^50.6.3", + "eslint-plugin-n": "^17.16.2", + "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-unicorn": "^59.0.0", + "file-loader": "^6.0.0", + "fork-ts-checker-webpack-plugin": "^9.0.2", + "globals": "^16.0.0", + "hash-wasm": "^4.9.0", + "husky": "^9.0.11", "istanbul": "^0.4.5", - "jade": "^1.11.0", - "jade-loader": "~0.8.0", - "jest": "24.0.0-alpha.1", - "jest-junit": "^5.2.0", + "jest": "^29.7.0", + "jest-circus": "^29.7.0", + "jest-cli": "^29.7.0", + "jest-diff": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-junit": "^16.0.0", "json-loader": "^0.5.7", - "json-schema-to-typescript": "^6.0.1", - "less": "^2.5.1", - "less-loader": "^4.0.3", - "lint-staged": "^8.0.4", - "lodash": "^4.17.4", - "prettier": "^1.14.3", - "pug": "^2.0.3", + "json5": "^2.1.3", + "less": "^4.0.0", + "less-loader": "^12.2.0", + "lint-staged": "^16.0.0", + "lodash": "^4.17.19", + "lodash-es": "^4.17.15", + "memfs": "^4.14.0", + "mini-css-extract-plugin": "^2.9.0", + "mini-svg-data-uri": "^1.2.3", + "node-gyp": "^11.2.0", + "nyc": "^17.1.0", + "open-cli": "^8.0.0", + "prettier": "^3.5.1", + "prettier-2": "npm:prettier@^2", + "pretty-format": "^29.5.0", + "pug": "^3.0.3", "pug-loader": "^2.4.0", - "raw-loader": "~0.5.0", - "react": "^15.2.1", - "react-dom": "^15.2.1", - "rimraf": "^2.6.2", - "script-loader": "~0.7.0", - "simple-git": "^1.65.0", - "style-loader": "^0.19.1", - "typescript": "^3.0.0-rc", - "url-loader": "^0.6.2", - "val-loader": "^1.0.2", - "vm-browserify": "~0.0.0", - "wast-loader": "^1.5.5", - "webpack-dev-middleware": "^1.9.0", - "worker-loader": "^1.1.1", - "xxhashjs": "^0.2.1" + "raw-loader": "^4.0.1", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "rimraf": "^3.0.2", + "script-loader": "^0.7.2", + "simple-git": "^3.27.0", + "strip-ansi": "^6.0.0", + "style-loader": "^4.0.0", + "terser": "^5.38.1", + "three": "^0.176.0", + "tinybench": "^4.0.1", + "toml": "^3.0.0", + "tooling": "webpack/tooling#v1.23.9", + "ts-loader": "^9.5.1", + "typescript": "^5.8.2", + "url-loader": "^4.1.0", + "wast-loader": "^1.12.1", + "webassembly-feature": "1.3.0", + "webpack-cli": "^6.0.1", + "xxhashjs": "^0.2.2", + "yamljs": "^0.3.0", + "yarn-deduplicate": "^6.0.1" }, "engines": { - "node": ">=6.11.5" + "node": ">=10.13.0" }, "repository": { "type": "git", "url": "https://github.com/webpack/webpack.git" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, "homepage": "https://github.com/webpack/webpack", - "main": "lib/webpack.js", - "web": "lib/webpack.web.js", - "bin": "./bin/webpack.js", + "bugs": "https://github.com/webpack/webpack/issues", + "main": "lib/index.js", + "bin": { + "webpack": "bin/webpack.js" + }, + "types": "types.d.ts", "files": [ "lib/", "bin/", - "buildin/", - "declarations/", "hot/", - "web_modules/", "schemas/", - "SECURITY.md" + "SECURITY.md", + "module.d.ts", + "types.d.ts" ], "scripts": { + "prepare": "husky", "setup": "node ./setup/setup.js", - "test": "node --max-old-space-size=4096 --trace-deprecation node_modules/jest-cli/bin/jest", - "test:update-snapshots": "yarn jest -u", - "test:integration": "node --max-old-space-size=4096 --trace-deprecation node_modules/jest-cli/bin/jest --testMatch \"/test/*.test.js\"", - "test:basic": "node --max-old-space-size=4096 --trace-deprecation node_modules/jest-cli/bin/jest --testMatch \"/test/{TestCasesNormal,StatsTestCases,ConfigTestCases}.test.js\"", - "test:unit": "node --max-old-space-size=4096 --trace-deprecation node_modules/jest-cli/bin/jest --testMatch \"/test/*.unittest.js\"", - "travis:integration": "yarn cover:init && yarn cover:integration --ci $JEST", - "travis:basic": "yarn test:basic --ci $JEST", - "travis:lint-unit": "yarn lint && yarn cover:init && yarn cover:unit --ci $JEST", - "travis:benchmark": "yarn benchmark --ci", - "appveyor:integration": "yarn cover:init && yarn cover:integration --ci %JEST%", - "appveyor:unit": "yarn cover:init && yarn cover:unit --ci %JEST%", - "appveyor:benchmark": "yarn benchmark --ci", + "prelint": "yarn setup", + "lint": "yarn lint:code && yarn lint:special && yarn lint:types && yarn lint:types-test && yarn lint:types-module-test && yarn lint:yarn && yarn fmt:check && yarn lint:spellcheck", + "lint:code": "node node_modules/eslint/bin/eslint.js --cache .", + "lint:special": "node node_modules/tooling/lockfile-lint && node node_modules/tooling/schemas-lint && node node_modules/tooling/inherit-types && node node_modules/tooling/format-schemas && node tooling/generate-runtime-code.js && node tooling/generate-wasm-code.js && node node_modules/tooling/format-file-header && node node_modules/tooling/compile-to-definitions && node node_modules/tooling/precompile-schemas && node node_modules/tooling/generate-types --no-template-literals", + "lint:types": "tsc", + "lint:types-test": "tsc -p tsconfig.types.test.json", + "lint:types-module-test": "tsc -p tsconfig.module.test.json", + "lint:yarn": "yarn-deduplicate --fail --list -s highest yarn.lock", + "lint:spellcheck": "cspell --cache --no-must-find-files --quiet \"**/*.*\"", + "report:types": "rimraf coverage && yarn cover:types && yarn cover:report && open-cli coverage/lcov-report/index.html", + "validate:types": "tsc -p tsconfig.validation.json", + "fmt": "yarn fmt:base --log-level warn --write", + "fmt:check": "yarn fmt:base --check", + "fmt:base": "node node_modules/prettier/bin/prettier.cjs --cache --ignore-unknown .", + "fix": "yarn fix:code && fix:yarn && fix:special && yarn fmt", + "fix:code": "yarn lint:code --fix", + "fix:yarn": "yarn-deduplicate -s highest yarn.lock", + "fix:special": "node node_modules/tooling/inherit-types --write && node node_modules/tooling/format-schemas --write && node tooling/generate-runtime-code.js --write && node tooling/generate-wasm-code.js --write && node node_modules/tooling/format-file-header --write && node node_modules/tooling/compile-to-definitions --write && node node_modules/tooling/precompile-schemas --write && node node_modules/tooling/generate-types --no-template-literals --write", "build:examples": "cd examples && node buildAll.js", + "benchmark": "node --max-old-space-size=4096 --experimental-vm-modules --trace-deprecation --hash-seed=1 --random-seed=1 --no-opt --predictable --predictable-gc-schedule --interpreted-frames-native-stack --allow-natives-syntax --expose-gc --no-concurrent-sweeping ./test/BenchmarkTestCases.benchmark.mjs", "pretest": "yarn lint", - "prelint": "yarn setup", - "lint": "yarn code-lint && yarn schema-lint && yarn type-lint && yarn special-lint", - "code-lint": "eslint --cache \"{setup,lib,bin,hot,buildin,benchmark,tooling,schemas}/**/*.js\" \"test/*.js\" \"test/{configCases,watchCases,statsCases,hotCases}/**/webpack.config.js\" \"examples/**/webpack.config.js\"", - "type-lint": "tsc --pretty", - "special-lint": "node tooling/inherit-types && node tooling/format-schemas && node tooling/compile-to-definitions", - "special-lint-fix": "node tooling/inherit-types --write --override && node tooling/format-schemas --write && node tooling/compile-to-definitions --write", - "fix": "yarn code-lint --fix && yarn special-lint-fix", - "pretty": "prettier --loglevel warn --write \"*.{ts,js,json,yml,yaml}\" \"{setup,lib,bin,hot,buildin,benchmark,tooling,schemas}/**/*.{js,json}\" \"test/*.js\" \"test/{configCases,watchCases,statsCases,hotCases}/**/webpack.config.js\" \"examples/**/webpack.config.js\"", - "schema-lint": "node --max-old-space-size=4096 node_modules/jest-cli/bin/jest --testMatch \"/test/*.lint.js\" --no-verbose", - "benchmark": "node --max-old-space-size=4096 --trace-deprecation node_modules/jest-cli/bin/jest --testMatch \"/test/*.benchmark.js\" --runInBand", - "cover": "yarn cover:init && yarn cover:all && yarn cover:report", - "cover:init": "rimraf coverage", - "cover:all": "node --max-old-space-size=4096 node_modules/jest-cli/bin/jest --coverage", - "cover:integration": "node --max-old-space-size=4096 node_modules/jest-cli/bin/jest --testMatch \"/test/*.test.js\" --coverage", - "cover:unit": "node --max-old-space-size=4096 node_modules/jest-cli/bin/jest --testMatch \"/test/*.unittest.js\" --coverage", - "cover:report": "istanbul report" - }, - "husky": { - "hooks": { - "pre-commit": "lint-staged" - } + "test": "node --expose-gc --max-old-space-size=4096 --experimental-vm-modules --trace-deprecation node_modules/jest-cli/bin/jest --logHeapUsage", + "test:update-snapshots": "yarn test -u", + "test:integration": "node --expose-gc --max-old-space-size=4096 --experimental-vm-modules --trace-deprecation node_modules/jest-cli/bin/jest --logHeapUsage --testMatch \"/test/*.{basictest,longtest,test}.js\"", + "test:basic": "node --expose-gc --max-old-space-size=4096 --experimental-vm-modules --trace-deprecation node_modules/jest-cli/bin/jest --logHeapUsage --testMatch \"/test/*.basictest.js\"", + "test:unit": "node --max-old-space-size=4096 --experimental-vm-modules --trace-deprecation node_modules/jest-cli/bin/jest --testMatch \"/test/*.unittest.js\"", + "cover": "yarn cover:all && yarn cover:report", + "cover:clean": "rimraf .nyc_output coverage", + "cover:all": "node --expose-gc --max-old-space-size=4096 --experimental-vm-modules node_modules/jest-cli/bin/jest --logHeapUsage --coverage", + "cover:basic": "node --expose-gc --max-old-space-size=4096 --experimental-vm-modules node_modules/jest-cli/bin/jest --logHeapUsage --testMatch \"/test/*.basictest.js\" --coverage", + "cover:integration": "node --expose-gc --max-old-space-size=4096 --experimental-vm-modules node_modules/jest-cli/bin/jest --logHeapUsage --testMatch \"/test/*.{basictest,longtest,test}.js\" --coverage", + "cover:integration:a": "node --expose-gc --max-old-space-size=4096 --experimental-vm-modules node_modules/jest-cli/bin/jest --logHeapUsage --testMatch \"/test/*.{basictest,test}.js\" --coverage", + "cover:integration:b": "node --expose-gc --max-old-space-size=4096 --experimental-vm-modules node_modules/jest-cli/bin/jest --logHeapUsage --testMatch \"/test/*.longtest.js\" --coverage", + "cover:unit": "node --max-old-space-size=4096 --experimental-vm-modules node_modules/jest-cli/bin/jest --testMatch \"/test/*.unittest.js\" --coverage", + "cover:types": "node node_modules/tooling/type-coverage", + "cover:merge": "yarn mkdirp .nyc_output && nyc merge .nyc_output coverage/coverage-nyc.json && rimraf .nyc_output", + "cover:report": "nyc report --reporter=lcov --reporter=text -t coverage" }, "lint-staged": { - "*.js|{lib,setup,bin,hot,buildin,tooling,schemas}/**/*.js|test/*.js|{test,examples}/**/webpack.config.js}": [ - "eslint --cache" - ] - }, - "jest": { - "forceExit": true, - "setupFilesAfterEnv": [ - "/test/setupTestFramework.js" - ], - "testMatch": [ - "/test/*.test.js", - "/test/*.unittest.js" - ], - "watchPathIgnorePatterns": [ - "/.git", - "/node_modules", - "/test/js", - "/test/browsertest/js", - "/test/fixtures/temp-cache-fixture", - "/test/fixtures/temp-", - "/benchmark", - "/examples/*/dist", - "/coverage", - "/.eslintcache" + "*.{js,cjs,mjs}": [ + "node node_modules/eslint/bin/eslint.js --cache --fix" ], - "modulePathIgnorePatterns": [ - "/.git", - "/node_modules/webpack/node_modules", - "/test/js", - "/test/browsertest/js", - "/test/fixtures/temp-cache-fixture", - "/test/fixtures/temp-", - "/benchmark", - "/examples/*/dist", - "/coverage", - "/.eslintcache" - ], - "transformIgnorePatterns": [ - "" - ], - "coverageDirectory": "/coverage", - "coveragePathIgnorePatterns": [ - "\\.runtime\\.js$", - "/test", - "/schemas", - "/node_modules" - ], - "testEnvironment": "node", - "coverageReporters": [ - "json" + "*": [ + "node node_modules/prettier/bin/prettier.cjs --cache --write --ignore-unknown", + "cspell --cache --no-must-find-files" ] - } + }, + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/schemas/WebpackOptions.check.d.ts b/schemas/WebpackOptions.check.d.ts new file mode 100644 index 00000000000..40908b09268 --- /dev/null +++ b/schemas/WebpackOptions.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: import("../declarations/WebpackOptions").WebpackOptions) => boolean; +export = check; diff --git a/schemas/WebpackOptions.check.js b/schemas/WebpackOptions.check.js new file mode 100644 index 00000000000..e41dc00c8e7 --- /dev/null +++ b/schemas/WebpackOptions.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +const e=/^(?:[A-Za-z]:[\\/]|\\\\|\/)/;module.exports=_e,module.exports.default=_e;const t={definitions:{Amd:{anyOf:[{enum:[!1]},{type:"object"}]},AmdContainer:{type:"string",minLength:1},AssetFilterItemTypes:{anyOf:[{instanceof:"RegExp"},{type:"string",absolutePath:!1},{instanceof:"Function"}]},AssetFilterTypes:{anyOf:[{type:"array",items:{oneOf:[{$ref:"#/definitions/AssetFilterItemTypes"}]}},{$ref:"#/definitions/AssetFilterItemTypes"}]},AssetGeneratorDataUrl:{anyOf:[{$ref:"#/definitions/AssetGeneratorDataUrlOptions"},{$ref:"#/definitions/AssetGeneratorDataUrlFunction"}]},AssetGeneratorDataUrlFunction:{instanceof:"Function"},AssetGeneratorDataUrlOptions:{type:"object",additionalProperties:!1,properties:{encoding:{enum:[!1,"base64"]},mimetype:{type:"string"}}},AssetGeneratorOptions:{type:"object",additionalProperties:!1,properties:{binary:{type:"boolean"},dataUrl:{$ref:"#/definitions/AssetGeneratorDataUrl"},emit:{type:"boolean"},filename:{$ref:"#/definitions/FilenameTemplate"},outputPath:{$ref:"#/definitions/AssetModuleOutputPath"},publicPath:{$ref:"#/definitions/RawPublicPath"}}},AssetInlineGeneratorOptions:{type:"object",additionalProperties:!1,properties:{binary:{type:"boolean"},dataUrl:{$ref:"#/definitions/AssetGeneratorDataUrl"}}},AssetModuleFilename:{anyOf:[{type:"string",absolutePath:!1},{instanceof:"Function"}]},AssetModuleOutputPath:{anyOf:[{type:"string",absolutePath:!1},{instanceof:"Function"}]},AssetParserDataUrlFunction:{instanceof:"Function"},AssetParserDataUrlOptions:{type:"object",additionalProperties:!1,properties:{maxSize:{type:"number"}}},AssetParserOptions:{type:"object",additionalProperties:!1,properties:{dataUrlCondition:{anyOf:[{$ref:"#/definitions/AssetParserDataUrlOptions"},{$ref:"#/definitions/AssetParserDataUrlFunction"}]}}},AssetResourceGeneratorOptions:{type:"object",additionalProperties:!1,properties:{binary:{type:"boolean"},emit:{type:"boolean"},filename:{$ref:"#/definitions/FilenameTemplate"},outputPath:{$ref:"#/definitions/AssetModuleOutputPath"},publicPath:{$ref:"#/definitions/RawPublicPath"}}},AuxiliaryComment:{anyOf:[{type:"string"},{$ref:"#/definitions/LibraryCustomUmdCommentObject"}]},Bail:{type:"boolean"},CacheOptions:{anyOf:[{enum:[!0]},{$ref:"#/definitions/CacheOptionsNormalized"}]},CacheOptionsNormalized:{anyOf:[{enum:[!1]},{$ref:"#/definitions/MemoryCacheOptions"},{$ref:"#/definitions/FileCacheOptions"}]},Charset:{type:"boolean"},ChunkFilename:{oneOf:[{$ref:"#/definitions/FilenameTemplate"}]},ChunkFormat:{anyOf:[{enum:["array-push","commonjs","module",!1]},{type:"string"}]},ChunkLoadTimeout:{type:"number"},ChunkLoading:{anyOf:[{enum:[!1]},{$ref:"#/definitions/ChunkLoadingType"}]},ChunkLoadingGlobal:{type:"string"},ChunkLoadingType:{anyOf:[{enum:["jsonp","import-scripts","require","async-node","import"]},{type:"string"}]},Clean:{anyOf:[{type:"boolean"},{$ref:"#/definitions/CleanOptions"}]},CleanOptions:{type:"object",additionalProperties:!1,properties:{dry:{type:"boolean"},keep:{anyOf:[{instanceof:"RegExp"},{type:"string",absolutePath:!1},{instanceof:"Function"}]}}},CompareBeforeEmit:{type:"boolean"},Context:{type:"string",absolutePath:!0},CrossOriginLoading:{enum:[!1,"anonymous","use-credentials"]},CssAutoGeneratorOptions:{type:"object",additionalProperties:!1,properties:{esModule:{$ref:"#/definitions/CssGeneratorEsModule"},exportsConvention:{$ref:"#/definitions/CssGeneratorExportsConvention"},exportsOnly:{$ref:"#/definitions/CssGeneratorExportsOnly"},localIdentName:{$ref:"#/definitions/CssGeneratorLocalIdentName"}}},CssAutoParserOptions:{type:"object",additionalProperties:!1,properties:{import:{$ref:"#/definitions/CssParserImport"},namedExports:{$ref:"#/definitions/CssParserNamedExports"},url:{$ref:"#/definitions/CssParserUrl"}}},CssChunkFilename:{oneOf:[{$ref:"#/definitions/FilenameTemplate"}]},CssFilename:{oneOf:[{$ref:"#/definitions/FilenameTemplate"}]},CssGeneratorEsModule:{type:"boolean"},CssGeneratorExportsConvention:{anyOf:[{enum:["as-is","camel-case","camel-case-only","dashes","dashes-only"]},{instanceof:"Function"}]},CssGeneratorExportsOnly:{type:"boolean"},CssGeneratorLocalIdentName:{type:"string"},CssGeneratorOptions:{type:"object",additionalProperties:!1,properties:{esModule:{$ref:"#/definitions/CssGeneratorEsModule"},exportsOnly:{$ref:"#/definitions/CssGeneratorExportsOnly"}}},CssGlobalGeneratorOptions:{type:"object",additionalProperties:!1,properties:{esModule:{$ref:"#/definitions/CssGeneratorEsModule"},exportsConvention:{$ref:"#/definitions/CssGeneratorExportsConvention"},exportsOnly:{$ref:"#/definitions/CssGeneratorExportsOnly"},localIdentName:{$ref:"#/definitions/CssGeneratorLocalIdentName"}}},CssGlobalParserOptions:{type:"object",additionalProperties:!1,properties:{import:{$ref:"#/definitions/CssParserImport"},namedExports:{$ref:"#/definitions/CssParserNamedExports"},url:{$ref:"#/definitions/CssParserUrl"}}},CssModuleGeneratorOptions:{type:"object",additionalProperties:!1,properties:{esModule:{$ref:"#/definitions/CssGeneratorEsModule"},exportsConvention:{$ref:"#/definitions/CssGeneratorExportsConvention"},exportsOnly:{$ref:"#/definitions/CssGeneratorExportsOnly"},localIdentName:{$ref:"#/definitions/CssGeneratorLocalIdentName"}}},CssModuleParserOptions:{type:"object",additionalProperties:!1,properties:{import:{$ref:"#/definitions/CssParserImport"},namedExports:{$ref:"#/definitions/CssParserNamedExports"},url:{$ref:"#/definitions/CssParserUrl"}}},CssParserImport:{type:"boolean"},CssParserNamedExports:{type:"boolean"},CssParserOptions:{type:"object",additionalProperties:!1,properties:{import:{$ref:"#/definitions/CssParserImport"},namedExports:{$ref:"#/definitions/CssParserNamedExports"},url:{$ref:"#/definitions/CssParserUrl"}}},CssParserUrl:{type:"boolean"},Dependencies:{type:"array",items:{type:"string"}},DevServer:{anyOf:[{enum:[!1]},{type:"object"}]},DevTool:{anyOf:[{enum:[!1,"eval"]},{type:"string",pattern:"^(inline-|hidden-|eval-)?(nosources-)?(cheap-(module-)?)?source-map(-debugids)?$"}]},DevtoolFallbackModuleFilenameTemplate:{anyOf:[{type:"string"},{instanceof:"Function"}]},DevtoolModuleFilenameTemplate:{anyOf:[{type:"string"},{instanceof:"Function"}]},DevtoolNamespace:{type:"string"},EmptyGeneratorOptions:{type:"object",additionalProperties:!1},EmptyParserOptions:{type:"object",additionalProperties:!1},EnabledChunkLoadingTypes:{type:"array",items:{$ref:"#/definitions/ChunkLoadingType"}},EnabledLibraryTypes:{type:"array",items:{$ref:"#/definitions/LibraryType"}},EnabledWasmLoadingTypes:{type:"array",items:{$ref:"#/definitions/WasmLoadingType"}},Entry:{anyOf:[{$ref:"#/definitions/EntryDynamic"},{$ref:"#/definitions/EntryStatic"}]},EntryDescription:{type:"object",additionalProperties:!1,properties:{asyncChunks:{type:"boolean"},baseUri:{type:"string"},chunkLoading:{$ref:"#/definitions/ChunkLoading"},dependOn:{anyOf:[{type:"array",items:{type:"string",minLength:1},minItems:1,uniqueItems:!0},{type:"string",minLength:1}]},filename:{$ref:"#/definitions/EntryFilename"},import:{$ref:"#/definitions/EntryItem"},layer:{$ref:"#/definitions/Layer"},library:{$ref:"#/definitions/LibraryOptions"},publicPath:{$ref:"#/definitions/PublicPath"},runtime:{$ref:"#/definitions/EntryRuntime"},wasmLoading:{$ref:"#/definitions/WasmLoading"}},required:["import"]},EntryDescriptionNormalized:{type:"object",additionalProperties:!1,properties:{asyncChunks:{type:"boolean"},baseUri:{type:"string"},chunkLoading:{$ref:"#/definitions/ChunkLoading"},dependOn:{type:"array",items:{type:"string",minLength:1},minItems:1,uniqueItems:!0},filename:{$ref:"#/definitions/Filename"},import:{type:"array",items:{type:"string",minLength:1},minItems:1,uniqueItems:!0},layer:{$ref:"#/definitions/Layer"},library:{$ref:"#/definitions/LibraryOptions"},publicPath:{$ref:"#/definitions/PublicPath"},runtime:{$ref:"#/definitions/EntryRuntime"},wasmLoading:{$ref:"#/definitions/WasmLoading"}}},EntryDynamic:{instanceof:"Function"},EntryDynamicNormalized:{instanceof:"Function"},EntryFilename:{oneOf:[{$ref:"#/definitions/FilenameTemplate"}]},EntryItem:{anyOf:[{type:"array",items:{type:"string",minLength:1},minItems:1,uniqueItems:!0},{type:"string",minLength:1}]},EntryNormalized:{anyOf:[{$ref:"#/definitions/EntryDynamicNormalized"},{$ref:"#/definitions/EntryStaticNormalized"}]},EntryObject:{type:"object",additionalProperties:{anyOf:[{$ref:"#/definitions/EntryItem"},{$ref:"#/definitions/EntryDescription"}]}},EntryRuntime:{anyOf:[{enum:[!1]},{type:"string",minLength:1}]},EntryStatic:{anyOf:[{$ref:"#/definitions/EntryObject"},{$ref:"#/definitions/EntryUnnamed"}]},EntryStaticNormalized:{type:"object",additionalProperties:{oneOf:[{$ref:"#/definitions/EntryDescriptionNormalized"}]}},EntryUnnamed:{oneOf:[{$ref:"#/definitions/EntryItem"}]},Environment:{type:"object",additionalProperties:!1,properties:{arrowFunction:{type:"boolean"},asyncFunction:{type:"boolean"},bigIntLiteral:{type:"boolean"},const:{type:"boolean"},destructuring:{type:"boolean"},document:{type:"boolean"},dynamicImport:{type:"boolean"},dynamicImportInWorker:{type:"boolean"},forOf:{type:"boolean"},globalThis:{type:"boolean"},module:{type:"boolean"},nodePrefixForCoreModules:{type:"boolean"},optionalChaining:{type:"boolean"},templateLiteral:{type:"boolean"}}},Experiments:{type:"object",additionalProperties:!1,properties:{asyncWebAssembly:{type:"boolean"},backCompat:{type:"boolean"},buildHttp:{anyOf:[{$ref:"#/definitions/HttpUriAllowedUris"},{$ref:"#/definitions/HttpUriOptions"}]},cacheUnaffected:{type:"boolean"},css:{type:"boolean"},futureDefaults:{type:"boolean"},layers:{type:"boolean"},lazyCompilation:{anyOf:[{type:"boolean"},{$ref:"#/definitions/LazyCompilationOptions"}]},outputModule:{type:"boolean"},syncWebAssembly:{type:"boolean"},topLevelAwait:{type:"boolean"}}},ExperimentsCommon:{type:"object",additionalProperties:!1,properties:{asyncWebAssembly:{type:"boolean"},backCompat:{type:"boolean"},cacheUnaffected:{type:"boolean"},futureDefaults:{type:"boolean"},layers:{type:"boolean"},outputModule:{type:"boolean"},syncWebAssembly:{type:"boolean"},topLevelAwait:{type:"boolean"}}},ExperimentsNormalized:{type:"object",additionalProperties:!1,properties:{asyncWebAssembly:{type:"boolean"},backCompat:{type:"boolean"},buildHttp:{oneOf:[{$ref:"#/definitions/HttpUriOptions"}]},cacheUnaffected:{type:"boolean"},css:{type:"boolean"},futureDefaults:{type:"boolean"},layers:{type:"boolean"},lazyCompilation:{anyOf:[{enum:[!1]},{$ref:"#/definitions/LazyCompilationOptions"}]},outputModule:{type:"boolean"},syncWebAssembly:{type:"boolean"},topLevelAwait:{type:"boolean"}}},Extends:{anyOf:[{type:"array",items:{$ref:"#/definitions/ExtendsItem"}},{$ref:"#/definitions/ExtendsItem"}]},ExtendsItem:{type:"string"},ExternalItem:{anyOf:[{instanceof:"RegExp"},{type:"string"},{type:"object",additionalProperties:{$ref:"#/definitions/ExternalItemValue"},properties:{byLayer:{anyOf:[{type:"object",additionalProperties:{$ref:"#/definitions/ExternalItem"}},{instanceof:"Function"}]}}},{$ref:"#/definitions/ExternalItemFunction"}]},ExternalItemFunction:{anyOf:[{$ref:"#/definitions/ExternalItemFunctionCallback"},{$ref:"#/definitions/ExternalItemFunctionPromise"}]},ExternalItemFunctionCallback:{instanceof:"Function"},ExternalItemFunctionData:{type:"object",additionalProperties:!1,properties:{context:{type:"string"},contextInfo:{type:"object"},dependencyType:{type:"string"},getResolve:{$ref:"#/definitions/ExternalItemFunctionDataGetResolve"},request:{type:"string"}}},ExternalItemFunctionDataGetResolve:{instanceof:"Function"},ExternalItemFunctionDataGetResolveCallbackResult:{instanceof:"Function"},ExternalItemFunctionDataGetResolveResult:{instanceof:"Function"},ExternalItemFunctionPromise:{instanceof:"Function"},ExternalItemValue:{anyOf:[{type:"array",items:{type:"string",minLength:1}},{type:"boolean"},{type:"string"},{type:"object"}]},Externals:{anyOf:[{type:"array",items:{$ref:"#/definitions/ExternalItem"}},{$ref:"#/definitions/ExternalItem"}]},ExternalsPresets:{type:"object",additionalProperties:!1,properties:{electron:{type:"boolean"},electronMain:{type:"boolean"},electronPreload:{type:"boolean"},electronRenderer:{type:"boolean"},node:{type:"boolean"},nwjs:{type:"boolean"},web:{type:"boolean"},webAsync:{type:"boolean"}}},ExternalsType:{enum:["var","module","assign","this","window","self","global","commonjs","commonjs2","commonjs-module","commonjs-static","amd","amd-require","umd","umd2","jsonp","system","promise","import","module-import","script","node-commonjs"]},Falsy:{enum:[!1,0,"",null],undefinedAsNull:!0},FileCacheOptions:{type:"object",additionalProperties:!1,properties:{allowCollectingMemory:{type:"boolean"},buildDependencies:{type:"object",additionalProperties:{type:"array",items:{type:"string",minLength:1}}},cacheDirectory:{type:"string",absolutePath:!0},cacheLocation:{type:"string",absolutePath:!0},compression:{enum:[!1,"gzip","brotli"]},hashAlgorithm:{type:"string"},idleTimeout:{type:"number",minimum:0},idleTimeoutAfterLargeChanges:{type:"number",minimum:0},idleTimeoutForInitialStore:{type:"number",minimum:0},immutablePaths:{type:"array",items:{anyOf:[{instanceof:"RegExp"},{type:"string",absolutePath:!0,minLength:1}]}},managedPaths:{type:"array",items:{anyOf:[{instanceof:"RegExp"},{type:"string",absolutePath:!0,minLength:1}]}},maxAge:{type:"number",minimum:0},maxMemoryGenerations:{type:"number",minimum:0},memoryCacheUnaffected:{type:"boolean"},name:{type:"string"},profile:{type:"boolean"},readonly:{type:"boolean"},store:{enum:["pack"]},type:{enum:["filesystem"]},version:{type:"string"}},required:["type"]},Filename:{oneOf:[{$ref:"#/definitions/FilenameTemplate"}]},FilenameTemplate:{anyOf:[{type:"string",absolutePath:!1,minLength:1},{instanceof:"Function"}]},FilterItemTypes:{anyOf:[{instanceof:"RegExp"},{type:"string",absolutePath:!1},{instanceof:"Function"}]},FilterTypes:{anyOf:[{type:"array",items:{oneOf:[{$ref:"#/definitions/FilterItemTypes"}]}},{$ref:"#/definitions/FilterItemTypes"}]},GeneratorOptionsByModuleType:{type:"object",additionalProperties:{type:"object",additionalProperties:!0},properties:{asset:{$ref:"#/definitions/AssetGeneratorOptions"},"asset/inline":{$ref:"#/definitions/AssetInlineGeneratorOptions"},"asset/resource":{$ref:"#/definitions/AssetResourceGeneratorOptions"},css:{$ref:"#/definitions/CssGeneratorOptions"},"css/auto":{$ref:"#/definitions/CssAutoGeneratorOptions"},"css/global":{$ref:"#/definitions/CssGlobalGeneratorOptions"},"css/module":{$ref:"#/definitions/CssModuleGeneratorOptions"},javascript:{$ref:"#/definitions/EmptyGeneratorOptions"},"javascript/auto":{$ref:"#/definitions/EmptyGeneratorOptions"},"javascript/dynamic":{$ref:"#/definitions/EmptyGeneratorOptions"},"javascript/esm":{$ref:"#/definitions/EmptyGeneratorOptions"},json:{$ref:"#/definitions/JsonGeneratorOptions"}}},GlobalObject:{type:"string",minLength:1},HashDigest:{type:"string"},HashDigestLength:{type:"number",minimum:1},HashFunction:{anyOf:[{type:"string",minLength:1},{instanceof:"Function"}]},HashSalt:{type:"string",minLength:1},HotUpdateChunkFilename:{type:"string",absolutePath:!1},HotUpdateGlobal:{type:"string"},HotUpdateMainFilename:{type:"string",absolutePath:!1},HttpUriAllowedUris:{oneOf:[{$ref:"#/definitions/HttpUriOptionsAllowedUris"}]},HttpUriOptions:{type:"object",additionalProperties:!1,properties:{allowedUris:{$ref:"#/definitions/HttpUriOptionsAllowedUris"},cacheLocation:{anyOf:[{enum:[!1]},{type:"string",absolutePath:!0}]},frozen:{type:"boolean"},lockfileLocation:{type:"string",absolutePath:!0},proxy:{type:"string"},upgrade:{type:"boolean"}},required:["allowedUris"]},HttpUriOptionsAllowedUris:{type:"array",items:{anyOf:[{instanceof:"RegExp"},{type:"string",pattern:"^https?://"},{instanceof:"Function"}]}},IgnoreWarnings:{type:"array",items:{anyOf:[{instanceof:"RegExp"},{type:"object",additionalProperties:!1,properties:{file:{instanceof:"RegExp"},message:{instanceof:"RegExp"},module:{instanceof:"RegExp"}}},{instanceof:"Function"}]}},IgnoreWarningsNormalized:{type:"array",items:{instanceof:"Function"}},Iife:{type:"boolean"},ImportFunctionName:{type:"string"},ImportMetaName:{type:"string"},InfrastructureLogging:{type:"object",additionalProperties:!1,properties:{appendOnly:{type:"boolean"},colors:{type:"boolean"},console:{},debug:{anyOf:[{type:"boolean"},{$ref:"#/definitions/FilterTypes"}]},level:{enum:["none","error","warn","info","log","verbose"]},stream:{}}},JavascriptParserOptions:{type:"object",additionalProperties:!0,properties:{amd:{$ref:"#/definitions/Amd"},browserify:{type:"boolean"},commonjs:{type:"boolean"},commonjsMagicComments:{type:"boolean"},createRequire:{anyOf:[{type:"boolean"},{type:"string"}]},dynamicImportFetchPriority:{enum:["low","high","auto",!1]},dynamicImportMode:{enum:["eager","weak","lazy","lazy-once"]},dynamicImportPrefetch:{anyOf:[{type:"number"},{type:"boolean"}]},dynamicImportPreload:{anyOf:[{type:"number"},{type:"boolean"}]},exportsPresence:{enum:["error","warn","auto",!1]},exprContextCritical:{type:"boolean"},exprContextRecursive:{type:"boolean"},exprContextRegExp:{anyOf:[{instanceof:"RegExp"},{type:"boolean"}]},exprContextRequest:{type:"string"},harmony:{type:"boolean"},import:{type:"boolean"},importExportsPresence:{enum:["error","warn","auto",!1]},importMeta:{type:"boolean"},importMetaContext:{type:"boolean"},node:{$ref:"#/definitions/Node"},overrideStrict:{enum:["strict","non-strict"]},reexportExportsPresence:{enum:["error","warn","auto",!1]},requireContext:{type:"boolean"},requireEnsure:{type:"boolean"},requireInclude:{type:"boolean"},requireJs:{type:"boolean"},strictExportPresence:{type:"boolean"},strictThisContextOnImports:{type:"boolean"},system:{type:"boolean"},unknownContextCritical:{type:"boolean"},unknownContextRecursive:{type:"boolean"},unknownContextRegExp:{anyOf:[{instanceof:"RegExp"},{type:"boolean"}]},unknownContextRequest:{type:"string"},url:{anyOf:[{enum:["relative"]},{type:"boolean"}]},worker:{anyOf:[{type:"array",items:{type:"string",minLength:1}},{type:"boolean"}]},wrappedContextCritical:{type:"boolean"},wrappedContextRecursive:{type:"boolean"},wrappedContextRegExp:{instanceof:"RegExp"}}},JsonGeneratorOptions:{type:"object",additionalProperties:!1,properties:{JSONParse:{type:"boolean"}}},JsonParserOptions:{type:"object",additionalProperties:!1,properties:{exportsDepth:{type:"number"},parse:{instanceof:"Function"}}},Layer:{anyOf:[{enum:[null]},{type:"string",minLength:1}]},LazyCompilationDefaultBackendOptions:{type:"object",additionalProperties:!1,properties:{client:{type:"string"},listen:{anyOf:[{type:"number"},{type:"object",additionalProperties:!0,properties:{host:{type:"string"},port:{type:"number"}}},{instanceof:"Function"}]},protocol:{enum:["http","https"]},server:{anyOf:[{type:"object",additionalProperties:!0,properties:{}},{instanceof:"Function"}]}}},LazyCompilationOptions:{type:"object",additionalProperties:!1,properties:{backend:{anyOf:[{instanceof:"Function"},{$ref:"#/definitions/LazyCompilationDefaultBackendOptions"}]},entries:{type:"boolean"},imports:{type:"boolean"},test:{anyOf:[{instanceof:"RegExp"},{type:"string"},{instanceof:"Function"}]}}},Library:{anyOf:[{$ref:"#/definitions/LibraryName"},{$ref:"#/definitions/LibraryOptions"}]},LibraryCustomUmdCommentObject:{type:"object",additionalProperties:!1,properties:{amd:{type:"string"},commonjs:{type:"string"},commonjs2:{type:"string"},root:{type:"string"}}},LibraryCustomUmdObject:{type:"object",additionalProperties:!1,properties:{amd:{type:"string",minLength:1},commonjs:{type:"string",minLength:1},root:{anyOf:[{type:"array",items:{type:"string",minLength:1}},{type:"string",minLength:1}]}}},LibraryExport:{anyOf:[{type:"array",items:{type:"string",minLength:1}},{type:"string",minLength:1}]},LibraryName:{anyOf:[{type:"array",items:{type:"string",minLength:1},minItems:1},{type:"string",minLength:1},{$ref:"#/definitions/LibraryCustomUmdObject"}]},LibraryOptions:{type:"object",additionalProperties:!1,properties:{amdContainer:{$ref:"#/definitions/AmdContainer"},auxiliaryComment:{$ref:"#/definitions/AuxiliaryComment"},export:{$ref:"#/definitions/LibraryExport"},name:{$ref:"#/definitions/LibraryName"},type:{$ref:"#/definitions/LibraryType"},umdNamedDefine:{$ref:"#/definitions/UmdNamedDefine"}},required:["type"]},LibraryType:{anyOf:[{enum:["var","module","assign","assign-properties","this","window","self","global","commonjs","commonjs2","commonjs-module","commonjs-static","amd","amd-require","umd","umd2","jsonp","system"]},{type:"string"}]},Loader:{type:"object"},MemoryCacheOptions:{type:"object",additionalProperties:!1,properties:{cacheUnaffected:{type:"boolean"},maxGenerations:{type:"number",minimum:1},type:{enum:["memory"]}},required:["type"]},Mode:{enum:["development","production","none"]},ModuleFilterItemTypes:{anyOf:[{instanceof:"RegExp"},{type:"string",absolutePath:!1},{instanceof:"Function"}]},ModuleFilterTypes:{anyOf:[{type:"array",items:{oneOf:[{$ref:"#/definitions/ModuleFilterItemTypes"}]}},{$ref:"#/definitions/ModuleFilterItemTypes"}]},ModuleOptions:{type:"object",additionalProperties:!1,properties:{defaultRules:{oneOf:[{$ref:"#/definitions/RuleSetRules"}]},exprContextCritical:{type:"boolean"},exprContextRecursive:{type:"boolean"},exprContextRegExp:{anyOf:[{instanceof:"RegExp"},{type:"boolean"}]},exprContextRequest:{type:"string"},generator:{$ref:"#/definitions/GeneratorOptionsByModuleType"},noParse:{$ref:"#/definitions/NoParse"},parser:{$ref:"#/definitions/ParserOptionsByModuleType"},rules:{oneOf:[{$ref:"#/definitions/RuleSetRules"}]},strictExportPresence:{type:"boolean"},strictThisContextOnImports:{type:"boolean"},unknownContextCritical:{type:"boolean"},unknownContextRecursive:{type:"boolean"},unknownContextRegExp:{anyOf:[{instanceof:"RegExp"},{type:"boolean"}]},unknownContextRequest:{type:"string"},unsafeCache:{anyOf:[{type:"boolean"},{instanceof:"Function"}]},wrappedContextCritical:{type:"boolean"},wrappedContextRecursive:{type:"boolean"},wrappedContextRegExp:{instanceof:"RegExp"}}},ModuleOptionsNormalized:{type:"object",additionalProperties:!1,properties:{defaultRules:{oneOf:[{$ref:"#/definitions/RuleSetRules"}]},generator:{$ref:"#/definitions/GeneratorOptionsByModuleType"},noParse:{$ref:"#/definitions/NoParse"},parser:{$ref:"#/definitions/ParserOptionsByModuleType"},rules:{oneOf:[{$ref:"#/definitions/RuleSetRules"}]},unsafeCache:{anyOf:[{type:"boolean"},{instanceof:"Function"}]}},required:["defaultRules","generator","parser","rules"]},Name:{type:"string"},NoParse:{anyOf:[{type:"array",items:{anyOf:[{instanceof:"RegExp"},{type:"string",absolutePath:!0},{instanceof:"Function"}]},minItems:1},{instanceof:"RegExp"},{type:"string",absolutePath:!0},{instanceof:"Function"}]},Node:{anyOf:[{enum:[!1]},{$ref:"#/definitions/NodeOptions"}]},NodeOptions:{type:"object",additionalProperties:!1,properties:{__dirname:{enum:[!1,!0,"warn-mock","mock","node-module","eval-only"]},__filename:{enum:[!1,!0,"warn-mock","mock","node-module","eval-only"]},global:{enum:[!1,!0,"warn"]}}},Optimization:{type:"object",additionalProperties:!1,properties:{avoidEntryIife:{type:"boolean"},checkWasmTypes:{type:"boolean"},chunkIds:{enum:["natural","named","deterministic","size","total-size",!1]},concatenateModules:{type:"boolean"},emitOnErrors:{type:"boolean"},flagIncludedChunks:{type:"boolean"},innerGraph:{type:"boolean"},mangleExports:{anyOf:[{enum:["size","deterministic"]},{type:"boolean"}]},mangleWasmImports:{type:"boolean"},mergeDuplicateChunks:{type:"boolean"},minimize:{type:"boolean"},minimizer:{type:"array",items:{anyOf:[{enum:["..."]},{$ref:"#/definitions/Falsy"},{$ref:"#/definitions/WebpackPluginInstance"},{$ref:"#/definitions/WebpackPluginFunction"}]}},moduleIds:{enum:["natural","named","hashed","deterministic","size",!1]},noEmitOnErrors:{type:"boolean"},nodeEnv:{anyOf:[{enum:[!1]},{type:"string"}]},portableRecords:{type:"boolean"},providedExports:{type:"boolean"},realContentHash:{type:"boolean"},removeAvailableModules:{type:"boolean"},removeEmptyChunks:{type:"boolean"},runtimeChunk:{$ref:"#/definitions/OptimizationRuntimeChunk"},sideEffects:{anyOf:[{enum:["flag"]},{type:"boolean"}]},splitChunks:{anyOf:[{enum:[!1]},{$ref:"#/definitions/OptimizationSplitChunksOptions"}]},usedExports:{anyOf:[{enum:["global"]},{type:"boolean"}]}}},OptimizationNormalized:{type:"object",additionalProperties:!1,properties:{avoidEntryIife:{type:"boolean"},checkWasmTypes:{type:"boolean"},chunkIds:{enum:["natural","named","deterministic","size","total-size",!1]},concatenateModules:{type:"boolean"},emitOnErrors:{type:"boolean"},flagIncludedChunks:{type:"boolean"},innerGraph:{type:"boolean"},mangleExports:{anyOf:[{enum:["size","deterministic"]},{type:"boolean"}]},mangleWasmImports:{type:"boolean"},mergeDuplicateChunks:{type:"boolean"},minimize:{type:"boolean"},minimizer:{type:"array",items:{anyOf:[{enum:["..."]},{$ref:"#/definitions/Falsy"},{$ref:"#/definitions/WebpackPluginInstance"},{$ref:"#/definitions/WebpackPluginFunction"}]}},moduleIds:{enum:["natural","named","hashed","deterministic","size",!1]},noEmitOnErrors:{type:"boolean"},nodeEnv:{anyOf:[{enum:[!1]},{type:"string"}]},portableRecords:{type:"boolean"},providedExports:{type:"boolean"},realContentHash:{type:"boolean"},removeAvailableModules:{type:"boolean"},removeEmptyChunks:{type:"boolean"},runtimeChunk:{$ref:"#/definitions/OptimizationRuntimeChunkNormalized"},sideEffects:{anyOf:[{enum:["flag"]},{type:"boolean"}]},splitChunks:{anyOf:[{enum:[!1]},{$ref:"#/definitions/OptimizationSplitChunksOptions"}]},usedExports:{anyOf:[{enum:["global"]},{type:"boolean"}]}}},OptimizationRuntimeChunk:{anyOf:[{enum:["single","multiple"]},{type:"boolean"},{type:"object",additionalProperties:!1,properties:{name:{anyOf:[{type:"string"},{instanceof:"Function"}]}}}]},OptimizationRuntimeChunkNormalized:{anyOf:[{enum:[!1]},{type:"object",additionalProperties:!1,properties:{name:{instanceof:"Function"}}}]},OptimizationSplitChunksCacheGroup:{type:"object",additionalProperties:!1,properties:{automaticNameDelimiter:{type:"string",minLength:1},chunks:{anyOf:[{enum:["initial","async","all"]},{instanceof:"RegExp"},{instanceof:"Function"}]},enforce:{type:"boolean"},enforceSizeThreshold:{oneOf:[{$ref:"#/definitions/OptimizationSplitChunksSizes"}]},filename:{anyOf:[{type:"string",absolutePath:!1,minLength:1},{instanceof:"Function"}]},idHint:{type:"string"},layer:{anyOf:[{instanceof:"RegExp"},{type:"string"},{instanceof:"Function"}]},maxAsyncRequests:{type:"number",minimum:1},maxAsyncSize:{oneOf:[{$ref:"#/definitions/OptimizationSplitChunksSizes"}]},maxInitialRequests:{type:"number",minimum:1},maxInitialSize:{oneOf:[{$ref:"#/definitions/OptimizationSplitChunksSizes"}]},maxSize:{oneOf:[{$ref:"#/definitions/OptimizationSplitChunksSizes"}]},minChunks:{type:"number",minimum:1},minRemainingSize:{oneOf:[{$ref:"#/definitions/OptimizationSplitChunksSizes"}]},minSize:{oneOf:[{$ref:"#/definitions/OptimizationSplitChunksSizes"}]},minSizeReduction:{oneOf:[{$ref:"#/definitions/OptimizationSplitChunksSizes"}]},name:{anyOf:[{enum:[!1]},{type:"string"},{instanceof:"Function"}]},priority:{type:"number"},reuseExistingChunk:{type:"boolean"},test:{anyOf:[{instanceof:"RegExp"},{type:"string"},{instanceof:"Function"}]},type:{anyOf:[{instanceof:"RegExp"},{type:"string"},{instanceof:"Function"}]},usedExports:{type:"boolean"}}},OptimizationSplitChunksGetCacheGroups:{instanceof:"Function"},OptimizationSplitChunksOptions:{type:"object",additionalProperties:!1,properties:{automaticNameDelimiter:{type:"string",minLength:1},cacheGroups:{type:"object",additionalProperties:{anyOf:[{enum:[!1]},{instanceof:"RegExp"},{type:"string"},{$ref:"#/definitions/OptimizationSplitChunksGetCacheGroups"},{$ref:"#/definitions/OptimizationSplitChunksCacheGroup"}]},not:{type:"object",additionalProperties:!0,properties:{test:{anyOf:[{instanceof:"RegExp"},{type:"string"},{$ref:"#/definitions/OptimizationSplitChunksGetCacheGroups"}]}},required:["test"]}},chunks:{anyOf:[{enum:["initial","async","all"]},{instanceof:"RegExp"},{instanceof:"Function"}]},defaultSizeTypes:{type:"array",items:{type:"string"},minItems:1},enforceSizeThreshold:{oneOf:[{$ref:"#/definitions/OptimizationSplitChunksSizes"}]},fallbackCacheGroup:{type:"object",additionalProperties:!1,properties:{automaticNameDelimiter:{type:"string",minLength:1},chunks:{anyOf:[{enum:["initial","async","all"]},{instanceof:"RegExp"},{instanceof:"Function"}]},maxAsyncSize:{oneOf:[{$ref:"#/definitions/OptimizationSplitChunksSizes"}]},maxInitialSize:{oneOf:[{$ref:"#/definitions/OptimizationSplitChunksSizes"}]},maxSize:{oneOf:[{$ref:"#/definitions/OptimizationSplitChunksSizes"}]},minSize:{oneOf:[{$ref:"#/definitions/OptimizationSplitChunksSizes"}]},minSizeReduction:{oneOf:[{$ref:"#/definitions/OptimizationSplitChunksSizes"}]}}},filename:{anyOf:[{type:"string",absolutePath:!1,minLength:1},{instanceof:"Function"}]},hidePathInfo:{type:"boolean"},maxAsyncRequests:{type:"number",minimum:1},maxAsyncSize:{oneOf:[{$ref:"#/definitions/OptimizationSplitChunksSizes"}]},maxInitialRequests:{type:"number",minimum:1},maxInitialSize:{oneOf:[{$ref:"#/definitions/OptimizationSplitChunksSizes"}]},maxSize:{oneOf:[{$ref:"#/definitions/OptimizationSplitChunksSizes"}]},minChunks:{type:"number",minimum:1},minRemainingSize:{oneOf:[{$ref:"#/definitions/OptimizationSplitChunksSizes"}]},minSize:{oneOf:[{$ref:"#/definitions/OptimizationSplitChunksSizes"}]},minSizeReduction:{oneOf:[{$ref:"#/definitions/OptimizationSplitChunksSizes"}]},name:{anyOf:[{enum:[!1]},{type:"string"},{instanceof:"Function"}]},usedExports:{type:"boolean"}}},OptimizationSplitChunksSizes:{anyOf:[{type:"number",minimum:0},{type:"object",additionalProperties:{type:"number"}}]},Output:{type:"object",additionalProperties:!1,properties:{amdContainer:{oneOf:[{$ref:"#/definitions/AmdContainer"}]},assetModuleFilename:{$ref:"#/definitions/AssetModuleFilename"},asyncChunks:{type:"boolean"},auxiliaryComment:{oneOf:[{$ref:"#/definitions/AuxiliaryComment"}]},charset:{$ref:"#/definitions/Charset"},chunkFilename:{$ref:"#/definitions/ChunkFilename"},chunkFormat:{$ref:"#/definitions/ChunkFormat"},chunkLoadTimeout:{$ref:"#/definitions/ChunkLoadTimeout"},chunkLoading:{$ref:"#/definitions/ChunkLoading"},chunkLoadingGlobal:{$ref:"#/definitions/ChunkLoadingGlobal"},clean:{$ref:"#/definitions/Clean"},compareBeforeEmit:{$ref:"#/definitions/CompareBeforeEmit"},crossOriginLoading:{$ref:"#/definitions/CrossOriginLoading"},cssChunkFilename:{$ref:"#/definitions/CssChunkFilename"},cssFilename:{$ref:"#/definitions/CssFilename"},devtoolFallbackModuleFilenameTemplate:{$ref:"#/definitions/DevtoolFallbackModuleFilenameTemplate"},devtoolModuleFilenameTemplate:{$ref:"#/definitions/DevtoolModuleFilenameTemplate"},devtoolNamespace:{$ref:"#/definitions/DevtoolNamespace"},enabledChunkLoadingTypes:{$ref:"#/definitions/EnabledChunkLoadingTypes"},enabledLibraryTypes:{$ref:"#/definitions/EnabledLibraryTypes"},enabledWasmLoadingTypes:{$ref:"#/definitions/EnabledWasmLoadingTypes"},environment:{$ref:"#/definitions/Environment"},filename:{$ref:"#/definitions/Filename"},globalObject:{$ref:"#/definitions/GlobalObject"},hashDigest:{$ref:"#/definitions/HashDigest"},hashDigestLength:{$ref:"#/definitions/HashDigestLength"},hashFunction:{$ref:"#/definitions/HashFunction"},hashSalt:{$ref:"#/definitions/HashSalt"},hotUpdateChunkFilename:{$ref:"#/definitions/HotUpdateChunkFilename"},hotUpdateGlobal:{$ref:"#/definitions/HotUpdateGlobal"},hotUpdateMainFilename:{$ref:"#/definitions/HotUpdateMainFilename"},ignoreBrowserWarnings:{type:"boolean"},iife:{$ref:"#/definitions/Iife"},importFunctionName:{$ref:"#/definitions/ImportFunctionName"},importMetaName:{$ref:"#/definitions/ImportMetaName"},library:{$ref:"#/definitions/Library"},libraryExport:{oneOf:[{$ref:"#/definitions/LibraryExport"}]},libraryTarget:{oneOf:[{$ref:"#/definitions/LibraryType"}]},module:{$ref:"#/definitions/OutputModule"},path:{$ref:"#/definitions/Path"},pathinfo:{$ref:"#/definitions/Pathinfo"},publicPath:{$ref:"#/definitions/PublicPath"},scriptType:{$ref:"#/definitions/ScriptType"},sourceMapFilename:{$ref:"#/definitions/SourceMapFilename"},sourcePrefix:{$ref:"#/definitions/SourcePrefix"},strictModuleErrorHandling:{$ref:"#/definitions/StrictModuleErrorHandling"},strictModuleExceptionHandling:{$ref:"#/definitions/StrictModuleExceptionHandling"},trustedTypes:{anyOf:[{enum:[!0]},{type:"string",minLength:1},{$ref:"#/definitions/TrustedTypes"}]},umdNamedDefine:{oneOf:[{$ref:"#/definitions/UmdNamedDefine"}]},uniqueName:{$ref:"#/definitions/UniqueName"},wasmLoading:{$ref:"#/definitions/WasmLoading"},webassemblyModuleFilename:{$ref:"#/definitions/WebassemblyModuleFilename"},workerChunkLoading:{$ref:"#/definitions/ChunkLoading"},workerPublicPath:{$ref:"#/definitions/WorkerPublicPath"},workerWasmLoading:{$ref:"#/definitions/WasmLoading"}}},OutputModule:{type:"boolean"},OutputNormalized:{type:"object",additionalProperties:!1,properties:{assetModuleFilename:{$ref:"#/definitions/AssetModuleFilename"},asyncChunks:{type:"boolean"},charset:{$ref:"#/definitions/Charset"},chunkFilename:{$ref:"#/definitions/ChunkFilename"},chunkFormat:{$ref:"#/definitions/ChunkFormat"},chunkLoadTimeout:{$ref:"#/definitions/ChunkLoadTimeout"},chunkLoading:{$ref:"#/definitions/ChunkLoading"},chunkLoadingGlobal:{$ref:"#/definitions/ChunkLoadingGlobal"},clean:{$ref:"#/definitions/Clean"},compareBeforeEmit:{$ref:"#/definitions/CompareBeforeEmit"},crossOriginLoading:{$ref:"#/definitions/CrossOriginLoading"},cssChunkFilename:{$ref:"#/definitions/CssChunkFilename"},cssFilename:{$ref:"#/definitions/CssFilename"},devtoolFallbackModuleFilenameTemplate:{$ref:"#/definitions/DevtoolFallbackModuleFilenameTemplate"},devtoolModuleFilenameTemplate:{$ref:"#/definitions/DevtoolModuleFilenameTemplate"},devtoolNamespace:{$ref:"#/definitions/DevtoolNamespace"},enabledChunkLoadingTypes:{$ref:"#/definitions/EnabledChunkLoadingTypes"},enabledLibraryTypes:{$ref:"#/definitions/EnabledLibraryTypes"},enabledWasmLoadingTypes:{$ref:"#/definitions/EnabledWasmLoadingTypes"},environment:{$ref:"#/definitions/Environment"},filename:{$ref:"#/definitions/Filename"},globalObject:{$ref:"#/definitions/GlobalObject"},hashDigest:{$ref:"#/definitions/HashDigest"},hashDigestLength:{$ref:"#/definitions/HashDigestLength"},hashFunction:{$ref:"#/definitions/HashFunction"},hashSalt:{$ref:"#/definitions/HashSalt"},hotUpdateChunkFilename:{$ref:"#/definitions/HotUpdateChunkFilename"},hotUpdateGlobal:{$ref:"#/definitions/HotUpdateGlobal"},hotUpdateMainFilename:{$ref:"#/definitions/HotUpdateMainFilename"},ignoreBrowserWarnings:{type:"boolean"},iife:{$ref:"#/definitions/Iife"},importFunctionName:{$ref:"#/definitions/ImportFunctionName"},importMetaName:{$ref:"#/definitions/ImportMetaName"},library:{$ref:"#/definitions/LibraryOptions"},module:{$ref:"#/definitions/OutputModule"},path:{$ref:"#/definitions/Path"},pathinfo:{$ref:"#/definitions/Pathinfo"},publicPath:{$ref:"#/definitions/PublicPath"},scriptType:{$ref:"#/definitions/ScriptType"},sourceMapFilename:{$ref:"#/definitions/SourceMapFilename"},sourcePrefix:{$ref:"#/definitions/SourcePrefix"},strictModuleErrorHandling:{$ref:"#/definitions/StrictModuleErrorHandling"},strictModuleExceptionHandling:{$ref:"#/definitions/StrictModuleExceptionHandling"},trustedTypes:{$ref:"#/definitions/TrustedTypes"},uniqueName:{$ref:"#/definitions/UniqueName"},wasmLoading:{$ref:"#/definitions/WasmLoading"},webassemblyModuleFilename:{$ref:"#/definitions/WebassemblyModuleFilename"},workerChunkLoading:{$ref:"#/definitions/ChunkLoading"},workerPublicPath:{$ref:"#/definitions/WorkerPublicPath"},workerWasmLoading:{$ref:"#/definitions/WasmLoading"}},required:["environment","enabledChunkLoadingTypes","enabledLibraryTypes","enabledWasmLoadingTypes"]},Parallelism:{type:"number",minimum:1},ParserOptionsByModuleType:{type:"object",additionalProperties:{type:"object",additionalProperties:!0},properties:{asset:{$ref:"#/definitions/AssetParserOptions"},"asset/inline":{$ref:"#/definitions/EmptyParserOptions"},"asset/resource":{$ref:"#/definitions/EmptyParserOptions"},"asset/source":{$ref:"#/definitions/EmptyParserOptions"},css:{$ref:"#/definitions/CssParserOptions"},"css/auto":{$ref:"#/definitions/CssAutoParserOptions"},"css/global":{$ref:"#/definitions/CssGlobalParserOptions"},"css/module":{$ref:"#/definitions/CssModuleParserOptions"},javascript:{$ref:"#/definitions/JavascriptParserOptions"},"javascript/auto":{$ref:"#/definitions/JavascriptParserOptions"},"javascript/dynamic":{$ref:"#/definitions/JavascriptParserOptions"},"javascript/esm":{$ref:"#/definitions/JavascriptParserOptions"},json:{$ref:"#/definitions/JsonParserOptions"}}},Path:{type:"string",absolutePath:!0},Pathinfo:{anyOf:[{enum:["verbose"]},{type:"boolean"}]},Performance:{anyOf:[{enum:[!1]},{$ref:"#/definitions/PerformanceOptions"}]},PerformanceOptions:{type:"object",additionalProperties:!1,properties:{assetFilter:{instanceof:"Function"},hints:{enum:[!1,"warning","error"]},maxAssetSize:{type:"number"},maxEntrypointSize:{type:"number"}}},Plugins:{type:"array",items:{anyOf:[{$ref:"#/definitions/Falsy"},{$ref:"#/definitions/WebpackPluginInstance"},{$ref:"#/definitions/WebpackPluginFunction"}]}},Profile:{type:"boolean"},PublicPath:{anyOf:[{enum:["auto"]},{$ref:"#/definitions/RawPublicPath"}]},RawPublicPath:{anyOf:[{type:"string"},{instanceof:"Function"}]},RecordsInputPath:{anyOf:[{enum:[!1]},{type:"string",absolutePath:!0}]},RecordsOutputPath:{anyOf:[{enum:[!1]},{type:"string",absolutePath:!0}]},RecordsPath:{anyOf:[{enum:[!1]},{type:"string",absolutePath:!0}]},Resolve:{oneOf:[{$ref:"#/definitions/ResolveOptions"}]},ResolveAlias:{anyOf:[{type:"array",items:{type:"object",additionalProperties:!1,properties:{alias:{anyOf:[{type:"array",items:{type:"string",minLength:1}},{enum:[!1]},{type:"string",minLength:1}]},name:{type:"string"},onlyModule:{type:"boolean"}},required:["alias","name"]}},{type:"object",additionalProperties:{anyOf:[{type:"array",items:{type:"string",minLength:1}},{enum:[!1]},{type:"string",minLength:1}]}}]},ResolveLoader:{oneOf:[{$ref:"#/definitions/ResolveOptions"}]},ResolveOptions:{type:"object",additionalProperties:!1,properties:{alias:{$ref:"#/definitions/ResolveAlias"},aliasFields:{type:"array",items:{anyOf:[{type:"array",items:{type:"string",minLength:1}},{type:"string",minLength:1}]}},byDependency:{type:"object",additionalProperties:{oneOf:[{$ref:"#/definitions/ResolveOptions"}]}},cache:{type:"boolean"},cachePredicate:{instanceof:"Function"},cacheWithContext:{type:"boolean"},conditionNames:{type:"array",items:{type:"string"}},descriptionFiles:{type:"array",items:{type:"string",minLength:1}},enforceExtension:{type:"boolean"},exportsFields:{type:"array",items:{type:"string"}},extensionAlias:{type:"object",additionalProperties:{anyOf:[{type:"array",items:{type:"string",minLength:1}},{type:"string",minLength:1}]}},extensions:{type:"array",items:{type:"string"}},fallback:{oneOf:[{$ref:"#/definitions/ResolveAlias"}]},fileSystem:{},fullySpecified:{type:"boolean"},importsFields:{type:"array",items:{type:"string"}},mainFields:{type:"array",items:{anyOf:[{type:"array",items:{type:"string",minLength:1}},{type:"string",minLength:1}]}},mainFiles:{type:"array",items:{type:"string",minLength:1}},modules:{type:"array",items:{type:"string",minLength:1}},plugins:{type:"array",items:{anyOf:[{enum:["..."]},{$ref:"#/definitions/Falsy"},{$ref:"#/definitions/ResolvePluginInstance"}]}},preferAbsolute:{type:"boolean"},preferRelative:{type:"boolean"},resolver:{},restrictions:{type:"array",items:{anyOf:[{instanceof:"RegExp"},{type:"string",absolutePath:!0,minLength:1}]}},roots:{type:"array",items:{type:"string"}},symlinks:{type:"boolean"},unsafeCache:{anyOf:[{type:"boolean"},{type:"object",additionalProperties:!0}]},useSyncFileSystemCalls:{type:"boolean"}}},ResolvePluginInstance:{anyOf:[{type:"object",additionalProperties:!0,properties:{apply:{instanceof:"Function"}},required:["apply"]},{instanceof:"Function"}]},RuleSetCondition:{anyOf:[{instanceof:"RegExp"},{type:"string"},{instanceof:"Function"},{$ref:"#/definitions/RuleSetLogicalConditions"},{$ref:"#/definitions/RuleSetConditions"}]},RuleSetConditionAbsolute:{anyOf:[{instanceof:"RegExp"},{type:"string",absolutePath:!0},{instanceof:"Function"},{$ref:"#/definitions/RuleSetLogicalConditionsAbsolute"},{$ref:"#/definitions/RuleSetConditionsAbsolute"}]},RuleSetConditionOrConditions:{anyOf:[{$ref:"#/definitions/RuleSetCondition"},{$ref:"#/definitions/RuleSetConditions"}]},RuleSetConditionOrConditionsAbsolute:{anyOf:[{$ref:"#/definitions/RuleSetConditionAbsolute"},{$ref:"#/definitions/RuleSetConditionsAbsolute"}]},RuleSetConditions:{type:"array",items:{oneOf:[{$ref:"#/definitions/RuleSetCondition"}]}},RuleSetConditionsAbsolute:{type:"array",items:{oneOf:[{$ref:"#/definitions/RuleSetConditionAbsolute"}]}},RuleSetLoader:{type:"string",minLength:1},RuleSetLoaderOptions:{anyOf:[{type:"string"},{type:"object"}]},RuleSetLogicalConditions:{type:"object",additionalProperties:!1,properties:{and:{oneOf:[{$ref:"#/definitions/RuleSetConditions"}]},not:{oneOf:[{$ref:"#/definitions/RuleSetCondition"}]},or:{oneOf:[{$ref:"#/definitions/RuleSetConditions"}]}}},RuleSetLogicalConditionsAbsolute:{type:"object",additionalProperties:!1,properties:{and:{oneOf:[{$ref:"#/definitions/RuleSetConditionsAbsolute"}]},not:{oneOf:[{$ref:"#/definitions/RuleSetConditionAbsolute"}]},or:{oneOf:[{$ref:"#/definitions/RuleSetConditionsAbsolute"}]}}},RuleSetRule:{type:"object",additionalProperties:!1,properties:{assert:{type:"object",additionalProperties:{$ref:"#/definitions/RuleSetConditionOrConditions"}},compiler:{oneOf:[{$ref:"#/definitions/RuleSetConditionOrConditions"}]},dependency:{oneOf:[{$ref:"#/definitions/RuleSetConditionOrConditions"}]},descriptionData:{type:"object",additionalProperties:{$ref:"#/definitions/RuleSetConditionOrConditions"}},enforce:{enum:["pre","post"]},exclude:{oneOf:[{$ref:"#/definitions/RuleSetConditionOrConditionsAbsolute"}]},generator:{type:"object"},include:{oneOf:[{$ref:"#/definitions/RuleSetConditionOrConditionsAbsolute"}]},issuer:{oneOf:[{$ref:"#/definitions/RuleSetConditionOrConditionsAbsolute"}]},issuerLayer:{oneOf:[{$ref:"#/definitions/RuleSetConditionOrConditions"}]},layer:{type:"string"},loader:{oneOf:[{$ref:"#/definitions/RuleSetLoader"}]},mimetype:{oneOf:[{$ref:"#/definitions/RuleSetConditionOrConditions"}]},oneOf:{type:"array",items:{anyOf:[{$ref:"#/definitions/Falsy"},{$ref:"#/definitions/RuleSetRule"}]}},options:{oneOf:[{$ref:"#/definitions/RuleSetLoaderOptions"}]},parser:{type:"object",additionalProperties:!0},realResource:{oneOf:[{$ref:"#/definitions/RuleSetConditionOrConditionsAbsolute"}]},resolve:{type:"object",oneOf:[{$ref:"#/definitions/ResolveOptions"}]},resource:{oneOf:[{$ref:"#/definitions/RuleSetConditionOrConditionsAbsolute"}]},resourceFragment:{oneOf:[{$ref:"#/definitions/RuleSetConditionOrConditions"}]},resourceQuery:{oneOf:[{$ref:"#/definitions/RuleSetConditionOrConditions"}]},rules:{type:"array",items:{anyOf:[{$ref:"#/definitions/Falsy"},{$ref:"#/definitions/RuleSetRule"}]}},scheme:{oneOf:[{$ref:"#/definitions/RuleSetConditionOrConditions"}]},sideEffects:{type:"boolean"},test:{oneOf:[{$ref:"#/definitions/RuleSetConditionOrConditionsAbsolute"}]},type:{type:"string"},use:{oneOf:[{$ref:"#/definitions/RuleSetUse"}]},with:{type:"object",additionalProperties:{$ref:"#/definitions/RuleSetConditionOrConditions"}}}},RuleSetRules:{type:"array",items:{anyOf:[{enum:["..."]},{$ref:"#/definitions/Falsy"},{$ref:"#/definitions/RuleSetRule"}]}},RuleSetUse:{anyOf:[{type:"array",items:{anyOf:[{$ref:"#/definitions/Falsy"},{$ref:"#/definitions/RuleSetUseItem"}]}},{$ref:"#/definitions/RuleSetUseFunction"},{$ref:"#/definitions/RuleSetUseItem"}]},RuleSetUseFunction:{instanceof:"Function"},RuleSetUseItem:{anyOf:[{type:"object",additionalProperties:!1,properties:{ident:{type:"string"},loader:{oneOf:[{$ref:"#/definitions/RuleSetLoader"}]},options:{oneOf:[{$ref:"#/definitions/RuleSetLoaderOptions"}]}}},{$ref:"#/definitions/RuleSetUseFunction"},{$ref:"#/definitions/RuleSetLoader"}]},ScriptType:{enum:[!1,"text/javascript","module"]},SnapshotOptions:{type:"object",additionalProperties:!1,properties:{buildDependencies:{type:"object",additionalProperties:!1,properties:{hash:{type:"boolean"},timestamp:{type:"boolean"}}},immutablePaths:{type:"array",items:{anyOf:[{instanceof:"RegExp"},{type:"string",absolutePath:!0,minLength:1}]}},managedPaths:{type:"array",items:{anyOf:[{instanceof:"RegExp"},{type:"string",absolutePath:!0,minLength:1}]}},module:{type:"object",additionalProperties:!1,properties:{hash:{type:"boolean"},timestamp:{type:"boolean"}}},resolve:{type:"object",additionalProperties:!1,properties:{hash:{type:"boolean"},timestamp:{type:"boolean"}}},resolveBuildDependencies:{type:"object",additionalProperties:!1,properties:{hash:{type:"boolean"},timestamp:{type:"boolean"}}},unmanagedPaths:{type:"array",items:{anyOf:[{instanceof:"RegExp"},{type:"string",absolutePath:!0,minLength:1}]}}}},SourceMapFilename:{type:"string",absolutePath:!1},SourcePrefix:{type:"string"},StatsOptions:{type:"object",additionalProperties:!1,properties:{all:{type:"boolean"},assets:{type:"boolean"},assetsSort:{anyOf:[{enum:[!1]},{type:"string"}]},assetsSpace:{type:"number"},builtAt:{type:"boolean"},cached:{type:"boolean"},cachedAssets:{type:"boolean"},cachedModules:{type:"boolean"},children:{type:"boolean"},chunkGroupAuxiliary:{type:"boolean"},chunkGroupChildren:{type:"boolean"},chunkGroupMaxAssets:{type:"number"},chunkGroups:{type:"boolean"},chunkModules:{type:"boolean"},chunkModulesSpace:{type:"number"},chunkOrigins:{type:"boolean"},chunkRelations:{type:"boolean"},chunks:{type:"boolean"},chunksSort:{anyOf:[{enum:[!1]},{type:"string"}]},colors:{anyOf:[{type:"boolean"},{type:"object",additionalProperties:!1,properties:{bold:{type:"string"},cyan:{type:"string"},green:{type:"string"},magenta:{type:"string"},red:{type:"string"},yellow:{type:"string"}}}]},context:{type:"string",absolutePath:!0},dependentModules:{type:"boolean"},depth:{type:"boolean"},entrypoints:{anyOf:[{enum:["auto"]},{type:"boolean"}]},env:{type:"boolean"},errorCause:{anyOf:[{enum:["auto"]},{type:"boolean"}]},errorDetails:{anyOf:[{enum:["auto"]},{type:"boolean"}]},errorErrors:{anyOf:[{enum:["auto"]},{type:"boolean"}]},errorStack:{type:"boolean"},errors:{type:"boolean"},errorsCount:{type:"boolean"},errorsSpace:{type:"number"},exclude:{anyOf:[{type:"boolean"},{$ref:"#/definitions/ModuleFilterTypes"}]},excludeAssets:{oneOf:[{$ref:"#/definitions/AssetFilterTypes"}]},excludeModules:{anyOf:[{type:"boolean"},{$ref:"#/definitions/ModuleFilterTypes"}]},groupAssetsByChunk:{type:"boolean"},groupAssetsByEmitStatus:{type:"boolean"},groupAssetsByExtension:{type:"boolean"},groupAssetsByInfo:{type:"boolean"},groupAssetsByPath:{type:"boolean"},groupModulesByAttributes:{type:"boolean"},groupModulesByCacheStatus:{type:"boolean"},groupModulesByExtension:{type:"boolean"},groupModulesByLayer:{type:"boolean"},groupModulesByPath:{type:"boolean"},groupModulesByType:{type:"boolean"},groupReasonsByOrigin:{type:"boolean"},hash:{type:"boolean"},ids:{type:"boolean"},logging:{anyOf:[{enum:["none","error","warn","info","log","verbose"]},{type:"boolean"}]},loggingDebug:{anyOf:[{type:"boolean"},{$ref:"#/definitions/FilterTypes"}]},loggingTrace:{type:"boolean"},moduleAssets:{type:"boolean"},moduleTrace:{type:"boolean"},modules:{type:"boolean"},modulesSort:{anyOf:[{enum:[!1]},{type:"string"}]},modulesSpace:{type:"number"},nestedModules:{type:"boolean"},nestedModulesSpace:{type:"number"},optimizationBailout:{type:"boolean"},orphanModules:{type:"boolean"},outputPath:{type:"boolean"},performance:{type:"boolean"},preset:{anyOf:[{type:"boolean"},{type:"string"}]},providedExports:{type:"boolean"},publicPath:{type:"boolean"},reasons:{type:"boolean"},reasonsSpace:{type:"number"},relatedAssets:{type:"boolean"},runtime:{type:"boolean"},runtimeModules:{type:"boolean"},source:{type:"boolean"},timings:{type:"boolean"},usedExports:{type:"boolean"},version:{type:"boolean"},warnings:{type:"boolean"},warningsCount:{type:"boolean"},warningsFilter:{oneOf:[{$ref:"#/definitions/WarningFilterTypes"}]},warningsSpace:{type:"number"}}},StatsValue:{anyOf:[{enum:["none","summary","errors-only","errors-warnings","minimal","normal","detailed","verbose"]},{type:"boolean"},{$ref:"#/definitions/StatsOptions"}]},StrictModuleErrorHandling:{type:"boolean"},StrictModuleExceptionHandling:{type:"boolean"},Target:{anyOf:[{type:"array",items:{type:"string",minLength:1},minItems:1},{enum:[!1]},{type:"string",minLength:1}]},TrustedTypes:{type:"object",additionalProperties:!1,properties:{onPolicyCreationFailure:{enum:["continue","stop"]},policyName:{type:"string",minLength:1}}},UmdNamedDefine:{type:"boolean"},UniqueName:{type:"string",minLength:1},WarningFilterItemTypes:{anyOf:[{instanceof:"RegExp"},{type:"string",absolutePath:!1},{instanceof:"Function"}]},WarningFilterTypes:{anyOf:[{type:"array",items:{oneOf:[{$ref:"#/definitions/WarningFilterItemTypes"}]}},{$ref:"#/definitions/WarningFilterItemTypes"}]},WasmLoading:{anyOf:[{enum:[!1]},{$ref:"#/definitions/WasmLoadingType"}]},WasmLoadingType:{anyOf:[{enum:["fetch","async-node"]},{type:"string"}]},Watch:{type:"boolean"},WatchOptions:{type:"object",additionalProperties:!1,properties:{aggregateTimeout:{type:"number"},followSymlinks:{type:"boolean"},ignored:{anyOf:[{type:"array",items:{type:"string",minLength:1}},{instanceof:"RegExp"},{type:"string",minLength:1}]},poll:{anyOf:[{type:"number"},{type:"boolean"}]},stdin:{type:"boolean"}}},WebassemblyModuleFilename:{type:"string",absolutePath:!1},WebpackOptionsNormalized:{type:"object",additionalProperties:!1,properties:{amd:{$ref:"#/definitions/Amd"},bail:{$ref:"#/definitions/Bail"},cache:{$ref:"#/definitions/CacheOptionsNormalized"},context:{$ref:"#/definitions/Context"},dependencies:{$ref:"#/definitions/Dependencies"},devServer:{$ref:"#/definitions/DevServer"},devtool:{$ref:"#/definitions/DevTool"},entry:{$ref:"#/definitions/EntryNormalized"},experiments:{$ref:"#/definitions/ExperimentsNormalized"},externals:{$ref:"#/definitions/Externals"},externalsPresets:{$ref:"#/definitions/ExternalsPresets"},externalsType:{$ref:"#/definitions/ExternalsType"},ignoreWarnings:{$ref:"#/definitions/IgnoreWarningsNormalized"},infrastructureLogging:{$ref:"#/definitions/InfrastructureLogging"},loader:{$ref:"#/definitions/Loader"},mode:{$ref:"#/definitions/Mode"},module:{$ref:"#/definitions/ModuleOptionsNormalized"},name:{$ref:"#/definitions/Name"},node:{$ref:"#/definitions/Node"},optimization:{$ref:"#/definitions/OptimizationNormalized"},output:{$ref:"#/definitions/OutputNormalized"},parallelism:{$ref:"#/definitions/Parallelism"},performance:{$ref:"#/definitions/Performance"},plugins:{$ref:"#/definitions/Plugins"},profile:{$ref:"#/definitions/Profile"},recordsInputPath:{$ref:"#/definitions/RecordsInputPath"},recordsOutputPath:{$ref:"#/definitions/RecordsOutputPath"},resolve:{$ref:"#/definitions/Resolve"},resolveLoader:{$ref:"#/definitions/ResolveLoader"},snapshot:{$ref:"#/definitions/SnapshotOptions"},stats:{$ref:"#/definitions/StatsValue"},target:{$ref:"#/definitions/Target"},watch:{$ref:"#/definitions/Watch"},watchOptions:{$ref:"#/definitions/WatchOptions"}},required:["cache","snapshot","entry","experiments","externals","externalsPresets","infrastructureLogging","module","node","optimization","output","plugins","resolve","resolveLoader","stats","watchOptions"]},WebpackPluginFunction:{instanceof:"Function"},WebpackPluginInstance:{type:"object",additionalProperties:!0,properties:{apply:{instanceof:"Function"}},required:["apply"]},WorkerPublicPath:{type:"string"}},type:"object",additionalProperties:!1,properties:{amd:{$ref:"#/definitions/Amd"},bail:{$ref:"#/definitions/Bail"},cache:{$ref:"#/definitions/CacheOptions"},context:{$ref:"#/definitions/Context"},dependencies:{$ref:"#/definitions/Dependencies"},devServer:{$ref:"#/definitions/DevServer"},devtool:{$ref:"#/definitions/DevTool"},entry:{$ref:"#/definitions/Entry"},experiments:{$ref:"#/definitions/Experiments"},extends:{$ref:"#/definitions/Extends"},externals:{$ref:"#/definitions/Externals"},externalsPresets:{$ref:"#/definitions/ExternalsPresets"},externalsType:{$ref:"#/definitions/ExternalsType"},ignoreWarnings:{$ref:"#/definitions/IgnoreWarnings"},infrastructureLogging:{$ref:"#/definitions/InfrastructureLogging"},loader:{$ref:"#/definitions/Loader"},mode:{$ref:"#/definitions/Mode"},module:{$ref:"#/definitions/ModuleOptions"},name:{$ref:"#/definitions/Name"},node:{$ref:"#/definitions/Node"},optimization:{$ref:"#/definitions/Optimization"},output:{$ref:"#/definitions/Output"},parallelism:{$ref:"#/definitions/Parallelism"},performance:{$ref:"#/definitions/Performance"},plugins:{$ref:"#/definitions/Plugins"},profile:{$ref:"#/definitions/Profile"},recordsInputPath:{$ref:"#/definitions/RecordsInputPath"},recordsOutputPath:{$ref:"#/definitions/RecordsOutputPath"},recordsPath:{$ref:"#/definitions/RecordsPath"},resolve:{$ref:"#/definitions/Resolve"},resolveLoader:{$ref:"#/definitions/ResolveLoader"},snapshot:{$ref:"#/definitions/SnapshotOptions"},stats:{$ref:"#/definitions/StatsValue"},target:{$ref:"#/definitions/Target"},watch:{$ref:"#/definitions/Watch"},watchOptions:{$ref:"#/definitions/WatchOptions"}}},n=Object.prototype.hasOwnProperty,r={type:"object",additionalProperties:!1,properties:{allowCollectingMemory:{type:"boolean"},buildDependencies:{type:"object",additionalProperties:{type:"array",items:{type:"string",minLength:1}}},cacheDirectory:{type:"string",absolutePath:!0},cacheLocation:{type:"string",absolutePath:!0},compression:{enum:[!1,"gzip","brotli"]},hashAlgorithm:{type:"string"},idleTimeout:{type:"number",minimum:0},idleTimeoutAfterLargeChanges:{type:"number",minimum:0},idleTimeoutForInitialStore:{type:"number",minimum:0},immutablePaths:{type:"array",items:{anyOf:[{instanceof:"RegExp"},{type:"string",absolutePath:!0,minLength:1}]}},managedPaths:{type:"array",items:{anyOf:[{instanceof:"RegExp"},{type:"string",absolutePath:!0,minLength:1}]}},maxAge:{type:"number",minimum:0},maxMemoryGenerations:{type:"number",minimum:0},memoryCacheUnaffected:{type:"boolean"},name:{type:"string"},profile:{type:"boolean"},readonly:{type:"boolean"},store:{enum:["pack"]},type:{enum:["filesystem"]},version:{type:"string"}},required:["type"]};function o(t,{instancePath:s="",parentData:i,parentDataProperty:a,rootData:l=t}={}){let p=null,f=0;const u=f;let c=!1;const y=f;if(!1!==t){const e={params:{}};null===p?p=[e]:p.push(e),f++}var m=y===f;if(c=c||m,!c){const o=f;if(f==f)if(t&&"object"==typeof t&&!Array.isArray(t)){let e;if(void 0===t.type&&(e="type")){const t={params:{missingProperty:e}};null===p?p=[t]:p.push(t),f++}else{const e=f;for(const e in t)if("cacheUnaffected"!==e&&"maxGenerations"!==e&&"type"!==e){const t={params:{additionalProperty:e}};null===p?p=[t]:p.push(t),f++;break}if(e===f){if(void 0!==t.cacheUnaffected){const e=f;if("boolean"!=typeof t.cacheUnaffected){const e={params:{type:"boolean"}};null===p?p=[e]:p.push(e),f++}var d=e===f}else d=!0;if(d){if(void 0!==t.maxGenerations){let e=t.maxGenerations;const n=f;if(f===n)if("number"==typeof e){if(e<1||isNaN(e)){const e={params:{comparison:">=",limit:1}};null===p?p=[e]:p.push(e),f++}}else{const e={params:{type:"number"}};null===p?p=[e]:p.push(e),f++}d=n===f}else d=!0;if(d)if(void 0!==t.type){const e=f;if("memory"!==t.type){const e={params:{}};null===p?p=[e]:p.push(e),f++}d=e===f}else d=!0}}}}else{const e={params:{type:"object"}};null===p?p=[e]:p.push(e),f++}if(m=o===f,c=c||m,!c){const o=f;if(f==f)if(t&&"object"==typeof t&&!Array.isArray(t)){let o;if(void 0===t.type&&(o="type")){const e={params:{missingProperty:o}};null===p?p=[e]:p.push(e),f++}else{const o=f;for(const e in t)if(!n.call(r.properties,e)){const t={params:{additionalProperty:e}};null===p?p=[t]:p.push(t),f++;break}if(o===f){if(void 0!==t.allowCollectingMemory){const e=f;if("boolean"!=typeof t.allowCollectingMemory){const e={params:{type:"boolean"}};null===p?p=[e]:p.push(e),f++}var h=e===f}else h=!0;if(h){if(void 0!==t.buildDependencies){let e=t.buildDependencies;const n=f;if(f===n)if(e&&"object"==typeof e&&!Array.isArray(e))for(const t in e){let n=e[t];const r=f;if(f===r)if(Array.isArray(n)){const e=n.length;for(let t=0;t=",limit:0}};null===p?p=[e]:p.push(e),f++}}else{const e={params:{type:"number"}};null===p?p=[e]:p.push(e),f++}h=n===f}else h=!0;if(h){if(void 0!==t.idleTimeoutAfterLargeChanges){let e=t.idleTimeoutAfterLargeChanges;const n=f;if(f===n)if("number"==typeof e){if(e<0||isNaN(e)){const e={params:{comparison:">=",limit:0}};null===p?p=[e]:p.push(e),f++}}else{const e={params:{type:"number"}};null===p?p=[e]:p.push(e),f++}h=n===f}else h=!0;if(h){if(void 0!==t.idleTimeoutForInitialStore){let e=t.idleTimeoutForInitialStore;const n=f;if(f===n)if("number"==typeof e){if(e<0||isNaN(e)){const e={params:{comparison:">=",limit:0}};null===p?p=[e]:p.push(e),f++}}else{const e={params:{type:"number"}};null===p?p=[e]:p.push(e),f++}h=n===f}else h=!0;if(h){if(void 0!==t.immutablePaths){let n=t.immutablePaths;const r=f;if(f===r)if(Array.isArray(n)){const t=n.length;for(let r=0;r=",limit:0}};null===p?p=[e]:p.push(e),f++}}else{const e={params:{type:"number"}};null===p?p=[e]:p.push(e),f++}h=n===f}else h=!0;if(h){if(void 0!==t.maxMemoryGenerations){let e=t.maxMemoryGenerations;const n=f;if(f===n)if("number"==typeof e){if(e<0||isNaN(e)){const e={params:{comparison:">=",limit:0}};null===p?p=[e]:p.push(e),f++}}else{const e={params:{type:"number"}};null===p?p=[e]:p.push(e),f++}h=n===f}else h=!0;if(h){if(void 0!==t.memoryCacheUnaffected){const e=f;if("boolean"!=typeof t.memoryCacheUnaffected){const e={params:{type:"boolean"}};null===p?p=[e]:p.push(e),f++}h=e===f}else h=!0;if(h){if(void 0!==t.name){const e=f;if("string"!=typeof t.name){const e={params:{type:"string"}};null===p?p=[e]:p.push(e),f++}h=e===f}else h=!0;if(h){if(void 0!==t.profile){const e=f;if("boolean"!=typeof t.profile){const e={params:{type:"boolean"}};null===p?p=[e]:p.push(e),f++}h=e===f}else h=!0;if(h){if(void 0!==t.readonly){const e=f;if("boolean"!=typeof t.readonly){const e={params:{type:"boolean"}};null===p?p=[e]:p.push(e),f++}h=e===f}else h=!0;if(h){if(void 0!==t.store){const e=f;if("pack"!==t.store){const e={params:{}};null===p?p=[e]:p.push(e),f++}h=e===f}else h=!0;if(h){if(void 0!==t.type){const e=f;if("filesystem"!==t.type){const e={params:{}};null===p?p=[e]:p.push(e),f++}h=e===f}else h=!0;if(h)if(void 0!==t.version){const e=f;if("string"!=typeof t.version){const e={params:{type:"string"}};null===p?p=[e]:p.push(e),f++}h=e===f}else h=!0}}}}}}}}}}}}}}}}}}}}}else{const e={params:{type:"object"}};null===p?p=[e]:p.push(e),f++}m=o===f,c=c||m}}if(!c){const e={params:{}};return null===p?p=[e]:p.push(e),f++,o.errors=p,!1}return f=u,null!==p&&(u?p.length=u:p=null),o.errors=p,0===f}function s(e,{instancePath:t="",parentData:n,parentDataProperty:r,rootData:i=e}={}){let a=null,l=0;const p=l;let f=!1;const u=l;if(!0!==e){const e={params:{}};null===a?a=[e]:a.push(e),l++}var c=u===l;if(f=f||c,!f){const s=l;o(e,{instancePath:t,parentData:n,parentDataProperty:r,rootData:i})||(a=null===a?o.errors:a.concat(o.errors),l=a.length),c=s===l,f=f||c}if(!f){const e={params:{}};return null===a?a=[e]:a.push(e),l++,s.errors=a,!1}return l=p,null!==a&&(p?a.length=p:a=null),s.errors=a,0===l}const i={type:"object",additionalProperties:!1,properties:{asyncChunks:{type:"boolean"},baseUri:{type:"string"},chunkLoading:{$ref:"#/definitions/ChunkLoading"},dependOn:{anyOf:[{type:"array",items:{type:"string",minLength:1},minItems:1,uniqueItems:!0},{type:"string",minLength:1}]},filename:{$ref:"#/definitions/EntryFilename"},import:{$ref:"#/definitions/EntryItem"},layer:{$ref:"#/definitions/Layer"},library:{$ref:"#/definitions/LibraryOptions"},publicPath:{$ref:"#/definitions/PublicPath"},runtime:{$ref:"#/definitions/EntryRuntime"},wasmLoading:{$ref:"#/definitions/WasmLoading"}},required:["import"]};function a(e,{instancePath:t="",parentData:n,parentDataProperty:r,rootData:o=e}={}){let s=null,i=0;const l=i;let p=!1;const f=i;if(!1!==e){const e={params:{}};null===s?s=[e]:s.push(e),i++}var u=f===i;if(p=p||u,!p){const t=i,n=i;let r=!1;const o=i;if("jsonp"!==e&&"import-scripts"!==e&&"require"!==e&&"async-node"!==e&&"import"!==e){const e={params:{}};null===s?s=[e]:s.push(e),i++}var c=o===i;if(r=r||c,!r){const t=i;if("string"!=typeof e){const e={params:{type:"string"}};null===s?s=[e]:s.push(e),i++}c=t===i,r=r||c}if(r)i=n,null!==s&&(n?s.length=n:s=null);else{const e={params:{}};null===s?s=[e]:s.push(e),i++}u=t===i,p=p||u}if(!p){const e={params:{}};return null===s?s=[e]:s.push(e),i++,a.errors=s,!1}return i=l,null!==s&&(l?s.length=l:s=null),a.errors=s,0===i}function l(t,{instancePath:n="",parentData:r,parentDataProperty:o,rootData:s=t}={}){let i=null,a=0;const p=a;let f=!1,u=null;const c=a,y=a;let m=!1;const d=a;if(a===d)if("string"==typeof t){if(t.includes("!")||!1!==e.test(t)){const e={params:{}};null===i?i=[e]:i.push(e),a++}else if(t.length<1){const e={params:{}};null===i?i=[e]:i.push(e),a++}}else{const e={params:{type:"string"}};null===i?i=[e]:i.push(e),a++}var h=d===a;if(m=m||h,!m){const e=a;if(!(t instanceof Function)){const e={params:{}};null===i?i=[e]:i.push(e),a++}h=e===a,m=m||h}if(m)a=y,null!==i&&(y?i.length=y:i=null);else{const e={params:{}};null===i?i=[e]:i.push(e),a++}if(c===a&&(f=!0,u=0),!f){const e={params:{passingSchemas:u}};return null===i?i=[e]:i.push(e),a++,l.errors=i,!1}return a=p,null!==i&&(p?i.length=p:i=null),l.errors=i,0===a}function p(e,{instancePath:t="",parentData:n,parentDataProperty:r,rootData:o=e}={}){let s=null,i=0;const a=i;let l=!1;const f=i;if("string"!=typeof e){const e={params:{type:"string"}};null===s?s=[e]:s.push(e),i++}var u=f===i;if(l=l||u,!l){const t=i;if(i==i)if(e&&"object"==typeof e&&!Array.isArray(e)){const t=i;for(const t in e)if("amd"!==t&&"commonjs"!==t&&"commonjs2"!==t&&"root"!==t){const e={params:{additionalProperty:t}};null===s?s=[e]:s.push(e),i++;break}if(t===i){if(void 0!==e.amd){const t=i;if("string"!=typeof e.amd){const e={params:{type:"string"}};null===s?s=[e]:s.push(e),i++}var c=t===i}else c=!0;if(c){if(void 0!==e.commonjs){const t=i;if("string"!=typeof e.commonjs){const e={params:{type:"string"}};null===s?s=[e]:s.push(e),i++}c=t===i}else c=!0;if(c){if(void 0!==e.commonjs2){const t=i;if("string"!=typeof e.commonjs2){const e={params:{type:"string"}};null===s?s=[e]:s.push(e),i++}c=t===i}else c=!0;if(c)if(void 0!==e.root){const t=i;if("string"!=typeof e.root){const e={params:{type:"string"}};null===s?s=[e]:s.push(e),i++}c=t===i}else c=!0}}}}else{const e={params:{type:"object"}};null===s?s=[e]:s.push(e),i++}u=t===i,l=l||u}if(!l){const e={params:{}};return null===s?s=[e]:s.push(e),i++,p.errors=s,!1}return i=a,null!==s&&(a?s.length=a:s=null),p.errors=s,0===i}function f(e,{instancePath:t="",parentData:n,parentDataProperty:r,rootData:o=e}={}){let s=null,i=0;const a=i;let l=!1;const p=i;if(i===p)if(Array.isArray(e))if(e.length<1){const e={params:{limit:1}};null===s?s=[e]:s.push(e),i++}else{const t=e.length;for(let n=0;n1){const r={};for(;n--;){let o=t[n];if("string"==typeof o){if("number"==typeof r[o]){e=r[o];const t={params:{i:n,j:e}};null===p?p=[t]:p.push(t),f++;break}r[o]=n}}}}}else{const e={params:{type:"array"}};null===p?p=[e]:p.push(e),f++}var b=s===f;if(o=o||b,!o){const e=f;if(f===e)if("string"==typeof t){if(t.length<1){const e={params:{}};null===p?p=[e]:p.push(e),f++}}else{const e={params:{type:"string"}};null===p?p=[e]:p.push(e),f++}b=e===f,o=o||b}if(!o){const e={params:{}};return null===p?p=[e]:p.push(e),f++,m.errors=p,!1}f=r,null!==p&&(r?p.length=r:p=null),d=n===f}else d=!0;if(d){if(void 0!==e.filename){const n=f;l(e.filename,{instancePath:t+"/filename",parentData:e,parentDataProperty:"filename",rootData:s})||(p=null===p?l.errors:p.concat(l.errors),f=p.length),d=n===f}else d=!0;if(d){if(void 0!==e.import){let t=e.import;const n=f,r=f;let o=!1;const s=f;if(f===s)if(Array.isArray(t))if(t.length<1){const e={params:{limit:1}};null===p?p=[e]:p.push(e),f++}else{var g=!0;const e=t.length;for(let n=0;n1){const r={};for(;n--;){let o=t[n];if("string"==typeof o){if("number"==typeof r[o]){e=r[o];const t={params:{i:n,j:e}};null===p?p=[t]:p.push(t),f++;break}r[o]=n}}}}}else{const e={params:{type:"array"}};null===p?p=[e]:p.push(e),f++}var v=s===f;if(o=o||v,!o){const e=f;if(f===e)if("string"==typeof t){if(t.length<1){const e={params:{}};null===p?p=[e]:p.push(e),f++}}else{const e={params:{type:"string"}};null===p?p=[e]:p.push(e),f++}v=e===f,o=o||v}if(!o){const e={params:{}};return null===p?p=[e]:p.push(e),f++,m.errors=p,!1}f=r,null!==p&&(r?p.length=r:p=null),d=n===f}else d=!0;if(d){if(void 0!==e.layer){let t=e.layer;const n=f,r=f;let o=!1;const s=f;if(null!==t){const e={params:{}};null===p?p=[e]:p.push(e),f++}var P=s===f;if(o=o||P,!o){const e=f;if(f===e)if("string"==typeof t){if(t.length<1){const e={params:{}};null===p?p=[e]:p.push(e),f++}}else{const e={params:{type:"string"}};null===p?p=[e]:p.push(e),f++}P=e===f,o=o||P}if(!o){const e={params:{}};return null===p?p=[e]:p.push(e),f++,m.errors=p,!1}f=r,null!==p&&(r?p.length=r:p=null),d=n===f}else d=!0;if(d){if(void 0!==e.library){const n=f;u(e.library,{instancePath:t+"/library",parentData:e,parentDataProperty:"library",rootData:s})||(p=null===p?u.errors:p.concat(u.errors),f=p.length),d=n===f}else d=!0;if(d){if(void 0!==e.publicPath){const n=f;c(e.publicPath,{instancePath:t+"/publicPath",parentData:e,parentDataProperty:"publicPath",rootData:s})||(p=null===p?c.errors:p.concat(c.errors),f=p.length),d=n===f}else d=!0;if(d){if(void 0!==e.runtime){let t=e.runtime;const n=f,r=f;let o=!1;const s=f;if(!1!==t){const e={params:{}};null===p?p=[e]:p.push(e),f++}var D=s===f;if(o=o||D,!o){const e=f;if(f===e)if("string"==typeof t){if(t.length<1){const e={params:{}};null===p?p=[e]:p.push(e),f++}}else{const e={params:{type:"string"}};null===p?p=[e]:p.push(e),f++}D=e===f,o=o||D}if(!o){const e={params:{}};return null===p?p=[e]:p.push(e),f++,m.errors=p,!1}f=r,null!==p&&(r?p.length=r:p=null),d=n===f}else d=!0;if(d)if(void 0!==e.wasmLoading){const n=f;y(e.wasmLoading,{instancePath:t+"/wasmLoading",parentData:e,parentDataProperty:"wasmLoading",rootData:s})||(p=null===p?y.errors:p.concat(y.errors),f=p.length),d=n===f}else d=!0}}}}}}}}}}}}}return m.errors=p,0===f}function d(e,{instancePath:t="",parentData:n,parentDataProperty:r,rootData:o=e}={}){let s=null,i=0;if(0===i){if(!e||"object"!=typeof e||Array.isArray(e))return d.errors=[{params:{type:"object"}}],!1;for(const n in e){let r=e[n];const f=i,u=i;let c=!1;const y=i,h=i;let b=!1;const g=i;if(i===g)if(Array.isArray(r))if(r.length<1){const e={params:{limit:1}};null===s?s=[e]:s.push(e),i++}else{var a=!0;const e=r.length;for(let t=0;t1){const n={};for(;t--;){let o=r[t];if("string"==typeof o){if("number"==typeof n[o]){e=n[o];const r={params:{i:t,j:e}};null===s?s=[r]:s.push(r),i++;break}n[o]=t}}}}}else{const e={params:{type:"array"}};null===s?s=[e]:s.push(e),i++}var l=g===i;if(b=b||l,!b){const e=i;if(i===e)if("string"==typeof r){if(r.length<1){const e={params:{}};null===s?s=[e]:s.push(e),i++}}else{const e={params:{type:"string"}};null===s?s=[e]:s.push(e),i++}l=e===i,b=b||l}if(b)i=h,null!==s&&(h?s.length=h:s=null);else{const e={params:{}};null===s?s=[e]:s.push(e),i++}var p=y===i;if(c=c||p,!c){const a=i;m(r,{instancePath:t+"/"+n.replace(/~/g,"~0").replace(/\//g,"~1"),parentData:e,parentDataProperty:n,rootData:o})||(s=null===s?m.errors:s.concat(m.errors),i=s.length),p=a===i,c=c||p}if(!c){const e={params:{}};return null===s?s=[e]:s.push(e),i++,d.errors=s,!1}if(i=u,null!==s&&(u?s.length=u:s=null),f!==i)break}}return d.errors=s,0===i}function h(e,{instancePath:t="",parentData:n,parentDataProperty:r,rootData:o=e}={}){let s=null,i=0;const a=i;let l=!1,p=null;const f=i,u=i;let c=!1;const y=i;if(i===y)if(Array.isArray(e))if(e.length<1){const e={params:{limit:1}};null===s?s=[e]:s.push(e),i++}else{var m=!0;const t=e.length;for(let n=0;n1){const r={};for(;n--;){let o=e[n];if("string"==typeof o){if("number"==typeof r[o]){t=r[o];const e={params:{i:n,j:t}};null===s?s=[e]:s.push(e),i++;break}r[o]=n}}}}}else{const e={params:{type:"array"}};null===s?s=[e]:s.push(e),i++}var d=y===i;if(c=c||d,!c){const t=i;if(i===t)if("string"==typeof e){if(e.length<1){const e={params:{}};null===s?s=[e]:s.push(e),i++}}else{const e={params:{type:"string"}};null===s?s=[e]:s.push(e),i++}d=t===i,c=c||d}if(c)i=u,null!==s&&(u?s.length=u:s=null);else{const e={params:{}};null===s?s=[e]:s.push(e),i++}if(f===i&&(l=!0,p=0),!l){const e={params:{passingSchemas:p}};return null===s?s=[e]:s.push(e),i++,h.errors=s,!1}return i=a,null!==s&&(a?s.length=a:s=null),h.errors=s,0===i}function b(e,{instancePath:t="",parentData:n,parentDataProperty:r,rootData:o=e}={}){let s=null,i=0;const a=i;let l=!1;const p=i;d(e,{instancePath:t,parentData:n,parentDataProperty:r,rootData:o})||(s=null===s?d.errors:s.concat(d.errors),i=s.length);var f=p===i;if(l=l||f,!l){const a=i;h(e,{instancePath:t,parentData:n,parentDataProperty:r,rootData:o})||(s=null===s?h.errors:s.concat(h.errors),i=s.length),f=a===i,l=l||f}if(!l){const e={params:{}};return null===s?s=[e]:s.push(e),i++,b.errors=s,!1}return i=a,null!==s&&(a?s.length=a:s=null),b.errors=s,0===i}function g(e,{instancePath:t="",parentData:n,parentDataProperty:r,rootData:o=e}={}){let s=null,i=0;const a=i;let l=!1;const p=i;if(!(e instanceof Function)){const e={params:{}};null===s?s=[e]:s.push(e),i++}var f=p===i;if(l=l||f,!l){const a=i;b(e,{instancePath:t,parentData:n,parentDataProperty:r,rootData:o})||(s=null===s?b.errors:s.concat(b.errors),i=s.length),f=a===i,l=l||f}if(!l){const e={params:{}};return null===s?s=[e]:s.push(e),i++,g.errors=s,!1}return i=a,null!==s&&(a?s.length=a:s=null),g.errors=s,0===i}const v={type:"object",additionalProperties:!1,properties:{asyncWebAssembly:{type:"boolean"},backCompat:{type:"boolean"},buildHttp:{anyOf:[{$ref:"#/definitions/HttpUriAllowedUris"},{$ref:"#/definitions/HttpUriOptions"}]},cacheUnaffected:{type:"boolean"},css:{type:"boolean"},futureDefaults:{type:"boolean"},layers:{type:"boolean"},lazyCompilation:{anyOf:[{type:"boolean"},{$ref:"#/definitions/LazyCompilationOptions"}]},outputModule:{type:"boolean"},syncWebAssembly:{type:"boolean"},topLevelAwait:{type:"boolean"}}},P=new RegExp("^https?://","u");function D(e,{instancePath:t="",parentData:n,parentDataProperty:r,rootData:o=e}={}){let s=null,i=0;const a=i;let l=!1,p=null;const f=i;if(i==i)if(Array.isArray(e)){const t=e.length;for(let n=0;n=",limit:0}};null===a?a=[e]:a.push(e),l++}}else{const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}var u=y===l;if(c=c||u,!c){const t=l;if(l===t)if(e&&"object"==typeof e&&!Array.isArray(e))for(const t in e){const n=l;if("number"!=typeof e[t]){const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}if(n!==l)break}else{const e={params:{type:"object"}};null===a?a=[e]:a.push(e),l++}u=t===l,c=c||u}if(c)l=f,null!==a&&(f?a.length=f:a=null);else{const e={params:{}};null===a?a=[e]:a.push(e),l++}if(i===l&&(o=!0,s=0),!o){const e={params:{passingSchemas:s}};return null===a?a=[e]:a.push(e),l++,De.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),p=n===l}else p=!0;if(p){if(void 0!==t.filename){let n=t.filename;const r=l,o=l;let s=!1;const i=l;if(l===i)if("string"==typeof n){if(n.includes("!")||!1!==e.test(n)){const e={params:{}};null===a?a=[e]:a.push(e),l++}else if(n.length<1){const e={params:{}};null===a?a=[e]:a.push(e),l++}}else{const e={params:{type:"string"}};null===a?a=[e]:a.push(e),l++}var c=i===l;if(s=s||c,!s){const e=l;if(!(n instanceof Function)){const e={params:{}};null===a?a=[e]:a.push(e),l++}c=e===l,s=s||c}if(!s){const e={params:{}};return null===a?a=[e]:a.push(e),l++,De.errors=a,!1}l=o,null!==a&&(o?a.length=o:a=null),p=r===l}else p=!0;if(p){if(void 0!==t.idHint){const e=l;if("string"!=typeof t.idHint)return De.errors=[{params:{type:"string"}}],!1;p=e===l}else p=!0;if(p){if(void 0!==t.layer){let e=t.layer;const n=l,r=l;let o=!1;const s=l;if(!(e instanceof RegExp)){const e={params:{}};null===a?a=[e]:a.push(e),l++}var y=s===l;if(o=o||y,!o){const t=l;if("string"!=typeof e){const e={params:{type:"string"}};null===a?a=[e]:a.push(e),l++}if(y=t===l,o=o||y,!o){const t=l;if(!(e instanceof Function)){const e={params:{}};null===a?a=[e]:a.push(e),l++}y=t===l,o=o||y}}if(!o){const e={params:{}};return null===a?a=[e]:a.push(e),l++,De.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),p=n===l}else p=!0;if(p){if(void 0!==t.maxAsyncRequests){let e=t.maxAsyncRequests;const n=l;if(l===n){if("number"!=typeof e)return De.errors=[{params:{type:"number"}}],!1;if(e<1||isNaN(e))return De.errors=[{params:{comparison:">=",limit:1}}],!1}p=n===l}else p=!0;if(p){if(void 0!==t.maxAsyncSize){let e=t.maxAsyncSize;const n=l,r=l;let o=!1,s=null;const i=l,f=l;let u=!1;const c=l;if(l===c)if("number"==typeof e){if(e<0||isNaN(e)){const e={params:{comparison:">=",limit:0}};null===a?a=[e]:a.push(e),l++}}else{const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}var m=c===l;if(u=u||m,!u){const t=l;if(l===t)if(e&&"object"==typeof e&&!Array.isArray(e))for(const t in e){const n=l;if("number"!=typeof e[t]){const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}if(n!==l)break}else{const e={params:{type:"object"}};null===a?a=[e]:a.push(e),l++}m=t===l,u=u||m}if(u)l=f,null!==a&&(f?a.length=f:a=null);else{const e={params:{}};null===a?a=[e]:a.push(e),l++}if(i===l&&(o=!0,s=0),!o){const e={params:{passingSchemas:s}};return null===a?a=[e]:a.push(e),l++,De.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),p=n===l}else p=!0;if(p){if(void 0!==t.maxInitialRequests){let e=t.maxInitialRequests;const n=l;if(l===n){if("number"!=typeof e)return De.errors=[{params:{type:"number"}}],!1;if(e<1||isNaN(e))return De.errors=[{params:{comparison:">=",limit:1}}],!1}p=n===l}else p=!0;if(p){if(void 0!==t.maxInitialSize){let e=t.maxInitialSize;const n=l,r=l;let o=!1,s=null;const i=l,f=l;let u=!1;const c=l;if(l===c)if("number"==typeof e){if(e<0||isNaN(e)){const e={params:{comparison:">=",limit:0}};null===a?a=[e]:a.push(e),l++}}else{const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}var d=c===l;if(u=u||d,!u){const t=l;if(l===t)if(e&&"object"==typeof e&&!Array.isArray(e))for(const t in e){const n=l;if("number"!=typeof e[t]){const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}if(n!==l)break}else{const e={params:{type:"object"}};null===a?a=[e]:a.push(e),l++}d=t===l,u=u||d}if(u)l=f,null!==a&&(f?a.length=f:a=null);else{const e={params:{}};null===a?a=[e]:a.push(e),l++}if(i===l&&(o=!0,s=0),!o){const e={params:{passingSchemas:s}};return null===a?a=[e]:a.push(e),l++,De.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),p=n===l}else p=!0;if(p){if(void 0!==t.maxSize){let e=t.maxSize;const n=l,r=l;let o=!1,s=null;const i=l,f=l;let u=!1;const c=l;if(l===c)if("number"==typeof e){if(e<0||isNaN(e)){const e={params:{comparison:">=",limit:0}};null===a?a=[e]:a.push(e),l++}}else{const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}var h=c===l;if(u=u||h,!u){const t=l;if(l===t)if(e&&"object"==typeof e&&!Array.isArray(e))for(const t in e){const n=l;if("number"!=typeof e[t]){const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}if(n!==l)break}else{const e={params:{type:"object"}};null===a?a=[e]:a.push(e),l++}h=t===l,u=u||h}if(u)l=f,null!==a&&(f?a.length=f:a=null);else{const e={params:{}};null===a?a=[e]:a.push(e),l++}if(i===l&&(o=!0,s=0),!o){const e={params:{passingSchemas:s}};return null===a?a=[e]:a.push(e),l++,De.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),p=n===l}else p=!0;if(p){if(void 0!==t.minChunks){let e=t.minChunks;const n=l;if(l===n){if("number"!=typeof e)return De.errors=[{params:{type:"number"}}],!1;if(e<1||isNaN(e))return De.errors=[{params:{comparison:">=",limit:1}}],!1}p=n===l}else p=!0;if(p){if(void 0!==t.minRemainingSize){let e=t.minRemainingSize;const n=l,r=l;let o=!1,s=null;const i=l,f=l;let u=!1;const c=l;if(l===c)if("number"==typeof e){if(e<0||isNaN(e)){const e={params:{comparison:">=",limit:0}};null===a?a=[e]:a.push(e),l++}}else{const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}var b=c===l;if(u=u||b,!u){const t=l;if(l===t)if(e&&"object"==typeof e&&!Array.isArray(e))for(const t in e){const n=l;if("number"!=typeof e[t]){const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}if(n!==l)break}else{const e={params:{type:"object"}};null===a?a=[e]:a.push(e),l++}b=t===l,u=u||b}if(u)l=f,null!==a&&(f?a.length=f:a=null);else{const e={params:{}};null===a?a=[e]:a.push(e),l++}if(i===l&&(o=!0,s=0),!o){const e={params:{passingSchemas:s}};return null===a?a=[e]:a.push(e),l++,De.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),p=n===l}else p=!0;if(p){if(void 0!==t.minSize){let e=t.minSize;const n=l,r=l;let o=!1,s=null;const i=l,f=l;let u=!1;const c=l;if(l===c)if("number"==typeof e){if(e<0||isNaN(e)){const e={params:{comparison:">=",limit:0}};null===a?a=[e]:a.push(e),l++}}else{const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}var g=c===l;if(u=u||g,!u){const t=l;if(l===t)if(e&&"object"==typeof e&&!Array.isArray(e))for(const t in e){const n=l;if("number"!=typeof e[t]){const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}if(n!==l)break}else{const e={params:{type:"object"}};null===a?a=[e]:a.push(e),l++}g=t===l,u=u||g}if(u)l=f,null!==a&&(f?a.length=f:a=null);else{const e={params:{}};null===a?a=[e]:a.push(e),l++}if(i===l&&(o=!0,s=0),!o){const e={params:{passingSchemas:s}};return null===a?a=[e]:a.push(e),l++,De.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),p=n===l}else p=!0;if(p){if(void 0!==t.minSizeReduction){let e=t.minSizeReduction;const n=l,r=l;let o=!1,s=null;const i=l,f=l;let u=!1;const c=l;if(l===c)if("number"==typeof e){if(e<0||isNaN(e)){const e={params:{comparison:">=",limit:0}};null===a?a=[e]:a.push(e),l++}}else{const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}var v=c===l;if(u=u||v,!u){const t=l;if(l===t)if(e&&"object"==typeof e&&!Array.isArray(e))for(const t in e){const n=l;if("number"!=typeof e[t]){const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}if(n!==l)break}else{const e={params:{type:"object"}};null===a?a=[e]:a.push(e),l++}v=t===l,u=u||v}if(u)l=f,null!==a&&(f?a.length=f:a=null);else{const e={params:{}};null===a?a=[e]:a.push(e),l++}if(i===l&&(o=!0,s=0),!o){const e={params:{passingSchemas:s}};return null===a?a=[e]:a.push(e),l++,De.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),p=n===l}else p=!0;if(p){if(void 0!==t.name){let e=t.name;const n=l,r=l;let o=!1;const s=l;if(!1!==e){const e={params:{}};null===a?a=[e]:a.push(e),l++}var P=s===l;if(o=o||P,!o){const t=l;if("string"!=typeof e){const e={params:{type:"string"}};null===a?a=[e]:a.push(e),l++}if(P=t===l,o=o||P,!o){const t=l;if(!(e instanceof Function)){const e={params:{}};null===a?a=[e]:a.push(e),l++}P=t===l,o=o||P}}if(!o){const e={params:{}};return null===a?a=[e]:a.push(e),l++,De.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),p=n===l}else p=!0;if(p){if(void 0!==t.priority){const e=l;if("number"!=typeof t.priority)return De.errors=[{params:{type:"number"}}],!1;p=e===l}else p=!0;if(p){if(void 0!==t.reuseExistingChunk){const e=l;if("boolean"!=typeof t.reuseExistingChunk)return De.errors=[{params:{type:"boolean"}}],!1;p=e===l}else p=!0;if(p){if(void 0!==t.test){let e=t.test;const n=l,r=l;let o=!1;const s=l;if(!(e instanceof RegExp)){const e={params:{}};null===a?a=[e]:a.push(e),l++}var D=s===l;if(o=o||D,!o){const t=l;if("string"!=typeof e){const e={params:{type:"string"}};null===a?a=[e]:a.push(e),l++}if(D=t===l,o=o||D,!o){const t=l;if(!(e instanceof Function)){const e={params:{}};null===a?a=[e]:a.push(e),l++}D=t===l,o=o||D}}if(!o){const e={params:{}};return null===a?a=[e]:a.push(e),l++,De.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),p=n===l}else p=!0;if(p){if(void 0!==t.type){let e=t.type;const n=l,r=l;let o=!1;const s=l;if(!(e instanceof RegExp)){const e={params:{}};null===a?a=[e]:a.push(e),l++}var O=s===l;if(o=o||O,!o){const t=l;if("string"!=typeof e){const e={params:{type:"string"}};null===a?a=[e]:a.push(e),l++}if(O=t===l,o=o||O,!o){const t=l;if(!(e instanceof Function)){const e={params:{}};null===a?a=[e]:a.push(e),l++}O=t===l,o=o||O}}if(!o){const e={params:{}};return null===a?a=[e]:a.push(e),l++,De.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),p=n===l}else p=!0;if(p)if(void 0!==t.usedExports){const e=l;if("boolean"!=typeof t.usedExports)return De.errors=[{params:{type:"boolean"}}],!1;p=e===l}else p=!0}}}}}}}}}}}}}}}}}}}}}}}return De.errors=a,0===l}function Oe(t,{instancePath:r="",parentData:o,parentDataProperty:s,rootData:i=t}={}){let a=null,l=0;if(0===l){if(!t||"object"!=typeof t||Array.isArray(t))return Oe.errors=[{params:{type:"object"}}],!1;{const o=l;for(const e in t)if(!n.call(ve.properties,e))return Oe.errors=[{params:{additionalProperty:e}}],!1;if(o===l){if(void 0!==t.automaticNameDelimiter){let e=t.automaticNameDelimiter;const n=l;if(l===n){if("string"!=typeof e)return Oe.errors=[{params:{type:"string"}}],!1;if(e.length<1)return Oe.errors=[{params:{}}],!1}var p=n===l}else p=!0;if(p){if(void 0!==t.cacheGroups){let e=t.cacheGroups;const n=l,o=l,s=l;if(l===s)if(e&&"object"==typeof e&&!Array.isArray(e)){let t;if(void 0===e.test&&(t="test")){const e={};null===a?a=[e]:a.push(e),l++}else if(void 0!==e.test){let t=e.test;const n=l;let r=!1;const o=l;if(!(t instanceof RegExp)){const e={};null===a?a=[e]:a.push(e),l++}var f=o===l;if(r=r||f,!r){const e=l;if("string"!=typeof t){const e={};null===a?a=[e]:a.push(e),l++}if(f=e===l,r=r||f,!r){const e=l;if(!(t instanceof Function)){const e={};null===a?a=[e]:a.push(e),l++}f=e===l,r=r||f}}if(r)l=n,null!==a&&(n?a.length=n:a=null);else{const e={};null===a?a=[e]:a.push(e),l++}}}else{const e={};null===a?a=[e]:a.push(e),l++}if(s===l)return Oe.errors=[{params:{}}],!1;if(l=o,null!==a&&(o?a.length=o:a=null),l===n){if(!e||"object"!=typeof e||Array.isArray(e))return Oe.errors=[{params:{type:"object"}}],!1;for(const t in e){let n=e[t];const o=l,s=l;let p=!1;const f=l;if(!1!==n){const e={params:{}};null===a?a=[e]:a.push(e),l++}var u=f===l;if(p=p||u,!p){const o=l;if(!(n instanceof RegExp)){const e={params:{}};null===a?a=[e]:a.push(e),l++}if(u=o===l,p=p||u,!p){const o=l;if("string"!=typeof n){const e={params:{type:"string"}};null===a?a=[e]:a.push(e),l++}if(u=o===l,p=p||u,!p){const o=l;if(!(n instanceof Function)){const e={params:{}};null===a?a=[e]:a.push(e),l++}if(u=o===l,p=p||u,!p){const o=l;De(n,{instancePath:r+"/cacheGroups/"+t.replace(/~/g,"~0").replace(/\//g,"~1"),parentData:e,parentDataProperty:t,rootData:i})||(a=null===a?De.errors:a.concat(De.errors),l=a.length),u=o===l,p=p||u}}}}if(!p){const e={params:{}};return null===a?a=[e]:a.push(e),l++,Oe.errors=a,!1}if(l=s,null!==a&&(s?a.length=s:a=null),o!==l)break}}p=n===l}else p=!0;if(p){if(void 0!==t.chunks){let e=t.chunks;const n=l,r=l;let o=!1;const s=l;if("initial"!==e&&"async"!==e&&"all"!==e){const e={params:{}};null===a?a=[e]:a.push(e),l++}var c=s===l;if(o=o||c,!o){const t=l;if(!(e instanceof RegExp)){const e={params:{}};null===a?a=[e]:a.push(e),l++}if(c=t===l,o=o||c,!o){const t=l;if(!(e instanceof Function)){const e={params:{}};null===a?a=[e]:a.push(e),l++}c=t===l,o=o||c}}if(!o){const e={params:{}};return null===a?a=[e]:a.push(e),l++,Oe.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),p=n===l}else p=!0;if(p){if(void 0!==t.defaultSizeTypes){let e=t.defaultSizeTypes;const n=l;if(l===n){if(!Array.isArray(e))return Oe.errors=[{params:{type:"array"}}],!1;if(e.length<1)return Oe.errors=[{params:{limit:1}}],!1;{const t=e.length;for(let n=0;n=",limit:0}};null===a?a=[e]:a.push(e),l++}}else{const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}var y=c===l;if(u=u||y,!u){const t=l;if(l===t)if(e&&"object"==typeof e&&!Array.isArray(e))for(const t in e){const n=l;if("number"!=typeof e[t]){const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}if(n!==l)break}else{const e={params:{type:"object"}};null===a?a=[e]:a.push(e),l++}y=t===l,u=u||y}if(u)l=f,null!==a&&(f?a.length=f:a=null);else{const e={params:{}};null===a?a=[e]:a.push(e),l++}if(i===l&&(o=!0,s=0),!o){const e={params:{passingSchemas:s}};return null===a?a=[e]:a.push(e),l++,Oe.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),p=n===l}else p=!0;if(p){if(void 0!==t.fallbackCacheGroup){let e=t.fallbackCacheGroup;const n=l;if(l===n){if(!e||"object"!=typeof e||Array.isArray(e))return Oe.errors=[{params:{type:"object"}}],!1;{const t=l;for(const t in e)if("automaticNameDelimiter"!==t&&"chunks"!==t&&"maxAsyncSize"!==t&&"maxInitialSize"!==t&&"maxSize"!==t&&"minSize"!==t&&"minSizeReduction"!==t)return Oe.errors=[{params:{additionalProperty:t}}],!1;if(t===l){if(void 0!==e.automaticNameDelimiter){let t=e.automaticNameDelimiter;const n=l;if(l===n){if("string"!=typeof t)return Oe.errors=[{params:{type:"string"}}],!1;if(t.length<1)return Oe.errors=[{params:{}}],!1}var m=n===l}else m=!0;if(m){if(void 0!==e.chunks){let t=e.chunks;const n=l,r=l;let o=!1;const s=l;if("initial"!==t&&"async"!==t&&"all"!==t){const e={params:{}};null===a?a=[e]:a.push(e),l++}var d=s===l;if(o=o||d,!o){const e=l;if(!(t instanceof RegExp)){const e={params:{}};null===a?a=[e]:a.push(e),l++}if(d=e===l,o=o||d,!o){const e=l;if(!(t instanceof Function)){const e={params:{}};null===a?a=[e]:a.push(e),l++}d=e===l,o=o||d}}if(!o){const e={params:{}};return null===a?a=[e]:a.push(e),l++,Oe.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),m=n===l}else m=!0;if(m){if(void 0!==e.maxAsyncSize){let t=e.maxAsyncSize;const n=l,r=l;let o=!1,s=null;const i=l,p=l;let f=!1;const u=l;if(l===u)if("number"==typeof t){if(t<0||isNaN(t)){const e={params:{comparison:">=",limit:0}};null===a?a=[e]:a.push(e),l++}}else{const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}var h=u===l;if(f=f||h,!f){const e=l;if(l===e)if(t&&"object"==typeof t&&!Array.isArray(t))for(const e in t){const n=l;if("number"!=typeof t[e]){const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}if(n!==l)break}else{const e={params:{type:"object"}};null===a?a=[e]:a.push(e),l++}h=e===l,f=f||h}if(f)l=p,null!==a&&(p?a.length=p:a=null);else{const e={params:{}};null===a?a=[e]:a.push(e),l++}if(i===l&&(o=!0,s=0),!o){const e={params:{passingSchemas:s}};return null===a?a=[e]:a.push(e),l++,Oe.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),m=n===l}else m=!0;if(m){if(void 0!==e.maxInitialSize){let t=e.maxInitialSize;const n=l,r=l;let o=!1,s=null;const i=l,p=l;let f=!1;const u=l;if(l===u)if("number"==typeof t){if(t<0||isNaN(t)){const e={params:{comparison:">=",limit:0}};null===a?a=[e]:a.push(e),l++}}else{const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}var b=u===l;if(f=f||b,!f){const e=l;if(l===e)if(t&&"object"==typeof t&&!Array.isArray(t))for(const e in t){const n=l;if("number"!=typeof t[e]){const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}if(n!==l)break}else{const e={params:{type:"object"}};null===a?a=[e]:a.push(e),l++}b=e===l,f=f||b}if(f)l=p,null!==a&&(p?a.length=p:a=null);else{const e={params:{}};null===a?a=[e]:a.push(e),l++}if(i===l&&(o=!0,s=0),!o){const e={params:{passingSchemas:s}};return null===a?a=[e]:a.push(e),l++,Oe.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),m=n===l}else m=!0;if(m){if(void 0!==e.maxSize){let t=e.maxSize;const n=l,r=l;let o=!1,s=null;const i=l,p=l;let f=!1;const u=l;if(l===u)if("number"==typeof t){if(t<0||isNaN(t)){const e={params:{comparison:">=",limit:0}};null===a?a=[e]:a.push(e),l++}}else{const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}var g=u===l;if(f=f||g,!f){const e=l;if(l===e)if(t&&"object"==typeof t&&!Array.isArray(t))for(const e in t){const n=l;if("number"!=typeof t[e]){const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}if(n!==l)break}else{const e={params:{type:"object"}};null===a?a=[e]:a.push(e),l++}g=e===l,f=f||g}if(f)l=p,null!==a&&(p?a.length=p:a=null);else{const e={params:{}};null===a?a=[e]:a.push(e),l++}if(i===l&&(o=!0,s=0),!o){const e={params:{passingSchemas:s}};return null===a?a=[e]:a.push(e),l++,Oe.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),m=n===l}else m=!0;if(m){if(void 0!==e.minSize){let t=e.minSize;const n=l,r=l;let o=!1,s=null;const i=l,p=l;let f=!1;const u=l;if(l===u)if("number"==typeof t){if(t<0||isNaN(t)){const e={params:{comparison:">=",limit:0}};null===a?a=[e]:a.push(e),l++}}else{const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}var v=u===l;if(f=f||v,!f){const e=l;if(l===e)if(t&&"object"==typeof t&&!Array.isArray(t))for(const e in t){const n=l;if("number"!=typeof t[e]){const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}if(n!==l)break}else{const e={params:{type:"object"}};null===a?a=[e]:a.push(e),l++}v=e===l,f=f||v}if(f)l=p,null!==a&&(p?a.length=p:a=null);else{const e={params:{}};null===a?a=[e]:a.push(e),l++}if(i===l&&(o=!0,s=0),!o){const e={params:{passingSchemas:s}};return null===a?a=[e]:a.push(e),l++,Oe.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),m=n===l}else m=!0;if(m)if(void 0!==e.minSizeReduction){let t=e.minSizeReduction;const n=l,r=l;let o=!1,s=null;const i=l,p=l;let f=!1;const u=l;if(l===u)if("number"==typeof t){if(t<0||isNaN(t)){const e={params:{comparison:">=",limit:0}};null===a?a=[e]:a.push(e),l++}}else{const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}var P=u===l;if(f=f||P,!f){const e=l;if(l===e)if(t&&"object"==typeof t&&!Array.isArray(t))for(const e in t){const n=l;if("number"!=typeof t[e]){const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}if(n!==l)break}else{const e={params:{type:"object"}};null===a?a=[e]:a.push(e),l++}P=e===l,f=f||P}if(f)l=p,null!==a&&(p?a.length=p:a=null);else{const e={params:{}};null===a?a=[e]:a.push(e),l++}if(i===l&&(o=!0,s=0),!o){const e={params:{passingSchemas:s}};return null===a?a=[e]:a.push(e),l++,Oe.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),m=n===l}else m=!0}}}}}}}}p=n===l}else p=!0;if(p){if(void 0!==t.filename){let n=t.filename;const r=l,o=l;let s=!1;const i=l;if(l===i)if("string"==typeof n){if(n.includes("!")||!1!==e.test(n)){const e={params:{}};null===a?a=[e]:a.push(e),l++}else if(n.length<1){const e={params:{}};null===a?a=[e]:a.push(e),l++}}else{const e={params:{type:"string"}};null===a?a=[e]:a.push(e),l++}var D=i===l;if(s=s||D,!s){const e=l;if(!(n instanceof Function)){const e={params:{}};null===a?a=[e]:a.push(e),l++}D=e===l,s=s||D}if(!s){const e={params:{}};return null===a?a=[e]:a.push(e),l++,Oe.errors=a,!1}l=o,null!==a&&(o?a.length=o:a=null),p=r===l}else p=!0;if(p){if(void 0!==t.hidePathInfo){const e=l;if("boolean"!=typeof t.hidePathInfo)return Oe.errors=[{params:{type:"boolean"}}],!1;p=e===l}else p=!0;if(p){if(void 0!==t.maxAsyncRequests){let e=t.maxAsyncRequests;const n=l;if(l===n){if("number"!=typeof e)return Oe.errors=[{params:{type:"number"}}],!1;if(e<1||isNaN(e))return Oe.errors=[{params:{comparison:">=",limit:1}}],!1}p=n===l}else p=!0;if(p){if(void 0!==t.maxAsyncSize){let e=t.maxAsyncSize;const n=l,r=l;let o=!1,s=null;const i=l,f=l;let u=!1;const c=l;if(l===c)if("number"==typeof e){if(e<0||isNaN(e)){const e={params:{comparison:">=",limit:0}};null===a?a=[e]:a.push(e),l++}}else{const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}var O=c===l;if(u=u||O,!u){const t=l;if(l===t)if(e&&"object"==typeof e&&!Array.isArray(e))for(const t in e){const n=l;if("number"!=typeof e[t]){const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}if(n!==l)break}else{const e={params:{type:"object"}};null===a?a=[e]:a.push(e),l++}O=t===l,u=u||O}if(u)l=f,null!==a&&(f?a.length=f:a=null);else{const e={params:{}};null===a?a=[e]:a.push(e),l++}if(i===l&&(o=!0,s=0),!o){const e={params:{passingSchemas:s}};return null===a?a=[e]:a.push(e),l++,Oe.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),p=n===l}else p=!0;if(p){if(void 0!==t.maxInitialRequests){let e=t.maxInitialRequests;const n=l;if(l===n){if("number"!=typeof e)return Oe.errors=[{params:{type:"number"}}],!1;if(e<1||isNaN(e))return Oe.errors=[{params:{comparison:">=",limit:1}}],!1}p=n===l}else p=!0;if(p){if(void 0!==t.maxInitialSize){let e=t.maxInitialSize;const n=l,r=l;let o=!1,s=null;const i=l,f=l;let u=!1;const c=l;if(l===c)if("number"==typeof e){if(e<0||isNaN(e)){const e={params:{comparison:">=",limit:0}};null===a?a=[e]:a.push(e),l++}}else{const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}var C=c===l;if(u=u||C,!u){const t=l;if(l===t)if(e&&"object"==typeof e&&!Array.isArray(e))for(const t in e){const n=l;if("number"!=typeof e[t]){const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}if(n!==l)break}else{const e={params:{type:"object"}};null===a?a=[e]:a.push(e),l++}C=t===l,u=u||C}if(u)l=f,null!==a&&(f?a.length=f:a=null);else{const e={params:{}};null===a?a=[e]:a.push(e),l++}if(i===l&&(o=!0,s=0),!o){const e={params:{passingSchemas:s}};return null===a?a=[e]:a.push(e),l++,Oe.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),p=n===l}else p=!0;if(p){if(void 0!==t.maxSize){let e=t.maxSize;const n=l,r=l;let o=!1,s=null;const i=l,f=l;let u=!1;const c=l;if(l===c)if("number"==typeof e){if(e<0||isNaN(e)){const e={params:{comparison:">=",limit:0}};null===a?a=[e]:a.push(e),l++}}else{const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}var x=c===l;if(u=u||x,!u){const t=l;if(l===t)if(e&&"object"==typeof e&&!Array.isArray(e))for(const t in e){const n=l;if("number"!=typeof e[t]){const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}if(n!==l)break}else{const e={params:{type:"object"}};null===a?a=[e]:a.push(e),l++}x=t===l,u=u||x}if(u)l=f,null!==a&&(f?a.length=f:a=null);else{const e={params:{}};null===a?a=[e]:a.push(e),l++}if(i===l&&(o=!0,s=0),!o){const e={params:{passingSchemas:s}};return null===a?a=[e]:a.push(e),l++,Oe.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),p=n===l}else p=!0;if(p){if(void 0!==t.minChunks){let e=t.minChunks;const n=l;if(l===n){if("number"!=typeof e)return Oe.errors=[{params:{type:"number"}}],!1;if(e<1||isNaN(e))return Oe.errors=[{params:{comparison:">=",limit:1}}],!1}p=n===l}else p=!0;if(p){if(void 0!==t.minRemainingSize){let e=t.minRemainingSize;const n=l,r=l;let o=!1,s=null;const i=l,f=l;let u=!1;const c=l;if(l===c)if("number"==typeof e){if(e<0||isNaN(e)){const e={params:{comparison:">=",limit:0}};null===a?a=[e]:a.push(e),l++}}else{const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}var $=c===l;if(u=u||$,!u){const t=l;if(l===t)if(e&&"object"==typeof e&&!Array.isArray(e))for(const t in e){const n=l;if("number"!=typeof e[t]){const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}if(n!==l)break}else{const e={params:{type:"object"}};null===a?a=[e]:a.push(e),l++}$=t===l,u=u||$}if(u)l=f,null!==a&&(f?a.length=f:a=null);else{const e={params:{}};null===a?a=[e]:a.push(e),l++}if(i===l&&(o=!0,s=0),!o){const e={params:{passingSchemas:s}};return null===a?a=[e]:a.push(e),l++,Oe.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),p=n===l}else p=!0;if(p){if(void 0!==t.minSize){let e=t.minSize;const n=l,r=l;let o=!1,s=null;const i=l,f=l;let u=!1;const c=l;if(l===c)if("number"==typeof e){if(e<0||isNaN(e)){const e={params:{comparison:">=",limit:0}};null===a?a=[e]:a.push(e),l++}}else{const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}var A=c===l;if(u=u||A,!u){const t=l;if(l===t)if(e&&"object"==typeof e&&!Array.isArray(e))for(const t in e){const n=l;if("number"!=typeof e[t]){const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}if(n!==l)break}else{const e={params:{type:"object"}};null===a?a=[e]:a.push(e),l++}A=t===l,u=u||A}if(u)l=f,null!==a&&(f?a.length=f:a=null);else{const e={params:{}};null===a?a=[e]:a.push(e),l++}if(i===l&&(o=!0,s=0),!o){const e={params:{passingSchemas:s}};return null===a?a=[e]:a.push(e),l++,Oe.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),p=n===l}else p=!0;if(p){if(void 0!==t.minSizeReduction){let e=t.minSizeReduction;const n=l,r=l;let o=!1,s=null;const i=l,f=l;let u=!1;const c=l;if(l===c)if("number"==typeof e){if(e<0||isNaN(e)){const e={params:{comparison:">=",limit:0}};null===a?a=[e]:a.push(e),l++}}else{const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}var k=c===l;if(u=u||k,!u){const t=l;if(l===t)if(e&&"object"==typeof e&&!Array.isArray(e))for(const t in e){const n=l;if("number"!=typeof e[t]){const e={params:{type:"number"}};null===a?a=[e]:a.push(e),l++}if(n!==l)break}else{const e={params:{type:"object"}};null===a?a=[e]:a.push(e),l++}k=t===l,u=u||k}if(u)l=f,null!==a&&(f?a.length=f:a=null);else{const e={params:{}};null===a?a=[e]:a.push(e),l++}if(i===l&&(o=!0,s=0),!o){const e={params:{passingSchemas:s}};return null===a?a=[e]:a.push(e),l++,Oe.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),p=n===l}else p=!0;if(p){if(void 0!==t.name){let e=t.name;const n=l,r=l;let o=!1;const s=l;if(!1!==e){const e={params:{}};null===a?a=[e]:a.push(e),l++}var j=s===l;if(o=o||j,!o){const t=l;if("string"!=typeof e){const e={params:{type:"string"}};null===a?a=[e]:a.push(e),l++}if(j=t===l,o=o||j,!o){const t=l;if(!(e instanceof Function)){const e={params:{}};null===a?a=[e]:a.push(e),l++}j=t===l,o=o||j}}if(!o){const e={params:{}};return null===a?a=[e]:a.push(e),l++,Oe.errors=a,!1}l=r,null!==a&&(r?a.length=r:a=null),p=n===l}else p=!0;if(p)if(void 0!==t.usedExports){const e=l;if("boolean"!=typeof t.usedExports)return Oe.errors=[{params:{type:"boolean"}}],!1;p=e===l}else p=!0}}}}}}}}}}}}}}}}}}}}return Oe.errors=a,0===l}function Ce(e,{instancePath:t="",parentData:r,parentDataProperty:o,rootData:s=e}={}){let i=null,a=0;if(0===a){if(!e||"object"!=typeof e||Array.isArray(e))return Ce.errors=[{params:{type:"object"}}],!1;{const r=a;for(const t in e)if(!n.call(ge.properties,t))return Ce.errors=[{params:{additionalProperty:t}}],!1;if(r===a){if(void 0!==e.avoidEntryIife){const t=a;if("boolean"!=typeof e.avoidEntryIife)return Ce.errors=[{params:{type:"boolean"}}],!1;var l=t===a}else l=!0;if(l){if(void 0!==e.checkWasmTypes){const t=a;if("boolean"!=typeof e.checkWasmTypes)return Ce.errors=[{params:{type:"boolean"}}],!1;l=t===a}else l=!0;if(l){if(void 0!==e.chunkIds){let t=e.chunkIds;const n=a;if("natural"!==t&&"named"!==t&&"deterministic"!==t&&"size"!==t&&"total-size"!==t&&!1!==t)return Ce.errors=[{params:{}}],!1;l=n===a}else l=!0;if(l){if(void 0!==e.concatenateModules){const t=a;if("boolean"!=typeof e.concatenateModules)return Ce.errors=[{params:{type:"boolean"}}],!1;l=t===a}else l=!0;if(l){if(void 0!==e.emitOnErrors){const t=a;if("boolean"!=typeof e.emitOnErrors)return Ce.errors=[{params:{type:"boolean"}}],!1;l=t===a}else l=!0;if(l){if(void 0!==e.flagIncludedChunks){const t=a;if("boolean"!=typeof e.flagIncludedChunks)return Ce.errors=[{params:{type:"boolean"}}],!1;l=t===a}else l=!0;if(l){if(void 0!==e.innerGraph){const t=a;if("boolean"!=typeof e.innerGraph)return Ce.errors=[{params:{type:"boolean"}}],!1;l=t===a}else l=!0;if(l){if(void 0!==e.mangleExports){let t=e.mangleExports;const n=a,r=a;let o=!1;const s=a;if("size"!==t&&"deterministic"!==t){const e={params:{}};null===i?i=[e]:i.push(e),a++}var p=s===a;if(o=o||p,!o){const e=a;if("boolean"!=typeof t){const e={params:{type:"boolean"}};null===i?i=[e]:i.push(e),a++}p=e===a,o=o||p}if(!o){const e={params:{}};return null===i?i=[e]:i.push(e),a++,Ce.errors=i,!1}a=r,null!==i&&(r?i.length=r:i=null),l=n===a}else l=!0;if(l){if(void 0!==e.mangleWasmImports){const t=a;if("boolean"!=typeof e.mangleWasmImports)return Ce.errors=[{params:{type:"boolean"}}],!1;l=t===a}else l=!0;if(l){if(void 0!==e.mergeDuplicateChunks){const t=a;if("boolean"!=typeof e.mergeDuplicateChunks)return Ce.errors=[{params:{type:"boolean"}}],!1;l=t===a}else l=!0;if(l){if(void 0!==e.minimize){const t=a;if("boolean"!=typeof e.minimize)return Ce.errors=[{params:{type:"boolean"}}],!1;l=t===a}else l=!0;if(l){if(void 0!==e.minimizer){let t=e.minimizer;const n=a;if(a===n){if(!Array.isArray(t))return Ce.errors=[{params:{type:"array"}}],!1;{const e=t.length;for(let n=0;n=",limit:1}}],!1}u=n===f}else u=!0;if(u){if(void 0!==t.hashFunction){let e=t.hashFunction;const n=f,r=f;let o=!1;const s=f;if(f===s)if("string"==typeof e){if(e.length<1){const e={params:{}};null===l?l=[e]:l.push(e),f++}}else{const e={params:{type:"string"}};null===l?l=[e]:l.push(e),f++}var v=s===f;if(o=o||v,!o){const t=f;if(!(e instanceof Function)){const e={params:{}};null===l?l=[e]:l.push(e),f++}v=t===f,o=o||v}if(!o){const e={params:{}};return null===l?l=[e]:l.push(e),f++,Me.errors=l,!1}f=r,null!==l&&(r?l.length=r:l=null),u=n===f}else u=!0;if(u){if(void 0!==t.hashSalt){let e=t.hashSalt;const n=f;if(f==f){if("string"!=typeof e)return Me.errors=[{params:{type:"string"}}],!1;if(e.length<1)return Me.errors=[{params:{}}],!1}u=n===f}else u=!0;if(u){if(void 0!==t.hotUpdateChunkFilename){let n=t.hotUpdateChunkFilename;const r=f;if(f==f){if("string"!=typeof n)return Me.errors=[{params:{type:"string"}}],!1;if(n.includes("!")||!1!==e.test(n))return Me.errors=[{params:{}}],!1}u=r===f}else u=!0;if(u){if(void 0!==t.hotUpdateGlobal){const e=f;if("string"!=typeof t.hotUpdateGlobal)return Me.errors=[{params:{type:"string"}}],!1;u=e===f}else u=!0;if(u){if(void 0!==t.hotUpdateMainFilename){let n=t.hotUpdateMainFilename;const r=f;if(f==f){if("string"!=typeof n)return Me.errors=[{params:{type:"string"}}],!1;if(n.includes("!")||!1!==e.test(n))return Me.errors=[{params:{}}],!1}u=r===f}else u=!0;if(u){if(void 0!==t.ignoreBrowserWarnings){const e=f;if("boolean"!=typeof t.ignoreBrowserWarnings)return Me.errors=[{params:{type:"boolean"}}],!1;u=e===f}else u=!0;if(u){if(void 0!==t.iife){const e=f;if("boolean"!=typeof t.iife)return Me.errors=[{params:{type:"boolean"}}],!1;u=e===f}else u=!0;if(u){if(void 0!==t.importFunctionName){const e=f;if("string"!=typeof t.importFunctionName)return Me.errors=[{params:{type:"string"}}],!1;u=e===f}else u=!0;if(u){if(void 0!==t.importMetaName){const e=f;if("string"!=typeof t.importMetaName)return Me.errors=[{params:{type:"string"}}],!1;u=e===f}else u=!0;if(u){if(void 0!==t.library){const e=f;ze(t.library,{instancePath:r+"/library",parentData:t,parentDataProperty:"library",rootData:i})||(l=null===l?ze.errors:l.concat(ze.errors),f=l.length),u=e===f}else u=!0;if(u){if(void 0!==t.libraryExport){let e=t.libraryExport;const n=f,r=f;let o=!1,s=null;const i=f,a=f;let p=!1;const c=f;if(f===c)if(Array.isArray(e)){const t=e.length;for(let n=0;n=",limit:1}}],!1}c=t===f}else c=!0;if(c){if(void 0!==r.performance){const e=f;we(r.performance,{instancePath:o+"/performance",parentData:r,parentDataProperty:"performance",rootData:l})||(p=null===p?we.errors:p.concat(we.errors),f=p.length),c=e===f}else c=!0;if(c){if(void 0!==r.plugins){const e=f;Te(r.plugins,{instancePath:o+"/plugins",parentData:r,parentDataProperty:"plugins",rootData:l})||(p=null===p?Te.errors:p.concat(Te.errors),f=p.length),c=e===f}else c=!0;if(c){if(void 0!==r.profile){const e=f;if("boolean"!=typeof r.profile)return _e.errors=[{params:{type:"boolean"}}],!1;c=e===f}else c=!0;if(c){if(void 0!==r.recordsInputPath){let t=r.recordsInputPath;const n=f,o=f;let s=!1;const i=f;if(!1!==t){const e={params:{}};null===p?p=[e]:p.push(e),f++}var v=i===f;if(s=s||v,!s){const n=f;if(f===n)if("string"==typeof t){if(t.includes("!")||!0!==e.test(t)){const e={params:{}};null===p?p=[e]:p.push(e),f++}}else{const e={params:{type:"string"}};null===p?p=[e]:p.push(e),f++}v=n===f,s=s||v}if(!s){const e={params:{}};return null===p?p=[e]:p.push(e),f++,_e.errors=p,!1}f=o,null!==p&&(o?p.length=o:p=null),c=n===f}else c=!0;if(c){if(void 0!==r.recordsOutputPath){let t=r.recordsOutputPath;const n=f,o=f;let s=!1;const i=f;if(!1!==t){const e={params:{}};null===p?p=[e]:p.push(e),f++}var P=i===f;if(s=s||P,!s){const n=f;if(f===n)if("string"==typeof t){if(t.includes("!")||!0!==e.test(t)){const e={params:{}};null===p?p=[e]:p.push(e),f++}}else{const e={params:{type:"string"}};null===p?p=[e]:p.push(e),f++}P=n===f,s=s||P}if(!s){const e={params:{}};return null===p?p=[e]:p.push(e),f++,_e.errors=p,!1}f=o,null!==p&&(o?p.length=o:p=null),c=n===f}else c=!0;if(c){if(void 0!==r.recordsPath){let t=r.recordsPath;const n=f,o=f;let s=!1;const i=f;if(!1!==t){const e={params:{}};null===p?p=[e]:p.push(e),f++}var D=i===f;if(s=s||D,!s){const n=f;if(f===n)if("string"==typeof t){if(t.includes("!")||!0!==e.test(t)){const e={params:{}};null===p?p=[e]:p.push(e),f++}}else{const e={params:{type:"string"}};null===p?p=[e]:p.push(e),f++}D=n===f,s=s||D}if(!s){const e={params:{}};return null===p?p=[e]:p.push(e),f++,_e.errors=p,!1}f=o,null!==p&&(o?p.length=o:p=null),c=n===f}else c=!0;if(c){if(void 0!==r.resolve){const e=f;Ie(r.resolve,{instancePath:o+"/resolve",parentData:r,parentDataProperty:"resolve",rootData:l})||(p=null===p?Ie.errors:p.concat(Ie.errors),f=p.length),c=e===f}else c=!0;if(c){if(void 0!==r.resolveLoader){const e=f;Ne(r.resolveLoader,{instancePath:o+"/resolveLoader",parentData:r,parentDataProperty:"resolveLoader",rootData:l})||(p=null===p?Ne.errors:p.concat(Ne.errors),f=p.length),c=e===f}else c=!0;if(c){if(void 0!==r.snapshot){let t=r.snapshot;const n=f;if(f==f){if(!t||"object"!=typeof t||Array.isArray(t))return _e.errors=[{params:{type:"object"}}],!1;{const n=f;for(const e in t)if("buildDependencies"!==e&&"immutablePaths"!==e&&"managedPaths"!==e&&"module"!==e&&"resolve"!==e&&"resolveBuildDependencies"!==e&&"unmanagedPaths"!==e)return _e.errors=[{params:{additionalProperty:e}}],!1;if(n===f){if(void 0!==t.buildDependencies){let e=t.buildDependencies;const n=f;if(f===n){if(!e||"object"!=typeof e||Array.isArray(e))return _e.errors=[{params:{type:"object"}}],!1;{const t=f;for(const t in e)if("hash"!==t&&"timestamp"!==t)return _e.errors=[{params:{additionalProperty:t}}],!1;if(t===f){if(void 0!==e.hash){const t=f;if("boolean"!=typeof e.hash)return _e.errors=[{params:{type:"boolean"}}],!1;var O=t===f}else O=!0;if(O)if(void 0!==e.timestamp){const t=f;if("boolean"!=typeof e.timestamp)return _e.errors=[{params:{type:"boolean"}}],!1;O=t===f}else O=!0}}}var C=n===f}else C=!0;if(C){if(void 0!==t.immutablePaths){let n=t.immutablePaths;const r=f;if(f===r){if(!Array.isArray(n))return _e.errors=[{params:{type:"array"}}],!1;{const t=n.length;for(let r=0;r EntryStatic | Promise)" + "AmdContainer": { + "description": "Add a container for define/require functions in the AMD module.", + "type": "string", + "minLength": 1 }, - "EntryItem": { - "oneOf": [ + "AssetFilterItemTypes": { + "description": "Filtering value, regexp or function.", + "cli": { + "helper": true + }, + "anyOf": [ + { + "instanceof": "RegExp", + "tsType": "RegExp" + }, { - "description": "An entry point without name. The string is resolved to a module which is loaded upon startup.", "type": "string", - "minLength": 1 + "absolutePath": false }, { - "description": "An entry point without name. All modules are loaded upon startup. The last one is exported.", - "anyOf": [ - { - "$ref": "#/definitions/NonEmptyArrayOfUniqueStringValues" - } - ] + "instanceof": "Function", + "tsType": "((name: string, asset: import('../lib/stats/DefaultStatsFactoryPlugin').StatsAsset) => boolean)" } ] }, - "EntryObject": { - "description": "Multiple entry bundles are created. The key is the chunk name. The value can be a string or an array.", - "type": "object", - "additionalProperties": { - "description": "An entry point with name", - "oneOf": [ - { - "description": "The string is resolved to a module which is loaded upon startup.", - "type": "string", - "minLength": 1 - }, - { - "description": "All modules are loaded upon startup. The last one is exported.", - "anyOf": [ + "AssetFilterTypes": { + "description": "Filtering modules.", + "cli": { + "helper": true + }, + "anyOf": [ + { + "type": "array", + "items": { + "description": "Rule to filter.", + "cli": { + "helper": true + }, + "oneOf": [ { - "$ref": "#/definitions/NonEmptyArrayOfUniqueStringValues" + "$ref": "#/definitions/AssetFilterItemTypes" } ] } - ] - }, - "minProperties": 1 - }, - "EntryStatic": { - "oneOf": [ - { - "$ref": "#/definitions/EntryObject" }, { - "$ref": "#/definitions/EntryItem" + "$ref": "#/definitions/AssetFilterItemTypes" } ] }, - "ExternalItem": { + "AssetGeneratorDataUrl": { + "description": "The options for data url generator.", "anyOf": [ { - "description": "An exact matched dependency becomes external. The same string is used as external dependency.", - "type": "string" - }, - { - "description": "If an dependency matches exactly a property of the object, the property value is used as dependency.", - "type": "object", - "additionalProperties": { - "description": "The dependency used for the external", - "anyOf": [ - { - "type": "string" - }, - { - "type": "object" - }, - { - "$ref": "#/definitions/ArrayOfStringValues" - }, - { - "type": "boolean" - } - ] - } + "$ref": "#/definitions/AssetGeneratorDataUrlOptions" }, { - "description": "Every matched dependency becomes external.", - "instanceof": "RegExp", - "tsType": "RegExp" + "$ref": "#/definitions/AssetGeneratorDataUrlFunction" } ] }, - "Externals": { - "anyOf": [ - { - "description": "`function(context, request, callback(err, result))` The function is called on each dependency.", - "instanceof": "Function", - "tsType": "((context: string, request: string, callback: (err?: Error, result?: string) => void) => void)" + "AssetGeneratorDataUrlFunction": { + "description": "Function that executes for module and should return an DataUrl string. It can have a string as 'ident' property which contributes to the module hash.", + "instanceof": "Function", + "tsType": "((source: string | Buffer, context: { filename: string, module: import('../lib/Module') }) => string)" + }, + "AssetGeneratorDataUrlOptions": { + "description": "Options object for data url generation.", + "type": "object", + "additionalProperties": false, + "properties": { + "encoding": { + "description": "Asset encoding (defaults to base64).", + "enum": [false, "base64"] }, - { - "$ref": "#/definitions/ExternalItem" + "mimetype": { + "description": "Asset mimetype (getting from file extension by default).", + "type": "string" + } + } + }, + "AssetGeneratorOptions": { + "description": "Generator options for asset modules.", + "type": "object", + "implements": [ + "#/definitions/AssetInlineGeneratorOptions", + "#/definitions/AssetResourceGeneratorOptions" + ], + "additionalProperties": false, + "properties": { + "binary": { + "description": "Whether or not this asset module should be considered binary. This can be set to 'false' to treat this asset module as text.", + "type": "boolean" }, - { - "type": "array", - "items": { - "description": "External configuration", - "anyOf": [ - { - "description": "`function(context, request, callback(err, result))` The function is called on each dependency.", - "instanceof": "Function", - "tsType": "((context: string, request: string, callback: (err?: Error, result?: string) => void) => void)" - }, - { - "$ref": "#/definitions/ExternalItem" - } - ] - } + "dataUrl": { + "$ref": "#/definitions/AssetGeneratorDataUrl" + }, + "emit": { + "description": "Emit an output asset from this asset module. This can be set to 'false' to omit emitting e. g. for SSR.", + "type": "boolean" + }, + "filename": { + "$ref": "#/definitions/FilenameTemplate" + }, + "outputPath": { + "$ref": "#/definitions/AssetModuleOutputPath" + }, + "publicPath": { + "$ref": "#/definitions/RawPublicPath" } - ] + } }, - "FilterItemTypes": { - "anyOf": [ - { - "instanceof": "RegExp", - "tsType": "RegExp" + "AssetInlineGeneratorOptions": { + "description": "Generator options for asset/inline modules.", + "type": "object", + "additionalProperties": false, + "properties": { + "binary": { + "description": "Whether or not this asset module should be considered binary. This can be set to 'false' to treat this asset module as text.", + "type": "boolean" }, + "dataUrl": { + "$ref": "#/definitions/AssetGeneratorDataUrl" + } + } + }, + "AssetModuleFilename": { + "description": "The filename of asset modules as relative path inside the 'output.path' directory.", + "anyOf": [ { - "type": "string" + "type": "string", + "absolutePath": false }, { "instanceof": "Function", - "tsType": "Function" + "tsType": "((pathData: import(\"../lib/Compilation\").PathData, assetInfo?: import(\"../lib/Compilation\").AssetInfo) => string)" } ] }, - "FilterTypes": { + "AssetModuleOutputPath": { + "description": "Emit the asset in the specified folder relative to 'output.path'. This should only be needed when custom 'publicPath' is specified to match the folder structure there.", "anyOf": [ { - "$ref": "#/definitions/FilterItemTypes" + "type": "string", + "absolutePath": false }, { - "type": "array", - "items": { - "description": "Rule to filter", - "anyOf": [ - { - "$ref": "#/definitions/FilterItemTypes" - } - ] - } + "instanceof": "Function", + "tsType": "((pathData: import(\"../lib/Compilation\").PathData, assetInfo?: import(\"../lib/Compilation\").AssetInfo) => string)" } ] }, - "LibraryCustomUmdObject": { + "AssetParserDataUrlFunction": { + "description": "Function that executes for module and should return whenever asset should be inlined as DataUrl.", + "instanceof": "Function", + "tsType": "((source: string | Buffer, context: { filename: string, module: import('../lib/Module') }) => boolean)" + }, + "AssetParserDataUrlOptions": { + "description": "Options object for DataUrl condition.", "type": "object", "additionalProperties": false, "properties": { - "amd": { - "description": "Name of the exposed AMD library in the UMD", - "type": "string" - }, - "commonjs": { - "description": "Name of the exposed commonjs export in the UMD", - "type": "string" - }, - "root": { - "description": "Name of the property exposed globally by a UMD library", + "maxSize": { + "description": "Maximum size of asset that should be inline as modules. Default: 8kb.", + "type": "number" + } + } + }, + "AssetParserOptions": { + "description": "Parser options for asset modules.", + "type": "object", + "additionalProperties": false, + "properties": { + "dataUrlCondition": { + "description": "The condition for inlining the asset as DataUrl.", "anyOf": [ { - "type": "string" + "$ref": "#/definitions/AssetParserDataUrlOptions" }, { - "$ref": "#/definitions/ArrayOfStringValues" + "$ref": "#/definitions/AssetParserDataUrlFunction" } ] } } }, - "ModuleOptions": { + "AssetResourceGeneratorOptions": { + "description": "Generator options for asset/resource modules.", "type": "object", "additionalProperties": false, "properties": { - "defaultRules": { - "description": "An array of rules applied by default for modules.", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetRules" - } - ] - }, - "exprContextCritical": { - "description": "Enable warnings for full dynamic dependencies", + "binary": { + "description": "Whether or not this asset module should be considered binary. This can be set to 'false' to treat this asset module as text.", "type": "boolean" }, - "exprContextRecursive": { - "description": "Enable recursive directory lookup for full dynamic dependencies", + "emit": { + "description": "Emit an output asset from this asset module. This can be set to 'false' to omit emitting e. g. for SSR.", "type": "boolean" }, - "exprContextRegExp": { - "description": "Sets the default regular expression for full dynamic dependencies", - "anyOf": [ - { - "type": "boolean" - }, - { - "instanceof": "RegExp", - "tsType": "RegExp" - } - ] + "filename": { + "$ref": "#/definitions/FilenameTemplate" }, - "exprContextRequest": { - "description": "Set the default request for full dynamic dependencies", + "outputPath": { + "$ref": "#/definitions/AssetModuleOutputPath" + }, + "publicPath": { + "$ref": "#/definitions/RawPublicPath" + } + } + }, + "AuxiliaryComment": { + "description": "Add a comment in the UMD wrapper.", + "anyOf": [ + { + "description": "Append the same comment above each import style.", "type": "string" }, - "noParse": { - "description": "Don't parse files matching. It's matched against the full resolved request.", - "anyOf": [ - { - "type": "array", - "items": { - "description": "A regular expression, when matched the module is not parsed", - "instanceof": "RegExp", - "tsType": "RegExp" - }, - "minItems": 1 - }, - { - "instanceof": "RegExp", - "tsType": "RegExp" - }, - { - "instanceof": "Function", - "tsType": "Function" - }, - { - "type": "array", - "items": { - "description": "An absolute path, when the module starts with this path it is not parsed", - "type": "string", - "absolutePath": true - }, - "minItems": 1 - }, - { - "type": "string", - "absolutePath": true - } - ] + { + "$ref": "#/definitions/LibraryCustomUmdCommentObject" + } + ] + }, + "Bail": { + "description": "Report the first error as a hard error instead of tolerating it.", + "type": "boolean" + }, + "CacheOptions": { + "description": "Cache generated modules and chunks to improve performance for multiple incremental builds.", + "anyOf": [ + { + "description": "Enable in memory caching.", + "enum": [true] }, - "rules": { - "description": "An array of rules applied for modules.", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetRules" - } - ] + { + "$ref": "#/definitions/CacheOptionsNormalized" + } + ] + }, + "CacheOptionsNormalized": { + "description": "Cache generated modules and chunks to improve performance for multiple incremental builds.", + "anyOf": [ + { + "description": "Disable caching.", + "enum": [false] }, - "strictExportPresence": { - "description": "Emit errors instead of warnings when imported names don't exist in imported module", - "type": "boolean" + { + "$ref": "#/definitions/MemoryCacheOptions" }, - "strictThisContextOnImports": { - "description": "Handle the this context correctly according to the spec for namespace objects", - "type": "boolean" + { + "$ref": "#/definitions/FileCacheOptions" + } + ] + }, + "Charset": { + "description": "Add charset attribute for script tag.", + "type": "boolean" + }, + "ChunkFilename": { + "description": "Specifies the filename template of output files of non-initial chunks on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.", + "oneOf": [ + { + "$ref": "#/definitions/FilenameTemplate" + } + ] + }, + "ChunkFormat": { + "description": "The format of chunks (formats included by default are 'array-push' (web/WebWorker), 'commonjs' (node.js), 'module' (ESM), but others might be added by plugins).", + "anyOf": [ + { + "enum": ["array-push", "commonjs", "module", false] }, - "unknownContextCritical": { - "description": "Enable warnings when using the require function in a not statically analyse-able way", + { + "type": "string" + } + ] + }, + "ChunkLoadTimeout": { + "description": "Number of milliseconds before chunk request expires.", + "type": "number" + }, + "ChunkLoading": { + "description": "The method of loading chunks (methods included by default are 'jsonp' (web), 'import' (ESM), 'importScripts' (WebWorker), 'require' (sync node.js), 'async-node' (async node.js), but others might be added by plugins).", + "anyOf": [ + { + "enum": [false] + }, + { + "$ref": "#/definitions/ChunkLoadingType" + } + ] + }, + "ChunkLoadingGlobal": { + "description": "The global variable used by webpack for loading of chunks.", + "type": "string" + }, + "ChunkLoadingType": { + "description": "The method of loading chunks (methods included by default are 'jsonp' (web), 'import' (ESM), 'importScripts' (WebWorker), 'require' (sync node.js), 'async-node' (async node.js), but others might be added by plugins).", + "anyOf": [ + { + "enum": ["jsonp", "import-scripts", "require", "async-node", "import"] + }, + { + "type": "string" + } + ] + }, + "Clean": { + "description": "Clean the output directory before emit.", + "anyOf": [ + { "type": "boolean" }, - "unknownContextRecursive": { - "description": "Enable recursive directory lookup when using the require function in a not statically analyse-able way", + { + "$ref": "#/definitions/CleanOptions" + } + ] + }, + "CleanOptions": { + "description": "Advanced options for cleaning assets.", + "type": "object", + "additionalProperties": false, + "properties": { + "dry": { + "description": "Log the assets that should be removed instead of deleting them.", "type": "boolean" }, - "unknownContextRegExp": { - "description": "Sets the regular expression when using the require function in a not statically analyse-able way", + "keep": { + "description": "Keep these assets.", "anyOf": [ - { - "type": "boolean" - }, { "instanceof": "RegExp", "tsType": "RegExp" - } - ] - }, - "unknownContextRequest": { - "description": "Sets the request when using the require function in a not statically analyse-able way", - "type": "string" - }, - "unsafeCache": { - "description": "Cache the resolving of module requests", - "anyOf": [ + }, { - "type": "boolean" + "type": "string", + "absolutePath": false }, { "instanceof": "Function", - "tsType": "Function" + "tsType": "((filename: string) => boolean)" } ] + } + } + }, + "CompareBeforeEmit": { + "description": "Check if to be emitted file already exists and have the same content before writing to output filesystem.", + "type": "boolean" + }, + "Context": { + "description": "The base directory (absolute path!) for resolving the `entry` option. If `output.pathinfo` is set, the included pathinfo is shortened to this directory.", + "type": "string", + "absolutePath": true + }, + "CrossOriginLoading": { + "description": "This option enables cross-origin loading of chunks.", + "enum": [false, "anonymous", "use-credentials"] + }, + "CssAutoGeneratorOptions": { + "description": "Generator options for css/auto modules.", + "type": "object", + "additionalProperties": false, + "properties": { + "esModule": { + "$ref": "#/definitions/CssGeneratorEsModule" }, - "wrappedContextCritical": { - "description": "Enable warnings for partial dynamic dependencies", - "type": "boolean" + "exportsConvention": { + "$ref": "#/definitions/CssGeneratorExportsConvention" }, - "wrappedContextRecursive": { - "description": "Enable recursive directory lookup for partial dynamic dependencies", - "type": "boolean" + "exportsOnly": { + "$ref": "#/definitions/CssGeneratorExportsOnly" }, - "wrappedContextRegExp": { - "description": "Set the inner regular expression for partial dynamic dependencies", - "instanceof": "RegExp", - "tsType": "RegExp" + "localIdentName": { + "$ref": "#/definitions/CssGeneratorLocalIdentName" } } }, - "NodeOptions": { + "CssAutoParserOptions": { + "description": "Parser options for css/auto modules.", "type": "object", - "additionalProperties": { - "description": "Include a polyfill for the node.js module", - "enum": [false, true, "mock", "empty"] - }, + "additionalProperties": false, "properties": { - "Buffer": { - "description": "Include a polyfill for the 'Buffer' variable", - "enum": [false, true, "mock"] + "import": { + "$ref": "#/definitions/CssParserImport" }, - "__dirname": { - "description": "Include a polyfill for the '__dirname' variable", - "enum": [false, true, "mock"] - }, - "__filename": { - "description": "Include a polyfill for the '__filename' variable", - "enum": [false, true, "mock"] + "namedExports": { + "$ref": "#/definitions/CssParserNamedExports" }, - "console": { - "description": "Include a polyfill for the 'console' variable", - "enum": [false, true, "mock"] + "url": { + "$ref": "#/definitions/CssParserUrl" + } + } + }, + "CssChunkFilename": { + "description": "Specifies the filename template of non-initial output css files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.", + "oneOf": [ + { + "$ref": "#/definitions/FilenameTemplate" + } + ] + }, + "CssFilename": { + "description": "Specifies the filename template of output css files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.", + "oneOf": [ + { + "$ref": "#/definitions/FilenameTemplate" + } + ] + }, + "CssGeneratorEsModule": { + "description": "Configure the generated JS modules that use the ES modules syntax.", + "type": "boolean" + }, + "CssGeneratorExportsConvention": { + "description": "Specifies the convention of exported names.", + "anyOf": [ + { + "enum": [ + "as-is", + "camel-case", + "camel-case-only", + "dashes", + "dashes-only" + ] }, - "global": { - "description": "Include a polyfill for the 'global' variable", - "type": "boolean" + { + "instanceof": "Function", + "tsType": "((name: string) => string)" + } + ] + }, + "CssGeneratorExportsOnly": { + "description": "Avoid generating and loading a stylesheet and only embed exports from css into output javascript files.", + "type": "boolean" + }, + "CssGeneratorLocalIdentName": { + "description": "Configure the generated local ident name.", + "type": "string" + }, + "CssGeneratorOptions": { + "description": "Generator options for css modules.", + "type": "object", + "additionalProperties": false, + "properties": { + "esModule": { + "$ref": "#/definitions/CssGeneratorEsModule" }, - "process": { - "description": "Include a polyfill for the 'process' variable", - "enum": [false, true, "mock"] + "exportsOnly": { + "$ref": "#/definitions/CssGeneratorExportsOnly" } } }, - "NonEmptyArrayOfUniqueStringValues": { - "type": "array", - "items": { - "description": "A non-empty string", - "type": "string", - "minLength": 1 - }, - "minItems": 1, - "uniqueItems": true - }, - "OptimizationOptions": { - "description": "Enables/Disables integrated optimizations", + "CssGlobalGeneratorOptions": { + "description": "Generator options for css/global modules.", "type": "object", "additionalProperties": false, "properties": { - "checkWasmTypes": { - "description": "Check for incompatible wasm types when importing/exporting from/to ESM", - "type": "boolean" + "esModule": { + "$ref": "#/definitions/CssGeneratorEsModule" }, - "chunkIds": { - "description": "Define the algorithm to choose chunk ids (named: readable ids for better debugging, size: numeric ids focused on minimal initial download size, total-size: numeric ids focused on minimal total download size, false: no algorithm used, as custom one can be provided via plugin)", - "enum": ["natural", "named", "size", "total-size", false] + "exportsConvention": { + "$ref": "#/definitions/CssGeneratorExportsConvention" }, - "concatenateModules": { - "description": "Concatenate modules when possible to generate less modules, more efficient code and enable more optimizations by the minimizer", - "type": "boolean" + "exportsOnly": { + "$ref": "#/definitions/CssGeneratorExportsOnly" }, - "flagIncludedChunks": { - "description": "Also flag chunks as loaded which contain a subset of the modules", - "type": "boolean" + "localIdentName": { + "$ref": "#/definitions/CssGeneratorLocalIdentName" + } + } + }, + "CssGlobalParserOptions": { + "description": "Parser options for css/global modules.", + "type": "object", + "additionalProperties": false, + "properties": { + "import": { + "$ref": "#/definitions/CssParserImport" }, - "hashedModuleIds": { - "description": "Use hashed module id instead module identifiers for better long term caching (deprecated, used moduleIds: hashed instead)", - "type": "boolean" + "namedExports": { + "$ref": "#/definitions/CssParserNamedExports" }, - "mangleWasmImports": { - "description": "Reduce size of WASM by changing imports to shorter strings.", - "type": "boolean" + "url": { + "$ref": "#/definitions/CssParserUrl" + } + } + }, + "CssModuleGeneratorOptions": { + "description": "Generator options for css/module modules.", + "type": "object", + "additionalProperties": false, + "properties": { + "esModule": { + "$ref": "#/definitions/CssGeneratorEsModule" }, - "mergeDuplicateChunks": { - "description": "Merge chunks which contain the same modules", - "type": "boolean" + "exportsConvention": { + "$ref": "#/definitions/CssGeneratorExportsConvention" }, - "minimize": { - "description": "Enable minimizing the output. Uses optimization.minimizer.", - "type": "boolean" + "exportsOnly": { + "$ref": "#/definitions/CssGeneratorExportsOnly" }, - "minimizer": { - "description": "Minimizer(s) to use for minimizing the output", - "type": "array", - "items": { - "description": "Plugin of type object or instanceof Function", - "anyOf": [ - { - "$ref": "#/definitions/WebpackPluginInstance" - }, - { - "$ref": "#/definitions/WebpackPluginFunction" - } - ] - } + "localIdentName": { + "$ref": "#/definitions/CssGeneratorLocalIdentName" + } + } + }, + "CssModuleParserOptions": { + "description": "Parser options for css/module modules.", + "type": "object", + "additionalProperties": false, + "properties": { + "import": { + "$ref": "#/definitions/CssParserImport" }, - "moduleIds": { - "description": "Define the algorithm to choose module ids (natural: numeric ids in order of usage, named: readable ids for better debugging, hashed: short hashes as ids for better long term caching, size: numeric ids focused on minimal initial download size, total-size: numeric ids focused on minimal total download size, false: no algorithm used, as custom one can be provided via plugin)", - "enum": ["natural", "named", "hashed", "size", "total-size", false] + "namedExports": { + "$ref": "#/definitions/CssParserNamedExports" }, - "namedChunks": { - "description": "Use readable chunk identifiers for better debugging (deprecated, used chunkIds: named instead)", - "type": "boolean" + "url": { + "$ref": "#/definitions/CssParserUrl" + } + } + }, + "CssParserImport": { + "description": "Enable/disable `@import` at-rules handling.", + "type": "boolean" + }, + "CssParserNamedExports": { + "description": "Use ES modules named export for css exports.", + "type": "boolean" + }, + "CssParserOptions": { + "description": "Parser options for css modules.", + "type": "object", + "additionalProperties": false, + "properties": { + "import": { + "$ref": "#/definitions/CssParserImport" }, - "namedModules": { - "description": "Use readable module identifiers for better debugging (deprecated, used moduleIds: named instead)", - "type": "boolean" + "namedExports": { + "$ref": "#/definitions/CssParserNamedExports" }, - "noEmitOnErrors": { - "description": "Avoid emitting assets when errors occur", - "type": "boolean" + "url": { + "$ref": "#/definitions/CssParserUrl" + } + } + }, + "CssParserUrl": { + "description": "Enable/disable `url()`/`image-set()`/`src()`/`image()` functions handling.", + "type": "boolean" + }, + "Dependencies": { + "description": "References to other configurations to depend on.", + "type": "array", + "items": { + "description": "References to another configuration to depend on.", + "type": "string" + } + }, + "DevServer": { + "description": "Options for the webpack-dev-server.", + "anyOf": [ + { + "description": "Disable dev server.", + "enum": [false] }, - "nodeEnv": { - "description": "Set process.env.NODE_ENV to a specific value", - "anyOf": [ - { - "enum": [false] - }, - { - "type": "string" - } - ] + { + "description": "Options for the webpack-dev-server.", + "type": "object" + } + ] + }, + "DevTool": { + "description": "A developer tool to enhance debugging (false | eval | [inline-|hidden-|eval-][nosources-][cheap-[module-]]source-map).", + "anyOf": [ + { + "enum": [false, "eval"] }, - "occurrenceOrder": { - "description": "Figure out a order of modules which results in the smallest initial bundle", - "type": "boolean" + { + "type": "string", + "pattern": "^(inline-|hidden-|eval-)?(nosources-)?(cheap-(module-)?)?source-map(-debugids)?$" + } + ] + }, + "DevtoolFallbackModuleFilenameTemplate": { + "description": "Similar to `output.devtoolModuleFilenameTemplate`, but used in the case of duplicate module identifiers.", + "anyOf": [ + { + "type": "string" }, - "portableRecords": { - "description": "Generate records with relative paths to be able to move the context folder", - "type": "boolean" + { + "instanceof": "Function", + "tsType": "((context: TODO) => string)" + } + ] + }, + "DevtoolModuleFilenameTemplate": { + "description": "Filename template string of function for the sources array in a generated SourceMap.", + "anyOf": [ + { + "type": "string" + }, + { + "instanceof": "Function", + "tsType": "import('../lib/ModuleFilenameHelpers').ModuleFilenameTemplateFunction" + } + ] + }, + "DevtoolNamespace": { + "description": "Module namespace to use when interpolating filename template string for the sources array in a generated SourceMap. Defaults to `output.library` if not set. It's useful for avoiding runtime collisions in sourcemaps from multiple webpack projects built as libraries.", + "type": "string" + }, + "EmptyGeneratorOptions": { + "description": "No generator options are supported for this module type.", + "type": "object", + "additionalProperties": false + }, + "EmptyParserOptions": { + "description": "No parser options are supported for this module type.", + "type": "object", + "additionalProperties": false + }, + "EnabledChunkLoadingTypes": { + "description": "List of chunk loading types enabled for use by entry points.", + "type": "array", + "items": { + "$ref": "#/definitions/ChunkLoadingType" + } + }, + "EnabledLibraryTypes": { + "description": "List of library types enabled for use by entry points.", + "type": "array", + "items": { + "$ref": "#/definitions/LibraryType" + } + }, + "EnabledWasmLoadingTypes": { + "description": "List of wasm loading types enabled for use by entry points.", + "type": "array", + "items": { + "$ref": "#/definitions/WasmLoadingType" + } + }, + "Entry": { + "description": "The entry point(s) of the compilation.", + "anyOf": [ + { + "$ref": "#/definitions/EntryDynamic" + }, + { + "$ref": "#/definitions/EntryStatic" + } + ] + }, + "EntryDescription": { + "description": "An object with entry point description.", + "type": "object", + "additionalProperties": false, + "properties": { + "asyncChunks": { + "description": "Enable/disable creating async chunks that are loaded on demand.", + "type": "boolean" + }, + "baseUri": { + "description": "Base uri for this entry.", + "type": "string" + }, + "chunkLoading": { + "$ref": "#/definitions/ChunkLoading" + }, + "dependOn": { + "description": "The entrypoints that the current entrypoint depend on. They must be loaded when this entrypoint is loaded.", + "anyOf": [ + { + "description": "The entrypoints that the current entrypoint depend on. They must be loaded when this entrypoint is loaded.", + "type": "array", + "items": { + "description": "An entrypoint that the current entrypoint depend on. It must be loaded when this entrypoint is loaded.", + "type": "string", + "minLength": 1 + }, + "minItems": 1, + "uniqueItems": true + }, + { + "description": "An entrypoint that the current entrypoint depend on. It must be loaded when this entrypoint is loaded.", + "type": "string", + "minLength": 1 + } + ] + }, + "filename": { + "$ref": "#/definitions/EntryFilename" + }, + "import": { + "$ref": "#/definitions/EntryItem" + }, + "layer": { + "$ref": "#/definitions/Layer" + }, + "library": { + "$ref": "#/definitions/LibraryOptions" + }, + "publicPath": { + "$ref": "#/definitions/PublicPath" + }, + "runtime": { + "$ref": "#/definitions/EntryRuntime" + }, + "wasmLoading": { + "$ref": "#/definitions/WasmLoading" + } + }, + "required": ["import"] + }, + "EntryDescriptionNormalized": { + "description": "An object with entry point description.", + "type": "object", + "additionalProperties": false, + "properties": { + "asyncChunks": { + "description": "Enable/disable creating async chunks that are loaded on demand.", + "type": "boolean" + }, + "baseUri": { + "description": "Base uri for this entry.", + "type": "string" + }, + "chunkLoading": { + "$ref": "#/definitions/ChunkLoading" + }, + "dependOn": { + "description": "The entrypoints that the current entrypoint depend on. They must be loaded when this entrypoint is loaded.", + "type": "array", + "items": { + "description": "An entrypoint that the current entrypoint depend on. It must be loaded when this entrypoint is loaded.", + "type": "string", + "minLength": 1 + }, + "minItems": 1, + "uniqueItems": true + }, + "filename": { + "$ref": "#/definitions/Filename" + }, + "import": { + "description": "Module(s) that are loaded upon startup. The last one is exported.", + "type": "array", + "items": { + "description": "Module that is loaded upon startup. Only the last one is exported.", + "type": "string", + "minLength": 1 + }, + "minItems": 1, + "uniqueItems": true + }, + "layer": { + "$ref": "#/definitions/Layer" + }, + "library": { + "$ref": "#/definitions/LibraryOptions" + }, + "publicPath": { + "$ref": "#/definitions/PublicPath" + }, + "runtime": { + "$ref": "#/definitions/EntryRuntime" + }, + "wasmLoading": { + "$ref": "#/definitions/WasmLoading" + } + } + }, + "EntryDynamic": { + "description": "A Function returning an entry object, an entry string, an entry array or a promise to these things.", + "instanceof": "Function", + "tsType": "(() => EntryStatic | Promise)" + }, + "EntryDynamicNormalized": { + "description": "A Function returning a Promise resolving to a normalized entry.", + "instanceof": "Function", + "tsType": "(() => Promise)" + }, + "EntryFilename": { + "description": "Specifies the filename of the output file on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.", + "oneOf": [ + { + "$ref": "#/definitions/FilenameTemplate" + } + ] + }, + "EntryItem": { + "description": "Module(s) that are loaded upon startup.", + "anyOf": [ + { + "description": "All modules are loaded upon startup. The last one is exported.", + "type": "array", + "items": { + "description": "A module that is loaded upon startup. Only the last one is exported.", + "type": "string", + "minLength": 1 + }, + "minItems": 1, + "uniqueItems": true + }, + { + "description": "The string is resolved to a module which is loaded upon startup.", + "type": "string", + "minLength": 1 + } + ] + }, + "EntryNormalized": { + "description": "The entry point(s) of the compilation.", + "anyOf": [ + { + "$ref": "#/definitions/EntryDynamicNormalized" + }, + { + "$ref": "#/definitions/EntryStaticNormalized" + } + ] + }, + "EntryObject": { + "description": "Multiple entry bundles are created. The key is the entry name. The value can be a string, an array or an entry description object.", + "type": "object", + "additionalProperties": { + "description": "An entry point with name.", + "anyOf": [ + { + "$ref": "#/definitions/EntryItem" + }, + { + "$ref": "#/definitions/EntryDescription" + } + ] + } + }, + "EntryRuntime": { + "description": "The name of the runtime chunk. If set a runtime chunk with this name is created or an existing entrypoint is used as runtime.", + "anyOf": [ + { + "enum": [false] + }, + { + "type": "string", + "minLength": 1 + } + ] + }, + "EntryStatic": { + "description": "A static entry description.", + "anyOf": [ + { + "$ref": "#/definitions/EntryObject" + }, + { + "$ref": "#/definitions/EntryUnnamed" + } + ] + }, + "EntryStaticNormalized": { + "description": "Multiple entry bundles are created. The key is the entry name. The value is an entry description object.", + "type": "object", + "additionalProperties": { + "description": "An object with entry point description.", + "oneOf": [ + { + "$ref": "#/definitions/EntryDescriptionNormalized" + } + ] + } + }, + "EntryUnnamed": { + "description": "An entry point without name.", + "oneOf": [ + { + "$ref": "#/definitions/EntryItem" + } + ] + }, + "Environment": { + "description": "The abilities of the environment where the webpack generated code should run.", + "type": "object", + "additionalProperties": false, + "properties": { + "arrowFunction": { + "description": "The environment supports arrow functions ('() => { ... }').", + "type": "boolean" + }, + "asyncFunction": { + "description": "The environment supports async function and await ('async function () { await ... }').", + "type": "boolean" + }, + "bigIntLiteral": { + "description": "The environment supports BigInt as literal (123n).", + "type": "boolean" + }, + "const": { + "description": "The environment supports const and let for variable declarations.", + "type": "boolean" + }, + "destructuring": { + "description": "The environment supports destructuring ('{ a, b } = obj').", + "type": "boolean" + }, + "document": { + "description": "The environment supports 'document'.", + "type": "boolean" + }, + "dynamicImport": { + "description": "The environment supports an async import() function to import EcmaScript modules.", + "type": "boolean" + }, + "dynamicImportInWorker": { + "description": "The environment supports an async import() is available when creating a worker.", + "type": "boolean" + }, + "forOf": { + "description": "The environment supports 'for of' iteration ('for (const x of array) { ... }').", + "type": "boolean" + }, + "globalThis": { + "description": "The environment supports 'globalThis'.", + "type": "boolean" + }, + "module": { + "description": "The environment supports EcmaScript Module syntax to import EcmaScript modules (import ... from '...').", + "type": "boolean" + }, + "nodePrefixForCoreModules": { + "description": "The environment supports `node:` prefix for Node.js core modules.", + "type": "boolean" + }, + "optionalChaining": { + "description": "The environment supports optional chaining ('obj?.a' or 'obj?.()').", + "type": "boolean" + }, + "templateLiteral": { + "description": "The environment supports template literals.", + "type": "boolean" + } + } + }, + "Experiments": { + "description": "Enables/Disables experiments (experimental features with relax SemVer compatibility).", + "type": "object", + "implements": ["#/definitions/ExperimentsCommon"], + "additionalProperties": false, + "properties": { + "asyncWebAssembly": { + "description": "Support WebAssembly as asynchronous EcmaScript Module.", + "type": "boolean" + }, + "backCompat": { + "description": "Enable backward-compat layer with deprecation warnings for many webpack 4 APIs.", + "type": "boolean" + }, + "buildHttp": { + "description": "Build http(s): urls using a lockfile and resource content cache.", + "anyOf": [ + { + "$ref": "#/definitions/HttpUriAllowedUris" + }, + { + "$ref": "#/definitions/HttpUriOptions" + } + ] + }, + "cacheUnaffected": { + "description": "Enable additional in memory caching of modules that are unchanged and reference only unchanged modules.", + "type": "boolean" + }, + "css": { + "description": "Enable css support.", + "type": "boolean" + }, + "futureDefaults": { + "description": "Apply defaults of next major version.", + "type": "boolean" + }, + "layers": { + "description": "Enable module layers.", + "type": "boolean" + }, + "lazyCompilation": { + "description": "Compile entrypoints and import()s only when they are accessed.", + "anyOf": [ + { + "type": "boolean" + }, + { + "$ref": "#/definitions/LazyCompilationOptions" + } + ] + }, + "outputModule": { + "description": "Allow output javascript files as module source type.", + "type": "boolean" + }, + "syncWebAssembly": { + "description": "Support WebAssembly as synchronous EcmaScript Module (outdated).", + "type": "boolean" + }, + "topLevelAwait": { + "description": "Allow using top-level-await in EcmaScript Modules.", + "type": "boolean" + } + } + }, + "ExperimentsCommon": { + "description": "Enables/Disables experiments (experimental features with relax SemVer compatibility).", + "type": "object", + "additionalProperties": false, + "properties": { + "asyncWebAssembly": { + "description": "Support WebAssembly as asynchronous EcmaScript Module.", + "type": "boolean" + }, + "backCompat": { + "description": "Enable backward-compat layer with deprecation warnings for many webpack 4 APIs.", + "type": "boolean" + }, + "cacheUnaffected": { + "description": "Enable additional in memory caching of modules that are unchanged and reference only unchanged modules.", + "type": "boolean" + }, + "futureDefaults": { + "description": "Apply defaults of next major version.", + "type": "boolean" + }, + "layers": { + "description": "Enable module layers.", + "type": "boolean" + }, + "outputModule": { + "description": "Allow output javascript files as module source type.", + "type": "boolean" + }, + "syncWebAssembly": { + "description": "Support WebAssembly as synchronous EcmaScript Module (outdated).", + "type": "boolean" + }, + "topLevelAwait": { + "description": "Allow using top-level-await in EcmaScript Modules.", + "type": "boolean" + } + } + }, + "ExperimentsNormalized": { + "description": "Enables/Disables experiments (experimental features with relax SemVer compatibility).", + "type": "object", + "implements": ["#/definitions/ExperimentsCommon"], + "additionalProperties": false, + "properties": { + "asyncWebAssembly": { + "description": "Support WebAssembly as asynchronous EcmaScript Module.", + "type": "boolean" + }, + "backCompat": { + "description": "Enable backward-compat layer with deprecation warnings for many webpack 4 APIs.", + "type": "boolean" + }, + "buildHttp": { + "description": "Build http(s): urls using a lockfile and resource content cache.", + "oneOf": [ + { + "$ref": "#/definitions/HttpUriOptions" + } + ] + }, + "cacheUnaffected": { + "description": "Enable additional in memory caching of modules that are unchanged and reference only unchanged modules.", + "type": "boolean" + }, + "css": { + "description": "Enable css support.", + "type": "boolean" + }, + "futureDefaults": { + "description": "Apply defaults of next major version.", + "type": "boolean" + }, + "layers": { + "description": "Enable module layers.", + "type": "boolean" + }, + "lazyCompilation": { + "description": "Compile entrypoints and import()s only when they are accessed.", + "anyOf": [ + { + "enum": [false] + }, + { + "$ref": "#/definitions/LazyCompilationOptions" + } + ] + }, + "outputModule": { + "description": "Allow output javascript files as module source type.", + "type": "boolean" + }, + "syncWebAssembly": { + "description": "Support WebAssembly as synchronous EcmaScript Module (outdated).", + "type": "boolean" + }, + "topLevelAwait": { + "description": "Allow using top-level-await in EcmaScript Modules.", + "type": "boolean" + } + } + }, + "Extends": { + "description": "Extend configuration from another configuration (only works when using webpack-cli).", + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ExtendsItem" + } + }, + { + "$ref": "#/definitions/ExtendsItem" + } + ] + }, + "ExtendsItem": { + "description": "Path to the configuration to be extended (only works when using webpack-cli).", + "type": "string" + }, + "ExternalItem": { + "description": "Specify dependency that shouldn't be resolved by webpack, but should become dependencies of the resulting bundle. The kind of the dependency depends on `output.libraryTarget`.", + "anyOf": [ + { + "description": "Every matched dependency becomes external.", + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "description": "An exact matched dependency becomes external. The same string is used as external dependency.", + "type": "string" + }, + { + "description": "If an dependency matches exactly a property of the object, the property value is used as dependency.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/ExternalItemValue" + }, + "properties": { + "byLayer": { + "description": "Specify externals depending on the layer.", + "anyOf": [ + { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/ExternalItem" + } + }, + { + "instanceof": "Function", + "tsType": "((layer: string | null) => ExternalItem)" + } + ] + } + } + }, + { + "$ref": "#/definitions/ExternalItemFunction" + } + ] + }, + "ExternalItemFunction": { + "description": "The function is called on each dependency.", + "anyOf": [ + { + "$ref": "#/definitions/ExternalItemFunctionCallback" + }, + { + "$ref": "#/definitions/ExternalItemFunctionPromise" + } + ] + }, + "ExternalItemFunctionCallback": { + "description": "The function is called on each dependency (`function(context, request, callback(err, result))`).", + "instanceof": "Function", + "tsType": "((data: ExternalItemFunctionData, callback: (err?: (Error | null), result?: ExternalItemValue) => void) => void)" + }, + "ExternalItemFunctionData": { + "description": "Data object passed as argument when a function is set for 'externals'.", + "type": "object", + "additionalProperties": false, + "properties": { + "context": { + "description": "The directory in which the request is placed.", + "type": "string" + }, + "contextInfo": { + "description": "Contextual information.", + "type": "object", + "tsType": "import('../lib/ModuleFactory').ModuleFactoryCreateDataContextInfo" + }, + "dependencyType": { + "description": "The category of the referencing dependencies.", + "type": "string" + }, + "getResolve": { + "$ref": "#/definitions/ExternalItemFunctionDataGetResolve" + }, + "request": { + "description": "The request as written by the user in the require/import expression/statement.", + "type": "string" + } + } + }, + "ExternalItemFunctionDataGetResolve": { + "description": "Get a resolve function with the current resolver options.", + "instanceof": "Function", + "tsType": "((options?: ResolveOptions) => ExternalItemFunctionDataGetResolveCallbackResult | ExternalItemFunctionDataGetResolveResult)" + }, + "ExternalItemFunctionDataGetResolveCallbackResult": { + "description": "Result of get a resolve function with the current resolver options.", + "instanceof": "Function", + "tsType": "((context: string, request: string, callback: (err?: Error | null, result?: string | false, resolveRequest?: import('enhanced-resolve').ResolveRequest) => void) => void)" + }, + "ExternalItemFunctionDataGetResolveResult": { + "description": "Callback result of get a resolve function with the current resolver options.", + "instanceof": "Function", + "tsType": "((context: string, request: string) => Promise)" + }, + "ExternalItemFunctionPromise": { + "description": "The function is called on each dependency (`function(context, request)`).", + "instanceof": "Function", + "tsType": "((data: ExternalItemFunctionData) => Promise)" + }, + "ExternalItemValue": { + "description": "The dependency used for the external.", + "anyOf": [ + { + "type": "array", + "items": { + "description": "A part of the target of the external.", + "type": "string", + "minLength": 1 + } + }, + { + "description": "`true`: The dependency name is used as target of the external.", + "type": "boolean" + }, + { + "description": "The target of the external.", + "type": "string" + }, + { + "type": "object" + } + ] + }, + "Externals": { + "description": "Specify dependencies that shouldn't be resolved by webpack, but should become dependencies of the resulting bundle. The kind of the dependency depends on `output.libraryTarget`.", + "anyOf": [ + { + "type": "array", + "items": { + "$ref": "#/definitions/ExternalItem" + } + }, + { + "$ref": "#/definitions/ExternalItem" + } + ] + }, + "ExternalsPresets": { + "description": "Enable presets of externals for specific targets.", + "type": "object", + "additionalProperties": false, + "properties": { + "electron": { + "description": "Treat common electron built-in modules in main and preload context like 'electron', 'ipc' or 'shell' as external and load them via require() when used.", + "type": "boolean" + }, + "electronMain": { + "description": "Treat electron built-in modules in the main context like 'app', 'ipc-main' or 'shell' as external and load them via require() when used.", + "type": "boolean" + }, + "electronPreload": { + "description": "Treat electron built-in modules in the preload context like 'web-frame', 'ipc-renderer' or 'shell' as external and load them via require() when used.", + "type": "boolean" + }, + "electronRenderer": { + "description": "Treat electron built-in modules in the renderer context like 'web-frame', 'ipc-renderer' or 'shell' as external and load them via require() when used.", + "type": "boolean" + }, + "node": { + "description": "Treat node.js built-in modules like fs, path or vm as external and load them via require() when used.", + "type": "boolean" + }, + "nwjs": { + "description": "Treat NW.js legacy nw.gui module as external and load it via require() when used.", + "type": "boolean" + }, + "web": { + "description": "Treat references to 'http(s)://...' and 'std:...' as external and load them via import when used (Note that this changes execution order as externals are executed before any other code in the chunk).", + "type": "boolean" + }, + "webAsync": { + "description": "Treat references to 'http(s)://...' and 'std:...' as external and load them via async import() when used (Note that this external type is an async module, which has various effects on the execution).", + "type": "boolean" + } + } + }, + "ExternalsType": { + "description": "Specifies the default type of externals ('amd*', 'umd*', 'system' and 'jsonp' depend on output.libraryTarget set to the same value).", + "enum": [ + "var", + "module", + "assign", + "this", + "window", + "self", + "global", + "commonjs", + "commonjs2", + "commonjs-module", + "commonjs-static", + "amd", + "amd-require", + "umd", + "umd2", + "jsonp", + "system", + "promise", + "import", + "module-import", + "script", + "node-commonjs" + ] + }, + "Falsy": { + "description": "These values will be ignored by webpack and created to be used with '&&' or '||' to improve readability of configurations.", + "cli": { + "exclude": true + }, + "enum": [false, 0, "", null], + "undefinedAsNull": true, + "tsType": "false | 0 | '' | null | undefined" + }, + "FileCacheOptions": { + "description": "Options object for persistent file-based caching.", + "type": "object", + "additionalProperties": false, + "properties": { + "allowCollectingMemory": { + "description": "Allows to collect unused memory allocated during deserialization. This requires copying data into smaller buffers and has a performance cost.", + "type": "boolean" + }, + "buildDependencies": { + "description": "Dependencies the build depends on (in multiple categories, default categories: 'defaultWebpack').", + "type": "object", + "additionalProperties": { + "description": "List of dependencies the build depends on.", + "type": "array", + "items": { + "description": "Request to a dependency (resolved as directory relative to the context directory).", + "type": "string", + "minLength": 1 + } + } + }, + "cacheDirectory": { + "description": "Base directory for the cache (defaults to node_modules/.cache/webpack).", + "type": "string", + "absolutePath": true + }, + "cacheLocation": { + "description": "Locations for the cache (defaults to cacheDirectory / name).", + "type": "string", + "absolutePath": true + }, + "compression": { + "description": "Compression type used for the cache files.", + "enum": [false, "gzip", "brotli"] + }, + "hashAlgorithm": { + "description": "Algorithm used for generation the hash (see node.js crypto package).", + "type": "string" + }, + "idleTimeout": { + "description": "Time in ms after which idle period the cache storing should happen.", + "type": "number", + "minimum": 0 + }, + "idleTimeoutAfterLargeChanges": { + "description": "Time in ms after which idle period the cache storing should happen when larger changes has been detected (cumulative build time > 2 x avg cache store time).", + "type": "number", + "minimum": 0 + }, + "idleTimeoutForInitialStore": { + "description": "Time in ms after which idle period the initial cache storing should happen.", + "type": "number", + "minimum": 0 + }, + "immutablePaths": { + "description": "List of paths that are managed by a package manager and contain a version or hash in its path so all files are immutable.", + "type": "array", + "items": { + "description": "List of paths that are managed by a package manager and contain a version or hash in its path so all files are immutable.", + "anyOf": [ + { + "description": "A RegExp matching an immutable directory (usually a package manager cache directory, including the tailing slash)", + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "description": "A path to an immutable directory (usually a package manager cache directory).", + "type": "string", + "absolutePath": true, + "minLength": 1 + } + ] + } + }, + "managedPaths": { + "description": "List of paths that are managed by a package manager and can be trusted to not be modified otherwise.", + "type": "array", + "items": { + "description": "List of paths that are managed by a package manager and can be trusted to not be modified otherwise.", + "anyOf": [ + { + "description": "A RegExp matching a managed directory (usually a node_modules directory, including the tailing slash)", + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "description": "A path to a managed directory (usually a node_modules directory).", + "type": "string", + "absolutePath": true, + "minLength": 1 + } + ] + } + }, + "maxAge": { + "description": "Time for which unused cache entries stay in the filesystem cache at minimum (in milliseconds).", + "type": "number", + "minimum": 0 + }, + "maxMemoryGenerations": { + "description": "Number of generations unused cache entries stay in memory cache at minimum (0 = no memory cache used, 1 = may be removed after unused for a single compilation, ..., Infinity: kept forever). Cache entries will be deserialized from disk when removed from memory cache.", + "type": "number", + "minimum": 0 + }, + "memoryCacheUnaffected": { + "description": "Additionally cache computation of modules that are unchanged and reference only unchanged modules in memory.", + "type": "boolean" + }, + "name": { + "description": "Name for the cache. Different names will lead to different coexisting caches.", + "type": "string" + }, + "profile": { + "description": "Track and log detailed timing information for individual cache items.", + "type": "boolean" + }, + "readonly": { + "description": "Enable/disable readonly mode.", + "type": "boolean" + }, + "store": { + "description": "When to store data to the filesystem. (pack: Store data when compiler is idle in a single file).", + "enum": ["pack"] + }, + "type": { + "description": "Filesystem caching.", + "enum": ["filesystem"] + }, + "version": { + "description": "Version of the cache data. Different versions won't allow to reuse the cache and override existing content. Update the version when config changed in a way which doesn't allow to reuse cache. This will invalidate the cache.", + "type": "string" + } + }, + "required": ["type"] + }, + "Filename": { + "description": "Specifies the filename of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.", + "oneOf": [ + { + "$ref": "#/definitions/FilenameTemplate" + } + ] + }, + "FilenameTemplate": { + "description": "Specifies the filename template of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.", + "anyOf": [ + { + "type": "string", + "absolutePath": false, + "minLength": 1 + }, + { + "instanceof": "Function", + "tsType": "((pathData: import(\"../lib/Compilation\").PathData, assetInfo?: import(\"../lib/Compilation\").AssetInfo) => string)" + } + ] + }, + "FilterItemTypes": { + "description": "Filtering value, regexp or function.", + "cli": { + "helper": true + }, + "anyOf": [ + { + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "type": "string", + "absolutePath": false + }, + { + "instanceof": "Function", + "tsType": "((value: string) => boolean)" + } + ] + }, + "FilterTypes": { + "description": "Filtering values.", + "cli": { + "helper": true + }, + "anyOf": [ + { + "type": "array", + "items": { + "description": "Rule to filter.", + "cli": { + "helper": true + }, + "oneOf": [ + { + "$ref": "#/definitions/FilterItemTypes" + } + ] + } + }, + { + "$ref": "#/definitions/FilterItemTypes" + } + ] + }, + "GeneratorOptionsByModuleType": { + "description": "Specify options for each generator.", + "type": "object", + "additionalProperties": { + "description": "Options for generating.", + "type": "object", + "additionalProperties": true + }, + "properties": { + "asset": { + "$ref": "#/definitions/AssetGeneratorOptions" + }, + "asset/inline": { + "$ref": "#/definitions/AssetInlineGeneratorOptions" + }, + "asset/resource": { + "$ref": "#/definitions/AssetResourceGeneratorOptions" + }, + "css": { + "$ref": "#/definitions/CssGeneratorOptions" + }, + "css/auto": { + "$ref": "#/definitions/CssAutoGeneratorOptions" + }, + "css/global": { + "$ref": "#/definitions/CssGlobalGeneratorOptions" + }, + "css/module": { + "$ref": "#/definitions/CssModuleGeneratorOptions" + }, + "javascript": { + "$ref": "#/definitions/EmptyGeneratorOptions" + }, + "javascript/auto": { + "$ref": "#/definitions/EmptyGeneratorOptions" + }, + "javascript/dynamic": { + "$ref": "#/definitions/EmptyGeneratorOptions" + }, + "javascript/esm": { + "$ref": "#/definitions/EmptyGeneratorOptions" + }, + "json": { + "$ref": "#/definitions/JsonGeneratorOptions" + } + } + }, + "GlobalObject": { + "description": "An expression which is used to address the global object/scope in runtime code.", + "type": "string", + "minLength": 1 + }, + "HashDigest": { + "description": "Digest type used for the hash.", + "type": "string" + }, + "HashDigestLength": { + "description": "Number of chars which are used for the hash.", + "type": "number", + "minimum": 1 + }, + "HashFunction": { + "description": "Algorithm used for generation the hash (see node.js crypto package).", + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "instanceof": "Function", + "tsType": "typeof import('../lib/util/Hash')" + } + ] + }, + "HashSalt": { + "description": "Any string which is added to the hash to salt it.", + "type": "string", + "minLength": 1 + }, + "HotUpdateChunkFilename": { + "description": "The filename of the Hot Update Chunks. They are inside the output.path directory.", + "type": "string", + "absolutePath": false + }, + "HotUpdateGlobal": { + "description": "The global variable used by webpack for loading of hot update chunks.", + "type": "string" + }, + "HotUpdateMainFilename": { + "description": "The filename of the Hot Update Main File. It is inside the 'output.path' directory.", + "type": "string", + "absolutePath": false + }, + "HttpUriAllowedUris": { + "description": "List of allowed URIs for building http resources.", + "cli": { + "exclude": true + }, + "oneOf": [ + { + "$ref": "#/definitions/HttpUriOptionsAllowedUris" + } + ] + }, + "HttpUriOptions": { + "description": "Options for building http resources.", + "type": "object", + "additionalProperties": false, + "properties": { + "allowedUris": { + "$ref": "#/definitions/HttpUriOptionsAllowedUris" + }, + "cacheLocation": { + "description": "Location where resource content is stored for lockfile entries. It's also possible to disable storing by passing false.", + "anyOf": [ + { + "enum": [false] + }, + { + "type": "string", + "absolutePath": true + } + ] + }, + "frozen": { + "description": "When set, anything that would lead to a modification of the lockfile or any resource content, will result in an error.", + "type": "boolean" + }, + "lockfileLocation": { + "description": "Location of the lockfile.", + "type": "string", + "absolutePath": true + }, + "proxy": { + "description": "Proxy configuration, which can be used to specify a proxy server to use for HTTP requests.", + "type": "string" + }, + "upgrade": { + "description": "When set, resources of existing lockfile entries will be fetched and entries will be upgraded when resource content has changed.", + "type": "boolean" + } + }, + "required": ["allowedUris"] + }, + "HttpUriOptionsAllowedUris": { + "description": "List of allowed URIs (resp. the beginning of them).", + "type": "array", + "items": { + "description": "List of allowed URIs (resp. the beginning of them).", + "anyOf": [ + { + "description": "Allowed URI pattern.", + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "description": "Allowed URI (resp. the beginning of it).", + "type": "string", + "pattern": "^https?://" + }, + { + "description": "Allowed URI filter function.", + "instanceof": "Function", + "tsType": "((uri: string) => boolean)" + } + ] + } + }, + "IgnoreWarnings": { + "description": "Ignore specific warnings.", + "type": "array", + "items": { + "description": "Ignore specific warnings.", + "anyOf": [ + { + "description": "A RegExp to select the warning message.", + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "file": { + "description": "A RegExp to select the origin file for the warning.", + "instanceof": "RegExp", + "tsType": "RegExp" + }, + "message": { + "description": "A RegExp to select the warning message.", + "instanceof": "RegExp", + "tsType": "RegExp" + }, + "module": { + "description": "A RegExp to select the origin module for the warning.", + "instanceof": "RegExp", + "tsType": "RegExp" + } + } + }, + { + "description": "A custom function to select warnings based on the raw warning instance.", + "instanceof": "Function", + "tsType": "((warning: Error, compilation: import('../lib/Compilation')) => boolean)" + } + ] + } + }, + "IgnoreWarningsNormalized": { + "description": "Ignore specific warnings.", + "type": "array", + "items": { + "description": "A function to select warnings based on the raw warning instance.", + "instanceof": "Function", + "tsType": "((warning: Error, compilation: import('../lib/Compilation')) => boolean)" + } + }, + "Iife": { + "description": "Wrap javascript code into IIFE's to avoid leaking into global scope.", + "type": "boolean" + }, + "ImportFunctionName": { + "description": "The name of the native import() function (can be exchanged for a polyfill).", + "type": "string" + }, + "ImportMetaName": { + "description": "The name of the native import.meta object (can be exchanged for a polyfill).", + "type": "string" + }, + "InfrastructureLogging": { + "description": "Options for infrastructure level logging.", + "type": "object", + "additionalProperties": false, + "properties": { + "appendOnly": { + "description": "Only appends lines to the output. Avoids updating existing output e. g. for status messages. This option is only used when no custom console is provided.", + "type": "boolean" + }, + "colors": { + "description": "Enables/Disables colorful output. This option is only used when no custom console is provided.", + "type": "boolean" + }, + "console": { + "description": "Custom console used for logging.", + "tsType": "Console" + }, + "debug": { + "description": "Enable debug logging for specific loggers.", + "anyOf": [ + { + "description": "Enable/Disable debug logging for all loggers.", + "type": "boolean" + }, + { + "$ref": "#/definitions/FilterTypes" + } + ] + }, + "level": { + "description": "Log level.", + "enum": ["none", "error", "warn", "info", "log", "verbose"] + }, + "stream": { + "description": "Stream used for logging output. Defaults to process.stderr. This option is only used when no custom console is provided.", + "tsType": "NodeJS.WritableStream & { isTTY?: boolean, columns?: number, rows?: number }" + } + } + }, + "JavascriptParserOptions": { + "description": "Parser options for javascript modules.", + "type": "object", + "additionalProperties": true, + "properties": { + "amd": { + "$ref": "#/definitions/Amd" + }, + "browserify": { + "description": "Enable/disable special handling for browserify bundles.", + "type": "boolean" + }, + "commonjs": { + "description": "Enable/disable parsing of CommonJs syntax.", + "type": "boolean" + }, + "commonjsMagicComments": { + "description": "Enable/disable parsing of magic comments in CommonJs syntax.", + "type": "boolean" + }, + "createRequire": { + "description": "Enable/disable parsing \"import { createRequire } from \"module\"\" and evaluating createRequire().", + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "string" + } + ] + }, + "dynamicImportFetchPriority": { + "description": "Specifies global fetchPriority for dynamic import.", + "enum": ["low", "high", "auto", false] + }, + "dynamicImportMode": { + "description": "Specifies global mode for dynamic import.", + "enum": ["eager", "weak", "lazy", "lazy-once"] + }, + "dynamicImportPrefetch": { + "description": "Specifies global prefetch for dynamic import.", + "anyOf": [ + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "dynamicImportPreload": { + "description": "Specifies global preload for dynamic import.", + "anyOf": [ + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "exportsPresence": { + "description": "Specifies the behavior of invalid export names in \"import ... from ...\" and \"export ... from ...\".", + "enum": ["error", "warn", "auto", false] + }, + "exprContextCritical": { + "description": "Enable warnings for full dynamic dependencies.", + "type": "boolean" + }, + "exprContextRecursive": { + "description": "Enable recursive directory lookup for full dynamic dependencies.", + "type": "boolean" + }, + "exprContextRegExp": { + "description": "Sets the default regular expression for full dynamic dependencies.", + "anyOf": [ + { + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "type": "boolean" + } + ] + }, + "exprContextRequest": { + "description": "Set the default request for full dynamic dependencies.", + "type": "string" + }, + "harmony": { + "description": "Enable/disable parsing of EcmaScript Modules syntax.", + "type": "boolean" + }, + "import": { + "description": "Enable/disable parsing of import() syntax.", + "type": "boolean" + }, + "importExportsPresence": { + "description": "Specifies the behavior of invalid export names in \"import ... from ...\".", + "enum": ["error", "warn", "auto", false] + }, + "importMeta": { + "description": "Enable/disable evaluating import.meta.", + "type": "boolean" + }, + "importMetaContext": { + "description": "Enable/disable evaluating import.meta.webpackContext.", + "type": "boolean" + }, + "node": { + "$ref": "#/definitions/Node" + }, + "overrideStrict": { + "description": "Override the module to strict or non-strict. This may affect the behavior of the module (some behaviors differ between strict and non-strict), so please configure this option carefully.", + "enum": ["strict", "non-strict"] + }, + "reexportExportsPresence": { + "description": "Specifies the behavior of invalid export names in \"export ... from ...\". This might be useful to disable during the migration from \"export ... from ...\" to \"export type ... from ...\" when reexporting types in TypeScript.", + "enum": ["error", "warn", "auto", false] + }, + "requireContext": { + "description": "Enable/disable parsing of require.context syntax.", + "type": "boolean" + }, + "requireEnsure": { + "description": "Enable/disable parsing of require.ensure syntax.", + "type": "boolean" + }, + "requireInclude": { + "description": "Enable/disable parsing of require.include syntax.", + "type": "boolean" + }, + "requireJs": { + "description": "Enable/disable parsing of require.js special syntax like require.config, requirejs.config, require.version and requirejs.onError.", + "type": "boolean" + }, + "strictExportPresence": { + "description": "Deprecated in favor of \"exportsPresence\". Emit errors instead of warnings when imported names don't exist in imported module.", + "type": "boolean" + }, + "strictThisContextOnImports": { + "description": "Handle the this context correctly according to the spec for namespace objects.", + "type": "boolean" + }, + "system": { + "description": "Enable/disable parsing of System.js special syntax like System.import, System.get, System.set and System.register.", + "type": "boolean" + }, + "unknownContextCritical": { + "description": "Enable warnings when using the require function in a not statically analyse-able way.", + "type": "boolean" + }, + "unknownContextRecursive": { + "description": "Enable recursive directory lookup when using the require function in a not statically analyse-able way.", + "type": "boolean" + }, + "unknownContextRegExp": { + "description": "Sets the regular expression when using the require function in a not statically analyse-able way.", + "anyOf": [ + { + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "type": "boolean" + } + ] + }, + "unknownContextRequest": { + "description": "Sets the request when using the require function in a not statically analyse-able way.", + "type": "string" + }, + "url": { + "description": "Enable/disable parsing of new URL() syntax.", + "anyOf": [ + { + "enum": ["relative"] + }, + { + "type": "boolean" + } + ] + }, + "worker": { + "description": "Disable or configure parsing of WebWorker syntax like new Worker() or navigator.serviceWorker.register().", + "anyOf": [ + { + "type": "array", + "items": { + "description": "Specify a syntax that should be parsed as WebWorker reference. 'Abc' handles 'new Abc()', 'Abc from xyz' handles 'import { Abc } from \"xyz\"; new Abc()', 'abc()' handles 'abc()', and combinations are also possible.", + "type": "string", + "minLength": 1 + } + }, + { + "type": "boolean" + } + ] + }, + "wrappedContextCritical": { + "description": "Enable warnings for partial dynamic dependencies.", + "type": "boolean" + }, + "wrappedContextRecursive": { + "description": "Enable recursive directory lookup for partial dynamic dependencies.", + "type": "boolean" + }, + "wrappedContextRegExp": { + "description": "Set the inner regular expression for partial dynamic dependencies.", + "instanceof": "RegExp", + "tsType": "RegExp" + } + } + }, + "JsonGeneratorOptions": { + "description": "Generator options for json modules.", + "type": "object", + "additionalProperties": false, + "properties": { + "JSONParse": { + "description": "Use `JSON.parse` when the JSON string is longer than 20 characters.", + "type": "boolean" + } + } + }, + "JsonParserOptions": { + "description": "Parser options for JSON modules.", + "type": "object", + "additionalProperties": false, + "properties": { + "exportsDepth": { + "description": "The depth of json dependency flagged as `exportInfo`.", + "type": "number" + }, + "parse": { + "description": "Function to parser content and return JSON.", + "instanceof": "Function", + "tsType": "((input: string) => Buffer | import('../lib/json/JsonParser').JsonValue)" + } + } + }, + "Layer": { + "description": "Specifies the layer in which modules of this entrypoint are placed.", + "anyOf": [ + { + "enum": [null] + }, + { + "type": "string", + "minLength": 1 + } + ] + }, + "LazyCompilationDefaultBackendOptions": { + "description": "Options for the default backend.", + "type": "object", + "additionalProperties": false, + "properties": { + "client": { + "description": "A custom client.", + "type": "string" + }, + "listen": { + "description": "Specifies where to listen to from the server.", + "anyOf": [ + { + "description": "A port.", + "type": "number" + }, + { + "description": "Listen options.", + "type": "object", + "additionalProperties": true, + "properties": { + "host": { + "description": "A host.", + "type": "string" + }, + "port": { + "description": "A port.", + "type": "number" + } + }, + "tsType": "import(\"net\").ListenOptions" + }, + { + "description": "A custom listen function.", + "instanceof": "Function", + "tsType": "((server: import(\"net\").Server) => void)" + } + ] + }, + "protocol": { + "description": "Specifies the protocol the client should use to connect to the server.", + "enum": ["http", "https"] + }, + "server": { + "description": "Specifies how to create the server handling the EventSource requests.", + "anyOf": [ + { + "description": "ServerOptions for the http or https createServer call.", + "type": "object", + "additionalProperties": true, + "properties": {}, + "tsType": "(import(\"../lib/hmr/lazyCompilationBackend\").HttpsServerOptions | import(\"../lib/hmr/lazyCompilationBackend\").HttpServerOptions)" + }, + { + "description": "A custom create server function.", + "instanceof": "Function", + "tsType": "(() => import(\"../lib/hmr/lazyCompilationBackend\").Server)" + } + ] + } + } + }, + "LazyCompilationOptions": { + "description": "Options for compiling entrypoints and import()s only when they are accessed.", + "type": "object", + "additionalProperties": false, + "properties": { + "backend": { + "description": "Specifies the backend that should be used for handling client keep alive.", + "anyOf": [ + { + "description": "A custom backend.", + "instanceof": "Function", + "tsType": "(((compiler: import('../lib/Compiler'), callback: (err: Error | null, api?: import(\"../lib/hmr/LazyCompilationPlugin\").BackendApi) => void) => void) | ((compiler: import('../lib/Compiler')) => Promise))" + }, + { + "$ref": "#/definitions/LazyCompilationDefaultBackendOptions" + } + ] + }, + "entries": { + "description": "Enable/disable lazy compilation for entries.", + "type": "boolean" + }, + "imports": { + "description": "Enable/disable lazy compilation for import() modules.", + "type": "boolean" + }, + "test": { + "description": "Specify which entrypoints or import()ed modules should be lazily compiled. This is matched with the imported module and not the entrypoint name.", + "anyOf": [ + { + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "type": "string" + }, + { + "instanceof": "Function", + "tsType": "((module: import('../lib/Module')) => boolean)" + } + ] + } + } + }, + "Library": { + "description": "Make the output files a library, exporting the exports of the entry point.", + "anyOf": [ + { + "$ref": "#/definitions/LibraryName" + }, + { + "$ref": "#/definitions/LibraryOptions" + } + ] + }, + "LibraryCustomUmdCommentObject": { + "description": "Set explicit comments for `commonjs`, `commonjs2`, `amd`, and `root`.", + "type": "object", + "additionalProperties": false, + "properties": { + "amd": { + "description": "Set comment for `amd` section in UMD.", + "type": "string" + }, + "commonjs": { + "description": "Set comment for `commonjs` (exports) section in UMD.", + "type": "string" + }, + "commonjs2": { + "description": "Set comment for `commonjs2` (module.exports) section in UMD.", + "type": "string" + }, + "root": { + "description": "Set comment for `root` (global variable) section in UMD.", + "type": "string" + } + } + }, + "LibraryCustomUmdObject": { + "description": "Description object for all UMD variants of the library name.", + "type": "object", + "additionalProperties": false, + "properties": { + "amd": { + "description": "Name of the exposed AMD library in the UMD.", + "type": "string", + "minLength": 1 + }, + "commonjs": { + "description": "Name of the exposed commonjs export in the UMD.", + "type": "string", + "minLength": 1 + }, + "root": { + "description": "Name of the property exposed globally by a UMD library.", + "anyOf": [ + { + "type": "array", + "items": { + "description": "Part of the name of the property exposed globally by a UMD library.", + "type": "string", + "minLength": 1 + } + }, + { + "type": "string", + "minLength": 1 + } + ] + } + } + }, + "LibraryExport": { + "description": "Specify which export should be exposed as library.", + "anyOf": [ + { + "type": "array", + "items": { + "description": "Part of the export that should be exposed as library.", + "type": "string", + "minLength": 1 + } + }, + { + "type": "string", + "minLength": 1 + } + ] + }, + "LibraryName": { + "description": "The name of the library (some types allow unnamed libraries too).", + "anyOf": [ + { + "type": "array", + "items": { + "description": "A part of the library name.", + "type": "string", + "minLength": 1 + }, + "minItems": 1 + }, + { + "type": "string", + "minLength": 1 + }, + { + "$ref": "#/definitions/LibraryCustomUmdObject" + } + ] + }, + "LibraryOptions": { + "description": "Options for library.", + "type": "object", + "additionalProperties": false, + "properties": { + "amdContainer": { + "$ref": "#/definitions/AmdContainer" + }, + "auxiliaryComment": { + "$ref": "#/definitions/AuxiliaryComment" + }, + "export": { + "$ref": "#/definitions/LibraryExport" + }, + "name": { + "$ref": "#/definitions/LibraryName" + }, + "type": { + "$ref": "#/definitions/LibraryType" + }, + "umdNamedDefine": { + "$ref": "#/definitions/UmdNamedDefine" + } + }, + "required": ["type"] + }, + "LibraryType": { + "description": "Type of library (types included by default are 'var', 'module', 'assign', 'assign-properties', 'this', 'window', 'self', 'global', 'commonjs', 'commonjs2', 'commonjs-module', 'commonjs-static', 'amd', 'amd-require', 'umd', 'umd2', 'jsonp', 'system', but others might be added by plugins).", + "anyOf": [ + { + "enum": [ + "var", + "module", + "assign", + "assign-properties", + "this", + "window", + "self", + "global", + "commonjs", + "commonjs2", + "commonjs-module", + "commonjs-static", + "amd", + "amd-require", + "umd", + "umd2", + "jsonp", + "system" + ] + }, + { + "type": "string" + } + ] + }, + "Loader": { + "description": "Custom values available in the loader context.", + "type": "object" + }, + "MemoryCacheOptions": { + "description": "Options object for in-memory caching.", + "type": "object", + "additionalProperties": false, + "properties": { + "cacheUnaffected": { + "description": "Additionally cache computation of modules that are unchanged and reference only unchanged modules.", + "type": "boolean" + }, + "maxGenerations": { + "description": "Number of generations unused cache entries stay in memory cache at minimum (1 = may be removed after unused for a single compilation, ..., Infinity: kept forever).", + "type": "number", + "minimum": 1 + }, + "type": { + "description": "In memory caching.", + "enum": ["memory"] + } + }, + "required": ["type"] + }, + "Mode": { + "description": "Enable production optimizations or development hints.", + "enum": ["development", "production", "none"] + }, + "ModuleFilterItemTypes": { + "description": "Filtering value, regexp or function.", + "cli": { + "helper": true + }, + "anyOf": [ + { + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "type": "string", + "absolutePath": false + }, + { + "instanceof": "Function", + "tsType": "((name: string, module: import('../lib/stats/DefaultStatsFactoryPlugin').StatsModule, type: 'module' | 'chunk' | 'root-of-chunk' | 'nested') => boolean)" + } + ] + }, + "ModuleFilterTypes": { + "description": "Filtering modules.", + "cli": { + "helper": true + }, + "anyOf": [ + { + "type": "array", + "items": { + "description": "Rule to filter.", + "cli": { + "helper": true + }, + "oneOf": [ + { + "$ref": "#/definitions/ModuleFilterItemTypes" + } + ] + } + }, + { + "$ref": "#/definitions/ModuleFilterItemTypes" + } + ] + }, + "ModuleOptions": { + "description": "Options affecting the normal modules (`NormalModuleFactory`).", + "type": "object", + "additionalProperties": false, + "properties": { + "defaultRules": { + "description": "An array of rules applied by default for modules.", + "cli": { + "exclude": true + }, + "oneOf": [ + { + "$ref": "#/definitions/RuleSetRules" + } + ] + }, + "exprContextCritical": { + "description": "Enable warnings for full dynamic dependencies.", + "type": "boolean" + }, + "exprContextRecursive": { + "description": "Enable recursive directory lookup for full dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.exprContextRecursive'.", + "type": "boolean" + }, + "exprContextRegExp": { + "description": "Sets the default regular expression for full dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.exprContextRegExp'.", + "anyOf": [ + { + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "type": "boolean" + } + ] + }, + "exprContextRequest": { + "description": "Set the default request for full dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.exprContextRequest'.", + "type": "string" + }, + "generator": { + "$ref": "#/definitions/GeneratorOptionsByModuleType" + }, + "noParse": { + "$ref": "#/definitions/NoParse" + }, + "parser": { + "$ref": "#/definitions/ParserOptionsByModuleType" + }, + "rules": { + "description": "An array of rules applied for modules.", + "oneOf": [ + { + "$ref": "#/definitions/RuleSetRules" + } + ] + }, + "strictExportPresence": { + "description": "Emit errors instead of warnings when imported names don't exist in imported module. Deprecated: This option has moved to 'module.parser.javascript.strictExportPresence'.", + "type": "boolean" + }, + "strictThisContextOnImports": { + "description": "Handle the this context correctly according to the spec for namespace objects. Deprecated: This option has moved to 'module.parser.javascript.strictThisContextOnImports'.", + "type": "boolean" + }, + "unknownContextCritical": { + "description": "Enable warnings when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextCritical'.", + "type": "boolean" + }, + "unknownContextRecursive": { + "description": "Enable recursive directory lookup when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextRecursive'.", + "type": "boolean" + }, + "unknownContextRegExp": { + "description": "Sets the regular expression when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextRegExp'.", + "anyOf": [ + { + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "type": "boolean" + } + ] + }, + "unknownContextRequest": { + "description": "Sets the request when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextRequest'.", + "type": "string" + }, + "unsafeCache": { + "description": "Cache the resolving of module requests.", + "anyOf": [ + { + "type": "boolean" + }, + { + "instanceof": "Function", + "tsType": "((module: import('../lib/Module')) => boolean)" + } + ] + }, + "wrappedContextCritical": { + "description": "Enable warnings for partial dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.wrappedContextCritical'.", + "type": "boolean" + }, + "wrappedContextRecursive": { + "description": "Enable recursive directory lookup for partial dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.wrappedContextRecursive'.", + "type": "boolean" + }, + "wrappedContextRegExp": { + "description": "Set the inner regular expression for partial dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.wrappedContextRegExp'.", + "instanceof": "RegExp", + "tsType": "RegExp" + } + } + }, + "ModuleOptionsNormalized": { + "description": "Options affecting the normal modules (`NormalModuleFactory`).", + "type": "object", + "additionalProperties": false, + "properties": { + "defaultRules": { + "description": "An array of rules applied by default for modules.", + "cli": { + "exclude": true + }, + "oneOf": [ + { + "$ref": "#/definitions/RuleSetRules" + } + ] + }, + "generator": { + "$ref": "#/definitions/GeneratorOptionsByModuleType" + }, + "noParse": { + "$ref": "#/definitions/NoParse" + }, + "parser": { + "$ref": "#/definitions/ParserOptionsByModuleType" + }, + "rules": { + "description": "An array of rules applied for modules.", + "oneOf": [ + { + "$ref": "#/definitions/RuleSetRules" + } + ] + }, + "unsafeCache": { + "description": "Cache the resolving of module requests.", + "anyOf": [ + { + "type": "boolean" + }, + { + "instanceof": "Function", + "tsType": "((module: import('../lib/Module')) => boolean)" + } + ] + } + }, + "required": ["defaultRules", "generator", "parser", "rules"] + }, + "Name": { + "description": "Name of the configuration. Used when loading multiple configurations.", + "type": "string" + }, + "NoParse": { + "description": "Don't parse files matching. It's matched against the full resolved request.", + "anyOf": [ + { + "type": "array", + "items": { + "description": "Don't parse files matching. It's matched against the full resolved request.", + "anyOf": [ + { + "description": "A regular expression, when matched the module is not parsed.", + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "description": "An absolute path, when the module starts with this path it is not parsed.", + "type": "string", + "absolutePath": true + }, + { + "instanceof": "Function", + "tsType": "((content: string) => boolean)" + } + ] + }, + "minItems": 1 + }, + { + "description": "A regular expression, when matched the module is not parsed.", + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "description": "An absolute path, when the module starts with this path it is not parsed.", + "type": "string", + "absolutePath": true + }, + { + "instanceof": "Function", + "tsType": "((content: string) => boolean)" + } + ] + }, + "Node": { + "description": "Include polyfills or mocks for various node stuff.", + "anyOf": [ + { + "enum": [false] + }, + { + "$ref": "#/definitions/NodeOptions" + } + ] + }, + "NodeOptions": { + "description": "Options object for node compatibility features.", + "type": "object", + "additionalProperties": false, + "properties": { + "__dirname": { + "description": "Include a polyfill for the '__dirname' variable.", + "enum": [false, true, "warn-mock", "mock", "node-module", "eval-only"] + }, + "__filename": { + "description": "Include a polyfill for the '__filename' variable.", + "enum": [false, true, "warn-mock", "mock", "node-module", "eval-only"] + }, + "global": { + "description": "Include a polyfill for the 'global' variable.", + "enum": [false, true, "warn"] + } + } + }, + "Optimization": { + "description": "Enables/Disables integrated optimizations.", + "type": "object", + "additionalProperties": false, + "properties": { + "avoidEntryIife": { + "description": "Avoid wrapping the entry module in an IIFE.", + "type": "boolean" + }, + "checkWasmTypes": { + "description": "Check for incompatible wasm types when importing/exporting from/to ESM.", + "type": "boolean" + }, + "chunkIds": { + "description": "Define the algorithm to choose chunk ids (named: readable ids for better debugging, deterministic: numeric hash ids for better long term caching, size: numeric ids focused on minimal initial download size, total-size: numeric ids focused on minimal total download size, false: no algorithm used, as custom one can be provided via plugin).", + "enum": [ + "natural", + "named", + "deterministic", + "size", + "total-size", + false + ] + }, + "concatenateModules": { + "description": "Concatenate modules when possible to generate less modules, more efficient code and enable more optimizations by the minimizer.", + "type": "boolean" + }, + "emitOnErrors": { + "description": "Emit assets even when errors occur. Critical errors are emitted into the generated code and will cause errors at runtime.", + "type": "boolean" + }, + "flagIncludedChunks": { + "description": "Also flag chunks as loaded which contain a subset of the modules.", + "type": "boolean" + }, + "innerGraph": { + "description": "Creates a module-internal dependency graph for top level symbols, exports and imports, to improve unused exports detection.", + "type": "boolean" + }, + "mangleExports": { + "description": "Rename exports when possible to generate shorter code (depends on optimization.usedExports and optimization.providedExports, true/\"deterministic\": generate short deterministic names optimized for caching, \"size\": generate the shortest possible names).", + "anyOf": [ + { + "enum": ["size", "deterministic"] + }, + { + "type": "boolean" + } + ] + }, + "mangleWasmImports": { + "description": "Reduce size of WASM by changing imports to shorter strings.", + "type": "boolean" + }, + "mergeDuplicateChunks": { + "description": "Merge chunks which contain the same modules.", + "type": "boolean" + }, + "minimize": { + "description": "Enable minimizing the output. Uses optimization.minimizer.", + "type": "boolean" + }, + "minimizer": { + "description": "Minimizer(s) to use for minimizing the output.", + "type": "array", + "cli": { + "exclude": true + }, + "items": { + "description": "Plugin of type object or instanceof Function.", + "anyOf": [ + { + "enum": ["..."] + }, + { + "$ref": "#/definitions/Falsy" + }, + { + "$ref": "#/definitions/WebpackPluginInstance" + }, + { + "$ref": "#/definitions/WebpackPluginFunction" + } + ] + } + }, + "moduleIds": { + "description": "Define the algorithm to choose module ids (natural: numeric ids in order of usage, named: readable ids for better debugging, hashed: (deprecated) short hashes as ids for better long term caching, deterministic: numeric hash ids for better long term caching, size: numeric ids focused on minimal initial download size, false: no algorithm used, as custom one can be provided via plugin).", + "enum": ["natural", "named", "hashed", "deterministic", "size", false] + }, + "noEmitOnErrors": { + "description": "Avoid emitting assets when errors occur (deprecated: use 'emitOnErrors' instead).", + "type": "boolean", + "cli": { + "exclude": true + } + }, + "nodeEnv": { + "description": "Set process.env.NODE_ENV to a specific value.", + "anyOf": [ + { + "enum": [false] + }, + { + "type": "string" + } + ] + }, + "portableRecords": { + "description": "Generate records with relative paths to be able to move the context folder.", + "type": "boolean" + }, + "providedExports": { + "description": "Figure out which exports are provided by modules to generate more efficient code.", + "type": "boolean" + }, + "realContentHash": { + "description": "Use real [contenthash] based on final content of the assets.", + "type": "boolean" + }, + "removeAvailableModules": { + "description": "Removes modules from chunks when these modules are already included in all parents.", + "type": "boolean" + }, + "removeEmptyChunks": { + "description": "Remove chunks which are empty.", + "type": "boolean" + }, + "runtimeChunk": { + "$ref": "#/definitions/OptimizationRuntimeChunk" + }, + "sideEffects": { + "description": "Skip over modules which contain no side effects when exports are not used (false: disabled, 'flag': only use manually placed side effects flag, true: also analyse source code for side effects).", + "anyOf": [ + { + "enum": ["flag"] + }, + { + "type": "boolean" + } + ] + }, + "splitChunks": { + "description": "Optimize duplication and caching by splitting chunks by shared modules and cache group.", + "anyOf": [ + { + "enum": [false] + }, + { + "$ref": "#/definitions/OptimizationSplitChunksOptions" + } + ] + }, + "usedExports": { + "description": "Figure out which exports are used by modules to mangle export names, omit unused exports and generate more efficient code (true: analyse used exports for each runtime, \"global\": analyse exports globally for all runtimes combined).", + "anyOf": [ + { + "enum": ["global"] + }, + { + "type": "boolean" + } + ] + } + } + }, + "OptimizationNormalized": { + "description": "Enables/Disables integrated optimizations.", + "type": "object", + "additionalProperties": false, + "properties": { + "avoidEntryIife": { + "description": "Avoid wrapping the entry module in an IIFE.", + "type": "boolean" + }, + "checkWasmTypes": { + "description": "Check for incompatible wasm types when importing/exporting from/to ESM.", + "type": "boolean" + }, + "chunkIds": { + "description": "Define the algorithm to choose chunk ids (named: readable ids for better debugging, deterministic: numeric hash ids for better long term caching, size: numeric ids focused on minimal initial download size, total-size: numeric ids focused on minimal total download size, false: no algorithm used, as custom one can be provided via plugin).", + "enum": [ + "natural", + "named", + "deterministic", + "size", + "total-size", + false + ] + }, + "concatenateModules": { + "description": "Concatenate modules when possible to generate less modules, more efficient code and enable more optimizations by the minimizer.", + "type": "boolean" + }, + "emitOnErrors": { + "description": "Emit assets even when errors occur. Critical errors are emitted into the generated code and will cause errors at runtime.", + "type": "boolean" + }, + "flagIncludedChunks": { + "description": "Also flag chunks as loaded which contain a subset of the modules.", + "type": "boolean" + }, + "innerGraph": { + "description": "Creates a module-internal dependency graph for top level symbols, exports and imports, to improve unused exports detection.", + "type": "boolean" + }, + "mangleExports": { + "description": "Rename exports when possible to generate shorter code (depends on optimization.usedExports and optimization.providedExports, true/\"deterministic\": generate short deterministic names optimized for caching, \"size\": generate the shortest possible names).", + "anyOf": [ + { + "enum": ["size", "deterministic"] + }, + { + "type": "boolean" + } + ] + }, + "mangleWasmImports": { + "description": "Reduce size of WASM by changing imports to shorter strings.", + "type": "boolean" + }, + "mergeDuplicateChunks": { + "description": "Merge chunks which contain the same modules.", + "type": "boolean" + }, + "minimize": { + "description": "Enable minimizing the output. Uses optimization.minimizer.", + "type": "boolean" + }, + "minimizer": { + "description": "Minimizer(s) to use for minimizing the output.", + "type": "array", + "cli": { + "exclude": true + }, + "items": { + "description": "Plugin of type object or instanceof Function.", + "anyOf": [ + { + "enum": ["..."] + }, + { + "$ref": "#/definitions/Falsy" + }, + { + "$ref": "#/definitions/WebpackPluginInstance" + }, + { + "$ref": "#/definitions/WebpackPluginFunction" + } + ] + } + }, + "moduleIds": { + "description": "Define the algorithm to choose module ids (natural: numeric ids in order of usage, named: readable ids for better debugging, hashed: (deprecated) short hashes as ids for better long term caching, deterministic: numeric hash ids for better long term caching, size: numeric ids focused on minimal initial download size, false: no algorithm used, as custom one can be provided via plugin).", + "enum": ["natural", "named", "hashed", "deterministic", "size", false] + }, + "noEmitOnErrors": { + "description": "Avoid emitting assets when errors occur (deprecated: use 'emitOnErrors' instead).", + "type": "boolean", + "cli": { + "exclude": true + } + }, + "nodeEnv": { + "description": "Set process.env.NODE_ENV to a specific value.", + "anyOf": [ + { + "enum": [false] + }, + { + "type": "string" + } + ] + }, + "portableRecords": { + "description": "Generate records with relative paths to be able to move the context folder.", + "type": "boolean" }, "providedExports": { - "description": "Figure out which exports are provided by modules to generate more efficient code", + "description": "Figure out which exports are provided by modules to generate more efficient code.", + "type": "boolean" + }, + "realContentHash": { + "description": "Use real [contenthash] based on final content of the assets.", + "type": "boolean" + }, + "removeAvailableModules": { + "description": "Removes modules from chunks when these modules are already included in all parents.", + "type": "boolean" + }, + "removeEmptyChunks": { + "description": "Remove chunks which are empty.", + "type": "boolean" + }, + "runtimeChunk": { + "$ref": "#/definitions/OptimizationRuntimeChunkNormalized" + }, + "sideEffects": { + "description": "Skip over modules which contain no side effects when exports are not used (false: disabled, 'flag': only use manually placed side effects flag, true: also analyse source code for side effects).", + "anyOf": [ + { + "enum": ["flag"] + }, + { + "type": "boolean" + } + ] + }, + "splitChunks": { + "description": "Optimize duplication and caching by splitting chunks by shared modules and cache group.", + "anyOf": [ + { + "enum": [false] + }, + { + "$ref": "#/definitions/OptimizationSplitChunksOptions" + } + ] + }, + "usedExports": { + "description": "Figure out which exports are used by modules to mangle export names, omit unused exports and generate more efficient code (true: analyse used exports for each runtime, \"global\": analyse exports globally for all runtimes combined).", + "anyOf": [ + { + "enum": ["global"] + }, + { + "type": "boolean" + } + ] + } + } + }, + "OptimizationRuntimeChunk": { + "description": "Create an additional chunk which contains only the webpack runtime and chunk hash maps.", + "anyOf": [ + { + "enum": ["single", "multiple"] + }, + { + "type": "boolean" + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "description": "The name or name factory for the runtime chunks.", + "anyOf": [ + { + "type": "string" + }, + { + "instanceof": "Function", + "tsType": "import('../lib/optimize/RuntimeChunkPlugin').RuntimeChunkFunction" + } + ] + } + } + } + ] + }, + "OptimizationRuntimeChunkNormalized": { + "description": "Create an additional chunk which contains only the webpack runtime and chunk hash maps.", + "anyOf": [ + { + "enum": [false] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "description": "The name factory for the runtime chunks.", + "instanceof": "Function", + "tsType": "import('../lib/optimize/RuntimeChunkPlugin').RuntimeChunkFunction" + } + } + } + ] + }, + "OptimizationSplitChunksCacheGroup": { + "description": "Options object for describing behavior of a cache group selecting modules that should be cached together.", + "type": "object", + "additionalProperties": false, + "properties": { + "automaticNameDelimiter": { + "description": "Sets the name delimiter for created chunks.", + "type": "string", + "minLength": 1 + }, + "chunks": { + "description": "Select chunks for determining cache group content (defaults to \"initial\", \"initial\" and \"all\" requires adding these chunks to the HTML).", + "anyOf": [ + { + "enum": ["initial", "async", "all"] + }, + { + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "instanceof": "Function", + "tsType": "((chunk: import('../lib/Chunk')) => boolean)" + } + ] + }, + "enforce": { + "description": "Ignore minimum size, minimum chunks and maximum requests and always create chunks for this cache group.", + "type": "boolean" + }, + "enforceSizeThreshold": { + "description": "Size threshold at which splitting is enforced and other restrictions (minRemainingSize, maxAsyncRequests, maxInitialRequests) are ignored.", + "oneOf": [ + { + "$ref": "#/definitions/OptimizationSplitChunksSizes" + } + ] + }, + "filename": { + "description": "Sets the template for the filename for created chunks.", + "anyOf": [ + { + "type": "string", + "absolutePath": false, + "minLength": 1 + }, + { + "instanceof": "Function", + "tsType": "((pathData: import(\"../lib/Compilation\").PathData, assetInfo?: import(\"../lib/Compilation\").AssetInfo) => string)" + } + ] + }, + "idHint": { + "description": "Sets the hint for chunk id.", + "type": "string" + }, + "layer": { + "description": "Assign modules to a cache group by module layer.", + "anyOf": [ + { + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "type": "string" + }, + { + "instanceof": "Function", + "tsType": "((layer: string | null) => boolean)" + } + ] + }, + "maxAsyncRequests": { + "description": "Maximum number of requests which are accepted for on-demand loading.", + "type": "number", + "minimum": 1 + }, + "maxAsyncSize": { + "description": "Maximal size hint for the on-demand chunks.", + "oneOf": [ + { + "$ref": "#/definitions/OptimizationSplitChunksSizes" + } + ] + }, + "maxInitialRequests": { + "description": "Maximum number of initial chunks which are accepted for an entry point.", + "type": "number", + "minimum": 1 + }, + "maxInitialSize": { + "description": "Maximal size hint for the initial chunks.", + "oneOf": [ + { + "$ref": "#/definitions/OptimizationSplitChunksSizes" + } + ] + }, + "maxSize": { + "description": "Maximal size hint for the created chunks.", + "oneOf": [ + { + "$ref": "#/definitions/OptimizationSplitChunksSizes" + } + ] + }, + "minChunks": { + "description": "Minimum number of times a module has to be duplicated until it's considered for splitting.", + "type": "number", + "minimum": 1 + }, + "minRemainingSize": { + "description": "Minimal size for the chunks the stay after moving the modules to a new chunk.", + "oneOf": [ + { + "$ref": "#/definitions/OptimizationSplitChunksSizes" + } + ] + }, + "minSize": { + "description": "Minimal size for the created chunk.", + "oneOf": [ + { + "$ref": "#/definitions/OptimizationSplitChunksSizes" + } + ] + }, + "minSizeReduction": { + "description": "Minimum size reduction due to the created chunk.", + "oneOf": [ + { + "$ref": "#/definitions/OptimizationSplitChunksSizes" + } + ] + }, + "name": { + "description": "Give chunks for this cache group a name (chunks with equal name are merged).", + "anyOf": [ + { + "enum": [false] + }, + { + "type": "string" + }, + { + "instanceof": "Function", + "tsType": "((module: import('../lib/Module'), chunks: import('../lib/Chunk')[], key: string) => string | undefined)" + } + ] + }, + "priority": { + "description": "Priority of this cache group.", + "type": "number" + }, + "reuseExistingChunk": { + "description": "Try to reuse existing chunk (with name) when it has matching modules.", + "type": "boolean" + }, + "test": { + "description": "Assign modules to a cache group by module name.", + "anyOf": [ + { + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "type": "string" + }, + { + "instanceof": "Function", + "tsType": "((module: import('../lib/Module'), context: import('../lib/optimize/SplitChunksPlugin').CacheGroupsContext) => boolean)" + } + ] + }, + "type": { + "description": "Assign modules to a cache group by module type.", + "anyOf": [ + { + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "type": "string" + }, + { + "instanceof": "Function", + "tsType": "((type: string) => boolean)" + } + ] + }, + "usedExports": { + "description": "Compare used exports when checking common modules. Modules will only be put in the same chunk when exports are equal.", + "type": "boolean" + } + } + }, + "OptimizationSplitChunksGetCacheGroups": { + "description": "A function returning cache groups.", + "instanceof": "Function", + "tsType": "((module: import('../lib/Module')) => OptimizationSplitChunksCacheGroup | OptimizationSplitChunksCacheGroup[] | void)" + }, + "OptimizationSplitChunksOptions": { + "description": "Options object for splitting chunks into smaller chunks.", + "type": "object", + "additionalProperties": false, + "properties": { + "automaticNameDelimiter": { + "description": "Sets the name delimiter for created chunks.", + "type": "string", + "minLength": 1 + }, + "cacheGroups": { + "description": "Assign modules to a cache group (modules from different cache groups are tried to keep in separate chunks, default categories: 'default', 'defaultVendors').", + "type": "object", + "additionalProperties": { + "description": "Configuration for a cache group.", + "anyOf": [ + { + "enum": [false] + }, + { + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "type": "string" + }, + { + "$ref": "#/definitions/OptimizationSplitChunksGetCacheGroups" + }, + { + "$ref": "#/definitions/OptimizationSplitChunksCacheGroup" + } + ] + }, + "not": { + "description": "Using the cacheGroup shorthand syntax with a cache group named 'test' is a potential config error\nDid you intent to define a cache group with a test instead?\ncacheGroups: {\n : {\n test: ...\n }\n}.", + "type": "object", + "additionalProperties": true, + "properties": { + "test": { + "description": "The test property is a cache group name, but using the test option of the cache group could be intended instead.", + "anyOf": [ + { + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "type": "string" + }, + { + "$ref": "#/definitions/OptimizationSplitChunksGetCacheGroups" + } + ] + } + }, + "required": ["test"] + } + }, + "chunks": { + "description": "Select chunks for determining shared modules (defaults to \"async\", \"initial\" and \"all\" requires adding these chunks to the HTML).", + "anyOf": [ + { + "enum": ["initial", "async", "all"] + }, + { + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "instanceof": "Function", + "tsType": "((chunk: import('../lib/Chunk')) => boolean)" + } + ] + }, + "defaultSizeTypes": { + "description": "Sets the size types which are used when a number is used for sizes.", + "type": "array", + "items": { + "description": "Size type, like 'javascript', 'webassembly'.", + "type": "string" + }, + "minItems": 1 + }, + "enforceSizeThreshold": { + "description": "Size threshold at which splitting is enforced and other restrictions (minRemainingSize, maxAsyncRequests, maxInitialRequests) are ignored.", + "oneOf": [ + { + "$ref": "#/definitions/OptimizationSplitChunksSizes" + } + ] + }, + "fallbackCacheGroup": { + "description": "Options for modules not selected by any other cache group.", + "type": "object", + "additionalProperties": false, + "properties": { + "automaticNameDelimiter": { + "description": "Sets the name delimiter for created chunks.", + "type": "string", + "minLength": 1 + }, + "chunks": { + "description": "Select chunks for determining shared modules (defaults to \"async\", \"initial\" and \"all\" requires adding these chunks to the HTML).", + "anyOf": [ + { + "enum": ["initial", "async", "all"] + }, + { + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "instanceof": "Function", + "tsType": "((chunk: import('../lib/Chunk')) => boolean)" + } + ] + }, + "maxAsyncSize": { + "description": "Maximal size hint for the on-demand chunks.", + "oneOf": [ + { + "$ref": "#/definitions/OptimizationSplitChunksSizes" + } + ] + }, + "maxInitialSize": { + "description": "Maximal size hint for the initial chunks.", + "oneOf": [ + { + "$ref": "#/definitions/OptimizationSplitChunksSizes" + } + ] + }, + "maxSize": { + "description": "Maximal size hint for the created chunks.", + "oneOf": [ + { + "$ref": "#/definitions/OptimizationSplitChunksSizes" + } + ] + }, + "minSize": { + "description": "Minimal size for the created chunk.", + "oneOf": [ + { + "$ref": "#/definitions/OptimizationSplitChunksSizes" + } + ] + }, + "minSizeReduction": { + "description": "Minimum size reduction due to the created chunk.", + "oneOf": [ + { + "$ref": "#/definitions/OptimizationSplitChunksSizes" + } + ] + } + } + }, + "filename": { + "description": "Sets the template for the filename for created chunks.", + "anyOf": [ + { + "type": "string", + "absolutePath": false, + "minLength": 1 + }, + { + "instanceof": "Function", + "tsType": "((pathData: import(\"../lib/Compilation\").PathData, assetInfo?: import(\"../lib/Compilation\").AssetInfo) => string)" + } + ] + }, + "hidePathInfo": { + "description": "Prevents exposing path info when creating names for parts splitted by maxSize.", + "type": "boolean" + }, + "maxAsyncRequests": { + "description": "Maximum number of requests which are accepted for on-demand loading.", + "type": "number", + "minimum": 1 + }, + "maxAsyncSize": { + "description": "Maximal size hint for the on-demand chunks.", + "oneOf": [ + { + "$ref": "#/definitions/OptimizationSplitChunksSizes" + } + ] + }, + "maxInitialRequests": { + "description": "Maximum number of initial chunks which are accepted for an entry point.", + "type": "number", + "minimum": 1 + }, + "maxInitialSize": { + "description": "Maximal size hint for the initial chunks.", + "oneOf": [ + { + "$ref": "#/definitions/OptimizationSplitChunksSizes" + } + ] + }, + "maxSize": { + "description": "Maximal size hint for the created chunks.", + "oneOf": [ + { + "$ref": "#/definitions/OptimizationSplitChunksSizes" + } + ] + }, + "minChunks": { + "description": "Minimum number of times a module has to be duplicated until it's considered for splitting.", + "type": "number", + "minimum": 1 + }, + "minRemainingSize": { + "description": "Minimal size for the chunks the stay after moving the modules to a new chunk.", + "oneOf": [ + { + "$ref": "#/definitions/OptimizationSplitChunksSizes" + } + ] + }, + "minSize": { + "description": "Minimal size for the created chunks.", + "oneOf": [ + { + "$ref": "#/definitions/OptimizationSplitChunksSizes" + } + ] + }, + "minSizeReduction": { + "description": "Minimum size reduction due to the created chunk.", + "oneOf": [ + { + "$ref": "#/definitions/OptimizationSplitChunksSizes" + } + ] + }, + "name": { + "description": "Give chunks created a name (chunks with equal name are merged).", + "anyOf": [ + { + "enum": [false] + }, + { + "type": "string" + }, + { + "instanceof": "Function", + "tsType": "((module: import('../lib/Module'), chunks: import('../lib/Chunk')[], key: string) => string | undefined)" + } + ] + }, + "usedExports": { + "description": "Compare used exports when checking common modules. Modules will only be put in the same chunk when exports are equal.", + "type": "boolean" + } + } + }, + "OptimizationSplitChunksSizes": { + "description": "Size description for limits.", + "anyOf": [ + { + "description": "Size of the javascript part of the chunk.", + "type": "number", + "minimum": 0 + }, + { + "description": "Specify size limits per size type.", + "type": "object", + "additionalProperties": { + "description": "Size of the part of the chunk with the type of the key.", + "type": "number" + } + } + ] + }, + "Output": { + "description": "Options affecting the output of the compilation. `output` options tell webpack how to write the compiled files to disk.", + "type": "object", + "additionalProperties": false, + "properties": { + "amdContainer": { + "cli": { + "exclude": true + }, + "oneOf": [ + { + "$ref": "#/definitions/AmdContainer" + } + ] + }, + "assetModuleFilename": { + "$ref": "#/definitions/AssetModuleFilename" + }, + "asyncChunks": { + "description": "Enable/disable creating async chunks that are loaded on demand.", + "type": "boolean" + }, + "auxiliaryComment": { + "cli": { + "exclude": true + }, + "oneOf": [ + { + "$ref": "#/definitions/AuxiliaryComment" + } + ] + }, + "charset": { + "$ref": "#/definitions/Charset" + }, + "chunkFilename": { + "$ref": "#/definitions/ChunkFilename" + }, + "chunkFormat": { + "$ref": "#/definitions/ChunkFormat" + }, + "chunkLoadTimeout": { + "$ref": "#/definitions/ChunkLoadTimeout" + }, + "chunkLoading": { + "$ref": "#/definitions/ChunkLoading" + }, + "chunkLoadingGlobal": { + "$ref": "#/definitions/ChunkLoadingGlobal" + }, + "clean": { + "$ref": "#/definitions/Clean" + }, + "compareBeforeEmit": { + "$ref": "#/definitions/CompareBeforeEmit" + }, + "crossOriginLoading": { + "$ref": "#/definitions/CrossOriginLoading" + }, + "cssChunkFilename": { + "$ref": "#/definitions/CssChunkFilename" + }, + "cssFilename": { + "$ref": "#/definitions/CssFilename" + }, + "devtoolFallbackModuleFilenameTemplate": { + "$ref": "#/definitions/DevtoolFallbackModuleFilenameTemplate" + }, + "devtoolModuleFilenameTemplate": { + "$ref": "#/definitions/DevtoolModuleFilenameTemplate" + }, + "devtoolNamespace": { + "$ref": "#/definitions/DevtoolNamespace" + }, + "enabledChunkLoadingTypes": { + "$ref": "#/definitions/EnabledChunkLoadingTypes" + }, + "enabledLibraryTypes": { + "$ref": "#/definitions/EnabledLibraryTypes" + }, + "enabledWasmLoadingTypes": { + "$ref": "#/definitions/EnabledWasmLoadingTypes" + }, + "environment": { + "$ref": "#/definitions/Environment" + }, + "filename": { + "$ref": "#/definitions/Filename" + }, + "globalObject": { + "$ref": "#/definitions/GlobalObject" + }, + "hashDigest": { + "$ref": "#/definitions/HashDigest" + }, + "hashDigestLength": { + "$ref": "#/definitions/HashDigestLength" + }, + "hashFunction": { + "$ref": "#/definitions/HashFunction" + }, + "hashSalt": { + "$ref": "#/definitions/HashSalt" + }, + "hotUpdateChunkFilename": { + "$ref": "#/definitions/HotUpdateChunkFilename" + }, + "hotUpdateGlobal": { + "$ref": "#/definitions/HotUpdateGlobal" + }, + "hotUpdateMainFilename": { + "$ref": "#/definitions/HotUpdateMainFilename" + }, + "ignoreBrowserWarnings": { + "description": "Ignore warnings in the browser.", + "type": "boolean" + }, + "iife": { + "$ref": "#/definitions/Iife" + }, + "importFunctionName": { + "$ref": "#/definitions/ImportFunctionName" + }, + "importMetaName": { + "$ref": "#/definitions/ImportMetaName" + }, + "library": { + "$ref": "#/definitions/Library" + }, + "libraryExport": { + "cli": { + "exclude": true + }, + "oneOf": [ + { + "$ref": "#/definitions/LibraryExport" + } + ] + }, + "libraryTarget": { + "cli": { + "exclude": true + }, + "oneOf": [ + { + "$ref": "#/definitions/LibraryType" + } + ] + }, + "module": { + "$ref": "#/definitions/OutputModule" + }, + "path": { + "$ref": "#/definitions/Path" + }, + "pathinfo": { + "$ref": "#/definitions/Pathinfo" + }, + "publicPath": { + "$ref": "#/definitions/PublicPath" + }, + "scriptType": { + "$ref": "#/definitions/ScriptType" + }, + "sourceMapFilename": { + "$ref": "#/definitions/SourceMapFilename" + }, + "sourcePrefix": { + "$ref": "#/definitions/SourcePrefix" + }, + "strictModuleErrorHandling": { + "$ref": "#/definitions/StrictModuleErrorHandling" + }, + "strictModuleExceptionHandling": { + "$ref": "#/definitions/StrictModuleExceptionHandling" + }, + "trustedTypes": { + "description": "Use a Trusted Types policy to create urls for chunks. 'output.uniqueName' is used a default policy name. Passing a string sets a custom policy name.", + "anyOf": [ + { + "enum": [true] + }, + { + "description": "The name of the Trusted Types policy created by webpack to serve bundle chunks.", + "type": "string", + "minLength": 1 + }, + { + "$ref": "#/definitions/TrustedTypes" + } + ] + }, + "umdNamedDefine": { + "cli": { + "exclude": true + }, + "oneOf": [ + { + "$ref": "#/definitions/UmdNamedDefine" + } + ] + }, + "uniqueName": { + "$ref": "#/definitions/UniqueName" + }, + "wasmLoading": { + "$ref": "#/definitions/WasmLoading" + }, + "webassemblyModuleFilename": { + "$ref": "#/definitions/WebassemblyModuleFilename" + }, + "workerChunkLoading": { + "$ref": "#/definitions/ChunkLoading" + }, + "workerPublicPath": { + "$ref": "#/definitions/WorkerPublicPath" + }, + "workerWasmLoading": { + "$ref": "#/definitions/WasmLoading" + } + } + }, + "OutputModule": { + "description": "Output javascript files as module source type.", + "type": "boolean" + }, + "OutputNormalized": { + "description": "Normalized options affecting the output of the compilation. `output` options tell webpack how to write the compiled files to disk.", + "type": "object", + "additionalProperties": false, + "properties": { + "assetModuleFilename": { + "$ref": "#/definitions/AssetModuleFilename" + }, + "asyncChunks": { + "description": "Enable/disable creating async chunks that are loaded on demand.", + "type": "boolean" + }, + "charset": { + "$ref": "#/definitions/Charset" + }, + "chunkFilename": { + "$ref": "#/definitions/ChunkFilename" + }, + "chunkFormat": { + "$ref": "#/definitions/ChunkFormat" + }, + "chunkLoadTimeout": { + "$ref": "#/definitions/ChunkLoadTimeout" + }, + "chunkLoading": { + "$ref": "#/definitions/ChunkLoading" + }, + "chunkLoadingGlobal": { + "$ref": "#/definitions/ChunkLoadingGlobal" + }, + "clean": { + "$ref": "#/definitions/Clean" + }, + "compareBeforeEmit": { + "$ref": "#/definitions/CompareBeforeEmit" + }, + "crossOriginLoading": { + "$ref": "#/definitions/CrossOriginLoading" + }, + "cssChunkFilename": { + "$ref": "#/definitions/CssChunkFilename" + }, + "cssFilename": { + "$ref": "#/definitions/CssFilename" + }, + "devtoolFallbackModuleFilenameTemplate": { + "$ref": "#/definitions/DevtoolFallbackModuleFilenameTemplate" + }, + "devtoolModuleFilenameTemplate": { + "$ref": "#/definitions/DevtoolModuleFilenameTemplate" + }, + "devtoolNamespace": { + "$ref": "#/definitions/DevtoolNamespace" + }, + "enabledChunkLoadingTypes": { + "$ref": "#/definitions/EnabledChunkLoadingTypes" + }, + "enabledLibraryTypes": { + "$ref": "#/definitions/EnabledLibraryTypes" + }, + "enabledWasmLoadingTypes": { + "$ref": "#/definitions/EnabledWasmLoadingTypes" + }, + "environment": { + "$ref": "#/definitions/Environment" + }, + "filename": { + "$ref": "#/definitions/Filename" + }, + "globalObject": { + "$ref": "#/definitions/GlobalObject" + }, + "hashDigest": { + "$ref": "#/definitions/HashDigest" + }, + "hashDigestLength": { + "$ref": "#/definitions/HashDigestLength" + }, + "hashFunction": { + "$ref": "#/definitions/HashFunction" + }, + "hashSalt": { + "$ref": "#/definitions/HashSalt" + }, + "hotUpdateChunkFilename": { + "$ref": "#/definitions/HotUpdateChunkFilename" + }, + "hotUpdateGlobal": { + "$ref": "#/definitions/HotUpdateGlobal" + }, + "hotUpdateMainFilename": { + "$ref": "#/definitions/HotUpdateMainFilename" + }, + "ignoreBrowserWarnings": { + "description": "Ignore warnings in the browser.", + "type": "boolean" + }, + "iife": { + "$ref": "#/definitions/Iife" + }, + "importFunctionName": { + "$ref": "#/definitions/ImportFunctionName" + }, + "importMetaName": { + "$ref": "#/definitions/ImportMetaName" + }, + "library": { + "$ref": "#/definitions/LibraryOptions" + }, + "module": { + "$ref": "#/definitions/OutputModule" + }, + "path": { + "$ref": "#/definitions/Path" + }, + "pathinfo": { + "$ref": "#/definitions/Pathinfo" + }, + "publicPath": { + "$ref": "#/definitions/PublicPath" + }, + "scriptType": { + "$ref": "#/definitions/ScriptType" + }, + "sourceMapFilename": { + "$ref": "#/definitions/SourceMapFilename" + }, + "sourcePrefix": { + "$ref": "#/definitions/SourcePrefix" + }, + "strictModuleErrorHandling": { + "$ref": "#/definitions/StrictModuleErrorHandling" + }, + "strictModuleExceptionHandling": { + "$ref": "#/definitions/StrictModuleExceptionHandling" + }, + "trustedTypes": { + "$ref": "#/definitions/TrustedTypes" + }, + "uniqueName": { + "$ref": "#/definitions/UniqueName" + }, + "wasmLoading": { + "$ref": "#/definitions/WasmLoading" + }, + "webassemblyModuleFilename": { + "$ref": "#/definitions/WebassemblyModuleFilename" + }, + "workerChunkLoading": { + "$ref": "#/definitions/ChunkLoading" + }, + "workerPublicPath": { + "$ref": "#/definitions/WorkerPublicPath" + }, + "workerWasmLoading": { + "$ref": "#/definitions/WasmLoading" + } + }, + "required": [ + "environment", + "enabledChunkLoadingTypes", + "enabledLibraryTypes", + "enabledWasmLoadingTypes" + ] + }, + "Parallelism": { + "description": "The number of parallel processed modules in the compilation.", + "type": "number", + "minimum": 1 + }, + "ParserOptionsByModuleType": { + "description": "Specify options for each parser.", + "type": "object", + "additionalProperties": { + "description": "Options for parsing.", + "type": "object", + "additionalProperties": true + }, + "properties": { + "asset": { + "$ref": "#/definitions/AssetParserOptions" + }, + "asset/inline": { + "$ref": "#/definitions/EmptyParserOptions" + }, + "asset/resource": { + "$ref": "#/definitions/EmptyParserOptions" + }, + "asset/source": { + "$ref": "#/definitions/EmptyParserOptions" + }, + "css": { + "$ref": "#/definitions/CssParserOptions" + }, + "css/auto": { + "$ref": "#/definitions/CssAutoParserOptions" + }, + "css/global": { + "$ref": "#/definitions/CssGlobalParserOptions" + }, + "css/module": { + "$ref": "#/definitions/CssModuleParserOptions" + }, + "javascript": { + "$ref": "#/definitions/JavascriptParserOptions" + }, + "javascript/auto": { + "$ref": "#/definitions/JavascriptParserOptions" + }, + "javascript/dynamic": { + "$ref": "#/definitions/JavascriptParserOptions" + }, + "javascript/esm": { + "$ref": "#/definitions/JavascriptParserOptions" + }, + "json": { + "$ref": "#/definitions/JsonParserOptions" + } + } + }, + "Path": { + "description": "The output directory as **absolute path** (required).", + "type": "string", + "absolutePath": true + }, + "Pathinfo": { + "description": "Include comments with information about the modules.", + "anyOf": [ + { + "enum": ["verbose"] + }, + { + "type": "boolean" + } + ] + }, + "Performance": { + "description": "Configuration for web performance recommendations.", + "anyOf": [ + { + "enum": [false] + }, + { + "$ref": "#/definitions/PerformanceOptions" + } + ] + }, + "PerformanceOptions": { + "description": "Configuration object for web performance recommendations.", + "type": "object", + "additionalProperties": false, + "properties": { + "assetFilter": { + "description": "Filter function to select assets that are checked.", + "instanceof": "Function", + "tsType": "((name: import('../lib/Compilation').Asset['name'], source: import('../lib/Compilation').Asset['source'], assetInfo: import('../lib/Compilation').Asset['info']) => boolean)" + }, + "hints": { + "description": "Sets the format of the hints: warnings, errors or nothing at all.", + "enum": [false, "warning", "error"] + }, + "maxAssetSize": { + "description": "File size limit (in bytes) when exceeded, that webpack will provide performance hints.", + "type": "number" + }, + "maxEntrypointSize": { + "description": "Total size of an entry point (in bytes).", + "type": "number" + } + } + }, + "Plugins": { + "description": "Add additional plugins to the compiler.", + "type": "array", + "items": { + "description": "Plugin of type object or instanceof Function.", + "anyOf": [ + { + "$ref": "#/definitions/Falsy" + }, + { + "$ref": "#/definitions/WebpackPluginInstance" + }, + { + "$ref": "#/definitions/WebpackPluginFunction" + } + ] + } + }, + "Profile": { + "description": "Capture timing information for each module.", + "type": "boolean" + }, + "PublicPath": { + "description": "The 'publicPath' specifies the public URL address of the output files when referenced in a browser.", + "anyOf": [ + { + "enum": ["auto"] + }, + { + "$ref": "#/definitions/RawPublicPath" + } + ] + }, + "RawPublicPath": { + "description": "The 'publicPath' specifies the public URL address of the output files when referenced in a browser.", + "anyOf": [ + { + "type": "string" + }, + { + "instanceof": "Function", + "tsType": "((pathData: import(\"../lib/Compilation\").PathData, assetInfo?: import(\"../lib/Compilation\").AssetInfo) => string)" + } + ] + }, + "RecordsInputPath": { + "description": "Store compiler state to a json file.", + "anyOf": [ + { + "enum": [false] + }, + { + "type": "string", + "absolutePath": true + } + ] + }, + "RecordsOutputPath": { + "description": "Load compiler state from a json file.", + "anyOf": [ + { + "enum": [false] + }, + { + "type": "string", + "absolutePath": true + } + ] + }, + "RecordsPath": { + "description": "Store/Load compiler state from/to a json file. This will result in persistent ids of modules and chunks. An absolute path is expected. `recordsPath` is used for `recordsInputPath` and `recordsOutputPath` if they left undefined.", + "anyOf": [ + { + "enum": [false] + }, + { + "type": "string", + "absolutePath": true + } + ] + }, + "Resolve": { + "description": "Options for the resolver.", + "oneOf": [ + { + "$ref": "#/definitions/ResolveOptions" + } + ] + }, + "ResolveAlias": { + "description": "Redirect module requests.", + "anyOf": [ + { + "type": "array", + "items": { + "description": "Alias configuration.", + "type": "object", + "additionalProperties": false, + "properties": { + "alias": { + "description": "New request.", + "anyOf": [ + { + "description": "Multiple alternative requests.", + "type": "array", + "items": { + "description": "One choice of request.", + "type": "string", + "minLength": 1 + } + }, + { + "description": "Ignore request (replace with empty module).", + "enum": [false] + }, + { + "description": "New request.", + "type": "string", + "minLength": 1 + } + ] + }, + "name": { + "description": "Request to be redirected.", + "type": "string" + }, + "onlyModule": { + "description": "Redirect only exact matching request.", + "type": "boolean" + } + }, + "required": ["alias", "name"] + } + }, + { + "type": "object", + "additionalProperties": { + "description": "New request.", + "anyOf": [ + { + "description": "Multiple alternative requests.", + "type": "array", + "items": { + "description": "One choice of request.", + "type": "string", + "minLength": 1 + } + }, + { + "description": "Ignore request (replace with empty module).", + "enum": [false] + }, + { + "description": "New request.", + "type": "string", + "minLength": 1 + } + ] + } + } + ] + }, + "ResolveLoader": { + "description": "Options for the resolver when resolving loaders.", + "oneOf": [ + { + "$ref": "#/definitions/ResolveOptions" + } + ] + }, + "ResolveOptions": { + "description": "Options object for resolving requests.", + "type": "object", + "additionalProperties": false, + "properties": { + "alias": { + "$ref": "#/definitions/ResolveAlias" + }, + "aliasFields": { + "description": "Fields in the description file (usually package.json) which are used to redirect requests inside the module.", + "type": "array", + "items": { + "description": "Field in the description file (usually package.json) which are used to redirect requests inside the module.", + "anyOf": [ + { + "type": "array", + "items": { + "description": "Part of the field path in the description file (usually package.json) which are used to redirect requests inside the module.", + "type": "string", + "minLength": 1 + } + }, + { + "type": "string", + "minLength": 1 + } + ] + } + }, + "byDependency": { + "description": "Extra resolve options per dependency category. Typical categories are \"commonjs\", \"amd\", \"esm\".", + "type": "object", + "additionalProperties": { + "description": "Options object for resolving requests.", + "oneOf": [ + { + "$ref": "#/definitions/ResolveOptions" + } + ] + } + }, + "cache": { + "description": "Enable caching of successfully resolved requests (cache entries are revalidated).", "type": "boolean" }, - "removeAvailableModules": { - "description": "Removes modules from chunks when these modules are already included in all parents", + "cachePredicate": { + "description": "Predicate function to decide which requests should be cached.", + "instanceof": "Function", + "tsType": "((request: import('enhanced-resolve').ResolveRequest) => boolean)" + }, + "cacheWithContext": { + "description": "Include the context information in the cache identifier when caching.", + "type": "boolean" + }, + "conditionNames": { + "description": "Condition names for exports field entry point.", + "type": "array", + "items": { + "description": "Condition names for exports field entry point.", + "type": "string" + } + }, + "descriptionFiles": { + "description": "Filenames used to find a description file (like a package.json).", + "type": "array", + "items": { + "description": "Filename used to find a description file (like a package.json).", + "type": "string", + "minLength": 1 + } + }, + "enforceExtension": { + "description": "Enforce the resolver to use one of the extensions from the extensions option (User must specify requests without extension).", + "type": "boolean" + }, + "exportsFields": { + "description": "Field names from the description file (usually package.json) which are used to provide entry points of a package.", + "type": "array", + "items": { + "description": "Field name from the description file (usually package.json) which is used to provide entry points of a package.", + "type": "string" + } + }, + "extensionAlias": { + "description": "An object which maps extension to extension aliases.", + "type": "object", + "additionalProperties": { + "description": "Extension alias.", + "anyOf": [ + { + "description": "Multiple extensions.", + "type": "array", + "items": { + "description": "Aliased extension.", + "type": "string", + "minLength": 1 + } + }, + { + "description": "Aliased extension.", + "type": "string", + "minLength": 1 + } + ] + } + }, + "extensions": { + "description": "Extensions added to the request when trying to find the file.", + "type": "array", + "items": { + "description": "Extension added to the request when trying to find the file.", + "type": "string" + } + }, + "fallback": { + "description": "Redirect module requests when normal resolving fails.", + "oneOf": [ + { + "$ref": "#/definitions/ResolveAlias" + } + ] + }, + "fileSystem": { + "description": "Filesystem for the resolver.", + "tsType": "(import('../lib/util/fs').InputFileSystem)" + }, + "fullySpecified": { + "description": "Treats the request specified by the user as fully specified, meaning no extensions are added and the mainFiles in directories are not resolved (This doesn't affect requests from mainFields, aliasFields or aliases).", + "type": "boolean" + }, + "importsFields": { + "description": "Field names from the description file (usually package.json) which are used to provide internal request of a package (requests starting with # are considered as internal).", + "type": "array", + "items": { + "description": "Field name from the description file (usually package.json) which is used to provide internal request of a package (requests starting with # are considered as internal).", + "type": "string" + } + }, + "mainFields": { + "description": "Field names from the description file (package.json) which are used to find the default entry point.", + "type": "array", + "items": { + "description": "Field name from the description file (package.json) which are used to find the default entry point.", + "anyOf": [ + { + "type": "array", + "items": { + "description": "Part of the field path from the description file (package.json) which are used to find the default entry point.", + "type": "string", + "minLength": 1 + } + }, + { + "type": "string", + "minLength": 1 + } + ] + } + }, + "mainFiles": { + "description": "Filenames used to find the default entry point if there is no description file or main field.", + "type": "array", + "items": { + "description": "Filename used to find the default entry point if there is no description file or main field.", + "type": "string", + "minLength": 1 + } + }, + "modules": { + "description": "Folder names or directory paths where to find modules.", + "type": "array", + "items": { + "description": "Folder name or directory path where to find modules.", + "type": "string", + "minLength": 1 + } + }, + "plugins": { + "description": "Plugins for the resolver.", + "type": "array", + "cli": { + "exclude": true + }, + "items": { + "description": "Plugin of type object or instanceof Function.", + "anyOf": [ + { + "enum": ["..."] + }, + { + "$ref": "#/definitions/Falsy" + }, + { + "$ref": "#/definitions/ResolvePluginInstance" + } + ] + } + }, + "preferAbsolute": { + "description": "Prefer to resolve server-relative URLs (starting with '/') as absolute paths before falling back to resolve in 'resolve.roots'.", + "type": "boolean" + }, + "preferRelative": { + "description": "Prefer to resolve module requests as relative request and fallback to resolving as module.", + "type": "boolean" + }, + "resolver": { + "description": "Custom resolver.", + "tsType": "(import('enhanced-resolve').Resolver)" + }, + "restrictions": { + "description": "A list of resolve restrictions. Resolve results must fulfill all of these restrictions to resolve successfully. Other resolve paths are taken when restrictions are not met.", + "type": "array", + "items": { + "description": "Resolve restriction. Resolve result must fulfill this restriction.", + "anyOf": [ + { + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "type": "string", + "absolutePath": true, + "minLength": 1 + } + ] + } + }, + "roots": { + "description": "A list of directories in which requests that are server-relative URLs (starting with '/') are resolved.", + "type": "array", + "items": { + "description": "Directory in which requests that are server-relative URLs (starting with '/') are resolved.", + "type": "string" + } + }, + "symlinks": { + "description": "Enable resolving symlinks to the original location.", + "type": "boolean" + }, + "unsafeCache": { + "description": "Enable caching of successfully resolved requests (cache entries are not revalidated).", + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "object", + "additionalProperties": true + } + ] + }, + "useSyncFileSystemCalls": { + "description": "Use synchronous filesystem calls for the resolver.", "type": "boolean" + } + } + }, + "ResolvePluginInstance": { + "description": "Plugin instance.", + "anyOf": [ + { + "type": "object", + "additionalProperties": true, + "properties": { + "apply": { + "description": "The run point of the plugin, required method.", + "instanceof": "Function", + "tsType": "(arg0: import('enhanced-resolve').Resolver) => void" + } + }, + "required": ["apply"] + }, + { + "instanceof": "Function", + "tsType": "((this: import('enhanced-resolve').Resolver, arg1: import('enhanced-resolve').Resolver) => void)" + } + ] + }, + "RuleSetCondition": { + "description": "A condition matcher.", + "cli": { + "helper": true + }, + "anyOf": [ + { + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "type": "string" + }, + { + "instanceof": "Function", + "tsType": "((value: string) => boolean)" + }, + { + "$ref": "#/definitions/RuleSetLogicalConditions" + }, + { + "$ref": "#/definitions/RuleSetConditions" + } + ] + }, + "RuleSetConditionAbsolute": { + "description": "A condition matcher matching an absolute path.", + "cli": { + "helper": true + }, + "anyOf": [ + { + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "type": "string", + "absolutePath": true + }, + { + "instanceof": "Function", + "tsType": "((value: string) => boolean)" + }, + { + "$ref": "#/definitions/RuleSetLogicalConditionsAbsolute" + }, + { + "$ref": "#/definitions/RuleSetConditionsAbsolute" + } + ] + }, + "RuleSetConditionOrConditions": { + "description": "One or multiple rule conditions.", + "cli": { + "helper": true + }, + "anyOf": [ + { + "$ref": "#/definitions/RuleSetCondition" + }, + { + "$ref": "#/definitions/RuleSetConditions" + } + ] + }, + "RuleSetConditionOrConditionsAbsolute": { + "description": "One or multiple rule conditions matching an absolute path.", + "cli": { + "helper": true + }, + "anyOf": [ + { + "$ref": "#/definitions/RuleSetConditionAbsolute" + }, + { + "$ref": "#/definitions/RuleSetConditionsAbsolute" + } + ] + }, + "RuleSetConditions": { + "description": "A list of rule conditions.", + "type": "array", + "items": { + "description": "A rule condition.", + "oneOf": [ + { + "$ref": "#/definitions/RuleSetCondition" + } + ] + } + }, + "RuleSetConditionsAbsolute": { + "description": "A list of rule conditions matching an absolute path.", + "type": "array", + "items": { + "description": "A rule condition matching an absolute path.", + "oneOf": [ + { + "$ref": "#/definitions/RuleSetConditionAbsolute" + } + ] + } + }, + "RuleSetLoader": { + "description": "A loader request.", + "type": "string", + "minLength": 1 + }, + "RuleSetLoaderOptions": { + "description": "Options passed to a loader.", + "anyOf": [ + { + "type": "string" }, - "removeEmptyChunks": { - "description": "Remove chunks which are empty", - "type": "boolean" + { + "type": "object" + } + ] + }, + "RuleSetLogicalConditions": { + "description": "Logic operators used in a condition matcher.", + "type": "object", + "additionalProperties": false, + "properties": { + "and": { + "description": "Logical AND.", + "oneOf": [ + { + "$ref": "#/definitions/RuleSetConditions" + } + ] }, - "runtimeChunk": { - "description": "Create an additional chunk which contains only the webpack runtime and chunk hash maps", + "not": { + "description": "Logical NOT.", "oneOf": [ { - "type": "boolean" - }, + "$ref": "#/definitions/RuleSetCondition" + } + ] + }, + "or": { + "description": "Logical OR.", + "oneOf": [ { - "enum": ["single", "multiple"] - }, + "$ref": "#/definitions/RuleSetConditions" + } + ] + } + } + }, + "RuleSetLogicalConditionsAbsolute": { + "description": "Logic operators used in a condition matcher.", + "type": "object", + "additionalProperties": false, + "properties": { + "and": { + "description": "Logical AND.", + "oneOf": [ { - "type": "object", - "additionalProperties": false, - "properties": { - "name": { - "description": "The name or name factory for the runtime chunks", - "oneOf": [ - { - "type": "string" - }, - { - "instanceof": "Function", - "tsType": "Function" - } - ] - } - } + "$ref": "#/definitions/RuleSetConditionsAbsolute" } ] }, - "sideEffects": { - "description": "Skip over modules which are flagged to contain no side effects when exports are not used", - "type": "boolean" - }, - "splitChunks": { - "description": "Optimize duplication and caching by splitting chunks by shared modules and cache group", + "not": { + "description": "Logical NOT.", "oneOf": [ { - "enum": [false] - }, - { - "$ref": "#/definitions/OptimizationSplitChunksOptions" + "$ref": "#/definitions/RuleSetConditionAbsolute" } ] }, - "usedExports": { - "description": "Figure out which exports are used by modules to mangle export names, omit unused exports and generate more efficient code", - "type": "boolean" + "or": { + "description": "Logical OR.", + "oneOf": [ + { + "$ref": "#/definitions/RuleSetConditionsAbsolute" + } + ] } } }, - "OptimizationSplitChunksOptions": { + "RuleSetRule": { + "description": "A rule description with conditions and effects for modules.", "type": "object", "additionalProperties": false, "properties": { - "automaticNameDelimiter": { - "description": "Sets the name delimiter for created chunks", - "type": "string", - "minLength": 1 - }, - "cacheGroups": { - "description": "Assign modules to a cache group (modules from different cache groups are tried to keep in separate chunks)", + "assert": { + "description": "Match on import assertions of the dependency.", "type": "object", "additionalProperties": { - "description": "Configuration for a cache group", - "anyOf": [ - { - "enum": [false] - }, - { - "instanceof": "Function", - "tsType": "Function" - }, - { - "type": "string" - }, - { - "instanceof": "RegExp", - "tsType": "RegExp" - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "automaticNameDelimiter": { - "description": "Sets the name delimiter for created chunks", - "type": "string", - "minLength": 1 - }, - "automaticNamePrefix": { - "description": "Sets the name prefix for created chunks", - "type": "string" - }, - "chunks": { - "description": "Select chunks for determining cache group content (defaults to \"initial\", \"initial\" and \"all\" requires adding these chunks to the HTML)", - "oneOf": [ - { - "enum": ["initial", "async", "all"] - }, - { - "instanceof": "Function", - "tsType": "Function" - } - ] - }, - "enforce": { - "description": "Ignore minimum size, minimum chunks and maximum requests and always create chunks for this cache group", - "type": "boolean" - }, - "filename": { - "description": "Sets the template for the filename for created chunks (Only works for initial chunks)", - "type": "string", - "minLength": 1 - }, - "maxAsyncRequests": { - "description": "Maximum number of requests which are accepted for on-demand loading", - "type": "number", - "minimum": 1 - }, - "maxInitialRequests": { - "description": "Maximum number of initial chunks which are accepted for an entry point", - "type": "number", - "minimum": 1 - }, - "maxSize": { - "description": "Maximal size hint for the created chunks", - "type": "number", - "minimum": 0 - }, - "minChunks": { - "description": "Minimum number of times a module has to be duplicated until it's considered for splitting", - "type": "number", - "minimum": 1 - }, - "minSize": { - "description": "Minimal size for the created chunk", - "type": "number", - "minimum": 0 - }, - "name": { - "description": "Give chunks for this cache group a name (chunks with equal name are merged)", - "oneOf": [ - { - "type": "boolean" - }, - { - "instanceof": "Function", - "tsType": "Function" - }, - { - "type": "string" - } - ] - }, - "priority": { - "description": "Priority of this cache group", - "type": "number" - }, - "reuseExistingChunk": { - "description": "Try to reuse existing chunk (with name) when it has matching modules", - "type": "boolean" - }, - "test": { - "description": "Assign modules to a cache group", - "oneOf": [ - { - "instanceof": "Function", - "tsType": "Function" - }, - { - "type": "string" - }, - { - "instanceof": "RegExp", - "tsType": "RegExp" - } - ] - } - } - } - ] + "$ref": "#/definitions/RuleSetConditionOrConditions" } }, - "chunks": { - "description": "Select chunks for determining shared modules (defaults to \"async\", \"initial\" and \"all\" requires adding these chunks to the HTML)", + "compiler": { + "description": "Match the child compiler name.", "oneOf": [ { - "enum": ["initial", "async", "all"] - }, + "$ref": "#/definitions/RuleSetConditionOrConditions" + } + ] + }, + "dependency": { + "description": "Match dependency type.", + "oneOf": [ { - "instanceof": "Function", - "tsType": "Function" + "$ref": "#/definitions/RuleSetConditionOrConditions" } ] }, - "fallbackCacheGroup": { - "description": "Options for modules not selected by any other cache group", + "descriptionData": { + "description": "Match values of properties in the description file (usually package.json).", "type": "object", - "additionalProperties": false, - "properties": { - "automaticNameDelimiter": { - "description": "Sets the name delimiter for created chunks", - "type": "string", - "minLength": 1 - }, - "maxSize": { - "description": "Maximal size hint for the created chunks", - "type": "number", - "minimum": 0 - }, - "minSize": { - "description": "Minimal size for the created chunk", - "type": "number", - "minimum": 0 - } + "additionalProperties": { + "$ref": "#/definitions/RuleSetConditionOrConditions" } }, - "filename": { - "description": "Sets the template for the filename for created chunks (Only works for initial chunks)", - "type": "string", - "minLength": 1 + "enforce": { + "description": "Enforce this rule as pre or post step.", + "enum": ["pre", "post"] }, - "hidePathInfo": { - "description": "Prevents exposing path info when creating names for parts splitted by maxSize", - "type": "boolean" + "exclude": { + "description": "Shortcut for resource.exclude.", + "oneOf": [ + { + "$ref": "#/definitions/RuleSetConditionOrConditionsAbsolute" + } + ] }, - "maxAsyncRequests": { - "description": "Maximum number of requests which are accepted for on-demand loading", - "type": "number", - "minimum": 1 + "generator": { + "description": "The options for the module generator.", + "type": "object" }, - "maxInitialRequests": { - "description": "Maximum number of initial chunks which are accepted for an entry point", - "type": "number", - "minimum": 1 + "include": { + "description": "Shortcut for resource.include.", + "oneOf": [ + { + "$ref": "#/definitions/RuleSetConditionOrConditionsAbsolute" + } + ] }, - "maxSize": { - "description": "Maximal size hint for the created chunks", - "type": "number", - "minimum": 0 + "issuer": { + "description": "Match the issuer of the module (The module pointing to this module).", + "oneOf": [ + { + "$ref": "#/definitions/RuleSetConditionOrConditionsAbsolute" + } + ] }, - "minChunks": { - "description": "Minimum number of times a module has to be duplicated until it's considered for splitting", - "type": "number", - "minimum": 1 + "issuerLayer": { + "description": "Match layer of the issuer of this module (The module pointing to this module).", + "oneOf": [ + { + "$ref": "#/definitions/RuleSetConditionOrConditions" + } + ] }, - "minSize": { - "description": "Minimal size for the created chunks", - "type": "number", - "minimum": 0 + "layer": { + "description": "Specifies the layer in which the module should be placed in.", + "type": "string" }, - "name": { - "description": "Give chunks created a name (chunks with equal name are merged)", + "loader": { + "description": "Shortcut for use.loader.", "oneOf": [ { - "type": "boolean" - }, - { - "instanceof": "Function", - "tsType": "Function" - }, - { - "type": "string" + "$ref": "#/definitions/RuleSetLoader" } ] - } - } - }, - "OutputOptions": { - "type": "object", - "additionalProperties": false, - "properties": { - "auxiliaryComment": { - "description": "Add a comment in the UMD wrapper.", - "anyOf": [ - { - "description": "Append the same comment above each import style.", - "type": "string" - }, + }, + "mimetype": { + "description": "Match module mimetype when load from Data URI.", + "oneOf": [ { - "description": "Set explicit comments for `commonjs`, `commonjs2`, `amd`, and `root`.", - "type": "object", - "additionalProperties": false, - "properties": { - "amd": { - "description": "Set comment for `amd` section in UMD", - "type": "string" - }, - "commonjs": { - "description": "Set comment for `commonjs` (exports) section in UMD", - "type": "string" - }, - "commonjs2": { - "description": "Set comment for `commonjs2` (module.exports) section in UMD", - "type": "string" - }, - "root": { - "description": "Set comment for `root` (global variable) section in UMD", - "type": "string" - } - } + "$ref": "#/definitions/RuleSetConditionOrConditions" } ] }, - "chunkCallbackName": { - "description": "The callback function name used by webpack for loading of chunks in WebWorkers.", - "type": "string" - }, - "chunkFilename": { - "description": "The filename of non-entry chunks as relative path inside the `output.path` directory.", - "type": "string", - "absolutePath": false + "oneOf": { + "description": "Only execute the first matching rule in this array.", + "type": "array", + "items": { + "description": "A rule.", + "anyOf": [ + { + "$ref": "#/definitions/Falsy" + }, + { + "$ref": "#/definitions/RuleSetRule" + } + ] + } }, - "chunkLoadTimeout": { - "description": "Number of milliseconds before chunk request expires", - "type": "number" + "options": { + "description": "Shortcut for use.options.", + "cli": { + "exclude": true + }, + "oneOf": [ + { + "$ref": "#/definitions/RuleSetLoaderOptions" + } + ] }, - "crossOriginLoading": { - "description": "This option enables cross-origin loading of chunks.", - "enum": [false, "anonymous", "use-credentials"] + "parser": { + "description": "Options for parsing.", + "type": "object", + "additionalProperties": true }, - "devtoolFallbackModuleFilenameTemplate": { - "description": "Similar to `output.devtoolModuleFilenameTemplate`, but used in the case of duplicate module identifiers.", - "anyOf": [ + "realResource": { + "description": "Match the real resource path of the module.", + "oneOf": [ { - "type": "string" - }, + "$ref": "#/definitions/RuleSetConditionOrConditionsAbsolute" + } + ] + }, + "resolve": { + "description": "Options for the resolver.", + "type": "object", + "oneOf": [ { - "instanceof": "Function", - "tsType": "Function" + "$ref": "#/definitions/ResolveOptions" } ] }, - "devtoolLineToLine": { - "description": "Enable line to line mapped mode for all/specified modules. Line to line mapped mode uses a simple SourceMap where each line of the generated source is mapped to the same line of the original source. It’s a performance optimization. Only use it if your performance need to be better and you are sure that input lines match which generated lines.", - "anyOf": [ - { - "description": "`true` enables it for all modules (not recommended)", - "type": "boolean" - }, + "resource": { + "description": "Match the resource path of the module.", + "oneOf": [ { - "description": "An object similar to `module.loaders` enables it for specific files.", - "type": "object" + "$ref": "#/definitions/RuleSetConditionOrConditionsAbsolute" } ] }, - "devtoolModuleFilenameTemplate": { - "description": "Filename template string of function for the sources array in a generated SourceMap.", - "anyOf": [ - { - "type": "string" - }, + "resourceFragment": { + "description": "Match the resource fragment of the module.", + "oneOf": [ { - "instanceof": "Function", - "tsType": "Function" + "$ref": "#/definitions/RuleSetConditionOrConditions" } ] }, - "devtoolNamespace": { - "description": "Module namespace to use when interpolating filename template string for the sources array in a generated SourceMap. Defaults to `output.library` if not set. It's useful for avoiding runtime collisions in sourcemaps from multiple webpack projects built as libraries.", - "type": "string" - }, - "filename": { - "description": "Specifies the name of each output file on disk. You must **not** specify an absolute path here! The `output.path` option determines the location on disk the files are written to, filename is used solely for naming the individual files.", - "anyOf": [ - { - "type": "string", - "absolutePath": false - }, + "resourceQuery": { + "description": "Match the resource query of the module.", + "oneOf": [ { - "instanceof": "Function", - "tsType": "Function" + "$ref": "#/definitions/RuleSetConditionOrConditions" } ] }, - "futureEmitAssets": { - "description": "Use the future version of asset emitting logic, which is allows freeing memory of assets after emitting. It could break plugins which assume that assets are still readable after emitting. Will be the new default in the next major version.", - "type": "boolean" - }, - "globalObject": { - "description": "An expression which is used to address the global object/scope in runtime code", - "type": "string", - "minLength": 1 - }, - "hashDigest": { - "description": "Digest type used for the hash", - "type": "string" - }, - "hashDigestLength": { - "description": "Number of chars which are used for the hash", - "type": "number", - "minimum": 1 + "rules": { + "description": "Match and execute these rules when this rule is matched.", + "type": "array", + "items": { + "description": "A rule.", + "anyOf": [ + { + "$ref": "#/definitions/Falsy" + }, + { + "$ref": "#/definitions/RuleSetRule" + } + ] + } }, - "hashFunction": { - "description": "Algorithm used for generation the hash (see node.js crypto package)", - "anyOf": [ - { - "type": "string", - "minLength": 1 - }, + "scheme": { + "description": "Match module scheme.", + "oneOf": [ { - "instanceof": "Function", - "tsType": "(new () => import('../lib/util/createHash').Hash)" + "$ref": "#/definitions/RuleSetConditionOrConditions" } ] }, - "hashSalt": { - "description": "Any string which is added to the hash to salt it", - "type": "string", - "minLength": 1 + "sideEffects": { + "description": "Flags a module as with or without side effects.", + "type": "boolean" }, - "hotUpdateChunkFilename": { - "description": "The filename of the Hot Update Chunks. They are inside the output.path directory.", - "anyOf": [ - { - "type": "string", - "absolutePath": false - }, + "test": { + "description": "Shortcut for resource.test.", + "oneOf": [ { - "instanceof": "Function", - "tsType": "Function" + "$ref": "#/definitions/RuleSetConditionOrConditionsAbsolute" } ] }, - "hotUpdateFunction": { - "description": "The JSONP function used by webpack for async loading of hot update chunks.", + "type": { + "description": "Module type to use for the module.", "type": "string" }, - "hotUpdateMainFilename": { - "description": "The filename of the Hot Update Main File. It is inside the `output.path` directory.", - "anyOf": [ - { - "type": "string", - "absolutePath": false - }, + "use": { + "description": "Modifiers applied to the module when rule is matched.", + "oneOf": [ { - "instanceof": "Function", - "tsType": "Function" + "$ref": "#/definitions/RuleSetUse" } ] }, - "jsonpFunction": { - "description": "The JSONP function used by webpack for async loading of chunks.", - "type": "string" + "with": { + "description": "Match on import attributes of the dependency.", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/RuleSetConditionOrConditions" + } + } + } + }, + "RuleSetRules": { + "description": "A list of rules.", + "type": "array", + "items": { + "description": "A rule.", + "anyOf": [ + { + "cli": { + "exclude": true + }, + "enum": ["..."] + }, + { + "$ref": "#/definitions/Falsy" + }, + { + "$ref": "#/definitions/RuleSetRule" + } + ] + } + }, + "RuleSetUse": { + "description": "A list of descriptions of loaders applied.", + "anyOf": [ + { + "type": "array", + "items": { + "description": "An use item.", + "anyOf": [ + { + "$ref": "#/definitions/Falsy" + }, + { + "$ref": "#/definitions/RuleSetUseItem" + } + ] + } }, - "jsonpScriptType": { - "description": "This option enables loading async chunks via a custom script type, such as script type=\"module\"", - "enum": [false, "text/javascript", "module"] + { + "$ref": "#/definitions/RuleSetUseFunction" }, - "library": { - "description": "If set, export the bundle as library. `output.library` is the name.", - "anyOf": [ - { + { + "$ref": "#/definitions/RuleSetUseItem" + } + ] + }, + "RuleSetUseFunction": { + "description": "The function is called on each data and return rule set item.", + "instanceof": "Function", + "tsType": "((data: import('../lib/rules/RuleSetCompiler').EffectData) => (RuleSetUseItem | (Falsy | RuleSetUseItem)[]))" + }, + "RuleSetUseItem": { + "description": "A description of an applied loader.", + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "ident": { + "description": "Unique loader options identifier.", "type": "string" }, - { - "type": "array", - "items": { - "description": "A part of the library name", - "type": "string" - } + "loader": { + "description": "Loader name.", + "oneOf": [ + { + "$ref": "#/definitions/RuleSetLoader" + } + ] }, - { - "$ref": "#/definitions/LibraryCustomUmdObject" + "options": { + "description": "Loader options.", + "oneOf": [ + { + "$ref": "#/definitions/RuleSetLoaderOptions" + } + ] } - ] + } }, - "libraryExport": { - "description": "Specify which export should be exposed as library", - "anyOf": [ - { - "type": "string" + { + "$ref": "#/definitions/RuleSetUseFunction" + }, + { + "$ref": "#/definitions/RuleSetLoader" + } + ] + }, + "ScriptType": { + "description": "This option enables loading async chunks via a custom script type, such as script type=\"module\".", + "enum": [false, "text/javascript", "module"] + }, + "SnapshotOptions": { + "description": "Options affecting how file system snapshots are created and validated.", + "type": "object", + "additionalProperties": false, + "properties": { + "buildDependencies": { + "description": "Options for snapshotting build dependencies to determine if the whole cache need to be invalidated.", + "type": "object", + "additionalProperties": false, + "properties": { + "hash": { + "description": "Use hashes of the content of the files/directories to determine invalidation.", + "type": "boolean" }, - { - "$ref": "#/definitions/ArrayOfStringValues" + "timestamp": { + "description": "Use timestamps of the files/directories to determine invalidation.", + "type": "boolean" } - ] - }, - "libraryTarget": { - "description": "Type of library", - "enum": [ - "var", - "assign", - "this", - "window", - "self", - "global", - "commonjs", - "commonjs2", - "commonjs-module", - "amd", - "amd-require", - "umd", - "umd2", - "jsonp" - ] + } }, - "path": { - "description": "The output directory as **absolute path** (required).", - "type": "string", - "absolutePath": true + "immutablePaths": { + "description": "List of paths that are managed by a package manager and contain a version or hash in its path so all files are immutable.", + "type": "array", + "items": { + "description": "List of paths that are managed by a package manager and contain a version or hash in its path so all files are immutable.", + "anyOf": [ + { + "description": "A RegExp matching an immutable directory (usually a package manager cache directory, including the tailing slash)", + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "description": "A path to an immutable directory (usually a package manager cache directory).", + "type": "string", + "absolutePath": true, + "minLength": 1 + } + ] + } }, - "pathinfo": { - "description": "Include comments with information about the modules.", - "type": "boolean" + "managedPaths": { + "description": "List of paths that are managed by a package manager and can be trusted to not be modified otherwise.", + "type": "array", + "items": { + "description": "List of paths that are managed by a package manager and can be trusted to not be modified otherwise.", + "anyOf": [ + { + "description": "A RegExp matching a managed directory (usually a node_modules directory, including the tailing slash)", + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "description": "A path to a managed directory (usually a node_modules directory).", + "type": "string", + "absolutePath": true, + "minLength": 1 + } + ] + } }, - "publicPath": { - "description": "The `publicPath` specifies the public URL address of the output files when referenced in a browser.", - "anyOf": [ - { - "type": "string" + "module": { + "description": "Options for snapshotting dependencies of modules to determine if they need to be built again.", + "type": "object", + "additionalProperties": false, + "properties": { + "hash": { + "description": "Use hashes of the content of the files/directories to determine invalidation.", + "type": "boolean" }, - { - "instanceof": "Function", - "tsType": "Function" + "timestamp": { + "description": "Use timestamps of the files/directories to determine invalidation.", + "type": "boolean" } - ] - }, - "sourceMapFilename": { - "description": "The filename of the SourceMaps for the JavaScript files. They are inside the `output.path` directory.", - "type": "string", - "absolutePath": false - }, - "sourcePrefix": { - "description": "Prefixes every line of the source in the bundle with this string.", - "type": "string" + } }, - "strictModuleExceptionHandling": { - "description": "Handles exceptions in module loading correctly at a performance cost.", - "type": "boolean" + "resolve": { + "description": "Options for snapshotting dependencies of request resolving to determine if requests need to be re-resolved.", + "type": "object", + "additionalProperties": false, + "properties": { + "hash": { + "description": "Use hashes of the content of the files/directories to determine invalidation.", + "type": "boolean" + }, + "timestamp": { + "description": "Use timestamps of the files/directories to determine invalidation.", + "type": "boolean" + } + } }, - "umdNamedDefine": { - "description": "If `output.libraryTarget` is set to umd and `output.library` is set, setting this to true will name the AMD module.", - "type": "boolean" + "resolveBuildDependencies": { + "description": "Options for snapshotting the resolving of build dependencies to determine if the build dependencies need to be re-resolved.", + "type": "object", + "additionalProperties": false, + "properties": { + "hash": { + "description": "Use hashes of the content of the files/directories to determine invalidation.", + "type": "boolean" + }, + "timestamp": { + "description": "Use timestamps of the files/directories to determine invalidation.", + "type": "boolean" + } + } }, - "webassemblyModuleFilename": { - "description": "The filename of WebAssembly modules as relative path inside the `output.path` directory.", - "type": "string", - "absolutePath": false + "unmanagedPaths": { + "description": "List of paths that are not managed by a package manager and the contents are subject to change.", + "type": "array", + "items": { + "description": "List of paths that are not managed by a package manager and the contents are subject to change.", + "anyOf": [ + { + "description": "A RegExp matching an unmanaged directory.", + "instanceof": "RegExp", + "tsType": "RegExp" + }, + { + "description": "A path to an unmanaged directory.", + "type": "string", + "absolutePath": true, + "minLength": 1 + } + ] + } } } }, - "PerformanceOptions": { + "SourceMapFilename": { + "description": "The filename of the SourceMaps for the JavaScript files. They are inside the 'output.path' directory.", + "type": "string", + "absolutePath": false + }, + "SourcePrefix": { + "description": "Prefixes every line of the source in the bundle with this string.", + "type": "string" + }, + "StatsOptions": { + "description": "Stats options object.", "type": "object", "additionalProperties": false, "properties": { - "assetFilter": { - "description": "Filter function to select assets that are checked", - "instanceof": "Function", - "tsType": "Function" - }, - "hints": { - "description": "Sets the format of the hints: warnings, errors or nothing at all", - "enum": [false, "warning", "error"] + "all": { + "description": "Fallback value for stats options when an option is not defined (has precedence over local webpack defaults).", + "type": "boolean" }, - "maxAssetSize": { - "description": "Filesize limit (in bytes) when exceeded, that webpack will provide performance hints", - "type": "number" + "assets": { + "description": "Add assets information.", + "type": "boolean" }, - "maxEntrypointSize": { - "description": "Total size of an entry point (in bytes)", - "type": "number" - } - } - }, - "ResolveOptions": { - "type": "object", - "additionalProperties": false, - "properties": { - "alias": { - "description": "Redirect module requests", + "assetsSort": { + "description": "Sort the assets by that field.", "anyOf": [ { - "type": "object", - "additionalProperties": { - "description": "New request", - "type": "string" - } + "enum": [false] }, { - "type": "array", - "items": { - "description": "Alias configuration", - "type": "object", - "additionalProperties": false, - "properties": { - "alias": { - "description": "New request", - "type": "string" - }, - "name": { - "description": "Request to be redirected", - "type": "string" - }, - "onlyModule": { - "description": "Redirect only exact matching request", - "type": "boolean" - } - } - } - } - ] - }, - "aliasFields": { - "description": "Fields in the description file (package.json) which are used to redirect requests inside the module", - "anyOf": [ - { - "$ref": "#/definitions/ArrayOfStringOrStringArrayValues" + "type": "string" } ] }, - "cachePredicate": { - "description": "Predicate function to decide which requests should be cached", - "instanceof": "Function", - "tsType": "Function" + "assetsSpace": { + "description": "Space to display assets (groups will be collapsed to fit this space).", + "type": "number" }, - "cacheWithContext": { - "description": "Include the context information in the cache identifier when caching", + "builtAt": { + "description": "Add built at time information.", "type": "boolean" }, - "concord": { - "description": "Enable concord resolving extras", + "cached": { + "description": "Add information about cached (not built) modules (deprecated: use 'cachedModules' instead).", "type": "boolean" }, - "descriptionFiles": { - "description": "Filenames used to find a description file", - "anyOf": [ - { - "$ref": "#/definitions/ArrayOfStringValues" - } - ] + "cachedAssets": { + "description": "Show cached assets (setting this to `false` only shows emitted files).", + "type": "boolean" }, - "enforceExtension": { - "description": "Enforce using one of the extensions from the extensions option", + "cachedModules": { + "description": "Add information about cached (not built) modules.", "type": "boolean" }, - "enforceModuleExtension": { - "description": "Enforce using one of the module extensions from the moduleExtensions option", + "children": { + "description": "Add children information.", "type": "boolean" }, - "extensions": { - "description": "Extensions added to the request when trying to find the file", - "anyOf": [ - { - "$ref": "#/definitions/ArrayOfStringValues" - } - ] + "chunkGroupAuxiliary": { + "description": "Display auxiliary assets in chunk groups.", + "type": "boolean" }, - "fileSystem": { - "description": "Filesystem for the resolver" + "chunkGroupChildren": { + "description": "Display children of chunk groups.", + "type": "boolean" }, - "mainFields": { - "description": "Field names from the description file (package.json) which are used to find the default entry point", - "anyOf": [ - { - "$ref": "#/definitions/ArrayOfStringOrStringArrayValues" - } - ] + "chunkGroupMaxAssets": { + "description": "Limit of assets displayed in chunk groups.", + "type": "number" }, - "mainFiles": { - "description": "Filenames used to find the default entry point if there is no description file or main field", - "anyOf": [ - { - "$ref": "#/definitions/ArrayOfStringValues" - } - ] + "chunkGroups": { + "description": "Display all chunk groups with the corresponding bundles.", + "type": "boolean" }, - "moduleExtensions": { - "description": "Extensions added to the module request when trying to find the module", - "anyOf": [ - { - "$ref": "#/definitions/ArrayOfStringValues" - } - ] + "chunkModules": { + "description": "Add built modules information to chunk information.", + "type": "boolean" }, - "modules": { - "description": "Folder names or directory paths where to find modules", - "anyOf": [ - { - "$ref": "#/definitions/ArrayOfStringValues" - } - ] + "chunkModulesSpace": { + "description": "Space to display chunk modules (groups will be collapsed to fit this space, value is in number of modules/group).", + "type": "number" }, - "plugins": { - "description": "Plugins for the resolver", - "type": "array", - "items": { - "description": "Plugin of type object or instanceof Function", - "anyOf": [ - { - "$ref": "#/definitions/WebpackPluginInstance" - }, - { - "$ref": "#/definitions/WebpackPluginFunction" - } - ] - } + "chunkOrigins": { + "description": "Add the origins of chunks and chunk merging info.", + "type": "boolean" }, - "resolver": { - "description": "Custom resolver" + "chunkRelations": { + "description": "Add information about parent, children and sibling chunks to chunk information.", + "type": "boolean" }, - "symlinks": { - "description": "Enable resolving symlinks to the original location", + "chunks": { + "description": "Add chunk information.", "type": "boolean" }, - "unsafeCache": { - "description": "Enable caching of successfully resolved requests", + "chunksSort": { + "description": "Sort the chunks by that field.", "anyOf": [ { - "type": "boolean" + "enum": [false] }, { - "type": "object", - "additionalProperties": true + "type": "string" } ] - }, - "useSyncFileSystemCalls": { - "description": "Use synchronous filesystem calls for the resolver", - "type": "boolean" - } - } - }, - "RuleSetCondition": { - "anyOf": [ - { - "instanceof": "RegExp", - "tsType": "RegExp" - }, - { - "type": "string", - "minLength": 1 - }, - { - "instanceof": "Function", - "tsType": "((value: string) => boolean)" - }, - { - "$ref": "#/definitions/RuleSetConditions" - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "and": { - "description": "Logical AND", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetConditions" - } - ] - }, - "exclude": { - "description": "Exclude all modules matching any of these conditions", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetConditionOrConditions" - } - ] - }, - "include": { - "description": "Exclude all modules matching not any of these conditions", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetConditionOrConditions" - } - ] - }, - "not": { - "description": "Logical NOT", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetConditions" - } - ] - }, - "or": { - "description": "Logical OR", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetConditions" - } - ] - }, - "test": { - "description": "Exclude all modules matching any of these conditions", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetConditionOrConditions" - } - ] - } - } - } - ] - }, - "RuleSetConditionAbsolute": { - "anyOf": [ - { - "instanceof": "RegExp", - "tsType": "RegExp" - }, - { - "type": "string", - "absolutePath": true - }, - { - "instanceof": "Function", - "tsType": "((value: string) => boolean)" - }, - { - "$ref": "#/definitions/RuleSetConditionsAbsolute" - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "and": { - "description": "Logical AND", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetConditionsAbsolute" - } - ] - }, - "exclude": { - "description": "Exclude all modules matching any of these conditions", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetConditionOrConditionsAbsolute" - } - ] - }, - "include": { - "description": "Exclude all modules matching not any of these conditions", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetConditionOrConditionsAbsolute" - } - ] - }, - "not": { - "description": "Logical NOT", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetConditionsAbsolute" - } - ] - }, - "or": { - "description": "Logical OR", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetConditionsAbsolute" - } - ] + }, + "colors": { + "description": "Enables/Disables colorful output.", + "anyOf": [ + { + "description": "Enables/Disables colorful output.", + "type": "boolean" }, - "test": { - "description": "Exclude all modules matching any of these conditions", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetConditionOrConditionsAbsolute" + { + "type": "object", + "additionalProperties": false, + "properties": { + "bold": { + "description": "Custom color for bold text.", + "type": "string" + }, + "cyan": { + "description": "Custom color for cyan text.", + "type": "string" + }, + "green": { + "description": "Custom color for green text.", + "type": "string" + }, + "magenta": { + "description": "Custom color for magenta text.", + "type": "string" + }, + "red": { + "description": "Custom color for red text.", + "type": "string" + }, + "yellow": { + "description": "Custom color for yellow text.", + "type": "string" } - ] + } } - } - } - ] - }, - "RuleSetConditionOrConditions": { - "description": "One or multiple rule conditions", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetCondition" + ] }, - { - "$ref": "#/definitions/RuleSetConditions" - } - ] - }, - "RuleSetConditionOrConditionsAbsolute": { - "description": "One or multiple rule conditions", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetConditionAbsolute" + "context": { + "description": "Context directory for request shortening.", + "type": "string", + "absolutePath": true }, - { - "$ref": "#/definitions/RuleSetConditionsAbsolute" - } - ] - }, - "RuleSetConditions": { - "type": "array", - "items": { - "description": "A rule condition", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetCondition" - } - ] - }, - "tsType": "RuleSetConditionsRecursive" - }, - "RuleSetConditionsAbsolute": { - "type": "array", - "items": { - "description": "A rule condition", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetConditionAbsolute" - } - ] - }, - "tsType": "RuleSetConditionsAbsoluteRecursive" - }, - "RuleSetLoader": { - "type": "string", - "minLength": 1 - }, - "RuleSetQuery": { - "anyOf": [ - { - "type": "object" + "dependentModules": { + "description": "Show chunk modules that are dependencies of other modules of the chunk.", + "type": "boolean" }, - { - "type": "string" - } - ] - }, - "RuleSetRule": { - "type": "object", - "additionalProperties": false, - "properties": { - "compiler": { - "description": "Match the child compiler name", + "depth": { + "description": "Add module depth in module graph.", + "type": "boolean" + }, + "entrypoints": { + "description": "Display the entry points with the corresponding bundles.", "anyOf": [ { - "$ref": "#/definitions/RuleSetConditionOrConditions" + "enum": ["auto"] + }, + { + "type": "boolean" } ] }, - "enforce": { - "description": "Enforce this rule as pre or post step", - "enum": ["pre", "post"] + "env": { + "description": "Add --env information.", + "type": "boolean" }, - "exclude": { - "description": "Shortcut for resource.exclude", + "errorCause": { + "description": "Add cause to errors.", "anyOf": [ { - "$ref": "#/definitions/RuleSetConditionOrConditionsAbsolute" + "enum": ["auto"] + }, + { + "type": "boolean" } ] }, - "include": { - "description": "Shortcut for resource.include", + "errorDetails": { + "description": "Add details to errors (like resolving log).", "anyOf": [ { - "$ref": "#/definitions/RuleSetConditionOrConditionsAbsolute" + "enum": ["auto"] + }, + { + "type": "boolean" } ] }, - "issuer": { - "description": "Match the issuer of the module (The module pointing to this module)", + "errorErrors": { + "description": "Add nested errors to errors (like in AggregateError).", "anyOf": [ { - "$ref": "#/definitions/RuleSetConditionOrConditionsAbsolute" + "enum": ["auto"] + }, + { + "type": "boolean" } ] }, - "loader": { - "description": "Shortcut for use.loader", + "errorStack": { + "description": "Add internal stack trace to errors.", + "type": "boolean" + }, + "errors": { + "description": "Add errors.", + "type": "boolean" + }, + "errorsCount": { + "description": "Add errors count.", + "type": "boolean" + }, + "errorsSpace": { + "description": "Space to display errors (value is in number of lines).", + "type": "number" + }, + "exclude": { + "description": "Please use excludeModules instead.", + "cli": { + "exclude": true + }, "anyOf": [ { - "$ref": "#/definitions/RuleSetLoader" + "type": "boolean" }, { - "$ref": "#/definitions/RuleSetUse" + "$ref": "#/definitions/ModuleFilterTypes" } ] }, - "loaders": { - "description": "Shortcut for use.loader", - "anyOf": [ + "excludeAssets": { + "description": "Suppress assets that match the specified filters. Filters can be Strings, RegExps or Functions.", + "oneOf": [ { - "$ref": "#/definitions/RuleSetUse" + "$ref": "#/definitions/AssetFilterTypes" } ] }, - "oneOf": { - "description": "Only execute the first matching rule in this array", + "excludeModules": { + "description": "Suppress modules that match the specified filters. Filters can be Strings, RegExps, Booleans or Functions.", "anyOf": [ { - "$ref": "#/definitions/RuleSetRules" + "type": "boolean" + }, + { + "$ref": "#/definitions/ModuleFilterTypes" } ] }, - "options": { - "description": "Shortcut for use.options", + "groupAssetsByChunk": { + "description": "Group assets by how their are related to chunks.", + "type": "boolean" + }, + "groupAssetsByEmitStatus": { + "description": "Group assets by their status (emitted, compared for emit or cached).", + "type": "boolean" + }, + "groupAssetsByExtension": { + "description": "Group assets by their extension.", + "type": "boolean" + }, + "groupAssetsByInfo": { + "description": "Group assets by their asset info (immutable, development, hotModuleReplacement, etc).", + "type": "boolean" + }, + "groupAssetsByPath": { + "description": "Group assets by their path.", + "type": "boolean" + }, + "groupModulesByAttributes": { + "description": "Group modules by their attributes (errors, warnings, assets, optional, orphan, or dependent).", + "type": "boolean" + }, + "groupModulesByCacheStatus": { + "description": "Group modules by their status (cached or built and cacheable).", + "type": "boolean" + }, + "groupModulesByExtension": { + "description": "Group modules by their extension.", + "type": "boolean" + }, + "groupModulesByLayer": { + "description": "Group modules by their layer.", + "type": "boolean" + }, + "groupModulesByPath": { + "description": "Group modules by their path.", + "type": "boolean" + }, + "groupModulesByType": { + "description": "Group modules by their type.", + "type": "boolean" + }, + "groupReasonsByOrigin": { + "description": "Group reasons by their origin module.", + "type": "boolean" + }, + "hash": { + "description": "Add the hash of the compilation.", + "type": "boolean" + }, + "ids": { + "description": "Add ids.", + "type": "boolean" + }, + "logging": { + "description": "Add logging output.", "anyOf": [ { - "$ref": "#/definitions/RuleSetQuery" + "description": "Specify log level of logging output.", + "enum": ["none", "error", "warn", "info", "log", "verbose"] + }, + { + "description": "Enable/disable logging output (`true`: shows normal logging output, loglevel: log).", + "type": "boolean" } ] }, - "parser": { - "description": "Options for parsing", - "type": "object", - "additionalProperties": true - }, - "query": { - "description": "Shortcut for use.query", + "loggingDebug": { + "description": "Include debug logging of specified loggers (i. e. for plugins or loaders). Filters can be Strings, RegExps or Functions.", "anyOf": [ { - "$ref": "#/definitions/RuleSetQuery" + "description": "Enable/Disable debug logging for all loggers.", + "type": "boolean" + }, + { + "$ref": "#/definitions/FilterTypes" } ] }, - "resolve": { - "description": "Options for the resolver", - "type": "object", + "loggingTrace": { + "description": "Add stack traces to logging output.", + "type": "boolean" + }, + "moduleAssets": { + "description": "Add information about assets inside modules.", + "type": "boolean" + }, + "moduleTrace": { + "description": "Add dependencies and origin of warnings/errors.", + "type": "boolean" + }, + "modules": { + "description": "Add built modules information.", + "type": "boolean" + }, + "modulesSort": { + "description": "Sort the modules by that field.", "anyOf": [ { - "$ref": "#/definitions/ResolveOptions" + "enum": [false] + }, + { + "type": "string" } ] }, - "resource": { - "description": "Match the resource path of the module", + "modulesSpace": { + "description": "Space to display modules (groups will be collapsed to fit this space, value is in number of modules/groups).", + "type": "number" + }, + "nestedModules": { + "description": "Add information about modules nested in other modules (like with module concatenation).", + "type": "boolean" + }, + "nestedModulesSpace": { + "description": "Space to display modules nested within other modules (groups will be collapsed to fit this space, value is in number of modules/group).", + "type": "number" + }, + "optimizationBailout": { + "description": "Show reasons why optimization bailed out for modules.", + "type": "boolean" + }, + "orphanModules": { + "description": "Add information about orphan modules.", + "type": "boolean" + }, + "outputPath": { + "description": "Add output path information.", + "type": "boolean" + }, + "performance": { + "description": "Add performance hint flags.", + "type": "boolean" + }, + "preset": { + "description": "Preset for the default values.", "anyOf": [ { - "$ref": "#/definitions/RuleSetConditionOrConditionsAbsolute" + "type": "boolean" + }, + { + "type": "string" } ] }, - "resourceQuery": { - "description": "Match the resource query of the module", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetConditionOrConditions" - } - ] + "providedExports": { + "description": "Show exports provided by modules.", + "type": "boolean" + }, + "publicPath": { + "description": "Add public path information.", + "type": "boolean" + }, + "reasons": { + "description": "Add information about the reasons why modules are included.", + "type": "boolean" + }, + "reasonsSpace": { + "description": "Space to display reasons (groups will be collapsed to fit this space).", + "type": "number" + }, + "relatedAssets": { + "description": "Add information about assets that are related to other assets (like SourceMaps for assets).", + "type": "boolean" + }, + "runtime": { + "description": "Add information about runtime modules (deprecated: use 'runtimeModules' instead).", + "type": "boolean" + }, + "runtimeModules": { + "description": "Add information about runtime modules.", + "type": "boolean" + }, + "source": { + "description": "Add the source code of modules.", + "type": "boolean" + }, + "timings": { + "description": "Add timing information.", + "type": "boolean" + }, + "usedExports": { + "description": "Show exports used by modules.", + "type": "boolean" + }, + "version": { + "description": "Add webpack version information.", + "type": "boolean" }, - "rules": { - "description": "Match and execute these rules when this rule is matched", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetRules" - } - ] + "warnings": { + "description": "Add warnings.", + "type": "boolean" }, - "sideEffects": { - "description": "Flags a module as with or without side effects", + "warningsCount": { + "description": "Add warnings count.", "type": "boolean" }, - "test": { - "description": "Shortcut for resource.test", - "anyOf": [ + "warningsFilter": { + "description": "Suppress listing warnings that match the specified filters (they will still be counted). Filters can be Strings, RegExps or Functions.", + "oneOf": [ { - "$ref": "#/definitions/RuleSetConditionOrConditionsAbsolute" + "$ref": "#/definitions/WarningFilterTypes" } ] }, - "type": { - "description": "Module type to use for the module", + "warningsSpace": { + "description": "Space to display warnings (value is in number of lines).", + "type": "number" + } + } + }, + "StatsValue": { + "description": "Stats options object or preset name.", + "anyOf": [ + { "enum": [ - "javascript/auto", - "javascript/dynamic", - "javascript/esm", - "json", - "webassembly/experimental" + "none", + "summary", + "errors-only", + "errors-warnings", + "minimal", + "normal", + "detailed", + "verbose" ] }, - "use": { - "description": "Modifiers applied to the module when rule is matched", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetUse" - } - ] + { + "type": "boolean" + }, + { + "$ref": "#/definitions/StatsOptions" } - } + ] }, - "RuleSetRules": { - "type": "array", - "items": { - "description": "A rule", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetRule" - } - ] + "StrictModuleErrorHandling": { + "description": "Handles error in module loading correctly at a performance cost. This will handle module error compatible with the EcmaScript Modules spec.", + "type": "boolean" + }, + "StrictModuleExceptionHandling": { + "description": "Handles exceptions in module loading correctly at a performance cost (Deprecated). This will handle module error compatible with the Node.js CommonJS way.", + "type": "boolean" + }, + "Target": { + "description": "Environment to build for. An array of environments to build for all of them when possible.", + "anyOf": [ + { + "type": "array", + "items": { + "description": "Environment to build for.", + "type": "string", + "minLength": 1 + }, + "minItems": 1 + }, + { + "enum": [false] + }, + { + "type": "string", + "minLength": 1 + } + ] + }, + "TrustedTypes": { + "description": "Use a Trusted Types policy to create urls for chunks.", + "type": "object", + "additionalProperties": false, + "properties": { + "onPolicyCreationFailure": { + "description": "If the call to `trustedTypes.createPolicy(...)` fails -- e.g., due to the policy name missing from the CSP `trusted-types` list, or it being a duplicate name, etc. -- controls whether to continue with loading in the hope that `require-trusted-types-for 'script'` isn't enforced yet, versus fail immediately. Default behavior is 'stop'.", + "enum": ["continue", "stop"] + }, + "policyName": { + "description": "The name of the Trusted Types policy created by webpack to serve bundle chunks.", + "type": "string", + "minLength": 1 + } } }, - "RuleSetUse": { + "UmdNamedDefine": { + "description": "If `output.libraryTarget` is set to umd and `output.library` is set, setting this to true will name the AMD module.", + "type": "boolean" + }, + "UniqueName": { + "description": "A unique name of the webpack build to avoid multiple webpack runtimes to conflict when using globals.", + "type": "string", + "minLength": 1 + }, + "WarningFilterItemTypes": { + "description": "Filtering value, regexp or function.", + "cli": { + "helper": true + }, "anyOf": [ { - "$ref": "#/definitions/RuleSetUseItem" + "instanceof": "RegExp", + "tsType": "RegExp" }, { - "instanceof": "Function", - "tsType": "Function" + "type": "string", + "absolutePath": false }, + { + "instanceof": "Function", + "tsType": "((warning: import('../lib/stats/DefaultStatsFactoryPlugin').StatsError, value: string) => boolean)" + } + ] + }, + "WarningFilterTypes": { + "description": "Filtering warnings.", + "cli": { + "helper": true + }, + "anyOf": [ { "type": "array", "items": { - "description": "An use item", - "anyOf": [ + "description": "Rule to filter.", + "cli": { + "helper": true + }, + "oneOf": [ { - "$ref": "#/definitions/RuleSetUseItem" + "$ref": "#/definitions/WarningFilterItemTypes" } ] } + }, + { + "$ref": "#/definitions/WarningFilterItemTypes" } ] }, - "RuleSetUseItem": { + "WasmLoading": { + "description": "The method of loading WebAssembly Modules (methods included by default are 'fetch' (web/WebWorker), 'async-node' (node.js), but others might be added by plugins).", "anyOf": [ { - "$ref": "#/definitions/RuleSetLoader" + "enum": [false] }, { - "instanceof": "Function", - "tsType": "Function" + "$ref": "#/definitions/WasmLoadingType" + } + ] + }, + "WasmLoadingType": { + "description": "The method of loading WebAssembly Modules (methods included by default are 'fetch' (web/WebWorker), 'async-node' (node.js), but others might be added by plugins).", + "anyOf": [ + { + "enum": ["fetch", "async-node"] }, { - "type": "object", - "additionalProperties": false, - "properties": { - "ident": { - "description": "Unique loader identifier", - "type": "string" - }, - "loader": { - "description": "Loader name", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetLoader" - } - ] - }, - "options": { - "description": "Loader options", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetQuery" - } - ] - }, - "query": { - "description": "Loader query", - "anyOf": [ - { - "$ref": "#/definitions/RuleSetQuery" - } - ] - } - } + "type": "string" } ] }, - "StatsOptions": { + "Watch": { + "description": "Enter watch mode, which rebuilds on file change.", + "type": "boolean" + }, + "WatchOptions": { + "description": "Options for the watcher.", "type": "object", "additionalProperties": false, "properties": { - "all": { - "description": "fallback value for stats options when an option is not defined (has precedence over local webpack defaults)", - "type": "boolean" - }, - "assets": { - "description": "add assets information", - "type": "boolean" - }, - "assetsSort": { - "description": "sort the assets by that field", - "type": "string" - }, - "builtAt": { - "description": "add built at time information", - "type": "boolean" - }, - "cached": { - "description": "add also information about cached (not built) modules", - "type": "boolean" - }, - "cachedAssets": { - "description": "Show cached assets (setting this to `false` only shows emitted files)", - "type": "boolean" - }, - "children": { - "description": "add children information", - "type": "boolean" - }, - "chunkGroups": { - "description": "Display all chunk groups with the corresponding bundles", - "type": "boolean" - }, - "chunkModules": { - "description": "add built modules information to chunk information", - "type": "boolean" - }, - "chunkOrigins": { - "description": "add the origins of chunks and chunk merging info", - "type": "boolean" - }, - "chunks": { - "description": "add chunk information", - "type": "boolean" - }, - "chunksSort": { - "description": "sort the chunks by that field", - "type": "string" - }, - "colors": { - "description": "Enables/Disables colorful output", - "oneOf": [ - { - "description": "`webpack --colors` equivalent", - "type": "boolean" - }, - { - "type": "object", - "additionalProperties": false, - "properties": { - "bold": { - "description": "Custom color for bold text", - "type": "string" - }, - "cyan": { - "description": "Custom color for cyan text", - "type": "string" - }, - "green": { - "description": "Custom color for green text", - "type": "string" - }, - "magenta": { - "description": "Custom color for magenta text", - "type": "string" - }, - "red": { - "description": "Custom color for red text", - "type": "string" - }, - "yellow": { - "description": "Custom color for yellow text", - "type": "string" - } - } - } - ] - }, - "context": { - "description": "context directory for request shortening", - "type": "string", - "absolutePath": true - }, - "depth": { - "description": "add module depth in module graph", - "type": "boolean" - }, - "entrypoints": { - "description": "Display the entry points with the corresponding bundles", - "type": "boolean" - }, - "env": { - "description": "add --env information", - "type": "boolean" - }, - "errorDetails": { - "description": "add details to errors (like resolving log)", - "type": "boolean" + "aggregateTimeout": { + "description": "Delay the rebuilt after the first change. Value is a time in ms.", + "type": "number" }, - "errors": { - "description": "add errors", + "followSymlinks": { + "description": "Resolve symlinks and watch symlink and real file. This is usually not needed as webpack already resolves symlinks ('resolve.symlinks').", "type": "boolean" }, - "exclude": { - "description": "Please use excludeModules instead.", + "ignored": { + "description": "Ignore some files from watching (glob pattern or regexp).", "anyOf": [ { - "$ref": "#/definitions/FilterTypes" + "type": "array", + "items": { + "description": "A glob pattern for files that should be ignored from watching.", + "type": "string", + "minLength": 1 + } }, { - "type": "boolean" - } - ] - }, - "excludeAssets": { - "description": "Suppress assets that match the specified filters. Filters can be Strings, RegExps or Functions", - "anyOf": [ + "instanceof": "RegExp", + "tsType": "RegExp" + }, { - "$ref": "#/definitions/FilterTypes" + "description": "A single glob pattern for files that should be ignored from watching.", + "type": "string", + "minLength": 1 } ] }, - "excludeModules": { - "description": "Suppress modules that match the specified filters. Filters can be Strings, RegExps, Booleans or Functions", + "poll": { + "description": "Enable polling mode for watching.", "anyOf": [ { - "$ref": "#/definitions/FilterTypes" + "description": "`number`: use polling with specified interval.", + "type": "number" }, { + "description": "`true`: use polling.", "type": "boolean" } ] }, - "hash": { - "description": "add the hash of the compilation", + "stdin": { + "description": "Stop watching when stdin stream has ended.", "type": "boolean" + } + } + }, + "WebassemblyModuleFilename": { + "description": "The filename of WebAssembly modules as relative path inside the 'output.path' directory.", + "type": "string", + "absolutePath": false + }, + "WebpackOptionsNormalized": { + "description": "Normalized webpack options object.", + "type": "object", + "additionalProperties": false, + "properties": { + "amd": { + "$ref": "#/definitions/Amd" }, - "maxModules": { - "description": "Set the maximum number of modules to be shown", - "type": "number" + "bail": { + "$ref": "#/definitions/Bail" }, - "moduleAssets": { - "description": "add information about assets inside modules", - "type": "boolean" + "cache": { + "$ref": "#/definitions/CacheOptionsNormalized" }, - "moduleTrace": { - "description": "add dependencies and origin of warnings/errors", - "type": "boolean" + "context": { + "$ref": "#/definitions/Context" }, - "modules": { - "description": "add built modules information", - "type": "boolean" + "dependencies": { + "$ref": "#/definitions/Dependencies" }, - "modulesSort": { - "description": "sort the modules by that field", - "type": "string" + "devServer": { + "$ref": "#/definitions/DevServer" }, - "nestedModules": { - "description": "add information about modules nested in other modules (like with module concatenation)", - "type": "boolean" + "devtool": { + "$ref": "#/definitions/DevTool" }, - "optimizationBailout": { - "description": "show reasons why optimization bailed out for modules", - "type": "boolean" + "entry": { + "$ref": "#/definitions/EntryNormalized" }, - "outputPath": { - "description": "Add output path information", - "type": "boolean" + "experiments": { + "$ref": "#/definitions/ExperimentsNormalized" + }, + "externals": { + "$ref": "#/definitions/Externals" + }, + "externalsPresets": { + "$ref": "#/definitions/ExternalsPresets" + }, + "externalsType": { + "$ref": "#/definitions/ExternalsType" + }, + "ignoreWarnings": { + "$ref": "#/definitions/IgnoreWarningsNormalized" + }, + "infrastructureLogging": { + "$ref": "#/definitions/InfrastructureLogging" + }, + "loader": { + "$ref": "#/definitions/Loader" + }, + "mode": { + "$ref": "#/definitions/Mode" + }, + "module": { + "$ref": "#/definitions/ModuleOptionsNormalized" + }, + "name": { + "$ref": "#/definitions/Name" + }, + "node": { + "$ref": "#/definitions/Node" + }, + "optimization": { + "$ref": "#/definitions/OptimizationNormalized" + }, + "output": { + "$ref": "#/definitions/OutputNormalized" + }, + "parallelism": { + "$ref": "#/definitions/Parallelism" }, "performance": { - "description": "add performance hint flags", - "type": "boolean" + "$ref": "#/definitions/Performance" }, - "providedExports": { - "description": "show exports provided by modules", - "type": "boolean" + "plugins": { + "$ref": "#/definitions/Plugins" }, - "publicPath": { - "description": "Add public path information", - "type": "boolean" + "profile": { + "$ref": "#/definitions/Profile" }, - "reasons": { - "description": "add information about the reasons why modules are included", - "type": "boolean" + "recordsInputPath": { + "$ref": "#/definitions/RecordsInputPath" }, - "source": { - "description": "add the source code of modules", - "type": "boolean" + "recordsOutputPath": { + "$ref": "#/definitions/RecordsOutputPath" }, - "timings": { - "description": "add timing information", - "type": "boolean" + "resolve": { + "$ref": "#/definitions/Resolve" }, - "usedExports": { - "description": "show exports used by modules", - "type": "boolean" + "resolveLoader": { + "$ref": "#/definitions/ResolveLoader" }, - "version": { - "description": "add webpack version information", - "type": "boolean" + "snapshot": { + "$ref": "#/definitions/SnapshotOptions" }, - "warnings": { - "description": "add warnings", - "type": "boolean" + "stats": { + "$ref": "#/definitions/StatsValue" }, - "warningsFilter": { - "description": "Suppress warnings that match the specified filters. Filters can be Strings, RegExps or Functions", - "anyOf": [ - { - "$ref": "#/definitions/FilterTypes" - } - ] + "target": { + "$ref": "#/definitions/Target" + }, + "watch": { + "$ref": "#/definitions/Watch" + }, + "watchOptions": { + "$ref": "#/definitions/WatchOptions" } - } + }, + "required": [ + "cache", + "snapshot", + "entry", + "experiments", + "externals", + "externalsPresets", + "infrastructureLogging", + "module", + "node", + "optimization", + "output", + "plugins", + "resolve", + "resolveLoader", + "stats", + "watchOptions" + ] }, "WebpackPluginFunction": { - "description": "Function acting as plugin", + "description": "Function acting as plugin.", "instanceof": "Function", "tsType": "(this: import('../lib/Compiler'), compiler: import('../lib/Compiler')) => void" }, "WebpackPluginInstance": { - "description": "Plugin instance", + "description": "Plugin instance.", "type": "object", "additionalProperties": true, "properties": { @@ -1897,267 +5913,124 @@ } }, "required": ["apply"] + }, + "WorkerPublicPath": { + "description": "Worker public path. Much like the public path, this sets the location where the worker script file is intended to be found. If not set, webpack will use the publicPath. Don't set this option unless your worker scripts are located at a different path from your other script files.", + "type": "string" } }, + "title": "WebpackOptions", + "description": "Options object as provided by the user.", "type": "object", "additionalProperties": false, "properties": { "amd": { - "description": "Set the value of `require.amd` and `define.amd`." + "$ref": "#/definitions/Amd" }, "bail": { - "description": "Report the first error as a hard error instead of tolerating it.", - "type": "boolean" + "$ref": "#/definitions/Bail" }, "cache": { - "description": "Cache generated modules and chunks to improve performance for multiple incremental builds.", - "anyOf": [ - { - "description": "You can pass `false` to disable it.", - "type": "boolean" - }, - { - "description": "You can pass an object to enable it and let webpack use the passed object as cache. This way you can share the cache object between multiple compiler calls.", - "type": "object" - } - ] + "$ref": "#/definitions/CacheOptions" }, "context": { - "description": "The base directory (absolute path!) for resolving the `entry` option. If `output.pathinfo` is set, the included pathinfo is shortened to this directory.", - "type": "string", - "absolutePath": true + "$ref": "#/definitions/Context" }, "dependencies": { - "description": "References to other configurations to depend on.", - "type": "array", - "items": { - "description": "References to another configuration to depend on.", - "type": "string" - } + "$ref": "#/definitions/Dependencies" }, "devServer": { - "description": "Options for the webpack-dev-server", - "type": "object" + "$ref": "#/definitions/DevServer" }, "devtool": { - "description": "A developer tool to enhance debugging.", - "anyOf": [ - { - "type": "string" - }, - { - "enum": [false] - } - ] + "$ref": "#/definitions/DevTool" }, "entry": { - "description": "The entry point(s) of the compilation.", - "anyOf": [ - { - "$ref": "#/definitions/Entry" - } - ] + "$ref": "#/definitions/Entry" + }, + "experiments": { + "$ref": "#/definitions/Experiments" + }, + "extends": { + "$ref": "#/definitions/Extends" }, "externals": { - "description": "Specify dependencies that shouldn't be resolved by webpack, but should become dependencies of the resulting bundle. The kind of the dependency depends on `output.libraryTarget`.", - "anyOf": [ - { - "$ref": "#/definitions/Externals" - } - ] + "$ref": "#/definitions/Externals" + }, + "externalsPresets": { + "$ref": "#/definitions/ExternalsPresets" + }, + "externalsType": { + "$ref": "#/definitions/ExternalsType" + }, + "ignoreWarnings": { + "$ref": "#/definitions/IgnoreWarnings" + }, + "infrastructureLogging": { + "$ref": "#/definitions/InfrastructureLogging" }, "loader": { - "description": "Custom values available in the loader context.", - "type": "object" + "$ref": "#/definitions/Loader" }, "mode": { - "description": "Enable production optimizations or development hints.", - "enum": ["development", "production", "none"] + "$ref": "#/definitions/Mode" }, "module": { - "description": "Options affecting the normal modules (`NormalModuleFactory`).", - "anyOf": [ - { - "$ref": "#/definitions/ModuleOptions" - } - ] + "$ref": "#/definitions/ModuleOptions" }, "name": { - "description": "Name of the configuration. Used when loading multiple configurations.", - "type": "string" + "$ref": "#/definitions/Name" }, "node": { - "description": "Include polyfills or mocks for various node stuff.", - "anyOf": [ - { - "enum": [false] - }, - { - "$ref": "#/definitions/NodeOptions" - } - ] + "$ref": "#/definitions/Node" }, "optimization": { - "description": "Enables/Disables integrated optimizations", - "anyOf": [ - { - "$ref": "#/definitions/OptimizationOptions" - } - ] + "$ref": "#/definitions/Optimization" }, "output": { - "description": "Options affecting the output of the compilation. `output` options tell webpack how to write the compiled files to disk.", - "anyOf": [ - { - "$ref": "#/definitions/OutputOptions" - } - ] + "$ref": "#/definitions/Output" }, "parallelism": { - "description": "The number of parallel processed modules in the compilation.", - "type": "number", - "minimum": 1 + "$ref": "#/definitions/Parallelism" }, "performance": { - "description": "Configuration for web performance recommendations.", - "anyOf": [ - { - "enum": [false] - }, - { - "$ref": "#/definitions/PerformanceOptions" - } - ] + "$ref": "#/definitions/Performance" }, "plugins": { - "description": "Add additional plugins to the compiler.", - "type": "array", - "items": { - "description": "Plugin of type object or instanceof Function", - "anyOf": [ - { - "$ref": "#/definitions/WebpackPluginInstance" - }, - { - "$ref": "#/definitions/WebpackPluginFunction" - } - ] - } + "$ref": "#/definitions/Plugins" }, "profile": { - "description": "Capture timing information for each module.", - "type": "boolean" + "$ref": "#/definitions/Profile" }, "recordsInputPath": { - "description": "Store compiler state to a json file.", - "type": "string", - "absolutePath": true + "$ref": "#/definitions/RecordsInputPath" }, "recordsOutputPath": { - "description": "Load compiler state from a json file.", - "type": "string", - "absolutePath": true + "$ref": "#/definitions/RecordsOutputPath" }, "recordsPath": { - "description": "Store/Load compiler state from/to a json file. This will result in persistent ids of modules and chunks. An absolute path is expected. `recordsPath` is used for `recordsInputPath` and `recordsOutputPath` if they left undefined.", - "type": "string", - "absolutePath": true + "$ref": "#/definitions/RecordsPath" }, "resolve": { - "description": "Options for the resolver", - "anyOf": [ - { - "$ref": "#/definitions/ResolveOptions" - } - ] + "$ref": "#/definitions/Resolve" }, "resolveLoader": { - "description": "Options for the resolver when resolving loaders", - "anyOf": [ - { - "$ref": "#/definitions/ResolveOptions" - } - ] + "$ref": "#/definitions/ResolveLoader" }, - "serve": { - "description": "Options for webpack-serve", - "type": "object" + "snapshot": { + "$ref": "#/definitions/SnapshotOptions" }, "stats": { - "description": "Used by the webpack CLI program to pass stats options.", - "anyOf": [ - { - "$ref": "#/definitions/StatsOptions" - }, - { - "type": "boolean" - }, - { - "enum": [ - "none", - "errors-only", - "minimal", - "normal", - "detailed", - "verbose" - ] - } - ] + "$ref": "#/definitions/StatsValue" }, "target": { - "description": "Environment to build for", - "anyOf": [ - { - "enum": [ - "web", - "webworker", - "node", - "async-node", - "node-webkit", - "electron-main", - "electron-renderer" - ] - }, - { - "instanceof": "Function", - "tsType": "((compiler: import('../lib/Compiler')) => void)" - } - ] + "$ref": "#/definitions/Target" }, "watch": { - "description": "Enter watch mode, which rebuilds on file change.", - "type": "boolean" + "$ref": "#/definitions/Watch" }, "watchOptions": { - "description": "Options for the watcher", - "type": "object", - "additionalProperties": false, - "properties": { - "aggregateTimeout": { - "description": "Delay the rebuilt after the first change. Value is a time in ms.", - "type": "number" - }, - "ignored": { - "description": "Ignore some files from watching" - }, - "poll": { - "description": "Enable polling mode for watching", - "anyOf": [ - { - "description": "`true`: use polling.", - "type": "boolean" - }, - { - "description": "`number`: use polling with specified interval.", - "type": "number" - } - ] - }, - "stdin": { - "description": "Stop watching when stdin stream has ended", - "type": "boolean" - } - } + "$ref": "#/definitions/WatchOptions" } } } diff --git a/schemas/_container.json b/schemas/_container.json new file mode 100644 index 00000000000..e333f1db0c5 --- /dev/null +++ b/schemas/_container.json @@ -0,0 +1,155 @@ +{ + "definitions": { + "Exposes": { + "description": "Modules that should be exposed by this container. When provided, property name is used as public name, otherwise public name is automatically inferred from request.", + "anyOf": [ + { + "type": "array", + "items": { + "description": "Modules that should be exposed by this container.", + "anyOf": [ + { + "$ref": "#/definitions/ExposesItem" + }, + { + "$ref": "#/definitions/ExposesObject" + } + ] + } + }, + { + "$ref": "#/definitions/ExposesObject" + } + ] + }, + "ExposesConfig": { + "description": "Advanced configuration for modules that should be exposed by this container.", + "type": "object", + "additionalProperties": false, + "properties": { + "import": { + "description": "Request to a module that should be exposed by this container.", + "anyOf": [ + { + "$ref": "#/definitions/ExposesItem" + }, + { + "$ref": "#/definitions/ExposesItems" + } + ] + }, + "name": { + "description": "Custom chunk name for the exposed module.", + "type": "string" + } + }, + "required": ["import"] + }, + "ExposesItem": { + "description": "Module that should be exposed by this container.", + "type": "string", + "minLength": 1 + }, + "ExposesItems": { + "description": "Modules that should be exposed by this container.", + "type": "array", + "items": { + "$ref": "#/definitions/ExposesItem" + } + }, + "ExposesObject": { + "description": "Modules that should be exposed by this container. Property names are used as public paths.", + "type": "object", + "additionalProperties": { + "description": "Modules that should be exposed by this container.", + "anyOf": [ + { + "$ref": "#/definitions/ExposesConfig" + }, + { + "$ref": "#/definitions/ExposesItem" + }, + { + "$ref": "#/definitions/ExposesItems" + } + ] + } + }, + "Remotes": { + "description": "Container locations and request scopes from which modules should be resolved and loaded at runtime. When provided, property name is used as request scope, otherwise request scope is automatically inferred from container location.", + "anyOf": [ + { + "type": "array", + "items": { + "description": "Container locations and request scopes from which modules should be resolved and loaded at runtime.", + "anyOf": [ + { + "$ref": "#/definitions/RemotesItem" + }, + { + "$ref": "#/definitions/RemotesObject" + } + ] + } + }, + { + "$ref": "#/definitions/RemotesObject" + } + ] + }, + "RemotesConfig": { + "description": "Advanced configuration for container locations from which modules should be resolved and loaded at runtime.", + "type": "object", + "additionalProperties": false, + "properties": { + "external": { + "description": "Container locations from which modules should be resolved and loaded at runtime.", + "anyOf": [ + { + "$ref": "#/definitions/RemotesItem" + }, + { + "$ref": "#/definitions/RemotesItems" + } + ] + }, + "shareScope": { + "description": "The name of the share scope shared with this remote.", + "type": "string", + "minLength": 1 + } + }, + "required": ["external"] + }, + "RemotesItem": { + "description": "Container location from which modules should be resolved and loaded at runtime.", + "type": "string", + "minLength": 1 + }, + "RemotesItems": { + "description": "Container locations from which modules should be resolved and loaded at runtime.", + "type": "array", + "items": { + "$ref": "#/definitions/RemotesItem" + } + }, + "RemotesObject": { + "description": "Container locations from which modules should be resolved and loaded at runtime. Property names are used as request scopes.", + "type": "object", + "additionalProperties": { + "description": "Container locations from which modules should be resolved and loaded at runtime.", + "anyOf": [ + { + "$ref": "#/definitions/RemotesConfig" + }, + { + "$ref": "#/definitions/RemotesItem" + }, + { + "$ref": "#/definitions/RemotesItems" + } + ] + } + } + } +} diff --git a/schemas/_sharing.json b/schemas/_sharing.json new file mode 100644 index 00000000000..02c1eedb705 --- /dev/null +++ b/schemas/_sharing.json @@ -0,0 +1,118 @@ +{ + "definitions": { + "Shared": { + "description": "Modules that should be shared in the share scope. When provided, property names are used to match requested modules in this compilation.", + "anyOf": [ + { + "type": "array", + "items": { + "description": "Modules that should be shared in the share scope.", + "anyOf": [ + { + "$ref": "#/definitions/SharedItem" + }, + { + "$ref": "#/definitions/SharedObject" + } + ] + } + }, + { + "$ref": "#/definitions/SharedObject" + } + ] + }, + "SharedConfig": { + "description": "Advanced configuration for modules that should be shared in the share scope.", + "type": "object", + "additionalProperties": false, + "properties": { + "eager": { + "description": "Include the provided and fallback module directly instead behind an async request. This allows to use this shared module in initial load too. All possible shared modules need to be eager too.", + "type": "boolean" + }, + "import": { + "description": "Provided module that should be provided to share scope. Also acts as fallback module if no shared module is found in share scope or version isn't valid. Defaults to the property name.", + "anyOf": [ + { + "description": "No provided or fallback module.", + "enum": [false] + }, + { + "$ref": "#/definitions/SharedItem" + } + ] + }, + "packageName": { + "description": "Package name to determine required version from description file. This is only needed when package name can't be automatically determined from request.", + "type": "string", + "minLength": 1 + }, + "requiredVersion": { + "description": "Version requirement from module in share scope.", + "anyOf": [ + { + "description": "No version requirement check.", + "enum": [false] + }, + { + "description": "Version as string. Can be prefixed with '^' or '~' for minimum matches. Each part of the version should be separated by a dot '.'.", + "type": "string" + } + ] + }, + "shareKey": { + "description": "Module is looked up under this key from the share scope.", + "type": "string", + "minLength": 1 + }, + "shareScope": { + "description": "Share scope name.", + "type": "string", + "minLength": 1 + }, + "singleton": { + "description": "Allow only a single version of the shared module in share scope (disabled by default).", + "type": "boolean" + }, + "strictVersion": { + "description": "Do not accept shared module if version is not valid (defaults to yes, if local fallback module is available and shared module is not a singleton, otherwise no, has no effect if there is no required version specified).", + "type": "boolean" + }, + "version": { + "description": "Version of the provided module. Will replace lower matching versions, but not higher.", + "anyOf": [ + { + "description": "Don't provide a version.", + "enum": [false] + }, + { + "description": "Version as string. Each part of the version should be separated by a dot '.'.", + "type": "string" + } + ] + } + } + }, + "SharedItem": { + "description": "A module that should be shared in the share scope.", + "type": "string", + "minLength": 1 + }, + "SharedObject": { + "description": "Modules that should be shared in the share scope. Property names are used to match requested modules in this compilation. Relative requests are resolved, module requests are matched unresolved, absolute paths will match resolved requests. A trailing slash will match all requests with this prefix. In this case shareKey must also have a trailing slash.", + "type": "object", + "additionalProperties": { + "description": "Modules that should be shared in the share scope.", + "anyOf": [ + { + "$ref": "#/definitions/SharedConfig" + }, + { + "$ref": "#/definitions/SharedItem" + } + ] + } + } + } +} diff --git a/schemas/ajv.absolutePath.js b/schemas/ajv.absolutePath.js deleted file mode 100644 index 8ef11f4359d..00000000000 --- a/schemas/ajv.absolutePath.js +++ /dev/null @@ -1,55 +0,0 @@ -"use strict"; - -const errorMessage = (schema, data, message) => ({ - keyword: "absolutePath", - params: { absolutePath: data }, - message: message, - parentSchema: schema -}); - -const getErrorFor = (shouldBeAbsolute, data, schema) => { - const message = shouldBeAbsolute - ? `The provided value ${JSON.stringify(data)} is not an absolute path!` - : `A relative path is expected. However, the provided value ${JSON.stringify( - data - )} is an absolute path!`; - - return errorMessage(schema, data, message); -}; - -module.exports = ajv => - ajv.addKeyword("absolutePath", { - errors: true, - type: "string", - compile(expected, schema) { - function callback(data) { - let passes = true; - const isExclamationMarkPresent = data.includes("!"); - const isCorrectAbsoluteOrRelativePath = - expected === /^(?:[A-Za-z]:\\|\/)/.test(data); - - if (isExclamationMarkPresent) { - callback.errors = [ - errorMessage( - schema, - data, - `The provided value ${JSON.stringify( - data - )} contains exclamation mark (!) which is not allowed because it's reserved for loader syntax.` - ) - ]; - passes = false; - } - - if (!isCorrectAbsoluteOrRelativePath) { - callback.errors = [getErrorFor(expected, data, schema)]; - passes = false; - } - - return passes; - } - callback.errors = []; - - return callback; - } - }); diff --git a/schemas/plugins/BannerPlugin.check.d.ts b/schemas/plugins/BannerPlugin.check.d.ts new file mode 100644 index 00000000000..389d72d7ed5 --- /dev/null +++ b/schemas/plugins/BannerPlugin.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: import("../../declarations/plugins/BannerPlugin").BannerPluginArgument) => boolean; +export = check; diff --git a/schemas/plugins/BannerPlugin.check.js b/schemas/plugins/BannerPlugin.check.js new file mode 100644 index 00000000000..c97c9b19b4d --- /dev/null +++ b/schemas/plugins/BannerPlugin.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function n(t,{instancePath:e="",parentData:s,parentDataProperty:l,rootData:a=t}={}){let r=null,o=0;const u=o;let i=!1;const p=o;if(o===p)if(Array.isArray(t)){const n=t.length;for(let e=0;e string" + "tsType": "(data: { hash?: string, chunk: import('../../lib/Chunk'), filename: string }) => string" }, "Rule": { - "oneOf": [ + "description": "Filtering rule as regex or string.", + "anyOf": [ { "instanceof": "RegExp", "tsType": "RegExp" @@ -18,12 +19,13 @@ ] }, "Rules": { - "oneOf": [ + "description": "Filtering rules.", + "anyOf": [ { "type": "array", "items": { - "description": "A rule condition", - "anyOf": [ + "description": "A rule condition.", + "oneOf": [ { "$ref": "#/definitions/Rule" } @@ -37,50 +39,63 @@ } }, "title": "BannerPluginArgument", - "oneOf": [ + "anyOf": [ + { + "description": "The banner as string, it will be wrapped in a comment.", + "type": "string", + "minLength": 1 + }, { "title": "BannerPluginOptions", "type": "object", "additionalProperties": false, "properties": { "banner": { - "description": "Specifies the banner", + "description": "Specifies the banner.", "anyOf": [ { - "$ref": "#/definitions/BannerFunction" + "type": "string" }, { - "type": "string" + "$ref": "#/definitions/BannerFunction" } ] }, "entryOnly": { - "description": "If true, the banner will only be added to the entry chunks", + "description": "If true, the banner will only be added to the entry chunks.", "type": "boolean" }, "exclude": { - "description": "Exclude all modules matching any of these conditions", - "anyOf": [ + "description": "Exclude all modules matching any of these conditions.", + "oneOf": [ { "$ref": "#/definitions/Rules" } ] }, + "footer": { + "description": "If true, banner will be placed at the end of the output.", + "type": "boolean" + }, "include": { - "description": "Include all modules matching any of these conditions", - "anyOf": [ + "description": "Include all modules matching any of these conditions.", + "oneOf": [ { "$ref": "#/definitions/Rules" } ] }, "raw": { - "description": "If true, banner will not be wrapped in a comment", + "description": "If true, banner will not be wrapped in a comment.", "type": "boolean" }, + "stage": { + "description": "Specifies the stage when add a banner.", + "type": "number" + }, "test": { - "description": "Include all modules that pass test assertion", - "anyOf": [ + "description": "Include all modules that pass test assertion.", + "oneOf": [ { "$ref": "#/definitions/Rules" } @@ -91,11 +106,6 @@ }, { "$ref": "#/definitions/BannerFunction" - }, - { - "description": "The banner as string, it will be wrapped in a comment", - "type": "string", - "minLength": 1 } ] } diff --git a/schemas/plugins/DllPlugin.check.d.ts b/schemas/plugins/DllPlugin.check.d.ts new file mode 100644 index 00000000000..99ba2990316 --- /dev/null +++ b/schemas/plugins/DllPlugin.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: import("../../declarations/plugins/DllPlugin").DllPluginOptions) => boolean; +export = check; diff --git a/schemas/plugins/DllPlugin.check.js b/schemas/plugins/DllPlugin.check.js new file mode 100644 index 00000000000..238b5107adc --- /dev/null +++ b/schemas/plugins/DllPlugin.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function r(e,{instancePath:t="",parentData:o,parentDataProperty:n,rootData:a=e}={}){if(!e||"object"!=typeof e||Array.isArray(e))return r.errors=[{params:{type:"object"}}],!1;{let t;if(void 0===e.path&&(t="path"))return r.errors=[{params:{missingProperty:t}}],!1;{const t=0;for(const t in e)if("context"!==t&&"entryOnly"!==t&&"format"!==t&&"name"!==t&&"path"!==t&&"type"!==t)return r.errors=[{params:{additionalProperty:t}}],!1;if(0===t){if(void 0!==e.context){let t=e.context;const o=0;if(0===o){if("string"!=typeof t)return r.errors=[{params:{type:"string"}}],!1;if(t.length<1)return r.errors=[{params:{}}],!1}var s=0===o}else s=!0;if(s){if(void 0!==e.entryOnly){const t=0;if("boolean"!=typeof e.entryOnly)return r.errors=[{params:{type:"boolean"}}],!1;s=0===t}else s=!0;if(s){if(void 0!==e.format){const t=0;if("boolean"!=typeof e.format)return r.errors=[{params:{type:"boolean"}}],!1;s=0===t}else s=!0;if(s){if(void 0!==e.name){let t=e.name;const o=0;if(0===o){if("string"!=typeof t)return r.errors=[{params:{type:"string"}}],!1;if(t.length<1)return r.errors=[{params:{}}],!1}s=0===o}else s=!0;if(s){if(void 0!==e.path){let t=e.path;const o=0;if(0===o){if("string"!=typeof t)return r.errors=[{params:{type:"string"}}],!1;if(t.length<1)return r.errors=[{params:{}}],!1}s=0===o}else s=!0;if(s)if(void 0!==e.type){let t=e.type;const o=0;if(0===o){if("string"!=typeof t)return r.errors=[{params:{type:"string"}}],!1;if(t.length<1)return r.errors=[{params:{}}],!1}s=0===o}else s=!0}}}}}}}return r.errors=null,!0}module.exports=r,module.exports.default=r; \ No newline at end of file diff --git a/schemas/plugins/DllPlugin.json b/schemas/plugins/DllPlugin.json index 18d7dee431e..9e5b999252f 100644 --- a/schemas/plugins/DllPlugin.json +++ b/schemas/plugins/DllPlugin.json @@ -4,30 +4,30 @@ "additionalProperties": false, "properties": { "context": { - "description": "Context of requests in the manifest file (defaults to the webpack context)", + "description": "Context of requests in the manifest file (defaults to the webpack context).", "type": "string", "minLength": 1 }, "entryOnly": { - "description": "If true, only entry points will be exposed", + "description": "If true, only entry points will be exposed (default: true).", "type": "boolean" }, "format": { - "description": "If true, manifest json file (output) will be formatted", + "description": "If true, manifest json file (output) will be formatted.", "type": "boolean" }, "name": { - "description": "Name of the exposed dll function (external name, use value of 'output.library')", + "description": "Name of the exposed dll function (external name, use value of 'output.library').", "type": "string", "minLength": 1 }, "path": { - "description": "Absolute path to the manifest json file (output)", + "description": "Absolute path to the manifest json file (output).", "type": "string", "minLength": 1 }, "type": { - "description": "Type of the dll bundle (external type, use value of 'output.libraryTarget')", + "description": "Type of the dll bundle (external type, use value of 'output.libraryTarget').", "type": "string", "minLength": 1 } diff --git a/schemas/plugins/DllReferencePlugin.check.d.ts b/schemas/plugins/DllReferencePlugin.check.d.ts new file mode 100644 index 00000000000..e156ef45be8 --- /dev/null +++ b/schemas/plugins/DllReferencePlugin.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: import("../../declarations/plugins/DllReferencePlugin").DllReferencePluginOptions) => boolean; +export = check; diff --git a/schemas/plugins/DllReferencePlugin.check.js b/schemas/plugins/DllReferencePlugin.check.js new file mode 100644 index 00000000000..5a05b48f614 --- /dev/null +++ b/schemas/plugins/DllReferencePlugin.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +const s=/^(?:[A-Za-z]:[\\/]|\\\\|\/)/;function t(s,{instancePath:e="",parentData:n,parentDataProperty:l,rootData:o=s}={}){let r=null,i=0;if(0===i){if(!s||"object"!=typeof s||Array.isArray(s))return t.errors=[{params:{type:"object"}}],!1;{let e;if(void 0===s.content&&(e="content"))return t.errors=[{params:{missingProperty:e}}],!1;{const e=i;for(const e in s)if("content"!==e&&"name"!==e&&"type"!==e)return t.errors=[{params:{additionalProperty:e}}],!1;if(e===i){if(void 0!==s.content){let e=s.content;const n=i,l=i;let o=!1,f=null;const m=i;if(i==i)if(e&&"object"==typeof e&&!Array.isArray(e))if(Object.keys(e).length<1){const s={params:{limit:1}};null===r?r=[s]:r.push(s),i++}else for(const s in e){let t=e[s];const n=i;if(i===n)if(t&&"object"==typeof t&&!Array.isArray(t)){let s;if(void 0===t.id&&(s="id")){const t={params:{missingProperty:s}};null===r?r=[t]:r.push(t),i++}else{const s=i;for(const s in t)if("buildMeta"!==s&&"exports"!==s&&"id"!==s){const t={params:{additionalProperty:s}};null===r?r=[t]:r.push(t),i++;break}if(s===i){if(void 0!==t.buildMeta){let s=t.buildMeta;const e=i;if(!s||"object"!=typeof s||Array.isArray(s)){const s={params:{type:"object"}};null===r?r=[s]:r.push(s),i++}var a=e===i}else a=!0;if(a){if(void 0!==t.exports){let s=t.exports;const e=i,n=i;let l=!1;const o=i;if(i===o)if(Array.isArray(s)){const t=s.length;for(let e=0;e boolean; +export = check; diff --git a/schemas/plugins/HashedModuleIdsPlugin.check.js b/schemas/plugins/HashedModuleIdsPlugin.check.js new file mode 100644 index 00000000000..ddf0827a426 --- /dev/null +++ b/schemas/plugins/HashedModuleIdsPlugin.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +const t=/^(?:[A-Za-z]:[\\/]|\\\\|\/)/;function e(r,{instancePath:s="",parentData:n,parentDataProperty:a,rootData:i=r}={}){let o=null,l=0;if(0===l){if(!r||"object"!=typeof r||Array.isArray(r))return e.errors=[{params:{type:"object"}}],!1;{const s=l;for(const t in r)if("context"!==t&&"hashDigest"!==t&&"hashDigestLength"!==t&&"hashFunction"!==t)return e.errors=[{params:{additionalProperty:t}}],!1;if(s===l){if(void 0!==r.context){let s=r.context;const n=l;if(l===n){if("string"!=typeof s)return e.errors=[{params:{type:"string"}}],!1;if(s.includes("!")||!0!==t.test(s))return e.errors=[{params:{}}],!1}var u=n===l}else u=!0;if(u){if(void 0!==r.hashDigest){let t=r.hashDigest;const s=l;if("hex"!==t&&"latin1"!==t&&"base64"!==t)return e.errors=[{params:{}}],!1;u=s===l}else u=!0;if(u){if(void 0!==r.hashDigestLength){let t=r.hashDigestLength;const s=l;if(l===s){if("number"!=typeof t)return e.errors=[{params:{type:"number"}}],!1;if(t<1||isNaN(t))return e.errors=[{params:{comparison:">=",limit:1}}],!1}u=s===l}else u=!0;if(u)if(void 0!==r.hashFunction){let t=r.hashFunction;const s=l,n=l;let a=!1,i=null;const p=l,h=l;let c=!1;const m=l;if(l===m)if("string"==typeof t){if(t.length<1){const t={params:{}};null===o?o=[t]:o.push(t),l++}}else{const t={params:{type:"string"}};null===o?o=[t]:o.push(t),l++}var f=m===l;if(c=c||f,!c){const e=l;if(!(t instanceof Function)){const t={params:{}};null===o?o=[t]:o.push(t),l++}f=e===l,c=c||f}if(c)l=h,null!==o&&(h?o.length=h:o=null);else{const t={params:{}};null===o?o=[t]:o.push(t),l++}if(p===l&&(a=!0,i=0),!a){const t={params:{passingSchemas:i}};return null===o?o=[t]:o.push(t),l++,e.errors=o,!1}l=n,null!==o&&(n?o.length=n:o=null),u=s===l}else u=!0}}}}}return e.errors=o,0===l}module.exports=e,module.exports.default=e; \ No newline at end of file diff --git a/schemas/plugins/HashedModuleIdsPlugin.json b/schemas/plugins/HashedModuleIdsPlugin.json index c4592ea6516..1b4efc40b5e 100644 --- a/schemas/plugins/HashedModuleIdsPlugin.json +++ b/schemas/plugins/HashedModuleIdsPlugin.json @@ -1,4 +1,19 @@ { + "definitions": { + "HashFunction": { + "description": "Algorithm used for generation the hash (see node.js crypto package).", + "anyOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "instanceof": "Function", + "tsType": "typeof import('../../lib/util/Hash')" + } + ] + } + }, "title": "HashedModuleIdsPluginOptions", "type": "object", "additionalProperties": false, @@ -18,9 +33,12 @@ "minimum": 1 }, "hashFunction": { - "description": "The hashing algorithm to use, defaults to 'md5'. All functions from Node.JS' crypto.createHash are supported.", - "type": "string", - "minLength": 1 + "description": "The hashing algorithm to use, defaults to 'md4'. All functions from Node.JS' crypto.createHash are supported.", + "oneOf": [ + { + "$ref": "#/definitions/HashFunction" + } + ] } } } diff --git a/schemas/plugins/IgnorePlugin.check.d.ts b/schemas/plugins/IgnorePlugin.check.d.ts new file mode 100644 index 00000000000..7291efb3a26 --- /dev/null +++ b/schemas/plugins/IgnorePlugin.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: import("../../declarations/plugins/IgnorePlugin").IgnorePluginOptions) => boolean; +export = check; diff --git a/schemas/plugins/IgnorePlugin.check.js b/schemas/plugins/IgnorePlugin.check.js new file mode 100644 index 00000000000..60185798133 --- /dev/null +++ b/schemas/plugins/IgnorePlugin.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function e(s,{instancePath:o="",parentData:r,parentDataProperty:t,rootData:n=s}={}){let c=null,a=0;const p=a;let l=!1;const i=a;if(a===i)if(s&&"object"==typeof s&&!Array.isArray(s)){let e;if(void 0===s.resourceRegExp&&(e="resourceRegExp")){const s={params:{missingProperty:e}};null===c?c=[s]:c.push(s),a++}else{const e=a;for(const e in s)if("contextRegExp"!==e&&"resourceRegExp"!==e){const s={params:{additionalProperty:e}};null===c?c=[s]:c.push(s),a++;break}if(e===a){if(void 0!==s.contextRegExp){const e=a;if(!(s.contextRegExp instanceof RegExp)){const e={params:{}};null===c?c=[e]:c.push(e),a++}var u=e===a}else u=!0;if(u)if(void 0!==s.resourceRegExp){const e=a;if(!(s.resourceRegExp instanceof RegExp)){const e={params:{}};null===c?c=[e]:c.push(e),a++}u=e===a}else u=!0}}}else{const e={params:{type:"object"}};null===c?c=[e]:c.push(e),a++}var f=i===a;if(l=l||f,!l){const e=a;if(a===e)if(s&&"object"==typeof s&&!Array.isArray(s)){let e;if(void 0===s.checkResource&&(e="checkResource")){const s={params:{missingProperty:e}};null===c?c=[s]:c.push(s),a++}else{const e=a;for(const e in s)if("checkResource"!==e){const s={params:{additionalProperty:e}};null===c?c=[s]:c.push(s),a++;break}if(e===a&&void 0!==s.checkResource&&!(s.checkResource instanceof Function)){const e={params:{}};null===c?c=[e]:c.push(e),a++}}}else{const e={params:{type:"object"}};null===c?c=[e]:c.push(e),a++}f=e===a,l=l||f}if(!l){const s={params:{}};return null===c?c=[s]:c.push(s),a++,e.errors=c,!1}return a=p,null!==c&&(p?c.length=p:c=null),e.errors=c,0===a}module.exports=e,module.exports.default=e; \ No newline at end of file diff --git a/schemas/plugins/IgnorePlugin.json b/schemas/plugins/IgnorePlugin.json index c873f07f791..58c1d2c50c5 100644 --- a/schemas/plugins/IgnorePlugin.json +++ b/schemas/plugins/IgnorePlugin.json @@ -1,37 +1,34 @@ { "title": "IgnorePluginOptions", - "oneOf": [ + "anyOf": [ { "type": "object", "additionalProperties": false, "properties": { "contextRegExp": { - "description": "A RegExp to test the context (directory) against", + "description": "A RegExp to test the context (directory) against.", "instanceof": "RegExp", "tsType": "RegExp" }, "resourceRegExp": { - "description": "A RegExp to test the request against", + "description": "A RegExp to test the request against.", "instanceof": "RegExp", "tsType": "RegExp" } - } + }, + "required": ["resourceRegExp"] }, { "type": "object", "additionalProperties": false, "properties": { - "checkContext": { - "description": "A filter function for context", - "instanceof": "Function", - "tsType": "((context: string) => boolean)" - }, "checkResource": { - "description": "A filter function for resource and context", + "description": "A filter function for resource and context.", "instanceof": "Function", "tsType": "((resource: string, context: string) => boolean)" } - } + }, + "required": ["checkResource"] } ] } diff --git a/schemas/plugins/LoaderOptionsPlugin.check.d.ts b/schemas/plugins/LoaderOptionsPlugin.check.d.ts new file mode 100644 index 00000000000..ea1d3a60a81 --- /dev/null +++ b/schemas/plugins/LoaderOptionsPlugin.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: import("../../declarations/plugins/LoaderOptionsPlugin").LoaderOptionsPluginOptions) => boolean; +export = check; diff --git a/schemas/plugins/LoaderOptionsPlugin.check.js b/schemas/plugins/LoaderOptionsPlugin.check.js new file mode 100644 index 00000000000..80fb3af14d5 --- /dev/null +++ b/schemas/plugins/LoaderOptionsPlugin.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +const r=/^(?:[A-Za-z]:[\\/]|\\\\|\/)/;function e(t,{instancePath:o="",parentData:a,parentDataProperty:i,rootData:n=t}={}){if(!t||"object"!=typeof t||Array.isArray(t))return e.errors=[{params:{type:"object"}}],!1;if(void 0!==t.debug){const r=0;if("boolean"!=typeof t.debug)return e.errors=[{params:{type:"boolean"}}],!1;var s=0===r}else s=!0;if(s){if(void 0!==t.minimize){const r=0;if("boolean"!=typeof t.minimize)return e.errors=[{params:{type:"boolean"}}],!1;s=0===r}else s=!0;if(s)if(void 0!==t.options){let o=t.options;const a=0;if(0===a){if(!o||"object"!=typeof o||Array.isArray(o))return e.errors=[{params:{type:"object"}}],!1;if(void 0!==o.context){let t=o.context;if("string"!=typeof t)return e.errors=[{params:{type:"string"}}],!1;if(t.includes("!")||!0!==r.test(t))return e.errors=[{params:{}}],!1}}s=0===a}else s=!0}return e.errors=null,!0}module.exports=e,module.exports.default=e; \ No newline at end of file diff --git a/schemas/plugins/LoaderOptionsPlugin.json b/schemas/plugins/LoaderOptionsPlugin.json index 67efca43336..912095c5975 100644 --- a/schemas/plugins/LoaderOptionsPlugin.json +++ b/schemas/plugins/LoaderOptionsPlugin.json @@ -4,20 +4,20 @@ "additionalProperties": true, "properties": { "debug": { - "description": "Whether loaders should be in debug mode or not. debug will be removed as of webpack 3", + "description": "Whether loaders should be in debug mode or not. debug will be removed as of webpack 3.", "type": "boolean" }, "minimize": { - "description": "Where loaders can be switched to minimize mode", + "description": "Where loaders can be switched to minimize mode.", "type": "boolean" }, "options": { - "description": "A configuration object that can be used to configure older loaders", + "description": "A configuration object that can be used to configure older loaders.", "type": "object", "additionalProperties": true, "properties": { "context": { - "description": "The context that can be used to configure older loaders", + "description": "The context that can be used to configure older loaders.", "type": "string", "absolutePath": true } diff --git a/schemas/plugins/ProgressPlugin.check.d.ts b/schemas/plugins/ProgressPlugin.check.d.ts new file mode 100644 index 00000000000..c0be4363ea3 --- /dev/null +++ b/schemas/plugins/ProgressPlugin.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: import("../../declarations/plugins/ProgressPlugin").ProgressPluginArgument) => boolean; +export = check; diff --git a/schemas/plugins/ProgressPlugin.check.js b/schemas/plugins/ProgressPlugin.check.js new file mode 100644 index 00000000000..09819f1d453 --- /dev/null +++ b/schemas/plugins/ProgressPlugin.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";module.exports=t,module.exports.default=t;const e={type:"object",additionalProperties:!1,properties:{activeModules:{type:"boolean"},dependencies:{type:"boolean"},dependenciesCount:{type:"number"},entries:{type:"boolean"},handler:{oneOf:[{$ref:"#/definitions/HandlerFunction"}]},modules:{type:"boolean"},modulesCount:{type:"number"},percentBy:{enum:["entries","modules","dependencies",null]},profile:{enum:[!0,!1,null]}}},r=Object.prototype.hasOwnProperty;function n(t,{instancePath:o="",parentData:s,parentDataProperty:a,rootData:l=t}={}){let i=null,p=0;if(0===p){if(!t||"object"!=typeof t||Array.isArray(t))return n.errors=[{params:{type:"object"}}],!1;{const o=p;for(const o in t)if(!r.call(e.properties,o))return n.errors=[{params:{additionalProperty:o}}],!1;if(o===p){if(void 0!==t.activeModules){const e=p;if("boolean"!=typeof t.activeModules)return n.errors=[{params:{type:"boolean"}}],!1;var u=e===p}else u=!0;if(u){if(void 0!==t.dependencies){const e=p;if("boolean"!=typeof t.dependencies)return n.errors=[{params:{type:"boolean"}}],!1;u=e===p}else u=!0;if(u){if(void 0!==t.dependenciesCount){const e=p;if("number"!=typeof t.dependenciesCount)return n.errors=[{params:{type:"number"}}],!1;u=e===p}else u=!0;if(u){if(void 0!==t.entries){const e=p;if("boolean"!=typeof t.entries)return n.errors=[{params:{type:"boolean"}}],!1;u=e===p}else u=!0;if(u){if(void 0!==t.handler){const e=p,r=p;let o=!1,s=null;const a=p;if(!(t.handler instanceof Function)){const e={params:{}};null===i?i=[e]:i.push(e),p++}if(a===p&&(o=!0,s=0),!o){const e={params:{passingSchemas:s}};return null===i?i=[e]:i.push(e),p++,n.errors=i,!1}p=r,null!==i&&(r?i.length=r:i=null),u=e===p}else u=!0;if(u){if(void 0!==t.modules){const e=p;if("boolean"!=typeof t.modules)return n.errors=[{params:{type:"boolean"}}],!1;u=e===p}else u=!0;if(u){if(void 0!==t.modulesCount){const e=p;if("number"!=typeof t.modulesCount)return n.errors=[{params:{type:"number"}}],!1;u=e===p}else u=!0;if(u){if(void 0!==t.percentBy){let e=t.percentBy;const r=p;if("entries"!==e&&"modules"!==e&&"dependencies"!==e&&null!==e)return n.errors=[{params:{}}],!1;u=r===p}else u=!0;if(u)if(void 0!==t.profile){let e=t.profile;const r=p;if(!0!==e&&!1!==e&&null!==e)return n.errors=[{params:{}}],!1;u=r===p}else u=!0}}}}}}}}}}return n.errors=i,0===p}function t(e,{instancePath:r="",parentData:o,parentDataProperty:s,rootData:a=e}={}){let l=null,i=0;const p=i;let u=!1;const c=i;n(e,{instancePath:r,parentData:o,parentDataProperty:s,rootData:a})||(l=null===l?n.errors:l.concat(n.errors),i=l.length);var f=c===i;if(u=u||f,!u){const r=i;if(!(e instanceof Function)){const e={params:{}};null===l?l=[e]:l.push(e),i++}f=r===i,u=u||f}if(!u){const e={params:{}};return null===l?l=[e]:l.push(e),i++,t.errors=l,!1}return i=p,null!==l&&(p?l.length=p:l=null),t.errors=l,0===i} \ No newline at end of file diff --git a/schemas/plugins/ProgressPlugin.json b/schemas/plugins/ProgressPlugin.json index e3847c7e134..2867de45e10 100644 --- a/schemas/plugins/ProgressPlugin.json +++ b/schemas/plugins/ProgressPlugin.json @@ -1,47 +1,60 @@ { "definitions": { "HandlerFunction": { - "description": "Function that executes for every progress step", + "description": "Function that executes for every progress step.", "instanceof": "Function", "tsType": "((percentage: number, msg: string, ...args: string[]) => void)" }, "ProgressPluginOptions": { + "description": "Options object for the ProgressPlugin.", "type": "object", "additionalProperties": false, "properties": { "activeModules": { - "description": "Show active modules count and one active module in progress message", + "description": "Show active modules count and one active module in progress message.", "type": "boolean" }, + "dependencies": { + "description": "Show dependencies count in progress message.", + "type": "boolean" + }, + "dependenciesCount": { + "description": "Minimum dependencies count to start with. For better progress calculation. Default: 10000.", + "type": "number" + }, "entries": { - "description": "Show entries count in progress message", + "description": "Show entries count in progress message.", "type": "boolean" }, "handler": { - "description": "Function that executes for every progress step", - "anyOf": [ + "description": "Function that executes for every progress step.", + "oneOf": [ { "$ref": "#/definitions/HandlerFunction" } ] }, "modules": { - "description": "Show modules count in progress message", + "description": "Show modules count in progress message.", "type": "boolean" }, "modulesCount": { - "description": "Minimum modules count to start with. Only for mode=modules. Default: 500", + "description": "Minimum modules count to start with. For better progress calculation. Default: 5000.", "type": "number" }, + "percentBy": { + "description": "Collect percent algorithm. By default it calculates by a median from modules, entries and dependencies percent.", + "enum": ["entries", "modules", "dependencies", null] + }, "profile": { - "description": "Collect profile data for progress steps. Default: false", + "description": "Collect profile data for progress steps. Default: false.", "enum": [true, false, null] } } } }, "title": "ProgressPluginArgument", - "oneOf": [ + "anyOf": [ { "$ref": "#/definitions/ProgressPluginOptions" }, diff --git a/schemas/plugins/SourceMapDevToolPlugin.check.d.ts b/schemas/plugins/SourceMapDevToolPlugin.check.d.ts new file mode 100644 index 00000000000..61d2440ef0b --- /dev/null +++ b/schemas/plugins/SourceMapDevToolPlugin.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: import("../../declarations/plugins/SourceMapDevToolPlugin").SourceMapDevToolPluginOptions) => boolean; +export = check; diff --git a/schemas/plugins/SourceMapDevToolPlugin.check.js b/schemas/plugins/SourceMapDevToolPlugin.check.js new file mode 100644 index 00000000000..de73840e28e --- /dev/null +++ b/schemas/plugins/SourceMapDevToolPlugin.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +const e=/^(?:[A-Za-z]:[\\/]|\\\\|\/)/;module.exports=l,module.exports.default=l;const n={definitions:{rule:{anyOf:[{instanceof:"RegExp"},{type:"string",minLength:1}]},rules:{anyOf:[{type:"array",items:{oneOf:[{$ref:"#/definitions/rule"}]}},{$ref:"#/definitions/rule"}]}},type:"object",additionalProperties:!1,properties:{append:{anyOf:[{enum:[!1,null]},{type:"string",minLength:1},{instanceof:"Function"}]},columns:{type:"boolean"},debugIds:{type:"boolean"},exclude:{oneOf:[{$ref:"#/definitions/rules"}]},fallbackModuleFilenameTemplate:{anyOf:[{type:"string",minLength:1},{instanceof:"Function"}]},fileContext:{type:"string"},filename:{anyOf:[{enum:[!1,null]},{type:"string",absolutePath:!1,minLength:1}]},include:{oneOf:[{$ref:"#/definitions/rules"}]},module:{type:"boolean"},moduleFilenameTemplate:{anyOf:[{type:"string",minLength:1},{instanceof:"Function"}]},namespace:{type:"string"},noSources:{type:"boolean"},publicPath:{type:"string"},sourceRoot:{type:"string"},test:{$ref:"#/definitions/rules"}}},t=Object.prototype.hasOwnProperty;function s(e,{instancePath:n="",parentData:t,parentDataProperty:l,rootData:r=e}={}){let o=null,a=0;const i=a;let u=!1;const p=a;if(a===p)if(Array.isArray(e)){const n=e.length;for(let t=0;t string)" } ] }, "columns": { - "description": "Indicates whether column mappings should be used (defaults to true)", + "description": "Indicates whether column mappings should be used (defaults to true).", + "type": "boolean" + }, + "debugIds": { + "description": "Emit debug IDs into source and SourceMap.", "type": "boolean" }, "exclude": { - "description": "Exclude modules that match the given value from source map generation", - "anyOf": [ + "description": "Exclude modules that match the given value from source map generation.", + "oneOf": [ { "$ref": "#/definitions/rules" } ] }, "fallbackModuleFilenameTemplate": { - "description": "Generator string or function to create identifiers of modules for the 'sources' array in the SourceMap used only if 'moduleFilenameTemplate' would result in a conflict", - "oneOf": [ - { - "description": "Custom function generating the identifer", - "instanceof": "Function", - "tsType": "Function" - }, + "description": "Generator string or function to create identifiers of modules for the 'sources' array in the SourceMap used only if 'moduleFilenameTemplate' would result in a conflict.", + "anyOf": [ { "type": "string", "minLength": 1 + }, + { + "description": "Custom function generating the identifier.", + "instanceof": "Function", + "tsType": "import('../../lib/ModuleFilenameHelpers').ModuleFilenameTemplateFunction" } ] }, "fileContext": { - "description": "Path prefix to which the [file] placeholder is relative to", + "description": "Path prefix to which the [file] placeholder is relative to.", "type": "string" }, "filename": { - "description": "Defines the output filename of the SourceMap (will be inlined if no value is provided)", - "oneOf": [ + "description": "Defines the output filename of the SourceMap (will be inlined if no value is provided).", + "anyOf": [ { - "description": "Disable separate SourceMap file and inline SourceMap as DataUrl", + "description": "Disable separate SourceMap file and inline SourceMap as DataUrl.", "enum": [false, null] }, { @@ -93,93 +103,49 @@ ] }, "include": { - "description": "Include source maps for module paths that match the given value", - "anyOf": [ + "description": "Include source maps for module paths that match the given value.", + "oneOf": [ { "$ref": "#/definitions/rules" } ] }, - "lineToLine": { - "description": "(deprecated) try to map original files line to line to generated files", - "anyOf": [ - { - "type": "boolean" - }, - { - "description": "Simplify and speed up source mapping by using line to line source mappings for matched modules", - "type": "object", - "additionalProperties": false, - "properties": { - "exclude": { - "description": "Exclude modules that match the given value from source map generation", - "anyOf": [ - { - "$ref": "#/definitions/rules" - } - ] - }, - "include": { - "description": "Include source maps for module paths that match the given value", - "anyOf": [ - { - "$ref": "#/definitions/rules" - } - ] - }, - "test": { - "description": "Include source maps for modules based on their extension (defaults to .js and .css)", - "anyOf": [ - { - "$ref": "#/definitions/rules" - } - ] - } - } - } - ] - }, "module": { - "description": "Indicates whether SourceMaps from loaders should be used (defaults to true)", + "description": "Indicates whether SourceMaps from loaders should be used (defaults to true).", "type": "boolean" }, "moduleFilenameTemplate": { - "description": "Generator string or function to create identifiers of modules for the 'sources' array in the SourceMap", - "oneOf": [ - { - "description": "Custom function generating the identifer", - "instanceof": "Function", - "tsType": "Function" - }, + "description": "Generator string or function to create identifiers of modules for the 'sources' array in the SourceMap.", + "anyOf": [ { "type": "string", "minLength": 1 + }, + { + "description": "Custom function generating the identifier.", + "instanceof": "Function", + "tsType": "import('../../lib/ModuleFilenameHelpers').ModuleFilenameTemplateFunction" } ] }, "namespace": { - "description": "Namespace prefix to allow multiple webpack roots in the devtools", + "description": "Namespace prefix to allow multiple webpack roots in the devtools.", "type": "string" }, "noSources": { - "description": "Omit the 'sourceContents' array from the SourceMap", + "description": "Omit the 'sourceContents' array from the SourceMap.", "type": "boolean" }, "publicPath": { - "description": "Provide a custom public path for the SourceMapping comment", + "description": "Provide a custom public path for the SourceMapping comment.", "type": "string" }, "sourceRoot": { - "description": "Provide a custom value for the 'sourceRoot' property in the SourceMap", + "description": "Provide a custom value for the 'sourceRoot' property in the SourceMap.", "type": "string" }, "test": { - "description": "Include source maps for modules based on their extension (defaults to .js and .css)", - "anyOf": [ - { - "$ref": "#/definitions/rules" - } - ] + "$ref": "#/definitions/rules" } } } diff --git a/schemas/plugins/WatchIgnorePlugin.check.d.ts b/schemas/plugins/WatchIgnorePlugin.check.d.ts new file mode 100644 index 00000000000..41baee25378 --- /dev/null +++ b/schemas/plugins/WatchIgnorePlugin.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: import("../../declarations/plugins/WatchIgnorePlugin").WatchIgnorePluginOptions) => boolean; +export = check; diff --git a/schemas/plugins/WatchIgnorePlugin.check.js b/schemas/plugins/WatchIgnorePlugin.check.js new file mode 100644 index 00000000000..60bd0be7312 --- /dev/null +++ b/schemas/plugins/WatchIgnorePlugin.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function r(t,{instancePath:e="",parentData:s,parentDataProperty:a,rootData:n=t}={}){let o=null,i=0;if(0===i){if(!t||"object"!=typeof t||Array.isArray(t))return r.errors=[{params:{type:"object"}}],!1;{let e;if(void 0===t.paths&&(e="paths"))return r.errors=[{params:{missingProperty:e}}],!1;{const e=i;for(const e in t)if("paths"!==e)return r.errors=[{params:{additionalProperty:e}}],!1;if(e===i&&void 0!==t.paths){let e=t.paths;if(i==i){if(!Array.isArray(e))return r.errors=[{params:{type:"array"}}],!1;if(e.length<1)return r.errors=[{params:{limit:1}}],!1;{const t=e.length;for(let s=0;s boolean; +export = check; diff --git a/schemas/plugins/asset/AssetGeneratorOptions.check.js b/schemas/plugins/asset/AssetGeneratorOptions.check.js new file mode 100644 index 00000000000..c835a70e5e4 --- /dev/null +++ b/schemas/plugins/asset/AssetGeneratorOptions.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +const t=/^(?:[A-Za-z]:[\\/]|\\\\|\/)/;function n(t,{instancePath:r="",parentData:e,parentDataProperty:a,rootData:s=t}={}){let o=null,l=0;const i=l;let p=!1;const u=l;if(l==l)if(t&&"object"==typeof t&&!Array.isArray(t)){const n=l;for(const n in t)if("encoding"!==n&&"mimetype"!==n){const t={params:{additionalProperty:n}};null===o?o=[t]:o.push(t),l++;break}if(n===l){if(void 0!==t.encoding){let n=t.encoding;const r=l;if(!1!==n&&"base64"!==n){const t={params:{}};null===o?o=[t]:o.push(t),l++}var c=r===l}else c=!0;if(c)if(void 0!==t.mimetype){const n=l;if("string"!=typeof t.mimetype){const t={params:{type:"string"}};null===o?o=[t]:o.push(t),l++}c=n===l}else c=!0}}else{const t={params:{type:"object"}};null===o?o=[t]:o.push(t),l++}var f=u===l;if(p=p||f,!p){const n=l;if(!(t instanceof Function)){const t={params:{}};null===o?o=[t]:o.push(t),l++}f=n===l,p=p||f}if(!p){const t={params:{}};return null===o?o=[t]:o.push(t),l++,n.errors=o,!1}return l=i,null!==o&&(i?o.length=i:o=null),n.errors=o,0===l}function r(e,{instancePath:a="",parentData:s,parentDataProperty:o,rootData:l=e}={}){let i=null,p=0;if(0===p){if(!e||"object"!=typeof e||Array.isArray(e))return r.errors=[{params:{type:"object"}}],!1;{const s=p;for(const t in e)if("binary"!==t&&"dataUrl"!==t&&"emit"!==t&&"filename"!==t&&"outputPath"!==t&&"publicPath"!==t)return r.errors=[{params:{additionalProperty:t}}],!1;if(s===p){if(void 0!==e.binary){const t=p;if("boolean"!=typeof e.binary)return r.errors=[{params:{type:"boolean"}}],!1;var u=t===p}else u=!0;if(u){if(void 0!==e.dataUrl){const t=p;n(e.dataUrl,{instancePath:a+"/dataUrl",parentData:e,parentDataProperty:"dataUrl",rootData:l})||(i=null===i?n.errors:i.concat(n.errors),p=i.length),u=t===p}else u=!0;if(u){if(void 0!==e.emit){const t=p;if("boolean"!=typeof e.emit)return r.errors=[{params:{type:"boolean"}}],!1;u=t===p}else u=!0;if(u){if(void 0!==e.filename){let n=e.filename;const a=p,s=p;let o=!1;const l=p;if(p===l)if("string"==typeof n){if(n.includes("!")||!1!==t.test(n)){const t={params:{}};null===i?i=[t]:i.push(t),p++}else if(n.length<1){const t={params:{}};null===i?i=[t]:i.push(t),p++}}else{const t={params:{type:"string"}};null===i?i=[t]:i.push(t),p++}var c=l===p;if(o=o||c,!o){const t=p;if(!(n instanceof Function)){const t={params:{}};null===i?i=[t]:i.push(t),p++}c=t===p,o=o||c}if(!o){const t={params:{}};return null===i?i=[t]:i.push(t),p++,r.errors=i,!1}p=s,null!==i&&(s?i.length=s:i=null),u=a===p}else u=!0;if(u){if(void 0!==e.outputPath){let n=e.outputPath;const a=p,s=p;let o=!1;const l=p;if(p===l)if("string"==typeof n){if(n.includes("!")||!1!==t.test(n)){const t={params:{}};null===i?i=[t]:i.push(t),p++}}else{const t={params:{type:"string"}};null===i?i=[t]:i.push(t),p++}var f=l===p;if(o=o||f,!o){const t=p;if(!(n instanceof Function)){const t={params:{}};null===i?i=[t]:i.push(t),p++}f=t===p,o=o||f}if(!o){const t={params:{}};return null===i?i=[t]:i.push(t),p++,r.errors=i,!1}p=s,null!==i&&(s?i.length=s:i=null),u=a===p}else u=!0;if(u)if(void 0!==e.publicPath){let t=e.publicPath;const n=p,a=p;let s=!1;const o=p;if("string"!=typeof t){const t={params:{type:"string"}};null===i?i=[t]:i.push(t),p++}var h=o===p;if(s=s||h,!s){const n=p;if(!(t instanceof Function)){const t={params:{}};null===i?i=[t]:i.push(t),p++}h=n===p,s=s||h}if(!s){const t={params:{}};return null===i?i=[t]:i.push(t),p++,r.errors=i,!1}p=a,null!==i&&(a?i.length=a:i=null),u=n===p}else u=!0}}}}}}}return r.errors=i,0===p}function e(t,{instancePath:n="",parentData:a,parentDataProperty:s,rootData:o=t}={}){let l=null,i=0;return r(t,{instancePath:n,parentData:a,parentDataProperty:s,rootData:o})||(l=null===l?r.errors:l.concat(r.errors),i=l.length),e.errors=l,0===i}module.exports=e,module.exports.default=e; \ No newline at end of file diff --git a/schemas/plugins/asset/AssetGeneratorOptions.json b/schemas/plugins/asset/AssetGeneratorOptions.json new file mode 100644 index 00000000000..c00fc87197f --- /dev/null +++ b/schemas/plugins/asset/AssetGeneratorOptions.json @@ -0,0 +1,3 @@ +{ + "$ref": "../../WebpackOptions.json#/definitions/AssetGeneratorOptions" +} diff --git a/schemas/plugins/asset/AssetInlineGeneratorOptions.check.d.ts b/schemas/plugins/asset/AssetInlineGeneratorOptions.check.d.ts new file mode 100644 index 00000000000..8710226a8f4 --- /dev/null +++ b/schemas/plugins/asset/AssetInlineGeneratorOptions.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: any) => boolean; +export = check; diff --git a/schemas/plugins/asset/AssetInlineGeneratorOptions.check.js b/schemas/plugins/asset/AssetInlineGeneratorOptions.check.js new file mode 100644 index 00000000000..e5496307f43 --- /dev/null +++ b/schemas/plugins/asset/AssetInlineGeneratorOptions.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function t(r,{instancePath:a="",parentData:e,parentDataProperty:n,rootData:o=r}={}){let s=null,i=0;const l=i;let p=!1;const c=i;if(i==i)if(r&&"object"==typeof r&&!Array.isArray(r)){const t=i;for(const t in r)if("encoding"!==t&&"mimetype"!==t){const r={params:{additionalProperty:t}};null===s?s=[r]:s.push(r),i++;break}if(t===i){if(void 0!==r.encoding){let t=r.encoding;const a=i;if(!1!==t&&"base64"!==t){const t={params:{}};null===s?s=[t]:s.push(t),i++}var u=a===i}else u=!0;if(u)if(void 0!==r.mimetype){const t=i;if("string"!=typeof r.mimetype){const t={params:{type:"string"}};null===s?s=[t]:s.push(t),i++}u=t===i}else u=!0}}else{const t={params:{type:"object"}};null===s?s=[t]:s.push(t),i++}var f=c===i;if(p=p||f,!p){const t=i;if(!(r instanceof Function)){const t={params:{}};null===s?s=[t]:s.push(t),i++}f=t===i,p=p||f}if(!p){const r={params:{}};return null===s?s=[r]:s.push(r),i++,t.errors=s,!1}return i=l,null!==s&&(l?s.length=l:s=null),t.errors=s,0===i}function r(a,{instancePath:e="",parentData:n,parentDataProperty:o,rootData:s=a}={}){let i=null,l=0;if(0===l){if(!a||"object"!=typeof a||Array.isArray(a))return r.errors=[{params:{type:"object"}}],!1;{const n=l;for(const t in a)if("binary"!==t&&"dataUrl"!==t)return r.errors=[{params:{additionalProperty:t}}],!1;if(n===l){if(void 0!==a.binary){const t=l;if("boolean"!=typeof a.binary)return r.errors=[{params:{type:"boolean"}}],!1;var p=t===l}else p=!0;if(p)if(void 0!==a.dataUrl){const r=l;t(a.dataUrl,{instancePath:e+"/dataUrl",parentData:a,parentDataProperty:"dataUrl",rootData:s})||(i=null===i?t.errors:i.concat(t.errors),l=i.length),p=r===l}else p=!0}}}return r.errors=i,0===l}function a(t,{instancePath:e="",parentData:n,parentDataProperty:o,rootData:s=t}={}){let i=null,l=0;return r(t,{instancePath:e,parentData:n,parentDataProperty:o,rootData:s})||(i=null===i?r.errors:i.concat(r.errors),l=i.length),a.errors=i,0===l}module.exports=a,module.exports.default=a; \ No newline at end of file diff --git a/schemas/plugins/asset/AssetInlineGeneratorOptions.json b/schemas/plugins/asset/AssetInlineGeneratorOptions.json new file mode 100644 index 00000000000..a6fff2a170a --- /dev/null +++ b/schemas/plugins/asset/AssetInlineGeneratorOptions.json @@ -0,0 +1,3 @@ +{ + "$ref": "../../WebpackOptions.json#/definitions/AssetInlineGeneratorOptions" +} diff --git a/schemas/plugins/asset/AssetParserOptions.check.d.ts b/schemas/plugins/asset/AssetParserOptions.check.d.ts new file mode 100644 index 00000000000..8710226a8f4 --- /dev/null +++ b/schemas/plugins/asset/AssetParserOptions.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: any) => boolean; +export = check; diff --git a/schemas/plugins/asset/AssetParserOptions.check.js b/schemas/plugins/asset/AssetParserOptions.check.js new file mode 100644 index 00000000000..33350819763 --- /dev/null +++ b/schemas/plugins/asset/AssetParserOptions.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function t(r,{instancePath:a="",parentData:n,parentDataProperty:o,rootData:e=r}={}){let s=null,i=0;if(0===i){if(!r||"object"!=typeof r||Array.isArray(r))return t.errors=[{params:{type:"object"}}],!1;{const a=i;for(const a in r)if("dataUrlCondition"!==a)return t.errors=[{params:{additionalProperty:a}}],!1;if(a===i&&void 0!==r.dataUrlCondition){let a=r.dataUrlCondition;const n=i;let o=!1;const e=i;if(i==i)if(a&&"object"==typeof a&&!Array.isArray(a)){const t=i;for(const t in a)if("maxSize"!==t){const r={params:{additionalProperty:t}};null===s?s=[r]:s.push(r),i++;break}if(t===i&&void 0!==a.maxSize&&"number"!=typeof a.maxSize){const t={params:{type:"number"}};null===s?s=[t]:s.push(t),i++}}else{const t={params:{type:"object"}};null===s?s=[t]:s.push(t),i++}var l=e===i;if(o=o||l,!o){const t=i;if(!(a instanceof Function)){const t={params:{}};null===s?s=[t]:s.push(t),i++}l=t===i,o=o||l}if(!o){const r={params:{}};return null===s?s=[r]:s.push(r),i++,t.errors=s,!1}i=n,null!==s&&(n?s.length=n:s=null)}}}return t.errors=s,0===i}function r(a,{instancePath:n="",parentData:o,parentDataProperty:e,rootData:s=a}={}){let i=null,l=0;return t(a,{instancePath:n,parentData:o,parentDataProperty:e,rootData:s})||(i=null===i?t.errors:i.concat(t.errors),l=i.length),r.errors=i,0===l}module.exports=r,module.exports.default=r; \ No newline at end of file diff --git a/schemas/plugins/asset/AssetParserOptions.json b/schemas/plugins/asset/AssetParserOptions.json new file mode 100644 index 00000000000..66bf562d6c1 --- /dev/null +++ b/schemas/plugins/asset/AssetParserOptions.json @@ -0,0 +1,3 @@ +{ + "$ref": "../../WebpackOptions.json#/definitions/AssetParserOptions" +} diff --git a/schemas/plugins/asset/AssetResourceGeneratorOptions.check.d.ts b/schemas/plugins/asset/AssetResourceGeneratorOptions.check.d.ts new file mode 100644 index 00000000000..8710226a8f4 --- /dev/null +++ b/schemas/plugins/asset/AssetResourceGeneratorOptions.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: any) => boolean; +export = check; diff --git a/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js b/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js new file mode 100644 index 00000000000..15921fa87d0 --- /dev/null +++ b/schemas/plugins/asset/AssetResourceGeneratorOptions.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +const t=/^(?:[A-Za-z]:[\\/]|\\\\|\/)/;function n(r,{instancePath:e="",parentData:a,parentDataProperty:s,rootData:o=r}={}){let l=null,i=0;if(0===i){if(!r||"object"!=typeof r||Array.isArray(r))return n.errors=[{params:{type:"object"}}],!1;{const e=i;for(const t in r)if("binary"!==t&&"emit"!==t&&"filename"!==t&&"outputPath"!==t&&"publicPath"!==t)return n.errors=[{params:{additionalProperty:t}}],!1;if(e===i){if(void 0!==r.binary){const t=i;if("boolean"!=typeof r.binary)return n.errors=[{params:{type:"boolean"}}],!1;var u=t===i}else u=!0;if(u){if(void 0!==r.emit){const t=i;if("boolean"!=typeof r.emit)return n.errors=[{params:{type:"boolean"}}],!1;u=t===i}else u=!0;if(u){if(void 0!==r.filename){let e=r.filename;const a=i,s=i;let o=!1;const f=i;if(i===f)if("string"==typeof e){if(e.includes("!")||!1!==t.test(e)){const t={params:{}};null===l?l=[t]:l.push(t),i++}else if(e.length<1){const t={params:{}};null===l?l=[t]:l.push(t),i++}}else{const t={params:{type:"string"}};null===l?l=[t]:l.push(t),i++}var p=f===i;if(o=o||p,!o){const t=i;if(!(e instanceof Function)){const t={params:{}};null===l?l=[t]:l.push(t),i++}p=t===i,o=o||p}if(!o){const t={params:{}};return null===l?l=[t]:l.push(t),i++,n.errors=l,!1}i=s,null!==l&&(s?l.length=s:l=null),u=a===i}else u=!0;if(u){if(void 0!==r.outputPath){let e=r.outputPath;const a=i,s=i;let o=!1;const p=i;if(i===p)if("string"==typeof e){if(e.includes("!")||!1!==t.test(e)){const t={params:{}};null===l?l=[t]:l.push(t),i++}}else{const t={params:{type:"string"}};null===l?l=[t]:l.push(t),i++}var f=p===i;if(o=o||f,!o){const t=i;if(!(e instanceof Function)){const t={params:{}};null===l?l=[t]:l.push(t),i++}f=t===i,o=o||f}if(!o){const t={params:{}};return null===l?l=[t]:l.push(t),i++,n.errors=l,!1}i=s,null!==l&&(s?l.length=s:l=null),u=a===i}else u=!0;if(u)if(void 0!==r.publicPath){let t=r.publicPath;const e=i,a=i;let s=!1;const o=i;if("string"!=typeof t){const t={params:{type:"string"}};null===l?l=[t]:l.push(t),i++}var c=o===i;if(s=s||c,!s){const n=i;if(!(t instanceof Function)){const t={params:{}};null===l?l=[t]:l.push(t),i++}c=n===i,s=s||c}if(!s){const t={params:{}};return null===l?l=[t]:l.push(t),i++,n.errors=l,!1}i=a,null!==l&&(a?l.length=a:l=null),u=e===i}else u=!0}}}}}}return n.errors=l,0===i}function r(t,{instancePath:e="",parentData:a,parentDataProperty:s,rootData:o=t}={}){let l=null,i=0;return n(t,{instancePath:e,parentData:a,parentDataProperty:s,rootData:o})||(l=null===l?n.errors:l.concat(n.errors),i=l.length),r.errors=l,0===i}module.exports=r,module.exports.default=r; \ No newline at end of file diff --git a/schemas/plugins/asset/AssetResourceGeneratorOptions.json b/schemas/plugins/asset/AssetResourceGeneratorOptions.json new file mode 100644 index 00000000000..8ae51d5ca91 --- /dev/null +++ b/schemas/plugins/asset/AssetResourceGeneratorOptions.json @@ -0,0 +1,3 @@ +{ + "$ref": "../../WebpackOptions.json#/definitions/AssetResourceGeneratorOptions" +} diff --git a/schemas/plugins/container/ContainerPlugin.check.d.ts b/schemas/plugins/container/ContainerPlugin.check.d.ts new file mode 100644 index 00000000000..3ace987f552 --- /dev/null +++ b/schemas/plugins/container/ContainerPlugin.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: import("../../../declarations/plugins/container/ContainerPlugin").ContainerPluginOptions) => boolean; +export = check; diff --git a/schemas/plugins/container/ContainerPlugin.check.js b/schemas/plugins/container/ContainerPlugin.check.js new file mode 100644 index 00000000000..8bb1a53a45b --- /dev/null +++ b/schemas/plugins/container/ContainerPlugin.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +const r=/^(?:[A-Za-z]:[\\/]|\\\\|\/)/;function t(r,{instancePath:e="",parentData:n,parentDataProperty:s,rootData:a=r}={}){if(!Array.isArray(r))return t.errors=[{params:{type:"array"}}],!1;{const e=r.length;for(let n=0;n boolean; +export = check; diff --git a/schemas/plugins/container/ContainerReferencePlugin.check.js b/schemas/plugins/container/ContainerReferencePlugin.check.js new file mode 100644 index 00000000000..8a902953c7a --- /dev/null +++ b/schemas/plugins/container/ContainerReferencePlugin.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function r(t,{instancePath:e="",parentData:a,parentDataProperty:n,rootData:o=t}={}){if(!Array.isArray(t))return r.errors=[{params:{type:"array"}}],!1;{const e=t.length;for(let a=0;a boolean; +export = check; diff --git a/schemas/plugins/container/ExternalsType.check.js b/schemas/plugins/container/ExternalsType.check.js new file mode 100644 index 00000000000..0ac3c98fffc --- /dev/null +++ b/schemas/plugins/container/ExternalsType.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function o(m,{instancePath:r="",parentData:s,parentDataProperty:t,rootData:e=m}={}){return"var"!==m&&"module"!==m&&"assign"!==m&&"this"!==m&&"window"!==m&&"self"!==m&&"global"!==m&&"commonjs"!==m&&"commonjs2"!==m&&"commonjs-module"!==m&&"commonjs-static"!==m&&"amd"!==m&&"amd-require"!==m&&"umd"!==m&&"umd2"!==m&&"jsonp"!==m&&"system"!==m&&"promise"!==m&&"import"!==m&&"module-import"!==m&&"script"!==m&&"node-commonjs"!==m?(o.errors=[{params:{}}],!1):(o.errors=null,!0)}module.exports=o,module.exports.default=o; \ No newline at end of file diff --git a/schemas/plugins/container/ExternalsType.json b/schemas/plugins/container/ExternalsType.json new file mode 100644 index 00000000000..d5898583c6b --- /dev/null +++ b/schemas/plugins/container/ExternalsType.json @@ -0,0 +1,3 @@ +{ + "$ref": "./ModuleFederationPlugin.json#/definitions/ExternalsType" +} diff --git a/schemas/plugins/container/ModuleFederationPlugin.check.d.ts b/schemas/plugins/container/ModuleFederationPlugin.check.d.ts new file mode 100644 index 00000000000..66c94833a78 --- /dev/null +++ b/schemas/plugins/container/ModuleFederationPlugin.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: import("../../../declarations/plugins/container/ModuleFederationPlugin").ModuleFederationPluginOptions) => boolean; +export = check; diff --git a/schemas/plugins/container/ModuleFederationPlugin.check.js b/schemas/plugins/container/ModuleFederationPlugin.check.js new file mode 100644 index 00000000000..cee2e81be58 --- /dev/null +++ b/schemas/plugins/container/ModuleFederationPlugin.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +const t=/^(?:[A-Za-z]:[\\/]|\\\\|\/)/;module.exports=D,module.exports.default=D;const e={definitions:{AmdContainer:{type:"string",minLength:1},AuxiliaryComment:{anyOf:[{type:"string"},{$ref:"#/definitions/LibraryCustomUmdCommentObject"}]},EntryRuntime:{anyOf:[{enum:[!1]},{type:"string",minLength:1}]},Exposes:{anyOf:[{type:"array",items:{anyOf:[{$ref:"#/definitions/ExposesItem"},{$ref:"#/definitions/ExposesObject"}]}},{$ref:"#/definitions/ExposesObject"}]},ExposesConfig:{type:"object",additionalProperties:!1,properties:{import:{anyOf:[{$ref:"#/definitions/ExposesItem"},{$ref:"#/definitions/ExposesItems"}]},name:{type:"string"}},required:["import"]},ExposesItem:{type:"string",minLength:1},ExposesItems:{type:"array",items:{$ref:"#/definitions/ExposesItem"}},ExposesObject:{type:"object",additionalProperties:{anyOf:[{$ref:"#/definitions/ExposesConfig"},{$ref:"#/definitions/ExposesItem"},{$ref:"#/definitions/ExposesItems"}]}},ExternalsType:{enum:["var","module","assign","this","window","self","global","commonjs","commonjs2","commonjs-module","commonjs-static","amd","amd-require","umd","umd2","jsonp","system","promise","import","module-import","script","node-commonjs"]},LibraryCustomUmdCommentObject:{type:"object",additionalProperties:!1,properties:{amd:{type:"string"},commonjs:{type:"string"},commonjs2:{type:"string"},root:{type:"string"}}},LibraryCustomUmdObject:{type:"object",additionalProperties:!1,properties:{amd:{type:"string",minLength:1},commonjs:{type:"string",minLength:1},root:{anyOf:[{type:"array",items:{type:"string",minLength:1}},{type:"string",minLength:1}]}}},LibraryExport:{anyOf:[{type:"array",items:{type:"string",minLength:1}},{type:"string",minLength:1}]},LibraryName:{anyOf:[{type:"array",items:{type:"string",minLength:1},minItems:1},{type:"string",minLength:1},{$ref:"#/definitions/LibraryCustomUmdObject"}]},LibraryOptions:{type:"object",additionalProperties:!1,properties:{amdContainer:{$ref:"#/definitions/AmdContainer"},auxiliaryComment:{$ref:"#/definitions/AuxiliaryComment"},export:{$ref:"#/definitions/LibraryExport"},name:{$ref:"#/definitions/LibraryName"},type:{$ref:"#/definitions/LibraryType"},umdNamedDefine:{$ref:"#/definitions/UmdNamedDefine"}},required:["type"]},LibraryType:{anyOf:[{enum:["var","module","assign","assign-properties","this","window","self","global","commonjs","commonjs2","commonjs-module","commonjs-static","amd","amd-require","umd","umd2","jsonp","system"]},{type:"string"}]},Remotes:{anyOf:[{type:"array",items:{anyOf:[{$ref:"#/definitions/RemotesItem"},{$ref:"#/definitions/RemotesObject"}]}},{$ref:"#/definitions/RemotesObject"}]},RemotesConfig:{type:"object",additionalProperties:!1,properties:{external:{anyOf:[{$ref:"#/definitions/RemotesItem"},{$ref:"#/definitions/RemotesItems"}]},shareScope:{type:"string",minLength:1}},required:["external"]},RemotesItem:{type:"string",minLength:1},RemotesItems:{type:"array",items:{$ref:"#/definitions/RemotesItem"}},RemotesObject:{type:"object",additionalProperties:{anyOf:[{$ref:"#/definitions/RemotesConfig"},{$ref:"#/definitions/RemotesItem"},{$ref:"#/definitions/RemotesItems"}]}},Shared:{anyOf:[{type:"array",items:{anyOf:[{$ref:"#/definitions/SharedItem"},{$ref:"#/definitions/SharedObject"}]}},{$ref:"#/definitions/SharedObject"}]},SharedConfig:{type:"object",additionalProperties:!1,properties:{eager:{type:"boolean"},import:{anyOf:[{enum:[!1]},{$ref:"#/definitions/SharedItem"}]},packageName:{type:"string",minLength:1},requiredVersion:{anyOf:[{enum:[!1]},{type:"string"}]},shareKey:{type:"string",minLength:1},shareScope:{type:"string",minLength:1},singleton:{type:"boolean"},strictVersion:{type:"boolean"},version:{anyOf:[{enum:[!1]},{type:"string"}]}}},SharedItem:{type:"string",minLength:1},SharedObject:{type:"object",additionalProperties:{anyOf:[{$ref:"#/definitions/SharedConfig"},{$ref:"#/definitions/SharedItem"}]}},UmdNamedDefine:{type:"boolean"}},type:"object",additionalProperties:!1,properties:{exposes:{$ref:"#/definitions/Exposes"},filename:{type:"string",absolutePath:!1},library:{$ref:"#/definitions/LibraryOptions"},name:{type:"string"},remoteType:{oneOf:[{$ref:"#/definitions/ExternalsType"}]},remotes:{$ref:"#/definitions/Remotes"},runtime:{$ref:"#/definitions/EntryRuntime"},shareScope:{type:"string",minLength:1},shared:{$ref:"#/definitions/Shared"}}},r=Object.prototype.hasOwnProperty;function n(t,{instancePath:e="",parentData:r,parentDataProperty:s,rootData:a=t}={}){if(!Array.isArray(t))return n.errors=[{params:{type:"array"}}],!1;{const e=t.length;for(let r=0;r boolean; +export = check; diff --git a/schemas/plugins/css/CssAutoGeneratorOptions.check.js b/schemas/plugins/css/CssAutoGeneratorOptions.check.js new file mode 100644 index 00000000000..ae49c18bf12 --- /dev/null +++ b/schemas/plugins/css/CssAutoGeneratorOptions.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function e(r,{instancePath:t="",parentData:o,parentDataProperty:n,rootData:a=r}={}){let s=null,l=0;if(0===l){if(!r||"object"!=typeof r||Array.isArray(r))return e.errors=[{params:{type:"object"}}],!1;{const t=l;for(const t in r)if("esModule"!==t&&"exportsConvention"!==t&&"exportsOnly"!==t&&"localIdentName"!==t)return e.errors=[{params:{additionalProperty:t}}],!1;if(t===l){if(void 0!==r.esModule){const t=l;if("boolean"!=typeof r.esModule)return e.errors=[{params:{type:"boolean"}}],!1;var i=t===l}else i=!0;if(i){if(void 0!==r.exportsConvention){let t=r.exportsConvention;const o=l,n=l;let a=!1;const c=l;if("as-is"!==t&&"camel-case"!==t&&"camel-case-only"!==t&&"dashes"!==t&&"dashes-only"!==t){const e={params:{}};null===s?s=[e]:s.push(e),l++}var p=c===l;if(a=a||p,!a){const e=l;if(!(t instanceof Function)){const e={params:{}};null===s?s=[e]:s.push(e),l++}p=e===l,a=a||p}if(!a){const r={params:{}};return null===s?s=[r]:s.push(r),l++,e.errors=s,!1}l=n,null!==s&&(n?s.length=n:s=null),i=o===l}else i=!0;if(i){if(void 0!==r.exportsOnly){const t=l;if("boolean"!=typeof r.exportsOnly)return e.errors=[{params:{type:"boolean"}}],!1;i=t===l}else i=!0;if(i)if(void 0!==r.localIdentName){const t=l;if("string"!=typeof r.localIdentName)return e.errors=[{params:{type:"string"}}],!1;i=t===l}else i=!0}}}}}return e.errors=s,0===l}function r(t,{instancePath:o="",parentData:n,parentDataProperty:a,rootData:s=t}={}){let l=null,i=0;return e(t,{instancePath:o,parentData:n,parentDataProperty:a,rootData:s})||(l=null===l?e.errors:l.concat(e.errors),i=l.length),r.errors=l,0===i}module.exports=r,module.exports.default=r; \ No newline at end of file diff --git a/schemas/plugins/css/CssAutoGeneratorOptions.json b/schemas/plugins/css/CssAutoGeneratorOptions.json new file mode 100644 index 00000000000..99f9a565c31 --- /dev/null +++ b/schemas/plugins/css/CssAutoGeneratorOptions.json @@ -0,0 +1,3 @@ +{ + "$ref": "../../WebpackOptions.json#/definitions/CssAutoGeneratorOptions" +} diff --git a/schemas/plugins/css/CssAutoParserOptions.check.d.ts b/schemas/plugins/css/CssAutoParserOptions.check.d.ts new file mode 100644 index 00000000000..8710226a8f4 --- /dev/null +++ b/schemas/plugins/css/CssAutoParserOptions.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: any) => boolean; +export = check; diff --git a/schemas/plugins/css/CssAutoParserOptions.check.js b/schemas/plugins/css/CssAutoParserOptions.check.js new file mode 100644 index 00000000000..5bd26733766 --- /dev/null +++ b/schemas/plugins/css/CssAutoParserOptions.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function r(t,{instancePath:e="",parentData:o,parentDataProperty:a,rootData:n=t}={}){if(!t||"object"!=typeof t||Array.isArray(t))return r.errors=[{params:{type:"object"}}],!1;{const e=0;for(const e in t)if("import"!==e&&"namedExports"!==e&&"url"!==e)return r.errors=[{params:{additionalProperty:e}}],!1;if(0===e){if(void 0!==t.import){const e=0;if("boolean"!=typeof t.import)return r.errors=[{params:{type:"boolean"}}],!1;var s=0===e}else s=!0;if(s){if(void 0!==t.namedExports){const e=0;if("boolean"!=typeof t.namedExports)return r.errors=[{params:{type:"boolean"}}],!1;s=0===e}else s=!0;if(s)if(void 0!==t.url){const e=0;if("boolean"!=typeof t.url)return r.errors=[{params:{type:"boolean"}}],!1;s=0===e}else s=!0}}}return r.errors=null,!0}function t(e,{instancePath:o="",parentData:a,parentDataProperty:n,rootData:s=e}={}){let p=null,i=0;return r(e,{instancePath:o,parentData:a,parentDataProperty:n,rootData:s})||(p=null===p?r.errors:p.concat(r.errors),i=p.length),t.errors=p,0===i}module.exports=t,module.exports.default=t; \ No newline at end of file diff --git a/schemas/plugins/css/CssAutoParserOptions.json b/schemas/plugins/css/CssAutoParserOptions.json new file mode 100644 index 00000000000..0a406e58ff7 --- /dev/null +++ b/schemas/plugins/css/CssAutoParserOptions.json @@ -0,0 +1,3 @@ +{ + "$ref": "../../WebpackOptions.json#/definitions/CssAutoParserOptions" +} diff --git a/schemas/plugins/css/CssGeneratorOptions.check.d.ts b/schemas/plugins/css/CssGeneratorOptions.check.d.ts new file mode 100644 index 00000000000..8710226a8f4 --- /dev/null +++ b/schemas/plugins/css/CssGeneratorOptions.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: any) => boolean; +export = check; diff --git a/schemas/plugins/css/CssGeneratorOptions.check.js b/schemas/plugins/css/CssGeneratorOptions.check.js new file mode 100644 index 00000000000..10eaae95e1e --- /dev/null +++ b/schemas/plugins/css/CssGeneratorOptions.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function r(e,{instancePath:t="",parentData:o,parentDataProperty:a,rootData:n=e}={}){if(!e||"object"!=typeof e||Array.isArray(e))return r.errors=[{params:{type:"object"}}],!1;{const t=0;for(const t in e)if("esModule"!==t&&"exportsOnly"!==t)return r.errors=[{params:{additionalProperty:t}}],!1;if(0===t){if(void 0!==e.esModule){const t=0;if("boolean"!=typeof e.esModule)return r.errors=[{params:{type:"boolean"}}],!1;var s=0===t}else s=!0;if(s)if(void 0!==e.exportsOnly){const t=0;if("boolean"!=typeof e.exportsOnly)return r.errors=[{params:{type:"boolean"}}],!1;s=0===t}else s=!0}}return r.errors=null,!0}function e(t,{instancePath:o="",parentData:a,parentDataProperty:n,rootData:s=t}={}){let p=null,l=0;return r(t,{instancePath:o,parentData:a,parentDataProperty:n,rootData:s})||(p=null===p?r.errors:p.concat(r.errors),l=p.length),e.errors=p,0===l}module.exports=e,module.exports.default=e; \ No newline at end of file diff --git a/schemas/plugins/css/CssGeneratorOptions.json b/schemas/plugins/css/CssGeneratorOptions.json new file mode 100644 index 00000000000..193ec90f759 --- /dev/null +++ b/schemas/plugins/css/CssGeneratorOptions.json @@ -0,0 +1,3 @@ +{ + "$ref": "../../WebpackOptions.json#/definitions/CssGeneratorOptions" +} diff --git a/schemas/plugins/css/CssGlobalGeneratorOptions.check.d.ts b/schemas/plugins/css/CssGlobalGeneratorOptions.check.d.ts new file mode 100644 index 00000000000..8710226a8f4 --- /dev/null +++ b/schemas/plugins/css/CssGlobalGeneratorOptions.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: any) => boolean; +export = check; diff --git a/schemas/plugins/css/CssGlobalGeneratorOptions.check.js b/schemas/plugins/css/CssGlobalGeneratorOptions.check.js new file mode 100644 index 00000000000..ae49c18bf12 --- /dev/null +++ b/schemas/plugins/css/CssGlobalGeneratorOptions.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function e(r,{instancePath:t="",parentData:o,parentDataProperty:n,rootData:a=r}={}){let s=null,l=0;if(0===l){if(!r||"object"!=typeof r||Array.isArray(r))return e.errors=[{params:{type:"object"}}],!1;{const t=l;for(const t in r)if("esModule"!==t&&"exportsConvention"!==t&&"exportsOnly"!==t&&"localIdentName"!==t)return e.errors=[{params:{additionalProperty:t}}],!1;if(t===l){if(void 0!==r.esModule){const t=l;if("boolean"!=typeof r.esModule)return e.errors=[{params:{type:"boolean"}}],!1;var i=t===l}else i=!0;if(i){if(void 0!==r.exportsConvention){let t=r.exportsConvention;const o=l,n=l;let a=!1;const c=l;if("as-is"!==t&&"camel-case"!==t&&"camel-case-only"!==t&&"dashes"!==t&&"dashes-only"!==t){const e={params:{}};null===s?s=[e]:s.push(e),l++}var p=c===l;if(a=a||p,!a){const e=l;if(!(t instanceof Function)){const e={params:{}};null===s?s=[e]:s.push(e),l++}p=e===l,a=a||p}if(!a){const r={params:{}};return null===s?s=[r]:s.push(r),l++,e.errors=s,!1}l=n,null!==s&&(n?s.length=n:s=null),i=o===l}else i=!0;if(i){if(void 0!==r.exportsOnly){const t=l;if("boolean"!=typeof r.exportsOnly)return e.errors=[{params:{type:"boolean"}}],!1;i=t===l}else i=!0;if(i)if(void 0!==r.localIdentName){const t=l;if("string"!=typeof r.localIdentName)return e.errors=[{params:{type:"string"}}],!1;i=t===l}else i=!0}}}}}return e.errors=s,0===l}function r(t,{instancePath:o="",parentData:n,parentDataProperty:a,rootData:s=t}={}){let l=null,i=0;return e(t,{instancePath:o,parentData:n,parentDataProperty:a,rootData:s})||(l=null===l?e.errors:l.concat(e.errors),i=l.length),r.errors=l,0===i}module.exports=r,module.exports.default=r; \ No newline at end of file diff --git a/schemas/plugins/css/CssGlobalGeneratorOptions.json b/schemas/plugins/css/CssGlobalGeneratorOptions.json new file mode 100644 index 00000000000..a4a1aaf56e8 --- /dev/null +++ b/schemas/plugins/css/CssGlobalGeneratorOptions.json @@ -0,0 +1,3 @@ +{ + "$ref": "../../WebpackOptions.json#/definitions/CssGlobalGeneratorOptions" +} diff --git a/schemas/plugins/css/CssGlobalParserOptions.check.d.ts b/schemas/plugins/css/CssGlobalParserOptions.check.d.ts new file mode 100644 index 00000000000..8710226a8f4 --- /dev/null +++ b/schemas/plugins/css/CssGlobalParserOptions.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: any) => boolean; +export = check; diff --git a/schemas/plugins/css/CssGlobalParserOptions.check.js b/schemas/plugins/css/CssGlobalParserOptions.check.js new file mode 100644 index 00000000000..5bd26733766 --- /dev/null +++ b/schemas/plugins/css/CssGlobalParserOptions.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function r(t,{instancePath:e="",parentData:o,parentDataProperty:a,rootData:n=t}={}){if(!t||"object"!=typeof t||Array.isArray(t))return r.errors=[{params:{type:"object"}}],!1;{const e=0;for(const e in t)if("import"!==e&&"namedExports"!==e&&"url"!==e)return r.errors=[{params:{additionalProperty:e}}],!1;if(0===e){if(void 0!==t.import){const e=0;if("boolean"!=typeof t.import)return r.errors=[{params:{type:"boolean"}}],!1;var s=0===e}else s=!0;if(s){if(void 0!==t.namedExports){const e=0;if("boolean"!=typeof t.namedExports)return r.errors=[{params:{type:"boolean"}}],!1;s=0===e}else s=!0;if(s)if(void 0!==t.url){const e=0;if("boolean"!=typeof t.url)return r.errors=[{params:{type:"boolean"}}],!1;s=0===e}else s=!0}}}return r.errors=null,!0}function t(e,{instancePath:o="",parentData:a,parentDataProperty:n,rootData:s=e}={}){let p=null,i=0;return r(e,{instancePath:o,parentData:a,parentDataProperty:n,rootData:s})||(p=null===p?r.errors:p.concat(r.errors),i=p.length),t.errors=p,0===i}module.exports=t,module.exports.default=t; \ No newline at end of file diff --git a/schemas/plugins/css/CssGlobalParserOptions.json b/schemas/plugins/css/CssGlobalParserOptions.json new file mode 100644 index 00000000000..75f9de6a2e7 --- /dev/null +++ b/schemas/plugins/css/CssGlobalParserOptions.json @@ -0,0 +1,3 @@ +{ + "$ref": "../../WebpackOptions.json#/definitions/CssGlobalParserOptions" +} diff --git a/schemas/plugins/css/CssModuleGeneratorOptions.check.d.ts b/schemas/plugins/css/CssModuleGeneratorOptions.check.d.ts new file mode 100644 index 00000000000..8710226a8f4 --- /dev/null +++ b/schemas/plugins/css/CssModuleGeneratorOptions.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: any) => boolean; +export = check; diff --git a/schemas/plugins/css/CssModuleGeneratorOptions.check.js b/schemas/plugins/css/CssModuleGeneratorOptions.check.js new file mode 100644 index 00000000000..ae49c18bf12 --- /dev/null +++ b/schemas/plugins/css/CssModuleGeneratorOptions.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function e(r,{instancePath:t="",parentData:o,parentDataProperty:n,rootData:a=r}={}){let s=null,l=0;if(0===l){if(!r||"object"!=typeof r||Array.isArray(r))return e.errors=[{params:{type:"object"}}],!1;{const t=l;for(const t in r)if("esModule"!==t&&"exportsConvention"!==t&&"exportsOnly"!==t&&"localIdentName"!==t)return e.errors=[{params:{additionalProperty:t}}],!1;if(t===l){if(void 0!==r.esModule){const t=l;if("boolean"!=typeof r.esModule)return e.errors=[{params:{type:"boolean"}}],!1;var i=t===l}else i=!0;if(i){if(void 0!==r.exportsConvention){let t=r.exportsConvention;const o=l,n=l;let a=!1;const c=l;if("as-is"!==t&&"camel-case"!==t&&"camel-case-only"!==t&&"dashes"!==t&&"dashes-only"!==t){const e={params:{}};null===s?s=[e]:s.push(e),l++}var p=c===l;if(a=a||p,!a){const e=l;if(!(t instanceof Function)){const e={params:{}};null===s?s=[e]:s.push(e),l++}p=e===l,a=a||p}if(!a){const r={params:{}};return null===s?s=[r]:s.push(r),l++,e.errors=s,!1}l=n,null!==s&&(n?s.length=n:s=null),i=o===l}else i=!0;if(i){if(void 0!==r.exportsOnly){const t=l;if("boolean"!=typeof r.exportsOnly)return e.errors=[{params:{type:"boolean"}}],!1;i=t===l}else i=!0;if(i)if(void 0!==r.localIdentName){const t=l;if("string"!=typeof r.localIdentName)return e.errors=[{params:{type:"string"}}],!1;i=t===l}else i=!0}}}}}return e.errors=s,0===l}function r(t,{instancePath:o="",parentData:n,parentDataProperty:a,rootData:s=t}={}){let l=null,i=0;return e(t,{instancePath:o,parentData:n,parentDataProperty:a,rootData:s})||(l=null===l?e.errors:l.concat(e.errors),i=l.length),r.errors=l,0===i}module.exports=r,module.exports.default=r; \ No newline at end of file diff --git a/schemas/plugins/css/CssModuleGeneratorOptions.json b/schemas/plugins/css/CssModuleGeneratorOptions.json new file mode 100644 index 00000000000..5c95fb5541c --- /dev/null +++ b/schemas/plugins/css/CssModuleGeneratorOptions.json @@ -0,0 +1,3 @@ +{ + "$ref": "../../WebpackOptions.json#/definitions/CssModuleGeneratorOptions" +} diff --git a/schemas/plugins/css/CssModuleParserOptions.check.d.ts b/schemas/plugins/css/CssModuleParserOptions.check.d.ts new file mode 100644 index 00000000000..8710226a8f4 --- /dev/null +++ b/schemas/plugins/css/CssModuleParserOptions.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: any) => boolean; +export = check; diff --git a/schemas/plugins/css/CssModuleParserOptions.check.js b/schemas/plugins/css/CssModuleParserOptions.check.js new file mode 100644 index 00000000000..5bd26733766 --- /dev/null +++ b/schemas/plugins/css/CssModuleParserOptions.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function r(t,{instancePath:e="",parentData:o,parentDataProperty:a,rootData:n=t}={}){if(!t||"object"!=typeof t||Array.isArray(t))return r.errors=[{params:{type:"object"}}],!1;{const e=0;for(const e in t)if("import"!==e&&"namedExports"!==e&&"url"!==e)return r.errors=[{params:{additionalProperty:e}}],!1;if(0===e){if(void 0!==t.import){const e=0;if("boolean"!=typeof t.import)return r.errors=[{params:{type:"boolean"}}],!1;var s=0===e}else s=!0;if(s){if(void 0!==t.namedExports){const e=0;if("boolean"!=typeof t.namedExports)return r.errors=[{params:{type:"boolean"}}],!1;s=0===e}else s=!0;if(s)if(void 0!==t.url){const e=0;if("boolean"!=typeof t.url)return r.errors=[{params:{type:"boolean"}}],!1;s=0===e}else s=!0}}}return r.errors=null,!0}function t(e,{instancePath:o="",parentData:a,parentDataProperty:n,rootData:s=e}={}){let p=null,i=0;return r(e,{instancePath:o,parentData:a,parentDataProperty:n,rootData:s})||(p=null===p?r.errors:p.concat(r.errors),i=p.length),t.errors=p,0===i}module.exports=t,module.exports.default=t; \ No newline at end of file diff --git a/schemas/plugins/css/CssModuleParserOptions.json b/schemas/plugins/css/CssModuleParserOptions.json new file mode 100644 index 00000000000..97168a04bed --- /dev/null +++ b/schemas/plugins/css/CssModuleParserOptions.json @@ -0,0 +1,3 @@ +{ + "$ref": "../../WebpackOptions.json#/definitions/CssModuleParserOptions" +} diff --git a/schemas/plugins/css/CssParserOptions.check.d.ts b/schemas/plugins/css/CssParserOptions.check.d.ts new file mode 100644 index 00000000000..8710226a8f4 --- /dev/null +++ b/schemas/plugins/css/CssParserOptions.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: any) => boolean; +export = check; diff --git a/schemas/plugins/css/CssParserOptions.check.js b/schemas/plugins/css/CssParserOptions.check.js new file mode 100644 index 00000000000..5bd26733766 --- /dev/null +++ b/schemas/plugins/css/CssParserOptions.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function r(t,{instancePath:e="",parentData:o,parentDataProperty:a,rootData:n=t}={}){if(!t||"object"!=typeof t||Array.isArray(t))return r.errors=[{params:{type:"object"}}],!1;{const e=0;for(const e in t)if("import"!==e&&"namedExports"!==e&&"url"!==e)return r.errors=[{params:{additionalProperty:e}}],!1;if(0===e){if(void 0!==t.import){const e=0;if("boolean"!=typeof t.import)return r.errors=[{params:{type:"boolean"}}],!1;var s=0===e}else s=!0;if(s){if(void 0!==t.namedExports){const e=0;if("boolean"!=typeof t.namedExports)return r.errors=[{params:{type:"boolean"}}],!1;s=0===e}else s=!0;if(s)if(void 0!==t.url){const e=0;if("boolean"!=typeof t.url)return r.errors=[{params:{type:"boolean"}}],!1;s=0===e}else s=!0}}}return r.errors=null,!0}function t(e,{instancePath:o="",parentData:a,parentDataProperty:n,rootData:s=e}={}){let p=null,i=0;return r(e,{instancePath:o,parentData:a,parentDataProperty:n,rootData:s})||(p=null===p?r.errors:p.concat(r.errors),i=p.length),t.errors=p,0===i}module.exports=t,module.exports.default=t; \ No newline at end of file diff --git a/schemas/plugins/css/CssParserOptions.json b/schemas/plugins/css/CssParserOptions.json new file mode 100644 index 00000000000..dc79f62c430 --- /dev/null +++ b/schemas/plugins/css/CssParserOptions.json @@ -0,0 +1,3 @@ +{ + "$ref": "../../WebpackOptions.json#/definitions/CssParserOptions" +} diff --git a/schemas/plugins/debug/ProfilingPlugin.check.d.ts b/schemas/plugins/debug/ProfilingPlugin.check.d.ts new file mode 100644 index 00000000000..51351d52caa --- /dev/null +++ b/schemas/plugins/debug/ProfilingPlugin.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: import("../../../declarations/plugins/debug/ProfilingPlugin").ProfilingPluginOptions) => boolean; +export = check; diff --git a/schemas/plugins/debug/ProfilingPlugin.check.js b/schemas/plugins/debug/ProfilingPlugin.check.js new file mode 100644 index 00000000000..b47ef763c2e --- /dev/null +++ b/schemas/plugins/debug/ProfilingPlugin.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +const r=/^(?:[A-Za-z]:[\\/]|\\\\|\/)/;function t(e,{instancePath:a="",parentData:o,parentDataProperty:n,rootData:s=e}={}){if(!e||"object"!=typeof e||Array.isArray(e))return t.errors=[{params:{type:"object"}}],!1;{const a=0;for(const r in e)if("outputPath"!==r)return t.errors=[{params:{additionalProperty:r}}],!1;if(0===a&&void 0!==e.outputPath){let a=e.outputPath;if("string"!=typeof a)return t.errors=[{params:{type:"string"}}],!1;if(a.includes("!")||!0!==r.test(a))return t.errors=[{params:{}}],!1}}return t.errors=null,!0}module.exports=t,module.exports.default=t; \ No newline at end of file diff --git a/schemas/plugins/debug/ProfilingPlugin.json b/schemas/plugins/debug/ProfilingPlugin.json index e9a4bf18bef..4de19e564d6 100644 --- a/schemas/plugins/debug/ProfilingPlugin.json +++ b/schemas/plugins/debug/ProfilingPlugin.json @@ -4,10 +4,9 @@ "additionalProperties": false, "properties": { "outputPath": { - "description": "Path to the output file e.g. `profiling/events.json`. Defaults to `events.json`.", + "description": "Path to the output file e.g. `path.resolve(__dirname, 'profiling/events.json')`. Defaults to `events.json`.", "type": "string", - "absolutePath": false, - "minLength": 4 + "absolutePath": true } } } diff --git a/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.d.ts b/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.d.ts new file mode 100644 index 00000000000..9d5939dd3e0 --- /dev/null +++ b/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: import("../../../declarations/plugins/ids/OccurrenceChunkIdsPlugin").OccurrenceChunkIdsPluginOptions) => boolean; +export = check; diff --git a/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.js b/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.js new file mode 100644 index 00000000000..c5becb02b7e --- /dev/null +++ b/schemas/plugins/ids/OccurrenceChunkIdsPlugin.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function r(t,{instancePath:e="",parentData:o,parentDataProperty:a,rootData:i=t}={}){if(!t||"object"!=typeof t||Array.isArray(t))return r.errors=[{params:{type:"object"}}],!1;{const e=0;for(const e in t)if("prioritiseInitial"!==e)return r.errors=[{params:{additionalProperty:e}}],!1;if(0===e&&void 0!==t.prioritiseInitial&&"boolean"!=typeof t.prioritiseInitial)return r.errors=[{params:{type:"boolean"}}],!1}return r.errors=null,!0}module.exports=r,module.exports.default=r; \ No newline at end of file diff --git a/schemas/plugins/ids/OccurrenceChunkIdsPlugin.json b/schemas/plugins/ids/OccurrenceChunkIdsPlugin.json new file mode 100644 index 00000000000..d1bb7342fdc --- /dev/null +++ b/schemas/plugins/ids/OccurrenceChunkIdsPlugin.json @@ -0,0 +1,11 @@ +{ + "title": "OccurrenceChunkIdsPluginOptions", + "type": "object", + "additionalProperties": false, + "properties": { + "prioritiseInitial": { + "description": "Prioritise initial size over total size.", + "type": "boolean" + } + } +} diff --git a/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.d.ts b/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.d.ts new file mode 100644 index 00000000000..7beeb0f7d71 --- /dev/null +++ b/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: import("../../../declarations/plugins/ids/OccurrenceModuleIdsPlugin").OccurrenceModuleIdsPluginOptions) => boolean; +export = check; diff --git a/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.js b/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.js new file mode 100644 index 00000000000..c5becb02b7e --- /dev/null +++ b/schemas/plugins/ids/OccurrenceModuleIdsPlugin.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function r(t,{instancePath:e="",parentData:o,parentDataProperty:a,rootData:i=t}={}){if(!t||"object"!=typeof t||Array.isArray(t))return r.errors=[{params:{type:"object"}}],!1;{const e=0;for(const e in t)if("prioritiseInitial"!==e)return r.errors=[{params:{additionalProperty:e}}],!1;if(0===e&&void 0!==t.prioritiseInitial&&"boolean"!=typeof t.prioritiseInitial)return r.errors=[{params:{type:"boolean"}}],!1}return r.errors=null,!0}module.exports=r,module.exports.default=r; \ No newline at end of file diff --git a/schemas/plugins/ids/OccurrenceModuleIdsPlugin.json b/schemas/plugins/ids/OccurrenceModuleIdsPlugin.json new file mode 100644 index 00000000000..7feec0c889d --- /dev/null +++ b/schemas/plugins/ids/OccurrenceModuleIdsPlugin.json @@ -0,0 +1,11 @@ +{ + "title": "OccurrenceModuleIdsPluginOptions", + "type": "object", + "additionalProperties": false, + "properties": { + "prioritiseInitial": { + "description": "Prioritise initial size over total size.", + "type": "boolean" + } + } +} diff --git a/schemas/plugins/json/JsonModulesPluginGenerator.check.d.ts b/schemas/plugins/json/JsonModulesPluginGenerator.check.d.ts new file mode 100644 index 00000000000..8710226a8f4 --- /dev/null +++ b/schemas/plugins/json/JsonModulesPluginGenerator.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: any) => boolean; +export = check; diff --git a/schemas/plugins/json/JsonModulesPluginGenerator.check.js b/schemas/plugins/json/JsonModulesPluginGenerator.check.js new file mode 100644 index 00000000000..0c06842b3dc --- /dev/null +++ b/schemas/plugins/json/JsonModulesPluginGenerator.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function r(e,{instancePath:t="",parentData:a,parentDataProperty:o,rootData:s=e}={}){if(!e||"object"!=typeof e||Array.isArray(e))return r.errors=[{params:{type:"object"}}],!1;{const t=0;for(const t in e)if("JSONParse"!==t)return r.errors=[{params:{additionalProperty:t}}],!1;if(0===t&&void 0!==e.JSONParse&&"boolean"!=typeof e.JSONParse)return r.errors=[{params:{type:"boolean"}}],!1}return r.errors=null,!0}module.exports=r,module.exports.default=r; \ No newline at end of file diff --git a/schemas/plugins/json/JsonModulesPluginGenerator.json b/schemas/plugins/json/JsonModulesPluginGenerator.json new file mode 100644 index 00000000000..0b1a8f7f334 --- /dev/null +++ b/schemas/plugins/json/JsonModulesPluginGenerator.json @@ -0,0 +1,3 @@ +{ + "$ref": "../../WebpackOptions.json#/definitions/JsonGeneratorOptions" +} diff --git a/schemas/plugins/json/JsonModulesPluginParser.check.d.ts b/schemas/plugins/json/JsonModulesPluginParser.check.d.ts new file mode 100644 index 00000000000..8710226a8f4 --- /dev/null +++ b/schemas/plugins/json/JsonModulesPluginParser.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: any) => boolean; +export = check; diff --git a/schemas/plugins/json/JsonModulesPluginParser.check.js b/schemas/plugins/json/JsonModulesPluginParser.check.js new file mode 100644 index 00000000000..1b238303e67 --- /dev/null +++ b/schemas/plugins/json/JsonModulesPluginParser.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function r(e,{instancePath:t="",parentData:o,parentDataProperty:a,rootData:s=e}={}){if(!e||"object"!=typeof e||Array.isArray(e))return r.errors=[{params:{type:"object"}}],!1;{const t=0;for(const t in e)if("exportsDepth"!==t&&"parse"!==t)return r.errors=[{params:{additionalProperty:t}}],!1;if(0===t){if(void 0!==e.exportsDepth){const t=0;if("number"!=typeof e.exportsDepth)return r.errors=[{params:{type:"number"}}],!1;var n=0===t}else n=!0;if(n)if(void 0!==e.parse){const t=0;if(!(e.parse instanceof Function))return r.errors=[{params:{}}],!1;n=0===t}else n=!0}}return r.errors=null,!0}module.exports=r,module.exports.default=r; \ No newline at end of file diff --git a/schemas/plugins/json/JsonModulesPluginParser.json b/schemas/plugins/json/JsonModulesPluginParser.json new file mode 100644 index 00000000000..3a6f9a57f21 --- /dev/null +++ b/schemas/plugins/json/JsonModulesPluginParser.json @@ -0,0 +1,3 @@ +{ + "$ref": "../../WebpackOptions.json#/definitions/JsonParserOptions" +} diff --git a/schemas/plugins/optimize/AggressiveSplittingPlugin.check.d.ts b/schemas/plugins/optimize/AggressiveSplittingPlugin.check.d.ts new file mode 100644 index 00000000000..a03c23af86e --- /dev/null +++ b/schemas/plugins/optimize/AggressiveSplittingPlugin.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: import("../../../declarations/plugins/optimize/AggressiveSplittingPlugin").AggressiveSplittingPluginOptions) => boolean; +export = check; diff --git a/schemas/plugins/optimize/AggressiveSplittingPlugin.check.js b/schemas/plugins/optimize/AggressiveSplittingPlugin.check.js new file mode 100644 index 00000000000..d74a1527670 --- /dev/null +++ b/schemas/plugins/optimize/AggressiveSplittingPlugin.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function r(e,{instancePath:t="",parentData:n,parentDataProperty:i,rootData:o=e}={}){if(!e||"object"!=typeof e||Array.isArray(e))return r.errors=[{params:{type:"object"}}],!1;{const t=0;for(const t in e)if("chunkOverhead"!==t&&"entryChunkMultiplicator"!==t&&"maxSize"!==t&&"minSize"!==t)return r.errors=[{params:{additionalProperty:t}}],!1;if(0===t){if(void 0!==e.chunkOverhead){const t=0;if("number"!=typeof e.chunkOverhead)return r.errors=[{params:{type:"number"}}],!1;var a=0===t}else a=!0;if(a){if(void 0!==e.entryChunkMultiplicator){const t=0;if("number"!=typeof e.entryChunkMultiplicator)return r.errors=[{params:{type:"number"}}],!1;a=0===t}else a=!0;if(a){if(void 0!==e.maxSize){const t=0;if("number"!=typeof e.maxSize)return r.errors=[{params:{type:"number"}}],!1;a=0===t}else a=!0;if(a)if(void 0!==e.minSize){const t=0;if("number"!=typeof e.minSize)return r.errors=[{params:{type:"number"}}],!1;a=0===t}else a=!0}}}}return r.errors=null,!0}module.exports=r,module.exports.default=r; \ No newline at end of file diff --git a/schemas/plugins/optimize/AggressiveSplittingPlugin.json b/schemas/plugins/optimize/AggressiveSplittingPlugin.json index 19bcdfd5680..8abcdd8ad5f 100644 --- a/schemas/plugins/optimize/AggressiveSplittingPlugin.json +++ b/schemas/plugins/optimize/AggressiveSplittingPlugin.json @@ -4,19 +4,19 @@ "additionalProperties": false, "properties": { "chunkOverhead": { - "description": "Default: 0", + "description": "Extra cost for each chunk (Default: 9.8kiB).", "type": "number" }, "entryChunkMultiplicator": { - "description": "Default: 1", + "description": "Extra cost multiplicator for entry chunks (Default: 10).", "type": "number" }, "maxSize": { - "description": "Byte, maxsize of per file. Default: 51200", + "description": "Byte, max size of per file (Default: 50kiB).", "type": "number" }, "minSize": { - "description": "Byte, split point. Default: 30720", + "description": "Byte, split point. (Default: 30kiB).", "type": "number" } } diff --git a/schemas/plugins/optimize/LimitChunkCountPlugin.check.d.ts b/schemas/plugins/optimize/LimitChunkCountPlugin.check.d.ts new file mode 100644 index 00000000000..1a133d633b5 --- /dev/null +++ b/schemas/plugins/optimize/LimitChunkCountPlugin.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: import("../../../declarations/plugins/optimize/LimitChunkCountPlugin").LimitChunkCountPluginOptions) => boolean; +export = check; diff --git a/schemas/plugins/optimize/LimitChunkCountPlugin.check.js b/schemas/plugins/optimize/LimitChunkCountPlugin.check.js new file mode 100644 index 00000000000..967ed872f88 --- /dev/null +++ b/schemas/plugins/optimize/LimitChunkCountPlugin.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function r(e,{instancePath:t="",parentData:n,parentDataProperty:a,rootData:o=e}={}){if(!e||"object"!=typeof e||Array.isArray(e))return r.errors=[{params:{type:"object"}}],!1;{let t;if(void 0===e.maxChunks&&(t="maxChunks"))return r.errors=[{params:{missingProperty:t}}],!1;{const t=0;for(const t in e)if("chunkOverhead"!==t&&"entryChunkMultiplicator"!==t&&"maxChunks"!==t)return r.errors=[{params:{additionalProperty:t}}],!1;if(0===t){if(void 0!==e.chunkOverhead){const t=0;if("number"!=typeof e.chunkOverhead)return r.errors=[{params:{type:"number"}}],!1;var s=0===t}else s=!0;if(s){if(void 0!==e.entryChunkMultiplicator){const t=0;if("number"!=typeof e.entryChunkMultiplicator)return r.errors=[{params:{type:"number"}}],!1;s=0===t}else s=!0;if(s)if(void 0!==e.maxChunks){let t=e.maxChunks;const n=0;if(0===n){if("number"!=typeof t)return r.errors=[{params:{type:"number"}}],!1;if(t<1||isNaN(t))return r.errors=[{params:{comparison:">=",limit:1}}],!1}s=0===n}else s=!0}}}}return r.errors=null,!0}module.exports=r,module.exports.default=r; \ No newline at end of file diff --git a/schemas/plugins/optimize/LimitChunkCountPlugin.json b/schemas/plugins/optimize/LimitChunkCountPlugin.json index b2636eefd41..3bbd39188f4 100644 --- a/schemas/plugins/optimize/LimitChunkCountPlugin.json +++ b/schemas/plugins/optimize/LimitChunkCountPlugin.json @@ -3,14 +3,19 @@ "type": "object", "additionalProperties": false, "properties": { + "chunkOverhead": { + "description": "Constant overhead for a chunk.", + "type": "number" + }, + "entryChunkMultiplicator": { + "description": "Multiplicator for initial chunks.", + "type": "number" + }, "maxChunks": { - "description": "Limit the maximum number of chunks using a value greater greater than or equal to 1", + "description": "Limit the maximum number of chunks using a value greater greater than or equal to 1.", "type": "number", "minimum": 1 - }, - "minChunkSize": { - "description": "Set a minimum chunk size", - "type": "number" } - } + }, + "required": ["maxChunks"] } diff --git a/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.d.ts b/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.d.ts new file mode 100644 index 00000000000..8003689a467 --- /dev/null +++ b/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: import("../../../declarations/plugins/optimize/MergeDuplicateChunksPlugin").MergeDuplicateChunksPluginOptions) => boolean; +export = check; diff --git a/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.js b/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.js new file mode 100644 index 00000000000..182b09ebe89 --- /dev/null +++ b/schemas/plugins/optimize/MergeDuplicateChunksPlugin.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function r(t,{instancePath:e="",parentData:a,parentDataProperty:o,rootData:s=t}={}){if(!t||"object"!=typeof t||Array.isArray(t))return r.errors=[{params:{type:"object"}}],!1;{const e=0;for(const e in t)if("stage"!==e)return r.errors=[{params:{additionalProperty:e}}],!1;if(0===e&&void 0!==t.stage&&"number"!=typeof t.stage)return r.errors=[{params:{type:"number"}}],!1}return r.errors=null,!0}module.exports=r,module.exports.default=r; \ No newline at end of file diff --git a/schemas/plugins/optimize/MergeDuplicateChunksPlugin.json b/schemas/plugins/optimize/MergeDuplicateChunksPlugin.json new file mode 100644 index 00000000000..12f591a2cb2 --- /dev/null +++ b/schemas/plugins/optimize/MergeDuplicateChunksPlugin.json @@ -0,0 +1,11 @@ +{ + "title": "MergeDuplicateChunksPluginOptions", + "type": "object", + "additionalProperties": false, + "properties": { + "stage": { + "description": "Specifies the stage for merging duplicate chunks.", + "type": "number" + } + } +} diff --git a/schemas/plugins/optimize/MinChunkSizePlugin.check.d.ts b/schemas/plugins/optimize/MinChunkSizePlugin.check.d.ts new file mode 100644 index 00000000000..2da0f6e3531 --- /dev/null +++ b/schemas/plugins/optimize/MinChunkSizePlugin.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: import("../../../declarations/plugins/optimize/MinChunkSizePlugin").MinChunkSizePluginOptions) => boolean; +export = check; diff --git a/schemas/plugins/optimize/MinChunkSizePlugin.check.js b/schemas/plugins/optimize/MinChunkSizePlugin.check.js new file mode 100644 index 00000000000..8eb8dc9fccc --- /dev/null +++ b/schemas/plugins/optimize/MinChunkSizePlugin.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function r(e,{instancePath:t="",parentData:n,parentDataProperty:i,rootData:o=e}={}){if(!e||"object"!=typeof e||Array.isArray(e))return r.errors=[{params:{type:"object"}}],!1;{let t;if(void 0===e.minChunkSize&&(t="minChunkSize"))return r.errors=[{params:{missingProperty:t}}],!1;{const t=0;for(const t in e)if("chunkOverhead"!==t&&"entryChunkMultiplicator"!==t&&"minChunkSize"!==t)return r.errors=[{params:{additionalProperty:t}}],!1;if(0===t){if(void 0!==e.chunkOverhead){const t=0;if("number"!=typeof e.chunkOverhead)return r.errors=[{params:{type:"number"}}],!1;var a=0===t}else a=!0;if(a){if(void 0!==e.entryChunkMultiplicator){const t=0;if("number"!=typeof e.entryChunkMultiplicator)return r.errors=[{params:{type:"number"}}],!1;a=0===t}else a=!0;if(a)if(void 0!==e.minChunkSize){const t=0;if("number"!=typeof e.minChunkSize)return r.errors=[{params:{type:"number"}}],!1;a=0===t}else a=!0}}}}return r.errors=null,!0}module.exports=r,module.exports.default=r; \ No newline at end of file diff --git a/schemas/plugins/optimize/MinChunkSizePlugin.json b/schemas/plugins/optimize/MinChunkSizePlugin.json index 03e17d65e37..ba02156a065 100644 --- a/schemas/plugins/optimize/MinChunkSizePlugin.json +++ b/schemas/plugins/optimize/MinChunkSizePlugin.json @@ -3,8 +3,16 @@ "type": "object", "additionalProperties": false, "properties": { + "chunkOverhead": { + "description": "Constant overhead for a chunk.", + "type": "number" + }, + "entryChunkMultiplicator": { + "description": "Multiplicator for initial chunks.", + "type": "number" + }, "minChunkSize": { - "description": "Minimum number of characters", + "description": "Minimum number of characters.", "type": "number" } }, diff --git a/schemas/plugins/optimize/OccurrenceOrderChunkIdsPlugin.json b/schemas/plugins/optimize/OccurrenceOrderChunkIdsPlugin.json deleted file mode 100644 index 12facf2f67d..00000000000 --- a/schemas/plugins/optimize/OccurrenceOrderChunkIdsPlugin.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "title": "OccurrenceOrderChunkIdsPluginOptions", - "type": "object", - "additionalProperties": false, - "properties": { - "prioritiseInitial": { - "description": "Prioritise initial size over total size", - "type": "boolean" - } - } -} diff --git a/schemas/plugins/optimize/OccurrenceOrderModuleIdsPlugin.json b/schemas/plugins/optimize/OccurrenceOrderModuleIdsPlugin.json deleted file mode 100644 index d76ac14df6a..00000000000 --- a/schemas/plugins/optimize/OccurrenceOrderModuleIdsPlugin.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "title": "OccurrenceOrderModuleIdsPluginOptions", - "type": "object", - "additionalProperties": false, - "properties": { - "prioritiseInitial": { - "description": "Prioritise initial size over total size", - "type": "boolean" - } - } -} diff --git a/schemas/plugins/schemes/HttpUriPlugin.check.d.ts b/schemas/plugins/schemes/HttpUriPlugin.check.d.ts new file mode 100644 index 00000000000..f47f4b01f36 --- /dev/null +++ b/schemas/plugins/schemes/HttpUriPlugin.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: import("../../../declarations/plugins/schemes/HttpUriPlugin").HttpUriPluginOptions) => boolean; +export = check; diff --git a/schemas/plugins/schemes/HttpUriPlugin.check.js b/schemas/plugins/schemes/HttpUriPlugin.check.js new file mode 100644 index 00000000000..e4560adb896 --- /dev/null +++ b/schemas/plugins/schemes/HttpUriPlugin.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +const r=/^(?:[A-Za-z]:[\\/]|\\\\|\/)/;module.exports=n,module.exports.default=n;const t=new RegExp("^https?://","u");function e(n,{instancePath:o="",parentData:s,parentDataProperty:a,rootData:l=n}={}){let i=null,p=0;if(0===p){if(!n||"object"!=typeof n||Array.isArray(n))return e.errors=[{params:{type:"object"}}],!1;{let o;if(void 0===n.allowedUris&&(o="allowedUris"))return e.errors=[{params:{missingProperty:o}}],!1;{const o=p;for(const r in n)if("allowedUris"!==r&&"cacheLocation"!==r&&"frozen"!==r&&"lockfileLocation"!==r&&"proxy"!==r&&"upgrade"!==r)return e.errors=[{params:{additionalProperty:r}}],!1;if(o===p){if(void 0!==n.allowedUris){let r=n.allowedUris;const o=p;if(p==p){if(!Array.isArray(r))return e.errors=[{params:{type:"array"}}],!1;{const n=r.length;for(let o=0;o boolean)" + } + ] + } + } + }, + "title": "HttpUriPluginOptions", + "oneOf": [ + { + "$ref": "#/definitions/HttpUriOptions" + } + ] +} diff --git a/schemas/plugins/sharing/ConsumeSharedPlugin.check.d.ts b/schemas/plugins/sharing/ConsumeSharedPlugin.check.d.ts new file mode 100644 index 00000000000..a24ecdfb61d --- /dev/null +++ b/schemas/plugins/sharing/ConsumeSharedPlugin.check.d.ts @@ -0,0 +1,7 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +declare const check: (options: import("../../../declarations/plugins/sharing/ConsumeSharedPlugin").ConsumeSharedPluginOptions) => boolean; +export = check; diff --git a/schemas/plugins/sharing/ConsumeSharedPlugin.check.js b/schemas/plugins/sharing/ConsumeSharedPlugin.check.js new file mode 100644 index 00000000000..19b0e7da002 --- /dev/null +++ b/schemas/plugins/sharing/ConsumeSharedPlugin.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function r(e,{instancePath:t="",parentData:n,parentDataProperty:s,rootData:a=e}={}){let o=null,i=0;if(0===i){if(!e||"object"!=typeof e||Array.isArray(e))return r.errors=[{params:{type:"object"}}],!1;{const t=i;for(const t in e)if("eager"!==t&&"import"!==t&&"packageName"!==t&&"requiredVersion"!==t&&"shareKey"!==t&&"shareScope"!==t&&"singleton"!==t&&"strictVersion"!==t)return r.errors=[{params:{additionalProperty:t}}],!1;if(t===i){if(void 0!==e.eager){const t=i;if("boolean"!=typeof e.eager)return r.errors=[{params:{type:"boolean"}}],!1;var l=t===i}else l=!0;if(l){if(void 0!==e.import){let t=e.import;const n=i,s=i;let a=!1;const f=i;if(!1!==t){const r={params:{}};null===o?o=[r]:o.push(r),i++}var p=f===i;if(a=a||p,!a){const r=i;if(i==i)if("string"==typeof t){if(t.length<1){const r={params:{}};null===o?o=[r]:o.push(r),i++}}else{const r={params:{type:"string"}};null===o?o=[r]:o.push(r),i++}p=r===i,a=a||p}if(!a){const e={params:{}};return null===o?o=[e]:o.push(e),i++,r.errors=o,!1}i=s,null!==o&&(s?o.length=s:o=null),l=n===i}else l=!0;if(l){if(void 0!==e.packageName){let t=e.packageName;const n=i;if(i===n){if("string"!=typeof t)return r.errors=[{params:{type:"string"}}],!1;if(t.length<1)return r.errors=[{params:{}}],!1}l=n===i}else l=!0;if(l){if(void 0!==e.requiredVersion){let t=e.requiredVersion;const n=i,s=i;let a=!1;const p=i;if(!1!==t){const r={params:{}};null===o?o=[r]:o.push(r),i++}var f=p===i;if(a=a||f,!a){const r=i;if("string"!=typeof t){const r={params:{type:"string"}};null===o?o=[r]:o.push(r),i++}f=r===i,a=a||f}if(!a){const e={params:{}};return null===o?o=[e]:o.push(e),i++,r.errors=o,!1}i=s,null!==o&&(s?o.length=s:o=null),l=n===i}else l=!0;if(l){if(void 0!==e.shareKey){let t=e.shareKey;const n=i;if(i===n){if("string"!=typeof t)return r.errors=[{params:{type:"string"}}],!1;if(t.length<1)return r.errors=[{params:{}}],!1}l=n===i}else l=!0;if(l){if(void 0!==e.shareScope){let t=e.shareScope;const n=i;if(i===n){if("string"!=typeof t)return r.errors=[{params:{type:"string"}}],!1;if(t.length<1)return r.errors=[{params:{}}],!1}l=n===i}else l=!0;if(l){if(void 0!==e.singleton){const t=i;if("boolean"!=typeof e.singleton)return r.errors=[{params:{type:"boolean"}}],!1;l=t===i}else l=!0;if(l)if(void 0!==e.strictVersion){const t=i;if("boolean"!=typeof e.strictVersion)return r.errors=[{params:{type:"boolean"}}],!1;l=t===i}else l=!0}}}}}}}}}return r.errors=o,0===i}function e(t,{instancePath:n="",parentData:s,parentDataProperty:a,rootData:o=t}={}){let i=null,l=0;if(0===l){if(!t||"object"!=typeof t||Array.isArray(t))return e.errors=[{params:{type:"object"}}],!1;for(const s in t){let a=t[s];const f=l,c=l;let u=!1;const y=l;r(a,{instancePath:n+"/"+s.replace(/~/g,"~0").replace(/\//g,"~1"),parentData:t,parentDataProperty:s,rootData:o})||(i=null===i?r.errors:i.concat(r.errors),l=i.length);var p=y===l;if(u=u||p,!u){const r=l;if(l==l)if("string"==typeof a){if(a.length<1){const r={params:{}};null===i?i=[r]:i.push(r),l++}}else{const r={params:{type:"string"}};null===i?i=[r]:i.push(r),l++}p=r===l,u=u||p}if(!u){const r={params:{}};return null===i?i=[r]:i.push(r),l++,e.errors=i,!1}if(l=c,null!==i&&(c?i.length=c:i=null),f!==l)break}}return e.errors=i,0===l}function t(r,{instancePath:n="",parentData:s,parentDataProperty:a,rootData:o=r}={}){let i=null,l=0;const p=l;let f=!1;const c=l;if(l===c)if(Array.isArray(r)){const t=r.length;for(let s=0;s boolean; +export = check; diff --git a/schemas/plugins/sharing/ProvideSharedPlugin.check.js b/schemas/plugins/sharing/ProvideSharedPlugin.check.js new file mode 100644 index 00000000000..2a6c5200091 --- /dev/null +++ b/schemas/plugins/sharing/ProvideSharedPlugin.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";function r(t,{instancePath:e="",parentData:s,parentDataProperty:n,rootData:a=t}={}){let o=null,l=0;if(0===l){if(!t||"object"!=typeof t||Array.isArray(t))return r.errors=[{params:{type:"object"}}],!1;for(const e in t){let s=t[e];const n=l,a=l;let f=!1;const u=l;if(l==l)if(s&&"object"==typeof s&&!Array.isArray(s)){const r=l;for(const r in s)if("eager"!==r&&"shareKey"!==r&&"shareScope"!==r&&"version"!==r){const t={params:{additionalProperty:r}};null===o?o=[t]:o.push(t),l++;break}if(r===l){if(void 0!==s.eager){const r=l;if("boolean"!=typeof s.eager){const r={params:{type:"boolean"}};null===o?o=[r]:o.push(r),l++}var i=r===l}else i=!0;if(i){if(void 0!==s.shareKey){let r=s.shareKey;const t=l;if(l===t)if("string"==typeof r){if(r.length<1){const r={params:{}};null===o?o=[r]:o.push(r),l++}}else{const r={params:{type:"string"}};null===o?o=[r]:o.push(r),l++}i=t===l}else i=!0;if(i){if(void 0!==s.shareScope){let r=s.shareScope;const t=l;if(l===t)if("string"==typeof r){if(r.length<1){const r={params:{}};null===o?o=[r]:o.push(r),l++}}else{const r={params:{type:"string"}};null===o?o=[r]:o.push(r),l++}i=t===l}else i=!0;if(i)if(void 0!==s.version){let r=s.version;const t=l,e=l;let n=!1;const a=l;if(!1!==r){const r={params:{}};null===o?o=[r]:o.push(r),l++}var p=a===l;if(n=n||p,!n){const t=l;if("string"!=typeof r){const r={params:{type:"string"}};null===o?o=[r]:o.push(r),l++}p=t===l,n=n||p}if(n)l=e,null!==o&&(e?o.length=e:o=null);else{const r={params:{}};null===o?o=[r]:o.push(r),l++}i=t===l}else i=!0}}}}else{const r={params:{type:"object"}};null===o?o=[r]:o.push(r),l++}var c=u===l;if(f=f||c,!f){const r=l;if(l==l)if("string"==typeof s){if(s.length<1){const r={params:{}};null===o?o=[r]:o.push(r),l++}}else{const r={params:{type:"string"}};null===o?o=[r]:o.push(r),l++}c=r===l,f=f||c}if(!f){const t={params:{}};return null===o?o=[t]:o.push(t),l++,r.errors=o,!1}if(l=a,null!==o&&(a?o.length=a:o=null),n!==l)break}}return r.errors=o,0===l}function t(e,{instancePath:s="",parentData:n,parentDataProperty:a,rootData:o=e}={}){let l=null,i=0;const p=i;let c=!1;const f=i;if(i===f)if(Array.isArray(e)){const t=e.length;for(let n=0;n boolean; +export = check; diff --git a/schemas/plugins/sharing/SharePlugin.check.js b/schemas/plugins/sharing/SharePlugin.check.js new file mode 100644 index 00000000000..839423fff0c --- /dev/null +++ b/schemas/plugins/sharing/SharePlugin.check.js @@ -0,0 +1,6 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ +"use strict";module.exports=a,module.exports.default=a;const r={type:"object",additionalProperties:!1,properties:{eager:{type:"boolean"},import:{anyOf:[{enum:[!1]},{$ref:"#/definitions/SharedItem"}]},packageName:{type:"string",minLength:1},requiredVersion:{anyOf:[{enum:[!1]},{type:"string"}]},shareKey:{type:"string",minLength:1},shareScope:{type:"string",minLength:1},singleton:{type:"boolean"},strictVersion:{type:"boolean"},version:{anyOf:[{enum:[!1]},{type:"string"}]}}},e=Object.prototype.hasOwnProperty;function t(n,{instancePath:s="",parentData:a,parentDataProperty:o,rootData:i=n}={}){let l=null,p=0;if(0===p){if(!n||"object"!=typeof n||Array.isArray(n))return t.errors=[{params:{type:"object"}}],!1;{const s=p;for(const s in n)if(!e.call(r.properties,s))return t.errors=[{params:{additionalProperty:s}}],!1;if(s===p){if(void 0!==n.eager){const r=p;if("boolean"!=typeof n.eager)return t.errors=[{params:{type:"boolean"}}],!1;var f=r===p}else f=!0;if(f){if(void 0!==n.import){let r=n.import;const e=p,s=p;let a=!1;const o=p;if(!1!==r){const r={params:{}};null===l?l=[r]:l.push(r),p++}var u=o===p;if(a=a||u,!a){const e=p;if(p==p)if("string"==typeof r){if(r.length<1){const r={params:{}};null===l?l=[r]:l.push(r),p++}}else{const r={params:{type:"string"}};null===l?l=[r]:l.push(r),p++}u=e===p,a=a||u}if(!a){const r={params:{}};return null===l?l=[r]:l.push(r),p++,t.errors=l,!1}p=s,null!==l&&(s?l.length=s:l=null),f=e===p}else f=!0;if(f){if(void 0!==n.packageName){let r=n.packageName;const e=p;if(p===e){if("string"!=typeof r)return t.errors=[{params:{type:"string"}}],!1;if(r.length<1)return t.errors=[{params:{}}],!1}f=e===p}else f=!0;if(f){if(void 0!==n.requiredVersion){let r=n.requiredVersion;const e=p,s=p;let a=!1;const o=p;if(!1!==r){const r={params:{}};null===l?l=[r]:l.push(r),p++}var c=o===p;if(a=a||c,!a){const e=p;if("string"!=typeof r){const r={params:{type:"string"}};null===l?l=[r]:l.push(r),p++}c=e===p,a=a||c}if(!a){const r={params:{}};return null===l?l=[r]:l.push(r),p++,t.errors=l,!1}p=s,null!==l&&(s?l.length=s:l=null),f=e===p}else f=!0;if(f){if(void 0!==n.shareKey){let r=n.shareKey;const e=p;if(p===e){if("string"!=typeof r)return t.errors=[{params:{type:"string"}}],!1;if(r.length<1)return t.errors=[{params:{}}],!1}f=e===p}else f=!0;if(f){if(void 0!==n.shareScope){let r=n.shareScope;const e=p;if(p===e){if("string"!=typeof r)return t.errors=[{params:{type:"string"}}],!1;if(r.length<1)return t.errors=[{params:{}}],!1}f=e===p}else f=!0;if(f){if(void 0!==n.singleton){const r=p;if("boolean"!=typeof n.singleton)return t.errors=[{params:{type:"boolean"}}],!1;f=r===p}else f=!0;if(f){if(void 0!==n.strictVersion){const r=p;if("boolean"!=typeof n.strictVersion)return t.errors=[{params:{type:"boolean"}}],!1;f=r===p}else f=!0;if(f)if(void 0!==n.version){let r=n.version;const e=p,s=p;let a=!1;const o=p;if(!1!==r){const r={params:{}};null===l?l=[r]:l.push(r),p++}var y=o===p;if(a=a||y,!a){const e=p;if("string"!=typeof r){const r={params:{type:"string"}};null===l?l=[r]:l.push(r),p++}y=e===p,a=a||y}if(!a){const r={params:{}};return null===l?l=[r]:l.push(r),p++,t.errors=l,!1}p=s,null!==l&&(s?l.length=s:l=null),f=e===p}else f=!0}}}}}}}}}}return t.errors=l,0===p}function n(r,{instancePath:e="",parentData:s,parentDataProperty:a,rootData:o=r}={}){let i=null,l=0;if(0===l){if(!r||"object"!=typeof r||Array.isArray(r))return n.errors=[{params:{type:"object"}}],!1;for(const s in r){let a=r[s];const f=l,u=l;let c=!1;const y=l;t(a,{instancePath:e+"/"+s.replace(/~/g,"~0").replace(/\//g,"~1"),parentData:r,parentDataProperty:s,rootData:o})||(i=null===i?t.errors:i.concat(t.errors),l=i.length);var p=y===l;if(c=c||p,!c){const r=l;if(l==l)if("string"==typeof a){if(a.length<1){const r={params:{}};null===i?i=[r]:i.push(r),l++}}else{const r={params:{type:"string"}};null===i?i=[r]:i.push(r),l++}p=r===l,c=c||p}if(!c){const r={params:{}};return null===i?i=[r]:i.push(r),l++,n.errors=i,!1}if(l=u,null!==i&&(u?i.length=u:i=null),f!==l)break}}return n.errors=i,0===l}function s(r,{instancePath:e="",parentData:t,parentDataProperty:a,rootData:o=r}={}){let i=null,l=0;const p=l;let f=!1;const u=l;if(l===u)if(Array.isArray(r)){const t=r.length;for(let s=0;s} result + */ function setup() { - return checkSymlinkExistsAsync() - .then(hasSymlink => { + return Promise.all([ + checkSymlinkExistsAsync().then(async hasSymlink => { if (!hasSymlink) { - return ensureYarnInstalledAsync().then(() => { - return runSetupAsync().then(() => { - return checkSymlinkExistsAsync(); - }); - }); + await ensureYarnInstalledAsync(); + await runSetupSymlinkAsync(); + if (!(await checkSymlinkExistsAsync())) { + throw new Error("windows symlink was not successfully created"); + } } }) - .then(message => { + ]) + .then(() => { process.exitCode = 0; }) - .catch(e => { - console.error(e); + .catch(err => { + console.error(err); process.exitCode = 1; }); } -function runSetupAsync() { - return exec("yarn", ["install"], "Install dependencies") - .then(() => exec("yarn", ["link"], "Create webpack symlink")) - .then(() => exec("yarn", ["link", "webpack"], "Link webpack into itself")); +/** + * @returns {Promise} result + */ +async function runSetupSymlinkAsync() { + await exec("yarn", ["install"], "Install dependencies"); + await exec("yarn", ["link"], "Create webpack symlink"); + await exec("yarn", ["link", "webpack"], "Link webpack into itself"); } +/** + * @returns {Promise} result + */ function checkSymlinkExistsAsync() { return new Promise((resolve, reject) => { if ( - fs.existsSync(node_modulesFolder) && + fs.existsSync(nodeModulesFolder) && fs.existsSync(webpackDependencyFolder) && fs.lstatSync(webpackDependencyFolder).isSymbolicLink() ) { @@ -46,21 +56,39 @@ function checkSymlinkExistsAsync() { }); } -function ensureYarnInstalledAsync() { - const semverPattern = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$/; - return execGetOutput("yarn", ["-v"], "Check yarn version") - .then(stdout => semverPattern.test(stdout), () => false) - .then(hasYarn => hasYarn || installYarnAsync()); +/** + * @returns {Promise} result + */ +async function ensureYarnInstalledAsync() { + const semverPattern = + /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$/; + let hasYarn = false; + try { + const stdout = await execGetOutput("yarn", ["-v"], "Check yarn version"); + hasYarn = semverPattern.test(stdout); + } catch (_err) { + hasYarn = false; + } + if (!hasYarn) await installYarnAsync(); } +/** + * @returns {Promise} result + */ function installYarnAsync() { return exec("npm", ["install", "-g", "yarn"], "Install yarn"); } +/** + * @param {string} command command + * @param {string[]} args args + * @param {string} description description + * @returns {Promise} result + */ function exec(command, args, description) { console.log(`Setup: ${description}`); return new Promise((resolve, reject) => { - let cp = require("child_process").spawn(command, args, { + const cp = require("child_process").spawn(command, args, { cwd: root, stdio: "inherit", shell: true @@ -70,7 +98,7 @@ function exec(command, args, description) { }); cp.on("exit", exitCode => { if (exitCode) { - reject(`${description} failed with exitcode ${exitCode}`); + reject(`${description} failed with exit code ${exitCode}`); } else { resolve(); } @@ -78,10 +106,16 @@ function exec(command, args, description) { }); } +/** + * @param {string} command command + * @param {string[]} args args + * @param {string} description description + * @returns {Promise} result + */ function execGetOutput(command, args, description) { console.log(`Setup: ${description}`); return new Promise((resolve, reject) => { - let cp = require("child_process").spawn(command, args, { + const cp = require("child_process").spawn(command, args, { cwd: root, stdio: [process.stdin, "pipe", process.stderr], shell: true @@ -91,15 +125,12 @@ function execGetOutput(command, args, description) { }); cp.on("exit", exitCode => { if (exitCode) { - reject(`${description} failed with exitcode ${exitCode}`); + reject(`${description} failed with exit code ${exitCode}`); } else { - resolve( - Buffer.concat(buffers) - .toString("utf-8") - .trim() - ); + resolve(Buffer.concat(buffers).toString("utf-8").trim()); } }); + /** @type {Buffer[]} */ const buffers = []; cp.stdout.on("data", data => buffers.push(data)); }); diff --git a/test/AbstractMethodError.unittest.js b/test/AbstractMethodError.unittest.js new file mode 100644 index 00000000000..862a2860409 --- /dev/null +++ b/test/AbstractMethodError.unittest.js @@ -0,0 +1,27 @@ +"use strict"; + +const AbstractMethodError = require("../lib/AbstractMethodError"); + +describe("WebpackError", () => { + class Foo { + abstractMethod() { + return new AbstractMethodError(); + } + } + + class Child extends Foo {} + + const expectedMessage = "Abstract method $1. Must be overridden."; + + it("Should construct message with caller info", () => { + const fooClassError = new Foo().abstractMethod(); + const childClassError = new Child().abstractMethod(); + + expect(fooClassError.message).toBe( + expectedMessage.replace("$1", "Foo.abstractMethod") + ); + expect(childClassError.message).toBe( + expectedMessage.replace("$1", "Child.abstractMethod") + ); + }); +}); diff --git a/test/ArrayHelpers.unittest.js b/test/ArrayHelpers.unittest.js new file mode 100644 index 00000000000..911174dd2fa --- /dev/null +++ b/test/ArrayHelpers.unittest.js @@ -0,0 +1,17 @@ +"use strict"; + +const ArrayHelpers = require("../lib/util/ArrayHelpers"); + +describe("ArrayHelpers", () => { + it("groupBy should partition into two arrays", () => { + expect( + ArrayHelpers.groupBy([1, 2, 3, 4, 5, 6], x => x % 2 === 0) + ).toStrictEqual([ + [2, 4, 6], + [1, 3, 5] + ]); + }); + it("groupBy works with empty array", () => { + expect(ArrayHelpers.groupBy([], x => x % 2 === 0)).toStrictEqual([[], []]); + }); +}); diff --git a/test/BannerPlugin.test.js b/test/BannerPlugin.test.js new file mode 100644 index 00000000000..e3948b3b390 --- /dev/null +++ b/test/BannerPlugin.test.js @@ -0,0 +1,116 @@ +"use strict"; + +const path = require("path"); +const fs = require("graceful-fs"); + +const webpack = require(".."); + +const pluginDir = path.join(__dirname, "js", "BannerPlugin"); +const outputDir = path.join(pluginDir, "output"); + +it("should cache assets", done => { + const entry1File = path.join(pluginDir, "entry1.js"); + const entry2File = path.join(pluginDir, "entry2.js"); + const outputFile = path.join(outputDir, "entry1.js"); + try { + fs.mkdirSync(path.join(pluginDir), { + recursive: true + }); + } catch (_err) { + // empty + } + const compiler = webpack({ + mode: "development", + entry: { + entry1: entry1File, + entry2: entry2File + }, + output: { + path: outputDir + }, + plugins: [new webpack.BannerPlugin("banner is a string")] + }); + fs.writeFileSync(entry1File, "1", "utf-8"); + fs.writeFileSync(entry2File, "1", "utf-8"); + compiler.run(err => { + if (err) return done(err); + const footerFileResults = fs.readFileSync(outputFile, "utf8").split("\n"); + expect(footerFileResults[0]).toBe("/*! banner is a string */"); + fs.writeFileSync(entry2File, "2", "utf-8"); + compiler.run((err, stats) => { + const { assets } = stats.toJson(); + expect(assets.find(as => as.name === "entry1.js").emitted).toBe(false); + expect(assets.find(as => as.name === "entry2.js").emitted).toBe(true); + done(err); + }); + }); +}); + +it("can place banner as footer", done => { + const footerFile = path.join(pluginDir, "footerFile.js"); + const outputFile = path.join(outputDir, "footerFile.js"); + try { + fs.mkdirSync(path.join(pluginDir), { + recursive: true + }); + } catch (_err) { + // empty + } + const compiler = webpack({ + mode: "development", + entry: { + footerFile + }, + output: { + path: outputDir + }, + plugins: [ + new webpack.BannerPlugin({ + banner: "banner is a string", + footer: true + }) + ] + }); + fs.writeFileSync(footerFile, "footer", "utf-8"); + compiler.run(err => { + if (err) return done(err); + const footerFileResults = fs.readFileSync(outputFile, "utf8").split("\n"); + expect(footerFileResults.pop()).toBe("/*! banner is a string */"); + done(); + }); +}); + +it("should allow to change stage", done => { + const entryFile = path.join(pluginDir, "entry3.js"); + const outputFile = path.join(outputDir, "entry3.js"); + try { + fs.mkdirSync(path.join(pluginDir), { + recursive: true + }); + } catch (_err) { + // empty + } + const compiler = webpack({ + mode: "production", + entry: { + entry3: entryFile + }, + output: { + path: outputDir + }, + plugins: [ + new webpack.BannerPlugin({ + raw: true, + banner: "/* banner is a string */", + stage: webpack.Compilation.PROCESS_ASSETS_STAGE_REPORT + }) + ] + }); + fs.writeFileSync(entryFile, "console.log(1 + 1);", "utf-8"); + compiler.run(err => { + if (err) return done(err); + const fileResult = fs.readFileSync(outputFile, "utf8").split("\n"); + expect(fileResult[0]).toBe("/* banner is a string */"); + done(); + }); +}); diff --git a/test/BenchmarkTestCases.benchmark.js b/test/BenchmarkTestCases.benchmark.js deleted file mode 100644 index 5ed59054865..00000000000 --- a/test/BenchmarkTestCases.benchmark.js +++ /dev/null @@ -1,365 +0,0 @@ -"use strict"; - -const path = require("path"); -const fs = require("fs"); -const asyncLib = require("neo-async"); -const Benchmark = require("benchmark"); -const { remove } = require("./helpers/remove"); - -describe("BenchmarkTestCases", function() { - const casesPath = path.join(__dirname, "benchmarkCases"); - const tests = fs.readdirSync(casesPath).filter(function(folder) { - return ( - folder.indexOf("_") < 0 && - fs.existsSync(path.resolve(casesPath, folder, "webpack.config.js")) - ); - }); - - const baselinesPath = path.join(__dirname, "js", "benchmark-baselines"); - const baselines = []; - - try { - fs.mkdirSync(path.join(__dirname, "js")); - } catch (e) {} // eslint-disable-line no-empty - try { - fs.mkdirSync(baselinesPath); - } catch (e) {} // eslint-disable-line no-empty - - beforeAll(function(done) { - const git = require("simple-git"); - const rootPath = path.join(__dirname, ".."); - getBaselineRevs(rootPath, (err, baselineRevisions) => { - if (err) return done(err); - asyncLib.eachSeries( - baselineRevisions, - (baselineInfo, callback) => { - const baselineRevision = baselineInfo.rev; - const baselinePath = path.resolve(baselinesPath, baselineRevision); - if (fs.existsSync(path.resolve(baselinePath, ".git"))) { - doLoadWebpack(); - } else { - try { - fs.mkdirSync(baselinePath); - } catch (e) {} // eslint-disable-line no-empty - const gitIndex = path.resolve(rootPath, ".git/index"); - const index = fs.readFileSync(gitIndex); - git(rootPath).raw( - ["rev-list", "-n", "1", "HEAD"], - (err, prevHead) => { - if (err) return callback(err); - git(baselinePath).raw( - [ - "--git-dir", - path.join(rootPath, ".git"), - "reset", - "--hard", - baselineRevision - ], - err => { - if (err) return callback(err); - git(rootPath).raw( - ["reset", "--soft", prevHead.split("\n")[0]], - err => { - if (err) return callback(err); - fs.writeFileSync(gitIndex, index); - try { - doLoadWebpack(); - } catch (err) { - callback(err); - } - } - ); - } - ); - } - ); - } - - function doLoadWebpack() { - const baselineWebpack = require.requireActual( - path.resolve(baselinePath, "lib/webpack.js") - ); - baselines.push({ - name: baselineInfo.name, - rev: baselineRevision, - webpack: baselineWebpack - }); - callback(); - } - }, - err => { - if (err) { - done(err); - return; - } - createTests(); - done(); - } - ); - }); - }, 270000); - - afterAll(() => { - remove(baselinesPath); - }); - - function getBaselineRevs(rootPath, callback) { - const git = require("simple-git")(rootPath); - const lastVersionTag = "v" + require("../package.json").version; - git.raw(["rev-list", "-n", "1", lastVersionTag], (err, resultVersion) => { - if (err) return callback(err); - const matchVersion = /^([a-f0-9]+)\s*$/.exec(resultVersion); - if (!matchVersion) - return callback(new Error("Invalid result from git revparse")); - const revLastVersion = matchVersion[1]; - git.raw( - ["rev-list", "--parents", "-n", "1", "HEAD"], - (err, resultParents) => { - if (err) return callback(err); - const match = /^([a-f0-9]+)\s*([a-f0-9]+)\s*([a-f0-9]+)?\s*$/.exec( - resultParents - ); - if (!match) - return callback(new Error("Invalid result from git rev-list")); - const head = match[1]; - const parent1 = match[2]; - const parent2 = match[3]; - if (parent2 && parent1) { - return callback( - null, - [ - { - name: "HEAD", - rev: head - }, - head !== revLastVersion && { - name: lastVersionTag, - rev: revLastVersion - }, - parent1 !== revLastVersion && - head !== revLastVersion && { - name: "base", - rev: parent1 - } - ].filter(Boolean) - ); - } else if (parent1) { - return callback( - null, - [ - { - name: "HEAD", - rev: head - }, - head !== revLastVersion && { - name: lastVersionTag, - rev: revLastVersion - } - ].filter(Boolean) - ); - } else { - return callback(new Error("No baseline found")); - } - } - ); - }); - } - - function tDistribution(n) { - // two-sided, 90% - // https://en.wikipedia.org/wiki/Student%27s_t-distribution - if (n <= 30) { - // 1 2 ... - const data = [ - 6.314, - 2.92, - 2.353, - 2.132, - 2.015, - 1.943, - 1.895, - 1.86, - 1.833, - 1.812, - 1.796, - 1.782, - 1.771, - 1.761, - 1.753, - 1.746, - 1.74, - 1.734, - 1.729, - 1.725, - 1.721, - 1.717, - 1.714, - 1.711, - 1.708, - 1.706, - 1.703, - 1.701, - 1.699, - 1.697 - ]; - return data[n - 1]; - } else if (n <= 120) { - // 30 40 50 60 70 80 90 100 110 120 - const data = [ - 1.697, - 1.684, - 1.676, - 1.671, - 1.667, - 1.664, - 1.662, - 1.66, - 1.659, - 1.658 - ]; - var a = data[Math.floor(n / 10) - 3]; - var b = data[Math.ceil(n / 10) - 3]; - var f = n / 10 - Math.floor(n / 10); - return a * (1 - f) + b * f; - } else { - return 1.645; - } - } - - function runBenchmark(webpack, config, callback) { - // warmup - const warmupCompiler = webpack(config, (err, stats) => { - warmupCompiler.purgeInputFileSystem(); - const bench = new Benchmark( - function(deferred) { - const compiler = webpack(config, (err, stats) => { - compiler.purgeInputFileSystem(); - if (err) { - callback(err); - return; - } - if (stats.hasErrors()) { - callback(new Error(stats.toJson().errors.join("\n\n"))); - return; - } - deferred.resolve(); - }); - }, - { - maxTime: 30, - defer: true, - initCount: 1, - onComplete: function() { - const stats = bench.stats; - const n = stats.sample.length; - const nSqrt = Math.sqrt(n); - const z = tDistribution(n - 1); - stats.minConfidence = stats.mean - (z * stats.deviation) / nSqrt; - stats.maxConfidence = stats.mean + (z * stats.deviation) / nSqrt; - stats.text = `${Math.round(stats.mean * 1000)}ms ± ${Math.round( - stats.deviation * 1000 - )}ms [${Math.round(stats.minConfidence * 1000)}ms; ${Math.round( - stats.maxConfidence * 1000 - )}ms]`; - callback(null, bench.stats); - }, - onError: callback - } - ); - bench.run({ - async: true - }); - }); - } - - function createTests() { - tests.forEach(testName => { - const testDirectory = path.join(casesPath, testName); - let headStats = null; - describe(`${testName} create benchmarks`, function() { - baselines.forEach(baseline => { - let baselineStats = null; - it( - `should benchmark ${baseline.name} (${baseline.rev})`, - function(done) { - const outputDirectory = path.join( - __dirname, - "js", - "benchmark", - `baseline-${baseline.name}`, - testName - ); - const config = - Object.create( - require.requireActual( - path.join(testDirectory, "webpack.config.js") - ) - ) || {}; - config.output = Object.create(config.output || {}); - if (!config.context) config.context = testDirectory; - if (!config.output.path) config.output.path = outputDirectory; - runBenchmark(baseline.webpack, config, (err, stats) => { - if (err) return done(err); - process.stderr.write(` ${baseline.name} ${stats.text}`); - if (baseline.name === "HEAD") headStats = stats; - else baselineStats = stats; - done(); - }); - }, - 180000 - ); - - it( - `should benchmark ${baseline.name} (${baseline.rev})`, - done => { - const outputDirectory = path.join( - __dirname, - "js", - "benchmark", - `baseline-${baseline.name}`, - testName - ); - const config = - require.requireActual( - path.join(testDirectory, "webpack.config.js") - ) || {}; - config.output = config.output || {}; - if (!config.context) config.context = testDirectory; - if (!config.output.path) config.output.path = outputDirectory; - runBenchmark(baseline.webpack, config, (err, stats) => { - if (err) return done(err); - process.stderr.write(` ${baseline.name} ${stats.text}`); - if (baseline.name === "HEAD") headStats = stats; - else baselineStats = stats; - done(); - }); - }, - 180000 - ); - - if (baseline.name !== "HEAD") { - it(`HEAD should not be slower than ${baseline.name} (${ - baseline.rev - })`, function() { - if (baselineStats.maxConfidence < headStats.minConfidence) { - throw new Error( - `HEAD (${headStats.text}) is slower than ${baseline.name} (${ - baselineStats.text - }) (90% confidence)` - ); - } else if ( - baselineStats.minConfidence > headStats.maxConfidence - ) { - console.log( - `======> HEAD is ${Math.round( - (baselineStats.mean / headStats.mean) * 100 - 100 - )}% faster than ${baseline.name} (90% confidence)!` - ); - } - }); - } - }); - }); - }); - } -}); diff --git a/test/BenchmarkTestCases.benchmark.mjs b/test/BenchmarkTestCases.benchmark.mjs new file mode 100644 index 00000000000..df61971d4e9 --- /dev/null +++ b/test/BenchmarkTestCases.benchmark.mjs @@ -0,0 +1,655 @@ +import path from "path"; +import fs from "fs/promises"; +import { constants, writeFile } from "fs"; +import { Bench, hrtimeNow } from "tinybench"; +import { dirname } from "path"; +import { fileURLToPath, pathToFileURL } from "url"; +import simpleGit from "simple-git"; +import { withCodSpeed } from "@codspeed/tinybench-plugin"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const rootPath = path.join(__dirname, ".."); +const git = simpleGit(rootPath); + +const REV_LIST_REGEXP = /^([a-f0-9]+)\s*([a-f0-9]+)\s*([a-f0-9]+)?\s*$/; + +const getV8Flags = () => { + const nodeVersionMajor = Number.parseInt( + process.version.slice(1).split(".")[0] + ); + const flags = [ + "--hash-seed=1", + "--random-seed=1", + "--no-opt", + "--predictable", + "--predictable-gc-schedule", + "--interpreted-frames-native-stack", + "--allow-natives-syntax", + "--expose-gc", + "--no-concurrent-sweeping", + "--max-old-space-size=4096" + ]; + if (nodeVersionMajor < 18) { + flags.push("--no-randomize-hashes"); + } + if (nodeVersionMajor < 20) { + flags.push("--no-scavenge-task"); + } + return flags; +}; + +const checkV8Flags = () => { + const requiredFlags = getV8Flags(); + const actualFlags = process.execArgv; + const missingFlags = requiredFlags.filter( + flag => !actualFlags.includes(flag) + ); + if (missingFlags.length > 0) { + console.warn(`Missing required flags: ${missingFlags.join(", ")}`); + } +}; + +checkV8Flags(); + +const LAST_COMMIT = typeof process.env.LAST_COMMIT !== "undefined"; + +/** + * @param {(string | undefined)[]} revList rev list + * @returns {Promise} head + */ +async function getHead(revList) { + if (typeof process.env.HEAD !== "undefined") { + return process.env.HEAD; + } + + // On CI we take the latest commit `merge commit` as a head + if (revList[3]) { + return revList[3]; + } + + // Otherwise we take the latest commit + return revList[1]; +} + +/** + * @param {string} head head + * @param {(string | undefined)[]} revList rev list + * @returns {Promise} base + */ +async function getBase(head, revList) { + if (typeof process.env.BASE !== "undefined") { + return process.env.BASE; + } + + if (revList[3]) { + return revList[2]; + } + + const branchName = await git.raw(["rev-parse", "--abbrev-ref", "HEAD"]); + + if (branchName.trim() !== "main") { + const resultParents = await git.raw([ + "rev-list", + "--parents", + "-n", + "1", + "main" + ]); + + const revList = REV_LIST_REGEXP.exec(resultParents); + + if (!revList[1]) { + throw new Error("No parent commit found"); + } + + if (head === revList[1]) { + return revList[2]; + } + + return revList[1]; + } + + return revList[2]; +} + +/** + * @returns {Promise<{name: string, rev: string}[]>} baseline revs + */ +async function getBaselineRevs() { + if (LAST_COMMIT) { + return [ + { + name: "HEAD" + } + ]; + } + + const resultParents = await git.raw([ + "rev-list", + "--parents", + "-n", + "1", + "HEAD" + ]); + const revList = REV_LIST_REGEXP.exec(resultParents); + + if (!revList) throw new Error("Invalid result from git rev-list"); + + const head = await getHead(revList); + const base = await getBase(head, revList); + + if (!head || !base) { + throw new Error("No baseline found"); + } + + return [ + { + name: "HEAD", + rev: head + }, + { + name: "BASE", + rev: base + } + ]; +} + +/** + * @param {number} n number of runs + * @returns {number} distribution + */ +function tDistribution(n) { + // two-sided, 90% + // https://en.wikipedia.org/wiki/Student%27s_t-distribution + if (n <= 30) { + // 1 2 ... + const data = [ + 6.314, 2.92, 2.353, 2.132, 2.015, 1.943, 1.895, 1.86, 1.833, 1.812, 1.796, + 1.782, 1.771, 1.761, 1.753, 1.746, 1.74, 1.734, 1.729, 1.725, 1.721, + 1.717, 1.714, 1.711, 1.708, 1.706, 1.703, 1.701, 1.699, 1.697 + ]; + return data[n - 1]; + } else if (n <= 120) { + // 30 40 50 60 70 80 90 100 110 120 + const data = [ + 1.697, 1.684, 1.676, 1.671, 1.667, 1.664, 1.662, 1.66, 1.659, 1.658 + ]; + const a = data[Math.floor(n / 10) - 3]; + const b = data[Math.ceil(n / 10) - 3]; + const f = n / 10 - Math.floor(n / 10); + + return a * (1 - f) + b * f; + } + + return 1.645; +} + +const output = path.join(__dirname, "js"); +const baselinesPath = path.join(output, "benchmark-baselines"); + +const baselineRevisions = await getBaselineRevs(); + +try { + await fs.mkdir(baselinesPath, { recursive: true }); +} catch (_err) {} // eslint-disable-line no-empty + +const baselines = []; + +for (const baselineInfo of baselineRevisions) { + /** + * @returns {void} + */ + function addBaseline() { + baselines.push({ + name: baselineInfo.name, + rev: baselineRevision, + webpack: async () => { + const webpack = ( + await import( + pathToFileURL(path.resolve(baselinePath, `./lib/index.js`)) + ) + ).default; + + return webpack; + } + }); + } + + const baselineRevision = baselineInfo.rev; + const baselinePath = + baselineRevision === undefined + ? path.resolve(__dirname, "../") + : path.resolve(baselinesPath, baselineRevision); + + try { + await fs.access(path.resolve(baselinePath, ".git"), constants.R_OK); + } catch (_err) { + try { + await fs.mkdir(baselinePath); + } catch (_err) {} // eslint-disable-line no-empty + + const gitIndex = path.resolve(rootPath, ".git/index"); + const index = await fs.readFile(gitIndex); + const prevHead = await git.raw(["rev-list", "-n", "1", "HEAD"]); + + await simpleGit(baselinePath).raw([ + "--git-dir", + path.join(rootPath, ".git"), + "reset", + "--hard", + baselineRevision + ]); + + await git.raw(["reset", "--soft", prevHead.split("\n")[0]]); + await fs.writeFile(gitIndex, index); + } finally { + addBaseline(); + } +} + +function buildConfiguration( + test, + baseline, + realConfig, + scenario, + testDirectory +) { + const { watch, ...rest } = scenario; + const config = structuredClone({ ...realConfig, ...rest }); + + config.entry = path.resolve( + testDirectory, + config.entry + ? /\.(c|m)?js$/.test(config.entry) + ? config.entry + : `${config.entry}.js` + : "./index.js" + ); + config.devtool = config.devtool || false; + config.name = `${test}-${baseline.name}-${scenario.name}`; + config.context = testDirectory; + config.performance = false; + config.output = config.output || {}; + config.output.path = path.join( + baseOutputPath, + test, + `scenario-${scenario.name}`, + `baseline-${baseline.name}` + ); + config.plugins = config.plugins || []; + + if (config.cache) { + config.cache.cacheDirectory = path.resolve(config.output.path, ".cache"); + } + + return config; +} + +function runWatch(compiler) { + return new Promise((resolve, reject) => { + const watching = compiler.watch({}, (err, stats) => { + if (err) { + reject(err); + } + + if (stats.hasWarnings() || stats.hasErrors()) { + reject(new Error(stats.toString())); + } + + resolve(watching); + }); + }); +} + +const scenarios = [ + { + name: "mode-development", + mode: "development" + }, + { + name: "mode-development-rebuild", + mode: "development", + watch: true + }, + { + name: "mode-production", + mode: "production" + } +]; + +const baseOutputPath = path.join(__dirname, "js", "benchmark"); + +const bench = withCodSpeed( + new Bench({ + warmup: true, + now: hrtimeNow, + throws: true + }) +); + +async function registerSuite(bench, test, baselines) { + const testDirectory = path.join(casesPath, test); + const optionsPath = path.resolve(testDirectory, "options.mjs"); + + let options = {}; + + try { + options = await import(`${pathToFileURL(optionsPath)}`); + } catch (_err) { + // Ignore + } + + if (typeof options.setup !== "undefined") { + await options.setup(); + } + + if (test.includes("-unit")) { + const fullBenchName = `unit benchmark "${test}"`; + + console.log(`Register: ${fullBenchName}`); + + const benchmarkPath = path.resolve(testDirectory, "index.bench.mjs"); + const registerBenchmarks = await import(`${pathToFileURL(benchmarkPath)}`); + + registerBenchmarks.default(bench); + + return; + } + + const realConfig = ( + await import( + `${pathToFileURL(path.join(testDirectory, `webpack.config.js`))}` + ) + ).default; + + await Promise.all( + baselines.map(async baseline => { + const webpack = await baseline.webpack(); + + await Promise.all( + scenarios.map(async scenario => { + const config = buildConfiguration( + test, + baseline, + realConfig, + scenario, + testDirectory + ); + + const stringifiedScenario = JSON.stringify(scenario); + const benchName = `benchmark "${test}", scenario '${stringifiedScenario}'${LAST_COMMIT ? "" : ` ${baseline.name} (${baseline.rev})`}`; + const fullBenchName = `benchmark "${test}", scenario '${stringifiedScenario}' ${baseline.name} ${baseline.rev ? `(${baseline.rev})` : ""}`; + + console.log(`Register: ${fullBenchName}`); + + if (scenario.watch) { + const entry = path.resolve(config.entry); + const originalEntryContent = await fs.readFile(entry, "utf-8"); + + let watching; + let watchingResolve; + + bench.add( + benchName, + async () => { + const watchingPromise = new Promise(res => { + watchingResolve = res; + }); + + await new Promise((resolve, reject) => { + writeFile( + entry, + `${originalEntryContent};console.log('watch test')`, + err => { + if (err) { + reject(err); + } + + watchingPromise.then(stats => { + // Construct and print stats to be more accurate with real life projects + stats.toString(); + + resolve(); + }); + } + ); + }); + }, + { + async beforeAll() { + this.collectBy = `${test}, scenario '${stringifiedScenario}'`; + + watching = await runWatch(webpack(config)); + watching.compiler.hooks.afterDone.tap( + "WatchingBenchmarkPlugin", + stats => { + if (watchingResolve) { + watchingResolve(stats); + } + } + ); + }, + async afterEach() { + await new Promise((resolve, reject) => { + writeFile(entry, originalEntryContent, err => { + if (err) { + reject(err); + return; + } + + resolve(); + }); + }); + }, + async afterAll() { + await new Promise((resolve, reject) => { + if (watching) { + watching.close(closeErr => { + if (closeErr) { + reject(closeErr); + return; + } + + resolve(); + }); + } + }); + } + } + ); + } else { + bench.add( + benchName, + async () => { + await new Promise((resolve, reject) => { + const baseCompiler = webpack(config); + + baseCompiler.run((err, stats) => { + if (err) { + reject(err); + return; + } + + if (stats.hasWarnings() || stats.hasErrors()) { + throw new Error(stats.toString()); + } + + baseCompiler.close(closeErr => { + if (closeErr) { + reject(closeErr); + return; + } + + // Construct and print stats to be more accurate with real life projects + stats.toString(); + + resolve(); + }); + }); + }); + }, + { + beforeAll() { + this.collectBy = `${test}, scenario '${stringifiedScenario}'`; + } + } + ); + } + }) + ); + }) + ); +} + +await fs.rm(baseOutputPath, { recursive: true, force: true }); + +const FILTER = + typeof process.env.FILTER !== "undefined" + ? new RegExp(process.env.FILTER) + : undefined; + +const NEGATIVE_FILTER = + typeof process.env.NEGATIVE_FILTER !== "undefined" + ? new RegExp(process.env.NEGATIVE_FILTER) + : undefined; + +const casesPath = path.join(__dirname, "benchmarkCases"); +const allBenchmarks = (await fs.readdir(casesPath)) + .filter( + item => + !item.includes("_") && + (FILTER ? FILTER.test(item) : true) && + (NEGATIVE_FILTER ? !NEGATIVE_FILTER.test(item) : true) + ) + .sort((a, b) => a.localeCompare(b)); + +const benchmarks = allBenchmarks.filter(item => !item.includes("-long")); +const longBenchmarks = allBenchmarks.filter(item => item.includes("-long")); +const i = Math.floor(benchmarks.length / longBenchmarks.length); + +for (const [index, value] of longBenchmarks.entries()) { + benchmarks.splice(index * i, 0, value); +} + +const shard = + typeof process.env.SHARD !== "undefined" + ? process.env.SHARD.split("/").map(item => Number.parseInt(item, 10)) + : [1, 1]; + +if ( + typeof shard[0] === "undefined" || + typeof shard[1] === "undefined" || + shard[0] > shard[1] || + shard[0] <= 0 || + shard[1] <= 0 +) { + throw new Error( + `Invalid \`SHARD\` value - it should be less then a part and more than zero, shard part is ${shard[0]}, count of shards is ${shard[1]}` + ); +} + +function splitToNChunks(array, n) { + const result = []; + + for (let i = n; i > 0; i--) { + result.push(array.splice(0, Math.ceil(array.length / i))); + } + + return result; +} + +const countOfBenchmarks = benchmarks.length; + +if (countOfBenchmarks < shard[1]) { + throw new Error( + `Shard upper limit is more than count of benchmarks, count of benchmarks is ${countOfBenchmarks}, shard is ${shard[1]}` + ); +} + +await Promise.all( + splitToNChunks(benchmarks, shard[1])[shard[0] - 1].map(benchmark => + registerSuite(bench, benchmark, baselines) + ) +); + +function formatNumber(value, precision, fractionDigits) { + return Math.abs(value) >= 10 ** precision + ? value.toFixed() + : Math.abs(value) < 10 ** (precision - fractionDigits) + ? value.toFixed(fractionDigits) + : value.toPrecision(precision); +} + +const US_PER_MS = 10 ** 3; +const NS_PER_MS = 10 ** 6; + +function formatTime(value) { + const toType = + Math.round(value) > 0 + ? "ms" + : Math.round(value * US_PER_MS) / US_PER_MS > 0 + ? "µs" + : "ns"; + + switch (toType) { + case "ms": { + return `${formatNumber(value, 5, 2)} ms`; + } + case "µs": { + return `${formatNumber(value * US_PER_MS, 5, 2)} µs`; + } + case "ns": { + return `${formatNumber(value * NS_PER_MS, 5, 2)} ns`; + } + } +} + +const statsByTests = new Map(); + +bench.addEventListener("cycle", event => { + const task = event.task; + const runs = task.runs; + const nSqrt = Math.sqrt(runs); + const z = tDistribution(runs - 1); + const { latency } = task.result; + const minConfidence = latency.mean - (z * latency.sd) / nSqrt; + const maxConfidence = latency.mean + (z * latency.sd) / nSqrt; + const mean = formatTime(latency.mean); + const deviation = formatTime(latency.sd); + const minConfidenceFormatted = formatTime(minConfidence); + const maxConfidenceFormatted = formatTime(maxConfidence); + const confidence = `${mean} ± ${deviation} [${minConfidenceFormatted}; ${maxConfidenceFormatted}]`; + const text = `${task.name} ${confidence}`; + + const collectBy = task.collectBy; + const allStats = statsByTests.get(collectBy); + + console.log(`Done: ${task.name} ${confidence} (${runs} runs sampled)`); + + const info = { ...latency, text, minConfidence, maxConfidence }; + + if (!allStats) { + statsByTests.set(collectBy, [info]); + return; + } + + allStats.push(info); + + const firstStats = allStats[0]; + const secondStats = allStats[1]; + + console.log( + `Result: ${firstStats.text} is ${Math.round( + (secondStats.mean / firstStats.mean) * 100 - 100 + )}% ${secondStats.maxConfidence < firstStats.minConfidence ? "slower than" : secondStats.minConfidence > firstStats.maxConfidence ? "faster than" : "the same as"} ${secondStats.text}` + ); +}); + +// Fix for https://github.com/CodSpeedHQ/codspeed-node/issues/44 +for (const name of bench.tasks.map(task => task.name)) { + const task = bench.getTask(name); + + task.opts = task.fnOpts; +} + +await bench.run(); diff --git a/test/BinaryMiddleware.unittest.js b/test/BinaryMiddleware.unittest.js new file mode 100644 index 00000000000..e22ed0eafdf --- /dev/null +++ b/test/BinaryMiddleware.unittest.js @@ -0,0 +1,132 @@ +const BinaryMiddleware = require("../lib/serialization/BinaryMiddleware"); +const SerializerMiddleware = require("../lib/serialization/SerializerMiddleware"); + +const cont = (base, count) => { + const result = []; + for (let i = 0; i < count; i++) { + result.push(base[i % base.length]); + } + return result; +}; + +const mw = new BinaryMiddleware(); +const other = { other: true }; + +const resolveLazy = item => { + if (SerializerMiddleware.isLazy(item)) { + const data = item(); + if (Array.isArray(data)) return { resolvesTo: data.map(resolveLazy) }; + return { resolvesTo: resolveLazy(data) }; + } + return item; +}; + +describe("BinaryMiddleware", () => { + const items = [ + true, + false, + null, + "", + "hi", + "hi".repeat(200), + "😀", + "😀".repeat(200), + Buffer.from("hello"), + 1, + 11, + 0x100, + -1, + -11, + -0x100, + -1.25, + SerializerMiddleware.createLazy([5], other) + ]; + + const itemsWithLazy = [ + ...items, + SerializerMiddleware.createLazy( + [SerializerMiddleware.createLazy([5], other)], + mw + ), + SerializerMiddleware.createLazy( + [ + 1, + SerializerMiddleware.createLazy([2], mw), + SerializerMiddleware.createLazy([5], other), + 4 + ], + mw + ) + ]; + itemsWithLazy.push( + SerializerMiddleware.createLazy(itemsWithLazy.slice(), mw) + ); + itemsWithLazy.push( + SerializerMiddleware.createLazy(itemsWithLazy.slice(), other) + ); + + items.push(undefined); + + const cases = [ + ...itemsWithLazy.map(item => [item]), + [(true, true)], + [false, true], + [true, false], + [false, false], + [false, false, false], + [false, true, false, true], + [true, true, true], + [false, false, false], + cont([false, true, false, true], 5), + cont([true], 5), + cont([false], 5), + cont([false, true, false, true], 6), + cont([true], 6), + cont([false], 6), + cont([false, true, false, true], 7), + cont([false, true, false, true], 8), + cont([false, true, false, true], 9), + cont([false, true, false, true], 132), + cont([false, true, false, true], 133), + cont([false, true, false, true], 134), + cont([false, true, false, true], 135), + cont([false, true, false, true], 10000), + cont([true], 135), + [null], + [null, null], + [null, null, null], + cont([null], 4), + cont([null], 100), + cont([null], 300), + cont([-20], 20), + cont([400], 20), + cont([5.5], 20) + ]; + + for (const c of [1, 100]) { + for (const caseData of cases) { + for (const prepend of items) { + for (const append of items) { + if (c > 1 && append !== undefined) continue; + const data = [prepend, ...caseData, append].filter( + x => x !== undefined + ); + if (data.length * c > 200000) continue; + if (data.length === 0) continue; + let key = JSON.stringify(data.map(resolveLazy)); + if (key.length > 100) + key = `${key.slice(0, 50)} ... ${key.slice(-50)}`; + it(`should serialize ${c} x ${key} (${data.length}) correctly`, () => { + // process.stderr.write( + // `${c} x ${key.slice(0, 20)} (${data.length})\n` + // ); + const realData = cont(data, data.length * c); + const serialized = mw.serialize(realData, {}); + const newData = mw.deserialize(serialized, {}); + expect(newData.map(resolveLazy)).toEqual(realData.map(resolveLazy)); + }); + } + } + } + } +}); diff --git a/test/BuildDependencies.longtest.js b/test/BuildDependencies.longtest.js new file mode 100644 index 00000000000..5bc7fef68ca --- /dev/null +++ b/test/BuildDependencies.longtest.js @@ -0,0 +1,321 @@ +"use strict"; + +const path = require("path"); +const childProcess = require("child_process"); +const fs = require("fs"); +const rimraf = require("rimraf"); + +const cacheDirectory = path.resolve(__dirname, "js/buildDepsCache"); +const outputDirectory = path.resolve(__dirname, "js/buildDeps"); +const inputDirectory = path.resolve(__dirname, "js/buildDepsInput"); + +const exec = (n, options = {}) => + new Promise((resolve, reject) => { + const webpack = require("../"); + const coverageEnabled = webpack.toString().includes("++"); + + const p = childProcess.execFile( + process.execPath, + [ + ...(coverageEnabled + ? [ + require.resolve("nyc/bin/nyc.js"), + "--silent", + "--no-clean", + "--cache-dir", + ".jest-cache/nyc", + process.execPath + ] + : []), + path.resolve(__dirname, "fixtures/buildDependencies/run.js"), + n, + JSON.stringify(options) + ], + { + stdio: ["ignore", "pipe", "pipe"] + } + ); + const chunks = []; + p.stderr.on("data", chunk => chunks.push(chunk)); + p.stdout.on("data", chunk => chunks.push(chunk)); + p.once("exit", code => { + const errors = []; + const warnings = []; + const rawStdout = chunks.join(""); + const stdout = rawStdout.replace( + // This warning is expected + /<([ew])> \[.+\n(?:<([ew])> [^[].+\n)*/g, + (message, type) => { + (type === "e" ? errors : warnings).push(message); + return ""; + } + ); + if (errors.length > 0) { + return reject( + new Error( + `Unexpected errors in ${n} output:\n${errors.join( + "\n" + )}\n\n${rawStdout}` + ) + ); + } + for (const regexp of options.warnings || []) { + const idx = warnings.findIndex(w => regexp.test(w)); + if (idx < 0) { + return reject( + new Error( + `Warning ${regexp} was not found in ${n} output:\n${rawStdout}` + ) + ); + } + warnings.splice(idx, 1); + } + if (warnings.length > 0) { + return reject( + new Error( + `Unexpected warnings in ${n} output:\n${warnings.join( + "\n" + )}\n\n${rawStdout}` + ) + ); + } + if (code === 0) { + if (!options.ignoreErrors && /<[ew]>/.test(stdout)) + return reject(new Error(stdout)); + resolve(stdout); + } else { + reject(new Error(`Code ${code}: ${stdout}`)); + } + }); + p.once("error", err => { + const stdout = chunks.join(""); + console.log(stdout); + reject(err); + }); + }); + +const supportsEsm = Number(process.versions.modules) >= 83; + +describe("BuildDependencies", () => { + beforeEach(done => { + rimraf(cacheDirectory, done); + }); + beforeEach(done => { + rimraf(outputDirectory, done); + }); + + beforeEach(done => { + rimraf(inputDirectory, done); + }); + beforeEach(done => { + fs.mkdir(inputDirectory, { recursive: true }, done); + }); + it("should capture loader and config dependencies", async () => { + fs.writeFileSync( + path.resolve(inputDirectory, "package.json"), + JSON.stringify({ + name: "yep", + version: "1.0.0" + }) + ); + fs.writeFileSync( + path.resolve(inputDirectory, "loader-dependency.js"), + "module.exports = 0;" + ); + fs.writeFileSync( + path.resolve(inputDirectory, "config-dependency.js"), + "module.exports = 0;" + ); + fs.writeFileSync( + path.resolve(inputDirectory, "esm-dependency.js"), + "module.exports = 0;" + ); + fs.writeFileSync( + path.resolve(inputDirectory, "esm-async-dependency.mjs"), + `import path from "node:path"; +import vm from "vm"; + +async function preload() { + await import(\`markdown-wasm/dist/markdown-node.js\`); + await import("markdown-wasm/dist/markdown-node.js"); + await import('markdown-wasm/dist/markdown-node.js'); + await import('test-"/test'); + await import(\`test-"/test\`); +} + +export default 0;` + ); + await exec("0", { + invalidBuildDependencies: true, + buildTwice: true, + warnings: [/Can't resolve 'should-fail-resolving'/] + }); + fs.writeFileSync( + path.resolve(inputDirectory, "loader-dependency.js"), + "module.exports = 1;" + ); + fs.writeFileSync( + path.resolve(inputDirectory, "config-dependency.js"), + "module.exports = 1;" + ); + fs.writeFileSync( + path.resolve(inputDirectory, "esm-dependency.js"), + "module.exports = 1;" + ); + await exec("1", { + warnings: supportsEsm && [ + /Managed item .+dep-without-package\.json isn't a directory or doesn't contain a package\.json/ + ] + }); + fs.writeFileSync( + path.resolve(inputDirectory, "loader-dependency.js"), + "module.exports = Date.now();" + ); + const now1 = Date.now(); + const output2 = await exec("2", { + warnings: supportsEsm && [ + /Managed item .+dep-without-package\.json isn't a directory or doesn't contain a package\.json/ + ] + }); + expect(output2).toMatch(/but build dependencies have changed/); + expect(output2).toMatch(/Captured build dependencies/); + expect(output2).not.toMatch(/Assuming/); + expect(output2).not.toMatch(//); + const output3 = await exec("3"); + expect(output3).not.toMatch(/resolving of build dependencies is invalid/); + expect(output3).not.toMatch(/but build dependencies have changed/); + expect(output3).not.toMatch(/Captured build dependencies/); + expect(output3).not.toMatch(/Assuming/); + expect(output3).not.toMatch(//); + fs.writeFileSync( + path.resolve(inputDirectory, "package.json"), + JSON.stringify({ + name: "other", + version: "2.0.0" + }) + ); + const output4 = await exec("4", { + warnings: supportsEsm && [ + /Managed item .+dep-without-package\.json isn't a directory or doesn't contain a package\.json/ + ] + }); + expect(output4).toMatch(/resolving of build dependencies is invalid/); + expect(output4).not.toMatch(/but build dependencies have changed/); + expect(output4).toMatch(/Captured build dependencies/); + fs.writeFileSync( + path.resolve(inputDirectory, "config-dependency"), + "module.exports = Date.now();" + ); + const now2 = Date.now(); + await exec("5", { + warnings: supportsEsm && [ + /Managed item .+dep-without-package\.json isn't a directory or doesn't contain a package\.json/ + ] + }); + const now3 = Date.now(); + await exec("6"); + await exec("7", { + definedValue: "other" + }); + let now4; + let now5; + if (supportsEsm) { + fs.writeFileSync( + path.resolve(inputDirectory, "esm-dependency.js"), + "module.exports = Date.now();" + ); + now4 = Date.now(); + await exec("8", { + definedValue: "other", + warnings: [ + /Managed item .+dep-without-package\.json isn't a directory or doesn't contain a package\.json/ + ] + }); + fs.writeFileSync( + path.resolve(inputDirectory, "esm-async-dependency.mjs"), + "export default Date.now();" + ); + now5 = Date.now(); + + await exec("9", { + definedValue: "other", + warnings: [ + /Managed item .+dep-without-package\.json isn't a directory or doesn't contain a package\.json/ + ] + }); + } + const results = Array.from({ length: supportsEsm ? 10 : 8 }).map((_, i) => + require(`./js/buildDeps/${i}/main.js`) + ); + for (const r of results) { + expect(typeof r.loader).toBe("number"); + expect(typeof r.config).toBe("number"); + expect(typeof r.uncached).toBe("number"); + expect(typeof r.definedValue).toBe("string"); + } + let result = results.shift(); + expect(result.loader).toBe(0); + expect(result.config).toBe(0); + if (supportsEsm) expect(result.esmConfig).toBe(0); + expect(result.uncached).toBe(0); + // 0 -> 1 should not cache at all because of invalid buildDeps + result = results.shift(); + expect(result.loader).toBe(1); + expect(result.config).toBe(1); + expect(result.esmConfig).toBe(1); + expect(result.uncached).toBe(1); + // 1 -> 2 should be invalidated + result = results.shift(); + expect(result.loader).toBeGreaterThan(now1); + expect(result.config).toBe(1); + expect(result.esmConfig).toBe(1); + expect(result.uncached).toBe(1); + // 2 -> 3 should stay cached + let prevResult = result; + result = results.shift(); + expect(result.loader).toBe(prevResult.loader); + expect(result.config).toBe(1); + expect(result.esmConfig).toBe(1); + expect(result.uncached).toBe(1); + // 3 -> 4 should stay cached + prevResult = result; + result = results.shift(); + expect(result.loader).toBe(prevResult.loader); + expect(result.config).toBe(1); + expect(result.esmConfig).toBe(1); + expect(result.uncached).toBe(1); + // 4 -> 5 should be invalidated + result = results.shift(); + expect(result.loader).toBeGreaterThan(now2); + expect(result.config).toBeGreaterThan(now2); + expect(result.esmConfig).toBe(1); + expect(result.uncached).toBe(result.config); + // 5 -> 6 should stay cached, but uncacheable module still rebuilds + prevResult = result; + result = results.shift(); + expect(result.loader).toBe(prevResult.loader); + expect(result.config).toBe(prevResult.config); + expect(result.uncached).toBeGreaterThan(now3); + // 6 -> 7 should stay cached, except the updated defined value + prevResult = result; + result = results.shift(); + expect(result.loader).toBe(prevResult.loader); + expect(result.config).toBe(prevResult.config); + expect(result.definedValue).toBe("other"); + if (supportsEsm) { + // 7 -> 8 should be invalidated + result = results.shift(); + expect(result.loader).toBeGreaterThan(now4); + expect(result.config).toBeGreaterThan(now4); + expect(result.esmConfig).toBeGreaterThan(now4); + expect(result.uncached).toBeGreaterThan(now4); + // 8 -> 9 should be invalidated + result = results.shift(); + expect(result.loader).toBeGreaterThan(now5); + expect(result.config).toBeGreaterThan(now5); + expect(result.esmConfig).toBeGreaterThan(now5); + expect(result.esmAsyncConfig).toBeGreaterThan(now5); + expect(result.uncached).toBeGreaterThan(now5); + } + }, 500000); +}); diff --git a/test/CachePlugin.unittest.js b/test/CachePlugin.unittest.js deleted file mode 100644 index c3985b8c454..00000000000 --- a/test/CachePlugin.unittest.js +++ /dev/null @@ -1,40 +0,0 @@ -"use strict"; - -const CachePlugin = require("../lib/CachePlugin"); - -describe("CachePlugin", () => { - let env; - - beforeEach(() => { - env = { - compilation: { - compiler: {}, - warnings: [] - } - }; - }); - - describe("applyMtime", () => { - beforeEach(() => (env.plugin = new CachePlugin())); - - it("sets file system accuracy to 1 for granular modification timestamp", () => { - env.plugin.applyMtime(1483819067001); - expect(env.plugin.FS_ACCURACY).toBe(1); - }); - - it("sets file system accuracy to 10 for moderately granular modification timestamp", () => { - env.plugin.applyMtime(1483819067004); - expect(env.plugin.FS_ACCURACY).toBe(10); - }); - - it("sets file system accuracy to 100 for moderately coarse modification timestamp", () => { - env.plugin.applyMtime(1483819067040); - expect(env.plugin.FS_ACCURACY).toBe(100); - }); - - it("sets file system accuracy to 1000 for coarse modification timestamp", () => { - env.plugin.applyMtime(1483819067400); - expect(env.plugin.FS_ACCURACY).toBe(1000); - }); - }); -}); diff --git a/test/CaseSensitiveModulesWarning.unittest.js b/test/CaseSensitiveModulesWarning.unittest.js deleted file mode 100644 index 98abfb85e0d..00000000000 --- a/test/CaseSensitiveModulesWarning.unittest.js +++ /dev/null @@ -1,63 +0,0 @@ -"use strict"; - -const CaseSensitiveModulesWarning = require("../lib/CaseSensitiveModulesWarning"); - -const createModule = function(identifier, numberOfReasons) { - const reasons = new Array(numberOfReasons || 0) - .fill(null) - .map((value, index) => { - return { - module: createModule(`${identifier}-reason-${index}`) - }; - }); - - return { - identifier: () => identifier, - reasons - }; -}; - -describe("CaseSensitiveModulesWarning", () => { - let myCaseSensitiveModulesWarning; - let modules; - - beforeEach(() => { - modules = [ - createModule("FOOBAR"), - createModule("FooBar", 1), - createModule("foobar", 2) - ]; - myCaseSensitiveModulesWarning = new CaseSensitiveModulesWarning(modules); - }); - - it("has the a name", () => { - expect(myCaseSensitiveModulesWarning.name).toBe( - "CaseSensitiveModulesWarning" - ); - }); - - it("has the a message", () => { - expect(myCaseSensitiveModulesWarning.message).toBe( - ` -There are multiple modules with names that only differ in casing. -This can lead to unexpected behavior when compiling on a filesystem with other case-semantic. -Use equal casing. Compare these module identifiers: -* FOOBAR -* FooBar - Used by 1 module(s), i. e. - FooBar-reason-0 -* foobar - Used by 2 module(s), i. e. - foobar-reason-0 -`.trim() - ); - }); - - it("has the an origin", () => { - expect(myCaseSensitiveModulesWarning.origin).toBe(modules[0]); - }); - - it("has the a module", () => { - expect(myCaseSensitiveModulesWarning.module).toBe(modules[0]); - }); -}); diff --git a/test/ChangesAndRemovals.test.js b/test/ChangesAndRemovals.test.js new file mode 100644 index 00000000000..e39c83fc27a --- /dev/null +++ b/test/ChangesAndRemovals.test.js @@ -0,0 +1,161 @@ +"use strict"; + +require("./helpers/warmup-webpack"); + +const path = require("path"); +const { createFsFromVolume, Volume } = require("memfs"); +const fs = require("graceful-fs"); +const rimraf = require("rimraf"); + +const createCompiler = config => { + const webpack = require(".."); + const compiler = webpack(config); + compiler.outputFileSystem = createFsFromVolume(new Volume()); + return compiler; +}; + +const tempFolderPath = path.join(__dirname, "ChangesAndRemovalsTemp"); +const tempFilePath = path.join(tempFolderPath, "temp-file.js"); +const tempFile2Path = path.join(tempFolderPath, "temp-file2.js"); + +const createSingleCompiler = () => + createCompiler({ + entry: tempFilePath, + output: { + path: tempFolderPath, + filename: "bundle.js" + } + }); + +const onceDone = (compiler, action) => { + let initial = true; + compiler.hooks.done.tap("ChangesAndRemovalsTest", () => { + if (!initial) return; + initial = false; + setTimeout(action, 1000); + }); +}; + +const getChanges = compiler => { + const modifiedFiles = compiler.modifiedFiles; + const removedFiles = compiler.removedFiles; + return { + removed: removedFiles && Array.from(removedFiles), + modified: modifiedFiles && Array.from(modifiedFiles) + }; +}; + +/** + * @param {(err?: unknown) => void} callback callback + */ +function cleanup(callback) { + rimraf(tempFolderPath, callback); +} + +/** + * @returns {void} + */ +function createFiles() { + fs.mkdirSync(tempFolderPath, { recursive: true }); + + fs.writeFileSync( + tempFilePath, + "module.exports = function temp() {return 'temp file';};\n require('./temp-file2')", + "utf-8" + ); + + fs.writeFileSync( + tempFile2Path, + "module.exports = function temp2() {return 'temp file 2';};", + "utf-8" + ); +} + +describe("ChangesAndRemovals", () => { + if (process.env.NO_WATCH_TESTS) { + // eslint-disable-next-line jest/no-disabled-tests + it.skip("watch tests excluded", () => {}); + return; + } + + jest.setTimeout(30000); + + beforeEach(done => { + cleanup(err => { + if (err) return done(err); + createFiles(); + // Wait 2.5s after creating the files, + // otherwise the newly-created files will trigger the webpack watch mode to re-compile. + setTimeout(done, 2500); + }); + }); + afterEach(cleanup); + + it("should not track modified/removed files during initial watchRun", done => { + const compiler = createSingleCompiler(); + const watchRunFinished = new Promise(resolve => { + compiler.hooks.watchRun.tap("ChangesAndRemovalsTest", compiler => { + expect(getChanges(compiler)).toEqual({ + removed: undefined, + modified: undefined + }); + resolve(); + }); + }); + const watcher = compiler.watch({ aggregateTimeout: 200 }, err => { + if (err) done(err); + }); + + watchRunFinished.then(() => { + watcher.close(done); + }); + }); + + it("should track modified files when they've been modified", done => { + const compiler = createSingleCompiler(); + let watcher; + + compiler.hooks.watchRun.tap("ChangesAndRemovalsTest", compiler => { + if (!watcher) return; + if (!compiler.modifiedFiles) return; + expect(getChanges(compiler)).toEqual({ + modified: [tempFilePath], + removed: [] + }); + watcher.close(done); + watcher = null; + }); + + watcher = compiler.watch({ aggregateTimeout: 200 }, err => { + if (err) done(err); + }); + + onceDone(compiler, () => { + fs.appendFileSync(tempFilePath, "\nlet x = 'file modified';"); + }); + }); + + it("should track removed file when removing file", done => { + const compiler = createSingleCompiler(); + let watcher; + + compiler.hooks.watchRun.tap("ChangesAndRemovalsTest", compiler => { + if (!watcher) return; + if (!compiler.modifiedFiles) return; + expect(getChanges(compiler)).toEqual({ + removed: [tempFilePath], + modified: [] + }); + watcher.close(done); + watcher = null; + }); + + watcher = compiler.watch({ aggregateTimeout: 200 }, err => { + if (err) done(err); + }); + + onceDone(compiler, () => { + fs.unlinkSync(tempFilePath); + }); + }); +}); diff --git a/test/Chunk.unittest.js b/test/Chunk.unittest.js index dab229ee6a9..726b9844cd2 100644 --- a/test/Chunk.unittest.js +++ b/test/Chunk.unittest.js @@ -1,4 +1,3 @@ -/* globals describe, it, beforeEach */ "use strict"; const Chunk = require("../lib/Chunk"); @@ -14,103 +13,13 @@ describe("Chunk", () => { expect(ChunkInstance.debugId).toBeGreaterThan(999); }); - it("returns a string with modules information", () => { - expect(ChunkInstance.toString()).toBe("Chunk[]"); - }); - it("should not be the initial instance", () => { expect(ChunkInstance.canBeInitial()).toBe(false); }); - describe("entry", () => { - it("returns an error if get entry", () => { - expect(() => { - ChunkInstance.entry; - }).toThrow("Chunk.entry was removed. Use hasRuntime()"); - }); - - it("returns an error if set an entry", () => { - expect(() => { - ChunkInstance.entry = 10; - }).toThrow("Chunk.entry was removed. Use hasRuntime()"); - }); - }); - - describe("initial", () => { - it("returns an error if get initial", () => { - expect(() => { - ChunkInstance.initial; - }).toThrow("Chunk.initial was removed. Use canBeInitial/isOnlyInitial()"); - }); - - it("returns an error if set an initial", () => { - expect(() => { - ChunkInstance.initial = 10; - }).toThrow("Chunk.initial was removed. Use canBeInitial/isOnlyInitial()"); - }); - }); - describe("hasRuntime", () => { it("returns false", () => { expect(ChunkInstance.hasRuntime()).toBe(false); }); }); - - describe("isEmpty", () => { - it("should NOT have any module by default", () => { - expect(ChunkInstance.isEmpty()).toBe(true); - }); - }); - - describe("size", () => { - it("should NOT have any module by default", () => { - expect( - ChunkInstance.size({ - chunkOverhead: 10, - entryChunkMultiplicator: 2 - }) - ).toBe(10); - }); - }); - - describe("removeModule", () => { - let module; - let removeChunkSpy; - - beforeEach(() => { - removeChunkSpy = jest.fn(); - module = { - removeChunk: removeChunkSpy - }; - }); - - describe("and the chunk does not contain this module", () => { - it("returns false", () => { - expect(ChunkInstance.removeModule(module)).toBe(false); - }); - }); - - describe("and the chunk does contain this module", () => { - beforeEach(() => { - ChunkInstance._modules = new Set([module]); - }); - - it("calls module.removeChunk with itself and returns true", () => { - expect(ChunkInstance.removeModule(module)).toBe(true); - - expect(removeChunkSpy.mock.calls.length).toBe(1); - expect(removeChunkSpy.mock.calls[0][0]).toBe(ChunkInstance); - }); - }); - - describe("getNumberOfGroups", () => { - beforeEach(() => { - ChunkInstance._groups = new Set(); - }); - - it("should return the number of chunk groups contained by the chunk", () => { - expect(ChunkInstance.getNumberOfGroups()).toBe(0); - }); - }); - }); }); diff --git a/test/Cli.basictest.js b/test/Cli.basictest.js new file mode 100644 index 00000000000..c1a7ad40f7c --- /dev/null +++ b/test/Cli.basictest.js @@ -0,0 +1,417 @@ +const { getArguments, processArguments } = require("../").cli; + +describe("Cli", () => { + it("should generate the correct cli flags", () => { + expect(getArguments()).toMatchSnapshot(); + }); + + it("should generate the correct cli flags with custom schema", () => { + const schema = { + title: "custom CLI options", + type: "object", + additionalProperties: false, + properties: { + "with-reset-description": { + type: "array", + items: { + type: "string" + }, + description: "original description", + cli: { + resetDescription: "custom reset" + } + }, + "with-cli-description": { + type: "string", + description: "original description", + cli: { + description: "description for CLI option" + } + }, + "with-negative-description": { + type: "boolean", + description: "original description", + cli: { + negatedDescription: "custom negative description" + } + }, + "with-both-cli-and-negative-description": { + type: "boolean", + description: "original description", + cli: { + description: "description for CLI option", + negatedDescription: "custom negative description" + } + } + } + }; + + expect(getArguments(schema)).toMatchSnapshot(); + }); + + const test = (name, values, config, fn) => { + it(`should correctly process arguments for ${name}`, () => { + const args = getArguments(); + const problems = processArguments(args, config, values); + fn(expect(problems || config)); + }); + }; + + test("none", {}, {}, e => e.toMatchInlineSnapshot("Object {}")); + + test("root boolean", { bail: true }, {}, e => + e.toMatchInlineSnapshot(` + Object { + "bail": true, + } + `) + ); + + test("root single item of multiple", { entry: "./a.js" }, {}, e => + e.toMatchInlineSnapshot(` + Object { + "entry": Array [ + "./a.js", + ], + } + `) + ); + + test( + "root single item of multiple with existing item", + { entry: "./a.js" }, + { entry: "./old.js" }, + e => + e.toMatchInlineSnapshot(` + Object { + "entry": Array [ + "./old.js", + "./a.js", + ], + } + `) + ); + + test( + "root single item of multiple with existing items", + { entry: "./a.js" }, + { entry: ["./old1.js", "./old2.js"] }, + e => + e.toMatchInlineSnapshot(` + Object { + "entry": Array [ + "./old1.js", + "./old2.js", + "./a.js", + ], + } + `) + ); + + test("root multiple items", { entry: ["./a.js", "./b.js"] }, {}, e => + e.toMatchInlineSnapshot(` + Object { + "entry": Array [ + "./a.js", + "./b.js", + ], + } + `) + ); + + test( + "root multiple items with existing item", + { entry: ["./a.js", "./b.js"] }, + { entry: "./old.js" }, + e => + e.toMatchInlineSnapshot(` + Object { + "entry": Array [ + "./old.js", + "./a.js", + "./b.js", + ], + } + `) + ); + + test( + "root multiple items with existing items", + { entry: ["./a.js", "./b.js"] }, + { entry: ["./old1.js", "./old2.js"] }, + e => + e.toMatchInlineSnapshot(` + Object { + "entry": Array [ + "./old1.js", + "./old2.js", + "./a.js", + "./b.js", + ], + } + `) + ); + + test("nested boolean", { "experiments-top-level-await": true }, {}, e => + e.toMatchInlineSnapshot(` + Object { + "experiments": Object { + "topLevelAwait": true, + }, + } + `) + ); + + test( + "nested regexp", + { "stats-warnings-filter": ["/module/", "path"] }, + {}, + e => + e.toMatchInlineSnapshot(` + Object { + "stats": Object { + "warningsFilter": Array [ + /module/, + "path", + ], + }, + } + `) + ); + + test( + "nested multiple", + { + "module-rules-test": ["/\\.css$/", "/\\.js$/"], + "module-rules-use": ["css-loader", "babel-loader"] + }, + {}, + e => + e.toMatchInlineSnapshot(` + Object { + "module": Object { + "rules": Array [ + Object { + "test": /\\\\\\.css\\$/, + "use": "css-loader", + }, + Object { + "test": /\\\\\\.js\\$/, + "use": "babel-loader", + }, + ], + }, + } + `) + ); + + test( + "reset array", + { + "stats-warnings-filter-reset": true, + "stats-warnings-filter": "path", + "module-rules-reset": true, + "module-rules-test": ["/\\.css$/", "/\\.js$/"], + "module-rules-use": ["css-loader", "babel-loader"] + }, + { + stats: { warningsFilter: [/a/, /b/] }, + module: { + rules: [ + { + test: /\.js$/, + use: "typescript-loader" + } + ] + } + }, + e => + e.toMatchInlineSnapshot(` + Object { + "module": Object { + "rules": Array [ + Object { + "test": /\\\\\\.css\\$/, + "use": "css-loader", + }, + Object { + "test": /\\\\\\.js\\$/, + "use": "babel-loader", + }, + ], + }, + "stats": Object { + "warningsFilter": Array [ + "path", + ], + }, + } + `) + ); + + test( + "numbers", + { + "watch-options-aggregate-timeout": 100, + "watch-options-poll": "100", + "output-chunk-load-timeout": "20000" + }, + {}, + e => + e.toMatchInlineSnapshot(` + Object { + "output": Object { + "chunkLoadTimeout": 20000, + }, + "watchOptions": Object { + "aggregateTimeout": 100, + "poll": 100, + }, + } + `) + ); + + test( + "booleans and enums", + { + "optimization-used-exports": true, + "output-compare-before-emit": false, + "output-iife": "true", + "output-library-name": ["hello", "world"], + "output-library-umd-named-define": "false", + "stats-logging": "verbose", + amd: "false" + }, + {}, + e => + e.toMatchInlineSnapshot(` + Object { + "amd": false, + "optimization": Object { + "usedExports": true, + }, + "output": Object { + "compareBeforeEmit": false, + "iife": true, + "library": Object { + "name": Array [ + "hello", + "world", + ], + "umdNamedDefine": false, + }, + }, + "stats": Object { + "logging": "verbose", + }, + } + `) + ); + + // cspell:ignore filsystem + test( + "errors", + { + "output-library-name": "non-object", + "resolve-loader-unsafe-cache": [true, false], + "output-chunk-load-timeout": "20000x", + "cache-type": "filsystem", + "entry-reset": false, + "module-unknown-context-reg-exp": "ab?c*", + "module-wrapped-context-reg-exp": 123, + "my-argument": true + }, + { + output: { + library: "hello" + } + }, + e => + e.toMatchInlineSnapshot(` + Array [ + Object { + "argument": "output-library-name", + "index": undefined, + "path": "output", + "type": "unexpected-non-object-in-path", + "value": "non-object", + }, + Object { + "argument": "resolve-loader-unsafe-cache", + "index": 0, + "path": "resolveLoader.unsafeCache", + "type": "multiple-values-unexpected", + "value": true, + }, + Object { + "argument": "resolve-loader-unsafe-cache", + "index": 1, + "path": "resolveLoader.unsafeCache", + "type": "multiple-values-unexpected", + "value": false, + }, + Object { + "argument": "output-chunk-load-timeout", + "expected": "number", + "index": undefined, + "path": "output.chunkLoadTimeout", + "type": "invalid-value", + "value": "20000x", + }, + Object { + "argument": "cache-type", + "expected": "memory", + "index": undefined, + "path": "cache.type", + "type": "invalid-value", + "value": "filsystem", + }, + Object { + "argument": "cache-type", + "expected": "filesystem", + "index": undefined, + "path": "cache.type", + "type": "invalid-value", + "value": "filsystem", + }, + Object { + "argument": "entry-reset", + "expected": "true (will reset the previous value to an empty array)", + "index": undefined, + "path": "entry", + "type": "invalid-value", + "value": false, + }, + Object { + "argument": "module-unknown-context-reg-exp", + "expected": "regular expression (example: /ab?c*/)", + "index": undefined, + "path": "module.unknownContextRegExp", + "type": "invalid-value", + "value": "ab?c*", + }, + Object { + "argument": "module-unknown-context-reg-exp", + "expected": "true | false", + "index": undefined, + "path": "module.unknownContextRegExp", + "type": "invalid-value", + "value": "ab?c*", + }, + Object { + "argument": "module-wrapped-context-reg-exp", + "expected": "regular expression (example: /ab?c*/)", + "index": undefined, + "path": "module.wrappedContextRegExp", + "type": "invalid-value", + "value": 123, + }, + Object { + "argument": "my-argument", + "path": "", + "type": "unknown-argument", + }, + ] + `) + ); +}); diff --git a/test/Compiler-caching.test.js b/test/Compiler-caching.test.js index 5c7ba0e8eb1..8a16769bd9c 100644 --- a/test/Compiler-caching.test.js +++ b/test/Compiler-caching.test.js @@ -1,46 +1,49 @@ -/* globals describe, it */ "use strict"; +require("./helpers/warmup-webpack"); + const path = require("path"); -const fs = require("fs"); +const fs = require("graceful-fs"); const rimraf = require("rimraf"); -const webpack = require("../"); -const WebpackOptionsDefaulter = require("../lib/WebpackOptionsDefaulter"); let fixtureCount = 0; describe("Compiler (caching)", () => { jest.setTimeout(15000); function compile(entry, options, callback) { + const webpack = require(".."); + options = webpack.config.getNormalizedWebpackOptions(options); options.mode = "none"; - options = new WebpackOptionsDefaulter().process(options); options.cache = true; options.entry = entry; + options.optimization.moduleIds = "natural"; options.optimization.minimize = false; options.context = path.join(__dirname, "fixtures"); options.output.path = "/"; options.output.filename = "bundle.js"; options.output.pathinfo = true; const logs = { - mkdirp: [], + mkdir: [], writeFile: [] }; const c = webpack(options); const files = {}; c.outputFileSystem = { - join() { - return [].join.call(arguments, "/").replace(/\/+/g, "/"); - }, - mkdirp(path, callback) { - logs.mkdirp.push(path); - callback(); + mkdir(path, callback) { + logs.mkdir.push(path); + const err = new Error(); + err.code = "EEXIST"; + callback(err); }, writeFile(name, content, callback) { logs.writeFile.push(name, content); files[name] = content.toString("utf-8"); callback(); + }, + stat(path, callback) { + callback(new Error("ENOENT")); } }; c.hooks.compilation.tap( @@ -67,11 +70,9 @@ describe("Compiler (caching)", () => { expect(Array.isArray(stats.errors)).toBe(true); if (options.expectErrors) { expect(stats.errors).toHaveLength(options.expectErrors); - } else { - if (stats.errors.length > 0) { - expect(typeof stats.errors[0]).toBe("string"); - throw new Error(stats.errors[0]); - } + } else if (stats.errors.length > 0) { + expect(typeof stats.errors[0]).toBe("string"); + throw new Error(stats.errors[0]); } stats.logs = logs; callback(stats, files, compilerIteration++); @@ -92,6 +93,9 @@ describe("Compiler (caching)", () => { "temp-cache-fixture" ); + /** + * @returns {void} + */ function cleanup() { rimraf.sync(`${tempFixturePath}-*`); } @@ -99,6 +103,9 @@ describe("Compiler (caching)", () => { beforeAll(cleanup); afterAll(cleanup); + /** + * @returns {{ rootPath: string, aFilepath: string, cFilepath: string }} temp fixture paths + */ function createTempFixture() { const fixturePath = `${tempFixturePath}-${fixtureCount}`; const aFilepath = path.join(fixturePath, "a.js"); @@ -109,22 +116,18 @@ describe("Compiler (caching)", () => { // Copy over file since we"ll be modifying some of them fs.mkdirSync(fixturePath); - fs.createReadStream(path.join(__dirname, "fixtures", "a.js")).pipe( - fs.createWriteStream(aFilepath) - ); - fs.createReadStream(path.join(__dirname, "fixtures", "c.js")).pipe( - fs.createWriteStream(cFilepath) - ); + fs.copyFileSync(path.join(__dirname, "fixtures", "a.js"), aFilepath); + fs.copyFileSync(path.join(__dirname, "fixtures", "c.js"), cFilepath); fixtureCount++; return { rootPath: fixturePath, - aFilepath: aFilepath, - cFilepath: cFilepath + aFilepath, + cFilepath }; } - it("should cache single file (with manual 1s wait) ", done => { + it("should cache single file (with manual 1s wait)", done => { const options = {}; const tempFixture = createTempFixture(); @@ -158,7 +161,7 @@ describe("Compiler (caching)", () => { }); }); - it("should cache single file (even with no timeout) ", done => { + it("should cache single file (even with no timeout)", done => { const options = {}; const tempFixture = createTempFixture(); diff --git a/test/Compiler-filesystem-caching.test.js b/test/Compiler-filesystem-caching.test.js new file mode 100644 index 00000000000..a3367e9c123 --- /dev/null +++ b/test/Compiler-filesystem-caching.test.js @@ -0,0 +1,273 @@ +"use strict"; + +require("./helpers/warmup-webpack"); + +const path = require("path"); +const fs = require("graceful-fs"); +const rimraf = require("rimraf"); + +let fixtureCount = 0; + +describe("Compiler (filesystem caching)", () => { + jest.setTimeout(5000); + + const tempFixturePath = path.join( + __dirname, + "fixtures", + "temp-filesystem-cache-fixture" + ); + + function compile(entry, onSuccess, onError) { + const webpack = require(".."); + const options = webpack.config.getNormalizedWebpackOptions({}); + options.cache = { + type: "filesystem", + cacheDirectory: path.join(tempFixturePath, "cache") + }; + options.entry = entry; + options.context = path.join(__dirname, "fixtures"); + options.output.path = path.join(tempFixturePath, "dist"); + options.output.filename = "bundle.js"; + options.output.pathinfo = true; + options.module = { + rules: [ + { + test: /\.svg$/, + type: "asset/resource", + use: { + loader: require.resolve("./fixtures/empty-svg-loader") + } + } + ] + }; + + const isBigIntSupported = typeof BigInt !== "undefined"; + const isErrorCaseSupported = + typeof new Error("test", { cause: new Error("cause") }).cause !== + "undefined"; + const isAggregateErrorSupported = typeof AggregateError !== "undefined"; + + options.plugins = [ + { + apply(compiler) { + const name = "TestCachePlugin"; + + compiler.hooks.thisCompilation.tap(name, compilation => { + compilation.hooks.processAssets.tapPromise( + { + name, + stage: + compiler.webpack.Compilation + .PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE + }, + async () => { + const cache = compilation.getCache(name); + const ident = "test.ext"; + const cacheItem = cache.getItemCache(ident, null); + + const result = await cacheItem.getPromise(ident); + + if (result) { + expect(result.number).toEqual(42); + expect(result.number1).toEqual(3.14); + expect(result.number2).toEqual(6.2); + expect(result.string).toEqual("string"); + + if (isErrorCaseSupported) { + expect(result.error.cause.message).toEqual("cause"); + expect(result.error1.cause.string).toBe("string"); + expect(result.error1.cause.number).toBe(42); + } + + if (isAggregateErrorSupported) { + expect(result.aggregateError.errors).toEqual([ + new Error("first", { cause: "nested cause" }), + "second" + ]); + expect(result.aggregateError.message).toEqual( + "aggregate error" + ); + expect(result.aggregateError.cause.message).toBe("cause"); + } + + if (isBigIntSupported) { + expect(result.bigint).toEqual(5n); + expect(result.bigint1).toEqual(124n); + expect(result.bigint2).toEqual(125n); + expect(result.bigint3).toEqual(12345678901234567890n); + expect(result.bigint4).toEqual(5n); + expect(result.bigint5).toEqual(1000000n); + expect(result.bigint6).toEqual(128n); + expect(result.bigint7).toEqual(2147483647n); + expect(result.obj.foo).toBe(BigInt(-10)); + expect(Array.from(result.set)).toEqual([ + BigInt(1), + BigInt(2) + ]); + expect(result.arr).toEqual([256n, 257n, 258n]); + } + + return; + } + + const storeValue = {}; + + storeValue.number = 42; + storeValue.number1 = 3.14; + storeValue.number2 = 6.2; + storeValue.string = "string"; + + if (isErrorCaseSupported) { + storeValue.error = new Error("error", { + cause: new Error("cause") + }); + storeValue.error1 = new Error("error", { + cause: { string: "string", number: 42 } + }); + } + + if (isAggregateErrorSupported) { + storeValue.aggregateError = new AggregateError( + [new Error("first", { cause: "nested cause" }), "second"], + "aggregate error", + { cause: new Error("cause") } + ); + } + + if (isBigIntSupported) { + storeValue.bigint = BigInt(5); + storeValue.bigint1 = BigInt(124); + storeValue.bigint2 = BigInt(125); + storeValue.bigint3 = 12345678901234567890n; + storeValue.bigint4 = 5n; + storeValue.bigint5 = 1000000n; + storeValue.bigint6 = 128n; + storeValue.bigint7 = 2147483647n; + storeValue.obj = { foo: BigInt(-10) }; + storeValue.set = new Set([BigInt(1), BigInt(2)]); + storeValue.arr = [256n, 257n, 258n]; + } + + await cacheItem.storePromise(storeValue); + } + ); + }); + } + } + ]; + + function runCompiler(onSuccess, onError) { + const c = webpack(options); + c.hooks.compilation.tap( + "CompilerCachingTest", + compilation => (compilation.bail = true) + ); + c.run((err, stats) => { + if (err) throw err; + expect(typeof stats).toBe("object"); + stats = stats.toJson({ + modules: true, + reasons: true + }); + expect(typeof stats).toBe("object"); + expect(stats).toHaveProperty("errors"); + expect(Array.isArray(stats.errors)).toBe(true); + if (stats.errors.length > 0) { + onError(new Error(JSON.stringify(stats.errors, null, 4))); + } + c.close(() => { + onSuccess(stats); + }); + }); + } + + runCompiler(onSuccess, onError); + + return { + runAgain: runCompiler + }; + } + + /** + * @returns {void} + */ + function cleanup() { + rimraf.sync(`${tempFixturePath}*`); + } + + beforeAll(cleanup); + afterAll(cleanup); + + /** + * @returns {{ rootPath: string, usesAssetFilepath: string, svgFilepath: string }} temp fixture paths + */ + function createTempFixture() { + const fixturePath = `${tempFixturePath}-${fixtureCount}`; + const usesAssetFilepath = path.join(fixturePath, "uses-asset.js"); + const svgFilepath = path.join(fixturePath, "file.svg"); + + // Remove previous copy if present + rimraf.sync(fixturePath); + + // Copy over file since we"ll be modifying some of them + fs.mkdirSync(fixturePath); + fs.copyFileSync( + path.join(__dirname, "fixtures", "uses-asset.js"), + usesAssetFilepath + ); + fs.copyFileSync(path.join(__dirname, "fixtures", "file.svg"), svgFilepath); + + fixtureCount++; + return { + rootPath: fixturePath, + usesAssetFilepath, + svgFilepath + }; + } + + it("should compile again when cached asset has changed but loader output remains the same", done => { + const tempFixture = createTempFixture(); + + const onError = error => done(error); + + const helper = compile( + tempFixture.usesAssetFilepath, + stats => { + // Not cached the first time + expect(stats.assets[0].name).toBe("bundle.js"); + expect(stats.assets[0].emitted).toBe(true); + + expect(stats.assets[1].name).toMatch(/\w+\.svg$/); + expect(stats.assets[0].emitted).toBe(true); + + helper.runAgain(stats => { + // Cached the second run + expect(stats.assets[0].name).toBe("bundle.js"); + expect(stats.assets[0].emitted).toBe(false); + + expect(stats.assets[1].name).toMatch(/\w+\.svg$/); + expect(stats.assets[0].emitted).toBe(false); + + const svgContent = fs + .readFileSync(tempFixture.svgFilepath) + .toString() + .replace("icon-square-small", "icon-square-smaller"); + + fs.writeFileSync(tempFixture.svgFilepath, svgContent); + + helper.runAgain(stats => { + // Still cached after file modification because loader always returns empty + expect(stats.assets[0].name).toBe("bundle.js"); + expect(stats.assets[0].emitted).toBe(false); + + expect(stats.assets[1].name).toMatch(/\w+\.svg$/); + expect(stats.assets[0].emitted).toBe(false); + + done(); + }, onError); + }, onError); + }, + onError + ); + }); +}); diff --git a/test/Compiler.test.js b/test/Compiler.test.js index e0f50145960..baebf9aadf6 100644 --- a/test/Compiler.test.js +++ b/test/Compiler.test.js @@ -1,18 +1,20 @@ -/* globals describe, it */ "use strict"; -const path = require("path"); +require("./helpers/warmup-webpack"); -const webpack = require("../"); -const WebpackOptionsDefaulter = require("../lib/WebpackOptionsDefaulter"); -const MemoryFs = require("memory-fs"); +const path = require("path"); +const Stats = require("../lib/Stats"); +const { createFsFromVolume, Volume } = require("memfs"); +const captureStdio = require("./helpers/captureStdio"); +const deprecationTracking = require("./helpers/deprecationTracking"); describe("Compiler", () => { jest.setTimeout(20000); function compile(entry, options, callback) { const noOutputPath = !options.output || !options.output.path; + const webpack = require(".."); + options = webpack.config.getNormalizedWebpackOptions(options); if (!options.mode) options.mode = "production"; - options = new WebpackOptionsDefaulter().process(options); options.entry = entry; options.context = path.join(__dirname, "fixtures"); if (noOutputPath) options.output.path = "/"; @@ -21,24 +23,26 @@ describe("Compiler", () => { minimize: false }; const logs = { - mkdirp: [], + mkdir: [], writeFile: [] }; const c = webpack(options); const files = {}; c.outputFileSystem = { - join() { - return [].join.call(arguments, "/").replace(/\/+/g, "/"); - }, - mkdirp(path, callback) { - logs.mkdirp.push(path); - callback(); + mkdir(path, callback) { + logs.mkdir.push(path); + const err = new Error(); + err.code = "EEXIST"; + callback(err); }, writeFile(name, content, callback) { logs.writeFile.push(name, content); files[name] = content.toString("utf-8"); callback(); + }, + stat(path, callback) { + callback(new Error("ENOENT")); } }; c.hooks.compilation.tap( @@ -61,10 +65,23 @@ describe("Compiler", () => { throw stats.errors[0]; } stats.logs = logs; - callback(stats, files, compilation); + c.close(err => { + if (err) return callback(err); + callback(stats, files, compilation); + }); }); } + let compiler; + afterEach(callback => { + if (compiler) { + compiler.close(callback); + compiler = undefined; + } else { + callback(); + } + }); + it("should compile a single file to deep output", done => { compile( "./c", @@ -75,7 +92,7 @@ describe("Compiler", () => { } }, (stats, files) => { - expect(stats.logs.mkdirp).toEqual(["/what", "/what/the"]); + expect(stats.logs.mkdir).toEqual(["/what", "/what/the"]); done(); } ); @@ -86,7 +103,7 @@ describe("Compiler", () => { expect(Object.keys(files)).toEqual(["/main.js"]); const bundle = files["/main.js"]; expect(bundle).toMatch("function __webpack_require__("); - expect(bundle).toMatch(/__webpack_require__\(\/\*! \.\/a \*\/ \d\);/); + expect(bundle).toMatch(/__webpack_require__\(\/\*! \.\/a \*\/ \w+\);/); expect(bundle).toMatch("./c.js"); expect(bundle).toMatch("./a.js"); expect(bundle).toMatch("This is a"); @@ -146,9 +163,9 @@ describe("Compiler", () => { it("should compile a file with multiple chunks", done => { compile("./chunks", {}, (stats, files) => { expect(stats.chunks).toHaveLength(2); - expect(Object.keys(files)).toEqual(["/main.js", "/1.js"]); + expect(Object.keys(files)).toEqual(["/main.js", "/78.js"]); const bundle = files["/main.js"]; - const chunk = files["/1.js"]; + const chunk = files["/78.js"]; expect(bundle).toMatch("function __webpack_require__("); expect(bundle).toMatch("__webpack_require__(/*! ./b */"); expect(chunk).not.toMatch("__webpack_require__(/* ./b */"); @@ -162,23 +179,59 @@ describe("Compiler", () => { expect(bundle).not.toMatch("4: function("); expect(bundle).not.toMatch("fixtures"); expect(chunk).not.toMatch("fixtures"); - expect(bundle).toMatch("webpackJsonp"); - expect(chunk).toMatch('window["webpackJsonp"] || []).push'); + expect(bundle).toMatch("webpackChunk"); + expect(chunk).toMatch('self["webpackChunk"] || []).push'); done(); }); }); + + // cspell:word asmjs + it("should not evaluate constants in asm.js", done => { + compile("./asmjs", {}, (stats, files) => { + expect(Object.keys(files)).toEqual(["/main.js"]); + const bundle = files["/main.js"]; + expect(bundle).toMatch('"use asm";'); + expect(bundle).toMatch("101"); + expect(bundle).toMatch("102"); + expect(bundle).toMatch("103"); + expect(bundle).toMatch("104"); + expect(bundle).toMatch("105"); + expect(bundle).not.toMatch("106"); + expect(bundle).not.toMatch("107"); + expect(bundle).not.toMatch("108"); + expect(bundle).toMatch("109"); + expect(bundle).toMatch("110"); + done(); + }); + }); + describe("methods", () => { let compiler; beforeEach(() => { + const webpack = require(".."); compiler = webpack({ entry: "./c", context: path.join(__dirname, "fixtures"), output: { - path: "/", + path: "/directory", pathinfo: true } }); }); + afterEach(callback => { + if (compiler) { + compiler.close(callback); + compiler = undefined; + } else { + callback(); + } + }); + it("default platform info", done => { + const platform = compiler.platform; + expect(platform.web).toBe(true); + expect(platform.node).toBe(false); + done(); + }); describe("purgeInputFileSystem", () => { it("invokes purge() if inputFileSystem.purge", done => { const mockPurge = jest.fn(); @@ -233,24 +286,48 @@ describe("Compiler", () => { const response8 = compiler.isChild(); expect(response8).toBe(false); - compiler.parentCompilation = NaN; + compiler.parentCompilation = Number.NaN; const response9 = compiler.isChild(); expect(response9).toBe(false); done(); }); }); }); - it("should not emit on errors", done => { + + it("PlatformPlugin", done => { + const webpack = require(".."); const compiler = webpack({ + entry: "./c", + context: path.join(__dirname, "fixtures"), + output: { + path: "/directory" + }, + plugins: [ + new (require("../lib/PlatformPlugin"))({ node: true }), + compiler => { + compiler.hooks.afterEnvironment.tap("test", () => { + const platform = compiler.platform; + expect(platform.node).toBe(true); + expect(platform.web).toBe(true); + }); + } + ] + }); + compiler.close(done); + }); + + it("should not emit on errors", done => { + const webpack = require(".."); + compiler = webpack({ context: __dirname, mode: "production", entry: "./missing", output: { - path: "/", + path: "/directory", filename: "bundle.js" } }); - compiler.outputFileSystem = new MemoryFs(); + compiler.outputFileSystem = createFsFromVolume(new Volume()); compiler.run((err, stats) => { if (err) return done(err); if (compiler.outputFileSystem.existsSync("/bundle.js")) @@ -258,17 +335,83 @@ describe("Compiler", () => { done(); }); }); + it("should bubble up errors when wrapped in a promise and bail is true", async () => { + let errored; + try { + const createCompiler = options => + new Promise((resolve, reject) => { + const webpack = require(".."); + const c = webpack(options); + c.run((err, stats) => { + if (err) { + reject(err); + } + if (stats !== undefined && "errors" in stats) { + reject(err); + } else { + resolve(stats); + } + }); + }); + compiler = await createCompiler({ + context: __dirname, + mode: "production", + entry: "./missing-file", + output: { + path: "/directory", + filename: "bundle.js" + }, + bail: true + }); + } catch (err) { + errored = err; + } + + if (!errored) { + throw new Error("Should throw an error"); + } + + expect(errored.toString()).toMatch( + "ModuleNotFoundError: Module not found: Error: Can't resolve './missing-file'" + ); + }); + it("should not emit compilation errors in async (watch)", async () => { + const createStats = options => + new Promise((resolve, reject) => { + const webpack = require(".."); + const c = webpack(options); + c.outputFileSystem = createFsFromVolume(new Volume()); + const watching = c.watch({}, (err, stats) => { + watching.close(() => { + if (err) return reject(err); + resolve(stats); + }); + }); + }); + const stats = await createStats({ + context: __dirname, + mode: "production", + entry: "./missing-file", + output: { + path: "/directory", + filename: "bundle.js" + } + }); + expect(stats).toBeInstanceOf(Stats); + }); + it("should not emit on errors (watch)", done => { - const compiler = webpack({ + const webpack = require(".."); + compiler = webpack({ context: __dirname, mode: "production", entry: "./missing", output: { - path: "/", + path: "/directory", filename: "bundle.js" } }); - compiler.outputFileSystem = new MemoryFs(); + compiler.outputFileSystem = createFsFromVolume(new Volume()); const watching = compiler.watch({}, (err, stats) => { watching.close(); if (err) return done(err); @@ -277,17 +420,18 @@ describe("Compiler", () => { done(); }); }); - it("should not be run twice at a time (run)", function(done) { - const compiler = webpack({ + it("should not be running twice at a time (run)", done => { + const webpack = require(".."); + compiler = webpack({ context: __dirname, mode: "production", entry: "./c", output: { - path: "/", + path: "/directory", filename: "bundle.js" } }); - compiler.outputFileSystem = new MemoryFs(); + compiler.outputFileSystem = createFsFromVolume(new Volume()); compiler.run((err, stats) => { if (err) return done(err); }); @@ -295,17 +439,18 @@ describe("Compiler", () => { if (err) return done(); }); }); - it("should not be run twice at a time (watch)", function(done) { - const compiler = webpack({ + it("should not be running twice at a time (watch)", done => { + const webpack = require(".."); + compiler = webpack({ context: __dirname, mode: "production", entry: "./c", output: { - path: "/", + path: "/directory", filename: "bundle.js" } }); - compiler.outputFileSystem = new MemoryFs(); + compiler.outputFileSystem = createFsFromVolume(new Volume()); compiler.watch({}, (err, stats) => { if (err) return done(err); }); @@ -313,17 +458,18 @@ describe("Compiler", () => { if (err) return done(); }); }); - it("should not be run twice at a time (run - watch)", function(done) { - const compiler = webpack({ + it("should not be running twice at a time (run - watch)", done => { + const webpack = require(".."); + compiler = webpack({ context: __dirname, mode: "production", entry: "./c", output: { - path: "/", + path: "/directory", filename: "bundle.js" } }); - compiler.outputFileSystem = new MemoryFs(); + compiler.outputFileSystem = createFsFromVolume(new Volume()); compiler.run((err, stats) => { if (err) return done(err); }); @@ -331,17 +477,18 @@ describe("Compiler", () => { if (err) return done(); }); }); - it("should not be run twice at a time (watch - run)", function(done) { - const compiler = webpack({ + it("should not be running twice at a time (watch - run)", done => { + const webpack = require(".."); + compiler = webpack({ context: __dirname, mode: "production", entry: "./c", output: { - path: "/", + path: "/directory", filename: "bundle.js" } }); - compiler.outputFileSystem = new MemoryFs(); + compiler.outputFileSystem = createFsFromVolume(new Volume()); compiler.watch({}, (err, stats) => { if (err) return done(err); }); @@ -349,75 +496,80 @@ describe("Compiler", () => { if (err) return done(); }); }); - it("should not be run twice at a time (instance cb)", function(done) { - const compiler = webpack( + it("should not be running twice at a time (instance cb)", done => { + const webpack = require(".."); + compiler = webpack( { context: __dirname, mode: "production", entry: "./c", output: { - path: "/", + path: "/directory", filename: "bundle.js" } }, () => {} ); - compiler.outputFileSystem = new MemoryFs(); + compiler.outputFileSystem = createFsFromVolume(new Volume()); compiler.run((err, stats) => { if (err) return done(); }); }); - it("should run again correctly after first compilation", function(done) { - const compiler = webpack({ + it("should run again correctly after first compilation", done => { + const webpack = require(".."); + compiler = webpack({ context: __dirname, mode: "production", entry: "./c", output: { - path: "/", + path: "/directory", filename: "bundle.js" } }); - compiler.outputFileSystem = new MemoryFs(); - compiler.run((err, stats) => { + compiler.outputFileSystem = createFsFromVolume(new Volume()); + compiler.run((err, stats1) => { if (err) return done(err); - compiler.run((err, stats) => { + compiler.run((err, stats2) => { if (err) return done(err); + expect(stats1.toString({ all: true })).toBeTypeOf("string"); done(); }); }); }); - it("should watch again correctly after first compilation", function(done) { - const compiler = webpack({ + it("should watch again correctly after first compilation", done => { + const webpack = require(".."); + compiler = webpack({ context: __dirname, mode: "production", entry: "./c", output: { - path: "/", + path: "/directory", filename: "bundle.js" } }); - compiler.outputFileSystem = new MemoryFs(); + compiler.outputFileSystem = createFsFromVolume(new Volume()); compiler.run((err, stats) => { if (err) return done(err); - compiler.watch({}, (err, stats) => { + const watching = compiler.watch({}, (err, stats) => { if (err) return done(err); - done(); + watching.close(done); }); }); }); - it("should run again correctly after first closed watch", function(done) { - const compiler = webpack({ + it("should run again correctly after first closed watch", done => { + const webpack = require(".."); + compiler = webpack({ context: __dirname, mode: "production", entry: "./c", output: { - path: "/", + path: "/directory", filename: "bundle.js" } }); - compiler.outputFileSystem = new MemoryFs(); + compiler.outputFileSystem = createFsFromVolume(new Volume()); const watching = compiler.watch({}, (err, stats) => { if (err) return done(err); }); @@ -428,17 +580,36 @@ describe("Compiler", () => { }); }); }); - it("should watch again correctly after first closed watch", function(done) { - const compiler = webpack({ + it("should set compiler.watching correctly", function (done) { + const webpack = require(".."); + compiler = webpack({ context: __dirname, mode: "production", entry: "./c", output: { - path: "/", + path: "/directory", filename: "bundle.js" } }); - compiler.outputFileSystem = new MemoryFs(); + compiler.outputFileSystem = createFsFromVolume(new Volume()); + const watching = compiler.watch({}, (err, stats) => { + if (err) return done(err); + watching.close(done); + }); + expect(compiler.watching).toBe(watching); + }); + it("should watch again correctly after first closed watch", done => { + const webpack = require(".."); + compiler = webpack({ + context: __dirname, + mode: "production", + entry: "./c", + output: { + path: "/directory", + filename: "bundle.js" + } + }); + compiler.outputFileSystem = createFsFromVolume(new Volume()); const watching = compiler.watch({}, (err, stats) => { if (err) return done(err); }); @@ -449,18 +620,162 @@ describe("Compiler", () => { }); }); }); - it("should flag watchMode as true in watch", function(done) { - const compiler = webpack({ + it("should run again correctly inside afterDone hook", done => { + const webpack = require(".."); + compiler = webpack({ + context: __dirname, + mode: "production", + entry: "./c", + output: { + path: "/directory", + filename: "bundle.js" + } + }); + compiler.outputFileSystem = createFsFromVolume(new Volume()); + let once = true; + compiler.hooks.afterDone.tap("RunAgainTest", () => { + if (!once) return; + once = false; + compiler.run((err, stats) => { + if (err) return done(err); + done(); + }); + }); + compiler.run((err, stats) => { + if (err) return done(err); + }); + }); + it("should call afterDone hook after other callbacks (run)", done => { + const webpack = require(".."); + compiler = webpack({ + context: __dirname, + mode: "production", + entry: "./c", + output: { + path: "/directory", + filename: "bundle.js" + } + }); + compiler.outputFileSystem = createFsFromVolume(new Volume()); + const runCb = jest.fn(); + const doneHookCb = jest.fn(); + compiler.hooks.done.tap("afterDoneRunTest", doneHookCb); + compiler.hooks.afterDone.tap("afterDoneRunTest", () => { + expect(runCb).toHaveBeenCalled(); + expect(doneHookCb).toHaveBeenCalled(); + done(); + }); + compiler.run((err, stats) => { + if (err) return done(err); + runCb(); + }); + }); + it("should call afterDone hook after other callbacks (instance cb)", done => { + const instanceCb = jest.fn(); + const webpack = require(".."); + compiler = webpack( + { + context: __dirname, + mode: "production", + entry: "./c", + output: { + path: "/directory", + filename: "bundle.js" + } + }, + (err, stats) => { + if (err) return done(err); + instanceCb(); + } + ); + compiler.outputFileSystem = createFsFromVolume(new Volume()); + const doneHookCb = jest.fn(); + compiler.hooks.done.tap("afterDoneRunTest", doneHookCb); + compiler.hooks.afterDone.tap("afterDoneRunTest", () => { + expect(instanceCb).toHaveBeenCalled(); + expect(doneHookCb).toHaveBeenCalled(); + done(); + }); + }); + it("should call afterDone hook after other callbacks (watch)", done => { + const webpack = require(".."); + compiler = webpack({ + context: __dirname, + mode: "production", + entry: "./c", + output: { + path: "/directory", + filename: "bundle.js" + } + }); + compiler.outputFileSystem = createFsFromVolume(new Volume()); + const invalidHookCb = jest.fn(); + const doneHookCb = jest.fn(); + const watchCb = jest.fn(); + const invalidateCb = jest.fn(); + compiler.hooks.invalid.tap("afterDoneWatchTest", invalidHookCb); + compiler.hooks.done.tap("afterDoneWatchTest", doneHookCb); + compiler.hooks.afterDone.tap("afterDoneWatchTest", () => { + expect(invalidHookCb).toHaveBeenCalled(); + expect(doneHookCb).toHaveBeenCalled(); + expect(watchCb).toHaveBeenCalled(); + expect(invalidateCb).toHaveBeenCalled(); + watching.close(done); + }); + const watching = compiler.watch({}, (err, stats) => { + if (err) return done(err); + watchCb(); + }); + process.nextTick(() => { + watching.invalidate(invalidateCb); + }); + }); + it("should call afterDone hook after other callbacks (watch close)", done => { + const webpack = require(".."); + compiler = webpack({ context: __dirname, mode: "production", entry: "./c", output: { - path: "/", + path: "/directory", + filename: "bundle.js" + } + }); + compiler.outputFileSystem = createFsFromVolume(new Volume()); + const invalidHookCb = jest.fn(); + const watchCloseCb = jest.fn(); + const watchCloseHookCb = jest.fn(); + const invalidateCb = jest.fn(); + compiler.hooks.invalid.tap("afterDoneWatchTest", invalidHookCb); + compiler.hooks.watchClose.tap("afterDoneWatchTest", watchCloseHookCb); + compiler.hooks.afterDone.tap("afterDoneWatchTest", () => { + expect(invalidHookCb).toHaveBeenCalled(); + expect(watchCloseCb).toHaveBeenCalled(); + expect(watchCloseHookCb).toHaveBeenCalled(); + expect(invalidateCb).toHaveBeenCalled(); + done(); + }); + const watch = compiler.watch({}, (err, stats) => { + if (err) return done(err); + watch.close(watchCloseCb); + }); + process.nextTick(() => { + watch.invalidate(invalidateCb); + }); + }); + it("should flag watchMode as true in watch", done => { + const webpack = require(".."); + compiler = webpack({ + context: __dirname, + mode: "production", + entry: "./c", + output: { + path: "/directory", filename: "bundle.js" } }); - compiler.outputFileSystem = new MemoryFs(); + compiler.outputFileSystem = createFsFromVolume(new Volume()); const watch = compiler.watch({}, err => { if (err) return done(err); @@ -471,21 +786,22 @@ describe("Compiler", () => { }); }); }); - it("should use cache on second run call", function(done) { - const compiler = webpack({ + it("should use cache on second run call", done => { + const webpack = require(".."); + compiler = webpack({ context: __dirname, mode: "development", devtool: false, entry: "./fixtures/count-loader!./fixtures/count-loader", output: { - path: "/" + path: "/directory" } }); - compiler.outputFileSystem = new MemoryFs(); + compiler.outputFileSystem = createFsFromVolume(new Volume()); compiler.run(() => { compiler.run(() => { const result = compiler.outputFileSystem.readFileSync( - "/main.js", + "/directory/main.js", "utf-8" ); expect(result).toContain("module.exports = 0;"); @@ -495,18 +811,19 @@ describe("Compiler", () => { }); it("should call the failed-hook on error", done => { const failedSpy = jest.fn(); - const compiler = webpack({ + const webpack = require(".."); + compiler = webpack({ bail: true, context: __dirname, mode: "production", entry: "./missing", output: { - path: "/", + path: "/directory", filename: "bundle.js" - }, + } }); - compiler.hooks.failed.tap('CompilerTest', failedSpy); - compiler.outputFileSystem = new MemoryFs(); + compiler.hooks.failed.tap("CompilerTest", failedSpy); + compiler.outputFileSystem = createFsFromVolume(new Volume()); compiler.run((err, stats) => { expect(err).toBeTruthy(); expect(failedSpy).toHaveBeenCalledTimes(1); @@ -514,4 +831,199 @@ describe("Compiler", () => { done(); }); }); + it("should deprecate when watch option is used without callback", () => { + const tracker = deprecationTracking.start(); + const webpack = require(".."); + compiler = webpack({ + watch: true + }); + const deprecations = tracker(); + expect(deprecations).toEqual([ + expect.objectContaining({ + code: "DEP_WEBPACK_WATCH_WITHOUT_CALLBACK" + }) + ]); + }); + describe("infrastructure logging", () => { + let capture; + beforeEach(() => { + capture = captureStdio(process.stderr); + }); + afterEach(() => { + capture.restore(); + }); + const escapeAnsi = stringRaw => + stringRaw + .replace(/\u001B\[1m\u001B\[([0-9;]*)m/g, "") + .replace(/\u001B\[1m/g, "") + .replace(/\u001B\[39m\u001B\[22m/g, "") + .replace(/\u001B\[([0-9;]*)m/g, ""); + class MyPlugin { + apply(compiler) { + const logger = compiler.getInfrastructureLogger("MyPlugin"); + logger.time("Time"); + logger.group("Group"); + logger.error("Error"); + logger.warn("Warning"); + logger.info("Info"); + logger.log("Log"); + logger.debug("Debug"); + logger.groupCollapsed("Collapsed group"); + logger.log("Log inside collapsed group"); + logger.groupEnd(); + logger.groupEnd(); + logger.timeEnd("Time"); + } + } + it("should log to the console (verbose)", done => { + const webpack = require(".."); + compiler = webpack({ + context: path.join(__dirname, "fixtures"), + entry: "./a", + output: { + path: "/directory", + filename: "bundle.js" + }, + infrastructureLogging: { + level: "verbose" + }, + plugins: [new MyPlugin()] + }); + compiler.outputFileSystem = createFsFromVolume(new Volume()); + compiler.run((err, stats) => { + expect(capture.toString().replace(/[\d.]+ ms/, "X ms")) + .toMatchInlineSnapshot(` +"<-> [MyPlugin] Group + [MyPlugin] Error + [MyPlugin] Warning + [MyPlugin] Info + [MyPlugin] Log + <-> [MyPlugin] Collapsed group + [MyPlugin] Log inside collapsed group + [MyPlugin] Time: X ms +" +`); + done(); + }); + }); + it("should log to the console (debug mode)", done => { + const webpack = require(".."); + compiler = webpack({ + context: path.join(__dirname, "fixtures"), + entry: "./a", + output: { + path: "/directory", + filename: "bundle.js" + }, + infrastructureLogging: { + level: "error", + debug: /MyPlugin/ + }, + plugins: [new MyPlugin()] + }); + compiler.outputFileSystem = createFsFromVolume(new Volume()); + compiler.run((err, stats) => { + expect(capture.toString().replace(/[\d.]+ ms/, "X ms")) + .toMatchInlineSnapshot(` +"<-> [MyPlugin] Group + [MyPlugin] Error + [MyPlugin] Warning + [MyPlugin] Info + [MyPlugin] Log + [MyPlugin] Debug + <-> [MyPlugin] Collapsed group + [MyPlugin] Log inside collapsed group + [MyPlugin] Time: X ms +" +`); + done(); + }); + }); + it("should log to the console (none)", done => { + const webpack = require(".."); + compiler = webpack({ + context: path.join(__dirname, "fixtures"), + entry: "./a", + output: { + path: "/directory", + filename: "bundle.js" + }, + infrastructureLogging: { + level: "none" + }, + plugins: [new MyPlugin()] + }); + compiler.outputFileSystem = createFsFromVolume(new Volume()); + compiler.run((err, stats) => { + expect(capture.toString()).toMatchInlineSnapshot('""'); + done(); + }); + }); + it("should log to the console with colors (verbose)", done => { + const webpack = require(".."); + compiler = webpack({ + context: path.join(__dirname, "fixtures"), + entry: "./a", + output: { + path: "/directory", + filename: "bundle.js" + }, + infrastructureLogging: { + level: "verbose", + colors: true + }, + plugins: [new MyPlugin()] + }); + compiler.outputFileSystem = createFsFromVolume(new Volume()); + compiler.run((err, stats) => { + expect(escapeAnsi(capture.toStringRaw()).replace(/[\d.]+ ms/, "X ms")) + .toMatchInlineSnapshot(` +"<-> [MyPlugin] Group + [MyPlugin] Error + [MyPlugin] Warning + [MyPlugin] Info + [MyPlugin] Log + <-> [MyPlugin] Collapsed group + [MyPlugin] Log inside collapsed group + [MyPlugin] Time: X ms +" +`); + done(); + }); + }); + it("should log to the console with colors (debug mode)", done => { + const webpack = require(".."); + compiler = webpack({ + context: path.join(__dirname, "fixtures"), + entry: "./a", + output: { + path: "/directory", + filename: "bundle.js" + }, + infrastructureLogging: { + level: "error", + debug: /MyPlugin/, + colors: true + }, + plugins: [new MyPlugin()] + }); + compiler.outputFileSystem = createFsFromVolume(new Volume()); + compiler.run((err, stats) => { + expect(escapeAnsi(capture.toStringRaw()).replace(/[\d.]+ ms/, "X ms")) + .toMatchInlineSnapshot(` +"<-> [MyPlugin] Group + [MyPlugin] Error + [MyPlugin] Warning + [MyPlugin] Info + [MyPlugin] Log + [MyPlugin] Debug + <-> [MyPlugin] Collapsed group + [MyPlugin] Log inside collapsed group + [MyPlugin] Time: X ms +" +`); + done(); + }); + }); + }); }); diff --git a/test/ConfigCacheTestCases.longtest.js b/test/ConfigCacheTestCases.longtest.js new file mode 100644 index 00000000000..d9ec699e5ea --- /dev/null +++ b/test/ConfigCacheTestCases.longtest.js @@ -0,0 +1,11 @@ +const { describeCases } = require("./ConfigTestCases.template"); + +describeCases({ + name: "ConfigCacheTestCases", + cache: { + type: "filesystem", + buildDependencies: { + defaultWebpack: [] + } + } +}); diff --git a/test/ConfigTestCases.basictest.js b/test/ConfigTestCases.basictest.js new file mode 100644 index 00000000000..8c8e0933c66 --- /dev/null +++ b/test/ConfigTestCases.basictest.js @@ -0,0 +1,5 @@ +const { describeCases } = require("./ConfigTestCases.template"); + +describeCases({ + name: "ConfigTestCases" +}); diff --git a/test/ConfigTestCases.template.js b/test/ConfigTestCases.template.js new file mode 100644 index 00000000000..6f2e05aa662 --- /dev/null +++ b/test/ConfigTestCases.template.js @@ -0,0 +1,766 @@ +"use strict"; + +require("./helpers/warmup-webpack"); + +/** @typedef {Record} Env */ +/** @typedef {{ testPath: string } TestOptions */ + +const path = require("path"); +const fs = require("graceful-fs"); +const vm = require("vm"); +const url = require("url"); +const { URL, pathToFileURL, fileURLToPath } = require("url"); +const rimraf = require("rimraf"); +const checkArrayExpectation = require("./checkArrayExpectation"); +const createLazyTestEnv = require("./helpers/createLazyTestEnv"); +const deprecationTracking = require("./helpers/deprecationTracking"); +const FakeDocument = require("./helpers/FakeDocument"); +const CurrentScript = require("./helpers/CurrentScript"); + +const prepareOptions = require("./helpers/prepareOptions"); +const { parseResource } = require("../lib/util/identifier"); +const captureStdio = require("./helpers/captureStdio"); +const asModule = require("./helpers/asModule"); +const filterInfraStructureErrors = require("./helpers/infrastructureLogErrors"); + +const casesPath = path.join(__dirname, "configCases"); +const categories = fs.readdirSync(casesPath).map(cat => ({ + name: cat, + tests: fs + .readdirSync(path.join(casesPath, cat)) + .filter(folder => !folder.startsWith("_")) + .sort() +})); + +const createLogger = appendTarget => ({ + log: l => appendTarget.push(l), + debug: l => appendTarget.push(l), + trace: l => appendTarget.push(l), + info: l => appendTarget.push(l), + warn: console.warn.bind(console), + error: console.error.bind(console), + logTime: () => {}, + group: () => {}, + groupCollapsed: () => {}, + groupEnd: () => {}, + profile: () => {}, + profileEnd: () => {}, + clear: () => {}, + status: () => {} +}); + +const describeCases = config => { + describe(config.name, () => { + let stderr; + beforeEach(() => { + stderr = captureStdio(process.stderr, true); + }); + afterEach(() => { + stderr.restore(); + }); + jest.setTimeout(20000); + + for (const category of categories) { + // eslint-disable-next-line no-loop-func + describe(category.name, () => { + for (const testName of category.tests) { + // eslint-disable-next-line no-loop-func + describe(testName, function () { + const testDirectory = path.join(casesPath, category.name, testName); + const filterPath = path.join(testDirectory, "test.filter.js"); + if (fs.existsSync(filterPath) && !require(filterPath)(config)) { + // eslint-disable-next-line jest/no-disabled-tests + describe.skip(testName, () => { + it("filtered", () => {}); + }); + return; + } + const infraStructureLog = []; + const outBaseDir = path.join(__dirname, "js"); + const testSubPath = path.join(config.name, category.name, testName); + const outputDirectory = path.join(outBaseDir, testSubPath); + const cacheDirectory = path.join(outBaseDir, ".cache", testSubPath); + let options; + let optionsArr; + let testConfig; + beforeAll(() => { + options = prepareOptions( + require(path.join(testDirectory, "webpack.config.js")), + { testPath: outputDirectory } + ); + optionsArr = [].concat(options); + for (const [idx, options] of optionsArr.entries()) { + if (!options.context) options.context = testDirectory; + if (!options.mode) options.mode = "production"; + if (!options.optimization) options.optimization = {}; + if (options.optimization.minimize === undefined) + options.optimization.minimize = false; + if (options.optimization.minimizer === undefined) { + options.optimization.minimizer = [ + new (require("terser-webpack-plugin"))({ + parallel: false + }) + ]; + } + if (!options.entry) options.entry = "./index.js"; + if (!options.target) options.target = "async-node"; + if (!options.output) options.output = {}; + if (!options.output.path) options.output.path = outputDirectory; + if (typeof options.output.pathinfo === "undefined") + options.output.pathinfo = true; + if (!options.output.filename) + options.output.filename = `bundle${idx}${ + options.experiments && options.experiments.outputModule + ? ".mjs" + : ".js" + }`; + if (config.cache) { + options.cache = { + cacheDirectory, + name: + options.cache && options.cache !== true + ? options.cache.name + : `config-${idx}`, + ...config.cache + }; + } + if (config.cache) { + options.infrastructureLogging = { + debug: true, + console: createLogger(infraStructureLog) + }; + } + if (!options.snapshot) options.snapshot = {}; + if (!options.snapshot.managedPaths) { + options.snapshot.managedPaths = [ + path.resolve(__dirname, "../node_modules") + ]; + } + } + testConfig = { + findBundle(i, options) { + const ext = path.extname( + parseResource(options.output.filename).path + ); + if ( + fs.existsSync( + path.join(options.output.path, `bundle${i}${ext}`) + ) + ) { + return `./bundle${i}${ext}`; + } + }, + timeout: 30000 + }; + try { + // try to load a test file + testConfig = Object.assign( + testConfig, + require(path.join(testDirectory, "test.config.js")) + ); + } catch (_err) { + // ignored + } + if (testConfig.timeout) setDefaultTimeout(testConfig.timeout); + }); + afterAll(() => { + // cleanup + options = undefined; + optionsArr = undefined; + testConfig = undefined; + }); + beforeAll(() => { + rimraf.sync(cacheDirectory); + }); + const handleFatalError = (err, done) => { + const fakeStats = { + errors: [ + { + message: err.message, + stack: err.stack + } + ] + }; + if ( + checkArrayExpectation( + testDirectory, + fakeStats, + "error", + "Error", + options, + done + ) + ) { + return; + } + // Wait for uncaught errors to occur + setTimeout(done, 200); + }; + if (config.cache) { + it(`${testName} should pre-compile to fill disk cache (1st)`, done => { + rimraf.sync(outputDirectory); + fs.mkdirSync(outputDirectory, { recursive: true }); + infraStructureLog.length = 0; + const deprecationTracker = deprecationTracking.start(); + const compiler = require("..")(options); + compiler.run(err => { + deprecationTracker(); + if (err) return handleFatalError(err, done); + const infrastructureLogging = stderr.toString(); + if (infrastructureLogging) { + return done( + new Error( + `Errors/Warnings during build:\n${ + infrastructureLogging + }` + ) + ); + } + const infrastructureLogErrors = filterInfraStructureErrors( + infraStructureLog, + { + run: 1, + options + } + ); + if ( + infrastructureLogErrors.length && + checkArrayExpectation( + testDirectory, + { infrastructureLogs: infrastructureLogErrors }, + "infrastructureLog", + "infrastructure-log", + "InfrastructureLog", + options, + done + ) + ) { + return; + } + compiler.close(closeErr => { + if (closeErr) return handleFatalError(closeErr, done); + done(); + }); + }); + }, 60000); + it(`${testName} should pre-compile to fill disk cache (2nd)`, done => { + rimraf.sync(outputDirectory); + fs.mkdirSync(outputDirectory, { recursive: true }); + infraStructureLog.length = 0; + const deprecationTracker = deprecationTracking.start(); + const compiler = require("..")(options); + compiler.run((err, stats) => { + deprecationTracker(); + if (err) return handleFatalError(err, done); + const { modules, children, errorsCount } = stats.toJson({ + all: false, + modules: true, + errorsCount: true + }); + if (errorsCount === 0) { + const infrastructureLogging = stderr.toString(); + if (infrastructureLogging) { + return done( + new Error( + `Errors/Warnings during build:\n${ + infrastructureLogging + }` + ) + ); + } + const allModules = children + ? children.reduce( + (all, { modules }) => all.concat(modules), + modules || [] + ) + : modules; + if ( + allModules.some( + m => m.type !== "cached modules" && !m.cached + ) + ) { + return done( + new Error( + `Some modules were not cached:\n${stats.toString({ + all: false, + modules: true, + modulesSpace: 100 + })}` + ) + ); + } + } + const infrastructureLogErrors = filterInfraStructureErrors( + infraStructureLog, + { + run: 2, + options + } + ); + if ( + infrastructureLogErrors.length && + checkArrayExpectation( + testDirectory, + { infrastructureLogs: infrastructureLogErrors }, + "infrastructureLog", + "infrastructure-log", + "InfrastructureLog", + options, + done + ) + ) { + return; + } + compiler.close(closeErr => { + if (closeErr) return handleFatalError(closeErr, done); + done(); + }); + }); + }, 40000); + } + it(`${testName} should compile`, done => { + rimraf.sync(outputDirectory); + fs.mkdirSync(outputDirectory, { recursive: true }); + infraStructureLog.length = 0; + const deprecationTracker = deprecationTracking.start(); + const onCompiled = (err, stats) => { + const deprecations = deprecationTracker(); + if (err) return handleFatalError(err, done); + const statOptions = { + preset: "verbose", + colors: false + }; + fs.mkdirSync(outputDirectory, { recursive: true }); + fs.writeFileSync( + path.join(outputDirectory, "stats.txt"), + stats.toString(statOptions), + "utf-8" + ); + const jsonStats = stats.toJson({ + errorDetails: true + }); + fs.writeFileSync( + path.join(outputDirectory, "stats.json"), + JSON.stringify(jsonStats, null, 2), + "utf-8" + ); + if ( + checkArrayExpectation( + testDirectory, + jsonStats, + "error", + "Error", + options, + done + ) + ) { + return; + } + if ( + checkArrayExpectation( + testDirectory, + jsonStats, + "warning", + "Warning", + options, + done + ) + ) { + return; + } + const infrastructureLogging = stderr.toString(); + if (infrastructureLogging) { + return done( + new Error( + `Errors/Warnings during build:\n${infrastructureLogging}` + ) + ); + } + if ( + checkArrayExpectation( + testDirectory, + { deprecations }, + "deprecation", + "Deprecation", + options, + done + ) + ) { + return; + } + const infrastructureLogErrors = filterInfraStructureErrors( + infraStructureLog, + { + run: 3, + options + } + ); + if ( + infrastructureLogErrors.length && + checkArrayExpectation( + testDirectory, + { infrastructureLogs: infrastructureLogErrors }, + "infrastructureLog", + "infrastructure-log", + "InfrastructureLog", + options, + done + ) + ) { + return; + } + + let filesCount = 0; + + if (testConfig.noTests) return process.nextTick(done); + if (testConfig.beforeExecute) testConfig.beforeExecute(); + const results = []; + for (let i = 0; i < optionsArr.length; i++) { + const options = optionsArr[i]; + const bundlePath = testConfig.findBundle(i, optionsArr[i]); + if (bundlePath) { + filesCount++; + const document = new FakeDocument(outputDirectory); + const globalContext = { + console, + expect, + setTimeout, + clearTimeout, + document, + getComputedStyle: + document.getComputedStyle.bind(document), + location: { + href: "https://test.cases/path/index.html", + origin: "https://test.cases", + toString() { + return "https://test.cases/path/index.html"; + } + } + }; + + const requireCache = Object.create(null); + const esmCache = new Map(); + const esmIdentifier = `${category.name}-${testName}-${i}`; + const baseModuleScope = { + console, + it: _it, + beforeEach: _beforeEach, + afterEach: _afterEach, + expect, + jest, + __STATS__: jsonStats, + __STATS_I__: i, + nsObj: m => { + Object.defineProperty(m, Symbol.toStringTag, { + value: "Module" + }); + return m; + } + }; + + let runInNewContext = false; + if ( + options.target === "web" || + options.target === "webworker" || + (Array.isArray(options.target) && + (options.target.includes("web") || + options.target.includes("webworker"))) + ) { + baseModuleScope.window = globalContext; + baseModuleScope.self = globalContext; + baseModuleScope.document = globalContext.document; + baseModuleScope.setTimeout = globalContext.setTimeout; + baseModuleScope.clearTimeout = globalContext.clearTimeout; + baseModuleScope.getComputedStyle = + globalContext.getComputedStyle; + baseModuleScope.URL = URL; + if (typeof Blob !== "undefined") { + baseModuleScope.Blob = Blob; + } + baseModuleScope.Worker = + require("./helpers/createFakeWorker")({ + outputDirectory + }); + runInNewContext = true; + } + if (testConfig.moduleScope) { + testConfig.moduleScope(baseModuleScope, options); + } + const esmContext = vm.createContext(baseModuleScope, { + name: "context for esm" + }); + + // eslint-disable-next-line no-loop-func + const _require = ( + currentDirectory, + options, + module, + esmMode, + parentModule + ) => { + if (testConfig === undefined) { + throw new Error( + `_require(${module}) called after all tests from ${category.name} ${testName} have completed` + ); + } + if (Array.isArray(module) || /^\.\.?\//.test(module)) { + let content; + let p; + let subPath = ""; + if (Array.isArray(module)) { + p = path.join(currentDirectory, ".array-require.js"); + content = `module.exports = (${module + .map( + arg => `require(${JSON.stringify(`./${arg}`)})` + ) + .join(", ")});`; + } else { + p = path.join(currentDirectory, module); + content = fs.readFileSync(p, "utf-8"); + const lastSlash = module.lastIndexOf("/"); + let firstSlash = module.indexOf("/"); + + if (lastSlash !== -1 && firstSlash !== lastSlash) { + if (firstSlash !== -1) { + let next = module.indexOf("/", firstSlash + 1); + let dir = module.slice(firstSlash + 1, next); + + while (dir === ".") { + firstSlash = next; + next = module.indexOf("/", firstSlash + 1); + dir = module.slice(firstSlash + 1, next); + } + } + + subPath = module.slice( + firstSlash + 1, + lastSlash + 1 + ); + } + } + const isModule = + p.endsWith(".mjs") && + options.experiments && + options.experiments.outputModule; + + if (isModule) { + if (!vm.SourceTextModule) + throw new Error( + "Running this test requires '--experimental-vm-modules'.\nRun with 'node --experimental-vm-modules node_modules/jest-cli/bin/jest'." + ); + let esm = esmCache.get(p); + if (!esm) { + esm = new vm.SourceTextModule(content, { + identifier: `${esmIdentifier}-${p}`, + url: `${pathToFileURL(p).href}?${esmIdentifier}`, + context: esmContext, + initializeImportMeta: (meta, module) => { + meta.url = pathToFileURL(p).href; + }, + importModuleDynamically: async ( + specifier, + module + ) => { + const normalizedSpecifier = + specifier.startsWith("file:") + ? `./${path.relative( + path.dirname(p), + url.fileURLToPath(specifier) + )}` + : specifier.replace( + /https:\/\/example.com\/public\/path\//, + "./" + ); + const result = await _require( + path.dirname(p), + options, + normalizedSpecifier, + "evaluated", + module + ); + return await asModule(result, module.context); + } + }); + esmCache.set(p, esm); + } + if (esmMode === "unlinked") return esm; + return (async () => { + if (esmMode === "unlinked") return esm; + await esm.link( + async (specifier, referencingModule) => + await asModule( + await _require( + path.dirname( + referencingModule.identifier + ? referencingModule.identifier.slice( + esmIdentifier.length + 1 + ) + : fileURLToPath(referencingModule.url) + ), + options, + specifier, + "unlinked", + referencingModule + ), + referencingModule.context, + true + ) + ); + // node.js 10 needs instantiate + if (esm.instantiate) esm.instantiate(); + await esm.evaluate(); + if (esmMode === "evaluated") return esm; + const ns = esm.namespace; + return ns.default && ns.default instanceof Promise + ? ns.default + : ns; + })(); + } + const isJSON = p.endsWith(".json"); + if (isJSON) { + return JSON.parse(content); + } + + if (p in requireCache) { + return requireCache[p].exports; + } + const m = { + exports: {} + }; + requireCache[p] = m; + + const moduleScope = { + ...baseModuleScope, + require: _require.bind( + null, + path.dirname(p), + options + ), + importScripts: url => { + expect(url).toMatch( + /^https:\/\/test\.cases\/path\// + ); + _require( + outputDirectory, + options, + `.${url.slice("https://test.cases/path".length)}` + ); + }, + module: m, + exports: m.exports, + __dirname: path.dirname(p), + __filename: p, + _globalAssign: { expect } + }; + if (testConfig.moduleScope) { + testConfig.moduleScope(moduleScope, options); + } + if (!runInNewContext) + content = `Object.assign(global, _globalAssign); ${content}`; + const args = Object.keys(moduleScope); + const argValues = args.map(arg => moduleScope[arg]); + const code = `(function(${args.join( + ", " + )}) {${content}\n})`; + + const oldCurrentScript = document.currentScript; + document.currentScript = new CurrentScript(subPath); + const fn = runInNewContext + ? vm.runInNewContext(code, globalContext, p) + : vm.runInThisContext(code, p); + fn.call( + testConfig.nonEsmThis + ? testConfig.nonEsmThis(module) + : m.exports, + ...argValues + ); + document.currentScript = oldCurrentScript; + return m.exports; + } else if ( + testConfig.modules && + module in testConfig.modules + ) { + return testConfig.modules[module]; + } + return require( + module.startsWith("node:") ? module.slice(5) : module + ); + }; + if (Array.isArray(bundlePath)) { + for (const bundlePathItem of bundlePath) { + results.push( + _require( + outputDirectory, + options, + `./${bundlePathItem}` + ) + ); + } + } else { + results.push( + _require(outputDirectory, options, bundlePath) + ); + } + } + } + // give a free pass to compilation that generated an error + if ( + !jsonStats.errors.length && + filesCount !== optionsArr.length + ) { + return done( + new Error( + "Should have found at least one bundle file per webpack config" + ) + ); + } + Promise.all(results) + .then(() => { + if (testConfig.afterExecute) + testConfig.afterExecute(options); + for (const key of Object.keys(global)) { + if (key.includes("webpack")) delete global[key]; + } + if (getNumberOfTests() < filesCount) { + return done(new Error("No tests exported by test case")); + } + done(); + }) + .catch(done); + }; + if (config.cache) { + try { + const compiler = require("..")(options); + compiler.run(err => { + if (err) return handleFatalError(err, done); + compiler.run((error, stats) => { + compiler.close(err => { + if (err) return handleFatalError(err, done); + onCompiled(error, stats); + }); + }); + }); + } catch (err) { + handleFatalError(err, done); + } + } else { + require("..")(options, onCompiled); + } + }, 30000); + + const { + it: _it, + beforeEach: _beforeEach, + afterEach: _afterEach, + setDefaultTimeout, + getNumberOfTests + } = createLazyTestEnv(10000); + }); + } + }); + } + }); +}; + +// eslint-disable-next-line jest/no-export +module.exports.describeCases = describeCases; diff --git a/test/ConfigTestCases.test.js b/test/ConfigTestCases.test.js deleted file mode 100644 index 48a76f894d4..00000000000 --- a/test/ConfigTestCases.test.js +++ /dev/null @@ -1,278 +0,0 @@ -"use strict"; - -/* globals describe expect it beforeAll */ -const path = require("path"); -const fs = require("fs"); -const vm = require("vm"); -const mkdirp = require("mkdirp"); -const rimraf = require("rimraf"); -const checkArrayExpectation = require("./checkArrayExpectation"); -const createLazyTestEnv = require("./helpers/createLazyTestEnv"); -const FakeDocument = require("./helpers/FakeDocument"); - -const Stats = require("../lib/Stats"); -const webpack = require("../lib/webpack"); -const prepareOptions = require("./helpers/prepareOptions"); - -describe("ConfigTestCases", () => { - const casesPath = path.join(__dirname, "configCases"); - let categories = fs.readdirSync(casesPath); - - jest.setTimeout(20000); - - categories = categories.map(cat => { - return { - name: cat, - tests: fs - .readdirSync(path.join(casesPath, cat)) - .filter(folder => { - return folder.indexOf("_") < 0; - }) - .sort() - .filter(testName => { - const testDirectory = path.join(casesPath, cat, testName); - const filterPath = path.join(testDirectory, "test.filter.js"); - if (fs.existsSync(filterPath) && !require(filterPath)()) { - describe.skip(testName, () => it("filtered")); - return false; - } - return true; - }) - }; - }); - categories.forEach(category => { - describe(category.name, () => { - category.tests.forEach(testName => { - describe(testName, function() { - const testDirectory = path.join(casesPath, category.name, testName); - const outputDirectory = path.join( - __dirname, - "js", - "config", - category.name, - testName - ); - it( - testName + " should compile", - () => - new Promise((resolve, reject) => { - const done = err => { - if (err) return reject(err); - resolve(); - }; - rimraf.sync(outputDirectory); - mkdirp.sync(outputDirectory); - const options = prepareOptions( - require(path.join(testDirectory, "webpack.config.js")), - { testPath: outputDirectory } - ); - const optionsArr = [].concat(options); - optionsArr.forEach((options, idx) => { - if (!options.context) options.context = testDirectory; - if (!options.mode) options.mode = "production"; - if (!options.optimization) options.optimization = {}; - if (options.optimization.minimize === undefined) - options.optimization.minimize = false; - if (!options.entry) options.entry = "./index.js"; - if (!options.target) options.target = "async-node"; - if (!options.output) options.output = {}; - if (!options.output.path) - options.output.path = outputDirectory; - if (typeof options.output.pathinfo === "undefined") - options.output.pathinfo = true; - if (!options.output.filename) - options.output.filename = "bundle" + idx + ".js"; - }); - let testConfig = { - findBundle: function(i, options) { - const ext = path.extname(options.output.filename); - if ( - fs.existsSync( - path.join(options.output.path, "bundle" + i + ext) - ) - ) { - return "./bundle" + i + ext; - } - }, - timeout: 30000 - }; - try { - // try to load a test file - testConfig = Object.assign( - testConfig, - require(path.join(testDirectory, "test.config.js")) - ); - } catch (e) { - // ignored - } - if (testConfig.timeout) setDefaultTimeout(testConfig.timeout); - - webpack(options, (err, stats) => { - if (err) { - const fakeStats = { - errors: [err.stack] - }; - if ( - checkArrayExpectation( - testDirectory, - fakeStats, - "error", - "Error", - done - ) - ) - return; - // Wait for uncaught errors to occur - return setTimeout(done, 200); - } - const statOptions = Stats.presetToOptions("verbose"); - statOptions.colors = false; - mkdirp.sync(outputDirectory); - fs.writeFileSync( - path.join(outputDirectory, "stats.txt"), - stats.toString(statOptions), - "utf-8" - ); - const jsonStats = stats.toJson({ - errorDetails: true - }); - if ( - checkArrayExpectation( - testDirectory, - jsonStats, - "error", - "Error", - done - ) - ) - return; - if ( - checkArrayExpectation( - testDirectory, - jsonStats, - "warning", - "Warning", - done - ) - ) - return; - - const globalContext = { - console: console, - expect: expect, - setTimeout: setTimeout, - clearTimeout: clearTimeout, - document: new FakeDocument(), - location: { - href: "https://test.cases/path/index.html", - origin: "https://test.cases", - toString() { - return "https://test.cases/path/index.html"; - } - } - }; - - function _require(currentDirectory, module) { - if (Array.isArray(module) || /^\.\.?\//.test(module)) { - let fn; - let content; - let p; - if (Array.isArray(module)) { - p = path.join(currentDirectory, module[0]); - content = module - .map(arg => { - p = path.join(currentDirectory, arg); - return fs.readFileSync(p, "utf-8"); - }) - .join("\n"); - } else { - p = path.join(currentDirectory, module); - content = fs.readFileSync(p, "utf-8"); - } - if ( - options.target === "web" || - options.target === "webworker" - ) { - fn = vm.runInNewContext( - "(function(require, module, exports, __dirname, __filename, it, beforeEach, afterEach, expect, jest, window) {" + - 'function nsObj(m) { Object.defineProperty(m, Symbol.toStringTag, { value: "Module" }); return m; }' + - content + - "\n})", - globalContext, - p - ); - } else { - fn = vm.runInThisContext( - "(function(require, module, exports, __dirname, __filename, it, beforeEach, afterEach, expect, jest) {" + - "global.expect = expect; " + - 'function nsObj(m) { Object.defineProperty(m, Symbol.toStringTag, { value: "Module" }); return m; }' + - content + - "\n})", - p - ); - } - const m = { - exports: {} - }; - fn.call( - m.exports, - _require.bind(null, path.dirname(p)), - m, - m.exports, - path.dirname(p), - p, - _it, - _beforeEach, - _afterEach, - expect, - jest, - globalContext - ); - return m.exports; - } else if ( - testConfig.modules && - module in testConfig.modules - ) { - return testConfig.modules[module]; - } else return require(module); - } - let filesCount = 0; - - if (testConfig.noTests) return process.nextTick(done); - for (let i = 0; i < optionsArr.length; i++) { - const bundlePath = testConfig.findBundle(i, optionsArr[i]); - if (bundlePath) { - filesCount++; - _require(outputDirectory, bundlePath); - } - } - // give a free pass to compilation that generated an error - if ( - !jsonStats.errors.length && - filesCount !== optionsArr.length - ) - return done( - new Error( - "Should have found at least one bundle file per webpack config" - ) - ); - if (getNumberOfTests() < filesCount) - return done(new Error("No tests exported by test case")); - if (testConfig.afterExecute) testConfig.afterExecute(); - done(); - }); - }) - ); - - const { - it: _it, - beforeEach: _beforeEach, - afterEach: _afterEach, - setDefaultTimeout, - getNumberOfTests - } = createLazyTestEnv(jasmine.getEnv(), 10000); - }); - }); - }); - }); -}); diff --git a/test/ContextModule.unittest.js b/test/ContextModule.unittest.js new file mode 100644 index 00000000000..ae3ab350377 --- /dev/null +++ b/test/ContextModule.unittest.js @@ -0,0 +1,25 @@ +"use strict"; + +const ContextModule = require("../lib/ContextModule"); + +describe("contextModule", () => { + let contextModule; + let request; + beforeEach(() => { + request = "/some/request"; + }); + describe("#identifier", () => { + it("returns an safe identifier for this module", () => { + contextModule = new ContextModule(() => {}, { + type: "javascript/auto", + request, + resource: "a", + mode: "lazy", + regExp: /a|b/ + }); + expect(contextModule.identifier()).toEqual( + expect.stringContaining("/a%7Cb/") + ); + }); + }); +}); diff --git a/test/ContextModuleFactory.unittest.js b/test/ContextModuleFactory.unittest.js index d4bec304cef..db673a7e967 100644 --- a/test/ContextModuleFactory.unittest.js +++ b/test/ContextModuleFactory.unittest.js @@ -1,22 +1,22 @@ -/* globals describe, it, beforeEach */ "use strict"; -const MemoryFs = require("memory-fs"); +const { createFsFromVolume, Volume } = require("memfs"); const ContextModuleFactory = require("../lib/ContextModuleFactory"); describe("ContextModuleFactory", () => { describe("resolveDependencies", () => { - let factory, memfs; + let factory; + let memfs; beforeEach(() => { factory = new ContextModuleFactory([]); - memfs = new MemoryFs(); + memfs = createFsFromVolume(new Volume()); }); it("should not report an error when ENOENT errors happen", done => { memfs.readdir = (dir, callback) => { setTimeout(() => callback(null, ["/file"])); }; memfs.stat = (file, callback) => { - let err = new Error("fake ENOENT error"); + const err = new Error("fake ENOENT error"); err.code = "ENOENT"; setTimeout(() => callback(err, null)); }; @@ -40,7 +40,7 @@ describe("ContextModuleFactory", () => { setTimeout(() => callback(null, ["/file"])); }; memfs.stat = (file, callback) => { - let err = new Error("fake EACCES error"); + const err = new Error("fake EACCES error"); err.code = "EACCES"; setTimeout(() => callback(err, null)); }; @@ -58,5 +58,105 @@ describe("ContextModuleFactory", () => { } ); }); + it("should return callback with [] if circular symlinks exist", done => { + let statDirStatus = 0; + memfs.readdir = (dir, callback) => { + statDirStatus++; + setTimeout(() => callback(null, ["/A"])); + }; + memfs.stat = (file, callback) => { + const resolvedValue = { + isDirectory: () => statDirStatus === 1, + isFile: () => statDirStatus !== 1 + }; + setTimeout(() => callback(null, resolvedValue)); + }; + memfs.realpath = (dir, callback) => { + const realPath = dir.split("/"); + setTimeout(() => callback(null, realPath[realPath.length - 1])); + }; + factory.resolveDependencies( + memfs, + { + resource: "/A", + recursive: true, + regExp: /.*/ + }, + (err, res) => { + expect(res).toStrictEqual([]); + done(); + } + ); + }); + it("should not return callback with [] if there are no circular symlinks", done => { + let statDirStatus = 0; + memfs.readdir = (dir, callback) => { + statDirStatus++; + setTimeout(() => callback(null, ["/B"])); + }; + memfs.stat = (file, callback) => { + const resolvedValue = { + isDirectory: () => statDirStatus === 1, + isFile: () => statDirStatus !== 1 + }; + setTimeout(() => callback(null, resolvedValue)); + }; + memfs.realpath = (dir, callback) => { + const realPath = dir.split("/"); + setTimeout(() => callback(null, realPath[realPath.length - 1])); + }; + factory.resolveDependencies( + memfs, + { + resource: "/A", + recursive: true, + regExp: /.*/ + }, + (err, res) => { + expect(res).not.toStrictEqual([]); + expect(Array.isArray(res)).toBe(true); + expect(res.length).toBe(1); + done(); + } + ); + }); + + it("should resolve correctly several resources", done => { + memfs.readdir = (dir, callback) => { + if (dir === "/a") setTimeout(() => callback(null, ["/B"])); + if (dir === "/b") setTimeout(() => callback(null, ["/A"])); + if (dir === "/a/B") setTimeout(() => callback(null, ["a"])); + if (dir === "/b/A") setTimeout(() => callback(null, ["b"])); + }; + memfs.stat = (file, callback) => { + const resolvedValue = { + isDirectory: () => file !== "/a/B/a" && file !== "/b/A/b", + isFile: () => file === "/a/B/a" || file === "/b/A/b" + }; + setTimeout(() => callback(null, resolvedValue)); + }; + memfs.realpath = undefined; + factory.resolveDependencies( + memfs, + { + resource: ["/a", "/b"], + resourceFragment: "#hash", + resourceQuery: "?query", + recursive: true, + regExp: /.*/ + }, + (err, res) => { + expect(res).not.toStrictEqual([]); + expect(Array.isArray(res)).toBe(true); + expect(res.map(r => r.request)).toEqual([ + "./B/a?query#hash", + "./A/b?query#hash" + ]); + expect(res.map(r => r.getContext())).toEqual(["/a", "/b"]); + expect(res.map(r => r.userRequest)).toEqual(["./B/a", "./A/b"]); + done(); + } + ); + }); }); }); diff --git a/test/Defaults.unittest.js b/test/Defaults.unittest.js new file mode 100644 index 00000000000..279e671ed46 --- /dev/null +++ b/test/Defaults.unittest.js @@ -0,0 +1,2682 @@ +require("./helpers/warmup-webpack"); + +const path = require("path"); +const jestDiff = require("jest-diff").diff; +const stripVTControlCharacters = require("strip-ansi"); + +/** + * Escapes regular expression metacharacters + * @param {string} str String to quote + * @returns {string} Escaped string + */ +const quoteMeta = str => str.replace(/[-[\]\\/{}()*+?.^$|]/g, "\\$&"); + +const cwd = process.cwd(); +const cwdRegExp = new RegExp( + `${quoteMeta(cwd)}((?:\\\\)?(?:[a-zA-Z.\\-_]+\\\\)*)`, + "g" +); +const escapedCwd = JSON.stringify(cwd).slice(1, -1); +const escapedCwdRegExp = new RegExp( + `${quoteMeta(escapedCwd)}((?:\\\\\\\\)?(?:[a-zA-Z.\\-_]+\\\\\\\\)*)`, + "g" +); +const normalize = str => { + if (cwd.startsWith("/")) { + str = str.replace(new RegExp(quoteMeta(cwd), "g"), ""); + } else { + str = str.replace(cwdRegExp, (m, g) => `${g.replace(/\\/g, "/")}`); + str = str.replace( + escapedCwdRegExp, + (m, g) => `${g.replace(/\\\\/g, "/")}` + ); + } + str = str.replace(/@@ -\d+,\d+ \+\d+,\d+ @@/g, "@@ ... @@"); + return str; +}; + +class Diff { + constructor(value) { + this.value = value; + } +} + +expect.addSnapshotSerializer({ + test(value) { + return value instanceof Diff; + }, + print(received) { + return normalize(received.value); + } +}); + +expect.addSnapshotSerializer({ + test(value) { + return typeof value === "string"; + }, + print(received) { + return JSON.stringify(normalize(received)); + } +}); + +const getDefaultConfig = config => { + const { applyWebpackOptionsDefaults, getNormalizedWebpackOptions } = + require("..").config; + config = getNormalizedWebpackOptions(config); + applyWebpackOptionsDefaults(config); + process.chdir(cwd); + return config; +}; + +describe("snapshots", () => { + const baseConfig = getDefaultConfig({ mode: "none" }); + + it("should have the correct base config", () => { + expect(baseConfig).toMatchInlineSnapshot(` + Object { + "amd": undefined, + "bail": undefined, + "cache": false, + "context": "", + "dependencies": undefined, + "devServer": undefined, + "devtool": false, + "entry": Object { + "main": Object { + "import": Array [ + "./src", + ], + }, + }, + "experiments": Object { + "asyncWebAssembly": false, + "backCompat": true, + "buildHttp": undefined, + "cacheUnaffected": false, + "css": undefined, + "futureDefaults": false, + "layers": false, + "lazyCompilation": undefined, + "outputModule": false, + "syncWebAssembly": false, + "topLevelAwait": true, + }, + "externals": undefined, + "externalsPresets": Object { + "electron": false, + "electronMain": false, + "electronPreload": false, + "electronRenderer": false, + "node": false, + "nwjs": false, + "web": true, + }, + "externalsType": "var", + "ignoreWarnings": undefined, + "infrastructureLogging": Object {}, + "loader": Object { + "environment": Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": true, + "const": true, + "destructuring": true, + "document": true, + "dynamicImport": undefined, + "dynamicImportInWorker": undefined, + "forOf": true, + "globalThis": undefined, + "module": undefined, + "nodePrefixForCoreModules": true, + "optionalChaining": true, + "templateLiteral": true, + }, + "target": "web", + }, + "mode": "none", + "module": Object { + "defaultRules": Array [ + Object { + "mimetype": "application/node", + "type": "javascript/auto", + }, + Object { + "test": /\\\\\\.json\\$/i, + "type": "json", + }, + Object { + "mimetype": "application/json", + "type": "json", + }, + Object { + "resolve": Object { + "byDependency": Object { + "esm": Object { + "fullySpecified": true, + }, + }, + }, + "test": /\\\\\\.mjs\\$/i, + "type": "javascript/esm", + }, + Object { + "descriptionData": Object { + "type": "module", + }, + "resolve": Object { + "byDependency": Object { + "esm": Object { + "fullySpecified": true, + }, + }, + }, + "test": /\\\\\\.js\\$/i, + "type": "javascript/esm", + }, + Object { + "test": /\\\\\\.cjs\\$/i, + "type": "javascript/dynamic", + }, + Object { + "descriptionData": Object { + "type": "commonjs", + }, + "test": /\\\\\\.js\\$/i, + "type": "javascript/dynamic", + }, + Object { + "mimetype": Object { + "or": Array [ + "text/javascript", + "application/javascript", + ], + }, + "resolve": Object { + "byDependency": Object { + "esm": Object { + "fullySpecified": true, + }, + }, + }, + "type": "javascript/esm", + }, + Object { + "dependency": "url", + "oneOf": Array [ + Object { + "scheme": /\\^data\\$/, + "type": "asset/inline", + }, + Object { + "type": "asset/resource", + }, + ], + }, + Object { + "assert": Object { + "type": "json", + }, + "type": "json", + }, + Object { + "type": "json", + "with": Object { + "type": "json", + }, + }, + ], + "generator": Object { + "json": Object { + "JSONParse": true, + }, + }, + "noParse": undefined, + "parser": Object { + "asset": Object { + "dataUrlCondition": Object { + "maxSize": 8096, + }, + }, + "javascript": Object { + "createRequire": false, + "dynamicImportFetchPriority": false, + "dynamicImportMode": "lazy", + "dynamicImportPrefetch": false, + "dynamicImportPreload": false, + "exprContextCritical": true, + "exprContextRecursive": true, + "exprContextRegExp": false, + "exprContextRequest": ".", + "importMeta": true, + "strictExportPresence": undefined, + "strictThisContextOnImports": false, + "unknownContextCritical": true, + "unknownContextRecursive": true, + "unknownContextRegExp": false, + "unknownContextRequest": ".", + "wrappedContextCritical": false, + "wrappedContextRecursive": true, + "wrappedContextRegExp": /\\.\\*/, + }, + "json": Object { + "exportsDepth": Infinity, + }, + }, + "rules": Array [], + "unsafeCache": false, + }, + "name": undefined, + "node": Object { + "__dirname": "mock", + "__filename": "mock", + "global": true, + }, + "optimization": Object { + "avoidEntryIife": false, + "checkWasmTypes": false, + "chunkIds": "natural", + "concatenateModules": false, + "emitOnErrors": true, + "flagIncludedChunks": false, + "innerGraph": false, + "mangleExports": false, + "mangleWasmImports": false, + "mergeDuplicateChunks": true, + "minimize": false, + "minimizer": Array [ + Object { + "apply": [Function], + }, + ], + "moduleIds": "natural", + "nodeEnv": false, + "portableRecords": false, + "providedExports": true, + "realContentHash": false, + "removeAvailableModules": false, + "removeEmptyChunks": true, + "runtimeChunk": false, + "sideEffects": "flag", + "splitChunks": Object { + "automaticNameDelimiter": "-", + "cacheGroups": Object { + "default": Object { + "idHint": "", + "minChunks": 2, + "priority": -20, + "reuseExistingChunk": true, + }, + "defaultVendors": Object { + "idHint": "vendors", + "priority": -10, + "reuseExistingChunk": true, + "test": /\\[\\\\\\\\/\\]node_modules\\[\\\\\\\\/\\]/i, + }, + }, + "chunks": "async", + "defaultSizeTypes": Array [ + "javascript", + "unknown", + ], + "enforceSizeThreshold": 30000, + "hidePathInfo": false, + "maxAsyncRequests": Infinity, + "maxInitialRequests": Infinity, + "minChunks": 1, + "minRemainingSize": undefined, + "minSize": 10000, + "usedExports": false, + }, + "usedExports": false, + }, + "output": Object { + "assetModuleFilename": "[hash][ext][query]", + "asyncChunks": true, + "charset": true, + "chunkFilename": "[name].js", + "chunkFormat": "array-push", + "chunkLoadTimeout": 120000, + "chunkLoading": "jsonp", + "chunkLoadingGlobal": "webpackChunkwebpack", + "clean": undefined, + "compareBeforeEmit": true, + "crossOriginLoading": false, + "cssChunkFilename": "[name].css", + "cssFilename": "[name].css", + "devtoolFallbackModuleFilenameTemplate": undefined, + "devtoolModuleFilenameTemplate": undefined, + "devtoolNamespace": "webpack", + "enabledChunkLoadingTypes": Array [ + "jsonp", + "import-scripts", + ], + "enabledLibraryTypes": Array [], + "enabledWasmLoadingTypes": Array [ + "fetch", + ], + "environment": Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": true, + "const": true, + "destructuring": true, + "document": true, + "dynamicImport": undefined, + "dynamicImportInWorker": undefined, + "forOf": true, + "globalThis": undefined, + "module": undefined, + "nodePrefixForCoreModules": true, + "optionalChaining": true, + "templateLiteral": true, + }, + "filename": "[name].js", + "globalObject": "self", + "hashDigest": "hex", + "hashDigestLength": 20, + "hashFunction": "md4", + "hashSalt": undefined, + "hotUpdateChunkFilename": "[id].[fullhash].hot-update.js", + "hotUpdateGlobal": "webpackHotUpdatewebpack", + "hotUpdateMainFilename": "[runtime].[fullhash].hot-update.json", + "ignoreBrowserWarnings": undefined, + "iife": true, + "importFunctionName": "import", + "importMetaName": "import.meta", + "library": undefined, + "module": false, + "path": "/dist", + "pathinfo": false, + "publicPath": "auto", + "scriptType": false, + "sourceMapFilename": "[file].map[query]", + "sourcePrefix": undefined, + "strictModuleErrorHandling": false, + "strictModuleExceptionHandling": false, + "trustedTypes": undefined, + "uniqueName": "webpack", + "wasmLoading": "fetch", + "webassemblyModuleFilename": "[hash].module.wasm", + "workerChunkLoading": "import-scripts", + "workerPublicPath": "", + "workerWasmLoading": "fetch", + }, + "parallelism": 100, + "performance": false, + "plugins": Array [], + "profile": false, + "recordsInputPath": false, + "recordsOutputPath": false, + "resolve": Object { + "aliasFields": Array [], + "byDependency": Object { + "amd": Object { + "aliasFields": Array [ + "browser", + ], + "conditionNames": Array [ + "require", + "module", + "...", + ], + "extensions": Array [ + ".js", + ".json", + ".wasm", + ], + "mainFields": Array [ + "browser", + "module", + "...", + ], + }, + "commonjs": Object { + "aliasFields": Array [ + "browser", + ], + "conditionNames": Array [ + "require", + "module", + "...", + ], + "extensions": Array [ + ".js", + ".json", + ".wasm", + ], + "mainFields": Array [ + "browser", + "module", + "...", + ], + }, + "esm": Object { + "aliasFields": Array [ + "browser", + ], + "conditionNames": Array [ + "import", + "module", + "...", + ], + "extensions": Array [ + ".js", + ".json", + ".wasm", + ], + "mainFields": Array [ + "browser", + "module", + "...", + ], + }, + "loader": Object { + "aliasFields": Array [ + "browser", + ], + "conditionNames": Array [ + "require", + "module", + "...", + ], + "extensions": Array [ + ".js", + ".json", + ".wasm", + ], + "mainFields": Array [ + "browser", + "module", + "...", + ], + }, + "loaderImport": Object { + "aliasFields": Array [ + "browser", + ], + "conditionNames": Array [ + "import", + "module", + "...", + ], + "extensions": Array [ + ".js", + ".json", + ".wasm", + ], + "mainFields": Array [ + "browser", + "module", + "...", + ], + }, + "undefined": Object { + "aliasFields": Array [ + "browser", + ], + "conditionNames": Array [ + "require", + "module", + "...", + ], + "extensions": Array [ + ".js", + ".json", + ".wasm", + ], + "mainFields": Array [ + "browser", + "module", + "...", + ], + }, + "unknown": Object { + "aliasFields": Array [ + "browser", + ], + "conditionNames": Array [ + "require", + "module", + "...", + ], + "extensions": Array [ + ".js", + ".json", + ".wasm", + ], + "mainFields": Array [ + "browser", + "module", + "...", + ], + }, + "url": Object { + "preferRelative": true, + }, + "wasm": Object { + "aliasFields": Array [ + "browser", + ], + "conditionNames": Array [ + "import", + "module", + "...", + ], + "extensions": Array [ + ".js", + ".json", + ".wasm", + ], + "mainFields": Array [ + "browser", + "module", + "...", + ], + }, + "worker": Object { + "aliasFields": Array [ + "browser", + ], + "conditionNames": Array [ + "import", + "module", + "...", + ], + "extensions": Array [ + ".js", + ".json", + ".wasm", + ], + "mainFields": Array [ + "browser", + "module", + "...", + ], + "preferRelative": true, + }, + }, + "cache": false, + "conditionNames": Array [ + "webpack", + "production", + "browser", + ], + "exportsFields": Array [ + "exports", + ], + "extensions": Array [], + "importsFields": Array [ + "imports", + ], + "mainFields": Array [ + "main", + ], + "mainFiles": Array [ + "index", + ], + "modules": Array [ + "node_modules", + ], + "roots": Array [ + "", + ], + }, + "resolveLoader": Object { + "cache": false, + "conditionNames": Array [ + "loader", + "require", + "node", + ], + "exportsFields": Array [ + "exports", + ], + "extensions": Array [ + ".js", + ], + "mainFields": Array [ + "loader", + "main", + ], + "mainFiles": Array [ + "index", + ], + }, + "snapshot": Object { + "buildDependencies": Object { + "hash": true, + "timestamp": true, + }, + "immutablePaths": Array [], + "managedPaths": Array [ + "/node_modules/", + ], + "module": Object { + "timestamp": true, + }, + "resolve": Object { + "timestamp": true, + }, + "resolveBuildDependencies": Object { + "hash": true, + "timestamp": true, + }, + "unmanagedPaths": Array [], + }, + "stats": Object {}, + "target": "web", + "watch": false, + "watchOptions": Object {}, + } + `); + }); + + const test = (name, options, fn, before, after) => { + it(`should generate the correct defaults from ${name}`, () => { + if (!("mode" in options)) options.mode = "none"; + try { + if (before) before(); + const result = getDefaultConfig(options); + + const diff = stripVTControlCharacters( + jestDiff(baseConfig, result, { expand: false, contextLines: 0 }) + ); + + fn(expect(new Diff(diff)), expect(result)); + } finally { + if (after) after(); + } + }); + }; + + test("empty config", {}, e => + e.toMatchInlineSnapshot("Compared values have no visual difference.") + ); + test("none mode", { mode: "none" }, e => + e.toMatchInlineSnapshot("Compared values have no visual difference.") + ); + test("no mode provided", { mode: undefined }, e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "mode": "none", + + "mode": undefined, + @@ ... @@ + - "avoidEntryIife": false, + - "checkWasmTypes": false, + - "chunkIds": "natural", + - "concatenateModules": false, + - "emitOnErrors": true, + - "flagIncludedChunks": false, + - "innerGraph": false, + - "mangleExports": false, + + "avoidEntryIife": true, + + "checkWasmTypes": true, + + "chunkIds": "deterministic", + + "concatenateModules": true, + + "emitOnErrors": false, + + "flagIncludedChunks": true, + + "innerGraph": true, + + "mangleExports": true, + @@ ... @@ + - "minimize": false, + + "minimize": true, + @@ ... @@ + - "moduleIds": "natural", + - "nodeEnv": false, + + "moduleIds": "deterministic", + + "nodeEnv": "production", + @@ ... @@ + - "realContentHash": false, + + "realContentHash": true, + @@ ... @@ + - "sideEffects": "flag", + + "sideEffects": true, + @@ ... @@ + - "enforceSizeThreshold": 30000, + - "hidePathInfo": false, + - "maxAsyncRequests": Infinity, + - "maxInitialRequests": Infinity, + + "enforceSizeThreshold": 50000, + + "hidePathInfo": true, + + "maxAsyncRequests": 30, + + "maxInitialRequests": 30, + @@ ... @@ + - "minSize": 10000, + - "usedExports": false, + + "minSize": 20000, + + "usedExports": true, + @@ ... @@ + - "usedExports": false, + + "usedExports": true, + @@ ... @@ + - "performance": false, + + "performance": Object { + + "hints": "warning", + + "maxAssetSize": 250000, + + "maxEntrypointSize": 250000, + + }, + @@ ... @@ + + "hash": true, + @@ ... @@ + + "hash": true, + `) + ); + test("production", { mode: "production" }, e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "mode": "none", + + "mode": "production", + @@ ... @@ + - "avoidEntryIife": false, + - "checkWasmTypes": false, + - "chunkIds": "natural", + - "concatenateModules": false, + - "emitOnErrors": true, + - "flagIncludedChunks": false, + - "innerGraph": false, + - "mangleExports": false, + + "avoidEntryIife": true, + + "checkWasmTypes": true, + + "chunkIds": "deterministic", + + "concatenateModules": true, + + "emitOnErrors": false, + + "flagIncludedChunks": true, + + "innerGraph": true, + + "mangleExports": true, + @@ ... @@ + - "minimize": false, + + "minimize": true, + @@ ... @@ + - "moduleIds": "natural", + - "nodeEnv": false, + + "moduleIds": "deterministic", + + "nodeEnv": "production", + @@ ... @@ + - "realContentHash": false, + + "realContentHash": true, + @@ ... @@ + - "sideEffects": "flag", + + "sideEffects": true, + @@ ... @@ + - "enforceSizeThreshold": 30000, + - "hidePathInfo": false, + - "maxAsyncRequests": Infinity, + - "maxInitialRequests": Infinity, + + "enforceSizeThreshold": 50000, + + "hidePathInfo": true, + + "maxAsyncRequests": 30, + + "maxInitialRequests": 30, + @@ ... @@ + - "minSize": 10000, + - "usedExports": false, + + "minSize": 20000, + + "usedExports": true, + @@ ... @@ + - "usedExports": false, + + "usedExports": true, + @@ ... @@ + - "performance": false, + + "performance": Object { + + "hints": "warning", + + "maxAssetSize": 250000, + + "maxEntrypointSize": 250000, + + }, + @@ ... @@ + + "hash": true, + @@ ... @@ + + "hash": true, + `) + ); + test("development", { mode: "development" }, e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "cache": false, + + "cache": Object { + + "cacheUnaffected": false, + + "maxGenerations": Infinity, + + "type": "memory", + + }, + @@ ... @@ + - "devtool": false, + + "devtool": "eval", + @@ ... @@ + - "mode": "none", + + "mode": "development", + @@ ... @@ + - "exportsDepth": Infinity, + + "exportsDepth": 1, + @@ ... @@ + - "unsafeCache": false, + + "unsafeCache": [Function anonymous], + @@ ... @@ + - "chunkIds": "natural", + + "chunkIds": "named", + @@ ... @@ + - "moduleIds": "natural", + - "nodeEnv": false, + + "moduleIds": "named", + + "nodeEnv": "development", + @@ ... @@ + - "minRemainingSize": undefined, + + "minRemainingSize": 0, + @@ ... @@ + - "pathinfo": false, + + "pathinfo": true, + @@ ... @@ + - "cache": false, + + "cache": true, + @@ ... @@ + - "production", + + "development", + @@ ... @@ + - "cache": false, + + "cache": true, + `) + ); + test("sync wasm", { experiments: { syncWebAssembly: true } }, e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "syncWebAssembly": false, + + "syncWebAssembly": true, + @@ ... @@ + + }, + + Object { + + "rules": Array [ + + Object { + + "descriptionData": Object { + + "type": "module", + + }, + + "resolve": Object { + + "fullySpecified": true, + + }, + + }, + + ], + + "test": /\\.wasm$/i, + + "type": "webassembly/sync", + + }, + + Object { + + "mimetype": "application/wasm", + + "rules": Array [ + + Object { + + "descriptionData": Object { + + "type": "module", + + }, + + "resolve": Object { + + "fullySpecified": true, + + }, + + }, + + ], + + "type": "webassembly/sync", + `) + ); + test("output module", { experiments: { outputModule: true } }, e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "outputModule": false, + + "outputModule": true, + @@ ... @@ + - "externalsType": "var", + + "externalsType": "module-import", + @@ ... @@ + - "dynamicImport": undefined, + - "dynamicImportInWorker": undefined, + + "dynamicImport": true, + + "dynamicImportInWorker": true, + @@ ... @@ + - "module": undefined, + + "module": true, + @@ ... @@ + - "chunkFilename": "[name].js", + - "chunkFormat": "array-push", + + "chunkFilename": "[name].mjs", + + "chunkFormat": "module", + @@ ... @@ + - "chunkLoading": "jsonp", + + "chunkLoading": "import", + @@ ... @@ + - "jsonp", + - "import-scripts", + + "import", + @@ ... @@ + - "dynamicImport": undefined, + - "dynamicImportInWorker": undefined, + + "dynamicImport": true, + + "dynamicImportInWorker": true, + @@ ... @@ + - "module": undefined, + + "module": true, + @@ ... @@ + - "filename": "[name].js", + + "filename": "[name].mjs", + @@ ... @@ + - "hotUpdateChunkFilename": "[id].[fullhash].hot-update.js", + + "hotUpdateChunkFilename": "[id].[fullhash].hot-update.mjs", + @@ ... @@ + - "iife": true, + + "iife": false, + @@ ... @@ + - "module": false, + + "module": true, + @@ ... @@ + - "scriptType": false, + + "scriptType": "module", + @@ ... @@ + - "workerChunkLoading": "import-scripts", + + "workerChunkLoading": "import", + `) + ); + test("async wasm", { experiments: { asyncWebAssembly: true } }, e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "asyncWebAssembly": false, + + "asyncWebAssembly": true, + @@ ... @@ + + }, + + Object { + + "rules": Array [ + + Object { + + "descriptionData": Object { + + "type": "module", + + }, + + "resolve": Object { + + "fullySpecified": true, + + }, + + }, + + ], + + "test": /\\.wasm$/i, + + "type": "webassembly/async", + + }, + + Object { + + "mimetype": "application/wasm", + + "rules": Array [ + + Object { + + "descriptionData": Object { + + "type": "module", + + }, + + "resolve": Object { + + "fullySpecified": true, + + }, + + }, + + ], + + "type": "webassembly/async", + `) + ); + test( + "both wasm", + { experiments: { syncWebAssembly: true, asyncWebAssembly: true } }, + e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "asyncWebAssembly": false, + + "asyncWebAssembly": true, + @@ ... @@ + - "syncWebAssembly": false, + + "syncWebAssembly": true, + @@ ... @@ + + }, + + Object { + + "rules": Array [ + + Object { + + "descriptionData": Object { + + "type": "module", + + }, + + "resolve": Object { + + "fullySpecified": true, + + }, + + }, + + ], + + "test": /\\.wasm$/i, + + "type": "webassembly/async", + + }, + + Object { + + "mimetype": "application/wasm", + + "rules": Array [ + + Object { + + "descriptionData": Object { + + "type": "module", + + }, + + "resolve": Object { + + "fullySpecified": true, + + }, + + }, + + ], + + "type": "webassembly/async", + `) + ); + test("const filename", { output: { filename: "bundle.js" } }, e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "chunkFilename": "[name].js", + + "chunkFilename": "[id].bundle.js", + @@ ... @@ + - "cssChunkFilename": "[name].css", + - "cssFilename": "[name].css", + + "cssChunkFilename": "[id].bundle.css", + + "cssFilename": "bundle.css", + @@ ... @@ + - "filename": "[name].js", + + "filename": "bundle.js", + `) + ); + test("function filename", { output: { filename: () => "bundle.js" } }, e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "chunkFilename": "[name].js", + + "chunkFilename": "[id].js", + @@ ... @@ + - "cssChunkFilename": "[name].css", + - "cssFilename": "[name].css", + + "cssChunkFilename": "[id].css", + + "cssFilename": "[id].css", + @@ ... @@ + - "filename": "[name].js", + + "filename": [Function filename], + `) + ); + test("library", { output: { library: ["myLib", "awesome"] } }, e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "chunkLoadingGlobal": "webpackChunkwebpack", + + "chunkLoadingGlobal": "webpackChunkmyLib_awesome", + @@ ... @@ + - "devtoolNamespace": "webpack", + + "devtoolNamespace": "myLib.awesome", + @@ ... @@ + - "enabledLibraryTypes": Array [], + + "enabledLibraryTypes": Array [ + + "var", + + ], + @@ ... @@ + - "hotUpdateGlobal": "webpackHotUpdatewebpack", + + "hotUpdateGlobal": "webpackHotUpdatemyLib_awesome", + @@ ... @@ + - "library": undefined, + + "library": Object { + + "amdContainer": undefined, + + "auxiliaryComment": undefined, + + "export": undefined, + + "name": Array [ + + "myLib", + + "awesome", + + ], + + "type": "var", + + "umdNamedDefine": undefined, + + }, + @@ ... @@ + - "uniqueName": "webpack", + + "uniqueName": "myLib.awesome", + `) + ); + test( + "library contains [name] placeholder", + { + output: { + library: ["myLib", "[name]"] + } + }, + e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "chunkLoadingGlobal": "webpackChunkwebpack", + + "chunkLoadingGlobal": "webpackChunkmyLib", + @@ ... @@ + - "devtoolNamespace": "webpack", + + "devtoolNamespace": "myLib", + @@ ... @@ + - "enabledLibraryTypes": Array [], + + "enabledLibraryTypes": Array [ + + "var", + + ], + @@ ... @@ + - "hotUpdateGlobal": "webpackHotUpdatewebpack", + + "hotUpdateGlobal": "webpackHotUpdatemyLib", + @@ ... @@ + - "library": undefined, + + "library": Object { + + "amdContainer": undefined, + + "auxiliaryComment": undefined, + + "export": undefined, + + "name": Array [ + + "myLib", + + "[name]", + + ], + + "type": "var", + + "umdNamedDefine": undefined, + + }, + @@ ... @@ + - "uniqueName": "webpack", + + "uniqueName": "myLib", + `) + ); + test( + "library.name contains [name] placeholder", + { + output: { + library: { + name: ["my[name]Lib", "[name]", "lib"], + type: "var" + } + } + }, + e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "chunkLoadingGlobal": "webpackChunkwebpack", + + "chunkLoadingGlobal": "webpackChunkmyLib_lib", + @@ ... @@ + - "devtoolNamespace": "webpack", + + "devtoolNamespace": "myLib.lib", + @@ ... @@ + - "enabledLibraryTypes": Array [], + + "enabledLibraryTypes": Array [ + + "var", + + ], + @@ ... @@ + - "hotUpdateGlobal": "webpackHotUpdatewebpack", + + "hotUpdateGlobal": "webpackHotUpdatemyLib_lib", + @@ ... @@ + - "library": undefined, + + "library": Object { + + "amdContainer": undefined, + + "auxiliaryComment": undefined, + + "export": undefined, + + "name": Array [ + + "my[name]Lib", + + "[name]", + + "lib", + + ], + + "type": "var", + + "umdNamedDefine": undefined, + + }, + @@ ... @@ + - "uniqueName": "webpack", + + "uniqueName": "myLib.lib", + `) + ); + test( + "library.name.root contains [name] placeholder", + { + output: { + library: { + name: { + root: ["[name]", "myLib"] + }, + type: "var" + } + } + }, + e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "chunkLoadingGlobal": "webpackChunkwebpack", + + "chunkLoadingGlobal": "webpackChunkmyLib", + @@ ... @@ + - "devtoolNamespace": "webpack", + + "devtoolNamespace": "myLib", + @@ ... @@ + - "enabledLibraryTypes": Array [], + + "enabledLibraryTypes": Array [ + + "var", + + ], + @@ ... @@ + - "hotUpdateGlobal": "webpackHotUpdatewebpack", + + "hotUpdateGlobal": "webpackHotUpdatemyLib", + @@ ... @@ + - "library": undefined, + + "library": Object { + + "amdContainer": undefined, + + "auxiliaryComment": undefined, + + "export": undefined, + + "name": Object { + + "root": Array [ + + "[name]", + + "myLib", + + ], + + }, + + "type": "var", + + "umdNamedDefine": undefined, + + }, + @@ ... @@ + - "uniqueName": "webpack", + + "uniqueName": "myLib", + `) + ); + test( + "library.name.root contains escaped placeholder", + { + output: { + library: { + name: { + root: ["[\\name\\]", "my[\\name\\]Lib[name]", "[\\name\\]"] + }, + type: "var" + } + } + }, + e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "chunkLoadingGlobal": "webpackChunkwebpack", + + "chunkLoadingGlobal": "webpackChunk_name_my_name_Lib_name_", + @@ ... @@ + - "devtoolNamespace": "webpack", + + "devtoolNamespace": "[name].my[name]Lib.[name]", + @@ ... @@ + - "enabledLibraryTypes": Array [], + + "enabledLibraryTypes": Array [ + + "var", + + ], + @@ ... @@ + - "hotUpdateGlobal": "webpackHotUpdatewebpack", + + "hotUpdateGlobal": "webpackHotUpdate_name_my_name_Lib_name_", + @@ ... @@ + - "library": undefined, + + "library": Object { + + "amdContainer": undefined, + + "auxiliaryComment": undefined, + + "export": undefined, + + "name": Object { + + "root": Array [ + + "[\\\\name\\\\]", + + "my[\\\\name\\\\]Lib[name]", + + "[\\\\name\\\\]", + + ], + + }, + + "type": "var", + + "umdNamedDefine": undefined, + + }, + @@ ... @@ + - "uniqueName": "webpack", + + "uniqueName": "[name].my[name]Lib.[name]", + `) + ); + test("target node", { target: "node" }, e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "node": false, + + "node": true, + @@ ... @@ + - "web": true, + + "web": false, + @@ ... @@ + - "document": true, + + "document": false, + @@ ... @@ + - "target": "web", + + "target": "node", + @@ ... @@ + - "createRequire": false, + + "createRequire": true, + @@ ... @@ + - "__dirname": "mock", + - "__filename": "mock", + - "global": true, + + "__dirname": "eval-only", + + "__filename": "eval-only", + + "global": false, + @@ ... @@ + - "chunkFormat": "array-push", + + "chunkFormat": "commonjs", + @@ ... @@ + - "chunkLoading": "jsonp", + + "chunkLoading": "require", + @@ ... @@ + - "jsonp", + - "import-scripts", + + "require", + @@ ... @@ + - "fetch", + + "async-node", + @@ ... @@ + - "document": true, + + "document": false, + @@ ... @@ + - "globalObject": "self", + + "globalObject": "global", + @@ ... @@ + - "publicPath": "auto", + + "publicPath": "", + @@ ... @@ + - "wasmLoading": "fetch", + + "wasmLoading": "async-node", + @@ ... @@ + - "workerChunkLoading": "import-scripts", + + "workerChunkLoading": "require", + @@ ... @@ + - "workerWasmLoading": "fetch", + + "workerWasmLoading": "async-node", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "browser", + + "node", + @@ ... @@ + - "target": "web", + + "target": "node", + `) + ); + test("target webworker", { target: "webworker" }, e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "document": true, + + "document": false, + @@ ... @@ + - "chunkLoading": "jsonp", + + "chunkLoading": "import-scripts", + @@ ... @@ + - "jsonp", + @@ ... @@ + - "document": true, + + "document": false, + @@ ... @@ + + "worker", + @@ ... @@ + - "target": "web", + + "target": "webworker", + `) + ); + test("target electron-main", { target: "electron-main" }, e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "electron": false, + - "electronMain": false, + + "electron": true, + + "electronMain": true, + @@ ... @@ + - "node": false, + + "node": true, + @@ ... @@ + - "web": true, + + "web": false, + @@ ... @@ + - "document": true, + + "document": false, + @@ ... @@ + - "target": "web", + + "target": "electron-main", + @@ ... @@ + - "createRequire": false, + + "createRequire": true, + @@ ... @@ + - "__dirname": "mock", + - "__filename": "mock", + - "global": true, + + "__dirname": "eval-only", + + "__filename": "eval-only", + + "global": false, + @@ ... @@ + - "chunkFormat": "array-push", + + "chunkFormat": "commonjs", + @@ ... @@ + - "chunkLoading": "jsonp", + + "chunkLoading": "require", + @@ ... @@ + - "jsonp", + - "import-scripts", + + "require", + @@ ... @@ + - "fetch", + + "async-node", + @@ ... @@ + - "document": true, + + "document": false, + @@ ... @@ + - "globalObject": "self", + + "globalObject": "global", + @@ ... @@ + - "publicPath": "auto", + + "publicPath": "", + @@ ... @@ + - "wasmLoading": "fetch", + + "wasmLoading": "async-node", + @@ ... @@ + - "workerChunkLoading": "import-scripts", + + "workerChunkLoading": "require", + @@ ... @@ + - "workerWasmLoading": "fetch", + + "workerWasmLoading": "async-node", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "browser", + + "node", + + "electron", + @@ ... @@ + - "target": "web", + + "target": "electron-main", + `) + ); + test("target electron-main", { target: "electron-preload" }, e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "electron": false, + + "electron": true, + @@ ... @@ + - "electronPreload": false, + + "electronPreload": true, + @@ ... @@ + - "node": false, + + "node": true, + @@ ... @@ + - "document": true, + + "document": false, + @@ ... @@ + - "target": "web", + + "target": "electron-preload", + @@ ... @@ + - "createRequire": false, + + "createRequire": true, + @@ ... @@ + - "__dirname": "mock", + - "__filename": "mock", + - "global": true, + + "__dirname": "eval-only", + + "__filename": "eval-only", + + "global": false, + @@ ... @@ + - "chunkFormat": "array-push", + + "chunkFormat": "commonjs", + @@ ... @@ + - "chunkLoading": "jsonp", + + "chunkLoading": "require", + @@ ... @@ + - "jsonp", + - "import-scripts", + + "require", + @@ ... @@ + - "fetch", + + "async-node", + @@ ... @@ + - "document": true, + + "document": false, + @@ ... @@ + - "globalObject": "self", + + "globalObject": "global", + @@ ... @@ + - "publicPath": "auto", + + "publicPath": "", + @@ ... @@ + - "wasmLoading": "fetch", + + "wasmLoading": "async-node", + @@ ... @@ + - "workerChunkLoading": "import-scripts", + + "workerChunkLoading": "require", + @@ ... @@ + - "workerWasmLoading": "fetch", + + "workerWasmLoading": "async-node", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + - "aliasFields": Array [ + - "browser", + - ], + + "aliasFields": Array [], + @@ ... @@ + - "browser", + @@ ... @@ + + "node", + @@ ... @@ + + "electron", + @@ ... @@ + - "target": "web", + + "target": "electron-preload", + `) + ); + test("records", { recordsPath: "some-path" }, e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "portableRecords": false, + + "portableRecords": true, + @@ ... @@ + - "recordsInputPath": false, + - "recordsOutputPath": false, + + "recordsInputPath": "some-path", + + "recordsOutputPath": "some-path", + `) + ); + test("ecmaVersion", { output: { ecmaVersion: 2020 } }, e => + e.toMatchInlineSnapshot("Compared values have no visual difference.") + ); + test("single runtimeChunk", { optimization: { runtimeChunk: "single" } }, e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "runtimeChunk": false, + + "runtimeChunk": Object { + + "name": [Function name], + + }, + `) + ); + test( + "single runtimeChunk", + { optimization: { runtimeChunk: "multiple" } }, + e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "runtimeChunk": false, + + "runtimeChunk": Object { + + "name": [Function name], + + }, + `) + ); + test("single runtimeChunk", { optimization: { runtimeChunk: true } }, e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "runtimeChunk": false, + + "runtimeChunk": Object { + + "name": [Function name], + + }, + `) + ); + test("cache true", { cache: true }, e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "cache": false, + + "cache": Object { + + "cacheUnaffected": false, + + "maxGenerations": Infinity, + + "type": "memory", + + }, + @@ ... @@ + - "unsafeCache": false, + + "unsafeCache": [Function anonymous], + @@ ... @@ + - "cache": false, + + "cache": true, + @@ ... @@ + - "cache": false, + + "cache": true, + `) + ); + test("cache filesystem", { cache: { type: "filesystem" } }, e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "cache": false, + + "cache": Object { + + "allowCollectingMemory": false, + + "buildDependencies": Object { + + "defaultWebpack": Array [ + + "/lib/", + + ], + + }, + + "cacheDirectory": "/node_modules/.cache/webpack", + + "cacheLocation": "/node_modules/.cache/webpack/default-none", + + "compression": false, + + "hashAlgorithm": "md4", + + "idleTimeout": 60000, + + "idleTimeoutAfterLargeChanges": 1000, + + "idleTimeoutForInitialStore": 5000, + + "maxAge": 5184000000, + + "maxMemoryGenerations": Infinity, + + "memoryCacheUnaffected": false, + + "name": "default-none", + + "profile": false, + + "readonly": false, + + "store": "pack", + + "type": "filesystem", + + "version": "", + + }, + @@ ... @@ + - "unsafeCache": false, + + "unsafeCache": [Function anonymous], + @@ ... @@ + - "cache": false, + + "cache": true, + @@ ... @@ + - "cache": false, + + "cache": true, + `) + ); + test( + "cache filesystem development", + { mode: "development", cache: { type: "filesystem" } }, + e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "cache": false, + + "cache": Object { + + "allowCollectingMemory": true, + + "buildDependencies": Object { + + "defaultWebpack": Array [ + + "/lib/", + + ], + + }, + + "cacheDirectory": "/node_modules/.cache/webpack", + + "cacheLocation": "/node_modules/.cache/webpack/default-development", + + "compression": false, + + "hashAlgorithm": "md4", + + "idleTimeout": 60000, + + "idleTimeoutAfterLargeChanges": 1000, + + "idleTimeoutForInitialStore": 5000, + + "maxAge": 5184000000, + + "maxMemoryGenerations": 5, + + "memoryCacheUnaffected": false, + + "name": "default-development", + + "profile": false, + + "readonly": false, + + "store": "pack", + + "type": "filesystem", + + "version": "", + + }, + @@ ... @@ + - "devtool": false, + + "devtool": "eval", + @@ ... @@ + - "mode": "none", + + "mode": "development", + @@ ... @@ + - "exportsDepth": Infinity, + + "exportsDepth": 1, + @@ ... @@ + - "unsafeCache": false, + + "unsafeCache": [Function anonymous], + @@ ... @@ + - "chunkIds": "natural", + + "chunkIds": "named", + @@ ... @@ + - "moduleIds": "natural", + - "nodeEnv": false, + + "moduleIds": "named", + + "nodeEnv": "development", + @@ ... @@ + - "minRemainingSize": undefined, + + "minRemainingSize": 0, + @@ ... @@ + - "pathinfo": false, + + "pathinfo": true, + @@ ... @@ + - "cache": false, + + "cache": true, + @@ ... @@ + - "production", + + "development", + @@ ... @@ + - "cache": false, + + "cache": true, + `) + ); + test( + "cache filesystem and futureDefaults", + { cache: { type: "filesystem" }, experiments: { futureDefaults: true } }, + e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "cache": false, + + "cache": Object { + + "allowCollectingMemory": false, + + "buildDependencies": Object { + + "defaultWebpack": Array [ + + "/lib/", + + ], + + }, + + "cacheDirectory": "/node_modules/.cache/webpack", + + "cacheLocation": "/node_modules/.cache/webpack/default-none", + + "compression": false, + + "hashAlgorithm": "xxhash64", + + "idleTimeout": 60000, + + "idleTimeoutAfterLargeChanges": 1000, + + "idleTimeoutForInitialStore": 5000, + + "maxAge": 5184000000, + + "maxMemoryGenerations": Infinity, + + "memoryCacheUnaffected": false, + + "name": "default-none", + + "profile": false, + + "readonly": false, + + "store": "pack", + + "type": "filesystem", + + "version": "", + + }, + @@ ... @@ + - "asyncWebAssembly": false, + - "backCompat": true, + + "asyncWebAssembly": true, + + "backCompat": false, + @@ ... @@ + - "cacheUnaffected": false, + - "css": undefined, + - "futureDefaults": false, + + "cacheUnaffected": true, + + "css": true, + + "futureDefaults": true, + @@ ... @@ + + }, + + Object { + + "rules": Array [ + + Object { + + "descriptionData": Object { + + "type": "module", + + }, + + "resolve": Object { + + "fullySpecified": true, + + }, + + }, + + ], + + "test": /\\.wasm$/i, + + "type": "webassembly/async", + + }, + + Object { + + "mimetype": "application/wasm", + + "rules": Array [ + + Object { + + "descriptionData": Object { + + "type": "module", + + }, + + "resolve": Object { + + "fullySpecified": true, + + }, + + }, + + ], + + "type": "webassembly/async", + + }, + + Object { + + "resolve": Object { + + "fullySpecified": true, + + "preferRelative": true, + + }, + + "test": /\\.css$/i, + + "type": "css/auto", + + }, + + Object { + + "mimetype": "text/css+module", + + "resolve": Object { + + "fullySpecified": true, + + "preferRelative": true, + + }, + + "type": "css/module", + + }, + + Object { + + "mimetype": "text/css", + + "resolve": Object { + + "fullySpecified": true, + + "preferRelative": true, + + }, + + "type": "css", + @@ ... @@ + + "css": Object { + + "esModule": true, + + "exportsOnly": false, + + }, + + "css/auto": Object { + + "exportsConvention": "as-is", + + "localIdentName": "[uniqueName]-[id]-[local]", + + }, + + "css/global": Object { + + "exportsConvention": "as-is", + + "localIdentName": "[uniqueName]-[id]-[local]", + + }, + + "css/module": Object { + + "exportsConvention": "as-is", + + "localIdentName": "[uniqueName]-[id]-[local]", + + }, + @@ ... @@ + + }, + @@ ... @@ + + "css": Object { + + "import": true, + + "namedExports": true, + + "url": true, + @@ ... @@ + + "exportsPresence": "error", + @@ ... @@ + - "unsafeCache": false, + + "unsafeCache": [Function anonymous], + @@ ... @@ + - "__dirname": "mock", + - "__filename": "mock", + - "global": true, + + "__dirname": "warn-mock", + + "__filename": "warn-mock", + + "global": "warn", + @@ ... @@ + + "css", + @@ ... @@ + - "charset": true, + + "charset": false, + @@ ... @@ + - "hashDigestLength": 20, + - "hashFunction": "md4", + + "hashDigestLength": 16, + + "hashFunction": "xxhash64", + @@ ... @@ + + "css-import": Object { + + "conditionNames": Array [ + + "webpack", + + "production", + + "style", + + ], + + "extensions": Array [ + + ".css", + + ], + + "mainFields": Array [ + + "style", + + "...", + + ], + + "mainFiles": Array [], + + "preferRelative": true, + + }, + @@ ... @@ + - "cache": false, + + "cache": true, + @@ ... @@ + - "cache": false, + + "cache": true, + @@ ... @@ + - "/node_modules/", + + /^(.+?[\\\\/]node_modules[\\\\/])/, + `) + ); + + test( + "disable", + { + cache: false, + node: false, + amd: false, + optimization: { splitChunks: false } + }, + e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "amd": undefined, + + "amd": false, + @@ ... @@ + - "node": Object { + - "__dirname": "mock", + - "__filename": "mock", + - "global": true, + - }, + + "node": false, + @@ ... @@ + - "splitChunks": Object { + - "automaticNameDelimiter": "-", + - "cacheGroups": Object { + - "default": Object { + - "idHint": "", + - "minChunks": 2, + - "priority": -20, + - "reuseExistingChunk": true, + - }, + - "defaultVendors": Object { + - "idHint": "vendors", + - "priority": -10, + - "reuseExistingChunk": true, + - "test": /[\\\\/]node_modules[\\\\/]/i, + - }, + - }, + - "chunks": "async", + - "defaultSizeTypes": Array [ + - "javascript", + - "unknown", + - ], + - "enforceSizeThreshold": 30000, + - "hidePathInfo": false, + - "maxAsyncRequests": Infinity, + - "maxInitialRequests": Infinity, + - "minChunks": 1, + - "minRemainingSize": undefined, + - "minSize": 10000, + - "usedExports": false, + - }, + + "splitChunks": false, + `) + ); + + test( + "uniqueName", + { + output: { + uniqueName: "@@@Hello World!", + trustedTypes: true + } + }, + e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "chunkLoadingGlobal": "webpackChunkwebpack", + + "chunkLoadingGlobal": "webpackChunk_Hello_World_", + @@ ... @@ + - "devtoolNamespace": "webpack", + + "devtoolNamespace": "@@@Hello World!", + @@ ... @@ + - "hotUpdateGlobal": "webpackHotUpdatewebpack", + + "hotUpdateGlobal": "webpackHotUpdate_Hello_World_", + @@ ... @@ + - "trustedTypes": undefined, + - "uniqueName": "webpack", + + "trustedTypes": Object { + + "onPolicyCreationFailure": "stop", + + "policyName": "@@@Hello_World_", + + }, + + "uniqueName": "@@@Hello World!", + `) + ); + + test("stats true", { stats: true }, e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "stats": Object {}, + + "stats": Object { + + "preset": "normal", + + }, + `) + ); + + test("stats false", { stats: false }, e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "stats": Object {}, + + "stats": Object { + + "preset": "none", + + }, + `) + ); + + test("stats string", { stats: "minimal" }, e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "stats": Object {}, + + "stats": Object { + + "preset": "minimal", + + }, + `) + ); + + test( + "browserslist", + { context: path.resolve(__dirname, "fixtures/browserslist") }, + e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "context": "", + + "context": "/test/fixtures/browserslist", + @@ ... @@ + - "arrowFunction": true, + - "asyncFunction": true, + - "bigIntLiteral": true, + - "const": true, + - "destructuring": true, + + "arrowFunction": false, + + "asyncFunction": false, + + "bigIntLiteral": false, + + "const": false, + + "destructuring": false, + @@ ... @@ + - "dynamicImport": undefined, + - "dynamicImportInWorker": undefined, + - "forOf": true, + - "globalThis": undefined, + - "module": undefined, + - "nodePrefixForCoreModules": true, + - "optionalChaining": true, + - "templateLiteral": true, + + "dynamicImport": false, + + "dynamicImportInWorker": false, + + "forOf": false, + + "globalThis": false, + + "module": false, + + "nodePrefixForCoreModules": false, + + "optionalChaining": false, + + "templateLiteral": false, + @@ ... @@ + - "chunkLoadingGlobal": "webpackChunkwebpack", + + "chunkLoadingGlobal": "webpackChunkbrowserslist_test", + @@ ... @@ + - "devtoolNamespace": "webpack", + + "devtoolNamespace": "browserslist-test", + @@ ... @@ + - "arrowFunction": true, + - "asyncFunction": true, + - "bigIntLiteral": true, + - "const": true, + - "destructuring": true, + + "arrowFunction": false, + + "asyncFunction": false, + + "bigIntLiteral": false, + + "const": false, + + "destructuring": false, + @@ ... @@ + - "dynamicImport": undefined, + - "dynamicImportInWorker": undefined, + - "forOf": true, + - "globalThis": undefined, + - "module": undefined, + - "nodePrefixForCoreModules": true, + - "optionalChaining": true, + - "templateLiteral": true, + + "dynamicImport": false, + + "dynamicImportInWorker": false, + + "forOf": false, + + "globalThis": false, + + "module": false, + + "nodePrefixForCoreModules": false, + + "optionalChaining": false, + + "templateLiteral": false, + @@ ... @@ + - "hotUpdateGlobal": "webpackHotUpdatewebpack", + + "hotUpdateGlobal": "webpackHotUpdatebrowserslist_test", + @@ ... @@ + - "uniqueName": "webpack", + + "uniqueName": "browserslist-test", + @@ ... @@ + - "", + + "/test/fixtures/browserslist", + @@ ... @@ + - "target": "web", + + "target": "browserslist", + `) + ); + + test( + "non-root directory", + { + cache: { + type: "filesystem" + } + }, + e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "cache": false, + - "context": "", + + "cache": Object { + + "allowCollectingMemory": false, + + "buildDependencies": Object { + + "defaultWebpack": Array [ + + "/lib/", + + ], + + }, + + "cacheDirectory": "/node_modules/.cache/webpack", + + "cacheLocation": "/node_modules/.cache/webpack/default-none", + + "compression": false, + + "hashAlgorithm": "md4", + + "idleTimeout": 60000, + + "idleTimeoutAfterLargeChanges": 1000, + + "idleTimeoutForInitialStore": 5000, + + "maxAge": 5184000000, + + "maxMemoryGenerations": Infinity, + + "memoryCacheUnaffected": false, + + "name": "default-none", + + "profile": false, + + "readonly": false, + + "store": "pack", + + "type": "filesystem", + + "version": "", + + }, + + "context": "/test/fixtures", + @@ ... @@ + - "unsafeCache": false, + + "unsafeCache": [Function anonymous], + @@ ... @@ + - "chunkLoadingGlobal": "webpackChunkwebpack", + + "chunkLoadingGlobal": "webpackChunk", + @@ ... @@ + - "devtoolNamespace": "webpack", + + "devtoolNamespace": "", + @@ ... @@ + - "hotUpdateGlobal": "webpackHotUpdatewebpack", + + "hotUpdateGlobal": "webpackHotUpdate", + @@ ... @@ + - "path": "/dist", + + "path": "/test/fixtures/dist", + @@ ... @@ + - "uniqueName": "webpack", + + "uniqueName": "", + @@ ... @@ + - "cache": false, + + "cache": true, + @@ ... @@ + - "", + + "/test/fixtures", + @@ ... @@ + - "cache": false, + + "cache": true, + `), + () => { + process.chdir(path.resolve(__dirname, "fixtures")); + }, + () => { + process.chdir(cwd); + } + ); + + test( + "array defaults", + { + output: { + enabledChunkLoadingTypes: ["require", "..."], + enabledWasmLoadingTypes: ["...", "async-node"] + } + }, + e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + + "require", + @@ ... @@ + + "async-node", + `) + ); + + test( + "experiments.futureDefaults", + { + experiments: { + futureDefaults: true + } + }, + e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "asyncWebAssembly": false, + - "backCompat": true, + + "asyncWebAssembly": true, + + "backCompat": false, + @@ ... @@ + - "cacheUnaffected": false, + - "css": undefined, + - "futureDefaults": false, + + "cacheUnaffected": true, + + "css": true, + + "futureDefaults": true, + @@ ... @@ + + }, + + Object { + + "rules": Array [ + + Object { + + "descriptionData": Object { + + "type": "module", + + }, + + "resolve": Object { + + "fullySpecified": true, + @@ ... @@ + + }, + + ], + + "test": /\\.wasm$/i, + + "type": "webassembly/async", + + }, + + Object { + + "mimetype": "application/wasm", + + "rules": Array [ + @@ ... @@ + + "descriptionData": Object { + + "type": "module", + + }, + + "resolve": Object { + + "fullySpecified": true, + + }, + + }, + + ], + + "type": "webassembly/async", + + }, + + Object { + + "resolve": Object { + + "fullySpecified": true, + + "preferRelative": true, + + }, + + "test": /\\.css$/i, + + "type": "css/auto", + + }, + + Object { + + "mimetype": "text/css+module", + + "resolve": Object { + + "fullySpecified": true, + + "preferRelative": true, + + }, + + "type": "css/module", + + }, + + Object { + + "mimetype": "text/css", + + "resolve": Object { + + "fullySpecified": true, + + "preferRelative": true, + + }, + + "type": "css", + + }, + + Object { + @@ ... @@ + + "css": Object { + + "esModule": true, + + "exportsOnly": false, + + }, + + "css/auto": Object { + + "exportsConvention": "as-is", + + "localIdentName": "[uniqueName]-[id]-[local]", + + }, + + "css/global": Object { + + "exportsConvention": "as-is", + + "localIdentName": "[uniqueName]-[id]-[local]", + + }, + + "css/module": Object { + + "exportsConvention": "as-is", + + "localIdentName": "[uniqueName]-[id]-[local]", + + }, + @@ ... @@ + + "css": Object { + + "import": true, + + "namedExports": true, + + "url": true, + + }, + @@ ... @@ + + "exportsPresence": "error", + @@ ... @@ + - "__dirname": "mock", + - "__filename": "mock", + - "global": true, + + "__dirname": "warn-mock", + + "__filename": "warn-mock", + + "global": "warn", + @@ ... @@ + + "css", + @@ ... @@ + - "charset": true, + + "charset": false, + @@ ... @@ + - "hashDigestLength": 20, + - "hashFunction": "md4", + + "hashDigestLength": 16, + + "hashFunction": "xxhash64", + @@ ... @@ + + "...", + + ], + + }, + + "css-import": Object { + + "conditionNames": Array [ + + "webpack", + + "production", + + "style", + + ], + + "extensions": Array [ + + ".css", + + ], + + "mainFields": Array [ + + "style", + @@ ... @@ + + "mainFiles": Array [], + + "preferRelative": true, + @@ ... @@ + - "/node_modules/", + + /^(.+?[\\\\/]node_modules[\\\\/])/, + `) + ); + + test( + "experiments.futureDefaults w/ experiments.css disabled", + { + experiments: { + css: false, + futureDefaults: true + } + }, + e => + e.toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "asyncWebAssembly": false, + - "backCompat": true, + + "asyncWebAssembly": true, + + "backCompat": false, + @@ ... @@ + - "cacheUnaffected": false, + - "css": undefined, + - "futureDefaults": false, + + "cacheUnaffected": true, + + "css": false, + + "futureDefaults": true, + @@ ... @@ + + }, + + Object { + + "rules": Array [ + + Object { + + "descriptionData": Object { + + "type": "module", + + }, + + "resolve": Object { + + "fullySpecified": true, + + }, + + }, + + ], + + "test": /\\.wasm$/i, + + "type": "webassembly/async", + @@ ... @@ + + "mimetype": "application/wasm", + + "rules": Array [ + + Object { + + "descriptionData": Object { + + "type": "module", + + }, + + "resolve": Object { + + "fullySpecified": true, + + }, + + }, + + ], + + "type": "webassembly/async", + + }, + + Object { + @@ ... @@ + + "exportsPresence": "error", + @@ ... @@ + - "__dirname": "mock", + - "__filename": "mock", + - "global": true, + + "__dirname": "warn-mock", + + "__filename": "warn-mock", + + "global": "warn", + @@ ... @@ + - "charset": true, + + "charset": false, + @@ ... @@ + - "hashDigestLength": 20, + - "hashFunction": "md4", + + "hashDigestLength": 16, + + "hashFunction": "xxhash64", + @@ ... @@ + - "/node_modules/", + + /^(.+?[\\\\/]node_modules[\\\\/])/, + `) + ); +}); + +it("should result in the same target options for same target", () => { + const inlineTarget = getDefaultConfig({ target: "node12.17" }); + const browserslistTarget = getDefaultConfig({ + target: "browserslist: node 12.17" + }); + const diff = stripVTControlCharacters( + jestDiff(inlineTarget, browserslistTarget, { + expand: false, + contextLines: 0 + }) + ); + + expect(inlineTarget.output.environment.module).toBe(true); + expect(inlineTarget.output.environment.dynamicImport).toBe(true); + expect(new Diff(diff)).toMatchInlineSnapshot(` + - Expected + + Received + + @@ ... @@ + - "target": "node12.17", + + "target": "browserslist: node 12.17", + `); +}); diff --git a/test/DelegatedModule.unittest.js b/test/DelegatedModule.unittest.js deleted file mode 100644 index 977adbd50e3..00000000000 --- a/test/DelegatedModule.unittest.js +++ /dev/null @@ -1,38 +0,0 @@ -/* globals describe, it, beforeEach */ -"use strict"; - -const DelegatedModule = require("../lib/DelegatedModule"); - -describe("DelegatedModule", () => { - describe("#updateHash", () => { - const sourceRequest = "dll-reference dll_e54c0fb67f8152792ad2"; - const data = { - id: "/xg9" - }; - const type = "require"; - const userRequest = "./library.js"; - let hashedText; - let hash; - beforeEach(() => { - hashedText = ""; - hash = { - update: text => { - hashedText += text; - } - }; - const delegatedModule = new DelegatedModule( - sourceRequest, - data, - type, - userRequest - ); - delegatedModule.updateHash(hash); - }); - it("updates hash with delegated module ID", () => { - expect(hashedText).toMatch("/xg9"); - }); - it("updates hash with delegation type", () => { - expect(hashedText).toMatch("require"); - }); - }); -}); diff --git a/test/Errors.test.js b/test/Errors.test.js index 8d5a8fbd1be..6ea03027f61 100644 --- a/test/Errors.test.js +++ b/test/Errors.test.js @@ -1,396 +1,924 @@ "use strict"; -/*globals describe it */ +require("./helpers/warmup-webpack"); + const path = require("path"); +const fs = require("graceful-fs"); +const webpack = require(".."); +const prettyFormat = require("pretty-format").default; -const webpack = require("../lib/webpack"); +const CWD_PATTERN = new RegExp(process.cwd().replace(/\\/g, "/"), "gm"); +const ERROR_STACK_PATTERN = /(?:\n\s+at\s.*)+/gm; -const base = path.join(__dirname, "fixtures", "errors"); +/** + * @param {unknown} err an err + * @returns {Record} a cleaned error + */ +function cleanError(err) { + const result = {}; + for (const key of Object.getOwnPropertyNames(err)) { + result[key] = err[key]; + } -describe("Errors", () => { - jest.setTimeout(20000); + if (result.message) { + result.message = err.message.replace(ERROR_STACK_PATTERN, ""); + } + + if (result.stack) { + result.stack = result.stack.replace(ERROR_STACK_PATTERN, ""); + } - function customOutputFilesystem(c) { - const files = {}; - c.outputFileSystem = { - join: path.join.bind(path), - mkdirp(path, callback) { - callback(); + return result; +} + +/** + * @param {unknown} received received + * @returns {string} serialized value + */ +function serialize(received) { + return prettyFormat(received, prettyFormatOptions) + .replace(CWD_PATTERN, "") + .trim(); +} + +const prettyFormatOptions = { + escapeRegex: false, + printFunctionName: false, + plugins: [ + { + test(val) { + return typeof val === "string"; }, - writeFile(name, content, callback) { - files[name] = content.toString("utf-8"); - callback(); + print(val) { + return `"${val + .replace(/\\/gm, "/") + .replace(/"/gm, '\\"') + .replace(/\r?\n/gm, "\\n")}"`; } - }; - return files; - } + } + ] +}; - function getErrors(options, callback) { - options.context = base; - const c = webpack(options); - customOutputFilesystem(c); - c.run((err, stats) => { - if (err) throw err; - expect(typeof stats).toBe("object"); - stats = stats.toJson({ - errorDetails: false - }); - expect(typeof stats).toBe("object"); - expect(stats).toHaveProperty("errors"); - expect(stats).toHaveProperty("warnings"); - expect(Array.isArray(stats.errors)).toBe(true); - expect(Array.isArray(stats.warnings)).toBe(true); - callback(stats.errors, stats.warnings); +expect.addSnapshotSerializer({ + test(received) { + return received.errors || received.warnings; + }, + print(received) { + return serialize({ + errors: received.errors.map(cleanError), + warnings: received.warnings.map(cleanError) }); } +}); + +expect.addSnapshotSerializer({ + test(received) { + return received.message; + }, + print(received) { + return serialize(cleanError(received)); + } +}); - function getErrorsPromise(options, callback) { - return new Promise((resolve, reject) => { - getErrors(options, (errors, warnings) => { - callback(errors, warnings); - resolve(); +const defaults = { + options: { + context: path.resolve(__dirname, "fixtures", "errors"), + mode: "none", + devtool: false, + optimization: { + minimize: false + } + }, + outputFileSystem: { + mkdir(dir, callback) { + callback(); + }, + writeFile(file, content, callback) { + callback(); + }, + stat(file, callback) { + callback(new Error("ENOENT")); + } + } +}; + +/** + * @param {import("../").Configuration} options options + * @returns {Promise<{errors: TODO[], warnings: TODO[]}>} errors and warnings + */ +async function compile(options) { + const stats = await new Promise((resolve, reject) => { + const compiler = webpack({ ...defaults.options, ...options }); + if (options.mode === "production") { + if (options.optimization) options.optimization.minimize = true; + else options.optimization = { minimize: true }; + } + compiler.outputFileSystem = defaults.outputFileSystem; + + try { + compiler.run((bailedError, stats) => { + if (bailedError) { + return reject(bailedError); + } + compiler.close(closeError => { + if (closeError) { + return reject(closeError); + } + resolve(stats); + }); }); + } catch (err) { + // capture sync thrown errors + reject(err); + } + }); + + expect(typeof stats).toEqual("object"); + const statsResult = stats.toJson({ errorDetails: false }); + expect(typeof statsResult).toBe("object"); + const { errors, warnings } = statsResult; + expect(Array.isArray(errors)).toBe(true); + expect(Array.isArray(warnings)).toBe(true); + + return { errors, warnings }; +} + +it("should emit warning for missingFile", async () => { + await expect( + compile({ + entry: "./missingFile" + }) + ).resolves.toMatchInlineSnapshot(` + Object { + "errors": Array [ + Object { + "loc": "4:0-20", + "message": "Module not found: Error: Can't resolve './missing' in '/test/fixtures/errors'", + "moduleId": 0, + "moduleIdentifier": "/test/fixtures/errors/missingFile.js", + "moduleName": "./missingFile.js", + "moduleTrace": Array [], + "stack": "ModuleNotFoundError: Module not found: Error: Can't resolve './missing' in '/test/fixtures/errors'", + }, + Object { + "loc": "12:9-34", + "message": "Module not found: Error: Can't resolve './dir/missing2' in '/test/fixtures/errors'", + "moduleId": 0, + "moduleIdentifier": "/test/fixtures/errors/missingFile.js", + "moduleName": "./missingFile.js", + "moduleTrace": Array [], + "stack": "ModuleNotFoundError: Module not found: Error: Can't resolve './dir/missing2' in '/test/fixtures/errors'", + }, + ], + "warnings": Array [], + } + `); +}, 20000); + +it("should emit warning for require.extensions", async () => { + await expect(compile({ entry: "./require.extensions" })).resolves + .toMatchInlineSnapshot(` + Object { + "errors": Array [], + "warnings": Array [ + Object { + "loc": "1:0-18", + "message": "require.extensions is not supported by webpack. Use a loader instead.", + "moduleId": 0, + "moduleIdentifier": "/test/fixtures/errors/require.extensions.js", + "moduleName": "./require.extensions.js", + "moduleTrace": Array [], + "stack": "UnsupportedFeatureWarning: require.extensions is not supported by webpack. Use a loader instead.", + }, + ], + } + `); +}); + +it("should emit warning for require.main.require", async () => { + await expect(compile({ entry: "./require.main.require" })).resolves + .toMatchInlineSnapshot(` + Object { + "errors": Array [], + "warnings": Array [ + Object { + "loc": "1:0-30", + "message": "require.main.require is not supported by webpack.", + "moduleId": 0, + "moduleIdentifier": "/test/fixtures/errors/require.main.require.js", + "moduleName": "./require.main.require.js", + "moduleTrace": Array [], + "stack": "UnsupportedFeatureWarning: require.main.require is not supported by webpack.", + }, + ], + } + `); +}); +it("should emit warning for module.parent.require", async () => { + await expect(compile({ entry: "./module.parent.require" })).resolves + .toMatchInlineSnapshot(` + Object { + "errors": Array [], + "warnings": Array [ + Object { + "loc": "1:0-31", + "message": "module.parent.require is not supported by webpack.", + "moduleId": 0, + "moduleIdentifier": "/test/fixtures/errors/module.parent.require.js", + "moduleName": "./module.parent.require.js", + "moduleTrace": Array [], + "stack": "UnsupportedFeatureWarning: module.parent.require is not supported by webpack.", + }, + ], + } + `); +}); + +const isCaseInsensitiveFilesystem = fs.existsSync( + path.resolve(__dirname, "fixtures", "errors", "FILE.js") +); +if (isCaseInsensitiveFilesystem) { + it("should emit warning for case-preserved disk", async () => { + const result = await compile({ + mode: "development", + entry: "./case-sensitive" }); - } - it("should throw an error if file doesn't exist", done => { - getErrors( - { - mode: "development", - entry: "./missingFile" - }, - (errors, warnings) => { - expect(errors).toHaveLength(2); - expect(warnings).toHaveLength(0); - errors.sort(); - let lines = errors[0].split("\n"); - expect(lines[0]).toMatch(/missingFile.js/); - expect(lines[1]).toMatch(/^Module not found/); - expect(lines[1]).toMatch(/\.\/dir\/missing2/); - expect(lines[2]).toMatch(/missingFile.js 12:9/); - lines = errors[1].split("\n"); - expect(lines[0]).toMatch(/missingFile.js/); - expect(lines[1]).toMatch(/^Module not found/); - expect(lines[1]).toMatch(/\.\/missing/); - expect(lines[2]).toMatch(/missingFile.js 4:0/); - done(); - } - ); + expect(result).toMatchInlineSnapshot(` + Object { + "errors": Array [], + "warnings": Array [ + Object { + "message": "There are multiple modules with names that only differ in casing.\\nThis can lead to unexpected behavior when compiling on a filesystem with other case-semantic.\\nUse equal casing. Compare these module identifiers:\\n* /test/fixtures/errors/FILE.js\\n Used by 1 module(s), i. e.\\n /test/fixtures/errors/case-sensitive.js\\n* /test/fixtures/errors/file.js\\n Used by 1 module(s), i. e.\\n /test/fixtures/errors/case-sensitive.js", + "moduleId": "./FILE.js", + "moduleIdentifier": "/test/fixtures/errors/FILE.js", + "moduleName": "./FILE.js", + "moduleTrace": Array [ + Object { + "dependencies": Array [ + Object { + "loc": "2:0-17", + }, + ], + "moduleId": "./FILE.js", + "moduleIdentifier": "/test/fixtures/errors/FILE.js", + "moduleName": "./FILE.js", + "originId": "./case-sensitive.js", + "originIdentifier": "/test/fixtures/errors/case-sensitive.js", + "originName": "./case-sensitive.js", + }, + ], + "stack": "CaseSensitiveModulesWarning: There are multiple modules with names that only differ in casing.\\nThis can lead to unexpected behavior when compiling on a filesystem with other case-semantic.\\nUse equal casing. Compare these module identifiers:\\n* /test/fixtures/errors/FILE.js\\n Used by 1 module(s), i. e.\\n /test/fixtures/errors/case-sensitive.js\\n* /test/fixtures/errors/file.js\\n Used by 1 module(s), i. e.\\n /test/fixtures/errors/case-sensitive.js", + }, + ], + } + `); }); - it("should report require.extensions as unsupported", done => { - getErrors( - { - mode: "development", - entry: "./require.extensions" - }, - (errors, warnings) => { - expect(errors).toHaveLength(0); - expect(warnings).toHaveLength(1); - const lines = warnings[0].split("\n"); - expect(lines[0]).toMatch(/require.extensions\.js/); - expect(lines[1]).toMatch( - /require.extensions is not supported by webpack/ - ); - done(); - } - ); +} else { + it("should emit error for case-sensitive", async () => { + const result = await compile({ + mode: "development", + entry: "./case-sensitive" + }); + expect(result).toMatchInlineSnapshot(` + Object { + "errors": Array [ + Object { + "loc": "2:0-17", + "message": "Module not found: Error: Can't resolve './FILE' in '/test/fixtures/errors'", + "moduleId": "./case-sensitive.js", + "moduleIdentifier": "/test/fixtures/errors/case-sensitive.js", + "moduleName": "./case-sensitive.js", + "moduleTrace": Array [], + "stack": "ModuleNotFoundError: Module not found: Error: Can't resolve './FILE' in '/test/fixtures/errors'", + }, + ], + "warnings": Array [], + } + `); }); - it("should report require.main.require as unsupported", done => { - getErrors( - { - mode: "development", - entry: "./require.main.require" - }, - (errors, warnings) => { - expect(errors).toHaveLength(0); - expect(warnings).toHaveLength(1); - const lines = warnings[0].split("\n"); - expect(lines[0]).toMatch(/require.main.require\.js/); - expect(lines[1]).toMatch( - /require.main.require is not supported by webpack/ - ); - done(); - } - ); +} + +it("should emit warning for undef mode", async () => { + await expect(compile({ mode: undefined, entry: "./entry-point" })).resolves + .toMatchInlineSnapshot(` + Object { + "errors": Array [], + "warnings": Array [ + Object { + "message": "configuration\\nThe 'mode' option has not been set, webpack will fallback to 'production' for this value.\\nSet 'mode' option to 'development' or 'production' to enable defaults for each environment.\\nYou can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/configuration/mode/", + "stack": "NoModeWarning: configuration\\nThe 'mode' option has not been set, webpack will fallback to 'production' for this value.\\nSet 'mode' option to 'development' or 'production' to enable defaults for each environment.\\nYou can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/configuration/mode/", + }, + ], + } + `); +}); +it("should emit no errors or warnings for no-errors-deprecate", async () => { + await expect(compile({ mode: "production", entry: "./no-errors-deprecate" })) + .resolves.toMatchInlineSnapshot(` + Object { + "errors": Array [], + "warnings": Array [], + } + `); +}); + +it("should emit errors for missingFile for production", async () => { + await expect(compile({ mode: "production", entry: "./missingFile" })).resolves + .toMatchInlineSnapshot(` + Object { + "errors": Array [ + Object { + "loc": "4:0-20", + "message": "Module not found: Error: Can't resolve './missing' in '/test/fixtures/errors'", + "moduleId": 915, + "moduleIdentifier": "/test/fixtures/errors/missingFile.js", + "moduleName": "./missingFile.js", + "moduleTrace": Array [], + "stack": "ModuleNotFoundError: Module not found: Error: Can't resolve './missing' in '/test/fixtures/errors'", + }, + Object { + "loc": "12:9-34", + "message": "Module not found: Error: Can't resolve './dir/missing2' in '/test/fixtures/errors'", + "moduleId": 915, + "moduleIdentifier": "/test/fixtures/errors/missingFile.js", + "moduleName": "./missingFile.js", + "moduleTrace": Array [], + "stack": "ModuleNotFoundError: Module not found: Error: Can't resolve './dir/missing2' in '/test/fixtures/errors'", + }, + ], + "warnings": Array [], + } + `); +}); + +it("should emit module build errors", async () => { + await expect(compile({ entry: "./has-syntax-error" })).resolves + .toMatchInlineSnapshot(` + Object { + "errors": Array [ + Object { + "loc": "2:12", + "message": "Module parse failed: Unexpected token (2:12)\\nYou may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders\\n| window.foo = {\\n> bar: true,;\\n| };\\n| ", + "moduleId": 0, + "moduleIdentifier": "/test/fixtures/errors/has-syntax-error.js", + "moduleName": "./has-syntax-error.js", + "moduleTrace": Array [], + "stack": "ModuleParseError: Module parse failed: Unexpected token (2:12)\\nYou may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders\\n| window.foo = {\\n> bar: true,;\\n| };\\n| ", + }, + ], + "warnings": Array [], + } + `); +}); + +it("should bao; thrown sync error from plugin", async () => { + await expect( + compile({ + entry: "./no-errors-deprecate", + plugins: [require("./fixtures/errors/throw-error-plugin")] + }) + ).rejects.toMatchInlineSnapshot(` + Object { + "message": "foo", + "stack": "Error: foo", + } + `); +}); + +it("should emit warning when 'output.iife'=false is used with 'output.library.type'='umd'", async () => { + await expect( + compile({ + mode: "production", + entry: "./false-iife-umd.js", + output: { library: { type: "umd" }, iife: false } + }) + ).resolves.toMatchInlineSnapshot(` + Object { + "errors": Array [], + "warnings": Array [ + Object { + "message": "Configuration:\\nSetting 'output.iife' to 'false' is incompatible with 'output.library.type' set to 'umd'. This configuration may cause unexpected behavior, as UMD libraries are expected to use an IIFE (Immediately Invoked Function Expression) to support various module formats. Consider setting 'output.iife' to 'true' or choosing a different 'library.type' to ensure compatibility.\\nLearn more: https://webpack.js.org/configuration/output/", + "stack": "FalseIIFEUmdWarning: Configuration:\\nSetting 'output.iife' to 'false' is incompatible with 'output.library.type' set to 'umd'. This configuration may cause unexpected behavior, as UMD libraries are expected to use an IIFE (Immediately Invoked Function Expression) to support various module formats. Consider setting 'output.iife' to 'true' or choosing a different 'library.type' to ensure compatibility.\\nLearn more: https://webpack.js.org/configuration/output/", + }, + ], + } + `); +}); + +describe("loaders", () => { + it("should emit error thrown at module level", async () => { + await expect( + compile({ + entry: "./module-level-throw-error-loader!./no-errors-deprecate" + }) + ).resolves.toMatchInlineSnapshot(` + Object { + "errors": Array [ + Object { + "message": "Module build failed (from ./module-level-throw-error-loader.js):\\nError: this is a thrown error from module level", + "moduleId": 0, + "moduleIdentifier": "/test/fixtures/errors/module-level-throw-error-loader.js!/test/fixtures/errors/no-errors-deprecate.js", + "moduleName": "./module-level-throw-error-loader.js!./no-errors-deprecate.js", + "moduleTrace": Array [], + "stack": "ModuleBuildError: Module build failed (from ./module-level-throw-error-loader.js):\\nError: this is a thrown error from module level", + }, + ], + "warnings": Array [], + } + `); }); - it("should report module.parent.require as unsupported", done => { - getErrors( - { - mode: "development", - entry: "./module.parent.require" - }, - (errors, warnings) => { - expect(errors).toHaveLength(0); - expect(warnings).toHaveLength(1); - const lines = warnings[0].split("\n"); - expect(lines[0]).toMatch(/module.parent.require\.js/); - expect(lines[1]).toMatch( - /module.parent.require is not supported by webpack/ - ); - done(); - } - ); + it("should emit errors & warnings for emit-error-loader", async () => { + await expect(compile({ entry: "./entry-point-error-loader-required.js" })) + .resolves.toMatchInlineSnapshot(` + Object { + "errors": Array [ + Object { + "message": "Module Error (from ./emit-error-loader.js):\\nthis is an error", + "moduleId": 1, + "moduleIdentifier": "/test/fixtures/errors/emit-error-loader.js!/test/fixtures/errors/file.js", + "moduleName": "./emit-error-loader.js!./file.js", + "moduleTrace": Array [ + Object { + "dependencies": Array [ + Object { + "loc": "1:0-40", + }, + ], + "moduleId": 1, + "moduleIdentifier": "/test/fixtures/errors/emit-error-loader.js!/test/fixtures/errors/file.js", + "moduleName": "./emit-error-loader.js!./file.js", + "originId": 0, + "originIdentifier": "/test/fixtures/errors/entry-point-error-loader-required.js", + "originName": "./entry-point-error-loader-required.js", + }, + ], + "stack": "ModuleError: Module Error (from ./emit-error-loader.js):\\nthis is an error", + }, + ], + "warnings": Array [ + Object { + "message": "Module Warning (from ./emit-error-loader.js):\\nthis is a warning", + "moduleId": 1, + "moduleIdentifier": "/test/fixtures/errors/emit-error-loader.js!/test/fixtures/errors/file.js", + "moduleName": "./emit-error-loader.js!./file.js", + "moduleTrace": Array [ + Object { + "dependencies": Array [ + Object { + "loc": "1:0-40", + }, + ], + "moduleId": 1, + "moduleIdentifier": "/test/fixtures/errors/emit-error-loader.js!/test/fixtures/errors/file.js", + "moduleName": "./emit-error-loader.js!./file.js", + "originId": 0, + "originIdentifier": "/test/fixtures/errors/entry-point-error-loader-required.js", + "originName": "./entry-point-error-loader-required.js", + }, + ], + "stack": "ModuleWarning: Module Warning (from ./emit-error-loader.js):\\nthis is a warning", + }, + ], + } + `); }); - it("should warn about case-sensitive module names", done => { - getErrors( - { - mode: "development", - entry: "./case-sensitive" - }, - (errors, warnings) => { - if (errors.length === 0) { - expect(warnings).toHaveLength(1); - const lines = warnings[0].split("\n"); - expect(lines[4]).toMatch(/FILE\.js/); - expect(lines[5]).toMatch(/Used by/); - expect(lines[6]).toMatch(/case-sensitive/); - expect(lines[7]).toMatch(/file\.js/); - expect(lines[8]).toMatch(/Used by/); - expect(lines[9]).toMatch(/case-sensitive/); - } else { - expect(errors).toHaveLength(1); - expect(warnings).toHaveLength(0); - } - done(); - } - ); + + it("should emit error & warning for emit-error-loader", async () => { + await expect(compile({ entry: "./emit-error-loader!./entry-point.js" })) + .resolves.toMatchInlineSnapshot(` + Object { + "errors": Array [ + Object { + "message": "Module Error (from ./emit-error-loader.js):\\nthis is an error", + "moduleId": 0, + "moduleIdentifier": "/test/fixtures/errors/emit-error-loader.js!/test/fixtures/errors/entry-point.js", + "moduleName": "./emit-error-loader.js!./entry-point.js", + "moduleTrace": Array [], + "stack": "ModuleError: Module Error (from ./emit-error-loader.js):\\nthis is an error", + }, + ], + "warnings": Array [ + Object { + "message": "Module Warning (from ./emit-error-loader.js):\\nthis is a warning", + "moduleId": 0, + "moduleIdentifier": "/test/fixtures/errors/emit-error-loader.js!/test/fixtures/errors/entry-point.js", + "moduleName": "./emit-error-loader.js!./entry-point.js", + "moduleTrace": Array [], + "stack": "ModuleWarning: Module Warning (from ./emit-error-loader.js):\\nthis is a warning", + }, + ], + } + `); }); - it("should warn when not using mode", done => { - getErrors( - { - entry: "./entry-point" - }, - (errors, warnings) => { - expect(errors).toHaveLength(0); - expect(warnings).toHaveLength(1); - let lines = warnings[0].split("\n"); - expect(lines[0]).toMatch(/configuration/); - expect(lines[1]).toMatch(/mode/); - expect(lines[1]).toMatch(/development/); - expect(lines[1]).toMatch(/production/); - done(); - } - ); + it("should emit error for json-loader when not json", async () => { + await expect(compile({ entry: "json-loader!./not-a-json.js" })).resolves + .toMatchInlineSnapshot(` + Object { + "errors": Array [ + Object { + "message": "Module build failed (from ../../../node_modules/json-loader/index.js):\\nSyntaxError: Unexpected end of JSON input", + "moduleId": 0, + "moduleIdentifier": "/node_modules/json-loader/index.js!/test/fixtures/errors/not-a-json.js", + "moduleName": "../../../node_modules/json-loader/index.js!./not-a-json.js", + "moduleTrace": Array [], + "stack": "ModuleBuildError: Module build failed (from ../../../node_modules/json-loader/index.js):\\nSyntaxError: Unexpected end of JSON input", + }, + ], + "warnings": Array [], + } + `); }); - it("should not warn if the NoEmitOnErrorsPlugin is used over the NoErrorsPlugin", done => { - getErrors( - { - mode: "production", - entry: "./no-errors-deprecate" - }, - (errors, warnings) => { - expect(errors).toHaveLength(0); - expect(warnings).toHaveLength(0); - done(); - } - ); + + it("should emit error for async-error-loader", async () => { + await expect(compile({ entry: "./async-error-loader!./entry-point.js" })) + .resolves.toMatchInlineSnapshot(` + Object { + "errors": Array [ + Object { + "message": "Module build failed (from ./async-error-loader.js):\\nError: this is a callback error", + "moduleId": 0, + "moduleIdentifier": "/test/fixtures/errors/async-error-loader.js!/test/fixtures/errors/entry-point.js", + "moduleName": "./async-error-loader.js!./entry-point.js", + "moduleTrace": Array [], + "stack": "ModuleBuildError: Module build failed (from ./async-error-loader.js):\\nError: this is a callback error", + }, + ], + "warnings": Array [], + } + `); }); - it("should not not emit if NoEmitOnErrorsPlugin is used and there is an error", done => { - getErrors( - { - mode: "production", - entry: "./missingFile" - }, - (errors, warnings) => { - expect(errors).toHaveLength(2); - expect(warnings).toHaveLength(0); - errors.sort(); - let lines = errors[0].split("\n"); - expect(lines[0]).toMatch(/missingFile.js/); - expect(lines[1]).toMatch(/^Module not found/); - expect(lines[1]).toMatch(/\.\/dir\/missing2/); - expect(lines[2]).toMatch(/missingFile.js 12:9/); - lines = errors[1].split("\n"); - expect(lines[0]).toMatch(/missingFile.js/); - expect(lines[1]).toMatch(/^Module not found/); - expect(lines[1]).toMatch(/\.\/missing/); - expect(lines[2]).toMatch(/missingFile.js 4:0/); - done(); - } - ); + + it("should emit error thrown from raw loader", async () => { + await expect(compile({ entry: "./throw-error-loader!./entry-point.js" })) + .resolves.toMatchInlineSnapshot(` + Object { + "errors": Array [ + Object { + "message": "Module build failed (from ./throw-error-loader.js):\\nError: this is a thrown error", + "moduleId": 0, + "moduleIdentifier": "/test/fixtures/errors/throw-error-loader.js!/test/fixtures/errors/entry-point.js", + "moduleName": "./throw-error-loader.js!./entry-point.js", + "moduleTrace": Array [], + "stack": "ModuleBuildError: Module build failed (from ./throw-error-loader.js):\\nError: this is a thrown error", + }, + ], + "warnings": Array [], + } + `); }); - it("should throw an error when trying to use [chunkhash] when it's invalid", done => { - getErrors( - { - mode: "development", - entry: { - a: "./entry-point", - b: "./entry-point", - c: "./entry-point" - }, - output: { - filename: "[chunkhash].js" - }, - plugins: [new webpack.HotModuleReplacementPlugin()] - }, - (errors, warnings) => { - expect(errors).toHaveLength(3); - expect(warnings).toHaveLength(0); - errors.forEach(error => { - const lines = error.split("\n"); - expect(lines[0]).toMatch(/chunk (a|b|c)/); - expect(lines[2]).toMatch(/\[chunkhash\].js/); - expect(lines[2]).toMatch(/use \[hash\] instead/); - }); - done(); - } - ); + + it("should emit error thrown from pitch loader", async () => { + await expect(compile({ entry: "./throw-error-loader!./entry-point.js" })) + .resolves.toMatchInlineSnapshot(` + Object { + "errors": Array [ + Object { + "message": "Module build failed (from ./throw-error-loader.js):\\nError: this is a thrown error", + "moduleId": 0, + "moduleIdentifier": "/test/fixtures/errors/throw-error-loader.js!/test/fixtures/errors/entry-point.js", + "moduleName": "./throw-error-loader.js!./entry-point.js", + "moduleTrace": Array [], + "stack": "ModuleBuildError: Module build failed (from ./throw-error-loader.js):\\nError: this is a thrown error", + }, + ], + "warnings": Array [], + } + `); }); - it("should show loader name when emit/throw errors or warnings from loaders", () => { - return Promise.all([ - getErrorsPromise( - { - mode: "development", - entry: "./entry-point-error-loader-required.js" - }, - (errors, warnings) => { - expect(warnings).toHaveLength(1); - expect(warnings[0].split("\n")[1]).toMatch( - /^Module Warning \(from .\/emit-error-loader.js\):$/ - ); - expect(errors).toHaveLength(1); - expect(errors[0].split("\n")[1]).toMatch( - /^Module Error \(from .\/emit-error-loader.js\):$/ - ); - } - ), - getErrorsPromise( - { - mode: "development", - entry: path.resolve(base, "./emit-error-loader") + "!./entry-point.js" - }, - (errors, warnings) => { - expect(warnings).toHaveLength(1); - expect(warnings[0].split("\n")[1]).toMatch( - /^Module Warning \(from .\/emit-error-loader.js\):$/ - ); - expect(errors).toHaveLength(1); - expect(errors[0].split("\n")[1]).toMatch( - /^Module Error \(from .\/emit-error-loader.js\):$/ - ); - } - ), - getErrorsPromise( - { - mode: "development", - entry: "./not-a-json.js", - module: { - rules: [ - { - test: /not-a-json\.js$/, - use: [ - "json-loader", - { - loader: path.resolve(base, "./emit-error-loader") - } - ] - } - ] + it("should emit error thrown from yaw loader", async () => { + await expect(compile({ entry: "./throw-error-loader!./entry-point.js" })) + .resolves.toMatchInlineSnapshot(` + Object { + "errors": Array [ + Object { + "message": "Module build failed (from ./throw-error-loader.js):\\nError: this is a thrown error", + "moduleId": 0, + "moduleIdentifier": "/test/fixtures/errors/throw-error-loader.js!/test/fixtures/errors/entry-point.js", + "moduleName": "./throw-error-loader.js!./entry-point.js", + "moduleTrace": Array [], + "stack": "ModuleBuildError: Module build failed (from ./throw-error-loader.js):\\nError: this is a thrown error", + }, + ], + "warnings": Array [], } - }, - (errors, warnings) => { - expect(warnings).toHaveLength(1); - expect(warnings[0].split("\n")[1]).toMatch( - /^Module Warning \(from .\/emit-error-loader.js\):$/ - ); - expect(errors).toHaveLength(2); - expect(errors[0].split("\n")[1]).toMatch( - /^Module Error \(from .\/emit-error-loader.js\):$/ - ); - expect(errors[1].split("\n")[1]).toMatch( - /^Module build failed \(from \(webpack\)\/node_modules\/json-loader\/index.js\):$/ - ); - } - ), - getErrorsPromise( - { - mode: "development", - entry: "./entry-point.js", - module: { - rules: [ - { - test: /entry-point\.js$/, - use: path.resolve(base, "./async-error-loader") - } - ] + `); + }); + + it("should emit errors & warnings for irregular-error-loader", async () => { + await expect( + compile({ entry: "./irregular-error-loader!./entry-point.js" }) + ).resolves.toMatchInlineSnapshot(` + Object { + "errors": Array [ + Object { + "message": "Module Error (from ./irregular-error-loader.js):\\n(Emitted value instead of an instance of Error) null", + "moduleId": 0, + "moduleIdentifier": "/test/fixtures/errors/irregular-error-loader.js!/test/fixtures/errors/entry-point.js", + "moduleName": "./irregular-error-loader.js!./entry-point.js", + "moduleTrace": Array [], + "stack": "ModuleError: Module Error (from ./irregular-error-loader.js):\\n(Emitted value instead of an instance of Error) null", + }, + Object { + "message": "Module Error (from ./irregular-error-loader.js):\\nError", + "moduleId": 0, + "moduleIdentifier": "/test/fixtures/errors/irregular-error-loader.js!/test/fixtures/errors/entry-point.js", + "moduleName": "./irregular-error-loader.js!./entry-point.js", + "moduleTrace": Array [], + "stack": "ModuleError: Module Error (from ./irregular-error-loader.js):\\nError", + }, + Object { + "message": "Module build failed (from ./irregular-error-loader.js):\\nNonErrorEmittedError: (Emitted value instead of an instance of Error) a string error", + "moduleId": 0, + "moduleIdentifier": "/test/fixtures/errors/irregular-error-loader.js!/test/fixtures/errors/entry-point.js", + "moduleName": "./irregular-error-loader.js!./entry-point.js", + "moduleTrace": Array [], + "stack": "ModuleBuildError: Module build failed (from ./irregular-error-loader.js):\\nNonErrorEmittedError: (Emitted value instead of an instance of Error) a string error", + }, + ], + "warnings": Array [ + Object { + "message": "Module Warning (from ./irregular-error-loader.js):\\n(Emitted value instead of an instance of Error) null", + "moduleId": 0, + "moduleIdentifier": "/test/fixtures/errors/irregular-error-loader.js!/test/fixtures/errors/entry-point.js", + "moduleName": "./irregular-error-loader.js!./entry-point.js", + "moduleTrace": Array [], + "stack": "ModuleWarning: Module Warning (from ./irregular-error-loader.js):\\n(Emitted value instead of an instance of Error) null", + }, + Object { + "message": "Module Warning (from ./irregular-error-loader.js):\\nError", + "moduleId": 0, + "moduleIdentifier": "/test/fixtures/errors/irregular-error-loader.js!/test/fixtures/errors/entry-point.js", + "moduleName": "./irregular-error-loader.js!./entry-point.js", + "moduleTrace": Array [], + "stack": "ModuleWarning: Module Warning (from ./irregular-error-loader.js):\\nError", + }, + ], + } + `); + }); + + it("should emit error for no-return-loader", async () => { + await expect(compile({ entry: "./no-return-loader!./entry-point.js" })) + .resolves.toMatchInlineSnapshot(` + Object { + "errors": Array [ + Object { + "message": "Module build failed: Error: Final loader (./no-return-loader.js) didn't return a Buffer or String", + "moduleId": 0, + "moduleIdentifier": "/test/fixtures/errors/no-return-loader.js!/test/fixtures/errors/entry-point.js", + "moduleName": "./no-return-loader.js!./entry-point.js", + "moduleTrace": Array [], + "stack": "ModuleBuildError: Module build failed: Error: Final loader (./no-return-loader.js) didn't return a Buffer or String", + }, + ], + "warnings": Array [], + } + `); + }); + + // cspell:ignore doesnt + it("should emit error for doesnt-exist-loader", async () => { + await expect(compile({ entry: "./doesnt-exist-loader!./entry-point.js" })) + .resolves.toMatchInlineSnapshot(` + Object { + "errors": Array [ + Object { + "loc": "main", + "message": "Module not found: Error: Can't resolve './doesnt-exist-loader' in '/test/fixtures/errors'", + "stack": "ModuleNotFoundError: Module not found: Error: Can't resolve './doesnt-exist-loader' in '/test/fixtures/errors'", + }, + ], + "warnings": Array [], } - }, - (errors, warnings) => { - expect(errors).toHaveLength(1); - expect(errors[0].split("\n")[1]).toMatch( - /^Module build failed \(from .\/async-error-loader.js\):$/ - ); + `); + }); + + it("should emit error for return-undefined-loader", async () => { + await expect( + compile({ entry: "./return-undefined-loader!./entry-point.js" }) + ).resolves.toMatchInlineSnapshot(` + Object { + "errors": Array [ + Object { + "message": "Module build failed: Error: Final loader (./return-undefined-loader.js) didn't return a Buffer or String", + "moduleId": 0, + "moduleIdentifier": "/test/fixtures/errors/return-undefined-loader.js!/test/fixtures/errors/entry-point.js", + "moduleName": "./return-undefined-loader.js!./entry-point.js", + "moduleTrace": Array [], + "stack": "ModuleBuildError: Module build failed: Error: Final loader (./return-undefined-loader.js) didn't return a Buffer or String", + }, + ], + "warnings": Array [], + } + `); + }); + + it("should emit error for module-exports-object-loader", async () => { + await expect( + compile({ entry: "./module-exports-object-loader!./entry-point.js" }) + ).resolves.toMatchInlineSnapshot(` + Object { + "errors": Array [ + Object { + "message": "Module build failed (from ./module-exports-object-loader.js):\\nLoaderRunnerError: Module '/test/fixtures/errors/module-exports-object-loader.js' is not a loader (must have normal or pitch function)", + "moduleId": 0, + "moduleIdentifier": "/test/fixtures/errors/module-exports-object-loader.js!/test/fixtures/errors/entry-point.js", + "moduleName": "./module-exports-object-loader.js!./entry-point.js", + "moduleTrace": Array [], + "stack": "ModuleBuildError: Module build failed (from ./module-exports-object-loader.js):\\nLoaderRunnerError: Module '/test/fixtures/errors/module-exports-object-loader.js' is not a loader (must have normal or pitch function)", + }, + ], + "warnings": Array [], + } + `); + }); + + it("should emit error for module-exports-string-loader", async () => { + await expect( + compile({ entry: "./module-exports-string-loader!./entry-point.js" }) + ).resolves.toMatchInlineSnapshot(` + Object { + "errors": Array [ + Object { + "message": "Module build failed (from ./module-exports-string-loader.js):\\nLoaderRunnerError: Module '/test/fixtures/errors/module-exports-string-loader.js' is not a loader (export function or es6 module)", + "moduleId": 0, + "moduleIdentifier": "/test/fixtures/errors/module-exports-string-loader.js!/test/fixtures/errors/entry-point.js", + "moduleName": "./module-exports-string-loader.js!./entry-point.js", + "moduleTrace": Array [], + "stack": "ModuleBuildError: Module build failed (from ./module-exports-string-loader.js):\\nLoaderRunnerError: Module '/test/fixtures/errors/module-exports-string-loader.js' is not a loader (export function or es6 module)", + }, + ], + "warnings": Array [], + } + `); + }); + + const identityLoader = path.resolve( + __dirname, + "fixtures/errors/identity-loader.js" + ); + const addCommentLoader = path.resolve( + __dirname, + "fixtures/errors/add-comment-loader.js" + ); + + it("should show loader used if it is present when module parsing fails", async () => { + await expect( + compile({ + mode: "development", + entry: "./abc.html", + module: { + rules: [ + { + test: /\.html$/, + use: [{ loader: identityLoader }] + } + ] } - ), - getErrorsPromise( - { - mode: "development", - entry: "./entry-point.js", - module: { - rules: [ - { - test: /entry-point\.js$/, - use: path.resolve(base, "./throw-error-loader") - } - ] + }) + ).resolves.toMatchInlineSnapshot(` + Object { + "errors": Array [ + Object { + "loc": "1:0", + "message": "Module parse failed: Unexpected token (1:0)\\nFile was processed with these loaders:\\n * ./identity-loader.js\\nYou may need an additional loader to handle the result of these loaders.\\n> \\n| \\n| ", + "moduleId": "./abc.html", + "moduleIdentifier": "/test/fixtures/errors/identity-loader.js!/test/fixtures/errors/abc.html", + "moduleName": "./abc.html", + "moduleTrace": Array [], + "stack": "ModuleParseError: Module parse failed: Unexpected token (1:0)\\nFile was processed with these loaders:\\n * ./identity-loader.js\\nYou may need an additional loader to handle the result of these loaders.\\n> \\n| \\n| ", + }, + ], + "warnings": Array [], } - }, - (errors, warnings) => { - expect(errors).toHaveLength(1); - expect(errors[0].split("\n")[1]).toMatch( - /^Module build failed \(from .\/throw-error-loader.js\):$/ - ); + `); + }); + + it("should show all loaders used if they are in config when module parsing fails", async () => { + await expect( + compile({ + mode: "development", + entry: "./abc.html", + module: { + rules: [ + { + test: /\.html$/, + use: [{ loader: identityLoader }, { loader: addCommentLoader }] + } + ] } - ), - getErrorsPromise( - { - mode: "development", - entry: "./entry-point.js", - module: { - rules: [ - { - test: /entry-point\.js$/, - use: path.resolve(base, "./irregular-error-loader") - } - ] + }) + ).resolves.toMatchInlineSnapshot(` + Object { + "errors": Array [ + Object { + "loc": "1:0", + "message": "Module parse failed: Unexpected token (1:0)\\nFile was processed with these loaders:\\n * ./identity-loader.js\\n * ./add-comment-loader.js\\nYou may need an additional loader to handle the result of these loaders.\\n> \\n| \\n| ", + "moduleId": "./abc.html", + "moduleIdentifier": "/test/fixtures/errors/identity-loader.js!/test/fixtures/errors/add-comment-loader.js!/test/fixtures/errors/abc.html", + "moduleName": "./abc.html", + "moduleTrace": Array [], + "stack": "ModuleParseError: Module parse failed: Unexpected token (1:0)\\nFile was processed with these loaders:\\n * ./identity-loader.js\\n * ./add-comment-loader.js\\nYou may need an additional loader to handle the result of these loaders.\\n> \\n| \\n| ", + }, + ], + "warnings": Array [], } - }, - (errors, warnings) => { - expect(warnings).toHaveLength(2); - expect(warnings[0].split("\n")[1]).toMatch( - /^Module Warning \(from .\/irregular-error-loader.js\):$/ - ); - expect(warnings[1].split("\n")[1]).toMatch( - /^Module Warning \(from .\/irregular-error-loader.js\):$/ - ); - - expect(errors).toHaveLength(3); - expect(errors[0].split("\n")[1]).toMatch( - /^Module Error \(from .\/irregular-error-loader.js\):$/ - ); - expect(errors[1].split("\n")[1]).toMatch( - /^Module Error \(from .\/irregular-error-loader.js\):$/ - ); - expect(errors[2].split("\n")[1]).toMatch( - /^Module build failed \(from .\/irregular-error-loader.js\):$/ - ); + `); + }); + + it("should show all loaders used if use is a string", async () => { + await expect( + compile({ + mode: "development", + entry: "./abc.html", + module: { + rules: [ + { test: /\.html$/, use: identityLoader }, + { test: /\.html$/, use: addCommentLoader } + ] } - ) - ]); + }) + ).resolves.toMatchInlineSnapshot(` + Object { + "errors": Array [ + Object { + "loc": "1:0", + "message": "Module parse failed: Unexpected token (1:0)\\nFile was processed with these loaders:\\n * ./identity-loader.js\\n * ./add-comment-loader.js\\nYou may need an additional loader to handle the result of these loaders.\\n> \\n| \\n| ", + "moduleId": "./abc.html", + "moduleIdentifier": "/test/fixtures/errors/identity-loader.js!/test/fixtures/errors/add-comment-loader.js!/test/fixtures/errors/abc.html", + "moduleName": "./abc.html", + "moduleTrace": Array [], + "stack": "ModuleParseError: Module parse failed: Unexpected token (1:0)\\nFile was processed with these loaders:\\n * ./identity-loader.js\\n * ./add-comment-loader.js\\nYou may need an additional loader to handle the result of these loaders.\\n> \\n| \\n| ", + }, + ], + "warnings": Array [], + } + `); }); - it("should throw a build error if no source be returned after run loaders", done => { - getErrors( - { + + it("should show 'no loaders are configured to process this file' if loaders are not included in config when module parsing fails", async () => { + await expect( + compile({ mode: "development", - entry: path.resolve(base, "./no-return-loader") + "!./entry-point.js" - }, - (errors, warnings) => { - expect(errors).toHaveLength(1); - const messages = errors[0].split("\n"); - expect(messages[1]).toMatch( - /^Module build failed: Error: Final loader \(.+\) didn't return a Buffer or String/ - ); - done(); - } - ); + entry: "./abc.html", + module: {} + }) + ).resolves.toMatchInlineSnapshot(` + Object { + "errors": Array [ + Object { + "loc": "1:0", + "message": "Module parse failed: Unexpected token (1:0)\\nYou may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders\\n> \\n| \\n| ", + "moduleId": "./abc.html", + "moduleIdentifier": "/test/fixtures/errors/abc.html", + "moduleName": "./abc.html", + "moduleTrace": Array [], + "stack": "ModuleParseError: Module parse failed: Unexpected token (1:0)\\nYou may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders\\n> \\n| \\n| ", + }, + ], + "warnings": Array [], + } + `); + }); + + it("should show 'source code omitted for this binary file' when module parsing fails for binary files", async () => { + const folder = path.join(__dirname, "/fixtures"); + await expect( + compile({ + mode: "development", + entry: path.resolve(folder, "./font.ttf"), + module: {} + }) + ).resolves.toMatchInlineSnapshot(` + Object { + "errors": Array [ + Object { + "loc": "1:0", + "message": "Module parse failed: Unexpected character '' (1:0)\\nYou may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders\\n(Source code omitted for this binary file)", + "moduleId": "../font.ttf", + "moduleIdentifier": "/test/fixtures/font.ttf", + "moduleName": "../font.ttf", + "moduleTrace": Array [], + "stack": "ModuleParseError: Module parse failed: Unexpected character '' (1:0)\\nYou may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders\\n(Source code omitted for this binary file)", + }, + ], + "warnings": Array [], + } + `); + }); + + it("should throw error for invalid library name", async () => { + await expect( + compile({ + output: { + libraryTarget: "var" + } + }) + ).rejects.toMatchInlineSnapshot(` + Object { + "message": "Library name must be a string or string array. Common configuration options that specific library names are 'output.library[.name]', 'entry.xyz.library[.name]', 'ModuleFederationPlugin.name' and 'ModuleFederationPlugin.library[.name]'.", + "stack": "Error: Library name must be a string or string array. Common configuration options that specific library names are 'output.library[.name]', 'entry.xyz.library[.name]', 'ModuleFederationPlugin.name' and 'ModuleFederationPlugin.library[.name]'.", + } + `); }); }); diff --git a/test/Examples.test.js b/test/Examples.test.js index 527d7cb3ca6..3ca57157a4e 100644 --- a/test/Examples.test.js +++ b/test/Examples.test.js @@ -1,62 +1,72 @@ "use strict"; -/* globals describe it */ +require("./helpers/warmup-webpack"); + const path = require("path"); -const fs = require("fs"); -const webpack = require("../"); +const fs = require("graceful-fs"); describe("Examples", () => { const basePath = path.join(__dirname, "..", "examples"); const examples = require("../examples/examples.js"); - examples.forEach(examplePath => { + for (const examplePath of examples) { const filterPath = path.join(examplePath, "test.filter.js"); const relativePath = path.relative(basePath, examplePath); if (fs.existsSync(filterPath) && !require(filterPath)()) { - describe.skip(relativePath, () => it("filtered")); - return; + // eslint-disable-next-line jest/no-disabled-tests, jest/valid-describe-callback + describe.skip(relativePath, () => + it("filtered", done => { + done(); + }) + ); + continue; } - it( - "should compile " + relativePath, - function(done) { - let options = {}; - let webpackConfigPath = path.join(examplePath, "webpack.config.js"); - webpackConfigPath = - webpackConfigPath.substr(0, 1).toUpperCase() + - webpackConfigPath.substr(1); - if (fs.existsSync(webpackConfigPath)) - options = require(webpackConfigPath); - if (Array.isArray(options)) options.forEach(processOptions); - else processOptions(options); + it(`should compile ${relativePath}`, function (done) { + let options = {}; + let webpackConfigPath = path.join(examplePath, "webpack.config.js"); + webpackConfigPath = + webpackConfigPath.slice(0, 1).toUpperCase() + + webpackConfigPath.slice(1); + if (fs.existsSync(webpackConfigPath)) + options = require(webpackConfigPath); + if (typeof options === "function") options = options(); + if (Array.isArray(options)) { + for (const [_, item] of options.entries()) { + processOptions(item); + } + } else { + processOptions(options); + } - function processOptions(options) { - options.context = examplePath; - options.output = options.output || {}; - options.output.pathinfo = true; - options.output.path = path.join(examplePath, "dist"); - options.output.publicPath = "dist/"; - if (!options.entry) options.entry = "./example.js"; - if (!options.plugins) options.plugins = []; - // To support deprecated loaders - // TODO remove in webpack 5 - options.plugins.push( - new webpack.LoaderOptionsPlugin({ - options: {} - }) + /** + * @param {import("../").Configuration} options options + */ + function processOptions(options) { + options.context = examplePath; + options.output = options.output || {}; + options.output.pathinfo = true; + options.output.path = path.join(examplePath, "dist"); + options.output.publicPath = "dist/"; + if (!options.entry) options.entry = "./example.js"; + if (!options.plugins) options.plugins = []; + } + const webpack = require(".."); + webpack(options, (err, stats) => { + if (err) return done(err); + if (stats.hasErrors()) { + return done( + new Error( + stats.toString({ + all: false, + errors: true, + errorDetails: true, + errorStacks: true + }) + ) ); } - webpack(options, (err, stats) => { - if (err) return done(err); - stats = stats.toJson({ - errorDetails: true - }); - if (stats.errors.length > 0) { - return done(new Error(stats.errors[0])); - } - done(); - }); - }, - 45000 - ); - }); + done(); + }); + }, 90000); + } }); diff --git a/test/FileSystemInfo.unittest.js b/test/FileSystemInfo.unittest.js new file mode 100644 index 00000000000..ec6716bd631 --- /dev/null +++ b/test/FileSystemInfo.unittest.js @@ -0,0 +1,503 @@ +"use strict"; + +const { createFsFromVolume, Volume } = require("memfs"); +const util = require("util"); +const FileSystemInfo = require("../lib/FileSystemInfo"); +const { buffersSerializer } = require("../lib/util/serialization"); + +describe("FileSystemInfo", () => { + afterEach(() => { + // restore the spy created with spyOn + jest.restoreAllMocks(); + }); + + const files = [ + "/path/file.txt", + "/path/nested/deep/file.txt", + "/path/nested/deep/ignored.txt", + "/path/context+files/file.txt", + "/path/context+files/sub/file.txt", + "/path/context+files/sub/ignored.txt", + "/path/node_modules/package/file.txt", + "/path/cache/package-1234/file.txt", + "/path/circular/circular/file2.txt", + "/path/nested/deep/symlink/file.txt", + "/path/context+files/sub/symlink/file.txt", + "/path/context/sub/symlink/file.txt", + "/path/missing.txt", + "/path/node_modules/@foo/package1/index.js", + "/path/node_modules/@foo/package2/index.js", + "/path/node_modules/bar-package3/index.js" + ]; + const directories = [ + "/path/context+files", + "/path/context", + "/path/missing", + "/path/node_modules/package", + "/path/node_modules/missing", + "/path/node_modules/@foo", + "/path/node_modules/@foo/package1", + "/path/node_modules/@foo/package2", + "/path/node_modules/bar-package3", + "/path/cache/package-1234", + "/path/cache/package-missing" + ]; + const missing = [ + "/path/package.json", + "/path/file2.txt", + "/path/context+files/file2.txt", + "/path/node_modules/package.txt", + "/path/node_modules/package/missing.txt", + "/path/cache/package-2345", + "/path/cache/package-1234/missing.txt", + "/path/ignored.txt" + ]; + const ignored = [ + "/path/nested/deep/ignored.txt", + "/path/context+files/sub/ignored.txt", + "/path/context/sub/ignored.txt", + "/path/ignored.txt", + "/path/node_modules/package/ignored.txt", + "/path/cache/package-1234/ignored.txt" + ]; + const unmanagedPaths = [ + "/path/node_modules/@foo/package1", + "/path/node_modules/@foo/package2", + "/path/node_modules/bar-package3" + ]; + const managedPaths = ["/path/node_modules"]; + const immutablePaths = ["/path/cache"]; + const createFs = () => { + const fs = createFsFromVolume(new Volume()); + fs.mkdirSync("/path/context+files/sub", { recursive: true }); + fs.mkdirSync("/path/context/sub", { recursive: true }); + fs.mkdirSync("/path/nested/deep", { recursive: true }); + fs.mkdirSync("/path/node_modules/package", { recursive: true }); + fs.mkdirSync("/path/node_modules/@foo", { recursive: true }); + fs.mkdirSync("/path/node_modules/@foo/package1", { recursive: true }); + fs.mkdirSync("/path/node_modules/@foo/package2", { recursive: true }); + fs.mkdirSync("/path/node_modules/bar-package3", { recursive: true }); + fs.mkdirSync("/path/cache/package-1234", { recursive: true }); + fs.mkdirSync("/path/folder/context", { recursive: true }); + fs.mkdirSync("/path/folder/context+files", { recursive: true }); + fs.mkdirSync("/path/folder/nested", { recursive: true }); + fs.writeFileSync("/path/file.txt", "Hello World"); + fs.writeFileSync("/path/file2.txt", "Hello World2"); + fs.writeFileSync("/path/nested/deep/file.txt", "Hello World"); + fs.writeFileSync("/path/nested/deep/ignored.txt", "Ignored"); + fs.writeFileSync("/path/context+files/file.txt", "Hello World"); + fs.writeFileSync("/path/context+files/file2.txt", "Hello World2"); + fs.writeFileSync("/path/context+files/sub/file.txt", "Hello World"); + fs.writeFileSync("/path/context+files/sub/file2.txt", "Hello World2"); + fs.writeFileSync("/path/context+files/sub/file3.txt", "Hello World3"); + fs.writeFileSync("/path/context+files/sub/ignored.txt", "Ignored"); + fs.writeFileSync("/path/context/file.txt", "Hello World"); + fs.writeFileSync("/path/context/file2.txt", "Hello World2"); + fs.writeFileSync("/path/context/sub/file.txt", "Hello World"); + fs.writeFileSync("/path/context/sub/file2.txt", "Hello World2"); + fs.writeFileSync("/path/context/sub/file3.txt", "Hello World3"); + fs.writeFileSync("/path/context/sub/ignored.txt", "Ignored"); + fs.writeFileSync( + "/path/node_modules/package/package.json", + JSON.stringify({ name: "package", version: "1.0.0" }) + ); + fs.writeFileSync("/path/node_modules/package/file.txt", "Hello World"); + fs.writeFileSync("/path/node_modules/package/ignored.txt", "Ignored"); + fs.writeFileSync( + "/path/cache/package-1234/package.json", + JSON.stringify({ name: "package", version: "1.0.0" }) + ); + fs.writeFileSync("/path/cache/package-1234/file.txt", "Hello World"); + fs.writeFileSync("/path/cache/package-1234/ignored.txt", "Ignored"); + fs.symlinkSync("/path", "/path/circular", "dir"); + fs.writeFileSync("/path/folder/context/file.txt", "Hello World"); + fs.writeFileSync("/path/folder/context+files/file.txt", "Hello World"); + fs.writeFileSync("/path/folder/nested/file.txt", "Hello World"); + fs.writeFileSync( + "/path/node_modules/@foo/package1/index.js", + "Hello World" + ); + fs.writeFileSync( + "/path/node_modules/@foo/package2/index.js", + "Hello World" + ); + fs.writeFileSync("/path/node_modules/bar-package3/index.js", "Hello World"); + fs.symlinkSync("/path/folder/context", "/path/context/sub/symlink", "dir"); + fs.symlinkSync( + "/path/folder/context+files", + "/path/context+files/sub/symlink", + "dir" + ); + fs.symlinkSync("/path/folder/nested", "/path/nested/deep/symlink", "dir"); + return fs; + }; + + const createFsInfo = fs => { + const logger = { + error: (...args) => { + throw new Error(util.format(...args)); + } + }; + const fsInfo = new FileSystemInfo(fs, { + logger, + unmanagedPaths, + managedPaths, + immutablePaths, + hashFunction: "sha256" + }); + for (const method of ["warn", "info", "log", "debug"]) { + fsInfo.logs = []; + fsInfo[method] = []; + logger[method] = (...args) => { + const msg = util.format(...args); + fsInfo[method].push(msg); + fsInfo.logs.push(`[${method}] ${msg}`); + }; + } + fsInfo.addFileTimestamps(new Map(ignored.map(i => [i, "ignore"]))); + return fsInfo; + }; + + const createSnapshot = (fs, options, callback) => { + const fsInfo = createFsInfo(fs); + fsInfo.createSnapshot( + Date.now() + 10000, + files, + directories, + missing, + options, + (err, snapshot) => { + if (err) return callback(err); + snapshot.name = "initial snapshot"; + // create another one to test the caching + fsInfo.createSnapshot( + Date.now() + 10000, + files, + directories, + missing, + options, + (err, snapshot2) => { + if (err) return callback(err); + snapshot2.name = "cached snapshot"; + callback(null, snapshot, snapshot2); + } + ); + } + ); + }; + + const clone = object => { + const serialized = buffersSerializer.serialize(object, {}); + return buffersSerializer.deserialize(serialized, {}); + }; + + const expectSnapshotsState = ( + fs, + snapshot, + snapshot2, + expected, + callback + ) => { + expectSnapshotState(fs, snapshot, expected, err => { + if (err) return callback(err); + if (!snapshot2) return callback(); + expectSnapshotState(fs, snapshot2, expected, callback); + }); + }; + + const expectSnapshotState = (fs, snapshot, expected, callback) => { + const fsInfo = createFsInfo(fs); + const details = snapshot => `${fsInfo.logs.join("\n")} +${util.inspect(snapshot, false, Infinity, true)}`; + fsInfo.checkSnapshotValid(snapshot, (err, valid) => { + if (err) return callback(err); + if (valid !== expected) { + return callback( + new Error(`Expected snapshot to be ${ + expected ? "valid" : "invalid" + } but it is ${valid ? "valid" : "invalid"}: +${details(snapshot)}`) + ); + } + // Another try to check if direct caching works + fsInfo.checkSnapshotValid(snapshot, (err, valid) => { + if (err) return callback(err); + if (valid !== expected) { + return callback( + new Error(`Expected snapshot lead to the same result when directly cached: +${details(snapshot)}`) + ); + } + // Another try to check if indirect caching works + fsInfo.checkSnapshotValid(clone(snapshot), (err, valid) => { + if (err) return callback(err); + if (valid !== expected) { + return callback( + new Error(`Expected snapshot lead to the same result when indirectly cached: +${details(snapshot)}`) + ); + } + callback(); + }); + }); + }); + }; + + const updateFile = (fs, filename) => { + const oldContent = fs.readFileSync(filename, "utf-8"); + if (filename.endsWith(".json")) { + const data = JSON.parse(oldContent); + fs.writeFileSync( + filename, + JSON.stringify({ + ...data, + version: `${data.version}.1` + }) + ); + } else { + fs.writeFileSync(filename, `${oldContent}!`); + } + }; + + for (const [name, options] of [ + ["timestamp", { timestamp: true }], + ["hash", { hash: true }], + ["tsh", { timestamp: true, hash: true }] + ]) { + describe(`${name} mode`, () => { + it("should always accept an empty snapshot", done => { + const fs = createFs(); + const fsInfo = createFsInfo(fs); + fsInfo.createSnapshot( + Date.now() + 10000, + [], + [], + [], + options, + (err, snapshot) => { + if (err) return done(err); + const fs = createFs(); + expectSnapshotState(fs, snapshot, true, done); + } + ); + }); + + it("should accept a snapshot when fs is unchanged", done => { + const fs = createFs(); + createSnapshot(fs, options, (err, snapshot, snapshot2) => { + if (err) return done(err); + expectSnapshotsState(fs, snapshot, snapshot2, true, done); + }); + }); + + const ignoredFileChanges = [ + "/path/nested/deep/ignored.txt", + "/path/context+files/sub/ignored.txt" + ]; + + for (const fileChange of [ + "/path/file.txt", + "/path/file2.txt", + "/path/nested/deep/file.txt", + "/path/context+files/file.txt", + "/path/context+files/file2.txt", + "/path/context+files/sub/file.txt", + "/path/context+files/sub/file2.txt", + "/path/context+files/sub/file3.txt", + "/path/context/file.txt", + "/path/context/file2.txt", + "/path/context/sub/file.txt", + "/path/context/sub/file2.txt", + "/path/context/sub/file3.txt", + "/path/node_modules/package/package.json", + "/path/folder/context/file.txt", + "/path/folder/context+files/file.txt", + "/path/folder/nested/file.txt", + "/path/node_modules/@foo/package1/index.js", + "/path/node_modules/@foo/package2/index.js", + "/path/node_modules/bar-package3/index.js", + ...(name !== "timestamp" ? ignoredFileChanges : []), + ...(name === "hash" ? ["/path/context/sub/ignored.txt"] : []) + ]) { + it(`should invalidate the snapshot when ${fileChange} is changed`, done => { + const fs = createFs(); + createSnapshot(fs, options, (err, snapshot, snapshot2) => { + if (err) return done(err); + updateFile(fs, fileChange); + expectSnapshotsState(fs, snapshot, snapshot2, false, done); + }); + }); + } + + for (const fileChange of [ + "/path/node_modules/package/file.txt", + "/path/node_modules/package/ignored.txt", + "/path/cache/package-1234/package.json", + "/path/cache/package-1234/file.txt", + "/path/cache/package-1234/ignored.txt", + ...(name === "timestamp" ? ignoredFileChanges : []), + ...(name !== "hash" ? ["/path/context/sub/ignored.txt"] : []) + ]) { + it(`should not invalidate the snapshot when ${fileChange} is changed`, done => { + const fs = createFs(); + createSnapshot(fs, options, (err, snapshot, snapshot2) => { + if (err) return done(err); + updateFile(fs, fileChange); + expectSnapshotsState(fs, snapshot, snapshot2, true, done); + }); + }); + } + + for (const newFile of [ + "/path/package.json", + "/path/file2.txt", + "/path/context+files/file2.txt", + "/path/node_modules/package.txt" + ]) { + it(`should invalidate the snapshot when ${newFile} is created`, done => { + const fs = createFs(); + createSnapshot(fs, options, (err, snapshot, snapshot2) => { + if (err) return done(err); + fs.writeFileSync(newFile, "New file"); + expectSnapshotsState(fs, snapshot, snapshot2, false, done); + }); + }); + } + + for (const newFile of [ + "/path/node_modules/package/missing.txt", + "/path/cache/package-1234/missing.txt", + "/path/cache/package-2345", + "/path/ignored.txt" + ]) { + it(`should not invalidate the snapshot when ${newFile} is created`, done => { + const fs = createFs(); + createSnapshot(fs, options, (err, snapshot, snapshot2) => { + if (err) return done(err); + fs.writeFileSync(newFile, "New file"); + expectSnapshotsState(fs, snapshot, snapshot2, true, done); + }); + }); + } + + if (name !== "timestamp") { + it("should not invalidate snapshot when only timestamps have changed", done => { + const fs = createFs(); + createSnapshot(fs, options, (err, snapshot, snapshot2) => { + if (err) return done(err); + const fs = createFs(); + expectSnapshotsState(fs, snapshot, snapshot2, true, done); + }); + }); + } + }); + } + + describe("stable iterables identity", () => { + const options = { timestamp: true }; + + /** + * @param {(err?: WebpackError | null, snapshot?: Snapshot | null) => void} callback callback function + */ + function getSnapshot(callback) { + const fs = createFs(); + const fsInfo = createFsInfo(fs); + fsInfo.createSnapshot( + Date.now() + 10000, + files, + directories, + missing, + options, + callback + ); + } + + it("should return same iterable for getFileIterable()", done => { + getSnapshot((err, snapshot) => { + if (err) done(err); + expect(snapshot.getFileIterable()).toEqual(snapshot.getFileIterable()); + done(); + }); + }); + + it("should return same iterable for getContextIterable()", done => { + getSnapshot((err, snapshot) => { + if (err) done(err); + expect(snapshot.getContextIterable()).toEqual( + snapshot.getContextIterable() + ); + done(); + }); + }); + + it("should return same iterable for getMissingIterable()", done => { + getSnapshot((err, snapshot) => { + if (err) done(err); + expect(snapshot.getFileIterable()).toEqual(snapshot.getFileIterable()); + done(); + }); + }); + }); + + describe("symlinks", () => { + it("should work with symlinks with errors", done => { + const fs = createFs(); + + fs.symlinkSync( + "/path/folder/context", + "/path/context/sub/symlink-error", + "dir" + ); + + const originalReadlink = fs.readlink; + + let i = 0; + + jest.spyOn(fs, "readlink").mockImplementation((path, callback) => { + if (path === "/path/context/sub/symlink-error" && i < 2) { + i += 1; + callback(new Error("test")); + return; + } + + originalReadlink(path, callback); + }); + + createSnapshot( + fs, + ["timestamp", { timestamp: true }], + (err, snapshot, snapshot2) => { + if (err) return done(err); + expectSnapshotsState(fs, snapshot, snapshot2, true, done); + } + ); + }); + + it("should work with symlinks with errors #1", done => { + const fs = createFs(); + + fs.symlinkSync( + "/path/folder/context", + "/path/context/sub/symlink-error", + "dir" + ); + + jest.spyOn(fs, "readlink").mockImplementation((path, callback) => { + callback(new Error("test")); + }); + + const fsInfo = createFsInfo(fs); + fsInfo.createSnapshot( + Date.now() + 10000, + files, + directories, + missing, + ["timestamp", { timestamp: true }], + (err, snapshot) => { + expect(snapshot).toBe(null); + done(); + } + ); + }); + }); +}); diff --git a/test/HarmonyExportImportedSpecifierDependency.unittest.js b/test/HarmonyExportImportedSpecifierDependency.unittest.js deleted file mode 100644 index 29b25745575..00000000000 --- a/test/HarmonyExportImportedSpecifierDependency.unittest.js +++ /dev/null @@ -1,15 +0,0 @@ -/* globals describe, it, beforeEach */ -"use strict"; - -const HarmonyExportImportedSpecifierDependency = require("../lib/dependencies/HarmonyExportImportedSpecifierDependency"); - -describe("HarmonyExportImportedSpecifierDependency", () => { - describe("getHashValue", () => { - it("should return empty string on missing module", () => { - // see e.g. PR #4368 - var instance = new HarmonyExportImportedSpecifierDependency(); - expect(instance.getHashValue(undefined)).toBe(""); - expect(instance.getHashValue(null)).toBe(""); - }); - }); -}); diff --git a/test/HotModuleReplacementPlugin.test.js b/test/HotModuleReplacementPlugin.test.js index 0cc28c4e0bd..ab54eb36c24 100644 --- a/test/HotModuleReplacementPlugin.test.js +++ b/test/HotModuleReplacementPlugin.test.js @@ -1,10 +1,9 @@ "use strict"; const path = require("path"); -const fs = require("fs"); -const mkdirp = require("mkdirp"); +const fs = require("graceful-fs"); -const webpack = require("../"); +const webpack = require(".."); describe("HotModuleReplacementPlugin", () => { jest.setTimeout(20000); @@ -34,13 +33,15 @@ describe("HotModuleReplacementPlugin", () => { "records.json" ); try { - mkdirp.sync(path.join(__dirname, "js", "HotModuleReplacementPlugin")); - } catch (e) { + fs.mkdirSync(path.join(__dirname, "js", "HotModuleReplacementPlugin"), { + recursive: true + }); + } catch (_err) { // empty } try { fs.unlinkSync(recordsFile); - } catch (e) { + } catch (_err) { // empty } const compiler = webpack({ @@ -96,13 +97,153 @@ describe("HotModuleReplacementPlugin", () => { }); }); }); - }); + }, 120000); + + it("output.clean=true should keep 1 last update", done => { + const outputPath = path.join(__dirname, "js", "HotModuleReplacementPlugin"); + const entryFile = path.join(outputPath, "entry.js"); + const recordsFile = path.join(outputPath, "records.json"); + let step = 0; + let firstUpdate; + try { + fs.mkdirSync(outputPath, { recursive: true }); + } catch (_err) { + // empty + } + fs.writeFileSync(entryFile, `${++step}`, "utf-8"); + const updates = new Set(); + const hasFile = file => { + try { + fs.statSync(path.join(outputPath, file)); + return true; + } catch (_err) { + return false; + } + }; + const compiler = webpack({ + mode: "development", + cache: false, + entry: { + 0: entryFile + }, + recordsPath: recordsFile, + output: { + path: outputPath, + clean: true + }, + plugins: [new webpack.HotModuleReplacementPlugin()] + }); + const callback = (err, stats) => { + if (err) return done(err); + const jsonStats = stats.toJson(); + const hash = jsonStats.hash; + const hmrUpdateMainFileName = `0.${hash}.hot-update.json`; + + switch (step) { + case 1: + expect(updates.size).toBe(0); + firstUpdate = hmrUpdateMainFileName; + break; + case 2: + expect(updates.size).toBe(1); + expect(updates.has(firstUpdate)).toBe(true); + expect(hasFile(firstUpdate)).toBe(true); + break; + case 3: + expect(updates.size).toBe(2); + for (const file of updates) { + expect(hasFile(file)).toBe(true); + } + return setTimeout(() => { + fs.writeFileSync(entryFile, `${++step}`, "utf-8"); + compiler.run(err => { + if (err) return done(err); + for (const file of updates) { + expect(hasFile(file)).toBe(false); + } + done(); + }); + }, 10100); + } + + updates.add(hmrUpdateMainFileName); + fs.writeFileSync(entryFile, `${++step}`, "utf-8"); + compiler.run(callback); + }; + + compiler.run(callback); + }, 20000); it("should correct working when entry is Object and key is a number", done => { + const outputPath = path.join(__dirname, "js", "HotModuleReplacementPlugin"); + const entryFile = path.join(outputPath, "entry.js"); + const statsFile3 = path.join( + outputPath, + "HotModuleReplacementPlugin.test.stats3.txt" + ); + const statsFile4 = path.join( + outputPath, + "HotModuleReplacementPlugin.test.stats4.txt" + ); + const recordsFile = path.join(outputPath, "records.json"); + try { + fs.mkdirSync(outputPath, { recursive: true }); + } catch (_err) { + // empty + } + try { + fs.unlinkSync(recordsFile); + } catch (_err) { + // empty + } + const compiler = webpack({ + mode: "development", + cache: false, + entry: { + 0: entryFile + }, + recordsPath: recordsFile, + output: { + path: outputPath + }, + plugins: [new webpack.HotModuleReplacementPlugin()], + optimization: { + chunkIds: "named" + } + }); + fs.writeFileSync(entryFile, "1", "utf-8"); + compiler.run((err, stats) => { + if (err) throw err; + const jsonStats = stats.toJson(); + const hash = jsonStats.hash; + const chunkName = Object.keys(jsonStats.assetsByChunkName)[0]; + fs.writeFileSync(statsFile3, stats.toString()); + compiler.run((err, stats) => { + if (err) throw err; + fs.writeFileSync(statsFile4, stats.toString()); + fs.writeFileSync(entryFile, "2", "utf-8"); + compiler.run((err, stats) => { + if (err) throw err; + fs.writeFileSync(statsFile3, stats.toString()); + const result = JSON.parse( + fs.readFileSync( + path.join(outputPath, `0.${hash}.hot-update.json`), + "utf-8" + ) + ).c; + expect(result).toEqual([chunkName]); + done(); + }); + }); + }); + }); + + it("should handle entryFile that contains path variable", done => { const entryFile = path.join( __dirname, "js", "HotModuleReplacementPlugin", + "[name]", "entry.js" ); const statsFile3 = path.join( @@ -124,48 +265,64 @@ describe("HotModuleReplacementPlugin", () => { "records.json" ); try { - mkdirp.sync(path.join(__dirname, "js", "HotModuleReplacementPlugin")); - } catch (e) { + fs.mkdirSync( + path.join(__dirname, "js", "HotModuleReplacementPlugin", "[name]"), + { + recursive: true + } + ); + } catch (_err) { // empty } try { fs.unlinkSync(recordsFile); - } catch (e) { + } catch (_err) { // empty } const compiler = webpack({ mode: "development", cache: false, entry: { - "0": entryFile + "[name]/entry.js": entryFile }, recordsPath: recordsFile, output: { - path: path.join(__dirname, "js", "HotModuleReplacementPlugin") + filename: "[name]", + chunkFilename: "[name].js", + path: path.join(__dirname, "js", "HotModuleReplacementPlugin"), + hotUpdateChunkFilename: "static/webpack/[id].[fullhash].hot-update.js", + hotUpdateMainFilename: "static/webpack/[fullhash].hot-update.json" }, plugins: [new webpack.HotModuleReplacementPlugin()], optimization: { - namedChunks: true + chunkIds: "named" } }); fs.writeFileSync(entryFile, "1", "utf-8"); compiler.run((err, stats) => { - if (err) throw err; - const jsonStats = stats.toJson(); - const hash = jsonStats.hash; - const trunkName = Object.keys(jsonStats.assetsByChunkName)[0]; + if (err) return done(err); fs.writeFileSync(statsFile3, stats.toString()); compiler.run((err, stats) => { - if (err) throw err; + if (err) return done(err); fs.writeFileSync(statsFile4, stats.toString()); fs.writeFileSync(entryFile, "2", "utf-8"); compiler.run((err, stats) => { - if (err) throw err; + if (err) return done(err); fs.writeFileSync(statsFile3, stats.toString()); - const result = JSON.parse( - stats.compilation.assets[`${hash}.hot-update.json`].source() - )["c"][`${trunkName}`]; - expect(result).toBe(true); + + let foundUpdates = false; + + for (const key of Object.keys(stats.compilation.assets)) { + foundUpdates = + foundUpdates || + Boolean( + /static\/webpack\/\[name\]\/entry\.js\..*?\.hot-update\.js/.test( + key + ) + ); + } + + expect(foundUpdates).toBe(true); done(); }); }); diff --git a/test/HotTestCases.template.js b/test/HotTestCases.template.js new file mode 100644 index 00000000000..d0e14a17fe4 --- /dev/null +++ b/test/HotTestCases.template.js @@ -0,0 +1,414 @@ +"use strict"; + +require("./helpers/warmup-webpack"); + +const path = require("path"); +const fs = require("graceful-fs"); +const vm = require("vm"); +const rimraf = require("rimraf"); +const checkArrayExpectation = require("./checkArrayExpectation"); +const createLazyTestEnv = require("./helpers/createLazyTestEnv"); +const FakeDocument = require("./helpers/FakeDocument"); + +const casesPath = path.join(__dirname, "hotCases"); +let categories = fs + .readdirSync(casesPath) + .filter(dir => fs.statSync(path.join(casesPath, dir)).isDirectory()); +categories = categories.map(cat => ({ + name: cat, + tests: fs + .readdirSync(path.join(casesPath, cat)) + .filter(folder => !folder.includes("_")) +})); + +const describeCases = config => { + describe(config.name, () => { + for (const category of categories) { + describe(category.name, () => { + for (const testName of category.tests) { + const testDirectory = path.join(casesPath, category.name, testName); + const filterPath = path.join(testDirectory, "test.filter.js"); + if (fs.existsSync(filterPath) && !require(filterPath)(config)) { + // eslint-disable-next-line jest/no-disabled-tests + describe.skip(testName, () => { + it("filtered", () => {}); + }); + continue; + } + describe(testName, () => { + let compiler; + afterAll(callback => { + compiler.close(callback); + compiler = undefined; + }); + + it(`${testName} should compile`, done => { + const webpack = require(".."); + const outputDirectory = path.join( + __dirname, + "js", + `hot-cases-${config.name}`, + category.name, + testName + ); + rimraf.sync(outputDirectory); + const recordsPath = path.join(outputDirectory, "records.json"); + const fakeUpdateLoaderOptions = { + updateIndex: 0 + }; + const configPath = path.join(testDirectory, "webpack.config.js"); + let options = {}; + if (fs.existsSync(configPath)) options = require(configPath); + if (typeof options === "function") { + options = options({ config }); + } + if (!options.mode) options.mode = "development"; + if (!options.devtool) options.devtool = false; + if (!options.context) options.context = testDirectory; + if (!options.entry) options.entry = "./index.js"; + if (!options.output) options.output = {}; + if (!options.output.path) options.output.path = outputDirectory; + if (!options.output.filename) + options.output.filename = "bundle.js"; + if (!options.output.chunkFilename) + options.output.chunkFilename = "[name].chunk.[fullhash].js"; + if (options.output.pathinfo === undefined) + options.output.pathinfo = true; + if (options.output.publicPath === undefined) + options.output.publicPath = "https://test.cases/path/"; + if (options.output.library === undefined) + options.output.library = { type: "commonjs2" }; + if (!options.optimization) options.optimization = {}; + if (!options.optimization.moduleIds) + options.optimization.moduleIds = "named"; + if (!options.module) options.module = {}; + if (!options.module.rules) options.module.rules = []; + options.module.rules.push({ + loader: path.join( + __dirname, + "hotCases", + "fake-update-loader.js" + ), + enforce: "pre" + }); + if (!options.target) options.target = config.target; + if (!options.plugins) options.plugins = []; + options.plugins.push( + new webpack.HotModuleReplacementPlugin(), + new webpack.LoaderOptionsPlugin(fakeUpdateLoaderOptions) + ); + if (!options.recordsPath) options.recordsPath = recordsPath; + let testConfig = {}; + try { + // try to load a test file + testConfig = Object.assign( + testConfig, + require(path.join(testDirectory, "test.config.js")) + ); + } catch (_err) { + // ignored + } + + const onCompiled = (err, stats) => { + if (err) return done(err); + const jsonStats = stats.toJson({ + errorDetails: true + }); + if ( + checkArrayExpectation( + testDirectory, + jsonStats, + "error", + "Error", + options, + done + ) + ) { + return; + } + if ( + checkArrayExpectation( + testDirectory, + jsonStats, + "warning", + "Warning", + options, + done + ) + ) { + return; + } + + const urlToPath = url => { + if (url.startsWith("https://test.cases/path/")) + url = url.slice(24); + return path.resolve(outputDirectory, `./${url}`); + }; + const urlToRelativePath = url => { + if (url.startsWith("https://test.cases/path/")) + url = url.slice(24); + return `./${url}`; + }; + const window = { + _elements: [], + fetch: async url => { + try { + const buffer = await new Promise((resolve, reject) => { + fs.readFile(urlToPath(url), (err, b) => + err ? reject(err) : resolve(b) + ); + }); + return { + status: 200, + ok: true, + json: async () => JSON.parse(buffer.toString("utf-8")) + }; + } catch (err) { + if (err.code === "ENOENT") { + return { + status: 404, + ok: false + }; + } + throw err; + } + }, + importScripts: url => { + expect(url).toMatch(/^https:\/\/test\.cases\/path\//); + _require(urlToRelativePath(url)); + }, + document: { + createElement(type) { + const ele = { + _type: type, + getAttribute(name) { + return this[name]; + }, + setAttribute(name, value) { + this[name] = value; + }, + removeAttribute(name) { + delete this[name]; + }, + parentNode: { + removeChild(node) { + window._elements = window._elements.filter( + item => item !== node + ); + } + } + }; + ele.sheet = + type === "link" + ? new FakeDocument.FakeSheet(ele, outputDirectory) + : {}; + return ele; + }, + head: { + appendChild(element) { + window._elements.push(element); + + if (element._type === "script") { + // run it + Promise.resolve().then(() => { + _require(urlToRelativePath(element.src)); + }); + } else if (element._type === "link") { + Promise.resolve().then(() => { + if (element.onload) { + // run it + element.onload({ type: "load" }); + } + }); + } + }, + insertBefore(element, before) { + window._elements.push(element); + + if (element._type === "script") { + // run it + Promise.resolve().then(() => { + _require(urlToRelativePath(element.src)); + }); + } else if (element._type === "link") { + // run it + Promise.resolve().then(() => { + element.onload({ type: "load" }); + }); + } + } + }, + getElementsByTagName(name) { + if (name === "head") return [this.head]; + if (name === "script" || name === "link") { + return window._elements.filter( + item => item._type === name + ); + } + + throw new Error("Not supported"); + } + }, + Worker: require("./helpers/createFakeWorker")({ + outputDirectory + }), + EventSource: require("./helpers/EventSourceForNode"), + location: { + href: "https://test.cases/path/index.html", + origin: "https://test.cases", + toString() { + return "https://test.cases/path/index.html"; + } + } + }; + + const moduleScope = { + window + }; + + if (testConfig.moduleScope) { + testConfig.moduleScope(moduleScope, options); + } + + function _next(callback) { + fakeUpdateLoaderOptions.updateIndex++; + compiler.run((err, stats) => { + if (err) return callback(err); + const jsonStats = stats.toJson({ + errorDetails: true + }); + if ( + checkArrayExpectation( + testDirectory, + jsonStats, + "error", + `errors${fakeUpdateLoaderOptions.updateIndex}`, + "Error", + options, + callback + ) + ) { + return; + } + if ( + checkArrayExpectation( + testDirectory, + jsonStats, + "warning", + `warnings${fakeUpdateLoaderOptions.updateIndex}`, + "Warning", + options, + callback + ) + ) { + return; + } + callback(null, jsonStats); + }); + } + + /** + * @private + * @param {string} module module + * @returns {EXPECTED_ANY} required module + */ + function _require(module) { + if (module.startsWith("./")) { + const p = path.join(outputDirectory, module); + if (module.endsWith(".css")) { + return fs.readFileSync(p, "utf-8"); + } + if (module.endsWith(".json")) { + return JSON.parse(fs.readFileSync(p, "utf-8")); + } + const fn = vm.runInThisContext( + "(function(require, module, exports, __dirname, __filename, it, beforeEach, afterEach, expect, jest, self, window, fetch, document, importScripts, Worker, EventSource, NEXT, STATS) {" + + "global.expect = expect;" + + "global.it = it;" + + `function nsObj(m) { Object.defineProperty(m, Symbol.toStringTag, { value: "Module" }); return m; }${fs.readFileSync( + p, + "utf-8" + )}\n})`, + p + ); + const m = { + exports: {} + }; + fn.call( + m.exports, + _require, + m, + m.exports, + outputDirectory, + p, + _it, + _beforeEach, + _afterEach, + expect, + jest, + window, + window, + window.fetch, + window.document, + window.importScripts, + window.Worker, + window.EventSource, + _next, + jsonStats + ); + return m.exports; + } + return require(module); + } + let promise = Promise.resolve(); + const info = stats.toJson({ all: false, entrypoints: true }); + if (config.target === "web") { + for (const file of info.entrypoints.main.assets) { + if (file.name.endsWith(".css")) { + const link = window.document.createElement("link"); + link.href = path.join(outputDirectory, file.name); + window.document.head.appendChild(link); + } else { + _require(`./${file.name}`); + } + } + } else { + const assets = info.entrypoints.main.assets; + const result = _require( + `./${assets[assets.length - 1].name}` + ); + if (typeof result === "object" && "then" in result) + promise = promise.then(() => result); + } + promise.then( + () => { + if (getNumberOfTests() < 1) + return done(new Error("No tests exported by test case")); + + done(); + }, + err => { + console.log(err); + done(err); + } + ); + }; + compiler = webpack(options); + compiler.run(onCompiled); + }, 20000); + + const { + it: _it, + beforeEach: _beforeEach, + afterEach: _afterEach, + getNumberOfTests + } = createLazyTestEnv(20000); + }); + } + }); + } + }); +}; + +// eslint-disable-next-line jest/no-export +module.exports.describeCases = describeCases; diff --git a/test/HotTestCases.test.js b/test/HotTestCases.test.js deleted file mode 100644 index bb9e4d31ac6..00000000000 --- a/test/HotTestCases.test.js +++ /dev/null @@ -1,191 +0,0 @@ -"use strict"; - -/* globals expect fit */ -const path = require("path"); -const fs = require("fs"); -const vm = require("vm"); -const checkArrayExpectation = require("./checkArrayExpectation"); -const createLazyTestEnv = require("./helpers/createLazyTestEnv"); - -const webpack = require("../lib/webpack"); - -describe("HotTestCases", () => { - const casesPath = path.join(__dirname, "hotCases"); - let categories = fs - .readdirSync(casesPath) - .filter(dir => fs.statSync(path.join(casesPath, dir)).isDirectory()); - categories = categories.map(cat => { - return { - name: cat, - tests: fs - .readdirSync(path.join(casesPath, cat)) - .filter(folder => folder.indexOf("_") < 0) - }; - }); - categories.forEach(category => { - describe(category.name, () => { - category.tests.forEach(testName => { - describe(testName, () => { - it( - testName + " should compile", - done => { - const testDirectory = path.join( - casesPath, - category.name, - testName - ); - const outputDirectory = path.join( - __dirname, - "js", - "hot-cases", - category.name, - testName - ); - const recordsPath = path.join(outputDirectory, "records.json"); - if (fs.existsSync(recordsPath)) fs.unlinkSync(recordsPath); - const fakeUpdateLoaderOptions = { - updateIndex: 0 - }; - const configPath = path.join(testDirectory, "webpack.config.js"); - let options = {}; - if (fs.existsSync(configPath)) options = require(configPath); - if (!options.mode) options.mode = "development"; - if (!options.devtool) options.devtool = false; - if (!options.context) options.context = testDirectory; - if (!options.entry) options.entry = "./index.js"; - if (!options.output) options.output = {}; - if (!options.output.path) options.output.path = outputDirectory; - if (!options.output.filename) - options.output.filename = "bundle.js"; - if (options.output.pathinfo === undefined) - options.output.pathinfo = true; - if (!options.module) options.module = {}; - if (!options.module.rules) options.module.rules = []; - options.module.rules.push({ - loader: path.join( - __dirname, - "hotCases", - "fake-update-loader.js" - ), - enforce: "pre" - }); - if (!options.target) options.target = "async-node"; - if (!options.plugins) options.plugins = []; - options.plugins.push( - new webpack.HotModuleReplacementPlugin(), - new webpack.NamedModulesPlugin(), - new webpack.LoaderOptionsPlugin(fakeUpdateLoaderOptions) - ); - if (!options.recordsPath) options.recordsPath = recordsPath; - const compiler = webpack(options); - compiler.run((err, stats) => { - if (err) return done(err); - const jsonStats = stats.toJson({ - errorDetails: true - }); - if ( - checkArrayExpectation( - testDirectory, - jsonStats, - "error", - "Error", - done - ) - ) { - return; - } - if ( - checkArrayExpectation( - testDirectory, - jsonStats, - "warning", - "Warning", - done - ) - ) { - return; - } - - function _next(callback) { - fakeUpdateLoaderOptions.updateIndex++; - compiler.run((err, stats) => { - if (err) return callback(err); - const jsonStats = stats.toJson({ - errorDetails: true - }); - if ( - checkArrayExpectation( - testDirectory, - jsonStats, - "error", - "errors" + fakeUpdateLoaderOptions.updateIndex, - "Error", - callback - ) - ) { - return; - } - if ( - checkArrayExpectation( - testDirectory, - jsonStats, - "warning", - "warnings" + fakeUpdateLoaderOptions.updateIndex, - "Warning", - callback - ) - ) { - return; - } - callback(null, jsonStats); - }); - } - - function _require(module) { - if (module.substr(0, 2) === "./") { - const p = path.join(outputDirectory, module); - const fn = vm.runInThisContext( - "(function(require, module, exports, __dirname, __filename, it, expect, NEXT, STATS) {" + - "global.expect = expect;" + - 'function nsObj(m) { Object.defineProperty(m, Symbol.toStringTag, { value: "Module" }); return m; }' + - fs.readFileSync(p, "utf-8") + - "\n})", - p - ); - const m = { - exports: {} - }; - fn.call( - m.exports, - _require, - m, - m.exports, - outputDirectory, - p, - _it, - expect, - _next, - jsonStats - ); - return m.exports; - } else return require(module); - } - _require("./bundle.js"); - if (getNumberOfTests() < 1) - return done(new Error("No tests exported by test case")); - - done(); - }); - }, - 10000 - ); - - const { it: _it, getNumberOfTests } = createLazyTestEnv( - jasmine.getEnv(), - 10000 - ); - }); - }); - }); - }); -}); diff --git a/test/HotTestCasesAsyncNode.test.js b/test/HotTestCasesAsyncNode.test.js new file mode 100644 index 00000000000..64ed67adf41 --- /dev/null +++ b/test/HotTestCasesAsyncNode.test.js @@ -0,0 +1,8 @@ +const { describeCases } = require("./HotTestCases.template"); + +describe("HotTestCases", () => { + describeCases({ + name: "async-node", + target: "async-node" + }); +}); diff --git a/test/HotTestCasesNode.test.js b/test/HotTestCasesNode.test.js new file mode 100644 index 00000000000..980198047d6 --- /dev/null +++ b/test/HotTestCasesNode.test.js @@ -0,0 +1,8 @@ +const { describeCases } = require("./HotTestCases.template"); + +describe("HotTestCases", () => { + describeCases({ + name: "node", + target: "node" + }); +}); diff --git a/test/HotTestCasesWeb.test.js b/test/HotTestCasesWeb.test.js new file mode 100644 index 00000000000..59052deac03 --- /dev/null +++ b/test/HotTestCasesWeb.test.js @@ -0,0 +1,8 @@ +const { describeCases } = require("./HotTestCases.template"); + +describe("HotTestCases", () => { + describeCases({ + name: "web", + target: "web" + }); +}); diff --git a/test/HotTestCasesWebWorker.test.js b/test/HotTestCasesWebWorker.test.js new file mode 100644 index 00000000000..9aaeb189f5d --- /dev/null +++ b/test/HotTestCasesWebWorker.test.js @@ -0,0 +1,8 @@ +const { describeCases } = require("./HotTestCases.template"); + +describe("HotTestCases", () => { + describeCases({ + name: "webworker", + target: "webworker" + }); +}); diff --git a/test/Integration.test.js b/test/Integration.test.js deleted file mode 100644 index a09f0c8e3ca..00000000000 --- a/test/Integration.test.js +++ /dev/null @@ -1,104 +0,0 @@ -"use strict"; - -const path = require("path"); -const webpack = require("../lib/webpack"); - -describe("Integration", () => { - jest.setTimeout(10000); - it("should compile library1", done => { - webpack( - { - mode: "production", - entry: "library1", - bail: true, - context: path.join(__dirname, "browsertest"), - output: { - pathinfo: true, - path: path.join(__dirname, "browsertest", "js"), - filename: "library1.js", - library: "library1" - } - }, - (err, stats) => { - if (err) throw err; - expect(stats.hasErrors()).toBe(false); - expect(stats.hasWarnings()).toBe(false); - done(); - } - ); - }); - it("should compile library2", done => { - webpack( - { - mode: "production", - entry: "library2", - context: path.join(__dirname, "browsertest"), - output: { - pathinfo: true, - path: path.join(__dirname, "browsertest", "js"), - filename: "library2.js", - publicPath: "js/", - library: "library2" - }, - bail: true, - module: { - rules: [ - { - test: /extra2\.js/, - loader: "raw!extra!val?cacheable", - enforce: "post" - } - ] - }, - amd: { - fromOptions: true - }, - optimization: { - minimize: false - }, - plugins: [ - new webpack.optimize.LimitChunkCountPlugin({ - maxChunks: 1 - }), - new webpack.DefinePlugin({ - "typeof CONST_TYPEOF": JSON.stringify("typeof"), - CONST_TRUE: true, - CONST_FALSE: false, - CONST_FUNCTION: function() { - return "ok"; - }, - CONST_NUMBER: 123, - CONST_NUMBER_EXPR: "1*100+23", - CONST_OBJECT: { - A: 1, - B: JSON.stringify("B"), - C: function() { - return "C"; - } - } - }), - function() { - this.hooks.normalModuleFactory.tap("IntegrationTest", nmf => { - nmf.hooks.afterResolve.tapAsync( - "IntegrationTest", - (data, callback) => { - data.resource = data.resource.replace( - /extra\.js/, - "extra2.js" - ); - setTimeout(() => callback(null, data), 50); - } - ); - }); - } - ] - }, - (err, stats) => { - if (err) throw err; - expect(stats.hasErrors()).toBe(false); - expect(stats.hasWarnings()).toBe(false); - done(); - } - ); - }); -}); diff --git a/test/JavascriptParser.unittest.js b/test/JavascriptParser.unittest.js new file mode 100644 index 00000000000..9cf8e5d3a14 --- /dev/null +++ b/test/JavascriptParser.unittest.js @@ -0,0 +1,756 @@ +"use strict"; + +// cspell:ignore fghsub notry fghsub notry notry this's ijksub this's ijksub fghsub fghsub notry ijksub ijksub strrring strrring strr strrring strrring strr Sstrrringy strone stronetwo stronetwothree stronetwo stronetwothree stronetwothreefour onetwo onetwo twothree twothree twothree threefour onetwo onetwo threefour threefour fourfive startstrmid igmy igmyi igmya +const BasicEvaluatedExpression = require("../lib/javascript/BasicEvaluatedExpression"); +const JavascriptParser = require("../lib/javascript/JavascriptParser"); + +describe("JavascriptParser", () => { + /* eslint-disable no-undef */ + /* eslint-disable no-unused-vars */ + const testCases = { + "call ident": [ + function () { + abc("test"); + }, + { + abc: ["test"] + } + ], + "call member": [ + function () { + cde.abc("membertest"); + }, + { + cdeabc: ["membertest"] + } + ], + "call member using bracket notation": [ + function () { + // eslint-disable-next-line dot-notation + cde["abc"]("membertest"); + }, + { + cdeabc: ["membertest"] + } + ], + "call inner member": [ + function () { + cde.ddd.abc("inner"); + }, + { + cdedddabc: ["inner"] + } + ], + "call inner member using bracket notation": [ + function () { + // eslint-disable-next-line dot-notation + cde.ddd["abc"]("inner"); + }, + { + cdedddabc: ["inner"] + } + ], + expression: [ + function () { + fgh; + }, + { + fgh: [""] + } + ], + "expression sub": [ + function () { + fgh.sub; + }, + { + fghsub: ["notry"] + } + ], + "member expression": [ + function () { + test[memberExpr]; + // eslint-disable-next-line no-implicit-coercion + test[+memberExpr]; + }, + { + expressions: ["memberExpr", "memberExpr"] + } + ], + "in function definition": [ + function () { + (function (abc, cde, fgh) { + abc("test"); + cde.abc("test"); + cde.ddd.abc("test"); + fgh; + fgh.sub; + })(); + }, + {} + ], + "const definition": [ + function () { + // eslint-disable-next-line one-var + let abc, cde, fgh; + abc("test"); + cde.abc("test"); + cde.ddd.abc("test"); + fgh; + fgh.sub; + }, + {} + ], + "var definition": [ + function () { + // eslint-disable-next-line one-var + let abc, cde, fgh; + abc("test"); + cde.abc("test"); + cde.ddd.abc("test"); + fgh; + fgh.sub; + }, + {} + ], + "function definition": [ + function () { + function abc() {} + + function cde() {} + + function fgh() {} + abc("test"); + cde.abc("test"); + cde.ddd.abc("test"); + fgh; + fgh.sub; + }, + {} + ], + "class definition": [ + function () { + class memberExpr { + cde() { + abc("cde"); + } + + static fgh() { + abc("fgh"); + fgh(); + } + } + }, + { + abc: ["cde", "fgh"], + fgh: ["memberExpr"] + } + ], + "in try": [ + function () { + try { + fgh.sub; + fgh; + + function test(ttt) { + fgh.sub; + fgh; + } + } catch (err) { + fgh.sub; + fgh; + } + }, + { + fghsub: ["try", "notry", "notry"], + fgh: ["test", "test ttt", "test err"] + } + ], + "renaming with const": [ + function () { + const xyz = abc; + xyz("test"); + }, + { + abc: ["test"] + } + ], + "renaming with var": [ + function () { + const xyz = abc; + xyz("test"); + }, + { + abc: ["test"] + } + ], + "renaming with assignment": [ + function () { + const xyz = abc; + xyz("test"); + }, + { + abc: ["test"] + } + ], + "renaming with IIFE": [ + function () { + !(function (xyz) { + xyz("test"); + })(abc); + }, + { + abc: ["test"] + } + ], + "renaming arguments with IIFE (called)": [ + function () { + !function (xyz) { + xyz("test"); + }.call(fgh, abc); + }, + { + abc: ["test"], + fgh: [""] + } + ], + "renaming this's properties with IIFE (called)": [ + function () { + !function () { + this.sub; + }.call(ijk); + }, + { + ijksub: ["test"] + } + ], + "renaming this's properties with nested IIFE (called)": [ + function () { + !function () { + !function () { + this.sub; + }.call(this); + }.call(ijk); + }, + { + ijksub: ["test"] + } + ], + "new Foo(...)": [ + function () { + // eslint-disable-next-line new-cap + new xyz("membertest"); + }, + { + xyz: ["membertest"] + } + ], + "spread calls/literals": [ + function () { + const xyz = [...abc("xyz"), cde]; + Math.max(...fgh); + }, + { + abc: ["xyz"], + fgh: ["xyz"] + } + ] + }; + /* eslint-enable no-undef */ + /* eslint-enable no-unused-vars */ + + for (const name of Object.keys(testCases)) { + it(`should parse ${name}`, () => { + let source = testCases[name][0].toString(); + source = source.slice(13, -1).trim(); + const state = testCases[name][1]; + + const testParser = new JavascriptParser({}); + testParser.hooks.canRename + .for("abc") + .tap("JavascriptParserTest", expr => true); + testParser.hooks.canRename + .for("ijk") + .tap("JavascriptParserTest", expr => true); + testParser.hooks.call.for("abc").tap("JavascriptParserTest", expr => { + if (!testParser.state.abc) testParser.state.abc = []; + testParser.state.abc.push(testParser.parseString(expr.arguments[0])); + return true; + }); + testParser.hooks.call.for("cde.abc").tap("JavascriptParserTest", expr => { + if (!testParser.state.cdeabc) testParser.state.cdeabc = []; + testParser.state.cdeabc.push(testParser.parseString(expr.arguments[0])); + return true; + }); + testParser.hooks.call + .for("cde.ddd.abc") + .tap("JavascriptParserTest", expr => { + if (!testParser.state.cdedddabc) testParser.state.cdedddabc = []; + testParser.state.cdedddabc.push( + testParser.parseString(expr.arguments[0]) + ); + return true; + }); + testParser.hooks.expression + .for("fgh") + .tap("JavascriptParserTest", expr => { + if (!testParser.state.fgh) testParser.state.fgh = []; + testParser.state.fgh.push( + Array.from(testParser.scope.definitions.asSet()).join(" ") + ); + return true; + }); + testParser.hooks.expression + .for("fgh.sub") + .tap("JavascriptParserTest", expr => { + if (!testParser.state.fghsub) testParser.state.fghsub = []; + testParser.state.fghsub.push( + testParser.scope.inTry ? "try" : "notry" + ); + return true; + }); + testParser.hooks.expression + .for("ijk.sub") + .tap("JavascriptParserTest", expr => { + if (!testParser.state.ijksub) testParser.state.ijksub = []; + testParser.state.ijksub.push("test"); + return true; + }); + testParser.hooks.expression + .for("memberExpr") + .tap("JavascriptParserTest", expr => { + if (!testParser.state.expressions) testParser.state.expressions = []; + testParser.state.expressions.push(expr.name); + return true; + }); + testParser.hooks.new.for("xyz").tap("JavascriptParserTest", expr => { + if (!testParser.state.xyz) testParser.state.xyz = []; + testParser.state.xyz.push(testParser.parseString(expr.arguments[0])); + return true; + }); + const actual = testParser.parse(source, {}); + expect(typeof actual).toBe("object"); + expect(actual).toEqual(state); + }); + } + + it("should parse comments", () => { + const source = "//comment1\n/*comment2*/"; + const state = [ + { + type: "Line", + value: "comment1" + }, + { + type: "Block", + value: "comment2" + } + ]; + + const testParser = new JavascriptParser({}); + + testParser.hooks.program.tap("JavascriptParserTest", (ast, comments) => { + if (!testParser.state.comments) testParser.state.comments = comments; + return true; + }); + + const actual = testParser.parse(source, {}); + expect(typeof actual).toBe("object"); + expect(typeof actual.comments).toBe("object"); + for (const [index, element] of actual.comments.entries()) { + expect(typeof element.type).toBe("string"); + expect(typeof element.value).toBe("string"); + expect(element.type).toBe(state[index].type); + expect(element.value).toBe(state[index].value); + } + }); + + describe("expression evaluation", () => { + /** + * @param {string} source source + * @returns {import("../lib/javascript/JavascriptParser").ParserState} the parser state + */ + function evaluateInParser(source) { + const parser = new JavascriptParser(); + parser.hooks.call.for("test").tap("JavascriptParserTest", expr => { + parser.state.result = parser.evaluateExpression(expr.arguments[0]); + }); + parser.hooks.evaluateIdentifier + .for("aString") + .tap("JavascriptParserTest", expr => + new BasicEvaluatedExpression() + .setString("aString") + .setRange(expr.range) + ); + parser.hooks.evaluateIdentifier + .for("b.Number") + .tap("JavascriptParserTest", expr => + new BasicEvaluatedExpression().setNumber(123).setRange(expr.range) + ); + return parser.parse(`test(${source});`, {}).result; + } + + const testCases = { + true: "bool=true", + false: "bool=false", + "!true": "bool=false", + "!false": "bool=true", + '"strrring"': "string=strrring", + '"strr" + "ring"': "string=strrring", + '"s" + ("trr" + "rin") + "g"': "string=strrring", + "'S' + (\"strr\" + \"ring\") + 'y'": "string=Sstrrringy", + "/abc/": "regExp=/abc/", + 1: "number=1", + "1 + 3": "number=4", + "3 - 1": "number=2", + "2 * 3": "number=6", + "8 / 2": "number=4", + "2 ** 3": "number=8", + "12 & 5": "number=4", + "12 | 5": "number=13", + "12 ^ 5": "number=9", + "9 >>> 2": "number=2", + "9 >> 2": "number=2", + "9 << 2": "number=36", + "~3": "number=-4", + "1 == 1": "bool=true", + "1 === 1": "bool=true", + "3 != 1": "bool=true", + "3 !== 1": "bool=true", + "3 == 1": "bool=false", + "3 === 1": "bool=false", + "1 != 1": "bool=false", + "1 !== 1": "bool=false", + 100.25: "number=100.25", + "!100.25": "bool=false", + "!+100.25": "bool=false", + "!-100.25": "bool=false", + 0: "number=0", + "!0": "bool=true", + "!-0": "bool=true", + "!+0": "bool=true", + "20n": "bigint=20", + "10n + 10n": "bigint=20", + "10n - 5n": "bigint=5", + "10n * 5n": "bigint=50", + "10n / 5n": "bigint=2", + "5n ** 2n": "bigint=25", + "5n == 5n": "bool=true", + "5n === 5n": "bool=true", + "5n != 5n": "bool=false", + "5n !== 5n": "bool=false", + "5n != 1n": "bool=true", + "5n !== 1n": "bool=true", + "5n & 3n": "bigint=1", + "5n | 2n": "bigint=7", + "5n ^ 2n": "bigint=7", + "5n >> 2n": "bigint=1", + "5n << 2n": "bigint=20", + "null == null": "bool=true", + "null === null": "bool=true", + "null != null": "bool=false", + "null !== null": "bool=false", + "true === false": "bool=false", + "false !== false": "bool=false", + "true == true": "bool=true", + "false != true": "bool=true", + "!'a'": "bool=false", + "!''": "bool=true", + "!null": "bool=true", + "'pre' + a": "wrapped=['pre' string=pre]+[null]", + "a + 'post'": "wrapped=[null]+['post' string=post]", + "'pre' + a + 'post'": "wrapped=['pre' string=pre]+['post' string=post]", + "1 + a + 2": "", + "1 + a + 'post'": "wrapped=[null]+['post' string=post]", + "'' + 1 + a + 2": "wrapped=['' + 1 string=1]+[2 string=2]", + "'' + 1 + a + 2 + 3": "wrapped=['' + 1 string=1]+[2 + 3 string=23]", + "'' + 1 + a + (2 + 3)": "wrapped=['' + 1 string=1]+[2 + 3 string=5]", + "'pre' + (1 + a) + (2 + 3)": + "wrapped=['pre' string=pre]+[2 + 3 string=5]", + "a ? 'o1' : 'o2'": "options=['o1' string=o1],['o2' string=o2]", + "a ? 'o1' : b ? 'o2' : 'o3'": + "options=['o1' string=o1],['o2' string=o2],['o3' string=o3]", + "a ? (b ? 'o1' : 'o2') : 'o3'": + "options=['o1' string=o1],['o2' string=o2],['o3' string=o3]", + "a ? (b ? 'o1' : 'o2') : c ? 'o3' : 'o4'": + "options=['o1' string=o1],['o2' string=o2],['o3' string=o3],['o4' string=o4]", + "a ? 'o1' : b ? 'o2' : c ? 'o3' : 'o4'": + "options=['o1' string=o1],['o2' string=o2],['o3' string=o3],['o4' string=o4]", + "a ? 'o1' : b ? b : c ? 'o3' : c": + "options=['o1' string=o1],[b],['o3' string=o3],[c]", + "['i1', 'i2', 3, a, b ? 4 : 5]": + "items=['i1' string=i1],['i2' string=i2],[3 number=3],[a],[b ? 4 : 5 options=[4 number=4],[5 number=5]]", + "typeof 'str'": "string=string", + "typeof aString": "string=string", + "typeof b.Number": "string=number", + "typeof b['Number']": "string=number", + "typeof b[Number]": "", + "typeof true": "string=boolean", + "typeof null": "string=object", + "typeof 1": "string=number", + "typeof 1n": "string=bigint", + "b.Number": "number=123", + "b['Number']": "number=123", + "b[Number]": "", + "'str'.concat()": "string=str", + "'str'.concat('one')": "string=strone", + "'str'.concat('one').concat('two')": "string=stronetwo", + "'str'.concat('one').concat('two', 'three')": "string=stronetwothree", + "'str'.concat('one', 'two')": "string=stronetwo", + "'str'.concat('one', 'two').concat('three')": "string=stronetwothree", + "'str'.concat('one', 'two').concat('three', 'four')": + "string=stronetwothreefour", + "'str'.concat('one', obj)": "wrapped=['str' string=str]+[null]", + "'str'.concat('one', obj).concat()": "wrapped=['str' string=str]+[null]", + "'str'.concat('one', obj, 'two')": + "wrapped=['str' string=str]+['two' string=two]", + "'str'.concat('one', obj, 'two').concat()": + "wrapped=['str' string=str]+['two' string=two]", + "'str'.concat('one', obj, 'two').concat('three')": + "wrapped=['str' string=str]+['three' string=three]", + "'str'.concat(obj)": "wrapped=['str' string=str]+[null]", + "'str'.concat(obj).concat()": "wrapped=['str' string=str]+[null]", + "'str'.concat(obj).concat('one', 'two')": + "wrapped=['str' string=str]+['one', 'two' string=onetwo]", + "'str'.concat(obj).concat(obj, 'one')": + "wrapped=['str' string=str]+['one' string=one]", + "'str'.concat(obj).concat(obj, 'one', 'two')": + "wrapped=['str' string=str]+['one', 'two' string=onetwo]", + "'str'.concat(obj).concat('one', obj, 'one')": + "wrapped=['str' string=str]+['one' string=one]", + "'str'.concat(obj).concat('one', obj, 'two', 'three')": + "wrapped=['str' string=str]+['two', 'three' string=twothree]", + "'str'.concat(obj, 'one')": + "wrapped=['str' string=str]+['one' string=one]", + "'str'.concat(obj, 'one').concat()": + "wrapped=['str' string=str]+['one' string=one]", + "'str'.concat(obj, 'one').concat('two', 'three')": + "wrapped=['str' string=str]+['two', 'three' string=twothree]", + "'str'.concat(obj, 'one').concat(obj, 'two', 'three')": + "wrapped=['str' string=str]+['two', 'three' string=twothree]", + "'str'.concat(obj, 'one').concat('two', obj, 'three')": + "wrapped=['str' string=str]+['three' string=three]", + "'str'.concat(obj, 'one').concat('two', obj, 'three', 'four')": + "wrapped=['str' string=str]+['three', 'four' string=threefour]", + "'str'.concat(obj, 'one', 'two')": + "wrapped=['str' string=str]+['one', 'two' string=onetwo]", + "'str'.concat(obj, 'one', 'two').concat()": + "wrapped=['str' string=str]+['one', 'two' string=onetwo]", + "'str'.concat(obj, 'one', 'two').concat('three', 'four')": + "wrapped=['str' string=str]+['three', 'four' string=threefour]", + "'str'.concat(obj, 'one', 'two').concat(obj, 'three', 'four')": + "wrapped=['str' string=str]+['three', 'four' string=threefour]", + "'str'.concat(obj, 'one', 'two').concat('three', obj, 'four')": + "wrapped=['str' string=str]+['four' string=four]", + "'str'.concat(obj, 'one', 'two').concat('three', obj, 'four', 'five')": + "wrapped=['str' string=str]+['four', 'five' string=fourfive]", + // eslint-disable-next-line no-template-curly-in-string + "`start${obj}mid${obj2}end`": + "template=[start string=start],[mid string=mid],[end string=end]", + // eslint-disable-next-line no-template-curly-in-string + "`start${'str'}mid${obj2}end`": + // eslint-disable-next-line no-template-curly-in-string + "template=[start${'str'}mid string=startstrmid],[end string=end]", + // eslint-disable-next-line no-template-curly-in-string + "`a${x}` === `b${x}`": "bool=false", + // eslint-disable-next-line no-template-curly-in-string + "`${x}a` === `${x}b`": "bool=false", + // eslint-disable-next-line no-template-curly-in-string + "`${a}${b}` === `a${b}`": "", + // eslint-disable-next-line no-template-curly-in-string + "`${a}${b}` === `${a}b`": "", + "'abc'.slice(1)": "string=bc", + "'abcdef'.slice(2, 5)": "string=cde", + "'abcdef'.substring(2, 3)": "string=c", + "'abcdef'.substring(2, 3, 4)": "", + "'abc'[\"slice\"](1)": "string=bc", + "'abc'[slice](1)": "", + "'1,2+3'.split(/[,+]/)": "array=[1],[2],[3]", + "'1,2+3'.split(expr)": "", + "'a' + (expr + 'c')": "wrapped=['a' string=a]+['c' string=c]", + "1 + 'a'": "string=1a", + "'a' + 1": "string=a1", + "'a' + expr + 1": "wrapped=['a' string=a]+[1 string=1]" + }; + + for (const key of Object.keys(testCases)) { + /** + * @param {import("../lib/javascript/BasicEvaluatedExpression")} evalExpr eval expr + * @returns {string} result + */ + function evalExprToString(evalExpr) { + if (!evalExpr) { + return "null"; + } + const result = []; + if (evalExpr.isString()) result.push(`string=${evalExpr.string}`); + if (evalExpr.isNumber()) result.push(`number=${evalExpr.number}`); + if (evalExpr.isBigInt()) result.push(`bigint=${evalExpr.bigint}`); + if (evalExpr.isBoolean()) result.push(`bool=${evalExpr.bool}`); + if (evalExpr.isRegExp()) result.push(`regExp=${evalExpr.regExp}`); + if (evalExpr.isConditional()) + result.push( + `options=[${evalExpr.options.map(evalExprToString).join("],[")}]` + ); + if (evalExpr.isArray()) + result.push( + `items=[${evalExpr.items.map(evalExprToString).join("],[")}]` + ); + if (evalExpr.isConstArray()) + result.push(`array=[${evalExpr.array.join("],[")}]`); + if (evalExpr.isTemplateString()) + result.push( + `template=[${evalExpr.quasis.map(evalExprToString).join("],[")}]` + ); + if (evalExpr.isWrapped()) + result.push( + `wrapped=[${evalExprToString(evalExpr.prefix)}]+[${evalExprToString( + evalExpr.postfix + )}]` + ); + if (evalExpr.range) { + const start = evalExpr.range[0] - 5; + const end = evalExpr.range[1] - 5; + return ( + key.slice(start, end) + + (result.length > 0 ? ` ${result.join(" ")}` : "") + ); + } + return result.join(" "); + } + + it(`should eval ${key}`, () => { + const evalExpr = evaluateInParser(key); + expect(evalExprToString(evalExpr)).toBe( + testCases[key] ? `${key} ${testCases[key]}` : key + ); + }); + } + }); + + describe("async/await support", () => { + describe("should accept", () => { + const cases = { + "async function": "async function x() {}", + "async arrow function": "async () => {}", + "await expression": "async function x(y) { await y }", + "await iteration": "async function f() { for await (x of xs); }" + }; + const parser = new JavascriptParser(); + for (const name of Object.keys(cases)) { + const expr = cases[name]; + it(name, () => { + const actual = parser.parse(expr, {}); + expect(typeof actual).toBe("object"); + }); + } + }); + describe("should parse await", () => { + const cases = { + require: [ + "async function x() { await require('y'); }", + { + param: "y" + } + ], + import: [ + "async function x() { const y = await import('z'); }", + { + param: "z" + } + ] + }; + + const parser = new JavascriptParser(); + parser.hooks.call.for("require").tap("JavascriptParserTest", expr => { + const param = parser.evaluateExpression(expr.arguments[0]); + parser.state.param = param.string; + }); + parser.hooks.importCall.tap("JavascriptParserTest", expr => { + const param = parser.evaluateExpression(expr.source); + parser.state.param = param.string; + }); + + for (const name of Object.keys(cases)) { + it(name, () => { + const actual = parser.parse(cases[name][0], {}); + expect(actual).toEqual(cases[name][1]); + }); + } + }); + }); + + describe("object rest/spread support", () => { + describe("should accept", () => { + const cases = { + "object spread": "({...obj})", + "object rest": "({...obj} = foo)" + }; + for (const name of Object.keys(cases)) { + const expr = cases[name]; + it(name, () => { + const actual = JavascriptParser._parse(expr, {}); + expect(typeof actual).toBe("object"); + }); + } + }); + + it("should collect definitions from identifiers introduced in object patterns", () => { + let definitions; + + const parser = new JavascriptParser(); + + parser.hooks.statement.tap("JavascriptParserTest", expr => { + definitions = parser.scope.definitions; + return true; + }); + + parser.parse("const { a, ...rest } = { a: 1, b: 2 };", {}); + + expect(definitions.has("a")).toBe(true); + expect(definitions.has("rest")).toBe(true); + }); + }); + + describe("optional catch binding support", () => { + describe("should accept", () => { + const cases = { + "optional binding": "try {} catch {}" + }; + for (const name of Object.keys(cases)) { + const expr = cases[name]; + it(name, () => { + const actual = JavascriptParser._parse(expr); + expect(typeof actual).toBe("object"); + }); + } + }); + }); + + describe("BasicEvaluatedExpression", () => { + /** @type [string, boolean][] */ + const tests = [ + ...["i", "g", "m", "y"].reduce((acc, flag) => { + acc.push([flag, true]); + acc.push([flag + flag, false]); + return acc; + }, []), + ["", true], + ["igm", true], + ["igmy", true], + ["igmyi", false], + ["igmya", false], + ["ai", false], + ["ia", false] + ]; + + for (const [suite, expected] of tests) { + it(`BasicEvaluatedExpression.isValidRegExpFlags(${JSON.stringify( + suite + )})`, () => { + expect(BasicEvaluatedExpression.isValidRegExpFlags(suite)).toBe( + expected + ); + }); + } + }); +}); diff --git a/test/LazySet.unittest.js b/test/LazySet.unittest.js new file mode 100644 index 00000000000..92c829f7a33 --- /dev/null +++ b/test/LazySet.unittest.js @@ -0,0 +1,22 @@ +const LazySet = require("../lib/util/LazySet"); + +describe("LazySet", () => { + it("addAll", () => { + const a = new Set(["a"]); + const sut = new LazySet(a); + const empty = new LazySet([]); + expect(sut.size).toBe(1); + sut.addAll(empty); + expect(sut._toDeepMerge).toStrictEqual([]); + expect(sut.size).toBe(1); + const b = new Set(["b"]); + sut.addAll(b); + expect(sut._toMerge).toContain(b); + expect(sut.size).toBe(2); + const c = new LazySet(["c"]); + sut.addAll(c); + expect(sut._toDeepMerge).toContain(c); + expect(sut.size).toBe(3); + expect(sut._toDeepMerge).toStrictEqual([]); + }); +}); diff --git a/test/LocalModulesHelpers.unittest.js b/test/LocalModulesHelpers.unittest.js index b858697073a..f4d98b00a91 100644 --- a/test/LocalModulesHelpers.unittest.js +++ b/test/LocalModulesHelpers.unittest.js @@ -1,22 +1,19 @@ -/* globals describe, it */ "use strict"; -const LocalModulesHelpers = require("../lib/dependencies/LocalModulesHelpers"); +const { + addLocalModule, + getLocalModule +} = require("../lib/dependencies/LocalModulesHelpers"); describe("LocalModulesHelpers", () => { describe("addLocalModule", () => { it("returns a module var without special characters", () => { const state = { - module: "module_sample", localModules: ["first", "second"] }; - const localModule = LocalModulesHelpers.addLocalModule( - state, - "local_module_sample" - ); + const localModule = addLocalModule(state, "local_module_sample"); expect(localModule).toBeInstanceOf(Object); expect(localModule).toMatchObject({ - module: "module_sample", name: "local_module_sample", idx: 2, used: false @@ -38,9 +35,7 @@ describe("LocalModulesHelpers", () => { } ] }; - expect( - LocalModulesHelpers.getLocalModule(state, "local_module_sample") - ).toBe(null); + expect(getLocalModule(state, "local_module_sample")).toBe(null); }); it("returns local module information", () => { @@ -55,7 +50,7 @@ describe("LocalModulesHelpers", () => { } ] }; - expect(LocalModulesHelpers.getLocalModule(state, "first")).toEqual({ + expect(getLocalModule(state, "first")).toEqual({ name: "first" }); }); diff --git a/test/MemoryLimitTestCases.test.js b/test/MemoryLimitTestCases.test.js new file mode 100644 index 00000000000..84e107ed9c8 --- /dev/null +++ b/test/MemoryLimitTestCases.test.js @@ -0,0 +1,134 @@ +"use strict"; + +require("./helpers/warmup-webpack"); +const path = require("path"); +const fs = require("graceful-fs"); +const rimraf = require("rimraf"); +const captureStdio = require("./helpers/captureStdio"); +const webpack = require(".."); + +const toMiB = bytes => `${Math.round(bytes / 1024 / 1024)}MiB`; +const base = path.join(__dirname, "memoryLimitCases"); +const outputBase = path.join(__dirname, "js", "memoryLimit"); +const tests = fs + .readdirSync(base) + .filter( + testName => + fs.existsSync(path.join(base, testName, "index.js")) || + fs.existsSync(path.join(base, testName, "webpack.config.js")) + ) + .filter(testName => { + const testDirectory = path.join(base, testName); + const filterPath = path.join(testDirectory, "test.filter.js"); + if (fs.existsSync(filterPath) && !require(filterPath)()) { + // eslint-disable-next-line jest/no-disabled-tests, jest/valid-describe-callback + describe.skip(testName, () => it("filtered")); + return false; + } + return true; + }); + +describe("MemoryLimitTestCases", () => { + jest.setTimeout(40000); + let stderr; + beforeEach(() => { + stderr = captureStdio(process.stderr, true); + if (global.gc) { + global.gc(); + global.gc(); + } + }); + afterEach(() => { + stderr.restore(); + }); + for (const testName of tests) { + let testConfig = { + heapSizeLimitBytes: 250 * 1024 * 1024 + }; + try { + // try to load a test file + testConfig = Object.assign( + testConfig, + require(path.join(base, testName, "test.config.js")) + ); + } catch (_err) { + // ignored + } + const size = toMiB(testConfig.heapSizeLimitBytes); + // eslint-disable-next-line no-loop-func + it(`should build ${JSON.stringify(testName)} with heap limit of ${size}`, done => { + const outputDirectory = path.join(outputBase, testName); + rimraf.sync(outputDirectory); + fs.mkdirSync(outputDirectory, { recursive: true }); + let options = { + mode: "development", + entry: "./index", + output: { + filename: "bundle.js" + } + }; + if (fs.existsSync(path.join(base, testName, "webpack.config.js"))) { + options = require(path.join(base, testName, "webpack.config.js")); + } + + const resolvedOptions = Array.isArray(options) ? options : [options]; + for (const options of resolvedOptions) { + if (!options.context) options.context = path.join(base, testName); + if (!options.output) options.output = options.output || {}; + if (!options.output.path) options.output.path = outputDirectory; + if (!options.plugins) options.plugins = []; + if (!options.optimization) options.optimization = {}; + if (options.optimization.minimize === undefined) + options.optimization.minimize = false; + } + const heapSizeStart = process.memoryUsage().heapUsed; + const c = webpack(options); + const compilers = c.compilers ? c.compilers : [c]; + for (const c of compilers) { + const ifs = c.inputFileSystem; + c.inputFileSystem = Object.create(ifs); + c.inputFileSystem.readFile = function () { + // eslint-disable-next-line prefer-rest-params + const args = Array.prototype.slice.call(arguments); + const callback = args.pop(); + // eslint-disable-next-line prefer-spread + ifs.readFile.apply( + ifs, + args.concat([ + (err, result) => { + if (err) return callback(err); + if (!/\.(js|json|txt)$/.test(args[0])) + return callback(null, result); + callback(null, result.toString("utf-8").replace(/\r/g, "")); + } + ]) + ); + }; + } + c.run((err, stats) => { + if (err) return done(err); + expect(stats.hasErrors()).toBe(testName.endsWith("error")); + if (!testName.endsWith("error") && stats.hasErrors()) { + return done( + new Error( + stats.toString({ + all: false, + errors: true, + errorStack: true, + errorDetails: true + }) + ) + ); + } + const heapUsed = process.memoryUsage().heapUsed - heapSizeStart; + if (heapUsed > testConfig.heapSizeLimitBytes) { + return done( + new Error(`Out of memory limit with ${toMiB(heapUsed)} heap used`) + ); + } + if (testConfig.validate) testConfig.validate(stats, stderr.toString()); + done(); + }); + }); + } +}); diff --git a/test/ModuleReason.unittest.js b/test/ModuleReason.unittest.js deleted file mode 100644 index 56a6cc25c01..00000000000 --- a/test/ModuleReason.unittest.js +++ /dev/null @@ -1,60 +0,0 @@ -"use strict"; - -const Module = require("../lib/Module"); -const Chunk = require("../lib/Chunk"); -const Dependency = require("../lib/Dependency"); -const ModuleReason = require("../lib/ModuleReason"); - -describe("ModuleReason", () => { - let myModule; - let myDependency; - let myModuleReason; - let myChunk; - let myChunk2; - - beforeEach(() => { - myModule = new Module(); - myDependency = new Dependency(); - myChunk = new Chunk("chunk-test", "module-test", "loc-test"); - myChunk2 = new Chunk("chunk-test", "module-test", "loc-test"); - - myModuleReason = new ModuleReason(myModule, myDependency); - }); - - describe("hasChunk", () => { - it("returns false when chunk is not present", () => { - expect(myModuleReason.hasChunk(myChunk)).toBe(false); - }); - - it("returns true when chunk is present", () => { - myModuleReason.module.addChunk(myChunk); - expect(myModuleReason.hasChunk(myChunk)).toBe(true); - }); - }); - - describe("rewriteChunks", () => { - it("if old chunk is present, it is replaced with new chunks", () => { - myModuleReason.module.addChunk(myChunk); - myModuleReason.rewriteChunks(myChunk, [myChunk2]); - - expect(myModuleReason.hasChunk(myChunk)).toBe(false); - expect(myModuleReason.hasChunk(myChunk2)).toBe(true); - }); - - it("if old chunk is not present, new chunks are not added", () => { - myModuleReason.rewriteChunks(myChunk, [myChunk2]); - - expect(myModuleReason.hasChunk(myChunk)).toBe(false); - expect(myModuleReason.hasChunk(myChunk2)).toBe(false); - }); - - it("if already rewritten chunk is present, it is replaced with new chunks", () => { - myModuleReason.module.addChunk(myChunk); - myModuleReason.rewriteChunks(myChunk, [myChunk2]); - myModuleReason.rewriteChunks(myChunk2, [myChunk]); - - expect(myModuleReason.hasChunk(myChunk)).toBe(true); - expect(myModuleReason.hasChunk(myChunk2)).toBe(false); - }); - }); -}); diff --git a/test/MultiCompiler.test.js b/test/MultiCompiler.test.js index 92ff2dc6848..f75175f9da3 100644 --- a/test/MultiCompiler.test.js +++ b/test/MultiCompiler.test.js @@ -1,26 +1,36 @@ "use strict"; -/* globals describe it */ +require("./helpers/warmup-webpack"); const path = require("path"); -const MemoryFs = require("memory-fs"); -const webpack = require("../"); - -const createMultiCompiler = () => { - const compiler = webpack([ - { - context: path.join(__dirname, "fixtures"), - entry: "./a.js" - }, - { - context: path.join(__dirname, "fixtures"), - entry: "./b.js" - } - ]); - compiler.outputFileSystem = new MemoryFs(); +const { createFsFromVolume, Volume } = require("memfs"); +const webpack = require(".."); + +const createMultiCompiler = options => { + const compiler = webpack( + Object.assign( + [ + { + name: "a", + context: path.join(__dirname, "fixtures"), + entry: "./a.js" + }, + { + name: "b", + context: path.join(__dirname, "fixtures"), + entry: "./b.js" + } + ], + options + ) + ); + compiler.outputFileSystem = createFsFromVolume(new Volume()); + compiler.watchFileSystem = { + watch(a, b, c, d, e, f, g) {} + }; return compiler; }; -describe("MultiCompiler", function() { +describe("MultiCompiler", function () { jest.setTimeout(20000); it("should trigger 'run' for each child compiler", done => { @@ -31,10 +41,9 @@ describe("MultiCompiler", function() { compiler.run(err => { if (err) { throw err; - } else { - expect(called).toBe(2); - done(); } + expect(called).toBe(2); + compiler.close(done); }); }); @@ -43,55 +52,60 @@ describe("MultiCompiler", function() { let called = 0; compiler.hooks.watchRun.tap("MultiCompiler test", () => called++); - const watcher = compiler.watch(1000, err => { + compiler.watch(1000, err => { if (err) { throw err; - } else { - watcher.close(); - expect(called).toBe(2); - done(); } + expect(called).toBe(2); + compiler.close(done); }); }); - it("should not be run twice at a time (run)", function(done) { + it("should not be running twice at a time (run)", done => { const compiler = createMultiCompiler(); compiler.run((err, stats) => { if (err) return done(err); }); compiler.run((err, stats) => { - if (err) return done(); + if (err) { + compiler.close(done); + } }); }); - it("should not be run twice at a time (watch)", function(done) { + it("should not be running twice at a time (watch)", done => { const compiler = createMultiCompiler(); - const watcher = compiler.watch({}, (err, stats) => { + compiler.watch({}, (err, stats) => { if (err) return done(err); }); compiler.watch({}, (err, stats) => { - if (err) return watcher.close(done); + if (err) { + compiler.close(done); + } }); }); - it("should not be run twice at a time (run - watch)", function(done) { + it("should not be running twice at a time (run - watch)", done => { const compiler = createMultiCompiler(); compiler.run((err, stats) => { if (err) return done(err); }); compiler.watch({}, (err, stats) => { - if (err) return done(); + if (err) { + compiler.close(done); + } }); }); - it("should not be run twice at a time (watch - run)", function(done) { + it("should not be running twice at a time (watch - run)", done => { const compiler = createMultiCompiler(); - let watcher; - watcher = compiler.watch({}, (err, stats) => { + compiler.watch({}, (err, stats) => { if (err) return done(err); }); compiler.run((err, stats) => { - if (err) return watcher.close(done); + if (err) { + compiler.close(done); + } }); }); - it("should not be run twice at a time (instance cb)", function(done) { + it("should not be running twice at a time (instance cb)", done => { const compiler = webpack( { context: __dirname, @@ -104,35 +118,36 @@ describe("MultiCompiler", function() { }, () => {} ); - compiler.outputFileSystem = new MemoryFs(); + compiler.outputFileSystem = createFsFromVolume(new Volume()); compiler.run((err, stats) => { - if (err) return done(); + if (err) { + compiler.close(done); + } }); }); - it("should run again correctly after first compilation", function(done) { + it("should run again correctly after first compilation", done => { const compiler = createMultiCompiler(); compiler.run((err, stats) => { if (err) return done(err); compiler.run((err, stats) => { if (err) return done(err); - done(); + compiler.close(done); }); }); }); - it("should watch again correctly after first compilation", function(done) { + it("should watch again correctly after first compilation", done => { const compiler = createMultiCompiler(); compiler.run((err, stats) => { if (err) return done(err); - let watcher; - watcher = compiler.watch({}, (err, stats) => { + compiler.watch({}, (err, stats) => { if (err) return done(err); - watcher.close(done); + compiler.close(done); }); }); }); - it("should run again correctly after first closed watch", function(done) { + it("should run again correctly after first closed watch", done => { const compiler = createMultiCompiler(); const watching = compiler.watch({}, (err, stats) => { if (err) return done(err); @@ -140,21 +155,471 @@ describe("MultiCompiler", function() { watching.close(() => { compiler.run((err, stats) => { if (err) return done(err); - done(); + compiler.close(done); }); }); }); - it("should watch again correctly after first closed watch", function(done) { + it("should watch again correctly after first closed watch", done => { const compiler = createMultiCompiler(); const watching = compiler.watch({}, (err, stats) => { if (err) return done(err); }); watching.close(() => { - let watcher; - watcher = compiler.watch({}, (err, stats) => { + compiler.watch({}, (err, stats) => { + if (err) return done(err); + compiler.close(done); + }); + }); + }); + it("should respect parallelism and dependencies for running", done => { + const compiler = createMultiCompiler({ + parallelism: 1, + 2: { + name: "c", + context: path.join(__dirname, "fixtures"), + entry: "./a.js", + dependencies: ["d", "e"] + }, + 3: { + name: "d", + context: path.join(__dirname, "fixtures"), + entry: "./a.js" + }, + 4: { + name: "e", + context: path.join(__dirname, "fixtures"), + entry: "./a.js" + } + }); + const events = []; + for (const c of compiler.compilers) { + c.hooks.run.tap("test", () => { + events.push(`${c.name} run`); + }); + c.hooks.done.tap("test", () => { + events.push(`${c.name} done`); + }); + } + compiler.run((err, stats) => { + expect(events.join(" ")).toBe( + "a run a done b run b done d run d done e run e done c run c done" + ); + compiler.close(done); + }); + }); + it("should respect parallelism and dependencies for watching", done => { + const compiler = webpack( + Object.assign( + [ + { + name: "a", + mode: "development", + context: path.join(__dirname, "fixtures"), + entry: "./a.js", + dependencies: ["b", "c"] + }, + { + name: "b", + mode: "development", + context: path.join(__dirname, "fixtures"), + entry: "./b.js" + }, + { + name: "c", + mode: "development", + context: path.join(__dirname, "fixtures"), + entry: "./a.js" + } + ], + { parallelism: 1 } + ) + ); + compiler.outputFileSystem = createFsFromVolume(new Volume()); + const watchCallbacks = []; + const watchCallbacksUndelayed = []; + compiler.watchFileSystem = { + watch( + files, + directories, + missing, + startTime, + options, + callback, + callbackUndelayed + ) { + watchCallbacks.push(callback); + watchCallbacksUndelayed.push(callbackUndelayed); + } + }; + const events = []; + for (const c of compiler.compilers) { + c.hooks.invalid.tap("test", () => { + events.push(`${c.name} invalid`); + }); + c.hooks.watchRun.tap("test", () => { + events.push(`${c.name} run`); + }); + c.hooks.done.tap("test", () => { + events.push(`${c.name} done`); + }); + } + + let update = 0; + compiler.watch({}, (err, stats) => { + if (err) return done(err); + const info = () => stats.toString({ preset: "summary", version: false }); + switch (update++) { + case 0: + expect(info()).toMatchInlineSnapshot(` + "a: + a compiled successfully + + b: + b compiled successfully + + c: + c compiled successfully" + `); + expect(compiler.compilers[0].modifiedFiles).toBe(undefined); + expect(compiler.compilers[0].removedFiles).toBe(undefined); + expect(events).toMatchInlineSnapshot(` + Array [ + "b run", + "b done", + "c run", + "c done", + "a run", + "a done", + ] + `); + events.length = 0; + // wait until watching begins + setTimeout(() => { + watchCallbacksUndelayed[0](); + watchCallbacks[0](null, new Map(), new Map(), new Set(), new Set()); + }, 100); + break; + case 1: + expect(info()).toMatchInlineSnapshot(` + "a: + a compiled successfully + + b: + b compiled successfully" + `); + expect(compiler.compilers[1].modifiedFiles).toEqual(new Set()); + expect(compiler.compilers[1].removedFiles).toEqual(new Set()); + expect(events).toMatchInlineSnapshot(` + Array [ + "b invalid", + "b run", + "b done", + "a invalid", + "a run", + "a done", + ] + `); + watchCallbacksUndelayed[2](); + watchCallbacks[2](null, new Map(), new Map(), new Set(), new Set()); + break; + case 2: + expect(info()).toMatchInlineSnapshot(` + "a: + a compiled successfully" + `); + expect(events).toMatchInlineSnapshot(` + Array [ + "b invalid", + "b run", + "b done", + "a invalid", + "a run", + "a done", + "a invalid", + "a run", + "a done", + ] + `); + events.length = 0; + watchCallbacksUndelayed[0](); + watchCallbacksUndelayed[1](); + watchCallbacks[0](null, new Map(), new Map(), new Set(), new Set()); + watchCallbacks[1](null, new Map(), new Map(), new Set(), new Set()); + break; + case 3: + expect(info()).toMatchInlineSnapshot(` + "a: + a compiled successfully + + b: + b compiled successfully + + c: + c compiled successfully" + `); + expect(events).toMatchInlineSnapshot(` + Array [ + "b invalid", + "c invalid", + "b run", + "b done", + "c run", + "c done", + "a invalid", + "a run", + "a done", + ] + `); + events.length = 0; + compiler.close(done); + break; + default: + done(new Error("unexpected")); + } + }); + }); + + it("should respect parallelism when using invalidate", done => { + const configs = [ + { + name: "a", + mode: "development", + entry: { a: "./a.js" }, + context: path.join(__dirname, "fixtures") + }, + { + name: "b", + mode: "development", + entry: { b: "./b.js" }, + context: path.join(__dirname, "fixtures") + } + ]; + configs.parallelism = 1; + const compiler = webpack(configs); + + const events = []; + for (const c of compiler.compilers) { + c.hooks.invalid.tap("test", () => { + events.push(`${c.name} invalid`); + }); + c.hooks.watchRun.tap("test", () => { + events.push(`${c.name} run`); + }); + c.hooks.done.tap("test", () => { + events.push(`${c.name} done`); + }); + } + + compiler.watchFileSystem = { watch() {} }; + compiler.outputFileSystem = createFsFromVolume(new Volume()); + + let state = 0; + const watching = compiler.watch({}, error => { + if (error) { + done(error); + return; + } + if (state !== 0) return; + state++; + + expect(events).toMatchInlineSnapshot(` + Array [ + "a run", + "a done", + "b run", + "b done", + ] + `); + events.length = 0; + + watching.invalidate(err => { + try { + if (err) return done(err); + + expect(events).toMatchInlineSnapshot(` + Array [ + "a invalid", + "b invalid", + "a run", + "a done", + "b run", + "b done", + ] + `); + events.length = 0; + expect(state).toBe(1); + setTimeout(() => { + compiler.close(done); + }, 1000); + } catch (err) { + console.error(err); + done(err); + } + }); + }); + }, 2000); + + it("should respect dependencies when using invalidate", done => { + const compiler = webpack([ + { + name: "a", + mode: "development", + entry: { a: "./a.js" }, + context: path.join(__dirname, "fixtures"), + dependencies: ["b"] + }, + { + name: "b", + mode: "development", + entry: { b: "./b.js" }, + context: path.join(__dirname, "fixtures") + } + ]); + + const events = []; + for (const c of compiler.compilers) { + c.hooks.invalid.tap("test", () => { + events.push(`${c.name} invalid`); + }); + c.hooks.watchRun.tap("test", () => { + events.push(`${c.name} run`); + }); + c.hooks.done.tap("test", () => { + events.push(`${c.name} done`); + }); + } + + compiler.watchFileSystem = { watch() {} }; + compiler.outputFileSystem = createFsFromVolume(new Volume()); + + let state = 0; + const watching = compiler.watch({}, error => { + if (error) { + done(error); + return; + } + if (state !== 0) return; + state++; + + expect(events).toMatchInlineSnapshot(` + Array [ + "b run", + "b done", + "a run", + "a done", + ] + `); + events.length = 0; + + watching.invalidate(err => { + try { + if (err) return done(err); + + expect(events).toMatchInlineSnapshot(` + Array [ + "a invalid", + "b invalid", + "b run", + "b done", + "a run", + "a done", + ] + `); + events.length = 0; + expect(state).toBe(1); + setTimeout(() => { + compiler.close(done); + }, 1000); + } catch (err) { + console.error(err); + done(err); + } + }); + }); + }, 2000); + + it("shouldn't hang when invalidating watchers", done => { + const entriesA = { a: "./a.js" }; + const entriesB = { b: "./b.js" }; + const compiler = webpack([ + { + name: "a", + mode: "development", + entry: () => entriesA, + context: path.join(__dirname, "fixtures") + }, + { + name: "b", + mode: "development", + entry: () => entriesB, + context: path.join(__dirname, "fixtures") + } + ]); + + compiler.watchFileSystem = { watch() {} }; + compiler.outputFileSystem = createFsFromVolume(new Volume()); + + const watching = compiler.watch({}, error => { + if (error) { + done(error); + return; + } + + entriesA.b = "./b.js"; + entriesB.a = "./a.js"; + + watching.invalidate(err => { if (err) return done(err); - watcher.close(done); + compiler.close(done); }); }); + }, 2000); + + it("shouldn't hang when invalidating during build", done => { + const compiler = webpack( + Object.assign([ + { + name: "a", + mode: "development", + context: path.join(__dirname, "fixtures"), + entry: "./a.js" + }, + { + name: "b", + mode: "development", + context: path.join(__dirname, "fixtures"), + entry: "./b.js", + dependencies: ["a"] + } + ]) + ); + compiler.outputFileSystem = createFsFromVolume(new Volume()); + const watchCallbacks = []; + const watchCallbacksUndelayed = []; + let firstRun = true; + compiler.watchFileSystem = { + watch( + files, + directories, + missing, + startTime, + options, + callback, + callbackUndelayed + ) { + watchCallbacks.push(callback); + watchCallbacksUndelayed.push(callbackUndelayed); + if (firstRun && files.has(path.join(__dirname, "fixtures", "a.js"))) { + process.nextTick(() => { + callback(null, new Map(), new Map(), new Set(), new Set()); + }); + firstRun = false; + } + } + }; + compiler.watch({}, (err, stats) => { + if (err) return done(err); + compiler.close(done); + }); }); }); diff --git a/test/MultiItemCache.unittest.js b/test/MultiItemCache.unittest.js new file mode 100644 index 00000000000..f78989ddd33 --- /dev/null +++ b/test/MultiItemCache.unittest.js @@ -0,0 +1,66 @@ +"use strict"; + +const Cache = require("../lib/Cache"); +const { ItemCacheFacade, MultiItemCache } = require("../lib/CacheFacade"); + +describe("MultiItemCache", () => { + it("Throws when getting items from an empty Cache", () => { + const multiItemCache = new MultiItemCache(generateItemCaches(0)); + expect(() => multiItemCache.get(_ => _())).toThrow(); + }); + + it("Returns the single ItemCacheFacade when passed an array of length 1", () => { + const itemCaches = generateItemCaches(1); + const multiItemCache = new MultiItemCache(itemCaches); + expect(multiItemCache).toBe(itemCaches[0]); + }); + + it("Retrieves items from the underlying Cache when get is called", () => { + const itemCaches = generateItemCaches(10); + const multiItemCache = new MultiItemCache(itemCaches); + const callback = (err, res) => { + expect(err).toBeNull(); + expect(res).toBeInstanceOf(Object); + }; + for (let i = 0; i < 10; ++i) { + multiItemCache.get(callback); + } + }); + + it("Can get() a large number of items without exhausting the stack", () => { + const itemCaches = generateItemCaches(10000, () => undefined); + const multiItemCache = new MultiItemCache(itemCaches); + let callbacks = 0; + const callback = (err, res) => { + expect(err).toBeNull(); + expect(res).toBeUndefined(); + ++callbacks; + }; + multiItemCache.get(callback); + expect(callbacks).toEqual(1); + }); + + /** + * @param {number} howMany how many generation + * @param {() => EXPECTED_ANY=} dataGenerator data generator fn + * @returns {EXPECTED_ANY[]} cache facades + */ + function generateItemCaches(howMany, dataGenerator) { + const ret = []; + for (let i = 0; i < howMany; ++i) { + const name = `ItemCache${i}`; + const tag = `ItemTag${i}`; + const dataGen = dataGenerator || (() => ({ name: tag })); + const cache = new Cache(); + cache.hooks.get.tapAsync( + "DataReturner", + (_identifier, _etag, _gotHandlers, callback) => { + callback(undefined, dataGen()); + } + ); + const itemCache = new ItemCacheFacade(cache, name, tag); + ret[i] = itemCache; + } + return ret; + } +}); diff --git a/test/MultiStats.test.js b/test/MultiStats.test.js new file mode 100644 index 00000000000..df12659778d --- /dev/null +++ b/test/MultiStats.test.js @@ -0,0 +1,35 @@ +"use strict"; + +require("./helpers/warmup-webpack"); + +const { createFsFromVolume, Volume } = require("memfs"); + +describe("MultiStats", () => { + it("should create JSON of children stats", done => { + const webpack = require(".."); + const compiler = webpack([ + { + context: __dirname, + entry: "./fixtures/a" + }, + { + context: __dirname, + entry: "./fixtures/b" + } + ]); + compiler.outputFileSystem = createFsFromVolume(new Volume()); + compiler.run((err, stats) => { + if (err) return done(err); + try { + const statsObject = stats.toJson(); + expect(statsObject).toEqual( + expect.objectContaining({ children: expect.any(Array) }) + ); + expect(statsObject.children).toHaveLength(2); + done(); + } catch (err) { + done(err); + } + }); + }); +}); diff --git a/test/MultiStats.unittest.js b/test/MultiStats.unittest.js deleted file mode 100644 index 6137dc3c6c5..00000000000 --- a/test/MultiStats.unittest.js +++ /dev/null @@ -1,265 +0,0 @@ -"use strict"; - -const packageJSON = require("../package.json"); -const MultiStats = require("../lib/MultiStats"); - -const createStat = overrides => { - return Object.assign( - { - hash: "foo", - compilation: { - name: "bar" - }, - hasErrors: () => false, - hasWarnings: () => false, - toJson: () => - Object.assign( - { - hash: "foo", - version: "version", - warnings: [], - errors: [] - }, - overrides - ) - }, - overrides - ); -}; - -describe("MultiStats", () => { - let packageVersion, stats, myMultiStats, result; - - beforeEach(() => { - packageVersion = packageJSON.version; - packageJSON.version = "1.2.3"; - }); - - afterEach(() => { - packageJSON.version = packageVersion; - }); - - describe("created", () => { - beforeEach(() => { - stats = [ - createStat({ - hash: "abc123" - }), - createStat({ - hash: "xyz890" - }) - ]; - myMultiStats = new MultiStats(stats); - }); - - it("creates a hash string", () => { - expect(myMultiStats.hash).toBe("abc123xyz890"); - }); - }); - - describe("hasErrors", () => { - describe("when both have errors", () => { - beforeEach(() => { - stats = [ - createStat({ - hasErrors: () => true - }), - createStat({ - hasErrors: () => true - }) - ]; - myMultiStats = new MultiStats(stats); - }); - - it("returns true", () => { - expect(myMultiStats.hasErrors()).toBe(true); - }); - }); - - describe("when one has an error", () => { - beforeEach(() => { - stats = [ - createStat({ - hasErrors: () => true - }), - createStat() - ]; - myMultiStats = new MultiStats(stats); - }); - - it("returns true", () => { - expect(myMultiStats.hasErrors()).toBe(true); - }); - }); - - describe("when none have errors", () => { - beforeEach(() => { - stats = [createStat(), createStat()]; - myMultiStats = new MultiStats(stats); - }); - - it("returns false", () => { - expect(myMultiStats.hasErrors()).toBe(false); - }); - }); - }); - - describe("hasWarnings", () => { - describe("when both have warnings", () => { - beforeEach(() => { - stats = [ - createStat({ - hasWarnings: () => true - }), - createStat({ - hasWarnings: () => true - }) - ]; - myMultiStats = new MultiStats(stats); - }); - - it("returns true", () => { - expect(myMultiStats.hasWarnings()).toBe(true); - }); - }); - - describe("when one has a warning", () => { - beforeEach(() => { - stats = [ - createStat({ - hasWarnings: () => true - }), - createStat() - ]; - myMultiStats = new MultiStats(stats); - }); - - it("returns true", () => { - expect(myMultiStats.hasWarnings()).toBe(true); - }); - }); - - describe("when none have warnings", () => { - beforeEach(() => { - stats = [createStat(), createStat()]; - myMultiStats = new MultiStats(stats); - }); - - it("returns false", () => { - expect(myMultiStats.hasWarnings()).toBe(false); - }); - }); - }); - - describe("toJson", () => { - beforeEach(() => { - stats = [ - createStat({ - hash: "abc123", - compilation: { - name: "abc123-compilation" - }, - toJson: () => ({ - warnings: ["abc123-warning"], - errors: ["abc123-error"] - }) - }), - createStat({ - hash: "xyz890", - compilation: { - name: "xyz890-compilation" - }, - toJson: () => ({ - warnings: ["xyz890-warning-1", "xyz890-warning-2"], - errors: [] - }) - }) - ]; - }); - - it("returns plain object representation", () => { - myMultiStats = new MultiStats(stats); - result = myMultiStats.toJson({ - version: false, - hash: false - }); - expect(result).toEqual({ - errors: ["(abc123-compilation) abc123-error"], - warnings: [ - "(abc123-compilation) abc123-warning", - "(xyz890-compilation) xyz890-warning-1", - "(xyz890-compilation) xyz890-warning-2" - ], - children: [ - { - errors: ["abc123-error"], - name: "abc123-compilation", - warnings: ["abc123-warning"] - }, - { - errors: [], - name: "xyz890-compilation", - warnings: ["xyz890-warning-1", "xyz890-warning-2"] - } - ] - }); - }); - - it("returns plain object representation with json set to true", () => { - myMultiStats = new MultiStats(stats); - result = myMultiStats.toJson(true); - expect(result).toEqual({ - errors: ["(abc123-compilation) abc123-error"], - warnings: [ - "(abc123-compilation) abc123-warning", - "(xyz890-compilation) xyz890-warning-1", - "(xyz890-compilation) xyz890-warning-2" - ], - children: [ - { - warnings: ["abc123-warning"], - errors: ["abc123-error"], - name: "abc123-compilation" - }, - { - warnings: ["xyz890-warning-1", "xyz890-warning-2"], - errors: [], - name: "xyz890-compilation" - } - ] - }); - }); - }); - - describe("toString", () => { - beforeEach(() => { - stats = [ - createStat({ - hash: "abc123", - compilation: { - name: "abc123-compilation" - } - }), - createStat({ - hash: "xyz890", - compilation: { - name: "xyz890-compilation" - } - }) - ]; - myMultiStats = new MultiStats(stats); - result = myMultiStats.toString(); - }); - - it("returns string representation", () => { - expect(result).toEqual( - "Hash: abc123xyz890\n" + - "Version: webpack 1.2.3\n" + - "Child abc123-compilation:\n" + - " Hash: abc123\n" + - "Child xyz890-compilation:\n" + - " Hash: xyz890" - ); - }); - }); -}); diff --git a/test/MultiWatching.unittest.js b/test/MultiWatching.unittest.js index 0977f3cfad6..051b2a9fa7f 100644 --- a/test/MultiWatching.unittest.js +++ b/test/MultiWatching.unittest.js @@ -1,15 +1,14 @@ "use strict"; -const Tapable = require("tapable").Tapable; const SyncHook = require("tapable").SyncHook; const MultiWatching = require("../lib/MultiWatching"); -const createWatching = () => { - return { - invalidate: jest.fn(), - close: jest.fn() - }; -}; +const createWatching = () => ({ + invalidate: jest.fn(), + suspend: jest.fn(), + resume: jest.fn(), + close: jest.fn() +}); const createCompiler = () => { const compiler = { @@ -17,7 +16,6 @@ const createCompiler = () => { watchClose: new SyncHook([]) } }; - Tapable.addCompatLayer(compiler); return compiler; }; @@ -43,6 +41,20 @@ describe("MultiWatching", () => { }); }); + describe("suspend", () => { + it("suspends each watching", () => { + myMultiWatching.suspend(); + expect(watchings[0].suspend.mock.calls.length).toBe(1); + expect(watchings[1].suspend.mock.calls.length).toBe(1); + }); + + it("resume each watching", () => { + myMultiWatching.resume(); + expect(watchings[0].resume.mock.calls.length).toBe(1); + expect(watchings[1].resume.mock.calls.length).toBe(1); + }); + }); + describe("close", () => { let callback; const callClosedFinishedCallback = watching => { diff --git a/test/NodeTemplatePlugin.test.js b/test/NodeTemplatePlugin.test.js index 0a0c0223e17..9e705b46b74 100644 --- a/test/NodeTemplatePlugin.test.js +++ b/test/NodeTemplatePlugin.test.js @@ -1,12 +1,14 @@ -/* global describe, it */ "use strict"; +require("./helpers/warmup-webpack"); + const path = require("path"); -const webpack = require("../lib/webpack"); +// cspell:word nodetest describe("NodeTemplatePlugin", () => { jest.setTimeout(20000); it("should compile and run a simple module", done => { + const webpack = require(".."); webpack( { mode: "production", @@ -15,7 +17,7 @@ describe("NodeTemplatePlugin", () => { output: { path: path.join(__dirname, "js", "NodeTemplatePlugin"), filename: "result.js", - chunkFilename: "[hash].result.[id].js", + chunkFilename: "[fullhash].result.[id].js", library: "abc", libraryTarget: "commonjs" }, @@ -25,7 +27,6 @@ describe("NodeTemplatePlugin", () => { if (err) return err; expect(stats.hasErrors()).toBe(false); expect(stats.hasWarnings()).toBe(false); - // eslint-disable-next-line node/no-missing-require const result = require("./js/NodeTemplatePlugin/result").abc; expect(result.nextTick).toBe(process.nextTick); expect(result.fs).toBe(require("fs")); @@ -43,6 +44,7 @@ describe("NodeTemplatePlugin", () => { }); it("should compile and run a simple module in single mode", done => { + const webpack = require(".."); webpack( { mode: "production", @@ -51,7 +53,7 @@ describe("NodeTemplatePlugin", () => { output: { path: path.join(__dirname, "js", "NodeTemplatePluginSingle"), filename: "result2.js", - chunkFilename: "[hash].result2.[id].js", + chunkFilename: "[fullhash].result2.[id].js", library: "def", libraryTarget: "umd", auxiliaryComment: "test" @@ -66,7 +68,6 @@ describe("NodeTemplatePlugin", () => { (err, stats) => { if (err) return err; expect(stats.hasErrors()).toBe(false); - // eslint-disable-next-line node/no-missing-require const result = require("./js/NodeTemplatePluginSingle/result2"); expect(result.nextTick).toBe(process.nextTick); expect(result.fs).toBe(require("fs")); diff --git a/test/NormalModule.unittest.js b/test/NormalModule.unittest.js index 329001bc23b..14ae35f46a9 100644 --- a/test/NormalModule.unittest.js +++ b/test/NormalModule.unittest.js @@ -1,8 +1,6 @@ -/* globals describe, it, beforeEach, afterEach */ "use strict"; const NormalModule = require("../lib/NormalModule"); -const NullDependency = require("../lib/dependencies/NullDependency"); const SourceMapSource = require("webpack-sources").SourceMapSource; const OriginalSource = require("webpack-sources").OriginalSource; const RawSource = require("webpack-sources").RawSource; @@ -38,6 +36,7 @@ describe("NormalModule", () => { normalModule.buildInfo = { cacheable: true }; + normalModule.useSimpleSourceMap = true; }); describe("#identifier", () => { it("returns an identifier for this module", () => { @@ -45,9 +44,7 @@ describe("NormalModule", () => { }); it("returns an identifier from toString", () => { normalModule.debugId = 1000; - expect(normalModule.toString()).toBe("Module[1000]"); - normalModule.id = 1; - expect(normalModule.toString()).toBe("Module[1]"); + expect(normalModule.toString()).toBe("Module[1000: /some/request]"); }); }); @@ -94,6 +91,7 @@ describe("NormalModule", () => { }); describe("given a userRequest containing query parameters", () => { it("ignores paths in query parameters", () => { + // cspell:word testpath userRequest = "F:\\some\\context\\loader?query=foo\\bar&otherPath=testpath/other"; normalModule = new NormalModule({ @@ -121,7 +119,7 @@ describe("NormalModule", () => { describe("given a resource containing a ?-sign", () => { const baseResource = "some/resource"; beforeEach(() => { - resource = baseResource + "?some=query"; + resource = `${baseResource}?some=query`; normalModule = new NormalModule({ type: "javascript/auto", request, @@ -149,118 +147,59 @@ describe("NormalModule", () => { }); describe("given no sourcemap", () => { it("returns a RawSource", () => { - expect(normalModule.createSourceForAsset(name, content)).toBeInstanceOf( - RawSource - ); + expect( + normalModule.createSourceForAsset("/", name, content) + ).toBeInstanceOf(RawSource); }); }); describe("given a string as the sourcemap", () => { it("returns a OriginalSource", () => { expect( - normalModule.createSourceForAsset(name, content, sourceMap) + normalModule.createSourceForAsset("/", name, content, sourceMap) ).toBeInstanceOf(OriginalSource); }); }); - describe("given a some other kind of sourcemap", () => { + describe("given a some other kind of sourcemap (source maps disabled)", () => { beforeEach(() => { sourceMap = () => {}; + normalModule.useSimpleSourceMap = false; }); it("returns a SourceMapSource", () => { expect( - normalModule.createSourceForAsset(name, content, sourceMap) - ).toBeInstanceOf(SourceMapSource); - }); - }); - }); - - describe("#originalSource", () => { - let expectedSource = "some source"; - beforeEach(() => { - normalModule._source = new RawSource(expectedSource); - }); - it("returns an original Source", () => { - expect(normalModule.originalSource()).toBe(normalModule._source); - }); - }); - - describe("#hasDependencies", () => { - it("returns true if has dependencies", () => { - normalModule.addDependency(new NullDependency()); - expect(normalModule.hasDependencies()).toBe(true); - }); - it("returns false if has dependencies", () => { - expect(normalModule.hasDependencies()).toBe(false); - }); - }); - describe("#needRebuild", () => { - let fileTimestamps; - let contextTimestamps; - let fileDependencies; - let contextDependencies; - let fileA; - let fileB; - - function setDeps(fileDependencies, contextDependencies) { - normalModule.buildInfo.fileDependencies = fileDependencies; - normalModule.buildInfo.contextDependencies = contextDependencies; - } - - beforeEach(() => { - fileA = "fileA"; - fileB = "fileB"; - fileDependencies = [fileA, fileB]; - contextDependencies = [fileA, fileB]; - fileTimestamps = new Map([[fileA, 1], [fileB, 1]]); - contextTimestamps = new Map([[fileA, 1], [fileB, 1]]); - normalModule.buildTimestamp = 2; - setDeps(fileDependencies, contextDependencies); - }); - describe("given all timestamps are older than the buildTimestamp", () => { - it("returns false", () => { - expect( - normalModule.needRebuild(fileTimestamps, contextTimestamps) - ).toBe(false); + normalModule.createSourceForAsset("/", name, content, sourceMap) + ).toBeInstanceOf(RawSource); }); }); - describe("given a file timestamp is newer than the buildTimestamp", () => { + describe("given a some other kind of sourcemap (simple source maps enabled)", () => { beforeEach(() => { - fileTimestamps.set(fileA, 3); + sourceMap = () => {}; }); - it("returns true", () => { + it("returns a SourceMapSource", () => { expect( - normalModule.needRebuild(fileTimestamps, contextTimestamps) - ).toBe(true); + normalModule.createSourceForAsset("/", name, content, sourceMap) + ).toBeInstanceOf(RawSource); }); }); - describe("given a no file timestamp exists", () => { + describe("given a some other kind of sourcemap (source maps enabled)", () => { beforeEach(() => { - fileTimestamps = new Map(); + sourceMap = () => {}; + normalModule.useSourceMap = true; }); - it("returns true", () => { + it("returns a SourceMapSource", () => { expect( - normalModule.needRebuild(fileTimestamps, contextTimestamps) - ).toBe(true); + normalModule.createSourceForAsset("/", name, content, sourceMap) + ).toBeInstanceOf(SourceMapSource); }); }); - describe("given a context timestamp is newer than the buildTimestamp", () => { - beforeEach(() => { - contextTimestamps.set(fileA, 3); - }); - it("returns true", () => { - expect( - normalModule.needRebuild(fileTimestamps, contextTimestamps) - ).toBe(true); - }); + }); + + describe("#originalSource", () => { + const expectedSource = "some source"; + beforeEach(() => { + normalModule._source = new RawSource(expectedSource); }); - describe("given a no context timestamp exists", () => { - beforeEach(() => { - contextTimestamps = new Map(); - }); - it("returns true", () => { - expect( - normalModule.needRebuild(fileTimestamps, contextTimestamps) - ).toBe(true); - }); + it("returns an original Source", () => { + expect(normalModule.originalSource()).toBe(normalModule._source); }); }); @@ -273,7 +212,7 @@ describe("NormalModule", () => { }); describe("and the content starting with the string specified in rule", () => { beforeEach(() => { - content = rule + "some-content"; + content = `${rule}some-content`; }); it("returns true", () => { expect(normalModule.shouldPreventParsing(rule, content)).toBe(true); @@ -294,7 +233,7 @@ describe("NormalModule", () => { }); describe("and the content matches the rule", () => { beforeEach(() => { - content = rule + "some-content"; + content = `${rule}some-content`; }); it("returns true", () => { expect(normalModule.shouldPreventParsing(rule, content)).toBe(true); @@ -346,7 +285,7 @@ describe("NormalModule", () => { }); }); describe("that is an array", () => { - describe("of strings and or regexs", () => { + describe("of strings and or regexps", () => { let someRules; beforeEach(() => { someRules = ["some rule", /some rule1/, "some rule2"]; diff --git a/test/Parser.unittest.js b/test/Parser.unittest.js deleted file mode 100644 index 3d3fdeeca8a..00000000000 --- a/test/Parser.unittest.js +++ /dev/null @@ -1,636 +0,0 @@ -"use strict"; - -const Parser = require("../lib/Parser"); -const BasicEvaluatedExpression = require("../lib/BasicEvaluatedExpression"); - -describe("Parser", () => { - /* eslint-disable no-undef */ - /* eslint-disable no-unused-vars */ - /* eslint-disable no-inner-declarations */ - const testCases = { - "call ident": [ - function() { - abc("test"); - }, - { - abc: ["test"] - } - ], - "call member": [ - function() { - cde.abc("membertest"); - }, - { - cdeabc: ["membertest"] - } - ], - "call member using bracket notation": [ - function() { - cde["abc"]("membertest"); - }, - { - cdeabc: ["membertest"] - } - ], - "call inner member": [ - function() { - cde.ddd.abc("inner"); - }, - { - cdedddabc: ["inner"] - } - ], - "call inner member using bracket notation": [ - function() { - cde.ddd["abc"]("inner"); - }, - { - cdedddabc: ["inner"] - } - ], - expression: [ - function() { - fgh; - }, - { - fgh: [""] - } - ], - "expression sub": [ - function() { - fgh.sub; - }, - { - fghsub: ["notry"] - } - ], - "member expression": [ - function() { - test[memberExpr]; - test[+memberExpr]; - }, - { - expressions: ["memberExpr", "memberExpr"] - } - ], - "in function definition": [ - function() { - (function(abc, cde, fgh) { - abc("test"); - cde.abc("test"); - cde.ddd.abc("test"); - fgh; - fgh.sub; - })(); - }, - {} - ], - "const definition": [ - function() { - let abc, cde, fgh; - abc("test"); - cde.abc("test"); - cde.ddd.abc("test"); - fgh; - fgh.sub; - }, - {} - ], - "var definition": [ - function() { - var abc, cde, fgh; - abc("test"); - cde.abc("test"); - cde.ddd.abc("test"); - fgh; - fgh.sub; - }, - {} - ], - "function definition": [ - function() { - function abc() {} - - function cde() {} - - function fgh() {} - abc("test"); - cde.abc("test"); - cde.ddd.abc("test"); - fgh; - fgh.sub; - }, - {} - ], - "class definition": [ - function() { - class memberExpr { - cde() { - abc("cde"); - } - static fgh() { - abc("fgh"); - fgh(); - } - } - }, - { - abc: ["cde", "fgh"], - fgh: ["memberExpr"] - } - ], - "in try": [ - function() { - try { - fgh.sub; - fgh; - - function test(ttt) { - fgh.sub; - fgh; - } - } catch (e) { - fgh.sub; - fgh; - } - }, - { - fghsub: ["try", "notry", "notry"], - fgh: ["test", "test ttt", "test e"] - } - ], - "renaming with const": [ - function() { - const xyz = abc; - xyz("test"); - }, - { - abc: ["test"] - } - ], - "renaming with var": [ - function() { - var xyz = abc; - xyz("test"); - }, - { - abc: ["test"] - } - ], - "renaming with assignment": [ - function() { - const xyz = abc; - xyz("test"); - }, - { - abc: ["test"] - } - ], - "renaming with IIFE": [ - function() { - !(function(xyz) { - xyz("test"); - })(abc); - }, - { - abc: ["test"] - } - ], - "renaming arguments with IIFE (called)": [ - function() { - !function(xyz) { - xyz("test"); - }.call(fgh, abc); - }, - { - abc: ["test"], - fgh: [""] - } - ], - "renaming this's properties with IIFE (called)": [ - function() { - !function() { - this.sub; - }.call(ijk); - }, - { - ijksub: ["test"] - } - ], - "renaming this's properties with nested IIFE (called)": [ - function() { - !function() { - !function() { - this.sub; - }.call(this); - }.call(ijk); - }, - { - ijksub: ["test"] - } - ], - "new Foo(...)": [ - function() { - new xyz("membertest"); - }, - { - xyz: ["membertest"] - } - ], - "spread calls/literals": [ - function() { - var xyz = [...abc("xyz"), cde]; - Math.max(...fgh); - }, - { - abc: ["xyz"], - fgh: ["xyz"] - } - ] - }; - /* eslint-enable no-undef */ - /* eslint-enable no-unused-vars */ - /* eslint-enable no-inner-declarations */ - - Object.keys(testCases).forEach(name => { - it("should parse " + name, () => { - let source = testCases[name][0].toString(); - source = source.substr(13, source.length - 14).trim(); - const state = testCases[name][1]; - - const testParser = new Parser({}); - testParser.hooks.canRename.tap("abc", "ParserTest", expr => true); - testParser.hooks.canRename.tap("ijk", "ParserTest", expr => true); - testParser.hooks.call.tap("abc", "ParserTest", expr => { - if (!testParser.state.abc) testParser.state.abc = []; - testParser.state.abc.push(testParser.parseString(expr.arguments[0])); - return true; - }); - testParser.hooks.call.tap("cde.abc", "ParserTest", expr => { - if (!testParser.state.cdeabc) testParser.state.cdeabc = []; - testParser.state.cdeabc.push(testParser.parseString(expr.arguments[0])); - return true; - }); - testParser.hooks.call.tap("cde.ddd.abc", "ParserTest", expr => { - if (!testParser.state.cdedddabc) testParser.state.cdedddabc = []; - testParser.state.cdedddabc.push( - testParser.parseString(expr.arguments[0]) - ); - return true; - }); - testParser.hooks.expression.tap("fgh", "ParserTest", expr => { - if (!testParser.state.fgh) testParser.state.fgh = []; - testParser.state.fgh.push( - Array.from(testParser.scope.definitions.asSet()).join(" ") - ); - return true; - }); - testParser.hooks.expression.tap("fgh.sub", "ParserTest", expr => { - if (!testParser.state.fghsub) testParser.state.fghsub = []; - testParser.state.fghsub.push(testParser.scope.inTry ? "try" : "notry"); - return true; - }); - testParser.hooks.expression.tap("ijk.sub", "ParserTest", expr => { - if (!testParser.state.ijksub) testParser.state.ijksub = []; - testParser.state.ijksub.push("test"); - return true; - }); - testParser.hooks.expression.tap("memberExpr", "ParserTest", expr => { - if (!testParser.state.expressions) testParser.state.expressions = []; - testParser.state.expressions.push(expr.name); - return true; - }); - testParser.hooks.new.tap("xyz", "ParserTest", expr => { - if (!testParser.state.xyz) testParser.state.xyz = []; - testParser.state.xyz.push(testParser.parseString(expr.arguments[0])); - return true; - }); - const actual = testParser.parse(source); - expect(typeof actual).toBe("object"); - expect(actual).toEqual(state); - }); - }); - - it("should parse comments", () => { - const source = "//comment1\n/*comment2*/"; - const state = [ - { - type: "Line", - value: "comment1" - }, - { - type: "Block", - value: "comment2" - } - ]; - - const testParser = new Parser({}); - - testParser.hooks.program.tap("ParserTest", (ast, comments) => { - if (!testParser.state.comments) testParser.state.comments = comments; - return true; - }); - - const actual = testParser.parse(source); - expect(typeof actual).toBe("object"); - expect(typeof actual.comments).toBe("object"); - actual.comments.forEach((element, index) => { - expect(typeof element.type).toBe("string"); - expect(typeof element.value).toBe("string"); - expect(element.type).toBe(state[index].type); - expect(element.value).toBe(state[index].value); - }); - }); - - describe("expression evaluation", () => { - function evaluateInParser(source) { - const parser = new Parser(); - parser.hooks.call.tap("test", "ParserTest", expr => { - parser.state.result = parser.evaluateExpression(expr.arguments[0]); - }); - parser.hooks.evaluateIdentifier.tap("aString", "ParserTest", expr => - new BasicEvaluatedExpression().setString("aString").setRange(expr.range) - ); - parser.hooks.evaluateIdentifier.tap("b.Number", "ParserTest", expr => - new BasicEvaluatedExpression().setNumber(123).setRange(expr.range) - ); - return parser.parse("test(" + source + ");").result; - } - - const testCases = { - '"strrring"': "string=strrring", - '"strr" + "ring"': "string=strrring", - '"s" + ("trr" + "rin") + "g"': "string=strrring", - "'S' + (\"strr\" + \"ring\") + 'y'": "string=Sstrrringy", - "/abc/": "regExp=/abc/", - "1": "number=1", - "1 + 3": "number=4", - "3 - 1": "number=2", - "2 * 3": "number=6", - "8 / 2": "number=4", - "2 ** 3": "number=8", - "12 & 5": "number=4", - "12 | 5": "number=13", - "12 ^ 5": "number=9", - "9 >>> 2": "number=2", - "9 >> 2": "number=2", - "9 << 2": "number=36", - "~3": "number=-4", - "1 == 1": "bool=true", - "1 === 1": "bool=true", - "3 != 1": "bool=true", - "3 !== 1": "bool=true", - "3 == 1": "bool=false", - "3 === 1": "bool=false", - "1 != 1": "bool=false", - "1 !== 1": "bool=false", - "true === false": "bool=false", - "false !== false": "bool=false", - "true == true": "bool=true", - "false != true": "bool=true", - "!'a'": "bool=false", - "!''": "bool=true", - "'pre' + a": "wrapped=['pre' string=pre]+[null]", - "a + 'post'": "wrapped=[null]+['post' string=post]", - "'pre' + a + 'post'": "wrapped=['pre' string=pre]+['post' string=post]", - "1 + a + 2": "", - "1 + a + 'post'": "wrapped=[null]+['post' string=post]", - "'' + 1 + a + 2": "wrapped=['' + 1 string=1]+[2 string=2]", - "'' + 1 + a + 2 + 3": "wrapped=['' + 1 string=1]+[2 + 3 string=23]", - "'' + 1 + a + (2 + 3)": "wrapped=['' + 1 string=1]+[2 + 3 string=5]", - "'pre' + (1 + a) + (2 + 3)": - "wrapped=['pre' string=pre]+[2 + 3 string=5]", - "a ? 'o1' : 'o2'": "options=['o1' string=o1],['o2' string=o2]", - "a ? 'o1' : b ? 'o2' : 'o3'": - "options=['o1' string=o1],['o2' string=o2],['o3' string=o3]", - "a ? (b ? 'o1' : 'o2') : 'o3'": - "options=['o1' string=o1],['o2' string=o2],['o3' string=o3]", - "a ? (b ? 'o1' : 'o2') : c ? 'o3' : 'o4'": - "options=['o1' string=o1],['o2' string=o2],['o3' string=o3],['o4' string=o4]", - "a ? 'o1' : b ? 'o2' : c ? 'o3' : 'o4'": - "options=['o1' string=o1],['o2' string=o2],['o3' string=o3],['o4' string=o4]", - "a ? 'o1' : b ? b : c ? 'o3' : c": - "options=['o1' string=o1],[b],['o3' string=o3],[c]", - "['i1', 'i2', 3, a, b ? 4 : 5]": - "items=['i1' string=i1],['i2' string=i2],[3 number=3],[a],[b ? 4 : 5 options=[4 number=4],[5 number=5]]", - "typeof 'str'": "string=string", - "typeof aString": "string=string", - "typeof b.Number": "string=number", - "typeof b['Number']": "string=number", - "typeof b[Number]": "", - "b.Number": "number=123", - "b['Number']": "number=123", - "b[Number]": "", - "'str'.concat()": "string=str", - "'str'.concat('one')": "string=strone", - "'str'.concat('one').concat('two')": "string=stronetwo", - "'str'.concat('one').concat('two', 'three')": "string=stronetwothree", - "'str'.concat('one', 'two')": "string=stronetwo", - "'str'.concat('one', 'two').concat('three')": "string=stronetwothree", - "'str'.concat('one', 'two').concat('three', 'four')": - "string=stronetwothreefour", - "'str'.concat('one', obj)": "wrapped=['str' string=str]+[null]", - "'str'.concat('one', obj).concat()": "wrapped=['str' string=str]+[null]", - "'str'.concat('one', obj, 'two')": - "wrapped=['str' string=str]+['two' string=two]", - "'str'.concat('one', obj, 'two').concat()": - "wrapped=['str' string=str]+['two' string=two]", - "'str'.concat('one', obj, 'two').concat('three')": - "wrapped=['str' string=str]+['three' string=three]", - "'str'.concat(obj)": "wrapped=['str' string=str]+[null]", - "'str'.concat(obj).concat()": "wrapped=['str' string=str]+[null]", - "'str'.concat(obj).concat('one', 'two')": - "wrapped=['str' string=str]+['one', 'two' string=onetwo]", - "'str'.concat(obj).concat(obj, 'one')": - "wrapped=['str' string=str]+['one' string=one]", - "'str'.concat(obj).concat(obj, 'one', 'two')": - "wrapped=['str' string=str]+['one', 'two' string=onetwo]", - "'str'.concat(obj).concat('one', obj, 'one')": - "wrapped=['str' string=str]+['one' string=one]", - "'str'.concat(obj).concat('one', obj, 'two', 'three')": - "wrapped=['str' string=str]+['two', 'three' string=twothree]", - "'str'.concat(obj, 'one')": - "wrapped=['str' string=str]+['one' string=one]", - "'str'.concat(obj, 'one').concat()": - "wrapped=['str' string=str]+['one' string=one]", - "'str'.concat(obj, 'one').concat('two', 'three')": - "wrapped=['str' string=str]+['two', 'three' string=twothree]", - "'str'.concat(obj, 'one').concat(obj, 'two', 'three')": - "wrapped=['str' string=str]+['two', 'three' string=twothree]", - "'str'.concat(obj, 'one').concat('two', obj, 'three')": - "wrapped=['str' string=str]+['three' string=three]", - "'str'.concat(obj, 'one').concat('two', obj, 'three', 'four')": - "wrapped=['str' string=str]+['three', 'four' string=threefour]", - "'str'.concat(obj, 'one', 'two')": - "wrapped=['str' string=str]+['one', 'two' string=onetwo]", - "'str'.concat(obj, 'one', 'two').concat()": - "wrapped=['str' string=str]+['one', 'two' string=onetwo]", - "'str'.concat(obj, 'one', 'two').concat('three', 'four')": - "wrapped=['str' string=str]+['three', 'four' string=threefour]", - "'str'.concat(obj, 'one', 'two').concat(obj, 'three', 'four')": - "wrapped=['str' string=str]+['three', 'four' string=threefour]", - "'str'.concat(obj, 'one', 'two').concat('three', obj, 'four')": - "wrapped=['str' string=str]+['four' string=four]", - "'str'.concat(obj, 'one', 'two').concat('three', obj, 'four', 'five')": - "wrapped=['str' string=str]+['four', 'five' string=fourfive]", - // eslint-disable-next-line no-template-curly-in-string - "`start${obj}mid${obj2}end`": - "template=[start string=start],[mid string=mid],[end string=end]", - // eslint-disable-next-line no-template-curly-in-string - "`start${'str'}mid${obj2}end`": - // eslint-disable-next-line no-template-curly-in-string - "template=[start${'str'}mid string=startstrmid],[end string=end]", - "'abc'.substr(1)": "string=bc", - "'abcdef'.substr(2, 3)": "string=cde", - "'abcdef'.substring(2, 3)": "string=c", - "'abcdef'.substring(2, 3, 4)": "", - "'abc'[\"substr\"](1)": "string=bc", - "'abc'[substr](1)": "", - "'1,2+3'.split(/[,+]/)": "array=[1],[2],[3]", - "'1,2+3'.split(expr)": "", - "'a' + (expr + 'c')": "wrapped=['a' string=a]+['c' string=c]", - "1 + 'a'": "string=1a", - "'a' + 1": "string=a1", - "'a' + expr + 1": "wrapped=['a' string=a]+[1 string=1]" - }; - - Object.keys(testCases).forEach(key => { - function evalExprToString(evalExpr) { - if (!evalExpr) { - return "null"; - } else { - const result = []; - if (evalExpr.isString()) result.push("string=" + evalExpr.string); - if (evalExpr.isNumber()) result.push("number=" + evalExpr.number); - if (evalExpr.isBoolean()) result.push("bool=" + evalExpr.bool); - if (evalExpr.isRegExp()) result.push("regExp=" + evalExpr.regExp); - if (evalExpr.isConditional()) - result.push( - "options=[" + - evalExpr.options.map(evalExprToString).join("],[") + - "]" - ); - if (evalExpr.isArray()) - result.push( - "items=[" + evalExpr.items.map(evalExprToString).join("],[") + "]" - ); - if (evalExpr.isConstArray()) - result.push("array=[" + evalExpr.array.join("],[") + "]"); - if (evalExpr.isTemplateString()) - result.push( - "template=[" + - evalExpr.quasis.map(evalExprToString).join("],[") + - "]" - ); - if (evalExpr.isWrapped()) - result.push( - "wrapped=[" + - evalExprToString(evalExpr.prefix) + - "]+[" + - evalExprToString(evalExpr.postfix) + - "]" - ); - if (evalExpr.range) { - const start = evalExpr.range[0] - 5; - const end = evalExpr.range[1] - 5; - return ( - key.substr(start, end - start) + - (result.length > 0 ? " " + result.join(" ") : "") - ); - } - return result.join(" "); - } - } - - it("should eval " + key, () => { - const evalExpr = evaluateInParser(key); - expect(evalExprToString(evalExpr)).toBe( - testCases[key] ? key + " " + testCases[key] : key - ); - }); - }); - }); - - describe("async/await support", () => { - describe("should accept", () => { - const cases = { - "async function": "async function x() {}", - "async arrow function": "async () => {}", - "await expression": "async function x(y) { await y }", - "await iteration": "async function f() { for await (x of xs); }" - }; - const parser = new Parser(); - Object.keys(cases).forEach(name => { - const expr = cases[name]; - it(name, () => { - const actual = parser.parse(expr); - expect(typeof actual).toBe("object"); - }); - }); - }); - describe("should parse await", () => { - const cases = { - require: [ - "async function x() { await require('y'); }", - { - param: "y" - } - ], - import: [ - "async function x() { const y = await import('z'); }", - { - param: "z" - } - ] - }; - - const parser = new Parser(); - parser.hooks.call.tap("require", "ParserTest", expr => { - const param = parser.evaluateExpression(expr.arguments[0]); - parser.state.param = param.string; - }); - parser.hooks.importCall.tap("ParserTest", expr => { - const param = parser.evaluateExpression(expr.arguments[0]); - parser.state.param = param.string; - }); - - Object.keys(cases).forEach(name => { - it(name, () => { - const actual = parser.parse(cases[name][0]); - expect(actual).toEqual(cases[name][1]); - }); - }); - }); - }); - - describe("object rest/spread support", () => { - describe("should accept", () => { - const cases = { - "object spread": "({...obj})", - "object rest": "({...obj} = foo)" - }; - Object.keys(cases).forEach(name => { - const expr = cases[name]; - it(name, () => { - const actual = Parser.parse(expr); - expect(typeof actual).toBe("object"); - }); - }); - }); - }); - - describe("optional catch binding support", () => { - describe("should accept", () => { - const cases = { - "optional binding": "try {} catch {}" - }; - Object.keys(cases).forEach(name => { - const expr = cases[name]; - it(name, () => { - const actual = Parser.parse(expr); - expect(typeof actual).toBe("object"); - }); - }); - }); - }); -}); diff --git a/test/PersistentCaching.test.js b/test/PersistentCaching.test.js new file mode 100644 index 00000000000..28dd169a71e --- /dev/null +++ b/test/PersistentCaching.test.js @@ -0,0 +1,252 @@ +require("./helpers/warmup-webpack"); + +const path = require("path"); +const util = require("util"); +const fs = require("fs"); +const rimraf = require("rimraf"); +const vm = require("vm"); + +const readdir = util.promisify(fs.readdir); +const writeFile = util.promisify(fs.writeFile); +const utimes = util.promisify(fs.utimes); +const mkdir = util.promisify(fs.mkdir); + +describe("Persistent Caching", () => { + const tempPath = path.resolve(__dirname, "js", "persistent-caching"); + const outputPath = path.resolve(tempPath, "output"); + const cachePath = path.resolve(tempPath, "cache"); + const srcPath = path.resolve(tempPath, "src"); + + const config = { + mode: "none", + context: tempPath, + cache: { + type: "filesystem", + buildDependencies: { + // avoid rechecking build dependencies + // for performance + // this is already covered by another test case + defaultWebpack: [] + }, + cacheLocation: cachePath + }, + experiments: { + css: true + }, + resolve: { + alias: { + "image.png": false, + "image1.png": false + } + }, + target: "node", + output: { + library: { type: "commonjs-module", export: "default" }, + path: outputPath + } + }; + + beforeEach(done => { + rimraf(tempPath, done); + }); + + const updateSrc = async data => { + const ts = new Date(Date.now() - 10000); + await mkdir(srcPath, { recursive: true }); + for (const key of Object.keys(data)) { + const p = path.resolve(srcPath, key); + await writeFile(p, data[key]); + await utimes(p, ts, ts); + } + }; + + const compile = async (configAdditions = {}) => + new Promise((resolve, reject) => { + const webpack = require("../"); + webpack( + { + ...config, + ...configAdditions, + cache: { ...config.cache, ...configAdditions.cache } + }, + (err, stats) => { + if (err) return reject(err); + if (stats.hasErrors()) + return reject(stats.toString({ preset: "errors-only" })); + resolve(stats); + } + ); + }); + + const execute = () => { + const cache = {}; + const require = name => { + if (cache[name]) return cache[name].exports; + if (!name.endsWith(".js")) name += ".js"; + const p = path.resolve(outputPath, name); + const source = fs.readFileSync(p, "utf-8"); + const context = {}; + const fn = vm.runInThisContext( + `(function(require, module, exports) { ${source} })`, + context, + { + filename: p + } + ); + const m = { exports: {} }; + cache[name] = m; + fn(require, m, m.exports); + return m.exports; + }; + return require("./main"); + }; + + it("should compile fine (warmup)", async () => { + const data = { + "index.js": `import file from "./file.js"; +export default 40 + file; +`, + "file.js": "export default 2;" + }; + await updateSrc(data); + await compile(); + expect(execute()).toBe(42); + }, 100000); + + it("should merge multiple small files", async () => { + const files = Array.from({ length: 30 }).map((_, i) => `file${i}.js`); + const data = { + "index.js": ` +import * as style from "./style.modules.css"; + +${files.map((f, i) => `import f${i} from "./${f}";`).join("\n")} + +export default ${files.map((_, i) => `f${i}`).join(" + ")}; +export { style }; +`, + "style.modules.css": `.class { + color: red; + background: url('image.png'); +}` + }; + for (const file of files) { + data[file] = "export default 1;"; + } + await updateSrc(data); + await compile({ cache: { compression: false } }); + expect(execute()).toBe(30); + for (let i = 0; i < 30; i++) { + updateSrc({ + [files[i]]: "export default 2;", + "style.modules.css": `.class-${i} { color: red; background: url('image1.png'); }` + }); + await compile({ cache: { compression: false } }); + expect(execute()).toBe(31 + i); + } + const cacheFiles = await readdir(cachePath); + expect(cacheFiles.length).toBeLessThan(20); + expect(cacheFiles.length).toBeGreaterThan(10); + }, 120000); + + it("should optimize unused content", async () => { + const data = { + "a.js": 'import "react-dom";', + "b.js": 'import "acorn";', + "c.js": 'import "core-js";', + "d.js": 'import "date-fns";', + "e.js": 'import "lodash";' + }; + await updateSrc(data); + const c = items => { + const entry = {}; + for (const item of items.split("")) entry[item] = `./src/${item}.js`; + return compile({ entry, cache: { compression: false } }); + }; + await c("abcde"); + await c("abc"); + await c("cde"); + await c("acd"); + await c("bce"); + await c("abcde"); + const cacheFiles = await readdir(cachePath); + expect(cacheFiles.length).toBeGreaterThan(4); + }, 120000); + + it("should allow persistent caching of container related objects", async () => { + const data = { + "index.js": + "export default import('container/src/exposed').then(m => m.default);", + "exposed.js": "import lib from 'lib'; export default 21 + lib;", + "lib.js": "export default 20", + "lib2.js": "export default 21" + }; + await updateSrc(data); + const webpack = require("../"); + const configAdditions = { + plugins: [ + new webpack.container.ModuleFederationPlugin({ + name: "container", + library: { type: "commonjs-module" }, + exposes: ["./src/exposed"], + remotes: { + container: ["./no-container", "./container"] + }, + shared: { + lib: { + import: "./src/lib", + shareKey: "lib", + version: "1.2.0", + requiredVersion: "^1.0.0" + }, + "./src/lib2": { + shareKey: "lib", + version: "1.2.3" + } + } + }) + ] + }; + await compile(configAdditions); + await expect(execute()).resolves.toBe(42); + await updateSrc({ + "exposed.js": "module.exports = { ok: true };" + }); + await compile(configAdditions); + await expect(execute()).resolves.toEqual({ ok: true }); + }, 120000); + + it("should not overwrite cache files if readonly = true", async () => { + await updateSrc({ + "main.js": ` +import { sum } from 'lodash'; + +sum([1,2,3]) + ` + }); + await compile({ entry: "./src/main.js" }); + const firstCacheFiles = (await readdir(cachePath)).sort(); + // cSpell:words Mtimes + const firstMtimes = firstCacheFiles.map( + f => fs.statSync(path.join(cachePath, f)).mtime + ); + + await updateSrc({ + "main.js": ` +import 'lodash'; + ` + }); + await compile({ + entry: "./src/main.js", + cache: { + ...config.cache, + readonly: true + } + }); + const cacheFiles = (await readdir(cachePath)).sort(); + expect(cacheFiles).toStrictEqual(firstCacheFiles); + expect( + firstCacheFiles.map(f => fs.statSync(path.join(cachePath, f)).mtime) + // cSpell:words Mtimes + ).toStrictEqual(firstMtimes); + }, 20000); +}); diff --git a/test/ProfilingPlugin.test.js b/test/ProfilingPlugin.test.js index 7aa4d80b40f..ddd127d4faf 100644 --- a/test/ProfilingPlugin.test.js +++ b/test/ProfilingPlugin.test.js @@ -1,30 +1,74 @@ "use strict"; +require("./helpers/warmup-webpack"); + const path = require("path"); -const fs = require("fs"); -const webpack = require("../"); +const fs = require("graceful-fs"); const rimraf = require("rimraf"); -describe("Profiling Plugin", function() { - jest.setTimeout(15000); +describe("Profiling Plugin", function () { + jest.setTimeout(120000); it("should handle output path with folder creation", done => { - const finalPath = "test/js/profilingPath/events.json"; - const outputPath = path.join(__dirname, "/js/profilingPath"); + const webpack = require("../"); + const outputPath = path.join(__dirname, "js/profilingPath"); + const finalPath = path.join(outputPath, "events.json"); + let counter = 0; rimraf(outputPath, () => { + const startTime = process.hrtime(); const compiler = webpack({ - context: "/", + context: __dirname, entry: "./fixtures/a.js", + output: { + path: path.join(__dirname, "js/profilingOut") + }, plugins: [ new webpack.debug.ProfilingPlugin({ outputPath: finalPath - }) - ] + }), + { + apply(compiler) { + const hook = compiler.hooks.make; + for (const { stage, order } of [ + { stage: 0, order: 1 }, + { stage: 1, order: 2 }, + { stage: -1, order: 0 } + ]) { + hook.tap( + { + name: "RespectStageCheckerPlugin", + stage + }, + // eslint-disable-next-line no-loop-func + () => { + expect(counter++).toBe(order); + } + ); + } + } + } + ], + experiments: { + backCompat: false + } }); compiler.run(err => { if (err) return done(err); + const testDuration = process.hrtime(startTime); if (!fs.existsSync(outputPath)) return done(new Error("Folder should be created.")); + const data = require(finalPath); + const maxTs = data.reduce((max, entry) => Math.max(max, entry.ts), 0); + const minTs = data[0].ts; + const duration = maxTs - minTs; + expect(duration).toBeLessThan( + testDuration[0] * 1000000 + testDuration[1] / 1000 + ); + const cpuProfile = data.find(entry => entry.name === "CpuProfile"); + expect(cpuProfile).toBeTypeOf("object"); + const profile = cpuProfile.args.data.cpuProfile; + expect(profile.startTime).toBeGreaterThanOrEqual(minTs); + expect(profile.endTime).toBeLessThanOrEqual(maxTs); done(); }); }); diff --git a/test/ProfilingPlugin.unittest.js b/test/ProfilingPlugin.unittest.js index 0528c9ecb7d..46542635bd0 100644 --- a/test/ProfilingPlugin.unittest.js +++ b/test/ProfilingPlugin.unittest.js @@ -1,13 +1,15 @@ "use strict"; +const path = require("path"); const ProfilingPlugin = require("../lib/debug/ProfilingPlugin"); describe("Profiling Plugin", () => { - it("should persist the passed outpath", () => { + it("should persist the passed output path", () => { + const outputPath = path.join(__dirname, "invest_in_doge_coin"); const plugin = new ProfilingPlugin({ - outputPath: "invest_in_doge_coin" + outputPath }); - expect(plugin.outputPath).toBe("invest_in_doge_coin"); + expect(plugin.outputPath).toBe(outputPath); }); it("should handle no options", () => { @@ -32,7 +34,7 @@ describe("Profiling Plugin", () => { it("handles sending a profiling message when no session", () => { const profiler = new ProfilingPlugin.Profiler(); - return profiler.sendCommand("randy", "is a puppers"); + return profiler.sendCommand("randy", "is awesome"); }); it("handles destroying when no session", () => { diff --git a/test/ProgressPlugin.test.js b/test/ProgressPlugin.test.js index bfa2691591a..a620c9f7b06 100644 --- a/test/ProgressPlugin.test.js +++ b/test/ProgressPlugin.test.js @@ -1,40 +1,271 @@ "use strict"; +require("./helpers/warmup-webpack"); + +const _ = require("lodash"); const path = require("path"); -const MemoryFs = require("memory-fs"); -const webpack = require("../"); - -const createMultiCompiler = () => { - const compiler = webpack([ - { - context: path.join(__dirname, "fixtures"), - entry: "./a.js" +const { createFsFromVolume, Volume } = require("memfs"); +const webpack = require(".."); +const captureStdio = require("./helpers/captureStdio"); + +const createMultiCompiler = (progressOptions, configOptions) => { + const compiler = webpack( + Object.assign( + [ + { + context: path.join(__dirname, "fixtures"), + entry: "./a.js" + }, + { + context: path.join(__dirname, "fixtures"), + entry: "./b.js" + } + ], + configOptions + ) + ); + compiler.outputFileSystem = createFsFromVolume(new Volume()); + + new webpack.ProgressPlugin(progressOptions).apply(compiler); + + return compiler; +}; + +const createSimpleCompiler = progressOptions => { + const compiler = webpack({ + context: path.join(__dirname, "fixtures"), + entry: "./a.js", + infrastructureLogging: { + debug: /Progress/ }, - { - context: path.join(__dirname, "fixtures"), - entry: "./b.js" - } - ]); - compiler.outputFileSystem = new MemoryFs(); + plugins: [ + new webpack.ProgressPlugin({ + activeModules: true, + ...progressOptions + }) + ] + }); + + compiler.outputFileSystem = createFsFromVolume(new Volume()); + return compiler; }; -describe("ProgressPlugin", function() { - it("should not contain NaN as a percentage when it is applied to MultiCompiler", function(done) { - const compiler = createMultiCompiler(); +const createSimpleCompilerWithCustomHandler = options => { + const compiler = webpack({ + context: path.join(__dirname, "fixtures"), + entry: "./a.js" + }); + + compiler.outputFileSystem = createFsFromVolume(new Volume()); + const logger = compiler.getInfrastructureLogger("custom test logger"); + new webpack.ProgressPlugin({ + activeModules: true, + ...options, + handler: (...args) => logger.status(args) + }).apply(compiler); + + return compiler; +}; - let percentage = 0; - new webpack.ProgressPlugin((p, msg, ...args) => { - percentage += p; - }).apply(compiler); +const getLogs = logsStr => logsStr.split(/\r/).filter(v => !(v === " ")); +const runCompilerAsync = compiler => + new Promise((resolve, reject) => { compiler.run(err => { if (err) { - throw err; + reject(err); } else { - expect(percentage).not.toBe(NaN); - done(); + resolve(); + } + }); + }); + +describe("ProgressPlugin", function () { + let stderr; + let stdout; + + beforeEach(() => { + stderr = captureStdio(process.stderr, true); + stdout = captureStdio(process.stdout, true); + }); + afterEach(() => { + stderr && stderr.restore(); + stdout && stdout.restore(); + }); + + const nanTest = createCompiler => () => { + const compiler = createCompiler(); + + return runCompilerAsync(compiler).then(() => { + expect(stderr.toString()).toContain("%"); + expect(stderr.toString()).not.toContain("NaN"); + }); + }; + + it( + "should not contain NaN as a percentage when it is applied to Compiler", + nanTest(createSimpleCompiler) + ); + it( + "should not contain NaN as a percentage when it is applied to MultiCompiler", + nanTest(createMultiCompiler) + ); + it( + "should not contain NaN as a percentage when it is applied to MultiCompiler (parallelism: 1)", + nanTest(() => createMultiCompiler(undefined, { parallelism: 1 })) + ); + + it("should start print only on call run/watch", done => { + const compiler = createSimpleCompiler(); + + const logs = getLogs(stderr.toString()); + expect(logs.join("")).toHaveLength(0); + + compiler.close(done); + }); + + it("should print profile information", () => { + const compiler = createSimpleCompiler({ + profile: true + }); + + return runCompilerAsync(compiler).then(() => { + const logs = getLogs(stderr.toString()); + + expect(logs).toContainEqual( + expect.stringMatching( + /\[webpack\.Progress\] {2}| {2}| \d+ ms module ids > DeterministicModuleIdsPlugin\n$/ + ) + ); + expect(logs).toContainEqual( + expect.stringMatching( + /\[webpack\.Progress\] {2}| \d+ ms building > \.\.\. entries \.\.\. dependencies \.\.\. modules\n$/ + ) + ); + expect(logs).toContainEqual( + expect.stringMatching(/\[webpack\.Progress\] \d+ ms building\n$/) + ); + expect(logs).toContainEqual( + expect.stringMatching( + /\[webpack\.Progress\] {2}| \d+ ms sealing > module ids\n$/ + ) + ); + expect(logs).toContainEqual( + expect.stringMatching(/\[webpack\.Progress\] \d+ ms sealing\n$/) + ); + }); + }); + + const monotonicTest = createCompiler => () => { + const handlerCalls = []; + const compiler = createCompiler({ + handler: (p, ...args) => { + handlerCalls.push({ value: p, text: `${p}% ${args.join(" ")}` }); } }); + + return runCompilerAsync(compiler).then(() => { + let lastLine = handlerCalls[0]; + for (const line of handlerCalls) { + if (line.value < lastLine.value) { + throw new Error( + `Progress value is not monotonic increasing:\n${lastLine.text}\n${line.text}` + ); + } + lastLine = line; + } + }); + }; + + it( + "should have monotonic increasing progress", + monotonicTest(createSimpleCompiler) + ); + it( + "should have monotonic increasing progress (multi compiler)", + monotonicTest(createMultiCompiler) + ); + it( + "should have monotonic increasing progress (multi compiler, parallelism)", + monotonicTest(o => createMultiCompiler(o, { parallelism: 1 })) + ); + + it("should not print lines longer than stderr.columns", () => { + const compiler = createSimpleCompiler(); + process.stderr.columns = 36; + + return runCompilerAsync(compiler).then(() => { + const logs = getLogs(stderr.toString()); + + expect(logs.length).toBeGreaterThan(20); + for (const log of logs) { + expect(log.length).toBeLessThanOrEqual(35); + } + // cspell:ignore mization nsPlugin + expect(logs).toContain( + "75% sealing ...mization ...nsPlugin", + "trims each detail string equally" + ); + expect(logs).toContain("92% sealing asset processing"); + expect(logs).toContain("100%"); + }); + }); + + it("should handle when stderr.columns is undefined", () => { + const compiler = createSimpleCompiler(); + + process.stderr.columns = undefined; + return runCompilerAsync(compiler).then(() => { + const logs = getLogs(stderr.toString()); + + expect(logs.length).toBeGreaterThan(20); + expect(_.maxBy(logs, "length").length).not.toBeGreaterThan(40); + }); + }); + + it("should contain the new compiler hooks", () => { + const compiler = createSimpleCompiler(); + + process.stderr.columns = undefined; + return runCompilerAsync(compiler).then(() => { + const logs = getLogs(stderr.toString()); + + expect(logs).toContain("4% setup normal module factory"); + expect(logs).toContain("5% setup context module factory"); + }); + }); + + it("should display all type of percentage when it is applied to SingleCompiler", () => { + const compiler = createSimpleCompiler({ + entries: true, + modules: true, + dependencies: true, + activeModules: true + }); + + process.stderr.columns = 70; + return runCompilerAsync(compiler).then(() => { + const logs = stderr.toString(); + + expect(logs).toEqual(expect.stringMatching(/\d+\/\d+ entries/)); + expect(logs).toEqual(expect.stringMatching(/\d+\/\d+ dependencies/)); + expect(logs).toEqual(expect.stringMatching(/\d+\/\d+ modules/)); + expect(logs).toEqual(expect.stringMatching(/\d+ active/)); + }); + }); + + it("should get the custom handler text from the log", () => { + const compiler = createSimpleCompilerWithCustomHandler(); + + process.stderr.columns = 70; + return runCompilerAsync(compiler).then(() => { + const logs = stderr.toString(); + expect(logs).toEqual( + expect.stringMatching(/\d+\/\d+ [custom test logger]/) + ); + expect(logs).toEqual(expect.stringMatching(/\d+ active/)); + expect(logs).toEqual(expect.stringMatching(/\d+\/\d+ modules/)); + }); }); }); diff --git a/test/Queue.unittest.js b/test/Queue.unittest.js new file mode 100644 index 00000000000..4c650ebc9c0 --- /dev/null +++ b/test/Queue.unittest.js @@ -0,0 +1,56 @@ +const Queue = require("../lib/util/Queue"); + +describe("Queue", () => { + it("constructor", () => { + const q = new Queue(); + + q.enqueue("item1"); + q.enqueue("item2"); + q.enqueue("item3"); + + expect(q.dequeue()).toBe("item1"); + expect(q.dequeue()).toBe("item2"); + expect(q.dequeue()).toBe("item3"); + expect(q.dequeue()).toBeUndefined(); + + q.enqueue("item2"); + q.enqueue("item3"); + + expect(q.dequeue()).toBe("item2"); + expect(q.dequeue()).toBe("item3"); + expect(q.dequeue()).toBeUndefined(); + }); + + it("enqueue and dequeue", () => { + const q = new Queue(); + + q.enqueue("item1"); + + expect(q.dequeue()).toBe("item1"); + expect(q.dequeue()).toBeUndefined(); + + q.enqueue("item2"); + q.enqueue("item3"); + + expect(q.dequeue()).toBe("item2"); + expect(q.dequeue()).toBe("item3"); + expect(q.dequeue()).toBeUndefined(); + }); + + it("length", () => { + const q = new Queue(); + + q.enqueue("item1"); + q.enqueue("item2"); + + expect(q.length).toBe(2); + + q.dequeue(); + + expect(q.length).toBe(1); + + q.dequeue(); + + expect(q.length).toBe(0); + }); +}); diff --git a/test/README.md b/test/README.md index c11ac7e6a64..f460a490b71 100644 --- a/test/README.md +++ b/test/README.md @@ -1,20 +1,25 @@ # Welcome to the webpack test suite!!!! + Every pull request that you submit to webpack (besides README and spelling corrections in comments) requires tests that are created. But don't give up hope!!! Although our tests may appear complex and overwhelming, once you become familiar with the test suite and structure, adding and creating tests will be fun and beneficial as you work inside the codebase! ❤ ## tl;dr + Run all tests (this automatically runs the setup): + ```sh yarn test ``` Run an individual suite: + ```sh yarn jest ConfigTestCases ``` Watch mode: + ```sh yarn jest --watch ConfigTestCases ``` @@ -22,51 +27,59 @@ yarn jest --watch ConfigTestCases See also: [Jest CLI docs](https://jestjs.io/docs/cli) ## Test suite overview + We use Jest for our tests. For more information on Jest you can visit their [homepage](https://jestjs.io/)! ### Class Tests -All test files can be found in *.test.js. There are many tests that simply test API's of a specific class/file (such as `Compiler`, `Errors`, Integration, `Parser`, `RuleSet`, Validation). + +All test files can be found in \*.test.js. There are many tests that simply test APIs of a specific class/file (such as `Compiler`, `Errors`, Integration, `Parser`, `RuleSet`, Validation). If the feature you are contributing involves one of those classes, then best to start there to understand the structure. ### xCases -In addition to Class specific tests, there are also directories that end in "Cases". The suites for these cases also have corresponding *.test.js files. + +In addition to Class specific tests, there are also directories that end in "Cases". The suites for these cases also have corresponding \*.test.js files. #### cases (`TestCases.test.js`) 1 + Cases are a set of general purpose tests that will run against a variety of permutations of webpack configurations. When you are making a general purpose change that doesn't require you to have a special configuration, you would likely add your tests here. Inside of the `./test/cases` directory you will find tests are broken into thematic sub directories. Take a moment to explore the different options. To add a new case, create a new directory inside of the top level test groups, and then add an `index.js` file (and any other supporting files). By default this file will be the entry point for the test suite and you can add your `it()`'s there. This will also become bundled so that node env support happens as well. -#### configCases (`ConfigTestCases.test.js`) 1 +#### configCases (`ConfigTestCases.basictest.js`) 1 + If you are trying to solve a bug which is reproducible when x and y properties are used together in a config, then configCases is the place to be!!!! In addition to an `index.js`, these configCases require a `webpack.config.js` is located inside of your test suite. This will run this specific config through `webpack` just as you were building individually. They will use the same loading/bundling technique of your `it()` tests, however you now have a more specific config use cases that you can write even before you start coding. -#### statsCases (`StatsTestCases.test.js`) +#### statsCases (`StatsTestCases.basictest.js`) + Stats cases are similar to configCases except specifically focusing on the `expected` output of your stats. Instead of writing to the console, however the output of stats will be written to disk. By default, the "expected" outcome is a pain to write by hand so instead when statsCases are run, runner is checking output using jest's awesome snapshot functionality. -Basically you don't need to write any expected behaviors your self. The assumption is that the stats output from your test code is what you expect. +Basically you don't need to write any expected behaviors yourself. The assumption is that the stats output from your test code is what you expect. -Please follow the approach described bellow: +Please follow the approach described below: -* write your test code in ```statsCases/``` folder by creating a separate folder for it, for example -```statsCases/some-file-import-stats/index.js``` -``` - import(./someModule); +- write your test code in `statsCases/` folder by creating a separate folder for it, for example `statsCases/some-file-import-stats/index.js` + +```javascript +import("./someModule"); ``` -** dont's forget the ```webpack.config.js``` -* run the test -* jest will automatically add the output from your test code to ```StatsTestCases.test.js.snap``` and you can always check your results there -* Next time test will run -> runner will compare results against your output written to snapshot previously + +- don't forget the `webpack.config.js` +- run the test +- jest will automatically add the output from your test code to `StatsTestCases.test.js.snap` and you can always check your results there +- Next time test will run -> runner will compare results against your output written to snapshot previously You can read more about SnapShot testing [right here](https://jestjs.io/docs/snapshot-testing) ## Questions? Comments? -If you are still nervous or don't quite understand, please submit an issue and tag us in it, and provide a relevant PR while working on! +If you are still nervous or don't quite understand, please submit an issue and tag us in it, and provide a relevant PR while working on! ## Footnotes -1 webpack's parser supports the use of ES2015 features like arrow functions, harmony exports, etc. However as a library we follow NodeJS's timeline for dropping older versions of node. Because of this we expect your tests on Travis to pass all the way back to NodeJS v0.12; Therefore if you would like specific tests that use these features to be ignored if they are not supported, then you should add a `test.filter.js` file. This allows you to import the syntax needed for that test, meanwhile ignoring it on node versions (during CI) that don't support it. webpack has a variety of helpful examples you can refer to if you are just starting out. See the `./helpers` folder to find a list of the versions. + +1 webpack's parser supports the use of ES2015 features like arrow functions, harmony exports, etc. However as a library we follow Node.js' timeline for dropping older versions of node. Because of this we expect your tests on GitHub Actions to pass all the way back to NodeJS v10; Therefore if you would like specific tests that use these features to be ignored if they are not supported, then you should add a `test.filter.js` file. This allows you to import the syntax needed for that test, meanwhile ignoring it on node versions (during CI) that don't support it. webpack has a variety of helpful examples you can refer to if you are just starting out. See the `./helpers` folder to find a list of the versions. diff --git a/test/RawModule.unittest.js b/test/RawModule.unittest.js index 8d3e6b90f3a..4fbbb6e194a 100644 --- a/test/RawModule.unittest.js +++ b/test/RawModule.unittest.js @@ -1,11 +1,8 @@ "use strict"; const RawModule = require("../lib/RawModule"); -const OriginalSource = require("webpack-sources").OriginalSource; -const RawSource = require("webpack-sources").RawSource; const RequestShortener = require("../lib/RequestShortener"); const path = require("path"); -const crypto = require("crypto"); describe("RawModule", () => { const source = "sourceStr attribute"; @@ -36,49 +33,4 @@ describe("RawModule", () => { } ); }); - - describe("needRebuild", () => { - it("returns false", () => { - expect(myRawModule.needRebuild()).toBe(false); - }); - }); - - describe("source", () => { - it( - "returns a new OriginalSource instance with sourceStr attribute and " + - "return value of identifier() function provided as constructor arguments", - () => { - const originalSource = new OriginalSource( - myRawModule.sourceStr, - myRawModule.identifier() - ); - myRawModule.useSourceMap = true; - expect(myRawModule.source()).toEqual(originalSource); - } - ); - - it( - "returns a new RawSource instance with sourceStr attribute provided " + - "as constructor argument if useSourceMap is falsy", - () => { - const rawSource = new RawSource(myRawModule.sourceStr); - myRawModule.useSourceMap = false; - expect(myRawModule.source()).toEqual(rawSource); - } - ); - }); - - describe("updateHash", () => { - it("should include sourceStr in its hash", () => { - const hashModule = module => { - const hash = crypto.createHash("sha256"); - module.updateHash(hash); - return hash.digest("hex"); - }; - - const hashFoo = hashModule(new RawModule('"foo"')); - const hashBar = hashModule(new RawModule('"bar"')); - expect(hashFoo).not.toBe(hashBar); - }); - }); }); diff --git a/test/RemoveFiles.test.js b/test/RemoveFiles.test.js deleted file mode 100644 index a22bd69b332..00000000000 --- a/test/RemoveFiles.test.js +++ /dev/null @@ -1,140 +0,0 @@ -"use strict"; - -/* globals describe it */ -const path = require("path"); -const MemoryFs = require("memory-fs"); -const webpack = require("../"); -const fs = require("fs"); -const rimraf = require("rimraf"); - -const createCompiler = config => { - const compiler = webpack(config); - compiler.outputFileSystem = new MemoryFs(); - return compiler; -}; - -const tempFolderPath = path.join(__dirname, "temp"); -const tempFilePath = path.join(tempFolderPath, "temp-file.js"); -const tempFile2Path = path.join(tempFolderPath, "temp-file2.js"); - -const createSingleCompiler = () => { - return createCompiler({ - entry: tempFilePath, - watch: true, - output: { - path: tempFolderPath, - filename: "bundle.js" - } - }); -}; - -describe("RemovedFiles", () => { - if (process.env.NO_WATCH_TESTS) { - it.skip("watch tests excluded", () => {}); - return; - } - - jest.setTimeout(20000); - - function cleanup() { - rimraf.sync(tempFolderPath); - } - - beforeAll(() => { - cleanup(); - fs.mkdirSync(tempFolderPath); - fs.writeFileSync( - tempFilePath, - "module.exports = function temp() {return 'temp file';};\n require('./temp-file2')", - "utf-8" - ); - fs.writeFileSync( - tempFile2Path, - "module.exports = function temp2() {return 'temp file 2';};", - "utf-8" - ); - }); - afterAll(done => { - cleanup(); - done(); - }); - - it("should track removed files when they've been deleted in watchRun", done => { - const compiler = createSingleCompiler(); - let watcher; - function handleError(err) { - if (err) done(err); - } - setTimeout(() => { - fs.unlinkSync(tempFilePath, handleError); - }, 2000); - compiler.hooks.watchRun.tap("RemovedFilesTest", (compiler, err) => { - if (err) { - done(err); - } - const removals = Array.from(compiler.removedFiles); - if (removals.length > 0) { - setTimeout(() => { - expect(removals).toContain(tempFilePath); - watcher.close(); - done(); - }, 100); - } - }); - - watcher = compiler.watch( - { - aggregateTimeout: 50 - }, - (err, stats) => {} - ); - }); - - it("should not track removed files when they have not been deleted in watchRun", done => { - const compiler = createSingleCompiler(); - let watcher; - compiler.hooks.watchRun.tap("RemovedFilesTest", (compiler, err) => { - if (err) { - done(err); - } - expect(Array.from(compiler.removedFiles)).toHaveLength(0); - done(); - watcher.close(); - }); - - watcher = compiler.watch( - { - aggregateTimeout: 50 - }, - (err, stats) => {} - ); - }); - - it("should not track removed files when files have been modified", done => { - const compiler = createSingleCompiler(); - let watcher; - function handleError(err) { - if (err) done(err); - } - let updateFile = () => { - fs.writeFile(tempFile2Path, "hello world", "utf-8", handleError); - }; - updateFile(); - compiler.hooks.watchRun.tap("RemovedFilesTest", (compiler, err) => { - handleError(err); - setTimeout(() => { - expect(Array.from(compiler.removedFiles)).toHaveLength(0); - watcher.close(); - done(); - }, 500); - watcher.close(); - }); - - watcher = compiler.watch( - { - aggregateTimeout: 50 - }, - (err, stats) => {} - ); - }); -}); diff --git a/test/RemovedPlugins.unittest.js b/test/RemovedPlugins.unittest.js deleted file mode 100644 index 915ee0e116c..00000000000 --- a/test/RemovedPlugins.unittest.js +++ /dev/null @@ -1,18 +0,0 @@ -const webpack = require("../lib/webpack"); -const RemovedPluginError = require("../lib/RemovedPluginError"); - -describe("removed plugin errors", () => { - it("should error when accessing removed plugins", () => { - expect(() => webpack.optimize.UglifyJsPlugin).toThrow(RemovedPluginError); - expect( - () => webpack.optimize.UglifyJsPlugin - ).toThrowErrorMatchingSnapshot(); - - expect(() => webpack.optimize.CommonsChunkPlugin).toThrow( - RemovedPluginError - ); - expect( - () => webpack.optimize.CommonsChunkPlugin - ).toThrowErrorMatchingSnapshot(); - }); -}); diff --git a/test/RequestShortener.unittest.js b/test/RequestShortener.unittest.js new file mode 100644 index 00000000000..84dd3c6bb5a --- /dev/null +++ b/test/RequestShortener.unittest.js @@ -0,0 +1,22 @@ +"use strict"; + +const RequestShortener = require("../lib/RequestShortener"); + +describe("RequestShortener", () => { + it("should create RequestShortener and shorten with ./ file in directory", () => { + const shortener = new RequestShortener("/foo/bar"); + expect(shortener.shorten("/foo/bar/some.js")).toEqual("./some.js"); + }); + + it("should create RequestShortener and shorten with ../ file in parent directory", () => { + const shortener = new RequestShortener("/foo/bar"); + expect(shortener.shorten("/foo/baz/some.js")).toEqual("../baz/some.js"); + }); + + it("should create RequestShortener and not shorten parent directory neighbor", () => { + const shortener = new RequestShortener("/foo/bar"); + expect(shortener.shorten("/foo_baz/bar/some.js")).toEqual( + "../../foo_baz/bar/some.js" + ); + }); +}); diff --git a/test/RuleSet.unittest.js b/test/RuleSet.unittest.js deleted file mode 100644 index c62b7bb64fb..00000000000 --- a/test/RuleSet.unittest.js +++ /dev/null @@ -1,483 +0,0 @@ -"use strict"; - -const RuleSet = require("../lib/RuleSet"); - -function match(ruleSet, resource) { - const result = ruleSet.exec({ - resource: resource - }); - return result - .filter(r => { - return r.type === "use"; - }) - .map(r => r.value) - .map(r => { - if (!r.options) return r.loader; - if (typeof r.options === "string") return r.loader + "?" + r.options; - return r.loader + "?" + JSON.stringify(r.options); - }); -} - -describe("RuleSet", () => { - it("should create RuleSet with a blank array", () => { - const loader = new RuleSet([]); - expect(loader.rules).toEqual([]); - }); - it("should create RuleSet and match with empty array", () => { - const loader = new RuleSet([]); - expect(match(loader, "something")).toEqual([]); - }); - it("should not match with loaders array", () => { - const loader = new RuleSet([ - { - test: /\.css$/, - loader: "css" - } - ]); - expect(match(loader, "something")).toEqual([]); - }); - - it("should match with regex", () => { - const loader = new RuleSet([ - { - test: /\.css$/, - loader: "css" - } - ]); - expect(match(loader, "style.css")).toEqual(["css"]); - }); - - it("should match with string", () => { - const loader = new RuleSet([ - { - test: "style.css", - loader: "css" - } - ]); - expect(match(loader, "style.css")).toEqual(["css"]); - }); - - it("should match with function", () => { - const loader = new RuleSet([ - { - test: function(str) { - return str === "style.css"; - }, - loader: "css" - } - ]); - expect(match(loader, "style.css")).toEqual(["css"]); - }); - - it("should throw if invalid test", () => { - expect(() => { - const loader = new RuleSet([ - { - test: { - invalid: "test" - }, - loader: "css" - } - ]); - match(loader, "style.css"); - }).toThrow(/Unexcepted property invalid in condition/); - }); - - it("should accept multiple test array that all match", () => { - const loader = new RuleSet([ - { - test: [/style.css/, /yle.css/], - loader: "css" - } - ]); - expect(match(loader, "style.css")).toEqual(["css"]); - }); - - it("should accept multiple test array that not all match", () => { - const loader = new RuleSet([ - { - test: [/style.css/, /something.css/], - loader: "css" - } - ]); - expect(match(loader, "style.css")).toEqual(["css"]); - }); - - it("should not match if include does not match", () => { - const loader = new RuleSet([ - { - test: /\.css$/, - include: /output.css/, - loader: "css" - } - ]); - expect(match(loader, "style.css")).toEqual([]); - }); - - it("should match if include matches", () => { - const loader = new RuleSet([ - { - test: /\.css$/, - include: /style.css/, - loader: "css" - } - ]); - expect(match(loader, "style.css")).toEqual(["css"]); - }); - - it("should not match if exclude matches", () => { - const loader = new RuleSet([ - { - test: /\.css$/, - exclude: /style.css/, - loader: "css" - } - ]); - expect(match(loader, "style.css")).toEqual([]); - }); - - it("should match if exclude does not match", () => { - const loader = new RuleSet([ - { - test: /\.css$/, - exclude: /output.css/, - loader: "css" - } - ]); - expect(match(loader, "style.css")).toEqual(["css"]); - }); - - it("should work if a loader is applied to all files", () => { - const loader = new RuleSet([ - { - loader: "css" - } - ]); - expect(match(loader, "style.css")).toEqual(["css"]); - expect(match(loader, "scripts.js")).toEqual(["css"]); - }); - - it("should work with using loader as string", () => { - const loader = new RuleSet([ - { - test: /\.css$/, - loader: "css" - } - ]); - expect(match(loader, "style.css")).toEqual(["css"]); - }); - - it("should work with using loader as array", () => { - const loader = new RuleSet([ - { - test: /\.css$/, - loader: ["css"] - } - ]); - expect(match(loader, "style.css")).toEqual(["css"]); - }); - - it("should work with using loaders as string", () => { - const loader = new RuleSet([ - { - test: /\.css$/, - loaders: "css" - } - ]); - expect(match(loader, "style.css")).toEqual(["css"]); - }); - - it("should work with using loaders as array", () => { - const loader = new RuleSet([ - { - test: /\.css$/, - loaders: ["css"] - } - ]); - expect(match(loader, "style.css")).toEqual(["css"]); - }); - - it("should throw if using loaders with non-string or array", () => { - expect(() => { - const loader = new RuleSet([ - { - test: /\.css$/, - loaders: { - someObj: true - } - } - ]); - match(loader, "style.css"); - }).toThrow(/No loader specified/); - }); - - it("should work with using loader with inline query", () => { - const loader = new RuleSet([ - { - test: /\.css$/, - loader: "css?modules=1" - } - ]); - expect(match(loader, "style.css")).toEqual(["css?modules=1"]); - }); - - it("should work with using loader with string query", () => { - const loader = new RuleSet([ - { - test: /\.css$/, - loader: "css", - query: "modules=1" - } - ]); - expect(match(loader, "style.css")).toEqual(["css?modules=1"]); - }); - - it("should work with using loader with object query", () => { - const loader = new RuleSet([ - { - test: /\.css$/, - loader: "css", - query: { - modules: 1 - } - } - ]); - expect(match(loader, "style.css")).toEqual(['css?{"modules":1}']); - }); - - it("should work with using array loaders with basic object notation", () => { - const loader = new RuleSet([ - { - test: /\.css$/, - loaders: [ - { - loader: "css" - } - ] - } - ]); - expect(match(loader, "style.css")).toEqual(["css"]); - }); - - it("should throw if using array loaders with object notation without specifying a loader", () => { - expect(() => { - const loader = new RuleSet([ - { - test: /\.css$/, - loaders: [ - { - stuff: 1 - } - ] - } - ]); - match(loader, "style.css"); - }).toThrow(/No loader specified/); - }); - - it("should work with using array loaders with object notation", () => { - const loader = new RuleSet([ - { - test: /\.css$/, - loaders: [ - { - loader: "css", - query: "modules=1" - } - ] - } - ]); - expect(match(loader, "style.css")).toEqual(["css?modules=1"]); - }); - - it("should work with using multiple array loaders with object notation", () => { - const loader = new RuleSet([ - { - test: /\.css$/, - loaders: [ - { - loader: "style", - query: "filesize=1000" - }, - { - loader: "css", - query: "modules=1" - } - ] - } - ]); - expect(match(loader, "style.css")).toEqual([ - "style?filesize=1000", - "css?modules=1" - ]); - }); - - it("should work with using string multiple loaders", () => { - const loader = new RuleSet([ - { - test: /\.css$/, - loaders: "style?filesize=1000!css?modules=1" - } - ]); - expect(match(loader, "style.css")).toEqual([ - "style?filesize=1000", - "css?modules=1" - ]); - }); - - it("should throw if using array loaders with a single legacy", () => { - expect(() => { - const loader = new RuleSet([ - { - test: /\.css$/, - loaders: ["style-loader", "css-loader"], - query: "modules=1" - } - ]); - match(loader, "style.css"); - }).toThrow(/options\/query cannot be used with loaders/); - }); - - it("should work when using array loaders", () => { - const loader = new RuleSet([ - { - test: /\.css$/, - loaders: ["style-loader", "css-loader"] - } - ]); - expect(match(loader, "style.css")).toEqual(["style-loader", "css-loader"]); - }); - - it("should work when using an array of functions returning a loader", () => { - const loader = new RuleSet([ - { - test: /\.css$/, - use: [ - function(data) { - return { - loader: "style-loader" - }; - }, - function(data) { - return { - loader: "css-loader" - }; - } - ] - } - ]); - expect(match(loader, "style.css")).toEqual(["style-loader", "css-loader"]); - }); - - it("should work when using an array of either functions or strings returning a loader", () => { - const loader = new RuleSet([ - { - test: /\.css$/, - use: [ - "style-loader", - function(data) { - return { - loader: "css-loader" - }; - } - ] - } - ]); - expect(match(loader, "style.css")).toEqual(["style-loader", "css-loader"]); - }); - - it("should work when using an array of functions returning either a loader object or loader name string", () => { - const loader = new RuleSet([ - { - test: /\.css$/, - use: [ - function(data) { - return "style-loader"; - }, - function(data) { - return { - loader: "css-loader" - }; - } - ] - } - ]); - expect(match(loader, "style.css")).toEqual(["style-loader", "css-loader"]); - }); - - it("should throw if using array loaders with invalid type", () => { - expect(() => { - const loader = new RuleSet([ - { - test: /\.css$/, - loaders: ["style-loader", "css-loader", 5] - } - ]); - match(loader, "style.css"); - }).toThrow(/No loader specified/); - }); - - describe("when exclude array holds an undefined item", () => { - function errorHasContext(err) { - return ( - /Expected condition but got falsy value/.test(err) && - /test/.test(err) && - /include/.test(err) && - /exclude/.test(err) && - /node_modules/.test(err) && - /undefined/.test(err) - ); - } - - it("should throw with context", () => { - try { - const loader = new RuleSet([ - { - test: /\.css$/, - loader: "css", - include: ["src"], - exclude: ["node_modules", undefined] - } - ]); - match(loader, "style.css"); - throw new Error("unreachable"); - } catch (e) { - expect(errorHasContext(e.message)).toBe(true); - } - }); - it("in resource should throw with context", () => { - try { - const loader = new RuleSet([ - { - resource: { - test: /\.css$/, - include: ["src"], - exclude: ["node_modules", undefined] - } - } - ]); - match(loader, "style.css"); - throw new Error("unreachable"); - } catch (e) { - expect(errorHasContext(e.message)).toBe(true); - } - }); - it("in issuer should throw with context", () => { - try { - const loader = new RuleSet([ - { - issuer: { - test: /\.css$/, - include: ["src"], - exclude: ["node_modules", undefined] - } - } - ]); - match(loader, "style.css"); - throw new Error("unreachable"); - } catch (e) { - expect(errorHasContext(e.message)).toBe(true); - } - }); - }); -}); diff --git a/test/RuntimeTemplate.unittest.js b/test/RuntimeTemplate.unittest.js new file mode 100644 index 00000000000..1cd083e3036 --- /dev/null +++ b/test/RuntimeTemplate.unittest.js @@ -0,0 +1,78 @@ +"use strict"; + +const RuntimeTemplate = require("../lib/RuntimeTemplate"); +const RequestShortener = require("../lib/RequestShortener"); + +describe("RuntimeTemplate.concatenation", () => { + it("no args", () => { + const runtimeTemplate = new RuntimeTemplate( + undefined, + { environment: { templateLiteral: false } }, + new RequestShortener(__dirname) + ); + expect(runtimeTemplate.concatenation()).toBe('""'); + }); + + it("1 arg", () => { + const runtimeTemplate = new RuntimeTemplate( + undefined, + { environment: { templateLiteral: false } }, + new RequestShortener(__dirname) + ); + expect(runtimeTemplate.concatenation({ expr: 1 })).toBe('"" + 1'); + expect(runtimeTemplate.concatenation("str")).toBe('"str"'); + }); + + it("es5", () => { + const runtimeTemplate = new RuntimeTemplate( + undefined, + { environment: { templateLiteral: false } }, + new RequestShortener(__dirname) + ); + + expect( + runtimeTemplate.concatenation({ expr: "__webpack__.p" }, "str/a") + ).toBe('__webpack__.p + "str/a"'); + expect( + runtimeTemplate.concatenation( + { expr: "__webpack__.p" }, + { expr: "str.a" }, + "str" + ) + ).toBe('"" + __webpack__.p + str.a + "str"'); + expect(runtimeTemplate.concatenation("a", "b", { expr: 1 })).toBe( + '"a" + "b" + 1' + ); + expect(runtimeTemplate.concatenation("a", { expr: 1 }, "b")).toBe( + '"a" + 1 + "b"' + ); + }); + + describe("es6", () => { + const runtimeTemplate = new RuntimeTemplate( + undefined, + { environment: { templateLiteral: true } }, + new RequestShortener(__dirname) + ); + + it("should prefer shorten variant #1", () => { + expect(runtimeTemplate.concatenation({ expr: 1 }, "a", { expr: 2 })).toBe( + '1 + "a" + 2' + ); + }); + + it("should prefer shorten variant #2", () => { + expect( + runtimeTemplate.concatenation({ expr: 1 }, "a", { expr: 2 }, "b") + ).toBe('1 + "a" + 2 + "b"'); + }); + + it("should prefer shorten variant #3", () => { + /* eslint-disable no-template-curly-in-string */ + expect(runtimeTemplate.concatenation("a", { expr: 1 }, "b")).toBe( + "`a${1}b`" + ); + /* eslint-enable */ + }); + }); +}); diff --git a/test/Schemas.lint.js b/test/Schemas.lint.js deleted file mode 100644 index 8908cfdc6fb..00000000000 --- a/test/Schemas.lint.js +++ /dev/null @@ -1,167 +0,0 @@ -"use strict"; - -const fs = require("fs"); -const path = require("path"); -const glob = require("glob"); -const rootDir = path.resolve(__dirname, ".."); - -describe("Schemas", () => { - const schemas = glob.sync("schemas/**/*.json", { - cwd: rootDir - }); - - schemas.forEach(filename => { - describe(filename, () => { - let content; - let fileContent; - let errorWhileParsing; - - try { - fileContent = fs.readFileSync(path.resolve(rootDir, filename), "utf-8"); - content = JSON.parse(fileContent); - } catch (e) { - errorWhileParsing = e; - } - - it("should be parse-able", () => { - if (errorWhileParsing) throw errorWhileParsing; - }); - - if (content) { - const arrayProperties = ["oneOf", "anyOf", "allOf"]; - const allowedProperties = [ - "definitions", - "$ref", - "$id", - "title", - "items", - "properties", - "additionalProperties", - "type", - "oneOf", - "anyOf", - "absolutePath", - "description", - "enum", - "minLength", - "minimum", - "required", - "uniqueItems", - "minItems", - "minProperties", - "instanceof", - "tsType" - ]; - - const validateProperty = property => { - it("should have description set", () => { - expect(typeof property.description).toBe("string"); - expect(property.description.length).toBeGreaterThan(1); - }); - }; - - const walker = item => { - it("should only use allowed schema properties", () => { - const otherProperties = Object.keys(item).filter( - p => allowedProperties.indexOf(p) < 0 - ); - if (otherProperties.length > 0) { - throw new Error( - `The properties ${otherProperties.join( - ", " - )} are not allowed to use` - ); - // When allowing more properties make sure to add nice error messages for them in WebpackOptionsValidationError - } - }); - - if ("$ref" in item) { - it("should not have other properties next to $ref", () => { - const otherProperties = Object.keys(item).filter( - p => p !== "$ref" - ); - if (otherProperties.length > 0) { - throw new Error( - `When using $ref not other properties are possible (${otherProperties.join( - ", " - )})` - ); - } - }); - } - - if ("instanceof" in item) { - it("should have tsType specified when using instanceof", () => { - if (!("tsType" in item)) { - throw new Error("When using instanceof, tsType is required"); - } - }); - } - - if ("absolutePath" in item) { - it("should have type: 'string' specified when using absolutePath", () => { - if (item.type !== "string") { - throw new Error( - "When using absolutePath, type must be 'string'" - ); - } - }); - } - - if ("properties" in item || "additionalProperties" in item) { - it("should have type: 'object' specified when using properties or additionalProperties", () => { - if (item.type !== "object") { - throw new Error( - "When using properties or additionalProperties, type must be 'object'" - ); - } - }); - } - - arrayProperties.forEach(prop => { - if (prop in item) { - describe(prop, () => { - item[prop].forEach(walker); - }); - } - }); - if ("items" in item) { - describe("items", () => { - if (Object.keys(item).join() !== "$ref") { - validateProperty(item.items); - } - walker(item.items); - }); - } - if ("definitions" in item) { - Object.keys(item.definitions).forEach(name => { - describe(`#${name}`, () => { - walker(item.definitions[name]); - }); - }); - } - if ("properties" in item) { - it("should have additionalProperties set to some value when describing properties", () => { - expect(item.additionalProperties).toBeDefined(); - }); - Object.keys(item.properties).forEach(name => { - describe(`> '${name}'`, () => { - const property = item.properties[name]; - validateProperty(property); - walker(property); - }); - }); - } - if (typeof item.additionalProperties === "object") { - describe("properties", () => { - validateProperty(item.additionalProperties); - walker(item.additionalProperties); - }); - } - }; - - walker(content); - } - }); - }); -}); diff --git a/test/SemVer.unittest.js b/test/SemVer.unittest.js new file mode 100644 index 00000000000..94cc46da336 --- /dev/null +++ b/test/SemVer.unittest.js @@ -0,0 +1,591 @@ +"use strict"; + +const { + parseVersion, + parseVersionRuntimeCode, + versionLt, + versionLtRuntimeCode, + parseRange, + rangeToString, + rangeToStringRuntimeCode, + satisfy, + satisfyRuntimeCode +} = require("../lib/util/semver"); + +describe("SemVer", () => { + const createRuntimeFunction = runtimeCodeFunction => { + const runtimeFunction = runtimeCodeFunction({ + basicFunction: (args, body) => `(${args}) => {\n${body.join("\n")}\n}`, + supportsArrowFunction: () => true + }); + const functionName = runtimeFunction.match(/^var (\w+)/)[1]; + return eval( + `(function (...args) { ${runtimeFunction}; return ${functionName}(...args); })` + ); + }; + + for (const [name, fn] of [ + ["normal", parseVersion], + ["runtime", createRuntimeFunction(parseVersionRuntimeCode)] + ]) { + it(`should parseVersion correctly (${name})`, () => { + expect(fn("1")).toEqual([1]); + expect(fn("1.2.3")).toEqual([1, 2, 3]); + expect(fn("1.2.3.4.999")).toEqual([1, 2, 3, 4, 999]); + // eslint-disable-next-line no-sparse-arrays + expect(fn("1.2.3-beta")).toEqual([1, 2, 3, , "beta"]); + // eslint-disable-next-line no-sparse-arrays + expect(fn("1.2.3-beta.1.2")).toEqual([1, 2, 3, , "beta", 1, 2]); + /* eslint-disable no-sparse-arrays */ + expect(fn("1.2.3-alpha.beta-42")).toEqual([ + 1, + 2, + 3, + , + "alpha", + "beta-42" + ]); + expect(fn("1.2.3-beta.1.alpha.0+5343")).toEqual([ + 1, + 2, + 3, + , + "beta", + 1, + "alpha", + 0, + [], + 5343 + ]); + /* eslint-enable no-sparse-arrays */ + expect(fn("1.2.3+5343.beta+1")).toEqual([1, 2, 3, [], 5343, "beta+1"]); + expect(fn("1.2.3+5343.beta+1")).toEqual([1, 2, 3, [], 5343, "beta+1"]); + }); + } + + describe("versionLt", () => { + const cases = [ + "1 < 2", + "99 < 100", + "1 < 1.2", + "1 < 1.2.3", + "1.2 < 1.2.3", + "1.2.2 < 1.2.3", + "1.1.3 < 1.2.0", + "1.1.3 < 2.0.0", + "1.1.3 < 2", + "1.1.3 < 2.0", + "1.2.3 < 1.2.3+0", + "1.2.3+23 < 1.2.3+123", + "1.2+2 < 1.2.3+1", + "1.2.3-beta < 1.2.3", + "1.2.3 < 1.2.4-beta", + "1.2.3 < 1.3.0-beta", + "1.2.3 < 2.0.0-beta", + "1.2.3-alpha < 1.2.3-beta", + "1.2.3-beta < 1.2.3.1", + "1.2.3-beta < 1.2.3-beta.0", + "1.2.3-beta.0 < 1.2.3-beta.1", + "1.2.3-0 < 1.2.3-beta", + "1.2.3-beta < 1.2.3-beta+123", + "1.2.3-beta+123 < 1.2.3-beta+234", + "1.2.3-beta+99 < 1.2.3-beta+111", + "1.2.3-beta < 1.2.3+1", + "1.0.0-alpha < 1.0.0-alpha.1", + "1.0.0-alpha.1 < 1.0.0-alpha.beta", + "1.0.0-alpha.beta < 1.0.0-beta", + "1.0.0-beta < 1.0.0-beta.2", + "1.0.0-beta.2 < 1.0.0-beta.11", + "1.0.0-beta.11 < 1.0.0-rc.1", + "1.0.0-rc.1 < 1.0.0", + "2.2 < 2.beta", + "2.2 < 2.beta.1", + "2.2.1 < 2.beta.1", + "2.2.1 < 2.beta", + "2.2.3 < 2.beta.1", + "2.alpha < 2.beta", + "2.alpha.1 < 2.beta", + "2.alpha.1 < 2.beta.1", + "2.alpha < 2.beta.1" + ]; + for (const c of cases) { + const parts = c.split(" < "); + const a = parts[0]; + const b = parts[1]; + + for (const [name, fn] of [ + ["normal", versionLt], + ["runtime", createRuntimeFunction(versionLtRuntimeCode)] + ]) { + it(`${c} (${name})`, () => { + expect(fn(a, a)).toBe(false); + expect(fn(b, b)).toBe(false); + expect(fn(a, b)).toBe(true); + expect(fn(b, a)).toBe(false); + }); + } + } + }); + + describe("parseRange", () => { + const cases = { + "5 || 6 || 7.x.x": ["5.x.x || 6.x || 7"], + "1 - 2": ["1 - 2"], + "=3": [ + "3", + "v3", + "3.x", + "3.X", + "3.x.x", + "3.*", + "3.*.*", + "^3", + "^3.x", + "= 3" + ], + "=3.0": ["3.0", "v3.0", "3.0.x", "3.0.X", "3.0.*", "~3.0", "= 3.0"], + "^3.4": ["^3.4.*", "^ 3.4"], + "3.4 - 6.5": [">=3.4 <=6.5", ">= 3.4 <= 6.5"], + "<=3.4": ["<3.4 || =3.4", "<= 3.4"], + ">3.4": [">=3.4 !3.4", "> 3.4"], + "1.2.3-alpha.x.x": ["1.2.3-alpha", "1.2.3-alpha+build.25"], + "1.2.3-NaN": ["1.2.3-NaN"] + }; + for (const key of Object.keys(cases)) { + describe(key, () => { + for (const c of cases[key]) + it(`should be equal ${c}`, () => { + expect(parseRange(c)).toEqual(parseRange(key)); + }); + }); + } + }); + + describe("rangeToString", () => { + const cases = { + "*": "*", + 1: "^1", + 1.2: "~1.2", + "1.2.3": "=1.2.3", + "^1.2.3": "^1.2.3", + "~1.2.3": "~1.2.3", + "0.0.1": "=0.0.1", + "^0.0.1": "=0.0.1", + "^0.1.2": "~0.1.2", + "~0.0.1": "~0.0.1", + "~0.1.2": "~0.1.2", + ">=1.2.3": ">=1.2.3", + "1.2.3-beta.25": "=1.2.3-beta.25", + "1.2.3-beta.25+12.34": "=1.2.3-beta.25", + "1.2.3+12.34": "=1.2.3", + ">=1.2.3-beta.25": ">=1.2.3-beta.25", + ">=1.2.3-beta.25+12.34": ">=1.2.3-beta.25", + ">=1.2.3+12.34": ">=1.2.3", + "<1.2.3-beta.25": "<1.2.3-beta.25", + "<1.2.3-beta.25+12.34": "<1.2.3-beta.25", + "<1.2.3+12.34": "<1.2.3", + "1.2.3 - 3.2.1": ">=1.2.3 (<3.2.1 || =3.2.1)", + ">3.4": ">=3.4 not(~3.4)", + "1 || 2 || 3": "^1 || ^2 || ^3", + "1.2.3 - 3.2.1 || >3 <=4 || 1": + ">=1.2.3 (<3.2.1 || =3.2.1) || >=3 not(^3) (<4 || ^4) || ^1" + }; + + for (const key of Object.keys(cases)) { + const expected = cases[key]; + + for (const [name, fn] of [ + ["normal", rangeToString], + ["runtime", createRuntimeFunction(rangeToStringRuntimeCode)] + ]) { + it(`should ${key} stringify to ${expected} (${name})`, () => { + expect(fn(parseRange(key))).toEqual(expected); + }); + } + } + }); + + describe("satisfies", () => { + const cases = { + // table cases + ">=1": [ + "1", + "2", + "!1-beta", + "!2-beta", + "1.2", + "!1.2-beta", + "2.2", + "!2.2-beta", + "1.beta", + "!1.beta-beta", + "!2.beta-beta" + ], + ">=1-beta": [ + "1", + "2", + "1-beta", + "1-gamma", + "!1-alpha", + "!2-beta", + "1.2", + "!1.2-beta", + "2.2", + "!2.2-beta", + "1.beta", + "!1.beta-beta", + "2.beta", + "!2.beta-beta" + ], + ">=1.2": [ + "!1", + "2", + "!1-beta", + "!2-beta", + "!1.1", + "1.2", + "1.3", + "2.1", + "2.2", + "2.3", + "1.beta", + "2.beta" + ], + "~1.2": [ + "!1", + "!2", + "!10", + "!1-beta", + "!2-beta", + "!1.1", + "1.2", + "!1.3", + "!1.20" + ], + "~1": [ + "1", + "1.1", + "1.2", + "1.2.1", + "1.0.1", + "1.1.1", + "1.3.0", + "!2.0.0", + "!2.3.4", + "!1.0.0-beta", + "!1.1.0-beta" + ], + ">=1.beta": [ + "!1", + "2", + "!1-beta", + "!2-beta", + "!1.2", + "2.2", + "!1.0", + "!1.100", + "!1.alpha", + "1.beta", + "1.gamma", + "2.beta" + ], + // fixed cases + 2: [ + "2", + "2.0.0", + "2.99.99", + "!2.3.4-beta", + "!2.3.4-beta.1", + "!2.3.4-beta+123", + "2.3.4+123", + "!1", + "!1.2.3", + "!3", + "!3.4.5" + ], + "1.2.3-beta.1.2+33.44": [ + "1.2.3-beta.1.2+33.44", + "1.2.3-beta.1.2+22", + "1.2.3-beta.1.2+0", + "1.2.3-beta.1.2", + "1.2.3-beta.1.2+33.44.55", + "!1.2.3-beta.1.2.3+33.44", + "!1.2.3.4-beta.1.2+33.44", + "1.2.3-beta.1.2+33", + "1.2.3-beta.1.2", + "!1.2.3-beta", + "!1.2-beta.1.2+33.44", + "!1.2.3+33.44", + "!1.2.3", + "!1" + ], + "1.2.3+33.44": [ + "1.2.3+33.44", + "!1.2.4+33.44", + "1.2.3+22", + "1.2.3+33.55", + "!1.2.3-beta+33.44", + "1.2.3+33.44.55", + "1.2.3+33", + "!1.2+33.44", + "!1.2.3.4+33.44", + "1.2.3", + "!1.2.4", + "!1.3", + "!1", + "!2" + ], + "1.2.3-beta.1.2": [ + "1.2.3-beta.1.2", + "1.2.3-beta.1.2+33", + "!1.2.3-beta.1.2.3", + "!1.2.3.4-beta.1.2", + "!1.2.3-beta", + "!1.2-beta.1.2", + "!1.2.3+33", + "!1.2.3", + "!1" + ], + "^2.3.4": [ + "2.3.4", + "2.3.5", + "2.4.0", + "!3.3.4", + "!1.5.6", + "!2.3.3", + "!2.3.4-beta", + "!2.3.5-beta", + "2.3.4.test", + "2.3.test", + "!2.3-test", + "2.3.4+33", + "2.3.5+33", + "2.4.0+33", + "2.3.4.5", + "2.3.beta", + "2.3.beta.1", + "2.beta" + ], + "^2.beta.4": [ + "2.beta.4", + "!2.3.4", + "2.beta.alpha", + "2.beta.alpha+gamma", + "!2.beta-4" + ], + "~2": [ + "2.0.0", + "2.1.0", + "2.1.1", + "2.2.0", + "!1.0.0", + "2.0.1", + "2.1.2", + "2.3.0", + "!3.0.0", + "!3.6.8", + "!2.0.0-beta", + "!2.1.0-beta" + ], + "~2.3.4": [ + "2.3.4", + "2.3.5", + "!2.4.0", + "!3.3.4", + "!1.5.6", + "!2.3.3", + "!2.3.4-beta", + "!2.3.5-beta", + "2.3.4.test", + "2.3.test", + "!2.3-test", + "2.3.4+33", + "2.3.5+33", + "!2.4.0+33", + "2.3.4.5" + ], + "~1.2.0-beta": [ + "1.2.0-beta", + "1.2.0-beta+1", + "1.2.0-rc.0", + "1.2.0", + "1.2.1", + "!1.2.0-alpha", + "!1.2.0-0", + "!1.2.0-100", + "!1.2.1-beta", + "!1.3.0-beta", + "!1.3.0" + ], + "!2.3": [ + "!2.3", + "!2.3.4", + "2.2", + "2.2.2", + "2.4", + "2.4.4", + "2.3-beta", + "2.3.4-beta" + ], + "<2.3": [ + "!2.3", + "!2.3.4", + "2", + "2.2", + "2.2.1", + "1.5", + "0.1", + "!2.2-beta", + "!2.3-beta", + "!2.3-0" + ], + "<4.5-beta.14": [ + "4.5-beta.13", + "!4.5-beta.14", + "!4.5-beta.15", + "!4.5-beta.14.1", + "4.5-beta.13.1", + "4.5-beta.13+15", + "!4.5-beta.14+15", + "4.5-0", + "4.5-100", + "4.5-alpha", + "!4.5-gamma" + ], + "2.3 - 4.5": [ + "2.3", + "2.4", + "!2.3-beta", + "4.5", + "3.0.0", + "!3.5.7-beta.1", + "4.4", + "4.5", + "4.5.1", + "!4.5.2-beta", + "4.5+123" + ], + ">7.8-beta.4": [ + "!7.8-beta.3", + "!7.8-beta.4", + "!7.8-beta.4+55", + "7.8-beta.4.1", + "7.8-beta.5", + "7.8-beta.5.1", + "7.8-gamma", + "!7.8-alpha", + "7.8", + "7.8.0", + "7.8.1", + "7.9", + "8.1", + "10" + ], + "^0.0.3": [ + "!0.0.2", + "0.0.3", + "!0.0.4", + "!0.1.0", + "!0.1.3", + "!1.1.3", + "!1.0.0" + ], + "^0.3.3": [ + "!0.0.3", + "!0.3.2", + "0.3.3", + "0.3.4", + "!0.4.0", + "!0.4.3", + "!0.5.10", + "!1.0.0", + "!1.3.3" + ], + ">=1.0.0+42": [ + "1.0.0+42", + "!1.0+42", + "!1.0+43", + "1.0.0+43", + "1.0.0+5", + "1.0.0+100", + "2.0.0+10", + "1.0.0", + "!1.0.0-beta" + ], + "<1.0.1+42": [ + "!1.0.1+42", + "!1.0.1+43", + "!1.0.1+9", + "!1.0.1+5", + "!1.0.1+100", + "!2.0.0+10", + "!1.0.1", + "1.0.0", + "1.0.0+0", + "1.0.0+9999", + "0.5.0", + "!1.0.1-beta" + ], + "=1.0.0+42": [ + "1.0.0+42", + "!1.0+42", + "1.0.0+43", + "1.0.0+9", + "1.0.0+5", + "1.0.0+100", + "!2.0.0+10", + "1.0.0", + "!0.5.0", + "!1.0.0-beta" + ], + "!1.0.1+42": [ + "!1.0.1+42", + "!1.0.1+43", + "!1.0.1+9", + "!1.0.1+5", + "!1.0.1+100", + "2.0.0+10", + "!1.0.1", + "1.0.0", + "1.0.2", + "0.5.0", + "1.0.1-beta" + ], + "*": [ + "0.0.0", + "0.0.1", + "0.1.0", + "1.0.0", + "!1.0.0-beta", + "!1.0.0-beta.1", + "1.0.0+55" + ] + }; + + for (const range of Object.keys(cases)) { + describe(range, () => { + it(`should be able to parse ${range}`, () => { + parseRange(range); + }); + for (const item of cases[range]) { + for (const [name, fn] of [ + ["normal", satisfy], + ["runtime", createRuntimeFunction(satisfyRuntimeCode)] + ]) { + if (item.startsWith("!")) { + it(`should not be satisfied by ${item.slice( + 1 + )} (${name})`, () => { + expect(fn(parseRange(range), item.slice(1))).toBe(false); + }); + } else { + it(`should be satisfied by ${item} (${name})`, () => { + expect(fn(parseRange(range), item)).toBe(true); + }); + } + } + } + }); + } + }); +}); diff --git a/test/SharingUtil.unittest.js b/test/SharingUtil.unittest.js new file mode 100644 index 00000000000..db5ea28003b --- /dev/null +++ b/test/SharingUtil.unittest.js @@ -0,0 +1,970 @@ +"use strict"; + +const { normalizeVersion } = require("../lib/sharing/utils"); + +describe("normalize dep version", () => { + const commonInvalid = [ + "https://github.com#v1.0", + "git://github.com#v1.0", + "other:github.com/foo/bar#v1.0", + "::", + "", + null, + undefined + ]; + + const commonValid = { + "git+ssh://git@github.com:npm/cli.git#v1.0.27": "v1.0.27", + "git+ssh://git@github.com:npm/cli#semver:^5.0": "^5.0", + "git://github.com/npm/cli.git#v1.0.27": "v1.0.27", + "git+https://isaacs@github.com/npm/cli.git": "", + "http://github.com/npm/cli.git#v1.0": "v1.0", + // for uppercase + "http://GITHUB.com/npm/cli.git#v1.0": "v1.0", + "HTTP://github.com/npm/cli.git#v1.0": "v1.0", + "FILE://foo/bar": "", + "file://foo/bar": "", + "v1.2": "v1.2", + "^1.2.0": "^1.2.0", + "git://localhost:12345/foo/bar#v1.0": "v1.0", + "localhost:foo/bar#v1.0": "v1.0" + }; + + const githubInvalid = [ + // foo/bar shorthand but specifying auth + "user@foo/bar#v1.0", + "user:password@foo/bar#v1.0", + ":password@foo/bar#v1.0", + // foo/bar shorthand but with a space in it + "foo/ bar#v1.0", + // string that ends with a slash, probably a directory + "foo/bar/#v1.0", + // git@github.com style, but omitting the username + "github.com:foo/bar#v1.0", + "github.com/foo/bar#v1.0", + // invalid URI encoding + "github:foo%0N/bar#v1.0", + // missing path + "git+ssh://git@github.com:#v1.0", + // a deep url to something we don't know + "https://github.com/foo/bar/issues#v1.0" + ]; + + const githubValid = { + // extreme shorthand (only for github) + "foo/bar": "", + "foo/bar#branch": "branch", + "foo/bar#v1.0": "v1.0", + "foo/bar.git": "", + "foo/bar.git#v1.0": "v1.0", + + // shortcuts + // + // NOTE auth is accepted but ignored + "github:foo/bar": "", + "github:foo/bar#v1.0": "v1.0", + "github:user@foo/bar": "", + "github:user@foo/bar#v1.0": "v1.0", + "github:user:password@foo/bar": "", + "github:user:password@foo/bar#v1.0": "v1.0", + "github::password@foo/bar": "", + "github::password@foo/bar#v1.0": "v1.0", + + "github:foo/bar.git": "", + "github:foo/bar.git#v1.0": "v1.0", + "github:user@foo/bar.git": "", + "github:user@foo/bar.git#v1.0": "v1.0", + "github:user:password@foo/bar.git": "", + "github:user:password@foo/bar.git#v1.0": "v1.0", + "github::password@foo/bar.git": "", + "github::password@foo/bar.git#v1.0": "v1.0", + + // NOTE auth is accepted and respected + "git://github.com/foo/bar": "", + "git://github.com/foo/bar#v1.0": "v1.0", + "git://user@github.com/foo/bar": "", + "git://user@github.com/foo/bar#v1.0": "v1.0", + "git://user:password@github.com/foo/bar": "", + "git://user:password@github.com/foo/bar#v1.0": "v1.0", + "git://:password@github.com/foo/bar": "", + "git://:password@github.com/foo/bar#v1.0": "v1.0", + + "git://github.com/foo/bar.git": "", + "git://github.com/foo/bar.git#v1.0": "v1.0", + "git://git@github.com/foo/bar.git": "", + "git://git@github.com/foo/bar.git#v1.0": "v1.0", + "git://user:password@github.com/foo/bar.git": "", + "git://user:password@github.com/foo/bar.git#v1.0": "v1.0", + "git://:password@github.com/foo/bar.git": "", + "git://:password@github.com/foo/bar.git#v1.0": "v1.0", + + // no-protocol git+ssh + // + // NOTE auth is _required_ (see invalid list) but ignored + "user@github.com:foo/bar": "", + "user@github.com:foo/bar#v1.0": "v1.0", + "user:password@github.com:foo/bar": "", + "user:password@github.com:foo/bar#v1.0": "v1.0", + ":password@github.com:foo/bar": "", + ":password@github.com:foo/bar#v1.0": "v1.0", + + "user@github.com:foo/bar.git": "", + "user@github.com:foo/bar.git#v1.0": "v1.0", + "user:password@github.com:foo/bar.git": "", + "user:password@github.com:foo/bar.git#v1.0": "v1.0", + ":password@github.com:foo/bar.git": "", + ":password@github.com:foo/bar.git#v1.0": "v1.0", + + // git+ssh urls + // + // NOTE auth is accepted but ignored + "git+ssh://github.com:foo/bar": "", + "git+ssh://github.com:foo/bar#v1.0": "v1.0", + "git+ssh://user@github.com:foo/bar": "", + "git+ssh://user@github.com:foo/bar#v1.0": "v1.0", + "git+ssh://user:password@github.com:foo/bar": "", + "git+ssh://user:password@github.com:foo/bar#v1.0": "v1.0", + "git+ssh://:password@github.com:foo/bar": "", + "git+ssh://:password@github.com:foo/bar#v1.0": "v1.0", + + "git+ssh://github.com:foo/bar.git": "", + "git+ssh://github.com:foo/bar.git#v1.0": "v1.0", + "git+ssh://user@github.com:foo/bar.git": "", + "git+ssh://user@github.com:foo/bar.git#v1.0": "v1.0", + "git+ssh://user:password@github.com:foo/bar.git": "", + "git+ssh://user:password@github.com:foo/bar.git#v1.0": "v1.0", + "git+ssh://:password@github.com:foo/bar.git": "", + "git+ssh://:password@github.com:foo/bar.git#v1.0": "v1.0", + + // ssh urls + // + // NOTE auth is accepted but ignored + "ssh://github.com:foo/bar": "", + "ssh://github.com:foo/bar#v1.0": "v1.0", + "ssh://user@github.com:foo/bar": "", + "ssh://user@github.com:foo/bar#v1.0": "v1.0", + "ssh://user:password@github.com:foo/bar": "", + "ssh://user:password@github.com:foo/bar#v1.0": "v1.0", + "ssh://:password@github.com:foo/bar": "", + "ssh://:password@github.com:foo/bar#v1.0": "v1.0", + + "ssh://github.com:foo/bar.git": "", + "ssh://github.com:foo/bar.git#v1.0": "v1.0", + "ssh://user@github.com:foo/bar.git": "", + "ssh://user@github.com:foo/bar.git#v1.0": "v1.0", + "ssh://user:password@github.com:foo/bar.git": "", + "ssh://user:password@github.com:foo/bar.git#v1.0": "v1.0", + "ssh://:password@github.com:foo/bar.git": "", + "ssh://:password@github.com:foo/bar.git#v1.0": "v1.0", + + // git+https urls + // + // NOTE auth is accepted and respected + "git+https://github.com/foo/bar": "", + "git+https://github.com/foo/bar#v1.0": "v1.0", + "git+https://user@github.com/foo/bar": "", + "git+https://user@github.com/foo/bar#v1.0": "v1.0", + "git+https://user:password@github.com/foo/bar": "", + "git+https://user:password@github.com/foo/bar#v1.0": "v1.0", + "git+https://:password@github.com/foo/bar": "", + "git+https://:password@github.com/foo/bar#v1.0": "v1.0", + + "git+https://github.com/foo/bar.git": "", + "git+https://github.com/foo/bar.git#v1.0": "v1.0", + "git+https://user@github.com/foo/bar.git": "", + "git+https://user@github.com/foo/bar.git#v1.0": "v1.0", + "git+https://user:password@github.com/foo/bar.git": "", + "git+https://user:password@github.com/foo/bar.git#v1.0": "v1.0", + "git+https://:password@github.com/foo/bar.git": "", + "git+https://:password@github.com/foo/bar.git#v1.0": "v1.0", + + // https urls + // + // NOTE auth is accepted and respected + "https://github.com/foo/bar": "", + "https://github.com/foo/bar#v1.0": "v1.0", + "https://user@github.com/foo/bar": "", + "https://user@github.com/foo/bar#v1.0": "v1.0", + "https://user:password@github.com/foo/bar": "", + "https://user:password@github.com/foo/bar#v1.0": "v1.0", + "https://:password@github.com/foo/bar": "", + "https://:password@github.com/foo/bar#v1.0": "v1.0", + + "https://github.com/foo/bar.git": "", + "https://github.com/foo/bar.git#v1.0": "v1.0", + "https://user@github.com/foo/bar.git": "", + "https://user@github.com/foo/bar.git#v1.0": "v1.0", + "https://user:password@github.com/foo/bar.git": "", + "https://user:password@github.com/foo/bar.git#v1.0": "v1.0", + "https://:password@github.com/foo/bar.git": "", + "https://:password@github.com/foo/bar.git#v1.0": "v1.0", + + // inputs that are not quite proper but we accept anyway + "https://www.github.com/foo/bar": "", + "foo/bar#branch with space": "branch with space", + "https://github.com/foo/bar/tree/branch": "branch", + "user..test--/..foo-js# . . . . . some . tags / / /": + " . . . . . some . tags / / /" + }; + + const gitlabInvalid = [ + // gitlab urls can contain a /-/ segment, make sure we ignore those + "https://gitlab.com/foo/-/something", + // missing project + "https://gitlab.com/foo", + // tarball, this should not parse so that it can be used for a remote package fetcher + "https://gitlab.com/foo/bar/repository/archive.tar.gz", + "https://gitlab.com/foo/bar/repository/archive.tar.gz?ref=49b393e2ded775f2df36ef2ffcb61b0359c194c9" + ]; + + const gitlabValid = { + // shortcuts + // + // NOTE auth is accepted but ignored + // NOTE subgroups are respected, but the subgroup is treated as the project and the real project is lost + "gitlab:foo/bar": "", + "gitlab:foo/bar#v1.0": "v1.0", + "gitlab:user@foo/bar": "", + "gitlab:user@foo/bar#v1.0": "v1.0", + "gitlab:user:password@foo/bar": "", + "gitlab:user:password@foo/bar#v1.0": "v1.0", + "gitlab::password@foo/bar": "", + "gitlab::password@foo/bar#v1.0": "v1.0", + + "gitlab:foo/bar.git": "", + "gitlab:foo/bar.git#v1.0": "v1.0", + "gitlab:user@foo/bar.git": "", + "gitlab:user@foo/bar.git#v1.0": "v1.0", + "gitlab:user:password@foo/bar.git": "", + "gitlab:user:password@foo/bar.git#v1.0": "v1.0", + "gitlab::password@foo/bar.git": "", + "gitlab::password@foo/bar.git#v1.0": "v1.0", + + "gitlab:foo/bar/baz": "", + "gitlab:foo/bar/baz#v1.0": "v1.0", + "gitlab:user@foo/bar/baz": "", + "gitlab:user@foo/bar/baz#v1.0": "v1.0", + "gitlab:user:password@foo/bar/baz": "", + "gitlab:user:password@foo/bar/baz#v1.0": "v1.0", + "gitlab::password@foo/bar/baz": "", + "gitlab::password@foo/bar/baz#v1.0": "v1.0", + + "gitlab:foo/bar/baz.git": "", + "gitlab:foo/bar/baz.git#v1.0": "v1.0", + "gitlab:user@foo/bar/baz.git": "", + "gitlab:user@foo/bar/baz.git#v1.0": "v1.0", + "gitlab:user:password@foo/bar/baz.git": "", + "gitlab:user:password@foo/bar/baz.git#v1.0": "v1.0", + "gitlab::password@foo/bar/baz.git": "", + "gitlab::password@foo/bar/baz.git#v1.0": "v1.0", + + // no-protocol git+ssh + // + // NOTE auth is _required_ (see invalid list) but ignored + "user@gitlab.com:foo/bar": "", + "user@gitlab.com:foo/bar#v1.0": "v1.0", + "user:password@gitlab.com:foo/bar": "", + "user:password@gitlab.com:foo/bar#v1.0": "v1.0", + ":password@gitlab.com:foo/bar": "", + ":password@gitlab.com:foo/bar#v1.0": "v1.0", + + "user@gitlab.com:foo/bar.git": "", + "user@gitlab.com:foo/bar.git#v1.0": "v1.0", + "user:password@gitlab.com:foo/bar.git": "", + "user:password@gitlab.com:foo/bar.git#v1.0": "v1.0", + ":password@gitlab.com:foo/bar.git": "", + ":password@gitlab.com:foo/bar.git#v1.0": "v1.0", + + "user@gitlab.com:foo/bar/baz": "", + "user@gitlab.com:foo/bar/baz#v1.0": "v1.0", + "user:password@gitlab.com:foo/bar/baz": "", + "user:password@gitlab.com:foo/bar/baz#v1.0": "v1.0", + ":password@gitlab.com:foo/bar/baz": "", + ":password@gitlab.com:foo/bar/baz#v1.0": "v1.0", + + "user@gitlab.com:foo/bar/baz.git": "", + "user@gitlab.com:foo/bar/baz.git#v1.0": "v1.0", + "user:password@gitlab.com:foo/bar/baz.git": "", + "user:password@gitlab.com:foo/bar/baz.git#v1.0": "v1.0", + ":password@gitlab.com:foo/bar/baz.git": "", + ":password@gitlab.com:foo/bar/baz.git#v1.0": "v1.0", + + // git+ssh urls + // + // NOTE auth is accepted but ignored + // NOTE sub projects are accepted, but the sub project is treated as the project and the real project is lost + "git+ssh://gitlab.com:foo/bar": "", + "git+ssh://gitlab.com:foo/bar#v1.0": "v1.0", + "git+ssh://user@gitlab.com:foo/bar": "", + "git+ssh://user@gitlab.com:foo/bar#v1.0": "v1.0", + "git+ssh://user:password@gitlab.com:foo/bar": "", + "git+ssh://user:password@gitlab.com:foo/bar#v1.0": "v1.0", + "git+ssh://:password@gitlab.com:foo/bar": "", + "git+ssh://:password@gitlab.com:foo/bar#v1.0": "v1.0", + + "git+ssh://gitlab.com:foo/bar.git": "", + "git+ssh://gitlab.com:foo/bar.git#v1.0": "v1.0", + "git+ssh://user@gitlab.com:foo/bar.git": "", + "git+ssh://user@gitlab.com:foo/bar.git#v1.0": "v1.0", + "git+ssh://user:password@gitlab.com:foo/bar.git": "", + "git+ssh://user:password@gitlab.com:foo/bar.git#v1.0": "v1.0", + "git+ssh://:password@gitlab.com:foo/bar.git": "", + "git+ssh://:password@gitlab.com:foo/bar.git#v1.0": "v1.0", + + "git+ssh://gitlab.com:foo/bar/baz": "", + "git+ssh://gitlab.com:foo/bar/baz#v1.0": "v1.0", + "git+ssh://user@gitlab.com:foo/bar/baz": "", + "git+ssh://user@gitlab.com:foo/bar/baz#v1.0": "v1.0", + "git+ssh://user:password@gitlab.com:foo/bar/baz": "", + "git+ssh://user:password@gitlab.com:foo/bar/baz#v1.0": "v1.0", + "git+ssh://:password@gitlab.com:foo/bar/baz": "", + "git+ssh://:password@gitlab.com:foo/bar/baz#v1.0": "v1.0", + + "git+ssh://gitlab.com:foo/bar/baz.git": "", + "git+ssh://gitlab.com:foo/bar/baz.git#v1.0": "v1.0", + "git+ssh://user@gitlab.com:foo/bar/baz.git": "", + "git+ssh://user@gitlab.com:foo/bar/baz.git#v1.0": "v1.0", + "git+ssh://user:password@gitlab.com:foo/bar/baz.git": "", + "git+ssh://user:password@gitlab.com:foo/bar/baz.git#v1.0": "v1.0", + "git+ssh://:password@gitlab.com:foo/bar/baz.git": "", + "git+ssh://:password@gitlab.com:foo/bar/baz.git#v1.0": "v1.0", + + // ssh urls + // + // NOTE auth is accepted but ignored + // NOTE sub projects are accepted, but the sub project is treated as the project and the real project is lost + "ssh://gitlab.com:foo/bar": "", + "ssh://gitlab.com:foo/bar#v1.0": "v1.0", + "ssh://user@gitlab.com:foo/bar": "", + "ssh://user@gitlab.com:foo/bar#v1.0": "v1.0", + "ssh://user:password@gitlab.com:foo/bar": "", + "ssh://user:password@gitlab.com:foo/bar#v1.0": "v1.0", + "ssh://:password@gitlab.com:foo/bar": "", + "ssh://:password@gitlab.com:foo/bar#v1.0": "v1.0", + + "ssh://gitlab.com:foo/bar.git": "", + "ssh://gitlab.com:foo/bar.git#v1.0": "v1.0", + "ssh://user@gitlab.com:foo/bar.git": "", + "ssh://user@gitlab.com:foo/bar.git#v1.0": "v1.0", + "ssh://user:password@gitlab.com:foo/bar.git": "", + "ssh://user:password@gitlab.com:foo/bar.git#v1.0": "v1.0", + "ssh://:password@gitlab.com:foo/bar.git": "", + "ssh://:password@gitlab.com:foo/bar.git#v1.0": "v1.0", + + "ssh://gitlab.com:foo/bar/baz": "", + "ssh://gitlab.com:foo/bar/baz#v1.0": "v1.0", + "ssh://user@gitlab.com:foo/bar/baz": "", + "ssh://user@gitlab.com:foo/bar/baz#v1.0": "v1.0", + "ssh://user:password@gitlab.com:foo/bar/baz": "", + "ssh://user:password@gitlab.com:foo/bar/baz#v1.0": "v1.0", + "ssh://:password@gitlab.com:foo/bar/baz": "", + "ssh://:password@gitlab.com:foo/bar/baz#v1.0": "v1.0", + + "ssh://gitlab.com:foo/bar/baz.git": "", + "ssh://gitlab.com:foo/bar/baz.git#v1.0": "v1.0", + "ssh://user@gitlab.com:foo/bar/baz.git": "", + "ssh://user@gitlab.com:foo/bar/baz.git#v1.0": "v1.0", + "ssh://user:password@gitlab.com:foo/bar/baz.git": "", + "ssh://user:password@gitlab.com:foo/bar/baz.git#v1.0": "v1.0", + "ssh://:password@gitlab.com:foo/bar/baz.git": "", + "ssh://:password@gitlab.com:foo/bar/baz.git#v1.0": "v1.0", + + // git+https urls + // + // NOTE auth is accepted and respected + // NOTE sub projects are accepted, but the sub project is treated as the project and the real project is lost + "git+https://gitlab.com/foo/bar": "", + "git+https://gitlab.com/foo/bar#v1.0": "v1.0", + "git+https://user@gitlab.com/foo/bar": "", + "git+https://user@gitlab.com/foo/bar#v1.0": "v1.0", + "git+https://user:password@gitlab.com/foo/bar": "", + "git+https://user:password@gitlab.com/foo/bar#v1.0": "v1.0", + "git+https://:password@gitlab.com/foo/bar": "", + "git+https://:password@gitlab.com/foo/bar#v1.0": "v1.0", + + "git+https://gitlab.com/foo/bar.git": "", + "git+https://gitlab.com/foo/bar.git#v1.0": "v1.0", + "git+https://user@gitlab.com/foo/bar.git": "", + "git+https://user@gitlab.com/foo/bar.git#v1.0": "v1.0", + "git+https://user:password@gitlab.com/foo/bar.git": "", + "git+https://user:password@gitlab.com/foo/bar.git#v1.0": "v1.0", + "git+https://:password@gitlab.com/foo/bar.git": "", + "git+https://:password@gitlab.com/foo/bar.git#v1.0": "v1.0", + + "git+https://gitlab.com/foo/bar/baz": "", + "git+https://gitlab.com/foo/bar/baz#v1.0": "v1.0", + "git+https://user@gitlab.com/foo/bar/baz": "", + "git+https://user@gitlab.com/foo/bar/baz#v1.0": "v1.0", + "git+https://user:password@gitlab.com/foo/bar/baz": "", + "git+https://user:password@gitlab.com/foo/bar/baz#v1.0": "v1.0", + "git+https://:password@gitlab.com/foo/bar/baz": "", + "git+https://:password@gitlab.com/foo/bar/baz#v1.0": "v1.0", + + "git+https://gitlab.com/foo/bar/baz.git": "", + "git+https://gitlab.com/foo/bar/baz.git#v1.0": "v1.0", + "git+https://user@gitlab.com/foo/bar/baz.git": "", + "git+https://user@gitlab.com/foo/bar/baz.git#v1.0": "v1.0", + "git+https://user:password@gitlab.com/foo/bar/baz.git": "", + "git+https://user:password@gitlab.com/foo/bar/baz.git#v1.0": "v1.0", + "git+https://:password@gitlab.com/foo/bar/baz.git": "", + "git+https://:password@gitlab.com/foo/bar/baz.git#v1.0": "v1.0", + + // https urls + // + // NOTE auth is accepted and respected + // NOTE sub projects are accepted, but the sub project is treated as the project and the real project is lost + "https://gitlab.com/foo/bar": "", + "https://gitlab.com/foo/bar#v1.0": "v1.0", + "https://user@gitlab.com/foo/bar": "", + "https://user@gitlab.com/foo/bar#v1.0": "v1.0", + "https://user:password@gitlab.com/foo/bar": "", + "https://user:password@gitlab.com/foo/bar#v1.0": "v1.0", + "https://:password@gitlab.com/foo/bar": "", + "https://:password@gitlab.com/foo/bar#v1.0": "v1.0", + + "https://gitlab.com/foo/bar.git": "", + "https://gitlab.com/foo/bar.git#v1.0": "v1.0", + "https://user@gitlab.com/foo/bar.git": "", + "https://user@gitlab.com/foo/bar.git#v1.0": "v1.0", + "https://user:password@gitlab.com/foo/bar.git": "", + "https://user:password@gitlab.com/foo/bar.git#v1.0": "v1.0", + "https://:password@gitlab.com/foo/bar.git": "", + "https://:password@gitlab.com/foo/bar.git#v1.0": "v1.0", + + "https://gitlab.com/foo/bar/baz": "", + "https://gitlab.com/foo/bar/baz#v1.0": "v1.0", + "https://user@gitlab.com/foo/bar/baz": "", + "https://user@gitlab.com/foo/bar/baz#v1.0": "v1.0", + "https://user:password@gitlab.com/foo/bar/baz": "", + "https://user:password@gitlab.com/foo/bar/baz#v1.0": "v1.0", + "https://:password@gitlab.com/foo/bar/baz": "", + "https://:password@gitlab.com/foo/bar/baz#v1.0": "v1.0", + + "https://gitlab.com/foo/bar/baz.git": "", + "https://gitlab.com/foo/bar/baz.git#v1.0": "v1.0", + "https://user@gitlab.com/foo/bar/baz.git": "", + "https://user@gitlab.com/foo/bar/baz.git#v1.0": "v1.0", + "https://user:password@gitlab.com/foo/bar/baz.git": "", + "https://user:password@gitlab.com/foo/bar/baz.git#v1.0": "v1.0", + "https://:password@gitlab.com/foo/bar/baz.git": "", + "https://:password@gitlab.com/foo/bar/baz.git#v1.0": "v1.0" + }; + + const bitbucketInvalid = [ + // invalid protocol + "git://bitbucket.org/foo/bar", + // url to get a tarball + "https://bitbucket.org/foo/bar/get/archive.tar.gz", + // missing project + "https://bitbucket.org/foo" + ]; + + const bitbucketValid = { + // shortcuts + // + // NOTE auth is accepted but ignored + "bitbucket:foo/bar": "", + "bitbucket:foo/bar#v1.0": "v1.0", + "bitbucket:user@foo/bar": "", + "bitbucket:user@foo/bar#v1.0": "v1.0", + "bitbucket:user:password@foo/bar": "", + "bitbucket:user:password@foo/bar#v1.0": "v1.0", + "bitbucket::password@foo/bar": "", + "bitbucket::password@foo/bar#v1.0": "v1.0", + + "bitbucket:foo/bar.git": "", + "bitbucket:foo/bar.git#v1.0": "v1.0", + "bitbucket:user@foo/bar.git": "", + "bitbucket:user@foo/bar.git#v1.0": "v1.0", + "bitbucket:user:password@foo/bar.git": "", + "bitbucket:user:password@foo/bar.git#v1.0": "v1.0", + "bitbucket::password@foo/bar.git": "", + "bitbucket::password@foo/bar.git#v1.0": "v1.0", + + // no-protocol git+ssh + // + // NOTE auth is accepted but ignored + "git@bitbucket.org:foo/bar": "", + "git@bitbucket.org:foo/bar#v1.0": "v1.0", + "user@bitbucket.org:foo/bar": "", + "user@bitbucket.org:foo/bar#v1.0": "v1.0", + "user:password@bitbucket.org:foo/bar": "", + "user:password@bitbucket.org:foo/bar#v1.0": "v1.0", + ":password@bitbucket.org:foo/bar": "", + ":password@bitbucket.org:foo/bar#v1.0": "v1.0", + + "git@bitbucket.org:foo/bar.git": "", + "git@bitbucket.org:foo/bar.git#v1.0": "v1.0", + "user@bitbucket.org:foo/bar.git": "", + "user@bitbucket.org:foo/bar.git#v1.0": "v1.0", + "user:password@bitbucket.org:foo/bar.git": "", + "user:password@bitbucket.org:foo/bar.git#v1.0": "v1.0", + ":password@bitbucket.org:foo/bar.git": "", + ":password@bitbucket.org:foo/bar.git#v1.0": "v1.0", + + // git+ssh urls + // + // NOTE auth is accepted but ignored + "git+ssh://bitbucket.org:foo/bar": "", + "git+ssh://bitbucket.org:foo/bar#v1.0": "v1.0", + "git+ssh://user@bitbucket.org:foo/bar": "", + "git+ssh://user@bitbucket.org:foo/bar#v1.0": "v1.0", + "git+ssh://user:password@bitbucket.org:foo/bar": "", + "git+ssh://user:password@bitbucket.org:foo/bar#v1.0": "v1.0", + "git+ssh://:password@bitbucket.org:foo/bar": "", + "git+ssh://:password@bitbucket.org:foo/bar#v1.0": "v1.0", + + "git+ssh://bitbucket.org:foo/bar.git": "", + "git+ssh://bitbucket.org:foo/bar.git#v1.0": "v1.0", + "git+ssh://user@bitbucket.org:foo/bar.git": "", + "git+ssh://user@bitbucket.org:foo/bar.git#v1.0": "v1.0", + "git+ssh://user:password@bitbucket.org:foo/bar.git": "", + "git+ssh://user:password@bitbucket.org:foo/bar.git#v1.0": "v1.0", + "git+ssh://:password@bitbucket.org:foo/bar.git": "", + "git+ssh://:password@bitbucket.org:foo/bar.git#v1.0": "v1.0", + + // ssh urls + // + // NOTE auth is accepted but ignored + "ssh://bitbucket.org:foo/bar": "", + "ssh://bitbucket.org:foo/bar#v1.0": "v1.0", + "ssh://user@bitbucket.org:foo/bar": "", + "ssh://user@bitbucket.org:foo/bar#v1.0": "v1.0", + "ssh://user:password@bitbucket.org:foo/bar": "", + "ssh://user:password@bitbucket.org:foo/bar#v1.0": "v1.0", + "ssh://:password@bitbucket.org:foo/bar": "", + "ssh://:password@bitbucket.org:foo/bar#v1.0": "v1.0", + + "ssh://bitbucket.org:foo/bar.git": "", + "ssh://bitbucket.org:foo/bar.git#v1.0": "v1.0", + "ssh://user@bitbucket.org:foo/bar.git": "", + "ssh://user@bitbucket.org:foo/bar.git#v1.0": "v1.0", + "ssh://user:password@bitbucket.org:foo/bar.git": "", + "ssh://user:password@bitbucket.org:foo/bar.git#v1.0": "v1.0", + "ssh://:password@bitbucket.org:foo/bar.git": "", + "ssh://:password@bitbucket.org:foo/bar.git#v1.0": "v1.0", + + // git+https urls + // + // NOTE auth is accepted and respected + "git+https://bitbucket.org/foo/bar": "", + "git+https://bitbucket.org/foo/bar#v1.0": "v1.0", + "git+https://user@bitbucket.org/foo/bar": "", + "git+https://user@bitbucket.org/foo/bar#v1.0": "v1.0", + "git+https://user:password@bitbucket.org/foo/bar": "", + "git+https://user:password@bitbucket.org/foo/bar#v1.0": "v1.0", + "git+https://:password@bitbucket.org/foo/bar": "", + "git+https://:password@bitbucket.org/foo/bar#v1.0": "v1.0", + + "git+https://bitbucket.org/foo/bar.git": "", + "git+https://bitbucket.org/foo/bar.git#v1.0": "v1.0", + "git+https://user@bitbucket.org/foo/bar.git": "", + "git+https://user@bitbucket.org/foo/bar.git#v1.0": "v1.0", + "git+https://user:password@bitbucket.org/foo/bar.git": "", + "git+https://user:password@bitbucket.org/foo/bar.git#v1.0": "v1.0", + "git+https://:password@bitbucket.org/foo/bar.git": "", + "git+https://:password@bitbucket.org/foo/bar.git#v1.0": "v1.0", + + // https urls + // + // NOTE auth is accepted and respected + "https://bitbucket.org/foo/bar": "", + "https://bitbucket.org/foo/bar#v1.0": "v1.0", + "https://user@bitbucket.org/foo/bar": "", + "https://user@bitbucket.org/foo/bar#v1.0": "v1.0", + "https://user:password@bitbucket.org/foo/bar": "", + "https://user:password@bitbucket.org/foo/bar#v1.0": "v1.0", + "https://:password@bitbucket.org/foo/bar": "", + "https://:password@bitbucket.org/foo/bar#v1.0": "v1.0", + + "https://bitbucket.org/foo/bar.git": "", + "https://bitbucket.org/foo/bar.git#v1.0": "v1.0", + "https://user@bitbucket.org/foo/bar.git": "", + "https://user@bitbucket.org/foo/bar.git#v1.0": "v1.0", + "https://user:password@bitbucket.org/foo/bar.git": "", + "https://user:password@bitbucket.org/foo/bar.git#v1.0": "v1.0", + "https://:password@bitbucket.org/foo/bar.git": "", + "https://:password@bitbucket.org/foo/bar.git#v1.0": "v1.0" + }; + + const gistInvalid = [ + // raw urls that are wrong anyway but for some reason are in the wild + "https://gist.github.com/foo/feed/raw/fix%2Fbug/", + // missing both user and project + "https://gist.github.com/" + ]; + + const gistValid = { + // shortcuts + // + // NOTE auth is accepted but ignored + "gist:feed": "", + "gist:feed#v1.0": "v1.0", + "gist:user@feed": "", + "gist:user@feed#v1.0": "v1.0", + "gist:user:password@feed": "", + "gist:user:password@feed#v1.0": "v1.0", + "gist::password@feed": "", + "gist::password@feed#v1.0": "v1.0", + + "gist:feed.git": "", + "gist:feed.git#v1.0": "v1.0", + "gist:user@feed.git": "", + "gist:user@feed.git#v1.0": "v1.0", + "gist:user:password@feed.git": "", + "gist:user:password@feed.git#v1.0": "v1.0", + "gist::password@feed.git": "", + "gist::password@feed.git#v1.0": "v1.0", + + "gist:/feed": "", + "gist:/feed#v1.0": "v1.0", + "gist:user@/feed": "", + "gist:user@/feed#v1.0": "v1.0", + "gist:user:password@/feed": "", + "gist:user:password@/feed#v1.0": "v1.0", + "gist::password@/feed": "", + "gist::password@/feed#v1.0": "v1.0", + + "gist:/feed.git": "", + "gist:/feed.git#v1.0": "v1.0", + "gist:user@/feed.git": "", + "gist:user@/feed.git#v1.0": "v1.0", + "gist:user:password@/feed.git": "", + "gist:user:password@/feed.git#v1.0": "v1.0", + "gist::password@/feed.git": "", + "gist::password@/feed.git#v1.0": "v1.0", + + "gist:foo/feed": "", + "gist:foo/feed#v1.0": "v1.0", + "gist:user@foo/feed": "", + "gist:user@foo/feed#v1.0": "v1.0", + "gist:user:password@foo/feed": "", + "gist:user:password@foo/feed#v1.0": "v1.0", + "gist::password@foo/feed": "", + "gist::password@foo/feed#v1.0": "v1.0", + + "gist:foo/feed.git": "", + "gist:foo/feed.git#v1.0": "v1.0", + "gist:user@foo/feed.git": "", + "gist:user@foo/feed.git#v1.0": "v1.0", + "gist:user:password@foo/feed.git": "", + "gist:user:password@foo/feed.git#v1.0": "v1.0", + "gist::password@foo/feed.git": "", + "gist::password@foo/feed.git#v1.0": "v1.0", + + // git urls + // + // NOTE auth is accepted and respected + "git://gist.github.com/feed": "", + "git://gist.github.com/feed#v1.0": "v1.0", + "git://user@gist.github.com/feed": "", + "git://user@gist.github.com/feed#v1.0": "v1.0", + "git://user:password@gist.github.com/feed": "", + "git://user:password@gist.github.com/feed#v1.0": "v1.0", + "git://:password@gist.github.com/feed": "", + "git://:password@gist.github.com/feed#v1.0": "v1.0", + + "git://gist.github.com/feed.git": "", + "git://gist.github.com/feed.git#v1.0": "v1.0", + "git://user@gist.github.com/feed.git": "", + "git://user@gist.github.com/feed.git#v1.0": "v1.0", + "git://user:password@gist.github.com/feed.git": "", + "git://user:password@gist.github.com/feed.git#v1.0": "v1.0", + "git://:password@gist.github.com/feed.git": "", + "git://:password@gist.github.com/feed.git#v1.0": "v1.0", + + "git://gist.github.com/foo/feed": "", + "git://gist.github.com/foo/feed#v1.0": "v1.0", + "git://user@gist.github.com/foo/feed": "", + "git://user@gist.github.com/foo/feed#v1.0": "v1.0", + "git://user:password@gist.github.com/foo/feed": "", + "git://user:password@gist.github.com/foo/feed#v1.0": "v1.0", + "git://:password@gist.github.com/foo/feed": "", + "git://:password@gist.github.com/foo/feed#v1.0": "v1.0", + + "git://gist.github.com/foo/feed.git": "", + "git://gist.github.com/foo/feed.git#v1.0": "v1.0", + "git://user@gist.github.com/foo/feed.git": "", + "git://user@gist.github.com/foo/feed.git#v1.0": "v1.0", + "git://user:password@gist.github.com/foo/feed.git": "", + "git://user:password@gist.github.com/foo/feed.git#v1.0": "v1.0", + "git://:password@gist.github.com/foo/feed.git": "", + "git://:password@gist.github.com/foo/feed.git#v1.0": "v1.0", + + // no-protocol git+ssh + // + // NOTE auth is accepted and ignored + "git@gist.github.com:feed": "", + "git@gist.github.com:feed#v1.0": "v1.0", + "user@gist.github.com:feed": "", + "user@gist.github.com:feed#v1.0": "v1.0", + "user:password@gist.github.com:feed": "", + "user:password@gist.github.com:feed#v1.0": "v1.0", + ":password@gist.github.com:feed": "", + ":password@gist.github.com:feed#v1.0": "v1.0", + + "git@gist.github.com:feed.git": "", + "git@gist.github.com:feed.git#v1.0": "v1.0", + "user@gist.github.com:feed.git": "", + "user@gist.github.com:feed.git#v1.0": "v1.0", + "user:password@gist.github.com:feed.git": "", + "user:password@gist.github.com:feed.git#v1.0": "v1.0", + ":password@gist.github.com:feed.git": "", + ":password@gist.github.com:feed.git#v1.0": "v1.0", + + "git@gist.github.com:foo/feed": "", + "git@gist.github.com:foo/feed#v1.0": "v1.0", + "user@gist.github.com:foo/feed": "", + "user@gist.github.com:foo/feed#v1.0": "v1.0", + "user:password@gist.github.com:foo/feed": "", + "user:password@gist.github.com:foo/feed#v1.0": "v1.0", + ":password@gist.github.com:foo/feed": "", + ":password@gist.github.com:foo/feed#v1.0": "v1.0", + + "git@gist.github.com:foo/feed.git": "", + "git@gist.github.com:foo/feed.git#v1.0": "v1.0", + "user@gist.github.com:foo/feed.git": "", + "user@gist.github.com:foo/feed.git#v1.0": "v1.0", + "user:password@gist.github.com:foo/feed.git": "", + "user:password@gist.github.com:foo/feed.git#v1.0": "v1.0", + ":password@gist.github.com:foo/feed.git": "", + ":password@gist.github.com:foo/feed.git#v1.0": "v1.0", + + // git+ssh urls + // + // NOTE auth is accepted but ignored + // NOTE see TODO at list of invalids, some inputs fail and shouldn't + "git+ssh://gist.github.com:feed": "", + "git+ssh://gist.github.com:feed#v1.0": "v1.0", + "git+ssh://user@gist.github.com:feed": "", + "git+ssh://user@gist.github.com:feed#v1.0": "v1.0", + "git+ssh://user:password@gist.github.com:feed": "", + "git+ssh://user:password@gist.github.com:feed#v1.0": "v1.0", + "git+ssh://:password@gist.github.com:feed": "", + "git+ssh://:password@gist.github.com:feed#v1.0": "v1.0", + + "git+ssh://gist.github.com:feed.git": "", + "git+ssh://gist.github.com:feed.git#v1.0": "v1.0", + "git+ssh://user@gist.github.com:feed.git": "", + "git+ssh://user@gist.github.com:feed.git#v1.0": "v1.0", + "git+ssh://user:password@gist.github.com:feed.git": "", + "git+ssh://user:password@gist.github.com:feed.git#v1.0": "v1.0", + "git+ssh://:password@gist.github.com:feed.git": "", + "git+ssh://:password@gist.github.com:feed.git#v1.0": "v1.0", + + "git+ssh://gist.github.com:foo/feed": "", + "git+ssh://gist.github.com:foo/feed#v1.0": "v1.0", + "git+ssh://user@gist.github.com:foo/feed": "", + "git+ssh://user@gist.github.com:foo/feed#v1.0": "v1.0", + "git+ssh://user:password@gist.github.com:foo/feed": "", + "git+ssh://user:password@gist.github.com:foo/feed#v1.0": "v1.0", + "git+ssh://:password@gist.github.com:foo/feed": "", + "git+ssh://:password@gist.github.com:foo/feed#v1.0": "v1.0", + + "git+ssh://gist.github.com:foo/feed.git": "", + "git+ssh://gist.github.com:foo/feed.git#v1.0": "v1.0", + "git+ssh://user@gist.github.com:foo/feed.git": "", + "git+ssh://user@gist.github.com:foo/feed.git#v1.0": "v1.0", + "git+ssh://user:password@gist.github.com:foo/feed.git": "", + "git+ssh://user:password@gist.github.com:foo/feed.git#v1.0": "v1.0", + "git+ssh://:password@gist.github.com:foo/feed.git": "", + "git+ssh://:password@gist.github.com:foo/feed.git#v1.0": "v1.0", + + // ssh urls + // + // NOTE auth is accepted but ignored + "ssh://gist.github.com:feed": "", + "ssh://gist.github.com:feed#v1.0": "v1.0", + "ssh://user@gist.github.com:feed": "", + "ssh://user@gist.github.com:feed#v1.0": "v1.0", + "ssh://user:password@gist.github.com:feed": "", + "ssh://user:password@gist.github.com:feed#v1.0": "v1.0", + "ssh://:password@gist.github.com:feed": "", + "ssh://:password@gist.github.com:feed#v1.0": "v1.0", + + "ssh://gist.github.com:feed.git": "", + "ssh://gist.github.com:feed.git#v1.0": "v1.0", + "ssh://user@gist.github.com:feed.git": "", + "ssh://user@gist.github.com:feed.git#v1.0": "v1.0", + "ssh://user:password@gist.github.com:feed.git": "", + "ssh://user:password@gist.github.com:feed.git#v1.0": "v1.0", + "ssh://:password@gist.github.com:feed.git": "", + "ssh://:password@gist.github.com:feed.git#v1.0": "v1.0", + + "ssh://gist.github.com:foo/feed": "", + "ssh://gist.github.com:foo/feed#v1.0": "v1.0", + "ssh://user@gist.github.com:foo/feed": "", + "ssh://user@gist.github.com:foo/feed#v1.0": "v1.0", + "ssh://user:password@gist.github.com:foo/feed": "", + "ssh://user:password@gist.github.com:foo/feed#v1.0": "v1.0", + "ssh://:password@gist.github.com:foo/feed": "", + "ssh://:password@gist.github.com:foo/feed#v1.0": "v1.0", + + "ssh://gist.github.com:foo/feed.git": "", + "ssh://gist.github.com:foo/feed.git#v1.0": "v1.0", + "ssh://user@gist.github.com:foo/feed.git": "", + "ssh://user@gist.github.com:foo/feed.git#v1.0": "v1.0", + "ssh://user:password@gist.github.com:foo/feed.git": "", + "ssh://user:password@gist.github.com:foo/feed.git#v1.0": "v1.0", + "ssh://:password@gist.github.com:foo/feed.git": "", + "ssh://:password@gist.github.com:foo/feed.git#v1.0": "v1.0", + + // git+https urls + // + // NOTE auth is accepted and respected + "git+https://gist.github.com/feed": "", + "git+https://gist.github.com/feed#v1.0": "v1.0", + "git+https://user@gist.github.com/feed": "", + "git+https://user@gist.github.com/feed#v1.0": "v1.0", + "git+https://user:password@gist.github.com/feed": "", + "git+https://user:password@gist.github.com/feed#v1.0": "v1.0", + "git+https://:password@gist.github.com/feed": "", + "git+https://:password@gist.github.com/feed#v1.0": "v1.0", + + "git+https://gist.github.com/feed.git": "", + "git+https://gist.github.com/feed.git#v1.0": "v1.0", + "git+https://user@gist.github.com/feed.git": "", + "git+https://user@gist.github.com/feed.git#v1.0": "v1.0", + "git+https://user:password@gist.github.com/feed.git": "", + "git+https://user:password@gist.github.com/feed.git#v1.0": "v1.0", + "git+https://:password@gist.github.com/feed.git": "", + "git+https://:password@gist.github.com/feed.git#v1.0": "v1.0", + + "git+https://gist.github.com/foo/feed": "", + "git+https://gist.github.com/foo/feed#v1.0": "v1.0", + "git+https://user@gist.github.com/foo/feed": "", + "git+https://user@gist.github.com/foo/feed#v1.0": "v1.0", + "git+https://user:password@gist.github.com/foo/feed": "", + "git+https://user:password@gist.github.com/foo/feed#v1.0": "v1.0", + "git+https://:password@gist.github.com/foo/feed": "", + "git+https://:password@gist.github.com/foo/feed#v1.0": "v1.0", + + "git+https://gist.github.com/foo/feed.git": "", + "git+https://gist.github.com/foo/feed.git#v1.0": "v1.0", + "git+https://user@gist.github.com/foo/feed.git": "", + "git+https://user@gist.github.com/foo/feed.git#v1.0": "v1.0", + "git+https://user:password@gist.github.com/foo/feed.git": "", + "git+https://user:password@gist.github.com/foo/feed.git#v1.0": "v1.0", + "git+https://:password@gist.github.com/foo/feed.git": "", + "git+https://:password@gist.github.com/foo/feed.git#v1.0": "v1.0", + + // https urls + // + // NOTE auth is accepted and respected + "https://gist.github.com/feed": "", + "https://gist.github.com/feed#v1.0": "v1.0", + "https://user@gist.github.com/feed": "", + "https://user@gist.github.com/feed#v1.0": "v1.0", + "https://user:password@gist.github.com/feed": "", + "https://user:password@gist.github.com/feed#v1.0": "v1.0", + "https://:password@gist.github.com/feed": "", + "https://:password@gist.github.com/feed#v1.0": "v1.0", + + "https://gist.github.com/feed.git": "", + "https://gist.github.com/feed.git#v1.0": "v1.0", + "https://user@gist.github.com/feed.git": "", + "https://user@gist.github.com/feed.git#v1.0": "v1.0", + "https://user:password@gist.github.com/feed.git": "", + "https://user:password@gist.github.com/feed.git#v1.0": "v1.0", + "https://:password@gist.github.com/feed.git": "", + "https://:password@gist.github.com/feed.git#v1.0": "v1.0", + + "https://gist.github.com/foo/feed": "", + "https://gist.github.com/foo/feed#v1.0": "v1.0", + "https://user@gist.github.com/foo/feed": "", + "https://user@gist.github.com/foo/feed#v1.0": "v1.0", + "https://user:password@gist.github.com/foo/feed": "", + "https://user:password@gist.github.com/foo/feed#v1.0": "v1.0", + "https://:password@gist.github.com/foo/feed": "", + "https://:password@gist.github.com/foo/feed#v1.0": "v1.0", + + "https://gist.github.com/foo/feed.git": "", + "https://gist.github.com/foo/feed.git#v1.0": "v1.0", + "https://user@gist.github.com/foo/feed.git": "", + "https://user@gist.github.com/foo/feed.git#v1.0": "v1.0", + "https://user:password@gist.github.com/foo/feed.git": "", + "https://user:password@gist.github.com/foo/feed.git#v1.0": "v1.0", + "https://:password@gist.github.com/foo/feed.git": "", + "https://:password@gist.github.com/foo/feed.git#v1.0": "v1.0" + }; + + const otherDomainValid = { + "https://other.com/foo/bar.git#v1.0": "v1.0", + "ssh://other.com:foo/bar.git#v1.0": "v1.0", + "user@other.com:foo/bar#v1.0": "v1.0" + }; + + const otherDomainInvalid = ["other:foo/bar#v1.0"]; + + it("should return empty string for some invalid URL deps", () => { + for (const url of commonInvalid) { + expect(normalizeVersion(url)).toBe(""); + } + }); + + it("should get correct version for some valid URL deps", () => { + for (const url of Object.keys(commonValid)) { + expect(normalizeVersion(url)).toBe(commonValid[url]); + } + }); + + it("should return empty string for github invalid URL deps", () => { + for (const url of githubInvalid) { + expect(normalizeVersion(url)).toBe(""); + } + }); + + it("should get correct version for github URL deps", () => { + for (const url of Object.keys(githubValid)) { + expect(normalizeVersion(url)).toBe(githubValid[url]); + } + }); + + it("should return empty string for gitlab invalid URL deps", () => { + for (const url of gitlabInvalid) { + expect(normalizeVersion(url)).toBe(""); + } + }); + + it("should get correct version for gitlab URL deps", () => { + for (const url of Object.keys(gitlabValid)) { + expect(normalizeVersion(url)).toBe(gitlabValid[url]); + } + }); + + it("should return empty string for bitbucket invalid URL deps", () => { + for (const url of bitbucketInvalid) { + expect(normalizeVersion(url)).toBe(""); + } + }); + + it("should get correct version for bitbucket URL deps", () => { + for (const url of Object.keys(bitbucketValid)) { + expect(normalizeVersion(url)).toBe(bitbucketValid[url]); + } + }); + + it("should return empty string for gist invalid URL deps", () => { + for (const url of gistInvalid) { + expect(normalizeVersion(url)).toBe(""); + } + }); + + it("should get correct version for gist URL deps", () => { + for (const url of Object.keys(gistValid)) { + expect(normalizeVersion(url)).toBe(gistValid[url]); + } + }); + + it("should return empty string for other domain invalid URL deps", () => { + for (const url of otherDomainInvalid) { + expect(normalizeVersion(url)).toBe(""); + } + }); + + it("should return correct version for other domain URL deps", () => { + for (const url of Object.keys(otherDomainValid)) { + expect(normalizeVersion(url)).toBe(otherDomainValid[url]); + } + }); +}); diff --git a/test/SideEffectsFlagPlugin.unittest.js b/test/SideEffectsFlagPlugin.unittest.js index a0e9c9830c0..4842ff730cc 100644 --- a/test/SideEffectsFlagPlugin.unittest.js +++ b/test/SideEffectsFlagPlugin.unittest.js @@ -5,16 +5,28 @@ const SideEffectsFlagPlugin = require("../lib/optimize/SideEffectsFlagPlugin"); describe("SideEffectsFlagPlugin", () => { it("should assume true", () => { expect( - SideEffectsFlagPlugin.moduleHasSideEffects("./foo/bar.js", undefined) + SideEffectsFlagPlugin.moduleHasSideEffects( + "./foo/bar.js", + undefined, + new Map() + ) ).toBe(true); }); it("should understand boolean values", () => { expect( - SideEffectsFlagPlugin.moduleHasSideEffects("./foo/bar.js", true) + SideEffectsFlagPlugin.moduleHasSideEffects( + "./foo/bar.js", + true, + new Map() + ) ).toBe(true); expect( - SideEffectsFlagPlugin.moduleHasSideEffects("./foo/bar.js", false) + SideEffectsFlagPlugin.moduleHasSideEffects( + "./foo/bar.js", + false, + new Map() + ) ).toBe(false); }); @@ -22,90 +34,110 @@ describe("SideEffectsFlagPlugin", () => { expect( SideEffectsFlagPlugin.moduleHasSideEffects( "./src/x/y/z.js", - "./src/**/*.js" + "./src/**/*.js", + new Map() ) ).toBe(true); expect( - SideEffectsFlagPlugin.moduleHasSideEffects("./x.js", "./src/**/*.js") + SideEffectsFlagPlugin.moduleHasSideEffects( + "./x.js", + "./src/**/*.js", + new Map() + ) ).toBe(false); expect( SideEffectsFlagPlugin.moduleHasSideEffects( "./src/x/y/z.js", - "./**/src/x/y/z.js" + "./**/src/x/y/z.js", + new Map() ) ).toBe(true); expect( - SideEffectsFlagPlugin.moduleHasSideEffects("./src/x/y/z.js", "**.js") + SideEffectsFlagPlugin.moduleHasSideEffects( + "./src/x/y/z.js", + "**.js", + new Map() + ) ).toBe(true); expect( SideEffectsFlagPlugin.moduleHasSideEffects( "./src/x/y/z.js", - "./src/**/z.js" + "./src/**/z.js", + new Map() ) ).toBe(true); expect( SideEffectsFlagPlugin.moduleHasSideEffects( "./src/x/y/z.js", - "./**/x/**/z.js" + "./**/x/**/z.js", + new Map() ) ).toBe(true); expect( SideEffectsFlagPlugin.moduleHasSideEffects( "./src/x/y/z.js", - "./**/src/**" + "./**/src/**", + new Map() ) ).toBe(true); expect( - SideEffectsFlagPlugin.moduleHasSideEffects("./src/x/y/z.js", "./**/src/*") + SideEffectsFlagPlugin.moduleHasSideEffects( + "./src/x/y/z.js", + "./**/src/*", + new Map() + ) ).toBe(false); expect( - SideEffectsFlagPlugin.moduleHasSideEffects("./src/x/y/z.js", "*.js") + SideEffectsFlagPlugin.moduleHasSideEffects( + "./src/x/y/z.js", + "*.js", + new Map() + ) ).toBe(true); - expect( - SideEffectsFlagPlugin.moduleHasSideEffects("./src/x/y/z.js", "x/**/z.js") - ).toBe(false); expect( SideEffectsFlagPlugin.moduleHasSideEffects( "./src/x/y/z.js", - "src/**/z.js" + "x/**/z.js", + new Map() ) - ).toBe(true); + ).toBe(false); expect( SideEffectsFlagPlugin.moduleHasSideEffects( "./src/x/y/z.js", - "src/**/{x,y,z}.js" + "src/**/z.js", + new Map() ) ).toBe(true); expect( SideEffectsFlagPlugin.moduleHasSideEffects( "./src/x/y/z.js", - "src/**/[x-z].js" + "src/**/{x,y,z}.js", + new Map() ) ).toBe(true); expect( SideEffectsFlagPlugin.moduleHasSideEffects( "./src/x/y/z.js", - "src/**/[[:lower:]].js" + "src/**/[x-z].js", + new Map() ) ).toBe(true); - expect( - SideEffectsFlagPlugin.moduleHasSideEffects("./src/x/y/z.js", "!*.js") - ).toBe(false); - expect( - SideEffectsFlagPlugin.moduleHasSideEffects("./src/x/y/z.js", "!**/*.js") - ).toBe(false); }); it("should understand arrays", () => { const array = ["./src/**/*.js", "./dirty.js"]; expect( - SideEffectsFlagPlugin.moduleHasSideEffects("./src/x/y/z.js", array) + SideEffectsFlagPlugin.moduleHasSideEffects( + "./src/x/y/z.js", + array, + new Map() + ) ).toBe(true); expect( - SideEffectsFlagPlugin.moduleHasSideEffects("./dirty.js", array) + SideEffectsFlagPlugin.moduleHasSideEffects("./dirty.js", array, new Map()) ).toBe(true); expect( - SideEffectsFlagPlugin.moduleHasSideEffects("./clean.js", array) + SideEffectsFlagPlugin.moduleHasSideEffects("./clean.js", array, new Map()) ).toBe(false); }); }); diff --git a/test/SizeFormatHelpers.unittest.js b/test/SizeFormatHelpers.unittest.js index 5fd6558271b..bd17e8419e8 100644 --- a/test/SizeFormatHelpers.unittest.js +++ b/test/SizeFormatHelpers.unittest.js @@ -1,49 +1,44 @@ -/* globals describe, it, beforeEach */ "use strict"; -const SizeFormatHelpers = require("../lib/SizeFormatHelpers"); +const { formatSize } = require("../lib/SizeFormatHelpers"); describe("SizeFormatHelpers", () => { describe("formatSize", () => { it("should handle zero size", () => { - expect(SizeFormatHelpers.formatSize(0)).toBe("0 bytes"); + expect(formatSize(0)).toBe("0 bytes"); }); it("should handle bytes", () => { - expect(SizeFormatHelpers.formatSize(1000)).toBe("1000 bytes"); + expect(formatSize(1000)).toBe("1000 bytes"); }); it("should handle integer kibibytes", () => { - expect(SizeFormatHelpers.formatSize(2048)).toBe("2 KiB"); + expect(formatSize(2048)).toBe("2 KiB"); }); it("should handle float kibibytes", () => { - expect(SizeFormatHelpers.formatSize(2560)).toBe("2.5 KiB"); + expect(formatSize(2560)).toBe("2.5 KiB"); }); it("should handle integer mebibytes", () => { - expect(SizeFormatHelpers.formatSize(10 * 1024 * 1024)).toBe("10 MiB"); + expect(formatSize(10 * 1024 * 1024)).toBe("10 MiB"); }); it("should handle float mebibytes", () => { - expect(SizeFormatHelpers.formatSize(12.5 * 1024 * 1024)).toBe("12.5 MiB"); + expect(formatSize(12.5 * 1024 * 1024)).toBe("12.5 MiB"); }); it("should handle integer gibibytes", () => { - expect(SizeFormatHelpers.formatSize(3 * 1024 * 1024 * 1024)).toBe( - "3 GiB" - ); + expect(formatSize(3 * 1024 * 1024 * 1024)).toBe("3 GiB"); }); it("should handle float gibibytes", () => { - expect(SizeFormatHelpers.formatSize(1.2 * 1024 * 1024 * 1024)).toBe( - "1.2 GiB" - ); + expect(formatSize(1.2 * 1024 * 1024 * 1024)).toBe("1.2 GiB"); }); it("should handle undefined/NaN", () => { - expect(SizeFormatHelpers.formatSize(undefined)).toBe("unknown size"); - expect(SizeFormatHelpers.formatSize(NaN)).toBe("unknown size"); + expect(formatSize()).toBe("unknown size"); + expect(formatSize(Number.NaN)).toBe("unknown size"); }); }); }); diff --git a/test/SortableSet.unittest.js b/test/SortableSet.unittest.js index 66968c3b38d..ea01af72887 100644 --- a/test/SortableSet.unittest.js +++ b/test/SortableSet.unittest.js @@ -1,4 +1,3 @@ -/* globals describe, it */ "use strict"; const SortableSet = require("../lib/util/SortableSet"); diff --git a/test/SourceMapDevToolModuleOptionsPlugin.unittest.js b/test/SourceMapDevToolModuleOptionsPlugin.unittest.js deleted file mode 100644 index dd348267bd8..00000000000 --- a/test/SourceMapDevToolModuleOptionsPlugin.unittest.js +++ /dev/null @@ -1,145 +0,0 @@ -"use strict"; - -const SourceMapDevToolModuleOptionsPlugin = require("../lib/SourceMapDevToolModuleOptionsPlugin"); -const applyPluginWithOptions = require("./helpers/applyPluginWithOptions"); - -describe("SourceMapDevToolModuleOptionsPlugin", () => { - describe("when applied", () => { - let eventBindings; - - beforeEach(() => { - eventBindings = undefined; - }); - - describe("with module false and line-to-line false", () => { - beforeEach(() => { - eventBindings = applyPluginWithOptions( - SourceMapDevToolModuleOptionsPlugin, - { - module: false, - lineToLine: false - } - ); - }); - - it("does not bind any event handlers", () => { - expect(eventBindings.length).toBe(0); - }); - }); - - describe("with module true", () => { - beforeEach(() => { - eventBindings = applyPluginWithOptions( - SourceMapDevToolModuleOptionsPlugin, - { - module: true, - lineToLine: false - } - ); - }); - - it("binds one event handler", () => { - expect(eventBindings.length).toBe(1); - }); - - describe("event handler", () => { - it("binds to build-module event", () => { - expect(eventBindings[0].name).toBe("build-module"); - }); - - it("sets source map flag", () => { - const module = {}; - eventBindings[0].handler(module); - expect(module).toEqual({ - useSourceMap: true - }); - }); - }); - }); - - describe("with line-to-line true", () => { - beforeEach(() => - (eventBindings = applyPluginWithOptions( - SourceMapDevToolModuleOptionsPlugin, - { - module: false, - lineToLine: true - } - ))); - - it("binds one event handler", () => { - expect(eventBindings.length).toBe(1); - }); - - describe("event handler", () => { - it("binds to build-module event", () => { - expect(eventBindings[0].name).toBe("build-module"); - }); - - it("sets line-to-line flag", () => { - const module = {}; - eventBindings[0].handler(module); - expect(module).toEqual({ - lineToLine: true - }); - }); - }); - }); - - describe("with line-to-line object", () => { - beforeEach(() => { - eventBindings = applyPluginWithOptions( - SourceMapDevToolModuleOptionsPlugin, - { - module: false, - lineToLine: {} - } - ); - }); - - it("binds one event handler", () => { - expect(eventBindings.length).toBe(1); - }); - - describe("event handler", () => { - it("binds to build-module event", () => { - expect(eventBindings[0].name).toBe("build-module"); - }); - - describe("when module has no resource", () => { - it("makes no changes", () => { - const module = {}; - eventBindings[0].handler(module); - expect(module).toEqual({}); - }); - }); - - describe("when module has a resource", () => { - it("sets line-to-line flag", () => { - const module = { - resource: "foo" - }; - eventBindings[0].handler(module); - expect(module).toEqual({ - lineToLine: true, - resource: "foo" - }); - }); - }); - - describe("when module has a resource with query", () => { - it("sets line-to-line flag", () => { - const module = { - resource: "foo?bar" - }; - eventBindings[0].handler(module); - expect(module).toEqual({ - lineToLine: true, - resource: "foo?bar" - }); - }); - }); - }); - }); - }); -}); diff --git a/test/Stats.test.js b/test/Stats.test.js index ffe2b8cecfe..7ae75f303bb 100644 --- a/test/Stats.test.js +++ b/test/Stats.test.js @@ -1,48 +1,305 @@ -/*globals describe it */ "use strict"; -const webpack = require("../lib/webpack"); -const MemoryFs = require("memory-fs"); +require("./helpers/warmup-webpack"); + +const { createFsFromVolume, Volume } = require("memfs"); + +const compile = options => + new Promise((resolve, reject) => { + const webpack = require(".."); + const compiler = webpack(options); + compiler.outputFileSystem = createFsFromVolume(new Volume()); + compiler.run((err, stats) => { + if (err) { + reject(err); + } else { + resolve(stats); + } + }); + }); describe("Stats", () => { - it("should print env string in stats", done => { - const compiler = webpack({ + it("should print env string in stats", async () => { + const stats = await compile({ context: __dirname, entry: "./fixtures/a" }); - compiler.outputFileSystem = new MemoryFs(); - compiler.run((err, stats) => { - if (err) return done(err); - try { - expect( - stats.toString({ - all: false, - env: true, - _env: "production" - }) - ).toBe('Environment (--env): "production"'); - expect( - stats.toString({ - all: false, - env: true, - _env: { - prod: ["foo", "bar"], - baz: true - } - }) - ).toBe( - "Environment (--env): {\n" + - ' "prod": [\n' + - ' "foo",\n' + - ' "bar"\n' + - " ],\n" + - ' "baz": true\n' + - "}" - ); - done(); - } catch (e) { - done(e); + expect( + stats.toString({ + all: false, + env: true, + _env: "production" + }) + ).toBe('Environment (--env): "production"'); + expect( + stats.toString({ + all: false, + env: true, + _env: { + prod: ["foo", "bar"], + baz: true + } + }) + ).toBe( + "Environment (--env): {\n" + + ' "prod": [\n' + + ' "foo",\n' + + ' "bar"\n' + + " ],\n" + + ' "baz": true\n' + + "}" + ); + }); + it("should omit all properties with all false", async () => { + const stats = await compile({ + context: __dirname, + entry: "./fixtures/a" + }); + expect( + stats.toJson({ + all: false + }) + ).toEqual({}); + }); + it("should the results of hasWarnings() be affected by ignoreWarnings", async () => { + const stats = await compile({ + mode: "development", + context: __dirname, + entry: "./fixtures/ignoreWarnings/index", + module: { + rules: [ + { + loader: "./fixtures/ignoreWarnings/loader" + } + ] + }, + ignoreWarnings: [/__mocked__warning__/] + }); + expect(stats.hasWarnings()).toBeFalsy(); + }); + describe("chunkGroups", () => { + it("should be empty when there is no additional chunks", async () => { + const stats = await compile({ + context: __dirname, + entry: { + entryA: "./fixtures/a", + entryB: "./fixtures/b" + } + }); + expect( + stats.toJson({ + all: false, + errorsCount: true, + chunkGroups: true + }) + ).toMatchInlineSnapshot(` + Object { + "errorsCount": 0, + "namedChunkGroups": Object { + "entryA": Object { + "assets": Array [ + Object { + "name": "entryA.js", + "size": 196, + }, + ], + "assetsSize": 196, + "auxiliaryAssets": undefined, + "auxiliaryAssetsSize": 0, + "childAssets": undefined, + "children": undefined, + "chunks": undefined, + "filteredAssets": 0, + "filteredAuxiliaryAssets": 0, + "name": "entryA", + }, + "entryB": Object { + "assets": Array [ + Object { + "name": "entryB.js", + "size": 196, + }, + ], + "assetsSize": 196, + "auxiliaryAssets": undefined, + "auxiliaryAssetsSize": 0, + "childAssets": undefined, + "children": undefined, + "chunks": undefined, + "filteredAssets": 0, + "filteredAuxiliaryAssets": 0, + "name": "entryB", + }, + }, + } + `); + }); + it("should contain additional chunks", async () => { + const stats = await compile({ + context: __dirname, + entry: { + entryA: "./fixtures/a", + entryB: "./fixtures/chunk-b" + } + }); + expect( + stats.toJson({ + all: false, + errorsCount: true, + chunkGroups: true + }) + ).toMatchInlineSnapshot(` + Object { + "errorsCount": 0, + "namedChunkGroups": Object { + "chunkB": Object { + "assets": Array [ + Object { + "name": "chunkB.js", + "size": 107, + }, + ], + "assetsSize": 107, + "auxiliaryAssets": undefined, + "auxiliaryAssetsSize": 0, + "childAssets": undefined, + "children": undefined, + "chunks": undefined, + "filteredAssets": 0, + "filteredAuxiliaryAssets": 0, + "name": "chunkB", + }, + "entryA": Object { + "assets": Array [ + Object { + "name": "entryA.js", + "size": 196, + }, + ], + "assetsSize": 196, + "auxiliaryAssets": undefined, + "auxiliaryAssetsSize": 0, + "childAssets": undefined, + "children": undefined, + "chunks": undefined, + "filteredAssets": 0, + "filteredAuxiliaryAssets": 0, + "name": "entryA", + }, + "entryB": Object { + "assets": Array [ + Object { + "name": "entryB.js", + "size": 3081, + }, + ], + "assetsSize": 3081, + "auxiliaryAssets": undefined, + "auxiliaryAssetsSize": 0, + "childAssets": undefined, + "children": undefined, + "chunks": undefined, + "filteredAssets": 0, + "filteredAuxiliaryAssets": 0, + "name": "entryB", + }, + }, + } + `); + }); + it("should contain assets", async () => { + const stats = await compile({ + context: __dirname, + entry: { + entryA: "./fixtures/a", + entryB: "./fixtures/chunk-b" + } + }); + expect( + stats.toJson({ + all: false, + errorsCount: true, + assets: true + }) + ).toMatchInlineSnapshot(` + Object { + "assets": Array [ + Object { + "auxiliaryChunkIdHints": Array [], + "auxiliaryChunkNames": Array [], + "cached": false, + "chunkIdHints": Array [], + "chunkNames": Array [ + "entryB", + ], + "comparedForEmit": false, + "emitted": true, + "filteredRelated": undefined, + "info": Object { + "javascriptModule": false, + "minimized": true, + "size": 3081, + }, + "name": "entryB.js", + "size": 3081, + "type": "asset", + }, + Object { + "auxiliaryChunkIdHints": Array [], + "auxiliaryChunkNames": Array [], + "cached": false, + "chunkIdHints": Array [], + "chunkNames": Array [ + "entryA", + ], + "comparedForEmit": false, + "emitted": true, + "filteredRelated": undefined, + "info": Object { + "javascriptModule": false, + "minimized": true, + "size": 196, + }, + "name": "entryA.js", + "size": 196, + "type": "asset", + }, + Object { + "auxiliaryChunkIdHints": Array [], + "auxiliaryChunkNames": Array [], + "cached": false, + "chunkIdHints": Array [], + "chunkNames": Array [ + "chunkB", + ], + "comparedForEmit": false, + "emitted": true, + "filteredRelated": undefined, + "info": Object { + "javascriptModule": false, + "minimized": true, + "size": 107, + }, + "name": "chunkB.js", + "size": 107, + "type": "asset", + }, + ], + "assetsByChunkName": Object { + "chunkB": Array [ + "chunkB.js", + ], + "entryA": Array [ + "entryA.js", + ], + "entryB": Array [ + "entryB.js", + ], + }, + "errorsCount": 0, + "filteredAssets": undefined, } + `); }); }); }); diff --git a/test/Stats.unittest.js b/test/Stats.unittest.js deleted file mode 100644 index 9ee873f1656..00000000000 --- a/test/Stats.unittest.js +++ /dev/null @@ -1,209 +0,0 @@ -/*globals describe it */ -"use strict"; - -const Stats = require("../lib/Stats"); -const packageJson = require("../package.json"); - -describe( - "Stats", - () => { - describe("formatFilePath", () => { - it("emit the file path and request", () => { - const mockStats = new Stats({ - children: [], - errors: ["firstError"], - hash: "1234", - compiler: { - context: "" - } - }); - const inputPath = - "./node_modules/ts-loader!./node_modules/vue-loader/lib/selector.js?type=script&index=0!./src/app.vue"; - const expectPath = `./src/app.vue (${inputPath})`; - - expect(mockStats.formatFilePath(inputPath)).toBe(expectPath); - }); - }); - - describe("Error Handling", () => { - describe("does have", () => { - it("hasErrors", () => { - const mockStats = new Stats({ - children: [], - errors: ["firstError"], - hash: "1234", - compiler: { - context: "" - } - }); - expect(mockStats.hasErrors()).toBe(true); - }); - it("hasWarnings", () => { - const mockStats = new Stats({ - children: [], - warnings: ["firstError"], - hash: "1234", - compiler: { - context: "" - } - }); - expect(mockStats.hasWarnings()).toBe(true); - }); - }); - describe("does not have", () => { - it("hasErrors", () => { - const mockStats = new Stats({ - children: [], - errors: [], - hash: "1234", - compiler: { - context: "" - } - }); - expect(mockStats.hasErrors()).toBe(false); - }); - it("hasWarnings", () => { - const mockStats = new Stats({ - children: [], - warnings: [], - hash: "1234", - compiler: { - context: "" - } - }); - expect(mockStats.hasWarnings()).toBe(false); - }); - }); - describe("children have", () => { - it("hasErrors", () => { - const mockStats = new Stats({ - children: [ - { - getStats: () => - new Stats({ - errors: ["firstError"], - hash: "5678" - }) - } - ], - errors: [], - hash: "1234" - }); - expect(mockStats.hasErrors()).toBe(true); - }); - it("hasWarnings", () => { - const mockStats = new Stats({ - children: [ - { - getStats: () => - new Stats({ - warnings: ["firstError"], - hash: "5678" - }) - } - ], - warnings: [], - hash: "1234" - }); - expect(mockStats.hasWarnings()).toBe(true); - }); - }); - it("formatError handles string errors", () => { - const mockStats = new Stats({ - errors: ["firstError"], - warnings: [], - assets: [], - entrypoints: new Map(), - namedChunkGroups: new Map(), - chunks: [], - modules: [], - children: [], - hash: "1234", - mainTemplate: { - outputOptions: { - path: "" - }, - getPublicPath: () => "path" - }, - compiler: { - context: "" - } - }); - const obj = mockStats.toJson(); - expect(obj.errors[0]).toEqual("firstError"); - }); - }); - describe("toJson", () => { - it("returns plain object representation", () => { - const mockStats = new Stats({ - errors: [], - warnings: [], - assets: [], - entrypoints: new Map(), - chunks: [], - namedChunkGroups: new Map(), - modules: [], - children: [], - hash: "1234", - mainTemplate: { - outputOptions: { - path: "/" - }, - getPublicPath: () => "path" - }, - compiler: { - context: "" - } - }); - const result = mockStats.toJson(); - expect(result).toEqual({ - assets: [], - assetsByChunkName: {}, - children: [], - chunks: [], - entrypoints: {}, - namedChunkGroups: {}, - filteredAssets: 0, - filteredModules: 0, - errors: [], - hash: "1234", - modules: [], - outputPath: "/", - publicPath: "path", - version: packageJson.version, - warnings: [] - }); - }); - }); - describe("Presets", () => { - describe("presetToOptions", () => { - it("returns correct object with 'Normal'", () => { - expect(Stats.presetToOptions("Normal")).toEqual({}); - }); - it("truthy values behave as 'normal'", () => { - const normalOpts = Stats.presetToOptions("normal"); - expect(Stats.presetToOptions("pizza")).toEqual(normalOpts); - expect(Stats.presetToOptions(true)).toEqual(normalOpts); - expect(Stats.presetToOptions(1)).toEqual(normalOpts); - - expect(Stats.presetToOptions("verbose")).not.toEqual(normalOpts); - expect(Stats.presetToOptions(false)).not.toEqual(normalOpts); - }); - it("returns correct object with 'none'", () => { - expect(Stats.presetToOptions("none")).toEqual({ - all: false - }); - }); - it("falsy values behave as 'none'", () => { - const noneOpts = Stats.presetToOptions("none"); - expect(Stats.presetToOptions("")).toEqual(noneOpts); - expect(Stats.presetToOptions(null)).toEqual(noneOpts); - expect(Stats.presetToOptions()).toEqual(noneOpts); - expect(Stats.presetToOptions(0)).toEqual(noneOpts); - expect(Stats.presetToOptions(false)).toEqual(noneOpts); - }); - }); - }); - }, - 10000 -); diff --git a/test/StatsTestCases.basictest.js b/test/StatsTestCases.basictest.js new file mode 100644 index 00000000000..534178493e1 --- /dev/null +++ b/test/StatsTestCases.basictest.js @@ -0,0 +1,229 @@ +"use strict"; + +require("./helpers/warmup-webpack"); +const path = require("path"); +const fs = require("graceful-fs"); +const rimraf = require("rimraf"); +const captureStdio = require("./helpers/captureStdio"); +const webpack = require(".."); + +/** + * Escapes regular expression metacharacters + * @param {string} str String to quote + * @returns {string} Escaped string + */ +const quoteMeta = str => str.replace(/[-[\]\\/{}()*+?.^$|]/g, "\\$&"); + +const base = path.join(__dirname, "statsCases"); +const outputBase = path.join(__dirname, "js", "stats"); +const tests = fs + .readdirSync(base) + .filter( + testName => + fs.existsSync(path.join(base, testName, "index.js")) || + fs.existsSync(path.join(base, testName, "webpack.config.js")) + ) + .filter(testName => { + const testDirectory = path.join(base, testName); + const filterPath = path.join(testDirectory, "test.filter.js"); + if (fs.existsSync(filterPath) && !require(filterPath)()) { + // eslint-disable-next-line jest/no-disabled-tests, jest/valid-describe-callback + describe.skip(testName, () => it("filtered", () => {})); + return false; + } + return true; + }); + +describe("StatsTestCases", () => { + jest.setTimeout(30000); + let stderr; + beforeEach(() => { + stderr = captureStdio(process.stderr, true); + }); + afterEach(() => { + stderr.restore(); + }); + for (const testName of tests) { + // eslint-disable-next-line no-loop-func + it(`should print correct stats for ${testName}`, done => { + const outputDirectory = path.join(outputBase, testName); + rimraf.sync(outputDirectory); + fs.mkdirSync(outputDirectory, { recursive: true }); + let options = { + mode: "development", + entry: "./index", + output: { + filename: "bundle.js" + } + }; + if (fs.existsSync(path.join(base, testName, "webpack.config.js"))) { + options = require(path.join(base, testName, "webpack.config.js")); + } + let testConfig = {}; + try { + // try to load a test file + testConfig = Object.assign( + testConfig, + require(path.join(base, testName, "test.config.js")) + ); + } catch (_err) { + // ignored + } + + const resolvedOptions = Array.isArray(options) ? options : [options]; + for (const options of resolvedOptions) { + if (!options.context) options.context = path.join(base, testName); + if (!options.output) options.output = options.output || {}; + if (!options.output.path) options.output.path = outputDirectory; + if (!options.plugins) options.plugins = []; + if (!options.optimization) options.optimization = {}; + if (options.optimization.minimize === undefined) + options.optimization.minimize = false; + if ( + options.cache && + options.cache !== true && + options.cache.type === "filesystem" + ) { + options.cache.cacheDirectory = path.resolve( + outputBase, + ".cache", + testName + ); + } + } + const c = webpack(options); + const compilers = c.compilers ? c.compilers : [c]; + for (const c of compilers) { + const ifs = c.inputFileSystem; + c.inputFileSystem = Object.create(ifs); + c.inputFileSystem.readFile = function () { + // eslint-disable-next-line prefer-rest-params + const args = Array.prototype.slice.call(arguments); + const callback = args.pop(); + // eslint-disable-next-line prefer-spread + ifs.readFile.apply( + ifs, + args.concat([ + (err, result) => { + if (err) return callback(err); + if (!/\.(js|json|txt)$/.test(args[0])) + return callback(null, result); + callback(null, result.toString("utf-8").replace(/\r/g, "")); + } + ]) + ); + }; + c.hooks.compilation.tap("StatsTestCasesTest", compilation => { + for (const hook of [ + "optimize", + "optimizeModules", + "optimizeChunks", + "afterOptimizeTree", + "afterOptimizeAssets", + "beforeHash" + ]) { + compilation.hooks[hook].tap("TestCasesTest", () => + compilation.checkConstraints() + ); + } + }); + } + c.run((err, stats) => { + if (err) return done(err); + for (const compilation of [] + .concat(stats.stats || stats) + .map(s => s.compilation)) { + compilation.logging.delete("webpack.Compilation.ModuleProfile"); + } + expect(stats.hasErrors()).toBe(testName.endsWith("error")); + if (!testName.endsWith("error") && stats.hasErrors()) { + return done( + new Error( + stats.toString({ + all: false, + errors: true, + errorStack: true, + errorDetails: true + }) + ) + ); + } + fs.writeFileSync( + path.join(outputBase, testName, "stats.txt"), + stats.toString({ + preset: "verbose", + context: path.join(base, testName), + colors: false + }), + "utf-8" + ); + + let toStringOptions = { + context: path.join(base, testName), + colors: false + }; + let hasColorSetting = false; + if (typeof c.options.stats !== "undefined") { + toStringOptions = c.options.stats; + if (toStringOptions === null || typeof toStringOptions !== "object") + toStringOptions = { preset: toStringOptions }; + if (!toStringOptions.context) + toStringOptions.context = path.join(base, testName); + hasColorSetting = typeof toStringOptions.colors !== "undefined"; + } + if (Array.isArray(c.options) && !toStringOptions.children) { + toStringOptions.children = c.options.map(o => o.stats); + } + // mock timestamps + for (const { compilation: s } of [].concat(stats.stats || stats)) { + expect(s.startTime).toBeGreaterThan(0); + expect(s.endTime).toBeGreaterThan(0); + s.endTime = new Date("04/20/1970, 12:42:42 PM").getTime(); + s.startTime = s.endTime - 1234; + } + let actual = stats.toString(toStringOptions); + expect(typeof actual).toBe("string"); + if (!hasColorSetting) { + actual = stderr.toString() + actual; + actual = actual + .replace(/\u001B\[[0-9;]*m/g, "") + .replace(/[.0-9]+(\s?ms)/g, "X$1"); + } else { + actual = stderr.toStringRaw() + actual; + actual = actual + .replace(/\u001B\[1m\u001B\[([0-9;]*)m/g, "") + .replace(/\u001B\[1m/g, "") + .replace(/\u001B\[39m\u001B\[22m/g, "") + .replace(/\u001B\[([0-9;]*)m/g, "") + .replace(/[.0-9]+(<\/CLR>)?(\s?ms)/g, "X$1$2"); + } + // cspell:ignore Xdir + const testPath = path.join(base, testName); + actual = actual + .replace(/\r\n?/g, "\n") + .replace(/webpack [^ )]+(\)?) compiled/g, "webpack x.x.x$1 compiled") + .replace(new RegExp(quoteMeta(testPath), "g"), `Xdir/${testName}`) + .replace(/(\w)\\(\w)/g, "$1/$2") + .replace(/, additional resolving: X ms/g, "") + .replace(/Unexpected identifier '.+?'/g, "Unexpected identifier") + .replace(/[.0-9]+(\s?(bytes|KiB|MiB|GiB))/g, "X$1") + .replace( + /ms\s\([0-9a-f]{6,32}\)|(?![0-9]+-)[0-9a-f-]{6,32}\./g, + match => `${match.replace(/[0-9a-f]/g, "X")}` + ); + expect(actual).toMatchSnapshot(); + + if (testConfig.validate) { + try { + testConfig.validate(stats, stderr.toString()); + } catch (err) { + done(err); + return; + } + } + + done(); + }); + }); + } +}); diff --git a/test/StatsTestCases.test.js b/test/StatsTestCases.test.js deleted file mode 100644 index f0ca3ae0e6e..00000000000 --- a/test/StatsTestCases.test.js +++ /dev/null @@ -1,134 +0,0 @@ -/*globals describe it */ -"use strict"; - -const path = require("path"); -const fs = require("fs"); - -const webpack = require("../lib/webpack"); -const Stats = require("../lib/Stats"); - -const base = path.join(__dirname, "statsCases"); -const outputBase = path.join(__dirname, "js", "stats"); -const tests = fs - .readdirSync(base) - .filter( - testName => - fs.existsSync(path.join(base, testName, "index.js")) || - fs.existsSync(path.join(base, testName, "webpack.config.js")) - ) - .filter(testName => { - const testDirectory = path.join(base, testName); - const filterPath = path.join(testDirectory, "test.filter.js"); - if (fs.existsSync(filterPath) && !require(filterPath)()) { - describe.skip(testName, () => it("filtered")); - return false; - } - return true; - }); - -describe("StatsTestCases", () => { - tests.forEach(testName => { - it("should print correct stats for " + testName, done => { - jest.setTimeout(10000); - let options = { - mode: "development", - entry: "./index", - output: { - filename: "bundle.js" - } - }; - if (fs.existsSync(path.join(base, testName, "webpack.config.js"))) { - options = require(path.join(base, testName, "webpack.config.js")); - } - (Array.isArray(options) ? options : [options]).forEach(options => { - if (!options.context) options.context = path.join(base, testName); - if (!options.output) options.output = options.output || {}; - if (!options.output.path) - options.output.path = path.join(outputBase, testName); - if (!options.plugins) options.plugins = []; - if (!options.optimization) options.optimization = {}; - if (options.optimization.minimize === undefined) - options.optimization.minimize = false; - // To support deprecated loaders - // TODO remove in webpack 5 - options.plugins.push( - new webpack.LoaderOptionsPlugin({ - options: {} - }) - ); - }); - const c = webpack(options); - const compilers = c.compilers ? c.compilers : [c]; - compilers.forEach(c => { - const ifs = c.inputFileSystem; - c.inputFileSystem = Object.create(ifs); - c.inputFileSystem.readFile = function() { - const args = Array.prototype.slice.call(arguments); - const callback = args.pop(); - ifs.readFile.apply( - ifs, - args.concat([ - (err, result) => { - if (err) return callback(err); - callback(null, result.toString("utf-8").replace(/\r/g, "")); - } - ]) - ); - }; - }); - c.run((err, stats) => { - if (err) return done(err); - if (/error$/.test(testName)) { - expect(stats.hasErrors()).toBe(true); - } else if (stats.hasErrors()) { - return done(new Error(stats.toJson().errors.join("\n\n"))); - } - let toStringOptions = { - context: path.join(base, testName), - colors: false - }; - let hasColorSetting = false; - if (typeof options.stats !== "undefined") { - toStringOptions = options.stats; - if (toStringOptions === null || typeof toStringOptions !== "object") - toStringOptions = Stats.presetToOptions(toStringOptions); - hasColorSetting = typeof options.stats.colors !== "undefined"; - if (!toStringOptions.context) - toStringOptions.context = path.join(base, testName); - } - if (Array.isArray(options) && !toStringOptions.children) { - toStringOptions.children = options.map(o => o.stats); - } - let actual = stats.toString(toStringOptions); - expect(typeof actual).toBe("string"); - if (!hasColorSetting) { - actual = actual - .replace(/\u001b\[[0-9;]*m/g, "") - .replace(/[0-9]+(\s?ms)/g, "X$1") - .replace( - /^(\s*Built at:) (.*)$/gm, - "$1 Thu Jan 01 1970 00:00:00 GMT" - ); - } else { - actual = actual - .replace(/\u001b\[1m\u001b\[([0-9;]*)m/g, "") - .replace(/\u001b\[1m/g, "") - .replace(/\u001b\[39m\u001b\[22m/g, "") - .replace(/\u001b\[([0-9;]*)m/g, "") - .replace(/[0-9]+(<\/CLR>)?(\s?ms)/g, "X$1$2") - .replace( - /^(\s*Built at:) (.*)$/gm, - "$1 Thu Jan 01 1970 00:00:00 GMT" - ); - } - actual = actual - .replace(/\r\n?/g, "\n") - .replace(/[\t ]*Version:.+\n/g, "") - .replace(path.join(base, testName), "Xdir/" + testName) - .replace(/ dependencies:Xms/g, ""); - expect(actual).toMatchSnapshot(); - done(); - }); - }); - }); -}); diff --git a/test/Template.unittest.js b/test/Template.unittest.js index 8b744e9c58c..7740884ac15 100644 --- a/test/Template.unittest.js +++ b/test/Template.unittest.js @@ -10,12 +10,13 @@ describe("Template", () => { const items = []; let item; for (let i = 0; i < 80; i += 1) { - item = Template.numberToIdentifer(i); + item = Template.numberToIdentifier(i); expect(item).not.toBe(""); expect(items).not.toContain(item); items.push(item); } }); + // cspell:ignore sdfas sadfome it("should generate sanitized path identifiers", () => { expect(Template.toPath("path/to-sdfas/sadfome$$.js")).toBe( "path-to-sdfas-sadfome$$-js" diff --git a/test/TestCases.template.js b/test/TestCases.template.js index fbcfc55414f..9c4b9768730 100644 --- a/test/TestCases.template.js +++ b/test/TestCases.template.js @@ -1,258 +1,530 @@ -/* global describe it beforeAll expect */ "use strict"; +require("./helpers/warmup-webpack"); const path = require("path"); -const fs = require("fs"); +const fs = require("graceful-fs"); const vm = require("vm"); -const mkdirp = require("mkdirp"); -const TerserPlugin = require("terser-webpack-plugin"); +const { pathToFileURL, URL } = require("url"); +const rimraf = require("rimraf"); const checkArrayExpectation = require("./checkArrayExpectation"); const createLazyTestEnv = require("./helpers/createLazyTestEnv"); - -const Stats = require("../lib/Stats"); -const webpack = require("../lib/webpack"); - -const terserForTesting = new TerserPlugin({ - cache: false, - parallel: false, - sourceMap: true -}); - -const DEFAULT_OPTIMIZATIONS = { - removeAvailableModules: true, - removeEmptyChunks: true, - mergeDuplicateChunks: true, - flagIncludedChunks: true, - occurrenceOrder: true, - sideEffects: true, - providedExports: true, - usedExports: true, - noEmitOnErrors: false, - concatenateModules: false, - namedModules: false, - hashedModuleIds: false, - minimizer: [terserForTesting] -}; - -const NO_EMIT_ON_ERRORS_OPTIMIZATIONS = { - noEmitOnErrors: false, - minimizer: [terserForTesting] -}; +const deprecationTracking = require("./helpers/deprecationTracking"); +const captureStdio = require("./helpers/captureStdio"); +const asModule = require("./helpers/asModule"); +const filterInfraStructureErrors = require("./helpers/infrastructureLogErrors"); const casesPath = path.join(__dirname, "cases"); let categories = fs.readdirSync(casesPath); -categories = categories.map(cat => { - return { - name: cat, - tests: fs - .readdirSync(path.join(casesPath, cat)) - .filter(folder => folder.indexOf("_") < 0) - }; +categories = categories.map(cat => ({ + name: cat, + tests: fs + .readdirSync(path.join(casesPath, cat)) + .filter(folder => !folder.includes("_")) +})); + +const createLogger = appendTarget => ({ + log: l => appendTarget.push(l), + debug: l => appendTarget.push(l), + trace: l => appendTarget.push(l), + info: l => appendTarget.push(l), + warn: console.warn.bind(console), + error: console.error.bind(console), + logTime: () => {}, + group: () => {}, + groupCollapsed: () => {}, + groupEnd: () => {}, + profile: () => {}, + profileEnd: () => {}, + clear: () => {}, + status: () => {} }); const describeCases = config => { describe(config.name, () => { - categories.forEach(category => { - describe(category.name, function() { + let stderr; + beforeEach(() => { + stderr = captureStdio(process.stderr, true); + }); + afterEach(() => { + stderr.restore(); + }); + for (const category of categories) { + // eslint-disable-next-line no-loop-func + describe(category.name, function () { jest.setTimeout(20000); - category.tests - .filter(test => { - const testDirectory = path.join(casesPath, category.name, test); - const filterPath = path.join(testDirectory, "test.filter.js"); - if (fs.existsSync(filterPath) && !require(filterPath)(config)) { - describe.skip(test, () => it("filtered")); - return false; + for (const testName of category.tests.filter(test => { + const testDirectory = path.join(casesPath, category.name, test); + const filterPath = path.join(testDirectory, "test.filter.js"); + if (fs.existsSync(filterPath) && !require(filterPath)(config)) { + // eslint-disable-next-line jest/no-disabled-tests + describe.skip(test, () => { + it("filtered", () => {}); + }); + return false; + } + return true; + })) { + const infraStructureLog = []; + + // eslint-disable-next-line no-loop-func + describe(testName, () => { + const testDirectory = path.join(casesPath, category.name, testName); + const outputDirectory = path.join( + __dirname, + "js", + config.name, + category.name, + testName + ); + const cacheDirectory = path.join( + __dirname, + "js/.cache", + config.name, + category.name, + testName + ); + let testConfig = {}; + const testConfigPath = path.join(testDirectory, "test.config.js"); + if (fs.existsSync(testConfigPath)) { + testConfig = require(testConfigPath); } - return true; - }) - .forEach(testName => { - describe(testName, () => { - const testDirectory = path.join( - casesPath, - category.name, - testName - ); - const outputDirectory = path.join( - __dirname, - "js", - config.name, - category.name, - testName - ); - const options = { - context: casesPath, - entry: "./" + category.name + "/" + testName + "/index", - target: "async-node", - devtool: config.devtool, - mode: config.mode || "none", - optimization: config.mode - ? NO_EMIT_ON_ERRORS_OPTIMIZATIONS - : Object.assign( - {}, - config.optimization, - DEFAULT_OPTIMIZATIONS - ), - performance: { - hints: false - }, - output: { - pathinfo: true, - path: outputDirectory, - filename: "bundle.js" - }, - resolve: { - modules: ["web_modules", "node_modules"], - mainFields: [ - "webpack", - "browser", - "web", - "browserify", - ["jam", "main"], - "main" - ], - aliasFields: ["browser"], - extensions: [ - ".mjs", - ".webpack.js", - ".web.js", - ".js", - ".json" - ], - concord: true - }, - resolveLoader: { - modules: [ - "web_loaders", - "web_modules", - "node_loaders", - "node_modules" - ], - mainFields: ["webpackLoader", "webLoader", "loader", "main"], - extensions: [ - ".webpack-loader.js", - ".web-loader.js", - ".loader.js", - ".js" - ] - }, - module: { - rules: [ - { - test: /\.coffee$/, - loader: "coffee-loader" - }, - { - test: /\.pug/, - loader: "pug-loader" - }, - { - test: /\.wat$/i, - loader: "wast-loader", - type: "webassembly/experimental" - } - ] - }, - plugins: (config.plugins || []).concat(function() { - this.hooks.compilation.tap("TestCasesTest", compilation => { - [ - "optimize", - "optimizeModulesBasic", - "optimizeChunksBasic", - "afterOptimizeTree", - "afterOptimizeAssets" - ].forEach(hook => { - compilation.hooks[hook].tap("TestCasesTest", () => - compilation.checkConstraints() - ); - }); - }); - }) - }; + const TerserPlugin = require("terser-webpack-plugin"); + const terserForTesting = new TerserPlugin({ + parallel: false + }); + let options = { + context: casesPath, + entry: `./${category.name}/${testName}/`, + target: config.target || "async-node", + devtool: config.devtool, + mode: config.mode || "none", + optimization: config.mode + ? { + emitOnErrors: true, + minimizer: [terserForTesting], + ...config.optimization + } + : { + removeAvailableModules: true, + removeEmptyChunks: true, + mergeDuplicateChunks: true, + flagIncludedChunks: true, + sideEffects: true, + providedExports: true, + usedExports: true, + mangleExports: true, + emitOnErrors: true, + concatenateModules: false, + moduleIds: "size", + chunkIds: "size", + minimizer: [terserForTesting], + ...config.optimization + }, + performance: { + hints: false + }, + node: { + __dirname: "mock", + __filename: "mock" + }, + cache: config.cache && { + cacheDirectory, + ...config.cache + }, + output: { + pathinfo: "verbose", + path: outputDirectory, + filename: config.module ? "bundle.mjs" : "bundle.js" + }, + resolve: { + modules: ["web_modules", "node_modules"], + mainFields: [ + "webpack", + "browser", + "web", + "browserify", + ["jam", "main"], + "main" + ], + aliasFields: ["browser"], + extensions: [".webpack.js", ".web.js", ".js", ".json"] + }, + resolveLoader: { + modules: [ + "web_loaders", + "web_modules", + "node_loaders", + "node_modules" + ], + mainFields: ["webpackLoader", "webLoader", "loader", "main"], + extensions: [ + ".webpack-loader.js", + ".web-loader.js", + ".loader.js", + ".js" + ] + }, + module: { + rules: [ + { + test: /\.coffee$/, + loader: "coffee-loader" + }, + { + test: /\.pug/, + loader: "pug-loader" + }, + { + test: /\.wat$/i, + loader: "wast-loader", + type: "webassembly/async" + } + ] + }, + plugins: (config.plugins || []).concat(function () { + this.hooks.compilation.tap("TestCasesTest", compilation => { + for (const hook of [ + "optimize", + "optimizeModules", + "optimizeChunks", + "afterOptimizeTree", + "afterOptimizeAssets" + ]) { + compilation.hooks[hook].tap("TestCasesTest", () => + compilation.checkConstraints() + ); + } + }); + }), + experiments: { + asyncWebAssembly: true, + topLevelAwait: true, + backCompat: false, + ...(config.module ? { outputModule: true } : {}) + }, + infrastructureLogging: config.cache && { + debug: true, + console: createLogger(infraStructureLog) + } + }; + const cleanups = []; + afterAll(() => { + options = undefined; + testConfig = undefined; + for (const fn of cleanups) fn(); + }); + beforeAll(done => { + rimraf(cacheDirectory, done); + }); + if (config.cache) { it( - testName + " should compile", + `${testName} should pre-compile to fill disk cache (1st)`, done => { - webpack(options, (err, stats) => { - if (err) done(err); - const statOptions = Stats.presetToOptions("verbose"); - statOptions.colors = false; - mkdirp.sync(outputDirectory); - fs.writeFileSync( - path.join(outputDirectory, "stats.txt"), - stats.toString(statOptions), - "utf-8" + const oldPath = options.output.path; + options.output.path = path.join( + options.output.path, + "cache1" + ); + infraStructureLog.length = 0; + const deprecationTracker = deprecationTracking.start(); + const webpack = require(".."); + webpack(options, err => { + deprecationTracker(); + options.output.path = oldPath; + if (err) return done(err); + const infrastructureLogErrors = filterInfraStructureErrors( + infraStructureLog, + { + run: 1, + options + } ); - const jsonStats = stats.toJson({ - errorDetails: true - }); if ( + infrastructureLogErrors.length && checkArrayExpectation( testDirectory, - jsonStats, - "error", - "Error", + { infrastructureLogs: infrastructureLogErrors }, + "infrastructureLog", + "infrastructure-log", + "InfrastructureLog", + options, done ) - ) + ) { return; + } + done(); + }); + }, + testConfig.timeout || 60000 + ); + it( + `${testName} should pre-compile to fill disk cache (2nd)`, + done => { + const oldPath = options.output.path; + options.output.path = path.join( + options.output.path, + "cache2" + ); + infraStructureLog.length = 0; + const deprecationTracker = deprecationTracking.start(); + const webpack = require(".."); + webpack(options, err => { + deprecationTracker(); + options.output.path = oldPath; + if (err) return done(err); + const infrastructureLogErrors = filterInfraStructureErrors( + infraStructureLog, + { + run: 2, + options + } + ); if ( + infrastructureLogErrors.length && checkArrayExpectation( testDirectory, - jsonStats, - "warning", - "Warning", + { infrastructureLogs: infrastructureLogErrors }, + "infrastructureLog", + "infrastructure-log", + "InfrastructureLog", + options, done ) - ) + ) { return; - - function _require(module) { - if (module.substr(0, 2) === "./") { - const p = path.join(outputDirectory, module); - const fn = vm.runInThisContext( - "(function(require, module, exports, __dirname, it, expect) {" + - "global.expect = expect;" + - 'function nsObj(m) { Object.defineProperty(m, Symbol.toStringTag, { value: "Module" }); return m; }' + - fs.readFileSync(p, "utf-8") + - "\n})", - p - ); - const m = { - exports: {}, - webpackTestSuiteModule: true - }; - fn.call( - m.exports, - _require, - m, - m.exports, - outputDirectory, - _it, - expect - ); - return m.exports; - } else return require(module); } - _require.webpackTestSuiteRequire = true; - _require("./bundle.js"); - if (getNumberOfTests() === 0) - return done(new Error("No tests exported by test case")); - done(); }); }, - 60000 + testConfig.cachedTimeout || testConfig.timeout || 10000 ); + } + it( + `${testName} should compile`, + done => { + infraStructureLog.length = 0; + const webpack = require(".."); + const compiler = webpack(options); + const run = () => { + const deprecationTracker = deprecationTracking.start(); + compiler.run((err, stats) => { + const deprecations = deprecationTracker(); + if (err) return done(err); + const infrastructureLogErrors = filterInfraStructureErrors( + infraStructureLog, + { + run: 3, + options + } + ); + if ( + infrastructureLogErrors.length && + checkArrayExpectation( + testDirectory, + { infrastructureLogs: infrastructureLogErrors }, + "infrastructureLog", + "infrastructure-log", + "InfrastructureLog", + options, + done + ) + ) { + return; + } + compiler.close(err => { + if (err) return done(err); + const statOptions = { + preset: "verbose", + colors: false, + modules: true, + reasonsSpace: 1000 + }; + fs.mkdirSync(outputDirectory, { recursive: true }); + fs.writeFileSync( + path.join(outputDirectory, "stats.txt"), + stats.toString(statOptions), + "utf-8" + ); + const jsonStats = stats.toJson({ + errorDetails: true, + modules: false, + assets: false, + chunks: false + }); + if ( + checkArrayExpectation( + testDirectory, + jsonStats, + "error", + "Error", + options, + done + ) + ) { + return; + } + if ( + checkArrayExpectation( + testDirectory, + jsonStats, + "warning", + "Warning", + options, + done + ) + ) { + return; + } + const infrastructureLogging = stderr.toString(); + if (infrastructureLogging) { + done( + new Error( + `Errors/Warnings during build:\n${ + infrastructureLogging + }` + ) + ); + } - const { it: _it, getNumberOfTests } = createLazyTestEnv( - jasmine.getEnv(), - 10000 - ); - }); + expect(deprecations).toEqual(config.deprecations || []); + + Promise.resolve().then(done); + }); + }); + }; + if (config.cache) { + // pre-compile to fill memory cache + const deprecationTracker = deprecationTracking.start(); + compiler.run(err => { + deprecationTracker(); + if (err) return done(err); + run(); + }); + } else { + run(); + } + }, + testConfig.cachedTimeout || + testConfig.timeout || + (config.cache ? 20000 : 60000) + ); + + it(`${testName} should load the compiled tests`, done => { + const esmContext = vm.createContext({ + it: _it, + expect, + process, + global, + URL, + Buffer, + setTimeout, + setImmediate, + nsObj(m) { + Object.defineProperty(m, Symbol.toStringTag, { + value: "Module" + }); + return m; + } + }); + cleanups.push(() => (esmContext.it = undefined)); + + /** + * @param {string} module a module + * @param {"evaluated" | "unlinked"=} esmMode esm mode + * @returns {EXPECTED_ANY} required module + * @private + */ + function _require(module, esmMode) { + if (module.startsWith("./")) { + const p = path.join(outputDirectory, module); + const content = fs.readFileSync(p, "utf-8"); + if (p.endsWith(".mjs")) { + let esm; + try { + esm = new vm.SourceTextModule(content, { + identifier: p, + context: esmContext, + initializeImportMeta: (meta, module) => { + meta.url = pathToFileURL(p).href; + }, + importModuleDynamically: async (specifier, module) => { + const result = await _require(specifier, "evaluated"); + return await asModule(result, module.context); + } + }); + cleanups.push(() => (esmContext.it = undefined)); + } catch (err) { + console.log(err); + err.message += `\nwhile parsing ${p}`; + throw err; + } + if (esmMode === "unlinked") return esm; + return (async () => { + await esm.link( + async (specifier, module) => + await asModule( + await _require(specifier, "unlinked"), + module.context, + true + ) + ); + // node.js 10 needs instantiate + if (esm.instantiate) esm.instantiate(); + await esm.evaluate(); + if (esmMode === "evaluated") return esm; + const ns = esm.namespace; + return ns.default && ns.default instanceof Promise + ? ns.default + : ns; + })(); + } + const fn = vm.runInThisContext( + "(function(require, module, exports, __dirname, __filename, it, expect) {" + + "global.expect = expect;" + + `function nsObj(m) { Object.defineProperty(m, Symbol.toStringTag, { value: "Module" }); return m; }${ + content + }\n})`, + p + ); + const m = { + exports: {}, + webpackTestSuiteModule: true + }; + fn.call( + m.exports, + _require, + m, + m.exports, + outputDirectory, + p, + _it, + expect + ); + return m.exports; + } + return require(module); + } + _require.webpackTestSuiteRequire = true; + Promise.resolve() + .then(() => _require(`./${options.output.filename}`)) + .then(() => { + if (getNumberOfTests() === 0) + return done(new Error("No tests exported by test case")); + done(); + }, done); + }, 10000); + + const { it: _it, getNumberOfTests } = createLazyTestEnv( + testConfig.timeout || 10000 + ); }); + } }); - }); + } }); }; +// eslint-disable-next-line jest/no-export module.exports.describeCases = describeCases; diff --git a/test/TestCasesAllCombined.longtest.js b/test/TestCasesAllCombined.longtest.js new file mode 100644 index 00000000000..1d193c5f601 --- /dev/null +++ b/test/TestCasesAllCombined.longtest.js @@ -0,0 +1,20 @@ +const { describeCases } = require("./TestCases.template"); + +describe("TestCases", () => { + describeCases({ + name: "all-combined", + mode: "production", + devtool: "source-map", + minimize: true, + optimization: { + moduleIds: "named", + chunkIds: "named" + }, + plugins: [ + c => { + const webpack = require(".."); + new webpack.HotModuleReplacementPlugin().apply(c); + } + ] + }); +}); diff --git a/test/TestCasesAllCombined.test.js b/test/TestCasesAllCombined.test.js deleted file mode 100644 index e413ff2c257..00000000000 --- a/test/TestCasesAllCombined.test.js +++ /dev/null @@ -1,16 +0,0 @@ -const { describeCases } = require("./TestCases.template"); -const webpack = require("../lib/webpack"); - -describe("TestCases", () => { - describeCases({ - name: "all-combined", - mode: "production", - devtool: "#@source-map", - minimize: true, - plugins: [ - new webpack.HotModuleReplacementPlugin(), - new webpack.NamedModulesPlugin(), - new webpack.NamedChunksPlugin() - ] - }); -}); diff --git a/test/TestCasesCachePack.longtest.js b/test/TestCasesCachePack.longtest.js new file mode 100644 index 00000000000..a25219da6e4 --- /dev/null +++ b/test/TestCasesCachePack.longtest.js @@ -0,0 +1,22 @@ +const path = require("path"); +const { describeCases } = require("./TestCases.template"); + +describe("TestCases", () => { + describeCases({ + name: "cache pack", + cache: { + type: "filesystem", + buildDependencies: { + defaultWebpack: [] + } + }, + snapshot: { + managedPaths: [path.resolve(__dirname, "../node_modules")] + }, + optimization: { + innerGraph: true, + usedExports: true, + concatenateModules: true + } + }); +}); diff --git a/test/TestCasesDevelopment.test.js b/test/TestCasesDevelopment.test.js index 5d1ec312356..e837012cb28 100644 --- a/test/TestCasesDevelopment.test.js +++ b/test/TestCasesDevelopment.test.js @@ -4,6 +4,6 @@ describe("TestCases", () => { describeCases({ name: "development", mode: "development", - devtool: "none" + devtool: false }); }); diff --git a/test/TestCasesDevtoolCheapEvalModuleSourceMap.test.js b/test/TestCasesDevtoolCheapEvalModuleSourceMap.test.js deleted file mode 100644 index 9a951ea0f1c..00000000000 --- a/test/TestCasesDevtoolCheapEvalModuleSourceMap.test.js +++ /dev/null @@ -1,8 +0,0 @@ -const { describeCases } = require("./TestCases.template"); - -describe("TestCases", () => { - describeCases({ - name: "devtool-cheap-eval-module-source-map", - devtool: "cheap-eval-module-source-map" - }); -}); diff --git a/test/TestCasesDevtoolCheapEvalSourceMap.test.js b/test/TestCasesDevtoolCheapEvalSourceMap.test.js deleted file mode 100644 index 3bccf31af95..00000000000 --- a/test/TestCasesDevtoolCheapEvalSourceMap.test.js +++ /dev/null @@ -1,8 +0,0 @@ -const { describeCases } = require("./TestCases.template"); - -describe("TestCases", () => { - describeCases({ - name: "devtool-cheap-eval-source-map", - devtool: "cheap-eval-source-map" - }); -}); diff --git a/test/TestCasesDevtoolCheapInlineSourceMap.test.js b/test/TestCasesDevtoolCheapInlineSourceMap.test.js deleted file mode 100644 index ce5a4151676..00000000000 --- a/test/TestCasesDevtoolCheapInlineSourceMap.test.js +++ /dev/null @@ -1,8 +0,0 @@ -const { describeCases } = require("./TestCases.template"); - -describe("TestCases", () => { - describeCases({ - name: "devtool-cheap-inline-source-map", - devtool: "cheap-inline-source-map" - }); -}); diff --git a/test/TestCasesDevtoolEvalCheapModuleSourceMap.test.js b/test/TestCasesDevtoolEvalCheapModuleSourceMap.test.js new file mode 100644 index 00000000000..62000c52138 --- /dev/null +++ b/test/TestCasesDevtoolEvalCheapModuleSourceMap.test.js @@ -0,0 +1,8 @@ +const { describeCases } = require("./TestCases.template"); + +describe("TestCases", () => { + describeCases({ + name: "devtool-eval-cheap-module-source-map", + devtool: "eval-cheap-module-source-map" + }); +}); diff --git a/test/TestCasesDevtoolEvalCheapSourceMap.test.js b/test/TestCasesDevtoolEvalCheapSourceMap.test.js new file mode 100644 index 00000000000..a891a1ba22c --- /dev/null +++ b/test/TestCasesDevtoolEvalCheapSourceMap.test.js @@ -0,0 +1,8 @@ +const { describeCases } = require("./TestCases.template"); + +describe("TestCases", () => { + describeCases({ + name: "devtool-eval-cheap-source-map", + devtool: "eval-cheap-source-map" + }); +}); diff --git a/test/TestCasesDevtoolEvalDeterministicModuleIds.test.js b/test/TestCasesDevtoolEvalDeterministicModuleIds.test.js new file mode 100644 index 00000000000..a120ac87f7a --- /dev/null +++ b/test/TestCasesDevtoolEvalDeterministicModuleIds.test.js @@ -0,0 +1,11 @@ +const { describeCases } = require("./TestCases.template"); + +describe("TestCases", () => { + describeCases({ + name: "devtool-eval-deterministic-module-ids", + devtool: "eval", + optimization: { + moduleIds: "deterministic" + } + }); +}); diff --git a/test/TestCasesDevtoolEvalNamedModules.test.js b/test/TestCasesDevtoolEvalNamedModules.test.js index a3c1cd6997e..0074088f8d5 100644 --- a/test/TestCasesDevtoolEvalNamedModules.test.js +++ b/test/TestCasesDevtoolEvalNamedModules.test.js @@ -1,10 +1,12 @@ const { describeCases } = require("./TestCases.template"); -const webpack = require("../lib/webpack"); describe("TestCases", () => { describeCases({ name: "devtool-eval-named-modules", devtool: "eval", - plugins: [new webpack.NamedModulesPlugin()] + optimization: { + moduleIds: "named", + chunkIds: "named" + } }); }); diff --git a/test/TestCasesDevtoolEvalSourceMap.test.js b/test/TestCasesDevtoolEvalSourceMap.test.js index bb68ab810cd..ced8658c239 100644 --- a/test/TestCasesDevtoolEvalSourceMap.test.js +++ b/test/TestCasesDevtoolEvalSourceMap.test.js @@ -3,6 +3,6 @@ const { describeCases } = require("./TestCases.template"); describe("TestCases", () => { describeCases({ name: "devtool-eval-source-map", - devtool: "#eval-source-map" + devtool: "eval-source-map" }); }); diff --git a/test/TestCasesDevtoolInlineCheapSourceMap.test.js b/test/TestCasesDevtoolInlineCheapSourceMap.test.js new file mode 100644 index 00000000000..8c12230099c --- /dev/null +++ b/test/TestCasesDevtoolInlineCheapSourceMap.test.js @@ -0,0 +1,8 @@ +const { describeCases } = require("./TestCases.template"); + +describe("TestCases", () => { + describeCases({ + name: "devtool-inline-cheap-source-map", + devtool: "inline-cheap-source-map" + }); +}); diff --git a/test/TestCasesDevtoolInlineSourceMap.test.js b/test/TestCasesDevtoolInlineSourceMap.longtest.js similarity index 100% rename from test/TestCasesDevtoolInlineSourceMap.test.js rename to test/TestCasesDevtoolInlineSourceMap.longtest.js diff --git a/test/TestCasesDevtoolSourceMap.longtest.js b/test/TestCasesDevtoolSourceMap.longtest.js new file mode 100644 index 00000000000..a5f6b9152be --- /dev/null +++ b/test/TestCasesDevtoolSourceMap.longtest.js @@ -0,0 +1,8 @@ +const { describeCases } = require("./TestCases.template"); + +describe("TestCases", () => { + describeCases({ + name: "devtool-source-map", + devtool: "source-map" + }); +}); diff --git a/test/TestCasesDevtoolSourceMap.test.js b/test/TestCasesDevtoolSourceMap.test.js deleted file mode 100644 index b204305ea67..00000000000 --- a/test/TestCasesDevtoolSourceMap.test.js +++ /dev/null @@ -1,8 +0,0 @@ -const { describeCases } = require("./TestCases.template"); - -describe("TestCases", () => { - describeCases({ - name: "devtool-source-map", - devtool: "#@source-map" - }); -}); diff --git a/test/TestCasesHot.test.js b/test/TestCasesHot.test.js index 30c0f2f6c06..c4fd8737c03 100644 --- a/test/TestCasesHot.test.js +++ b/test/TestCasesHot.test.js @@ -1,5 +1,5 @@ const { describeCases } = require("./TestCases.template"); -const webpack = require("../lib/webpack"); +const webpack = require(".."); describe("TestCases", () => { describeCases({ diff --git a/test/TestCasesHotMultiStep.test.js b/test/TestCasesHotMultiStep.test.js deleted file mode 100644 index 981c1b544c1..00000000000 --- a/test/TestCasesHotMultiStep.test.js +++ /dev/null @@ -1,13 +0,0 @@ -const { describeCases } = require("./TestCases.template"); -const webpack = require("../lib/webpack"); - -describe("TestCases", () => { - describeCases({ - name: "hot-multi-step", - plugins: [ - new webpack.HotModuleReplacementPlugin({ - multiStep: true - }) - ] - }); -}); diff --git a/test/TestCasesMinimizedHashedModules.test.js b/test/TestCasesMinimizedHashedModules.test.js deleted file mode 100644 index b28e926b92f..00000000000 --- a/test/TestCasesMinimizedHashedModules.test.js +++ /dev/null @@ -1,11 +0,0 @@ -const { describeCases } = require("./TestCases.template"); -const webpack = require("../lib/webpack"); - -describe("TestCases", () => { - describeCases({ - name: "minimized-hashed-modules", - mode: "production", - minimize: true, - plugins: [new webpack.HashedModuleIdsPlugin()] - }); -}); diff --git a/test/TestCasesMinimizedSourceMap.test.js b/test/TestCasesMinimizedSourceMap.longtest.js similarity index 100% rename from test/TestCasesMinimizedSourceMap.test.js rename to test/TestCasesMinimizedSourceMap.longtest.js diff --git a/test/TestCasesModule.test.js b/test/TestCasesModule.test.js new file mode 100644 index 00000000000..2ce910feb75 --- /dev/null +++ b/test/TestCasesModule.test.js @@ -0,0 +1,15 @@ +const { describeCases } = require("./TestCases.template"); +const vm = require("vm"); + +describe("TestCases", () => { + if (!vm.SourceTextModule) { + throw new Error( + "Running this test requires '--experimental-vm-modules'.\nRun with 'node --experimental-vm-modules node_modules/jest-cli/bin/jest'." + ); + } + describeCases({ + name: "module", + target: "node14", + module: true + }); +}); diff --git a/test/TestCasesNormal.test.js b/test/TestCasesNormal.basictest.js similarity index 100% rename from test/TestCasesNormal.test.js rename to test/TestCasesNormal.basictest.js diff --git a/test/TestCasesProdGlobalUsed.test.js b/test/TestCasesProdGlobalUsed.test.js new file mode 100644 index 00000000000..ee3d0fbb2c8 --- /dev/null +++ b/test/TestCasesProdGlobalUsed.test.js @@ -0,0 +1,12 @@ +const { describeCases } = require("./TestCases.template"); + +describe("TestCasesProdGlobalUsed", () => { + describeCases({ + name: "production with usedExports global", + mode: "production", + optimization: { + usedExports: "global", + minimize: false + } + }); +}); diff --git a/test/TestCasesProduction.longtest.js b/test/TestCasesProduction.longtest.js new file mode 100644 index 00000000000..4e60190fa86 --- /dev/null +++ b/test/TestCasesProduction.longtest.js @@ -0,0 +1,9 @@ +const { describeCases } = require("./TestCases.template"); + +describe("TestCases", () => { + describeCases({ + name: "production", + mode: "production", + minimize: true + }); +}); diff --git a/test/TestCasesProduction.test.js b/test/TestCasesProduction.test.js deleted file mode 100644 index 8708f34d2a4..00000000000 --- a/test/TestCasesProduction.test.js +++ /dev/null @@ -1,8 +0,0 @@ -const { describeCases } = require("./TestCases.template"); - -describe("TestCases", () => { - describeCases({ - name: "production", - mode: "production" - }); -}); diff --git a/test/URLAbsoluteSpecifier.unittest.js b/test/URLAbsoluteSpecifier.unittest.js new file mode 100644 index 00000000000..92f479a2ff4 --- /dev/null +++ b/test/URLAbsoluteSpecifier.unittest.js @@ -0,0 +1,85 @@ +const { getScheme, getProtocol } = require("../lib/util/URLAbsoluteSpecifier"); + +/** + * @type {Array<{specifier: string, expected: string|undefined}>} + */ +const samples = [ + { + specifier: "@babel/core", + expected: undefined + }, + { + specifier: "webpack", + expected: undefined + }, + { + specifier: "1webpack:///c:/windows/dir", + expected: undefined + }, + { + specifier: "webpack:///c:/windows/dir", + expected: "webpack" + }, + { + specifier: "WEBPACK2020:///c:/windows/dir", + expected: "webpack2020" + }, + { + specifier: "my-data:image/jpg;base64", + expected: "my-data" + }, + { + specifier: "My+Data:image/jpg;base64", + expected: "my+data" + }, + { + specifier: "mY+dATA:image/jpg;base64", + expected: "my+data" + }, + { + specifier: "my-data/next:image/", + expected: undefined + }, + { + specifier: "my-data\\next:image/", + expected: undefined + }, + { + specifier: "D:\\path\\file.js", + expected: undefined + }, + { + specifier: "d:/path/file.js", + expected: undefined + }, + { + specifier: "z:#foo", + expected: undefined + }, + { + specifier: "Z:?query", + expected: undefined + }, + { + specifier: "C:", + expected: undefined + } +]; + +describe("getScheme", () => { + for (const [_i, { specifier, expected }] of samples.entries()) { + it(`should handle ${specifier}`, () => { + expect(getScheme(specifier)).toBe(expected); + }); + } +}); + +describe("getProtocol", () => { + for (const [_i, { specifier, expected }] of samples.entries()) { + it(`should handle ${specifier}`, () => { + expect(getProtocol(specifier)).toBe( + expected ? `${expected}:` : undefined + ); + }); + } +}); diff --git a/test/Validation.test.js b/test/Validation.test.js index 9d306bcbacf..8f1ed95c4d7 100644 --- a/test/Validation.test.js +++ b/test/Validation.test.js @@ -1,403 +1,681 @@ -/* globals describe, it */ "use strict"; -const webpack = require("../lib/webpack"); +require("./helpers/warmup-webpack"); describe("Validation", () => { - const testCases = [ + const createTestCase = (name, config, fn) => { + it(`should fail validation for ${name}`, () => { + let errored; + + try { + const webpack = require(".."); + webpack(config); + } catch (err) { + if (err.name !== "ValidationError") throw err; + errored = err; + fn(err.message); + + return; + } + + if (!errored) { + throw new Error("Validation didn't fail"); + } + + expect(errored.message).toMatch(/^Invalid configuration object./); + }); + }; + + createTestCase("undefined configuration", undefined, msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration should be an object: + object { amd?, bail?, cache?, context?, dependencies?, devServer?, devtool?, entry?, experiments?, extends?, externals?, externalsPresets?, externalsType?, ignoreWarnings?, infrastructureLogging?, loader?, mode?, module?, name?, node?, optimization?, output?, parallelism?, performance?, plugins?, profile?, recordsInputPath?, recordsOutputPath?, recordsPath?, resolve?, resolveLoader?, snapshot?, stats?, target?, watch?, watchOptions? } + -> Options object as provided by the user." + `) + ); + + createTestCase("null configuration", null, msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration should be an object: + object { amd?, bail?, cache?, context?, dependencies?, devServer?, devtool?, entry?, experiments?, extends?, externals?, externalsPresets?, externalsType?, ignoreWarnings?, infrastructureLogging?, loader?, mode?, module?, name?, node?, optimization?, output?, parallelism?, performance?, plugins?, profile?, recordsInputPath?, recordsOutputPath?, recordsPath?, resolve?, resolveLoader?, snapshot?, stats?, target?, watch?, watchOptions? } + -> Options object as provided by the user." + `) + ); + + createTestCase( + "empty entry string", { - name: "undefined configuration", - config: undefined, - message: [" - configuration should be an object."] + entry: "" }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.entry should be a non-empty string. + -> The string is resolved to a module which is loaded upon startup." + `) + ); + + createTestCase( + "empty entry bundle array", { - name: "null configuration", - config: null, - message: [" - configuration should be an object."] + entry: { + bundle: [] + } }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.entry.bundle should be a non-empty array. + -> All modules are loaded upon startup. The last one is exported." + `) + ); + + createTestCase( + "invalid instanceof", { - name: "empty entry string", - config: { - entry: "" - }, - message: [ - " - configuration.entry should be one of these:", - " function | object { : non-empty string | [non-empty string] } | non-empty string | [non-empty string]", - " -> The entry point(s) of the compilation.", - " Details:", - " * configuration.entry should be an instance of function", - " -> A Function returning an entry object, an entry string, an entry array or a promise to these things.", - " * configuration.entry should be an object.", - " -> Multiple entry bundles are created. The key is the chunk name. The value can be a string or an array.", - " * configuration.entry should not be empty.", - " -> An entry point without name. The string is resolved to a module which is loaded upon startup.", - " * configuration.entry should be an array:", - " [non-empty string]" - ] + entry: "a", + module: { + wrappedContextRegExp: 1337 + } }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.module.wrappedContextRegExp should be an instance of RegExp. + -> Set the inner regular expression for partial dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.wrappedContextRegExp'." + `) + ); + + createTestCase( + "invalid minimum", { - name: "empty entry bundle array", - config: { - entry: { - bundle: [] - } - }, - message: [ - " - configuration.entry should be one of these:", - " function | object { : non-empty string | [non-empty string] } | non-empty string | [non-empty string]", - " -> The entry point(s) of the compilation.", - " Details:", - " * configuration.entry should be an instance of function", - " -> A Function returning an entry object, an entry string, an entry array or a promise to these things.", - " * configuration.entry['bundle'] should be a string.", - " -> The string is resolved to a module which is loaded upon startup.", - " * configuration.entry['bundle'] should not be empty.", - " * configuration.entry should be a string.", - " -> An entry point without name. The string is resolved to a module which is loaded upon startup.", - " * configuration.entry should be an array:", - " [non-empty string]" - ] + entry: "a", + parallelism: 0 }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.parallelism should be >= 1. + -> The number of parallel processed modules in the compilation." + `) + ); + + createTestCase( + "repeated value", { - name: "invalid instanceof", - config: { - entry: "a", - module: { - wrappedContextRegExp: 1337 - } - }, - message: [ - " - configuration.module.wrappedContextRegExp should be an instance of RegExp", - " -> Set the inner regular expression for partial dynamic dependencies" - ] + entry: ["abc", "def", "abc"] }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.entry should not contain the item 'abc' twice. + -> All modules are loaded upon startup. The last one is exported." + `) + ); + + createTestCase( + "multiple errors", { - name: "invalid minimum", - config: { - entry: "a", - parallelism: 0 - }, - message: [ - " - configuration.parallelism should be >= 1.", - " -> The number of parallel processed modules in the compilation." - ] + entry: [/a/], + output: { + filename: /a/ + } }, - { - name: "repeated value", - config: { - entry: ["abc", "def", "abc"] + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.entry[0] should be a non-empty string. + -> A module that is loaded upon startup. Only the last one is exported. + - configuration.output.filename should be one of these: + non-empty string | function + -> Specifies the filename template of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk. + Details: + * configuration.output.filename should be a non-empty string. + * configuration.output.filename should be an instance of function." + `) + ); + + createTestCase( + "multiple configurations", + [ + { + entry: [/a/] }, - message: [ - " - configuration.entry should be one of these:", - " function | object { : non-empty string | [non-empty string] } | non-empty string | [non-empty string]", - " -> The entry point(s) of the compilation.", - " Details:", - " * configuration.entry should be an instance of function", - " -> A Function returning an entry object, an entry string, an entry array or a promise to these things.", - " * configuration.entry should be an object.", - " -> Multiple entry bundles are created. The key is the chunk name. The value can be a string or an array.", - " * configuration.entry should be a string.", - " -> An entry point without name. The string is resolved to a module which is loaded upon startup.", - " * configuration.entry should not contain the item 'abc' twice." - ] - }, - { - name: "multiple errors", - config: { - entry: [/a/], + { + entry: "a", output: { filename: /a/ } - }, - message: [ - " - configuration.entry should be one of these:", - " function | object { : non-empty string | [non-empty string] } | non-empty string | [non-empty string]", - " -> The entry point(s) of the compilation.", - " Details:", - " * configuration.entry should be an instance of function", - " -> A Function returning an entry object, an entry string, an entry array or a promise to these things.", - " * configuration.entry should be an object.", - " -> Multiple entry bundles are created. The key is the chunk name. The value can be a string or an array.", - " * configuration.entry should be a string.", - " -> An entry point without name. The string is resolved to a module which is loaded upon startup.", - " * configuration.entry[0] should be a string.", - " -> A non-empty string", - " - configuration.output.filename should be one of these:", - " string | function", - " -> Specifies the name of each output file on disk. You must **not** specify an absolute path here! The `output.path` option determines the location on disk the files are written to, filename is used solely for naming the individual files.", - " Details:", - " * configuration.output.filename should be a string.", - " * configuration.output.filename should be an instance of function" - ] - }, - { - name: "multiple configurations", - config: [ - { - entry: [/a/] - }, - { - entry: "a", - output: { - filename: /a/ - } - } - ], - message: [ - " - configuration[0].entry should be one of these:", - " function | object { : non-empty string | [non-empty string] } | non-empty string | [non-empty string]", - " -> The entry point(s) of the compilation.", - " Details:", - " * configuration[0].entry should be an instance of function", - " -> A Function returning an entry object, an entry string, an entry array or a promise to these things.", - " * configuration[0].entry should be an object.", - " -> Multiple entry bundles are created. The key is the chunk name. The value can be a string or an array.", - " * configuration[0].entry should be a string.", - " -> An entry point without name. The string is resolved to a module which is loaded upon startup.", - " * configuration[0].entry[0] should be a string.", - " -> A non-empty string", - " - configuration[1].output.filename should be one of these:", - " string | function", - " -> Specifies the name of each output file on disk. You must **not** specify an absolute path here! The `output.path` option determines the location on disk the files are written to, filename is used solely for naming the individual files.", - " Details:", - " * configuration[1].output.filename should be a string.", - " * configuration[1].output.filename should be an instance of function" - ] - }, + } + ], + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration[0].entry[0] should be a non-empty string. + -> A module that is loaded upon startup. Only the last one is exported. + - configuration[1].output.filename should be one of these: + non-empty string | function + -> Specifies the filename template of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk. + Details: + * configuration[1].output.filename should be a non-empty string. + * configuration[1].output.filename should be an instance of function." + `) + ); + + createTestCase( + "deep error", { - name: "deep error", - config: { - entry: "a", - module: { - rules: [ - { - oneOf: [ - { - test: "/a", - passer: { - amd: false - } + entry: "a", + module: { + rules: [ + { + oneOf: [ + { + test: "/a", + passer: { + amd: false } - ] - } - ] - } - }, - message: [ - " - configuration.module.rules[0].oneOf[0] has an unknown property 'passer'. These properties are valid:", - " object { compiler?, enforce?, exclude?, include?, issuer?, loader?, loaders?, oneOf?, options?, parser?, query?, resolve?, resource?, resourceQuery?, rules?, sideEffects?, test?, type?, use? }", - " -> A rule" - ] + } + ] + } + ] + } }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.module.rules[0].oneOf[0] has an unknown property 'passer'. These properties are valid: + object { assert?, compiler?, dependency?, descriptionData?, enforce?, exclude?, generator?, include?, issuer?, issuerLayer?, layer?, loader?, mimetype?, oneOf?, options?, parser?, realResource?, resolve?, resource?, resourceFragment?, resourceQuery?, rules?, scheme?, sideEffects?, test?, type?, use?, with? } + -> A rule description with conditions and effects for modules." + `) + ); + + createTestCase( + "additional key on root", { - name: "additional key on root", - config: { - entry: "a", - postcss: () => {} - }, - message: [ - " - configuration has an unknown property 'postcss'. These properties are valid:", - " object { amd?, bail?, cache?, context?, dependencies?, devServer?, devtool?, entry?, externals?, loader?, mode?, module?, " + - "name?, node?, optimization?, output?, parallelism?, performance?, plugins?, profile?, recordsInputPath?, recordsOutputPath?, " + - "recordsPath?, resolve?, resolveLoader?, serve?, stats?, target?, watch?, watchOptions? }", - " For typos: please correct them.", - " For loader options: webpack >= v2.0.0 no longer allows custom properties in configuration.", - " Loaders should be updated to allow passing options via loader options in module.rules.", - " Until loaders are updated one can use the LoaderOptionsPlugin to pass these options to the loader:", - " plugins: [", - " new webpack.LoaderOptionsPlugin({", - " // test: /\\.xxx$/, // may apply this only for some modules", - " options: {", - " postcss: …", - " }", - " })", - " ]" - ] + entry: "a", + postcss: () => {} }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration has an unknown property 'postcss'. These properties are valid: + object { amd?, bail?, cache?, context?, dependencies?, devServer?, devtool?, entry?, experiments?, extends?, externals?, externalsPresets?, externalsType?, ignoreWarnings?, infrastructureLogging?, loader?, mode?, module?, name?, node?, optimization?, output?, parallelism?, performance?, plugins?, profile?, recordsInputPath?, recordsOutputPath?, recordsPath?, resolve?, resolveLoader?, snapshot?, stats?, target?, watch?, watchOptions? } + -> Options object as provided by the user. + For typos: please correct them. + For loader options: webpack >= v2.0.0 no longer allows custom properties in configuration. + Loaders should be updated to allow passing options via loader options in module.rules. + Until loaders are updated one can use the LoaderOptionsPlugin to pass these options to the loader: + plugins: [ + new webpack.LoaderOptionsPlugin({ + // test: /\\\\.xxx$/, // may apply this only for some modules + options: { + postcss: … + } + }) + ]" + `) + ); + + createTestCase( + "enum", { - name: "enum", - config: { - entry: "a", - devtool: true - }, - message: [ - " - configuration.devtool should be one of these:", - " string | false", - " -> A developer tool to enhance debugging.", - " Details:", - " * configuration.devtool should be a string.", - " * configuration.devtool should be false" - ] + entry: "a", + devtool: true }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.devtool should be one of these: + false | \\"eval\\" | string (should match pattern \\"^(inline-|hidden-|eval-)?(nosources-)?(cheap-(module-)?)?source-map(-debugids)?$\\") + -> A developer tool to enhance debugging (false | eval | [inline-|hidden-|eval-][nosources-][cheap-[module-]]source-map). + Details: + * configuration.devtool should be one of these: + false | \\"eval\\" + * configuration.devtool should be a string (should match pattern \\"^(inline-|hidden-|eval-)?(nosources-)?(cheap-(module-)?)?source-map(-debugids)?$\\")." + `) + ); + + createTestCase( + "! in path", { - name: "! in path", - config: { - entry: "foo.js", - output: { - path: "/somepath/!test", - filename: "bar" - } - }, - message: [ - ' - configuration.output.path: The provided value "/somepath/!test" contains exclamation mark (!) which is not allowed because it\'s reserved for loader syntax.', - " -> The output directory as **absolute path** (required)." - ] + entry: "foo.js", + output: { + path: "/somepath/!test", + filename: "bar" + } }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.output.path: The provided value \\"/somepath/!test\\" contains exclamation mark (!) which is not allowed because it's reserved for loader syntax. + -> The output directory as **absolute path** (required)." + `) + ); + + createTestCase( + "relative path", { - name: "relative path", - config: { - entry: "foo.js", - output: { - filename: "/bar" - } - }, - message: [ - " - configuration.output.filename should be one of these:", - " string | function", - " -> Specifies the name of each output file on disk. You must **not** specify an absolute path here! The `output.path` option determines the location on disk the files are written to, filename is used solely for naming the individual files.", - " Details:", - ' * configuration.output.filename: A relative path is expected. However, the provided value "/bar" is an absolute path!', - " Please use output.path to specify absolute path and output.filename for the file name.", - " * configuration.output.filename should be an instance of function" - ] + entry: "foo.js", + output: { + filename: "/bar" + } }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.output.filename: A relative path is expected. However, the provided value \\"/bar\\" is an absolute path! + Please use output.path to specify absolute path and output.filename for the file name." + `) + ); + + createTestCase( + "absolute path", { - name: "absolute path", - config: { - entry: "foo.js", - output: { - filename: "bar" - }, - context: "baz" + entry: "foo.js", + output: { + filename: "bar" }, - message: [ - ' - configuration.context: The provided value "baz" is not an absolute path!', - " -> The base directory (absolute path!) for resolving the `entry` option. If `output.pathinfo` is set, the included pathinfo is shortened to this directory." - ] + context: "baz" }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.context: The provided value \\"baz\\" is not an absolute path! + -> The base directory (absolute path!) for resolving the \`entry\` option. If \`output.pathinfo\` is set, the included pathinfo is shortened to this directory." + `) + ); + + createTestCase( + "missing stats option", { - name: "missing stats option", - config: { - entry: "foo.js", - stats: { - foobar: true - } - }, - test(err) { - expect(err.message).toMatch(/^Invalid configuration object./); - expect(err.message.split("\n").slice(1)[0]).toBe( - " - configuration.stats should be one of these:" - ); + entry: "foo.js", + stats: { + foobar: true } }, + msg => { + expect( + msg + .replace(/object \{ .* \}/g, "object {...}") + .replace(/"none" \| .+/g, '"none" | ...') + ).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.stats has an unknown property 'foobar'. These properties are valid: + object {...} + -> Stats options object." + `); + } + ); + + createTestCase( + "Invalid plugin provided: bool", { - name: "Invalid plugin provided: bool", - config: { - entry: "foo.js", - plugins: [false] - }, - message: [ - " - configuration.plugins[0] should be one of these:", - " object { apply, … } | function", - " -> Plugin of type object or instanceof Function", - " Details:", - " * configuration.plugins[0] should be an object.", - " -> Plugin instance", - " * configuration.plugins[0] should be an instance of function", - " -> Function acting as plugin" - ] + entry: "foo.js", + plugins: [true] }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.plugins[0] should be one of these: + false | 0 | \\"\\" | null | undefined | object { apply, … } | function + -> Plugin of type object or instanceof Function. + Details: + * configuration.plugins[0] should be one of these: + false | 0 | \\"\\" | null | undefined + -> These values will be ignored by webpack and created to be used with '&&' or '||' to improve readability of configurations. + * configuration.plugins[0] should be an object: + object { apply, … } + -> Plugin instance. + * configuration.plugins[0] should be an instance of function. + -> Function acting as plugin." + `) + ); + + createTestCase( + "Invalid plugin provided: array", { - name: "Invalid plugin provided: array", - config: { - entry: "foo.js", - plugins: [[]] - }, - message: [ - " - configuration.plugins[0] should be one of these:", - " object { apply, … } | function", - " -> Plugin of type object or instanceof Function", - " Details:", - " * configuration.plugins[0] should be an object.", - " -> Plugin instance", - " * configuration.plugins[0] should be an instance of function", - " -> Function acting as plugin" - ] + entry: "foo.js", + plugins: [[]] }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.plugins[0] should be one of these: + false | 0 | \\"\\" | null | undefined | object { apply, … } | function + -> Plugin of type object or instanceof Function. + Details: + * configuration.plugins[0] should be one of these: + false | 0 | \\"\\" | null | undefined + -> These values will be ignored by webpack and created to be used with '&&' or '||' to improve readability of configurations. + * configuration.plugins[0] should be an object: + object { apply, … } + -> Plugin instance. + * configuration.plugins[0] should be an instance of function. + -> Function acting as plugin." + `) + ); + + createTestCase( + "Invalid plugin provided: string", { - name: "Invalid plugin provided: string", - config: { - entry: "foo.js", - plugins: ["abc123"] - }, - message: [ - " - configuration.plugins[0] should be one of these:", - " object { apply, … } | function", - " -> Plugin of type object or instanceof Function", - " Details:", - " * configuration.plugins[0] should be an object.", - " -> Plugin instance", - " * configuration.plugins[0] should be an instance of function", - " -> Function acting as plugin" - ] + entry: "foo.js", + plugins: ["abc123"] }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.plugins[0] should be one of these: + false | 0 | \\"\\" | null | undefined | object { apply, … } | function + -> Plugin of type object or instanceof Function. + Details: + * configuration.plugins[0] should be one of these: + false | 0 | \\"\\" | null | undefined + -> These values will be ignored by webpack and created to be used with '&&' or '||' to improve readability of configurations. + * configuration.plugins[0] should be an object: + object { apply, … } + -> Plugin instance. + * configuration.plugins[0] should be an instance of function. + -> Function acting as plugin." + `) + ); + + createTestCase( + "Invalid plugin provided: int", { - name: "Invalid plugin provided: int", - config: { - entry: "foo.js", - plugins: [12] - }, - message: [ - " - configuration.plugins[0] should be one of these:", - " object { apply, … } | function", - " -> Plugin of type object or instanceof Function", - " Details:", - " * configuration.plugins[0] should be an object.", - " -> Plugin instance", - " * configuration.plugins[0] should be an instance of function", - " -> Function acting as plugin" - ] + entry: "foo.js", + plugins: [12] }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.plugins[0] should be one of these: + false | 0 | \\"\\" | null | undefined | object { apply, … } | function + -> Plugin of type object or instanceof Function. + Details: + * configuration.plugins[0] should be one of these: + false | 0 | \\"\\" | null | undefined + -> These values will be ignored by webpack and created to be used with '&&' or '||' to improve readability of configurations. + * configuration.plugins[0] should be an object: + object { apply, … } + -> Plugin instance. + * configuration.plugins[0] should be an instance of function. + -> Function acting as plugin." + `) + ); + + createTestCase( + "Invalid plugin provided: object without apply function", { - name: "Invalid plugin provided: object without apply function", - config: { - entry: "foo.js", - plugins: [{}] - }, - message: [ - " - configuration.plugins[0] should be one of these:", - " object { apply, … } | function", - " -> Plugin of type object or instanceof Function", - " Details:", - " * configuration.plugins[0] misses the property 'apply'.", - " function", - " -> The run point of the plugin, required method.", - " * configuration.plugins[0] should be an instance of function", - " -> Function acting as plugin" - ] - } - ]; + entry: "foo.js", + plugins: [{}] + }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.plugins[0] misses the property 'apply'. Should be: + function + -> The run point of the plugin, required method." + `) + ); - testCases.forEach(testCase => { - it("should fail validation for " + testCase.name, () => { - try { - webpack(testCase.config); - } catch (err) { - if (err.name !== "WebpackOptionsValidationError") throw err; + // cspell:Ignore protuction + createTestCase( + "invalid mode", + { + mode: "protuction" + }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.mode should be one of these: + \\"development\\" | \\"production\\" | \\"none\\" + -> Enable production optimizations or development hints." + `) + ); - if (testCase.test) { - testCase.test(err); + createTestCase( + "debug", + { + debug: true + }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration has an unknown property 'debug'. These properties are valid: + object { amd?, bail?, cache?, context?, dependencies?, devServer?, devtool?, entry?, experiments?, extends?, externals?, externalsPresets?, externalsType?, ignoreWarnings?, infrastructureLogging?, loader?, mode?, module?, name?, node?, optimization?, output?, parallelism?, performance?, plugins?, profile?, recordsInputPath?, recordsOutputPath?, recordsPath?, resolve?, resolveLoader?, snapshot?, stats?, target?, watch?, watchOptions? } + -> Options object as provided by the user. + The 'debug' property was removed in webpack 2.0.0. + Loaders should be updated to allow passing this option via loader options in module.rules. + Until loaders are updated one can use the LoaderOptionsPlugin to switch loaders into debug mode: + plugins: [ + new webpack.LoaderOptionsPlugin({ + debug: true + }) + ]" + `) + ); - return; + createTestCase( + "missing cache group name", + { + optimization: { + splitChunks: { + cacheGroups: { + test: /abc/ + } } + } + }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.optimization.splitChunks.cacheGroups should not be object { test, … }. + -> Using the cacheGroup shorthand syntax with a cache group named 'test' is a potential config error + Did you intent to define a cache group with a test instead? + cacheGroups: { + : { + test: ... + } + }. + object { : false | RegExp | string | function | object { automaticNameDelimiter?, chunks?, enforce?, enforceSizeThreshold?, filename?, idHint?, layer?, maxAsyncRequests?, maxAsyncSize?, maxInitialRequests?, maxInitialSize?, maxSize?, minChunks?, minRemainingSize?, minSize?, minSizeReduction?, name?, priority?, reuseExistingChunk?, test?, type?, usedExports? } } + -> Assign modules to a cache group (modules from different cache groups are tried to keep in separate chunks, default categories: 'default', 'defaultVendors')." + `) + ); - expect(err.message).toMatch(/^Invalid configuration object./); - expect(err.message.split("\n").slice(1)).toEqual(testCase.message); + createTestCase( + "holey array", + // eslint-disable-next-line no-sparse-arrays + [{ mode: "production" }, , { mode: "development" }], + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration[1] should be an object: + object { amd?, bail?, cache?, context?, dependencies?, devServer?, devtool?, entry?, experiments?, extends?, externals?, externalsPresets?, externalsType?, ignoreWarnings?, infrastructureLogging?, loader?, mode?, module?, name?, node?, optimization?, output?, parallelism?, performance?, plugins?, profile?, recordsInputPath?, recordsOutputPath?, recordsPath?, resolve?, resolveLoader?, snapshot?, stats?, target?, watch?, watchOptions? } + -> Options object as provided by the user." + `) + ); - return; - } + createTestCase( + "ecmaVersion", + { + output: { ecmaVersion: 2015 } + }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.output has an unknown property 'ecmaVersion'. These properties are valid: + object { amdContainer?, assetModuleFilename?, asyncChunks?, auxiliaryComment?, charset?, chunkFilename?, chunkFormat?, chunkLoadTimeout?, chunkLoading?, chunkLoadingGlobal?, clean?, compareBeforeEmit?, crossOriginLoading?, cssChunkFilename?, cssFilename?, devtoolFallbackModuleFilenameTemplate?, devtoolModuleFilenameTemplate?, devtoolNamespace?, enabledChunkLoadingTypes?, enabledLibraryTypes?, enabledWasmLoadingTypes?, environment?, filename?, globalObject?, hashDigest?, hashDigestLength?, hashFunction?, hashSalt?, hotUpdateChunkFilename?, hotUpdateGlobal?, hotUpdateMainFilename?, ignoreBrowserWarnings?, iife?, importFunctionName?, importMetaName?, library?, libraryExport?, libraryTarget?, module?, path?, pathinfo?, publicPath?, scriptType?, sourceMapFilename?, sourcePrefix?, strictModuleErrorHandling?, strictModuleExceptionHandling?, trustedTypes?, umdNamedDefine?, uniqueName?, wasmLoading?, webassemblyModuleFilename?, workerChunkLoading?, workerPublicPath?, workerWasmLoading? } + -> Options affecting the output of the compilation. \`output\` options tell webpack how to write the compiled files to disk. + Did you mean output.environment (output.ecmaVersion was a temporary configuration option during webpack 5 beta)?" + `) + ); - throw new Error("Validation didn't fail"); - }); + createTestCase( + "devtool sourcemap", + { + devtool: "sourcemap" + }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.devtool should match pattern \\"^(inline-|hidden-|eval-)?(nosources-)?(cheap-(module-)?)?source-map(-debugids)?$\\". + BREAKING CHANGE since webpack 5: The devtool option is more strict. + Please strictly follow the order of the keywords in the pattern." + `) + ); + + createTestCase( + "devtool source-maps", + { + devtool: "source-maps" + }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.devtool should match pattern \\"^(inline-|hidden-|eval-)?(nosources-)?(cheap-(module-)?)?source-map(-debugids)?$\\". + BREAKING CHANGE since webpack 5: The devtool option is more strict. + Please strictly follow the order of the keywords in the pattern." + `) + ); + + createTestCase( + "invalid watch options", + { + watchOptions: true + }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.watchOptions should be an object: + object { aggregateTimeout?, followSymlinks?, ignored?, poll?, stdin? } + -> Options for the watcher." + `) + ); + + createTestCase( + "devtool", + { + devtool: "cheap-eval-nosource-source-map" + }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.devtool should match pattern \\"^(inline-|hidden-|eval-)?(nosources-)?(cheap-(module-)?)?source-map(-debugids)?$\\". + BREAKING CHANGE since webpack 5: The devtool option is more strict. + Please strictly follow the order of the keywords in the pattern." + `) + ); + + describe("did you mean", () => { + createTestCase( + "module.rules", + { + rules: [] + }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration has an unknown property 'rules'. These properties are valid: + object { amd?, bail?, cache?, context?, dependencies?, devServer?, devtool?, entry?, experiments?, extends?, externals?, externalsPresets?, externalsType?, ignoreWarnings?, infrastructureLogging?, loader?, mode?, module?, name?, node?, optimization?, output?, parallelism?, performance?, plugins?, profile?, recordsInputPath?, recordsOutputPath?, recordsPath?, resolve?, resolveLoader?, snapshot?, stats?, target?, watch?, watchOptions? } + -> Options object as provided by the user. + Did you mean module.rules?" + `) + ); + createTestCase( + "optimization.splitChunks", + { + splitChunks: false + }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration has an unknown property 'splitChunks'. These properties are valid: + object { amd?, bail?, cache?, context?, dependencies?, devServer?, devtool?, entry?, experiments?, extends?, externals?, externalsPresets?, externalsType?, ignoreWarnings?, infrastructureLogging?, loader?, mode?, module?, name?, node?, optimization?, output?, parallelism?, performance?, plugins?, profile?, recordsInputPath?, recordsOutputPath?, recordsPath?, resolve?, resolveLoader?, snapshot?, stats?, target?, watch?, watchOptions? } + -> Options object as provided by the user. + Did you mean optimization.splitChunks?" + `) + ); + createTestCase( + "module.noParse", + { + noParse: /a/ + }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration has an unknown property 'noParse'. These properties are valid: + object { amd?, bail?, cache?, context?, dependencies?, devServer?, devtool?, entry?, experiments?, extends?, externals?, externalsPresets?, externalsType?, ignoreWarnings?, infrastructureLogging?, loader?, mode?, module?, name?, node?, optimization?, output?, parallelism?, performance?, plugins?, profile?, recordsInputPath?, recordsOutputPath?, recordsPath?, resolve?, resolveLoader?, snapshot?, stats?, target?, watch?, watchOptions? } + -> Options object as provided by the user. + Did you mean module.noParse?" + `) + ); + createTestCase( + "optimization.moduleIds", + { + optimization: { + hashedModuleIds: true + } + }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.optimization has an unknown property 'hashedModuleIds'. These properties are valid: + object { avoidEntryIife?, checkWasmTypes?, chunkIds?, concatenateModules?, emitOnErrors?, flagIncludedChunks?, innerGraph?, mangleExports?, mangleWasmImports?, mergeDuplicateChunks?, minimize?, minimizer?, moduleIds?, noEmitOnErrors?, nodeEnv?, portableRecords?, providedExports?, realContentHash?, removeAvailableModules?, removeEmptyChunks?, runtimeChunk?, sideEffects?, splitChunks?, usedExports? } + -> Enables/Disables integrated optimizations. + Did you mean optimization.moduleIds: \\"hashed\\" (BREAKING CHANGE since webpack 5)?" + `) + ); + createTestCase( + "optimization.chunkIds", + { + optimization: { + namedChunks: true + } + }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.optimization has an unknown property 'namedChunks'. These properties are valid: + object { avoidEntryIife?, checkWasmTypes?, chunkIds?, concatenateModules?, emitOnErrors?, flagIncludedChunks?, innerGraph?, mangleExports?, mangleWasmImports?, mergeDuplicateChunks?, minimize?, minimizer?, moduleIds?, noEmitOnErrors?, nodeEnv?, portableRecords?, providedExports?, realContentHash?, removeAvailableModules?, removeEmptyChunks?, runtimeChunk?, sideEffects?, splitChunks?, usedExports? } + -> Enables/Disables integrated optimizations. + Did you mean optimization.chunkIds: \\"named\\" (BREAKING CHANGE since webpack 5)?" + `) + ); + createTestCase( + "optimization.chunk/moduleIds", + { + optimization: { + occurrenceOrder: true + } + }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.optimization has an unknown property 'occurrenceOrder'. These properties are valid: + object { avoidEntryIife?, checkWasmTypes?, chunkIds?, concatenateModules?, emitOnErrors?, flagIncludedChunks?, innerGraph?, mangleExports?, mangleWasmImports?, mergeDuplicateChunks?, minimize?, minimizer?, moduleIds?, noEmitOnErrors?, nodeEnv?, portableRecords?, providedExports?, realContentHash?, removeAvailableModules?, removeEmptyChunks?, runtimeChunk?, sideEffects?, splitChunks?, usedExports? } + -> Enables/Disables integrated optimizations. + Did you mean optimization.chunkIds: \\"size\\" and optimization.moduleIds: \\"size\\" (BREAKING CHANGE since webpack 5)?" + `) + ); + createTestCase( + "optimization.idHint", + { + optimization: { + splitChunks: { + automaticNamePrefix: "vendor" + } + } + }, + msg => + expect(msg).toMatchInlineSnapshot(` + "Invalid configuration object. Webpack has been initialized using a configuration object that does not match the API schema. + - configuration.optimization.splitChunks has an unknown property 'automaticNamePrefix'. These properties are valid: + object { automaticNameDelimiter?, cacheGroups?, chunks?, defaultSizeTypes?, enforceSizeThreshold?, fallbackCacheGroup?, filename?, hidePathInfo?, maxAsyncRequests?, maxAsyncSize?, maxInitialRequests?, maxInitialSize?, maxSize?, minChunks?, minRemainingSize?, minSize?, minSizeReduction?, name?, usedExports? } + -> Options object for splitting chunks into smaller chunks." + `) + ); }); }); diff --git a/test/WasmHashes.unittest.js b/test/WasmHashes.unittest.js new file mode 100644 index 00000000000..e5b5416e1cb --- /dev/null +++ b/test/WasmHashes.unittest.js @@ -0,0 +1,159 @@ +const { randomBytes, createHash } = require("crypto"); + +const wasmHashes = { + xxhash64: () => { + const createHash = require("../lib/util/hash/xxhash64"); + const createReferenceHash = + require("hash-wasm/dist/xxhash64.umd.min.js").createXXHash64; + return { + createHash, + createReferenceHash: async () => (await createReferenceHash()).init(), + regExp: /^[0-9a-f]{16}$/ + }; + }, + "xxhash64-createHash": () => { + const createXxHash = require("../lib/util/hash/xxhash64"); + const createHash = require("../lib/util/createHash"); + return { + createHash: () => createHash("xxhash64"), + createReferenceHash: createXxHash, + regExp: /^[0-9a-f]{16}$/ + }; + }, + md4: () => { + const createMd4Hash = require("../lib/util/hash/md4"); + return { + createHash: createMd4Hash, + createReferenceHash: + Number.parseInt(process.version.slice(1), 10) < 17 + ? async () => createHash("md4") + : createMd4Hash, + regExp: /^[0-9a-f]{32}$/ + }; + }, + "md4-createHash": () => { + const createMd4Hash = require("../lib/util/hash/md4"); + const createHash = require("../lib/util/createHash"); + return { + createHash: () => createHash("md4"), + createReferenceHash: createMd4Hash, + regExp: /^[0-9a-f]{32}$/ + }; + } +}; + +for (const name of Object.keys(wasmHashes)) { + const { createHash, createReferenceHash, regExp } = wasmHashes[name](); + + describe(name, () => { + const sizes = [ + 1, + 2, + 3, + 4, + 5, + 7, + 8, + 9, + 16, + 31, + 32, + 33, + 64 - 10, + 64 - 9, + 64 - 8, + 63, + 64, + 65, + 100, + 1000, + 65536 - 1, + 65536, + 65536 + 1, + 65536 + 31, + 65536 * 5, + 65536 * 7 - 1, + 65536 * 9 + 31 + ]; + + const test = (name, sizes) => { + it(`${name} should generate a hash from binary data`, async () => { + const hash = createHash(); + const hashString = createHash(); + const reference = await createReferenceHash(); + for (const size of sizes) { + const bytes = randomBytes(size); + const string = bytes.toString("base64"); + hash.update(bytes); + hashString.update(string, "base64"); + reference.update(bytes); + } + const result = hash.digest("hex"); + expect(result).toMatch(regExp); + const resultFromString = hashString.digest("hex"); + expect(resultFromString).toMatch(regExp); + const expected = reference.digest("hex"); + expect(result).toBe(expected); + expect(resultFromString).toBe(expected); + }); + }; + + test("empty hash", []); + + for (const size of sizes) { + test(`single update ${size} bytes`, [size]); + } + + for (const size1 of sizes) { + for (const size2 of sizes) { + test(`two updates ${size1} + ${size2} bytes`, [size1, size2]); + } + } + test("many updates 1", sizes); + test("many updates 2", sizes.slice().reverse()); + test("many updates 3", sizes.concat(sizes.slice().reverse())); + test("many updates 4", sizes.slice().reverse().concat(sizes)); + + const unicodeTest = (name, codePoints) => { + it(`${name} should hash unicode chars correctly`, async () => { + const hash = createHash(); + const reference = await createReferenceHash(); + const str = + typeof codePoints === "string" + ? codePoints + : String.fromCodePoint(...codePoints); + hash.update(str); + reference.update(str); + const result = hash.digest("hex"); + expect(result).toMatch(regExp); + const expected = reference.digest("hex"); + expect(result).toBe(expected); + }); + }; + + const unicodeRangeTest = (name, start, end) => { + const codePoints = []; + for (let i = start; i <= end; i++) { + codePoints.push(i); + } + unicodeTest(name, codePoints); + }; + + // cspell:word Thaana + unicodeRangeTest("Latin-1 Supplement", 0xa0, 0xff); + unicodeRangeTest("Latin Extended", 0x100, 0x24f); + unicodeRangeTest("Thaana", 0x780, 0x7bf); + unicodeRangeTest("Devanagari", 0x900, 0x97f); + unicodeRangeTest("Emoticons", 0x1f600, 0x1f64f); + + unicodeTest("with zero char", "abc\0💩"); + unicodeTest("weird code point after long code point", [1497, 243248]); + + for (let i = 0; i < 1000; i++) { + const chars = Array.from({ length: 20 }, () => + Math.floor(Math.random() * 0x10ffff) + ); + unicodeTest(`fuzzy ${JSON.stringify(chars)}`, chars); + } + }); +} diff --git a/test/Watch.test.js b/test/Watch.test.js new file mode 100644 index 00000000000..cba04e35eab --- /dev/null +++ b/test/Watch.test.js @@ -0,0 +1,61 @@ +"use strict"; + +require("./helpers/warmup-webpack"); + +const path = require("path"); +const webpack = require(".."); +const { createFsFromVolume, Volume } = require("memfs"); + +describe("Watch", () => { + jest.setTimeout(10000); + + it("should only compile a single time", done => { + let counterBeforeCompile = 0; + let counterDone = 0; + let counterHandler = 0; + const compiler = webpack( + { + context: path.resolve(__dirname, "fixtures/watch"), + watch: true, + mode: "development", + snapshot: { + managedPaths: [/^(.+?[\\/]node_modules[\\/])/] + }, + experiments: { + futureDefaults: true + }, + module: { + // unsafeCache: false, + rules: [ + { + test: /\.js$/, + use: "some-loader" + } + ] + }, + plugins: [ + c => { + c.hooks.beforeCompile.tap("test", () => { + counterBeforeCompile++; + }); + c.hooks.done.tap("test", () => { + counterDone++; + }); + } + ] + }, + (err, stats) => { + if (err) return done(err); + if (stats.hasErrors()) return done(new Error(stats.toString())); + counterHandler++; + } + ); + compiler.outputFileSystem = createFsFromVolume(new Volume()); + setTimeout(() => { + expect(counterBeforeCompile).toBe(1); + expect(counterDone).toBe(1); + expect(counterHandler).toBe(1); + compiler.close(done); + }, 5000); + }); +}); diff --git a/test/WatchCacheUnaffectedTestCases.longtest.js b/test/WatchCacheUnaffectedTestCases.longtest.js new file mode 100644 index 00000000000..3a9ab819e4c --- /dev/null +++ b/test/WatchCacheUnaffectedTestCases.longtest.js @@ -0,0 +1,8 @@ +const { describeCases } = require("./WatchTestCases.template"); + +describeCases({ + name: "WatchCacheUnaffectedTestCases", + experiments: { + cacheUnaffected: true + } +}); diff --git a/test/WatchClose.test.js b/test/WatchClose.test.js new file mode 100644 index 00000000000..9048bf97965 --- /dev/null +++ b/test/WatchClose.test.js @@ -0,0 +1,66 @@ +"use strict"; + +require("./helpers/warmup-webpack"); + +const path = require("path"); + +describe("WatchClose", () => { + jest.setTimeout(5000); + + describe("multiple calls watcher", () => { + const fixturePath = path.join(__dirname, "fixtures"); + const outputPath = path.join(__dirname, "js/WatchClose"); + const filePath = path.join(fixturePath, "a.js"); + + let compiler; + let watcher; + + beforeEach(() => { + const webpack = require("../"); + compiler = webpack({ + mode: "development", + entry: filePath, + output: { + path: outputPath, + filename: "bundle.js" + } + }); + watcher = compiler.watch({ poll: 300 }, () => {}); + }); + + afterEach(() => { + watcher.close(); + compiler = null; + }); + + /** + * @param {import("../").Watching} watcher watcher + * @param {(err?: null | Error) -> void} callback callback + * @returns {Promise} + */ + function close(watcher, callback) { + return new Promise(res => { + const onClose = () => { + callback(); + res(); + }; + watcher.close(onClose); + }); + } + + it("each callback should be called", async () => { + let num = 0; + + await Promise.all([ + close(watcher, () => (num += 1)), + close(watcher, () => (num += 10)) + ]); + await Promise.all([ + close(watcher, () => (num += 100)), + close(watcher, () => (num += 1000)) + ]); + + expect(num).toBe(1111); + }); + }); +}); diff --git a/test/WatchDetection.test.js b/test/WatchDetection.test.js index 590c56ef871..f2123c56690 100644 --- a/test/WatchDetection.test.js +++ b/test/WatchDetection.test.js @@ -1,20 +1,23 @@ "use strict"; -/*globals describe it */ const path = require("path"); -const fs = require("fs"); -const MemoryFs = require("memory-fs"); +const fs = require("graceful-fs"); +const { createFsFromVolume, Volume } = require("memfs"); -const webpack = require("../"); +const webpack = require(".."); describe("WatchDetection", () => { if (process.env.NO_WATCH_TESTS) { + // eslint-disable-next-line jest/no-disabled-tests it.skip("long running tests excluded", () => {}); return; } jest.setTimeout(10000); + createTestCase(100, true); + createTestCase(10, true); + createTestCase(600, true); for (let changeTimeout = 10; changeTimeout < 100; changeTimeout += 10) { createTestCase(changeTimeout); } @@ -22,12 +25,18 @@ describe("WatchDetection", () => { createTestCase(changeTimeout); } - function createTestCase(changeTimeout) { - describe(`time between changes ${changeTimeout}ms`, () => { + /** + * @param {number} changeTimeout change timeout + * @param {boolean=} invalidate need invalidate? + */ + function createTestCase(changeTimeout, invalidate) { + describe(`time between changes ${changeTimeout}ms${ + invalidate ? " with invalidate call" : "" + }`, () => { const fixturePath = path.join( __dirname, "fixtures", - "temp-" + changeTimeout + `temp-${changeTimeout}` ); const filePath = path.join(fixturePath, "file.js"); const file2Path = path.join(fixturePath, "file2.js"); @@ -36,7 +45,7 @@ describe("WatchDetection", () => { beforeAll(() => { try { fs.mkdirSync(fixturePath); - } catch (e) { + } catch (_err) { // empty } fs.writeFileSync(filePath, "require('./file2')", "utf-8"); @@ -47,17 +56,17 @@ describe("WatchDetection", () => { setTimeout(() => { try { fs.unlinkSync(filePath); - } catch (e) { + } catch (_err) { // empty } try { fs.unlinkSync(file2Path); - } catch (e) { + } catch (_err) { // empty } try { fs.rmdirSync(fixturePath); - } catch (e) { + } catch (_err) { // empty } done(); @@ -67,13 +76,15 @@ describe("WatchDetection", () => { it("should build the bundle correctly", done => { const compiler = webpack({ mode: "development", - entry: loaderPath + "!" + filePath, + entry: `${loaderPath}!${filePath}`, output: { - path: "/", + path: "/directory", filename: "bundle.js" } }); - const memfs = (compiler.outputFileSystem = new MemoryFs()); + const memfs = (compiler.outputFileSystem = createFsFromVolume( + new Volume() + )); let onChange; compiler.hooks.done.tap("WatchDetectionTest", () => { if (onChange) onChange(); @@ -83,14 +94,17 @@ describe("WatchDetection", () => { step1(); + /** + * @returns {void} + */ function step1() { onChange = () => { if ( - memfs.readFileSync("/bundle.js") && + memfs.readFileSync("/directory/bundle.js") && memfs - .readFileSync("/bundle.js") + .readFileSync("/directory/bundle.js") .toString() - .indexOf("original") >= 0 + .includes("original") ) step2(); }; @@ -103,8 +117,14 @@ describe("WatchDetection", () => { ); } + /** + * @returns {void} + */ function step2() { - onChange = null; + onChange = () => { + expect(compiler.modifiedFiles).not.toBe(undefined); + expect(compiler.removedFiles).not.toBe(undefined); + }; fs.writeFile( filePath, @@ -116,21 +136,28 @@ describe("WatchDetection", () => { setTimeout(step3, changeTimeout); } + /** + * @returns {void} + */ function step3() { - onChange = null; - + if (invalidate) watcher.invalidate(); fs.writeFile(file2Path, "wrong", "utf-8", handleError); setTimeout(step4, changeTimeout); } + /** + * @returns {void} + */ function step4() { onChange = () => { + expect(compiler.modifiedFiles).not.toBe(undefined); + expect(compiler.removedFiles).not.toBe(undefined); if ( memfs - .readFileSync("/bundle.js") + .readFileSync("/directory/bundle.js") .toString() - .indexOf("correct") >= 0 + .includes("correct") ) step5(); }; @@ -138,6 +165,9 @@ describe("WatchDetection", () => { fs.writeFile(file2Path, "correct", "utf-8", handleError); } + /** + * @returns {void} + */ function step5() { onChange = null; @@ -146,6 +176,9 @@ describe("WatchDetection", () => { }); } + /** + * @param {unknown} err err + */ function handleError(err) { if (err) done(err); } diff --git a/test/WatchSuspend.test.js b/test/WatchSuspend.test.js new file mode 100644 index 00000000000..5e0d572e432 --- /dev/null +++ b/test/WatchSuspend.test.js @@ -0,0 +1,180 @@ +"use strict"; + +require("./helpers/warmup-webpack"); + +const path = require("path"); +const fs = require("fs"); + +describe("WatchSuspend", () => { + if (process.env.NO_WATCH_TESTS) { + // eslint-disable-next-line jest/no-disabled-tests + it.skip("long running tests excluded", () => {}); + return; + } + + jest.setTimeout(5000); + + describe("suspend and resume watcher", () => { + const fixturePath = path.join( + __dirname, + "fixtures", + `temp-watch-${Date.now()}` + ); + const filePath = path.join(fixturePath, "file.js"); + const file2Path = path.join(fixturePath, "file2.js"); + const file3Path = path.join(fixturePath, "file3.js"); + const outputPath = path.join(__dirname, "js/WatchSuspend"); + const outputFile = path.join(outputPath, "bundle.js"); + let compiler = null; + let watching = null; + let onChange = null; + + beforeAll(() => { + try { + fs.mkdirSync(fixturePath); + } catch (_err) { + // skip + } + try { + fs.writeFileSync(filePath, "'foo'", "utf-8"); + fs.writeFileSync(file2Path, "'file2'", "utf-8"); + fs.writeFileSync(file3Path, "'file3'", "utf-8"); + } catch (_err) { + // skip + } + const webpack = require("../"); + compiler = webpack({ + mode: "development", + entry: filePath, + output: { + path: outputPath, + filename: "bundle.js" + } + }); + watching = compiler.watch({ aggregateTimeout: 50 }, () => {}); + + compiler.hooks.done.tap("WatchSuspendTest", () => { + if (onChange) onChange(); + }); + }); + + afterAll(() => { + watching.close(); + compiler = null; + try { + fs.unlinkSync(filePath); + } catch (_err) { + // skip + } + try { + fs.rmdirSync(fixturePath); + } catch (_err) { + // skip + } + }); + + it("should compile successfully", done => { + onChange = () => { + expect(fs.readFileSync(outputFile, "utf-8")).toContain("'foo'"); + onChange = null; + done(); + }; + }); + + it("should suspend compilation", done => { + onChange = jest.fn(); + watching.suspend(); + fs.writeFileSync(filePath, "'bar'", "utf-8"); + setTimeout(() => { + expect(onChange.mock.calls.length).toBe(0); + onChange = null; + done(); + }, 1000); + }); + + it("should resume compilation", done => { + onChange = () => { + expect(fs.readFileSync(outputFile, "utf-8")).toContain("'bar'"); + onChange = null; + done(); + }; + watching.resume(); + }); + + for (const changeBefore of [false, true]) + for (const delay of [200, 1500]) { + // eslint-disable-next-line no-loop-func + it(`should not ignore changes during resumed compilation (changeBefore: ${changeBefore}, delay: ${delay}ms)`, async () => { + // aggregateTimeout must be long enough for this test + // So set-up new watcher and wait when initial compilation is done + await new Promise(resolve => { + watching.close(() => { + watching = compiler.watch({ aggregateTimeout: 1000 }, () => { + resolve(); + }); + }); + }); + return new Promise(resolve => { + if (changeBefore) fs.writeFileSync(filePath, "'bar'", "utf-8"); + setTimeout(() => { + watching.suspend(); + fs.writeFileSync(filePath, "'baz'", "utf-8"); + + onChange = "throw"; + setTimeout(() => { + onChange = () => { + expect(fs.readFileSync(outputFile, "utf-8")).toContain( + "'baz'" + ); + expect( + compiler.modifiedFiles && + Array.from(compiler.modifiedFiles).sort() + ).toEqual([filePath]); + expect( + compiler.removedFiles && Array.from(compiler.removedFiles) + ).toEqual([]); + onChange = null; + resolve(); + }; + watching.resume(); + }, delay); + }, 200); + }); + }); + } + + it("should not drop changes when suspended", done => { + const aggregateTimeout = 50; + // Trigger initial compilation with file2.js (assuming correct) + fs.writeFileSync( + filePath, + 'require("./file2.js"); require("./file3.js")', + "utf-8" + ); + + onChange = () => { + // Initial compilation is done, start the test + watching.suspend(); + + // Trigger the first change (works as expected): + fs.writeFileSync(file2Path, "'foo'", "utf-8"); + + // Trigger the second change _after_ aggregation timeout of the first + setTimeout(() => { + fs.writeFileSync(file3Path, "'bar'", "utf-8"); + + // Wait when the file3 edit is settled and re-compile + setTimeout(() => { + watching.resume(); + + onChange = () => { + onChange = null; + expect(fs.readFileSync(outputFile, "utf-8")).toContain("'bar'"); + done(); + }; + }, 200); + }, aggregateTimeout + 50); + }; + }); + }); +}); diff --git a/test/WatchTestCases.longtest.js b/test/WatchTestCases.longtest.js new file mode 100644 index 00000000000..14de99b424e --- /dev/null +++ b/test/WatchTestCases.longtest.js @@ -0,0 +1,5 @@ +const { describeCases } = require("./WatchTestCases.template"); + +describeCases({ + name: "WatchTestCases" +}); diff --git a/test/WatchTestCases.template.js b/test/WatchTestCases.template.js new file mode 100644 index 00000000000..ea45702698d --- /dev/null +++ b/test/WatchTestCases.template.js @@ -0,0 +1,442 @@ +"use strict"; + +require("./helpers/warmup-webpack"); + +/** @typedef {Record} Env */ +/** @typedef {{ testPath: string, srcPath: string }} TestOptions */ + +const path = require("path"); +const fs = require("graceful-fs"); +const vm = require("vm"); +const rimraf = require("rimraf"); +const checkArrayExpectation = require("./checkArrayExpectation"); +const createLazyTestEnv = require("./helpers/createLazyTestEnv"); +const { remove } = require("./helpers/remove"); +const prepareOptions = require("./helpers/prepareOptions"); +const deprecationTracking = require("./helpers/deprecationTracking"); +const FakeDocument = require("./helpers/FakeDocument"); + +/** + * @param {string} src src + * @param {string} dest dest + * @param {boolean} initial is initial? + */ +function copyDiff(src, dest, initial) { + if (!fs.existsSync(dest)) fs.mkdirSync(dest); + const files = fs.readdirSync(src); + for (const filename of files) { + const srcFile = path.join(src, filename); + const destFile = path.join(dest, filename); + const directory = fs.statSync(srcFile).isDirectory(); + if (directory) { + copyDiff(srcFile, destFile, initial); + } else { + const content = fs.readFileSync(srcFile); + if (/^DELETE\s*$/.test(content.toString("utf-8"))) { + fs.unlinkSync(destFile); + } else if (/^DELETE_DIRECTORY\s*$/.test(content.toString("utf-8"))) { + rimraf.sync(destFile); + } else { + fs.writeFileSync(destFile, content); + if (initial) { + const longTimeAgo = Date.now() - 1000 * 60 * 60 * 24; + fs.utimesSync( + destFile, + Date.now() - longTimeAgo, + Date.now() - longTimeAgo + ); + } + } + } + } +} + +const describeCases = config => { + describe(config.name, () => { + if (process.env.NO_WATCH_TESTS) { + // eslint-disable-next-line jest/no-disabled-tests + it.skip("long running tests excluded", () => {}); + return; + } + + const casesPath = path.join(__dirname, "watchCases"); + const categories = fs.readdirSync(casesPath).map(cat => ({ + name: cat, + tests: fs + .readdirSync(path.join(casesPath, cat)) + .filter(folder => !folder.includes("_")) + .filter(testName => { + const testDirectory = path.join(casesPath, cat, testName); + const filterPath = path.join(testDirectory, "test.filter.js"); + if (fs.existsSync(filterPath) && !require(filterPath)(config)) { + // eslint-disable-next-line jest/no-disabled-tests, jest/valid-describe-callback + describe.skip(testName, () => it("filtered", () => {})); + return false; + } + return true; + }) + .sort() + })); + beforeAll(() => { + let dest = path.join(__dirname, "js"); + if (!fs.existsSync(dest)) fs.mkdirSync(dest); + dest = path.join(__dirname, "js", `${config.name}-src`); + if (!fs.existsSync(dest)) fs.mkdirSync(dest); + }); + for (const category of categories) { + beforeAll(() => { + const dest = path.join( + __dirname, + "js", + `${config.name}-src`, + category.name + ); + if (!fs.existsSync(dest)) fs.mkdirSync(dest); + }); + describe(category.name, () => { + for (const testName of category.tests) { + describe(testName, () => { + const tempDirectory = path.join( + __dirname, + "js", + `${config.name}-src`, + category.name, + testName + ); + const testDirectory = path.join(casesPath, category.name, testName); + /** @type {TODO} */ + const runs = fs + .readdirSync(testDirectory) + .sort() + .filter(name => + fs.statSync(path.join(testDirectory, name)).isDirectory() + ) + .map(name => ({ name })); + + beforeAll(done => { + rimraf(tempDirectory, done); + }); + + it(`${testName} should compile`, done => { + const outputDirectory = path.join( + __dirname, + "js", + config.name, + category.name, + testName + ); + + rimraf.sync(outputDirectory); + + let options = {}; + const configPath = path.join(testDirectory, "webpack.config.js"); + if (fs.existsSync(configPath)) { + options = prepareOptions(require(configPath), { + testPath: outputDirectory, + srcPath: tempDirectory + }); + } + const applyConfig = (options, idx) => { + if (!options.mode) options.mode = "development"; + if (!options.context) options.context = tempDirectory; + if (!options.entry) options.entry = "./index.js"; + if (!options.target) options.target = "async-node"; + if (!options.output) options.output = {}; + if (!options.output.path) options.output.path = outputDirectory; + if (typeof options.output.pathinfo === "undefined") + options.output.pathinfo = true; + if (!options.output.filename) + options.output.filename = "bundle.js"; + if (options.cache && options.cache.type === "filesystem") { + const cacheDirectory = path.join(tempDirectory, ".cache"); + options.cache.cacheDirectory = cacheDirectory; + options.cache.name = `config-${idx}`; + } + if (config.experiments) { + if (!options.experiments) options.experiments = {}; + for (const key of Object.keys(config.experiments)) { + if (options.experiments[key] === undefined) + options.experiments[key] = config.experiments[key]; + } + } + if (config.optimization) { + if (!options.optimization) options.optimization = {}; + for (const key of Object.keys(config.optimization)) { + if (options.optimization[key] === undefined) + options.optimization[key] = config.optimization[key]; + } + } + }; + if (Array.isArray(options)) { + for (const [idx, item] of options.entries()) { + applyConfig(item, idx); + } + } else { + applyConfig(options, 0); + } + + const state = {}; + let runIdx = 0; + let waitMode = false; + let run = runs[runIdx]; + let triggeringFilename; + let lastHash = ""; + const currentWatchStepModule = require("./helpers/currentWatchStep"); + let compilationFinished = done; + currentWatchStepModule.step = run.name; + copyDiff(path.join(testDirectory, run.name), tempDirectory, true); + + setTimeout(() => { + const deprecationTracker = deprecationTracking.start(); + const webpack = require(".."); + const compiler = webpack(options); + compiler.hooks.invalid.tap( + "WatchTestCasesTest", + (filename, mtime) => { + triggeringFilename = filename; + } + ); + compiler.watch( + { + aggregateTimeout: 1000 + }, + (err, stats) => { + if (err) return compilationFinished(err); + if (!stats) { + return compilationFinished( + new Error("No stats reported from Compiler") + ); + } + if (stats.hash === lastHash) return; + lastHash = stats.hash; + if (run.done && lastHash !== stats.hash) { + return compilationFinished( + new Error( + `Compilation changed but no change was issued ${ + lastHash + } != ${stats.hash} (run ${runIdx})\n` + + `Triggering change: ${triggeringFilename}` + ) + ); + } + if (waitMode) return; + run.done = true; + run.stats = stats; + if (err) return compilationFinished(err); + const statOptions = { + preset: "verbose", + cached: true, + cachedAssets: true, + cachedModules: true, + colors: false + }; + fs.mkdirSync(outputDirectory, { recursive: true }); + fs.writeFileSync( + path.join( + outputDirectory, + `stats.${runs[runIdx] && runs[runIdx].name}.txt` + ), + stats.toString(statOptions), + "utf-8" + ); + const jsonStats = stats.toJson({ + errorDetails: true + }); + if ( + checkArrayExpectation( + path.join(testDirectory, run.name), + jsonStats, + "error", + "Error", + options, + compilationFinished + ) + ) + return; + if ( + checkArrayExpectation( + path.join(testDirectory, run.name), + jsonStats, + "warning", + "Warning", + options, + compilationFinished + ) + ) + return; + + const globalContext = { + console, + expect, + setTimeout, + clearTimeout, + document: new FakeDocument() + }; + + /** + * @param {string} currentDirectory the current directory + * @param {TODO} module a module + * @returns {EXPECTED_ANY} required module + * @private + */ + function _require(currentDirectory, module) { + if (Array.isArray(module) || /^\.\.?\//.test(module)) { + let fn; + let content; + let p; + if (Array.isArray(module)) { + p = path.join(currentDirectory, module[0]); + content = module + .map(arg => { + p = path.join(currentDirectory, arg); + return fs.readFileSync(p, "utf-8"); + }) + .join("\n"); + } else { + p = path.join(currentDirectory, module); + content = fs.readFileSync(p, "utf-8"); + } + if ( + options.target === "web" || + options.target === "webworker" + ) { + fn = vm.runInNewContext( + "(function(require, module, exports, __dirname, __filename, it, WATCH_STEP, STATS_JSON, STATE, expect, window, self) {" + + `function nsObj(m) { Object.defineProperty(m, Symbol.toStringTag, { value: "Module" }); return m; }${ + content + }\n})`, + globalContext, + p + ); + } else { + fn = vm.runInThisContext( + "(function(require, module, exports, __dirname, __filename, it, WATCH_STEP, STATS_JSON, STATE, expect) {" + + "global.expect = expect;" + + `function nsObj(m) { Object.defineProperty(m, Symbol.toStringTag, { value: "Module" }); return m; }${ + content + }\n})`, + p + ); + } + const m = { + exports: {} + }; + fn.call( + m.exports, + _require.bind(null, path.dirname(p)), + m, + m.exports, + path.dirname(p), + p, + run.it, + run.name, + jsonStats, + state, + expect, + globalContext, + globalContext + ); + return module.exports; + } else if ( + testConfig.modules && + module in testConfig.modules + ) { + return testConfig.modules[module]; + } + return jest.requireActual(module); + } + + let testConfig = {}; + try { + // try to load a test file + testConfig = require( + path.join(testDirectory, "test.config.js") + ); + } catch (_err) { + // empty + } + + if (testConfig.noTests) + return process.nextTick(compilationFinished); + _require( + outputDirectory, + testConfig.bundlePath || "./bundle.js" + ); + + if (run.getNumberOfTests() < 1) + return compilationFinished( + new Error("No tests exported by test case") + ); + + run.it( + "should compile the next step", + done => { + runIdx++; + if (runIdx < runs.length) { + run = runs[runIdx]; + waitMode = true; + setTimeout(() => { + waitMode = false; + compilationFinished = done; + currentWatchStepModule.step = run.name; + copyDiff( + path.join(testDirectory, run.name), + tempDirectory, + false + ); + }, 1500); + } else { + const deprecations = deprecationTracker(); + if ( + checkArrayExpectation( + testDirectory, + { deprecations }, + "deprecation", + "Deprecation", + options, + done + ) + ) { + compiler.close(() => {}); + return; + } + compiler.close(done); + } + }, + 45000 + ); + + compilationFinished(); + } + ); + }, 300); + }, 45000); + + for (const run of runs) { + const { it: _it, getNumberOfTests } = createLazyTestEnv( + 10000, + run.name + ); + run.it = _it; + run.getNumberOfTests = getNumberOfTests; + it(`${run.name} should allow to read stats`, done => { + if (run.stats) { + run.stats.toString({ all: true }); + run.stats = undefined; + } + done(); + }); + } + + afterAll(() => { + remove(tempDirectory); + }); + }); + } + }); + } + }); +}; + +// eslint-disable-next-line jest/no-export +module.exports.describeCases = describeCases; diff --git a/test/WatchTestCases.test.js b/test/WatchTestCases.test.js deleted file mode 100644 index 95255c29872..00000000000 --- a/test/WatchTestCases.test.js +++ /dev/null @@ -1,358 +0,0 @@ -/* global beforeAll expect fit */ -"use strict"; - -const path = require("path"); -const fs = require("fs"); -const vm = require("vm"); -const mkdirp = require("mkdirp"); -const rimraf = require("rimraf"); -const checkArrayExpectation = require("./checkArrayExpectation"); -const createLazyTestEnv = require("./helpers/createLazyTestEnv"); -const { remove } = require("./helpers/remove"); - -const Stats = require("../lib/Stats"); -const webpack = require("../lib/webpack"); - -function copyDiff(src, dest, initial) { - if (!fs.existsSync(dest)) fs.mkdirSync(dest); - const files = fs.readdirSync(src); - files.forEach(filename => { - const srcFile = path.join(src, filename); - const destFile = path.join(dest, filename); - const directory = fs.statSync(srcFile).isDirectory(); - if (directory) { - copyDiff(srcFile, destFile, initial); - } else { - var content = fs.readFileSync(srcFile); - if (/^DELETE\s*$/.test(content.toString("utf-8"))) { - fs.unlinkSync(destFile); - } else { - fs.writeFileSync(destFile, content); - if (initial) { - const longTimeAgo = Date.now() - 1000 * 60 * 60 * 24; - fs.utimesSync( - destFile, - Date.now() - longTimeAgo, - Date.now() - longTimeAgo - ); - } - } - } - }); -} - -describe("WatchTestCases", () => { - if (process.env.NO_WATCH_TESTS) { - it.skip("long running tests excluded", () => {}); - return; - } - - const casesPath = path.join(__dirname, "watchCases"); - let categories = fs.readdirSync(casesPath); - - categories = categories.map(cat => { - return { - name: cat, - tests: fs - .readdirSync(path.join(casesPath, cat)) - .filter(folder => folder.indexOf("_") < 0) - .filter(testName => { - const testDirectory = path.join(casesPath, cat, testName); - const filterPath = path.join(testDirectory, "test.filter.js"); - if (fs.existsSync(filterPath) && !require(filterPath)()) { - describe.skip(testName, () => it("filtered")); - return false; - } - return true; - }) - .sort() - }; - }); - beforeAll(() => { - let dest = path.join(__dirname, "js"); - if (!fs.existsSync(dest)) fs.mkdirSync(dest); - dest = path.join(__dirname, "js", "watch-src"); - if (!fs.existsSync(dest)) fs.mkdirSync(dest); - }); - categories.forEach(category => { - beforeAll(() => { - const dest = path.join(__dirname, "js", "watch-src", category.name); - if (!fs.existsSync(dest)) fs.mkdirSync(dest); - }); - describe(category.name, () => { - category.tests.forEach(testName => { - describe(testName, () => { - const tempDirectory = path.join( - __dirname, - "js", - "watch-src", - category.name, - testName - ); - const testDirectory = path.join(casesPath, category.name, testName); - const runs = fs - .readdirSync(testDirectory) - .sort() - .filter(name => { - return fs.statSync(path.join(testDirectory, name)).isDirectory(); - }) - .map(name => ({ name })); - - beforeAll(done => { - rimraf(tempDirectory, done); - }); - - it( - testName + " should compile", - done => { - const outputDirectory = path.join( - __dirname, - "js", - "watch", - category.name, - testName - ); - - let options = {}; - const configPath = path.join(testDirectory, "webpack.config.js"); - if (fs.existsSync(configPath)) options = require(configPath); - const applyConfig = options => { - if (!options.mode) options.mode = "development"; - if (!options.context) options.context = tempDirectory; - if (!options.entry) options.entry = "./index.js"; - if (!options.target) options.target = "async-node"; - if (!options.output) options.output = {}; - if (!options.output.path) options.output.path = outputDirectory; - if (typeof options.output.pathinfo === "undefined") - options.output.pathinfo = true; - if (!options.output.filename) - options.output.filename = "bundle.js"; - }; - if (Array.isArray(options)) { - options.forEach(applyConfig); - } else { - applyConfig(options); - } - - const state = {}; - let runIdx = 0; - let waitMode = false; - let run = runs[runIdx]; - let triggeringFilename; - let lastHash = ""; - const currentWatchStepModule = require("./helpers/currentWatchStep"); - let compilationFinished = done; - currentWatchStepModule.step = run.name; - copyDiff(path.join(testDirectory, run.name), tempDirectory, true); - - setTimeout(() => { - const compiler = webpack(options); - compiler.hooks.invalid.tap( - "WatchTestCasesTest", - (filename, mtime) => { - triggeringFilename = filename; - } - ); - const watching = compiler.watch( - { - aggregateTimeout: 1000 - }, - (err, stats) => { - if (err) return compilationFinished(err); - if (!stats) - return compilationFinished( - new Error("No stats reported from Compiler") - ); - if (stats.hash === lastHash) return; - lastHash = stats.hash; - if (run.done && lastHash !== stats.hash) { - return compilationFinished( - new Error( - "Compilation changed but no change was issued " + - lastHash + - " != " + - stats.hash + - " (run " + - runIdx + - ")\n" + - "Triggering change: " + - triggeringFilename - ) - ); - } - if (waitMode) return; - run.done = true; - if (err) return compilationFinished(err); - const statOptions = Stats.presetToOptions("verbose"); - statOptions.colors = false; - mkdirp.sync(outputDirectory); - fs.writeFileSync( - path.join(outputDirectory, "stats.txt"), - stats.toString(statOptions), - "utf-8" - ); - const jsonStats = stats.toJson({ - errorDetails: true - }); - if ( - checkArrayExpectation( - path.join(testDirectory, run.name), - jsonStats, - "error", - "Error", - compilationFinished - ) - ) - return; - if ( - checkArrayExpectation( - path.join(testDirectory, run.name), - jsonStats, - "warning", - "Warning", - compilationFinished - ) - ) - return; - - const globalContext = { - console: console, - expect: expect - }; - - function _require(currentDirectory, module) { - if (Array.isArray(module) || /^\.\.?\//.test(module)) { - let fn; - let content; - let p; - if (Array.isArray(module)) { - p = path.join(currentDirectory, module[0]); - content = module - .map(arg => { - p = path.join(currentDirectory, arg); - return fs.readFileSync(p, "utf-8"); - }) - .join("\n"); - } else { - p = path.join(currentDirectory, module); - content = fs.readFileSync(p, "utf-8"); - } - if ( - options.target === "web" || - options.target === "webworker" - ) { - fn = vm.runInNewContext( - "(function(require, module, exports, __dirname, __filename, it, WATCH_STEP, STATS_JSON, STATE, expect, window) {" + - 'function nsObj(m) { Object.defineProperty(m, Symbol.toStringTag, { value: "Module" }); return m; }' + - content + - "\n})", - globalContext, - p - ); - } else { - fn = vm.runInThisContext( - "(function(require, module, exports, __dirname, __filename, it, WATCH_STEP, STATS_JSON, STATE, expect) {" + - "global.expect = expect;" + - 'function nsObj(m) { Object.defineProperty(m, Symbol.toStringTag, { value: "Module" }); return m; }' + - content + - "\n})", - p - ); - } - const m = { - exports: {} - }; - fn.call( - m.exports, - _require.bind(null, path.dirname(p)), - m, - m.exports, - path.dirname(p), - p, - run.it, - run.name, - jsonStats, - state, - expect, - globalContext - ); - return module.exports; - } else if ( - testConfig.modules && - module in testConfig.modules - ) { - return testConfig.modules[module]; - } else return require.requireActual(module); - } - - let testConfig = {}; - try { - // try to load a test file - testConfig = require(path.join( - testDirectory, - "test.config.js" - )); - } catch (e) { - // empty - } - - if (testConfig.noTests) - return process.nextTick(compilationFinished); - _require( - outputDirectory, - testConfig.bundlePath || "./bundle.js" - ); - - if (run.getNumberOfTests() < 1) - return compilationFinished( - new Error("No tests exported by test case") - ); - - run.it("should compile the next step", done => { - runIdx++; - if (runIdx < runs.length) { - run = runs[runIdx]; - waitMode = true; - setTimeout(() => { - waitMode = false; - compilationFinished = done; - currentWatchStepModule.step = run.name; - copyDiff( - path.join(testDirectory, run.name), - tempDirectory, - false - ); - }, 1500); - } else { - watching.close(); - - done(); - } - }); - - compilationFinished(); - } - ); - }, 300); - }, - 45000 - ); - - for (const run of runs) { - const { it: _it, getNumberOfTests } = createLazyTestEnv( - jasmine.getEnv(), - 10000, - run.name - ); - run.it = _it; - run.getNumberOfTests = getNumberOfTests; - } - - afterAll(() => { - remove(tempDirectory); - }); - }); - }); - }); - }); -}); diff --git a/test/WatcherEvents.test.js b/test/WatcherEvents.test.js index 00fc41dbfe5..fee7a7912f5 100644 --- a/test/WatcherEvents.test.js +++ b/test/WatcherEvents.test.js @@ -1,34 +1,32 @@ "use strict"; -/* globals describe it */ const path = require("path"); -const MemoryFs = require("memory-fs"); -const webpack = require("../"); +const { createFsFromVolume, Volume } = require("memfs"); +const webpack = require(".."); const createCompiler = config => { const compiler = webpack(config); - compiler.outputFileSystem = new MemoryFs(); + compiler.outputFileSystem = createFsFromVolume(new Volume()); return compiler; }; -const createSingleCompiler = () => { - return createCompiler({ +const createSingleCompiler = () => + createCompiler({ context: path.join(__dirname, "fixtures"), entry: "./a.js" }); -}; -const createMultiCompiler = () => { - return createCompiler([ +const createMultiCompiler = () => + createCompiler([ { context: path.join(__dirname, "fixtures"), entry: "./a.js" } ]); -}; describe("WatcherEvents", () => { if (process.env.NO_WATCH_TESTS) { + // eslint-disable-next-line jest/no-disabled-tests it.skip("long running tests excluded", () => {}); return; } diff --git a/test/WebEnvironmentPlugin.unittest.js b/test/WebEnvironmentPlugin.unittest.js deleted file mode 100644 index 137956a0093..00000000000 --- a/test/WebEnvironmentPlugin.unittest.js +++ /dev/null @@ -1,23 +0,0 @@ -"use strict"; - -const WebEnvironmentPlugin = require("../lib/web/WebEnvironmentPlugin"); - -describe("WebEnvironmentPlugin", () => { - describe("apply", () => { - const WebEnvironmentPluginInstance = new WebEnvironmentPlugin( - "inputFileSystem", - "outputFileSystem" - ); - const compileSpy = { - outputFileSystem: "otherOutputFileSystem" - }; - - WebEnvironmentPluginInstance.apply(compileSpy); - - it("should set compiler.outputFileSystem information with the same as set in WebEnvironmentPlugin", () => { - expect(compileSpy.outputFileSystem).toBe( - WebEnvironmentPluginInstance.outputFileSystem - ); - }); - }); -}); diff --git a/test/WebpackError.unittest.js b/test/WebpackError.unittest.js index cbf90fab499..3b1151a1c46 100644 --- a/test/WebpackError.unittest.js +++ b/test/WebpackError.unittest.js @@ -1,8 +1,5 @@ "use strict"; -const path = require("path"); -const util = require("util"); - const WebpackError = require("../lib/WebpackError"); describe("WebpackError", () => { @@ -19,11 +16,8 @@ describe("WebpackError", () => { } it("Should provide inspect method for use by for util.inspect", () => { - const errorStr = util.inspect(new CustomError("Message")); - const errorArr = errorStr.split("\n"); - - expect(errorArr[0]).toBe("CustomError: CustomMessage"); - expect(errorArr[1]).toMatch(path.basename(__filename)); - expect(errorArr[errorArr.length - 1]).toBe("CustomDetails"); + const error = new CustomError("Message"); + expect(error.toString()).toContain("CustomError: CustomMessage"); + expect(error.stack).toContain(__filename); }); }); diff --git a/test/WebpackMissingModule.unittest.js b/test/WebpackMissingModule.unittest.js deleted file mode 100644 index 73ea0a790c8..00000000000 --- a/test/WebpackMissingModule.unittest.js +++ /dev/null @@ -1,33 +0,0 @@ -/* globals describe, it */ -"use strict"; - -const WebpackMissingModule = require("../lib/dependencies/WebpackMissingModule"); - -describe("WebpackMissingModule", () => { - describe("#moduleCode", () => { - it("returns an error message based on given error message", () => { - const errorMessage = WebpackMissingModule.moduleCode("mock message"); - expect(errorMessage).toBe( - "var e = new Error(\"Cannot find module 'mock message'\"); e.code = 'MODULE_NOT_FOUND'; throw e;" - ); - }); - }); - - describe("#promise", () => { - it("returns an error message based on given error message", () => { - const errorMessage = WebpackMissingModule.promise("mock message"); - expect(errorMessage).toBe( - "Promise.reject(function webpackMissingModule() { var e = new Error(\"Cannot find module 'mock message'\"); e.code = 'MODULE_NOT_FOUND'; return e; }())" - ); - }); - }); - - describe("#module", () => { - it("returns an error message based on given error message", () => { - const errorMessage = WebpackMissingModule.module("mock message"); - expect(errorMessage).toBe( - "!(function webpackMissingModule() { var e = new Error(\"Cannot find module 'mock message'\"); e.code = 'MODULE_NOT_FOUND'; throw e; }())" - ); - }); - }); -}); diff --git a/test/__snapshots__/Cli.basictest.js.snap b/test/__snapshots__/Cli.basictest.js.snap new file mode 100644 index 00000000000..007fcded9ce --- /dev/null +++ b/test/__snapshots__/Cli.basictest.js.snap @@ -0,0 +1,10400 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Cli should generate the correct cli flags 1`] = ` +Object { + "amd": Object { + "configs": Array [ + Object { + "description": "You can pass \`false\` to disable AMD support.", + "multiple": false, + "path": "amd", + "type": "enum", + "values": Array [ + false, + ], + }, + ], + "description": "You can pass \`false\` to disable AMD support.", + "multiple": false, + "simpleType": "boolean", + }, + "bail": Object { + "configs": Array [ + Object { + "description": "Report the first error as a hard error instead of tolerating it.", + "multiple": false, + "path": "bail", + "type": "boolean", + }, + ], + "description": "Report the first error as a hard error instead of tolerating it.", + "multiple": false, + "simpleType": "boolean", + }, + "cache": Object { + "configs": Array [ + Object { + "description": "Enable in memory caching.", + "multiple": false, + "path": "cache", + "type": "enum", + "values": Array [ + true, + ], + }, + Object { + "description": "Disable caching.", + "multiple": false, + "path": "cache", + "type": "enum", + "values": Array [ + false, + ], + }, + ], + "description": "Enable in memory caching. Disable caching.", + "multiple": false, + "simpleType": "boolean", + }, + "cache-allow-collecting-memory": Object { + "configs": Array [ + Object { + "description": "Allows to collect unused memory allocated during deserialization. This requires copying data into smaller buffers and has a performance cost.", + "multiple": false, + "path": "cache.allowCollectingMemory", + "type": "boolean", + }, + ], + "description": "Allows to collect unused memory allocated during deserialization. This requires copying data into smaller buffers and has a performance cost.", + "multiple": false, + "simpleType": "boolean", + }, + "cache-cache-directory": Object { + "configs": Array [ + Object { + "description": "Base directory for the cache (defaults to node_modules/.cache/webpack).", + "multiple": false, + "path": "cache.cacheDirectory", + "type": "path", + }, + ], + "description": "Base directory for the cache (defaults to node_modules/.cache/webpack).", + "multiple": false, + "simpleType": "string", + }, + "cache-cache-location": Object { + "configs": Array [ + Object { + "description": "Locations for the cache (defaults to cacheDirectory / name).", + "multiple": false, + "path": "cache.cacheLocation", + "type": "path", + }, + ], + "description": "Locations for the cache (defaults to cacheDirectory / name).", + "multiple": false, + "simpleType": "string", + }, + "cache-cache-unaffected": Object { + "configs": Array [ + Object { + "description": "Additionally cache computation of modules that are unchanged and reference only unchanged modules.", + "multiple": false, + "path": "cache.cacheUnaffected", + "type": "boolean", + }, + ], + "description": "Additionally cache computation of modules that are unchanged and reference only unchanged modules.", + "multiple": false, + "simpleType": "boolean", + }, + "cache-compression": Object { + "configs": Array [ + Object { + "description": "Compression type used for the cache files.", + "multiple": false, + "path": "cache.compression", + "type": "enum", + "values": Array [ + false, + "gzip", + "brotli", + ], + }, + ], + "description": "Compression type used for the cache files.", + "multiple": false, + "simpleType": "string", + }, + "cache-hash-algorithm": Object { + "configs": Array [ + Object { + "description": "Algorithm used for generation the hash (see node.js crypto package).", + "multiple": false, + "path": "cache.hashAlgorithm", + "type": "string", + }, + ], + "description": "Algorithm used for generation the hash (see node.js crypto package).", + "multiple": false, + "simpleType": "string", + }, + "cache-idle-timeout": Object { + "configs": Array [ + Object { + "description": "Time in ms after which idle period the cache storing should happen.", + "multiple": false, + "path": "cache.idleTimeout", + "type": "number", + }, + ], + "description": "Time in ms after which idle period the cache storing should happen.", + "multiple": false, + "simpleType": "number", + }, + "cache-idle-timeout-after-large-changes": Object { + "configs": Array [ + Object { + "description": "Time in ms after which idle period the cache storing should happen when larger changes has been detected (cumulative build time > 2 x avg cache store time).", + "multiple": false, + "path": "cache.idleTimeoutAfterLargeChanges", + "type": "number", + }, + ], + "description": "Time in ms after which idle period the cache storing should happen when larger changes has been detected (cumulative build time > 2 x avg cache store time).", + "multiple": false, + "simpleType": "number", + }, + "cache-idle-timeout-for-initial-store": Object { + "configs": Array [ + Object { + "description": "Time in ms after which idle period the initial cache storing should happen.", + "multiple": false, + "path": "cache.idleTimeoutForInitialStore", + "type": "number", + }, + ], + "description": "Time in ms after which idle period the initial cache storing should happen.", + "multiple": false, + "simpleType": "number", + }, + "cache-immutable-paths": Object { + "configs": Array [ + Object { + "description": "A RegExp matching an immutable directory (usually a package manager cache directory, including the tailing slash)", + "multiple": true, + "path": "cache.immutablePaths[]", + "type": "RegExp", + }, + Object { + "description": "A path to an immutable directory (usually a package manager cache directory).", + "multiple": true, + "path": "cache.immutablePaths[]", + "type": "path", + }, + ], + "description": "A RegExp matching an immutable directory (usually a package manager cache directory, including the tailing slash) A path to an immutable directory (usually a package manager cache directory).", + "multiple": true, + "simpleType": "string", + }, + "cache-immutable-paths-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'cache.immutablePaths' configuration. List of paths that are managed by a package manager and contain a version or hash in its path so all files are immutable.", + "multiple": false, + "path": "cache.immutablePaths", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'cache.immutablePaths' configuration. List of paths that are managed by a package manager and contain a version or hash in its path so all files are immutable.", + "multiple": false, + "simpleType": "boolean", + }, + "cache-managed-paths": Object { + "configs": Array [ + Object { + "description": "A RegExp matching a managed directory (usually a node_modules directory, including the tailing slash)", + "multiple": true, + "path": "cache.managedPaths[]", + "type": "RegExp", + }, + Object { + "description": "A path to a managed directory (usually a node_modules directory).", + "multiple": true, + "path": "cache.managedPaths[]", + "type": "path", + }, + ], + "description": "A RegExp matching a managed directory (usually a node_modules directory, including the tailing slash) A path to a managed directory (usually a node_modules directory).", + "multiple": true, + "simpleType": "string", + }, + "cache-managed-paths-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'cache.managedPaths' configuration. List of paths that are managed by a package manager and can be trusted to not be modified otherwise.", + "multiple": false, + "path": "cache.managedPaths", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'cache.managedPaths' configuration. List of paths that are managed by a package manager and can be trusted to not be modified otherwise.", + "multiple": false, + "simpleType": "boolean", + }, + "cache-max-age": Object { + "configs": Array [ + Object { + "description": "Time for which unused cache entries stay in the filesystem cache at minimum (in milliseconds).", + "multiple": false, + "path": "cache.maxAge", + "type": "number", + }, + ], + "description": "Time for which unused cache entries stay in the filesystem cache at minimum (in milliseconds).", + "multiple": false, + "simpleType": "number", + }, + "cache-max-generations": Object { + "configs": Array [ + Object { + "description": "Number of generations unused cache entries stay in memory cache at minimum (1 = may be removed after unused for a single compilation, ..., Infinity: kept forever).", + "multiple": false, + "path": "cache.maxGenerations", + "type": "number", + }, + ], + "description": "Number of generations unused cache entries stay in memory cache at minimum (1 = may be removed after unused for a single compilation, ..., Infinity: kept forever).", + "multiple": false, + "simpleType": "number", + }, + "cache-max-memory-generations": Object { + "configs": Array [ + Object { + "description": "Number of generations unused cache entries stay in memory cache at minimum (0 = no memory cache used, 1 = may be removed after unused for a single compilation, ..., Infinity: kept forever). Cache entries will be deserialized from disk when removed from memory cache.", + "multiple": false, + "path": "cache.maxMemoryGenerations", + "type": "number", + }, + ], + "description": "Number of generations unused cache entries stay in memory cache at minimum (0 = no memory cache used, 1 = may be removed after unused for a single compilation, ..., Infinity: kept forever). Cache entries will be deserialized from disk when removed from memory cache.", + "multiple": false, + "simpleType": "number", + }, + "cache-memory-cache-unaffected": Object { + "configs": Array [ + Object { + "description": "Additionally cache computation of modules that are unchanged and reference only unchanged modules in memory.", + "multiple": false, + "path": "cache.memoryCacheUnaffected", + "type": "boolean", + }, + ], + "description": "Additionally cache computation of modules that are unchanged and reference only unchanged modules in memory.", + "multiple": false, + "simpleType": "boolean", + }, + "cache-name": Object { + "configs": Array [ + Object { + "description": "Name for the cache. Different names will lead to different coexisting caches.", + "multiple": false, + "path": "cache.name", + "type": "string", + }, + ], + "description": "Name for the cache. Different names will lead to different coexisting caches.", + "multiple": false, + "simpleType": "string", + }, + "cache-profile": Object { + "configs": Array [ + Object { + "description": "Track and log detailed timing information for individual cache items.", + "multiple": false, + "path": "cache.profile", + "type": "boolean", + }, + ], + "description": "Track and log detailed timing information for individual cache items.", + "multiple": false, + "simpleType": "boolean", + }, + "cache-readonly": Object { + "configs": Array [ + Object { + "description": "Enable/disable readonly mode.", + "multiple": false, + "path": "cache.readonly", + "type": "boolean", + }, + ], + "description": "Enable/disable readonly mode.", + "multiple": false, + "simpleType": "boolean", + }, + "cache-store": Object { + "configs": Array [ + Object { + "description": "When to store data to the filesystem. (pack: Store data when compiler is idle in a single file).", + "multiple": false, + "path": "cache.store", + "type": "enum", + "values": Array [ + "pack", + ], + }, + ], + "description": "When to store data to the filesystem. (pack: Store data when compiler is idle in a single file).", + "multiple": false, + "simpleType": "string", + }, + "cache-type": Object { + "configs": Array [ + Object { + "description": "In memory caching.", + "multiple": false, + "path": "cache.type", + "type": "enum", + "values": Array [ + "memory", + ], + }, + Object { + "description": "Filesystem caching.", + "multiple": false, + "path": "cache.type", + "type": "enum", + "values": Array [ + "filesystem", + ], + }, + ], + "description": "In memory caching. Filesystem caching.", + "multiple": false, + "simpleType": "string", + }, + "cache-version": Object { + "configs": Array [ + Object { + "description": "Version of the cache data. Different versions won't allow to reuse the cache and override existing content. Update the version when config changed in a way which doesn't allow to reuse cache. This will invalidate the cache.", + "multiple": false, + "path": "cache.version", + "type": "string", + }, + ], + "description": "Version of the cache data. Different versions won't allow to reuse the cache and override existing content. Update the version when config changed in a way which doesn't allow to reuse cache. This will invalidate the cache.", + "multiple": false, + "simpleType": "string", + }, + "context": Object { + "configs": Array [ + Object { + "description": "The base directory (absolute path!) for resolving the \`entry\` option. If \`output.pathinfo\` is set, the included pathinfo is shortened to this directory.", + "multiple": false, + "path": "context", + "type": "path", + }, + ], + "description": "The base directory (absolute path!) for resolving the \`entry\` option. If \`output.pathinfo\` is set, the included pathinfo is shortened to this directory.", + "multiple": false, + "simpleType": "string", + }, + "dependencies": Object { + "configs": Array [ + Object { + "description": "References to another configuration to depend on.", + "multiple": true, + "path": "dependencies[]", + "type": "string", + }, + ], + "description": "References to another configuration to depend on.", + "multiple": true, + "simpleType": "string", + }, + "dependencies-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'dependencies' configuration. References to other configurations to depend on.", + "multiple": false, + "path": "dependencies", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'dependencies' configuration. References to other configurations to depend on.", + "multiple": false, + "simpleType": "boolean", + }, + "dev-server": Object { + "configs": Array [ + Object { + "description": "Disable dev server.", + "multiple": false, + "path": "devServer", + "type": "enum", + "values": Array [ + false, + ], + }, + ], + "description": "Disable dev server.", + "multiple": false, + "simpleType": "boolean", + }, + "devtool": Object { + "configs": Array [ + Object { + "description": "A developer tool to enhance debugging (false | eval | [inline-|hidden-|eval-][nosources-][cheap-[module-]]source-map).", + "multiple": false, + "path": "devtool", + "type": "enum", + "values": Array [ + false, + "eval", + ], + }, + Object { + "description": "A developer tool to enhance debugging (false | eval | [inline-|hidden-|eval-][nosources-][cheap-[module-]]source-map).", + "multiple": false, + "path": "devtool", + "type": "string", + }, + ], + "description": "A developer tool to enhance debugging (false | eval | [inline-|hidden-|eval-][nosources-][cheap-[module-]]source-map).", + "multiple": false, + "simpleType": "string", + }, + "entry": Object { + "configs": Array [ + Object { + "description": "A module that is loaded upon startup. Only the last one is exported.", + "multiple": true, + "path": "entry[]", + "type": "string", + }, + ], + "description": "A module that is loaded upon startup. Only the last one is exported.", + "multiple": true, + "simpleType": "string", + }, + "entry-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'entry' configuration. All modules are loaded upon startup. The last one is exported.", + "multiple": false, + "path": "entry", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'entry' configuration. All modules are loaded upon startup. The last one is exported.", + "multiple": false, + "simpleType": "boolean", + }, + "experiments-async-web-assembly": Object { + "configs": Array [ + Object { + "description": "Support WebAssembly as asynchronous EcmaScript Module.", + "multiple": false, + "path": "experiments.asyncWebAssembly", + "type": "boolean", + }, + ], + "description": "Support WebAssembly as asynchronous EcmaScript Module.", + "multiple": false, + "simpleType": "boolean", + }, + "experiments-back-compat": Object { + "configs": Array [ + Object { + "description": "Enable backward-compat layer with deprecation warnings for many webpack 4 APIs.", + "multiple": false, + "path": "experiments.backCompat", + "type": "boolean", + }, + ], + "description": "Enable backward-compat layer with deprecation warnings for many webpack 4 APIs.", + "multiple": false, + "simpleType": "boolean", + }, + "experiments-build-http-allowed-uris": Object { + "configs": Array [ + Object { + "description": "Allowed URI pattern.", + "multiple": true, + "path": "experiments.buildHttp.allowedUris[]", + "type": "RegExp", + }, + Object { + "description": "Allowed URI (resp. the beginning of it).", + "multiple": true, + "path": "experiments.buildHttp.allowedUris[]", + "type": "string", + }, + ], + "description": "Allowed URI pattern. Allowed URI (resp. the beginning of it).", + "multiple": true, + "simpleType": "string", + }, + "experiments-build-http-allowed-uris-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'experiments.buildHttp.allowedUris' configuration. List of allowed URIs (resp. the beginning of them).", + "multiple": false, + "path": "experiments.buildHttp.allowedUris", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'experiments.buildHttp.allowedUris' configuration. List of allowed URIs (resp. the beginning of them).", + "multiple": false, + "simpleType": "boolean", + }, + "experiments-build-http-cache-location": Object { + "configs": Array [ + Object { + "description": "Location where resource content is stored for lockfile entries. It's also possible to disable storing by passing false.", + "multiple": false, + "path": "experiments.buildHttp.cacheLocation", + "type": "enum", + "values": Array [ + false, + ], + }, + Object { + "description": "Location where resource content is stored for lockfile entries. It's also possible to disable storing by passing false.", + "multiple": false, + "path": "experiments.buildHttp.cacheLocation", + "type": "path", + }, + ], + "description": "Location where resource content is stored for lockfile entries. It's also possible to disable storing by passing false.", + "multiple": false, + "simpleType": "string", + }, + "experiments-build-http-frozen": Object { + "configs": Array [ + Object { + "description": "When set, anything that would lead to a modification of the lockfile or any resource content, will result in an error.", + "multiple": false, + "path": "experiments.buildHttp.frozen", + "type": "boolean", + }, + ], + "description": "When set, anything that would lead to a modification of the lockfile or any resource content, will result in an error.", + "multiple": false, + "simpleType": "boolean", + }, + "experiments-build-http-lockfile-location": Object { + "configs": Array [ + Object { + "description": "Location of the lockfile.", + "multiple": false, + "path": "experiments.buildHttp.lockfileLocation", + "type": "path", + }, + ], + "description": "Location of the lockfile.", + "multiple": false, + "simpleType": "string", + }, + "experiments-build-http-proxy": Object { + "configs": Array [ + Object { + "description": "Proxy configuration, which can be used to specify a proxy server to use for HTTP requests.", + "multiple": false, + "path": "experiments.buildHttp.proxy", + "type": "string", + }, + ], + "description": "Proxy configuration, which can be used to specify a proxy server to use for HTTP requests.", + "multiple": false, + "simpleType": "string", + }, + "experiments-build-http-upgrade": Object { + "configs": Array [ + Object { + "description": "When set, resources of existing lockfile entries will be fetched and entries will be upgraded when resource content has changed.", + "multiple": false, + "path": "experiments.buildHttp.upgrade", + "type": "boolean", + }, + ], + "description": "When set, resources of existing lockfile entries will be fetched and entries will be upgraded when resource content has changed.", + "multiple": false, + "simpleType": "boolean", + }, + "experiments-cache-unaffected": Object { + "configs": Array [ + Object { + "description": "Enable additional in memory caching of modules that are unchanged and reference only unchanged modules.", + "multiple": false, + "path": "experiments.cacheUnaffected", + "type": "boolean", + }, + ], + "description": "Enable additional in memory caching of modules that are unchanged and reference only unchanged modules.", + "multiple": false, + "simpleType": "boolean", + }, + "experiments-css": Object { + "configs": Array [ + Object { + "description": "Enable css support.", + "multiple": false, + "path": "experiments.css", + "type": "boolean", + }, + ], + "description": "Enable css support.", + "multiple": false, + "simpleType": "boolean", + }, + "experiments-future-defaults": Object { + "configs": Array [ + Object { + "description": "Apply defaults of next major version.", + "multiple": false, + "path": "experiments.futureDefaults", + "type": "boolean", + }, + ], + "description": "Apply defaults of next major version.", + "multiple": false, + "simpleType": "boolean", + }, + "experiments-layers": Object { + "configs": Array [ + Object { + "description": "Enable module layers.", + "multiple": false, + "path": "experiments.layers", + "type": "boolean", + }, + ], + "description": "Enable module layers.", + "multiple": false, + "simpleType": "boolean", + }, + "experiments-lazy-compilation": Object { + "configs": Array [ + Object { + "description": "Compile entrypoints and import()s only when they are accessed.", + "multiple": false, + "path": "experiments.lazyCompilation", + "type": "boolean", + }, + ], + "description": "Compile entrypoints and import()s only when they are accessed.", + "multiple": false, + "simpleType": "boolean", + }, + "experiments-lazy-compilation-backend-client": Object { + "configs": Array [ + Object { + "description": "A custom client.", + "multiple": false, + "path": "experiments.lazyCompilation.backend.client", + "type": "string", + }, + ], + "description": "A custom client.", + "multiple": false, + "simpleType": "string", + }, + "experiments-lazy-compilation-backend-listen": Object { + "configs": Array [ + Object { + "description": "A port.", + "multiple": false, + "path": "experiments.lazyCompilation.backend.listen", + "type": "number", + }, + ], + "description": "A port.", + "multiple": false, + "simpleType": "number", + }, + "experiments-lazy-compilation-backend-listen-host": Object { + "configs": Array [ + Object { + "description": "A host.", + "multiple": false, + "path": "experiments.lazyCompilation.backend.listen.host", + "type": "string", + }, + ], + "description": "A host.", + "multiple": false, + "simpleType": "string", + }, + "experiments-lazy-compilation-backend-listen-port": Object { + "configs": Array [ + Object { + "description": "A port.", + "multiple": false, + "path": "experiments.lazyCompilation.backend.listen.port", + "type": "number", + }, + ], + "description": "A port.", + "multiple": false, + "simpleType": "number", + }, + "experiments-lazy-compilation-backend-protocol": Object { + "configs": Array [ + Object { + "description": "Specifies the protocol the client should use to connect to the server.", + "multiple": false, + "path": "experiments.lazyCompilation.backend.protocol", + "type": "enum", + "values": Array [ + "http", + "https", + ], + }, + ], + "description": "Specifies the protocol the client should use to connect to the server.", + "multiple": false, + "simpleType": "string", + }, + "experiments-lazy-compilation-entries": Object { + "configs": Array [ + Object { + "description": "Enable/disable lazy compilation for entries.", + "multiple": false, + "path": "experiments.lazyCompilation.entries", + "type": "boolean", + }, + ], + "description": "Enable/disable lazy compilation for entries.", + "multiple": false, + "simpleType": "boolean", + }, + "experiments-lazy-compilation-imports": Object { + "configs": Array [ + Object { + "description": "Enable/disable lazy compilation for import() modules.", + "multiple": false, + "path": "experiments.lazyCompilation.imports", + "type": "boolean", + }, + ], + "description": "Enable/disable lazy compilation for import() modules.", + "multiple": false, + "simpleType": "boolean", + }, + "experiments-lazy-compilation-test": Object { + "configs": Array [ + Object { + "description": "Specify which entrypoints or import()ed modules should be lazily compiled. This is matched with the imported module and not the entrypoint name.", + "multiple": false, + "path": "experiments.lazyCompilation.test", + "type": "RegExp", + }, + Object { + "description": "Specify which entrypoints or import()ed modules should be lazily compiled. This is matched with the imported module and not the entrypoint name.", + "multiple": false, + "path": "experiments.lazyCompilation.test", + "type": "string", + }, + ], + "description": "Specify which entrypoints or import()ed modules should be lazily compiled. This is matched with the imported module and not the entrypoint name.", + "multiple": false, + "simpleType": "string", + }, + "experiments-output-module": Object { + "configs": Array [ + Object { + "description": "Allow output javascript files as module source type.", + "multiple": false, + "path": "experiments.outputModule", + "type": "boolean", + }, + ], + "description": "Allow output javascript files as module source type.", + "multiple": false, + "simpleType": "boolean", + }, + "experiments-sync-web-assembly": Object { + "configs": Array [ + Object { + "description": "Support WebAssembly as synchronous EcmaScript Module (outdated).", + "multiple": false, + "path": "experiments.syncWebAssembly", + "type": "boolean", + }, + ], + "description": "Support WebAssembly as synchronous EcmaScript Module (outdated).", + "multiple": false, + "simpleType": "boolean", + }, + "experiments-top-level-await": Object { + "configs": Array [ + Object { + "description": "Allow using top-level-await in EcmaScript Modules.", + "multiple": false, + "path": "experiments.topLevelAwait", + "type": "boolean", + }, + ], + "description": "Allow using top-level-await in EcmaScript Modules.", + "multiple": false, + "simpleType": "boolean", + }, + "extends": Object { + "configs": Array [ + Object { + "description": "Path to the configuration to be extended (only works when using webpack-cli).", + "multiple": true, + "path": "extends[]", + "type": "string", + }, + ], + "description": "Path to the configuration to be extended (only works when using webpack-cli).", + "multiple": true, + "simpleType": "string", + }, + "extends-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'extends' configuration. Extend configuration from another configuration (only works when using webpack-cli).", + "multiple": false, + "path": "extends", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'extends' configuration. Extend configuration from another configuration (only works when using webpack-cli).", + "multiple": false, + "simpleType": "boolean", + }, + "externals": Object { + "configs": Array [ + Object { + "description": "Every matched dependency becomes external.", + "multiple": true, + "path": "externals[]", + "type": "RegExp", + }, + Object { + "description": "An exact matched dependency becomes external. The same string is used as external dependency.", + "multiple": true, + "path": "externals[]", + "type": "string", + }, + ], + "description": "Every matched dependency becomes external. An exact matched dependency becomes external. The same string is used as external dependency.", + "multiple": true, + "simpleType": "string", + }, + "externals-presets-electron": Object { + "configs": Array [ + Object { + "description": "Treat common electron built-in modules in main and preload context like 'electron', 'ipc' or 'shell' as external and load them via require() when used.", + "multiple": false, + "path": "externalsPresets.electron", + "type": "boolean", + }, + ], + "description": "Treat common electron built-in modules in main and preload context like 'electron', 'ipc' or 'shell' as external and load them via require() when used.", + "multiple": false, + "simpleType": "boolean", + }, + "externals-presets-electron-main": Object { + "configs": Array [ + Object { + "description": "Treat electron built-in modules in the main context like 'app', 'ipc-main' or 'shell' as external and load them via require() when used.", + "multiple": false, + "path": "externalsPresets.electronMain", + "type": "boolean", + }, + ], + "description": "Treat electron built-in modules in the main context like 'app', 'ipc-main' or 'shell' as external and load them via require() when used.", + "multiple": false, + "simpleType": "boolean", + }, + "externals-presets-electron-preload": Object { + "configs": Array [ + Object { + "description": "Treat electron built-in modules in the preload context like 'web-frame', 'ipc-renderer' or 'shell' as external and load them via require() when used.", + "multiple": false, + "path": "externalsPresets.electronPreload", + "type": "boolean", + }, + ], + "description": "Treat electron built-in modules in the preload context like 'web-frame', 'ipc-renderer' or 'shell' as external and load them via require() when used.", + "multiple": false, + "simpleType": "boolean", + }, + "externals-presets-electron-renderer": Object { + "configs": Array [ + Object { + "description": "Treat electron built-in modules in the renderer context like 'web-frame', 'ipc-renderer' or 'shell' as external and load them via require() when used.", + "multiple": false, + "path": "externalsPresets.electronRenderer", + "type": "boolean", + }, + ], + "description": "Treat electron built-in modules in the renderer context like 'web-frame', 'ipc-renderer' or 'shell' as external and load them via require() when used.", + "multiple": false, + "simpleType": "boolean", + }, + "externals-presets-node": Object { + "configs": Array [ + Object { + "description": "Treat node.js built-in modules like fs, path or vm as external and load them via require() when used.", + "multiple": false, + "path": "externalsPresets.node", + "type": "boolean", + }, + ], + "description": "Treat node.js built-in modules like fs, path or vm as external and load them via require() when used.", + "multiple": false, + "simpleType": "boolean", + }, + "externals-presets-nwjs": Object { + "configs": Array [ + Object { + "description": "Treat NW.js legacy nw.gui module as external and load it via require() when used.", + "multiple": false, + "path": "externalsPresets.nwjs", + "type": "boolean", + }, + ], + "description": "Treat NW.js legacy nw.gui module as external and load it via require() when used.", + "multiple": false, + "simpleType": "boolean", + }, + "externals-presets-web": Object { + "configs": Array [ + Object { + "description": "Treat references to 'http(s)://...' and 'std:...' as external and load them via import when used (Note that this changes execution order as externals are executed before any other code in the chunk).", + "multiple": false, + "path": "externalsPresets.web", + "type": "boolean", + }, + ], + "description": "Treat references to 'http(s)://...' and 'std:...' as external and load them via import when used (Note that this changes execution order as externals are executed before any other code in the chunk).", + "multiple": false, + "simpleType": "boolean", + }, + "externals-presets-web-async": Object { + "configs": Array [ + Object { + "description": "Treat references to 'http(s)://...' and 'std:...' as external and load them via async import() when used (Note that this external type is an async module, which has various effects on the execution).", + "multiple": false, + "path": "externalsPresets.webAsync", + "type": "boolean", + }, + ], + "description": "Treat references to 'http(s)://...' and 'std:...' as external and load them via async import() when used (Note that this external type is an async module, which has various effects on the execution).", + "multiple": false, + "simpleType": "boolean", + }, + "externals-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'externals' configuration. Specify dependencies that shouldn't be resolved by webpack, but should become dependencies of the resulting bundle. The kind of the dependency depends on \`output.libraryTarget\`.", + "multiple": false, + "path": "externals", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'externals' configuration. Specify dependencies that shouldn't be resolved by webpack, but should become dependencies of the resulting bundle. The kind of the dependency depends on \`output.libraryTarget\`.", + "multiple": false, + "simpleType": "boolean", + }, + "externals-type": Object { + "configs": Array [ + Object { + "description": "Specifies the default type of externals ('amd*', 'umd*', 'system' and 'jsonp' depend on output.libraryTarget set to the same value).", + "multiple": false, + "path": "externalsType", + "type": "enum", + "values": Array [ + "var", + "module", + "assign", + "this", + "window", + "self", + "global", + "commonjs", + "commonjs2", + "commonjs-module", + "commonjs-static", + "amd", + "amd-require", + "umd", + "umd2", + "jsonp", + "system", + "promise", + "import", + "module-import", + "script", + "node-commonjs", + ], + }, + ], + "description": "Specifies the default type of externals ('amd*', 'umd*', 'system' and 'jsonp' depend on output.libraryTarget set to the same value).", + "multiple": false, + "simpleType": "string", + }, + "ignore-warnings": Object { + "configs": Array [ + Object { + "description": "A RegExp to select the warning message.", + "multiple": true, + "path": "ignoreWarnings[]", + "type": "RegExp", + }, + ], + "description": "A RegExp to select the warning message.", + "multiple": true, + "simpleType": "string", + }, + "ignore-warnings-file": Object { + "configs": Array [ + Object { + "description": "A RegExp to select the origin file for the warning.", + "multiple": true, + "path": "ignoreWarnings[].file", + "type": "RegExp", + }, + ], + "description": "A RegExp to select the origin file for the warning.", + "multiple": true, + "simpleType": "string", + }, + "ignore-warnings-message": Object { + "configs": Array [ + Object { + "description": "A RegExp to select the warning message.", + "multiple": true, + "path": "ignoreWarnings[].message", + "type": "RegExp", + }, + ], + "description": "A RegExp to select the warning message.", + "multiple": true, + "simpleType": "string", + }, + "ignore-warnings-module": Object { + "configs": Array [ + Object { + "description": "A RegExp to select the origin module for the warning.", + "multiple": true, + "path": "ignoreWarnings[].module", + "type": "RegExp", + }, + ], + "description": "A RegExp to select the origin module for the warning.", + "multiple": true, + "simpleType": "string", + }, + "ignore-warnings-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'ignoreWarnings' configuration. Ignore specific warnings.", + "multiple": false, + "path": "ignoreWarnings", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'ignoreWarnings' configuration. Ignore specific warnings.", + "multiple": false, + "simpleType": "boolean", + }, + "infrastructure-logging-append-only": Object { + "configs": Array [ + Object { + "description": "Only appends lines to the output. Avoids updating existing output e. g. for status messages. This option is only used when no custom console is provided.", + "multiple": false, + "path": "infrastructureLogging.appendOnly", + "type": "boolean", + }, + ], + "description": "Only appends lines to the output. Avoids updating existing output e. g. for status messages. This option is only used when no custom console is provided.", + "multiple": false, + "simpleType": "boolean", + }, + "infrastructure-logging-colors": Object { + "configs": Array [ + Object { + "description": "Enables/Disables colorful output. This option is only used when no custom console is provided.", + "multiple": false, + "path": "infrastructureLogging.colors", + "type": "boolean", + }, + ], + "description": "Enables/Disables colorful output. This option is only used when no custom console is provided.", + "multiple": false, + "simpleType": "boolean", + }, + "infrastructure-logging-debug": Object { + "configs": Array [ + Object { + "description": "Enable/Disable debug logging for all loggers.", + "multiple": false, + "path": "infrastructureLogging.debug", + "type": "boolean", + }, + Object { + "description": "Enable debug logging for specific loggers.", + "multiple": true, + "path": "infrastructureLogging.debug[]", + "type": "RegExp", + }, + Object { + "description": "Enable debug logging for specific loggers.", + "multiple": true, + "path": "infrastructureLogging.debug[]", + "type": "string", + }, + ], + "description": "Enable/Disable debug logging for all loggers. Enable debug logging for specific loggers.", + "multiple": true, + "simpleType": "string", + }, + "infrastructure-logging-debug-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'infrastructureLogging.debug' configuration. Enable debug logging for specific loggers.", + "multiple": false, + "path": "infrastructureLogging.debug", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'infrastructureLogging.debug' configuration. Enable debug logging for specific loggers.", + "multiple": false, + "simpleType": "boolean", + }, + "infrastructure-logging-level": Object { + "configs": Array [ + Object { + "description": "Log level.", + "multiple": false, + "path": "infrastructureLogging.level", + "type": "enum", + "values": Array [ + "none", + "error", + "warn", + "info", + "log", + "verbose", + ], + }, + ], + "description": "Log level.", + "multiple": false, + "simpleType": "string", + }, + "mode": Object { + "configs": Array [ + Object { + "description": "Enable production optimizations or development hints.", + "multiple": false, + "path": "mode", + "type": "enum", + "values": Array [ + "development", + "production", + "none", + ], + }, + ], + "description": "Enable production optimizations or development hints.", + "multiple": false, + "simpleType": "string", + }, + "module-expr-context-critical": Object { + "configs": Array [ + Object { + "description": "Enable warnings for full dynamic dependencies.", + "multiple": false, + "path": "module.exprContextCritical", + "type": "boolean", + }, + ], + "description": "Enable warnings for full dynamic dependencies.", + "multiple": false, + "simpleType": "boolean", + }, + "module-expr-context-recursive": Object { + "configs": Array [ + Object { + "description": "Enable recursive directory lookup for full dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.exprContextRecursive'.", + "multiple": false, + "path": "module.exprContextRecursive", + "type": "boolean", + }, + ], + "description": "Enable recursive directory lookup for full dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.exprContextRecursive'.", + "multiple": false, + "simpleType": "boolean", + }, + "module-expr-context-reg-exp": Object { + "configs": Array [ + Object { + "description": "Sets the default regular expression for full dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.exprContextRegExp'.", + "multiple": false, + "path": "module.exprContextRegExp", + "type": "RegExp", + }, + Object { + "description": "Sets the default regular expression for full dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.exprContextRegExp'.", + "multiple": false, + "path": "module.exprContextRegExp", + "type": "boolean", + }, + ], + "description": "Sets the default regular expression for full dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.exprContextRegExp'.", + "multiple": false, + "simpleType": "string", + }, + "module-expr-context-request": Object { + "configs": Array [ + Object { + "description": "Set the default request for full dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.exprContextRequest'.", + "multiple": false, + "path": "module.exprContextRequest", + "type": "string", + }, + ], + "description": "Set the default request for full dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.exprContextRequest'.", + "multiple": false, + "simpleType": "string", + }, + "module-generator-asset-binary": Object { + "configs": Array [ + Object { + "description": "Whether or not this asset module should be considered binary. This can be set to 'false' to treat this asset module as text.", + "multiple": false, + "path": "module.generator.asset.binary", + "type": "boolean", + }, + ], + "description": "Whether or not this asset module should be considered binary. This can be set to 'false' to treat this asset module as text.", + "multiple": false, + "simpleType": "boolean", + }, + "module-generator-asset-data-url-encoding": Object { + "configs": Array [ + Object { + "description": "Asset encoding (defaults to base64).", + "multiple": false, + "path": "module.generator.asset.dataUrl.encoding", + "type": "enum", + "values": Array [ + false, + "base64", + ], + }, + ], + "description": "Asset encoding (defaults to base64).", + "multiple": false, + "simpleType": "string", + }, + "module-generator-asset-data-url-mimetype": Object { + "configs": Array [ + Object { + "description": "Asset mimetype (getting from file extension by default).", + "multiple": false, + "path": "module.generator.asset.dataUrl.mimetype", + "type": "string", + }, + ], + "description": "Asset mimetype (getting from file extension by default).", + "multiple": false, + "simpleType": "string", + }, + "module-generator-asset-emit": Object { + "configs": Array [ + Object { + "description": "Emit an output asset from this asset module. This can be set to 'false' to omit emitting e. g. for SSR.", + "multiple": false, + "path": "module.generator.asset.emit", + "type": "boolean", + }, + ], + "description": "Emit an output asset from this asset module. This can be set to 'false' to omit emitting e. g. for SSR.", + "multiple": false, + "simpleType": "boolean", + }, + "module-generator-asset-filename": Object { + "configs": Array [ + Object { + "description": "Specifies the filename template of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.", + "multiple": false, + "path": "module.generator.asset.filename", + "type": "string", + }, + ], + "description": "Specifies the filename template of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.", + "multiple": false, + "simpleType": "string", + }, + "module-generator-asset-inline-binary": Object { + "configs": Array [ + Object { + "description": "Whether or not this asset module should be considered binary. This can be set to 'false' to treat this asset module as text.", + "multiple": false, + "path": "module.generator.asset/inline.binary", + "type": "boolean", + }, + ], + "description": "Whether or not this asset module should be considered binary. This can be set to 'false' to treat this asset module as text.", + "multiple": false, + "simpleType": "boolean", + }, + "module-generator-asset-inline-data-url-encoding": Object { + "configs": Array [ + Object { + "description": "Asset encoding (defaults to base64).", + "multiple": false, + "path": "module.generator.asset/inline.dataUrl.encoding", + "type": "enum", + "values": Array [ + false, + "base64", + ], + }, + ], + "description": "Asset encoding (defaults to base64).", + "multiple": false, + "simpleType": "string", + }, + "module-generator-asset-inline-data-url-mimetype": Object { + "configs": Array [ + Object { + "description": "Asset mimetype (getting from file extension by default).", + "multiple": false, + "path": "module.generator.asset/inline.dataUrl.mimetype", + "type": "string", + }, + ], + "description": "Asset mimetype (getting from file extension by default).", + "multiple": false, + "simpleType": "string", + }, + "module-generator-asset-output-path": Object { + "configs": Array [ + Object { + "description": "Emit the asset in the specified folder relative to 'output.path'. This should only be needed when custom 'publicPath' is specified to match the folder structure there.", + "multiple": false, + "path": "module.generator.asset.outputPath", + "type": "string", + }, + ], + "description": "Emit the asset in the specified folder relative to 'output.path'. This should only be needed when custom 'publicPath' is specified to match the folder structure there.", + "multiple": false, + "simpleType": "string", + }, + "module-generator-asset-public-path": Object { + "configs": Array [ + Object { + "description": "The 'publicPath' specifies the public URL address of the output files when referenced in a browser.", + "multiple": false, + "path": "module.generator.asset.publicPath", + "type": "string", + }, + ], + "description": "The 'publicPath' specifies the public URL address of the output files when referenced in a browser.", + "multiple": false, + "simpleType": "string", + }, + "module-generator-asset-resource-binary": Object { + "configs": Array [ + Object { + "description": "Whether or not this asset module should be considered binary. This can be set to 'false' to treat this asset module as text.", + "multiple": false, + "path": "module.generator.asset/resource.binary", + "type": "boolean", + }, + ], + "description": "Whether or not this asset module should be considered binary. This can be set to 'false' to treat this asset module as text.", + "multiple": false, + "simpleType": "boolean", + }, + "module-generator-asset-resource-emit": Object { + "configs": Array [ + Object { + "description": "Emit an output asset from this asset module. This can be set to 'false' to omit emitting e. g. for SSR.", + "multiple": false, + "path": "module.generator.asset/resource.emit", + "type": "boolean", + }, + ], + "description": "Emit an output asset from this asset module. This can be set to 'false' to omit emitting e. g. for SSR.", + "multiple": false, + "simpleType": "boolean", + }, + "module-generator-asset-resource-filename": Object { + "configs": Array [ + Object { + "description": "Specifies the filename template of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.", + "multiple": false, + "path": "module.generator.asset/resource.filename", + "type": "string", + }, + ], + "description": "Specifies the filename template of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.", + "multiple": false, + "simpleType": "string", + }, + "module-generator-asset-resource-output-path": Object { + "configs": Array [ + Object { + "description": "Emit the asset in the specified folder relative to 'output.path'. This should only be needed when custom 'publicPath' is specified to match the folder structure there.", + "multiple": false, + "path": "module.generator.asset/resource.outputPath", + "type": "string", + }, + ], + "description": "Emit the asset in the specified folder relative to 'output.path'. This should only be needed when custom 'publicPath' is specified to match the folder structure there.", + "multiple": false, + "simpleType": "string", + }, + "module-generator-asset-resource-public-path": Object { + "configs": Array [ + Object { + "description": "The 'publicPath' specifies the public URL address of the output files when referenced in a browser.", + "multiple": false, + "path": "module.generator.asset/resource.publicPath", + "type": "string", + }, + ], + "description": "The 'publicPath' specifies the public URL address of the output files when referenced in a browser.", + "multiple": false, + "simpleType": "string", + }, + "module-generator-css-auto-es-module": Object { + "configs": Array [ + Object { + "description": "Configure the generated JS modules that use the ES modules syntax.", + "multiple": false, + "path": "module.generator.css/auto.esModule", + "type": "boolean", + }, + ], + "description": "Configure the generated JS modules that use the ES modules syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-generator-css-auto-exports-convention": Object { + "configs": Array [ + Object { + "description": "Specifies the convention of exported names.", + "multiple": false, + "path": "module.generator.css/auto.exportsConvention", + "type": "enum", + "values": Array [ + "as-is", + "camel-case", + "camel-case-only", + "dashes", + "dashes-only", + ], + }, + ], + "description": "Specifies the convention of exported names.", + "multiple": false, + "simpleType": "string", + }, + "module-generator-css-auto-exports-only": Object { + "configs": Array [ + Object { + "description": "Avoid generating and loading a stylesheet and only embed exports from css into output javascript files.", + "multiple": false, + "path": "module.generator.css/auto.exportsOnly", + "type": "boolean", + }, + ], + "description": "Avoid generating and loading a stylesheet and only embed exports from css into output javascript files.", + "multiple": false, + "simpleType": "boolean", + }, + "module-generator-css-auto-local-ident-name": Object { + "configs": Array [ + Object { + "description": "Configure the generated local ident name.", + "multiple": false, + "path": "module.generator.css/auto.localIdentName", + "type": "string", + }, + ], + "description": "Configure the generated local ident name.", + "multiple": false, + "simpleType": "string", + }, + "module-generator-css-es-module": Object { + "configs": Array [ + Object { + "description": "Configure the generated JS modules that use the ES modules syntax.", + "multiple": false, + "path": "module.generator.css.esModule", + "type": "boolean", + }, + ], + "description": "Configure the generated JS modules that use the ES modules syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-generator-css-exports-only": Object { + "configs": Array [ + Object { + "description": "Avoid generating and loading a stylesheet and only embed exports from css into output javascript files.", + "multiple": false, + "path": "module.generator.css.exportsOnly", + "type": "boolean", + }, + ], + "description": "Avoid generating and loading a stylesheet and only embed exports from css into output javascript files.", + "multiple": false, + "simpleType": "boolean", + }, + "module-generator-css-global-es-module": Object { + "configs": Array [ + Object { + "description": "Configure the generated JS modules that use the ES modules syntax.", + "multiple": false, + "path": "module.generator.css/global.esModule", + "type": "boolean", + }, + ], + "description": "Configure the generated JS modules that use the ES modules syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-generator-css-global-exports-convention": Object { + "configs": Array [ + Object { + "description": "Specifies the convention of exported names.", + "multiple": false, + "path": "module.generator.css/global.exportsConvention", + "type": "enum", + "values": Array [ + "as-is", + "camel-case", + "camel-case-only", + "dashes", + "dashes-only", + ], + }, + ], + "description": "Specifies the convention of exported names.", + "multiple": false, + "simpleType": "string", + }, + "module-generator-css-global-exports-only": Object { + "configs": Array [ + Object { + "description": "Avoid generating and loading a stylesheet and only embed exports from css into output javascript files.", + "multiple": false, + "path": "module.generator.css/global.exportsOnly", + "type": "boolean", + }, + ], + "description": "Avoid generating and loading a stylesheet and only embed exports from css into output javascript files.", + "multiple": false, + "simpleType": "boolean", + }, + "module-generator-css-global-local-ident-name": Object { + "configs": Array [ + Object { + "description": "Configure the generated local ident name.", + "multiple": false, + "path": "module.generator.css/global.localIdentName", + "type": "string", + }, + ], + "description": "Configure the generated local ident name.", + "multiple": false, + "simpleType": "string", + }, + "module-generator-css-module-es-module": Object { + "configs": Array [ + Object { + "description": "Configure the generated JS modules that use the ES modules syntax.", + "multiple": false, + "path": "module.generator.css/module.esModule", + "type": "boolean", + }, + ], + "description": "Configure the generated JS modules that use the ES modules syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-generator-css-module-exports-convention": Object { + "configs": Array [ + Object { + "description": "Specifies the convention of exported names.", + "multiple": false, + "path": "module.generator.css/module.exportsConvention", + "type": "enum", + "values": Array [ + "as-is", + "camel-case", + "camel-case-only", + "dashes", + "dashes-only", + ], + }, + ], + "description": "Specifies the convention of exported names.", + "multiple": false, + "simpleType": "string", + }, + "module-generator-css-module-exports-only": Object { + "configs": Array [ + Object { + "description": "Avoid generating and loading a stylesheet and only embed exports from css into output javascript files.", + "multiple": false, + "path": "module.generator.css/module.exportsOnly", + "type": "boolean", + }, + ], + "description": "Avoid generating and loading a stylesheet and only embed exports from css into output javascript files.", + "multiple": false, + "simpleType": "boolean", + }, + "module-generator-css-module-local-ident-name": Object { + "configs": Array [ + Object { + "description": "Configure the generated local ident name.", + "multiple": false, + "path": "module.generator.css/module.localIdentName", + "type": "string", + }, + ], + "description": "Configure the generated local ident name.", + "multiple": false, + "simpleType": "string", + }, + "module-generator-json-json-parse": Object { + "configs": Array [ + Object { + "description": "Use \`JSON.parse\` when the JSON string is longer than 20 characters.", + "multiple": false, + "path": "module.generator.json.JSONParse", + "type": "boolean", + }, + ], + "description": "Use \`JSON.parse\` when the JSON string is longer than 20 characters.", + "multiple": false, + "simpleType": "boolean", + }, + "module-no-parse": Object { + "configs": Array [ + Object { + "description": "A regular expression, when matched the module is not parsed.", + "multiple": true, + "path": "module.noParse[]", + "type": "RegExp", + }, + Object { + "description": "An absolute path, when the module starts with this path it is not parsed.", + "multiple": true, + "path": "module.noParse[]", + "type": "path", + }, + ], + "description": "A regular expression, when matched the module is not parsed. An absolute path, when the module starts with this path it is not parsed.", + "multiple": true, + "simpleType": "string", + }, + "module-no-parse-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'module.noParse' configuration. Don't parse files matching. It's matched against the full resolved request.", + "multiple": false, + "path": "module.noParse", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'module.noParse' configuration. Don't parse files matching. It's matched against the full resolved request.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-asset-data-url-condition-max-size": Object { + "configs": Array [ + Object { + "description": "Maximum size of asset that should be inline as modules. Default: 8kb.", + "multiple": false, + "path": "module.parser.asset.dataUrlCondition.maxSize", + "type": "number", + }, + ], + "description": "Maximum size of asset that should be inline as modules. Default: 8kb.", + "multiple": false, + "simpleType": "number", + }, + "module-parser-css-auto-import": Object { + "configs": Array [ + Object { + "description": "Enable/disable \`@import\` at-rules handling.", + "multiple": false, + "path": "module.parser.css/auto.import", + "type": "boolean", + }, + ], + "description": "Enable/disable \`@import\` at-rules handling.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-css-auto-named-exports": Object { + "configs": Array [ + Object { + "description": "Use ES modules named export for css exports.", + "multiple": false, + "path": "module.parser.css/auto.namedExports", + "type": "boolean", + }, + ], + "description": "Use ES modules named export for css exports.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-css-auto-url": Object { + "configs": Array [ + Object { + "description": "Enable/disable \`url()\`/\`image-set()\`/\`src()\`/\`image()\` functions handling.", + "multiple": false, + "path": "module.parser.css/auto.url", + "type": "boolean", + }, + ], + "description": "Enable/disable \`url()\`/\`image-set()\`/\`src()\`/\`image()\` functions handling.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-css-global-import": Object { + "configs": Array [ + Object { + "description": "Enable/disable \`@import\` at-rules handling.", + "multiple": false, + "path": "module.parser.css/global.import", + "type": "boolean", + }, + ], + "description": "Enable/disable \`@import\` at-rules handling.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-css-global-named-exports": Object { + "configs": Array [ + Object { + "description": "Use ES modules named export for css exports.", + "multiple": false, + "path": "module.parser.css/global.namedExports", + "type": "boolean", + }, + ], + "description": "Use ES modules named export for css exports.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-css-global-url": Object { + "configs": Array [ + Object { + "description": "Enable/disable \`url()\`/\`image-set()\`/\`src()\`/\`image()\` functions handling.", + "multiple": false, + "path": "module.parser.css/global.url", + "type": "boolean", + }, + ], + "description": "Enable/disable \`url()\`/\`image-set()\`/\`src()\`/\`image()\` functions handling.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-css-import": Object { + "configs": Array [ + Object { + "description": "Enable/disable \`@import\` at-rules handling.", + "multiple": false, + "path": "module.parser.css.import", + "type": "boolean", + }, + ], + "description": "Enable/disable \`@import\` at-rules handling.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-css-module-import": Object { + "configs": Array [ + Object { + "description": "Enable/disable \`@import\` at-rules handling.", + "multiple": false, + "path": "module.parser.css/module.import", + "type": "boolean", + }, + ], + "description": "Enable/disable \`@import\` at-rules handling.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-css-module-named-exports": Object { + "configs": Array [ + Object { + "description": "Use ES modules named export for css exports.", + "multiple": false, + "path": "module.parser.css/module.namedExports", + "type": "boolean", + }, + ], + "description": "Use ES modules named export for css exports.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-css-module-url": Object { + "configs": Array [ + Object { + "description": "Enable/disable \`url()\`/\`image-set()\`/\`src()\`/\`image()\` functions handling.", + "multiple": false, + "path": "module.parser.css/module.url", + "type": "boolean", + }, + ], + "description": "Enable/disable \`url()\`/\`image-set()\`/\`src()\`/\`image()\` functions handling.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-css-named-exports": Object { + "configs": Array [ + Object { + "description": "Use ES modules named export for css exports.", + "multiple": false, + "path": "module.parser.css.namedExports", + "type": "boolean", + }, + ], + "description": "Use ES modules named export for css exports.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-css-url": Object { + "configs": Array [ + Object { + "description": "Enable/disable \`url()\`/\`image-set()\`/\`src()\`/\`image()\` functions handling.", + "multiple": false, + "path": "module.parser.css.url", + "type": "boolean", + }, + ], + "description": "Enable/disable \`url()\`/\`image-set()\`/\`src()\`/\`image()\` functions handling.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-amd": Object { + "configs": Array [ + Object { + "description": "You can pass \`false\` to disable AMD support.", + "multiple": false, + "path": "module.parser.javascript.amd", + "type": "enum", + "values": Array [ + false, + ], + }, + ], + "description": "You can pass \`false\` to disable AMD support.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-amd": Object { + "configs": Array [ + Object { + "description": "You can pass \`false\` to disable AMD support.", + "multiple": false, + "path": "module.parser.javascript/auto.amd", + "type": "enum", + "values": Array [ + false, + ], + }, + ], + "description": "You can pass \`false\` to disable AMD support.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-browserify": Object { + "configs": Array [ + Object { + "description": "Enable/disable special handling for browserify bundles.", + "multiple": false, + "path": "module.parser.javascript/auto.browserify", + "type": "boolean", + }, + ], + "description": "Enable/disable special handling for browserify bundles.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-commonjs": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of CommonJs syntax.", + "multiple": false, + "path": "module.parser.javascript/auto.commonjs", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of CommonJs syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-commonjs-magic-comments": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of magic comments in CommonJs syntax.", + "multiple": false, + "path": "module.parser.javascript/auto.commonjsMagicComments", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of magic comments in CommonJs syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-create-require": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing \\"import { createRequire } from \\"module\\"\\" and evaluating createRequire().", + "multiple": false, + "path": "module.parser.javascript/auto.createRequire", + "type": "boolean", + }, + Object { + "description": "Enable/disable parsing \\"import { createRequire } from \\"module\\"\\" and evaluating createRequire().", + "multiple": false, + "path": "module.parser.javascript/auto.createRequire", + "type": "string", + }, + ], + "description": "Enable/disable parsing \\"import { createRequire } from \\"module\\"\\" and evaluating createRequire().", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-auto-dynamic-import-fetch-priority": Object { + "configs": Array [ + Object { + "description": "Specifies global fetchPriority for dynamic import.", + "multiple": false, + "path": "module.parser.javascript/auto.dynamicImportFetchPriority", + "type": "enum", + "values": Array [ + "low", + "high", + "auto", + false, + ], + }, + ], + "description": "Specifies global fetchPriority for dynamic import.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-auto-dynamic-import-mode": Object { + "configs": Array [ + Object { + "description": "Specifies global mode for dynamic import.", + "multiple": false, + "path": "module.parser.javascript/auto.dynamicImportMode", + "type": "enum", + "values": Array [ + "eager", + "weak", + "lazy", + "lazy-once", + ], + }, + ], + "description": "Specifies global mode for dynamic import.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-auto-dynamic-import-prefetch": Object { + "configs": Array [ + Object { + "description": "Specifies global prefetch for dynamic import.", + "multiple": false, + "path": "module.parser.javascript/auto.dynamicImportPrefetch", + "type": "number", + }, + Object { + "description": "Specifies global prefetch for dynamic import.", + "multiple": false, + "path": "module.parser.javascript/auto.dynamicImportPrefetch", + "type": "boolean", + }, + ], + "description": "Specifies global prefetch for dynamic import.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-auto-dynamic-import-preload": Object { + "configs": Array [ + Object { + "description": "Specifies global preload for dynamic import.", + "multiple": false, + "path": "module.parser.javascript/auto.dynamicImportPreload", + "type": "number", + }, + Object { + "description": "Specifies global preload for dynamic import.", + "multiple": false, + "path": "module.parser.javascript/auto.dynamicImportPreload", + "type": "boolean", + }, + ], + "description": "Specifies global preload for dynamic import.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-auto-exports-presence": Object { + "configs": Array [ + Object { + "description": "Specifies the behavior of invalid export names in \\"import ... from ...\\" and \\"export ... from ...\\".", + "multiple": false, + "path": "module.parser.javascript/auto.exportsPresence", + "type": "enum", + "values": Array [ + "error", + "warn", + "auto", + false, + ], + }, + ], + "description": "Specifies the behavior of invalid export names in \\"import ... from ...\\" and \\"export ... from ...\\".", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-auto-expr-context-critical": Object { + "configs": Array [ + Object { + "description": "Enable warnings for full dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/auto.exprContextCritical", + "type": "boolean", + }, + ], + "description": "Enable warnings for full dynamic dependencies.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-expr-context-recursive": Object { + "configs": Array [ + Object { + "description": "Enable recursive directory lookup for full dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/auto.exprContextRecursive", + "type": "boolean", + }, + ], + "description": "Enable recursive directory lookup for full dynamic dependencies.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-expr-context-reg-exp": Object { + "configs": Array [ + Object { + "description": "Sets the default regular expression for full dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/auto.exprContextRegExp", + "type": "RegExp", + }, + Object { + "description": "Sets the default regular expression for full dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/auto.exprContextRegExp", + "type": "boolean", + }, + ], + "description": "Sets the default regular expression for full dynamic dependencies.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-auto-expr-context-request": Object { + "configs": Array [ + Object { + "description": "Set the default request for full dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/auto.exprContextRequest", + "type": "string", + }, + ], + "description": "Set the default request for full dynamic dependencies.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-auto-harmony": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of EcmaScript Modules syntax.", + "multiple": false, + "path": "module.parser.javascript/auto.harmony", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of EcmaScript Modules syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-import": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of import() syntax.", + "multiple": false, + "path": "module.parser.javascript/auto.import", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of import() syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-import-exports-presence": Object { + "configs": Array [ + Object { + "description": "Specifies the behavior of invalid export names in \\"import ... from ...\\".", + "multiple": false, + "path": "module.parser.javascript/auto.importExportsPresence", + "type": "enum", + "values": Array [ + "error", + "warn", + "auto", + false, + ], + }, + ], + "description": "Specifies the behavior of invalid export names in \\"import ... from ...\\".", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-auto-import-meta": Object { + "configs": Array [ + Object { + "description": "Enable/disable evaluating import.meta.", + "multiple": false, + "path": "module.parser.javascript/auto.importMeta", + "type": "boolean", + }, + ], + "description": "Enable/disable evaluating import.meta.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-import-meta-context": Object { + "configs": Array [ + Object { + "description": "Enable/disable evaluating import.meta.webpackContext.", + "multiple": false, + "path": "module.parser.javascript/auto.importMetaContext", + "type": "boolean", + }, + ], + "description": "Enable/disable evaluating import.meta.webpackContext.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-node": Object { + "configs": Array [ + Object { + "description": "Include polyfills or mocks for various node stuff.", + "multiple": false, + "path": "module.parser.javascript/auto.node", + "type": "enum", + "values": Array [ + false, + ], + }, + ], + "description": "Include polyfills or mocks for various node stuff.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-node-dirname": Object { + "configs": Array [ + Object { + "description": "Include a polyfill for the '__dirname' variable.", + "multiple": false, + "path": "module.parser.javascript/auto.node.__dirname", + "type": "enum", + "values": Array [ + false, + true, + "warn-mock", + "mock", + "node-module", + "eval-only", + ], + }, + ], + "description": "Include a polyfill for the '__dirname' variable.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-auto-node-filename": Object { + "configs": Array [ + Object { + "description": "Include a polyfill for the '__filename' variable.", + "multiple": false, + "path": "module.parser.javascript/auto.node.__filename", + "type": "enum", + "values": Array [ + false, + true, + "warn-mock", + "mock", + "node-module", + "eval-only", + ], + }, + ], + "description": "Include a polyfill for the '__filename' variable.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-auto-node-global": Object { + "configs": Array [ + Object { + "description": "Include a polyfill for the 'global' variable.", + "multiple": false, + "path": "module.parser.javascript/auto.node.global", + "type": "enum", + "values": Array [ + false, + true, + "warn", + ], + }, + ], + "description": "Include a polyfill for the 'global' variable.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-auto-override-strict": Object { + "configs": Array [ + Object { + "description": "Override the module to strict or non-strict. This may affect the behavior of the module (some behaviors differ between strict and non-strict), so please configure this option carefully.", + "multiple": false, + "path": "module.parser.javascript/auto.overrideStrict", + "type": "enum", + "values": Array [ + "strict", + "non-strict", + ], + }, + ], + "description": "Override the module to strict or non-strict. This may affect the behavior of the module (some behaviors differ between strict and non-strict), so please configure this option carefully.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-auto-reexport-exports-presence": Object { + "configs": Array [ + Object { + "description": "Specifies the behavior of invalid export names in \\"export ... from ...\\". This might be useful to disable during the migration from \\"export ... from ...\\" to \\"export type ... from ...\\" when reexporting types in TypeScript.", + "multiple": false, + "path": "module.parser.javascript/auto.reexportExportsPresence", + "type": "enum", + "values": Array [ + "error", + "warn", + "auto", + false, + ], + }, + ], + "description": "Specifies the behavior of invalid export names in \\"export ... from ...\\". This might be useful to disable during the migration from \\"export ... from ...\\" to \\"export type ... from ...\\" when reexporting types in TypeScript.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-auto-require-context": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of require.context syntax.", + "multiple": false, + "path": "module.parser.javascript/auto.requireContext", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of require.context syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-require-ensure": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of require.ensure syntax.", + "multiple": false, + "path": "module.parser.javascript/auto.requireEnsure", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of require.ensure syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-require-include": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of require.include syntax.", + "multiple": false, + "path": "module.parser.javascript/auto.requireInclude", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of require.include syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-require-js": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of require.js special syntax like require.config, requirejs.config, require.version and requirejs.onError.", + "multiple": false, + "path": "module.parser.javascript/auto.requireJs", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of require.js special syntax like require.config, requirejs.config, require.version and requirejs.onError.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-strict-export-presence": Object { + "configs": Array [ + Object { + "description": "Deprecated in favor of \\"exportsPresence\\". Emit errors instead of warnings when imported names don't exist in imported module.", + "multiple": false, + "path": "module.parser.javascript/auto.strictExportPresence", + "type": "boolean", + }, + ], + "description": "Deprecated in favor of \\"exportsPresence\\". Emit errors instead of warnings when imported names don't exist in imported module.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-strict-this-context-on-imports": Object { + "configs": Array [ + Object { + "description": "Handle the this context correctly according to the spec for namespace objects.", + "multiple": false, + "path": "module.parser.javascript/auto.strictThisContextOnImports", + "type": "boolean", + }, + ], + "description": "Handle the this context correctly according to the spec for namespace objects.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-system": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of System.js special syntax like System.import, System.get, System.set and System.register.", + "multiple": false, + "path": "module.parser.javascript/auto.system", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of System.js special syntax like System.import, System.get, System.set and System.register.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-unknown-context-critical": Object { + "configs": Array [ + Object { + "description": "Enable warnings when using the require function in a not statically analyse-able way.", + "multiple": false, + "path": "module.parser.javascript/auto.unknownContextCritical", + "type": "boolean", + }, + ], + "description": "Enable warnings when using the require function in a not statically analyse-able way.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-unknown-context-recursive": Object { + "configs": Array [ + Object { + "description": "Enable recursive directory lookup when using the require function in a not statically analyse-able way.", + "multiple": false, + "path": "module.parser.javascript/auto.unknownContextRecursive", + "type": "boolean", + }, + ], + "description": "Enable recursive directory lookup when using the require function in a not statically analyse-able way.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-unknown-context-reg-exp": Object { + "configs": Array [ + Object { + "description": "Sets the regular expression when using the require function in a not statically analyse-able way.", + "multiple": false, + "path": "module.parser.javascript/auto.unknownContextRegExp", + "type": "RegExp", + }, + Object { + "description": "Sets the regular expression when using the require function in a not statically analyse-able way.", + "multiple": false, + "path": "module.parser.javascript/auto.unknownContextRegExp", + "type": "boolean", + }, + ], + "description": "Sets the regular expression when using the require function in a not statically analyse-able way.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-auto-unknown-context-request": Object { + "configs": Array [ + Object { + "description": "Sets the request when using the require function in a not statically analyse-able way.", + "multiple": false, + "path": "module.parser.javascript/auto.unknownContextRequest", + "type": "string", + }, + ], + "description": "Sets the request when using the require function in a not statically analyse-able way.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-auto-url": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of new URL() syntax.", + "multiple": false, + "path": "module.parser.javascript/auto.url", + "type": "enum", + "values": Array [ + "relative", + ], + }, + Object { + "description": "Enable/disable parsing of new URL() syntax.", + "multiple": false, + "path": "module.parser.javascript/auto.url", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of new URL() syntax.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-auto-worker": Object { + "configs": Array [ + Object { + "description": "Specify a syntax that should be parsed as WebWorker reference. 'Abc' handles 'new Abc()', 'Abc from xyz' handles 'import { Abc } from \\"xyz\\"; new Abc()', 'abc()' handles 'abc()', and combinations are also possible.", + "multiple": true, + "path": "module.parser.javascript/auto.worker[]", + "type": "string", + }, + Object { + "description": "Disable or configure parsing of WebWorker syntax like new Worker() or navigator.serviceWorker.register().", + "multiple": false, + "path": "module.parser.javascript/auto.worker", + "type": "boolean", + }, + ], + "description": "Specify a syntax that should be parsed as WebWorker reference. 'Abc' handles 'new Abc()', 'Abc from xyz' handles 'import { Abc } from \\"xyz\\"; new Abc()', 'abc()' handles 'abc()', and combinations are also possible. Disable or configure parsing of WebWorker syntax like new Worker() or navigator.serviceWorker.register().", + "multiple": true, + "simpleType": "string", + }, + "module-parser-javascript-auto-worker-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'module.parser.javascript/auto.worker' configuration. Disable or configure parsing of WebWorker syntax like new Worker() or navigator.serviceWorker.register().", + "multiple": false, + "path": "module.parser.javascript/auto.worker", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'module.parser.javascript/auto.worker' configuration. Disable or configure parsing of WebWorker syntax like new Worker() or navigator.serviceWorker.register().", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-wrapped-context-critical": Object { + "configs": Array [ + Object { + "description": "Enable warnings for partial dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/auto.wrappedContextCritical", + "type": "boolean", + }, + ], + "description": "Enable warnings for partial dynamic dependencies.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-wrapped-context-recursive": Object { + "configs": Array [ + Object { + "description": "Enable recursive directory lookup for partial dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/auto.wrappedContextRecursive", + "type": "boolean", + }, + ], + "description": "Enable recursive directory lookup for partial dynamic dependencies.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-auto-wrapped-context-reg-exp": Object { + "configs": Array [ + Object { + "description": "Set the inner regular expression for partial dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/auto.wrappedContextRegExp", + "type": "RegExp", + }, + ], + "description": "Set the inner regular expression for partial dynamic dependencies.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-browserify": Object { + "configs": Array [ + Object { + "description": "Enable/disable special handling for browserify bundles.", + "multiple": false, + "path": "module.parser.javascript.browserify", + "type": "boolean", + }, + ], + "description": "Enable/disable special handling for browserify bundles.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-commonjs": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of CommonJs syntax.", + "multiple": false, + "path": "module.parser.javascript.commonjs", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of CommonJs syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-commonjs-magic-comments": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of magic comments in CommonJs syntax.", + "multiple": false, + "path": "module.parser.javascript.commonjsMagicComments", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of magic comments in CommonJs syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-create-require": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing \\"import { createRequire } from \\"module\\"\\" and evaluating createRequire().", + "multiple": false, + "path": "module.parser.javascript.createRequire", + "type": "boolean", + }, + Object { + "description": "Enable/disable parsing \\"import { createRequire } from \\"module\\"\\" and evaluating createRequire().", + "multiple": false, + "path": "module.parser.javascript.createRequire", + "type": "string", + }, + ], + "description": "Enable/disable parsing \\"import { createRequire } from \\"module\\"\\" and evaluating createRequire().", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-dynamic-amd": Object { + "configs": Array [ + Object { + "description": "You can pass \`false\` to disable AMD support.", + "multiple": false, + "path": "module.parser.javascript/dynamic.amd", + "type": "enum", + "values": Array [ + false, + ], + }, + ], + "description": "You can pass \`false\` to disable AMD support.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-dynamic-browserify": Object { + "configs": Array [ + Object { + "description": "Enable/disable special handling for browserify bundles.", + "multiple": false, + "path": "module.parser.javascript/dynamic.browserify", + "type": "boolean", + }, + ], + "description": "Enable/disable special handling for browserify bundles.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-dynamic-commonjs": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of CommonJs syntax.", + "multiple": false, + "path": "module.parser.javascript/dynamic.commonjs", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of CommonJs syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-dynamic-commonjs-magic-comments": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of magic comments in CommonJs syntax.", + "multiple": false, + "path": "module.parser.javascript/dynamic.commonjsMagicComments", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of magic comments in CommonJs syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-dynamic-create-require": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing \\"import { createRequire } from \\"module\\"\\" and evaluating createRequire().", + "multiple": false, + "path": "module.parser.javascript/dynamic.createRequire", + "type": "boolean", + }, + Object { + "description": "Enable/disable parsing \\"import { createRequire } from \\"module\\"\\" and evaluating createRequire().", + "multiple": false, + "path": "module.parser.javascript/dynamic.createRequire", + "type": "string", + }, + ], + "description": "Enable/disable parsing \\"import { createRequire } from \\"module\\"\\" and evaluating createRequire().", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-dynamic-dynamic-import-fetch-priority": Object { + "configs": Array [ + Object { + "description": "Specifies global fetchPriority for dynamic import.", + "multiple": false, + "path": "module.parser.javascript/dynamic.dynamicImportFetchPriority", + "type": "enum", + "values": Array [ + "low", + "high", + "auto", + false, + ], + }, + ], + "description": "Specifies global fetchPriority for dynamic import.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-dynamic-dynamic-import-mode": Object { + "configs": Array [ + Object { + "description": "Specifies global mode for dynamic import.", + "multiple": false, + "path": "module.parser.javascript/dynamic.dynamicImportMode", + "type": "enum", + "values": Array [ + "eager", + "weak", + "lazy", + "lazy-once", + ], + }, + ], + "description": "Specifies global mode for dynamic import.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-dynamic-dynamic-import-prefetch": Object { + "configs": Array [ + Object { + "description": "Specifies global prefetch for dynamic import.", + "multiple": false, + "path": "module.parser.javascript/dynamic.dynamicImportPrefetch", + "type": "number", + }, + Object { + "description": "Specifies global prefetch for dynamic import.", + "multiple": false, + "path": "module.parser.javascript/dynamic.dynamicImportPrefetch", + "type": "boolean", + }, + ], + "description": "Specifies global prefetch for dynamic import.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-dynamic-dynamic-import-preload": Object { + "configs": Array [ + Object { + "description": "Specifies global preload for dynamic import.", + "multiple": false, + "path": "module.parser.javascript/dynamic.dynamicImportPreload", + "type": "number", + }, + Object { + "description": "Specifies global preload for dynamic import.", + "multiple": false, + "path": "module.parser.javascript/dynamic.dynamicImportPreload", + "type": "boolean", + }, + ], + "description": "Specifies global preload for dynamic import.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-dynamic-exports-presence": Object { + "configs": Array [ + Object { + "description": "Specifies the behavior of invalid export names in \\"import ... from ...\\" and \\"export ... from ...\\".", + "multiple": false, + "path": "module.parser.javascript/dynamic.exportsPresence", + "type": "enum", + "values": Array [ + "error", + "warn", + "auto", + false, + ], + }, + ], + "description": "Specifies the behavior of invalid export names in \\"import ... from ...\\" and \\"export ... from ...\\".", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-dynamic-expr-context-critical": Object { + "configs": Array [ + Object { + "description": "Enable warnings for full dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/dynamic.exprContextCritical", + "type": "boolean", + }, + ], + "description": "Enable warnings for full dynamic dependencies.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-dynamic-expr-context-recursive": Object { + "configs": Array [ + Object { + "description": "Enable recursive directory lookup for full dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/dynamic.exprContextRecursive", + "type": "boolean", + }, + ], + "description": "Enable recursive directory lookup for full dynamic dependencies.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-dynamic-expr-context-reg-exp": Object { + "configs": Array [ + Object { + "description": "Sets the default regular expression for full dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/dynamic.exprContextRegExp", + "type": "RegExp", + }, + Object { + "description": "Sets the default regular expression for full dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/dynamic.exprContextRegExp", + "type": "boolean", + }, + ], + "description": "Sets the default regular expression for full dynamic dependencies.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-dynamic-expr-context-request": Object { + "configs": Array [ + Object { + "description": "Set the default request for full dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/dynamic.exprContextRequest", + "type": "string", + }, + ], + "description": "Set the default request for full dynamic dependencies.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-dynamic-harmony": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of EcmaScript Modules syntax.", + "multiple": false, + "path": "module.parser.javascript/dynamic.harmony", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of EcmaScript Modules syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-dynamic-import": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of import() syntax.", + "multiple": false, + "path": "module.parser.javascript/dynamic.import", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of import() syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-dynamic-import-exports-presence": Object { + "configs": Array [ + Object { + "description": "Specifies the behavior of invalid export names in \\"import ... from ...\\".", + "multiple": false, + "path": "module.parser.javascript/dynamic.importExportsPresence", + "type": "enum", + "values": Array [ + "error", + "warn", + "auto", + false, + ], + }, + ], + "description": "Specifies the behavior of invalid export names in \\"import ... from ...\\".", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-dynamic-import-fetch-priority": Object { + "configs": Array [ + Object { + "description": "Specifies global fetchPriority for dynamic import.", + "multiple": false, + "path": "module.parser.javascript.dynamicImportFetchPriority", + "type": "enum", + "values": Array [ + "low", + "high", + "auto", + false, + ], + }, + ], + "description": "Specifies global fetchPriority for dynamic import.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-dynamic-import-meta": Object { + "configs": Array [ + Object { + "description": "Enable/disable evaluating import.meta.", + "multiple": false, + "path": "module.parser.javascript/dynamic.importMeta", + "type": "boolean", + }, + ], + "description": "Enable/disable evaluating import.meta.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-dynamic-import-meta-context": Object { + "configs": Array [ + Object { + "description": "Enable/disable evaluating import.meta.webpackContext.", + "multiple": false, + "path": "module.parser.javascript/dynamic.importMetaContext", + "type": "boolean", + }, + ], + "description": "Enable/disable evaluating import.meta.webpackContext.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-dynamic-import-mode": Object { + "configs": Array [ + Object { + "description": "Specifies global mode for dynamic import.", + "multiple": false, + "path": "module.parser.javascript.dynamicImportMode", + "type": "enum", + "values": Array [ + "eager", + "weak", + "lazy", + "lazy-once", + ], + }, + ], + "description": "Specifies global mode for dynamic import.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-dynamic-import-prefetch": Object { + "configs": Array [ + Object { + "description": "Specifies global prefetch for dynamic import.", + "multiple": false, + "path": "module.parser.javascript.dynamicImportPrefetch", + "type": "number", + }, + Object { + "description": "Specifies global prefetch for dynamic import.", + "multiple": false, + "path": "module.parser.javascript.dynamicImportPrefetch", + "type": "boolean", + }, + ], + "description": "Specifies global prefetch for dynamic import.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-dynamic-import-preload": Object { + "configs": Array [ + Object { + "description": "Specifies global preload for dynamic import.", + "multiple": false, + "path": "module.parser.javascript.dynamicImportPreload", + "type": "number", + }, + Object { + "description": "Specifies global preload for dynamic import.", + "multiple": false, + "path": "module.parser.javascript.dynamicImportPreload", + "type": "boolean", + }, + ], + "description": "Specifies global preload for dynamic import.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-dynamic-node": Object { + "configs": Array [ + Object { + "description": "Include polyfills or mocks for various node stuff.", + "multiple": false, + "path": "module.parser.javascript/dynamic.node", + "type": "enum", + "values": Array [ + false, + ], + }, + ], + "description": "Include polyfills or mocks for various node stuff.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-dynamic-node-dirname": Object { + "configs": Array [ + Object { + "description": "Include a polyfill for the '__dirname' variable.", + "multiple": false, + "path": "module.parser.javascript/dynamic.node.__dirname", + "type": "enum", + "values": Array [ + false, + true, + "warn-mock", + "mock", + "node-module", + "eval-only", + ], + }, + ], + "description": "Include a polyfill for the '__dirname' variable.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-dynamic-node-filename": Object { + "configs": Array [ + Object { + "description": "Include a polyfill for the '__filename' variable.", + "multiple": false, + "path": "module.parser.javascript/dynamic.node.__filename", + "type": "enum", + "values": Array [ + false, + true, + "warn-mock", + "mock", + "node-module", + "eval-only", + ], + }, + ], + "description": "Include a polyfill for the '__filename' variable.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-dynamic-node-global": Object { + "configs": Array [ + Object { + "description": "Include a polyfill for the 'global' variable.", + "multiple": false, + "path": "module.parser.javascript/dynamic.node.global", + "type": "enum", + "values": Array [ + false, + true, + "warn", + ], + }, + ], + "description": "Include a polyfill for the 'global' variable.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-dynamic-override-strict": Object { + "configs": Array [ + Object { + "description": "Override the module to strict or non-strict. This may affect the behavior of the module (some behaviors differ between strict and non-strict), so please configure this option carefully.", + "multiple": false, + "path": "module.parser.javascript/dynamic.overrideStrict", + "type": "enum", + "values": Array [ + "strict", + "non-strict", + ], + }, + ], + "description": "Override the module to strict or non-strict. This may affect the behavior of the module (some behaviors differ between strict and non-strict), so please configure this option carefully.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-dynamic-reexport-exports-presence": Object { + "configs": Array [ + Object { + "description": "Specifies the behavior of invalid export names in \\"export ... from ...\\". This might be useful to disable during the migration from \\"export ... from ...\\" to \\"export type ... from ...\\" when reexporting types in TypeScript.", + "multiple": false, + "path": "module.parser.javascript/dynamic.reexportExportsPresence", + "type": "enum", + "values": Array [ + "error", + "warn", + "auto", + false, + ], + }, + ], + "description": "Specifies the behavior of invalid export names in \\"export ... from ...\\". This might be useful to disable during the migration from \\"export ... from ...\\" to \\"export type ... from ...\\" when reexporting types in TypeScript.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-dynamic-require-context": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of require.context syntax.", + "multiple": false, + "path": "module.parser.javascript/dynamic.requireContext", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of require.context syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-dynamic-require-ensure": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of require.ensure syntax.", + "multiple": false, + "path": "module.parser.javascript/dynamic.requireEnsure", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of require.ensure syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-dynamic-require-include": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of require.include syntax.", + "multiple": false, + "path": "module.parser.javascript/dynamic.requireInclude", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of require.include syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-dynamic-require-js": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of require.js special syntax like require.config, requirejs.config, require.version and requirejs.onError.", + "multiple": false, + "path": "module.parser.javascript/dynamic.requireJs", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of require.js special syntax like require.config, requirejs.config, require.version and requirejs.onError.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-dynamic-strict-export-presence": Object { + "configs": Array [ + Object { + "description": "Deprecated in favor of \\"exportsPresence\\". Emit errors instead of warnings when imported names don't exist in imported module.", + "multiple": false, + "path": "module.parser.javascript/dynamic.strictExportPresence", + "type": "boolean", + }, + ], + "description": "Deprecated in favor of \\"exportsPresence\\". Emit errors instead of warnings when imported names don't exist in imported module.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-dynamic-strict-this-context-on-imports": Object { + "configs": Array [ + Object { + "description": "Handle the this context correctly according to the spec for namespace objects.", + "multiple": false, + "path": "module.parser.javascript/dynamic.strictThisContextOnImports", + "type": "boolean", + }, + ], + "description": "Handle the this context correctly according to the spec for namespace objects.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-dynamic-system": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of System.js special syntax like System.import, System.get, System.set and System.register.", + "multiple": false, + "path": "module.parser.javascript/dynamic.system", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of System.js special syntax like System.import, System.get, System.set and System.register.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-dynamic-unknown-context-critical": Object { + "configs": Array [ + Object { + "description": "Enable warnings when using the require function in a not statically analyse-able way.", + "multiple": false, + "path": "module.parser.javascript/dynamic.unknownContextCritical", + "type": "boolean", + }, + ], + "description": "Enable warnings when using the require function in a not statically analyse-able way.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-dynamic-unknown-context-recursive": Object { + "configs": Array [ + Object { + "description": "Enable recursive directory lookup when using the require function in a not statically analyse-able way.", + "multiple": false, + "path": "module.parser.javascript/dynamic.unknownContextRecursive", + "type": "boolean", + }, + ], + "description": "Enable recursive directory lookup when using the require function in a not statically analyse-able way.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-dynamic-unknown-context-reg-exp": Object { + "configs": Array [ + Object { + "description": "Sets the regular expression when using the require function in a not statically analyse-able way.", + "multiple": false, + "path": "module.parser.javascript/dynamic.unknownContextRegExp", + "type": "RegExp", + }, + Object { + "description": "Sets the regular expression when using the require function in a not statically analyse-able way.", + "multiple": false, + "path": "module.parser.javascript/dynamic.unknownContextRegExp", + "type": "boolean", + }, + ], + "description": "Sets the regular expression when using the require function in a not statically analyse-able way.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-dynamic-unknown-context-request": Object { + "configs": Array [ + Object { + "description": "Sets the request when using the require function in a not statically analyse-able way.", + "multiple": false, + "path": "module.parser.javascript/dynamic.unknownContextRequest", + "type": "string", + }, + ], + "description": "Sets the request when using the require function in a not statically analyse-able way.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-dynamic-url": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of new URL() syntax.", + "multiple": false, + "path": "module.parser.javascript/dynamic.url", + "type": "enum", + "values": Array [ + "relative", + ], + }, + Object { + "description": "Enable/disable parsing of new URL() syntax.", + "multiple": false, + "path": "module.parser.javascript/dynamic.url", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of new URL() syntax.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-dynamic-worker": Object { + "configs": Array [ + Object { + "description": "Specify a syntax that should be parsed as WebWorker reference. 'Abc' handles 'new Abc()', 'Abc from xyz' handles 'import { Abc } from \\"xyz\\"; new Abc()', 'abc()' handles 'abc()', and combinations are also possible.", + "multiple": true, + "path": "module.parser.javascript/dynamic.worker[]", + "type": "string", + }, + Object { + "description": "Disable or configure parsing of WebWorker syntax like new Worker() or navigator.serviceWorker.register().", + "multiple": false, + "path": "module.parser.javascript/dynamic.worker", + "type": "boolean", + }, + ], + "description": "Specify a syntax that should be parsed as WebWorker reference. 'Abc' handles 'new Abc()', 'Abc from xyz' handles 'import { Abc } from \\"xyz\\"; new Abc()', 'abc()' handles 'abc()', and combinations are also possible. Disable or configure parsing of WebWorker syntax like new Worker() or navigator.serviceWorker.register().", + "multiple": true, + "simpleType": "string", + }, + "module-parser-javascript-dynamic-worker-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'module.parser.javascript/dynamic.worker' configuration. Disable or configure parsing of WebWorker syntax like new Worker() or navigator.serviceWorker.register().", + "multiple": false, + "path": "module.parser.javascript/dynamic.worker", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'module.parser.javascript/dynamic.worker' configuration. Disable or configure parsing of WebWorker syntax like new Worker() or navigator.serviceWorker.register().", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-dynamic-wrapped-context-critical": Object { + "configs": Array [ + Object { + "description": "Enable warnings for partial dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/dynamic.wrappedContextCritical", + "type": "boolean", + }, + ], + "description": "Enable warnings for partial dynamic dependencies.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-dynamic-wrapped-context-recursive": Object { + "configs": Array [ + Object { + "description": "Enable recursive directory lookup for partial dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/dynamic.wrappedContextRecursive", + "type": "boolean", + }, + ], + "description": "Enable recursive directory lookup for partial dynamic dependencies.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-dynamic-wrapped-context-reg-exp": Object { + "configs": Array [ + Object { + "description": "Set the inner regular expression for partial dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/dynamic.wrappedContextRegExp", + "type": "RegExp", + }, + ], + "description": "Set the inner regular expression for partial dynamic dependencies.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-esm-amd": Object { + "configs": Array [ + Object { + "description": "You can pass \`false\` to disable AMD support.", + "multiple": false, + "path": "module.parser.javascript/esm.amd", + "type": "enum", + "values": Array [ + false, + ], + }, + ], + "description": "You can pass \`false\` to disable AMD support.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-esm-browserify": Object { + "configs": Array [ + Object { + "description": "Enable/disable special handling for browserify bundles.", + "multiple": false, + "path": "module.parser.javascript/esm.browserify", + "type": "boolean", + }, + ], + "description": "Enable/disable special handling for browserify bundles.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-esm-commonjs": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of CommonJs syntax.", + "multiple": false, + "path": "module.parser.javascript/esm.commonjs", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of CommonJs syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-esm-commonjs-magic-comments": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of magic comments in CommonJs syntax.", + "multiple": false, + "path": "module.parser.javascript/esm.commonjsMagicComments", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of magic comments in CommonJs syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-esm-create-require": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing \\"import { createRequire } from \\"module\\"\\" and evaluating createRequire().", + "multiple": false, + "path": "module.parser.javascript/esm.createRequire", + "type": "boolean", + }, + Object { + "description": "Enable/disable parsing \\"import { createRequire } from \\"module\\"\\" and evaluating createRequire().", + "multiple": false, + "path": "module.parser.javascript/esm.createRequire", + "type": "string", + }, + ], + "description": "Enable/disable parsing \\"import { createRequire } from \\"module\\"\\" and evaluating createRequire().", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-esm-dynamic-import-fetch-priority": Object { + "configs": Array [ + Object { + "description": "Specifies global fetchPriority for dynamic import.", + "multiple": false, + "path": "module.parser.javascript/esm.dynamicImportFetchPriority", + "type": "enum", + "values": Array [ + "low", + "high", + "auto", + false, + ], + }, + ], + "description": "Specifies global fetchPriority for dynamic import.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-esm-dynamic-import-mode": Object { + "configs": Array [ + Object { + "description": "Specifies global mode for dynamic import.", + "multiple": false, + "path": "module.parser.javascript/esm.dynamicImportMode", + "type": "enum", + "values": Array [ + "eager", + "weak", + "lazy", + "lazy-once", + ], + }, + ], + "description": "Specifies global mode for dynamic import.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-esm-dynamic-import-prefetch": Object { + "configs": Array [ + Object { + "description": "Specifies global prefetch for dynamic import.", + "multiple": false, + "path": "module.parser.javascript/esm.dynamicImportPrefetch", + "type": "number", + }, + Object { + "description": "Specifies global prefetch for dynamic import.", + "multiple": false, + "path": "module.parser.javascript/esm.dynamicImportPrefetch", + "type": "boolean", + }, + ], + "description": "Specifies global prefetch for dynamic import.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-esm-dynamic-import-preload": Object { + "configs": Array [ + Object { + "description": "Specifies global preload for dynamic import.", + "multiple": false, + "path": "module.parser.javascript/esm.dynamicImportPreload", + "type": "number", + }, + Object { + "description": "Specifies global preload for dynamic import.", + "multiple": false, + "path": "module.parser.javascript/esm.dynamicImportPreload", + "type": "boolean", + }, + ], + "description": "Specifies global preload for dynamic import.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-esm-exports-presence": Object { + "configs": Array [ + Object { + "description": "Specifies the behavior of invalid export names in \\"import ... from ...\\" and \\"export ... from ...\\".", + "multiple": false, + "path": "module.parser.javascript/esm.exportsPresence", + "type": "enum", + "values": Array [ + "error", + "warn", + "auto", + false, + ], + }, + ], + "description": "Specifies the behavior of invalid export names in \\"import ... from ...\\" and \\"export ... from ...\\".", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-esm-expr-context-critical": Object { + "configs": Array [ + Object { + "description": "Enable warnings for full dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/esm.exprContextCritical", + "type": "boolean", + }, + ], + "description": "Enable warnings for full dynamic dependencies.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-esm-expr-context-recursive": Object { + "configs": Array [ + Object { + "description": "Enable recursive directory lookup for full dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/esm.exprContextRecursive", + "type": "boolean", + }, + ], + "description": "Enable recursive directory lookup for full dynamic dependencies.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-esm-expr-context-reg-exp": Object { + "configs": Array [ + Object { + "description": "Sets the default regular expression for full dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/esm.exprContextRegExp", + "type": "RegExp", + }, + Object { + "description": "Sets the default regular expression for full dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/esm.exprContextRegExp", + "type": "boolean", + }, + ], + "description": "Sets the default regular expression for full dynamic dependencies.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-esm-expr-context-request": Object { + "configs": Array [ + Object { + "description": "Set the default request for full dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/esm.exprContextRequest", + "type": "string", + }, + ], + "description": "Set the default request for full dynamic dependencies.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-esm-harmony": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of EcmaScript Modules syntax.", + "multiple": false, + "path": "module.parser.javascript/esm.harmony", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of EcmaScript Modules syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-esm-import": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of import() syntax.", + "multiple": false, + "path": "module.parser.javascript/esm.import", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of import() syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-esm-import-exports-presence": Object { + "configs": Array [ + Object { + "description": "Specifies the behavior of invalid export names in \\"import ... from ...\\".", + "multiple": false, + "path": "module.parser.javascript/esm.importExportsPresence", + "type": "enum", + "values": Array [ + "error", + "warn", + "auto", + false, + ], + }, + ], + "description": "Specifies the behavior of invalid export names in \\"import ... from ...\\".", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-esm-import-meta": Object { + "configs": Array [ + Object { + "description": "Enable/disable evaluating import.meta.", + "multiple": false, + "path": "module.parser.javascript/esm.importMeta", + "type": "boolean", + }, + ], + "description": "Enable/disable evaluating import.meta.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-esm-import-meta-context": Object { + "configs": Array [ + Object { + "description": "Enable/disable evaluating import.meta.webpackContext.", + "multiple": false, + "path": "module.parser.javascript/esm.importMetaContext", + "type": "boolean", + }, + ], + "description": "Enable/disable evaluating import.meta.webpackContext.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-esm-node": Object { + "configs": Array [ + Object { + "description": "Include polyfills or mocks for various node stuff.", + "multiple": false, + "path": "module.parser.javascript/esm.node", + "type": "enum", + "values": Array [ + false, + ], + }, + ], + "description": "Include polyfills or mocks for various node stuff.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-esm-node-dirname": Object { + "configs": Array [ + Object { + "description": "Include a polyfill for the '__dirname' variable.", + "multiple": false, + "path": "module.parser.javascript/esm.node.__dirname", + "type": "enum", + "values": Array [ + false, + true, + "warn-mock", + "mock", + "node-module", + "eval-only", + ], + }, + ], + "description": "Include a polyfill for the '__dirname' variable.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-esm-node-filename": Object { + "configs": Array [ + Object { + "description": "Include a polyfill for the '__filename' variable.", + "multiple": false, + "path": "module.parser.javascript/esm.node.__filename", + "type": "enum", + "values": Array [ + false, + true, + "warn-mock", + "mock", + "node-module", + "eval-only", + ], + }, + ], + "description": "Include a polyfill for the '__filename' variable.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-esm-node-global": Object { + "configs": Array [ + Object { + "description": "Include a polyfill for the 'global' variable.", + "multiple": false, + "path": "module.parser.javascript/esm.node.global", + "type": "enum", + "values": Array [ + false, + true, + "warn", + ], + }, + ], + "description": "Include a polyfill for the 'global' variable.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-esm-override-strict": Object { + "configs": Array [ + Object { + "description": "Override the module to strict or non-strict. This may affect the behavior of the module (some behaviors differ between strict and non-strict), so please configure this option carefully.", + "multiple": false, + "path": "module.parser.javascript/esm.overrideStrict", + "type": "enum", + "values": Array [ + "strict", + "non-strict", + ], + }, + ], + "description": "Override the module to strict or non-strict. This may affect the behavior of the module (some behaviors differ between strict and non-strict), so please configure this option carefully.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-esm-reexport-exports-presence": Object { + "configs": Array [ + Object { + "description": "Specifies the behavior of invalid export names in \\"export ... from ...\\". This might be useful to disable during the migration from \\"export ... from ...\\" to \\"export type ... from ...\\" when reexporting types in TypeScript.", + "multiple": false, + "path": "module.parser.javascript/esm.reexportExportsPresence", + "type": "enum", + "values": Array [ + "error", + "warn", + "auto", + false, + ], + }, + ], + "description": "Specifies the behavior of invalid export names in \\"export ... from ...\\". This might be useful to disable during the migration from \\"export ... from ...\\" to \\"export type ... from ...\\" when reexporting types in TypeScript.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-esm-require-context": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of require.context syntax.", + "multiple": false, + "path": "module.parser.javascript/esm.requireContext", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of require.context syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-esm-require-ensure": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of require.ensure syntax.", + "multiple": false, + "path": "module.parser.javascript/esm.requireEnsure", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of require.ensure syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-esm-require-include": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of require.include syntax.", + "multiple": false, + "path": "module.parser.javascript/esm.requireInclude", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of require.include syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-esm-require-js": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of require.js special syntax like require.config, requirejs.config, require.version and requirejs.onError.", + "multiple": false, + "path": "module.parser.javascript/esm.requireJs", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of require.js special syntax like require.config, requirejs.config, require.version and requirejs.onError.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-esm-strict-export-presence": Object { + "configs": Array [ + Object { + "description": "Deprecated in favor of \\"exportsPresence\\". Emit errors instead of warnings when imported names don't exist in imported module.", + "multiple": false, + "path": "module.parser.javascript/esm.strictExportPresence", + "type": "boolean", + }, + ], + "description": "Deprecated in favor of \\"exportsPresence\\". Emit errors instead of warnings when imported names don't exist in imported module.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-esm-strict-this-context-on-imports": Object { + "configs": Array [ + Object { + "description": "Handle the this context correctly according to the spec for namespace objects.", + "multiple": false, + "path": "module.parser.javascript/esm.strictThisContextOnImports", + "type": "boolean", + }, + ], + "description": "Handle the this context correctly according to the spec for namespace objects.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-esm-system": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of System.js special syntax like System.import, System.get, System.set and System.register.", + "multiple": false, + "path": "module.parser.javascript/esm.system", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of System.js special syntax like System.import, System.get, System.set and System.register.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-esm-unknown-context-critical": Object { + "configs": Array [ + Object { + "description": "Enable warnings when using the require function in a not statically analyse-able way.", + "multiple": false, + "path": "module.parser.javascript/esm.unknownContextCritical", + "type": "boolean", + }, + ], + "description": "Enable warnings when using the require function in a not statically analyse-able way.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-esm-unknown-context-recursive": Object { + "configs": Array [ + Object { + "description": "Enable recursive directory lookup when using the require function in a not statically analyse-able way.", + "multiple": false, + "path": "module.parser.javascript/esm.unknownContextRecursive", + "type": "boolean", + }, + ], + "description": "Enable recursive directory lookup when using the require function in a not statically analyse-able way.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-esm-unknown-context-reg-exp": Object { + "configs": Array [ + Object { + "description": "Sets the regular expression when using the require function in a not statically analyse-able way.", + "multiple": false, + "path": "module.parser.javascript/esm.unknownContextRegExp", + "type": "RegExp", + }, + Object { + "description": "Sets the regular expression when using the require function in a not statically analyse-able way.", + "multiple": false, + "path": "module.parser.javascript/esm.unknownContextRegExp", + "type": "boolean", + }, + ], + "description": "Sets the regular expression when using the require function in a not statically analyse-able way.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-esm-unknown-context-request": Object { + "configs": Array [ + Object { + "description": "Sets the request when using the require function in a not statically analyse-able way.", + "multiple": false, + "path": "module.parser.javascript/esm.unknownContextRequest", + "type": "string", + }, + ], + "description": "Sets the request when using the require function in a not statically analyse-able way.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-esm-url": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of new URL() syntax.", + "multiple": false, + "path": "module.parser.javascript/esm.url", + "type": "enum", + "values": Array [ + "relative", + ], + }, + Object { + "description": "Enable/disable parsing of new URL() syntax.", + "multiple": false, + "path": "module.parser.javascript/esm.url", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of new URL() syntax.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-esm-worker": Object { + "configs": Array [ + Object { + "description": "Specify a syntax that should be parsed as WebWorker reference. 'Abc' handles 'new Abc()', 'Abc from xyz' handles 'import { Abc } from \\"xyz\\"; new Abc()', 'abc()' handles 'abc()', and combinations are also possible.", + "multiple": true, + "path": "module.parser.javascript/esm.worker[]", + "type": "string", + }, + Object { + "description": "Disable or configure parsing of WebWorker syntax like new Worker() or navigator.serviceWorker.register().", + "multiple": false, + "path": "module.parser.javascript/esm.worker", + "type": "boolean", + }, + ], + "description": "Specify a syntax that should be parsed as WebWorker reference. 'Abc' handles 'new Abc()', 'Abc from xyz' handles 'import { Abc } from \\"xyz\\"; new Abc()', 'abc()' handles 'abc()', and combinations are also possible. Disable or configure parsing of WebWorker syntax like new Worker() or navigator.serviceWorker.register().", + "multiple": true, + "simpleType": "string", + }, + "module-parser-javascript-esm-worker-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'module.parser.javascript/esm.worker' configuration. Disable or configure parsing of WebWorker syntax like new Worker() or navigator.serviceWorker.register().", + "multiple": false, + "path": "module.parser.javascript/esm.worker", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'module.parser.javascript/esm.worker' configuration. Disable or configure parsing of WebWorker syntax like new Worker() or navigator.serviceWorker.register().", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-esm-wrapped-context-critical": Object { + "configs": Array [ + Object { + "description": "Enable warnings for partial dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/esm.wrappedContextCritical", + "type": "boolean", + }, + ], + "description": "Enable warnings for partial dynamic dependencies.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-esm-wrapped-context-recursive": Object { + "configs": Array [ + Object { + "description": "Enable recursive directory lookup for partial dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/esm.wrappedContextRecursive", + "type": "boolean", + }, + ], + "description": "Enable recursive directory lookup for partial dynamic dependencies.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-esm-wrapped-context-reg-exp": Object { + "configs": Array [ + Object { + "description": "Set the inner regular expression for partial dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript/esm.wrappedContextRegExp", + "type": "RegExp", + }, + ], + "description": "Set the inner regular expression for partial dynamic dependencies.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-exports-presence": Object { + "configs": Array [ + Object { + "description": "Specifies the behavior of invalid export names in \\"import ... from ...\\" and \\"export ... from ...\\".", + "multiple": false, + "path": "module.parser.javascript.exportsPresence", + "type": "enum", + "values": Array [ + "error", + "warn", + "auto", + false, + ], + }, + ], + "description": "Specifies the behavior of invalid export names in \\"import ... from ...\\" and \\"export ... from ...\\".", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-expr-context-critical": Object { + "configs": Array [ + Object { + "description": "Enable warnings for full dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript.exprContextCritical", + "type": "boolean", + }, + ], + "description": "Enable warnings for full dynamic dependencies.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-expr-context-recursive": Object { + "configs": Array [ + Object { + "description": "Enable recursive directory lookup for full dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript.exprContextRecursive", + "type": "boolean", + }, + ], + "description": "Enable recursive directory lookup for full dynamic dependencies.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-expr-context-reg-exp": Object { + "configs": Array [ + Object { + "description": "Sets the default regular expression for full dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript.exprContextRegExp", + "type": "RegExp", + }, + Object { + "description": "Sets the default regular expression for full dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript.exprContextRegExp", + "type": "boolean", + }, + ], + "description": "Sets the default regular expression for full dynamic dependencies.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-expr-context-request": Object { + "configs": Array [ + Object { + "description": "Set the default request for full dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript.exprContextRequest", + "type": "string", + }, + ], + "description": "Set the default request for full dynamic dependencies.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-harmony": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of EcmaScript Modules syntax.", + "multiple": false, + "path": "module.parser.javascript.harmony", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of EcmaScript Modules syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-import": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of import() syntax.", + "multiple": false, + "path": "module.parser.javascript.import", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of import() syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-import-exports-presence": Object { + "configs": Array [ + Object { + "description": "Specifies the behavior of invalid export names in \\"import ... from ...\\".", + "multiple": false, + "path": "module.parser.javascript.importExportsPresence", + "type": "enum", + "values": Array [ + "error", + "warn", + "auto", + false, + ], + }, + ], + "description": "Specifies the behavior of invalid export names in \\"import ... from ...\\".", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-import-meta": Object { + "configs": Array [ + Object { + "description": "Enable/disable evaluating import.meta.", + "multiple": false, + "path": "module.parser.javascript.importMeta", + "type": "boolean", + }, + ], + "description": "Enable/disable evaluating import.meta.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-import-meta-context": Object { + "configs": Array [ + Object { + "description": "Enable/disable evaluating import.meta.webpackContext.", + "multiple": false, + "path": "module.parser.javascript.importMetaContext", + "type": "boolean", + }, + ], + "description": "Enable/disable evaluating import.meta.webpackContext.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-node": Object { + "configs": Array [ + Object { + "description": "Include polyfills or mocks for various node stuff.", + "multiple": false, + "path": "module.parser.javascript.node", + "type": "enum", + "values": Array [ + false, + ], + }, + ], + "description": "Include polyfills or mocks for various node stuff.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-node-dirname": Object { + "configs": Array [ + Object { + "description": "Include a polyfill for the '__dirname' variable.", + "multiple": false, + "path": "module.parser.javascript.node.__dirname", + "type": "enum", + "values": Array [ + false, + true, + "warn-mock", + "mock", + "node-module", + "eval-only", + ], + }, + ], + "description": "Include a polyfill for the '__dirname' variable.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-node-filename": Object { + "configs": Array [ + Object { + "description": "Include a polyfill for the '__filename' variable.", + "multiple": false, + "path": "module.parser.javascript.node.__filename", + "type": "enum", + "values": Array [ + false, + true, + "warn-mock", + "mock", + "node-module", + "eval-only", + ], + }, + ], + "description": "Include a polyfill for the '__filename' variable.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-node-global": Object { + "configs": Array [ + Object { + "description": "Include a polyfill for the 'global' variable.", + "multiple": false, + "path": "module.parser.javascript.node.global", + "type": "enum", + "values": Array [ + false, + true, + "warn", + ], + }, + ], + "description": "Include a polyfill for the 'global' variable.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-override-strict": Object { + "configs": Array [ + Object { + "description": "Override the module to strict or non-strict. This may affect the behavior of the module (some behaviors differ between strict and non-strict), so please configure this option carefully.", + "multiple": false, + "path": "module.parser.javascript.overrideStrict", + "type": "enum", + "values": Array [ + "strict", + "non-strict", + ], + }, + ], + "description": "Override the module to strict or non-strict. This may affect the behavior of the module (some behaviors differ between strict and non-strict), so please configure this option carefully.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-reexport-exports-presence": Object { + "configs": Array [ + Object { + "description": "Specifies the behavior of invalid export names in \\"export ... from ...\\". This might be useful to disable during the migration from \\"export ... from ...\\" to \\"export type ... from ...\\" when reexporting types in TypeScript.", + "multiple": false, + "path": "module.parser.javascript.reexportExportsPresence", + "type": "enum", + "values": Array [ + "error", + "warn", + "auto", + false, + ], + }, + ], + "description": "Specifies the behavior of invalid export names in \\"export ... from ...\\". This might be useful to disable during the migration from \\"export ... from ...\\" to \\"export type ... from ...\\" when reexporting types in TypeScript.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-require-context": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of require.context syntax.", + "multiple": false, + "path": "module.parser.javascript.requireContext", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of require.context syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-require-ensure": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of require.ensure syntax.", + "multiple": false, + "path": "module.parser.javascript.requireEnsure", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of require.ensure syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-require-include": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of require.include syntax.", + "multiple": false, + "path": "module.parser.javascript.requireInclude", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of require.include syntax.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-require-js": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of require.js special syntax like require.config, requirejs.config, require.version and requirejs.onError.", + "multiple": false, + "path": "module.parser.javascript.requireJs", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of require.js special syntax like require.config, requirejs.config, require.version and requirejs.onError.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-strict-export-presence": Object { + "configs": Array [ + Object { + "description": "Deprecated in favor of \\"exportsPresence\\". Emit errors instead of warnings when imported names don't exist in imported module.", + "multiple": false, + "path": "module.parser.javascript.strictExportPresence", + "type": "boolean", + }, + ], + "description": "Deprecated in favor of \\"exportsPresence\\". Emit errors instead of warnings when imported names don't exist in imported module.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-strict-this-context-on-imports": Object { + "configs": Array [ + Object { + "description": "Handle the this context correctly according to the spec for namespace objects.", + "multiple": false, + "path": "module.parser.javascript.strictThisContextOnImports", + "type": "boolean", + }, + ], + "description": "Handle the this context correctly according to the spec for namespace objects.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-system": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of System.js special syntax like System.import, System.get, System.set and System.register.", + "multiple": false, + "path": "module.parser.javascript.system", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of System.js special syntax like System.import, System.get, System.set and System.register.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-unknown-context-critical": Object { + "configs": Array [ + Object { + "description": "Enable warnings when using the require function in a not statically analyse-able way.", + "multiple": false, + "path": "module.parser.javascript.unknownContextCritical", + "type": "boolean", + }, + ], + "description": "Enable warnings when using the require function in a not statically analyse-able way.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-unknown-context-recursive": Object { + "configs": Array [ + Object { + "description": "Enable recursive directory lookup when using the require function in a not statically analyse-able way.", + "multiple": false, + "path": "module.parser.javascript.unknownContextRecursive", + "type": "boolean", + }, + ], + "description": "Enable recursive directory lookup when using the require function in a not statically analyse-able way.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-unknown-context-reg-exp": Object { + "configs": Array [ + Object { + "description": "Sets the regular expression when using the require function in a not statically analyse-able way.", + "multiple": false, + "path": "module.parser.javascript.unknownContextRegExp", + "type": "RegExp", + }, + Object { + "description": "Sets the regular expression when using the require function in a not statically analyse-able way.", + "multiple": false, + "path": "module.parser.javascript.unknownContextRegExp", + "type": "boolean", + }, + ], + "description": "Sets the regular expression when using the require function in a not statically analyse-able way.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-unknown-context-request": Object { + "configs": Array [ + Object { + "description": "Sets the request when using the require function in a not statically analyse-able way.", + "multiple": false, + "path": "module.parser.javascript.unknownContextRequest", + "type": "string", + }, + ], + "description": "Sets the request when using the require function in a not statically analyse-able way.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-url": Object { + "configs": Array [ + Object { + "description": "Enable/disable parsing of new URL() syntax.", + "multiple": false, + "path": "module.parser.javascript.url", + "type": "enum", + "values": Array [ + "relative", + ], + }, + Object { + "description": "Enable/disable parsing of new URL() syntax.", + "multiple": false, + "path": "module.parser.javascript.url", + "type": "boolean", + }, + ], + "description": "Enable/disable parsing of new URL() syntax.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-javascript-worker": Object { + "configs": Array [ + Object { + "description": "Specify a syntax that should be parsed as WebWorker reference. 'Abc' handles 'new Abc()', 'Abc from xyz' handles 'import { Abc } from \\"xyz\\"; new Abc()', 'abc()' handles 'abc()', and combinations are also possible.", + "multiple": true, + "path": "module.parser.javascript.worker[]", + "type": "string", + }, + Object { + "description": "Disable or configure parsing of WebWorker syntax like new Worker() or navigator.serviceWorker.register().", + "multiple": false, + "path": "module.parser.javascript.worker", + "type": "boolean", + }, + ], + "description": "Specify a syntax that should be parsed as WebWorker reference. 'Abc' handles 'new Abc()', 'Abc from xyz' handles 'import { Abc } from \\"xyz\\"; new Abc()', 'abc()' handles 'abc()', and combinations are also possible. Disable or configure parsing of WebWorker syntax like new Worker() or navigator.serviceWorker.register().", + "multiple": true, + "simpleType": "string", + }, + "module-parser-javascript-worker-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'module.parser.javascript.worker' configuration. Disable or configure parsing of WebWorker syntax like new Worker() or navigator.serviceWorker.register().", + "multiple": false, + "path": "module.parser.javascript.worker", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'module.parser.javascript.worker' configuration. Disable or configure parsing of WebWorker syntax like new Worker() or navigator.serviceWorker.register().", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-wrapped-context-critical": Object { + "configs": Array [ + Object { + "description": "Enable warnings for partial dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript.wrappedContextCritical", + "type": "boolean", + }, + ], + "description": "Enable warnings for partial dynamic dependencies.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-wrapped-context-recursive": Object { + "configs": Array [ + Object { + "description": "Enable recursive directory lookup for partial dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript.wrappedContextRecursive", + "type": "boolean", + }, + ], + "description": "Enable recursive directory lookup for partial dynamic dependencies.", + "multiple": false, + "simpleType": "boolean", + }, + "module-parser-javascript-wrapped-context-reg-exp": Object { + "configs": Array [ + Object { + "description": "Set the inner regular expression for partial dynamic dependencies.", + "multiple": false, + "path": "module.parser.javascript.wrappedContextRegExp", + "type": "RegExp", + }, + ], + "description": "Set the inner regular expression for partial dynamic dependencies.", + "multiple": false, + "simpleType": "string", + }, + "module-parser-json-exports-depth": Object { + "configs": Array [ + Object { + "description": "The depth of json dependency flagged as \`exportInfo\`.", + "multiple": false, + "path": "module.parser.json.exportsDepth", + "type": "number", + }, + ], + "description": "The depth of json dependency flagged as \`exportInfo\`.", + "multiple": false, + "simpleType": "number", + }, + "module-rules-compiler": Object { + "configs": Array [ + Object { + "description": "Match the child compiler name.", + "multiple": true, + "path": "module.rules[].compiler", + "type": "RegExp", + }, + Object { + "description": "Match the child compiler name.", + "multiple": true, + "path": "module.rules[].compiler", + "type": "string", + }, + ], + "description": "Match the child compiler name.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-compiler-not": Object { + "configs": Array [ + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].compiler.not", + "type": "RegExp", + }, + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].compiler.not", + "type": "string", + }, + ], + "description": "Logical NOT.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-dependency": Object { + "configs": Array [ + Object { + "description": "Match dependency type.", + "multiple": true, + "path": "module.rules[].dependency", + "type": "RegExp", + }, + Object { + "description": "Match dependency type.", + "multiple": true, + "path": "module.rules[].dependency", + "type": "string", + }, + ], + "description": "Match dependency type.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-dependency-not": Object { + "configs": Array [ + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].dependency.not", + "type": "RegExp", + }, + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].dependency.not", + "type": "string", + }, + ], + "description": "Logical NOT.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-enforce": Object { + "configs": Array [ + Object { + "description": "Enforce this rule as pre or post step.", + "multiple": true, + "path": "module.rules[].enforce", + "type": "enum", + "values": Array [ + "pre", + "post", + ], + }, + ], + "description": "Enforce this rule as pre or post step.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-exclude": Object { + "configs": Array [ + Object { + "description": "Shortcut for resource.exclude.", + "multiple": true, + "path": "module.rules[].exclude", + "type": "RegExp", + }, + Object { + "description": "Shortcut for resource.exclude.", + "multiple": true, + "path": "module.rules[].exclude", + "type": "path", + }, + ], + "description": "Shortcut for resource.exclude.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-exclude-not": Object { + "configs": Array [ + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].exclude.not", + "type": "RegExp", + }, + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].exclude.not", + "type": "path", + }, + ], + "description": "Logical NOT.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-include": Object { + "configs": Array [ + Object { + "description": "Shortcut for resource.include.", + "multiple": true, + "path": "module.rules[].include", + "type": "RegExp", + }, + Object { + "description": "Shortcut for resource.include.", + "multiple": true, + "path": "module.rules[].include", + "type": "path", + }, + ], + "description": "Shortcut for resource.include.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-include-not": Object { + "configs": Array [ + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].include.not", + "type": "RegExp", + }, + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].include.not", + "type": "path", + }, + ], + "description": "Logical NOT.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-issuer": Object { + "configs": Array [ + Object { + "description": "Match the issuer of the module (The module pointing to this module).", + "multiple": true, + "path": "module.rules[].issuer", + "type": "RegExp", + }, + Object { + "description": "Match the issuer of the module (The module pointing to this module).", + "multiple": true, + "path": "module.rules[].issuer", + "type": "path", + }, + ], + "description": "Match the issuer of the module (The module pointing to this module).", + "multiple": true, + "simpleType": "string", + }, + "module-rules-issuer-layer": Object { + "configs": Array [ + Object { + "description": "Match layer of the issuer of this module (The module pointing to this module).", + "multiple": true, + "path": "module.rules[].issuerLayer", + "type": "RegExp", + }, + Object { + "description": "Match layer of the issuer of this module (The module pointing to this module).", + "multiple": true, + "path": "module.rules[].issuerLayer", + "type": "string", + }, + ], + "description": "Match layer of the issuer of this module (The module pointing to this module).", + "multiple": true, + "simpleType": "string", + }, + "module-rules-issuer-layer-not": Object { + "configs": Array [ + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].issuerLayer.not", + "type": "RegExp", + }, + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].issuerLayer.not", + "type": "string", + }, + ], + "description": "Logical NOT.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-issuer-not": Object { + "configs": Array [ + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].issuer.not", + "type": "RegExp", + }, + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].issuer.not", + "type": "path", + }, + ], + "description": "Logical NOT.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-layer": Object { + "configs": Array [ + Object { + "description": "Specifies the layer in which the module should be placed in.", + "multiple": true, + "path": "module.rules[].layer", + "type": "string", + }, + ], + "description": "Specifies the layer in which the module should be placed in.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-loader": Object { + "configs": Array [ + Object { + "description": "A loader request.", + "multiple": true, + "path": "module.rules[].loader", + "type": "string", + }, + ], + "description": "A loader request.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-mimetype": Object { + "configs": Array [ + Object { + "description": "Match module mimetype when load from Data URI.", + "multiple": true, + "path": "module.rules[].mimetype", + "type": "RegExp", + }, + Object { + "description": "Match module mimetype when load from Data URI.", + "multiple": true, + "path": "module.rules[].mimetype", + "type": "string", + }, + ], + "description": "Match module mimetype when load from Data URI.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-mimetype-not": Object { + "configs": Array [ + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].mimetype.not", + "type": "RegExp", + }, + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].mimetype.not", + "type": "string", + }, + ], + "description": "Logical NOT.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-real-resource": Object { + "configs": Array [ + Object { + "description": "Match the real resource path of the module.", + "multiple": true, + "path": "module.rules[].realResource", + "type": "RegExp", + }, + Object { + "description": "Match the real resource path of the module.", + "multiple": true, + "path": "module.rules[].realResource", + "type": "path", + }, + ], + "description": "Match the real resource path of the module.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-real-resource-not": Object { + "configs": Array [ + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].realResource.not", + "type": "RegExp", + }, + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].realResource.not", + "type": "path", + }, + ], + "description": "Logical NOT.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'module.rules' configuration. A list of rules.", + "multiple": false, + "path": "module.rules", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'module.rules' configuration. A list of rules.", + "multiple": false, + "simpleType": "boolean", + }, + "module-rules-resource": Object { + "configs": Array [ + Object { + "description": "Match the resource path of the module.", + "multiple": true, + "path": "module.rules[].resource", + "type": "RegExp", + }, + Object { + "description": "Match the resource path of the module.", + "multiple": true, + "path": "module.rules[].resource", + "type": "path", + }, + ], + "description": "Match the resource path of the module.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-resource-fragment": Object { + "configs": Array [ + Object { + "description": "Match the resource fragment of the module.", + "multiple": true, + "path": "module.rules[].resourceFragment", + "type": "RegExp", + }, + Object { + "description": "Match the resource fragment of the module.", + "multiple": true, + "path": "module.rules[].resourceFragment", + "type": "string", + }, + ], + "description": "Match the resource fragment of the module.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-resource-fragment-not": Object { + "configs": Array [ + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].resourceFragment.not", + "type": "RegExp", + }, + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].resourceFragment.not", + "type": "string", + }, + ], + "description": "Logical NOT.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-resource-not": Object { + "configs": Array [ + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].resource.not", + "type": "RegExp", + }, + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].resource.not", + "type": "path", + }, + ], + "description": "Logical NOT.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-resource-query": Object { + "configs": Array [ + Object { + "description": "Match the resource query of the module.", + "multiple": true, + "path": "module.rules[].resourceQuery", + "type": "RegExp", + }, + Object { + "description": "Match the resource query of the module.", + "multiple": true, + "path": "module.rules[].resourceQuery", + "type": "string", + }, + ], + "description": "Match the resource query of the module.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-resource-query-not": Object { + "configs": Array [ + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].resourceQuery.not", + "type": "RegExp", + }, + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].resourceQuery.not", + "type": "string", + }, + ], + "description": "Logical NOT.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-scheme": Object { + "configs": Array [ + Object { + "description": "Match module scheme.", + "multiple": true, + "path": "module.rules[].scheme", + "type": "RegExp", + }, + Object { + "description": "Match module scheme.", + "multiple": true, + "path": "module.rules[].scheme", + "type": "string", + }, + ], + "description": "Match module scheme.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-scheme-not": Object { + "configs": Array [ + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].scheme.not", + "type": "RegExp", + }, + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].scheme.not", + "type": "string", + }, + ], + "description": "Logical NOT.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-side-effects": Object { + "configs": Array [ + Object { + "description": "Flags a module as with or without side effects.", + "multiple": true, + "path": "module.rules[].sideEffects", + "type": "boolean", + }, + ], + "description": "Flags a module as with or without side effects.", + "multiple": true, + "simpleType": "boolean", + }, + "module-rules-test": Object { + "configs": Array [ + Object { + "description": "Shortcut for resource.test.", + "multiple": true, + "path": "module.rules[].test", + "type": "RegExp", + }, + Object { + "description": "Shortcut for resource.test.", + "multiple": true, + "path": "module.rules[].test", + "type": "path", + }, + ], + "description": "Shortcut for resource.test.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-test-not": Object { + "configs": Array [ + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].test.not", + "type": "RegExp", + }, + Object { + "description": "Logical NOT.", + "multiple": true, + "path": "module.rules[].test.not", + "type": "path", + }, + ], + "description": "Logical NOT.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-type": Object { + "configs": Array [ + Object { + "description": "Module type to use for the module.", + "multiple": true, + "path": "module.rules[].type", + "type": "string", + }, + ], + "description": "Module type to use for the module.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-use": Object { + "configs": Array [ + Object { + "description": "A loader request.", + "multiple": true, + "path": "module.rules[].use", + "type": "string", + }, + ], + "description": "A loader request.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-use-ident": Object { + "configs": Array [ + Object { + "description": "Unique loader options identifier.", + "multiple": true, + "path": "module.rules[].use.ident", + "type": "string", + }, + ], + "description": "Unique loader options identifier.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-use-loader": Object { + "configs": Array [ + Object { + "description": "A loader request.", + "multiple": true, + "path": "module.rules[].use.loader", + "type": "string", + }, + ], + "description": "A loader request.", + "multiple": true, + "simpleType": "string", + }, + "module-rules-use-options": Object { + "configs": Array [ + Object { + "description": "Options passed to a loader.", + "multiple": true, + "path": "module.rules[].use.options", + "type": "string", + }, + ], + "description": "Options passed to a loader.", + "multiple": true, + "simpleType": "string", + }, + "module-strict-export-presence": Object { + "configs": Array [ + Object { + "description": "Emit errors instead of warnings when imported names don't exist in imported module. Deprecated: This option has moved to 'module.parser.javascript.strictExportPresence'.", + "multiple": false, + "path": "module.strictExportPresence", + "type": "boolean", + }, + ], + "description": "Emit errors instead of warnings when imported names don't exist in imported module. Deprecated: This option has moved to 'module.parser.javascript.strictExportPresence'.", + "multiple": false, + "simpleType": "boolean", + }, + "module-strict-this-context-on-imports": Object { + "configs": Array [ + Object { + "description": "Handle the this context correctly according to the spec for namespace objects. Deprecated: This option has moved to 'module.parser.javascript.strictThisContextOnImports'.", + "multiple": false, + "path": "module.strictThisContextOnImports", + "type": "boolean", + }, + ], + "description": "Handle the this context correctly according to the spec for namespace objects. Deprecated: This option has moved to 'module.parser.javascript.strictThisContextOnImports'.", + "multiple": false, + "simpleType": "boolean", + }, + "module-unknown-context-critical": Object { + "configs": Array [ + Object { + "description": "Enable warnings when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextCritical'.", + "multiple": false, + "path": "module.unknownContextCritical", + "type": "boolean", + }, + ], + "description": "Enable warnings when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextCritical'.", + "multiple": false, + "simpleType": "boolean", + }, + "module-unknown-context-recursive": Object { + "configs": Array [ + Object { + "description": "Enable recursive directory lookup when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextRecursive'.", + "multiple": false, + "path": "module.unknownContextRecursive", + "type": "boolean", + }, + ], + "description": "Enable recursive directory lookup when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextRecursive'.", + "multiple": false, + "simpleType": "boolean", + }, + "module-unknown-context-reg-exp": Object { + "configs": Array [ + Object { + "description": "Sets the regular expression when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextRegExp'.", + "multiple": false, + "path": "module.unknownContextRegExp", + "type": "RegExp", + }, + Object { + "description": "Sets the regular expression when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextRegExp'.", + "multiple": false, + "path": "module.unknownContextRegExp", + "type": "boolean", + }, + ], + "description": "Sets the regular expression when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextRegExp'.", + "multiple": false, + "simpleType": "string", + }, + "module-unknown-context-request": Object { + "configs": Array [ + Object { + "description": "Sets the request when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextRequest'.", + "multiple": false, + "path": "module.unknownContextRequest", + "type": "string", + }, + ], + "description": "Sets the request when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextRequest'.", + "multiple": false, + "simpleType": "string", + }, + "module-unsafe-cache": Object { + "configs": Array [ + Object { + "description": "Cache the resolving of module requests.", + "multiple": false, + "path": "module.unsafeCache", + "type": "boolean", + }, + ], + "description": "Cache the resolving of module requests.", + "multiple": false, + "simpleType": "boolean", + }, + "module-wrapped-context-critical": Object { + "configs": Array [ + Object { + "description": "Enable warnings for partial dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.wrappedContextCritical'.", + "multiple": false, + "path": "module.wrappedContextCritical", + "type": "boolean", + }, + ], + "description": "Enable warnings for partial dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.wrappedContextCritical'.", + "multiple": false, + "simpleType": "boolean", + }, + "module-wrapped-context-recursive": Object { + "configs": Array [ + Object { + "description": "Enable recursive directory lookup for partial dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.wrappedContextRecursive'.", + "multiple": false, + "path": "module.wrappedContextRecursive", + "type": "boolean", + }, + ], + "description": "Enable recursive directory lookup for partial dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.wrappedContextRecursive'.", + "multiple": false, + "simpleType": "boolean", + }, + "module-wrapped-context-reg-exp": Object { + "configs": Array [ + Object { + "description": "Set the inner regular expression for partial dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.wrappedContextRegExp'.", + "multiple": false, + "path": "module.wrappedContextRegExp", + "type": "RegExp", + }, + ], + "description": "Set the inner regular expression for partial dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.wrappedContextRegExp'.", + "multiple": false, + "simpleType": "string", + }, + "name": Object { + "configs": Array [ + Object { + "description": "Name of the configuration. Used when loading multiple configurations.", + "multiple": false, + "path": "name", + "type": "string", + }, + ], + "description": "Name of the configuration. Used when loading multiple configurations.", + "multiple": false, + "simpleType": "string", + }, + "node": Object { + "configs": Array [ + Object { + "description": "Include polyfills or mocks for various node stuff.", + "multiple": false, + "path": "node", + "type": "enum", + "values": Array [ + false, + ], + }, + ], + "description": "Include polyfills or mocks for various node stuff.", + "multiple": false, + "simpleType": "boolean", + }, + "node-dirname": Object { + "configs": Array [ + Object { + "description": "Include a polyfill for the '__dirname' variable.", + "multiple": false, + "path": "node.__dirname", + "type": "enum", + "values": Array [ + false, + true, + "warn-mock", + "mock", + "node-module", + "eval-only", + ], + }, + ], + "description": "Include a polyfill for the '__dirname' variable.", + "multiple": false, + "simpleType": "string", + }, + "node-filename": Object { + "configs": Array [ + Object { + "description": "Include a polyfill for the '__filename' variable.", + "multiple": false, + "path": "node.__filename", + "type": "enum", + "values": Array [ + false, + true, + "warn-mock", + "mock", + "node-module", + "eval-only", + ], + }, + ], + "description": "Include a polyfill for the '__filename' variable.", + "multiple": false, + "simpleType": "string", + }, + "node-global": Object { + "configs": Array [ + Object { + "description": "Include a polyfill for the 'global' variable.", + "multiple": false, + "path": "node.global", + "type": "enum", + "values": Array [ + false, + true, + "warn", + ], + }, + ], + "description": "Include a polyfill for the 'global' variable.", + "multiple": false, + "simpleType": "string", + }, + "optimization-avoid-entry-iife": Object { + "configs": Array [ + Object { + "description": "Avoid wrapping the entry module in an IIFE.", + "multiple": false, + "path": "optimization.avoidEntryIife", + "type": "boolean", + }, + ], + "description": "Avoid wrapping the entry module in an IIFE.", + "multiple": false, + "simpleType": "boolean", + }, + "optimization-check-wasm-types": Object { + "configs": Array [ + Object { + "description": "Check for incompatible wasm types when importing/exporting from/to ESM.", + "multiple": false, + "path": "optimization.checkWasmTypes", + "type": "boolean", + }, + ], + "description": "Check for incompatible wasm types when importing/exporting from/to ESM.", + "multiple": false, + "simpleType": "boolean", + }, + "optimization-chunk-ids": Object { + "configs": Array [ + Object { + "description": "Define the algorithm to choose chunk ids (named: readable ids for better debugging, deterministic: numeric hash ids for better long term caching, size: numeric ids focused on minimal initial download size, total-size: numeric ids focused on minimal total download size, false: no algorithm used, as custom one can be provided via plugin).", + "multiple": false, + "path": "optimization.chunkIds", + "type": "enum", + "values": Array [ + "natural", + "named", + "deterministic", + "size", + "total-size", + false, + ], + }, + ], + "description": "Define the algorithm to choose chunk ids (named: readable ids for better debugging, deterministic: numeric hash ids for better long term caching, size: numeric ids focused on minimal initial download size, total-size: numeric ids focused on minimal total download size, false: no algorithm used, as custom one can be provided via plugin).", + "multiple": false, + "simpleType": "string", + }, + "optimization-concatenate-modules": Object { + "configs": Array [ + Object { + "description": "Concatenate modules when possible to generate less modules, more efficient code and enable more optimizations by the minimizer.", + "multiple": false, + "path": "optimization.concatenateModules", + "type": "boolean", + }, + ], + "description": "Concatenate modules when possible to generate less modules, more efficient code and enable more optimizations by the minimizer.", + "multiple": false, + "simpleType": "boolean", + }, + "optimization-emit-on-errors": Object { + "configs": Array [ + Object { + "description": "Emit assets even when errors occur. Critical errors are emitted into the generated code and will cause errors at runtime.", + "multiple": false, + "path": "optimization.emitOnErrors", + "type": "boolean", + }, + ], + "description": "Emit assets even when errors occur. Critical errors are emitted into the generated code and will cause errors at runtime.", + "multiple": false, + "simpleType": "boolean", + }, + "optimization-flag-included-chunks": Object { + "configs": Array [ + Object { + "description": "Also flag chunks as loaded which contain a subset of the modules.", + "multiple": false, + "path": "optimization.flagIncludedChunks", + "type": "boolean", + }, + ], + "description": "Also flag chunks as loaded which contain a subset of the modules.", + "multiple": false, + "simpleType": "boolean", + }, + "optimization-inner-graph": Object { + "configs": Array [ + Object { + "description": "Creates a module-internal dependency graph for top level symbols, exports and imports, to improve unused exports detection.", + "multiple": false, + "path": "optimization.innerGraph", + "type": "boolean", + }, + ], + "description": "Creates a module-internal dependency graph for top level symbols, exports and imports, to improve unused exports detection.", + "multiple": false, + "simpleType": "boolean", + }, + "optimization-mangle-exports": Object { + "configs": Array [ + Object { + "description": "Rename exports when possible to generate shorter code (depends on optimization.usedExports and optimization.providedExports, true/\\"deterministic\\": generate short deterministic names optimized for caching, \\"size\\": generate the shortest possible names).", + "multiple": false, + "path": "optimization.mangleExports", + "type": "enum", + "values": Array [ + "size", + "deterministic", + ], + }, + Object { + "description": "Rename exports when possible to generate shorter code (depends on optimization.usedExports and optimization.providedExports, true/\\"deterministic\\": generate short deterministic names optimized for caching, \\"size\\": generate the shortest possible names).", + "multiple": false, + "path": "optimization.mangleExports", + "type": "boolean", + }, + ], + "description": "Rename exports when possible to generate shorter code (depends on optimization.usedExports and optimization.providedExports, true/\\"deterministic\\": generate short deterministic names optimized for caching, \\"size\\": generate the shortest possible names).", + "multiple": false, + "simpleType": "string", + }, + "optimization-mangle-wasm-imports": Object { + "configs": Array [ + Object { + "description": "Reduce size of WASM by changing imports to shorter strings.", + "multiple": false, + "path": "optimization.mangleWasmImports", + "type": "boolean", + }, + ], + "description": "Reduce size of WASM by changing imports to shorter strings.", + "multiple": false, + "simpleType": "boolean", + }, + "optimization-merge-duplicate-chunks": Object { + "configs": Array [ + Object { + "description": "Merge chunks which contain the same modules.", + "multiple": false, + "path": "optimization.mergeDuplicateChunks", + "type": "boolean", + }, + ], + "description": "Merge chunks which contain the same modules.", + "multiple": false, + "simpleType": "boolean", + }, + "optimization-minimize": Object { + "configs": Array [ + Object { + "description": "Enable minimizing the output. Uses optimization.minimizer.", + "multiple": false, + "path": "optimization.minimize", + "type": "boolean", + }, + ], + "description": "Enable minimizing the output. Uses optimization.minimizer.", + "multiple": false, + "simpleType": "boolean", + }, + "optimization-module-ids": Object { + "configs": Array [ + Object { + "description": "Define the algorithm to choose module ids (natural: numeric ids in order of usage, named: readable ids for better debugging, hashed: (deprecated) short hashes as ids for better long term caching, deterministic: numeric hash ids for better long term caching, size: numeric ids focused on minimal initial download size, false: no algorithm used, as custom one can be provided via plugin).", + "multiple": false, + "path": "optimization.moduleIds", + "type": "enum", + "values": Array [ + "natural", + "named", + "hashed", + "deterministic", + "size", + false, + ], + }, + ], + "description": "Define the algorithm to choose module ids (natural: numeric ids in order of usage, named: readable ids for better debugging, hashed: (deprecated) short hashes as ids for better long term caching, deterministic: numeric hash ids for better long term caching, size: numeric ids focused on minimal initial download size, false: no algorithm used, as custom one can be provided via plugin).", + "multiple": false, + "simpleType": "string", + }, + "optimization-node-env": Object { + "configs": Array [ + Object { + "description": "Set process.env.NODE_ENV to a specific value.", + "multiple": false, + "path": "optimization.nodeEnv", + "type": "enum", + "values": Array [ + false, + ], + }, + Object { + "description": "Set process.env.NODE_ENV to a specific value.", + "multiple": false, + "path": "optimization.nodeEnv", + "type": "string", + }, + ], + "description": "Set process.env.NODE_ENV to a specific value.", + "multiple": false, + "simpleType": "string", + }, + "optimization-portable-records": Object { + "configs": Array [ + Object { + "description": "Generate records with relative paths to be able to move the context folder.", + "multiple": false, + "path": "optimization.portableRecords", + "type": "boolean", + }, + ], + "description": "Generate records with relative paths to be able to move the context folder.", + "multiple": false, + "simpleType": "boolean", + }, + "optimization-provided-exports": Object { + "configs": Array [ + Object { + "description": "Figure out which exports are provided by modules to generate more efficient code.", + "multiple": false, + "path": "optimization.providedExports", + "type": "boolean", + }, + ], + "description": "Figure out which exports are provided by modules to generate more efficient code.", + "multiple": false, + "simpleType": "boolean", + }, + "optimization-real-content-hash": Object { + "configs": Array [ + Object { + "description": "Use real [contenthash] based on final content of the assets.", + "multiple": false, + "path": "optimization.realContentHash", + "type": "boolean", + }, + ], + "description": "Use real [contenthash] based on final content of the assets.", + "multiple": false, + "simpleType": "boolean", + }, + "optimization-remove-available-modules": Object { + "configs": Array [ + Object { + "description": "Removes modules from chunks when these modules are already included in all parents.", + "multiple": false, + "path": "optimization.removeAvailableModules", + "type": "boolean", + }, + ], + "description": "Removes modules from chunks when these modules are already included in all parents.", + "multiple": false, + "simpleType": "boolean", + }, + "optimization-remove-empty-chunks": Object { + "configs": Array [ + Object { + "description": "Remove chunks which are empty.", + "multiple": false, + "path": "optimization.removeEmptyChunks", + "type": "boolean", + }, + ], + "description": "Remove chunks which are empty.", + "multiple": false, + "simpleType": "boolean", + }, + "optimization-runtime-chunk": Object { + "configs": Array [ + Object { + "description": "Create an additional chunk which contains only the webpack runtime and chunk hash maps.", + "multiple": false, + "path": "optimization.runtimeChunk", + "type": "enum", + "values": Array [ + "single", + "multiple", + ], + }, + Object { + "description": "Create an additional chunk which contains only the webpack runtime and chunk hash maps.", + "multiple": false, + "path": "optimization.runtimeChunk", + "type": "boolean", + }, + ], + "description": "Create an additional chunk which contains only the webpack runtime and chunk hash maps.", + "multiple": false, + "simpleType": "string", + }, + "optimization-runtime-chunk-name": Object { + "configs": Array [ + Object { + "description": "The name or name factory for the runtime chunks.", + "multiple": false, + "path": "optimization.runtimeChunk.name", + "type": "string", + }, + ], + "description": "The name or name factory for the runtime chunks.", + "multiple": false, + "simpleType": "string", + }, + "optimization-side-effects": Object { + "configs": Array [ + Object { + "description": "Skip over modules which contain no side effects when exports are not used (false: disabled, 'flag': only use manually placed side effects flag, true: also analyse source code for side effects).", + "multiple": false, + "path": "optimization.sideEffects", + "type": "enum", + "values": Array [ + "flag", + ], + }, + Object { + "description": "Skip over modules which contain no side effects when exports are not used (false: disabled, 'flag': only use manually placed side effects flag, true: also analyse source code for side effects).", + "multiple": false, + "path": "optimization.sideEffects", + "type": "boolean", + }, + ], + "description": "Skip over modules which contain no side effects when exports are not used (false: disabled, 'flag': only use manually placed side effects flag, true: also analyse source code for side effects).", + "multiple": false, + "simpleType": "string", + }, + "optimization-split-chunks": Object { + "configs": Array [ + Object { + "description": "Optimize duplication and caching by splitting chunks by shared modules and cache group.", + "multiple": false, + "path": "optimization.splitChunks", + "type": "enum", + "values": Array [ + false, + ], + }, + ], + "description": "Optimize duplication and caching by splitting chunks by shared modules and cache group.", + "multiple": false, + "simpleType": "boolean", + }, + "optimization-split-chunks-automatic-name-delimiter": Object { + "configs": Array [ + Object { + "description": "Sets the name delimiter for created chunks.", + "multiple": false, + "path": "optimization.splitChunks.automaticNameDelimiter", + "type": "string", + }, + ], + "description": "Sets the name delimiter for created chunks.", + "multiple": false, + "simpleType": "string", + }, + "optimization-split-chunks-chunks": Object { + "configs": Array [ + Object { + "description": "Select chunks for determining shared modules (defaults to \\"async\\", \\"initial\\" and \\"all\\" requires adding these chunks to the HTML).", + "multiple": false, + "path": "optimization.splitChunks.chunks", + "type": "enum", + "values": Array [ + "initial", + "async", + "all", + ], + }, + Object { + "description": "Select chunks for determining shared modules (defaults to \\"async\\", \\"initial\\" and \\"all\\" requires adding these chunks to the HTML).", + "multiple": false, + "path": "optimization.splitChunks.chunks", + "type": "RegExp", + }, + ], + "description": "Select chunks for determining shared modules (defaults to \\"async\\", \\"initial\\" and \\"all\\" requires adding these chunks to the HTML).", + "multiple": false, + "simpleType": "string", + }, + "optimization-split-chunks-default-size-types": Object { + "configs": Array [ + Object { + "description": "Size type, like 'javascript', 'webassembly'.", + "multiple": true, + "path": "optimization.splitChunks.defaultSizeTypes[]", + "type": "string", + }, + ], + "description": "Size type, like 'javascript', 'webassembly'.", + "multiple": true, + "simpleType": "string", + }, + "optimization-split-chunks-default-size-types-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'optimization.splitChunks.defaultSizeTypes' configuration. Sets the size types which are used when a number is used for sizes.", + "multiple": false, + "path": "optimization.splitChunks.defaultSizeTypes", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'optimization.splitChunks.defaultSizeTypes' configuration. Sets the size types which are used when a number is used for sizes.", + "multiple": false, + "simpleType": "boolean", + }, + "optimization-split-chunks-enforce-size-threshold": Object { + "configs": Array [ + Object { + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "path": "optimization.splitChunks.enforceSizeThreshold", + "type": "number", + }, + ], + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "simpleType": "number", + }, + "optimization-split-chunks-fallback-cache-group-automatic-name-delimiter": Object { + "configs": Array [ + Object { + "description": "Sets the name delimiter for created chunks.", + "multiple": false, + "path": "optimization.splitChunks.fallbackCacheGroup.automaticNameDelimiter", + "type": "string", + }, + ], + "description": "Sets the name delimiter for created chunks.", + "multiple": false, + "simpleType": "string", + }, + "optimization-split-chunks-fallback-cache-group-chunks": Object { + "configs": Array [ + Object { + "description": "Select chunks for determining shared modules (defaults to \\"async\\", \\"initial\\" and \\"all\\" requires adding these chunks to the HTML).", + "multiple": false, + "path": "optimization.splitChunks.fallbackCacheGroup.chunks", + "type": "enum", + "values": Array [ + "initial", + "async", + "all", + ], + }, + Object { + "description": "Select chunks for determining shared modules (defaults to \\"async\\", \\"initial\\" and \\"all\\" requires adding these chunks to the HTML).", + "multiple": false, + "path": "optimization.splitChunks.fallbackCacheGroup.chunks", + "type": "RegExp", + }, + ], + "description": "Select chunks for determining shared modules (defaults to \\"async\\", \\"initial\\" and \\"all\\" requires adding these chunks to the HTML).", + "multiple": false, + "simpleType": "string", + }, + "optimization-split-chunks-fallback-cache-group-max-async-size": Object { + "configs": Array [ + Object { + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "path": "optimization.splitChunks.fallbackCacheGroup.maxAsyncSize", + "type": "number", + }, + ], + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "simpleType": "number", + }, + "optimization-split-chunks-fallback-cache-group-max-initial-size": Object { + "configs": Array [ + Object { + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "path": "optimization.splitChunks.fallbackCacheGroup.maxInitialSize", + "type": "number", + }, + ], + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "simpleType": "number", + }, + "optimization-split-chunks-fallback-cache-group-max-size": Object { + "configs": Array [ + Object { + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "path": "optimization.splitChunks.fallbackCacheGroup.maxSize", + "type": "number", + }, + ], + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "simpleType": "number", + }, + "optimization-split-chunks-fallback-cache-group-min-size": Object { + "configs": Array [ + Object { + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "path": "optimization.splitChunks.fallbackCacheGroup.minSize", + "type": "number", + }, + ], + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "simpleType": "number", + }, + "optimization-split-chunks-fallback-cache-group-min-size-reduction": Object { + "configs": Array [ + Object { + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "path": "optimization.splitChunks.fallbackCacheGroup.minSizeReduction", + "type": "number", + }, + ], + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "simpleType": "number", + }, + "optimization-split-chunks-filename": Object { + "configs": Array [ + Object { + "description": "Sets the template for the filename for created chunks.", + "multiple": false, + "path": "optimization.splitChunks.filename", + "type": "string", + }, + ], + "description": "Sets the template for the filename for created chunks.", + "multiple": false, + "simpleType": "string", + }, + "optimization-split-chunks-hide-path-info": Object { + "configs": Array [ + Object { + "description": "Prevents exposing path info when creating names for parts splitted by maxSize.", + "multiple": false, + "path": "optimization.splitChunks.hidePathInfo", + "type": "boolean", + }, + ], + "description": "Prevents exposing path info when creating names for parts splitted by maxSize.", + "multiple": false, + "simpleType": "boolean", + }, + "optimization-split-chunks-max-async-requests": Object { + "configs": Array [ + Object { + "description": "Maximum number of requests which are accepted for on-demand loading.", + "multiple": false, + "path": "optimization.splitChunks.maxAsyncRequests", + "type": "number", + }, + ], + "description": "Maximum number of requests which are accepted for on-demand loading.", + "multiple": false, + "simpleType": "number", + }, + "optimization-split-chunks-max-async-size": Object { + "configs": Array [ + Object { + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "path": "optimization.splitChunks.maxAsyncSize", + "type": "number", + }, + ], + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "simpleType": "number", + }, + "optimization-split-chunks-max-initial-requests": Object { + "configs": Array [ + Object { + "description": "Maximum number of initial chunks which are accepted for an entry point.", + "multiple": false, + "path": "optimization.splitChunks.maxInitialRequests", + "type": "number", + }, + ], + "description": "Maximum number of initial chunks which are accepted for an entry point.", + "multiple": false, + "simpleType": "number", + }, + "optimization-split-chunks-max-initial-size": Object { + "configs": Array [ + Object { + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "path": "optimization.splitChunks.maxInitialSize", + "type": "number", + }, + ], + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "simpleType": "number", + }, + "optimization-split-chunks-max-size": Object { + "configs": Array [ + Object { + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "path": "optimization.splitChunks.maxSize", + "type": "number", + }, + ], + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "simpleType": "number", + }, + "optimization-split-chunks-min-chunks": Object { + "configs": Array [ + Object { + "description": "Minimum number of times a module has to be duplicated until it's considered for splitting.", + "multiple": false, + "path": "optimization.splitChunks.minChunks", + "type": "number", + }, + ], + "description": "Minimum number of times a module has to be duplicated until it's considered for splitting.", + "multiple": false, + "simpleType": "number", + }, + "optimization-split-chunks-min-remaining-size": Object { + "configs": Array [ + Object { + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "path": "optimization.splitChunks.minRemainingSize", + "type": "number", + }, + ], + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "simpleType": "number", + }, + "optimization-split-chunks-min-size": Object { + "configs": Array [ + Object { + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "path": "optimization.splitChunks.minSize", + "type": "number", + }, + ], + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "simpleType": "number", + }, + "optimization-split-chunks-min-size-reduction": Object { + "configs": Array [ + Object { + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "path": "optimization.splitChunks.minSizeReduction", + "type": "number", + }, + ], + "description": "Size of the javascript part of the chunk.", + "multiple": false, + "simpleType": "number", + }, + "optimization-split-chunks-name": Object { + "configs": Array [ + Object { + "description": "Give chunks created a name (chunks with equal name are merged).", + "multiple": false, + "path": "optimization.splitChunks.name", + "type": "enum", + "values": Array [ + false, + ], + }, + Object { + "description": "Give chunks created a name (chunks with equal name are merged).", + "multiple": false, + "path": "optimization.splitChunks.name", + "type": "string", + }, + ], + "description": "Give chunks created a name (chunks with equal name are merged).", + "multiple": false, + "simpleType": "string", + }, + "optimization-split-chunks-used-exports": Object { + "configs": Array [ + Object { + "description": "Compare used exports when checking common modules. Modules will only be put in the same chunk when exports are equal.", + "multiple": false, + "path": "optimization.splitChunks.usedExports", + "type": "boolean", + }, + ], + "description": "Compare used exports when checking common modules. Modules will only be put in the same chunk when exports are equal.", + "multiple": false, + "simpleType": "boolean", + }, + "optimization-used-exports": Object { + "configs": Array [ + Object { + "description": "Figure out which exports are used by modules to mangle export names, omit unused exports and generate more efficient code (true: analyse used exports for each runtime, \\"global\\": analyse exports globally for all runtimes combined).", + "multiple": false, + "path": "optimization.usedExports", + "type": "enum", + "values": Array [ + "global", + ], + }, + Object { + "description": "Figure out which exports are used by modules to mangle export names, omit unused exports and generate more efficient code (true: analyse used exports for each runtime, \\"global\\": analyse exports globally for all runtimes combined).", + "multiple": false, + "path": "optimization.usedExports", + "type": "boolean", + }, + ], + "description": "Figure out which exports are used by modules to mangle export names, omit unused exports and generate more efficient code (true: analyse used exports for each runtime, \\"global\\": analyse exports globally for all runtimes combined).", + "multiple": false, + "simpleType": "string", + }, + "output-asset-module-filename": Object { + "configs": Array [ + Object { + "description": "The filename of asset modules as relative path inside the 'output.path' directory.", + "multiple": false, + "path": "output.assetModuleFilename", + "type": "string", + }, + ], + "description": "The filename of asset modules as relative path inside the 'output.path' directory.", + "multiple": false, + "simpleType": "string", + }, + "output-async-chunks": Object { + "configs": Array [ + Object { + "description": "Enable/disable creating async chunks that are loaded on demand.", + "multiple": false, + "path": "output.asyncChunks", + "type": "boolean", + }, + ], + "description": "Enable/disable creating async chunks that are loaded on demand.", + "multiple": false, + "simpleType": "boolean", + }, + "output-charset": Object { + "configs": Array [ + Object { + "description": "Add charset attribute for script tag.", + "multiple": false, + "path": "output.charset", + "type": "boolean", + }, + ], + "description": "Add charset attribute for script tag.", + "multiple": false, + "simpleType": "boolean", + }, + "output-chunk-filename": Object { + "configs": Array [ + Object { + "description": "Specifies the filename template of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.", + "multiple": false, + "path": "output.chunkFilename", + "type": "string", + }, + ], + "description": "Specifies the filename template of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.", + "multiple": false, + "simpleType": "string", + }, + "output-chunk-format": Object { + "configs": Array [ + Object { + "description": "The format of chunks (formats included by default are 'array-push' (web/WebWorker), 'commonjs' (node.js), 'module' (ESM), but others might be added by plugins).", + "multiple": false, + "path": "output.chunkFormat", + "type": "enum", + "values": Array [ + "array-push", + "commonjs", + "module", + false, + ], + }, + Object { + "description": "The format of chunks (formats included by default are 'array-push' (web/WebWorker), 'commonjs' (node.js), 'module' (ESM), but others might be added by plugins).", + "multiple": false, + "path": "output.chunkFormat", + "type": "string", + }, + ], + "description": "The format of chunks (formats included by default are 'array-push' (web/WebWorker), 'commonjs' (node.js), 'module' (ESM), but others might be added by plugins).", + "multiple": false, + "simpleType": "string", + }, + "output-chunk-load-timeout": Object { + "configs": Array [ + Object { + "description": "Number of milliseconds before chunk request expires.", + "multiple": false, + "path": "output.chunkLoadTimeout", + "type": "number", + }, + ], + "description": "Number of milliseconds before chunk request expires.", + "multiple": false, + "simpleType": "number", + }, + "output-chunk-loading": Object { + "configs": Array [ + Object { + "description": "The method of loading chunks (methods included by default are 'jsonp' (web), 'import' (ESM), 'importScripts' (WebWorker), 'require' (sync node.js), 'async-node' (async node.js), but others might be added by plugins).", + "multiple": false, + "path": "output.chunkLoading", + "type": "enum", + "values": Array [ + false, + ], + }, + Object { + "description": "The method of loading chunks (methods included by default are 'jsonp' (web), 'import' (ESM), 'importScripts' (WebWorker), 'require' (sync node.js), 'async-node' (async node.js), but others might be added by plugins).", + "multiple": false, + "path": "output.chunkLoading", + "type": "enum", + "values": Array [ + "jsonp", + "import-scripts", + "require", + "async-node", + "import", + ], + }, + Object { + "description": "The method of loading chunks (methods included by default are 'jsonp' (web), 'import' (ESM), 'importScripts' (WebWorker), 'require' (sync node.js), 'async-node' (async node.js), but others might be added by plugins).", + "multiple": false, + "path": "output.chunkLoading", + "type": "string", + }, + ], + "description": "The method of loading chunks (methods included by default are 'jsonp' (web), 'import' (ESM), 'importScripts' (WebWorker), 'require' (sync node.js), 'async-node' (async node.js), but others might be added by plugins).", + "multiple": false, + "simpleType": "string", + }, + "output-chunk-loading-global": Object { + "configs": Array [ + Object { + "description": "The global variable used by webpack for loading of chunks.", + "multiple": false, + "path": "output.chunkLoadingGlobal", + "type": "string", + }, + ], + "description": "The global variable used by webpack for loading of chunks.", + "multiple": false, + "simpleType": "string", + }, + "output-clean": Object { + "configs": Array [ + Object { + "description": "Clean the output directory before emit.", + "multiple": false, + "path": "output.clean", + "type": "boolean", + }, + ], + "description": "Clean the output directory before emit.", + "multiple": false, + "simpleType": "boolean", + }, + "output-clean-dry": Object { + "configs": Array [ + Object { + "description": "Log the assets that should be removed instead of deleting them.", + "multiple": false, + "path": "output.clean.dry", + "type": "boolean", + }, + ], + "description": "Log the assets that should be removed instead of deleting them.", + "multiple": false, + "simpleType": "boolean", + }, + "output-clean-keep": Object { + "configs": Array [ + Object { + "description": "Keep these assets.", + "multiple": false, + "path": "output.clean.keep", + "type": "RegExp", + }, + Object { + "description": "Keep these assets.", + "multiple": false, + "path": "output.clean.keep", + "type": "string", + }, + ], + "description": "Keep these assets.", + "multiple": false, + "simpleType": "string", + }, + "output-compare-before-emit": Object { + "configs": Array [ + Object { + "description": "Check if to be emitted file already exists and have the same content before writing to output filesystem.", + "multiple": false, + "path": "output.compareBeforeEmit", + "type": "boolean", + }, + ], + "description": "Check if to be emitted file already exists and have the same content before writing to output filesystem.", + "multiple": false, + "simpleType": "boolean", + }, + "output-cross-origin-loading": Object { + "configs": Array [ + Object { + "description": "This option enables cross-origin loading of chunks.", + "multiple": false, + "path": "output.crossOriginLoading", + "type": "enum", + "values": Array [ + false, + "anonymous", + "use-credentials", + ], + }, + ], + "description": "This option enables cross-origin loading of chunks.", + "multiple": false, + "simpleType": "string", + }, + "output-css-chunk-filename": Object { + "configs": Array [ + Object { + "description": "Specifies the filename template of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.", + "multiple": false, + "path": "output.cssChunkFilename", + "type": "string", + }, + ], + "description": "Specifies the filename template of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.", + "multiple": false, + "simpleType": "string", + }, + "output-css-filename": Object { + "configs": Array [ + Object { + "description": "Specifies the filename template of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.", + "multiple": false, + "path": "output.cssFilename", + "type": "string", + }, + ], + "description": "Specifies the filename template of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.", + "multiple": false, + "simpleType": "string", + }, + "output-devtool-fallback-module-filename-template": Object { + "configs": Array [ + Object { + "description": "Similar to \`output.devtoolModuleFilenameTemplate\`, but used in the case of duplicate module identifiers.", + "multiple": false, + "path": "output.devtoolFallbackModuleFilenameTemplate", + "type": "string", + }, + ], + "description": "Similar to \`output.devtoolModuleFilenameTemplate\`, but used in the case of duplicate module identifiers.", + "multiple": false, + "simpleType": "string", + }, + "output-devtool-module-filename-template": Object { + "configs": Array [ + Object { + "description": "Filename template string of function for the sources array in a generated SourceMap.", + "multiple": false, + "path": "output.devtoolModuleFilenameTemplate", + "type": "string", + }, + ], + "description": "Filename template string of function for the sources array in a generated SourceMap.", + "multiple": false, + "simpleType": "string", + }, + "output-devtool-namespace": Object { + "configs": Array [ + Object { + "description": "Module namespace to use when interpolating filename template string for the sources array in a generated SourceMap. Defaults to \`output.library\` if not set. It's useful for avoiding runtime collisions in sourcemaps from multiple webpack projects built as libraries.", + "multiple": false, + "path": "output.devtoolNamespace", + "type": "string", + }, + ], + "description": "Module namespace to use when interpolating filename template string for the sources array in a generated SourceMap. Defaults to \`output.library\` if not set. It's useful for avoiding runtime collisions in sourcemaps from multiple webpack projects built as libraries.", + "multiple": false, + "simpleType": "string", + }, + "output-enabled-chunk-loading-types": Object { + "configs": Array [ + Object { + "description": "The method of loading chunks (methods included by default are 'jsonp' (web), 'import' (ESM), 'importScripts' (WebWorker), 'require' (sync node.js), 'async-node' (async node.js), but others might be added by plugins).", + "multiple": true, + "path": "output.enabledChunkLoadingTypes[]", + "type": "enum", + "values": Array [ + "jsonp", + "import-scripts", + "require", + "async-node", + "import", + ], + }, + Object { + "description": "The method of loading chunks (methods included by default are 'jsonp' (web), 'import' (ESM), 'importScripts' (WebWorker), 'require' (sync node.js), 'async-node' (async node.js), but others might be added by plugins).", + "multiple": true, + "path": "output.enabledChunkLoadingTypes[]", + "type": "string", + }, + ], + "description": "The method of loading chunks (methods included by default are 'jsonp' (web), 'import' (ESM), 'importScripts' (WebWorker), 'require' (sync node.js), 'async-node' (async node.js), but others might be added by plugins).", + "multiple": true, + "simpleType": "string", + }, + "output-enabled-chunk-loading-types-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'output.enabledChunkLoadingTypes' configuration. List of chunk loading types enabled for use by entry points.", + "multiple": false, + "path": "output.enabledChunkLoadingTypes", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'output.enabledChunkLoadingTypes' configuration. List of chunk loading types enabled for use by entry points.", + "multiple": false, + "simpleType": "boolean", + }, + "output-enabled-library-types": Object { + "configs": Array [ + Object { + "description": "Type of library (types included by default are 'var', 'module', 'assign', 'assign-properties', 'this', 'window', 'self', 'global', 'commonjs', 'commonjs2', 'commonjs-module', 'commonjs-static', 'amd', 'amd-require', 'umd', 'umd2', 'jsonp', 'system', but others might be added by plugins).", + "multiple": true, + "path": "output.enabledLibraryTypes[]", + "type": "enum", + "values": Array [ + "var", + "module", + "assign", + "assign-properties", + "this", + "window", + "self", + "global", + "commonjs", + "commonjs2", + "commonjs-module", + "commonjs-static", + "amd", + "amd-require", + "umd", + "umd2", + "jsonp", + "system", + ], + }, + Object { + "description": "Type of library (types included by default are 'var', 'module', 'assign', 'assign-properties', 'this', 'window', 'self', 'global', 'commonjs', 'commonjs2', 'commonjs-module', 'commonjs-static', 'amd', 'amd-require', 'umd', 'umd2', 'jsonp', 'system', but others might be added by plugins).", + "multiple": true, + "path": "output.enabledLibraryTypes[]", + "type": "string", + }, + ], + "description": "Type of library (types included by default are 'var', 'module', 'assign', 'assign-properties', 'this', 'window', 'self', 'global', 'commonjs', 'commonjs2', 'commonjs-module', 'commonjs-static', 'amd', 'amd-require', 'umd', 'umd2', 'jsonp', 'system', but others might be added by plugins).", + "multiple": true, + "simpleType": "string", + }, + "output-enabled-library-types-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'output.enabledLibraryTypes' configuration. List of library types enabled for use by entry points.", + "multiple": false, + "path": "output.enabledLibraryTypes", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'output.enabledLibraryTypes' configuration. List of library types enabled for use by entry points.", + "multiple": false, + "simpleType": "boolean", + }, + "output-enabled-wasm-loading-types": Object { + "configs": Array [ + Object { + "description": "The method of loading WebAssembly Modules (methods included by default are 'fetch' (web/WebWorker), 'async-node' (node.js), but others might be added by plugins).", + "multiple": true, + "path": "output.enabledWasmLoadingTypes[]", + "type": "enum", + "values": Array [ + "fetch", + "async-node", + ], + }, + Object { + "description": "The method of loading WebAssembly Modules (methods included by default are 'fetch' (web/WebWorker), 'async-node' (node.js), but others might be added by plugins).", + "multiple": true, + "path": "output.enabledWasmLoadingTypes[]", + "type": "string", + }, + ], + "description": "The method of loading WebAssembly Modules (methods included by default are 'fetch' (web/WebWorker), 'async-node' (node.js), but others might be added by plugins).", + "multiple": true, + "simpleType": "string", + }, + "output-enabled-wasm-loading-types-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'output.enabledWasmLoadingTypes' configuration. List of wasm loading types enabled for use by entry points.", + "multiple": false, + "path": "output.enabledWasmLoadingTypes", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'output.enabledWasmLoadingTypes' configuration. List of wasm loading types enabled for use by entry points.", + "multiple": false, + "simpleType": "boolean", + }, + "output-environment-arrow-function": Object { + "configs": Array [ + Object { + "description": "The environment supports arrow functions ('() => { ... }').", + "multiple": false, + "path": "output.environment.arrowFunction", + "type": "boolean", + }, + ], + "description": "The environment supports arrow functions ('() => { ... }').", + "multiple": false, + "simpleType": "boolean", + }, + "output-environment-async-function": Object { + "configs": Array [ + Object { + "description": "The environment supports async function and await ('async function () { await ... }').", + "multiple": false, + "path": "output.environment.asyncFunction", + "type": "boolean", + }, + ], + "description": "The environment supports async function and await ('async function () { await ... }').", + "multiple": false, + "simpleType": "boolean", + }, + "output-environment-big-int-literal": Object { + "configs": Array [ + Object { + "description": "The environment supports BigInt as literal (123n).", + "multiple": false, + "path": "output.environment.bigIntLiteral", + "type": "boolean", + }, + ], + "description": "The environment supports BigInt as literal (123n).", + "multiple": false, + "simpleType": "boolean", + }, + "output-environment-const": Object { + "configs": Array [ + Object { + "description": "The environment supports const and let for variable declarations.", + "multiple": false, + "path": "output.environment.const", + "type": "boolean", + }, + ], + "description": "The environment supports const and let for variable declarations.", + "multiple": false, + "simpleType": "boolean", + }, + "output-environment-destructuring": Object { + "configs": Array [ + Object { + "description": "The environment supports destructuring ('{ a, b } = obj').", + "multiple": false, + "path": "output.environment.destructuring", + "type": "boolean", + }, + ], + "description": "The environment supports destructuring ('{ a, b } = obj').", + "multiple": false, + "simpleType": "boolean", + }, + "output-environment-document": Object { + "configs": Array [ + Object { + "description": "The environment supports 'document'.", + "multiple": false, + "path": "output.environment.document", + "type": "boolean", + }, + ], + "description": "The environment supports 'document'.", + "multiple": false, + "simpleType": "boolean", + }, + "output-environment-dynamic-import": Object { + "configs": Array [ + Object { + "description": "The environment supports an async import() function to import EcmaScript modules.", + "multiple": false, + "path": "output.environment.dynamicImport", + "type": "boolean", + }, + ], + "description": "The environment supports an async import() function to import EcmaScript modules.", + "multiple": false, + "simpleType": "boolean", + }, + "output-environment-dynamic-import-in-worker": Object { + "configs": Array [ + Object { + "description": "The environment supports an async import() is available when creating a worker.", + "multiple": false, + "path": "output.environment.dynamicImportInWorker", + "type": "boolean", + }, + ], + "description": "The environment supports an async import() is available when creating a worker.", + "multiple": false, + "simpleType": "boolean", + }, + "output-environment-for-of": Object { + "configs": Array [ + Object { + "description": "The environment supports 'for of' iteration ('for (const x of array) { ... }').", + "multiple": false, + "path": "output.environment.forOf", + "type": "boolean", + }, + ], + "description": "The environment supports 'for of' iteration ('for (const x of array) { ... }').", + "multiple": false, + "simpleType": "boolean", + }, + "output-environment-global-this": Object { + "configs": Array [ + Object { + "description": "The environment supports 'globalThis'.", + "multiple": false, + "path": "output.environment.globalThis", + "type": "boolean", + }, + ], + "description": "The environment supports 'globalThis'.", + "multiple": false, + "simpleType": "boolean", + }, + "output-environment-module": Object { + "configs": Array [ + Object { + "description": "The environment supports EcmaScript Module syntax to import EcmaScript modules (import ... from '...').", + "multiple": false, + "path": "output.environment.module", + "type": "boolean", + }, + ], + "description": "The environment supports EcmaScript Module syntax to import EcmaScript modules (import ... from '...').", + "multiple": false, + "simpleType": "boolean", + }, + "output-environment-node-prefix-for-core-modules": Object { + "configs": Array [ + Object { + "description": "The environment supports \`node:\` prefix for Node.js core modules.", + "multiple": false, + "path": "output.environment.nodePrefixForCoreModules", + "type": "boolean", + }, + ], + "description": "The environment supports \`node:\` prefix for Node.js core modules.", + "multiple": false, + "simpleType": "boolean", + }, + "output-environment-optional-chaining": Object { + "configs": Array [ + Object { + "description": "The environment supports optional chaining ('obj?.a' or 'obj?.()').", + "multiple": false, + "path": "output.environment.optionalChaining", + "type": "boolean", + }, + ], + "description": "The environment supports optional chaining ('obj?.a' or 'obj?.()').", + "multiple": false, + "simpleType": "boolean", + }, + "output-environment-template-literal": Object { + "configs": Array [ + Object { + "description": "The environment supports template literals.", + "multiple": false, + "path": "output.environment.templateLiteral", + "type": "boolean", + }, + ], + "description": "The environment supports template literals.", + "multiple": false, + "simpleType": "boolean", + }, + "output-filename": Object { + "configs": Array [ + Object { + "description": "Specifies the filename template of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.", + "multiple": false, + "path": "output.filename", + "type": "string", + }, + ], + "description": "Specifies the filename template of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.", + "multiple": false, + "simpleType": "string", + }, + "output-global-object": Object { + "configs": Array [ + Object { + "description": "An expression which is used to address the global object/scope in runtime code.", + "multiple": false, + "path": "output.globalObject", + "type": "string", + }, + ], + "description": "An expression which is used to address the global object/scope in runtime code.", + "multiple": false, + "simpleType": "string", + }, + "output-hash-digest": Object { + "configs": Array [ + Object { + "description": "Digest type used for the hash.", + "multiple": false, + "path": "output.hashDigest", + "type": "string", + }, + ], + "description": "Digest type used for the hash.", + "multiple": false, + "simpleType": "string", + }, + "output-hash-digest-length": Object { + "configs": Array [ + Object { + "description": "Number of chars which are used for the hash.", + "multiple": false, + "path": "output.hashDigestLength", + "type": "number", + }, + ], + "description": "Number of chars which are used for the hash.", + "multiple": false, + "simpleType": "number", + }, + "output-hash-function": Object { + "configs": Array [ + Object { + "description": "Algorithm used for generation the hash (see node.js crypto package).", + "multiple": false, + "path": "output.hashFunction", + "type": "string", + }, + ], + "description": "Algorithm used for generation the hash (see node.js crypto package).", + "multiple": false, + "simpleType": "string", + }, + "output-hash-salt": Object { + "configs": Array [ + Object { + "description": "Any string which is added to the hash to salt it.", + "multiple": false, + "path": "output.hashSalt", + "type": "string", + }, + ], + "description": "Any string which is added to the hash to salt it.", + "multiple": false, + "simpleType": "string", + }, + "output-hot-update-chunk-filename": Object { + "configs": Array [ + Object { + "description": "The filename of the Hot Update Chunks. They are inside the output.path directory.", + "multiple": false, + "path": "output.hotUpdateChunkFilename", + "type": "string", + }, + ], + "description": "The filename of the Hot Update Chunks. They are inside the output.path directory.", + "multiple": false, + "simpleType": "string", + }, + "output-hot-update-global": Object { + "configs": Array [ + Object { + "description": "The global variable used by webpack for loading of hot update chunks.", + "multiple": false, + "path": "output.hotUpdateGlobal", + "type": "string", + }, + ], + "description": "The global variable used by webpack for loading of hot update chunks.", + "multiple": false, + "simpleType": "string", + }, + "output-hot-update-main-filename": Object { + "configs": Array [ + Object { + "description": "The filename of the Hot Update Main File. It is inside the 'output.path' directory.", + "multiple": false, + "path": "output.hotUpdateMainFilename", + "type": "string", + }, + ], + "description": "The filename of the Hot Update Main File. It is inside the 'output.path' directory.", + "multiple": false, + "simpleType": "string", + }, + "output-ignore-browser-warnings": Object { + "configs": Array [ + Object { + "description": "Ignore warnings in the browser.", + "multiple": false, + "path": "output.ignoreBrowserWarnings", + "type": "boolean", + }, + ], + "description": "Ignore warnings in the browser.", + "multiple": false, + "simpleType": "boolean", + }, + "output-iife": Object { + "configs": Array [ + Object { + "description": "Wrap javascript code into IIFE's to avoid leaking into global scope.", + "multiple": false, + "path": "output.iife", + "type": "boolean", + }, + ], + "description": "Wrap javascript code into IIFE's to avoid leaking into global scope.", + "multiple": false, + "simpleType": "boolean", + }, + "output-import-function-name": Object { + "configs": Array [ + Object { + "description": "The name of the native import() function (can be exchanged for a polyfill).", + "multiple": false, + "path": "output.importFunctionName", + "type": "string", + }, + ], + "description": "The name of the native import() function (can be exchanged for a polyfill).", + "multiple": false, + "simpleType": "string", + }, + "output-import-meta-name": Object { + "configs": Array [ + Object { + "description": "The name of the native import.meta object (can be exchanged for a polyfill).", + "multiple": false, + "path": "output.importMetaName", + "type": "string", + }, + ], + "description": "The name of the native import.meta object (can be exchanged for a polyfill).", + "multiple": false, + "simpleType": "string", + }, + "output-library": Object { + "configs": Array [ + Object { + "description": "A part of the library name.", + "multiple": true, + "path": "output.library[]", + "type": "string", + }, + ], + "description": "A part of the library name.", + "multiple": true, + "simpleType": "string", + }, + "output-library-amd": Object { + "configs": Array [ + Object { + "description": "Name of the exposed AMD library in the UMD.", + "multiple": false, + "path": "output.library.amd", + "type": "string", + }, + ], + "description": "Name of the exposed AMD library in the UMD.", + "multiple": false, + "simpleType": "string", + }, + "output-library-amd-container": Object { + "configs": Array [ + Object { + "description": "Add a container for define/require functions in the AMD module.", + "multiple": false, + "path": "output.library.amdContainer", + "type": "string", + }, + ], + "description": "Add a container for define/require functions in the AMD module.", + "multiple": false, + "simpleType": "string", + }, + "output-library-auxiliary-comment": Object { + "configs": Array [ + Object { + "description": "Append the same comment above each import style.", + "multiple": false, + "path": "output.library.auxiliaryComment", + "type": "string", + }, + ], + "description": "Append the same comment above each import style.", + "multiple": false, + "simpleType": "string", + }, + "output-library-auxiliary-comment-amd": Object { + "configs": Array [ + Object { + "description": "Set comment for \`amd\` section in UMD.", + "multiple": false, + "path": "output.library.auxiliaryComment.amd", + "type": "string", + }, + ], + "description": "Set comment for \`amd\` section in UMD.", + "multiple": false, + "simpleType": "string", + }, + "output-library-auxiliary-comment-commonjs": Object { + "configs": Array [ + Object { + "description": "Set comment for \`commonjs\` (exports) section in UMD.", + "multiple": false, + "path": "output.library.auxiliaryComment.commonjs", + "type": "string", + }, + ], + "description": "Set comment for \`commonjs\` (exports) section in UMD.", + "multiple": false, + "simpleType": "string", + }, + "output-library-auxiliary-comment-commonjs2": Object { + "configs": Array [ + Object { + "description": "Set comment for \`commonjs2\` (module.exports) section in UMD.", + "multiple": false, + "path": "output.library.auxiliaryComment.commonjs2", + "type": "string", + }, + ], + "description": "Set comment for \`commonjs2\` (module.exports) section in UMD.", + "multiple": false, + "simpleType": "string", + }, + "output-library-auxiliary-comment-root": Object { + "configs": Array [ + Object { + "description": "Set comment for \`root\` (global variable) section in UMD.", + "multiple": false, + "path": "output.library.auxiliaryComment.root", + "type": "string", + }, + ], + "description": "Set comment for \`root\` (global variable) section in UMD.", + "multiple": false, + "simpleType": "string", + }, + "output-library-commonjs": Object { + "configs": Array [ + Object { + "description": "Name of the exposed commonjs export in the UMD.", + "multiple": false, + "path": "output.library.commonjs", + "type": "string", + }, + ], + "description": "Name of the exposed commonjs export in the UMD.", + "multiple": false, + "simpleType": "string", + }, + "output-library-export": Object { + "configs": Array [ + Object { + "description": "Part of the export that should be exposed as library.", + "multiple": true, + "path": "output.library.export[]", + "type": "string", + }, + ], + "description": "Part of the export that should be exposed as library.", + "multiple": true, + "simpleType": "string", + }, + "output-library-export-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'output.library.export' configuration. Specify which export should be exposed as library.", + "multiple": false, + "path": "output.library.export", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'output.library.export' configuration. Specify which export should be exposed as library.", + "multiple": false, + "simpleType": "boolean", + }, + "output-library-name": Object { + "configs": Array [ + Object { + "description": "A part of the library name.", + "multiple": true, + "path": "output.library.name[]", + "type": "string", + }, + ], + "description": "A part of the library name.", + "multiple": true, + "simpleType": "string", + }, + "output-library-name-amd": Object { + "configs": Array [ + Object { + "description": "Name of the exposed AMD library in the UMD.", + "multiple": false, + "path": "output.library.name.amd", + "type": "string", + }, + ], + "description": "Name of the exposed AMD library in the UMD.", + "multiple": false, + "simpleType": "string", + }, + "output-library-name-commonjs": Object { + "configs": Array [ + Object { + "description": "Name of the exposed commonjs export in the UMD.", + "multiple": false, + "path": "output.library.name.commonjs", + "type": "string", + }, + ], + "description": "Name of the exposed commonjs export in the UMD.", + "multiple": false, + "simpleType": "string", + }, + "output-library-name-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'output.library.name' configuration. The name of the library (some types allow unnamed libraries too).", + "multiple": false, + "path": "output.library.name", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'output.library.name' configuration. The name of the library (some types allow unnamed libraries too).", + "multiple": false, + "simpleType": "boolean", + }, + "output-library-name-root": Object { + "configs": Array [ + Object { + "description": "Part of the name of the property exposed globally by a UMD library.", + "multiple": true, + "path": "output.library.name.root[]", + "type": "string", + }, + ], + "description": "Part of the name of the property exposed globally by a UMD library.", + "multiple": true, + "simpleType": "string", + }, + "output-library-name-root-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'output.library.name.root' configuration. Name of the property exposed globally by a UMD library.", + "multiple": false, + "path": "output.library.name.root", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'output.library.name.root' configuration. Name of the property exposed globally by a UMD library.", + "multiple": false, + "simpleType": "boolean", + }, + "output-library-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'output.library' configuration. The name of the library (some types allow unnamed libraries too).", + "multiple": false, + "path": "output.library", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'output.library' configuration. The name of the library (some types allow unnamed libraries too).", + "multiple": false, + "simpleType": "boolean", + }, + "output-library-root": Object { + "configs": Array [ + Object { + "description": "Part of the name of the property exposed globally by a UMD library.", + "multiple": true, + "path": "output.library.root[]", + "type": "string", + }, + ], + "description": "Part of the name of the property exposed globally by a UMD library.", + "multiple": true, + "simpleType": "string", + }, + "output-library-root-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'output.library.root' configuration. Name of the property exposed globally by a UMD library.", + "multiple": false, + "path": "output.library.root", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'output.library.root' configuration. Name of the property exposed globally by a UMD library.", + "multiple": false, + "simpleType": "boolean", + }, + "output-library-type": Object { + "configs": Array [ + Object { + "description": "Type of library (types included by default are 'var', 'module', 'assign', 'assign-properties', 'this', 'window', 'self', 'global', 'commonjs', 'commonjs2', 'commonjs-module', 'commonjs-static', 'amd', 'amd-require', 'umd', 'umd2', 'jsonp', 'system', but others might be added by plugins).", + "multiple": false, + "path": "output.library.type", + "type": "enum", + "values": Array [ + "var", + "module", + "assign", + "assign-properties", + "this", + "window", + "self", + "global", + "commonjs", + "commonjs2", + "commonjs-module", + "commonjs-static", + "amd", + "amd-require", + "umd", + "umd2", + "jsonp", + "system", + ], + }, + Object { + "description": "Type of library (types included by default are 'var', 'module', 'assign', 'assign-properties', 'this', 'window', 'self', 'global', 'commonjs', 'commonjs2', 'commonjs-module', 'commonjs-static', 'amd', 'amd-require', 'umd', 'umd2', 'jsonp', 'system', but others might be added by plugins).", + "multiple": false, + "path": "output.library.type", + "type": "string", + }, + ], + "description": "Type of library (types included by default are 'var', 'module', 'assign', 'assign-properties', 'this', 'window', 'self', 'global', 'commonjs', 'commonjs2', 'commonjs-module', 'commonjs-static', 'amd', 'amd-require', 'umd', 'umd2', 'jsonp', 'system', but others might be added by plugins).", + "multiple": false, + "simpleType": "string", + }, + "output-library-umd-named-define": Object { + "configs": Array [ + Object { + "description": "If \`output.libraryTarget\` is set to umd and \`output.library\` is set, setting this to true will name the AMD module.", + "multiple": false, + "path": "output.library.umdNamedDefine", + "type": "boolean", + }, + ], + "description": "If \`output.libraryTarget\` is set to umd and \`output.library\` is set, setting this to true will name the AMD module.", + "multiple": false, + "simpleType": "boolean", + }, + "output-module": Object { + "configs": Array [ + Object { + "description": "Output javascript files as module source type.", + "multiple": false, + "path": "output.module", + "type": "boolean", + }, + ], + "description": "Output javascript files as module source type.", + "multiple": false, + "simpleType": "boolean", + }, + "output-path": Object { + "configs": Array [ + Object { + "description": "The output directory as **absolute path** (required).", + "multiple": false, + "path": "output.path", + "type": "path", + }, + ], + "description": "The output directory as **absolute path** (required).", + "multiple": false, + "simpleType": "string", + }, + "output-pathinfo": Object { + "configs": Array [ + Object { + "description": "Include comments with information about the modules.", + "multiple": false, + "path": "output.pathinfo", + "type": "enum", + "values": Array [ + "verbose", + ], + }, + Object { + "description": "Include comments with information about the modules.", + "multiple": false, + "path": "output.pathinfo", + "type": "boolean", + }, + ], + "description": "Include comments with information about the modules.", + "multiple": false, + "simpleType": "string", + }, + "output-public-path": Object { + "configs": Array [ + Object { + "description": "The 'publicPath' specifies the public URL address of the output files when referenced in a browser.", + "multiple": false, + "path": "output.publicPath", + "type": "enum", + "values": Array [ + "auto", + ], + }, + Object { + "description": "The 'publicPath' specifies the public URL address of the output files when referenced in a browser.", + "multiple": false, + "path": "output.publicPath", + "type": "string", + }, + ], + "description": "The 'publicPath' specifies the public URL address of the output files when referenced in a browser.", + "multiple": false, + "simpleType": "string", + }, + "output-script-type": Object { + "configs": Array [ + Object { + "description": "This option enables loading async chunks via a custom script type, such as script type=\\"module\\".", + "multiple": false, + "path": "output.scriptType", + "type": "enum", + "values": Array [ + false, + "text/javascript", + "module", + ], + }, + ], + "description": "This option enables loading async chunks via a custom script type, such as script type=\\"module\\".", + "multiple": false, + "simpleType": "string", + }, + "output-source-map-filename": Object { + "configs": Array [ + Object { + "description": "The filename of the SourceMaps for the JavaScript files. They are inside the 'output.path' directory.", + "multiple": false, + "path": "output.sourceMapFilename", + "type": "string", + }, + ], + "description": "The filename of the SourceMaps for the JavaScript files. They are inside the 'output.path' directory.", + "multiple": false, + "simpleType": "string", + }, + "output-source-prefix": Object { + "configs": Array [ + Object { + "description": "Prefixes every line of the source in the bundle with this string.", + "multiple": false, + "path": "output.sourcePrefix", + "type": "string", + }, + ], + "description": "Prefixes every line of the source in the bundle with this string.", + "multiple": false, + "simpleType": "string", + }, + "output-strict-module-error-handling": Object { + "configs": Array [ + Object { + "description": "Handles error in module loading correctly at a performance cost. This will handle module error compatible with the EcmaScript Modules spec.", + "multiple": false, + "path": "output.strictModuleErrorHandling", + "type": "boolean", + }, + ], + "description": "Handles error in module loading correctly at a performance cost. This will handle module error compatible with the EcmaScript Modules spec.", + "multiple": false, + "simpleType": "boolean", + }, + "output-strict-module-exception-handling": Object { + "configs": Array [ + Object { + "description": "Handles exceptions in module loading correctly at a performance cost (Deprecated). This will handle module error compatible with the Node.js CommonJS way.", + "multiple": false, + "path": "output.strictModuleExceptionHandling", + "type": "boolean", + }, + ], + "description": "Handles exceptions in module loading correctly at a performance cost (Deprecated). This will handle module error compatible with the Node.js CommonJS way.", + "multiple": false, + "simpleType": "boolean", + }, + "output-trusted-types": Object { + "configs": Array [ + Object { + "description": "Use a Trusted Types policy to create urls for chunks. 'output.uniqueName' is used a default policy name. Passing a string sets a custom policy name.", + "multiple": false, + "path": "output.trustedTypes", + "type": "enum", + "values": Array [ + true, + ], + }, + Object { + "description": "The name of the Trusted Types policy created by webpack to serve bundle chunks.", + "multiple": false, + "path": "output.trustedTypes", + "type": "string", + }, + ], + "description": "Use a Trusted Types policy to create urls for chunks. 'output.uniqueName' is used a default policy name. Passing a string sets a custom policy name. The name of the Trusted Types policy created by webpack to serve bundle chunks.", + "multiple": false, + "simpleType": "string", + }, + "output-trusted-types-on-policy-creation-failure": Object { + "configs": Array [ + Object { + "description": "If the call to \`trustedTypes.createPolicy(...)\` fails -- e.g., due to the policy name missing from the CSP \`trusted-types\` list, or it being a duplicate name, etc. -- controls whether to continue with loading in the hope that \`require-trusted-types-for 'script'\` isn't enforced yet, versus fail immediately. Default behavior is 'stop'.", + "multiple": false, + "path": "output.trustedTypes.onPolicyCreationFailure", + "type": "enum", + "values": Array [ + "continue", + "stop", + ], + }, + ], + "description": "If the call to \`trustedTypes.createPolicy(...)\` fails -- e.g., due to the policy name missing from the CSP \`trusted-types\` list, or it being a duplicate name, etc. -- controls whether to continue with loading in the hope that \`require-trusted-types-for 'script'\` isn't enforced yet, versus fail immediately. Default behavior is 'stop'.", + "multiple": false, + "simpleType": "string", + }, + "output-trusted-types-policy-name": Object { + "configs": Array [ + Object { + "description": "The name of the Trusted Types policy created by webpack to serve bundle chunks.", + "multiple": false, + "path": "output.trustedTypes.policyName", + "type": "string", + }, + ], + "description": "The name of the Trusted Types policy created by webpack to serve bundle chunks.", + "multiple": false, + "simpleType": "string", + }, + "output-unique-name": Object { + "configs": Array [ + Object { + "description": "A unique name of the webpack build to avoid multiple webpack runtimes to conflict when using globals.", + "multiple": false, + "path": "output.uniqueName", + "type": "string", + }, + ], + "description": "A unique name of the webpack build to avoid multiple webpack runtimes to conflict when using globals.", + "multiple": false, + "simpleType": "string", + }, + "output-wasm-loading": Object { + "configs": Array [ + Object { + "description": "The method of loading WebAssembly Modules (methods included by default are 'fetch' (web/WebWorker), 'async-node' (node.js), but others might be added by plugins).", + "multiple": false, + "path": "output.wasmLoading", + "type": "enum", + "values": Array [ + false, + ], + }, + Object { + "description": "The method of loading WebAssembly Modules (methods included by default are 'fetch' (web/WebWorker), 'async-node' (node.js), but others might be added by plugins).", + "multiple": false, + "path": "output.wasmLoading", + "type": "enum", + "values": Array [ + "fetch", + "async-node", + ], + }, + Object { + "description": "The method of loading WebAssembly Modules (methods included by default are 'fetch' (web/WebWorker), 'async-node' (node.js), but others might be added by plugins).", + "multiple": false, + "path": "output.wasmLoading", + "type": "string", + }, + ], + "description": "The method of loading WebAssembly Modules (methods included by default are 'fetch' (web/WebWorker), 'async-node' (node.js), but others might be added by plugins).", + "multiple": false, + "simpleType": "string", + }, + "output-webassembly-module-filename": Object { + "configs": Array [ + Object { + "description": "The filename of WebAssembly modules as relative path inside the 'output.path' directory.", + "multiple": false, + "path": "output.webassemblyModuleFilename", + "type": "string", + }, + ], + "description": "The filename of WebAssembly modules as relative path inside the 'output.path' directory.", + "multiple": false, + "simpleType": "string", + }, + "output-worker-chunk-loading": Object { + "configs": Array [ + Object { + "description": "The method of loading chunks (methods included by default are 'jsonp' (web), 'import' (ESM), 'importScripts' (WebWorker), 'require' (sync node.js), 'async-node' (async node.js), but others might be added by plugins).", + "multiple": false, + "path": "output.workerChunkLoading", + "type": "enum", + "values": Array [ + false, + ], + }, + Object { + "description": "The method of loading chunks (methods included by default are 'jsonp' (web), 'import' (ESM), 'importScripts' (WebWorker), 'require' (sync node.js), 'async-node' (async node.js), but others might be added by plugins).", + "multiple": false, + "path": "output.workerChunkLoading", + "type": "enum", + "values": Array [ + "jsonp", + "import-scripts", + "require", + "async-node", + "import", + ], + }, + Object { + "description": "The method of loading chunks (methods included by default are 'jsonp' (web), 'import' (ESM), 'importScripts' (WebWorker), 'require' (sync node.js), 'async-node' (async node.js), but others might be added by plugins).", + "multiple": false, + "path": "output.workerChunkLoading", + "type": "string", + }, + ], + "description": "The method of loading chunks (methods included by default are 'jsonp' (web), 'import' (ESM), 'importScripts' (WebWorker), 'require' (sync node.js), 'async-node' (async node.js), but others might be added by plugins).", + "multiple": false, + "simpleType": "string", + }, + "output-worker-public-path": Object { + "configs": Array [ + Object { + "description": "Worker public path. Much like the public path, this sets the location where the worker script file is intended to be found. If not set, webpack will use the publicPath. Don't set this option unless your worker scripts are located at a different path from your other script files.", + "multiple": false, + "path": "output.workerPublicPath", + "type": "string", + }, + ], + "description": "Worker public path. Much like the public path, this sets the location where the worker script file is intended to be found. If not set, webpack will use the publicPath. Don't set this option unless your worker scripts are located at a different path from your other script files.", + "multiple": false, + "simpleType": "string", + }, + "output-worker-wasm-loading": Object { + "configs": Array [ + Object { + "description": "The method of loading WebAssembly Modules (methods included by default are 'fetch' (web/WebWorker), 'async-node' (node.js), but others might be added by plugins).", + "multiple": false, + "path": "output.workerWasmLoading", + "type": "enum", + "values": Array [ + false, + ], + }, + Object { + "description": "The method of loading WebAssembly Modules (methods included by default are 'fetch' (web/WebWorker), 'async-node' (node.js), but others might be added by plugins).", + "multiple": false, + "path": "output.workerWasmLoading", + "type": "enum", + "values": Array [ + "fetch", + "async-node", + ], + }, + Object { + "description": "The method of loading WebAssembly Modules (methods included by default are 'fetch' (web/WebWorker), 'async-node' (node.js), but others might be added by plugins).", + "multiple": false, + "path": "output.workerWasmLoading", + "type": "string", + }, + ], + "description": "The method of loading WebAssembly Modules (methods included by default are 'fetch' (web/WebWorker), 'async-node' (node.js), but others might be added by plugins).", + "multiple": false, + "simpleType": "string", + }, + "parallelism": Object { + "configs": Array [ + Object { + "description": "The number of parallel processed modules in the compilation.", + "multiple": false, + "path": "parallelism", + "type": "number", + }, + ], + "description": "The number of parallel processed modules in the compilation.", + "multiple": false, + "simpleType": "number", + }, + "performance": Object { + "configs": Array [ + Object { + "description": "Configuration for web performance recommendations.", + "multiple": false, + "path": "performance", + "type": "enum", + "values": Array [ + false, + ], + }, + ], + "description": "Configuration for web performance recommendations.", + "multiple": false, + "simpleType": "boolean", + }, + "performance-hints": Object { + "configs": Array [ + Object { + "description": "Sets the format of the hints: warnings, errors or nothing at all.", + "multiple": false, + "path": "performance.hints", + "type": "enum", + "values": Array [ + false, + "warning", + "error", + ], + }, + ], + "description": "Sets the format of the hints: warnings, errors or nothing at all.", + "multiple": false, + "simpleType": "string", + }, + "performance-max-asset-size": Object { + "configs": Array [ + Object { + "description": "File size limit (in bytes) when exceeded, that webpack will provide performance hints.", + "multiple": false, + "path": "performance.maxAssetSize", + "type": "number", + }, + ], + "description": "File size limit (in bytes) when exceeded, that webpack will provide performance hints.", + "multiple": false, + "simpleType": "number", + }, + "performance-max-entrypoint-size": Object { + "configs": Array [ + Object { + "description": "Total size of an entry point (in bytes).", + "multiple": false, + "path": "performance.maxEntrypointSize", + "type": "number", + }, + ], + "description": "Total size of an entry point (in bytes).", + "multiple": false, + "simpleType": "number", + }, + "profile": Object { + "configs": Array [ + Object { + "description": "Capture timing information for each module.", + "multiple": false, + "path": "profile", + "type": "boolean", + }, + ], + "description": "Capture timing information for each module.", + "multiple": false, + "simpleType": "boolean", + }, + "records-input-path": Object { + "configs": Array [ + Object { + "description": "Store compiler state to a json file.", + "multiple": false, + "path": "recordsInputPath", + "type": "enum", + "values": Array [ + false, + ], + }, + Object { + "description": "Store compiler state to a json file.", + "multiple": false, + "path": "recordsInputPath", + "type": "path", + }, + ], + "description": "Store compiler state to a json file.", + "multiple": false, + "simpleType": "string", + }, + "records-output-path": Object { + "configs": Array [ + Object { + "description": "Load compiler state from a json file.", + "multiple": false, + "path": "recordsOutputPath", + "type": "enum", + "values": Array [ + false, + ], + }, + Object { + "description": "Load compiler state from a json file.", + "multiple": false, + "path": "recordsOutputPath", + "type": "path", + }, + ], + "description": "Load compiler state from a json file.", + "multiple": false, + "simpleType": "string", + }, + "records-path": Object { + "configs": Array [ + Object { + "description": "Store/Load compiler state from/to a json file. This will result in persistent ids of modules and chunks. An absolute path is expected. \`recordsPath\` is used for \`recordsInputPath\` and \`recordsOutputPath\` if they left undefined.", + "multiple": false, + "path": "recordsPath", + "type": "enum", + "values": Array [ + false, + ], + }, + Object { + "description": "Store/Load compiler state from/to a json file. This will result in persistent ids of modules and chunks. An absolute path is expected. \`recordsPath\` is used for \`recordsInputPath\` and \`recordsOutputPath\` if they left undefined.", + "multiple": false, + "path": "recordsPath", + "type": "path", + }, + ], + "description": "Store/Load compiler state from/to a json file. This will result in persistent ids of modules and chunks. An absolute path is expected. \`recordsPath\` is used for \`recordsInputPath\` and \`recordsOutputPath\` if they left undefined.", + "multiple": false, + "simpleType": "string", + }, + "resolve-alias-alias": Object { + "configs": Array [ + Object { + "description": "Ignore request (replace with empty module).", + "multiple": true, + "path": "resolve.alias[].alias", + "type": "enum", + "values": Array [ + false, + ], + }, + Object { + "description": "New request.", + "multiple": true, + "path": "resolve.alias[].alias", + "type": "string", + }, + ], + "description": "Ignore request (replace with empty module). New request.", + "multiple": true, + "simpleType": "string", + }, + "resolve-alias-fields": Object { + "configs": Array [ + Object { + "description": "Field in the description file (usually package.json) which are used to redirect requests inside the module.", + "multiple": true, + "path": "resolve.aliasFields[]", + "type": "string", + }, + ], + "description": "Field in the description file (usually package.json) which are used to redirect requests inside the module.", + "multiple": true, + "simpleType": "string", + }, + "resolve-alias-fields-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolve.aliasFields' configuration. Fields in the description file (usually package.json) which are used to redirect requests inside the module.", + "multiple": false, + "path": "resolve.aliasFields", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolve.aliasFields' configuration. Fields in the description file (usually package.json) which are used to redirect requests inside the module.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-alias-name": Object { + "configs": Array [ + Object { + "description": "Request to be redirected.", + "multiple": true, + "path": "resolve.alias[].name", + "type": "string", + }, + ], + "description": "Request to be redirected.", + "multiple": true, + "simpleType": "string", + }, + "resolve-alias-only-module": Object { + "configs": Array [ + Object { + "description": "Redirect only exact matching request.", + "multiple": true, + "path": "resolve.alias[].onlyModule", + "type": "boolean", + }, + ], + "description": "Redirect only exact matching request.", + "multiple": true, + "simpleType": "boolean", + }, + "resolve-alias-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolve.alias' configuration. Redirect module requests.", + "multiple": false, + "path": "resolve.alias", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolve.alias' configuration. Redirect module requests.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-cache": Object { + "configs": Array [ + Object { + "description": "Enable caching of successfully resolved requests (cache entries are revalidated).", + "multiple": false, + "path": "resolve.cache", + "type": "boolean", + }, + ], + "description": "Enable caching of successfully resolved requests (cache entries are revalidated).", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-cache-with-context": Object { + "configs": Array [ + Object { + "description": "Include the context information in the cache identifier when caching.", + "multiple": false, + "path": "resolve.cacheWithContext", + "type": "boolean", + }, + ], + "description": "Include the context information in the cache identifier when caching.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-condition-names": Object { + "configs": Array [ + Object { + "description": "Condition names for exports field entry point.", + "multiple": true, + "path": "resolve.conditionNames[]", + "type": "string", + }, + ], + "description": "Condition names for exports field entry point.", + "multiple": true, + "simpleType": "string", + }, + "resolve-condition-names-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolve.conditionNames' configuration. Condition names for exports field entry point.", + "multiple": false, + "path": "resolve.conditionNames", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolve.conditionNames' configuration. Condition names for exports field entry point.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-description-files": Object { + "configs": Array [ + Object { + "description": "Filename used to find a description file (like a package.json).", + "multiple": true, + "path": "resolve.descriptionFiles[]", + "type": "string", + }, + ], + "description": "Filename used to find a description file (like a package.json).", + "multiple": true, + "simpleType": "string", + }, + "resolve-description-files-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolve.descriptionFiles' configuration. Filenames used to find a description file (like a package.json).", + "multiple": false, + "path": "resolve.descriptionFiles", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolve.descriptionFiles' configuration. Filenames used to find a description file (like a package.json).", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-enforce-extension": Object { + "configs": Array [ + Object { + "description": "Enforce the resolver to use one of the extensions from the extensions option (User must specify requests without extension).", + "multiple": false, + "path": "resolve.enforceExtension", + "type": "boolean", + }, + ], + "description": "Enforce the resolver to use one of the extensions from the extensions option (User must specify requests without extension).", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-exports-fields": Object { + "configs": Array [ + Object { + "description": "Field name from the description file (usually package.json) which is used to provide entry points of a package.", + "multiple": true, + "path": "resolve.exportsFields[]", + "type": "string", + }, + ], + "description": "Field name from the description file (usually package.json) which is used to provide entry points of a package.", + "multiple": true, + "simpleType": "string", + }, + "resolve-exports-fields-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolve.exportsFields' configuration. Field names from the description file (usually package.json) which are used to provide entry points of a package.", + "multiple": false, + "path": "resolve.exportsFields", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolve.exportsFields' configuration. Field names from the description file (usually package.json) which are used to provide entry points of a package.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-extensions": Object { + "configs": Array [ + Object { + "description": "Extension added to the request when trying to find the file.", + "multiple": true, + "path": "resolve.extensions[]", + "type": "string", + }, + ], + "description": "Extension added to the request when trying to find the file.", + "multiple": true, + "simpleType": "string", + }, + "resolve-extensions-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolve.extensions' configuration. Extensions added to the request when trying to find the file.", + "multiple": false, + "path": "resolve.extensions", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolve.extensions' configuration. Extensions added to the request when trying to find the file.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-fallback-alias": Object { + "configs": Array [ + Object { + "description": "Ignore request (replace with empty module).", + "multiple": true, + "path": "resolve.fallback[].alias", + "type": "enum", + "values": Array [ + false, + ], + }, + Object { + "description": "New request.", + "multiple": true, + "path": "resolve.fallback[].alias", + "type": "string", + }, + ], + "description": "Ignore request (replace with empty module). New request.", + "multiple": true, + "simpleType": "string", + }, + "resolve-fallback-name": Object { + "configs": Array [ + Object { + "description": "Request to be redirected.", + "multiple": true, + "path": "resolve.fallback[].name", + "type": "string", + }, + ], + "description": "Request to be redirected.", + "multiple": true, + "simpleType": "string", + }, + "resolve-fallback-only-module": Object { + "configs": Array [ + Object { + "description": "Redirect only exact matching request.", + "multiple": true, + "path": "resolve.fallback[].onlyModule", + "type": "boolean", + }, + ], + "description": "Redirect only exact matching request.", + "multiple": true, + "simpleType": "boolean", + }, + "resolve-fallback-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolve.fallback' configuration. Redirect module requests.", + "multiple": false, + "path": "resolve.fallback", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolve.fallback' configuration. Redirect module requests.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-fully-specified": Object { + "configs": Array [ + Object { + "description": "Treats the request specified by the user as fully specified, meaning no extensions are added and the mainFiles in directories are not resolved (This doesn't affect requests from mainFields, aliasFields or aliases).", + "multiple": false, + "path": "resolve.fullySpecified", + "type": "boolean", + }, + ], + "description": "Treats the request specified by the user as fully specified, meaning no extensions are added and the mainFiles in directories are not resolved (This doesn't affect requests from mainFields, aliasFields or aliases).", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-imports-fields": Object { + "configs": Array [ + Object { + "description": "Field name from the description file (usually package.json) which is used to provide internal request of a package (requests starting with # are considered as internal).", + "multiple": true, + "path": "resolve.importsFields[]", + "type": "string", + }, + ], + "description": "Field name from the description file (usually package.json) which is used to provide internal request of a package (requests starting with # are considered as internal).", + "multiple": true, + "simpleType": "string", + }, + "resolve-imports-fields-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolve.importsFields' configuration. Field names from the description file (usually package.json) which are used to provide internal request of a package (requests starting with # are considered as internal).", + "multiple": false, + "path": "resolve.importsFields", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolve.importsFields' configuration. Field names from the description file (usually package.json) which are used to provide internal request of a package (requests starting with # are considered as internal).", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-loader-alias-alias": Object { + "configs": Array [ + Object { + "description": "Ignore request (replace with empty module).", + "multiple": true, + "path": "resolveLoader.alias[].alias", + "type": "enum", + "values": Array [ + false, + ], + }, + Object { + "description": "New request.", + "multiple": true, + "path": "resolveLoader.alias[].alias", + "type": "string", + }, + ], + "description": "Ignore request (replace with empty module). New request.", + "multiple": true, + "simpleType": "string", + }, + "resolve-loader-alias-fields": Object { + "configs": Array [ + Object { + "description": "Field in the description file (usually package.json) which are used to redirect requests inside the module.", + "multiple": true, + "path": "resolveLoader.aliasFields[]", + "type": "string", + }, + ], + "description": "Field in the description file (usually package.json) which are used to redirect requests inside the module.", + "multiple": true, + "simpleType": "string", + }, + "resolve-loader-alias-fields-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolveLoader.aliasFields' configuration. Fields in the description file (usually package.json) which are used to redirect requests inside the module.", + "multiple": false, + "path": "resolveLoader.aliasFields", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolveLoader.aliasFields' configuration. Fields in the description file (usually package.json) which are used to redirect requests inside the module.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-loader-alias-name": Object { + "configs": Array [ + Object { + "description": "Request to be redirected.", + "multiple": true, + "path": "resolveLoader.alias[].name", + "type": "string", + }, + ], + "description": "Request to be redirected.", + "multiple": true, + "simpleType": "string", + }, + "resolve-loader-alias-only-module": Object { + "configs": Array [ + Object { + "description": "Redirect only exact matching request.", + "multiple": true, + "path": "resolveLoader.alias[].onlyModule", + "type": "boolean", + }, + ], + "description": "Redirect only exact matching request.", + "multiple": true, + "simpleType": "boolean", + }, + "resolve-loader-alias-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolveLoader.alias' configuration. Redirect module requests.", + "multiple": false, + "path": "resolveLoader.alias", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolveLoader.alias' configuration. Redirect module requests.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-loader-cache": Object { + "configs": Array [ + Object { + "description": "Enable caching of successfully resolved requests (cache entries are revalidated).", + "multiple": false, + "path": "resolveLoader.cache", + "type": "boolean", + }, + ], + "description": "Enable caching of successfully resolved requests (cache entries are revalidated).", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-loader-cache-with-context": Object { + "configs": Array [ + Object { + "description": "Include the context information in the cache identifier when caching.", + "multiple": false, + "path": "resolveLoader.cacheWithContext", + "type": "boolean", + }, + ], + "description": "Include the context information in the cache identifier when caching.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-loader-condition-names": Object { + "configs": Array [ + Object { + "description": "Condition names for exports field entry point.", + "multiple": true, + "path": "resolveLoader.conditionNames[]", + "type": "string", + }, + ], + "description": "Condition names for exports field entry point.", + "multiple": true, + "simpleType": "string", + }, + "resolve-loader-condition-names-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolveLoader.conditionNames' configuration. Condition names for exports field entry point.", + "multiple": false, + "path": "resolveLoader.conditionNames", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolveLoader.conditionNames' configuration. Condition names for exports field entry point.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-loader-description-files": Object { + "configs": Array [ + Object { + "description": "Filename used to find a description file (like a package.json).", + "multiple": true, + "path": "resolveLoader.descriptionFiles[]", + "type": "string", + }, + ], + "description": "Filename used to find a description file (like a package.json).", + "multiple": true, + "simpleType": "string", + }, + "resolve-loader-description-files-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolveLoader.descriptionFiles' configuration. Filenames used to find a description file (like a package.json).", + "multiple": false, + "path": "resolveLoader.descriptionFiles", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolveLoader.descriptionFiles' configuration. Filenames used to find a description file (like a package.json).", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-loader-enforce-extension": Object { + "configs": Array [ + Object { + "description": "Enforce the resolver to use one of the extensions from the extensions option (User must specify requests without extension).", + "multiple": false, + "path": "resolveLoader.enforceExtension", + "type": "boolean", + }, + ], + "description": "Enforce the resolver to use one of the extensions from the extensions option (User must specify requests without extension).", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-loader-exports-fields": Object { + "configs": Array [ + Object { + "description": "Field name from the description file (usually package.json) which is used to provide entry points of a package.", + "multiple": true, + "path": "resolveLoader.exportsFields[]", + "type": "string", + }, + ], + "description": "Field name from the description file (usually package.json) which is used to provide entry points of a package.", + "multiple": true, + "simpleType": "string", + }, + "resolve-loader-exports-fields-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolveLoader.exportsFields' configuration. Field names from the description file (usually package.json) which are used to provide entry points of a package.", + "multiple": false, + "path": "resolveLoader.exportsFields", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolveLoader.exportsFields' configuration. Field names from the description file (usually package.json) which are used to provide entry points of a package.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-loader-extensions": Object { + "configs": Array [ + Object { + "description": "Extension added to the request when trying to find the file.", + "multiple": true, + "path": "resolveLoader.extensions[]", + "type": "string", + }, + ], + "description": "Extension added to the request when trying to find the file.", + "multiple": true, + "simpleType": "string", + }, + "resolve-loader-extensions-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolveLoader.extensions' configuration. Extensions added to the request when trying to find the file.", + "multiple": false, + "path": "resolveLoader.extensions", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolveLoader.extensions' configuration. Extensions added to the request when trying to find the file.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-loader-fallback-alias": Object { + "configs": Array [ + Object { + "description": "Ignore request (replace with empty module).", + "multiple": true, + "path": "resolveLoader.fallback[].alias", + "type": "enum", + "values": Array [ + false, + ], + }, + Object { + "description": "New request.", + "multiple": true, + "path": "resolveLoader.fallback[].alias", + "type": "string", + }, + ], + "description": "Ignore request (replace with empty module). New request.", + "multiple": true, + "simpleType": "string", + }, + "resolve-loader-fallback-name": Object { + "configs": Array [ + Object { + "description": "Request to be redirected.", + "multiple": true, + "path": "resolveLoader.fallback[].name", + "type": "string", + }, + ], + "description": "Request to be redirected.", + "multiple": true, + "simpleType": "string", + }, + "resolve-loader-fallback-only-module": Object { + "configs": Array [ + Object { + "description": "Redirect only exact matching request.", + "multiple": true, + "path": "resolveLoader.fallback[].onlyModule", + "type": "boolean", + }, + ], + "description": "Redirect only exact matching request.", + "multiple": true, + "simpleType": "boolean", + }, + "resolve-loader-fallback-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolveLoader.fallback' configuration. Redirect module requests.", + "multiple": false, + "path": "resolveLoader.fallback", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolveLoader.fallback' configuration. Redirect module requests.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-loader-fully-specified": Object { + "configs": Array [ + Object { + "description": "Treats the request specified by the user as fully specified, meaning no extensions are added and the mainFiles in directories are not resolved (This doesn't affect requests from mainFields, aliasFields or aliases).", + "multiple": false, + "path": "resolveLoader.fullySpecified", + "type": "boolean", + }, + ], + "description": "Treats the request specified by the user as fully specified, meaning no extensions are added and the mainFiles in directories are not resolved (This doesn't affect requests from mainFields, aliasFields or aliases).", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-loader-imports-fields": Object { + "configs": Array [ + Object { + "description": "Field name from the description file (usually package.json) which is used to provide internal request of a package (requests starting with # are considered as internal).", + "multiple": true, + "path": "resolveLoader.importsFields[]", + "type": "string", + }, + ], + "description": "Field name from the description file (usually package.json) which is used to provide internal request of a package (requests starting with # are considered as internal).", + "multiple": true, + "simpleType": "string", + }, + "resolve-loader-imports-fields-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolveLoader.importsFields' configuration. Field names from the description file (usually package.json) which are used to provide internal request of a package (requests starting with # are considered as internal).", + "multiple": false, + "path": "resolveLoader.importsFields", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolveLoader.importsFields' configuration. Field names from the description file (usually package.json) which are used to provide internal request of a package (requests starting with # are considered as internal).", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-loader-main-fields": Object { + "configs": Array [ + Object { + "description": "Field name from the description file (package.json) which are used to find the default entry point.", + "multiple": true, + "path": "resolveLoader.mainFields[]", + "type": "string", + }, + ], + "description": "Field name from the description file (package.json) which are used to find the default entry point.", + "multiple": true, + "simpleType": "string", + }, + "resolve-loader-main-fields-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolveLoader.mainFields' configuration. Field names from the description file (package.json) which are used to find the default entry point.", + "multiple": false, + "path": "resolveLoader.mainFields", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolveLoader.mainFields' configuration. Field names from the description file (package.json) which are used to find the default entry point.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-loader-main-files": Object { + "configs": Array [ + Object { + "description": "Filename used to find the default entry point if there is no description file or main field.", + "multiple": true, + "path": "resolveLoader.mainFiles[]", + "type": "string", + }, + ], + "description": "Filename used to find the default entry point if there is no description file or main field.", + "multiple": true, + "simpleType": "string", + }, + "resolve-loader-main-files-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolveLoader.mainFiles' configuration. Filenames used to find the default entry point if there is no description file or main field.", + "multiple": false, + "path": "resolveLoader.mainFiles", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolveLoader.mainFiles' configuration. Filenames used to find the default entry point if there is no description file or main field.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-loader-modules": Object { + "configs": Array [ + Object { + "description": "Folder name or directory path where to find modules.", + "multiple": true, + "path": "resolveLoader.modules[]", + "type": "string", + }, + ], + "description": "Folder name or directory path where to find modules.", + "multiple": true, + "simpleType": "string", + }, + "resolve-loader-modules-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolveLoader.modules' configuration. Folder names or directory paths where to find modules.", + "multiple": false, + "path": "resolveLoader.modules", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolveLoader.modules' configuration. Folder names or directory paths where to find modules.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-loader-prefer-absolute": Object { + "configs": Array [ + Object { + "description": "Prefer to resolve server-relative URLs (starting with '/') as absolute paths before falling back to resolve in 'resolve.roots'.", + "multiple": false, + "path": "resolveLoader.preferAbsolute", + "type": "boolean", + }, + ], + "description": "Prefer to resolve server-relative URLs (starting with '/') as absolute paths before falling back to resolve in 'resolve.roots'.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-loader-prefer-relative": Object { + "configs": Array [ + Object { + "description": "Prefer to resolve module requests as relative request and fallback to resolving as module.", + "multiple": false, + "path": "resolveLoader.preferRelative", + "type": "boolean", + }, + ], + "description": "Prefer to resolve module requests as relative request and fallback to resolving as module.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-loader-restrictions": Object { + "configs": Array [ + Object { + "description": "Resolve restriction. Resolve result must fulfill this restriction.", + "multiple": true, + "path": "resolveLoader.restrictions[]", + "type": "RegExp", + }, + Object { + "description": "Resolve restriction. Resolve result must fulfill this restriction.", + "multiple": true, + "path": "resolveLoader.restrictions[]", + "type": "path", + }, + ], + "description": "Resolve restriction. Resolve result must fulfill this restriction.", + "multiple": true, + "simpleType": "string", + }, + "resolve-loader-restrictions-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolveLoader.restrictions' configuration. A list of resolve restrictions. Resolve results must fulfill all of these restrictions to resolve successfully. Other resolve paths are taken when restrictions are not met.", + "multiple": false, + "path": "resolveLoader.restrictions", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolveLoader.restrictions' configuration. A list of resolve restrictions. Resolve results must fulfill all of these restrictions to resolve successfully. Other resolve paths are taken when restrictions are not met.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-loader-roots": Object { + "configs": Array [ + Object { + "description": "Directory in which requests that are server-relative URLs (starting with '/') are resolved.", + "multiple": true, + "path": "resolveLoader.roots[]", + "type": "string", + }, + ], + "description": "Directory in which requests that are server-relative URLs (starting with '/') are resolved.", + "multiple": true, + "simpleType": "string", + }, + "resolve-loader-roots-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolveLoader.roots' configuration. A list of directories in which requests that are server-relative URLs (starting with '/') are resolved.", + "multiple": false, + "path": "resolveLoader.roots", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolveLoader.roots' configuration. A list of directories in which requests that are server-relative URLs (starting with '/') are resolved.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-loader-symlinks": Object { + "configs": Array [ + Object { + "description": "Enable resolving symlinks to the original location.", + "multiple": false, + "path": "resolveLoader.symlinks", + "type": "boolean", + }, + ], + "description": "Enable resolving symlinks to the original location.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-loader-unsafe-cache": Object { + "configs": Array [ + Object { + "description": "Enable caching of successfully resolved requests (cache entries are not revalidated).", + "multiple": false, + "path": "resolveLoader.unsafeCache", + "type": "boolean", + }, + ], + "description": "Enable caching of successfully resolved requests (cache entries are not revalidated).", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-loader-use-sync-file-system-calls": Object { + "configs": Array [ + Object { + "description": "Use synchronous filesystem calls for the resolver.", + "multiple": false, + "path": "resolveLoader.useSyncFileSystemCalls", + "type": "boolean", + }, + ], + "description": "Use synchronous filesystem calls for the resolver.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-main-fields": Object { + "configs": Array [ + Object { + "description": "Field name from the description file (package.json) which are used to find the default entry point.", + "multiple": true, + "path": "resolve.mainFields[]", + "type": "string", + }, + ], + "description": "Field name from the description file (package.json) which are used to find the default entry point.", + "multiple": true, + "simpleType": "string", + }, + "resolve-main-fields-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolve.mainFields' configuration. Field names from the description file (package.json) which are used to find the default entry point.", + "multiple": false, + "path": "resolve.mainFields", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolve.mainFields' configuration. Field names from the description file (package.json) which are used to find the default entry point.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-main-files": Object { + "configs": Array [ + Object { + "description": "Filename used to find the default entry point if there is no description file or main field.", + "multiple": true, + "path": "resolve.mainFiles[]", + "type": "string", + }, + ], + "description": "Filename used to find the default entry point if there is no description file or main field.", + "multiple": true, + "simpleType": "string", + }, + "resolve-main-files-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolve.mainFiles' configuration. Filenames used to find the default entry point if there is no description file or main field.", + "multiple": false, + "path": "resolve.mainFiles", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolve.mainFiles' configuration. Filenames used to find the default entry point if there is no description file or main field.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-modules": Object { + "configs": Array [ + Object { + "description": "Folder name or directory path where to find modules.", + "multiple": true, + "path": "resolve.modules[]", + "type": "string", + }, + ], + "description": "Folder name or directory path where to find modules.", + "multiple": true, + "simpleType": "string", + }, + "resolve-modules-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolve.modules' configuration. Folder names or directory paths where to find modules.", + "multiple": false, + "path": "resolve.modules", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolve.modules' configuration. Folder names or directory paths where to find modules.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-prefer-absolute": Object { + "configs": Array [ + Object { + "description": "Prefer to resolve server-relative URLs (starting with '/') as absolute paths before falling back to resolve in 'resolve.roots'.", + "multiple": false, + "path": "resolve.preferAbsolute", + "type": "boolean", + }, + ], + "description": "Prefer to resolve server-relative URLs (starting with '/') as absolute paths before falling back to resolve in 'resolve.roots'.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-prefer-relative": Object { + "configs": Array [ + Object { + "description": "Prefer to resolve module requests as relative request and fallback to resolving as module.", + "multiple": false, + "path": "resolve.preferRelative", + "type": "boolean", + }, + ], + "description": "Prefer to resolve module requests as relative request and fallback to resolving as module.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-restrictions": Object { + "configs": Array [ + Object { + "description": "Resolve restriction. Resolve result must fulfill this restriction.", + "multiple": true, + "path": "resolve.restrictions[]", + "type": "RegExp", + }, + Object { + "description": "Resolve restriction. Resolve result must fulfill this restriction.", + "multiple": true, + "path": "resolve.restrictions[]", + "type": "path", + }, + ], + "description": "Resolve restriction. Resolve result must fulfill this restriction.", + "multiple": true, + "simpleType": "string", + }, + "resolve-restrictions-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolve.restrictions' configuration. A list of resolve restrictions. Resolve results must fulfill all of these restrictions to resolve successfully. Other resolve paths are taken when restrictions are not met.", + "multiple": false, + "path": "resolve.restrictions", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolve.restrictions' configuration. A list of resolve restrictions. Resolve results must fulfill all of these restrictions to resolve successfully. Other resolve paths are taken when restrictions are not met.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-roots": Object { + "configs": Array [ + Object { + "description": "Directory in which requests that are server-relative URLs (starting with '/') are resolved.", + "multiple": true, + "path": "resolve.roots[]", + "type": "string", + }, + ], + "description": "Directory in which requests that are server-relative URLs (starting with '/') are resolved.", + "multiple": true, + "simpleType": "string", + }, + "resolve-roots-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'resolve.roots' configuration. A list of directories in which requests that are server-relative URLs (starting with '/') are resolved.", + "multiple": false, + "path": "resolve.roots", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'resolve.roots' configuration. A list of directories in which requests that are server-relative URLs (starting with '/') are resolved.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-symlinks": Object { + "configs": Array [ + Object { + "description": "Enable resolving symlinks to the original location.", + "multiple": false, + "path": "resolve.symlinks", + "type": "boolean", + }, + ], + "description": "Enable resolving symlinks to the original location.", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-unsafe-cache": Object { + "configs": Array [ + Object { + "description": "Enable caching of successfully resolved requests (cache entries are not revalidated).", + "multiple": false, + "path": "resolve.unsafeCache", + "type": "boolean", + }, + ], + "description": "Enable caching of successfully resolved requests (cache entries are not revalidated).", + "multiple": false, + "simpleType": "boolean", + }, + "resolve-use-sync-file-system-calls": Object { + "configs": Array [ + Object { + "description": "Use synchronous filesystem calls for the resolver.", + "multiple": false, + "path": "resolve.useSyncFileSystemCalls", + "type": "boolean", + }, + ], + "description": "Use synchronous filesystem calls for the resolver.", + "multiple": false, + "simpleType": "boolean", + }, + "snapshot-build-dependencies-hash": Object { + "configs": Array [ + Object { + "description": "Use hashes of the content of the files/directories to determine invalidation.", + "multiple": false, + "path": "snapshot.buildDependencies.hash", + "type": "boolean", + }, + ], + "description": "Use hashes of the content of the files/directories to determine invalidation.", + "multiple": false, + "simpleType": "boolean", + }, + "snapshot-build-dependencies-timestamp": Object { + "configs": Array [ + Object { + "description": "Use timestamps of the files/directories to determine invalidation.", + "multiple": false, + "path": "snapshot.buildDependencies.timestamp", + "type": "boolean", + }, + ], + "description": "Use timestamps of the files/directories to determine invalidation.", + "multiple": false, + "simpleType": "boolean", + }, + "snapshot-immutable-paths": Object { + "configs": Array [ + Object { + "description": "A RegExp matching an immutable directory (usually a package manager cache directory, including the tailing slash)", + "multiple": true, + "path": "snapshot.immutablePaths[]", + "type": "RegExp", + }, + Object { + "description": "A path to an immutable directory (usually a package manager cache directory).", + "multiple": true, + "path": "snapshot.immutablePaths[]", + "type": "path", + }, + ], + "description": "A RegExp matching an immutable directory (usually a package manager cache directory, including the tailing slash) A path to an immutable directory (usually a package manager cache directory).", + "multiple": true, + "simpleType": "string", + }, + "snapshot-immutable-paths-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'snapshot.immutablePaths' configuration. List of paths that are managed by a package manager and contain a version or hash in its path so all files are immutable.", + "multiple": false, + "path": "snapshot.immutablePaths", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'snapshot.immutablePaths' configuration. List of paths that are managed by a package manager and contain a version or hash in its path so all files are immutable.", + "multiple": false, + "simpleType": "boolean", + }, + "snapshot-managed-paths": Object { + "configs": Array [ + Object { + "description": "A RegExp matching a managed directory (usually a node_modules directory, including the tailing slash)", + "multiple": true, + "path": "snapshot.managedPaths[]", + "type": "RegExp", + }, + Object { + "description": "A path to a managed directory (usually a node_modules directory).", + "multiple": true, + "path": "snapshot.managedPaths[]", + "type": "path", + }, + ], + "description": "A RegExp matching a managed directory (usually a node_modules directory, including the tailing slash) A path to a managed directory (usually a node_modules directory).", + "multiple": true, + "simpleType": "string", + }, + "snapshot-managed-paths-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'snapshot.managedPaths' configuration. List of paths that are managed by a package manager and can be trusted to not be modified otherwise.", + "multiple": false, + "path": "snapshot.managedPaths", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'snapshot.managedPaths' configuration. List of paths that are managed by a package manager and can be trusted to not be modified otherwise.", + "multiple": false, + "simpleType": "boolean", + }, + "snapshot-module-hash": Object { + "configs": Array [ + Object { + "description": "Use hashes of the content of the files/directories to determine invalidation.", + "multiple": false, + "path": "snapshot.module.hash", + "type": "boolean", + }, + ], + "description": "Use hashes of the content of the files/directories to determine invalidation.", + "multiple": false, + "simpleType": "boolean", + }, + "snapshot-module-timestamp": Object { + "configs": Array [ + Object { + "description": "Use timestamps of the files/directories to determine invalidation.", + "multiple": false, + "path": "snapshot.module.timestamp", + "type": "boolean", + }, + ], + "description": "Use timestamps of the files/directories to determine invalidation.", + "multiple": false, + "simpleType": "boolean", + }, + "snapshot-resolve-build-dependencies-hash": Object { + "configs": Array [ + Object { + "description": "Use hashes of the content of the files/directories to determine invalidation.", + "multiple": false, + "path": "snapshot.resolveBuildDependencies.hash", + "type": "boolean", + }, + ], + "description": "Use hashes of the content of the files/directories to determine invalidation.", + "multiple": false, + "simpleType": "boolean", + }, + "snapshot-resolve-build-dependencies-timestamp": Object { + "configs": Array [ + Object { + "description": "Use timestamps of the files/directories to determine invalidation.", + "multiple": false, + "path": "snapshot.resolveBuildDependencies.timestamp", + "type": "boolean", + }, + ], + "description": "Use timestamps of the files/directories to determine invalidation.", + "multiple": false, + "simpleType": "boolean", + }, + "snapshot-resolve-hash": Object { + "configs": Array [ + Object { + "description": "Use hashes of the content of the files/directories to determine invalidation.", + "multiple": false, + "path": "snapshot.resolve.hash", + "type": "boolean", + }, + ], + "description": "Use hashes of the content of the files/directories to determine invalidation.", + "multiple": false, + "simpleType": "boolean", + }, + "snapshot-resolve-timestamp": Object { + "configs": Array [ + Object { + "description": "Use timestamps of the files/directories to determine invalidation.", + "multiple": false, + "path": "snapshot.resolve.timestamp", + "type": "boolean", + }, + ], + "description": "Use timestamps of the files/directories to determine invalidation.", + "multiple": false, + "simpleType": "boolean", + }, + "snapshot-unmanaged-paths": Object { + "configs": Array [ + Object { + "description": "A RegExp matching an unmanaged directory.", + "multiple": true, + "path": "snapshot.unmanagedPaths[]", + "type": "RegExp", + }, + Object { + "description": "A path to an unmanaged directory.", + "multiple": true, + "path": "snapshot.unmanagedPaths[]", + "type": "path", + }, + ], + "description": "A RegExp matching an unmanaged directory. A path to an unmanaged directory.", + "multiple": true, + "simpleType": "string", + }, + "snapshot-unmanaged-paths-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'snapshot.unmanagedPaths' configuration. List of paths that are not managed by a package manager and the contents are subject to change.", + "multiple": false, + "path": "snapshot.unmanagedPaths", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'snapshot.unmanagedPaths' configuration. List of paths that are not managed by a package manager and the contents are subject to change.", + "multiple": false, + "simpleType": "boolean", + }, + "stats": Object { + "configs": Array [ + Object { + "description": "Stats options object or preset name.", + "multiple": false, + "path": "stats", + "type": "enum", + "values": Array [ + "none", + "summary", + "errors-only", + "errors-warnings", + "minimal", + "normal", + "detailed", + "verbose", + ], + }, + Object { + "description": "Stats options object or preset name.", + "multiple": false, + "path": "stats", + "type": "boolean", + }, + ], + "description": "Stats options object or preset name.", + "multiple": false, + "simpleType": "string", + }, + "stats-all": Object { + "configs": Array [ + Object { + "description": "Fallback value for stats options when an option is not defined (has precedence over local webpack defaults).", + "multiple": false, + "path": "stats.all", + "type": "boolean", + }, + ], + "description": "Fallback value for stats options when an option is not defined (has precedence over local webpack defaults).", + "multiple": false, + "simpleType": "boolean", + }, + "stats-assets": Object { + "configs": Array [ + Object { + "description": "Add assets information.", + "multiple": false, + "path": "stats.assets", + "type": "boolean", + }, + ], + "description": "Add assets information.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-assets-sort": Object { + "configs": Array [ + Object { + "description": "Sort the assets by that field.", + "multiple": false, + "path": "stats.assetsSort", + "type": "enum", + "values": Array [ + false, + ], + }, + Object { + "description": "Sort the assets by that field.", + "multiple": false, + "path": "stats.assetsSort", + "type": "string", + }, + ], + "description": "Sort the assets by that field.", + "multiple": false, + "simpleType": "string", + }, + "stats-assets-space": Object { + "configs": Array [ + Object { + "description": "Space to display assets (groups will be collapsed to fit this space).", + "multiple": false, + "path": "stats.assetsSpace", + "type": "number", + }, + ], + "description": "Space to display assets (groups will be collapsed to fit this space).", + "multiple": false, + "simpleType": "number", + }, + "stats-built-at": Object { + "configs": Array [ + Object { + "description": "Add built at time information.", + "multiple": false, + "path": "stats.builtAt", + "type": "boolean", + }, + ], + "description": "Add built at time information.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-cached": Object { + "configs": Array [ + Object { + "description": "Add information about cached (not built) modules (deprecated: use 'cachedModules' instead).", + "multiple": false, + "path": "stats.cached", + "type": "boolean", + }, + ], + "description": "Add information about cached (not built) modules (deprecated: use 'cachedModules' instead).", + "multiple": false, + "simpleType": "boolean", + }, + "stats-cached-assets": Object { + "configs": Array [ + Object { + "description": "Show cached assets (setting this to \`false\` only shows emitted files).", + "multiple": false, + "path": "stats.cachedAssets", + "type": "boolean", + }, + ], + "description": "Show cached assets (setting this to \`false\` only shows emitted files).", + "multiple": false, + "simpleType": "boolean", + }, + "stats-cached-modules": Object { + "configs": Array [ + Object { + "description": "Add information about cached (not built) modules.", + "multiple": false, + "path": "stats.cachedModules", + "type": "boolean", + }, + ], + "description": "Add information about cached (not built) modules.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-children": Object { + "configs": Array [ + Object { + "description": "Add children information.", + "multiple": false, + "path": "stats.children", + "type": "boolean", + }, + ], + "description": "Add children information.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-chunk-group-auxiliary": Object { + "configs": Array [ + Object { + "description": "Display auxiliary assets in chunk groups.", + "multiple": false, + "path": "stats.chunkGroupAuxiliary", + "type": "boolean", + }, + ], + "description": "Display auxiliary assets in chunk groups.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-chunk-group-children": Object { + "configs": Array [ + Object { + "description": "Display children of chunk groups.", + "multiple": false, + "path": "stats.chunkGroupChildren", + "type": "boolean", + }, + ], + "description": "Display children of chunk groups.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-chunk-group-max-assets": Object { + "configs": Array [ + Object { + "description": "Limit of assets displayed in chunk groups.", + "multiple": false, + "path": "stats.chunkGroupMaxAssets", + "type": "number", + }, + ], + "description": "Limit of assets displayed in chunk groups.", + "multiple": false, + "simpleType": "number", + }, + "stats-chunk-groups": Object { + "configs": Array [ + Object { + "description": "Display all chunk groups with the corresponding bundles.", + "multiple": false, + "path": "stats.chunkGroups", + "type": "boolean", + }, + ], + "description": "Display all chunk groups with the corresponding bundles.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-chunk-modules": Object { + "configs": Array [ + Object { + "description": "Add built modules information to chunk information.", + "multiple": false, + "path": "stats.chunkModules", + "type": "boolean", + }, + ], + "description": "Add built modules information to chunk information.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-chunk-modules-space": Object { + "configs": Array [ + Object { + "description": "Space to display chunk modules (groups will be collapsed to fit this space, value is in number of modules/group).", + "multiple": false, + "path": "stats.chunkModulesSpace", + "type": "number", + }, + ], + "description": "Space to display chunk modules (groups will be collapsed to fit this space, value is in number of modules/group).", + "multiple": false, + "simpleType": "number", + }, + "stats-chunk-origins": Object { + "configs": Array [ + Object { + "description": "Add the origins of chunks and chunk merging info.", + "multiple": false, + "path": "stats.chunkOrigins", + "type": "boolean", + }, + ], + "description": "Add the origins of chunks and chunk merging info.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-chunk-relations": Object { + "configs": Array [ + Object { + "description": "Add information about parent, children and sibling chunks to chunk information.", + "multiple": false, + "path": "stats.chunkRelations", + "type": "boolean", + }, + ], + "description": "Add information about parent, children and sibling chunks to chunk information.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-chunks": Object { + "configs": Array [ + Object { + "description": "Add chunk information.", + "multiple": false, + "path": "stats.chunks", + "type": "boolean", + }, + ], + "description": "Add chunk information.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-chunks-sort": Object { + "configs": Array [ + Object { + "description": "Sort the chunks by that field.", + "multiple": false, + "path": "stats.chunksSort", + "type": "enum", + "values": Array [ + false, + ], + }, + Object { + "description": "Sort the chunks by that field.", + "multiple": false, + "path": "stats.chunksSort", + "type": "string", + }, + ], + "description": "Sort the chunks by that field.", + "multiple": false, + "simpleType": "string", + }, + "stats-colors": Object { + "configs": Array [ + Object { + "description": "Enables/Disables colorful output.", + "multiple": false, + "path": "stats.colors", + "type": "boolean", + }, + ], + "description": "Enables/Disables colorful output.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-colors-bold": Object { + "configs": Array [ + Object { + "description": "Custom color for bold text.", + "multiple": false, + "path": "stats.colors.bold", + "type": "string", + }, + ], + "description": "Custom color for bold text.", + "multiple": false, + "simpleType": "string", + }, + "stats-colors-cyan": Object { + "configs": Array [ + Object { + "description": "Custom color for cyan text.", + "multiple": false, + "path": "stats.colors.cyan", + "type": "string", + }, + ], + "description": "Custom color for cyan text.", + "multiple": false, + "simpleType": "string", + }, + "stats-colors-green": Object { + "configs": Array [ + Object { + "description": "Custom color for green text.", + "multiple": false, + "path": "stats.colors.green", + "type": "string", + }, + ], + "description": "Custom color for green text.", + "multiple": false, + "simpleType": "string", + }, + "stats-colors-magenta": Object { + "configs": Array [ + Object { + "description": "Custom color for magenta text.", + "multiple": false, + "path": "stats.colors.magenta", + "type": "string", + }, + ], + "description": "Custom color for magenta text.", + "multiple": false, + "simpleType": "string", + }, + "stats-colors-red": Object { + "configs": Array [ + Object { + "description": "Custom color for red text.", + "multiple": false, + "path": "stats.colors.red", + "type": "string", + }, + ], + "description": "Custom color for red text.", + "multiple": false, + "simpleType": "string", + }, + "stats-colors-yellow": Object { + "configs": Array [ + Object { + "description": "Custom color for yellow text.", + "multiple": false, + "path": "stats.colors.yellow", + "type": "string", + }, + ], + "description": "Custom color for yellow text.", + "multiple": false, + "simpleType": "string", + }, + "stats-context": Object { + "configs": Array [ + Object { + "description": "Context directory for request shortening.", + "multiple": false, + "path": "stats.context", + "type": "path", + }, + ], + "description": "Context directory for request shortening.", + "multiple": false, + "simpleType": "string", + }, + "stats-dependent-modules": Object { + "configs": Array [ + Object { + "description": "Show chunk modules that are dependencies of other modules of the chunk.", + "multiple": false, + "path": "stats.dependentModules", + "type": "boolean", + }, + ], + "description": "Show chunk modules that are dependencies of other modules of the chunk.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-depth": Object { + "configs": Array [ + Object { + "description": "Add module depth in module graph.", + "multiple": false, + "path": "stats.depth", + "type": "boolean", + }, + ], + "description": "Add module depth in module graph.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-entrypoints": Object { + "configs": Array [ + Object { + "description": "Display the entry points with the corresponding bundles.", + "multiple": false, + "path": "stats.entrypoints", + "type": "enum", + "values": Array [ + "auto", + ], + }, + Object { + "description": "Display the entry points with the corresponding bundles.", + "multiple": false, + "path": "stats.entrypoints", + "type": "boolean", + }, + ], + "description": "Display the entry points with the corresponding bundles.", + "multiple": false, + "simpleType": "string", + }, + "stats-env": Object { + "configs": Array [ + Object { + "description": "Add --env information.", + "multiple": false, + "path": "stats.env", + "type": "boolean", + }, + ], + "description": "Add --env information.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-error-cause": Object { + "configs": Array [ + Object { + "description": "Add cause to errors.", + "multiple": false, + "path": "stats.errorCause", + "type": "enum", + "values": Array [ + "auto", + ], + }, + Object { + "description": "Add cause to errors.", + "multiple": false, + "path": "stats.errorCause", + "type": "boolean", + }, + ], + "description": "Add cause to errors.", + "multiple": false, + "simpleType": "string", + }, + "stats-error-details": Object { + "configs": Array [ + Object { + "description": "Add details to errors (like resolving log).", + "multiple": false, + "path": "stats.errorDetails", + "type": "enum", + "values": Array [ + "auto", + ], + }, + Object { + "description": "Add details to errors (like resolving log).", + "multiple": false, + "path": "stats.errorDetails", + "type": "boolean", + }, + ], + "description": "Add details to errors (like resolving log).", + "multiple": false, + "simpleType": "string", + }, + "stats-error-errors": Object { + "configs": Array [ + Object { + "description": "Add nested errors to errors (like in AggregateError).", + "multiple": false, + "path": "stats.errorErrors", + "type": "enum", + "values": Array [ + "auto", + ], + }, + Object { + "description": "Add nested errors to errors (like in AggregateError).", + "multiple": false, + "path": "stats.errorErrors", + "type": "boolean", + }, + ], + "description": "Add nested errors to errors (like in AggregateError).", + "multiple": false, + "simpleType": "string", + }, + "stats-error-stack": Object { + "configs": Array [ + Object { + "description": "Add internal stack trace to errors.", + "multiple": false, + "path": "stats.errorStack", + "type": "boolean", + }, + ], + "description": "Add internal stack trace to errors.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-errors": Object { + "configs": Array [ + Object { + "description": "Add errors.", + "multiple": false, + "path": "stats.errors", + "type": "boolean", + }, + ], + "description": "Add errors.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-errors-count": Object { + "configs": Array [ + Object { + "description": "Add errors count.", + "multiple": false, + "path": "stats.errorsCount", + "type": "boolean", + }, + ], + "description": "Add errors count.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-errors-space": Object { + "configs": Array [ + Object { + "description": "Space to display errors (value is in number of lines).", + "multiple": false, + "path": "stats.errorsSpace", + "type": "number", + }, + ], + "description": "Space to display errors (value is in number of lines).", + "multiple": false, + "simpleType": "number", + }, + "stats-exclude-assets": Object { + "configs": Array [ + Object { + "description": "Suppress assets that match the specified filters. Filters can be Strings, RegExps or Functions.", + "multiple": true, + "path": "stats.excludeAssets[]", + "type": "RegExp", + }, + Object { + "description": "Suppress assets that match the specified filters. Filters can be Strings, RegExps or Functions.", + "multiple": true, + "path": "stats.excludeAssets[]", + "type": "string", + }, + ], + "description": "Suppress assets that match the specified filters. Filters can be Strings, RegExps or Functions.", + "multiple": true, + "simpleType": "string", + }, + "stats-exclude-assets-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'stats.excludeAssets' configuration. Suppress assets that match the specified filters. Filters can be Strings, RegExps or Functions.", + "multiple": false, + "path": "stats.excludeAssets", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'stats.excludeAssets' configuration. Suppress assets that match the specified filters. Filters can be Strings, RegExps or Functions.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-exclude-modules": Object { + "configs": Array [ + Object { + "description": "Suppress modules that match the specified filters. Filters can be Strings, RegExps, Booleans or Functions.", + "multiple": false, + "path": "stats.excludeModules", + "type": "boolean", + }, + Object { + "description": "Suppress modules that match the specified filters. Filters can be Strings, RegExps, Booleans or Functions.", + "multiple": true, + "path": "stats.excludeModules[]", + "type": "RegExp", + }, + Object { + "description": "Suppress modules that match the specified filters. Filters can be Strings, RegExps, Booleans or Functions.", + "multiple": true, + "path": "stats.excludeModules[]", + "type": "string", + }, + ], + "description": "Suppress modules that match the specified filters. Filters can be Strings, RegExps, Booleans or Functions.", + "multiple": true, + "simpleType": "string", + }, + "stats-exclude-modules-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'stats.excludeModules' configuration. Suppress modules that match the specified filters. Filters can be Strings, RegExps, Booleans or Functions.", + "multiple": false, + "path": "stats.excludeModules", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'stats.excludeModules' configuration. Suppress modules that match the specified filters. Filters can be Strings, RegExps, Booleans or Functions.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-group-assets-by-chunk": Object { + "configs": Array [ + Object { + "description": "Group assets by how their are related to chunks.", + "multiple": false, + "path": "stats.groupAssetsByChunk", + "type": "boolean", + }, + ], + "description": "Group assets by how their are related to chunks.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-group-assets-by-emit-status": Object { + "configs": Array [ + Object { + "description": "Group assets by their status (emitted, compared for emit or cached).", + "multiple": false, + "path": "stats.groupAssetsByEmitStatus", + "type": "boolean", + }, + ], + "description": "Group assets by their status (emitted, compared for emit or cached).", + "multiple": false, + "simpleType": "boolean", + }, + "stats-group-assets-by-extension": Object { + "configs": Array [ + Object { + "description": "Group assets by their extension.", + "multiple": false, + "path": "stats.groupAssetsByExtension", + "type": "boolean", + }, + ], + "description": "Group assets by their extension.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-group-assets-by-info": Object { + "configs": Array [ + Object { + "description": "Group assets by their asset info (immutable, development, hotModuleReplacement, etc).", + "multiple": false, + "path": "stats.groupAssetsByInfo", + "type": "boolean", + }, + ], + "description": "Group assets by their asset info (immutable, development, hotModuleReplacement, etc).", + "multiple": false, + "simpleType": "boolean", + }, + "stats-group-assets-by-path": Object { + "configs": Array [ + Object { + "description": "Group assets by their path.", + "multiple": false, + "path": "stats.groupAssetsByPath", + "type": "boolean", + }, + ], + "description": "Group assets by their path.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-group-modules-by-attributes": Object { + "configs": Array [ + Object { + "description": "Group modules by their attributes (errors, warnings, assets, optional, orphan, or dependent).", + "multiple": false, + "path": "stats.groupModulesByAttributes", + "type": "boolean", + }, + ], + "description": "Group modules by their attributes (errors, warnings, assets, optional, orphan, or dependent).", + "multiple": false, + "simpleType": "boolean", + }, + "stats-group-modules-by-cache-status": Object { + "configs": Array [ + Object { + "description": "Group modules by their status (cached or built and cacheable).", + "multiple": false, + "path": "stats.groupModulesByCacheStatus", + "type": "boolean", + }, + ], + "description": "Group modules by their status (cached or built and cacheable).", + "multiple": false, + "simpleType": "boolean", + }, + "stats-group-modules-by-extension": Object { + "configs": Array [ + Object { + "description": "Group modules by their extension.", + "multiple": false, + "path": "stats.groupModulesByExtension", + "type": "boolean", + }, + ], + "description": "Group modules by their extension.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-group-modules-by-layer": Object { + "configs": Array [ + Object { + "description": "Group modules by their layer.", + "multiple": false, + "path": "stats.groupModulesByLayer", + "type": "boolean", + }, + ], + "description": "Group modules by their layer.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-group-modules-by-path": Object { + "configs": Array [ + Object { + "description": "Group modules by their path.", + "multiple": false, + "path": "stats.groupModulesByPath", + "type": "boolean", + }, + ], + "description": "Group modules by their path.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-group-modules-by-type": Object { + "configs": Array [ + Object { + "description": "Group modules by their type.", + "multiple": false, + "path": "stats.groupModulesByType", + "type": "boolean", + }, + ], + "description": "Group modules by their type.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-group-reasons-by-origin": Object { + "configs": Array [ + Object { + "description": "Group reasons by their origin module.", + "multiple": false, + "path": "stats.groupReasonsByOrigin", + "type": "boolean", + }, + ], + "description": "Group reasons by their origin module.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-hash": Object { + "configs": Array [ + Object { + "description": "Add the hash of the compilation.", + "multiple": false, + "path": "stats.hash", + "type": "boolean", + }, + ], + "description": "Add the hash of the compilation.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-ids": Object { + "configs": Array [ + Object { + "description": "Add ids.", + "multiple": false, + "path": "stats.ids", + "type": "boolean", + }, + ], + "description": "Add ids.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-logging": Object { + "configs": Array [ + Object { + "description": "Specify log level of logging output.", + "multiple": false, + "path": "stats.logging", + "type": "enum", + "values": Array [ + "none", + "error", + "warn", + "info", + "log", + "verbose", + ], + }, + Object { + "description": "Enable/disable logging output (\`true\`: shows normal logging output, loglevel: log).", + "multiple": false, + "path": "stats.logging", + "type": "boolean", + }, + ], + "description": "Specify log level of logging output. Enable/disable logging output (\`true\`: shows normal logging output, loglevel: log).", + "multiple": false, + "simpleType": "string", + }, + "stats-logging-debug": Object { + "configs": Array [ + Object { + "description": "Enable/Disable debug logging for all loggers.", + "multiple": false, + "path": "stats.loggingDebug", + "type": "boolean", + }, + Object { + "description": "Include debug logging of specified loggers (i. e. for plugins or loaders). Filters can be Strings, RegExps or Functions.", + "multiple": true, + "path": "stats.loggingDebug[]", + "type": "RegExp", + }, + Object { + "description": "Include debug logging of specified loggers (i. e. for plugins or loaders). Filters can be Strings, RegExps or Functions.", + "multiple": true, + "path": "stats.loggingDebug[]", + "type": "string", + }, + ], + "description": "Enable/Disable debug logging for all loggers. Include debug logging of specified loggers (i. e. for plugins or loaders). Filters can be Strings, RegExps or Functions.", + "multiple": true, + "simpleType": "string", + }, + "stats-logging-debug-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'stats.loggingDebug' configuration. Include debug logging of specified loggers (i. e. for plugins or loaders). Filters can be Strings, RegExps or Functions.", + "multiple": false, + "path": "stats.loggingDebug", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'stats.loggingDebug' configuration. Include debug logging of specified loggers (i. e. for plugins or loaders). Filters can be Strings, RegExps or Functions.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-logging-trace": Object { + "configs": Array [ + Object { + "description": "Add stack traces to logging output.", + "multiple": false, + "path": "stats.loggingTrace", + "type": "boolean", + }, + ], + "description": "Add stack traces to logging output.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-module-assets": Object { + "configs": Array [ + Object { + "description": "Add information about assets inside modules.", + "multiple": false, + "path": "stats.moduleAssets", + "type": "boolean", + }, + ], + "description": "Add information about assets inside modules.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-module-trace": Object { + "configs": Array [ + Object { + "description": "Add dependencies and origin of warnings/errors.", + "multiple": false, + "path": "stats.moduleTrace", + "type": "boolean", + }, + ], + "description": "Add dependencies and origin of warnings/errors.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-modules": Object { + "configs": Array [ + Object { + "description": "Add built modules information.", + "multiple": false, + "path": "stats.modules", + "type": "boolean", + }, + ], + "description": "Add built modules information.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-modules-sort": Object { + "configs": Array [ + Object { + "description": "Sort the modules by that field.", + "multiple": false, + "path": "stats.modulesSort", + "type": "enum", + "values": Array [ + false, + ], + }, + Object { + "description": "Sort the modules by that field.", + "multiple": false, + "path": "stats.modulesSort", + "type": "string", + }, + ], + "description": "Sort the modules by that field.", + "multiple": false, + "simpleType": "string", + }, + "stats-modules-space": Object { + "configs": Array [ + Object { + "description": "Space to display modules (groups will be collapsed to fit this space, value is in number of modules/groups).", + "multiple": false, + "path": "stats.modulesSpace", + "type": "number", + }, + ], + "description": "Space to display modules (groups will be collapsed to fit this space, value is in number of modules/groups).", + "multiple": false, + "simpleType": "number", + }, + "stats-nested-modules": Object { + "configs": Array [ + Object { + "description": "Add information about modules nested in other modules (like with module concatenation).", + "multiple": false, + "path": "stats.nestedModules", + "type": "boolean", + }, + ], + "description": "Add information about modules nested in other modules (like with module concatenation).", + "multiple": false, + "simpleType": "boolean", + }, + "stats-nested-modules-space": Object { + "configs": Array [ + Object { + "description": "Space to display modules nested within other modules (groups will be collapsed to fit this space, value is in number of modules/group).", + "multiple": false, + "path": "stats.nestedModulesSpace", + "type": "number", + }, + ], + "description": "Space to display modules nested within other modules (groups will be collapsed to fit this space, value is in number of modules/group).", + "multiple": false, + "simpleType": "number", + }, + "stats-optimization-bailout": Object { + "configs": Array [ + Object { + "description": "Show reasons why optimization bailed out for modules.", + "multiple": false, + "path": "stats.optimizationBailout", + "type": "boolean", + }, + ], + "description": "Show reasons why optimization bailed out for modules.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-orphan-modules": Object { + "configs": Array [ + Object { + "description": "Add information about orphan modules.", + "multiple": false, + "path": "stats.orphanModules", + "type": "boolean", + }, + ], + "description": "Add information about orphan modules.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-output-path": Object { + "configs": Array [ + Object { + "description": "Add output path information.", + "multiple": false, + "path": "stats.outputPath", + "type": "boolean", + }, + ], + "description": "Add output path information.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-performance": Object { + "configs": Array [ + Object { + "description": "Add performance hint flags.", + "multiple": false, + "path": "stats.performance", + "type": "boolean", + }, + ], + "description": "Add performance hint flags.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-preset": Object { + "configs": Array [ + Object { + "description": "Preset for the default values.", + "multiple": false, + "path": "stats.preset", + "type": "boolean", + }, + Object { + "description": "Preset for the default values.", + "multiple": false, + "path": "stats.preset", + "type": "string", + }, + ], + "description": "Preset for the default values.", + "multiple": false, + "simpleType": "string", + }, + "stats-provided-exports": Object { + "configs": Array [ + Object { + "description": "Show exports provided by modules.", + "multiple": false, + "path": "stats.providedExports", + "type": "boolean", + }, + ], + "description": "Show exports provided by modules.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-public-path": Object { + "configs": Array [ + Object { + "description": "Add public path information.", + "multiple": false, + "path": "stats.publicPath", + "type": "boolean", + }, + ], + "description": "Add public path information.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-reasons": Object { + "configs": Array [ + Object { + "description": "Add information about the reasons why modules are included.", + "multiple": false, + "path": "stats.reasons", + "type": "boolean", + }, + ], + "description": "Add information about the reasons why modules are included.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-reasons-space": Object { + "configs": Array [ + Object { + "description": "Space to display reasons (groups will be collapsed to fit this space).", + "multiple": false, + "path": "stats.reasonsSpace", + "type": "number", + }, + ], + "description": "Space to display reasons (groups will be collapsed to fit this space).", + "multiple": false, + "simpleType": "number", + }, + "stats-related-assets": Object { + "configs": Array [ + Object { + "description": "Add information about assets that are related to other assets (like SourceMaps for assets).", + "multiple": false, + "path": "stats.relatedAssets", + "type": "boolean", + }, + ], + "description": "Add information about assets that are related to other assets (like SourceMaps for assets).", + "multiple": false, + "simpleType": "boolean", + }, + "stats-runtime": Object { + "configs": Array [ + Object { + "description": "Add information about runtime modules (deprecated: use 'runtimeModules' instead).", + "multiple": false, + "path": "stats.runtime", + "type": "boolean", + }, + ], + "description": "Add information about runtime modules (deprecated: use 'runtimeModules' instead).", + "multiple": false, + "simpleType": "boolean", + }, + "stats-runtime-modules": Object { + "configs": Array [ + Object { + "description": "Add information about runtime modules.", + "multiple": false, + "path": "stats.runtimeModules", + "type": "boolean", + }, + ], + "description": "Add information about runtime modules.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-source": Object { + "configs": Array [ + Object { + "description": "Add the source code of modules.", + "multiple": false, + "path": "stats.source", + "type": "boolean", + }, + ], + "description": "Add the source code of modules.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-timings": Object { + "configs": Array [ + Object { + "description": "Add timing information.", + "multiple": false, + "path": "stats.timings", + "type": "boolean", + }, + ], + "description": "Add timing information.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-used-exports": Object { + "configs": Array [ + Object { + "description": "Show exports used by modules.", + "multiple": false, + "path": "stats.usedExports", + "type": "boolean", + }, + ], + "description": "Show exports used by modules.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-version": Object { + "configs": Array [ + Object { + "description": "Add webpack version information.", + "multiple": false, + "path": "stats.version", + "type": "boolean", + }, + ], + "description": "Add webpack version information.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-warnings": Object { + "configs": Array [ + Object { + "description": "Add warnings.", + "multiple": false, + "path": "stats.warnings", + "type": "boolean", + }, + ], + "description": "Add warnings.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-warnings-count": Object { + "configs": Array [ + Object { + "description": "Add warnings count.", + "multiple": false, + "path": "stats.warningsCount", + "type": "boolean", + }, + ], + "description": "Add warnings count.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-warnings-filter": Object { + "configs": Array [ + Object { + "description": "Suppress listing warnings that match the specified filters (they will still be counted). Filters can be Strings, RegExps or Functions.", + "multiple": true, + "path": "stats.warningsFilter[]", + "type": "RegExp", + }, + Object { + "description": "Suppress listing warnings that match the specified filters (they will still be counted). Filters can be Strings, RegExps or Functions.", + "multiple": true, + "path": "stats.warningsFilter[]", + "type": "string", + }, + ], + "description": "Suppress listing warnings that match the specified filters (they will still be counted). Filters can be Strings, RegExps or Functions.", + "multiple": true, + "simpleType": "string", + }, + "stats-warnings-filter-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'stats.warningsFilter' configuration. Suppress listing warnings that match the specified filters (they will still be counted). Filters can be Strings, RegExps or Functions.", + "multiple": false, + "path": "stats.warningsFilter", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'stats.warningsFilter' configuration. Suppress listing warnings that match the specified filters (they will still be counted). Filters can be Strings, RegExps or Functions.", + "multiple": false, + "simpleType": "boolean", + }, + "stats-warnings-space": Object { + "configs": Array [ + Object { + "description": "Space to display warnings (value is in number of lines).", + "multiple": false, + "path": "stats.warningsSpace", + "type": "number", + }, + ], + "description": "Space to display warnings (value is in number of lines).", + "multiple": false, + "simpleType": "number", + }, + "target": Object { + "configs": Array [ + Object { + "description": "Environment to build for.", + "multiple": true, + "path": "target[]", + "type": "string", + }, + Object { + "description": "Environment to build for. An array of environments to build for all of them when possible.", + "multiple": false, + "path": "target", + "type": "enum", + "values": Array [ + false, + ], + }, + ], + "description": "Environment to build for. Environment to build for. An array of environments to build for all of them when possible.", + "multiple": true, + "simpleType": "string", + }, + "target-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'target' configuration. Environment to build for. An array of environments to build for all of them when possible.", + "multiple": false, + "path": "target", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'target' configuration. Environment to build for. An array of environments to build for all of them when possible.", + "multiple": false, + "simpleType": "boolean", + }, + "watch": Object { + "configs": Array [ + Object { + "description": "Enter watch mode, which rebuilds on file change.", + "multiple": false, + "path": "watch", + "type": "boolean", + }, + ], + "description": "Enter watch mode, which rebuilds on file change.", + "multiple": false, + "simpleType": "boolean", + }, + "watch-options-aggregate-timeout": Object { + "configs": Array [ + Object { + "description": "Delay the rebuilt after the first change. Value is a time in ms.", + "multiple": false, + "path": "watchOptions.aggregateTimeout", + "type": "number", + }, + ], + "description": "Delay the rebuilt after the first change. Value is a time in ms.", + "multiple": false, + "simpleType": "number", + }, + "watch-options-follow-symlinks": Object { + "configs": Array [ + Object { + "description": "Resolve symlinks and watch symlink and real file. This is usually not needed as webpack already resolves symlinks ('resolve.symlinks').", + "multiple": false, + "path": "watchOptions.followSymlinks", + "type": "boolean", + }, + ], + "description": "Resolve symlinks and watch symlink and real file. This is usually not needed as webpack already resolves symlinks ('resolve.symlinks').", + "multiple": false, + "simpleType": "boolean", + }, + "watch-options-ignored": Object { + "configs": Array [ + Object { + "description": "A glob pattern for files that should be ignored from watching.", + "multiple": true, + "path": "watchOptions.ignored[]", + "type": "string", + }, + Object { + "description": "Ignore some files from watching (glob pattern or regexp).", + "multiple": false, + "path": "watchOptions.ignored", + "type": "RegExp", + }, + ], + "description": "A glob pattern for files that should be ignored from watching. Ignore some files from watching (glob pattern or regexp).", + "multiple": true, + "simpleType": "string", + }, + "watch-options-ignored-reset": Object { + "configs": Array [ + Object { + "description": "Clear all items provided in 'watchOptions.ignored' configuration. Ignore some files from watching (glob pattern or regexp).", + "multiple": false, + "path": "watchOptions.ignored", + "type": "reset", + }, + ], + "description": "Clear all items provided in 'watchOptions.ignored' configuration. Ignore some files from watching (glob pattern or regexp).", + "multiple": false, + "simpleType": "boolean", + }, + "watch-options-poll": Object { + "configs": Array [ + Object { + "description": "\`number\`: use polling with specified interval.", + "multiple": false, + "path": "watchOptions.poll", + "type": "number", + }, + Object { + "description": "\`true\`: use polling.", + "multiple": false, + "path": "watchOptions.poll", + "type": "boolean", + }, + ], + "description": "\`number\`: use polling with specified interval. \`true\`: use polling.", + "multiple": false, + "simpleType": "string", + }, + "watch-options-stdin": Object { + "configs": Array [ + Object { + "description": "Stop watching when stdin stream has ended.", + "multiple": false, + "path": "watchOptions.stdin", + "type": "boolean", + }, + ], + "description": "Stop watching when stdin stream has ended.", + "multiple": false, + "simpleType": "boolean", + }, +} +`; + +exports[`Cli should generate the correct cli flags with custom schema 1`] = ` +Object { + "with-both-cli-and-negative-description": Object { + "configs": Array [ + Object { + "description": "description for CLI option", + "multiple": false, + "negatedDescription": "custom negative description", + "path": "with-both-cli-and-negative-description", + "type": "boolean", + }, + ], + "description": "description for CLI option", + "multiple": false, + "simpleType": "boolean", + }, + "with-cli-description": Object { + "configs": Array [ + Object { + "description": "description for CLI option", + "multiple": false, + "path": "with-cli-description", + "type": "string", + }, + ], + "description": "description for CLI option", + "multiple": false, + "simpleType": "string", + }, + "with-negative-description": Object { + "configs": Array [ + Object { + "description": "original description", + "multiple": false, + "negatedDescription": "custom negative description", + "path": "with-negative-description", + "type": "boolean", + }, + ], + "description": "original description", + "multiple": false, + "simpleType": "boolean", + }, + "with-reset-description": Object { + "configs": Array [ + Object { + "description": "original description", + "multiple": true, + "path": "with-reset-description[]", + "type": "string", + }, + ], + "description": "original description", + "multiple": true, + "simpleType": "string", + }, + "with-reset-description-reset": Object { + "configs": Array [ + Object { + "description": "custom reset", + "multiple": false, + "path": "with-reset-description", + "type": "reset", + }, + ], + "description": "custom reset", + "multiple": false, + "simpleType": "boolean", + }, +} +`; diff --git a/test/__snapshots__/ConfigCacheTestCases.longtest.js.snap b/test/__snapshots__/ConfigCacheTestCases.longtest.js.snap new file mode 100644 index 00000000000..621780614b7 --- /dev/null +++ b/test/__snapshots__/ConfigCacheTestCases.longtest.js.snap @@ -0,0 +1,10140 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ConfigCacheTestCases css build-http exported tests should work with URLs in CSS 1`] = ` +Array [ + "/*!*******************************************************************************************************************!*\\\\ + !*** css https://raw.githubusercontent.com/webpack/webpack/refs/heads/main/test/configCases/css/import/print.css ***! + \\\\*******************************************************************************************************************/ +body { + background: black; +} + +/*!***********************!*\\\\ + !*** css ./style.css ***! + \\\\***********************/ + +div { + background: url(09a1a1112c577c279435.png) +} + +", +] +`; + +exports[`ConfigCacheTestCases css css-modules exported tests should allow to create css modules: dev 1`] = ` +Object { + "UsedClassName": "_identifiers_module_css-UsedClassName", + "VARS": "--_style_module_css-LOCAL-COLOR _style_module_css-VARS undefined _style_module_css-globalVarsUpperCase", + "animation": "_style_module_css-animation", + "animationName": "_style_module_css-animationName", + "class": "_style_module_css-class", + "classInContainer": "_style_module_css-class-in-container", + "classLocalScope": "_style_module_css-class-local-scope", + "cssModuleWithCustomFileExtension": "_style_module_my-css-myCssClass", + "currentWmultiParams": "_style_module_css-local12", + "deepClassInContainer": "_style_module_css-deep-class-in-container", + "displayFlexInSupportsInMediaUpperCase": "_style_module_css-displayFlexInSupportsInMediaUpperCase", + "exportLocalVarsShouldCleanup": "false false", + "futureWmultiParams": "_style_module_css-local14", + "global": undefined, + "hasWmultiParams": "_style_module_css-local11", + "ident": "_style_module_css-ident", + "inLocalGlobalScope": "_style_module_css-in-local-global-scope", + "inSupportScope": "_style_module_css-inSupportScope", + "isWmultiParams": "_style_module_css-local8", + "keyframes": "_style_module_css-localkeyframes", + "keyframesUPPERCASE": "_style_module_css-localkeyframesUPPERCASE", + "local": "_style_module_css-local1 _style_module_css-local2 _style_module_css-local3 _style_module_css-local4", + "local2": "_style_module_css-local5 _style_module_css-local6", + "localkeyframes2UPPPERCASE": "_style_module_css-localkeyframes2UPPPERCASE", + "matchesWmultiParams": "_style_module_css-local9", + "media": "_style_module_css-wideScreenClass", + "mediaInSupports": "_style_module_css-displayFlexInMediaInSupports", + "mediaWithOperator": "_style_module_css-narrowScreenClass", + "mozAnimationName": "_style_module_css-mozAnimationName", + "mozAnyWmultiParams": "_style_module_css-local15", + "myColor": "--_style_module_css-my-color", + "nested": "_style_module_css-nested1 undefined _style_module_css-nested3", + "notAValidCssModuleExtension": true, + "notWmultiParams": "_style_module_css-local7", + "paddingLg": "_style_module_css-padding-lg", + "paddingSm": "_style_module_css-padding-sm", + "pastWmultiParams": "_style_module_css-local13", + "supports": "_style_module_css-displayGridInSupports", + "supportsInMedia": "_style_module_css-displayFlexInSupportsInMedia", + "supportsWithOperator": "_style_module_css-floatRightInNegativeSupports", + "vars": "--_style_module_css-local-color _style_module_css-vars undefined _style_module_css-globalVars", + "webkitAnyWmultiParams": "_style_module_css-local16", + "whereWmultiParams": "_style_module_css-local10", +} +`; + +exports[`ConfigCacheTestCases css css-modules exported tests should allow to create css modules: dev 2`] = ` +"/*!*******************************!*\\\\ + !*** css ./colors.module.css ***! + \\\\*******************************/ + + + + + + + + + + + + + + +/*!**************************************!*\\\\ + !*** css ./at-rule-value.module.css ***! + \\\\**************************************/ + + +._at-rule-value_module_css-value-in-class { + color: blue; +} + + + + + + +@media (max-width: 599px) { + abbr:hover { + color: limegreen; + transition-duration: 1s; + } +} + + + +._at-rule-value_module_css-foo { color: red; } + + + +._at-rule-value_module_css-foo { + &._at-rule-value_module_css-bar { color: red; } +} + + + +._at-rule-value_module_css-foo { + @media (min-width: 1024px) { + &._at-rule-value_module_css-bar { color: red; } + } +} + + + +._at-rule-value_module_css-foo { + @media (min-width: 1024px) { + &._at-rule-value_module_css-bar { + @media (min-width: 1024px) { + color: red; + } + } + } +} + + + + +._at-rule-value_module_css-foo { height: 40px; height: 36px; } + + + +._at-rule-value_module_css-colorValue { + color: red; +} + + + +#_at-rule-value_module_css-colorValue-v1 { + color: red; +} + + + +._at-rule-value_module_css-colorValue-v2 > ._at-rule-value_module_css-colorValue-v2 { + color: red; +} + + + +.red { + color: .red; +} + + + +._at-rule-value_module_css-export { + color: blue; +} + + + +._at-rule-value_module_css-foo { color: red; } + + + +._at-rule-value_module_css-foo { color: red; } +._at-rule-value_module_css-bar { color: yellow } + + + + +._at-rule-value_module_css-foo { color: blue; } + + + + +._at-rule-value_module_css-foo { color: blue; } + + + + +._at-rule-value_module_css-class-a { color: red; } + + + + +._at-rule-value_module_css-class-a { margin: calc(base * 2); } + + + + +._at-rule-value_module_css-class-a { content: \\"test-a\\" \\"test-b\\"; } + + + +._at-rule-value_module_css-foo { color: var(--color); } + + + + + + + +._at-rule-value_module_css-foo { + color: red; + background-color: #0f0; + border-top-color: #00ff00; + border-bottom-color: rgba(34, 12, 64, 0.3); + outline-color: hsla(220, 13.0%, 18.0%, 1); +} + + + +._at-rule-value_module_css-foo { color: blue; } +._at-rule-value_module_css-bar { color: red } + + + +._at-rule-value_module_css-foo { box-shadow: 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +._at-rule-value_module_css-foo { color: color(red lightness(50%)); } + + + +:root { --_at-rule-value_module_css-color: red; } + + + +:root { --_at-rule-value_module_css-color: ; } + + + +:root { --_at-rule-value_module_css-color: ; } + + + +:root { --_at-rule-value_module_css-color:/* comment */; } + + + + +._at-rule-value_module_css-override { + color: red; +} + + + + +._at-rule-value_module_css-class { + color: red; + color: red; + color: blue; +} + + + +._at-rule-value_module_css-color { + color: /* test */red/* test */; +} + + + +._at-rule-value_module_css-color { + color: /* test *//* test */red/* test */; +} + + + +._at-rule-value_module_css-foo { box-shadow: 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +._at-rule-value_module_css-foo { box-shadow: 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +._at-rule-value_module_css-foo { box-shadow: /* test */ 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +._at-rule-value_module_css-foo { box-shadow: /* test */0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +._at-rule-value_module_css-foo { box-shadow: 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +._at-rule-value_module_css-foo { box-shadow: /* test */0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +._at-rule-value_module_css-foo { color: blue; } + + + +._at-rule-value_module_css-foo { color: blue; } + + + +._at-rule-value_module_css-foo { color: my-name-q; } + + + + +/*!*********************************************!*\\\\ + !*** css ./var-function-export.modules.css ***! + \\\\*********************************************/ +:root { + --_var-function-export_modules_css-my-var-u1: red; + --_var-function-export_modules_css-my-var-u2: blue; + --_var-function-export_modules_css-not-override-class: black; + --_var-function-export_modules_css-1: red; + --_var-function-export_modules_css---a: red; + --_var-function-export_modules_css-main-bg-color: red; +} + +._var-function-export_modules_css-my-var-u1 { + color: red; +} + +/*!*************************************!*\\\\ + !*** css ./var-function.module.css ***! + \\\\*************************************/ +:root { + --_var-function_module_css-main-bg-color: brown; + --_var-function_module_css-my-var: red; + --_var-function_module_css-my-background: blue; + --_var-function_module_css-my-global: yellow; + --: \\"reserved\\"; + --_var-function_module_css-a: green; +} + +._var-function_module_css-class { + color: var(--_var-function_module_css-main-bg-color); +} + +@property --_var-function_module_css-logo-color { + syntax: \\"\\"; + inherits: false; + initial-value: #c0ffee; +} + +@property -- { + syntax: \\"\\"; + inherits: false; + initial-value: #c0ffee; +} + +._var-function_module_css-class { + color: var(--_var-function_module_css-logo-color); +} + +div { + background-color: var(--_var-function_module_css-box-color); +} + +._var-function_module_css-two { + --_var-function_module_css-box-color: cornflowerblue; +} + +._var-function_module_css-three { + --_var-function_module_css-box-color: aquamarine; +} + + +._var-function_module_css-one { + /* Red if --my-var is not defined */ + color: var(--_var-function_module_css-my-var, red); +} + +._var-function_module_css-two { + /* pink if --my-var and --my-background are not defined */ + color: var(--_var-function_module_css-my-var, var(--_var-function_module_css-my-background, pink)); +} + +._var-function_module_css-reserved { + color: var(--); +} + +._var-function_module_css-green { + color: var(--_var-function_module_css-a); +} + +._var-function_module_css-global { + color: var(--my-global); +} + +._var-function_module_css-global-and-default { + color: var(--my-global, pink); +} + +._var-function_module_css-global-and-default-1 { + color: var(--my-global, var(--my-global-background)); +} + +._var-function_module_css-global-and-default-2 { + color: var(--my-global, var(--my-global-background, pink)); +} + +._var-function_module_css-global-and-default-3 { + color: var(--my-global, var(--_var-function_module_css-my-background, pink)); +} + +._var-function_module_css-global-and-default-5 { + color: var( --my-global,var(--_var-function_module_css-my-background,pink)); +} + +._var-function_module_css-global-and-default-6 { + background: var( --_var-function_module_css-main-bg-color , var( --_var-function_module_css-my-background , pink ) ) , var(--my-global); +} + +._var-function_module_css-global-and-default-7 { + background: var(--_var-function_module_css-main-bg-color,var(--_var-function_module_css-my-background,pink)),var(--my-global); +} + +._var-function_module_css-from { + color: var(--_var-function-export_modules_css-my-var-u1); +} + +._var-function_module_css-from-1 { + color: var(--_var-function_module_css-main-bg-color, var(--_var-function-export_modules_css-my-var-u1)); +} + +._var-function_module_css-from-2 { + color: var(--_var-function-export_modules_css-my-var-u1, var(--_var-function_module_css-main-bg-color)); +} + +._var-function_module_css-from-3 { + color: var(--_var-function-export_modules_css-my-var-u1, var(--_var-function-export_modules_css-my-var-u2)); +} + +._var-function_module_css-from-4 { + color: var(--_var-function-export_modules_css-1); +} + +._var-function_module_css-from-5 { + color: var(--_var-function-export_modules_css---a); +} + +._var-function_module_css-from-6 { + color: var(--_var-function-export_modules_css-main-bg-color); +} + +._var-function_module_css-mixed { + color: var(--_var-function-export_modules_css-my-var-u1, var(--my-global, var(--_var-function_module_css-main-bg-color, red))); +} + +._var-function_module_css-broken { + color: var(--my-global from); +} + +._var-function_module_css-broken-1 { + color: var(--my-global from 1); +} + +:root { + --_var-function_module_css-not-override-class: red; +} + +._var-function_module_css-not-override-class { + color: var(--_var-function-export_modules_css-not-override-class) +} + +/*!******************************!*\\\\ + !*** css ./style.module.css ***! + \\\\******************************/ + +._style_module_css-class { + color: red; +} + +._style_module_css-local1, +._style_module_css-local2 .global, +._style_module_css-local3 { + color: green; +} + +.global ._style_module_css-local4 { + color: yellow; +} + +._style_module_css-local5.global._style_module_css-local6 { + color: blue; +} + +._style_module_css-local7 div:not(._style_module_css-disabled, ._style_module_css-mButtonDisabled, ._style_module_css-tipOnly) { + pointer-events: initial !important; +} + +._style_module_css-local8 :is(div._style_module_css-parent1._style_module_css-child1._style_module_css-vertical-tiny, + div._style_module_css-parent1._style_module_css-child1._style_module_css-vertical-small, + div._style_module_css-otherDiv._style_module_css-horizontal-tiny, + div._style_module_css-otherDiv._style_module_css-horizontal-small div._style_module_css-description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +._style_module_css-local9 :matches(div._style_module_css-parent1._style_module_css-child1._style_module_css-vertical-tiny, + div._style_module_css-parent1._style_module_css-child1._style_module_css-vertical-small, + div._style_module_css-otherDiv._style_module_css-horizontal-tiny, + div._style_module_css-otherDiv._style_module_css-horizontal-small div._style_module_css-description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +._style_module_css-local10 :where(div._style_module_css-parent1._style_module_css-child1._style_module_css-vertical-tiny, + div._style_module_css-parent1._style_module_css-child1._style_module_css-vertical-small, + div._style_module_css-otherDiv._style_module_css-horizontal-tiny, + div._style_module_css-otherDiv._style_module_css-horizontal-small div._style_module_css-description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +._style_module_css-local11 div:has(._style_module_css-disabled, ._style_module_css-mButtonDisabled, ._style_module_css-tipOnly) { + pointer-events: initial !important; +} + +._style_module_css-local12 div:current(p, span) { + background-color: yellow; +} + +._style_module_css-local13 div:past(p, span) { + display: none; +} + +._style_module_css-local14 div:future(p, span) { + background-color: yellow; +} + +._style_module_css-local15 div:-moz-any(ol, ul, menu, dir) { + list-style-type: square; +} + +._style_module_css-local16 li:-webkit-any(:first-child, :last-child) { + background-color: aquamarine; +} + +._style_module_css-local9 :matches(div._style_module_css-parent1._style_module_css-child1._style_module_css-vertical-tiny, + div._style_module_css-parent1._style_module_css-child1._style_module_css-vertical-small, + div._style_module_css-otherDiv._style_module_css-horizontal-tiny, + div._style_module_css-otherDiv._style_module_css-horizontal-small div._style_module_css-description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +._style_module_css-nested1.nested2._style_module_css-nested3 { + color: pink; +} + +#_style_module_css-ident { + color: purple; +} + +@keyframes _style_module_css-localkeyframes { + 0% { + left: var(--_style_module_css-pos1x); + top: var(--_style_module_css-pos1y); + color: var(--theme-color1); + } + 100% { + left: var(--_style_module_css-pos2x); + top: var(--_style_module_css-pos2y); + color: var(--theme-color2); + } +} + +@keyframes _style_module_css-localkeyframes2 { + 0% { + left: 0; + } + 100% { + left: 100px; + } +} + +._style_module_css-animation { + animation-name: _style_module_css-localkeyframes; + animation: 3s ease-in 1s 2 reverse both paused _style_module_css-localkeyframes, _style_module_css-localkeyframes2; + --_style_module_css-pos1x: 0px; + --_style_module_css-pos1y: 0px; + --_style_module_css-pos2x: 10px; + --_style_module_css-pos2y: 20px; +} + +/* .composed { + composes: local1; + composes: local2; +} */ + +._style_module_css-vars { + color: var(--_style_module_css-local-color); + --_style_module_css-local-color: red; +} + +._style_module_css-globalVars { + color: var(--global-color); + --global-color: red; +} + +@media (min-width: 1600px) { + ._style_module_css-wideScreenClass { + color: var(--_style_module_css-local-color); + --_style_module_css-local-color: green; + } +} + +@media screen and (max-width: 600px) { + ._style_module_css-narrowScreenClass { + color: var(--_style_module_css-local-color); + --_style_module_css-local-color: purple; + } +} + +@supports (display: grid) { + ._style_module_css-displayGridInSupports { + display: grid; + } +} + +@supports not (display: grid) { + ._style_module_css-floatRightInNegativeSupports { + float: right; + } +} + +@supports (display: flex) { + @media screen and (min-width: 900px) { + ._style_module_css-displayFlexInMediaInSupports { + display: flex; + } + } +} + +@media screen and (min-width: 900px) { + @supports (display: flex) { + ._style_module_css-displayFlexInSupportsInMedia { + display: flex; + } + } +} + +@MEDIA screen and (min-width: 900px) { + @SUPPORTS (display: flex) { + ._style_module_css-displayFlexInSupportsInMediaUpperCase { + display: flex; + } + } +} + +._style_module_css-animationUpperCase { + ANIMATION-NAME: _style_module_css-localkeyframesUPPERCASE; + ANIMATION: 3s ease-in 1s 2 reverse both paused _style_module_css-localkeyframesUPPERCASE, _style_module_css-localkeyframes2UPPPERCASE; + --_style_module_css-pos1x: 0px; + --_style_module_css-pos1y: 0px; + --_style_module_css-pos2x: 10px; + --_style_module_css-pos2y: 20px; +} + +@KEYFRAMES _style_module_css-localkeyframesUPPERCASE { + 0% { + left: VAR(--_style_module_css-pos1x); + top: VAR(--_style_module_css-pos1y); + color: VAR(--theme-color1); + } + 100% { + left: VAR(--_style_module_css-pos2x); + top: VAR(--_style_module_css-pos2y); + color: VAR(--theme-color2); + } +} + +@KEYframes _style_module_css-localkeyframes2UPPPERCASE { + 0% { + left: 0; + } + 100% { + left: 100px; + } +} + +.globalUpperCase ._style_module_css-localUpperCase { + color: yellow; +} + +._style_module_css-VARS { + color: VAR(--_style_module_css-LOCAL-COLOR); + --_style_module_css-LOCAL-COLOR: red; +} + +._style_module_css-globalVarsUpperCase { + COLOR: VAR(--GLOBAR-COLOR); + --GLOBAR-COLOR: red; +} + +@supports (top: env(safe-area-inset-top, 0)) { + ._style_module_css-inSupportScope { + color: red; + } +} + +._style_module_css-a { + animation: 3s _style_module_css-animationName; + -webkit-animation: 3s _style_module_css-animationName; +} + +._style_module_css-b { + animation: _style_module_css-animationName 3s; + -webkit-animation: _style_module_css-animationName 3s; +} + +._style_module_css-c { + animation-name: _style_module_css-animationName; + -webkit-animation-name: _style_module_css-animationName; +} + +._style_module_css-d { + --_style_module_css-animation-name: animationName; +} + +@keyframes _style_module_css-animationName { + 0% { + background: white; + } + 100% { + background: red; + } +} + +@-webkit-keyframes _style_module_css-animationName { + 0% { + background: white; + } + 100% { + background: red; + } +} + +@-moz-keyframes _style_module_css-mozAnimationName { + 0% { + background: white; + } + 100% { + background: red; + } +} + +@counter-style thumbs { + system: cyclic; + symbols: \\"\\\\1F44D\\"; + suffix: \\" \\"; +} + +@font-feature-values Font One { + @styleset { + nice-style: 12; + } +} + +/* At-rule for \\"nice-style\\" in Font Two */ +@font-feature-values Font Two { + @styleset { + nice-style: 4; + } +} + +@property --_style_module_css-my-color { + syntax: \\"\\"; + inherits: false; + initial-value: #c0ffee; +} + +@property --_style_module_css-my-color-1 { + initial-value: #c0ffee; + syntax: \\"\\"; + inherits: false; +} + +@property --_style_module_css-my-color-2 { + syntax: \\"\\"; + initial-value: #c0ffee; + inherits: false; +} + +._style_module_css-class { + color: var(--_style_module_css-my-color); +} + +@layer utilities { + ._style_module_css-padding-sm { + padding: 0.5rem; + } + + ._style_module_css-padding-lg { + padding: 0.8rem; + } +} + +._style_module_css-class { + color: red; + + ._style_module_css-nested-pure { + color: red; + } + + @media screen and (min-width: 200px) { + color: blue; + + ._style_module_css-nested-media { + color: blue; + } + } + + @supports (display: flex) { + display: flex; + + ._style_module_css-nested-supports { + display: flex; + } + } + + @layer foo { + background: red; + + ._style_module_css-nested-layer { + background: red; + } + } + + @container foo { + background: red; + + ._style_module_css-nested-layer { + background: red; + } + } +} + +._style_module_css-not-selector-inside { + color: #fff; + opacity: 0.12; + padding: .5px; + unknown: :local(.test); + unknown1: :local .test; + unknown2: :global .test; + unknown3: :global .test; + unknown4: .foo, .bar, #bar; +} + +@unknown :local .local :global .global { + color: red; +} + +@unknown :local(.local) :global(.global) { + color: red; +} + +._style_module_css-nested-var { + ._style_module_css-again { + color: var(--_style_module_css-local-color); + } +} + +._style_module_css-nested-with-local-pseudo { + color: red; + + ._style_module_css-local-nested { + color: red; + } + + .global-nested { + color: red; + } + + ._style_module_css-local-nested { + color: red; + } + + .global-nested { + color: red; + } + + ._style_module_css-local-nested, .global-nested-next { + color: red; + } + + ._style_module_css-local-nested, .global-nested-next { + color: red; + } + + .foo, ._style_module_css-bar { + color: red; + } +} + +#_style_module_css-id-foo { + color: red; + + #_style_module_css-id-bar { + color: red; + } +} + +._style_module_css-nested-parens { + ._style_module_css-local9 div:has(._style_module_css-vertical-tiny, ._style_module_css-vertical-small) { + max-height: 0; + margin: 0; + overflow: hidden; + } +} + +.global-foo { + .nested-global { + color: red; + } + + ._style_module_css-local-in-global { + color: blue; + } +} + +@unknown .class { + color: red; + + ._style_module_css-class { + color: red; + } +} + +.class ._style_module_css-in-local-global-scope, +.class ._style_module_css-in-local-global-scope, +._style_module_css-class-local-scope .in-local-global-scope { + color: red; +} + +@container (width > 400px) { + ._style_module_css-class-in-container { + font-size: 1.5em; + } +} + +@container summary (min-width: 400px) { + @container (width > 400px) { + ._style_module_css-deep-class-in-container { + font-size: 1.5em; + } + } +} + +:scope { + color: red; +} + +._style_module_css-placeholder-gray-700:-ms-input-placeholder { + --_style_module_css-placeholder-opacity: 1; + color: #4a5568; + color: rgba(74, 85, 104, var(--_style_module_css-placeholder-opacity)); +} +._style_module_css-placeholder-gray-700::-ms-input-placeholder { + --_style_module_css-placeholder-opacity: 1; + color: #4a5568; + color: rgba(74, 85, 104, var(--_style_module_css-placeholder-opacity)); +} +._style_module_css-placeholder-gray-700::placeholder { + --_style_module_css-placeholder-opacity: 1; + color: #4a5568; + color: rgba(74, 85, 104, var(--_style_module_css-placeholder-opacity)); +} + +:root { + --_style_module_css-test: dark; +} + +@media screen and (prefers-color-scheme: var(--_style_module_css-test)) { + ._style_module_css-baz { + color: white; + } +} + +@keyframes _style_module_css-slidein { + from { + margin-left: 100%; + width: 300%; + } + + to { + margin-left: 0%; + width: 100%; + } +} + +._style_module_css-class { + animation: + foo var(--_style_module_css-animation-name) 3s, + var(--_style_module_css-animation-name) 3s, + 3s linear 1s infinite running _style_module_css-slidein, + 3s linear env(foo, var(--_style_module_css-baz)) infinite running _style_module_css-slidein; +} + +:root { + --_style_module_css-baz: 10px; +} + +._style_module_css-class { + bar: env(foo, var(--_style_module_css-baz)); +} + +.global-foo, ._style_module_css-bar { + ._style_module_css-local-in-global { + color: blue; + } + + @media screen { + .my-global-class-again, + ._style_module_css-my-global-class-again { + color: red; + } + } +} + +._style_module_css-first-nested { + ._style_module_css-first-nested-nested { + color: red; + } +} + +._style_module_css-first-nested-at-rule { + @media screen { + ._style_module_css-first-nested-nested-at-rule-deep { + color: red; + } + } +} + +.again-global { + color:red; +} + +.again-again-global { + .again-again-global { + color: red; + } +} + +:root { + --_style_module_css-foo: red; +} + +.again-again-global { + color: var(--foo); + + .again-again-global { + color: var(--foo); + } +} + +.again-again-global { + animation: slidein 3s; + + .again-again-global, ._style_module_css-class, ._style_module_css-nested1.nested2._style_module_css-nested3 { + animation: _style_module_css-slidein 3s; + } + + ._style_module_css-local2 .global, + ._style_module_css-local3 { + color: red; + } +} + +@unknown var(--_style_module_css-foo) { + color: red; +} + +._style_module_css-class { + ._style_module_css-class { + ._style_module_css-class { + ._style_module_css-class {} + } + } +} + +._style_module_css-class { + ._style_module_css-class { + ._style_module_css-class { + ._style_module_css-class { + animation: _style_module_css-slidein 3s; + } + } + } +} + +._style_module_css-class { + animation: _style_module_css-slidein 3s; + ._style_module_css-class { + animation: _style_module_css-slidein 3s; + ._style_module_css-class { + animation: _style_module_css-slidein 3s; + ._style_module_css-class { + animation: _style_module_css-slidein 3s; + } + } + } +} + +._style_module_css-broken { + . global(._style_module_css-class) { + color: red; + } + + : global(._style_module_css-class) { + color: red; + } + + : global ._style_module_css-class { + color: red; + } + + : local(._style_module_css-class) { + color: red; + } + + : local ._style_module_css-class { + color: red; + } + + # hash { + color: red; + } +} + +._style_module_css-comments { + .class { + color: red; + } + + .class { + color: red; + } + + ._style_module_css-class { + color: red; + } + + ._style_module_css-class { + color: red; + } + + ./** test **/_style_module_css-class { + color: red; + } + + ./** test **/_style_module_css-class { + color: red; + } + + ./** test **/_style_module_css-class { + color: red; + } +} + +._style_module_css-foo { + color: red; + + ._style_module_css-bar + & { color: blue; } +} + +._style_module_css-error, #_style_module_css-err-404 { + &:hover > ._style_module_css-baz { color: red; } +} + +._style_module_css-foo { + & :is(._style_module_css-bar, &._style_module_css-baz) { color: red; } +} + +._style_module_css-qqq { + color: green; + & ._style_module_css-a { color: blue; } + color: red; +} + +._style_module_css-parent { + color: blue; + + @scope (& > ._style_module_css-scope) to (& > ._style_module_css-limit) { + & ._style_module_css-content { + color: red; + } + } +} + +._style_module_css-parent { + color: blue; + + @scope (& > ._style_module_css-scope) to (& > ._style_module_css-limit) { + ._style_module_css-content { + color: red; + } + } + + ._style_module_css-a { + color: red; + } +} + +@scope (._style_module_css-card) { + :scope { border-block-end: 1px solid white; } +} + +._style_module_css-card { + inline-size: 40ch; + aspect-ratio: 3/4; + + @scope (&) { + :scope { + border: 1px solid white; + } + } +} + +._style_module_css-foo { + display: grid; + + @media (orientation: landscape) { + ._style_module_css-bar { + grid-auto-flow: column; + + @media (min-width > 1024px) { + ._style_module_css-baz-1 { + display: grid; + } + + max-inline-size: 1024px; + + ._style_module_css-baz-2 { + display: grid; + } + } + } + } +} + +@counter-style thumbs { + system: cyclic; + symbols: \\"\\\\1F44D\\"; + suffix: \\" \\"; +} + +ul { + list-style: thumbs; +} + +@container (width > 400px) and style(--responsive: true) { + ._style_module_css-class { + font-size: 1.5em; + } +} +/* At-rule for \\"nice-style\\" in Font One */ +@font-feature-values Font One { + @styleset { + nice-style: 12; + } +} + +@font-palette-values --identifier { + font-family: Bixa; +} + +._style_module_css-my-class { + font-palette: --identifier; +} + +@keyframes _style_module_css-foo { /* ... */ } +@keyframes _style_module_css-foo { /* ... */ } +@keyframes { /* ... */ } +@keyframes{ /* ... */ } + +@supports (display: flex) { + @media screen and (min-width: 900px) { + article { + display: flex; + } + } +} + +@starting-style { + ._style_module_css-class { + opacity: 0; + transform: scaleX(0); + } +} + +._style_module_css-class { + opacity: 1; + transform: scaleX(1); + + @starting-style { + opacity: 0; + transform: scaleX(0); + } +} + +@scope (._style_module_css-feature) { + ._style_module_css-class { opacity: 0; } + + :scope ._style_module_css-class-1 { opacity: 0; } + + & ._style_module_css-class { opacity: 0; } +} + +@position-try --custom-left { + position-area: left; + width: 100px; + margin: 0 10px 0 0; +} + +@position-try --custom-bottom { + top: anchor(bottom); + justify-self: anchor-center; + margin: 10px 0 0 0; + position-area: none; +} + +@position-try --custom-right { + left: calc(anchor(right) + 10px); + align-self: anchor-center; + width: 100px; + position-area: none; +} + +@position-try --custom-bottom-right { + position-area: bottom right; + margin: 10px 0 0 10px; +} + +._style_module_css-infobox { + position: fixed; + position-anchor: --myAnchor; + position-area: top; + width: 200px; + margin: 0 0 10px 0; + position-try-fallbacks: + --custom-left, --custom-bottom, + --custom-right, --custom-bottom-right; +} + +@page { + size: 8.5in 9in; + margin-top: 4in; +} + +@color-profile --swop5c { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +._style_module_css-header { + background-color: color(--swop5c 0% 70% 20% 0%); +} + +._style_module_css-test { + test: (1, 2) [3, 4], { 1: 2}; + ._style_module_css-a { + width: 200px; + } +} + +._style_module_css-test { + ._style_module_css-test { + width: 200px; + } +} + +._style_module_css-test { + width: 200px; + + ._style_module_css-test { + width: 200px; + } +} + +._style_module_css-test { + width: 200px; + + ._style_module_css-test { + ._style_module_css-test { + width: 200px; + } + } +} + +._style_module_css-test { + width: 200px; + + ._style_module_css-test { + width: 200px; + + ._style_module_css-test { + width: 200px; + } + } +} + +._style_module_css-test { + ._style_module_css-test { + width: 200px; + + ._style_module_css-test { + width: 200px; + } + } +} + +._style_module_css-test { + ._style_module_css-test { + width: 200px; + } + width: 200px; +} + +._style_module_css-test { + ._style_module_css-test { + width: 200px; + } + ._style_module_css-test { + width: 200px; + } +} + +._style_module_css-test { + ._style_module_css-test { + width: 200px; + } + width: 200px; + ._style_module_css-test { + width: 200px; + } +} + +#_style_module_css-test { + c: 1; + + #_style_module_css-test { + c: 2; + } +} + +@property --_style_module_css-item-size { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} + +._style_module_css-container { + display: flex; + height: 200px; + border: 1px dashed black; + + /* set custom property values on parent */ + --_style_module_css-item-size: 20%; + --_style_module_css-item-color: orange; +} + +._style_module_css-item { + width: var(--_style_module_css-item-size); + height: var(--_style_module_css-item-size); + background-color: var(--_style_module_css-item-color); +} + +._style_module_css-two { + --_style_module_css-item-size: initial; + --_style_module_css-item-color: inherit; +} + +._style_module_css-three { + /* invalid values */ + --_style_module_css-item-size: 1000px; + --_style_module_css-item-color: xyz; +} + +@property invalid { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property{ + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} + +@keyframes _style_module_css-initial { /* ... */ } +@keyframes/**test**/_style_module_css-initial { /* ... */ } +@keyframes/**test**/_style_module_css-initial/**test**/{ /* ... */ } +@keyframes/**test**//**test**/_style_module_css-initial/**test**//**test**/{ /* ... */ } +@keyframes /**test**/ /**test**/ _style_module_css-initial /**test**/ /**test**/ { /* ... */ } +@keyframes _style_module_css-None { /* ... */ } +@property/**test**/--_style_module_css-item-size { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property/**test**/--_style_module_css-item-size/**test**/{ + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property /**test**/--_style_module_css-item-size/**test**/ { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property /**test**/ --_style_module_css-item-size /**test**/ { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property/**test**/ --_style_module_css-item-size /**test**/{ + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property /**test**/ --_style_module_css-item-size /**test**/ { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +div { + animation: 3s ease-in 1s 2 reverse both paused _style_module_css-initial, _style_module_css-localkeyframes2; + animation-name: _style_module_css-initial; + animation-duration: 2s; +} + +._style_module_css-item-1 { + width: var( --_style_module_css-item-size ); + height: var(/**comment**/--_style_module_css-item-size); + background-color: var( /**comment**/--_style_module_css-item-color); + background-color-1: var(/**comment**/ --_style_module_css-item-color); + background-color-2: var( /**comment**/ --_style_module_css-item-color); + background-color-3: var( /**comment**/ --_style_module_css-item-color /**comment**/ ); + background-color-3: var( /**comment**/--_style_module_css-item-color/**comment**/ ); + background-color-3: var(/**comment**/--_style_module_css-item-color/**comment**/); +} + +@keyframes/**test**/_style_module_css-foo { /* ... */ } +@keyframes /**test**/_style_module_css-foo { /* ... */ } +@keyframes/**test**/ _style_module_css-foo { /* ... */ } +@keyframes /**test**/ _style_module_css-foo { /* ... */ } +@keyframes /**test**//**test**/ _style_module_css-foo { /* ... */ } +@keyframes /**test**/ /**test**/ _style_module_css-foo { /* ... */ } +@keyframes /**test**/ /**test**/_style_module_css-foo { /* ... */ } +@keyframes /**test**//**test**/_style_module_css-foo { /* ... */ } +@keyframes/**test**//**test**/_style_module_css-foo { /* ... */ } +@keyframes/**test**//**test**/_style_module_css-foo/**test**//**test**/{ /* ... */ } +@keyframes /**test**/ /**test**/ _style_module_css-foo /**test**/ /**test**/ { /* ... */ } + +./**test**//**test**/_style_module_css-class { + background: red; +} + +./**test**/ /**test**/class { + background: red; +} + +._style_module_css-var { + --_style_module_css-main-color: black; + --_style_module_css-FOO: 10px; + --_style_module_css-foo: 10px; + --_style_module_css-bar: calc(var(--_style_module_css-foo) + 10px); + --_style_module_css-accent-background: linear-gradient(to top, var(--_style_module_css-main-color), white); + --_style_module_css-external-link: \\"test\\"; + --_style_module_css-custom-prop: yellow; + --_style_module_css-default-value: red; + --_style_module_css-main-bg-color: red; + --_style_module_css-backup-bg-color: black; + -foo: calc(var(--_style_module_css-bar) + 10px); + var: var(--_style_module_css-main-color); + var1: var(--_style_module_css-foo); + var2: var(--_style_module_css-FOO); + content: \\" (\\" var(--_style_module_css-external-link) \\")\\"; + var3: var(--_style_module_css-main-color, blue); + var4: var(--_style_module_css-custom-prop,); + var5: var(--_style_module_css-custom-prop, initial); + var6: var(--_style_module_css-custom-prop, var(--_style_module_css-default-value)); + var7: var(--_style_module_css-custom-prop, var(--_style_module_css-default-value, red)); + var8: var(--unknown); + background-color: var(--_style_module_css-main-bg-color, var(--_style_module_css-backup-bg-color, white)); +} + +._style_module_css-var-order { + background-color: var(--_style_module_css-test); + --_style_module_css-test: red; +} + + +/*!*********************************!*\\\\ + !*** css ./style.module.my-css ***! + \\\\*********************************/ +._style_module_my-css-myCssClass { + color: red; +} + +/*!**************************************!*\\\\ + !*** css ./style.module.css.invalid ***! + \\\\**************************************/ +.class { + color: teal; +} + +/*!************************************!*\\\\ + !*** css ./identifiers.module.css ***! + \\\\************************************/ +._identifiers_module_css-UnusedClassName{ + color: red; + padding: var(--_identifiers_module_css-variable-unused-class); + --_identifiers_module_css-variable-unused-class: 10px; +} + +._identifiers_module_css-UsedClassName { + color: green; + padding: var(--_identifiers_module_css-variable-used-class); + --_identifiers_module_css-variable-used-class: 10px; +} + +" +`; + +exports[`ConfigCacheTestCases css css-modules exported tests should allow to create css modules: prod 1`] = ` +Object { + "UsedClassName": "my-app-194-ZL", + "VARS": "--my-app-235-I0 my-app-235-XE undefined my-app-235-wt", + "animation": "my-app-235-lY", + "animationName": "my-app-235-iZ", + "class": "my-app-235-zg", + "classInContainer": "my-app-235-bK", + "classLocalScope": "my-app-235-Ci", + "cssModuleWithCustomFileExtension": "my-app-666-k", + "currentWmultiParams": "my-app-235-Hq", + "deepClassInContainer": "my-app-235-Y1", + "displayFlexInSupportsInMediaUpperCase": "my-app-235-ij", + "exportLocalVarsShouldCleanup": "false false", + "futureWmultiParams": "my-app-235-Hb", + "global": undefined, + "hasWmultiParams": "my-app-235-AO", + "ident": "my-app-235-bD", + "inLocalGlobalScope": "my-app-235-V0", + "inSupportScope": "my-app-235-nc", + "isWmultiParams": "my-app-235-aq", + "keyframes": "my-app-235-$t", + "keyframesUPPERCASE": "my-app-235-zG", + "local": "my-app-235-Hi my-app-235-OB my-app-235-VE my-app-235-O2", + "local2": "my-app-235-Vj my-app-235-OH", + "localkeyframes2UPPPERCASE": "my-app-235-Dk", + "matchesWmultiParams": "my-app-235-VN", + "media": "my-app-235-a7", + "mediaInSupports": "my-app-235-aY", + "mediaWithOperator": "my-app-235-uf", + "mozAnimationName": "my-app-235-M6", + "mozAnyWmultiParams": "my-app-235-OP", + "myColor": "--my-app-235-rX", + "nested": "my-app-235-nb undefined my-app-235-$Q", + "notAValidCssModuleExtension": true, + "notWmultiParams": "my-app-235-H5", + "paddingLg": "my-app-235-cD", + "paddingSm": "my-app-235-dW", + "pastWmultiParams": "my-app-235-O4", + "supports": "my-app-235-sW", + "supportsInMedia": "my-app-235-II", + "supportsWithOperator": "my-app-235-TZ", + "vars": "--my-app-235-uz my-app-235-f undefined my-app-235-aK", + "webkitAnyWmultiParams": "my-app-235-Hw", + "whereWmultiParams": "my-app-235-VM", +} +`; + +exports[`ConfigCacheTestCases css css-modules exported tests should allow to create css modules: prod 2`] = ` +"/*!*******************************!*\\\\ + !*** css ./colors.module.css ***! + \\\\*******************************/ + + + + + + + + + + + + + + +/*!**************************************!*\\\\ + !*** css ./at-rule-value.module.css ***! + \\\\**************************************/ + + +.my-app-744-value-in-class { + color: blue; +} + + + + + + +@media (max-width: 599px) { + abbr:hover { + color: limegreen; + transition-duration: 1s; + } +} + + + +.my-app-744-foo { color: red; } + + + +.my-app-744-foo { + &.my-app-744-bar { color: red; } +} + + + +.my-app-744-foo { + @media (min-width: 1024px) { + &.my-app-744-bar { color: red; } + } +} + + + +.my-app-744-foo { + @media (min-width: 1024px) { + &.my-app-744-bar { + @media (min-width: 1024px) { + color: red; + } + } + } +} + + + + +.my-app-744-foo { height: 40px; height: 36px; } + + + +.my-app-744-colorValue { + color: red; +} + + + +#my-app-744-colorValue-v1 { + color: red; +} + + + +.my-app-744-colorValue-v2 > .my-app-744-colorValue-v2 { + color: red; +} + + + +.red { + color: .red; +} + + + +.my-app-744-export { + color: blue; +} + + + +.my-app-744-foo { color: red; } + + + +.my-app-744-foo { color: red; } +.my-app-744-bar { color: yellow } + + + + +.my-app-744-foo { color: blue; } + + + + +.my-app-744-foo { color: blue; } + + + + +.my-app-744-class-a { color: red; } + + + + +.my-app-744-class-a { margin: calc(base * 2); } + + + + +.my-app-744-class-a { content: \\"test-a\\" \\"test-b\\"; } + + + +.my-app-744-foo { color: var(--color); } + + + + + + + +.my-app-744-foo { + color: red; + background-color: #0f0; + border-top-color: #00ff00; + border-bottom-color: rgba(34, 12, 64, 0.3); + outline-color: hsla(220, 13.0%, 18.0%, 1); +} + + + +.my-app-744-foo { color: blue; } +.my-app-744-bar { color: red } + + + +.my-app-744-foo { box-shadow: 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +.my-app-744-foo { color: color(red lightness(50%)); } + + + +:root { --my-app-744-color: red; } + + + +:root { --my-app-744-color: ; } + + + +:root { --my-app-744-color: ; } + + + +:root { --my-app-744-color:/* comment */; } + + + + +.my-app-744-override { + color: red; +} + + + + +.my-app-744-class { + color: red; + color: red; + color: blue; +} + + + +.my-app-744-color { + color: /* test */red/* test */; +} + + + +.my-app-744-color { + color: /* test *//* test */red/* test */; +} + + + +.my-app-744-foo { box-shadow: 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +.my-app-744-foo { box-shadow: 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +.my-app-744-foo { box-shadow: /* test */ 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +.my-app-744-foo { box-shadow: /* test */0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +.my-app-744-foo { box-shadow: 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +.my-app-744-foo { box-shadow: /* test */0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +.my-app-744-foo { color: blue; } + + + +.my-app-744-foo { color: blue; } + + + +.my-app-744-foo { color: my-name-q; } + + + + +/*!*********************************************!*\\\\ + !*** css ./var-function-export.modules.css ***! + \\\\*********************************************/ +:root { + --my-app-392-my-var-u1: red; + --my-app-392-my-var-u2: blue; + --my-app-392-not-override-class: black; + --my-app-392-1: red; + --my-app-392---a: red; + --my-app-392-main-bg-color: red; +} + +.my-app-392-my-var-u1 { + color: red; +} + +/*!*************************************!*\\\\ + !*** css ./var-function.module.css ***! + \\\\*************************************/ +:root { + --my-app-768-main-bg-color: brown; + --my-app-768-my-var: red; + --my-app-768-my-background: blue; + --my-app-768-my-global: yellow; + --: \\"reserved\\"; + --my-app-768-a: green; +} + +.my-app-768-class { + color: var(--my-app-768-main-bg-color); +} + +@property --my-app-768-logo-color { + syntax: \\"\\"; + inherits: false; + initial-value: #c0ffee; +} + +@property -- { + syntax: \\"\\"; + inherits: false; + initial-value: #c0ffee; +} + +.my-app-768-class { + color: var(--my-app-768-logo-color); +} + +div { + background-color: var(--my-app-768-box-color); +} + +.my-app-768-two { + --my-app-768-box-color: cornflowerblue; +} + +.my-app-768-three { + --my-app-768-box-color: aquamarine; +} + + +.my-app-768-one { + /* Red if --my-var is not defined */ + color: var(--my-app-768-my-var, red); +} + +.my-app-768-two { + /* pink if --my-var and --my-background are not defined */ + color: var(--my-app-768-my-var, var(--my-app-768-my-background, pink)); +} + +.my-app-768-reserved { + color: var(--); +} + +.my-app-768-green { + color: var(--my-app-768-a); +} + +.my-app-768-global { + color: var(--my-global); +} + +.my-app-768-global-and-default { + color: var(--my-global, pink); +} + +.my-app-768-global-and-default-1 { + color: var(--my-global, var(--my-global-background)); +} + +.my-app-768-global-and-default-2 { + color: var(--my-global, var(--my-global-background, pink)); +} + +.my-app-768-global-and-default-3 { + color: var(--my-global, var(--my-app-768-my-background, pink)); +} + +.my-app-768-global-and-default-5 { + color: var( --my-global,var(--my-app-768-my-background,pink)); +} + +.my-app-768-global-and-default-6 { + background: var( --my-app-768-main-bg-color , var( --my-app-768-my-background , pink ) ) , var(--my-global); +} + +.my-app-768-global-and-default-7 { + background: var(--my-app-768-main-bg-color,var(--my-app-768-my-background,pink)),var(--my-global); +} + +.my-app-768-from { + color: var(--my-app-392-my-var-u1); +} + +.my-app-768-from-1 { + color: var(--my-app-768-main-bg-color, var(--my-app-392-my-var-u1)); +} + +.my-app-768-from-2 { + color: var(--my-app-392-my-var-u1, var(--my-app-768-main-bg-color)); +} + +.my-app-768-from-3 { + color: var(--my-app-392-my-var-u1, var(--my-app-392-my-var-u2)); +} + +.my-app-768-from-4 { + color: var(--my-app-392-1); +} + +.my-app-768-from-5 { + color: var(--my-app-392---a); +} + +.my-app-768-from-6 { + color: var(--my-app-392-main-bg-color); +} + +.my-app-768-mixed { + color: var(--my-app-392-my-var-u1, var(--my-global, var(--my-app-768-main-bg-color, red))); +} + +.my-app-768-broken { + color: var(--my-global from); +} + +.my-app-768-broken-1 { + color: var(--my-global from 1); +} + +:root { + --my-app-768-not-override-class: red; +} + +.my-app-768-not-override-class { + color: var(--my-app-392-not-override-class) +} + +/*!******************************!*\\\\ + !*** css ./style.module.css ***! + \\\\******************************/ + +.my-app-235-zg { + color: red; +} + +.my-app-235-Hi, +.my-app-235-OB .global, +.my-app-235-VE { + color: green; +} + +.global .my-app-235-O2 { + color: yellow; +} + +.my-app-235-Vj.global.my-app-235-OH { + color: blue; +} + +.my-app-235-H5 div:not(.my-app-235-disabled, .my-app-235-mButtonDisabled, .my-app-235-tipOnly) { + pointer-events: initial !important; +} + +.my-app-235-aq :is(div.my-app-235-parent1.my-app-235-child1.my-app-235-vertical-tiny, + div.my-app-235-parent1.my-app-235-child1.my-app-235-vertical-small, + div.my-app-235-otherDiv.my-app-235-horizontal-tiny, + div.my-app-235-otherDiv.my-app-235-horizontal-small div.my-app-235-description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +.my-app-235-VN :matches(div.my-app-235-parent1.my-app-235-child1.my-app-235-vertical-tiny, + div.my-app-235-parent1.my-app-235-child1.my-app-235-vertical-small, + div.my-app-235-otherDiv.my-app-235-horizontal-tiny, + div.my-app-235-otherDiv.my-app-235-horizontal-small div.my-app-235-description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +.my-app-235-VM :where(div.my-app-235-parent1.my-app-235-child1.my-app-235-vertical-tiny, + div.my-app-235-parent1.my-app-235-child1.my-app-235-vertical-small, + div.my-app-235-otherDiv.my-app-235-horizontal-tiny, + div.my-app-235-otherDiv.my-app-235-horizontal-small div.my-app-235-description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +.my-app-235-AO div:has(.my-app-235-disabled, .my-app-235-mButtonDisabled, .my-app-235-tipOnly) { + pointer-events: initial !important; +} + +.my-app-235-Hq div:current(p, span) { + background-color: yellow; +} + +.my-app-235-O4 div:past(p, span) { + display: none; +} + +.my-app-235-Hb div:future(p, span) { + background-color: yellow; +} + +.my-app-235-OP div:-moz-any(ol, ul, menu, dir) { + list-style-type: square; +} + +.my-app-235-Hw li:-webkit-any(:first-child, :last-child) { + background-color: aquamarine; +} + +.my-app-235-VN :matches(div.my-app-235-parent1.my-app-235-child1.my-app-235-vertical-tiny, + div.my-app-235-parent1.my-app-235-child1.my-app-235-vertical-small, + div.my-app-235-otherDiv.my-app-235-horizontal-tiny, + div.my-app-235-otherDiv.my-app-235-horizontal-small div.my-app-235-description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +.my-app-235-nb.nested2.my-app-235-\\\\$Q { + color: pink; +} + +#my-app-235-bD { + color: purple; +} + +@keyframes my-app-235-\\\\$t { + 0% { + left: var(--my-app-235-qi); + top: var(--my-app-235-xB); + color: var(--theme-color1); + } + 100% { + left: var(--my-app-235-\\\\$6); + top: var(--my-app-235-gJ); + color: var(--theme-color2); + } +} + +@keyframes my-app-235-x { + 0% { + left: 0; + } + 100% { + left: 100px; + } +} + +.my-app-235-lY { + animation-name: my-app-235-\\\\$t; + animation: 3s ease-in 1s 2 reverse both paused my-app-235-\\\\$t, my-app-235-x; + --my-app-235-qi: 0px; + --my-app-235-xB: 0px; + --my-app-235-\\\\$6: 10px; + --my-app-235-gJ: 20px; +} + +/* .composed { + composes: local1; + composes: local2; +} */ + +.my-app-235-f { + color: var(--my-app-235-uz); + --my-app-235-uz: red; +} + +.my-app-235-aK { + color: var(--global-color); + --global-color: red; +} + +@media (min-width: 1600px) { + .my-app-235-a7 { + color: var(--my-app-235-uz); + --my-app-235-uz: green; + } +} + +@media screen and (max-width: 600px) { + .my-app-235-uf { + color: var(--my-app-235-uz); + --my-app-235-uz: purple; + } +} + +@supports (display: grid) { + .my-app-235-sW { + display: grid; + } +} + +@supports not (display: grid) { + .my-app-235-TZ { + float: right; + } +} + +@supports (display: flex) { + @media screen and (min-width: 900px) { + .my-app-235-aY { + display: flex; + } + } +} + +@media screen and (min-width: 900px) { + @supports (display: flex) { + .my-app-235-II { + display: flex; + } + } +} + +@MEDIA screen and (min-width: 900px) { + @SUPPORTS (display: flex) { + .my-app-235-ij { + display: flex; + } + } +} + +.my-app-235-animationUpperCase { + ANIMATION-NAME: my-app-235-zG; + ANIMATION: 3s ease-in 1s 2 reverse both paused my-app-235-zG, my-app-235-Dk; + --my-app-235-qi: 0px; + --my-app-235-xB: 0px; + --my-app-235-\\\\$6: 10px; + --my-app-235-gJ: 20px; +} + +@KEYFRAMES my-app-235-zG { + 0% { + left: VAR(--my-app-235-qi); + top: VAR(--my-app-235-xB); + color: VAR(--theme-color1); + } + 100% { + left: VAR(--my-app-235-\\\\$6); + top: VAR(--my-app-235-gJ); + color: VAR(--theme-color2); + } +} + +@KEYframes my-app-235-Dk { + 0% { + left: 0; + } + 100% { + left: 100px; + } +} + +.globalUpperCase .my-app-235-localUpperCase { + color: yellow; +} + +.my-app-235-XE { + color: VAR(--my-app-235-I0); + --my-app-235-I0: red; +} + +.my-app-235-wt { + COLOR: VAR(--GLOBAR-COLOR); + --GLOBAR-COLOR: red; +} + +@supports (top: env(safe-area-inset-top, 0)) { + .my-app-235-nc { + color: red; + } +} + +.my-app-235-a { + animation: 3s my-app-235-iZ; + -webkit-animation: 3s my-app-235-iZ; +} + +.my-app-235-b { + animation: my-app-235-iZ 3s; + -webkit-animation: my-app-235-iZ 3s; +} + +.my-app-235-c { + animation-name: my-app-235-iZ; + -webkit-animation-name: my-app-235-iZ; +} + +.my-app-235-d { + --my-app-235-ZP: animationName; +} + +@keyframes my-app-235-iZ { + 0% { + background: white; + } + 100% { + background: red; + } +} + +@-webkit-keyframes my-app-235-iZ { + 0% { + background: white; + } + 100% { + background: red; + } +} + +@-moz-keyframes my-app-235-M6 { + 0% { + background: white; + } + 100% { + background: red; + } +} + +@counter-style thumbs { + system: cyclic; + symbols: \\"\\\\1F44D\\"; + suffix: \\" \\"; +} + +@font-feature-values Font One { + @styleset { + nice-style: 12; + } +} + +/* At-rule for \\"nice-style\\" in Font Two */ +@font-feature-values Font Two { + @styleset { + nice-style: 4; + } +} + +@property --my-app-235-rX { + syntax: \\"\\"; + inherits: false; + initial-value: #c0ffee; +} + +@property --my-app-235-my-color-1 { + initial-value: #c0ffee; + syntax: \\"\\"; + inherits: false; +} + +@property --my-app-235-my-color-2 { + syntax: \\"\\"; + initial-value: #c0ffee; + inherits: false; +} + +.my-app-235-zg { + color: var(--my-app-235-rX); +} + +@layer utilities { + .my-app-235-dW { + padding: 0.5rem; + } + + .my-app-235-cD { + padding: 0.8rem; + } +} + +.my-app-235-zg { + color: red; + + .my-app-235-nested-pure { + color: red; + } + + @media screen and (min-width: 200px) { + color: blue; + + .my-app-235-nested-media { + color: blue; + } + } + + @supports (display: flex) { + display: flex; + + .my-app-235-nested-supports { + display: flex; + } + } + + @layer foo { + background: red; + + .my-app-235-nested-layer { + background: red; + } + } + + @container foo { + background: red; + + .my-app-235-nested-layer { + background: red; + } + } +} + +.my-app-235-not-selector-inside { + color: #fff; + opacity: 0.12; + padding: .5px; + unknown: :local(.test); + unknown1: :local .test; + unknown2: :global .test; + unknown3: :global .test; + unknown4: .foo, .bar, #bar; +} + +@unknown :local .local :global .global { + color: red; +} + +@unknown :local(.local) :global(.global) { + color: red; +} + +.my-app-235-nested-var { + .my-app-235-again { + color: var(--my-app-235-uz); + } +} + +.my-app-235-nested-with-local-pseudo { + color: red; + + .my-app-235-local-nested { + color: red; + } + + .global-nested { + color: red; + } + + .my-app-235-local-nested { + color: red; + } + + .global-nested { + color: red; + } + + .my-app-235-local-nested, .global-nested-next { + color: red; + } + + .my-app-235-local-nested, .global-nested-next { + color: red; + } + + .foo, .my-app-235-M0 { + color: red; + } +} + +#my-app-235-id-foo { + color: red; + + #my-app-235-id-bar { + color: red; + } +} + +.my-app-235-nested-parens { + .my-app-235-VN div:has(.my-app-235-vertical-tiny, .my-app-235-vertical-small) { + max-height: 0; + margin: 0; + overflow: hidden; + } +} + +.global-foo { + .nested-global { + color: red; + } + + .my-app-235-local-in-global { + color: blue; + } +} + +@unknown .class { + color: red; + + .my-app-235-zg { + color: red; + } +} + +.class .my-app-235-V0, +.class .my-app-235-V0, +.my-app-235-Ci .in-local-global-scope { + color: red; +} + +@container (width > 400px) { + .my-app-235-bK { + font-size: 1.5em; + } +} + +@container summary (min-width: 400px) { + @container (width > 400px) { + .my-app-235-Y1 { + font-size: 1.5em; + } + } +} + +:scope { + color: red; +} + +.my-app-235-placeholder-gray-700:-ms-input-placeholder { + --my-app-235-Y: 1; + color: #4a5568; + color: rgba(74, 85, 104, var(--my-app-235-Y)); +} +.my-app-235-placeholder-gray-700::-ms-input-placeholder { + --my-app-235-Y: 1; + color: #4a5568; + color: rgba(74, 85, 104, var(--my-app-235-Y)); +} +.my-app-235-placeholder-gray-700::placeholder { + --my-app-235-Y: 1; + color: #4a5568; + color: rgba(74, 85, 104, var(--my-app-235-Y)); +} + +:root { + --my-app-235-t6: dark; +} + +@media screen and (prefers-color-scheme: var(--my-app-235-t6)) { + .my-app-235-KR { + color: white; + } +} + +@keyframes my-app-235-Fk { + from { + margin-left: 100%; + width: 300%; + } + + to { + margin-left: 0%; + width: 100%; + } +} + +.my-app-235-zg { + animation: + foo var(--my-app-235-ZP) 3s, + var(--my-app-235-ZP) 3s, + 3s linear 1s infinite running my-app-235-Fk, + 3s linear env(foo, var(--my-app-235-KR)) infinite running my-app-235-Fk; +} + +:root { + --my-app-235-KR: 10px; +} + +.my-app-235-zg { + bar: env(foo, var(--my-app-235-KR)); +} + +.global-foo, .my-app-235-M0 { + .my-app-235-local-in-global { + color: blue; + } + + @media screen { + .my-global-class-again, + .my-app-235-my-global-class-again { + color: red; + } + } +} + +.my-app-235-first-nested { + .my-app-235-first-nested-nested { + color: red; + } +} + +.my-app-235-first-nested-at-rule { + @media screen { + .my-app-235-first-nested-nested-at-rule-deep { + color: red; + } + } +} + +.again-global { + color:red; +} + +.again-again-global { + .again-again-global { + color: red; + } +} + +:root { + --my-app-235-pr: red; +} + +.again-again-global { + color: var(--foo); + + .again-again-global { + color: var(--foo); + } +} + +.again-again-global { + animation: slidein 3s; + + .again-again-global, .my-app-235-zg, .my-app-235-nb.nested2.my-app-235-\\\\$Q { + animation: my-app-235-Fk 3s; + } + + .my-app-235-OB .global, + .my-app-235-VE { + color: red; + } +} + +@unknown var(--my-app-235-pr) { + color: red; +} + +.my-app-235-zg { + .my-app-235-zg { + .my-app-235-zg { + .my-app-235-zg {} + } + } +} + +.my-app-235-zg { + .my-app-235-zg { + .my-app-235-zg { + .my-app-235-zg { + animation: my-app-235-Fk 3s; + } + } + } +} + +.my-app-235-zg { + animation: my-app-235-Fk 3s; + .my-app-235-zg { + animation: my-app-235-Fk 3s; + .my-app-235-zg { + animation: my-app-235-Fk 3s; + .my-app-235-zg { + animation: my-app-235-Fk 3s; + } + } + } +} + +.my-app-235-broken { + . global(.my-app-235-zg) { + color: red; + } + + : global(.my-app-235-zg) { + color: red; + } + + : global .my-app-235-zg { + color: red; + } + + : local(.my-app-235-zg) { + color: red; + } + + : local .my-app-235-zg { + color: red; + } + + # hash { + color: red; + } +} + +.my-app-235-comments { + .class { + color: red; + } + + .class { + color: red; + } + + .my-app-235-zg { + color: red; + } + + .my-app-235-zg { + color: red; + } + + ./** test **/my-app-235-zg { + color: red; + } + + ./** test **/my-app-235-zg { + color: red; + } + + ./** test **/my-app-235-zg { + color: red; + } +} + +.my-app-235-pr { + color: red; + + .my-app-235-M0 + & { color: blue; } +} + +.my-app-235-error, #my-app-235-err-404 { + &:hover > .my-app-235-KR { color: red; } +} + +.my-app-235-pr { + & :is(.my-app-235-M0, &.my-app-235-KR) { color: red; } +} + +.my-app-235-qqq { + color: green; + & .my-app-235-a { color: blue; } + color: red; +} + +.my-app-235-parent { + color: blue; + + @scope (& > .my-app-235-scope) to (& > .my-app-235-limit) { + & .my-app-235-content { + color: red; + } + } +} + +.my-app-235-parent { + color: blue; + + @scope (& > .my-app-235-scope) to (& > .my-app-235-limit) { + .my-app-235-content { + color: red; + } + } + + .my-app-235-a { + color: red; + } +} + +@scope (.my-app-235-card) { + :scope { border-block-end: 1px solid white; } +} + +.my-app-235-card { + inline-size: 40ch; + aspect-ratio: 3/4; + + @scope (&) { + :scope { + border: 1px solid white; + } + } +} + +.my-app-235-pr { + display: grid; + + @media (orientation: landscape) { + .my-app-235-M0 { + grid-auto-flow: column; + + @media (min-width > 1024px) { + .my-app-235-baz-1 { + display: grid; + } + + max-inline-size: 1024px; + + .my-app-235-baz-2 { + display: grid; + } + } + } + } +} + +@counter-style thumbs { + system: cyclic; + symbols: \\"\\\\1F44D\\"; + suffix: \\" \\"; +} + +ul { + list-style: thumbs; +} + +@container (width > 400px) and style(--responsive: true) { + .my-app-235-zg { + font-size: 1.5em; + } +} +/* At-rule for \\"nice-style\\" in Font One */ +@font-feature-values Font One { + @styleset { + nice-style: 12; + } +} + +@font-palette-values --identifier { + font-family: Bixa; +} + +.my-app-235-my-class { + font-palette: --identifier; +} + +@keyframes my-app-235-pr { /* ... */ } +@keyframes my-app-235-pr { /* ... */ } +@keyframes { /* ... */ } +@keyframes{ /* ... */ } + +@supports (display: flex) { + @media screen and (min-width: 900px) { + article { + display: flex; + } + } +} + +@starting-style { + .my-app-235-zg { + opacity: 0; + transform: scaleX(0); + } +} + +.my-app-235-zg { + opacity: 1; + transform: scaleX(1); + + @starting-style { + opacity: 0; + transform: scaleX(0); + } +} + +@scope (.my-app-235-feature) { + .my-app-235-zg { opacity: 0; } + + :scope .my-app-235-class-1 { opacity: 0; } + + & .my-app-235-zg { opacity: 0; } +} + +@position-try --custom-left { + position-area: left; + width: 100px; + margin: 0 10px 0 0; +} + +@position-try --custom-bottom { + top: anchor(bottom); + justify-self: anchor-center; + margin: 10px 0 0 0; + position-area: none; +} + +@position-try --custom-right { + left: calc(anchor(right) + 10px); + align-self: anchor-center; + width: 100px; + position-area: none; +} + +@position-try --custom-bottom-right { + position-area: bottom right; + margin: 10px 0 0 10px; +} + +.my-app-235-infobox { + position: fixed; + position-anchor: --myAnchor; + position-area: top; + width: 200px; + margin: 0 0 10px 0; + position-try-fallbacks: + --custom-left, --custom-bottom, + --custom-right, --custom-bottom-right; +} + +@page { + size: 8.5in 9in; + margin-top: 4in; +} + +@color-profile --swop5c { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +.my-app-235-header { + background-color: color(--swop5c 0% 70% 20% 0%); +} + +.my-app-235-t6 { + test: (1, 2) [3, 4], { 1: 2}; + .my-app-235-a { + width: 200px; + } +} + +.my-app-235-t6 { + .my-app-235-t6 { + width: 200px; + } +} + +.my-app-235-t6 { + width: 200px; + + .my-app-235-t6 { + width: 200px; + } +} + +.my-app-235-t6 { + width: 200px; + + .my-app-235-t6 { + .my-app-235-t6 { + width: 200px; + } + } +} + +.my-app-235-t6 { + width: 200px; + + .my-app-235-t6 { + width: 200px; + + .my-app-235-t6 { + width: 200px; + } + } +} + +.my-app-235-t6 { + .my-app-235-t6 { + width: 200px; + + .my-app-235-t6 { + width: 200px; + } + } +} + +.my-app-235-t6 { + .my-app-235-t6 { + width: 200px; + } + width: 200px; +} + +.my-app-235-t6 { + .my-app-235-t6 { + width: 200px; + } + .my-app-235-t6 { + width: 200px; + } +} + +.my-app-235-t6 { + .my-app-235-t6 { + width: 200px; + } + width: 200px; + .my-app-235-t6 { + width: 200px; + } +} + +#my-app-235-t6 { + c: 1; + + #my-app-235-t6 { + c: 2; + } +} + +@property --my-app-235-sD { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} + +.my-app-235-container { + display: flex; + height: 200px; + border: 1px dashed black; + + /* set custom property values on parent */ + --my-app-235-sD: 20%; + --my-app-235-gz: orange; +} + +.my-app-235-item { + width: var(--my-app-235-sD); + height: var(--my-app-235-sD); + background-color: var(--my-app-235-gz); +} + +.my-app-235-two { + --my-app-235-sD: initial; + --my-app-235-gz: inherit; +} + +.my-app-235-three { + /* invalid values */ + --my-app-235-sD: 1000px; + --my-app-235-gz: xyz; +} + +@property invalid { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property{ + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} + +@keyframes my-app-235-Vh { /* ... */ } +@keyframes/**test**/my-app-235-Vh { /* ... */ } +@keyframes/**test**/my-app-235-Vh/**test**/{ /* ... */ } +@keyframes/**test**//**test**/my-app-235-Vh/**test**//**test**/{ /* ... */ } +@keyframes /**test**/ /**test**/ my-app-235-Vh /**test**/ /**test**/ { /* ... */ } +@keyframes my-app-235-None { /* ... */ } +@property/**test**/--my-app-235-sD { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property/**test**/--my-app-235-sD/**test**/{ + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property /**test**/--my-app-235-sD/**test**/ { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property /**test**/ --my-app-235-sD /**test**/ { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property/**test**/ --my-app-235-sD /**test**/{ + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property /**test**/ --my-app-235-sD /**test**/ { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +div { + animation: 3s ease-in 1s 2 reverse both paused my-app-235-Vh, my-app-235-x; + animation-name: my-app-235-Vh; + animation-duration: 2s; +} + +.my-app-235-item-1 { + width: var( --my-app-235-sD ); + height: var(/**comment**/--my-app-235-sD); + background-color: var( /**comment**/--my-app-235-gz); + background-color-1: var(/**comment**/ --my-app-235-gz); + background-color-2: var( /**comment**/ --my-app-235-gz); + background-color-3: var( /**comment**/ --my-app-235-gz /**comment**/ ); + background-color-3: var( /**comment**/--my-app-235-gz/**comment**/ ); + background-color-3: var(/**comment**/--my-app-235-gz/**comment**/); +} + +@keyframes/**test**/my-app-235-pr { /* ... */ } +@keyframes /**test**/my-app-235-pr { /* ... */ } +@keyframes/**test**/ my-app-235-pr { /* ... */ } +@keyframes /**test**/ my-app-235-pr { /* ... */ } +@keyframes /**test**//**test**/ my-app-235-pr { /* ... */ } +@keyframes /**test**/ /**test**/ my-app-235-pr { /* ... */ } +@keyframes /**test**/ /**test**/my-app-235-pr { /* ... */ } +@keyframes /**test**//**test**/my-app-235-pr { /* ... */ } +@keyframes/**test**//**test**/my-app-235-pr { /* ... */ } +@keyframes/**test**//**test**/my-app-235-pr/**test**//**test**/{ /* ... */ } +@keyframes /**test**/ /**test**/ my-app-235-pr /**test**/ /**test**/ { /* ... */ } + +./**test**//**test**/my-app-235-zg { + background: red; +} + +./**test**/ /**test**/class { + background: red; +} + +.my-app-235-var { + --my-app-235-ve: black; + --my-app-235-bg: 10px; + --my-app-235-pr: 10px; + --my-app-235-M0: calc(var(--my-app-235-pr) + 10px); + --my-app-235-accent-background: linear-gradient(to top, var(--my-app-235-ve), white); + --my-app-235-BW: \\"test\\"; + --my-app-235-WI: yellow; + --my-app-235-Cr: red; + --my-app-235-i3: red; + --my-app-235-tv: black; + -foo: calc(var(--my-app-235-M0) + 10px); + var: var(--my-app-235-ve); + var1: var(--my-app-235-pr); + var2: var(--my-app-235-bg); + content: \\" (\\" var(--my-app-235-BW) \\")\\"; + var3: var(--my-app-235-ve, blue); + var4: var(--my-app-235-WI,); + var5: var(--my-app-235-WI, initial); + var6: var(--my-app-235-WI, var(--my-app-235-Cr)); + var7: var(--my-app-235-WI, var(--my-app-235-Cr, red)); + var8: var(--unknown); + background-color: var(--my-app-235-i3, var(--my-app-235-tv, white)); +} + +.my-app-235-var-order { + background-color: var(--my-app-235-t6); + --my-app-235-t6: red; +} + + +/*!*********************************!*\\\\ + !*** css ./style.module.my-css ***! + \\\\*********************************/ +.my-app-666-k { + color: red; +} + +/*!**************************************!*\\\\ + !*** css ./style.module.css.invalid ***! + \\\\**************************************/ +.class { + color: teal; +} + +/*!************************************!*\\\\ + !*** css ./identifiers.module.css ***! + \\\\************************************/ +.my-app-194-UnusedClassName{ + color: red; + padding: var(--my-app-194-RJ); + --my-app-194-RJ: 10px; +} + +.my-app-194-ZL { + color: green; + padding: var(--my-app-194-c5); + --my-app-194-c5: 10px; +} + +" +`; + +exports[`ConfigCacheTestCases css css-modules-broken-keyframes exported tests should allow to create css modules: prod 1`] = ` +Object { + "class": "my-app-235-zg", +} +`; + +exports[`ConfigCacheTestCases css css-modules-in-node exported tests should allow to create css modules: dev 1`] = ` +Object { + "UsedClassName": "_identifiers_module_css-UsedClassName", + "VARS": "--_style_module_css-LOCAL-COLOR _style_module_css-VARS undefined _style_module_css-globalVarsUpperCase", + "animation": "_style_module_css-animation", + "animationName": "_style_module_css-animationName", + "class": "_style_module_css-class", + "classInContainer": "_style_module_css-class-in-container", + "classLocalScope": "_style_module_css-class-local-scope", + "cssModuleWithCustomFileExtension": "_style_module_my-css-myCssClass", + "currentWmultiParams": "_style_module_css-local12", + "deepClassInContainer": "_style_module_css-deep-class-in-container", + "displayFlexInSupportsInMediaUpperCase": "_style_module_css-displayFlexInSupportsInMediaUpperCase", + "exportLocalVarsShouldCleanup": "false false", + "futureWmultiParams": "_style_module_css-local14", + "global": undefined, + "hasWmultiParams": "_style_module_css-local11", + "ident": "_style_module_css-ident", + "inLocalGlobalScope": "_style_module_css-in-local-global-scope", + "inSupportScope": "_style_module_css-inSupportScope", + "isWmultiParams": "_style_module_css-local8", + "keyframes": "_style_module_css-localkeyframes", + "keyframesUPPERCASE": "_style_module_css-localkeyframesUPPERCASE", + "local": "_style_module_css-local1 _style_module_css-local2 _style_module_css-local3 _style_module_css-local4", + "local2": "_style_module_css-local5 _style_module_css-local6", + "localkeyframes2UPPPERCASE": "_style_module_css-localkeyframes2UPPPERCASE", + "matchesWmultiParams": "_style_module_css-local9", + "media": "_style_module_css-wideScreenClass", + "mediaInSupports": "_style_module_css-displayFlexInMediaInSupports", + "mediaWithOperator": "_style_module_css-narrowScreenClass", + "mozAnimationName": "_style_module_css-mozAnimationName", + "mozAnyWmultiParams": "_style_module_css-local15", + "myColor": "--_style_module_css-my-color", + "nested": "_style_module_css-nested1 undefined _style_module_css-nested3", + "notAValidCssModuleExtension": true, + "notWmultiParams": "_style_module_css-local7", + "paddingLg": "_style_module_css-padding-lg", + "paddingSm": "_style_module_css-padding-sm", + "pastWmultiParams": "_style_module_css-local13", + "supports": "_style_module_css-displayGridInSupports", + "supportsInMedia": "_style_module_css-displayFlexInSupportsInMedia", + "supportsWithOperator": "_style_module_css-floatRightInNegativeSupports", + "vars": "--_style_module_css-local-color _style_module_css-vars undefined _style_module_css-globalVars", + "webkitAnyWmultiParams": "_style_module_css-local16", + "whereWmultiParams": "_style_module_css-local10", +} +`; + +exports[`ConfigCacheTestCases css css-modules-in-node exported tests should allow to create css modules: prod 1`] = ` +Object { + "UsedClassName": "my-app-194-ZL", + "VARS": "--my-app-235-I0 my-app-235-XE undefined my-app-235-wt", + "animation": "my-app-235-lY", + "animationName": "my-app-235-iZ", + "class": "my-app-235-zg", + "classInContainer": "my-app-235-bK", + "classLocalScope": "my-app-235-Ci", + "cssModuleWithCustomFileExtension": "my-app-666-k", + "currentWmultiParams": "my-app-235-Hq", + "deepClassInContainer": "my-app-235-Y1", + "displayFlexInSupportsInMediaUpperCase": "my-app-235-ij", + "exportLocalVarsShouldCleanup": "false false", + "futureWmultiParams": "my-app-235-Hb", + "global": undefined, + "hasWmultiParams": "my-app-235-AO", + "ident": "my-app-235-bD", + "inLocalGlobalScope": "my-app-235-V0", + "inSupportScope": "my-app-235-nc", + "isWmultiParams": "my-app-235-aq", + "keyframes": "my-app-235-$t", + "keyframesUPPERCASE": "my-app-235-zG", + "local": "my-app-235-Hi my-app-235-OB my-app-235-VE my-app-235-O2", + "local2": "my-app-235-Vj my-app-235-OH", + "localkeyframes2UPPPERCASE": "my-app-235-Dk", + "matchesWmultiParams": "my-app-235-VN", + "media": "my-app-235-a7", + "mediaInSupports": "my-app-235-aY", + "mediaWithOperator": "my-app-235-uf", + "mozAnimationName": "my-app-235-M6", + "mozAnyWmultiParams": "my-app-235-OP", + "myColor": "--my-app-235-rX", + "nested": "my-app-235-nb undefined my-app-235-$Q", + "notAValidCssModuleExtension": true, + "notWmultiParams": "my-app-235-H5", + "paddingLg": "my-app-235-cD", + "paddingSm": "my-app-235-dW", + "pastWmultiParams": "my-app-235-O4", + "supports": "my-app-235-sW", + "supportsInMedia": "my-app-235-II", + "supportsWithOperator": "my-app-235-TZ", + "vars": "--my-app-235-uz my-app-235-f undefined my-app-235-aK", + "webkitAnyWmultiParams": "my-app-235-Hw", + "whereWmultiParams": "my-app-235-VM", +} +`; + +exports[`ConfigCacheTestCases css css-modules-in-node exported tests should allow to create css modules: prod 2`] = ` +Object { + "UsedClassName": "my-app-194-ZL", + "VARS": "--my-app-235-I0 my-app-235-XE undefined my-app-235-wt", + "animation": "my-app-235-lY", + "animationName": "my-app-235-iZ", + "class": "my-app-235-zg", + "classInContainer": "my-app-235-bK", + "classLocalScope": "my-app-235-Ci", + "cssModuleWithCustomFileExtension": "my-app-666-k", + "currentWmultiParams": "my-app-235-Hq", + "deepClassInContainer": "my-app-235-Y1", + "displayFlexInSupportsInMediaUpperCase": "my-app-235-ij", + "exportLocalVarsShouldCleanup": "false false", + "futureWmultiParams": "my-app-235-Hb", + "global": undefined, + "hasWmultiParams": "my-app-235-AO", + "ident": "my-app-235-bD", + "inLocalGlobalScope": "my-app-235-V0", + "inSupportScope": "my-app-235-nc", + "isWmultiParams": "my-app-235-aq", + "keyframes": "my-app-235-$t", + "keyframesUPPERCASE": "my-app-235-zG", + "local": "my-app-235-Hi my-app-235-OB my-app-235-VE my-app-235-O2", + "local2": "my-app-235-Vj my-app-235-OH", + "localkeyframes2UPPPERCASE": "my-app-235-Dk", + "matchesWmultiParams": "my-app-235-VN", + "media": "my-app-235-a7", + "mediaInSupports": "my-app-235-aY", + "mediaWithOperator": "my-app-235-uf", + "mozAnimationName": "my-app-235-M6", + "mozAnyWmultiParams": "my-app-235-OP", + "myColor": "--my-app-235-rX", + "nested": "my-app-235-nb undefined my-app-235-$Q", + "notAValidCssModuleExtension": true, + "notWmultiParams": "my-app-235-H5", + "paddingLg": "my-app-235-cD", + "paddingSm": "my-app-235-dW", + "pastWmultiParams": "my-app-235-O4", + "supports": "my-app-235-sW", + "supportsInMedia": "my-app-235-II", + "supportsWithOperator": "my-app-235-TZ", + "vars": "--my-app-235-uz my-app-235-f undefined my-app-235-aK", + "webkitAnyWmultiParams": "my-app-235-Hw", + "whereWmultiParams": "my-app-235-VM", +} +`; + +exports[`ConfigCacheTestCases css css-modules-in-node exported tests should allow to import css modules: class-dev 1`] = `"_style_module_css-class"`; + +exports[`ConfigCacheTestCases css css-modules-in-node exported tests should allow to import css modules: class-prod 1`] = `"my-app-235-zg"`; + +exports[`ConfigCacheTestCases css css-modules-in-node exported tests should allow to import css modules: class-prod 2`] = `"my-app-235-zg"`; + +exports[`ConfigCacheTestCases css css-modules-in-node exported tests should allow to import css modules: local1-dev 1`] = `"_style_module_css-local1"`; + +exports[`ConfigCacheTestCases css css-modules-in-node exported tests should allow to import css modules: local1-prod 1`] = `"my-app-235-Hi"`; + +exports[`ConfigCacheTestCases css css-modules-in-node exported tests should allow to import css modules: local1-prod 2`] = `"my-app-235-Hi"`; + +exports[`ConfigCacheTestCases css css-modules-in-node exported tests should allow to import css modules: local2-dev 1`] = `"_style_module_css-local2"`; + +exports[`ConfigCacheTestCases css css-modules-in-node exported tests should allow to import css modules: local2-prod 1`] = `"my-app-235-OB"`; + +exports[`ConfigCacheTestCases css css-modules-in-node exported tests should allow to import css modules: local2-prod 2`] = `"my-app-235-OB"`; + +exports[`ConfigCacheTestCases css css-modules-in-node exported tests should allow to import css modules: local3-dev 1`] = `"_style_module_css-local3"`; + +exports[`ConfigCacheTestCases css css-modules-in-node exported tests should allow to import css modules: local3-prod 1`] = `"my-app-235-VE"`; + +exports[`ConfigCacheTestCases css css-modules-in-node exported tests should allow to import css modules: local3-prod 2`] = `"my-app-235-VE"`; + +exports[`ConfigCacheTestCases css css-modules-in-node exported tests should allow to import css modules: local4-dev 1`] = `"_style_module_css-local4"`; + +exports[`ConfigCacheTestCases css css-modules-in-node exported tests should allow to import css modules: local4-prod 1`] = `"my-app-235-O2"`; + +exports[`ConfigCacheTestCases css css-modules-in-node exported tests should allow to import css modules: local4-prod 2`] = `"my-app-235-O2"`; + +exports[`ConfigCacheTestCases css css-modules-no-space exported tests should allow to create css modules 1`] = ` +Object { + "class": "_style_module_css-class", +} +`; + +exports[`ConfigCacheTestCases css css-modules-no-space exported tests should allow to create css modules 2`] = ` +"/*!******************************!*\\\\ + !*** css ./style.module.css ***! + \\\\******************************/ +._style_module_css-no-space { + .class { + color: red; + } + + /** test **/.class { + color: red; + } + + ._style_module_css-class { + color: red; + } + + /** test **/._style_module_css-class { + color: red; + } + + /** test **/#_style_module_css-hash { + color: red; + } + + /** test **/{ + color: red; + } +} + +" +`; + +exports[`ConfigCacheTestCases css escape-unescape exported tests should work with URLs in CSS: classes 1`] = ` +Object { + "#": "_style_modules_css-#", + "##": "_style_modules_css-##", + "#.#.#": "_style_modules_css-#.#.#", + "#fake-id": "_style_modules_css-#fake-id", + "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.": "_style_modules_css-++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.", + "-a-b-c-": "_style_modules_css--a-b-c-", + "-a0-34a___f": "_style_modules_css--a0-34a___f", + ".": "_style_modules_css-.", + "123": "_style_modules_css-123", + "1a2b3c": "_style_modules_css-1a2b3c", + ":)": "_style_modules_css-:)", + ":\`(": "_style_modules_css-:\`(", + ":hover": "_style_modules_css-:hover", + ":hover:focus:active": "_style_modules_css-:hover:focus:active", + "<><<<>><>": "_style_modules_css-<><<<>><>", + "

": "_style_modules_css-

", + "?": "_style_modules_css-?", + "@": "_style_modules_css-@", + "B&W?": "_style_modules_css-B&W?", + "[attr=value]": "_style_modules_css-[attr=value]", + "_": "_style_modules_css-_", + "_test": "_style_modules_css-_test", + "class": "_style_modules_css-class", + "className": "_style_modules_css-className", + "f!o!o": "_style_modules_css-f!o!o", + "f'o'o": "_style_modules_css-f'o'o", + "f*o*o": "_style_modules_css-f*o*o", + "f+o+o": "_style_modules_css-f+o+o", + "f/o/o": "_style_modules_css-f/o/o", + "f@oo": "_style_modules_css-f@oo", + "f\\\\o\\\\o": "_style_modules_css-f\\\\o\\\\o", + "foo.bar": "_style_modules_css-foo.bar", + "foo/bar": "_style_modules_css-foo/bar", + "foo/bar/baz": "_style_modules_css-foo/bar/baz", + "foo\\\\bar": "_style_modules_css-foo\\\\bar", + "foo\\\\bar\\\\baz": "_style_modules_css-foo\\\\bar\\\\baz", + "f~o~o": "_style_modules_css-f~o~o", + "m_x_@": "_style_modules_css-m_x_@", + "main-bg-color": "--_style_modules_css-main-bg-color", + "main-bg-color-@2": "--_style_modules_css-main-bg-color-@2", + "someId": "_style_modules_css-someId", + "subClass": "_style_modules_css-subClass", + "test": "_style_modules_css-test", + "{}": "_style_modules_css-{}", + "©": "_style_modules_css-©", + "“‘’”": "_style_modules_css-“‘’”", + "⌘⌥": "_style_modules_css-⌘⌥", + "☺☃": "_style_modules_css-☺☃", + "♥": "_style_modules_css-♥", + "𝄞♪♩♫♬": "_style_modules_css-𝄞♪♩♫♬", + "💩": "_style_modules_css-💩", + "😍": "_style_modules_css-😍", +} +`; + +exports[`ConfigCacheTestCases css escape-unescape exported tests should work with URLs in CSS: classes 2`] = ` +Object { + "#": "_style_modules_css-#", + "##": "_style_modules_css-##", + "#.#.#": "_style_modules_css-#.#.#", + "#fake-id": "_style_modules_css-#fake-id", + "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.": "_style_modules_css-++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.", + "-a-b-c-": "_style_modules_css--a-b-c-", + "-a0-34a___f": "_style_modules_css--a0-34a___f", + ".": "_style_modules_css-.", + "123": "_style_modules_css-123", + "1a2b3c": "_style_modules_css-1a2b3c", + ":)": "_style_modules_css-:)", + ":\`(": "_style_modules_css-:\`(", + ":hover": "_style_modules_css-:hover", + ":hover:focus:active": "_style_modules_css-:hover:focus:active", + "<><<<>><>": "_style_modules_css-<><<<>><>", + "

": "_style_modules_css-

", + "?": "_style_modules_css-?", + "@": "_style_modules_css-@", + "B&W?": "_style_modules_css-B&W?", + "[attr=value]": "_style_modules_css-[attr=value]", + "_": "_style_modules_css-_", + "_test": "_style_modules_css-_test", + "class": "_style_modules_css-class", + "className": "_style_modules_css-className", + "f!o!o": "_style_modules_css-f!o!o", + "f'o'o": "_style_modules_css-f'o'o", + "f*o*o": "_style_modules_css-f*o*o", + "f+o+o": "_style_modules_css-f+o+o", + "f/o/o": "_style_modules_css-f/o/o", + "f@oo": "_style_modules_css-f@oo", + "f\\\\o\\\\o": "_style_modules_css-f\\\\o\\\\o", + "foo.bar": "_style_modules_css-foo.bar", + "foo/bar": "_style_modules_css-foo/bar", + "foo/bar/baz": "_style_modules_css-foo/bar/baz", + "foo\\\\bar": "_style_modules_css-foo\\\\bar", + "foo\\\\bar\\\\baz": "_style_modules_css-foo\\\\bar\\\\baz", + "f~o~o": "_style_modules_css-f~o~o", + "m_x_@": "_style_modules_css-m_x_@", + "main-bg-color": "--_style_modules_css-main-bg-color", + "main-bg-color-@2": "--_style_modules_css-main-bg-color-@2", + "someId": "_style_modules_css-someId", + "subClass": "_style_modules_css-subClass", + "test": "_style_modules_css-test", + "{}": "_style_modules_css-{}", + "©": "_style_modules_css-©", + "“‘’”": "_style_modules_css-“‘’”", + "⌘⌥": "_style_modules_css-⌘⌥", + "☺☃": "_style_modules_css-☺☃", + "♥": "_style_modules_css-♥", + "𝄞♪♩♫♬": "_style_modules_css-𝄞♪♩♫♬", + "💩": "_style_modules_css-💩", + "😍": "_style_modules_css-😍", +} +`; + +exports[`ConfigCacheTestCases css escape-unescape exported tests should work with URLs in CSS: css 1`] = ` +Array [ + "/*!*******************************!*\\\\ + !*** css ./style.modules.css ***! + \\\\*******************************/ +._style_modules_css-class { + color: red; +} + +._style_modules_css-class { + background: blue; +} + +._style_modules_css-test { + background: red; +} + +._style_modules_css-_test { + background: blue; +} + +._style_modules_css-className { + background: red; +} + +#_style_modules_css-someId { + background: green; +} + +._style_modules_css-className ._style_modules_css-subClass { + color: green; +} + +#_style_modules_css-someId ._style_modules_css-subClass { + color: blue; +} + +._style_modules_css--a0-34a___f { + color: red; +} + +._style_modules_css-m_x_\\\\@ { + margin-left: auto !important; + margin-right: auto !important; +} + +._style_modules_css-B\\\\&W\\\\? { + margin-left: auto !important; + margin-right: auto !important; +} + +/* matches elements with class=\\":\`(\\" */ +._style_modules_css-\\\\:\\\\\`\\\\( { + color: aqua; +} + +/* matches elements with class=\\"1a2b3c\\" */ +._style_modules_css-1a2b3c { + color: aliceblue; +} + +/* matches the element with id=\\"#fake-id\\" */ +#_style_modules_css-\\\\#fake-id { + color: antiquewhite; +} + +/* matches the element with id=\\"-a-b-c-\\" */ +#_style_modules_css--a-b-c- { + color: azure; +} + +/* matches the element with id=\\"©\\" */ +#_style_modules_css-© { + color: black; +} + +._style_modules_css-♥ { background: lime; } +._style_modules_css-© { background: lime; } +._style_modules_css-😍 { background: lime; } +._style_modules_css-“‘’” { background: lime; } +._style_modules_css-☺☃ { background: lime; } +._style_modules_css-⌘⌥ { background: lime; } +._style_modules_css-𝄞♪♩♫♬ { background: lime; } +._style_modules_css-💩 { background: lime; } +._style_modules_css-\\\\? { background: lime; } +._style_modules_css-\\\\@ { background: lime; } +._style_modules_css-\\\\. { background: lime; } +._style_modules_css-\\\\:\\\\) { background: lime; } +._style_modules_css-\\\\:\\\\\`\\\\( { background: lime; } +._style_modules_css-123 { background: lime; } +._style_modules_css-1a2b3c { background: lime; } +._style_modules_css-\\\\ { background: lime; } +._style_modules_css-\\\\<\\\\>\\\\<\\\\<\\\\<\\\\>\\\\>\\\\<\\\\> { background: lime; } +._style_modules_css-\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\[\\\\>\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\>\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\>\\\\+\\\\+\\\\+\\\\>\\\\+\\\\<\\\\<\\\\<\\\\<-\\\\]\\\\>\\\\+\\\\+\\\\.\\\\>\\\\+\\\\.\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\.\\\\.\\\\+\\\\+\\\\+\\\\.\\\\>\\\\+\\\\+\\\\.\\\\<\\\\<\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\.\\\\>\\\\.\\\\+\\\\+\\\\+\\\\.------\\\\.--------\\\\.\\\\>\\\\+\\\\.\\\\>\\\\. { background: lime; } +._style_modules_css-\\\\# { background: lime; } +._style_modules_css-\\\\#\\\\# { background: lime; } +._style_modules_css-\\\\#\\\\.\\\\#\\\\.\\\\# { background: lime; } +._style_modules_css-_ { background: lime; } +._style_modules_css-\\\\{\\\\} { background: lime; } +._style_modules_css-\\\\#fake-id { background: lime; } +._style_modules_css-foo\\\\.bar { background: lime; } +._style_modules_css-\\\\:hover { background: lime; } +._style_modules_css-\\\\:hover\\\\:focus\\\\:active { background: lime; } +._style_modules_css-\\\\[attr\\\\=value\\\\] { background: lime; } +._style_modules_css-f\\\\/o\\\\/o { background: lime; } +._style_modules_css-f\\\\\\\\o\\\\\\\\o { background: lime; } +._style_modules_css-f\\\\*o\\\\*o { background: lime; } +._style_modules_css-f\\\\!o\\\\!o { background: lime; } +._style_modules_css-f\\\\'o\\\\'o { background: lime; } +._style_modules_css-f\\\\~o\\\\~o { background: lime; } +._style_modules_css-f\\\\+o\\\\+o { background: lime; } + +._style_modules_css-foo\\\\/bar { + background: hotpink; +} + +._style_modules_css-foo\\\\\\\\bar { + background: hotpink; +} + +._style_modules_css-foo\\\\/bar\\\\/baz { + background: hotpink; +} + +._style_modules_css-foo\\\\\\\\bar\\\\\\\\baz { + background: hotpink; +} + +:root { + --_style_modules_css-main-bg-color: red; + --_style_modules_css-main-bg-color-\\\\@2: blue; +} + +details { + background-color: var(--_style_modules_css-main-bg-color); + background-color: var(--_style_modules_css-main-bg-color-\\\\@2); +} + +@keyframes _style_modules_css-f\\\\@oo { from { color: red; } to { color: blue; } } + +", +] +`; + +exports[`ConfigCacheTestCases css escape-unescape exported tests should work with URLs in CSS: css 2`] = ` +Array [ + "/*!*******************************!*\\\\ + !*** css ./style.modules.css ***! + \\\\*******************************/ +._style_modules_css-class { + color: red; +} + +._style_modules_css-class { + background: blue; +} + +._style_modules_css-test { + background: red; +} + +._style_modules_css-_test { + background: blue; +} + +._style_modules_css-className { + background: red; +} + +#_style_modules_css-someId { + background: green; +} + +._style_modules_css-className ._style_modules_css-subClass { + color: green; +} + +#_style_modules_css-someId ._style_modules_css-subClass { + color: blue; +} + +._style_modules_css--a0-34a___f { + color: red; +} + +._style_modules_css-m_x_\\\\@ { + margin-left: auto !important; + margin-right: auto !important; +} + +._style_modules_css-B\\\\&W\\\\? { + margin-left: auto !important; + margin-right: auto !important; +} + +/* matches elements with class=\\":\`(\\" */ +._style_modules_css-\\\\:\\\\\`\\\\( { + color: aqua; +} + +/* matches elements with class=\\"1a2b3c\\" */ +._style_modules_css-1a2b3c { + color: aliceblue; +} + +/* matches the element with id=\\"#fake-id\\" */ +#_style_modules_css-\\\\#fake-id { + color: antiquewhite; +} + +/* matches the element with id=\\"-a-b-c-\\" */ +#_style_modules_css--a-b-c- { + color: azure; +} + +/* matches the element with id=\\"©\\" */ +#_style_modules_css-© { + color: black; +} + +._style_modules_css-♥ { background: lime; } +._style_modules_css-© { background: lime; } +._style_modules_css-😍 { background: lime; } +._style_modules_css-“‘’” { background: lime; } +._style_modules_css-☺☃ { background: lime; } +._style_modules_css-⌘⌥ { background: lime; } +._style_modules_css-𝄞♪♩♫♬ { background: lime; } +._style_modules_css-💩 { background: lime; } +._style_modules_css-\\\\? { background: lime; } +._style_modules_css-\\\\@ { background: lime; } +._style_modules_css-\\\\. { background: lime; } +._style_modules_css-\\\\:\\\\) { background: lime; } +._style_modules_css-\\\\:\\\\\`\\\\( { background: lime; } +._style_modules_css-123 { background: lime; } +._style_modules_css-1a2b3c { background: lime; } +._style_modules_css-\\\\ { background: lime; } +._style_modules_css-\\\\<\\\\>\\\\<\\\\<\\\\<\\\\>\\\\>\\\\<\\\\> { background: lime; } +._style_modules_css-\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\[\\\\>\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\>\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\>\\\\+\\\\+\\\\+\\\\>\\\\+\\\\<\\\\<\\\\<\\\\<-\\\\]\\\\>\\\\+\\\\+\\\\.\\\\>\\\\+\\\\.\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\.\\\\.\\\\+\\\\+\\\\+\\\\.\\\\>\\\\+\\\\+\\\\.\\\\<\\\\<\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\.\\\\>\\\\.\\\\+\\\\+\\\\+\\\\.------\\\\.--------\\\\.\\\\>\\\\+\\\\.\\\\>\\\\. { background: lime; } +._style_modules_css-\\\\# { background: lime; } +._style_modules_css-\\\\#\\\\# { background: lime; } +._style_modules_css-\\\\#\\\\.\\\\#\\\\.\\\\# { background: lime; } +._style_modules_css-_ { background: lime; } +._style_modules_css-\\\\{\\\\} { background: lime; } +._style_modules_css-\\\\#fake-id { background: lime; } +._style_modules_css-foo\\\\.bar { background: lime; } +._style_modules_css-\\\\:hover { background: lime; } +._style_modules_css-\\\\:hover\\\\:focus\\\\:active { background: lime; } +._style_modules_css-\\\\[attr\\\\=value\\\\] { background: lime; } +._style_modules_css-f\\\\/o\\\\/o { background: lime; } +._style_modules_css-f\\\\\\\\o\\\\\\\\o { background: lime; } +._style_modules_css-f\\\\*o\\\\*o { background: lime; } +._style_modules_css-f\\\\!o\\\\!o { background: lime; } +._style_modules_css-f\\\\'o\\\\'o { background: lime; } +._style_modules_css-f\\\\~o\\\\~o { background: lime; } +._style_modules_css-f\\\\+o\\\\+o { background: lime; } + +._style_modules_css-foo\\\\/bar { + background: hotpink; +} + +._style_modules_css-foo\\\\\\\\bar { + background: hotpink; +} + +._style_modules_css-foo\\\\/bar\\\\/baz { + background: hotpink; +} + +._style_modules_css-foo\\\\\\\\bar\\\\\\\\baz { + background: hotpink; +} + +:root { + --_style_modules_css-main-bg-color: red; + --_style_modules_css-main-bg-color-\\\\@2: blue; +} + +details { + background-color: var(--_style_modules_css-main-bg-color); + background-color: var(--_style_modules_css-main-bg-color-\\\\@2); +} + +@keyframes _style_modules_css-f\\\\@oo { from { color: red; } to { color: blue; } } + +", +] +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: as-is 1`] = ` +Object { + "btn--info_is-disabled_1": "_style_module_css_as-is-btn--info_is-disabled_1", + "btn-info_is-disabled": "_style_module_css_as-is-btn-info_is-disabled", + "class": "_style_module_css_as-is-class", + "default": "_style_module_css_as-is-default", + "foo": "bar", + "foo_bar": "_style_module_css_as-is-foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "_style_module_css_as-is-simple", +} +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: as-is 2`] = ` +Object { + "btn--info_is-disabled_1": "_856-btn--info_is-disabled_1", + "btn-info_is-disabled": "_856-btn-info_is-disabled", + "class": "_856-class", + "default": "_856-default", + "foo": "bar", + "foo_bar": "_856-foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "_856-simple", +} +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: as-is 3`] = ` +Object { + "btn--info_is-disabled_1": "_style_module_css_as-is-btn--info_is-disabled_1", + "btn-info_is-disabled": "_style_module_css_as-is-btn-info_is-disabled", + "class": "_style_module_css_as-is-class", + "default": "_style_module_css_as-is-default", + "foo": "bar", + "foo_bar": "_style_module_css_as-is-foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "_style_module_css_as-is-simple", +} +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: as-is 4`] = ` +Object { + "btn--info_is-disabled_1": "_856-btn--info_is-disabled_1", + "btn-info_is-disabled": "_856-btn-info_is-disabled", + "class": "_856-class", + "default": "_856-default", + "foo": "bar", + "foo_bar": "_856-foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "_856-simple", +} +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: camel-case 1`] = ` +Object { + "btn--info_is-disabled_1": "_style_module_css_camel-case-btn--info_is-disabled_1", + "btn-info_is-disabled": "_style_module_css_camel-case-btn-info_is-disabled", + "btnInfoIsDisabled": "_style_module_css_camel-case-btn-info_is-disabled", + "btnInfoIsDisabled1": "_style_module_css_camel-case-btn--info_is-disabled_1", + "class": "_style_module_css_camel-case-class", + "default": "_style_module_css_camel-case-default", + "foo": "bar", + "fooBar": "_style_module_css_camel-case-foo_bar", + "foo_bar": "_style_module_css_camel-case-foo_bar", + "my-btn-info_is-disabled": "value", + "myBtnInfoIsDisabled": "value", + "simple": "_style_module_css_camel-case-simple", +} +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: camel-case 2`] = ` +Object { + "btn--info_is-disabled_1": "_612-btn--info_is-disabled_1", + "btn-info_is-disabled": "_612-btn-info_is-disabled", + "btnInfoIsDisabled": "_612-btn-info_is-disabled", + "btnInfoIsDisabled1": "_612-btn--info_is-disabled_1", + "class": "_612-class", + "default": "_612-default", + "foo": "bar", + "fooBar": "_612-foo_bar", + "foo_bar": "_612-foo_bar", + "my-btn-info_is-disabled": "value", + "myBtnInfoIsDisabled": "value", + "simple": "_612-simple", +} +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: camel-case 3`] = ` +Object { + "btn--info_is-disabled_1": "_style_module_css_camel-case-btn--info_is-disabled_1", + "btn-info_is-disabled": "_style_module_css_camel-case-btn-info_is-disabled", + "btnInfoIsDisabled": "_style_module_css_camel-case-btn-info_is-disabled", + "btnInfoIsDisabled1": "_style_module_css_camel-case-btn--info_is-disabled_1", + "class": "_style_module_css_camel-case-class", + "default": "_style_module_css_camel-case-default", + "foo": "bar", + "fooBar": "_style_module_css_camel-case-foo_bar", + "foo_bar": "_style_module_css_camel-case-foo_bar", + "my-btn-info_is-disabled": "value", + "myBtnInfoIsDisabled": "value", + "simple": "_style_module_css_camel-case-simple", +} +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: camel-case 4`] = ` +Object { + "btn--info_is-disabled_1": "_612-btn--info_is-disabled_1", + "btn-info_is-disabled": "_612-btn-info_is-disabled", + "btnInfoIsDisabled": "_612-btn-info_is-disabled", + "btnInfoIsDisabled1": "_612-btn--info_is-disabled_1", + "class": "_612-class", + "default": "_612-default", + "foo": "bar", + "fooBar": "_612-foo_bar", + "foo_bar": "_612-foo_bar", + "my-btn-info_is-disabled": "value", + "myBtnInfoIsDisabled": "value", + "simple": "_612-simple", +} +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: camel-case-only 1`] = ` +Object { + "btnInfoIsDisabled": "_style_module_css_camel-case-only-btnInfoIsDisabled", + "btnInfoIsDisabled1": "_style_module_css_camel-case-only-btnInfoIsDisabled1", + "class": "_style_module_css_camel-case-only-class", + "default": "_style_module_css_camel-case-only-default", + "foo": "bar", + "fooBar": "_style_module_css_camel-case-only-fooBar", + "myBtnInfoIsDisabled": "value", + "simple": "_style_module_css_camel-case-only-simple", +} +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: camel-case-only 2`] = ` +Object { + "btnInfoIsDisabled": "_999-btnInfoIsDisabled", + "btnInfoIsDisabled1": "_999-btnInfoIsDisabled1", + "class": "_999-class", + "default": "_999-default", + "foo": "bar", + "fooBar": "_999-fooBar", + "myBtnInfoIsDisabled": "value", + "simple": "_999-simple", +} +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: camel-case-only 3`] = ` +Object { + "btnInfoIsDisabled": "_style_module_css_camel-case-only-btnInfoIsDisabled", + "btnInfoIsDisabled1": "_style_module_css_camel-case-only-btnInfoIsDisabled1", + "class": "_style_module_css_camel-case-only-class", + "default": "_style_module_css_camel-case-only-default", + "foo": "bar", + "fooBar": "_style_module_css_camel-case-only-fooBar", + "myBtnInfoIsDisabled": "value", + "simple": "_style_module_css_camel-case-only-simple", +} +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: camel-case-only 4`] = ` +Object { + "btnInfoIsDisabled": "_999-btnInfoIsDisabled", + "btnInfoIsDisabled1": "_999-btnInfoIsDisabled1", + "class": "_999-class", + "default": "_999-default", + "foo": "bar", + "fooBar": "_999-fooBar", + "myBtnInfoIsDisabled": "value", + "simple": "_999-simple", +} +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: dashes 1`] = ` +Object { + "btn--info_is-disabled_1": "_style_module_css_dashes-btn--info_is-disabled_1", + "btn-info_is-disabled": "_style_module_css_dashes-btn-info_is-disabled", + "btnInfo_isDisabled": "_style_module_css_dashes-btn-info_is-disabled", + "btnInfo_isDisabled_1": "_style_module_css_dashes-btn--info_is-disabled_1", + "class": "_style_module_css_dashes-class", + "default": "_style_module_css_dashes-default", + "foo": "bar", + "foo_bar": "_style_module_css_dashes-foo_bar", + "my-btn-info_is-disabled": "value", + "myBtnInfo_isDisabled": "value", + "simple": "_style_module_css_dashes-simple", +} +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: dashes 2`] = ` +Object { + "btn--info_is-disabled_1": "_883-btn--info_is-disabled_1", + "btn-info_is-disabled": "_883-btn-info_is-disabled", + "btnInfo_isDisabled": "_883-btn-info_is-disabled", + "btnInfo_isDisabled_1": "_883-btn--info_is-disabled_1", + "class": "_883-class", + "default": "_883-default", + "foo": "bar", + "foo_bar": "_883-foo_bar", + "my-btn-info_is-disabled": "value", + "myBtnInfo_isDisabled": "value", + "simple": "_883-simple", +} +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: dashes 3`] = ` +Object { + "btn--info_is-disabled_1": "_style_module_css_dashes-btn--info_is-disabled_1", + "btn-info_is-disabled": "_style_module_css_dashes-btn-info_is-disabled", + "btnInfo_isDisabled": "_style_module_css_dashes-btn-info_is-disabled", + "btnInfo_isDisabled_1": "_style_module_css_dashes-btn--info_is-disabled_1", + "class": "_style_module_css_dashes-class", + "default": "_style_module_css_dashes-default", + "foo": "bar", + "foo_bar": "_style_module_css_dashes-foo_bar", + "my-btn-info_is-disabled": "value", + "myBtnInfo_isDisabled": "value", + "simple": "_style_module_css_dashes-simple", +} +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: dashes 4`] = ` +Object { + "btn--info_is-disabled_1": "_883-btn--info_is-disabled_1", + "btn-info_is-disabled": "_883-btn-info_is-disabled", + "btnInfo_isDisabled": "_883-btn-info_is-disabled", + "btnInfo_isDisabled_1": "_883-btn--info_is-disabled_1", + "class": "_883-class", + "default": "_883-default", + "foo": "bar", + "foo_bar": "_883-foo_bar", + "my-btn-info_is-disabled": "value", + "myBtnInfo_isDisabled": "value", + "simple": "_883-simple", +} +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: dashes-only 1`] = ` +Object { + "btnInfo_isDisabled": "_style_module_css_dashes-only-btnInfo_isDisabled", + "btnInfo_isDisabled_1": "_style_module_css_dashes-only-btnInfo_isDisabled_1", + "class": "_style_module_css_dashes-only-class", + "default": "_style_module_css_dashes-only-default", + "foo": "bar", + "foo_bar": "_style_module_css_dashes-only-foo_bar", + "myBtnInfo_isDisabled": "value", + "simple": "_style_module_css_dashes-only-simple", +} +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: dashes-only 2`] = ` +Object { + "btnInfo_isDisabled": "_882-btnInfo_isDisabled", + "btnInfo_isDisabled_1": "_882-btnInfo_isDisabled_1", + "class": "_882-class", + "default": "_882-default", + "foo": "bar", + "foo_bar": "_882-foo_bar", + "myBtnInfo_isDisabled": "value", + "simple": "_882-simple", +} +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: dashes-only 3`] = ` +Object { + "btnInfo_isDisabled": "_style_module_css_dashes-only-btnInfo_isDisabled", + "btnInfo_isDisabled_1": "_style_module_css_dashes-only-btnInfo_isDisabled_1", + "class": "_style_module_css_dashes-only-class", + "default": "_style_module_css_dashes-only-default", + "foo": "bar", + "foo_bar": "_style_module_css_dashes-only-foo_bar", + "myBtnInfo_isDisabled": "value", + "simple": "_style_module_css_dashes-only-simple", +} +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: dashes-only 4`] = ` +Object { + "btnInfo_isDisabled": "_882-btnInfo_isDisabled", + "btnInfo_isDisabled_1": "_882-btnInfo_isDisabled_1", + "class": "_882-class", + "default": "_882-default", + "foo": "bar", + "foo_bar": "_882-foo_bar", + "myBtnInfo_isDisabled": "value", + "simple": "_882-simple", +} +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: upper 1`] = ` +Object { + "BTN--INFO_IS-DISABLED_1": "_style_module_css_upper-BTN--INFO_IS-DISABLED_1", + "BTN-INFO_IS-DISABLED": "_style_module_css_upper-BTN-INFO_IS-DISABLED", + "CLASS": "_style_module_css_upper-CLASS", + "DEFAULT": "_style_module_css_upper-DEFAULT", + "FOO": "bar", + "FOO_BAR": "_style_module_css_upper-FOO_BAR", + "MY-BTN-INFO_IS-DISABLED": "value", + "SIMPLE": "_style_module_css_upper-SIMPLE", +} +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: upper 2`] = ` +Object { + "BTN--INFO_IS-DISABLED_1": "_133-BTN--INFO_IS-DISABLED_1", + "BTN-INFO_IS-DISABLED": "_133-BTN-INFO_IS-DISABLED", + "CLASS": "_133-CLASS", + "DEFAULT": "_133-DEFAULT", + "FOO": "bar", + "FOO_BAR": "_133-FOO_BAR", + "MY-BTN-INFO_IS-DISABLED": "value", + "SIMPLE": "_133-SIMPLE", +} +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: upper 3`] = ` +Object { + "BTN--INFO_IS-DISABLED_1": "_style_module_css_upper-BTN--INFO_IS-DISABLED_1", + "BTN-INFO_IS-DISABLED": "_style_module_css_upper-BTN-INFO_IS-DISABLED", + "CLASS": "_style_module_css_upper-CLASS", + "DEFAULT": "_style_module_css_upper-DEFAULT", + "FOO": "bar", + "FOO_BAR": "_style_module_css_upper-FOO_BAR", + "MY-BTN-INFO_IS-DISABLED": "value", + "SIMPLE": "_style_module_css_upper-SIMPLE", +} +`; + +exports[`ConfigCacheTestCases css exports-convention exported tests should have correct convention for css exports name: upper 4`] = ` +Object { + "BTN--INFO_IS-DISABLED_1": "_133-BTN--INFO_IS-DISABLED_1", + "BTN-INFO_IS-DISABLED": "_133-BTN-INFO_IS-DISABLED", + "CLASS": "_133-CLASS", + "DEFAULT": "_133-DEFAULT", + "FOO": "bar", + "FOO_BAR": "_133-FOO_BAR", + "MY-BTN-INFO_IS-DISABLED": "value", + "SIMPLE": "_133-SIMPLE", +} +`; + +exports[`ConfigCacheTestCases css import exported tests should compile 1`] = ` +Array [ + "/*!******************************************************************************************!*\\\\ + !*** external \\"https://test.cases/path/../../../../configCases/css/import/external.css\\" ***! + \\\\******************************************************************************************/ +body { + externally-imported: true; +} + +/*!******************************************!*\\\\ + !*** external \\"//example.com/style.css\\" ***! + \\\\******************************************/ +@import url(\\"//example.com/style.css\\"); +/*!*****************************************************************!*\\\\ + !*** external \\"https://fonts.googleapis.com/css?family=Roboto\\" ***! + \\\\*****************************************************************/ +@import url(\\"https://fonts.googleapis.com/css?family=Roboto\\"); +/*!***********************************************************************!*\\\\ + !*** external \\"https://fonts.googleapis.com/css?family=Noto+Sans+TC\\" ***! + \\\\***********************************************************************/ +@import url(\\"https://fonts.googleapis.com/css?family=Noto+Sans+TC\\"); +/*!******************************************************************************!*\\\\ + !*** external \\"https://fonts.googleapis.com/css?family=Noto+Sans+TC|Roboto\\" ***! + \\\\******************************************************************************/ +@import url(\\"https://fonts.googleapis.com/css?family=Noto+Sans+TC|Roboto\\"); +/*!************************************************************************************!*\\\\ + !*** external \\"https://fonts.googleapis.com/css?family=Noto+Sans+TC|Roboto?foo=1\\" ***! + \\\\************************************************************************************/ +@import url(\\"https://fonts.googleapis.com/css?family=Noto+Sans+TC|Roboto?foo=1\\") layer(super.foo) supports(display: flex) screen and (min-width: 400px); +/*!*******************************************************************************************!*\\\\ + !*** external \\"https://test.cases/path/../../../../configCases/css/import/external1.css\\" ***! + \\\\*******************************************************************************************/ +body { + externally-imported1: true; +} + +/*!*******************************************************************************************!*\\\\ + !*** external \\"https://test.cases/path/../../../../configCases/css/import/external2.css\\" ***! + \\\\*******************************************************************************************/ +body { + externally-imported2: true; +} + +/*!*********************************!*\\\\ + !*** external \\"external-1.css\\" ***! + \\\\*********************************/ +@import url(\\"external-1.css\\"); +/*!*********************************!*\\\\ + !*** external \\"external-2.css\\" ***! + \\\\*********************************/ +@import url(\\"external-2.css\\") supports(display: grid) screen and (max-width: 400px); +/*!*********************************!*\\\\ + !*** external \\"external-3.css\\" ***! + \\\\*********************************/ +@import url(\\"external-3.css\\") supports(not (display: grid) and (display: flex)) screen and (max-width: 400px); +/*!*********************************!*\\\\ + !*** external \\"external-4.css\\" ***! + \\\\*********************************/ +@import url(\\"external-4.css\\") supports((selector(h2 > p)) and + (font-tech(color-COLRv1))); +/*!*********************************!*\\\\ + !*** external \\"external-5.css\\" ***! + \\\\*********************************/ +@import url(\\"external-5.css\\") layer(default); +/*!*********************************!*\\\\ + !*** external \\"external-6.css\\" ***! + \\\\*********************************/ +@import url(\\"external-6.css\\") layer(default); +/*!*********************************!*\\\\ + !*** external \\"external-7.css\\" ***! + \\\\*********************************/ +@import url(\\"external-7.css\\") layer(); +/*!*********************************!*\\\\ + !*** external \\"external-8.css\\" ***! + \\\\*********************************/ +@import url(\\"external-8.css\\") layer(); +/*!*********************************!*\\\\ + !*** external \\"external-9.css\\" ***! + \\\\*********************************/ +@import url(\\"external-9.css\\") print; +/*!**********************************!*\\\\ + !*** external \\"external-10.css\\" ***! + \\\\**********************************/ +@import url(\\"external-10.css\\") print, screen; +/*!**********************************!*\\\\ + !*** external \\"external-11.css\\" ***! + \\\\**********************************/ +@import url(\\"external-11.css\\") screen; +/*!**********************************!*\\\\ + !*** external \\"external-12.css\\" ***! + \\\\**********************************/ +@import url(\\"external-12.css\\") screen and (orientation: landscape); +/*!**********************************!*\\\\ + !*** external \\"external-13.css\\" ***! + \\\\**********************************/ +@import url(\\"external-13.css\\") supports(not (display: flex)); +/*!**********************************!*\\\\ + !*** external \\"external-14.css\\" ***! + \\\\**********************************/ +@import url(\\"external-14.css\\") layer(default) supports(display: grid) screen and (max-width: 400px); +/*!***************************************************!*\\\\ + !*** css ./node_modules/style-library/styles.css ***! + \\\\***************************************************/ +p { + color: steelblue; +} + +/*!************************************************!*\\\\ + !*** css ./node_modules/main-field/styles.css ***! + \\\\************************************************/ +p { + color: antiquewhite; +} + +/*!*********************************************************!*\\\\ + !*** css ./node_modules/package-with-exports/style.css ***! + \\\\*********************************************************/ +.load-me { + color: red; +} + +/*!***************************************!*\\\\ + !*** css ./extensions-imported.mycss ***! + \\\\***************************************/ +.custom-extension{ + color: green; +}.using-loader { color: red; } +/*!***********************!*\\\\ + !*** css ./file.less ***! + \\\\***********************/ +.link { + color: #428bca; +} + +/*!**********************************!*\\\\ + !*** css ./with-less-import.css ***! + \\\\**********************************/ + +.foo { + color: red; +} + +/*!*********************************!*\\\\ + !*** css ./prefer-relative.css ***! + \\\\*********************************/ +.relative { + color: red; +} + +/*!************************************************************!*\\\\ + !*** css ./node_modules/condition-names-style/default.css ***! + \\\\************************************************************/ +.default { + color: steelblue; +} + +/*!**************************************************************!*\\\\ + !*** css ./node_modules/condition-names-style-mode/mode.css ***! + \\\\**************************************************************/ +.mode { + color: red; +} + +/*!******************************************************************!*\\\\ + !*** css ./node_modules/condition-names-subpath/dist/custom.css ***! + \\\\******************************************************************/ +.dist { + color: steelblue; +} + +/*!************************************************************************!*\\\\ + !*** css ./node_modules/condition-names-subpath-extra/dist/custom.css ***! + \\\\************************************************************************/ +.dist { + color: steelblue; +} + +/*!******************************************************************!*\\\\ + !*** css ./node_modules/condition-names-style-less/default.less ***! + \\\\******************************************************************/ +.conditional-names { + color: #428bca; +} + +/*!**********************************************************************!*\\\\ + !*** css ./node_modules/condition-names-custom-name/custom-name.css ***! + \\\\**********************************************************************/ +.custom-name { + color: steelblue; +} + +/*!************************************************************!*\\\\ + !*** css ./node_modules/style-and-main-library/styles.css ***! + \\\\************************************************************/ +.style { + color: steelblue; +} + +/*!**************************************************************!*\\\\ + !*** css ./node_modules/condition-names-webpack/webpack.css ***! + \\\\**************************************************************/ +.webpack { + color: steelblue; +} + +/*!*******************************************************************!*\\\\ + !*** css ./node_modules/condition-names-style-nested/default.css ***! + \\\\*******************************************************************/ +.default { + color: steelblue; +} + +/*!******************************!*\\\\ + !*** css ./style-import.css ***! + \\\\******************************/ + +/* Technically, this is not entirely true, but we allow it because the final file can be processed by the loader and return the CSS code */ + + +/* Failed */ + + +/*!*****************************!*\\\\ + !*** css ./print.css?foo=1 ***! + \\\\*****************************/ +body { + background: black; +} + +/*!*****************************!*\\\\ + !*** css ./print.css?foo=2 ***! + \\\\*****************************/ +body { + background: black; +} + +/*!**********************************************!*\\\\ + !*** css ./print.css?foo=3 (layer: default) ***! + \\\\**********************************************/ +@layer default { + body { + background: black; + } +} + +/*!**********************************************!*\\\\ + !*** css ./print.css?foo=4 (layer: default) ***! + \\\\**********************************************/ +@layer default { + body { + background: black; + } +} + +/*!*******************************************************!*\\\\ + !*** css ./print.css?foo=5 (supports: display: flex) ***! + \\\\*******************************************************/ +@supports (display: flex) { + body { + background: black; + } +} + +/*!*******************************************************!*\\\\ + !*** css ./print.css?foo=6 (supports: display: flex) ***! + \\\\*******************************************************/ +@supports (display: flex) { + body { + background: black; + } +} + +/*!********************************************************************!*\\\\ + !*** css ./print.css?foo=7 (media: screen and (min-width: 400px)) ***! + \\\\********************************************************************/ +@media screen and (min-width: 400px) { + body { + background: black; + } +} + +/*!********************************************************************!*\\\\ + !*** css ./print.css?foo=8 (media: screen and (min-width: 400px)) ***! + \\\\********************************************************************/ +@media screen and (min-width: 400px) { + body { + background: black; + } +} + +/*!************************************************************************!*\\\\ + !*** css ./print.css?foo=9 (layer: default) (supports: display: flex) ***! + \\\\************************************************************************/ +@layer default { + @supports (display: flex) { + body { + background: black; + } + } +} + +/*!**************************************************************************************!*\\\\ + !*** css ./print.css?foo=10 (layer: default) (media: screen and (min-width: 400px)) ***! + \\\\**************************************************************************************/ +@layer default { + @media screen and (min-width: 400px) { + body { + background: black; + } + } +} + +/*!***********************************************************************************************!*\\\\ + !*** css ./print.css?foo=11 (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\***********************************************************************************************/ +@supports (display: flex) { + @media screen and (min-width: 400px) { + body { + background: black; + } + } +} + +/*!****************************************************************************************************************!*\\\\ + !*** css ./print.css?foo=12 (layer: default) (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\****************************************************************************************************************/ +@layer default { + @supports (display: flex) { + @media screen and (min-width: 400px) { + body { + background: black; + } + } + } +} + +/*!****************************************************************************************************************!*\\\\ + !*** css ./print.css?foo=13 (layer: default) (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\****************************************************************************************************************/ +@layer default { + @supports (display: flex) { + @media screen and (min-width: 400px) { + body { + background: black; + } + } + } +} + +/*!****************************************************************************************************************!*\\\\ + !*** css ./print.css?foo=14 (layer: default) (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\****************************************************************************************************************/ +@layer default { + @supports (display: flex) { + @media screen and (min-width: 400px) { + body { + background: black; + } + } + } +} + +/*!****************************************************************************************************************!*\\\\ + !*** css ./print.css?foo=15 (layer: default) (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\****************************************************************************************************************/ +@layer default { + @supports (display: flex) { + @media screen and (min-width: 400px) { + body { + background: black; + } + } + } +} + +/*!*****************************************************************************************************************************!*\\\\ + !*** css ./print.css?foo=16 (layer: default) (supports: background: url(./img.png)) (media: screen and (min-width: 400px)) ***! + \\\\*****************************************************************************************************************************/ +@layer default { + @supports (background: url(./img.png)) { + @media screen and (min-width: 400px) { + body { + background: black; + } + } + } +} + +/*!*******************************************************************************************************************************!*\\\\ + !*** css ./print.css?foo=17 (layer: default) (supports: background: url(\\"./img.png\\")) (media: screen and (min-width: 400px)) ***! + \\\\*******************************************************************************************************************************/ +@layer default { + @supports (background: url(\\"./img.png\\")) { + @media screen and (min-width: 400px) { + body { + background: black; + } + } + } +} + +/*!**********************************************!*\\\\ + !*** css ./print.css?foo=18 (media: screen) ***! + \\\\**********************************************/ +@media screen { + body { + background: black; + } +} + +/*!**********************************************!*\\\\ + !*** css ./print.css?foo=19 (media: screen) ***! + \\\\**********************************************/ +@media screen { + body { + background: black; + } +} + +/*!**********************************************!*\\\\ + !*** css ./print.css?foo=20 (media: screen) ***! + \\\\**********************************************/ +@media screen { + body { + background: black; + } +} + +/*!******************************!*\\\\ + !*** css ./print.css?foo=21 ***! + \\\\******************************/ +body { + background: black; +} + +/*!**************************!*\\\\ + !*** css ./imported.css ***! + \\\\**************************/ +body { + background: green; +} + +/*!****************************************!*\\\\ + !*** css ./imported.css (layer: base) ***! + \\\\****************************************/ +@layer base { + body { + background: green; + } +} + +/*!****************************************************!*\\\\ + !*** css ./imported.css (supports: display: flex) ***! + \\\\****************************************************/ +@supports (display: flex) { + body { + background: green; + } +} + +/*!*************************************************!*\\\\ + !*** css ./imported.css (media: screen, print) ***! + \\\\*************************************************/ +@media screen, print { + body { + background: green; + } +} + +/*!******************************!*\\\\ + !*** css ./style2.css?foo=1 ***! + \\\\******************************/ +a { + color: red; +} + +/*!******************************!*\\\\ + !*** css ./style2.css?foo=2 ***! + \\\\******************************/ +a { + color: red; +} + +/*!******************************!*\\\\ + !*** css ./style2.css?foo=3 ***! + \\\\******************************/ +a { + color: red; +} + +/*!******************************!*\\\\ + !*** css ./style2.css?foo=4 ***! + \\\\******************************/ +a { + color: red; +} + +/*!******************************!*\\\\ + !*** css ./style2.css?foo=5 ***! + \\\\******************************/ +a { + color: red; +} + +/*!******************************!*\\\\ + !*** css ./style2.css?foo=6 ***! + \\\\******************************/ +a { + color: red; +} + +/*!******************************!*\\\\ + !*** css ./style2.css?foo=7 ***! + \\\\******************************/ +a { + color: red; +} + +/*!******************************!*\\\\ + !*** css ./style2.css?foo=8 ***! + \\\\******************************/ +a { + color: red; +} + +/*!******************************!*\\\\ + !*** css ./style2.css?foo=9 ***! + \\\\******************************/ +a { + color: red; +} + +/*!********************************************************************!*\\\\ + !*** css ./style2.css (media: screen and (orientation:landscape)) ***! + \\\\********************************************************************/ +@media screen and (orientation:landscape) { + a { + color: red; + } +} + +/*!*********************************************************************!*\\\\ + !*** css ./style2.css (media: SCREEN AND (ORIENTATION: LANDSCAPE)) ***! + \\\\*********************************************************************/ +@media SCREEN AND (ORIENTATION: LANDSCAPE) { + a { + color: red; + } +} + +/*!****************************************************!*\\\\ + !*** css ./style2.css (media: (min-width: 100px)) ***! + \\\\****************************************************/ +@media (min-width: 100px) { + a { + color: red; + } +} + +/*!**********************************!*\\\\ + !*** css ./test.css?foo=1&bar=1 ***! + \\\\**********************************/ +.class { + content: \\"test.css\\"; +} + +/*!*****************************************!*\\\\ + !*** css ./style2.css?foo=1&bar=1#hash ***! + \\\\*****************************************/ +a { + color: red; +} + +/*!*************************************************************************************!*\\\\ + !*** css ./style2.css?foo=1&bar=1#hash (media: screen and (orientation:landscape)) ***! + \\\\*************************************************************************************/ +@media screen and (orientation:landscape) { + a { + color: red; + } +} + +/*!******************************!*\\\\ + !*** css ./style3.css?bar=1 ***! + \\\\******************************/ +.class { + content: \\"style.css\\"; + color: red; +} + +/*!******************************!*\\\\ + !*** css ./style3.css?bar=2 ***! + \\\\******************************/ +.class { + content: \\"style.css\\"; + color: red; +} + +/*!******************************!*\\\\ + !*** css ./style3.css?bar=3 ***! + \\\\******************************/ +.class { + content: \\"style.css\\"; + color: red; +} + +/*!******************************!*\\\\ + !*** css ./style3.css?=bar4 ***! + \\\\******************************/ +.class { + content: \\"style.css\\"; + color: red; +} + +/*!**************************!*\\\\ + !*** css ./styl'le7.css ***! + \\\\**************************/ +.class { + content: \\"style7.css\\"; +} + +/*!********************************!*\\\\ + !*** css ./styl'le7.css?foo=1 ***! + \\\\********************************/ +.class { + content: \\"style7.css\\"; +} + +/*!***************************!*\\\\ + !*** css ./test test.css ***! + \\\\***************************/ +.class { + content: \\"test test.css\\"; +} + +/*!*********************************!*\\\\ + !*** css ./test test.css?foo=1 ***! + \\\\*********************************/ +.class { + content: \\"test test.css\\"; +} + +/*!*********************************!*\\\\ + !*** css ./test test.css?foo=2 ***! + \\\\*********************************/ +.class { + content: \\"test test.css\\"; +} + +/*!*********************************!*\\\\ + !*** css ./test test.css?foo=3 ***! + \\\\*********************************/ +.class { + content: \\"test test.css\\"; +} + +/*!*********************************!*\\\\ + !*** css ./test test.css?foo=4 ***! + \\\\*********************************/ +.class { + content: \\"test test.css\\"; +} + +/*!*********************************!*\\\\ + !*** css ./test test.css?foo=5 ***! + \\\\*********************************/ +.class { + content: \\"test test.css\\"; +} + +/*!**********************!*\\\\ + !*** css ./test.css ***! + \\\\**********************/ +.class { + content: \\"test.css\\"; +} + +/*!****************************!*\\\\ + !*** css ./test.css?foo=1 ***! + \\\\****************************/ +.class { + content: \\"test.css\\"; +} + +/*!****************************!*\\\\ + !*** css ./test.css?foo=2 ***! + \\\\****************************/ +.class { + content: \\"test.css\\"; +} + +/*!****************************!*\\\\ + !*** css ./test.css?foo=3 ***! + \\\\****************************/ +.class { + content: \\"test.css\\"; +} + +/*!*********************************!*\\\\ + !*** css ./test test.css?foo=6 ***! + \\\\*********************************/ +.class { + content: \\"test test.css\\"; +} + +/*!*********************************!*\\\\ + !*** css ./test test.css?foo=7 ***! + \\\\*********************************/ +.class { + content: \\"test test.css\\"; +} + +/*!*********************************!*\\\\ + !*** css ./test test.css?foo=8 ***! + \\\\*********************************/ +.class { + content: \\"test test.css\\"; +} + +/*!*********************************!*\\\\ + !*** css ./test test.css?foo=9 ***! + \\\\*********************************/ +.class { + content: \\"test test.css\\"; +} + +/*!**********************************!*\\\\ + !*** css ./test test.css?fpp=10 ***! + \\\\**********************************/ +.class { + content: \\"test test.css\\"; +} + +/*!**********************************!*\\\\ + !*** css ./test test.css?foo=11 ***! + \\\\**********************************/ +.class { + content: \\"test test.css\\"; +} + +/*!*********************************!*\\\\ + !*** css ./style6.css?foo=bazz ***! + \\\\*********************************/ +.class { + content: \\"style6.css\\"; +} + +/*!********************************************************!*\\\\ + !*** css ./string-loader.js?esModule=false!./test.css ***! + \\\\********************************************************/ +.class { + content: \\"test.css\\"; +} +.using-loader { color: red; } +/*!********************************!*\\\\ + !*** css ./style4.css?foo=bar ***! + \\\\********************************/ +.class { + content: \\"style4.css\\"; +} + +/*!*************************************!*\\\\ + !*** css ./style4.css?foo=bar#hash ***! + \\\\*************************************/ +.class { + content: \\"style4.css\\"; +} + +/*!******************************!*\\\\ + !*** css ./style4.css?#hash ***! + \\\\******************************/ +.class { + content: \\"style4.css\\"; +} + +/*!********************************************************!*\\\\ + !*** css ./style4.css?foo=1 (supports: display: flex) ***! + \\\\********************************************************/ +@supports (display: flex) { + .class { + content: \\"style4.css\\"; + } +} + +/*!****************************************************************************************************!*\\\\ + !*** css ./style4.css?foo=2 (supports: display: flex) (media: screen and (orientation:landscape)) ***! + \\\\****************************************************************************************************/ +@supports (display: flex) { + @media screen and (orientation:landscape) { + .class { + content: \\"style4.css\\"; + } + } +} + +/*!******************************!*\\\\ + !*** css ./style4.css?foo=3 ***! + \\\\******************************/ +.class { + content: \\"style4.css\\"; +} + +/*!******************************!*\\\\ + !*** css ./style4.css?foo=4 ***! + \\\\******************************/ +.class { + content: \\"style4.css\\"; +} + +/*!******************************!*\\\\ + !*** css ./style4.css?foo=5 ***! + \\\\******************************/ +.class { + content: \\"style4.css\\"; +} + +/*!*****************************************************************************************************!*\\\\ + !*** css ./string-loader.js?esModule=false!./test.css (media: screen and (orientation: landscape)) ***! + \\\\*****************************************************************************************************/ +@media screen and (orientation: landscape) { + .class { + content: \\"test.css\\"; + } + .using-loader { color: red; }} + +/*!*************************************************************************************!*\\\\ + !*** css data:text/css;charset=utf-8,a%20%7B%0D%0A%20%20color%3A%20red%3B%0D%0A%7D ***! + \\\\*************************************************************************************/ +a { + color: red; +} +/*!**********************************************************************************************************************************!*\\\\ + !*** css data:text/css;charset=utf-8,a%20%7B%0D%0A%20%20color%3A%20blue%3B%0D%0A%7D (media: screen and (orientation:landscape)) ***! + \\\\**********************************************************************************************************************************/ +@media screen and (orientation:landscape) { + a { + color: blue; + }} + +/*!***************************************************************************!*\\\\ + !*** css data:text/css;charset=utf-8;base64,YSB7DQogIGNvbG9yOiByZWQ7DQp9 ***! + \\\\***************************************************************************/ +a { + color: red; +} +/*!******************************!*\\\\ + !*** css ./style5.css?foo=1 ***! + \\\\******************************/ +.class { + content: \\"style5.css\\"; +} + +/*!******************************!*\\\\ + !*** css ./style5.css?foo=2 ***! + \\\\******************************/ +.class { + content: \\"style5.css\\"; +} + +/*!**************************************************!*\\\\ + !*** css ./style5.css?foo=3 (supports: unknown) ***! + \\\\**************************************************/ +@supports (unknown) { + .class { + content: \\"style5.css\\"; + } +} + +/*!********************************************************!*\\\\ + !*** css ./style5.css?foo=4 (supports: display: flex) ***! + \\\\********************************************************/ +@supports (display: flex) { + .class { + content: \\"style5.css\\"; + } +} + +/*!*******************************************************************!*\\\\ + !*** css ./style5.css?foo=5 (supports: display: flex !important) ***! + \\\\*******************************************************************/ +@supports (display: flex !important) { + .class { + content: \\"style5.css\\"; + } +} + +/*!***********************************************************************************************!*\\\\ + !*** css ./style5.css?foo=6 (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\***********************************************************************************************/ +@supports (display: flex) { + @media screen and (min-width: 400px) { + .class { + content: \\"style5.css\\"; + } + } +} + +/*!********************************************************!*\\\\ + !*** css ./style5.css?foo=7 (supports: selector(a b)) ***! + \\\\********************************************************/ +@supports (selector(a b)) { + .class { + content: \\"style5.css\\"; + } +} + +/*!********************************************************!*\\\\ + !*** css ./style5.css?foo=8 (supports: display: flex) ***! + \\\\********************************************************/ +@supports (display: flex) { + .class { + content: \\"style5.css\\"; + } +} + +/*!*****************************!*\\\\ + !*** css ./layer.css?foo=1 ***! + \\\\*****************************/ +@layer { + .class { + content: \\"layer.css\\"; + } +} + +/*!**********************************************!*\\\\ + !*** css ./layer.css?foo=2 (layer: default) ***! + \\\\**********************************************/ +@layer default { + .class { + content: \\"layer.css\\"; + } +} + +/*!***************************************************************************************************************!*\\\\ + !*** css ./layer.css?foo=3 (layer: default) (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\***************************************************************************************************************/ +@layer default { + @supports (display: flex) { + @media screen and (min-width: 400px) { + .class { + content: \\"layer.css\\"; + } + } + } +} + +/*!**********************************************************************************************!*\\\\ + !*** css ./layer.css?foo=3 (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\**********************************************************************************************/ +@layer { + @supports (display: flex) { + @media screen and (min-width: 400px) { + .class { + content: \\"layer.css\\"; + } + } + } +} + +/*!**********************************************************************************************!*\\\\ + !*** css ./layer.css?foo=4 (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\**********************************************************************************************/ +@layer { + @supports (display: flex) { + @media screen and (min-width: 400px) { + .class { + content: \\"layer.css\\"; + } + } + } +} + +/*!*****************************!*\\\\ + !*** css ./layer.css?foo=5 ***! + \\\\*****************************/ +@layer { + .class { + content: \\"layer.css\\"; + } +} + +/*!**************************************************!*\\\\ + !*** css ./layer.css?foo=6 (layer: foo.bar.baz) ***! + \\\\**************************************************/ +@layer foo.bar.baz { + .class { + content: \\"layer.css\\"; + } +} + +/*!*****************************!*\\\\ + !*** css ./layer.css?foo=7 ***! + \\\\*****************************/ +@layer { + .class { + content: \\"layer.css\\"; + } +} + +/*!*********************************************************************************************************!*\\\\ + !*** css ./style6.css (layer: default) (supports: display: flex) (media: screen and (min-width:400px)) ***! + \\\\*********************************************************************************************************/ +@layer default { + @supports (display: flex) { + @media screen and (min-width:400px) { + .class { + content: \\"style6.css\\"; + } + } + } +} + +/*!***************************************************************************************************************!*\\\\ + !*** css ./style6.css?foo=1 (layer: default) (supports: display: flex) (media: screen and (min-width:400px)) ***! + \\\\***************************************************************************************************************/ +@layer default { + @supports (display: flex) { + @media screen and (min-width:400px) { + .class { + content: \\"style6.css\\"; + } + } + } +} + +/*!**********************************************************************************************!*\\\\ + !*** css ./style6.css?foo=2 (supports: display: flex) (media: screen and (min-width:400px)) ***! + \\\\**********************************************************************************************/ +@supports (display: flex) { + @media screen and (min-width:400px) { + .class { + content: \\"style6.css\\"; + } + } +} + +/*!********************************************************************!*\\\\ + !*** css ./style6.css?foo=3 (media: screen and (min-width:400px)) ***! + \\\\********************************************************************/ +@media screen and (min-width:400px) { + .class { + content: \\"style6.css\\"; + } +} + +/*!********************************************************************!*\\\\ + !*** css ./style6.css?foo=4 (media: screen and (min-width:400px)) ***! + \\\\********************************************************************/ +@media screen and (min-width:400px) { + .class { + content: \\"style6.css\\"; + } +} + +/*!********************************************************************!*\\\\ + !*** css ./style6.css?foo=5 (media: screen and (min-width:400px)) ***! + \\\\********************************************************************/ +@media screen and (min-width:400px) { + .class { + content: \\"style6.css\\"; + } +} + +/*!****************************************************************************************************************************************************!*\\\\ + !*** css ./style6.css?foo=6 (layer: default) (supports: display : flex) (media: screen and ( min-width : 400px )) ***! + \\\\****************************************************************************************************************************************************/ +@layer default { + @supports (display : flex) { + @media screen and ( min-width : 400px ) { + .class { + content: \\"style6.css\\"; + } + } + } +} + +/*!****************************************************************************************************************!*\\\\ + !*** css ./style6.css?foo=7 (layer: DEFAULT) (supports: DISPLAY: FLEX) (media: SCREEN AND (MIN-WIDTH: 400PX)) ***! + \\\\****************************************************************************************************************/ +@layer DEFAULT { + @supports (DISPLAY: FLEX) { + @media SCREEN AND (MIN-WIDTH: 400PX) { + .class { + content: \\"style6.css\\"; + } + } + } +} + +/*!***********************************************************************************************!*\\\\ + !*** css ./style6.css?foo=8 (supports: DISPLAY: FLEX) (media: SCREEN AND (MIN-WIDTH: 400PX)) ***! + \\\\***********************************************************************************************/ +@layer { + @supports (DISPLAY: FLEX) { + @media SCREEN AND (MIN-WIDTH: 400PX) { + .class { + content: \\"style6.css\\"; + } + } + } +} + +/*!****************************************************************************************************************************************************************************************************************************************************************************************!*\\\\ + !*** css ./style6.css?foo=9 (layer: /* Comment *_/default/* Comment *_/) (supports: /* Comment *_/display/* Comment *_/:/* Comment *_/ flex/* Comment *_/) (media: screen/* Comment *_/ and/* Comment *_/ (/* Comment *_/min-width/* Comment *_/: /* Comment *_/400px/* Comment *_/)) ***! + \\\\****************************************************************************************************************************************************************************************************************************************************************************************/ +@layer /* Comment */default/* Comment */ { + @supports (/* Comment */display/* Comment */:/* Comment */ flex/* Comment */) { + @media screen/* Comment */ and/* Comment */ (/* Comment */min-width/* Comment */: /* Comment */400px/* Comment */) { + .class { + content: \\"style6.css\\"; + } + } + } +} + +/*!*******************************!*\\\\ + !*** css ./style6.css?foo=10 ***! + \\\\*******************************/ +.class { + content: \\"style6.css\\"; +} + +/*!*******************************!*\\\\ + !*** css ./style6.css?foo=11 ***! + \\\\*******************************/ +.class { + content: \\"style6.css\\"; +} + +/*!*******************************!*\\\\ + !*** css ./style6.css?foo=12 ***! + \\\\*******************************/ +.class { + content: \\"style6.css\\"; +} + +/*!*******************************!*\\\\ + !*** css ./style6.css?foo=13 ***! + \\\\*******************************/ +.class { + content: \\"style6.css\\"; +} + +/*!*******************************!*\\\\ + !*** css ./style6.css?foo=14 ***! + \\\\*******************************/ +.class { + content: \\"style6.css\\"; +} + +/*!*******************************!*\\\\ + !*** css ./style6.css?foo=15 ***! + \\\\*******************************/ +.class { + content: \\"style6.css\\"; +} + +/*!**************************************************************************!*\\\\ + !*** css ./style6.css?foo=16 (media: print and (orientation:landscape)) ***! + \\\\**************************************************************************/ +@media print and (orientation:landscape) { + .class { + content: \\"style6.css\\"; + } +} + +/*!****************************************************************************************!*\\\\ + !*** css ./style6.css?foo=17 (media: print and (orientation:landscape)/* Comment *_/) ***! + \\\\****************************************************************************************/ +@media print and (orientation:landscape)/* Comment */ { + .class { + content: \\"style6.css\\"; + } +} + +/*!**************************************************************************!*\\\\ + !*** css ./style6.css?foo=18 (media: print and (orientation:landscape)) ***! + \\\\**************************************************************************/ +@media print and (orientation:landscape) { + .class { + content: \\"style6.css\\"; + } +} + +/*!***************************************************************!*\\\\ + !*** css ./style8.css (media: screen and (min-width: 400px)) ***! + \\\\***************************************************************/ +@media screen and (min-width: 400px) { + .class { + content: \\"style8.css\\"; + } +} + +/*!**************************************************************!*\\\\ + !*** css ./style8.css (media: (prefers-color-scheme: dark)) ***! + \\\\**************************************************************/ +@media (prefers-color-scheme: dark) { + .class { + content: \\"style8.css\\"; + } +} + +/*!**************************************************!*\\\\ + !*** css ./style8.css (supports: display: flex) ***! + \\\\**************************************************/ +@supports (display: flex) { + .class { + content: \\"style8.css\\"; + } +} + +/*!******************************************************!*\\\\ + !*** css ./style8.css (supports: ((display: flex))) ***! + \\\\******************************************************/ +@supports (((display: flex))) { + .class { + content: \\"style8.css\\"; + } +} + +/*!********************************************************************************************************!*\\\\ + !*** css ./style8.css (supports: ((display: inline-grid))) (media: screen and (((min-width: 400px)))) ***! + \\\\********************************************************************************************************/ +@supports (((display: inline-grid))) { + @media screen and (((min-width: 400px))) { + .class { + content: \\"style8.css\\"; + } + } +} + +/*!**************************************************!*\\\\ + !*** css ./style8.css (supports: display: grid) ***! + \\\\**************************************************/ +@supports (display: grid) { + .class { + content: \\"style8.css\\"; + } +} + +/*!*****************************************************************************************!*\\\\ + !*** css ./style8.css (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\*****************************************************************************************/ +@supports (display: flex) { + @media screen and (min-width: 400px) { + .class { + content: \\"style8.css\\"; + } + } +} + +/*!*******************************************!*\\\\ + !*** css ./style8.css (layer: framework) ***! + \\\\*******************************************/ +@layer framework { + .class { + content: \\"style8.css\\"; + } +} + +/*!*****************************************!*\\\\ + !*** css ./style8.css (layer: default) ***! + \\\\*****************************************/ +@layer default { + .class { + content: \\"style8.css\\"; + } +} + +/*!**************************************!*\\\\ + !*** css ./style8.css (layer: base) ***! + \\\\**************************************/ +@layer base { + .class { + content: \\"style8.css\\"; + } +} + +/*!*******************************************************************!*\\\\ + !*** css ./style8.css (layer: default) (supports: display: flex) ***! + \\\\*******************************************************************/ +@layer default { + @supports (display: flex) { + .class { + content: \\"style8.css\\"; + } + } +} + +/*!**********************************************************************************************************!*\\\\ + !*** css ./style8.css (layer: default) (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\**********************************************************************************************************/ +@layer default { + @supports (display: flex) { + @media screen and (min-width: 400px) { + .class { + content: \\"style8.css\\"; + } + } + } +} + +/*!************************!*\\\\ + !*** css ./style2.css ***! + \\\\************************/ +@layer { + a { + color: red; + } +} + +/*!*********************************************************************************!*\\\\ + !*** css ./style9.css (media: unknown(default) unknown(display: flex) unknown) ***! + \\\\*********************************************************************************/ +@media unknown(default) unknown(display: flex) unknown { + .class { + content: \\"style9.css\\"; + } +} + +/*!**************************************************!*\\\\ + !*** css ./style9.css (media: unknown(default)) ***! + \\\\**************************************************/ +@media unknown(default) { + .class { + content: \\"style9.css\\"; + } +} + +/*!*************************!*\\\\ + !*** css ./style11.css ***! + \\\\*************************/ +.style11 { + color: red; +} + +/*!*************************!*\\\\ + !*** css ./style12.css ***! + \\\\*************************/ + +.style12 { + color: red; +} + +/*!*************************!*\\\\ + !*** css ./style13.css ***! + \\\\*************************/ +div{color: red;} + +/*!*************************!*\\\\ + !*** css ./style10.css ***! + \\\\*************************/ + + +.style10 { + color: red; +} + +/*!************************************************************************************!*\\\\ + !*** css ./media-deep-deep-nested.css (media: screen and (orientation: portrait)) ***! + \\\\************************************************************************************/ +@media screen and (min-width: 400px) { + @media screen and (max-width: 500px) { + @media screen and (orientation: portrait) { + .class { + deep-deep-nested: 1; + } + } + } +} + +/*!**************************************************************************!*\\\\ + !*** css ./media-deep-nested.css (media: screen and (max-width: 500px)) ***! + \\\\**************************************************************************/ +@media screen and (min-width: 400px) { + @media screen and (max-width: 500px) { + + .class { + deep-nested: 1; + } + } +} + +/*!*********************************************************************!*\\\\ + !*** css ./media-nested.css (media: screen and (min-width: 400px)) ***! + \\\\*********************************************************************/ +@media screen and (min-width: 400px) { + + .class { + nested: 1; + } +} + +/*!**********************************************************************!*\\\\ + !*** css ./supports-deep-deep-nested.css (supports: display: table) ***! + \\\\**********************************************************************/ +@supports (display: flex) { + @supports (display: grid) { + @supports (display: table) { + .class { + deep-deep-nested: 1; + } + } + } +} + +/*!****************************************************************!*\\\\ + !*** css ./supports-deep-nested.css (supports: display: grid) ***! + \\\\****************************************************************/ +@supports (display: flex) { + @supports (display: grid) { + + .class { + deep-nested: 1; + } + } +} + +/*!***********************************************************!*\\\\ + !*** css ./supports-nested.css (supports: display: flex) ***! + \\\\***********************************************************/ +@supports (display: flex) { + + .class { + nested: 1; + } +} + +/*!*****************************************************!*\\\\ + !*** css ./layer-deep-deep-nested.css (layer: baz) ***! + \\\\*****************************************************/ +@layer foo { + @layer bar { + @layer baz { + .class { + deep-deep-nested: 1; + } + } + } +} + +/*!************************************************!*\\\\ + !*** css ./layer-deep-nested.css (layer: bar) ***! + \\\\************************************************/ +@layer foo { + @layer bar { + + .class { + deep-nested: 1; + } + } +} + +/*!*******************************************!*\\\\ + !*** css ./layer-nested.css (layer: foo) ***! + \\\\*******************************************/ +@layer foo { + + .class { + nested: 1; + } +} + +/*!*********************************************************************************************************************!*\\\\ + !*** css ./all-deep-deep-nested.css (layer: baz) (supports: display: table) (media: screen and (min-width: 600px)) ***! + \\\\*********************************************************************************************************************/ +@layer foo { + @supports (display: flex) { + @media screen and (min-width: 400px) { + @layer bar { + @supports (display: grid) { + @media screen and (min-width: 500px) { + @layer baz { + @supports (display: table) { + @media screen and (min-width: 600px) { + .class { + deep-deep-nested: 1; + } + } + } + } + } + } + } + } + } +} + +/*!***************************************************************************************************************!*\\\\ + !*** css ./all-deep-nested.css (layer: bar) (supports: display: grid) (media: screen and (min-width: 500px)) ***! + \\\\***************************************************************************************************************/ +@layer foo { + @supports (display: flex) { + @media screen and (min-width: 400px) { + @layer bar { + @supports (display: grid) { + @media screen and (min-width: 500px) { + + .class { + deep-nested: 1; + } + } + } + } + } + } +} + +/*!**********************************************************************************************************!*\\\\ + !*** css ./all-nested.css (layer: foo) (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\**********************************************************************************************************/ +@layer foo { + @supports (display: flex) { + @media screen and (min-width: 400px) { + + .class { + nested: 1; + } + } + } +} + +/*!*****************************************************!*\\\\ + !*** css ./mixed-deep-deep-nested.css (layer: bar) ***! + \\\\*****************************************************/ +@media screen and (min-width: 400px) { + @supports (display: flex) { + @layer bar { + .class { + deep-deep-nested: 1; + } + } + } +} + +/*!*************************************************************!*\\\\ + !*** css ./mixed-deep-nested.css (supports: display: flex) ***! + \\\\*************************************************************/ +@media screen and (min-width: 400px) { + @supports (display: flex) { + + .class { + deep-nested: 1; + } + } +} + +/*!*********************************************************************!*\\\\ + !*** css ./mixed-nested.css (media: screen and (min-width: 400px)) ***! + \\\\*********************************************************************/ +@media screen and (min-width: 400px) { + + .class { + nested: 1; + } +} + +/*!********************************************!*\\\\ + !*** css ./anonymous-deep-deep-nested.css ***! + \\\\********************************************/ +@layer { + @layer { + @layer { + .class { + deep-deep-nested: 1; + } + } + } +} + +/*!***************************************!*\\\\ + !*** css ./anonymous-deep-nested.css ***! + \\\\***************************************/ +@layer { + @layer { + + .class { + deep-nested: 1; + } + } +} + +/*!*****************************************************!*\\\\ + !*** css ./layer-deep-deep-nested.css (layer: baz) ***! + \\\\*****************************************************/ +@layer { + @layer base { + @layer baz { + .class { + deep-deep-nested: 1; + } + } + } +} + +/*!*************************************************!*\\\\ + !*** css ./layer-deep-nested.css (layer: base) ***! + \\\\*************************************************/ +@layer { + @layer base { + + .class { + deep-nested: 1; + } + } +} + +/*!**********************************!*\\\\ + !*** css ./anonymous-nested.css ***! + \\\\**********************************/ +@layer { + + .class { + deep-nested: 1; + } +} + +/*!************************************************************************************!*\\\\ + !*** css ./media-deep-deep-nested.css (media: screen and (orientation: portrait)) ***! + \\\\************************************************************************************/ +@media screen and (orientation: portrait) { + .class { + deep-deep-nested: 1; + } +} + +/*!**************************************************!*\\\\ + !*** css ./style8.css (supports: display: flex) ***! + \\\\**************************************************/ +@media screen and (orientation: portrait) { + @supports (display: flex) { + .class { + content: \\"style8.css\\"; + } + } +} + +/*!******************************************************************************!*\\\\ + !*** css ./duplicate-nested.css (media: screen and (orientation: portrait)) ***! + \\\\******************************************************************************/ +@media screen and (orientation: portrait) { + + .class { + duplicate-nested: true; + } +} + +/*!********************************************!*\\\\ + !*** css ./anonymous-deep-deep-nested.css ***! + \\\\********************************************/ +@supports (display: flex) { + @media screen and (orientation: portrait) { + @layer { + @layer { + .class { + deep-deep-nested: 1; + } + } + } + } +} + +/*!***************************************!*\\\\ + !*** css ./anonymous-deep-nested.css ***! + \\\\***************************************/ +@supports (display: flex) { + @media screen and (orientation: portrait) { + @layer { + + .class { + deep-nested: 1; + } + } + } +} + +/*!*****************************************************!*\\\\ + !*** css ./layer-deep-deep-nested.css (layer: baz) ***! + \\\\*****************************************************/ +@supports (display: flex) { + @media screen and (orientation: portrait) { + @layer base { + @layer baz { + .class { + deep-deep-nested: 1; + } + } + } + } +} + +/*!*************************************************!*\\\\ + !*** css ./layer-deep-nested.css (layer: base) ***! + \\\\*************************************************/ +@supports (display: flex) { + @media screen and (orientation: portrait) { + @layer base { + + .class { + deep-nested: 1; + } + } + } +} + +/*!********************************************************************************************************!*\\\\ + !*** css ./anonymous-nested.css (supports: display: flex) (media: screen and (orientation: portrait)) ***! + \\\\********************************************************************************************************/ +@supports (display: flex) { + @media screen and (orientation: portrait) { + + .class { + deep-nested: 1; + } + } +} + +/*!*********************************************************************************************************************!*\\\\ + !*** css ./all-deep-deep-nested.css (layer: baz) (supports: display: table) (media: screen and (min-width: 600px)) ***! + \\\\*********************************************************************************************************************/ +@layer super.foo { + @supports (display: flex) { + @media screen and (min-width: 400px) { + @layer bar { + @supports (display: grid) { + @media screen and (min-width: 500px) { + @layer baz { + @supports (display: table) { + @media screen and (min-width: 600px) { + .class { + deep-deep-nested: 1; + } + } + } + } + } + } + } + } + } +} + +/*!***************************************************************************************************************!*\\\\ + !*** css ./all-deep-nested.css (layer: bar) (supports: display: grid) (media: screen and (min-width: 500px)) ***! + \\\\***************************************************************************************************************/ +@layer super.foo { + @supports (display: flex) { + @media screen and (min-width: 400px) { + @layer bar { + @supports (display: grid) { + @media screen and (min-width: 500px) { + + .class { + deep-nested: 1; + } + } + } + } + } + } +} + +/*!****************************************************************************************************************!*\\\\ + !*** css ./all-nested.css (layer: super.foo) (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\****************************************************************************************************************/ +@layer super.foo { + @supports (display: flex) { + @media screen and (min-width: 400px) { + + .class { + nested: 1; + } + } + } +} + +/*!***************************************************************************************************************!*\\\\ + !*** css ./style2.css?warning=6 (supports: unknown: layer(super.foo)) (media: screen and (min-width: 400px)) ***! + \\\\***************************************************************************************************************/ +@supports (unknown: layer(super.foo)) { + @media screen and (min-width: 400px) { + a { + color: red; + } + } +} + +/*!***************************************************************************************************************!*\\\\ + !*** css ./style2.css?warning=7 (supports: url: url(\\"./unknown.css\\")) (media: screen and (min-width: 400px)) ***! + \\\\***************************************************************************************************************/ +@supports (url: url(\\"./unknown.css\\")) { + @media screen and (min-width: 400px) { + a { + color: red; + } + } +} + +/*!*************************************************************************************************************!*\\\\ + !*** css ./style2.css?warning=8 (supports: url: url(./unknown.css)) (media: screen and (min-width: 400px)) ***! + \\\\*************************************************************************************************************/ +@supports (url: url(./unknown.css)) { + @media screen and (min-width: 400px) { + a { + color: red; + } + } +} + +/*!***************************************************************************************************************************************!*\\\\ + !*** css ./style2.css?foo=unknown (layer: super.foo) (supports: display: flex) (media: unknown(\\"foo\\") screen and (min-width: 400px)) ***! + \\\\***************************************************************************************************************************************/ +@layer super.foo { + @supports (display: flex) { + @media unknown(\\"foo\\") screen and (min-width: 400px) { + a { + color: red; + } + } + } +} + +/*!******************************************************************************************************************************************************!*\\\\ + !*** css ./style2.css?foo=unknown1 (layer: super.foo) (supports: display: url(\\"./unknown.css\\")) (media: unknown(foo) screen and (min-width: 400px)) ***! + \\\\******************************************************************************************************************************************************/ +@layer super.foo { + @supports (display: url(\\"./unknown.css\\")) { + @media unknown(foo) screen and (min-width: 400px) { + a { + color: red; + } + } + } +} + +/*!*********************************************************************************************************************************************!*\\\\ + !*** css ./style2.css?foo=unknown2 (layer: super.foo) (supports: display: url(./unknown.css)) (media: \\"foo\\" screen and (min-width: 400px)) ***! + \\\\*********************************************************************************************************************************************/ +@layer super.foo { + @supports (display: url(./unknown.css)) { + @media \\"foo\\" screen and (min-width: 400px) { + a { + color: red; + } + } + } +} + +/*!***************************************************!*\\\\ + !*** css ./style2.css?unknown3 (media: \\"string\\") ***! + \\\\***************************************************/ +@media \\"string\\" { + a { + color: red; + } +} + +/*!**********************************************************************************************************************************!*\\\\ + !*** css ./style2.css?wrong-order-but-valid=6 (supports: display: flex) (media: layer(super.foo) screen and (min-width: 400px)) ***! + \\\\**********************************************************************************************************************************/ +@supports (display: flex) { + @media layer(super.foo) screen and (min-width: 400px) { + a { + color: red; + } + } +} + +/*!****************************************!*\\\\ + !*** css ./style2.css?after-namespace ***! + \\\\****************************************/ +a { + color: red; +} + +/*!*************************************************************************!*\\\\ + !*** css ./style2.css?multiple=1 (media: url(./style2.css?multiple=2)) ***! + \\\\*************************************************************************/ +@media url(./style2.css?multiple=2) { + a { + color: red; + } +} + +/*!***************************************************************************!*\\\\ + !*** css ./style2.css?multiple=3 (media: url(\\"./style2.css?multiple=4\\")) ***! + \\\\***************************************************************************/ +@media url(\\"./style2.css?multiple=4\\") { + a { + color: red; + } +} + +/*!**************************************************************************!*\\\\ + !*** css ./style2.css?strange=3 (media: url(\\"./style2.css?multiple=4\\")) ***! + \\\\**************************************************************************/ +@media url(\\"./style2.css?multiple=4\\") { + a { + color: red; + } +} + +/*!************************************************************!*\\\\ + !*** css ./dark.css (media: (prefers-color-scheme: dark)) ***! + \\\\************************************************************/ +@media (prefers-color-scheme: dark) { + a { + color: white; + } +} + +/*!***************************************!*\\\\ + !*** css ./list-of-media-queries.css ***! + \\\\***************************************/ + +a { + color: black; +} + +/*!*********************************!*\\\\ + !*** css ./circular-nested.css ***! + \\\\*********************************/ + +.circular-nested { + color: red; +} + +/*!**************************!*\\\\ + !*** css ./circular.css ***! + \\\\**************************/ + +.circular { + color: red; +} + +/*!***********************!*\\\\ + !*** css ./style.css ***! + \\\\***********************/ + +/* Has the same URL */ + + + + + + + + +/* anonymous */ + +/* All unknown parse as media for compatibility */ + + + +/* Inside support */ + + +/** Possible syntax in future */ + + +/** Unknown */ + +@import-normalize; + +/** Warnings */ + +@import nourl(test.css); +@import ; +@import foo-bar; +@import layer(super.foo) \\"./style2.css?warning=1\\" supports(display: flex) screen and (min-width: 400px); +@import layer(super.foo) supports(display: flex) \\"./style2.css?warning=2\\" screen and (min-width: 400px); +@import layer(super.foo) supports(display: flex) screen and (min-width: 400px) \\"./style2.css?warning=3\\"; +@import layer(super.foo) url(fae7e602dbe59a260308.css?warning=4) supports(display: flex) screen and (min-width: 400px); +@import layer(super.foo) supports(display: flex) url(fae7e602dbe59a260308.css?warning=5) screen and (min-width: 400px); +@import layer(super.foo) supports(display: flex) screen and (min-width: 400px) url(fae7e602dbe59a260308.css?warning=6); +@namespace url(http://www.w3.org/1999/xhtml); +@import supports(background: url(09a1a1112c577c279435.png)); +@import supports(background: url(09a1a1112c577c279435.png)) screen and (min-width: 400px); +@import layer(test) supports(background: url(09a1a1112c577c279435.png)) screen and (min-width: 400px); +@import screen and (min-width: 400px); + + + +/* FIXME */ +/*@import url(\\"webpackIgnore-order.css\\");*/ + +body { + background: red; +} + +", +] +`; + +exports[`ConfigCacheTestCases css import exported tests should compile 2`] = ` +Array [ + "/*!***********************!*\\\\ + !*** css ./style.css ***! + \\\\***********************/ +@import \\"./style-import.css\\"; +@import \\"print.css?foo=1\\"; +@import url(\\"print.css?foo=2\\"); +@import \\"print.css?foo=3\\" layer(default); +@import url(\\"print.css?foo=4\\") layer(default); +@import \\"print.css?foo=5\\" supports(display: flex); +@import url(\\"print.css?foo=6\\") supports(display: flex); +@import \\"print.css?foo=7\\" screen and (min-width: 400px); +@import url(\\"print.css?foo=8\\") screen and (min-width: 400px); +@import \\"print.css?foo=9\\" layer(default) supports(display: flex); +@import \\"print.css?foo=10\\" layer(default) screen and (min-width: 400px); +@import \\"print.css?foo=11\\" supports(display: flex) screen and (min-width: 400px); +@import \\"print.css?foo=12\\" layer(default) supports(display: flex) screen and (min-width: 400px); +@import \\"print.css?foo=13\\"layer(default)supports(display: flex)screen and (min-width: 400px); +@import url(print.css?foo=14)layer(default)supports(display: flex)screen and (min-width: 400px); +@import url(\\"print.css?foo=15\\")layer(default)supports(display: flex)screen and (min-width: 400px); +@import url(print.css?foo=16)layer(default)supports(background: url(./img.png))screen and (min-width: 400px); +@import url(print.css?foo=17)layer(default)supports(background: url(\\"./img.png\\"))screen and (min-width: 400px); +@import url(print.css?foo=18)screen; +@import url(\\"print.css?foo=19\\")screen; +@import \\"print.css?foo=20\\"screen; +@import url(print.css?foo=18) screen ; +@import url(\\"print.css?foo=19\\") screen ; +@import \\"print.css?foo=20\\" screen ; +@import \\"print.css?foo=21\\" ; + +/* Has the same URL */ +@import \\"imported.css\\"; +@import \\"imported.css\\" layer(base); +@import \\"imported.css\\" supports(display: flex); +@import \\"imported.css\\" screen, print; + +@import url(style2.css?foo=1); +@import url('style2.css?foo=2'); +@import url(\\"style2.css?foo=3\\"); +@IMPORT url(style2.css?foo=4); +@import URL(style2.css?foo=5); +@import url(style2.css?foo=6 ); +@import url( style2.css?foo=7); +@import url( style2.css?foo=8 ); +@import url( +style2.css?foo=9 +); +@import url(); +@import url(''); +@import url(\\"\\"); +@import ''; +@import \\"\\"; +@import \\" \\"; +@import \\"\\\\ +\\"; +@import url(); +@import url(''); +@import url(\\"\\"); +@import url(\\"\\") /* test */; +@import url(\\"\\") screen and (orientation:landscape); +@import url(style2.css) screen and (orientation:landscape); +@import url(style2.css) SCREEN AND (ORIENTATION: LANDSCAPE); +@import url(style2.css)screen and (orientation:landscape); +@import url(style2.css) screen and (orientation:landscape); +@import url(style2.css) screen and (orientation:landscape); +@import url(style2.css) (min-width: 100px); +@import url(https://test.cases/path/../../../../configCases/css/import/external.css); +@import url(https://test.cases/path/../../../../configCases/css/import/external.css) screen and (orientation:landscape); +@import \\"//example.com/style.css\\"; +@import url('test.css?foo=1&bar=1'); +@import url('style2.css?foo=1&bar=1#hash'); +@import url('style2.css?foo=1&bar=1#hash') screen and (orientation:landscape); +@import url('https://fonts.googleapis.com/css?family=Roboto'); +@import url('https://fonts.googleapis.com/css?family=Noto+Sans+TC'); +@import url('https://fonts.googleapis.com/css?family=Noto+Sans+TC|Roboto'); +@import url('https://fonts.googleapis.com/css?family=Noto+Sans+TC|Roboto?foo=1') layer(super.foo) supports(display: flex) screen and (min-width: 400px); + +@import './sty\\\\ +le3.css?bar=1'; +@import './sty\\\\ +\\\\ +\\\\ +le3.css?bar=2'; +@import url('./sty\\\\ +le3.css?bar=3'); +@import url('./sty\\\\ +\\\\ +\\\\ +le3.css?=bar4'); + +@import \\"./styl'le7.css\\"; +@import url(\\"./styl'le7.css?foo=1\\"); +@import './styl\\\\'le7.css'; +@import url('./styl\\\\'le7.css'); +@import './test test.css'; +@import url('./test test.css?foo=1'); +@import './test\\\\ test.css?foo=2'; +@import url('./test\\\\ test.css?foo=3'); +@import './test%20test.css?foo=4'; +@import url('./test%20test.css?foo=5'); +@import './\\\\74\\\\65\\\\73\\\\74.css'; +@import url('./\\\\74\\\\65\\\\73\\\\74.css?foo=1'); +@import './t\\\\65\\\\73\\\\74.css?foo=2'; +@import url('./t\\\\65\\\\73\\\\74.css?foo=3'); +@import url(./test\\\\ test.css?foo=6); +@import url(./t\\\\65st%20test.css?foo=7); +@import url('./t\\\\65st%20test.css?foo=8'); +@import url(\\"./t\\\\65st%20test.css?foo=9\\"); +@import \\"./t\\\\65st%20test.css?fpp=10\\"; +@import './t\\\\65st%20test.css?foo=11'; +@import url( style6.css?foo=bazz ); +@import '\\\\ +\\\\ +\\\\ +'; +@import url('./string-loader.js?esModule=false!./test.css'); +@import url(style4.css?foo=bar); +@import url(style4.css?foo=bar#hash); +@import url(style4.css?#hash); +@import \\"style4.css?foo=1\\" supports(display: flex); +@import \\"style4.css?foo=2\\" supports(display: flex) screen and (orientation:landscape); + +@import \\" ./style4.css?foo=3 \\"; +@import url(' ./style4.css?foo=4 '); +@import url( ./style4.css?foo=5 ); + +@import url(' https://fonts.googleapis.com/css?family=Roboto '); +@import url('./string-loader.js?esModule=false'); +@import url(' ./string-loader.js?esModule=false!./test.css ') screen and (orientation: landscape); +@import url(data:text/css;charset=utf-8,a%20%7B%0D%0A%20%20color%3A%20red%3B%0D%0A%7D); +@import url(data:text/css;charset=utf-8,a%20%7B%0D%0A%20%20color%3A%20blue%3B%0D%0A%7D) screen and (orientation:landscape); +@import url(\\"data:text/css;charset=utf-8;base64,YSB7DQogIGNvbG9yOiByZWQ7DQp9\\"); + +@import url(\\"./style5.css?foo=1\\") supports(); +@import url(\\"./style5.css?foo=2\\") supports( ); +@import url(\\"./style5.css?foo=3\\") supports(unknown); +@import url(\\"./style5.css?foo=4\\") supports(display: flex); +@import url(\\"./style5.css?foo=5\\") supports(display: flex !important); +@import url(\\"./style5.css?foo=6\\") supports(display: flex) screen and (min-width: 400px); +@import url(\\"./style5.css?foo=7\\") supports(selector(a b)); +@import url(\\"./style5.css?foo=8\\") supports( display: flex ); +@import url(\\"./layer.css?foo=1\\") layer; +@import url(\\"./layer.css?foo=2\\") layer(default); +@import url(\\"./layer.css?foo=3\\") layer(default) supports(display: flex) screen and (min-width: 400px); +@import url(\\"./layer.css?foo=3\\") layer supports(display: flex) screen and (min-width: 400px); +@import url(\\"./layer.css?foo=4\\") layer() supports(display: flex) screen and (min-width: 400px); +@import url(\\"./layer.css?foo=5\\") layer(); +@import url(\\"./layer.css?foo=6\\") layer( foo.bar.baz ); +@import url(\\"./layer.css?foo=7\\") layer( ); +@import url(\\"./style6.css\\")layer(default)supports(display: flex)screen and (min-width:400px); +@import \\"./style6.css?foo=1\\"layer(default)supports(display: flex)screen and (min-width:400px); +@import \\"./style6.css?foo=2\\"supports(display: flex)screen and (min-width:400px); +@import \\"./style6.css?foo=3\\"screen and (min-width:400px); +@import url(\\"./style6.css?foo=4\\")screen and (min-width:400px); +@import url(./style6.css?foo=5)screen and (min-width:400px); +@import url(\\"./style6.css?foo=6\\") layer( default ) supports( display : flex ) screen and ( min-width : 400px ); +@import URL(\\"./style6.css?foo=7\\") LAYER(DEFAULT) SUPPORTS(DISPLAY: FLEX) SCREEN AND (MIN-WIDTH: 400PX); +@import url(\\"./style6.css?foo=8\\") LAYER SUPPORTS(DISPLAY: FLEX) SCREEN AND (MIN-WIDTH: 400PX); +@import url(\\"./style6.css?foo=9\\") /* Comment */ layer(/* Comment */default/* Comment */) /* Comment */ supports(/* Comment */display/* Comment */:/* Comment */ flex/* Comment */)/* Comment */ screen/* Comment */ and/* Comment */ (/* Comment */min-width/* Comment */: /* Comment */400px/* Comment */); +@import url(style6.css?foo=10) /* Comment */; +@import url(style6.css?foo=11) /* Comment */ /* Comment */; +@import url(style6.css?foo=12) /* Comment *//* Comment */; +@import url(style6.css?foo=13)/* Comment *//* Comment */; +@import +url(style6.css?foo=14) +/* Comment */ +/* Comment */; +@import /* Comment */ url(style6.css?foo=15) /* Comment */; +@import url(style6.css?foo=16) /* Comment */ print and (orientation:landscape); +@import url(style6.css?foo=17)/* Comment */print and (orientation:landscape)/* Comment */; +@import /* Comment */ url(style6.css?foo=18) /* Comment */ print and (orientation:landscape); + +@import url(\\"./style8.css\\") screen and (min-width: 400px); +@import url(\\"./style8.css\\") (prefers-color-scheme: dark); +@import url(\\"./style8.css\\") supports(display: flex); +@import url(\\"./style8.css\\") supports(((display: flex))); +@import url(\\"./style8.css\\") supports(((display: inline-grid))) screen and (((min-width: 400px))); +@import url(\\"./style8.css\\") supports(display: flex); +@import url('./style8.css') supports(display: grid); +@import url(\\"./style8.css\\") supports(display: flex) screen and (min-width: 400px); +@import url(\\"./style8.css\\") layer(framework); +@import url(\\"./style8.css\\") layer(default); +@import url(\\"./style8.css\\") layer(base); +@import url(\\"./style8.css\\") layer(default) supports(display: flex); +@import url(\\"./style8.css\\") layer(default) supports(display: flex) screen and (min-width: 400px); + +/* anonymous */ +@import \\"style2.css\\" layer(); +@import \\"style2.css\\" layer; + +/* All unknown parse as media for compatibility */ +@import url(\\"./style9.css\\") unknown(default) unknown(display: flex) unknown; +@import url(\\"./style9.css\\") unknown(default); + +@import url(\\"./style10.css\\"); + +@import \\"./media-nested.css\\" screen and (min-width: 400px); +@import \\"./supports-nested.css\\" supports(display: flex); +@import \\"./layer-nested.css\\" layer(foo); +@import \\"./all-nested.css\\" layer(foo) supports(display: flex) screen and (min-width: 400px); +@import \\"./mixed-nested.css\\" screen and (min-width: 400px); +@import \\"./anonymous-nested.css\\" layer; +@import \\"./media-deep-deep-nested.css\\" screen and (orientation: portrait); +@import \\"./duplicate-nested.css\\" screen and (orientation: portrait); +@import \\"./anonymous-nested.css\\" supports(display: flex) screen and (orientation: portrait); +@import \\"./all-nested.css\\" layer(super.foo) supports(display: flex) screen and (min-width: 400px); + +/* Inside support */ + +@import url(\\"/style2.css?warning=6\\") supports(unknown: layer(super.foo)) screen and (min-width: 400px); +@import url(\\"/style2.css?warning=7\\") supports(url: url(\\"./unknown.css\\")) screen and (min-width: 400px); +@import url(\\"/style2.css?warning=8\\") supports(url: url(./unknown.css)) screen and (min-width: 400px); + +/** Possible syntax in future */ + +@import url(\\"/style2.css?foo=unknown\\") layer(super.foo) supports(display: flex) unknown(\\"foo\\") screen and (min-width: 400px); +@import url(\\"/style2.css?foo=unknown1\\") layer(super.foo) supports(display: url(\\"./unknown.css\\")) unknown(foo) screen and (min-width: 400px); +@import url(\\"/style2.css?foo=unknown2\\") layer(super.foo) supports(display: url(./unknown.css)) \\"foo\\" screen and (min-width: 400px); +@import \\"./style2.css?unknown3\\" \\"string\\"; + +/** Unknown */ + +@import-normalize; + +/** Warnings */ + +@import nourl(test.css); +@import ; +@import foo-bar; +@import layer(super.foo) \\"./style2.css?warning=1\\" supports(display: flex) screen and (min-width: 400px); +@import layer(super.foo) supports(display: flex) \\"./style2.css?warning=2\\" screen and (min-width: 400px); +@import layer(super.foo) supports(display: flex) screen and (min-width: 400px) \\"./style2.css?warning=3\\"; +@import layer(super.foo) url(\\"./style2.css?warning=4\\") supports(display: flex) screen and (min-width: 400px); +@import layer(super.foo) supports(display: flex) url(\\"./style2.css?warning=5\\") screen and (min-width: 400px); +@import layer(super.foo) supports(display: flex) screen and (min-width: 400px) url(\\"./style2.css?warning=6\\"); +@import url(\\"/style2.css?wrong-order-but-valid=6\\") supports(display: flex) layer(super.foo) screen and (min-width: 400px); +@namespace url(http://www.w3.org/1999/xhtml); +@import url(\\"./style2.css?after-namespace\\"); +@import supports(background: url(\\"./img.png\\")); +@import supports(background: url(\\"./img.png\\")) screen and (min-width: 400px); +@import layer(test) supports(background: url(\\"./img.png\\")) screen and (min-width: 400px); +@import screen and (min-width: 400px); + +@import url(./style2.css?multiple=1) url(./style2.css?multiple=2); +@import url(\\"./style2.css?multiple=3\\") url(\\"./style2.css?multiple=4\\"); +@import \\"./style2.css?strange=3\\" url(\\"./style2.css?multiple=4\\"); + +@import url(\\"external-1.css\\"); +@import url(\\"external-2.css\\") supports(display: grid) screen and (max-width: 400px); +@import url(\\"external-3.css\\") supports(not (display: grid) and (display: flex)) screen and (max-width: 400px); +@import url(\\"external-4.css\\") supports((selector(h2 > p)) and + (font-tech(color-COLRv1))); +@import url(external-5.css) layer(default); +@import url(external-6.css) layer(default); +@import url(\\"external-7.css\\") layer(); +@import url(\\"external-8.css\\") layer; +@import url(\\"external-9.css\\") print; +@import url(\\"external-10.css\\") print, screen; +@import url(\\"external-11.css\\") screen; +@import url(\\"external-12.css\\") screen and (orientation: landscape); +@import url(\\"external-13.css\\") supports(not (display: flex)); +@import url(\\"external-14.css\\") layer(default) supports(display: grid) screen and (max-width: 400px); + +@import url(\\"ignore.css\\"); +@import url(\\"list-of-media-queries.css\\"); +@import url(\\"/alias.css\\"); +@import url(\\"circular.css\\"); +/* FIXME */ +/*@import url(\\"webpackIgnore-order.css\\");*/ + +body { + background: red; +} + +", +] +`; + +exports[`ConfigCacheTestCases css large exported tests should allow to create css modules: dev 1`] = ` +Object { + "placeholder": "my-app-_tailwind_module_css-placeholder-gray-700", +} +`; + +exports[`ConfigCacheTestCases css large exported tests should allow to create css modules: prod 1`] = ` +Object { + "placeholder": "_144-Oh6j", +} +`; + +exports[`ConfigCacheTestCases css local-ident-name exported tests should have correct local ident for css export locals 1`] = ` +Object { + "btn--info_is-disabled_1": "_style_module_css-btn--info_is-disabled_1", + "btn-info_is-disabled": "_style_module_css-btn-info_is-disabled", + "color-red": "--_style_module_css-color-red", + "foo": "bar", + "foo_bar": "_style_module_css-foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "_style_module_css-simple", +} +`; + +exports[`ConfigCacheTestCases css local-ident-name exported tests should have correct local ident for css export locals 2`] = ` +Object { + "btn--info_is-disabled_1": "_2058b663514f2425ba48", + "btn-info_is-disabled": "_2aba8b96a0ac031f537a", + "color-red": "--_0de89cac8a4c2f23ed3a", + "foo": "bar", + "foo_bar": "_7d728a7a17547f118b8f", + "my-btn-info_is-disabled": "value", + "simple": "_0536cc02142c55d85df9", +} +`; + +exports[`ConfigCacheTestCases css local-ident-name exported tests should have correct local ident for css export locals 3`] = ` +Object { + "btn--info_is-disabled_1": "_563acd9d8c57311eee97-btn--info_is-disabled_1", + "btn-info_is-disabled": "_563acd9d8c57311eee97-btn-info_is-disabled", + "color-red": "--_563acd9d8c57311eee97-color-red", + "foo": "bar", + "foo_bar": "_563acd9d8c57311eee97-foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "_563acd9d8c57311eee97-simple", +} +`; + +exports[`ConfigCacheTestCases css local-ident-name exported tests should have correct local ident for css export locals 4`] = ` +Object { + "btn--info_is-disabled_1": "./style.module__btn--info_is-disabled_1", + "btn-info_is-disabled": "./style.module__btn-info_is-disabled", + "color-red": "--./style.module__color-red", + "foo": "bar", + "foo_bar": "./style.module__foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "./style.module__simple", +} +`; + +exports[`ConfigCacheTestCases css local-ident-name exported tests should have correct local ident for css export locals 5`] = ` +Object { + "btn--info_is-disabled_1": "./style.module.css__btn--info_is-disabled_1", + "btn-info_is-disabled": "./style.module.css__btn-info_is-disabled", + "color-red": "--./style.module.css__color-red", + "foo": "bar", + "foo_bar": "./style.module.css__foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "./style.module.css__simple", +} +`; + +exports[`ConfigCacheTestCases css local-ident-name exported tests should have correct local ident for css export locals 6`] = ` +Object { + "btn--info_is-disabled_1": "./style.module.css?q#f__btn--info_is-disabled_1", + "btn-info_is-disabled": "./style.module.css?q#f__btn-info_is-disabled", + "color-red": "--./style.module.css?q#f__color-red", + "foo": "bar", + "foo_bar": "./style.module.css?q#f__foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "./style.module.css?q#f__simple", +} +`; + +exports[`ConfigCacheTestCases css local-ident-name exported tests should have correct local ident for css export locals 7`] = ` +Object { + "btn--info_is-disabled_1": "-_style_module_css_uniqueName-id-contenthash-b49b9b7fd945be4564a4", + "btn-info_is-disabled": "-_style_module_css_uniqueName-id-contenthash-2ec29062639f5c113084", + "color-red": "---_style_module_css_uniqueName-id-contenthash-f5073cf3e0954d246c7e", + "foo": "bar", + "foo_bar": "-_style_module_css_uniqueName-id-contenthash-71d31d18648cccfa9d17", + "my-btn-info_is-disabled": "value", + "simple": "-_style_module_css_uniqueName-id-contenthash-c93d824ddb3eb05477b2", +} +`; + +exports[`ConfigCacheTestCases css local-ident-name exported tests should have correct local ident for css export locals 8`] = ` +Object { + "btn--info_is-disabled_1": "./style.module.less__btn--info_is-disabled_1", + "btn-info_is-disabled": "./style.module.less__btn-info_is-disabled", + "color-red": "--./style.module.less__color-red", + "foo": "bar", + "foo_bar": "./style.module.less__foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "./style.module.less__simple", +} +`; + +exports[`ConfigCacheTestCases css local-ident-name exported tests should have correct local ident for css export locals 9`] = ` +Object { + "btn--info_is-disabled_1": "_style_module_css-btn--info_is-disabled_1", + "btn-info_is-disabled": "_style_module_css-btn-info_is-disabled", + "color-red": "--_style_module_css-color-red", + "foo": "bar", + "foo_bar": "_style_module_css-foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "_style_module_css-simple", +} +`; + +exports[`ConfigCacheTestCases css local-ident-name exported tests should have correct local ident for css export locals 10`] = ` +Object { + "btn--info_is-disabled_1": "_2058b663514f2425ba48", + "btn-info_is-disabled": "_2aba8b96a0ac031f537a", + "color-red": "--_0de89cac8a4c2f23ed3a", + "foo": "bar", + "foo_bar": "_7d728a7a17547f118b8f", + "my-btn-info_is-disabled": "value", + "simple": "_0536cc02142c55d85df9", +} +`; + +exports[`ConfigCacheTestCases css local-ident-name exported tests should have correct local ident for css export locals 11`] = ` +Object { + "btn--info_is-disabled_1": "_563acd9d8c57311eee97-btn--info_is-disabled_1", + "btn-info_is-disabled": "_563acd9d8c57311eee97-btn-info_is-disabled", + "color-red": "--_563acd9d8c57311eee97-color-red", + "foo": "bar", + "foo_bar": "_563acd9d8c57311eee97-foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "_563acd9d8c57311eee97-simple", +} +`; + +exports[`ConfigCacheTestCases css local-ident-name exported tests should have correct local ident for css export locals 12`] = ` +Object { + "btn--info_is-disabled_1": "./style.module__btn--info_is-disabled_1", + "btn-info_is-disabled": "./style.module__btn-info_is-disabled", + "color-red": "--./style.module__color-red", + "foo": "bar", + "foo_bar": "./style.module__foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "./style.module__simple", +} +`; + +exports[`ConfigCacheTestCases css local-ident-name exported tests should have correct local ident for css export locals 13`] = ` +Object { + "btn--info_is-disabled_1": "./style.module.css__btn--info_is-disabled_1", + "btn-info_is-disabled": "./style.module.css__btn-info_is-disabled", + "color-red": "--./style.module.css__color-red", + "foo": "bar", + "foo_bar": "./style.module.css__foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "./style.module.css__simple", +} +`; + +exports[`ConfigCacheTestCases css local-ident-name exported tests should have correct local ident for css export locals 14`] = ` +Object { + "btn--info_is-disabled_1": "./style.module.css?q#f__btn--info_is-disabled_1", + "btn-info_is-disabled": "./style.module.css?q#f__btn-info_is-disabled", + "color-red": "--./style.module.css?q#f__color-red", + "foo": "bar", + "foo_bar": "./style.module.css?q#f__foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "./style.module.css?q#f__simple", +} +`; + +exports[`ConfigCacheTestCases css local-ident-name exported tests should have correct local ident for css export locals 15`] = ` +Object { + "btn--info_is-disabled_1": "-_style_module_css_uniqueName-id-contenthash-b49b9b7fd945be4564a4", + "btn-info_is-disabled": "-_style_module_css_uniqueName-id-contenthash-2ec29062639f5c113084", + "color-red": "---_style_module_css_uniqueName-id-contenthash-f5073cf3e0954d246c7e", + "foo": "bar", + "foo_bar": "-_style_module_css_uniqueName-id-contenthash-71d31d18648cccfa9d17", + "my-btn-info_is-disabled": "value", + "simple": "-_style_module_css_uniqueName-id-contenthash-c93d824ddb3eb05477b2", +} +`; + +exports[`ConfigCacheTestCases css local-ident-name exported tests should have correct local ident for css export locals 16`] = ` +Object { + "btn--info_is-disabled_1": "./style.module.less__btn--info_is-disabled_1", + "btn-info_is-disabled": "./style.module.less__btn-info_is-disabled", + "color-red": "--./style.module.less__color-red", + "foo": "bar", + "foo_bar": "./style.module.less__foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "./style.module.less__simple", +} +`; + +exports[`ConfigCacheTestCases css no-extra-runtime-in-js exported tests should compile 1`] = ` +Array [ + "/*!***********************!*\\\\ + !*** css ./style.css ***! + \\\\***********************/ +.class { + color: red; + background: + url(img.png), + url(img.png), + url(d4da020aedcd249a7a41.png); + url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=), + url(resource.png), + url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=), + url(7976064b7fcb4f6b3916.html), + url(https://example.com/img.png); +} + +.class-2 { + background: url(shared.png); +} + +.class-3 { + background: url(shared-external.png); +} + +.class-4 { + background: url(cde81354a9a8ce8d5f51.gif); +} + +.class-5 { + background: url(5649e83cc54c4b57bc28.png); +} + +", +] +`; + +exports[`ConfigCacheTestCases css pseudo-import exported tests should compile 1`] = ` +Array [ + "/*!********************************!*\\\\ + !*** css ./export.modules.css ***! + \\\\********************************/ + +/*!*********************************!*\\\\ + !*** css ./library.modules.css ***! + \\\\*********************************/ + +/*!*******************************!*\\\\ + !*** css ./after.modules.css ***! + \\\\*******************************/ + +/*!********************************!*\\\\ + !*** css ./vars-1.modules.css ***! + \\\\********************************/ + +/*!*******************************!*\\\\ + !*** css ./style.modules.css ***! + \\\\*******************************/ + + +._style_modules_css-class { + color: red; + background: red; +} + + +._style_modules_css-class {background: red} + +._style_modules_css-class { + color: red; + color: red; + color: red; + color: red; +} + + +._style_modules_css-class { + color: red; +} + + +._style_modules_css-class { + color: red; +} + +/* TODO fix me */ +/*:import(\\"reexport.modules.css\\") { + primary-color: _my_color; +} + +.class {color: primary-color}*/ + + +._style_modules_css-class { + color: red, red, func() ; +} + +._style_modules_css-nest { + :import(\\"./export.modules.css\\") { + unknown: unknown; + } + + :export { + unknown: unknown; + } + + unknown: unknown; +} + +", + "/*!********************************!*\\\\ + !*** css ./export.modules.css ***! + \\\\********************************/ + +/*!*********************************!*\\\\ + !*** css ./library.modules.css ***! + \\\\*********************************/ + +/*!*******************************!*\\\\ + !*** css ./after.modules.css ***! + \\\\*******************************/ + +/*!********************************!*\\\\ + !*** css ./vars-1.modules.css ***! + \\\\********************************/ + +/*!*******************************!*\\\\ + !*** css ./style.modules.css ***! + \\\\*******************************/ + + +._style_modules_css-class { + color: red; + background: red; +} + + +._style_modules_css-class {background: red} + +._style_modules_css-class { + color: red; + color: red; + color: red; + color: red; +} + + +._style_modules_css-class { + color: red; +} + + +._style_modules_css-class { + color: red; +} + +/* TODO fix me */ +/*:import(\\"reexport.modules.css\\") { + primary-color: _my_color; +} + +.class {color: primary-color}*/ + + +._style_modules_css-class { + color: red, red, func() ; +} + +._style_modules_css-nest { + :import(\\"./export.modules.css\\") { + unknown: unknown; + } + + :export { + unknown: unknown; + } + + unknown: unknown; +} + +", +] +`; + +exports[`ConfigCacheTestCases css pure-css exported tests should compile 1`] = ` +Array [ + "/*!***************************************************!*\\\\ + !*** css ../css-modules/at-rule-value.module.css ***! + \\\\***************************************************/ +@value my-red blue; + +.value-in-class { + color: my-red; +} + +@value v-comment-broken:; +@value v-comment-broken-v1:/* comment */; + +@value small: (max-width: 599px); + +@media small { + abbr:hover { + color: limegreen; + transition-duration: 1s; + } +} + +@value blue-v1: red; + +.foo { color: blue-v1; } + +@value blue-v3: red; + +.foo { + &.bar { color: blue-v3; } +} + +@value blue-v3: red; + +.foo { + @media (min-width: 1024px) { + &.bar { color: blue-v3; } + } +} + +@value blue-v4: red; + +.foo { + @media (min-width: 1024px) { + &.bar { + @media (min-width: 1024px) { + color: blue-v4; + } + } + } +} + +@value test-t: 40px; +@value test_q: 36px; + +.foo { height: test-t; height: test_q; } + +@value colorValue: red; + +.colorValue { + color: colorValue; +} + +@value colorValue-v1: red; + +#colorValue-v1 { + color: colorValue-v1; +} + +@value colorValue-v2: red; + +.colorValue-v2 > .colorValue-v2 { + color: colorValue-v2; +} + +@value colorValue-v3: .red; + +colorValue-v3 { + color: colorValue-v3; +} + +@value red-v2 from \\"./colors.module.css\\"; + +.export { + color: red-v2; +} + +@value blue-v1 as green from \\"./colors.module.css\\"; + +.foo { color: green; } + +@value blue-i, green-v2 from \\"./colors.module.css\\"; + +.foo { color: blue-i; } +.bar { color: green-v2 } + +@value red-v3 from colors; +@value colors: \\"./colors.module.css\\"; + +.foo { color: red-v3; } + +@value colors: \\"./colors.module.css\\"; +@value red-v4 from colors; + +.foo { color: red-v4; } + +@value aaa: red; +@value bbb: aaa; + +.class-a { color: bbb; } + +@value base: 10px; +@value large: calc(base * 2); + +.class-a { margin: large; } + +@value a from \\"./colors.module.css\\"; +@value b from \\"./colors.module.css\\"; + +.class-a { content: a b; } + +@value --red from \\"./colors.module.css\\"; + +.foo { color: --red; } + +@value named: red; +@value _3char #0f0; +@value _6char #00ff00; +@value rgba rgba(34, 12, 64, 0.3); +@value hsla hsla(220, 13.0%, 18.0%, 1); + +.foo { + color: named; + background-color: _3char; + border-top-color: _6char; + border-bottom-color: rgba; + outline-color: hsla; +} + +@value (blue-i, red-i) from \\"./colors.module.css\\"; + +.foo { color: red-i; } +.bar { color: blue-i } + +@value coolShadow: 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14) ; + +.foo { box-shadow: coolShadow; } + +@value func: color(red lightness(50%)); + +.foo { color: func; } + +@value v-color: red; + +:root { --color: v-color; } + +@value v-empty: ; + +:root { --color:v-empty; } + +@value v-empty-v2: ; + +:root { --color:v-empty-v2; } + +@value v-empty-v3: /* comment */; + +:root { --color:v-empty-v3; } + +@value override: blue; +@value override: red; + +.override { + color: override; +} + +@value (blue-v1 as my-name) from \\"./colors.module.css\\"; +@value (blue-v1 as my-name-again, red-v1) from \\"./colors.module.css\\"; + +.class { + color: my-name; + color: my-name-again; + color: red-v1; +} + +@value/* test */blue-v5/* test */:/* test */red/* test */; + +.color { + color: blue-v5; +} + +@value/* test */blue-v6/* test *//* test */red/* test */; + +.color { + color: blue-v6; +} + +@value coolShadow-v2 : 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14) ; + +.foo { box-shadow: coolShadow-v2; } + +@value /* test */ coolShadow-v3 /* test */ : 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14) ; + +.foo { box-shadow: coolShadow-v3; } + +@value /* test */ coolShadow-v4 /* test */ 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14) ; + +.foo { box-shadow: coolShadow-v4; } + +@value/* test */coolShadow-v5/* test */0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); + +.foo { box-shadow: coolShadow-v5; } + +@value/* test */coolShadow-v6/* test */:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); + +.foo { box-shadow: coolShadow-v6; } + +@value/* test */coolShadow-v7/* test */:/* test */0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); + +.foo { box-shadow: coolShadow-v7; } + +@value /* test */ test-v1 /* test */ from /* test */ \\"./colors.module.css\\" /* test */; + +.foo { color: test-v1; } + +@value/* test */test-v2/* test */from/* test */\\"./colors.module.css\\"/* test */; + +.foo { color: test-v2; } + +@value/* test */(/* test */blue/* test */as/* test */my-name-q/* test */)/* test */from/* test */\\"./colors.module.css\\"/* test */; + +.foo { color: my-name-q; } + +@value; +@value test; + +/*!**************************************************!*\\\\ + !*** css ../css-modules/var-function.module.css ***! + \\\\**************************************************/ +:root { + --main-bg-color: brown; + --my-var: red; + --my-background: blue; + --my-global: yellow; + --: \\"reserved\\"; + --a: green; +} + +.class { + color: var(--main-bg-color); +} + +@property --logo-color { + syntax: \\"\\"; + inherits: false; + initial-value: #c0ffee; +} + +@property -- { + syntax: \\"\\"; + inherits: false; + initial-value: #c0ffee; +} + +.class { + color: var(--logo-color); +} + +div { + background-color: var(--box-color); +} + +.two { + --box-color: cornflowerblue; +} + +.three { + --box-color: aquamarine; +} + + +.one { + /* Red if --my-var is not defined */ + color: var(--my-var, red); +} + +.two { + /* pink if --my-var and --my-background are not defined */ + color: var(--my-var, var(--my-background, pink)); +} + +.reserved { + color: var(--); +} + +.green { + color: var(--a); +} + +.global { + color: var(--my-global from global); +} + +.global-and-default { + color: var(--my-global from global, pink); +} + +.global-and-default-1 { + color: var(--my-global from global, var(--my-global-background from global)); +} + +.global-and-default-2 { + color: var(--my-global from global, var(--my-global-background from global, pink)); +} + +.global-and-default-3 { + color: var(--my-global from global, var(--my-background, pink)); +} + +.global-and-default-5 { + color: var( --my-global from global,var(--my-background,pink)); +} + +.global-and-default-6 { + background: var( --main-bg-color , var( --my-background , pink ) ) , var(--my-global from global); +} + +.global-and-default-7 { + background: var(--main-bg-color,var(--my-background,pink)),var(--my-global from global); +} + +.from { + color: var(--my-var-u1 from \\"./var-function-export.modules.css\\"); +} + +.from-1 { + color: var(--main-bg-color, var(--my-var-u1 from \\"./var-function-export.modules.css\\")); +} + +.from-2 { + color: var(--my-var-u1 from \\"./var-function-export.modules.css\\", var(--main-bg-color)); +} + +.from-3 { + color: var(--my-var-u1 from \\"./var-function-export.modules.css\\", var(--my-var-u2 from \\"./var-function-export.modules.css\\")); +} + +.from-4 { + color: var(--1 from \\"./var-function-export.modules.css\\"); +} + +.from-5 { + color: var(----a from \\"./var-function-export.modules.css\\"); +} + +.from-6 { + color: var(--main-bg-color from \\"./var-function-export.modules.css\\"); +} + +.mixed { + color: var(--my-var-u1 from \\"./var-function-export.modules.css\\", var(--my-global from global, var(--main-bg-color, red))); +} + +.broken { + color: var(--my-global from); +} + +.broken-1 { + color: var(--my-global from 1); +} + +:root { + --not-override-class: red; +} + +.not-override-class { + color: var(--not-override-class from \\"./var-function-export.modules.css\\") +} + +/*!*******************************************!*\\\\ + !*** css ../css-modules/style.module.css ***! + \\\\*******************************************/ + +.class { + color: red; +} + +.local1, +.local2 :global .global, +.local3 { + color: green; +} + +:global .global :local .local4 { + color: yellow; +} + +.local5:global(.global).local6 { + color: blue; +} + +.local7 div:not(.disabled, .mButtonDisabled, .tipOnly) { + pointer-events: initial !important; +} + +.local8 :is(div.parent1.child1.vertical-tiny, + div.parent1.child1.vertical-small, + div.otherDiv.horizontal-tiny, + div.otherDiv.horizontal-small div.description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +.local9 :matches(div.parent1.child1.vertical-tiny, + div.parent1.child1.vertical-small, + div.otherDiv.horizontal-tiny, + div.otherDiv.horizontal-small div.description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +.local10 :where(div.parent1.child1.vertical-tiny, + div.parent1.child1.vertical-small, + div.otherDiv.horizontal-tiny, + div.otherDiv.horizontal-small div.description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +.local11 div:has(.disabled, .mButtonDisabled, .tipOnly) { + pointer-events: initial !important; +} + +.local12 div:current(p, span) { + background-color: yellow; +} + +.local13 div:past(p, span) { + display: none; +} + +.local14 div:future(p, span) { + background-color: yellow; +} + +.local15 div:-moz-any(ol, ul, menu, dir) { + list-style-type: square; +} + +.local16 li:-webkit-any(:first-child, :last-child) { + background-color: aquamarine; +} + +.local9 :matches(div.parent1.child1.vertical-tiny, + div.parent1.child1.vertical-small, + div.otherDiv.horizontal-tiny, + div.otherDiv.horizontal-small div.description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +:global(:global(:local(.nested1)).nested2).nested3 { + color: pink; +} + +#ident { + color: purple; +} + +@keyframes localkeyframes { + 0% { + left: var(--pos1x); + top: var(--pos1y); + color: var(--theme-color1); + } + 100% { + left: var(--pos2x); + top: var(--pos2y); + color: var(--theme-color2); + } +} + +@keyframes localkeyframes2 { + 0% { + left: 0; + } + 100% { + left: 100px; + } +} + +.animation { + animation-name: localkeyframes; + animation: 3s ease-in 1s 2 reverse both paused localkeyframes, localkeyframes2; + --pos1x: 0px; + --pos1y: 0px; + --pos2x: 10px; + --pos2y: 20px; +} + +/* .composed { + composes: local1; + composes: local2; +} */ + +.vars { + color: var(--local-color); + --local-color: red; +} + +.globalVars :global { + color: var(--global-color); + --global-color: red; +} + +@media (min-width: 1600px) { + .wideScreenClass { + color: var(--local-color); + --local-color: green; + } +} + +@media screen and (max-width: 600px) { + .narrowScreenClass { + color: var(--local-color); + --local-color: purple; + } +} + +@supports (display: grid) { + .displayGridInSupports { + display: grid; + } +} + +@supports not (display: grid) { + .floatRightInNegativeSupports { + float: right; + } +} + +@supports (display: flex) { + @media screen and (min-width: 900px) { + .displayFlexInMediaInSupports { + display: flex; + } + } +} + +@media screen and (min-width: 900px) { + @supports (display: flex) { + .displayFlexInSupportsInMedia { + display: flex; + } + } +} + +@MEDIA screen and (min-width: 900px) { + @SUPPORTS (display: flex) { + .displayFlexInSupportsInMediaUpperCase { + display: flex; + } + } +} + +.animationUpperCase { + ANIMATION-NAME: localkeyframesUPPERCASE; + ANIMATION: 3s ease-in 1s 2 reverse both paused localkeyframesUPPERCASE, localkeyframes2UPPPERCASE; + --pos1x: 0px; + --pos1y: 0px; + --pos2x: 10px; + --pos2y: 20px; +} + +@KEYFRAMES localkeyframesUPPERCASE { + 0% { + left: VAR(--pos1x); + top: VAR(--pos1y); + color: VAR(--theme-color1); + } + 100% { + left: VAR(--pos2x); + top: VAR(--pos2y); + color: VAR(--theme-color2); + } +} + +@KEYframes localkeyframes2UPPPERCASE { + 0% { + left: 0; + } + 100% { + left: 100px; + } +} + +:GLOBAL .globalUpperCase :LOCAL .localUpperCase { + color: yellow; +} + +.VARS { + color: VAR(--LOCAL-COLOR); + --LOCAL-COLOR: red; +} + +.globalVarsUpperCase :GLOBAL { + COLOR: VAR(--GLOBAR-COLOR); + --GLOBAR-COLOR: red; +} + +@supports (top: env(safe-area-inset-top, 0)) { + .inSupportScope { + color: red; + } +} + +.a { + animation: 3s animationName; + -webkit-animation: 3s animationName; +} + +.b { + animation: animationName 3s; + -webkit-animation: animationName 3s; +} + +.c { + animation-name: animationName; + -webkit-animation-name: animationName; +} + +.d { + --animation-name: animationName; +} + +@keyframes animationName { + 0% { + background: white; + } + 100% { + background: red; + } +} + +@-webkit-keyframes animationName { + 0% { + background: white; + } + 100% { + background: red; + } +} + +@-moz-keyframes mozAnimationName { + 0% { + background: white; + } + 100% { + background: red; + } +} + +@counter-style thumbs { + system: cyclic; + symbols: \\"\\\\1F44D\\"; + suffix: \\" \\"; +} + +@font-feature-values Font One { + @styleset { + nice-style: 12; + } +} + +/* At-rule for \\"nice-style\\" in Font Two */ +@font-feature-values Font Two { + @styleset { + nice-style: 4; + } +} + +@property --my-color { + syntax: \\"\\"; + inherits: false; + initial-value: #c0ffee; +} + +@property --my-color-1 { + initial-value: #c0ffee; + syntax: \\"\\"; + inherits: false; +} + +@property --my-color-2 { + syntax: \\"\\"; + initial-value: #c0ffee; + inherits: false; +} + +.class { + color: var(--my-color); +} + +@layer utilities { + .padding-sm { + padding: 0.5rem; + } + + .padding-lg { + padding: 0.8rem; + } +} + +.class { + color: red; + + .nested-pure { + color: red; + } + + @media screen and (min-width: 200px) { + color: blue; + + .nested-media { + color: blue; + } + } + + @supports (display: flex) { + display: flex; + + .nested-supports { + display: flex; + } + } + + @layer foo { + background: red; + + .nested-layer { + background: red; + } + } + + @container foo { + background: red; + + .nested-layer { + background: red; + } + } +} + +.not-selector-inside { + color: #fff; + opacity: 0.12; + padding: .5px; + unknown: :local(.test); + unknown1: :local .test; + unknown2: :global .test; + unknown3: :global .test; + unknown4: .foo, .bar, #bar; +} + +@unknown :local .local :global .global { + color: red; +} + +@unknown :local(.local) :global(.global) { + color: red; +} + +.nested-var { + .again { + color: var(--local-color); + } +} + +.nested-with-local-pseudo { + color: red; + + :local .local-nested { + color: red; + } + + :global .global-nested { + color: red; + } + + :local(.local-nested) { + color: red; + } + + :global(.global-nested) { + color: red; + } + + :local .local-nested, :global .global-nested-next { + color: red; + } + + :local(.local-nested), :global(.global-nested-next) { + color: red; + } + + :global .foo, .bar { + color: red; + } +} + +#id-foo { + color: red; + + #id-bar { + color: red; + } +} + +.nested-parens { + .local9 div:has(.vertical-tiny, .vertical-small) { + max-height: 0; + margin: 0; + overflow: hidden; + } +} + +:global .global-foo { + .nested-global { + color: red; + } + + :local .local-in-global { + color: blue; + } +} + +@unknown .class { + color: red; + + .class { + color: red; + } +} + +:global .class :local .in-local-global-scope, +:global .class :local .in-local-global-scope, +:local .class-local-scope :global .in-local-global-scope { + color: red; +} + +@container (width > 400px) { + .class-in-container { + font-size: 1.5em; + } +} + +@container summary (min-width: 400px) { + @container (width > 400px) { + .deep-class-in-container { + font-size: 1.5em; + } + } +} + +:scope { + color: red; +} + +.placeholder-gray-700:-ms-input-placeholder { + --placeholder-opacity: 1; + color: #4a5568; + color: rgba(74, 85, 104, var(--placeholder-opacity)); +} +.placeholder-gray-700::-ms-input-placeholder { + --placeholder-opacity: 1; + color: #4a5568; + color: rgba(74, 85, 104, var(--placeholder-opacity)); +} +.placeholder-gray-700::placeholder { + --placeholder-opacity: 1; + color: #4a5568; + color: rgba(74, 85, 104, var(--placeholder-opacity)); +} + +:root { + --test: dark; +} + +@media screen and (prefers-color-scheme: var(--test)) { + .baz { + color: white; + } +} + +@keyframes slidein { + from { + margin-left: 100%; + width: 300%; + } + + to { + margin-left: 0%; + width: 100%; + } +} + +.class { + animation: + foo var(--animation-name) 3s, + var(--animation-name) 3s, + 3s linear 1s infinite running slidein, + 3s linear env(foo, var(--baz)) infinite running slidein; +} + +:root { + --baz: 10px; +} + +.class { + bar: env(foo, var(--baz)); +} + +:global .global-foo, :local .bar { + :local .local-in-global { + color: blue; + } + + @media screen { + :global .my-global-class-again, + :local .my-global-class-again { + color: red; + } + } +} + +.first-nested { + .first-nested-nested { + color: red; + } +} + +.first-nested-at-rule { + @media screen { + .first-nested-nested-at-rule-deep { + color: red; + } + } +} + +:global .again-global { + color:red; +} + +:global .again-again-global { + :global .again-again-global { + color: red; + } +} + +:root { + --foo: red; +} + +:global .again-again-global { + color: var(--foo); + + :global .again-again-global { + color: var(--foo); + } +} + +:global .again-again-global { + animation: slidein 3s; + + :global .again-again-global, .class, :global(:global(:local(.nested1)).nested2).nested3 { + animation: slidein 3s; + } + + .local2 :global .global, + .local3 { + color: red; + } +} + +@unknown var(--foo) { + color: red; +} + +.class { + .class { + .class { + .class {} + } + } +} + +.class { + .class { + .class { + .class { + animation: slidein 3s; + } + } + } +} + +.class { + animation: slidein 3s; + .class { + animation: slidein 3s; + .class { + animation: slidein 3s; + .class { + animation: slidein 3s; + } + } + } +} + +.broken { + . global(.class) { + color: red; + } + + : global(.class) { + color: red; + } + + : global .class { + color: red; + } + + : local(.class) { + color: red; + } + + : local .class { + color: red; + } + + # hash { + color: red; + } +} + +.comments { + :/** test */global(.class) { + color: red; + } + + :/** test */global .class { + color: red; + } + + :/** test */local(.class) { + color: red; + } + + :/** test */local .class { + color: red; + } + + ./** test **/class { + color: red; + } + + :local(./** test **/class) { + color: red; + } + + :local ./** test **/class { + color: red; + } +} + +.foo { + color: red; + + .bar + & { color: blue; } +} + +.error, #err-404 { + &:hover > .baz { color: red; } +} + +.foo { + & :is(.bar, &.baz) { color: red; } +} + +.qqq { + color: green; + & .a { color: blue; } + color: red; +} + +.parent { + color: blue; + + @scope (& > .scope) to (& > .limit) { + & .content { + color: red; + } + } +} + +.parent { + color: blue; + + @scope (& > .scope) to (& > .limit) { + .content { + color: red; + } + } + + .a { + color: red; + } +} + +@scope (.card) { + :scope { border-block-end: 1px solid white; } +} + +.card { + inline-size: 40ch; + aspect-ratio: 3/4; + + @scope (&) { + :scope { + border: 1px solid white; + } + } +} + +.foo { + display: grid; + + @media (orientation: landscape) { + .bar { + grid-auto-flow: column; + + @media (min-width > 1024px) { + .baz-1 { + display: grid; + } + + max-inline-size: 1024px; + + .baz-2 { + display: grid; + } + } + } + } +} + +@counter-style thumbs { + system: cyclic; + symbols: \\"\\\\1F44D\\"; + suffix: \\" \\"; +} + +ul { + list-style: thumbs; +} + +@container (width > 400px) and style(--responsive: true) { + .class { + font-size: 1.5em; + } +} +/* At-rule for \\"nice-style\\" in Font One */ +@font-feature-values Font One { + @styleset { + nice-style: 12; + } +} + +@font-palette-values --identifier { + font-family: Bixa; +} + +.my-class { + font-palette: --identifier; +} + +@keyframes foo { /* ... */ } +@keyframes \\"foo\\" { /* ... */ } +@keyframes { /* ... */ } +@keyframes{ /* ... */ } + +@supports (display: flex) { + @media screen and (min-width: 900px) { + article { + display: flex; + } + } +} + +@starting-style { + .class { + opacity: 0; + transform: scaleX(0); + } +} + +.class { + opacity: 1; + transform: scaleX(1); + + @starting-style { + opacity: 0; + transform: scaleX(0); + } +} + +@scope (.feature) { + .class { opacity: 0; } + + :scope .class-1 { opacity: 0; } + + & .class { opacity: 0; } +} + +@position-try --custom-left { + position-area: left; + width: 100px; + margin: 0 10px 0 0; +} + +@position-try --custom-bottom { + top: anchor(bottom); + justify-self: anchor-center; + margin: 10px 0 0 0; + position-area: none; +} + +@position-try --custom-right { + left: calc(anchor(right) + 10px); + align-self: anchor-center; + width: 100px; + position-area: none; +} + +@position-try --custom-bottom-right { + position-area: bottom right; + margin: 10px 0 0 10px; +} + +.infobox { + position: fixed; + position-anchor: --myAnchor; + position-area: top; + width: 200px; + margin: 0 0 10px 0; + position-try-fallbacks: + --custom-left, --custom-bottom, + --custom-right, --custom-bottom-right; +} + +@page { + size: 8.5in 9in; + margin-top: 4in; +} + +@color-profile --swop5c { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +.header { + background-color: color(--swop5c 0% 70% 20% 0%); +} + +.test { + test: (1, 2) [3, 4], { 1: 2}; + .a { + width: 200px; + } +} + +.test { + .test { + width: 200px; + } +} + +.test { + width: 200px; + + .test { + width: 200px; + } +} + +.test { + width: 200px; + + .test { + .test { + width: 200px; + } + } +} + +.test { + width: 200px; + + .test { + width: 200px; + + .test { + width: 200px; + } + } +} + +.test { + .test { + width: 200px; + + .test { + width: 200px; + } + } +} + +.test { + .test { + width: 200px; + } + width: 200px; +} + +.test { + .test { + width: 200px; + } + .test { + width: 200px; + } +} + +.test { + .test { + width: 200px; + } + width: 200px; + .test { + width: 200px; + } +} + +#test { + c: 1; + + #test { + c: 2; + } +} + +@property --item-size { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} + +.container { + display: flex; + height: 200px; + border: 1px dashed black; + + /* set custom property values on parent */ + --item-size: 20%; + --item-color: orange; +} + +.item { + width: var(--item-size); + height: var(--item-size); + background-color: var(--item-color); +} + +.two { + --item-size: initial; + --item-color: inherit; +} + +.three { + /* invalid values */ + --item-size: 1000px; + --item-color: xyz; +} + +@property invalid { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property{ + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} + +@keyframes \\"initial\\" { /* ... */ } +@keyframes/**test**/\\"initial\\" { /* ... */ } +@keyframes/**test**/\\"initial\\"/**test**/{ /* ... */ } +@keyframes/**test**//**test**/\\"initial\\"/**test**//**test**/{ /* ... */ } +@keyframes /**test**/ /**test**/ \\"initial\\" /**test**/ /**test**/ { /* ... */ } +@keyframes \\"None\\" { /* ... */ } +@property/**test**/--item-size { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property/**test**/--item-size/**test**/{ + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property /**test**/--item-size/**test**/ { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property /**test**/ --item-size /**test**/ { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property/**test**/ --item-size /**test**/{ + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property /**test**/ --item-size /**test**/ { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +div { + animation: 3s ease-in 1s 2 reverse both paused \\"initial\\", localkeyframes2; + animation-name: \\"initial\\"; + animation-duration: 2s; +} + +.item-1 { + width: var( --item-size ); + height: var(/**comment**/--item-size); + background-color: var( /**comment**/--item-color); + background-color-1: var(/**comment**/ --item-color); + background-color-2: var( /**comment**/ --item-color); + background-color-3: var( /**comment**/ --item-color /**comment**/ ); + background-color-3: var( /**comment**/--item-color/**comment**/ ); + background-color-3: var(/**comment**/--item-color/**comment**/); +} + +@keyframes/**test**/foo { /* ... */ } +@keyframes /**test**/foo { /* ... */ } +@keyframes/**test**/ foo { /* ... */ } +@keyframes /**test**/ foo { /* ... */ } +@keyframes /**test**//**test**/ foo { /* ... */ } +@keyframes /**test**/ /**test**/ foo { /* ... */ } +@keyframes /**test**/ /**test**/foo { /* ... */ } +@keyframes /**test**//**test**/foo { /* ... */ } +@keyframes/**test**//**test**/foo { /* ... */ } +@keyframes/**test**//**test**/foo/**test**//**test**/{ /* ... */ } +@keyframes /**test**/ /**test**/ foo /**test**/ /**test**/ { /* ... */ } + +./**test**//**test**/class { + background: red; +} + +./**test**/ /**test**/class { + background: red; +} + +.var { + --main-color: black; + --FOO: 10px; + --foo: 10px; + --bar: calc(var(--foo) + 10px); + --accent-background: linear-gradient(to top, var(--main-color), white); + --external-link: \\"test\\"; + --custom-prop: yellow; + --default-value: red; + --main-bg-color: red; + --backup-bg-color: black; + -foo: calc(var(--bar) + 10px); + var: var(--main-color); + var1: var(--foo); + var2: var(--FOO); + content: \\" (\\" var(--external-link) \\")\\"; + var3: var(--main-color, blue); + var4: var(--custom-prop,); + var5: var(--custom-prop, initial); + var6: var(--custom-prop, var(--default-value)); + var7: var(--custom-prop, var(--default-value, red)); + var8: var(--unknown); + background-color: var(--main-bg-color, var(--backup-bg-color, white)); +} + +.var-order { + background-color: var(--test); + --test: red; +} + + +/*!***********************!*\\\\ + !*** css ./style.css ***! + \\\\***********************/ + +.class { + color: red; + background: var(--color); +} + +@keyframes test { + 0% { + color: red; + } + 100% { + color: blue; + } +} + +:local(.class) { + color: red; +} + +:local .class { + color: green; +} + +:global(.class) { + color: blue; +} + +:global .class { + color: white; +} + +:export { + foo: bar; +} + +.class { + animation: test 1s, test; +} + +", +] +`; + +exports[`ConfigCacheTestCases css url exported tests should work with URLs in CSS 1`] = ` +Array [ + "/*!************************!*\\\\ + !*** external \\"#test\\" ***! + \\\\************************/ +@import url(\\"#test\\"); +/*!************************!*\\\\ + !*** css ./nested.css ***! + \\\\************************/ + +.nested { + background: url(img.09a1a1112c577c279435.png); +} + +/*!***********************!*\\\\ + !*** css ./style.css ***! + \\\\***********************/ + +div { + a: url(img.09a1a1112c577c279435.png); +} + +div { + b: url(img.09a1a1112c577c279435.png); +} + +div { + c: url(img.09a1a1112c577c279435.png); +} + +div { + d: url(img.09a1a1112c577c279435.png#hash); +} + +div { + e: url( + img.09a1a1112c577c279435.png + ); +} + +div { + f: green url( img.09a1a1112c577c279435.png ) xyz; +} + +div { + g: green url( img.09a1a1112c577c279435.png ) xyz; +} + +div { + h: green url(img.09a1a1112c577c279435.png) xyz; +} + +div { + i: green url(img.09a1a1112c577c279435.png) url(img.09a1a1112c577c279435.png) xyz; +} + +div { + j: green url( img\\\\ img.09a1a1112c577c279435.png ) xyz; +} + +div { + k: green url( img\\\\ img.09a1a1112c577c279435.png ) xyz; +} + +div { + l: green url(img.09a1a1112c577c279435.png) xyz; +} + +div { + m: green url(img.09a1a1112c577c279435.png) xyz; +} + +div { + n: green url(img.09a1a1112c577c279435.png) xyz; +} + +div { + --foo: url(img.09a1a1112c577c279435.png); +} + +div { + a1: url(img.09a1a1112c577c279435.png); +} + +div { + a2: url(img.09a1a1112c577c279435.png); +} + +div { + a3: url(img.09a1a1112c577c279435.png); +} + +div { + a4: url(img.09a1a1112c577c279435.png#hash); +} + +div { + a5: url( + img.09a1a1112c577c279435.png + ); +} + +div { + a6: green url( img.09a1a1112c577c279435.png ) xyz; +} + +div { + a7: green url( img.09a1a1112c577c279435.png ) xyz; +} + +div { + a8: green url(img.09a1a1112c577c279435.png) xyz; +} + +div { + a9: green url(img.09a1a1112c577c279435.png) url(other-img.09a1a1112c577c279435.png) xyz; +} + +div { + a10: green url( img\\\\ img.09a1a1112c577c279435.png ) xyz; +} + +div { + a11: green url( img\\\\ img.09a1a1112c577c279435.png ) xyz; +} + +div { + a12: green url(img.09a1a1112c577c279435.png) xyz; +} + +div { + a13: green url(data:image/png;base64,AAA) url(http://example.com/image.jpg) url(//example.com/image.png) xyz; +} + +div { + a14: url(\\"data:image/svg+xml;charset=utf-8,\\"); +} + +div { + a15: url(data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2042%2026%27%20fill%3D%27%2523007aff%27%3E%3Crect%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%271%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2711%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2712%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2722%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2723%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3C%2Fsvg%3E); +} + +div { + a16: url('data:image/svg+xml;charset=utf-8,#filter'); +} + +div { + a17: url(\\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%5C%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%5C%22%3E%3Cfilter%20id%3D%5C%22filter%5C%22%3E%3CfeGaussianBlur%20in%3D%5C%22SourceAlpha%5C%22%20stdDeviation%3D%5C%220%5C%22%20%2F%3E%3CfeOffset%20dx%3D%5C%221%5C%22%20dy%3D%5C%222%5C%22%20result%3D%5C%22offsetblur%5C%22%20%2F%3E%3CfeFlood%20flood-color%3D%5C%22rgba(255%2C255%2C255%2C1)%5C%22%20%2F%3E%3CfeComposite%20in2%3D%5C%22offsetblur%5C%22%20operator%3D%5C%22in%5C%22%20%2F%3E%3CfeMerge%3E%3CfeMergeNode%20%2F%3E%3CfeMergeNode%20in%3D%5C%22SourceGraphic%5C%22%20%2F%3E%3C%2FfeMerge%3E%3C%2Ffilter%3E%3C%2Fsvg%3E%23filter\\"); +} + +div { + a18: url(#highlight); +} + +div { + a19: url(#line-marker); +} + +@font-face { + a20: url(font.31d6cfe0d16ae931b73c.woff) format('woff'), + url(font.31d6cfe0d16ae931b73c.woff2) format('woff2'), + url(font.31d6cfe0d16ae931b73c.eot) format('eot'), + url(font.31d6cfe0d16ae931b73c.ttf) format('truetype'), + url(\\"font with spaces.31d6cfe0d16ae931b73c.eot\\") format(\\"embedded-opentype\\"), + url(font.31d6cfe0d16ae931b73c.svg#svgFontName) format('svg'), + url(font.31d6cfe0d16ae931b73c.woff2?foo=bar) format('woff2'), + url(font.31d6cfe0d16ae931b73c.eot?#iefix) format('embedded-opentype'), + url(\\"font with spaces.31d6cfe0d16ae931b73c.eot?#iefix\\") format('embedded-opentype'); +} + +@media (min-width: 500px) { + div { + a21: url(img.09a1a1112c577c279435.png); + } +} + +div { + a22: \\"do not use url(path)\\"; +} + +div { + a23: 'do not \\"use\\" url(path)'; +} + +div { + a24: -webkit-image-set(url(img1x.09a1a1112c577c279435.png) 1x, url(img2x.09a1a1112c577c279435.png) 2x) +} + +div { + a25: image-set(url(img1x.09a1a1112c577c279435.png) 1x, url(img2x.09a1a1112c577c279435.png) 2x) +} + +div { + a26: green url() xyz; +} + +div { + a27: green url('') xyz; +} + +div { + a28: green url(\\"\\") xyz; +} + +div { + a29: green url(' ') xyz; +} + +div { + a30: green url( + ) xyz; +} + +div { + a40: green url(https://raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz; +} + +div { + a41: green url(//raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz; +} + +div { + a42: url(img.09a1a1112c577c279435.png?foo); +} + +div { + a43: url(img.09a1a1112c577c279435.png?foo=bar); +} + +div { + a44: url(img.09a1a1112c577c279435.png?foo=bar#hash); +} + +div { + a45: url(img.09a1a1112c577c279435.png?foo=bar#hash); +} + +div { + a46: url(img.09a1a1112c577c279435.png?); +} + +div { + a47: url(img.09a1a1112c577c279435.png) url(\\"data:image/svg+xml;charset=utf-8,\\") url(img.09a1a1112c577c279435.png); +} + +div { + a48: __URL__(); +} + +div { + a49: url(img-simple.09a1a1112c577c279435.png); +} + +div { + a50: url(img-simple.09a1a1112c577c279435.png); +} + +div { + a51: url(img-simple.09a1a1112c577c279435.png); +} + +div { + a52: url(img.09a1a1112c577c279435.png); +} + +div { + a53: url(img.09a1a1112c577c279435.png); +} + +@font-face { + a54: url(//at.alicdn.com/t/font_515771_emcns5054x3whfr.eot); +} + +div { + a55: -webkit-image-set(); + a56: -webkit-image-set(''); + a56: image-set(); + a58: image-set(''); + a59: image-set(\\"\\"); + a60: image-set(\\"\\" 1x); + a61: image-set(url()); + a62: image-set( + url() + ); + a63: image-set(URL()); + a64: image-set(url('')); + a65: image-set(url(\\"\\")); + a66: image-set(url('') 1x); + a67: image-set(1x); + a68: image-set( + 1x + ); + a69: image-set(calc(1rem + 1px) 1x); + + a70: -webkit-image-set(url(img1x.09a1a1112c577c279435.png) 1x, url(img2x.09a1a1112c577c279435.png) 2x); + a71: image-set(url(img1x.09a1a1112c577c279435.png) 1x); + a72: image-set(url(img1x.09a1a1112c577c279435.png) 1x, url(img2x.09a1a1112c577c279435.png) 2x); + a73: image-set(url(img\\\\ img.09a1a1112c577c279435.png) 1x, url(img\\\\ img.09a1a1112c577c279435.png) 2x); + a74: image-set(url(img1x.09a1a1112c577c279435.png) 1x, url(img2x.09a1a1112c577c279435.png) 2x), + image-set(url(img1x.09a1a1112c577c279435.png) 1x, url(img2x.09a1a1112c577c279435.png) 2x); + a75: image-set( + url(img1x.09a1a1112c577c279435.png) 1x, + url(img2x.09a1a1112c577c279435.png) 2x, + url(img3x.09a1a1112c577c279435.png) 600dpi + ); + a76: image-set(url(img1x.09a1a1112c577c279435.png?foo=bar) 1x); + a77: image-set(url(img1x.09a1a1112c577c279435.png#hash) 1x); + a78: image-set(url(img1x.09a1a1112c577c279435.png?#iefix) 1x); + + a79: -webkit-image-set(url(img1x.09a1a1112c577c279435.png) 1x, url(img2x.09a1a1112c577c279435.png) 2x); + a80: -webkit-image-set(url(img1x.09a1a1112c577c279435.png) 1x); + a81: -webkit-image-set( + url(img1x.09a1a1112c577c279435.png) 1x + ); + a82: image-set(url(img1x.09a1a1112c577c279435.png) 1x); + a83: image-set( + url(img1x.09a1a1112c577c279435.png) 1x + ); + a84: image-set(url(img1x.09a1a1112c577c279435.png) 1x, url(img2x.09a1a1112c577c279435.png) 2x); + a85: image-set( + url(img1x.09a1a1112c577c279435.png) 1x, + url(img2x.09a1a1112c577c279435.png) 2x, + url(img3x.09a1a1112c577c279435.png) 600dpi + ); + a86: image-set(url(img\\\\ img.09a1a1112c577c279435.png) 1x, url(img\\\\ img.09a1a1112c577c279435.png) 2x); + + a87: image-set(url(img1x.09a1a1112c577c279435.png) 1x, url(img2x.09a1a1112c577c279435.png) 2x); +} + +div { + a88: url(imgimg.09a1a1112c577c279435.png); + a89: url(img\\\\'img.09a1a1112c577c279435.png); + a90: url(img\\\\'\\\\'\\\\'img.09a1a1112c577c279435.png); + a91: url(img\\\\(img.09a1a1112c577c279435.png); + a92: url(img\\\\)img.09a1a1112c577c279435.png); + a93: url(img\\\\ img.09a1a1112c577c279435.png); + a94: url(\\"img'() img.09a1a1112c577c279435.png\\"); + + a95: image-set( + url(imgimg.09a1a1112c577c279435.png) 1x, + url(img\\\\'\\\\'\\\\'img.09a1a1112c577c279435.png) 2x, + url(img\\\\'img.09a1a1112c577c279435.png) 3x, + url(img\\\\(img.09a1a1112c577c279435.png) 4x, + url(img\\\\)img.09a1a1112c577c279435.png) 5x, + url(img\\\\ img.09a1a1112c577c279435.png) 6x, + url(\\"img'() img.09a1a1112c577c279435.png\\") 7x + ); +} + +div { + a96: url(img\\\\'\\\\'\\\\'img.09a1a1112c577c279435.png); + a97: url(\\"img'() img.09a1a1112c577c279435.png\\"); + a98: url(img\\\\'img.09a1a1112c577c279435.png); + a99: url(img\\\\(img.09a1a1112c577c279435.png); + a100: url(img\\\\)img.09a1a1112c577c279435.png); + a101: url(img\\\\ img.09a1a1112c577c279435.png); + a102: url(img\\\\ img.09a1a1112c577c279435.png); +} + +div { + a103: url(img\\\\(img.09a1a1112c577c279435.png); + a104: url(img\\\\(img.09a1a1112c577c279435.png); + a105: url(img\\\\(img.09a1a1112c577c279435.png); + a106: url(img\\\\(img.09a1a1112c577c279435.png); +} + +div { + a107: url(img\\\\'\\\\'\\\\'img.09a1a1112c577c279435.png); + a108: url(\\"img'() img.09a1a1112c577c279435.png\\"); + a109: url(img\\\\'img.09a1a1112c577c279435.png); + a110: url(img\\\\(img.09a1a1112c577c279435.png); + a111: url(img\\\\)img.09a1a1112c577c279435.png); + a112: url(img\\\\ img.09a1a1112c577c279435.png); + a113: url(img\\\\'\\\\'\\\\'img.09a1a1112c577c279435.png); + a114: url(\\"img'() img.09a1a1112c577c279435.png\\"); + a115: url(img\\\\'img.09a1a1112c577c279435.png); + a116: url(img\\\\(img.09a1a1112c577c279435.png); + a117: url(img\\\\)img.09a1a1112c577c279435.png); + a118: url(img\\\\ img.09a1a1112c577c279435.png); +} + +div { + a119: url(img.09a1a1112c577c279435.png); +} + +div { + a120: url(img\\\\'\\\\'\\\\'img.09a1a1112c577c279435.png); + a121: url(\\"img'() img.09a1a1112c577c279435.png\\"); + a122: url(img\\\\'img.09a1a1112c577c279435.png); + a123: url(img\\\\(img.09a1a1112c577c279435.png); + a124: url(img\\\\)img.09a1a1112c577c279435.png); + a125: url(img\\\\ img.09a1a1112c577c279435.png); + a126: url(img.09a1a1112c577c279435.png); + a127: url(img.09a1a1112c577c279435.png); + a128: url(img\\\\'img.09a1a1112c577c279435.png); + a129: url(\\"img'() img.09a1a1112c577c279435.png\\"); + a130: url(\\"img'() img.09a1a1112c577c279435.png\\"); +} + +div { + a131: url(img.09a1a1112c577c279435.png); + a132: url(img.09a1a1112c577c279435.png); + + a133: url(img.09a1a1112c577c279435.png?foo=bar); + a134: url(img.09a1a1112c577c279435.png?foo=bar); + + a135: url(img.09a1a1112c577c279435.png?foo=bar#hash); + a136: url(img.09a1a1112c577c279435.png?foo=bar#hash); + + a137: url(img.09a1a1112c577c279435.png?foo=bar); + a138: url(img.09a1a1112c577c279435.png?bar=foo); + + a139: url(img.09a1a1112c577c279435.png?foo=bar#foo); + a140: url(img.09a1a1112c577c279435.png?bar=foo#bar); + + a141: url(img.09a1a1112c577c279435.png?foo=1&bar=2); + a142: url(img.09a1a1112c577c279435.png?foo=2&bar=1); +} + +div { + a143: url(data:image/svg+xml;charset=UTF-8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20width%3D%22191px%22%20height%3D%22191px%22%20viewBox%3D%220%200%20191%20191%22%20enable-background%3D%22new%200%200%20191%20191%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M95.5%2C0C42.8%2C0%2C0%2C42.8%2C0%2C95.5S42.8%2C191%2C95.5%2C191S191%2C148.2%2C191%2C95.5S148.2%2C0%2C95.5%2C0z%20M95.5%2C187.6%0A%09c-50.848%2C0-92.1-41.25-92.1-92.1c0-50.848%2C41.252-92.1%2C92.1-92.1c50.85%2C0%2C92.1%2C41.252%2C92.1%2C92.1%0A%09C187.6%2C146.35%2C146.35%2C187.6%2C95.5%2C187.6z%22%2F%3E%0A%3Cg%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M92.9%2C10v8.6H91v-6.5c-0.1%2C0.1-0.2%2C0.2-0.4%2C0.3c-0.2%2C0.1-0.3%2C0.2-0.4%2C0.2c-0.1%2C0-0.3%2C0.1-0.5%2C0.2%0A%09%09c-0.2%2C0.1-0.3%2C0.1-0.5%2C0.1v-1.6c0.5-0.1%2C0.9-0.3%2C1.4-0.5c0.5-0.2%2C0.8-0.5%2C1.2-0.7h1.1V10z%22%2F%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M97.1%2C17.1h3.602v1.5h-5.6V18c0-0.4%2C0.1-0.8%2C0.2-1.2c0.1-0.4%2C0.3-0.6%2C0.5-0.9c0.2-0.3%2C0.5-0.5%2C0.7-0.7%0A%09%09c0.2-0.2%2C0.5-0.4%2C0.7-0.6c0.199-0.2%2C0.5-0.3%2C0.6-0.5c0.102-0.2%2C0.301-0.3%2C0.5-0.5c0.2-0.2%2C0.2-0.3%2C0.301-0.5%0A%09%09c0.101-0.2%2C0.101-0.3%2C0.101-0.5c0-0.4-0.101-0.6-0.3-0.8c-0.2-0.2-0.4-0.3-0.801-0.3c-0.699%2C0-1.399%2C0.3-2.101%2C0.9v-1.6%0A%09%09c0.7-0.5%2C1.5-0.7%2C2.5-0.7c0.399%2C0%2C0.8%2C0.1%2C1.101%2C0.2c0.301%2C0.1%2C0.601%2C0.3%2C0.899%2C0.5c0.3%2C0.2%2C0.399%2C0.5%2C0.5%2C0.8%0A%09%09c0.101%2C0.3%2C0.2%2C0.6%2C0.2%2C1s-0.102%2C0.7-0.2%2C1c-0.099%2C0.3-0.3%2C0.6-0.5%2C0.8c-0.2%2C0.2-0.399%2C0.5-0.7%2C0.7c-0.3%2C0.2-0.5%2C0.4-0.8%2C0.6%0A%09%09c-0.2%2C0.1-0.399%2C0.3-0.5%2C0.4s-0.3%2C0.3-0.5%2C0.4s-0.2%2C0.3-0.3%2C0.4C97.1%2C17%2C97.1%2C17%2C97.1%2C17.1z%22%2F%3E%0A%3C%2Fg%3E%0A%3Cg%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M15%2C95.4c0%2C0.7-0.1%2C1.4-0.2%2C2c-0.1%2C0.6-0.4%2C1.1-0.7%2C1.5C13.8%2C99.3%2C13.4%2C99.6%2C12.9%2C99.8s-1%2C0.3-1.5%2C0.3%0A%09%09c-0.7%2C0-1.3-0.1-1.8-0.3v-1.5c0.4%2C0.3%2C1%2C0.4%2C1.6%2C0.4c0.6%2C0%2C1.1-0.2%2C1.5-0.7c0.4-0.5%2C0.5-1.1%2C0.5-1.9l0%2C0%0A%09%09C12.8%2C96.7%2C12.3%2C96.9%2C11.5%2C96.9c-0.3%2C0-0.7-0.102-1-0.2c-0.3-0.101-0.5-0.3-0.8-0.5c-0.3-0.2-0.4-0.5-0.5-0.8%0A%09%09c-0.1-0.3-0.2-0.7-0.2-1c0-0.4%2C0.1-0.8%2C0.2-1.2c0.1-0.4%2C0.3-0.7%2C0.6-0.9c0.3-0.2%2C0.6-0.5%2C0.9-0.6c0.3-0.1%2C0.8-0.2%2C1.2-0.2%0A%09%09c0.5%2C0%2C0.9%2C0.1%2C1.2%2C0.3c0.3%2C0.2%2C0.7%2C0.4%2C0.9%2C0.8s0.5%2C0.7%2C0.6%2C1.2S15%2C94.8%2C15%2C95.4z%20M13.1%2C94.4c0-0.2%2C0-0.4-0.1-0.6%0A%09%09c-0.1-0.2-0.1-0.4-0.2-0.5c-0.1-0.1-0.2-0.2-0.4-0.3c-0.2-0.1-0.3-0.1-0.5-0.1c-0.2%2C0-0.3%2C0-0.4%2C0.1s-0.3%2C0.2-0.3%2C0.3%0A%09%09c0%2C0.1-0.2%2C0.3-0.2%2C0.4c0%2C0.1-0.1%2C0.4-0.1%2C0.6c0%2C0.2%2C0%2C0.4%2C0.1%2C0.6c0.1%2C0.2%2C0.1%2C0.3%2C0.2%2C0.4c0.1%2C0.1%2C0.2%2C0.2%2C0.4%2C0.3%0A%09%09c0.2%2C0.1%2C0.3%2C0.1%2C0.5%2C0.1c0.2%2C0%2C0.3%2C0%2C0.4-0.1s0.2-0.2%2C0.3-0.3c0.1-0.1%2C0.2-0.2%2C0.2-0.4C13%2C94.7%2C13.1%2C94.6%2C13.1%2C94.4z%22%2F%3E%0A%3C%2Fg%3E%0A%3Cg%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M176%2C99.7V98.1c0.6%2C0.4%2C1.2%2C0.602%2C2%2C0.602c0.5%2C0%2C0.8-0.102%2C1.1-0.301c0.301-0.199%2C0.4-0.5%2C0.4-0.801%0A%09%09c0-0.398-0.2-0.699-0.5-0.898c-0.3-0.2-0.8-0.301-1.3-0.301h-0.802V95h0.701c1.101%2C0%2C1.601-0.4%2C1.601-1.1c0-0.7-0.4-1-1.302-1%0A%09%09c-0.6%2C0-1.1%2C0.2-1.6%2C0.5v-1.5c0.6-0.3%2C1.301-0.4%2C2.1-0.4c0.9%2C0%2C1.5%2C0.2%2C2%2C0.6s0.701%2C0.9%2C0.701%2C1.5c0%2C1.1-0.601%2C1.8-1.701%2C2.1l0%2C0%0A%09%09c0.602%2C0.1%2C1.102%2C0.3%2C1.4%2C0.6s0.5%2C0.8%2C0.5%2C1.3c0%2C0.801-0.3%2C1.4-0.9%2C1.9c-0.6%2C0.5-1.398%2C0.7-2.398%2C0.7%0A%09%09C177.2%2C100.1%2C176.5%2C100%2C176%2C99.7z%22%2F%3E%0A%3C%2Fg%3E%0A%3Cg%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M98.5%2C179.102c0%2C0.398-0.1%2C0.799-0.2%2C1.199C98.2%2C180.7%2C98%2C181%2C97.7%2C181.2s-0.601%2C0.5-0.9%2C0.601%0A%09%09c-0.3%2C0.1-0.7%2C0.199-1.2%2C0.199c-0.5%2C0-0.9-0.1-1.3-0.3c-0.4-0.2-0.7-0.399-0.9-0.8c-0.2-0.4-0.5-0.7-0.6-1.2%0A%09%09c-0.1-0.5-0.2-1-0.2-1.601c0-0.699%2C0.1-1.399%2C0.3-2c0.2-0.601%2C0.4-1.101%2C0.8-1.5c0.4-0.399%2C0.7-0.699%2C1.2-1c0.5-0.3%2C1-0.3%2C1.6-0.3%0A%09%09c0.6%2C0%2C1.2%2C0.101%2C1.5%2C0.199v1.5c-0.4-0.199-0.9-0.399-1.4-0.399c-0.3%2C0-0.6%2C0.101-0.8%2C0.2c-0.2%2C0.101-0.5%2C0.3-0.7%2C0.5%0A%09%09c-0.2%2C0.199-0.3%2C0.5-0.4%2C0.8c-0.1%2C0.301-0.2%2C0.7-0.2%2C1.101l0%2C0c0.4-0.601%2C1-0.8%2C1.8-0.8c0.3%2C0%2C0.7%2C0.1%2C0.9%2C0.199%0A%09%09c0.2%2C0.101%2C0.5%2C0.301%2C0.7%2C0.5c0.199%2C0.2%2C0.398%2C0.5%2C0.5%2C0.801C98.5%2C178.2%2C98.5%2C178.7%2C98.5%2C179.102z%20M96.7%2C179.2%0A%09%09c0-0.899-0.4-1.399-1.1-1.399c-0.2%2C0-0.3%2C0-0.5%2C0.1c-0.2%2C0.101-0.3%2C0.201-0.4%2C0.301c-0.1%2C0.101-0.2%2C0.199-0.2%2C0.4%0A%09%09c0%2C0.199-0.1%2C0.299-0.1%2C0.5c0%2C0.199%2C0%2C0.398%2C0.1%2C0.6s0.1%2C0.3%2C0.2%2C0.5c0.1%2C0.199%2C0.2%2C0.199%2C0.4%2C0.3c0.2%2C0.101%2C0.3%2C0.101%2C0.5%2C0.101%0A%09%09c0.2%2C0%2C0.3%2C0%2C0.5-0.101c0.2-0.101%2C0.301-0.199%2C0.301-0.3c0-0.1%2C0.199-0.301%2C0.199-0.399C96.6%2C179.7%2C96.7%2C179.4%2C96.7%2C179.2z%22%2F%3E%0A%3C%2Fg%3E%0A%3Ccircle%20fill%3D%22%23636363%22%20cx%3D%2295%22%20cy%3D%2295%22%20r%3D%227%22%2F%3E%0A%3C%2Fsvg%3E%0A) 50% 50%/191px no-repeat; +} + +div { + a144: url(img.09a1a1112c577c279435.png); +} + +div { + a145: url(img.09a1a1112c577c279435.png); +} + +div { + /* TODO fix me */ + /*a146: url('./img.png', 'foo', './img.png', url('./img.png'));*/ + /*a147: image-set(url('./img.png', 'foo', './img.png', url('./img.png')) 1x, url(\\"./img2x.png\\") 2x);*/ +} + +div { + a148: url('data:image/svg+xml,%3Csvg xmlns=\\"http://www.w3.org/2000/svg\\"%3E%3Crect width=\\"100%25\\" height=\\"100%25\\" style=\\"stroke: rgb(223,224,225); stroke-width: 2px; fill: none; stroke-dasharray: 6px 3px\\" /%3E%3C/svg%3E'); + a149: url('data:image/svg+xml,%3Csvg xmlns=\\"http://www.w3.org/2000/svg\\"%3E%3Crect width=\\"100%25\\" height=\\"100%25\\" style=\\"stroke: rgb(223,224,225); stroke-width: 2px; fill: none; stroke-dasharray: 6px 3px\\" /%3E%3C/svg%3E'); + a150: url('data:image/svg+xml,%3Csvg xmlns=\\"http://www.w3.org/2000/svg\\"%3E%3Crect width=\\"100%25\\" height=\\"100%25\\" style=\\"stroke: rgb(223,224,225); stroke-width: 2px; fill: none; stroke-dasharray: 6px 3px\\" /%3E%3C/svg%3E'); + a151: url('data:image/svg+xml;utf8,'); + a152: url('data:image/svg+xml;utf8,'); +} + +div { + a152: url(img.09a1a1112c577c279435.png); +} + +div { + a153: url(img.09a1a1112c577c279435.png); +} + +div { + a154: url(other.09a1a1112c577c279435.png); +} + +div { + a155: url(img.09a1a1112c577c279435.png); +} + +div { + a156: url(\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e\\"); +} + +div { + a157: url('data:image/svg+xml;utf8,'); +} + +div { + a158: src(http://www.example.com/pinkish.gif); + --foo-bar: \\"http://www.example.com/pinkish.gif\\"; + a159: src(var(--foo)); +} + +div { + a160: url(img.09a1a1112c577c279435.png param(--color var(--primary-color))); + a161: src(img.09a1a1112c577c279435.png param(--color var(--primary-color))); +} + +div { + a162: url(img\\\\ img.09a1a1112c577c279435.png); + +} + +div { + a163: url(img.09a1a1112c577c279435.png); +} + + +div { + a164: url( img.png bug); +} + +div { + a165: url(imgn.09a1a1112c577c279435.png); +} + +div { + a166: url('data:image/svg+xml;utf8,'); +} + +div { + a167: url(http://example.com/image.jpg); + a168: url(http://example.com/image.jpg); +} + +div { + a169: url(data:,); + a170: url(data:,); +} + +div { + a171: image(ltr 'img.png#xywh=0,0,16,16', red); + a172: cross-fade(20% url(img.09a1a1112c577c279435.png), url(img.09a1a1112c577c279435.png)) +} + +div { + a172: image-set( + linear-gradient(blue, white) 1x, + linear-gradient(blue, green) 2x + ); + a173: image-set( + url(img.09a1a1112c577c279435.png) type(\\"image/png\\"), + url(img.09a1a1112c577c279435.png) type(\\"image/png\\") + ); + a174: image-set( + url(img.09a1a1112c577c279435.png) 1x, + url(img.09a1a1112c577c279435.png) 2x + ); + a175: image-set( + url(img.09a1a1112c577c279435.png) 1x, + url(img.09a1a1112c577c279435.png) 2x, + url(img.09a1a1112c577c279435.png) 3x + ); + a176: image-set( + url(img.09a1a1112c577c279435.png) type(\\"image/png\\"), + url(img.09a1a1112c577c279435.png) type(\\"image/png\\") + ) \\"img.png\\"; + a177: image-set( + url(img.09a1a1112c577c279435.png) 1x type(\\"image/png\\"), + url(img.09a1a1112c577c279435.png) 2x type(\\"image/png\\") + ); + a178: image-set( + url(img.09a1a1112c577c279435.png) type(\\"image/png\\") 1x, + url(img.09a1a1112c577c279435.png) type(\\"image/png\\") 2x + ); + a179: -webkit-image-set( + url(img.09a1a1112c577c279435.png) 1x + ); + a180: -webkit-image-set( + url(img.09a1a1112c577c279435.png var(--foo, \\"test.png\\")) 1x + ); +} + +div { + a181: src(img.09a1a1112c577c279435.png); + a181: src( img.09a1a1112c577c279435.png ); + a182: src(img.09a1a1112c577c279435.png); + a183: src(img.09a1a1112c577c279435.png var(--foo, \\"test.png\\")); + a184: src(var(--foo, \\"test.png\\")); + a185: src(img.09a1a1112c577c279435.png); +} + +div { + a186: image-set(url(img.09a1a1112c577c279435.png)1x,url(img.09a1a1112c577c279435.png)2x,url(img.09a1a1112c577c279435.png)3x); + a187: image-set(url(img.09a1a1112c577c279435.png)1x,url(img.09a1a1112c577c279435.png)2x,url(img.09a1a1112c577c279435.png)3x); + a188: image-set(url(img.09a1a1112c577c279435.png)1x,url(img.09a1a1112c577c279435.png)2x,url(img.09a1a1112c577c279435.png)3x); + a189: image-set(url(img.09a1a1112c577c279435.png)1x,url(img.09a1a1112c577c279435.png)2x,url(img.09a1a1112c577c279435.png)3x); + a190: image-set(url(img.09a1a1112c577c279435.png)1x); + a191: image-set(url(img.09a1a1112c577c279435.png)1x/* test*/,/* test*/url(img.09a1a1112c577c279435.png)2x); +} + +@supports (background-image: image-set(url(unknown.09a1a1112c577c279435.png)1x,url(unknown.09a1a1112c577c279435.png)2x,url(unknown.09a1a1112c577c279435.png)3x)) { + div { + a192: url(img.09a1a1112c577c279435.png); + a193: image-set(url(img.09a1a1112c577c279435.png)1x); + } +} + +@supports (background-image: url(unknown.09a1a1112c577c279435.png param(--test))) { + div { + a194: url(img.09a1a1112c577c279435.png); + } +} + +@supports (background-image: url(unknown.09a1a1112c577c279435.png)) { + div { + a195: url(img.09a1a1112c577c279435.png); + } +} + +@supports (display: grid) { + @media (min-width: 100px) { + @layer special { + div { + a196: url(img.09a1a1112c577c279435.png); + } + } + } +} + +div { + a197: \\\\u\\\\r\\\\l(img.09a1a1112c577c279435.png); + a198: \\\\image-\\\\set(url(img.09a1a1112c577c279435.png)1x,url(img.09a1a1112c577c279435.png)2x,url(img.09a1a1112c577c279435.png)3x); + a199: \\\\-webk\\\\it-image-set(url(img.09a1a1112c577c279435.png)1x); + a200:-webkit-image-set(url(img.09a1a1112c577c279435.png)1x); +} + +div { + a201: src(http://www.example.com/pinkish.gif); + --foo: \\"http://www.example.com/pinkish.gif\\"; + a202: src(var(--foo)); + a203: src(img.09a1a1112c577c279435.png); + a204: src(img.09a1a1112c577c279435.png); +} + +div { + a205: url(img.09a1a1112c577c279435.png); + a206: url(data:,); + a208: url(./img.png); + a208: url(data:,); + a209: url(data:,); + a210: url(data:,); + a211: url(\\\\'img.png\\\\'); +} + +", +] +`; + +exports[`ConfigCacheTestCases css url exported tests should work with URLs in CSS 2`] = ` +Array [ + "/*!************************!*\\\\ + !*** external \\"#test\\" ***! + \\\\************************/ +@import url(\\"#test\\"); +/*!************************!*\\\\ + !*** css ./nested.css ***! + \\\\************************/ + +.nested { + background: url('./img.png'); +} + +/*!***********************!*\\\\ + !*** css ./style.css ***! + \\\\***********************/ + +div { + a: url('./img.png'); +} + +div { + b: url(\\"./img.png\\"); +} + +div { + c: url(./img.png); +} + +div { + d: url(\\"./img.png#hash\\"); +} + +div { + e: url( + \\"./img.png\\" + ); +} + +div { + f: green url( './img.png' ) xyz; +} + +div { + g: green url( \\"./img.png\\" ) xyz; +} + +div { + h: green url( ./img.png ) xyz; +} + +div { + i: green url(package/img.png) url(./img.png) xyz; +} + +div { + j: green url( \\"./img img.png\\" ) xyz; +} + +div { + k: green url( './img img.png' ) xyz; +} + +div { + l: green url(/img.png) xyz; +} + +div { + m: green URL(/img.png) xyz; +} + +div { + n: green uRl(/img.png) xyz; +} + +div { + --foo: url('./img.png'); +} + +div { + a1: url('./img.png'); +} + +div { + a2: url(\\"./img.png\\"); +} + +div { + a3: url(./img.png); +} + +div { + a4: url(\\"./img.png#hash\\"); +} + +div { + a5: url( + \\"./img.png\\" + ); +} + +div { + a6: green url( './img.png' ) xyz; +} + +div { + a7: green url( \\"./img.png\\" ) xyz; +} + +div { + a8: green url( ./img.png ) xyz; +} + +div { + a9: green url(package/img.png) url(./other-img.png) xyz; +} + +div { + a10: green url( \\"./img img.png\\" ) xyz; +} + +div { + a11: green url( './img img.png' ) xyz; +} + +div { + a12: green url(/img.png) xyz; +} + +div { + a13: green url(data:image/png;base64,AAA) url(http://example.com/image.jpg) url(//example.com/image.png) xyz; +} + +div { + a14: url(\\"data:image/svg+xml;charset=utf-8,\\"); +} + +div { + a15: url(\\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2042%2026%27%20fill%3D%27%2523007aff%27%3E%3Crect%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%271%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2711%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2712%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2722%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2723%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3C%2Fsvg%3E\\"); +} + +div { + a16: url('data:image/svg+xml;charset=utf-8,#filter'); +} + +div { + a17: url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%5C%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%5C%22%3E%3Cfilter%20id%3D%5C%22filter%5C%22%3E%3CfeGaussianBlur%20in%3D%5C%22SourceAlpha%5C%22%20stdDeviation%3D%5C%220%5C%22%20%2F%3E%3CfeOffset%20dx%3D%5C%221%5C%22%20dy%3D%5C%222%5C%22%20result%3D%5C%22offsetblur%5C%22%20%2F%3E%3CfeFlood%20flood-color%3D%5C%22rgba(255%2C255%2C255%2C1)%5C%22%20%2F%3E%3CfeComposite%20in2%3D%5C%22offsetblur%5C%22%20operator%3D%5C%22in%5C%22%20%2F%3E%3CfeMerge%3E%3CfeMergeNode%20%2F%3E%3CfeMergeNode%20in%3D%5C%22SourceGraphic%5C%22%20%2F%3E%3C%2FfeMerge%3E%3C%2Ffilter%3E%3C%2Fsvg%3E%23filter'); +} + +div { + a18: url(#highlight); +} + +div { + a19: url('#line-marker'); +} + +@font-face { + a20: url(./font.woff) format('woff'), + url('./font.woff2') format('woff2'), + url(\\"./font.eot\\") format('eot'), + url(./font.ttf) format('truetype'), + url(\\"./font with spaces.eot\\") format(\\"embedded-opentype\\"), + url('./font.svg#svgFontName') format('svg'), + url('./font.woff2?foo=bar') format('woff2'), + url(\\"./font.eot?#iefix\\") format('embedded-opentype'), + url(\\"./font with spaces.eot?#iefix\\") format('embedded-opentype'); +} + +@media (min-width: 500px) { + div { + a21: url(\\"./img.png\\"); + } +} + +div { + a22: \\"do not use url(path)\\"; +} + +div { + a23: 'do not \\"use\\" url(path)'; +} + +div { + a24: -webkit-image-set(url('./img1x.png') 1x, url('./img2x.png') 2x) +} + +div { + a25: image-set(url('./img1x.png') 1x, url('./img2x.png') 2x) +} + +div { + a26: green url() xyz; +} + +div { + a27: green url('') xyz; +} + +div { + a28: green url(\\"\\") xyz; +} + +div { + a29: green url(' ') xyz; +} + +div { + a30: green url( + ) xyz; +} + +div { + a40: green url(https://raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz; +} + +div { + a41: green url(//raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz; +} + +div { + a42: url(\\"./img.png?foo\\"); +} + +div { + a43: url(\\"./img.png?foo=bar\\"); +} + +div { + a44: url(\\"./img.png?foo=bar#hash\\"); +} + +div { + a45: url(\\"./img.png?foo=bar#hash\\"); +} + +div { + a46: url(\\"./img.png?\\"); +} + +div { + a47: url('./img.png') url(\\"data:image/svg+xml;charset=utf-8,\\") url('./img.png'); +} + +div { + a48: __URL__(); +} + +div { + a49: url('./nested/../nested/img-simple.png'); +} + +div { + a50: url('/nested/img-simple.png'); +} + +div { + a51: url('../url/nested/img-simple.png'); +} + +div { + a52: url(./nested/img.png); +} + +div { + a53: url(nested/img.png); +} + +@font-face { + a54: url(\\"//at.alicdn.com/t/font_515771_emcns5054x3whfr.eot\\"); +} + +div { + a55: -webkit-image-set(); + a56: -webkit-image-set(''); + a56: image-set(); + a58: image-set(''); + a59: image-set(\\"\\"); + a60: image-set(\\"\\" 1x); + a61: image-set(url()); + a62: image-set( + url() + ); + a63: image-set(URL()); + a64: image-set(url('')); + a65: image-set(url(\\"\\")); + a66: image-set(url('') 1x); + a67: image-set(1x); + a68: image-set( + 1x + ); + a69: image-set(calc(1rem + 1px) 1x); + + a70: -webkit-image-set(\\"./img1x.png\\" 1x, \\"./img2x.png\\" 2x); + a71: image-set(\\"./img1x.png\\" 1x); + a72: image-set(\\"./img1x.png\\" 1x, \\"./img2x.png\\" 2x); + a73: image-set(\\"./img img.png\\" 1x, \\"./img img.png\\" 2x); + a74: image-set(\\"./img1x.png\\" 1x, \\"./img2x.png\\" 2x), + image-set(\\"./img1x.png\\" 1x, \\"./img2x.png\\" 2x); + a75: image-set( + \\"./img1x.png\\" 1x, + \\"./img2x.png\\" 2x, + \\"./img3x.png\\" 600dpi + ); + a76: image-set(\\"./img1x.png?foo=bar\\" 1x); + a77: image-set(\\"./img1x.png#hash\\" 1x); + a78: image-set(\\"./img1x.png?#iefix\\" 1x); + + a79: -webkit-image-set(url(\\"./img1x.png\\") 1x, url(\\"./img2x.png\\") 2x); + a80: -webkit-image-set(url(\\"./img1x.png\\") 1x); + a81: -webkit-image-set( + url(\\"./img1x.png\\") 1x + ); + a82: image-set(url(./img1x.png) 1x); + a83: image-set( + url(./img1x.png) 1x + ); + a84: image-set(url(\\"./img1x.png\\") 1x, url(\\"./img2x.png\\") 2x); + a85: image-set( + url(./img1x.png) 1x, + url(./img2x.png) 2x, + url(./img3x.png) 600dpi + ); + a86: image-set(url(\\"./img img.png\\") 1x, url(\\"./img img.png\\") 2x); + + a87: image-set(url(\\"./img1x.png\\") 1x, \\"./img2x.png\\" 2x); +} + +div { + a88: url(./img\\\\img.png); + a89: url(./img\\\\'img.png); + a90: url(./img\\\\'\\\\'\\\\'img.png); + a91: url(./img\\\\(img.png); + a92: url(./img\\\\)img.png); + a93: url(./img\\\\ img.png); + a94: url(./img\\\\'\\\\(\\\\)\\\\ img.png); + + a95: image-set( + url(./img\\\\img.png) 1x, + url(./img\\\\'\\\\'\\\\'img.png) 2x, + url(./img\\\\'img.png) 3x, + url(./img\\\\(img.png) 4x, + url(./img\\\\)img.png) 5x, + url(./img\\\\ img.png) 6x, + url(./img\\\\'\\\\(\\\\)\\\\ img.png) 7x + ); +} + +div { + a96: url(\\"./img'''img.png\\"); + a97: url(\\"./img'() img.png\\"); + a98: url(\\"./img'img.png\\"); + a99: url(\\"./img(img.png\\"); + a100: url(\\"./img)img.png\\"); + a101: url('./img img.png'); + a102: url(\\"./img img.png\\"); +} + +div { + a103: url('./img\\\\ +(img.png'); + a104: url('./img\\\\ +(img.png'); + a105: url('./img\\\\ +(img.png'); + a106: url('./img\\\\ +\\\\ +\\\\ +\\\\ +(img.png'); +} + +div { + a107: url(\\"./img%27%27%27img.png\\"); + a108: url(\\"./img%27%28%29%20img.png\\"); + a109: url(\\"./img%27img.png\\"); + a110: url(\\"./img%28img.png\\"); + a111: url(\\"./img%29img.png\\"); + a112: url(\\"./img%20img.png\\"); + a113: url(./img%27%27%27img.png); + a114: url(./img%27%28%29%20img.png); + a115: url(./img%27img.png); + a116: url(./img%28img.png); + a117: url(./img%29img.png); + a118: url(./img%20img.png); +} + +div { + a119: url('img.png'); +} + +div { + a120: url(\\"./img\\\\'\\\\'\\\\'img.png\\"); + a121: url(\\"./img\\\\'\\\\(\\\\)\\\\ img.png\\"); + a122: url(\\"./img\\\\'img.png\\"); + a123: url(\\"./img\\\\(img.png\\"); + a124: url(\\"./img\\\\)img.png\\"); + a125: url(\\"./img\\\\ img.png\\"); + a126: url(\\"./\\\\69\\\\6D\\\\67.png\\"); + a127: url(./\\\\69\\\\6D\\\\67.png); + a128: url(\\"./img\\\\27img.png\\"); + a129: url(\\"./img\\\\'\\\\28%29 img.png\\"); + a130: url(./img\\\\'\\\\28%29\\\\ img.png); +} + +div { + a131: url('./img.png'); + a132: url('./img.png'); + + a133: url('./img.png?foo=bar'); + a134: url('./img.png?foo=bar'); + + a135: url('./img.png?foo=bar#hash'); + a136: url('./img.png?foo=bar#hash'); + + a137: url('./img.png?foo=bar'); + a138: url('./img.png?bar=foo'); + + a139: url('./img.png?foo=bar#foo'); + a140: url('./img.png?bar=foo#bar'); + + a141: url('./img.png?foo=1&bar=2'); + a142: url('./img.png?foo=2&bar=1'); +} + +div { + a143: url(\\"data:image/svg+xml;charset=UTF-8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20width%3D%22191px%22%20height%3D%22191px%22%20viewBox%3D%220%200%20191%20191%22%20enable-background%3D%22new%200%200%20191%20191%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M95.5%2C0C42.8%2C0%2C0%2C42.8%2C0%2C95.5S42.8%2C191%2C95.5%2C191S191%2C148.2%2C191%2C95.5S148.2%2C0%2C95.5%2C0z%20M95.5%2C187.6%0A%09c-50.848%2C0-92.1-41.25-92.1-92.1c0-50.848%2C41.252-92.1%2C92.1-92.1c50.85%2C0%2C92.1%2C41.252%2C92.1%2C92.1%0A%09C187.6%2C146.35%2C146.35%2C187.6%2C95.5%2C187.6z%22%2F%3E%0A%3Cg%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M92.9%2C10v8.6H91v-6.5c-0.1%2C0.1-0.2%2C0.2-0.4%2C0.3c-0.2%2C0.1-0.3%2C0.2-0.4%2C0.2c-0.1%2C0-0.3%2C0.1-0.5%2C0.2%0A%09%09c-0.2%2C0.1-0.3%2C0.1-0.5%2C0.1v-1.6c0.5-0.1%2C0.9-0.3%2C1.4-0.5c0.5-0.2%2C0.8-0.5%2C1.2-0.7h1.1V10z%22%2F%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M97.1%2C17.1h3.602v1.5h-5.6V18c0-0.4%2C0.1-0.8%2C0.2-1.2c0.1-0.4%2C0.3-0.6%2C0.5-0.9c0.2-0.3%2C0.5-0.5%2C0.7-0.7%0A%09%09c0.2-0.2%2C0.5-0.4%2C0.7-0.6c0.199-0.2%2C0.5-0.3%2C0.6-0.5c0.102-0.2%2C0.301-0.3%2C0.5-0.5c0.2-0.2%2C0.2-0.3%2C0.301-0.5%0A%09%09c0.101-0.2%2C0.101-0.3%2C0.101-0.5c0-0.4-0.101-0.6-0.3-0.8c-0.2-0.2-0.4-0.3-0.801-0.3c-0.699%2C0-1.399%2C0.3-2.101%2C0.9v-1.6%0A%09%09c0.7-0.5%2C1.5-0.7%2C2.5-0.7c0.399%2C0%2C0.8%2C0.1%2C1.101%2C0.2c0.301%2C0.1%2C0.601%2C0.3%2C0.899%2C0.5c0.3%2C0.2%2C0.399%2C0.5%2C0.5%2C0.8%0A%09%09c0.101%2C0.3%2C0.2%2C0.6%2C0.2%2C1s-0.102%2C0.7-0.2%2C1c-0.099%2C0.3-0.3%2C0.6-0.5%2C0.8c-0.2%2C0.2-0.399%2C0.5-0.7%2C0.7c-0.3%2C0.2-0.5%2C0.4-0.8%2C0.6%0A%09%09c-0.2%2C0.1-0.399%2C0.3-0.5%2C0.4s-0.3%2C0.3-0.5%2C0.4s-0.2%2C0.3-0.3%2C0.4C97.1%2C17%2C97.1%2C17%2C97.1%2C17.1z%22%2F%3E%0A%3C%2Fg%3E%0A%3Cg%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M15%2C95.4c0%2C0.7-0.1%2C1.4-0.2%2C2c-0.1%2C0.6-0.4%2C1.1-0.7%2C1.5C13.8%2C99.3%2C13.4%2C99.6%2C12.9%2C99.8s-1%2C0.3-1.5%2C0.3%0A%09%09c-0.7%2C0-1.3-0.1-1.8-0.3v-1.5c0.4%2C0.3%2C1%2C0.4%2C1.6%2C0.4c0.6%2C0%2C1.1-0.2%2C1.5-0.7c0.4-0.5%2C0.5-1.1%2C0.5-1.9l0%2C0%0A%09%09C12.8%2C96.7%2C12.3%2C96.9%2C11.5%2C96.9c-0.3%2C0-0.7-0.102-1-0.2c-0.3-0.101-0.5-0.3-0.8-0.5c-0.3-0.2-0.4-0.5-0.5-0.8%0A%09%09c-0.1-0.3-0.2-0.7-0.2-1c0-0.4%2C0.1-0.8%2C0.2-1.2c0.1-0.4%2C0.3-0.7%2C0.6-0.9c0.3-0.2%2C0.6-0.5%2C0.9-0.6c0.3-0.1%2C0.8-0.2%2C1.2-0.2%0A%09%09c0.5%2C0%2C0.9%2C0.1%2C1.2%2C0.3c0.3%2C0.2%2C0.7%2C0.4%2C0.9%2C0.8s0.5%2C0.7%2C0.6%2C1.2S15%2C94.8%2C15%2C95.4z%20M13.1%2C94.4c0-0.2%2C0-0.4-0.1-0.6%0A%09%09c-0.1-0.2-0.1-0.4-0.2-0.5c-0.1-0.1-0.2-0.2-0.4-0.3c-0.2-0.1-0.3-0.1-0.5-0.1c-0.2%2C0-0.3%2C0-0.4%2C0.1s-0.3%2C0.2-0.3%2C0.3%0A%09%09c0%2C0.1-0.2%2C0.3-0.2%2C0.4c0%2C0.1-0.1%2C0.4-0.1%2C0.6c0%2C0.2%2C0%2C0.4%2C0.1%2C0.6c0.1%2C0.2%2C0.1%2C0.3%2C0.2%2C0.4c0.1%2C0.1%2C0.2%2C0.2%2C0.4%2C0.3%0A%09%09c0.2%2C0.1%2C0.3%2C0.1%2C0.5%2C0.1c0.2%2C0%2C0.3%2C0%2C0.4-0.1s0.2-0.2%2C0.3-0.3c0.1-0.1%2C0.2-0.2%2C0.2-0.4C13%2C94.7%2C13.1%2C94.6%2C13.1%2C94.4z%22%2F%3E%0A%3C%2Fg%3E%0A%3Cg%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M176%2C99.7V98.1c0.6%2C0.4%2C1.2%2C0.602%2C2%2C0.602c0.5%2C0%2C0.8-0.102%2C1.1-0.301c0.301-0.199%2C0.4-0.5%2C0.4-0.801%0A%09%09c0-0.398-0.2-0.699-0.5-0.898c-0.3-0.2-0.8-0.301-1.3-0.301h-0.802V95h0.701c1.101%2C0%2C1.601-0.4%2C1.601-1.1c0-0.7-0.4-1-1.302-1%0A%09%09c-0.6%2C0-1.1%2C0.2-1.6%2C0.5v-1.5c0.6-0.3%2C1.301-0.4%2C2.1-0.4c0.9%2C0%2C1.5%2C0.2%2C2%2C0.6s0.701%2C0.9%2C0.701%2C1.5c0%2C1.1-0.601%2C1.8-1.701%2C2.1l0%2C0%0A%09%09c0.602%2C0.1%2C1.102%2C0.3%2C1.4%2C0.6s0.5%2C0.8%2C0.5%2C1.3c0%2C0.801-0.3%2C1.4-0.9%2C1.9c-0.6%2C0.5-1.398%2C0.7-2.398%2C0.7%0A%09%09C177.2%2C100.1%2C176.5%2C100%2C176%2C99.7z%22%2F%3E%0A%3C%2Fg%3E%0A%3Cg%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M98.5%2C179.102c0%2C0.398-0.1%2C0.799-0.2%2C1.199C98.2%2C180.7%2C98%2C181%2C97.7%2C181.2s-0.601%2C0.5-0.9%2C0.601%0A%09%09c-0.3%2C0.1-0.7%2C0.199-1.2%2C0.199c-0.5%2C0-0.9-0.1-1.3-0.3c-0.4-0.2-0.7-0.399-0.9-0.8c-0.2-0.4-0.5-0.7-0.6-1.2%0A%09%09c-0.1-0.5-0.2-1-0.2-1.601c0-0.699%2C0.1-1.399%2C0.3-2c0.2-0.601%2C0.4-1.101%2C0.8-1.5c0.4-0.399%2C0.7-0.699%2C1.2-1c0.5-0.3%2C1-0.3%2C1.6-0.3%0A%09%09c0.6%2C0%2C1.2%2C0.101%2C1.5%2C0.199v1.5c-0.4-0.199-0.9-0.399-1.4-0.399c-0.3%2C0-0.6%2C0.101-0.8%2C0.2c-0.2%2C0.101-0.5%2C0.3-0.7%2C0.5%0A%09%09c-0.2%2C0.199-0.3%2C0.5-0.4%2C0.8c-0.1%2C0.301-0.2%2C0.7-0.2%2C1.101l0%2C0c0.4-0.601%2C1-0.8%2C1.8-0.8c0.3%2C0%2C0.7%2C0.1%2C0.9%2C0.199%0A%09%09c0.2%2C0.101%2C0.5%2C0.301%2C0.7%2C0.5c0.199%2C0.2%2C0.398%2C0.5%2C0.5%2C0.801C98.5%2C178.2%2C98.5%2C178.7%2C98.5%2C179.102z%20M96.7%2C179.2%0A%09%09c0-0.899-0.4-1.399-1.1-1.399c-0.2%2C0-0.3%2C0-0.5%2C0.1c-0.2%2C0.101-0.3%2C0.201-0.4%2C0.301c-0.1%2C0.101-0.2%2C0.199-0.2%2C0.4%0A%09%09c0%2C0.199-0.1%2C0.299-0.1%2C0.5c0%2C0.199%2C0%2C0.398%2C0.1%2C0.6s0.1%2C0.3%2C0.2%2C0.5c0.1%2C0.199%2C0.2%2C0.199%2C0.4%2C0.3c0.2%2C0.101%2C0.3%2C0.101%2C0.5%2C0.101%0A%09%09c0.2%2C0%2C0.3%2C0%2C0.5-0.101c0.2-0.101%2C0.301-0.199%2C0.301-0.3c0-0.1%2C0.199-0.301%2C0.199-0.399C96.6%2C179.7%2C96.7%2C179.4%2C96.7%2C179.2z%22%2F%3E%0A%3C%2Fg%3E%0A%3Ccircle%20fill%3D%22%23636363%22%20cx%3D%2295%22%20cy%3D%2295%22%20r%3D%227%22%2F%3E%0A%3C%2Fsvg%3E%0A\\") 50% 50%/191px no-repeat; +} + +div { + a144: url('%2E/img.png'); +} + +div { + a145: url(\\"/img.png\\"); +} + +div { + /* TODO fix me */ + /*a146: url('./img.png', 'foo', './img.png', url('./img.png'));*/ + /*a147: image-set(url('./img.png', 'foo', './img.png', url('./img.png')) 1x, url(\\"./img2x.png\\") 2x);*/ +} + +div { + a148: url('data:image/svg+xml,%3Csvg xmlns=\\"http://www.w3.org/2000/svg\\"%3E%3Crect width=\\"100%25\\" height=\\"100%25\\" style=\\"stroke: rgb(223,224,225); stroke-width: 2px; fill: none; stroke-dasharray: 6px 3px\\" /%3E%3C/svg%3E'); + a149: url('DATA:image/svg+xml,%3Csvg xmlns=\\"http://www.w3.org/2000/svg\\"%3E%3Crect width=\\"100%25\\" height=\\"100%25\\" style=\\"stroke: rgb(223,224,225); stroke-width: 2px; fill: none; stroke-dasharray: 6px 3px\\" /%3E%3C/svg%3E'); + a150: url('DATA:image/svg+xml,%3Csvg xmlns=\\"http://www.w3.org/2000/svg\\"%3E%3Crect width=\\"100%25\\" height=\\"100%25\\" style=\\"stroke: rgb(223,224,225); stroke-width: 2px; fill: none; stroke-dasharray: 6px 3px\\" /%3E%3C/svg%3E'); + a151: url('data:image/svg+xml;utf8,'); + a152: url('DATA:image/svg+xml;utf8,'); +} + +div { + a152: url(\\"img.png\\"); +} + +div { + a153: url(\\"nested/img.png\\"); +} + +div { + a154: url(\\"nested/other.png\\"); +} + +div { + a155: url(\\"package/img.png\\"); +} + +div { + a156: url(\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e\\"); +} + +div { + a157: url('data:image/svg+xml;utf8,'); +} + +div { + a158: src(\\"http://www.example.com/pinkish.gif\\"); + --foo-bar: \\"http://www.example.com/pinkish.gif\\"; + a159: src(var(--foo)); +} + +div { + a160: url(\\"img.png\\" param(--color var(--primary-color))); + a161: src(\\"img.png\\" param(--color var(--primary-color))); +} + +div { + a162: url('img\\\\ + i\\\\ +mg.png\\\\ + '); + +} + +div { + a163: url(\\" img.png \\"); +} + + +div { + a164: url( img.png bug); +} + +div { + a165: url(img\\\\n.png); +} + +div { + a166: url(' data:image/svg+xml;utf8, '); +} + +div { + a167: url(http://example.com/image.jpg); + a168: url(http://example.com/image.jpg); +} + +div { + a169: url('data:,'); + a170: url('data:,'); +} + +div { + a171: image(ltr 'img.png#xywh=0,0,16,16', red); + a172: cross-fade(20% url(img.png), url(img.png)) +} + +div { + a172: image-set( + linear-gradient(blue, white) 1x, + linear-gradient(blue, green) 2x + ); + a173: image-set( + url(\\"img.png\\") type(\\"image/png\\"), + url(\\"img.png\\") type(\\"image/png\\") + ); + a174: image-set( + \\"img.png\\" 1x, + \\"img.png\\" 2x + ); + a175: image-set( + url(\\"img.png\\") 1x, + url(\\"img.png\\") 2x, + url(\\"img.png\\") 3x + ); + a176: image-set( + \\"img.png\\" type(\\"image/png\\"), + \\"img.png\\" type(\\"image/png\\") + ) \\"img.png\\"; + a177: image-set( + \\"img.png\\" 1x type(\\"image/png\\"), + \\"img.png\\" 2x type(\\"image/png\\") + ); + a178: image-set( + \\"img.png\\" type(\\"image/png\\") 1x, + \\"img.png\\" type(\\"image/png\\") 2x + ); + a179: -webkit-image-set( + \\"img.png\\" 1x + ); + a180: -webkit-image-set( + url(\\"img.png\\" var(--foo, \\"test.png\\")) 1x + ); +} + +div { + a181: src(\\"img.png\\"); + a181: src( \\"img.png\\" ); + a182: src('img.png'); + a183: src('img.png' var(--foo, \\"test.png\\")); + a184: src(var(--foo, \\"test.png\\")); + a185: src(\\" img.png \\"); +} + +div { + a186: image-set(\\"img.png\\"1x,\\"img.png\\"2x,\\"img.png\\"3x); + a187: image-set(\\"img.png\\"1x,url(\\"img.png\\")2x,\\"img.png\\"3x); + a188: image-set(\\"img.png\\"1x,\\"img.png\\"2x,url(\\"img.png\\")3x); + a189: image-set(url(\\"img.png\\")1x,\\"img.png\\"2x,\\"img.png\\"3x); + a190: image-set(\\"img.png\\"1x); + a191: image-set(\\"img.png\\"1x/* test*/,/* test*/\\"img.png\\"2x); +} + +@supports (background-image: image-set(\\"unknown.png\\"1x,\\"unknown.png\\"2x,\\"unknown.png\\"3x)) { + div { + a192: url(\\"img.png\\"); + a193: image-set(\\"img.png\\"1x); + } +} + +@supports (background-image: url(\\"unknown.png\\" param(--test))) { + div { + a194: url(\\"img.png\\"); + } +} + +@supports (background-image: url(\\"unknown.png\\")) { + div { + a195: url(\\"img.png\\"); + } +} + +@supports (display: grid) { + @media (min-width: 100px) { + @layer special { + div { + a196: url(\\"img.png\\"); + } + } + } +} + +div { + a197: \\\\u\\\\r\\\\l(\\"img.png\\"); + a198: \\\\image-\\\\set(\\"img.png\\"1x,\\"img.png\\"2x,\\"img.png\\"3x); + a199: \\\\-webk\\\\it-image-set(\\"img.png\\"1x); + a200:-webkit-image-set(\\"img.png\\"1x); +} + +div { + a201: src(\\"http://www.example.com/pinkish.gif\\"); + --foo: \\"http://www.example.com/pinkish.gif\\"; + a202: src(var(--foo)); + a203: src(\\"./img.png\\"); + a204: src(\\"img.png\\"); +} + +div { + a205: url(alias-url.png); + a206: url(alias-url-1.png); + a208: url(external-url.png); + a208: url(external-url-2.png); + a209: url(unresolved.png); + a210: url(ignore.png); + a211: url(\\"schema:test\\"); +} + +", +] +`; + +exports[`ConfigCacheTestCases css url-and-asset-module-filename exported tests should generate correct url public path with css filename 1`] = ` +Object { + "getPropertyValue": [Function], + "nested-dir": " url(../../bundle0/assets/img2.png)", + "nested-nested-dir": " url(../../bundle0/assets/img3.png)", + "same-dir": " url(../../bundle0/assets/img1.png)", +} +`; + +exports[`ConfigCacheTestCases css url-and-asset-module-filename exported tests should generate correct url public path with css filename 2`] = ` +Object { + "getPropertyValue": [Function], + "nested-dir": " url(../../bundle0/assets/img3.png)", + "outer-dir": " url(../../bundle0/assets/img1.png)", + "same-dir": " url(../../bundle0/assets/img2.png)", +} +`; + +exports[`ConfigCacheTestCases css url-and-asset-module-filename exported tests should generate correct url public path with css filename 3`] = ` +Object { + "getPropertyValue": [Function], + "outer-dir": " url(../../bundle0/assets/img2.png)", + "outer-outer-dir": " url(../../bundle0/assets/img1.png)", + "same-dir": " url(../../bundle0/assets/img3.png)", +} +`; + +exports[`ConfigCacheTestCases css url-and-asset-module-filename exported tests should generate correct url public path with css filename 4`] = ` +Object { + "getPropertyValue": [Function], + "nested-dir": " url(https://test.cases/path/bundle1/assets/img2.png)", + "nested-nested-dir": " url(https://test.cases/path/bundle1/assets/img3.png)", + "same-dir": " url(https://test.cases/path/bundle1/assets/img1.png)", +} +`; + +exports[`ConfigCacheTestCases css url-and-asset-module-filename exported tests should generate correct url public path with css filename 5`] = ` +Object { + "getPropertyValue": [Function], + "nested-dir": " url(https://test.cases/path/bundle1/assets/img3.png)", + "outer-dir": " url(https://test.cases/path/bundle1/assets/img1.png)", + "same-dir": " url(https://test.cases/path/bundle1/assets/img2.png)", +} +`; + +exports[`ConfigCacheTestCases css url-and-asset-module-filename exported tests should generate correct url public path with css filename 6`] = ` +Object { + "getPropertyValue": [Function], + "outer-dir": " url(https://test.cases/path/bundle1/assets/img2.png)", + "outer-outer-dir": " url(https://test.cases/path/bundle1/assets/img1.png)", + "same-dir": " url(https://test.cases/path/bundle1/assets/img3.png)", +} +`; + +exports[`ConfigCacheTestCases css url-and-asset-module-filename exported tests should generate correct url public path with css filename 7`] = ` +Object { + "getPropertyValue": [Function], + "nested-dir": " url(https://test.cases/path/bundle2/assets/img2.png)", + "nested-nested-dir": " url(https://test.cases/path/bundle2/assets/img3.png)", + "same-dir": " url(https://test.cases/path/bundle2/assets/img1.png)", +} +`; + +exports[`ConfigCacheTestCases css url-and-asset-module-filename exported tests should generate correct url public path with css filename 8`] = ` +Object { + "getPropertyValue": [Function], + "nested-dir": " url(https://test.cases/path/bundle2/assets/img3.png)", + "outer-dir": " url(https://test.cases/path/bundle2/assets/img1.png)", + "same-dir": " url(https://test.cases/path/bundle2/assets/img2.png)", +} +`; + +exports[`ConfigCacheTestCases css url-and-asset-module-filename exported tests should generate correct url public path with css filename 9`] = ` +Object { + "getPropertyValue": [Function], + "outer-dir": " url(https://test.cases/path/bundle2/assets/img2.png)", + "outer-outer-dir": " url(https://test.cases/path/bundle2/assets/img1.png)", + "same-dir": " url(https://test.cases/path/bundle2/assets/img3.png)", +} +`; + +exports[`ConfigCacheTestCases css webpack-ignore exported tests should compile 1`] = ` +"/*!***********************!*\\\\ + !*** css ./basic.css ***! + \\\\***********************/ +.class { + color: red; +} + +/*!***********************!*\\\\ + !*** css ./style.css ***! + \\\\***********************/ +@import/* webpackIgnore: true */url(./basic.css); +@import /* webpackIgnore: true */ url(./basic.css); +@import /* webpackIgnore: false */ /* webpackIgnore: true */ url(./basic.css); +@import /* webpackIgnore: false */ /* webpackIgnore: true */ /* webpackIgnore: true */ url(./basic.css); +@import /* webpackIgnore: false */ /* webpackIgnore: false */ /* webpackIgnore: true */ url(./basic.css); + + +@import /* webpackIgnore: true */ url(./basic.css); + +/** Resolved **/ +/** Resolved **/ + +.class { + color: red; + background: /* webpackIgnore: true */ url(\\"./url/img.png\\"), url(09a1a1112c577c279435.png); +} + +.class { + color: red; + background:/* webpackIgnore: true */url(\\"./url/img.png\\"), url(09a1a1112c577c279435.png); +} + +.class { + color: red; + background: url(09a1a1112c577c279435.png), /* webpackIgnore: true */ url(\\"./url/img.png\\"); +} + +.class { + color: red; + background: + /* webpackIgnore: true */ + url(\\"./url/img.png\\"), + url(09a1a1112c577c279435.png); +} + + +.class { + color: red; + background: + url(09a1a1112c577c279435.png), + /* webpackIgnore: true */ + url(\\"./url/img.png\\"); +} + +.class { + color: red; + background: /* webpackIgnore: true */ url(\\"./url/img.png\\"), /* webpackIgnore: false */ url(09a1a1112c577c279435.png); +} + +.class { + color: red; + background: url(09a1a1112c577c279435.png), /* webpackIgnore: false */ url(09a1a1112c577c279435.png), /* webpackIgnore: true */ url(\\"./url/img.png\\"), /* webpackIgnore: false */ url(09a1a1112c577c279435.png); +} + +.class { + color: red; + background: /* webpackIgnore: false */ url(09a1a1112c577c279435.png), /* webpackIgnore: true */ url(\\"./url/img.png\\"); +} + +.class { + color: red; + background: /* webpackIgnore: true */ /* webpackIgnore: false */ url(09a1a1112c577c279435.png), url(09a1a1112c577c279435.png); +} + +.class { + color: red; + background: url(09a1a1112c577c279435.png), /* webpackIgnore: true */ /* webpackIgnore: false */ url(09a1a1112c577c279435.png); +} + +.class { + color: red; + background: url(09a1a1112c577c279435.png), /* webpackIgnore: false */ /* webpackIgnore: true */ url(\\"./url/img.png\\"); +} + +.class { + background: + url(09a1a1112c577c279435.png), + url(09a1a1112c577c279435.png), + /* webpackIgnore: true */ url(\\"./url/img.png\\"), + url(09a1a1112c577c279435.png), + /* webpackIgnore: true */ url(\\"./url/img.png\\"), + url(09a1a1112c577c279435.png), + url(09a1a1112c577c279435.png), + url(09a1a1112c577c279435.png), + /* webpackIgnore: true */ + url(\\"./url/img.png\\"); +} + +@font-face { + font-family: \\"Roboto\\"; + src: /* webpackIgnore: true */ url(\\"./fonts/Roboto-Regular.eot\\"); + src: + /* webpackIgnore: true */ + url(\\"./fonts/Roboto-Regular.eot#iefix\\") format(\\"embedded-opentype\\"), + url(5edda27bb1aea976c9b5.woff2) format(\\"woff\\"), + url(6af79dbd35e55450b9a6.woff) format(\\"woff\\"), + url(0e1fae5a09bac1b8f8da.ttf) format(\\"truetype\\"), + url(5a6b5cdda16adcae27d1.svg) format(\\"svg\\"); + font-weight: 400; + font-style: normal; +} + +@font-face { + font-family: \\"Roboto\\"; + src: /* webpackIgnore: true */ url(\\"./fonts/Roboto-Regular.eot\\"); + src: + url(19ce07bdb1cb5ba16ea8.eot) format(\\"embedded-opentype\\"), + url(5edda27bb1aea976c9b5.woff2) format(\\"woff\\"), + /* webpackIgnore: true */ + url(\\"./fonts/Roboto-Regular.woff\\") + format(\\"woff\\"), + url(0e1fae5a09bac1b8f8da.ttf) format(\\"truetype\\"), + url(5a6b5cdda16adcae27d1.svg) format(\\"svg\\"); + font-weight: 400; + font-style: normal; +} + +@font-face { + font-family: \\"Roboto\\"; + src: url(19ce07bdb1cb5ba16ea8.eot); + src: + url(19ce07bdb1cb5ba16ea8.eot) format(\\"embedded-opentype\\"), + /* webpackIgnore: true */ + url(\\"./fonts/Roboto-Regular.woff2\\") format(\\"woff\\"), + url(6af79dbd35e55450b9a6.woff) format(\\"woff\\"), + /* webpackIgnore: true */ + url(\\"./fonts/Roboto-Regular.ttf\\") format(\\"truetype\\"), + url(5a6b5cdda16adcae27d1.svg) format(\\"svg\\"); + font-weight: 400; + font-style: normal; +} + +.class { + background-image: image-set( + /*webpackIgnore: true*/ + + + url(./url/img.png) 2x, + url(09a1a1112c577c279435.png) 3x, + url(09a1a1112c577c279435.png) 4x + ); +} + +.class { + background-image: + image-set( + /*webpackIgnore: false*/ + url(09a1a1112c577c279435.png) 2x, + /*webpackIgnore: true*/ + url(./url/img.png) 3x, + url(09a1a1112c577c279435.png) 4x, + /*webpackIgnore: false */ + /*webpackIgnore: true */ + url(./url/img.png) 5x + ),/*webpackIgnore: true*/url('./url/img.png'); +} + +.class { + background-image: + image-set( + /*webpackIgnore: false*/ + url(09a1a1112c577c279435.png) 2x, + /*webpackIgnore: true*/ + url(./url/img.png) 3x, + url(09a1a1112c577c279435.png) 4x, + /*webpackIgnore: false */ + /*webpackIgnore: true */ + url(./url/img.png) 5x + ), + /*webpackIgnore: false*/ + url(09a1a1112c577c279435.png), + /*webpackIgnore: true*/ + url('./url/img.png'); +} + +.class { + background-image: + image-set( + /*webpackIgnore: false*/ + url(09a1a1112c577c279435.png) 2x, + /*webpackIgnore: true*/ + url(./url/img.png) 3x, + url(09a1a1112c577c279435.png) 4x, + /*webpackIgnore: false */ + /*webpackIgnore: true */ + url(./url/img.png) 5x + ), + url(09a1a1112c577c279435.png); +} + +.class { + background-image: image-set( + /*webpackIgnore: true*/ + url(./url/img.png) 2x, + url(09a1a1112c577c279435.png) 3x, + /*webpackIgnore: true*/ + url(./url/img.png) 5x + ); +} + +.class { + background-image: image-set( + /*webpackIgnore: true*/ + './url/img.png' 2x, + url(09a1a1112c577c279435.png) 3x, + /*webpackIgnore: true*/ + './url/img.png' 5x + ); +} + +.class { + background-image: image-set( + /*webpackIgnore: false*/ + url(09a1a1112c577c279435.png) 2x, + /*webpackIgnore: true*/ + url(./url/img.png) 3x, + /*webpackIgnore: false*/ + url(09a1a1112c577c279435.png) 4x, + + + /*webpackIgnore: true*/ + + + url(./url/img.png) 5x + ); +} + +.class { + color: red; + background: url(09a1a1112c577c279435.png), /* webpackIgnore: true */url(\\"./url/img.png\\"); +} + +.class { + color: red; + background: url(09a1a1112c577c279435.png), /* webpackIgnore: true */ url(\\"./url/img.png\\"); +} + +.class { + color: red; + background: url(09a1a1112c577c279435.png)/* webpackIgnore: true */, url(09a1a1112c577c279435.png); +} + +.class { + background-image: + image-set( + url(09a1a1112c577c279435.png) 2x /*webpackIgnore: true*/, + url(09a1a1112c577c279435.png) /*webpackIgnore: true*/ 3x, + url(09a1a1112c577c279435.png) 4x /*webpackIgnore: true*/, + /*webpackIgnore: true*/url(./url/img.png) 5x, + /*webpackIgnore: true*/ url(./url/img.png) 6x, + /*webpackIgnore: true*/ + url(./url/img.png) 7x, + url(09a1a1112c577c279435.png) 8x + ), + /*webpackIgnore: false*/ + url(09a1a1112c577c279435.png), + /*webpackIgnore: true*/ + url('./url/img.png'); +} + +@font-face { + font-family: \\"anticon\\"; + src: url(//at.alicdn.com/t/font_1434092639_4910953.eot?#iefix) format(\\"embedded-opentype\\"), + /* this comment is required */ + url(//at.alicdn.com/t/font_1434092639_4910953.woff) format(\\"woff\\"); +} + +.class { + background-image: image-set( + /*webpackIgnore: true*/ + url(\\"./url/img.png\\") 2x, + url(09a1a1112c577c279435.png) 3x, + /*webpackIgnore: true*/ + url(\\"./url/img.png\\") 4x + ); +} + +.class { + background-image: /* webpackIgnore: 1 */ url(09a1a1112c577c279435.png); + background-image: /* webpackIgnore: 1 */ url(09a1a1112c577c279435.png); + background-image: image-set(/* webpackIgnore: 1 */ url(09a1a1112c577c279435.png) 2x) +} + +.class { + background-image /*webpackIgnore: true*/ : url(09a1a1112c577c279435.png); + /*webpackIgnore: true*/ background-image: url(09a1a1112c577c279435.png); +} + +.class { + background-image:/*webpackIgnore: true*/ + + + + + + + + + + + url(./url/img.png); +} + +.class { + background-image: /***webpackIgnore: true***/ url(09a1a1112c577c279435.png); + background-image: /***webpackIgnore: true***/ url(09a1a1112c577c279435.png); + background-image: image-set(/***webpackIgnore: true***/ url(09a1a1112c577c279435.png) 2x) +} + +" +`; diff --git a/test/__snapshots__/ConfigTestCases.basictest.js.snap b/test/__snapshots__/ConfigTestCases.basictest.js.snap new file mode 100644 index 00000000000..23153134e9f --- /dev/null +++ b/test/__snapshots__/ConfigTestCases.basictest.js.snap @@ -0,0 +1,10140 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`ConfigTestCases css build-http exported tests should work with URLs in CSS 1`] = ` +Array [ + "/*!*******************************************************************************************************************!*\\\\ + !*** css https://raw.githubusercontent.com/webpack/webpack/refs/heads/main/test/configCases/css/import/print.css ***! + \\\\*******************************************************************************************************************/ +body { + background: black; +} + +/*!***********************!*\\\\ + !*** css ./style.css ***! + \\\\***********************/ + +div { + background: url(09a1a1112c577c279435.png) +} + +", +] +`; + +exports[`ConfigTestCases css css-modules exported tests should allow to create css modules: dev 1`] = ` +Object { + "UsedClassName": "_identifiers_module_css-UsedClassName", + "VARS": "--_style_module_css-LOCAL-COLOR _style_module_css-VARS undefined _style_module_css-globalVarsUpperCase", + "animation": "_style_module_css-animation", + "animationName": "_style_module_css-animationName", + "class": "_style_module_css-class", + "classInContainer": "_style_module_css-class-in-container", + "classLocalScope": "_style_module_css-class-local-scope", + "cssModuleWithCustomFileExtension": "_style_module_my-css-myCssClass", + "currentWmultiParams": "_style_module_css-local12", + "deepClassInContainer": "_style_module_css-deep-class-in-container", + "displayFlexInSupportsInMediaUpperCase": "_style_module_css-displayFlexInSupportsInMediaUpperCase", + "exportLocalVarsShouldCleanup": "false false", + "futureWmultiParams": "_style_module_css-local14", + "global": undefined, + "hasWmultiParams": "_style_module_css-local11", + "ident": "_style_module_css-ident", + "inLocalGlobalScope": "_style_module_css-in-local-global-scope", + "inSupportScope": "_style_module_css-inSupportScope", + "isWmultiParams": "_style_module_css-local8", + "keyframes": "_style_module_css-localkeyframes", + "keyframesUPPERCASE": "_style_module_css-localkeyframesUPPERCASE", + "local": "_style_module_css-local1 _style_module_css-local2 _style_module_css-local3 _style_module_css-local4", + "local2": "_style_module_css-local5 _style_module_css-local6", + "localkeyframes2UPPPERCASE": "_style_module_css-localkeyframes2UPPPERCASE", + "matchesWmultiParams": "_style_module_css-local9", + "media": "_style_module_css-wideScreenClass", + "mediaInSupports": "_style_module_css-displayFlexInMediaInSupports", + "mediaWithOperator": "_style_module_css-narrowScreenClass", + "mozAnimationName": "_style_module_css-mozAnimationName", + "mozAnyWmultiParams": "_style_module_css-local15", + "myColor": "--_style_module_css-my-color", + "nested": "_style_module_css-nested1 undefined _style_module_css-nested3", + "notAValidCssModuleExtension": true, + "notWmultiParams": "_style_module_css-local7", + "paddingLg": "_style_module_css-padding-lg", + "paddingSm": "_style_module_css-padding-sm", + "pastWmultiParams": "_style_module_css-local13", + "supports": "_style_module_css-displayGridInSupports", + "supportsInMedia": "_style_module_css-displayFlexInSupportsInMedia", + "supportsWithOperator": "_style_module_css-floatRightInNegativeSupports", + "vars": "--_style_module_css-local-color _style_module_css-vars undefined _style_module_css-globalVars", + "webkitAnyWmultiParams": "_style_module_css-local16", + "whereWmultiParams": "_style_module_css-local10", +} +`; + +exports[`ConfigTestCases css css-modules exported tests should allow to create css modules: dev 2`] = ` +"/*!*******************************!*\\\\ + !*** css ./colors.module.css ***! + \\\\*******************************/ + + + + + + + + + + + + + + +/*!**************************************!*\\\\ + !*** css ./at-rule-value.module.css ***! + \\\\**************************************/ + + +._at-rule-value_module_css-value-in-class { + color: blue; +} + + + + + + +@media (max-width: 599px) { + abbr:hover { + color: limegreen; + transition-duration: 1s; + } +} + + + +._at-rule-value_module_css-foo { color: red; } + + + +._at-rule-value_module_css-foo { + &._at-rule-value_module_css-bar { color: red; } +} + + + +._at-rule-value_module_css-foo { + @media (min-width: 1024px) { + &._at-rule-value_module_css-bar { color: red; } + } +} + + + +._at-rule-value_module_css-foo { + @media (min-width: 1024px) { + &._at-rule-value_module_css-bar { + @media (min-width: 1024px) { + color: red; + } + } + } +} + + + + +._at-rule-value_module_css-foo { height: 40px; height: 36px; } + + + +._at-rule-value_module_css-colorValue { + color: red; +} + + + +#_at-rule-value_module_css-colorValue-v1 { + color: red; +} + + + +._at-rule-value_module_css-colorValue-v2 > ._at-rule-value_module_css-colorValue-v2 { + color: red; +} + + + +.red { + color: .red; +} + + + +._at-rule-value_module_css-export { + color: blue; +} + + + +._at-rule-value_module_css-foo { color: red; } + + + +._at-rule-value_module_css-foo { color: red; } +._at-rule-value_module_css-bar { color: yellow } + + + + +._at-rule-value_module_css-foo { color: blue; } + + + + +._at-rule-value_module_css-foo { color: blue; } + + + + +._at-rule-value_module_css-class-a { color: red; } + + + + +._at-rule-value_module_css-class-a { margin: calc(base * 2); } + + + + +._at-rule-value_module_css-class-a { content: \\"test-a\\" \\"test-b\\"; } + + + +._at-rule-value_module_css-foo { color: var(--color); } + + + + + + + +._at-rule-value_module_css-foo { + color: red; + background-color: #0f0; + border-top-color: #00ff00; + border-bottom-color: rgba(34, 12, 64, 0.3); + outline-color: hsla(220, 13.0%, 18.0%, 1); +} + + + +._at-rule-value_module_css-foo { color: blue; } +._at-rule-value_module_css-bar { color: red } + + + +._at-rule-value_module_css-foo { box-shadow: 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +._at-rule-value_module_css-foo { color: color(red lightness(50%)); } + + + +:root { --_at-rule-value_module_css-color: red; } + + + +:root { --_at-rule-value_module_css-color: ; } + + + +:root { --_at-rule-value_module_css-color: ; } + + + +:root { --_at-rule-value_module_css-color:/* comment */; } + + + + +._at-rule-value_module_css-override { + color: red; +} + + + + +._at-rule-value_module_css-class { + color: red; + color: red; + color: blue; +} + + + +._at-rule-value_module_css-color { + color: /* test */red/* test */; +} + + + +._at-rule-value_module_css-color { + color: /* test *//* test */red/* test */; +} + + + +._at-rule-value_module_css-foo { box-shadow: 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +._at-rule-value_module_css-foo { box-shadow: 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +._at-rule-value_module_css-foo { box-shadow: /* test */ 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +._at-rule-value_module_css-foo { box-shadow: /* test */0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +._at-rule-value_module_css-foo { box-shadow: 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +._at-rule-value_module_css-foo { box-shadow: /* test */0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +._at-rule-value_module_css-foo { color: blue; } + + + +._at-rule-value_module_css-foo { color: blue; } + + + +._at-rule-value_module_css-foo { color: my-name-q; } + + + + +/*!*********************************************!*\\\\ + !*** css ./var-function-export.modules.css ***! + \\\\*********************************************/ +:root { + --_var-function-export_modules_css-my-var-u1: red; + --_var-function-export_modules_css-my-var-u2: blue; + --_var-function-export_modules_css-not-override-class: black; + --_var-function-export_modules_css-1: red; + --_var-function-export_modules_css---a: red; + --_var-function-export_modules_css-main-bg-color: red; +} + +._var-function-export_modules_css-my-var-u1 { + color: red; +} + +/*!*************************************!*\\\\ + !*** css ./var-function.module.css ***! + \\\\*************************************/ +:root { + --_var-function_module_css-main-bg-color: brown; + --_var-function_module_css-my-var: red; + --_var-function_module_css-my-background: blue; + --_var-function_module_css-my-global: yellow; + --: \\"reserved\\"; + --_var-function_module_css-a: green; +} + +._var-function_module_css-class { + color: var(--_var-function_module_css-main-bg-color); +} + +@property --_var-function_module_css-logo-color { + syntax: \\"\\"; + inherits: false; + initial-value: #c0ffee; +} + +@property -- { + syntax: \\"\\"; + inherits: false; + initial-value: #c0ffee; +} + +._var-function_module_css-class { + color: var(--_var-function_module_css-logo-color); +} + +div { + background-color: var(--_var-function_module_css-box-color); +} + +._var-function_module_css-two { + --_var-function_module_css-box-color: cornflowerblue; +} + +._var-function_module_css-three { + --_var-function_module_css-box-color: aquamarine; +} + + +._var-function_module_css-one { + /* Red if --my-var is not defined */ + color: var(--_var-function_module_css-my-var, red); +} + +._var-function_module_css-two { + /* pink if --my-var and --my-background are not defined */ + color: var(--_var-function_module_css-my-var, var(--_var-function_module_css-my-background, pink)); +} + +._var-function_module_css-reserved { + color: var(--); +} + +._var-function_module_css-green { + color: var(--_var-function_module_css-a); +} + +._var-function_module_css-global { + color: var(--my-global); +} + +._var-function_module_css-global-and-default { + color: var(--my-global, pink); +} + +._var-function_module_css-global-and-default-1 { + color: var(--my-global, var(--my-global-background)); +} + +._var-function_module_css-global-and-default-2 { + color: var(--my-global, var(--my-global-background, pink)); +} + +._var-function_module_css-global-and-default-3 { + color: var(--my-global, var(--_var-function_module_css-my-background, pink)); +} + +._var-function_module_css-global-and-default-5 { + color: var( --my-global,var(--_var-function_module_css-my-background,pink)); +} + +._var-function_module_css-global-and-default-6 { + background: var( --_var-function_module_css-main-bg-color , var( --_var-function_module_css-my-background , pink ) ) , var(--my-global); +} + +._var-function_module_css-global-and-default-7 { + background: var(--_var-function_module_css-main-bg-color,var(--_var-function_module_css-my-background,pink)),var(--my-global); +} + +._var-function_module_css-from { + color: var(--_var-function-export_modules_css-my-var-u1); +} + +._var-function_module_css-from-1 { + color: var(--_var-function_module_css-main-bg-color, var(--_var-function-export_modules_css-my-var-u1)); +} + +._var-function_module_css-from-2 { + color: var(--_var-function-export_modules_css-my-var-u1, var(--_var-function_module_css-main-bg-color)); +} + +._var-function_module_css-from-3 { + color: var(--_var-function-export_modules_css-my-var-u1, var(--_var-function-export_modules_css-my-var-u2)); +} + +._var-function_module_css-from-4 { + color: var(--_var-function-export_modules_css-1); +} + +._var-function_module_css-from-5 { + color: var(--_var-function-export_modules_css---a); +} + +._var-function_module_css-from-6 { + color: var(--_var-function-export_modules_css-main-bg-color); +} + +._var-function_module_css-mixed { + color: var(--_var-function-export_modules_css-my-var-u1, var(--my-global, var(--_var-function_module_css-main-bg-color, red))); +} + +._var-function_module_css-broken { + color: var(--my-global from); +} + +._var-function_module_css-broken-1 { + color: var(--my-global from 1); +} + +:root { + --_var-function_module_css-not-override-class: red; +} + +._var-function_module_css-not-override-class { + color: var(--_var-function-export_modules_css-not-override-class) +} + +/*!******************************!*\\\\ + !*** css ./style.module.css ***! + \\\\******************************/ + +._style_module_css-class { + color: red; +} + +._style_module_css-local1, +._style_module_css-local2 .global, +._style_module_css-local3 { + color: green; +} + +.global ._style_module_css-local4 { + color: yellow; +} + +._style_module_css-local5.global._style_module_css-local6 { + color: blue; +} + +._style_module_css-local7 div:not(._style_module_css-disabled, ._style_module_css-mButtonDisabled, ._style_module_css-tipOnly) { + pointer-events: initial !important; +} + +._style_module_css-local8 :is(div._style_module_css-parent1._style_module_css-child1._style_module_css-vertical-tiny, + div._style_module_css-parent1._style_module_css-child1._style_module_css-vertical-small, + div._style_module_css-otherDiv._style_module_css-horizontal-tiny, + div._style_module_css-otherDiv._style_module_css-horizontal-small div._style_module_css-description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +._style_module_css-local9 :matches(div._style_module_css-parent1._style_module_css-child1._style_module_css-vertical-tiny, + div._style_module_css-parent1._style_module_css-child1._style_module_css-vertical-small, + div._style_module_css-otherDiv._style_module_css-horizontal-tiny, + div._style_module_css-otherDiv._style_module_css-horizontal-small div._style_module_css-description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +._style_module_css-local10 :where(div._style_module_css-parent1._style_module_css-child1._style_module_css-vertical-tiny, + div._style_module_css-parent1._style_module_css-child1._style_module_css-vertical-small, + div._style_module_css-otherDiv._style_module_css-horizontal-tiny, + div._style_module_css-otherDiv._style_module_css-horizontal-small div._style_module_css-description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +._style_module_css-local11 div:has(._style_module_css-disabled, ._style_module_css-mButtonDisabled, ._style_module_css-tipOnly) { + pointer-events: initial !important; +} + +._style_module_css-local12 div:current(p, span) { + background-color: yellow; +} + +._style_module_css-local13 div:past(p, span) { + display: none; +} + +._style_module_css-local14 div:future(p, span) { + background-color: yellow; +} + +._style_module_css-local15 div:-moz-any(ol, ul, menu, dir) { + list-style-type: square; +} + +._style_module_css-local16 li:-webkit-any(:first-child, :last-child) { + background-color: aquamarine; +} + +._style_module_css-local9 :matches(div._style_module_css-parent1._style_module_css-child1._style_module_css-vertical-tiny, + div._style_module_css-parent1._style_module_css-child1._style_module_css-vertical-small, + div._style_module_css-otherDiv._style_module_css-horizontal-tiny, + div._style_module_css-otherDiv._style_module_css-horizontal-small div._style_module_css-description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +._style_module_css-nested1.nested2._style_module_css-nested3 { + color: pink; +} + +#_style_module_css-ident { + color: purple; +} + +@keyframes _style_module_css-localkeyframes { + 0% { + left: var(--_style_module_css-pos1x); + top: var(--_style_module_css-pos1y); + color: var(--theme-color1); + } + 100% { + left: var(--_style_module_css-pos2x); + top: var(--_style_module_css-pos2y); + color: var(--theme-color2); + } +} + +@keyframes _style_module_css-localkeyframes2 { + 0% { + left: 0; + } + 100% { + left: 100px; + } +} + +._style_module_css-animation { + animation-name: _style_module_css-localkeyframes; + animation: 3s ease-in 1s 2 reverse both paused _style_module_css-localkeyframes, _style_module_css-localkeyframes2; + --_style_module_css-pos1x: 0px; + --_style_module_css-pos1y: 0px; + --_style_module_css-pos2x: 10px; + --_style_module_css-pos2y: 20px; +} + +/* .composed { + composes: local1; + composes: local2; +} */ + +._style_module_css-vars { + color: var(--_style_module_css-local-color); + --_style_module_css-local-color: red; +} + +._style_module_css-globalVars { + color: var(--global-color); + --global-color: red; +} + +@media (min-width: 1600px) { + ._style_module_css-wideScreenClass { + color: var(--_style_module_css-local-color); + --_style_module_css-local-color: green; + } +} + +@media screen and (max-width: 600px) { + ._style_module_css-narrowScreenClass { + color: var(--_style_module_css-local-color); + --_style_module_css-local-color: purple; + } +} + +@supports (display: grid) { + ._style_module_css-displayGridInSupports { + display: grid; + } +} + +@supports not (display: grid) { + ._style_module_css-floatRightInNegativeSupports { + float: right; + } +} + +@supports (display: flex) { + @media screen and (min-width: 900px) { + ._style_module_css-displayFlexInMediaInSupports { + display: flex; + } + } +} + +@media screen and (min-width: 900px) { + @supports (display: flex) { + ._style_module_css-displayFlexInSupportsInMedia { + display: flex; + } + } +} + +@MEDIA screen and (min-width: 900px) { + @SUPPORTS (display: flex) { + ._style_module_css-displayFlexInSupportsInMediaUpperCase { + display: flex; + } + } +} + +._style_module_css-animationUpperCase { + ANIMATION-NAME: _style_module_css-localkeyframesUPPERCASE; + ANIMATION: 3s ease-in 1s 2 reverse both paused _style_module_css-localkeyframesUPPERCASE, _style_module_css-localkeyframes2UPPPERCASE; + --_style_module_css-pos1x: 0px; + --_style_module_css-pos1y: 0px; + --_style_module_css-pos2x: 10px; + --_style_module_css-pos2y: 20px; +} + +@KEYFRAMES _style_module_css-localkeyframesUPPERCASE { + 0% { + left: VAR(--_style_module_css-pos1x); + top: VAR(--_style_module_css-pos1y); + color: VAR(--theme-color1); + } + 100% { + left: VAR(--_style_module_css-pos2x); + top: VAR(--_style_module_css-pos2y); + color: VAR(--theme-color2); + } +} + +@KEYframes _style_module_css-localkeyframes2UPPPERCASE { + 0% { + left: 0; + } + 100% { + left: 100px; + } +} + +.globalUpperCase ._style_module_css-localUpperCase { + color: yellow; +} + +._style_module_css-VARS { + color: VAR(--_style_module_css-LOCAL-COLOR); + --_style_module_css-LOCAL-COLOR: red; +} + +._style_module_css-globalVarsUpperCase { + COLOR: VAR(--GLOBAR-COLOR); + --GLOBAR-COLOR: red; +} + +@supports (top: env(safe-area-inset-top, 0)) { + ._style_module_css-inSupportScope { + color: red; + } +} + +._style_module_css-a { + animation: 3s _style_module_css-animationName; + -webkit-animation: 3s _style_module_css-animationName; +} + +._style_module_css-b { + animation: _style_module_css-animationName 3s; + -webkit-animation: _style_module_css-animationName 3s; +} + +._style_module_css-c { + animation-name: _style_module_css-animationName; + -webkit-animation-name: _style_module_css-animationName; +} + +._style_module_css-d { + --_style_module_css-animation-name: animationName; +} + +@keyframes _style_module_css-animationName { + 0% { + background: white; + } + 100% { + background: red; + } +} + +@-webkit-keyframes _style_module_css-animationName { + 0% { + background: white; + } + 100% { + background: red; + } +} + +@-moz-keyframes _style_module_css-mozAnimationName { + 0% { + background: white; + } + 100% { + background: red; + } +} + +@counter-style thumbs { + system: cyclic; + symbols: \\"\\\\1F44D\\"; + suffix: \\" \\"; +} + +@font-feature-values Font One { + @styleset { + nice-style: 12; + } +} + +/* At-rule for \\"nice-style\\" in Font Two */ +@font-feature-values Font Two { + @styleset { + nice-style: 4; + } +} + +@property --_style_module_css-my-color { + syntax: \\"\\"; + inherits: false; + initial-value: #c0ffee; +} + +@property --_style_module_css-my-color-1 { + initial-value: #c0ffee; + syntax: \\"\\"; + inherits: false; +} + +@property --_style_module_css-my-color-2 { + syntax: \\"\\"; + initial-value: #c0ffee; + inherits: false; +} + +._style_module_css-class { + color: var(--_style_module_css-my-color); +} + +@layer utilities { + ._style_module_css-padding-sm { + padding: 0.5rem; + } + + ._style_module_css-padding-lg { + padding: 0.8rem; + } +} + +._style_module_css-class { + color: red; + + ._style_module_css-nested-pure { + color: red; + } + + @media screen and (min-width: 200px) { + color: blue; + + ._style_module_css-nested-media { + color: blue; + } + } + + @supports (display: flex) { + display: flex; + + ._style_module_css-nested-supports { + display: flex; + } + } + + @layer foo { + background: red; + + ._style_module_css-nested-layer { + background: red; + } + } + + @container foo { + background: red; + + ._style_module_css-nested-layer { + background: red; + } + } +} + +._style_module_css-not-selector-inside { + color: #fff; + opacity: 0.12; + padding: .5px; + unknown: :local(.test); + unknown1: :local .test; + unknown2: :global .test; + unknown3: :global .test; + unknown4: .foo, .bar, #bar; +} + +@unknown :local .local :global .global { + color: red; +} + +@unknown :local(.local) :global(.global) { + color: red; +} + +._style_module_css-nested-var { + ._style_module_css-again { + color: var(--_style_module_css-local-color); + } +} + +._style_module_css-nested-with-local-pseudo { + color: red; + + ._style_module_css-local-nested { + color: red; + } + + .global-nested { + color: red; + } + + ._style_module_css-local-nested { + color: red; + } + + .global-nested { + color: red; + } + + ._style_module_css-local-nested, .global-nested-next { + color: red; + } + + ._style_module_css-local-nested, .global-nested-next { + color: red; + } + + .foo, ._style_module_css-bar { + color: red; + } +} + +#_style_module_css-id-foo { + color: red; + + #_style_module_css-id-bar { + color: red; + } +} + +._style_module_css-nested-parens { + ._style_module_css-local9 div:has(._style_module_css-vertical-tiny, ._style_module_css-vertical-small) { + max-height: 0; + margin: 0; + overflow: hidden; + } +} + +.global-foo { + .nested-global { + color: red; + } + + ._style_module_css-local-in-global { + color: blue; + } +} + +@unknown .class { + color: red; + + ._style_module_css-class { + color: red; + } +} + +.class ._style_module_css-in-local-global-scope, +.class ._style_module_css-in-local-global-scope, +._style_module_css-class-local-scope .in-local-global-scope { + color: red; +} + +@container (width > 400px) { + ._style_module_css-class-in-container { + font-size: 1.5em; + } +} + +@container summary (min-width: 400px) { + @container (width > 400px) { + ._style_module_css-deep-class-in-container { + font-size: 1.5em; + } + } +} + +:scope { + color: red; +} + +._style_module_css-placeholder-gray-700:-ms-input-placeholder { + --_style_module_css-placeholder-opacity: 1; + color: #4a5568; + color: rgba(74, 85, 104, var(--_style_module_css-placeholder-opacity)); +} +._style_module_css-placeholder-gray-700::-ms-input-placeholder { + --_style_module_css-placeholder-opacity: 1; + color: #4a5568; + color: rgba(74, 85, 104, var(--_style_module_css-placeholder-opacity)); +} +._style_module_css-placeholder-gray-700::placeholder { + --_style_module_css-placeholder-opacity: 1; + color: #4a5568; + color: rgba(74, 85, 104, var(--_style_module_css-placeholder-opacity)); +} + +:root { + --_style_module_css-test: dark; +} + +@media screen and (prefers-color-scheme: var(--_style_module_css-test)) { + ._style_module_css-baz { + color: white; + } +} + +@keyframes _style_module_css-slidein { + from { + margin-left: 100%; + width: 300%; + } + + to { + margin-left: 0%; + width: 100%; + } +} + +._style_module_css-class { + animation: + foo var(--_style_module_css-animation-name) 3s, + var(--_style_module_css-animation-name) 3s, + 3s linear 1s infinite running _style_module_css-slidein, + 3s linear env(foo, var(--_style_module_css-baz)) infinite running _style_module_css-slidein; +} + +:root { + --_style_module_css-baz: 10px; +} + +._style_module_css-class { + bar: env(foo, var(--_style_module_css-baz)); +} + +.global-foo, ._style_module_css-bar { + ._style_module_css-local-in-global { + color: blue; + } + + @media screen { + .my-global-class-again, + ._style_module_css-my-global-class-again { + color: red; + } + } +} + +._style_module_css-first-nested { + ._style_module_css-first-nested-nested { + color: red; + } +} + +._style_module_css-first-nested-at-rule { + @media screen { + ._style_module_css-first-nested-nested-at-rule-deep { + color: red; + } + } +} + +.again-global { + color:red; +} + +.again-again-global { + .again-again-global { + color: red; + } +} + +:root { + --_style_module_css-foo: red; +} + +.again-again-global { + color: var(--foo); + + .again-again-global { + color: var(--foo); + } +} + +.again-again-global { + animation: slidein 3s; + + .again-again-global, ._style_module_css-class, ._style_module_css-nested1.nested2._style_module_css-nested3 { + animation: _style_module_css-slidein 3s; + } + + ._style_module_css-local2 .global, + ._style_module_css-local3 { + color: red; + } +} + +@unknown var(--_style_module_css-foo) { + color: red; +} + +._style_module_css-class { + ._style_module_css-class { + ._style_module_css-class { + ._style_module_css-class {} + } + } +} + +._style_module_css-class { + ._style_module_css-class { + ._style_module_css-class { + ._style_module_css-class { + animation: _style_module_css-slidein 3s; + } + } + } +} + +._style_module_css-class { + animation: _style_module_css-slidein 3s; + ._style_module_css-class { + animation: _style_module_css-slidein 3s; + ._style_module_css-class { + animation: _style_module_css-slidein 3s; + ._style_module_css-class { + animation: _style_module_css-slidein 3s; + } + } + } +} + +._style_module_css-broken { + . global(._style_module_css-class) { + color: red; + } + + : global(._style_module_css-class) { + color: red; + } + + : global ._style_module_css-class { + color: red; + } + + : local(._style_module_css-class) { + color: red; + } + + : local ._style_module_css-class { + color: red; + } + + # hash { + color: red; + } +} + +._style_module_css-comments { + .class { + color: red; + } + + .class { + color: red; + } + + ._style_module_css-class { + color: red; + } + + ._style_module_css-class { + color: red; + } + + ./** test **/_style_module_css-class { + color: red; + } + + ./** test **/_style_module_css-class { + color: red; + } + + ./** test **/_style_module_css-class { + color: red; + } +} + +._style_module_css-foo { + color: red; + + ._style_module_css-bar + & { color: blue; } +} + +._style_module_css-error, #_style_module_css-err-404 { + &:hover > ._style_module_css-baz { color: red; } +} + +._style_module_css-foo { + & :is(._style_module_css-bar, &._style_module_css-baz) { color: red; } +} + +._style_module_css-qqq { + color: green; + & ._style_module_css-a { color: blue; } + color: red; +} + +._style_module_css-parent { + color: blue; + + @scope (& > ._style_module_css-scope) to (& > ._style_module_css-limit) { + & ._style_module_css-content { + color: red; + } + } +} + +._style_module_css-parent { + color: blue; + + @scope (& > ._style_module_css-scope) to (& > ._style_module_css-limit) { + ._style_module_css-content { + color: red; + } + } + + ._style_module_css-a { + color: red; + } +} + +@scope (._style_module_css-card) { + :scope { border-block-end: 1px solid white; } +} + +._style_module_css-card { + inline-size: 40ch; + aspect-ratio: 3/4; + + @scope (&) { + :scope { + border: 1px solid white; + } + } +} + +._style_module_css-foo { + display: grid; + + @media (orientation: landscape) { + ._style_module_css-bar { + grid-auto-flow: column; + + @media (min-width > 1024px) { + ._style_module_css-baz-1 { + display: grid; + } + + max-inline-size: 1024px; + + ._style_module_css-baz-2 { + display: grid; + } + } + } + } +} + +@counter-style thumbs { + system: cyclic; + symbols: \\"\\\\1F44D\\"; + suffix: \\" \\"; +} + +ul { + list-style: thumbs; +} + +@container (width > 400px) and style(--responsive: true) { + ._style_module_css-class { + font-size: 1.5em; + } +} +/* At-rule for \\"nice-style\\" in Font One */ +@font-feature-values Font One { + @styleset { + nice-style: 12; + } +} + +@font-palette-values --identifier { + font-family: Bixa; +} + +._style_module_css-my-class { + font-palette: --identifier; +} + +@keyframes _style_module_css-foo { /* ... */ } +@keyframes _style_module_css-foo { /* ... */ } +@keyframes { /* ... */ } +@keyframes{ /* ... */ } + +@supports (display: flex) { + @media screen and (min-width: 900px) { + article { + display: flex; + } + } +} + +@starting-style { + ._style_module_css-class { + opacity: 0; + transform: scaleX(0); + } +} + +._style_module_css-class { + opacity: 1; + transform: scaleX(1); + + @starting-style { + opacity: 0; + transform: scaleX(0); + } +} + +@scope (._style_module_css-feature) { + ._style_module_css-class { opacity: 0; } + + :scope ._style_module_css-class-1 { opacity: 0; } + + & ._style_module_css-class { opacity: 0; } +} + +@position-try --custom-left { + position-area: left; + width: 100px; + margin: 0 10px 0 0; +} + +@position-try --custom-bottom { + top: anchor(bottom); + justify-self: anchor-center; + margin: 10px 0 0 0; + position-area: none; +} + +@position-try --custom-right { + left: calc(anchor(right) + 10px); + align-self: anchor-center; + width: 100px; + position-area: none; +} + +@position-try --custom-bottom-right { + position-area: bottom right; + margin: 10px 0 0 10px; +} + +._style_module_css-infobox { + position: fixed; + position-anchor: --myAnchor; + position-area: top; + width: 200px; + margin: 0 0 10px 0; + position-try-fallbacks: + --custom-left, --custom-bottom, + --custom-right, --custom-bottom-right; +} + +@page { + size: 8.5in 9in; + margin-top: 4in; +} + +@color-profile --swop5c { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +._style_module_css-header { + background-color: color(--swop5c 0% 70% 20% 0%); +} + +._style_module_css-test { + test: (1, 2) [3, 4], { 1: 2}; + ._style_module_css-a { + width: 200px; + } +} + +._style_module_css-test { + ._style_module_css-test { + width: 200px; + } +} + +._style_module_css-test { + width: 200px; + + ._style_module_css-test { + width: 200px; + } +} + +._style_module_css-test { + width: 200px; + + ._style_module_css-test { + ._style_module_css-test { + width: 200px; + } + } +} + +._style_module_css-test { + width: 200px; + + ._style_module_css-test { + width: 200px; + + ._style_module_css-test { + width: 200px; + } + } +} + +._style_module_css-test { + ._style_module_css-test { + width: 200px; + + ._style_module_css-test { + width: 200px; + } + } +} + +._style_module_css-test { + ._style_module_css-test { + width: 200px; + } + width: 200px; +} + +._style_module_css-test { + ._style_module_css-test { + width: 200px; + } + ._style_module_css-test { + width: 200px; + } +} + +._style_module_css-test { + ._style_module_css-test { + width: 200px; + } + width: 200px; + ._style_module_css-test { + width: 200px; + } +} + +#_style_module_css-test { + c: 1; + + #_style_module_css-test { + c: 2; + } +} + +@property --_style_module_css-item-size { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} + +._style_module_css-container { + display: flex; + height: 200px; + border: 1px dashed black; + + /* set custom property values on parent */ + --_style_module_css-item-size: 20%; + --_style_module_css-item-color: orange; +} + +._style_module_css-item { + width: var(--_style_module_css-item-size); + height: var(--_style_module_css-item-size); + background-color: var(--_style_module_css-item-color); +} + +._style_module_css-two { + --_style_module_css-item-size: initial; + --_style_module_css-item-color: inherit; +} + +._style_module_css-three { + /* invalid values */ + --_style_module_css-item-size: 1000px; + --_style_module_css-item-color: xyz; +} + +@property invalid { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property{ + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} + +@keyframes _style_module_css-initial { /* ... */ } +@keyframes/**test**/_style_module_css-initial { /* ... */ } +@keyframes/**test**/_style_module_css-initial/**test**/{ /* ... */ } +@keyframes/**test**//**test**/_style_module_css-initial/**test**//**test**/{ /* ... */ } +@keyframes /**test**/ /**test**/ _style_module_css-initial /**test**/ /**test**/ { /* ... */ } +@keyframes _style_module_css-None { /* ... */ } +@property/**test**/--_style_module_css-item-size { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property/**test**/--_style_module_css-item-size/**test**/{ + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property /**test**/--_style_module_css-item-size/**test**/ { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property /**test**/ --_style_module_css-item-size /**test**/ { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property/**test**/ --_style_module_css-item-size /**test**/{ + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property /**test**/ --_style_module_css-item-size /**test**/ { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +div { + animation: 3s ease-in 1s 2 reverse both paused _style_module_css-initial, _style_module_css-localkeyframes2; + animation-name: _style_module_css-initial; + animation-duration: 2s; +} + +._style_module_css-item-1 { + width: var( --_style_module_css-item-size ); + height: var(/**comment**/--_style_module_css-item-size); + background-color: var( /**comment**/--_style_module_css-item-color); + background-color-1: var(/**comment**/ --_style_module_css-item-color); + background-color-2: var( /**comment**/ --_style_module_css-item-color); + background-color-3: var( /**comment**/ --_style_module_css-item-color /**comment**/ ); + background-color-3: var( /**comment**/--_style_module_css-item-color/**comment**/ ); + background-color-3: var(/**comment**/--_style_module_css-item-color/**comment**/); +} + +@keyframes/**test**/_style_module_css-foo { /* ... */ } +@keyframes /**test**/_style_module_css-foo { /* ... */ } +@keyframes/**test**/ _style_module_css-foo { /* ... */ } +@keyframes /**test**/ _style_module_css-foo { /* ... */ } +@keyframes /**test**//**test**/ _style_module_css-foo { /* ... */ } +@keyframes /**test**/ /**test**/ _style_module_css-foo { /* ... */ } +@keyframes /**test**/ /**test**/_style_module_css-foo { /* ... */ } +@keyframes /**test**//**test**/_style_module_css-foo { /* ... */ } +@keyframes/**test**//**test**/_style_module_css-foo { /* ... */ } +@keyframes/**test**//**test**/_style_module_css-foo/**test**//**test**/{ /* ... */ } +@keyframes /**test**/ /**test**/ _style_module_css-foo /**test**/ /**test**/ { /* ... */ } + +./**test**//**test**/_style_module_css-class { + background: red; +} + +./**test**/ /**test**/class { + background: red; +} + +._style_module_css-var { + --_style_module_css-main-color: black; + --_style_module_css-FOO: 10px; + --_style_module_css-foo: 10px; + --_style_module_css-bar: calc(var(--_style_module_css-foo) + 10px); + --_style_module_css-accent-background: linear-gradient(to top, var(--_style_module_css-main-color), white); + --_style_module_css-external-link: \\"test\\"; + --_style_module_css-custom-prop: yellow; + --_style_module_css-default-value: red; + --_style_module_css-main-bg-color: red; + --_style_module_css-backup-bg-color: black; + -foo: calc(var(--_style_module_css-bar) + 10px); + var: var(--_style_module_css-main-color); + var1: var(--_style_module_css-foo); + var2: var(--_style_module_css-FOO); + content: \\" (\\" var(--_style_module_css-external-link) \\")\\"; + var3: var(--_style_module_css-main-color, blue); + var4: var(--_style_module_css-custom-prop,); + var5: var(--_style_module_css-custom-prop, initial); + var6: var(--_style_module_css-custom-prop, var(--_style_module_css-default-value)); + var7: var(--_style_module_css-custom-prop, var(--_style_module_css-default-value, red)); + var8: var(--unknown); + background-color: var(--_style_module_css-main-bg-color, var(--_style_module_css-backup-bg-color, white)); +} + +._style_module_css-var-order { + background-color: var(--_style_module_css-test); + --_style_module_css-test: red; +} + + +/*!*********************************!*\\\\ + !*** css ./style.module.my-css ***! + \\\\*********************************/ +._style_module_my-css-myCssClass { + color: red; +} + +/*!**************************************!*\\\\ + !*** css ./style.module.css.invalid ***! + \\\\**************************************/ +.class { + color: teal; +} + +/*!************************************!*\\\\ + !*** css ./identifiers.module.css ***! + \\\\************************************/ +._identifiers_module_css-UnusedClassName{ + color: red; + padding: var(--_identifiers_module_css-variable-unused-class); + --_identifiers_module_css-variable-unused-class: 10px; +} + +._identifiers_module_css-UsedClassName { + color: green; + padding: var(--_identifiers_module_css-variable-used-class); + --_identifiers_module_css-variable-used-class: 10px; +} + +" +`; + +exports[`ConfigTestCases css css-modules exported tests should allow to create css modules: prod 1`] = ` +Object { + "UsedClassName": "my-app-194-ZL", + "VARS": "--my-app-235-I0 my-app-235-XE undefined my-app-235-wt", + "animation": "my-app-235-lY", + "animationName": "my-app-235-iZ", + "class": "my-app-235-zg", + "classInContainer": "my-app-235-bK", + "classLocalScope": "my-app-235-Ci", + "cssModuleWithCustomFileExtension": "my-app-666-k", + "currentWmultiParams": "my-app-235-Hq", + "deepClassInContainer": "my-app-235-Y1", + "displayFlexInSupportsInMediaUpperCase": "my-app-235-ij", + "exportLocalVarsShouldCleanup": "false false", + "futureWmultiParams": "my-app-235-Hb", + "global": undefined, + "hasWmultiParams": "my-app-235-AO", + "ident": "my-app-235-bD", + "inLocalGlobalScope": "my-app-235-V0", + "inSupportScope": "my-app-235-nc", + "isWmultiParams": "my-app-235-aq", + "keyframes": "my-app-235-$t", + "keyframesUPPERCASE": "my-app-235-zG", + "local": "my-app-235-Hi my-app-235-OB my-app-235-VE my-app-235-O2", + "local2": "my-app-235-Vj my-app-235-OH", + "localkeyframes2UPPPERCASE": "my-app-235-Dk", + "matchesWmultiParams": "my-app-235-VN", + "media": "my-app-235-a7", + "mediaInSupports": "my-app-235-aY", + "mediaWithOperator": "my-app-235-uf", + "mozAnimationName": "my-app-235-M6", + "mozAnyWmultiParams": "my-app-235-OP", + "myColor": "--my-app-235-rX", + "nested": "my-app-235-nb undefined my-app-235-$Q", + "notAValidCssModuleExtension": true, + "notWmultiParams": "my-app-235-H5", + "paddingLg": "my-app-235-cD", + "paddingSm": "my-app-235-dW", + "pastWmultiParams": "my-app-235-O4", + "supports": "my-app-235-sW", + "supportsInMedia": "my-app-235-II", + "supportsWithOperator": "my-app-235-TZ", + "vars": "--my-app-235-uz my-app-235-f undefined my-app-235-aK", + "webkitAnyWmultiParams": "my-app-235-Hw", + "whereWmultiParams": "my-app-235-VM", +} +`; + +exports[`ConfigTestCases css css-modules exported tests should allow to create css modules: prod 2`] = ` +"/*!*******************************!*\\\\ + !*** css ./colors.module.css ***! + \\\\*******************************/ + + + + + + + + + + + + + + +/*!**************************************!*\\\\ + !*** css ./at-rule-value.module.css ***! + \\\\**************************************/ + + +.my-app-744-value-in-class { + color: blue; +} + + + + + + +@media (max-width: 599px) { + abbr:hover { + color: limegreen; + transition-duration: 1s; + } +} + + + +.my-app-744-foo { color: red; } + + + +.my-app-744-foo { + &.my-app-744-bar { color: red; } +} + + + +.my-app-744-foo { + @media (min-width: 1024px) { + &.my-app-744-bar { color: red; } + } +} + + + +.my-app-744-foo { + @media (min-width: 1024px) { + &.my-app-744-bar { + @media (min-width: 1024px) { + color: red; + } + } + } +} + + + + +.my-app-744-foo { height: 40px; height: 36px; } + + + +.my-app-744-colorValue { + color: red; +} + + + +#my-app-744-colorValue-v1 { + color: red; +} + + + +.my-app-744-colorValue-v2 > .my-app-744-colorValue-v2 { + color: red; +} + + + +.red { + color: .red; +} + + + +.my-app-744-export { + color: blue; +} + + + +.my-app-744-foo { color: red; } + + + +.my-app-744-foo { color: red; } +.my-app-744-bar { color: yellow } + + + + +.my-app-744-foo { color: blue; } + + + + +.my-app-744-foo { color: blue; } + + + + +.my-app-744-class-a { color: red; } + + + + +.my-app-744-class-a { margin: calc(base * 2); } + + + + +.my-app-744-class-a { content: \\"test-a\\" \\"test-b\\"; } + + + +.my-app-744-foo { color: var(--color); } + + + + + + + +.my-app-744-foo { + color: red; + background-color: #0f0; + border-top-color: #00ff00; + border-bottom-color: rgba(34, 12, 64, 0.3); + outline-color: hsla(220, 13.0%, 18.0%, 1); +} + + + +.my-app-744-foo { color: blue; } +.my-app-744-bar { color: red } + + + +.my-app-744-foo { box-shadow: 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +.my-app-744-foo { color: color(red lightness(50%)); } + + + +:root { --my-app-744-color: red; } + + + +:root { --my-app-744-color: ; } + + + +:root { --my-app-744-color: ; } + + + +:root { --my-app-744-color:/* comment */; } + + + + +.my-app-744-override { + color: red; +} + + + + +.my-app-744-class { + color: red; + color: red; + color: blue; +} + + + +.my-app-744-color { + color: /* test */red/* test */; +} + + + +.my-app-744-color { + color: /* test *//* test */red/* test */; +} + + + +.my-app-744-foo { box-shadow: 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +.my-app-744-foo { box-shadow: 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +.my-app-744-foo { box-shadow: /* test */ 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +.my-app-744-foo { box-shadow: /* test */0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +.my-app-744-foo { box-shadow: 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +.my-app-744-foo { box-shadow: /* test */0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); } + + + +.my-app-744-foo { color: blue; } + + + +.my-app-744-foo { color: blue; } + + + +.my-app-744-foo { color: my-name-q; } + + + + +/*!*********************************************!*\\\\ + !*** css ./var-function-export.modules.css ***! + \\\\*********************************************/ +:root { + --my-app-392-my-var-u1: red; + --my-app-392-my-var-u2: blue; + --my-app-392-not-override-class: black; + --my-app-392-1: red; + --my-app-392---a: red; + --my-app-392-main-bg-color: red; +} + +.my-app-392-my-var-u1 { + color: red; +} + +/*!*************************************!*\\\\ + !*** css ./var-function.module.css ***! + \\\\*************************************/ +:root { + --my-app-768-main-bg-color: brown; + --my-app-768-my-var: red; + --my-app-768-my-background: blue; + --my-app-768-my-global: yellow; + --: \\"reserved\\"; + --my-app-768-a: green; +} + +.my-app-768-class { + color: var(--my-app-768-main-bg-color); +} + +@property --my-app-768-logo-color { + syntax: \\"\\"; + inherits: false; + initial-value: #c0ffee; +} + +@property -- { + syntax: \\"\\"; + inherits: false; + initial-value: #c0ffee; +} + +.my-app-768-class { + color: var(--my-app-768-logo-color); +} + +div { + background-color: var(--my-app-768-box-color); +} + +.my-app-768-two { + --my-app-768-box-color: cornflowerblue; +} + +.my-app-768-three { + --my-app-768-box-color: aquamarine; +} + + +.my-app-768-one { + /* Red if --my-var is not defined */ + color: var(--my-app-768-my-var, red); +} + +.my-app-768-two { + /* pink if --my-var and --my-background are not defined */ + color: var(--my-app-768-my-var, var(--my-app-768-my-background, pink)); +} + +.my-app-768-reserved { + color: var(--); +} + +.my-app-768-green { + color: var(--my-app-768-a); +} + +.my-app-768-global { + color: var(--my-global); +} + +.my-app-768-global-and-default { + color: var(--my-global, pink); +} + +.my-app-768-global-and-default-1 { + color: var(--my-global, var(--my-global-background)); +} + +.my-app-768-global-and-default-2 { + color: var(--my-global, var(--my-global-background, pink)); +} + +.my-app-768-global-and-default-3 { + color: var(--my-global, var(--my-app-768-my-background, pink)); +} + +.my-app-768-global-and-default-5 { + color: var( --my-global,var(--my-app-768-my-background,pink)); +} + +.my-app-768-global-and-default-6 { + background: var( --my-app-768-main-bg-color , var( --my-app-768-my-background , pink ) ) , var(--my-global); +} + +.my-app-768-global-and-default-7 { + background: var(--my-app-768-main-bg-color,var(--my-app-768-my-background,pink)),var(--my-global); +} + +.my-app-768-from { + color: var(--my-app-392-my-var-u1); +} + +.my-app-768-from-1 { + color: var(--my-app-768-main-bg-color, var(--my-app-392-my-var-u1)); +} + +.my-app-768-from-2 { + color: var(--my-app-392-my-var-u1, var(--my-app-768-main-bg-color)); +} + +.my-app-768-from-3 { + color: var(--my-app-392-my-var-u1, var(--my-app-392-my-var-u2)); +} + +.my-app-768-from-4 { + color: var(--my-app-392-1); +} + +.my-app-768-from-5 { + color: var(--my-app-392---a); +} + +.my-app-768-from-6 { + color: var(--my-app-392-main-bg-color); +} + +.my-app-768-mixed { + color: var(--my-app-392-my-var-u1, var(--my-global, var(--my-app-768-main-bg-color, red))); +} + +.my-app-768-broken { + color: var(--my-global from); +} + +.my-app-768-broken-1 { + color: var(--my-global from 1); +} + +:root { + --my-app-768-not-override-class: red; +} + +.my-app-768-not-override-class { + color: var(--my-app-392-not-override-class) +} + +/*!******************************!*\\\\ + !*** css ./style.module.css ***! + \\\\******************************/ + +.my-app-235-zg { + color: red; +} + +.my-app-235-Hi, +.my-app-235-OB .global, +.my-app-235-VE { + color: green; +} + +.global .my-app-235-O2 { + color: yellow; +} + +.my-app-235-Vj.global.my-app-235-OH { + color: blue; +} + +.my-app-235-H5 div:not(.my-app-235-disabled, .my-app-235-mButtonDisabled, .my-app-235-tipOnly) { + pointer-events: initial !important; +} + +.my-app-235-aq :is(div.my-app-235-parent1.my-app-235-child1.my-app-235-vertical-tiny, + div.my-app-235-parent1.my-app-235-child1.my-app-235-vertical-small, + div.my-app-235-otherDiv.my-app-235-horizontal-tiny, + div.my-app-235-otherDiv.my-app-235-horizontal-small div.my-app-235-description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +.my-app-235-VN :matches(div.my-app-235-parent1.my-app-235-child1.my-app-235-vertical-tiny, + div.my-app-235-parent1.my-app-235-child1.my-app-235-vertical-small, + div.my-app-235-otherDiv.my-app-235-horizontal-tiny, + div.my-app-235-otherDiv.my-app-235-horizontal-small div.my-app-235-description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +.my-app-235-VM :where(div.my-app-235-parent1.my-app-235-child1.my-app-235-vertical-tiny, + div.my-app-235-parent1.my-app-235-child1.my-app-235-vertical-small, + div.my-app-235-otherDiv.my-app-235-horizontal-tiny, + div.my-app-235-otherDiv.my-app-235-horizontal-small div.my-app-235-description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +.my-app-235-AO div:has(.my-app-235-disabled, .my-app-235-mButtonDisabled, .my-app-235-tipOnly) { + pointer-events: initial !important; +} + +.my-app-235-Hq div:current(p, span) { + background-color: yellow; +} + +.my-app-235-O4 div:past(p, span) { + display: none; +} + +.my-app-235-Hb div:future(p, span) { + background-color: yellow; +} + +.my-app-235-OP div:-moz-any(ol, ul, menu, dir) { + list-style-type: square; +} + +.my-app-235-Hw li:-webkit-any(:first-child, :last-child) { + background-color: aquamarine; +} + +.my-app-235-VN :matches(div.my-app-235-parent1.my-app-235-child1.my-app-235-vertical-tiny, + div.my-app-235-parent1.my-app-235-child1.my-app-235-vertical-small, + div.my-app-235-otherDiv.my-app-235-horizontal-tiny, + div.my-app-235-otherDiv.my-app-235-horizontal-small div.my-app-235-description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +.my-app-235-nb.nested2.my-app-235-\\\\$Q { + color: pink; +} + +#my-app-235-bD { + color: purple; +} + +@keyframes my-app-235-\\\\$t { + 0% { + left: var(--my-app-235-qi); + top: var(--my-app-235-xB); + color: var(--theme-color1); + } + 100% { + left: var(--my-app-235-\\\\$6); + top: var(--my-app-235-gJ); + color: var(--theme-color2); + } +} + +@keyframes my-app-235-x { + 0% { + left: 0; + } + 100% { + left: 100px; + } +} + +.my-app-235-lY { + animation-name: my-app-235-\\\\$t; + animation: 3s ease-in 1s 2 reverse both paused my-app-235-\\\\$t, my-app-235-x; + --my-app-235-qi: 0px; + --my-app-235-xB: 0px; + --my-app-235-\\\\$6: 10px; + --my-app-235-gJ: 20px; +} + +/* .composed { + composes: local1; + composes: local2; +} */ + +.my-app-235-f { + color: var(--my-app-235-uz); + --my-app-235-uz: red; +} + +.my-app-235-aK { + color: var(--global-color); + --global-color: red; +} + +@media (min-width: 1600px) { + .my-app-235-a7 { + color: var(--my-app-235-uz); + --my-app-235-uz: green; + } +} + +@media screen and (max-width: 600px) { + .my-app-235-uf { + color: var(--my-app-235-uz); + --my-app-235-uz: purple; + } +} + +@supports (display: grid) { + .my-app-235-sW { + display: grid; + } +} + +@supports not (display: grid) { + .my-app-235-TZ { + float: right; + } +} + +@supports (display: flex) { + @media screen and (min-width: 900px) { + .my-app-235-aY { + display: flex; + } + } +} + +@media screen and (min-width: 900px) { + @supports (display: flex) { + .my-app-235-II { + display: flex; + } + } +} + +@MEDIA screen and (min-width: 900px) { + @SUPPORTS (display: flex) { + .my-app-235-ij { + display: flex; + } + } +} + +.my-app-235-animationUpperCase { + ANIMATION-NAME: my-app-235-zG; + ANIMATION: 3s ease-in 1s 2 reverse both paused my-app-235-zG, my-app-235-Dk; + --my-app-235-qi: 0px; + --my-app-235-xB: 0px; + --my-app-235-\\\\$6: 10px; + --my-app-235-gJ: 20px; +} + +@KEYFRAMES my-app-235-zG { + 0% { + left: VAR(--my-app-235-qi); + top: VAR(--my-app-235-xB); + color: VAR(--theme-color1); + } + 100% { + left: VAR(--my-app-235-\\\\$6); + top: VAR(--my-app-235-gJ); + color: VAR(--theme-color2); + } +} + +@KEYframes my-app-235-Dk { + 0% { + left: 0; + } + 100% { + left: 100px; + } +} + +.globalUpperCase .my-app-235-localUpperCase { + color: yellow; +} + +.my-app-235-XE { + color: VAR(--my-app-235-I0); + --my-app-235-I0: red; +} + +.my-app-235-wt { + COLOR: VAR(--GLOBAR-COLOR); + --GLOBAR-COLOR: red; +} + +@supports (top: env(safe-area-inset-top, 0)) { + .my-app-235-nc { + color: red; + } +} + +.my-app-235-a { + animation: 3s my-app-235-iZ; + -webkit-animation: 3s my-app-235-iZ; +} + +.my-app-235-b { + animation: my-app-235-iZ 3s; + -webkit-animation: my-app-235-iZ 3s; +} + +.my-app-235-c { + animation-name: my-app-235-iZ; + -webkit-animation-name: my-app-235-iZ; +} + +.my-app-235-d { + --my-app-235-ZP: animationName; +} + +@keyframes my-app-235-iZ { + 0% { + background: white; + } + 100% { + background: red; + } +} + +@-webkit-keyframes my-app-235-iZ { + 0% { + background: white; + } + 100% { + background: red; + } +} + +@-moz-keyframes my-app-235-M6 { + 0% { + background: white; + } + 100% { + background: red; + } +} + +@counter-style thumbs { + system: cyclic; + symbols: \\"\\\\1F44D\\"; + suffix: \\" \\"; +} + +@font-feature-values Font One { + @styleset { + nice-style: 12; + } +} + +/* At-rule for \\"nice-style\\" in Font Two */ +@font-feature-values Font Two { + @styleset { + nice-style: 4; + } +} + +@property --my-app-235-rX { + syntax: \\"\\"; + inherits: false; + initial-value: #c0ffee; +} + +@property --my-app-235-my-color-1 { + initial-value: #c0ffee; + syntax: \\"\\"; + inherits: false; +} + +@property --my-app-235-my-color-2 { + syntax: \\"\\"; + initial-value: #c0ffee; + inherits: false; +} + +.my-app-235-zg { + color: var(--my-app-235-rX); +} + +@layer utilities { + .my-app-235-dW { + padding: 0.5rem; + } + + .my-app-235-cD { + padding: 0.8rem; + } +} + +.my-app-235-zg { + color: red; + + .my-app-235-nested-pure { + color: red; + } + + @media screen and (min-width: 200px) { + color: blue; + + .my-app-235-nested-media { + color: blue; + } + } + + @supports (display: flex) { + display: flex; + + .my-app-235-nested-supports { + display: flex; + } + } + + @layer foo { + background: red; + + .my-app-235-nested-layer { + background: red; + } + } + + @container foo { + background: red; + + .my-app-235-nested-layer { + background: red; + } + } +} + +.my-app-235-not-selector-inside { + color: #fff; + opacity: 0.12; + padding: .5px; + unknown: :local(.test); + unknown1: :local .test; + unknown2: :global .test; + unknown3: :global .test; + unknown4: .foo, .bar, #bar; +} + +@unknown :local .local :global .global { + color: red; +} + +@unknown :local(.local) :global(.global) { + color: red; +} + +.my-app-235-nested-var { + .my-app-235-again { + color: var(--my-app-235-uz); + } +} + +.my-app-235-nested-with-local-pseudo { + color: red; + + .my-app-235-local-nested { + color: red; + } + + .global-nested { + color: red; + } + + .my-app-235-local-nested { + color: red; + } + + .global-nested { + color: red; + } + + .my-app-235-local-nested, .global-nested-next { + color: red; + } + + .my-app-235-local-nested, .global-nested-next { + color: red; + } + + .foo, .my-app-235-M0 { + color: red; + } +} + +#my-app-235-id-foo { + color: red; + + #my-app-235-id-bar { + color: red; + } +} + +.my-app-235-nested-parens { + .my-app-235-VN div:has(.my-app-235-vertical-tiny, .my-app-235-vertical-small) { + max-height: 0; + margin: 0; + overflow: hidden; + } +} + +.global-foo { + .nested-global { + color: red; + } + + .my-app-235-local-in-global { + color: blue; + } +} + +@unknown .class { + color: red; + + .my-app-235-zg { + color: red; + } +} + +.class .my-app-235-V0, +.class .my-app-235-V0, +.my-app-235-Ci .in-local-global-scope { + color: red; +} + +@container (width > 400px) { + .my-app-235-bK { + font-size: 1.5em; + } +} + +@container summary (min-width: 400px) { + @container (width > 400px) { + .my-app-235-Y1 { + font-size: 1.5em; + } + } +} + +:scope { + color: red; +} + +.my-app-235-placeholder-gray-700:-ms-input-placeholder { + --my-app-235-Y: 1; + color: #4a5568; + color: rgba(74, 85, 104, var(--my-app-235-Y)); +} +.my-app-235-placeholder-gray-700::-ms-input-placeholder { + --my-app-235-Y: 1; + color: #4a5568; + color: rgba(74, 85, 104, var(--my-app-235-Y)); +} +.my-app-235-placeholder-gray-700::placeholder { + --my-app-235-Y: 1; + color: #4a5568; + color: rgba(74, 85, 104, var(--my-app-235-Y)); +} + +:root { + --my-app-235-t6: dark; +} + +@media screen and (prefers-color-scheme: var(--my-app-235-t6)) { + .my-app-235-KR { + color: white; + } +} + +@keyframes my-app-235-Fk { + from { + margin-left: 100%; + width: 300%; + } + + to { + margin-left: 0%; + width: 100%; + } +} + +.my-app-235-zg { + animation: + foo var(--my-app-235-ZP) 3s, + var(--my-app-235-ZP) 3s, + 3s linear 1s infinite running my-app-235-Fk, + 3s linear env(foo, var(--my-app-235-KR)) infinite running my-app-235-Fk; +} + +:root { + --my-app-235-KR: 10px; +} + +.my-app-235-zg { + bar: env(foo, var(--my-app-235-KR)); +} + +.global-foo, .my-app-235-M0 { + .my-app-235-local-in-global { + color: blue; + } + + @media screen { + .my-global-class-again, + .my-app-235-my-global-class-again { + color: red; + } + } +} + +.my-app-235-first-nested { + .my-app-235-first-nested-nested { + color: red; + } +} + +.my-app-235-first-nested-at-rule { + @media screen { + .my-app-235-first-nested-nested-at-rule-deep { + color: red; + } + } +} + +.again-global { + color:red; +} + +.again-again-global { + .again-again-global { + color: red; + } +} + +:root { + --my-app-235-pr: red; +} + +.again-again-global { + color: var(--foo); + + .again-again-global { + color: var(--foo); + } +} + +.again-again-global { + animation: slidein 3s; + + .again-again-global, .my-app-235-zg, .my-app-235-nb.nested2.my-app-235-\\\\$Q { + animation: my-app-235-Fk 3s; + } + + .my-app-235-OB .global, + .my-app-235-VE { + color: red; + } +} + +@unknown var(--my-app-235-pr) { + color: red; +} + +.my-app-235-zg { + .my-app-235-zg { + .my-app-235-zg { + .my-app-235-zg {} + } + } +} + +.my-app-235-zg { + .my-app-235-zg { + .my-app-235-zg { + .my-app-235-zg { + animation: my-app-235-Fk 3s; + } + } + } +} + +.my-app-235-zg { + animation: my-app-235-Fk 3s; + .my-app-235-zg { + animation: my-app-235-Fk 3s; + .my-app-235-zg { + animation: my-app-235-Fk 3s; + .my-app-235-zg { + animation: my-app-235-Fk 3s; + } + } + } +} + +.my-app-235-broken { + . global(.my-app-235-zg) { + color: red; + } + + : global(.my-app-235-zg) { + color: red; + } + + : global .my-app-235-zg { + color: red; + } + + : local(.my-app-235-zg) { + color: red; + } + + : local .my-app-235-zg { + color: red; + } + + # hash { + color: red; + } +} + +.my-app-235-comments { + .class { + color: red; + } + + .class { + color: red; + } + + .my-app-235-zg { + color: red; + } + + .my-app-235-zg { + color: red; + } + + ./** test **/my-app-235-zg { + color: red; + } + + ./** test **/my-app-235-zg { + color: red; + } + + ./** test **/my-app-235-zg { + color: red; + } +} + +.my-app-235-pr { + color: red; + + .my-app-235-M0 + & { color: blue; } +} + +.my-app-235-error, #my-app-235-err-404 { + &:hover > .my-app-235-KR { color: red; } +} + +.my-app-235-pr { + & :is(.my-app-235-M0, &.my-app-235-KR) { color: red; } +} + +.my-app-235-qqq { + color: green; + & .my-app-235-a { color: blue; } + color: red; +} + +.my-app-235-parent { + color: blue; + + @scope (& > .my-app-235-scope) to (& > .my-app-235-limit) { + & .my-app-235-content { + color: red; + } + } +} + +.my-app-235-parent { + color: blue; + + @scope (& > .my-app-235-scope) to (& > .my-app-235-limit) { + .my-app-235-content { + color: red; + } + } + + .my-app-235-a { + color: red; + } +} + +@scope (.my-app-235-card) { + :scope { border-block-end: 1px solid white; } +} + +.my-app-235-card { + inline-size: 40ch; + aspect-ratio: 3/4; + + @scope (&) { + :scope { + border: 1px solid white; + } + } +} + +.my-app-235-pr { + display: grid; + + @media (orientation: landscape) { + .my-app-235-M0 { + grid-auto-flow: column; + + @media (min-width > 1024px) { + .my-app-235-baz-1 { + display: grid; + } + + max-inline-size: 1024px; + + .my-app-235-baz-2 { + display: grid; + } + } + } + } +} + +@counter-style thumbs { + system: cyclic; + symbols: \\"\\\\1F44D\\"; + suffix: \\" \\"; +} + +ul { + list-style: thumbs; +} + +@container (width > 400px) and style(--responsive: true) { + .my-app-235-zg { + font-size: 1.5em; + } +} +/* At-rule for \\"nice-style\\" in Font One */ +@font-feature-values Font One { + @styleset { + nice-style: 12; + } +} + +@font-palette-values --identifier { + font-family: Bixa; +} + +.my-app-235-my-class { + font-palette: --identifier; +} + +@keyframes my-app-235-pr { /* ... */ } +@keyframes my-app-235-pr { /* ... */ } +@keyframes { /* ... */ } +@keyframes{ /* ... */ } + +@supports (display: flex) { + @media screen and (min-width: 900px) { + article { + display: flex; + } + } +} + +@starting-style { + .my-app-235-zg { + opacity: 0; + transform: scaleX(0); + } +} + +.my-app-235-zg { + opacity: 1; + transform: scaleX(1); + + @starting-style { + opacity: 0; + transform: scaleX(0); + } +} + +@scope (.my-app-235-feature) { + .my-app-235-zg { opacity: 0; } + + :scope .my-app-235-class-1 { opacity: 0; } + + & .my-app-235-zg { opacity: 0; } +} + +@position-try --custom-left { + position-area: left; + width: 100px; + margin: 0 10px 0 0; +} + +@position-try --custom-bottom { + top: anchor(bottom); + justify-self: anchor-center; + margin: 10px 0 0 0; + position-area: none; +} + +@position-try --custom-right { + left: calc(anchor(right) + 10px); + align-self: anchor-center; + width: 100px; + position-area: none; +} + +@position-try --custom-bottom-right { + position-area: bottom right; + margin: 10px 0 0 10px; +} + +.my-app-235-infobox { + position: fixed; + position-anchor: --myAnchor; + position-area: top; + width: 200px; + margin: 0 0 10px 0; + position-try-fallbacks: + --custom-left, --custom-bottom, + --custom-right, --custom-bottom-right; +} + +@page { + size: 8.5in 9in; + margin-top: 4in; +} + +@color-profile --swop5c { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +.my-app-235-header { + background-color: color(--swop5c 0% 70% 20% 0%); +} + +.my-app-235-t6 { + test: (1, 2) [3, 4], { 1: 2}; + .my-app-235-a { + width: 200px; + } +} + +.my-app-235-t6 { + .my-app-235-t6 { + width: 200px; + } +} + +.my-app-235-t6 { + width: 200px; + + .my-app-235-t6 { + width: 200px; + } +} + +.my-app-235-t6 { + width: 200px; + + .my-app-235-t6 { + .my-app-235-t6 { + width: 200px; + } + } +} + +.my-app-235-t6 { + width: 200px; + + .my-app-235-t6 { + width: 200px; + + .my-app-235-t6 { + width: 200px; + } + } +} + +.my-app-235-t6 { + .my-app-235-t6 { + width: 200px; + + .my-app-235-t6 { + width: 200px; + } + } +} + +.my-app-235-t6 { + .my-app-235-t6 { + width: 200px; + } + width: 200px; +} + +.my-app-235-t6 { + .my-app-235-t6 { + width: 200px; + } + .my-app-235-t6 { + width: 200px; + } +} + +.my-app-235-t6 { + .my-app-235-t6 { + width: 200px; + } + width: 200px; + .my-app-235-t6 { + width: 200px; + } +} + +#my-app-235-t6 { + c: 1; + + #my-app-235-t6 { + c: 2; + } +} + +@property --my-app-235-sD { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} + +.my-app-235-container { + display: flex; + height: 200px; + border: 1px dashed black; + + /* set custom property values on parent */ + --my-app-235-sD: 20%; + --my-app-235-gz: orange; +} + +.my-app-235-item { + width: var(--my-app-235-sD); + height: var(--my-app-235-sD); + background-color: var(--my-app-235-gz); +} + +.my-app-235-two { + --my-app-235-sD: initial; + --my-app-235-gz: inherit; +} + +.my-app-235-three { + /* invalid values */ + --my-app-235-sD: 1000px; + --my-app-235-gz: xyz; +} + +@property invalid { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property{ + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} + +@keyframes my-app-235-Vh { /* ... */ } +@keyframes/**test**/my-app-235-Vh { /* ... */ } +@keyframes/**test**/my-app-235-Vh/**test**/{ /* ... */ } +@keyframes/**test**//**test**/my-app-235-Vh/**test**//**test**/{ /* ... */ } +@keyframes /**test**/ /**test**/ my-app-235-Vh /**test**/ /**test**/ { /* ... */ } +@keyframes my-app-235-None { /* ... */ } +@property/**test**/--my-app-235-sD { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property/**test**/--my-app-235-sD/**test**/{ + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property /**test**/--my-app-235-sD/**test**/ { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property /**test**/ --my-app-235-sD /**test**/ { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property/**test**/ --my-app-235-sD /**test**/{ + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property /**test**/ --my-app-235-sD /**test**/ { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +div { + animation: 3s ease-in 1s 2 reverse both paused my-app-235-Vh, my-app-235-x; + animation-name: my-app-235-Vh; + animation-duration: 2s; +} + +.my-app-235-item-1 { + width: var( --my-app-235-sD ); + height: var(/**comment**/--my-app-235-sD); + background-color: var( /**comment**/--my-app-235-gz); + background-color-1: var(/**comment**/ --my-app-235-gz); + background-color-2: var( /**comment**/ --my-app-235-gz); + background-color-3: var( /**comment**/ --my-app-235-gz /**comment**/ ); + background-color-3: var( /**comment**/--my-app-235-gz/**comment**/ ); + background-color-3: var(/**comment**/--my-app-235-gz/**comment**/); +} + +@keyframes/**test**/my-app-235-pr { /* ... */ } +@keyframes /**test**/my-app-235-pr { /* ... */ } +@keyframes/**test**/ my-app-235-pr { /* ... */ } +@keyframes /**test**/ my-app-235-pr { /* ... */ } +@keyframes /**test**//**test**/ my-app-235-pr { /* ... */ } +@keyframes /**test**/ /**test**/ my-app-235-pr { /* ... */ } +@keyframes /**test**/ /**test**/my-app-235-pr { /* ... */ } +@keyframes /**test**//**test**/my-app-235-pr { /* ... */ } +@keyframes/**test**//**test**/my-app-235-pr { /* ... */ } +@keyframes/**test**//**test**/my-app-235-pr/**test**//**test**/{ /* ... */ } +@keyframes /**test**/ /**test**/ my-app-235-pr /**test**/ /**test**/ { /* ... */ } + +./**test**//**test**/my-app-235-zg { + background: red; +} + +./**test**/ /**test**/class { + background: red; +} + +.my-app-235-var { + --my-app-235-ve: black; + --my-app-235-bg: 10px; + --my-app-235-pr: 10px; + --my-app-235-M0: calc(var(--my-app-235-pr) + 10px); + --my-app-235-accent-background: linear-gradient(to top, var(--my-app-235-ve), white); + --my-app-235-BW: \\"test\\"; + --my-app-235-WI: yellow; + --my-app-235-Cr: red; + --my-app-235-i3: red; + --my-app-235-tv: black; + -foo: calc(var(--my-app-235-M0) + 10px); + var: var(--my-app-235-ve); + var1: var(--my-app-235-pr); + var2: var(--my-app-235-bg); + content: \\" (\\" var(--my-app-235-BW) \\")\\"; + var3: var(--my-app-235-ve, blue); + var4: var(--my-app-235-WI,); + var5: var(--my-app-235-WI, initial); + var6: var(--my-app-235-WI, var(--my-app-235-Cr)); + var7: var(--my-app-235-WI, var(--my-app-235-Cr, red)); + var8: var(--unknown); + background-color: var(--my-app-235-i3, var(--my-app-235-tv, white)); +} + +.my-app-235-var-order { + background-color: var(--my-app-235-t6); + --my-app-235-t6: red; +} + + +/*!*********************************!*\\\\ + !*** css ./style.module.my-css ***! + \\\\*********************************/ +.my-app-666-k { + color: red; +} + +/*!**************************************!*\\\\ + !*** css ./style.module.css.invalid ***! + \\\\**************************************/ +.class { + color: teal; +} + +/*!************************************!*\\\\ + !*** css ./identifiers.module.css ***! + \\\\************************************/ +.my-app-194-UnusedClassName{ + color: red; + padding: var(--my-app-194-RJ); + --my-app-194-RJ: 10px; +} + +.my-app-194-ZL { + color: green; + padding: var(--my-app-194-c5); + --my-app-194-c5: 10px; +} + +" +`; + +exports[`ConfigTestCases css css-modules-broken-keyframes exported tests should allow to create css modules: prod 1`] = ` +Object { + "class": "my-app-235-zg", +} +`; + +exports[`ConfigTestCases css css-modules-in-node exported tests should allow to create css modules: dev 1`] = ` +Object { + "UsedClassName": "_identifiers_module_css-UsedClassName", + "VARS": "--_style_module_css-LOCAL-COLOR _style_module_css-VARS undefined _style_module_css-globalVarsUpperCase", + "animation": "_style_module_css-animation", + "animationName": "_style_module_css-animationName", + "class": "_style_module_css-class", + "classInContainer": "_style_module_css-class-in-container", + "classLocalScope": "_style_module_css-class-local-scope", + "cssModuleWithCustomFileExtension": "_style_module_my-css-myCssClass", + "currentWmultiParams": "_style_module_css-local12", + "deepClassInContainer": "_style_module_css-deep-class-in-container", + "displayFlexInSupportsInMediaUpperCase": "_style_module_css-displayFlexInSupportsInMediaUpperCase", + "exportLocalVarsShouldCleanup": "false false", + "futureWmultiParams": "_style_module_css-local14", + "global": undefined, + "hasWmultiParams": "_style_module_css-local11", + "ident": "_style_module_css-ident", + "inLocalGlobalScope": "_style_module_css-in-local-global-scope", + "inSupportScope": "_style_module_css-inSupportScope", + "isWmultiParams": "_style_module_css-local8", + "keyframes": "_style_module_css-localkeyframes", + "keyframesUPPERCASE": "_style_module_css-localkeyframesUPPERCASE", + "local": "_style_module_css-local1 _style_module_css-local2 _style_module_css-local3 _style_module_css-local4", + "local2": "_style_module_css-local5 _style_module_css-local6", + "localkeyframes2UPPPERCASE": "_style_module_css-localkeyframes2UPPPERCASE", + "matchesWmultiParams": "_style_module_css-local9", + "media": "_style_module_css-wideScreenClass", + "mediaInSupports": "_style_module_css-displayFlexInMediaInSupports", + "mediaWithOperator": "_style_module_css-narrowScreenClass", + "mozAnimationName": "_style_module_css-mozAnimationName", + "mozAnyWmultiParams": "_style_module_css-local15", + "myColor": "--_style_module_css-my-color", + "nested": "_style_module_css-nested1 undefined _style_module_css-nested3", + "notAValidCssModuleExtension": true, + "notWmultiParams": "_style_module_css-local7", + "paddingLg": "_style_module_css-padding-lg", + "paddingSm": "_style_module_css-padding-sm", + "pastWmultiParams": "_style_module_css-local13", + "supports": "_style_module_css-displayGridInSupports", + "supportsInMedia": "_style_module_css-displayFlexInSupportsInMedia", + "supportsWithOperator": "_style_module_css-floatRightInNegativeSupports", + "vars": "--_style_module_css-local-color _style_module_css-vars undefined _style_module_css-globalVars", + "webkitAnyWmultiParams": "_style_module_css-local16", + "whereWmultiParams": "_style_module_css-local10", +} +`; + +exports[`ConfigTestCases css css-modules-in-node exported tests should allow to create css modules: prod 1`] = ` +Object { + "UsedClassName": "my-app-194-ZL", + "VARS": "--my-app-235-I0 my-app-235-XE undefined my-app-235-wt", + "animation": "my-app-235-lY", + "animationName": "my-app-235-iZ", + "class": "my-app-235-zg", + "classInContainer": "my-app-235-bK", + "classLocalScope": "my-app-235-Ci", + "cssModuleWithCustomFileExtension": "my-app-666-k", + "currentWmultiParams": "my-app-235-Hq", + "deepClassInContainer": "my-app-235-Y1", + "displayFlexInSupportsInMediaUpperCase": "my-app-235-ij", + "exportLocalVarsShouldCleanup": "false false", + "futureWmultiParams": "my-app-235-Hb", + "global": undefined, + "hasWmultiParams": "my-app-235-AO", + "ident": "my-app-235-bD", + "inLocalGlobalScope": "my-app-235-V0", + "inSupportScope": "my-app-235-nc", + "isWmultiParams": "my-app-235-aq", + "keyframes": "my-app-235-$t", + "keyframesUPPERCASE": "my-app-235-zG", + "local": "my-app-235-Hi my-app-235-OB my-app-235-VE my-app-235-O2", + "local2": "my-app-235-Vj my-app-235-OH", + "localkeyframes2UPPPERCASE": "my-app-235-Dk", + "matchesWmultiParams": "my-app-235-VN", + "media": "my-app-235-a7", + "mediaInSupports": "my-app-235-aY", + "mediaWithOperator": "my-app-235-uf", + "mozAnimationName": "my-app-235-M6", + "mozAnyWmultiParams": "my-app-235-OP", + "myColor": "--my-app-235-rX", + "nested": "my-app-235-nb undefined my-app-235-$Q", + "notAValidCssModuleExtension": true, + "notWmultiParams": "my-app-235-H5", + "paddingLg": "my-app-235-cD", + "paddingSm": "my-app-235-dW", + "pastWmultiParams": "my-app-235-O4", + "supports": "my-app-235-sW", + "supportsInMedia": "my-app-235-II", + "supportsWithOperator": "my-app-235-TZ", + "vars": "--my-app-235-uz my-app-235-f undefined my-app-235-aK", + "webkitAnyWmultiParams": "my-app-235-Hw", + "whereWmultiParams": "my-app-235-VM", +} +`; + +exports[`ConfigTestCases css css-modules-in-node exported tests should allow to create css modules: prod 2`] = ` +Object { + "UsedClassName": "my-app-194-ZL", + "VARS": "--my-app-235-I0 my-app-235-XE undefined my-app-235-wt", + "animation": "my-app-235-lY", + "animationName": "my-app-235-iZ", + "class": "my-app-235-zg", + "classInContainer": "my-app-235-bK", + "classLocalScope": "my-app-235-Ci", + "cssModuleWithCustomFileExtension": "my-app-666-k", + "currentWmultiParams": "my-app-235-Hq", + "deepClassInContainer": "my-app-235-Y1", + "displayFlexInSupportsInMediaUpperCase": "my-app-235-ij", + "exportLocalVarsShouldCleanup": "false false", + "futureWmultiParams": "my-app-235-Hb", + "global": undefined, + "hasWmultiParams": "my-app-235-AO", + "ident": "my-app-235-bD", + "inLocalGlobalScope": "my-app-235-V0", + "inSupportScope": "my-app-235-nc", + "isWmultiParams": "my-app-235-aq", + "keyframes": "my-app-235-$t", + "keyframesUPPERCASE": "my-app-235-zG", + "local": "my-app-235-Hi my-app-235-OB my-app-235-VE my-app-235-O2", + "local2": "my-app-235-Vj my-app-235-OH", + "localkeyframes2UPPPERCASE": "my-app-235-Dk", + "matchesWmultiParams": "my-app-235-VN", + "media": "my-app-235-a7", + "mediaInSupports": "my-app-235-aY", + "mediaWithOperator": "my-app-235-uf", + "mozAnimationName": "my-app-235-M6", + "mozAnyWmultiParams": "my-app-235-OP", + "myColor": "--my-app-235-rX", + "nested": "my-app-235-nb undefined my-app-235-$Q", + "notAValidCssModuleExtension": true, + "notWmultiParams": "my-app-235-H5", + "paddingLg": "my-app-235-cD", + "paddingSm": "my-app-235-dW", + "pastWmultiParams": "my-app-235-O4", + "supports": "my-app-235-sW", + "supportsInMedia": "my-app-235-II", + "supportsWithOperator": "my-app-235-TZ", + "vars": "--my-app-235-uz my-app-235-f undefined my-app-235-aK", + "webkitAnyWmultiParams": "my-app-235-Hw", + "whereWmultiParams": "my-app-235-VM", +} +`; + +exports[`ConfigTestCases css css-modules-in-node exported tests should allow to import css modules: class-dev 1`] = `"_style_module_css-class"`; + +exports[`ConfigTestCases css css-modules-in-node exported tests should allow to import css modules: class-prod 1`] = `"my-app-235-zg"`; + +exports[`ConfigTestCases css css-modules-in-node exported tests should allow to import css modules: class-prod 2`] = `"my-app-235-zg"`; + +exports[`ConfigTestCases css css-modules-in-node exported tests should allow to import css modules: local1-dev 1`] = `"_style_module_css-local1"`; + +exports[`ConfigTestCases css css-modules-in-node exported tests should allow to import css modules: local1-prod 1`] = `"my-app-235-Hi"`; + +exports[`ConfigTestCases css css-modules-in-node exported tests should allow to import css modules: local1-prod 2`] = `"my-app-235-Hi"`; + +exports[`ConfigTestCases css css-modules-in-node exported tests should allow to import css modules: local2-dev 1`] = `"_style_module_css-local2"`; + +exports[`ConfigTestCases css css-modules-in-node exported tests should allow to import css modules: local2-prod 1`] = `"my-app-235-OB"`; + +exports[`ConfigTestCases css css-modules-in-node exported tests should allow to import css modules: local2-prod 2`] = `"my-app-235-OB"`; + +exports[`ConfigTestCases css css-modules-in-node exported tests should allow to import css modules: local3-dev 1`] = `"_style_module_css-local3"`; + +exports[`ConfigTestCases css css-modules-in-node exported tests should allow to import css modules: local3-prod 1`] = `"my-app-235-VE"`; + +exports[`ConfigTestCases css css-modules-in-node exported tests should allow to import css modules: local3-prod 2`] = `"my-app-235-VE"`; + +exports[`ConfigTestCases css css-modules-in-node exported tests should allow to import css modules: local4-dev 1`] = `"_style_module_css-local4"`; + +exports[`ConfigTestCases css css-modules-in-node exported tests should allow to import css modules: local4-prod 1`] = `"my-app-235-O2"`; + +exports[`ConfigTestCases css css-modules-in-node exported tests should allow to import css modules: local4-prod 2`] = `"my-app-235-O2"`; + +exports[`ConfigTestCases css css-modules-no-space exported tests should allow to create css modules 1`] = ` +Object { + "class": "_style_module_css-class", +} +`; + +exports[`ConfigTestCases css css-modules-no-space exported tests should allow to create css modules 2`] = ` +"/*!******************************!*\\\\ + !*** css ./style.module.css ***! + \\\\******************************/ +._style_module_css-no-space { + .class { + color: red; + } + + /** test **/.class { + color: red; + } + + ._style_module_css-class { + color: red; + } + + /** test **/._style_module_css-class { + color: red; + } + + /** test **/#_style_module_css-hash { + color: red; + } + + /** test **/{ + color: red; + } +} + +" +`; + +exports[`ConfigTestCases css escape-unescape exported tests should work with URLs in CSS: classes 1`] = ` +Object { + "#": "_style_modules_css-#", + "##": "_style_modules_css-##", + "#.#.#": "_style_modules_css-#.#.#", + "#fake-id": "_style_modules_css-#fake-id", + "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.": "_style_modules_css-++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.", + "-a-b-c-": "_style_modules_css--a-b-c-", + "-a0-34a___f": "_style_modules_css--a0-34a___f", + ".": "_style_modules_css-.", + "123": "_style_modules_css-123", + "1a2b3c": "_style_modules_css-1a2b3c", + ":)": "_style_modules_css-:)", + ":\`(": "_style_modules_css-:\`(", + ":hover": "_style_modules_css-:hover", + ":hover:focus:active": "_style_modules_css-:hover:focus:active", + "<><<<>><>": "_style_modules_css-<><<<>><>", + "

": "_style_modules_css-

", + "?": "_style_modules_css-?", + "@": "_style_modules_css-@", + "B&W?": "_style_modules_css-B&W?", + "[attr=value]": "_style_modules_css-[attr=value]", + "_": "_style_modules_css-_", + "_test": "_style_modules_css-_test", + "class": "_style_modules_css-class", + "className": "_style_modules_css-className", + "f!o!o": "_style_modules_css-f!o!o", + "f'o'o": "_style_modules_css-f'o'o", + "f*o*o": "_style_modules_css-f*o*o", + "f+o+o": "_style_modules_css-f+o+o", + "f/o/o": "_style_modules_css-f/o/o", + "f@oo": "_style_modules_css-f@oo", + "f\\\\o\\\\o": "_style_modules_css-f\\\\o\\\\o", + "foo.bar": "_style_modules_css-foo.bar", + "foo/bar": "_style_modules_css-foo/bar", + "foo/bar/baz": "_style_modules_css-foo/bar/baz", + "foo\\\\bar": "_style_modules_css-foo\\\\bar", + "foo\\\\bar\\\\baz": "_style_modules_css-foo\\\\bar\\\\baz", + "f~o~o": "_style_modules_css-f~o~o", + "m_x_@": "_style_modules_css-m_x_@", + "main-bg-color": "--_style_modules_css-main-bg-color", + "main-bg-color-@2": "--_style_modules_css-main-bg-color-@2", + "someId": "_style_modules_css-someId", + "subClass": "_style_modules_css-subClass", + "test": "_style_modules_css-test", + "{}": "_style_modules_css-{}", + "©": "_style_modules_css-©", + "“‘’”": "_style_modules_css-“‘’”", + "⌘⌥": "_style_modules_css-⌘⌥", + "☺☃": "_style_modules_css-☺☃", + "♥": "_style_modules_css-♥", + "𝄞♪♩♫♬": "_style_modules_css-𝄞♪♩♫♬", + "💩": "_style_modules_css-💩", + "😍": "_style_modules_css-😍", +} +`; + +exports[`ConfigTestCases css escape-unescape exported tests should work with URLs in CSS: classes 2`] = ` +Object { + "#": "_style_modules_css-#", + "##": "_style_modules_css-##", + "#.#.#": "_style_modules_css-#.#.#", + "#fake-id": "_style_modules_css-#fake-id", + "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.": "_style_modules_css-++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.", + "-a-b-c-": "_style_modules_css--a-b-c-", + "-a0-34a___f": "_style_modules_css--a0-34a___f", + ".": "_style_modules_css-.", + "123": "_style_modules_css-123", + "1a2b3c": "_style_modules_css-1a2b3c", + ":)": "_style_modules_css-:)", + ":\`(": "_style_modules_css-:\`(", + ":hover": "_style_modules_css-:hover", + ":hover:focus:active": "_style_modules_css-:hover:focus:active", + "<><<<>><>": "_style_modules_css-<><<<>><>", + "

": "_style_modules_css-

", + "?": "_style_modules_css-?", + "@": "_style_modules_css-@", + "B&W?": "_style_modules_css-B&W?", + "[attr=value]": "_style_modules_css-[attr=value]", + "_": "_style_modules_css-_", + "_test": "_style_modules_css-_test", + "class": "_style_modules_css-class", + "className": "_style_modules_css-className", + "f!o!o": "_style_modules_css-f!o!o", + "f'o'o": "_style_modules_css-f'o'o", + "f*o*o": "_style_modules_css-f*o*o", + "f+o+o": "_style_modules_css-f+o+o", + "f/o/o": "_style_modules_css-f/o/o", + "f@oo": "_style_modules_css-f@oo", + "f\\\\o\\\\o": "_style_modules_css-f\\\\o\\\\o", + "foo.bar": "_style_modules_css-foo.bar", + "foo/bar": "_style_modules_css-foo/bar", + "foo/bar/baz": "_style_modules_css-foo/bar/baz", + "foo\\\\bar": "_style_modules_css-foo\\\\bar", + "foo\\\\bar\\\\baz": "_style_modules_css-foo\\\\bar\\\\baz", + "f~o~o": "_style_modules_css-f~o~o", + "m_x_@": "_style_modules_css-m_x_@", + "main-bg-color": "--_style_modules_css-main-bg-color", + "main-bg-color-@2": "--_style_modules_css-main-bg-color-@2", + "someId": "_style_modules_css-someId", + "subClass": "_style_modules_css-subClass", + "test": "_style_modules_css-test", + "{}": "_style_modules_css-{}", + "©": "_style_modules_css-©", + "“‘’”": "_style_modules_css-“‘’”", + "⌘⌥": "_style_modules_css-⌘⌥", + "☺☃": "_style_modules_css-☺☃", + "♥": "_style_modules_css-♥", + "𝄞♪♩♫♬": "_style_modules_css-𝄞♪♩♫♬", + "💩": "_style_modules_css-💩", + "😍": "_style_modules_css-😍", +} +`; + +exports[`ConfigTestCases css escape-unescape exported tests should work with URLs in CSS: css 1`] = ` +Array [ + "/*!*******************************!*\\\\ + !*** css ./style.modules.css ***! + \\\\*******************************/ +._style_modules_css-class { + color: red; +} + +._style_modules_css-class { + background: blue; +} + +._style_modules_css-test { + background: red; +} + +._style_modules_css-_test { + background: blue; +} + +._style_modules_css-className { + background: red; +} + +#_style_modules_css-someId { + background: green; +} + +._style_modules_css-className ._style_modules_css-subClass { + color: green; +} + +#_style_modules_css-someId ._style_modules_css-subClass { + color: blue; +} + +._style_modules_css--a0-34a___f { + color: red; +} + +._style_modules_css-m_x_\\\\@ { + margin-left: auto !important; + margin-right: auto !important; +} + +._style_modules_css-B\\\\&W\\\\? { + margin-left: auto !important; + margin-right: auto !important; +} + +/* matches elements with class=\\":\`(\\" */ +._style_modules_css-\\\\:\\\\\`\\\\( { + color: aqua; +} + +/* matches elements with class=\\"1a2b3c\\" */ +._style_modules_css-1a2b3c { + color: aliceblue; +} + +/* matches the element with id=\\"#fake-id\\" */ +#_style_modules_css-\\\\#fake-id { + color: antiquewhite; +} + +/* matches the element with id=\\"-a-b-c-\\" */ +#_style_modules_css--a-b-c- { + color: azure; +} + +/* matches the element with id=\\"©\\" */ +#_style_modules_css-© { + color: black; +} + +._style_modules_css-♥ { background: lime; } +._style_modules_css-© { background: lime; } +._style_modules_css-😍 { background: lime; } +._style_modules_css-“‘’” { background: lime; } +._style_modules_css-☺☃ { background: lime; } +._style_modules_css-⌘⌥ { background: lime; } +._style_modules_css-𝄞♪♩♫♬ { background: lime; } +._style_modules_css-💩 { background: lime; } +._style_modules_css-\\\\? { background: lime; } +._style_modules_css-\\\\@ { background: lime; } +._style_modules_css-\\\\. { background: lime; } +._style_modules_css-\\\\:\\\\) { background: lime; } +._style_modules_css-\\\\:\\\\\`\\\\( { background: lime; } +._style_modules_css-123 { background: lime; } +._style_modules_css-1a2b3c { background: lime; } +._style_modules_css-\\\\ { background: lime; } +._style_modules_css-\\\\<\\\\>\\\\<\\\\<\\\\<\\\\>\\\\>\\\\<\\\\> { background: lime; } +._style_modules_css-\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\[\\\\>\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\>\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\>\\\\+\\\\+\\\\+\\\\>\\\\+\\\\<\\\\<\\\\<\\\\<-\\\\]\\\\>\\\\+\\\\+\\\\.\\\\>\\\\+\\\\.\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\.\\\\.\\\\+\\\\+\\\\+\\\\.\\\\>\\\\+\\\\+\\\\.\\\\<\\\\<\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\.\\\\>\\\\.\\\\+\\\\+\\\\+\\\\.------\\\\.--------\\\\.\\\\>\\\\+\\\\.\\\\>\\\\. { background: lime; } +._style_modules_css-\\\\# { background: lime; } +._style_modules_css-\\\\#\\\\# { background: lime; } +._style_modules_css-\\\\#\\\\.\\\\#\\\\.\\\\# { background: lime; } +._style_modules_css-_ { background: lime; } +._style_modules_css-\\\\{\\\\} { background: lime; } +._style_modules_css-\\\\#fake-id { background: lime; } +._style_modules_css-foo\\\\.bar { background: lime; } +._style_modules_css-\\\\:hover { background: lime; } +._style_modules_css-\\\\:hover\\\\:focus\\\\:active { background: lime; } +._style_modules_css-\\\\[attr\\\\=value\\\\] { background: lime; } +._style_modules_css-f\\\\/o\\\\/o { background: lime; } +._style_modules_css-f\\\\\\\\o\\\\\\\\o { background: lime; } +._style_modules_css-f\\\\*o\\\\*o { background: lime; } +._style_modules_css-f\\\\!o\\\\!o { background: lime; } +._style_modules_css-f\\\\'o\\\\'o { background: lime; } +._style_modules_css-f\\\\~o\\\\~o { background: lime; } +._style_modules_css-f\\\\+o\\\\+o { background: lime; } + +._style_modules_css-foo\\\\/bar { + background: hotpink; +} + +._style_modules_css-foo\\\\\\\\bar { + background: hotpink; +} + +._style_modules_css-foo\\\\/bar\\\\/baz { + background: hotpink; +} + +._style_modules_css-foo\\\\\\\\bar\\\\\\\\baz { + background: hotpink; +} + +:root { + --_style_modules_css-main-bg-color: red; + --_style_modules_css-main-bg-color-\\\\@2: blue; +} + +details { + background-color: var(--_style_modules_css-main-bg-color); + background-color: var(--_style_modules_css-main-bg-color-\\\\@2); +} + +@keyframes _style_modules_css-f\\\\@oo { from { color: red; } to { color: blue; } } + +", +] +`; + +exports[`ConfigTestCases css escape-unescape exported tests should work with URLs in CSS: css 2`] = ` +Array [ + "/*!*******************************!*\\\\ + !*** css ./style.modules.css ***! + \\\\*******************************/ +._style_modules_css-class { + color: red; +} + +._style_modules_css-class { + background: blue; +} + +._style_modules_css-test { + background: red; +} + +._style_modules_css-_test { + background: blue; +} + +._style_modules_css-className { + background: red; +} + +#_style_modules_css-someId { + background: green; +} + +._style_modules_css-className ._style_modules_css-subClass { + color: green; +} + +#_style_modules_css-someId ._style_modules_css-subClass { + color: blue; +} + +._style_modules_css--a0-34a___f { + color: red; +} + +._style_modules_css-m_x_\\\\@ { + margin-left: auto !important; + margin-right: auto !important; +} + +._style_modules_css-B\\\\&W\\\\? { + margin-left: auto !important; + margin-right: auto !important; +} + +/* matches elements with class=\\":\`(\\" */ +._style_modules_css-\\\\:\\\\\`\\\\( { + color: aqua; +} + +/* matches elements with class=\\"1a2b3c\\" */ +._style_modules_css-1a2b3c { + color: aliceblue; +} + +/* matches the element with id=\\"#fake-id\\" */ +#_style_modules_css-\\\\#fake-id { + color: antiquewhite; +} + +/* matches the element with id=\\"-a-b-c-\\" */ +#_style_modules_css--a-b-c- { + color: azure; +} + +/* matches the element with id=\\"©\\" */ +#_style_modules_css-© { + color: black; +} + +._style_modules_css-♥ { background: lime; } +._style_modules_css-© { background: lime; } +._style_modules_css-😍 { background: lime; } +._style_modules_css-“‘’” { background: lime; } +._style_modules_css-☺☃ { background: lime; } +._style_modules_css-⌘⌥ { background: lime; } +._style_modules_css-𝄞♪♩♫♬ { background: lime; } +._style_modules_css-💩 { background: lime; } +._style_modules_css-\\\\? { background: lime; } +._style_modules_css-\\\\@ { background: lime; } +._style_modules_css-\\\\. { background: lime; } +._style_modules_css-\\\\:\\\\) { background: lime; } +._style_modules_css-\\\\:\\\\\`\\\\( { background: lime; } +._style_modules_css-123 { background: lime; } +._style_modules_css-1a2b3c { background: lime; } +._style_modules_css-\\\\ { background: lime; } +._style_modules_css-\\\\<\\\\>\\\\<\\\\<\\\\<\\\\>\\\\>\\\\<\\\\> { background: lime; } +._style_modules_css-\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\[\\\\>\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\>\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\>\\\\+\\\\+\\\\+\\\\>\\\\+\\\\<\\\\<\\\\<\\\\<-\\\\]\\\\>\\\\+\\\\+\\\\.\\\\>\\\\+\\\\.\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\.\\\\.\\\\+\\\\+\\\\+\\\\.\\\\>\\\\+\\\\+\\\\.\\\\<\\\\<\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\.\\\\>\\\\.\\\\+\\\\+\\\\+\\\\.------\\\\.--------\\\\.\\\\>\\\\+\\\\.\\\\>\\\\. { background: lime; } +._style_modules_css-\\\\# { background: lime; } +._style_modules_css-\\\\#\\\\# { background: lime; } +._style_modules_css-\\\\#\\\\.\\\\#\\\\.\\\\# { background: lime; } +._style_modules_css-_ { background: lime; } +._style_modules_css-\\\\{\\\\} { background: lime; } +._style_modules_css-\\\\#fake-id { background: lime; } +._style_modules_css-foo\\\\.bar { background: lime; } +._style_modules_css-\\\\:hover { background: lime; } +._style_modules_css-\\\\:hover\\\\:focus\\\\:active { background: lime; } +._style_modules_css-\\\\[attr\\\\=value\\\\] { background: lime; } +._style_modules_css-f\\\\/o\\\\/o { background: lime; } +._style_modules_css-f\\\\\\\\o\\\\\\\\o { background: lime; } +._style_modules_css-f\\\\*o\\\\*o { background: lime; } +._style_modules_css-f\\\\!o\\\\!o { background: lime; } +._style_modules_css-f\\\\'o\\\\'o { background: lime; } +._style_modules_css-f\\\\~o\\\\~o { background: lime; } +._style_modules_css-f\\\\+o\\\\+o { background: lime; } + +._style_modules_css-foo\\\\/bar { + background: hotpink; +} + +._style_modules_css-foo\\\\\\\\bar { + background: hotpink; +} + +._style_modules_css-foo\\\\/bar\\\\/baz { + background: hotpink; +} + +._style_modules_css-foo\\\\\\\\bar\\\\\\\\baz { + background: hotpink; +} + +:root { + --_style_modules_css-main-bg-color: red; + --_style_modules_css-main-bg-color-\\\\@2: blue; +} + +details { + background-color: var(--_style_modules_css-main-bg-color); + background-color: var(--_style_modules_css-main-bg-color-\\\\@2); +} + +@keyframes _style_modules_css-f\\\\@oo { from { color: red; } to { color: blue; } } + +", +] +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: as-is 1`] = ` +Object { + "btn--info_is-disabled_1": "_style_module_css_as-is-btn--info_is-disabled_1", + "btn-info_is-disabled": "_style_module_css_as-is-btn-info_is-disabled", + "class": "_style_module_css_as-is-class", + "default": "_style_module_css_as-is-default", + "foo": "bar", + "foo_bar": "_style_module_css_as-is-foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "_style_module_css_as-is-simple", +} +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: as-is 2`] = ` +Object { + "btn--info_is-disabled_1": "_856-btn--info_is-disabled_1", + "btn-info_is-disabled": "_856-btn-info_is-disabled", + "class": "_856-class", + "default": "_856-default", + "foo": "bar", + "foo_bar": "_856-foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "_856-simple", +} +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: as-is 3`] = ` +Object { + "btn--info_is-disabled_1": "_style_module_css_as-is-btn--info_is-disabled_1", + "btn-info_is-disabled": "_style_module_css_as-is-btn-info_is-disabled", + "class": "_style_module_css_as-is-class", + "default": "_style_module_css_as-is-default", + "foo": "bar", + "foo_bar": "_style_module_css_as-is-foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "_style_module_css_as-is-simple", +} +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: as-is 4`] = ` +Object { + "btn--info_is-disabled_1": "_856-btn--info_is-disabled_1", + "btn-info_is-disabled": "_856-btn-info_is-disabled", + "class": "_856-class", + "default": "_856-default", + "foo": "bar", + "foo_bar": "_856-foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "_856-simple", +} +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: camel-case 1`] = ` +Object { + "btn--info_is-disabled_1": "_style_module_css_camel-case-btn--info_is-disabled_1", + "btn-info_is-disabled": "_style_module_css_camel-case-btn-info_is-disabled", + "btnInfoIsDisabled": "_style_module_css_camel-case-btn-info_is-disabled", + "btnInfoIsDisabled1": "_style_module_css_camel-case-btn--info_is-disabled_1", + "class": "_style_module_css_camel-case-class", + "default": "_style_module_css_camel-case-default", + "foo": "bar", + "fooBar": "_style_module_css_camel-case-foo_bar", + "foo_bar": "_style_module_css_camel-case-foo_bar", + "my-btn-info_is-disabled": "value", + "myBtnInfoIsDisabled": "value", + "simple": "_style_module_css_camel-case-simple", +} +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: camel-case 2`] = ` +Object { + "btn--info_is-disabled_1": "_612-btn--info_is-disabled_1", + "btn-info_is-disabled": "_612-btn-info_is-disabled", + "btnInfoIsDisabled": "_612-btn-info_is-disabled", + "btnInfoIsDisabled1": "_612-btn--info_is-disabled_1", + "class": "_612-class", + "default": "_612-default", + "foo": "bar", + "fooBar": "_612-foo_bar", + "foo_bar": "_612-foo_bar", + "my-btn-info_is-disabled": "value", + "myBtnInfoIsDisabled": "value", + "simple": "_612-simple", +} +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: camel-case 3`] = ` +Object { + "btn--info_is-disabled_1": "_style_module_css_camel-case-btn--info_is-disabled_1", + "btn-info_is-disabled": "_style_module_css_camel-case-btn-info_is-disabled", + "btnInfoIsDisabled": "_style_module_css_camel-case-btn-info_is-disabled", + "btnInfoIsDisabled1": "_style_module_css_camel-case-btn--info_is-disabled_1", + "class": "_style_module_css_camel-case-class", + "default": "_style_module_css_camel-case-default", + "foo": "bar", + "fooBar": "_style_module_css_camel-case-foo_bar", + "foo_bar": "_style_module_css_camel-case-foo_bar", + "my-btn-info_is-disabled": "value", + "myBtnInfoIsDisabled": "value", + "simple": "_style_module_css_camel-case-simple", +} +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: camel-case 4`] = ` +Object { + "btn--info_is-disabled_1": "_612-btn--info_is-disabled_1", + "btn-info_is-disabled": "_612-btn-info_is-disabled", + "btnInfoIsDisabled": "_612-btn-info_is-disabled", + "btnInfoIsDisabled1": "_612-btn--info_is-disabled_1", + "class": "_612-class", + "default": "_612-default", + "foo": "bar", + "fooBar": "_612-foo_bar", + "foo_bar": "_612-foo_bar", + "my-btn-info_is-disabled": "value", + "myBtnInfoIsDisabled": "value", + "simple": "_612-simple", +} +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: camel-case-only 1`] = ` +Object { + "btnInfoIsDisabled": "_style_module_css_camel-case-only-btnInfoIsDisabled", + "btnInfoIsDisabled1": "_style_module_css_camel-case-only-btnInfoIsDisabled1", + "class": "_style_module_css_camel-case-only-class", + "default": "_style_module_css_camel-case-only-default", + "foo": "bar", + "fooBar": "_style_module_css_camel-case-only-fooBar", + "myBtnInfoIsDisabled": "value", + "simple": "_style_module_css_camel-case-only-simple", +} +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: camel-case-only 2`] = ` +Object { + "btnInfoIsDisabled": "_999-btnInfoIsDisabled", + "btnInfoIsDisabled1": "_999-btnInfoIsDisabled1", + "class": "_999-class", + "default": "_999-default", + "foo": "bar", + "fooBar": "_999-fooBar", + "myBtnInfoIsDisabled": "value", + "simple": "_999-simple", +} +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: camel-case-only 3`] = ` +Object { + "btnInfoIsDisabled": "_style_module_css_camel-case-only-btnInfoIsDisabled", + "btnInfoIsDisabled1": "_style_module_css_camel-case-only-btnInfoIsDisabled1", + "class": "_style_module_css_camel-case-only-class", + "default": "_style_module_css_camel-case-only-default", + "foo": "bar", + "fooBar": "_style_module_css_camel-case-only-fooBar", + "myBtnInfoIsDisabled": "value", + "simple": "_style_module_css_camel-case-only-simple", +} +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: camel-case-only 4`] = ` +Object { + "btnInfoIsDisabled": "_999-btnInfoIsDisabled", + "btnInfoIsDisabled1": "_999-btnInfoIsDisabled1", + "class": "_999-class", + "default": "_999-default", + "foo": "bar", + "fooBar": "_999-fooBar", + "myBtnInfoIsDisabled": "value", + "simple": "_999-simple", +} +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: dashes 1`] = ` +Object { + "btn--info_is-disabled_1": "_style_module_css_dashes-btn--info_is-disabled_1", + "btn-info_is-disabled": "_style_module_css_dashes-btn-info_is-disabled", + "btnInfo_isDisabled": "_style_module_css_dashes-btn-info_is-disabled", + "btnInfo_isDisabled_1": "_style_module_css_dashes-btn--info_is-disabled_1", + "class": "_style_module_css_dashes-class", + "default": "_style_module_css_dashes-default", + "foo": "bar", + "foo_bar": "_style_module_css_dashes-foo_bar", + "my-btn-info_is-disabled": "value", + "myBtnInfo_isDisabled": "value", + "simple": "_style_module_css_dashes-simple", +} +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: dashes 2`] = ` +Object { + "btn--info_is-disabled_1": "_883-btn--info_is-disabled_1", + "btn-info_is-disabled": "_883-btn-info_is-disabled", + "btnInfo_isDisabled": "_883-btn-info_is-disabled", + "btnInfo_isDisabled_1": "_883-btn--info_is-disabled_1", + "class": "_883-class", + "default": "_883-default", + "foo": "bar", + "foo_bar": "_883-foo_bar", + "my-btn-info_is-disabled": "value", + "myBtnInfo_isDisabled": "value", + "simple": "_883-simple", +} +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: dashes 3`] = ` +Object { + "btn--info_is-disabled_1": "_style_module_css_dashes-btn--info_is-disabled_1", + "btn-info_is-disabled": "_style_module_css_dashes-btn-info_is-disabled", + "btnInfo_isDisabled": "_style_module_css_dashes-btn-info_is-disabled", + "btnInfo_isDisabled_1": "_style_module_css_dashes-btn--info_is-disabled_1", + "class": "_style_module_css_dashes-class", + "default": "_style_module_css_dashes-default", + "foo": "bar", + "foo_bar": "_style_module_css_dashes-foo_bar", + "my-btn-info_is-disabled": "value", + "myBtnInfo_isDisabled": "value", + "simple": "_style_module_css_dashes-simple", +} +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: dashes 4`] = ` +Object { + "btn--info_is-disabled_1": "_883-btn--info_is-disabled_1", + "btn-info_is-disabled": "_883-btn-info_is-disabled", + "btnInfo_isDisabled": "_883-btn-info_is-disabled", + "btnInfo_isDisabled_1": "_883-btn--info_is-disabled_1", + "class": "_883-class", + "default": "_883-default", + "foo": "bar", + "foo_bar": "_883-foo_bar", + "my-btn-info_is-disabled": "value", + "myBtnInfo_isDisabled": "value", + "simple": "_883-simple", +} +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: dashes-only 1`] = ` +Object { + "btnInfo_isDisabled": "_style_module_css_dashes-only-btnInfo_isDisabled", + "btnInfo_isDisabled_1": "_style_module_css_dashes-only-btnInfo_isDisabled_1", + "class": "_style_module_css_dashes-only-class", + "default": "_style_module_css_dashes-only-default", + "foo": "bar", + "foo_bar": "_style_module_css_dashes-only-foo_bar", + "myBtnInfo_isDisabled": "value", + "simple": "_style_module_css_dashes-only-simple", +} +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: dashes-only 2`] = ` +Object { + "btnInfo_isDisabled": "_882-btnInfo_isDisabled", + "btnInfo_isDisabled_1": "_882-btnInfo_isDisabled_1", + "class": "_882-class", + "default": "_882-default", + "foo": "bar", + "foo_bar": "_882-foo_bar", + "myBtnInfo_isDisabled": "value", + "simple": "_882-simple", +} +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: dashes-only 3`] = ` +Object { + "btnInfo_isDisabled": "_style_module_css_dashes-only-btnInfo_isDisabled", + "btnInfo_isDisabled_1": "_style_module_css_dashes-only-btnInfo_isDisabled_1", + "class": "_style_module_css_dashes-only-class", + "default": "_style_module_css_dashes-only-default", + "foo": "bar", + "foo_bar": "_style_module_css_dashes-only-foo_bar", + "myBtnInfo_isDisabled": "value", + "simple": "_style_module_css_dashes-only-simple", +} +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: dashes-only 4`] = ` +Object { + "btnInfo_isDisabled": "_882-btnInfo_isDisabled", + "btnInfo_isDisabled_1": "_882-btnInfo_isDisabled_1", + "class": "_882-class", + "default": "_882-default", + "foo": "bar", + "foo_bar": "_882-foo_bar", + "myBtnInfo_isDisabled": "value", + "simple": "_882-simple", +} +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: upper 1`] = ` +Object { + "BTN--INFO_IS-DISABLED_1": "_style_module_css_upper-BTN--INFO_IS-DISABLED_1", + "BTN-INFO_IS-DISABLED": "_style_module_css_upper-BTN-INFO_IS-DISABLED", + "CLASS": "_style_module_css_upper-CLASS", + "DEFAULT": "_style_module_css_upper-DEFAULT", + "FOO": "bar", + "FOO_BAR": "_style_module_css_upper-FOO_BAR", + "MY-BTN-INFO_IS-DISABLED": "value", + "SIMPLE": "_style_module_css_upper-SIMPLE", +} +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: upper 2`] = ` +Object { + "BTN--INFO_IS-DISABLED_1": "_133-BTN--INFO_IS-DISABLED_1", + "BTN-INFO_IS-DISABLED": "_133-BTN-INFO_IS-DISABLED", + "CLASS": "_133-CLASS", + "DEFAULT": "_133-DEFAULT", + "FOO": "bar", + "FOO_BAR": "_133-FOO_BAR", + "MY-BTN-INFO_IS-DISABLED": "value", + "SIMPLE": "_133-SIMPLE", +} +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: upper 3`] = ` +Object { + "BTN--INFO_IS-DISABLED_1": "_style_module_css_upper-BTN--INFO_IS-DISABLED_1", + "BTN-INFO_IS-DISABLED": "_style_module_css_upper-BTN-INFO_IS-DISABLED", + "CLASS": "_style_module_css_upper-CLASS", + "DEFAULT": "_style_module_css_upper-DEFAULT", + "FOO": "bar", + "FOO_BAR": "_style_module_css_upper-FOO_BAR", + "MY-BTN-INFO_IS-DISABLED": "value", + "SIMPLE": "_style_module_css_upper-SIMPLE", +} +`; + +exports[`ConfigTestCases css exports-convention exported tests should have correct convention for css exports name: upper 4`] = ` +Object { + "BTN--INFO_IS-DISABLED_1": "_133-BTN--INFO_IS-DISABLED_1", + "BTN-INFO_IS-DISABLED": "_133-BTN-INFO_IS-DISABLED", + "CLASS": "_133-CLASS", + "DEFAULT": "_133-DEFAULT", + "FOO": "bar", + "FOO_BAR": "_133-FOO_BAR", + "MY-BTN-INFO_IS-DISABLED": "value", + "SIMPLE": "_133-SIMPLE", +} +`; + +exports[`ConfigTestCases css import exported tests should compile 1`] = ` +Array [ + "/*!******************************************************************************************!*\\\\ + !*** external \\"https://test.cases/path/../../../../configCases/css/import/external.css\\" ***! + \\\\******************************************************************************************/ +body { + externally-imported: true; +} + +/*!******************************************!*\\\\ + !*** external \\"//example.com/style.css\\" ***! + \\\\******************************************/ +@import url(\\"//example.com/style.css\\"); +/*!*****************************************************************!*\\\\ + !*** external \\"https://fonts.googleapis.com/css?family=Roboto\\" ***! + \\\\*****************************************************************/ +@import url(\\"https://fonts.googleapis.com/css?family=Roboto\\"); +/*!***********************************************************************!*\\\\ + !*** external \\"https://fonts.googleapis.com/css?family=Noto+Sans+TC\\" ***! + \\\\***********************************************************************/ +@import url(\\"https://fonts.googleapis.com/css?family=Noto+Sans+TC\\"); +/*!******************************************************************************!*\\\\ + !*** external \\"https://fonts.googleapis.com/css?family=Noto+Sans+TC|Roboto\\" ***! + \\\\******************************************************************************/ +@import url(\\"https://fonts.googleapis.com/css?family=Noto+Sans+TC|Roboto\\"); +/*!************************************************************************************!*\\\\ + !*** external \\"https://fonts.googleapis.com/css?family=Noto+Sans+TC|Roboto?foo=1\\" ***! + \\\\************************************************************************************/ +@import url(\\"https://fonts.googleapis.com/css?family=Noto+Sans+TC|Roboto?foo=1\\") layer(super.foo) supports(display: flex) screen and (min-width: 400px); +/*!*******************************************************************************************!*\\\\ + !*** external \\"https://test.cases/path/../../../../configCases/css/import/external1.css\\" ***! + \\\\*******************************************************************************************/ +body { + externally-imported1: true; +} + +/*!*******************************************************************************************!*\\\\ + !*** external \\"https://test.cases/path/../../../../configCases/css/import/external2.css\\" ***! + \\\\*******************************************************************************************/ +body { + externally-imported2: true; +} + +/*!*********************************!*\\\\ + !*** external \\"external-1.css\\" ***! + \\\\*********************************/ +@import url(\\"external-1.css\\"); +/*!*********************************!*\\\\ + !*** external \\"external-2.css\\" ***! + \\\\*********************************/ +@import url(\\"external-2.css\\") supports(display: grid) screen and (max-width: 400px); +/*!*********************************!*\\\\ + !*** external \\"external-3.css\\" ***! + \\\\*********************************/ +@import url(\\"external-3.css\\") supports(not (display: grid) and (display: flex)) screen and (max-width: 400px); +/*!*********************************!*\\\\ + !*** external \\"external-4.css\\" ***! + \\\\*********************************/ +@import url(\\"external-4.css\\") supports((selector(h2 > p)) and + (font-tech(color-COLRv1))); +/*!*********************************!*\\\\ + !*** external \\"external-5.css\\" ***! + \\\\*********************************/ +@import url(\\"external-5.css\\") layer(default); +/*!*********************************!*\\\\ + !*** external \\"external-6.css\\" ***! + \\\\*********************************/ +@import url(\\"external-6.css\\") layer(default); +/*!*********************************!*\\\\ + !*** external \\"external-7.css\\" ***! + \\\\*********************************/ +@import url(\\"external-7.css\\") layer(); +/*!*********************************!*\\\\ + !*** external \\"external-8.css\\" ***! + \\\\*********************************/ +@import url(\\"external-8.css\\") layer(); +/*!*********************************!*\\\\ + !*** external \\"external-9.css\\" ***! + \\\\*********************************/ +@import url(\\"external-9.css\\") print; +/*!**********************************!*\\\\ + !*** external \\"external-10.css\\" ***! + \\\\**********************************/ +@import url(\\"external-10.css\\") print, screen; +/*!**********************************!*\\\\ + !*** external \\"external-11.css\\" ***! + \\\\**********************************/ +@import url(\\"external-11.css\\") screen; +/*!**********************************!*\\\\ + !*** external \\"external-12.css\\" ***! + \\\\**********************************/ +@import url(\\"external-12.css\\") screen and (orientation: landscape); +/*!**********************************!*\\\\ + !*** external \\"external-13.css\\" ***! + \\\\**********************************/ +@import url(\\"external-13.css\\") supports(not (display: flex)); +/*!**********************************!*\\\\ + !*** external \\"external-14.css\\" ***! + \\\\**********************************/ +@import url(\\"external-14.css\\") layer(default) supports(display: grid) screen and (max-width: 400px); +/*!***************************************************!*\\\\ + !*** css ./node_modules/style-library/styles.css ***! + \\\\***************************************************/ +p { + color: steelblue; +} + +/*!************************************************!*\\\\ + !*** css ./node_modules/main-field/styles.css ***! + \\\\************************************************/ +p { + color: antiquewhite; +} + +/*!*********************************************************!*\\\\ + !*** css ./node_modules/package-with-exports/style.css ***! + \\\\*********************************************************/ +.load-me { + color: red; +} + +/*!***************************************!*\\\\ + !*** css ./extensions-imported.mycss ***! + \\\\***************************************/ +.custom-extension{ + color: green; +}.using-loader { color: red; } +/*!***********************!*\\\\ + !*** css ./file.less ***! + \\\\***********************/ +.link { + color: #428bca; +} + +/*!**********************************!*\\\\ + !*** css ./with-less-import.css ***! + \\\\**********************************/ + +.foo { + color: red; +} + +/*!*********************************!*\\\\ + !*** css ./prefer-relative.css ***! + \\\\*********************************/ +.relative { + color: red; +} + +/*!************************************************************!*\\\\ + !*** css ./node_modules/condition-names-style/default.css ***! + \\\\************************************************************/ +.default { + color: steelblue; +} + +/*!**************************************************************!*\\\\ + !*** css ./node_modules/condition-names-style-mode/mode.css ***! + \\\\**************************************************************/ +.mode { + color: red; +} + +/*!******************************************************************!*\\\\ + !*** css ./node_modules/condition-names-subpath/dist/custom.css ***! + \\\\******************************************************************/ +.dist { + color: steelblue; +} + +/*!************************************************************************!*\\\\ + !*** css ./node_modules/condition-names-subpath-extra/dist/custom.css ***! + \\\\************************************************************************/ +.dist { + color: steelblue; +} + +/*!******************************************************************!*\\\\ + !*** css ./node_modules/condition-names-style-less/default.less ***! + \\\\******************************************************************/ +.conditional-names { + color: #428bca; +} + +/*!**********************************************************************!*\\\\ + !*** css ./node_modules/condition-names-custom-name/custom-name.css ***! + \\\\**********************************************************************/ +.custom-name { + color: steelblue; +} + +/*!************************************************************!*\\\\ + !*** css ./node_modules/style-and-main-library/styles.css ***! + \\\\************************************************************/ +.style { + color: steelblue; +} + +/*!**************************************************************!*\\\\ + !*** css ./node_modules/condition-names-webpack/webpack.css ***! + \\\\**************************************************************/ +.webpack { + color: steelblue; +} + +/*!*******************************************************************!*\\\\ + !*** css ./node_modules/condition-names-style-nested/default.css ***! + \\\\*******************************************************************/ +.default { + color: steelblue; +} + +/*!******************************!*\\\\ + !*** css ./style-import.css ***! + \\\\******************************/ + +/* Technically, this is not entirely true, but we allow it because the final file can be processed by the loader and return the CSS code */ + + +/* Failed */ + + +/*!*****************************!*\\\\ + !*** css ./print.css?foo=1 ***! + \\\\*****************************/ +body { + background: black; +} + +/*!*****************************!*\\\\ + !*** css ./print.css?foo=2 ***! + \\\\*****************************/ +body { + background: black; +} + +/*!**********************************************!*\\\\ + !*** css ./print.css?foo=3 (layer: default) ***! + \\\\**********************************************/ +@layer default { + body { + background: black; + } +} + +/*!**********************************************!*\\\\ + !*** css ./print.css?foo=4 (layer: default) ***! + \\\\**********************************************/ +@layer default { + body { + background: black; + } +} + +/*!*******************************************************!*\\\\ + !*** css ./print.css?foo=5 (supports: display: flex) ***! + \\\\*******************************************************/ +@supports (display: flex) { + body { + background: black; + } +} + +/*!*******************************************************!*\\\\ + !*** css ./print.css?foo=6 (supports: display: flex) ***! + \\\\*******************************************************/ +@supports (display: flex) { + body { + background: black; + } +} + +/*!********************************************************************!*\\\\ + !*** css ./print.css?foo=7 (media: screen and (min-width: 400px)) ***! + \\\\********************************************************************/ +@media screen and (min-width: 400px) { + body { + background: black; + } +} + +/*!********************************************************************!*\\\\ + !*** css ./print.css?foo=8 (media: screen and (min-width: 400px)) ***! + \\\\********************************************************************/ +@media screen and (min-width: 400px) { + body { + background: black; + } +} + +/*!************************************************************************!*\\\\ + !*** css ./print.css?foo=9 (layer: default) (supports: display: flex) ***! + \\\\************************************************************************/ +@layer default { + @supports (display: flex) { + body { + background: black; + } + } +} + +/*!**************************************************************************************!*\\\\ + !*** css ./print.css?foo=10 (layer: default) (media: screen and (min-width: 400px)) ***! + \\\\**************************************************************************************/ +@layer default { + @media screen and (min-width: 400px) { + body { + background: black; + } + } +} + +/*!***********************************************************************************************!*\\\\ + !*** css ./print.css?foo=11 (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\***********************************************************************************************/ +@supports (display: flex) { + @media screen and (min-width: 400px) { + body { + background: black; + } + } +} + +/*!****************************************************************************************************************!*\\\\ + !*** css ./print.css?foo=12 (layer: default) (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\****************************************************************************************************************/ +@layer default { + @supports (display: flex) { + @media screen and (min-width: 400px) { + body { + background: black; + } + } + } +} + +/*!****************************************************************************************************************!*\\\\ + !*** css ./print.css?foo=13 (layer: default) (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\****************************************************************************************************************/ +@layer default { + @supports (display: flex) { + @media screen and (min-width: 400px) { + body { + background: black; + } + } + } +} + +/*!****************************************************************************************************************!*\\\\ + !*** css ./print.css?foo=14 (layer: default) (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\****************************************************************************************************************/ +@layer default { + @supports (display: flex) { + @media screen and (min-width: 400px) { + body { + background: black; + } + } + } +} + +/*!****************************************************************************************************************!*\\\\ + !*** css ./print.css?foo=15 (layer: default) (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\****************************************************************************************************************/ +@layer default { + @supports (display: flex) { + @media screen and (min-width: 400px) { + body { + background: black; + } + } + } +} + +/*!*****************************************************************************************************************************!*\\\\ + !*** css ./print.css?foo=16 (layer: default) (supports: background: url(./img.png)) (media: screen and (min-width: 400px)) ***! + \\\\*****************************************************************************************************************************/ +@layer default { + @supports (background: url(./img.png)) { + @media screen and (min-width: 400px) { + body { + background: black; + } + } + } +} + +/*!*******************************************************************************************************************************!*\\\\ + !*** css ./print.css?foo=17 (layer: default) (supports: background: url(\\"./img.png\\")) (media: screen and (min-width: 400px)) ***! + \\\\*******************************************************************************************************************************/ +@layer default { + @supports (background: url(\\"./img.png\\")) { + @media screen and (min-width: 400px) { + body { + background: black; + } + } + } +} + +/*!**********************************************!*\\\\ + !*** css ./print.css?foo=18 (media: screen) ***! + \\\\**********************************************/ +@media screen { + body { + background: black; + } +} + +/*!**********************************************!*\\\\ + !*** css ./print.css?foo=19 (media: screen) ***! + \\\\**********************************************/ +@media screen { + body { + background: black; + } +} + +/*!**********************************************!*\\\\ + !*** css ./print.css?foo=20 (media: screen) ***! + \\\\**********************************************/ +@media screen { + body { + background: black; + } +} + +/*!******************************!*\\\\ + !*** css ./print.css?foo=21 ***! + \\\\******************************/ +body { + background: black; +} + +/*!**************************!*\\\\ + !*** css ./imported.css ***! + \\\\**************************/ +body { + background: green; +} + +/*!****************************************!*\\\\ + !*** css ./imported.css (layer: base) ***! + \\\\****************************************/ +@layer base { + body { + background: green; + } +} + +/*!****************************************************!*\\\\ + !*** css ./imported.css (supports: display: flex) ***! + \\\\****************************************************/ +@supports (display: flex) { + body { + background: green; + } +} + +/*!*************************************************!*\\\\ + !*** css ./imported.css (media: screen, print) ***! + \\\\*************************************************/ +@media screen, print { + body { + background: green; + } +} + +/*!******************************!*\\\\ + !*** css ./style2.css?foo=1 ***! + \\\\******************************/ +a { + color: red; +} + +/*!******************************!*\\\\ + !*** css ./style2.css?foo=2 ***! + \\\\******************************/ +a { + color: red; +} + +/*!******************************!*\\\\ + !*** css ./style2.css?foo=3 ***! + \\\\******************************/ +a { + color: red; +} + +/*!******************************!*\\\\ + !*** css ./style2.css?foo=4 ***! + \\\\******************************/ +a { + color: red; +} + +/*!******************************!*\\\\ + !*** css ./style2.css?foo=5 ***! + \\\\******************************/ +a { + color: red; +} + +/*!******************************!*\\\\ + !*** css ./style2.css?foo=6 ***! + \\\\******************************/ +a { + color: red; +} + +/*!******************************!*\\\\ + !*** css ./style2.css?foo=7 ***! + \\\\******************************/ +a { + color: red; +} + +/*!******************************!*\\\\ + !*** css ./style2.css?foo=8 ***! + \\\\******************************/ +a { + color: red; +} + +/*!******************************!*\\\\ + !*** css ./style2.css?foo=9 ***! + \\\\******************************/ +a { + color: red; +} + +/*!********************************************************************!*\\\\ + !*** css ./style2.css (media: screen and (orientation:landscape)) ***! + \\\\********************************************************************/ +@media screen and (orientation:landscape) { + a { + color: red; + } +} + +/*!*********************************************************************!*\\\\ + !*** css ./style2.css (media: SCREEN AND (ORIENTATION: LANDSCAPE)) ***! + \\\\*********************************************************************/ +@media SCREEN AND (ORIENTATION: LANDSCAPE) { + a { + color: red; + } +} + +/*!****************************************************!*\\\\ + !*** css ./style2.css (media: (min-width: 100px)) ***! + \\\\****************************************************/ +@media (min-width: 100px) { + a { + color: red; + } +} + +/*!**********************************!*\\\\ + !*** css ./test.css?foo=1&bar=1 ***! + \\\\**********************************/ +.class { + content: \\"test.css\\"; +} + +/*!*****************************************!*\\\\ + !*** css ./style2.css?foo=1&bar=1#hash ***! + \\\\*****************************************/ +a { + color: red; +} + +/*!*************************************************************************************!*\\\\ + !*** css ./style2.css?foo=1&bar=1#hash (media: screen and (orientation:landscape)) ***! + \\\\*************************************************************************************/ +@media screen and (orientation:landscape) { + a { + color: red; + } +} + +/*!******************************!*\\\\ + !*** css ./style3.css?bar=1 ***! + \\\\******************************/ +.class { + content: \\"style.css\\"; + color: red; +} + +/*!******************************!*\\\\ + !*** css ./style3.css?bar=2 ***! + \\\\******************************/ +.class { + content: \\"style.css\\"; + color: red; +} + +/*!******************************!*\\\\ + !*** css ./style3.css?bar=3 ***! + \\\\******************************/ +.class { + content: \\"style.css\\"; + color: red; +} + +/*!******************************!*\\\\ + !*** css ./style3.css?=bar4 ***! + \\\\******************************/ +.class { + content: \\"style.css\\"; + color: red; +} + +/*!**************************!*\\\\ + !*** css ./styl'le7.css ***! + \\\\**************************/ +.class { + content: \\"style7.css\\"; +} + +/*!********************************!*\\\\ + !*** css ./styl'le7.css?foo=1 ***! + \\\\********************************/ +.class { + content: \\"style7.css\\"; +} + +/*!***************************!*\\\\ + !*** css ./test test.css ***! + \\\\***************************/ +.class { + content: \\"test test.css\\"; +} + +/*!*********************************!*\\\\ + !*** css ./test test.css?foo=1 ***! + \\\\*********************************/ +.class { + content: \\"test test.css\\"; +} + +/*!*********************************!*\\\\ + !*** css ./test test.css?foo=2 ***! + \\\\*********************************/ +.class { + content: \\"test test.css\\"; +} + +/*!*********************************!*\\\\ + !*** css ./test test.css?foo=3 ***! + \\\\*********************************/ +.class { + content: \\"test test.css\\"; +} + +/*!*********************************!*\\\\ + !*** css ./test test.css?foo=4 ***! + \\\\*********************************/ +.class { + content: \\"test test.css\\"; +} + +/*!*********************************!*\\\\ + !*** css ./test test.css?foo=5 ***! + \\\\*********************************/ +.class { + content: \\"test test.css\\"; +} + +/*!**********************!*\\\\ + !*** css ./test.css ***! + \\\\**********************/ +.class { + content: \\"test.css\\"; +} + +/*!****************************!*\\\\ + !*** css ./test.css?foo=1 ***! + \\\\****************************/ +.class { + content: \\"test.css\\"; +} + +/*!****************************!*\\\\ + !*** css ./test.css?foo=2 ***! + \\\\****************************/ +.class { + content: \\"test.css\\"; +} + +/*!****************************!*\\\\ + !*** css ./test.css?foo=3 ***! + \\\\****************************/ +.class { + content: \\"test.css\\"; +} + +/*!*********************************!*\\\\ + !*** css ./test test.css?foo=6 ***! + \\\\*********************************/ +.class { + content: \\"test test.css\\"; +} + +/*!*********************************!*\\\\ + !*** css ./test test.css?foo=7 ***! + \\\\*********************************/ +.class { + content: \\"test test.css\\"; +} + +/*!*********************************!*\\\\ + !*** css ./test test.css?foo=8 ***! + \\\\*********************************/ +.class { + content: \\"test test.css\\"; +} + +/*!*********************************!*\\\\ + !*** css ./test test.css?foo=9 ***! + \\\\*********************************/ +.class { + content: \\"test test.css\\"; +} + +/*!**********************************!*\\\\ + !*** css ./test test.css?fpp=10 ***! + \\\\**********************************/ +.class { + content: \\"test test.css\\"; +} + +/*!**********************************!*\\\\ + !*** css ./test test.css?foo=11 ***! + \\\\**********************************/ +.class { + content: \\"test test.css\\"; +} + +/*!*********************************!*\\\\ + !*** css ./style6.css?foo=bazz ***! + \\\\*********************************/ +.class { + content: \\"style6.css\\"; +} + +/*!********************************************************!*\\\\ + !*** css ./string-loader.js?esModule=false!./test.css ***! + \\\\********************************************************/ +.class { + content: \\"test.css\\"; +} +.using-loader { color: red; } +/*!********************************!*\\\\ + !*** css ./style4.css?foo=bar ***! + \\\\********************************/ +.class { + content: \\"style4.css\\"; +} + +/*!*************************************!*\\\\ + !*** css ./style4.css?foo=bar#hash ***! + \\\\*************************************/ +.class { + content: \\"style4.css\\"; +} + +/*!******************************!*\\\\ + !*** css ./style4.css?#hash ***! + \\\\******************************/ +.class { + content: \\"style4.css\\"; +} + +/*!********************************************************!*\\\\ + !*** css ./style4.css?foo=1 (supports: display: flex) ***! + \\\\********************************************************/ +@supports (display: flex) { + .class { + content: \\"style4.css\\"; + } +} + +/*!****************************************************************************************************!*\\\\ + !*** css ./style4.css?foo=2 (supports: display: flex) (media: screen and (orientation:landscape)) ***! + \\\\****************************************************************************************************/ +@supports (display: flex) { + @media screen and (orientation:landscape) { + .class { + content: \\"style4.css\\"; + } + } +} + +/*!******************************!*\\\\ + !*** css ./style4.css?foo=3 ***! + \\\\******************************/ +.class { + content: \\"style4.css\\"; +} + +/*!******************************!*\\\\ + !*** css ./style4.css?foo=4 ***! + \\\\******************************/ +.class { + content: \\"style4.css\\"; +} + +/*!******************************!*\\\\ + !*** css ./style4.css?foo=5 ***! + \\\\******************************/ +.class { + content: \\"style4.css\\"; +} + +/*!*****************************************************************************************************!*\\\\ + !*** css ./string-loader.js?esModule=false!./test.css (media: screen and (orientation: landscape)) ***! + \\\\*****************************************************************************************************/ +@media screen and (orientation: landscape) { + .class { + content: \\"test.css\\"; + } + .using-loader { color: red; }} + +/*!*************************************************************************************!*\\\\ + !*** css data:text/css;charset=utf-8,a%20%7B%0D%0A%20%20color%3A%20red%3B%0D%0A%7D ***! + \\\\*************************************************************************************/ +a { + color: red; +} +/*!**********************************************************************************************************************************!*\\\\ + !*** css data:text/css;charset=utf-8,a%20%7B%0D%0A%20%20color%3A%20blue%3B%0D%0A%7D (media: screen and (orientation:landscape)) ***! + \\\\**********************************************************************************************************************************/ +@media screen and (orientation:landscape) { + a { + color: blue; + }} + +/*!***************************************************************************!*\\\\ + !*** css data:text/css;charset=utf-8;base64,YSB7DQogIGNvbG9yOiByZWQ7DQp9 ***! + \\\\***************************************************************************/ +a { + color: red; +} +/*!******************************!*\\\\ + !*** css ./style5.css?foo=1 ***! + \\\\******************************/ +.class { + content: \\"style5.css\\"; +} + +/*!******************************!*\\\\ + !*** css ./style5.css?foo=2 ***! + \\\\******************************/ +.class { + content: \\"style5.css\\"; +} + +/*!**************************************************!*\\\\ + !*** css ./style5.css?foo=3 (supports: unknown) ***! + \\\\**************************************************/ +@supports (unknown) { + .class { + content: \\"style5.css\\"; + } +} + +/*!********************************************************!*\\\\ + !*** css ./style5.css?foo=4 (supports: display: flex) ***! + \\\\********************************************************/ +@supports (display: flex) { + .class { + content: \\"style5.css\\"; + } +} + +/*!*******************************************************************!*\\\\ + !*** css ./style5.css?foo=5 (supports: display: flex !important) ***! + \\\\*******************************************************************/ +@supports (display: flex !important) { + .class { + content: \\"style5.css\\"; + } +} + +/*!***********************************************************************************************!*\\\\ + !*** css ./style5.css?foo=6 (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\***********************************************************************************************/ +@supports (display: flex) { + @media screen and (min-width: 400px) { + .class { + content: \\"style5.css\\"; + } + } +} + +/*!********************************************************!*\\\\ + !*** css ./style5.css?foo=7 (supports: selector(a b)) ***! + \\\\********************************************************/ +@supports (selector(a b)) { + .class { + content: \\"style5.css\\"; + } +} + +/*!********************************************************!*\\\\ + !*** css ./style5.css?foo=8 (supports: display: flex) ***! + \\\\********************************************************/ +@supports (display: flex) { + .class { + content: \\"style5.css\\"; + } +} + +/*!*****************************!*\\\\ + !*** css ./layer.css?foo=1 ***! + \\\\*****************************/ +@layer { + .class { + content: \\"layer.css\\"; + } +} + +/*!**********************************************!*\\\\ + !*** css ./layer.css?foo=2 (layer: default) ***! + \\\\**********************************************/ +@layer default { + .class { + content: \\"layer.css\\"; + } +} + +/*!***************************************************************************************************************!*\\\\ + !*** css ./layer.css?foo=3 (layer: default) (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\***************************************************************************************************************/ +@layer default { + @supports (display: flex) { + @media screen and (min-width: 400px) { + .class { + content: \\"layer.css\\"; + } + } + } +} + +/*!**********************************************************************************************!*\\\\ + !*** css ./layer.css?foo=3 (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\**********************************************************************************************/ +@layer { + @supports (display: flex) { + @media screen and (min-width: 400px) { + .class { + content: \\"layer.css\\"; + } + } + } +} + +/*!**********************************************************************************************!*\\\\ + !*** css ./layer.css?foo=4 (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\**********************************************************************************************/ +@layer { + @supports (display: flex) { + @media screen and (min-width: 400px) { + .class { + content: \\"layer.css\\"; + } + } + } +} + +/*!*****************************!*\\\\ + !*** css ./layer.css?foo=5 ***! + \\\\*****************************/ +@layer { + .class { + content: \\"layer.css\\"; + } +} + +/*!**************************************************!*\\\\ + !*** css ./layer.css?foo=6 (layer: foo.bar.baz) ***! + \\\\**************************************************/ +@layer foo.bar.baz { + .class { + content: \\"layer.css\\"; + } +} + +/*!*****************************!*\\\\ + !*** css ./layer.css?foo=7 ***! + \\\\*****************************/ +@layer { + .class { + content: \\"layer.css\\"; + } +} + +/*!*********************************************************************************************************!*\\\\ + !*** css ./style6.css (layer: default) (supports: display: flex) (media: screen and (min-width:400px)) ***! + \\\\*********************************************************************************************************/ +@layer default { + @supports (display: flex) { + @media screen and (min-width:400px) { + .class { + content: \\"style6.css\\"; + } + } + } +} + +/*!***************************************************************************************************************!*\\\\ + !*** css ./style6.css?foo=1 (layer: default) (supports: display: flex) (media: screen and (min-width:400px)) ***! + \\\\***************************************************************************************************************/ +@layer default { + @supports (display: flex) { + @media screen and (min-width:400px) { + .class { + content: \\"style6.css\\"; + } + } + } +} + +/*!**********************************************************************************************!*\\\\ + !*** css ./style6.css?foo=2 (supports: display: flex) (media: screen and (min-width:400px)) ***! + \\\\**********************************************************************************************/ +@supports (display: flex) { + @media screen and (min-width:400px) { + .class { + content: \\"style6.css\\"; + } + } +} + +/*!********************************************************************!*\\\\ + !*** css ./style6.css?foo=3 (media: screen and (min-width:400px)) ***! + \\\\********************************************************************/ +@media screen and (min-width:400px) { + .class { + content: \\"style6.css\\"; + } +} + +/*!********************************************************************!*\\\\ + !*** css ./style6.css?foo=4 (media: screen and (min-width:400px)) ***! + \\\\********************************************************************/ +@media screen and (min-width:400px) { + .class { + content: \\"style6.css\\"; + } +} + +/*!********************************************************************!*\\\\ + !*** css ./style6.css?foo=5 (media: screen and (min-width:400px)) ***! + \\\\********************************************************************/ +@media screen and (min-width:400px) { + .class { + content: \\"style6.css\\"; + } +} + +/*!****************************************************************************************************************************************************!*\\\\ + !*** css ./style6.css?foo=6 (layer: default) (supports: display : flex) (media: screen and ( min-width : 400px )) ***! + \\\\****************************************************************************************************************************************************/ +@layer default { + @supports (display : flex) { + @media screen and ( min-width : 400px ) { + .class { + content: \\"style6.css\\"; + } + } + } +} + +/*!****************************************************************************************************************!*\\\\ + !*** css ./style6.css?foo=7 (layer: DEFAULT) (supports: DISPLAY: FLEX) (media: SCREEN AND (MIN-WIDTH: 400PX)) ***! + \\\\****************************************************************************************************************/ +@layer DEFAULT { + @supports (DISPLAY: FLEX) { + @media SCREEN AND (MIN-WIDTH: 400PX) { + .class { + content: \\"style6.css\\"; + } + } + } +} + +/*!***********************************************************************************************!*\\\\ + !*** css ./style6.css?foo=8 (supports: DISPLAY: FLEX) (media: SCREEN AND (MIN-WIDTH: 400PX)) ***! + \\\\***********************************************************************************************/ +@layer { + @supports (DISPLAY: FLEX) { + @media SCREEN AND (MIN-WIDTH: 400PX) { + .class { + content: \\"style6.css\\"; + } + } + } +} + +/*!****************************************************************************************************************************************************************************************************************************************************************************************!*\\\\ + !*** css ./style6.css?foo=9 (layer: /* Comment *_/default/* Comment *_/) (supports: /* Comment *_/display/* Comment *_/:/* Comment *_/ flex/* Comment *_/) (media: screen/* Comment *_/ and/* Comment *_/ (/* Comment *_/min-width/* Comment *_/: /* Comment *_/400px/* Comment *_/)) ***! + \\\\****************************************************************************************************************************************************************************************************************************************************************************************/ +@layer /* Comment */default/* Comment */ { + @supports (/* Comment */display/* Comment */:/* Comment */ flex/* Comment */) { + @media screen/* Comment */ and/* Comment */ (/* Comment */min-width/* Comment */: /* Comment */400px/* Comment */) { + .class { + content: \\"style6.css\\"; + } + } + } +} + +/*!*******************************!*\\\\ + !*** css ./style6.css?foo=10 ***! + \\\\*******************************/ +.class { + content: \\"style6.css\\"; +} + +/*!*******************************!*\\\\ + !*** css ./style6.css?foo=11 ***! + \\\\*******************************/ +.class { + content: \\"style6.css\\"; +} + +/*!*******************************!*\\\\ + !*** css ./style6.css?foo=12 ***! + \\\\*******************************/ +.class { + content: \\"style6.css\\"; +} + +/*!*******************************!*\\\\ + !*** css ./style6.css?foo=13 ***! + \\\\*******************************/ +.class { + content: \\"style6.css\\"; +} + +/*!*******************************!*\\\\ + !*** css ./style6.css?foo=14 ***! + \\\\*******************************/ +.class { + content: \\"style6.css\\"; +} + +/*!*******************************!*\\\\ + !*** css ./style6.css?foo=15 ***! + \\\\*******************************/ +.class { + content: \\"style6.css\\"; +} + +/*!**************************************************************************!*\\\\ + !*** css ./style6.css?foo=16 (media: print and (orientation:landscape)) ***! + \\\\**************************************************************************/ +@media print and (orientation:landscape) { + .class { + content: \\"style6.css\\"; + } +} + +/*!****************************************************************************************!*\\\\ + !*** css ./style6.css?foo=17 (media: print and (orientation:landscape)/* Comment *_/) ***! + \\\\****************************************************************************************/ +@media print and (orientation:landscape)/* Comment */ { + .class { + content: \\"style6.css\\"; + } +} + +/*!**************************************************************************!*\\\\ + !*** css ./style6.css?foo=18 (media: print and (orientation:landscape)) ***! + \\\\**************************************************************************/ +@media print and (orientation:landscape) { + .class { + content: \\"style6.css\\"; + } +} + +/*!***************************************************************!*\\\\ + !*** css ./style8.css (media: screen and (min-width: 400px)) ***! + \\\\***************************************************************/ +@media screen and (min-width: 400px) { + .class { + content: \\"style8.css\\"; + } +} + +/*!**************************************************************!*\\\\ + !*** css ./style8.css (media: (prefers-color-scheme: dark)) ***! + \\\\**************************************************************/ +@media (prefers-color-scheme: dark) { + .class { + content: \\"style8.css\\"; + } +} + +/*!**************************************************!*\\\\ + !*** css ./style8.css (supports: display: flex) ***! + \\\\**************************************************/ +@supports (display: flex) { + .class { + content: \\"style8.css\\"; + } +} + +/*!******************************************************!*\\\\ + !*** css ./style8.css (supports: ((display: flex))) ***! + \\\\******************************************************/ +@supports (((display: flex))) { + .class { + content: \\"style8.css\\"; + } +} + +/*!********************************************************************************************************!*\\\\ + !*** css ./style8.css (supports: ((display: inline-grid))) (media: screen and (((min-width: 400px)))) ***! + \\\\********************************************************************************************************/ +@supports (((display: inline-grid))) { + @media screen and (((min-width: 400px))) { + .class { + content: \\"style8.css\\"; + } + } +} + +/*!**************************************************!*\\\\ + !*** css ./style8.css (supports: display: grid) ***! + \\\\**************************************************/ +@supports (display: grid) { + .class { + content: \\"style8.css\\"; + } +} + +/*!*****************************************************************************************!*\\\\ + !*** css ./style8.css (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\*****************************************************************************************/ +@supports (display: flex) { + @media screen and (min-width: 400px) { + .class { + content: \\"style8.css\\"; + } + } +} + +/*!*******************************************!*\\\\ + !*** css ./style8.css (layer: framework) ***! + \\\\*******************************************/ +@layer framework { + .class { + content: \\"style8.css\\"; + } +} + +/*!*****************************************!*\\\\ + !*** css ./style8.css (layer: default) ***! + \\\\*****************************************/ +@layer default { + .class { + content: \\"style8.css\\"; + } +} + +/*!**************************************!*\\\\ + !*** css ./style8.css (layer: base) ***! + \\\\**************************************/ +@layer base { + .class { + content: \\"style8.css\\"; + } +} + +/*!*******************************************************************!*\\\\ + !*** css ./style8.css (layer: default) (supports: display: flex) ***! + \\\\*******************************************************************/ +@layer default { + @supports (display: flex) { + .class { + content: \\"style8.css\\"; + } + } +} + +/*!**********************************************************************************************************!*\\\\ + !*** css ./style8.css (layer: default) (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\**********************************************************************************************************/ +@layer default { + @supports (display: flex) { + @media screen and (min-width: 400px) { + .class { + content: \\"style8.css\\"; + } + } + } +} + +/*!************************!*\\\\ + !*** css ./style2.css ***! + \\\\************************/ +@layer { + a { + color: red; + } +} + +/*!*********************************************************************************!*\\\\ + !*** css ./style9.css (media: unknown(default) unknown(display: flex) unknown) ***! + \\\\*********************************************************************************/ +@media unknown(default) unknown(display: flex) unknown { + .class { + content: \\"style9.css\\"; + } +} + +/*!**************************************************!*\\\\ + !*** css ./style9.css (media: unknown(default)) ***! + \\\\**************************************************/ +@media unknown(default) { + .class { + content: \\"style9.css\\"; + } +} + +/*!*************************!*\\\\ + !*** css ./style11.css ***! + \\\\*************************/ +.style11 { + color: red; +} + +/*!*************************!*\\\\ + !*** css ./style12.css ***! + \\\\*************************/ + +.style12 { + color: red; +} + +/*!*************************!*\\\\ + !*** css ./style13.css ***! + \\\\*************************/ +div{color: red;} + +/*!*************************!*\\\\ + !*** css ./style10.css ***! + \\\\*************************/ + + +.style10 { + color: red; +} + +/*!************************************************************************************!*\\\\ + !*** css ./media-deep-deep-nested.css (media: screen and (orientation: portrait)) ***! + \\\\************************************************************************************/ +@media screen and (min-width: 400px) { + @media screen and (max-width: 500px) { + @media screen and (orientation: portrait) { + .class { + deep-deep-nested: 1; + } + } + } +} + +/*!**************************************************************************!*\\\\ + !*** css ./media-deep-nested.css (media: screen and (max-width: 500px)) ***! + \\\\**************************************************************************/ +@media screen and (min-width: 400px) { + @media screen and (max-width: 500px) { + + .class { + deep-nested: 1; + } + } +} + +/*!*********************************************************************!*\\\\ + !*** css ./media-nested.css (media: screen and (min-width: 400px)) ***! + \\\\*********************************************************************/ +@media screen and (min-width: 400px) { + + .class { + nested: 1; + } +} + +/*!**********************************************************************!*\\\\ + !*** css ./supports-deep-deep-nested.css (supports: display: table) ***! + \\\\**********************************************************************/ +@supports (display: flex) { + @supports (display: grid) { + @supports (display: table) { + .class { + deep-deep-nested: 1; + } + } + } +} + +/*!****************************************************************!*\\\\ + !*** css ./supports-deep-nested.css (supports: display: grid) ***! + \\\\****************************************************************/ +@supports (display: flex) { + @supports (display: grid) { + + .class { + deep-nested: 1; + } + } +} + +/*!***********************************************************!*\\\\ + !*** css ./supports-nested.css (supports: display: flex) ***! + \\\\***********************************************************/ +@supports (display: flex) { + + .class { + nested: 1; + } +} + +/*!*****************************************************!*\\\\ + !*** css ./layer-deep-deep-nested.css (layer: baz) ***! + \\\\*****************************************************/ +@layer foo { + @layer bar { + @layer baz { + .class { + deep-deep-nested: 1; + } + } + } +} + +/*!************************************************!*\\\\ + !*** css ./layer-deep-nested.css (layer: bar) ***! + \\\\************************************************/ +@layer foo { + @layer bar { + + .class { + deep-nested: 1; + } + } +} + +/*!*******************************************!*\\\\ + !*** css ./layer-nested.css (layer: foo) ***! + \\\\*******************************************/ +@layer foo { + + .class { + nested: 1; + } +} + +/*!*********************************************************************************************************************!*\\\\ + !*** css ./all-deep-deep-nested.css (layer: baz) (supports: display: table) (media: screen and (min-width: 600px)) ***! + \\\\*********************************************************************************************************************/ +@layer foo { + @supports (display: flex) { + @media screen and (min-width: 400px) { + @layer bar { + @supports (display: grid) { + @media screen and (min-width: 500px) { + @layer baz { + @supports (display: table) { + @media screen and (min-width: 600px) { + .class { + deep-deep-nested: 1; + } + } + } + } + } + } + } + } + } +} + +/*!***************************************************************************************************************!*\\\\ + !*** css ./all-deep-nested.css (layer: bar) (supports: display: grid) (media: screen and (min-width: 500px)) ***! + \\\\***************************************************************************************************************/ +@layer foo { + @supports (display: flex) { + @media screen and (min-width: 400px) { + @layer bar { + @supports (display: grid) { + @media screen and (min-width: 500px) { + + .class { + deep-nested: 1; + } + } + } + } + } + } +} + +/*!**********************************************************************************************************!*\\\\ + !*** css ./all-nested.css (layer: foo) (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\**********************************************************************************************************/ +@layer foo { + @supports (display: flex) { + @media screen and (min-width: 400px) { + + .class { + nested: 1; + } + } + } +} + +/*!*****************************************************!*\\\\ + !*** css ./mixed-deep-deep-nested.css (layer: bar) ***! + \\\\*****************************************************/ +@media screen and (min-width: 400px) { + @supports (display: flex) { + @layer bar { + .class { + deep-deep-nested: 1; + } + } + } +} + +/*!*************************************************************!*\\\\ + !*** css ./mixed-deep-nested.css (supports: display: flex) ***! + \\\\*************************************************************/ +@media screen and (min-width: 400px) { + @supports (display: flex) { + + .class { + deep-nested: 1; + } + } +} + +/*!*********************************************************************!*\\\\ + !*** css ./mixed-nested.css (media: screen and (min-width: 400px)) ***! + \\\\*********************************************************************/ +@media screen and (min-width: 400px) { + + .class { + nested: 1; + } +} + +/*!********************************************!*\\\\ + !*** css ./anonymous-deep-deep-nested.css ***! + \\\\********************************************/ +@layer { + @layer { + @layer { + .class { + deep-deep-nested: 1; + } + } + } +} + +/*!***************************************!*\\\\ + !*** css ./anonymous-deep-nested.css ***! + \\\\***************************************/ +@layer { + @layer { + + .class { + deep-nested: 1; + } + } +} + +/*!*****************************************************!*\\\\ + !*** css ./layer-deep-deep-nested.css (layer: baz) ***! + \\\\*****************************************************/ +@layer { + @layer base { + @layer baz { + .class { + deep-deep-nested: 1; + } + } + } +} + +/*!*************************************************!*\\\\ + !*** css ./layer-deep-nested.css (layer: base) ***! + \\\\*************************************************/ +@layer { + @layer base { + + .class { + deep-nested: 1; + } + } +} + +/*!**********************************!*\\\\ + !*** css ./anonymous-nested.css ***! + \\\\**********************************/ +@layer { + + .class { + deep-nested: 1; + } +} + +/*!************************************************************************************!*\\\\ + !*** css ./media-deep-deep-nested.css (media: screen and (orientation: portrait)) ***! + \\\\************************************************************************************/ +@media screen and (orientation: portrait) { + .class { + deep-deep-nested: 1; + } +} + +/*!**************************************************!*\\\\ + !*** css ./style8.css (supports: display: flex) ***! + \\\\**************************************************/ +@media screen and (orientation: portrait) { + @supports (display: flex) { + .class { + content: \\"style8.css\\"; + } + } +} + +/*!******************************************************************************!*\\\\ + !*** css ./duplicate-nested.css (media: screen and (orientation: portrait)) ***! + \\\\******************************************************************************/ +@media screen and (orientation: portrait) { + + .class { + duplicate-nested: true; + } +} + +/*!********************************************!*\\\\ + !*** css ./anonymous-deep-deep-nested.css ***! + \\\\********************************************/ +@supports (display: flex) { + @media screen and (orientation: portrait) { + @layer { + @layer { + .class { + deep-deep-nested: 1; + } + } + } + } +} + +/*!***************************************!*\\\\ + !*** css ./anonymous-deep-nested.css ***! + \\\\***************************************/ +@supports (display: flex) { + @media screen and (orientation: portrait) { + @layer { + + .class { + deep-nested: 1; + } + } + } +} + +/*!*****************************************************!*\\\\ + !*** css ./layer-deep-deep-nested.css (layer: baz) ***! + \\\\*****************************************************/ +@supports (display: flex) { + @media screen and (orientation: portrait) { + @layer base { + @layer baz { + .class { + deep-deep-nested: 1; + } + } + } + } +} + +/*!*************************************************!*\\\\ + !*** css ./layer-deep-nested.css (layer: base) ***! + \\\\*************************************************/ +@supports (display: flex) { + @media screen and (orientation: portrait) { + @layer base { + + .class { + deep-nested: 1; + } + } + } +} + +/*!********************************************************************************************************!*\\\\ + !*** css ./anonymous-nested.css (supports: display: flex) (media: screen and (orientation: portrait)) ***! + \\\\********************************************************************************************************/ +@supports (display: flex) { + @media screen and (orientation: portrait) { + + .class { + deep-nested: 1; + } + } +} + +/*!*********************************************************************************************************************!*\\\\ + !*** css ./all-deep-deep-nested.css (layer: baz) (supports: display: table) (media: screen and (min-width: 600px)) ***! + \\\\*********************************************************************************************************************/ +@layer super.foo { + @supports (display: flex) { + @media screen and (min-width: 400px) { + @layer bar { + @supports (display: grid) { + @media screen and (min-width: 500px) { + @layer baz { + @supports (display: table) { + @media screen and (min-width: 600px) { + .class { + deep-deep-nested: 1; + } + } + } + } + } + } + } + } + } +} + +/*!***************************************************************************************************************!*\\\\ + !*** css ./all-deep-nested.css (layer: bar) (supports: display: grid) (media: screen and (min-width: 500px)) ***! + \\\\***************************************************************************************************************/ +@layer super.foo { + @supports (display: flex) { + @media screen and (min-width: 400px) { + @layer bar { + @supports (display: grid) { + @media screen and (min-width: 500px) { + + .class { + deep-nested: 1; + } + } + } + } + } + } +} + +/*!****************************************************************************************************************!*\\\\ + !*** css ./all-nested.css (layer: super.foo) (supports: display: flex) (media: screen and (min-width: 400px)) ***! + \\\\****************************************************************************************************************/ +@layer super.foo { + @supports (display: flex) { + @media screen and (min-width: 400px) { + + .class { + nested: 1; + } + } + } +} + +/*!***************************************************************************************************************!*\\\\ + !*** css ./style2.css?warning=6 (supports: unknown: layer(super.foo)) (media: screen and (min-width: 400px)) ***! + \\\\***************************************************************************************************************/ +@supports (unknown: layer(super.foo)) { + @media screen and (min-width: 400px) { + a { + color: red; + } + } +} + +/*!***************************************************************************************************************!*\\\\ + !*** css ./style2.css?warning=7 (supports: url: url(\\"./unknown.css\\")) (media: screen and (min-width: 400px)) ***! + \\\\***************************************************************************************************************/ +@supports (url: url(\\"./unknown.css\\")) { + @media screen and (min-width: 400px) { + a { + color: red; + } + } +} + +/*!*************************************************************************************************************!*\\\\ + !*** css ./style2.css?warning=8 (supports: url: url(./unknown.css)) (media: screen and (min-width: 400px)) ***! + \\\\*************************************************************************************************************/ +@supports (url: url(./unknown.css)) { + @media screen and (min-width: 400px) { + a { + color: red; + } + } +} + +/*!***************************************************************************************************************************************!*\\\\ + !*** css ./style2.css?foo=unknown (layer: super.foo) (supports: display: flex) (media: unknown(\\"foo\\") screen and (min-width: 400px)) ***! + \\\\***************************************************************************************************************************************/ +@layer super.foo { + @supports (display: flex) { + @media unknown(\\"foo\\") screen and (min-width: 400px) { + a { + color: red; + } + } + } +} + +/*!******************************************************************************************************************************************************!*\\\\ + !*** css ./style2.css?foo=unknown1 (layer: super.foo) (supports: display: url(\\"./unknown.css\\")) (media: unknown(foo) screen and (min-width: 400px)) ***! + \\\\******************************************************************************************************************************************************/ +@layer super.foo { + @supports (display: url(\\"./unknown.css\\")) { + @media unknown(foo) screen and (min-width: 400px) { + a { + color: red; + } + } + } +} + +/*!*********************************************************************************************************************************************!*\\\\ + !*** css ./style2.css?foo=unknown2 (layer: super.foo) (supports: display: url(./unknown.css)) (media: \\"foo\\" screen and (min-width: 400px)) ***! + \\\\*********************************************************************************************************************************************/ +@layer super.foo { + @supports (display: url(./unknown.css)) { + @media \\"foo\\" screen and (min-width: 400px) { + a { + color: red; + } + } + } +} + +/*!***************************************************!*\\\\ + !*** css ./style2.css?unknown3 (media: \\"string\\") ***! + \\\\***************************************************/ +@media \\"string\\" { + a { + color: red; + } +} + +/*!**********************************************************************************************************************************!*\\\\ + !*** css ./style2.css?wrong-order-but-valid=6 (supports: display: flex) (media: layer(super.foo) screen and (min-width: 400px)) ***! + \\\\**********************************************************************************************************************************/ +@supports (display: flex) { + @media layer(super.foo) screen and (min-width: 400px) { + a { + color: red; + } + } +} + +/*!****************************************!*\\\\ + !*** css ./style2.css?after-namespace ***! + \\\\****************************************/ +a { + color: red; +} + +/*!*************************************************************************!*\\\\ + !*** css ./style2.css?multiple=1 (media: url(./style2.css?multiple=2)) ***! + \\\\*************************************************************************/ +@media url(./style2.css?multiple=2) { + a { + color: red; + } +} + +/*!***************************************************************************!*\\\\ + !*** css ./style2.css?multiple=3 (media: url(\\"./style2.css?multiple=4\\")) ***! + \\\\***************************************************************************/ +@media url(\\"./style2.css?multiple=4\\") { + a { + color: red; + } +} + +/*!**************************************************************************!*\\\\ + !*** css ./style2.css?strange=3 (media: url(\\"./style2.css?multiple=4\\")) ***! + \\\\**************************************************************************/ +@media url(\\"./style2.css?multiple=4\\") { + a { + color: red; + } +} + +/*!************************************************************!*\\\\ + !*** css ./dark.css (media: (prefers-color-scheme: dark)) ***! + \\\\************************************************************/ +@media (prefers-color-scheme: dark) { + a { + color: white; + } +} + +/*!***************************************!*\\\\ + !*** css ./list-of-media-queries.css ***! + \\\\***************************************/ + +a { + color: black; +} + +/*!*********************************!*\\\\ + !*** css ./circular-nested.css ***! + \\\\*********************************/ + +.circular-nested { + color: red; +} + +/*!**************************!*\\\\ + !*** css ./circular.css ***! + \\\\**************************/ + +.circular { + color: red; +} + +/*!***********************!*\\\\ + !*** css ./style.css ***! + \\\\***********************/ + +/* Has the same URL */ + + + + + + + + +/* anonymous */ + +/* All unknown parse as media for compatibility */ + + + +/* Inside support */ + + +/** Possible syntax in future */ + + +/** Unknown */ + +@import-normalize; + +/** Warnings */ + +@import nourl(test.css); +@import ; +@import foo-bar; +@import layer(super.foo) \\"./style2.css?warning=1\\" supports(display: flex) screen and (min-width: 400px); +@import layer(super.foo) supports(display: flex) \\"./style2.css?warning=2\\" screen and (min-width: 400px); +@import layer(super.foo) supports(display: flex) screen and (min-width: 400px) \\"./style2.css?warning=3\\"; +@import layer(super.foo) url(fae7e602dbe59a260308.css?warning=4) supports(display: flex) screen and (min-width: 400px); +@import layer(super.foo) supports(display: flex) url(fae7e602dbe59a260308.css?warning=5) screen and (min-width: 400px); +@import layer(super.foo) supports(display: flex) screen and (min-width: 400px) url(fae7e602dbe59a260308.css?warning=6); +@namespace url(http://www.w3.org/1999/xhtml); +@import supports(background: url(09a1a1112c577c279435.png)); +@import supports(background: url(09a1a1112c577c279435.png)) screen and (min-width: 400px); +@import layer(test) supports(background: url(09a1a1112c577c279435.png)) screen and (min-width: 400px); +@import screen and (min-width: 400px); + + + +/* FIXME */ +/*@import url(\\"webpackIgnore-order.css\\");*/ + +body { + background: red; +} + +", +] +`; + +exports[`ConfigTestCases css import exported tests should compile 2`] = ` +Array [ + "/*!***********************!*\\\\ + !*** css ./style.css ***! + \\\\***********************/ +@import \\"./style-import.css\\"; +@import \\"print.css?foo=1\\"; +@import url(\\"print.css?foo=2\\"); +@import \\"print.css?foo=3\\" layer(default); +@import url(\\"print.css?foo=4\\") layer(default); +@import \\"print.css?foo=5\\" supports(display: flex); +@import url(\\"print.css?foo=6\\") supports(display: flex); +@import \\"print.css?foo=7\\" screen and (min-width: 400px); +@import url(\\"print.css?foo=8\\") screen and (min-width: 400px); +@import \\"print.css?foo=9\\" layer(default) supports(display: flex); +@import \\"print.css?foo=10\\" layer(default) screen and (min-width: 400px); +@import \\"print.css?foo=11\\" supports(display: flex) screen and (min-width: 400px); +@import \\"print.css?foo=12\\" layer(default) supports(display: flex) screen and (min-width: 400px); +@import \\"print.css?foo=13\\"layer(default)supports(display: flex)screen and (min-width: 400px); +@import url(print.css?foo=14)layer(default)supports(display: flex)screen and (min-width: 400px); +@import url(\\"print.css?foo=15\\")layer(default)supports(display: flex)screen and (min-width: 400px); +@import url(print.css?foo=16)layer(default)supports(background: url(./img.png))screen and (min-width: 400px); +@import url(print.css?foo=17)layer(default)supports(background: url(\\"./img.png\\"))screen and (min-width: 400px); +@import url(print.css?foo=18)screen; +@import url(\\"print.css?foo=19\\")screen; +@import \\"print.css?foo=20\\"screen; +@import url(print.css?foo=18) screen ; +@import url(\\"print.css?foo=19\\") screen ; +@import \\"print.css?foo=20\\" screen ; +@import \\"print.css?foo=21\\" ; + +/* Has the same URL */ +@import \\"imported.css\\"; +@import \\"imported.css\\" layer(base); +@import \\"imported.css\\" supports(display: flex); +@import \\"imported.css\\" screen, print; + +@import url(style2.css?foo=1); +@import url('style2.css?foo=2'); +@import url(\\"style2.css?foo=3\\"); +@IMPORT url(style2.css?foo=4); +@import URL(style2.css?foo=5); +@import url(style2.css?foo=6 ); +@import url( style2.css?foo=7); +@import url( style2.css?foo=8 ); +@import url( +style2.css?foo=9 +); +@import url(); +@import url(''); +@import url(\\"\\"); +@import ''; +@import \\"\\"; +@import \\" \\"; +@import \\"\\\\ +\\"; +@import url(); +@import url(''); +@import url(\\"\\"); +@import url(\\"\\") /* test */; +@import url(\\"\\") screen and (orientation:landscape); +@import url(style2.css) screen and (orientation:landscape); +@import url(style2.css) SCREEN AND (ORIENTATION: LANDSCAPE); +@import url(style2.css)screen and (orientation:landscape); +@import url(style2.css) screen and (orientation:landscape); +@import url(style2.css) screen and (orientation:landscape); +@import url(style2.css) (min-width: 100px); +@import url(https://test.cases/path/../../../../configCases/css/import/external.css); +@import url(https://test.cases/path/../../../../configCases/css/import/external.css) screen and (orientation:landscape); +@import \\"//example.com/style.css\\"; +@import url('test.css?foo=1&bar=1'); +@import url('style2.css?foo=1&bar=1#hash'); +@import url('style2.css?foo=1&bar=1#hash') screen and (orientation:landscape); +@import url('https://fonts.googleapis.com/css?family=Roboto'); +@import url('https://fonts.googleapis.com/css?family=Noto+Sans+TC'); +@import url('https://fonts.googleapis.com/css?family=Noto+Sans+TC|Roboto'); +@import url('https://fonts.googleapis.com/css?family=Noto+Sans+TC|Roboto?foo=1') layer(super.foo) supports(display: flex) screen and (min-width: 400px); + +@import './sty\\\\ +le3.css?bar=1'; +@import './sty\\\\ +\\\\ +\\\\ +le3.css?bar=2'; +@import url('./sty\\\\ +le3.css?bar=3'); +@import url('./sty\\\\ +\\\\ +\\\\ +le3.css?=bar4'); + +@import \\"./styl'le7.css\\"; +@import url(\\"./styl'le7.css?foo=1\\"); +@import './styl\\\\'le7.css'; +@import url('./styl\\\\'le7.css'); +@import './test test.css'; +@import url('./test test.css?foo=1'); +@import './test\\\\ test.css?foo=2'; +@import url('./test\\\\ test.css?foo=3'); +@import './test%20test.css?foo=4'; +@import url('./test%20test.css?foo=5'); +@import './\\\\74\\\\65\\\\73\\\\74.css'; +@import url('./\\\\74\\\\65\\\\73\\\\74.css?foo=1'); +@import './t\\\\65\\\\73\\\\74.css?foo=2'; +@import url('./t\\\\65\\\\73\\\\74.css?foo=3'); +@import url(./test\\\\ test.css?foo=6); +@import url(./t\\\\65st%20test.css?foo=7); +@import url('./t\\\\65st%20test.css?foo=8'); +@import url(\\"./t\\\\65st%20test.css?foo=9\\"); +@import \\"./t\\\\65st%20test.css?fpp=10\\"; +@import './t\\\\65st%20test.css?foo=11'; +@import url( style6.css?foo=bazz ); +@import '\\\\ +\\\\ +\\\\ +'; +@import url('./string-loader.js?esModule=false!./test.css'); +@import url(style4.css?foo=bar); +@import url(style4.css?foo=bar#hash); +@import url(style4.css?#hash); +@import \\"style4.css?foo=1\\" supports(display: flex); +@import \\"style4.css?foo=2\\" supports(display: flex) screen and (orientation:landscape); + +@import \\" ./style4.css?foo=3 \\"; +@import url(' ./style4.css?foo=4 '); +@import url( ./style4.css?foo=5 ); + +@import url(' https://fonts.googleapis.com/css?family=Roboto '); +@import url('./string-loader.js?esModule=false'); +@import url(' ./string-loader.js?esModule=false!./test.css ') screen and (orientation: landscape); +@import url(data:text/css;charset=utf-8,a%20%7B%0D%0A%20%20color%3A%20red%3B%0D%0A%7D); +@import url(data:text/css;charset=utf-8,a%20%7B%0D%0A%20%20color%3A%20blue%3B%0D%0A%7D) screen and (orientation:landscape); +@import url(\\"data:text/css;charset=utf-8;base64,YSB7DQogIGNvbG9yOiByZWQ7DQp9\\"); + +@import url(\\"./style5.css?foo=1\\") supports(); +@import url(\\"./style5.css?foo=2\\") supports( ); +@import url(\\"./style5.css?foo=3\\") supports(unknown); +@import url(\\"./style5.css?foo=4\\") supports(display: flex); +@import url(\\"./style5.css?foo=5\\") supports(display: flex !important); +@import url(\\"./style5.css?foo=6\\") supports(display: flex) screen and (min-width: 400px); +@import url(\\"./style5.css?foo=7\\") supports(selector(a b)); +@import url(\\"./style5.css?foo=8\\") supports( display: flex ); +@import url(\\"./layer.css?foo=1\\") layer; +@import url(\\"./layer.css?foo=2\\") layer(default); +@import url(\\"./layer.css?foo=3\\") layer(default) supports(display: flex) screen and (min-width: 400px); +@import url(\\"./layer.css?foo=3\\") layer supports(display: flex) screen and (min-width: 400px); +@import url(\\"./layer.css?foo=4\\") layer() supports(display: flex) screen and (min-width: 400px); +@import url(\\"./layer.css?foo=5\\") layer(); +@import url(\\"./layer.css?foo=6\\") layer( foo.bar.baz ); +@import url(\\"./layer.css?foo=7\\") layer( ); +@import url(\\"./style6.css\\")layer(default)supports(display: flex)screen and (min-width:400px); +@import \\"./style6.css?foo=1\\"layer(default)supports(display: flex)screen and (min-width:400px); +@import \\"./style6.css?foo=2\\"supports(display: flex)screen and (min-width:400px); +@import \\"./style6.css?foo=3\\"screen and (min-width:400px); +@import url(\\"./style6.css?foo=4\\")screen and (min-width:400px); +@import url(./style6.css?foo=5)screen and (min-width:400px); +@import url(\\"./style6.css?foo=6\\") layer( default ) supports( display : flex ) screen and ( min-width : 400px ); +@import URL(\\"./style6.css?foo=7\\") LAYER(DEFAULT) SUPPORTS(DISPLAY: FLEX) SCREEN AND (MIN-WIDTH: 400PX); +@import url(\\"./style6.css?foo=8\\") LAYER SUPPORTS(DISPLAY: FLEX) SCREEN AND (MIN-WIDTH: 400PX); +@import url(\\"./style6.css?foo=9\\") /* Comment */ layer(/* Comment */default/* Comment */) /* Comment */ supports(/* Comment */display/* Comment */:/* Comment */ flex/* Comment */)/* Comment */ screen/* Comment */ and/* Comment */ (/* Comment */min-width/* Comment */: /* Comment */400px/* Comment */); +@import url(style6.css?foo=10) /* Comment */; +@import url(style6.css?foo=11) /* Comment */ /* Comment */; +@import url(style6.css?foo=12) /* Comment *//* Comment */; +@import url(style6.css?foo=13)/* Comment *//* Comment */; +@import +url(style6.css?foo=14) +/* Comment */ +/* Comment */; +@import /* Comment */ url(style6.css?foo=15) /* Comment */; +@import url(style6.css?foo=16) /* Comment */ print and (orientation:landscape); +@import url(style6.css?foo=17)/* Comment */print and (orientation:landscape)/* Comment */; +@import /* Comment */ url(style6.css?foo=18) /* Comment */ print and (orientation:landscape); + +@import url(\\"./style8.css\\") screen and (min-width: 400px); +@import url(\\"./style8.css\\") (prefers-color-scheme: dark); +@import url(\\"./style8.css\\") supports(display: flex); +@import url(\\"./style8.css\\") supports(((display: flex))); +@import url(\\"./style8.css\\") supports(((display: inline-grid))) screen and (((min-width: 400px))); +@import url(\\"./style8.css\\") supports(display: flex); +@import url('./style8.css') supports(display: grid); +@import url(\\"./style8.css\\") supports(display: flex) screen and (min-width: 400px); +@import url(\\"./style8.css\\") layer(framework); +@import url(\\"./style8.css\\") layer(default); +@import url(\\"./style8.css\\") layer(base); +@import url(\\"./style8.css\\") layer(default) supports(display: flex); +@import url(\\"./style8.css\\") layer(default) supports(display: flex) screen and (min-width: 400px); + +/* anonymous */ +@import \\"style2.css\\" layer(); +@import \\"style2.css\\" layer; + +/* All unknown parse as media for compatibility */ +@import url(\\"./style9.css\\") unknown(default) unknown(display: flex) unknown; +@import url(\\"./style9.css\\") unknown(default); + +@import url(\\"./style10.css\\"); + +@import \\"./media-nested.css\\" screen and (min-width: 400px); +@import \\"./supports-nested.css\\" supports(display: flex); +@import \\"./layer-nested.css\\" layer(foo); +@import \\"./all-nested.css\\" layer(foo) supports(display: flex) screen and (min-width: 400px); +@import \\"./mixed-nested.css\\" screen and (min-width: 400px); +@import \\"./anonymous-nested.css\\" layer; +@import \\"./media-deep-deep-nested.css\\" screen and (orientation: portrait); +@import \\"./duplicate-nested.css\\" screen and (orientation: portrait); +@import \\"./anonymous-nested.css\\" supports(display: flex) screen and (orientation: portrait); +@import \\"./all-nested.css\\" layer(super.foo) supports(display: flex) screen and (min-width: 400px); + +/* Inside support */ + +@import url(\\"/style2.css?warning=6\\") supports(unknown: layer(super.foo)) screen and (min-width: 400px); +@import url(\\"/style2.css?warning=7\\") supports(url: url(\\"./unknown.css\\")) screen and (min-width: 400px); +@import url(\\"/style2.css?warning=8\\") supports(url: url(./unknown.css)) screen and (min-width: 400px); + +/** Possible syntax in future */ + +@import url(\\"/style2.css?foo=unknown\\") layer(super.foo) supports(display: flex) unknown(\\"foo\\") screen and (min-width: 400px); +@import url(\\"/style2.css?foo=unknown1\\") layer(super.foo) supports(display: url(\\"./unknown.css\\")) unknown(foo) screen and (min-width: 400px); +@import url(\\"/style2.css?foo=unknown2\\") layer(super.foo) supports(display: url(./unknown.css)) \\"foo\\" screen and (min-width: 400px); +@import \\"./style2.css?unknown3\\" \\"string\\"; + +/** Unknown */ + +@import-normalize; + +/** Warnings */ + +@import nourl(test.css); +@import ; +@import foo-bar; +@import layer(super.foo) \\"./style2.css?warning=1\\" supports(display: flex) screen and (min-width: 400px); +@import layer(super.foo) supports(display: flex) \\"./style2.css?warning=2\\" screen and (min-width: 400px); +@import layer(super.foo) supports(display: flex) screen and (min-width: 400px) \\"./style2.css?warning=3\\"; +@import layer(super.foo) url(\\"./style2.css?warning=4\\") supports(display: flex) screen and (min-width: 400px); +@import layer(super.foo) supports(display: flex) url(\\"./style2.css?warning=5\\") screen and (min-width: 400px); +@import layer(super.foo) supports(display: flex) screen and (min-width: 400px) url(\\"./style2.css?warning=6\\"); +@import url(\\"/style2.css?wrong-order-but-valid=6\\") supports(display: flex) layer(super.foo) screen and (min-width: 400px); +@namespace url(http://www.w3.org/1999/xhtml); +@import url(\\"./style2.css?after-namespace\\"); +@import supports(background: url(\\"./img.png\\")); +@import supports(background: url(\\"./img.png\\")) screen and (min-width: 400px); +@import layer(test) supports(background: url(\\"./img.png\\")) screen and (min-width: 400px); +@import screen and (min-width: 400px); + +@import url(./style2.css?multiple=1) url(./style2.css?multiple=2); +@import url(\\"./style2.css?multiple=3\\") url(\\"./style2.css?multiple=4\\"); +@import \\"./style2.css?strange=3\\" url(\\"./style2.css?multiple=4\\"); + +@import url(\\"external-1.css\\"); +@import url(\\"external-2.css\\") supports(display: grid) screen and (max-width: 400px); +@import url(\\"external-3.css\\") supports(not (display: grid) and (display: flex)) screen and (max-width: 400px); +@import url(\\"external-4.css\\") supports((selector(h2 > p)) and + (font-tech(color-COLRv1))); +@import url(external-5.css) layer(default); +@import url(external-6.css) layer(default); +@import url(\\"external-7.css\\") layer(); +@import url(\\"external-8.css\\") layer; +@import url(\\"external-9.css\\") print; +@import url(\\"external-10.css\\") print, screen; +@import url(\\"external-11.css\\") screen; +@import url(\\"external-12.css\\") screen and (orientation: landscape); +@import url(\\"external-13.css\\") supports(not (display: flex)); +@import url(\\"external-14.css\\") layer(default) supports(display: grid) screen and (max-width: 400px); + +@import url(\\"ignore.css\\"); +@import url(\\"list-of-media-queries.css\\"); +@import url(\\"/alias.css\\"); +@import url(\\"circular.css\\"); +/* FIXME */ +/*@import url(\\"webpackIgnore-order.css\\");*/ + +body { + background: red; +} + +", +] +`; + +exports[`ConfigTestCases css large exported tests should allow to create css modules: dev 1`] = ` +Object { + "placeholder": "my-app-_tailwind_module_css-placeholder-gray-700", +} +`; + +exports[`ConfigTestCases css large exported tests should allow to create css modules: prod 1`] = ` +Object { + "placeholder": "_144-Oh6j", +} +`; + +exports[`ConfigTestCases css local-ident-name exported tests should have correct local ident for css export locals 1`] = ` +Object { + "btn--info_is-disabled_1": "_style_module_css-btn--info_is-disabled_1", + "btn-info_is-disabled": "_style_module_css-btn-info_is-disabled", + "color-red": "--_style_module_css-color-red", + "foo": "bar", + "foo_bar": "_style_module_css-foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "_style_module_css-simple", +} +`; + +exports[`ConfigTestCases css local-ident-name exported tests should have correct local ident for css export locals 2`] = ` +Object { + "btn--info_is-disabled_1": "_2058b663514f2425ba48", + "btn-info_is-disabled": "_2aba8b96a0ac031f537a", + "color-red": "--_0de89cac8a4c2f23ed3a", + "foo": "bar", + "foo_bar": "_7d728a7a17547f118b8f", + "my-btn-info_is-disabled": "value", + "simple": "_0536cc02142c55d85df9", +} +`; + +exports[`ConfigTestCases css local-ident-name exported tests should have correct local ident for css export locals 3`] = ` +Object { + "btn--info_is-disabled_1": "_563acd9d8c57311eee97-btn--info_is-disabled_1", + "btn-info_is-disabled": "_563acd9d8c57311eee97-btn-info_is-disabled", + "color-red": "--_563acd9d8c57311eee97-color-red", + "foo": "bar", + "foo_bar": "_563acd9d8c57311eee97-foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "_563acd9d8c57311eee97-simple", +} +`; + +exports[`ConfigTestCases css local-ident-name exported tests should have correct local ident for css export locals 4`] = ` +Object { + "btn--info_is-disabled_1": "./style.module__btn--info_is-disabled_1", + "btn-info_is-disabled": "./style.module__btn-info_is-disabled", + "color-red": "--./style.module__color-red", + "foo": "bar", + "foo_bar": "./style.module__foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "./style.module__simple", +} +`; + +exports[`ConfigTestCases css local-ident-name exported tests should have correct local ident for css export locals 5`] = ` +Object { + "btn--info_is-disabled_1": "./style.module.css__btn--info_is-disabled_1", + "btn-info_is-disabled": "./style.module.css__btn-info_is-disabled", + "color-red": "--./style.module.css__color-red", + "foo": "bar", + "foo_bar": "./style.module.css__foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "./style.module.css__simple", +} +`; + +exports[`ConfigTestCases css local-ident-name exported tests should have correct local ident for css export locals 6`] = ` +Object { + "btn--info_is-disabled_1": "./style.module.css?q#f__btn--info_is-disabled_1", + "btn-info_is-disabled": "./style.module.css?q#f__btn-info_is-disabled", + "color-red": "--./style.module.css?q#f__color-red", + "foo": "bar", + "foo_bar": "./style.module.css?q#f__foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "./style.module.css?q#f__simple", +} +`; + +exports[`ConfigTestCases css local-ident-name exported tests should have correct local ident for css export locals 7`] = ` +Object { + "btn--info_is-disabled_1": "-_style_module_css_uniqueName-id-contenthash-b49b9b7fd945be4564a4", + "btn-info_is-disabled": "-_style_module_css_uniqueName-id-contenthash-2ec29062639f5c113084", + "color-red": "---_style_module_css_uniqueName-id-contenthash-f5073cf3e0954d246c7e", + "foo": "bar", + "foo_bar": "-_style_module_css_uniqueName-id-contenthash-71d31d18648cccfa9d17", + "my-btn-info_is-disabled": "value", + "simple": "-_style_module_css_uniqueName-id-contenthash-c93d824ddb3eb05477b2", +} +`; + +exports[`ConfigTestCases css local-ident-name exported tests should have correct local ident for css export locals 8`] = ` +Object { + "btn--info_is-disabled_1": "./style.module.less__btn--info_is-disabled_1", + "btn-info_is-disabled": "./style.module.less__btn-info_is-disabled", + "color-red": "--./style.module.less__color-red", + "foo": "bar", + "foo_bar": "./style.module.less__foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "./style.module.less__simple", +} +`; + +exports[`ConfigTestCases css local-ident-name exported tests should have correct local ident for css export locals 9`] = ` +Object { + "btn--info_is-disabled_1": "_style_module_css-btn--info_is-disabled_1", + "btn-info_is-disabled": "_style_module_css-btn-info_is-disabled", + "color-red": "--_style_module_css-color-red", + "foo": "bar", + "foo_bar": "_style_module_css-foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "_style_module_css-simple", +} +`; + +exports[`ConfigTestCases css local-ident-name exported tests should have correct local ident for css export locals 10`] = ` +Object { + "btn--info_is-disabled_1": "_2058b663514f2425ba48", + "btn-info_is-disabled": "_2aba8b96a0ac031f537a", + "color-red": "--_0de89cac8a4c2f23ed3a", + "foo": "bar", + "foo_bar": "_7d728a7a17547f118b8f", + "my-btn-info_is-disabled": "value", + "simple": "_0536cc02142c55d85df9", +} +`; + +exports[`ConfigTestCases css local-ident-name exported tests should have correct local ident for css export locals 11`] = ` +Object { + "btn--info_is-disabled_1": "_563acd9d8c57311eee97-btn--info_is-disabled_1", + "btn-info_is-disabled": "_563acd9d8c57311eee97-btn-info_is-disabled", + "color-red": "--_563acd9d8c57311eee97-color-red", + "foo": "bar", + "foo_bar": "_563acd9d8c57311eee97-foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "_563acd9d8c57311eee97-simple", +} +`; + +exports[`ConfigTestCases css local-ident-name exported tests should have correct local ident for css export locals 12`] = ` +Object { + "btn--info_is-disabled_1": "./style.module__btn--info_is-disabled_1", + "btn-info_is-disabled": "./style.module__btn-info_is-disabled", + "color-red": "--./style.module__color-red", + "foo": "bar", + "foo_bar": "./style.module__foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "./style.module__simple", +} +`; + +exports[`ConfigTestCases css local-ident-name exported tests should have correct local ident for css export locals 13`] = ` +Object { + "btn--info_is-disabled_1": "./style.module.css__btn--info_is-disabled_1", + "btn-info_is-disabled": "./style.module.css__btn-info_is-disabled", + "color-red": "--./style.module.css__color-red", + "foo": "bar", + "foo_bar": "./style.module.css__foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "./style.module.css__simple", +} +`; + +exports[`ConfigTestCases css local-ident-name exported tests should have correct local ident for css export locals 14`] = ` +Object { + "btn--info_is-disabled_1": "./style.module.css?q#f__btn--info_is-disabled_1", + "btn-info_is-disabled": "./style.module.css?q#f__btn-info_is-disabled", + "color-red": "--./style.module.css?q#f__color-red", + "foo": "bar", + "foo_bar": "./style.module.css?q#f__foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "./style.module.css?q#f__simple", +} +`; + +exports[`ConfigTestCases css local-ident-name exported tests should have correct local ident for css export locals 15`] = ` +Object { + "btn--info_is-disabled_1": "-_style_module_css_uniqueName-id-contenthash-b49b9b7fd945be4564a4", + "btn-info_is-disabled": "-_style_module_css_uniqueName-id-contenthash-2ec29062639f5c113084", + "color-red": "---_style_module_css_uniqueName-id-contenthash-f5073cf3e0954d246c7e", + "foo": "bar", + "foo_bar": "-_style_module_css_uniqueName-id-contenthash-71d31d18648cccfa9d17", + "my-btn-info_is-disabled": "value", + "simple": "-_style_module_css_uniqueName-id-contenthash-c93d824ddb3eb05477b2", +} +`; + +exports[`ConfigTestCases css local-ident-name exported tests should have correct local ident for css export locals 16`] = ` +Object { + "btn--info_is-disabled_1": "./style.module.less__btn--info_is-disabled_1", + "btn-info_is-disabled": "./style.module.less__btn-info_is-disabled", + "color-red": "--./style.module.less__color-red", + "foo": "bar", + "foo_bar": "./style.module.less__foo_bar", + "my-btn-info_is-disabled": "value", + "simple": "./style.module.less__simple", +} +`; + +exports[`ConfigTestCases css no-extra-runtime-in-js exported tests should compile 1`] = ` +Array [ + "/*!***********************!*\\\\ + !*** css ./style.css ***! + \\\\***********************/ +.class { + color: red; + background: + url(img.png), + url(img.png), + url(d4da020aedcd249a7a41.png); + url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=), + url(resource.png), + url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=), + url(7976064b7fcb4f6b3916.html), + url(https://example.com/img.png); +} + +.class-2 { + background: url(shared.png); +} + +.class-3 { + background: url(shared-external.png); +} + +.class-4 { + background: url(cde81354a9a8ce8d5f51.gif); +} + +.class-5 { + background: url(5649e83cc54c4b57bc28.png); +} + +", +] +`; + +exports[`ConfigTestCases css pseudo-import exported tests should compile 1`] = ` +Array [ + "/*!********************************!*\\\\ + !*** css ./export.modules.css ***! + \\\\********************************/ + +/*!*********************************!*\\\\ + !*** css ./library.modules.css ***! + \\\\*********************************/ + +/*!*******************************!*\\\\ + !*** css ./after.modules.css ***! + \\\\*******************************/ + +/*!********************************!*\\\\ + !*** css ./vars-1.modules.css ***! + \\\\********************************/ + +/*!*******************************!*\\\\ + !*** css ./style.modules.css ***! + \\\\*******************************/ + + +._style_modules_css-class { + color: red; + background: red; +} + + +._style_modules_css-class {background: red} + +._style_modules_css-class { + color: red; + color: red; + color: red; + color: red; +} + + +._style_modules_css-class { + color: red; +} + + +._style_modules_css-class { + color: red; +} + +/* TODO fix me */ +/*:import(\\"reexport.modules.css\\") { + primary-color: _my_color; +} + +.class {color: primary-color}*/ + + +._style_modules_css-class { + color: red, red, func() ; +} + +._style_modules_css-nest { + :import(\\"./export.modules.css\\") { + unknown: unknown; + } + + :export { + unknown: unknown; + } + + unknown: unknown; +} + +", + "/*!********************************!*\\\\ + !*** css ./export.modules.css ***! + \\\\********************************/ + +/*!*********************************!*\\\\ + !*** css ./library.modules.css ***! + \\\\*********************************/ + +/*!*******************************!*\\\\ + !*** css ./after.modules.css ***! + \\\\*******************************/ + +/*!********************************!*\\\\ + !*** css ./vars-1.modules.css ***! + \\\\********************************/ + +/*!*******************************!*\\\\ + !*** css ./style.modules.css ***! + \\\\*******************************/ + + +._style_modules_css-class { + color: red; + background: red; +} + + +._style_modules_css-class {background: red} + +._style_modules_css-class { + color: red; + color: red; + color: red; + color: red; +} + + +._style_modules_css-class { + color: red; +} + + +._style_modules_css-class { + color: red; +} + +/* TODO fix me */ +/*:import(\\"reexport.modules.css\\") { + primary-color: _my_color; +} + +.class {color: primary-color}*/ + + +._style_modules_css-class { + color: red, red, func() ; +} + +._style_modules_css-nest { + :import(\\"./export.modules.css\\") { + unknown: unknown; + } + + :export { + unknown: unknown; + } + + unknown: unknown; +} + +", +] +`; + +exports[`ConfigTestCases css pure-css exported tests should compile 1`] = ` +Array [ + "/*!***************************************************!*\\\\ + !*** css ../css-modules/at-rule-value.module.css ***! + \\\\***************************************************/ +@value my-red blue; + +.value-in-class { + color: my-red; +} + +@value v-comment-broken:; +@value v-comment-broken-v1:/* comment */; + +@value small: (max-width: 599px); + +@media small { + abbr:hover { + color: limegreen; + transition-duration: 1s; + } +} + +@value blue-v1: red; + +.foo { color: blue-v1; } + +@value blue-v3: red; + +.foo { + &.bar { color: blue-v3; } +} + +@value blue-v3: red; + +.foo { + @media (min-width: 1024px) { + &.bar { color: blue-v3; } + } +} + +@value blue-v4: red; + +.foo { + @media (min-width: 1024px) { + &.bar { + @media (min-width: 1024px) { + color: blue-v4; + } + } + } +} + +@value test-t: 40px; +@value test_q: 36px; + +.foo { height: test-t; height: test_q; } + +@value colorValue: red; + +.colorValue { + color: colorValue; +} + +@value colorValue-v1: red; + +#colorValue-v1 { + color: colorValue-v1; +} + +@value colorValue-v2: red; + +.colorValue-v2 > .colorValue-v2 { + color: colorValue-v2; +} + +@value colorValue-v3: .red; + +colorValue-v3 { + color: colorValue-v3; +} + +@value red-v2 from \\"./colors.module.css\\"; + +.export { + color: red-v2; +} + +@value blue-v1 as green from \\"./colors.module.css\\"; + +.foo { color: green; } + +@value blue-i, green-v2 from \\"./colors.module.css\\"; + +.foo { color: blue-i; } +.bar { color: green-v2 } + +@value red-v3 from colors; +@value colors: \\"./colors.module.css\\"; + +.foo { color: red-v3; } + +@value colors: \\"./colors.module.css\\"; +@value red-v4 from colors; + +.foo { color: red-v4; } + +@value aaa: red; +@value bbb: aaa; + +.class-a { color: bbb; } + +@value base: 10px; +@value large: calc(base * 2); + +.class-a { margin: large; } + +@value a from \\"./colors.module.css\\"; +@value b from \\"./colors.module.css\\"; + +.class-a { content: a b; } + +@value --red from \\"./colors.module.css\\"; + +.foo { color: --red; } + +@value named: red; +@value _3char #0f0; +@value _6char #00ff00; +@value rgba rgba(34, 12, 64, 0.3); +@value hsla hsla(220, 13.0%, 18.0%, 1); + +.foo { + color: named; + background-color: _3char; + border-top-color: _6char; + border-bottom-color: rgba; + outline-color: hsla; +} + +@value (blue-i, red-i) from \\"./colors.module.css\\"; + +.foo { color: red-i; } +.bar { color: blue-i } + +@value coolShadow: 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14) ; + +.foo { box-shadow: coolShadow; } + +@value func: color(red lightness(50%)); + +.foo { color: func; } + +@value v-color: red; + +:root { --color: v-color; } + +@value v-empty: ; + +:root { --color:v-empty; } + +@value v-empty-v2: ; + +:root { --color:v-empty-v2; } + +@value v-empty-v3: /* comment */; + +:root { --color:v-empty-v3; } + +@value override: blue; +@value override: red; + +.override { + color: override; +} + +@value (blue-v1 as my-name) from \\"./colors.module.css\\"; +@value (blue-v1 as my-name-again, red-v1) from \\"./colors.module.css\\"; + +.class { + color: my-name; + color: my-name-again; + color: red-v1; +} + +@value/* test */blue-v5/* test */:/* test */red/* test */; + +.color { + color: blue-v5; +} + +@value/* test */blue-v6/* test *//* test */red/* test */; + +.color { + color: blue-v6; +} + +@value coolShadow-v2 : 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14) ; + +.foo { box-shadow: coolShadow-v2; } + +@value /* test */ coolShadow-v3 /* test */ : 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14) ; + +.foo { box-shadow: coolShadow-v3; } + +@value /* test */ coolShadow-v4 /* test */ 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14) ; + +.foo { box-shadow: coolShadow-v4; } + +@value/* test */coolShadow-v5/* test */0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); + +.foo { box-shadow: coolShadow-v5; } + +@value/* test */coolShadow-v6/* test */:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); + +.foo { box-shadow: coolShadow-v6; } + +@value/* test */coolShadow-v7/* test */:/* test */0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); + +.foo { box-shadow: coolShadow-v7; } + +@value /* test */ test-v1 /* test */ from /* test */ \\"./colors.module.css\\" /* test */; + +.foo { color: test-v1; } + +@value/* test */test-v2/* test */from/* test */\\"./colors.module.css\\"/* test */; + +.foo { color: test-v2; } + +@value/* test */(/* test */blue/* test */as/* test */my-name-q/* test */)/* test */from/* test */\\"./colors.module.css\\"/* test */; + +.foo { color: my-name-q; } + +@value; +@value test; + +/*!**************************************************!*\\\\ + !*** css ../css-modules/var-function.module.css ***! + \\\\**************************************************/ +:root { + --main-bg-color: brown; + --my-var: red; + --my-background: blue; + --my-global: yellow; + --: \\"reserved\\"; + --a: green; +} + +.class { + color: var(--main-bg-color); +} + +@property --logo-color { + syntax: \\"\\"; + inherits: false; + initial-value: #c0ffee; +} + +@property -- { + syntax: \\"\\"; + inherits: false; + initial-value: #c0ffee; +} + +.class { + color: var(--logo-color); +} + +div { + background-color: var(--box-color); +} + +.two { + --box-color: cornflowerblue; +} + +.three { + --box-color: aquamarine; +} + + +.one { + /* Red if --my-var is not defined */ + color: var(--my-var, red); +} + +.two { + /* pink if --my-var and --my-background are not defined */ + color: var(--my-var, var(--my-background, pink)); +} + +.reserved { + color: var(--); +} + +.green { + color: var(--a); +} + +.global { + color: var(--my-global from global); +} + +.global-and-default { + color: var(--my-global from global, pink); +} + +.global-and-default-1 { + color: var(--my-global from global, var(--my-global-background from global)); +} + +.global-and-default-2 { + color: var(--my-global from global, var(--my-global-background from global, pink)); +} + +.global-and-default-3 { + color: var(--my-global from global, var(--my-background, pink)); +} + +.global-and-default-5 { + color: var( --my-global from global,var(--my-background,pink)); +} + +.global-and-default-6 { + background: var( --main-bg-color , var( --my-background , pink ) ) , var(--my-global from global); +} + +.global-and-default-7 { + background: var(--main-bg-color,var(--my-background,pink)),var(--my-global from global); +} + +.from { + color: var(--my-var-u1 from \\"./var-function-export.modules.css\\"); +} + +.from-1 { + color: var(--main-bg-color, var(--my-var-u1 from \\"./var-function-export.modules.css\\")); +} + +.from-2 { + color: var(--my-var-u1 from \\"./var-function-export.modules.css\\", var(--main-bg-color)); +} + +.from-3 { + color: var(--my-var-u1 from \\"./var-function-export.modules.css\\", var(--my-var-u2 from \\"./var-function-export.modules.css\\")); +} + +.from-4 { + color: var(--1 from \\"./var-function-export.modules.css\\"); +} + +.from-5 { + color: var(----a from \\"./var-function-export.modules.css\\"); +} + +.from-6 { + color: var(--main-bg-color from \\"./var-function-export.modules.css\\"); +} + +.mixed { + color: var(--my-var-u1 from \\"./var-function-export.modules.css\\", var(--my-global from global, var(--main-bg-color, red))); +} + +.broken { + color: var(--my-global from); +} + +.broken-1 { + color: var(--my-global from 1); +} + +:root { + --not-override-class: red; +} + +.not-override-class { + color: var(--not-override-class from \\"./var-function-export.modules.css\\") +} + +/*!*******************************************!*\\\\ + !*** css ../css-modules/style.module.css ***! + \\\\*******************************************/ + +.class { + color: red; +} + +.local1, +.local2 :global .global, +.local3 { + color: green; +} + +:global .global :local .local4 { + color: yellow; +} + +.local5:global(.global).local6 { + color: blue; +} + +.local7 div:not(.disabled, .mButtonDisabled, .tipOnly) { + pointer-events: initial !important; +} + +.local8 :is(div.parent1.child1.vertical-tiny, + div.parent1.child1.vertical-small, + div.otherDiv.horizontal-tiny, + div.otherDiv.horizontal-small div.description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +.local9 :matches(div.parent1.child1.vertical-tiny, + div.parent1.child1.vertical-small, + div.otherDiv.horizontal-tiny, + div.otherDiv.horizontal-small div.description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +.local10 :where(div.parent1.child1.vertical-tiny, + div.parent1.child1.vertical-small, + div.otherDiv.horizontal-tiny, + div.otherDiv.horizontal-small div.description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +.local11 div:has(.disabled, .mButtonDisabled, .tipOnly) { + pointer-events: initial !important; +} + +.local12 div:current(p, span) { + background-color: yellow; +} + +.local13 div:past(p, span) { + display: none; +} + +.local14 div:future(p, span) { + background-color: yellow; +} + +.local15 div:-moz-any(ol, ul, menu, dir) { + list-style-type: square; +} + +.local16 li:-webkit-any(:first-child, :last-child) { + background-color: aquamarine; +} + +.local9 :matches(div.parent1.child1.vertical-tiny, + div.parent1.child1.vertical-small, + div.otherDiv.horizontal-tiny, + div.otherDiv.horizontal-small div.description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +:global(:global(:local(.nested1)).nested2).nested3 { + color: pink; +} + +#ident { + color: purple; +} + +@keyframes localkeyframes { + 0% { + left: var(--pos1x); + top: var(--pos1y); + color: var(--theme-color1); + } + 100% { + left: var(--pos2x); + top: var(--pos2y); + color: var(--theme-color2); + } +} + +@keyframes localkeyframes2 { + 0% { + left: 0; + } + 100% { + left: 100px; + } +} + +.animation { + animation-name: localkeyframes; + animation: 3s ease-in 1s 2 reverse both paused localkeyframes, localkeyframes2; + --pos1x: 0px; + --pos1y: 0px; + --pos2x: 10px; + --pos2y: 20px; +} + +/* .composed { + composes: local1; + composes: local2; +} */ + +.vars { + color: var(--local-color); + --local-color: red; +} + +.globalVars :global { + color: var(--global-color); + --global-color: red; +} + +@media (min-width: 1600px) { + .wideScreenClass { + color: var(--local-color); + --local-color: green; + } +} + +@media screen and (max-width: 600px) { + .narrowScreenClass { + color: var(--local-color); + --local-color: purple; + } +} + +@supports (display: grid) { + .displayGridInSupports { + display: grid; + } +} + +@supports not (display: grid) { + .floatRightInNegativeSupports { + float: right; + } +} + +@supports (display: flex) { + @media screen and (min-width: 900px) { + .displayFlexInMediaInSupports { + display: flex; + } + } +} + +@media screen and (min-width: 900px) { + @supports (display: flex) { + .displayFlexInSupportsInMedia { + display: flex; + } + } +} + +@MEDIA screen and (min-width: 900px) { + @SUPPORTS (display: flex) { + .displayFlexInSupportsInMediaUpperCase { + display: flex; + } + } +} + +.animationUpperCase { + ANIMATION-NAME: localkeyframesUPPERCASE; + ANIMATION: 3s ease-in 1s 2 reverse both paused localkeyframesUPPERCASE, localkeyframes2UPPPERCASE; + --pos1x: 0px; + --pos1y: 0px; + --pos2x: 10px; + --pos2y: 20px; +} + +@KEYFRAMES localkeyframesUPPERCASE { + 0% { + left: VAR(--pos1x); + top: VAR(--pos1y); + color: VAR(--theme-color1); + } + 100% { + left: VAR(--pos2x); + top: VAR(--pos2y); + color: VAR(--theme-color2); + } +} + +@KEYframes localkeyframes2UPPPERCASE { + 0% { + left: 0; + } + 100% { + left: 100px; + } +} + +:GLOBAL .globalUpperCase :LOCAL .localUpperCase { + color: yellow; +} + +.VARS { + color: VAR(--LOCAL-COLOR); + --LOCAL-COLOR: red; +} + +.globalVarsUpperCase :GLOBAL { + COLOR: VAR(--GLOBAR-COLOR); + --GLOBAR-COLOR: red; +} + +@supports (top: env(safe-area-inset-top, 0)) { + .inSupportScope { + color: red; + } +} + +.a { + animation: 3s animationName; + -webkit-animation: 3s animationName; +} + +.b { + animation: animationName 3s; + -webkit-animation: animationName 3s; +} + +.c { + animation-name: animationName; + -webkit-animation-name: animationName; +} + +.d { + --animation-name: animationName; +} + +@keyframes animationName { + 0% { + background: white; + } + 100% { + background: red; + } +} + +@-webkit-keyframes animationName { + 0% { + background: white; + } + 100% { + background: red; + } +} + +@-moz-keyframes mozAnimationName { + 0% { + background: white; + } + 100% { + background: red; + } +} + +@counter-style thumbs { + system: cyclic; + symbols: \\"\\\\1F44D\\"; + suffix: \\" \\"; +} + +@font-feature-values Font One { + @styleset { + nice-style: 12; + } +} + +/* At-rule for \\"nice-style\\" in Font Two */ +@font-feature-values Font Two { + @styleset { + nice-style: 4; + } +} + +@property --my-color { + syntax: \\"\\"; + inherits: false; + initial-value: #c0ffee; +} + +@property --my-color-1 { + initial-value: #c0ffee; + syntax: \\"\\"; + inherits: false; +} + +@property --my-color-2 { + syntax: \\"\\"; + initial-value: #c0ffee; + inherits: false; +} + +.class { + color: var(--my-color); +} + +@layer utilities { + .padding-sm { + padding: 0.5rem; + } + + .padding-lg { + padding: 0.8rem; + } +} + +.class { + color: red; + + .nested-pure { + color: red; + } + + @media screen and (min-width: 200px) { + color: blue; + + .nested-media { + color: blue; + } + } + + @supports (display: flex) { + display: flex; + + .nested-supports { + display: flex; + } + } + + @layer foo { + background: red; + + .nested-layer { + background: red; + } + } + + @container foo { + background: red; + + .nested-layer { + background: red; + } + } +} + +.not-selector-inside { + color: #fff; + opacity: 0.12; + padding: .5px; + unknown: :local(.test); + unknown1: :local .test; + unknown2: :global .test; + unknown3: :global .test; + unknown4: .foo, .bar, #bar; +} + +@unknown :local .local :global .global { + color: red; +} + +@unknown :local(.local) :global(.global) { + color: red; +} + +.nested-var { + .again { + color: var(--local-color); + } +} + +.nested-with-local-pseudo { + color: red; + + :local .local-nested { + color: red; + } + + :global .global-nested { + color: red; + } + + :local(.local-nested) { + color: red; + } + + :global(.global-nested) { + color: red; + } + + :local .local-nested, :global .global-nested-next { + color: red; + } + + :local(.local-nested), :global(.global-nested-next) { + color: red; + } + + :global .foo, .bar { + color: red; + } +} + +#id-foo { + color: red; + + #id-bar { + color: red; + } +} + +.nested-parens { + .local9 div:has(.vertical-tiny, .vertical-small) { + max-height: 0; + margin: 0; + overflow: hidden; + } +} + +:global .global-foo { + .nested-global { + color: red; + } + + :local .local-in-global { + color: blue; + } +} + +@unknown .class { + color: red; + + .class { + color: red; + } +} + +:global .class :local .in-local-global-scope, +:global .class :local .in-local-global-scope, +:local .class-local-scope :global .in-local-global-scope { + color: red; +} + +@container (width > 400px) { + .class-in-container { + font-size: 1.5em; + } +} + +@container summary (min-width: 400px) { + @container (width > 400px) { + .deep-class-in-container { + font-size: 1.5em; + } + } +} + +:scope { + color: red; +} + +.placeholder-gray-700:-ms-input-placeholder { + --placeholder-opacity: 1; + color: #4a5568; + color: rgba(74, 85, 104, var(--placeholder-opacity)); +} +.placeholder-gray-700::-ms-input-placeholder { + --placeholder-opacity: 1; + color: #4a5568; + color: rgba(74, 85, 104, var(--placeholder-opacity)); +} +.placeholder-gray-700::placeholder { + --placeholder-opacity: 1; + color: #4a5568; + color: rgba(74, 85, 104, var(--placeholder-opacity)); +} + +:root { + --test: dark; +} + +@media screen and (prefers-color-scheme: var(--test)) { + .baz { + color: white; + } +} + +@keyframes slidein { + from { + margin-left: 100%; + width: 300%; + } + + to { + margin-left: 0%; + width: 100%; + } +} + +.class { + animation: + foo var(--animation-name) 3s, + var(--animation-name) 3s, + 3s linear 1s infinite running slidein, + 3s linear env(foo, var(--baz)) infinite running slidein; +} + +:root { + --baz: 10px; +} + +.class { + bar: env(foo, var(--baz)); +} + +:global .global-foo, :local .bar { + :local .local-in-global { + color: blue; + } + + @media screen { + :global .my-global-class-again, + :local .my-global-class-again { + color: red; + } + } +} + +.first-nested { + .first-nested-nested { + color: red; + } +} + +.first-nested-at-rule { + @media screen { + .first-nested-nested-at-rule-deep { + color: red; + } + } +} + +:global .again-global { + color:red; +} + +:global .again-again-global { + :global .again-again-global { + color: red; + } +} + +:root { + --foo: red; +} + +:global .again-again-global { + color: var(--foo); + + :global .again-again-global { + color: var(--foo); + } +} + +:global .again-again-global { + animation: slidein 3s; + + :global .again-again-global, .class, :global(:global(:local(.nested1)).nested2).nested3 { + animation: slidein 3s; + } + + .local2 :global .global, + .local3 { + color: red; + } +} + +@unknown var(--foo) { + color: red; +} + +.class { + .class { + .class { + .class {} + } + } +} + +.class { + .class { + .class { + .class { + animation: slidein 3s; + } + } + } +} + +.class { + animation: slidein 3s; + .class { + animation: slidein 3s; + .class { + animation: slidein 3s; + .class { + animation: slidein 3s; + } + } + } +} + +.broken { + . global(.class) { + color: red; + } + + : global(.class) { + color: red; + } + + : global .class { + color: red; + } + + : local(.class) { + color: red; + } + + : local .class { + color: red; + } + + # hash { + color: red; + } +} + +.comments { + :/** test */global(.class) { + color: red; + } + + :/** test */global .class { + color: red; + } + + :/** test */local(.class) { + color: red; + } + + :/** test */local .class { + color: red; + } + + ./** test **/class { + color: red; + } + + :local(./** test **/class) { + color: red; + } + + :local ./** test **/class { + color: red; + } +} + +.foo { + color: red; + + .bar + & { color: blue; } +} + +.error, #err-404 { + &:hover > .baz { color: red; } +} + +.foo { + & :is(.bar, &.baz) { color: red; } +} + +.qqq { + color: green; + & .a { color: blue; } + color: red; +} + +.parent { + color: blue; + + @scope (& > .scope) to (& > .limit) { + & .content { + color: red; + } + } +} + +.parent { + color: blue; + + @scope (& > .scope) to (& > .limit) { + .content { + color: red; + } + } + + .a { + color: red; + } +} + +@scope (.card) { + :scope { border-block-end: 1px solid white; } +} + +.card { + inline-size: 40ch; + aspect-ratio: 3/4; + + @scope (&) { + :scope { + border: 1px solid white; + } + } +} + +.foo { + display: grid; + + @media (orientation: landscape) { + .bar { + grid-auto-flow: column; + + @media (min-width > 1024px) { + .baz-1 { + display: grid; + } + + max-inline-size: 1024px; + + .baz-2 { + display: grid; + } + } + } + } +} + +@counter-style thumbs { + system: cyclic; + symbols: \\"\\\\1F44D\\"; + suffix: \\" \\"; +} + +ul { + list-style: thumbs; +} + +@container (width > 400px) and style(--responsive: true) { + .class { + font-size: 1.5em; + } +} +/* At-rule for \\"nice-style\\" in Font One */ +@font-feature-values Font One { + @styleset { + nice-style: 12; + } +} + +@font-palette-values --identifier { + font-family: Bixa; +} + +.my-class { + font-palette: --identifier; +} + +@keyframes foo { /* ... */ } +@keyframes \\"foo\\" { /* ... */ } +@keyframes { /* ... */ } +@keyframes{ /* ... */ } + +@supports (display: flex) { + @media screen and (min-width: 900px) { + article { + display: flex; + } + } +} + +@starting-style { + .class { + opacity: 0; + transform: scaleX(0); + } +} + +.class { + opacity: 1; + transform: scaleX(1); + + @starting-style { + opacity: 0; + transform: scaleX(0); + } +} + +@scope (.feature) { + .class { opacity: 0; } + + :scope .class-1 { opacity: 0; } + + & .class { opacity: 0; } +} + +@position-try --custom-left { + position-area: left; + width: 100px; + margin: 0 10px 0 0; +} + +@position-try --custom-bottom { + top: anchor(bottom); + justify-self: anchor-center; + margin: 10px 0 0 0; + position-area: none; +} + +@position-try --custom-right { + left: calc(anchor(right) + 10px); + align-self: anchor-center; + width: 100px; + position-area: none; +} + +@position-try --custom-bottom-right { + position-area: bottom right; + margin: 10px 0 0 10px; +} + +.infobox { + position: fixed; + position-anchor: --myAnchor; + position-area: top; + width: 200px; + margin: 0 0 10px 0; + position-try-fallbacks: + --custom-left, --custom-bottom, + --custom-right, --custom-bottom-right; +} + +@page { + size: 8.5in 9in; + margin-top: 4in; +} + +@color-profile --swop5c { + src: url(https://example.org/SWOP2006_Coated5v2.icc); +} + +.header { + background-color: color(--swop5c 0% 70% 20% 0%); +} + +.test { + test: (1, 2) [3, 4], { 1: 2}; + .a { + width: 200px; + } +} + +.test { + .test { + width: 200px; + } +} + +.test { + width: 200px; + + .test { + width: 200px; + } +} + +.test { + width: 200px; + + .test { + .test { + width: 200px; + } + } +} + +.test { + width: 200px; + + .test { + width: 200px; + + .test { + width: 200px; + } + } +} + +.test { + .test { + width: 200px; + + .test { + width: 200px; + } + } +} + +.test { + .test { + width: 200px; + } + width: 200px; +} + +.test { + .test { + width: 200px; + } + .test { + width: 200px; + } +} + +.test { + .test { + width: 200px; + } + width: 200px; + .test { + width: 200px; + } +} + +#test { + c: 1; + + #test { + c: 2; + } +} + +@property --item-size { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} + +.container { + display: flex; + height: 200px; + border: 1px dashed black; + + /* set custom property values on parent */ + --item-size: 20%; + --item-color: orange; +} + +.item { + width: var(--item-size); + height: var(--item-size); + background-color: var(--item-color); +} + +.two { + --item-size: initial; + --item-color: inherit; +} + +.three { + /* invalid values */ + --item-size: 1000px; + --item-color: xyz; +} + +@property invalid { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property{ + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} + +@keyframes \\"initial\\" { /* ... */ } +@keyframes/**test**/\\"initial\\" { /* ... */ } +@keyframes/**test**/\\"initial\\"/**test**/{ /* ... */ } +@keyframes/**test**//**test**/\\"initial\\"/**test**//**test**/{ /* ... */ } +@keyframes /**test**/ /**test**/ \\"initial\\" /**test**/ /**test**/ { /* ... */ } +@keyframes \\"None\\" { /* ... */ } +@property/**test**/--item-size { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property/**test**/--item-size/**test**/{ + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property /**test**/--item-size/**test**/ { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property /**test**/ --item-size /**test**/ { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property/**test**/ --item-size /**test**/{ + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +@property /**test**/ --item-size /**test**/ { + syntax: \\"\\"; + inherits: true; + initial-value: 40%; +} +div { + animation: 3s ease-in 1s 2 reverse both paused \\"initial\\", localkeyframes2; + animation-name: \\"initial\\"; + animation-duration: 2s; +} + +.item-1 { + width: var( --item-size ); + height: var(/**comment**/--item-size); + background-color: var( /**comment**/--item-color); + background-color-1: var(/**comment**/ --item-color); + background-color-2: var( /**comment**/ --item-color); + background-color-3: var( /**comment**/ --item-color /**comment**/ ); + background-color-3: var( /**comment**/--item-color/**comment**/ ); + background-color-3: var(/**comment**/--item-color/**comment**/); +} + +@keyframes/**test**/foo { /* ... */ } +@keyframes /**test**/foo { /* ... */ } +@keyframes/**test**/ foo { /* ... */ } +@keyframes /**test**/ foo { /* ... */ } +@keyframes /**test**//**test**/ foo { /* ... */ } +@keyframes /**test**/ /**test**/ foo { /* ... */ } +@keyframes /**test**/ /**test**/foo { /* ... */ } +@keyframes /**test**//**test**/foo { /* ... */ } +@keyframes/**test**//**test**/foo { /* ... */ } +@keyframes/**test**//**test**/foo/**test**//**test**/{ /* ... */ } +@keyframes /**test**/ /**test**/ foo /**test**/ /**test**/ { /* ... */ } + +./**test**//**test**/class { + background: red; +} + +./**test**/ /**test**/class { + background: red; +} + +.var { + --main-color: black; + --FOO: 10px; + --foo: 10px; + --bar: calc(var(--foo) + 10px); + --accent-background: linear-gradient(to top, var(--main-color), white); + --external-link: \\"test\\"; + --custom-prop: yellow; + --default-value: red; + --main-bg-color: red; + --backup-bg-color: black; + -foo: calc(var(--bar) + 10px); + var: var(--main-color); + var1: var(--foo); + var2: var(--FOO); + content: \\" (\\" var(--external-link) \\")\\"; + var3: var(--main-color, blue); + var4: var(--custom-prop,); + var5: var(--custom-prop, initial); + var6: var(--custom-prop, var(--default-value)); + var7: var(--custom-prop, var(--default-value, red)); + var8: var(--unknown); + background-color: var(--main-bg-color, var(--backup-bg-color, white)); +} + +.var-order { + background-color: var(--test); + --test: red; +} + + +/*!***********************!*\\\\ + !*** css ./style.css ***! + \\\\***********************/ + +.class { + color: red; + background: var(--color); +} + +@keyframes test { + 0% { + color: red; + } + 100% { + color: blue; + } +} + +:local(.class) { + color: red; +} + +:local .class { + color: green; +} + +:global(.class) { + color: blue; +} + +:global .class { + color: white; +} + +:export { + foo: bar; +} + +.class { + animation: test 1s, test; +} + +", +] +`; + +exports[`ConfigTestCases css url exported tests should work with URLs in CSS 1`] = ` +Array [ + "/*!************************!*\\\\ + !*** external \\"#test\\" ***! + \\\\************************/ +@import url(\\"#test\\"); +/*!************************!*\\\\ + !*** css ./nested.css ***! + \\\\************************/ + +.nested { + background: url(img.09a1a1112c577c279435.png); +} + +/*!***********************!*\\\\ + !*** css ./style.css ***! + \\\\***********************/ + +div { + a: url(img.09a1a1112c577c279435.png); +} + +div { + b: url(img.09a1a1112c577c279435.png); +} + +div { + c: url(img.09a1a1112c577c279435.png); +} + +div { + d: url(img.09a1a1112c577c279435.png#hash); +} + +div { + e: url( + img.09a1a1112c577c279435.png + ); +} + +div { + f: green url( img.09a1a1112c577c279435.png ) xyz; +} + +div { + g: green url( img.09a1a1112c577c279435.png ) xyz; +} + +div { + h: green url(img.09a1a1112c577c279435.png) xyz; +} + +div { + i: green url(img.09a1a1112c577c279435.png) url(img.09a1a1112c577c279435.png) xyz; +} + +div { + j: green url( img\\\\ img.09a1a1112c577c279435.png ) xyz; +} + +div { + k: green url( img\\\\ img.09a1a1112c577c279435.png ) xyz; +} + +div { + l: green url(img.09a1a1112c577c279435.png) xyz; +} + +div { + m: green url(img.09a1a1112c577c279435.png) xyz; +} + +div { + n: green url(img.09a1a1112c577c279435.png) xyz; +} + +div { + --foo: url(img.09a1a1112c577c279435.png); +} + +div { + a1: url(img.09a1a1112c577c279435.png); +} + +div { + a2: url(img.09a1a1112c577c279435.png); +} + +div { + a3: url(img.09a1a1112c577c279435.png); +} + +div { + a4: url(img.09a1a1112c577c279435.png#hash); +} + +div { + a5: url( + img.09a1a1112c577c279435.png + ); +} + +div { + a6: green url( img.09a1a1112c577c279435.png ) xyz; +} + +div { + a7: green url( img.09a1a1112c577c279435.png ) xyz; +} + +div { + a8: green url(img.09a1a1112c577c279435.png) xyz; +} + +div { + a9: green url(img.09a1a1112c577c279435.png) url(other-img.09a1a1112c577c279435.png) xyz; +} + +div { + a10: green url( img\\\\ img.09a1a1112c577c279435.png ) xyz; +} + +div { + a11: green url( img\\\\ img.09a1a1112c577c279435.png ) xyz; +} + +div { + a12: green url(img.09a1a1112c577c279435.png) xyz; +} + +div { + a13: green url(data:image/png;base64,AAA) url(http://example.com/image.jpg) url(//example.com/image.png) xyz; +} + +div { + a14: url(\\"data:image/svg+xml;charset=utf-8,\\"); +} + +div { + a15: url(data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2042%2026%27%20fill%3D%27%2523007aff%27%3E%3Crect%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%271%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2711%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2712%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2722%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2723%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3C%2Fsvg%3E); +} + +div { + a16: url('data:image/svg+xml;charset=utf-8,#filter'); +} + +div { + a17: url(\\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%5C%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%5C%22%3E%3Cfilter%20id%3D%5C%22filter%5C%22%3E%3CfeGaussianBlur%20in%3D%5C%22SourceAlpha%5C%22%20stdDeviation%3D%5C%220%5C%22%20%2F%3E%3CfeOffset%20dx%3D%5C%221%5C%22%20dy%3D%5C%222%5C%22%20result%3D%5C%22offsetblur%5C%22%20%2F%3E%3CfeFlood%20flood-color%3D%5C%22rgba(255%2C255%2C255%2C1)%5C%22%20%2F%3E%3CfeComposite%20in2%3D%5C%22offsetblur%5C%22%20operator%3D%5C%22in%5C%22%20%2F%3E%3CfeMerge%3E%3CfeMergeNode%20%2F%3E%3CfeMergeNode%20in%3D%5C%22SourceGraphic%5C%22%20%2F%3E%3C%2FfeMerge%3E%3C%2Ffilter%3E%3C%2Fsvg%3E%23filter\\"); +} + +div { + a18: url(#highlight); +} + +div { + a19: url(#line-marker); +} + +@font-face { + a20: url(font.31d6cfe0d16ae931b73c.woff) format('woff'), + url(font.31d6cfe0d16ae931b73c.woff2) format('woff2'), + url(font.31d6cfe0d16ae931b73c.eot) format('eot'), + url(font.31d6cfe0d16ae931b73c.ttf) format('truetype'), + url(\\"font with spaces.31d6cfe0d16ae931b73c.eot\\") format(\\"embedded-opentype\\"), + url(font.31d6cfe0d16ae931b73c.svg#svgFontName) format('svg'), + url(font.31d6cfe0d16ae931b73c.woff2?foo=bar) format('woff2'), + url(font.31d6cfe0d16ae931b73c.eot?#iefix) format('embedded-opentype'), + url(\\"font with spaces.31d6cfe0d16ae931b73c.eot?#iefix\\") format('embedded-opentype'); +} + +@media (min-width: 500px) { + div { + a21: url(img.09a1a1112c577c279435.png); + } +} + +div { + a22: \\"do not use url(path)\\"; +} + +div { + a23: 'do not \\"use\\" url(path)'; +} + +div { + a24: -webkit-image-set(url(img1x.09a1a1112c577c279435.png) 1x, url(img2x.09a1a1112c577c279435.png) 2x) +} + +div { + a25: image-set(url(img1x.09a1a1112c577c279435.png) 1x, url(img2x.09a1a1112c577c279435.png) 2x) +} + +div { + a26: green url() xyz; +} + +div { + a27: green url('') xyz; +} + +div { + a28: green url(\\"\\") xyz; +} + +div { + a29: green url(' ') xyz; +} + +div { + a30: green url( + ) xyz; +} + +div { + a40: green url(https://raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz; +} + +div { + a41: green url(//raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz; +} + +div { + a42: url(img.09a1a1112c577c279435.png?foo); +} + +div { + a43: url(img.09a1a1112c577c279435.png?foo=bar); +} + +div { + a44: url(img.09a1a1112c577c279435.png?foo=bar#hash); +} + +div { + a45: url(img.09a1a1112c577c279435.png?foo=bar#hash); +} + +div { + a46: url(img.09a1a1112c577c279435.png?); +} + +div { + a47: url(img.09a1a1112c577c279435.png) url(\\"data:image/svg+xml;charset=utf-8,\\") url(img.09a1a1112c577c279435.png); +} + +div { + a48: __URL__(); +} + +div { + a49: url(img-simple.09a1a1112c577c279435.png); +} + +div { + a50: url(img-simple.09a1a1112c577c279435.png); +} + +div { + a51: url(img-simple.09a1a1112c577c279435.png); +} + +div { + a52: url(img.09a1a1112c577c279435.png); +} + +div { + a53: url(img.09a1a1112c577c279435.png); +} + +@font-face { + a54: url(//at.alicdn.com/t/font_515771_emcns5054x3whfr.eot); +} + +div { + a55: -webkit-image-set(); + a56: -webkit-image-set(''); + a56: image-set(); + a58: image-set(''); + a59: image-set(\\"\\"); + a60: image-set(\\"\\" 1x); + a61: image-set(url()); + a62: image-set( + url() + ); + a63: image-set(URL()); + a64: image-set(url('')); + a65: image-set(url(\\"\\")); + a66: image-set(url('') 1x); + a67: image-set(1x); + a68: image-set( + 1x + ); + a69: image-set(calc(1rem + 1px) 1x); + + a70: -webkit-image-set(url(img1x.09a1a1112c577c279435.png) 1x, url(img2x.09a1a1112c577c279435.png) 2x); + a71: image-set(url(img1x.09a1a1112c577c279435.png) 1x); + a72: image-set(url(img1x.09a1a1112c577c279435.png) 1x, url(img2x.09a1a1112c577c279435.png) 2x); + a73: image-set(url(img\\\\ img.09a1a1112c577c279435.png) 1x, url(img\\\\ img.09a1a1112c577c279435.png) 2x); + a74: image-set(url(img1x.09a1a1112c577c279435.png) 1x, url(img2x.09a1a1112c577c279435.png) 2x), + image-set(url(img1x.09a1a1112c577c279435.png) 1x, url(img2x.09a1a1112c577c279435.png) 2x); + a75: image-set( + url(img1x.09a1a1112c577c279435.png) 1x, + url(img2x.09a1a1112c577c279435.png) 2x, + url(img3x.09a1a1112c577c279435.png) 600dpi + ); + a76: image-set(url(img1x.09a1a1112c577c279435.png?foo=bar) 1x); + a77: image-set(url(img1x.09a1a1112c577c279435.png#hash) 1x); + a78: image-set(url(img1x.09a1a1112c577c279435.png?#iefix) 1x); + + a79: -webkit-image-set(url(img1x.09a1a1112c577c279435.png) 1x, url(img2x.09a1a1112c577c279435.png) 2x); + a80: -webkit-image-set(url(img1x.09a1a1112c577c279435.png) 1x); + a81: -webkit-image-set( + url(img1x.09a1a1112c577c279435.png) 1x + ); + a82: image-set(url(img1x.09a1a1112c577c279435.png) 1x); + a83: image-set( + url(img1x.09a1a1112c577c279435.png) 1x + ); + a84: image-set(url(img1x.09a1a1112c577c279435.png) 1x, url(img2x.09a1a1112c577c279435.png) 2x); + a85: image-set( + url(img1x.09a1a1112c577c279435.png) 1x, + url(img2x.09a1a1112c577c279435.png) 2x, + url(img3x.09a1a1112c577c279435.png) 600dpi + ); + a86: image-set(url(img\\\\ img.09a1a1112c577c279435.png) 1x, url(img\\\\ img.09a1a1112c577c279435.png) 2x); + + a87: image-set(url(img1x.09a1a1112c577c279435.png) 1x, url(img2x.09a1a1112c577c279435.png) 2x); +} + +div { + a88: url(imgimg.09a1a1112c577c279435.png); + a89: url(img\\\\'img.09a1a1112c577c279435.png); + a90: url(img\\\\'\\\\'\\\\'img.09a1a1112c577c279435.png); + a91: url(img\\\\(img.09a1a1112c577c279435.png); + a92: url(img\\\\)img.09a1a1112c577c279435.png); + a93: url(img\\\\ img.09a1a1112c577c279435.png); + a94: url(\\"img'() img.09a1a1112c577c279435.png\\"); + + a95: image-set( + url(imgimg.09a1a1112c577c279435.png) 1x, + url(img\\\\'\\\\'\\\\'img.09a1a1112c577c279435.png) 2x, + url(img\\\\'img.09a1a1112c577c279435.png) 3x, + url(img\\\\(img.09a1a1112c577c279435.png) 4x, + url(img\\\\)img.09a1a1112c577c279435.png) 5x, + url(img\\\\ img.09a1a1112c577c279435.png) 6x, + url(\\"img'() img.09a1a1112c577c279435.png\\") 7x + ); +} + +div { + a96: url(img\\\\'\\\\'\\\\'img.09a1a1112c577c279435.png); + a97: url(\\"img'() img.09a1a1112c577c279435.png\\"); + a98: url(img\\\\'img.09a1a1112c577c279435.png); + a99: url(img\\\\(img.09a1a1112c577c279435.png); + a100: url(img\\\\)img.09a1a1112c577c279435.png); + a101: url(img\\\\ img.09a1a1112c577c279435.png); + a102: url(img\\\\ img.09a1a1112c577c279435.png); +} + +div { + a103: url(img\\\\(img.09a1a1112c577c279435.png); + a104: url(img\\\\(img.09a1a1112c577c279435.png); + a105: url(img\\\\(img.09a1a1112c577c279435.png); + a106: url(img\\\\(img.09a1a1112c577c279435.png); +} + +div { + a107: url(img\\\\'\\\\'\\\\'img.09a1a1112c577c279435.png); + a108: url(\\"img'() img.09a1a1112c577c279435.png\\"); + a109: url(img\\\\'img.09a1a1112c577c279435.png); + a110: url(img\\\\(img.09a1a1112c577c279435.png); + a111: url(img\\\\)img.09a1a1112c577c279435.png); + a112: url(img\\\\ img.09a1a1112c577c279435.png); + a113: url(img\\\\'\\\\'\\\\'img.09a1a1112c577c279435.png); + a114: url(\\"img'() img.09a1a1112c577c279435.png\\"); + a115: url(img\\\\'img.09a1a1112c577c279435.png); + a116: url(img\\\\(img.09a1a1112c577c279435.png); + a117: url(img\\\\)img.09a1a1112c577c279435.png); + a118: url(img\\\\ img.09a1a1112c577c279435.png); +} + +div { + a119: url(img.09a1a1112c577c279435.png); +} + +div { + a120: url(img\\\\'\\\\'\\\\'img.09a1a1112c577c279435.png); + a121: url(\\"img'() img.09a1a1112c577c279435.png\\"); + a122: url(img\\\\'img.09a1a1112c577c279435.png); + a123: url(img\\\\(img.09a1a1112c577c279435.png); + a124: url(img\\\\)img.09a1a1112c577c279435.png); + a125: url(img\\\\ img.09a1a1112c577c279435.png); + a126: url(img.09a1a1112c577c279435.png); + a127: url(img.09a1a1112c577c279435.png); + a128: url(img\\\\'img.09a1a1112c577c279435.png); + a129: url(\\"img'() img.09a1a1112c577c279435.png\\"); + a130: url(\\"img'() img.09a1a1112c577c279435.png\\"); +} + +div { + a131: url(img.09a1a1112c577c279435.png); + a132: url(img.09a1a1112c577c279435.png); + + a133: url(img.09a1a1112c577c279435.png?foo=bar); + a134: url(img.09a1a1112c577c279435.png?foo=bar); + + a135: url(img.09a1a1112c577c279435.png?foo=bar#hash); + a136: url(img.09a1a1112c577c279435.png?foo=bar#hash); + + a137: url(img.09a1a1112c577c279435.png?foo=bar); + a138: url(img.09a1a1112c577c279435.png?bar=foo); + + a139: url(img.09a1a1112c577c279435.png?foo=bar#foo); + a140: url(img.09a1a1112c577c279435.png?bar=foo#bar); + + a141: url(img.09a1a1112c577c279435.png?foo=1&bar=2); + a142: url(img.09a1a1112c577c279435.png?foo=2&bar=1); +} + +div { + a143: url(data:image/svg+xml;charset=UTF-8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20width%3D%22191px%22%20height%3D%22191px%22%20viewBox%3D%220%200%20191%20191%22%20enable-background%3D%22new%200%200%20191%20191%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M95.5%2C0C42.8%2C0%2C0%2C42.8%2C0%2C95.5S42.8%2C191%2C95.5%2C191S191%2C148.2%2C191%2C95.5S148.2%2C0%2C95.5%2C0z%20M95.5%2C187.6%0A%09c-50.848%2C0-92.1-41.25-92.1-92.1c0-50.848%2C41.252-92.1%2C92.1-92.1c50.85%2C0%2C92.1%2C41.252%2C92.1%2C92.1%0A%09C187.6%2C146.35%2C146.35%2C187.6%2C95.5%2C187.6z%22%2F%3E%0A%3Cg%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M92.9%2C10v8.6H91v-6.5c-0.1%2C0.1-0.2%2C0.2-0.4%2C0.3c-0.2%2C0.1-0.3%2C0.2-0.4%2C0.2c-0.1%2C0-0.3%2C0.1-0.5%2C0.2%0A%09%09c-0.2%2C0.1-0.3%2C0.1-0.5%2C0.1v-1.6c0.5-0.1%2C0.9-0.3%2C1.4-0.5c0.5-0.2%2C0.8-0.5%2C1.2-0.7h1.1V10z%22%2F%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M97.1%2C17.1h3.602v1.5h-5.6V18c0-0.4%2C0.1-0.8%2C0.2-1.2c0.1-0.4%2C0.3-0.6%2C0.5-0.9c0.2-0.3%2C0.5-0.5%2C0.7-0.7%0A%09%09c0.2-0.2%2C0.5-0.4%2C0.7-0.6c0.199-0.2%2C0.5-0.3%2C0.6-0.5c0.102-0.2%2C0.301-0.3%2C0.5-0.5c0.2-0.2%2C0.2-0.3%2C0.301-0.5%0A%09%09c0.101-0.2%2C0.101-0.3%2C0.101-0.5c0-0.4-0.101-0.6-0.3-0.8c-0.2-0.2-0.4-0.3-0.801-0.3c-0.699%2C0-1.399%2C0.3-2.101%2C0.9v-1.6%0A%09%09c0.7-0.5%2C1.5-0.7%2C2.5-0.7c0.399%2C0%2C0.8%2C0.1%2C1.101%2C0.2c0.301%2C0.1%2C0.601%2C0.3%2C0.899%2C0.5c0.3%2C0.2%2C0.399%2C0.5%2C0.5%2C0.8%0A%09%09c0.101%2C0.3%2C0.2%2C0.6%2C0.2%2C1s-0.102%2C0.7-0.2%2C1c-0.099%2C0.3-0.3%2C0.6-0.5%2C0.8c-0.2%2C0.2-0.399%2C0.5-0.7%2C0.7c-0.3%2C0.2-0.5%2C0.4-0.8%2C0.6%0A%09%09c-0.2%2C0.1-0.399%2C0.3-0.5%2C0.4s-0.3%2C0.3-0.5%2C0.4s-0.2%2C0.3-0.3%2C0.4C97.1%2C17%2C97.1%2C17%2C97.1%2C17.1z%22%2F%3E%0A%3C%2Fg%3E%0A%3Cg%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M15%2C95.4c0%2C0.7-0.1%2C1.4-0.2%2C2c-0.1%2C0.6-0.4%2C1.1-0.7%2C1.5C13.8%2C99.3%2C13.4%2C99.6%2C12.9%2C99.8s-1%2C0.3-1.5%2C0.3%0A%09%09c-0.7%2C0-1.3-0.1-1.8-0.3v-1.5c0.4%2C0.3%2C1%2C0.4%2C1.6%2C0.4c0.6%2C0%2C1.1-0.2%2C1.5-0.7c0.4-0.5%2C0.5-1.1%2C0.5-1.9l0%2C0%0A%09%09C12.8%2C96.7%2C12.3%2C96.9%2C11.5%2C96.9c-0.3%2C0-0.7-0.102-1-0.2c-0.3-0.101-0.5-0.3-0.8-0.5c-0.3-0.2-0.4-0.5-0.5-0.8%0A%09%09c-0.1-0.3-0.2-0.7-0.2-1c0-0.4%2C0.1-0.8%2C0.2-1.2c0.1-0.4%2C0.3-0.7%2C0.6-0.9c0.3-0.2%2C0.6-0.5%2C0.9-0.6c0.3-0.1%2C0.8-0.2%2C1.2-0.2%0A%09%09c0.5%2C0%2C0.9%2C0.1%2C1.2%2C0.3c0.3%2C0.2%2C0.7%2C0.4%2C0.9%2C0.8s0.5%2C0.7%2C0.6%2C1.2S15%2C94.8%2C15%2C95.4z%20M13.1%2C94.4c0-0.2%2C0-0.4-0.1-0.6%0A%09%09c-0.1-0.2-0.1-0.4-0.2-0.5c-0.1-0.1-0.2-0.2-0.4-0.3c-0.2-0.1-0.3-0.1-0.5-0.1c-0.2%2C0-0.3%2C0-0.4%2C0.1s-0.3%2C0.2-0.3%2C0.3%0A%09%09c0%2C0.1-0.2%2C0.3-0.2%2C0.4c0%2C0.1-0.1%2C0.4-0.1%2C0.6c0%2C0.2%2C0%2C0.4%2C0.1%2C0.6c0.1%2C0.2%2C0.1%2C0.3%2C0.2%2C0.4c0.1%2C0.1%2C0.2%2C0.2%2C0.4%2C0.3%0A%09%09c0.2%2C0.1%2C0.3%2C0.1%2C0.5%2C0.1c0.2%2C0%2C0.3%2C0%2C0.4-0.1s0.2-0.2%2C0.3-0.3c0.1-0.1%2C0.2-0.2%2C0.2-0.4C13%2C94.7%2C13.1%2C94.6%2C13.1%2C94.4z%22%2F%3E%0A%3C%2Fg%3E%0A%3Cg%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M176%2C99.7V98.1c0.6%2C0.4%2C1.2%2C0.602%2C2%2C0.602c0.5%2C0%2C0.8-0.102%2C1.1-0.301c0.301-0.199%2C0.4-0.5%2C0.4-0.801%0A%09%09c0-0.398-0.2-0.699-0.5-0.898c-0.3-0.2-0.8-0.301-1.3-0.301h-0.802V95h0.701c1.101%2C0%2C1.601-0.4%2C1.601-1.1c0-0.7-0.4-1-1.302-1%0A%09%09c-0.6%2C0-1.1%2C0.2-1.6%2C0.5v-1.5c0.6-0.3%2C1.301-0.4%2C2.1-0.4c0.9%2C0%2C1.5%2C0.2%2C2%2C0.6s0.701%2C0.9%2C0.701%2C1.5c0%2C1.1-0.601%2C1.8-1.701%2C2.1l0%2C0%0A%09%09c0.602%2C0.1%2C1.102%2C0.3%2C1.4%2C0.6s0.5%2C0.8%2C0.5%2C1.3c0%2C0.801-0.3%2C1.4-0.9%2C1.9c-0.6%2C0.5-1.398%2C0.7-2.398%2C0.7%0A%09%09C177.2%2C100.1%2C176.5%2C100%2C176%2C99.7z%22%2F%3E%0A%3C%2Fg%3E%0A%3Cg%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M98.5%2C179.102c0%2C0.398-0.1%2C0.799-0.2%2C1.199C98.2%2C180.7%2C98%2C181%2C97.7%2C181.2s-0.601%2C0.5-0.9%2C0.601%0A%09%09c-0.3%2C0.1-0.7%2C0.199-1.2%2C0.199c-0.5%2C0-0.9-0.1-1.3-0.3c-0.4-0.2-0.7-0.399-0.9-0.8c-0.2-0.4-0.5-0.7-0.6-1.2%0A%09%09c-0.1-0.5-0.2-1-0.2-1.601c0-0.699%2C0.1-1.399%2C0.3-2c0.2-0.601%2C0.4-1.101%2C0.8-1.5c0.4-0.399%2C0.7-0.699%2C1.2-1c0.5-0.3%2C1-0.3%2C1.6-0.3%0A%09%09c0.6%2C0%2C1.2%2C0.101%2C1.5%2C0.199v1.5c-0.4-0.199-0.9-0.399-1.4-0.399c-0.3%2C0-0.6%2C0.101-0.8%2C0.2c-0.2%2C0.101-0.5%2C0.3-0.7%2C0.5%0A%09%09c-0.2%2C0.199-0.3%2C0.5-0.4%2C0.8c-0.1%2C0.301-0.2%2C0.7-0.2%2C1.101l0%2C0c0.4-0.601%2C1-0.8%2C1.8-0.8c0.3%2C0%2C0.7%2C0.1%2C0.9%2C0.199%0A%09%09c0.2%2C0.101%2C0.5%2C0.301%2C0.7%2C0.5c0.199%2C0.2%2C0.398%2C0.5%2C0.5%2C0.801C98.5%2C178.2%2C98.5%2C178.7%2C98.5%2C179.102z%20M96.7%2C179.2%0A%09%09c0-0.899-0.4-1.399-1.1-1.399c-0.2%2C0-0.3%2C0-0.5%2C0.1c-0.2%2C0.101-0.3%2C0.201-0.4%2C0.301c-0.1%2C0.101-0.2%2C0.199-0.2%2C0.4%0A%09%09c0%2C0.199-0.1%2C0.299-0.1%2C0.5c0%2C0.199%2C0%2C0.398%2C0.1%2C0.6s0.1%2C0.3%2C0.2%2C0.5c0.1%2C0.199%2C0.2%2C0.199%2C0.4%2C0.3c0.2%2C0.101%2C0.3%2C0.101%2C0.5%2C0.101%0A%09%09c0.2%2C0%2C0.3%2C0%2C0.5-0.101c0.2-0.101%2C0.301-0.199%2C0.301-0.3c0-0.1%2C0.199-0.301%2C0.199-0.399C96.6%2C179.7%2C96.7%2C179.4%2C96.7%2C179.2z%22%2F%3E%0A%3C%2Fg%3E%0A%3Ccircle%20fill%3D%22%23636363%22%20cx%3D%2295%22%20cy%3D%2295%22%20r%3D%227%22%2F%3E%0A%3C%2Fsvg%3E%0A) 50% 50%/191px no-repeat; +} + +div { + a144: url(img.09a1a1112c577c279435.png); +} + +div { + a145: url(img.09a1a1112c577c279435.png); +} + +div { + /* TODO fix me */ + /*a146: url('./img.png', 'foo', './img.png', url('./img.png'));*/ + /*a147: image-set(url('./img.png', 'foo', './img.png', url('./img.png')) 1x, url(\\"./img2x.png\\") 2x);*/ +} + +div { + a148: url('data:image/svg+xml,%3Csvg xmlns=\\"http://www.w3.org/2000/svg\\"%3E%3Crect width=\\"100%25\\" height=\\"100%25\\" style=\\"stroke: rgb(223,224,225); stroke-width: 2px; fill: none; stroke-dasharray: 6px 3px\\" /%3E%3C/svg%3E'); + a149: url('data:image/svg+xml,%3Csvg xmlns=\\"http://www.w3.org/2000/svg\\"%3E%3Crect width=\\"100%25\\" height=\\"100%25\\" style=\\"stroke: rgb(223,224,225); stroke-width: 2px; fill: none; stroke-dasharray: 6px 3px\\" /%3E%3C/svg%3E'); + a150: url('data:image/svg+xml,%3Csvg xmlns=\\"http://www.w3.org/2000/svg\\"%3E%3Crect width=\\"100%25\\" height=\\"100%25\\" style=\\"stroke: rgb(223,224,225); stroke-width: 2px; fill: none; stroke-dasharray: 6px 3px\\" /%3E%3C/svg%3E'); + a151: url('data:image/svg+xml;utf8,'); + a152: url('data:image/svg+xml;utf8,'); +} + +div { + a152: url(img.09a1a1112c577c279435.png); +} + +div { + a153: url(img.09a1a1112c577c279435.png); +} + +div { + a154: url(other.09a1a1112c577c279435.png); +} + +div { + a155: url(img.09a1a1112c577c279435.png); +} + +div { + a156: url(\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e\\"); +} + +div { + a157: url('data:image/svg+xml;utf8,'); +} + +div { + a158: src(http://www.example.com/pinkish.gif); + --foo-bar: \\"http://www.example.com/pinkish.gif\\"; + a159: src(var(--foo)); +} + +div { + a160: url(img.09a1a1112c577c279435.png param(--color var(--primary-color))); + a161: src(img.09a1a1112c577c279435.png param(--color var(--primary-color))); +} + +div { + a162: url(img\\\\ img.09a1a1112c577c279435.png); + +} + +div { + a163: url(img.09a1a1112c577c279435.png); +} + + +div { + a164: url( img.png bug); +} + +div { + a165: url(imgn.09a1a1112c577c279435.png); +} + +div { + a166: url('data:image/svg+xml;utf8,'); +} + +div { + a167: url(http://example.com/image.jpg); + a168: url(http://example.com/image.jpg); +} + +div { + a169: url(data:,); + a170: url(data:,); +} + +div { + a171: image(ltr 'img.png#xywh=0,0,16,16', red); + a172: cross-fade(20% url(img.09a1a1112c577c279435.png), url(img.09a1a1112c577c279435.png)) +} + +div { + a172: image-set( + linear-gradient(blue, white) 1x, + linear-gradient(blue, green) 2x + ); + a173: image-set( + url(img.09a1a1112c577c279435.png) type(\\"image/png\\"), + url(img.09a1a1112c577c279435.png) type(\\"image/png\\") + ); + a174: image-set( + url(img.09a1a1112c577c279435.png) 1x, + url(img.09a1a1112c577c279435.png) 2x + ); + a175: image-set( + url(img.09a1a1112c577c279435.png) 1x, + url(img.09a1a1112c577c279435.png) 2x, + url(img.09a1a1112c577c279435.png) 3x + ); + a176: image-set( + url(img.09a1a1112c577c279435.png) type(\\"image/png\\"), + url(img.09a1a1112c577c279435.png) type(\\"image/png\\") + ) \\"img.png\\"; + a177: image-set( + url(img.09a1a1112c577c279435.png) 1x type(\\"image/png\\"), + url(img.09a1a1112c577c279435.png) 2x type(\\"image/png\\") + ); + a178: image-set( + url(img.09a1a1112c577c279435.png) type(\\"image/png\\") 1x, + url(img.09a1a1112c577c279435.png) type(\\"image/png\\") 2x + ); + a179: -webkit-image-set( + url(img.09a1a1112c577c279435.png) 1x + ); + a180: -webkit-image-set( + url(img.09a1a1112c577c279435.png var(--foo, \\"test.png\\")) 1x + ); +} + +div { + a181: src(img.09a1a1112c577c279435.png); + a181: src( img.09a1a1112c577c279435.png ); + a182: src(img.09a1a1112c577c279435.png); + a183: src(img.09a1a1112c577c279435.png var(--foo, \\"test.png\\")); + a184: src(var(--foo, \\"test.png\\")); + a185: src(img.09a1a1112c577c279435.png); +} + +div { + a186: image-set(url(img.09a1a1112c577c279435.png)1x,url(img.09a1a1112c577c279435.png)2x,url(img.09a1a1112c577c279435.png)3x); + a187: image-set(url(img.09a1a1112c577c279435.png)1x,url(img.09a1a1112c577c279435.png)2x,url(img.09a1a1112c577c279435.png)3x); + a188: image-set(url(img.09a1a1112c577c279435.png)1x,url(img.09a1a1112c577c279435.png)2x,url(img.09a1a1112c577c279435.png)3x); + a189: image-set(url(img.09a1a1112c577c279435.png)1x,url(img.09a1a1112c577c279435.png)2x,url(img.09a1a1112c577c279435.png)3x); + a190: image-set(url(img.09a1a1112c577c279435.png)1x); + a191: image-set(url(img.09a1a1112c577c279435.png)1x/* test*/,/* test*/url(img.09a1a1112c577c279435.png)2x); +} + +@supports (background-image: image-set(url(unknown.09a1a1112c577c279435.png)1x,url(unknown.09a1a1112c577c279435.png)2x,url(unknown.09a1a1112c577c279435.png)3x)) { + div { + a192: url(img.09a1a1112c577c279435.png); + a193: image-set(url(img.09a1a1112c577c279435.png)1x); + } +} + +@supports (background-image: url(unknown.09a1a1112c577c279435.png param(--test))) { + div { + a194: url(img.09a1a1112c577c279435.png); + } +} + +@supports (background-image: url(unknown.09a1a1112c577c279435.png)) { + div { + a195: url(img.09a1a1112c577c279435.png); + } +} + +@supports (display: grid) { + @media (min-width: 100px) { + @layer special { + div { + a196: url(img.09a1a1112c577c279435.png); + } + } + } +} + +div { + a197: \\\\u\\\\r\\\\l(img.09a1a1112c577c279435.png); + a198: \\\\image-\\\\set(url(img.09a1a1112c577c279435.png)1x,url(img.09a1a1112c577c279435.png)2x,url(img.09a1a1112c577c279435.png)3x); + a199: \\\\-webk\\\\it-image-set(url(img.09a1a1112c577c279435.png)1x); + a200:-webkit-image-set(url(img.09a1a1112c577c279435.png)1x); +} + +div { + a201: src(http://www.example.com/pinkish.gif); + --foo: \\"http://www.example.com/pinkish.gif\\"; + a202: src(var(--foo)); + a203: src(img.09a1a1112c577c279435.png); + a204: src(img.09a1a1112c577c279435.png); +} + +div { + a205: url(img.09a1a1112c577c279435.png); + a206: url(data:,); + a208: url(./img.png); + a208: url(data:,); + a209: url(data:,); + a210: url(data:,); + a211: url(\\\\'img.png\\\\'); +} + +", +] +`; + +exports[`ConfigTestCases css url exported tests should work with URLs in CSS 2`] = ` +Array [ + "/*!************************!*\\\\ + !*** external \\"#test\\" ***! + \\\\************************/ +@import url(\\"#test\\"); +/*!************************!*\\\\ + !*** css ./nested.css ***! + \\\\************************/ + +.nested { + background: url('./img.png'); +} + +/*!***********************!*\\\\ + !*** css ./style.css ***! + \\\\***********************/ + +div { + a: url('./img.png'); +} + +div { + b: url(\\"./img.png\\"); +} + +div { + c: url(./img.png); +} + +div { + d: url(\\"./img.png#hash\\"); +} + +div { + e: url( + \\"./img.png\\" + ); +} + +div { + f: green url( './img.png' ) xyz; +} + +div { + g: green url( \\"./img.png\\" ) xyz; +} + +div { + h: green url( ./img.png ) xyz; +} + +div { + i: green url(package/img.png) url(./img.png) xyz; +} + +div { + j: green url( \\"./img img.png\\" ) xyz; +} + +div { + k: green url( './img img.png' ) xyz; +} + +div { + l: green url(/img.png) xyz; +} + +div { + m: green URL(/img.png) xyz; +} + +div { + n: green uRl(/img.png) xyz; +} + +div { + --foo: url('./img.png'); +} + +div { + a1: url('./img.png'); +} + +div { + a2: url(\\"./img.png\\"); +} + +div { + a3: url(./img.png); +} + +div { + a4: url(\\"./img.png#hash\\"); +} + +div { + a5: url( + \\"./img.png\\" + ); +} + +div { + a6: green url( './img.png' ) xyz; +} + +div { + a7: green url( \\"./img.png\\" ) xyz; +} + +div { + a8: green url( ./img.png ) xyz; +} + +div { + a9: green url(package/img.png) url(./other-img.png) xyz; +} + +div { + a10: green url( \\"./img img.png\\" ) xyz; +} + +div { + a11: green url( './img img.png' ) xyz; +} + +div { + a12: green url(/img.png) xyz; +} + +div { + a13: green url(data:image/png;base64,AAA) url(http://example.com/image.jpg) url(//example.com/image.png) xyz; +} + +div { + a14: url(\\"data:image/svg+xml;charset=utf-8,\\"); +} + +div { + a15: url(\\"data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2042%2026%27%20fill%3D%27%2523007aff%27%3E%3Crect%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%271%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2711%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2712%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2722%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2723%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3C%2Fsvg%3E\\"); +} + +div { + a16: url('data:image/svg+xml;charset=utf-8,#filter'); +} + +div { + a17: url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%5C%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%5C%22%3E%3Cfilter%20id%3D%5C%22filter%5C%22%3E%3CfeGaussianBlur%20in%3D%5C%22SourceAlpha%5C%22%20stdDeviation%3D%5C%220%5C%22%20%2F%3E%3CfeOffset%20dx%3D%5C%221%5C%22%20dy%3D%5C%222%5C%22%20result%3D%5C%22offsetblur%5C%22%20%2F%3E%3CfeFlood%20flood-color%3D%5C%22rgba(255%2C255%2C255%2C1)%5C%22%20%2F%3E%3CfeComposite%20in2%3D%5C%22offsetblur%5C%22%20operator%3D%5C%22in%5C%22%20%2F%3E%3CfeMerge%3E%3CfeMergeNode%20%2F%3E%3CfeMergeNode%20in%3D%5C%22SourceGraphic%5C%22%20%2F%3E%3C%2FfeMerge%3E%3C%2Ffilter%3E%3C%2Fsvg%3E%23filter'); +} + +div { + a18: url(#highlight); +} + +div { + a19: url('#line-marker'); +} + +@font-face { + a20: url(./font.woff) format('woff'), + url('./font.woff2') format('woff2'), + url(\\"./font.eot\\") format('eot'), + url(./font.ttf) format('truetype'), + url(\\"./font with spaces.eot\\") format(\\"embedded-opentype\\"), + url('./font.svg#svgFontName') format('svg'), + url('./font.woff2?foo=bar') format('woff2'), + url(\\"./font.eot?#iefix\\") format('embedded-opentype'), + url(\\"./font with spaces.eot?#iefix\\") format('embedded-opentype'); +} + +@media (min-width: 500px) { + div { + a21: url(\\"./img.png\\"); + } +} + +div { + a22: \\"do not use url(path)\\"; +} + +div { + a23: 'do not \\"use\\" url(path)'; +} + +div { + a24: -webkit-image-set(url('./img1x.png') 1x, url('./img2x.png') 2x) +} + +div { + a25: image-set(url('./img1x.png') 1x, url('./img2x.png') 2x) +} + +div { + a26: green url() xyz; +} + +div { + a27: green url('') xyz; +} + +div { + a28: green url(\\"\\") xyz; +} + +div { + a29: green url(' ') xyz; +} + +div { + a30: green url( + ) xyz; +} + +div { + a40: green url(https://raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz; +} + +div { + a41: green url(//raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz; +} + +div { + a42: url(\\"./img.png?foo\\"); +} + +div { + a43: url(\\"./img.png?foo=bar\\"); +} + +div { + a44: url(\\"./img.png?foo=bar#hash\\"); +} + +div { + a45: url(\\"./img.png?foo=bar#hash\\"); +} + +div { + a46: url(\\"./img.png?\\"); +} + +div { + a47: url('./img.png') url(\\"data:image/svg+xml;charset=utf-8,\\") url('./img.png'); +} + +div { + a48: __URL__(); +} + +div { + a49: url('./nested/../nested/img-simple.png'); +} + +div { + a50: url('/nested/img-simple.png'); +} + +div { + a51: url('../url/nested/img-simple.png'); +} + +div { + a52: url(./nested/img.png); +} + +div { + a53: url(nested/img.png); +} + +@font-face { + a54: url(\\"//at.alicdn.com/t/font_515771_emcns5054x3whfr.eot\\"); +} + +div { + a55: -webkit-image-set(); + a56: -webkit-image-set(''); + a56: image-set(); + a58: image-set(''); + a59: image-set(\\"\\"); + a60: image-set(\\"\\" 1x); + a61: image-set(url()); + a62: image-set( + url() + ); + a63: image-set(URL()); + a64: image-set(url('')); + a65: image-set(url(\\"\\")); + a66: image-set(url('') 1x); + a67: image-set(1x); + a68: image-set( + 1x + ); + a69: image-set(calc(1rem + 1px) 1x); + + a70: -webkit-image-set(\\"./img1x.png\\" 1x, \\"./img2x.png\\" 2x); + a71: image-set(\\"./img1x.png\\" 1x); + a72: image-set(\\"./img1x.png\\" 1x, \\"./img2x.png\\" 2x); + a73: image-set(\\"./img img.png\\" 1x, \\"./img img.png\\" 2x); + a74: image-set(\\"./img1x.png\\" 1x, \\"./img2x.png\\" 2x), + image-set(\\"./img1x.png\\" 1x, \\"./img2x.png\\" 2x); + a75: image-set( + \\"./img1x.png\\" 1x, + \\"./img2x.png\\" 2x, + \\"./img3x.png\\" 600dpi + ); + a76: image-set(\\"./img1x.png?foo=bar\\" 1x); + a77: image-set(\\"./img1x.png#hash\\" 1x); + a78: image-set(\\"./img1x.png?#iefix\\" 1x); + + a79: -webkit-image-set(url(\\"./img1x.png\\") 1x, url(\\"./img2x.png\\") 2x); + a80: -webkit-image-set(url(\\"./img1x.png\\") 1x); + a81: -webkit-image-set( + url(\\"./img1x.png\\") 1x + ); + a82: image-set(url(./img1x.png) 1x); + a83: image-set( + url(./img1x.png) 1x + ); + a84: image-set(url(\\"./img1x.png\\") 1x, url(\\"./img2x.png\\") 2x); + a85: image-set( + url(./img1x.png) 1x, + url(./img2x.png) 2x, + url(./img3x.png) 600dpi + ); + a86: image-set(url(\\"./img img.png\\") 1x, url(\\"./img img.png\\") 2x); + + a87: image-set(url(\\"./img1x.png\\") 1x, \\"./img2x.png\\" 2x); +} + +div { + a88: url(./img\\\\img.png); + a89: url(./img\\\\'img.png); + a90: url(./img\\\\'\\\\'\\\\'img.png); + a91: url(./img\\\\(img.png); + a92: url(./img\\\\)img.png); + a93: url(./img\\\\ img.png); + a94: url(./img\\\\'\\\\(\\\\)\\\\ img.png); + + a95: image-set( + url(./img\\\\img.png) 1x, + url(./img\\\\'\\\\'\\\\'img.png) 2x, + url(./img\\\\'img.png) 3x, + url(./img\\\\(img.png) 4x, + url(./img\\\\)img.png) 5x, + url(./img\\\\ img.png) 6x, + url(./img\\\\'\\\\(\\\\)\\\\ img.png) 7x + ); +} + +div { + a96: url(\\"./img'''img.png\\"); + a97: url(\\"./img'() img.png\\"); + a98: url(\\"./img'img.png\\"); + a99: url(\\"./img(img.png\\"); + a100: url(\\"./img)img.png\\"); + a101: url('./img img.png'); + a102: url(\\"./img img.png\\"); +} + +div { + a103: url('./img\\\\ +(img.png'); + a104: url('./img\\\\ +(img.png'); + a105: url('./img\\\\ +(img.png'); + a106: url('./img\\\\ +\\\\ +\\\\ +\\\\ +(img.png'); +} + +div { + a107: url(\\"./img%27%27%27img.png\\"); + a108: url(\\"./img%27%28%29%20img.png\\"); + a109: url(\\"./img%27img.png\\"); + a110: url(\\"./img%28img.png\\"); + a111: url(\\"./img%29img.png\\"); + a112: url(\\"./img%20img.png\\"); + a113: url(./img%27%27%27img.png); + a114: url(./img%27%28%29%20img.png); + a115: url(./img%27img.png); + a116: url(./img%28img.png); + a117: url(./img%29img.png); + a118: url(./img%20img.png); +} + +div { + a119: url('img.png'); +} + +div { + a120: url(\\"./img\\\\'\\\\'\\\\'img.png\\"); + a121: url(\\"./img\\\\'\\\\(\\\\)\\\\ img.png\\"); + a122: url(\\"./img\\\\'img.png\\"); + a123: url(\\"./img\\\\(img.png\\"); + a124: url(\\"./img\\\\)img.png\\"); + a125: url(\\"./img\\\\ img.png\\"); + a126: url(\\"./\\\\69\\\\6D\\\\67.png\\"); + a127: url(./\\\\69\\\\6D\\\\67.png); + a128: url(\\"./img\\\\27img.png\\"); + a129: url(\\"./img\\\\'\\\\28%29 img.png\\"); + a130: url(./img\\\\'\\\\28%29\\\\ img.png); +} + +div { + a131: url('./img.png'); + a132: url('./img.png'); + + a133: url('./img.png?foo=bar'); + a134: url('./img.png?foo=bar'); + + a135: url('./img.png?foo=bar#hash'); + a136: url('./img.png?foo=bar#hash'); + + a137: url('./img.png?foo=bar'); + a138: url('./img.png?bar=foo'); + + a139: url('./img.png?foo=bar#foo'); + a140: url('./img.png?bar=foo#bar'); + + a141: url('./img.png?foo=1&bar=2'); + a142: url('./img.png?foo=2&bar=1'); +} + +div { + a143: url(\\"data:image/svg+xml;charset=UTF-8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20width%3D%22191px%22%20height%3D%22191px%22%20viewBox%3D%220%200%20191%20191%22%20enable-background%3D%22new%200%200%20191%20191%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M95.5%2C0C42.8%2C0%2C0%2C42.8%2C0%2C95.5S42.8%2C191%2C95.5%2C191S191%2C148.2%2C191%2C95.5S148.2%2C0%2C95.5%2C0z%20M95.5%2C187.6%0A%09c-50.848%2C0-92.1-41.25-92.1-92.1c0-50.848%2C41.252-92.1%2C92.1-92.1c50.85%2C0%2C92.1%2C41.252%2C92.1%2C92.1%0A%09C187.6%2C146.35%2C146.35%2C187.6%2C95.5%2C187.6z%22%2F%3E%0A%3Cg%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M92.9%2C10v8.6H91v-6.5c-0.1%2C0.1-0.2%2C0.2-0.4%2C0.3c-0.2%2C0.1-0.3%2C0.2-0.4%2C0.2c-0.1%2C0-0.3%2C0.1-0.5%2C0.2%0A%09%09c-0.2%2C0.1-0.3%2C0.1-0.5%2C0.1v-1.6c0.5-0.1%2C0.9-0.3%2C1.4-0.5c0.5-0.2%2C0.8-0.5%2C1.2-0.7h1.1V10z%22%2F%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M97.1%2C17.1h3.602v1.5h-5.6V18c0-0.4%2C0.1-0.8%2C0.2-1.2c0.1-0.4%2C0.3-0.6%2C0.5-0.9c0.2-0.3%2C0.5-0.5%2C0.7-0.7%0A%09%09c0.2-0.2%2C0.5-0.4%2C0.7-0.6c0.199-0.2%2C0.5-0.3%2C0.6-0.5c0.102-0.2%2C0.301-0.3%2C0.5-0.5c0.2-0.2%2C0.2-0.3%2C0.301-0.5%0A%09%09c0.101-0.2%2C0.101-0.3%2C0.101-0.5c0-0.4-0.101-0.6-0.3-0.8c-0.2-0.2-0.4-0.3-0.801-0.3c-0.699%2C0-1.399%2C0.3-2.101%2C0.9v-1.6%0A%09%09c0.7-0.5%2C1.5-0.7%2C2.5-0.7c0.399%2C0%2C0.8%2C0.1%2C1.101%2C0.2c0.301%2C0.1%2C0.601%2C0.3%2C0.899%2C0.5c0.3%2C0.2%2C0.399%2C0.5%2C0.5%2C0.8%0A%09%09c0.101%2C0.3%2C0.2%2C0.6%2C0.2%2C1s-0.102%2C0.7-0.2%2C1c-0.099%2C0.3-0.3%2C0.6-0.5%2C0.8c-0.2%2C0.2-0.399%2C0.5-0.7%2C0.7c-0.3%2C0.2-0.5%2C0.4-0.8%2C0.6%0A%09%09c-0.2%2C0.1-0.399%2C0.3-0.5%2C0.4s-0.3%2C0.3-0.5%2C0.4s-0.2%2C0.3-0.3%2C0.4C97.1%2C17%2C97.1%2C17%2C97.1%2C17.1z%22%2F%3E%0A%3C%2Fg%3E%0A%3Cg%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M15%2C95.4c0%2C0.7-0.1%2C1.4-0.2%2C2c-0.1%2C0.6-0.4%2C1.1-0.7%2C1.5C13.8%2C99.3%2C13.4%2C99.6%2C12.9%2C99.8s-1%2C0.3-1.5%2C0.3%0A%09%09c-0.7%2C0-1.3-0.1-1.8-0.3v-1.5c0.4%2C0.3%2C1%2C0.4%2C1.6%2C0.4c0.6%2C0%2C1.1-0.2%2C1.5-0.7c0.4-0.5%2C0.5-1.1%2C0.5-1.9l0%2C0%0A%09%09C12.8%2C96.7%2C12.3%2C96.9%2C11.5%2C96.9c-0.3%2C0-0.7-0.102-1-0.2c-0.3-0.101-0.5-0.3-0.8-0.5c-0.3-0.2-0.4-0.5-0.5-0.8%0A%09%09c-0.1-0.3-0.2-0.7-0.2-1c0-0.4%2C0.1-0.8%2C0.2-1.2c0.1-0.4%2C0.3-0.7%2C0.6-0.9c0.3-0.2%2C0.6-0.5%2C0.9-0.6c0.3-0.1%2C0.8-0.2%2C1.2-0.2%0A%09%09c0.5%2C0%2C0.9%2C0.1%2C1.2%2C0.3c0.3%2C0.2%2C0.7%2C0.4%2C0.9%2C0.8s0.5%2C0.7%2C0.6%2C1.2S15%2C94.8%2C15%2C95.4z%20M13.1%2C94.4c0-0.2%2C0-0.4-0.1-0.6%0A%09%09c-0.1-0.2-0.1-0.4-0.2-0.5c-0.1-0.1-0.2-0.2-0.4-0.3c-0.2-0.1-0.3-0.1-0.5-0.1c-0.2%2C0-0.3%2C0-0.4%2C0.1s-0.3%2C0.2-0.3%2C0.3%0A%09%09c0%2C0.1-0.2%2C0.3-0.2%2C0.4c0%2C0.1-0.1%2C0.4-0.1%2C0.6c0%2C0.2%2C0%2C0.4%2C0.1%2C0.6c0.1%2C0.2%2C0.1%2C0.3%2C0.2%2C0.4c0.1%2C0.1%2C0.2%2C0.2%2C0.4%2C0.3%0A%09%09c0.2%2C0.1%2C0.3%2C0.1%2C0.5%2C0.1c0.2%2C0%2C0.3%2C0%2C0.4-0.1s0.2-0.2%2C0.3-0.3c0.1-0.1%2C0.2-0.2%2C0.2-0.4C13%2C94.7%2C13.1%2C94.6%2C13.1%2C94.4z%22%2F%3E%0A%3C%2Fg%3E%0A%3Cg%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M176%2C99.7V98.1c0.6%2C0.4%2C1.2%2C0.602%2C2%2C0.602c0.5%2C0%2C0.8-0.102%2C1.1-0.301c0.301-0.199%2C0.4-0.5%2C0.4-0.801%0A%09%09c0-0.398-0.2-0.699-0.5-0.898c-0.3-0.2-0.8-0.301-1.3-0.301h-0.802V95h0.701c1.101%2C0%2C1.601-0.4%2C1.601-1.1c0-0.7-0.4-1-1.302-1%0A%09%09c-0.6%2C0-1.1%2C0.2-1.6%2C0.5v-1.5c0.6-0.3%2C1.301-0.4%2C2.1-0.4c0.9%2C0%2C1.5%2C0.2%2C2%2C0.6s0.701%2C0.9%2C0.701%2C1.5c0%2C1.1-0.601%2C1.8-1.701%2C2.1l0%2C0%0A%09%09c0.602%2C0.1%2C1.102%2C0.3%2C1.4%2C0.6s0.5%2C0.8%2C0.5%2C1.3c0%2C0.801-0.3%2C1.4-0.9%2C1.9c-0.6%2C0.5-1.398%2C0.7-2.398%2C0.7%0A%09%09C177.2%2C100.1%2C176.5%2C100%2C176%2C99.7z%22%2F%3E%0A%3C%2Fg%3E%0A%3Cg%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M98.5%2C179.102c0%2C0.398-0.1%2C0.799-0.2%2C1.199C98.2%2C180.7%2C98%2C181%2C97.7%2C181.2s-0.601%2C0.5-0.9%2C0.601%0A%09%09c-0.3%2C0.1-0.7%2C0.199-1.2%2C0.199c-0.5%2C0-0.9-0.1-1.3-0.3c-0.4-0.2-0.7-0.399-0.9-0.8c-0.2-0.4-0.5-0.7-0.6-1.2%0A%09%09c-0.1-0.5-0.2-1-0.2-1.601c0-0.699%2C0.1-1.399%2C0.3-2c0.2-0.601%2C0.4-1.101%2C0.8-1.5c0.4-0.399%2C0.7-0.699%2C1.2-1c0.5-0.3%2C1-0.3%2C1.6-0.3%0A%09%09c0.6%2C0%2C1.2%2C0.101%2C1.5%2C0.199v1.5c-0.4-0.199-0.9-0.399-1.4-0.399c-0.3%2C0-0.6%2C0.101-0.8%2C0.2c-0.2%2C0.101-0.5%2C0.3-0.7%2C0.5%0A%09%09c-0.2%2C0.199-0.3%2C0.5-0.4%2C0.8c-0.1%2C0.301-0.2%2C0.7-0.2%2C1.101l0%2C0c0.4-0.601%2C1-0.8%2C1.8-0.8c0.3%2C0%2C0.7%2C0.1%2C0.9%2C0.199%0A%09%09c0.2%2C0.101%2C0.5%2C0.301%2C0.7%2C0.5c0.199%2C0.2%2C0.398%2C0.5%2C0.5%2C0.801C98.5%2C178.2%2C98.5%2C178.7%2C98.5%2C179.102z%20M96.7%2C179.2%0A%09%09c0-0.899-0.4-1.399-1.1-1.399c-0.2%2C0-0.3%2C0-0.5%2C0.1c-0.2%2C0.101-0.3%2C0.201-0.4%2C0.301c-0.1%2C0.101-0.2%2C0.199-0.2%2C0.4%0A%09%09c0%2C0.199-0.1%2C0.299-0.1%2C0.5c0%2C0.199%2C0%2C0.398%2C0.1%2C0.6s0.1%2C0.3%2C0.2%2C0.5c0.1%2C0.199%2C0.2%2C0.199%2C0.4%2C0.3c0.2%2C0.101%2C0.3%2C0.101%2C0.5%2C0.101%0A%09%09c0.2%2C0%2C0.3%2C0%2C0.5-0.101c0.2-0.101%2C0.301-0.199%2C0.301-0.3c0-0.1%2C0.199-0.301%2C0.199-0.399C96.6%2C179.7%2C96.7%2C179.4%2C96.7%2C179.2z%22%2F%3E%0A%3C%2Fg%3E%0A%3Ccircle%20fill%3D%22%23636363%22%20cx%3D%2295%22%20cy%3D%2295%22%20r%3D%227%22%2F%3E%0A%3C%2Fsvg%3E%0A\\") 50% 50%/191px no-repeat; +} + +div { + a144: url('%2E/img.png'); +} + +div { + a145: url(\\"/img.png\\"); +} + +div { + /* TODO fix me */ + /*a146: url('./img.png', 'foo', './img.png', url('./img.png'));*/ + /*a147: image-set(url('./img.png', 'foo', './img.png', url('./img.png')) 1x, url(\\"./img2x.png\\") 2x);*/ +} + +div { + a148: url('data:image/svg+xml,%3Csvg xmlns=\\"http://www.w3.org/2000/svg\\"%3E%3Crect width=\\"100%25\\" height=\\"100%25\\" style=\\"stroke: rgb(223,224,225); stroke-width: 2px; fill: none; stroke-dasharray: 6px 3px\\" /%3E%3C/svg%3E'); + a149: url('DATA:image/svg+xml,%3Csvg xmlns=\\"http://www.w3.org/2000/svg\\"%3E%3Crect width=\\"100%25\\" height=\\"100%25\\" style=\\"stroke: rgb(223,224,225); stroke-width: 2px; fill: none; stroke-dasharray: 6px 3px\\" /%3E%3C/svg%3E'); + a150: url('DATA:image/svg+xml,%3Csvg xmlns=\\"http://www.w3.org/2000/svg\\"%3E%3Crect width=\\"100%25\\" height=\\"100%25\\" style=\\"stroke: rgb(223,224,225); stroke-width: 2px; fill: none; stroke-dasharray: 6px 3px\\" /%3E%3C/svg%3E'); + a151: url('data:image/svg+xml;utf8,'); + a152: url('DATA:image/svg+xml;utf8,'); +} + +div { + a152: url(\\"img.png\\"); +} + +div { + a153: url(\\"nested/img.png\\"); +} + +div { + a154: url(\\"nested/other.png\\"); +} + +div { + a155: url(\\"package/img.png\\"); +} + +div { + a156: url(\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e\\"); +} + +div { + a157: url('data:image/svg+xml;utf8,'); +} + +div { + a158: src(\\"http://www.example.com/pinkish.gif\\"); + --foo-bar: \\"http://www.example.com/pinkish.gif\\"; + a159: src(var(--foo)); +} + +div { + a160: url(\\"img.png\\" param(--color var(--primary-color))); + a161: src(\\"img.png\\" param(--color var(--primary-color))); +} + +div { + a162: url('img\\\\ + i\\\\ +mg.png\\\\ + '); + +} + +div { + a163: url(\\" img.png \\"); +} + + +div { + a164: url( img.png bug); +} + +div { + a165: url(img\\\\n.png); +} + +div { + a166: url(' data:image/svg+xml;utf8, '); +} + +div { + a167: url(http://example.com/image.jpg); + a168: url(http://example.com/image.jpg); +} + +div { + a169: url('data:,'); + a170: url('data:,'); +} + +div { + a171: image(ltr 'img.png#xywh=0,0,16,16', red); + a172: cross-fade(20% url(img.png), url(img.png)) +} + +div { + a172: image-set( + linear-gradient(blue, white) 1x, + linear-gradient(blue, green) 2x + ); + a173: image-set( + url(\\"img.png\\") type(\\"image/png\\"), + url(\\"img.png\\") type(\\"image/png\\") + ); + a174: image-set( + \\"img.png\\" 1x, + \\"img.png\\" 2x + ); + a175: image-set( + url(\\"img.png\\") 1x, + url(\\"img.png\\") 2x, + url(\\"img.png\\") 3x + ); + a176: image-set( + \\"img.png\\" type(\\"image/png\\"), + \\"img.png\\" type(\\"image/png\\") + ) \\"img.png\\"; + a177: image-set( + \\"img.png\\" 1x type(\\"image/png\\"), + \\"img.png\\" 2x type(\\"image/png\\") + ); + a178: image-set( + \\"img.png\\" type(\\"image/png\\") 1x, + \\"img.png\\" type(\\"image/png\\") 2x + ); + a179: -webkit-image-set( + \\"img.png\\" 1x + ); + a180: -webkit-image-set( + url(\\"img.png\\" var(--foo, \\"test.png\\")) 1x + ); +} + +div { + a181: src(\\"img.png\\"); + a181: src( \\"img.png\\" ); + a182: src('img.png'); + a183: src('img.png' var(--foo, \\"test.png\\")); + a184: src(var(--foo, \\"test.png\\")); + a185: src(\\" img.png \\"); +} + +div { + a186: image-set(\\"img.png\\"1x,\\"img.png\\"2x,\\"img.png\\"3x); + a187: image-set(\\"img.png\\"1x,url(\\"img.png\\")2x,\\"img.png\\"3x); + a188: image-set(\\"img.png\\"1x,\\"img.png\\"2x,url(\\"img.png\\")3x); + a189: image-set(url(\\"img.png\\")1x,\\"img.png\\"2x,\\"img.png\\"3x); + a190: image-set(\\"img.png\\"1x); + a191: image-set(\\"img.png\\"1x/* test*/,/* test*/\\"img.png\\"2x); +} + +@supports (background-image: image-set(\\"unknown.png\\"1x,\\"unknown.png\\"2x,\\"unknown.png\\"3x)) { + div { + a192: url(\\"img.png\\"); + a193: image-set(\\"img.png\\"1x); + } +} + +@supports (background-image: url(\\"unknown.png\\" param(--test))) { + div { + a194: url(\\"img.png\\"); + } +} + +@supports (background-image: url(\\"unknown.png\\")) { + div { + a195: url(\\"img.png\\"); + } +} + +@supports (display: grid) { + @media (min-width: 100px) { + @layer special { + div { + a196: url(\\"img.png\\"); + } + } + } +} + +div { + a197: \\\\u\\\\r\\\\l(\\"img.png\\"); + a198: \\\\image-\\\\set(\\"img.png\\"1x,\\"img.png\\"2x,\\"img.png\\"3x); + a199: \\\\-webk\\\\it-image-set(\\"img.png\\"1x); + a200:-webkit-image-set(\\"img.png\\"1x); +} + +div { + a201: src(\\"http://www.example.com/pinkish.gif\\"); + --foo: \\"http://www.example.com/pinkish.gif\\"; + a202: src(var(--foo)); + a203: src(\\"./img.png\\"); + a204: src(\\"img.png\\"); +} + +div { + a205: url(alias-url.png); + a206: url(alias-url-1.png); + a208: url(external-url.png); + a208: url(external-url-2.png); + a209: url(unresolved.png); + a210: url(ignore.png); + a211: url(\\"schema:test\\"); +} + +", +] +`; + +exports[`ConfigTestCases css url-and-asset-module-filename exported tests should generate correct url public path with css filename 1`] = ` +Object { + "getPropertyValue": [Function], + "nested-dir": " url(../../bundle0/assets/img2.png)", + "nested-nested-dir": " url(../../bundle0/assets/img3.png)", + "same-dir": " url(../../bundle0/assets/img1.png)", +} +`; + +exports[`ConfigTestCases css url-and-asset-module-filename exported tests should generate correct url public path with css filename 2`] = ` +Object { + "getPropertyValue": [Function], + "nested-dir": " url(../../bundle0/assets/img3.png)", + "outer-dir": " url(../../bundle0/assets/img1.png)", + "same-dir": " url(../../bundle0/assets/img2.png)", +} +`; + +exports[`ConfigTestCases css url-and-asset-module-filename exported tests should generate correct url public path with css filename 3`] = ` +Object { + "getPropertyValue": [Function], + "outer-dir": " url(../../bundle0/assets/img2.png)", + "outer-outer-dir": " url(../../bundle0/assets/img1.png)", + "same-dir": " url(../../bundle0/assets/img3.png)", +} +`; + +exports[`ConfigTestCases css url-and-asset-module-filename exported tests should generate correct url public path with css filename 4`] = ` +Object { + "getPropertyValue": [Function], + "nested-dir": " url(https://test.cases/path/bundle1/assets/img2.png)", + "nested-nested-dir": " url(https://test.cases/path/bundle1/assets/img3.png)", + "same-dir": " url(https://test.cases/path/bundle1/assets/img1.png)", +} +`; + +exports[`ConfigTestCases css url-and-asset-module-filename exported tests should generate correct url public path with css filename 5`] = ` +Object { + "getPropertyValue": [Function], + "nested-dir": " url(https://test.cases/path/bundle1/assets/img3.png)", + "outer-dir": " url(https://test.cases/path/bundle1/assets/img1.png)", + "same-dir": " url(https://test.cases/path/bundle1/assets/img2.png)", +} +`; + +exports[`ConfigTestCases css url-and-asset-module-filename exported tests should generate correct url public path with css filename 6`] = ` +Object { + "getPropertyValue": [Function], + "outer-dir": " url(https://test.cases/path/bundle1/assets/img2.png)", + "outer-outer-dir": " url(https://test.cases/path/bundle1/assets/img1.png)", + "same-dir": " url(https://test.cases/path/bundle1/assets/img3.png)", +} +`; + +exports[`ConfigTestCases css url-and-asset-module-filename exported tests should generate correct url public path with css filename 7`] = ` +Object { + "getPropertyValue": [Function], + "nested-dir": " url(https://test.cases/path/bundle2/assets/img2.png)", + "nested-nested-dir": " url(https://test.cases/path/bundle2/assets/img3.png)", + "same-dir": " url(https://test.cases/path/bundle2/assets/img1.png)", +} +`; + +exports[`ConfigTestCases css url-and-asset-module-filename exported tests should generate correct url public path with css filename 8`] = ` +Object { + "getPropertyValue": [Function], + "nested-dir": " url(https://test.cases/path/bundle2/assets/img3.png)", + "outer-dir": " url(https://test.cases/path/bundle2/assets/img1.png)", + "same-dir": " url(https://test.cases/path/bundle2/assets/img2.png)", +} +`; + +exports[`ConfigTestCases css url-and-asset-module-filename exported tests should generate correct url public path with css filename 9`] = ` +Object { + "getPropertyValue": [Function], + "outer-dir": " url(https://test.cases/path/bundle2/assets/img2.png)", + "outer-outer-dir": " url(https://test.cases/path/bundle2/assets/img1.png)", + "same-dir": " url(https://test.cases/path/bundle2/assets/img3.png)", +} +`; + +exports[`ConfigTestCases css webpack-ignore exported tests should compile 1`] = ` +"/*!***********************!*\\\\ + !*** css ./basic.css ***! + \\\\***********************/ +.class { + color: red; +} + +/*!***********************!*\\\\ + !*** css ./style.css ***! + \\\\***********************/ +@import/* webpackIgnore: true */url(./basic.css); +@import /* webpackIgnore: true */ url(./basic.css); +@import /* webpackIgnore: false */ /* webpackIgnore: true */ url(./basic.css); +@import /* webpackIgnore: false */ /* webpackIgnore: true */ /* webpackIgnore: true */ url(./basic.css); +@import /* webpackIgnore: false */ /* webpackIgnore: false */ /* webpackIgnore: true */ url(./basic.css); + + +@import /* webpackIgnore: true */ url(./basic.css); + +/** Resolved **/ +/** Resolved **/ + +.class { + color: red; + background: /* webpackIgnore: true */ url(\\"./url/img.png\\"), url(09a1a1112c577c279435.png); +} + +.class { + color: red; + background:/* webpackIgnore: true */url(\\"./url/img.png\\"), url(09a1a1112c577c279435.png); +} + +.class { + color: red; + background: url(09a1a1112c577c279435.png), /* webpackIgnore: true */ url(\\"./url/img.png\\"); +} + +.class { + color: red; + background: + /* webpackIgnore: true */ + url(\\"./url/img.png\\"), + url(09a1a1112c577c279435.png); +} + + +.class { + color: red; + background: + url(09a1a1112c577c279435.png), + /* webpackIgnore: true */ + url(\\"./url/img.png\\"); +} + +.class { + color: red; + background: /* webpackIgnore: true */ url(\\"./url/img.png\\"), /* webpackIgnore: false */ url(09a1a1112c577c279435.png); +} + +.class { + color: red; + background: url(09a1a1112c577c279435.png), /* webpackIgnore: false */ url(09a1a1112c577c279435.png), /* webpackIgnore: true */ url(\\"./url/img.png\\"), /* webpackIgnore: false */ url(09a1a1112c577c279435.png); +} + +.class { + color: red; + background: /* webpackIgnore: false */ url(09a1a1112c577c279435.png), /* webpackIgnore: true */ url(\\"./url/img.png\\"); +} + +.class { + color: red; + background: /* webpackIgnore: true */ /* webpackIgnore: false */ url(09a1a1112c577c279435.png), url(09a1a1112c577c279435.png); +} + +.class { + color: red; + background: url(09a1a1112c577c279435.png), /* webpackIgnore: true */ /* webpackIgnore: false */ url(09a1a1112c577c279435.png); +} + +.class { + color: red; + background: url(09a1a1112c577c279435.png), /* webpackIgnore: false */ /* webpackIgnore: true */ url(\\"./url/img.png\\"); +} + +.class { + background: + url(09a1a1112c577c279435.png), + url(09a1a1112c577c279435.png), + /* webpackIgnore: true */ url(\\"./url/img.png\\"), + url(09a1a1112c577c279435.png), + /* webpackIgnore: true */ url(\\"./url/img.png\\"), + url(09a1a1112c577c279435.png), + url(09a1a1112c577c279435.png), + url(09a1a1112c577c279435.png), + /* webpackIgnore: true */ + url(\\"./url/img.png\\"); +} + +@font-face { + font-family: \\"Roboto\\"; + src: /* webpackIgnore: true */ url(\\"./fonts/Roboto-Regular.eot\\"); + src: + /* webpackIgnore: true */ + url(\\"./fonts/Roboto-Regular.eot#iefix\\") format(\\"embedded-opentype\\"), + url(5edda27bb1aea976c9b5.woff2) format(\\"woff\\"), + url(6af79dbd35e55450b9a6.woff) format(\\"woff\\"), + url(0e1fae5a09bac1b8f8da.ttf) format(\\"truetype\\"), + url(5a6b5cdda16adcae27d1.svg) format(\\"svg\\"); + font-weight: 400; + font-style: normal; +} + +@font-face { + font-family: \\"Roboto\\"; + src: /* webpackIgnore: true */ url(\\"./fonts/Roboto-Regular.eot\\"); + src: + url(19ce07bdb1cb5ba16ea8.eot) format(\\"embedded-opentype\\"), + url(5edda27bb1aea976c9b5.woff2) format(\\"woff\\"), + /* webpackIgnore: true */ + url(\\"./fonts/Roboto-Regular.woff\\") + format(\\"woff\\"), + url(0e1fae5a09bac1b8f8da.ttf) format(\\"truetype\\"), + url(5a6b5cdda16adcae27d1.svg) format(\\"svg\\"); + font-weight: 400; + font-style: normal; +} + +@font-face { + font-family: \\"Roboto\\"; + src: url(19ce07bdb1cb5ba16ea8.eot); + src: + url(19ce07bdb1cb5ba16ea8.eot) format(\\"embedded-opentype\\"), + /* webpackIgnore: true */ + url(\\"./fonts/Roboto-Regular.woff2\\") format(\\"woff\\"), + url(6af79dbd35e55450b9a6.woff) format(\\"woff\\"), + /* webpackIgnore: true */ + url(\\"./fonts/Roboto-Regular.ttf\\") format(\\"truetype\\"), + url(5a6b5cdda16adcae27d1.svg) format(\\"svg\\"); + font-weight: 400; + font-style: normal; +} + +.class { + background-image: image-set( + /*webpackIgnore: true*/ + + + url(./url/img.png) 2x, + url(09a1a1112c577c279435.png) 3x, + url(09a1a1112c577c279435.png) 4x + ); +} + +.class { + background-image: + image-set( + /*webpackIgnore: false*/ + url(09a1a1112c577c279435.png) 2x, + /*webpackIgnore: true*/ + url(./url/img.png) 3x, + url(09a1a1112c577c279435.png) 4x, + /*webpackIgnore: false */ + /*webpackIgnore: true */ + url(./url/img.png) 5x + ),/*webpackIgnore: true*/url('./url/img.png'); +} + +.class { + background-image: + image-set( + /*webpackIgnore: false*/ + url(09a1a1112c577c279435.png) 2x, + /*webpackIgnore: true*/ + url(./url/img.png) 3x, + url(09a1a1112c577c279435.png) 4x, + /*webpackIgnore: false */ + /*webpackIgnore: true */ + url(./url/img.png) 5x + ), + /*webpackIgnore: false*/ + url(09a1a1112c577c279435.png), + /*webpackIgnore: true*/ + url('./url/img.png'); +} + +.class { + background-image: + image-set( + /*webpackIgnore: false*/ + url(09a1a1112c577c279435.png) 2x, + /*webpackIgnore: true*/ + url(./url/img.png) 3x, + url(09a1a1112c577c279435.png) 4x, + /*webpackIgnore: false */ + /*webpackIgnore: true */ + url(./url/img.png) 5x + ), + url(09a1a1112c577c279435.png); +} + +.class { + background-image: image-set( + /*webpackIgnore: true*/ + url(./url/img.png) 2x, + url(09a1a1112c577c279435.png) 3x, + /*webpackIgnore: true*/ + url(./url/img.png) 5x + ); +} + +.class { + background-image: image-set( + /*webpackIgnore: true*/ + './url/img.png' 2x, + url(09a1a1112c577c279435.png) 3x, + /*webpackIgnore: true*/ + './url/img.png' 5x + ); +} + +.class { + background-image: image-set( + /*webpackIgnore: false*/ + url(09a1a1112c577c279435.png) 2x, + /*webpackIgnore: true*/ + url(./url/img.png) 3x, + /*webpackIgnore: false*/ + url(09a1a1112c577c279435.png) 4x, + + + /*webpackIgnore: true*/ + + + url(./url/img.png) 5x + ); +} + +.class { + color: red; + background: url(09a1a1112c577c279435.png), /* webpackIgnore: true */url(\\"./url/img.png\\"); +} + +.class { + color: red; + background: url(09a1a1112c577c279435.png), /* webpackIgnore: true */ url(\\"./url/img.png\\"); +} + +.class { + color: red; + background: url(09a1a1112c577c279435.png)/* webpackIgnore: true */, url(09a1a1112c577c279435.png); +} + +.class { + background-image: + image-set( + url(09a1a1112c577c279435.png) 2x /*webpackIgnore: true*/, + url(09a1a1112c577c279435.png) /*webpackIgnore: true*/ 3x, + url(09a1a1112c577c279435.png) 4x /*webpackIgnore: true*/, + /*webpackIgnore: true*/url(./url/img.png) 5x, + /*webpackIgnore: true*/ url(./url/img.png) 6x, + /*webpackIgnore: true*/ + url(./url/img.png) 7x, + url(09a1a1112c577c279435.png) 8x + ), + /*webpackIgnore: false*/ + url(09a1a1112c577c279435.png), + /*webpackIgnore: true*/ + url('./url/img.png'); +} + +@font-face { + font-family: \\"anticon\\"; + src: url(//at.alicdn.com/t/font_1434092639_4910953.eot?#iefix) format(\\"embedded-opentype\\"), + /* this comment is required */ + url(//at.alicdn.com/t/font_1434092639_4910953.woff) format(\\"woff\\"); +} + +.class { + background-image: image-set( + /*webpackIgnore: true*/ + url(\\"./url/img.png\\") 2x, + url(09a1a1112c577c279435.png) 3x, + /*webpackIgnore: true*/ + url(\\"./url/img.png\\") 4x + ); +} + +.class { + background-image: /* webpackIgnore: 1 */ url(09a1a1112c577c279435.png); + background-image: /* webpackIgnore: 1 */ url(09a1a1112c577c279435.png); + background-image: image-set(/* webpackIgnore: 1 */ url(09a1a1112c577c279435.png) 2x) +} + +.class { + background-image /*webpackIgnore: true*/ : url(09a1a1112c577c279435.png); + /*webpackIgnore: true*/ background-image: url(09a1a1112c577c279435.png); +} + +.class { + background-image:/*webpackIgnore: true*/ + + + + + + + + + + + url(./url/img.png); +} + +.class { + background-image: /***webpackIgnore: true***/ url(09a1a1112c577c279435.png); + background-image: /***webpackIgnore: true***/ url(09a1a1112c577c279435.png); + background-image: image-set(/***webpackIgnore: true***/ url(09a1a1112c577c279435.png) 2x) +} + +" +`; diff --git a/test/__snapshots__/ConfigTestCases.test.js.snap b/test/__snapshots__/ConfigTestCases.test.js.snap deleted file mode 100644 index bf334e16f45..00000000000 --- a/test/__snapshots__/ConfigTestCases.test.js.snap +++ /dev/null @@ -1,61 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`ConfigTestCases records issue-2991 exported tests should write relative paths to records 1`] = ` -"{ - \\"modules\\": { - \\"byIdentifier\\": { - \\"test.js\\": 0, - \\"ignored pkgs/somepackage/foo\\": 1, - \\"external \\\\\\"fs\\\\\\"\\": 2, - \\"external \\\\\\"path\\\\\\"\\": 3 - }, - \\"usedIds\\": { - \\"0\\": 0, - \\"1\\": 1, - \\"2\\": 2, - \\"3\\": 3 - } - }, - \\"chunks\\": { - \\"byName\\": { - \\"main\\": 0 - }, - \\"bySource\\": {}, - \\"usedIds\\": [ - 0 - ] - } -}" -`; - -exports[`ConfigTestCases records issue-7339 exported tests should write relative dynamic-require paths to records 1`] = ` -"{ - \\"modules\\": { - \\"byIdentifier\\": { - \\"dependencies/bar.js\\": 0, - \\"dependencies/foo.js\\": 1, - \\"test.js\\": 2, - \\"dependencies sync /^\\\\\\\\.\\\\\\\\/.*$/\\": 3, - \\"external \\\\\\"fs\\\\\\"\\": 4, - \\"external \\\\\\"path\\\\\\"\\": 5 - }, - \\"usedIds\\": { - \\"0\\": 0, - \\"1\\": 1, - \\"2\\": 2, - \\"3\\": 3, - \\"4\\": 4, - \\"5\\": 5 - } - }, - \\"chunks\\": { - \\"byName\\": { - \\"main\\": 0 - }, - \\"bySource\\": {}, - \\"usedIds\\": [ - 0 - ] - } -}" -`; diff --git a/test/__snapshots__/RemovedPlugins.unittest.js.snap b/test/__snapshots__/RemovedPlugins.unittest.js.snap deleted file mode 100644 index ecac2f61a2a..00000000000 --- a/test/__snapshots__/RemovedPlugins.unittest.js.snap +++ /dev/null @@ -1,5 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`removed plugin errors should error when accessing removed plugins 1`] = `"webpack.optimize.UglifyJsPlugin has been removed, please use config.optimization.minimize instead."`; - -exports[`removed plugin errors should error when accessing removed plugins 2`] = `"webpack.optimize.CommonsChunkPlugin has been removed, please use config.optimization.splitChunks instead."`; diff --git a/test/__snapshots__/StatsTestCases.basictest.js.snap b/test/__snapshots__/StatsTestCases.basictest.js.snap new file mode 100644 index 00000000000..e039eb10c21 --- /dev/null +++ b/test/__snapshots__/StatsTestCases.basictest.js.snap @@ -0,0 +1,4965 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`StatsTestCases should print correct stats for aggressive-splitting-entry 1`] = ` +"fitting: + PublicPath: auto + asset fitting-XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] + asset fitting-XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] + asset fitting-XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] + asset fitting-XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] + Entrypoint main X KiB = fitting-XXXXXXXXXXXXXXXXXXXX.js X KiB fitting-XXXXXXXXXXXXXXXXXXXX.js X KiB fitting-XXXXXXXXXXXXXXXXXXXX.js X KiB + chunk (runtime: main) fitting-XXXXXXXXXXXXXXXXXXXX.js X KiB [initial] [rendered] [recorded] aggressive splitted + > ./index main + ./a.js X bytes [built] [code generated] + ./b.js X bytes [built] [code generated] + chunk (runtime: main) fitting-XXXXXXXXXXXXXXXXXXXX.js X KiB (javascript) X KiB (runtime) [entry] [rendered] + > ./index main + runtime modules X KiB 11 modules + cacheable modules X KiB + ./e.js X bytes [dependent] [built] [code generated] + ./f.js X bytes [dependent] [built] [code generated] + ./index.js X bytes [built] [code generated] + chunk (runtime: main) fitting-XXXXXXXXXXXXXXXXXXXX.js X KiB [initial] [rendered] [recorded] aggressive splitted + > ./index main + ./c.js X bytes [built] [code generated] + ./d.js X bytes [built] [code generated] + chunk (runtime: main) fitting-XXXXXXXXXXXXXXXXXXXX.js X bytes [rendered] + > ./g ./index.js 7:0-13 + ./g.js X bytes [built] [code generated] + fitting (webpack x.x.x) compiled successfully in X ms + +content-change: + PublicPath: auto + asset content-changX-XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] + asset content-changX-XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] + asset content-changX-XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] + asset content-changX-XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] + Entrypoint main X KiB = content-changX-XXXXXXXXXXXXXXXXXXXX.js X KiB content-changX-XXXXXXXXXXXXXXXXXXXX.js X KiB content-changX-XXXXXXXXXXXXXXXXXXXX.js X KiB + chunk (runtime: main) content-changX-XXXXXXXXXXXXXXXXXXXX.js X KiB [initial] [rendered] [recorded] aggressive splitted + > ./index main + ./a.js X bytes [built] [code generated] + ./b.js X bytes [built] [code generated] + chunk (runtime: main) content-changX-XXXXXXXXXXXXXXXXXXXX.js X KiB (javascript) X KiB (runtime) [entry] [rendered] + > ./index main + runtime modules X KiB 11 modules + cacheable modules X KiB + ./e.js X bytes [dependent] [built] [code generated] + ./f.js X bytes [dependent] [built] [code generated] + ./index.js X bytes [built] [code generated] + chunk (runtime: main) content-changX-XXXXXXXXXXXXXXXXXXXX.js X KiB [initial] [rendered] [recorded] aggressive splitted + > ./index main + ./c.js X bytes [built] [code generated] + ./d.js X bytes [built] [code generated] + chunk (runtime: main) content-changX-XXXXXXXXXXXXXXXXXXXX.js X bytes [rendered] + > ./g ./index.js 7:0-13 + ./g.js X bytes [built] [code generated] + content-change (webpack x.x.x) compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for aggressive-splitting-on-demand 1`] = ` +"PublicPath: auto +asset XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] (name: main) +asset XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] +asset XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] +asset XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] +asset XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] +asset XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] +asset XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] +asset XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] +asset XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] +asset XXXXXXXXXXXXXXXXXXXX.js X bytes [emitted] [immutable] +asset XXXXXXXXXXXXXXXXXXXX.js X bytes [emitted] [immutable] +asset XXXXXXXXXXXXXXXXXXXX.js X bytes [emitted] [immutable] +Entrypoint main X KiB = XXXXXXXXXXXXXXXXXXXX.js +chunk (runtime: main) XXXXXXXXXXXXXXXXXXXX.js X bytes [rendered] + > ./c ./d ./e ./index.js 3:0-30 + > ./b ./d ./e ./f ./g ./index.js 5:0-44 + ./e.js X bytes [built] [code generated] +chunk (runtime: main) XXXXXXXXXXXXXXXXXXXX.js X KiB [rendered] + > ./b ./c ./index.js 2:0-23 + ./b.js X bytes [built] [code generated] + ./c.js X bytes [built] [code generated] +chunk (runtime: main) XXXXXXXXXXXXXXXXXXXX.js X KiB [rendered] [recorded] aggressive splitted + > ./c ./d ./e ./index.js 3:0-30 + ./c.js X bytes [built] [code generated] + ./d.js X bytes [built] [code generated] +chunk (runtime: main) XXXXXXXXXXXXXXXXXXXX.js X bytes [rendered] + > ./b ./d ./e ./f ./g ./h ./i ./j ./k ./index.js 6:0-72 + ./k.js X bytes [built] [code generated] +chunk (runtime: main) XXXXXXXXXXXXXXXXXXXX.js X KiB [rendered] [recorded] aggressive splitted + > ./f ./g ./h ./i ./j ./k ./index.js 4:0-51 + ./h.js X bytes [built] [code generated] + ./i.js X bytes [built] [code generated] +chunk (runtime: main) XXXXXXXXXXXXXXXXXXXX.js X KiB [rendered] [recorded] aggressive splitted + > ./b ./d ./e ./f ./g ./h ./i ./j ./k ./index.js 6:0-72 + ./i.js X bytes [built] [code generated] + ./j.js X bytes [built] [code generated] +chunk (runtime: main) XXXXXXXXXXXXXXXXXXXX.js X KiB [rendered] + > ./f ./g ./h ./i ./j ./k ./index.js 4:0-51 + ./j.js X bytes [built] [code generated] + ./k.js X bytes [built] [code generated] +chunk (runtime: main) XXXXXXXXXXXXXXXXXXXX.js X bytes [rendered] + > ./a ./index.js 1:0-16 + ./a.js X bytes [built] [code generated] +chunk (runtime: main) XXXXXXXXXXXXXXXXXXXX.js X KiB [rendered] [recorded] aggressive splitted + > ./b ./d ./e ./f ./g ./h ./i ./j ./k ./index.js 6:0-72 + ./e.js X bytes [built] [code generated] + ./h.js X bytes [built] [code generated] +chunk (runtime: main) XXXXXXXXXXXXXXXXXXXX.js X KiB [rendered] [recorded] aggressive splitted + > ./b ./d ./e ./f ./g ./index.js 5:0-44 + > ./b ./d ./e ./f ./g ./h ./i ./j ./k ./index.js 6:0-72 + ./b.js X bytes [built] [code generated] + ./d.js X bytes [built] [code generated] +chunk (runtime: main) XXXXXXXXXXXXXXXXXXXX.js (main) X bytes (javascript) X KiB (runtime) [entry] [rendered] + > ./index main + runtime modules X KiB 7 modules + ./index.js X bytes [built] [code generated] +chunk (runtime: main) XXXXXXXXXXXXXXXXXXXX.js X KiB [rendered] [recorded] aggressive splitted + > ./f ./g ./h ./i ./j ./k ./index.js 4:0-51 + > ./b ./d ./e ./f ./g ./index.js 5:0-44 + > ./b ./d ./e ./f ./g ./h ./i ./j ./k ./index.js 6:0-72 + ./f.js X bytes [built] [code generated] + ./g.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for all-stats 1`] = ` +"PublicPath: auto +asset bundle.js X KiB {main} [emitted] (name: main) +Entrypoint main X KiB = bundle.js +chunk {main} (runtime: main) bundle.js (main) X bytes (javascript) X bytes (runtime) [entry] [rendered] + > ./index.js main + ./index.js X bytes {main} [depth 0] [built] [code generated] + [no exports] + [used exports unknown] + entry ./index.js main + data:text/plain;base64,szsaAAdsadasdfaf.. X bytes {main} [depth 1] [dependent] [built] [code generated] + [no exports] + [used exports unknown] + harmony side effect evaluation data:text/plain;base64,szsaAAdsadasdfaf.. [./index.js] 1:0-81 + webpack/runtime/make namespace object X bytes {main} [code generated] + [no exports] + [used exports unknown] +./index.js X bytes {main} [depth 0] [built] [code generated] + [no exports] + [used exports unknown] + entry ./index.js main +data:text/plain;base64,szsaAAdsadasdfaf.. X bytes {main} [depth 1] [built] [code generated] + [no exports] + [used exports unknown] + harmony side effect evaluation data:text/plain;base64,szsaAAdsadasdfaf.. [./index.js] 1:0-81 +webpack/runtime/make namespace object X bytes {main} [code generated] + [no exports] + [used exports unknown] + +1970-04-20 12:42:42: webpack x.x.x compiled successfully in X ms (XXXXXXXXXXXXXXXXXXXX)" +`; + +exports[`StatsTestCases should print correct stats for asset 1`] = ` +"asset XXXXXXXXXXXXXXXXXXXX.png X KiB [emitted] [immutable] [from: images/file.png] (auxiliary name: main) +asset bundle.js X KiB [emitted] (name: main) +asset static/file.html X bytes [emitted] [from: static/file.html] (auxiliary name: main) +runtime modules X KiB 2 modules +modules by path ./ X KiB (asset) X KiB (javascript) + modules by path ./images/ X KiB (asset) X KiB (javascript) + ./images/file.png X KiB (asset) X bytes (javascript) [built] [code generated] + ./images/file.svg X bytes [built] [code generated] + ./images/file.jpg X KiB [built] [code generated] + modules by path ./*.js X bytes + ./index.js X bytes [built] [code generated] + ./a.source.js X bytes [built] [code generated] + ./static/file.html X bytes (asset) X bytes (javascript) [built] [code generated] + ./a.css X bytes [built] [code generated] +modules by mime type text/plain X bytes + data:text/plain;base64,szsaAAdsadasdfaf.. X bytes [built] [code generated] + data:text/plain,asd= X bytes [built] [code generated] + data:text/plain,XXXXXXXXXXXXXXX.. X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for asset-concat 1`] = ` +"asset XXXXXXXXXXXXXXXXXXXX.png X KiB [emitted] [immutable] [from: images/file.png] (auxiliary name: main) +asset bundle.js X KiB [emitted] (name: main) +asset static/file.html X bytes [emitted] [from: static/file.html] (auxiliary name: main) +orphan modules X KiB [orphan] 7 modules +runtime modules X KiB 2 modules +cacheable modules X KiB (javascript) X KiB (asset) + ./index.js + 9 modules X KiB [built] [code generated] + ./images/file.png X KiB (asset) X bytes (javascript) [built] [code generated] + ./static/file.html X bytes (asset) X bytes (javascript) [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for async-commons-chunk 1`] = ` +"chunk (runtime: main) 670.js X bytes <{792}> ={899}= ={964}= [rendered] reused as split chunk (cache group: default) + > ./index.js 17:1-21:3 + > ./index.js 2:1-5:3 + > ./a ./b ./index.js 9:1-13:3 + ./a.js X bytes [built] [code generated] +chunk (runtime: main) main.js (main) X bytes (javascript) X KiB (runtime) >{670}< >{899}< >{964}< [entry] [rendered] + > ./ main + runtime modules X KiB 7 modules + ./index.js X bytes [built] [code generated] +chunk (runtime: main) 899.js X bytes <{792}> ={670}= [rendered] + > ./a ./b ./index.js 9:1-13:3 + ./b.js X bytes [built] [code generated] +chunk (runtime: main) 964.js X bytes <{792}> ={670}= [rendered] + > ./index.js 17:1-21:3 + ./c.js X bytes [built] [code generated] +webpack x.x.x compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for async-commons-chunk-auto 1`] = ` +"disabled: + chunk (runtime: a, main) disabled/async-g.js (async-g) X bytes [rendered] + > ./g ./a.js 6:0-47 + dependent modules X bytes [dependent] 1 module + ./g.js X bytes [built] [code generated] + chunk (runtime: main) disabled/async-b.js (async-b) X bytes [rendered] + > ./b ./index.js 2:0-47 + dependent modules X bytes [dependent] 4 modules + ./b.js X bytes [built] [code generated] + chunk (runtime: b) disabled/b.js (b) X bytes (javascript) X bytes (runtime) [entry] [rendered] + > ./b b + dependent modules X bytes [dependent] 4 modules + runtime modules X bytes 2 modules + ./b.js X bytes [built] [code generated] + chunk (runtime: main) disabled/async-a.js (async-a) X bytes [rendered] + > ./a ./index.js 1:0-47 + dependent modules X bytes [dependent] 3 modules + ./a.js + 1 modules X bytes [built] [code generated] + chunk (runtime: c) disabled/c.js (c) X bytes (javascript) X bytes (runtime) [entry] [rendered] + > ./c c + dependent modules X bytes [dependent] 3 modules + runtime modules X bytes 2 modules + ./c.js + 1 modules X bytes [built] [code generated] + chunk (runtime: main) disabled/main.js (main) X bytes (javascript) X KiB (runtime) [entry] [rendered] + > ./ main + runtime modules X KiB 9 modules + ./index.js X bytes [built] [code generated] + chunk (runtime: main) disabled/async-c.js (async-c) X bytes [rendered] + > ./c ./index.js 3:0-47 + dependent modules X bytes [dependent] 3 modules + ./c.js + 1 modules X bytes [built] [code generated] + chunk (runtime: a) disabled/a.js (a) X bytes (javascript) X KiB (runtime) [entry] [rendered] + > ./a a + runtime modules X KiB 9 modules + dependent modules X bytes [dependent] 3 modules + ./a.js + 1 modules X bytes [built] [code generated] + disabled (webpack x.x.x) compiled successfully + +default: + chunk (runtime: a, main) default/async-g.js (async-g) X bytes [rendered] + > ./g ./a.js 6:0-47 + ./g.js X bytes [built] [code generated] + chunk (runtime: main) default/async-b.js (async-b) X bytes [rendered] + > ./b ./index.js 2:0-47 + ./b.js X bytes [built] [code generated] + chunk (runtime: b) default/b.js (b) X bytes (javascript) X bytes (runtime) [entry] [rendered] + > ./b b + dependent modules X bytes [dependent] 4 modules + runtime modules X bytes 2 modules + ./b.js X bytes [built] [code generated] + chunk (runtime: main) default/async-a.js (async-a) X bytes [rendered] + > ./a ./index.js 1:0-47 + ./a.js + 1 modules X bytes [built] [code generated] + chunk (runtime: c) default/c.js (c) X bytes (javascript) X bytes (runtime) [entry] [rendered] + > ./c c + dependent modules X bytes [dependent] 4 modules + runtime modules X bytes 2 modules + ./c.js X bytes [built] [code generated] + chunk (runtime: main) default/425.js X bytes [rendered] split chunk (cache group: default) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + ./d.js X bytes [built] [code generated] + chunk (runtime: main) default/628.js (id hint: vendors) X bytes [rendered] split chunk (cache group: defaultVendors) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + ./node_modules/x.js X bytes [built] [code generated] + chunk (runtime: main) default/723.js (id hint: vendors) X bytes [rendered] split chunk (cache group: defaultVendors) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + ./node_modules/y.js X bytes [built] [code generated] + chunk (runtime: main) default/main.js (main) X bytes (javascript) X KiB (runtime) [entry] [rendered] + > ./ main + runtime modules X KiB 9 modules + ./index.js X bytes [built] [code generated] + chunk (runtime: main) default/862.js (id hint: vendors) X bytes [rendered] split chunk (cache group: defaultVendors) + > ./c ./index.js 3:0-47 + ./node_modules/z.js X bytes [built] [code generated] + chunk (runtime: main) default/async-c.js (async-c) X bytes [rendered] + > ./c ./index.js 3:0-47 + ./c.js X bytes [built] [code generated] + chunk (runtime: a, main) default/935.js X bytes [rendered] split chunk (cache group: default) + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + > ./g ./a.js 6:0-47 + ./f.js X bytes [built] [code generated] + chunk (runtime: a) default/a.js (a) X bytes (javascript) X KiB (runtime) [entry] [rendered] + > ./a a + runtime modules X KiB 9 modules + dependent modules X bytes [dependent] 3 modules + ./a.js + 1 modules X bytes [built] [code generated] + default (webpack x.x.x) compiled successfully + +vendors: + Entrypoint main X KiB = vendors/main.js + Entrypoint a X KiB = vendors/vendors.js X KiB vendors/a.js X KiB + Entrypoint b X KiB = vendors/vendors.js X KiB vendors/b.js X KiB + Entrypoint c X KiB = vendors/vendors.js X KiB vendors/c.js X KiB + chunk (runtime: a, main) vendors/async-g.js (async-g) X bytes [rendered] + > ./g ./a.js 6:0-47 + dependent modules X bytes [dependent] 1 module + ./g.js X bytes [built] [code generated] + chunk (runtime: main) vendors/async-b.js (async-b) X bytes [rendered] + > ./b ./index.js 2:0-47 + dependent modules X bytes [dependent] 4 modules + ./b.js X bytes [built] [code generated] + chunk (runtime: a, b, c) vendors/vendors.js (vendors) (id hint: vendors) X bytes [initial] [rendered] split chunk (cache group: vendors) (name: vendors) + > ./a a + > ./b b + > ./c c + ./node_modules/x.js X bytes [built] [code generated] + ./node_modules/y.js X bytes [built] [code generated] + ./node_modules/z.js X bytes [built] [code generated] + chunk (runtime: b) vendors/b.js (b) X bytes (javascript) X KiB (runtime) [entry] [rendered] + > ./b b + runtime modules X KiB 4 modules + dependent modules X bytes [dependent] 2 modules + ./b.js X bytes [built] [code generated] + chunk (runtime: main) vendors/async-a.js (async-a) X bytes [rendered] + > ./a ./index.js 1:0-47 + dependent modules X bytes [dependent] 3 modules + ./a.js + 1 modules X bytes [built] [code generated] + chunk (runtime: c) vendors/c.js (c) X bytes (javascript) X KiB (runtime) [entry] [rendered] + > ./c c + runtime modules X KiB 4 modules + dependent modules X bytes [dependent] 2 modules + ./c.js X bytes [built] [code generated] + chunk (runtime: main) vendors/main.js (main) X bytes (javascript) X KiB (runtime) [entry] [rendered] + > ./ main + runtime modules X KiB 9 modules + ./index.js X bytes [built] [code generated] + chunk (runtime: main) vendors/async-c.js (async-c) X bytes [rendered] + > ./c ./index.js 3:0-47 + dependent modules X bytes [dependent] 4 modules + ./c.js X bytes [built] [code generated] + chunk (runtime: a) vendors/a.js (a) X bytes (javascript) X KiB (runtime) [entry] [rendered] + > ./a a + runtime modules X KiB 10 modules + dependent modules X bytes [dependent] 1 module + ./a.js + 1 modules X bytes [built] [code generated] + vendors (webpack x.x.x) compiled successfully + +multiple-vendors: + Entrypoint main X KiB = multiple-vendors/main.js + Entrypoint a X KiB = multiple-vendors/libs-x.js X bytes multiple-vendors/723.js X bytes multiple-vendors/425.js X bytes multiple-vendors/210.js X bytes multiple-vendors/a.js X KiB + Entrypoint b X KiB = multiple-vendors/libs-x.js X bytes multiple-vendors/723.js X bytes multiple-vendors/425.js X bytes multiple-vendors/935.js X bytes multiple-vendors/b.js X KiB + Entrypoint c X KiB = multiple-vendors/libs-x.js X bytes multiple-vendors/862.js X bytes multiple-vendors/425.js X bytes multiple-vendors/935.js X bytes multiple-vendors/c.js X KiB + chunk (runtime: a, main) multiple-vendors/async-g.js (async-g) X bytes [rendered] + > ./g ./a.js 6:0-47 + ./g.js X bytes [built] [code generated] + chunk (runtime: main) multiple-vendors/async-b.js (async-b) X bytes [rendered] + > ./b ./index.js 2:0-47 + ./b.js X bytes [built] [code generated] + chunk (runtime: b) multiple-vendors/b.js (b) X bytes (javascript) X KiB (runtime) [entry] [rendered] + > ./b b + runtime modules X KiB 4 modules + ./b.js X bytes [built] [code generated] + chunk (runtime: a, main) multiple-vendors/210.js X bytes [initial] [rendered] split chunk (cache group: default) + > ./a ./index.js 1:0-47 + > ./a a + ./e.js X bytes [built] [code generated] + chunk (runtime: main) multiple-vendors/async-a.js (async-a) X bytes [rendered] + > ./a ./index.js 1:0-47 + ./a.js X bytes [built] [code generated] + chunk (runtime: c) multiple-vendors/c.js (c) X bytes (javascript) X KiB (runtime) [entry] [rendered] + > ./c c + runtime modules X KiB 4 modules + ./c.js X bytes [built] [code generated] + chunk (runtime: a, b, c, main) multiple-vendors/libs-x.js (libs-x) (id hint: libs) X bytes [initial] [rendered] split chunk (cache group: libs) (name: libs-x) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + > ./a a + > ./b b + > ./c c + ./node_modules/x.js X bytes [built] [code generated] + chunk (runtime: a, b, c, main) multiple-vendors/425.js X bytes [initial] [rendered] split chunk (cache group: default) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + > ./a a + > ./b b + > ./c c + ./d.js X bytes [built] [code generated] + chunk (runtime: a, b, main) multiple-vendors/723.js (id hint: vendors) X bytes [initial] [rendered] split chunk (cache group: vendors) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./a a + > ./b b + ./node_modules/y.js X bytes [built] [code generated] + chunk (runtime: main) multiple-vendors/main.js (main) X bytes (javascript) X KiB (runtime) [entry] [rendered] + > ./ main + runtime modules X KiB 9 modules + ./index.js X bytes [built] [code generated] + chunk (runtime: c, main) multiple-vendors/862.js (id hint: vendors) X bytes [initial] [rendered] split chunk (cache group: vendors) + > ./c ./index.js 3:0-47 + > ./c c + ./node_modules/z.js X bytes [built] [code generated] + chunk (runtime: main) multiple-vendors/async-c.js (async-c) X bytes [rendered] + > ./c ./index.js 3:0-47 + ./c.js X bytes [built] [code generated] + chunk (runtime: a, b, c, main) multiple-vendors/935.js X bytes [initial] [rendered] split chunk (cache group: default) + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + > ./g ./a.js 6:0-47 + > ./b b + > ./c c + ./f.js X bytes [built] [code generated] + chunk (runtime: a) multiple-vendors/a.js (a) X bytes (javascript) X KiB (runtime) [entry] [rendered] + > ./a a + runtime modules X KiB 10 modules + ./a.js X bytes [built] [code generated] + multiple-vendors (webpack x.x.x) compiled successfully + +all: + Entrypoint main X KiB = all/main.js + Entrypoint a X KiB = all/628.js X bytes all/723.js X bytes all/425.js X bytes all/210.js X bytes all/a.js X KiB + Entrypoint b X KiB = all/628.js X bytes all/723.js X bytes all/425.js X bytes all/935.js X bytes all/b.js X KiB + Entrypoint c X KiB = all/628.js X bytes all/862.js X bytes all/425.js X bytes all/935.js X bytes all/c.js X KiB + chunk (runtime: a, main) all/async-g.js (async-g) X bytes [rendered] + > ./g ./a.js 6:0-47 + ./g.js X bytes [built] [code generated] + chunk (runtime: main) all/async-b.js (async-b) X bytes [rendered] + > ./b ./index.js 2:0-47 + ./b.js X bytes [built] [code generated] + chunk (runtime: b) all/b.js (b) X bytes (javascript) X KiB (runtime) [entry] [rendered] + > ./b b + runtime modules X KiB 4 modules + ./b.js X bytes [built] [code generated] + chunk (runtime: a, main) all/210.js X bytes [initial] [rendered] split chunk (cache group: default) + > ./a ./index.js 1:0-47 + > ./a a + ./e.js X bytes [built] [code generated] + chunk (runtime: main) all/async-a.js (async-a) X bytes [rendered] + > ./a ./index.js 1:0-47 + ./a.js X bytes [built] [code generated] + chunk (runtime: c) all/c.js (c) X bytes (javascript) X KiB (runtime) [entry] [rendered] + > ./c c + runtime modules X KiB 4 modules + ./c.js X bytes [built] [code generated] + chunk (runtime: a, b, c, main) all/425.js X bytes [initial] [rendered] split chunk (cache group: default) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + > ./a a + > ./b b + > ./c c + ./d.js X bytes [built] [code generated] + chunk (runtime: a, b, c, main) all/628.js (id hint: vendors) X bytes [initial] [rendered] split chunk (cache group: vendors) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + > ./a a + > ./b b + > ./c c + ./node_modules/x.js X bytes [built] [code generated] + chunk (runtime: a, b, main) all/723.js (id hint: vendors) X bytes [initial] [rendered] split chunk (cache group: vendors) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./a a + > ./b b + ./node_modules/y.js X bytes [built] [code generated] + chunk (runtime: main) all/main.js (main) X bytes (javascript) X KiB (runtime) [entry] [rendered] + > ./ main + runtime modules X KiB 9 modules + ./index.js X bytes [built] [code generated] + chunk (runtime: c, main) all/862.js (id hint: vendors) X bytes [initial] [rendered] split chunk (cache group: vendors) + > ./c ./index.js 3:0-47 + > ./c c + ./node_modules/z.js X bytes [built] [code generated] + chunk (runtime: main) all/async-c.js (async-c) X bytes [rendered] + > ./c ./index.js 3:0-47 + ./c.js X bytes [built] [code generated] + chunk (runtime: a, b, c, main) all/935.js X bytes [initial] [rendered] split chunk (cache group: default) + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + > ./g ./a.js 6:0-47 + > ./b b + > ./c c + ./f.js X bytes [built] [code generated] + chunk (runtime: a) all/a.js (a) X bytes (javascript) X KiB (runtime) [entry] [rendered] + > ./a a + runtime modules X KiB 10 modules + ./a.js X bytes [built] [code generated] + all (webpack x.x.x) compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for cause-error 1`] = ` +"asset main.js X KiB [emitted] (name: main) +./index.js X bytes [built] [code generated] + +WARNING in aggregate error + [cause]: cause + cause + cause + [cause]: nested string cause + [errors]: first error + [cause]: cause + [cause]: nested cause in errors + [errors]: second string error + [errors]: third nested aggregate error + [errors]: nested first + [errors]: nested second + +WARNING in error with case + [cause]: error case + +WARNING in error with nested error case + [cause]: test + [cause]: nested case + +WARNING in error with string case + [cause]: string case + +WARNING in webpack error with case + [cause]: cause + +WARNING in webpack error + +ERROR in aggregate error + [cause]: cause + cause + cause + [cause]: nested string cause + [errors]: first error + [cause]: cause + [cause]: nested cause in errors + [errors]: second string error + [errors]: third nested aggregate error + [errors]: nested first + [errors]: nested second + +ERROR in error with case + [cause]: error case + +ERROR in error with nested error case + [cause]: test + [cause]: nested case + +ERROR in error with string case + [cause]: string case + +ERROR in webpack error with case + [cause]: cause + +ERROR in webpack error + +error cause (webpack x.x.x) compiled with 6 errors and 6 warnings in X ms" +`; + +exports[`StatsTestCases should print correct stats for child-compiler-apply-entry-option 1`] = ` +"asset child.js X bytes [emitted] +asset parent.js X bytes [emitted] (name: parent) +Entrypoint parent X bytes = parent.js +./parent.js X bytes [built] [code generated] + assets by status X bytes [cached] 1 asset + Entrypoint child = child.js + ./child.js X bytes [built] [code generated] + + Child TestApplyEntryOptionPlugin compiled successfully + +WARNING in configuration +The 'mode' option has not been set, webpack will fallback to 'production' for this value. +Set 'mode' option to 'development' or 'production' to enable defaults for each environment. +You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/configuration/mode/ + +webpack x.x.x compiled with 1 warning in X ms" +`; + +exports[`StatsTestCases should print correct stats for chunk-module-id-range 1`] = ` +"PublicPath: auto +asset main1.js X KiB [emitted] (name: main1) +asset main2.js X KiB [emitted] (name: main2) +Entrypoint main1 X KiB = main1.js +Entrypoint main2 X KiB = main2.js +chunk (runtime: main1) main1.js (main1) X bytes (javascript) X bytes (runtime) [entry] [rendered] + > ./main1 main1 + runtime modules X bytes 3 modules + cacheable modules X bytes + ./a.js X bytes [dependent] [built] [code generated] + ./b.js X bytes [dependent] [built] [code generated] + ./c.js X bytes [dependent] [built] [code generated] + ./d.js X bytes [dependent] [built] [code generated] + ./main1.js X bytes [built] [code generated] +chunk (runtime: main2) main2.js (main2) X bytes (javascript) X bytes (runtime) [entry] [rendered] + > ./main2 main2 + runtime modules X bytes 3 modules + cacheable modules X bytes + ./a.js X bytes [dependent] [built] [code generated] + ./d.js X bytes [dependent] [built] [code generated] + ./e.js X bytes [dependent] [built] [code generated] + ./f.js X bytes [dependent] [built] [code generated] + ./main2.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for chunks 1`] = ` +"PublicPath: auto +asset bundle.js X KiB [emitted] (name: main) +asset 964.bundle.js X bytes [emitted] +asset 226.bundle.js X bytes [emitted] +asset 899.bundle.js X bytes [emitted] +chunk (runtime: main) 226.bundle.js X bytes <{964}> [rendered] + > ./c.js 1:0-52 + ./d.js X bytes [built] [code generated] + require.ensure item ./d ./c.js 1:0-52 + cjs self exports reference ./d.js 1:0-14 + X ms -> X ms -> + X ms (resolving: X ms, restoring: X ms, integration: X ms, building: X ms, storing: X ms) + ./e.js X bytes [built] [code generated] + require.ensure item ./e ./c.js 1:0-52 + cjs self exports reference ./e.js 1:0-14 + X ms -> X ms -> + X ms (resolving: X ms, restoring: X ms, integration: X ms, building: X ms, storing: X ms) +chunk (runtime: main) bundle.js (main) X bytes (javascript) X KiB (runtime) >{899}< >{964}< [entry] [rendered] + > ./index main + runtime modules X KiB 7 modules + cacheable modules X bytes + ./a.js X bytes [dependent] [built] [code generated] + cjs self exports reference ./a.js 1:0-14 + cjs require ./a ./index.js 1:0-14 + X ms -> + X ms (resolving: X ms, restoring: X ms, integration: X ms, building: X ms, storing: X ms) + ./index.js X bytes [built] [code generated] + entry ./index main + X ms (resolving: X ms, restoring: X ms, integration: X ms, building: X ms, storing: X ms) +chunk (runtime: main) 899.bundle.js X bytes <{792}> [rendered] + > ./b ./index.js 2:0-16 + ./b.js X bytes [built] [code generated] + cjs self exports reference ./b.js 1:0-14 + amd require ./b ./index.js 2:0-16 + X ms -> + X ms (resolving: X ms, restoring: X ms, integration: X ms, building: X ms, storing: X ms) +chunk (runtime: main) 964.bundle.js X bytes <{792}> >{226}< [rendered] + > ./c ./index.js 3:0-16 + ./c.js X bytes [built] [code generated] + amd require ./c ./index.js 3:0-16 + X ms -> + X ms (resolving: X ms, restoring: X ms, integration: X ms, building: X ms, storing: X ms) +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for chunks-development 1`] = ` +"PublicPath: auto +asset bundle.js X KiB [emitted] (name: main) +asset d_js-e_js.bundle.js X KiB [emitted] +asset c_js.bundle.js X bytes [emitted] +asset b_js.bundle.js X bytes [emitted] +chunk (runtime: main) b_js.bundle.js X bytes <{main}> [rendered] + > ./b ./index.js 2:0-16 + ./b.js X bytes [built] [code generated] + cjs self exports reference ./b.js 1:0-14 + amd require ./b ./index.js 2:0-16 + X ms -> + X ms (resolving: X ms, restoring: X ms, integration: X ms, building: X ms, storing: X ms) +chunk (runtime: main) c_js.bundle.js X bytes <{main}> >{d_js-e_js}< [rendered] + > ./c ./index.js 3:0-16 + ./c.js X bytes [built] [code generated] + amd require ./c ./index.js 3:0-16 + X ms -> + X ms (resolving: X ms, restoring: X ms, integration: X ms, building: X ms, storing: X ms) +chunk (runtime: main) d_js-e_js.bundle.js X bytes <{c_js}> [rendered] + > ./c.js 1:0-52 + ./d.js X bytes [built] [code generated] + require.ensure item ./d ./c.js 1:0-52 + cjs self exports reference ./d.js 1:0-14 + X ms -> X ms -> + X ms (resolving: X ms, restoring: X ms, integration: X ms, building: X ms, storing: X ms) + ./e.js X bytes [built] [code generated] + require.ensure item ./e ./c.js 1:0-52 + cjs self exports reference ./e.js 2:0-14 + X ms -> X ms -> + X ms (resolving: X ms, restoring: X ms, integration: X ms, building: X ms, storing: X ms) +chunk (runtime: main) bundle.js (main) X bytes (javascript) X KiB (runtime) >{b_js}< >{c_js}< [entry] [rendered] + > ./index main + runtime modules X KiB 7 modules + cacheable modules X bytes + ./a.js X bytes [dependent] [built] [code generated] + cjs self exports reference ./a.js 1:0-14 + cjs require ./a ./e.js 1:0-14 + cjs require ./a ./index.js 1:0-14 + X ms -> + X ms (resolving: X ms, restoring: X ms, integration: X ms, building: X ms, storing: X ms) + ./index.js X bytes [built] [code generated] + entry ./index main + X ms (resolving: X ms, restoring: X ms, integration: X ms, building: X ms, storing: X ms) +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for circular-correctness 1`] = ` +"chunk (runtime: main) 199.bundle.js (b) X bytes <{390}> <{792}> >{390}< [rendered] + ./module-b.js X bytes [built] [code generated] +chunk (runtime: main) 390.bundle.js (c) X bytes <{199}> <{996}> >{199}< >{996}< [rendered] + ./module-c.js X bytes [built] [code generated] +chunk (runtime: main) bundle.js (main) X bytes (javascript) X KiB (runtime) >{199}< >{996}< [entry] [rendered] + runtime modules X KiB 10 modules + ./index.js X bytes [built] [code generated] +chunk (runtime: main) 996.bundle.js (a) X bytes <{390}> <{792}> >{390}< [rendered] + ./module-a.js X bytes [built] [code generated] +webpack x.x.x compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for color-disabled 1`] = ` +"asset main.js X bytes [emitted] (name: main) +./index.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for color-enabled 1`] = ` +"asset main.js X bytes [emitted] (name: main) +./index.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for color-enabled-custom 1`] = ` +"asset main.js X bytes [emitted] (name: main) +./index.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for common-libs 1`] = ` +"asset react.js X KiB [emitted] [minimized] (name: react) 1 related asset +./react.js X bytes [built] [code generated] +../../../node_modules/react/index.js X bytes [built] [code generated] +../../../node_modules/react/cjs/react.production.js X KiB [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for commons-chunk-min-size-0 1`] = ` +"asset entry-1.js X KiB [emitted] (name: entry-1) +asset 903.js X bytes [emitted] (id hint: vendor-1) +Entrypoint entry-1 X KiB = 903.js X bytes entry-1.js X KiB +runtime modules X KiB 3 modules +modules by path ./modules/*.js X bytes + ./modules/a.js X bytes [built] [code generated] + ./modules/b.js X bytes [built] [code generated] + ./modules/c.js X bytes [built] [code generated] + ./modules/d.js X bytes [built] [code generated] + ./modules/e.js X bytes [built] [code generated] + ./modules/f.js X bytes [built] [code generated] +./entry-1.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for commons-chunk-min-size-Infinity 1`] = ` +"asset entry-1.js X KiB [emitted] (name: entry-1) +asset vendor-1.js X bytes [emitted] (name: vendor-1) (id hint: vendor-1) +Entrypoint entry-1 X KiB = vendor-1.js X bytes entry-1.js X KiB +runtime modules X KiB 3 modules +modules by path ./modules/*.js X bytes + ./modules/a.js X bytes [built] [code generated] + ./modules/b.js X bytes [built] [code generated] + ./modules/c.js X bytes [built] [code generated] + ./modules/d.js X bytes [built] [code generated] + ./modules/e.js X bytes [built] [code generated] + ./modules/f.js X bytes [built] [code generated] +./entry-1.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for commons-plugin-issue-4980 1`] = ` +"asset app.XXXXXXXXXXXXXXXXXXXX-X.js X KiB [emitted] [immutable] (name: app) +asset vendor.XXXXXXXXXXXXXXXXXXXX-X.js X bytes [emitted] [immutable] (name: vendor) (id hint: vendor) +Entrypoint app X KiB = vendor.XXXXXXXXXXXXXXXXXXXX-X.js X bytes app.XXXXXXXXXXXXXXXXXXXX-X.js X KiB +runtime modules X KiB 4 modules +orphan modules X bytes [orphan] 2 modules +cacheable modules X bytes + ./entry-1.js + 2 modules X bytes [built] [code generated] + ./constants.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms + +asset app.XXXXXXXXXXXXXXXXXXXX-X.js X KiB [emitted] [immutable] (name: app) +asset vendor.XXXXXXXXXXXXXXXXXXXX-X.js X bytes [emitted] [immutable] (name: vendor) (id hint: vendor) +Entrypoint app X KiB = vendor.XXXXXXXXXXXXXXXXXXXX-X.js X bytes app.XXXXXXXXXXXXXXXXXXXX-X.js X KiB +runtime modules X KiB 4 modules +orphan modules X bytes [orphan] 2 modules +cacheable modules X bytes + ./entry-2.js + 2 modules X bytes [built] [code generated] + ./constants.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for concat-and-sideeffects 1`] = ` +"./index.js + 2 modules X bytes [built] [code generated] + | ./index.js X bytes [built] + | Statement (ExpressionStatement) with side effects in source code at 3:0-15 + | ./node_modules/pmodule/a.js X bytes [built] + | ./node_modules/pmodule/aa.js X bytes [built] +./node_modules/pmodule/a.js X bytes [orphan] [built] +./node_modules/pmodule/index.js X bytes [orphan] [built] + ModuleConcatenation bailout: Module is not in any chunk +./node_modules/pmodule/aa.js X bytes [orphan] [built] +./node_modules/pmodule/b.js X bytes [orphan] [built] + ModuleConcatenation bailout: Module is not in any chunk +./node_modules/pmodule/c.js X bytes [orphan] [built] + ModuleConcatenation bailout: Module is not in any chunk +./node_modules/pmodule/bb.js X bytes [orphan] [built] + ModuleConcatenation bailout: Module is not in any chunk +./node_modules/pmodule/cc.js X bytes [orphan] [built] + ModuleConcatenation bailout: Module is not in any chunk" +`; + +exports[`StatsTestCases should print correct stats for context-independence 1`] = ` +"asset main-XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] (name: main) + sourceMap main-XXXXXXXXXXXXXXXXXXXX.js.map X KiB [emitted] [dev] (auxiliary name: main) +asset 977-XXXXXXXXXXXXXXXXXXXX.js X bytes [emitted] [immutable] + sourceMap 977-XXXXXXXXXXXXXXXXXXXX.js.map X bytes [emitted] [dev] +runtime modules X KiB 9 modules +orphan modules X bytes [orphan] 1 module +built modules X bytes [built] + modules by path ./a/*.js X bytes + ./a/index.js (in my-layer) X bytes [built] [code generated] + ./a/chunk.js + 1 modules (in my-layer) X bytes [built] [code generated] + modules by path ./a/c/ X bytes + ./a/c/ ./a/cc/ eager ^\\\\.\\\\/.*$ namespace object (in my-layer) X bytes [built] [code generated] + ./a/c/a.js (in my-layer) X bytes [optional] [built] [code generated] + ./a/cc/b.js (in my-layer) X bytes [optional] [built] [code generated] +webpack x.x.x compiled successfully in X ms + +asset main-XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] (name: main) + sourceMap main-XXXXXXXXXXXXXXXXXXXX.js.map X KiB [emitted] [dev] (auxiliary name: main) +asset 977-XXXXXXXXXXXXXXXXXXXX.js X bytes [emitted] [immutable] + sourceMap 977-XXXXXXXXXXXXXXXXXXXX.js.map X bytes [emitted] [dev] +runtime modules X KiB 9 modules +orphan modules X bytes [orphan] 1 module +built modules X bytes [built] + modules by path ./b/*.js X bytes + ./b/index.js (in my-layer) X bytes [built] [code generated] + ./b/chunk.js + 1 modules (in my-layer) X bytes [built] [code generated] + modules by path ./b/c/ X bytes + ./b/c/ ./b/cc/ eager ^\\\\.\\\\/.*$ namespace object (in my-layer) X bytes [built] [code generated] + ./b/c/a.js (in my-layer) X bytes [optional] [built] [code generated] + ./b/cc/b.js (in my-layer) X bytes [optional] [built] [code generated] +webpack x.x.x compiled successfully in X ms + +asset main-XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] (name: main) +asset 977-XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] +runtime modules X KiB 9 modules +orphan modules X bytes [orphan] 1 module +built modules X bytes [built] + modules by path ./a/*.js X bytes + ./a/index.js (in my-layer) X bytes [built] [code generated] + ./a/chunk.js + 1 modules (in my-layer) X bytes [built] [code generated] + modules by path ./a/c/ X bytes + ./a/c/ ./a/cc/ eager ^\\\\.\\\\/.*$ namespace object (in my-layer) X bytes [built] [code generated] + ./a/c/a.js (in my-layer) X bytes [optional] [built] [code generated] + ./a/cc/b.js (in my-layer) X bytes [optional] [built] [code generated] +webpack x.x.x compiled successfully in X ms + +asset main-XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] (name: main) +asset 977-XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] +runtime modules X KiB 9 modules +orphan modules X bytes [orphan] 1 module +built modules X bytes [built] + modules by path ./b/*.js X bytes + ./b/index.js (in my-layer) X bytes [built] [code generated] + ./b/chunk.js + 1 modules (in my-layer) X bytes [built] [code generated] + modules by path ./b/c/ X bytes + ./b/c/ ./b/cc/ eager ^\\\\.\\\\/.*$ namespace object (in my-layer) X bytes [built] [code generated] + ./b/c/a.js (in my-layer) X bytes [optional] [built] [code generated] + ./b/cc/b.js (in my-layer) X bytes [optional] [built] [code generated] +webpack x.x.x compiled successfully in X ms + +asset main-XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] (name: main) +asset 977-XXXXXXXXXXXXXXXXXXXX.js X bytes [emitted] [immutable] +runtime modules X KiB 9 modules +orphan modules X bytes [orphan] 1 module +built modules X bytes [built] + modules by path ./a/*.js X bytes + ./a/index.js (in my-layer) X bytes [built] [code generated] + ./a/chunk.js + 1 modules (in my-layer) X bytes [built] [code generated] + modules by path ./a/c/ X bytes + ./a/c/ ./a/cc/ eager ^\\\\.\\\\/.*$ namespace object (in my-layer) X bytes [built] [code generated] + ./a/c/a.js (in my-layer) X bytes [optional] [built] [code generated] + ./a/cc/b.js (in my-layer) X bytes [optional] [built] [code generated] +webpack x.x.x compiled successfully in X ms + +asset main-XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] (name: main) +asset 977-XXXXXXXXXXXXXXXXXXXX.js X bytes [emitted] [immutable] +runtime modules X KiB 9 modules +orphan modules X bytes [orphan] 1 module +built modules X bytes [built] + modules by path ./b/*.js X bytes + ./b/index.js (in my-layer) X bytes [built] [code generated] + ./b/chunk.js + 1 modules (in my-layer) X bytes [built] [code generated] + modules by path ./b/c/ X bytes + ./b/c/ ./b/cc/ eager ^\\\\.\\\\/.*$ namespace object (in my-layer) X bytes [built] [code generated] + ./b/c/a.js (in my-layer) X bytes [optional] [built] [code generated] + ./b/cc/b.js (in my-layer) X bytes [optional] [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for custom-terser 1`] = ` +"asset bundle.js X bytes [emitted] [minimized] (name: main) +./index.js X bytes [built] [code generated] + [no exports used] +./a.js X bytes [built] [code generated] + [used exports unknown] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for define-plugin 1`] = ` +"asset 123.js X KiB [emitted] (name: main) +./index.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms + +asset 321.js X KiB [emitted] (name: main) +./index.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms + +asset both.js X KiB [emitted] (name: main) +./index.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms + +asset log.js X KiB [emitted] (name: main) +./index.js X bytes [built] [code generated] + +DEBUG LOG from webpack.DefinePlugin + Replaced \\"VALUE\\" with \\"123\\" + +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for details-error 1`] = ` +"0 errors 0 warnings: + asset 0.js X KiB [emitted] (name: main) + ./index.js X bytes [built] [code generated] + 0 errors 0 warnings (webpack x.x.x) compiled successfully in X ms + +1 errors 0 warnings: + asset 1.js X KiB [emitted] (name: main) + ./index.js X bytes [built] [code generated] + + ERROR in Test + Error details + + 1 errors 0 warnings (webpack x.x.x) compiled with 1 error in X ms + +0 errors 1 warnings: + asset 10.js X KiB [emitted] (name: main) + ./index.js X bytes [built] [code generated] + + WARNING in Test + + 1 warning has detailed information that is not shown. + Use 'stats.errorDetails: true' resp. '--stats-error-details' to show it. + + 0 errors 1 warnings (webpack x.x.x) compiled with 1 warning in X ms + +2 errors 0 warnings: + asset 2.js X KiB [emitted] (name: main) + ./index.js X bytes [built] [code generated] + + ERROR in Test + Error details + + ERROR in Test + Error details + + 2 errors 0 warnings (webpack x.x.x) compiled with 2 errors in X ms + +0 errors 2 warnings: + asset 20.js X KiB [emitted] (name: main) + ./index.js X bytes [built] [code generated] + + WARNING in Test + + WARNING in Test + + 2 warnings have detailed information that is not shown. + Use 'stats.errorDetails: true' resp. '--stats-error-details' to show it. + + 0 errors 2 warnings (webpack x.x.x) compiled with 2 warnings in X ms + +1 errors 1 warnings: + asset 11.js X KiB [emitted] (name: main) + ./index.js X bytes [built] [code generated] + + WARNING in Test + + 1 warning has detailed information that is not shown. + Use 'stats.errorDetails: true' resp. '--stats-error-details' to show it. + + ERROR in Test + Error details + + 1 errors 1 warnings (webpack x.x.x) compiled with 1 error and 1 warning in X ms + +2 errors 1 warnings: + asset 12.js X KiB [emitted] (name: main) + ./index.js X bytes [built] [code generated] + + WARNING in Test + + 1 warning has detailed information that is not shown. + Use 'stats.errorDetails: true' resp. '--stats-error-details' to show it. + + ERROR in Test + Error details + + ERROR in Test + Error details + + 2 errors 1 warnings (webpack x.x.x) compiled with 2 errors and 1 warning in X ms + +3 errors 1 warnings: + asset 13.js X KiB [emitted] (name: main) + ./index.js X bytes [built] [code generated] + + WARNING in Test + + 1 warning has detailed information that is not shown. + Use 'stats.errorDetails: true' resp. '--stats-error-details' to show it. + + ERROR in Test + + ERROR in Test + + ERROR in Test + + 3 errors have detailed information that is not shown. + Use 'stats.errorDetails: true' resp. '--stats-error-details' to show it. + + 3 errors 1 warnings (webpack x.x.x) compiled with 3 errors and 1 warning in X ms + +3 errors 0 warnings: + asset 3.js X KiB [emitted] (name: main) + ./index.js X bytes [built] [code generated] + + ERROR in Test + + ERROR in Test + + ERROR in Test + + 3 errors have detailed information that is not shown. + Use 'stats.errorDetails: true' resp. '--stats-error-details' to show it. + + 3 errors 0 warnings (webpack x.x.x) compiled with 3 errors in X ms + +0 errors 3 warnings: + asset 30.js X KiB [emitted] (name: main) + ./index.js X bytes [built] [code generated] + + WARNING in Test + + WARNING in Test + + WARNING in Test + + 3 warnings have detailed information that is not shown. + Use 'stats.errorDetails: true' resp. '--stats-error-details' to show it. + + 0 errors 3 warnings (webpack x.x.x) compiled with 3 warnings in X ms" +`; + +exports[`StatsTestCases should print correct stats for dll-reference-plugin-issue-7624 1`] = ` +"asset bundle.js X bytes [emitted] (name: main) +./entry.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for dll-reference-plugin-issue-7624-error 1`] = ` +"assets by status X bytes [cached] 1 asset +./entry.js X bytes [built] [code generated] + +ERROR in Dll manifest ./blank-manifest.json +Unexpected end of JSON input while parsing empty string + +webpack x.x.x compiled with 1 error in X ms" +`; + +exports[`StatsTestCases should print correct stats for dynamic-chunk-name-error 1`] = ` +"assets by status X KiB [cached] 3 assets +runtime modules X KiB 8 modules +cacheable modules X bytes + ./entry-1.js X bytes [built] [code generated] + ./entry-2.js X bytes [built] [code generated] + ./entry-3.js X bytes [built] [code generated] + ./dynamic.js X bytes [built] [code generated] + +ERROR in ./entry-1.js 1:7-58 +It's not allowed to load an initial chunk on demand. The chunk name \\"entry2\\" is already used by an entrypoint. + +ERROR in ./entry-3.js 1:7-58 +It's not allowed to load an initial chunk on demand. The chunk name \\"entry3\\" is already used by an entrypoint. + +webpack x.x.x compiled with 2 errors in X ms" +`; + +exports[`StatsTestCases should print correct stats for dynamic-import 1`] = ` +"asset common.js X KiB [emitted] (name: common) (id hint: vendors) +asset runtime.js X KiB [emitted] (name: runtime) +asset pages/home.js X KiB [emitted] (name: pages/home) +asset main.js X KiB [emitted] (name: main) +Entrypoint main X MiB = runtime.js X KiB common.js X KiB main.js X KiB +runtime modules X KiB 12 modules +built modules X MiB [built] + modules by path ../../../node_modules/ X KiB + modules by path ../../../node_modules/react/ X KiB 4 modules + modules by path ../../../node_modules/react-dom/ X KiB + modules by path ../../../node_modules/react-dom/*.js X KiB 2 modules + modules by path ../../../node_modules/react-dom/cjs/*.js X KiB 2 modules + modules by path ../../../node_modules/scheduler/ X KiB + ../../../node_modules/scheduler/index.js X bytes [built] [code generated] + ../../../node_modules/scheduler/cjs/scheduler.development.js X KiB [built] [code generated] + modules by path ./src/ X KiB + ./src/index.js X bytes [built] [code generated] + ./src/pages/ lazy ^\\\\.\\\\/.*$ chunkName: pages/[request] namespace object X bytes [built] [code generated] + ./src/pages/home.js X KiB [optional] [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for entry-filename 1`] = ` +"PublicPath: auto +asset a.js X KiB [emitted] (name: a) +asset c.js X KiB [emitted] (name: b) +chunk (runtime: b) c.js (b) X bytes [entry] [rendered] + > ./b.js b + ./b.js X bytes [built] [code generated] + cjs self exports reference ./b.js 1:0-14 + entry ./b.js b + X ms (resolving: X ms, restoring: X ms, integration: X ms, building: X ms, storing: X ms) +chunk (runtime: a) a.js (a) X bytes [entry] [rendered] + > ./a.js a + ./a.js X bytes [built] [code generated] + cjs self exports reference ./a.js 1:0-14 + entry ./a.js a + X ms (resolving: X ms, restoring: X ms, integration: X ms, building: X ms, storing: X ms) +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for errors-space-error 1`] = ` +"assets by status X bytes [cached] 1 asset +./loader.js!./index.js X bytes [built] [code generated] [2 errors] + +ERROR in ./index.js (./loader.js!./index.js) +Module Error (from ./loader.js): +loader error1 + +ERROR in ./index.js (./loader.js!./index.js) +Module Error (from ./loader.js): +loader error2 + +2 errors have detailed information that is not shown. +Use 'stats.errorDetails: true' resp. '--stats-error-details' to show it. + +webpack x.x.x compiled with 2 errors in X ms + +assets by status X bytes [cached] 1 asset +./loader.js!./index.js X bytes [built] [code generated] [2 errors] + +ERROR in ./index.js (./loader.js!./index.js) +Module Error (from ./loader.js): +loader error1 + +ERROR in ./index.js (./loader.js!./index.js) +Module Error (from ./loader.js): +loader error2 + +2 errors have detailed information that is not shown. +Use 'stats.errorDetails: true' resp. '--stats-error-details' to show it. + +webpack x.x.x compiled with 2 errors in X ms + +assets by status X bytes [cached] 1 asset +./loader.js!./index.js X bytes [built] [code generated] [2 errors] + +ERROR in ./index.js (./loader.js!./index.js) +Module Error (from ./loader.js): +loader error1 + +ERROR in ./index.js (./loader.js!./index.js) +Module Error (from ./loader.js): +loader error2 + +2 errors have detailed information that is not shown. +Use 'stats.errorDetails: true' resp. '--stats-error-details' to show it. + +webpack x.x.x compiled with 2 errors in X ms + +assets by status X bytes [cached] 1 asset +./loader.js!./index.js X bytes [built] [code generated] [2 errors] + +ERROR in ./index.js (./loader.js!./index.js) +Module Error (from ./loader.js): +loader error1 +stack1 ++ 2 hidden lines + +ERROR in ./index.js (./loader.js!./index.js) +Module Error (from ./loader.js): +loader error2 + +1 error has detailed information that is not shown. +Use 'stats.errorDetails: true' resp. '--stats-error-details' to show it. + +webpack x.x.x compiled with 2 errors in X ms + +assets by status X bytes [cached] 1 asset +./loader.js!./index.js X bytes [built] [code generated] [2 errors] + +ERROR in ./index.js (./loader.js!./index.js) +Module Error (from ./loader.js): +loader error1 +stack1 +stack2 +stack3 + +ERROR in ./index.js (./loader.js!./index.js) +Module Error (from ./loader.js): +loader error2 + +1 error has detailed information that is not shown. +Use 'stats.errorDetails: true' resp. '--stats-error-details' to show it. + +webpack x.x.x compiled with 2 errors in X ms + +assets by status X bytes [cached] 1 asset +./loader.js!./index.js X bytes [built] [code generated] [2 errors] + +ERROR in ./index.js (./loader.js!./index.js) +Module Error (from ./loader.js): +loader error1 +stack1 +stack2 +stack3 + +ERROR in ./index.js (./loader.js!./index.js) +Module Error (from ./loader.js): +loader error2 +stack1 +stack2 + +webpack x.x.x compiled with 2 errors in X ms" +`; + +exports[`StatsTestCases should print correct stats for exclude-with-loader 1`] = ` +"hidden assets X bytes 1 asset +asset bundle.js X KiB [emitted] (name: main) +runtime modules X KiB 5 modules +hidden modules X bytes 2 modules +cacheable modules X bytes + ./index.js X bytes [built] [code generated] + ./a.txt X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for external 1`] = ` +"asset main.js X KiB [emitted] (name: main) +./index.js X bytes [built] [code generated] +external \\"test\\" X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for graph-correctness-entries 1`] = ` +"chunk (runtime: e2) e2.js (e2) X bytes (javascript) X KiB (runtime) >{390}< [entry] [rendered] + runtime modules X KiB 10 modules + ./e2.js X bytes [built] [code generated] + entry ./e2 e2 +chunk (runtime: e1, e2) b.js (b) X bytes <{996}> >{390}< [rendered] + ./module-b.js X bytes [built] [code generated] + import() ./module-b ./module-a.js 1:0-47 +chunk (runtime: e1) e1.js (e1) X bytes (javascript) X KiB (runtime) >{996}< [entry] [rendered] + runtime modules X KiB 10 modules + ./e1.js X bytes [built] [code generated] + entry ./e1 e1 +chunk (runtime: e1, e2) c.js (c) X bytes <{130}> <{199}> >{996}< [rendered] + ./module-c.js X bytes [built] [code generated] + import() ./module-c ./e2.js 1:0-47 + import() ./module-c ./module-b.js 1:0-47 +chunk (runtime: e1, e2) a.js (a) X bytes <{321}> <{390}> >{199}< [rendered] + ./module-a.js X bytes [built] [code generated] + import() ./module-a ./e1.js 1:0-47 + import() ./module-a ./module-c.js 1:0-47 +webpack x.x.x compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for graph-correctness-modules 1`] = ` +"chunk (runtime: e2) e2.js (e2) X bytes (javascript) X KiB (runtime) >{390}< >{460}< [entry] [rendered] + runtime modules X KiB 11 modules + cacheable modules X bytes + ./e2.js X bytes [built] [code generated] + entry ./e2 e2 + ./module-x.js X bytes [dependent] [built] [code generated] + harmony side effect evaluation ./module-x ./e1.js 1:0-20 + harmony side effect evaluation ./module-x ./e2.js 1:0-20 + import() ./module-x ./module-b.js 2:0-20 +chunk (runtime: e1, e2) b.js (b) X bytes <{996}> >{390}< [rendered] + ./module-b.js X bytes [built] [code generated] + import() ./module-b ./module-a.js 1:0-47 +chunk (runtime: e1) e1.js (e1) X bytes (javascript) X KiB (runtime) >{460}< >{996}< [entry] [rendered] + runtime modules X KiB 11 modules + cacheable modules X bytes + ./e1.js X bytes [built] [code generated] + entry ./e1 e1 + ./module-x.js X bytes [dependent] [built] [code generated] + harmony side effect evaluation ./module-x ./e1.js 1:0-20 + harmony side effect evaluation ./module-x ./e2.js 1:0-20 + import() ./module-x ./module-b.js 2:0-20 +chunk (runtime: e1, e2) c.js (c) X bytes <{130}> <{199}> >{996}< [rendered] + ./module-c.js X bytes [built] [code generated] + import() ./module-c ./e2.js 2:0-47 + import() ./module-c ./module-b.js 1:0-47 +chunk (runtime: e1, e2) y.js (y) X bytes <{130}> <{321}> [rendered] + ./module-y.js X bytes [built] [code generated] + import() ./module-y ./module-x.js 1:0-47 +chunk (runtime: e1, e2) a.js (a) X bytes <{321}> <{390}> >{199}< [rendered] + ./module-a.js X bytes [built] [code generated] + import() ./module-a ./e1.js 2:0-47 + import() ./module-a ./module-c.js 1:0-47 +webpack x.x.x compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for graph-roots 1`] = ` +"chunk (runtime: main) cycle.js (cycle) X bytes [rendered] + ./cycle/a.js X bytes [built] [code generated] + ./cycle/b.js X bytes [built] [code generated] + ./cycle/c.js X bytes [built] [code generated] + ./cycle/index.js X bytes [built] [code generated] +chunk (runtime: main) cycle2.js (cycle2) X bytes [rendered] + dependent modules X bytes [dependent] 3 modules + ./cycle2/index.js X bytes [built] [code generated] +chunk (runtime: main) cycles.js (cycles) X bytes [rendered] + dependent modules X bytes [dependent] 6 modules + ./cycles/1/index.js X bytes [built] [code generated] + ./cycles/2/index.js X bytes [built] [code generated] +chunk (runtime: main) id-equals-name_js.js (id-equals-name_js) X bytes [rendered] + ./id-equals-name.js?1 X bytes [built] [code generated] +chunk (runtime: main) id-equals-name_js-_70e2.js (id-equals-name_js-_70e2) X bytes [rendered] + ./id-equals-name.js?2 X bytes [built] [code generated] +chunk (runtime: main) id-equals-name_js0.js X bytes [rendered] + ./id-equals-name.js X bytes [built] [code generated] +chunk (runtime: main) id-equals-name_js_3.js X bytes [rendered] + ./id-equals-name.js?3 X bytes [built] [code generated] +chunk (runtime: main) main.js (main) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 9 modules + ./index.js X bytes [built] [code generated] +chunk (runtime: main) tree.js (tree) X bytes [rendered] + dependent modules X bytes [dependent] 3 modules + ./tree/index.js X bytes [built] [code generated] +chunk (runtime: main) trees.js (trees) X bytes [rendered] + dependent modules X bytes [dependent] 3 modules + ./trees/1.js X bytes [built] [code generated] + ./trees/2.js X bytes [built] [code generated] + ./trees/3.js X bytes [built] [code generated]" +`; + +exports[`StatsTestCases should print correct stats for ignore-warnings 1`] = ` +"asset main.js X bytes [emitted] (name: main) +orphan modules X bytes [orphan] 9 modules +./index.js + 9 modules X bytes [built] [code generated] + +WARNING in ./module.js?4 3:12-20 +Should not import the named export 'homepage' (imported as 'homepage') from default-exporting module (only default export is available soon) + @ ./index.js 4:0-20 + +WARNING in ./module2.js?1 3:12-16 +Should not import the named export 'name' (imported as 'name') from default-exporting module (only default export is available soon) + @ ./index.js 6:0-21 + +webpack x.x.x compiled with 2 warnings in X ms" +`; + +exports[`StatsTestCases should print correct stats for immutable 1`] = ` +"asset XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] (name: main) +asset XXXXXXXXXXXXXXXXXXXX.js X bytes [emitted] [immutable]" +`; + +exports[`StatsTestCases should print correct stats for import-context-filter 1`] = ` +"asset entry.js X KiB [emitted] (name: entry) +asset 717.js X bytes [emitted] +asset 776.js X bytes [emitted] +asset 0.js X bytes [emitted] +runtime modules X KiB 9 modules +built modules X bytes [built] + modules by path ./templates/*.js X bytes + ./templates/bar.js X bytes [optional] [built] [code generated] + ./templates/baz.js X bytes [optional] [built] [code generated] + ./templates/foo.js X bytes [optional] [built] [code generated] + ./entry.js X bytes [built] [code generated] + ./templates/ lazy ^\\\\.\\\\/.*$ include: \\\\.js$ exclude: \\\\.noimport\\\\.js$ na...(truncated) X bytes [optional] [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for import-weak 1`] = ` +"asset entry.js X KiB [emitted] (name: entry) +asset 237.js X bytes [emitted] +runtime modules X KiB 10 modules +orphan modules X bytes [orphan] 1 module +cacheable modules X bytes + ./entry.js X bytes [built] [code generated] + ./modules/b.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for import-weak-parser-option 1`] = ` +"asset entry.js X KiB [emitted] (name: entry) +asset 237.js X bytes [emitted] +runtime modules X KiB 10 modules +orphan modules X bytes [orphan] 1 module +cacheable modules X bytes + ./entry.js X bytes [built] [code generated] + ./modules/b.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for import-with-invalid-options-comments 1`] = ` +"runtime modules X KiB 12 modules +cacheable modules X bytes + ./index.js X bytes [built] [code generated] + ./chunk.js X bytes [built] [code generated] [3 warnings] + ./chunk-a.js X bytes [built] [code generated] + ./chunk-b.js X bytes [built] [code generated] + ./chunk-c.js X bytes [built] [code generated] + ./chunk-d.js X bytes [built] [code generated] + +WARNING in ./chunk.js 2:11-84 +Compilation error while processing magic comment(-s): /* webpackPrefetch: true, webpackChunkName: notGoingToCompileChunkName */: notGoingToCompileChunkName is not defined + @ ./index.js 1:0-49 + +WARNING in ./chunk.js 4:11-77 +Compilation error while processing magic comment(-s): /* webpack Prefetch: 0, webpackChunkName: \\"notGoingToCompile-c\\" */: Unexpected identifier + @ ./index.js 1:0-49 + +WARNING in ./chunk.js 5:11-38 +Compilation error while processing magic comment(-s): /* webpackPrefetch: nope */: nope is not defined + @ ./index.js 1:0-49 + +webpack x.x.x compiled with 3 warnings" +`; + +exports[`StatsTestCases should print correct stats for issue-7577 1`] = ` +"asset a-runtime~main-XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] (name: runtime~main) +asset a-main-XXXXXXXXXXXXXXXXXXXX.js X bytes [emitted] [immutable] (name: main) +asset a-all-a_js-XXXXXXXXXXXXXXXXXXXX.js X bytes [emitted] [immutable] (id hint: all) +Entrypoint main X KiB = a-runtime~main-XXXXXXXXXXXXXXXXXXXX.js X KiB a-all-a_js-XXXXXXXXXXXXXXXXXXXX.js X bytes a-main-XXXXXXXXXXXXXXXXXXXX.js X bytes +runtime modules X KiB 3 modules +./a.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms + +asset b-runtime~main-XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] (name: runtime~main) +asset b-all-b_js-XXXXXXXXXXXXXXXXXXXX.js X bytes [emitted] [immutable] (id hint: all) +asset b-main-XXXXXXXXXXXXXXXXXXXX.js X bytes [emitted] [immutable] (name: main) +asset b-vendors-node_modules_vendor_js-XXXXXXXXXXXXXXXXXXXX.js X bytes [emitted] [immutable] (id hint: vendors) +Entrypoint main X KiB = b-runtime~main-XXXXXXXXXXXXXXXXXXXX.js X KiB b-vendors-node_modules_vendor_js-XXXXXXXXXXXXXXXXXXXX.js X bytes b-all-b_js-XXXXXXXXXXXXXXXXXXXX.js X bytes b-main-XXXXXXXXXXXXXXXXXXXX.js X bytes +runtime modules X KiB 5 modules +cacheable modules X bytes + ./b.js X bytes [built] [code generated] + ./node_modules/vendor.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms + +assets by chunk X bytes (id hint: all) + asset c-all-b_js-XXXXXXXXXXXXXXXXXXXX.js X bytes [emitted] [immutable] (id hint: all) + asset c-all-c_js-XXXXXXXXXXXXXXXXXXXX.js X bytes [emitted] [immutable] (id hint: all) +asset c-runtime~main-XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] (name: runtime~main) +asset c-main-XXXXXXXXXXXXXXXXXXXX.js X bytes [emitted] [immutable] (name: main) +asset c-vendors-node_modules_vendor_js-XXXXXXXXXXXXXXXXXXXX.js X bytes [emitted] [immutable] (id hint: vendors) +Entrypoint main X KiB = c-runtime~main-XXXXXXXXXXXXXXXXXXXX.js X KiB c-all-c_js-XXXXXXXXXXXXXXXXXXXX.js X bytes c-main-XXXXXXXXXXXXXXXXXXXX.js X bytes +runtime modules X KiB 13 modules +cacheable modules X bytes + ./c.js X bytes [built] [code generated] + ./b.js X bytes [built] [code generated] + ./node_modules/vendor.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for limit-chunk-count-plugin 1`] = ` +"1 chunks: + asset bundle1.js X KiB [emitted] (name: main) + chunk (runtime: main) bundle1.js (main) X bytes (javascript) X KiB (runtime) <{792}> >{792}< [entry] [rendered] + runtime modules X KiB 4 modules + cacheable modules X bytes + ./a.js X bytes [dependent] [built] [code generated] + ./b.js X bytes [dependent] [built] [code generated] + ./c.js X bytes [dependent] [built] [code generated] + ./d.js X bytes [dependent] [built] [code generated] + ./e.js X bytes [dependent] [built] [code generated] + ./index.js X bytes [built] [code generated] + 1 chunks (webpack x.x.x) compiled successfully in X ms + +2 chunks: + asset bundle2.js X KiB [emitted] (name: main) + asset 390.bundle2.js X bytes [emitted] (name: c) + chunk (runtime: main) 390.bundle2.js (c) X bytes <{390}> <{792}> >{390}< [rendered] + dependent modules X bytes [dependent] + ./d.js X bytes [dependent] [built] [code generated] + ./e.js X bytes [dependent] [built] [code generated] + ./a.js X bytes [built] [code generated] + ./b.js X bytes [built] [code generated] + ./c.js X bytes [built] [code generated] + chunk (runtime: main) bundle2.js (main) X bytes (javascript) X KiB (runtime) >{390}< [entry] [rendered] + runtime modules X KiB 10 modules + ./index.js X bytes [built] [code generated] + 2 chunks (webpack x.x.x) compiled successfully in X ms + +3 chunks: + asset bundle3.js X KiB [emitted] (name: main) + asset 390.bundle3.js X bytes [emitted] (name: c) + asset 226.bundle3.js X bytes [emitted] + chunk (runtime: main) 226.bundle3.js X bytes <{390}> [rendered] + ./d.js X bytes [built] [code generated] + ./e.js X bytes [built] [code generated] + chunk (runtime: main) 390.bundle3.js (c) X bytes <{792}> >{226}< [rendered] + ./a.js X bytes [built] [code generated] + ./b.js X bytes [built] [code generated] + ./c.js X bytes [built] [code generated] + chunk (runtime: main) bundle3.js (main) X bytes (javascript) X KiB (runtime) >{390}< [entry] [rendered] + runtime modules X KiB 10 modules + ./index.js X bytes [built] [code generated] + 3 chunks (webpack x.x.x) compiled successfully in X ms + +4 chunks: + asset bundle4.js X KiB [emitted] (name: main) + asset 390.bundle4.js X bytes [emitted] (name: c) + asset 226.bundle4.js X bytes [emitted] + asset 78.bundle4.js X bytes [emitted] + chunk (runtime: main) 78.bundle4.js X bytes <{792}> [rendered] + ./a.js X bytes [built] [code generated] + ./b.js X bytes [built] [code generated] + chunk (runtime: main) 226.bundle4.js X bytes <{390}> [rendered] + ./d.js X bytes [built] [code generated] + ./e.js X bytes [built] [code generated] + chunk (runtime: main) 390.bundle4.js (c) X bytes <{792}> >{226}< [rendered] + ./c.js X bytes [built] [code generated] + chunk (runtime: main) bundle4.js (main) X bytes (javascript) X KiB (runtime) >{78}< >{390}< [entry] [rendered] + runtime modules X KiB 10 modules + ./index.js X bytes [built] [code generated] + 4 chunks (webpack x.x.x) compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for logging 1`] = ` +" [LogTestPlugin] Info +asset main.js X bytes [emitted] (name: main) +./index.js X bytes [built] [code generated] + +LOG from LogTestPlugin +<-> Group + Info + Log + <+> Collapsed group + Log + End ++ 6 hidden lines + +DEBUG LOG from ./node_modules/custom-loader/index.js ./node_modules/custom-loader/index.js!./index.js + An error +| at Object..module.exports (Xdir/logging/node_modules/custom-loader/index.js:5:9) + A warning +| at Object..module.exports (Xdir/logging/node_modules/custom-loader/index.js:6:9) +<-> Unimportant + Info message + Just log + Just debug + Measure: X ms + <-> Nested + Log inside collapsed group + Trace + | at Object..module.exports (Xdir/logging/node_modules/custom-loader/index.js:15:9) + Measure: X ms + ------- + After clear + +DEBUG LOG from ./node_modules/custom-loader/index.js Named Logger ./node_modules/custom-loader/index.js!./index.js + Message with named logger + +LOG from webpack.Compilation + 1 modules hashed, 0 from cache (1 variants per module in average) + 100% code generated (1 generated, 0 from cache) ++ 24 hidden lines + +LOG from webpack.FlagDependencyExportsPlugin + 0% of exports of modules have been determined (1 no declared exports, 0 not cached, 0 flagged uncacheable, 0 from cache, 0 from mem cache, 0 additional calculations due to dependencies) ++ 3 hidden lines + +LOG from webpack.buildChunkGraph + 2 queue items processed (1 blocks) + 0 chunk groups connected + 0 chunk groups processed for merging (0 module sets, 0 forked, 0 + 0 modules forked, 0 + 0 modules merged into fork, 0 resulting modules) + 0 chunk group info updated (0 already connected chunk groups reconnected) ++ 5 hidden lines + +LOG from webpack.FileSystemInfo + 1 new snapshots created + 0% root snapshot uncached (0 / 0) + 0% children snapshot uncached (0 / 0) + 0 entries tested + File info in cache: 1 timestamps 1 hashes 1 timestamp hash combinations + File timestamp hash combination snapshot optimization: 0% (0/1) entries shared via 0 shared snapshots (0 times referenced) + Directory info in cache: 0 timestamps 0 hashes 0 timestamp hash combinations + Managed items info in cache: 0 items + +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for logging-debug 1`] = ` +" [LogTestPlugin] Info +asset main.js X bytes [emitted] (name: main) +./index.js X bytes [built] [code generated] + +DEBUG LOG from ../logging/node_modules/custom-loader/index.js ../logging/node_modules/custom-loader/index.js!./index.js + An error + A warning +<-> Unimportant + Info message + Just log + Just debug + Measure: X ms + <-> Nested + Log inside collapsed group + Trace + Measure: X ms + ------- + After clear + +DEBUG LOG from ../logging/node_modules/custom-loader/index.js Named Logger ../logging/node_modules/custom-loader/index.js!./index.js + Message with named logger + +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for max-external-module-readable-identifier 1`] = ` +"asset main.js X KiB [emitted] (name: main) +./index.js X bytes [built] [code generated] +external \\"very-very-very-very-long-external-module-readable-identifier-it-should...(truncated) X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for max-modules 1`] = ` +"asset main.js X KiB [emitted] (name: main) +./index.js X bytes [built] [code generated] +./a.js?1 X bytes [built] [code generated] +./a.js?2 X bytes [built] [code generated] +./a.js?3 X bytes [built] [code generated] +./a.js?4 X bytes [built] [code generated] +./a.js?5 X bytes [built] [code generated] +./a.js?6 X bytes [built] [code generated] +./a.js?7 X bytes [built] [code generated] +./a.js?8 X bytes [built] [code generated] +./a.js?9 X bytes [built] [code generated] +./a.js?10 X bytes [built] [code generated] +./c.js?1 X bytes [built] [code generated] +./c.js?2 X bytes [built] [code generated] +./c.js?3 X bytes [built] [code generated] +./c.js?4 X bytes [built] [code generated] +./c.js?5 X bytes [built] [code generated] +./c.js?6 X bytes [built] [code generated] +./c.js?7 X bytes [built] [code generated] +./c.js?8 X bytes [built] [code generated] ++ 12 modules +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for max-modules-default 1`] = ` +"asset main.js X KiB [emitted] (name: main) +./index.js X bytes [built] [code generated] +./a.js?1 X bytes [built] [code generated] +./a.js?2 X bytes [built] [code generated] +./a.js?3 X bytes [built] [code generated] +./a.js?4 X bytes [built] [code generated] +./a.js?5 X bytes [built] [code generated] +./a.js?6 X bytes [built] [code generated] +./a.js?7 X bytes [built] [code generated] +./a.js?8 X bytes [built] [code generated] +./a.js?9 X bytes [built] [code generated] +./a.js?10 X bytes [built] [code generated] +./c.js?1 X bytes [built] [code generated] +./c.js?2 X bytes [built] [code generated] +./c.js?3 X bytes [built] [code generated] ++ 17 modules +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for module-assets 1`] = ` +"assets by path *.js X KiB + asset main.js X KiB [emitted] (name: main) + asset a.js X bytes [emitted] (name: a) + asset b.js X bytes [emitted] (name: b) +assets by path *.png X KiB + asset 1.png X KiB [emitted] [from: node_modules/a/1.png] (auxiliary name: a) + asset 2.png X KiB [emitted] [from: node_modules/a/2.png] (auxiliary name: a, b) +Entrypoint main X KiB = main.js +Chunk Group a X bytes (X KiB) = a.js X bytes (1.png X KiB 2.png X KiB) +Chunk Group b X bytes (X KiB) = b.js X bytes (2.png X KiB) +chunk (runtime: main) b.js (b) X bytes [rendered] + ./node_modules/a/2.png X bytes [dependent] [built] [code generated] [1 asset] + ./node_modules/b/index.js X bytes [built] [code generated] +chunk (runtime: main) main.js (main) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 8 modules + ./index.js X bytes [built] [code generated] +chunk (runtime: main) a.js (a) X bytes [rendered] + ./node_modules/a/2.png X bytes [dependent] [built] [code generated] [1 asset] + ./node_modules/a/index.js + 1 modules X bytes [built] [code generated] [1 asset] +runtime modules X KiB 8 modules +orphan modules X bytes [orphan] 1 module +modules with assets X bytes + modules by path ./node_modules/a/ X bytes + ./node_modules/a/index.js + 1 modules X bytes [built] [code generated] [1 asset] + ./node_modules/a/2.png X bytes [built] [code generated] [1 asset] + ./index.js X bytes [built] [code generated] + ./node_modules/b/index.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for module-deduplication 1`] = ` +"asset e2.js X KiB [emitted] (name: e2) +asset e3.js X KiB [emitted] (name: e3) +asset e1.js X KiB [emitted] (name: e1) +asset 471.js X bytes [emitted] +asset 752.js X bytes [emitted] +asset 637.js X bytes [emitted] +asset 371.js X bytes [emitted] +asset 852.js X bytes [emitted] +asset 18.js X bytes [emitted] +chunk (runtime: e1) 18.js X bytes [rendered] + ./async1.js X bytes [built] [code generated] +chunk (runtime: e2) e2.js (e2) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 9 modules + cacheable modules X bytes + ./b.js X bytes [dependent] [built] [code generated] + ./e2.js + 2 modules X bytes [built] [code generated] + ./f.js X bytes [dependent] [built] [code generated] +chunk (runtime: e1) e1.js (e1) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 9 modules + cacheable modules X bytes + ./b.js X bytes [dependent] [built] [code generated] + ./d.js X bytes [dependent] [built] [code generated] + ./e1.js + 2 modules X bytes [built] [code generated] +chunk (runtime: e3) 371.js X bytes [rendered] + ./async3.js X bytes [built] [code generated] +chunk (runtime: e1, e3) 471.js X bytes [rendered] + ./async2.js X bytes [built] [code generated] + ./f.js X bytes [dependent] [built] [code generated] +chunk (runtime: e2, e3) 637.js X bytes [rendered] + ./async1.js X bytes [built] [code generated] + ./d.js X bytes [dependent] [built] [code generated] +chunk (runtime: e1, e2) 752.js X bytes [rendered] + ./async3.js X bytes [built] [code generated] + ./h.js X bytes [dependent] [built] [code generated] +chunk (runtime: e2) 852.js X bytes [rendered] + ./async2.js X bytes [built] [code generated] +chunk (runtime: e3) e3.js (e3) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 9 modules + cacheable modules X bytes + ./b.js X bytes [dependent] [built] [code generated] + ./e3.js + 2 modules X bytes [built] [code generated] + ./h.js X bytes [dependent] [built] [code generated] +webpack x.x.x compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for module-deduplication-named 1`] = ` +"asset e2.js X KiB [emitted] (name: e2) +asset e1.js X KiB [emitted] (name: e1) +asset e3.js X KiB [emitted] (name: e3) +asset async1.js X bytes [emitted] (name: async1) +asset async2.js X bytes [emitted] (name: async2) +asset async3.js X bytes [emitted] (name: async3) +chunk (runtime: e1, e2, e3) async3.js (async3) X bytes [rendered] + ./async3.js X bytes [built] [code generated] + ./h.js X bytes [dependent] [built] [code generated] +chunk (runtime: e2) e2.js (e2) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 9 modules + cacheable modules X bytes + ./b.js X bytes [dependent] [built] [code generated] + ./e2.js + 2 modules X bytes [built] [code generated] + ./f.js X bytes [dependent] [built] [code generated] +chunk (runtime: e1, e2, e3) async1.js (async1) X bytes [rendered] + ./async1.js X bytes [built] [code generated] + ./d.js X bytes [dependent] [built] [code generated] +chunk (runtime: e1) e1.js (e1) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 9 modules + cacheable modules X bytes + ./b.js X bytes [dependent] [built] [code generated] + ./d.js X bytes [dependent] [built] [code generated] + ./e1.js + 2 modules X bytes [built] [code generated] +chunk (runtime: e1, e2, e3) async2.js (async2) X bytes [rendered] + ./async2.js X bytes [built] [code generated] + ./f.js X bytes [dependent] [built] [code generated] +chunk (runtime: e3) e3.js (e3) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 9 modules + cacheable modules X bytes + ./b.js X bytes [dependent] [built] [code generated] + ./e3.js + 2 modules X bytes [built] [code generated] + ./h.js X bytes [dependent] [built] [code generated] +webpack x.x.x compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for module-federation-custom-exposed-module-name 1`] = ` +"asset container_bundle.js X KiB [emitted] (name: container) +asset custom-entry_bundle.js X bytes [emitted] (name: custom-entry) +asset main_bundle.js X bytes [emitted] (name: main) +runtime modules X KiB 9 modules +built modules X bytes [built] + ./index.js X bytes [built] [code generated] + container entry X bytes [built] [code generated] + ./entry.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for module-not-found-error 1`] = ` +"ERROR in ./index.js 2:0-13 +Module not found: Error: Can't resolve 'os' in 'Xdir/module-not-found-error' + +BREAKING CHANGE: webpack < 5 used to include polyfills for node.js core modules by default. +This is no longer the case. Verify if you need this module and configure a polyfill for it. + +If you want to include a polyfill, you need to: + - add a fallback 'resolve.fallback: { \\"os\\": require.resolve(\\"os-browserify/browser\\") }' + - install 'os-browserify' +If you don't want to include a polyfill, you can use an empty module like this: + resolve.fallback: { \\"os\\": false } + +webpack compiled with 1 error" +`; + +exports[`StatsTestCases should print correct stats for module-reasons 1`] = ` +"asset main.js X KiB [emitted] (name: main) +orphan modules X bytes [orphan] 2 modules +cacheable modules X bytes + ./index.js + 2 modules X bytes [built] [code generated] + entry ./index main + ./c.js X bytes [built] [code generated] + cjs require ./c ./index.js + 2 modules ./a.js 1:0-14 + cjs require ./c ./index.js + 2 modules ./b.js 1:0-14 +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for module-trace-disabled-in-error 1`] = ` +"assets by status X KiB [cached] 1 asset +./index.js X bytes [built] [code generated] +./inner.js X bytes [built] [code generated] +./not-existing.js X bytes [built] [code generated] +./parse-error.js X bytes [built] [code generated] [1 error] + +ERROR in ./not-existing.js 1:0-25 +Module not found: Error: Can't resolve 'does-not-exist' in 'Xdir/module-trace-disabled-in-error' + +ERROR in ./parse-error.js 3:4 +Module parse failed: Unexpected token (3:4) +You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders +| Here +| could +> be :) +| your +| code + +webpack x.x.x compiled with 2 errors in X ms" +`; + +exports[`StatsTestCases should print correct stats for module-trace-enabled-in-error 1`] = ` +"assets by status X KiB [cached] 1 asset +./index.js X bytes [built] [code generated] +./inner.js X bytes [built] [code generated] +./not-existing.js X bytes [built] [code generated] +./parse-error.js X bytes [built] [code generated] [1 error] + +ERROR in ./not-existing.js 1:0-25 +Module not found: Error: Can't resolve 'does-not-exist' in 'Xdir/module-trace-enabled-in-error' + @ ./inner.js 1:0-25 + @ ./index.js 1:0-18 + +ERROR in ./parse-error.js 3:4 +Module parse failed: Unexpected token (3:4) +You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders +| Here +| could +> be :) +| your +| code + @ ./inner.js 2:0-24 + @ ./index.js 1:0-18 + +webpack x.x.x compiled with 2 errors in X ms" +`; + +exports[`StatsTestCases should print correct stats for name 1`] = ` +"./app.js: + asset bundle1.js X bytes [emitted] (name: main) + ./app.js X bytes [built] [code generated] + Xdir/name/app.js (webpack x.x.x) compiled successfully in X ms + +./server.js: + asset bundle2.js X bytes [emitted] (name: main) + ./server.js X bytes [built] [code generated] + Xdir/name/server.js (webpack x.x.x) compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for named-chunk-groups 1`] = ` +"Chunk Group main X KiB = a-main.js +Chunk Group async-a X KiB = a-48.js X bytes a-async-a.js X bytes +Chunk Group async-b X KiB = a-48.js X bytes a-async-b.js X bytes +Chunk Group async-c X KiB = a-vendors.js X bytes a-async-c.js X bytes +chunk (runtime: main) a-48.js X bytes [rendered] split chunk (cache group: default) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + ./shared.js X bytes [built] [code generated] +chunk (runtime: main) a-async-b.js (async-b) X bytes [rendered] + > ./b ./index.js 2:0-47 + ./b.js X bytes [built] [code generated] +chunk (runtime: main) a-vendors.js (vendors) (id hint: vendors) X bytes [rendered] split chunk (cache group: vendors) (name: vendors) + > ./c ./index.js 3:0-47 + ./node_modules/x.js X bytes [built] [code generated] + ./node_modules/y.js X bytes [built] [code generated] +chunk (runtime: main) a-async-a.js (async-a) X bytes [rendered] + > ./a ./index.js 1:0-47 + ./a.js X bytes [built] [code generated] +chunk (runtime: main) a-main.js (main) X bytes (javascript) X KiB (runtime) [entry] [rendered] + > ./ main + runtime modules X KiB 10 modules + ./index.js X bytes [built] [code generated] +chunk (runtime: main) a-async-c.js (async-c) X bytes [rendered] + > ./c ./index.js 3:0-47 + ./c.js X bytes [built] [code generated] +webpack x.x.x compiled successfully + +Entrypoint main X KiB = b-main.js +Chunk Group async-a X KiB = b-48.js X bytes b-async-a.js X bytes +Chunk Group async-b X KiB = b-48.js X bytes b-async-b.js X bytes +Chunk Group async-c X KiB = b-vendors.js X bytes b-async-c.js X bytes +chunk (runtime: main) b-48.js X bytes [rendered] split chunk (cache group: default) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + ./shared.js X bytes [built] [code generated] +chunk (runtime: main) b-async-b.js (async-b) X bytes [rendered] + > ./b ./index.js 2:0-47 + ./b.js X bytes [built] [code generated] +chunk (runtime: main) b-vendors.js (vendors) (id hint: vendors) X bytes [rendered] split chunk (cache group: vendors) (name: vendors) + > ./c ./index.js 3:0-47 + ./node_modules/x.js X bytes [built] [code generated] + ./node_modules/y.js X bytes [built] [code generated] +chunk (runtime: main) b-async-a.js (async-a) X bytes [rendered] + > ./a ./index.js 1:0-47 + ./a.js X bytes [built] [code generated] +chunk (runtime: main) b-main.js (main) X bytes (javascript) X KiB (runtime) [entry] [rendered] + > ./ main + runtime modules X KiB 10 modules + ./index.js X bytes [built] [code generated] +chunk (runtime: main) b-async-c.js (async-c) X bytes [rendered] + > ./c ./index.js 3:0-47 + ./c.js X bytes [built] [code generated] +webpack x.x.x compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for named-chunks-plugin 1`] = ` +"asset entry.js X KiB [emitted] (name: entry) +asset vendor.js X bytes [emitted] (name: vendor) (id hint: vendor) +Entrypoint entry X KiB = vendor.js X bytes entry.js X KiB +runtime modules X KiB 3 modules +cacheable modules X bytes + ./entry.js X bytes [built] [code generated] + ./modules/a.js X bytes [built] [code generated] + ./modules/b.js X bytes [built] [code generated] + ./modules/c.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for named-chunks-plugin-async 1`] = ` +"asset entry.js X KiB [emitted] (name: entry) +asset modules_a_js.js X bytes [emitted] +asset modules_b_js.js X bytes [emitted] +runtime modules X KiB 10 modules +cacheable modules X bytes + ./entry.js X bytes [built] [code generated] + ./modules/a.js X bytes [built] [code generated] + ./modules/b.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for no-emit-on-errors-plugin-with-child-error 1`] = ` +"assets by status X bytes [cached] 2 assets +./index.js X bytes [built] [code generated] + +WARNING in configuration +The 'mode' option has not been set, webpack will fallback to 'production' for this value. +Set 'mode' option to 'development' or 'production' to enable defaults for each environment. +You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/configuration/mode/ + +1 ERROR in child compilations (Use 'stats.children: true' resp. '--stats-children' for more details) +webpack x.x.x compiled with 1 error and 1 warning in X ms" +`; + +exports[`StatsTestCases should print correct stats for optimize-chunks 1`] = ` +"asset main.js X KiB {792} [emitted] (name: main) +asset cir2 from cir1.js X bytes {816}, {915} [emitted] (name: cir2 from cir1) +asset cir1.js X bytes {712} [emitted] (name: cir1) +asset cir2.js X bytes {915} [emitted] (name: cir2) +asset abd.js X bytes {470}, {518} [emitted] (name: abd) +asset chunk.js X bytes {125}, {982} [emitted] (name: chunk) +asset ab.js X bytes {470} [emitted] (name: ab) +asset ac in ab.js X bytes {125} [emitted] (name: ac in ab) +chunk {125} (runtime: main) ac in ab.js (ac in ab) X bytes <{470}> >{982}< [rendered] + > [237] ./index.js 2:1-5:15 + ./modules/c.js [494] X bytes {125} {982} [built] [code generated] +chunk {470} (runtime: main) ab.js (ab) X bytes <{792}> >{125}< [rendered] + > [237] ./index.js 1:0-6:8 + ./modules/a.js [36] X bytes {470} {518} [built] [code generated] + ./modules/b.js [618] X bytes {470} {518} [built] [code generated] +chunk {518} (runtime: main) abd.js (abd) X bytes <{792}> >{982}< [rendered] + > [237] ./index.js 8:0-11:9 + ./modules/a.js [36] X bytes {470} {518} [built] [code generated] + ./modules/b.js [618] X bytes {470} {518} [built] [code generated] + ./modules/d.js [503] X bytes {518} {982} [built] [code generated] +chunk {712} (runtime: main) cir1.js (cir1) X bytes <{792}> <{816}> <{915}> >{816}< [rendered] + > [237] ./index.js 13:0-54 + > [448] ./circular2.js 1:0-79 + ./circular1.js [985] X bytes {712} [built] [code generated] +chunk {792} (runtime: main) main.js (main) X bytes (javascript) X KiB (runtime) >{470}< >{518}< >{712}< >{915}< [entry] [rendered] + > ./index main + runtime modules X KiB 7 modules + cacheable modules X bytes + ./index.js [237] X bytes {792} [built] [code generated] + ./modules/f.js [633] X bytes {792} [dependent] [built] [code generated] +chunk {816} (runtime: main) cir2 from cir1.js (cir2 from cir1) X bytes <{712}> >{712}< [rendered] + > [985] ./circular1.js 1:0-79 + ./circular2.js [448] X bytes {816} {915} [built] [code generated] + ./modules/e.js [888] X bytes {816} [built] [code generated] +chunk {915} (runtime: main) cir2.js (cir2) X bytes <{792}> >{712}< [rendered] + > [237] ./index.js 14:0-54 + ./circular2.js [448] X bytes {816} {915} [built] [code generated] +chunk {982} (runtime: main) chunk.js (chunk) X bytes <{125}> <{518}> [rendered] + > [237] ./index.js 3:2-4:13 + > [237] ./index.js 9:1-10:12 + ./modules/c.js [494] X bytes {125} {982} [built] [code generated] + ./modules/d.js [503] X bytes {518} {982} [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for output-module 1`] = ` +"asset main.mjs X KiB [emitted] [javascript module] (name: main) +asset 936.mjs X bytes [emitted] [javascript module] +runtime modules X KiB 5 modules +orphan modules X bytes [orphan] 1 module +cacheable modules X bytes + ./index.js + 1 modules X bytes [built] [code generated] + ./chunk.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for parse-error 1`] = ` +"assets by status X KiB [cached] 1 asset +orphan modules X bytes [orphan] 1 module +./index.js + 1 modules X bytes [built] [code generated] +./b.js X bytes [built] [code generated] [1 error] + +ERROR in ./b.js 6:7 +Module parse failed: Unexpected token (6:7) +You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders +| includes +| a +> parser ) +| error +| in + @ ./a.js 2:0-13 + @ ./index.js 2:0-13 + +webpack x.x.x compiled with 1 error" +`; + +exports[`StatsTestCases should print correct stats for performance-different-mode-and-target 1`] = ` +"asset warning.pro-web.js X KiB [emitted] [big] (name: main) +./index.js X KiB [built] [code generated] + +WARNING in asset size limit: The following asset(s) exceed the recommended size limit (X KiB). +This can impact web performance. +Assets: + warning.pro-web.js (X KiB) + +WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (X KiB). This can impact web performance. +Entrypoints: + main (X KiB) + warning.pro-web.js + +WARNING in webpack performance recommendations: +You can limit the size of your bundles by using import() or require.ensure to lazy load some parts of your application. +For more info visit https://webpack.js.org/guides/code-splitting/ + +webpack x.x.x compiled with 3 warnings in X ms + +asset warning.pro-webworker.js X KiB [emitted] [big] (name: main) +./index.js X KiB [built] [code generated] + +WARNING in asset size limit: The following asset(s) exceed the recommended size limit (X KiB). +This can impact web performance. +Assets: + warning.pro-webworker.js (X KiB) + +WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (X KiB). This can impact web performance. +Entrypoints: + main (X KiB) + warning.pro-webworker.js + +WARNING in webpack performance recommendations: +You can limit the size of your bundles by using import() or require.ensure to lazy load some parts of your application. +For more info visit https://webpack.js.org/guides/code-splitting/ + +webpack x.x.x compiled with 3 warnings in X ms + +asset no-warning.pro-node.js X KiB [emitted] (name: main) +./index.js X KiB [built] [code generated] +webpack x.x.x compiled successfully in X ms + +asset no-warning.dev-web.js X MiB [emitted] (name: main) +./index.js X KiB [built] [code generated] +webpack x.x.x compiled successfully in X ms + +asset no-warning.dev-node.js X MiB [emitted] (name: main) +./index.js X KiB [built] [code generated] +webpack x.x.x compiled successfully in X ms + +asset no-warning.dev-web-with-limit-set.js X MiB [emitted] [big] (name: main) +./index.js X KiB [built] [code generated] +webpack x.x.x compiled successfully in X ms + +asset warning.pro-node-with-hints-set.js X KiB [emitted] [big] (name: main) +./index.js X KiB [built] [code generated] + +WARNING in asset size limit: The following asset(s) exceed the recommended size limit (X KiB). +This can impact web performance. +Assets: + warning.pro-node-with-hints-set.js (X KiB) + +WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (X KiB). This can impact web performance. +Entrypoints: + main (X KiB) + warning.pro-node-with-hints-set.js + +WARNING in webpack performance recommendations: +You can limit the size of your bundles by using import() or require.ensure to lazy load some parts of your application. +For more info visit https://webpack.js.org/guides/code-splitting/ + +webpack x.x.x compiled with 3 warnings in X ms" +`; + +exports[`StatsTestCases should print correct stats for performance-disabled 1`] = ` +"asset main.js X KiB [emitted] (name: main) +asset 964.js X bytes [emitted] +asset 226.js X bytes [emitted] +asset 899.js X bytes [emitted] +Entrypoint main X KiB = main.js +runtime modules X KiB 7 modules +cacheable modules X KiB + ./index.js X bytes [built] [code generated] + ./a.js X KiB [built] [code generated] + ./b.js X bytes [built] [code generated] + ./c.js X bytes [built] [code generated] + ./d.js X bytes [built] [code generated] + ./e.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for performance-error 1`] = ` +"asset main.js X KiB [emitted] [big] (name: main) +asset 964.js X bytes [emitted] +asset 226.js X bytes [emitted] +asset 899.js X bytes [emitted] +Entrypoint main [big] X KiB = main.js +runtime modules X KiB 7 modules +cacheable modules X KiB + ./index.js X bytes [built] [code generated] + ./a.js X KiB [built] [code generated] + ./b.js X bytes [built] [code generated] + ./c.js X bytes [built] [code generated] + ./d.js X bytes [built] [code generated] + ./e.js X bytes [built] [code generated] + +ERROR in asset size limit: The following asset(s) exceed the recommended size limit (X KiB). +This can impact web performance. +Assets: + main.js (X KiB) + +ERROR in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (X KiB). This can impact web performance. +Entrypoints: + main (X KiB) + main.js + + +webpack x.x.x compiled with 2 errors in X ms" +`; + +exports[`StatsTestCases should print correct stats for performance-no-async-chunks-shown 1`] = ` +"asset main.js X KiB [emitted] [big] (name: main) +asset sec.js X KiB [emitted] (name: sec) +Entrypoint main [big] X KiB = main.js +Entrypoint sec X KiB = sec.js +./index.js X bytes [built] [code generated] +./index2.js X bytes [built] [code generated] +./a.js X KiB [built] [code generated] +./b.js X bytes [built] [code generated] +./c.js X bytes [built] [code generated] +./d.js X bytes [built] [code generated] + +WARNING in asset size limit: The following asset(s) exceed the recommended size limit (X KiB). +This can impact web performance. +Assets: + main.js (X KiB) + +WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (X KiB). This can impact web performance. +Entrypoints: + main (X KiB) + main.js + + +WARNING in webpack performance recommendations: +You can limit the size of your bundles by using import() or require.ensure to lazy load some parts of your application. +For more info visit https://webpack.js.org/guides/code-splitting/ + +webpack x.x.x compiled with 3 warnings in X ms" +`; + +exports[`StatsTestCases should print correct stats for performance-no-hints 1`] = ` +"asset main.js X KiB [emitted] [big] (name: main) +asset 964.js X bytes [emitted] +asset 226.js X bytes [emitted] +asset 899.js X bytes [emitted] +Entrypoint main [big] X KiB = main.js +runtime modules X KiB 7 modules +cacheable modules X KiB + ./index.js X bytes [built] [code generated] + ./a.js X KiB [built] [code generated] + ./b.js X bytes [built] [code generated] + ./c.js X bytes [built] [code generated] + ./d.js X bytes [built] [code generated] + ./e.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for performance-oversize-limit-error 1`] = ` +"asset main.js X KiB [emitted] [big] (name: main) +asset sec.js X KiB [emitted] [big] (name: sec) +Entrypoint main [big] X KiB = main.js +Entrypoint sec [big] X KiB = sec.js +./index.js X bytes [built] [code generated] +./index2.js X bytes [built] [code generated] +./a.js X KiB [built] [code generated] + +ERROR in asset size limit: The following asset(s) exceed the recommended size limit (X KiB). +This can impact web performance. +Assets: + main.js (X KiB) + sec.js (X KiB) + +ERROR in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (X KiB). This can impact web performance. +Entrypoints: + main (X KiB) + main.js + sec (X KiB) + sec.js + + +ERROR in webpack performance recommendations: +You can limit the size of your bundles by using import() or require.ensure to lazy load some parts of your application. +For more info visit https://webpack.js.org/guides/code-splitting/ + +webpack x.x.x compiled with 3 errors in X ms" +`; + +exports[`StatsTestCases should print correct stats for prefetch 1`] = ` +"asset main.js X KiB {792} [emitted] (name: main) +asset prefetched.js X bytes {529} [emitted] (name: prefetched) +asset inner2.js X bytes {573} [emitted] (name: inner2) +asset inner.js X bytes {253} [emitted] (name: inner) +asset normal.js X bytes {574} [emitted] (name: normal) +asset prefetched2.js X bytes {337} [emitted] (name: prefetched2) +asset prefetched3.js X bytes {528} [emitted] (name: prefetched3) +Entrypoint main X KiB = main.js + prefetch: prefetched2.js {337} (name: prefetched2), prefetched.js {529} (name: prefetched), prefetched3.js {528} (name: prefetched3) +chunk {253} (runtime: main) inner.js (inner) X bytes <{529}> [rendered] +chunk {337} (runtime: main) prefetched2.js (prefetched2) X bytes <{792}> [rendered] +chunk {528} (runtime: main) prefetched3.js (prefetched3) X bytes <{792}> [rendered] +chunk {529} (runtime: main) prefetched.js (prefetched) X bytes <{792}> >{253}< >{573}< (prefetch: {573} {253}) [rendered] +chunk {573} (runtime: main) inner2.js (inner2) X bytes <{529}> [rendered] +chunk {574} (runtime: main) normal.js (normal) X bytes <{792}> [rendered] +chunk {792} (runtime: main) main.js (main) X bytes (javascript) X KiB (runtime) >{337}< >{528}< >{529}< >{574}< (prefetch: {337} {529} {528}) [entry] [rendered]" +`; + +exports[`StatsTestCases should print correct stats for prefetch-preload-mixed 1`] = ` +"chunk (runtime: main) a2.js (a2) X bytes <{996}> [rendered] +chunk (runtime: main) b.js (b) X bytes <{792}> >{364}< >{567}< >{758}< (prefetch: {364} {758}) (preload: {567}) [rendered] +chunk (runtime: main) a1.js (a1) X bytes <{996}> [rendered] +chunk (runtime: main) b1.js (b1) X bytes <{199}> [rendered] +chunk (runtime: main) c.js (c) X bytes <{792}> >{896}< >{907}< (preload: {907} {896}) [rendered] +chunk (runtime: main) b2.js (b2) X bytes <{199}> [rendered] +chunk (runtime: main) b3.js (b3) X bytes <{199}> [rendered] +chunk (runtime: main) main.js (main) X bytes (javascript) X KiB (runtime) >{199}< >{390}< >{996}< (prefetch: {996} {199} {390}) [entry] [rendered] +chunk (runtime: main) c2.js (c2) X bytes <{390}> [rendered] +chunk (runtime: main) c1.js (c1) X bytes <{390}> [rendered] +chunk (runtime: main) a.js (a) X bytes <{792}> >{150}< >{341}< (prefetch: {341} {150}) [rendered]" +`; + +exports[`StatsTestCases should print correct stats for preload 1`] = ` +"asset main.js X KiB [emitted] (name: main) +asset preloaded.js X bytes [emitted] (name: preloaded) +asset inner2.js X bytes [emitted] (name: inner2) +asset inner.js X bytes [emitted] (name: inner) +asset normal.js X bytes [emitted] (name: normal) +asset preloaded3.js X bytes [emitted] (name: preloaded3) +asset preloaded2.js X bytes [emitted] (name: preloaded2) +Entrypoint main X KiB = main.js + preload: preloaded2.js (name: preloaded2), preloaded.js (name: preloaded), preloaded3.js (name: preloaded3) +chunk (runtime: main) preloaded.js (preloaded) X bytes (preload: {573} {253}) [rendered] +chunk (runtime: main) inner.js (inner) X bytes [rendered] +chunk (runtime: main) preloaded2.js (preloaded2) X bytes [rendered] +chunk (runtime: main) inner2.js (inner2) X bytes [rendered] +chunk (runtime: main) normal.js (normal) X bytes [rendered] +chunk (runtime: main) preloaded3.js (preloaded3) X bytes [rendered] +chunk (runtime: main) main.js (main) X bytes (javascript) X KiB (runtime) (preload: {485} {165} {676}) [entry] [rendered]" +`; + +exports[`StatsTestCases should print correct stats for preset-detailed 1`] = ` +"<-> [LogTestPlugin] Group + [LogTestPlugin] Error + [LogTestPlugin] Warning + [LogTestPlugin] Info + [LogTestPlugin] Log + <+> [LogTestPlugin] Collapsed group + [LogTestPlugin] Log + [LogTestPlugin] End +PublicPath: auto +asset main.js X KiB {792} [emitted] (name: main) +asset 964.js X bytes {964} [emitted] +asset 226.js X bytes {226} [emitted] +asset 899.js X bytes {899} [emitted] +Entrypoint main X KiB = main.js +chunk {226} (runtime: main) 226.js X bytes <{964}> [rendered] + > [964] ./c.js 1:0-52 +chunk {792} (runtime: main) main.js (main) X bytes (javascript) X KiB (runtime) >{899}< >{964}< [entry] [rendered] + > ./index main +chunk {899} (runtime: main) 899.js X bytes <{792}> [rendered] + > ./b [237] ./index.js 2:0-16 +chunk {964} (runtime: main) 964.js X bytes <{792}> >{226}< [rendered] + > ./c [237] ./index.js 3:0-16 +runtime modules X KiB + webpack/runtime/ensure chunk X bytes {792} [code generated] + [no exports] + [used exports unknown] + webpack/runtime/get javascript chunk filename X bytes {792} [code generated] + [no exports] + [used exports unknown] + webpack/runtime/global X bytes {792} [code generated] + [no exports] + [used exports unknown] + webpack/runtime/hasOwnProperty shorthand X bytes {792} [code generated] + [no exports] + [used exports unknown] + webpack/runtime/jsonp chunk loading X KiB {792} [code generated] + [no exports] + [used exports unknown] + webpack/runtime/load script X KiB {792} [code generated] + [no exports] + [used exports unknown] + webpack/runtime/publicPath X KiB {792} [code generated] + [no exports] + [used exports unknown] +cacheable modules X bytes + ./index.js [237] X bytes {792} [depth 0] [built] [code generated] + [no exports used] + Statement (ExpressionStatement) with side effects in source code at 1:0-15 + ModuleConcatenation bailout: Module is not an ECMAScript module + ./a.js [670] X bytes {792} [depth 1] [built] [code generated] + [used exports unknown] + CommonJS bailout: module.exports is used directly at 1:0-14 + Statement (ExpressionStatement) with side effects in source code at 1:0-21 + ModuleConcatenation bailout: Module is not an ECMAScript module + ./b.js [899] X bytes {899} [depth 1] [built] [code generated] + [used exports unknown] + CommonJS bailout: module.exports is used directly at 1:0-14 + Statement (ExpressionStatement) with side effects in source code at 1:0-21 + ModuleConcatenation bailout: Module is not an ECMAScript module + ./c.js [964] X bytes {964} [depth 1] [built] [code generated] + [used exports unknown] + Statement (ExpressionStatement) with side effects in source code at 1:0-53 + ModuleConcatenation bailout: Module is not an ECMAScript module + ./d.js [425] X bytes {226} [depth 2] [built] [code generated] + [used exports unknown] + CommonJS bailout: module.exports is used directly at 1:0-14 + Statement (ExpressionStatement) with side effects in source code at 1:0-21 + ModuleConcatenation bailout: Module is not an ECMAScript module + ./e.js [210] X bytes {226} [depth 2] [built] [code generated] + [used exports unknown] + CommonJS bailout: module.exports is used directly at 1:0-14 + Statement (ExpressionStatement) with side effects in source code at 1:0-21 + ModuleConcatenation bailout: Module is not an ECMAScript module + +LOG from LogTestPlugin +<-> Group + Error + Warning + Info + Log + <+> Collapsed group + Log + End ++ 6 hidden lines + +LOG from webpack.Compilation + 6 modules hashed, 0 from cache (1 variants per module in average) + 100% code generated (6 generated, 0 from cache) + 100% code generated (7 generated, 0 from cache) ++ 24 hidden lines + +LOG from webpack.FlagDependencyExportsPlugin + 0% of exports of modules have been determined (6 no declared exports, 0 not cached, 0 flagged uncacheable, 0 from cache, 0 from mem cache, 0 additional calculations due to dependencies) ++ 3 hidden lines + +LOG from webpack.buildChunkGraph + 15 queue items processed (9 blocks) + 3 chunk groups connected + 3 chunk groups processed for merging (3 module sets, 0 forked, 0 + 0 modules forked, 0 + 0 modules merged into fork, 0 resulting modules) + 3 chunk group info updated (0 already connected chunk groups reconnected) ++ 15 hidden lines + +LOG from webpack.FileSystemInfo + 6 new snapshots created + 0% root snapshot uncached (0 / 0) + 0% children snapshot uncached (0 / 0) + 0 entries tested + File info in cache: 6 timestamps 6 hashes 6 timestamp hash combinations + File timestamp hash combination snapshot optimization: 0% (0/6) entries shared via 0 shared snapshots (0 times referenced) + Directory info in cache: 0 timestamps 0 hashes 0 timestamp hash combinations + Managed items info in cache: 0 items + +1970-04-20 12:42:42: webpack x.x.x compiled successfully in X ms (XXXXXXXXXXXXXXXXXXXX)" +`; + +exports[`StatsTestCases should print correct stats for preset-errors-only 1`] = `""`; + +exports[`StatsTestCases should print correct stats for preset-errors-only-error 1`] = ` +" [LogTestPlugin] Error +LOG from LogTestPlugin + Error ++ 14 hidden lines + +ERROR in ./index.js 1:0-25 +Module not found: Error: Can't resolve 'does-not-exist' in 'Xdir/preset-errors-only-error' + +webpack compiled with 1 error" +`; + +exports[`StatsTestCases should print correct stats for preset-errors-warnings 1`] = ` +" [LogTestPlugin] Error + [LogTestPlugin] Warning +LOG from LogTestPlugin + Error + Warning ++ 13 hidden lines + +webpack compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for preset-minimal 1`] = ` +" [LogTestPlugin] Error + [LogTestPlugin] Warning +4 assets +13 modules + +LOG from LogTestPlugin + Error + Warning ++ 13 hidden lines + +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for preset-minimal-simple 1`] = ` +"1 asset +1 module +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for preset-mixed-array 1`] = ` +"minimal: + 1 asset + 1 module + minimal (webpack x.x.x) compiled successfully in X ms + +verbose: + Entrypoint main X bytes = verbose.js + ./index.js X bytes [built] [code generated] + verbose (webpack x.x.x) compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for preset-none 1`] = ` +" [LogTestPlugin] Error + [LogTestPlugin] Warning + [LogTestPlugin] Info +" +`; + +exports[`StatsTestCases should print correct stats for preset-none-array 1`] = `""`; + +exports[`StatsTestCases should print correct stats for preset-none-error 1`] = `""`; + +exports[`StatsTestCases should print correct stats for preset-normal 1`] = ` +" [LogTestPlugin] Error + [LogTestPlugin] Warning + [LogTestPlugin] Info +asset main.js X KiB [emitted] (name: main) +asset 964.js X bytes [emitted] +asset 226.js X bytes [emitted] +asset 899.js X bytes [emitted] +runtime modules X KiB 7 modules +cacheable modules X bytes + ./index.js X bytes [built] [code generated] + ./a.js X bytes [built] [code generated] + ./b.js X bytes [built] [code generated] + ./c.js X bytes [built] [code generated] + ./d.js X bytes [built] [code generated] + ./e.js X bytes [built] [code generated] + +LOG from LogTestPlugin + Error + Warning + Info ++ 12 hidden lines + +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for preset-normal-performance 1`] = ` +"asset main.js X KiB [emitted] [big] (name: main) +asset 964.js X bytes [emitted] +asset 226.js X bytes [emitted] +asset 899.js X bytes [emitted] +runtime modules X KiB 7 modules +cacheable modules X KiB + ./index.js X bytes [built] [code generated] + ./a.js X KiB [built] [code generated] + ./b.js X bytes [built] [code generated] + ./c.js X bytes [built] [code generated] + ./d.js X bytes [built] [code generated] + ./e.js X bytes [built] [code generated] + +WARNING in asset size limit: The following asset(s) exceed the recommended size limit (X KiB). +This can impact web performance. +Assets: + main.js (X KiB) + +WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (X KiB). This can impact web performance. +Entrypoints: + main (X KiB) + main.js + + +webpack x.x.x compiled with 2 warnings in X ms" +`; + +exports[`StatsTestCases should print correct stats for preset-normal-performance-ensure-filter-sourcemaps 1`] = ` +"asset main.js X KiB [emitted] [big] (name: main) 1 related asset +asset 964.js X bytes [emitted] 1 related asset +asset 226.js X bytes [emitted] 1 related asset +asset 899.js X bytes [emitted] 1 related asset +runtime modules X KiB 7 modules +cacheable modules X KiB + ./index.js X bytes [built] [code generated] + ./a.js X KiB [built] [code generated] + ./b.js X bytes [built] [code generated] + ./c.js X bytes [built] [code generated] + ./d.js X bytes [built] [code generated] + ./e.js X bytes [built] [code generated] + +WARNING in asset size limit: The following asset(s) exceed the recommended size limit (X KiB). +This can impact web performance. +Assets: + main.js (X KiB) + +WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (X KiB). This can impact web performance. +Entrypoints: + main (X KiB) + main.js + + +webpack x.x.x compiled with 2 warnings in X ms" +`; + +exports[`StatsTestCases should print correct stats for preset-summary 1`] = ` +" [LogTestPlugin] Error + [LogTestPlugin] Warning + [LogTestPlugin] Info +webpack x.x.x compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for preset-verbose 1`] = ` +"<-> [LogTestPlugin] Group + [LogTestPlugin] Error + [LogTestPlugin] Warning + [LogTestPlugin] Info + [LogTestPlugin] Log + <-> [LogTestPlugin] Collapsed group + [LogTestPlugin] Log inside collapsed group + <-> [LogTestPlugin] Inner group + [LogTestPlugin] Inner inner message + [LogTestPlugin] Log + [LogTestPlugin] End +PublicPath: auto +asset main.js X KiB {792} [emitted] (name: main) +asset 964.js X bytes {964} [emitted] +asset 226.js X bytes {226} [emitted] +asset 899.js X bytes {899} [emitted] +Entrypoint main X KiB = main.js +chunk {226} (runtime: main) 226.js X bytes <{964}> [rendered] + > [964] ./c.js 1:0-52 + ./d.js [425] X bytes {226} [depth 2] [built] [code generated] + [used exports unknown] + CommonJS bailout: module.exports is used directly at 1:0-14 + Statement (ExpressionStatement) with side effects in source code at 1:0-21 + ModuleConcatenation bailout: Module is not an ECMAScript module + require.ensure item ./d [964] ./c.js 1:0-52 + cjs self exports reference [425] ./d.js 1:0-14 + X ms [237] -> X ms [964] -> + X ms (resolving: X ms, restoring: X ms, integration: X ms, building: X ms, storing: X ms) + ./e.js [210] X bytes {226} [depth 2] [built] [code generated] + [used exports unknown] + CommonJS bailout: module.exports is used directly at 1:0-14 + Statement (ExpressionStatement) with side effects in source code at 1:0-21 + ModuleConcatenation bailout: Module is not an ECMAScript module + require.ensure item ./e [964] ./c.js 1:0-52 + cjs self exports reference [210] ./e.js 1:0-14 + X ms [237] -> X ms [964] -> + X ms (resolving: X ms, restoring: X ms, integration: X ms, building: X ms, storing: X ms) +chunk {792} (runtime: main) main.js (main) X bytes (javascript) X KiB (runtime) >{899}< >{964}< [entry] [rendered] + > ./index main + runtime modules X KiB + webpack/runtime/ensure chunk X bytes {792} [code generated] + [no exports] + [used exports unknown] + webpack/runtime/get javascript chunk filename X bytes {792} [code generated] + [no exports] + [used exports unknown] + webpack/runtime/global X bytes {792} [code generated] + [no exports] + [used exports unknown] + webpack/runtime/hasOwnProperty shorthand X bytes {792} [code generated] + [no exports] + [used exports unknown] + webpack/runtime/jsonp chunk loading X KiB {792} [code generated] + [no exports] + [used exports unknown] + webpack/runtime/load script X KiB {792} [code generated] + [no exports] + [used exports unknown] + webpack/runtime/publicPath X KiB {792} [code generated] + [no exports] + [used exports unknown] + cacheable modules X bytes + ./a.js [670] X bytes {792} [depth 1] [dependent] [built] [code generated] + [used exports unknown] + CommonJS bailout: module.exports is used directly at 1:0-14 + Statement (ExpressionStatement) with side effects in source code at 1:0-21 + ModuleConcatenation bailout: Module is not an ECMAScript module + cjs self exports reference [670] ./a.js 1:0-14 + cjs require ./a [237] ./index.js 1:0-14 + X ms [237] -> + X ms (resolving: X ms, restoring: X ms, integration: X ms, building: X ms, storing: X ms) + ./index.js [237] X bytes {792} [depth 0] [built] [code generated] + [no exports used] + Statement (ExpressionStatement) with side effects in source code at 1:0-15 + ModuleConcatenation bailout: Module is not an ECMAScript module + entry ./index main + X ms (resolving: X ms, restoring: X ms, integration: X ms, building: X ms, storing: X ms) +chunk {899} (runtime: main) 899.js X bytes <{792}> [rendered] + > ./b [237] ./index.js 2:0-16 + ./b.js [899] X bytes {899} [depth 1] [built] [code generated] + [used exports unknown] + CommonJS bailout: module.exports is used directly at 1:0-14 + Statement (ExpressionStatement) with side effects in source code at 1:0-21 + ModuleConcatenation bailout: Module is not an ECMAScript module + cjs self exports reference [899] ./b.js 1:0-14 + amd require ./b [237] ./index.js 2:0-16 + X ms [237] -> + X ms (resolving: X ms, restoring: X ms, integration: X ms, building: X ms, storing: X ms) +chunk {964} (runtime: main) 964.js X bytes <{792}> >{226}< [rendered] + > ./c [237] ./index.js 3:0-16 + ./c.js [964] X bytes {964} [depth 1] [built] [code generated] + [used exports unknown] + Statement (ExpressionStatement) with side effects in source code at 1:0-53 + ModuleConcatenation bailout: Module is not an ECMAScript module + amd require ./c [237] ./index.js 3:0-16 + X ms [237] -> + X ms (resolving: X ms, restoring: X ms, integration: X ms, building: X ms, storing: X ms) + + +LOG from LogTestPlugin +<-> Group + Error + Warning + Info + Log + <-> Collapsed group + Log inside collapsed group + <-> Inner group + Inner inner message + Log + End ++ 1 hidden lines + +LOG from webpack.Compiler + make hook: X ms + finish make hook: X ms + finish compilation: X ms + seal compilation: X ms + afterCompile hook: X ms + emitAssets: X ms + emitRecords: X ms + done hook: X ms + beginIdle: X ms + +LOG from webpack.Compilation + finish module profiles: X ms + compute affected modules: X ms + finish modules: X ms + report dependency errors and warnings: X ms + optimize dependencies: X ms + create chunks: X ms + compute affected modules with chunk graph: X ms + optimize: X ms + 6 modules hashed, 0 from cache (1 variants per module in average) + module hashing: X ms + 100% code generated (6 generated, 0 from cache) + code generation: X ms + runtime requirements.modules: X ms + runtime requirements.chunks: X ms + runtime requirements.entries: X ms + runtime requirements: X ms + hashing: initialize hash: X ms + hashing: sort chunks: X ms + hashing: hash runtime modules: X ms + hashing: hash chunks: X ms + hashing: hash digest: X ms + hashing: process full hash modules: X ms + hashing: X ms + 100% code generated (7 generated, 0 from cache) + record hash: X ms + module assets: X ms + create chunk assets: X ms + process assets: X ms + +LOG from webpack.FlagDependencyExportsPlugin + restore cached provided exports: X ms + figure out provided exports: X ms + 0% of exports of modules have been determined (6 no declared exports, 0 not cached, 0 flagged uncacheable, 0 from cache, 0 from mem cache, 0 additional calculations due to dependencies) + store provided exports into cache: X ms + +LOG from webpack.InnerGraphPlugin + infer dependency usage: X ms + +LOG from webpack.SideEffectsFlagPlugin + update dependencies: X ms + +LOG from webpack.FlagDependencyUsagePlugin + initialize exports usage: X ms + trace exports usage in graph: X ms + +LOG from webpack.buildChunkGraph + visitModules: prepare: X ms + visitModules: visiting: X ms + visitModules: calculating available modules: X ms + visitModules: merging available modules: X ms + visitModules: check modules for revisit: X ms + visitModules: prepare: X ms + visitModules: visiting: X ms + visitModules: calculating available modules: X ms + visitModules: merging available modules: X ms + visitModules: check modules for revisit: X ms + visitModules: prepare: X ms + visitModules: visiting: X ms + 15 queue items processed (9 blocks) + 3 chunk groups connected + 3 chunk groups processed for merging (3 module sets, 0 forked, 0 + 0 modules forked, 0 + 0 modules merged into fork, 0 resulting modules) + 3 chunk group info updated (0 already connected chunk groups reconnected) + visitModules: X ms + connectChunkGroups: X ms + cleanup: X ms + +LOG from webpack.SplitChunksPlugin + prepare: X ms + modules: X ms + queue: X ms + maxSize: X ms + +LOG from webpack.ModuleConcatenationPlugin + select relevant modules: X ms + sort relevant modules: X ms + find modules to concatenate: X ms + sort concat configurations: X ms + create concatenated modules: X ms ++ 3 hidden lines + +LOG from webpack.FileSystemInfo + 6 new snapshots created + 0% root snapshot uncached (0 / 0) + 0% children snapshot uncached (0 / 0) + 0 entries tested + File info in cache: 6 timestamps 6 hashes 6 timestamp hash combinations + File timestamp hash combination snapshot optimization: 0% (0/6) entries shared via 0 shared snapshots (0 times referenced) + Directory info in cache: 0 timestamps 0 hashes 0 timestamp hash combinations + Managed items info in cache: 0 items + +1970-04-20 12:42:42: webpack x.x.x compiled successfully in X ms (XXXXXXXXXXXXXXXXXXXX)" +`; + +exports[`StatsTestCases should print correct stats for real-content-hash 1`] = ` +"a-normal: + assets by path *.js X KiB + asset XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X KiB [emitted] [immutable] [minimized] (name: runtime) + asset XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X bytes [emitted] [immutable] [minimized] (name: lazy) + asset XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X bytes [emitted] [immutable] [minimized] (name: index) + asset XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X bytes [emitted] [immutable] [minimized] (name: a, b) + assets by chunk X KiB (auxiliary name: lazy) + asset XXXXXXXXXXXXXXXXXXXX.png X KiB [emitted] [immutable] [from: file.png] (auxiliary name: lazy) + asset XXXXXXXXXXXXXXXXXXXX.jpg?query X KiB [cached] [immutable] [from: file.jpg?query] (auxiliary name: lazy) + asset XXXXXXXXXXXXXXXXXXXX.jpg X KiB [emitted] [immutable] [from: file.jpg] (auxiliary name: index) + Entrypoint index X KiB (X KiB) = XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X KiB XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X bytes 1 auxiliary asset + Entrypoint a X bytes = XXXXXXXXXXXXXXXXXXXX-XXXXXX.js + Entrypoint b X bytes = XXXXXXXXXXXXXXXXXXXX-XXXXXX.js + runtime modules X KiB 8 modules + orphan modules X bytes [orphan] 1 module + cacheable modules X bytes (javascript) X KiB (asset) + javascript modules X bytes + ./a/index.js X bytes [built] [code generated] + ./a/a.js X bytes [built] [code generated] + ./a/b.js X bytes [built] [code generated] + ./a/lazy.js + 2 modules X bytes [built] [code generated] + asset modules X KiB (asset) X bytes (javascript) + ./a/file.jpg X KiB (asset) X bytes (javascript) [built] [code generated] + ./a/file.png X KiB (asset) X bytes (javascript) [built] [code generated] + ./a/file.jpg?query X KiB (asset) X bytes (javascript) [built] [code generated] + a-normal (webpack x.x.x) compiled successfully in X ms + +b-normal: + assets by path *.js X KiB + asset XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X KiB [emitted] [immutable] [minimized] (name: runtime) + asset XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X bytes [emitted] [immutable] [minimized] (name: lazy) + asset XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X bytes [emitted] [immutable] [minimized] (name: index) + asset XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X bytes [emitted] [immutable] [minimized] (name: a, b) + assets by chunk X KiB (auxiliary name: lazy) + asset XXXXXXXXXXXXXXXXXXXX.png X KiB [emitted] [immutable] [from: file.png] (auxiliary name: lazy) + asset XXXXXXXXXXXXXXXXXXXX.jpg?query X KiB [cached] [immutable] [from: file.jpg?query] (auxiliary name: lazy) + asset XXXXXXXXXXXXXXXXXXXX.jpg X KiB [emitted] [immutable] [from: file.jpg] (auxiliary name: index) + Entrypoint index X KiB (X KiB) = XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X KiB XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X bytes 1 auxiliary asset + Entrypoint a X bytes = XXXXXXXXXXXXXXXXXXXX-XXXXXX.js + Entrypoint b X bytes = XXXXXXXXXXXXXXXXXXXX-XXXXXX.js + runtime modules X KiB 8 modules + orphan modules X bytes [orphan] 1 module + cacheable modules X bytes (javascript) X KiB (asset) + javascript modules X bytes + ./b/index.js X bytes [built] [code generated] + ./b/a.js X bytes [built] [code generated] + ./b/b.js X bytes [built] [code generated] + ./b/lazy.js + 2 modules X bytes [built] [code generated] + asset modules X KiB (asset) X bytes (javascript) + ./b/file.jpg X KiB (asset) X bytes (javascript) [built] [code generated] + ./b/file.png X KiB (asset) X bytes (javascript) [built] [code generated] + ./b/file.jpg?query X KiB (asset) X bytes (javascript) [built] [code generated] + b-normal (webpack x.x.x) compiled successfully in X ms + +a-source-map: + assets by path *.js X KiB + asset XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X KiB [emitted] [immutable] [minimized] (name: runtime) + sourceMap XXXXXXXXXXXXXXXXXXXX-XXXXXX.js.map X KiB [emitted] [dev] (auxiliary name: runtime) + asset XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X bytes [emitted] [immutable] [minimized] (name: lazy) + sourceMap XXXXXXXXXXXXXXXXXXXX-XXXXXX.js.map X bytes [emitted] [dev] (auxiliary name: lazy) + asset XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X bytes [emitted] [immutable] [minimized] (name: index) + sourceMap XXXXXXXXXXXXXXXXXXXX-XXXXXX.js.map X bytes [emitted] [dev] (auxiliary name: index) + asset XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X bytes [emitted] [immutable] [minimized] (name: a, b) + sourceMap XXXXXXXXXXXXXXXXXXXX-XXXXXX.js.map X bytes [emitted] [dev] (auxiliary name: a, b) + assets by chunk X KiB (auxiliary name: lazy) + asset XXXXXXXXXXXXXXXXXXXX.png X KiB [emitted] [immutable] [from: file.png] (auxiliary name: lazy) + asset XXXXXXXXXXXXXXXXXXXX.jpg?query X KiB [cached] [immutable] [from: file.jpg?query] (auxiliary name: lazy) + asset XXXXXXXXXXXXXXXXXXXX.jpg X KiB [emitted] [immutable] [from: file.jpg] (auxiliary name: index) + Entrypoint index X KiB (X KiB) = XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X KiB XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X bytes 3 auxiliary assets + Entrypoint a X bytes (X bytes) = XXXXXXXXXXXXXXXXXXXX-XXXXXX.js 1 auxiliary asset + Entrypoint b X bytes (X bytes) = XXXXXXXXXXXXXXXXXXXX-XXXXXX.js 1 auxiliary asset + runtime modules X KiB 8 modules + orphan modules X bytes [orphan] 1 module + cacheable modules X bytes (javascript) X KiB (asset) + javascript modules X bytes + ./a/index.js X bytes [built] [code generated] + ./a/a.js X bytes [built] [code generated] + ./a/b.js X bytes [built] [code generated] + ./a/lazy.js + 2 modules X bytes [built] [code generated] + asset modules X KiB (asset) X bytes (javascript) + ./a/file.jpg X KiB (asset) X bytes (javascript) [built] [code generated] + ./a/file.png X KiB (asset) X bytes (javascript) [built] [code generated] + ./a/file.jpg?query X KiB (asset) X bytes (javascript) [built] [code generated] + a-source-map (webpack x.x.x) compiled successfully in X ms + +b-source-map: + assets by path *.js X KiB + asset XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X KiB [emitted] [immutable] [minimized] (name: runtime) + sourceMap XXXXXXXXXXXXXXXXXXXX-XXXXXX.js.map X KiB [emitted] [dev] (auxiliary name: runtime) + asset XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X bytes [emitted] [immutable] [minimized] (name: lazy) + sourceMap XXXXXXXXXXXXXXXXXXXX-XXXXXX.js.map X bytes [emitted] [dev] (auxiliary name: lazy) + asset XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X bytes [emitted] [immutable] [minimized] (name: index) + sourceMap XXXXXXXXXXXXXXXXXXXX-XXXXXX.js.map X bytes [emitted] [dev] (auxiliary name: index) + asset XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X bytes [emitted] [immutable] [minimized] (name: a, b) + sourceMap XXXXXXXXXXXXXXXXXXXX-XXXXXX.js.map X bytes [emitted] [dev] (auxiliary name: a, b) + assets by chunk X KiB (auxiliary name: lazy) + asset XXXXXXXXXXXXXXXXXXXX.png X KiB [emitted] [immutable] [from: file.png] (auxiliary name: lazy) + asset XXXXXXXXXXXXXXXXXXXX.jpg?query X KiB [cached] [immutable] [from: file.jpg?query] (auxiliary name: lazy) + asset XXXXXXXXXXXXXXXXXXXX.jpg X KiB [emitted] [immutable] [from: file.jpg] (auxiliary name: index) + Entrypoint index X KiB (X KiB) = XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X KiB XXXXXXXXXXXXXXXXXXXX-XXXXXX.js X bytes 3 auxiliary assets + Entrypoint a X bytes (X bytes) = XXXXXXXXXXXXXXXXXXXX-XXXXXX.js 1 auxiliary asset + Entrypoint b X bytes (X bytes) = XXXXXXXXXXXXXXXXXXXX-XXXXXX.js 1 auxiliary asset + runtime modules X KiB 8 modules + orphan modules X bytes [orphan] 1 module + cacheable modules X bytes (javascript) X KiB (asset) + javascript modules X bytes + ./b/index.js X bytes [built] [code generated] + ./b/a.js X bytes [built] [code generated] + ./b/b.js X bytes [built] [code generated] + ./b/lazy.js + 2 modules X bytes [built] [code generated] + asset modules X KiB (asset) X bytes (javascript) + ./b/file.jpg X KiB (asset) X bytes (javascript) [built] [code generated] + ./b/file.png X KiB (asset) X bytes (javascript) [built] [code generated] + ./b/file.jpg?query X KiB (asset) X bytes (javascript) [built] [code generated] + b-source-map (webpack x.x.x) compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for related-assets 1`] = ` +"default: + assets by path *.js X KiB + asset default-main.js X KiB [emitted] (name: main) 3 related assets + asset default-chunk_js.js X bytes [emitted] 3 related assets + assets by path *.css X bytes + asset default-chunk_js.css X bytes [emitted] 3 related assets + asset default-main.css X bytes [emitted] (name: main) 3 related assets + asset default-file.jpg X KiB [emitted] [from: file.jpg] (auxiliary name: main) + +relatedAssets: + assets by path *.js X KiB + asset relatedAssets-main.js X KiB [emitted] (name: main) + compressed relatedAssets-main.js.br X KiB [emitted] + compressed relatedAssets-main.js.gz X KiB [emitted] + sourceMap relatedAssets-main.js.map X KiB [emitted] [dev] (auxiliary name: main) + compressed relatedAssets-main.js.map.br X KiB [emitted] + compressed relatedAssets-main.js.map.gz X KiB [emitted] + asset relatedAssets-chunk_js.js X bytes [emitted] + compressed relatedAssets-chunk_js.js.br X bytes [emitted] + compressed relatedAssets-chunk_js.js.gz X bytes [emitted] + sourceMap relatedAssets-chunk_js.js.map X bytes [emitted] [dev] + compressed relatedAssets-chunk_js.js.map.br X bytes [emitted] + compressed relatedAssets-chunk_js.js.map.gz X bytes [emitted] + assets by path *.css X bytes + asset relatedAssets-chunk_js.css X bytes [emitted] + sourceMap relatedAssets-chunk_js.css.map X bytes [emitted] [dev] + compressed relatedAssets-chunk_js.css.map.br X bytes [emitted] + compressed relatedAssets-chunk_js.css.map.gz X bytes [emitted] + compressed relatedAssets-chunk_js.css.br X bytes [emitted] + compressed relatedAssets-chunk_js.css.gz X bytes [emitted] + asset relatedAssets-main.css X bytes [emitted] (name: main) + sourceMap relatedAssets-main.css.map X bytes [emitted] [dev] (auxiliary name: main) + compressed relatedAssets-main.css.map.br X bytes [emitted] + compressed relatedAssets-main.css.map.gz X bytes [emitted] + compressed relatedAssets-main.css.br X bytes [emitted] + compressed relatedAssets-main.css.gz X bytes [emitted] + asset relatedAssets-file.jpg X KiB [emitted] [from: file.jpg] (auxiliary name: main) + +exclude1: + assets by path *.js X KiB + asset exclude1-main.js X KiB [emitted] (name: main) + hidden assets X KiB 2 assets + sourceMap exclude1-main.js.map X KiB [emitted] [dev] (auxiliary name: main) + hidden assets X KiB 2 assets + + 1 related asset + + 1 related asset + asset exclude1-chunk_js.js X bytes [emitted] + hidden assets X KiB 2 assets + sourceMap exclude1-chunk_js.js.map X bytes [emitted] [dev] + hidden assets X bytes 2 assets + + 1 related asset + + 1 related asset + assets by path *.css X bytes + asset exclude1-chunk_js.css X bytes [emitted] + hidden assets X bytes 2 assets + sourceMap exclude1-chunk_js.css.map X bytes [emitted] [dev] + hidden assets X bytes 2 assets + + 1 related asset + + 1 related asset + asset exclude1-main.css X bytes [emitted] (name: main) + hidden assets X bytes 2 assets + sourceMap exclude1-main.css.map X bytes [emitted] [dev] (auxiliary name: main) + hidden assets X bytes 2 assets + + 1 related asset + + 1 related asset + asset exclude1-file.jpg X KiB [emitted] [from: file.jpg] (auxiliary name: main) + +exclude2: + assets by path *.js X KiB + asset exclude2-main.js X KiB [emitted] (name: main) + hidden assets X KiB 1 asset + compressed exclude2-main.js.br X KiB [emitted] + compressed exclude2-main.js.gz X KiB [emitted] + asset exclude2-chunk_js.js X bytes [emitted] + hidden assets X bytes 1 asset + compressed exclude2-chunk_js.js.br X bytes [emitted] + compressed exclude2-chunk_js.js.gz X bytes [emitted] + assets by path *.css X bytes + asset exclude2-chunk_js.css X bytes [emitted] + hidden assets X bytes 1 asset + compressed exclude2-chunk_js.css.br X bytes [emitted] + compressed exclude2-chunk_js.css.gz X bytes [emitted] + asset exclude2-main.css X bytes [emitted] (name: main) + hidden assets X bytes 1 asset + compressed exclude2-main.css.br X bytes [emitted] + compressed exclude2-main.css.gz X bytes [emitted] + asset exclude2-file.jpg X KiB [emitted] [from: file.jpg] (auxiliary name: main) + +exclude3: + hidden assets X bytes 2 assets + assets by status X KiB [emitted] + asset exclude3-main.js X KiB [emitted] (name: main) + compressed exclude3-main.js.br X KiB [emitted] + compressed exclude3-main.js.gz X KiB [emitted] + sourceMap exclude3-main.js.map X KiB [emitted] [dev] (auxiliary name: main) + compressed exclude3-main.js.map.br X KiB [emitted] + compressed exclude3-main.js.map.gz X KiB [emitted] + asset exclude3-file.jpg X KiB [emitted] [from: file.jpg] (auxiliary name: main) + asset exclude3-main.css X bytes [emitted] (name: main) + sourceMap exclude3-main.css.map X bytes [emitted] [dev] (auxiliary name: main) + compressed exclude3-main.css.map.br X bytes [emitted] + compressed exclude3-main.css.map.gz X bytes [emitted] + compressed exclude3-main.css.br X bytes [emitted] + compressed exclude3-main.css.gz X bytes [emitted]" +`; + +exports[`StatsTestCases should print correct stats for resolve-plugin-context 1`] = ` +"asset bundle.js X KiB [emitted] (name: main) +modules by path ./node_modules/def/ X bytes + ./node_modules/def/index.js X bytes [built] [code generated] + ./node_modules/def/node_modules/xyz/index.js X bytes [built] [code generated] +./index.js X bytes [built] [code generated] +./node_modules/abc/index.js X bytes [built] [code generated] +./node_modules/xyz/index.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for reverse-sort-modules 1`] = ` +"asset main.js X KiB [emitted] (name: main) +./index.js X bytes [built] [code generated] +./c.js?9 X bytes [built] [code generated] +./c.js?8 X bytes [built] [code generated] +./c.js?7 X bytes [built] [code generated] +./c.js?6 X bytes [built] [code generated] +./c.js?5 X bytes [built] [code generated] +./c.js?4 X bytes [built] [code generated] +./c.js?3 X bytes [built] [code generated] +./c.js?2 X bytes [built] [code generated] +./c.js?10 X bytes [built] [code generated] +./c.js?1 X bytes [built] [code generated] +./b.js?9 X bytes [built] [code generated] +./b.js?8 X bytes [built] [code generated] +./b.js?7 X bytes [built] [code generated] +./b.js?6 X bytes [built] [code generated] +./b.js?5 X bytes [built] [code generated] +./b.js?4 X bytes [built] [code generated] +./b.js?3 X bytes [built] [code generated] +./b.js?2 X bytes [built] [code generated] +./b.js?10 X bytes [built] [code generated] +./b.js?1 X bytes [built] [code generated] +./a.js?9 X bytes [built] [code generated] +./a.js?8 X bytes [built] [code generated] +./a.js?7 X bytes [built] [code generated] +./a.js?6 X bytes [built] [code generated] +./a.js?5 X bytes [built] [code generated] +./a.js?4 X bytes [built] [code generated] +./a.js?3 X bytes [built] [code generated] +./a.js?2 X bytes [built] [code generated] +./a.js?10 X bytes [built] [code generated] +./a.js?1 X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for runtime-chunk 1`] = ` +"Entrypoint e1 X KiB = runtime~e1.js X KiB e1.js X KiB +Entrypoint e2 X KiB = runtime~e2.js X KiB e2.js X KiB +webpack x.x.x compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for runtime-chunk-integration 1`] = ` +"base: + asset without-runtime.js X KiB [emitted] (name: runtime) + asset without-580.js X KiB [emitted] + asset without-main1.js X bytes [emitted] (name: main1) + Entrypoint main1 X KiB = without-runtime.js X KiB without-main1.js X bytes + runtime modules X KiB 10 modules + cacheable modules X bytes + ./main1.js X bytes [built] [code generated] + ./b.js X bytes [built] [code generated] + ./c.js X bytes [built] [code generated] + ./d.js X bytes [built] [code generated] + base (webpack x.x.x) compiled successfully + +static custom name: + asset with-manifest.js X KiB [emitted] (name: manifest) + asset with-580.js X KiB [emitted] + asset with-main1.js X bytes [emitted] (name: main1) + asset with-main2.js X bytes [emitted] (name: main2) + asset with-main3.js X bytes [emitted] (name: main3) + Entrypoint main1 X KiB = with-manifest.js X KiB with-main1.js X bytes + Entrypoint main2 X KiB = with-manifest.js X KiB with-main2.js X bytes + Entrypoint main3 X KiB = with-manifest.js X KiB with-main3.js X bytes + runtime modules X KiB 10 modules + cacheable modules X bytes + ./main1.js X bytes [built] [code generated] + ./main2.js X bytes [built] [code generated] + ./main3.js X bytes [built] [code generated] + ./b.js X bytes [built] [code generated] + ./c.js X bytes [built] [code generated] + ./d.js X bytes [built] [code generated] + static custom name (webpack x.x.x) compiled successfully + +dynamic custom name: + asset func-b.js X KiB [emitted] (name: b) + asset func-a.js X KiB [emitted] (name: a) + asset func-580.js X KiB [emitted] + asset func-main1.js X bytes [emitted] (name: main1) + asset func-main2.js X bytes [emitted] (name: main2) + asset func-main3.js X bytes [emitted] (name: main3) + Entrypoint main1 X KiB = func-b.js X KiB func-main1.js X bytes + Entrypoint main2 X KiB = func-b.js X KiB func-main2.js X bytes + Entrypoint main3 X KiB = func-a.js X KiB func-main3.js X bytes + runtime modules X KiB 13 modules + cacheable modules X bytes + ./main1.js X bytes [built] [code generated] + ./main2.js X bytes [built] [code generated] + ./main3.js X bytes [built] [code generated] + ./b.js X bytes [built] [code generated] + ./c.js X bytes [built] [code generated] + ./d.js X bytes [built] [code generated] + dynamic custom name (webpack x.x.x) compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for runtime-chunk-issue-7382 1`] = ` +"Entrypoint e1 X KiB = runtime.js X KiB all.js X bytes e1.js X bytes +Entrypoint e2 X KiB = runtime.js X KiB all.js X bytes e2.js X bytes +webpack x.x.x compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for runtime-chunk-single 1`] = ` +"Entrypoint e1 X KiB = runtime.js X KiB e1.js X KiB +Entrypoint e2 X KiB = runtime.js X KiB e2.js X KiB +webpack x.x.x compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for runtime-specific-used-exports 1`] = ` +"production: + asset production-a.js X KiB [emitted] (name: a) + asset production-b.js X KiB [emitted] (name: b) + asset production-dw_js-_a6170.js X KiB [emitted] + asset production-dw_js-_a6171.js X KiB [emitted] + asset production-dx_js.js X KiB [emitted] + asset production-dy_js.js X KiB [emitted] + asset production-dz_js.js X KiB [emitted] + asset production-c.js X bytes [emitted] (name: c) + chunk (runtime: a) production-a.js (a) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 9 modules + cacheable modules X bytes + ./a.js X bytes [built] [code generated] + [no exports used] + ./dx-importer.js X bytes [dependent] [built] [code generated] + [only some exports used: default] + ./module.js X bytes [dependent] [built] [code generated] + [only some exports used: x] + ./module.js?reexported X bytes [dependent] [built] [code generated] + [only some exports used: x] + ./reexport.js X bytes [dependent] [built] [code generated] + [only some exports used: x] + chunk (runtime: b) production-b.js (b) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 9 modules + cacheable modules X bytes + ./b.js X bytes [built] [code generated] + [no exports used] + ./dx-importer.js X bytes [dependent] [built] [code generated] + [only some exports used: default] + ./module.js X bytes [dependent] [built] [code generated] + [only some exports used: y] + ./module.js?reexported X bytes [dependent] [built] [code generated] + [only some exports used: y] + ./reexport.js X bytes [dependent] [built] [code generated] + [only some exports used: y] + chunk (runtime: c) production-c.js (c) X bytes [entry] [rendered] + ./c.js X bytes [built] [code generated] + [no exports used] + chunk (runtime: a) production-dw_js-_a6170.js X bytes [rendered] + ./dw.js X bytes [built] [code generated] + ./module.js?chunk X bytes [dependent] [built] [code generated] + [only some exports used: identity, w, x, y] + chunk (runtime: b) production-dw_js-_a6171.js X bytes [rendered] + ./dw.js X bytes [built] [code generated] + ./module.js?chunk X bytes [dependent] [built] [code generated] + [only some exports used: identity, w, x, z] + chunk (runtime: a, b) production-dx_js.js X bytes [rendered] + ./dx.js X bytes [built] [code generated] + ./module.js?chunk X bytes [dependent] [built] [code generated] + [only some exports used: identity, w, x, y, z] + chunk (runtime: a) production-dy_js.js X bytes [rendered] + ./dy.js X bytes [built] [code generated] + ./module.js?chunk X bytes [dependent] [built] [code generated] + [only some exports used: identity, w, x, y] + chunk (runtime: b) production-dz_js.js X bytes [rendered] + ./dz.js X bytes [built] [code generated] + ./module.js?chunk X bytes [dependent] [built] [code generated] + [only some exports used: identity, w, x, z] + runtime modules X KiB 18 modules + cacheable modules X KiB + ./a.js X bytes [built] [code generated] + [no exports used] + ./b.js X bytes [built] [code generated] + [no exports used] + ./c.js X bytes [built] [code generated] + [no exports used] + ./module.js X bytes [built] [code generated] + [only some exports used: x, y] + ./reexport.js X bytes [built] [code generated] + [only some exports used: x, y] + ./dx-importer.js X bytes [built] [code generated] + [only some exports used: default] + ./dy.js X bytes [built] [code generated] + ./dw.js X bytes [built] [code generated] + ./dz.js X bytes [built] [code generated] + ./module.js?reexported X bytes [built] [code generated] + [only some exports used: x, y] + ./module.js?chunk X bytes [built] [code generated] + [only some exports used: identity, w, x, y, z] + ./dx.js X bytes [built] [code generated] + production (webpack x.x.x) compiled successfully in X ms + +development: + asset development-a.js X KiB [emitted] (name: a) + asset development-b.js X KiB [emitted] (name: b) + asset development-dw_js.js X KiB [emitted] + asset development-dx_js.js X KiB [emitted] + asset development-dy_js.js X KiB [emitted] + asset development-dz_js.js X KiB [emitted] + asset development-c.js X KiB [emitted] (name: c) + chunk (runtime: a) development-a.js (a) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 9 modules + cacheable modules X bytes + ./a.js X bytes [built] [code generated] + [used exports unknown] + ./dx-importer.js X bytes [dependent] [built] [code generated] + [used exports unknown] + ./module.js X bytes [dependent] [built] [code generated] + [used exports unknown] + ./module.js?reexported X bytes [dependent] [built] [code generated] + [used exports unknown] + ./reexport.js X bytes [dependent] [built] [code generated] + [used exports unknown] + chunk (runtime: b) development-b.js (b) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 9 modules + cacheable modules X bytes + ./b.js X bytes [built] [code generated] + [used exports unknown] + ./dx-importer.js X bytes [dependent] [built] [code generated] + [used exports unknown] + ./module.js X bytes [dependent] [built] [code generated] + [used exports unknown] + ./module.js?reexported X bytes [dependent] [built] [code generated] + [used exports unknown] + ./reexport.js X bytes [dependent] [built] [code generated] + [used exports unknown] + chunk (runtime: c) development-c.js (c) X bytes [entry] [rendered] + ./c.js X bytes [built] [code generated] + [used exports unknown] + chunk (runtime: a, b) development-dw_js.js X bytes [rendered] + ./dw.js X bytes [built] [code generated] + [used exports unknown] + ./module.js?chunk X bytes [dependent] [built] [code generated] + [used exports unknown] + chunk (runtime: a, b) development-dx_js.js X bytes [rendered] + ./dx.js X bytes [built] [code generated] + [used exports unknown] + ./module.js?chunk X bytes [dependent] [built] [code generated] + [used exports unknown] + chunk (runtime: a) development-dy_js.js X bytes [rendered] + ./dy.js X bytes [built] [code generated] + [used exports unknown] + ./module.js?chunk X bytes [dependent] [built] [code generated] + [used exports unknown] + chunk (runtime: b) development-dz_js.js X bytes [rendered] + ./dz.js X bytes [built] [code generated] + [used exports unknown] + ./module.js?chunk X bytes [dependent] [built] [code generated] + [used exports unknown] + runtime modules X KiB 18 modules + cacheable modules X KiB + ./a.js X bytes [built] [code generated] + [used exports unknown] + ./b.js X bytes [built] [code generated] + [used exports unknown] + ./c.js X bytes [built] [code generated] + [used exports unknown] + ./module.js X bytes [built] [code generated] + [used exports unknown] + ./reexport.js X bytes [built] [code generated] + [used exports unknown] + ./dx-importer.js X bytes [built] [code generated] + [used exports unknown] + ./dy.js X bytes [built] [code generated] + [used exports unknown] + ./dw.js X bytes [built] [code generated] + [used exports unknown] + ./dz.js X bytes [built] [code generated] + [used exports unknown] + ./module.js?reexported X bytes [built] [code generated] + [used exports unknown] + ./module.js?chunk X bytes [built] [code generated] + [used exports unknown] + ./dx.js X bytes [built] [code generated] + [used exports unknown] + development (webpack x.x.x) compiled successfully in X ms + +global: + asset global-a.js X KiB [emitted] (name: a) + asset global-b.js X KiB [emitted] (name: b) + asset global-dw_js.js X KiB [emitted] + asset global-dx_js.js X KiB [emitted] + asset global-dy_js.js X KiB [emitted] + asset global-dz_js.js X KiB [emitted] + asset global-c.js X bytes [emitted] (name: c) + chunk (runtime: a) global-a.js (a) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 9 modules + cacheable modules X bytes + ./a.js X bytes [built] [code generated] + [no exports used] + ./dx-importer.js X bytes [dependent] [built] [code generated] + [only some exports used: default] + ./module.js X bytes [dependent] [built] [code generated] + [only some exports used: x, y] + ./module.js?reexported X bytes [dependent] [built] [code generated] + [only some exports used: x, y] + ./reexport.js X bytes [dependent] [built] [code generated] + [only some exports used: x, y] + chunk (runtime: b) global-b.js (b) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 9 modules + cacheable modules X bytes + ./b.js X bytes [built] [code generated] + [no exports used] + ./dx-importer.js X bytes [dependent] [built] [code generated] + [only some exports used: default] + ./module.js X bytes [dependent] [built] [code generated] + [only some exports used: x, y] + ./module.js?reexported X bytes [dependent] [built] [code generated] + [only some exports used: x, y] + ./reexport.js X bytes [dependent] [built] [code generated] + [only some exports used: x, y] + chunk (runtime: c) global-c.js (c) X bytes [entry] [rendered] + ./c.js X bytes [built] [code generated] + [no exports used] + chunk (runtime: a, b) global-dw_js.js X bytes [rendered] + ./dw.js X bytes [built] [code generated] + ./module.js?chunk X bytes [dependent] [built] [code generated] + [only some exports used: identity, w, x, y, z] + chunk (runtime: a, b) global-dx_js.js X bytes [rendered] + ./dx.js X bytes [built] [code generated] + ./module.js?chunk X bytes [dependent] [built] [code generated] + [only some exports used: identity, w, x, y, z] + chunk (runtime: a) global-dy_js.js X bytes [rendered] + ./dy.js X bytes [built] [code generated] + ./module.js?chunk X bytes [dependent] [built] [code generated] + [only some exports used: identity, w, x, y, z] + chunk (runtime: b) global-dz_js.js X bytes [rendered] + ./dz.js X bytes [built] [code generated] + ./module.js?chunk X bytes [dependent] [built] [code generated] + [only some exports used: identity, w, x, y, z] + runtime modules X KiB 18 modules + cacheable modules X KiB + ./a.js X bytes [built] [code generated] + [no exports used] + ./b.js X bytes [built] [code generated] + [no exports used] + ./c.js X bytes [built] [code generated] + [no exports used] + ./module.js X bytes [built] [code generated] + [only some exports used: x, y] + ./reexport.js X bytes [built] [code generated] + [only some exports used: x, y] + ./dx-importer.js X bytes [built] [code generated] + [only some exports used: default] + ./dy.js X bytes [built] [code generated] + ./dw.js X bytes [built] [code generated] + ./dz.js X bytes [built] [code generated] + ./module.js?reexported X bytes [built] [code generated] + [only some exports used: x, y] + ./module.js?chunk X bytes [built] [code generated] + [only some exports used: identity, w, x, y, z] + ./dx.js X bytes [built] [code generated] + global (webpack x.x.x) compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for scope-hoisting-bailouts 1`] = ` +"runtime modules X KiB 10 modules +built modules X bytes [built] + code generated modules X bytes [code generated] + ./index.js X bytes [built] [code generated] + Statement (ExpressionStatement) with side effects in source code at 7:0-25 + ModuleConcatenation bailout: Cannot concat with ./cjs.js: Module is not an ECMAScript module + ModuleConcatenation bailout: Cannot concat with ./eval.js: Module uses eval() + ModuleConcatenation bailout: Cannot concat with ./module-id.js: Module uses module.id + ModuleConcatenation bailout: Cannot concat with ./module-loaded.js: Module uses module.loaded + ./entry.js X bytes [built] [code generated] + ./cjs.js X bytes [built] [code generated] + CommonJS bailout: module.exports is used directly at 3:0-14 + Statement (ExpressionStatement) with side effects in source code at 1:0-26 + ModuleConcatenation bailout: Module is not an ECMAScript module + ./ref-from-cjs.js X bytes [built] [code generated] + ./eval.js X bytes [built] [code generated] + Statement (ExportDefaultDeclaration) with side effects in source code at 1:0-34 + ModuleConcatenation bailout: Module uses eval() + ./module-id.js X bytes [built] [code generated] + Statement (ExportDefaultDeclaration) with side effects in source code at 1:0-25 + ModuleConcatenation bailout: Module uses module.id + ./module-loaded.js X bytes [built] [code generated] + Statement (ExportDefaultDeclaration) with side effects in source code at 1:0-29 + ModuleConcatenation bailout: Module uses module.loaded + ./concatenated.js + 2 modules X bytes [built] [code generated] + ModuleConcatenation bailout: Cannot concat with external \\"external\\": Module external \\"external\\" is not in the same chunk(s) (expected in chunk(s) unnamed chunk(s), module is in chunk(s) index) + external \\"external\\" X bytes [built] [code generated] + orphan modules X bytes [orphan] + ./concatenated1.js X bytes [orphan] [built] + Dependency (harmony side effect evaluation) with side effects at 1:0-36 + ./concatenated2.js X bytes [orphan] [built] + Dependency (harmony side effect evaluation) with side effects at 1:0-29 +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for scope-hoisting-multi 1`] = ` +"Entrypoint first X KiB = a-vendor.js X bytes a-first.js X KiB +Entrypoint second X KiB = a-vendor.js X bytes a-second.js X KiB +runtime modules X KiB 20 modules +orphan modules X bytes [orphan] 1 module +cacheable modules X bytes + ./first.js X bytes [built] [code generated] + ./second.js X bytes [built] [code generated] + ./vendor.js X bytes [built] [code generated] + ./module_first.js X bytes [built] [code generated] + ./common2.js X bytes [built] [code generated] + ./lazy_first.js X bytes [built] [code generated] + ./lazy_shared.js X bytes [built] [code generated] + ./lazy_second.js X bytes [built] [code generated] + ./common_lazy.js X bytes [built] [code generated] + ./common_lazy_shared.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms + +Entrypoint first X KiB = b-vendor.js X bytes b-first.js X KiB +Entrypoint second X KiB = b-vendor.js X bytes b-second.js X KiB +runtime modules X KiB 20 modules +cacheable modules X bytes + code generated modules X bytes [code generated] + ./first.js + 2 modules X bytes [built] [code generated] + ModuleConcatenation bailout: Cannot concat with ./vendor.js: Module ./vendor.js is not in the same chunk(s) (expected in chunk(s) first, module is in chunk(s) vendor) + ./second.js + 1 modules X bytes [built] [code generated] + ModuleConcatenation bailout: Cannot concat with ./vendor.js: Module ./vendor.js is not in the same chunk(s) (expected in chunk(s) second, module is in chunk(s) vendor) + ./vendor.js X bytes [built] [code generated] + ./lazy_first.js + 1 modules X bytes [built] [code generated] + ModuleConcatenation bailout: Cannot concat with ./common_lazy_shared.js: Module ./common_lazy_shared.js is referenced from different chunks by these modules: ./lazy_shared.js + ./lazy_shared.js X bytes [built] [code generated] + ModuleConcatenation bailout: Cannot concat with ./common_lazy_shared.js: Module ./common_lazy_shared.js is referenced from different chunks by these modules: ./lazy_first.js, ./lazy_second.js + ./lazy_second.js + 1 modules X bytes [built] [code generated] + ModuleConcatenation bailout: Cannot concat with ./common_lazy_shared.js: Module ./common_lazy_shared.js is referenced from different chunks by these modules: ./lazy_shared.js + ./common_lazy_shared.js X bytes [built] [code generated] + orphan modules X bytes [orphan] + ./module_first.js X bytes [orphan] [built] + ./common2.js X bytes [orphan] [built] + ./common.js X bytes [orphan] [built] + ModuleConcatenation bailout: Module is not in any chunk + ./common_lazy.js X bytes [orphan] [built] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for side-effects-issue-7428 1`] = ` +"asset main.js X KiB [emitted] (name: main) +asset 1.js X bytes [emitted] +runtime modules X KiB 9 modules +cacheable modules X bytes + modules by path ./components/src/ X bytes + orphan modules X bytes [orphan] + modules by path ./components/src/CompAB/*.js X bytes 2 modules + modules by path ./components/src/CompC/*.js X bytes 2 modules + ./components/src/index.js X bytes [orphan] [built] + [module unused] + [inactive] from origin ./main.js + 1 modules + [inactive] harmony side effect evaluation ./components ./main.js + 1 modules ./main.js 1:0-44 + [inactive] harmony import specifier ./components ./main.js + 1 modules ./main.js 3:15-20 + [inactive] harmony import specifier ./components ./main.js + 1 modules ./main.js 4:15-20 + [inactive] from origin ./foo.js + [inactive] harmony side effect evaluation ./components ./foo.js 1:0-37 + [inactive] harmony import specifier ./components ./foo.js 3:20-25 + code generated modules X bytes [code generated] + ./components/src/CompAB/CompA.js X bytes [built] [code generated] + [only some exports used: default] + [inactive] from origin ./components/src/CompAB/index.js + [inactive] harmony side effect evaluation ./CompA ./components/src/CompAB/index.js 1:0-43 + [inactive] harmony export imported specifier ./CompA ./components/src/CompAB/index.js 1:0-43 + [inactive] harmony export imported specifier ./CompAB ./components/src/index.js 1:0-40 (skipped side-effect-free modules) + harmony import specifier ./components ./foo.js 3:20-25 (skipped side-effect-free modules) + harmony import specifier ./components ./main.js + 1 modules ./main.js 3:15-20 (skipped side-effect-free modules) + ./components/src/CompAB/utils.js X bytes [built] [code generated] + from origin ./components/src/CompAB/CompA.js + [inactive] harmony side effect evaluation ./utils ./components/src/CompAB/CompA.js 1:0-35 + harmony import specifier ./utils ./components/src/CompAB/CompA.js 5:5-12 + from origin ./components/src/CompAB/CompB.js + [inactive] harmony side effect evaluation ./utils ./components/src/CompAB/CompB.js 1:0-30 + harmony import specifier ./utils ./components/src/CompAB/CompB.js 5:2-5 + from origin ./main.js + 1 modules + [inactive] harmony side effect evaluation ./utils ./main.js + 1 modules ./components/src/CompAB/CompB.js 1:0-30 + harmony import specifier ./utils ./main.js + 1 modules ./components/src/CompAB/CompB.js 5:2-5 + modules by path ./*.js X bytes + ./main.js + 1 modules X bytes [built] [code generated] + [no exports used] + entry ./main.js main + | ./main.js X bytes [built] + | [no exports used] + | ./components/src/CompAB/CompB.js X bytes [built] + | [only some exports used: default] + | [inactive] from origin ./components/src/CompAB/index.js + | [inactive] harmony side effect evaluation ./CompB ./components/src/CompAB/index.js 2:0-43 + | [inactive] harmony export imported specifier ./CompB ./components/src/CompAB/index.js 2:0-43 + | [inactive] harmony export imported specifier ./CompAB ./components/src/index.js 1:0-40 (skipped side-effect-free modules) + | harmony import specifier ./components ./main.js 4:15-20 (skipped side-effect-free modules) + ./foo.js X bytes [built] [code generated] + import() ./foo ./main.js + 1 modules ./main.js 6:0-15 +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for side-effects-optimization 1`] = ` +"asset main.js X bytes [emitted] [minimized] (name: main) +orphan modules X KiB [orphan] 4 modules +cacheable modules X KiB + ./index.js + 2 modules X KiB [built] [code generated] + [no exports] + [no exports used] + ModuleConcatenation bailout: Cannot concat with ./node_modules/module-with-export/emptyModule.js: Module is not an ECMAScript module + | ./index.js X bytes [built] + | [no exports] + | [no exports used] + | Statement (ExpressionStatement) with side effects in source code at 4:0-30 + | ./node_modules/module-with-export/index.js X KiB [built] + | [only some exports used: smallVar] + | ./node_modules/big-module/a.js X bytes [built] + | [only some exports used: a] + ./node_modules/module-with-export/emptyModule.js X bytes [built] [code generated] + [used exports unknown] + ModuleConcatenation bailout: Module is not an ECMAScript module +webpack x.x.x compiled successfully in X ms + +asset main.no-side.js X bytes [emitted] [minimized] (name: main) +runtime modules X bytes 4 modules +orphan modules X bytes [orphan] 2 modules +cacheable modules X KiB + modules by path ./node_modules/module-with-export/*.js X KiB + ./node_modules/module-with-export/index.js X KiB [built] [code generated] + [only some exports used: huh, smallVar] + ModuleConcatenation bailout: List of module exports is dynamic (huh: maybe provided (runtime-defined) and used in main) + ./node_modules/module-with-export/emptyModule.js X bytes [built] [code generated] + [used exports unknown] + ModuleConcatenation bailout: Module is not an ECMAScript module + ./index.js + 2 modules X bytes [built] [code generated] + [no exports] + [no exports used] + ModuleConcatenation bailout: Cannot concat with ./node_modules/big-module/log.js: Module ./node_modules/big-module/log.js is referenced from these modules with unsupported syntax: ./node_modules/big-module/log.js (referenced with module decorator) + ModuleConcatenation bailout: Cannot concat with ./node_modules/module-with-export/index.js: Module ./node_modules/big-module/log.js is referenced from these modules with unsupported syntax: ./node_modules/big-module/log.js (referenced with module decorator) + | ./index.js X bytes [built] + | [no exports] + | [no exports used] + | ./node_modules/big-module/index.js X bytes [built] + | [only some exports used: a, huh] + | ModuleConcatenation bailout: List of module exports is dynamic (a: maybe provided (runtime-defined) and used in main, huh: maybe provided (runtime-defined) and used in main) + | ./node_modules/big-module/a.js X bytes [built] + | [only some exports used: a, huh] + | ModuleConcatenation bailout: List of module exports is dynamic (huh: maybe provided (runtime-defined) and used in main) + ./node_modules/big-module/log.js X bytes [built] [code generated] + [only some exports used: huh] + ModuleConcatenation bailout: List of module exports is dynamic (huh: maybe provided (runtime-defined) and used in main) +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for side-effects-simple-unused 1`] = ` +"asset main.js X bytes [emitted] (name: main) +./index.js + 2 modules X bytes [built] [code generated] + [no exports used] + entry ./index main + | ./index.js X bytes [built] + | [no exports used] + | ./node_modules/pmodule/index.js X bytes [built] + | [only some exports used: default] + | [inactive] harmony side effect evaluation pmodule ./index.js 1:0-33 + | harmony import specifier pmodule ./index.js 3:12-15 + | [inactive] harmony import specifier pmodule ./index.js 3:17-18 + | ./node_modules/pmodule/c.js X bytes [built] + | [only some exports used: z] + | [inactive] from origin ./node_modules/pmodule/b.js + | [inactive] harmony side effect evaluation ./c ./node_modules/pmodule/b.js 5:0-24 + | [inactive] harmony export imported specifier ./c ./node_modules/pmodule/b.js 5:0-24 + | harmony import specifier pmodule ./index.js 3:17-18 (skipped side-effect-free modules) + | [inactive] harmony export imported specifier ./b ./node_modules/pmodule/index.js 2:0-30 (skipped side-effect-free modules) +./node_modules/pmodule/index.js X bytes [orphan] [built] + [only some exports used: default] + [inactive] harmony side effect evaluation pmodule ./index.js 1:0-33 + harmony import specifier pmodule ./index.js 3:12-15 + [inactive] harmony import specifier pmodule ./index.js 3:17-18 +./node_modules/pmodule/c.js X bytes [orphan] [built] + [only some exports used: z] + [inactive] from origin ./node_modules/pmodule/b.js + [inactive] harmony side effect evaluation ./c ./node_modules/pmodule/b.js 5:0-24 + [inactive] harmony export imported specifier ./c ./node_modules/pmodule/b.js 5:0-24 + harmony import specifier pmodule ./index.js 3:17-18 (skipped side-effect-free modules) + [inactive] harmony export imported specifier ./b ./node_modules/pmodule/index.js 2:0-30 (skipped side-effect-free modules) +./node_modules/pmodule/a.js X bytes [orphan] [built] + [module unused] + [inactive] from origin ./index.js + 2 modules + [inactive] harmony side effect evaluation ./a ./index.js + 2 modules ./node_modules/pmodule/index.js 1:0-20 + [inactive] harmony export imported specifier ./a ./index.js + 2 modules ./node_modules/pmodule/index.js 1:0-20 + [inactive] from origin ./node_modules/pmodule/index.js + [inactive] harmony side effect evaluation ./a ./node_modules/pmodule/index.js 1:0-20 + [inactive] harmony export imported specifier ./a ./node_modules/pmodule/index.js 1:0-20 +./node_modules/pmodule/b.js X bytes [orphan] [built] + [module unused] + [inactive] from origin ./index.js + 2 modules + [inactive] harmony side effect evaluation ./b ./index.js + 2 modules ./node_modules/pmodule/index.js 2:0-30 + [inactive] harmony export imported specifier ./b ./index.js + 2 modules ./node_modules/pmodule/index.js 2:0-30 + [inactive] harmony export imported specifier ./b ./index.js + 2 modules ./node_modules/pmodule/index.js 2:0-30 + [inactive] harmony export imported specifier ./b ./index.js + 2 modules ./node_modules/pmodule/index.js 2:0-30 + [inactive] from origin ./node_modules/pmodule/index.js + [inactive] harmony side effect evaluation ./b ./node_modules/pmodule/index.js 2:0-30 + [inactive] harmony export imported specifier ./b ./node_modules/pmodule/index.js 2:0-30 + [inactive] harmony export imported specifier ./b ./node_modules/pmodule/index.js 2:0-30 + [inactive] harmony export imported specifier ./b ./node_modules/pmodule/index.js 2:0-30 +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for simple 1`] = ` +"asset bundle.js X KiB [emitted] (name: main) +./index.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for simple-more-info 1`] = ` +"PublicPath: auto +asset bundle.js X bytes [emitted] (name: main) +./index.js X bytes [built] [code generated] + entry ./index main + X ms (resolving: X ms, restoring: X ms, integration: X ms, building: X ms, storing: X ms) +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for split-chunks 1`] = ` +"default: + Entrypoint main X KiB = default/main.js + Entrypoint a X KiB = default/a.js + Entrypoint b X KiB = default/b.js + Entrypoint c X KiB = default/c.js + chunk (runtime: a, main) default/async-g.js (async-g) X bytes <{263}> <{425}> <{628}> <{723}> <{996}> ={935}= [rendered] + > ./g ./a.js 6:0-47 + ./g.js X bytes [built] [code generated] + chunk (runtime: main) default/async-b.js (async-b) X bytes <{792}> ={425}= ={628}= ={723}= ={935}= [rendered] + > ./b ./index.js 2:0-47 + ./b.js X bytes [built] [code generated] + chunk (runtime: b) default/b.js (b) X bytes (javascript) X bytes (runtime) [entry] [rendered] + > ./b b + dependent modules X bytes [dependent] 4 modules + runtime modules X bytes 2 modules + ./b.js X bytes [built] [code generated] + chunk (runtime: main) default/async-a.js (async-a) X bytes <{792}> ={425}= ={628}= ={723}= >{49}< >{935}< [rendered] + > ./a ./index.js 1:0-47 + ./a.js + 1 modules X bytes [built] [code generated] + chunk (runtime: c) default/c.js (c) X bytes (javascript) X bytes (runtime) [entry] [rendered] + > ./c c + dependent modules X bytes [dependent] 4 modules + runtime modules X bytes 2 modules + ./c.js X bytes [built] [code generated] + chunk (runtime: main) default/425.js X bytes <{792}> ={60}= ={263}= ={628}= ={723}= ={862}= ={869}= ={935}= >{49}< >{935}< [rendered] split chunk (cache group: default) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + ./d.js X bytes [built] [code generated] + chunk (runtime: main) default/628.js (id hint: vendors) X bytes <{792}> ={60}= ={263}= ={425}= ={723}= ={862}= ={869}= ={935}= >{49}< >{935}< [rendered] split chunk (cache group: defaultVendors) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + ./node_modules/x.js X bytes [built] [code generated] + chunk (runtime: main) default/723.js (id hint: vendors) X bytes <{792}> ={60}= ={263}= ={425}= ={628}= ={935}= >{49}< >{935}< [rendered] split chunk (cache group: defaultVendors) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + ./node_modules/y.js X bytes [built] [code generated] + chunk (runtime: main) default/main.js (main) X bytes (javascript) X KiB (runtime) >{60}< >{263}< >{425}< >{628}< >{723}< >{862}< >{869}< >{935}< [entry] [rendered] + > ./ main + runtime modules X KiB 9 modules + ./index.js X bytes [built] [code generated] + chunk (runtime: main) default/862.js (id hint: vendors) X bytes <{792}> ={425}= ={628}= ={869}= ={935}= [rendered] split chunk (cache group: defaultVendors) + > ./c ./index.js 3:0-47 + ./node_modules/z.js X bytes [built] [code generated] + chunk (runtime: main) default/async-c.js (async-c) X bytes <{792}> ={425}= ={628}= ={862}= ={935}= [rendered] + > ./c ./index.js 3:0-47 + ./c.js X bytes [built] [code generated] + chunk (runtime: a, main) default/935.js X bytes <{263}> <{425}> <{628}> <{723}> <{792}> <{996}> ={49}= ={60}= ={425}= ={628}= ={723}= ={862}= ={869}= [rendered] split chunk (cache group: default) + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + > ./g ./a.js 6:0-47 + ./f.js X bytes [built] [code generated] + chunk (runtime: a) default/a.js (a) X bytes (javascript) X KiB (runtime) >{49}< >{935}< [entry] [rendered] + > ./a a + runtime modules X KiB 9 modules + dependent modules X bytes [dependent] 3 modules + ./a.js + 1 modules X bytes [built] [code generated] + default (webpack x.x.x) compiled successfully + +all-chunks: + Entrypoint main X KiB = all-chunks/main.js + Entrypoint a X KiB = all-chunks/628.js X bytes all-chunks/723.js X bytes all-chunks/425.js X bytes all-chunks/210.js X bytes all-chunks/a.js X KiB + Entrypoint b X KiB = all-chunks/628.js X bytes all-chunks/723.js X bytes all-chunks/425.js X bytes all-chunks/935.js X bytes all-chunks/b.js X KiB + Entrypoint c X KiB = all-chunks/628.js X bytes all-chunks/862.js X bytes all-chunks/425.js X bytes all-chunks/935.js X bytes all-chunks/c.js X KiB + chunk (runtime: a, main) all-chunks/async-g.js (async-g) X bytes <{210}> <{263}> <{425}> <{628}> <{723}> <{996}> ={935}= [rendered] + > ./g ./a.js 6:0-47 + ./g.js X bytes [built] [code generated] + chunk (runtime: main) all-chunks/async-b.js (async-b) X bytes <{792}> ={425}= ={628}= ={723}= ={935}= [rendered] + > ./b ./index.js 2:0-47 + ./b.js X bytes [built] [code generated] + chunk (runtime: b) all-chunks/b.js (b) X bytes (javascript) X KiB (runtime) ={425}= ={628}= ={723}= ={935}= [entry] [rendered] + > ./b b + runtime modules X KiB 4 modules + ./b.js X bytes [built] [code generated] + chunk (runtime: a, main) all-chunks/210.js X bytes <{792}> ={263}= ={425}= ={628}= ={723}= ={996}= >{49}< >{935}< [initial] [rendered] split chunk (cache group: default) + > ./a ./index.js 1:0-47 + > ./a a + ./e.js X bytes [built] [code generated] + chunk (runtime: main) all-chunks/async-a.js (async-a) X bytes <{792}> ={210}= ={425}= ={628}= ={723}= >{49}< >{935}< [rendered] + > ./a ./index.js 1:0-47 + ./a.js X bytes [built] [code generated] + chunk (runtime: c) all-chunks/c.js (c) X bytes (javascript) X KiB (runtime) ={425}= ={628}= ={862}= ={935}= [entry] [rendered] + > ./c c + runtime modules X KiB 4 modules + ./c.js X bytes [built] [code generated] + chunk (runtime: a, b, c, main) all-chunks/425.js X bytes <{792}> ={60}= ={199}= ={210}= ={263}= ={390}= ={628}= ={723}= ={862}= ={869}= ={935}= ={996}= >{49}< >{935}< [initial] [rendered] split chunk (cache group: default) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + > ./a a + > ./b b + > ./c c + ./d.js X bytes [built] [code generated] + chunk (runtime: a, b, c, main) all-chunks/628.js (id hint: vendors) X bytes <{792}> ={60}= ={199}= ={210}= ={263}= ={390}= ={425}= ={723}= ={862}= ={869}= ={935}= ={996}= >{49}< >{935}< [initial] [rendered] split chunk (cache group: defaultVendors) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + > ./a a + > ./b b + > ./c c + ./node_modules/x.js X bytes [built] [code generated] + chunk (runtime: a, b, main) all-chunks/723.js (id hint: vendors) X bytes <{792}> ={60}= ={199}= ={210}= ={263}= ={425}= ={628}= ={935}= ={996}= >{49}< >{935}< [initial] [rendered] split chunk (cache group: defaultVendors) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./a a + > ./b b + ./node_modules/y.js X bytes [built] [code generated] + chunk (runtime: main) all-chunks/main.js (main) X bytes (javascript) X KiB (runtime) >{60}< >{210}< >{263}< >{425}< >{628}< >{723}< >{862}< >{869}< >{935}< [entry] [rendered] + > ./ main + runtime modules X KiB 9 modules + ./index.js X bytes [built] [code generated] + chunk (runtime: c, main) all-chunks/862.js (id hint: vendors) X bytes <{792}> ={390}= ={425}= ={628}= ={869}= ={935}= [initial] [rendered] split chunk (cache group: defaultVendors) + > ./c ./index.js 3:0-47 + > ./c c + ./node_modules/z.js X bytes [built] [code generated] + chunk (runtime: main) all-chunks/async-c.js (async-c) X bytes <{792}> ={425}= ={628}= ={862}= ={935}= [rendered] + > ./c ./index.js 3:0-47 + ./c.js X bytes [built] [code generated] + chunk (runtime: a, b, c, main) all-chunks/935.js X bytes <{210}> <{263}> <{425}> <{628}> <{723}> <{792}> <{996}> ={49}= ={60}= ={199}= ={390}= ={425}= ={628}= ={723}= ={862}= ={869}= [initial] [rendered] split chunk (cache group: default) + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + > ./g ./a.js 6:0-47 + > ./b b + > ./c c + ./f.js X bytes [built] [code generated] + chunk (runtime: a) all-chunks/a.js (a) X bytes (javascript) X KiB (runtime) ={210}= ={425}= ={628}= ={723}= >{49}< >{935}< [entry] [rendered] + > ./a a + runtime modules X KiB 10 modules + ./a.js X bytes [built] [code generated] + all-chunks (webpack x.x.x) compiled successfully + +manual: + Entrypoint main X KiB = manual/main.js + Entrypoint a X KiB = manual/vendors.js X KiB manual/a.js X KiB + Entrypoint b X KiB = manual/vendors.js X KiB manual/b.js X KiB + Entrypoint c X KiB = manual/vendors.js X KiB manual/c.js X KiB + chunk (runtime: a, main) manual/async-g.js (async-g) X bytes <{96}> <{263}> <{996}> [rendered] + > ./g ./a.js 6:0-47 + dependent modules X bytes [dependent] 1 module + ./g.js X bytes [built] [code generated] + chunk (runtime: main) manual/async-b.js (async-b) X bytes <{792}> ={96}= [rendered] + > ./b ./index.js 2:0-47 + dependent modules X bytes [dependent] 2 modules + ./b.js X bytes [built] [code generated] + chunk (runtime: a, b, c, main) manual/vendors.js (vendors) (id hint: vendors) X bytes <{792}> ={60}= ={199}= ={263}= ={390}= ={869}= ={996}= >{49}< [initial] [rendered] split chunk (cache group: vendors) (name: vendors) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + > ./a a + > x a + > y a + > z a + > ./b b + > x b + > y b + > z b + > ./c c + > x c + > y c + > z c + ./node_modules/x.js X bytes [built] [code generated] + ./node_modules/y.js X bytes [built] [code generated] + ./node_modules/z.js X bytes [built] [code generated] + chunk (runtime: b) manual/b.js (b) X bytes (javascript) X KiB (runtime) ={96}= [entry] [rendered] + > ./b b + > x b + > y b + > z b + runtime modules X KiB 4 modules + dependent modules X bytes [dependent] 2 modules + ./b.js X bytes [built] [code generated] + chunk (runtime: main) manual/async-a.js (async-a) X bytes <{792}> ={96}= >{49}< [rendered] + > ./a ./index.js 1:0-47 + dependent modules X bytes [dependent] 1 module + ./a.js + 1 modules X bytes [built] [code generated] + chunk (runtime: c) manual/c.js (c) X bytes (javascript) X KiB (runtime) ={96}= [entry] [rendered] + > ./c c + > x c + > y c + > z c + runtime modules X KiB 4 modules + dependent modules X bytes [dependent] 2 modules + ./c.js X bytes [built] [code generated] + chunk (runtime: main) manual/main.js (main) X bytes (javascript) X KiB (runtime) >{60}< >{96}< >{263}< >{869}< [entry] [rendered] + > ./ main + runtime modules X KiB 9 modules + ./index.js X bytes [built] [code generated] + chunk (runtime: main) manual/async-c.js (async-c) X bytes <{792}> ={96}= [rendered] + > ./c ./index.js 3:0-47 + dependent modules X bytes [dependent] 2 modules + ./c.js X bytes [built] [code generated] + chunk (runtime: a) manual/a.js (a) X bytes (javascript) X KiB (runtime) ={96}= >{49}< [entry] [rendered] + > ./a a + > x a + > y a + > z a + runtime modules X KiB 10 modules + dependent modules X bytes [dependent] 1 module + ./a.js + 1 modules X bytes [built] [code generated] + manual (webpack x.x.x) compiled successfully + +name-too-long: + Entrypoint main X KiB = name-too-long/main.js + Entrypoint aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa X KiB = name-too-long/628.js X bytes name-too-long/723.js X bytes name-too-long/425.js X bytes name-too-long/210.js X bytes name-too-long/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.js X KiB + Entrypoint bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb X KiB = name-too-long/628.js X bytes name-too-long/723.js X bytes name-too-long/425.js X bytes name-too-long/935.js X bytes name-too-long/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.js X KiB + Entrypoint cccccccccccccccccccccccccccccc X KiB = name-too-long/628.js X bytes name-too-long/862.js X bytes name-too-long/425.js X bytes name-too-long/935.js X bytes name-too-long/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.js X KiB + chunk (runtime: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, main) name-too-long/async-g.js (async-g) X bytes <{210}> <{263}> <{425}> <{505}> <{628}> <{723}> ={935}= [rendered] + > ./g ./a.js 6:0-47 + ./g.js X bytes [built] [code generated] + chunk (runtime: main) name-too-long/async-b.js (async-b) X bytes <{792}> ={425}= ={628}= ={723}= ={935}= [rendered] + > ./b ./index.js 2:0-47 + ./b.js X bytes [built] [code generated] + chunk (runtime: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) name-too-long/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.js (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) X bytes (javascript) X KiB (runtime) ={425}= ={628}= ={723}= ={935}= [entry] [rendered] + > ./b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + runtime modules X KiB 4 modules + ./b.js X bytes [built] [code generated] + chunk (runtime: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, main) name-too-long/210.js X bytes <{792}> ={263}= ={425}= ={505}= ={628}= ={723}= >{49}< >{935}< [initial] [rendered] split chunk (cache group: default) + > ./a ./index.js 1:0-47 + > ./a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ./e.js X bytes [built] [code generated] + chunk (runtime: main) name-too-long/async-a.js (async-a) X bytes <{792}> ={210}= ={425}= ={628}= ={723}= >{49}< >{935}< [rendered] + > ./a ./index.js 1:0-47 + ./a.js X bytes [built] [code generated] + chunk (runtime: cccccccccccccccccccccccccccccc) name-too-long/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.js (cccccccccccccccccccccccccccccc) X bytes (javascript) X KiB (runtime) ={425}= ={628}= ={862}= ={935}= [entry] [rendered] + > ./c cccccccccccccccccccccccccccccc + runtime modules X KiB 4 modules + ./c.js X bytes [built] [code generated] + chunk (runtime: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb, cccccccccccccccccccccccccccccc, main) name-too-long/425.js X bytes <{792}> ={60}= ={63}= ={210}= ={263}= ={349}= ={505}= ={628}= ={723}= ={862}= ={869}= ={935}= >{49}< >{935}< [initial] [rendered] split chunk (cache group: default) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + > ./a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + > ./b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + > ./c cccccccccccccccccccccccccccccc + ./d.js X bytes [built] [code generated] + chunk (runtime: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) name-too-long/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.js (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) X bytes (javascript) X KiB (runtime) ={210}= ={425}= ={628}= ={723}= >{49}< >{935}< [entry] [rendered] + > ./a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + runtime modules X KiB 10 modules + ./a.js X bytes [built] [code generated] + chunk (runtime: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb, cccccccccccccccccccccccccccccc, main) name-too-long/628.js (id hint: vendors) X bytes <{792}> ={60}= ={63}= ={210}= ={263}= ={349}= ={425}= ={505}= ={723}= ={862}= ={869}= ={935}= >{49}< >{935}< [initial] [rendered] split chunk (cache group: defaultVendors) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + > ./a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + > ./b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + > ./c cccccccccccccccccccccccccccccc + ./node_modules/x.js X bytes [built] [code generated] + chunk (runtime: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb, main) name-too-long/723.js (id hint: vendors) X bytes <{792}> ={60}= ={63}= ={210}= ={263}= ={425}= ={505}= ={628}= ={935}= >{49}< >{935}< [initial] [rendered] split chunk (cache group: defaultVendors) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + > ./b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + ./node_modules/y.js X bytes [built] [code generated] + chunk (runtime: main) name-too-long/main.js (main) X bytes (javascript) X KiB (runtime) >{60}< >{210}< >{263}< >{425}< >{628}< >{723}< >{862}< >{869}< >{935}< [entry] [rendered] + > ./ main + runtime modules X KiB 9 modules + ./index.js X bytes [built] [code generated] + chunk (runtime: cccccccccccccccccccccccccccccc, main) name-too-long/862.js (id hint: vendors) X bytes <{792}> ={349}= ={425}= ={628}= ={869}= ={935}= [initial] [rendered] split chunk (cache group: defaultVendors) + > ./c ./index.js 3:0-47 + > ./c cccccccccccccccccccccccccccccc + ./node_modules/z.js X bytes [built] [code generated] + chunk (runtime: main) name-too-long/async-c.js (async-c) X bytes <{792}> ={425}= ={628}= ={862}= ={935}= [rendered] + > ./c ./index.js 3:0-47 + ./c.js X bytes [built] [code generated] + chunk (runtime: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb, cccccccccccccccccccccccccccccc, main) name-too-long/935.js X bytes <{210}> <{263}> <{425}> <{505}> <{628}> <{723}> <{792}> ={49}= ={60}= ={63}= ={349}= ={425}= ={628}= ={723}= ={862}= ={869}= [initial] [rendered] split chunk (cache group: default) + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + > ./g ./a.js 6:0-47 + > ./b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + > ./c cccccccccccccccccccccccccccccc + ./f.js X bytes [built] [code generated] + name-too-long (webpack x.x.x) compiled successfully + +custom-chunks-filter: + Entrypoint main X KiB = custom-chunks-filter/main.js + Entrypoint a X KiB = custom-chunks-filter/a.js + Entrypoint b X KiB = custom-chunks-filter/628.js X bytes custom-chunks-filter/723.js X bytes custom-chunks-filter/935.js X bytes custom-chunks-filter/425.js X bytes custom-chunks-filter/b.js X KiB + Entrypoint c X KiB = custom-chunks-filter/628.js X bytes custom-chunks-filter/862.js X bytes custom-chunks-filter/935.js X bytes custom-chunks-filter/425.js X bytes custom-chunks-filter/c.js X KiB + chunk (runtime: a, main) custom-chunks-filter/async-g.js (async-g) X bytes <{263}> <{425}> <{628}> <{723}> <{996}> ={935}= [rendered] + > ./g ./a.js 6:0-47 + ./g.js X bytes [built] [code generated] + chunk (runtime: main) custom-chunks-filter/async-b.js (async-b) X bytes <{792}> ={425}= ={628}= ={723}= ={935}= [rendered] + > ./b ./index.js 2:0-47 + ./b.js X bytes [built] [code generated] + chunk (runtime: b) custom-chunks-filter/b.js (b) X bytes (javascript) X KiB (runtime) ={425}= ={628}= ={723}= ={935}= [entry] [rendered] + > ./b b + runtime modules X KiB 4 modules + ./b.js X bytes [built] [code generated] + chunk (runtime: main) custom-chunks-filter/async-a.js (async-a) X bytes <{792}> ={425}= ={628}= ={723}= >{49}< >{935}< [rendered] + > ./a ./index.js 1:0-47 + ./a.js + 1 modules X bytes [built] [code generated] + chunk (runtime: c) custom-chunks-filter/c.js (c) X bytes (javascript) X KiB (runtime) ={425}= ={628}= ={862}= ={935}= [entry] [rendered] + > ./c c + runtime modules X KiB 4 modules + ./c.js X bytes [built] [code generated] + chunk (runtime: b, c, main) custom-chunks-filter/425.js X bytes <{792}> ={60}= ={199}= ={263}= ={390}= ={628}= ={723}= ={862}= ={869}= ={935}= >{49}< >{935}< [initial] [rendered] split chunk (cache group: default) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + > ./b b + > ./c c + ./d.js X bytes [built] [code generated] + chunk (runtime: b, c, main) custom-chunks-filter/628.js (id hint: vendors) X bytes <{792}> ={60}= ={199}= ={263}= ={390}= ={425}= ={723}= ={862}= ={869}= ={935}= >{49}< >{935}< [initial] [rendered] split chunk (cache group: defaultVendors) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + > ./b b + > ./c c + ./node_modules/x.js X bytes [built] [code generated] + chunk (runtime: b, main) custom-chunks-filter/723.js (id hint: vendors) X bytes <{792}> ={60}= ={199}= ={263}= ={425}= ={628}= ={935}= >{49}< >{935}< [initial] [rendered] split chunk (cache group: defaultVendors) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./b b + ./node_modules/y.js X bytes [built] [code generated] + chunk (runtime: main) custom-chunks-filter/main.js (main) X bytes (javascript) X KiB (runtime) >{60}< >{263}< >{425}< >{628}< >{723}< >{862}< >{869}< >{935}< [entry] [rendered] + > ./ main + runtime modules X KiB 9 modules + ./index.js X bytes [built] [code generated] + chunk (runtime: c, main) custom-chunks-filter/862.js (id hint: vendors) X bytes <{792}> ={390}= ={425}= ={628}= ={869}= ={935}= [initial] [rendered] split chunk (cache group: defaultVendors) + > ./c ./index.js 3:0-47 + > ./c c + ./node_modules/z.js X bytes [built] [code generated] + chunk (runtime: main) custom-chunks-filter/async-c.js (async-c) X bytes <{792}> ={425}= ={628}= ={862}= ={935}= [rendered] + > ./c ./index.js 3:0-47 + ./c.js X bytes [built] [code generated] + chunk (runtime: a, b, c, main) custom-chunks-filter/935.js X bytes <{263}> <{425}> <{628}> <{723}> <{792}> <{996}> ={49}= ={60}= ={199}= ={390}= ={425}= ={628}= ={723}= ={862}= ={869}= [initial] [rendered] split chunk (cache group: default) + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + > ./g ./a.js 6:0-47 + > ./b b + > ./c c + ./f.js X bytes [built] [code generated] + chunk (runtime: a) custom-chunks-filter/a.js (a) X bytes (javascript) X KiB (runtime) >{49}< >{935}< [entry] [rendered] + > ./a a + runtime modules X KiB 9 modules + dependent modules X bytes [dependent] 3 modules + ./a.js + 1 modules X bytes [built] [code generated] + custom-chunks-filter (webpack x.x.x) compiled successfully + +custom-chunks-filter-in-cache-groups: + Entrypoint main X KiB = custom-chunks-filter-in-cache-groups/main.js + Entrypoint a X KiB = custom-chunks-filter-in-cache-groups/765.js X bytes custom-chunks-filter-in-cache-groups/a.js X KiB + Entrypoint b X KiB = custom-chunks-filter-in-cache-groups/vendors.js X KiB custom-chunks-filter-in-cache-groups/b.js X KiB + Entrypoint c X KiB = custom-chunks-filter-in-cache-groups/vendors.js X KiB custom-chunks-filter-in-cache-groups/c.js X KiB + chunk (runtime: a, main) custom-chunks-filter-in-cache-groups/async-g.js (async-g) X bytes <{96}> <{263}> <{765}> <{996}> [rendered] + > ./g ./a.js 6:0-47 + dependent modules X bytes [dependent] 1 module + ./g.js X bytes [built] [code generated] + chunk (runtime: main) custom-chunks-filter-in-cache-groups/async-b.js (async-b) X bytes <{792}> ={96}= [rendered] + > ./b ./index.js 2:0-47 + dependent modules X bytes [dependent] 2 modules + ./b.js X bytes [built] [code generated] + chunk (runtime: b, c, main) custom-chunks-filter-in-cache-groups/vendors.js (vendors) (id hint: vendors) X bytes <{792}> ={60}= ={199}= ={263}= ={390}= ={869}= >{49}< [initial] [rendered] split chunk (cache group: vendors) (name: vendors) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + > ./b b + > x b + > y b + > z b + > ./c c + > x c + > y c + > z c + ./node_modules/x.js X bytes [built] [code generated] + ./node_modules/y.js X bytes [built] [code generated] + ./node_modules/z.js X bytes [built] [code generated] + chunk (runtime: b) custom-chunks-filter-in-cache-groups/b.js (b) X bytes (javascript) X KiB (runtime) ={96}= [entry] [rendered] + > ./b b + > x b + > y b + > z b + runtime modules X KiB 4 modules + dependent modules X bytes [dependent] 2 modules + ./b.js X bytes [built] [code generated] + chunk (runtime: main) custom-chunks-filter-in-cache-groups/async-a.js (async-a) X bytes <{792}> ={96}= >{49}< [rendered] + > ./a ./index.js 1:0-47 + dependent modules X bytes [dependent] 1 module + ./a.js + 1 modules X bytes [built] [code generated] + chunk (runtime: c) custom-chunks-filter-in-cache-groups/c.js (c) X bytes (javascript) X KiB (runtime) ={96}= [entry] [rendered] + > ./c c + > x c + > y c + > z c + runtime modules X KiB 4 modules + dependent modules X bytes [dependent] 2 modules + ./c.js X bytes [built] [code generated] + chunk (runtime: a) custom-chunks-filter-in-cache-groups/765.js (id hint: vendors) X bytes ={996}= >{49}< [initial] [rendered] split chunk (cache group: defaultVendors) + > ./a a + > x a + > y a + > z a + ./node_modules/x.js X bytes [built] [code generated] + ./node_modules/y.js X bytes [built] [code generated] + ./node_modules/z.js X bytes [built] [code generated] + chunk (runtime: main) custom-chunks-filter-in-cache-groups/main.js (main) X bytes (javascript) X KiB (runtime) >{60}< >{96}< >{263}< >{869}< [entry] [rendered] + > ./ main + runtime modules X KiB 9 modules + ./index.js X bytes [built] [code generated] + chunk (runtime: main) custom-chunks-filter-in-cache-groups/async-c.js (async-c) X bytes <{792}> ={96}= [rendered] + > ./c ./index.js 3:0-47 + dependent modules X bytes [dependent] 2 modules + ./c.js X bytes [built] [code generated] + chunk (runtime: a) custom-chunks-filter-in-cache-groups/a.js (a) X bytes (javascript) X KiB (runtime) ={765}= >{49}< [entry] [rendered] + > ./a a + > x a + > y a + > z a + runtime modules X KiB 10 modules + dependent modules X bytes [dependent] 1 module + ./a.js + 1 modules X bytes [built] [code generated] + custom-chunks-filter-in-cache-groups (webpack x.x.x) compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for split-chunks-automatic-name 1`] = ` +"Entrypoint main X KiB = main.js +chunk (runtime: main) async-a.js (async-a) X bytes <{main}> ={common-d_js}= ={common-node_modules_x_js}= ={common-node_modules_y_js}= [rendered] + > ./a ./index.js 1:0-47 + ./a.js + 1 modules X bytes [built] [code generated] +chunk (runtime: main) async-b.js (async-b) X bytes <{main}> ={common-d_js}= ={common-f_js}= ={common-node_modules_x_js}= ={common-node_modules_y_js}= [rendered] + > ./b ./index.js 2:0-47 + ./b.js X bytes [built] [code generated] +chunk (runtime: main) async-c.js (async-c) X bytes <{main}> ={common-d_js}= ={common-f_js}= ={common-node_modules_x_js}= ={common-node_modules_z_js}= [rendered] + > ./c ./index.js 3:0-47 + ./c.js X bytes [built] [code generated] +chunk (runtime: main) common-d_js.js (id hint: common) X bytes <{main}> ={async-a}= ={async-b}= ={async-c}= ={common-f_js}= ={common-node_modules_x_js}= ={common-node_modules_y_js}= ={common-node_modules_z_js}= [rendered] split chunk (cache group: a) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + ./d.js X bytes [built] [code generated] +chunk (runtime: main) common-f_js.js (id hint: common) X bytes <{main}> ={async-b}= ={async-c}= ={common-d_js}= ={common-node_modules_x_js}= ={common-node_modules_y_js}= ={common-node_modules_z_js}= [rendered] split chunk (cache group: a) + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + ./f.js X bytes [built] [code generated] +chunk (runtime: main) common-node_modules_x_js.js (id hint: common) X bytes <{main}> ={async-a}= ={async-b}= ={async-c}= ={common-d_js}= ={common-f_js}= ={common-node_modules_y_js}= ={common-node_modules_z_js}= [rendered] split chunk (cache group: b) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + ./node_modules/x.js X bytes [built] [code generated] +chunk (runtime: main) common-node_modules_y_js.js (id hint: common) X bytes <{main}> ={async-a}= ={async-b}= ={common-d_js}= ={common-f_js}= ={common-node_modules_x_js}= [rendered] split chunk (cache group: b) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + ./node_modules/y.js X bytes [built] [code generated] +chunk (runtime: main) common-node_modules_z_js.js (id hint: common) X bytes <{main}> ={async-c}= ={common-d_js}= ={common-f_js}= ={common-node_modules_x_js}= [rendered] split chunk (cache group: b) + > ./c ./index.js 3:0-47 + ./node_modules/z.js X bytes [built] [code generated] +chunk (runtime: main) main.js (main) X bytes (javascript) X KiB (runtime) >{async-a}< >{async-b}< >{async-c}< >{common-d_js}< >{common-f_js}< >{common-node_modules_x_js}< >{common-node_modules_y_js}< >{common-node_modules_z_js}< [entry] [rendered] + > ./ main + runtime modules X KiB 9 modules + ./index.js X bytes [built] [code generated] +production (webpack x.x.x) compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for split-chunks-cache-group-filename 1`] = ` +"Entrypoint main X KiB = 587.vendors.js X bytes 414.vendors.js X bytes 605.vendors.js X bytes main.js X KiB +chunk (runtime: main) 414.vendors.js (id hint: vendors) X bytes [initial] [rendered] split chunk (cache group: vendors) + ./node_modules/b.js X bytes [built] [code generated] +chunk (runtime: main) 587.vendors.js (id hint: vendors) X bytes [initial] [rendered] split chunk (cache group: vendors) + ./node_modules/a.js X bytes [built] [code generated] +chunk (runtime: main) 605.vendors.js (id hint: vendors) X bytes [initial] [rendered] split chunk (cache group: vendors) + ./node_modules/c.js X bytes [built] [code generated] +chunk (runtime: main) main.js (main) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 4 modules + ./index.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for split-chunks-chunk-name 1`] = ` +"Entrypoint main X KiB = default/main.js +chunk (runtime: main) default/async-b.js (async-b) (id hint: vendors) X bytes <{792}> [rendered] reused as split chunk (cache group: defaultVendors) + > b ./index.js 2:0-45 + ./node_modules/b.js X bytes [built] [code generated] +chunk (runtime: main) default/async-a.js (async-a) X bytes <{792}> [rendered] + > a ./index.js 1:0-45 + ./node_modules/a.js X bytes [built] [code generated] +chunk (runtime: main) default/async-c-1.js (async-c-1) (id hint: vendors) X bytes <{792}> [rendered] reused as split chunk (cache group: defaultVendors) + > c ./index.js 3:0-47 + > c ./index.js 4:0-47 + ./node_modules/c.js X bytes [built] [code generated] +chunk (runtime: main) default/main.js (main) X bytes (javascript) X KiB (runtime) >{60}< >{263}< >{511}< [entry] [rendered] + > ./ main + runtime modules X KiB 9 modules + ./index.js X bytes [built] [code generated] +webpack x.x.x compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for split-chunks-combinations 1`] = ` +"Entrypoint main X KiB = main.js +chunk (runtime: main) async-g.js (async-g) X bytes <{792}> [rendered] + > ./g ./index.js 7:0-47 + dependent modules X bytes [dependent] 1 module + ./g.js X bytes [built] [code generated] +chunk (runtime: main) async-b.js (async-b) X bytes <{792}> ={914}= [rendered] + > ./b ./index.js 2:0-47 + ./b.js X bytes [built] [code generated] +chunk (runtime: main) async-f.js (async-f) X bytes <{792}> [rendered] + > ./f ./index.js 6:0-47 + dependent modules X bytes [dependent] 1 module + ./f.js X bytes [built] [code generated] +chunk (runtime: main) async-e.js (async-e) X bytes <{792}> [rendered] + > ./e ./index.js 5:0-47 + dependent modules X bytes [dependent] 1 module + ./e.js X bytes [built] [code generated] +chunk (runtime: main) async-a.js (async-a) X bytes <{792}> ={914}= [rendered] + > ./a ./index.js 1:0-47 + ./a.js X bytes [built] [code generated] +chunk (runtime: main) async-d.js (async-d) X bytes <{792}> [rendered] + > ./d ./index.js 4:0-47 + dependent modules X bytes [dependent] 1 module + ./d.js X bytes [built] [code generated] +chunk (runtime: main) main.js (main) X bytes (javascript) X KiB (runtime) >{49}< >{60}< >{240}< >{251}< >{263}< >{442}< >{869}< >{914}< [entry] [rendered] + > ./ main + runtime modules X KiB 9 modules + ./index.js X bytes [built] [code generated] +chunk (runtime: main) async-c.js (async-c) X bytes <{792}> [rendered] + > ./c ./index.js 3:0-47 + dependent modules X bytes [dependent] 1 module + ./c.js X bytes [built] [code generated] +chunk (runtime: main) 914.js X bytes <{792}> ={60}= ={263}= [rendered] split chunk (cache group: default) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + ./x.js X bytes [built] [code generated] + ./y.js X bytes [built] [code generated] +webpack x.x.x compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for split-chunks-dedup 1`] = ` +"asset main.js X KiB [emitted] (name: main) (id hint: main) +asset table-643--shared.js X bytes [emitted] +asset row-359--shared.js X bytes [emitted] +asset cell-221--shared.js X bytes [emitted] +asset templater-743--shared.js X bytes [emitted] +runtime modules X KiB 11 modules +built modules X bytes (javascript) X bytes (share-init) X bytes (consume-shared) [built] + cacheable modules X bytes + modules by path ./node_modules/ X bytes 4 modules + modules by path ./*.js X bytes 2 modules + provide-module modules X bytes + provide shared module (default) cell@1.0.0 = ./node_modules/cell/index.js X bytes [built] [code generated] + provide shared module (default) row@1.0.0 = ./node_modules/row/index.js X bytes [built] [code generated] + + 2 modules + consume-shared-module modules X bytes + consume shared module (default) table@=1.0.0 (strict) (fallback: ./node_modules/...(truncated) X bytes [built] [code generated] + consume shared module (default) row@=1.0.0 (strict) (fallback: ./node_modules...(truncated) X bytes [built] [code generated] + consume shared module (default) templater@=1.0.0 (strict) (fallback: ./node_modu...(truncated) X bytes [built] [code generated] + consume shared module (default) cell@=1.0.0 (strict) (fallback: ./node_modules/...(truncated) X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for split-chunks-issue-6413 1`] = ` +"Entrypoint main X KiB = main.js +chunk (runtime: main) async-b.js (async-b) X bytes <{792}> ={476}= ={628}= [rendered] + > ./b ./index.js 2:0-47 + ./b.js X bytes [built] [code generated] +chunk (runtime: main) async-a.js (async-a) X bytes <{792}> ={476}= ={628}= [rendered] + > ./a ./index.js 1:0-47 + ./a.js X bytes [built] [code generated] +chunk (runtime: main) 476.js X bytes <{792}> ={60}= ={263}= ={628}= ={869}= [rendered] split chunk (cache group: default) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + ./common.js X bytes [built] [code generated] +chunk (runtime: main) 628.js (id hint: vendors) X bytes <{792}> ={60}= ={263}= ={476}= ={869}= [rendered] split chunk (cache group: defaultVendors) + > ./a ./index.js 1:0-47 + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + ./node_modules/x.js X bytes [built] [code generated] +chunk (runtime: main) main.js (main) X bytes (javascript) X KiB (runtime) >{60}< >{263}< >{476}< >{628}< >{869}< [entry] [rendered] + > ./ main + runtime modules X KiB 9 modules + ./index.js X bytes [built] [code generated] +chunk (runtime: main) async-c.js (async-c) X bytes <{792}> ={476}= ={628}= [rendered] + > ./c ./index.js 3:0-47 + ./c.js X bytes [built] [code generated] +default (webpack x.x.x) compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for split-chunks-issue-6696 1`] = ` +"Entrypoint main X KiB = vendors.js X bytes main.js X KiB +chunk (runtime: main) async-b.js (async-b) X bytes <{96}> <{792}> [rendered] + > ./b ./index.js 3:0-47 + dependent modules X bytes [dependent] 1 module + ./b.js X bytes [built] [code generated] +chunk (runtime: main) vendors.js (vendors) (id hint: vendors) X bytes ={792}= >{60}< >{263}< [initial] [rendered] split chunk (cache group: vendors) (name: vendors) + > ./ main + ./node_modules/y.js X bytes [built] [code generated] +chunk (runtime: main) async-a.js (async-a) X bytes <{96}> <{792}> [rendered] + > ./a ./index.js 2:0-47 + dependent modules X bytes [dependent] 1 module + ./a.js X bytes [built] [code generated] +chunk (runtime: main) main.js (main) X bytes (javascript) X KiB (runtime) ={96}= >{60}< >{263}< [entry] [rendered] + > ./ main + runtime modules X KiB 10 modules + ./index.js X bytes [built] [code generated] +default (webpack x.x.x) compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for split-chunks-issue-7401 1`] = ` +"Entrypoint a X KiB = 628.js X bytes a.js X KiB +Entrypoint b X KiB = b.js +Chunk Group c X bytes = 628.js X bytes c.js X bytes +chunk (runtime: b) b.js (b) X bytes (javascript) X KiB (runtime) >{390}< >{628}< [entry] [rendered] + > ./b b + runtime modules X KiB 9 modules + ./b.js X bytes [built] [code generated] +chunk (runtime: b) c.js (c) X bytes <{199}> ={628}= [rendered] + > ./c ./b.js 1:0-41 + ./c.js X bytes [built] [code generated] +chunk (runtime: a, b) 628.js (id hint: vendors) X bytes <{199}> ={390}= ={996}= [initial] [rendered] split chunk (cache group: defaultVendors) + > ./c ./b.js 1:0-41 + > ./a a + ./node_modules/x.js X bytes [built] [code generated] +chunk (runtime: a) a.js (a) X bytes (javascript) X KiB (runtime) ={628}= [entry] [rendered] + > ./a a + runtime modules X KiB 4 modules + ./a.js X bytes [built] [code generated] +default (webpack x.x.x) compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for split-chunks-keep-remaining-size 1`] = ` +"Entrypoint main X KiB = default/main.js +chunk (runtime: main) default/async-b.js (async-b) X bytes <{792}> ={784}= [rendered] + > ./b ./index.js 2:0-47 + ./b.js X bytes [built] [code generated] +chunk (runtime: main) default/async-a.js (async-a) X bytes <{792}> [rendered] + > ./a ./index.js 1:0-47 + ./a.js + 1 modules X bytes [built] [code generated] +chunk (runtime: main) default/async-d.js (async-d) X bytes <{792}> ={670}= [rendered] + > ./d ./index.js 4:0-47 + ./d.js X bytes [built] [code generated] +chunk (runtime: main) default/670.js (id hint: vendors) X bytes <{792}> ={442}= [rendered] split chunk (cache group: defaultVendors) + > ./d ./index.js 4:0-47 + ./node_modules/shared.js?3 X bytes [built] [code generated] + ./node_modules/shared.js?4 X bytes [built] [code generated] +chunk (runtime: main) default/784.js (id hint: vendors) X bytes <{792}> ={60}= ={869}= [rendered] split chunk (cache group: defaultVendors) + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + ./node_modules/shared.js?2 X bytes [built] [code generated] +chunk (runtime: main) default/main.js (main) X bytes (javascript) X KiB (runtime) >{60}< >{263}< >{442}< >{670}< >{784}< >{869}< [entry] [rendered] + > ./ main + runtime modules X KiB 9 modules + ./index.js X bytes [built] [code generated] +chunk (runtime: main) default/async-c.js (async-c) X bytes <{792}> ={784}= [rendered] + > ./c ./index.js 3:0-47 + ./c.js X bytes [built] [code generated] +webpack x.x.x compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for split-chunks-max-size 1`] = ` +"production: + Entrypoint main X KiB = 13 assets + chunk (runtime: main) prod-main-XXXXXXXX.js (main-6bb16544) X KiB ={59}= ={121}= ={124}= ={161}= ={181}= ={241}= ={273}= ={382}= ={409}= ={808}= ={942}= ={945}= [initial] [rendered] + > ./ main + ./in-some-directory/very-big.js?1 X KiB [built] [code generated] + chunk (runtime: main) prod-main-XXXXXXXX.js (main-1df31ce3) X KiB ={37}= ={121}= ={124}= ={161}= ={181}= ={241}= ={273}= ={382}= ={409}= ={808}= ={942}= ={945}= [initial] [rendered] + > ./ main + ./index.js X KiB [built] [code generated] + chunk (runtime: main) prod-main-XXXXXXXX.js (main-10f51d07) X bytes ={37}= ={59}= ={124}= ={161}= ={181}= ={241}= ={273}= ={382}= ={409}= ={808}= ={942}= ={945}= [initial] [rendered] + > ./ main + ./big.js?1 X bytes [built] [code generated] + ./big.js?2 X bytes [built] [code generated] + chunk (runtime: main) prod-main-XXXXXXXX.js (main-12217e1d) X KiB (javascript) X KiB (runtime) ={37}= ={59}= ={121}= ={161}= ={181}= ={241}= ={273}= ={382}= ={409}= ={808}= ={942}= ={945}= [entry] [rendered] + > ./ main + runtime modules X KiB 5 modules + ./very-big.js?1 X KiB [built] [code generated] + chunk (runtime: main) prod-main-XXXXXXXX.js (main-77a8c116) X KiB ={37}= ={59}= ={121}= ={124}= ={181}= ={241}= ={273}= ={382}= ={409}= ={808}= ={942}= ={945}= [initial] [rendered] + > ./ main + ./very-big.js?2 X KiB [built] [code generated] + chunk (runtime: main) prod-main-XXXXXXXX.js (main-e7c5ace7) X bytes ={37}= ={59}= ={121}= ={124}= ={161}= ={241}= ={273}= ={382}= ={409}= ={808}= ={942}= ={945}= [initial] [rendered] + > ./ main + ./small.js?1 X bytes [built] [code generated] + ./small.js?2 X bytes [built] [code generated] + ./small.js?3 X bytes [built] [code generated] + ./small.js?4 X bytes [built] [code generated] + ./small.js?5 X bytes [built] [code generated] + ./small.js?6 X bytes [built] [code generated] + ./small.js?7 X bytes [built] [code generated] + ./small.js?8 X bytes [built] [code generated] + ./small.js?9 X bytes [built] [code generated] + chunk (runtime: main) prod-241.js (id hint: vendors) X bytes ={37}= ={59}= ={121}= ={124}= ={161}= ={181}= ={273}= ={382}= ={409}= ={808}= ={942}= ={945}= [initial] [rendered] split chunk (cache group: defaultVendors) + > ./ main + ./node_modules/big.js?1 X bytes [built] [code generated] + ./node_modules/small.js?1 X bytes [built] [code generated] + ./node_modules/small.js?2 X bytes [built] [code generated] + chunk (runtime: main) prod-273.js (id hint: vendors) X KiB ={37}= ={59}= ={121}= ={124}= ={161}= ={181}= ={241}= ={382}= ={409}= ={808}= ={942}= ={945}= [initial] [rendered] split chunk (cache group: defaultVendors) + > ./ main + ./node_modules/very-big.js?1 X KiB [built] [code generated] + chunk (runtime: main) prod-main-XXXXXXXX.js (main-5cfff2c6) X bytes ={37}= ={59}= ={121}= ={124}= ={161}= ={181}= ={241}= ={273}= ={409}= ={808}= ={942}= ={945}= [initial] [rendered] + > ./ main + ./subfolder/big.js?1 X bytes [built] [code generated] + ./subfolder/big.js?2 X bytes [built] [code generated] + chunk (runtime: main) prod-main-XXXXXXXX.js (main-3c98d7c3) X bytes ={37}= ={59}= ={121}= ={124}= ={161}= ={181}= ={241}= ={273}= ={382}= ={808}= ={942}= ={945}= [initial] [rendered] + > ./ main + ./in-some-directory/big.js?1 X bytes [built] [code generated] + ./in-some-directory/small.js?1 X bytes [built] [code generated] + ./in-some-directory/small.js?2 X bytes [built] [code generated] + ./in-some-directory/small.js?3 X bytes [built] [code generated] + ./in-some-directory/small.js?4 X bytes [built] [code generated] + chunk (runtime: main) prod-main-XXXXXXXX.js (main-2f7dcf2e) X bytes ={37}= ={59}= ={121}= ={124}= ={161}= ={181}= ={241}= ={273}= ={382}= ={409}= ={942}= ={945}= [initial] [rendered] + > ./ main + ./inner-module/small.js?1 X bytes [built] [code generated] + ./inner-module/small.js?2 X bytes [built] [code generated] + ./inner-module/small.js?3 X bytes [built] [code generated] + ./inner-module/small.js?4 X bytes [built] [code generated] + ./inner-module/small.js?5 X bytes [built] [code generated] + ./inner-module/small.js?6 X bytes [built] [code generated] + ./inner-module/small.js?7 X bytes [built] [code generated] + ./inner-module/small.js?8 X bytes [built] [code generated] + ./inner-module/small.js?9 X bytes [built] [code generated] + chunk (runtime: main) prod-main-XXXXXXXX.js (main-1443e336) X bytes ={37}= ={59}= ={121}= ={124}= ={161}= ={181}= ={241}= ={273}= ={382}= ={409}= ={808}= ={945}= [initial] [rendered] + > ./ main + ./subfolder/small.js?1 X bytes [built] [code generated] + ./subfolder/small.js?2 X bytes [built] [code generated] + ./subfolder/small.js?3 X bytes [built] [code generated] + ./subfolder/small.js?4 X bytes [built] [code generated] + ./subfolder/small.js?5 X bytes [built] [code generated] + ./subfolder/small.js?6 X bytes [built] [code generated] + ./subfolder/small.js?7 X bytes [built] [code generated] + ./subfolder/small.js?8 X bytes [built] [code generated] + ./subfolder/small.js?9 X bytes [built] [code generated] + chunk (runtime: main) prod-main-XXXXXXXX.js (main-89a43a0f) X KiB ={37}= ={59}= ={121}= ={124}= ={161}= ={181}= ={241}= ={273}= ={382}= ={409}= ={808}= ={942}= [initial] [rendered] + > ./ main + ./very-big.js?3 X KiB [built] [code generated] + production (webpack x.x.x) compiled successfully + +development: + Entrypoint main X KiB = 13 assets + chunk (runtime: main) dev-main-big_js-1.js (main-big_js-1) X bytes ={main-in-some-directory_b}= ={main-in-some-directory_very-big_js-8d76cf03}= ={main-index_js-41f5a26e}= ={main-inner-module_small_js-3}= ={main-small_js-1}= ={main-subfolder_big_js-b}= ={main-subfolder_small_js-1}= ={main-very-big_js-08cf55cf}= ={main-very-big_js-4647fb9d}= ={main-very-big_js-62f7f644}= ={vendors-node_modules_big_js_1-node_modules_small_js_1-node_modules_small_js_2}= ={vendors-node_modules_very-big_js_1}= [initial] [rendered] + > ./ main + ./big.js?1 X bytes [built] [code generated] + ./big.js?2 X bytes [built] [code generated] + chunk (runtime: main) dev-main-in-some-directory_b.js (main-in-some-directory_b) X bytes ={main-big_js-1}= ={main-in-some-directory_very-big_js-8d76cf03}= ={main-index_js-41f5a26e}= ={main-inner-module_small_js-3}= ={main-small_js-1}= ={main-subfolder_big_js-b}= ={main-subfolder_small_js-1}= ={main-very-big_js-08cf55cf}= ={main-very-big_js-4647fb9d}= ={main-very-big_js-62f7f644}= ={vendors-node_modules_big_js_1-node_modules_small_js_1-node_modules_small_js_2}= ={vendors-node_modules_very-big_js_1}= [initial] [rendered] + > ./ main + ./in-some-directory/big.js?1 X bytes [built] [code generated] + ./in-some-directory/small.js?1 X bytes [built] [code generated] + ./in-some-directory/small.js?2 X bytes [built] [code generated] + ./in-some-directory/small.js?3 X bytes [built] [code generated] + ./in-some-directory/small.js?4 X bytes [built] [code generated] + chunk (runtime: main) dev-main-in-some-directory_very-big_js-XXXXXXXX.js (main-in-some-directory_very-big_js-8d76cf03) X KiB ={main-big_js-1}= ={main-in-some-directory_b}= ={main-index_js-41f5a26e}= ={main-inner-module_small_js-3}= ={main-small_js-1}= ={main-subfolder_big_js-b}= ={main-subfolder_small_js-1}= ={main-very-big_js-08cf55cf}= ={main-very-big_js-4647fb9d}= ={main-very-big_js-62f7f644}= ={vendors-node_modules_big_js_1-node_modules_small_js_1-node_modules_small_js_2}= ={vendors-node_modules_very-big_js_1}= [initial] [rendered] + > ./ main + ./in-some-directory/very-big.js?1 X KiB [built] [code generated] + chunk (runtime: main) dev-main-index_js-XXXXXXXX.js (main-index_js-41f5a26e) X KiB ={main-big_js-1}= ={main-in-some-directory_b}= ={main-in-some-directory_very-big_js-8d76cf03}= ={main-inner-module_small_js-3}= ={main-small_js-1}= ={main-subfolder_big_js-b}= ={main-subfolder_small_js-1}= ={main-very-big_js-08cf55cf}= ={main-very-big_js-4647fb9d}= ={main-very-big_js-62f7f644}= ={vendors-node_modules_big_js_1-node_modules_small_js_1-node_modules_small_js_2}= ={vendors-node_modules_very-big_js_1}= [initial] [rendered] + > ./ main + ./index.js X KiB [built] [code generated] + chunk (runtime: main) dev-main-inner-module_small_js-3.js (main-inner-module_small_js-3) X bytes ={main-big_js-1}= ={main-in-some-directory_b}= ={main-in-some-directory_very-big_js-8d76cf03}= ={main-index_js-41f5a26e}= ={main-small_js-1}= ={main-subfolder_big_js-b}= ={main-subfolder_small_js-1}= ={main-very-big_js-08cf55cf}= ={main-very-big_js-4647fb9d}= ={main-very-big_js-62f7f644}= ={vendors-node_modules_big_js_1-node_modules_small_js_1-node_modules_small_js_2}= ={vendors-node_modules_very-big_js_1}= [initial] [rendered] + > ./ main + ./inner-module/small.js?1 X bytes [built] [code generated] + ./inner-module/small.js?2 X bytes [built] [code generated] + ./inner-module/small.js?3 X bytes [built] [code generated] + ./inner-module/small.js?4 X bytes [built] [code generated] + ./inner-module/small.js?5 X bytes [built] [code generated] + ./inner-module/small.js?6 X bytes [built] [code generated] + ./inner-module/small.js?7 X bytes [built] [code generated] + ./inner-module/small.js?8 X bytes [built] [code generated] + ./inner-module/small.js?9 X bytes [built] [code generated] + chunk (runtime: main) dev-main-small_js-1.js (main-small_js-1) X bytes ={main-big_js-1}= ={main-in-some-directory_b}= ={main-in-some-directory_very-big_js-8d76cf03}= ={main-index_js-41f5a26e}= ={main-inner-module_small_js-3}= ={main-subfolder_big_js-b}= ={main-subfolder_small_js-1}= ={main-very-big_js-08cf55cf}= ={main-very-big_js-4647fb9d}= ={main-very-big_js-62f7f644}= ={vendors-node_modules_big_js_1-node_modules_small_js_1-node_modules_small_js_2}= ={vendors-node_modules_very-big_js_1}= [initial] [rendered] + > ./ main + ./small.js?1 X bytes [built] [code generated] + ./small.js?2 X bytes [built] [code generated] + ./small.js?3 X bytes [built] [code generated] + ./small.js?4 X bytes [built] [code generated] + ./small.js?5 X bytes [built] [code generated] + ./small.js?6 X bytes [built] [code generated] + ./small.js?7 X bytes [built] [code generated] + ./small.js?8 X bytes [built] [code generated] + ./small.js?9 X bytes [built] [code generated] + chunk (runtime: main) dev-main-subfolder_big_js-b.js (main-subfolder_big_js-b) X bytes ={main-big_js-1}= ={main-in-some-directory_b}= ={main-in-some-directory_very-big_js-8d76cf03}= ={main-index_js-41f5a26e}= ={main-inner-module_small_js-3}= ={main-small_js-1}= ={main-subfolder_small_js-1}= ={main-very-big_js-08cf55cf}= ={main-very-big_js-4647fb9d}= ={main-very-big_js-62f7f644}= ={vendors-node_modules_big_js_1-node_modules_small_js_1-node_modules_small_js_2}= ={vendors-node_modules_very-big_js_1}= [initial] [rendered] + > ./ main + ./subfolder/big.js?1 X bytes [built] [code generated] + ./subfolder/big.js?2 X bytes [built] [code generated] + chunk (runtime: main) dev-main-subfolder_small_js-1.js (main-subfolder_small_js-1) X bytes ={main-big_js-1}= ={main-in-some-directory_b}= ={main-in-some-directory_very-big_js-8d76cf03}= ={main-index_js-41f5a26e}= ={main-inner-module_small_js-3}= ={main-small_js-1}= ={main-subfolder_big_js-b}= ={main-very-big_js-08cf55cf}= ={main-very-big_js-4647fb9d}= ={main-very-big_js-62f7f644}= ={vendors-node_modules_big_js_1-node_modules_small_js_1-node_modules_small_js_2}= ={vendors-node_modules_very-big_js_1}= [initial] [rendered] + > ./ main + ./subfolder/small.js?1 X bytes [built] [code generated] + ./subfolder/small.js?2 X bytes [built] [code generated] + ./subfolder/small.js?3 X bytes [built] [code generated] + ./subfolder/small.js?4 X bytes [built] [code generated] + ./subfolder/small.js?5 X bytes [built] [code generated] + ./subfolder/small.js?6 X bytes [built] [code generated] + ./subfolder/small.js?7 X bytes [built] [code generated] + ./subfolder/small.js?8 X bytes [built] [code generated] + ./subfolder/small.js?9 X bytes [built] [code generated] + chunk (runtime: main) dev-main-very-big_js-XXXXXXXX.js (main-very-big_js-08cf55cf) X KiB ={main-big_js-1}= ={main-in-some-directory_b}= ={main-in-some-directory_very-big_js-8d76cf03}= ={main-index_js-41f5a26e}= ={main-inner-module_small_js-3}= ={main-small_js-1}= ={main-subfolder_big_js-b}= ={main-subfolder_small_js-1}= ={main-very-big_js-4647fb9d}= ={main-very-big_js-62f7f644}= ={vendors-node_modules_big_js_1-node_modules_small_js_1-node_modules_small_js_2}= ={vendors-node_modules_very-big_js_1}= [initial] [rendered] + > ./ main + ./very-big.js?2 X KiB [built] [code generated] + chunk (runtime: main) dev-main-very-big_js-XXXXXXXX.js (main-very-big_js-4647fb9d) X KiB ={main-big_js-1}= ={main-in-some-directory_b}= ={main-in-some-directory_very-big_js-8d76cf03}= ={main-index_js-41f5a26e}= ={main-inner-module_small_js-3}= ={main-small_js-1}= ={main-subfolder_big_js-b}= ={main-subfolder_small_js-1}= ={main-very-big_js-08cf55cf}= ={main-very-big_js-62f7f644}= ={vendors-node_modules_big_js_1-node_modules_small_js_1-node_modules_small_js_2}= ={vendors-node_modules_very-big_js_1}= [initial] [rendered] + > ./ main + ./very-big.js?3 X KiB [built] [code generated] + chunk (runtime: main) dev-main-very-big_js-XXXXXXXX.js (main-very-big_js-62f7f644) X KiB (javascript) X KiB (runtime) ={main-big_js-1}= ={main-in-some-directory_b}= ={main-in-some-directory_very-big_js-8d76cf03}= ={main-index_js-41f5a26e}= ={main-inner-module_small_js-3}= ={main-small_js-1}= ={main-subfolder_big_js-b}= ={main-subfolder_small_js-1}= ={main-very-big_js-08cf55cf}= ={main-very-big_js-4647fb9d}= ={vendors-node_modules_big_js_1-node_modules_small_js_1-node_modules_small_js_2}= ={vendors-node_modules_very-big_js_1}= [entry] [rendered] + > ./ main + runtime modules X KiB 6 modules + ./very-big.js?1 X KiB [built] [code generated] + chunk (runtime: main) dev-vendors-node_modules_big_js_1-node_modules_small_js_1-node_modules_small_js_2.js (id hint: vendors) X bytes ={main-big_js-1}= ={main-in-some-directory_b}= ={main-in-some-directory_very-big_js-8d76cf03}= ={main-index_js-41f5a26e}= ={main-inner-module_small_js-3}= ={main-small_js-1}= ={main-subfolder_big_js-b}= ={main-subfolder_small_js-1}= ={main-very-big_js-08cf55cf}= ={main-very-big_js-4647fb9d}= ={main-very-big_js-62f7f644}= ={vendors-node_modules_very-big_js_1}= [initial] [rendered] split chunk (cache group: defaultVendors) + > ./ main + ./node_modules/big.js?1 X bytes [built] [code generated] + ./node_modules/small.js?1 X bytes [built] [code generated] + ./node_modules/small.js?2 X bytes [built] [code generated] + chunk (runtime: main) dev-vendors-node_modules_very-big_js_1.js (id hint: vendors) X KiB ={main-big_js-1}= ={main-in-some-directory_b}= ={main-in-some-directory_very-big_js-8d76cf03}= ={main-index_js-41f5a26e}= ={main-inner-module_small_js-3}= ={main-small_js-1}= ={main-subfolder_big_js-b}= ={main-subfolder_small_js-1}= ={main-very-big_js-08cf55cf}= ={main-very-big_js-4647fb9d}= ={main-very-big_js-62f7f644}= ={vendors-node_modules_big_js_1-node_modules_small_js_1-node_modules_small_js_2}= [initial] [rendered] split chunk (cache group: defaultVendors) + > ./ main + ./node_modules/very-big.js?1 X KiB [built] [code generated] + development (webpack x.x.x) compiled successfully + +switched: + Entrypoint main X KiB = 9 assets + chunk (runtime: main) switched-main-XXXXXXXX.js (main-6bb16544) X KiB ={59}= ={124}= ={161}= ={210}= ={241}= ={273}= ={866}= ={945}= [initial] [rendered] + > ./ main + ./in-some-directory/very-big.js?1 X KiB [built] [code generated] + chunk (runtime: main) switched-main-XXXXXXXX.js (main-1df31ce3) X KiB ={37}= ={124}= ={161}= ={210}= ={241}= ={273}= ={866}= ={945}= [initial] [rendered] + > ./ main + ./index.js X KiB [built] [code generated] + chunk (runtime: main) switched-main-XXXXXXXX.js (main-12217e1d) X KiB (javascript) X KiB (runtime) ={37}= ={59}= ={161}= ={210}= ={241}= ={273}= ={866}= ={945}= [entry] [rendered] + > ./ main + runtime modules X KiB 5 modules + ./very-big.js?1 X KiB [built] [code generated] + chunk (runtime: main) switched-main-XXXXXXXX.js (main-77a8c116) X KiB ={37}= ={59}= ={124}= ={210}= ={241}= ={273}= ={866}= ={945}= [initial] [rendered] + > ./ main + ./very-big.js?2 X KiB [built] [code generated] + chunk (runtime: main) switched-main-XXXXXXXX.js (main-7aeafcb2) X KiB ={37}= ={59}= ={124}= ={161}= ={241}= ={273}= ={866}= ={945}= [initial] [rendered] + > ./ main + modules by path ./inner-module/*.js X bytes + ./inner-module/small.js?1 X bytes [built] [code generated] + + 8 modules + modules by path ./in-some-directory/*.js X bytes + ./in-some-directory/big.js?1 X bytes [built] [code generated] + ./in-some-directory/small.js?1 X bytes [built] [code generated] + + 3 modules + modules by path ./*.js X bytes + ./big.js?1 X bytes [built] [code generated] + ./big.js?2 X bytes [built] [code generated] + chunk (runtime: main) switchXX-XXX.js (id hint: vendors) X bytes ={37}= ={59}= ={124}= ={161}= ={210}= ={273}= ={866}= ={945}= [initial] [rendered] split chunk (cache group: defaultVendors) + > ./ main + ./node_modules/big.js?1 X bytes [built] [code generated] + ./node_modules/small.js?1 X bytes [built] [code generated] + ./node_modules/small.js?2 X bytes [built] [code generated] + chunk (runtime: main) switchXX-XXX.js (id hint: vendors) X KiB ={37}= ={59}= ={124}= ={161}= ={210}= ={241}= ={866}= ={945}= [initial] [rendered] split chunk (cache group: defaultVendors) + > ./ main + ./node_modules/very-big.js?1 X KiB [built] [code generated] + chunk (runtime: main) switched-main-XXXXXXXX.js (main-879072e3) X KiB ={37}= ={59}= ={124}= ={161}= ={210}= ={241}= ={273}= ={945}= [initial] [rendered] + > ./ main + modules by path ./subfolder/*.js X KiB + ./subfolder/big.js?1 X bytes [built] [code generated] + ./subfolder/big.js?2 X bytes [built] [code generated] + ./subfolder/small.js?1 X bytes [built] [code generated] + + 8 modules + modules by path ./*.js X bytes + ./small.js?1 X bytes [built] [code generated] + ./small.js?2 X bytes [built] [code generated] + ./small.js?3 X bytes [built] [code generated] + + 6 modules + chunk (runtime: main) switched-main-XXXXXXXX.js (main-89a43a0f) X KiB ={37}= ={59}= ={124}= ={161}= ={210}= ={241}= ={273}= ={866}= [initial] [rendered] + > ./ main + ./very-big.js?3 X KiB [built] [code generated] + + WARNING in SplitChunksPlugin + Cache group defaultVendors + Configured minSize (X bytes) is bigger than maxSize (X bytes). + This seem to be a invalid optimization.splitChunks configuration. + + WARNING in SplitChunksPlugin + Fallback cache group + Configured minSize (X bytes) is bigger than maxSize (X bytes). + This seem to be a invalid optimization.splitChunks configuration. + + switched (webpack x.x.x) compiled with 2 warnings + +zero-min: + Entrypoint main X KiB = 13 assets + chunk (runtime: main) zero-min-main-XXXXXXXX.js (main-6bb16544) X KiB ={59}= ={121}= ={124}= ={161}= ={181}= ={241}= ={273}= ={382}= ={409}= ={808}= ={942}= ={945}= [initial] [rendered] + > ./ main + ./in-some-directory/very-big.js?1 X KiB [built] [code generated] + chunk (runtime: main) zero-min-main-XXXXXXXX.js (main-1df31ce3) X KiB ={37}= ={121}= ={124}= ={161}= ={181}= ={241}= ={273}= ={382}= ={409}= ={808}= ={942}= ={945}= [initial] [rendered] + > ./ main + ./index.js X KiB [built] [code generated] + chunk (runtime: main) zero-min-main-XXXXXXXX.js (main-10f51d07) X bytes ={37}= ={59}= ={124}= ={161}= ={181}= ={241}= ={273}= ={382}= ={409}= ={808}= ={942}= ={945}= [initial] [rendered] + > ./ main + ./big.js?1 X bytes [built] [code generated] + ./big.js?2 X bytes [built] [code generated] + chunk (runtime: main) zero-min-main-XXXXXXXX.js (main-12217e1d) X KiB (javascript) X KiB (runtime) ={37}= ={59}= ={121}= ={161}= ={181}= ={241}= ={273}= ={382}= ={409}= ={808}= ={942}= ={945}= [entry] [rendered] + > ./ main + runtime modules X KiB 5 modules + ./very-big.js?1 X KiB [built] [code generated] + chunk (runtime: main) zero-min-main-XXXXXXXX.js (main-77a8c116) X KiB ={37}= ={59}= ={121}= ={124}= ={181}= ={241}= ={273}= ={382}= ={409}= ={808}= ={942}= ={945}= [initial] [rendered] + > ./ main + ./very-big.js?2 X KiB [built] [code generated] + chunk (runtime: main) zero-min-main-XXXXXXXX.js (main-e7c5ace7) X bytes ={37}= ={59}= ={121}= ={124}= ={161}= ={241}= ={273}= ={382}= ={409}= ={808}= ={942}= ={945}= [initial] [rendered] + > ./ main + ./small.js?1 X bytes [built] [code generated] + ./small.js?2 X bytes [built] [code generated] + ./small.js?3 X bytes [built] [code generated] + ./small.js?4 X bytes [built] [code generated] + ./small.js?5 X bytes [built] [code generated] + ./small.js?6 X bytes [built] [code generated] + ./small.js?7 X bytes [built] [code generated] + ./small.js?8 X bytes [built] [code generated] + ./small.js?9 X bytes [built] [code generated] + chunk (runtime: main) zero-min-241.js (id hint: vendors) X bytes ={37}= ={59}= ={121}= ={124}= ={161}= ={181}= ={273}= ={382}= ={409}= ={808}= ={942}= ={945}= [initial] [rendered] split chunk (cache group: defaultVendors) + > ./ main + ./node_modules/big.js?1 X bytes [built] [code generated] + ./node_modules/small.js?1 X bytes [built] [code generated] + ./node_modules/small.js?2 X bytes [built] [code generated] + chunk (runtime: main) zero-min-273.js (id hint: vendors) X KiB ={37}= ={59}= ={121}= ={124}= ={161}= ={181}= ={241}= ={382}= ={409}= ={808}= ={942}= ={945}= [initial] [rendered] split chunk (cache group: defaultVendors) + > ./ main + ./node_modules/very-big.js?1 X KiB [built] [code generated] + chunk (runtime: main) zero-min-main-XXXXXXXX.js (main-5cfff2c6) X bytes ={37}= ={59}= ={121}= ={124}= ={161}= ={181}= ={241}= ={273}= ={409}= ={808}= ={942}= ={945}= [initial] [rendered] + > ./ main + ./subfolder/big.js?1 X bytes [built] [code generated] + ./subfolder/big.js?2 X bytes [built] [code generated] + chunk (runtime: main) zero-min-main-XXXXXXXX.js (main-3c98d7c3) X bytes ={37}= ={59}= ={121}= ={124}= ={161}= ={181}= ={241}= ={273}= ={382}= ={808}= ={942}= ={945}= [initial] [rendered] + > ./ main + ./in-some-directory/big.js?1 X bytes [built] [code generated] + ./in-some-directory/small.js?1 X bytes [built] [code generated] + ./in-some-directory/small.js?2 X bytes [built] [code generated] + ./in-some-directory/small.js?3 X bytes [built] [code generated] + ./in-some-directory/small.js?4 X bytes [built] [code generated] + chunk (runtime: main) zero-min-main-XXXXXXXX.js (main-2f7dcf2e) X bytes ={37}= ={59}= ={121}= ={124}= ={161}= ={181}= ={241}= ={273}= ={382}= ={409}= ={942}= ={945}= [initial] [rendered] + > ./ main + ./inner-module/small.js?1 X bytes [built] [code generated] + ./inner-module/small.js?2 X bytes [built] [code generated] + ./inner-module/small.js?3 X bytes [built] [code generated] + ./inner-module/small.js?4 X bytes [built] [code generated] + ./inner-module/small.js?5 X bytes [built] [code generated] + ./inner-module/small.js?6 X bytes [built] [code generated] + ./inner-module/small.js?7 X bytes [built] [code generated] + ./inner-module/small.js?8 X bytes [built] [code generated] + ./inner-module/small.js?9 X bytes [built] [code generated] + chunk (runtime: main) zero-min-main-XXXXXXXX.js (main-1443e336) X bytes ={37}= ={59}= ={121}= ={124}= ={161}= ={181}= ={241}= ={273}= ={382}= ={409}= ={808}= ={945}= [initial] [rendered] + > ./ main + ./subfolder/small.js?1 X bytes [built] [code generated] + ./subfolder/small.js?2 X bytes [built] [code generated] + ./subfolder/small.js?3 X bytes [built] [code generated] + ./subfolder/small.js?4 X bytes [built] [code generated] + ./subfolder/small.js?5 X bytes [built] [code generated] + ./subfolder/small.js?6 X bytes [built] [code generated] + ./subfolder/small.js?7 X bytes [built] [code generated] + ./subfolder/small.js?8 X bytes [built] [code generated] + ./subfolder/small.js?9 X bytes [built] [code generated] + chunk (runtime: main) zero-min-main-XXXXXXXX.js (main-89a43a0f) X KiB ={37}= ={59}= ={121}= ={124}= ={161}= ={181}= ={241}= ={273}= ={382}= ={409}= ={808}= ={942}= [initial] [rendered] + > ./ main + ./very-big.js?3 X KiB [built] [code generated] + zero-min (webpack x.x.x) compiled successfully + +max-async-size: + Entrypoint main X KiB = max-async-size-main.js + chunk (runtime: main) max-async-size-asynX-X-XXXXXXXX.js (async-b-bde52cb3) X bytes <{792}> ={565}= ={664}= ={901}= [rendered] + > ./b ./async/index.js 10:2-49 + > ./a ./async/index.js 9:2-49 + dependent modules X bytes [dependent] 9 modules + cacheable modules X bytes + ./async/a.js X bytes [built] [code generated] + ./async/b.js X bytes [built] [code generated] + chunk (runtime: main) max-async-size-asynX-X-XXXXXXXX.js (async-b-89a43a0f) X KiB <{792}> ={265}= ={664}= ={901}= [rendered] + > ./b ./async/index.js 10:2-49 + > ./a ./async/index.js 9:2-49 + ./very-big.js?3 X KiB [built] [code generated] + chunk (runtime: main) max-async-size-asynX-X-XXXXXXXX.js (async-b-12217e1d) X KiB <{792}> ={265}= ={565}= ={901}= [rendered] + > ./b ./async/index.js 10:2-49 + > ./a ./async/index.js 9:2-49 + ./very-big.js?1 X KiB [built] [code generated] + chunk (runtime: main) max-async-size-main.js (main) X KiB (javascript) X KiB (runtime) >{265}< >{565}< >{664}< >{901}< [entry] [rendered] + > ./async main + runtime modules X KiB 10 modules + dependent modules X KiB [dependent] 6 modules + ./async/index.js X bytes [built] [code generated] + chunk (runtime: main) max-async-size-asynX-X-XXXXXXXX.js (async-b-77a8c116) X KiB <{792}> ={265}= ={565}= ={664}= [rendered] + > ./b ./async/index.js 10:2-49 + > ./a ./async/index.js 9:2-49 + ./very-big.js?2 X KiB [built] [code generated] + max-async-size (webpack x.x.x) compiled successfully + +enforce-min-size: + Entrypoint main X KiB = 14 assets + chunk (runtime: main) enforce-min-size-35.js (id hint: all) X bytes ={90}= ={120}= ={237}= ={241}= ={262}= ={273}= ={411}= ={491}= ={792}= ={858}= ={928}= ={929}= ={962}= [initial] [rendered] split chunk (cache group: all) + > ./ main + ./subfolder/small.js?1 X bytes [built] [code generated] + ./subfolder/small.js?2 X bytes [built] [code generated] + ./subfolder/small.js?3 X bytes [built] [code generated] + ./subfolder/small.js?4 X bytes [built] [code generated] + ./subfolder/small.js?5 X bytes [built] [code generated] + ./subfolder/small.js?6 X bytes [built] [code generated] + ./subfolder/small.js?7 X bytes [built] [code generated] + ./subfolder/small.js?8 X bytes [built] [code generated] + ./subfolder/small.js?9 X bytes [built] [code generated] + chunk (runtime: main) enforce-min-size-90.js (id hint: all) X KiB ={35}= ={120}= ={237}= ={241}= ={262}= ={273}= ={411}= ={491}= ={792}= ={858}= ={928}= ={929}= ={962}= [initial] [rendered] split chunk (cache group: all) + > ./ main + ./very-big.js?1 X KiB [built] [code generated] + chunk (runtime: main) enforce-min-size-120.js (id hint: all) X KiB ={35}= ={90}= ={237}= ={241}= ={262}= ={273}= ={411}= ={491}= ={792}= ={858}= ={928}= ={929}= ={962}= [initial] [rendered] split chunk (cache group: all) + > ./ main + ./very-big.js?3 X KiB [built] [code generated] + chunk (runtime: main) enforce-min-size-237.js (id hint: all) X KiB ={35}= ={90}= ={120}= ={241}= ={262}= ={273}= ={411}= ={491}= ={792}= ={858}= ={928}= ={929}= ={962}= [initial] [rendered] split chunk (cache group: all) + > ./ main + ./index.js X KiB [built] [code generated] + chunk (runtime: main) enforce-min-size-241.js (id hint: all) X bytes ={35}= ={90}= ={120}= ={237}= ={262}= ={273}= ={411}= ={491}= ={792}= ={858}= ={928}= ={929}= ={962}= [initial] [rendered] split chunk (cache group: all) + > ./ main + ./node_modules/big.js?1 X bytes [built] [code generated] + ./node_modules/small.js?1 X bytes [built] [code generated] + ./node_modules/small.js?2 X bytes [built] [code generated] + chunk (runtime: main) enforce-min-size-262.js (id hint: all) X bytes ={35}= ={90}= ={120}= ={237}= ={241}= ={273}= ={411}= ={491}= ={792}= ={858}= ={928}= ={929}= ={962}= [initial] [rendered] split chunk (cache group: all) + > ./ main + ./small.js?1 X bytes [built] [code generated] + ./small.js?2 X bytes [built] [code generated] + ./small.js?3 X bytes [built] [code generated] + ./small.js?4 X bytes [built] [code generated] + ./small.js?5 X bytes [built] [code generated] + ./small.js?6 X bytes [built] [code generated] + ./small.js?7 X bytes [built] [code generated] + ./small.js?8 X bytes [built] [code generated] + ./small.js?9 X bytes [built] [code generated] + chunk (runtime: main) enforce-min-size-273.js (id hint: all) X KiB ={35}= ={90}= ={120}= ={237}= ={241}= ={262}= ={411}= ={491}= ={792}= ={858}= ={928}= ={929}= ={962}= [initial] [rendered] split chunk (cache group: all) + > ./ main + ./node_modules/very-big.js?1 X KiB [built] [code generated] + chunk (runtime: main) enforce-min-size-411.js (id hint: all) X bytes ={35}= ={90}= ={120}= ={237}= ={241}= ={262}= ={273}= ={491}= ={792}= ={858}= ={928}= ={929}= ={962}= [initial] [rendered] split chunk (cache group: all) + > ./ main + ./subfolder/big.js?1 X bytes [built] [code generated] + ./subfolder/big.js?2 X bytes [built] [code generated] + chunk (runtime: main) enforce-min-size-491.js (id hint: all) X KiB ={35}= ={90}= ={120}= ={237}= ={241}= ={262}= ={273}= ={411}= ={792}= ={858}= ={928}= ={929}= ={962}= [initial] [rendered] split chunk (cache group: all) + > ./ main + ./in-some-directory/very-big.js?1 X KiB [built] [code generated] + chunk (runtime: main) enforce-min-size-main.js (main) X KiB ={35}= ={90}= ={120}= ={237}= ={241}= ={262}= ={273}= ={411}= ={491}= ={858}= ={928}= ={929}= ={962}= [entry] [rendered] + > ./ main + runtime modules X KiB 5 modules + chunk (runtime: main) enforce-min-size-858.js (id hint: all) X bytes ={35}= ={90}= ={120}= ={237}= ={241}= ={262}= ={273}= ={411}= ={491}= ={792}= ={928}= ={929}= ={962}= [initial] [rendered] split chunk (cache group: all) + > ./ main + ./inner-module/small.js?1 X bytes [built] [code generated] + ./inner-module/small.js?2 X bytes [built] [code generated] + ./inner-module/small.js?3 X bytes [built] [code generated] + ./inner-module/small.js?4 X bytes [built] [code generated] + ./inner-module/small.js?5 X bytes [built] [code generated] + ./inner-module/small.js?6 X bytes [built] [code generated] + ./inner-module/small.js?7 X bytes [built] [code generated] + ./inner-module/small.js?8 X bytes [built] [code generated] + ./inner-module/small.js?9 X bytes [built] [code generated] + chunk (runtime: main) enforce-min-size-928.js (id hint: all) X bytes ={35}= ={90}= ={120}= ={237}= ={241}= ={262}= ={273}= ={411}= ={491}= ={792}= ={858}= ={929}= ={962}= [initial] [rendered] split chunk (cache group: all) + > ./ main + ./in-some-directory/big.js?1 X bytes [built] [code generated] + ./in-some-directory/small.js?1 X bytes [built] [code generated] + ./in-some-directory/small.js?2 X bytes [built] [code generated] + ./in-some-directory/small.js?3 X bytes [built] [code generated] + ./in-some-directory/small.js?4 X bytes [built] [code generated] + chunk (runtime: main) enforce-min-size-929.js (id hint: all) X KiB ={35}= ={90}= ={120}= ={237}= ={241}= ={262}= ={273}= ={411}= ={491}= ={792}= ={858}= ={928}= ={962}= [initial] [rendered] split chunk (cache group: all) + > ./ main + ./very-big.js?2 X KiB [built] [code generated] + chunk (runtime: main) enforce-min-size-962.js (id hint: all) X bytes ={35}= ={90}= ={120}= ={237}= ={241}= ={262}= ={273}= ={411}= ={491}= ={792}= ={858}= ={928}= ={929}= [initial] [rendered] split chunk (cache group: all) + > ./ main + ./big.js?1 X bytes [built] [code generated] + ./big.js?2 X bytes [built] [code generated] + enforce-min-size (webpack x.x.x) compiled successfully + +only-async: + Entrypoint main X KiB = only-async-main.js + chunk (runtime: main) only-async-main.js (main) X KiB (javascript) X bytes (runtime) [entry] [rendered] + > ./ main + dependent modules X KiB [dependent] 44 modules + runtime modules X bytes 3 modules + ./index.js X KiB [built] [code generated] + only-async (webpack x.x.x) compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for split-chunks-min-size-reduction 1`] = ` +"Entrypoint main X KiB = default/main.js +chunk (runtime: main) default/async-b.js (async-b) X bytes <{792}> [rendered] + > ./b ./index.js 2:0-47 + ./b.js X bytes [built] [code generated] + ./node_modules/shared.js?1 X bytes [dependent] [built] [code generated] +chunk (runtime: main) default/async-e.js (async-e) X bytes <{792}> ={784}= [rendered] + > ./e ./index.js 5:0-47 + ./e.js X bytes [built] [code generated] +chunk (runtime: main) default/async-a.js (async-a) X bytes <{792}> [rendered] + > ./a ./index.js 1:0-47 + ./a.js X bytes [built] [code generated] + ./node_modules/shared.js?1 X bytes [dependent] [built] [code generated] +chunk (runtime: main) default/async-d.js (async-d) X bytes <{792}> ={784}= [rendered] + > ./d ./index.js 4:0-47 + ./d.js X bytes [built] [code generated] +chunk (runtime: main) default/784.js (id hint: vendors) X bytes <{792}> ={251}= ={442}= ={869}= [rendered] split chunk (cache group: defaultVendors) + > ./c ./index.js 3:0-47 + > ./d ./index.js 4:0-47 + > ./e ./index.js 5:0-47 + ./node_modules/shared.js?2 X bytes [built] [code generated] +chunk (runtime: main) default/main.js (main) X bytes (javascript) X KiB (runtime) >{60}< >{251}< >{263}< >{442}< >{784}< >{869}< [entry] [rendered] + > ./ main + runtime modules X KiB 9 modules + ./index.js X bytes [built] [code generated] +chunk (runtime: main) default/async-c.js (async-c) X bytes <{792}> ={784}= [rendered] + > ./c ./index.js 3:0-47 + ./c.js X bytes [built] [code generated] +webpack x.x.x compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for split-chunks-prefer-bigger-splits 1`] = ` +"Entrypoint main X KiB = default/main.js +chunk (runtime: main) default/async-b.js (async-b) X bytes <{792}> ={415}= [rendered] + > ./b ./index.js 2:0-47 + dependent modules X bytes [dependent] 1 module + ./b.js X bytes [built] [code generated] +chunk (runtime: main) default/async-a.js (async-a) X bytes <{792}> [rendered] + > ./a ./index.js 1:0-47 + dependent modules X bytes [dependent] 2 modules + ./a.js X bytes [built] [code generated] +chunk (runtime: main) default/415.js X bytes <{792}> ={60}= ={869}= [rendered] split chunk (cache group: default) + > ./b ./index.js 2:0-47 + > ./c ./index.js 3:0-47 + ./d.js X bytes [built] [code generated] + ./f.js X bytes [built] [code generated] +chunk (runtime: main) default/main.js (main) X bytes (javascript) X KiB (runtime) >{60}< >{263}< >{415}< >{869}< [entry] [rendered] + > ./ main + runtime modules X KiB 9 modules + ./index.js X bytes [built] [code generated] +chunk (runtime: main) default/async-c.js (async-c) X bytes <{792}> ={415}= [rendered] + > ./c ./index.js 3:0-47 + ./c.js X bytes [built] [code generated] +webpack x.x.x compiled successfully" +`; + +exports[`StatsTestCases should print correct stats for split-chunks-runtime-specific 1`] = ` +"used-exports: + asset used-exports-c.js X KiB [emitted] (name: c) + asset used-exports-b.js X KiB [emitted] (name: b) + asset used-exports-637.js X bytes [emitted] + asset used-exports-a.js X bytes [emitted] (name: a) + Entrypoint a X bytes = used-exports-a.js + Entrypoint b X KiB = used-exports-637.js X bytes used-exports-b.js X KiB + Entrypoint c X KiB = used-exports-637.js X bytes used-exports-c.js X KiB + chunk (runtime: b) used-exports-b.js (b) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 4 modules + ./b.js X bytes [built] [code generated] + chunk (runtime: c) used-exports-c.js (c) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 4 modules + ./c.js X bytes [built] [code generated] + chunk (runtime: b, c) used-exports-637.js X bytes [initial] [rendered] split chunk (cache group: default) + ./objects.js X bytes [built] [code generated] + chunk (runtime: a) used-exports-a.js (a) X bytes [entry] [rendered] + ./a.js + 1 modules X bytes [built] [code generated] + used-exports (webpack x.x.x) compiled successfully in X ms + +no-used-exports: + asset no-used-exports-c.js X KiB [emitted] (name: c) + asset no-used-exports-a.js X KiB [emitted] (name: a) + asset no-used-exports-b.js X KiB [emitted] (name: b) + asset no-used-exports-637.js X bytes [emitted] + Entrypoint a X KiB = no-used-exports-637.js X bytes no-used-exports-a.js X KiB + Entrypoint b X KiB = no-used-exports-637.js X bytes no-used-exports-b.js X KiB + Entrypoint c X KiB = no-used-exports-637.js X bytes no-used-exports-c.js X KiB + chunk (runtime: b) no-used-exports-b.js (b) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 4 modules + ./b.js X bytes [built] [code generated] + chunk (runtime: c) no-used-exports-c.js (c) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 4 modules + ./c.js X bytes [built] [code generated] + chunk (runtime: a, b, c) no-used-exports-637.js X bytes [initial] [rendered] split chunk (cache group: default) + ./objects.js X bytes [built] [code generated] + chunk (runtime: a) no-used-exports-a.js (a) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 4 modules + ./a.js X bytes [built] [code generated] + no-used-exports (webpack x.x.x) compiled successfully in X ms + +global: + asset global-c.js X KiB [emitted] (name: c) + asset global-a.js X KiB [emitted] (name: a) + asset global-b.js X KiB [emitted] (name: b) + asset global-637.js X bytes [emitted] + Entrypoint a X KiB = global-637.js X bytes global-a.js X KiB + Entrypoint b X KiB = global-637.js X bytes global-b.js X KiB + Entrypoint c X KiB = global-637.js X bytes global-c.js X KiB + chunk (runtime: b) global-b.js (b) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 4 modules + ./b.js X bytes [built] [code generated] + chunk (runtime: c) global-c.js (c) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 4 modules + ./c.js X bytes [built] [code generated] + chunk (runtime: a, b, c) global-637.js X bytes [initial] [rendered] split chunk (cache group: default) + ./objects.js X bytes [built] [code generated] + chunk (runtime: a) global-a.js (a) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 4 modules + ./a.js X bytes [built] [code generated] + global (webpack x.x.x) compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for track-returned 1`] = ` +"asset bundle.js X KiB [emitted] (name: main) +./index.js X KiB [built] [code generated] +./used.js?n=171 X bytes [built] [code generated] +./used.js?n=164 X bytes [built] [code generated] +./used.js?n=165 X bytes [built] [code generated] +./used.js?n=166 X bytes [built] [code generated] +./used.js?n=172 X bytes [built] [code generated] +./used.js?n=173 X bytes [built] [code generated] +./used.js?n=174 X bytes [built] [code generated] +./used.js?n=167 X bytes [built] [code generated] +./used.js?n=175 X bytes [built] [code generated] +./used.js?n=176 X bytes [built] [code generated] +./used.js?n=177 X bytes [built] [code generated] +./used.js?n=178 X bytes [built] [code generated] +./used.js?n=245 X bytes [built] [code generated] ++ 232 modules +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for tree-shaking 1`] = ` +"asset bundle.js X KiB [emitted] (name: main) +runtime modules X bytes 3 modules +orphan modules X bytes [orphan] 1 module +cacheable modules X bytes + ./index.js X bytes [built] [code generated] [1 warning] + [no exports] + [no exports used] + ./reexport-known.js X bytes [built] [code generated] + [exports: a, b] + [only some exports used: a] + ./reexport-unknown.js X bytes [built] [code generated] + [exports: a, b, c, d] + [only some exports used: a, c] + ./reexport-star-known.js X bytes [built] [code generated] + [exports: a, b] + [only some exports used: a] + ./reexport-star-unknown.js X bytes [built] [code generated] + [only some exports used: a, c] + ./edge.js X bytes [built] [code generated] + [only some exports used: y] + ./require.include.js X bytes [built] [code generated] + [exports: a, default] + [no exports used] + ./a.js X bytes [built] [code generated] + [exports: a] + [all exports used] + ./unknown.js X bytes [built] [code generated] + [used exports unknown] + ./unknown2.js X bytes [built] [code generated] + [used exports unknown] + +WARNING in ./index.js 9:0-36 +require.include() is deprecated and will be removed soon. + +webpack x.x.x compiled with 1 warning in X ms" +`; + +exports[`StatsTestCases should print correct stats for warnings-space-warning 1`] = ` +"asset main.js X bytes [emitted] (name: main) +orphan modules X bytes [orphan] 1 module +runtime modules X bytes 1 module +./index.js + 1 modules X bytes [built] [code generated] + +WARNING in ./index.js 3:12-14 +export 'bb' (imported as 'bb') was not found in './a' (possible exports: a) + +webpack x.x.x compiled with 1 warning in X ms" +`; + +exports[`StatsTestCases should print correct stats for wasm-explorer-examples-sync 1`] = ` +"assets by path *.js X KiB + asset bundle.js X KiB [emitted] (name: main) + asset 836.bundle.js X KiB [emitted] + asset 946.bundle.js X bytes [emitted] + asset 787.bundle.js X bytes [emitted] (id hint: vendors) + asset 573.bundle.js X bytes [emitted] + asset 672.bundle.js X bytes [emitted] + asset 989.bundle.js X bytes [emitted] +assets by path *.wasm X KiB + asset XXXXXXXXXXXXXXXXXXXX.module.wasm X bytes [emitted] [immutable] + asset XXXXXXXXXXXXXXXXXXXX.module.wasm X bytes [emitted] [immutable] + asset XXXXXXXXXXXXXXXXXXXX.module.wasm X bytes [emitted] [immutable] + asset XXXXXXXXXXXXXXXXXXXX.module.wasm X bytes [emitted] [immutable] + asset XXXXXXXXXXXXXXXXXXXX.module.wasm X bytes [emitted] [immutable] + asset XXXXXXXXXXXXXXXXXXXX.module.wasm X bytes [emitted] [immutable] +chunk (runtime: main) 573.bundle.js X bytes (javascript) X bytes (webassembly) [rendered] + ./Q_rsqrt.wasm X bytes (javascript) X bytes (webassembly) [built] [code generated] +chunk (runtime: main) 672.bundle.js X bytes (javascript) X bytes (webassembly) [rendered] + ./duff.wasm X bytes (javascript) X bytes (webassembly) [built] [code generated] +chunk (runtime: main) 787.bundle.js (id hint: vendors) X bytes [rendered] split chunk (cache group: defaultVendors) + ./node_modules/env.js X bytes [built] [code generated] +chunk (runtime: main) bundle.js (main) X bytes (javascript) X KiB (runtime) [entry] [rendered] + runtime modules X KiB 11 modules + ./index.js X bytes [built] [code generated] +chunk (runtime: main) 836.bundle.js X KiB (javascript) X bytes (webassembly) [rendered] + ./testFunction.wasm X bytes (javascript) X bytes (webassembly) [dependent] [built] [code generated] + ./tests.js X KiB [built] [code generated] +chunk (runtime: main) 946.bundle.js X bytes (javascript) X bytes (webassembly) [rendered] + ./fact.wasm X bytes (javascript) X bytes (webassembly) [built] [code generated] + ./fast-math.wasm X bytes (javascript) X bytes (webassembly) [built] [code generated] +chunk (runtime: main) 989.bundle.js X bytes (javascript) X bytes (webassembly) [rendered] + ./popcnt.wasm X bytes (javascript) X bytes (webassembly) [built] [code generated] +runtime modules X KiB 11 modules +cacheable modules X KiB (javascript) X KiB (webassembly) + webassembly modules X bytes (javascript) X KiB (webassembly) + ./Q_rsqrt.wasm X bytes (javascript) X bytes (webassembly) [built] [code generated] + ./testFunction.wasm X bytes (javascript) X bytes (webassembly) [built] [code generated] + ./fact.wasm X bytes (javascript) X bytes (webassembly) [built] [code generated] + ./popcnt.wasm X bytes (javascript) X bytes (webassembly) [built] [code generated] + ./fast-math.wasm X bytes (javascript) X bytes (webassembly) [built] [code generated] + ./duff.wasm X bytes (javascript) X bytes (webassembly) [built] [code generated] + javascript modules X KiB + ./index.js X bytes [built] [code generated] + ./tests.js X KiB [built] [code generated] + ./node_modules/env.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; + +exports[`StatsTestCases should print correct stats for worker-public-path 1`] = ` +"asset main-XXXXXXXXXXXXXXXXXXXX.js X KiB [emitted] [immutable] (name: main) +asset 447-XXXXXXXXXXXXXXXXXXXX.js X bytes [emitted] [immutable] +runtime modules X KiB 5 modules +cacheable modules X bytes + ./index.js X bytes [built] [code generated] + ./worker.js X bytes [built] [code generated] +webpack x.x.x compiled successfully in X ms" +`; diff --git a/test/__snapshots__/StatsTestCases.test.js.snap b/test/__snapshots__/StatsTestCases.test.js.snap deleted file mode 100644 index cc193e07405..00000000000 --- a/test/__snapshots__/StatsTestCases.test.js.snap +++ /dev/null @@ -1,3284 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`StatsTestCases should print correct stats for aggressive-splitting-entry 1`] = ` -"Hash: 6b5ddd5d48acc0426e7a6b5ddd5d48acc0426e7a -Child fitting: - Hash: 6b5ddd5d48acc0426e7a - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - 33966214360bbbb31383.js 1.94 KiB 2 [emitted] - 445d4c6a1d7381d6cb2c.js 1.94 KiB 3 [emitted] - d4b551c6319035df2898.js 1.05 KiB 0 [emitted] - ed31350d9c86da6a8353.js 11 KiB 1 [emitted] - Entrypoint main = 33966214360bbbb31383.js 445d4c6a1d7381d6cb2c.js ed31350d9c86da6a8353.js - chunk {0} d4b551c6319035df2898.js 916 bytes <{1}> <{2}> <{3}> - > ./g [4] ./index.js 7:0-13 - [7] ./g.js 916 bytes {0} [built] - chunk {1} ed31350d9c86da6a8353.js 1.87 KiB ={2}= ={3}= >{0}< [entry] [rendered] - > ./index main - [3] ./e.js 899 bytes {1} [built] - [4] ./index.js 111 bytes {1} [built] - [6] ./f.js 900 bytes {1} [built] - chunk {2} 33966214360bbbb31383.js 1.76 KiB ={1}= ={3}= >{0}< [initial] [rendered] [recorded] aggressive splitted - > ./index main - [0] ./b.js 899 bytes {2} [built] - [5] ./a.js 899 bytes {2} [built] - chunk {3} 445d4c6a1d7381d6cb2c.js 1.76 KiB ={1}= ={2}= >{0}< [initial] [rendered] [recorded] aggressive splitted - > ./index main - [1] ./c.js 899 bytes {3} [built] - [2] ./d.js 899 bytes {3} [built] -Child content-change: - Hash: 6b5ddd5d48acc0426e7a - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - 33966214360bbbb31383.js 1.94 KiB 2 [emitted] - 445d4c6a1d7381d6cb2c.js 1.94 KiB 3 [emitted] - d4b551c6319035df2898.js 1.05 KiB 0 [emitted] - ed31350d9c86da6a8353.js 11 KiB 1 [emitted] - Entrypoint main = 33966214360bbbb31383.js 445d4c6a1d7381d6cb2c.js ed31350d9c86da6a8353.js - chunk {0} d4b551c6319035df2898.js 916 bytes <{1}> <{2}> <{3}> - > ./g [4] ./index.js 7:0-13 - [7] ./g.js 916 bytes {0} [built] - chunk {1} ed31350d9c86da6a8353.js 1.87 KiB ={2}= ={3}= >{0}< [entry] [rendered] - > ./index main - [3] ./e.js 899 bytes {1} [built] - [4] ./index.js 111 bytes {1} [built] - [6] ./f.js 900 bytes {1} [built] - chunk {2} 33966214360bbbb31383.js 1.76 KiB ={1}= ={3}= >{0}< [initial] [rendered] [recorded] aggressive splitted - > ./index main - [0] ./b.js 899 bytes {2} [built] - [5] ./a.js 899 bytes {2} [built] - chunk {3} 445d4c6a1d7381d6cb2c.js 1.76 KiB ={1}= ={2}= >{0}< [initial] [rendered] [recorded] aggressive splitted - > ./index main - [1] ./c.js 899 bytes {3} [built] - [2] ./d.js 899 bytes {3} [built]" -`; - -exports[`StatsTestCases should print correct stats for aggressive-splitting-on-demand 1`] = ` -"Hash: f682b6dfa3cec23b4fff -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -01a8254701931adbf278.js 1.01 KiB 9 [emitted] -07830cd8072d83cdc6ad.js 1.01 KiB 10 [emitted] -1cd3a64e15add49c06d8.js 9.64 KiB 4 [emitted] main -2736cf9d79233cd0a9b6.js 1.93 KiB 0 [emitted] -29de52df747b400f6177.js 1 KiB 1 [emitted] -41be79832883258c21e6.js 1.94 KiB 6 [emitted] -43c1ac24102c075ecb2d.js 1.94 KiB 3, 1 [emitted] -5bc7f208cd99a83b4e33.js 1.94 KiB 8 [emitted] -7f83e5c2f4e52435dd2c.js 1.96 KiB 2 [emitted] -ba9fedb7aa0c69201639.js 1.94 KiB 11 [emitted] -d40ae25f5e7ef09d2e24.js 1.94 KiB 7, 10 [emitted] -e5fb899955fa03a8053b.js 1.94 KiB 5 [emitted] -Entrypoint main = 1cd3a64e15add49c06d8.js -chunk {0} 2736cf9d79233cd0a9b6.js 1.76 KiB <{4}> ={1}= ={2}= ={3}= ={6}= ={10}= [recorded] aggressive splitted - > ./b ./d ./e ./f ./g [11] ./index.js 5:0-44 - > ./b ./d ./e ./f ./g ./h ./i ./j ./k [11] ./index.js 6:0-72 - [0] ./b.js 899 bytes {0} {5} [built] - [1] ./d.js 899 bytes {0} {8} [built] -chunk {1} 29de52df747b400f6177.js 899 bytes <{4}> ={0}= ={2}= ={8}= - > ./c ./d ./e [11] ./index.js 3:0-30 - > ./b ./d ./e ./f ./g [11] ./index.js 5:0-44 - [2] ./e.js 899 bytes {1} {3} [built] -chunk {2} 7f83e5c2f4e52435dd2c.js 1.76 KiB <{4}> ={0}= ={1}= ={3}= ={6}= ={7}= ={10}= ={11}= [recorded] aggressive splitted - > ./f ./g ./h ./i ./j ./k [11] ./index.js 4:0-51 - > ./b ./d ./e ./f ./g [11] ./index.js 5:0-44 - > ./b ./d ./e ./f ./g ./h ./i ./j ./k [11] ./index.js 6:0-72 - [3] ./f.js 899 bytes {2} [built] - [4] ./g.js 901 bytes {2} [built] -chunk {3} 43c1ac24102c075ecb2d.js 1.76 KiB <{4}> ={0}= ={2}= ={6}= ={10}= [rendered] [recorded] aggressive splitted - > ./b ./d ./e ./f ./g ./h ./i ./j ./k [11] ./index.js 6:0-72 - [2] ./e.js 899 bytes {1} {3} [built] - [6] ./h.js 899 bytes {3} {11} [built] -chunk {4} 1cd3a64e15add49c06d8.js (main) 248 bytes >{0}< >{1}< >{2}< >{3}< >{5}< >{6}< >{7}< >{8}< >{9}< >{10}< >{11}< [entry] [rendered] - > ./index main - [11] ./index.js 248 bytes {4} [built] -chunk {5} e5fb899955fa03a8053b.js 1.76 KiB <{4}> - > ./b ./c [11] ./index.js 2:0-23 - [0] ./b.js 899 bytes {0} {5} [built] - [5] ./c.js 899 bytes {5} {8} [built] -chunk {6} 41be79832883258c21e6.js 1.76 KiB <{4}> ={0}= ={2}= ={3}= ={10}= [rendered] [recorded] aggressive splitted - > ./b ./d ./e ./f ./g ./h ./i ./j ./k [11] ./index.js 6:0-72 - [7] ./i.js 899 bytes {6} {11} [built] - [8] ./j.js 901 bytes {6} {7} [built] -chunk {7} d40ae25f5e7ef09d2e24.js 1.76 KiB <{4}> ={2}= ={11}= - > ./f ./g ./h ./i ./j ./k [11] ./index.js 4:0-51 - [8] ./j.js 901 bytes {6} {7} [built] - [9] ./k.js 899 bytes {7} {10} [built] -chunk {8} 5bc7f208cd99a83b4e33.js 1.76 KiB <{4}> ={1}= [recorded] aggressive splitted - > ./c ./d ./e [11] ./index.js 3:0-30 - [1] ./d.js 899 bytes {0} {8} [built] - [5] ./c.js 899 bytes {5} {8} [built] -chunk {9} 01a8254701931adbf278.js 899 bytes <{4}> - > ./a [11] ./index.js 1:0-16 - [10] ./a.js 899 bytes {9} [built] -chunk {10} 07830cd8072d83cdc6ad.js 899 bytes <{4}> ={0}= ={2}= ={3}= ={6}= - > ./b ./d ./e ./f ./g ./h ./i ./j ./k [11] ./index.js 6:0-72 - [9] ./k.js 899 bytes {7} {10} [built] -chunk {11} ba9fedb7aa0c69201639.js 1.76 KiB <{4}> ={2}= ={7}= [rendered] [recorded] aggressive splitted - > ./f ./g ./h ./i ./j ./k [11] ./index.js 4:0-51 - [6] ./h.js 899 bytes {3} {11} [built] - [7] ./i.js 899 bytes {6} {11} [built]" -`; - -exports[`StatsTestCases should print correct stats for async-commons-chunk 1`] = ` -"Entrypoint main = main.js -chunk {0} 0.js 21 bytes <{1}> ={2}= ={3}= [rendered] reused as split chunk (cache group: default) - > [1] ./index.js 17:1-21:3 - > [1] ./index.js 2:1-5:3 - > ./a ./b [1] ./index.js 9:1-13:3 - [0] ./a.js 21 bytes {0} [built] -chunk {1} main.js (main) 515 bytes >{0}< >{2}< >{3}< [entry] [rendered] - > ./ main - [1] ./index.js 515 bytes {1} [built] -chunk {2} 2.js 21 bytes <{1}> ={0}= [rendered] - > ./a ./b [1] ./index.js 9:1-13:3 - [2] ./b.js 21 bytes {2} [built] -chunk {3} 3.js 21 bytes <{1}> ={0}= [rendered] - > [1] ./index.js 17:1-21:3 - [3] ./c.js 21 bytes {3} [built]" -`; - -exports[`StatsTestCases should print correct stats for async-commons-chunk-auto 1`] = ` -"Child disabled: - Entrypoint main = disabled/main.js - Entrypoint a = disabled/a.js - Entrypoint b = disabled/b.js - Entrypoint c = disabled/c.js - chunk {0} disabled/a.js (a) 216 bytes >{4}< [entry] [rendered] - > ./a a - [0] ./d.js 20 bytes {0} {1} {2} {3} {5} {6} [built] - [1] ./node_modules/x.js 20 bytes {0} {1} {2} {3} {5} {6} [built] - [3] ./node_modules/y.js 20 bytes {0} {1} {2} {5} [built] - [5] ./a.js + 1 modules 156 bytes {0} {1} [built] - | ./a.js 121 bytes [built] - | ./e.js 20 bytes [built] - chunk {1} disabled/async-a.js (async-a) 216 bytes <{7}> >{4}< [rendered] - > ./a [7] ./index.js 1:0-47 - [0] ./d.js 20 bytes {0} {1} {2} {3} {5} {6} [built] - [1] ./node_modules/x.js 20 bytes {0} {1} {2} {3} {5} {6} [built] - [3] ./node_modules/y.js 20 bytes {0} {1} {2} {5} [built] - [5] ./a.js + 1 modules 156 bytes {0} {1} [built] - | ./a.js 121 bytes [built] - | ./e.js 20 bytes [built] - chunk {2} disabled/async-b.js (async-b) 152 bytes <{7}> [rendered] - > ./b [7] ./index.js 2:0-47 - [0] ./d.js 20 bytes {0} {1} {2} {3} {5} {6} [built] - [1] ./node_modules/x.js 20 bytes {0} {1} {2} {3} {5} {6} [built] - [2] ./f.js 20 bytes {2} {3} {4} {5} {6} [built] - [3] ./node_modules/y.js 20 bytes {0} {1} {2} {5} [built] - [4] ./b.js 72 bytes {2} {5} [built] - chunk {3} disabled/async-c.js (async-c) 167 bytes <{7}> [rendered] - > ./c [7] ./index.js 3:0-47 - [0] ./d.js 20 bytes {0} {1} {2} {3} {5} {6} [built] - [1] ./node_modules/x.js 20 bytes {0} {1} {2} {3} {5} {6} [built] - [2] ./f.js 20 bytes {2} {3} {4} {5} {6} [built] - [6] ./c.js + 1 modules 107 bytes {3} {6} [built] - | ./c.js 72 bytes [built] - | ./node_modules/z.js 20 bytes [built] - chunk {4} disabled/async-g.js (async-g) 54 bytes <{0}> <{1}> [rendered] - > ./g [] 6:0-47 - > ./g [] 6:0-47 - [2] ./f.js 20 bytes {2} {3} {4} {5} {6} [built] - [8] ./g.js 34 bytes {4} [built] - chunk {5} disabled/b.js (b) 152 bytes [entry] [rendered] - > ./b b - [0] ./d.js 20 bytes {0} {1} {2} {3} {5} {6} [built] - [1] ./node_modules/x.js 20 bytes {0} {1} {2} {3} {5} {6} [built] - [2] ./f.js 20 bytes {2} {3} {4} {5} {6} [built] - [3] ./node_modules/y.js 20 bytes {0} {1} {2} {5} [built] - [4] ./b.js 72 bytes {2} {5} [built] - chunk {6} disabled/c.js (c) 167 bytes [entry] [rendered] - > ./c c - [0] ./d.js 20 bytes {0} {1} {2} {3} {5} {6} [built] - [1] ./node_modules/x.js 20 bytes {0} {1} {2} {3} {5} {6} [built] - [2] ./f.js 20 bytes {2} {3} {4} {5} {6} [built] - [6] ./c.js + 1 modules 107 bytes {3} {6} [built] - | ./c.js 72 bytes [built] - | ./node_modules/z.js 20 bytes [built] - chunk {7} disabled/main.js (main) 147 bytes >{1}< >{2}< >{3}< [entry] [rendered] - > ./ main - [7] ./index.js 147 bytes {7} [built] -Child default: - Entrypoint main = default/main.js - Entrypoint a = default/a.js - Entrypoint b = default/b.js - Entrypoint c = default/c.js - chunk {0} default/async-a~async-b~async-c.js (async-a~async-b~async-c) 20 bytes <{11}> ={1}= ={2}= ={3}= ={5}= ={6}= ={7}= ={12}= >{1}< >{8}< [rendered] split chunk (cache group: default) (name: async-a~async-b~async-c) - > ./a [8] ./index.js 1:0-47 - > ./b [8] ./index.js 2:0-47 - > ./c [8] ./index.js 3:0-47 - [0] ./d.js 20 bytes {0} {4} {9} {10} [built] - chunk {1} default/async-b~async-c~async-g.js (async-b~async-c~async-g) 20 bytes <{0}> <{2}> <{3}> <{4}> <{5}> <{11}> ={0}= ={2}= ={3}= ={6}= ={7}= ={8}= ={12}= [rendered] split chunk (cache group: default) (name: async-b~async-c~async-g) - > ./b [8] ./index.js 2:0-47 - > ./c [8] ./index.js 3:0-47 - > ./g [] 6:0-47 - > ./g [] 6:0-47 - [2] ./f.js 20 bytes {1} {9} {10} [built] - chunk {2} default/vendors~async-a~async-b~async-c.js (vendors~async-a~async-b~async-c) 20 bytes <{11}> ={0}= ={1}= ={3}= ={5}= ={6}= ={7}= ={12}= >{1}< >{8}< [rendered] split chunk (cache group: vendors) (name: vendors~async-a~async-b~async-c) - > ./a [8] ./index.js 1:0-47 - > ./b [8] ./index.js 2:0-47 - > ./c [8] ./index.js 3:0-47 - [1] ./node_modules/x.js 20 bytes {2} {4} {9} {10} [built] - chunk {3} default/vendors~async-a~async-b.js (vendors~async-a~async-b) 20 bytes <{11}> ={0}= ={1}= ={2}= ={5}= ={6}= >{1}< >{8}< [rendered] split chunk (cache group: vendors) (name: vendors~async-a~async-b) - > ./a [8] ./index.js 1:0-47 - > ./b [8] ./index.js 2:0-47 - [3] ./node_modules/y.js 20 bytes {3} {4} {9} [built] - chunk {4} default/a.js (a) 216 bytes >{1}< >{8}< [entry] [rendered] - > ./a a - [0] ./d.js 20 bytes {0} {4} {9} {10} [built] - [1] ./node_modules/x.js 20 bytes {2} {4} {9} {10} [built] - [3] ./node_modules/y.js 20 bytes {3} {4} {9} [built] - [6] ./a.js + 1 modules 156 bytes {4} {5} [built] - | ./a.js 121 bytes [built] - | ./e.js 20 bytes [built] - chunk {5} default/async-a.js (async-a) 156 bytes <{11}> ={0}= ={2}= ={3}= >{1}< >{8}< [rendered] - > ./a [8] ./index.js 1:0-47 - [6] ./a.js + 1 modules 156 bytes {4} {5} [built] - | ./a.js 121 bytes [built] - | ./e.js 20 bytes [built] - chunk {6} default/async-b.js (async-b) 72 bytes <{11}> ={0}= ={1}= ={2}= ={3}= [rendered] - > ./b [8] ./index.js 2:0-47 - [4] ./b.js 72 bytes {6} {9} [built] - chunk {7} default/async-c.js (async-c) 72 bytes <{11}> ={0}= ={1}= ={2}= ={12}= [rendered] - > ./c [8] ./index.js 3:0-47 - [5] ./c.js 72 bytes {7} {10} [built] - chunk {8} default/async-g.js (async-g) 34 bytes <{0}> <{2}> <{3}> <{4}> <{5}> ={1}= [rendered] - > ./g [] 6:0-47 - > ./g [] 6:0-47 - [9] ./g.js 34 bytes {8} [built] - chunk {9} default/b.js (b) 152 bytes [entry] [rendered] - > ./b b - [0] ./d.js 20 bytes {0} {4} {9} {10} [built] - [1] ./node_modules/x.js 20 bytes {2} {4} {9} {10} [built] - [2] ./f.js 20 bytes {1} {9} {10} [built] - [3] ./node_modules/y.js 20 bytes {3} {4} {9} [built] - [4] ./b.js 72 bytes {6} {9} [built] - chunk {10} default/c.js (c) 152 bytes [entry] [rendered] - > ./c c - [0] ./d.js 20 bytes {0} {4} {9} {10} [built] - [1] ./node_modules/x.js 20 bytes {2} {4} {9} {10} [built] - [2] ./f.js 20 bytes {1} {9} {10} [built] - [5] ./c.js 72 bytes {7} {10} [built] - [7] ./node_modules/z.js 20 bytes {10} {12} [built] - chunk {11} default/main.js (main) 147 bytes >{0}< >{1}< >{2}< >{3}< >{5}< >{6}< >{7}< >{12}< [entry] [rendered] - > ./ main - [8] ./index.js 147 bytes {11} [built] - chunk {12} default/vendors~async-c.js (vendors~async-c) 20 bytes <{11}> ={0}= ={1}= ={2}= ={7}= [rendered] split chunk (cache group: vendors) (name: vendors~async-c) - > ./c [8] ./index.js 3:0-47 - [7] ./node_modules/z.js 20 bytes {10} {12} [built] -Child vendors: - Entrypoint main = vendors/main.js - Entrypoint a = vendors/vendors.js vendors/a.js - Entrypoint b = vendors/vendors.js vendors/b.js - Entrypoint c = vendors/vendors.js vendors/c.js - chunk {0} vendors/vendors.js (vendors) 60 bytes ={1}= ={6}= ={7}= >{5}< [initial] [rendered] split chunk (cache group: vendors) (name: vendors) - > ./a a - > ./b b - > ./c c - [1] ./node_modules/x.js 20 bytes {0} {2} {3} {4} [built] - [3] ./node_modules/y.js 20 bytes {0} {2} {3} [built] - [7] ./node_modules/z.js 20 bytes {0} {4} [built] - chunk {1} vendors/a.js (a) 176 bytes ={0}= >{5}< [entry] [rendered] - > ./a a - [0] ./d.js 20 bytes {1} {2} {3} {4} {6} {7} [built] - [6] ./a.js + 1 modules 156 bytes {1} {2} [built] - | ./a.js 121 bytes [built] - | ./e.js 20 bytes [built] - chunk {2} vendors/async-a.js (async-a) 216 bytes <{8}> >{5}< [rendered] - > ./a [8] ./index.js 1:0-47 - [0] ./d.js 20 bytes {1} {2} {3} {4} {6} {7} [built] - [1] ./node_modules/x.js 20 bytes {0} {2} {3} {4} [built] - [3] ./node_modules/y.js 20 bytes {0} {2} {3} [built] - [6] ./a.js + 1 modules 156 bytes {1} {2} [built] - | ./a.js 121 bytes [built] - | ./e.js 20 bytes [built] - chunk {3} vendors/async-b.js (async-b) 152 bytes <{8}> [rendered] - > ./b [8] ./index.js 2:0-47 - [0] ./d.js 20 bytes {1} {2} {3} {4} {6} {7} [built] - [1] ./node_modules/x.js 20 bytes {0} {2} {3} {4} [built] - [2] ./f.js 20 bytes {3} {4} {5} {6} {7} [built] - [3] ./node_modules/y.js 20 bytes {0} {2} {3} [built] - [4] ./b.js 72 bytes {3} {6} [built] - chunk {4} vendors/async-c.js (async-c) 152 bytes <{8}> [rendered] - > ./c [8] ./index.js 3:0-47 - [0] ./d.js 20 bytes {1} {2} {3} {4} {6} {7} [built] - [1] ./node_modules/x.js 20 bytes {0} {2} {3} {4} [built] - [2] ./f.js 20 bytes {3} {4} {5} {6} {7} [built] - [5] ./c.js 72 bytes {4} {7} [built] - [7] ./node_modules/z.js 20 bytes {0} {4} [built] - chunk {5} vendors/async-g.js (async-g) 54 bytes <{0}> <{1}> <{2}> [rendered] - > ./g [] 6:0-47 - > ./g [] 6:0-47 - [2] ./f.js 20 bytes {3} {4} {5} {6} {7} [built] - [9] ./g.js 34 bytes {5} [built] - chunk {6} vendors/b.js (b) 112 bytes ={0}= [entry] [rendered] - > ./b b - [0] ./d.js 20 bytes {1} {2} {3} {4} {6} {7} [built] - [2] ./f.js 20 bytes {3} {4} {5} {6} {7} [built] - [4] ./b.js 72 bytes {3} {6} [built] - chunk {7} vendors/c.js (c) 112 bytes ={0}= [entry] [rendered] - > ./c c - [0] ./d.js 20 bytes {1} {2} {3} {4} {6} {7} [built] - [2] ./f.js 20 bytes {3} {4} {5} {6} {7} [built] - [5] ./c.js 72 bytes {4} {7} [built] - chunk {8} vendors/main.js (main) 147 bytes >{2}< >{3}< >{4}< [entry] [rendered] - > ./ main - [8] ./index.js 147 bytes {8} [built] -Child multiple-vendors: - Entrypoint main = multiple-vendors/main.js - Entrypoint a = multiple-vendors/libs-x.js multiple-vendors/vendors~a~async-a~async-b~b.js multiple-vendors/a.js - Entrypoint b = multiple-vendors/libs-x.js multiple-vendors/vendors~a~async-a~async-b~b.js multiple-vendors/b.js - Entrypoint c = multiple-vendors/libs-x.js multiple-vendors/vendors~async-c~c.js multiple-vendors/c.js - chunk {0} multiple-vendors/libs-x.js (libs-x) 20 bytes <{12}> ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={10}= ={11}= >{3}< >{9}< [initial] [rendered] split chunk (cache group: libs) (name: libs-x) - > ./a [8] ./index.js 1:0-47 - > ./b [8] ./index.js 2:0-47 - > ./c [8] ./index.js 3:0-47 - > ./a a - > ./b b - > ./c c - [2] ./node_modules/x.js 20 bytes {0} [built] - chunk {1} multiple-vendors/vendors~a~async-a~async-b~b.js (vendors~a~async-a~async-b~b) 20 bytes <{12}> ={0}= ={2}= ={3}= ={5}= ={6}= ={7}= ={10}= >{3}< >{9}< [initial] [rendered] split chunk (cache group: vendors) (name: vendors~a~async-a~async-b~b) - > ./a [8] ./index.js 1:0-47 - > ./b [8] ./index.js 2:0-47 - > ./a a - > ./b b - [3] ./node_modules/y.js 20 bytes {1} [built] - chunk {2} multiple-vendors/async-a~async-b~async-c.js (async-a~async-b~async-c) 20 bytes <{12}> ={0}= ={1}= ={3}= ={4}= ={6}= ={7}= ={8}= >{3}< >{9}< [rendered] split chunk (cache group: default) (name: async-a~async-b~async-c) - > ./a [8] ./index.js 1:0-47 - > ./b [8] ./index.js 2:0-47 - > ./c [8] ./index.js 3:0-47 - [0] ./d.js 20 bytes {2} {5} {10} {11} [built] - chunk {3} multiple-vendors/async-b~async-c~async-g.js (async-b~async-c~async-g) 20 bytes <{0}> <{1}> <{2}> <{5}> <{6}> <{12}> ={0}= ={1}= ={2}= ={4}= ={7}= ={8}= ={9}= [rendered] split chunk (cache group: default) (name: async-b~async-c~async-g) - > ./b [8] ./index.js 2:0-47 - > ./c [8] ./index.js 3:0-47 - > ./g [] 6:0-47 - > ./g [] 6:0-47 - [1] ./f.js 20 bytes {3} {10} {11} [built] - chunk {4} multiple-vendors/vendors~async-c~c.js (vendors~async-c~c) 20 bytes <{12}> ={0}= ={2}= ={3}= ={8}= ={11}= [initial] [rendered] split chunk (cache group: vendors) (name: vendors~async-c~c) - > ./c [8] ./index.js 3:0-47 - > ./c c - [7] ./node_modules/z.js 20 bytes {4} [built] - chunk {5} multiple-vendors/a.js (a) 176 bytes ={0}= ={1}= >{3}< >{9}< [entry] [rendered] - > ./a a - [0] ./d.js 20 bytes {2} {5} {10} {11} [built] - [6] ./a.js + 1 modules 156 bytes {5} {6} [built] - | ./a.js 121 bytes [built] - | ./e.js 20 bytes [built] - chunk {6} multiple-vendors/async-a.js (async-a) 156 bytes <{12}> ={0}= ={1}= ={2}= >{3}< >{9}< [rendered] - > ./a [8] ./index.js 1:0-47 - [6] ./a.js + 1 modules 156 bytes {5} {6} [built] - | ./a.js 121 bytes [built] - | ./e.js 20 bytes [built] - chunk {7} multiple-vendors/async-b.js (async-b) 72 bytes <{12}> ={0}= ={1}= ={2}= ={3}= [rendered] - > ./b [8] ./index.js 2:0-47 - [4] ./b.js 72 bytes {7} {10} [built] - chunk {8} multiple-vendors/async-c.js (async-c) 72 bytes <{12}> ={0}= ={2}= ={3}= ={4}= [rendered] - > ./c [8] ./index.js 3:0-47 - [5] ./c.js 72 bytes {8} {11} [built] - chunk {9} multiple-vendors/async-g.js (async-g) 34 bytes <{0}> <{1}> <{2}> <{5}> <{6}> ={3}= [rendered] - > ./g [] 6:0-47 - > ./g [] 6:0-47 - [9] ./g.js 34 bytes {9} [built] - chunk {10} multiple-vendors/b.js (b) 112 bytes ={0}= ={1}= [entry] [rendered] - > ./b b - [0] ./d.js 20 bytes {2} {5} {10} {11} [built] - [1] ./f.js 20 bytes {3} {10} {11} [built] - [4] ./b.js 72 bytes {7} {10} [built] - chunk {11} multiple-vendors/c.js (c) 112 bytes ={0}= ={4}= [entry] [rendered] - > ./c c - [0] ./d.js 20 bytes {2} {5} {10} {11} [built] - [1] ./f.js 20 bytes {3} {10} {11} [built] - [5] ./c.js 72 bytes {8} {11} [built] - chunk {12} multiple-vendors/main.js (main) 147 bytes >{0}< >{1}< >{2}< >{3}< >{4}< >{6}< >{7}< >{8}< [entry] [rendered] - > ./ main - [8] ./index.js 147 bytes {12} [built] -Child all: - Entrypoint main = all/main.js - Entrypoint a = all/vendors~a~async-a~async-b~async-c~b~c.js all/vendors~a~async-a~async-b~b.js all/a.js - Entrypoint b = all/vendors~a~async-a~async-b~async-c~b~c.js all/vendors~a~async-a~async-b~b.js all/b.js - Entrypoint c = all/vendors~a~async-a~async-b~async-c~b~c.js all/vendors~async-c~c.js all/c.js - chunk {0} all/vendors~a~async-a~async-b~async-c~b~c.js (vendors~a~async-a~async-b~async-c~b~c) 20 bytes <{12}> ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={10}= ={11}= >{3}< >{9}< [initial] [rendered] split chunk (cache group: vendors) (name: vendors~a~async-a~async-b~async-c~b~c) - > ./a [8] ./index.js 1:0-47 - > ./b [8] ./index.js 2:0-47 - > ./c [8] ./index.js 3:0-47 - > ./a a - > ./b b - > ./c c - [2] ./node_modules/x.js 20 bytes {0} [built] - chunk {1} all/vendors~a~async-a~async-b~b.js (vendors~a~async-a~async-b~b) 20 bytes <{12}> ={0}= ={2}= ={3}= ={5}= ={6}= ={7}= ={10}= >{3}< >{9}< [initial] [rendered] split chunk (cache group: vendors) (name: vendors~a~async-a~async-b~b) - > ./a [8] ./index.js 1:0-47 - > ./b [8] ./index.js 2:0-47 - > ./a a - > ./b b - [3] ./node_modules/y.js 20 bytes {1} [built] - chunk {2} all/async-a~async-b~async-c.js (async-a~async-b~async-c) 20 bytes <{12}> ={0}= ={1}= ={3}= ={4}= ={6}= ={7}= ={8}= >{3}< >{9}< [rendered] split chunk (cache group: default) (name: async-a~async-b~async-c) - > ./a [8] ./index.js 1:0-47 - > ./b [8] ./index.js 2:0-47 - > ./c [8] ./index.js 3:0-47 - [0] ./d.js 20 bytes {2} {5} {10} {11} [built] - chunk {3} all/async-b~async-c~async-g.js (async-b~async-c~async-g) 20 bytes <{0}> <{1}> <{2}> <{5}> <{6}> <{12}> ={0}= ={1}= ={2}= ={4}= ={7}= ={8}= ={9}= [rendered] split chunk (cache group: default) (name: async-b~async-c~async-g) - > ./b [8] ./index.js 2:0-47 - > ./c [8] ./index.js 3:0-47 - > ./g [] 6:0-47 - > ./g [] 6:0-47 - [1] ./f.js 20 bytes {3} {10} {11} [built] - chunk {4} all/vendors~async-c~c.js (vendors~async-c~c) 20 bytes <{12}> ={0}= ={2}= ={3}= ={8}= ={11}= [initial] [rendered] split chunk (cache group: vendors) (name: vendors~async-c~c) - > ./c [8] ./index.js 3:0-47 - > ./c c - [7] ./node_modules/z.js 20 bytes {4} [built] - chunk {5} all/a.js (a) 176 bytes ={0}= ={1}= >{3}< >{9}< [entry] [rendered] - > ./a a - [0] ./d.js 20 bytes {2} {5} {10} {11} [built] - [6] ./a.js + 1 modules 156 bytes {5} {6} [built] - | ./a.js 121 bytes [built] - | ./e.js 20 bytes [built] - chunk {6} all/async-a.js (async-a) 156 bytes <{12}> ={0}= ={1}= ={2}= >{3}< >{9}< [rendered] - > ./a [8] ./index.js 1:0-47 - [6] ./a.js + 1 modules 156 bytes {5} {6} [built] - | ./a.js 121 bytes [built] - | ./e.js 20 bytes [built] - chunk {7} all/async-b.js (async-b) 72 bytes <{12}> ={0}= ={1}= ={2}= ={3}= [rendered] - > ./b [8] ./index.js 2:0-47 - [4] ./b.js 72 bytes {7} {10} [built] - chunk {8} all/async-c.js (async-c) 72 bytes <{12}> ={0}= ={2}= ={3}= ={4}= [rendered] - > ./c [8] ./index.js 3:0-47 - [5] ./c.js 72 bytes {8} {11} [built] - chunk {9} all/async-g.js (async-g) 34 bytes <{0}> <{1}> <{2}> <{5}> <{6}> ={3}= [rendered] - > ./g [] 6:0-47 - > ./g [] 6:0-47 - [9] ./g.js 34 bytes {9} [built] - chunk {10} all/b.js (b) 112 bytes ={0}= ={1}= [entry] [rendered] - > ./b b - [0] ./d.js 20 bytes {2} {5} {10} {11} [built] - [1] ./f.js 20 bytes {3} {10} {11} [built] - [4] ./b.js 72 bytes {7} {10} [built] - chunk {11} all/c.js (c) 112 bytes ={0}= ={4}= [entry] [rendered] - > ./c c - [0] ./d.js 20 bytes {2} {5} {10} {11} [built] - [1] ./f.js 20 bytes {3} {10} {11} [built] - [5] ./c.js 72 bytes {8} {11} [built] - chunk {12} all/main.js (main) 147 bytes >{0}< >{1}< >{2}< >{3}< >{4}< >{6}< >{7}< >{8}< [entry] [rendered] - > ./ main - [8] ./index.js 147 bytes {12} [built]" -`; - -exports[`StatsTestCases should print correct stats for chunk-module-id-range 1`] = ` -"Hash: 88889d87c9bc8eba9a2b -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -main1.js 4.86 KiB 1 [emitted] main1 -main2.js 4.85 KiB 0 [emitted] main2 -Entrypoint main1 = main1.js -Entrypoint main2 = main2.js -chunk {0} main2.js (main2) 136 bytes [entry] [rendered] - > ./main2 main2 - [0] ./d.js 20 bytes {0} {1} [built] - [1] ./e.js 20 bytes {0} [built] - [2] ./f.js 20 bytes {0} [built] - [3] ./main2.js 56 bytes {0} [built] - [101] ./a.js 20 bytes {0} {1} [built] -chunk {1} main1.js (main1) 136 bytes [entry] [rendered] - > ./main1 main1 - [0] ./d.js 20 bytes {0} {1} [built] - [4] ./c.js 20 bytes {1} [built] - [100] ./main1.js 56 bytes {1} [built] - [101] ./a.js 20 bytes {0} {1} [built] - [102] ./b.js 20 bytes {1} [built]" -`; - -exports[`StatsTestCases should print correct stats for chunks 1`] = ` -"Hash: 34cad0d1897c8ba31143 -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -1.bundle.js 232 bytes 1 [emitted] -2.bundle.js 152 bytes 2 [emitted] -3.bundle.js 289 bytes 3 [emitted] - bundle.js 8.23 KiB 0 [emitted] main -Entrypoint main = bundle.js -chunk {0} bundle.js (main) 73 bytes >{2}< >{3}< [entry] [rendered] - > ./index main - [0] ./index.js 51 bytes {0} [built] - single entry ./index main - factory:Xms building:Xms = Xms - [1] ./a.js 22 bytes {0} [built] - cjs require ./a [0] ./index.js 1:0-14 - [0] Xms -> factory:Xms building:Xms = Xms -chunk {1} 1.bundle.js 44 bytes <{3}> [rendered] - > [3] ./c.js 1:0-52 - [4] ./d.js 22 bytes {1} [built] - require.ensure item ./d [3] ./c.js 1:0-52 - [0] Xms -> [3] Xms -> factory:Xms building:Xms = Xms - [5] ./e.js 22 bytes {1} [built] - require.ensure item ./e [3] ./c.js 1:0-52 - [0] Xms -> [3] Xms -> factory:Xms building:Xms = Xms -chunk {2} 2.bundle.js 22 bytes <{0}> [rendered] - > ./b [0] ./index.js 2:0-16 - [2] ./b.js 22 bytes {2} [built] - amd require ./b [0] ./index.js 2:0-16 - [0] Xms -> factory:Xms building:Xms = Xms -chunk {3} 3.bundle.js 54 bytes <{0}> >{1}< [rendered] - > ./c [0] ./index.js 3:0-16 - [3] ./c.js 54 bytes {3} [built] - amd require ./c [0] ./index.js 3:0-16 - [0] Xms -> factory:Xms building:Xms = Xms" -`; - -exports[`StatsTestCases should print correct stats for chunks-development 1`] = ` -"Hash: 7192da34b98e59fe39b2 -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -0.bundle.js 588 bytes 0 [emitted] -1.bundle.js 297 bytes 1 [emitted] -2.bundle.js 433 bytes 2 [emitted] - bundle.js 8.61 KiB main [emitted] main -Entrypoint main = bundle.js -chunk {0} 0.bundle.js 60 bytes <{2}> [rendered] - > [./c.js] ./c.js 1:0-52 - [./d.js] 22 bytes {0} [built] - require.ensure item ./d [./c.js] 1:0-52 - [./index.js] Xms -> [./c.js] Xms -> factory:Xms building:Xms = Xms - [./e.js] 38 bytes {0} [built] - require.ensure item ./e [./c.js] 1:0-52 - [./index.js] Xms -> [./c.js] Xms -> factory:Xms building:Xms = Xms -chunk {1} 1.bundle.js 22 bytes <{main}> [rendered] - > ./b [./index.js] ./index.js 2:0-16 - [./b.js] 22 bytes {1} [built] - amd require ./b [./index.js] 2:0-16 - [./index.js] Xms -> factory:Xms building:Xms = Xms -chunk {2} 2.bundle.js 54 bytes <{main}> >{0}< [rendered] - > ./c [./index.js] ./index.js 3:0-16 - [./c.js] 54 bytes {2} [built] - amd require ./c [./index.js] 3:0-16 - [./index.js] Xms -> factory:Xms building:Xms = Xms -chunk {main} bundle.js (main) 73 bytes >{1}< >{2}< [entry] [rendered] - > ./index main - [./a.js] 22 bytes {main} [built] - cjs require ./a [./e.js] 1:0-14 - cjs require ./a [./index.js] 1:0-14 - [./index.js] Xms -> factory:Xms building:Xms = Xms - [./index.js] 51 bytes {main} [built] - single entry ./index main - factory:Xms building:Xms = Xms" -`; - -exports[`StatsTestCases should print correct stats for circular-correctness 1`] = ` -"Entrypoint main = bundle.js -chunk {0} 0.bundle.js (a) 49 bytes <{2}> <{3}> >{2}< [rendered] - [1] ./module-a.js 49 bytes {0} [built] -chunk {1} 1.bundle.js (b) 49 bytes <{2}> <{3}> >{2}< [rendered] - [2] ./module-b.js 49 bytes {1} [built] -chunk {2} 2.bundle.js (c) 98 bytes <{0}> <{1}> >{0}< >{1}< [rendered] - [3] ./module-c.js 98 bytes {2} [built] -chunk {3} bundle.js (main) 98 bytes >{0}< >{1}< [entry] [rendered] - [0] ./index.js 98 bytes {3} [built]" -`; - -exports[`StatsTestCases should print correct stats for color-disabled 1`] = ` -"Hash: aa5b75cccf66cd9b1ffa -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -main.js 3.57 KiB 0 [emitted] main -Entrypoint main = main.js -[0] ./index.js 0 bytes {0} [built]" -`; - -exports[`StatsTestCases should print correct stats for color-enabled 1`] = ` -"Hash: aa5b75cccf66cd9b1ffa -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -main.js 3.57 KiB 0 [emitted] main -Entrypoint main = main.js -[0] ./index.js 0 bytes {0} [built]" -`; - -exports[`StatsTestCases should print correct stats for color-enabled-custom 1`] = ` -"Hash: aa5b75cccf66cd9b1ffa -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -main.js 3.57 KiB 0 [emitted] main -Entrypoint main = main.js -[0] ./index.js 0 bytes {0} [built]" -`; - -exports[`StatsTestCases should print correct stats for commons-chunk-min-size-0 1`] = ` -"Hash: 578e4c7a1795861b0a9c -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - entry-1.js 6.6 KiB 0 [emitted] entry-1 -vendor-1~entry-1.js 314 bytes 1 [emitted] vendor-1~entry-1 -Entrypoint entry-1 = vendor-1~entry-1.js entry-1.js -[0] ./entry-1.js 145 bytes {0} [built] -[1] ./modules/a.js 22 bytes {1} [built] -[2] ./modules/b.js 22 bytes {1} [built] -[3] ./modules/c.js 22 bytes {1} [built] -[4] ./modules/d.js 22 bytes {0} [built] -[5] ./modules/e.js 22 bytes {0} [built] -[6] ./modules/f.js 22 bytes {0} [built]" -`; - -exports[`StatsTestCases should print correct stats for commons-chunk-min-size-Infinity 1`] = ` -"Hash: 8d92f1bebd2cb6793d22 -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - entry-1.js 6.6 KiB 0 [emitted] entry-1 -vendor-1.js 314 bytes 1 [emitted] vendor-1 -Entrypoint entry-1 = vendor-1.js entry-1.js -[0] ./entry-1.js 145 bytes {0} [built] -[1] ./modules/a.js 22 bytes {1} [built] -[2] ./modules/b.js 22 bytes {1} [built] -[3] ./modules/c.js 22 bytes {1} [built] -[4] ./modules/d.js 22 bytes {0} [built] -[5] ./modules/e.js 22 bytes {0} [built] -[6] ./modules/f.js 22 bytes {0} [built]" -`; - -exports[`StatsTestCases should print correct stats for commons-plugin-issue-4980 1`] = ` -"Hash: 159313d738428f44ef68a283ef191845660a080d -Child - Hash: 159313d738428f44ef68 - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - app.js 6.69 KiB 0 [emitted] app - vendor.aa94f0c872c214f6cb2e.js 619 bytes 1 [emitted] vendor - Entrypoint app = vendor.aa94f0c872c214f6cb2e.js app.js - [./constants.js] 87 bytes {1} [built] - [./entry-1.js] ./entry-1.js + 2 modules 190 bytes {0} [built] - | ./entry-1.js 67 bytes [built] - | ./submodule-a.js 59 bytes [built] - | ./submodule-b.js 59 bytes [built] -Child - Hash: a283ef191845660a080d - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - app.js 6.7 KiB 0 [emitted] app - vendor.aa94f0c872c214f6cb2e.js 619 bytes 1 [emitted] vendor - Entrypoint app = vendor.aa94f0c872c214f6cb2e.js app.js - [./constants.js] 87 bytes {1} [built] - [./entry-2.js] ./entry-2.js + 2 modules 197 bytes {0} [built] - | ./entry-2.js 67 bytes [built] - | ./submodule-a.js 59 bytes [built] - | ./submodule-c.js 66 bytes [built]" -`; - -exports[`StatsTestCases should print correct stats for concat-and-sideeffects 1`] = ` -"[0] ./index.js + 2 modules 119 bytes {0} [built] - | ./index.js 46 bytes [built] - | ModuleConcatenation bailout: Module is an entry point - | ./node_modules/pmodule/a.js 49 bytes [built] - | ./node_modules/pmodule/aa.js 24 bytes [built] -[1] ./node_modules/pmodule/index.js 63 bytes [built] - ModuleConcatenation bailout: Module is not in any chunk -[2] ./node_modules/pmodule/b.js 49 bytes [built] - ModuleConcatenation bailout: Module is not in any chunk -[3] ./node_modules/pmodule/bb.js 24 bytes [built] - ModuleConcatenation bailout: Module is not in any chunk -[4] ./node_modules/pmodule/c.js 49 bytes [built] - ModuleConcatenation bailout: Module is not in any chunk -[5] ./node_modules/pmodule/cc.js 24 bytes [built] - ModuleConcatenation bailout: Module is not in any chunk" -`; - -exports[`StatsTestCases should print correct stats for define-plugin 1`] = ` -"Hash: 97d5f15cb3086ba8eb8878ce8186fd9442bfeb83c3284590614d84a86804 -Child - Hash: 97d5f15cb3086ba8eb88 - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - main.js 3.6 KiB 0 [emitted] main - Entrypoint main = main.js - [0] ./index.js 24 bytes {0} [built] -Child - Hash: 78ce8186fd9442bfeb83 - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - main.js 3.6 KiB 0 [emitted] main - Entrypoint main = main.js - [0] ./index.js 24 bytes {0} [built] -Child - Hash: c3284590614d84a86804 - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - main.js 3.6 KiB 0 [emitted] main - Entrypoint main = main.js - [0] ./index.js 24 bytes {0} [built]" -`; - -exports[`StatsTestCases should print correct stats for dll-reference-plugin-issue-7624 1`] = ` -"Hash: 5a94740543bfdf73ae19 -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -bundle.js 3.6 KiB 0 [emitted] main -Entrypoint main = bundle.js -[0] ./entry.js 29 bytes {0} [built]" -`; - -exports[`StatsTestCases should print correct stats for dll-reference-plugin-issue-7624-error 1`] = ` -"Hash: 85ed2c36acb938b99695 -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -bundle.js 3.6 KiB 0 main -Entrypoint main = bundle.js -[0] ./entry.js 29 bytes {0} [built] - -ERROR in Dll manifest blank-manifest.json -Unexpected end of JSON input while parsing near ''" -`; - -exports[`StatsTestCases should print correct stats for exclude-with-loader 1`] = ` -"Hash: b79137b5927646440aa7 -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -bundle.js 4.01 KiB 0 [emitted] main - + 1 hidden asset -Entrypoint main = bundle.js -[0] ./index.js 77 bytes {0} [built] -[1] ./a.txt 43 bytes {0} [built] - + 2 hidden modules" -`; - -exports[`StatsTestCases should print correct stats for external 1`] = ` -"Hash: ce617e255d7a82e9e1e3 -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -main.js 3.71 KiB 0 [emitted] main -Entrypoint main = main.js -[0] ./index.js 17 bytes {0} [built] -[1] external \\"test\\" 42 bytes {0} [built]" -`; - -exports[`StatsTestCases should print correct stats for filter-warnings 1`] = ` -"Hash: 8d381ad7d9791ae0d2ff8d381ad7d9791ae0d2ff8d381ad7d9791ae0d2ff8d381ad7d9791ae0d2ff8d381ad7d9791ae0d2ff8d381ad7d9791ae0d2ff8d381ad7d9791ae0d2ff8d381ad7d9791ae0d2ff8d381ad7d9791ae0d2ff8d381ad7d9791ae0d2ff8d381ad7d9791ae0d2ff8d381ad7d9791ae0d2ff8d381ad7d9791ae0d2ff -Child undefined: - Hash: 8d381ad7d9791ae0d2ff - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - bundle.js 2.89 KiB 0 [emitted] main - Entrypoint main = bundle.js - - WARNING in Terser Plugin: Dropping side-effect-free statement [./index.js:6,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction1 [./index.js:8,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction2 [./index.js:9,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction3 [./index.js:10,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction4 [./index.js:11,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction5 [./index.js:12,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction1 [./a.js:3,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction2 [./a.js:4,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction3 [./a.js:5,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction4 [./a.js:6,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction5 [./a.js:7,0] -Child Terser: - Hash: 8d381ad7d9791ae0d2ff - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - bundle.js 2.89 KiB 0 [emitted] main - Entrypoint main = bundle.js -Child /Terser/: - Hash: 8d381ad7d9791ae0d2ff - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - bundle.js 2.89 KiB 0 [emitted] main - Entrypoint main = bundle.js -Child warnings => true: - Hash: 8d381ad7d9791ae0d2ff - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - bundle.js 2.89 KiB 0 [emitted] main - Entrypoint main = bundle.js -Child [Terser]: - Hash: 8d381ad7d9791ae0d2ff - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - bundle.js 2.89 KiB 0 [emitted] main - Entrypoint main = bundle.js -Child [/Terser/]: - Hash: 8d381ad7d9791ae0d2ff - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - bundle.js 2.89 KiB 0 [emitted] main - Entrypoint main = bundle.js -Child [warnings => true]: - Hash: 8d381ad7d9791ae0d2ff - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - bundle.js 2.89 KiB 0 [emitted] main - Entrypoint main = bundle.js -Child should not filter: - Hash: 8d381ad7d9791ae0d2ff - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - bundle.js 2.89 KiB 0 [emitted] main - Entrypoint main = bundle.js - - WARNING in Terser Plugin: Dropping side-effect-free statement [./index.js:6,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction1 [./index.js:8,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction2 [./index.js:9,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction3 [./index.js:10,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction4 [./index.js:11,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction5 [./index.js:12,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction1 [./a.js:3,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction2 [./a.js:4,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction3 [./a.js:5,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction4 [./a.js:6,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction5 [./a.js:7,0] -Child /should not filter/: - Hash: 8d381ad7d9791ae0d2ff - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - bundle.js 2.89 KiB 0 [emitted] main - Entrypoint main = bundle.js - - WARNING in Terser Plugin: Dropping side-effect-free statement [./index.js:6,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction1 [./index.js:8,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction2 [./index.js:9,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction3 [./index.js:10,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction4 [./index.js:11,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction5 [./index.js:12,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction1 [./a.js:3,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction2 [./a.js:4,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction3 [./a.js:5,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction4 [./a.js:6,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction5 [./a.js:7,0] -Child warnings => false: - Hash: 8d381ad7d9791ae0d2ff - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - bundle.js 2.89 KiB 0 [emitted] main - Entrypoint main = bundle.js - - WARNING in Terser Plugin: Dropping side-effect-free statement [./index.js:6,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction1 [./index.js:8,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction2 [./index.js:9,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction3 [./index.js:10,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction4 [./index.js:11,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction5 [./index.js:12,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction1 [./a.js:3,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction2 [./a.js:4,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction3 [./a.js:5,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction4 [./a.js:6,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction5 [./a.js:7,0] -Child [should not filter]: - Hash: 8d381ad7d9791ae0d2ff - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - bundle.js 2.89 KiB 0 [emitted] main - Entrypoint main = bundle.js - - WARNING in Terser Plugin: Dropping side-effect-free statement [./index.js:6,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction1 [./index.js:8,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction2 [./index.js:9,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction3 [./index.js:10,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction4 [./index.js:11,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction5 [./index.js:12,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction1 [./a.js:3,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction2 [./a.js:4,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction3 [./a.js:5,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction4 [./a.js:6,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction5 [./a.js:7,0] -Child [/should not filter/]: - Hash: 8d381ad7d9791ae0d2ff - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - bundle.js 2.89 KiB 0 [emitted] main - Entrypoint main = bundle.js - - WARNING in Terser Plugin: Dropping side-effect-free statement [./index.js:6,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction1 [./index.js:8,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction2 [./index.js:9,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction3 [./index.js:10,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction4 [./index.js:11,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction5 [./index.js:12,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction1 [./a.js:3,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction2 [./a.js:4,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction3 [./a.js:5,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction4 [./a.js:6,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction5 [./a.js:7,0] -Child [warnings => false]: - Hash: 8d381ad7d9791ae0d2ff - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - bundle.js 2.89 KiB 0 [emitted] main - Entrypoint main = bundle.js - - WARNING in Terser Plugin: Dropping side-effect-free statement [./index.js:6,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction1 [./index.js:8,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction2 [./index.js:9,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction3 [./index.js:10,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction4 [./index.js:11,0] - - WARNING in Terser Plugin: Dropping unused function someUnUsedFunction5 [./index.js:12,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction1 [./a.js:3,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction2 [./a.js:4,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction3 [./a.js:5,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction4 [./a.js:6,0] - - WARNING in Terser Plugin: Dropping unused function someRemoteUnUsedFunction5 [./a.js:7,0]" -`; - -exports[`StatsTestCases should print correct stats for graph-correctness-entries 1`] = ` -"Entrypoint e1 = e1.js -Entrypoint e2 = e2.js -chunk {0} a.js (a) 49 bytes <{2}> <{3}> >{1}< [rendered] - [2] ./module-a.js 49 bytes {0} [built] - import() ./module-a [0] ./e1.js 1:0-47 - import() ./module-a [3] ./module-c.js 1:0-47 -chunk {1} b.js (b) 49 bytes <{0}> >{2}< [rendered] - [4] ./module-b.js 49 bytes {1} [built] - import() ./module-b [2] ./module-a.js 1:0-47 -chunk {2} c.js (c) 49 bytes <{1}> <{4}> >{0}< [rendered] - [3] ./module-c.js 49 bytes {2} [built] - import() ./module-c [1] ./e2.js 1:0-47 - import() ./module-c [4] ./module-b.js 1:0-47 -chunk {3} e1.js (e1) 49 bytes >{0}< [entry] [rendered] - [0] ./e1.js 49 bytes {3} [built] - single entry ./e1 e1 -chunk {4} e2.js (e2) 49 bytes >{2}< [entry] [rendered] - [1] ./e2.js 49 bytes {4} [built] - single entry ./e2 e2" -`; - -exports[`StatsTestCases should print correct stats for graph-correctness-modules 1`] = ` -"Entrypoint e1 = e1.js -Entrypoint e2 = e2.js -chunk {0} a.js (a) 49 bytes <{2}> <{3}> >{1}< [rendered] - [4] ./module-a.js 49 bytes {0} [built] - import() ./module-a [2] ./e1.js 2:0-47 - import() ./module-a [5] ./module-c.js 1:0-47 -chunk {1} b.js (b) 179 bytes <{0}> >{2}< [rendered] - [6] ./module-b.js 179 bytes {1} [built] - import() ./module-b [4] ./module-a.js 1:0-47 -chunk {2} c.js (c) 49 bytes <{1}> <{4}> >{0}< [rendered] - [5] ./module-c.js 49 bytes {2} [built] - import() ./module-c [3] ./e2.js 2:0-47 - import() ./module-c [6] ./module-b.js 1:0-47 -chunk {3} e1.js (e1) 119 bytes >{0}< >{5}< [entry] [rendered] - [0] ./module-x.js 49 bytes {3} {4} [built] - harmony side effect evaluation ./module-x [2] ./e1.js 1:0-20 - harmony side effect evaluation ./module-x [3] ./e2.js 1:0-20 - import() ./module-x [6] ./module-b.js 2:0-20 - [2] ./e1.js 70 bytes {3} [built] - single entry ./e1 e1 -chunk {4} e2.js (e2) 119 bytes >{2}< >{5}< [entry] [rendered] - [0] ./module-x.js 49 bytes {3} {4} [built] - harmony side effect evaluation ./module-x [2] ./e1.js 1:0-20 - harmony side effect evaluation ./module-x [3] ./e2.js 1:0-20 - import() ./module-x [6] ./module-b.js 2:0-20 - [3] ./e2.js 70 bytes {4} [built] - single entry ./e2 e2 -chunk {5} y.js (y) 0 bytes <{3}> <{4}> [rendered] - [1] ./module-y.js 0 bytes {5} [built] - import() ./module-y [0] ./module-x.js 1:0-47" -`; - -exports[`StatsTestCases should print correct stats for import-context-filter 1`] = ` -"Hash: cbf8fc5e9562c9249823 -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - 0.js 305 bytes 0 [emitted] - 1.js 314 bytes 1 [emitted] - 2.js 308 bytes 2 [emitted] -entry.js 9.03 KiB 3 [emitted] entry -Entrypoint entry = entry.js -[0] ./templates/bar.js 38 bytes {0} [optional] [built] -[1] ./templates/baz.js 38 bytes {1} [optional] [built] -[2] ./templates/foo.js 38 bytes {2} [optional] [built] -[3] ./entry.js 450 bytes {3} [built] -[4] ./templates lazy ^\\\\.\\\\/.*$ include: \\\\.js$ exclude: \\\\.noimport\\\\.js$ namespace object 160 bytes {3} [optional] [built]" -`; - -exports[`StatsTestCases should print correct stats for import-weak 1`] = ` -"Hash: 818b39ea7c5c1ff94df3 -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - 1.js 149 bytes 1 [emitted] -entry.js 8.47 KiB 0 [emitted] entry -Entrypoint entry = entry.js -[0] ./modules/b.js 22 bytes {1} [built] -[1] ./entry.js 120 bytes {0} [built] -[2] ./modules/a.js 37 bytes [built]" -`; - -exports[`StatsTestCases should print correct stats for import-with-invalid-options-comments 1`] = ` -"Built at: Thu Jan 01 1970 00:00:00 GMT -[0] ./index.js 50 bytes {2} [built] -[1] ./chunk.js 401 bytes {0} [built] [3 warnings] -[2] ./chunk-a.js 27 bytes {4} [built] -[3] ./chunk-b.js 27 bytes {1} [built] -[4] ./chunk-c.js 27 bytes {5} [built] -[5] ./chunk-d.js 27 bytes {3} [built] - -WARNING in ./chunk.js 4:11-77 -Compilation error while processing magic comment(-s): /* webpack Prefetch: 0, webpackChunkName: \\"notGoingToCompile-c\\" */: Unexpected identifier - @ ./index.js 1:0-49 - -WARNING in ./chunk.js 5:11-38 -Compilation error while processing magic comment(-s): /* webpackPrefetch: nope */: nope is not defined - @ ./index.js 1:0-49 - -WARNING in ./chunk.js 2:11-84 -Compilation error while processing magic comment(-s): /* webpackPrefetch: true, webpackChunkName: notGoingToCompileChunkName */: notGoingToCompileChunkName is not defined - @ ./index.js 1:0-49" -`; - -exports[`StatsTestCases should print correct stats for issue-7577 1`] = ` -"Hash: 3a382f7c6759b0401b6ff9bcd7c310309db5b68ce2bf53b0bf1432b722d8 -Child - Hash: 3a382f7c6759b0401b6f - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - a-all~main-0034bb84916bcade4cc7.js 154 bytes all~main [emitted] all~main - a-main-14ee9c594789bd77b887.js 108 bytes main [emitted] main - a-runtime~main-7b4918090cfe19b7778a.js 6.05 KiB runtime~main [emitted] runtime~main - Entrypoint main = a-runtime~main-7b4918090cfe19b7778a.js a-all~main-0034bb84916bcade4cc7.js a-main-14ee9c594789bd77b887.js - [0] ./a.js 18 bytes {all~main} [built] -Child - Hash: f9bcd7c310309db5b68c - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - b-all~main-3f0b62a9e243706ccaf8.js 468 bytes all~main [emitted] all~main - b-main-09f4ddfc4098d7f3f188.js 123 bytes main [emitted] main - b-runtime~main-7b4918090cfe19b7778a.js 6.05 KiB runtime~main [emitted] runtime~main - b-vendors~main-f7664221ad5d986cf06a.js 163 bytes vendors~main [emitted] vendors~main - Entrypoint main = b-runtime~main-7b4918090cfe19b7778a.js b-vendors~main-f7664221ad5d986cf06a.js b-all~main-3f0b62a9e243706ccaf8.js b-main-09f4ddfc4098d7f3f188.js - [0] ./node_modules/vendor.js 23 bytes {vendors~main} [built] - [1] ./b.js 17 bytes {all~main} [built] -Child - Hash: e2bf53b0bf1432b722d8 - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - c-0-5b8bdddff2dcbbac44bf.js 450 bytes 0 [emitted] - c-1-5eacbd7fee2224716029.js 153 bytes 1 [emitted] - c-all~main-3de9f206741c28715d19.js 305 bytes all~main [emitted] all~main - c-main-75156155081cda3092db.js 114 bytes main [emitted] main - c-runtime~main-a95c7b9d72f76dc9feef.js 8.78 KiB runtime~main [emitted] runtime~main - Entrypoint main = c-runtime~main-a95c7b9d72f76dc9feef.js c-all~main-3de9f206741c28715d19.js c-main-75156155081cda3092db.js (prefetch: c-1-5eacbd7fee2224716029.js c-0-5b8bdddff2dcbbac44bf.js) - [0] ./b.js 17 bytes {0} [built] - [1] ./c.js 61 bytes {all~main} [built] - [2] ./node_modules/vendor.js 23 bytes {1} [built]" -`; - -exports[`StatsTestCases should print correct stats for limit-chunk-count-plugin 1`] = ` -"Hash: 4c228d725cbf3eab49b0c4c4e0337021c38dadbfe19eb8024444df3ec45e8ce9ff5edae99037259a -Child 1 chunks: - Hash: 4c228d725cbf3eab49b0 - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - bundle.js 6.67 KiB 0 [emitted] main - Entrypoint main = bundle.js - chunk {0} bundle.js (main) 219 bytes <{0}> >{0}< [entry] [rendered] - [0] ./index.js 101 bytes {0} [built] - [1] ./a.js 22 bytes {0} [built] - [2] ./b.js 22 bytes {0} [built] - [3] ./c.js 30 bytes {0} [built] - [4] ./d.js 22 bytes {0} [built] - [5] ./e.js 22 bytes {0} [built] -Child 2 chunks: - Hash: c4c4e0337021c38dadbf - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - 0.bundle.js 401 bytes 0 [emitted] - bundle.js 8.46 KiB 1 [emitted] main - Entrypoint main = bundle.js - chunk {0} 0.bundle.js 88 bytes <{1}> [rendered] - [2] ./a.js 22 bytes {0} [built] - [3] ./b.js 22 bytes {0} [built] - [4] ./d.js 22 bytes {0} [built] - [5] ./e.js 22 bytes {0} [built] - chunk {1} bundle.js (main) 131 bytes <{1}> >{0}< >{1}< [entry] [rendered] - [0] ./index.js 101 bytes {1} [built] - [1] ./c.js 30 bytes {1} [built] -Child 3 chunks: - Hash: e19eb8024444df3ec45e - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - 1.bundle.js 245 bytes 1 [emitted] - 2.bundle.js 232 bytes 2 [emitted] - bundle.js 8.46 KiB 0 [emitted] main - Entrypoint main = bundle.js - chunk {0} bundle.js (main) 131 bytes <{0}> >{0}< >{1}< >{2}< [entry] [rendered] - [0] ./index.js 101 bytes {0} [built] - [1] ./c.js 30 bytes {0} [built] - chunk {1} 1.bundle.js 44 bytes <{0}> [rendered] - [2] ./a.js 22 bytes {1} [built] - [3] ./b.js 22 bytes {1} [built] - chunk {2} 2.bundle.js 44 bytes <{0}> [rendered] - [4] ./d.js 22 bytes {2} [built] - [5] ./e.js 22 bytes {2} [built] -Child 4 chunks: - Hash: 8ce9ff5edae99037259a - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - 1.bundle.js 245 bytes 1 [emitted] - 2.bundle.js 152 bytes 2 [emitted] - 3.bundle.js 152 bytes 3 [emitted] - bundle.js 8.46 KiB 0 [emitted] main - Entrypoint main = bundle.js - chunk {0} bundle.js (main) 131 bytes <{0}> >{0}< >{1}< >{2}< >{3}< [entry] [rendered] - [0] ./index.js 101 bytes {0} [built] - [1] ./c.js 30 bytes {0} [built] - chunk {1} 1.bundle.js 44 bytes <{0}> [rendered] - [2] ./a.js 22 bytes {1} [built] - [3] ./b.js 22 bytes {1} [built] - chunk {2} 2.bundle.js 22 bytes <{0}> [rendered] - [4] ./d.js 22 bytes {2} [built] - chunk {3} 3.bundle.js 22 bytes <{0}> [rendered] - [5] ./e.js 22 bytes {3} [built]" -`; - -exports[`StatsTestCases should print correct stats for max-modules 1`] = ` -"Hash: d0b29852af8ccc4949b7 -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -main.js 6.81 KiB 0 [emitted] main -Entrypoint main = main.js - [0] ./a.js?1 33 bytes {0} [built] - [1] ./a.js?2 33 bytes {0} [built] - [2] ./a.js?3 33 bytes {0} [built] - [3] ./a.js?4 33 bytes {0} [built] - [4] ./a.js?5 33 bytes {0} [built] - [5] ./a.js?6 33 bytes {0} [built] - [6] ./a.js?7 33 bytes {0} [built] - [7] ./a.js?8 33 bytes {0} [built] - [8] ./a.js?9 33 bytes {0} [built] - [9] ./a.js?10 33 bytes {0} [built] -[10] ./index.js 181 bytes {0} [built] -[11] ./c.js?1 33 bytes {0} [built] -[13] ./c.js?2 33 bytes {0} [built] -[15] ./c.js?3 33 bytes {0} [built] -[17] ./c.js?4 33 bytes {0} [built] -[19] ./c.js?5 33 bytes {0} [built] -[21] ./c.js?6 33 bytes {0} [built] -[23] ./c.js?7 33 bytes {0} [built] -[25] ./c.js?8 33 bytes {0} [built] -[27] ./c.js?9 33 bytes {0} [built] - + 11 hidden modules" -`; - -exports[`StatsTestCases should print correct stats for max-modules-default 1`] = ` -"Hash: d0b29852af8ccc4949b7 -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -main.js 6.81 KiB 0 [emitted] main -Entrypoint main = main.js - [0] ./a.js?1 33 bytes {0} [built] - [1] ./a.js?2 33 bytes {0} [built] - [2] ./a.js?3 33 bytes {0} [built] - [3] ./a.js?4 33 bytes {0} [built] - [4] ./a.js?5 33 bytes {0} [built] - [5] ./a.js?6 33 bytes {0} [built] - [6] ./a.js?7 33 bytes {0} [built] - [7] ./a.js?8 33 bytes {0} [built] - [8] ./a.js?9 33 bytes {0} [built] - [9] ./a.js?10 33 bytes {0} [built] -[10] ./index.js 181 bytes {0} [built] -[11] ./c.js?1 33 bytes {0} [built] -[13] ./c.js?2 33 bytes {0} [built] -[15] ./c.js?3 33 bytes {0} [built] -[17] ./c.js?4 33 bytes {0} [built] - + 16 hidden modules" -`; - -exports[`StatsTestCases should print correct stats for module-assets 1`] = ` -"Hash: 3800082315c6d35bb423 -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT -Entrypoint main = main.js -chunk {0} main.js (main) 12 bytes >{1}< [entry] [rendered] - [0] ./index.js 12 bytes {0} [built] -chunk {1} 1.js 68 bytes <{0}> [rendered] - [1] ./node_modules/a/index.js 17 bytes {1} [built] - [2] ./node_modules/a/1.png 51 bytes {1} [built] [1 asset] -[0] ./index.js 12 bytes {0} [built] -[1] ./node_modules/a/index.js 17 bytes {1} [built] -[2] ./node_modules/a/1.png 51 bytes {1} [built] [1 asset]" -`; - -exports[`StatsTestCases should print correct stats for module-deduplication 1`] = ` -"Asset Size Chunks Chunk Names - 0.js 730 bytes 0, 6 [emitted] - 1.js 730 bytes 1, 7 [emitted] - 2.js 730 bytes 2, 8 [emitted] - 6.js 661 bytes 6 [emitted] - 7.js 661 bytes 7 [emitted] - 8.js 661 bytes 8 [emitted] -e1.js 9.37 KiB 3 [emitted] e1 -e2.js 9.39 KiB 4 [emitted] e2 -e3.js 9.41 KiB 5 [emitted] e3 -Entrypoint e1 = e1.js -Entrypoint e2 = e2.js -Entrypoint e3 = e3.js -chunk {0} 0.js 37 bytes <{4}> <{5}> [rendered] - [2] ./async1.js 28 bytes {0} {6} [built] - [5] ./d.js 9 bytes {0} {3} [built] -chunk {1} 1.js 37 bytes <{3}> <{5}> [rendered] - [3] ./async2.js 28 bytes {1} {7} [built] - [6] ./f.js 9 bytes {1} {4} [built] -chunk {2} 2.js 37 bytes <{3}> <{4}> [rendered] - [4] ./async3.js 28 bytes {2} {8} [built] - [7] ./h.js 9 bytes {2} {5} [built] -chunk {3} e1.js (e1) 152 bytes >{1}< >{2}< >{6}< [entry] [rendered] - [0] ./b.js 9 bytes {3} {4} {5} [built] - [1] ./a.js 9 bytes {3} {4} {5} [built] - [5] ./d.js 9 bytes {0} {3} [built] - [8] ./e1.js 116 bytes {3} [built] - [9] ./c.js 9 bytes {3} [built] -chunk {4} e2.js (e2) 152 bytes >{0}< >{2}< >{7}< [entry] [rendered] - [0] ./b.js 9 bytes {3} {4} {5} [built] - [1] ./a.js 9 bytes {3} {4} {5} [built] - [6] ./f.js 9 bytes {1} {4} [built] - [10] ./e2.js 116 bytes {4} [built] - [11] ./e.js 9 bytes {4} [built] -chunk {5} e3.js (e3) 152 bytes >{0}< >{1}< >{8}< [entry] [rendered] - [0] ./b.js 9 bytes {3} {4} {5} [built] - [1] ./a.js 9 bytes {3} {4} {5} [built] - [7] ./h.js 9 bytes {2} {5} [built] - [12] ./e3.js 116 bytes {5} [built] - [13] ./g.js 9 bytes {5} [built] -chunk {6} 6.js 28 bytes <{3}> [rendered] - [2] ./async1.js 28 bytes {0} {6} [built] -chunk {7} 7.js 28 bytes <{4}> [rendered] - [3] ./async2.js 28 bytes {1} {7} [built] -chunk {8} 8.js 28 bytes <{5}> [rendered] - [4] ./async3.js 28 bytes {2} {8} [built]" -`; - -exports[`StatsTestCases should print correct stats for module-deduplication-named 1`] = ` -" Asset Size Chunks Chunk Names -async1.js 820 bytes 0 [emitted] async1 -async2.js 820 bytes 1 [emitted] async2 -async3.js 820 bytes 2 [emitted] async3 - e1.js 9.23 KiB 3 [emitted] e1 - e2.js 9.25 KiB 4 [emitted] e2 - e3.js 9.27 KiB 5 [emitted] e3 -Entrypoint e1 = e1.js -Entrypoint e2 = e2.js -Entrypoint e3 = e3.js -chunk {0} async1.js (async1) 89 bytes <{2}> <{3}> >{1}< [rendered] - [2] ./d.js 9 bytes {0} {3} [built] - [11] ./async1.js 80 bytes {0} [built] -chunk {1} async2.js (async2) 89 bytes <{0}> <{4}> >{2}< [rendered] - [3] ./f.js 9 bytes {1} {4} [built] - [12] ./async2.js 80 bytes {1} [built] -chunk {2} async3.js (async3) 89 bytes <{1}> <{5}> >{0}< [rendered] - [4] ./h.js 9 bytes {2} {5} [built] - [13] ./async3.js 80 bytes {2} [built] -chunk {3} e1.js (e1) 144 bytes >{0}< [entry] [rendered] - [0] ./b.js 9 bytes {3} {4} {5} [built] - [1] ./a.js 9 bytes {3} {4} {5} [built] - [2] ./d.js 9 bytes {0} {3} [built] - [5] ./e1.js 108 bytes {3} [built] - [6] ./c.js 9 bytes {3} [built] -chunk {4} e2.js (e2) 144 bytes >{1}< [entry] [rendered] - [0] ./b.js 9 bytes {3} {4} {5} [built] - [1] ./a.js 9 bytes {3} {4} {5} [built] - [3] ./f.js 9 bytes {1} {4} [built] - [7] ./e2.js 108 bytes {4} [built] - [8] ./e.js 9 bytes {4} [built] -chunk {5} e3.js (e3) 144 bytes >{2}< [entry] [rendered] - [0] ./b.js 9 bytes {3} {4} {5} [built] - [1] ./a.js 9 bytes {3} {4} {5} [built] - [4] ./h.js 9 bytes {2} {5} [built] - [9] ./e3.js 108 bytes {5} [built] - [10] ./g.js 9 bytes {5} [built]" -`; - -exports[`StatsTestCases should print correct stats for module-trace-disabled-in-error 1`] = ` -"Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -main.js 3.75 KiB 0 main -Entrypoint main = main.js -[0] ./index.js 25 bytes {0} [built] - -ERROR in ./index.js -Module not found: Error: Can't resolve 'does-not-exist' in 'Xdir/module-trace-disabled-in-error'" -`; - -exports[`StatsTestCases should print correct stats for module-trace-enabled-in-error 1`] = ` -"Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -main.js 3.75 KiB 0 main -Entrypoint main = main.js -[0] ./index.js 25 bytes {0} [built] - -ERROR in ./index.js -Module not found: Error: Can't resolve 'does-not-exist' in 'Xdir/module-trace-enabled-in-error' - @ ./index.js 1:0-25" -`; - -exports[`StatsTestCases should print correct stats for named-chunk-groups 1`] = ` -"Child - Chunk Group main = main.js - Chunk Group async-a = async-a~async-b.js async-a.js - Chunk Group async-b = async-a~async-b.js async-b.js - Chunk Group async-c = vendors.js async-c.js - chunk {0} async-a~async-b.js (async-a~async-b) 133 bytes <{4}> ={1}= ={2}= [rendered] split chunk (cache group: default) (name: async-a~async-b) - > ./a [0] ./index.js 1:0-47 - > ./b [0] ./index.js 2:0-47 - [4] ./shared.js 133 bytes {0} [built] - chunk {1} async-a.js (async-a) 40 bytes <{4}> ={0}= [rendered] - > ./a [0] ./index.js 1:0-47 - [1] ./a.js 40 bytes {1} [built] - chunk {2} async-b.js (async-b) 40 bytes <{4}> ={0}= [rendered] - > ./b [0] ./index.js 2:0-47 - [2] ./b.js 40 bytes {2} [built] - chunk {3} async-c.js (async-c) 45 bytes <{4}> ={5}= [rendered] - > ./c [0] ./index.js 3:0-47 - [3] ./c.js 45 bytes {3} [built] - chunk {4} main.js (main) 146 bytes >{0}< >{1}< >{2}< >{3}< >{5}< [entry] [rendered] - > ./ main - [0] ./index.js 146 bytes {4} [built] - chunk {5} vendors.js (vendors) 40 bytes <{4}> ={3}= [rendered] split chunk (cache group: vendors) (name: vendors) - > ./c [0] ./index.js 3:0-47 - [5] ./node_modules/x.js 20 bytes {5} [built] - [6] ./node_modules/y.js 20 bytes {5} [built] -Child - Entrypoint main = main.js - Chunk Group async-a = async-a~async-b.js async-a.js - Chunk Group async-b = async-a~async-b.js async-b.js - Chunk Group async-c = vendors.js async-c.js - chunk {0} async-a~async-b.js (async-a~async-b) 133 bytes <{4}> ={1}= ={2}= [rendered] split chunk (cache group: default) (name: async-a~async-b) - > ./a [0] ./index.js 1:0-47 - > ./b [0] ./index.js 2:0-47 - [4] ./shared.js 133 bytes {0} [built] - chunk {1} async-a.js (async-a) 40 bytes <{4}> ={0}= [rendered] - > ./a [0] ./index.js 1:0-47 - [1] ./a.js 40 bytes {1} [built] - chunk {2} async-b.js (async-b) 40 bytes <{4}> ={0}= [rendered] - > ./b [0] ./index.js 2:0-47 - [2] ./b.js 40 bytes {2} [built] - chunk {3} async-c.js (async-c) 45 bytes <{4}> ={5}= [rendered] - > ./c [0] ./index.js 3:0-47 - [3] ./c.js 45 bytes {3} [built] - chunk {4} main.js (main) 146 bytes >{0}< >{1}< >{2}< >{3}< >{5}< [entry] [rendered] - > ./ main - [0] ./index.js 146 bytes {4} [built] - chunk {5} vendors.js (vendors) 40 bytes <{4}> ={3}= [rendered] split chunk (cache group: vendors) (name: vendors) - > ./c [0] ./index.js 3:0-47 - [5] ./node_modules/x.js 20 bytes {5} [built] - [6] ./node_modules/y.js 20 bytes {5} [built]" -`; - -exports[`StatsTestCases should print correct stats for named-chunks-plugin 1`] = ` -"Hash: deb7cd22c634f1c52662 -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - entry.js 6.45 KiB entry [emitted] entry -vendor.js 269 bytes vendor [emitted] vendor -Entrypoint entry = vendor.js entry.js -[./entry.js] 72 bytes {entry} [built] -[./modules/a.js] 22 bytes {vendor} [built] -[./modules/b.js] 22 bytes {vendor} [built] -[./modules/c.js] 22 bytes {entry} [built]" -`; - -exports[`StatsTestCases should print correct stats for named-chunks-plugin-async 1`] = ` -"Hash: c90d9bc140f3e8bbd29c -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -chunk-containing-__a_js.js 307 bytes chunk-containing-__a_js [emitted] -chunk-containing-__b_js.js 182 bytes chunk-containing-__b_js [emitted] - entry.js 8.13 KiB entry [emitted] entry -Entrypoint entry = entry.js -[0] ./entry.js 47 bytes {entry} [built] -[1] ./modules/b.js 22 bytes {chunk-containing-__b_js} [built] -[2] ./modules/a.js 37 bytes {chunk-containing-__a_js} [built]" -`; - -exports[`StatsTestCases should print correct stats for no-emit-on-errors-plugin-with-child-error 1`] = ` -"Hash: c07d925d7e60129ffc69 -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -bundle.js 3.57 KiB 0 main - child.js 3.57 KiB -Entrypoint main = bundle.js -[0] ./index.js 0 bytes {0} [built] - -WARNING in configuration -The 'mode' option has not been set, webpack will fallback to 'production' for this value. Set 'mode' option to 'development' or 'production' to enable defaults for each environment. -You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/concepts/mode/ -Child child: - Asset Size Chunks Chunk Names - child.js 3.57 KiB 0 child - Entrypoint child = child.js - [0] ./index.js 0 bytes {0} [built] - - ERROR in forced error" -`; - -exports[`StatsTestCases should print correct stats for optimize-chunks 1`] = ` -"Hash: aa85d85eda19bac37a2e -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - ab.js 183 bytes 1 [emitted] ab - abd.js 250 bytes 2, 1 [emitted] abd - ac in ab.js 130 bytes 3 [emitted] ac in ab - chunk.js 212 bytes 4, 3 [emitted] chunk - cir1.js 299 bytes 0 [emitted] cir1 -cir2 from cir1.js 359 bytes 6, 5 [emitted] cir2 from cir1 - cir2.js 299 bytes 5 [emitted] cir2 - main.js 9.03 KiB 7 [emitted] main -Entrypoint main = main.js -chunk {0} cir1.js (cir1) 81 bytes <{5}> <{7}> >{6}< [rendered] - > [5] ./index.js 13:0-54 - > [7] ./circular2.js 1:0-79 - > [7] ./circular2.js 1:0-79 - [6] ./circular1.js 81 bytes {0} [built] -chunk {1} ab.js (ab) 0 bytes <{7}> >{3}< [rendered] - > [5] ./index.js 1:0-6:8 - [0] ./modules/a.js 0 bytes {1} {2} [built] - [1] ./modules/b.js 0 bytes {1} {2} [built] -chunk {2} abd.js (abd) 0 bytes <{7}> >{4}< [rendered] - > [5] ./index.js 8:0-11:9 - [0] ./modules/a.js 0 bytes {1} {2} [built] - [1] ./modules/b.js 0 bytes {1} {2} [built] - [3] ./modules/d.js 0 bytes {2} {4} [built] -chunk {3} ac in ab.js (ac in ab) 0 bytes <{1}> >{4}< [rendered] - > [5] ./index.js 2:1-5:15 - [4] ./modules/c.js 0 bytes {3} {4} [built] -chunk {4} chunk.js (chunk) 0 bytes <{2}> <{3}> [rendered] - > [5] ./index.js 3:2-4:13 - > [5] ./index.js 9:1-10:12 - [3] ./modules/d.js 0 bytes {2} {4} [built] - [4] ./modules/c.js 0 bytes {3} {4} [built] -chunk {5} cir2.js (cir2) 81 bytes <{7}> >{0}< [rendered] - > [5] ./index.js 14:0-54 - [7] ./circular2.js 81 bytes {5} {6} [built] -chunk {6} cir2 from cir1.js (cir2 from cir1) 81 bytes <{0}> [rendered] - > [6] ./circular1.js 1:0-79 - > [6] ./circular1.js 1:0-79 - [7] ./circular2.js 81 bytes {5} {6} [built] - [8] ./modules/e.js 0 bytes {6} [built] -chunk {7} main.js (main) 523 bytes >{0}< >{1}< >{2}< >{5}< [entry] [rendered] - > ./index main - [2] ./modules/f.js 0 bytes {7} [built] - [5] ./index.js 523 bytes {7} [built]" -`; - -exports[`StatsTestCases should print correct stats for parse-error 1`] = ` -" Asset Size Chunks Chunk Names -main.js 4.01 KiB 0 main -Entrypoint main = main.js -[0] ./b.js 169 bytes {0} [built] [failed] [1 error] -[1] ./index.js + 1 modules 35 bytes {0} [built] - | ./index.js 15 bytes [built] - | ./a.js 15 bytes [built] - -ERROR in ./b.js 6:7 -Module parse failed: Unexpected token (6:7) -You may need an appropriate loader to handle this file type. -| includes -| a -> parser ) -| error -| in - @ ./a.js 2:0-13 - @ ./index.js" -`; - -exports[`StatsTestCases should print correct stats for performance-different-mode-and-target 1`] = ` -"Hash: fdd848419e60e2d013b0259ddac6a2fc2be16d5d2ff383e3c2c0c58d07840c13a912a795f6e4940364a02963586e6b6811420c13a912a795f6e494032ff383e3c2c0c58d0784 -Child - Hash: fdd848419e60e2d013b0 - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - warning.pro-web.js 297 KiB 0 [emitted] [big] main - Entrypoint main [big] = warning.pro-web.js - [0] ./index.js 293 KiB {0} [built] - - WARNING in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB). - This can impact web performance. - Assets: - warning.pro-web.js (297 KiB) - - WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance. - Entrypoints: - main (297 KiB) - warning.pro-web.js - - - WARNING in webpack performance recommendations: - You can limit the size of your bundles by using import() or require.ensure to lazy load some parts of your application. - For more info visit https://webpack.js.org/guides/code-splitting/ -Child - Hash: 259ddac6a2fc2be16d5d - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - warning.pro-webworker.js 297 KiB 0 [emitted] [big] main - Entrypoint main [big] = warning.pro-webworker.js - [0] ./index.js 293 KiB {0} [built] - - WARNING in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB). - This can impact web performance. - Assets: - warning.pro-webworker.js (297 KiB) - - WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance. - Entrypoints: - main (297 KiB) - warning.pro-webworker.js - - - WARNING in webpack performance recommendations: - You can limit the size of your bundles by using import() or require.ensure to lazy load some parts of your application. - For more info visit https://webpack.js.org/guides/code-splitting/ -Child - Hash: 2ff383e3c2c0c58d0784 - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - no-warning.pro-node.js 297 KiB 0 [emitted] main - Entrypoint main = no-warning.pro-node.js - [0] ./index.js 293 KiB {0} [built] -Child - Hash: 0c13a912a795f6e49403 - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - no-warning.dev-web.js 1.72 MiB main [emitted] main - Entrypoint main = no-warning.dev-web.js - [./index.js] 293 KiB {main} [built] -Child - Hash: 64a02963586e6b681142 - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - no-warning.dev-node.js 1.72 MiB main [emitted] main - Entrypoint main = no-warning.dev-node.js - [./index.js] 293 KiB {main} [built] -Child - Hash: 0c13a912a795f6e49403 - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - no-warning.dev-web-with-limit-set.js 1.72 MiB main [emitted] [big] main - Entrypoint main [big] = no-warning.dev-web-with-limit-set.js - [./index.js] 293 KiB {main} [built] -Child - Hash: 2ff383e3c2c0c58d0784 - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - warning.pro-node-with-hints-set.js 297 KiB 0 [emitted] [big] main - Entrypoint main [big] = warning.pro-node-with-hints-set.js - [0] ./index.js 293 KiB {0} [built] - - WARNING in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB). - This can impact web performance. - Assets: - warning.pro-node-with-hints-set.js (297 KiB) - - WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance. - Entrypoints: - main (297 KiB) - warning.pro-node-with-hints-set.js - - - WARNING in webpack performance recommendations: - You can limit the size of your bundles by using import() or require.ensure to lazy load some parts of your application. - For more info visit https://webpack.js.org/guides/code-splitting/" -`; - -exports[`StatsTestCases should print correct stats for performance-disabled 1`] = ` -"Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - 1.js 232 bytes 1 [emitted] - 2.js 152 bytes 2 [emitted] - 3.js 289 bytes 3 [emitted] -main.js 301 KiB 0 [emitted] main -Entrypoint main = main.js -[0] ./index.js 52 bytes {0} [built] -[1] ./a.js 293 KiB {0} [built] -[2] ./b.js 22 bytes {2} [built] -[3] ./c.js 54 bytes {3} [built] -[4] ./d.js 22 bytes {1} [built] -[5] ./e.js 22 bytes {1} [built]" -`; - -exports[`StatsTestCases should print correct stats for performance-error 1`] = ` -"Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - 1.js 232 bytes 1 [emitted] - 2.js 152 bytes 2 [emitted] - 3.js 289 bytes 3 [emitted] -main.js 301 KiB 0 [emitted] [big] main -Entrypoint main [big] = main.js -[0] ./index.js 52 bytes {0} [built] -[1] ./a.js 293 KiB {0} [built] -[2] ./b.js 22 bytes {2} [built] -[3] ./c.js 54 bytes {3} [built] -[4] ./d.js 22 bytes {1} [built] -[5] ./e.js 22 bytes {1} [built] - -ERROR in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB). -This can impact web performance. -Assets: - main.js (301 KiB) - -ERROR in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance. -Entrypoints: - main (301 KiB) - main.js -" -`; - -exports[`StatsTestCases should print correct stats for performance-no-async-chunks-shown 1`] = ` -"Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -main.js 297 KiB 0 [emitted] [big] main - sec.js 3.91 KiB 1 [emitted] sec -Entrypoint main [big] = main.js -Entrypoint sec = sec.js -[0] ./b.js 22 bytes {0} {1} [built] -[1] ./index.js 32 bytes {0} [built] -[2] ./a.js 293 KiB {0} [built] -[3] ./index2.js 48 bytes {1} [built] -[4] ./c.js 22 bytes {1} [built] -[5] ./d.js 22 bytes {1} [built] - -WARNING in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB). -This can impact web performance. -Assets: - main.js (297 KiB) - -WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance. -Entrypoints: - main (297 KiB) - main.js - - -WARNING in webpack performance recommendations: -You can limit the size of your bundles by using import() or require.ensure to lazy load some parts of your application. -For more info visit https://webpack.js.org/guides/code-splitting/" -`; - -exports[`StatsTestCases should print correct stats for performance-no-hints 1`] = ` -"Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - 1.js 232 bytes 1 [emitted] - 2.js 152 bytes 2 [emitted] - 3.js 289 bytes 3 [emitted] -main.js 301 KiB 0 [emitted] [big] main -Entrypoint main [big] = main.js -[0] ./index.js 52 bytes {0} [built] -[1] ./a.js 293 KiB {0} [built] -[2] ./b.js 22 bytes {2} [built] -[3] ./c.js 54 bytes {3} [built] -[4] ./d.js 22 bytes {1} [built] -[5] ./e.js 22 bytes {1} [built]" -`; - -exports[`StatsTestCases should print correct stats for performance-oversize-limit-error 1`] = ` -"Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -main.js 297 KiB 0 [emitted] [big] main - sec.js 297 KiB 1 [emitted] [big] sec -Entrypoint main [big] = main.js -Entrypoint sec [big] = sec.js -[0] ./a.js 293 KiB {0} {1} [built] -[1] ./index.js 16 bytes {0} [built] -[2] ./index2.js 16 bytes {1} [built] - -ERROR in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB). -This can impact web performance. -Assets: - main.js (297 KiB) - sec.js (297 KiB) - -ERROR in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance. -Entrypoints: - main (297 KiB) - main.js - sec (297 KiB) - sec.js - - -ERROR in webpack performance recommendations: -You can limit the size of your bundles by using import() or require.ensure to lazy load some parts of your application. -For more info visit https://webpack.js.org/guides/code-splitting/" -`; - -exports[`StatsTestCases should print correct stats for prefetch 1`] = ` -" Asset Size Chunks Chunk Names - inner.js 130 bytes 0 [emitted] inner - inner2.js 188 bytes 1 [emitted] inner2 - main.js 9.55 KiB 2 [emitted] main - normal.js 130 bytes 3 [emitted] normal - prefetched.js 475 bytes 4 [emitted] prefetched -prefetched2.js 127 bytes 5 [emitted] prefetched2 -prefetched3.js 130 bytes 6 [emitted] prefetched3 -Entrypoint main = main.js (prefetch: prefetched2.js prefetched.js prefetched3.js) -chunk {0} inner.js (inner) 0 bytes <{4}> [rendered] -chunk {1} inner2.js (inner2) 0 bytes <{4}> [rendered] -chunk {2} main.js (main) 436 bytes >{3}< >{4}< >{5}< >{6}< (prefetch: {5} {4} {6}) [entry] [rendered] -chunk {3} normal.js (normal) 0 bytes <{2}> [rendered] -chunk {4} prefetched.js (prefetched) 228 bytes <{2}> >{0}< >{1}< (prefetch: {1} {0}) [rendered] -chunk {5} prefetched2.js (prefetched2) 0 bytes <{2}> [rendered] -chunk {6} prefetched3.js (prefetched3) 0 bytes <{2}> [rendered]" -`; - -exports[`StatsTestCases should print correct stats for prefetch-preload-mixed 1`] = ` -"chunk {0} a.js (a) 136 bytes <{10}> >{1}< >{2}< (prefetch: {1} {2}) [rendered] -chunk {1} a1.js (a1) 0 bytes <{0}> [rendered] -chunk {2} a2.js (a2) 0 bytes <{0}> [rendered] -chunk {3} b.js (b) 203 bytes <{10}> >{4}< >{5}< >{6}< (prefetch: {4} {6}) (preload: {5}) [rendered] -chunk {4} b1.js (b1) 0 bytes <{3}> [rendered] -chunk {5} b2.js (b2) 0 bytes <{3}> [rendered] -chunk {6} b3.js (b3) 0 bytes <{3}> [rendered] -chunk {7} c.js (c) 134 bytes <{10}> >{8}< >{9}< (preload: {8} {9}) [rendered] -chunk {8} c1.js (c1) 0 bytes <{7}> [rendered] -chunk {9} c2.js (c2) 0 bytes <{7}> [rendered] -chunk {10} main.js (main) 195 bytes >{0}< >{3}< >{7}< (prefetch: {0} {3} {7}) [entry] [rendered]" -`; - -exports[`StatsTestCases should print correct stats for preload 1`] = ` -" Asset Size Chunks Chunk Names - inner.js 130 bytes 0 [emitted] inner - inner2.js 188 bytes 1 [emitted] inner2 - main.js 9.75 KiB 2 [emitted] main - normal.js 130 bytes 3 [emitted] normal - preloaded.js 467 bytes 4 [emitted] preloaded -preloaded2.js 127 bytes 5 [emitted] preloaded2 -preloaded3.js 130 bytes 6 [emitted] preloaded3 -Entrypoint main = main.js (preload: preloaded2.js preloaded.js preloaded3.js) -chunk {0} inner.js (inner) 0 bytes <{4}> [rendered] -chunk {1} inner2.js (inner2) 0 bytes <{4}> [rendered] -chunk {2} main.js (main) 424 bytes >{3}< >{4}< >{5}< >{6}< (preload: {5} {4} {6}) [entry] [rendered] -chunk {3} normal.js (normal) 0 bytes <{2}> [rendered] -chunk {4} preloaded.js (preloaded) 226 bytes <{2}> >{0}< >{1}< (preload: {1} {0}) [rendered] -chunk {5} preloaded2.js (preloaded2) 0 bytes <{2}> [rendered] -chunk {6} preloaded3.js (preloaded3) 0 bytes <{2}> [rendered]" -`; - -exports[`StatsTestCases should print correct stats for preset-detailed 1`] = ` -"Hash: 934b93428d78d30a6bf2 -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - 1.js 232 bytes 1 [emitted] - 2.js 152 bytes 2 [emitted] - 3.js 289 bytes 3 [emitted] -main.js 8.23 KiB 0 [emitted] main -Entrypoint main = main.js -chunk {0} main.js (main) 73 bytes >{2}< >{3}< [entry] [rendered] - > ./index main -chunk {1} 1.js 44 bytes <{3}> [rendered] - > [3] ./c.js 1:0-52 -chunk {2} 2.js 22 bytes <{0}> [rendered] - > ./b [0] ./index.js 2:0-16 -chunk {3} 3.js 54 bytes <{0}> >{1}< [rendered] - > ./c [0] ./index.js 3:0-16 -[0] ./index.js 51 bytes {0} [depth 0] [built] - ModuleConcatenation bailout: Module is not an ECMAScript module -[1] ./a.js 22 bytes {0} [depth 1] [built] - ModuleConcatenation bailout: Module is not an ECMAScript module -[2] ./b.js 22 bytes {2} [depth 1] [built] - ModuleConcatenation bailout: Module is not an ECMAScript module -[3] ./c.js 54 bytes {3} [depth 1] [built] - ModuleConcatenation bailout: Module is not an ECMAScript module -[4] ./d.js 22 bytes {1} [depth 2] [built] - ModuleConcatenation bailout: Module is not an ECMAScript module -[5] ./e.js 22 bytes {1} [depth 2] [built] - ModuleConcatenation bailout: Module is not an ECMAScript module" -`; - -exports[`StatsTestCases should print correct stats for preset-errors-only 1`] = `""`; - -exports[`StatsTestCases should print correct stats for preset-errors-only-error 1`] = ` -" -ERROR in ./index.js -Module not found: Error: Can't resolve 'does-not-exist' in 'Xdir/preset-errors-only-error' - @ ./index.js 1:0-25" -`; - -exports[`StatsTestCases should print correct stats for preset-minimal 1`] = `" 6 modules"`; - -exports[`StatsTestCases should print correct stats for preset-minimal-simple 1`] = `" 1 module"`; - -exports[`StatsTestCases should print correct stats for preset-mixed-array 1`] = ` -"Child minimal: - 1 module -Child verbose: - Entrypoint main = main.js - [0] ./index.js 8 bytes {0} [built]" -`; - -exports[`StatsTestCases should print correct stats for preset-none 1`] = `""`; - -exports[`StatsTestCases should print correct stats for preset-none-array 1`] = `""`; - -exports[`StatsTestCases should print correct stats for preset-none-error 1`] = `""`; - -exports[`StatsTestCases should print correct stats for preset-normal 1`] = ` -"Hash: 934b93428d78d30a6bf2 -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - 1.js 232 bytes 1 [emitted] - 2.js 152 bytes 2 [emitted] - 3.js 289 bytes 3 [emitted] -main.js 8.23 KiB 0 [emitted] main -Entrypoint main = main.js -[0] ./index.js 51 bytes {0} [built] -[1] ./a.js 22 bytes {0} [built] -[2] ./b.js 22 bytes {2} [built] -[3] ./c.js 54 bytes {3} [built] -[4] ./d.js 22 bytes {1} [built] -[5] ./e.js 22 bytes {1} [built]" -`; - -exports[`StatsTestCases should print correct stats for preset-normal-performance 1`] = ` -"Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - 1.js 232 bytes 1 [emitted] - 2.js 152 bytes 2 [emitted] - 3.js 289 bytes 3 [emitted] -main.js 301 KiB 0 [emitted] [big] main -Entrypoint main [big] = main.js -[0] ./index.js 52 bytes {0} [built] -[1] ./a.js 293 KiB {0} [built] -[2] ./b.js 22 bytes {2} [built] -[3] ./c.js 54 bytes {3} [built] -[4] ./d.js 22 bytes {1} [built] -[5] ./e.js 22 bytes {1} [built] - -WARNING in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB). -This can impact web performance. -Assets: - main.js (301 KiB) - -WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance. -Entrypoints: - main (301 KiB) - main.js -" -`; - -exports[`StatsTestCases should print correct stats for preset-normal-performance-ensure-filter-sourcemaps 1`] = ` -"Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - 1.js 262 bytes 1 [emitted] - 1.js.map 216 bytes 1 [emitted] - 2.js 182 bytes 2 [emitted] - 2.js.map 156 bytes 2 [emitted] - 3.js 319 bytes 3 [emitted] - 3.js.map 210 bytes 3 [emitted] - main.js 301 KiB 0 [emitted] [big] main -main.js.map 1.72 MiB 0 [emitted] main -Entrypoint main [big] = main.js main.js.map -[0] ./index.js 52 bytes {0} [built] -[1] ./a.js 293 KiB {0} [built] -[2] ./b.js 22 bytes {2} [built] -[3] ./c.js 54 bytes {3} [built] -[4] ./d.js 22 bytes {1} [built] -[5] ./e.js 22 bytes {1} [built] - -WARNING in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB). -This can impact web performance. -Assets: - main.js (301 KiB) - -WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance. -Entrypoints: - main (301 KiB) - main.js -" -`; - -exports[`StatsTestCases should print correct stats for preset-verbose 1`] = ` -"Hash: 934b93428d78d30a6bf2 -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - 1.js 232 bytes 1 [emitted] - 2.js 152 bytes 2 [emitted] - 3.js 289 bytes 3 [emitted] -main.js 8.23 KiB 0 [emitted] main -Entrypoint main = main.js -chunk {0} main.js (main) 73 bytes >{2}< >{3}< [entry] [rendered] - > ./index main - [0] ./index.js 51 bytes {0} [depth 0] [built] - ModuleConcatenation bailout: Module is not an ECMAScript module - single entry ./index main - factory:Xms building:Xms = Xms - [1] ./a.js 22 bytes {0} [depth 1] [built] - ModuleConcatenation bailout: Module is not an ECMAScript module - cjs require ./a [0] ./index.js 1:0-14 - [0] Xms -> factory:Xms building:Xms = Xms -chunk {1} 1.js 44 bytes <{3}> [rendered] - > [3] ./c.js 1:0-52 - [4] ./d.js 22 bytes {1} [depth 2] [built] - ModuleConcatenation bailout: Module is not an ECMAScript module - require.ensure item ./d [3] ./c.js 1:0-52 - [0] Xms -> [3] Xms -> factory:Xms building:Xms = Xms - [5] ./e.js 22 bytes {1} [depth 2] [built] - ModuleConcatenation bailout: Module is not an ECMAScript module - require.ensure item ./e [3] ./c.js 1:0-52 - [0] Xms -> [3] Xms -> factory:Xms building:Xms = Xms -chunk {2} 2.js 22 bytes <{0}> [rendered] - > ./b [0] ./index.js 2:0-16 - [2] ./b.js 22 bytes {2} [depth 1] [built] - ModuleConcatenation bailout: Module is not an ECMAScript module - amd require ./b [0] ./index.js 2:0-16 - [0] Xms -> factory:Xms building:Xms = Xms -chunk {3} 3.js 54 bytes <{0}> >{1}< [rendered] - > ./c [0] ./index.js 3:0-16 - [3] ./c.js 54 bytes {3} [depth 1] [built] - ModuleConcatenation bailout: Module is not an ECMAScript module - amd require ./c [0] ./index.js 3:0-16 - [0] Xms -> factory:Xms building:Xms = Xms" -`; - -exports[`StatsTestCases should print correct stats for resolve-plugin-context 1`] = ` -"Hash: d16253da1f9a8f6c689f -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -bundle.js 3.97 KiB 0 [emitted] main -Entrypoint main = bundle.js -[0] ./node_modules/xyz/index.js 0 bytes {0} [built] -[1] ./index.js 48 bytes {0} [built] -[2] ./node_modules/abc/index.js 16 bytes {0} [built] -[3] ./node_modules/def/index.js 16 bytes {0} [built] -[4] ./node_modules/def/node_modules/xyz/index.js 0 bytes {0} [built]" -`; - -exports[`StatsTestCases should print correct stats for reverse-sort-modules 1`] = ` -"Hash: d0b29852af8ccc4949b7 -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -main.js 6.81 KiB 0 [emitted] main -Entrypoint main = main.js -[27] ./c.js?9 33 bytes {0} [built] -[25] ./c.js?8 33 bytes {0} [built] -[23] ./c.js?7 33 bytes {0} [built] -[21] ./c.js?6 33 bytes {0} [built] -[19] ./c.js?5 33 bytes {0} [built] -[17] ./c.js?4 33 bytes {0} [built] -[15] ./c.js?3 33 bytes {0} [built] -[13] ./c.js?2 33 bytes {0} [built] -[11] ./c.js?1 33 bytes {0} [built] -[10] ./index.js 181 bytes {0} [built] - [9] ./a.js?10 33 bytes {0} [built] - [8] ./a.js?9 33 bytes {0} [built] - [7] ./a.js?8 33 bytes {0} [built] - [6] ./a.js?7 33 bytes {0} [built] - [5] ./a.js?6 33 bytes {0} [built] - [4] ./a.js?5 33 bytes {0} [built] - [3] ./a.js?4 33 bytes {0} [built] - [2] ./a.js?3 33 bytes {0} [built] - [1] ./a.js?2 33 bytes {0} [built] - [0] ./a.js?1 33 bytes {0} [built] - + 11 hidden modules" -`; - -exports[`StatsTestCases should print correct stats for runtime-chunk 1`] = ` -"Entrypoint e1 = runtime~e1.js e1.js -Entrypoint e2 = runtime~e2.js e2.js" -`; - -exports[`StatsTestCases should print correct stats for runtime-chunk-integration 1`] = ` -"Child base: - Asset Size Chunks Chunk Names - 0.js 728 bytes 0 [emitted] - main1.js 539 bytes 1 [emitted] main1 - runtime.js 8.7 KiB 2 [emitted] runtime - Entrypoint main1 = runtime.js main1.js - [0] ./main1.js 66 bytes {1} [built] - [1] ./b.js 20 bytes {0} [built] - [2] ./c.js 20 bytes {0} [built] - [3] ./d.js 20 bytes {0} [built] -Child manifest is named entry: - Asset Size Chunks Chunk Names - 0.js 737 bytes 0 [emitted] - main1.js 539 bytes 2 [emitted] main1 - manifest.js 9.01 KiB 1 [emitted] manifest - Entrypoint main1 = manifest.js main1.js - Entrypoint manifest = manifest.js - [0] ./main1.js 66 bytes {2} [built] - [1] ./f.js 20 bytes {1} [built] - [2] ./b.js 20 bytes {0} [built] - [3] ./c.js 20 bytes {0} [built] - [4] ./d.js 20 bytes {0} [built]" -`; - -exports[`StatsTestCases should print correct stats for runtime-chunk-issue-7382 1`] = ` -"Entrypoint e1 = runtime.js all.js e1.js -Entrypoint e2 = runtime.js all.js e2.js" -`; - -exports[`StatsTestCases should print correct stats for runtime-chunk-single 1`] = ` -"Entrypoint e1 = runtime.js e1.js -Entrypoint e2 = runtime.js e2.js" -`; - -exports[`StatsTestCases should print correct stats for scope-hoisting-bailouts 1`] = ` -"Hash: 21b74df86e904b9e34c1 -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT -Entrypoint index = index.js -Entrypoint entry = entry.js -[0] ./entry.js 32 bytes {0} {1} [built] - ModuleConcatenation bailout: Module is an entry point -[1] ./ref-from-cjs.js 45 bytes {1} [built] - ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./cjs.js (referenced with cjs require) -[2] ./index.js 176 bytes {1} [built] - ModuleConcatenation bailout: Module is an entry point -[3] ./cjs.js 59 bytes {1} [built] - ModuleConcatenation bailout: Module is not an ECMAScript module -[4] ./eval.js 35 bytes {1} [built] - ModuleConcatenation bailout: Module uses eval() -[5] ./injected-vars.js 40 bytes {1} [built] - ModuleConcatenation bailout: Module uses injected variables (__dirname, __filename) -[6] ./module-id.js 26 bytes {1} [built] - ModuleConcatenation bailout: Module uses module.id -[7] ./module-loaded.js 30 bytes {1} [built] - ModuleConcatenation bailout: Module uses module.loaded -[8] external \\"external\\" 42 bytes {1} [built] - ModuleConcatenation bailout: Module is not an ECMAScript module -[9] ./concatenated.js + 2 modules 116 bytes {2} [built] - ModuleConcatenation bailout: Cannot concat with external \\"external\\" (<- Module is not an ECMAScript module) - | ./concatenated.js 26 bytes [built] - | ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./index.js (referenced with import()) - | ./concatenated1.js 37 bytes [built] - | ./concatenated2.js 48 bytes [built]" -`; - -exports[`StatsTestCases should print correct stats for scope-hoisting-multi 1`] = ` -"Hash: e9ee59c952da1a23368e3ae60c31c1c21dd62d86 -Child - Hash: e9ee59c952da1a23368e - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Entrypoint first = vendor.js first.js - Entrypoint second = vendor.js second.js - [0] ./common2.js 25 bytes {1} {5} [built] - [1] ./common.js 37 bytes {1} {5} [built] - [2] ./vendor.js 25 bytes {0} [built] - [3] ./lazy_shared.js 31 bytes {4} [built] - [4] ./first.js 207 bytes {1} [built] - [5] ./module_first.js 31 bytes {1} [built] - [6] ./second.js 177 bytes {5} [built] - [7] ./lazy_first.js 55 bytes {2} [built] - [8] ./lazy_second.js 55 bytes {3} [built] - [9] ./common_lazy_shared.js 25 bytes {2} {3} {4} [built] - [10] ./common_lazy.js 25 bytes {2} {3} [built] -Child - Hash: 3ae60c31c1c21dd62d86 - Time: Xms - Built at: Thu Jan 01 1970 00:00:00 GMT - Entrypoint first = vendor.js first.js - Entrypoint second = vendor.js second.js - [0] ./common.js + 1 modules 62 bytes {1} {5} [built] - | ./common.js 37 bytes [built] - | ./common2.js 25 bytes [built] - [1] ./vendor.js 25 bytes {0} [built] - [2] ./second.js 177 bytes {5} [built] - ModuleConcatenation bailout: Module is an entry point - [3] ./first.js + 1 modules 248 bytes {1} [built] - ModuleConcatenation bailout: Cannot concat with ./common.js - ModuleConcatenation bailout: Cannot concat with ./vendor.js - | ./first.js 207 bytes [built] - | ModuleConcatenation bailout: Module is an entry point - | ./module_first.js 31 bytes [built] - [4] ./lazy_shared.js 31 bytes {4} [built] - ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./first.js (referenced with import()), ./second.js (referenced with import()) - [5] ./lazy_second.js 55 bytes {3} [built] - ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./second.js (referenced with import()) - [6] ./common_lazy_shared.js 25 bytes {2} {3} {4} [built] - [7] ./common_lazy.js 25 bytes {2} {3} [built] - [8] ./lazy_first.js 55 bytes {2} [built] - ModuleConcatenation bailout: Module is referenced from these modules with unsupported syntax: ./first.js (referenced with import())" -`; - -exports[`StatsTestCases should print correct stats for side-effects-issue-7428 1`] = ` -"Hash: 1db323720a3bbea98b3b -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names - 1.js 481 bytes 1 [emitted] -main.js 9.29 KiB 0 [emitted] main -Entrypoint main = main.js -[0] ./components/src/CompAB/index.js 87 bytes [built] - [no exports used] - harmony side effect evaluation ./CompAB [3] ./components/src/index.js 1:0-40 - harmony export imported specifier ./CompAB [3] ./components/src/index.js 1:0-40 - harmony export imported specifier ./CompAB [3] ./components/src/index.js 1:0-40 -[1] ./components/src/CompC/CompC.js 33 bytes [built] - [no exports used] - harmony side effect evaluation ./CompC [2] ./components/src/CompC/index.js 1:0-34 - harmony export imported specifier ./CompC [2] ./components/src/CompC/index.js 1:0-34 -[2] ./components/src/CompC/index.js 34 bytes [built] - [no exports used] - harmony side effect evaluation ./CompC [3] ./components/src/index.js 2:0-43 - harmony export imported specifier ./CompC [3] ./components/src/index.js 2:0-43 -[3] ./components/src/index.js 84 bytes [built] - [no exports used] - harmony side effect evaluation ./components [6] ./foo.js 1:0-37 - harmony side effect evaluation ./components [7] ./main.js + 1 modules 1:0-44 -[4] ./components/src/CompAB/CompA.js 89 bytes {0} [built] - [only some exports used: default] - harmony side effect evaluation ./CompA [0] ./components/src/CompAB/index.js 1:0-43 - harmony export imported specifier ./CompA [0] ./components/src/CompAB/index.js 1:0-43 - harmony import specifier ./components [6] ./foo.js 3:20-25 (skipped side-effect-free modules) - harmony import specifier ./components ./main.js 3:15-20 (skipped side-effect-free modules) -[5] ./components/src/CompAB/utils.js 97 bytes {0} [built] - harmony side effect evaluation ./utils [4] ./components/src/CompAB/CompA.js 1:0-35 - harmony import specifier ./utils [4] ./components/src/CompAB/CompA.js 5:5-12 - harmony side effect evaluation ./utils [7] ./main.js + 1 modules 1:0-30 - harmony import specifier ./utils [7] ./main.js + 1 modules 5:2-5 -[6] ./foo.js 101 bytes {1} [built] - import() ./foo ./main.js 6:0-15 -[7] ./main.js + 1 modules 231 bytes {0} [built] - single entry ./main.js main - | ./main.js 144 bytes [built] - | single entry ./main.js main - | ./components/src/CompAB/CompB.js 77 bytes [built] - | [only some exports used: default] - | harmony side effect evaluation ./CompB [0] ./components/src/CompAB/index.js 2:0-43 - | harmony export imported specifier ./CompB [0] ./components/src/CompAB/index.js 2:0-43 - | harmony import specifier ./components ./main.js 4:15-20 (skipped side-effect-free modules)" -`; - -exports[`StatsTestCases should print correct stats for side-effects-simple-unused 1`] = ` -"Hash: 518ad50555bd6e64c28b -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -main.js 3.9 KiB 0 [emitted] main -Entrypoint main = main.js -[0] ./node_modules/pmodule/b.js 69 bytes [built] - [no exports used] -[1] ./node_modules/pmodule/a.js 60 bytes [built] - [no exports used] -[2] ./index.js + 2 modules 158 bytes {0} [built] - | ./index.js 55 bytes [built] - | ./node_modules/pmodule/index.js 75 bytes [built] - | [only some exports used: default] - | ./node_modules/pmodule/c.js 28 bytes [built] - | [only some exports used: z]" -`; - -exports[`StatsTestCases should print correct stats for simple 1`] = ` -"Hash: dae46aaa6722cda9498d -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -bundle.js 3.75 KiB main [emitted] main -Entrypoint main = bundle.js -[./index.js] 0 bytes {main} [built]" -`; - -exports[`StatsTestCases should print correct stats for simple-more-info 1`] = ` -"Hash: 008517b920c1aeb23c7e -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -bundle.js 3.57 KiB 0 [emitted] main -Entrypoint main = bundle.js -[0] ./index.js 0 bytes {0} [built] - single entry ./index main - factory:Xms building:Xms = Xms" -`; - -exports[`StatsTestCases should print correct stats for split-chunks 1`] = ` -"Child default: - Entrypoint main = default/main.js - Entrypoint a = default/a.js - Entrypoint b = default/b.js - Entrypoint c = default/c.js - chunk {0} default/async-a~async-b~async-c.js (async-a~async-b~async-c) 20 bytes <{11}> ={1}= ={2}= ={3}= ={5}= ={6}= ={7}= ={12}= >{1}< >{8}< [rendered] split chunk (cache group: default) (name: async-a~async-b~async-c) - > ./a [8] ./index.js 1:0-47 - > ./b [8] ./index.js 2:0-47 - > ./c [8] ./index.js 3:0-47 - [0] ./d.js 20 bytes {0} {4} {9} {10} [built] - chunk {1} default/async-b~async-c~async-g.js (async-b~async-c~async-g) 20 bytes <{0}> <{2}> <{3}> <{4}> <{5}> <{11}> ={0}= ={2}= ={3}= ={6}= ={7}= ={8}= ={12}= [rendered] split chunk (cache group: default) (name: async-b~async-c~async-g) - > ./b [8] ./index.js 2:0-47 - > ./c [8] ./index.js 3:0-47 - > ./g [] 6:0-47 - > ./g [] 6:0-47 - [2] ./f.js 20 bytes {1} {9} {10} [built] - chunk {2} default/vendors~async-a~async-b~async-c.js (vendors~async-a~async-b~async-c) 20 bytes <{11}> ={0}= ={1}= ={3}= ={5}= ={6}= ={7}= ={12}= >{1}< >{8}< [rendered] split chunk (cache group: vendors) (name: vendors~async-a~async-b~async-c) - > ./a [8] ./index.js 1:0-47 - > ./b [8] ./index.js 2:0-47 - > ./c [8] ./index.js 3:0-47 - [1] ./node_modules/x.js 20 bytes {2} {4} {9} {10} [built] - chunk {3} default/vendors~async-a~async-b.js (vendors~async-a~async-b) 20 bytes <{11}> ={0}= ={1}= ={2}= ={5}= ={6}= >{1}< >{8}< [rendered] split chunk (cache group: vendors) (name: vendors~async-a~async-b) - > ./a [8] ./index.js 1:0-47 - > ./b [8] ./index.js 2:0-47 - [3] ./node_modules/y.js 20 bytes {3} {4} {9} [built] - chunk {4} default/a.js (a) 216 bytes >{1}< >{8}< [entry] [rendered] - > ./a a - [0] ./d.js 20 bytes {0} {4} {9} {10} [built] - [1] ./node_modules/x.js 20 bytes {2} {4} {9} {10} [built] - [3] ./node_modules/y.js 20 bytes {3} {4} {9} [built] - [6] ./a.js + 1 modules 156 bytes {4} {5} [built] - | ./a.js 121 bytes [built] - | ./e.js 20 bytes [built] - chunk {5} default/async-a.js (async-a) 156 bytes <{11}> ={0}= ={2}= ={3}= >{1}< >{8}< [rendered] - > ./a [8] ./index.js 1:0-47 - [6] ./a.js + 1 modules 156 bytes {4} {5} [built] - | ./a.js 121 bytes [built] - | ./e.js 20 bytes [built] - chunk {6} default/async-b.js (async-b) 72 bytes <{11}> ={0}= ={1}= ={2}= ={3}= [rendered] - > ./b [8] ./index.js 2:0-47 - [4] ./b.js 72 bytes {6} {9} [built] - chunk {7} default/async-c.js (async-c) 72 bytes <{11}> ={0}= ={1}= ={2}= ={12}= [rendered] - > ./c [8] ./index.js 3:0-47 - [5] ./c.js 72 bytes {7} {10} [built] - chunk {8} default/async-g.js (async-g) 34 bytes <{0}> <{2}> <{3}> <{4}> <{5}> ={1}= [rendered] - > ./g [] 6:0-47 - > ./g [] 6:0-47 - [9] ./g.js 34 bytes {8} [built] - chunk {9} default/b.js (b) 152 bytes [entry] [rendered] - > ./b b - [0] ./d.js 20 bytes {0} {4} {9} {10} [built] - [1] ./node_modules/x.js 20 bytes {2} {4} {9} {10} [built] - [2] ./f.js 20 bytes {1} {9} {10} [built] - [3] ./node_modules/y.js 20 bytes {3} {4} {9} [built] - [4] ./b.js 72 bytes {6} {9} [built] - chunk {10} default/c.js (c) 152 bytes [entry] [rendered] - > ./c c - [0] ./d.js 20 bytes {0} {4} {9} {10} [built] - [1] ./node_modules/x.js 20 bytes {2} {4} {9} {10} [built] - [2] ./f.js 20 bytes {1} {9} {10} [built] - [5] ./c.js 72 bytes {7} {10} [built] - [7] ./node_modules/z.js 20 bytes {10} {12} [built] - chunk {11} default/main.js (main) 147 bytes >{0}< >{1}< >{2}< >{3}< >{5}< >{6}< >{7}< >{12}< [entry] [rendered] - > ./ main - [8] ./index.js 147 bytes {11} [built] - chunk {12} default/vendors~async-c.js (vendors~async-c) 20 bytes <{11}> ={0}= ={1}= ={2}= ={7}= [rendered] split chunk (cache group: vendors) (name: vendors~async-c) - > ./c [8] ./index.js 3:0-47 - [7] ./node_modules/z.js 20 bytes {10} {12} [built] -Child all-chunks: - Entrypoint main = default/main.js - Entrypoint a = default/vendors~a~async-a~async-b~async-c~b~c.js default/vendors~a~async-a~async-b~b.js default/a.js - Entrypoint b = default/vendors~a~async-a~async-b~async-c~b~c.js default/vendors~a~async-a~async-b~b.js default/b.js - Entrypoint c = default/vendors~a~async-a~async-b~async-c~b~c.js default/vendors~async-c~c.js default/c.js - chunk {0} default/vendors~a~async-a~async-b~async-c~b~c.js (vendors~a~async-a~async-b~async-c~b~c) 20 bytes <{12}> ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={10}= ={11}= >{3}< >{9}< [initial] [rendered] split chunk (cache group: vendors) (name: vendors~a~async-a~async-b~async-c~b~c) - > ./a [8] ./index.js 1:0-47 - > ./b [8] ./index.js 2:0-47 - > ./c [8] ./index.js 3:0-47 - > ./a a - > ./b b - > ./c c - [2] ./node_modules/x.js 20 bytes {0} [built] - chunk {1} default/vendors~a~async-a~async-b~b.js (vendors~a~async-a~async-b~b) 20 bytes <{12}> ={0}= ={2}= ={3}= ={5}= ={6}= ={7}= ={10}= >{3}< >{9}< [initial] [rendered] split chunk (cache group: vendors) (name: vendors~a~async-a~async-b~b) - > ./a [8] ./index.js 1:0-47 - > ./b [8] ./index.js 2:0-47 - > ./a a - > ./b b - [3] ./node_modules/y.js 20 bytes {1} [built] - chunk {2} default/async-a~async-b~async-c.js (async-a~async-b~async-c) 20 bytes <{12}> ={0}= ={1}= ={3}= ={4}= ={6}= ={7}= ={8}= >{3}< >{9}< [rendered] split chunk (cache group: default) (name: async-a~async-b~async-c) - > ./a [8] ./index.js 1:0-47 - > ./b [8] ./index.js 2:0-47 - > ./c [8] ./index.js 3:0-47 - [0] ./d.js 20 bytes {2} {5} {10} {11} [built] - chunk {3} default/async-b~async-c~async-g.js (async-b~async-c~async-g) 20 bytes <{0}> <{1}> <{2}> <{5}> <{6}> <{12}> ={0}= ={1}= ={2}= ={4}= ={7}= ={8}= ={9}= [rendered] split chunk (cache group: default) (name: async-b~async-c~async-g) - > ./b [8] ./index.js 2:0-47 - > ./c [8] ./index.js 3:0-47 - > ./g [] 6:0-47 - > ./g [] 6:0-47 - [1] ./f.js 20 bytes {3} {10} {11} [built] - chunk {4} default/vendors~async-c~c.js (vendors~async-c~c) 20 bytes <{12}> ={0}= ={2}= ={3}= ={8}= ={11}= [initial] [rendered] split chunk (cache group: vendors) (name: vendors~async-c~c) - > ./c [8] ./index.js 3:0-47 - > ./c c - [7] ./node_modules/z.js 20 bytes {4} [built] - chunk {5} default/a.js (a) 176 bytes ={0}= ={1}= >{3}< >{9}< [entry] [rendered] - > ./a a - [0] ./d.js 20 bytes {2} {5} {10} {11} [built] - [6] ./a.js + 1 modules 156 bytes {5} {6} [built] - | ./a.js 121 bytes [built] - | ./e.js 20 bytes [built] - chunk {6} default/async-a.js (async-a) 156 bytes <{12}> ={0}= ={1}= ={2}= >{3}< >{9}< [rendered] - > ./a [8] ./index.js 1:0-47 - [6] ./a.js + 1 modules 156 bytes {5} {6} [built] - | ./a.js 121 bytes [built] - | ./e.js 20 bytes [built] - chunk {7} default/async-b.js (async-b) 72 bytes <{12}> ={0}= ={1}= ={2}= ={3}= [rendered] - > ./b [8] ./index.js 2:0-47 - [4] ./b.js 72 bytes {7} {10} [built] - chunk {8} default/async-c.js (async-c) 72 bytes <{12}> ={0}= ={2}= ={3}= ={4}= [rendered] - > ./c [8] ./index.js 3:0-47 - [5] ./c.js 72 bytes {8} {11} [built] - chunk {9} default/async-g.js (async-g) 34 bytes <{0}> <{1}> <{2}> <{5}> <{6}> ={3}= [rendered] - > ./g [] 6:0-47 - > ./g [] 6:0-47 - [9] ./g.js 34 bytes {9} [built] - chunk {10} default/b.js (b) 112 bytes ={0}= ={1}= [entry] [rendered] - > ./b b - [0] ./d.js 20 bytes {2} {5} {10} {11} [built] - [1] ./f.js 20 bytes {3} {10} {11} [built] - [4] ./b.js 72 bytes {7} {10} [built] - chunk {11} default/c.js (c) 112 bytes ={0}= ={4}= [entry] [rendered] - > ./c c - [0] ./d.js 20 bytes {2} {5} {10} {11} [built] - [1] ./f.js 20 bytes {3} {10} {11} [built] - [5] ./c.js 72 bytes {8} {11} [built] - chunk {12} default/main.js (main) 147 bytes >{0}< >{1}< >{2}< >{3}< >{4}< >{6}< >{7}< >{8}< [entry] [rendered] - > ./ main - [8] ./index.js 147 bytes {12} [built] -Child manual: - Entrypoint main = default/main.js - Entrypoint a = default/vendors.js default/a.js - Entrypoint b = default/vendors.js default/b.js - Entrypoint c = default/vendors.js default/c.js - chunk {0} default/vendors.js (vendors) 112 bytes <{8}> ={1}= ={2}= ={3}= ={4}= ={6}= ={7}= >{5}< [initial] [rendered] split chunk (cache group: vendors) (name: vendors) - > ./a [8] ./index.js 1:0-47 - > ./b [8] ./index.js 2:0-47 - > ./c [8] ./index.js 3:0-47 - > ./a a - > ./b b - > ./c c - [1] ./node_modules/x.js 20 bytes {0} [built] - [3] ./node_modules/y.js 20 bytes {0} [built] - [6] ./node_modules/z.js 20 bytes {0} [built] - [9] multi x y z 52 bytes {0} [built] - chunk {1} default/a.js (a) 176 bytes ={0}= >{5}< [entry] [rendered] - > ./a a - [0] ./d.js 20 bytes {1} {2} {3} {4} {6} {7} [built] - [7] ./a.js + 1 modules 156 bytes {1} {2} [built] - | ./a.js 121 bytes [built] - | ./e.js 20 bytes [built] - chunk {2} default/async-a.js (async-a) 176 bytes <{8}> ={0}= >{5}< [rendered] - > ./a [8] ./index.js 1:0-47 - [0] ./d.js 20 bytes {1} {2} {3} {4} {6} {7} [built] - [7] ./a.js + 1 modules 156 bytes {1} {2} [built] - | ./a.js 121 bytes [built] - | ./e.js 20 bytes [built] - chunk {3} default/async-b.js (async-b) 112 bytes <{8}> ={0}= [rendered] - > ./b [8] ./index.js 2:0-47 - [0] ./d.js 20 bytes {1} {2} {3} {4} {6} {7} [built] - [2] ./f.js 20 bytes {3} {4} {5} {6} {7} [built] - [4] ./b.js 72 bytes {3} {6} [built] - chunk {4} default/async-c.js (async-c) 112 bytes <{8}> ={0}= [rendered] - > ./c [8] ./index.js 3:0-47 - [0] ./d.js 20 bytes {1} {2} {3} {4} {6} {7} [built] - [2] ./f.js 20 bytes {3} {4} {5} {6} {7} [built] - [5] ./c.js 72 bytes {4} {7} [built] - chunk {5} default/async-g.js (async-g) 54 bytes <{0}> <{1}> <{2}> [rendered] - > ./g [] 6:0-47 - > ./g [] 6:0-47 - [2] ./f.js 20 bytes {3} {4} {5} {6} {7} [built] - [10] ./g.js 34 bytes {5} [built] - chunk {6} default/b.js (b) 112 bytes ={0}= [entry] [rendered] - > ./b b - [0] ./d.js 20 bytes {1} {2} {3} {4} {6} {7} [built] - [2] ./f.js 20 bytes {3} {4} {5} {6} {7} [built] - [4] ./b.js 72 bytes {3} {6} [built] - chunk {7} default/c.js (c) 112 bytes ={0}= [entry] [rendered] - > ./c c - [0] ./d.js 20 bytes {1} {2} {3} {4} {6} {7} [built] - [2] ./f.js 20 bytes {3} {4} {5} {6} {7} [built] - [5] ./c.js 72 bytes {4} {7} [built] - chunk {8} default/main.js (main) 147 bytes >{0}< >{2}< >{3}< >{4}< [entry] [rendered] - > ./ main - [8] ./index.js 147 bytes {8} [built] -Child name-too-long: - Entrypoint main = main.js - Entrypoint aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = vendors~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa~async-a~async-b~async-c~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb~cccccc~50ebc41f.js vendors~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa~async-a~async-b~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.js aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa~async-a~async-b~async-c~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb~cccccccccccccc~18066793.js async-a.js aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.js - Entrypoint bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb = vendors~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa~async-a~async-b~async-c~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb~cccccc~50ebc41f.js vendors~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa~async-a~async-b~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.js aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa~async-a~async-b~async-c~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb~cccccccccccccc~18066793.js async-b~async-c~async-g~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb~cccccccccccccccccccccccccccccc.js async-b.js bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.js - Entrypoint cccccccccccccccccccccccccccccc = vendors~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa~async-a~async-b~async-c~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb~cccccc~50ebc41f.js vendors~async-c~cccccccccccccccccccccccccccccc.js aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa~async-a~async-b~async-c~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb~cccccccccccccc~18066793.js async-b~async-c~async-g~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb~cccccccccccccccccccccccccccccc.js async-c.js cccccccccccccccccccccccccccccc.js - chunk {0} aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa~async-a~async-b~async-c~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb~cccccccccccccc~18066793.js (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa~async-a~async-b~async-c~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb~cccccccccccccc~18066793) 20 bytes <{12}> ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={10}= ={11}= >{2}< >{9}< [initial] [rendered] split chunk (cache group: default) (name: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa~async-a~async-b~async-c~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb~cccccccccccccc~18066793) - > ./a [4] ./index.js 1:0-47 - > ./b [4] ./index.js 2:0-47 - > ./c [4] ./index.js 3:0-47 - > ./a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - > ./b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb - > ./c cccccccccccccccccccccccccccccc - [0] ./d.js 20 bytes {0} [built] - chunk {1} vendors~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa~async-a~async-b~async-c~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb~cccccc~50ebc41f.js (vendors~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa~async-a~async-b~async-c~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb~cccccc~50ebc41f) 20 bytes <{12}> ={0}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={10}= ={11}= >{2}< >{9}< [initial] [rendered] split chunk (cache group: vendors) (name: vendors~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa~async-a~async-b~async-c~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb~cccccc~50ebc41f) - > ./a [4] ./index.js 1:0-47 - > ./b [4] ./index.js 2:0-47 - > ./c [4] ./index.js 3:0-47 - > ./a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - > ./b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb - > ./c cccccccccccccccccccccccccccccc - [1] ./node_modules/x.js 20 bytes {1} [built] - chunk {2} async-b~async-c~async-g~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb~cccccccccccccccccccccccccccccc.js (async-b~async-c~async-g~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb~cccccccccccccccccccccccccccccc) 20 bytes <{0}> <{1}> <{3}> <{4}> <{8}> <{12}> ={0}= ={1}= ={3}= ={5}= ={6}= ={7}= ={9}= ={10}= ={11}= [initial] [rendered] split chunk (cache group: default) (name: async-b~async-c~async-g~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb~cccccccccccccccccccccccccccccc) - > ./b [4] ./index.js 2:0-47 - > ./c [4] ./index.js 3:0-47 - > ./g [] 6:0-47 - > ./g [] 6:0-47 - > ./b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb - > ./c cccccccccccccccccccccccccccccc - [2] ./f.js 20 bytes {2} [built] - chunk {3} vendors~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa~async-a~async-b~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.js (vendors~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa~async-a~async-b~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) 20 bytes <{12}> ={0}= ={1}= ={2}= ={4}= ={5}= ={8}= ={10}= >{2}< >{9}< [initial] [rendered] split chunk (cache group: vendors) (name: vendors~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa~async-a~async-b~bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) - > ./a [4] ./index.js 1:0-47 - > ./b [4] ./index.js 2:0-47 - > ./a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - > ./b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb - [3] ./node_modules/y.js 20 bytes {3} [built] - chunk {4} async-a.js (async-a) 156 bytes <{12}> ={0}= ={1}= ={3}= ={8}= >{2}< >{9}< [initial] [rendered] reused as split chunk (cache group: default) - > ./a [4] ./index.js 1:0-47 - > ./a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - [8] ./a.js + 1 modules 156 bytes {4} [built] - | ./a.js 121 bytes [built] - | ./e.js 20 bytes [built] - chunk {5} async-b.js (async-b) 72 bytes <{12}> ={0}= ={1}= ={2}= ={3}= ={10}= [initial] [rendered] reused as split chunk (cache group: default) - > ./b [4] ./index.js 2:0-47 - > ./b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb - [5] ./b.js 72 bytes {5} [built] - chunk {6} async-c.js (async-c) 72 bytes <{12}> ={0}= ={1}= ={2}= ={7}= ={11}= [initial] [rendered] reused as split chunk (cache group: default) - > ./c [4] ./index.js 3:0-47 - > ./c cccccccccccccccccccccccccccccc - [6] ./c.js 72 bytes {6} [built] - chunk {7} vendors~async-c~cccccccccccccccccccccccccccccc.js (vendors~async-c~cccccccccccccccccccccccccccccc) 20 bytes <{12}> ={0}= ={1}= ={2}= ={6}= ={11}= [initial] [rendered] split chunk (cache group: vendors) (name: vendors~async-c~cccccccccccccccccccccccccccccc) - > ./c [4] ./index.js 3:0-47 - > ./c cccccccccccccccccccccccccccccc - [7] ./node_modules/z.js 20 bytes {7} [built] - chunk {8} aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.js (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) 0 bytes ={0}= ={1}= ={3}= ={4}= >{2}< >{9}< [entry] [rendered] - > ./a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - chunk {9} async-g.js (async-g) 34 bytes <{0}> <{1}> <{3}> <{4}> <{8}> ={2}= [rendered] - > ./g [] 6:0-47 - > ./g [] 6:0-47 - [9] ./g.js 34 bytes {9} [built] - chunk {10} bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.js (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) 0 bytes ={0}= ={1}= ={2}= ={3}= ={5}= [entry] [rendered] - > ./b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb - chunk {11} cccccccccccccccccccccccccccccc.js (cccccccccccccccccccccccccccccc) 0 bytes ={0}= ={1}= ={2}= ={6}= ={7}= [entry] [rendered] - > ./c cccccccccccccccccccccccccccccc - chunk {12} main.js (main) 147 bytes >{0}< >{1}< >{2}< >{3}< >{4}< >{5}< >{6}< >{7}< [entry] [rendered] - > ./ main - [4] ./index.js 147 bytes {12} [built] -Child custom-chunks-filter: - Entrypoint main = default/main.js - Entrypoint a = default/a.js - Entrypoint b = default/vendors~async-a~async-b~async-c~b~c.js default/vendors~async-a~async-b~b.js default/b.js - Entrypoint c = default/vendors~async-a~async-b~async-c~b~c.js default/vendors~async-c~c.js default/c.js - chunk {0} default/vendors~async-a~async-b~async-c~b~c.js (vendors~async-a~async-b~async-c~b~c) 20 bytes <{12}> ={1}= ={2}= ={3}= ={4}= ={6}= ={7}= ={8}= ={10}= ={11}= >{2}< >{9}< [initial] [rendered] split chunk (cache group: vendors) (name: vendors~async-a~async-b~async-c~b~c) - > ./a [8] ./index.js 1:0-47 - > ./b [8] ./index.js 2:0-47 - > ./c [8] ./index.js 3:0-47 - > ./b b - > ./c c - [1] ./node_modules/x.js 20 bytes {0} {5} [built] - chunk {1} default/async-a~async-b~async-c.js (async-a~async-b~async-c) 20 bytes <{12}> ={0}= ={2}= ={3}= ={4}= ={6}= ={7}= ={8}= >{2}< >{9}< [rendered] split chunk (cache group: default) (name: async-a~async-b~async-c) - > ./a [8] ./index.js 1:0-47 - > ./b [8] ./index.js 2:0-47 - > ./c [8] ./index.js 3:0-47 - [0] ./d.js 20 bytes {1} {5} {10} {11} [built] - chunk {2} default/async-b~async-c~async-g.js (async-b~async-c~async-g) 20 bytes <{0}> <{1}> <{3}> <{5}> <{6}> <{12}> ={0}= ={1}= ={3}= ={4}= ={7}= ={8}= ={9}= [rendered] split chunk (cache group: default) (name: async-b~async-c~async-g) - > ./b [8] ./index.js 2:0-47 - > ./c [8] ./index.js 3:0-47 - > ./g [] 6:0-47 - > ./g [] 6:0-47 - [2] ./f.js 20 bytes {2} {10} {11} [built] - chunk {3} default/vendors~async-a~async-b~b.js (vendors~async-a~async-b~b) 20 bytes <{12}> ={0}= ={1}= ={2}= ={6}= ={7}= ={10}= >{2}< >{9}< [initial] [rendered] split chunk (cache group: vendors) (name: vendors~async-a~async-b~b) - > ./a [8] ./index.js 1:0-47 - > ./b [8] ./index.js 2:0-47 - > ./b b - [3] ./node_modules/y.js 20 bytes {3} {5} [built] - chunk {4} default/vendors~async-c~c.js (vendors~async-c~c) 20 bytes <{12}> ={0}= ={1}= ={2}= ={8}= ={11}= [initial] [rendered] split chunk (cache group: vendors) (name: vendors~async-c~c) - > ./c [8] ./index.js 3:0-47 - > ./c c - [7] ./node_modules/z.js 20 bytes {4} [built] - chunk {5} default/a.js (a) 216 bytes >{2}< >{9}< [entry] [rendered] - > ./a a - [0] ./d.js 20 bytes {1} {5} {10} {11} [built] - [1] ./node_modules/x.js 20 bytes {0} {5} [built] - [3] ./node_modules/y.js 20 bytes {3} {5} [built] - [6] ./a.js + 1 modules 156 bytes {5} {6} [built] - | ./a.js 121 bytes [built] - | ./e.js 20 bytes [built] - chunk {6} default/async-a.js (async-a) 156 bytes <{12}> ={0}= ={1}= ={3}= >{2}< >{9}< [rendered] - > ./a [8] ./index.js 1:0-47 - [6] ./a.js + 1 modules 156 bytes {5} {6} [built] - | ./a.js 121 bytes [built] - | ./e.js 20 bytes [built] - chunk {7} default/async-b.js (async-b) 72 bytes <{12}> ={0}= ={1}= ={2}= ={3}= [rendered] - > ./b [8] ./index.js 2:0-47 - [4] ./b.js 72 bytes {7} {10} [built] - chunk {8} default/async-c.js (async-c) 72 bytes <{12}> ={0}= ={1}= ={2}= ={4}= [rendered] - > ./c [8] ./index.js 3:0-47 - [5] ./c.js 72 bytes {8} {11} [built] - chunk {9} default/async-g.js (async-g) 34 bytes <{0}> <{1}> <{3}> <{5}> <{6}> ={2}= [rendered] - > ./g [] 6:0-47 - > ./g [] 6:0-47 - [9] ./g.js 34 bytes {9} [built] - chunk {10} default/b.js (b) 112 bytes ={0}= ={3}= [entry] [rendered] - > ./b b - [0] ./d.js 20 bytes {1} {5} {10} {11} [built] - [2] ./f.js 20 bytes {2} {10} {11} [built] - [4] ./b.js 72 bytes {7} {10} [built] - chunk {11} default/c.js (c) 112 bytes ={0}= ={4}= [entry] [rendered] - > ./c c - [0] ./d.js 20 bytes {1} {5} {10} {11} [built] - [2] ./f.js 20 bytes {2} {10} {11} [built] - [5] ./c.js 72 bytes {8} {11} [built] - chunk {12} default/main.js (main) 147 bytes >{0}< >{1}< >{2}< >{3}< >{4}< >{6}< >{7}< >{8}< [entry] [rendered] - > ./ main - [8] ./index.js 147 bytes {12} [built] -Child custom-chunks-filter-in-cache-groups: - Entrypoint main = default/main.js - Entrypoint a = default/a.js - Entrypoint b = default/vendors.js default/b.js - Entrypoint c = default/vendors.js default/c.js - chunk {0} default/vendors.js (vendors) 112 bytes <{8}> ={2}= ={3}= ={4}= ={6}= ={7}= >{5}< [initial] [rendered] split chunk (cache group: vendors) (name: vendors) - > ./a [8] ./index.js 1:0-47 - > ./b [8] ./index.js 2:0-47 - > ./c [8] ./index.js 3:0-47 - > ./b b - > ./c c - [1] ./node_modules/x.js 20 bytes {0} {1} [built] - [2] ./node_modules/y.js 20 bytes {0} {1} [built] - [6] ./node_modules/z.js 20 bytes {0} [built] - [9] multi x y z 52 bytes {0} [built] - chunk {1} default/a.js (a) 216 bytes >{5}< [entry] [rendered] - > ./a a - [0] ./d.js 20 bytes {1} {2} {3} {4} {6} {7} [built] - [1] ./node_modules/x.js 20 bytes {0} {1} [built] - [2] ./node_modules/y.js 20 bytes {0} {1} [built] - [7] ./a.js + 1 modules 156 bytes {1} {2} [built] - | ./a.js 121 bytes [built] - | ./e.js 20 bytes [built] - chunk {2} default/async-a.js (async-a) 176 bytes <{8}> ={0}= >{5}< [rendered] - > ./a [8] ./index.js 1:0-47 - [0] ./d.js 20 bytes {1} {2} {3} {4} {6} {7} [built] - [7] ./a.js + 1 modules 156 bytes {1} {2} [built] - | ./a.js 121 bytes [built] - | ./e.js 20 bytes [built] - chunk {3} default/async-b.js (async-b) 112 bytes <{8}> ={0}= [rendered] - > ./b [8] ./index.js 2:0-47 - [0] ./d.js 20 bytes {1} {2} {3} {4} {6} {7} [built] - [3] ./f.js 20 bytes {3} {4} {5} {6} {7} [built] - [4] ./b.js 72 bytes {3} {6} [built] - chunk {4} default/async-c.js (async-c) 112 bytes <{8}> ={0}= [rendered] - > ./c [8] ./index.js 3:0-47 - [0] ./d.js 20 bytes {1} {2} {3} {4} {6} {7} [built] - [3] ./f.js 20 bytes {3} {4} {5} {6} {7} [built] - [5] ./c.js 72 bytes {4} {7} [built] - chunk {5} default/async-g.js (async-g) 54 bytes <{0}> <{1}> <{2}> [rendered] - > ./g [] 6:0-47 - > ./g [] 6:0-47 - [3] ./f.js 20 bytes {3} {4} {5} {6} {7} [built] - [10] ./g.js 34 bytes {5} [built] - chunk {6} default/b.js (b) 112 bytes ={0}= [entry] [rendered] - > ./b b - [0] ./d.js 20 bytes {1} {2} {3} {4} {6} {7} [built] - [3] ./f.js 20 bytes {3} {4} {5} {6} {7} [built] - [4] ./b.js 72 bytes {3} {6} [built] - chunk {7} default/c.js (c) 112 bytes ={0}= [entry] [rendered] - > ./c c - [0] ./d.js 20 bytes {1} {2} {3} {4} {6} {7} [built] - [3] ./f.js 20 bytes {3} {4} {5} {6} {7} [built] - [5] ./c.js 72 bytes {4} {7} [built] - chunk {8} default/main.js (main) 147 bytes >{0}< >{2}< >{3}< >{4}< [entry] [rendered] - > ./ main - [8] ./index.js 147 bytes {8} [built]" -`; - -exports[`StatsTestCases should print correct stats for split-chunks-automatic-name 1`] = ` -"Entrypoint main = main.js -chunk {0} common~async-a~async-b~async-c.js (common~async-a~async-b~async-c) 40 bytes <{7}> ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= [rendered] split chunk (cache group: default) (name: common~async-a~async-b~async-c) - > ./a [0] ./index.js 1:0-47 - > ./b [0] ./index.js 2:0-47 - > ./c [0] ./index.js 3:0-47 - [4] ./d.js 20 bytes {0} [built] - [5] ./node_modules/x.js 20 bytes {0} [built] -chunk {1} common~async-a~async-b.js (common~async-a~async-b) 20 bytes <{7}> ={0}= ={2}= ={3}= ={4}= [rendered] split chunk (cache group: vendors) (name: common~async-a~async-b) - > ./a [0] ./index.js 1:0-47 - > ./b [0] ./index.js 2:0-47 - [6] ./node_modules/y.js 20 bytes {1} [built] -chunk {2} common~async-b~async-c.js (common~async-b~async-c) 20 bytes <{7}> ={0}= ={1}= ={4}= ={5}= ={6}= [rendered] split chunk (cache group: default) (name: common~async-b~async-c) - > ./b [0] ./index.js 2:0-47 - > ./c [0] ./index.js 3:0-47 - [7] ./f.js 20 bytes {2} [built] -chunk {3} async-a.js (async-a) 107 bytes <{7}> ={0}= ={1}= [rendered] - > ./a [0] ./index.js 1:0-47 - [3] ./a.js + 1 modules 107 bytes {3} [built] - | ./a.js 72 bytes [built] - | ./e.js 20 bytes [built] -chunk {4} async-b.js (async-b) 72 bytes <{7}> ={0}= ={1}= ={2}= [rendered] - > ./b [0] ./index.js 2:0-47 - [1] ./b.js 72 bytes {4} [built] -chunk {5} async-c.js (async-c) 72 bytes <{7}> ={0}= ={2}= ={6}= [rendered] - > ./c [0] ./index.js 3:0-47 - [2] ./c.js 72 bytes {5} [built] -chunk {6} common~async-c.js (common~async-c) 20 bytes <{7}> ={0}= ={2}= ={5}= [rendered] split chunk (cache group: vendors) (name: common~async-c) - > ./c [0] ./index.js 3:0-47 - [8] ./node_modules/z.js 20 bytes {6} [built] -chunk {7} main.js (main) 147 bytes >{0}< >{1}< >{2}< >{3}< >{4}< >{5}< >{6}< [entry] [rendered] - > ./ main - [0] ./index.js 147 bytes {7} [built]" -`; - -exports[`StatsTestCases should print correct stats for split-chunks-combinations 1`] = ` -"Entrypoint main = main.js -chunk {0} async-a~async-b.js (async-a~async-b) 134 bytes <{8}> ={1}= ={2}= [rendered] split chunk (cache group: default) (name: async-a~async-b) - > ./a [0] ./index.js 1:0-47 - > ./b [0] ./index.js 2:0-47 - [8] ./x.js 67 bytes {0} {3} {4} {5} {6} {7} [built] - [9] ./y.js 67 bytes {0} [built] -chunk {1} async-a.js (async-a) 48 bytes <{8}> ={0}= [rendered] - > ./a [0] ./index.js 1:0-47 - [1] ./a.js 48 bytes {1} [built] -chunk {2} async-b.js (async-b) 48 bytes <{8}> ={0}= [rendered] - > ./b [0] ./index.js 2:0-47 - [2] ./b.js 48 bytes {2} [built] -chunk {3} async-c.js (async-c) 101 bytes <{8}> [rendered] - > ./c [0] ./index.js 3:0-47 - [3] ./c.js 34 bytes {3} [built] - [8] ./x.js 67 bytes {0} {3} {4} {5} {6} {7} [built] -chunk {4} async-d.js (async-d) 101 bytes <{8}> [rendered] - > ./d [0] ./index.js 4:0-47 - [4] ./d.js 34 bytes {4} [built] - [8] ./x.js 67 bytes {0} {3} {4} {5} {6} {7} [built] -chunk {5} async-e.js (async-e) 101 bytes <{8}> [rendered] - > ./e [0] ./index.js 5:0-47 - [5] ./e.js 34 bytes {5} [built] - [8] ./x.js 67 bytes {0} {3} {4} {5} {6} {7} [built] -chunk {6} async-f.js (async-f) 101 bytes <{8}> [rendered] - > ./f [0] ./index.js 6:0-47 - [6] ./f.js 34 bytes {6} [built] - [8] ./x.js 67 bytes {0} {3} {4} {5} {6} {7} [built] -chunk {7} async-g.js (async-g) 101 bytes <{8}> [rendered] - > ./g [0] ./index.js 7:0-47 - [7] ./g.js 34 bytes {7} [built] - [8] ./x.js 67 bytes {0} {3} {4} {5} {6} {7} [built] -chunk {8} main.js (main) 343 bytes >{0}< >{1}< >{2}< >{3}< >{4}< >{5}< >{6}< >{7}< [entry] [rendered] - > ./ main - [0] ./index.js 343 bytes {8} [built]" -`; - -exports[`StatsTestCases should print correct stats for split-chunks-issue-6413 1`] = ` -"Entrypoint main = main.js -chunk {0} async-a~async-b~async-c.js (async-a~async-b~async-c) 11 bytes <{5}> ={1}= ={2}= ={3}= ={4}= [rendered] split chunk (cache group: default) (name: async-a~async-b~async-c) - > ./a [0] ./index.js 1:0-47 - > ./b [0] ./index.js 2:0-47 - > ./c [0] ./index.js 3:0-47 - [4] ./common.js 11 bytes {0} [built] -chunk {1} vendors~async-a~async-b~async-c.js (vendors~async-a~async-b~async-c) 20 bytes <{5}> ={0}= ={2}= ={3}= ={4}= [rendered] split chunk (cache group: vendors) (name: vendors~async-a~async-b~async-c) - > ./a [0] ./index.js 1:0-47 - > ./b [0] ./index.js 2:0-47 - > ./c [0] ./index.js 3:0-47 - [5] ./node_modules/x.js 20 bytes {1} [built] -chunk {2} async-a.js (async-a) 19 bytes <{5}> ={0}= ={1}= [rendered] - > ./a [0] ./index.js 1:0-47 - [1] ./a.js 19 bytes {2} [built] -chunk {3} async-b.js (async-b) 19 bytes <{5}> ={0}= ={1}= [rendered] - > ./b [0] ./index.js 2:0-47 - [2] ./b.js 19 bytes {3} [built] -chunk {4} async-c.js (async-c) 19 bytes <{5}> ={0}= ={1}= [rendered] - > ./c [0] ./index.js 3:0-47 - [3] ./c.js 19 bytes {4} [built] -chunk {5} main.js (main) 147 bytes >{0}< >{1}< >{2}< >{3}< >{4}< [entry] [rendered] - > ./ main - [0] ./index.js 147 bytes {5} [built]" -`; - -exports[`StatsTestCases should print correct stats for split-chunks-issue-6696 1`] = ` -"Entrypoint main = vendors.js main.js -chunk {0} async-a.js (async-a) 32 bytes <{2}> <{3}> [rendered] - > ./a [0] ./index.js 2:0-47 - [2] ./a.js 12 bytes {0} [built] - [4] ./node_modules/x.js 20 bytes {0} {1} [built] -chunk {1} async-b.js (async-b) 32 bytes <{2}> <{3}> [rendered] - > ./b [0] ./index.js 3:0-47 - [3] ./b.js 12 bytes {1} [built] - [4] ./node_modules/x.js 20 bytes {0} {1} [built] -chunk {2} main.js (main) 110 bytes ={3}= >{0}< >{1}< [entry] [rendered] - > ./ main - [0] ./index.js 110 bytes {2} [built] -chunk {3} vendors.js (vendors) 20 bytes ={2}= >{0}< >{1}< [initial] [rendered] split chunk (cache group: vendors) (name: vendors) - > ./ main - [1] ./node_modules/y.js 20 bytes {3} [built]" -`; - -exports[`StatsTestCases should print correct stats for split-chunks-issue-7401 1`] = ` -"Entrypoint a = vendors~a~c.js a.js -Entrypoint b = b.js -Chunk Group c = vendors~a~c.js c.js -chunk {0} vendors~a~c.js (vendors~a~c) 20 bytes <{2}> ={1}= ={3}= [initial] [rendered] split chunk (cache group: vendors) (name: vendors~a~c) - > ./c [2] ./b.js 1:0-41 - > ./a a - [0] ./node_modules/x.js 20 bytes {0} [built] -chunk {1} a.js (a) 12 bytes ={0}= [entry] [rendered] - > ./a a - [1] ./a.js 12 bytes {1} [built] -chunk {2} b.js (b) 43 bytes >{0}< >{3}< [entry] [rendered] - > ./b b - [2] ./b.js 43 bytes {2} [built] -chunk {3} c.js (c) 12 bytes <{2}> ={0}= [rendered] - > ./c [2] ./b.js 1:0-41 - [3] ./c.js 12 bytes {3} [built]" -`; - -exports[`StatsTestCases should print correct stats for split-chunks-max-size 1`] = ` -"Child production: - Entrypoint main = prod-vendors~main~7274e1de.js prod-vendors~main~0feae4ad.js prod-main~6e7ead72.js prod-main~6a2ae26b.js prod-main~17acad98.js prod-main~b2c7414a.js prod-main~75f09de8.js prod-main~052b3814.js prod-main~3ff27526.js prod-main~11485824.js prod-main~c6931360.js prod-main~cd7c5bfc.js prod-main~02369f19.js - chunk {0} prod-main~02369f19.js (main~02369f19) 1.57 KiB ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={9}= ={10}= ={11}= ={12}= [entry] [rendered] - > ./ main - [11] ./very-big.js?1 1.57 KiB {0} [built] - chunk {1} prod-main~052b3814.js (main~052b3814) 603 bytes ={0}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={9}= ={10}= ={11}= ={12}= [initial] [rendered] - > ./ main - [2] ./small.js?1 67 bytes {1} [built] - [3] ./small.js?2 67 bytes {1} [built] - [4] ./small.js?3 67 bytes {1} [built] - [5] ./small.js?4 67 bytes {1} [built] - [6] ./small.js?5 67 bytes {1} [built] - [7] ./small.js?6 67 bytes {1} [built] - [8] ./small.js?7 67 bytes {1} [built] - [9] ./small.js?8 67 bytes {1} [built] - [10] ./small.js?9 67 bytes {1} [built] - chunk {2} prod-main~11485824.js (main~11485824) 603 bytes ={0}= ={1}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={9}= ={10}= ={11}= ={12}= [initial] [rendered] - > ./ main - [16] ./subfolder/small.js?1 67 bytes {2} [built] - [17] ./subfolder/small.js?2 67 bytes {2} [built] - [18] ./subfolder/small.js?3 67 bytes {2} [built] - [19] ./subfolder/small.js?4 67 bytes {2} [built] - [20] ./subfolder/small.js?5 67 bytes {2} [built] - [21] ./subfolder/small.js?6 67 bytes {2} [built] - [22] ./subfolder/small.js?7 67 bytes {2} [built] - [23] ./subfolder/small.js?8 67 bytes {2} [built] - [24] ./subfolder/small.js?9 67 bytes {2} [built] - chunk {3} prod-main~17acad98.js (main~17acad98) 1.57 KiB ={0}= ={1}= ={2}= ={4}= ={5}= ={6}= ={7}= ={8}= ={9}= ={10}= ={11}= ={12}= [initial] [rendered] - > ./ main - [39] ./in-some-directory/very-big.js?1 1.57 KiB {3} [built] - chunk {4} prod-main~3ff27526.js (main~3ff27526) 536 bytes ={0}= ={1}= ={2}= ={3}= ={5}= ={6}= ={7}= ={8}= ={9}= ={10}= ={11}= ={12}= [initial] [rendered] - > ./ main - [14] ./subfolder/big.js?1 268 bytes {4} [built] - [15] ./subfolder/big.js?2 268 bytes {4} [built] - chunk {5} prod-main~6a2ae26b.js (main~6a2ae26b) 536 bytes ={0}= ={1}= ={2}= ={3}= ={4}= ={6}= ={7}= ={8}= ={9}= ={10}= ={11}= ={12}= [initial] [rendered] - > ./ main - [34] ./in-some-directory/big.js?1 268 bytes {5} [built] - [35] ./in-some-directory/small.js?1 67 bytes {5} [built] - [36] ./in-some-directory/small.js?2 67 bytes {5} [built] - [37] ./in-some-directory/small.js?3 67 bytes {5} [built] - [38] ./in-some-directory/small.js?4 67 bytes {5} [built] - chunk {6} prod-main~6e7ead72.js (main~6e7ead72) 536 bytes ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={7}= ={8}= ={9}= ={10}= ={11}= ={12}= [initial] [rendered] - > ./ main - [0] ./big.js?1 268 bytes {6} [built] - [1] ./big.js?2 268 bytes {6} [built] - chunk {7} prod-main~75f09de8.js (main~75f09de8) 603 bytes ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={8}= ={9}= ={10}= ={11}= ={12}= [initial] [rendered] - > ./ main - [25] ./inner-module/small.js?1 67 bytes {7} [built] - [26] ./inner-module/small.js?2 67 bytes {7} [built] - [27] ./inner-module/small.js?3 67 bytes {7} [built] - [28] ./inner-module/small.js?4 67 bytes {7} [built] - [29] ./inner-module/small.js?5 67 bytes {7} [built] - [30] ./inner-module/small.js?6 67 bytes {7} [built] - [31] ./inner-module/small.js?7 67 bytes {7} [built] - [32] ./inner-module/small.js?8 67 bytes {7} [built] - [33] ./inner-module/small.js?9 67 bytes {7} [built] - chunk {8} prod-main~b2c7414a.js (main~b2c7414a) 1.19 KiB ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={9}= ={10}= ={11}= ={12}= [initial] [rendered] - > ./ main - [44] ./index.js 1.19 KiB {8} [built] - chunk {9} prod-main~c6931360.js (main~c6931360) 1.57 KiB ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={10}= ={11}= ={12}= [initial] [rendered] - > ./ main - [12] ./very-big.js?2 1.57 KiB {9} [built] - chunk {10} prod-main~cd7c5bfc.js (main~cd7c5bfc) 1.57 KiB ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={9}= ={11}= ={12}= [initial] [rendered] - > ./ main - [13] ./very-big.js?3 1.57 KiB {10} [built] - chunk {11} prod-vendors~main~0feae4ad.js (vendors~main~0feae4ad) 1.57 KiB ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={9}= ={10}= ={12}= [initial] [rendered] split chunk (cache group: vendors) (name: vendors~main) - > ./ main - [43] ./node_modules/very-big.js?1 1.57 KiB {11} [built] - chunk {12} prod-vendors~main~7274e1de.js (vendors~main~7274e1de) 402 bytes ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={9}= ={10}= ={11}= [initial] [rendered] split chunk (cache group: vendors) (name: vendors~main) - > ./ main - [40] ./node_modules/big.js?1 268 bytes {12} [built] - [41] ./node_modules/small.js?1 67 bytes {12} [built] - [42] ./node_modules/small.js?2 67 bytes {12} [built] -Child development: - Entrypoint main = dev-vendors~main~._node_modules_b.js dev-vendors~main~._node_modules_very-big.js~6bdbed7b.js dev-main~._big.js~1.js dev-main~._in-some-directory_b.js dev-main~._in-some-directory_very-big.js~8d76cf03.js dev-main~._index.js~41f5a26e.js dev-main~._inner-module_small.js~3.js dev-main~._small.js~1.js dev-main~._subfolder_big.js~b.js dev-main~._subfolder_small.js~1.js dev-main~._very-big.js~08cf55cf.js dev-main~._very-big.js~4647fb9d.js dev-main~._very-big.js~62f7f644.js - chunk {main~._big.js~1} dev-main~._big.js~1.js (main~._big.js~1) 536 bytes ={main~._in-some-directory_b}= ={main~._in-some-directory_very-big.js~8d76cf03}= ={main~._index.js~41f5a26e}= ={main~._inner-module_small.js~3}= ={main~._small.js~1}= ={main~._subfolder_big.js~b}= ={main~._subfolder_small.js~1}= ={main~._very-big.js~08cf55cf}= ={main~._very-big.js~4647fb9d}= ={main~._very-big.js~62f7f644}= ={vendors~main~._node_modules_b}= ={vendors~main~._node_modules_very-big.js~6bdbed7b}= [initial] [rendered] - > ./ main - [./big.js?1] 268 bytes {main~._big.js~1} [built] - [./big.js?2] 268 bytes {main~._big.js~1} [built] - chunk {main~._in-some-directory_b} dev-main~._in-some-directory_b.js (main~._in-some-directory_b) 536 bytes ={main~._big.js~1}= ={main~._in-some-directory_very-big.js~8d76cf03}= ={main~._index.js~41f5a26e}= ={main~._inner-module_small.js~3}= ={main~._small.js~1}= ={main~._subfolder_big.js~b}= ={main~._subfolder_small.js~1}= ={main~._very-big.js~08cf55cf}= ={main~._very-big.js~4647fb9d}= ={main~._very-big.js~62f7f644}= ={vendors~main~._node_modules_b}= ={vendors~main~._node_modules_very-big.js~6bdbed7b}= [initial] [rendered] - > ./ main - [./in-some-directory/big.js?1] 268 bytes {main~._in-some-directory_b} [built] - [./in-some-directory/small.js?1] 67 bytes {main~._in-some-directory_b} [built] - [./in-some-directory/small.js?2] 67 bytes {main~._in-some-directory_b} [built] - [./in-some-directory/small.js?3] 67 bytes {main~._in-some-directory_b} [built] - [./in-some-directory/small.js?4] 67 bytes {main~._in-some-directory_b} [built] - chunk {main~._in-some-directory_very-big.js~8d76cf03} dev-main~._in-some-directory_very-big.js~8d76cf03.js (main~._in-some-directory_very-big.js~8d76cf03) 1.57 KiB ={main~._big.js~1}= ={main~._in-some-directory_b}= ={main~._index.js~41f5a26e}= ={main~._inner-module_small.js~3}= ={main~._small.js~1}= ={main~._subfolder_big.js~b}= ={main~._subfolder_small.js~1}= ={main~._very-big.js~08cf55cf}= ={main~._very-big.js~4647fb9d}= ={main~._very-big.js~62f7f644}= ={vendors~main~._node_modules_b}= ={vendors~main~._node_modules_very-big.js~6bdbed7b}= [initial] [rendered] - > ./ main - [./in-some-directory/very-big.js?1] 1.57 KiB {main~._in-some-directory_very-big.js~8d76cf03} [built] - chunk {main~._index.js~41f5a26e} dev-main~._index.js~41f5a26e.js (main~._index.js~41f5a26e) 1.19 KiB ={main~._big.js~1}= ={main~._in-some-directory_b}= ={main~._in-some-directory_very-big.js~8d76cf03}= ={main~._inner-module_small.js~3}= ={main~._small.js~1}= ={main~._subfolder_big.js~b}= ={main~._subfolder_small.js~1}= ={main~._very-big.js~08cf55cf}= ={main~._very-big.js~4647fb9d}= ={main~._very-big.js~62f7f644}= ={vendors~main~._node_modules_b}= ={vendors~main~._node_modules_very-big.js~6bdbed7b}= [initial] [rendered] - > ./ main - [./index.js] 1.19 KiB {main~._index.js~41f5a26e} [built] - chunk {main~._inner-module_small.js~3} dev-main~._inner-module_small.js~3.js (main~._inner-module_small.js~3) 603 bytes ={main~._big.js~1}= ={main~._in-some-directory_b}= ={main~._in-some-directory_very-big.js~8d76cf03}= ={main~._index.js~41f5a26e}= ={main~._small.js~1}= ={main~._subfolder_big.js~b}= ={main~._subfolder_small.js~1}= ={main~._very-big.js~08cf55cf}= ={main~._very-big.js~4647fb9d}= ={main~._very-big.js~62f7f644}= ={vendors~main~._node_modules_b}= ={vendors~main~._node_modules_very-big.js~6bdbed7b}= [initial] [rendered] - > ./ main - [./inner-module/small.js?1] 67 bytes {main~._inner-module_small.js~3} [built] - [./inner-module/small.js?2] 67 bytes {main~._inner-module_small.js~3} [built] - [./inner-module/small.js?3] 67 bytes {main~._inner-module_small.js~3} [built] - [./inner-module/small.js?4] 67 bytes {main~._inner-module_small.js~3} [built] - [./inner-module/small.js?5] 67 bytes {main~._inner-module_small.js~3} [built] - [./inner-module/small.js?6] 67 bytes {main~._inner-module_small.js~3} [built] - [./inner-module/small.js?7] 67 bytes {main~._inner-module_small.js~3} [built] - [./inner-module/small.js?8] 67 bytes {main~._inner-module_small.js~3} [built] - [./inner-module/small.js?9] 67 bytes {main~._inner-module_small.js~3} [built] - chunk {main~._small.js~1} dev-main~._small.js~1.js (main~._small.js~1) 603 bytes ={main~._big.js~1}= ={main~._in-some-directory_b}= ={main~._in-some-directory_very-big.js~8d76cf03}= ={main~._index.js~41f5a26e}= ={main~._inner-module_small.js~3}= ={main~._subfolder_big.js~b}= ={main~._subfolder_small.js~1}= ={main~._very-big.js~08cf55cf}= ={main~._very-big.js~4647fb9d}= ={main~._very-big.js~62f7f644}= ={vendors~main~._node_modules_b}= ={vendors~main~._node_modules_very-big.js~6bdbed7b}= [initial] [rendered] - > ./ main - [./small.js?1] 67 bytes {main~._small.js~1} [built] - [./small.js?2] 67 bytes {main~._small.js~1} [built] - [./small.js?3] 67 bytes {main~._small.js~1} [built] - [./small.js?4] 67 bytes {main~._small.js~1} [built] - [./small.js?5] 67 bytes {main~._small.js~1} [built] - [./small.js?6] 67 bytes {main~._small.js~1} [built] - [./small.js?7] 67 bytes {main~._small.js~1} [built] - [./small.js?8] 67 bytes {main~._small.js~1} [built] - [./small.js?9] 67 bytes {main~._small.js~1} [built] - chunk {main~._subfolder_big.js~b} dev-main~._subfolder_big.js~b.js (main~._subfolder_big.js~b) 536 bytes ={main~._big.js~1}= ={main~._in-some-directory_b}= ={main~._in-some-directory_very-big.js~8d76cf03}= ={main~._index.js~41f5a26e}= ={main~._inner-module_small.js~3}= ={main~._small.js~1}= ={main~._subfolder_small.js~1}= ={main~._very-big.js~08cf55cf}= ={main~._very-big.js~4647fb9d}= ={main~._very-big.js~62f7f644}= ={vendors~main~._node_modules_b}= ={vendors~main~._node_modules_very-big.js~6bdbed7b}= [initial] [rendered] - > ./ main - [./subfolder/big.js?1] 268 bytes {main~._subfolder_big.js~b} [built] - [./subfolder/big.js?2] 268 bytes {main~._subfolder_big.js~b} [built] - chunk {main~._subfolder_small.js~1} dev-main~._subfolder_small.js~1.js (main~._subfolder_small.js~1) 603 bytes ={main~._big.js~1}= ={main~._in-some-directory_b}= ={main~._in-some-directory_very-big.js~8d76cf03}= ={main~._index.js~41f5a26e}= ={main~._inner-module_small.js~3}= ={main~._small.js~1}= ={main~._subfolder_big.js~b}= ={main~._very-big.js~08cf55cf}= ={main~._very-big.js~4647fb9d}= ={main~._very-big.js~62f7f644}= ={vendors~main~._node_modules_b}= ={vendors~main~._node_modules_very-big.js~6bdbed7b}= [initial] [rendered] - > ./ main - [./subfolder/small.js?1] 67 bytes {main~._subfolder_small.js~1} [built] - [./subfolder/small.js?2] 67 bytes {main~._subfolder_small.js~1} [built] - [./subfolder/small.js?3] 67 bytes {main~._subfolder_small.js~1} [built] - [./subfolder/small.js?4] 67 bytes {main~._subfolder_small.js~1} [built] - [./subfolder/small.js?5] 67 bytes {main~._subfolder_small.js~1} [built] - [./subfolder/small.js?6] 67 bytes {main~._subfolder_small.js~1} [built] - [./subfolder/small.js?7] 67 bytes {main~._subfolder_small.js~1} [built] - [./subfolder/small.js?8] 67 bytes {main~._subfolder_small.js~1} [built] - [./subfolder/small.js?9] 67 bytes {main~._subfolder_small.js~1} [built] - chunk {main~._very-big.js~08cf55cf} dev-main~._very-big.js~08cf55cf.js (main~._very-big.js~08cf55cf) 1.57 KiB ={main~._big.js~1}= ={main~._in-some-directory_b}= ={main~._in-some-directory_very-big.js~8d76cf03}= ={main~._index.js~41f5a26e}= ={main~._inner-module_small.js~3}= ={main~._small.js~1}= ={main~._subfolder_big.js~b}= ={main~._subfolder_small.js~1}= ={main~._very-big.js~4647fb9d}= ={main~._very-big.js~62f7f644}= ={vendors~main~._node_modules_b}= ={vendors~main~._node_modules_very-big.js~6bdbed7b}= [initial] [rendered] - > ./ main - [./very-big.js?2] 1.57 KiB {main~._very-big.js~08cf55cf} [built] - chunk {main~._very-big.js~4647fb9d} dev-main~._very-big.js~4647fb9d.js (main~._very-big.js~4647fb9d) 1.57 KiB ={main~._big.js~1}= ={main~._in-some-directory_b}= ={main~._in-some-directory_very-big.js~8d76cf03}= ={main~._index.js~41f5a26e}= ={main~._inner-module_small.js~3}= ={main~._small.js~1}= ={main~._subfolder_big.js~b}= ={main~._subfolder_small.js~1}= ={main~._very-big.js~08cf55cf}= ={main~._very-big.js~62f7f644}= ={vendors~main~._node_modules_b}= ={vendors~main~._node_modules_very-big.js~6bdbed7b}= [initial] [rendered] - > ./ main - [./very-big.js?3] 1.57 KiB {main~._very-big.js~4647fb9d} [built] - chunk {main~._very-big.js~62f7f644} dev-main~._very-big.js~62f7f644.js (main~._very-big.js~62f7f644) 1.57 KiB ={main~._big.js~1}= ={main~._in-some-directory_b}= ={main~._in-some-directory_very-big.js~8d76cf03}= ={main~._index.js~41f5a26e}= ={main~._inner-module_small.js~3}= ={main~._small.js~1}= ={main~._subfolder_big.js~b}= ={main~._subfolder_small.js~1}= ={main~._very-big.js~08cf55cf}= ={main~._very-big.js~4647fb9d}= ={vendors~main~._node_modules_b}= ={vendors~main~._node_modules_very-big.js~6bdbed7b}= [entry] [rendered] - > ./ main - [./very-big.js?1] 1.57 KiB {main~._very-big.js~62f7f644} [built] - chunk {vendors~main~._node_modules_b} dev-vendors~main~._node_modules_b.js (vendors~main~._node_modules_b) 402 bytes ={main~._big.js~1}= ={main~._in-some-directory_b}= ={main~._in-some-directory_very-big.js~8d76cf03}= ={main~._index.js~41f5a26e}= ={main~._inner-module_small.js~3}= ={main~._small.js~1}= ={main~._subfolder_big.js~b}= ={main~._subfolder_small.js~1}= ={main~._very-big.js~08cf55cf}= ={main~._very-big.js~4647fb9d}= ={main~._very-big.js~62f7f644}= ={vendors~main~._node_modules_very-big.js~6bdbed7b}= [initial] [rendered] split chunk (cache group: vendors) (name: vendors~main) - > ./ main - [./node_modules/big.js?1] 268 bytes {vendors~main~._node_modules_b} [built] - [./node_modules/small.js?1] 67 bytes {vendors~main~._node_modules_b} [built] - [./node_modules/small.js?2] 67 bytes {vendors~main~._node_modules_b} [built] - chunk {vendors~main~._node_modules_very-big.js~6bdbed7b} dev-vendors~main~._node_modules_very-big.js~6bdbed7b.js (vendors~main~._node_modules_very-big.js~6bdbed7b) 1.57 KiB ={main~._big.js~1}= ={main~._in-some-directory_b}= ={main~._in-some-directory_very-big.js~8d76cf03}= ={main~._index.js~41f5a26e}= ={main~._inner-module_small.js~3}= ={main~._small.js~1}= ={main~._subfolder_big.js~b}= ={main~._subfolder_small.js~1}= ={main~._very-big.js~08cf55cf}= ={main~._very-big.js~4647fb9d}= ={main~._very-big.js~62f7f644}= ={vendors~main~._node_modules_b}= [initial] [rendered] split chunk (cache group: vendors) (name: vendors~main) - > ./ main - [./node_modules/very-big.js?1] 1.57 KiB {vendors~main~._node_modules_very-big.js~6bdbed7b} [built] -Child switched: - Entrypoint main = switched-vendors~main~7274e1de.js switched-main~2bc5b870.js switched-main~748942c6.js switched-main~17acad98.js switched-main~b2c7414a.js switched-main~d9f1562b.js switched-main~c6931360.js switched-main~cd7c5bfc.js switched-main~02369f19.js - chunk {0} switched-main~02369f19.js (main~02369f19) 1.57 KiB ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= [entry] [rendered] - > ./ main - [11] ./very-big.js?1 1.57 KiB {0} [built] - chunk {1} switched-main~17acad98.js (main~17acad98) 1.57 KiB ={0}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= [initial] [rendered] - > ./ main - [39] ./in-some-directory/very-big.js?1 1.57 KiB {1} [built] - chunk {2} switched-main~2bc5b870.js (main~2bc5b870) 1.05 KiB ={0}= ={1}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= [initial] [rendered] - > ./ main - [0] ./big.js?1 268 bytes {2} [built] - [1] ./big.js?2 268 bytes {2} [built] - [34] ./in-some-directory/big.js?1 268 bytes {2} [built] - [35] ./in-some-directory/small.js?1 67 bytes {2} [built] - [36] ./in-some-directory/small.js?2 67 bytes {2} [built] - [37] ./in-some-directory/small.js?3 67 bytes {2} [built] - [38] ./in-some-directory/small.js?4 67 bytes {2} [built] - chunk {3} switched-main~748942c6.js (main~748942c6) 1.18 KiB ={0}= ={1}= ={2}= ={4}= ={5}= ={6}= ={7}= ={8}= [initial] [rendered] - > ./ main - [2] ./small.js?1 67 bytes {3} [built] - [3] ./small.js?2 67 bytes {3} [built] - [4] ./small.js?3 67 bytes {3} [built] - [5] ./small.js?4 67 bytes {3} [built] - [6] ./small.js?5 67 bytes {3} [built] - [7] ./small.js?6 67 bytes {3} [built] - [8] ./small.js?7 67 bytes {3} [built] - [9] ./small.js?8 67 bytes {3} [built] - [10] ./small.js?9 67 bytes {3} [built] - [25] ./inner-module/small.js?1 67 bytes {3} [built] - [26] ./inner-module/small.js?2 67 bytes {3} [built] - [27] ./inner-module/small.js?3 67 bytes {3} [built] - [28] ./inner-module/small.js?4 67 bytes {3} [built] - [29] ./inner-module/small.js?5 67 bytes {3} [built] - [30] ./inner-module/small.js?6 67 bytes {3} [built] - + 3 hidden modules - chunk {4} switched-main~b2c7414a.js (main~b2c7414a) 1.19 KiB ={0}= ={1}= ={2}= ={3}= ={5}= ={6}= ={7}= ={8}= [initial] [rendered] - > ./ main - [44] ./index.js 1.19 KiB {4} [built] - chunk {5} switched-main~c6931360.js (main~c6931360) 1.57 KiB ={0}= ={1}= ={2}= ={3}= ={4}= ={6}= ={7}= ={8}= [initial] [rendered] - > ./ main - [12] ./very-big.js?2 1.57 KiB {5} [built] - chunk {6} switched-main~cd7c5bfc.js (main~cd7c5bfc) 1.57 KiB ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={7}= ={8}= [initial] [rendered] - > ./ main - [13] ./very-big.js?3 1.57 KiB {6} [built] - chunk {7} switched-main~d9f1562b.js (main~d9f1562b) 1.11 KiB ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={8}= [initial] [rendered] - > ./ main - [14] ./subfolder/big.js?1 268 bytes {7} [built] - [15] ./subfolder/big.js?2 268 bytes {7} [built] - [16] ./subfolder/small.js?1 67 bytes {7} [built] - [17] ./subfolder/small.js?2 67 bytes {7} [built] - [18] ./subfolder/small.js?3 67 bytes {7} [built] - [19] ./subfolder/small.js?4 67 bytes {7} [built] - [20] ./subfolder/small.js?5 67 bytes {7} [built] - [21] ./subfolder/small.js?6 67 bytes {7} [built] - [22] ./subfolder/small.js?7 67 bytes {7} [built] - [23] ./subfolder/small.js?8 67 bytes {7} [built] - [24] ./subfolder/small.js?9 67 bytes {7} [built] - chunk {8} switched-vendors~main~7274e1de.js (vendors~main~7274e1de) 1.96 KiB ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= [initial] [rendered] split chunk (cache group: vendors) (name: vendors~main) - > ./ main - [40] ./node_modules/big.js?1 268 bytes {8} [built] - [41] ./node_modules/small.js?1 67 bytes {8} [built] - [42] ./node_modules/small.js?2 67 bytes {8} [built] - [43] ./node_modules/very-big.js?1 1.57 KiB {8} [built] - - WARNING in SplitChunksPlugin - Cache group vendors - Configured minSize (1000 bytes) is bigger than maxSize (100 bytes). - This seem to be a invalid optimiziation.splitChunks configuration. - - WARNING in SplitChunksPlugin - Fallback cache group - Configured minSize (1000 bytes) is bigger than maxSize (100 bytes). - This seem to be a invalid optimiziation.splitChunks configuration. -Child zero-min: - Entrypoint main = zero-min-vendors~main~7274e1de.js zero-min-vendors~main~0feae4ad.js zero-min-main~6e7ead72.js zero-min-main~6a2ae26b.js zero-min-main~17acad98.js zero-min-main~b2c7414a.js zero-min-main~75f09de8.js zero-min-main~052b3814.js zero-min-main~3ff27526.js zero-min-main~11485824.js zero-min-main~c6931360.js zero-min-main~cd7c5bfc.js zero-min-main~02369f19.js - chunk {0} zero-min-main~02369f19.js (main~02369f19) 1.57 KiB ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={9}= ={10}= ={11}= ={12}= [entry] [rendered] - > ./ main - [11] ./very-big.js?1 1.57 KiB {0} [built] - chunk {1} zero-min-main~052b3814.js (main~052b3814) 603 bytes ={0}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={9}= ={10}= ={11}= ={12}= [initial] [rendered] - > ./ main - [2] ./small.js?1 67 bytes {1} [built] - [3] ./small.js?2 67 bytes {1} [built] - [4] ./small.js?3 67 bytes {1} [built] - [5] ./small.js?4 67 bytes {1} [built] - [6] ./small.js?5 67 bytes {1} [built] - [7] ./small.js?6 67 bytes {1} [built] - [8] ./small.js?7 67 bytes {1} [built] - [9] ./small.js?8 67 bytes {1} [built] - [10] ./small.js?9 67 bytes {1} [built] - chunk {2} zero-min-main~11485824.js (main~11485824) 603 bytes ={0}= ={1}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={9}= ={10}= ={11}= ={12}= [initial] [rendered] - > ./ main - [16] ./subfolder/small.js?1 67 bytes {2} [built] - [17] ./subfolder/small.js?2 67 bytes {2} [built] - [18] ./subfolder/small.js?3 67 bytes {2} [built] - [19] ./subfolder/small.js?4 67 bytes {2} [built] - [20] ./subfolder/small.js?5 67 bytes {2} [built] - [21] ./subfolder/small.js?6 67 bytes {2} [built] - [22] ./subfolder/small.js?7 67 bytes {2} [built] - [23] ./subfolder/small.js?8 67 bytes {2} [built] - [24] ./subfolder/small.js?9 67 bytes {2} [built] - chunk {3} zero-min-main~17acad98.js (main~17acad98) 1.57 KiB ={0}= ={1}= ={2}= ={4}= ={5}= ={6}= ={7}= ={8}= ={9}= ={10}= ={11}= ={12}= [initial] [rendered] - > ./ main - [39] ./in-some-directory/very-big.js?1 1.57 KiB {3} [built] - chunk {4} zero-min-main~3ff27526.js (main~3ff27526) 536 bytes ={0}= ={1}= ={2}= ={3}= ={5}= ={6}= ={7}= ={8}= ={9}= ={10}= ={11}= ={12}= [initial] [rendered] - > ./ main - [14] ./subfolder/big.js?1 268 bytes {4} [built] - [15] ./subfolder/big.js?2 268 bytes {4} [built] - chunk {5} zero-min-main~6a2ae26b.js (main~6a2ae26b) 536 bytes ={0}= ={1}= ={2}= ={3}= ={4}= ={6}= ={7}= ={8}= ={9}= ={10}= ={11}= ={12}= [initial] [rendered] - > ./ main - [34] ./in-some-directory/big.js?1 268 bytes {5} [built] - [35] ./in-some-directory/small.js?1 67 bytes {5} [built] - [36] ./in-some-directory/small.js?2 67 bytes {5} [built] - [37] ./in-some-directory/small.js?3 67 bytes {5} [built] - [38] ./in-some-directory/small.js?4 67 bytes {5} [built] - chunk {6} zero-min-main~6e7ead72.js (main~6e7ead72) 536 bytes ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={7}= ={8}= ={9}= ={10}= ={11}= ={12}= [initial] [rendered] - > ./ main - [0] ./big.js?1 268 bytes {6} [built] - [1] ./big.js?2 268 bytes {6} [built] - chunk {7} zero-min-main~75f09de8.js (main~75f09de8) 603 bytes ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={8}= ={9}= ={10}= ={11}= ={12}= [initial] [rendered] - > ./ main - [25] ./inner-module/small.js?1 67 bytes {7} [built] - [26] ./inner-module/small.js?2 67 bytes {7} [built] - [27] ./inner-module/small.js?3 67 bytes {7} [built] - [28] ./inner-module/small.js?4 67 bytes {7} [built] - [29] ./inner-module/small.js?5 67 bytes {7} [built] - [30] ./inner-module/small.js?6 67 bytes {7} [built] - [31] ./inner-module/small.js?7 67 bytes {7} [built] - [32] ./inner-module/small.js?8 67 bytes {7} [built] - [33] ./inner-module/small.js?9 67 bytes {7} [built] - chunk {8} zero-min-main~b2c7414a.js (main~b2c7414a) 1.19 KiB ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={9}= ={10}= ={11}= ={12}= [initial] [rendered] - > ./ main - [44] ./index.js 1.19 KiB {8} [built] - chunk {9} zero-min-main~c6931360.js (main~c6931360) 1.57 KiB ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={10}= ={11}= ={12}= [initial] [rendered] - > ./ main - [12] ./very-big.js?2 1.57 KiB {9} [built] - chunk {10} zero-min-main~cd7c5bfc.js (main~cd7c5bfc) 1.57 KiB ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={9}= ={11}= ={12}= [initial] [rendered] - > ./ main - [13] ./very-big.js?3 1.57 KiB {10} [built] - chunk {11} zero-min-vendors~main~0feae4ad.js (vendors~main~0feae4ad) 1.57 KiB ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={9}= ={10}= ={12}= [initial] [rendered] split chunk (cache group: vendors) (name: vendors~main) - > ./ main - [43] ./node_modules/very-big.js?1 1.57 KiB {11} [built] - chunk {12} zero-min-vendors~main~7274e1de.js (vendors~main~7274e1de) 402 bytes ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={9}= ={10}= ={11}= [initial] [rendered] split chunk (cache group: vendors) (name: vendors~main) - > ./ main - [40] ./node_modules/big.js?1 268 bytes {12} [built] - [41] ./node_modules/small.js?1 67 bytes {12} [built] - [42] ./node_modules/small.js?2 67 bytes {12} [built] -Child enforce-min-size: - Entrypoint main = enforce-min-size-all~main~6e7ead72.js enforce-min-size-all~main~6a2ae26b.js enforce-min-size-all~main~17acad98.js enforce-min-size-all~main~b2c7414a.js enforce-min-size-all~main~75f09de8.js enforce-min-size-all~main~7274e1de.js enforce-min-size-all~main~0feae4ad.js enforce-min-size-all~main~052b3814.js enforce-min-size-all~main~3ff27526.js enforce-min-size-all~main~11485824.js enforce-min-size-all~main~c6931360.js enforce-min-size-all~main~cd7c5bfc.js enforce-min-size-all~main~02369f19.js enforce-min-size-main.js - chunk {0} enforce-min-size-all~main~02369f19.js (all~main~02369f19) 1.57 KiB ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={9}= ={10}= ={11}= ={12}= ={13}= [initial] [rendered] split chunk (cache group: all) (name: all~main) - > ./ main - [11] ./very-big.js?1 1.57 KiB {0} [built] - chunk {1} enforce-min-size-all~main~052b3814.js (all~main~052b3814) 603 bytes ={0}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={9}= ={10}= ={11}= ={12}= ={13}= [initial] [rendered] split chunk (cache group: all) (name: all~main) - > ./ main - [2] ./small.js?1 67 bytes {1} [built] - [3] ./small.js?2 67 bytes {1} [built] - [4] ./small.js?3 67 bytes {1} [built] - [5] ./small.js?4 67 bytes {1} [built] - [6] ./small.js?5 67 bytes {1} [built] - [7] ./small.js?6 67 bytes {1} [built] - [8] ./small.js?7 67 bytes {1} [built] - [9] ./small.js?8 67 bytes {1} [built] - [10] ./small.js?9 67 bytes {1} [built] - chunk {2} enforce-min-size-all~main~0feae4ad.js (all~main~0feae4ad) 1.57 KiB ={0}= ={1}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={9}= ={10}= ={11}= ={12}= ={13}= [initial] [rendered] split chunk (cache group: all) (name: all~main) - > ./ main - [43] ./node_modules/very-big.js?1 1.57 KiB {2} [built] - chunk {3} enforce-min-size-all~main~11485824.js (all~main~11485824) 603 bytes ={0}= ={1}= ={2}= ={4}= ={5}= ={6}= ={7}= ={8}= ={9}= ={10}= ={11}= ={12}= ={13}= [initial] [rendered] split chunk (cache group: all) (name: all~main) - > ./ main - [16] ./subfolder/small.js?1 67 bytes {3} [built] - [17] ./subfolder/small.js?2 67 bytes {3} [built] - [18] ./subfolder/small.js?3 67 bytes {3} [built] - [19] ./subfolder/small.js?4 67 bytes {3} [built] - [20] ./subfolder/small.js?5 67 bytes {3} [built] - [21] ./subfolder/small.js?6 67 bytes {3} [built] - [22] ./subfolder/small.js?7 67 bytes {3} [built] - [23] ./subfolder/small.js?8 67 bytes {3} [built] - [24] ./subfolder/small.js?9 67 bytes {3} [built] - chunk {4} enforce-min-size-all~main~17acad98.js (all~main~17acad98) 1.57 KiB ={0}= ={1}= ={2}= ={3}= ={5}= ={6}= ={7}= ={8}= ={9}= ={10}= ={11}= ={12}= ={13}= [initial] [rendered] split chunk (cache group: all) (name: all~main) - > ./ main - [39] ./in-some-directory/very-big.js?1 1.57 KiB {4} [built] - chunk {5} enforce-min-size-all~main~3ff27526.js (all~main~3ff27526) 536 bytes ={0}= ={1}= ={2}= ={3}= ={4}= ={6}= ={7}= ={8}= ={9}= ={10}= ={11}= ={12}= ={13}= [initial] [rendered] split chunk (cache group: all) (name: all~main) - > ./ main - [14] ./subfolder/big.js?1 268 bytes {5} [built] - [15] ./subfolder/big.js?2 268 bytes {5} [built] - chunk {6} enforce-min-size-all~main~6a2ae26b.js (all~main~6a2ae26b) 536 bytes ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={7}= ={8}= ={9}= ={10}= ={11}= ={12}= ={13}= [initial] [rendered] split chunk (cache group: all) (name: all~main) - > ./ main - [34] ./in-some-directory/big.js?1 268 bytes {6} [built] - [35] ./in-some-directory/small.js?1 67 bytes {6} [built] - [36] ./in-some-directory/small.js?2 67 bytes {6} [built] - [37] ./in-some-directory/small.js?3 67 bytes {6} [built] - [38] ./in-some-directory/small.js?4 67 bytes {6} [built] - chunk {7} enforce-min-size-all~main~6e7ead72.js (all~main~6e7ead72) 536 bytes ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={8}= ={9}= ={10}= ={11}= ={12}= ={13}= [initial] [rendered] split chunk (cache group: all) (name: all~main) - > ./ main - [0] ./big.js?1 268 bytes {7} [built] - [1] ./big.js?2 268 bytes {7} [built] - chunk {8} enforce-min-size-all~main~7274e1de.js (all~main~7274e1de) 402 bytes ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={9}= ={10}= ={11}= ={12}= ={13}= [initial] [rendered] split chunk (cache group: all) (name: all~main) - > ./ main - [40] ./node_modules/big.js?1 268 bytes {8} [built] - [41] ./node_modules/small.js?1 67 bytes {8} [built] - [42] ./node_modules/small.js?2 67 bytes {8} [built] - chunk {9} enforce-min-size-all~main~75f09de8.js (all~main~75f09de8) 603 bytes ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={10}= ={11}= ={12}= ={13}= [initial] [rendered] split chunk (cache group: all) (name: all~main) - > ./ main - [25] ./inner-module/small.js?1 67 bytes {9} [built] - [26] ./inner-module/small.js?2 67 bytes {9} [built] - [27] ./inner-module/small.js?3 67 bytes {9} [built] - [28] ./inner-module/small.js?4 67 bytes {9} [built] - [29] ./inner-module/small.js?5 67 bytes {9} [built] - [30] ./inner-module/small.js?6 67 bytes {9} [built] - [31] ./inner-module/small.js?7 67 bytes {9} [built] - [32] ./inner-module/small.js?8 67 bytes {9} [built] - [33] ./inner-module/small.js?9 67 bytes {9} [built] - chunk {10} enforce-min-size-all~main~b2c7414a.js (all~main~b2c7414a) 1.19 KiB ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={9}= ={11}= ={12}= ={13}= [initial] [rendered] split chunk (cache group: all) (name: all~main) - > ./ main - [44] ./index.js 1.19 KiB {10} [built] - chunk {11} enforce-min-size-all~main~c6931360.js (all~main~c6931360) 1.57 KiB ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={9}= ={10}= ={12}= ={13}= [initial] [rendered] split chunk (cache group: all) (name: all~main) - > ./ main - [12] ./very-big.js?2 1.57 KiB {11} [built] - chunk {12} enforce-min-size-all~main~cd7c5bfc.js (all~main~cd7c5bfc) 1.57 KiB ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={9}= ={10}= ={11}= ={13}= [initial] [rendered] split chunk (cache group: all) (name: all~main) - > ./ main - [13] ./very-big.js?3 1.57 KiB {12} [built] - chunk {13} enforce-min-size-main.js (main) 0 bytes ={0}= ={1}= ={2}= ={3}= ={4}= ={5}= ={6}= ={7}= ={8}= ={9}= ={10}= ={11}= ={12}= [entry] [rendered] - > ./ main" -`; - -exports[`StatsTestCases should print correct stats for split-chunks-prefer-bigger-splits 1`] = ` -"Entrypoint main = default/main.js -chunk {0} default/async-b~async-c.js (async-b~async-c) 110 bytes <{4}> ={2}= ={3}= [rendered] split chunk (cache group: default) (name: async-b~async-c) - > ./b [0] ./index.js 2:0-47 - > ./c [0] ./index.js 3:0-47 - [4] ./d.js 43 bytes {0} {1} [built] - [6] ./f.js 67 bytes {0} [built] -chunk {1} default/async-a.js (async-a) 134 bytes <{4}> [rendered] - > ./a [0] ./index.js 1:0-47 - [1] ./a.js 48 bytes {1} [built] - [4] ./d.js 43 bytes {0} {1} [built] - [5] ./e.js 43 bytes {1} {2} [built] -chunk {2} default/async-b.js (async-b) 105 bytes <{4}> ={0}= [rendered] - > ./b [0] ./index.js 2:0-47 - [2] ./b.js 62 bytes {2} [built] - [5] ./e.js 43 bytes {1} {2} [built] -chunk {3} default/async-c.js (async-c) 48 bytes <{4}> ={0}= [rendered] - > ./c [0] ./index.js 3:0-47 - [3] ./c.js 48 bytes {3} [built] -chunk {4} default/main.js (main) 147 bytes >{0}< >{1}< >{2}< >{3}< [entry] [rendered] - > ./ main - [0] ./index.js 147 bytes {4} [built]" -`; - -exports[`StatsTestCases should print correct stats for tree-shaking 1`] = ` -"Hash: ecca8f58566e08b05b03 -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -bundle.js 8.23 KiB 0 [emitted] main -Entrypoint main = bundle.js - [0] ./a.js 13 bytes {0} [built] - [exports: a] - [all exports used] - [1] ./b.js 13 bytes {0} [built] - [exports: b] - [no exports used] - [2] ./unknown.js 0 bytes {0} [built] - [only some exports used: c] - [3] ./reexport-unknown.js 83 bytes {0} [built] - [exports: a, b, c, d] - [only some exports used: a, c] - [4] ./reexport-star-unknown.js 68 bytes {0} [built] - [only some exports used: a, c] - [5] ./unknown2.js 0 bytes {0} [built] - [only some exports used: y] - [6] ./reexport-known.js 49 bytes {0} [built] - [exports: a, b] - [only some exports used: a] - [7] ./reexport-star-known.js 41 bytes {0} [built] - [exports: a, b] - [only some exports used: a] - [8] ./edge.js 45 bytes {0} [built] - [only some exports used: y] - [9] ./index.js 315 bytes {0} [built] - [no exports] -[10] ./require.include.js 36 bytes {0} [built] - [exports: a, default] - [no exports used]" -`; - -exports[`StatsTestCases should print correct stats for warnings-terser 1`] = ` -"Hash: 5ddef8e3e0b2f2c278c4 -Time: Xms -Built at: Thu Jan 01 1970 00:00:00 GMT - Asset Size Chunks Chunk Names -bundle.js 2.89 KiB 0 [emitted] main -Entrypoint main = bundle.js -[0] ./index.js 299 bytes {0} [built] -[1] ./a.js 249 bytes {0} [built] -[2] (webpack)/buildin/module.js 497 bytes {0} [built] - -WARNING in Terser Plugin: Dropping unused function someUnRemoteUsedFunction1 [./a.js:3,0] - -WARNING in Terser Plugin: Dropping unused function someUnRemoteUsedFunction2 [./a.js:4,0] - -WARNING in Terser Plugin: Dropping unused function someUnRemoteUsedFunction3 [./a.js:5,0] - -WARNING in Terser Plugin: Dropping unused function someUnRemoteUsedFunction4 [./a.js:6,0] - -WARNING in Terser Plugin: Dropping unused function someUnRemoteUsedFunction5 [./a.js:7,0]" -`; diff --git a/test/__snapshots__/target-browserslist.unittest.js.snap b/test/__snapshots__/target-browserslist.unittest.js.snap new file mode 100644 index 00000000000..613382978d6 --- /dev/null +++ b/test/__snapshots__/target-browserslist.unittest.js.snap @@ -0,0 +1,1148 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`browserslist target ["and_chr 80"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": true, + "browser": true, + "const": true, + "destructuring": true, + "document": true, + "dynamicImport": true, + "dynamicImportInWorker": true, + "electron": false, + "fetchWasm": true, + "forOf": true, + "global": false, + "globalThis": true, + "importScripts": false, + "importScriptsInWorker": true, + "module": true, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": true, + "require": false, + "templateLiteral": true, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["and_ff 68"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": true, + "browser": true, + "const": true, + "destructuring": true, + "document": true, + "dynamicImport": true, + "dynamicImportInWorker": true, + "electron": false, + "fetchWasm": true, + "forOf": true, + "global": false, + "globalThis": true, + "importScripts": false, + "importScriptsInWorker": true, + "module": true, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": true, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["and_qq 10.4"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": false, + "bigIntLiteral": false, + "browser": true, + "const": true, + "destructuring": false, + "document": true, + "dynamicImport": true, + "dynamicImportInWorker": true, + "electron": false, + "fetchWasm": true, + "forOf": false, + "global": false, + "globalThis": false, + "importScripts": false, + "importScriptsInWorker": true, + "module": true, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": true, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["and_uc 12.12"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": false, + "bigIntLiteral": false, + "browser": true, + "const": true, + "destructuring": false, + "document": true, + "dynamicImport": false, + "dynamicImportInWorker": false, + "electron": false, + "fetchWasm": true, + "forOf": false, + "global": false, + "globalThis": false, + "importScripts": false, + "importScriptsInWorker": true, + "module": false, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": true, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["android 4"] 1`] = ` +Object { + "arrowFunction": false, + "asyncFunction": false, + "bigIntLiteral": false, + "browser": true, + "const": false, + "destructuring": false, + "document": true, + "dynamicImport": false, + "dynamicImportInWorker": false, + "electron": false, + "fetchWasm": true, + "forOf": false, + "global": false, + "globalThis": false, + "importScripts": false, + "importScriptsInWorker": true, + "module": false, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": false, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["android 4.1"] 1`] = ` +Object { + "arrowFunction": false, + "asyncFunction": false, + "bigIntLiteral": false, + "browser": true, + "const": false, + "destructuring": false, + "document": true, + "dynamicImport": false, + "dynamicImportInWorker": false, + "electron": false, + "fetchWasm": true, + "forOf": false, + "global": false, + "globalThis": false, + "importScripts": false, + "importScriptsInWorker": true, + "module": false, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": false, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["android 4.4.3-4.4.4"] 1`] = ` +Object { + "arrowFunction": false, + "asyncFunction": false, + "bigIntLiteral": false, + "browser": true, + "const": false, + "destructuring": false, + "document": true, + "dynamicImport": false, + "dynamicImportInWorker": false, + "electron": false, + "fetchWasm": true, + "forOf": false, + "global": false, + "globalThis": false, + "importScripts": false, + "importScriptsInWorker": true, + "module": false, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": false, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["android 81"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": true, + "browser": true, + "const": true, + "destructuring": true, + "document": true, + "dynamicImport": true, + "dynamicImportInWorker": true, + "electron": false, + "fetchWasm": true, + "forOf": true, + "global": false, + "globalThis": true, + "importScripts": false, + "importScriptsInWorker": true, + "module": true, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": true, + "require": false, + "templateLiteral": true, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["baidu 7.12"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": false, + "bigIntLiteral": false, + "browser": true, + "const": false, + "destructuring": false, + "document": true, + "dynamicImport": false, + "dynamicImportInWorker": false, + "electron": false, + "fetchWasm": true, + "forOf": false, + "global": false, + "globalThis": false, + "importScripts": false, + "importScriptsInWorker": true, + "module": false, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": true, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["bb 10"] 1`] = ` +Object { + "arrowFunction": false, + "asyncFunction": false, + "bigIntLiteral": false, + "browser": true, + "const": false, + "destructuring": false, + "document": true, + "dynamicImport": false, + "dynamicImportInWorker": false, + "electron": false, + "fetchWasm": true, + "forOf": false, + "global": false, + "globalThis": false, + "importScripts": false, + "importScriptsInWorker": true, + "module": false, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": false, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["chrome 80","node 12.19.0"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": true, + "browser": null, + "const": true, + "destructuring": true, + "document": null, + "dynamicImport": true, + "dynamicImportInWorker": false, + "electron": false, + "fetchWasm": null, + "forOf": true, + "global": null, + "globalThis": true, + "importScripts": false, + "importScriptsInWorker": true, + "module": true, + "node": null, + "nodeBuiltins": null, + "nodePrefixForCoreModules": null, + "nwjs": false, + "optionalChaining": false, + "require": null, + "templateLiteral": true, + "web": null, + "webworker": false, +} +`; + +exports[`browserslist target ["chrome 80"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": true, + "browser": true, + "const": true, + "destructuring": true, + "document": true, + "dynamicImport": true, + "dynamicImportInWorker": true, + "electron": false, + "fetchWasm": true, + "forOf": true, + "global": false, + "globalThis": true, + "importScripts": false, + "importScriptsInWorker": true, + "module": true, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": true, + "require": false, + "templateLiteral": true, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["edge 79"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": true, + "browser": true, + "const": true, + "destructuring": true, + "document": true, + "dynamicImport": true, + "dynamicImportInWorker": true, + "electron": false, + "fetchWasm": true, + "forOf": true, + "global": false, + "globalThis": true, + "importScripts": false, + "importScriptsInWorker": true, + "module": true, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": true, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["firefox 68"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": true, + "browser": true, + "const": true, + "destructuring": true, + "document": true, + "dynamicImport": true, + "dynamicImportInWorker": true, + "electron": false, + "fetchWasm": true, + "forOf": true, + "global": false, + "globalThis": true, + "importScripts": false, + "importScriptsInWorker": true, + "module": true, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": true, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["firefox 80","chrome 80"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": true, + "browser": true, + "const": true, + "destructuring": true, + "document": true, + "dynamicImport": true, + "dynamicImportInWorker": true, + "electron": false, + "fetchWasm": true, + "forOf": true, + "global": false, + "globalThis": true, + "importScripts": false, + "importScriptsInWorker": true, + "module": true, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": true, + "require": false, + "templateLiteral": true, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["ie 11"] 1`] = ` +Object { + "arrowFunction": false, + "asyncFunction": false, + "bigIntLiteral": false, + "browser": true, + "const": false, + "destructuring": false, + "document": true, + "dynamicImport": false, + "dynamicImportInWorker": false, + "electron": false, + "fetchWasm": true, + "forOf": false, + "global": false, + "globalThis": false, + "importScripts": false, + "importScriptsInWorker": true, + "module": false, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": false, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["ie_mob 11"] 1`] = ` +Object { + "arrowFunction": false, + "asyncFunction": false, + "bigIntLiteral": false, + "browser": true, + "const": false, + "destructuring": false, + "document": true, + "dynamicImport": false, + "dynamicImportInWorker": false, + "electron": false, + "fetchWasm": true, + "forOf": false, + "global": false, + "globalThis": false, + "importScripts": false, + "importScriptsInWorker": true, + "module": false, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": false, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["ios_saf 12.0-12.1"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": false, + "browser": true, + "const": true, + "destructuring": true, + "document": true, + "dynamicImport": true, + "dynamicImportInWorker": true, + "electron": false, + "fetchWasm": true, + "forOf": true, + "global": false, + "globalThis": false, + "importScripts": false, + "importScriptsInWorker": true, + "module": true, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": true, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["kaios 2.5"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": false, + "bigIntLiteral": false, + "browser": true, + "const": true, + "destructuring": true, + "document": true, + "dynamicImport": false, + "dynamicImportInWorker": false, + "electron": false, + "fetchWasm": true, + "forOf": false, + "global": false, + "globalThis": false, + "importScripts": false, + "importScriptsInWorker": true, + "module": false, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": true, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["node 0.10.0"] 1`] = ` +Object { + "arrowFunction": false, + "asyncFunction": false, + "bigIntLiteral": false, + "browser": false, + "const": false, + "destructuring": false, + "document": false, + "dynamicImport": false, + "dynamicImportInWorker": false, + "electron": false, + "fetchWasm": false, + "forOf": false, + "global": true, + "globalThis": false, + "importScripts": false, + "importScriptsInWorker": true, + "module": false, + "node": true, + "nodeBuiltins": true, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": true, + "templateLiteral": false, + "web": false, + "webworker": false, +} +`; + +exports[`browserslist target ["node 0.12.0"] 1`] = ` +Object { + "arrowFunction": false, + "asyncFunction": false, + "bigIntLiteral": false, + "browser": false, + "const": false, + "destructuring": false, + "document": false, + "dynamicImport": false, + "dynamicImportInWorker": false, + "electron": false, + "fetchWasm": false, + "forOf": true, + "global": true, + "globalThis": false, + "importScripts": false, + "importScriptsInWorker": true, + "module": false, + "node": true, + "nodeBuiltins": true, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": true, + "templateLiteral": false, + "web": false, + "webworker": false, +} +`; + +exports[`browserslist target ["node 10.0.0"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": false, + "browser": false, + "const": true, + "destructuring": true, + "document": false, + "dynamicImport": false, + "dynamicImportInWorker": false, + "electron": false, + "fetchWasm": false, + "forOf": true, + "global": true, + "globalThis": false, + "importScripts": false, + "importScriptsInWorker": true, + "module": false, + "node": true, + "nodeBuiltins": true, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": true, + "templateLiteral": true, + "web": false, + "webworker": false, +} +`; + +exports[`browserslist target ["node 10.17.0"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": true, + "browser": false, + "const": true, + "destructuring": true, + "document": false, + "dynamicImport": false, + "dynamicImportInWorker": false, + "electron": false, + "fetchWasm": false, + "forOf": true, + "global": true, + "globalThis": false, + "importScripts": false, + "importScriptsInWorker": true, + "module": false, + "node": true, + "nodeBuiltins": true, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": true, + "templateLiteral": true, + "web": false, + "webworker": false, +} +`; + +exports[`browserslist target ["node 12.19.0"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": true, + "browser": false, + "const": true, + "destructuring": true, + "document": false, + "dynamicImport": true, + "dynamicImportInWorker": false, + "electron": false, + "fetchWasm": false, + "forOf": true, + "global": true, + "globalThis": true, + "importScripts": false, + "importScriptsInWorker": true, + "module": true, + "node": true, + "nodeBuiltins": true, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": true, + "templateLiteral": true, + "web": false, + "webworker": false, +} +`; + +exports[`browserslist target ["op_mini all"] 1`] = ` +Object { + "arrowFunction": false, + "asyncFunction": false, + "bigIntLiteral": false, + "browser": true, + "const": false, + "destructuring": false, + "document": true, + "dynamicImport": false, + "dynamicImportInWorker": false, + "electron": false, + "fetchWasm": true, + "forOf": false, + "global": false, + "globalThis": false, + "importScripts": false, + "importScriptsInWorker": true, + "module": false, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": false, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["op_mob 54"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": true, + "browser": true, + "const": true, + "destructuring": true, + "document": true, + "dynamicImport": true, + "dynamicImportInWorker": true, + "electron": false, + "fetchWasm": true, + "forOf": true, + "global": false, + "globalThis": true, + "importScripts": false, + "importScriptsInWorker": true, + "module": true, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": false, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["opera 54"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": true, + "browser": true, + "const": true, + "destructuring": true, + "document": true, + "dynamicImport": true, + "dynamicImportInWorker": true, + "electron": false, + "fetchWasm": true, + "forOf": true, + "global": false, + "globalThis": false, + "importScripts": false, + "importScriptsInWorker": true, + "module": true, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": true, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["safari 10"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": false, + "bigIntLiteral": false, + "browser": true, + "const": false, + "destructuring": true, + "document": true, + "dynamicImport": false, + "dynamicImportInWorker": false, + "electron": false, + "fetchWasm": true, + "forOf": true, + "global": false, + "globalThis": false, + "importScripts": false, + "importScriptsInWorker": true, + "module": false, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": true, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["safari 11"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": false, + "browser": true, + "const": true, + "destructuring": true, + "document": true, + "dynamicImport": false, + "dynamicImportInWorker": false, + "electron": false, + "fetchWasm": true, + "forOf": true, + "global": false, + "globalThis": false, + "importScripts": false, + "importScriptsInWorker": true, + "module": true, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": true, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["safari 12.0"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": false, + "browser": true, + "const": true, + "destructuring": true, + "document": true, + "dynamicImport": true, + "dynamicImportInWorker": true, + "electron": false, + "fetchWasm": true, + "forOf": true, + "global": false, + "globalThis": false, + "importScripts": false, + "importScriptsInWorker": true, + "module": true, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": true, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["safari 12.1"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": false, + "browser": true, + "const": true, + "destructuring": true, + "document": true, + "dynamicImport": true, + "dynamicImportInWorker": true, + "electron": false, + "fetchWasm": true, + "forOf": true, + "global": false, + "globalThis": true, + "importScripts": false, + "importScriptsInWorker": true, + "module": true, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": true, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["safari 13"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": false, + "browser": true, + "const": true, + "destructuring": true, + "document": true, + "dynamicImport": true, + "dynamicImportInWorker": true, + "electron": false, + "fetchWasm": true, + "forOf": true, + "global": false, + "globalThis": true, + "importScripts": false, + "importScriptsInWorker": true, + "module": true, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": true, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["safari TP"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": true, + "browser": true, + "const": true, + "destructuring": true, + "document": true, + "dynamicImport": true, + "dynamicImportInWorker": true, + "electron": false, + "fetchWasm": true, + "forOf": true, + "global": false, + "globalThis": true, + "importScripts": false, + "importScriptsInWorker": true, + "module": true, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": true, + "require": false, + "templateLiteral": true, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["samsung 4"] 1`] = ` +Object { + "arrowFunction": false, + "asyncFunction": false, + "bigIntLiteral": false, + "browser": true, + "const": false, + "destructuring": false, + "document": true, + "dynamicImport": false, + "dynamicImportInWorker": false, + "electron": false, + "fetchWasm": true, + "forOf": true, + "global": false, + "globalThis": false, + "importScripts": false, + "importScriptsInWorker": true, + "module": false, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": true, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["samsung 9.2"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": true, + "browser": true, + "const": true, + "destructuring": true, + "document": true, + "dynamicImport": true, + "dynamicImportInWorker": true, + "electron": false, + "fetchWasm": true, + "forOf": true, + "global": false, + "globalThis": false, + "importScripts": false, + "importScriptsInWorker": true, + "module": true, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": true, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["samsung 11.1-11.2"] 1`] = ` +Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": true, + "browser": true, + "const": true, + "destructuring": true, + "document": true, + "dynamicImport": true, + "dynamicImportInWorker": true, + "electron": false, + "fetchWasm": true, + "forOf": true, + "global": false, + "globalThis": true, + "importScripts": false, + "importScriptsInWorker": true, + "module": true, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": true, + "web": true, + "webworker": false, +} +`; + +exports[`browserslist target ["unknown 50"] 1`] = ` +Object { + "arrowFunction": false, + "asyncFunction": false, + "bigIntLiteral": false, + "browser": true, + "const": false, + "destructuring": false, + "document": true, + "dynamicImport": false, + "dynamicImportInWorker": false, + "electron": false, + "fetchWasm": true, + "forOf": false, + "global": false, + "globalThis": false, + "importScripts": false, + "importScriptsInWorker": true, + "module": false, + "node": false, + "nodeBuiltins": false, + "nodePrefixForCoreModules": false, + "nwjs": false, + "optionalChaining": false, + "require": false, + "templateLiteral": false, + "web": true, + "webworker": false, +} +`; diff --git a/test/__snapshots__/walkCssTokens.unittest.js.snap b/test/__snapshots__/walkCssTokens.unittest.js.snap new file mode 100644 index 00000000000..966e5e86ad2 --- /dev/null +++ b/test/__snapshots__/walkCssTokens.unittest.js.snap @@ -0,0 +1,37804 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`walkCssTokens should parse at-rule.css 1`] = ` +Array [ + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "identifier", + "x", + ], + Array [ + "identifier", + "y", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "string", + "\\"blah\\"", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "identifier", + "\\\\\\"blah\\\\\\"", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "x", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "y", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "identifier", + "x", + ], + Array [ + "identifier", + "y", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@\\\\unknown", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "b", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "v", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "identifier", + "x", + ], + Array [ + "identifier", + "y", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "v", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "identifier", + "x", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "y", + ], + Array [ + "function", + "x(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "v", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "identifier", + "x", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "y", + ], + Array [ + "function", + "x(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "v", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "p", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "colon", + ":", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "v", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "x", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "y", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "p", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "colon", + ":", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "v", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "x", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "comma", + ",", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "y", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "function", + "x(", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "p", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "colon", + ":", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "v", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "v", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "identifier", + "x", + ], + Array [ + "identifier", + "y", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "v", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "identifier", + "x", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "y", + ], + Array [ + "function", + "x(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "v", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "s", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "v", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "identifier", + "x", + ], + Array [ + "identifier", + "y", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "s", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "v", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "identifier", + "x", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "y", + ], + Array [ + "function", + "f(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "s", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "v", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "identifier", + "x", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "y", + ], + Array [ + "function", + "f(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "s", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "v", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "v", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "b", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "v", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "s", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "p", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "colon", + ":", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "v", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "x", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "y", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "s", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "p", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "colon", + ":", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "v", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "x", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "comma", + ",", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "y", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "function", + "f(", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "s", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "p", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "colon", + ":", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "identifier", + "v", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "s", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "v", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "identifier", + "x", + ], + Array [ + "identifier", + "y", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "s", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "v", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "identifier", + "x", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "y", + ], + Array [ + "function", + "f(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "s", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "v", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "identifier", + "x", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "y", + ], + Array [ + "function", + "f(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "s", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "v", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "s", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "v", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "s", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "v", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "s", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "v", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "identifier", + "x", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "a", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "identifier", + "x", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "a", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "function", + "x(", + ], + Array [ + "identifier", + "a", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "identifier", + "x", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "identifier", + "x", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "identifier", + "x", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "identifier", + "x", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@unknown", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], +] +`; + +exports[`walkCssTokens should parse bad-url-token.css 1`] = ` +Array [ + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "\\\\url(", + ], + Array [ + "identifier", + "te", + ], + Array [ + "identifier", + "st", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "before", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "content", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "t", + ], + Array [ + "rightCurlyBracket", + "}", + ], +] +`; + +exports[`walkCssTokens should parse cdo-and-cdc.css 1`] = ` +Array [ + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "test", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], +] +`; + +exports[`walkCssTokens should parse comment.css 1`] = ` +Array [ + Array [ + "comment", + "/* comment */", + ], + Array [ + "identifier", + "a", + ], + Array [ + "comment", + "/* comment */", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "comment", + "/* comment */", + ], + Array [ + "identifier", + "color", + ], + Array [ + "comment", + "/* comment */", + ], + Array [ + "colon", + ":", + ], + Array [ + "comment", + "/* comment */", + ], + Array [ + "identifier", + "red", + ], + Array [ + "comment", + "/* comment */", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* a { color: black } */", + ], + Array [ + "comment", + "/**/", + ], + Array [ + "comment", + "/* */", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "comment", + "/* inside */", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "black", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "comment", + "/* between */", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "comment", + "/* end */", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* b */", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "black", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "comment", + "/* c */", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@media", + ], + Array [ + "comment", + "/* comment */", + ], + Array [ + "identifier", + "screen", + ], + Array [ + "comment", + "/* comment */", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@media", + ], + Array [ + "comment", + "/* comment */", + ], + Array [ + "identifier", + "screen", + ], + Array [ + "comment", + "/* comment */", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/*!test*/", + ], + Array [ + "comment", + "/*!te +st*/", + ], + Array [ + "comment", + "/*!te + + +st*/", + ], + Array [ + "comment", + "/*!te**st*/", + ], + Array [ + "comment", + "/****************************/", + ], + Array [ + "comment", + "/*************** FOO *****************/", + ], + Array [ + "comment", + "/* comment */", + ], + Array [ + "comment", + "/* comment */", + ], + Array [ + "comment", + "/* comment */", + ], + Array [ + "comment", + "/* comment */", + ], + Array [ + "comment", + "/**/", + ], + Array [ + "comment", + "/*a*/", + ], + Array [ + "comment", + "/* +*/", + ], + Array [ + "comment", + "/**/", + ], + Array [ + "comment", + "/**/", + ], + Array [ + "comment", + "/**/", + ], + Array [ + "comment", + "/**/", + ], + Array [ + "comment", + "/*a*/", + ], + Array [ + "comment", + "/**/", + ], + Array [ + "comment", + "/**/", + ], + Array [ + "comment", + "/* a */", + ], + Array [ + "comment", + "/**/", + ], + Array [ + "comment", + "/**/", + ], + Array [ + "delim", + ".", + ], + Array [ + "comment", + "/**test*/", + ], + Array [ + "comment", + "/**test**/", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/** + + */", + ], +] +`; + +exports[`walkCssTokens should parse dashed-ident.css 1`] = ` +Array [ + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "root", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "--main-color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#06c", + false, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--accent-color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#006", + false, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "--fg-color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#foo", + true, + ], + Array [ + "identifier", + "h1", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--main-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@--custom", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@--library1-custom", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "--vendor-property", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "--vendor-function(", + ], + Array [ + "string", + "\\"test\\"", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], +] +`; + +exports[`walkCssTokens should parse declaration.css 1`] = ` +Array [ + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "value", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "value", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "value", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "value", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "fn(", + ], + Array [ + "identifier", + "value", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "fn(", + ], + Array [ + "identifier", + "value", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "fn(", + ], + Array [ + "identifier", + "value", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "value", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "value", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "value", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "value", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "value", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "value", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "value", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "value", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "\\"string\\"", + ], + Array [ + "string", + "\\"string\\"", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#ccc", + true, + ], + Array [ + "hash", + "#ccc", + true, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "url", + "url(img.png)", + "img.png", + ], + Array [ + "url", + "url(img.png)", + "img.png", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "value", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "value", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "value", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "value", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "value", + ], + Array [ + "identifier", + "value", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "center", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "center", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "center", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "center", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "c\\\\olor", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "comment", + "/**/", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "big", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "a", + ], + Array [ + "comment", + "/* ; */", + ], + Array [ + "identifier", + "b", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "black", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "black", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "\\\\\\\\", + ], + Array [ + "identifier", + "red", + ], + Array [ + "identifier", + "\\\\\\\\", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], +] +`; + +exports[`walkCssTokens should parse dimension.css 1`] = ` +Array [ + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], +] +`; + +exports[`walkCssTokens should parse function.css 1`] = ` +Array [ + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "prod", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "fn(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prod", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "--fn(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prod", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "--fn--fn(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "root", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "font-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "--width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "line-height", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "line-height", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "line-height", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "line-height", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--width", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "function", + "pow(", + ], + Array [ + "function", + "pow(", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "identifier", + "infinity", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "identifier", + "InFiNiTy", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "identifier", + "-InFiNiTy", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "identifier", + "NaN", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "font-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "function", + "pow(", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "font-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "function", + "pow(", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "font-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "function", + "pow(", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "font-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "function", + "pow(", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "font-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "function", + "pow(", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "font-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "function", + "pow(", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "fade", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "linear-gradient(", + ], + Array [ + "identifier", + "silver", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "white", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "white", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "silver", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "comment", + "/*height: -webkit-calc(9/16 * 100%)!important;*/", + ], + Array [ + "comment", + "/*width: -moz-calc((50px - 50%)*2);*/", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "margin-top", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "fade", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "linear-gradient(", + ], + Array [ + "identifier", + "silver", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "white", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "white", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "silver", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "type", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "comment", + "/* Set font-size to 10x the average of vw and vh, + but don’t let it go below 12px. */", + ], + Array [ + "identifier", + "font-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "max(", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "type", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "comment", + "/* Force the font-size to stay between 12px and 100px */", + ], + Array [ + "identifier", + "font-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "clamp(", + ], + Array [ + "comma", + ",", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "more", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "mod(", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "transform", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rotate(", + ], + Array [ + "function", + "mod(", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "transform", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rotate(", + ], + Array [ + "function", + "atan2(", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "transform", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rotate(", + ], + Array [ + "function", + "tan(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "transform", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rotate(", + ], + Array [ + "function", + "atan(", + ], + Array [ + "function", + "tan(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "font-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hypot(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "font-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hypot(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "font-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hypot(", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-position", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "sign(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "function", + "pow(", + ], + Array [ + "identifier", + "e", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "pi", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "identifier", + "pi", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "min(", + ], + Array [ + "identifier", + "pi", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "e", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "log(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "log(", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "round(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--width", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "round(", + ], + Array [ + "identifier", + "nearest", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--width", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "round(", + ], + Array [ + "identifier", + "up", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--width", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "round(", + ], + Array [ + "identifier", + "down", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--width", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "round(", + ], + Array [ + "identifier", + "to-zero", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--width", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "min-max", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "min(", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "max(", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "min(", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "rem", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rem(", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "sin", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "transform", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rotate(", + ], + Array [ + "function", + "sin(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "transform", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rotate(", + ], + Array [ + "function", + "sin(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "cos", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "transform", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rotate(", + ], + Array [ + "function", + "cos(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "transform", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rotate(", + ], + Array [ + "function", + "cos(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "asin", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "transform", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rotate(", + ], + Array [ + "function", + "asin(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "transform", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rotate(", + ], + Array [ + "function", + "asin(", + ], + Array [ + "identifier", + "pi", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "acos", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "transform", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rotate(", + ], + Array [ + "function", + "acos(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "transform", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rotate(", + ], + Array [ + "function", + "acos(", + ], + Array [ + "identifier", + "pi", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "atan", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "transform", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rotate(", + ], + Array [ + "function", + "atan(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "atan2", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "transform", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rotate(", + ], + Array [ + "function", + "atan2(", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "sqrt", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "size", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "sqrt(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "exp", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "size", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "exp(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "abs", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "background-position", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "function", + "abs(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "sign", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "background-position", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "sign(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-position", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "sign(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-position", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "sign(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-position", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "sign(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-position", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "sign(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-position", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "sign(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "element(", + ], + Array [ + "hash", + "#css-source", + true, + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "identifier", + "no-repeat", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "element(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--foo", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "identifier", + "no-repeat", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "-moz-element(", + ], + Array [ + "hash", + "#css-source", + true, + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "identifier", + "no-repeat", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "-moz-element(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--foo", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "identifier", + "no-repeat", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "linear-gradient(", + ], + Array [ + "identifier", + "white", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "gray", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "linear-gradient(", + ], + Array [ + "identifier", + "yellow", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "linear-gradient(", + ], + Array [ + "identifier", + "to", + ], + Array [ + "identifier", + "bottom", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "yellow", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "linear-gradient(", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "yellow", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "linear-gradient(", + ], + Array [ + "identifier", + "to", + ], + Array [ + "identifier", + "top", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "yellow", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "linear-gradient(", + ], + Array [ + "identifier", + "to", + ], + Array [ + "identifier", + "bottom", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "yellow", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "linear-gradient(", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "yellow", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "linear-gradient(", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "yellow", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "linear-gradient(", + ], + Array [ + "identifier", + "yellow", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "comma", + ",", + ], + Array [ + "hash", + "#0f0", + false, + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "linear-gradient(", + ], + Array [ + "identifier", + "to", + ], + Array [ + "identifier", + "top", + ], + Array [ + "identifier", + "right", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "red", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "white", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "linear-gradient(", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "green", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "red", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "linear-gradient(", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "red", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "linear-gradient(", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "red", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "comment", + "/* mix( [ && [ by ]? ] ; ; ) */", + ], + Array [ + "identifier", + "opacity", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "mix(", + ], + Array [ + "identifier", + "by", + ], + Array [ + "identifier", + "ease", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "opacity", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "mix(", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "url", + "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)", + "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "\\"./img.png\\"", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "'./img.png'", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "URL(", + ], + Array [ + "string", + "'./img.png'", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "'./img.png'", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "'./img.png'", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "'./img.png'", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "'img.png'", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "url", + "url()", + "", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "url", + "url( )", + "", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "\\"\\"", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "\\"\\"", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "''", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "''", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "' '", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "url", + "url(./img.png)", + "./img.png", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "url", + "url( ./img.png )", + "./img.png", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "url", + "url( ./image\\\\32.png )", + "./image\\\\32.png", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "url", + "url( + ./image\\\\32.png + )", + "./image\\\\32.png", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "url", + "url( + + + + ./image\\\\32.png + + + + )", + "./image\\\\32.png", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-image", + ], + Array [ + "colon", + ":", + ], + Array [ + "url", + "url( + + + + ./image\\\\32.png + + + + )", + "./image\\\\32.png", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--a", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--a", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--a", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], +] +`; + +exports[`walkCssTokens should parse hacks.css 1`] = ` +Array [ + Array [ + "identifier", + "html", + ], + Array [ + "comment", + "/**/", + ], + Array [ + "identifier", + "body", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "selector", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "head", + ], + Array [ + "comment", + "/**/", + ], + Array [ + "identifier", + "body", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "selector", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "selector", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "_property", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "value", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "selector", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "-property", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "value", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "selector", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "value\\\\9", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "selector", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "property", + ], + Array [ + "comment", + "/*\\\\**/", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "value\\\\9", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], +] +`; + +exports[`walkCssTokens should parse hex-colors.css 1`] = ` +Array [ + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#000000", + false, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#ffffff", + true, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#FFFFFF", + true, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#0000ffcc", + false, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#0000FFCC", + false, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#000", + false, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#fff", + true, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#FFF", + true, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#0000", + false, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#ffff", + true, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#FFFF", + true, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#1", + false, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#FF", + true, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#123456789", + false, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#abc", + true, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#aa\\\\61", + true, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], +] +`; + +exports[`walkCssTokens should parse important.css 1`] = ` +Array [ + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "important", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "identifier", + "important", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "important", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "identifier", + "important", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "identifier", + "important", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "identifier", + "important", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "identifier", + "important", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "identifier", + "IMPORTANT", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "white", + ], + Array [ + "identifier", + "IMPORTANT", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "margin", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "important", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "padding", + ], + Array [ + "colon", + ":", + ], + Array [ + "comment", + "/* test */", + ], + Array [ + "identifier", + "important", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "comment", + "/*! test */", + ], + Array [ + "identifier", + "important", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "height", + ], + Array [ + "colon", + ":", + ], + Array [ + "comment", + "/*! test */", + ], + Array [ + "identifier", + "important", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "z-index", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "\\"\\"", + ], + Array [ + "identifier", + "important", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "padding", + ], + Array [ + "colon", + ":", + ], + Array [ + "comment", + "/* sep */", + ], + Array [ + "identifier", + "important", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "identifier", + "iMpOrTaNt", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "identifier", + "imp\\\\ortant", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], +] +`; + +exports[`walkCssTokens should parse nesting.css 1`] = ` +Array [ + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "green", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "font-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "main", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#baz", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "has(", + ], + Array [ + "identifier", + "p", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "backdrop", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "lang", + ], + Array [ + "string", + "\\"zh\\"", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "main", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "article", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "main", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "main", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "article", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "main", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "ul", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "padding-left", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "component", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "padding-left", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "hover", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "lightblue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* & can be used on its own */", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "baz", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "green", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* equivalent to + .foo { color: blue; } + .foo > .bar { color: red; } + .foo > .baz { color: green; } +*/", + ], + Array [ + "comment", + "/* or in a compound selector, + refining the parent’s selector */", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* equivalent to + .foo { color: blue; } + .foo.bar { color: red; } +*/", + ], + Array [ + "comment", + "/* multiple selectors in the list are all + relative to the parent */", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "comma", + ",", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "baz", + ], + Array [ + "comma", + ",", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "qux", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* equivalent to + .foo, .bar { color: blue; } + :is(.foo, .bar) + .baz, + :is(.foo, .bar).qux { color: red; } +*/", + ], + Array [ + "comment", + "/* & can be used multiple times in a single selector */", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "baz", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "qux", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* equivalent to + .foo { color: blue; } + .foo .bar .foo .baz .foo .qux { color: red; } +*/", + ], + Array [ + "comment", + "/* & doesn’t have to be at the beginning of the selector */", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "parent", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* equivalent to + .foo { color: red; } + .parent .foo { color: blue; } +*/", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "not(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* equivalent to + .foo { color: red; } + :not(.foo) { color: blue; } +*/", + ], + Array [ + "comment", + "/* But if you use a relative selector, + an initial & is implied automatically */", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* equivalent to + .foo { color: red; } + .foo + .bar + .foo { color: blue; } +*/", + ], + Array [ + "comment", + "/* Somewhat silly, but & can be used all on its own, as well. */", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "padding", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* equivalent to + .foo { color: blue; } + .foo { padding: 2ch; } + + // or + + .foo { + color: blue; + padding: 2ch; + } +*/", + ], + Array [ + "comment", + "/* Again, silly, but can even be doubled up. */", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "padding", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* equivalent to + .foo { color: blue; } + .foo.foo { padding: 2ch; } +*/", + ], + Array [ + "comment", + "/* The parent selector can be arbitrarily complicated */", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "error", + ], + Array [ + "comma", + ",", + ], + Array [ + "hash", + "#404", + false, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "hover", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "baz", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* equivalent to + :is(.error, #404):hover > .baz { color: red; } +*/", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "ancestor", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "el", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "other-ancestor", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* equivalent to + .other-ancestor :is(.ancestor .el) { color: red; } + +/* As can the nested selector */", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "is(", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "comma", + ",", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "baz", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* equivalent to + .foo :is(.bar, .foo.baz) { color: red; } +*/", + ], + Array [ + "comment", + "/* Multiple levels of nesting \\"stack up\\" the selectors */", + ], + Array [ + "identifier", + "figure", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "margin", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "figcaption", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hsl(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "font-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* equivalent to + figure { margin: 0; } + figure > figcaption { background: hsl(0 0% 0% / 50%); } + figure > figcaption > p { font-size: .9rem; } +*/", + ], + Array [ + "comment", + "/* Example usage with Cascade Layers */", + ], + Array [ + "atKeyword", + "@layer", + ], + Array [ + "identifier", + "base", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "html", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "block-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "body", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "min-block-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* equivalent to + @layer base { + html { block-size: 100%; } + html body { min-block-size: 100%; } + } +*/", + ], + Array [ + "comment", + "/* Example nesting Cascade Layers */", + ], + Array [ + "atKeyword", + "@layer", + ], + Array [ + "identifier", + "base", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "html", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "block-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@layer", + ], + Array [ + "identifier", + "support", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "body", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "min-block-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* equivalent to + @layer base { + html { block-size: 100%; } + } + @layer base.support { + html body { min-block-size: 100%; } + } +*/", + ], + Array [ + "comment", + "/* Example usage with Scoping */", + ], + Array [ + "atKeyword", + "@scope", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "card", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "identifier", + "to", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "header", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "scope", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "inline-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "aspect-ratio", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "header", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "border-block-end", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "solid", + ], + Array [ + "identifier", + "white", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* equivalent to + @scope (.card) to (> header) { + :scope { inline-size: 40ch; aspect-ratio: 3/4; } + :scope > header { border-block-end: 1px solid white; } + } +*/", + ], + Array [ + "comment", + "/* Example nesting Scoping */", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "card", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "inline-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "aspect-ratio", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@scope", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "identifier", + "to", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "header", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "scope", + ], + Array [ + "identifier", + "header", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "border-block-end", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "solid", + ], + Array [ + "identifier", + "white", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* equivalent to + .card { inline-size: 40ch; aspect-ratio: 3/4; } + @scope (.card) to (> header > *) { + :scope > header { border-block-end: 1px solid white; } + } +*/", + ], + Array [ + "comment", + "/* Properties can be directly used */", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "display", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "grid", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@media", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "orientation", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "landscape", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "grid-auto-flow", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "column", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* equivalent to: */", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "display", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "grid", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@media", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "orientation", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "landscape", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "grid-auto-flow", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "column", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* and also equivalent to the unnested: */", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "display", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "grid", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@media", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "orientation", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "landscape", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "grid-auto-flow", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "column", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* Conditionals can be further nested */", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "display", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "grid", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@media", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "orientation", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "landscape", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "grid-auto-flow", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "column", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@media", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "min-width", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "max-inline-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* equivalent to */", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "display", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "grid", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@media", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "orientation", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "landscape", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "grid-auto-flow", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "column", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@media", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "orientation", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "landscape", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "identifier", + "and", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "min-width", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "max-inline-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* Example nesting Cascade Layers */", + ], + Array [ + "identifier", + "html", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "atKeyword", + "@layer", + ], + Array [ + "identifier", + "base", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "block-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@layer", + ], + Array [ + "identifier", + "support", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "body", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "min-block-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* equivalent to */", + ], + Array [ + "atKeyword", + "@layer", + ], + Array [ + "identifier", + "base", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "html", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "block-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@layer", + ], + Array [ + "identifier", + "base", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "support", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "html", + ], + Array [ + "identifier", + "body", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "min-block-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* Example nesting Scoping */", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "card", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "inline-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "aspect-ratio", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@scope", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "scope", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "border", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "solid", + ], + Array [ + "identifier", + "white", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* equivalent to */", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "card", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "inline-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "aspect-ratio", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@scope", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "card", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "scope", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "border-block-end", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "solid", + ], + Array [ + "identifier", + "white", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "parent", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@scope", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "scope", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "identifier", + "to", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "limit", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "content", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "article", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "green", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "b", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "c", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "comma", + ",", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "before", + ], + Array [ + "comma", + ",", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "after", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "black", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@media", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "prefers-color-scheme", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "dark", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "white", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], +] +`; + +exports[`walkCssTokens should parse newline-windows.css 1`] = ` +Array [ + Array [ + "identifier", + "a", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "before", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "content", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "\\"A really long \\\\ +awesome string\\"", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#00ff00", + false, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a24", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "\\\\123456 +", + ], + Array [ + "identifier", + "B", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "test", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "\\"./img.png\\"", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "test", + ], + Array [ + "colon", + ":", + ], + Array [ + "url", + "url( + + + ./img.png + + + )", + "./img.png", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "test", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "\\"\\"", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "test", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "''", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], +] +`; + +exports[`walkCssTokens should parse number.css 1`] = ` +Array [ + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "property", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], +] +`; + +exports[`walkCssTokens should parse pseudo-functions.css 1`] = ` +Array [ + Array [ + "colon", + ":", + ], + Array [ + "function", + "local(", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "comma", + ",", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "not(", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "hover", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "import(", + ], + Array [ + "identifier", + "something", + ], + Array [ + "identifier", + "from", + ], + Array [ + "string", + "\\":somewhere\\"", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], +] +`; + +exports[`walkCssTokens should parse selectors.css 1`] = ` +Array [ + Array [ + "identifier", + "title", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "title", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "title", + ], + Array [ + "string", + "\\"foo\\"", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "title", + ], + Array [ + "string", + "\\"foo\\"", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "title", + ], + Array [ + "string", + "\\"foo\\"", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "lang", + ], + Array [ + "string", + "\\"en-us\\"", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "lang", + ], + Array [ + "string", + "\\"zh\\"", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "href", + ], + Array [ + "string", + "\\"#\\"", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "href", + ], + Array [ + "string", + "\\".org\\"", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "href", + ], + Array [ + "string", + "\\"example\\"", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "href", + ], + Array [ + "string", + "\\"insensitive\\"", + ], + Array [ + "identifier", + "i", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "href", + ], + Array [ + "string", + "\\"insensitive\\"", + ], + Array [ + "identifier", + "I", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "href", + ], + Array [ + "string", + "\\"cAsE\\"", + ], + Array [ + "identifier", + "s", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "href", + ], + Array [ + "string", + "\\"cAsE\\"", + ], + Array [ + "identifier", + "S", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "identifier", + "att", + ], + Array [ + "identifier", + "val", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "att", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "att", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "att", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "att", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "att", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "att", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "att", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "att", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "class", + ], + Array [ + "string", + "\\"test\\"", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "class", + ], + Array [ + "string", + "\\"test\\"", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "href", + ], + Array [ + "string", + "\\"insensitive\\"", + ], + Array [ + "identifier", + "i", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "href", + ], + Array [ + "string", + "\\"insensitive\\"", + ], + Array [ + "identifier", + "i", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "href", + ], + Array [ + "string", + "\\"insensitive\\"", + ], + Array [ + "identifier", + "i", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "href", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "frame", + ], + Array [ + "identifier", + "hsides", + ], + Array [ + "identifier", + "i", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "identifier", + "target", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "identifier", + "target", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "target", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "title", + ], + Array [ + "string", + "'foo'", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "data-style", + ], + Array [ + "string", + "'value'", + ], + Array [ + "identifier", + "data-loading", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "href", + ], + Array [ + "string", + "\\"te's't\\"", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "href", + ], + Array [ + "string", + "'te\\"s\\"t'", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "ng\\\\:cloak", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "ng\\\\3a cloak", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "ng\\\\00003acloak", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "not(", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "string", + "\\")\\"", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "not(", + ], + Array [ + "identifier", + "div", + ], + Array [ + "comment", + "/*)*/", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "identifier", + "\\\\\\"", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "identifier", + "\\\\{", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "identifier", + "\\\\(", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "identifier", + "yes\\\\:\\\\(it\\\\'s\\\\ work\\\\)", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "attr", + ], + Array [ + "identifier", + "\\\\;", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "attr", + ], + Array [ + "string", + "\\"test\\"", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "identifier", + "attr", + ], + Array [ + "string", + "\\"test\\"", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "♥", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "©", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "“‘’”", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "☺☃", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "⌘⌥", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "𝄞♪♩♫♬", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "💩", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\?", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\@", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\.", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\3A \\\\)", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\3A \\\\\`\\\\(", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\31 23", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\31 a2b3c", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\<\\\\>\\\\<\\\\<\\\\<\\\\>\\\\>\\\\<\\\\>", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\[\\\\>\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\>\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\>\\\\+\\\\+\\\\+\\\\>\\\\+\\\\<\\\\<\\\\<\\\\<\\\\-\\\\]\\\\>\\\\+\\\\+\\\\.\\\\>\\\\+\\\\.\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\.\\\\.\\\\+\\\\+\\\\+\\\\.\\\\>\\\\+\\\\+\\\\.\\\\<\\\\<\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\.\\\\>\\\\.\\\\+\\\\+\\\\+\\\\.\\\\-\\\\-\\\\-\\\\-\\\\-\\\\-\\\\.\\\\-\\\\-\\\\-\\\\-\\\\-\\\\-\\\\-\\\\-\\\\.\\\\>\\\\+\\\\.\\\\>\\\\.", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\#", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\#\\\\#", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\#\\\\.\\\\#\\\\.\\\\#", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\_", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\{\\\\}", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\.fake\\\\-class", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo\\\\.bar", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\3A hover", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\3A hover\\\\3A focus\\\\3A active", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\[attr\\\\=value\\\\]", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "f\\\\/o\\\\/o", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "f\\\\\\\\o\\\\\\\\o", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "f\\\\*o\\\\*o", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "f\\\\!o\\\\!o", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "f\\\\'o\\\\'o", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "f\\\\~o\\\\~o", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "f\\\\+o\\\\+o", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "-a-b-c-", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\#fake-id", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "identifier", + "target", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "identifier", + "target", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "ul", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "list", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "ul", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "list", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "before", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\31 a2b3c", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\<\\\\>\\\\<\\\\<\\\\<\\\\>\\\\>\\\\<\\\\>", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\31 23", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\#", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\#\\\\#", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\#fake\\\\-id", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo\\\\.bar", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\3A hover", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\3A hover\\\\3A focus\\\\3A active", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\[attr\\\\=value\\\\]", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "not-pseudo\\\\:focus", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "not-pseudo\\\\:\\\\:focus", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\\\\\1D306", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "\\\\;", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* { } */", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "b", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* test */", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "b", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* { } */", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "b", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* test */", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "b", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "comment", + "/* { } */", + ], + Array [ + "identifier", + "b", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "comment", + "/* test */", + ], + Array [ + "identifier", + "b", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "comment", + "/* { } */", + ], + Array [ + "identifier", + "b", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "comment", + "/* test */", + ], + Array [ + "identifier", + "b", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "b", + ], + Array [ + "comment", + "/* { } */", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "b", + ], + Array [ + "comment", + "/* test */", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "b", + ], + Array [ + "comment", + "/* { } */", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "b", + ], + Array [ + "comment", + "/* test */", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "b", + ], + Array [ + "comment", + "/* { } */", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "b", + ], + Array [ + "comment", + "/* test */", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "comment", + "/* test */", + ], + Array [ + "comma", + ",", + ], + Array [ + "comment", + "/* test */", + ], + Array [ + "identifier", + "b", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "comment", + "/* test */", + ], + Array [ + "comma", + ",", + ], + Array [ + "comment", + "/* test */", + ], + Array [ + "identifier", + "b", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "article", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "article", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "article", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "article", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "article", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "article", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "p", + ], + Array [ + "identifier", + "img", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "p", + ], + Array [ + "identifier", + "img", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "p", + ], + Array [ + "identifier", + "img", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "p", + ], + Array [ + "identifier", + "img", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "p", + ], + Array [ + "identifier", + "img", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "p", + ], + Array [ + "identifier", + "img", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "article", + ], + Array [ + "identifier", + "p", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "article", + ], + Array [ + "identifier", + "p", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "attribute", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "identifier", + "attribute", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "attribute", + ], + Array [ + "identifier", + "src", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "attribute", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "identifier", + "attribute", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "attribute", + ], + Array [ + "identifier", + "src", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "attribute", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "identifier", + "attribute", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "attribute", + ], + Array [ + "identifier", + "src", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "attribute", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "identifier", + "attribute", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "attribute", + ], + Array [ + "identifier", + "src", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "hover", + ], + Array [ + "identifier", + "attribute", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "hover", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "hover", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "hover", + ], + Array [ + "identifier", + "div", + ], + Array [ + "hash", + "#thing", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "href", + ], + Array [ + "string", + "'place'", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "ul", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "list", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "type", + ], + Array [ + "string", + "'button'", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "type", + ], + Array [ + "string", + "'button'", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "namespace", + ], + Array [ + "identifier", + "type", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "cl", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "cl2", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "c", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "d", + ], + Array [ + "identifier", + "e", + ], + Array [ + "identifier", + "h", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "h", + ], + Array [ + "identifier", + "d", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "identifier", + "div", + ], + Array [ + "identifier", + "div", + ], + Array [ + "identifier", + "div", + ], + Array [ + "identifier", + "div", + ], + Array [ + "identifier", + "div", + ], + Array [ + "identifier", + "div", + ], + Array [ + "identifier", + "div", + ], + Array [ + "identifier", + "div", + ], + Array [ + "identifier", + "div", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "href", + ], + Array [ + "identifier", + "class", + ], + Array [ + "identifier", + "name", + ], + Array [ + "identifier", + "h1", + ], + Array [ + "identifier", + "h2", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "href", + ], + Array [ + "string", + "\\"test.com\\"", + ], + Array [ + "identifier", + "rel", + ], + Array [ + "string", + "'external'", + ], + Array [ + "identifier", + "id", + ], + Array [ + "identifier", + "class", + ], + Array [ + "string", + "\\"test\\"", + ], + Array [ + "identifier", + "name", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "data-weird-attr", + ], + Array [ + "string", + "\\"Something=weird\\"", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "data-weird-attr", + ], + Array [ + "string", + "\\"Something=weird\\"", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "data-weird-attr", + ], + Array [ + "string", + "\\"Something=weird\\"", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "data-weird-attr", + ], + Array [ + "string", + "\\"Something=weird\\"", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "href", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "not(", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "green", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "-webkit-media-controls-play-button", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "col", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "selected", + ], + Array [ + "identifier", + "td", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "col", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "selected", + ], + Array [ + "identifier", + "td", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "col", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "selected", + ], + Array [ + "identifier", + "td", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "one", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "identifier", + "target", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "identifier", + "target", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "identifier", + "target", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "hash", + "#thing", + true, + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "hover", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "hash", + "#thing", + true, + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "before", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "href", + ], + Array [ + "string", + "'place'", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "hover", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "href", + ], + Array [ + "string", + "'place'", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "before", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "one", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "two", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "three", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "button", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "btn-primary", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#z98y", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#one", + true, + ], + Array [ + "hash", + "#two", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#one", + true, + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "two", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "three", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#♥", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#©", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#“‘’”", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#☺☃", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#⌘⌥", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#𝄞♪♩♫♬", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#💩", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\?", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\@", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\.", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\3A \\\\)", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\3A \\\\\`\\\\(", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\31 23", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\31 a2b3c", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\<\\\\>\\\\<\\\\<\\\\<\\\\>\\\\>\\\\<\\\\>", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\[\\\\>\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\>\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\>\\\\+\\\\+\\\\+\\\\>\\\\+\\\\<\\\\<\\\\<\\\\<\\\\-\\\\]\\\\>\\\\+\\\\+\\\\.\\\\>\\\\+\\\\.\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\.\\\\.\\\\+\\\\+\\\\+\\\\.\\\\>\\\\+\\\\+\\\\.\\\\<\\\\<\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\+\\\\.\\\\>\\\\.\\\\+\\\\+\\\\+\\\\.\\\\-\\\\-\\\\-\\\\-\\\\-\\\\-\\\\.\\\\-\\\\-\\\\-\\\\-\\\\-\\\\-\\\\-\\\\-\\\\.\\\\>\\\\+\\\\.\\\\>\\\\.", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\#", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\#\\\\#", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\#\\\\.\\\\#\\\\.\\\\#", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\_", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\{\\\\}", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\.fake\\\\-class", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#foo\\\\.bar", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\3A hover", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\3A hover\\\\3A focus\\\\3A active", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\[attr\\\\=value\\\\]", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#f\\\\/o\\\\/o", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#f\\\\\\\\o\\\\\\\\o", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#f\\\\*o\\\\*o", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#f\\\\!o\\\\!o", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#f\\\\'o\\\\'o", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#f\\\\~o\\\\~o", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#f\\\\+o\\\\+o", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "identifier", + "target", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "hash", + "#thing", + true, + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "hover", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "hash", + "#thing", + true, + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "hash", + "#thing", + true, + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "before", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#foo", + true, + ], + Array [ + "identifier", + "lang", + ], + Array [ + "identifier", + "en", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\;", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#u-m\\\\00002b ", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#♥", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#“‘’”", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#☺☃", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\@", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\.", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\3A \\\\)", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\3A \\\\\`\\\\(", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\31 23", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\31 a2b3c", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\<\\\\>\\\\<\\\\<\\\\<\\\\>\\\\>\\\\<\\\\>", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\#", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\#\\\\#", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\#\\\\.\\\\#\\\\.\\\\#", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\_", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\{\\\\}", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\.fake\\\\-class", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#foo\\\\.bar", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\3A hover", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\3A hover\\\\3A focus\\\\3A active", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#\\\\[attr\\\\=value\\\\]", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#f\\\\/o\\\\/o", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#f\\\\\\\\o\\\\\\\\o", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#f\\\\*o\\\\*o", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#f\\\\!o\\\\!o", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#f\\\\\\\\\\\\'o\\\\\\\\\\\\'o", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#f\\\\~o\\\\~o", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#f\\\\+o\\\\+o", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "href", + ], + Array [ + "string", + "'place'", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "hash", + "#foo", + true, + ], + Array [ + "identifier", + "foo", + ], + Array [ + "string", + "'bar'", + ], + Array [ + "comma", + ",", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "FOO", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "p", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "p", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "p", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "p", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "comma", + ",", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "comma", + ",", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "baz", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "input", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "-moz-placeholder", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "input", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "placeholder", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "b", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "c", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "d", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "e", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "f", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "g", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "b", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "c", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "d", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "e", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "f", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "g", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comma", + ",", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#id", + true, + ], + Array [ + "comma", + ",", + ], + Array [ + "hash", + "#id2", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "h1", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "h2", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "comma", + ",", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "attr", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "attrtoo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "comment", + "/* { } */", + ], + Array [ + "identifier", + "b", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "table", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "colortable", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "td", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "text-align", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "center", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "c", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "text-transform", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "uppercase", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "first-child", + ], + Array [ + "comma", + ",", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "first-child", + ], + Array [ + "identifier", + "td", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "border", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "solid", + ], + Array [ + "identifier", + "black", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "th", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "text-align", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "center", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "black", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "white", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "comma", + ",", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "baz", + ], + Array [ + "comma", + ",", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "qux", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "baz", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "qux", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "padding", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* TODO fix me */", + ], + Array [ + "comment", + "/*.foo {*/", + ], + Array [ + "comment", + "/* color: blue;*/", + ], + Array [ + "comment", + "/* && { padding: 2ch; }*/", + ], + Array [ + "comment", + "/*}*/", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "error", + ], + Array [ + "comma", + ",", + ], + Array [ + "hash", + "#test", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "hover", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "baz", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "is(", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "comma", + ",", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "baz", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "figure", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "margin", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "figcaption", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hsl(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "p", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "font-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "__bar", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "baz", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "green", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "input", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "margin", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* valid, no longer starts with an identifier */", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "is(", + ], + Array [ + "identifier", + "input", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "margin", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comment", + "/* valid, starts with a colon, + and equivalent to the previous rule. */", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "comma", + ",", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "baz", + ], + Array [ + "comma", + ",", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "qux", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "baz", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "qux", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "parent", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "not(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "ancestor", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "el", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "other-ancestor", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "is(", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "comma", + ",", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "baz", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@layer", + ], + Array [ + "identifier", + "base", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "html", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "block-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "body", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "min-block-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@layer", + ], + Array [ + "identifier", + "base", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "html", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "block-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@layer", + ], + Array [ + "identifier", + "base", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "support", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "body", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "min-block-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "article", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "green", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "atKeyword", + "@media", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "min-width", + ], + Array [ + "colon", + ":", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "h1", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "h2", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "blue", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "unknown", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "unknown(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "unknown(", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "unknown(", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "unknown(", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "unknown(", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "unknown(", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "unknown(", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "unknown(", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "unknown(", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "unknown(", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "identifier", + "important", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "unknown(", + ], + Array [ + "string", + "\\"string\\"", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "unknown(", + ], + Array [ + "string", + "\\"string\\"", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "unknown(", + ], + Array [ + "string", + "'string'", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "unknown(", + ], + Array [ + "url", + "url(img.png)", + "img.png", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "unknown(", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "unknown(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "unknown(", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "unknown(", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "n", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "n", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "n", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "n", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "n-1", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "n", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "n-", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "n", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "-n", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "-n", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "-n", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "-n", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "-n-1", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "-n", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "-n-", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "-n", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "n", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "n", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "n", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "n", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "n-1", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "n", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "n-", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "n", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "n", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "-n", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "n", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "N", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "-N", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "N", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "Nth-Child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "NTH-CHILD(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "odd", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "ODD", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "oDd", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "even", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "eVeN", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "EVEN", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-last-child(", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "comment", + "/*test*/", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-last-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-last-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-of-type(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-last-of-type(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-col(", + ], + Array [ + "identifier", + "odd", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-col(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-last-col(", + ], + Array [ + "identifier", + "odd", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-last-col(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "p", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "of", + ], + Array [ + "identifier", + "li", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "of", + ], + Array [ + "identifier", + "li", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "of", + ], + Array [ + "identifier", + "li", + ], + Array [ + "comma", + ",", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "test", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "of", + ], + Array [ + "identifier", + "li", + ], + Array [ + "comma", + ",", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "test", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "-n", + ], + Array [ + "identifier", + "of", + ], + Array [ + "identifier", + "li", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "important", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "tr", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "even", + ], + Array [ + "identifier", + "of", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "not(", + ], + Array [ + "identifier", + "hidden", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "root", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "any-link", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "button", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "hover", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div\\\\:before", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div\\\\:", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "before", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "iNpUt", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "matches(", + ], + Array [ + "identifier", + "section", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "article", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "aside", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "nav", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "identifier", + "h1", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "input", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "not(", + ], + Array [ + "identifier", + "type", + ], + Array [ + "string", + "'submit'", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "sidebar", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "has(", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "not(", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "has(", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "-webkit-scrollbar-thumb", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "window-inactive", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "-webkit-scrollbar-button", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "horizontal", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "decrement", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "test", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "-webkit-scrollbar-button", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "horizontal", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "decrement", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "is(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "--heading", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "-moz-placeholder", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "hover", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "before", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "hOvEr", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "-webkit-full-screen", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "after", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "dialog", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "backdrop", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "before", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "video", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "cue", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "video", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "cue(", + ], + Array [ + "identifier", + "b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "video", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "cue-region", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "video", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "cue-region(", + ], + Array [ + "hash", + "#scroll", + true, + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "grammar-error", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "marker", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "tabbed-custom-element", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "part(", + ], + Array [ + "identifier", + "tab", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "placeholder", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "selection", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "slotted(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "slotted(", + ], + Array [ + "identifier", + "span", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "spelling-error", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "target-text", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "form-range", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "-webkit-slider-thumb", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "active", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "bEfOrE", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "hover", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "before", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "hover", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "-moz-placeholder", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "b", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "before", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "hover", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "identifier", + "h1", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "h1", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "h1", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "h1", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "\\\\2d ", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "\\\\2d a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div\\\\:before", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "d\\\\iv", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "foreignObject", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "html", + ], + Array [ + "identifier", + "textPath", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "hash", + "#thing", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#foo", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#foo", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#foo", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "lang", + ], + Array [ + "identifier", + "en", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "hover", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "before", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "not(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "comment", + "/**/", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "comment", + "/**/", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "\\\\@noat", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "h1\\\\\\\\", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "\\\\\\\\", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], +] +`; + +exports[`walkCssTokens should parse urls.css 1`] = ` +Array [ + Array [ + "identifier", + "body", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "url", + "url( + https://example\\\\2f4a8f.com\\\\image.png + )", + "https://example\\\\2f4a8f.com\\\\image.png", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "--element", + ], + Array [ + "identifier", + "name", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "class", + ], + Array [ + "identifier", + "name", + ], + Array [ + "hash", + "#_id", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "\\"https://example.com/some url \\\\\\"with\\\\\\" 'spaces'.png\\"", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "'https://example.com/\\\\'\\"quotes\\"\\\\'.png'", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a200", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "-webkit-image-set(", + ], + Array [ + "string", + "\\"img.png\\"", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a201", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "\\"img.png\\"", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a202", + ], + Array [ + "colon", + ":", + ], + Array [ + "url", + "url(img.png)", + "img.png", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], +] +`; + +exports[`walkCssTokens should parse values.css 1`] = ` +Array [ + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "transform", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rotate(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "transform", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rotate(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "transform", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rotate(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "transform", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rotate(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "hex-color", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#00ff00", + false, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#0000ffcc", + false, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#123", + false, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#123c", + false, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "rgb", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rGb(", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "identifier", + "none", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "identifier", + "none", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--red", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--green", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--blue", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--red", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--green", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--blue", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--red", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--green", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--blue", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--alpha", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "rgba", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgba(", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgba(", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgba(", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgba(", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgba(", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rGbA(", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgba(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgba(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgba(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgba(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgba(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgba(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgba(", + ], + Array [ + "identifier", + "none", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgba(", + ], + Array [ + "identifier", + "none", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgba(", + ], + Array [ + "identifier", + "none", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgba(", + ], + Array [ + "identifier", + "none", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--red", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--green", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--blue", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--alpha", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "hsl", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hsl(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "HsL(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hsl(", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hsl(", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hsl(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hsl(", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hsl(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hsl(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--a", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--c", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hsl(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--a", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--c", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--d", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hsl(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--a", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--c", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hsl(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--a", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--c", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--d", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "hsla", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hsla(", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hsla(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hsla(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--a", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--c", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--d", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "hwb", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hwb(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hwb(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hwb(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hwb(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hwb(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hwb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--a", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--c", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hwb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--a", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--c", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--d", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "lab", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "lab(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "lab(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "lab(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "lab(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--a", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--c", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "lab(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--a", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--c", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--d", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "lch", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "lch(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "lch(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "lch(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "lch(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "lch(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "lch(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "lch(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--a", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--c", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "lch(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--a", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--c", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--d", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "oklab", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "oklab(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "oklab(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--a", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--c", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "oklch", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "oklch(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "oklch(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "oklch(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--a", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--c", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "oklch(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--a", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--c", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--d", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "color", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "sRGB", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "srgb-linear", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "display-p3", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "a98-rgb", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "prophoto-rgb", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "rec2020", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "sRGB", + ], + Array [ + "identifier", + "none", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "display-p3", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "display-p3", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "display-p3", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "display-p3", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "xyz", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "xyz-d50", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "xyz-d65", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "display-p3", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "sRGB", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "display-p3", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "a98-rgb", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "prophoto-rgb", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "rec2020", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "profoto-rgb", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--a", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--c", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--d", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--a", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--c", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--d", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--e", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@color-profile", + ], + Array [ + "identifier", + "--fogra55beta", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "src", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "'https://example.org/2020_13.003_FOGRA55beta_CL_Profile.icc'", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "dark_skin", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "background-color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "--fogra55beta", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "--fogra55beta", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "--fogra55beta", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "--fogra55beta", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "--fogra55beta", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background-color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "--fogra55beta", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "device-cmyk", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "device-cmyk(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "device-cmyk(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "device-cmyk(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "device-cmyk(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "device-cmyk(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--a", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--b", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--c", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--d", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "color-mix", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color-mix(", + ], + Array [ + "identifier", + "in", + ], + Array [ + "identifier", + "lch", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "purple", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "plum", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color-mix(", + ], + Array [ + "identifier", + "in", + ], + Array [ + "identifier", + "lch", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "purple", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "plum", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color-mix(", + ], + Array [ + "identifier", + "in", + ], + Array [ + "identifier", + "lch", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "purple", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "plum", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color-mix(", + ], + Array [ + "identifier", + "in", + ], + Array [ + "identifier", + "lch", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "purple", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "plum", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color-mix(", + ], + Array [ + "identifier", + "in", + ], + Array [ + "identifier", + "lch", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "plum", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "purple", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color-mix(", + ], + Array [ + "identifier", + "in", + ], + Array [ + "identifier", + "lch", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "purple", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "plum", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "color-contrast", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color-contrast(", + ], + Array [ + "identifier", + "currentColor", + ], + Array [ + "identifier", + "vs", + ], + Array [ + "function", + "hsl(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "purple", + ], + Array [ + "identifier", + "to", + ], + Array [ + "identifier", + "AA", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color-contrast(", + ], + Array [ + "identifier", + "currentColor", + ], + Array [ + "identifier", + "vs", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "identifier", + "to", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "device-cmyk(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "firebrick", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "device-cmyk(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "lab(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "calc", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgba(", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgba(", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgba(", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgba(", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hsla(", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hsla(", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hsla(", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hsl(", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hwb(", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "device-cmyk(", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "display-p3", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "relative", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "identifier", + "from", + ], + Array [ + "identifier", + "indianred", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "identifier", + "from", + ], + Array [ + "identifier", + "transparent", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "lch(", + ], + Array [ + "identifier", + "from", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--mygray", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "identifier", + "from", + ], + Array [ + "identifier", + "Canvas", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "identifier", + "from", + ], + Array [ + "identifier", + "canvas", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "identifier", + "from", + ], + Array [ + "identifier", + "ActiveBorder", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "identifier", + "from", + ], + Array [ + "identifier", + "-moz-buttondefault", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "identifier", + "from", + ], + Array [ + "identifier", + "-moz-activehyperlinktext", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "identifier", + "from", + ], + Array [ + "identifier", + "currentColor", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "var", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--red", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--green", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--blue", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--red", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--green", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--blue", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--alpha", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "env(", + ], + Array [ + "identifier", + "--red", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "env(", + ], + Array [ + "identifier", + "--green", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "env(", + ], + Array [ + "identifier", + "--blue", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "env(", + ], + Array [ + "identifier", + "--red", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "env(", + ], + Array [ + "identifier", + "--green", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "env(", + ], + Array [ + "identifier", + "--blue", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "env(", + ], + Array [ + "identifier", + "--alpha", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "constant(", + ], + Array [ + "identifier", + "--red", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "constant(", + ], + Array [ + "identifier", + "--green", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "constant(", + ], + Array [ + "identifier", + "--blue", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "constant(", + ], + Array [ + "identifier", + "--red", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "constant(", + ], + Array [ + "identifier", + "--green", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "constant(", + ], + Array [ + "identifier", + "--blue", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "constant(", + ], + Array [ + "identifier", + "--alpha", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hsl(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--b2", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--b1", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--tw-bg-opacity", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "lab(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--mycolor", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgba(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgba(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "lab(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--mycolor", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "lab(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--mycolor", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--mycolor", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "lab(", + ], + Array [ + "identifier", + "from", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--mycolor", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "lab(", + ], + Array [ + "identifier", + "from", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--mycolor", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color-a", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color-a", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgba(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--mycolor", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--mycolor", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--mycolor", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "lab(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--mycolor", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--mycolor", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--mycolor", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "from", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "from", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "from", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--base", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "identifier", + "mi", + ], + Array [ + "function", + "calc(", + ], + Array [ + "identifier", + "pi", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "calc(", + ], + Array [ + "identifier", + "pi", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "--unwise", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "--unwise", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "--unwise", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "device-cmyk(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "device-cmyk(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "device-cmyk(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "device-cmyk(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "device-cmyk(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "device-cmyk(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "device-cmyk(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "device-cmyk(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "rgb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "comma", + ",", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hwb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hwb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hwb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hwb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hwb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hwb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hwb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hwb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hwb(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hwb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hwb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hwb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hwb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "hwb(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--bg-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "rec2020", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "rec2020", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "rec2020", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "rec2020", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "rec2020", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "rec2020", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "xyz-d50", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "sRGB", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "display-p3", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "a98-rgb", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "prophoto-rgb", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "color(", + ], + Array [ + "identifier", + "rec2020", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "root", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "---", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "value", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--important", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "value", + ], + Array [ + "identifier", + "important", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--important1", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "value", + ], + Array [ + "identifier", + "important", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--important2", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "value", + ], + Array [ + "identifier", + "important", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--important3", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "value", + ], + Array [ + "identifier", + "important", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--important4", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "identifier", + "important", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--empty", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--empty2", + ], + Array [ + "colon", + ":", + ], + Array [ + "comment", + "/**/", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--empty3", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "important", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--empty4", + ], + Array [ + "colon", + ":", + ], + Array [ + "comment", + "/**/", + ], + Array [ + "identifier", + "important", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--empty5", + ], + Array [ + "colon", + ":", + ], + Array [ + "comment", + "/* 1 */", + ], + Array [ + "comment", + "/* 2 */", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--no-whitespace", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "ident", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--number", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--unit", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--color", + ], + Array [ + "colon", + ":", + ], + Array [ + "hash", + "#06c", + false, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--function", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "calc(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--variable", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--unit", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--string", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "'single quoted string'", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--string", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "\\"double quoted string\\"", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--square-block", + ], + Array [ + "colon", + ":", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--square-block1", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--square-block2", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--round-block", + ], + Array [ + "colon", + ":", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--round-block1", + ], + Array [ + "colon", + ":", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--round-block2", + ], + Array [ + "colon", + ":", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--bracket-block", + ], + Array [ + "colon", + ":", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "comma", + ",", + ], + Array [ + "comma", + ",", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--bracket-block1", + ], + Array [ + "colon", + ":", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--bracket-block2", + ], + Array [ + "colon", + ":", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--JSON", + ], + Array [ + "colon", + ":", + ], + Array [ + "comma", + ",", + ], + Array [ + "string", + "\\"2\\"", + ], + Array [ + "comma", + ",", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "string", + "\\"three\\"", + ], + Array [ + "colon", + ":", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "string", + "\\"a\\"", + ], + Array [ + "colon", + ":", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "comma", + ",", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--javascript", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "function(", + ], + Array [ + "identifier", + "rule", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "console", + ], + Array [ + "delim", + ".", + ], + Array [ + "function", + "log(", + ], + Array [ + "identifier", + "rule", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--CDO", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--CDC", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--complex-balanced", + ], + Array [ + "colon", + ":", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--fake-important", + ], + Array [ + "colon", + ":", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "important", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--semicolon-not-top-level", + ], + Array [ + "colon", + ":", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--delim-not-top-level", + ], + Array [ + "colon", + ":", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--zero-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "height", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--small-icon", + ], + Array [ + "colon", + ":", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "height", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "root", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "--a", + ], + Array [ + "colon", + ":", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "root", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "--foo", + ], + Array [ + "colon", + ":", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "root", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "--foo", + ], + Array [ + "colon", + ":", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "root", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "--var", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "value", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "table", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "\\\\red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "\\\\;a", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "not(", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "string", + "\\")\\"", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "not(", + ], + Array [ + "identifier", + "div", + ], + Array [ + "comment", + "/*)*/", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "not(", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "nth-child(", + ], + Array [ + "identifier", + "of", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "string", + "\\")\\"", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "identifier", + "\\\\\\"", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "identifier", + "\\\\{", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "identifier", + "\\\\(", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "identifier", + "yes\\\\:\\\\(it\\\\'s\\\\ work\\\\)", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "\\\\@noat", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "h1\\\\\\\\", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "\\\\\\\\", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "attr", + ], + Array [ + "string", + "\\"\\\\;\\"", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "\\\\62 olor", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "animation", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "test", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "animation", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "тест", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "animation", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "т\\\\ест", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "animation", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "😋", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "animation", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "\\\\\\\\😋", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "animation", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "\\\\😋", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "z-index", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "z-index", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "z-index", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "z-index", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "z-index", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "z-index", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "width", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "margin", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "margin", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "colon", + ":", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "before", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "content", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "\\"This string is demarcated by double quotes.\\"", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "content", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "'This string is demarcated by single quotes.'", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "content", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "\\"This is a string with \\\\\\" an escaped double quote.\\"", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "content", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "\\"This string also has \\\\22 an escaped double quote.\\"", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "content", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "'This is a string with \\\\' an escaped single quote.'", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "content", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "'This string also has \\\\27 an escaped single quote.'", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "content", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "\\"This is a string with \\\\\\\\ an escaped backslash.\\"", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "content", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "\\"This string also has \\\\22an escaped double quote.\\"", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "content", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "\\"This string also has \\\\22 an escaped double quote.\\"", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "content", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "\\"This string has a \\\\Aline break in it.\\"", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "content", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "\\"A really long \\\\ +awesome string\\"", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "content", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "\\";'@ /**/\\\\\\"\\"", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "content", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "'\\\\'\\"\\\\\\\\'", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "content", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "\\"a\\\\ +b\\"", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "content", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "\\"a\\\\ +b\\"", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "content", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "\\"a\\\\ +b\\"", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "content", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "\\"a\\\\ b\\"", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "content", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "\\"a\\\\ +\\\\ +\\\\ +\\\\ \\\\ +b\\"", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "content", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "'a\\\\62 c'", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "title", + ], + Array [ + "string", + "\\"a not s\\\\ +o very long title\\"", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "a", + ], + Array [ + "identifier", + "title", + ], + Array [ + "string", + "\\"a not so very long title\\"", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "color", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "family-name", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "\\"A;' /**/\\"", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "content", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "\\";'@ /**/\\\\\\"\\"", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "content", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "'\\\\'\\"\\\\\\\\'", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@media", + ], + Array [ + "identifier", + "print", + ], + Array [ + "identifier", + "and", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "min-resolution", + ], + Array [ + "colon", + ":", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@media", + ], + Array [ + "identifier", + "print", + ], + Array [ + "identifier", + "and", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "min-resolution", + ], + Array [ + "colon", + ":", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@media", + ], + Array [ + "identifier", + "print", + ], + Array [ + "identifier", + "and", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "min-resolution", + ], + Array [ + "colon", + ":", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@media", + ], + Array [ + "identifier", + "print", + ], + Array [ + "identifier", + "and", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "identifier", + "min-resolution", + ], + Array [ + "colon", + ":", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "row1-start", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "row1-start-with-spaces-around", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "red", + ], + Array [ + "hash", + "#fff", + true, + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "prop", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "row1-start", + ], + Array [ + "identifier", + "row1-end", + ], + Array [ + "identifier", + "row2-start", + ], + Array [ + "identifier", + "row2-end", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "hash", + "#delay", + true, + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "font-size", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "transition-property", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "font-size", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "transition-duration", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "transition-delay", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "box", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "transition", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "width", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "height", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "background-color", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "transform", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "time", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "transition-duration", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "transition-duration", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "atKeyword", + "@font-face", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "font-family", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "'Ampersand'", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "src", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "local(", + ], + Array [ + "string", + "'Times New Roman'", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "unicode-range", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "U", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "comment", + "/* single codepoint */", + ], + Array [ + "identifier", + "unicode-range", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "u", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "unicode-range", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "U", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "unicode-range", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "U", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "comment", + "/* codepoint range */", + ], + Array [ + "identifier", + "unicode-range", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "U", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "comment", + "/* wildcard range */", + ], + Array [ + "identifier", + "unicode-range", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "U", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "U", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "comment", + "/* multiple values */", + ], + Array [ + "identifier", + "unicode-range", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "U", + ], + Array [ + "identifier", + "A5", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "U", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "U", + ], + Array [ + "comma", + ",", + ], + Array [ + "identifier", + "U", + ], + Array [ + "identifier", + "FF00-FF9F", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "comment", + "/* multiple values */", + ], + Array [ + "identifier", + "unicode-range", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "U", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "unicode-range", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "U", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "unicode-range", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "U", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "unicode-range", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "U", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "unicode-range", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "U", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "unicode-range", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "U", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "unicode-range", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "U", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "unicode-range", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "U", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "identifier", + "div", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "url", + "url(https://example.com/image.png)", + "https://example.com/image.png", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "url", + "URL(https://example.com/image.png)", + "https://example.com/image.png", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "\\\\URL(", + ], + Array [ + "identifier", + "https", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "example", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "com", + ], + Array [ + "identifier", + "image", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "png", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "\\"https://example.com/image.png\\"", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "'https://example.com/image.png'", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "URL(", + ], + Array [ + "string", + "'https://example.com/image.png'", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "\\\\URL(", + ], + Array [ + "string", + "'https://example.com/image.png'", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "url", + "url(data:image/png;base64,iRxVB0)", + "data:image/png;base64,iRxVB0", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "url", + "url(#IDofSVGpath)", + "#IDofSVGpath", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "comment", + "/* A is either an or a functional notation. */", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "\\"//aa.com/img.svg\\"", + ], + Array [ + "identifier", + "prefetch", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "\\"//aa.com/img.svg\\"", + ], + Array [ + "identifier", + "foo", + ], + Array [ + "identifier", + "bar", + ], + Array [ + "identifier", + "baz", + ], + Array [ + "function", + "func(", + ], + Array [ + "identifier", + "test", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "\\"http://example.com/image.svg\\"", + ], + Array [ + "function", + "param(", + ], + Array [ + "identifier", + "--color", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--primary-color", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "url", + "url()", + "", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "\\"\\"", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "''", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "--foo", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "\\"http://www.example.com/pinkish.gif\\"", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "src(", + ], + Array [ + "string", + "\\"http://www.example.com/pinkish.gif\\"", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "SRC(", + ], + Array [ + "string", + "\\"http://www.example.com/pinkish.gif\\"", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "src(", + ], + Array [ + "function", + "var(", + ], + Array [ + "identifier", + "--foo", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "url", + "url( https://example.com/image.png )", + "https://example.com/image.png", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "u\\\\rl(", + ], + Array [ + "identifier", + "https", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "example", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "com", + ], + Array [ + "identifier", + "image", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "png", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "url", + "url( + https://example.com/image.png + )", + "https://example.com/image.png", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "url", + "url( + + + https://example.com/image.png + + + )", + "https://example.com/image.png", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "url", + "URL(https://example.com/ima\\\\)ge.png)", + "https://example.com/ima\\\\)ge.png", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "background", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "url(", + ], + Array [ + "string", + "\\"https://example.com/image.png\\"", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], + Array [ + "delim", + ".", + ], + Array [ + "identifier", + "delim", + ], + Array [ + "leftCurlyBracket", + "{", + ], + Array [ + "identifier", + "a1", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a2", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a3", + ], + Array [ + "colon", + ":", + ], + Array [ + "leftParenthesis", + "(", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a4", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a5", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "s1", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a6", + ], + Array [ + "colon", + ":", + ], + Array [ + "string", + "\\"test\\"", + ], + Array [ + "comma", + ",", + ], + Array [ + "string", + "\\"test\\"", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a7", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a8", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "fn(", + ], + Array [ + "string", + "\\"test\\"", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a9", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a10", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "\\\\ ", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a11", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a12", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "--1", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a13", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a14", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "ident1", + ], + Array [ + "identifier", + "abc", + ], + Array [ + "identifier", + "ident2", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a15", + ], + Array [ + "colon", + ":", + ], + Array [ + "function", + "--fn(", + ], + Array [ + "string", + "\\"test\\"", + ], + Array [ + "rightParenthesis", + ")", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a16", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a17", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a18", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a19", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a20", + ], + Array [ + "colon", + ":", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a21", + ], + Array [ + "colon", + ":", + ], + Array [ + "delim", + ".", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a22", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "\\\\A", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a23", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "\\\\00000A", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a23", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "\\\\00000AB", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "identifier", + "a24", + ], + Array [ + "colon", + ":", + ], + Array [ + "identifier", + "\\\\123456 B", + ], + Array [ + "semicolon", + ";", + ], + Array [ + "rightCurlyBracket", + "}", + ], +] +`; diff --git a/test/benchmarkCases/_helpers/create-tree.mjs b/test/benchmarkCases/_helpers/create-tree.mjs new file mode 100644 index 00000000000..c3662c57b15 --- /dev/null +++ b/test/benchmarkCases/_helpers/create-tree.mjs @@ -0,0 +1,103 @@ +import fs from "fs/promises"; + +const avgCode = ` +const str = "we" + "do" + "some" + "ops"; +for(const x of str.split("")) { + if(x.charCodeAt(0) > 40) { + console.log("omg"); + } else { + console.log(Math.random() * 2 + 3 * 2); + } +} + +// Some comment +const value = 9; + +switch(value) { + case true: + break; + case "magic": + throw new Error("Error!"); + case 9: + (function() { + // extra scope + var x = 123; + var y = 456; + var z = x + z * x / y; + x && y && (z = x ? y : x); + }()) +} + +function a() {} +function b() {} +function c() {} +function d() {} +function e() {} +function f() {} +`; + +async function createTree( + folder, + useRequire = false, + count = 50, + async = undefined +) { + await fs.mkdir(folder, { recursive: true }); + + let remaining = count - 1; + + async function make(prefix, count, depth) { + if (count === 0) { + await fs.writeFile( + `${folder}/${prefix}.js`, + useRequire + ? `module.exports = 1;\n${avgCode}` + : `export default 1;\n${avgCode}` + ); + } else { + const list = []; + + for (let i = 0; i < count; i++) { + if (remaining-- <= 0) break; + const isAsync = + typeof async !== "undefined" + ? depth >= async + : depth <= 4 && i >= 3 && i <= 4; + const module = `${prefix}-${i}`; + + if (isAsync) { + list.push( + useRequire + ? `require.ensure([], function() { const module${i} = require(${JSON.stringify(`./${module}.js`)}); });\n` + : `const module${i} = await import(${JSON.stringify(`./${module}.js`)});\n` + ); + list.push(`counter += module${i};\nconsole.log(counter)`); + } else { + list.push( + useRequire + ? `const module${i} = require(${JSON.stringify(`./${module}.js`)});\n` + : `import module${i} from ${JSON.stringify(`./${module}.js`)};\n` + ); + list.push(`counter += module${i};\nconsole.log(counter)`); + } + + await make( + module, + depth > 4 || count > 30 ? 0 : count + depth + i ** 2, + depth + 1 + ); + } + + await fs.writeFile( + `${folder}/${prefix}.js`, + `let counter = 0;\n${list.join( + "\n" + )};\n${useRequire ? `module.exports = counter;\n${avgCode}` : `export default counter;\n${avgCode}`}` + ); + } + } + + await make("module", 2, 0); +} + +export default createTree; diff --git a/test/benchmarkCases/cache-filesystem/index.js b/test/benchmarkCases/cache-filesystem/index.js new file mode 100644 index 00000000000..29d87b74b49 --- /dev/null +++ b/test/benchmarkCases/cache-filesystem/index.js @@ -0,0 +1,2 @@ +import * as mod from "three/src/Three.js"; +export { mod }; diff --git a/test/benchmarkCases/cache-filesystem/webpack.config.js b/test/benchmarkCases/cache-filesystem/webpack.config.js new file mode 100644 index 00000000000..9d55f533c86 --- /dev/null +++ b/test/benchmarkCases/cache-filesystem/webpack.config.js @@ -0,0 +1,7 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + entry: "./index", + cache: { + type: "filesystem" + } +}; diff --git a/test/benchmarkCases/context-commonjs/index.js b/test/benchmarkCases/context-commonjs/index.js new file mode 100644 index 00000000000..3dd2be779ea --- /dev/null +++ b/test/benchmarkCases/context-commonjs/index.js @@ -0,0 +1,5 @@ +async function run() { + const mod = "module.js" + + require(`./generated/${mod}`); +} diff --git a/test/benchmarkCases/context-commonjs/options.mjs b/test/benchmarkCases/context-commonjs/options.mjs new file mode 100644 index 00000000000..047f4666a80 --- /dev/null +++ b/test/benchmarkCases/context-commonjs/options.mjs @@ -0,0 +1,12 @@ +import createTree from "../_helpers/create-tree.mjs"; +import { resolve, dirname } from "path"; +import { fileURLToPath } from "url"; +import fs from "fs/promises"; + +export async function setup() { + const __dirname = dirname(fileURLToPath(import.meta.url)); + const generated = resolve(__dirname, "./generated"); + + await fs.rm(generated, { recursive: true, force: true }); + await createTree(generated, true, 25); +} diff --git a/test/benchmarkCases/context-commonjs/webpack.config.js b/test/benchmarkCases/context-commonjs/webpack.config.js new file mode 100644 index 00000000000..4c111be6a97 --- /dev/null +++ b/test/benchmarkCases/context-commonjs/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + entry: "./index" +}; diff --git a/test/benchmarkCases/context-esm/index.js b/test/benchmarkCases/context-esm/index.js new file mode 100644 index 00000000000..4c150e1127c --- /dev/null +++ b/test/benchmarkCases/context-esm/index.js @@ -0,0 +1,5 @@ +async function run() { + const mod = "module.js" + + await import(`./generated/${mod}`); +} diff --git a/test/benchmarkCases/context-esm/options.mjs b/test/benchmarkCases/context-esm/options.mjs new file mode 100644 index 00000000000..7a132bea247 --- /dev/null +++ b/test/benchmarkCases/context-esm/options.mjs @@ -0,0 +1,12 @@ +import createTree from "../_helpers/create-tree.mjs"; +import { resolve, dirname } from "path"; +import { fileURLToPath } from "url"; +import fs from "fs/promises"; + +export async function setup() { + const __dirname = dirname(fileURLToPath(import.meta.url)); + const generated = resolve(__dirname, "./generated"); + + await fs.rm(generated, { recursive: true, force: true }); + await createTree(generated, false, 25); +} diff --git a/test/benchmarkCases/context-esm/webpack.config.js b/test/benchmarkCases/context-esm/webpack.config.js new file mode 100644 index 00000000000..4c111be6a97 --- /dev/null +++ b/test/benchmarkCases/context-esm/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + entry: "./index" +}; diff --git a/test/benchmarkCases/devtool-eval-source-map/index.js b/test/benchmarkCases/devtool-eval-source-map/index.js new file mode 100644 index 00000000000..5650bccde36 --- /dev/null +++ b/test/benchmarkCases/devtool-eval-source-map/index.js @@ -0,0 +1,2 @@ +import * as mod from "./generated/module.js"; +export { mod }; diff --git a/test/benchmarkCases/devtool-eval-source-map/options.mjs b/test/benchmarkCases/devtool-eval-source-map/options.mjs new file mode 100644 index 00000000000..168ffedc19f --- /dev/null +++ b/test/benchmarkCases/devtool-eval-source-map/options.mjs @@ -0,0 +1,12 @@ +import createTree from "../_helpers/create-tree.mjs"; +import { resolve, dirname } from "path"; +import { fileURLToPath } from "url"; +import fs from "fs/promises"; + +export async function setup() { + const __dirname = dirname(fileURLToPath(import.meta.url)); + const generated = resolve(__dirname, "./generated"); + + await fs.rm(generated, { recursive: true, force: true }); + await createTree(generated); +} diff --git a/test/benchmarkCases/devtool-eval-source-map/webpack.config.js b/test/benchmarkCases/devtool-eval-source-map/webpack.config.js new file mode 100644 index 00000000000..7c2042e3c95 --- /dev/null +++ b/test/benchmarkCases/devtool-eval-source-map/webpack.config.js @@ -0,0 +1,5 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + entry: "./index", + devtool: "eval-source-map" +}; diff --git a/test/benchmarkCases/devtool-eval/index.js b/test/benchmarkCases/devtool-eval/index.js new file mode 100644 index 00000000000..5650bccde36 --- /dev/null +++ b/test/benchmarkCases/devtool-eval/index.js @@ -0,0 +1,2 @@ +import * as mod from "./generated/module.js"; +export { mod }; diff --git a/test/benchmarkCases/devtool-eval/options.mjs b/test/benchmarkCases/devtool-eval/options.mjs new file mode 100644 index 00000000000..168ffedc19f --- /dev/null +++ b/test/benchmarkCases/devtool-eval/options.mjs @@ -0,0 +1,12 @@ +import createTree from "../_helpers/create-tree.mjs"; +import { resolve, dirname } from "path"; +import { fileURLToPath } from "url"; +import fs from "fs/promises"; + +export async function setup() { + const __dirname = dirname(fileURLToPath(import.meta.url)); + const generated = resolve(__dirname, "./generated"); + + await fs.rm(generated, { recursive: true, force: true }); + await createTree(generated); +} diff --git a/test/benchmarkCases/devtool-eval/webpack.config.js b/test/benchmarkCases/devtool-eval/webpack.config.js new file mode 100644 index 00000000000..3f99d3bfc1b --- /dev/null +++ b/test/benchmarkCases/devtool-eval/webpack.config.js @@ -0,0 +1,5 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + entry: "./index", + devtool: "eval" +}; diff --git a/test/benchmarkCases/devtool-source-map/index.js b/test/benchmarkCases/devtool-source-map/index.js new file mode 100644 index 00000000000..5650bccde36 --- /dev/null +++ b/test/benchmarkCases/devtool-source-map/index.js @@ -0,0 +1,2 @@ +import * as mod from "./generated/module.js"; +export { mod }; diff --git a/test/benchmarkCases/devtool-source-map/options.mjs b/test/benchmarkCases/devtool-source-map/options.mjs new file mode 100644 index 00000000000..168ffedc19f --- /dev/null +++ b/test/benchmarkCases/devtool-source-map/options.mjs @@ -0,0 +1,12 @@ +import createTree from "../_helpers/create-tree.mjs"; +import { resolve, dirname } from "path"; +import { fileURLToPath } from "url"; +import fs from "fs/promises"; + +export async function setup() { + const __dirname = dirname(fileURLToPath(import.meta.url)); + const generated = resolve(__dirname, "./generated"); + + await fs.rm(generated, { recursive: true, force: true }); + await createTree(generated); +} diff --git a/test/benchmarkCases/devtool-source-map/webpack.config.js b/test/benchmarkCases/devtool-source-map/webpack.config.js new file mode 100644 index 00000000000..eb6058c894f --- /dev/null +++ b/test/benchmarkCases/devtool-source-map/webpack.config.js @@ -0,0 +1,5 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + entry: "./index", + devtool: "source-map" +}; diff --git a/test/benchmarkCases/future-defaults/index.js b/test/benchmarkCases/future-defaults/index.js new file mode 100644 index 00000000000..c15055d3f16 --- /dev/null +++ b/test/benchmarkCases/future-defaults/index.js @@ -0,0 +1,2 @@ +import * as mod from "./generated/module.js"; +export { mod } diff --git a/test/benchmarkCases/future-defaults/options.mjs b/test/benchmarkCases/future-defaults/options.mjs new file mode 100644 index 00000000000..8bdde9b5376 --- /dev/null +++ b/test/benchmarkCases/future-defaults/options.mjs @@ -0,0 +1,12 @@ +import createTree from "../_helpers/create-tree.mjs"; +import { resolve, dirname } from "path"; +import { fileURLToPath } from "url"; +import fs from "fs/promises"; + +export async function setup() { + const __dirname = dirname(fileURLToPath(import.meta.url)); + const generated = resolve(__dirname, "./generated"); + + await fs.rm(generated, { recursive: true, force: true }); + await createTree(generated, false, 75); +} diff --git a/test/benchmarkCases/future-defaults/webpack.config.js b/test/benchmarkCases/future-defaults/webpack.config.js new file mode 100644 index 00000000000..77b0a2329a9 --- /dev/null +++ b/test/benchmarkCases/future-defaults/webpack.config.js @@ -0,0 +1,7 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + entry: "./index", + experiments: { + futureDefaults: true + } +}; diff --git a/test/benchmarkCases/large-ast/index.js b/test/benchmarkCases/large-ast/index.js deleted file mode 100644 index e7d77d2fa48..00000000000 --- a/test/benchmarkCases/large-ast/index.js +++ /dev/null @@ -1,12 +0,0 @@ -import "react/dist/react-with-addons.js?0"; -import "react/dist/react-with-addons.js?1"; -import "react/dist/react-with-addons.js?2"; -import "react/dist/react-with-addons.js?3"; -import "react/dist/react-with-addons.js?4"; -import "react/dist/react-with-addons.js?5"; -import "react/dist/react-with-addons.js?6"; -import "react/dist/react-with-addons.js?7"; -import "react/dist/react-with-addons.js?8"; -import "react/dist/react-with-addons.js?9"; -import "react/dist/react-with-addons.js?10"; -import "react/dist/react-with-addons.js?11"; diff --git a/test/benchmarkCases/large-ast/index2.js b/test/benchmarkCases/large-ast/index2.js deleted file mode 100644 index 00dc443a5e0..00000000000 --- a/test/benchmarkCases/large-ast/index2.js +++ /dev/null @@ -1,8 +0,0 @@ -import "lodash/lodash.js?0"; -import "lodash/lodash.js?1"; -import "lodash/lodash.js?2"; -import "lodash/lodash.js?3"; -import "lodash/lodash.min.js?0"; -import "lodash/lodash.min.js?1"; -import "lodash/lodash.min.js?2"; -import "lodash/lodash.min.js?3"; diff --git a/test/benchmarkCases/large-ast/webpack.config.js b/test/benchmarkCases/large-ast/webpack.config.js deleted file mode 100644 index d0c9ec47c1e..00000000000 --- a/test/benchmarkCases/large-ast/webpack.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - entry: ["./index", "./index2"] -}; diff --git a/test/benchmarkCases/libraries/webpack.config.js b/test/benchmarkCases/libraries/webpack.config.js deleted file mode 100644 index 7c4ed5c64b8..00000000000 --- a/test/benchmarkCases/libraries/webpack.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - entry: ["react", "react-dom", "lodash"] -}; diff --git a/test/benchmarkCases/lodash/index.js b/test/benchmarkCases/lodash/index.js new file mode 100644 index 00000000000..65da3d971b8 --- /dev/null +++ b/test/benchmarkCases/lodash/index.js @@ -0,0 +1,2 @@ +import * as mod3 from "lodash"; +export { mod3 }; diff --git a/test/benchmarkCases/lodash/webpack.config.js b/test/benchmarkCases/lodash/webpack.config.js new file mode 100644 index 00000000000..4c111be6a97 --- /dev/null +++ b/test/benchmarkCases/lodash/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + entry: "./index" +}; diff --git a/test/benchmarkCases/many-chunks-commonjs/index.js b/test/benchmarkCases/many-chunks-commonjs/index.js new file mode 100644 index 00000000000..fa37ca1f3d6 --- /dev/null +++ b/test/benchmarkCases/many-chunks-commonjs/index.js @@ -0,0 +1,2 @@ +const result = require("./generated/module.js"); +module.exports = result; diff --git a/test/benchmarkCases/many-chunks-commonjs/options.mjs b/test/benchmarkCases/many-chunks-commonjs/options.mjs new file mode 100644 index 00000000000..d7d7366b0f8 --- /dev/null +++ b/test/benchmarkCases/many-chunks-commonjs/options.mjs @@ -0,0 +1,12 @@ +import createTree from "../_helpers/create-tree.mjs"; +import { resolve, dirname } from "path"; +import { fileURLToPath } from "url"; +import fs from "fs/promises"; + +export async function setup() { + const __dirname = dirname(fileURLToPath(import.meta.url)); + const generated = resolve(__dirname, "./generated"); + + await fs.rm(generated, { recursive: true, force: true }); + await createTree(generated, true, 50, 0); +} diff --git a/test/benchmarkCases/many-chunks-commonjs/webpack.config.js b/test/benchmarkCases/many-chunks-commonjs/webpack.config.js new file mode 100644 index 00000000000..4c111be6a97 --- /dev/null +++ b/test/benchmarkCases/many-chunks-commonjs/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + entry: "./index" +}; diff --git a/test/benchmarkCases/many-chunks-esm/index.js b/test/benchmarkCases/many-chunks-esm/index.js new file mode 100644 index 00000000000..5650bccde36 --- /dev/null +++ b/test/benchmarkCases/many-chunks-esm/index.js @@ -0,0 +1,2 @@ +import * as mod from "./generated/module.js"; +export { mod }; diff --git a/test/benchmarkCases/many-chunks-esm/options.mjs b/test/benchmarkCases/many-chunks-esm/options.mjs new file mode 100644 index 00000000000..dece89a9f12 --- /dev/null +++ b/test/benchmarkCases/many-chunks-esm/options.mjs @@ -0,0 +1,12 @@ +import createTree from "../_helpers/create-tree.mjs"; +import { resolve, dirname } from "path"; +import { fileURLToPath } from "url"; +import fs from "fs/promises"; + +export async function setup() { + const __dirname = dirname(fileURLToPath(import.meta.url)); + const generated = resolve(__dirname, "./generated"); + + await fs.rm(generated, { recursive: true, force: true }); + await createTree(generated, false, 50, 0); +} diff --git a/test/benchmarkCases/many-chunks-esm/webpack.config.js b/test/benchmarkCases/many-chunks-esm/webpack.config.js new file mode 100644 index 00000000000..4c111be6a97 --- /dev/null +++ b/test/benchmarkCases/many-chunks-esm/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + entry: "./index" +}; diff --git a/test/benchmarkCases/many-chunks/a.js b/test/benchmarkCases/many-chunks/a.js deleted file mode 100644 index 410cf0a6945..00000000000 --- a/test/benchmarkCases/many-chunks/a.js +++ /dev/null @@ -1,10 +0,0 @@ -import("./b?0" + __resourceQuery); -import("./b?1" + __resourceQuery); -import("./b?2" + __resourceQuery); -import("./b?3" + __resourceQuery); -import("./b?4" + __resourceQuery); -import("./b?5" + __resourceQuery); -import("./b?6" + __resourceQuery); -import("./b?7" + __resourceQuery); -import("./b?8" + __resourceQuery); -import("./b?9" + __resourceQuery); diff --git a/test/benchmarkCases/many-chunks/b.js b/test/benchmarkCases/many-chunks/b.js deleted file mode 100644 index 670c28f0d85..00000000000 --- a/test/benchmarkCases/many-chunks/b.js +++ /dev/null @@ -1,6 +0,0 @@ -import("./c?0" + __resourceQuery); -import("./c?1" + __resourceQuery); -import("./c?2" + __resourceQuery); -import("./c?3" + __resourceQuery); -import("./c?4" + __resourceQuery); -import("./a" + __resourceQuery.substr(0, 2)); diff --git a/test/benchmarkCases/many-chunks/c.js b/test/benchmarkCases/many-chunks/c.js deleted file mode 100644 index 3d17d00029b..00000000000 --- a/test/benchmarkCases/many-chunks/c.js +++ /dev/null @@ -1 +0,0 @@ -// content diff --git a/test/benchmarkCases/many-chunks/index.js b/test/benchmarkCases/many-chunks/index.js deleted file mode 100644 index 4ab3926df0e..00000000000 --- a/test/benchmarkCases/many-chunks/index.js +++ /dev/null @@ -1,10 +0,0 @@ -import("./a?0"); -import("./a?1"); -import("./a?2"); -import("./a?3"); -import("./a?4"); -import("./a?5"); -import("./a?6"); -import("./a?7"); -import("./a?8"); -import("./a?9"); diff --git a/test/benchmarkCases/many-chunks/webpack.config.js b/test/benchmarkCases/many-chunks/webpack.config.js deleted file mode 100644 index 8c31ec4d717..00000000000 --- a/test/benchmarkCases/many-chunks/webpack.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - entry: "./index" -}; diff --git a/test/benchmarkCases/many-modules-commonjs/index.js b/test/benchmarkCases/many-modules-commonjs/index.js new file mode 100644 index 00000000000..fa37ca1f3d6 --- /dev/null +++ b/test/benchmarkCases/many-modules-commonjs/index.js @@ -0,0 +1,2 @@ +const result = require("./generated/module.js"); +module.exports = result; diff --git a/test/benchmarkCases/many-modules-commonjs/options.mjs b/test/benchmarkCases/many-modules-commonjs/options.mjs new file mode 100644 index 00000000000..ae9c7e31074 --- /dev/null +++ b/test/benchmarkCases/many-modules-commonjs/options.mjs @@ -0,0 +1,12 @@ +import createTree from "../_helpers/create-tree.mjs"; +import { resolve, dirname } from "path"; +import { fileURLToPath } from "url"; +import fs from "fs/promises"; + +export async function setup() { + const __dirname = dirname(fileURLToPath(import.meta.url)); + const generated = resolve(__dirname, "./generated"); + + await fs.rm(generated, { recursive: true, force: true }); + await createTree(generated, true, 75); +} diff --git a/test/benchmarkCases/many-modules-commonjs/webpack.config.js b/test/benchmarkCases/many-modules-commonjs/webpack.config.js new file mode 100644 index 00000000000..4c111be6a97 --- /dev/null +++ b/test/benchmarkCases/many-modules-commonjs/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + entry: "./index" +}; diff --git a/test/benchmarkCases/many-modules-esm/index.js b/test/benchmarkCases/many-modules-esm/index.js new file mode 100644 index 00000000000..5650bccde36 --- /dev/null +++ b/test/benchmarkCases/many-modules-esm/index.js @@ -0,0 +1,2 @@ +import * as mod from "./generated/module.js"; +export { mod }; diff --git a/test/benchmarkCases/many-modules-esm/options.mjs b/test/benchmarkCases/many-modules-esm/options.mjs new file mode 100644 index 00000000000..8bdde9b5376 --- /dev/null +++ b/test/benchmarkCases/many-modules-esm/options.mjs @@ -0,0 +1,12 @@ +import createTree from "../_helpers/create-tree.mjs"; +import { resolve, dirname } from "path"; +import { fileURLToPath } from "url"; +import fs from "fs/promises"; + +export async function setup() { + const __dirname = dirname(fileURLToPath(import.meta.url)); + const generated = resolve(__dirname, "./generated"); + + await fs.rm(generated, { recursive: true, force: true }); + await createTree(generated, false, 75); +} diff --git a/test/benchmarkCases/many-modules-esm/webpack.config.js b/test/benchmarkCases/many-modules-esm/webpack.config.js new file mode 100644 index 00000000000..4c111be6a97 --- /dev/null +++ b/test/benchmarkCases/many-modules-esm/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + entry: "./index" +}; diff --git a/test/benchmarkCases/many-modules-source-map/a.js b/test/benchmarkCases/many-modules-source-map/a.js deleted file mode 100644 index d33ec306d19..00000000000 --- a/test/benchmarkCases/many-modules-source-map/a.js +++ /dev/null @@ -1,10 +0,0 @@ -require("./b?0" + __resourceQuery); -require("./b?1" + __resourceQuery); -require("./b?2" + __resourceQuery); -require("./b?3" + __resourceQuery); -require("./b?4" + __resourceQuery); -require("./b?5" + __resourceQuery); -require("./b?6" + __resourceQuery); -require("./b?7" + __resourceQuery); -require("./b?8" + __resourceQuery); -require("./b?9" + __resourceQuery); diff --git a/test/benchmarkCases/many-modules-source-map/b.js b/test/benchmarkCases/many-modules-source-map/b.js deleted file mode 100644 index 269a2572379..00000000000 --- a/test/benchmarkCases/many-modules-source-map/b.js +++ /dev/null @@ -1,11 +0,0 @@ -require("./c?0" + __resourceQuery); -require("./c?1" + __resourceQuery); -require("./c?2" + __resourceQuery); -require("./c?3" + __resourceQuery); -require("./c?4" + __resourceQuery); -require("./c?5" + __resourceQuery); -require("./c?6" + __resourceQuery); -require("./c?7" + __resourceQuery); -require("./c?8" + __resourceQuery); -require("./c?9" + __resourceQuery); -require("./a" + __resourceQuery.substr(0, 2)); diff --git a/test/benchmarkCases/many-modules-source-map/c.js b/test/benchmarkCases/many-modules-source-map/c.js deleted file mode 100644 index 3d17d00029b..00000000000 --- a/test/benchmarkCases/many-modules-source-map/c.js +++ /dev/null @@ -1 +0,0 @@ -// content diff --git a/test/benchmarkCases/many-modules-source-map/index.js b/test/benchmarkCases/many-modules-source-map/index.js deleted file mode 100644 index 68edddd83a9..00000000000 --- a/test/benchmarkCases/many-modules-source-map/index.js +++ /dev/null @@ -1,10 +0,0 @@ -import "./a?0"; -import "./a?1"; -import "./a?2"; -import "./a?3"; -import "./a?4"; -import "./a?5"; -import "./a?6"; -import "./a?7"; -import "./a?8"; -import "./a?9"; diff --git a/test/benchmarkCases/many-modules-source-map/webpack.config.js b/test/benchmarkCases/many-modules-source-map/webpack.config.js deleted file mode 100644 index a61015f488e..00000000000 --- a/test/benchmarkCases/many-modules-source-map/webpack.config.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - entry: "./index", - devtool: "eval-cheap-module-source-map" -}; diff --git a/test/benchmarkCases/many-modules/a.js b/test/benchmarkCases/many-modules/a.js deleted file mode 100644 index d33ec306d19..00000000000 --- a/test/benchmarkCases/many-modules/a.js +++ /dev/null @@ -1,10 +0,0 @@ -require("./b?0" + __resourceQuery); -require("./b?1" + __resourceQuery); -require("./b?2" + __resourceQuery); -require("./b?3" + __resourceQuery); -require("./b?4" + __resourceQuery); -require("./b?5" + __resourceQuery); -require("./b?6" + __resourceQuery); -require("./b?7" + __resourceQuery); -require("./b?8" + __resourceQuery); -require("./b?9" + __resourceQuery); diff --git a/test/benchmarkCases/many-modules/b.js b/test/benchmarkCases/many-modules/b.js deleted file mode 100644 index 269a2572379..00000000000 --- a/test/benchmarkCases/many-modules/b.js +++ /dev/null @@ -1,11 +0,0 @@ -require("./c?0" + __resourceQuery); -require("./c?1" + __resourceQuery); -require("./c?2" + __resourceQuery); -require("./c?3" + __resourceQuery); -require("./c?4" + __resourceQuery); -require("./c?5" + __resourceQuery); -require("./c?6" + __resourceQuery); -require("./c?7" + __resourceQuery); -require("./c?8" + __resourceQuery); -require("./c?9" + __resourceQuery); -require("./a" + __resourceQuery.substr(0, 2)); diff --git a/test/benchmarkCases/many-modules/c.js b/test/benchmarkCases/many-modules/c.js deleted file mode 100644 index 3d17d00029b..00000000000 --- a/test/benchmarkCases/many-modules/c.js +++ /dev/null @@ -1 +0,0 @@ -// content diff --git a/test/benchmarkCases/many-modules/index.js b/test/benchmarkCases/many-modules/index.js deleted file mode 100644 index 68edddd83a9..00000000000 --- a/test/benchmarkCases/many-modules/index.js +++ /dev/null @@ -1,10 +0,0 @@ -import "./a?0"; -import "./a?1"; -import "./a?2"; -import "./a?3"; -import "./a?4"; -import "./a?5"; -import "./a?6"; -import "./a?7"; -import "./a?8"; -import "./a?9"; diff --git a/test/benchmarkCases/many-modules/webpack.config.js b/test/benchmarkCases/many-modules/webpack.config.js deleted file mode 100644 index 8c31ec4d717..00000000000 --- a/test/benchmarkCases/many-modules/webpack.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - entry: "./index" -}; diff --git a/test/benchmarkCases/many-stuff-harmony/a.js b/test/benchmarkCases/many-stuff-harmony/a.js deleted file mode 100644 index be76a218755..00000000000 --- a/test/benchmarkCases/many-stuff-harmony/a.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = function() { - let str = ""; - let sum = ["1"]; - const query = +this.query.substr(1); - for(let i = 0; i < query; i++) { - str += `import b${i} from "./b?${Math.floor(i/2)}!";\n`; - sum.push(`b${i}`); - } - str += "export default " + sum.join(" + "); - return str; -} diff --git a/test/benchmarkCases/md4-and-xxhash64-unit/index.bench.mjs b/test/benchmarkCases/md4-and-xxhash64-unit/index.bench.mjs new file mode 100644 index 00000000000..3a7da1296dd --- /dev/null +++ b/test/benchmarkCases/md4-and-xxhash64-unit/index.bench.mjs @@ -0,0 +1,62 @@ +import crypto from "crypto"; +import createHash from "../../../lib/util/createHash.js"; + +function factoryXxhash64(longString) { + return function xxhash64String() { + const hash = createHash("xxhash64"); + hash.update(longString); + return hash.digest("hex"); + }; +} + +function factoryMd4(longString) { + return function md4String() { + const hash = createHash("md4"); + hash.update(longString); + return hash.digest("hex"); + }; +} + +export default function xxhash64AndMd4Benchmarks(suite) { + for (const size of [ + 1, 10, 20, 40, 60, 80, 100, 200, 400, 1000, 1001, 5000, 8183, 8184, 8185, + 10000, 20000, 32768, 32769, 50000, 100000, 200000 + ]) { + const longString = crypto.randomBytes(size).toString("hex"); + const subName1 = `string benchmark (length: ${longString.length})`; + + const fn1 = factoryXxhash64(longString); + const fn2 = factoryMd4(longString); + + suite.add(`xxhash64 ${subName1}`, fn1, { + beforeAll() { + this.collectBy = subName1; + } + }); + + suite.add(`md4 ${subName1}`, fn2, { + beforeAll() { + this.collectBy = subName1; + } + }); + + const bufferSize = size * 2; + const buffer = crypto.randomBytes(bufferSize); + const subName2 = `buffer benchmark (size: ${bufferSize})`; + + const fn3 = factoryXxhash64(buffer); + const fn4 = factoryMd4(buffer); + + suite.add(`xxhash64 ${subName2}`, fn3, { + beforeAll() { + this.collectBy = subName2; + } + }); + + suite.add(`md4 ${subName2}`, fn4, { + beforeAll() { + this.collectBy = subName2; + } + }); + } +} diff --git a/test/benchmarkCases/minimal/index.js b/test/benchmarkCases/minimal/index.js new file mode 100644 index 00000000000..b179ee95347 --- /dev/null +++ b/test/benchmarkCases/minimal/index.js @@ -0,0 +1 @@ +console.log("Hello world"); diff --git a/test/benchmarkCases/minimal/webpack.config.js b/test/benchmarkCases/minimal/webpack.config.js new file mode 100644 index 00000000000..4c111be6a97 --- /dev/null +++ b/test/benchmarkCases/minimal/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + entry: "./index" +}; diff --git a/test/benchmarkCases/react/index.js b/test/benchmarkCases/react/index.js new file mode 100644 index 00000000000..06a80863c2c --- /dev/null +++ b/test/benchmarkCases/react/index.js @@ -0,0 +1,4 @@ +import * as mod1 from "react"; +export { mod1 }; +import * as mod2 from "react-dom"; +export { mod2 }; diff --git a/test/benchmarkCases/react/webpack.config.js b/test/benchmarkCases/react/webpack.config.js new file mode 100644 index 00000000000..4c111be6a97 --- /dev/null +++ b/test/benchmarkCases/react/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + entry: "./index" +}; diff --git a/test/benchmarkCases/three-long/index.js b/test/benchmarkCases/three-long/index.js new file mode 100644 index 00000000000..432347928d8 --- /dev/null +++ b/test/benchmarkCases/three-long/index.js @@ -0,0 +1,2 @@ +import * as copy from "three/src/Three.js"; +export { copy }; diff --git a/test/benchmarkCases/three-long/webpack.config.js b/test/benchmarkCases/three-long/webpack.config.js new file mode 100644 index 00000000000..4c111be6a97 --- /dev/null +++ b/test/benchmarkCases/three-long/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + entry: "./index" +}; diff --git a/test/benchmarkCases/typescript-long-on-schedule/index.js b/test/benchmarkCases/typescript-long-on-schedule/index.js new file mode 100644 index 00000000000..7948b601708 --- /dev/null +++ b/test/benchmarkCases/typescript-long-on-schedule/index.js @@ -0,0 +1,2 @@ +import * as mod from "typescript"; +export { mod }; diff --git a/test/benchmarkCases/typescript-long-on-schedule/webpack.config.js b/test/benchmarkCases/typescript-long-on-schedule/webpack.config.js new file mode 100644 index 00000000000..9c5de9f777b --- /dev/null +++ b/test/benchmarkCases/typescript-long-on-schedule/webpack.config.js @@ -0,0 +1,11 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + entry: "./index", + target: "node", + optimization: { + avoidEntryIife: false, + // terser is very slow on typescript code, need to investigate + minimize: false + }, + ignoreWarnings: [/Critical dependency/] +}; diff --git a/test/browsertest/build.js b/test/browsertest/build.js deleted file mode 100644 index c35352a35a0..00000000000 --- a/test/browsertest/build.js +++ /dev/null @@ -1,47 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -var cp = require('child_process'); - -var argv = process.argv; -argv.shift(); -argv.shift(); -var extraArgs = argv; - -function bindOutput(p) { - p.stdout.on("data", function(data) { - process.stdout.write(data); - }); - p.stderr.on("data", function(data) { - process.stderr.write(data); - }); -} -function join(a, b) { - a = a.slice(0); - Array.prototype.push.apply(a, b); - return a; -} - -console.log("compile scripts…"); - -var extraArgsNoWatch = extraArgs.slice(0); -var watchIndex = extraArgsNoWatch.indexOf("--watch"); -if(watchIndex != -1) extraArgsNoWatch.splice(watchIndex, 1); -// node ../../bin/webpack --output-pathinfo --color --optimize-max-chunks 1 --output-library library1 node_modules/library1 js/library1 -var library1 = cp.spawn("node", join(["../../bin/webpack.js", "--output-pathinfo", "--color", "--optimize-max-chunks", "1", "--output-library", "library1", - "node_modules/library1", "js/library1.js"], extraArgsNoWatch)); -bindOutput(library1); -library1.on("exit", function(code) { - if(code === 0) { - // node ../../bin/webpack --output-pathinfo --color --resolve-alias vm=vm-browserify --output-public-path js/ --output-chunk-filename [name].web.js --module-bind css=style!css --module-bind less=style-loader!css-loader!less-loader --module-bind coffee --module-bind jade --prefetch ./lib/stylesheet.less ./lib/index "js/web.js?h=[hash]" - var main = cp.spawn("node", join(["../../bin/webpack.js", "--output-pathinfo", "--color", "--resolve-alias", "vm=vm-browserify", - "--output-public-path", "js/", "--output-chunk-filename", "[name].web.js", - "--module-bind", "css=style-loader!css-loader", "--module-bind", "less=style-loader/url!file-loader?postfix=.css&string!less-loader", "--module-bind", "coffee", "--module-bind", "jade", "--prefetch", "./lib/stylesheet.less", "./lib/index", "js/web.js?h=[hash]", "--progress"], extraArgs)); - bindOutput(main); - } -}); -// node ../../bin/webpack --output-pathinfo --color --output-library-target umd --output-jsonp-function webpackJsonpLib2 --output-public-path js/ --output-chunk-filename [chunkhash].lib2.js --config library2config.coffee library2b library2 js/library2.js -var library2 = cp.spawn("node", join(["../../bin/webpack.js", "--output-pathinfo", "--color", "--output-library-target", "umd", "--output-jsonp-function", "webpackJsonpLib2", - "--output-public-path", "js/", "--output-chunk-filename", "[chunkhash].lib2.js", "--config", "library2config.coffee", "library2b", "library2", "js/library2.js"], extraArgsNoWatch)); -bindOutput(library2); diff --git a/test/browsertest/img/fail.png b/test/browsertest/img/fail.png deleted file mode 100644 index ffd7b454f73..00000000000 Binary files a/test/browsertest/img/fail.png and /dev/null differ diff --git a/test/browsertest/img/image.png b/test/browsertest/img/image.png deleted file mode 100644 index 715b58207da..00000000000 Binary files a/test/browsertest/img/image.png and /dev/null differ diff --git a/test/browsertest/lib/index.js b/test/browsertest/lib/index.js deleted file mode 100644 index 8a6fd7f89b6..00000000000 --- a/test/browsertest/lib/index.js +++ /dev/null @@ -1,7 +0,0 @@ -require("./index.web.js"); - -describe("main", function() { - it("should load index.web.js instead of index.js", function() { - throw new Error("Fail"); - }); -}); diff --git a/test/browsertest/lib/index.web.js b/test/browsertest/lib/index.web.js deleted file mode 100644 index f8f83fe5a17..00000000000 --- a/test/browsertest/lib/index.web.js +++ /dev/null @@ -1,135 +0,0 @@ -function test(cond, message) { - if(!cond) throw new Error(message); -} - -// load tests from library1, with script loader -require("script-loader!../js/library1.js"); - -// Buildin 'style' loader adds css to document -require("./stylesheet.css"); -require("./stylesheet.less"); - -describe("main", function() { - it("should load library1 with script-loader", function() { - expect(window.library1).toEqual(expect.anything()); - expect(window.library1).toBe(true); - }); - - it("should load library2 exported as global", function() { - expect(window.library2common).toEqual(expect.anything()); - expect(window.library2common.ok2).toEqual(expect.anything()); - expect(window.library2common.ok2).toBe(true); - expect(window.library2).toEqual(expect.anything()); - expect(window.library2.ok).toEqual(expect.anything()); - expect(window.library2.ok).toBe(true); - }); - - describe("web resolving", function() { - it("should load index.web.js instead of index.js", function() { - expect(true).toBe(true); - }); - - it("should load correct replacements for files", function(done) { - require.ensure(["subcontent"], function(require) { - // Comments work! - exports.ok = true; - test(require("subcontent") === "replaced", "node_modules should be replaced with web_modules"); - test(require("subcontent2/file.js") === "original", "node_modules should still work when web_modules exists"); - done(); - }); - }); - - after(function() { - expect(exports.ok).toEqual(expect.anything()); - expect(exports.ok).toBe(true); - }); - }); - - describe("web runtime", function() { - it("should have support for require.main", function() { - var value = require.main === module; - var otherModuleValue = require("./testRequireMain"); - expect(value).toBe(true); - expect(otherModuleValue).toBe(false); - }); - }); - - describe("web polyfilling", function() { - var sum2; - - before(function() { - sum2 = 0; - }); - - it("should polyfill process and module", function(done) { - expect(typeof module.id).toBe("number"); - require.ensure([], function(require) { - test(Array.isArray(process.argv), "process.argv should be an array"); - process.nextTick(function() { - sum2++; - expect(sum2).toBe(2); - done(); - }); - sum2++; - test(global === window, "global === window"); - }); - }); - }); - - describe("web loaders", function() { - it("should handle the file loader correctly", function() { - expect(require("!file-loader!../img/image.png")).toMatch(/js\/.+\.png$/); - document.getElementById("image").src = require("file-loader?prefix=img/!../img/image.png"); - }); - }); - - describe("chunk error handling", function() { - it("should be able to handle chunk loading errors and try again", function(done) { - var old = __webpack_public_path__; - __webpack_public_path__ += "wrong/"; - import("./three").then(function() { - done(new Error("Chunk shouldn't be loaded")); - }).catch(function(err) { - expect(err).toBeInstanceOf(Error); - __webpack_public_path__ = old; - import("./three").then(function(three) { - expect(three).toBe(3); - done(); - }).catch(function(err) { - done(new Error("Shouldn't result in an chunk loading error")); - }); - }); - }); - }); - - var testCasesContext = require.context("../../cases", true, /^\.\/[^\/_]+\/[^\/_]+\/index$/); - var testCasesMap = testCasesContext.keys().map(function(key) { - return key.substring(2, key.length - "/index".length).split("/"); - }).reduce(function(map, x) { - if(!map[x[0]]) map[x[0]] = [x[1]]; - else map[x[0]].push(x[1]); - return map; - }, {}); - Object.keys(testCasesMap).forEach(function(category) { - describe(category, function() { - testCasesMap[category].forEach(function(name) { - describe(name, function() { - testCasesContext("./" + category + "/" + name + "/index"); - }); - }); - }); - }); - -}); - -if(module.hot) { - module.hot.accept(); - module.hot.dispose(function() { - mocha.suite.suites.length = 0; - var stats = document.getElementById("stats"); - stats.parentNode.removeChild(stats); - }); - if(module.data) { - mocha.run(); - } -} diff --git a/test/browsertest/lib/stylesheet.css b/test/browsertest/lib/stylesheet.css deleted file mode 100644 index a6bff86fc55..00000000000 --- a/test/browsertest/lib/stylesheet.css +++ /dev/null @@ -1,3 +0,0 @@ -.style-test.css-styles { - background: #3F3; -} \ No newline at end of file diff --git a/test/browsertest/lib/stylesheet.less b/test/browsertest/lib/stylesheet.less deleted file mode 100644 index 8a87f98533b..00000000000 --- a/test/browsertest/lib/stylesheet.less +++ /dev/null @@ -1,3 +0,0 @@ -.style-test.less-styles { - background: #3F3; -} \ No newline at end of file diff --git a/test/browsertest/lib/testRequireMain.js b/test/browsertest/lib/testRequireMain.js deleted file mode 100644 index 5a5f64b4bd4..00000000000 --- a/test/browsertest/lib/testRequireMain.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require.main === module; \ No newline at end of file diff --git a/test/browsertest/lib/three.js b/test/browsertest/lib/three.js deleted file mode 100644 index 678d19e15e0..00000000000 --- a/test/browsertest/lib/three.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = 3; \ No newline at end of file diff --git a/test/browsertest/lib/two.js b/test/browsertest/lib/two.js deleted file mode 100644 index d6fbb1723e4..00000000000 --- a/test/browsertest/lib/two.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = 2; \ No newline at end of file diff --git a/test/browsertest/library2config.coffee b/test/browsertest/library2config.coffee deleted file mode 100644 index 254425bb6c1..00000000000 --- a/test/browsertest/library2config.coffee +++ /dev/null @@ -1,40 +0,0 @@ -webpack = require("../../"); -exports.default = new Promise (resolve, reject) -> - resolveIt = -> - resolve - entry: - common: "library2/lib/common" - output: - hashDigestLength: 5 - module: - rules: [ - { test: /extra2?\.js/, loader: "raw-loader!./node_modules/extra.loader.js!val-loader?cacheable", enforce: "post" } - ] - amd: - fromOptions: true - plugins: [ - new webpack.optimize.LimitChunkCountPlugin - maxChunks: 3 - new webpack.DefinePlugin - "typeof CONST_TYPEOF": JSON.stringify("typeof"), - CONST_UNDEFINED: undefined, - CONST_NULL: "null", - CONST_TRUE: true, - CONST_FALSE: false, - CONST_FUNCTION: -> return "ok"; - CONST_NUMBER: 123, - CONST_NUMBER_EXPR: "(1*100+23)", - CONST_OBJECT: { - A: 1, - B: JSON.stringify("B"), - C: -> return "C"; - } - new webpack.ProvidePlugin - s3: "submodule3" - -> - this.plugin "normal-module-factory", (nmf) -> - nmf.plugin "after-resolve", (data, callback) -> - data.resource = data.resource.replace /extra\.js/, "extra2.js"; - callback null, data; - ] - setTimeout resolveIt, 300 diff --git a/test/browsertest/middlewareTest.js b/test/browsertest/middlewareTest.js deleted file mode 100644 index c08921a42a1..00000000000 --- a/test/browsertest/middlewareTest.js +++ /dev/null @@ -1,55 +0,0 @@ -var webpackMiddleware = require("webpack-dev-middleware"); -var webpack = require("webpack"); -var express = require("express"); -var path = require("path"); - -var app = express(); - -app.configure(function() { - app.use(webpackMiddleware(webpack({ - context: __dirname, - entry: ["../../hot/poll?10000", "./lib/index"], - debug: true, - devtool: "sourcemap", - module: { - loaders: [ - { test: /\.json$/, loader: "json" }, - { test: /\.coffee$/, loader: "coffee" }, - { test: /\.jade$/, loader: "jade" }, - { test: /\.css$/, loader: "style!css" }, - { test: /\.less$/, loader: "style!css!less" }, - ] - }, - resolve: { - alias: { - vm: "vm-browserify" - } - }, - resolve: { - unsafeCache: true - }, - cache: true, - recordsPath: path.join(__dirname, "webpack.records.json"), - output: { - publicPath: "http://localhost:8080/js/", - path: "/", - filename: "web.js", - chunkFilename: "[chunkhash].chunk.js" - }, - plugins: [ - new webpack.HotModuleReplacementPlugin() - ] - }), { - lazy: false, - watchDelay: 5000, - publicPath: "/js/", - filename: "web.js", - stats: { - colors: true - } - })); - app.use(express.static(path.join(__dirname))); - -}); - -app.listen(8080); diff --git a/test/browsertest/mocha.css b/test/browsertest/mocha.css deleted file mode 100644 index 0588391ceb7..00000000000 --- a/test/browsertest/mocha.css +++ /dev/null @@ -1,203 +0,0 @@ -@charset "UTF-8"; -body { - font: 20px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; - padding: 60px 50px; -} - -#mocha ul, #mocha li { - margin: 0; - padding: 0; -} - -#mocha ul { - list-style: none; -} - -#mocha h1, #mocha h2 { - margin: 0; -} - -#mocha h1 { - margin-top: 15px; - font-size: 1em; - font-weight: 200; -} - -#mocha h1 a { - text-decoration: none; - color: inherit; -} - -#mocha h1 a:hover { - text-decoration: underline; -} - -#mocha .suite .suite h1 { - margin-top: 0; - font-size: .8em; -} - -.hidden { - display: none; -} - -#mocha h2 { - font-size: 12px; - font-weight: normal; - cursor: pointer; -} - -#mocha .suite { - margin-left: 15px; -} - -#mocha .test { - margin-left: 15px; -} - -#mocha .test:hover h2::after { - position: relative; - top: 0; - right: -10px; - content: '(view source)'; - font-size: 12px; - font-family: arial; - color: #888; -} - -#mocha .test.pending:hover h2::after { - content: '(pending)'; - font-family: arial; -} - -#mocha .test.pass.medium .duration { - background: #C09853; -} - -#mocha .test.pass.slow .duration { - background: #B94A48; -} - -#mocha .test.pass::before { - content: '✓'; - font-size: 12px; - display: block; - float: left; - margin-right: 5px; - color: #00d6b2; -} - -#mocha .test.pass .duration { - font-size: 9px; - margin-left: 5px; - padding: 2px 5px; - color: white; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); - -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); - box-shadow: inset 0 1px 1px rgba(0,0,0,.2); - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - -ms-border-radius: 5px; - -o-border-radius: 5px; - border-radius: 5px; -} - -#mocha .test.pass.fast .duration { - display: none; -} - -#mocha .test.pending { - color: #0b97c4; -} - -#mocha .test.pending::before { - content: '◦'; - color: #0b97c4; -} - -#mocha .test.fail { - color: #c00; -} - -#mocha .test.fail pre { - color: black; -} - -#mocha .test.fail::before { - content: '✖'; - font-size: 12px; - display: block; - float: left; - margin-right: 5px; - color: #c00; -} - -#mocha .test pre.error { - color: #c00; -} - -#mocha .test pre { - display: inline-block; - font: 12px/1.5 monaco, monospace; - margin: 5px; - padding: 15px; - border: 1px solid #eee; - border-bottom-color: #ddd; - -webkit-border-radius: 3px; - -webkit-box-shadow: 0 1px 3px #eee; -} - -#report.pass .test.fail { - display: none; -} - -#report.fail .test.pass { - display: none; -} - -#error { - color: #c00; - font-size: 1.5 em; - font-weight: 100; - letter-spacing: 1px; -} - -#stats { - position: fixed; - top: 15px; - right: 10px; - font-size: 12px; - margin: 0; - color: #888; -} - -#stats .progress { - float: right; - padding-top: 0; -} - -#stats em { - color: black; -} - -#stats a { - text-decoration: none; - color: inherit; -} - -#stats a:hover { - border-bottom: 1px solid #eee; -} - -#stats li { - display: inline-block; - margin: 0 5px; - list-style: none; - padding-top: 11px; -} - -code .comment { color: #ddd } -code .init { color: #2F6FAD } -code .string { color: #5890AD } -code .keyword { color: #8A6343 } -code .number { color: #2F6FAD } diff --git a/test/browsertest/mocha.js b/test/browsertest/mocha.js deleted file mode 100644 index a0d14d349bb..00000000000 --- a/test/browsertest/mocha.js +++ /dev/null @@ -1,4906 +0,0 @@ -;(function(){ - - -// CommonJS require() - -function require(p){ - var path = require.resolve(p) - , mod = require.modules[path]; - if (!mod) throw new Error('failed to require "' + p + '"'); - if (!mod.exports) { - mod.exports = {}; - mod.call(mod.exports, mod, mod.exports, require.relative(path)); - } - return mod.exports; - } - -require.modules = {}; - -require.resolve = function (path){ - var orig = path - , reg = path + '.js' - , index = path + '/index.js'; - return require.modules[reg] && reg - || require.modules[index] && index - || orig; - }; - -require.register = function (path, fn){ - require.modules[path] = fn; - }; - -require.relative = function (parent) { - return function(p){ - if ('.' != p.charAt(0)) return require(p); - - var path = parent.split('/') - , segs = p.split('/'); - path.pop(); - - for (var i = 0; i < segs.length; i++) { - var seg = segs[i]; - if ('..' == seg) path.pop(); - else if ('.' != seg) path.push(seg); - } - - return require(path.join('/')); - }; - }; - - -require.register("browser/debug.js", function(module, exports, require){ - -module.exports = function(type){ - return function(){ - - } -}; -}); // module: browser/debug.js - -require.register("browser/diff.js", function(module, exports, require){ - -}); // module: browser/diff.js - -require.register("browser/events.js", function(module, exports, require){ - -/** - * Module exports. - */ - -exports.EventEmitter = EventEmitter; - -/** - * Check if `obj` is an array. - */ - -function isArray(obj) { - return '[object Array]' == {}.toString.call(obj); -} - -/** - * Event emitter constructor. - * - * @api public - */ - -function EventEmitter(){}; - -/** - * Adds a listener. - * - * @api public - */ - -EventEmitter.prototype.on = function (name, fn) { - if (!this.$events) { - this.$events = {}; - } - - if (!this.$events[name]) { - this.$events[name] = fn; - } else if (isArray(this.$events[name])) { - this.$events[name].push(fn); - } else { - this.$events[name] = [this.$events[name], fn]; - } - - return this; -}; - -EventEmitter.prototype.addListener = EventEmitter.prototype.on; - -/** - * Adds a volatile listener. - * - * @api public - */ - -EventEmitter.prototype.once = function (name, fn) { - var self = this; - - function on () { - self.removeListener(name, on); - fn.apply(this, arguments); - }; - - on.listener = fn; - this.on(name, on); - - return this; -}; - -/** - * Removes a listener. - * - * @api public - */ - -EventEmitter.prototype.removeListener = function (name, fn) { - if (this.$events && this.$events[name]) { - var list = this.$events[name]; - - if (isArray(list)) { - var pos = -1; - - for (var i = 0, l = list.length; i < l; i++) { - if (list[i] === fn || (list[i].listener && list[i].listener === fn)) { - pos = i; - break; - } - } - - if (pos < 0) { - return this; - } - - list.splice(pos, 1); - - if (!list.length) { - delete this.$events[name]; - } - } else if (list === fn || (list.listener && list.listener === fn)) { - delete this.$events[name]; - } - } - - return this; -}; - -/** - * Removes all listeners for an event. - * - * @api public - */ - -EventEmitter.prototype.removeAllListeners = function (name) { - if (name === undefined) { - this.$events = {}; - return this; - } - - if (this.$events && this.$events[name]) { - this.$events[name] = null; - } - - return this; -}; - -/** - * Gets all listeners for a certain event. - * - * @api public - */ - -EventEmitter.prototype.listeners = function (name) { - if (!this.$events) { - this.$events = {}; - } - - if (!this.$events[name]) { - this.$events[name] = []; - } - - if (!isArray(this.$events[name])) { - this.$events[name] = [this.$events[name]]; - } - - return this.$events[name]; -}; - -/** - * Emits an event. - * - * @api public - */ - -EventEmitter.prototype.emit = function (name) { - if (!this.$events) { - return false; - } - - var handler = this.$events[name]; - - if (!handler) { - return false; - } - - var args = [].slice.call(arguments, 1); - - if ('function' == typeof handler) { - handler.apply(this, args); - } else if (isArray(handler)) { - var listeners = handler.slice(); - - for (var i = 0, l = listeners.length; i < l; i++) { - listeners[i].apply(this, args); - } - } else { - return false; - } - - return true; -}; -}); // module: browser/events.js - -require.register("browser/fs.js", function(module, exports, require){ - -}); // module: browser/fs.js - -require.register("browser/path.js", function(module, exports, require){ - -}); // module: browser/path.js - -require.register("browser/progress.js", function(module, exports, require){ - -/** - * Expose `Progress`. - */ - -module.exports = Progress; - -/** - * Initialize a new `Progress` indicator. - */ - -function Progress() { - this.percent = 0; - this.size(0); - this.fontSize(11); - this.font('helvetica, arial, sans-serif'); -} - -/** - * Set progress size to `n`. - * - * @param {Number} n - * @return {Progress} for chaining - * @api public - */ - -Progress.prototype.size = function(n){ - this._size = n; - return this; -}; - -/** - * Set text to `str`. - * - * @param {String} str - * @return {Progress} for chaining - * @api public - */ - -Progress.prototype.text = function(str){ - this._text = str; - return this; -}; - -/** - * Set font size to `n`. - * - * @param {Number} n - * @return {Progress} for chaining - * @api public - */ - -Progress.prototype.fontSize = function(n){ - this._fontSize = n; - return this; -}; - -/** - * Set font `family`. - * - * @param {String} family - * @return {Progress} for chaining - */ - -Progress.prototype.font = function(family){ - this._font = family; - return this; -}; - -/** - * Update percentage to `n`. - * - * @param {Number} n - * @return {Progress} for chaining - */ - -Progress.prototype.update = function(n){ - this.percent = n; - return this; -}; - -/** - * Draw on `ctx`. - * - * @param {CanvasRenderingContext2d} ctx - * @return {Progress} for chaining - */ - -Progress.prototype.draw = function(ctx){ - var percent = Math.min(this.percent, 100) - , size = this._size - , half = size / 2 - , x = half - , y = half - , rad = half - 1 - , fontSize = this._fontSize; - - ctx.font = fontSize + 'px ' + this._font; - - var angle = Math.PI * 2 * (percent / 100); - ctx.clearRect(0, 0, size, size); - - // outer circle - ctx.strokeStyle = '#9f9f9f'; - ctx.beginPath(); - ctx.arc(x, y, rad, 0, angle, false); - ctx.stroke(); - - // inner circle - ctx.strokeStyle = '#eee'; - ctx.beginPath(); - ctx.arc(x, y, rad - 1, 0, angle, true); - ctx.stroke(); - - // text - var text = this._text || (percent | 0) + '%' - , w = ctx.measureText(text).width; - - ctx.fillText( - text - , x - w / 2 + 1 - , y + fontSize / 2 - 1); - - return this; -}; - -}); // module: browser/progress.js - -require.register("browser/tty.js", function(module, exports, require){ - -exports.isatty = function(){ - return true; -}; - -exports.getWindowSize = function(){ - return [window.innerHeight, window.innerWidth]; -}; -}); // module: browser/tty.js - -require.register("context.js", function(module, exports, require){ - -/** - * Expose `Context`. - */ - -module.exports = Context; - -/** - * Initialize a new `Context`. - * - * @api private - */ - -function Context(){} - -/** - * Set or get the context `Runnable` to `runnable`. - * - * @param {Runnable} runnable - * @return {Context} - * @api private - */ - -Context.prototype.runnable = function(runnable){ - if (0 == arguments.length) return this._runnable; - this.test = this._runnable = runnable; - return this; -}; - -/** - * Set test timeout `ms`. - * - * @param {Number} ms - * @return {Context} self - * @api private - */ - -Context.prototype.timeout = function(ms){ - this.runnable().timeout(ms); - return this; -}; - -/** - * Set test slowness threshold `ms`. - * - * @param {Number} ms - * @return {Context} self - * @api private - */ - -Context.prototype.slow = function(ms){ - this.runnable().slow(ms); - return this; -}; - -/** - * Inspect the context void of `._runnable`. - * - * @return {String} - * @api private - */ - -Context.prototype.inspect = function(){ - return JSON.stringify(this, function(key, val){ - if ('_runnable' == key) return; - if ('test' == key) return; - return val; - }, 2); -}; - -}); // module: context.js - -require.register("hook.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Runnable = require('./runnable'); - -/** - * Expose `Hook`. - */ - -module.exports = Hook; - -/** - * Initialize a new `Hook` with the given `title` and callback `fn`. - * - * @param {String} title - * @param {Function} fn - * @api private - */ - -function Hook(title, fn) { - Runnable.call(this, title, fn); - this.type = 'hook'; -} - -/** - * Inherit from `Runnable.prototype`. - */ - -Hook.prototype = new Runnable; -Hook.prototype.constructor = Hook; - - -/** - * Get or set the test `err`. - * - * @param {Error} err - * @return {Error} - * @api public - */ - -Hook.prototype.error = function(err){ - if (0 == arguments.length) { - var err = this._error; - this._error = null; - return err; - } - - this._error = err; -}; - - -}); // module: hook.js - -require.register("interfaces/bdd.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Suite = require('../suite') - , Test = require('../test'); - -/** - * BDD-style interface: - * - * describe('Array', function(){ - * describe('#indexOf()', function(){ - * it('should return -1 when not present', function(){ - * - * }); - * - * it('should return the index when present', function(){ - * - * }); - * }); - * }); - * - */ - -module.exports = function(suite){ - var suites = [suite]; - - suite.on('pre-require', function(context, file, mocha){ - - /** - * Execute before running tests. - */ - - context.before = function(fn){ - suites[0].beforeAll(fn); - }; - - /** - * Execute after running tests. - */ - - context.after = function(fn){ - suites[0].afterAll(fn); - }; - - /** - * Execute before each test case. - */ - - context.beforeEach = function(fn){ - suites[0].beforeEach(fn); - }; - - /** - * Execute after each test case. - */ - - context.afterEach = function(fn){ - suites[0].afterEach(fn); - }; - - /** - * Describe a "suite" with the given `title` - * and callback `fn` containing nested suites - * and/or tests. - */ - - context.describe = context.context = function(title, fn){ - var suite = Suite.create(suites[0], title); - suites.unshift(suite); - fn(); - suites.shift(); - return suite; - }; - - /** - * Pending describe. - */ - - context.xdescribe = - context.xcontext = - context.describe.skip = function(title, fn){ - var suite = Suite.create(suites[0], title); - suite.pending = true; - suites.unshift(suite); - fn(); - suites.shift(); - }; - - /** - * Exclusive suite. - */ - - context.describe.only = function(title, fn){ - var suite = context.describe(title, fn); - mocha.grep(suite.fullTitle()); - }; - - /** - * Describe a specification or test-case - * with the given `title` and callback `fn` - * acting as a thunk. - */ - - context.it = context.specify = function(title, fn){ - var suite = suites[0]; - if (suite.pending) var fn = null; - var test = new Test(title, fn); - suite.addTest(test); - return test; - }; - - /** - * Exclusive test-case. - */ - - context.it.only = function(title, fn){ - var test = context.it(title, fn); - mocha.grep(test.fullTitle()); - }; - - /** - * Pending test case. - */ - - context.xit = - context.xspecify = - context.it.skip = function(title){ - context.it(title); - }; - }); -}; - -}); // module: interfaces/bdd.js - -require.register("interfaces/exports.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Suite = require('../suite') - , Test = require('../test'); - -/** - * TDD-style interface: - * - * exports.Array = { - * '#indexOf()': { - * 'should return -1 when the value is not present': function(){ - * - * }, - * - * 'should return the correct index when the value is present': function(){ - * - * } - * } - * }; - * - */ - -module.exports = function(suite){ - var suites = [suite]; - - suite.on('require', visit); - - function visit(obj) { - var suite; - for (var key in obj) { - if ('function' == typeof obj[key]) { - var fn = obj[key]; - switch (key) { - case 'before': - suites[0].beforeAll(fn); - break; - case 'after': - suites[0].afterAll(fn); - break; - case 'beforeEach': - suites[0].beforeEach(fn); - break; - case 'afterEach': - suites[0].afterEach(fn); - break; - default: - suites[0].addTest(new Test(key, fn)); - } - } else { - var suite = Suite.create(suites[0], key); - suites.unshift(suite); - visit(obj[key]); - suites.shift(); - } - } - } -}; -}); // module: interfaces/exports.js - -require.register("interfaces/index.js", function(module, exports, require){ - -exports.bdd = require('./bdd'); -exports.tdd = require('./tdd'); -exports.qunit = require('./qunit'); -exports.exports = require('./exports'); - -}); // module: interfaces/index.js - -require.register("interfaces/qunit.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Suite = require('../suite') - , Test = require('../test'); - -/** - * QUnit-style interface: - * - * suite('Array'); - * - * test('#length', function(){ - * var arr = [1,2,3]; - * ok(arr.length == 3); - * }); - * - * test('#indexOf()', function(){ - * var arr = [1,2,3]; - * ok(arr.indexOf(1) == 0); - * ok(arr.indexOf(2) == 1); - * ok(arr.indexOf(3) == 2); - * }); - * - * suite('String'); - * - * test('#length', function(){ - * ok('foo'.length == 3); - * }); - * - */ - -module.exports = function(suite){ - var suites = [suite]; - - suite.on('pre-require', function(context){ - - /** - * Execute before running tests. - */ - - context.before = function(fn){ - suites[0].beforeAll(fn); - }; - - /** - * Execute after running tests. - */ - - context.after = function(fn){ - suites[0].afterAll(fn); - }; - - /** - * Execute before each test case. - */ - - context.beforeEach = function(fn){ - suites[0].beforeEach(fn); - }; - - /** - * Execute after each test case. - */ - - context.afterEach = function(fn){ - suites[0].afterEach(fn); - }; - - /** - * Describe a "suite" with the given `title`. - */ - - context.suite = function(title){ - if (suites.length > 1) suites.shift(); - var suite = Suite.create(suites[0], title); - suites.unshift(suite); - }; - - /** - * Describe a specification or test-case - * with the given `title` and callback `fn` - * acting as a thunk. - */ - - context.test = function(title, fn){ - suites[0].addTest(new Test(title, fn)); - }; - }); -}; - -}); // module: interfaces/qunit.js - -require.register("interfaces/tdd.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Suite = require('../suite') - , Test = require('../test'); - -/** - * TDD-style interface: - * - * suite('Array', function(){ - * suite('#indexOf()', function(){ - * suiteSetup(function(){ - * - * }); - * - * test('should return -1 when not present', function(){ - * - * }); - * - * test('should return the index when present', function(){ - * - * }); - * - * suiteTeardown(function(){ - * - * }); - * }); - * }); - * - */ - -module.exports = function(suite){ - var suites = [suite]; - - suite.on('pre-require', function(context, file, mocha){ - - /** - * Execute before each test case. - */ - - context.setup = function(fn){ - suites[0].beforeEach(fn); - }; - - /** - * Execute after each test case. - */ - - context.teardown = function(fn){ - suites[0].afterEach(fn); - }; - - /** - * Execute before the suite. - */ - - context.suiteSetup = function(fn){ - suites[0].beforeAll(fn); - }; - - /** - * Execute after the suite. - */ - - context.suiteTeardown = function(fn){ - suites[0].afterAll(fn); - }; - - /** - * Describe a "suite" with the given `title` - * and callback `fn` containing nested suites - * and/or tests. - */ - - context.suite = function(title, fn){ - var suite = Suite.create(suites[0], title); - suites.unshift(suite); - fn(); - suites.shift(); - return suite; - }; - - /** - * Exclusive test-case. - */ - - context.suite.only = function(title, fn){ - var suite = context.suite(title, fn); - mocha.grep(suite.fullTitle()); - }; - - /** - * Describe a specification or test-case - * with the given `title` and callback `fn` - * acting as a thunk. - */ - - context.test = function(title, fn){ - var test = new Test(title, fn); - suites[0].addTest(test); - return test; - }; - - /** - * Exclusive test-case. - */ - - context.test.only = function(title, fn){ - var test = context.test(title, fn); - mocha.grep(test.fullTitle()); - }; - }); -}; - -}); // module: interfaces/tdd.js - -require.register("mocha.js", function(module, exports, require){ -/*! - * mocha - * Copyright(c) 2011 TJ Holowaychuk - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var path = require('browser/path') - , utils = require('./utils'); - -/** - * Expose `Mocha`. - */ - -exports = module.exports = Mocha; - -/** - * Expose internals. - */ - -exports.utils = utils; -exports.interfaces = require('./interfaces'); -exports.reporters = require('./reporters'); -exports.Runnable = require('./runnable'); -exports.Context = require('./context'); -exports.Runner = require('./runner'); -exports.Suite = require('./suite'); -exports.Hook = require('./hook'); -exports.Test = require('./test'); - -/** - * Return image `name` path. - * - * @param {String} name - * @return {String} - * @api private - */ - -function image(name) { - return __dirname + '/../images/' + name + '.png'; -} - -/** - * Setup mocha with `options`. - * - * Options: - * - * - `ui` name "bdd", "tdd", "exports" etc - * - `reporter` reporter instance, defaults to `mocha.reporters.Dot` - * - `globals` array of accepted globals - * - `timeout` timeout in milliseconds - * - `slow` milliseconds to wait before considering a test slow - * - `ignoreLeaks` ignore global leaks - * - `grep` string or regexp to filter tests with - * - * @param {Object} options - * @api public - */ - -function Mocha(options) { - options = options || {}; - this.files = []; - this.options = options; - this.grep(options.grep); - this.suite = new exports.Suite('', new exports.Context); - this.ui(options.ui); - this.reporter(options.reporter); - if (options.timeout) this.timeout(options.timeout); - if (options.slow) this.slow(options.slow); -} - -/** - * Add test `file`. - * - * @param {String} file - * @api public - */ - -Mocha.prototype.addFile = function(file){ - this.files.push(file); - return this; -}; - -/** - * Set reporter to `reporter`, defaults to "dot". - * - * @param {String|Function} reporter name of a reporter or a reporter constructor - * @api public - */ - -Mocha.prototype.reporter = function(reporter){ - if ('function' == typeof reporter) { - this._reporter = reporter; - } else { - reporter = reporter || 'dot'; - try { - this._reporter = require('./reporters/' + reporter); - } catch (err) { - this._reporter = require(reporter); - } - if (!this._reporter) throw new Error('invalid reporter "' + reporter + '"'); - } - return this; -}; - -/** - * Set test UI `name`, defaults to "bdd". - * - * @param {String} bdd - * @api public - */ - -Mocha.prototype.ui = function(name){ - name = name || 'bdd'; - this._ui = exports.interfaces[name]; - if (!this._ui) throw new Error('invalid interface "' + name + '"'); - this._ui = this._ui(this.suite); - return this; -}; - -/** - * Load registered files. - * - * @api private - */ - -Mocha.prototype.loadFiles = function(fn){ - var self = this; - var suite = this.suite; - var pending = this.files.length; - this.files.forEach(function(file){ - file = path.resolve(file); - suite.emit('pre-require', global, file, self); - suite.emit('require', require(file), file, self); - suite.emit('post-require', global, file, self); - --pending || (fn && fn()); - }); -}; - -/** - * Enable growl support. - * - * @api private - */ - -Mocha.prototype._growl = function(runner, reporter) { - var notify = require('growl'); - - runner.on('end', function(){ - var stats = reporter.stats; - if (stats.failures) { - var msg = stats.failures + ' of ' + runner.total + ' tests failed'; - notify(msg, { name: 'mocha', title: 'Failed', image: image('error') }); - } else { - notify(stats.passes + ' tests passed in ' + stats.duration + 'ms', { - name: 'mocha' - , title: 'Passed' - , image: image('ok') - }); - } - }); -}; - -/** - * Add regexp to grep, if `re` is a string it is escaped. - * - * @param {RegExp|String} re - * @return {Mocha} - * @api public - */ - -Mocha.prototype.grep = function(re){ - this.options.grep = 'string' == typeof re - ? new RegExp(utils.escapeRegexp(re)) - : re; - return this; -}; - -/** - * Invert `.grep()` matches. - * - * @return {Mocha} - * @api public - */ - -Mocha.prototype.invert = function(){ - this.options.invert = true; - return this; -}; - -/** - * Ignore global leaks. - * - * @return {Mocha} - * @api public - */ - -Mocha.prototype.ignoreLeaks = function(){ - this.options.ignoreLeaks = true; - return this; -}; - -/** - * Enable global leak checking. - * - * @return {Mocha} - * @api public - */ - -Mocha.prototype.checkLeaks = function(){ - this.options.ignoreLeaks = false; - return this; -}; - -/** - * Enable growl support. - * - * @return {Mocha} - * @api public - */ - -Mocha.prototype.growl = function(){ - this.options.growl = true; - return this; -}; - -/** - * Ignore `globals` array or string. - * - * @param {Array|String} globals - * @return {Mocha} - * @api public - */ - -Mocha.prototype.globals = function(globals){ - this.options.globals = (this.options.globals || []).concat(globals); - return this; -}; - -/** - * Set the timeout in milliseconds. - * - * @param {Number} timeout - * @return {Mocha} - * @api public - */ - -Mocha.prototype.timeout = function(timeout){ - this.suite.timeout(timeout); - return this; -}; - -/** - * Set slowness threshold in milliseconds. - * - * @param {Number} slow - * @return {Mocha} - * @api public - */ - -Mocha.prototype.slow = function(slow){ - this.suite.slow(slow); - return this; -}; - -/** - * Run tests and invoke `fn()` when complete. - * - * @param {Function} fn - * @return {Runner} - * @api public - */ - -Mocha.prototype.run = function(fn){ - if (this.files.length) this.loadFiles(); - var suite = this.suite; - var options = this.options; - var runner = new exports.Runner(suite); - var reporter = new this._reporter(runner); - runner.ignoreLeaks = options.ignoreLeaks; - if (options.grep) runner.grep(options.grep, options.invert); - if (options.globals) runner.globals(options.globals); - if (options.growl) this._growl(runner, reporter); - return runner.run(fn); -}; - -}); // module: mocha.js - -require.register("ms.js", function(module, exports, require){ - -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; - -/** - * Parse or format the given `val`. - * - * @param {String|Number} val - * @return {String|Number} - * @api public - */ - -module.exports = function(val){ - if ('string' == typeof val) return parse(val); - return format(val); -} - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - var m = /^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i.exec(str); - if (!m) return; - var n = parseFloat(m[1]); - var type = (m[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'y': - return n * 31557600000; - case 'days': - case 'day': - case 'd': - return n * 86400000; - case 'hours': - case 'hour': - case 'h': - return n * 3600000; - case 'minutes': - case 'minute': - case 'm': - return n * 60000; - case 'seconds': - case 'second': - case 's': - return n * 1000; - case 'ms': - return n; - } -} - -/** - * Format the given `ms`. - * - * @param {Number} ms - * @return {String} - * @api public - */ - -function format(ms) { - if (ms == d) return (ms / d) + ' day'; - if (ms > d) return (ms / d) + ' days'; - if (ms == h) return (ms / h) + ' hour'; - if (ms > h) return (ms / h) + ' hours'; - if (ms == m) return (ms / m) + ' minute'; - if (ms > m) return (ms / m) + ' minutes'; - if (ms == s) return (ms / s) + ' second'; - if (ms > s) return (ms / s) + ' seconds'; - return ms + ' ms'; -} -}); // module: ms.js - -require.register("reporters/base.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var tty = require('browser/tty') - , diff = require('browser/diff') - , ms = require('../ms'); - -/** - * Save timer references to avoid Sinon interfering (see GH-237). - */ - -var Date = global.Date - , setTimeout = global.setTimeout - , setInterval = global.setInterval - , clearTimeout = global.clearTimeout - , clearInterval = global.clearInterval; - -/** - * Check if both stdio streams are associated with a tty. - */ - -var isatty = tty.isatty(1) && tty.isatty(2); - -/** - * Expose `Base`. - */ - -exports = module.exports = Base; - -/** - * Enable coloring by default. - */ - -exports.useColors = isatty; - -/** - * Default color map. - */ - -exports.colors = { - 'pass': 90 - , 'fail': 31 - , 'bright pass': 92 - , 'bright fail': 91 - , 'bright yellow': 93 - , 'pending': 36 - , 'suite': 0 - , 'error title': 0 - , 'error message': 31 - , 'error stack': 90 - , 'checkmark': 32 - , 'fast': 90 - , 'medium': 33 - , 'slow': 31 - , 'green': 32 - , 'light': 90 - , 'diff gutter': 90 - , 'diff added': 42 - , 'diff removed': 41 -}; - -/** - * Color `str` with the given `type`, - * allowing colors to be disabled, - * as well as user-defined color - * schemes. - * - * @param {String} type - * @param {String} str - * @return {String} - * @api private - */ - -var color = exports.color = function(type, str) { - if (!exports.useColors) return str; - return '\u001b[' + exports.colors[type] + 'm' + str + '\u001b[0m'; -}; - -/** - * Expose term window size, with some - * defaults for when stderr is not a tty. - */ - -exports.window = { - width: isatty - ? process.stdout.getWindowSize - ? process.stdout.getWindowSize(1)[0] - : tty.getWindowSize()[1] - : 75 -}; - -/** - * Expose some basic cursor interactions - * that are common among reporters. - */ - -exports.cursor = { - hide: function(){ - process.stdout.write('\u001b[?25l'); - }, - - show: function(){ - process.stdout.write('\u001b[?25h'); - }, - - deleteLine: function(){ - process.stdout.write('\u001b[2K'); - }, - - beginningOfLine: function(){ - process.stdout.write('\u001b[0G'); - }, - - CR: function(){ - exports.cursor.deleteLine(); - exports.cursor.beginningOfLine(); - } -}; - -/** - * Output the given `failures` as a list. - * - * @param {Array} failures - * @api public - */ - -exports.list = function(failures){ - console.error(); - failures.forEach(function(test, i){ - // format - var fmt = color('error title', ' %s) %s:\n') - + color('error message', ' %s') - + color('error stack', '\n%s\n'); - - // msg - var err = test.err - , message = err.message || '' - , stack = err.stack || message - , index = stack.indexOf(message) + message.length - , msg = stack.slice(0, index) - , actual = err.actual - , expected = err.expected - , escape = true; - - // explicitly show diff - if (err.showDiff) { - escape = false; - err.actual = actual = JSON.stringify(actual, null, 2); - err.expected = expected = JSON.stringify(expected, null, 2); - } - - // actual / expected diff - if ('string' == typeof actual && 'string' == typeof expected) { - var len = Math.max(actual.length, expected.length); - - if (len < 20) msg = errorDiff(err, 'Chars', escape); - else msg = errorDiff(err, 'Words', escape); - - // linenos - var lines = msg.split('\n'); - if (lines.length > 4) { - var width = String(lines.length).length; - msg = lines.map(function(str, i){ - return pad(++i, width) + ' |' + ' ' + str; - }).join('\n'); - } - - // legend - msg = '\n' - + color('diff removed', 'actual') - + ' ' - + color('diff added', 'expected') - + '\n\n' - + msg - + '\n'; - - // indent - msg = msg.replace(/^/gm, ' '); - - fmt = color('error title', ' %s) %s:\n%s') - + color('error stack', '\n%s\n'); - } - - // indent stack trace without msg - stack = stack.slice(index ? index + 1 : index) - .replace(/^/gm, ' '); - - console.error(fmt, (i + 1), test.fullTitle(), msg, stack); - }); -}; - -/** - * Initialize a new `Base` reporter. - * - * All other reporters generally - * inherit from this reporter, providing - * stats such as test duration, number - * of tests passed / failed etc. - * - * @param {Runner} runner - * @api public - */ - -function Base(runner) { - var self = this - , stats = this.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 } - , failures = this.failures = []; - - if (!runner) return; - this.runner = runner; - - runner.on('start', function(){ - stats.start = new Date; - }); - - runner.on('suite', function(suite){ - stats.suites = stats.suites || 0; - suite.root || stats.suites++; - }); - - runner.on('test end', function(test){ - stats.tests = stats.tests || 0; - stats.tests++; - }); - - runner.on('pass', function(test){ - stats.passes = stats.passes || 0; - - var medium = test.slow() / 2; - test.speed = test.duration > test.slow() - ? 'slow' - : test.duration > medium - ? 'medium' - : 'fast'; - - stats.passes++; - }); - - runner.on('fail', function(test, err){ - stats.failures = stats.failures || 0; - stats.failures++; - test.err = err; - failures.push(test); - }); - - runner.on('end', function(){ - stats.end = new Date; - stats.duration = new Date - stats.start; - }); - - runner.on('pending', function(){ - stats.pending++; - }); -} - -/** - * Output common epilogue used by many of - * the bundled reporters. - * - * @api public - */ - -Base.prototype.epilogue = function(){ - var stats = this.stats - , fmt - , tests; - - console.log(); - - function pluralize(n) { - return 1 == n ? 'test' : 'tests'; - } - - // failure - if (stats.failures) { - fmt = color('bright fail', ' ✖') - + color('fail', ' %d of %d %s failed') - + color('light', ':') - - console.error(fmt, - stats.failures, - this.runner.total, - pluralize(this.runner.total)); - - Base.list(this.failures); - console.error(); - return; - } - - // pass - fmt = color('bright pass', ' ✔') - + color('green', ' %d %s complete') - + color('light', ' (%s)'); - - console.log(fmt, - stats.tests || 0, - pluralize(stats.tests), - ms(stats.duration)); - - // pending - if (stats.pending) { - fmt = color('pending', ' •') - + color('pending', ' %d %s pending'); - - console.log(fmt, stats.pending, pluralize(stats.pending)); - } - - console.log(); -}; - -/** - * Pad the given `str` to `len`. - * - * @param {String} str - * @param {String} len - * @return {String} - * @api private - */ - -function pad(str, len) { - str = String(str); - return Array(len - str.length + 1).join(' ') + str; -} - -/** - * Return a character diff for `err`. - * - * @param {Error} err - * @return {String} - * @api private - */ - -function errorDiff(err, type, escape) { - return diff['diff' + type](err.actual, err.expected).map(function(str){ - if (escape) { - str.value = str.value - .replace(/\t/g, '') - .replace(/\r/g, '') - .replace(/\n/g, '\n'); - } - if (str.added) return colorLines('diff added', str.value); - if (str.removed) return colorLines('diff removed', str.value); - return str.value; - }).join(''); -} - -/** - * Color lines for `str`, using the color `name`. - * - * @param {String} name - * @param {String} str - * @return {String} - * @api private - */ - -function colorLines(name, str) { - return str.split('\n').map(function(str){ - return color(name, str); - }).join('\n'); -} - -}); // module: reporters/base.js - -require.register("reporters/doc.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , utils = require('../utils'); - -/** - * Expose `Doc`. - */ - -exports = module.exports = Doc; - -/** - * Initialize a new `Doc` reporter. - * - * @param {Runner} runner - * @api public - */ - -function Doc(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , total = runner.total - , indents = 2; - - function indent() { - return Array(indents).join(' '); - } - - runner.on('suite', function(suite){ - if (suite.root) return; - ++indents; - console.log('%s

', indent()); - ++indents; - console.log('%s

%s

', indent(), suite.title); - console.log('%s
', indent()); - }); - - runner.on('suite end', function(suite){ - if (suite.root) return; - console.log('%s
', indent()); - --indents; - console.log('%s
', indent()); - --indents; - }); - - runner.on('pass', function(test){ - console.log('%s
%s
', indent(), test.title); - var code = utils.escape(utils.clean(test.fn.toString())); - console.log('%s
%s
', indent(), code); - }); -} - -}); // module: reporters/doc.js - -require.register("reporters/dot.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , color = Base.color; - -/** - * Expose `Dot`. - */ - -exports = module.exports = Dot; - -/** - * Initialize a new `Dot` matrix test reporter. - * - * @param {Runner} runner - * @api public - */ - -function Dot(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , width = Base.window.width * .75 | 0 - , c = '․' - , n = 0; - - runner.on('start', function(){ - process.stdout.write('\n '); - }); - - runner.on('pending', function(test){ - process.stdout.write(color('pending', c)); - }); - - runner.on('pass', function(test){ - if (++n % width == 0) process.stdout.write('\n '); - if ('slow' == test.speed) { - process.stdout.write(color('bright yellow', c)); - } else { - process.stdout.write(color(test.speed, c)); - } - }); - - runner.on('fail', function(test, err){ - if (++n % width == 0) process.stdout.write('\n '); - process.stdout.write(color('fail', c)); - }); - - runner.on('end', function(){ - console.log(); - self.epilogue(); - }); -} - -/** - * Inherit from `Base.prototype`. - */ - -Dot.prototype = new Base; -Dot.prototype.constructor = Dot; - -}); // module: reporters/dot.js - -require.register("reporters/html-cov.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var JSONCov = require('./json-cov') - , fs = require('browser/fs'); - -/** - * Expose `HTMLCov`. - */ - -exports = module.exports = HTMLCov; - -/** - * Initialize a new `JsCoverage` reporter. - * - * @param {Runner} runner - * @api public - */ - -function HTMLCov(runner) { - var jade = require('jade') - , file = __dirname + '/templates/coverage.jade' - , str = fs.readFileSync(file, 'utf8') - , fn = jade.compile(str, { filename: file }) - , self = this; - - JSONCov.call(this, runner, false); - - runner.on('end', function(){ - process.stdout.write(fn({ - cov: self.cov - , coverageClass: coverageClass - })); - }); -} - -/** - * Return coverage class for `n`. - * - * @return {String} - * @api private - */ - -function coverageClass(n) { - if (n >= 75) return 'high'; - if (n >= 50) return 'medium'; - if (n >= 25) return 'low'; - return 'terrible'; -} -}); // module: reporters/html-cov.js - -require.register("reporters/html.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , utils = require('../utils') - , Progress = require('../browser/progress') - , escape = utils.escape; - -/** - * Save timer references to avoid Sinon interfering (see GH-237). - */ - -var Date = global.Date - , setTimeout = global.setTimeout - , setInterval = global.setInterval - , clearTimeout = global.clearTimeout - , clearInterval = global.clearInterval; - -/** - * Expose `Doc`. - */ - -exports = module.exports = HTML; - -/** - * Stats template. - */ - -var statsTemplate = '
'; - -/** - * Initialize a new `Doc` reporter. - * - * @param {Runner} runner - * @api public - */ - -function HTML(runner, root) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , total = runner.total - , stat = fragment(statsTemplate) - , items = stat.getElementsByTagName('li') - , passes = items[1].getElementsByTagName('em')[0] - , passesLink = items[1].getElementsByTagName('a')[0] - , failures = items[2].getElementsByTagName('em')[0] - , failuresLink = items[2].getElementsByTagName('a')[0] - , duration = items[3].getElementsByTagName('em')[0] - , canvas = stat.getElementsByTagName('canvas')[0] - , report = fragment('
    ') - , stack = [report] - , progress - , ctx - - root = root || document.getElementById('mocha'); - - if (canvas.getContext) { - var ratio = window.devicePixelRatio || 1; - canvas.style.width = canvas.width; - canvas.style.height = canvas.height; - canvas.width *= ratio; - canvas.height *= ratio; - ctx = canvas.getContext('2d'); - ctx.scale(ratio, ratio); - progress = new Progress; - } - - if (!root) return error('#mocha div missing, add it to your document'); - - // pass toggle - on(passesLink, 'click', function(){ - unhide(); - var name = /pass/.test(report.className) ? '' : ' pass'; - report.className = report.className.replace(/fail|pass/g, '') + name; - if (report.className.trim()) hideSuitesWithout('test pass'); - }); - - // failure toggle - on(failuresLink, 'click', function(){ - unhide(); - var name = /fail/.test(report.className) ? '' : ' fail'; - report.className = report.className.replace(/fail|pass/g, '') + name; - if (report.className.trim()) hideSuitesWithout('test fail'); - }); - - root.appendChild(stat); - root.appendChild(report); - - if (progress) progress.size(40); - - runner.on('suite', function(suite){ - if (suite.root) return; - - // suite - var url = '?grep=' + encodeURIComponent(suite.fullTitle()); - var el = fragment('
  • %s

  • ', url, escape(suite.title)); - - // container - stack[0].appendChild(el); - stack.unshift(document.createElement('ul')); - el.appendChild(stack[0]); - }); - - runner.on('suite end', function(suite){ - if (suite.root) return; - stack.shift(); - }); - - runner.on('fail', function(test, err){ - if ('hook' == test.type || err.uncaught) runner.emit('test end', test); - }); - - runner.on('test end', function(test){ - window.scrollTo(0, document.body.scrollHeight); - - // TODO: add to stats - var percent = stats.tests / total * 100 | 0; - if (progress) progress.update(percent).draw(ctx); - - // update stats - var ms = new Date - stats.start; - text(passes, stats.passes); - text(failures, stats.failures); - text(duration, (ms / 1000).toFixed(2)); - - // test - if ('passed' == test.state) { - var el = fragment('
  • %e%ems

  • ', test.speed, test.title, test.duration); - } else if (test.pending) { - var el = fragment('
  • %e

  • ', test.title); - } else { - var el = fragment('
  • %e

  • ', test.title); - var str = test.err.stack || test.err.toString(); - - // FF / Opera do not add the message - if (!~str.indexOf(test.err.message)) { - str = test.err.message + '\n' + str; - } - - // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we - // check for the result of the stringifying. - if ('[object Error]' == str) str = test.err.message; - - // Safari doesn't give you a stack. Let's at least provide a source line. - if (!test.err.stack && test.err.sourceURL && test.err.line !== undefined) { - str += "\n(" + test.err.sourceURL + ":" + test.err.line + ")"; - } - - el.appendChild(fragment('
    %e
    ', str)); - } - - // toggle code - // TODO: defer - if (!test.pending) { - var h2 = el.getElementsByTagName('h2')[0]; - - on(h2, 'click', function(){ - pre.style.display = 'none' == pre.style.display - ? 'inline-block' - : 'none'; - }); - - var pre = fragment('
    %e
    ', utils.clean(test.fn.toString())); - el.appendChild(pre); - pre.style.display = 'none'; - } - - stack[0].appendChild(el); - }); -} - -/** - * Display error `msg`. - */ - -function error(msg) { - document.body.appendChild(fragment('
    %s
    ', msg)); -} - -/** - * Return a DOM fragment from `html`. - */ - -function fragment(html) { - var args = arguments - , div = document.createElement('div') - , i = 1; - - div.innerHTML = html.replace(/%([se])/g, function(_, type){ - switch (type) { - case 's': return String(args[i++]); - case 'e': return escape(args[i++]); - } - }); - - return div.firstChild; -} - -/** - * Check for suites that do not have elements - * with `classname`, and hide them. - */ - -function hideSuitesWithout(classname) { - var suites = document.getElementsByClassName('suite'); - for (var i = 0; i < suites.length; i++) { - var els = suites[i].getElementsByClassName(classname); - if (0 == els.length) suites[i].className += ' hidden'; - } -} - -/** - * Unhide .hidden suites. - */ - -function unhide() { - var els = document.getElementsByClassName('suite hidden'); - for (var i = 0; i < els.length; ++i) { - els[i].className = els[i].className.replace('suite hidden', 'suite'); - } -} - -/** - * Set `el` text to `str`. - */ - -function text(el, str) { - if (el.textContent) { - el.textContent = str; - } else { - el.innerText = str; - } -} - -/** - * Listen on `event` with callback `fn`. - */ - -function on(el, event, fn) { - if (el.addEventListener) { - el.addEventListener(event, fn, false); - } else { - el.attachEvent('on' + event, fn); - } -} - -}); // module: reporters/html.js - -require.register("reporters/index.js", function(module, exports, require){ - -exports.Base = require('./base'); -exports.Dot = require('./dot'); -exports.Doc = require('./doc'); -exports.TAP = require('./tap'); -exports.JSON = require('./json'); -exports.HTML = require('./html'); -exports.List = require('./list'); -exports.Min = require('./min'); -exports.Spec = require('./spec'); -exports.Nyan = require('./nyan'); -exports.XUnit = require('./xunit'); -exports.Markdown = require('./markdown'); -exports.Progress = require('./progress'); -exports.Landing = require('./landing'); -exports.JSONCov = require('./json-cov'); -exports.HTMLCov = require('./html-cov'); -exports.JSONStream = require('./json-stream'); -exports.Teamcity = require('./teamcity'); - -}); // module: reporters/index.js - -require.register("reporters/json-cov.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base'); - -/** - * Expose `JSONCov`. - */ - -exports = module.exports = JSONCov; - -/** - * Initialize a new `JsCoverage` reporter. - * - * @param {Runner} runner - * @param {Boolean} output - * @api public - */ - -function JSONCov(runner, output) { - var self = this - , output = 1 == arguments.length ? true : output; - - Base.call(this, runner); - - var tests = [] - , failures = [] - , passes = []; - - runner.on('test end', function(test){ - tests.push(test); - }); - - runner.on('pass', function(test){ - passes.push(test); - }); - - runner.on('fail', function(test){ - failures.push(test); - }); - - runner.on('end', function(){ - var cov = global._$jscoverage || {}; - var result = self.cov = map(cov); - result.stats = self.stats; - result.tests = tests.map(clean); - result.failures = failures.map(clean); - result.passes = passes.map(clean); - if (!output) return; - process.stdout.write(JSON.stringify(result, null, 2 )); - }); -} - -/** - * Map jscoverage data to a JSON structure - * suitable for reporting. - * - * @param {Object} cov - * @return {Object} - * @api private - */ - -function map(cov) { - var ret = { - instrumentation: 'node-jscoverage' - , sloc: 0 - , hits: 0 - , misses: 0 - , coverage: 0 - , files: [] - }; - - for (var filename in cov) { - var data = coverage(filename, cov[filename]); - ret.files.push(data); - ret.hits += data.hits; - ret.misses += data.misses; - ret.sloc += data.sloc; - } - - if (ret.sloc > 0) { - ret.coverage = (ret.hits / ret.sloc) * 100; - } - - return ret; -}; - -/** - * Map jscoverage data for a single source file - * to a JSON structure suitable for reporting. - * - * @param {String} filename name of the source file - * @param {Object} data jscoverage coverage data - * @return {Object} - * @api private - */ - -function coverage(filename, data) { - var ret = { - filename: filename, - coverage: 0, - hits: 0, - misses: 0, - sloc: 0, - source: {} - }; - - data.source.forEach(function(line, num){ - num++; - - if (data[num] === 0) { - ret.misses++; - ret.sloc++; - } else if (data[num] !== undefined) { - ret.hits++; - ret.sloc++; - } - - ret.source[num] = { - source: line - , coverage: data[num] === undefined - ? '' - : data[num] - }; - }); - - ret.coverage = ret.hits / ret.sloc * 100; - - return ret; -} - -/** - * Return a plain-object representation of `test` - * free of cyclic properties etc. - * - * @param {Object} test - * @return {Object} - * @api private - */ - -function clean(test) { - return { - title: test.title - , fullTitle: test.fullTitle() - , duration: test.duration - } -} - -}); // module: reporters/json-cov.js - -require.register("reporters/json-stream.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , color = Base.color; - -/** - * Expose `List`. - */ - -exports = module.exports = List; - -/** - * Initialize a new `List` test reporter. - * - * @param {Runner} runner - * @api public - */ - -function List(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , total = runner.total; - - runner.on('start', function(){ - console.log(JSON.stringify(['start', { total: total }])); - }); - - runner.on('pass', function(test){ - console.log(JSON.stringify(['pass', clean(test)])); - }); - - runner.on('fail', function(test, err){ - console.log(JSON.stringify(['fail', clean(test)])); - }); - - runner.on('end', function(){ - process.stdout.write(JSON.stringify(['end', self.stats])); - }); -} - -/** - * Return a plain-object representation of `test` - * free of cyclic properties etc. - * - * @param {Object} test - * @return {Object} - * @api private - */ - -function clean(test) { - return { - title: test.title - , fullTitle: test.fullTitle() - , duration: test.duration - } -} -}); // module: reporters/json-stream.js - -require.register("reporters/json.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; - -/** - * Expose `JSON`. - */ - -exports = module.exports = JSONReporter; - -/** - * Initialize a new `JSON` reporter. - * - * @param {Runner} runner - * @api public - */ - -function JSONReporter(runner) { - var self = this; - Base.call(this, runner); - - var tests = [] - , failures = [] - , passes = []; - - runner.on('test end', function(test){ - tests.push(test); - }); - - runner.on('pass', function(test){ - passes.push(test); - }); - - runner.on('fail', function(test){ - failures.push(test); - }); - - runner.on('end', function(){ - var obj = { - stats: self.stats - , tests: tests.map(clean) - , failures: failures.map(clean) - , passes: passes.map(clean) - }; - - process.stdout.write(JSON.stringify(obj, null, 2)); - }); -} - -/** - * Return a plain-object representation of `test` - * free of cyclic properties etc. - * - * @param {Object} test - * @return {Object} - * @api private - */ - -function clean(test) { - return { - title: test.title - , fullTitle: test.fullTitle() - , duration: test.duration - } -} -}); // module: reporters/json.js - -require.register("reporters/landing.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; - -/** - * Expose `Landing`. - */ - -exports = module.exports = Landing; - -/** - * Airplane color. - */ - -Base.colors.plane = 0; - -/** - * Airplane crash color. - */ - -Base.colors['plane crash'] = 31; - -/** - * Runway color. - */ - -Base.colors.runway = 90; - -/** - * Initialize a new `Landing` reporter. - * - * @param {Runner} runner - * @api public - */ - -function Landing(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , width = Base.window.width * .75 | 0 - , total = runner.total - , stream = process.stdout - , plane = color('plane', '✈') - , crashed = -1 - , n = 0; - - function runway() { - var buf = Array(width).join('-'); - return ' ' + color('runway', buf); - } - - runner.on('start', function(){ - stream.write('\n '); - cursor.hide(); - }); - - runner.on('test end', function(test){ - // check if the plane crashed - var col = -1 == crashed - ? width * ++n / total | 0 - : crashed; - - // show the crash - if ('failed' == test.state) { - plane = color('plane crash', '✈'); - crashed = col; - } - - // render landing strip - stream.write('\u001b[4F\n\n'); - stream.write(runway()); - stream.write('\n '); - stream.write(color('runway', Array(col).join('⋅'))); - stream.write(plane) - stream.write(color('runway', Array(width - col).join('⋅') + '\n')); - stream.write(runway()); - stream.write('\u001b[0m'); - }); - - runner.on('end', function(){ - cursor.show(); - console.log(); - self.epilogue(); - }); -} - -/** - * Inherit from `Base.prototype`. - */ - -Landing.prototype = new Base; -Landing.prototype.constructor = Landing; - -}); // module: reporters/landing.js - -require.register("reporters/list.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; - -/** - * Expose `List`. - */ - -exports = module.exports = List; - -/** - * Initialize a new `List` test reporter. - * - * @param {Runner} runner - * @api public - */ - -function List(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , n = 0; - - runner.on('start', function(){ - console.log(); - }); - - runner.on('test', function(test){ - process.stdout.write(color('pass', ' ' + test.fullTitle() + ': ')); - }); - - runner.on('pending', function(test){ - var fmt = color('checkmark', ' -') - + color('pending', ' %s'); - console.log(fmt, test.fullTitle()); - }); - - runner.on('pass', function(test){ - var fmt = color('checkmark', ' ✓') - + color('pass', ' %s: ') - + color(test.speed, '%dms'); - cursor.CR(); - console.log(fmt, test.fullTitle(), test.duration); - }); - - runner.on('fail', function(test, err){ - cursor.CR(); - console.log(color('fail', ' %d) %s'), ++n, test.fullTitle()); - }); - - runner.on('end', self.epilogue.bind(self)); -} - -/** - * Inherit from `Base.prototype`. - */ - -List.prototype = new Base; -List.prototype.constructor = List; - - -}); // module: reporters/list.js - -require.register("reporters/markdown.js", function(module, exports, require){ -/** - * Module dependencies. - */ - -var Base = require('./base') - , utils = require('../utils'); - -/** - * Expose `Markdown`. - */ - -exports = module.exports = Markdown; - -/** - * Initialize a new `Markdown` reporter. - * - * @param {Runner} runner - * @api public - */ - -function Markdown(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , total = runner.total - , level = 0 - , buf = ''; - - function title(str) { - return Array(level).join('#') + ' ' + str; - } - - function indent() { - return Array(level).join(' '); - } - - function mapTOC(suite, obj) { - var ret = obj; - obj = obj[suite.title] = obj[suite.title] || { suite: suite }; - suite.suites.forEach(function(suite){ - mapTOC(suite, obj); - }); - return ret; - } - - function stringifyTOC(obj, level) { - ++level; - var buf = ''; - var link; - for (var key in obj) { - if ('suite' == key) continue; - if (key) link = ' - [' + key + '](#' + utils.slug(obj[key].suite.fullTitle()) + ')\n'; - if (key) buf += Array(level).join(' ') + link; - buf += stringifyTOC(obj[key], level); - } - --level; - return buf; - } - - function generateTOC(suite) { - var obj = mapTOC(suite, {}); - return stringifyTOC(obj, 0); - } - - generateTOC(runner.suite); - - runner.on('suite', function(suite){ - ++level; - var slug = utils.slug(suite.fullTitle()); - buf += '' + '\n'; - buf += title(suite.title) + '\n'; - }); - - runner.on('suite end', function(suite){ - --level; - }); - - runner.on('pass', function(test){ - var code = utils.clean(test.fn.toString()); - buf += test.title + '.\n'; - buf += '\n```js\n'; - buf += code + '\n'; - buf += '```\n\n'; - }); - - runner.on('end', function(){ - process.stdout.write('# TOC\n'); - process.stdout.write(generateTOC(runner.suite)); - process.stdout.write(buf); - }); -} -}); // module: reporters/markdown.js - -require.register("reporters/min.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base'); - -/** - * Expose `Min`. - */ - -exports = module.exports = Min; - -/** - * Initialize a new `Min` minimal test reporter (best used with --watch). - * - * @param {Runner} runner - * @api public - */ - -function Min(runner) { - Base.call(this, runner); - - runner.on('start', function(){ - // clear screen - process.stdout.write('\u001b[2J'); - // set cursor position - process.stdout.write('\u001b[1;3H'); - }); - - runner.on('end', this.epilogue.bind(this)); -} - -/** - * Inherit from `Base.prototype`. - */ - -Min.prototype = new Base; -Min.prototype.constructor = Min; - -}); // module: reporters/min.js - -require.register("reporters/nyan.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , color = Base.color; - -/** - * Expose `Dot`. - */ - -exports = module.exports = NyanCat; - -/** - * Initialize a new `Dot` matrix test reporter. - * - * @param {Runner} runner - * @api public - */ - -function NyanCat(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , width = Base.window.width * .75 | 0 - , rainbowColors = this.rainbowColors = self.generateColors() - , colorIndex = this.colorIndex = 0 - , numberOfLines = this.numberOfLines = 4 - , trajectories = this.trajectories = [[], [], [], []] - , nyanCatWidth = this.nyanCatWidth = 11 - , trajectoryWidthMax = this.trajectoryWidthMax = (width - nyanCatWidth) - , scoreboardWidth = this.scoreboardWidth = 5 - , tick = this.tick = 0 - , n = 0; - - runner.on('start', function(){ - Base.cursor.hide(); - self.draw('start'); - }); - - runner.on('pending', function(test){ - self.draw('pending'); - }); - - runner.on('pass', function(test){ - self.draw('pass'); - }); - - runner.on('fail', function(test, err){ - self.draw('fail'); - }); - - runner.on('end', function(){ - Base.cursor.show(); - for (var i = 0; i < self.numberOfLines; i++) write('\n'); - self.epilogue(); - }); -} - -/** - * Draw the nyan cat with runner `status`. - * - * @param {String} status - * @api private - */ - -NyanCat.prototype.draw = function(status){ - this.appendRainbow(); - this.drawScoreboard(); - this.drawRainbow(); - this.drawNyanCat(status); - this.tick = !this.tick; -}; - -/** - * Draw the "scoreboard" showing the number - * of passes, failures and pending tests. - * - * @api private - */ - -NyanCat.prototype.drawScoreboard = function(){ - var stats = this.stats; - var colors = Base.colors; - - function draw(color, n) { - write(' '); - write('\u001b[' + color + 'm' + n + '\u001b[0m'); - write('\n'); - } - - draw(colors.green, stats.passes); - draw(colors.fail, stats.failures); - draw(colors.pending, stats.pending); - write('\n'); - - this.cursorUp(this.numberOfLines); -}; - -/** - * Append the rainbow. - * - * @api private - */ - -NyanCat.prototype.appendRainbow = function(){ - var segment = this.tick ? '_' : '-'; - var rainbowified = this.rainbowify(segment); - - for (var index = 0; index < this.numberOfLines; index++) { - var trajectory = this.trajectories[index]; - if (trajectory.length >= this.trajectoryWidthMax) trajectory.shift(); - trajectory.push(rainbowified); - } -}; - -/** - * Draw the rainbow. - * - * @api private - */ - -NyanCat.prototype.drawRainbow = function(){ - var self = this; - - this.trajectories.forEach(function(line, index) { - write('\u001b[' + self.scoreboardWidth + 'C'); - write(line.join('')); - write('\n'); - }); - - this.cursorUp(this.numberOfLines); -}; - -/** - * Draw the nyan cat with `status`. - * - * @param {String} status - * @api private - */ - -NyanCat.prototype.drawNyanCat = function(status) { - var self = this; - var startWidth = this.scoreboardWidth + this.trajectories[0].length; - - [0, 1, 2, 3].forEach(function(index) { - write('\u001b[' + startWidth + 'C'); - - switch (index) { - case 0: - write('_,------,'); - write('\n'); - break; - case 1: - var padding = self.tick ? ' ' : ' '; - write('_|' + padding + '/\\_/\\ '); - write('\n'); - break; - case 2: - var padding = self.tick ? '_' : '__'; - var tail = self.tick ? '~' : '^'; - var face; - switch (status) { - case 'pass': - face = '( ^ .^)'; - break; - case 'fail': - face = '( o .o)'; - break; - default: - face = '( - .-)'; - } - write(tail + '|' + padding + face + ' '); - write('\n'); - break; - case 3: - var padding = self.tick ? ' ' : ' '; - write(padding + '"" "" '); - write('\n'); - break; - } - }); - - this.cursorUp(this.numberOfLines); -}; - -/** - * Move cursor up `n`. - * - * @param {Number} n - * @api private - */ - -NyanCat.prototype.cursorUp = function(n) { - write('\u001b[' + n + 'A'); -}; - -/** - * Move cursor down `n`. - * - * @param {Number} n - * @api private - */ - -NyanCat.prototype.cursorDown = function(n) { - write('\u001b[' + n + 'B'); -}; - -/** - * Generate rainbow colors. - * - * @return {Array} - * @api private - */ - -NyanCat.prototype.generateColors = function(){ - var colors = []; - - for (var i = 0; i < (6 * 7); i++) { - var pi3 = Math.floor(Math.PI / 3); - var n = (i * (1.0 / 6)); - var r = Math.floor(3 * Math.sin(n) + 3); - var g = Math.floor(3 * Math.sin(n + 2 * pi3) + 3); - var b = Math.floor(3 * Math.sin(n + 4 * pi3) + 3); - colors.push(36 * r + 6 * g + b + 16); - } - - return colors; -}; - -/** - * Apply rainbow to the given `str`. - * - * @param {String} str - * @return {String} - * @api private - */ - -NyanCat.prototype.rainbowify = function(str){ - var color = this.rainbowColors[this.colorIndex % this.rainbowColors.length]; - this.colorIndex += 1; - return '\u001b[38;5;' + color + 'm' + str + '\u001b[0m'; -}; - -/** - * Stdout helper. - */ - -function write(string) { - process.stdout.write(string); -} - -/** - * Inherit from `Base.prototype`. - */ - -NyanCat.prototype = new Base; -NyanCat.prototype.constructor = NyanCat; - - -}); // module: reporters/nyan.js - -require.register("reporters/progress.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; - -/** - * Expose `Progress`. - */ - -exports = module.exports = Progress; - -/** - * General progress bar color. - */ - -Base.colors.progress = 90; - -/** - * Initialize a new `Progress` bar test reporter. - * - * @param {Runner} runner - * @param {Object} options - * @api public - */ - -function Progress(runner, options) { - Base.call(this, runner); - - var self = this - , options = options || {} - , stats = this.stats - , width = Base.window.width * .50 | 0 - , total = runner.total - , complete = 0 - , max = Math.max; - - // default chars - options.open = options.open || '['; - options.complete = options.complete || '▬'; - options.incomplete = options.incomplete || '⋅'; - options.close = options.close || ']'; - options.verbose = false; - - // tests started - runner.on('start', function(){ - console.log(); - cursor.hide(); - }); - - // tests complete - runner.on('test end', function(){ - complete++; - var incomplete = total - complete - , percent = complete / total - , n = width * percent | 0 - , i = width - n; - - cursor.CR(); - process.stdout.write('\u001b[J'); - process.stdout.write(color('progress', ' ' + options.open)); - process.stdout.write(Array(n).join(options.complete)); - process.stdout.write(Array(i).join(options.incomplete)); - process.stdout.write(color('progress', options.close)); - if (options.verbose) { - process.stdout.write(color('progress', ' ' + complete + ' of ' + total)); - } - }); - - // tests are complete, output some stats - // and the failures if any - runner.on('end', function(){ - cursor.show(); - console.log(); - self.epilogue(); - }); -} - -/** - * Inherit from `Base.prototype`. - */ - -Progress.prototype = new Base; -Progress.prototype.constructor = Progress; - - -}); // module: reporters/progress.js - -require.register("reporters/spec.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; - -/** - * Expose `Spec`. - */ - -exports = module.exports = Spec; - -/** - * Initialize a new `Spec` test reporter. - * - * @param {Runner} runner - * @api public - */ - -function Spec(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , indents = 0 - , n = 0; - - function indent() { - return Array(indents).join(' ') - } - - runner.on('start', function(){ - console.log(); - }); - - runner.on('suite', function(suite){ - ++indents; - console.log(color('suite', '%s%s'), indent(), suite.title); - }); - - runner.on('suite end', function(suite){ - --indents; - if (1 == indents) console.log(); - }); - - runner.on('test', function(test){ - process.stdout.write(indent() + color('pass', ' ◦ ' + test.title + ': ')); - }); - - runner.on('pending', function(test){ - var fmt = indent() + color('pending', ' - %s'); - console.log(fmt, test.title); - }); - - runner.on('pass', function(test){ - if ('fast' == test.speed) { - var fmt = indent() - + color('checkmark', ' ✓') - + color('pass', ' %s '); - cursor.CR(); - console.log(fmt, test.title); - } else { - var fmt = indent() - + color('checkmark', ' ✓') - + color('pass', ' %s ') - + color(test.speed, '(%dms)'); - cursor.CR(); - console.log(fmt, test.title, test.duration); - } - }); - - runner.on('fail', function(test, err){ - cursor.CR(); - console.log(indent() + color('fail', ' %d) %s'), ++n, test.title); - }); - - runner.on('end', self.epilogue.bind(self)); -} - -/** - * Inherit from `Base.prototype`. - */ - -Spec.prototype = new Base; -Spec.prototype.constructor = Spec; - - -}); // module: reporters/spec.js - -require.register("reporters/tap.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , cursor = Base.cursor - , color = Base.color; - -/** - * Expose `TAP`. - */ - -exports = module.exports = TAP; - -/** - * Initialize a new `TAP` reporter. - * - * @param {Runner} runner - * @api public - */ - -function TAP(runner) { - Base.call(this, runner); - - var self = this - , stats = this.stats - , n = 1; - - runner.on('start', function(){ - var total = runner.grepTotal(runner.suite); - console.log('%d..%d', 1, total); - }); - - runner.on('test end', function(){ - ++n; - }); - - runner.on('pending', function(test){ - console.log('ok %d %s # SKIP -', n, title(test)); - }); - - runner.on('pass', function(test){ - console.log('ok %d %s', n, title(test)); - }); - - runner.on('fail', function(test, err){ - console.log('not ok %d %s', n, title(test)); - console.log(err.stack.replace(/^/gm, ' ')); - }); -} - -/** - * Return a TAP-safe title of `test` - * - * @param {Object} test - * @return {String} - * @api private - */ - -function title(test) { - return test.fullTitle().replace(/#/g, ''); -} - -}); // module: reporters/tap.js - -require.register("reporters/teamcity.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base'); - -/** - * Expose `Teamcity`. - */ - -exports = module.exports = Teamcity; - -/** - * Initialize a new `Teamcity` reporter. - * - * @param {Runner} runner - * @api public - */ - -function Teamcity(runner) { - Base.call(this, runner); - var stats = this.stats; - - runner.on('start', function() { - console.log("##teamcity[testSuiteStarted name='mocha.suite']"); - }); - - runner.on('test', function(test) { - console.log("##teamcity[testStarted name='" + escape(test.fullTitle()) + "']"); - }); - - runner.on('fail', function(test, err) { - console.log("##teamcity[testFailed name='" + escape(test.fullTitle()) + "' message='" + escape(err.message) + "']"); - }); - - runner.on('pending', function(test) { - console.log("##teamcity[testIgnored name='" + escape(test.fullTitle()) + "' message='pending']"); - }); - - runner.on('test end', function(test) { - console.log("##teamcity[testFinished name='" + escape(test.fullTitle()) + "' duration='" + test.duration + "']"); - }); - - runner.on('end', function() { - console.log("##teamcity[testSuiteFinished name='mocha.suite' duration='" + stats.duration + "']"); - }); -} - -/** - * Escape the given `str`. - */ - -function escape(str) { - return str - .replace(/\|/g, "||") - .replace(/\n/g, "|n") - .replace(/\r/g, "|r") - .replace(/\[/g, "|[") - .replace(/\]/g, "|]") - .replace(/\u0085/g, "|x") - .replace(/\u2028/g, "|l") - .replace(/\u2029/g, "|p") - .replace(/'/g, "|'"); -} - -}); // module: reporters/teamcity.js - -require.register("reporters/xunit.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Base = require('./base') - , utils = require('../utils') - , escape = utils.escape; - -/** - * Save timer references to avoid Sinon interfering (see GH-237). - */ - -var Date = global.Date - , setTimeout = global.setTimeout - , setInterval = global.setInterval - , clearTimeout = global.clearTimeout - , clearInterval = global.clearInterval; - -/** - * Expose `XUnit`. - */ - -exports = module.exports = XUnit; - -/** - * Initialize a new `XUnit` reporter. - * - * @param {Runner} runner - * @api public - */ - -function XUnit(runner) { - Base.call(this, runner); - var stats = this.stats - , tests = [] - , self = this; - - runner.on('pass', function(test){ - tests.push(test); - }); - - runner.on('fail', function(test){ - tests.push(test); - }); - - runner.on('end', function(){ - console.log(tag('testsuite', { - name: 'Mocha Tests' - , tests: stats.tests - , failures: stats.failures - , errors: stats.failures - , skip: stats.tests - stats.failures - stats.passes - , timestamp: (new Date).toUTCString() - , time: stats.duration / 1000 - }, false)); - - tests.forEach(test); - console.log(''); - }); -} - -/** - * Inherit from `Base.prototype`. - */ - -XUnit.prototype = new Base; -XUnit.prototype.constructor = XUnit; - - -/** - * Output tag for the given `test.` - */ - -function test(test) { - var attrs = { - classname: test.parent.fullTitle() - , name: test.title - , time: test.duration / 1000 - }; - - if ('failed' == test.state) { - var err = test.err; - attrs.message = escape(err.message); - console.log(tag('testcase', attrs, false, tag('failure', attrs, false, cdata(err.stack)))); - } else if (test.pending) { - console.log(tag('testcase', attrs, false, tag('skipped', {}, true))); - } else { - console.log(tag('testcase', attrs, true) ); - } -} - -/** - * HTML tag helper. - */ - -function tag(name, attrs, close, content) { - var end = close ? '/>' : '>' - , pairs = [] - , tag; - - for (var key in attrs) { - pairs.push(key + '="' + escape(attrs[key]) + '"'); - } - - tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end; - if (content) tag += content + ''; -} - -}); // module: reporters/xunit.js - -require.register("runnable.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var EventEmitter = require('browser/events').EventEmitter - , debug = require('browser/debug')('mocha:runnable'); - -/** - * Save timer references to avoid Sinon interfering (see GH-237). - */ - -var Date = global.Date - , setTimeout = global.setTimeout - , setInterval = global.setInterval - , clearTimeout = global.clearTimeout - , clearInterval = global.clearInterval; - -/** - * Expose `Runnable`. - */ - -module.exports = Runnable; - -/** - * Initialize a new `Runnable` with the given `title` and callback `fn`. - * - * @param {String} title - * @param {Function} fn - * @api private - */ - -function Runnable(title, fn) { - this.title = title; - this.fn = fn; - this.async = fn && fn.length; - this.sync = ! this.async; - this._timeout = 2000; - this._slow = 75; - this.timedOut = false; -} - -/** - * Inherit from `EventEmitter.prototype`. - */ - -Runnable.prototype = new EventEmitter; -Runnable.prototype.constructor = Runnable; - - -/** - * Set & get timeout `ms`. - * - * @param {Number} ms - * @return {Runnable|Number} ms or self - * @api private - */ - -Runnable.prototype.timeout = function(ms){ - if (0 == arguments.length) return this._timeout; - debug('timeout %d', ms); - this._timeout = ms; - if (this.timer) this.resetTimeout(); - return this; -}; - -/** - * Set & get slow `ms`. - * - * @param {Number} ms - * @return {Runnable|Number} ms or self - * @api private - */ - -Runnable.prototype.slow = function(ms){ - if (0 === arguments.length) return this._slow; - debug('timeout %d', ms); - this._slow = ms; - return this; -}; - -/** - * Return the full title generated by recursively - * concatenating the parent's full title. - * - * @return {String} - * @api public - */ - -Runnable.prototype.fullTitle = function(){ - return this.parent.fullTitle() + ' ' + this.title; -}; - -/** - * Clear the timeout. - * - * @api private - */ - -Runnable.prototype.clearTimeout = function(){ - clearTimeout(this.timer); -}; - -/** - * Inspect the runnable void of private properties. - * - * @return {String} - * @api private - */ - -Runnable.prototype.inspect = function(){ - return JSON.stringify(this, function(key, val){ - if ('_' == key[0]) return; - if ('parent' == key) return '#'; - if ('ctx' == key) return '#'; - return val; - }, 2); -}; - -/** - * Reset the timeout. - * - * @api private - */ - -Runnable.prototype.resetTimeout = function(){ - var self = this - , ms = this.timeout(); - - this.clearTimeout(); - if (ms) { - this.timer = setTimeout(function(){ - self.callback(new Error('timeout of ' + ms + 'ms exceeded')); - self.timedOut = true; - }, ms); - } -}; - -/** - * Run the test and invoke `fn(err)`. - * - * @param {Function} fn - * @api private - */ - -Runnable.prototype.run = function(fn){ - var self = this - , ms = this.timeout() - , start = new Date - , ctx = this.ctx - , finished - , emitted; - - if (ctx) ctx.runnable(this); - - // timeout - if (this.async) { - if (ms) { - this.timer = setTimeout(function(){ - done(new Error('timeout of ' + ms + 'ms exceeded')); - self.timedOut = true; - }, ms); - } - } - - // called multiple times - function multiple(err) { - if (emitted) return; - emitted = true; - self.emit('error', err || new Error('done() called multiple times')); - } - - // finished - function done(err) { - if (self.timedOut) return; - if (finished) return multiple(err); - self.clearTimeout(); - self.duration = new Date - start; - finished = true; - fn(err); - } - - // for .resetTimeout() - this.callback = done; - - // async - if (this.async) { - try { - this.fn.call(ctx, function(err){ - if (err instanceof Error) return done(err); - if (null != err) return done(new Error('done() invoked with non-Error: ' + err)); - done(); - }); - } catch (err) { - done(err); - } - return; - } - - // sync - try { - if (!this.pending) this.fn.call(ctx); - this.duration = new Date - start; - fn(); - } catch (err) { - fn(err); - } -}; - -}); // module: runnable.js - -require.register("runner.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var EventEmitter = require('browser/events').EventEmitter - , debug = require('browser/debug')('mocha:runner') - , Test = require('./test') - , utils = require('./utils') - , filter = utils.filter - , keys = utils.keys - , noop = function(){}; - -/** - * Expose `Runner`. - */ - -module.exports = Runner; - -/** - * Initialize a `Runner` for the given `suite`. - * - * Events: - * - * - `start` execution started - * - `end` execution complete - * - `suite` (suite) test suite execution started - * - `suite end` (suite) all tests (and sub-suites) have finished - * - `test` (test) test execution started - * - `test end` (test) test completed - * - `hook` (hook) hook execution started - * - `hook end` (hook) hook complete - * - `pass` (test) test passed - * - `fail` (test, err) test failed - * - * @api public - */ - -function Runner(suite) { - var self = this; - this._globals = []; - this.suite = suite; - this.total = suite.total(); - this.failures = 0; - this.on('test end', function(test){ self.checkGlobals(test); }); - this.on('hook end', function(hook){ self.checkGlobals(hook); }); - this.grep(/.*/); - this.globals(utils.keys(global).concat(['errno'])); -} - -/** - * Inherit from `EventEmitter.prototype`. - */ - -Runner.prototype = new EventEmitter; -Runner.prototype.constructor = Runner; - - -/** - * Run tests with full titles matching `re`. Updates runner.total - * with number of tests matched. - * - * @param {RegExp} re - * @param {Boolean} invert - * @return {Runner} for chaining - * @api public - */ - -Runner.prototype.grep = function(re, invert){ - debug('grep %s', re); - this._grep = re; - this._invert = invert; - this.total = this.grepTotal(this.suite); - return this; -}; - -/** - * Returns the number of tests matching the grep search for the - * given suite. - * - * @param {Suite} suite - * @return {Number} - * @api public - */ - -Runner.prototype.grepTotal = function(suite) { - var self = this; - var total = 0; - - suite.eachTest(function(test){ - var match = self._grep.test(test.fullTitle()); - if (self._invert) match = !match; - if (match) total++; - }); - - return total; -}; - -/** - * Allow the given `arr` of globals. - * - * @param {Array} arr - * @return {Runner} for chaining - * @api public - */ - -Runner.prototype.globals = function(arr){ - if (0 == arguments.length) return this._globals; - debug('globals %j', arr); - utils.forEach(arr, function(arr){ - this._globals.push(arr); - }, this); - return this; -}; - -/** - * Check for global variable leaks. - * - * @api private - */ - -Runner.prototype.checkGlobals = function(test){ - if (this.ignoreLeaks) return; - var ok = this._globals; - var globals = keys(global); - var isNode = process.kill; - var leaks; - - // check length - 2 ('errno' and 'location' globals) - if (isNode && 1 == ok.length - globals.length) return - else if (2 == ok.length - globals.length) return; - - leaks = filterLeaks(ok, globals); - this._globals = this._globals.concat(leaks); - - if (leaks.length > 1) { - this.fail(test, new Error('global leaks detected: ' + leaks.join(', ') + '')); - } else if (leaks.length) { - this.fail(test, new Error('global leak detected: ' + leaks[0])); - } -}; - -/** - * Fail the given `test`. - * - * @param {Test} test - * @param {Error} err - * @api private - */ - -Runner.prototype.fail = function(test, err){ - ++this.failures; - test.state = 'failed'; - if ('string' == typeof err) { - err = new Error('the string "' + err + '" was thrown, throw an Error :)'); - } - this.emit('fail', test, err); -}; - -/** - * Fail the given `hook` with `err`. - * - * Hook failures (currently) hard-end due - * to that fact that a failing hook will - * surely cause subsequent tests to fail, - * causing jumbled reporting. - * - * @param {Hook} hook - * @param {Error} err - * @api private - */ - -Runner.prototype.failHook = function(hook, err){ - this.fail(hook, err); - this.emit('end'); -}; - -/** - * Run hook `name` callbacks and then invoke `fn()`. - * - * @param {String} name - * @param {Function} function - * @api private - */ - -Runner.prototype.hook = function(name, fn){ - var suite = this.suite - , hooks = suite['_' + name] - , self = this - , timer; - - function next(i) { - var hook = hooks[i]; - if (!hook) return fn(); - self.currentRunnable = hook; - - self.emit('hook', hook); - - hook.on('error', function(err){ - self.failHook(hook, err); - }); - - hook.run(function(err){ - hook.removeAllListeners('error'); - var testError = hook.error(); - if (testError) self.fail(self.test, testError); - if (err) return self.failHook(hook, err); - self.emit('hook end', hook); - next(++i); - }); - } - - process.nextTick(function(){ - next(0); - }); -}; - -/** - * Run hook `name` for the given array of `suites` - * in order, and callback `fn(err)`. - * - * @param {String} name - * @param {Array} suites - * @param {Function} fn - * @api private - */ - -Runner.prototype.hooks = function(name, suites, fn){ - var self = this - , orig = this.suite; - - function next(suite) { - self.suite = suite; - - if (!suite) { - self.suite = orig; - return fn(); - } - - self.hook(name, function(err){ - if (err) { - self.suite = orig; - return fn(err); - } - - next(suites.pop()); - }); - } - - next(suites.pop()); -}; - -/** - * Run hooks from the top level down. - * - * @param {String} name - * @param {Function} fn - * @api private - */ - -Runner.prototype.hookUp = function(name, fn){ - var suites = [this.suite].concat(this.parents()).reverse(); - this.hooks(name, suites, fn); -}; - -/** - * Run hooks from the bottom up. - * - * @param {String} name - * @param {Function} fn - * @api private - */ - -Runner.prototype.hookDown = function(name, fn){ - var suites = [this.suite].concat(this.parents()); - this.hooks(name, suites, fn); -}; - -/** - * Return an array of parent Suites from - * closest to furthest. - * - * @return {Array} - * @api private - */ - -Runner.prototype.parents = function(){ - var suite = this.suite - , suites = []; - while (suite = suite.parent) suites.push(suite); - return suites; -}; - -/** - * Run the current test and callback `fn(err)`. - * - * @param {Function} fn - * @api private - */ - -Runner.prototype.runTest = function(fn){ - var test = this.test - , self = this; - - try { - test.on('error', function(err){ - self.fail(test, err); - }); - test.run(fn); - } catch (err) { - fn(err); - } -}; - -/** - * Run tests in the given `suite` and invoke - * the callback `fn()` when complete. - * - * @param {Suite} suite - * @param {Function} fn - * @api private - */ - -Runner.prototype.runTests = function(suite, fn){ - var self = this - , tests = suite.tests - , test; - - function next(err) { - // if we bail after first err - if (self.failures && suite._bail) return fn(); - - // next test - test = tests.shift(); - - // all done - if (!test) return fn(); - - // grep - var match = self._grep.test(test.fullTitle()); - if (self._invert) match = !match; - if (!match) return next(); - - // pending - if (test.pending) { - self.emit('pending', test); - self.emit('test end', test); - return next(); - } - - // execute test and hook(s) - self.emit('test', self.test = test); - self.hookDown('beforeEach', function(){ - self.currentRunnable = self.test; - self.runTest(function(err){ - test = self.test; - - if (err) { - self.fail(test, err); - self.emit('test end', test); - return self.hookUp('afterEach', next); - } - - test.state = 'passed'; - self.emit('pass', test); - self.emit('test end', test); - self.hookUp('afterEach', next); - }); - }); - } - - this.next = next; - next(); -}; - -/** - * Run the given `suite` and invoke the - * callback `fn()` when complete. - * - * @param {Suite} suite - * @param {Function} fn - * @api private - */ - -Runner.prototype.runSuite = function(suite, fn){ - var total = this.grepTotal(suite) - , self = this - , i = 0; - - debug('run suite %s', suite.fullTitle()); - - if (!total) return fn(); - - this.emit('suite', this.suite = suite); - - function next() { - var curr = suite.suites[i++]; - if (!curr) return done(); - self.runSuite(curr, next); - } - - function done() { - self.suite = suite; - self.hook('afterAll', function(){ - self.emit('suite end', suite); - fn(); - }); - } - - this.hook('beforeAll', function(){ - self.runTests(suite, next); - }); -}; - -/** - * Handle uncaught exceptions. - * - * @param {Error} err - * @api private - */ - -Runner.prototype.uncaught = function(err){ - debug('uncaught exception %s', err.message); - var runnable = this.currentRunnable; - if (!runnable || 'failed' == runnable.state) return; - runnable.clearTimeout(); - err.uncaught = true; - this.fail(runnable, err); - - // recover from test - if ('test' == runnable.type) { - this.emit('test end', runnable); - this.hookUp('afterEach', this.next); - return; - } - - // bail on hooks - this.emit('end'); -}; - -/** - * Run the root suite and invoke `fn(failures)` - * on completion. - * - * @param {Function} fn - * @return {Runner} for chaining - * @api public - */ - -Runner.prototype.run = function(fn){ - var self = this - , fn = fn || function(){}; - - debug('start'); - - // uncaught callback - function uncaught(err) { - self.uncaught(err); - } - - // callback - this.on('end', function(){ - debug('end'); - process.removeListener('uncaughtException', uncaught); - fn(self.failures); - }); - - // run suites - this.emit('start'); - this.runSuite(this.suite, function(){ - debug('finished running'); - self.emit('end'); - }); - - // uncaught exception - process.on('uncaughtException', uncaught); - - return this; -}; - -/** - * Filter leaks with the given globals flagged as `ok`. - * - * @param {Array} ok - * @param {Array} globals - * @return {Array} - * @api private - */ - -function filterLeaks(ok, globals) { - return filter(globals, function(key){ - var matched = filter(ok, function(ok){ - if (~ok.indexOf('*')) return 0 == key.indexOf(ok.split('*')[0]); - return key == ok; - }); - return matched.length == 0 && (!global.navigator || 'onerror' !== key); - }); -} - -}); // module: runner.js - -require.register("suite.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var EventEmitter = require('browser/events').EventEmitter - , debug = require('browser/debug')('mocha:suite') - , milliseconds = require('./ms') - , utils = require('./utils') - , Hook = require('./hook'); - -/** - * Expose `Suite`. - */ - -exports = module.exports = Suite; - -/** - * Create a new `Suite` with the given `title` - * and parent `Suite`. When a suite with the - * same title is already present, that suite - * is returned to provide nicer reporter - * and more flexible meta-testing. - * - * @param {Suite} parent - * @param {String} title - * @return {Suite} - * @api public - */ - -exports.create = function(parent, title){ - var suite = new Suite(title, parent.ctx); - suite.parent = parent; - if (parent.pending) suite.pending = true; - title = suite.fullTitle(); - parent.addSuite(suite); - return suite; -}; - -/** - * Initialize a new `Suite` with the given - * `title` and `ctx`. - * - * @param {String} title - * @param {Context} ctx - * @api private - */ - -function Suite(title, ctx) { - this.title = title; - this.ctx = ctx; - this.suites = []; - this.tests = []; - this.pending = false; - this._beforeEach = []; - this._beforeAll = []; - this._afterEach = []; - this._afterAll = []; - this.root = !title; - this._timeout = 2000; - this._slow = 75; - this._bail = false; -} - -/** - * Inherit from `EventEmitter.prototype`. - */ - -Suite.prototype = new EventEmitter; -Suite.prototype.constructor = Suite; - - -/** - * Return a clone of this `Suite`. - * - * @return {Suite} - * @api private - */ - -Suite.prototype.clone = function(){ - var suite = new Suite(this.title); - debug('clone'); - suite.ctx = this.ctx; - suite.timeout(this.timeout()); - suite.slow(this.slow()); - suite.bail(this.bail()); - return suite; -}; - -/** - * Set timeout `ms` or short-hand such as "2s". - * - * @param {Number|String} ms - * @return {Suite|Number} for chaining - * @api private - */ - -Suite.prototype.timeout = function(ms){ - if (0 == arguments.length) return this._timeout; - if ('string' == typeof ms) ms = milliseconds(ms); - debug('timeout %d', ms); - this._timeout = parseInt(ms, 10); - return this; -}; - -/** - * Set slow `ms` or short-hand such as "2s". - * - * @param {Number|String} ms - * @return {Suite|Number} for chaining - * @api private - */ - -Suite.prototype.slow = function(ms){ - if (0 === arguments.length) return this._slow; - if ('string' == typeof ms) ms = milliseconds(ms); - debug('slow %d', ms); - this._slow = ms; - return this; -}; - -/** - * Sets whether to bail after first error. - * - * @parma {Boolean} bail - * @return {Suite|Number} for chaining - * @api private - */ - -Suite.prototype.bail = function(bail){ - if (0 == arguments.length) return this._bail; - debug('bail %s', bail); - this._bail = bail; - return this; -}; - -/** - * Run `fn(test[, done])` before running tests. - * - * @param {Function} fn - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.beforeAll = function(fn){ - if (this.pending) return this; - var hook = new Hook('"before all" hook', fn); - hook.parent = this; - hook.timeout(this.timeout()); - hook.slow(this.slow()); - hook.ctx = this.ctx; - this._beforeAll.push(hook); - this.emit('beforeAll', hook); - return this; -}; - -/** - * Run `fn(test[, done])` after running tests. - * - * @param {Function} fn - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.afterAll = function(fn){ - if (this.pending) return this; - var hook = new Hook('"after all" hook', fn); - hook.parent = this; - hook.timeout(this.timeout()); - hook.slow(this.slow()); - hook.ctx = this.ctx; - this._afterAll.push(hook); - this.emit('afterAll', hook); - return this; -}; - -/** - * Run `fn(test[, done])` before each test case. - * - * @param {Function} fn - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.beforeEach = function(fn){ - if (this.pending) return this; - var hook = new Hook('"before each" hook', fn); - hook.parent = this; - hook.timeout(this.timeout()); - hook.slow(this.slow()); - hook.ctx = this.ctx; - this._beforeEach.push(hook); - this.emit('beforeEach', hook); - return this; -}; - -/** - * Run `fn(test[, done])` after each test case. - * - * @param {Function} fn - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.afterEach = function(fn){ - if (this.pending) return this; - var hook = new Hook('"after each" hook', fn); - hook.parent = this; - hook.timeout(this.timeout()); - hook.slow(this.slow()); - hook.ctx = this.ctx; - this._afterEach.push(hook); - this.emit('afterEach', hook); - return this; -}; - -/** - * Add a test `suite`. - * - * @param {Suite} suite - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.addSuite = function(suite){ - suite.parent = this; - suite.timeout(this.timeout()); - suite.slow(this.slow()); - suite.bail(this.bail()); - this.suites.push(suite); - this.emit('suite', suite); - return this; -}; - -/** - * Add a `test` to this suite. - * - * @param {Test} test - * @return {Suite} for chaining - * @api private - */ - -Suite.prototype.addTest = function(test){ - test.parent = this; - test.timeout(this.timeout()); - test.slow(this.slow()); - test.ctx = this.ctx; - this.tests.push(test); - this.emit('test', test); - return this; -}; - -/** - * Return the full title generated by recursively - * concatenating the parent's full title. - * - * @return {String} - * @api public - */ - -Suite.prototype.fullTitle = function(){ - if (this.parent) { - var full = this.parent.fullTitle(); - if (full) return full + ' ' + this.title; - } - return this.title; -}; - -/** - * Return the total number of tests. - * - * @return {Number} - * @api public - */ - -Suite.prototype.total = function(){ - return utils.reduce(this.suites, function(sum, suite){ - return sum + suite.total(); - }, 0) + this.tests.length; -}; - -/** - * Iterates through each suite recursively to find - * all tests. Applies a function in the format - * `fn(test)`. - * - * @param {Function} fn - * @return {Suite} - * @api private - */ - -Suite.prototype.eachTest = function(fn){ - utils.forEach(this.tests, fn); - utils.forEach(this.suites, function(suite){ - suite.eachTest(fn); - }); - return this; -}; - -}); // module: suite.js - -require.register("test.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var Runnable = require('./runnable'); - -/** - * Expose `Test`. - */ - -module.exports = Test; - -/** - * Initialize a new `Test` with the given `title` and callback `fn`. - * - * @param {String} title - * @param {Function} fn - * @api private - */ - -function Test(title, fn) { - Runnable.call(this, title, fn); - this.pending = !fn; - this.type = 'test'; -} - -/** - * Inherit from `Runnable.prototype`. - */ - -Test.prototype = new Runnable; -Test.prototype.constructor = Test; - - -}); // module: test.js - -require.register("utils.js", function(module, exports, require){ - -/** - * Module dependencies. - */ - -var fs = require('browser/fs') - , path = require('browser/path') - , join = path.join - , debug = require('browser/debug')('mocha:watch'); - -/** - * Ignored directories. - */ - -var ignore = ['node_modules', '.git']; - -/** - * Escape special characters in the given string of html. - * - * @param {String} html - * @return {String} - * @api private - */ - -exports.escape = function(html){ - return String(html) - .replace(/&/g, '&') - .replace(/"/g, '"') - .replace(//g, '>'); -}; - -/** - * Array#forEach (<=IE8) - * - * @param {Array} array - * @param {Function} fn - * @param {Object} scope - * @api private - */ - -exports.forEach = function(arr, fn, scope){ - for (var i = 0, l = arr.length; i < l; i++) - fn.call(scope, arr[i], i); -}; - -/** - * Array#indexOf (<=IE8) - * - * @parma {Array} arr - * @param {Object} obj to find index of - * @param {Number} start - * @api private - */ - -exports.indexOf = function(arr, obj, start){ - for (var i = start || 0, l = arr.length; i < l; i++) { - if (arr[i] === obj) - return i; - } - return -1; -}; - -/** - * Array#reduce (<=IE8) - * - * @param {Array} array - * @param {Function} fn - * @param {Object} initial value - * @api private - */ - -exports.reduce = function(arr, fn, val){ - var rval = val; - - for (var i = 0, l = arr.length; i < l; i++) { - rval = fn(rval, arr[i], i, arr); - } - - return rval; -}; - -/** - * Array#filter (<=IE8) - * - * @param {Array} array - * @param {Function} fn - * @api private - */ - -exports.filter = function(arr, fn){ - var ret = []; - - for (var i = 0, l = arr.length; i < l; i++) { - var val = arr[i]; - if (fn(val, i, arr)) ret.push(val); - } - - return ret; -}; - -/** - * Object.keys (<=IE8) - * - * @param {Object} obj - * @return {Array} keys - * @api private - */ - -exports.keys = Object.keys || function(obj) { - var keys = [] - , has = Object.prototype.hasOwnProperty // for `window` on <=IE8 - - for (var key in obj) { - if (has.call(obj, key)) { - keys.push(key); - } - } - - return keys; -}; - -/** - * Watch the given `files` for changes - * and invoke `fn(file)` on modification. - * - * @param {Array} files - * @param {Function} fn - * @api private - */ - -exports.watch = function(files, fn){ - var options = { interval: 100 }; - files.forEach(function(file){ - debug('file %s', file); - fs.watchFile(file, options, function(curr, prev){ - if (prev.mtime < curr.mtime) fn(file); - }); - }); -}; - -/** - * Ignored files. - */ - -function ignored(path){ - return !~ignore.indexOf(path); -} - -/** - * Lookup files in the given `dir`. - * - * @return {Array} - * @api private - */ - -exports.files = function(dir, ret){ - ret = ret || []; - - fs.readdirSync(dir) - .filter(ignored) - .forEach(function(path){ - path = join(dir, path); - if (fs.statSync(path).isDirectory()) { - exports.files(path, ret); - } else if (path.match(/\.(js|coffee)$/)) { - ret.push(path); - } - }); - - return ret; -}; - -/** - * Compute a slug from the given `str`. - * - * @param {String} str - * @return {String} - * @api private - */ - -exports.slug = function(str){ - return str - .toLowerCase() - .replace(/ +/g, '-') - .replace(/[^-\w]/g, ''); -}; - -/** - * Strip the function definition from `str`, - * and re-indent for pre whitespace. - */ - -exports.clean = function(str) { - str = str - .replace(/^function *\(.*\) *{/, '') - .replace(/\s+\}$/, ''); - - var spaces = str.match(/^\n?( *)/)[1].length - , re = new RegExp('^ {' + spaces + '}', 'gm'); - - str = str.replace(re, ''); - - return exports.trim(str); -}; - -/** - * Escape regular expression characters in `str`. - * - * @param {String} str - * @return {String} - * @api private - */ - -exports.escapeRegexp = function(str){ - return str.replace(/[-\\^$*+?.()|[\]{}]/g, "\\$&"); -}; - -/** - * Trim the given `str`. - * - * @param {String} str - * @return {String} - * @api private - */ - -exports.trim = function(str){ - return str.replace(/^\s+|\s+$/g, ''); -}; - -/** - * Parse the given `qs`. - * - * @param {String} qs - * @return {Object} - * @api private - */ - -exports.parseQuery = function(qs){ - return exports.reduce(qs.replace('?', '').split('&'), function(obj, pair){ - var i = pair.indexOf('=') - , key = pair.slice(0, i) - , val = pair.slice(++i); - - obj[key] = decodeURIComponent(val); - return obj; - }, {}); -}; - -/** - * Highlight the given string of `js`. - * - * @param {String} js - * @return {String} - * @api private - */ - -function highlight(js) { - return js - .replace(//g, '>') - .replace(/\/\/(.*)/gm, '//$1') - .replace(/('.*?')/gm, '$1') - .replace(/(\d+\.\d+)/gm, '$1') - .replace(/(\d+)/gm, '$1') - .replace(/\bnew *(\w+)/gm, 'new $1') - .replace(/\b(function|new|throw|return|var|if|else)\b/gm, '$1') -} - -/** - * Highlight the contents of tag `name`. - * - * @param {String} name - * @api private - */ - -exports.highlightTags = function(name) { - var code = document.getElementsByTagName(name); - for (var i = 0, len = code.length; i < len; ++i) { - code[i].innerHTML = highlight(code[i].innerHTML); - } -}; - -}); // module: utils.js -/** - * Node shims. - * - * These are meant only to allow - * mocha.js to run untouched, not - * to allow running node code in - * the browser. - */ - -var process = {}; -process.exit = function(status){}; -process.stdout = {}; -var global = window; - -/** - * next tick implementation. - */ - -process.nextTick = (function(){ - // postMessage behaves badly on IE8 - if (window.ActiveXObject || !window.postMessage) { - return function(fn){ fn() }; - } - - // based on setZeroTimeout by David Baron - // - http://dbaron.org/log/20100309-faster-timeouts - var timeouts = [] - , name = 'mocha-zero-timeout' - - window.addEventListener('message', function(e){ - if (e.source == window && e.data == name) { - if (e.stopPropagation) e.stopPropagation(); - if (timeouts.length) timeouts.shift()(); - } - }, true); - - return function(fn){ - timeouts.push(fn); - window.postMessage(name, '*'); - } -})(); - -/** - * Remove uncaughtException listener. - */ - -process.removeListener = function(e){ - if ('uncaughtException' == e) { - window.onerror = null; - } -}; - -/** - * Implements uncaughtException listener. - */ - -process.on = function(e, fn){ - if ('uncaughtException' == e) { - window.onerror = fn; - } -}; - -// boot -;(function(){ - - /** - * Expose mocha. - */ - - var Mocha = window.Mocha = require('mocha'), - mocha = window.mocha = new Mocha({ reporter: 'html' }); - - /** - * Override ui to ensure that the ui functions are initialized. - * Normally this would happen in Mocha.prototype.loadFiles. - */ - - mocha.ui = function(ui){ - Mocha.prototype.ui.call(this, ui); - this.suite.emit('pre-require', window, null, this); - return this; - }; - - /** - * Setup mocha with the given setting options. - */ - - mocha.setup = function(opts){ - if ('string' == typeof opts) opts = { ui: opts }; - for (var opt in opts) this[opt](opts[opt]); - return this; - }; - - /** - * Run mocha, returning the Runner. - */ - - mocha.run = function(fn){ - var options = mocha.options; - mocha.globals('location'); - - var query = Mocha.utils.parseQuery(window.location.search || ''); - if (query.grep) mocha.grep(query.grep); - - return Mocha.prototype.run.call(mocha, function(){ - Mocha.utils.highlightTags('code'); - if (fn) fn(); - }); - }; -})(); -})(); \ No newline at end of file diff --git a/test/browsertest/node_modules/extra.loader.js b/test/browsertest/node_modules/extra.loader.js deleted file mode 100644 index f58a989664c..00000000000 --- a/test/browsertest/node_modules/extra.loader.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = function(string) { - this.cacheable(); - return string + " with post loader"; -} \ No newline at end of file diff --git a/test/browsertest/node_modules/library1/index.js b/test/browsertest/node_modules/library1/index.js deleted file mode 100644 index 4292aaf556a..00000000000 --- a/test/browsertest/node_modules/library1/index.js +++ /dev/null @@ -1,29 +0,0 @@ -// Single File library -var loadTimelibrary1 = typeof window.library1 === "undefined" -describe("library1", function() { - it("should load library1 only once", function() { - expect(loadTimelibrary1).toBe(true); - }); - - it("should load a component", function() { - expect(require("./lib/component")).toBe("lib1 component"); - }); - - it("should load async submodules with require.ensure even if single == true", function(done) { - var sameTick = true; - require.ensure(["submodule1", "submodule2"], function(require) { - expect(sameTick).toBe(true); - expect(require("submodule1")).toBe("submodule1"); - expect(require("submodule2")).toBe("submodule2"); - expect(require("submodule3")()).toBe("submodule3"); - require.ensure([], function(require) { - expect(sameTick).toBe(true); - done(); - }); - }); - setImmediate(function() { - sameTick = false; - }); - }); -}); -module.exports = true; diff --git a/test/browsertest/node_modules/library1/lib/comp.js b/test/browsertest/node_modules/library1/lib/comp.js deleted file mode 100644 index 11bd50a09a3..00000000000 --- a/test/browsertest/node_modules/library1/lib/comp.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = "lib1 component"; \ No newline at end of file diff --git a/test/browsertest/node_modules/library1/lib/component.js b/test/browsertest/node_modules/library1/lib/component.js deleted file mode 100644 index a9245c09ece..00000000000 --- a/test/browsertest/node_modules/library1/lib/component.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("./comp.js"); \ No newline at end of file diff --git a/test/browsertest/node_modules/library1/node_modules/submodule1/index.js b/test/browsertest/node_modules/library1/node_modules/submodule1/index.js deleted file mode 100644 index 6146f49ad9e..00000000000 --- a/test/browsertest/node_modules/library1/node_modules/submodule1/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = "submodule1"; \ No newline at end of file diff --git a/test/browsertest/node_modules/library1/node_modules/submodule2/index.js b/test/browsertest/node_modules/library1/node_modules/submodule2/index.js deleted file mode 100644 index 854f740abac..00000000000 --- a/test/browsertest/node_modules/library1/node_modules/submodule2/index.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = (function() { - return "submodule2"; -}()); \ No newline at end of file diff --git a/test/browsertest/node_modules/library2/lib/common.js b/test/browsertest/node_modules/library2/lib/common.js deleted file mode 100644 index fc5d837715a..00000000000 --- a/test/browsertest/node_modules/library2/lib/common.js +++ /dev/null @@ -1,8 +0,0 @@ -var typeofLibrary2 = typeof library2; - -describe("library2", function() { - it("should run before main", function() { - expect(typeofLibrary2).toBe("undefined"); - }); -}); -exports.library2common = { ok2: true }; diff --git a/test/browsertest/node_modules/library2/lib/extra.js b/test/browsertest/node_modules/library2/lib/extra.js deleted file mode 100644 index af23c8ecb14..00000000000 --- a/test/browsertest/node_modules/library2/lib/extra.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = "Lib2 extra"; \ No newline at end of file diff --git a/test/browsertest/node_modules/library2/lib/extra2.js b/test/browsertest/node_modules/library2/lib/extra2.js deleted file mode 100644 index 936390501a8..00000000000 --- a/test/browsertest/node_modules/library2/lib/extra2.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = "Lib2 extra2"; \ No newline at end of file diff --git a/test/browsertest/node_modules/library2/lib/main.js b/test/browsertest/node_modules/library2/lib/main.js deleted file mode 100644 index d026078f43e..00000000000 --- a/test/browsertest/node_modules/library2/lib/main.js +++ /dev/null @@ -1,109 +0,0 @@ -// Chunked File library -var library2commonValue = library2common; - -describe("library2", function() { - var tickExtra, tickEmpty, tickMerged; - var extraValue, testValue; - - beforeAll(function(done) { - var asnycOk = false, asnycOk2 = false; - var sameTick1 = true; - require.ensure(["./extra"], function(require) { - asnycOk = true; - tickExtra = sameTick1; - var sameTick2 = true; - require.ensure([], function(require) { - asnycOk2 = true; - extraValue = require("./extra"); - tickEmpty = sameTick2; - require.ensure(["./test.js"], function(require) { - tickMerged = sameTick2; - testValue = require("./test.js"); - done(); - }); - }); - Promise.resolve().then(function() {}).then(function() {}).then(function() { - sameTick2 = false; - }); - }); - Promise.resolve().then(function() {}).then(function() {}).then(function() { - sameTick1 = false; - }); - }); - - - it("should run after common", function() { - expect(library2commonValue).toEqual({ok2: true}); - }); - - it("should load stuff with require.ensure asynchron", function() { - expect(tickExtra).toBe(false); - }); - - it("should load not include stuff from parent, remove empty chunks and apply a post loader", function() { - expect(tickEmpty).toBe(true); - expect(extraValue).toBe("Lib2 extra2 with post loader"); - }); - - it("should merge chunks if maxChunks specified", function() { - expect(tickEmpty).toBe(true); - expect(testValue).toBe("test module"); - }); - - it("should load require.amd from options", function() { - expect(require.amd.fromOptions).toBe(true); - }); - - it("should run empty AMD require", function(done) { - var emptyRequire = false; - require([], function() { - emptyRequire = true; - }); - Promise.resolve().then(function() {}).then(function() {}).then(function() { - expect(emptyRequire).toBe(true); - done(); - }); - }); - - it("should provide free variables", function() { - expect(s3()).toBe("submodule3"); - }); - - it("should define values", function() { - expect(CONST_UNDEFINED === undefined).toBe(true); - expect(CONST_NULL === null).toBe(true); - expect(CONST_TRUE).toBe(true); - expect(CONST_FALSE).toBe(false); - expect(CONST_FUNCTION()).toBe("ok"); - expect(CONST_NUMBER).toBe(123); - expect(CONST_NUMBER_EXPR).toBe(123); - expect(typeof CONST_TYPEOF).toBe("typeof"); - - var o = CONST_OBJECT; - expect(CONST_OBJECT.A).toBe(1); - expect(CONST_OBJECT.B).toBe("B"); - expect(CONST_OBJECT.C()).toBe("C"); - expect(o.A).toBe(1); - expect(o.B).toBe("B"); - expect(o.C()).toBe("C"); - (function(o) { - expect(o.A).toBe(1); - expect(o.B).toBe("B"); - expect(o.C()).toBe("C"); - }(CONST_OBJECT)); - - if(CONST_FALSE) require("fail"); - if(!CONST_TRUE) require("fail"); - if(!CONST_NUMBER) require("fail"); - if(!CONST_NUMBER_EXPR) require("fail"); - if(typeof CONST_TYPEOF !== "typeof") require("fail"); - if(typeof CONST_FALSE !== "boolean") require("fail"); - if(typeof CONST_FUNCTION !== "function") require("fail"); - if(typeof CONST_OBJECT !== "object") require("fail"); - if(!CONST_OBJECT.A) require("fail"); - if(typeof CONST_OBJECT.A !== "number") require("fail"); - }); -}); -exports.library2 = {ok: true}; - -// it should not fail if comment in last line diff --git a/test/browsertest/node_modules/library2/lib/test.js b/test/browsertest/node_modules/library2/lib/test.js deleted file mode 100644 index 8c6312c6194..00000000000 --- a/test/browsertest/node_modules/library2/lib/test.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = "test module"; \ No newline at end of file diff --git a/test/browsertest/node_modules/library2/node_modules/submodule1/index.js b/test/browsertest/node_modules/library2/node_modules/submodule1/index.js deleted file mode 100644 index 6146f49ad9e..00000000000 --- a/test/browsertest/node_modules/library2/node_modules/submodule1/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = "submodule1"; \ No newline at end of file diff --git a/test/browsertest/node_modules/library2/node_modules/submodule2/index.js b/test/browsertest/node_modules/library2/node_modules/submodule2/index.js deleted file mode 100644 index 854f740abac..00000000000 --- a/test/browsertest/node_modules/library2/node_modules/submodule2/index.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = (function() { - return "submodule2"; -}()); \ No newline at end of file diff --git a/test/browsertest/node_modules/library2/node_modules/submodule3/index.js b/test/browsertest/node_modules/library2/node_modules/submodule3/index.js deleted file mode 100644 index cd3d6c18e3b..00000000000 --- a/test/browsertest/node_modules/library2/node_modules/submodule3/index.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = function() { - return "submodule3"; -}; \ No newline at end of file diff --git a/test/browsertest/node_modules/library2/package.json b/test/browsertest/node_modules/library2/package.json deleted file mode 100644 index 08afe53b591..00000000000 --- a/test/browsertest/node_modules/library2/package.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "main": "lib/main.js" -} \ No newline at end of file diff --git a/test/browsertest/node_modules/library2b.js b/test/browsertest/node_modules/library2b.js deleted file mode 100644 index 64d1a8eacd7..00000000000 --- a/test/browsertest/node_modules/library2b.js +++ /dev/null @@ -1,5 +0,0 @@ -describe("library2b", function() { - it("should load this library", function() { - expect(true).toBe(true); - }); -}); diff --git a/test/browsertest/node_modules/subcontent/index.js b/test/browsertest/node_modules/subcontent/index.js deleted file mode 100644 index be030028740..00000000000 --- a/test/browsertest/node_modules/subcontent/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = "error"; \ No newline at end of file diff --git a/test/browsertest/node_modules/subcontent/test.jade b/test/browsertest/node_modules/subcontent/test.jade deleted file mode 100644 index 268f09adac5..00000000000 --- a/test/browsertest/node_modules/subcontent/test.jade +++ /dev/null @@ -1 +0,0 @@ -xyz: abc \ No newline at end of file diff --git a/test/browsertest/node_modules/subcontent2/file.js b/test/browsertest/node_modules/subcontent2/file.js deleted file mode 100644 index 249c1aed41b..00000000000 --- a/test/browsertest/node_modules/subcontent2/file.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = "original"; \ No newline at end of file diff --git a/test/browsertest/node_modules/submodule3/index.js b/test/browsertest/node_modules/submodule3/index.js deleted file mode 100644 index cd3d6c18e3b..00000000000 --- a/test/browsertest/node_modules/submodule3/index.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = function() { - return "submodule3"; -}; \ No newline at end of file diff --git a/test/browsertest/package.json b/test/browsertest/package.json deleted file mode 100644 index b74c9f27674..00000000000 --- a/test/browsertest/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "node-webkit-tests", - "main": "tests.html" -} \ No newline at end of file diff --git a/test/browsertest/tests.html b/test/browsertest/tests.html deleted file mode 100644 index ba91c9d8e83..00000000000 --- a/test/browsertest/tests.html +++ /dev/null @@ -1,46 +0,0 @@ - - - Mocha - - - - - - - - - - - - -
    -
      -
    • -

      styling

      -
        -
      • -

        style!css loader

        -
      • -
      • -

        style!less loader

        -
      • -
      • -

        file loader:

        -
      • -
      -
    -
    - - - diff --git a/test/browsertest/web_modules/subcontent/index.js b/test/browsertest/web_modules/subcontent/index.js deleted file mode 100644 index c4efbc880dc..00000000000 --- a/test/browsertest/web_modules/subcontent/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = "replaced"; \ No newline at end of file diff --git a/test/browsertest/webpack.config.js b/test/browsertest/webpack.config.js deleted file mode 100644 index ee9f01b36c8..00000000000 --- a/test/browsertest/webpack.config.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = { - resolve: { - modules: ["web_modules", "node_modules"], - extensions: [".json", ".web.js", ".js"] - }, - resolveLoader: { - extensions: [ - ".json", - ".webpack-loader.js", - ".web-loader.js", - ".loader.js", - ".js" - ], - mainFields: ["webpackLoader", "loader", "main"] - } -}; diff --git a/test/cases/amd/define-needs-module/index.js b/test/cases/amd/define-needs-module/index.js new file mode 100644 index 00000000000..3aeb9539ce9 --- /dev/null +++ b/test/cases/amd/define-needs-module/index.js @@ -0,0 +1,3 @@ +it("should have runtime requirement on module with define", () => { + expect(require("./module")).toBe(42); +}); diff --git a/test/cases/amd/define-needs-module/module.js b/test/cases/amd/define-needs-module/module.js new file mode 100644 index 00000000000..d83845079f6 --- /dev/null +++ b/test/cases/amd/define-needs-module/module.js @@ -0,0 +1,3 @@ +define([], function () { + return 42; +}); diff --git a/test/cases/async-modules/double-import/a.js b/test/cases/async-modules/double-import/a.js new file mode 100644 index 00000000000..1f752aa2b54 --- /dev/null +++ b/test/cases/async-modules/double-import/a.js @@ -0,0 +1,3 @@ +import x from "./shared"; + +export default x + " world"; diff --git a/test/cases/async-modules/double-import/b.js b/test/cases/async-modules/double-import/b.js new file mode 100644 index 00000000000..1f752aa2b54 --- /dev/null +++ b/test/cases/async-modules/double-import/b.js @@ -0,0 +1,3 @@ +import x from "./shared"; + +export default x + " world"; diff --git a/test/cases/async-modules/double-import/index.js b/test/cases/async-modules/double-import/index.js new file mode 100644 index 00000000000..d84fc8076af --- /dev/null +++ b/test/cases/async-modules/double-import/index.js @@ -0,0 +1,4 @@ +it("should allow to import an async module twice", async () => { + const result = await require("./main"); + expect(result.default).toBe("hello world, hello world"); +}); diff --git a/test/cases/async-modules/double-import/main.js b/test/cases/async-modules/double-import/main.js new file mode 100644 index 00000000000..2bd775ed752 --- /dev/null +++ b/test/cases/async-modules/double-import/main.js @@ -0,0 +1,4 @@ +import a from "./a"; +import b from "./b"; + +export default a + ", " + b; diff --git a/test/cases/async-modules/double-import/shared.js b/test/cases/async-modules/double-import/shared.js new file mode 100644 index 00000000000..6d4c734a406 --- /dev/null +++ b/test/cases/async-modules/double-import/shared.js @@ -0,0 +1,3 @@ +await 1; +await 1; +export default "hello"; diff --git a/test/cases/async-modules/issue-16097/index.js b/test/cases/async-modules/issue-16097/index.js new file mode 100644 index 00000000000..d0fc5d626e1 --- /dev/null +++ b/test/cases/async-modules/issue-16097/index.js @@ -0,0 +1,6 @@ +import i, { foo } from "./won't-run-tla"; + +it("should have value imported from won't-run-tla", async () => { + expect(i).toBe(42); + expect(foo).toBe(undefined); +}); diff --git a/test/cases/async-modules/issue-16097/won't-run-tla.js b/test/cases/async-modules/issue-16097/won't-run-tla.js new file mode 100644 index 00000000000..786e32c1cf3 --- /dev/null +++ b/test/cases/async-modules/issue-16097/won't-run-tla.js @@ -0,0 +1,4 @@ +global.someNonExistentVariable && await 'test'; +const foo = global.otherSomeNonExistentVariable && await 43; +export default 42; +export { foo } diff --git a/test/cases/async-modules/micro-ticks-parents/case-a/a.js b/test/cases/async-modules/micro-ticks-parents/case-a/a.js new file mode 100644 index 00000000000..6c88c077d25 --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-a/a.js @@ -0,0 +1,4 @@ +import { report } from "../tick"; +import "./async"; + +report("a"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-a/async.js b/test/cases/async-modules/micro-ticks-parents/case-a/async.js new file mode 100644 index 00000000000..55b880d32d7 --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-a/async.js @@ -0,0 +1,7 @@ +import { report } from "../tick"; + +report("async before"); +await 0; +report("async middle"); +await 0; +report("async after"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-a/async2.js b/test/cases/async-modules/micro-ticks-parents/case-a/async2.js new file mode 100644 index 00000000000..a8c32bf207d --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-a/async2.js @@ -0,0 +1,8 @@ +import { report } from "../tick"; +import "./d"; + +report("async2 before"); +await 0; +report("async2 middle"); +await 0; +report("async2 after"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-a/b.js b/test/cases/async-modules/micro-ticks-parents/case-a/b.js new file mode 100644 index 00000000000..1050f1e6b0f --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-a/b.js @@ -0,0 +1,4 @@ +import { report } from "../tick"; +import "./async"; + +report("b"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-a/c.js b/test/cases/async-modules/micro-ticks-parents/case-a/c.js new file mode 100644 index 00000000000..27c7393a5e5 --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-a/c.js @@ -0,0 +1,4 @@ +import { report } from "../tick"; +import "./b"; + +report("c"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-a/d.js b/test/cases/async-modules/micro-ticks-parents/case-a/d.js new file mode 100644 index 00000000000..5504843a03a --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-a/d.js @@ -0,0 +1,5 @@ +import { report } from "../tick"; +import "./c"; +import "./a"; + +report("d"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-a/e.js b/test/cases/async-modules/micro-ticks-parents/case-a/e.js new file mode 100644 index 00000000000..99a47c40126 --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-a/e.js @@ -0,0 +1,3 @@ +import { report } from "../tick"; + +report("e"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-a/f.js b/test/cases/async-modules/micro-ticks-parents/case-a/f.js new file mode 100644 index 00000000000..164afe36e72 --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-a/f.js @@ -0,0 +1,5 @@ +import { report } from "../tick"; +import "./e"; +import "./async2"; + +report("f"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-b/a.js b/test/cases/async-modules/micro-ticks-parents/case-b/a.js new file mode 100644 index 00000000000..1aab5f01bf9 --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-b/a.js @@ -0,0 +1,5 @@ +import { report } from "../tick"; +import "./async"; +import "./b"; + +report("a"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-b/async.js b/test/cases/async-modules/micro-ticks-parents/case-b/async.js new file mode 100644 index 00000000000..55b880d32d7 --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-b/async.js @@ -0,0 +1,7 @@ +import { report } from "../tick"; + +report("async before"); +await 0; +report("async middle"); +await 0; +report("async after"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-b/b.js b/test/cases/async-modules/micro-ticks-parents/case-b/b.js new file mode 100644 index 00000000000..9293c13214e --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-b/b.js @@ -0,0 +1,4 @@ +import { report } from "../tick"; +import "./c"; + +report("b"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-b/c.js b/test/cases/async-modules/micro-ticks-parents/case-b/c.js new file mode 100644 index 00000000000..b5f21ba1d0f --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-b/c.js @@ -0,0 +1,4 @@ +import { report } from "../tick"; +import "./async"; + +report("c"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-b/d.js b/test/cases/async-modules/micro-ticks-parents/case-b/d.js new file mode 100644 index 00000000000..b3e9ae43b7a --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-b/d.js @@ -0,0 +1,4 @@ +import { report } from "../tick"; +import "./c"; + +report("d"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-b/e.js b/test/cases/async-modules/micro-ticks-parents/case-b/e.js new file mode 100644 index 00000000000..9a4b1c21dae --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-b/e.js @@ -0,0 +1,9 @@ +import { report } from "../tick"; +import "./a"; +import "./d"; + +report("async before"); +await 0; +report("async middle"); +await 0; +report("async after"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-c/a.js b/test/cases/async-modules/micro-ticks-parents/case-c/a.js new file mode 100644 index 00000000000..877d993baaa --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-c/a.js @@ -0,0 +1,7 @@ +import { report } from "../tick"; +import "./b"; +import "./a"; + +report("a before"); +await 0; +report("a after"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-c/b.js b/test/cases/async-modules/micro-ticks-parents/case-c/b.js new file mode 100644 index 00000000000..0df467a5289 --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-c/b.js @@ -0,0 +1,3 @@ +import { report } from "../tick"; + +report("b"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-d/a.js b/test/cases/async-modules/micro-ticks-parents/case-d/a.js new file mode 100644 index 00000000000..4294285ef4f --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-d/a.js @@ -0,0 +1,6 @@ +import { report } from "../tick"; +import "./b"; + +report("a before"); +await 0; +report("a after"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-d/b.js b/test/cases/async-modules/micro-ticks-parents/case-d/b.js new file mode 100644 index 00000000000..36e0a25f177 --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-d/b.js @@ -0,0 +1,6 @@ +import { report } from "../tick"; +import "./c"; + +report("b before"); +await 0; +report("b after"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-d/c.js b/test/cases/async-modules/micro-ticks-parents/case-d/c.js new file mode 100644 index 00000000000..c68d0d55dd3 --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-d/c.js @@ -0,0 +1,6 @@ +import { report } from "../tick"; +import "./a"; + +report("c before"); +await 0; +report("c after"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-d/index.js b/test/cases/async-modules/micro-ticks-parents/case-d/index.js new file mode 100644 index 00000000000..4b95c3afa80 --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-d/index.js @@ -0,0 +1,5 @@ +import { report } from "../tick"; +import "./x"; +import "./y"; + +report("index"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-d/x.js b/test/cases/async-modules/micro-ticks-parents/case-d/x.js new file mode 100644 index 00000000000..225365bd07c --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-d/x.js @@ -0,0 +1,4 @@ +import { report } from "../tick"; +import "./a"; + +report("x"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-d/y.js b/test/cases/async-modules/micro-ticks-parents/case-d/y.js new file mode 100644 index 00000000000..bddaecf205f --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-d/y.js @@ -0,0 +1,4 @@ +import { report } from "../tick"; +import "./b"; + +report("y"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-e/a.js b/test/cases/async-modules/micro-ticks-parents/case-e/a.js new file mode 100644 index 00000000000..6c88c077d25 --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-e/a.js @@ -0,0 +1,4 @@ +import { report } from "../tick"; +import "./async"; + +report("a"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-e/async.js b/test/cases/async-modules/micro-ticks-parents/case-e/async.js new file mode 100644 index 00000000000..55b880d32d7 --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-e/async.js @@ -0,0 +1,7 @@ +import { report } from "../tick"; + +report("async before"); +await 0; +report("async middle"); +await 0; +report("async after"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-e/b.js b/test/cases/async-modules/micro-ticks-parents/case-e/b.js new file mode 100644 index 00000000000..1050f1e6b0f --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-e/b.js @@ -0,0 +1,4 @@ +import { report } from "../tick"; +import "./async"; + +report("b"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-e/index.js b/test/cases/async-modules/micro-ticks-parents/case-e/index.js new file mode 100644 index 00000000000..fe9ae799632 --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-e/index.js @@ -0,0 +1,6 @@ +import { report } from "../tick"; +import "./a"; +import "./b"; +import "./x"; + +report("index"); diff --git a/test/cases/async-modules/micro-ticks-parents/case-e/x.js b/test/cases/async-modules/micro-ticks-parents/case-e/x.js new file mode 100644 index 00000000000..225365bd07c --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/case-e/x.js @@ -0,0 +1,4 @@ +import { report } from "../tick"; +import "./a"; + +report("x"); diff --git a/test/cases/async-modules/micro-ticks-parents/index.js b/test/cases/async-modules/micro-ticks-parents/index.js new file mode 100644 index 00000000000..9739fb6981e --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/index.js @@ -0,0 +1,74 @@ +import * as tick from "./tick"; + +it("should execute async modules in to correct order and without additional ticks (case a)", async () => { + tick.start(); + await require("./case-a/f"); + expect(tick.stop()).toEqual([ + "e 0", + "async before 0", + "async middle 1", + "async after 2", + "b 3", + "c 3", + "a 3", + "d 3", + "async2 before 3", + "async2 middle 4", + "async2 after 5", + "f 6" + ]); +}); + +it("should execute async modules in to correct order and without additional ticks (case b)", async () => { + tick.start(); + await require("./case-b/e"); + expect(tick.stop()).toEqual([ + "async before 0", + "async middle 1", + "async after 2", + "c 3", + "b 3", + "a 3", + "d 3", + "async before 3", + "async middle 4", + "async after 5" + ]); +}); + +it("should execute async modules in to correct order and without additional ticks (case c)", async () => { + tick.start(); + await require("./case-c/a"); + expect(tick.stop()).toEqual(["b 0", "a before 0", "a after 1"]); +}); + +it("should execute async modules in to correct order and without additional ticks (case d)", async () => { + tick.start(); + await require("./case-d/index"); + expect(tick.stop()).toEqual([ + "c before 0", + "c after 1", + "b before 2", + "b after 3", + "a before 4", + "a after 5", + "x 6", + "y 6", + "index 6" + ]); +}); + +it("should execute async modules in to correct order and without additional ticks (case e)", async () => { + tick.start(); + await require("./case-e/index"); + expect(tick.stop()).toEqual([ + "async before 0", + "async middle 1", + "async after 2", + "a 3", + // see https://github.com/tc39/proposal-top-level-await/issues/158 + "b 3", + "x 3", + "index 3" + ]); +}); diff --git a/test/cases/async-modules/micro-ticks-parents/test.filter.js b/test/cases/async-modules/micro-ticks-parents/test.filter.js new file mode 100644 index 00000000000..068f4ef62c5 --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/test.filter.js @@ -0,0 +1,4 @@ +module.exports = function (config) { + // In node 10 v8 has a bug which inserts an additional micro-tick into async functions + return !process.version.startsWith("v10."); +}; diff --git a/test/cases/async-modules/micro-ticks-parents/tick.js b/test/cases/async-modules/micro-ticks-parents/tick.js new file mode 100644 index 00000000000..41dc0a8f04a --- /dev/null +++ b/test/cases/async-modules/micro-ticks-parents/tick.js @@ -0,0 +1,19 @@ +export let currentTick = 0; +export const report = name => { + entries.push(`${name} ${currentTick}`); +}; +export let entries = []; +let running = false; +export const start = async () => { + entries = []; + running = true; + currentTick = 0; + while (running) { + await 0; + currentTick++; + } +}; +export const stop = () => { + running = false; + return entries; +}; diff --git a/test/cases/async-modules/reexport-unknown/async-unknown.js b/test/cases/async-modules/reexport-unknown/async-unknown.js new file mode 100644 index 00000000000..ca2eb248ac7 --- /dev/null +++ b/test/cases/async-modules/reexport-unknown/async-unknown.js @@ -0,0 +1,3 @@ +export * from "./unknown.js"; + +await 1; diff --git a/test/cases/async-modules/reexport-unknown/index.js b/test/cases/async-modules/reexport-unknown/index.js new file mode 100644 index 00000000000..303a8df3157 --- /dev/null +++ b/test/cases/async-modules/reexport-unknown/index.js @@ -0,0 +1,2 @@ +it("should handle re-export from async modules correctly", () => + import("./test.js")); diff --git a/test/cases/async-modules/reexport-unknown/reexport-async-unknown.js b/test/cases/async-modules/reexport-unknown/reexport-async-unknown.js new file mode 100644 index 00000000000..49ae13b84c1 --- /dev/null +++ b/test/cases/async-modules/reexport-unknown/reexport-async-unknown.js @@ -0,0 +1,3 @@ +export * from "./async-unknown.js"; +export { a } from "./async-unknown.js"; +export default "default"; diff --git a/test/cases/async-modules/reexport-unknown/test.js b/test/cases/async-modules/reexport-unknown/test.js new file mode 100644 index 00000000000..3d5ccedf9d9 --- /dev/null +++ b/test/cases/async-modules/reexport-unknown/test.js @@ -0,0 +1,23 @@ +import * as ns from "./reexport-async-unknown.js?ns"; +import { a, b, c } from "./reexport-async-unknown.js?named"; +import value from "./reexport-async-unknown.js?default"; + +function nsObj(m) { + Object.defineProperty(m, Symbol.toStringTag, { value: "Module" }); + return m; +} + +expect(ns).toEqual( + nsObj({ + default: "default", + a: "a", + b: "b", + c: "c" + }) +); + +expect(a).toBe("a"); +expect(b).toBe("b"); +expect(c).toBe("c"); + +expect(value).toBe("default"); diff --git a/test/cases/async-modules/reexport-unknown/unknown.js b/test/cases/async-modules/reexport-unknown/unknown.js new file mode 100644 index 00000000000..293d229b741 --- /dev/null +++ b/test/cases/async-modules/reexport-unknown/unknown.js @@ -0,0 +1,7 @@ +const o = { + a: "a", + b: "b", + c: "c" +}; + +module.exports = Object(o); diff --git a/test/cases/async-modules/runtime-performance/async.js b/test/cases/async-modules/runtime-performance/async.js new file mode 100644 index 00000000000..03ed4ae4663 --- /dev/null +++ b/test/cases/async-modules/runtime-performance/async.js @@ -0,0 +1,2 @@ +await 1; +export default 1; diff --git a/test/cases/async-modules/runtime-performance/index.js b/test/cases/async-modules/runtime-performance/index.js new file mode 100644 index 00000000000..1aca8000cd4 --- /dev/null +++ b/test/cases/async-modules/runtime-performance/index.js @@ -0,0 +1,5 @@ +it("should not take too long to evaluate nested async modules", async () => { + const start = Date.now(); + await import(/* webpackMode: "eager" */ "./loader.js?i=40!./loader.js"); + expect(Date.now() - start).toBeLessThan(100); +}); diff --git a/test/cases/async-modules/runtime-performance/loader.js b/test/cases/async-modules/runtime-performance/loader.js new file mode 100644 index 00000000000..ea46f2bea9b --- /dev/null +++ b/test/cases/async-modules/runtime-performance/loader.js @@ -0,0 +1,14 @@ +/** @type {import("../../../../").LoaderDefinition<{ i: string }>} */ +module.exports = function () { + const options = this.getOptions(); + const i = +options.i; + let src = `import n from "./async.js";\n`; + if (i > 0) { + src += `import a from "./loader.js?i=${i - 1}&a!./loader.js";\n`; + src += `import b from "./loader.js?i=${i - 1}&b!./loader.js";\n`; + src += `export default n + a + b;\n`; + } else { + src += `export default n;\n`; + } + return src; +}; diff --git a/test/cases/async-modules/top-level-await-without-export/index.js b/test/cases/async-modules/top-level-await-without-export/index.js new file mode 100644 index 00000000000..9c2c9837547 --- /dev/null +++ b/test/cases/async-modules/top-level-await-without-export/index.js @@ -0,0 +1,14 @@ +let value = 0; + +it("should not crash when top level await is used without export", () => { + // wait for itself + return require.cache[module.id].exports.then(() => { + expect(value).toBe(42); + }); +}); + +await new Promise(r => setTimeout(r, 100)); + +value = 42; + +export {}; diff --git a/test/cases/async-modules/top-level-await/index.js b/test/cases/async-modules/top-level-await/index.js new file mode 100644 index 00000000000..be6d8d1ebb3 --- /dev/null +++ b/test/cases/async-modules/top-level-await/index.js @@ -0,0 +1,6 @@ +it("should allow to use top-level-await", () => { + return import("./reexport").then(({ default: value, other }) => { + expect(value).toBe(42); + expect(other).toBe(42); + }); +}); diff --git a/test/cases/async-modules/top-level-await/module.js b/test/cases/async-modules/top-level-await/module.js new file mode 100644 index 00000000000..4028937e713 --- /dev/null +++ b/test/cases/async-modules/top-level-await/module.js @@ -0,0 +1,3 @@ +await new Promise(r => setTimeout(r, 100)); + +export default 42; diff --git a/test/cases/async-modules/top-level-await/reexport.js b/test/cases/async-modules/top-level-await/reexport.js new file mode 100644 index 00000000000..55f47925e24 --- /dev/null +++ b/test/cases/async-modules/top-level-await/reexport.js @@ -0,0 +1,4 @@ +export { default } from "./module"; +import value from "./module"; + +export const other = value; diff --git a/test/cases/async-modules/top-level-error/counter.js b/test/cases/async-modules/top-level-error/counter.js new file mode 100644 index 00000000000..45158af96f0 --- /dev/null +++ b/test/cases/async-modules/top-level-error/counter.js @@ -0,0 +1,6 @@ +await 1; +let value = 0; +export const count = () => { + value++; + return value; +}; diff --git a/test/cases/async-modules/top-level-error/index.js b/test/cases/async-modules/top-level-error/index.js new file mode 100644 index 00000000000..087fd08a1e9 --- /dev/null +++ b/test/cases/async-modules/top-level-error/index.js @@ -0,0 +1,49 @@ +it("should allow to import an rejected async module again", async () => { + await expect(require("./main")).rejects.toEqual( + expect.objectContaining({ + message: expect.stringContaining("expected rejection 1") + }) + ); + await expect(require("./module")).rejects.toEqual( + expect.objectContaining({ + message: expect.stringContaining("expected rejection 1") + }) + ); + await expect(require("./module?2")).rejects.toEqual( + expect.objectContaining({ + message: expect.stringContaining("expected rejection 2") + }) + ); + await expect(require("./reexport?2")).rejects.toEqual( + expect.objectContaining({ + message: expect.stringContaining("expected rejection 1") + }) + ); + try { + require("./script") + } catch (e) { + expect.stringContaining("expected rejection 1") + } + try { + require("./script-reexport") + } catch (e) { + expect.stringContaining("expected rejection 1") + } + await Promise.all([ + expect(require("./module?3")).rejects.toEqual( + expect.objectContaining({ + message: expect.stringContaining("expected rejection 3") + }) + ), + expect(require("./module?4")).rejects.toEqual( + expect.objectContaining({ + message: expect.stringContaining("expected rejection 4") + }) + ), + expect(require("./module?5")).rejects.toEqual( + expect.objectContaining({ + message: expect.stringContaining("expected rejection 5") + }) + ) + ]); +}); diff --git a/test/cases/async-modules/top-level-error/main.js b/test/cases/async-modules/top-level-error/main.js new file mode 100644 index 00000000000..bfc4f032eea --- /dev/null +++ b/test/cases/async-modules/top-level-error/main.js @@ -0,0 +1,2 @@ +export { default as a } from "./reexport"; +export { default as b } from "./module?2"; diff --git a/test/cases/async-modules/top-level-error/module.js b/test/cases/async-modules/top-level-error/module.js new file mode 100644 index 00000000000..e8096da821a --- /dev/null +++ b/test/cases/async-modules/top-level-error/module.js @@ -0,0 +1,6 @@ +import { count } from "./counter"; + +const c = count(); +throw new Error("expected rejection " + c); + +export default "ok"; diff --git a/test/cases/async-modules/top-level-error/reexport.js b/test/cases/async-modules/top-level-error/reexport.js new file mode 100644 index 00000000000..b29130d0f5f --- /dev/null +++ b/test/cases/async-modules/top-level-error/reexport.js @@ -0,0 +1 @@ +export { default as default } from "./module"; diff --git a/test/cases/async-modules/top-level-error/script-reexport.js b/test/cases/async-modules/top-level-error/script-reexport.js new file mode 100644 index 00000000000..61128b5ab5f --- /dev/null +++ b/test/cases/async-modules/top-level-error/script-reexport.js @@ -0,0 +1 @@ +module.exports = require("./script"); diff --git a/test/cases/async-modules/top-level-error/script.js b/test/cases/async-modules/top-level-error/script.js new file mode 100644 index 00000000000..b363d6d1ed9 --- /dev/null +++ b/test/cases/async-modules/top-level-error/script.js @@ -0,0 +1,4 @@ +const c = 1; +throw new Error("expected rejection " + c); + +module.exports = "ok"; diff --git a/test/cases/chunks/context-weak/index.js b/test/cases/chunks/context-weak/index.js index 65aa0c58c1d..e4f711141f5 100644 --- a/test/cases/chunks/context-weak/index.js +++ b/test/cases/chunks/context-weak/index.js @@ -5,6 +5,17 @@ it("should not bundle context requires with asyncMode === 'weak'", function() { }).toThrowError(/not available/); }); +it("should not bundle context requires with asyncMode === 'weak' using import.meta.webpackContext", function() { + const contextRequire = import.meta.webpackContext(".", { + recursive: false, + regExp: /two/, + mode: "weak" + }); + expect(function() { + contextRequire("./two") + }).toThrowError(/not available/); +}); + it("should find module with asyncMode === 'weak' when required elsewhere", function() { var contextRequire = require.context(".", false, /.+/, "weak"); expect(contextRequire("./three")).toBe(3); diff --git a/test/cases/chunks/destructuring-assignment/dir1/a.js b/test/cases/chunks/destructuring-assignment/dir1/a.js new file mode 100644 index 00000000000..ce622ee6530 --- /dev/null +++ b/test/cases/chunks/destructuring-assignment/dir1/a.js @@ -0,0 +1,3 @@ +export const a = 1; +export default 3; +export const usedExports = __webpack_exports_info__.usedExports; diff --git a/test/cases/chunks/destructuring-assignment/dir2/a.js b/test/cases/chunks/destructuring-assignment/dir2/a.js new file mode 100644 index 00000000000..59aa6ffd125 --- /dev/null +++ b/test/cases/chunks/destructuring-assignment/dir2/a.js @@ -0,0 +1,2 @@ +exports.a = 1; +exports.b = 2; diff --git a/test/cases/chunks/destructuring-assignment/dir2/json/array.json b/test/cases/chunks/destructuring-assignment/dir2/json/array.json new file mode 100644 index 00000000000..eac5f7b46e0 --- /dev/null +++ b/test/cases/chunks/destructuring-assignment/dir2/json/array.json @@ -0,0 +1 @@ +["a"] \ No newline at end of file diff --git a/test/cases/chunks/destructuring-assignment/dir2/json/object.json b/test/cases/chunks/destructuring-assignment/dir2/json/object.json new file mode 100644 index 00000000000..cb5b2f69bab --- /dev/null +++ b/test/cases/chunks/destructuring-assignment/dir2/json/object.json @@ -0,0 +1 @@ +{"a": 1} diff --git a/test/cases/chunks/destructuring-assignment/dir2/json/primitive.json b/test/cases/chunks/destructuring-assignment/dir2/json/primitive.json new file mode 100644 index 00000000000..231f150c579 --- /dev/null +++ b/test/cases/chunks/destructuring-assignment/dir2/json/primitive.json @@ -0,0 +1 @@ +"a" diff --git a/test/cases/chunks/destructuring-assignment/dir3/a.js b/test/cases/chunks/destructuring-assignment/dir3/a.js new file mode 100644 index 00000000000..59aa6ffd125 --- /dev/null +++ b/test/cases/chunks/destructuring-assignment/dir3/a.js @@ -0,0 +1,2 @@ +exports.a = 1; +exports.b = 2; diff --git a/test/cases/chunks/destructuring-assignment/dir3/json/array.json b/test/cases/chunks/destructuring-assignment/dir3/json/array.json new file mode 100644 index 00000000000..eac5f7b46e0 --- /dev/null +++ b/test/cases/chunks/destructuring-assignment/dir3/json/array.json @@ -0,0 +1 @@ +["a"] \ No newline at end of file diff --git a/test/cases/chunks/destructuring-assignment/dir3/json/object.json b/test/cases/chunks/destructuring-assignment/dir3/json/object.json new file mode 100644 index 00000000000..cb5b2f69bab --- /dev/null +++ b/test/cases/chunks/destructuring-assignment/dir3/json/object.json @@ -0,0 +1 @@ +{"a": 1} diff --git a/test/cases/chunks/destructuring-assignment/dir3/json/primitive.json b/test/cases/chunks/destructuring-assignment/dir3/json/primitive.json new file mode 100644 index 00000000000..231f150c579 --- /dev/null +++ b/test/cases/chunks/destructuring-assignment/dir3/json/primitive.json @@ -0,0 +1 @@ +"a" diff --git a/test/cases/chunks/destructuring-assignment/index.js b/test/cases/chunks/destructuring-assignment/index.js new file mode 100644 index 00000000000..84e14ff4d3e --- /dev/null +++ b/test/cases/chunks/destructuring-assignment/index.js @@ -0,0 +1,36 @@ +it("should load only used exports", async (done) => { + const { default: def, usedExports } = await import("./dir1/a"); + expect(def).toBe(3); + expect(usedExports).toEqual(["default", "usedExports"]); + done(); +}); + +it("should get warning on using 'webpackExports' with destructuring assignment", async (done) => { + const { default: def } = await import(/* webpackExports: ["a"] */"./dir1/a?2"); + expect(def).toBe(3); + done(); +}); + +it("should not tree-shake default export for exportsType=default module", async () => { + const { default: object } = await import("./dir2/json/object.json"); + const { default: array } = await import("./dir2/json/array.json"); + const { default: primitive } = await import("./dir2/json/primitive.json"); + expect(object).toEqual({ a: 1 }); + expect(array).toEqual(["a"]); + expect(primitive).toBe("a"); + const { default: a } = await import("./dir2/a"); + expect(a).toEqual({ a: 1, b: 2 }); +}); + +it("should not tree-shake default export for exportsType=default context module", async () => { + const dir = "json"; + const { default: object } = await import(`./dir3/${dir}/object.json`); + const { default: array } = await import(`./dir3/${dir}/array.json`); + const { default: primitive } = await import(`./dir3/${dir}/primitive.json`); + expect(object).toEqual({ a: 1 }); + expect(array).toEqual(["a"]); + expect(primitive).toBe("a"); + const file = "a"; + const { default: a } = await import(`./dir3/${file}`); + expect(a).toEqual({ a: 1, b: 2 }); +}); diff --git a/test/cases/chunks/destructuring-assignment/test.filter.js b/test/cases/chunks/destructuring-assignment/test.filter.js new file mode 100644 index 00000000000..f176154b261 --- /dev/null +++ b/test/cases/chunks/destructuring-assignment/test.filter.js @@ -0,0 +1,4 @@ +module.exports = function (config) { + // This test can't run in development mode + return config.mode !== "development"; +}; diff --git a/test/cases/chunks/destructuring-assignment/warnings.js b/test/cases/chunks/destructuring-assignment/warnings.js new file mode 100644 index 00000000000..f2a8d6f3837 --- /dev/null +++ b/test/cases/chunks/destructuring-assignment/warnings.js @@ -0,0 +1,3 @@ +module.exports = [ + [/`webpackExports` could not be used with destructuring assignment./] +]; diff --git a/test/cases/chunks/import-circle/index.js b/test/cases/chunks/import-circle/index.js index feb7bc8b726..ceeaef77f27 100644 --- a/test/cases/chunks/import-circle/index.js +++ b/test/cases/chunks/import-circle/index.js @@ -1,15 +1,11 @@ -import leftHelix from './leftHelix'; -import rightHelix from './rightHelix'; +import leftHelix from "./leftHelix"; +import rightHelix from "./rightHelix"; -it("should import generate ensure function for this", () => -{ - return Promise.all([ - leftHelix.run(), - rightHelix.run() - ]); +it("should import generate ensure function for this", () => { + return Promise.all([leftHelix.run(), rightHelix.run()]); }); export default { - leftHelix, - rightHelix, + leftHelix, + rightHelix }; diff --git a/test/cases/chunks/import-circle/leftHelix.js b/test/cases/chunks/import-circle/leftHelix.js index 455e0daebf8..d918b1d3fca 100644 --- a/test/cases/chunks/import-circle/leftHelix.js +++ b/test/cases/chunks/import-circle/leftHelix.js @@ -1,4 +1,4 @@ -import leftHelixPrime, { run } from './leftHelixPrime'; +import leftHelixPrime, { run } from "./leftHelixPrime"; export default { leftHelixPrime, diff --git a/test/cases/chunks/import-circle/leftHelixPrime.js b/test/cases/chunks/import-circle/leftHelixPrime.js index 9b720f2d1fe..189106a9f59 100644 --- a/test/cases/chunks/import-circle/leftHelixPrime.js +++ b/test/cases/chunks/import-circle/leftHelixPrime.js @@ -1,9 +1,9 @@ -import rightHelixPrime from './rightHelixPrime'; +import rightHelixPrime from "./rightHelixPrime"; export function run() { - return import(/* webpackChunkName: "left" */ './leftHelix'); + return import(/* webpackChunkName: "left" */ "./leftHelix"); } export default { - rightHelixPrime, + rightHelixPrime: () => rightHelixPrime }; diff --git a/test/cases/chunks/import-circle/rightHelix.js b/test/cases/chunks/import-circle/rightHelix.js index 2fe50e79171..598a567fff0 100644 --- a/test/cases/chunks/import-circle/rightHelix.js +++ b/test/cases/chunks/import-circle/rightHelix.js @@ -1,6 +1,6 @@ -import rightHelixPrime, { run } from './rightHelixPrime'; +import rightHelixPrime, { run } from "./rightHelixPrime"; export default { rightHelixPrime, run -} +}; diff --git a/test/cases/chunks/import-circle/rightHelixPrime.js b/test/cases/chunks/import-circle/rightHelixPrime.js index 5657a7127e5..438ff9791a9 100644 --- a/test/cases/chunks/import-circle/rightHelixPrime.js +++ b/test/cases/chunks/import-circle/rightHelixPrime.js @@ -1,9 +1,9 @@ -import leftHelixPrime from './leftHelixPrime'; +import leftHelixPrime from "./leftHelixPrime"; export function run() { - return import(/* webpackChunkName: "right" */ './rightHelix'); + return import(/* webpackChunkName: "right" */ "./rightHelix"); } export default { - leftHelixPrime + leftHelixPrime: () => leftHelixPrime }; diff --git a/test/cases/chunks/import-context-exist-chunk/dir-initial-with-fake-map/initialModule.js b/test/cases/chunks/import-context-exist-chunk/dir-initial-with-fake-map/initialModule.js new file mode 100644 index 00000000000..341b43e9dfa --- /dev/null +++ b/test/cases/chunks/import-context-exist-chunk/dir-initial-with-fake-map/initialModule.js @@ -0,0 +1 @@ +export default "initialModuleDefault"; diff --git a/test/cases/chunks/import-context-exist-chunk/dir-initial-with-fake-map/initialModule2.js b/test/cases/chunks/import-context-exist-chunk/dir-initial-with-fake-map/initialModule2.js new file mode 100644 index 00000000000..4c27d0e9f9a --- /dev/null +++ b/test/cases/chunks/import-context-exist-chunk/dir-initial-with-fake-map/initialModule2.js @@ -0,0 +1 @@ +exports.default = "other"; diff --git a/test/cases/chunks/import-context-exist-chunk/dir-initial/initialModule.js b/test/cases/chunks/import-context-exist-chunk/dir-initial/initialModule.js new file mode 100644 index 00000000000..341b43e9dfa --- /dev/null +++ b/test/cases/chunks/import-context-exist-chunk/dir-initial/initialModule.js @@ -0,0 +1 @@ +export default "initialModuleDefault"; diff --git a/test/cases/chunks/import-context-exist-chunk/index.js b/test/cases/chunks/import-context-exist-chunk/index.js new file mode 100644 index 00000000000..8bdb5c77d2b --- /dev/null +++ b/test/cases/chunks/import-context-exist-chunk/index.js @@ -0,0 +1,17 @@ +it("should resolve when import existed chunk (#8626)", function(done) { + require.context("./dir-initial/"); + const fileName = "initialModule"; + import(`./dir-initial/${fileName}`).then(({default:m}) => { + expect(m).toBe("initialModuleDefault"); + done(); + }).catch(done); +}); + +it("should resolve when import existed chunk with fake maps", function(done) { + require.context("./dir-initial-with-fake-map/"); + const fileName = "initialModule"; + import(`./dir-initial-with-fake-map/${fileName}`).then(({default:m}) => { + expect(m).toBe("initialModuleDefault"); + done(); + }).catch(done); +}); diff --git a/test/cases/chunks/inline-options/dir12/a.js b/test/cases/chunks/inline-options/dir12/a.js new file mode 100644 index 00000000000..880c38a1988 --- /dev/null +++ b/test/cases/chunks/inline-options/dir12/a.js @@ -0,0 +1,9 @@ +export const c = "c"; + +export const d = "d"; + +export const longnameforexport = "longnameforexport"; + +export default "default2"; + +export const usedExports = __webpack_exports_info__.usedExports; diff --git a/test/cases/chunks/inline-options/dir13/a.js b/test/cases/chunks/inline-options/dir13/a.js new file mode 100644 index 00000000000..fbeecbd2065 --- /dev/null +++ b/test/cases/chunks/inline-options/dir13/a.js @@ -0,0 +1,7 @@ +export const c = "c"; + +export const d = "d"; + +export default "default2"; + +export const usedExports = __webpack_exports_info__.usedExports; diff --git a/test/cases/chunks/inline-options/dir13/b.js b/test/cases/chunks/inline-options/dir13/b.js new file mode 100644 index 00000000000..b73c5a615da --- /dev/null +++ b/test/cases/chunks/inline-options/dir13/b.js @@ -0,0 +1,7 @@ +export const a = "a"; + +export const b = "b"; + +export default "default"; + +export const usedExports = __webpack_exports_info__.usedExports; diff --git a/test/cases/chunks/inline-options/dir14/a.js b/test/cases/chunks/inline-options/dir14/a.js new file mode 100644 index 00000000000..e94fef18587 --- /dev/null +++ b/test/cases/chunks/inline-options/dir14/a.js @@ -0,0 +1 @@ +export default "a"; diff --git a/test/cases/chunks/inline-options/dir14/b.js b/test/cases/chunks/inline-options/dir14/b.js new file mode 100644 index 00000000000..eff703ff465 --- /dev/null +++ b/test/cases/chunks/inline-options/dir14/b.js @@ -0,0 +1 @@ +export default "b"; diff --git a/test/cases/chunks/inline-options/dir14/c.js b/test/cases/chunks/inline-options/dir14/c.js new file mode 100644 index 00000000000..5d50db5bc15 --- /dev/null +++ b/test/cases/chunks/inline-options/dir14/c.js @@ -0,0 +1 @@ +export default "c"; diff --git a/test/cases/chunks/inline-options/dir15/a.js b/test/cases/chunks/inline-options/dir15/a.js new file mode 100644 index 00000000000..59aa6ffd125 --- /dev/null +++ b/test/cases/chunks/inline-options/dir15/a.js @@ -0,0 +1,2 @@ +exports.a = 1; +exports.b = 2; diff --git a/test/cases/chunks/inline-options/dir15/json/array.json b/test/cases/chunks/inline-options/dir15/json/array.json new file mode 100644 index 00000000000..eac5f7b46e0 --- /dev/null +++ b/test/cases/chunks/inline-options/dir15/json/array.json @@ -0,0 +1 @@ +["a"] \ No newline at end of file diff --git a/test/cases/chunks/inline-options/dir15/json/object.json b/test/cases/chunks/inline-options/dir15/json/object.json new file mode 100644 index 00000000000..cb5b2f69bab --- /dev/null +++ b/test/cases/chunks/inline-options/dir15/json/object.json @@ -0,0 +1 @@ +{"a": 1} diff --git a/test/cases/chunks/inline-options/dir15/json/primitive.json b/test/cases/chunks/inline-options/dir15/json/primitive.json new file mode 100644 index 00000000000..231f150c579 --- /dev/null +++ b/test/cases/chunks/inline-options/dir15/json/primitive.json @@ -0,0 +1 @@ +"a" diff --git a/test/cases/chunks/inline-options/dir16/a.js b/test/cases/chunks/inline-options/dir16/a.js new file mode 100644 index 00000000000..59aa6ffd125 --- /dev/null +++ b/test/cases/chunks/inline-options/dir16/a.js @@ -0,0 +1,2 @@ +exports.a = 1; +exports.b = 2; diff --git a/test/cases/chunks/inline-options/dir16/json/array.json b/test/cases/chunks/inline-options/dir16/json/array.json new file mode 100644 index 00000000000..eac5f7b46e0 --- /dev/null +++ b/test/cases/chunks/inline-options/dir16/json/array.json @@ -0,0 +1 @@ +["a"] \ No newline at end of file diff --git a/test/cases/chunks/inline-options/dir16/json/object.json b/test/cases/chunks/inline-options/dir16/json/object.json new file mode 100644 index 00000000000..cb5b2f69bab --- /dev/null +++ b/test/cases/chunks/inline-options/dir16/json/object.json @@ -0,0 +1 @@ +{"a": 1} diff --git a/test/cases/chunks/inline-options/dir16/json/primitive.json b/test/cases/chunks/inline-options/dir16/json/primitive.json new file mode 100644 index 00000000000..231f150c579 --- /dev/null +++ b/test/cases/chunks/inline-options/dir16/json/primitive.json @@ -0,0 +1 @@ +"a" diff --git a/test/cases/chunks/inline-options/index.js b/test/cases/chunks/inline-options/index.js index def7f37a3bf..a217c3784cc 100644 --- a/test/cases/chunks/inline-options/index.js +++ b/test/cases/chunks/inline-options/index.js @@ -1,48 +1,56 @@ -it("should be able to use eager mode", function() { +it("should be able to use eager mode", function () { function load(name) { return import(/* webpackMode: "eager" */ "./dir1/" + name); } return testChunkLoading(load, true, true); }); -it("should be able to use lazy-once mode", function() { +it("should be able to use lazy-once mode", function () { function load(name) { return import(/* webpackMode: "lazy-once" */ "./dir2/" + name); } return testChunkLoading(load, false, true); }); -it("should be able to use lazy-once mode with name", function() { +it("should be able to use lazy-once mode with name", function () { function load(name) { - return import(/* webpackMode: "lazy-once", webpackChunkName: "name-lazy-once" */ "./dir3/" + name); + return import( + /* webpackMode: "lazy-once", webpackChunkName: "name-lazy-once" */ "./dir3/" + + name + ); } return testChunkLoading(load, false, true); }); -it("should be able to use lazy mode", function() { +it("should be able to use lazy mode", function () { function load(name) { return import(/* webpackMode: "lazy" */ "./dir4/" + name); } return testChunkLoading(load, false, false); }); -it("should be able to use lazy mode with name", function() { +it("should be able to use lazy mode with name", function () { function load(name) { - return import(/* webpackMode: "lazy", webpackChunkName: "name-lazy" */ "./dir5/" + name); + return import( + /* webpackMode: "lazy", webpackChunkName: "name-lazy" */ "./dir5/" + name + ); } return testChunkLoading(load, false, false); }); -it("should be able to use lazy mode with name and placeholder", function() { +it("should be able to use lazy mode with name and placeholder", function () { function load(name) { - return import(/* webpackMode: "lazy", webpackChunkName: "name-lazy-[request]" */ "./dir6/" + name); + return import( + /* webpackMode: "lazy", webpackChunkName: "name-lazy-[request]" */ "./dir6/" + + name + ); } return testChunkLoading(load, false, false); }); -it("should be able to combine chunks by name", function() { +it("should be able to combine chunks by name", function () { function load(name) { - switch(name) { + switch (name) { case "a": return import(/* webpackMode: "eager" */ "./dir7/a"); case "b": @@ -52,25 +60,25 @@ it("should be able to combine chunks by name", function() { case "d": return import(/* webpackChunkName: "name-3" */ "./dir7/d"); default: - throw new Error("Unexcepted test data"); + throw new Error("Unexpected test data"); } } return testChunkLoading(load, false, true); }); -it("should be able to use weak mode", function() { +it("should be able to use weak mode", function () { function load(name) { return import(/* webpackMode: "weak" */ "./dir8/" + name); } - require("./dir8/a") // chunks served manually by the user - require("./dir8/b") - require("./dir8/c") + require("./dir8/a"); // chunks served manually by the user + require("./dir8/b"); + require("./dir8/c"); return testChunkLoading(load, true, true); }); -it("should be able to use weak mode (without context)", function() { +it("should be able to use weak mode (without context)", function () { function load(name) { - switch(name) { + switch (name) { case "a": return import(/* webpackMode: "weak" */ "./dir9/a"); case "b": @@ -78,57 +86,181 @@ it("should be able to use weak mode (without context)", function() { case "c": return import(/* webpackMode: "weak" */ "./dir9/c"); default: - throw new Error("Unexcepted test data"); + throw new Error("Unexpected test data"); } } - require("./dir9/a") // chunks served manually by the user - require("./dir9/b") - require("./dir9/c") + require("./dir9/a"); // chunks served manually by the user + require("./dir9/b"); + require("./dir9/c"); return testChunkLoading(load, true, true); }); -it("should not find module when mode is weak and chunk not served elsewhere", function() { +it("should not find module when mode is weak and chunk not served elsewhere", function () { var name = "a"; - return import(/* webpackMode: "weak" */ "./dir10/" + name) - .catch(function(e) { - expect(e).toMatchObject({ message: /not available/, code: /MODULE_NOT_FOUND/ }); + return import(/* webpackMode: "weak" */ "./dir10/" + name).catch(function ( + e + ) { + expect(e).toMatchObject({ + message: /not available/, + code: /MODULE_NOT_FOUND/ }); + }); }); -it("should not find module when mode is weak and chunk not served elsewhere (without context)", function() { - return import(/* webpackMode: "weak" */ "./dir11/a") - .catch(function(e) { - expect(e).toMatchObject({ message: /not available/, code: /MODULE_NOT_FOUND/ }); +it("should not find module when mode is weak and chunk not served elsewhere (without context)", function () { + return import(/* webpackMode: "weak" */ "./dir11/a").catch(function (e) { + expect(e).toMatchObject({ + message: /not available/, + code: /MODULE_NOT_FOUND/ }); + }); }); +if (process.env.NODE_ENV === "production") { + it("should contain only one export from webpackExports from module", function () { + return import(/* webpackExports: "usedExports" */ "./dir12/a?1").then( + module => { + expect(module.usedExports).toEqual(["usedExports"]); + } + ); + }); + + it("should contain only webpackExports from module", function () { + return import( + /* webpackExports: ["a", "usedExports", "b"] */ "./dir12/a?2" + ).then(module => { + expect(module.usedExports).toEqual(["a", "b", "usedExports"]); + }); + }); + + it("should contain only webpackExports from module in eager mode", function () { + return import( + /* + webpackMode: "eager", + webpackExports: ["a", "usedExports", "b"] + */ "./dir12/a?3" + ).then(module => { + expect(module.usedExports).toEqual(["a", "b", "usedExports"]); + }); + }); + + it("should contain webpackExports from module in weak mode", function () { + require.resolve("./dir12/a?4"); + return import( + /* + webpackMode: "weak", + webpackExports: ["a", "usedExports", "b"] + */ "./dir12/a?4" + ).then(module => { + expect(module.usedExports).toEqual(["a", "b", "usedExports"]); + }); + }); + + it("should not mangle webpackExports from module", function () { + return import(/* webpackExports: "longnameforexport" */ "./dir12/a?5").then( + module => { + expect(module).toHaveProperty("longnameforexport"); + } + ); + }); + + it("should not mangle default webpackExports from module", function () { + return import(/* webpackExports: "default" */ "./dir12/a?6").then( + module => { + expect(module).toHaveProperty("default"); + } + ); + }); + + it("should contain only webpackExports from module in context mode", function () { + const x = "b"; + return import(/* webpackExports: "usedExports" */ `./dir13/${x}`).then( + module => { + expect(module.usedExports).toEqual(["usedExports"]); + } + ); + }); + + it("should be able to load with webpackFetchPriority high, low and auto", function () { + return Promise.all([ + import(/* webpackFetchPriority: "high"*/ "./dir14/a"), + import(/* webpackFetchPriority: "low"*/ "./dir14/b"), + import(/* webpackFetchPriority: "auto"*/ "./dir14/c"), + ]) + }) + + it("should not tree-shake default export for exportsType=default module", async function () { + const jsonObject = await import(/* webpackExports: ["default"] */ "./dir15/json/object.json"); + const jsonArray = await import(/* webpackExports: ["default"] */ "./dir15/json/array.json"); + const jsonPrimitive = await import(/* webpackExports: ["default"] */ "./dir15/json/primitive.json"); + expect(jsonObject.default).toEqual({ a: 1 }); + expect(jsonObject.a).toEqual(1); + expect(jsonArray.default).toEqual(["a"]); + expect(jsonArray[0]).toBe("a"); + expect(jsonPrimitive.default).toBe("a"); + const a = await import(/* webpackExports: ["default"] */"./dir15/a"); + expect(a.default).toEqual({ a: 1, b: 2 }); + expect(a.a).toBe(1); + expect(a.b).toBe(2); + }) + + it("should not tree-shake default export for exportsType=default context module", async function () { + const dir = "json"; + const jsonObject = await import(/* webpackExports: ["default"] */ `./dir16/${dir}/object.json`); + const jsonArray = await import(/* webpackExports: ["default"] */ `./dir16/${dir}/array.json`); + const jsonPrimitive = await import(/* webpackExports: ["default"] */ `./dir16/${dir}/primitive.json`); + expect(jsonObject.default).toEqual({ a: 1 }); + expect(jsonObject.a).toEqual(1); + expect(jsonArray.default).toEqual(["a"]); + expect(jsonArray[0]).toBe("a"); + expect(jsonPrimitive.default).toBe("a"); + const file = "a"; + const a = await import(/* webpackExports: ["default"] */`./dir16/${file}`); + expect(a.default).toEqual({ a: 1, b: 2 }); + expect(a.a).toBe(1); + expect(a.b).toBe(2); + }) +} + function testChunkLoading(load, expectedSyncInitial, expectedSyncRequested) { var sync = false; var syncInitial = true; - var p = Promise.all([load("a"), load("b")]).then(function() { + var p = Promise.all([load("a"), load("b")]).then(function () { expect(syncInitial).toBe(expectedSyncInitial); sync = true; var p = Promise.all([ - load("a").then(function(a) { - expect(a).toEqual(nsObj({ - default: "a" - })); + load("a").then(function (a) { + expect(a).toEqual( + nsObj({ + default: "a" + }) + ); expect(sync).toBe(true); }), - load("c").then(function(c) { - expect(c).toEqual(nsObj({ - default: "c" - })); + load("c").then(function (c) { + expect(c).toEqual( + nsObj({ + default: "c" + }) + ); expect(sync).toBe(expectedSyncRequested); }) ]); - Promise.resolve().then(function(){}).then(function(){}).then(function(){}).then(function(){ - sync = false; - }); + Promise.resolve() + .then(function () {}) + .then(function () {}) + .then(function () {}) + .then(function () { + sync = false; + }); return p; }); - Promise.resolve().then(function(){}).then(function(){}).then(function(){}).then(function(){ - syncInitial = false; - }); + Promise.resolve() + .then(function () {}) + .then(function () {}) + .then(function () {}) + .then(function () { + syncInitial = false; + }); return p; } diff --git a/test/cases/chunks/issue-2443/index.js b/test/cases/chunks/issue-2443/index.js index 731b88a8128..a56f564cb3a 100644 --- a/test/cases/chunks/issue-2443/index.js +++ b/test/cases/chunks/issue-2443/index.js @@ -1,15 +1,19 @@ it("should be able to use expressions in import (directory)", function(done) { function load(name, expected, callback) { - import("./dir/" + name + "/file.js").then(function(result) { - expect(result).toEqual(nsObj({ - default: expected - })); - callback(); - }).catch(function(err) { - done(err); - }); + import("./dir/" + name + "/file.js") + .then(function(result) { + expect(result).toEqual( + nsObj({ + default: expected + }) + ); + callback(); + }) + .catch(function(err) { + done(err); + }); } - require.include("./dir/three/file"); + if (Math.random() < 0) require("./dir/three/file"); load("one", 1, function() { load("two", 2, function() { load("three", 3, function() { diff --git a/test/cases/chunks/named-chunks/index.js b/test/cases/chunks/named-chunks/index.js index 1897b9a0b6b..0f3bad6211d 100644 --- a/test/cases/chunks/named-chunks/index.js +++ b/test/cases/chunks/named-chunks/index.js @@ -94,6 +94,7 @@ it("should be able to use named chunks in import()", function(done) { }); it("should be able to use named chunk in context import()", function(done) { + // cspell:ignore mpty var mpty = "mpty"; var sync = false; import("./e" + mpty + "2" /* webpackChunkName: "context-named-chunk" */).then(function(result) { diff --git a/test/cases/chunks/parsing/index.js b/test/cases/chunks/parsing/index.js index f3a376a5b27..77aee71f6ef 100644 --- a/test/cases/chunks/parsing/index.js +++ b/test/cases/chunks/parsing/index.js @@ -1,13 +1,19 @@ it("should handle bound function expressions", function(done) { - require.ensure([], function(require) { - expect(this).toEqual({ test: true }); - require("./empty?test"); - expect(process.nextTick).toBeTypeOf("function"); // check if injection still works - require.ensure([], function(require) { + require.ensure( + [], + function(require) { expect(this).toEqual({ test: true }); - done(); - }.bind(this)); - }.bind({test: true})); + require("./empty?test"); + expect(process.nextTick).toBeTypeOf("function"); // check if injection still works + require.ensure( + [], + function(require) { + expect(this).toEqual({ test: true }); + done(); + }.bind(this) + ); + }.bind({ test: true }) + ); }); it("should handle require.ensure without function expression", function(done) { @@ -18,16 +24,19 @@ it("should handle require.ensure without function expression", function(done) { }); it("should parse expression in require.ensure, which isn't a function expression", function(done) { - require.ensure([], (function() { - expect(require("./empty?require.ensure:test")).toEqual({}); - return function f() { - done(); - }; - }())); + require.ensure( + [], + (function() { + expect(require("./empty?require.ensure:test")).toEqual({}); + return function f() { + done(); + }; + })() + ); }); -it("should accept a require.include call", function(done) { - require.include("./require.include"); +it("should accept an already included module", function(done) { + if (Math.random() < 0) require("./require.include"); var value = null; require.ensure([], function(require) { value = require("./require.include"); diff --git a/test/cases/chunks/runtime/test.filter.js b/test/cases/chunks/runtime/test.filter.js index 3ed2e8ae961..7ba4ada1c94 100644 --- a/test/cases/chunks/runtime/test.filter.js +++ b/test/cases/chunks/runtime/test.filter.js @@ -1,4 +1,4 @@ -module.exports = function(config) { +module.exports = function (config) { // This test can't run in development mode as it depends on the flagIncludedChunks optimization return config.mode !== "development"; }; diff --git a/test/cases/chunks/runtime/webpack.config.js b/test/cases/chunks/runtime/webpack.config.js new file mode 100644 index 00000000000..eef5638fa54 --- /dev/null +++ b/test/cases/chunks/runtime/webpack.config.js @@ -0,0 +1,5 @@ +module.exports = { + optimization: { + moduleIds: "named" + } +}; diff --git a/test/cases/chunks/weird-reference-to-entry/errors.js b/test/cases/chunks/weird-reference-to-entry/errors.js index 5cdd2850ba3..0eda0fbec8e 100644 --- a/test/cases/chunks/weird-reference-to-entry/errors.js +++ b/test/cases/chunks/weird-reference-to-entry/errors.js @@ -1,3 +1,5 @@ module.exports = [ - [/It's not allowed to load an initial chunk on demand\. The chunk name "main" is already used by an entrypoint\./], + [ + /It's not allowed to load an initial chunk on demand\. The chunk name "main" is already used by an entrypoint\./ + ] ]; diff --git a/test/cases/cjs-interop/non-existing-export/esModule.js b/test/cases/cjs-interop/non-existing-export/esModule.js new file mode 100644 index 00000000000..37190c68978 --- /dev/null +++ b/test/cases/cjs-interop/non-existing-export/esModule.js @@ -0,0 +1,2 @@ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = "default"; diff --git a/test/cases/cjs-interop/non-existing-export/index.js b/test/cases/cjs-interop/non-existing-export/index.js new file mode 100644 index 00000000000..d210326c346 --- /dev/null +++ b/test/cases/cjs-interop/non-existing-export/index.js @@ -0,0 +1,7 @@ +import { named } from "./module"; +import { named as named2 } from "./esModule"; + +it("should emit errors", () => { + expect(named).toBe(undefined); + expect(named2).toBe(undefined); +}); diff --git a/test/cases/cjs-interop/non-existing-export/module.js b/test/cases/cjs-interop/non-existing-export/module.js new file mode 100644 index 00000000000..0a5b24b98b3 --- /dev/null +++ b/test/cases/cjs-interop/non-existing-export/module.js @@ -0,0 +1 @@ +exports.default = "default"; diff --git a/test/cases/cjs-interop/non-existing-export/warnings.js b/test/cases/cjs-interop/non-existing-export/warnings.js new file mode 100644 index 00000000000..1ecb811bf56 --- /dev/null +++ b/test/cases/cjs-interop/non-existing-export/warnings.js @@ -0,0 +1,8 @@ +module.exports = [ + [ + /export 'named' \(imported as 'named'\) was not found in '\.\/module' \(possible exports: default\)/ + ], + [ + /export 'named' \(imported as 'named2'\) was not found in '\.\/esModule' \(possible exports: __esModule, default\)/ + ] +]; diff --git a/test/cases/cjs-tree-shaking/bailouts/accessing-call-context.js b/test/cases/cjs-tree-shaking/bailouts/accessing-call-context.js new file mode 100644 index 00000000000..1e925b72219 --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/accessing-call-context.js @@ -0,0 +1,5 @@ +module.exports.func = function f() { + "use strict"; + return this; +}; +module.exports.abc = "abc"; diff --git a/test/cases/cjs-tree-shaking/bailouts/accessing-module.js b/test/cases/cjs-tree-shaking/bailouts/accessing-module.js new file mode 100644 index 00000000000..1ae2ff1eb55 --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/accessing-module.js @@ -0,0 +1,7 @@ +exports.abc = "abc"; + +function f(m) { + m.exports = { abc: "abc", def: "def" }; +} + +f(module); diff --git a/test/cases/cjs-tree-shaking/bailouts/assign-exports-assign.js b/test/cases/cjs-tree-shaking/bailouts/assign-exports-assign.js new file mode 100644 index 00000000000..5382b0246c4 --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/assign-exports-assign.js @@ -0,0 +1,6 @@ +exports.abc = "abc"; + +var newObj = {}; +exports = newObj; + +exports.def = "def"; diff --git a/test/cases/cjs-tree-shaking/bailouts/assign-exports-define.js b/test/cases/cjs-tree-shaking/bailouts/assign-exports-define.js new file mode 100644 index 00000000000..416b24a5853 --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/assign-exports-define.js @@ -0,0 +1,6 @@ +Object.defineProperty(exports, "abc", { value: "abc" }); + +var newObj = {}; +exports = newObj; + +Object.defineProperty(exports, "def", { value: "def" }); diff --git a/test/cases/cjs-tree-shaking/bailouts/define-module-properties.js b/test/cases/cjs-tree-shaking/bailouts/define-module-properties.js new file mode 100644 index 00000000000..3e2c0dfb187 --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/define-module-properties.js @@ -0,0 +1,10 @@ +exports.abc = "abc"; + +Object.defineProperties(module, { + exports: { + value: { + abc: "abc", + def: "def" + } + } +}); diff --git a/test/cases/cjs-tree-shaking/bailouts/define-module-property.js b/test/cases/cjs-tree-shaking/bailouts/define-module-property.js new file mode 100644 index 00000000000..2ec92210180 --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/define-module-property.js @@ -0,0 +1,8 @@ +exports.abc = "abc"; + +Object.defineProperty(module, "exports", { + value: { + abc: "abc", + def: "def" + } +}); diff --git a/test/cases/cjs-tree-shaking/bailouts/index.js b/test/cases/cjs-tree-shaking/bailouts/index.js new file mode 100644 index 00000000000..665c352dc40 --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/index.js @@ -0,0 +1,56 @@ +it("should bailout when reading whole exports object from this", () => { + var test = require("./reading-this").test; + expect(test().abc).toBe("abc"); +}); + +it("should bailout when reading whole exports object from exports", () => { + var test = require("./reading-exports").test; + expect(test().abc).toBe("abc"); +}); + +it("should bailout when reading whole exports object from module.exports", () => { + var test = require("./reading-module-exports").test; + expect(test().abc).toBe("abc"); +}); + +it("should reassigning exports (assign values)", () => { + expect(require("./assign-exports-assign?1").abc).toBe("abc"); + expect(require("./assign-exports-assign?2").def).toBe(undefined); +}); + +it("should reassigning exports (define values)", () => { + expect(require("./assign-exports-define").abc).toBe("abc"); + expect(require("./assign-exports-define").def).toBe(undefined); +}); + +it("should not mangle or remove nested properties", () => { + expect(require("./nested-property").abc).toBe("abc"); +}); + +it("should be able to access the exports via call context", () => { + expect(require("./accessing-call-context?1").func().abc).toBe("abc"); + var cc = require("./accessing-call-context?2"); + expect(cc.func().abc).toBe("abc"); + var func = require("./accessing-call-context?3").func; + expect(func()).toBe(undefined); +}); + +it("should be able to define an exports property on module (property)", () => { + expect(require("./define-module-property?2").abc).toBe("abc"); + expect(require("./define-module-property?1").def).toBe("def"); +}); + +it("should be able to define an exports property on module (properties)", () => { + expect(require("./define-module-properties?2").abc).toBe("abc"); + expect(require("./define-module-properties?1").def).toBe("def"); +}); + +it("should be able to do stuff with the module object", () => { + expect(require("./accessing-module?2").abc).toBe("abc"); + expect(require("./accessing-module?1").def).toBe("def"); +}); + +it("should be able to use AMD to define exports", () => { + expect(require("./using-amd?2").abc).toBe("abc"); + expect(require("./using-amd?1").def).toBe("def"); +}); diff --git a/test/cases/cjs-tree-shaking/bailouts/nested-property.js b/test/cases/cjs-tree-shaking/bailouts/nested-property.js new file mode 100644 index 00000000000..4777d158100 --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/nested-property.js @@ -0,0 +1,8 @@ +var abc = {}; + +module.exports = abc; + +module.exports.abc = "abc"; +module.exports.def = "def"; + +expect(abc).toEqual({ abc: "abc", def: "def" }); diff --git a/test/cases/cjs-tree-shaking/bailouts/reading-exports.js b/test/cases/cjs-tree-shaking/bailouts/reading-exports.js new file mode 100644 index 00000000000..7c994d85b83 --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/reading-exports.js @@ -0,0 +1,5 @@ +exports.abc = "abc"; + +exports.test = function() { + return exports; +}; diff --git a/test/cases/cjs-tree-shaking/bailouts/reading-module-exports.js b/test/cases/cjs-tree-shaking/bailouts/reading-module-exports.js new file mode 100644 index 00000000000..53c6437c5f0 --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/reading-module-exports.js @@ -0,0 +1,5 @@ +exports.abc = "abc"; + +exports.test = function() { + return module.exports; +}; diff --git a/test/cases/cjs-tree-shaking/bailouts/reading-this.js b/test/cases/cjs-tree-shaking/bailouts/reading-this.js new file mode 100644 index 00000000000..dace36f75ab --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/reading-this.js @@ -0,0 +1,5 @@ +exports.abc = "abc"; + +exports.test = () => { + return this; +}; diff --git a/test/cases/cjs-tree-shaking/bailouts/using-amd.js b/test/cases/cjs-tree-shaking/bailouts/using-amd.js new file mode 100644 index 00000000000..28366950f90 --- /dev/null +++ b/test/cases/cjs-tree-shaking/bailouts/using-amd.js @@ -0,0 +1,5 @@ +exports.abc = "not-abc"; +define({ + abc: "abc", + def: "def" +}); diff --git a/test/cases/cjs-tree-shaking/cjs-to-esm/index.js b/test/cases/cjs-tree-shaking/cjs-to-esm/index.js new file mode 100644 index 00000000000..1c5838ace07 --- /dev/null +++ b/test/cases/cjs-tree-shaking/cjs-to-esm/index.js @@ -0,0 +1,10 @@ +it("should allow to require esm", () => { + expect(require("./module?1").abc).toBe("abc"); + expect(typeof require("./module?2").func).toBe("function"); + // check if a function called with a namespace object as context + // still yield the same optimization, compared to only accessing + // the export + expect(Object.keys(require("./module?3").func())).toEqual( + Object.keys(require.cache[require.resolve("./module?2")].exports) + ); +}); diff --git a/test/cases/cjs-tree-shaking/cjs-to-esm/module.js b/test/cases/cjs-tree-shaking/cjs-to-esm/module.js new file mode 100644 index 00000000000..6532d0868ff --- /dev/null +++ b/test/cases/cjs-tree-shaking/cjs-to-esm/module.js @@ -0,0 +1,6 @@ +export const abc = "abc"; +export const def = "def"; +export const func = function() { + "use strict"; + return this; +}; diff --git a/test/cases/cjs-tree-shaking/esModule-getter/index.js b/test/cases/cjs-tree-shaking/esModule-getter/index.js new file mode 100644 index 00000000000..c71cd9fee68 --- /dev/null +++ b/test/cases/cjs-tree-shaking/esModule-getter/index.js @@ -0,0 +1,15 @@ +import def, { named, __esModule } from "./module"; +import * as ns from "./module"; + +it("should allow to import module with getters", () => { + expect(def).toBe("default"); + expect(named).toBe("named"); + expect(__esModule).toBe(true); + expect(ns.default).toBe("default"); + expect(ns.named).toBe("named"); + expect(ns.__esModule).toBe(true); + const indirect = Object(ns); + expect(indirect.default).toBe("default"); + expect(indirect.named).toBe("named"); + expect(indirect.__esModule).toBe(true); +}); diff --git a/test/cases/cjs-tree-shaking/esModule-getter/module.js b/test/cases/cjs-tree-shaking/esModule-getter/module.js new file mode 100644 index 00000000000..5fc4223cb74 --- /dev/null +++ b/test/cases/cjs-tree-shaking/esModule-getter/module.js @@ -0,0 +1,3 @@ +Object.defineProperty(exports, "__esModule", { get: () => true }); +Object.defineProperty(exports, "default", { get: () => "default" }); +Object.defineProperty(exports, "named", { get: () => "named" }); diff --git a/test/cases/cjs-tree-shaking/esm-to-cjs/index.js b/test/cases/cjs-tree-shaking/esm-to-cjs/index.js new file mode 100644 index 00000000000..71e5362a4cb --- /dev/null +++ b/test/cases/cjs-tree-shaking/esm-to-cjs/index.js @@ -0,0 +1,9 @@ +import m1 from "./module?1"; +import m2 from "./module?2"; +import { abc } from "./module?3"; + +it("should allow to import cjs with esm", () => { + expect(m1.abc).toBe("abc"); + expect(m2).toEqual({ abc: "abc", def: "def" }); + expect(abc).toBe("abc"); +}); diff --git a/test/cases/cjs-tree-shaking/esm-to-cjs/module.js b/test/cases/cjs-tree-shaking/esm-to-cjs/module.js new file mode 100644 index 00000000000..0d3ae437956 --- /dev/null +++ b/test/cases/cjs-tree-shaking/esm-to-cjs/module.js @@ -0,0 +1,2 @@ +exports.abc = "abc"; +exports.def = "def"; diff --git a/test/cases/cjs-tree-shaking/exports/assign-exports-property.js b/test/cases/cjs-tree-shaking/exports/assign-exports-property.js new file mode 100644 index 00000000000..0d3ae437956 --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/assign-exports-property.js @@ -0,0 +1,2 @@ +exports.abc = "abc"; +exports.def = "def"; diff --git a/test/cases/cjs-tree-shaking/exports/assign-module-exports-property.js b/test/cases/cjs-tree-shaking/exports/assign-module-exports-property.js new file mode 100644 index 00000000000..2136b98d773 --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/assign-module-exports-property.js @@ -0,0 +1,2 @@ +module.exports.abc = "abc"; +module.exports.def = "def"; diff --git a/test/cases/cjs-tree-shaking/exports/assign-this-property.js b/test/cases/cjs-tree-shaking/exports/assign-this-property.js new file mode 100644 index 00000000000..37d1ecb94ad --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/assign-this-property.js @@ -0,0 +1,2 @@ +this.abc = "abc"; +this.def = "def"; diff --git a/test/cases/cjs-tree-shaking/exports/attach-to-arrow-function.js b/test/cases/cjs-tree-shaking/exports/attach-to-arrow-function.js new file mode 100644 index 00000000000..abc9576d248 --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/attach-to-arrow-function.js @@ -0,0 +1,3 @@ +module.exports = () => "abc"; + +module.exports.def = "def"; diff --git a/test/cases/cjs-tree-shaking/exports/attach-to-function.js b/test/cases/cjs-tree-shaking/exports/attach-to-function.js new file mode 100644 index 00000000000..9341f94fd6e --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/attach-to-function.js @@ -0,0 +1,5 @@ +module.exports = function() { + return "abc"; +}; + +module.exports.def = "def"; diff --git a/test/cases/cjs-tree-shaking/exports/attach-to-object.js b/test/cases/cjs-tree-shaking/exports/attach-to-object.js new file mode 100644 index 00000000000..43abfd882bd --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/attach-to-object.js @@ -0,0 +1,5 @@ +module.exports = { + abc: "abc" +}; + +module.exports.def = "def"; diff --git a/test/cases/cjs-tree-shaking/exports/define-exports-property.js b/test/cases/cjs-tree-shaking/exports/define-exports-property.js new file mode 100644 index 00000000000..8fdaf76e9ee --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/define-exports-property.js @@ -0,0 +1,2 @@ +Object.defineProperty(exports, "abc", { enumerable: true, value: "abc" }); +Object.defineProperty(exports, "def", { enumerable: true, value: "def" }); diff --git a/test/cases/cjs-tree-shaking/exports/define-module-exports-property.js b/test/cases/cjs-tree-shaking/exports/define-module-exports-property.js new file mode 100644 index 00000000000..4ac21240abb --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/define-module-exports-property.js @@ -0,0 +1,8 @@ +Object.defineProperty(module.exports, "abc", { + enumerable: true, + value: "abc" +}); +Object.defineProperty(module.exports, "def", { + enumerable: true, + value: "def" +}); diff --git a/test/cases/cjs-tree-shaking/exports/define-this-property.js b/test/cases/cjs-tree-shaking/exports/define-this-property.js new file mode 100644 index 00000000000..2cfbf578d12 --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/define-this-property.js @@ -0,0 +1,2 @@ +Object.defineProperty(this, "abc", { enumerable: true, value: "abc" }); +Object.defineProperty(this, "def", { enumerable: true, value: "def" }); diff --git a/test/cases/cjs-tree-shaking/exports/exports-default-bailout-flagged.js b/test/cases/cjs-tree-shaking/exports/exports-default-bailout-flagged.js new file mode 100644 index 00000000000..72fb5c4c07c --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/exports-default-bailout-flagged.js @@ -0,0 +1,9 @@ +class Test { + getString() { + return "hello"; + } +} + +const getExports = () => ({ __esModule: true, default: Test }); + +module.exports = getExports(); diff --git a/test/cases/cjs-tree-shaking/exports/exports-default-bailout.js b/test/cases/cjs-tree-shaking/exports/exports-default-bailout.js new file mode 100644 index 00000000000..d7051556076 --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/exports-default-bailout.js @@ -0,0 +1,9 @@ +class Test { + getString() { + return "hello"; + } +} + +const getExports = () => ({ default: Test }); + +module.exports = getExports(); diff --git a/test/cases/cjs-tree-shaking/exports/exports-default-flagged.js b/test/cases/cjs-tree-shaking/exports/exports-default-flagged.js new file mode 100644 index 00000000000..60c8397271e --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/exports-default-flagged.js @@ -0,0 +1,8 @@ +Object.defineProperty(exports, "__esModule", { value: true }); +class Test { + getString() { + return "hello"; + } +} + +exports.default = Test; diff --git a/test/cases/cjs-tree-shaking/exports/exports-default.js b/test/cases/cjs-tree-shaking/exports/exports-default.js new file mode 100644 index 00000000000..33d466ce4dd --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/exports-default.js @@ -0,0 +1,7 @@ +class Test { + getString() { + return "hello"; + } +} + +exports.default = Test; diff --git a/test/cases/cjs-tree-shaking/exports/index.js b/test/cases/cjs-tree-shaking/exports/index.js new file mode 100644 index 00000000000..2c12737f893 --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/index.js @@ -0,0 +1,95 @@ +it("should allow to export via exports", () => { + expect(require("./assign-exports-property?1").abc).toBe("abc"); + expect(require("./assign-exports-property?2")).toEqual({ + abc: "abc", + def: "def" + }); +}); + +it("should allow to export via module.exports", () => { + expect(require("./assign-module-exports-property?1").abc).toBe("abc"); + expect(require("./assign-module-exports-property?2")).toEqual({ + abc: "abc", + def: "def" + }); +}); + +it("should allow to export via this", () => { + expect(require("./assign-this-property?1").abc).toBe("abc"); + expect(require("./assign-this-property?2")).toEqual({ + abc: "abc", + def: "def" + }); +}); + +it("should allow to export via define property on exports", () => { + expect(require("./define-exports-property?1").abc).toBe("abc"); + expect(require("./define-exports-property?2")).toEqual({ + abc: "abc", + def: "def" + }); +}); + +it("should allow to export via define property on module.exports", () => { + expect(require("./define-module-exports-property?1").abc).toBe("abc"); + expect(require("./define-module-exports-property?2")).toEqual({ + abc: "abc", + def: "def" + }); +}); + +it("should allow to export via define property on this", () => { + expect(require("./define-this-property?1").abc).toBe("abc"); + expect(require("./define-this-property?2")).toEqual({ + abc: "abc", + def: "def" + }); +}); + +it("should allow to read own exports via exports", () => { + var test = require("./reading-self-from-exports").test; + expect(test()).toBe("abc"); +}); + +it("should allow to read own exports via module.exports", () => { + var test = require("./reading-self-from-module-exports").test; + expect(test()).toBe("abc"); +}); + +it("should allow to read own exports via this", () => { + var test = require("./reading-self-from-this").test; + expect(test()).toBe("abc"); +}); + +it("should allow to attach exports to object", () => { + expect(require("./attach-to-object?1").abc).toBe("abc"); + expect(require("./attach-to-object?2").def).toBe("def"); + expect(require("./attach-to-object?3").abc).toBe("abc"); + expect(require("./attach-to-object?3").def).toBe("def"); +}); + +it("should allow to attach exports to function", () => { + expect(require("./attach-to-function?1")()).toBe("abc"); + expect(require("./attach-to-function?2").def).toBe("def"); + expect(require("./attach-to-function?3")()).toBe("abc"); + expect(require("./attach-to-function?3").def).toBe("def"); +}); + +it("should allow to attach exports to arrow function", () => { + expect(require("./attach-to-arrow-function?1")()).toBe("abc"); + expect(require("./attach-to-arrow-function?2").def).toBe("def"); + expect(require("./attach-to-arrow-function?3")()).toBe("abc"); + expect(require("./attach-to-arrow-function?3").def).toBe("def"); +}); + +it("should properly handle export / require `default`", () => { + expect(require("./require-default").moduleExportsDefault).toBe("hello"); + expect(require("./require-default").hello1).toBe("hello"); + expect(require("./require-default").hello2).toBe("hello"); + expect(require("./require-default").hello3).toBe("hello"); + expect(require("./require-default").hello4).toBe("hello"); + expect(require("./require-default").hello5).toBe("hello"); + expect(require("./require-default").hello6).toBe("hello"); + expect(require("./require-default").hello7).toBe("hello"); + expect(require("./require-default").hello8).toBe("hello"); +}); diff --git a/test/cases/cjs-tree-shaking/exports/module-exports-default.js b/test/cases/cjs-tree-shaking/exports/module-exports-default.js new file mode 100644 index 00000000000..c0c2ed18bfc --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/module-exports-default.js @@ -0,0 +1,7 @@ +class Test { + getString() { + return "hello"; + } +} + +module.exports.default = Test; diff --git a/test/cases/cjs-tree-shaking/exports/reading-self-from-exports.js b/test/cases/cjs-tree-shaking/exports/reading-self-from-exports.js new file mode 100644 index 00000000000..bee3ff3612a --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/reading-self-from-exports.js @@ -0,0 +1,5 @@ +exports.abc = "abc"; + +exports.test = function() { + return exports.abc; +}; diff --git a/test/cases/cjs-tree-shaking/exports/reading-self-from-module-exports.js b/test/cases/cjs-tree-shaking/exports/reading-self-from-module-exports.js new file mode 100644 index 00000000000..9b197bfb815 --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/reading-self-from-module-exports.js @@ -0,0 +1,5 @@ +exports.abc = "abc"; + +exports.test = function() { + return module.exports.abc; +}; diff --git a/test/cases/cjs-tree-shaking/exports/reading-self-from-this.js b/test/cases/cjs-tree-shaking/exports/reading-self-from-this.js new file mode 100644 index 00000000000..ee445214804 --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/reading-self-from-this.js @@ -0,0 +1,5 @@ +exports.abc = "abc"; + +exports.test = () => { + return this.abc; +}; diff --git a/test/cases/cjs-tree-shaking/exports/require-default.js b/test/cases/cjs-tree-shaking/exports/require-default.js new file mode 100644 index 00000000000..9598dfaa237 --- /dev/null +++ b/test/cases/cjs-tree-shaking/exports/require-default.js @@ -0,0 +1,27 @@ +const ModuleExportsDefaultTest = require("./module-exports-default").default; +const Test1 = require("./exports-default?1").default; +import Test2 from "./exports-default?2"; +const Test3 = require("./exports-default-flagged?3").default; +import Test4 from "./exports-default-flagged?4"; +const Test5 = require("./exports-default-bailout?5").default; +import Test6 from "./exports-default-bailout?6"; +const Test7 = require("./exports-default-bailout-flagged?7").default; +import Test8 from "./exports-default-bailout-flagged?8"; +const moduleExportsDefaultTest = new ModuleExportsDefaultTest(); +const test1 = new Test1(); +const test2 = new Test2.default(); +const test3 = new Test3(); +const test4 = new Test4(); +const test5 = new Test5(); +const test6 = new Test6.default(); +const test7 = new Test7(); +const test8 = new Test8(); +export const moduleExportsDefault = moduleExportsDefaultTest.getString(); +export const hello1 = test1.getString(); +export const hello2 = test2.getString(); +export const hello3 = test3.getString(); +export const hello4 = test4.getString(); +export const hello5 = test5.getString(); +export const hello6 = test6.getString(); +export const hello7 = test7.getString(); +export const hello8 = test8.getString(); diff --git a/test/cases/cjs-tree-shaking/importing/index.js b/test/cases/cjs-tree-shaking/importing/index.js new file mode 100644 index 00000000000..fb044fcada6 --- /dev/null +++ b/test/cases/cjs-tree-shaking/importing/index.js @@ -0,0 +1,15 @@ +it("should be able to import a module via require and property", () => { + expect(require("./module").abc).toBe("abc"); +}); + +it("should be able to import a module via require and destruct", () => { + var { abc } = require("./module"); + expect(abc).toBe("abc"); +}); + +it("should be able to import a module via require and exports object", () => { + var module1 = require("./module?1"); + expect(module1.abc).toBe("abc"); + var module2 = require("./module?2"); + expect(module2).toEqual({ abc: "abc", def: "def" }); +}); diff --git a/test/cases/cjs-tree-shaking/importing/module.js b/test/cases/cjs-tree-shaking/importing/module.js new file mode 100644 index 00000000000..0d3ae437956 --- /dev/null +++ b/test/cases/cjs-tree-shaking/importing/module.js @@ -0,0 +1,2 @@ +exports.abc = "abc"; +exports.def = "def"; diff --git a/test/cases/cjs-tree-shaking/mjs/cjs-dynamic.js b/test/cases/cjs-tree-shaking/mjs/cjs-dynamic.js new file mode 100644 index 00000000000..e42cb69f918 --- /dev/null +++ b/test/cases/cjs-tree-shaking/mjs/cjs-dynamic.js @@ -0,0 +1,6 @@ +exports.abc = "abc"; +exports.default = "default"; +const flagIt = () => (exports.__esModule = true); + +const query = __resourceQuery; +if (query.includes("yes")) flagIt(); diff --git a/test/cases/cjs-tree-shaking/mjs/cjs-flagged.js b/test/cases/cjs-tree-shaking/mjs/cjs-flagged.js new file mode 100644 index 00000000000..95539960d6a --- /dev/null +++ b/test/cases/cjs-tree-shaking/mjs/cjs-flagged.js @@ -0,0 +1,3 @@ +exports.__esModule = true; +exports.abc = "abc"; +exports.default = "default"; diff --git a/test/cases/cjs-tree-shaking/mjs/cjs.js b/test/cases/cjs-tree-shaking/mjs/cjs.js new file mode 100644 index 00000000000..16650262d56 --- /dev/null +++ b/test/cases/cjs-tree-shaking/mjs/cjs.js @@ -0,0 +1,2 @@ +exports.abc = "abc"; +exports.default = "default"; diff --git a/test/cases/cjs-tree-shaking/mjs/index.js b/test/cases/cjs-tree-shaking/mjs/index.js new file mode 100644 index 00000000000..00f62468bcf --- /dev/null +++ b/test/cases/cjs-tree-shaking/mjs/index.js @@ -0,0 +1,19 @@ +import "./index.mjs"; + +import cjs from "./cjs.js?js"; +import cjsFlagged from "./cjs-flagged.js?js"; +import cjsDynamicYes from "./cjs-dynamic.js?js-yes"; +import cjsDynamicNo from "./cjs-dynamic.js?js-no"; + +it("should return correct exports when default is imported", () => { + expect(cjs).toEqual({ + abc: "abc", + default: "default" + }); + expect(cjsFlagged).toEqual("default"); + expect(cjsDynamicYes).toEqual("default"); + expect(cjsDynamicNo).toMatchObject({ + abc: "abc", + default: "default" + }); +}); diff --git a/test/cases/cjs-tree-shaking/mjs/index.mjs b/test/cases/cjs-tree-shaking/mjs/index.mjs new file mode 100644 index 00000000000..2f5930415f3 --- /dev/null +++ b/test/cases/cjs-tree-shaking/mjs/index.mjs @@ -0,0 +1,25 @@ +import cjs from "./cjs.js?mjs"; +import cjsFlagged from "./cjs-flagged.js?mjs"; +import cjsDynamicYes from "./cjs-dynamic.js?mjs-yes"; +import cjsDynamicNo from "./cjs-dynamic.js?mjs-no"; + +it("should return correct exports when default is imported", () => { + expect(cjs).toEqual({ + abc: "abc", + default: "default" + }); + expect(cjsFlagged).toEqual({ + __esModule: true, + abc: "abc", + default: "default" + }); + expect(cjsDynamicYes).toMatchObject({ + __esModule: true, + abc: "abc", + default: "default" + }); + expect(cjsDynamicNo).toMatchObject({ + abc: "abc", + default: "default" + }); +}); diff --git a/test/cases/cjs-tree-shaking/mutate/index.js b/test/cases/cjs-tree-shaking/mutate/index.js new file mode 100644 index 00000000000..cd913b48fc7 --- /dev/null +++ b/test/cases/cjs-tree-shaking/mutate/index.js @@ -0,0 +1,33 @@ +import module1 from "./module?1"; +import module2, { a } from "./module?2"; + +it("should allow mutating imported modules (changing existing exports)", () => { + expect(module1.abc).toBe("abc"); + expect(module1.def).toBe("def"); + module1.abc = "new-abc"; + expect(module1.abc).toBe("new-abc"); + expect(module1.def).toBe("def"); +}); + +it("should allow mutating imported modules (adding new properties)", () => { + expect(module2.abc).toBe("abc"); + expect(module2.def).toBe("def"); + expect(module2.ghi).toBe(undefined); + expect(module2.Oi).toBe(undefined); + expect(module2.a).toBe(undefined); + expect(a).toBe(undefined); + expect(module2[""]).toBe(undefined); + module2.ghi = "ghi"; + module2.Oi = "Oi"; + module2.a = "a"; + module2[""] = {}; + module2[""].abc = "abc"; + expect(module2.abc).toBe("abc"); + expect(module2.def).toBe("def"); + expect(module2.ghi).toBe("ghi"); + expect(module2.Oi).toBe("Oi"); + expect(module2.a).toBe("a"); + expect(a).toBe("a"); + expect(module2[""]).toEqual({ abc: "abc" }); + expect(module2[""].abc).toBe("abc"); +}); diff --git a/test/cases/cjs-tree-shaking/mutate/module.js b/test/cases/cjs-tree-shaking/mutate/module.js new file mode 100644 index 00000000000..0d3ae437956 --- /dev/null +++ b/test/cases/cjs-tree-shaking/mutate/module.js @@ -0,0 +1,2 @@ +exports.abc = "abc"; +exports.def = "def"; diff --git a/test/cases/cjs-tree-shaking/mutate/warnings.js b/test/cases/cjs-tree-shaking/mutate/warnings.js new file mode 100644 index 00000000000..f875533c7eb --- /dev/null +++ b/test/cases/cjs-tree-shaking/mutate/warnings.js @@ -0,0 +1,4 @@ +module.exports = [ + [/export 'a' \(imported as 'a'\) was not found/], + [/export 'a' \(imported as 'a'\) was not found/] +]; diff --git a/test/cases/cjs-tree-shaking/namespace/index.js b/test/cases/cjs-tree-shaking/namespace/index.js new file mode 100644 index 00000000000..e4407ae46da --- /dev/null +++ b/test/cases/cjs-tree-shaking/namespace/index.js @@ -0,0 +1,25 @@ +it("should allow to create namespace exports via __esModule on exports", async () => { + expect(await import("./namespace-via-exports")).toBe( + require("./namespace-via-exports") + ); +}); +it("should allow to create namespace exports via __esModule on literal", async () => { + expect(await import("./namespace-via-literal")).toBe( + require("./namespace-via-literal") + ); +}); +it("should allow to create namespace exports via __esModule with Object.defineProperty", async () => { + expect(await import("./namespace-via-define-property")).toBe( + require("./namespace-via-define-property") + ); +}); +it("should allow to create namespace exports via __esModule with Object.defineProperty minimized true", async () => { + expect(await import("./namespace-via-define-property-minimized")).toBe( + require("./namespace-via-define-property-minimized") + ); +}); +it("should allow to create namespace exports via __esModule with Object.defineProperties", async () => { + expect(await import("./namespace-via-define-properties")).toBe( + require("./namespace-via-define-properties") + ); +}); diff --git a/test/cases/cjs-tree-shaking/namespace/namespace-via-define-properties.js b/test/cases/cjs-tree-shaking/namespace/namespace-via-define-properties.js new file mode 100644 index 00000000000..fcf031e864f --- /dev/null +++ b/test/cases/cjs-tree-shaking/namespace/namespace-via-define-properties.js @@ -0,0 +1,5 @@ +Object.defineProperties(exports, { + __esModule: { value: true }, + abc: { enumerable: true, value: "abc" }, + default: { enumerable: true, value: "default" } +}); diff --git a/test/cases/cjs-tree-shaking/namespace/namespace-via-define-property-minimized.js b/test/cases/cjs-tree-shaking/namespace/namespace-via-define-property-minimized.js new file mode 100644 index 00000000000..cd10e84bf97 --- /dev/null +++ b/test/cases/cjs-tree-shaking/namespace/namespace-via-define-property-minimized.js @@ -0,0 +1,3 @@ +Object.defineProperty(exports, "__esModule", { value: !0 }); +exports.abc = "abc"; +exports.default = "default"; diff --git a/test/cases/cjs-tree-shaking/namespace/namespace-via-define-property.js b/test/cases/cjs-tree-shaking/namespace/namespace-via-define-property.js new file mode 100644 index 00000000000..50c67588de7 --- /dev/null +++ b/test/cases/cjs-tree-shaking/namespace/namespace-via-define-property.js @@ -0,0 +1,3 @@ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.abc = "abc"; +exports.default = "default"; diff --git a/test/cases/cjs-tree-shaking/namespace/namespace-via-exports.js b/test/cases/cjs-tree-shaking/namespace/namespace-via-exports.js new file mode 100644 index 00000000000..92cc687c7ea --- /dev/null +++ b/test/cases/cjs-tree-shaking/namespace/namespace-via-exports.js @@ -0,0 +1,3 @@ +exports.__esModule = true; +exports.abc = "abc"; +exports.default = "default"; \ No newline at end of file diff --git a/test/cases/cjs-tree-shaking/namespace/namespace-via-literal.js b/test/cases/cjs-tree-shaking/namespace/namespace-via-literal.js new file mode 100644 index 00000000000..21867372a67 --- /dev/null +++ b/test/cases/cjs-tree-shaking/namespace/namespace-via-literal.js @@ -0,0 +1,5 @@ +module.exports = { + __esModule: true, + abc: "abc", + default: "default" +}; diff --git a/test/cases/cjs-tree-shaking/non-root-this/index.js b/test/cases/cjs-tree-shaking/non-root-this/index.js new file mode 100644 index 00000000000..491ea592f97 --- /dev/null +++ b/test/cases/cjs-tree-shaking/non-root-this/index.js @@ -0,0 +1,5 @@ +it("should not rewrite this nested in functions", () => { + const f = require("./module").fff; + expect(f.test1).toBe(true); + expect(f.test2).toBe(true); +}); diff --git a/test/cases/cjs-tree-shaking/non-root-this/module.js b/test/cases/cjs-tree-shaking/non-root-this/module.js new file mode 100644 index 00000000000..878ebcb7470 --- /dev/null +++ b/test/cases/cjs-tree-shaking/non-root-this/module.js @@ -0,0 +1,6 @@ +function F() { + this.test1 = true; + Object.defineProperty(this, "test2", { value: true }); +} + +exports.fff = new F(); diff --git a/test/cases/cjs-tree-shaking/object-define-property-replace/index.js b/test/cases/cjs-tree-shaking/object-define-property-replace/index.js new file mode 100644 index 00000000000..b93250f8526 --- /dev/null +++ b/test/cases/cjs-tree-shaking/object-define-property-replace/index.js @@ -0,0 +1,3 @@ +it("should replace Object.defineProperty correctly with brackets", () => { + expect(require("./module").test).toBe(true); +}); diff --git a/test/cases/cjs-tree-shaking/object-define-property-replace/module.js b/test/cases/cjs-tree-shaking/object-define-property-replace/module.js new file mode 100644 index 00000000000..c91b6b8393e --- /dev/null +++ b/test/cases/cjs-tree-shaking/object-define-property-replace/module.js @@ -0,0 +1 @@ +Object.defineProperty(((this)), "test", (((0, { value : true})))); diff --git a/test/cases/cjs-tree-shaking/objects/direct-object.js b/test/cases/cjs-tree-shaking/objects/direct-object.js new file mode 100644 index 00000000000..f32a5fb07fd --- /dev/null +++ b/test/cases/cjs-tree-shaking/objects/direct-object.js @@ -0,0 +1,4 @@ +module.exports = { + abc: "abc", + def: "def" +}; diff --git a/test/cases/cjs-tree-shaking/objects/index.js b/test/cases/cjs-tree-shaking/objects/index.js new file mode 100644 index 00000000000..cf9fa76da0b --- /dev/null +++ b/test/cases/cjs-tree-shaking/objects/index.js @@ -0,0 +1,9 @@ +it("should be able to export an object literal", () => { + expect(require("./direct-object?1").abc).toBe("abc"); + expect(require("./direct-object?2")).toEqual({ abc: "abc", def: "def" }); +}); + +it("should be able to export an object literal indirect", () => { + expect(require("./indirect-object?1").abc).toBe("abc"); + expect(require("./indirect-object?2")).toEqual({ abc: "abc", def: "def" }); +}); diff --git a/test/cases/cjs-tree-shaking/objects/indirect-object.js b/test/cases/cjs-tree-shaking/objects/indirect-object.js new file mode 100644 index 00000000000..9df708c912f --- /dev/null +++ b/test/cases/cjs-tree-shaking/objects/indirect-object.js @@ -0,0 +1,6 @@ +var value = { + abc: "abc", + def: "def" +}; + +module.exports = value; diff --git a/test/cases/cjs-tree-shaking/parsing/index.js b/test/cases/cjs-tree-shaking/parsing/index.js new file mode 100644 index 00000000000..e9d67111622 --- /dev/null +++ b/test/cases/cjs-tree-shaking/parsing/index.js @@ -0,0 +1,3 @@ +it("should parse nested requires successfully", () => { + expect(require("./nested-require").value).toBe(42); +}); diff --git a/test/cases/cjs-tree-shaking/parsing/module.js b/test/cases/cjs-tree-shaking/parsing/module.js new file mode 100644 index 00000000000..0d52636bf73 --- /dev/null +++ b/test/cases/cjs-tree-shaking/parsing/module.js @@ -0,0 +1,2 @@ +exports.fn = a => a + 1; +exports.value = 41; diff --git a/test/cases/cjs-tree-shaking/parsing/nested-require.js b/test/cases/cjs-tree-shaking/parsing/nested-require.js new file mode 100644 index 00000000000..0193f671bbd --- /dev/null +++ b/test/cases/cjs-tree-shaking/parsing/nested-require.js @@ -0,0 +1 @@ +exports.value = require("./module").fn(require("./module").value); diff --git a/test/cases/cjs-tree-shaking/reexports/add-to-counter.js b/test/cases/cjs-tree-shaking/reexports/add-to-counter.js new file mode 100644 index 00000000000..d4e43695db0 --- /dev/null +++ b/test/cases/cjs-tree-shaking/reexports/add-to-counter.js @@ -0,0 +1,5 @@ +const counter = require("./counter"); +counter.value++; + +exports.abc = 42; +exports.abcUsed = __webpack_exports_info__.abc.used; diff --git a/test/cases/cjs-tree-shaking/reexports/counter.js b/test/cases/cjs-tree-shaking/reexports/counter.js new file mode 100644 index 00000000000..06819f2d417 --- /dev/null +++ b/test/cases/cjs-tree-shaking/reexports/counter.js @@ -0,0 +1 @@ +exports.value = 0; diff --git a/test/cases/cjs-tree-shaking/reexports/index.js b/test/cases/cjs-tree-shaking/reexports/index.js new file mode 100644 index 00000000000..44ca88f2e71 --- /dev/null +++ b/test/cases/cjs-tree-shaking/reexports/index.js @@ -0,0 +1,75 @@ +it("should allow to reexport a exports object (this, exports)", () => { + expect(require("./reexport-whole-exports?1").module1.abc).toBe("abc"); + expect(require("./reexport-whole-exports?2").module2.abc).toBe("abc"); + expect(require("./reexport-whole-exports?3").module3.abc).toBe("abc"); + expect(require("./reexport-whole-exports?4").module4.abc).toBe("abc"); +}); + +it("should allow to reexport a exports object (module.exports, object literal)", () => { + expect(require("./reexport-whole-module-exports?1").module1.abc).toBe("abc"); + expect(require("./reexport-whole-module-exports?2").module2.abc).toBe("abc"); + expect(require("./reexport-whole-module-exports?3").module3.abc).toBe("abc"); + expect(require("./reexport-whole-module-exports?4").module4.abc).toBe("abc"); +}); + +it("should allow to reexport a imported property (this, exports)", () => { + expect(require("./reexport-property-exports?1").property1).toBe("abc"); + expect(require("./reexport-property-exports?2").property2).toBe("abc"); + expect(require("./reexport-property-exports?3").property3).toBe("abc"); + expect(require("./reexport-property-exports?4").property4).toBe("abc"); +}); + +it("should allow to reexport a imported property (module.exports, object literal)", () => { + expect(require("./reexport-property-module-exports?1").property1).toBe("abc"); + expect(require("./reexport-property-module-exports?2").property2).toBe("abc"); + expect(require("./reexport-property-module-exports?3").property3).toBe("abc"); + expect(require("./reexport-property-module-exports?4").property4).toBe("abc"); +}); + +it("should allow to reexport a reexported exports object (this, exports)", () => { + expect(require("./reexport-reexport-exports?1").reexport1.abc).toBe("abc"); + expect(require("./reexport-reexport-exports?2").reexport2.abc).toBe("abc"); + expect(require("./reexport-reexport-exports?3").reexport3.abc).toBe("abc"); + expect(require("./reexport-reexport-exports?4").reexport4.abc).toBe("abc"); +}); + +it("should allow to reexport a reexported exports object (module.exports, object literal)", () => { + expect(require("./reexport-reexport-module-exports?1").reexport1.abc).toBe( + "abc" + ); + expect(require("./reexport-reexport-module-exports?2").reexport2.abc).toBe( + "abc" + ); + expect(require("./reexport-reexport-module-exports?3").reexport3.abc).toBe( + "abc" + ); + expect(require("./reexport-reexport-module-exports?4").reexport4.abc).toBe( + "abc" + ); +}); + +it("should keep executing modules even when unused", () => { + const counter = require("./counter"); + counter.value = 0; + exports.unused1 = require("./add-to-counter?1"); + exports.unused2 = require("./add-to-counter?2").abc; + expect((exports.unused3 = require("./add-to-counter?3").abc)).toBe(42); + expect(counter.value).toBe(3); + if (process.env.NODE_ENV === "production") { + expect(require("./add-to-counter?1").abcUsed).toBe(false); + expect(require("./add-to-counter?2").abcUsed).toBe(false); + } + expect(require("./add-to-counter?3").abcUsed).toBe(true); +}); + +it("should allow to reexport a reexported module that bails out (indirect)", () => { + const abc = require("./reexport?reexport-whole-exports?bailout").module1.abc; + const bailout = Object(require("./module?we1?bailout")); + expect(abc).toBe(bailout.abc); +}); + +it("should allow to reexport a reexported module that bails out (direct)", () => { + const abc = require("./reexport?module?bailout").abc; + const bailout = Object(require("./module?bailout")); + expect(abc).toBe(bailout.abc); +}); diff --git a/test/cases/cjs-tree-shaking/reexports/module.js b/test/cases/cjs-tree-shaking/reexports/module.js new file mode 100644 index 00000000000..0d3ae437956 --- /dev/null +++ b/test/cases/cjs-tree-shaking/reexports/module.js @@ -0,0 +1,2 @@ +exports.abc = "abc"; +exports.def = "def"; diff --git a/test/cases/cjs-tree-shaking/reexports/reexport-property-exports.js b/test/cases/cjs-tree-shaking/reexports/reexport-property-exports.js new file mode 100644 index 00000000000..d00b940f2ff --- /dev/null +++ b/test/cases/cjs-tree-shaking/reexports/reexport-property-exports.js @@ -0,0 +1,6 @@ +exports.property1 = require("./module?pe1" + __resourceQuery).abc; +var m2 = require("./module?pe2" + __resourceQuery); +exports.property2 = m2.abc; +this.property3 = require("./module?pe3" + __resourceQuery).abc; +var m4 = require("./module?pe4" + __resourceQuery); +this.property4 = m4.abc; diff --git a/test/cases/cjs-tree-shaking/reexports/reexport-property-module-exports.js b/test/cases/cjs-tree-shaking/reexports/reexport-property-module-exports.js new file mode 100644 index 00000000000..67c70f7e44b --- /dev/null +++ b/test/cases/cjs-tree-shaking/reexports/reexport-property-module-exports.js @@ -0,0 +1,8 @@ +var m2 = require("./module?pme2" + __resourceQuery); +module.exports = { + property1: require("./module?pme1" + __resourceQuery).abc, + property2: m2.abc +}; +module.exports.property3 = require("./module?pme3" + __resourceQuery).abc; +var m4 = require("./module?pme4" + __resourceQuery); +module.exports.property4 = m4.abc; diff --git a/test/cases/cjs-tree-shaking/reexports/reexport-reexport-exports.js b/test/cases/cjs-tree-shaking/reexports/reexport-reexport-exports.js new file mode 100644 index 00000000000..5caa9905d9d --- /dev/null +++ b/test/cases/cjs-tree-shaking/reexports/reexport-reexport-exports.js @@ -0,0 +1,8 @@ +exports.reexport1 = require("./reexport-whole-exports?x1" + + __resourceQuery).module1; +var m2 = require("./reexport-whole-exports?x2" + __resourceQuery); +exports.reexport2 = m2.module2; +this.reexport3 = require("./reexport-whole-exports?x3" + + __resourceQuery).module3; +var m4 = require("./reexport-whole-exports?x4" + __resourceQuery); +this.reexport4 = m4.module4; diff --git a/test/cases/cjs-tree-shaking/reexports/reexport-reexport-module-exports.js b/test/cases/cjs-tree-shaking/reexports/reexport-reexport-module-exports.js new file mode 100644 index 00000000000..8d267934d94 --- /dev/null +++ b/test/cases/cjs-tree-shaking/reexports/reexport-reexport-module-exports.js @@ -0,0 +1,10 @@ +var m2 = require("./reexport-whole-module-exports?x2" + __resourceQuery); +module.exports = { + reexport1: require("./reexport-whole-module-exports?x1" + __resourceQuery) + .module1, + reexport2: m2.module2 +}; +module.exports.reexport3 = require("./reexport-whole-module-exports?x3" + + __resourceQuery).module3; +var m4 = require("./reexport-whole-module-exports?x4" + __resourceQuery); +module.exports.reexport4 = m4.module4; diff --git a/test/cases/cjs-tree-shaking/reexports/reexport-whole-exports.js b/test/cases/cjs-tree-shaking/reexports/reexport-whole-exports.js new file mode 100644 index 00000000000..11ca850bade --- /dev/null +++ b/test/cases/cjs-tree-shaking/reexports/reexport-whole-exports.js @@ -0,0 +1,6 @@ +exports.module1 = require("./module?we1" + __resourceQuery); +var m2 = require("./module?we2" + __resourceQuery); +exports.module2 = m2; +this.module3 = require("./module?we3" + __resourceQuery); +var m4 = require("./module?we4" + __resourceQuery); +this.module4 = m4; diff --git a/test/cases/cjs-tree-shaking/reexports/reexport-whole-module-exports.js b/test/cases/cjs-tree-shaking/reexports/reexport-whole-module-exports.js new file mode 100644 index 00000000000..cd4a36713bd --- /dev/null +++ b/test/cases/cjs-tree-shaking/reexports/reexport-whole-module-exports.js @@ -0,0 +1,8 @@ +var module2 = require("./module?wme2" + __resourceQuery); +module.exports = { + module1: require("./module?wme1" + __resourceQuery), + module2 +}; +module.exports.module3 = require("./module?wme3" + __resourceQuery); +var m4 = require("./module?wme4" + __resourceQuery); +module.exports.module4 = m4; diff --git a/test/cases/cjs-tree-shaking/reexports/reexport.js b/test/cases/cjs-tree-shaking/reexports/reexport.js new file mode 100644 index 00000000000..70530548836 --- /dev/null +++ b/test/cases/cjs-tree-shaking/reexports/reexport.js @@ -0,0 +1 @@ +module.exports = require("./" + __resourceQuery.slice(1)); diff --git a/test/cases/cjs-tree-shaking/transpiled/babel-default-interop.js b/test/cases/cjs-tree-shaking/transpiled/babel-default-interop.js new file mode 100644 index 00000000000..8accb6fef41 --- /dev/null +++ b/test/cases/cjs-tree-shaking/transpiled/babel-default-interop.js @@ -0,0 +1,5 @@ +var xxx = _interopRequireDefault(require("./module?2")); +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; +} +module.exports = xxx.default.abc; diff --git a/test/cases/cjs-tree-shaking/transpiled/index.js b/test/cases/cjs-tree-shaking/transpiled/index.js new file mode 100644 index 00000000000..d7a8a7e2e3d --- /dev/null +++ b/test/cases/cjs-tree-shaking/transpiled/index.js @@ -0,0 +1,14 @@ +it("should support typescript export *", () => { + expect(require("./typescript-reexport").abc).toBe("abc"); +}); + +it("should support babel default interop", () => { + var xxx2 = _interopRequireDefault(require("./module?2")); + var xxx3 = _interopRequireDefault(require("./module?3")); + expect(xxx2.default.abc).toBe("abc"); + expect(xxx3.default).toEqual({ abc: "abc", def: "def" }); +}); + +function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; +} diff --git a/test/cases/cjs-tree-shaking/transpiled/module.js b/test/cases/cjs-tree-shaking/transpiled/module.js new file mode 100644 index 00000000000..0d3ae437956 --- /dev/null +++ b/test/cases/cjs-tree-shaking/transpiled/module.js @@ -0,0 +1,2 @@ +exports.abc = "abc"; +exports.def = "def"; diff --git a/test/cases/cjs-tree-shaking/transpiled/typescript-reexport.js b/test/cases/cjs-tree-shaking/transpiled/typescript-reexport.js new file mode 100644 index 00000000000..1d623783ab4 --- /dev/null +++ b/test/cases/cjs-tree-shaking/transpiled/typescript-reexport.js @@ -0,0 +1,4 @@ +function __export(m) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} +__export(require("./module?1")); diff --git a/test/cases/cjs-tree-shaking/weird-names/index.js b/test/cases/cjs-tree-shaking/weird-names/index.js new file mode 100644 index 00000000000..453a0120cbf --- /dev/null +++ b/test/cases/cjs-tree-shaking/weird-names/index.js @@ -0,0 +1,16 @@ +import m from "./module"; + +it("should allow any name as exports in CommonJs", () => { + expect(m.abc).toBe("abc"); + expect(m[""]).toBe(""); + expect(m["default"]).toBe("default"); + expect(m["0"]).toBe("0"); + expect(m[1]).toBe(1); + expect(m.length).toBe("length"); + expect(m["0_0"]).toBe("0_0"); + expect(m.if).toBe("if"); + expect(m["\0"]).toBe("\0"); + expect(m["\n"]).toBe("\n"); + expect(m["*/"]).toBe("*/"); + expect(m["a.b.c"]).toBe("a.b.c"); +}); diff --git a/test/cases/cjs-tree-shaking/weird-names/module.js b/test/cases/cjs-tree-shaking/weird-names/module.js new file mode 100644 index 00000000000..af166b75536 --- /dev/null +++ b/test/cases/cjs-tree-shaking/weird-names/module.js @@ -0,0 +1,12 @@ +exports.abc = "abc"; +exports[""] = ""; +exports["default"] = "default"; +exports["0"] = "0"; +exports[1] = 1; +exports.length = "length"; +exports["0_0"] = "0_0"; +exports.if = "if"; +exports["\0"] = "\0"; +exports["\n"] = "\n"; +exports["*/"] = "*/"; +exports["a.b.c"] = "a.b.c"; diff --git a/test/cases/code-generation/issue-12232/index.js b/test/cases/code-generation/issue-12232/index.js new file mode 100644 index 00000000000..3035641d409 --- /dev/null +++ b/test/cases/code-generation/issue-12232/index.js @@ -0,0 +1,5 @@ +import * as X from "./module"; + +it("should generate valid code", () => { + expect(X["x\\"]).toBe(42); +}); diff --git a/test/cases/code-generation/issue-12232/module.js b/test/cases/code-generation/issue-12232/module.js new file mode 100644 index 00000000000..8bbfebb5686 --- /dev/null +++ b/test/cases/code-generation/issue-12232/module.js @@ -0,0 +1,3 @@ +module.exports = { + "x\\": 42 +}; diff --git a/test/cases/compile/error-hide-stack/errors.js b/test/cases/compile/error-hide-stack/errors.js index 709dd36e710..6d8bf4df7a7 100644 --- a/test/cases/compile/error-hide-stack/errors.js +++ b/test/cases/compile/error-hide-stack/errors.js @@ -1,3 +1,3 @@ module.exports = [ - [/Module build failed( \(from [^)]+\))?:\nMessage\nStack/] + [/Module build failed( \(from [^)]+\))?:\nMessage/, { details: /Stack/ }] ]; diff --git a/test/cases/compile/error-hide-stack/infrastructure-log.js b/test/cases/compile/error-hide-stack/infrastructure-log.js new file mode 100644 index 00000000000..83685aa57b3 --- /dev/null +++ b/test/cases/compile/error-hide-stack/infrastructure-log.js @@ -0,0 +1,3 @@ +module.exports = [ + /^Pack got invalid because of write to: Compilation\/modules.+loader\.js!$/ +]; diff --git a/test/cases/compile/error-hide-stack/loader.js b/test/cases/compile/error-hide-stack/loader.js index 674e66c655f..b499c32a083 100644 --- a/test/cases/compile/error-hide-stack/loader.js +++ b/test/cases/compile/error-hide-stack/loader.js @@ -1,6 +1,8 @@ -module.exports = function() { +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { var err = new Error("Message"); err.stack = "Stack"; + //@ts-expect-error hideStack is not a property on normal errors err.hideStack = true; throw err; }; diff --git a/test/cases/compile/long-module-chain/index.js b/test/cases/compile/long-module-chain/index.js new file mode 100644 index 00000000000..9e5db4611e9 --- /dev/null +++ b/test/cases/compile/long-module-chain/index.js @@ -0,0 +1,3 @@ +it("should compile a long module chain fine", () => { + require.resolveWeak("./module?800"); // this is orphan +}); diff --git a/test/cases/compile/long-module-chain/module.js b/test/cases/compile/long-module-chain/module.js new file mode 100644 index 00000000000..10eccfc47bd --- /dev/null +++ b/test/cases/compile/long-module-chain/module.js @@ -0,0 +1,5 @@ +if(__resourceQuery === "?0") { + module.exports = "module"; +} else { + module.exports = require("./module?" + (+__resourceQuery.slice(1) - 1)); +} diff --git a/test/cases/concord/inner-modules-and-extensions/index.js b/test/cases/concord/inner-modules-and-extensions/index.js deleted file mode 100644 index 4a2f7000fd6..00000000000 --- a/test/cases/concord/inner-modules-and-extensions/index.js +++ /dev/null @@ -1,12 +0,0 @@ -it("should resolve the alias in package.json", function() { - expect(require("app/file").default).toBe("file"); -}); - -it("should resolve the alias and extensions in package.json", function() { - expect(require("app/file2").default).toBe("correct file2"); -}); - -it("should resolve the alias in package.json", function() { - expect(require("thing").default).toBe("the thing"); -}); - diff --git a/test/cases/concord/inner-modules-and-extensions/modules/app/file.js b/test/cases/concord/inner-modules-and-extensions/modules/app/file.js deleted file mode 100644 index 7d6f52bc64b..00000000000 --- a/test/cases/concord/inner-modules-and-extensions/modules/app/file.js +++ /dev/null @@ -1 +0,0 @@ -export default "file"; diff --git a/test/cases/concord/inner-modules-and-extensions/modules/app/file2.js b/test/cases/concord/inner-modules-and-extensions/modules/app/file2.js deleted file mode 100644 index becf23de52d..00000000000 --- a/test/cases/concord/inner-modules-and-extensions/modules/app/file2.js +++ /dev/null @@ -1 +0,0 @@ -export default "wrong file2"; diff --git a/test/cases/concord/inner-modules-and-extensions/modules/app/file2.my-js b/test/cases/concord/inner-modules-and-extensions/modules/app/file2.my-js deleted file mode 100644 index 86502c23168..00000000000 --- a/test/cases/concord/inner-modules-and-extensions/modules/app/file2.my-js +++ /dev/null @@ -1 +0,0 @@ -export default "correct file2"; diff --git a/test/cases/concord/inner-modules-and-extensions/package.json b/test/cases/concord/inner-modules-and-extensions/package.json deleted file mode 100644 index 31705cfca3c..00000000000 --- a/test/cases/concord/inner-modules-and-extensions/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "concord": { - "modules": { - "app/**": "./modules/app/**", - "thing": "./the-thing" - }, - "extensions": [ - ".my-js", - ".js" - ] - } -} \ No newline at end of file diff --git a/test/cases/concord/inner-modules-and-extensions/the-thing.js b/test/cases/concord/inner-modules-and-extensions/the-thing.js deleted file mode 100644 index dd329027bb4..00000000000 --- a/test/cases/concord/inner-modules-and-extensions/the-thing.js +++ /dev/null @@ -1 +0,0 @@ -export default "the thing"; \ No newline at end of file diff --git a/test/cases/context/import-meta-webpack-context/dir/four.js b/test/cases/context/import-meta-webpack-context/dir/four.js new file mode 100644 index 00000000000..a9bbdd80578 --- /dev/null +++ b/test/cases/context/import-meta-webpack-context/dir/four.js @@ -0,0 +1 @@ +module.exports = 4; diff --git a/test/cases/context/import-meta-webpack-context/index.js b/test/cases/context/import-meta-webpack-context/index.js new file mode 100644 index 00000000000..9ad5d42ee59 --- /dev/null +++ b/test/cases/context/import-meta-webpack-context/index.js @@ -0,0 +1,27 @@ +it("should allow prefetch/preload", function() { + const contextRequire = import.meta.webpackContext("./dir", { + prefetch: true, + preload: 1 + }); + expect(contextRequire("./four")).toBe(4); +}); + +it("should allow include/exclude", function() { + const contextRequire = import.meta.webpackContext(".", { + recursive: false, + regExp: /two/, + mode: "weak", + exclude: /three/ + }); + expect(function() { + contextRequire("./two-three") + }).toThrowError(/Cannot find module/); +}); + +it("should allow chunkName", function() { + const contextRequire = import.meta.webpackContext(".", { + regExp: /two-three/, + chunkName: "chunk012" + }); + expect(contextRequire("./two-three")).toBe(3); +}); diff --git a/test/cases/context/import-meta-webpack-context/two-three.js b/test/cases/context/import-meta-webpack-context/two-three.js new file mode 100644 index 00000000000..690aad34a46 --- /dev/null +++ b/test/cases/context/import-meta-webpack-context/two-three.js @@ -0,0 +1 @@ +module.exports = 3; diff --git a/test/cases/context/import-meta-webpack-context/two.js b/test/cases/context/import-meta-webpack-context/two.js new file mode 100644 index 00000000000..4bbffde1044 --- /dev/null +++ b/test/cases/context/import-meta-webpack-context/two.js @@ -0,0 +1 @@ +module.exports = 2; diff --git a/test/cases/parsing/inject-free-vars/x1.js b/test/cases/context/issue-10969/folder/file1.js similarity index 100% rename from test/cases/parsing/inject-free-vars/x1.js rename to test/cases/context/issue-10969/folder/file1.js diff --git a/test/cases/context/issue-10969/index.js b/test/cases/context/issue-10969/index.js new file mode 100644 index 00000000000..200b8f31018 --- /dev/null +++ b/test/cases/context/issue-10969/index.js @@ -0,0 +1,12 @@ +it("should replace ! with %21 in the module id string of the context module", function () { + const moduleId = require.context( + "./folder", + true, + /^(?!file1\.js$).*$/i, + "lazy" + ).id; + if (typeof moduleId !== "number") + expect(moduleId).toBe( + "./context/issue-10969/folder lazy recursive ^(?%21file1\\.js$).*$i" + ); +}); diff --git a/test/cases/context/issue-18752/folder/file.js b/test/cases/context/issue-18752/folder/file.js new file mode 100644 index 00000000000..cb234ade61b --- /dev/null +++ b/test/cases/context/issue-18752/folder/file.js @@ -0,0 +1,9 @@ +export function generateSummary() { + return 1; +} +export function entityActionQueue() { + return 2; +} +export function bar() { + return 3; +} diff --git a/test/cases/context/issue-18752/index.js b/test/cases/context/issue-18752/index.js new file mode 100644 index 00000000000..0a4603bf4cd --- /dev/null +++ b/test/cases/context/issue-18752/index.js @@ -0,0 +1,18 @@ +it("should work with importing the same file twice and destructuring", async () => { + const type = "file"; + const { generateSummary } = await import( + /* webpackInclude: /[/\\]folder[/\\](?!.*\.test).*\.m?js$/ */ + /* webpackChunkName: "chunk-name" */ + /* webpackMode: "lazy-once" */ + `./folder/${type}.js` + ); + expect(typeof generateSummary).toBe("function"); + + const { entityActionQueue } = await import( + /* webpackInclude: /[/\\]folder[/\\](?!.*\.test).*\.m?js$/ */ + /* webpackChunkName: "chunk-name" */ + /* webpackMode: "lazy-once" */ + `./folder/${type}.js` + ); + expect(typeof entityActionQueue).toBe("function"); +}); diff --git a/test/cases/context/issue-5750/warnings.js b/test/cases/context/issue-5750/warnings.js index 62587ab93e0..957d94c627f 100644 --- a/test/cases/context/issue-5750/warnings.js +++ b/test/cases/context/issue-5750/warnings.js @@ -1,3 +1,3 @@ module.exports = [ - [/Critical dependency: Contexts can't use RegExps with the 'g' or 'y' flags/], + [/Critical dependency: Contexts can't use RegExps with the 'g' or 'y' flags/] ]; diff --git a/test/cases/entry-exports-field/import-and-require/index.js b/test/cases/entry-exports-field/import-and-require/index.js new file mode 100644 index 00000000000..7ae29e69264 --- /dev/null +++ b/test/cases/entry-exports-field/import-and-require/index.js @@ -0,0 +1,7 @@ +import d1 from "pck"; +const d2 = require("pck"); + +it("require and import for the same request", () => { + expect(d1).toBe(2); + expect(d2).toBe(1); +}); diff --git a/test/cases/entry-exports-field/import-and-require/node_modules/pck/import.js b/test/cases/entry-exports-field/import-and-require/node_modules/pck/import.js new file mode 100644 index 00000000000..842e368a0a2 --- /dev/null +++ b/test/cases/entry-exports-field/import-and-require/node_modules/pck/import.js @@ -0,0 +1 @@ +export default 2; diff --git a/test/cases/entry-exports-field/import-and-require/node_modules/pck/package.json b/test/cases/entry-exports-field/import-and-require/node_modules/pck/package.json new file mode 100644 index 00000000000..f6fca37a211 --- /dev/null +++ b/test/cases/entry-exports-field/import-and-require/node_modules/pck/package.json @@ -0,0 +1,9 @@ +{ + "name": "pck", + "exports": { + ".": { + "require": "./require.js", + "import": "./import.js" + } + } +} diff --git a/test/cases/entry-exports-field/import-and-require/node_modules/pck/require.js b/test/cases/entry-exports-field/import-and-require/node_modules/pck/require.js new file mode 100644 index 00000000000..bd816eaba4c --- /dev/null +++ b/test/cases/entry-exports-field/import-and-require/node_modules/pck/require.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/test/cases/entry-exports-field/imports/index.js b/test/cases/entry-exports-field/imports/index.js new file mode 100644 index 00000000000..03782a7d809 --- /dev/null +++ b/test/cases/entry-exports-field/imports/index.js @@ -0,0 +1,6 @@ +import d1 from "./pkg.mjs"; +import d2 from "#internal"; + +it("imports field to resolve to the same", () => { + expect(d1).toBe(d2); +}); diff --git a/test/cases/entry-exports-field/imports/package.json b/test/cases/entry-exports-field/imports/package.json new file mode 100644 index 00000000000..2b416f27ebf --- /dev/null +++ b/test/cases/entry-exports-field/imports/package.json @@ -0,0 +1,7 @@ +{ + "name": "pkg", + "exports": "./pkg.mjs", + "imports": { + "#internal": "./pkg.mjs" + } +} \ No newline at end of file diff --git a/test/cases/entry-exports-field/imports/pkg.mjs b/test/cases/entry-exports-field/imports/pkg.mjs new file mode 100644 index 00000000000..3fa44fe7fa6 --- /dev/null +++ b/test/cases/entry-exports-field/imports/pkg.mjs @@ -0,0 +1 @@ +export default 'pkg'; diff --git a/test/cases/entry-exports-field/loader/file.txt b/test/cases/entry-exports-field/loader/file.txt new file mode 100644 index 00000000000..190a18037c6 --- /dev/null +++ b/test/cases/entry-exports-field/loader/file.txt @@ -0,0 +1 @@ +123 diff --git a/test/cases/entry-exports-field/loader/index.js b/test/cases/entry-exports-field/loader/index.js new file mode 100644 index 00000000000..8c7168b56ab --- /dev/null +++ b/test/cases/entry-exports-field/loader/index.js @@ -0,0 +1,5 @@ +import d1 from "toml-parser!./file.txt"; + +it("should resolve loader using exports field", () => { + expect(d1).toBe("123\ntoml"); +}); diff --git a/test/cases/parsing/requirejs/file.js b/test/cases/entry-exports-field/loader/node_modules/toml-parser/index.js similarity index 100% rename from test/cases/parsing/requirejs/file.js rename to test/cases/entry-exports-field/loader/node_modules/toml-parser/index.js diff --git a/test/cases/entry-exports-field/loader/node_modules/toml-parser/loader.js b/test/cases/entry-exports-field/loader/node_modules/toml-parser/loader.js new file mode 100644 index 00000000000..70461ac821c --- /dev/null +++ b/test/cases/entry-exports-field/loader/node_modules/toml-parser/loader.js @@ -0,0 +1 @@ +module.exports = c => `module.exports = ${JSON.stringify(c.trim() + "\ntoml")}`; diff --git a/test/cases/entry-exports-field/loader/node_modules/toml-parser/package.json b/test/cases/entry-exports-field/loader/node_modules/toml-parser/package.json new file mode 100644 index 00000000000..2287d5db81d --- /dev/null +++ b/test/cases/entry-exports-field/loader/node_modules/toml-parser/package.json @@ -0,0 +1,9 @@ +{ + "name": "toml-loader", + "main": "index.js", + "exports": { + ".": { + "loader": "./loader.js" + } + } +} diff --git a/test/cases/entry-exports-field/self/index.js b/test/cases/entry-exports-field/self/index.js new file mode 100644 index 00000000000..0a20bc1c6cd --- /dev/null +++ b/test/cases/entry-exports-field/self/index.js @@ -0,0 +1,9 @@ +import dataImport from "@scope/self/a.js"; +import dataRequire from "./module1.js"; +import importChainEndsWithRequire from "./module3.js"; + +it("should respect type of import", function() { + expect(dataImport).toBe(1); + expect(dataRequire).toBe(2); + expect(importChainEndsWithRequire).toBe(2); +}); diff --git a/test/cases/entry-exports-field/self/lib/b.js b/test/cases/entry-exports-field/self/lib/b.js new file mode 100644 index 00000000000..aef22247d75 --- /dev/null +++ b/test/cases/entry-exports-field/self/lib/b.js @@ -0,0 +1 @@ +export default 1; diff --git a/test/cases/entry-exports-field/self/lib/c.js b/test/cases/entry-exports-field/self/lib/c.js new file mode 100644 index 00000000000..842e368a0a2 --- /dev/null +++ b/test/cases/entry-exports-field/self/lib/c.js @@ -0,0 +1 @@ +export default 2; diff --git a/test/cases/entry-exports-field/self/module1.js b/test/cases/entry-exports-field/self/module1.js new file mode 100644 index 00000000000..05f57a297c9 --- /dev/null +++ b/test/cases/entry-exports-field/self/module1.js @@ -0,0 +1 @@ +module.exports = require("@scope/self/a.js"); diff --git a/test/cases/entry-exports-field/self/module2.js b/test/cases/entry-exports-field/self/module2.js new file mode 100644 index 00000000000..2ad5f386911 --- /dev/null +++ b/test/cases/entry-exports-field/self/module2.js @@ -0,0 +1,2 @@ +import d from "./module1"; +export default d; diff --git a/test/cases/entry-exports-field/self/module3.js b/test/cases/entry-exports-field/self/module3.js new file mode 100644 index 00000000000..5794fa8f334 --- /dev/null +++ b/test/cases/entry-exports-field/self/module3.js @@ -0,0 +1,2 @@ +import d from "./module2.js"; +export default d; diff --git a/test/cases/entry-exports-field/self/package.json b/test/cases/entry-exports-field/self/package.json new file mode 100644 index 00000000000..2e2c280a13f --- /dev/null +++ b/test/cases/entry-exports-field/self/package.json @@ -0,0 +1,10 @@ +{ + "name": "@scope/self", + "version": "1.0.0", + "exports": { + "./a.js": { + "import": "./lib/b.js", + "require": "./lib/c.js" + } + } +} diff --git a/test/cases/entry-inline/no-var-leak-strict/index.js b/test/cases/entry-inline/no-var-leak-strict/index.js new file mode 100644 index 00000000000..bf7fd565e5d --- /dev/null +++ b/test/cases/entry-inline/no-var-leak-strict/index.js @@ -0,0 +1,10 @@ +var localVar = 42; + +it("should not leak localVar to other modules", () => { + expect(localVar).toBe(42); + import(/* webpackMode: "eager" */ "./module").then(module => { + expect(module.default).toBe("undefined"); + }); +}); + +export {}; diff --git a/test/cases/entry-inline/no-var-leak-strict/module.js b/test/cases/entry-inline/no-var-leak-strict/module.js new file mode 100644 index 00000000000..8ed1c267cda --- /dev/null +++ b/test/cases/entry-inline/no-var-leak-strict/module.js @@ -0,0 +1 @@ +export default typeof localVar; diff --git a/test/cases/entry-inline/no-var-leak/index.js b/test/cases/entry-inline/no-var-leak/index.js new file mode 100644 index 00000000000..a383a6bc6ad --- /dev/null +++ b/test/cases/entry-inline/no-var-leak/index.js @@ -0,0 +1,6 @@ +var localVar = 42; + +it("should not leak localVar to other modules", () => { + expect(localVar).toBe(42); + expect(require("./module")).toBe("undefined"); +}); diff --git a/test/cases/entry-inline/no-var-leak/module.js b/test/cases/entry-inline/no-var-leak/module.js new file mode 100644 index 00000000000..e4550cf77a6 --- /dev/null +++ b/test/cases/entry-inline/no-var-leak/module.js @@ -0,0 +1 @@ +module.exports = typeof localVar; diff --git a/test/cases/errors/case-sensitive/test.filter.js b/test/cases/errors/case-sensitive/test.filter.js index 9ae7a5027bc..001c5f0682f 100644 --- a/test/cases/errors/case-sensitive/test.filter.js +++ b/test/cases/errors/case-sensitive/test.filter.js @@ -1,6 +1,6 @@ -var fs = require("fs"); -var path = require("path"); +const fs = require("fs"); +const path = require("path"); -module.exports = function(config) { +module.exports = function (config) { return fs.existsSync(path.join(__dirname, "TEST.FILTER.JS")); }; diff --git a/test/cases/errors/case-sensitive/warnings.js b/test/cases/errors/case-sensitive/warnings.js index 99ac2e5cf9e..1a2c38230f1 100644 --- a/test/cases/errors/case-sensitive/warnings.js +++ b/test/cases/errors/case-sensitive/warnings.js @@ -1,4 +1,12 @@ module.exports = [ - [/There are multiple modules with names that only differ in casing/, /case-sensitive.A\.js/, /case-sensitive.a\.js/], - [/There are multiple modules with names that only differ in casing/, /case-sensitive.B.file\.js/, /case-sensitive.b.file\.js/] + [ + /There are multiple modules with names that only differ in casing/, + /case-sensitive.A\.js/, + /case-sensitive.a\.js/ + ], + [ + /There are multiple modules with names that only differ in casing/, + /case-sensitive.B.file\.js/, + /case-sensitive.b.file\.js/ + ] ]; diff --git a/test/cases/errors/crash-missing-import/errors.js b/test/cases/errors/crash-missing-import/errors.js index 4eefda428cf..d85236a2c74 100644 --- a/test/cases/errors/crash-missing-import/errors.js +++ b/test/cases/errors/crash-missing-import/errors.js @@ -1,3 +1 @@ -module.exports = [ - [/Module not found/], -]; +module.exports = [[/Module not found/]]; diff --git a/test/cases/errors/crash-missing-import/index.js b/test/cases/errors/crash-missing-import/index.js index 55c9b56c6c8..4e5b8906706 100644 --- a/test/cases/errors/crash-missing-import/index.js +++ b/test/cases/errors/crash-missing-import/index.js @@ -1,4 +1,3 @@ -it("should not crash when imported module is missing", function() { -}); +it("should not crash when imported module is missing", function() {}); -require.include("./a"); +if (Math.random() < 0) require("./a"); diff --git a/test/cases/errors/cyclic-reexport-references/a.js b/test/cases/errors/cyclic-reexport-references/a.js new file mode 100644 index 00000000000..fc5ea6b3b5a --- /dev/null +++ b/test/cases/errors/cyclic-reexport-references/a.js @@ -0,0 +1,3 @@ +import { B } from "./cycle"; + +export const A = B; diff --git a/test/cases/errors/cyclic-reexport-references/b.js b/test/cases/errors/cyclic-reexport-references/b.js new file mode 100644 index 00000000000..ab1029e4a85 --- /dev/null +++ b/test/cases/errors/cyclic-reexport-references/b.js @@ -0,0 +1,3 @@ +import { A } from "./cycle"; + +export const B = A; diff --git a/test/cases/errors/cyclic-reexport-references/cycle.js b/test/cases/errors/cyclic-reexport-references/cycle.js new file mode 100644 index 00000000000..bfd87cc235c --- /dev/null +++ b/test/cases/errors/cyclic-reexport-references/cycle.js @@ -0,0 +1,2 @@ +export { A } from "./a"; +export { B } from "./b"; diff --git a/test/cases/errors/cyclic-reexport-references/index.js b/test/cases/errors/cyclic-reexport-references/index.js new file mode 100644 index 00000000000..138590cd546 --- /dev/null +++ b/test/cases/errors/cyclic-reexport-references/index.js @@ -0,0 +1,5 @@ +it("should fail with a ReferenceError", () => { + expect(() => { + require("./cycle"); + }).toThrow(); +}); diff --git a/test/cases/errors/harmony-import-missing/errors.js b/test/cases/errors/harmony-import-missing/errors.js index 6084546bf7b..baab751255d 100644 --- a/test/cases/errors/harmony-import-missing/errors.js +++ b/test/cases/errors/harmony-import-missing/errors.js @@ -1,5 +1 @@ -module.exports = [ - [ - /Can't resolve '.\/missing'/ - ] -]; +module.exports = [[/Can't resolve '.\/missing'/]]; diff --git a/test/cases/errors/harmony-import-missing2/a.js b/test/cases/errors/harmony-import-missing2/a.js new file mode 100644 index 00000000000..173df5cb056 --- /dev/null +++ b/test/cases/errors/harmony-import-missing2/a.js @@ -0,0 +1 @@ +export var test = "test"; diff --git a/test/cases/errors/harmony-import-missing2/errors.js b/test/cases/errors/harmony-import-missing2/errors.js new file mode 100644 index 00000000000..67d1f2321a3 --- /dev/null +++ b/test/cases/errors/harmony-import-missing2/errors.js @@ -0,0 +1,4 @@ +module.exports = [ + [/Can't resolve '.\/missing1'/], + [/Can't resolve '.\/missing2'/] +]; diff --git a/test/cases/errors/harmony-import-missing2/index.js b/test/cases/errors/harmony-import-missing2/index.js new file mode 100644 index 00000000000..77cb8d2ed72 --- /dev/null +++ b/test/cases/errors/harmony-import-missing2/index.js @@ -0,0 +1,11 @@ +it("should not crash on importing missing modules", function() { + expect(function() { + require("./module1"); + }).toThrowError(); +}); + +it("should not crash on importing missing modules", function() { + expect(function() { + require("./module2"); + }).toThrowError(); +}); diff --git a/test/cases/errors/harmony-import-missing2/module1.js b/test/cases/errors/harmony-import-missing2/module1.js new file mode 100644 index 00000000000..cc6275d1650 --- /dev/null +++ b/test/cases/errors/harmony-import-missing2/module1.js @@ -0,0 +1,2 @@ +export * from "./missing1"; +export * from "./a?1"; diff --git a/test/cases/errors/harmony-import-missing2/module2.js b/test/cases/errors/harmony-import-missing2/module2.js new file mode 100644 index 00000000000..3b41b648333 --- /dev/null +++ b/test/cases/errors/harmony-import-missing2/module2.js @@ -0,0 +1,2 @@ +export { a } from "./missing2"; +export * from "./a?2"; diff --git a/test/cases/errors/import-module-cycle-multiple/1/a.json b/test/cases/errors/import-module-cycle-multiple/1/a.json new file mode 100644 index 00000000000..9a389c9696a --- /dev/null +++ b/test/cases/errors/import-module-cycle-multiple/1/a.json @@ -0,0 +1 @@ +"./a.json" diff --git a/test/cases/errors/import-module-cycle-multiple/2/a.json b/test/cases/errors/import-module-cycle-multiple/2/a.json new file mode 100644 index 00000000000..75e02a30f04 --- /dev/null +++ b/test/cases/errors/import-module-cycle-multiple/2/a.json @@ -0,0 +1 @@ +"./b.json" diff --git a/test/cases/errors/import-module-cycle-multiple/2/b.json b/test/cases/errors/import-module-cycle-multiple/2/b.json new file mode 100644 index 00000000000..9a389c9696a --- /dev/null +++ b/test/cases/errors/import-module-cycle-multiple/2/b.json @@ -0,0 +1 @@ +"./a.json" diff --git a/test/cases/errors/import-module-cycle-multiple/3/a.json b/test/cases/errors/import-module-cycle-multiple/3/a.json new file mode 100644 index 00000000000..75e02a30f04 --- /dev/null +++ b/test/cases/errors/import-module-cycle-multiple/3/a.json @@ -0,0 +1 @@ +"./b.json" diff --git a/test/cases/errors/import-module-cycle-multiple/3/b.json b/test/cases/errors/import-module-cycle-multiple/3/b.json new file mode 100644 index 00000000000..5a2d1989f77 --- /dev/null +++ b/test/cases/errors/import-module-cycle-multiple/3/b.json @@ -0,0 +1 @@ +"./c.json" diff --git a/test/cases/errors/import-module-cycle-multiple/3/c.json b/test/cases/errors/import-module-cycle-multiple/3/c.json new file mode 100644 index 00000000000..9a389c9696a --- /dev/null +++ b/test/cases/errors/import-module-cycle-multiple/3/c.json @@ -0,0 +1 @@ +"./a.json" diff --git a/test/cases/errors/import-module-cycle-multiple/4/a.json b/test/cases/errors/import-module-cycle-multiple/4/a.json new file mode 100644 index 00000000000..08a6371d338 --- /dev/null +++ b/test/cases/errors/import-module-cycle-multiple/4/a.json @@ -0,0 +1 @@ +["./b.json", "./b.json"] diff --git a/test/cases/errors/import-module-cycle-multiple/4/b.json b/test/cases/errors/import-module-cycle-multiple/4/b.json new file mode 100644 index 00000000000..5a2d1989f77 --- /dev/null +++ b/test/cases/errors/import-module-cycle-multiple/4/b.json @@ -0,0 +1 @@ +"./c.json" diff --git a/test/cases/errors/import-module-cycle-multiple/4/c.json b/test/cases/errors/import-module-cycle-multiple/4/c.json new file mode 100644 index 00000000000..fe51488c706 --- /dev/null +++ b/test/cases/errors/import-module-cycle-multiple/4/c.json @@ -0,0 +1 @@ +[] diff --git a/test/cases/errors/import-module-cycle-multiple/index.js b/test/cases/errors/import-module-cycle-multiple/index.js new file mode 100644 index 00000000000..054ea2e1af6 --- /dev/null +++ b/test/cases/errors/import-module-cycle-multiple/index.js @@ -0,0 +1,31 @@ +it("should error importModule when a cycle with 2 modules is requested", () => { + expect(require("./loader!./2/a")).toEqual([ + ["./b.json", [ + ["./a.json", "err: There is a circular build dependency, which makes it impossible to create this module"] + ]] + ]); +}); +it("should error importModule when a cycle with 3 modules is requested", () => { + expect(require("./loader!./3/a")).toEqual([ + ["./b.json", [ + ["./c.json", [ + ["./a.json", "err: There is a circular build dependency, which makes it impossible to create this module"] + ]] + ]] + ]); +}); +it("should error importModule when requesting itself", () => { + expect(require("./loader!./1/a")).toEqual([ + ["./a.json", "err: There is a circular build dependency, which makes it impossible to create this module"] + ]); +}); +it("should not report a cycle when importModule is used twice", () => { + expect(require("./loader!./4/a")).toEqual([ + ["./b.json", [ + ["./c.json", []] + ]], + ["./b.json", [ + ["./c.json", []] + ]] + ]); +}); diff --git a/test/cases/errors/import-module-cycle-multiple/loader.js b/test/cases/errors/import-module-cycle-multiple/loader.js new file mode 100644 index 00000000000..b5391becfb1 --- /dev/null +++ b/test/cases/errors/import-module-cycle-multiple/loader.js @@ -0,0 +1,24 @@ +/** @type {import("../../../../").LoaderDefinitionFunction} */ +exports.default = function (source) { + const content = JSON.parse(source); + // content is one reference or an array of references + const refs = Array.isArray(content) ? content : [content]; + const callback = this.async(); + const importReferencedModules = async () => { + const loadedRefs = [] + for(const ref of refs) { + try { + const source = await this.importModule("../loader!" + ref); + loadedRefs.push([ref, source]); + } catch (_err) { + const err = /** @type {Error} */ (_err); + loadedRefs.push([ref, `err: ${err && err.message}`]); + } + } + return loadedRefs; + } + + importReferencedModules().then((loadResults) => { + callback(null, JSON.stringify(loadResults)); + }); +}; diff --git a/test/cases/errors/import-module-cycle/1/a.json b/test/cases/errors/import-module-cycle/1/a.json new file mode 100644 index 00000000000..9a389c9696a --- /dev/null +++ b/test/cases/errors/import-module-cycle/1/a.json @@ -0,0 +1 @@ +"./a.json" diff --git a/test/cases/errors/import-module-cycle/2/a.json b/test/cases/errors/import-module-cycle/2/a.json new file mode 100644 index 00000000000..75e02a30f04 --- /dev/null +++ b/test/cases/errors/import-module-cycle/2/a.json @@ -0,0 +1 @@ +"./b.json" diff --git a/test/cases/errors/import-module-cycle/2/b.json b/test/cases/errors/import-module-cycle/2/b.json new file mode 100644 index 00000000000..9a389c9696a --- /dev/null +++ b/test/cases/errors/import-module-cycle/2/b.json @@ -0,0 +1 @@ +"./a.json" diff --git a/test/cases/errors/import-module-cycle/3/a.json b/test/cases/errors/import-module-cycle/3/a.json new file mode 100644 index 00000000000..75e02a30f04 --- /dev/null +++ b/test/cases/errors/import-module-cycle/3/a.json @@ -0,0 +1 @@ +"./b.json" diff --git a/test/cases/errors/import-module-cycle/3/b.json b/test/cases/errors/import-module-cycle/3/b.json new file mode 100644 index 00000000000..5a2d1989f77 --- /dev/null +++ b/test/cases/errors/import-module-cycle/3/b.json @@ -0,0 +1 @@ +"./c.json" diff --git a/test/cases/errors/import-module-cycle/3/c.json b/test/cases/errors/import-module-cycle/3/c.json new file mode 100644 index 00000000000..9a389c9696a --- /dev/null +++ b/test/cases/errors/import-module-cycle/3/c.json @@ -0,0 +1 @@ +"./a.json" diff --git a/test/cases/errors/import-module-cycle/index.js b/test/cases/errors/import-module-cycle/index.js new file mode 100644 index 00000000000..3d5f92f0087 --- /dev/null +++ b/test/cases/errors/import-module-cycle/index.js @@ -0,0 +1,15 @@ +it("should error importModule when a cycle with 2 modules is requested", () => { + expect(require("./loader!./2/a")).toMatch( + /^source: err: There is a circular build dependency/ + ); +}); +it("should error importModule when a cycle with 3 modules is requested", () => { + expect(require("./loader!./3/a")).toMatch( + /^source: source: err: There is a circular build dependency/ + ); +}); +it("should error importModule when requesting itself", () => { + expect(require("./loader!./1/a")).toMatch( + /^err: There is a circular build dependency/ + ); +}); diff --git a/test/cases/errors/import-module-cycle/loader.js b/test/cases/errors/import-module-cycle/loader.js new file mode 100644 index 00000000000..5c911ed80ef --- /dev/null +++ b/test/cases/errors/import-module-cycle/loader.js @@ -0,0 +1,12 @@ +/** @type {import("../../../../").LoaderDefinition} */ +exports.default = function (source) { + const ref = JSON.parse(source); + const callback = this.async(); + this.importModule("../loader!" + ref, {}, (err, exports) => { + if (err) { + callback(null, JSON.stringify(`err: ${err && err.message}`)); + } else { + callback(null, JSON.stringify(`source: ${exports}`)); + } + }); +}; diff --git a/test/cases/errors/load-module-cycle-multiple/1/a.json b/test/cases/errors/load-module-cycle-multiple/1/a.json new file mode 100644 index 00000000000..9a389c9696a --- /dev/null +++ b/test/cases/errors/load-module-cycle-multiple/1/a.json @@ -0,0 +1 @@ +"./a.json" diff --git a/test/cases/errors/load-module-cycle-multiple/2/a.json b/test/cases/errors/load-module-cycle-multiple/2/a.json new file mode 100644 index 00000000000..75e02a30f04 --- /dev/null +++ b/test/cases/errors/load-module-cycle-multiple/2/a.json @@ -0,0 +1 @@ +"./b.json" diff --git a/test/cases/errors/load-module-cycle-multiple/2/b.json b/test/cases/errors/load-module-cycle-multiple/2/b.json new file mode 100644 index 00000000000..9a389c9696a --- /dev/null +++ b/test/cases/errors/load-module-cycle-multiple/2/b.json @@ -0,0 +1 @@ +"./a.json" diff --git a/test/cases/errors/load-module-cycle-multiple/3/a.json b/test/cases/errors/load-module-cycle-multiple/3/a.json new file mode 100644 index 00000000000..75e02a30f04 --- /dev/null +++ b/test/cases/errors/load-module-cycle-multiple/3/a.json @@ -0,0 +1 @@ +"./b.json" diff --git a/test/cases/errors/load-module-cycle-multiple/3/b.json b/test/cases/errors/load-module-cycle-multiple/3/b.json new file mode 100644 index 00000000000..5a2d1989f77 --- /dev/null +++ b/test/cases/errors/load-module-cycle-multiple/3/b.json @@ -0,0 +1 @@ +"./c.json" diff --git a/test/cases/errors/load-module-cycle-multiple/3/c.json b/test/cases/errors/load-module-cycle-multiple/3/c.json new file mode 100644 index 00000000000..9a389c9696a --- /dev/null +++ b/test/cases/errors/load-module-cycle-multiple/3/c.json @@ -0,0 +1 @@ +"./a.json" diff --git a/test/cases/errors/load-module-cycle-multiple/4/a.json b/test/cases/errors/load-module-cycle-multiple/4/a.json new file mode 100644 index 00000000000..08a6371d338 --- /dev/null +++ b/test/cases/errors/load-module-cycle-multiple/4/a.json @@ -0,0 +1 @@ +["./b.json", "./b.json"] diff --git a/test/cases/errors/load-module-cycle-multiple/4/b.json b/test/cases/errors/load-module-cycle-multiple/4/b.json new file mode 100644 index 00000000000..5a2d1989f77 --- /dev/null +++ b/test/cases/errors/load-module-cycle-multiple/4/b.json @@ -0,0 +1 @@ +"./c.json" diff --git a/test/cases/errors/load-module-cycle-multiple/4/c.json b/test/cases/errors/load-module-cycle-multiple/4/c.json new file mode 100644 index 00000000000..fe51488c706 --- /dev/null +++ b/test/cases/errors/load-module-cycle-multiple/4/c.json @@ -0,0 +1 @@ +[] diff --git a/test/cases/errors/load-module-cycle-multiple/index.js b/test/cases/errors/load-module-cycle-multiple/index.js new file mode 100644 index 00000000000..c728f5ab60d --- /dev/null +++ b/test/cases/errors/load-module-cycle-multiple/index.js @@ -0,0 +1,31 @@ +it("should error loadModule when a cycle with 2 modules is requested", () => { + expect(require("./loader!./2/a")).toEqual([ + ["./b.json", [ + ["./a.json", "err: There is a circular build dependency, which makes it impossible to create this module"] + ]] + ]); +}); +it("should error loadModule when a cycle with 3 modules is requested", () => { + expect(require("./loader!./3/a")).toEqual([ + ["./b.json", [ + ["./c.json", [ + ["./a.json", "err: There is a circular build dependency, which makes it impossible to create this module"] + ]] + ]] + ]); +}); +it("should error loadModule when requesting itself", () => { + expect(require("./loader!./1/a")).toEqual([ + ["./a.json", "err: There is a circular build dependency, which makes it impossible to create this module"] + ]); +}); +it("should not report a cycle when loadModule is used twice (https://github.com/webpack/webpack/issues/14379)", () => { + expect(require("./loader!./4/a")).toEqual([ + ["./b.json", [ + ["./c.json", []] + ]], + ["./b.json", [ + ["./c.json", []] + ]] + ]); +}); diff --git a/test/cases/errors/load-module-cycle-multiple/loader.js b/test/cases/errors/load-module-cycle-multiple/loader.js new file mode 100644 index 00000000000..65389f59ee0 --- /dev/null +++ b/test/cases/errors/load-module-cycle-multiple/loader.js @@ -0,0 +1,31 @@ +const { promisify } = require("util"); + +/** @type {import("../../../../").LoaderDefinitionFunction} */ +exports.default = function (source) { + const content = JSON.parse(source); + // content is one reference or an array of references + const refs = Array.isArray(content) ? content : [content]; + const callback = this.async(); + const loadModulePromise = promisify(this.loadModule.bind(this)); + + async function loadReferencedModules() { + // Modules are loaded sequentially as the false-positive circular reference + // bug from https://github.com/webpack/webpack/issues/14379 doesn't occur if + // they are loaded in parallel. + const loadedRefs = [] + for(const ref of refs) { + try { + const source = await loadModulePromise("../loader!" + ref); + loadedRefs.push([ref, JSON.parse(source)]); + } catch(_err) { + const err = /** @type {Error} */ (_err); + loadedRefs.push([ref, `err: ${err && err.message}`]); + } + } + return loadedRefs; + } + + loadReferencedModules().then((loadResults) => { + callback(null, JSON.stringify(loadResults)); + }); +}; diff --git a/test/cases/errors/load-module-cycle/1/a.json b/test/cases/errors/load-module-cycle/1/a.json new file mode 100644 index 00000000000..9a389c9696a --- /dev/null +++ b/test/cases/errors/load-module-cycle/1/a.json @@ -0,0 +1 @@ +"./a.json" diff --git a/test/cases/errors/load-module-cycle/2/a.json b/test/cases/errors/load-module-cycle/2/a.json new file mode 100644 index 00000000000..75e02a30f04 --- /dev/null +++ b/test/cases/errors/load-module-cycle/2/a.json @@ -0,0 +1 @@ +"./b.json" diff --git a/test/cases/errors/load-module-cycle/2/b.json b/test/cases/errors/load-module-cycle/2/b.json new file mode 100644 index 00000000000..9a389c9696a --- /dev/null +++ b/test/cases/errors/load-module-cycle/2/b.json @@ -0,0 +1 @@ +"./a.json" diff --git a/test/cases/errors/load-module-cycle/3/a.json b/test/cases/errors/load-module-cycle/3/a.json new file mode 100644 index 00000000000..75e02a30f04 --- /dev/null +++ b/test/cases/errors/load-module-cycle/3/a.json @@ -0,0 +1 @@ +"./b.json" diff --git a/test/cases/errors/load-module-cycle/3/b.json b/test/cases/errors/load-module-cycle/3/b.json new file mode 100644 index 00000000000..5a2d1989f77 --- /dev/null +++ b/test/cases/errors/load-module-cycle/3/b.json @@ -0,0 +1 @@ +"./c.json" diff --git a/test/cases/errors/load-module-cycle/3/c.json b/test/cases/errors/load-module-cycle/3/c.json new file mode 100644 index 00000000000..9a389c9696a --- /dev/null +++ b/test/cases/errors/load-module-cycle/3/c.json @@ -0,0 +1 @@ +"./a.json" diff --git a/test/cases/errors/load-module-cycle/index.js b/test/cases/errors/load-module-cycle/index.js new file mode 100644 index 00000000000..e7b74a9e7c5 --- /dev/null +++ b/test/cases/errors/load-module-cycle/index.js @@ -0,0 +1,15 @@ +it("should error loadModule when a cycle with 2 modules is requested", () => { + expect(require("./loader!./2/a")).toMatch( + /^source: err: There is a circular build dependency/ + ); +}); +it("should error loadModule when a cycle with 3 modules is requested", () => { + expect(require("./loader!./3/a")).toMatch( + /^source: source: err: There is a circular build dependency/ + ); +}); +it("should error loadModule when requesting itself", () => { + expect(require("./loader!./1/a")).toMatch( + /^err: There is a circular build dependency/ + ); +}); diff --git a/test/cases/errors/load-module-cycle/loader.js b/test/cases/errors/load-module-cycle/loader.js new file mode 100644 index 00000000000..7fb570c8014 --- /dev/null +++ b/test/cases/errors/load-module-cycle/loader.js @@ -0,0 +1,12 @@ +/** @type {import("../../../../").LoaderDefinition} */ +exports.default = function (source) { + const ref = JSON.parse(source); + const callback = this.async(); + this.loadModule("../loader!" + ref, (err, source, sourceMap, module) => { + if (err) { + callback(null, JSON.stringify(`err: ${err && err.message}`)); + } else { + callback(null, JSON.stringify(`source: ${JSON.parse(/** @type {string} */ (source))}`)); + } + }); +}; diff --git a/test/cases/errors/load-module-error/a.json b/test/cases/errors/load-module-error/a.json new file mode 100644 index 00000000000..75e02a30f04 --- /dev/null +++ b/test/cases/errors/load-module-error/a.json @@ -0,0 +1 @@ +"./b.json" diff --git a/test/cases/runtime/issue-2391-chunk/file.js b/test/cases/errors/load-module-error/b.json similarity index 100% rename from test/cases/runtime/issue-2391-chunk/file.js rename to test/cases/errors/load-module-error/b.json diff --git a/test/cases/errors/load-module-error/error-loader.js b/test/cases/errors/load-module-error/error-loader.js new file mode 100644 index 00000000000..5758c7646c7 --- /dev/null +++ b/test/cases/errors/load-module-error/error-loader.js @@ -0,0 +1,5 @@ +/** @type {import("../../../../types").LoaderDefinition} */ +module.exports = function(source) { + const callback = this.async(); + callback(new Error("err: abc")); +} diff --git a/test/cases/errors/load-module-error/errors.js b/test/cases/errors/load-module-error/errors.js new file mode 100644 index 00000000000..ce88c1bc32e --- /dev/null +++ b/test/cases/errors/load-module-error/errors.js @@ -0,0 +1 @@ +module.exports = [[/err: abc/], [/The loaded module contains errors/]]; diff --git a/test/cases/errors/load-module-error/index.js b/test/cases/errors/load-module-error/index.js new file mode 100644 index 00000000000..e724ffff78f --- /dev/null +++ b/test/cases/errors/load-module-error/index.js @@ -0,0 +1,5 @@ +it("should error loadModule when the referenced module contains errors", () => { + expect(function() { + require("./loader!./a") + }).toThrowError(); +}); diff --git a/test/cases/errors/load-module-error/infrastructure-log.js b/test/cases/errors/load-module-error/infrastructure-log.js new file mode 100644 index 00000000000..236f5a502ab --- /dev/null +++ b/test/cases/errors/load-module-error/infrastructure-log.js @@ -0,0 +1,3 @@ +module.exports = [ + /^Pack got invalid because of write to: Compilation\/modules|json.+error-loader\.js!/ +]; diff --git a/test/cases/errors/load-module-error/loader.js b/test/cases/errors/load-module-error/loader.js new file mode 100644 index 00000000000..10fe2387ff9 --- /dev/null +++ b/test/cases/errors/load-module-error/loader.js @@ -0,0 +1,12 @@ +/** @type {import("../../../../").LoaderDefinition} */ +exports.default = function (source) { + const callback = this.async(); + const ref = JSON.parse(source); + this.loadModule("./error-loader!" + ref, (err, source, sourceMap, module) => { + if (err) { + callback(err); + } else { + callback(null, JSON.stringify(`source: ${JSON.parse(/** @type {string} */ (source))}`)); + } + }); +}; diff --git a/test/cases/errors/loader-error-warning/error-loader.js b/test/cases/errors/loader-error-warning/error-loader.js index 175192c08da..981790bb520 100644 --- a/test/cases/errors/loader-error-warning/error-loader.js +++ b/test/cases/errors/loader-error-warning/error-loader.js @@ -1,4 +1,6 @@ -module.exports = function(source) { - this.emitError(this.query.substr(1)); +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { + //@ts-expect-error errors must be Errors, string is not recommended and should lead to type error + this.emitError(this.query.slice(1)); return source; -} +}; diff --git a/test/cases/errors/loader-error-warning/errors.js b/test/cases/errors/loader-error-warning/errors.js index c5801200e1c..16bfd86a57f 100644 --- a/test/cases/errors/loader-error-warning/errors.js +++ b/test/cases/errors/loader-error-warning/errors.js @@ -1,12 +1,4 @@ module.exports = [ - [ - /abc/, - /Emitted value instead of an instance of Error/, - /error-loader\.js/ - ], - [ - /def/, - /Emitted value instead of an instance of Error/, - /error-loader\.js/ - ] + [/abc/, /Emitted value instead of an instance of Error/, /error-loader\.js/], + [/def/, /Emitted value instead of an instance of Error/, /error-loader\.js/] ]; diff --git a/test/cases/errors/loader-error-warning/warning-loader.js b/test/cases/errors/loader-error-warning/warning-loader.js index 05142648f6c..90c6ad19d72 100644 --- a/test/cases/errors/loader-error-warning/warning-loader.js +++ b/test/cases/errors/loader-error-warning/warning-loader.js @@ -1,4 +1,6 @@ -module.exports = function(source) { - this.emitWarning(this.query.substr(1)); +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { + //@ts-expect-error warnings must be Errors, string is not recommended and should lead to type error + this.emitWarning(this.query.slice(1)); return source; -} +}; diff --git a/test/cases/errors/loader-error-warning/warnings.js b/test/cases/errors/loader-error-warning/warnings.js index 82ea0b1dd31..c776962fc05 100644 --- a/test/cases/errors/loader-error-warning/warnings.js +++ b/test/cases/errors/loader-error-warning/warnings.js @@ -1,7 +1,3 @@ module.exports = [ - [ - /xyz/, - /Emitted value instead of an instance of Error/, - /warning-loader\.js/ - ] + [/xyz/, /Emitted value instead of an instance of Error/, /warning-loader\.js/] ]; diff --git a/test/cases/errors/mjs-non-fully-specified/dependency.js b/test/cases/errors/mjs-non-fully-specified/dependency.js new file mode 100644 index 00000000000..cb0ff5c3b54 --- /dev/null +++ b/test/cases/errors/mjs-non-fully-specified/dependency.js @@ -0,0 +1 @@ +export {}; diff --git a/test/cases/errors/mjs-non-fully-specified/errors.js b/test/cases/errors/mjs-non-fully-specified/errors.js new file mode 100644 index 00000000000..48dc51c9f63 --- /dev/null +++ b/test/cases/errors/mjs-non-fully-specified/errors.js @@ -0,0 +1,3 @@ +module.exports = [ + [/Can't resolve '.\/dependency'/, /Did you mean 'dependency\.js'\?/] +]; diff --git a/test/cases/errors/mjs-non-fully-specified/index.js b/test/cases/errors/mjs-non-fully-specified/index.js new file mode 100644 index 00000000000..45c233ab60c --- /dev/null +++ b/test/cases/errors/mjs-non-fully-specified/index.js @@ -0,0 +1,5 @@ +it("should not resolve without extension", async () => { + await expect(import("./module.mjs")).rejects.toMatchObject({ + code: "MODULE_NOT_FOUND" + }); +}); diff --git a/test/cases/errors/mjs-non-fully-specified/module.mjs b/test/cases/errors/mjs-non-fully-specified/module.mjs new file mode 100644 index 00000000000..ac7d2a71f53 --- /dev/null +++ b/test/cases/errors/mjs-non-fully-specified/module.mjs @@ -0,0 +1 @@ +import "./dependency"; diff --git a/test/cases/errors/module-request/dependency.js b/test/cases/errors/module-request/dependency.js new file mode 100644 index 00000000000..cb0ff5c3b54 --- /dev/null +++ b/test/cases/errors/module-request/dependency.js @@ -0,0 +1 @@ +export {}; diff --git a/test/cases/errors/module-request/errors.js b/test/cases/errors/module-request/errors.js new file mode 100644 index 00000000000..3a9f5a9a1dd --- /dev/null +++ b/test/cases/errors/module-request/errors.js @@ -0,0 +1,3 @@ +module.exports = [ + [/Can't resolve 'dependency\.js'/, /Did you mean '\.\/dependency\.js'\?/] +]; diff --git a/test/cases/errors/module-request/index.js b/test/cases/errors/module-request/index.js new file mode 100644 index 00000000000..52b1155ca1e --- /dev/null +++ b/test/cases/errors/module-request/index.js @@ -0,0 +1,5 @@ +it("should not resolve module requests relative", async () => { + await expect(import("./module.mjs")).rejects.toMatchObject({ + code: "MODULE_NOT_FOUND" + }); +}); diff --git a/test/cases/errors/module-request/module.mjs b/test/cases/errors/module-request/module.mjs new file mode 100644 index 00000000000..2fbe5336021 --- /dev/null +++ b/test/cases/errors/module-request/module.mjs @@ -0,0 +1 @@ +import "dependency.js"; diff --git a/test/cases/esm/import-meta/index.js b/test/cases/esm/import-meta/index.js new file mode 100644 index 00000000000..8f57a9a700f --- /dev/null +++ b/test/cases/esm/import-meta/index.js @@ -0,0 +1,57 @@ +const { pathToFileURL } = require("url"); +const url = pathToFileURL( + require("path").resolve("./test/cases/esm/import-meta/index.js") +).toString(); +const webpackVersion = parseInt( + require("../../../../package.json").version, + 10 +); + +it('typeof import.meta === "object"', () => { + expect(typeof import.meta).toBe("object"); + if (typeof import.meta !== "object") require("fail"); +}); + +it('typeof import.meta.url === "string"', () => { + expect(typeof import.meta.url).toBe("string"); + if (typeof import.meta.url !== "string") require("fail"); +}); + +it('typeof import.meta.webpack === "number"', () => { + expect(typeof import.meta.webpack).toBe("number"); + if (typeof import.meta.webpack !== "number") require("fail"); +}); + +it("should return correct import.meta.url", () => { + expect(import.meta.url).toBe(url); + expect(import.meta["url"]).toBe(url); + expect("my" + import.meta.url).toBe("my" + url); + if (import.meta.url.indexOf("index.js") === -1) require("fail"); +}); + +it("should return correct import.meta.webpack", () => { + expect(import.meta.webpack).toBe(webpackVersion); + if (import.meta.webpack < 5) require("fail"); + if (import.meta.webpack >= 5) { + } else { + require("fail"); + } +}); + +it("should return undefined for unknown property", () => { + expect(import.meta.other).toBe(undefined); + if (typeof import.meta.other !== "undefined") require("fail"); + expect(() => import.meta.other.other.other).toThrowError(); +}); + +it("should add warning on direct import.meta usage", () => { + expect(Object.keys(import.meta)).toHaveLength(0); +}); + +it("should support destructuring assignment", () => { + let version, url2, c; + ({ webpack: version } = { url: url2 } = { c } = import.meta); + expect(version).toBeTypeOf("number"); + expect(url2).toBe(url); + expect(c).toBe(undefined); +}); diff --git a/test/cases/esm/import-meta/test.filter.js b/test/cases/esm/import-meta/test.filter.js new file mode 100644 index 00000000000..3f0358f64f9 --- /dev/null +++ b/test/cases/esm/import-meta/test.filter.js @@ -0,0 +1,3 @@ +const supportsRequireInModule = require("../../../helpers/supportsRequireInModule"); + +module.exports = config => !config.module || supportsRequireInModule(); diff --git a/test/cases/esm/import-meta/warnings.js b/test/cases/esm/import-meta/warnings.js new file mode 100644 index 00000000000..d8fc384d81d --- /dev/null +++ b/test/cases/esm/import-meta/warnings.js @@ -0,0 +1,5 @@ +module.exports = [ + [ + /Accessing import.meta directly is unsupported \(only property access or destructuring is supported\)/ + ] +]; diff --git a/test/cases/indirect-call/call/dep.js b/test/cases/indirect-call/call/dep.js new file mode 100644 index 00000000000..2d312b5ce01 --- /dev/null +++ b/test/cases/indirect-call/call/dep.js @@ -0,0 +1,3 @@ +export default function dep() { + return this; +}; diff --git a/test/cases/indirect-call/call/index.js b/test/cases/indirect-call/call/index.js new file mode 100644 index 00000000000..a3ef545f255 --- /dev/null +++ b/test/cases/indirect-call/call/index.js @@ -0,0 +1,10 @@ +import a from "./dep.js" + +const global = a(); + +it("should generate indirect call", () => { + expect(a()).toBeUndefined(); + expect((a)()).toBeUndefined(); + expect((a())).toBeUndefined(); + expect(global).toBeUndefined(); +}); diff --git a/test/cases/indirect-call/tagged-template-expression/dep.js b/test/cases/indirect-call/tagged-template-expression/dep.js new file mode 100644 index 00000000000..2d312b5ce01 --- /dev/null +++ b/test/cases/indirect-call/tagged-template-expression/dep.js @@ -0,0 +1,3 @@ +export default function dep() { + return this; +}; diff --git a/test/cases/indirect-call/tagged-template-expression/dep1.js b/test/cases/indirect-call/tagged-template-expression/dep1.js new file mode 100644 index 00000000000..c81820d5cb7 --- /dev/null +++ b/test/cases/indirect-call/tagged-template-expression/dep1.js @@ -0,0 +1,5 @@ +export default function dep() { + return () => { + return this; + }; +}; diff --git a/test/cases/indirect-call/tagged-template-expression/index.js b/test/cases/indirect-call/tagged-template-expression/index.js new file mode 100644 index 00000000000..20e9e1c47ec --- /dev/null +++ b/test/cases/indirect-call/tagged-template-expression/index.js @@ -0,0 +1,12 @@ +import a from "./dep.js" +import b from "./dep1.js" + +const global = a``; + +it("should generate indirect call", () => { + expect(a``).toBeUndefined(); + expect(a`${{a}}`).toBeUndefined(); + expect((a)``).toBeUndefined(); + expect(b()``).toBeUndefined(); + expect(global).toBeUndefined(); +}); diff --git a/test/cases/inner-graph/circular/chunk.js b/test/cases/inner-graph/circular/chunk.js new file mode 100644 index 00000000000..e52ace9af60 --- /dev/null +++ b/test/cases/inner-graph/circular/chunk.js @@ -0,0 +1 @@ +import "./inner"; diff --git a/test/cases/inner-graph/circular/index.js b/test/cases/inner-graph/circular/index.js new file mode 100644 index 00000000000..eadbc521d01 --- /dev/null +++ b/test/cases/inner-graph/circular/index.js @@ -0,0 +1,12 @@ +import { exportAUsed, exportBUsed, exportCUsed } from "./inner"; +import { y } from "./module"; + +it("export should be unused when only unused functions use it", () => { + expect(y("a")).toBe("okBAA"); + expect(exportAUsed).toBe(true); + expect(exportBUsed).toBe(true); + if (process.env.NODE_ENV === "production") { + expect(exportCUsed).toBe(false); + } + return import("./chunk"); +}); diff --git a/test/cases/inner-graph/circular/inner.js b/test/cases/inner-graph/circular/inner.js new file mode 100644 index 00000000000..4565b5dbca0 --- /dev/null +++ b/test/cases/inner-graph/circular/inner.js @@ -0,0 +1,13 @@ +export function A(s) { + return s + "A"; +} +export function B(s) { + return s + "B"; +} +export function C(s) { + return s + "C"; +} + +export const exportAUsed = __webpack_exports_info__.A.used; +export const exportBUsed = __webpack_exports_info__.B.used; +export const exportCUsed = __webpack_exports_info__.C.used; diff --git a/test/cases/inner-graph/circular/module.js b/test/cases/inner-graph/circular/module.js new file mode 100644 index 00000000000..4112322c12a --- /dev/null +++ b/test/cases/inner-graph/circular/module.js @@ -0,0 +1,36 @@ +import { A, B, C } from "./inner"; + +function x(type) { + switch (type) { + case "a": + return withA("b"); + case "b": + return withB("c"); + case "c": + return "ok"; + } +} + +function y(v) { + return withA(v); +} + +function withA(v) { + const value = x(v); + + return A(value); +} + +function withB(v) { + const value = x(v); + + return B(value); +} + +function withC(v) { + const value = x(v); + + return C(value); +} + +export { x, y }; diff --git a/test/cases/inner-graph/circular2/index.js b/test/cases/inner-graph/circular2/index.js new file mode 100644 index 00000000000..abee2105e93 --- /dev/null +++ b/test/cases/inner-graph/circular2/index.js @@ -0,0 +1,14 @@ +import { x, y, z, a, f3 } from "./module"; + +it("should be able to handle circular referenced", () => { + expect(x()).toEqual([y, z]); + const [_a, b, c, d] = a(); + expect(b()).toEqual([a, b, c, d]); + expect(c()).toEqual([a, b, c, d]); + expect(d()).toEqual([a, b, c, d]); + const [f2, f4] = f3(); + const [f1, _f3] = f2(); + expect(_f3).toBe(f3); + expect(f3()).toEqual(f1()); + expect(f2()).toEqual(f4()); +}); diff --git a/test/cases/inner-graph/circular2/module.js b/test/cases/inner-graph/circular2/module.js new file mode 100644 index 00000000000..aabde457b4e --- /dev/null +++ b/test/cases/inner-graph/circular2/module.js @@ -0,0 +1,49 @@ +function x() { + return [y, z]; +} + +function y() { + return [x, z]; +} + +function z() { + return [x, y]; +} + +export { x, y, z }; + +function a() { + return [a, b, c, d]; +} + +function b() { + return [a, b, c, d]; +} + +function c() { + return [a, b, c, d]; +} + +function d() { + return [a, b, c, d]; +} + +export { a }; + +function f1() { + return [f2, f4]; +} + +function f2() { + return [f1, f3]; +} + +function f3() { + return [f2, f4]; +} + +function f4() { + return [f1, f3]; +} + +export { f3 }; diff --git a/test/cases/inner-graph/class-dynamic-props/index.js b/test/cases/inner-graph/class-dynamic-props/index.js new file mode 100644 index 00000000000..a8b69c9ead4 --- /dev/null +++ b/test/cases/inner-graph/class-dynamic-props/index.js @@ -0,0 +1,22 @@ +it("should not throw when using dynamic properties in unused classes", () => { + require("./unused1"); +}); + +it("should not throw when using dynamic properties in used classes", () => { + const exports = require("./used1"); + const x = new exports.Used(); + expect(x.a()).toBe("A"); + expect(x.b).toBe("B"); + expect(x.c).toBe("C"); + expect(exports.Used.d()).toBe("D"); + expect(exports.Used.e).toBe("E"); + expect(exports.Used.f).toBe("F"); + const x2 = new exports.Used2(); + expect(x2.a()).toBe("A"); + expect(x2.b).toBe("B"); + expect(x2.c).toBe("C"); + expect(exports.Used2.d()).toBe("D"); + expect(exports.Used2.e).toBe("E"); + expect(exports.Used2.f).toBe("F"); + expect(x2.x).toBe("X"); +}); diff --git a/test/cases/inner-graph/class-dynamic-props/module.js b/test/cases/inner-graph/class-dynamic-props/module.js new file mode 100644 index 00000000000..f7f9dad52d2 --- /dev/null +++ b/test/cases/inner-graph/class-dynamic-props/module.js @@ -0,0 +1,16 @@ +export const a = () => "a"; +export const A = "A"; +export const b = "b"; +export const B = "B"; +export const c = "c"; +export const C = "C"; +export const d = () => "d"; +export const D = "D"; +export const e = "e"; +export const E = "E"; +export const f = "f"; +export const F = "F"; +export class X { + x = "X"; +} +export const y = "y"; diff --git a/test/cases/inner-graph/class-dynamic-props/test.filter.js b/test/cases/inner-graph/class-dynamic-props/test.filter.js new file mode 100644 index 00000000000..b9bdf244d0d --- /dev/null +++ b/test/cases/inner-graph/class-dynamic-props/test.filter.js @@ -0,0 +1,5 @@ +const supportsClassFields = require("../../../helpers/supportsClassFields"); + +module.exports = function (config) { + return supportsClassFields(); +}; diff --git a/test/cases/inner-graph/class-dynamic-props/unused1.js b/test/cases/inner-graph/class-dynamic-props/unused1.js new file mode 100644 index 00000000000..6abeb0f71c1 --- /dev/null +++ b/test/cases/inner-graph/class-dynamic-props/unused1.js @@ -0,0 +1,37 @@ +import { a, b, c, d, e, f, A, B, C, D, E, F, X } from "./module"; + +class Unused { + [a()]() { + return A; + } + [b] = B; + get [c]() { + return C; + } + static [d()]() { + return D; + } + static [e] = E; + static get [f]() { + return F; + } +} + +class Unused2 extends X { + [a()]() { + return A; + } + [b] = B; + get [c]() { + return C; + } + static [d()]() { + return D; + } + static [e] = E; + static get [f]() { + return F; + } +} + +export {}; diff --git a/test/cases/inner-graph/class-dynamic-props/used1.js b/test/cases/inner-graph/class-dynamic-props/used1.js new file mode 100644 index 00000000000..f9ce10b5bc9 --- /dev/null +++ b/test/cases/inner-graph/class-dynamic-props/used1.js @@ -0,0 +1,37 @@ +import { a, b, c, d, e, f, A, B, C, D, E, F, X } from "./module?1"; + +class Used { + [a()]() { + return A; + } + [b] = B; + get [c]() { + return C; + } + static [d()]() { + return D; + } + static [e] = E; + static get [f]() { + return F; + } +} + +class Used2 extends X { + [a()]() { + return A; + } + [b] = B; + get [c]() { + return C; + } + static [d()]() { + return D; + } + static [e] = E; + static get [f]() { + return F; + } +} + +export { Used, Used2 }; diff --git a/test/cases/inner-graph/export-default-named/a.js b/test/cases/inner-graph/export-default-named/a.js new file mode 100644 index 00000000000..26fc66f8ce3 --- /dev/null +++ b/test/cases/inner-graph/export-default-named/a.js @@ -0,0 +1,5 @@ +import { x } from "./dep?a"; + +export default function abc() { + return x; +} diff --git a/test/cases/inner-graph/export-default-named/b.js b/test/cases/inner-graph/export-default-named/b.js new file mode 100644 index 00000000000..d06132d61e6 --- /dev/null +++ b/test/cases/inner-graph/export-default-named/b.js @@ -0,0 +1,5 @@ +import { x } from "./dep?b"; + +export default function abc() { + return x; +} diff --git a/test/cases/inner-graph/export-default-named/c.js b/test/cases/inner-graph/export-default-named/c.js new file mode 100644 index 00000000000..fd559c7838c --- /dev/null +++ b/test/cases/inner-graph/export-default-named/c.js @@ -0,0 +1,7 @@ +import { x } from "./dep?c"; + +export default function abc() { + return x; +} + +abc(); diff --git a/test/cases/inner-graph/export-default-named/d.js b/test/cases/inner-graph/export-default-named/d.js new file mode 100644 index 00000000000..f0601cf6a8b --- /dev/null +++ b/test/cases/inner-graph/export-default-named/d.js @@ -0,0 +1,7 @@ +import { x } from "./dep?d"; + +export default class def { + method() { + return x; + } +} diff --git a/test/cases/inner-graph/export-default-named/dep.js b/test/cases/inner-graph/export-default-named/dep.js new file mode 100644 index 00000000000..df2c7de6598 --- /dev/null +++ b/test/cases/inner-graph/export-default-named/dep.js @@ -0,0 +1,3 @@ +export const x = "x"; + +export default __webpack_exports_info__.x.used; diff --git a/test/cases/inner-graph/export-default-named/e.js b/test/cases/inner-graph/export-default-named/e.js new file mode 100644 index 00000000000..599ff17fe5b --- /dev/null +++ b/test/cases/inner-graph/export-default-named/e.js @@ -0,0 +1,7 @@ +import { x } from "./dep?e"; + +export default class def { + method() { + return x; + } +} diff --git a/test/cases/inner-graph/export-default-named/f.js b/test/cases/inner-graph/export-default-named/f.js new file mode 100644 index 00000000000..135f9c98ab1 --- /dev/null +++ b/test/cases/inner-graph/export-default-named/f.js @@ -0,0 +1,9 @@ +import { x } from "./dep?f"; + +export default class def { + method() { + return x; + } +} + +new def().method(); diff --git a/test/cases/inner-graph/export-default-named/index.js b/test/cases/inner-graph/export-default-named/index.js new file mode 100644 index 00000000000..8eb272ff672 --- /dev/null +++ b/test/cases/inner-graph/export-default-named/index.js @@ -0,0 +1,46 @@ +import A from "./a"; +import "./b"; +import "./c"; +import D from "./d"; +import "./e"; +import "./f"; + +import a from "./dep?a"; +import b from "./dep?b"; +import c from "./dep?c"; +import d from "./dep?d"; +import e from "./dep?e"; +import f from "./dep?f"; + +it("should generate valid code", () => { + expect(A()).toBe("x"); + expect(new D().method()).toBe("x"); +}); + +it("a should be used", () => { + expect(a).toBe(true); +}); + +if (process.env.NODE_ENV === "production") { + it("b should be unused", () => { + expect(b).toBe(false); + }); +} + +it("c should be used", () => { + expect(c).toBe(true); +}); + +if (process.env.NODE_ENV === "production") { + it("d should be used", () => { + expect(d).toBe(true); + }); + + it("e should be unused", () => { + expect(e).toBe(false); + }); +} + +it("f should be used", () => { + expect(f).toBe(true); +}); diff --git a/test/cases/inner-graph/extend-class/a.js b/test/cases/inner-graph/extend-class/a.js new file mode 100644 index 00000000000..3fd13175a08 --- /dev/null +++ b/test/cases/inner-graph/extend-class/a.js @@ -0,0 +1,14 @@ +import B from "./b.js"; +import { A1 } from "./dep1"; + +export default class A extends B { + constructor() { + super(); + } + test() { + super.test(); + + this.b = new B(); + this.a1 = new A1(); + } +} diff --git a/test/cases/inner-graph/extend-class/b.js b/test/cases/inner-graph/extend-class/b.js new file mode 100644 index 00000000000..478800ea513 --- /dev/null +++ b/test/cases/inner-graph/extend-class/b.js @@ -0,0 +1,10 @@ +import A from "./a.js"; +import { A1 } from "./dep1"; + +export default class B { + constructor() {} + test() { + this.a = new A(); + this.a2 = new A1(); + } +} diff --git a/test/cases/inner-graph/extend-class/c.js b/test/cases/inner-graph/extend-class/c.js new file mode 100644 index 00000000000..9fbff09a7ca --- /dev/null +++ b/test/cases/inner-graph/extend-class/c.js @@ -0,0 +1,21 @@ +import { BaseError, BaseError1, BaseError2, BaseError3 } from "./dep2"; + +export class ExtendedError extends BaseError { + constructor(message) { + super(message); + } +} +export class ExtendedError1 extends BaseError1 { + constructor(message) { + super(message); + } +} +export class ExtendedError2 extends BaseError2 { + myMethod() {} +} +export class ExtendedError3 extends BaseError3 {} +export class ExtendedError4 extends Error { + constructor(message = 'ExtendedError') { + super(message); + } +} diff --git a/test/cases/inner-graph/extend-class/dep1.js b/test/cases/inner-graph/extend-class/dep1.js new file mode 100644 index 00000000000..cdbb374a8b4 --- /dev/null +++ b/test/cases/inner-graph/extend-class/dep1.js @@ -0,0 +1,23 @@ +import { A, B, Z, W } from "./dep2"; + +export const A1 = class A1 extends A { + render() {return new E();} +}; + +class B1 extends B { + render() {return new D();} +} + +export class Z1 extends Z {} + +export class E {} +class D { + foo() { + class B2 extends B {} + + return B2; + } +} + +export const isZ = (new Z1()) instanceof Z; +export { W }; diff --git a/test/cases/inner-graph/extend-class/dep2.js b/test/cases/inner-graph/extend-class/dep2.js new file mode 100644 index 00000000000..75343cd50cf --- /dev/null +++ b/test/cases/inner-graph/extend-class/dep2.js @@ -0,0 +1,40 @@ +export const A = class A {}; +export class B {} +export class C {} +export class Y {} +export class Z {} +export function mixin1(_class) {return _class} +export function mixin2(_class) {return _class} +export function mixin3(_class) {return _class} +export function mixin4(_class) {return _class} +export function mixin5(_class) {return _class} +export function getField() { return "test" } +export class BaseError extends Error {} +export class BaseError1 extends Error {} +export class BaseError2 extends Error {} +export class BaseError3 extends Error {} +export class W {} +export class J {} +export class K {} +var SuperClass = class {}; +export { SuperClass }; + +export const exportsInfoForA = __webpack_exports_info__.A.used; +export const exportsInfoForB = __webpack_exports_info__.B.used; +export const exportsInfoForC = __webpack_exports_info__.C.used; +export const exportsInfoForY = __webpack_exports_info__.Y.used; +export const exportsInfoForZ = __webpack_exports_info__.Z.used; +export const exportsInfoForW = __webpack_exports_info__.W.used; +export const exportsInfoForJ = __webpack_exports_info__.J.used; +export const exportsInfoForK = __webpack_exports_info__.K.used; +export const exportsInfoForMixin1 = __webpack_exports_info__.mixin1.used; +export const exportsInfoForMixin2 = __webpack_exports_info__.mixin2.used; +export const exportsInfoForMixin3 = __webpack_exports_info__.mixin3.used; +export const exportsInfoForMixin4 = __webpack_exports_info__.mixin4.used; +export const exportsInfoForMixin5 = __webpack_exports_info__.mixin5.used; +export const exportsInfoForgetField = __webpack_exports_info__.getField.used; +export const exportsInfoForBaseError = __webpack_exports_info__.BaseError.used; +export const exportsInfoForBaseError1 = __webpack_exports_info__.BaseError1.used; +export const exportsInfoForBaseError2 = __webpack_exports_info__.BaseError2.used; +export const exportsInfoForBaseError3 = __webpack_exports_info__.BaseError3.used; +export const exportsInfoForSuperClass = __webpack_exports_info__.SuperClass.used; diff --git a/test/cases/inner-graph/extend-class/dep3.js b/test/cases/inner-graph/extend-class/dep3.js new file mode 100644 index 00000000000..afeaec1bfbf --- /dev/null +++ b/test/cases/inner-graph/extend-class/dep3.js @@ -0,0 +1,30 @@ +import {mixin1, mixin2, mixin3, getField, A, B, C, Y, mixin4} from "./dep2"; + +export const A1 = class A1 extends A { + render() {return new E();} +}; + +export const B1 = class B1 extends /*#__PURE__*/ mixin1(B) { + render() {return new E();} +}; + +export const C1 = class C1 extends mixin2(Y, /*#__PURE__*/ mixin3(C)) { + render() {return new D();} +}; + +export class Y1 extends /*#__PURE__*/ mixin2(Y) { + constructor() { + super(); + + this.innerClass = class B2 extends mixin1(B) {}; + } + + render() {return new D();} +} + +export class Bar extends /*#__PURE__*/ mixin4(A) { + [/*#__PURE__*/ getField()] = 12; +} + +export class E {} +const D = class D {}; diff --git a/test/cases/inner-graph/extend-class/index.js b/test/cases/inner-graph/extend-class/index.js new file mode 100644 index 00000000000..69f1c125ca2 --- /dev/null +++ b/test/cases/inner-graph/extend-class/index.js @@ -0,0 +1,79 @@ +import { + exportsInfoForA, + exportsInfoForB, + exportsInfoForC, + exportsInfoForY, + exportsInfoForZ, + exportsInfoForW, + exportsInfoForJ, + exportsInfoForK, + exportsInfoForMixin1, + exportsInfoForMixin2, + exportsInfoForMixin3, + exportsInfoForMixin4, + exportsInfoForMixin5, + exportsInfoForBaseError, + exportsInfoForBaseError1, + exportsInfoForBaseError2, + exportsInfoForBaseError3, + exportsInfoForSuperClass +} from "./dep2"; + +it("should load modules correctly", () => { + require("./module1"); + require("./module2"); + require("./module3"); + require("./module4"); + require("./module5"); + require("./module6"); + require("./module7"); + require("./module8"); + require("./module9"); +}); + +if (process.env.NODE_ENV === "production") { + it("W and J should not be used", () => { + expect(exportsInfoForJ).toBe(false); + expect(exportsInfoForW).toBe(false); + }); + + it("Keep extends with constructor", () => { + expect(exportsInfoForBaseError).toBe(true); + expect(exportsInfoForBaseError1).toBe(true); + expect(exportsInfoForBaseError2).toBe(false); + expect(exportsInfoForBaseError3).toBe(false); + }); +} + +it("A should be used", () => { + expect(exportsInfoForA).toBe(true); +}); + +it("B should be used", () => { + expect(exportsInfoForB).toBe(true); +}); + +it("K should be used", () => { + expect(exportsInfoForK).toBe(true); +}); + +it("Z used, inner graph can not determine const usage", () => { + expect(exportsInfoForZ).toBe(true); +}); + +it("SuperClass should be used", () => { + expect(exportsInfoForSuperClass).toBe(true); +}); + +it("Pure super expression should be unused, another used", () => { + if (process.env.NODE_ENV === "production") { + expect(exportsInfoForMixin4).toBe(false); + expect(exportsInfoForMixin5).toBe(false); + } + + expect(exportsInfoForMixin1).toBe(true); + expect(exportsInfoForMixin2).toBe(true); + expect(exportsInfoForMixin3).toBe(true); + expect(exportsInfoForC).toBe(true); + expect(exportsInfoForY).toBe(true); +}); diff --git a/test/cases/inner-graph/extend-class/module1.js b/test/cases/inner-graph/extend-class/module1.js new file mode 100644 index 00000000000..0c535f9b866 --- /dev/null +++ b/test/cases/inner-graph/extend-class/module1.js @@ -0,0 +1,3 @@ +import {A1} from "./dep1"; + +export default new A1(); diff --git a/test/cases/inner-graph/extend-class/module2.js b/test/cases/inner-graph/extend-class/module2.js new file mode 100644 index 00000000000..6a462081a67 --- /dev/null +++ b/test/cases/inner-graph/extend-class/module2.js @@ -0,0 +1,3 @@ +import {A1} from "./dep3"; + +export default new A1(); diff --git a/test/cases/inner-graph/extend-class/module3.js b/test/cases/inner-graph/extend-class/module3.js new file mode 100644 index 00000000000..7a1f7dc8856 --- /dev/null +++ b/test/cases/inner-graph/extend-class/module3.js @@ -0,0 +1,3 @@ +import A from "./a.js"; +let a = new A(); +a.test(); diff --git a/test/cases/inner-graph/extend-class/module4.js b/test/cases/inner-graph/extend-class/module4.js new file mode 100644 index 00000000000..1e78b04f6c1 --- /dev/null +++ b/test/cases/inner-graph/extend-class/module4.js @@ -0,0 +1,3 @@ +import {ExtendedError4} from "./c.js"; + +export default new ExtendedError4() diff --git a/test/cases/inner-graph/extend-class/module5.js b/test/cases/inner-graph/extend-class/module5.js new file mode 100644 index 00000000000..c05aaf0def2 --- /dev/null +++ b/test/cases/inner-graph/extend-class/module5.js @@ -0,0 +1,3 @@ +import { W } from "./dep2"; + +class BaseW extends W {} diff --git a/test/cases/inner-graph/extend-class/module6.js b/test/cases/inner-graph/extend-class/module6.js new file mode 100644 index 00000000000..046e9df215d --- /dev/null +++ b/test/cases/inner-graph/extend-class/module6.js @@ -0,0 +1,4 @@ +import { J } from "./dep2"; + +class BaseJ extends J {} +class BaseBaseJ extends BaseJ {} diff --git a/test/cases/inner-graph/extend-class/module7.js b/test/cases/inner-graph/extend-class/module7.js new file mode 100644 index 00000000000..86c9beccffb --- /dev/null +++ b/test/cases/inner-graph/extend-class/module7.js @@ -0,0 +1,6 @@ +import { K } from "./dep2"; + +class BaseK extends K {} +class BaseBaseK extends BaseK {} + +export default new BaseBaseK(); diff --git a/test/cases/inner-graph/extend-class/module8.js b/test/cases/inner-graph/extend-class/module8.js new file mode 100644 index 00000000000..f2d076b0fe0 --- /dev/null +++ b/test/cases/inner-graph/extend-class/module8.js @@ -0,0 +1,9 @@ +import { mixin5 } from "./dep2"; + +class Bar extends /*#__PURE__*/ mixin5(null) { + static displayName = "Point"; +} + +function test() { + return Bar.displayName; +} diff --git a/test/cases/inner-graph/extend-class/module9.js b/test/cases/inner-graph/extend-class/module9.js new file mode 100644 index 00000000000..efc36d37579 --- /dev/null +++ b/test/cases/inner-graph/extend-class/module9.js @@ -0,0 +1,8 @@ +import { SuperClass } from "./dep2"; + +var UnusedClass = class extends SuperClass { + constructor() { + super(); + } + }, + unusedVariable = new UnusedClass(); diff --git a/test/cases/inner-graph/extend-class/test.filter.js b/test/cases/inner-graph/extend-class/test.filter.js new file mode 100644 index 00000000000..af5bacb6b77 --- /dev/null +++ b/test/cases/inner-graph/extend-class/test.filter.js @@ -0,0 +1,5 @@ +const supportsClassStaticBlock = require("../../../helpers/supportsClassStaticBlock"); + +module.exports = function (config) { + return supportsClassStaticBlock(); +}; diff --git a/test/cases/inner-graph/extend-class2/dep-decl.js b/test/cases/inner-graph/extend-class2/dep-decl.js new file mode 100644 index 00000000000..bcce7df94ae --- /dev/null +++ b/test/cases/inner-graph/extend-class2/dep-decl.js @@ -0,0 +1,166 @@ +import { A, B, getC, getD, getE, getF, Foo, Pure, DateFormatter, ConditionalExpression, LogicalExpression } from "./dep2?decl"; +import { A3, B3, C3, D3, E3, F3, Pure3, ConditionalExpression3, LogicalExpression3 } from "./dep3?decl"; + +export class A1 extends A { + render() { + return new A2(); + } +} + +export class B1 extends B { + render() { + return new B2(); + } +} + +// prettier-ignore +export class C1 extends /*#__PURE__*/ getC() { + render() { + return new C2(); + } +} + +// prettier-ignore +export class D1 extends /*@__PURE__*/ getD() { + render() { + return new D2(); + } +} + +export class E1 extends getE() { + render() { + return new E2(); + } +} + +export class F1 extends getF() { + render() { + return new F2(); + } +} + +function foo(instance) { + return new instance() +} + +class Bar extends Foo { + static prop = 42; + static a = foo(this).prop; + static b = foo(Bar).prop; + static c = foo(super.Bar).prop; + static inStatic1; + static inStatic2; + static inStatic3; + static { + this.inStatic1 = new Bar().prop; + this.inStatic2 = new super.Bar().prop; + this.inStatic3 = (new this).prop; + } +} + +class BarA extends Foo { + static prop = 42; + static a = foo(this).prop; +} + +class BarB extends Foo { + static prop = 42; + static b = foo(Bar).prop; +} + +class BarC extends Foo { + static prop = 42; + static c = foo(super.Bar).prop; +} + +class BarPA extends Foo { + static prop = 42; + static #a = foo(this).prop; +} + +class BarPB extends Foo { + static prop = 42; + static #b = foo(Bar).prop; +} + +class BarPC extends Foo { + static prop = 42; + static #c = foo(super.Bar).prop; +} + +const ExpressionFoo = class Bar extends Foo { + static prop = 42; + static a = foo(this).prop; + static b = foo(Bar).prop; + static c = foo(super.Bar).prop; + static inStatic1; + static inStatic2; + static inStatic3; + static { + this.inStatic1 = new Bar().prop; + this.inStatic2 = new super.Bar().prop; + this.inStatic3 = (new this).prop; + } +} + +export class Baz extends Foo { + static prop = 42; + static a = foo(this).prop; + static b = foo(Bar).prop; + static c = foo(super.Bar).prop; + static inStatic1; + static inStatic2; + static inStatic3; + static { + this.inStatic1 = new Bar().prop; + this.inStatic2 = new super.Bar().prop; + this.inStatic3 = (new this).prop; + } +} + +export default class DefaultBar extends Foo { + static prop = 42; + static a = foo(this).prop; + static b = foo(Bar).prop; + static c = foo(super.Bar).prop; + static inStatic1; + static inStatic2; + static inStatic3; + static { + this.inStatic1 = new Bar().prop; + this.inStatic2 = new super.Bar().prop; + this.inStatic3 = (new this).prop; + } +} + +export class ExtendsPure extends Pure { + render() { + return new Pure3(); + } +} + +export class DateBar extends DateFormatter { + constructor() { + super(); + } + render() {} +} + +export class ConditionalExpression1 extends ConditionalExpression { + render() { + return new ConditionalExpression3(); + } +} + +export class LogicalExpression1 extends LogicalExpression { + render() { + return new LogicalExpression3(); + } +} + +export class A2 extends A3 {} +export class B2 extends B3 {} +export class C2 extends C3 {} +export class D2 extends D3 {} +export class E2 extends E3 {} +export class F2 extends F3 {} diff --git a/test/cases/inner-graph/extend-class2/dep-expr.js b/test/cases/inner-graph/extend-class2/dep-expr.js new file mode 100644 index 00000000000..957b59d98ce --- /dev/null +++ b/test/cases/inner-graph/extend-class2/dep-expr.js @@ -0,0 +1,72 @@ +import {A, B, DateFormatter, getC, getD, getE, getF, Pure, ConditionalExpression, LogicalExpression} from "./dep2?expr"; +import { A3, B3, C3, D3, E3, F3, Pure3} from "./dep3?expr"; + +export const A1 = class extends A { + render() { + return new A2(); + } +}; + +export const B1 = class extends B { + render() { + return new B2(); + } +}; + +// prettier-ignore +export const C1 = class extends /*#__PURE__*/ getC() { + render() { + return new C2(); + } +} + +// prettier-ignore +export const D1 = class extends /*@__PURE__*/ getD() { + render() { + return new D2(); + } +} + +export const E1 = class extends getE() { + render() { + return new E2(); + } +}; + +export const F1 = class extends getF() { + render() { + return new F2(); + } +}; + +export const ExtendsPure = class extends Pure { + render() { + return new Pure3(); + } +}; + +export class DateBar extends DateFormatter { + constructor() { + super(); + } + render() {} +} + +export class ConditionalExpression1 extends ConditionalExpression { + render() { + return new ConditionalExpression3(); + } +} + +export class LogicalExpression1 extends LogicalExpression { + render() { + return new LogicalExpression3(); + } +} + +export const A2 = class extends A3 {}; +export const B2 = class extends B3 {}; +export const C2 = class extends C3 {}; +export const D2 = class extends D3 {}; +export const E2 = class extends E3 {}; +export const F2 = class extends F3 {}; diff --git a/test/cases/inner-graph/extend-class2/dep2.js b/test/cases/inner-graph/extend-class2/dep2.js new file mode 100644 index 00000000000..5581cdd2199 --- /dev/null +++ b/test/cases/inner-graph/extend-class2/dep2.js @@ -0,0 +1,28 @@ +export class A {} +export class B {} +export const getC = () => class C {}; +export const getD = () => class D {}; +export const getE = () => class E {}; +export const getF = () => class F {}; +export class Foo { static Bar = Foo; } +export class Pure {} +export class DateFormatter extends Date { + constructor() { + super(); + this.date = this.getDate(); + } +} +export class ConditionalExpression extends (true ? A : B) {} +export class LogicalExpression extends (A || B) {} + +export const exportsInfoForA = __webpack_exports_info__.A.used; +export const exportsInfoForB = __webpack_exports_info__.B.used; +export const exportsInfoForC = __webpack_exports_info__.getC.used; +export const exportsInfoForD = __webpack_exports_info__.getD.used; +export const exportsInfoForE = __webpack_exports_info__.getE.used; +export const exportsInfoForF = __webpack_exports_info__.getF.used; +export const exportsInfoForFoo = __webpack_exports_info__.Foo.used; +export const exportsInfoForPure = __webpack_exports_info__.Pure.used; +export const exportsInfoForDateFormatter = __webpack_exports_info__.DateFormatter.used; +export const exportsInfoForConditionalExpression = __webpack_exports_info__.ConditionalExpression.used; +export const exportsInfoForLogicalExpression = __webpack_exports_info__.LogicalExpression.used; diff --git a/test/cases/inner-graph/extend-class2/dep3.js b/test/cases/inner-graph/extend-class2/dep3.js new file mode 100644 index 00000000000..74377293433 --- /dev/null +++ b/test/cases/inner-graph/extend-class2/dep3.js @@ -0,0 +1,9 @@ +export class A3 {} +export class B3 {} +export class C3 {} +export class D3 {} +export class E3 {} +export class F3 {} +export class Pure3 {} +export class ConditionalExpression3 extends (true ? A3 : B3) {} +export class LogicalExpression3 extends (A3 || B3) {} diff --git a/test/cases/inner-graph/extend-class2/index.js b/test/cases/inner-graph/extend-class2/index.js new file mode 100644 index 00000000000..87322d5f5b3 --- /dev/null +++ b/test/cases/inner-graph/extend-class2/index.js @@ -0,0 +1,77 @@ +import { + exportsInfoForA as declA, + exportsInfoForB as declB, + exportsInfoForC as declC, + exportsInfoForD as declD, + exportsInfoForE as declE, + exportsInfoForF as declF, + exportsInfoForFoo as declFoo, + exportsInfoForPure as declPure, + exportsInfoForDateFormatter as declDateFormatter, + exportsInfoForConditionalExpression as declConditionalExpression, + exportsInfoForLogicalExpression as declLogicalExpression +} from "./dep2?decl"; +import { + exportsInfoForA as exprA, + exportsInfoForB as exprB, + exportsInfoForC as exprC, + exportsInfoForD as exprD, + exportsInfoForE as exprE, + exportsInfoForF as exprF, + exportsInfoForPure as exprPure, + exportsInfoForDateFormatter as exprDateFormatter, + exportsInfoForConditionalExpression as exprConditionalExpression, + exportsInfoForLogicalExpression as exprLogicalExpression +} from "./dep2?expr"; + +it("should load module correctly", () => { + require("./module-decl"); + require("./module-expr"); +}); + +it("A should be used", () => { + expect(declA).toBe(true); + expect(exprA).toBe(true); +}); + +if (process.env.NODE_ENV === "production") { + it("B should not be used", () => { + expect(declB).toBe(false); + expect(exprB).toBe(false); + }); +} + +it("C should be used", () => { + expect(declC).toBe(true); + expect(exprC).toBe(true); +}); + +if (process.env.NODE_ENV === "production") { + it("D should not be used", () => { + expect(declD).toBe(false); + expect(exprD).toBe(false); + }); +} + +it("E should be used", () => { + expect(declE).toBe(true); + expect(exprE).toBe(true); +}); + +it("F should be used", () => { + if (process.env.NODE_ENV === "production") { + expect(declPure).toBe(false); + expect(exprPure).toBe(false); + expect(declConditionalExpression).toBe(false); + expect(exprConditionalExpression).toBe(false); + expect(declLogicalExpression).toBe(false); + expect(exprLogicalExpression).toBe(false); + } + + // Note: it has side-effects and is not affected by usage of the class + expect(declF).toBe(true); + expect(declFoo).toBe(true); + expect(exprF).toBe(true); + expect(declDateFormatter).toBe(true); + expect(exprDateFormatter).toBe(true); +}); diff --git a/test/cases/inner-graph/extend-class2/module-decl.js b/test/cases/inner-graph/extend-class2/module-decl.js new file mode 100644 index 00000000000..9ca859760f3 --- /dev/null +++ b/test/cases/inner-graph/extend-class2/module-decl.js @@ -0,0 +1,3 @@ +import { A1, C1, E1, DateBar } from "./dep-decl"; + +export default [new A1().render(), new C1().render(), new E1().render(), new DateBar()]; diff --git a/test/cases/inner-graph/extend-class2/module-expr.js b/test/cases/inner-graph/extend-class2/module-expr.js new file mode 100644 index 00000000000..b04d26a339a --- /dev/null +++ b/test/cases/inner-graph/extend-class2/module-expr.js @@ -0,0 +1,3 @@ +import { A1, C1, E1, DateBar } from "./dep-expr"; + +export default [new A1().render(), new C1().render(), new E1().render(), new DateBar()]; diff --git a/test/cases/inner-graph/extend-class2/test.filter.js b/test/cases/inner-graph/extend-class2/test.filter.js new file mode 100644 index 00000000000..af5bacb6b77 --- /dev/null +++ b/test/cases/inner-graph/extend-class2/test.filter.js @@ -0,0 +1,5 @@ +const supportsClassStaticBlock = require("../../../helpers/supportsClassStaticBlock"); + +module.exports = function (config) { + return supportsClassStaticBlock(); +}; diff --git a/test/cases/inner-graph/no-side-effects/index.js b/test/cases/inner-graph/no-side-effects/index.js new file mode 100644 index 00000000000..f4d29083f7e --- /dev/null +++ b/test/cases/inner-graph/no-side-effects/index.js @@ -0,0 +1,3 @@ +it("should be able to load package without side effects where modules are unused", () => { + require("./module"); +}); diff --git a/test/cases/inner-graph/no-side-effects/module.js b/test/cases/inner-graph/no-side-effects/module.js new file mode 100644 index 00000000000..09f115e3dc8 --- /dev/null +++ b/test/cases/inner-graph/no-side-effects/module.js @@ -0,0 +1,3 @@ +import { a } from "./package"; + +export default a; diff --git a/test/cases/inner-graph/no-side-effects/package/index.js b/test/cases/inner-graph/no-side-effects/package/index.js new file mode 100644 index 00000000000..62e7821eda4 --- /dev/null +++ b/test/cases/inner-graph/no-side-effects/package/index.js @@ -0,0 +1,9 @@ +import value from "./unusedModule"; + +export function a() { + return 42; +} + +export function b() { + return value; +} diff --git a/test/cases/inner-graph/no-side-effects/package/package.json b/test/cases/inner-graph/no-side-effects/package/package.json new file mode 100644 index 00000000000..a43829151e1 --- /dev/null +++ b/test/cases/inner-graph/no-side-effects/package/package.json @@ -0,0 +1,3 @@ +{ + "sideEffects": false +} diff --git a/test/cases/inner-graph/no-side-effects/package/unusedModule.js b/test/cases/inner-graph/no-side-effects/package/unusedModule.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/cases/inner-graph/no-side-effects/package/unusedModule.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/cases/inner-graph/pure-in-removed/import-module.js b/test/cases/inner-graph/pure-in-removed/import-module.js new file mode 100644 index 00000000000..f85054392d4 --- /dev/null +++ b/test/cases/inner-graph/pure-in-removed/import-module.js @@ -0,0 +1,11 @@ +import "./module?1"; +import { getX, getY } from "./module?2"; +import { getX as getX2 } from "./module?3"; +import { getY as getY2 } from "./module?4"; + +export function test() { + expect(getX()).toBe(42); + expect(getY()).toBe(42); + expect(getX2()).toBe(42); + expect(getY2()).toBe(42); +} diff --git a/test/cases/inner-graph/pure-in-removed/index.js b/test/cases/inner-graph/pure-in-removed/index.js new file mode 100644 index 00000000000..0d2e98dcb37 --- /dev/null +++ b/test/cases/inner-graph/pure-in-removed/index.js @@ -0,0 +1,3 @@ +it("should generate correct code when pure expressions are in dead branches", () => { + require("./import-module").test(); +}); diff --git a/test/cases/inner-graph/pure-in-removed/module.js b/test/cases/inner-graph/pure-in-removed/module.js new file mode 100644 index 00000000000..642249f514f --- /dev/null +++ b/test/cases/inner-graph/pure-in-removed/module.js @@ -0,0 +1,14 @@ +function f() { + return 43; +} + +if (true) { + var x = /*#__PURE__*/ f() - 1; + var y = 42; +} else { + var x = /*#__PURE__*/ f(); + var y = 43; +} + +export const getX = () => x, + getY = () => y; diff --git a/test/cases/inner-graph/reexport-namespace-and-default/index.js b/test/cases/inner-graph/reexport-namespace-and-default/index.js new file mode 100644 index 00000000000..295a7ba33ff --- /dev/null +++ b/test/cases/inner-graph/reexport-namespace-and-default/index.js @@ -0,0 +1,18 @@ +import { exportDefaultUsed as export1 } from "./package1/script"; +import { exportDefaultUsed as export2 } from "./package1/script2"; +import { exportDefaultUsed as export3 } from "./package2/script"; + +it("should load module correctly", () => { + require("./module"); +}); + +if (process.env.NODE_ENV === "production") { + it("default export should be unused", () => { + expect(export1).toBe(false); + expect(export2).toBe(false); + }); +} + +it("default export should be used", () => { + expect(export3).toBe(true); +}); diff --git a/test/cases/inner-graph/reexport-namespace-and-default/module.js b/test/cases/inner-graph/reexport-namespace-and-default/module.js new file mode 100644 index 00000000000..8d8ef732e7d --- /dev/null +++ b/test/cases/inner-graph/reexport-namespace-and-default/module.js @@ -0,0 +1,4 @@ +import * as script from "./package1/script" +import script1 from "./package2/script"; + +export const mod = script1; diff --git a/test/cases/inner-graph/reexport-namespace-and-default/package1/script.js b/test/cases/inner-graph/reexport-namespace-and-default/package1/script.js new file mode 100644 index 00000000000..71fe9544e2c --- /dev/null +++ b/test/cases/inner-graph/reexport-namespace-and-default/package1/script.js @@ -0,0 +1,5 @@ +import mod from "./script1"; +export default mod; +export * from "./script1"; + +export const exportDefaultUsed = __webpack_exports_info__.default.used; diff --git a/test/cases/inner-graph/reexport-namespace-and-default/package1/script1.js b/test/cases/inner-graph/reexport-namespace-and-default/package1/script1.js new file mode 100644 index 00000000000..cc108809ba4 --- /dev/null +++ b/test/cases/inner-graph/reexport-namespace-and-default/package1/script1.js @@ -0,0 +1,2 @@ +export * from "./script2" +export default 1 diff --git a/test/cases/inner-graph/reexport-namespace-and-default/package1/script2.js b/test/cases/inner-graph/reexport-namespace-and-default/package1/script2.js new file mode 100644 index 00000000000..dd7b295d937 --- /dev/null +++ b/test/cases/inner-graph/reexport-namespace-and-default/package1/script2.js @@ -0,0 +1,5 @@ +import mod from "./script3"; +export default function () { return mod }; +export * from "./script3"; + +export const exportDefaultUsed = __webpack_exports_info__.default.used; diff --git a/test/cases/inner-graph/reexport-namespace-and-default/package1/script3.js b/test/cases/inner-graph/reexport-namespace-and-default/package1/script3.js new file mode 100644 index 00000000000..b0d35f3a137 --- /dev/null +++ b/test/cases/inner-graph/reexport-namespace-and-default/package1/script3.js @@ -0,0 +1 @@ +export default 1 diff --git a/test/cases/inner-graph/reexport-namespace-and-default/package2/script.js b/test/cases/inner-graph/reexport-namespace-and-default/package2/script.js new file mode 100644 index 00000000000..71fe9544e2c --- /dev/null +++ b/test/cases/inner-graph/reexport-namespace-and-default/package2/script.js @@ -0,0 +1,5 @@ +import mod from "./script1"; +export default mod; +export * from "./script1"; + +export const exportDefaultUsed = __webpack_exports_info__.default.used; diff --git a/test/cases/inner-graph/reexport-namespace-and-default/package2/script1.js b/test/cases/inner-graph/reexport-namespace-and-default/package2/script1.js new file mode 100644 index 00000000000..b0d35f3a137 --- /dev/null +++ b/test/cases/inner-graph/reexport-namespace-and-default/package2/script1.js @@ -0,0 +1 @@ +export default 1 diff --git a/test/cases/inner-graph/simple/chunk.js b/test/cases/inner-graph/simple/chunk.js new file mode 100644 index 00000000000..e52ace9af60 --- /dev/null +++ b/test/cases/inner-graph/simple/chunk.js @@ -0,0 +1 @@ +import "./inner"; diff --git a/test/cases/inner-graph/simple/index.js b/test/cases/inner-graph/simple/index.js new file mode 100644 index 00000000000..e993b773d1a --- /dev/null +++ b/test/cases/inner-graph/simple/index.js @@ -0,0 +1,24 @@ +import { + exportUsed, + export2Used, + export3Used, + export4Used, + export5Used, + export6Used +} from "./inner"; +import { f1, pureUsed, fWithDefault } from "./module"; + +it("export should be unused when only unused functions use it", () => { + f1(); + expect(pureUsed).toBe(42); + expect(fWithDefault()).toBe(42); + if (process.env.NODE_ENV === "production") { + expect(exportUsed).toBe(false); + expect(export2Used).toBe(true); + expect(export3Used).toBe(true); + expect(export4Used).toBe(true); + expect(export5Used).toBe(true); + expect(export6Used).toBe(true); + } + return import("./chunk"); +}); diff --git a/test/cases/inner-graph/simple/inner.js b/test/cases/inner-graph/simple/inner.js new file mode 100644 index 00000000000..5885f9cc7b1 --- /dev/null +++ b/test/cases/inner-graph/simple/inner.js @@ -0,0 +1,13 @@ +export const EXPORT = 42; +export const EXPORT2 = 42; +export const EXPORT3 = 42; +export const EXPORT4 = 42; +export const EXPORT5 = () => 42; +export const EXPORT6 = () => 42; + +export const exportUsed = __webpack_exports_info__.EXPORT.used; +export const export2Used = __webpack_exports_info__.EXPORT2.used; +export const export3Used = __webpack_exports_info__.EXPORT3.used; +export const export4Used = __webpack_exports_info__.EXPORT4.used; +export const export5Used = __webpack_exports_info__.EXPORT5.used; +export const export6Used = __webpack_exports_info__.EXPORT6.used; diff --git a/test/cases/inner-graph/simple/module.js b/test/cases/inner-graph/simple/module.js new file mode 100644 index 00000000000..e59ea2672c0 --- /dev/null +++ b/test/cases/inner-graph/simple/module.js @@ -0,0 +1,100 @@ +import { EXPORT, EXPORT2, EXPORT3, EXPORT4, EXPORT5, EXPORT6 } from "./inner"; + +export function f1() { + // no using EXPORT +} + +export function f2() { + return EXPORT; +} + +function f3() { + return EXPORT; +} + +const f4 = function () { + return EXPORT; +}; + +const f5 = () => { + return EXPORT; +}; + +let f6 = () => { + return EXPORT; +}; + +const f7 = () => { + return EXPORT5(); +}; + +const f8 = () => { + return EXPORT6(); +}; + +export function g2() { + return f2(); +} + +export function g3() { + return f3(); +} + +export var g4 = () => f4(); + +export let g5 = () => { + return f5(); +}; + +function ga6() { + return f6() || gb6(); +} + +function gb6() { + return ga6(); +} + +export class g7 { + static f() { + return EXPORT; + } +} + +export const pure1 = EXPORT; +export const pure2 = /*#__PURE__*/ f6(); +const pure3 = /*#__PURE__*/ g5(); +const pure4 = /*#__PURE__*/ f7(f8()); +const pure5 = + ("fefef", 1123, /*#__PURE__*/ f2("fwefe"), /*#__PURE__*/ f2("efwefa")); +const pure6 = /*#__PURE__*/ f2(/*#__PURE__*/ f2(), /*#__PURE__*/ f2()); +const pure7 = /*#__PURE__*/ f2( + class { + f() { + return EXPORT; + } + } +); +const pure8 = /*#__PURE__*/ f2(() => EXPORT); +export const pureUsed = EXPORT3; + +function x1() { + return EXPORT2; +} + +const x2 = function x2() { + return x1(); +}; + +const x3 = () => { + return x2(); +}; + +const x4 = x3(); + +export function fWithDefault(r = EXPORT4) { + return r; +} + +export default (function () { + return EXPORT; +}); diff --git a/test/cases/inner-graph/static-of-class/chunk.js b/test/cases/inner-graph/static-of-class/chunk.js new file mode 100644 index 00000000000..e8c271b93ba --- /dev/null +++ b/test/cases/inner-graph/static-of-class/chunk.js @@ -0,0 +1,2 @@ +import "./other/module-unused"; +import "./other/module-used"; diff --git a/test/cases/inner-graph/static-of-class/import-module.js b/test/cases/inner-graph/static-of-class/import-module.js new file mode 100644 index 00000000000..55bf089192f --- /dev/null +++ b/test/cases/inner-graph/static-of-class/import-module.js @@ -0,0 +1,7 @@ +import "./module-unused"; +import { NativeClass, TranspiledClass } from "./module-used"; + +export function test() { + expect(NativeClass.f()).toBe(42); + expect(TranspiledClass.f()).toBe(42); +} diff --git a/test/cases/inner-graph/static-of-class/index.js b/test/cases/inner-graph/static-of-class/index.js new file mode 100644 index 00000000000..46872190499 --- /dev/null +++ b/test/cases/inner-graph/static-of-class/index.js @@ -0,0 +1,4 @@ +it("should generate correct code when pure expressions are in dead branches", () => { + require("./import-module").test(); + return import("./chunk"); +}); diff --git a/test/cases/inner-graph/static-of-class/module-unused.js b/test/cases/inner-graph/static-of-class/module-unused.js new file mode 100644 index 00000000000..da084901de8 --- /dev/null +++ b/test/cases/inner-graph/static-of-class/module-unused.js @@ -0,0 +1,18 @@ +import { x } from "./other/module-unused"; + +class NativeClass { + static f() { + return 42; + } +} + +var TranspiledClass = /*#__PURE__*/ (function() { + x(); + function C() {} + C.f = function() { + return 42; + }; + return C; +})(); + +export { NativeClass, TranspiledClass }; diff --git a/test/cases/inner-graph/static-of-class/module-used.js b/test/cases/inner-graph/static-of-class/module-used.js new file mode 100644 index 00000000000..ab9b089d8df --- /dev/null +++ b/test/cases/inner-graph/static-of-class/module-used.js @@ -0,0 +1,18 @@ +import { x } from "./other/module-used"; + +class NativeClass { + static f() { + return 42; + } +} + +var TranspiledClass = /*#__PURE__*/ (function() { + x(); + function C() {} + C.f = function() { + return 42; + }; + return C; +})(); + +export { NativeClass, TranspiledClass }; diff --git a/test/cases/inner-graph/static-of-class/other/module-unused.js b/test/cases/inner-graph/static-of-class/other/module-unused.js new file mode 100644 index 00000000000..055ccd29f75 --- /dev/null +++ b/test/cases/inner-graph/static-of-class/other/module-unused.js @@ -0,0 +1 @@ +export function x() {} diff --git a/test/cases/inner-graph/static-of-class/other/module-used.js b/test/cases/inner-graph/static-of-class/other/module-used.js new file mode 100644 index 00000000000..055ccd29f75 --- /dev/null +++ b/test/cases/inner-graph/static-of-class/other/module-used.js @@ -0,0 +1 @@ +export function x() {} diff --git a/test/cases/inner-graph/static-of-class/other/package.json b/test/cases/inner-graph/static-of-class/other/package.json new file mode 100644 index 00000000000..a43829151e1 --- /dev/null +++ b/test/cases/inner-graph/static-of-class/other/package.json @@ -0,0 +1,3 @@ +{ + "sideEffects": false +} diff --git a/test/cases/inner-graph/switch/chunk.js b/test/cases/inner-graph/switch/chunk.js new file mode 100644 index 00000000000..dd258939be9 --- /dev/null +++ b/test/cases/inner-graph/switch/chunk.js @@ -0,0 +1 @@ +import "./some-module"; diff --git a/test/cases/inner-graph/switch/import-module.js b/test/cases/inner-graph/switch/import-module.js new file mode 100644 index 00000000000..c5a1cb3f0fd --- /dev/null +++ b/test/cases/inner-graph/switch/import-module.js @@ -0,0 +1,7 @@ +import doSomething from "./module"; + +export function test() { + doSomething({ + type: "inline" + }); +} diff --git a/test/cases/inner-graph/switch/index.js b/test/cases/inner-graph/switch/index.js new file mode 100644 index 00000000000..ddc9e1ff490 --- /dev/null +++ b/test/cases/inner-graph/switch/index.js @@ -0,0 +1,4 @@ +it("should generate correct code when pure expressions are in dead branches", () => { + require("./import-module").test(); + return Promise.all([import("./some-module"), import("./chunk")]); +}); diff --git a/test/cases/inner-graph/switch/module.js b/test/cases/inner-graph/switch/module.js new file mode 100644 index 00000000000..a3ff0e9b729 --- /dev/null +++ b/test/cases/inner-graph/switch/module.js @@ -0,0 +1,41 @@ +import { Block, Inline, Document } from "./some-module"; + +function getType(obj) { + return obj.type; +} + +// Local functions +function doSomethingWithBlock(obj) { + return Block.doSomething(obj); +} + +function doSomethingWithInline(obj) { + return Inline.doSomething(obj); +} + +function doSomethingWithDocument(obj) { + return Document.doSomething(obj); +} + +// Exported functions +function doSomething(obj) { + const type = getType(obj); + + switch (type) { + case "document": + return doSomethingWithDocument(obj); + case "block": + return doSomethingWithBlock(obj); + case "inline": + return doSomethingWithInline(obj); + default: + throw new Error(); + } +} + +function useDocument(obj) { + return doSomethingWithDocument(obj); +} + +export { useDocument }; +export default doSomething; diff --git a/test/cases/inner-graph/switch/some-module.js b/test/cases/inner-graph/switch/some-module.js new file mode 100644 index 00000000000..c2f406a8e09 --- /dev/null +++ b/test/cases/inner-graph/switch/some-module.js @@ -0,0 +1,13 @@ +class Block { + static doSomething() {} +} + +class Inline { + static doSomething() {} +} + +class Document { + static doSomething() {} +} + +export { Block, Inline, Document }; diff --git a/test/cases/inner-graph/try-globals/import-module.js b/test/cases/inner-graph/try-globals/import-module.js new file mode 100644 index 00000000000..a9d53850334 --- /dev/null +++ b/test/cases/inner-graph/try-globals/import-module.js @@ -0,0 +1,4 @@ +import { ok, ok2 } from "./module"; + +expect(ok).toBe(true); +expect(ok2).toBe(true); diff --git a/test/cases/inner-graph/try-globals/index.js b/test/cases/inner-graph/try-globals/index.js new file mode 100644 index 00000000000..9675576045c --- /dev/null +++ b/test/cases/inner-graph/try-globals/index.js @@ -0,0 +1,3 @@ +it("should not threat globals as pure", () => { + require("./import-module"); +}); diff --git a/test/cases/inner-graph/try-globals/module.js b/test/cases/inner-graph/try-globals/module.js new file mode 100644 index 00000000000..fc03ef946f9 --- /dev/null +++ b/test/cases/inner-graph/try-globals/module.js @@ -0,0 +1,20 @@ +try { + var x = NOT_DEFINED; + var y = x; + var ok = false; +} catch (e) { + var yep = true; + var ok = yep; +} + +try { + const b = a; + var c = b; + const a = 42; + var ok2 = false; + eval(""); // TODO terser has a bug and incorrectly remove this code, eval opts out +} catch (e) { + var ok2 = true; +} + +export { x, y, c, ok, ok2 }; diff --git a/test/cases/json/data/poison b/test/cases/json/data/poison new file mode 100644 index 00000000000..84d53767a2e --- /dev/null +++ b/test/cases/json/data/poison @@ -0,0 +1 @@ +throw new Error("imported") diff --git a/test/cases/json/data/unknown b/test/cases/json/data/unknown new file mode 100644 index 00000000000..12bae17cf72 --- /dev/null +++ b/test/cases/json/data/unknown @@ -0,0 +1 @@ +[1, 2, 3, 4] diff --git a/test/cases/json/default-default-with-concatenation/index.js b/test/cases/json/default-default-with-concatenation/index.js new file mode 100644 index 00000000000..80ce44f0319 --- /dev/null +++ b/test/cases/json/default-default-with-concatenation/index.js @@ -0,0 +1 @@ +import "../default-default"; diff --git a/test/cases/json/default-default/index.js b/test/cases/json/default-default/index.js new file mode 100644 index 00000000000..e31e4cd84dc --- /dev/null +++ b/test/cases/json/default-default/index.js @@ -0,0 +1,7 @@ +import { default as f } from "../data/f.json?default-imported"; +import * as fStar from "../data/f.json?ns-imported"; + +it("should be possible to access a default key", () => { + expect(f.default).toBe("default"); + expect(fStar.default.default).toBe("default"); +}); diff --git a/test/cases/json/import-assertions-type-json/errors.js b/test/cases/json/import-assertions-type-json/errors.js new file mode 100644 index 00000000000..c5c7bd571c6 --- /dev/null +++ b/test/cases/json/import-assertions-type-json/errors.js @@ -0,0 +1,3 @@ +module.exports = [ + [{ moduleName: /data.poison/, message: /Unexpected token .+ JSON/ }] +]; diff --git a/test/cases/json/import-assertions-type-json/import-poison.js b/test/cases/json/import-assertions-type-json/import-poison.js new file mode 100644 index 00000000000..0c1cc934c7d --- /dev/null +++ b/test/cases/json/import-assertions-type-json/import-poison.js @@ -0,0 +1,3 @@ +import poison from "../data/poison" assert { type: "json" }; + +export default poison; diff --git a/test/cases/json/import-assertions-type-json/index.js b/test/cases/json/import-assertions-type-json/index.js new file mode 100644 index 00000000000..d757fbaf4aa --- /dev/null +++ b/test/cases/json/import-assertions-type-json/index.js @@ -0,0 +1,21 @@ +import c from "../data/c.json" assert { type: "json" }; +import unknownJson from "../data/unknown" assert { type: "json" }; +import unknownJs from "../data/unknown"; + +it("should be possible to import json data with import assertion", function () { + expect(c).toEqual([1, 2, 3, 4]); +}); + +it("should be possible to import json data without extension with import assertion", function () { + expect(unknownJson).toEqual([1, 2, 3, 4]); +}); + +it("should be possible to import js without extension without import assertion in the same file", function () { + expect(unknownJs).toEqual({}); +}); + +it("should not be possible to import js with import assertion", function () { + expect(() => { + require("./import-poison.js"); + }).toThrowError(); +}); diff --git a/test/cases/json/import-assertions-type-json/infrastructure-log.js b/test/cases/json/import-assertions-type-json/infrastructure-log.js new file mode 100644 index 00000000000..17279bf2b81 --- /dev/null +++ b/test/cases/json/import-assertions-type-json/infrastructure-log.js @@ -0,0 +1,3 @@ +module.exports = [ + /^Pack got invalid because of write to: Compilation\/modules|json.+json\/data\/poison$/ +]; diff --git a/test/cases/json/import-by-name-with-concatenation/warnings.js b/test/cases/json/import-by-name-with-concatenation/warnings.js new file mode 100644 index 00000000000..82fc687d927 --- /dev/null +++ b/test/cases/json/import-by-name-with-concatenation/warnings.js @@ -0,0 +1,17 @@ +module.exports = [ + [ + /Should not import the named export '2' \(imported as 'c'\) from default-exporting module \(only default export is available soon\)/ + ], + [ + /Should not import the named export 'aa' \(imported as 'aa'\) from default-exporting module \(only default export is available soon\)/ + ], + [ + /Should not import the named export 'bb' \(imported as 'bb'\) from default-exporting module \(only default export is available soon\)/ + ], + [ + /Should not import the named export 'named' \(imported as 'named'\) from default-exporting module \(only default export is available soon\)/ + ], + [ + /Should not import the named export 'named' \(imported as 'gnamed'\) from default-exporting module \(only default export is available soon\)/ + ] +]; diff --git a/test/cases/json/import-by-name/index.js b/test/cases/json/import-by-name/index.js index 20993afb537..9c5ede6f130 100644 --- a/test/cases/json/import-by-name/index.js +++ b/test/cases/json/import-by-name/index.js @@ -10,7 +10,7 @@ it("should be possible to import json data", function() { expect(aa).toBe(1); expect(bb).toBe(2); expect(named).toBe("named"); - (expect({ f })).toEqual({ + expect({ f }).toEqual({ f: { __esModule: true, default: "default", diff --git a/test/cases/json/import-by-name/warnings.js b/test/cases/json/import-by-name/warnings.js new file mode 100644 index 00000000000..82fc687d927 --- /dev/null +++ b/test/cases/json/import-by-name/warnings.js @@ -0,0 +1,17 @@ +module.exports = [ + [ + /Should not import the named export '2' \(imported as 'c'\) from default-exporting module \(only default export is available soon\)/ + ], + [ + /Should not import the named export 'aa' \(imported as 'aa'\) from default-exporting module \(only default export is available soon\)/ + ], + [ + /Should not import the named export 'bb' \(imported as 'bb'\) from default-exporting module \(only default export is available soon\)/ + ], + [ + /Should not import the named export 'named' \(imported as 'named'\) from default-exporting module \(only default export is available soon\)/ + ], + [ + /Should not import the named export 'named' \(imported as 'gnamed'\) from default-exporting module \(only default export is available soon\)/ + ] +]; diff --git a/test/cases/json/import-lazy/index.js b/test/cases/json/import-lazy/index.js index 2837ad304e6..9ead918e385 100644 --- a/test/cases/json/import-lazy/index.js +++ b/test/cases/json/import-lazy/index.js @@ -20,6 +20,7 @@ it("should be possible to import json data async", function() { 1: 2, 2: 3, 3: 4, + length: 4, default: [1, 2, 3, 4] })); expect(d).toEqual(nsObj({ diff --git a/test/cases/json/import-with-type-json/errors.js b/test/cases/json/import-with-type-json/errors.js new file mode 100644 index 00000000000..c5c7bd571c6 --- /dev/null +++ b/test/cases/json/import-with-type-json/errors.js @@ -0,0 +1,3 @@ +module.exports = [ + [{ moduleName: /data.poison/, message: /Unexpected token .+ JSON/ }] +]; diff --git a/test/cases/json/import-with-type-json/import-poison.js b/test/cases/json/import-with-type-json/import-poison.js new file mode 100644 index 00000000000..41905fa6530 --- /dev/null +++ b/test/cases/json/import-with-type-json/import-poison.js @@ -0,0 +1,3 @@ +import poison from "../data/poison" with { type: "json" }; + +export default poison; diff --git a/test/cases/json/import-with-type-json/index.js b/test/cases/json/import-with-type-json/index.js new file mode 100644 index 00000000000..95e23f74729 --- /dev/null +++ b/test/cases/json/import-with-type-json/index.js @@ -0,0 +1,21 @@ +import c from "../data/c.json" with { type: "json" }; +import unknownJson from "../data/unknown" with { type: "json" }; +import unknownJs from "../data/unknown"; + +it("should be possible to import json data with import assertion", function () { + expect(c).toEqual([1, 2, 3, 4]); +}); + +it("should be possible to import json data without extension with import assertion", function () { + expect(unknownJson).toEqual([1, 2, 3, 4]); +}); + +it("should be possible to import js without extension without import assertion in the same file", function () { + expect(unknownJs).toEqual({}); +}); + +it("should not be possible to import js with import assertion", function () { + expect(() => { + require("./import-poison.js"); + }).toThrowError(); +}); diff --git a/test/cases/json/import-with-type-json/infrastructure-log.js b/test/cases/json/import-with-type-json/infrastructure-log.js new file mode 100644 index 00000000000..17279bf2b81 --- /dev/null +++ b/test/cases/json/import-with-type-json/infrastructure-log.js @@ -0,0 +1,3 @@ +module.exports = [ + /^Pack got invalid because of write to: Compilation\/modules|json.+json\/data\/poison$/ +]; diff --git a/test/cases/json/prototype-methods/array.json b/test/cases/json/prototype-methods/array.json new file mode 100644 index 00000000000..07868b19a0d --- /dev/null +++ b/test/cases/json/prototype-methods/array.json @@ -0,0 +1 @@ +[1, 1, 2, 3, 5] diff --git a/test/cases/json/prototype-methods/index.js b/test/cases/json/prototype-methods/index.js new file mode 100644 index 00000000000..c1d14567a3d --- /dev/null +++ b/test/cases/json/prototype-methods/index.js @@ -0,0 +1,20 @@ +import data1 from "./array.json?1"; +import data2 from "./array.json?2"; + +it("should allow to call prototype methods", () => { + expect(data1.map(d => d * 2)).toEqual([2, 2, 4, 6, 10]); + expect(data2.map(d => d * 2)).toEqual([2, 2, 4, 6, 10]); + expect(require("./array.json?2").map(d => d * 2)).toEqual([2, 2, 4, 6, 10]); + expect(require("./array.json?3").map(d => d * 2)).toEqual([2, 2, 4, 6, 10]); + try { + Object.prototype.smoosh = function () { + return this.map(d => d + 1); + }; + expect(data1.smoosh()).toEqual([2, 2, 3, 4, 6]); + expect(data2.smoosh()).toEqual([2, 2, 3, 4, 6]); + expect(require("./array.json?2").smoosh()).toEqual([2, 2, 3, 4, 6]); + expect(require("./array.json?3").smoosh()).toEqual([2, 2, 3, 4, 6]); + } finally { + delete Object.prototype.smoosh; + } +}); diff --git a/test/cases/json/reexport/index.js b/test/cases/json/reexport/index.js new file mode 100644 index 00000000000..aebf4e56c65 --- /dev/null +++ b/test/cases/json/reexport/index.js @@ -0,0 +1,22 @@ +import { e, f, fNamed, fStar, fStarPartial, fStarPartial2 } from "./reexport"; + +it("should be possible to reexport json data", function() { + expect(e.aa).toBe(1); + expect(e.bb).toBe(2); + expect(f).toEqual({ + named: "named", + default: "default", + __esModule: true + }); + expect(fNamed).toBe("named"); + const _fStar = fStar; + expect(_fStar).toEqual( + nsObj({ + named: "named", + default: { named: "named", default: "default", __esModule: true } + }) + ); + expect(_fStar.__esModule).toBe(true); + expect(fStarPartial.default.named).toBe("named"); + expect(fStarPartial2.named).toBe("named"); +}); diff --git a/test/cases/json/reexport/reexport.js b/test/cases/json/reexport/reexport.js new file mode 100644 index 00000000000..427b902724b --- /dev/null +++ b/test/cases/json/reexport/reexport.js @@ -0,0 +1,9 @@ +export { default as e } from "../data/e.json"; +export { default as f } from "../data/f.json?default-exported"; +export { named as fNamed } from "../data/f.json?only-named-exported"; +import * as fStar from "../data/f.json?namespace-object-exported"; +export { fStar }; +import * as fStarPartial from "../data/f.json?namespace-object-exported-but-only-default-named-used"; +export { fStarPartial }; +import * as fStarPartial2 from "../data/f.json?namespace-object-exported-but-only-named-used"; +export { fStarPartial2 }; diff --git a/test/cases/json/reexport/warnings.js b/test/cases/json/reexport/warnings.js new file mode 100644 index 00000000000..c9990f3c988 --- /dev/null +++ b/test/cases/json/reexport/warnings.js @@ -0,0 +1,5 @@ +module.exports = [ + [ + /Should not import the named export 'named' \(reexported as 'fNamed'\) from default-exporting module \(only default export is available soon\)/ + ] +]; diff --git a/test/cases/json/weird-properties/globals.json b/test/cases/json/weird-properties/globals.json new file mode 100644 index 00000000000..ffda94292b3 --- /dev/null +++ b/test/cases/json/weird-properties/globals.json @@ -0,0 +1,1728 @@ +{ + "builtin": { + "Array": false, + "ArrayBuffer": false, + "Atomics": false, + "BigInt": false, + "BigInt64Array": false, + "BigUint64Array": false, + "Boolean": false, + "constructor": false, + "DataView": false, + "Date": false, + "decodeURI": false, + "decodeURIComponent": false, + "encodeURI": false, + "encodeURIComponent": false, + "Error": false, + "escape": false, + "eval": false, + "EvalError": false, + "FinalizationRegistry": false, + "Float32Array": false, + "Float64Array": false, + "Function": false, + "globalThis": false, + "hasOwnProperty": false, + "Infinity": false, + "Int16Array": false, + "Int32Array": false, + "Int8Array": false, + "isFinite": false, + "isNaN": false, + "isPrototypeOf": false, + "JSON": false, + "Map": false, + "Math": false, + "NaN": false, + "Number": false, + "Object": false, + "parseFloat": false, + "parseInt": false, + "Promise": false, + "propertyIsEnumerable": false, + "Proxy": false, + "RangeError": false, + "ReferenceError": false, + "Reflect": false, + "RegExp": false, + "Set": false, + "SharedArrayBuffer": false, + "String": false, + "Symbol": false, + "SyntaxError": false, + "toLocaleString": false, + "toString": false, + "TypeError": false, + "Uint16Array": false, + "Uint32Array": false, + "Uint8Array": false, + "Uint8ClampedArray": false, + "undefined": false, + "unescape": false, + "URIError": false, + "valueOf": false, + "WeakMap": false, + "WeakRef": false, + "WeakSet": false + }, + "es5": { + "Array": false, + "Boolean": false, + "constructor": false, + "Date": false, + "decodeURI": false, + "decodeURIComponent": false, + "encodeURI": false, + "encodeURIComponent": false, + "Error": false, + "escape": false, + "eval": false, + "EvalError": false, + "Function": false, + "hasOwnProperty": false, + "Infinity": false, + "isFinite": false, + "isNaN": false, + "isPrototypeOf": false, + "JSON": false, + "Math": false, + "NaN": false, + "Number": false, + "Object": false, + "parseFloat": false, + "parseInt": false, + "propertyIsEnumerable": false, + "RangeError": false, + "ReferenceError": false, + "RegExp": false, + "String": false, + "SyntaxError": false, + "toLocaleString": false, + "toString": false, + "TypeError": false, + "undefined": false, + "unescape": false, + "URIError": false, + "valueOf": false + }, + "es2015": { + "Array": false, + "ArrayBuffer": false, + "Boolean": false, + "constructor": false, + "DataView": false, + "Date": false, + "decodeURI": false, + "decodeURIComponent": false, + "encodeURI": false, + "encodeURIComponent": false, + "Error": false, + "escape": false, + "eval": false, + "EvalError": false, + "Float32Array": false, + "Float64Array": false, + "Function": false, + "hasOwnProperty": false, + "Infinity": false, + "Int16Array": false, + "Int32Array": false, + "Int8Array": false, + "isFinite": false, + "isNaN": false, + "isPrototypeOf": false, + "JSON": false, + "Map": false, + "Math": false, + "NaN": false, + "Number": false, + "Object": false, + "parseFloat": false, + "parseInt": false, + "Promise": false, + "propertyIsEnumerable": false, + "Proxy": false, + "RangeError": false, + "ReferenceError": false, + "Reflect": false, + "RegExp": false, + "Set": false, + "String": false, + "Symbol": false, + "SyntaxError": false, + "toLocaleString": false, + "toString": false, + "TypeError": false, + "Uint16Array": false, + "Uint32Array": false, + "Uint8Array": false, + "Uint8ClampedArray": false, + "undefined": false, + "unescape": false, + "URIError": false, + "valueOf": false, + "WeakMap": false, + "WeakSet": false + }, + "es2017": { + "Array": false, + "ArrayBuffer": false, + "Atomics": false, + "Boolean": false, + "constructor": false, + "DataView": false, + "Date": false, + "decodeURI": false, + "decodeURIComponent": false, + "encodeURI": false, + "encodeURIComponent": false, + "Error": false, + "escape": false, + "eval": false, + "EvalError": false, + "Float32Array": false, + "Float64Array": false, + "Function": false, + "hasOwnProperty": false, + "Infinity": false, + "Int16Array": false, + "Int32Array": false, + "Int8Array": false, + "isFinite": false, + "isNaN": false, + "isPrototypeOf": false, + "JSON": false, + "Map": false, + "Math": false, + "NaN": false, + "Number": false, + "Object": false, + "parseFloat": false, + "parseInt": false, + "Promise": false, + "propertyIsEnumerable": false, + "Proxy": false, + "RangeError": false, + "ReferenceError": false, + "Reflect": false, + "RegExp": false, + "Set": false, + "SharedArrayBuffer": false, + "String": false, + "Symbol": false, + "SyntaxError": false, + "toLocaleString": false, + "toString": false, + "TypeError": false, + "Uint16Array": false, + "Uint32Array": false, + "Uint8Array": false, + "Uint8ClampedArray": false, + "undefined": false, + "unescape": false, + "URIError": false, + "valueOf": false, + "WeakMap": false, + "WeakSet": false + }, + "es2020": { + "Array": false, + "ArrayBuffer": false, + "Atomics": false, + "BigInt": false, + "BigInt64Array": false, + "BigUint64Array": false, + "Boolean": false, + "constructor": false, + "DataView": false, + "Date": false, + "decodeURI": false, + "decodeURIComponent": false, + "encodeURI": false, + "encodeURIComponent": false, + "Error": false, + "escape": false, + "eval": false, + "EvalError": false, + "Float32Array": false, + "Float64Array": false, + "Function": false, + "globalThis": false, + "hasOwnProperty": false, + "Infinity": false, + "Int16Array": false, + "Int32Array": false, + "Int8Array": false, + "isFinite": false, + "isNaN": false, + "isPrototypeOf": false, + "JSON": false, + "Map": false, + "Math": false, + "NaN": false, + "Number": false, + "Object": false, + "parseFloat": false, + "parseInt": false, + "Promise": false, + "propertyIsEnumerable": false, + "Proxy": false, + "RangeError": false, + "ReferenceError": false, + "Reflect": false, + "RegExp": false, + "Set": false, + "SharedArrayBuffer": false, + "String": false, + "Symbol": false, + "SyntaxError": false, + "toLocaleString": false, + "toString": false, + "TypeError": false, + "Uint16Array": false, + "Uint32Array": false, + "Uint8Array": false, + "Uint8ClampedArray": false, + "undefined": false, + "unescape": false, + "URIError": false, + "valueOf": false, + "WeakMap": false, + "WeakSet": false + }, + "es2021": { + "Array": false, + "ArrayBuffer": false, + "Atomics": false, + "BigInt": false, + "BigInt64Array": false, + "BigUint64Array": false, + "Boolean": false, + "constructor": false, + "DataView": false, + "Date": false, + "decodeURI": false, + "decodeURIComponent": false, + "encodeURI": false, + "encodeURIComponent": false, + "Error": false, + "escape": false, + "eval": false, + "EvalError": false, + "FinalizationRegistry": false, + "Float32Array": false, + "Float64Array": false, + "Function": false, + "globalThis": false, + "hasOwnProperty": false, + "Infinity": false, + "Int16Array": false, + "Int32Array": false, + "Int8Array": false, + "isFinite": false, + "isNaN": false, + "isPrototypeOf": false, + "JSON": false, + "Map": false, + "Math": false, + "NaN": false, + "Number": false, + "Object": false, + "parseFloat": false, + "parseInt": false, + "Promise": false, + "propertyIsEnumerable": false, + "Proxy": false, + "RangeError": false, + "ReferenceError": false, + "Reflect": false, + "RegExp": false, + "Set": false, + "SharedArrayBuffer": false, + "String": false, + "Symbol": false, + "SyntaxError": false, + "toLocaleString": false, + "toString": false, + "TypeError": false, + "Uint16Array": false, + "Uint32Array": false, + "Uint8Array": false, + "Uint8ClampedArray": false, + "undefined": false, + "unescape": false, + "URIError": false, + "valueOf": false, + "WeakMap": false, + "WeakRef": false, + "WeakSet": false + }, + "browser": { + "AbortController": false, + "AbortSignal": false, + "addEventListener": false, + "alert": false, + "AnalyserNode": false, + "Animation": false, + "AnimationEffectReadOnly": false, + "AnimationEffectTiming": false, + "AnimationEffectTimingReadOnly": false, + "AnimationEvent": false, + "AnimationPlaybackEvent": false, + "AnimationTimeline": false, + "applicationCache": false, + "ApplicationCache": false, + "ApplicationCacheErrorEvent": false, + "atob": false, + "Attr": false, + "Audio": false, + "AudioBuffer": false, + "AudioBufferSourceNode": false, + "AudioContext": false, + "AudioDestinationNode": false, + "AudioListener": false, + "AudioNode": false, + "AudioParam": false, + "AudioProcessingEvent": false, + "AudioScheduledSourceNode": false, + "AudioWorkletGlobalScope ": false, + "AudioWorkletNode": false, + "AudioWorkletProcessor": false, + "BarProp": false, + "BaseAudioContext": false, + "BatteryManager": false, + "BeforeUnloadEvent": false, + "BiquadFilterNode": false, + "Blob": false, + "BlobEvent": false, + "blur": false, + "BroadcastChannel": false, + "btoa": false, + "BudgetService": false, + "ByteLengthQueuingStrategy": false, + "Cache": false, + "caches": false, + "CacheStorage": false, + "cancelAnimationFrame": false, + "cancelIdleCallback": false, + "CanvasCaptureMediaStreamTrack": false, + "CanvasGradient": false, + "CanvasPattern": false, + "CanvasRenderingContext2D": false, + "ChannelMergerNode": false, + "ChannelSplitterNode": false, + "CharacterData": false, + "clearInterval": false, + "clearTimeout": false, + "clientInformation": false, + "ClipboardEvent": false, + "close": false, + "closed": false, + "CloseEvent": false, + "Comment": false, + "CompositionEvent": false, + "confirm": false, + "console": false, + "ConstantSourceNode": false, + "ConvolverNode": false, + "CountQueuingStrategy": false, + "createImageBitmap": false, + "Credential": false, + "CredentialsContainer": false, + "crypto": false, + "Crypto": false, + "CryptoKey": false, + "CSS": false, + "CSSConditionRule": false, + "CSSFontFaceRule": false, + "CSSGroupingRule": false, + "CSSImportRule": false, + "CSSKeyframeRule": false, + "CSSKeyframesRule": false, + "CSSMediaRule": false, + "CSSNamespaceRule": false, + "CSSPageRule": false, + "CSSRule": false, + "CSSRuleList": false, + "CSSStyleDeclaration": false, + "CSSStyleRule": false, + "CSSStyleSheet": false, + "CSSSupportsRule": false, + "CustomElementRegistry": false, + "customElements": false, + "CustomEvent": false, + "DataTransfer": false, + "DataTransferItem": false, + "DataTransferItemList": false, + "defaultstatus": false, + "defaultStatus": false, + "DelayNode": false, + "DeviceMotionEvent": false, + "DeviceOrientationEvent": false, + "devicePixelRatio": false, + "dispatchEvent": false, + "document": false, + "Document": false, + "DocumentFragment": false, + "DocumentType": false, + "DOMError": false, + "DOMException": false, + "DOMImplementation": false, + "DOMMatrix": false, + "DOMMatrixReadOnly": false, + "DOMParser": false, + "DOMPoint": false, + "DOMPointReadOnly": false, + "DOMQuad": false, + "DOMRect": false, + "DOMRectReadOnly": false, + "DOMStringList": false, + "DOMStringMap": false, + "DOMTokenList": false, + "DragEvent": false, + "DynamicsCompressorNode": false, + "Element": false, + "ErrorEvent": false, + "event": false, + "Event": false, + "EventSource": false, + "EventTarget": false, + "external": false, + "fetch": false, + "File": false, + "FileList": false, + "FileReader": false, + "find": false, + "focus": false, + "FocusEvent": false, + "FontFace": false, + "FontFaceSetLoadEvent": false, + "FormData": false, + "frameElement": false, + "frames": false, + "GainNode": false, + "Gamepad": false, + "GamepadButton": false, + "GamepadEvent": false, + "getComputedStyle": false, + "getSelection": false, + "HashChangeEvent": false, + "Headers": false, + "history": false, + "History": false, + "HTMLAllCollection": false, + "HTMLAnchorElement": false, + "HTMLAreaElement": false, + "HTMLAudioElement": false, + "HTMLBaseElement": false, + "HTMLBodyElement": false, + "HTMLBRElement": false, + "HTMLButtonElement": false, + "HTMLCanvasElement": false, + "HTMLCollection": false, + "HTMLContentElement": false, + "HTMLDataElement": false, + "HTMLDataListElement": false, + "HTMLDetailsElement": false, + "HTMLDialogElement": false, + "HTMLDirectoryElement": false, + "HTMLDivElement": false, + "HTMLDListElement": false, + "HTMLDocument": false, + "HTMLElement": false, + "HTMLEmbedElement": false, + "HTMLFieldSetElement": false, + "HTMLFontElement": false, + "HTMLFormControlsCollection": false, + "HTMLFormElement": false, + "HTMLFrameElement": false, + "HTMLFrameSetElement": false, + "HTMLHeadElement": false, + "HTMLHeadingElement": false, + "HTMLHRElement": false, + "HTMLHtmlElement": false, + "HTMLIFrameElement": false, + "HTMLImageElement": false, + "HTMLInputElement": false, + "HTMLLabelElement": false, + "HTMLLegendElement": false, + "HTMLLIElement": false, + "HTMLLinkElement": false, + "HTMLMapElement": false, + "HTMLMarqueeElement": false, + "HTMLMediaElement": false, + "HTMLMenuElement": false, + "HTMLMetaElement": false, + "HTMLMeterElement": false, + "HTMLModElement": false, + "HTMLObjectElement": false, + "HTMLOListElement": false, + "HTMLOptGroupElement": false, + "HTMLOptionElement": false, + "HTMLOptionsCollection": false, + "HTMLOutputElement": false, + "HTMLParagraphElement": false, + "HTMLParamElement": false, + "HTMLPictureElement": false, + "HTMLPreElement": false, + "HTMLProgressElement": false, + "HTMLQuoteElement": false, + "HTMLScriptElement": false, + "HTMLSelectElement": false, + "HTMLShadowElement": false, + "HTMLSlotElement": false, + "HTMLSourceElement": false, + "HTMLSpanElement": false, + "HTMLStyleElement": false, + "HTMLTableCaptionElement": false, + "HTMLTableCellElement": false, + "HTMLTableColElement": false, + "HTMLTableElement": false, + "HTMLTableRowElement": false, + "HTMLTableSectionElement": false, + "HTMLTemplateElement": false, + "HTMLTextAreaElement": false, + "HTMLTimeElement": false, + "HTMLTitleElement": false, + "HTMLTrackElement": false, + "HTMLUListElement": false, + "HTMLUnknownElement": false, + "HTMLVideoElement": false, + "IDBCursor": false, + "IDBCursorWithValue": false, + "IDBDatabase": false, + "IDBFactory": false, + "IDBIndex": false, + "IDBKeyRange": false, + "IDBObjectStore": false, + "IDBOpenDBRequest": false, + "IDBRequest": false, + "IDBTransaction": false, + "IDBVersionChangeEvent": false, + "IdleDeadline": false, + "IIRFilterNode": false, + "Image": false, + "ImageBitmap": false, + "ImageBitmapRenderingContext": false, + "ImageCapture": false, + "ImageData": false, + "indexedDB": false, + "innerHeight": false, + "innerWidth": false, + "InputEvent": false, + "IntersectionObserver": false, + "IntersectionObserverEntry": false, + "Intl": false, + "isSecureContext": false, + "KeyboardEvent": false, + "KeyframeEffect": false, + "KeyframeEffectReadOnly": false, + "length": false, + "localStorage": false, + "location": true, + "Location": false, + "locationbar": false, + "matchMedia": false, + "MediaDeviceInfo": false, + "MediaDevices": false, + "MediaElementAudioSourceNode": false, + "MediaEncryptedEvent": false, + "MediaError": false, + "MediaKeyMessageEvent": false, + "MediaKeySession": false, + "MediaKeyStatusMap": false, + "MediaKeySystemAccess": false, + "MediaList": false, + "MediaQueryList": false, + "MediaQueryListEvent": false, + "MediaRecorder": false, + "MediaSettingsRange": false, + "MediaSource": false, + "MediaStream": false, + "MediaStreamAudioDestinationNode": false, + "MediaStreamAudioSourceNode": false, + "MediaStreamEvent": false, + "MediaStreamTrack": false, + "MediaStreamTrackEvent": false, + "menubar": false, + "MessageChannel": false, + "MessageEvent": false, + "MessagePort": false, + "MIDIAccess": false, + "MIDIConnectionEvent": false, + "MIDIInput": false, + "MIDIInputMap": false, + "MIDIMessageEvent": false, + "MIDIOutput": false, + "MIDIOutputMap": false, + "MIDIPort": false, + "MimeType": false, + "MimeTypeArray": false, + "MouseEvent": false, + "moveBy": false, + "moveTo": false, + "MutationEvent": false, + "MutationObserver": false, + "MutationRecord": false, + "name": false, + "NamedNodeMap": false, + "NavigationPreloadManager": false, + "navigator": false, + "Navigator": false, + "NetworkInformation": false, + "Node": false, + "NodeFilter": false, + "NodeIterator": false, + "NodeList": false, + "Notification": false, + "OfflineAudioCompletionEvent": false, + "OfflineAudioContext": false, + "offscreenBuffering": false, + "OffscreenCanvas": true, + "OffscreenCanvasRenderingContext2D": false, + "onabort": true, + "onafterprint": true, + "onanimationend": true, + "onanimationiteration": true, + "onanimationstart": true, + "onappinstalled": true, + "onauxclick": true, + "onbeforeinstallprompt": true, + "onbeforeprint": true, + "onbeforeunload": true, + "onblur": true, + "oncancel": true, + "oncanplay": true, + "oncanplaythrough": true, + "onchange": true, + "onclick": true, + "onclose": true, + "oncontextmenu": true, + "oncuechange": true, + "ondblclick": true, + "ondevicemotion": true, + "ondeviceorientation": true, + "ondeviceorientationabsolute": true, + "ondrag": true, + "ondragend": true, + "ondragenter": true, + "ondragleave": true, + "ondragover": true, + "ondragstart": true, + "ondrop": true, + "ondurationchange": true, + "onemptied": true, + "onended": true, + "onerror": true, + "onfocus": true, + "ongotpointercapture": true, + "onhashchange": true, + "oninput": true, + "oninvalid": true, + "onkeydown": true, + "onkeypress": true, + "onkeyup": true, + "onlanguagechange": true, + "onload": true, + "onloadeddata": true, + "onloadedmetadata": true, + "onloadstart": true, + "onlostpointercapture": true, + "onmessage": true, + "onmessageerror": true, + "onmousedown": true, + "onmouseenter": true, + "onmouseleave": true, + "onmousemove": true, + "onmouseout": true, + "onmouseover": true, + "onmouseup": true, + "onmousewheel": true, + "onoffline": true, + "ononline": true, + "onpagehide": true, + "onpageshow": true, + "onpause": true, + "onplay": true, + "onplaying": true, + "onpointercancel": true, + "onpointerdown": true, + "onpointerenter": true, + "onpointerleave": true, + "onpointermove": true, + "onpointerout": true, + "onpointerover": true, + "onpointerup": true, + "onpopstate": true, + "onprogress": true, + "onratechange": true, + "onrejectionhandled": true, + "onreset": true, + "onresize": true, + "onscroll": true, + "onsearch": true, + "onseeked": true, + "onseeking": true, + "onselect": true, + "onstalled": true, + "onstorage": true, + "onsubmit": true, + "onsuspend": true, + "ontimeupdate": true, + "ontoggle": true, + "ontransitionend": true, + "onunhandledrejection": true, + "onunload": true, + "onvolumechange": true, + "onwaiting": true, + "onwheel": true, + "open": false, + "openDatabase": false, + "opener": false, + "Option": false, + "origin": false, + "OscillatorNode": false, + "outerHeight": false, + "outerWidth": false, + "PageTransitionEvent": false, + "pageXOffset": false, + "pageYOffset": false, + "PannerNode": false, + "parent": false, + "Path2D": false, + "PaymentAddress": false, + "PaymentRequest": false, + "PaymentRequestUpdateEvent": false, + "PaymentResponse": false, + "performance": false, + "Performance": false, + "PerformanceEntry": false, + "PerformanceLongTaskTiming": false, + "PerformanceMark": false, + "PerformanceMeasure": false, + "PerformanceNavigation": false, + "PerformanceNavigationTiming": false, + "PerformanceObserver": false, + "PerformanceObserverEntryList": false, + "PerformancePaintTiming": false, + "PerformanceResourceTiming": false, + "PerformanceTiming": false, + "PeriodicWave": false, + "Permissions": false, + "PermissionStatus": false, + "personalbar": false, + "PhotoCapabilities": false, + "Plugin": false, + "PluginArray": false, + "PointerEvent": false, + "PopStateEvent": false, + "postMessage": false, + "Presentation": false, + "PresentationAvailability": false, + "PresentationConnection": false, + "PresentationConnectionAvailableEvent": false, + "PresentationConnectionCloseEvent": false, + "PresentationConnectionList": false, + "PresentationReceiver": false, + "PresentationRequest": false, + "print": false, + "ProcessingInstruction": false, + "ProgressEvent": false, + "PromiseRejectionEvent": false, + "prompt": false, + "PushManager": false, + "PushSubscription": false, + "PushSubscriptionOptions": false, + "queueMicrotask": false, + "RadioNodeList": false, + "Range": false, + "ReadableStream": false, + "registerProcessor": false, + "RemotePlayback": false, + "removeEventListener": false, + "Request": false, + "requestAnimationFrame": false, + "requestIdleCallback": false, + "resizeBy": false, + "ResizeObserver": false, + "ResizeObserverEntry": false, + "resizeTo": false, + "Response": false, + "RTCCertificate": false, + "RTCDataChannel": false, + "RTCDataChannelEvent": false, + "RTCDtlsTransport": false, + "RTCIceCandidate": false, + "RTCIceGatherer": false, + "RTCIceTransport": false, + "RTCPeerConnection": false, + "RTCPeerConnectionIceEvent": false, + "RTCRtpContributingSource": false, + "RTCRtpReceiver": false, + "RTCRtpSender": false, + "RTCSctpTransport": false, + "RTCSessionDescription": false, + "RTCStatsReport": false, + "RTCTrackEvent": false, + "screen": false, + "Screen": false, + "screenLeft": false, + "ScreenOrientation": false, + "screenTop": false, + "screenX": false, + "screenY": false, + "ScriptProcessorNode": false, + "scroll": false, + "scrollbars": false, + "scrollBy": false, + "scrollTo": false, + "scrollX": false, + "scrollY": false, + "SecurityPolicyViolationEvent": false, + "Selection": false, + "self": false, + "ServiceWorker": false, + "ServiceWorkerContainer": false, + "ServiceWorkerRegistration": false, + "sessionStorage": false, + "setInterval": false, + "setTimeout": false, + "ShadowRoot": false, + "SharedWorker": false, + "SourceBuffer": false, + "SourceBufferList": false, + "speechSynthesis": false, + "SpeechSynthesisEvent": false, + "SpeechSynthesisUtterance": false, + "StaticRange": false, + "status": false, + "statusbar": false, + "StereoPannerNode": false, + "stop": false, + "Storage": false, + "StorageEvent": false, + "StorageManager": false, + "styleMedia": false, + "StyleSheet": false, + "StyleSheetList": false, + "SubtleCrypto": false, + "SVGAElement": false, + "SVGAngle": false, + "SVGAnimatedAngle": false, + "SVGAnimatedBoolean": false, + "SVGAnimatedEnumeration": false, + "SVGAnimatedInteger": false, + "SVGAnimatedLength": false, + "SVGAnimatedLengthList": false, + "SVGAnimatedNumber": false, + "SVGAnimatedNumberList": false, + "SVGAnimatedPreserveAspectRatio": false, + "SVGAnimatedRect": false, + "SVGAnimatedString": false, + "SVGAnimatedTransformList": false, + "SVGAnimateElement": false, + "SVGAnimateMotionElement": false, + "SVGAnimateTransformElement": false, + "SVGAnimationElement": false, + "SVGCircleElement": false, + "SVGClipPathElement": false, + "SVGComponentTransferFunctionElement": false, + "SVGDefsElement": false, + "SVGDescElement": false, + "SVGDiscardElement": false, + "SVGElement": false, + "SVGEllipseElement": false, + "SVGFEBlendElement": false, + "SVGFEColorMatrixElement": false, + "SVGFEComponentTransferElement": false, + "SVGFECompositeElement": false, + "SVGFEConvolveMatrixElement": false, + "SVGFEDiffuseLightingElement": false, + "SVGFEDisplacementMapElement": false, + "SVGFEDistantLightElement": false, + "SVGFEDropShadowElement": false, + "SVGFEFloodElement": false, + "SVGFEFuncAElement": false, + "SVGFEFuncBElement": false, + "SVGFEFuncGElement": false, + "SVGFEFuncRElement": false, + "SVGFEGaussianBlurElement": false, + "SVGFEImageElement": false, + "SVGFEMergeElement": false, + "SVGFEMergeNodeElement": false, + "SVGFEMorphologyElement": false, + "SVGFEOffsetElement": false, + "SVGFEPointLightElement": false, + "SVGFESpecularLightingElement": false, + "SVGFESpotLightElement": false, + "SVGFETileElement": false, + "SVGFETurbulenceElement": false, + "SVGFilterElement": false, + "SVGForeignObjectElement": false, + "SVGGElement": false, + "SVGGeometryElement": false, + "SVGGradientElement": false, + "SVGGraphicsElement": false, + "SVGImageElement": false, + "SVGLength": false, + "SVGLengthList": false, + "SVGLinearGradientElement": false, + "SVGLineElement": false, + "SVGMarkerElement": false, + "SVGMaskElement": false, + "SVGMatrix": false, + "SVGMetadataElement": false, + "SVGMPathElement": false, + "SVGNumber": false, + "SVGNumberList": false, + "SVGPathElement": false, + "SVGPatternElement": false, + "SVGPoint": false, + "SVGPointList": false, + "SVGPolygonElement": false, + "SVGPolylineElement": false, + "SVGPreserveAspectRatio": false, + "SVGRadialGradientElement": false, + "SVGRect": false, + "SVGRectElement": false, + "SVGScriptElement": false, + "SVGSetElement": false, + "SVGStopElement": false, + "SVGStringList": false, + "SVGStyleElement": false, + "SVGSVGElement": false, + "SVGSwitchElement": false, + "SVGSymbolElement": false, + "SVGTextContentElement": false, + "SVGTextElement": false, + "SVGTextPathElement": false, + "SVGTextPositioningElement": false, + "SVGTitleElement": false, + "SVGTransform": false, + "SVGTransformList": false, + "SVGTSpanElement": false, + "SVGUnitTypes": false, + "SVGUseElement": false, + "SVGViewElement": false, + "TaskAttributionTiming": false, + "Text": false, + "TextDecoder": false, + "TextEncoder": false, + "TextEvent": false, + "TextMetrics": false, + "TextTrack": false, + "TextTrackCue": false, + "TextTrackCueList": false, + "TextTrackList": false, + "TimeRanges": false, + "toolbar": false, + "top": false, + "Touch": false, + "TouchEvent": false, + "TouchList": false, + "TrackEvent": false, + "TransitionEvent": false, + "TreeWalker": false, + "UIEvent": false, + "URL": false, + "URLSearchParams": false, + "ValidityState": false, + "visualViewport": false, + "VisualViewport": false, + "VTTCue": false, + "WaveShaperNode": false, + "WebAssembly": false, + "WebGL2RenderingContext": false, + "WebGLActiveInfo": false, + "WebGLBuffer": false, + "WebGLContextEvent": false, + "WebGLFramebuffer": false, + "WebGLProgram": false, + "WebGLQuery": false, + "WebGLRenderbuffer": false, + "WebGLRenderingContext": false, + "WebGLSampler": false, + "WebGLShader": false, + "WebGLShaderPrecisionFormat": false, + "WebGLSync": false, + "WebGLTexture": false, + "WebGLTransformFeedback": false, + "WebGLUniformLocation": false, + "WebGLVertexArrayObject": false, + "WebSocket": false, + "WheelEvent": false, + "window": false, + "Window": false, + "Worker": false, + "WritableStream": false, + "XMLDocument": false, + "XMLHttpRequest": false, + "XMLHttpRequestEventTarget": false, + "XMLHttpRequestUpload": false, + "XMLSerializer": false, + "XPathEvaluator": false, + "XPathExpression": false, + "XPathResult": false, + "XSLTProcessor": false + }, + "worker": { + "addEventListener": false, + "applicationCache": false, + "atob": false, + "Blob": false, + "BroadcastChannel": false, + "btoa": false, + "Cache": false, + "caches": false, + "clearInterval": false, + "clearTimeout": false, + "close": true, + "console": false, + "fetch": false, + "FileReaderSync": false, + "FormData": false, + "Headers": false, + "IDBCursor": false, + "IDBCursorWithValue": false, + "IDBDatabase": false, + "IDBFactory": false, + "IDBIndex": false, + "IDBKeyRange": false, + "IDBObjectStore": false, + "IDBOpenDBRequest": false, + "IDBRequest": false, + "IDBTransaction": false, + "IDBVersionChangeEvent": false, + "ImageData": false, + "importScripts": true, + "indexedDB": false, + "location": false, + "MessageChannel": false, + "MessagePort": false, + "name": false, + "navigator": false, + "Notification": false, + "onclose": true, + "onconnect": true, + "onerror": true, + "onlanguagechange": true, + "onmessage": true, + "onoffline": true, + "ononline": true, + "onrejectionhandled": true, + "onunhandledrejection": true, + "performance": false, + "Performance": false, + "PerformanceEntry": false, + "PerformanceMark": false, + "PerformanceMeasure": false, + "PerformanceNavigation": false, + "PerformanceResourceTiming": false, + "PerformanceTiming": false, + "postMessage": true, + "Promise": false, + "queueMicrotask": false, + "removeEventListener": false, + "Request": false, + "Response": false, + "self": true, + "ServiceWorkerRegistration": false, + "setInterval": false, + "setTimeout": false, + "TextDecoder": false, + "TextEncoder": false, + "URL": false, + "URLSearchParams": false, + "WebSocket": false, + "Worker": false, + "WorkerGlobalScope": false, + "XMLHttpRequest": false + }, + "node": { + "__dirname": false, + "__filename": false, + "Buffer": false, + "clearImmediate": false, + "clearInterval": false, + "clearTimeout": false, + "console": false, + "exports": true, + "global": false, + "Intl": false, + "module": false, + "process": false, + "queueMicrotask": false, + "require": false, + "setImmediate": false, + "setInterval": false, + "setTimeout": false, + "TextDecoder": false, + "TextEncoder": false, + "URL": false, + "URLSearchParams": false + }, + "nodeBuiltin": { + "Buffer": false, + "clearImmediate": false, + "clearInterval": false, + "clearTimeout": false, + "console": false, + "global": false, + "Intl": false, + "process": false, + "queueMicrotask": false, + "setImmediate": false, + "setInterval": false, + "setTimeout": false, + "TextDecoder": false, + "TextEncoder": false, + "URL": false, + "URLSearchParams": false + }, + "commonjs": { + "exports": true, + "global": false, + "module": false, + "require": false + }, + "amd": { + "define": false, + "require": false + }, + "mocha": { + "after": false, + "afterEach": false, + "before": false, + "beforeEach": false, + "context": false, + "describe": false, + "it": false, + "mocha": false, + "run": false, + "setup": false, + "specify": false, + "suite": false, + "suiteSetup": false, + "suiteTeardown": false, + "teardown": false, + "test": false, + "xcontext": false, + "xdescribe": false, + "xit": false, + "xspecify": false + }, + "jasmine": { + "afterAll": false, + "afterEach": false, + "beforeAll": false, + "beforeEach": false, + "describe": false, + "expect": false, + "expectAsync": false, + "fail": false, + "fdescribe": false, + "fit": false, + "it": false, + "jasmine": false, + "pending": false, + "runs": false, + "spyOn": false, + "spyOnAllFunctions": false, + "spyOnProperty": false, + "waits": false, + "waitsFor": false, + "xdescribe": false, + "xit": false + }, + "jest": { + "afterAll": false, + "afterEach": false, + "beforeAll": false, + "beforeEach": false, + "describe": false, + "expect": false, + "fdescribe": false, + "fit": false, + "it": false, + "jest": false, + "pit": false, + "require": false, + "test": false, + "xdescribe": false, + "xit": false, + "xtest": false + }, + "qunit": { + "asyncTest": false, + "deepEqual": false, + "equal": false, + "expect": false, + "module": false, + "notDeepEqual": false, + "notEqual": false, + "notOk": false, + "notPropEqual": false, + "notStrictEqual": false, + "ok": false, + "propEqual": false, + "QUnit": false, + "raises": false, + "start": false, + "stop": false, + "strictEqual": false, + "test": false, + "throws": false + }, + "phantomjs": { + "console": true, + "exports": true, + "phantom": true, + "require": true, + "WebPage": true + }, + "couch": { + "emit": false, + "exports": false, + "getRow": false, + "log": false, + "module": false, + "provides": false, + "require": false, + "respond": false, + "send": false, + "start": false, + "sum": false + }, + "rhino": { + "defineClass": false, + "deserialize": false, + "gc": false, + "help": false, + "importClass": false, + "importPackage": false, + "java": false, + "load": false, + "loadClass": false, + "Packages": false, + "print": false, + "quit": false, + "readFile": false, + "readUrl": false, + "runCommand": false, + "seal": false, + "serialize": false, + "spawn": false, + "sync": false, + "toint32": false, + "version": false + }, + "nashorn": { + "__DIR__": false, + "__FILE__": false, + "__LINE__": false, + "com": false, + "edu": false, + "exit": false, + "java": false, + "Java": false, + "javafx": false, + "JavaImporter": false, + "javax": false, + "JSAdapter": false, + "load": false, + "loadWithNewGlobal": false, + "org": false, + "Packages": false, + "print": false, + "quit": false + }, + "wsh": { + "ActiveXObject": false, + "CollectGarbage": false, + "Debug": false, + "Enumerator": false, + "GetObject": false, + "RuntimeObject": false, + "ScriptEngine": false, + "ScriptEngineBuildVersion": false, + "ScriptEngineMajorVersion": false, + "ScriptEngineMinorVersion": false, + "VBArray": false, + "WScript": false, + "WSH": false + }, + "jquery": { + "$": false, + "jQuery": false + }, + "yui": { + "YAHOO": false, + "YAHOO_config": false, + "YUI": false, + "YUI_config": false + }, + "shelljs": { + "cat": false, + "cd": false, + "chmod": false, + "config": false, + "cp": false, + "dirs": false, + "echo": false, + "env": false, + "error": false, + "exec": false, + "exit": false, + "find": false, + "grep": false, + "ln": false, + "ls": false, + "mkdir": false, + "mv": false, + "popd": false, + "pushd": false, + "pwd": false, + "rm": false, + "sed": false, + "set": false, + "target": false, + "tempdir": false, + "test": false, + "touch": false, + "which": false + }, + "prototypejs": { + "$": false, + "$$": false, + "$A": false, + "$break": false, + "$continue": false, + "$F": false, + "$H": false, + "$R": false, + "$w": false, + "Abstract": false, + "Ajax": false, + "Autocompleter": false, + "Builder": false, + "Class": false, + "Control": false, + "Draggable": false, + "Draggables": false, + "Droppables": false, + "Effect": false, + "Element": false, + "Enumerable": false, + "Event": false, + "Field": false, + "Form": false, + "Hash": false, + "Insertion": false, + "ObjectRange": false, + "PeriodicalExecuter": false, + "Position": false, + "Prototype": false, + "Scriptaculous": false, + "Selector": false, + "Sortable": false, + "SortableObserver": false, + "Sound": false, + "Template": false, + "Toggle": false, + "Try": false + }, + "meteor": { + "$": false, + "Accounts": false, + "AccountsClient": false, + "AccountsCommon": false, + "AccountsServer": false, + "App": false, + "Assets": false, + "Blaze": false, + "check": false, + "Cordova": false, + "DDP": false, + "DDPRateLimiter": false, + "DDPServer": false, + "Deps": false, + "EJSON": false, + "Email": false, + "HTTP": false, + "Log": false, + "Match": false, + "Meteor": false, + "Mongo": false, + "MongoInternals": false, + "Npm": false, + "Package": false, + "Plugin": false, + "process": false, + "Random": false, + "ReactiveDict": false, + "ReactiveVar": false, + "Router": false, + "ServiceConfiguration": false, + "Session": false, + "share": false, + "Spacebars": false, + "Template": false, + "Tinytest": false, + "Tracker": false, + "UI": false, + "Utils": false, + "WebApp": false, + "WebAppInternals": false + }, + "mongo": { + "_isWindows": false, + "_rand": false, + "BulkWriteResult": false, + "cat": false, + "cd": false, + "connect": false, + "db": false, + "getHostName": false, + "getMemInfo": false, + "hostname": false, + "ISODate": false, + "listFiles": false, + "load": false, + "ls": false, + "md5sumFile": false, + "mkdir": false, + "Mongo": false, + "NumberInt": false, + "NumberLong": false, + "ObjectId": false, + "PlanCache": false, + "print": false, + "printjson": false, + "pwd": false, + "quit": false, + "removeFile": false, + "rs": false, + "sh": false, + "UUID": false, + "version": false, + "WriteResult": false + }, + "applescript": { + "$": false, + "Application": false, + "Automation": false, + "console": false, + "delay": false, + "Library": false, + "ObjC": false, + "ObjectSpecifier": false, + "Path": false, + "Progress": false, + "Ref": false + }, + "serviceworker": { + "addEventListener": false, + "applicationCache": false, + "atob": false, + "Blob": false, + "BroadcastChannel": false, + "btoa": false, + "Cache": false, + "caches": false, + "CacheStorage": false, + "clearInterval": false, + "clearTimeout": false, + "Client": false, + "clients": false, + "Clients": false, + "close": true, + "console": false, + "ExtendableEvent": false, + "ExtendableMessageEvent": false, + "fetch": false, + "FetchEvent": false, + "FileReaderSync": false, + "FormData": false, + "Headers": false, + "IDBCursor": false, + "IDBCursorWithValue": false, + "IDBDatabase": false, + "IDBFactory": false, + "IDBIndex": false, + "IDBKeyRange": false, + "IDBObjectStore": false, + "IDBOpenDBRequest": false, + "IDBRequest": false, + "IDBTransaction": false, + "IDBVersionChangeEvent": false, + "ImageData": false, + "importScripts": false, + "indexedDB": false, + "location": false, + "MessageChannel": false, + "MessagePort": false, + "name": false, + "navigator": false, + "Notification": false, + "onclose": true, + "onconnect": true, + "onerror": true, + "onfetch": true, + "oninstall": true, + "onlanguagechange": true, + "onmessage": true, + "onmessageerror": true, + "onnotificationclick": true, + "onnotificationclose": true, + "onoffline": true, + "ononline": true, + "onpush": true, + "onpushsubscriptionchange": true, + "onrejectionhandled": true, + "onsync": true, + "onunhandledrejection": true, + "performance": false, + "Performance": false, + "PerformanceEntry": false, + "PerformanceMark": false, + "PerformanceMeasure": false, + "PerformanceNavigation": false, + "PerformanceResourceTiming": false, + "PerformanceTiming": false, + "postMessage": true, + "Promise": false, + "queueMicrotask": false, + "registration": false, + "removeEventListener": false, + "Request": false, + "Response": false, + "self": false, + "ServiceWorker": false, + "ServiceWorkerContainer": false, + "ServiceWorkerGlobalScope": false, + "ServiceWorkerMessageEvent": false, + "ServiceWorkerRegistration": false, + "setInterval": false, + "setTimeout": false, + "skipWaiting": false, + "TextDecoder": false, + "TextEncoder": false, + "URL": false, + "URLSearchParams": false, + "WebSocket": false, + "WindowClient": false, + "Worker": false, + "WorkerGlobalScope": false, + "XMLHttpRequest": false + }, + "atomtest": { + "advanceClock": false, + "atom": false, + "fakeClearInterval": false, + "fakeClearTimeout": false, + "fakeSetInterval": false, + "fakeSetTimeout": false, + "resetTimeouts": false, + "waitsForPromise": false + }, + "embertest": { + "andThen": false, + "click": false, + "currentPath": false, + "currentRouteName": false, + "currentURL": false, + "fillIn": false, + "find": false, + "findAll": false, + "findWithAssert": false, + "keyEvent": false, + "pauseTest": false, + "resumeTest": false, + "triggerEvent": false, + "visit": false, + "wait": false + }, + "protractor": { + "$": false, + "$$": false, + "browser": false, + "by": false, + "By": false, + "DartObject": false, + "element": false, + "protractor": false + }, + "shared-node-browser": { + "clearInterval": false, + "clearTimeout": false, + "console": false, + "setInterval": false, + "setTimeout": false, + "URL": false, + "URLSearchParams": false + }, + "webextensions": { + "browser": false, + "chrome": false, + "opr": false + }, + "greasemonkey": { + "cloneInto": false, + "createObjectIn": false, + "exportFunction": false, + "GM": false, + "GM_addStyle": false, + "GM_addValueChangeListener": false, + "GM_deleteValue": false, + "GM_download": false, + "GM_getResourceText": false, + "GM_getResourceURL": false, + "GM_getTab": false, + "GM_getTabs": false, + "GM_getValue": false, + "GM_info": false, + "GM_listValues": false, + "GM_log": false, + "GM_notification": false, + "GM_openInTab": false, + "GM_registerMenuCommand": false, + "GM_removeValueChangeListener": false, + "GM_saveTab": false, + "GM_setClipboard": false, + "GM_setValue": false, + "GM_unregisterMenuCommand": false, + "GM_xmlhttpRequest": false, + "unsafeWindow": false + }, + "devtools": { + "$": false, + "$_": false, + "$$": false, + "$0": false, + "$1": false, + "$2": false, + "$3": false, + "$4": false, + "$x": false, + "chrome": false, + "clear": false, + "copy": false, + "debug": false, + "dir": false, + "dirxml": false, + "getEventListeners": false, + "inspect": false, + "keys": false, + "monitor": false, + "monitorEvents": false, + "profile": false, + "profileEnd": false, + "queryObjects": false, + "table": false, + "undebug": false, + "unmonitor": false, + "unmonitorEvents": false, + "values": false + } +} diff --git a/test/cases/json/weird-properties/index.js b/test/cases/json/weird-properties/index.js new file mode 100644 index 00000000000..ab65a40dd7e --- /dev/null +++ b/test/cases/json/weird-properties/index.js @@ -0,0 +1,24 @@ +import globals from "./globals.json?all"; +import someGlobals from "./globals.json"; + +it("should be able to read all properties", () => { + const walk = o => { + for (const p of Object.keys(o)) { + const child = o[p]; + if (typeof child === "object") { + walk(child); + } else { + expect(child).toBeTypeOf("boolean"); + } + } + }; + walk(globals); +}); + +it("should allow accessing some properties with tree-shaking", () => { + expect(someGlobals.builtin.constructor).toBe(false); + expect(someGlobals.es5.eval).toBe(false); + expect(someGlobals.es5.undefined).toBe(false); + expect(someGlobals.node.global).toBe(false); + expect(someGlobals.builtin.valueOf).toBe(false); +}); diff --git a/test/cases/large/big-assets/generate-big-asset-loader.js b/test/cases/large/big-assets/generate-big-asset-loader.js new file mode 100644 index 00000000000..b904193be38 --- /dev/null +++ b/test/cases/large/big-assets/generate-big-asset-loader.js @@ -0,0 +1,6 @@ +/** @type {import("../../../../").RawLoaderDefinition<{ size: string }>} */ +module.exports = function () { + const options = this.getOptions(); + return Buffer.alloc(+options.size).fill(0xa5); +}; +module.exports.raw = true; diff --git a/test/cases/large/big-assets/index.js b/test/cases/large/big-assets/index.js new file mode 100644 index 00000000000..106c4f2c339 --- /dev/null +++ b/test/cases/large/big-assets/index.js @@ -0,0 +1,41 @@ +const createHash = require("../../../../lib/util/hash/xxhash64"); +const fs = require("fs"); + +const h = url => { + const hash = createHash(); + hash.update(fs.readFileSync(url)); + return hash.digest("hex"); +}; + +it("should compile fine", () => { + const a = new URL( + "./generate-big-asset-loader.js?size=100000000!", + import.meta.url + ); + const b = new URL( + "./generate-big-asset-loader.js?size=200000000!", + import.meta.url + ); + const c = new URL( + "./generate-big-asset-loader.js?size=300000000!", + import.meta.url + ); + const d = new URL( + "./generate-big-asset-loader.js?size=400000000!", + import.meta.url + ); + const e = new URL( + "./generate-big-asset-loader.js?size=500000000!", + import.meta.url + ); + const f = new URL( + "./generate-big-asset-loader.js?size=600000000!", + import.meta.url + ); + expect(h(a)).toBe("a7540f59366bb641"); + expect(h(b)).toBe("f642344242fa9de4"); + expect(h(c)).toBe("255d2b78f94dd585"); + expect(h(d)).toBe("c75503096358dd24"); + expect(h(e)).toBe("33ba203498301384"); + expect(h(f)).toBe("e71a39b9b1138c07"); +}); diff --git a/test/cases/large/big-assets/test.config.js b/test/cases/large/big-assets/test.config.js new file mode 100644 index 00000000000..7ab4fa5eeff --- /dev/null +++ b/test/cases/large/big-assets/test.config.js @@ -0,0 +1,3 @@ +module.exports = { + timeout: 120000 +}; diff --git a/test/cases/large/big-assets/test.filter.js b/test/cases/large/big-assets/test.filter.js new file mode 100644 index 00000000000..71a71e594ff --- /dev/null +++ b/test/cases/large/big-assets/test.filter.js @@ -0,0 +1,3 @@ +module.exports = function (config) { + return !process.env.CI; +}; diff --git a/test/cases/large/many-replacements/generate-many-replacements-loader.js b/test/cases/large/many-replacements/generate-many-replacements-loader.js new file mode 100644 index 00000000000..341649ed407 --- /dev/null +++ b/test/cases/large/many-replacements/generate-many-replacements-loader.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").RawLoaderDefinition<{ count: string }>} */ +module.exports = function () { + const options = this.getOptions(); + return `import thing from "./module"; +export default [${Array.from({ length: +options.count }, () => "thing").join( + ", " + )}].reduce((a, b) => a + b);`; +}; diff --git a/test/cases/large/many-replacements/index.js b/test/cases/large/many-replacements/index.js new file mode 100644 index 00000000000..ebe68a120f6 --- /dev/null +++ b/test/cases/large/many-replacements/index.js @@ -0,0 +1,11 @@ +import a from "./generate-many-replacements-loader?count=1000!./module"; +import b from "./generate-many-replacements-loader?count=10000!./module"; +import c from "./generate-many-replacements-loader?count=100000!./module"; +import d from "./generate-many-replacements-loader?count=1000000!./module"; + +it("should compile fine", () => { + expect(a).toBe(1000); + expect(b).toBe(10000); + expect(c).toBe(100000); + expect(d).toBe(1000000); +}); diff --git a/test/cases/large/many-replacements/module.js b/test/cases/large/many-replacements/module.js new file mode 100644 index 00000000000..aef22247d75 --- /dev/null +++ b/test/cases/large/many-replacements/module.js @@ -0,0 +1 @@ +export default 1; diff --git a/test/cases/large/many-replacements/test.config.js b/test/cases/large/many-replacements/test.config.js new file mode 100644 index 00000000000..7ab4fa5eeff --- /dev/null +++ b/test/cases/large/many-replacements/test.config.js @@ -0,0 +1,3 @@ +module.exports = { + timeout: 120000 +}; diff --git a/test/cases/large/many-replacements/test.filter.js b/test/cases/large/many-replacements/test.filter.js new file mode 100644 index 00000000000..71a71e594ff --- /dev/null +++ b/test/cases/large/many-replacements/test.filter.js @@ -0,0 +1,3 @@ +module.exports = function (config) { + return !process.env.CI; +}; diff --git a/test/cases/loaders/_esm-loader-type/index.js b/test/cases/loaders/_esm-loader-type/index.js new file mode 100644 index 00000000000..5545f1b4ff5 --- /dev/null +++ b/test/cases/loaders/_esm-loader-type/index.js @@ -0,0 +1,9 @@ +it("should pass package.json type to loader", function () { + expect(require("esm/loader.js!")).toBe("module"); +}); + +it("should pass 'module' type to loader for .mjs", function () { + expect(require("cjs/loader.mjs!")).toBe("module"); + expect(require("esm/loader.mjs!")).toBe("module"); + expect(require("./loader.mjs!")).toBe("module"); +}); diff --git a/test/cases/loaders/_esm-loader-type/loader.mjs b/test/cases/loaders/_esm-loader-type/loader.mjs new file mode 100644 index 00000000000..58914cd70e5 --- /dev/null +++ b/test/cases/loaders/_esm-loader-type/loader.mjs @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition} */ +export default function loader() { + return `export default "${this.loaders[this.loaderIndex].type}";`; +} diff --git a/test/cases/loaders/_esm-loader-type/node_modules/cjs/loader.mjs b/test/cases/loaders/_esm-loader-type/node_modules/cjs/loader.mjs new file mode 100644 index 00000000000..35c1f17332d --- /dev/null +++ b/test/cases/loaders/_esm-loader-type/node_modules/cjs/loader.mjs @@ -0,0 +1,4 @@ +/** @type {import("../../../../../../").LoaderDefinition} */ +export default function loader() { + return `export default "${this.loaders[this.loaderIndex].type}";`; +} diff --git a/test/cases/loaders/_esm-loader-type/node_modules/cjs/package.json b/test/cases/loaders/_esm-loader-type/node_modules/cjs/package.json new file mode 100644 index 00000000000..5b56c70baa3 --- /dev/null +++ b/test/cases/loaders/_esm-loader-type/node_modules/cjs/package.json @@ -0,0 +1,4 @@ +{ + "name": "cjs-package", + "type": "commonjs" +} diff --git a/test/cases/loaders/_esm-loader-type/node_modules/esm/loader.js b/test/cases/loaders/_esm-loader-type/node_modules/esm/loader.js new file mode 100644 index 00000000000..58914cd70e5 --- /dev/null +++ b/test/cases/loaders/_esm-loader-type/node_modules/esm/loader.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition} */ +export default function loader() { + return `export default "${this.loaders[this.loaderIndex].type}";`; +} diff --git a/test/cases/loaders/_esm-loader-type/node_modules/esm/loader.mjs b/test/cases/loaders/_esm-loader-type/node_modules/esm/loader.mjs new file mode 100644 index 00000000000..35c1f17332d --- /dev/null +++ b/test/cases/loaders/_esm-loader-type/node_modules/esm/loader.mjs @@ -0,0 +1,4 @@ +/** @type {import("../../../../../../").LoaderDefinition} */ +export default function loader() { + return `export default "${this.loaders[this.loaderIndex].type}";`; +} diff --git a/test/cases/loaders/_esm-loader-type/node_modules/esm/package.json b/test/cases/loaders/_esm-loader-type/node_modules/esm/package.json new file mode 100644 index 00000000000..64069d2b941 --- /dev/null +++ b/test/cases/loaders/_esm-loader-type/node_modules/esm/package.json @@ -0,0 +1,4 @@ +{ + "name": "esm-package", + "type": "module" +} diff --git a/test/cases/loaders/_esm-loader-type/test.filter.js b/test/cases/loaders/_esm-loader-type/test.filter.js new file mode 100644 index 00000000000..7cc1b5dd3d5 --- /dev/null +++ b/test/cases/loaders/_esm-loader-type/test.filter.js @@ -0,0 +1,5 @@ +module.exports = function (config) { + // TODO need fix in v8 https://github.com/nodejs/node/issues/35889 + // TODO otherwise this test case cause segment fault + return false; +}; diff --git a/test/cases/loaders/async/loaders/asyncloader.js b/test/cases/loaders/async/loaders/asyncloader.js index d9be05de326..c6c0eb8d422 100644 --- a/test/cases/loaders/async/loaders/asyncloader.js +++ b/test/cases/loaders/async/loaders/asyncloader.js @@ -1,8 +1,10 @@ -module.exports = function(content) { +/** @type {import("../../../../../").LoaderDefinition} */ +module.exports = function (content) { var cb = this.async(); - if(!cb) throw new Error("Loader should allow async mode"); - if(cb !== this.callback) throw new Error("result of this.async() should be equal to this.callback"); - process.nextTick(function() { + if (!cb) throw new Error("Loader should allow async mode"); + if (cb !== this.callback) + throw new Error("result of this.async() should be equal to this.callback"); + process.nextTick(function () { cb(null, content); }); -}; \ No newline at end of file +}; diff --git a/test/cases/loaders/async/loaders/syncloader.js b/test/cases/loaders/async/loaders/syncloader.js index 0356c896f23..fe0c014dba4 100644 --- a/test/cases/loaders/async/loaders/syncloader.js +++ b/test/cases/loaders/async/loaders/syncloader.js @@ -1,3 +1,4 @@ -module.exports = function(content) { +/** @type {import("../../../../../").LoaderDefinition} */ +module.exports = function (content) { return content; -}; \ No newline at end of file +}; diff --git a/test/cases/loaders/cjs-loader-type/index.js b/test/cases/loaders/cjs-loader-type/index.js new file mode 100644 index 00000000000..9bda36284e3 --- /dev/null +++ b/test/cases/loaders/cjs-loader-type/index.js @@ -0,0 +1,12 @@ +it("should pass package.json type to loader", function () { + expect(require("cjs/loader.js!")).toBe("commonjs"); + expect(require("./loader.js!")).toBe("undefined"); +}); + +it("should pass 'commonjs' type to loader for .cjs", function () { + expect(require("cjs/loader.cjs!")).toBe("commonjs"); + expect(require("./loader.cjs!")).toBe("commonjs"); + // TODO need fix in v8 https://github.com/nodejs/node/issues/35889 + // TODO otherwise this test case cause segment fault + // expect(require("esm/loader.cjs!")).toBe("commonjs"); +}); diff --git a/test/cases/loaders/cjs-loader-type/loader.cjs b/test/cases/loaders/cjs-loader-type/loader.cjs new file mode 100644 index 00000000000..94974dcfad5 --- /dev/null +++ b/test/cases/loaders/cjs-loader-type/loader.cjs @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function loader() { + return `module.exports = "${this.loaders[this.loaderIndex].type}";`; +}; diff --git a/test/cases/loaders/cjs-loader-type/loader.js b/test/cases/loaders/cjs-loader-type/loader.js new file mode 100644 index 00000000000..94974dcfad5 --- /dev/null +++ b/test/cases/loaders/cjs-loader-type/loader.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function loader() { + return `module.exports = "${this.loaders[this.loaderIndex].type}";`; +}; diff --git a/test/cases/loaders/cjs-loader-type/node_modules/cjs/loader.cjs b/test/cases/loaders/cjs-loader-type/node_modules/cjs/loader.cjs new file mode 100644 index 00000000000..b47e68eb16c --- /dev/null +++ b/test/cases/loaders/cjs-loader-type/node_modules/cjs/loader.cjs @@ -0,0 +1,4 @@ +/** @type {import("../../../../../../").LoaderDefinition} */ +module.exports = function loader() { + return `module.exports = "${this.loaders[this.loaderIndex].type}";`; +}; diff --git a/test/cases/loaders/cjs-loader-type/node_modules/cjs/loader.js b/test/cases/loaders/cjs-loader-type/node_modules/cjs/loader.js new file mode 100644 index 00000000000..b47e68eb16c --- /dev/null +++ b/test/cases/loaders/cjs-loader-type/node_modules/cjs/loader.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../../../").LoaderDefinition} */ +module.exports = function loader() { + return `module.exports = "${this.loaders[this.loaderIndex].type}";`; +}; diff --git a/test/cases/loaders/cjs-loader-type/node_modules/cjs/package.json b/test/cases/loaders/cjs-loader-type/node_modules/cjs/package.json new file mode 100644 index 00000000000..5b56c70baa3 --- /dev/null +++ b/test/cases/loaders/cjs-loader-type/node_modules/cjs/package.json @@ -0,0 +1,4 @@ +{ + "name": "cjs-package", + "type": "commonjs" +} diff --git a/test/cases/loaders/cjs-loader-type/node_modules/esm/loader.cjs b/test/cases/loaders/cjs-loader-type/node_modules/esm/loader.cjs new file mode 100644 index 00000000000..b47e68eb16c --- /dev/null +++ b/test/cases/loaders/cjs-loader-type/node_modules/esm/loader.cjs @@ -0,0 +1,4 @@ +/** @type {import("../../../../../../").LoaderDefinition} */ +module.exports = function loader() { + return `module.exports = "${this.loaders[this.loaderIndex].type}";`; +}; diff --git a/test/cases/loaders/cjs-loader-type/node_modules/esm/package.json b/test/cases/loaders/cjs-loader-type/node_modules/esm/package.json new file mode 100644 index 00000000000..64069d2b941 --- /dev/null +++ b/test/cases/loaders/cjs-loader-type/node_modules/esm/package.json @@ -0,0 +1,4 @@ +{ + "name": "esm-package", + "type": "module" +} diff --git a/test/cases/loaders/coffee-loader/index.js b/test/cases/loaders/coffee-loader/index.js index be3924f1e3f..8d028239592 100644 --- a/test/cases/loaders/coffee-loader/index.js +++ b/test/cases/loaders/coffee-loader/index.js @@ -4,7 +4,7 @@ it("should handle the coffee loader correctly", function() { }); it("should handle literate coffee script correctly", function() { - expect(require("!coffee-loader?literate!./script.coffee.md")).toBe("literate coffee test"); + expect(require("!coffee-loader?literate=1!./script.coffee.md")).toBe("literate coffee test"); }); it("should generate valid code with cheap-source-map", function() { diff --git a/test/cases/loaders/context/index.js b/test/cases/loaders/context/index.js index 9105d7d6f32..3de4d968cf5 100644 --- a/test/cases/loaders/context/index.js +++ b/test/cases/loaders/context/index.js @@ -1,5 +1,8 @@ it("should be able to use a context with a loader", function() { - var abc = "abc", scr = "script.coffee"; + var abc = "abc", + scr = "script.coffee"; expect(require("../_resources/" + scr)).toBe("coffee test"); - expect(require("raw-loader!../_resources/" + abc + ".txt")).toBe("abc"); + expect(require("raw-loader!../_resources/" + abc + ".txt").default).toBe( + "abc" + ); }); diff --git a/test/cases/loaders/context/test.filter.js b/test/cases/loaders/context/test.filter.js new file mode 100644 index 00000000000..3f0358f64f9 --- /dev/null +++ b/test/cases/loaders/context/test.filter.js @@ -0,0 +1,3 @@ +const supportsRequireInModule = require("../../../helpers/supportsRequireInModule"); + +module.exports = config => !config.module || supportsRequireInModule(); diff --git a/test/cases/loaders/css-loader/index.js b/test/cases/loaders/css-loader/index.js index b6484574fb4..4888cdc8c14 100644 --- a/test/cases/loaders/css-loader/index.js +++ b/test/cases/loaders/css-loader/index.js @@ -1,11 +1,11 @@ -it("should handle the css loader correctly", function() { - expect( - (require("!css-loader!../_css/stylesheet.css") + "").indexOf(".rule-direct") - ).not.toEqual(-1); - expect( - (require("!css-loader!../_css/stylesheet.css") + "").indexOf(".rule-import1") - ).not.toEqual(-1); - expect( - (require("!css-loader!../_css/stylesheet.css") + "").indexOf(".rule-import2") - ).not.toEqual(-1); +it("should handle the css loader correctly", function () { + expect(require("!css-loader!../_css/stylesheet.css").default + "").toContain( + ".rule-direct" + ); + expect(require("!css-loader!../_css/stylesheet.css").default + "").toContain( + ".rule-import1" + ); + expect(require("!css-loader!../_css/stylesheet.css").default + "").toContain( + ".rule-import2" + ); }); diff --git a/test/cases/loaders/emit-file/file.js b/test/cases/loaders/emit-file/file.js new file mode 100644 index 00000000000..f74a2f2b564 --- /dev/null +++ b/test/cases/loaders/emit-file/file.js @@ -0,0 +1 @@ +module.exports = "ok"; diff --git a/test/cases/loaders/emit-file/index.js b/test/cases/loaders/emit-file/index.js new file mode 100644 index 00000000000..4f2905672e5 --- /dev/null +++ b/test/cases/loaders/emit-file/index.js @@ -0,0 +1,6 @@ +import "./loader!./file"; + +it("should have the file emitted", () => { + const result = __non_webpack_require__("./extra-file.js"); + expect(result).toBe("ok"); +}); diff --git a/test/cases/loaders/emit-file/loader.js b/test/cases/loaders/emit-file/loader.js new file mode 100644 index 00000000000..c53b3e18fbc --- /dev/null +++ b/test/cases/loaders/emit-file/loader.js @@ -0,0 +1,5 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (content) { + this.emitFile("extra-file.js", content); + return ""; +}; diff --git a/test/cases/loaders/emit-file/test.filter.js b/test/cases/loaders/emit-file/test.filter.js new file mode 100644 index 00000000000..d957820f37a --- /dev/null +++ b/test/cases/loaders/emit-file/test.filter.js @@ -0,0 +1,3 @@ +module.exports = function (config) { + return !config.module; +}; diff --git a/test/cases/loaders/import-module/a.json b/test/cases/loaders/import-module/a.json new file mode 100644 index 00000000000..0187f3b09d6 --- /dev/null +++ b/test/cases/loaders/import-module/a.json @@ -0,0 +1 @@ +{"a":1} diff --git a/test/cases/loaders/import-module/index.js b/test/cases/loaders/import-module/index.js new file mode 100644 index 00000000000..56a4d03f137 --- /dev/null +++ b/test/cases/loaders/import-module/index.js @@ -0,0 +1,6 @@ +import content from "./loader!!"; + +it("should compile", () => { + expect(typeof content).toBe("string"); + expect(content.startsWith("webpack://")).toBe(true); +}); diff --git a/test/cases/loaders/import-module/loader.js b/test/cases/loaders/import-module/loader.js new file mode 100644 index 00000000000..960d39ff9fa --- /dev/null +++ b/test/cases/loaders/import-module/loader.js @@ -0,0 +1,25 @@ +"use strict"; + +const path = require("path"); + +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { + const callback = this.async(); + this.importModule( + path.resolve(__dirname, "module.js"), + { baseUri: "webpack://" }, + (error, exports) => { + if (error) { + callback(error); + return; + } + + callback( + null, + `module.exports = ${ + exports.asset ? JSON.stringify(exports.asset) : undefined + }` + ); + } + ); +}; diff --git a/test/cases/loaders/import-module/module.js b/test/cases/loaders/import-module/module.js new file mode 100644 index 00000000000..97520ef4628 --- /dev/null +++ b/test/cases/loaders/import-module/module.js @@ -0,0 +1,3 @@ +const asset = new URL("./a.json", import.meta.url); + +export { asset } diff --git a/test/cases/loaders/import-module/test.filter.js b/test/cases/loaders/import-module/test.filter.js new file mode 100644 index 00000000000..e5009984cdb --- /dev/null +++ b/test/cases/loaders/import-module/test.filter.js @@ -0,0 +1 @@ +module.exports = config => !config.module; diff --git a/test/cases/loaders/issue-10725/index.js b/test/cases/loaders/issue-10725/index.js new file mode 100644 index 00000000000..d824f7e0bf4 --- /dev/null +++ b/test/cases/loaders/issue-10725/index.js @@ -0,0 +1,7 @@ +import { answer } from './lib'; + +it("should load module correctly", function() { + var result = require("./text.txt.js!=!./loader.js!./text.txt"); + + expect(result.default).toEqual(answer); +}); diff --git a/test/cases/loaders/issue-10725/lib.js b/test/cases/loaders/issue-10725/lib.js new file mode 100644 index 00000000000..64a32fd291e --- /dev/null +++ b/test/cases/loaders/issue-10725/lib.js @@ -0,0 +1 @@ +export const answer = 42; diff --git a/test/cases/loaders/issue-10725/loader.js b/test/cases/loaders/issue-10725/loader.js new file mode 100644 index 00000000000..ff2b347224d --- /dev/null +++ b/test/cases/loaders/issue-10725/loader.js @@ -0,0 +1,22 @@ +const loaderPath = require.resolve("./loader"); + +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { + if (this.query === "?load") { + return ` +import { answer } from "./lib"; + +export default answer; +`; + } + + const matchResource = `${this.utils.contextify(this.context, this.resourcePath)}.js`; + const loader = `${this.utils.contextify(this.context, loaderPath)}?load`; + const remaining = this.utils.contextify(this.context, this.remainingRequest); + const request = `${matchResource}!=!${loader}!${remaining}`; + + this.async(); + this.loadModule(request, (err, source) => { + this.callback(err, source); + }); +}; diff --git a/test/cases/loaders/issue-10725/text.txt b/test/cases/loaders/issue-10725/text.txt new file mode 100644 index 00000000000..8e27be7d615 --- /dev/null +++ b/test/cases/loaders/issue-10725/text.txt @@ -0,0 +1 @@ +text diff --git a/test/cases/loaders/issue-2299/loader/index.js b/test/cases/loaders/issue-2299/loader/index.js index cb27f7cf273..0f27efe4377 100644 --- a/test/cases/loaders/issue-2299/loader/index.js +++ b/test/cases/loaders/issue-2299/loader/index.js @@ -6,20 +6,26 @@ module.exports = function(content) { json.imports, function(url, callback) { this.loadModule(url, function(err, source, map, module) { - if(err) { + if (err) { return callback(err); } callback(null, JSON.parse(source)); }); }.bind(this), function(err, results) { - if(err) { + if (err) { return cb(err); } // Combine all the results into one object and return it - cb(null, "module.exports = " + JSON.stringify(results.reduce(function(prev, result) { - return Object.assign({}, prev, result); - }, json))); + cb( + null, + "module.exports = " + + JSON.stringify( + results.reduce(function(prev, result) { + return { ...prev, ...result }; + }, json) + ) + ); } ); }; diff --git a/test/cases/loaders/less-loader/index.js b/test/cases/loaders/less-loader/index.js index fc94245fbd6..4a43bdcb03d 100644 --- a/test/cases/loaders/less-loader/index.js +++ b/test/cases/loaders/less-loader/index.js @@ -1,11 +1,11 @@ it("should handle the less loader (piped with raw loader) correctly", function() { expect( - require("!raw-loader!less-loader!./less/stylesheet.less").indexOf(".less-rule-direct") - ).not.toEqual(-1); + require("!raw-loader!less-loader!./less/stylesheet.less").default + ).toContain(".less-rule-direct"); expect( - require("!raw-loader!less-loader!./less/stylesheet.less").indexOf(".less-rule-import1") - ).not.toEqual(-1); + require("!raw-loader!less-loader!./less/stylesheet.less").default + ).toContain(".less-rule-import1"); expect( - require("!raw-loader!less-loader!./less/stylesheet.less").indexOf(".less-rule-import2") - ).not.toEqual(-1); + require("!raw-loader!less-loader!./less/stylesheet.less").default + ).toContain(".less-rule-import2"); }); diff --git a/test/cases/loaders/module-description-file/reverseloader.js b/test/cases/loaders/module-description-file/reverseloader.js index 2983d5650c6..4cbb644664a 100644 --- a/test/cases/loaders/module-description-file/reverseloader.js +++ b/test/cases/loaders/module-description-file/reverseloader.js @@ -1,3 +1,4 @@ -module.exports = function(content) { +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (content) { return content.split("").reverse().join(""); -} +}; diff --git a/test/cases/loaders/no-string/errors.js b/test/cases/loaders/no-string/errors.js index c3bb27deb83..79aef6533f4 100644 --- a/test/cases/loaders/no-string/errors.js +++ b/test/cases/loaders/no-string/errors.js @@ -1,10 +1,16 @@ module.exports = [ [ - /\.\/loaders\/no-string\/file\.js \(\.\/loaders\/no-string\/loader\.js!\.\/loaders\/no-string\/file\.js\)/, + { + moduleName: + /\.\/loaders\/no-string\/loader\.js!\.\/loaders\/no-string\/file\.js/ + }, /Module build failed: Error: Final loader \(\.\/loaders\/no-string\/loader\.js\) didn't return a Buffer or String/ ], [ - /\.\/loaders\/no-string\/file\.js \(\.\/loaders\/no-string\/loader\.js!\.\/loaders\/no-string\/pitch-loader\.js!\.\/loaders\/no-string\/file\.js\)/, + { + moduleName: + /\.\/loaders\/no-string\/loader\.js!\.\/loaders\/no-string\/pitch-loader\.js!\.\/loaders\/no-string\/file\.js/ + }, /Module build failed: Error: Final loader \(\.\/loaders\/no-string\/loader\.js\) didn't return a Buffer or String/ ] ]; diff --git a/test/cases/loaders/no-string/infrastructure-log.js b/test/cases/loaders/no-string/infrastructure-log.js new file mode 100644 index 00000000000..af316e72467 --- /dev/null +++ b/test/cases/loaders/no-string/infrastructure-log.js @@ -0,0 +1,3 @@ +module.exports = [ + /^Pack got invalid because of write to: Compilation\/modules.+no-string[/\\]loader\.js!.+no-string[/\\]file\.js$/ +]; diff --git a/test/cases/loaders/pug-loader/test.filter.js b/test/cases/loaders/pug-loader/test.filter.js new file mode 100644 index 00000000000..3f0358f64f9 --- /dev/null +++ b/test/cases/loaders/pug-loader/test.filter.js @@ -0,0 +1,3 @@ +const supportsRequireInModule = require("../../../helpers/supportsRequireInModule"); + +module.exports = config => !config.module || supportsRequireInModule(); diff --git a/test/cases/loaders/query/loaders/queryloader.js b/test/cases/loaders/query/loaders/queryloader.js index 8d606f560f8..f9bb23e1f55 100644 --- a/test/cases/loaders/query/loaders/queryloader.js +++ b/test/cases/loaders/query/loaders/queryloader.js @@ -1,7 +1,11 @@ -module.exports = function(content) { - return "module.exports = " + JSON.stringify({ - resourceQuery: this.resourceQuery, - query: this.query, - prev: content - }); -} +/** @type {import("../../../../../").LoaderDefinition} */ +module.exports = function (content) { + return ( + "module.exports = " + + JSON.stringify({ + resourceQuery: this.resourceQuery, + query: this.query, + prev: content + }) + ); +}; diff --git a/test/cases/loaders/raw-loader/index.js b/test/cases/loaders/raw-loader/index.js index 5367de4e8d3..8f44095ee90 100644 --- a/test/cases/loaders/raw-loader/index.js +++ b/test/cases/loaders/raw-loader/index.js @@ -1,3 +1,3 @@ it("should handle the raw loader correctly", function() { - expect(require("raw-loader!../_resources/abc.txt")).toBe("abc"); + expect(require("raw-loader!../_resources/abc.txt").default).toBe("abc"); }); diff --git a/test/cases/loaders/resolve/index.js b/test/cases/loaders/resolve/index.js index 07e030a14e8..23f20fec53f 100644 --- a/test/cases/loaders/resolve/index.js +++ b/test/cases/loaders/resolve/index.js @@ -2,6 +2,9 @@ it("should be possible to create resolver with different options", () => { const result = require("./loader!"); expect(result).toEqual({ one: "index.js", - two: "index.xyz" + two: "index.xyz", + three: "index.js", + four: "index.xyz", + five: "index.js" }); -}) +}); diff --git a/test/cases/loaders/resolve/loader.js b/test/cases/loaders/resolve/loader.js index 3e558112742..53fc4aaf2f1 100644 --- a/test/cases/loaders/resolve/loader.js +++ b/test/cases/loaders/resolve/loader.js @@ -1,16 +1,32 @@ const path = require("path"); -module.exports = function() { +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { const resolve1 = this.getResolve(); const resolve2 = this.getResolve({ extensions: [".xyz", ".js"] }); + const resolve3 = this.getResolve({ + extensions: [".hee", "..."] + }); + const resolve4 = this.getResolve({ + extensions: [".xyz", "..."] + }); + const resolve5 = this.getResolve({ + extensions: ["...", ".xyz"] + }); return Promise.all([ resolve1(__dirname, "./index"), - resolve2(__dirname, "./index") - ]).then(([one, two]) => { + resolve2(__dirname, "./index"), + resolve3(__dirname, "./index"), + resolve4(__dirname, "./index"), + resolve5(__dirname, "./index") + ]).then(([one, two, three, four, five]) => { return `module.exports = ${JSON.stringify({ one: path.basename(one), two: path.basename(two), + three: path.basename(three), + four: path.basename(four), + five: path.basename(five) })}`; }); }; diff --git a/test/cases/loaders/utils/index.js b/test/cases/loaders/utils/index.js new file mode 100644 index 00000000000..53744380e9d --- /dev/null +++ b/test/cases/loaders/utils/index.js @@ -0,0 +1,6 @@ +it("should allow to access utils in loader", () => { + expect(require("./loader!" + __filename)).toEqual({ + request1: "./index.js", + request2: "./index.js" + }); +}); diff --git a/test/cases/loaders/utils/loader.js b/test/cases/loaders/utils/loader.js new file mode 100644 index 00000000000..2d9e6e37073 --- /dev/null +++ b/test/cases/loaders/utils/loader.js @@ -0,0 +1,14 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { + return `module.exports = { + request1: ${JSON.stringify( + this.utils.contextify( + this.context, + this.utils.absolutify(this.context, "./index.js") + ) + )}, + request2: ${JSON.stringify( + this.utils.contextify(this.context, this.resourcePath) + )} +}`; +}; diff --git a/test/cases/loaders/val-loader/index.js b/test/cases/loaders/val-loader/index.js deleted file mode 100644 index 29a56b6aa38..00000000000 --- a/test/cases/loaders/val-loader/index.js +++ /dev/null @@ -1,11 +0,0 @@ -it("should handle the val loader (piped with css loader) correctly", function() { - expect( - (require("!css-loader!val-loader!../_css/generateCss") + "").indexOf("generated") - ).not.toEqual(-1); - expect( - (require("!css-loader!val-loader!../_css/generateCss") + "").indexOf(".rule-import2") - ).not.toEqual(-1); - expect( - (require("!raw-loader!val-loader!../_css/generateCss") + "").indexOf("generated") - ).not.toEqual(-1); -}); diff --git a/test/cases/mjs/cjs-import-default/data.json b/test/cases/mjs/cjs-import-default/data.json new file mode 100644 index 00000000000..b3593ddae90 --- /dev/null +++ b/test/cases/mjs/cjs-import-default/data.json @@ -0,0 +1,5 @@ +{ + "__esModule": true, + "data": "ok", + "default": "default" +} diff --git a/test/cases/mjs/cjs-import-default/dynamic.js b/test/cases/mjs/cjs-import-default/dynamic.js new file mode 100644 index 00000000000..1be68250830 --- /dev/null +++ b/test/cases/mjs/cjs-import-default/dynamic.js @@ -0,0 +1,3 @@ +exports.__esModule = Math.random() < -1; +exports.data = "ok"; +exports.default = "default"; diff --git a/test/cases/mjs/cjs-import-default/dynamicFlagged.js b/test/cases/mjs/cjs-import-default/dynamicFlagged.js new file mode 100644 index 00000000000..7afccbd5dde --- /dev/null +++ b/test/cases/mjs/cjs-import-default/dynamicFlagged.js @@ -0,0 +1,3 @@ +exports.__esModule = Math.random() > -1; +exports.data = "ok"; +exports.default = "default"; diff --git a/test/cases/mjs/cjs-import-default/errors.js b/test/cases/mjs/cjs-import-default/errors.js deleted file mode 100644 index 5e0f6e01254..00000000000 --- a/test/cases/mjs/cjs-import-default/errors.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = [ - [ - /Can't import the namespace object from non EcmaScript module \(only default export is available\)/ - ], - [ - /Can't import the namespace object from non EcmaScript module \(only default export is available\)/ - ], - [ - /Can't import the named export 'data' from non EcmaScript module \(only default export is available\)/ - ], - [ - /Can't import the named export 'data' from non EcmaScript module \(only default export is available\)/ - ], - [ - /Can't reexport the namespace object from non EcmaScript module \(only default export is available\)/ - ], - [ - /Can't reexport the named export 'data' from non EcmaScript module \(only default export is available\)/ - ] -]; diff --git a/test/cases/mjs/cjs-import-default/flagged.js b/test/cases/mjs/cjs-import-default/flagged.js new file mode 100644 index 00000000000..500d0fe9d9d --- /dev/null +++ b/test/cases/mjs/cjs-import-default/flagged.js @@ -0,0 +1,3 @@ +exports.__esModule = true; +exports.data = "ok"; +exports.default = "default"; diff --git a/test/cases/mjs/cjs-import-default/index.mjs b/test/cases/mjs/cjs-import-default/index.mjs index 1168325a807..9e664031561 100644 --- a/test/cases/mjs/cjs-import-default/index.mjs +++ b/test/cases/mjs/cjs-import-default/index.mjs @@ -1,12 +1,32 @@ import { data } from "./cjs.js"; import * as star from "./cjs.js"; import def from "./cjs.js"; -import { ns, default as def1, def as def2, data as data2 } from "./reexport.mjs"; +import { + ns, + default as def1, + def as def2, + data as data2 +} from "./reexport.mjs"; import * as reexport from "./reexport.mjs"; -it("should get correct values when importing named exports from a CommonJs module from mjs", function() { - expect(typeof data).toBe("undefined"); - expect({ data }).toEqual({ data: undefined }); +import { data as dynamicData } from "./dynamic.js"; +import * as dynamicStar from "./dynamic.js"; +import dynamicDef from "./dynamic.js"; + +import { data as flaggedData } from "./flagged.js"; +import * as flaggedStar from "./flagged.js"; +import flaggedDef from "./flagged.js"; + +import { data as dynamicFlaggedData } from "./dynamicFlagged.js"; +import * as dynamicFlaggedStar from "./dynamicFlagged.js"; +import dynamicFlaggedDef from "./dynamicFlagged.js"; + +import * as jsonStar from "./data.json"; +import jsonDef from "./data.json"; + +it("should get correct values when importing named exports from a CommonJs module from mjs", function () { + expect(typeof data).toBe("string"); + expect({ data }).toEqual({ data: "ok" }); expect(def).toEqual({ data: "ok", default: "default" @@ -17,54 +37,229 @@ it("should get correct values when importing named exports from a CommonJs modul default: "default" } }); - expect(star).toEqual(nsObj({ - default: { - data: "ok", - default: "default" - } - })); + expect(star).toEqual( + nsObj({ + default: { + data: "ok", + default: "default" + }, + data: "ok" + }) + ); expect({ star }).toEqual({ star: nsObj({ default: { data: "ok", default: "default" - } + }, + data: "ok" }) }); expect(star.default).toEqual({ data: "ok", default: "default" }); - expect(ns).toEqual(nsObj({ - default: { + expect(ns).toEqual( + nsObj({ + default: { + data: "ok", + default: "default" + }, + data: "ok" + }) + ); + expect(def1).toEqual({ + data: "ok", + default: "default" + }); + expect(def2).toEqual({ + data: "ok", + default: "default" + }); + expect(typeof data2).toBe("string"); + expect({ data2 }).toEqual({ data2: "ok" }); + expect(reexport).toEqual( + nsObj({ + ns: nsObj({ + default: { + data: "ok", + default: "default" + }, + data: "ok" + }), + default: { + data: "ok", + default: "default" + }, + def: { + data: "ok", + default: "default" + }, + data: "ok" + }) + ); +}); + +it("should get correct values when importing named exports from a flagged module from mjs", function () { + expect(typeof flaggedData).toBe("string"); + expect({ flaggedData }).toEqual({ flaggedData: "ok" }); + expect(flaggedDef).toEqual({ + __esModule: true, + data: "ok", + default: "default" + }); + expect({ flaggedDef }).toEqual({ + flaggedDef: { + __esModule: true, data: "ok", default: "default" } - })); - expect(def1).toEqual({ + }); + expect(flaggedStar).toEqual( + nsObj({ + default: { + __esModule: true, + data: "ok", + default: "default" + }, + data: "ok" + }) + ); + expect({ flaggedStar }).toEqual({ + flaggedStar: nsObj({ + default: { + __esModule: true, + data: "ok", + default: "default" + }, + data: "ok" + }) + }); + expect(flaggedStar.default).toEqual({ + __esModule: true, data: "ok", default: "default" }); - expect(def2).toEqual({ +}); + +it("should get correct values when importing named exports from a dynamic (non-flagged) module from mjs", function () { + expect(typeof dynamicData).toBe("string"); + expect({ dynamicData }).toEqual({ dynamicData: "ok" }); + expect(dynamicDef).toEqual({ + __esModule: false, data: "ok", default: "default" }); - expect((typeof data2)).toBe("undefined"); - expect(reexport).toEqual(nsObj({ - ns: nsObj({ + expect({ dynamicDef }).toEqual({ + dynamicDef: { + __esModule: false, + data: "ok", + default: "default" + } + }); + expect(dynamicStar).toEqual( + nsObj({ default: { + __esModule: false, data: "ok", default: "default" - } - }), - default: { + }, + data: "ok" + }) + ); + expect({ dynamicStar }).toEqual({ + dynamicStar: nsObj({ + default: { + __esModule: false, + data: "ok", + default: "default" + }, + data: "ok" + }) + }); + expect(dynamicStar.default).toEqual({ + __esModule: false, + data: "ok", + default: "default" + }); +}); + +it("should get correct values when importing named exports from a dynamic (flagged) module from mjs", function () { + expect(typeof dynamicFlaggedData).toBe("string"); + expect({ dynamicFlaggedData }).toEqual({ dynamicFlaggedData: "ok" }); + expect(dynamicFlaggedDef).toEqual({ + __esModule: true, + data: "ok", + default: "default" + }); + expect({ dynamicFlaggedDef }).toEqual({ + dynamicFlaggedDef: { + __esModule: true, data: "ok", default: "default" - }, - def: { + } + }); + expect(dynamicFlaggedStar).toEqual( + nsObj({ + default: { + __esModule: true, + data: "ok", + default: "default" + }, + data: "ok" + }) + ); + expect({ dynamicFlaggedStar }).toEqual({ + dynamicFlaggedStar: nsObj({ + default: { + __esModule: true, + data: "ok", + default: "default" + }, + data: "ok" + }) + }); + expect(dynamicFlaggedStar.default).toEqual({ + __esModule: true, + data: "ok", + default: "default" + }); +}); + +it("should get correct values when importing named exports from a default-only module from mjs", function () { + expect(jsonDef).toEqual({ + __esModule: true, + data: "ok", + default: "default" + }); + expect({ jsonDef }).toEqual({ + jsonDef: { + __esModule: true, data: "ok", default: "default" - }, - data: undefined - })); + } + }); + expect(jsonStar).toEqual( + nsObj({ + default: { + __esModule: true, + data: "ok", + default: "default" + } + }) + ); + expect({ jsonStar }).toEqual({ + jsonStar: nsObj({ + default: { + __esModule: true, + data: "ok", + default: "default" + } + }) + }); + expect(jsonStar.default).toEqual({ + __esModule: true, + data: "ok", + default: "default" + }); }); diff --git a/test/cases/mjs/cjs-import-default/package.json b/test/cases/mjs/cjs-import-default/package.json new file mode 100644 index 00000000000..283e244a11d --- /dev/null +++ b/test/cases/mjs/cjs-import-default/package.json @@ -0,0 +1,3 @@ +{ + "main": "index.mjs" +} diff --git a/test/cases/mjs/esm-by-default/index.js b/test/cases/mjs/esm-by-default/index.js new file mode 100644 index 00000000000..883c2f8d7f7 --- /dev/null +++ b/test/cases/mjs/esm-by-default/index.js @@ -0,0 +1 @@ +require("./index.mjs").setOk(); diff --git a/test/cases/mjs/esm-by-default/index.mjs b/test/cases/mjs/esm-by-default/index.mjs index 701d602ab77..9bbc8c0a964 100644 --- a/test/cases/mjs/esm-by-default/index.mjs +++ b/test/cases/mjs/esm-by-default/index.mjs @@ -1,8 +1,20 @@ -it("should not have commonjs stuff available", function() { - if(typeof module !== "undefined") { // If module is available +let ok = false; + +it("should not use mjs extension by default", () => { + expect(ok).toBe(true); +}); + +it("should not have commonjs stuff available", function () { + if (typeof module !== "undefined") { + // If module is available expect(module).toHaveProperty("webpackTestSuiteModule"); // it must be the node.js module } - if(typeof require !== "undefined") { // If require is available + if (typeof require !== "undefined") { + // If require is available expect(require).toHaveProperty("webpackTestSuiteRequire"); // it must be the node.js require } }); + +export function setOk() { + ok = true; +} diff --git a/test/cases/mjs/namespace-object-lazy/cjs-dynamic.js b/test/cases/mjs/namespace-object-lazy/cjs-dynamic.js new file mode 100644 index 00000000000..1aaa6e03da1 --- /dev/null +++ b/test/cases/mjs/namespace-object-lazy/cjs-dynamic.js @@ -0,0 +1 @@ +module.exports = Promise.resolve(1); diff --git a/test/cases/mjs/namespace-object-lazy/index.mjs b/test/cases/mjs/namespace-object-lazy/index.mjs index daf92e19219..63405d836e9 100644 --- a/test/cases/mjs/namespace-object-lazy/index.mjs +++ b/test/cases/mjs/namespace-object-lazy/index.mjs @@ -1,86 +1,151 @@ -it("should receive a namespace object when importing commonjs", function(done) { - import("./cjs.js").then(function(result) { - expect(result).toEqual(nsObj({ default: { named: "named", default: "default" } })); - done(); - }).catch(done); +it("should receive a namespace object when importing commonjs", function (done) { + import("./cjs.js") + .then(function (result) { + expect(result).toEqual( + nsObj({ + default: { named: "named", default: "default" }, + named: "named" + }) + ); + done(); + }) + .catch(done); }); -it("should receive a namespace object when importing commonjs with __esModule", function(done) { - import("./cjs-esmodule.js").then(function(result) { - expect(result).toEqual(nsObj({ default: { __esModule: true, named: "named", default: "default" } })); - done(); - }).catch(done); +it("should receive a namespace object when importing commonjs with __esModule", function (done) { + import("./cjs-esmodule.js") + .then(function (result) { + expect(result).toEqual( + nsObj({ + default: { __esModule: true, named: "named", default: "default" }, + named: "named" + }) + ); + done(); + }) + .catch(done); +}); + +it("should resolve the promise returned by the imported dynamic commonjs", function (done) { + const post = "dynamic.js"; + import(/* webpackMode: "eager" */ "./cjs-" + post) // context module + .then(function (result) { + expect(result).toBe(1); + done(); + }) + .catch(done); }); function contextCJS(name) { return Promise.all([ import(`./dir-cjs/${name}.js`), - import(/* webpackMode: "lazy-once" */`./dir-cjs?1/${name}.js`), - import(/* webpackMode: "eager" */`./dir-cjs?2/${name}.js`) - ]).then(function(results) { - return import(/* webpackMode: "weak" */`./dir-cjs/${name}.js`).then(function(r) { - results.push(r); - return results; - }); + import(/* webpackMode: "lazy-once" */ `./dir-cjs?1/${name}.js`), + import(/* webpackMode: "eager" */ `./dir-cjs?2/${name}.js`) + ]).then(function (results) { + return import(/* webpackMode: "weak" */ `./dir-cjs/${name}.js`).then( + function (r) { + results.push(r); + return results; + } + ); }); } function contextHarmony(name) { return Promise.all([ import(`./dir-harmony/${name}.js`), - import(/* webpackMode: "lazy-once" */`./dir-harmony?1/${name}.js`), - import(/* webpackMode: "eager" */`./dir-harmony?2/${name}.js`) - ]).then(function(results) { - return import(/* webpackMode: "weak" */`./dir-harmony/${name}.js`).then(function(r) { - results.push(r); - return results; - }); + import(/* webpackMode: "lazy-once" */ `./dir-harmony?1/${name}.js`), + import(/* webpackMode: "eager" */ `./dir-harmony?2/${name}.js`) + ]).then(function (results) { + return import(/* webpackMode: "weak" */ `./dir-harmony/${name}.js`).then( + function (r) { + results.push(r); + return results; + } + ); }); } function contextMixed(name) { return Promise.all([ import(`./dir-mixed/${name}`), - import(/* webpackMode: "lazy-once" */`./dir-mixed?1/${name}`), - import(/* webpackMode: "eager" */`./dir-mixed?2/${name}`) - ]).then(function(results) { - return import(/* webpackMode: "weak" */`./dir-mixed/${name}`).then(function(r) { - results.push(r); - return results; - }); + import(/* webpackMode: "lazy-once" */ `./dir-mixed?1/${name}`), + import(/* webpackMode: "eager" */ `./dir-mixed?2/${name}`) + ]).then(function (results) { + return import(/* webpackMode: "weak" */ `./dir-mixed/${name}`).then( + function (r) { + results.push(r); + return results; + } + ); }); } function promiseTest(promise, equalsTo) { - return promise.then(function(results) { - for(const result of results) - expect(result).toEqual(equalsTo); + return promise.then(function (results) { + expect(results).toEqual(results.map(() => equalsTo)); }); } -it("should receive a namespace object when importing commonjs via context", function() { +it("should receive a namespace object when importing commonjs via context", function () { return Promise.all([ - promiseTest(contextCJS("one"), nsObj({ default: { named: "named", default: "default" } })), - promiseTest(contextCJS("two"), nsObj({ default: { __esModule: true, named: "named", default: "default" } })), - promiseTest(contextCJS("three"), nsObj({ default: { named: "named", default: "default" } })), + promiseTest( + contextCJS("one"), + nsObj({ default: { named: "named", default: "default" }, named: "named" }) + ), + promiseTest( + contextCJS("two"), + nsObj({ + default: { __esModule: true, named: "named", default: "default" }, + named: "named" + }) + ), + promiseTest( + contextCJS("three"), + nsObj({ default: { named: "named", default: "default" }, named: "named" }) + ), promiseTest(contextCJS("null"), nsObj({ default: null })) ]); }); -it("should receive a namespace object when importing harmony via context", function() { +it("should receive a namespace object when importing harmony via context", function () { return Promise.all([ - promiseTest(contextHarmony("one"), nsObj({ named: "named", default: "default" })), - promiseTest(contextHarmony("two"), nsObj({ named: "named", default: "default" })), - promiseTest(contextHarmony("three"), nsObj({ named: "named", default: "default" })) + promiseTest( + contextHarmony("one"), + nsObj({ named: "named", default: "default" }) + ), + promiseTest( + contextHarmony("two"), + nsObj({ named: "named", default: "default" }) + ), + promiseTest( + contextHarmony("three"), + nsObj({ named: "named", default: "default" }) + ) ]); }); -it("should receive a namespace object when importing mixed content via context", function() { +it("should receive a namespace object when importing mixed content via context", function () { return Promise.all([ - promiseTest(contextMixed("one"), nsObj({ default: { named: "named", default: "default" } })), - promiseTest(contextMixed("two"), nsObj({ default: { __esModule: true, named: "named", default: "default" } })), - promiseTest(contextMixed("three"), nsObj({ named: "named", default: "default" })), - promiseTest(contextMixed("null"), nsObj({ default: null })), - promiseTest(contextMixed("json.json"), nsObj({ named: "named", default: { named: "named", default: "default" } })) + promiseTest( + contextMixed("one.js"), + nsObj({ default: { named: "named", default: "default" }, named: "named" }) + ), + promiseTest( + contextMixed("two.js"), + nsObj({ + default: { __esModule: true, named: "named", default: "default" }, + named: "named" + }) + ), + promiseTest( + contextMixed("three.js"), + nsObj({ named: "named", default: "default" }) + ), + promiseTest(contextMixed("null.js"), nsObj({ default: null })), + promiseTest( + contextMixed("json.json"), + nsObj({ default: { named: "named", default: "default" } }) + ) ]); }); diff --git a/test/cases/mjs/namespace-object-lazy/package.json b/test/cases/mjs/namespace-object-lazy/package.json new file mode 100644 index 00000000000..283e244a11d --- /dev/null +++ b/test/cases/mjs/namespace-object-lazy/package.json @@ -0,0 +1,3 @@ +{ + "main": "index.mjs" +} diff --git a/test/cases/mjs/namespace-object-lazy/test.filter.js b/test/cases/mjs/namespace-object-lazy/test.filter.js index 2602795eefb..ca08e60111d 100644 --- a/test/cases/mjs/namespace-object-lazy/test.filter.js +++ b/test/cases/mjs/namespace-object-lazy/test.filter.js @@ -1,3 +1,3 @@ -module.exports = function(config) { +module.exports = function (config) { return !config.minimize; }; diff --git a/test/cases/mjs/no-module-main-field/node_modules/m/a.js b/test/cases/mjs/no-module-main-field/node_modules/m/a.js index edbdf0bdeff..b43605e3975 100644 --- a/test/cases/mjs/no-module-main-field/node_modules/m/a.js +++ b/test/cases/mjs/no-module-main-field/node_modules/m/a.js @@ -1 +1 @@ -export default "nope1"; +export default "yep"; diff --git a/test/cases/mjs/no-module-main-field/node_modules/m/a.mjs b/test/cases/mjs/no-module-main-field/node_modules/m/a.mjs index b43605e3975..edbdf0bdeff 100644 --- a/test/cases/mjs/no-module-main-field/node_modules/m/a.mjs +++ b/test/cases/mjs/no-module-main-field/node_modules/m/a.mjs @@ -1 +1 @@ -export default "yep"; +export default "nope1"; diff --git a/test/cases/mjs/no-module-main-field/package.json b/test/cases/mjs/no-module-main-field/package.json new file mode 100644 index 00000000000..283e244a11d --- /dev/null +++ b/test/cases/mjs/no-module-main-field/package.json @@ -0,0 +1,3 @@ +{ + "main": "index.mjs" +} diff --git a/test/cases/mjs/non-enumerable/analyzable-module.js b/test/cases/mjs/non-enumerable/analyzable-module.js new file mode 100644 index 00000000000..e151e0a4f63 --- /dev/null +++ b/test/cases/mjs/non-enumerable/analyzable-module.js @@ -0,0 +1,2 @@ +exports.prop = true; +Object.defineProperty(exports, "nonEnumerable", { value: true }); diff --git a/test/cases/mjs/non-enumerable/errors.js b/test/cases/mjs/non-enumerable/errors.js new file mode 100644 index 00000000000..95a95c2df13 --- /dev/null +++ b/test/cases/mjs/non-enumerable/errors.js @@ -0,0 +1,8 @@ +module.exports = [ + [ + /export '__esModule' \(imported as 'm1'\) was not found in '\.\/analyzable-module\.js'/ + ], + [ + /export '__esModule' \(imported as 'm1'\) was not found in '\.\/analyzable-module\.js'/ + ] +]; diff --git a/test/cases/mjs/non-enumerable/esModule.js b/test/cases/mjs/non-enumerable/esModule.js new file mode 100644 index 00000000000..969949a5e5c --- /dev/null +++ b/test/cases/mjs/non-enumerable/esModule.js @@ -0,0 +1,3 @@ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.prop = true; +Object.defineProperty(exports, "nonEnumerable", { value: true }); diff --git a/test/cases/mjs/non-enumerable/index.js b/test/cases/mjs/non-enumerable/index.js new file mode 100644 index 00000000000..fd35c85c5ab --- /dev/null +++ b/test/cases/mjs/non-enumerable/index.js @@ -0,0 +1,5 @@ +import "./test.js?concatenated"; +import "./test.mjs?concatenated"; + +require("./test.js?non-concatenated"); +require("./test.mjs?non-concatenated"); diff --git a/test/cases/mjs/non-enumerable/test.js b/test/cases/mjs/non-enumerable/test.js new file mode 100644 index 00000000000..d5d2e7f4b15 --- /dev/null +++ b/test/cases/mjs/non-enumerable/test.js @@ -0,0 +1,135 @@ +import * as m1 from "./analyzable-module.js"; +import * as m2 from "./weird-module.js"; +import * as m3 from "./esModule.js"; +import d1 from "./analyzable-module.js"; +import d2 from "./weird-module.js"; +import d3 from "./esModule.js"; + +it("should include non-enumerable properties (non-mjs)", () => { + const ns = m1; + + expect(m1.prop).toBe(true); + expect(ns.prop).toBe(true); + + expect(m1.nonEnumerable).toBe(true); + expect(ns.nonEnumerable).toBe(true); + + expect(m1.default).toBeTypeOf("object"); + expect(ns.default).toBeTypeOf("object"); + + expect(m1.__esModule).toBe(true); + expect(ns.__esModule).toBe(true); +}); + +it("should include non-enumerable properties (non-mjs, promise)", () => + import("./analyzable-module").then(m1 => { + const ns = m1; + + expect(m1.prop).toBe(true); + expect(ns.prop).toBe(true); + + expect(m1.nonEnumerable).toBe(true); + expect(ns.nonEnumerable).toBe(true); + + expect(m1.default).toBeTypeOf("object"); + expect(ns.default).toBeTypeOf("object"); + + expect(m1.__esModule).toBe(true); + expect(ns.__esModule).toBe(true); + })); + +it("should not include prototype properties and symbols (non-mjs)", () => { + const ns = m2; // For historical reasons this doesn't yield a namespace object + const sym = m2.sym; + + expect(m2.prop).toBe(true); + expect(ns.prop).toBe(true); + + expect(m2.nonEnumerable).toBe(true); + expect(ns.nonEnumerable).toBe(true); + + expect(m2.protoProp).toBe(true); + expect(ns.protoProp).toBe(true); + + expect(m2.nonEnumerablePrototype).toBe(true); + expect(ns.nonEnumerablePrototype).toBe(true); + + expect(m2[sym]).toBe(true); + expect(ns[sym]).toBe(true); + + expect(m2.default).toBeTypeOf("object"); + expect(ns.default).toBe(undefined); // This is intentional + + expect(m2.__esModule).toBe(true); + expect(ns.__esModule).toBe(undefined); // This is intentional +}); + +it("should not include prototype properties and symbols (non-mjs, promise)", () => + import("./weird-module").then(m2 => { + const ns = m2; + const sym = m2.sym; + + expect(m2.prop).toBe(true); + expect(ns.prop).toBe(true); + + expect(m2.nonEnumerable).toBe(true); + expect(ns.nonEnumerable).toBe(true); + + expect(m2.protoProp).toBe(true); + expect(ns.protoProp).toBe(true); + + expect(m2.nonEnumerablePrototype).toBe(true); + expect(ns.nonEnumerablePrototype).toBe(true); + + expect(m2[sym]).toBe(undefined); + expect(ns[sym]).toBe(undefined); + + expect(m2.default).toBeTypeOf("object"); + expect(ns.default).toBeTypeOf("object"); + + expect(m2.__esModule).toBe(true); + expect(ns.__esModule).toBe(true); + })); + +it("should include non-enumerable properties with __esModule (non-mjs)", () => { + const ns = m3; + + expect(m3.prop).toBe(true); + expect(ns.prop).toBe(true); + + expect(m3.nonEnumerable).toBe(true); + expect(ns.nonEnumerable).toBe(true); + + expect(m3.default).toBe(undefined); + expect(ns.default).toBe(undefined); + + expect(m3.__esModule).toBe(true); + expect(ns.__esModule).toBe(true); +}); + +it("should include non-enumerable properties with __esModule (non-mjs, promise)", () => + import("./analyzable-module").then(m3 => { + const ns = m3; + + expect(m3.prop).toBe(true); + expect(ns.prop).toBe(true); + + expect(m3.nonEnumerable).toBe(true); + expect(ns.nonEnumerable).toBe(true); + + expect(m3.default).toBeTypeOf("object"); + expect(ns.default).toBeTypeOf("object"); + + expect(m3.__esModule).toBe(true); + expect(ns.__esModule).toBe(true); + })); + +it("should not handle __esModule for the default import (non-mjs)", () => { + expect(d1.__esModule).toBe(undefined); + expect(Object(d1).__esModule).toBe(undefined); + + expect(d2.__esModule).toBe(undefined); + expect(Object(d2).__esModule).toBe(undefined); + + expect(d3).toBe(undefined); +}); diff --git a/test/cases/mjs/non-enumerable/test.mjs b/test/cases/mjs/non-enumerable/test.mjs new file mode 100644 index 00000000000..a4c1bf6915e --- /dev/null +++ b/test/cases/mjs/non-enumerable/test.mjs @@ -0,0 +1,136 @@ +import * as m1 from "./analyzable-module.js"; +import * as m2 from "./weird-module.js"; +import * as m3 from "./esModule.js"; +import d1 from "./analyzable-module.js"; +import d2 from "./weird-module.js"; +import d3 from "./esModule.js"; + +it("should include non-enumerable properties (mjs)", () => { + const ns = m1; + + expect(m1.prop).toBe(true); + expect(ns.prop).toBe(true); + + expect(m1.nonEnumerable).toBe(true); + expect(ns.nonEnumerable).toBe(true); + + expect(m1.default).toBeTypeOf("object"); + expect(ns.default).toBeTypeOf("object"); + + expect(m1.__esModule).toBe(true); + expect(ns.__esModule).toBe(true); +}); + +it("should include non-enumerable properties (mjs, promise)", () => + import("./analyzable-module.js").then(m1 => { + const ns = m1; + + expect(m1.prop).toBe(true); + expect(ns.prop).toBe(true); + + expect(m1.nonEnumerable).toBe(true); + expect(ns.nonEnumerable).toBe(true); + + expect(m1.default).toBeTypeOf("object"); + expect(ns.default).toBeTypeOf("object"); + + expect(m1.__esModule).toBe(true); + expect(ns.__esModule).toBe(true); + })); + +it("should not include prototype properties and symbols (mjs)", () => { + const ns = m2; + const sym = m2.sym; + + expect(m2.prop).toBe(true); + expect(ns.prop).toBe(true); + + expect(m2.nonEnumerable).toBe(true); + expect(ns.nonEnumerable).toBe(true); + + expect(m2.protoProp).toBe(true); + expect(ns.protoProp).toBe(true); + + expect(m2.nonEnumerablePrototype).toBe(true); + expect(ns.nonEnumerablePrototype).toBe(true); + + expect(m2[sym]).toBe(undefined); + expect(ns[sym]).toBe(undefined); + + expect(m2.default).toBeTypeOf("object"); + expect(ns.default).toBeTypeOf("object"); + + expect(m2.__esModule).toBe(true); + expect(ns.__esModule).toBe(true); +}); + +it("should not include prototype properties and symbols (mjs, promise)", () => + import("./weird-module.js").then(m2 => { + const ns = m2; + const sym = m2.sym; + + expect(m2.prop).toBe(true); + expect(ns.prop).toBe(true); + + expect(m2.nonEnumerable).toBe(true); + expect(ns.nonEnumerable).toBe(true); + + expect(m2.protoProp).toBe(true); + expect(ns.protoProp).toBe(true); + + expect(m2.nonEnumerablePrototype).toBe(true); + expect(ns.nonEnumerablePrototype).toBe(true); + + expect(m2[sym]).toBe(undefined); + expect(ns[sym]).toBe(undefined); + + expect(m2.default).toBeTypeOf("object"); + expect(ns.default).toBeTypeOf("object"); + + expect(m2.__esModule).toBe(true); + expect(ns.__esModule).toBe(true); + })); + +it("should include non-enumerable properties with __esModule (non-mjs)", () => { + const ns = m3; + + expect(m3.prop).toBe(true); + expect(ns.prop).toBe(true); + + expect(m3.nonEnumerable).toBe(true); + expect(ns.nonEnumerable).toBe(true); + + expect(m3.default).toBeTypeOf("object"); + expect(ns.default).toBeTypeOf("object"); + + expect(m3.__esModule).toBe(true); + expect(ns.__esModule).toBe(true); +}); + +it("should include non-enumerable properties with __esModule (non-mjs, promise)", () => + import("./analyzable-module.js").then(m3 => { + const ns = m3; + + expect(m3.prop).toBe(true); + expect(ns.prop).toBe(true); + + expect(m3.nonEnumerable).toBe(true); + expect(ns.nonEnumerable).toBe(true); + + expect(m3.default).toBeTypeOf("object"); + expect(ns.default).toBeTypeOf("object"); + + expect(m3.__esModule).toBe(true); + expect(ns.__esModule).toBe(true); + })); + +it("should not handle __esModule for the default import (mjs)", () => { + expect(d1.__esModule).toBe(undefined); + expect(Object(d1).__esModule).toBe(undefined); + + expect(d2.__esModule).toBe(undefined); + expect(Object(d2).__esModule).toBe(undefined); + + expect(d3.__esModule).toBe(true); + expect(Object(d3).__esModule).toBe(true); +}); diff --git a/test/cases/mjs/non-enumerable/warnings.js b/test/cases/mjs/non-enumerable/warnings.js new file mode 100644 index 00000000000..d2ed9734d9d --- /dev/null +++ b/test/cases/mjs/non-enumerable/warnings.js @@ -0,0 +1,12 @@ +module.exports = [ + [ + /export '__esModule' \(imported as 'm1'\) was not found in '\.\/analyzable-module\.js'/ + ], + [/export 'default' \(imported as 'm3'\) was not found in '\.\/esModule\.js'/], + [/export 'default' \(imported as 'd3'\) was not found in '\.\/esModule\.js'/], + [ + /export '__esModule' \(imported as 'm1'\) was not found in '\.\/analyzable-module\.js'/ + ], + [/export 'default' \(imported as 'm3'\) was not found in '\.\/esModule\.js'/], + [/export 'default' \(imported as 'd3'\) was not found in '\.\/esModule\.js'/] +]; diff --git a/test/cases/mjs/non-enumerable/weird-module.js b/test/cases/mjs/non-enumerable/weird-module.js new file mode 100644 index 00000000000..a131814b948 --- /dev/null +++ b/test/cases/mjs/non-enumerable/weird-module.js @@ -0,0 +1,8 @@ +const sym = Symbol("sym"); +exports.sym = sym; +exports.prop = true; +Object.defineProperty(exports, "nonEnumerable", { value: true }); +exports[sym] = true; +const p = { protoProp: true, [sym]: true }; +Object.setPrototypeOf(exports, p); +Object.defineProperty(p, "nonEnumerablePrototype", { value: true }); diff --git a/test/cases/mjs/non-mjs-cjs-import-default/cjs.js b/test/cases/mjs/non-mjs-cjs-import-default/cjs.js new file mode 100644 index 00000000000..2c3ee027387 --- /dev/null +++ b/test/cases/mjs/non-mjs-cjs-import-default/cjs.js @@ -0,0 +1,4 @@ +module.exports = { + data: "ok", + default: "default" +}; diff --git a/test/cases/mjs/non-mjs-cjs-import-default/data.json b/test/cases/mjs/non-mjs-cjs-import-default/data.json new file mode 100644 index 00000000000..b3593ddae90 --- /dev/null +++ b/test/cases/mjs/non-mjs-cjs-import-default/data.json @@ -0,0 +1,5 @@ +{ + "__esModule": true, + "data": "ok", + "default": "default" +} diff --git a/test/cases/mjs/non-mjs-cjs-import-default/dynamic.js b/test/cases/mjs/non-mjs-cjs-import-default/dynamic.js new file mode 100644 index 00000000000..1be68250830 --- /dev/null +++ b/test/cases/mjs/non-mjs-cjs-import-default/dynamic.js @@ -0,0 +1,3 @@ +exports.__esModule = Math.random() < -1; +exports.data = "ok"; +exports.default = "default"; diff --git a/test/cases/mjs/non-mjs-cjs-import-default/dynamicFlagged.js b/test/cases/mjs/non-mjs-cjs-import-default/dynamicFlagged.js new file mode 100644 index 00000000000..7afccbd5dde --- /dev/null +++ b/test/cases/mjs/non-mjs-cjs-import-default/dynamicFlagged.js @@ -0,0 +1,3 @@ +exports.__esModule = Math.random() > -1; +exports.data = "ok"; +exports.default = "default"; diff --git a/test/cases/mjs/non-mjs-cjs-import-default/flagged.js b/test/cases/mjs/non-mjs-cjs-import-default/flagged.js new file mode 100644 index 00000000000..500d0fe9d9d --- /dev/null +++ b/test/cases/mjs/non-mjs-cjs-import-default/flagged.js @@ -0,0 +1,3 @@ +exports.__esModule = true; +exports.data = "ok"; +exports.default = "default"; diff --git a/test/cases/mjs/non-mjs-cjs-import-default/index.js b/test/cases/mjs/non-mjs-cjs-import-default/index.js new file mode 100644 index 00000000000..33fc0738101 --- /dev/null +++ b/test/cases/mjs/non-mjs-cjs-import-default/index.js @@ -0,0 +1,198 @@ +import { data } from "./cjs.js"; +import * as star from "./cjs.js"; +import def from "./cjs.js"; +import { ns, default as def1, def as def2, data as data2 } from "./reexport.js"; +import * as reexport from "./reexport.js"; + +import { data as dynamicData } from "./dynamic.js"; +import * as dynamicStar from "./dynamic.js"; +import dynamicDef from "./dynamic.js"; + +import { data as flaggedData } from "./flagged.js"; +import * as flaggedStar from "./flagged.js"; +import flaggedDef from "./flagged.js"; + +import { data as dynamicFlaggedData } from "./dynamicFlagged.js"; +import * as dynamicFlaggedStar from "./dynamicFlagged.js"; +import dynamicFlaggedDef from "./dynamicFlagged.js"; + +import * as jsonStar from "./data.json"; +import jsonDef from "./data.json"; + +it("should get correct values when importing named exports from a CommonJs module from non-mjs", function () { + expect(typeof data).toBe("string"); + expect({ data }).toEqual({ data: "ok" }); + expect(def).toEqual({ + data: "ok", + default: "default" + }); + expect({ def }).toEqual({ + def: { + data: "ok", + default: "default" + } + }); + expect(star).toEqual({ + data: "ok", + default: "default" + }); + expect({ star }).toEqual({ + star: { + data: "ok", + default: "default" + } + }); + expect(star.default).toEqual({ + data: "ok", + default: "default" + }); + expect(ns).toEqual({ + data: "ok", + default: "default" + }); + expect(def1).toEqual({ + data: "ok", + default: "default" + }); + expect(def2).toEqual({ + data: "ok", + default: "default" + }); + expect(typeof data2).toBe("string"); + expect({ data2 }).toEqual({ data2: "ok" }); + expect(reexport).toEqual( + nsObj({ + ns: { + data: "ok", + default: "default" + }, + default: { + data: "ok", + default: "default" + }, + def: { + data: "ok", + default: "default" + }, + data: "ok" + }) + ); +}); + +it("should get correct values when importing named exports from a flagged module from non-mjs", function () { + expect(typeof flaggedData).toBe("string"); + expect({ flaggedData }).toEqual({ flaggedData: "ok" }); + expect(flaggedDef).toBe("default"); + expect({ flaggedDef }).toEqual({ + flaggedDef: "default" + }); + expect(flaggedStar).toEqual({ + __esModule: true, + default: "default", + data: "ok" + }); + expect({ flaggedStar }).toEqual({ + flaggedStar: { + __esModule: true, + default: "default", + data: "ok" + } + }); + expect(flaggedStar.default).toBe("default"); +}); + +it("should get correct values when importing named exports from a dynamic (non-flagged) module from non-mjs", function () { + expect(typeof dynamicData).toBe("string"); + expect({ dynamicData }).toEqual({ dynamicData: "ok" }); + expect(dynamicDef).toEqual({ + __esModule: false, + data: "ok", + default: "default" + }); + expect({ dynamicDef }).toEqual({ + dynamicDef: { + __esModule: false, + data: "ok", + default: "default" + } + }); + expect(dynamicStar).toEqual({ + __esModule: false, + data: "ok", + default: "default" + }); + expect({ dynamicStar }).toEqual({ + dynamicStar: { + __esModule: false, + data: "ok", + default: "default" + } + }); + expect(dynamicStar.default).toEqual({ + __esModule: false, + data: "ok", + default: "default" + }); +}); + +it("should get correct values when importing named exports from a dynamic (flagged) module from non-mjs", function () { + expect(typeof dynamicFlaggedData).toBe("string"); + expect({ dynamicFlaggedData }).toEqual({ dynamicFlaggedData: "ok" }); + expect(dynamicFlaggedDef).toBe("default"); + expect({ dynamicFlaggedDef }).toEqual({ + dynamicFlaggedDef: "default" + }); + expect(dynamicFlaggedStar).toEqual({ + __esModule: true, + default: "default", + data: "ok" + }); + expect({ dynamicFlaggedStar }).toEqual({ + dynamicFlaggedStar: { + __esModule: true, + default: "default", + data: "ok" + } + }); + expect(dynamicFlaggedStar.default).toBe("default"); +}); + +it("should get correct values when importing named exports from a default-only module from non-mjs", function () { + expect(jsonDef).toEqual({ + __esModule: true, + data: "ok", + default: "default" + }); + expect({ jsonDef }).toEqual({ + jsonDef: { + __esModule: true, + data: "ok", + default: "default" + } + }); + expect(jsonStar).toEqual( + nsObj({ + data: "ok", + default: { + __esModule: true, + data: "ok", + default: "default" + } + }) + ); + expect({ jsonStar }).toEqual({ + jsonStar: nsObj({ + data: "ok", + default: { + __esModule: true, + data: "ok", + default: "default" + } + }) + }); + expect(jsonStar.default).toEqual({ + __esModule: true, + data: "ok", + default: "default" + }); +}); diff --git a/test/cases/mjs/non-mjs-cjs-import-default/reexport.js b/test/cases/mjs/non-mjs-cjs-import-default/reexport.js new file mode 100644 index 00000000000..1b07e112d01 --- /dev/null +++ b/test/cases/mjs/non-mjs-cjs-import-default/reexport.js @@ -0,0 +1,5 @@ +import * as ns from "./cjs.js"; +export { ns }; +export { default } from "./cjs.js"; +export { default as def } from "./cjs.js"; +export { data as data } from "./cjs.js"; diff --git a/test/cases/mjs/non-mjs-namespace-object-lazy/cjs-dynamic.js b/test/cases/mjs/non-mjs-namespace-object-lazy/cjs-dynamic.js new file mode 100644 index 00000000000..1aaa6e03da1 --- /dev/null +++ b/test/cases/mjs/non-mjs-namespace-object-lazy/cjs-dynamic.js @@ -0,0 +1 @@ +module.exports = Promise.resolve(1); diff --git a/test/cases/mjs/non-mjs-namespace-object-lazy/index.js b/test/cases/mjs/non-mjs-namespace-object-lazy/index.js index 1059b4dc9d4..dc83158405b 100644 --- a/test/cases/mjs/non-mjs-namespace-object-lazy/index.js +++ b/test/cases/mjs/non-mjs-namespace-object-lazy/index.js @@ -12,6 +12,16 @@ it("should receive a namespace object when importing commonjs with __esModule", }).catch(done); }); +it("should resolve the promise returned by the imported dynamic commonjs", function (done) { + const post = "dynamic.js"; + import(/* webpackMode: "eager" */ "./cjs-" + post) // context module + .then(function (result) { + expect(result).toBe(1); + done(); + }) + .catch(done); +}); + function contextCJS(name) { return Promise.all([ import(`./dir-cjs/${name}`), diff --git a/test/cases/mjs/non-mjs-namespace-object-lazy/test.filter.js b/test/cases/mjs/non-mjs-namespace-object-lazy/test.filter.js index 2602795eefb..ca08e60111d 100644 --- a/test/cases/mjs/non-mjs-namespace-object-lazy/test.filter.js +++ b/test/cases/mjs/non-mjs-namespace-object-lazy/test.filter.js @@ -1,3 +1,3 @@ -module.exports = function(config) { +module.exports = function (config) { return !config.minimize; }; diff --git a/test/cases/mjs/type-module/index.js b/test/cases/mjs/type-module/index.js new file mode 100644 index 00000000000..8799340658e --- /dev/null +++ b/test/cases/mjs/type-module/index.js @@ -0,0 +1,9 @@ +it("should not have access to require, module and define", () => { + expect( + typeof require === "undefined" || require.webpackTestSuiteRequire + ).toBe(true); + expect(typeof module === "undefined" || module.webpackTestSuiteModule).toBe( + true + ); + expect(typeof define).toBe("undefined"); +}); diff --git a/test/cases/mjs/type-module/package.json b/test/cases/mjs/type-module/package.json new file mode 100644 index 00000000000..3dbc1ca591c --- /dev/null +++ b/test/cases/mjs/type-module/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/test/cases/mjs/type-null/index.js b/test/cases/mjs/type-null/index.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/cases/mjs/type-null/index.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/cases/mjs/type-null/package.json b/test/cases/mjs/type-null/package.json new file mode 100644 index 00000000000..f4d94c0c979 --- /dev/null +++ b/test/cases/mjs/type-null/package.json @@ -0,0 +1,3 @@ +{ + "type": null +} diff --git a/test/cases/nonce/set-nonce/index.js b/test/cases/nonce/set-nonce/index.js index 9607ec97b86..6854393685b 100644 --- a/test/cases/nonce/set-nonce/index.js +++ b/test/cases/nonce/set-nonce/index.js @@ -7,7 +7,8 @@ it("should load script with nonce 'nonce1234'", function(done) { // if in browser context, test that nonce was added. if (typeof document !== 'undefined') { var script = document.querySelector('script[src="js/chunk-with-nonce.web.js"]'); - expect(script.getAttribute('nonce')).toBe('nonce1234'); + var nonce = script.nonce || script.getAttribute('nonce'); + expect(nonce).toBe('nonce1234'); } __webpack_nonce__ = undefined; done(); diff --git a/test/cases/optimize/concat-star-import/index.js b/test/cases/optimize/concat-star-import/index.js new file mode 100644 index 00000000000..0cbaf6cfabd --- /dev/null +++ b/test/cases/optimize/concat-star-import/index.js @@ -0,0 +1,5 @@ +import { foo } from "./module"; + +it("should handle star import with name collision", () => { + expect(foo()).toBe("1 21 2"); +}); diff --git a/test/cases/optimize/concat-star-import/module.js b/test/cases/optimize/concat-star-import/module.js new file mode 100644 index 00000000000..7fd27db367b --- /dev/null +++ b/test/cases/optimize/concat-star-import/module.js @@ -0,0 +1,7 @@ +import * as c from "cmodule"; + +export function foo() { + // variable name matches the imported package name + const cmodule = c([1, 2]); + return cmodule + cmodule; +} diff --git a/test/cases/optimize/concat-star-import/node_modules/cmodule/index.js b/test/cases/optimize/concat-star-import/node_modules/cmodule/index.js new file mode 100644 index 00000000000..77d1e74ffda --- /dev/null +++ b/test/cases/optimize/concat-star-import/node_modules/cmodule/index.js @@ -0,0 +1,18 @@ +(function () { + 'use strict'; + + function cmodule (args) { + return (args || []).join(' '); + } + + if (typeof module !== 'undefined' && module.exports) { + cmodule.default = cmodule; + module.exports = cmodule; + } else if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) { + define('cmodule', [], function () { + return cmodule; + }); + } else { + window.cmodule = cmodule; + } +}()); diff --git a/test/cases/optimize/concat-star-import/node_modules/cmodule/package.json b/test/cases/optimize/concat-star-import/node_modules/cmodule/package.json new file mode 100644 index 00000000000..14ab704d8f6 --- /dev/null +++ b/test/cases/optimize/concat-star-import/node_modules/cmodule/package.json @@ -0,0 +1,3 @@ +{ + "main": "index.js" +} diff --git a/test/cases/optimize/many-exports-100/chunk1.js b/test/cases/optimize/many-exports-100/chunk1.js new file mode 100644 index 00000000000..e81e551748f --- /dev/null +++ b/test/cases/optimize/many-exports-100/chunk1.js @@ -0,0 +1,105 @@ +import { + x00, + x01, + x02, + x03, + x04, + x05, + x06, + x07, + x08, + x09, + x10, + x11, + x12, + x13, + x14, + x15, + x16, + x17, + x18, + x19, + x20, + x21, + x22, + x23, + x24, + x25, + x26, + x27, + x28, + x29, + x30, + x31, + x32, + x33, + x34, + x35, + x36, + x37, + x38, + x39, + x40, + x41, + x42, + x43, + x44, + x45, + x46, + x47, + x48, + x49 +} from "./module"; + +export default () => { + expect(x00).toBe("x00"); + expect(x01).toBe("x01"); + expect(x02).toBe("x02"); + expect(x03).toBe("x03"); + expect(x04).toBe("x04"); + expect(x05).toBe("x05"); + expect(x06).toBe("x06"); + expect(x07).toBe("x07"); + expect(x08).toBe("x08"); + expect(x09).toBe("x09"); + expect(x10).toBe("x10"); + expect(x11).toBe("x11"); + expect(x12).toBe("x12"); + expect(x13).toBe("x13"); + expect(x14).toBe("x14"); + expect(x15).toBe("x15"); + expect(x16).toBe("x16"); + expect(x17).toBe("x17"); + expect(x18).toBe("x18"); + expect(x19).toBe("x19"); + expect(x20).toBe("x20"); + expect(x21).toBe("x21"); + expect(x22).toBe("x22"); + expect(x23).toBe("x23"); + expect(x24).toBe("x24"); + expect(x25).toBe("x25"); + expect(x26).toBe("x26"); + expect(x27).toBe("x27"); + expect(x28).toBe("x28"); + expect(x29).toBe("x29"); + expect(x30).toBe("x30"); + expect(x31).toBe("x31"); + expect(x32).toBe("x32"); + expect(x33).toBe("x33"); + expect(x34).toBe("x34"); + expect(x35).toBe("x35"); + expect(x36).toBe("x36"); + expect(x37).toBe("x37"); + expect(x38).toBe("x38"); + expect(x39).toBe("x39"); + expect(x40).toBe("x40"); + expect(x41).toBe("x41"); + expect(x42).toBe("x42"); + expect(x43).toBe("x43"); + expect(x44).toBe("x44"); + expect(x45).toBe("x45"); + expect(x46).toBe("x46"); + expect(x47).toBe("x47"); + expect(x48).toBe("x48"); + expect(x49).toBe("x49"); +}; diff --git a/test/cases/optimize/many-exports-100/chunk2.js b/test/cases/optimize/many-exports-100/chunk2.js new file mode 100644 index 00000000000..f2efeeddad1 --- /dev/null +++ b/test/cases/optimize/many-exports-100/chunk2.js @@ -0,0 +1,105 @@ +import { + y00, + y01, + y02, + y03, + y04, + y05, + y06, + y07, + y08, + y09, + y10, + y11, + y12, + y13, + y14, + y15, + y16, + y17, + y18, + y19, + y20, + y21, + y22, + y23, + y24, + y25, + y26, + y27, + y28, + y29, + y30, + y31, + y32, + y33, + y34, + y35, + y36, + y37, + y38, + y39, + y40, + y41, + y42, + y43, + y44, + y45, + y46, + y47, + y48, + y49 +} from "./module"; + +export default () => { + expect(y00).toBe("y00"); + expect(y01).toBe("y01"); + expect(y02).toBe("y02"); + expect(y03).toBe("y03"); + expect(y04).toBe("y04"); + expect(y05).toBe("y05"); + expect(y06).toBe("y06"); + expect(y07).toBe("y07"); + expect(y08).toBe("y08"); + expect(y09).toBe("y09"); + expect(y10).toBe("y10"); + expect(y11).toBe("y11"); + expect(y12).toBe("y12"); + expect(y13).toBe("y13"); + expect(y14).toBe("y14"); + expect(y15).toBe("y15"); + expect(y16).toBe("y16"); + expect(y17).toBe("y17"); + expect(y18).toBe("y18"); + expect(y19).toBe("y19"); + expect(y20).toBe("y20"); + expect(y21).toBe("y21"); + expect(y22).toBe("y22"); + expect(y23).toBe("y23"); + expect(y24).toBe("y24"); + expect(y25).toBe("y25"); + expect(y26).toBe("y26"); + expect(y27).toBe("y27"); + expect(y28).toBe("y28"); + expect(y29).toBe("y29"); + expect(y30).toBe("y30"); + expect(y31).toBe("y31"); + expect(y32).toBe("y32"); + expect(y33).toBe("y33"); + expect(y34).toBe("y34"); + expect(y35).toBe("y35"); + expect(y36).toBe("y36"); + expect(y37).toBe("y37"); + expect(y38).toBe("y38"); + expect(y39).toBe("y39"); + expect(y40).toBe("y40"); + expect(y41).toBe("y41"); + expect(y42).toBe("y42"); + expect(y43).toBe("y43"); + expect(y44).toBe("y44"); + expect(y45).toBe("y45"); + expect(y46).toBe("y46"); + expect(y47).toBe("y47"); + expect(y48).toBe("y48"); + expect(y49).toBe("y49"); +}; diff --git a/test/cases/optimize/many-exports-100/index.js b/test/cases/optimize/many-exports-100/index.js new file mode 100644 index 00000000000..3e6aeb415b4 --- /dev/null +++ b/test/cases/optimize/many-exports-100/index.js @@ -0,0 +1,10 @@ +it("should mangle all exports correctly x", () => { + return import("./chunk1").then(({ default: test }) => { + test(); + }); +}); +it("should mangle all exports correctly y", () => { + return import("./chunk2").then(({ default: test }) => { + test(); + }); +}); diff --git a/test/cases/optimize/many-exports-100/module.js b/test/cases/optimize/many-exports-100/module.js new file mode 100644 index 00000000000..a38bbd713b2 --- /dev/null +++ b/test/cases/optimize/many-exports-100/module.js @@ -0,0 +1,101 @@ +export const x00 = "x00"; +export const x01 = "x01"; +export const x02 = "x02"; +export const x03 = "x03"; +export const x04 = "x04"; +export const x05 = "x05"; +export const x06 = "x06"; +export const x07 = "x07"; +export const x08 = "x08"; +export const x09 = "x09"; +export const x10 = "x10"; +export const x11 = "x11"; +export const x12 = "x12"; +export const x13 = "x13"; +export const x14 = "x14"; +export const x15 = "x15"; +export const x16 = "x16"; +export const x17 = "x17"; +export const x18 = "x18"; +export const x19 = "x19"; +export const x20 = "x20"; +export const x21 = "x21"; +export const x22 = "x22"; +export const x23 = "x23"; +export const x24 = "x24"; +export const x25 = "x25"; +export const x26 = "x26"; +export const x27 = "x27"; +export const x28 = "x28"; +export const x29 = "x29"; +export const x30 = "x30"; +export const x31 = "x31"; +export const x32 = "x32"; +export const x33 = "x33"; +export const x34 = "x34"; +export const x35 = "x35"; +export const x36 = "x36"; +export const x37 = "x37"; +export const x38 = "x38"; +export const x39 = "x39"; +export const x40 = "x40"; +export const x41 = "x41"; +export const x42 = "x42"; +export const x43 = "x43"; +export const x44 = "x44"; +export const x45 = "x45"; +export const x46 = "x46"; +export const x47 = "x47"; +export const x48 = "x48"; +export const x49 = "x49"; + +export const y00 = "y00"; +export const y01 = "y01"; +export const y02 = "y02"; +export const y03 = "y03"; +export const y04 = "y04"; +export const y05 = "y05"; +export const y06 = "y06"; +export const y07 = "y07"; +export const y08 = "y08"; +export const y09 = "y09"; +export const y10 = "y10"; +export const y11 = "y11"; +export const y12 = "y12"; +export const y13 = "y13"; +export const y14 = "y14"; +export const y15 = "y15"; +export const y16 = "y16"; +export const y17 = "y17"; +export const y18 = "y18"; +export const y19 = "y19"; +export const y20 = "y20"; +export const y21 = "y21"; +export const y22 = "y22"; +export const y23 = "y23"; +export const y24 = "y24"; +export const y25 = "y25"; +export const y26 = "y26"; +export const y27 = "y27"; +export const y28 = "y28"; +export const y29 = "y29"; +export const y30 = "y30"; +export const y31 = "y31"; +export const y32 = "y32"; +export const y33 = "y33"; +export const y34 = "y34"; +export const y35 = "y35"; +export const y36 = "y36"; +export const y37 = "y37"; +export const y38 = "y38"; +export const y39 = "y39"; +export const y40 = "y40"; +export const y41 = "y41"; +export const y42 = "y42"; +export const y43 = "y43"; +export const y44 = "y44"; +export const y45 = "y45"; +export const y46 = "y46"; +export const y47 = "y47"; +export const y48 = "y48"; +export const y49 = "y49"; diff --git a/test/cases/optimize/many-exports-120/chunk1.js b/test/cases/optimize/many-exports-120/chunk1.js new file mode 100644 index 00000000000..84fe5928e35 --- /dev/null +++ b/test/cases/optimize/many-exports-120/chunk1.js @@ -0,0 +1,125 @@ +import { + x00, + x01, + x02, + x03, + x04, + x05, + x06, + x07, + x08, + x09, + x10, + x11, + x12, + x13, + x14, + x15, + x16, + x17, + x18, + x19, + x20, + x21, + x22, + x23, + x24, + x25, + x26, + x27, + x28, + x29, + x30, + x31, + x32, + x33, + x34, + x35, + x36, + x37, + x38, + x39, + x40, + x41, + x42, + x43, + x44, + x45, + x46, + x47, + x48, + x49, + x50, + x51, + x52, + x53, + x54, + x55, + x56, + x57, + x58, + x59 +} from "./module"; + +export default () => { + expect(x00).toBe("x00"); + expect(x01).toBe("x01"); + expect(x02).toBe("x02"); + expect(x03).toBe("x03"); + expect(x04).toBe("x04"); + expect(x05).toBe("x05"); + expect(x06).toBe("x06"); + expect(x07).toBe("x07"); + expect(x08).toBe("x08"); + expect(x09).toBe("x09"); + expect(x10).toBe("x10"); + expect(x11).toBe("x11"); + expect(x12).toBe("x12"); + expect(x13).toBe("x13"); + expect(x14).toBe("x14"); + expect(x15).toBe("x15"); + expect(x16).toBe("x16"); + expect(x17).toBe("x17"); + expect(x18).toBe("x18"); + expect(x19).toBe("x19"); + expect(x20).toBe("x20"); + expect(x21).toBe("x21"); + expect(x22).toBe("x22"); + expect(x23).toBe("x23"); + expect(x24).toBe("x24"); + expect(x25).toBe("x25"); + expect(x26).toBe("x26"); + expect(x27).toBe("x27"); + expect(x28).toBe("x28"); + expect(x29).toBe("x29"); + expect(x30).toBe("x30"); + expect(x31).toBe("x31"); + expect(x32).toBe("x32"); + expect(x33).toBe("x33"); + expect(x34).toBe("x34"); + expect(x35).toBe("x35"); + expect(x36).toBe("x36"); + expect(x37).toBe("x37"); + expect(x38).toBe("x38"); + expect(x39).toBe("x39"); + expect(x40).toBe("x40"); + expect(x41).toBe("x41"); + expect(x42).toBe("x42"); + expect(x43).toBe("x43"); + expect(x44).toBe("x44"); + expect(x45).toBe("x45"); + expect(x46).toBe("x46"); + expect(x47).toBe("x47"); + expect(x48).toBe("x48"); + expect(x49).toBe("x49"); + expect(x50).toBe("x50"); + expect(x51).toBe("x51"); + expect(x52).toBe("x52"); + expect(x53).toBe("x53"); + expect(x54).toBe("x54"); + expect(x55).toBe("x55"); + expect(x56).toBe("x56"); + expect(x57).toBe("x57"); + expect(x58).toBe("x58"); + expect(x59).toBe("x59"); +}; diff --git a/test/cases/optimize/many-exports-120/chunk2.js b/test/cases/optimize/many-exports-120/chunk2.js new file mode 100644 index 00000000000..f8301fd775e --- /dev/null +++ b/test/cases/optimize/many-exports-120/chunk2.js @@ -0,0 +1,125 @@ +import { + y00, + y01, + y02, + y03, + y04, + y05, + y06, + y07, + y08, + y09, + y10, + y11, + y12, + y13, + y14, + y15, + y16, + y17, + y18, + y19, + y20, + y21, + y22, + y23, + y24, + y25, + y26, + y27, + y28, + y29, + y30, + y31, + y32, + y33, + y34, + y35, + y36, + y37, + y38, + y39, + y40, + y41, + y42, + y43, + y44, + y45, + y46, + y47, + y48, + y49, + y50, + y51, + y52, + y53, + y54, + y55, + y56, + y57, + y58, + y59 +} from "./module"; + +export default () => { + expect(y00).toBe("y00"); + expect(y01).toBe("y01"); + expect(y02).toBe("y02"); + expect(y03).toBe("y03"); + expect(y04).toBe("y04"); + expect(y05).toBe("y05"); + expect(y06).toBe("y06"); + expect(y07).toBe("y07"); + expect(y08).toBe("y08"); + expect(y09).toBe("y09"); + expect(y10).toBe("y10"); + expect(y11).toBe("y11"); + expect(y12).toBe("y12"); + expect(y13).toBe("y13"); + expect(y14).toBe("y14"); + expect(y15).toBe("y15"); + expect(y16).toBe("y16"); + expect(y17).toBe("y17"); + expect(y18).toBe("y18"); + expect(y19).toBe("y19"); + expect(y20).toBe("y20"); + expect(y21).toBe("y21"); + expect(y22).toBe("y22"); + expect(y23).toBe("y23"); + expect(y24).toBe("y24"); + expect(y25).toBe("y25"); + expect(y26).toBe("y26"); + expect(y27).toBe("y27"); + expect(y28).toBe("y28"); + expect(y29).toBe("y29"); + expect(y30).toBe("y30"); + expect(y31).toBe("y31"); + expect(y32).toBe("y32"); + expect(y33).toBe("y33"); + expect(y34).toBe("y34"); + expect(y35).toBe("y35"); + expect(y36).toBe("y36"); + expect(y37).toBe("y37"); + expect(y38).toBe("y38"); + expect(y39).toBe("y39"); + expect(y40).toBe("y40"); + expect(y41).toBe("y41"); + expect(y42).toBe("y42"); + expect(y43).toBe("y43"); + expect(y44).toBe("y44"); + expect(y45).toBe("y45"); + expect(y46).toBe("y46"); + expect(y47).toBe("y47"); + expect(y48).toBe("y48"); + expect(y49).toBe("y49"); + expect(y50).toBe("y50"); + expect(y51).toBe("y51"); + expect(y52).toBe("y52"); + expect(y53).toBe("y53"); + expect(y54).toBe("y54"); + expect(y55).toBe("y55"); + expect(y56).toBe("y56"); + expect(y57).toBe("y57"); + expect(y58).toBe("y58"); + expect(y59).toBe("y59"); +}; diff --git a/test/cases/optimize/many-exports-120/index.js b/test/cases/optimize/many-exports-120/index.js new file mode 100644 index 00000000000..3e6aeb415b4 --- /dev/null +++ b/test/cases/optimize/many-exports-120/index.js @@ -0,0 +1,10 @@ +it("should mangle all exports correctly x", () => { + return import("./chunk1").then(({ default: test }) => { + test(); + }); +}); +it("should mangle all exports correctly y", () => { + return import("./chunk2").then(({ default: test }) => { + test(); + }); +}); diff --git a/test/cases/optimize/many-exports-120/module.js b/test/cases/optimize/many-exports-120/module.js new file mode 100644 index 00000000000..0005a20e660 --- /dev/null +++ b/test/cases/optimize/many-exports-120/module.js @@ -0,0 +1,121 @@ +export const x00 = "x00"; +export const x01 = "x01"; +export const x02 = "x02"; +export const x03 = "x03"; +export const x04 = "x04"; +export const x05 = "x05"; +export const x06 = "x06"; +export const x07 = "x07"; +export const x08 = "x08"; +export const x09 = "x09"; +export const x10 = "x10"; +export const x11 = "x11"; +export const x12 = "x12"; +export const x13 = "x13"; +export const x14 = "x14"; +export const x15 = "x15"; +export const x16 = "x16"; +export const x17 = "x17"; +export const x18 = "x18"; +export const x19 = "x19"; +export const x20 = "x20"; +export const x21 = "x21"; +export const x22 = "x22"; +export const x23 = "x23"; +export const x24 = "x24"; +export const x25 = "x25"; +export const x26 = "x26"; +export const x27 = "x27"; +export const x28 = "x28"; +export const x29 = "x29"; +export const x30 = "x30"; +export const x31 = "x31"; +export const x32 = "x32"; +export const x33 = "x33"; +export const x34 = "x34"; +export const x35 = "x35"; +export const x36 = "x36"; +export const x37 = "x37"; +export const x38 = "x38"; +export const x39 = "x39"; +export const x40 = "x40"; +export const x41 = "x41"; +export const x42 = "x42"; +export const x43 = "x43"; +export const x44 = "x44"; +export const x45 = "x45"; +export const x46 = "x46"; +export const x47 = "x47"; +export const x48 = "x48"; +export const x49 = "x49"; +export const x50 = "x50"; +export const x51 = "x51"; +export const x52 = "x52"; +export const x53 = "x53"; +export const x54 = "x54"; +export const x55 = "x55"; +export const x56 = "x56"; +export const x57 = "x57"; +export const x58 = "x58"; +export const x59 = "x59"; + +export const y00 = "y00"; +export const y01 = "y01"; +export const y02 = "y02"; +export const y03 = "y03"; +export const y04 = "y04"; +export const y05 = "y05"; +export const y06 = "y06"; +export const y07 = "y07"; +export const y08 = "y08"; +export const y09 = "y09"; +export const y10 = "y10"; +export const y11 = "y11"; +export const y12 = "y12"; +export const y13 = "y13"; +export const y14 = "y14"; +export const y15 = "y15"; +export const y16 = "y16"; +export const y17 = "y17"; +export const y18 = "y18"; +export const y19 = "y19"; +export const y20 = "y20"; +export const y21 = "y21"; +export const y22 = "y22"; +export const y23 = "y23"; +export const y24 = "y24"; +export const y25 = "y25"; +export const y26 = "y26"; +export const y27 = "y27"; +export const y28 = "y28"; +export const y29 = "y29"; +export const y30 = "y30"; +export const y31 = "y31"; +export const y32 = "y32"; +export const y33 = "y33"; +export const y34 = "y34"; +export const y35 = "y35"; +export const y36 = "y36"; +export const y37 = "y37"; +export const y38 = "y38"; +export const y39 = "y39"; +export const y40 = "y40"; +export const y41 = "y41"; +export const y42 = "y42"; +export const y43 = "y43"; +export const y44 = "y44"; +export const y45 = "y45"; +export const y46 = "y46"; +export const y47 = "y47"; +export const y48 = "y48"; +export const y49 = "y49"; +export const y50 = "y50"; +export const y51 = "y51"; +export const y52 = "y52"; +export const y53 = "y53"; +export const y54 = "y54"; +export const y55 = "y55"; +export const y56 = "y56"; +export const y57 = "y57"; +export const y58 = "y58"; +export const y59 = "y59"; diff --git a/test/cases/optimize/many-exports-40/chunk1.js b/test/cases/optimize/many-exports-40/chunk1.js new file mode 100644 index 00000000000..47e6e97e8ea --- /dev/null +++ b/test/cases/optimize/many-exports-40/chunk1.js @@ -0,0 +1,45 @@ +import { + x00, + x01, + x02, + x03, + x04, + x05, + x06, + x07, + x08, + x09, + x10, + x11, + x12, + x13, + x14, + x15, + x16, + x17, + x18, + x19 +} from "./module"; + +export default () => { + expect(x00).toBe("x00"); + expect(x01).toBe("x01"); + expect(x02).toBe("x02"); + expect(x03).toBe("x03"); + expect(x04).toBe("x04"); + expect(x05).toBe("x05"); + expect(x06).toBe("x06"); + expect(x07).toBe("x07"); + expect(x08).toBe("x08"); + expect(x09).toBe("x09"); + expect(x10).toBe("x10"); + expect(x11).toBe("x11"); + expect(x12).toBe("x12"); + expect(x13).toBe("x13"); + expect(x14).toBe("x14"); + expect(x15).toBe("x15"); + expect(x16).toBe("x16"); + expect(x17).toBe("x17"); + expect(x18).toBe("x18"); + expect(x19).toBe("x19"); +}; diff --git a/test/cases/optimize/many-exports-40/chunk2.js b/test/cases/optimize/many-exports-40/chunk2.js new file mode 100644 index 00000000000..e3d42307947 --- /dev/null +++ b/test/cases/optimize/many-exports-40/chunk2.js @@ -0,0 +1,45 @@ +import { + y00, + y01, + y02, + y03, + y04, + y05, + y06, + y07, + y08, + y09, + y10, + y11, + y12, + y13, + y14, + y15, + y16, + y17, + y18, + y19 +} from "./module"; + +export default () => { + expect(y00).toBe("y00"); + expect(y01).toBe("y01"); + expect(y02).toBe("y02"); + expect(y03).toBe("y03"); + expect(y04).toBe("y04"); + expect(y05).toBe("y05"); + expect(y06).toBe("y06"); + expect(y07).toBe("y07"); + expect(y08).toBe("y08"); + expect(y09).toBe("y09"); + expect(y10).toBe("y10"); + expect(y11).toBe("y11"); + expect(y12).toBe("y12"); + expect(y13).toBe("y13"); + expect(y14).toBe("y14"); + expect(y15).toBe("y15"); + expect(y16).toBe("y16"); + expect(y17).toBe("y17"); + expect(y18).toBe("y18"); + expect(y19).toBe("y19"); +}; diff --git a/test/cases/optimize/many-exports-40/index.js b/test/cases/optimize/many-exports-40/index.js new file mode 100644 index 00000000000..3e6aeb415b4 --- /dev/null +++ b/test/cases/optimize/many-exports-40/index.js @@ -0,0 +1,10 @@ +it("should mangle all exports correctly x", () => { + return import("./chunk1").then(({ default: test }) => { + test(); + }); +}); +it("should mangle all exports correctly y", () => { + return import("./chunk2").then(({ default: test }) => { + test(); + }); +}); diff --git a/test/cases/optimize/many-exports-40/module.js b/test/cases/optimize/many-exports-40/module.js new file mode 100644 index 00000000000..f5b86adb15f --- /dev/null +++ b/test/cases/optimize/many-exports-40/module.js @@ -0,0 +1,41 @@ +export const x00 = "x00"; +export const x01 = "x01"; +export const x02 = "x02"; +export const x03 = "x03"; +export const x04 = "x04"; +export const x05 = "x05"; +export const x06 = "x06"; +export const x07 = "x07"; +export const x08 = "x08"; +export const x09 = "x09"; +export const x10 = "x10"; +export const x11 = "x11"; +export const x12 = "x12"; +export const x13 = "x13"; +export const x14 = "x14"; +export const x15 = "x15"; +export const x16 = "x16"; +export const x17 = "x17"; +export const x18 = "x18"; +export const x19 = "x19"; + +export const y00 = "y00"; +export const y01 = "y01"; +export const y02 = "y02"; +export const y03 = "y03"; +export const y04 = "y04"; +export const y05 = "y05"; +export const y06 = "y06"; +export const y07 = "y07"; +export const y08 = "y08"; +export const y09 = "y09"; +export const y10 = "y10"; +export const y11 = "y11"; +export const y12 = "y12"; +export const y13 = "y13"; +export const y14 = "y14"; +export const y15 = "y15"; +export const y16 = "y16"; +export const y17 = "y17"; +export const y18 = "y18"; +export const y19 = "y19"; diff --git a/test/cases/optimize/side-effects-all-chain-unused/test.filter.js b/test/cases/optimize/side-effects-all-chain-unused/test.filter.js index 9022ab6415f..49ac5066bb8 100644 --- a/test/cases/optimize/side-effects-all-chain-unused/test.filter.js +++ b/test/cases/optimize/side-effects-all-chain-unused/test.filter.js @@ -1,3 +1,3 @@ -module.exports = function(config) { +module.exports = function (config) { return config.mode !== "development"; }; diff --git a/test/cases/optimize/side-effects-all-used/test.filter.js b/test/cases/optimize/side-effects-all-used/test.filter.js index 9022ab6415f..49ac5066bb8 100644 --- a/test/cases/optimize/side-effects-all-used/test.filter.js +++ b/test/cases/optimize/side-effects-all-used/test.filter.js @@ -1,3 +1,3 @@ -module.exports = function(config) { +module.exports = function (config) { return config.mode !== "development"; }; diff --git a/test/cases/optimize/side-effects-immediate-unused/test.filter.js b/test/cases/optimize/side-effects-immediate-unused/test.filter.js index 9022ab6415f..49ac5066bb8 100644 --- a/test/cases/optimize/side-effects-immediate-unused/test.filter.js +++ b/test/cases/optimize/side-effects-immediate-unused/test.filter.js @@ -1,3 +1,3 @@ -module.exports = function(config) { +module.exports = function (config) { return config.mode !== "development"; }; diff --git a/test/cases/optimize/side-effects-reexport-start-unknown/test.filter.js b/test/cases/optimize/side-effects-reexport-start-unknown/test.filter.js index 9022ab6415f..49ac5066bb8 100644 --- a/test/cases/optimize/side-effects-reexport-start-unknown/test.filter.js +++ b/test/cases/optimize/side-effects-reexport-start-unknown/test.filter.js @@ -1,3 +1,3 @@ -module.exports = function(config) { +module.exports = function (config) { return config.mode !== "development"; }; diff --git a/test/cases/optimize/side-effects-root-unused/test.filter.js b/test/cases/optimize/side-effects-root-unused/test.filter.js index 9022ab6415f..49ac5066bb8 100644 --- a/test/cases/optimize/side-effects-root-unused/test.filter.js +++ b/test/cases/optimize/side-effects-root-unused/test.filter.js @@ -1,3 +1,3 @@ -module.exports = function(config) { +module.exports = function (config) { return config.mode !== "development"; }; diff --git a/test/cases/optimize/side-effects-simple-unused/test.filter.js b/test/cases/optimize/side-effects-simple-unused/test.filter.js index 9022ab6415f..49ac5066bb8 100644 --- a/test/cases/optimize/side-effects-simple-unused/test.filter.js +++ b/test/cases/optimize/side-effects-simple-unused/test.filter.js @@ -1,3 +1,3 @@ -module.exports = function(config) { +module.exports = function (config) { return config.mode !== "development"; }; diff --git a/test/cases/optimize/side-effects-transitive-unused/test.filter.js b/test/cases/optimize/side-effects-transitive-unused/test.filter.js index 9022ab6415f..49ac5066bb8 100644 --- a/test/cases/optimize/side-effects-transitive-unused/test.filter.js +++ b/test/cases/optimize/side-effects-transitive-unused/test.filter.js @@ -1,3 +1,3 @@ -module.exports = function(config) { +module.exports = function (config) { return config.mode !== "development"; }; diff --git a/test/cases/parsing/api/id.js b/test/cases/parsing/api/id.js new file mode 100644 index 00000000000..853bd9aaad1 --- /dev/null +++ b/test/cases/parsing/api/id.js @@ -0,0 +1 @@ +export default __webpack_module__.id; diff --git a/test/cases/parsing/api/index.js b/test/cases/parsing/api/index.js new file mode 100644 index 00000000000..c8e0d9150fb --- /dev/null +++ b/test/cases/parsing/api/index.js @@ -0,0 +1,18 @@ +import id from "./id"; +import mod from "./module"; +import modType from "./typeof-module"; + +it("should support __webpack_module__.id", () => { + expect(typeof id).toMatch(/^(string|number)$/); + expect(id).not.toBe(__webpack_module__.id); +}); + +it("should support __webpack_module__", () => { + expect(mod.exports).toBeTypeOf("object"); + expect(typeof mod.id).toMatch(/^(string|number)$/); + expect(mod).not.toBe(__webpack_module__); +}); + +it("should support typeof __webpack_module__", () => { + expect(modType).toBe("object"); +}); diff --git a/test/cases/parsing/api/module.js b/test/cases/parsing/api/module.js new file mode 100644 index 00000000000..61171d82a9d --- /dev/null +++ b/test/cases/parsing/api/module.js @@ -0,0 +1 @@ +export default __webpack_module__; diff --git a/test/cases/parsing/api/typeof-module.js b/test/cases/parsing/api/typeof-module.js new file mode 100644 index 00000000000..1adb27f3e79 --- /dev/null +++ b/test/cases/parsing/api/typeof-module.js @@ -0,0 +1 @@ +export default typeof __webpack_module__; diff --git a/test/cases/parsing/asi/a.js b/test/cases/parsing/asi/a.js new file mode 100644 index 00000000000..3966c08a955 --- /dev/null +++ b/test/cases/parsing/asi/a.js @@ -0,0 +1,11 @@ +export function a() {} + +let count = 0; + +export function callme() { + count++; +} + +export function getCount() { + return count; +} diff --git a/test/cases/parsing/asi/b.json b/test/cases/parsing/asi/b.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/test/cases/parsing/asi/b.json @@ -0,0 +1 @@ +{} diff --git a/test/cases/parsing/asi/index.js b/test/cases/parsing/asi/index.js new file mode 100644 index 00000000000..d1fab7e4954 --- /dev/null +++ b/test/cases/parsing/asi/index.js @@ -0,0 +1,48 @@ +import {a as b, callme, getCount} from "./a"; +import * as c from "./b"; + +function donotcallme() { + expect("asi unsafe call happened").toBe(false); +} + +it("should respect asi flag", () => { + (donotcallme) + import.meta; + (donotcallme) + b(); + (donotcallme) + c; + + var i = 0 + for (;i < 10;i++) callme() + var i = 0 + for (;i < 10;(function() { + i++ + })()) callme() + var i = 0 + for (;i < 2;i++) { + (donotcallme) + b(); + } + var i = 0 + if (i++) callme() + var i = 1 + if (i) + (donotcallme) + else + callme() + var i = 0 + while (i++ < 4) callme() + do (donotcallme) + while (i++ < 4) callme() + var i = 0 + while (i++ < 4) (function () { + var i = 4 + return callme() + })() + + ;(donotcallme) + require("./b.json").prop + + expect(getCount()).toBe(29) +}); diff --git a/test/cases/parsing/asi/warnings.js b/test/cases/parsing/asi/warnings.js new file mode 100644 index 00000000000..39b26d59cff --- /dev/null +++ b/test/cases/parsing/asi/warnings.js @@ -0,0 +1 @@ +module.exports = [[/Critical dependency: Accessing import\.meta/]]; diff --git a/test/cases/parsing/block-scopes/index.js b/test/cases/parsing/block-scopes/index.js new file mode 100644 index 00000000000..127ea210e0f --- /dev/null +++ b/test/cases/parsing/block-scopes/index.js @@ -0,0 +1,85 @@ +import ok from "./module"; + +// This should not leak an "ok" declaration into this scope +export default (function ok() {}); + +it("should allow block scopes", () => { + expect(ok).toBe("ok"); + if (true) { + const ok = "no"; + expect(ok).toBe("no"); + } + expect(ok).toBe("ok"); + { + let ok = "no"; + expect(ok).toBe("no"); + } + expect(ok).toBe("ok"); + { + class ok {} + expect(new ok()).toBeInstanceOf(ok); + } + expect(ok).toBe("ok"); + for (let ok = "no", once = true; once; once = !once) { + expect(ok).toBe("no"); + } + expect(ok).toBe("ok"); + for (const ok of ["no"]) { + expect(ok).toBe("no"); + } + expect(ok).toBe("ok"); + for (const ok in { no: 1 }) { + expect(ok).toBe("no"); + } + expect(ok).toBe("ok"); + try { + throw "no"; + } catch (ok) { + expect(ok).toBe("no"); + } + expect(ok).toBe("ok"); + while (ok) { + expect(ok).toBe("ok"); + break; + } + do { + expect(ok).toBe("ok"); + break; + } while(ok); + expect(ok).toBe("ok"); +}); + +it("should allow function scopes in block scopes", () => { + let f; + { + f = () => { + expect(ok).toBe("no"); + }; + const ok = "no"; + } + f(); +}); + +it("should not block scope vars (for)", () => { + expect(ok).toBe(undefined); + for (var ok = "no", once = true; once; once = !once) { + expect(ok).toBe("no"); + } + expect(ok).toBe("no"); +}); + +it("should not block scope vars (for-of)", () => { + expect(ok).toBe(undefined); + for (var ok of ["no"]) { + expect(ok).toBe("no"); + } + expect(ok).toBe("no"); +}); + +it("should not block scope vars (for-in)", () => { + expect(ok).toBe(undefined); + for (var ok in { no: 1 }) { + expect(ok).toBe("no"); + } + expect(ok).toBe("no"); +}); diff --git a/test/cases/parsing/block-scopes/module.js b/test/cases/parsing/block-scopes/module.js new file mode 100644 index 00000000000..5c6b89abfc8 --- /dev/null +++ b/test/cases/parsing/block-scopes/module.js @@ -0,0 +1 @@ +export default "ok"; diff --git a/test/cases/parsing/bom/index.js b/test/cases/parsing/bom/index.js index f7d590e9d54..007b2dc22d8 100644 --- a/test/cases/parsing/bom/index.js +++ b/test/cases/parsing/bom/index.js @@ -1,14 +1,14 @@ -it("should load a utf-8 file with BOM", function() { +it("should load a utf-8 file with BOM", function () { var result = require("./bomfile"); expect(result).toEqual("ok"); }); -it("should load a css file with BOM", function() { - var css = require("!css-loader!./bomfile.css") + ""; - expect(css).toBe("body{color:#abc}"); +it("should load a css file with BOM", function () { + var css = require("!css-loader!./bomfile.css").default + ""; + expect(css.replace(/\n\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/gm, '$1')).toBe("body{color:#abc}"); }); -it("should load a json file with BOM", function() { +it("should load a json file with BOM", function () { var result = require("./bomfile.json"); expect(result.message).toEqual("ok"); }); diff --git a/test/cases/parsing/chunks/test.filter.js b/test/cases/parsing/chunks/test.filter.js index b4b5c42560c..9cf8a63f9b6 100644 --- a/test/cases/parsing/chunks/test.filter.js +++ b/test/cases/parsing/chunks/test.filter.js @@ -1,5 +1,5 @@ -var supportsES6 = require("../../../helpers/supportsES6"); +const supportsES6 = require("../../../helpers/supportsES6"); -module.exports = function(config) { - return !config.minimize && supportsES6(); +module.exports = function (config) { + return supportsES6(); }; diff --git a/test/cases/parsing/class-properties/index.js b/test/cases/parsing/class-properties/index.js new file mode 100644 index 00000000000..e81488eac65 --- /dev/null +++ b/test/cases/parsing/class-properties/index.js @@ -0,0 +1,21 @@ +import { A, B } from "./module"; +import { A as A1, B as B1 } from "./module?1"; + +it("should not rename class properties", function () { + expect(A.staticProp).toBe("value"); + expect(B.staticProp).toBe("value"); + expect(A1.staticProp).toBe("value"); + expect(B1.staticProp).toBe("value"); + expect(A.value).toBe("value"); + expect(B.value).toBe("value"); + expect(A1.value).toBe("value"); + expect(B1.value).toBe("value"); + expect(new A().prop).toBe("value"); + expect(new B().prop).toBe("value"); + expect(new A1().prop).toBe("value"); + expect(new B1().prop).toBe("value"); + expect(new A().value).toBe("value"); + expect(new B().value).toBe("value"); + expect(new A1().value).toBe("value"); + expect(new B1().value).toBe("value"); +}); diff --git a/test/cases/parsing/class-properties/module.js b/test/cases/parsing/class-properties/module.js new file mode 100644 index 00000000000..8736c7ca191 --- /dev/null +++ b/test/cases/parsing/class-properties/module.js @@ -0,0 +1,21 @@ +import { + staticProp as importedStaticProp, + prop as importedProp +} from "./module"; + +export const staticProp = "value"; +export const prop = "value"; + +export class A { + static staticProp = staticProp; + static [staticProp] = staticProp; + prop = prop; + [prop] = prop; +} + +export class B { + static staticProp = importedStaticProp; + static [importedStaticProp] = importedStaticProp; + prop = importedProp; + [importedProp] = importedProp; +} diff --git a/test/cases/parsing/class-properties/test.filter.js b/test/cases/parsing/class-properties/test.filter.js new file mode 100644 index 00000000000..b9bdf244d0d --- /dev/null +++ b/test/cases/parsing/class-properties/test.filter.js @@ -0,0 +1,5 @@ +const supportsClassFields = require("../../../helpers/supportsClassFields"); + +module.exports = function (config) { + return supportsClassFields(); +}; diff --git a/test/cases/parsing/class/test.filter.js b/test/cases/parsing/class/test.filter.js index b4b5c42560c..9cf8a63f9b6 100644 --- a/test/cases/parsing/class/test.filter.js +++ b/test/cases/parsing/class/test.filter.js @@ -1,5 +1,5 @@ -var supportsES6 = require("../../../helpers/supportsES6"); +const supportsES6 = require("../../../helpers/supportsES6"); -module.exports = function(config) { - return !config.minimize && supportsES6(); +module.exports = function (config) { + return supportsES6(); }; diff --git a/test/cases/parsing/complex-require/test.filter.js b/test/cases/parsing/complex-require/test.filter.js index 3e4c5ba3e50..0fbdba4ea2d 100644 --- a/test/cases/parsing/complex-require/test.filter.js +++ b/test/cases/parsing/complex-require/test.filter.js @@ -1,5 +1,5 @@ -var supportsTemplateStrings = require("../../../helpers/supportsTemplateStrings"); +const supportsTemplateStrings = require("../../../helpers/supportsTemplateStrings"); -module.exports = function(config) { - return !config.minimize && supportsTemplateStrings(); +module.exports = function (config) { + return supportsTemplateStrings(); }; diff --git a/test/cases/parsing/context/errors.js b/test/cases/parsing/context/errors.js new file mode 100644 index 00000000000..ab18d4d5490 --- /dev/null +++ b/test/cases/parsing/context/errors.js @@ -0,0 +1,7 @@ +module.exports = [ + [ + /Module parse failed/, + { moduleName: /dump-file\.txt/ }, + { moduleTrace: /templates\/ sync/ } + ] +]; diff --git a/test/cases/parsing/context/index.js b/test/cases/parsing/context/index.js index 59d7ff9669d..c2bbbc43eef 100644 --- a/test/cases/parsing/context/index.js +++ b/test/cases/parsing/context/index.js @@ -5,7 +5,7 @@ it("should be able to load a file with the require.context method", function() { expect(require.context("./loaders/queryloader?dog=bark!./templates?cat=meow")("./tmpl")).toEqual({ resourceQuery: "?cat=meow", query: "?dog=bark", - prev: "module.exports = \"test template\";" + prev: 'module.exports = "test template";' }); expect(require . context ( "." + "/." + "/" + "templ" + "ates" ) ( "./subdir/tmpl.js" )).toBe("subdir test template"); expect(require.context("./templates", true, /./)("xyz")).toBe("xyz"); @@ -20,15 +20,15 @@ it("should automatically create contexts", function() { expect(require("./templates/t" + mp + "l")).toBe("test template"); }); -it("should be able to require.resolve with automatical context", function() { +it("should be able to require.resolve with automatic context", function() { var template = "tmpl"; - expect(require.resolve("./templates/" + template)).toBe(require.resolve("./templates/tmpl")); + expect(require.resolve("./templates/" + template)).toBe( + require.resolve("./templates/tmpl") + ); }); it("should be able to use renaming combined with a context", function() { var renamedRequire = require; - require = function () {}; - require("fail"); var template = "tmpl"; expect(renamedRequire("./templates/" + template)).toBe("test template"); }); diff --git a/test/cases/parsing/context/infrastructure-log.js b/test/cases/parsing/context/infrastructure-log.js new file mode 100644 index 00000000000..e458f85280b --- /dev/null +++ b/test/cases/parsing/context/infrastructure-log.js @@ -0,0 +1,3 @@ +module.exports = [ + /^Pack got invalid because of write to: Compilation\/modules|.+dump-file\.txt/ +]; diff --git a/test/cases/parsing/context/loaders/queryloader.js b/test/cases/parsing/context/loaders/queryloader.js index 02707b2ba37..f9bb23e1f55 100644 --- a/test/cases/parsing/context/loaders/queryloader.js +++ b/test/cases/parsing/context/loaders/queryloader.js @@ -1,7 +1,11 @@ -module.exports = function(content) { - return "module.exports = " + JSON.stringify({ - resourceQuery: this.resourceQuery, - query: this.query, - prev: content - }); +/** @type {import("../../../../../").LoaderDefinition} */ +module.exports = function (content) { + return ( + "module.exports = " + + JSON.stringify({ + resourceQuery: this.resourceQuery, + query: this.query, + prev: content + }) + ); }; diff --git a/test/cases/parsing/context/warnings.js b/test/cases/parsing/context/warnings.js index 09e32b8657c..695381d6862 100644 --- a/test/cases/parsing/context/warnings.js +++ b/test/cases/parsing/context/warnings.js @@ -1,6 +1,5 @@ module.exports = [ - [/Module parse failed/, /dump-file\.txt/, /templates sync \^\\\.\\\/\.\*\$/], - [/Critical dependency/, /templateLoader\.js/], - [/Critical dependency/, /templateLoaderIndirect\.js/], - [/Critical dependency/, /templateLoaderIndirect\.js/], + [/Critical dependency/, { moduleName: /templateLoader\.js/ }], + [/Critical dependency/, { moduleName: /templateLoaderIndirect\.js/ }], + [/Critical dependency/, { moduleName: /templateLoaderIndirect\.js/ }] ]; diff --git a/test/cases/parsing/declared-api/index.js b/test/cases/parsing/declared-api/index.js new file mode 100644 index 00000000000..520779abbb0 --- /dev/null +++ b/test/cases/parsing/declared-api/index.js @@ -0,0 +1,3 @@ +it("should not replace declared variables", () => { + expect(require("./module")).toBe(42 + 42); +}); diff --git a/test/cases/parsing/declared-api/module.js b/test/cases/parsing/declared-api/module.js new file mode 100644 index 00000000000..8cbf2f878fc --- /dev/null +++ b/test/cases/parsing/declared-api/module.js @@ -0,0 +1,11 @@ +define("local", () => { + var __webpack_modules__ = 42; + + return __webpack_modules__; +}); + +define(["local"], l => { + var __webpack_modules__ = 42 + l; + + return __webpack_modules__; +}); diff --git a/test/cases/parsing/es2020/index.js b/test/cases/parsing/es2020/index.js new file mode 100644 index 00000000000..50e196c8d76 --- /dev/null +++ b/test/cases/parsing/es2020/index.js @@ -0,0 +1,38 @@ +import { a } from "./module"; + +class Class { + #field = this instanceof Class ? a : false; + field = this instanceof Class ? a : false; + #method = () => (this instanceof Class ? a : false); + method = () => (this instanceof Class ? a : false); + [`key${!this ? a : false}`] = this instanceof Class ? a : false; + + static CLASS = true; + + static #sfield = this.CLASS ? a : false; + static sfield = this.CLASS ? a : false; + static #smethod = () => (this.CLASS ? a : false); + static smethod = () => (this.CLASS ? a : false); + static [`skey${!this ? a : false}`] = this.CLASS ? a : false; + + test() { + expect(this.#field).toBe(42); + expect(this.field).toBe(42); + expect(this.#method()).toBe(42); + expect(this.method()).toBe(42); + expect(this.key42).toBe(42); + } + + static stest() { + expect(Class.#sfield).toBe(42); + expect(Class.sfield).toBe(42); + expect(Class.#smethod()).toBe(42); + expect(Class.smethod()).toBe(42); + expect(Class.skey42).toBe(42); + } +} + +it("should support class fields", () => { + Class.stest(); + new Class().test(); +}); diff --git a/test/cases/parsing/es2020/module.js b/test/cases/parsing/es2020/module.js new file mode 100644 index 00000000000..71becd3a350 --- /dev/null +++ b/test/cases/parsing/es2020/module.js @@ -0,0 +1 @@ +export const a = 42; diff --git a/test/cases/parsing/es2020/test.filter.js b/test/cases/parsing/es2020/test.filter.js new file mode 100644 index 00000000000..b9bdf244d0d --- /dev/null +++ b/test/cases/parsing/es2020/test.filter.js @@ -0,0 +1,5 @@ +const supportsClassFields = require("../../../helpers/supportsClassFields"); + +module.exports = function (config) { + return supportsClassFields(); +}; diff --git a/test/cases/parsing/es2022/counter.js b/test/cases/parsing/es2022/counter.js new file mode 100644 index 00000000000..0381a299e8d --- /dev/null +++ b/test/cases/parsing/es2022/counter.js @@ -0,0 +1,5 @@ +let value = 0; +let value2 = 5; +const add = () => value++; + +export { value, add, value2 as "test name" } diff --git a/test/cases/parsing/es2022/es2022.js b/test/cases/parsing/es2022/es2022.js new file mode 100644 index 00000000000..321a10e4bd3 --- /dev/null +++ b/test/cases/parsing/es2022/es2022.js @@ -0,0 +1,24 @@ +import { "\0 add" as add, "string name" as variable } from './reexport'; + +export default class Foo { + static { + new Foo(add); + } + + constructor(fn) { + this.#foo = fn; + this.#add(); + } + + #foo = undefined; + + #add() { + if (#foo in this && this.#foo) { + this.#foo(); + } + } + + static getVar() { + return variable; + } +} diff --git a/test/cases/parsing/es2022/in.js b/test/cases/parsing/es2022/in.js new file mode 100644 index 00000000000..4108243480b --- /dev/null +++ b/test/cases/parsing/es2022/in.js @@ -0,0 +1,11 @@ +export default class C { + #x; + constructor(x) { + this.#x = x; + } + static getX(obj) { + if (#x in obj) return obj.#x; + + return "obj must be an instance of C"; + } +} diff --git a/test/cases/parsing/es2022/index.js b/test/cases/parsing/es2022/index.js new file mode 100644 index 00000000000..be903b868ef --- /dev/null +++ b/test/cases/parsing/es2022/index.js @@ -0,0 +1,13 @@ +import { value, add } from "./counter"; +import Foo from "./es2022"; +import C from "./in"; +import { "string name" as alias } from "./name"; + +it("should compile and run", () => { + new Foo(add); + expect(value).toBe(2); + const c = new C(1); + expect(C.getX(c)).toBe(1) + expect(alias).toBe("test") + expect(Foo.getVar()).toBe(5) +}); diff --git a/test/cases/parsing/es2022/name.js b/test/cases/parsing/es2022/name.js new file mode 100644 index 00000000000..7c61a5c6d55 --- /dev/null +++ b/test/cases/parsing/es2022/name.js @@ -0,0 +1,3 @@ +const variable1 = "test"; + +export { variable1 as "string name" }; diff --git a/test/cases/parsing/es2022/reexport.js b/test/cases/parsing/es2022/reexport.js new file mode 100644 index 00000000000..422e14c617a --- /dev/null +++ b/test/cases/parsing/es2022/reexport.js @@ -0,0 +1 @@ +export { add as "\0 add", "test name" as "string name" } from "./counter"; diff --git a/test/cases/parsing/es2022/test.filter.js b/test/cases/parsing/es2022/test.filter.js new file mode 100644 index 00000000000..38c3136db5a --- /dev/null +++ b/test/cases/parsing/es2022/test.filter.js @@ -0,0 +1,11 @@ +module.exports = function (config) { + // terser doesn't support static {} + if (config.mode === "production") return false; + + try { + eval("class A { static {} }"); + return true; + } catch { + return false; + } +}; diff --git a/test/cases/parsing/es6.nominimize/index.js b/test/cases/parsing/es6.nominimize/index.js index 70031b4cad6..8fc415c51e0 100644 --- a/test/cases/parsing/es6.nominimize/index.js +++ b/test/cases/parsing/es6.nominimize/index.js @@ -2,7 +2,7 @@ import a from "./a"; -it("should parse classes", function() { +it("should parse classes", function () { class MyClass { constructor() { this.a = require("./a"); @@ -24,30 +24,32 @@ it("should parse classes", function() { expect(x.c()).toBe("c"); }); -it("should parse spread operator"/*, function() { +it("should parse spread operator", function () { expect([0, ...require("./array")]).toEqual([0, 1, 2, 3]); - expect(({z: 0, ...require("./object")})).toEqual({z: 0, a: 1, b: 2, c: 3}); -}*/); + expect({ z: 0, ...require("./object") }).toEqual({ z: 0, a: 1, b: 2, c: 3 }); +}); -it("should parse arrow function", function() { +it("should parse arrow function", function () { expect((() => require("./a"))()).toBe("a"); - expect((() => { - return require("./a"); - })()).toBe("a"); + expect( + (() => { + return require("./a"); + })() + ).toBe("a"); require.ensure([], () => { require("./a"); }); require.ensure([], () => { require("./async"); }); - if(module.hot) { + if (module.hot) { module.hot.accept("./a", () => { var x = 1; }); } }); -it("should parse template literals", function() { +it("should parse template literals", function () { function tag(strings, value) { return value; } @@ -55,9 +57,9 @@ it("should parse template literals", function() { var y = tag`a${require("./b")}c`; expect(x).toBe("abc"); expect(y).toBe("b"); -}) +}); -it("should parse generators and yield", function() { +it("should parse generators and yield", function () { function* gen() { yield require("./a"); yield require("./b"); @@ -66,4 +68,4 @@ it("should parse generators and yield", function() { expect(x.next().value).toBe("a"); expect(x.next().value).toBe("b"); expect(x.next().done).toBe(true); -}) +}); diff --git a/test/cases/parsing/es6.nominimize/test.filter.js b/test/cases/parsing/es6.nominimize/test.filter.js index b4b5c42560c..7d7636a7748 100644 --- a/test/cases/parsing/es6.nominimize/test.filter.js +++ b/test/cases/parsing/es6.nominimize/test.filter.js @@ -1,5 +1,5 @@ var supportsES6 = require("../../../helpers/supportsES6"); -module.exports = function(config) { - return !config.minimize && supportsES6(); +module.exports = function (config) { + return supportsES6(); }; diff --git a/test/cases/parsing/evaluate-nullish/index.js b/test/cases/parsing/evaluate-nullish/index.js new file mode 100644 index 00000000000..128a96c8e52 --- /dev/null +++ b/test/cases/parsing/evaluate-nullish/index.js @@ -0,0 +1,12 @@ +function a() {} + +it("should evaluate nullish coalescing", function () { + expect("" ?? require("fail")).toBe(""); + expect(String.raw`aaaa` ?? require("fail")).toBe("aaaa"); + expect(a`aaaa` ?? "expected").toBe("expected"); + expect(null ?? "expected").toBe("expected"); + expect(("" ?? require("fail")) && true).toBe(""); + let x = 0; + expect(((x = 1), null) ?? true).toBe(true); + expect(x).toBe(1); +}); diff --git a/test/cases/parsing/evaluate-nullish/test.filter.js b/test/cases/parsing/evaluate-nullish/test.filter.js new file mode 100644 index 00000000000..90bebcad9fe --- /dev/null +++ b/test/cases/parsing/evaluate-nullish/test.filter.js @@ -0,0 +1,5 @@ +const supportsNullishCoalescing = require("../../../helpers/supportsNullishCoalescing"); + +module.exports = function (config) { + return supportsNullishCoalescing(); +}; diff --git a/test/cases/parsing/evaluate/index.js b/test/cases/parsing/evaluate/index.js index 04ace9ffa11..e29a31fb622 100644 --- a/test/cases/parsing/evaluate/index.js +++ b/test/cases/parsing/evaluate/index.js @@ -1,17 +1,36 @@ -it("should evaluate null", function() { - var y = null ? require("fail") : require("./a"); - if(null) - require("fail"); +it("should evaluate null", function () { + const y = null ? require("fail") : require("./a"); + if (null) require("fail"); +}); + +it("should evaluate undefined", function () { + const y = undefined ? require("fail") : require("./a"); + if (undefined) require("fail"); + undefined && require("fail"); }); -it("should evaluate logical expression", function() { - var value1 = "hello" || require("fail"); - var value2 = typeof require === "function" || require("fail"); - var value3 = "" && require("fail"); - var value4 = typeof require !== "function" && require("fail"); - var value5 = "hello" && (() => "value5")(); - var value6 = "" || (() => "value6")(); - var value7 = (function () { return'value7'===typeof 'value7'&&'value7'})(); +it("should evaluate logical expression", function () { + const value1 = "hello" || require("fail"); + const value2 = typeof require === "function" || require("fail"); + const value3 = "" && require("fail"); + const value4 = typeof require !== "function" && require("fail"); + const value5 = "hello" && (() => "value5")(); + const value6 = "" || (() => "value6")(); + const value7 = (function () { return'value7'===typeof 'value7'&&'value7'})(); + const value8 = [] != [] || require("fail"); + const value9 = null === 1 && require("fail"); + const value91 = [] === [] && require("fail"); + const value92 = /a/ === /a/ && require("fail"); + const value93 = + `hello${Math.random()}` === `world${Math.random()}` && require("fail"); + const value94 = + `${Math.random()}hello` != `${Math.random()}world` || require("fail"); + let value95 = 1; + const value96 = `${value95++}hello` != `${value95++}world` || require("fail"); + + if (`${value95++}hello` === `${value95++}world`) { + require("fail"); + } expect(value1).toBe("hello"); expect(value2).toBe(true); @@ -20,21 +39,63 @@ it("should evaluate logical expression", function() { expect(value5).toBe("value5"); expect(value6).toBe("value6"); expect(value7).toBe(false); + expect(value8).toBe(true); + expect(value9).toBe(false); + expect(value91).toBe(false); + expect(value92).toBe(false); + expect(value93).toBe(false); + expect(value94).toBe(true); + expect(value95).toBe(5); + expect(value96).toBe(true); }); -if("shouldn't evaluate expression", function() { - var value = ""; - var x = (value + "") ? "fail" : "ok"; +it("shouldn't evaluate expression", function () { + const value = ""; + const x = value + "" ? "fail" : "ok"; expect(x).toBe("ok"); }); -it("should short-circuit evaluating", function() { - var expr; - var a = false && expr ? require("fail") : require("./a"); - var b = true || expr ? require("./a") : require("fail"); +it("should short-circuit evaluating", function () { + let expr; + const a = false && expr ? require("fail") : require("./a"); + const b = true || expr ? require("./a") : require("fail"); }); -it("should evaluate __dirname and __resourceQuery with replace and substr", function() { - var result = require("./resourceQuery/index?" + __dirname); +it("should evaluate __dirname and __resourceQuery with replace and substr", function () { + const result = require("./resourceQuery/index?" + __dirname); expect(result).toEqual("?resourceQuery"); }); + +it("should evaluate __dirname and __resourceFragment with replace and substr", function () { + const result = require("./resourceFragment/index#" + __dirname); + expect(result).toEqual("#resourceFragment"); +}); + +it("should allow resourceFragment in context", function () { + const fn = x => require(`./resourceFragment/${x}#..`); + expect(fn("index")).toEqual("#resourceFragment"); + expect(fn("returnRF")).toBe("#.."); +}); + +it("should try to evaluate new RegExp()", function () { + function expectAOnly (r) { + r.keys().forEach(key => { + expect(r(key)).toBe(1); + }); + } + + expectAOnly( + require.context("./regexp", false, new RegExp("(? { + const RegExp = function() { return /other/; }; + expect(require("./regexp/" + ("a".replace(new RegExp("a"), "wrong")))).toBe(1); +}); diff --git a/test/cases/parsing/evaluate/regexp/a.filtered.js b/test/cases/parsing/evaluate/regexp/a.filtered.js new file mode 100644 index 00000000000..4bbffde1044 --- /dev/null +++ b/test/cases/parsing/evaluate/regexp/a.filtered.js @@ -0,0 +1 @@ +module.exports = 2; diff --git a/test/cases/parsing/evaluate/regexp/a.js b/test/cases/parsing/evaluate/regexp/a.js new file mode 100644 index 00000000000..bd816eaba4c --- /dev/null +++ b/test/cases/parsing/evaluate/regexp/a.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/test/cases/parsing/evaluate/resourceFragment/index.js b/test/cases/parsing/evaluate/resourceFragment/index.js new file mode 100644 index 00000000000..cf443cdc4e6 --- /dev/null +++ b/test/cases/parsing/evaluate/resourceFragment/index.js @@ -0,0 +1,3 @@ +module.exports = require(( + __resourceFragment.slice(1) + "/resourceFragment/returnRF#XXXFragment" +).replace(/XXX/g, "resource")); diff --git a/test/cases/parsing/evaluate/resourceFragment/returnRF.js b/test/cases/parsing/evaluate/resourceFragment/returnRF.js new file mode 100644 index 00000000000..db1d8aa62e7 --- /dev/null +++ b/test/cases/parsing/evaluate/resourceFragment/returnRF.js @@ -0,0 +1 @@ +module.exports = __resourceFragment; diff --git a/test/cases/parsing/evaluate/resourceQuery/index.js b/test/cases/parsing/evaluate/resourceQuery/index.js index 21596f97369..173f9da8dfd 100644 --- a/test/cases/parsing/evaluate/resourceQuery/index.js +++ b/test/cases/parsing/evaluate/resourceQuery/index.js @@ -1 +1 @@ -module.exports = require((__resourceQuery.substr(1) + "/resourceQuery/returnRQ?XXXQuery").replace(/XXX/g, "resource")); \ No newline at end of file +module.exports = require((__resourceQuery.slice(1) + "/resourceQuery/returnRQ?XXXQuery").replace(/XXX/g, "resource")); diff --git a/test/cases/parsing/extract-amd.nominimize/index.js b/test/cases/parsing/extract-amd.nominimize/index.js index a79383e0026..3bfc3fa2749 100644 --- a/test/cases/parsing/extract-amd.nominimize/index.js +++ b/test/cases/parsing/extract-amd.nominimize/index.js @@ -17,7 +17,7 @@ it("should parse fancy function calls with arrow functions", function() { it("should parse fancy AMD calls with arrow functions", function() { require("./constructor ./a".split(" ")); - require("-> module module exports *constructor *a".replace("module", "require").substr(3).replace(/\*/g, "./").split(" "), (require, module, exports, constructor, a) => { + require("-> module module exports *constructor *a".replace("module", "require").slice(3).replace(/\*/g, "./").split(" "), (require, module, exports, constructor, a) => { expect((typeof require)).toBe("function"); expect((typeof module)).toBe("object"); expect((typeof exports)).toBe("object"); @@ -25,7 +25,7 @@ it("should parse fancy AMD calls with arrow functions", function() { expect((typeof constructor)).toBe("function"); expect(a).toBe("a"); }); - define("-> module module exports *constructor *a".replace("module", "require").substr(3).replace(/\*/g, "./").split(" "), (require, module, exports, constructor, a) => { + define("-> module module exports *constructor *a".replace("module", "require").slice(3).replace(/\*/g, "./").split(" "), (require, module, exports, constructor, a) => { expect((typeof require)).toBe("function"); expect((typeof module)).toBe("object"); expect((typeof exports)).toBe("object"); diff --git a/test/cases/parsing/extract-amd.nominimize/test.filter.js b/test/cases/parsing/extract-amd.nominimize/test.filter.js index b4b5c42560c..7d7636a7748 100644 --- a/test/cases/parsing/extract-amd.nominimize/test.filter.js +++ b/test/cases/parsing/extract-amd.nominimize/test.filter.js @@ -1,5 +1,5 @@ var supportsES6 = require("../../../helpers/supportsES6"); -module.exports = function(config) { - return !config.minimize && supportsES6(); +module.exports = function (config) { + return supportsES6(); }; diff --git a/test/cases/parsing/extract-amd.nominimize/warnings.js b/test/cases/parsing/extract-amd.nominimize/warnings.js index f50952cb6c2..aa20932a1d3 100644 --- a/test/cases/parsing/extract-amd.nominimize/warnings.js +++ b/test/cases/parsing/extract-amd.nominimize/warnings.js @@ -1,3 +1,3 @@ module.exports = [ - [/Module not found/, /Can't resolve '\.\/b' /, /b\.js/] + [/Module not found/, /Can't resolve '\.\/b' /, {details: /b\.js/}] ]; diff --git a/test/cases/parsing/extract-amd/index.js b/test/cases/parsing/extract-amd/index.js index 13cc0d3f047..39822b5b9eb 100644 --- a/test/cases/parsing/extract-amd/index.js +++ b/test/cases/parsing/extract-amd/index.js @@ -17,7 +17,7 @@ it("should parse fancy function calls", function() { it("should parse fancy AMD calls", function() { require("./constructor ./a".split(" ")); - require("-> module module exports *constructor *a".replace("module", "require").substr(3).replace(/\*/g, "./").split(" "), function(require, module, exports, constructor, a) { + require("-> module module exports *constructor *a".replace("module", "require").slice(3).replace(/\*/g, "./").split(" "), function(require, module, exports, constructor, a) { expect((typeof require)).toBe("function"); expect((typeof module)).toBe("object"); expect((typeof exports)).toBe("object"); @@ -25,7 +25,7 @@ it("should parse fancy AMD calls", function() { expect((typeof constructor)).toBe("function"); expect(a).toBe("a"); }); - define("-> module module exports *constructor *a".replace("module", "require").substr(3).replace(/\*/g, "./").split(" "), function(require, module, exports, constructor, a) { + define("-> module module exports *constructor *a".replace("module", "require").slice(3).replace(/\*/g, "./").split(" "), function(require, module, exports, constructor, a) { expect((typeof require)).toBe("function"); expect((typeof module)).toBe("object"); expect((typeof exports)).toBe("object"); diff --git a/test/cases/parsing/extract-amd/warnings.js b/test/cases/parsing/extract-amd/warnings.js index f50952cb6c2..418492a70f6 100644 --- a/test/cases/parsing/extract-amd/warnings.js +++ b/test/cases/parsing/extract-amd/warnings.js @@ -1,3 +1,3 @@ module.exports = [ - [/Module not found/, /Can't resolve '\.\/b' /, /b\.js/] + [/Module not found/, /Can't resolve '\.\/b' /, { details: /b\.js/ }] ]; diff --git a/test/cases/parsing/extract-require/errors.js b/test/cases/parsing/extract-require/errors.js index 546b7b0e0d0..cb2596c1104 100644 --- a/test/cases/parsing/extract-require/errors.js +++ b/test/cases/parsing/extract-require/errors.js @@ -1,3 +1,7 @@ module.exports = [ - [/Module not found/, /Can't resolve '\.\/missingModule' /, /extract-require\/index.js/] -]; \ No newline at end of file + [ + /Module not found/, + /Can't resolve '\.\/missingModule' /, + { moduleName: /extract-require\/index.js/ } + ] +]; diff --git a/test/cases/parsing/harmony-circular-star-reexport/a.js b/test/cases/parsing/harmony-circular-star-reexport/a.js new file mode 100644 index 00000000000..30b80e3ad6f --- /dev/null +++ b/test/cases/parsing/harmony-circular-star-reexport/a.js @@ -0,0 +1,2 @@ +export * from "./c"; +export const a = "a"; diff --git a/test/cases/parsing/harmony-circular-star-reexport/b.js b/test/cases/parsing/harmony-circular-star-reexport/b.js new file mode 100644 index 00000000000..87071dcdfde --- /dev/null +++ b/test/cases/parsing/harmony-circular-star-reexport/b.js @@ -0,0 +1,2 @@ +export * from "./a"; +export const b = "b"; diff --git a/test/cases/parsing/harmony-circular-star-reexport/c.js b/test/cases/parsing/harmony-circular-star-reexport/c.js new file mode 100644 index 00000000000..516ea7f8834 --- /dev/null +++ b/test/cases/parsing/harmony-circular-star-reexport/c.js @@ -0,0 +1,2 @@ +export * from "./b"; +export const c = "c"; diff --git a/test/cases/parsing/harmony-circular-star-reexport/index.js b/test/cases/parsing/harmony-circular-star-reexport/index.js new file mode 100644 index 00000000000..2f8b0d40433 --- /dev/null +++ b/test/cases/parsing/harmony-circular-star-reexport/index.js @@ -0,0 +1,11 @@ +import * as all from "./c"; + +it("should contain all exports", () => { + expect(all).toEqual( + nsObj({ + a: "a", + b: "b", + c: "c" + }) + ); +}); diff --git a/test/cases/parsing/harmony-commonjs-mix/module1.js b/test/cases/parsing/harmony-commonjs-mix/module1.js index aa3681a495c..45bb8d02e35 100644 --- a/test/cases/parsing/harmony-commonjs-mix/module1.js +++ b/test/cases/parsing/harmony-commonjs-mix/module1.js @@ -14,6 +14,6 @@ expect(function() { export default 1234; if(eval("typeof exports !== \"undefined\"")) { - // exports is node.js exports and not webpacks + // exports is node.js exports and not webpack's expect(Object.keys(exports)).toEqual([]); } diff --git a/test/cases/parsing/harmony-deep-exports/cjs.js b/test/cases/parsing/harmony-deep-exports/cjs.js new file mode 100644 index 00000000000..ee8555d6f98 --- /dev/null +++ b/test/cases/parsing/harmony-deep-exports/cjs.js @@ -0,0 +1,3 @@ +module.exports = { + a: { b: { c: { d: () => 42 } } } +}; diff --git a/test/cases/parsing/harmony-deep-exports/cjs2.js b/test/cases/parsing/harmony-deep-exports/cjs2.js new file mode 100644 index 00000000000..61d6ba1833b --- /dev/null +++ b/test/cases/parsing/harmony-deep-exports/cjs2.js @@ -0,0 +1 @@ +module.exports = require("./cjs3"); diff --git a/test/cases/parsing/harmony-deep-exports/cjs3.js b/test/cases/parsing/harmony-deep-exports/cjs3.js new file mode 100644 index 00000000000..f02c088c18c --- /dev/null +++ b/test/cases/parsing/harmony-deep-exports/cjs3.js @@ -0,0 +1,3 @@ +exports.a = 1; +exports.b = 2; +exports.cjs3DefaultProvidedInfo = __webpack_exports_info__.default.provideInfo; diff --git a/test/cases/parsing/harmony-deep-exports/counter.js b/test/cases/parsing/harmony-deep-exports/counter.js new file mode 100644 index 00000000000..d75e977269a --- /dev/null +++ b/test/cases/parsing/harmony-deep-exports/counter.js @@ -0,0 +1,23 @@ +export let counter = 0; +export const increment = () => { + counter++; +}; +export function reset() { + counter = 0; +} +export const unusedExport = 42; + +export const exportsInfo = { + increment: __webpack_exports_info__.increment.used, + counter: __webpack_exports_info__.counter.used, + reset: __webpack_exports_info__.reset.used, + unusedExport: __webpack_exports_info__.unusedExport.used, + somethingElse: __webpack_exports_info__.somethingElse.used, + incrementInfo: __webpack_exports_info__.increment.useInfo, + counterInfo: __webpack_exports_info__.counter.useInfo, + resetInfo: __webpack_exports_info__.reset.useInfo, + unusedExportInfo: __webpack_exports_info__.unusedExport.useInfo, + somethingElseInfo: __webpack_exports_info__.somethingElse.useInfo, + incrementProvideInfo: __webpack_exports_info__.increment.provideInfo, + somethingElseProvideInfo: __webpack_exports_info__.somethingElse.provideInfo +}; diff --git a/test/cases/parsing/harmony-deep-exports/esm1.js b/test/cases/parsing/harmony-deep-exports/esm1.js new file mode 100644 index 00000000000..e7edf24999f --- /dev/null +++ b/test/cases/parsing/harmony-deep-exports/esm1.js @@ -0,0 +1,2 @@ +export default 2; +export const esmDefaultProvidedInfo = __webpack_exports_info__.default.provideInfo; diff --git a/test/cases/parsing/harmony-deep-exports/index.js b/test/cases/parsing/harmony-deep-exports/index.js new file mode 100644 index 00000000000..627455e7746 --- /dev/null +++ b/test/cases/parsing/harmony-deep-exports/index.js @@ -0,0 +1,91 @@ +import * as C from "./reexport-namespace"; +import { counter } from "./reexport-namespace"; +import * as C2 from "./reexport-namespace-again"; +import cj2, { cjs3DefaultProvidedInfo } from "./cjs2"; +import esm1, { esmDefaultProvidedInfo } from "./esm1"; + +it("default providedInfo should be correct for cjs", () => { + expect(cj2.a).toBe(1); + expect(cjs3DefaultProvidedInfo).toBe(false); + expect(__webpack_exports_info__.cj2.default.provideInfo).toBe(false); +}); + +it("default providedInfo and usedInfo should be correct for esm", () => { + expect(esm1).toBe(2); + expect(esmDefaultProvidedInfo).toBe(true); +}); + +it("should allow to reexport namespaces 1", () => { + (0, counter.reset)(); + expect(counter.counter).toBe(0); + (0, counter.increment)(); + expect(counter.counter).toBe(1); +}); + +it("should allow to reexport namespaces 2", () => { + (0, C.counter.reset)(); + expect(C.counter.counter).toBe(0); + (0, C.counter.increment)(); + expect(C.counter.counter).toBe(1); +}); + +it("should allow to reexport namespaces 3", () => { + (0, C2.CC.counter.reset)(); + expect(C2.CC.counter.counter).toBe(0); + (0, C2.CC.counter.increment)(); + expect(C2.CC.counter.counter).toBe(1); +}); + +import CJS from "./cjs"; + +it("should be able to call a deep function in commonjs", () => { + expect(CJS.a.b.c.d()).toBe(42); +}); + +it("should report consistent exports info", () => { + const x1 = counter.exportsInfo; + + if (process.env.NODE_ENV === "production") { + expect(x1.incrementInfo).toBe(true); + expect(x1.counterInfo).toBe(true); + expect(x1.resetInfo).toBe(true); + expect(x1.unusedExport).toBe(false); + expect(x1.unusedExportInfo).toBe(false); + expect(x1.somethingElse).toBe(false); + expect(x1.somethingElseInfo).toBe(false); + expect(C.exportsInfo.nsInfo).toBe(true); + expect(C.exportsInfo.ns2).toBe(false); + expect(C.exportsInfo.ns2Info).toBe(false); + } else if (process.env.NODE_ENV === "development") { + expect(x1.incrementInfo).toBe(undefined); + expect(x1.counterInfo).toBe(undefined); + expect(x1.resetInfo).toBe(undefined); + expect(x1.unusedExport).toBe(true); + expect(x1.unusedExportInfo).toBe(undefined); + expect(x1.somethingElse).toBe(true); + expect(x1.somethingElseInfo).toBe(undefined); + expect(C.exportsInfo.nsInfo).toBe(undefined); + expect(C.exportsInfo.ns2).toBe(true); + expect(C.exportsInfo.ns2Info).toBe(undefined); + } + expect(x1.increment).toBe(true); + expect(x1.counter).toBe(true); + expect(x1.reset).toBe(true); + expect(x1.incrementProvideInfo).toBe(true); + expect(x1.somethingElseProvideInfo).toBe(false); + expect(C.exportsInfo.increment).toBe(x1.increment); + expect(C.exportsInfo.counter).toBe(x1.counter); + expect(C.exportsInfo.reset).toBe(x1.reset); + expect(C.exportsInfo.unusedExport).toBe(x1.unusedExport); + expect(C.exportsInfo.incrementInfo).toBe(x1.incrementInfo); + expect(C.exportsInfo.counterInfo).toBe(x1.counterInfo); + expect(C.exportsInfo.resetInfo).toBe(x1.resetInfo); + expect(C.exportsInfo.unusedExportInfo).toBe(x1.unusedExportInfo); + expect(C.exportsInfo.incrementProvideInfo).toBe(x1.incrementProvideInfo); + expect(C.exportsInfo.somethingElseProvideInfo).toBe( + x1.somethingElseProvideInfo + ); + expect(C.exportsInfo.ns).toBe(true); + expect(C2.exportsInfo).toBe(true); + expect(__webpack_exports_info__).toBe(true); +}); diff --git a/test/cases/parsing/harmony-deep-exports/reexport-namespace-again.js b/test/cases/parsing/harmony-deep-exports/reexport-namespace-again.js new file mode 100644 index 00000000000..203f4203b86 --- /dev/null +++ b/test/cases/parsing/harmony-deep-exports/reexport-namespace-again.js @@ -0,0 +1,4 @@ +import * as CC from "./reexport-namespace"; +export { CC }; + +export const exportsInfo = __webpack_exports_info__; diff --git a/test/cases/parsing/harmony-deep-exports/reexport-namespace.js b/test/cases/parsing/harmony-deep-exports/reexport-namespace.js new file mode 100644 index 00000000000..64589d7d257 --- /dev/null +++ b/test/cases/parsing/harmony-deep-exports/reexport-namespace.js @@ -0,0 +1,24 @@ +import * as counter from "./counter"; +export { counter }; +import * as counter2 from "./counter"; +export { counter2 }; + +export const exportsInfo = { + increment: __webpack_exports_info__.counter.increment.used, + counter: __webpack_exports_info__.counter.counter.used, + reset: __webpack_exports_info__.counter.reset.used, + unusedExport: __webpack_exports_info__.counter.unusedExport.used, + somethingElse: __webpack_exports_info__.counter.somethingElse.used, + incrementInfo: __webpack_exports_info__.counter.increment.useInfo, + counterInfo: __webpack_exports_info__.counter.counter.useInfo, + resetInfo: __webpack_exports_info__.counter.reset.useInfo, + unusedExportInfo: __webpack_exports_info__.counter.unusedExport.useInfo, + somethingElseInfo: __webpack_exports_info__.counter.somethingElse.useInfo, + incrementProvideInfo: __webpack_exports_info__.counter.increment.provideInfo, + somethingElseProvideInfo: + __webpack_exports_info__.counter.somethingElse.provideInfo, + ns: __webpack_exports_info__.counter.used, + nsInfo: __webpack_exports_info__.counter.useInfo, + ns2: __webpack_exports_info__.counter2.used, + ns2Info: __webpack_exports_info__.counter2.useInfo +}; diff --git a/test/cases/parsing/harmony-destructuring-assignment/counter.js b/test/cases/parsing/harmony-destructuring-assignment/counter.js new file mode 100644 index 00000000000..a33b7727575 --- /dev/null +++ b/test/cases/parsing/harmony-destructuring-assignment/counter.js @@ -0,0 +1,9 @@ +export let counter = 0; +export const d = 1; +export const c = 1; + +export const exportsInfo = { + counter: __webpack_exports_info__.counter.used, + d: __webpack_exports_info__.d.used, + c: __webpack_exports_info__.c.used +}; diff --git a/test/cases/parsing/harmony-destructuring-assignment/counter2.js b/test/cases/parsing/harmony-destructuring-assignment/counter2.js new file mode 100644 index 00000000000..21dbf67c4b0 --- /dev/null +++ b/test/cases/parsing/harmony-destructuring-assignment/counter2.js @@ -0,0 +1,7 @@ +export let counter = 0; +export const d = 1; + +export const exportsInfo = { + counter: __webpack_exports_info__.counter.used, + d: __webpack_exports_info__.d.used +}; diff --git a/test/cases/parsing/harmony-destructuring-assignment/counter3.js b/test/cases/parsing/harmony-destructuring-assignment/counter3.js new file mode 100644 index 00000000000..21dbf67c4b0 --- /dev/null +++ b/test/cases/parsing/harmony-destructuring-assignment/counter3.js @@ -0,0 +1,7 @@ +export let counter = 0; +export const d = 1; + +export const exportsInfo = { + counter: __webpack_exports_info__.counter.used, + d: __webpack_exports_info__.d.used +}; diff --git a/test/cases/parsing/harmony-destructuring-assignment/counter4.js b/test/cases/parsing/harmony-destructuring-assignment/counter4.js new file mode 100644 index 00000000000..43eff0ee0a3 --- /dev/null +++ b/test/cases/parsing/harmony-destructuring-assignment/counter4.js @@ -0,0 +1,15 @@ +export let counter = 0; +export const d = 1; +export const c = 1; +export const e = 1; +export const f = 1; +export const g = 1; + +export const exportsInfo = { + counter: __webpack_exports_info__.counter.used, + d: __webpack_exports_info__.d.used, + c: __webpack_exports_info__.c.used, + e: __webpack_exports_info__.e.used, + f: __webpack_exports_info__.f.used, + g: __webpack_exports_info__.g.used +}; diff --git a/test/cases/parsing/harmony-destructuring-assignment/index.js b/test/cases/parsing/harmony-destructuring-assignment/index.js new file mode 100644 index 00000000000..42e573e3900 --- /dev/null +++ b/test/cases/parsing/harmony-destructuring-assignment/index.js @@ -0,0 +1,55 @@ +import * as C from "./reexport-namespace"; +import { counter } from "./reexport-namespace"; +import { exportsInfo } from "./counter"; +import { exportsInfo as exportsInfo2 } from "./counter2"; +import * as counter3 from "./counter3"; +import * as counter4 from "./counter4"; + +it("expect tree-shake unused exports #1", () => { + const { D } = C; + expect(D).toBe(1); + expect(C.exportsInfo.D).toBe(true); + expect(C.exportsInfo.E).toBe(false); +}); + +it("expect tree-shake unused exports #2", () => { + const { d, c } = C.counter; + const { ['d']: d1 } = counter; + expect(d).toBe(1); + expect(c).toBe(1); + expect(d1).toBe(1); + expect(exportsInfo.d).toBe(true); + expect(exportsInfo.c).toBe(true); + expect(exportsInfo.counter).toBe(false); +}); + +it("expect multiple assignment work correctly", () => { + const { e, d: d1 } = counter4; + let c1; + const { f, d: d2 } = { c: c1 } = counter4; + expect(c1).toBe(1); + expect(d1).toBe(1); + expect(d2).toBe(1); + expect(e).toBe(1); + expect(f).toBe(1); + expect(counter4.exportsInfo.c).toBe(true); + expect(counter4.exportsInfo.d).toBe(true); + expect(counter4.exportsInfo.e).toBe(true); + expect(counter4.exportsInfo.f).toBe(true); + expect(counter4.exportsInfo.g).toBe(false); + expect(counter4.exportsInfo.counter).toBe(false); +}); + +it("expect tree-shake bailout when rest element is used", () => { + const { d, ...rest } = counter3; + expect(d).toBe(1); + expect(rest.exportsInfo.d).toBe(true); + expect(rest.exportsInfo.counter).toBe(true); +}); + +it("expect no support of \"deep\" tree-shaking", () => { + const { counter2: { d } } = C; + expect(d).toBe(1); + expect(exportsInfo2.d).toBe(true); + expect(exportsInfo2.counter).toBe(true); +}); diff --git a/test/cases/parsing/harmony-destructuring-assignment/reexport-namespace.js b/test/cases/parsing/harmony-destructuring-assignment/reexport-namespace.js new file mode 100644 index 00000000000..4a41ad89f66 --- /dev/null +++ b/test/cases/parsing/harmony-destructuring-assignment/reexport-namespace.js @@ -0,0 +1,14 @@ +import * as counter from "./counter"; +export { counter }; +import * as counter2 from "./counter2"; +export { counter2 }; + +export const D = 1; +export const E = 1; + +export const exportsInfo = { + D: __webpack_exports_info__.D.used, + E: __webpack_exports_info__.E.used, + counter: __webpack_exports_info__.counter.used, + counter2: __webpack_exports_info__.counter2.used, +}; diff --git a/test/cases/parsing/harmony-destructuring-assignment/test.filter.js b/test/cases/parsing/harmony-destructuring-assignment/test.filter.js new file mode 100644 index 00000000000..f176154b261 --- /dev/null +++ b/test/cases/parsing/harmony-destructuring-assignment/test.filter.js @@ -0,0 +1,4 @@ +module.exports = function (config) { + // This test can't run in development mode + return config.mode !== "development"; +}; diff --git a/test/cases/parsing/harmony-duplicate-export/1.js b/test/cases/parsing/harmony-duplicate-export/1.js index d7aaf98bd13..8ccaaf745aa 100644 --- a/test/cases/parsing/harmony-duplicate-export/1.js +++ b/test/cases/parsing/harmony-duplicate-export/1.js @@ -1,2 +1,2 @@ export var x = "1"; -export * from "./a"; +export * from "./a?1"; diff --git a/test/cases/parsing/harmony-duplicate-export/2.js b/test/cases/parsing/harmony-duplicate-export/2.js index 776d2dce79a..bc9d41caa28 100644 --- a/test/cases/parsing/harmony-duplicate-export/2.js +++ b/test/cases/parsing/harmony-duplicate-export/2.js @@ -1,2 +1,2 @@ -export * from "./a"; +export * from "./a?2"; export var x = "1"; diff --git a/test/cases/parsing/harmony-duplicate-export/3.js b/test/cases/parsing/harmony-duplicate-export/3.js index 3ebcd0b9763..65823b0e15f 100644 --- a/test/cases/parsing/harmony-duplicate-export/3.js +++ b/test/cases/parsing/harmony-duplicate-export/3.js @@ -1,2 +1,3 @@ -export * from "./a"; -export * from "./b"; +// This leads to an error +export * from "./a?3"; +export * from "./b?3"; diff --git a/test/cases/parsing/harmony-duplicate-export/4.js b/test/cases/parsing/harmony-duplicate-export/4.js index 3e398131bc9..db6e0a979c2 100644 --- a/test/cases/parsing/harmony-duplicate-export/4.js +++ b/test/cases/parsing/harmony-duplicate-export/4.js @@ -1,2 +1,3 @@ -export * from "./b"; -export * from "./a"; +// This leads to an error +export * from "./b?4"; +export * from "./a?4"; diff --git a/test/cases/parsing/harmony-duplicate-export/5.js b/test/cases/parsing/harmony-duplicate-export/5.js index 0f33339cfec..df097aff566 100644 --- a/test/cases/parsing/harmony-duplicate-export/5.js +++ b/test/cases/parsing/harmony-duplicate-export/5.js @@ -1,2 +1,4 @@ -export * from "./c"; -export * from "./d"; +// Theoretically this should lead to an error +// but in this dynamic case it's impossible to detect it +export * from "./c?5"; +export * from "./d?5"; diff --git a/test/cases/parsing/harmony-duplicate-export/6.js b/test/cases/parsing/harmony-duplicate-export/6.js index e25b35cef4a..c84c770c0b7 100644 --- a/test/cases/parsing/harmony-duplicate-export/6.js +++ b/test/cases/parsing/harmony-duplicate-export/6.js @@ -1,4 +1,5 @@ -export * from "./a"; -export * from "./b"; -export * from "./c"; -export * from "./d"; +// This leads to an error +export * from "./a?6"; +export * from "./b?6"; +export * from "./c?6"; +export * from "./d?6"; diff --git a/test/cases/parsing/harmony-duplicate-export/7.js b/test/cases/parsing/harmony-duplicate-export/7.js index acf73ae423d..a81671f523f 100644 --- a/test/cases/parsing/harmony-duplicate-export/7.js +++ b/test/cases/parsing/harmony-duplicate-export/7.js @@ -1,4 +1,5 @@ -export * from "./d"; -export * from "./b"; -export * from "./c"; -export * from "./a"; +// This leads to an error +export * from "./d?7"; +export * from "./b?7"; +export * from "./c?7"; +export * from "./a?7"; diff --git a/test/cases/parsing/harmony-duplicate-export/c.js b/test/cases/parsing/harmony-duplicate-export/c.js index 56be30618c1..1124f369a67 100644 --- a/test/cases/parsing/harmony-duplicate-export/c.js +++ b/test/cases/parsing/harmony-duplicate-export/c.js @@ -1 +1 @@ -exports.x = "c"; +Object(exports).x = "c"; diff --git a/test/cases/parsing/harmony-duplicate-export/cjs/1.js b/test/cases/parsing/harmony-duplicate-export/cjs/1.js new file mode 100644 index 00000000000..8ccaaf745aa --- /dev/null +++ b/test/cases/parsing/harmony-duplicate-export/cjs/1.js @@ -0,0 +1,2 @@ +export var x = "1"; +export * from "./a?1"; diff --git a/test/cases/parsing/harmony-duplicate-export/cjs/2.js b/test/cases/parsing/harmony-duplicate-export/cjs/2.js new file mode 100644 index 00000000000..bc9d41caa28 --- /dev/null +++ b/test/cases/parsing/harmony-duplicate-export/cjs/2.js @@ -0,0 +1,2 @@ +export * from "./a?2"; +export var x = "1"; diff --git a/test/cases/parsing/harmony-duplicate-export/cjs/3.js b/test/cases/parsing/harmony-duplicate-export/cjs/3.js new file mode 100644 index 00000000000..65823b0e15f --- /dev/null +++ b/test/cases/parsing/harmony-duplicate-export/cjs/3.js @@ -0,0 +1,3 @@ +// This leads to an error +export * from "./a?3"; +export * from "./b?3"; diff --git a/test/cases/parsing/harmony-duplicate-export/cjs/4.js b/test/cases/parsing/harmony-duplicate-export/cjs/4.js new file mode 100644 index 00000000000..db6e0a979c2 --- /dev/null +++ b/test/cases/parsing/harmony-duplicate-export/cjs/4.js @@ -0,0 +1,3 @@ +// This leads to an error +export * from "./b?4"; +export * from "./a?4"; diff --git a/test/cases/parsing/harmony-duplicate-export/cjs/5.js b/test/cases/parsing/harmony-duplicate-export/cjs/5.js new file mode 100644 index 00000000000..df097aff566 --- /dev/null +++ b/test/cases/parsing/harmony-duplicate-export/cjs/5.js @@ -0,0 +1,4 @@ +// Theoretically this should lead to an error +// but in this dynamic case it's impossible to detect it +export * from "./c?5"; +export * from "./d?5"; diff --git a/test/cases/parsing/harmony-duplicate-export/cjs/6.js b/test/cases/parsing/harmony-duplicate-export/cjs/6.js new file mode 100644 index 00000000000..c84c770c0b7 --- /dev/null +++ b/test/cases/parsing/harmony-duplicate-export/cjs/6.js @@ -0,0 +1,5 @@ +// This leads to an error +export * from "./a?6"; +export * from "./b?6"; +export * from "./c?6"; +export * from "./d?6"; diff --git a/test/cases/parsing/harmony-duplicate-export/cjs/7.js b/test/cases/parsing/harmony-duplicate-export/cjs/7.js new file mode 100644 index 00000000000..a81671f523f --- /dev/null +++ b/test/cases/parsing/harmony-duplicate-export/cjs/7.js @@ -0,0 +1,5 @@ +// This leads to an error +export * from "./d?7"; +export * from "./b?7"; +export * from "./c?7"; +export * from "./a?7"; diff --git a/test/cases/parsing/harmony-duplicate-export/cjs/a.js b/test/cases/parsing/harmony-duplicate-export/cjs/a.js new file mode 100644 index 00000000000..07f3fc98275 --- /dev/null +++ b/test/cases/parsing/harmony-duplicate-export/cjs/a.js @@ -0,0 +1 @@ +export var x = "a"; diff --git a/test/cases/parsing/harmony-duplicate-export/cjs/b.js b/test/cases/parsing/harmony-duplicate-export/cjs/b.js new file mode 100644 index 00000000000..72991cf5b48 --- /dev/null +++ b/test/cases/parsing/harmony-duplicate-export/cjs/b.js @@ -0,0 +1 @@ +export var x = "b"; diff --git a/test/cases/parsing/harmony-duplicate-export/cjs/c.js b/test/cases/parsing/harmony-duplicate-export/cjs/c.js new file mode 100644 index 00000000000..1124f369a67 --- /dev/null +++ b/test/cases/parsing/harmony-duplicate-export/cjs/c.js @@ -0,0 +1 @@ +Object(exports).x = "c"; diff --git a/test/cases/parsing/harmony-duplicate-export/cjs/d.js b/test/cases/parsing/harmony-duplicate-export/cjs/d.js new file mode 100644 index 00000000000..2d8cec1df49 --- /dev/null +++ b/test/cases/parsing/harmony-duplicate-export/cjs/d.js @@ -0,0 +1 @@ +Object(exports).x = "d"; diff --git a/test/cases/parsing/harmony-duplicate-export/d.js b/test/cases/parsing/harmony-duplicate-export/d.js index 3b5c4b67729..2d8cec1df49 100644 --- a/test/cases/parsing/harmony-duplicate-export/d.js +++ b/test/cases/parsing/harmony-duplicate-export/d.js @@ -1 +1 @@ -exports.x = "d"; +Object(exports).x = "d"; diff --git a/test/cases/parsing/harmony-duplicate-export/index.js b/test/cases/parsing/harmony-duplicate-export/index.js index b9be967f819..4c524465e6e 100644 --- a/test/cases/parsing/harmony-duplicate-export/index.js +++ b/test/cases/parsing/harmony-duplicate-export/index.js @@ -1,35 +1,35 @@ -import { x as x1 } from "./1?a"; -import { x as x2 } from "./2?a"; -import { x as x3 } from "./3?a"; -import { x as x4 } from "./4?a"; -import { x as x5 } from "./5?a"; -import { x as x6 } from "./6?a"; -import { x as x7 } from "./7?a"; +import { x as x1 } from "./1"; +import { x as x2 } from "./2"; +import { x as x3 } from "./3"; +import { x as x4 } from "./4"; +import { x as x5 } from "./5"; +import { x as x6 } from "./6"; +import { x as x7 } from "./7"; -var y1 = require("./1?b").x; -var y2 = require("./2?b").x; -var y3 = require("./3?b").x; -var y4 = require("./4?b").x; -var y5 = require("./5?b").x; -var y6 = require("./6?b").x; -var y7 = require("./7?b").x; +var y1 = require("./cjs/1").x; +var y2 = require("./cjs/2").x; +var y3 = require("./cjs/3").x; +var y4 = require("./cjs/4").x; +var y5 = require("./cjs/5").x; +var y6 = require("./cjs/6").x; +var y7 = require("./cjs/7").x; -it("should not overwrite when using star export (known exports)", function() { +it("should not overwrite when using star export (known exports)", function () { expect(x1).toBe("1"); expect(x2).toBe("1"); expect(x3).toBe("a"); expect(x4).toBe("b"); expect(x5).toBe("c"); expect(x6).toBe("a"); - expect(x7).toBe("d"); + expect(x7).toBe("b"); // Looks wrong, but is irrelevant as this is an error anyway }); -it("should not overwrite when using star export (unknown exports)", function() { +it("should not overwrite when using star export (unknown exports)", function () { expect(y1).toBe("1"); expect(y2).toBe("1"); expect(y3).toBe("a"); expect(y4).toBe("b"); expect(y5).toBe("c"); expect(y6).toBe("a"); - expect(y7).toBe("d"); + expect(y7).toBe("b"); // Looks wrong, but is irrelevant as this is an error anyway }); diff --git a/test/cases/parsing/harmony-duplicate-export/warnings.js b/test/cases/parsing/harmony-duplicate-export/warnings.js new file mode 100644 index 00000000000..c8d978d536e --- /dev/null +++ b/test/cases/parsing/harmony-duplicate-export/warnings.js @@ -0,0 +1,10 @@ +module.exports = [ + [/name 'x'/, /\.\/a\?3/, /\.\/b\?3/], + [/name 'x'/, /\.\/a\?4/, /\.\/b\?4/], + [/name 'x'/, /\.\/a\?6/, /\.\/b\?6/], + [/name 'x'/, /\.\/a\?7/, /\.\/b\?7/], + [/name 'x'/, /\.\/a\?3/, /\.\/b\?3/], + [/name 'x'/, /\.\/a\?4/, /\.\/b\?4/], + [/name 'x'/, /\.\/a\?6/, /\.\/b\?6/], + [/name 'x'/, /\.\/a\?7/, /\.\/b\?7/] +]; diff --git a/test/cases/parsing/harmony-export-hoist/bar.js b/test/cases/parsing/harmony-export-hoist/bar.js index 32909add3a2..6861bbd03ec 100644 --- a/test/cases/parsing/harmony-export-hoist/bar.js +++ b/test/cases/parsing/harmony-export-hoist/bar.js @@ -1,6 +1,8 @@ import { foo, foo2 } from "./foo"; +import foo3 from "./foo"; export default { foo: foo, - foo2: foo2 + foo2: foo2, + foo3 }; diff --git a/test/cases/parsing/harmony-export-hoist/class-no-name.js b/test/cases/parsing/harmony-export-hoist/class-no-name.js new file mode 100644 index 00000000000..3b09afe9f73 --- /dev/null +++ b/test/cases/parsing/harmony-export-hoist/class-no-name.js @@ -0,0 +1,9 @@ +import c from "./get-class-no-name"; + +export default class { + f() { + return "ok"; + } +} + +expect(new c().f()).toBe("ok"); diff --git a/test/cases/parsing/harmony-export-hoist/class-with-name.js b/test/cases/parsing/harmony-export-hoist/class-with-name.js new file mode 100644 index 00000000000..71d3a8d753a --- /dev/null +++ b/test/cases/parsing/harmony-export-hoist/class-with-name.js @@ -0,0 +1,11 @@ +import c from "./get-class-with-name"; + +export default class def { + f() { + return "ok"; + } +} + +expect(new c().f()).toBe("ok"); +if (process.env.NODE_ENV !== "production") expect(c.name).toBe("def"); +expect(def).toBe(c); diff --git a/test/cases/parsing/harmony-export-hoist/class-with-super-no-name.js b/test/cases/parsing/harmony-export-hoist/class-with-super-no-name.js new file mode 100644 index 00000000000..3a397e5cffa --- /dev/null +++ b/test/cases/parsing/harmony-export-hoist/class-with-super-no-name.js @@ -0,0 +1,16 @@ +import c from "./get-class-with-super-no-name"; + +class sup { + g() { + return "ok"; + } +} + +export default class extends sup { + f() { + return "ok"; + } +} + +expect(new c().f()).toBe("ok"); +expect(new c().g()).toBe("ok"); diff --git a/test/cases/parsing/harmony-export-hoist/class-with-super-with-name.js b/test/cases/parsing/harmony-export-hoist/class-with-super-with-name.js new file mode 100644 index 00000000000..7cc66bd6405 --- /dev/null +++ b/test/cases/parsing/harmony-export-hoist/class-with-super-with-name.js @@ -0,0 +1,18 @@ +import c from "./get-class-with-super-with-name"; + +class sup { + g() { + return "ok"; + } +} + +export default class def extends sup { + f() { + return "ok"; + } +} + +expect(new c().f()).toBe("ok"); +expect(new c().g()).toBe("ok"); +if (process.env.NODE_ENV !== "production") expect(c.name).toBe("def"); +expect(c).toBe(def); diff --git a/test/cases/parsing/harmony-export-hoist/foo.js b/test/cases/parsing/harmony-export-hoist/foo.js index ad0b7c1fe7a..f013a586c83 100644 --- a/test/cases/parsing/harmony-export-hoist/foo.js +++ b/test/cases/parsing/harmony-export-hoist/foo.js @@ -1,4 +1,4 @@ -import {bar} from "./bar"; +import { bar } from "./bar"; export function foo() { return "ok"; @@ -7,6 +7,10 @@ export function foo() { function foo2() { return "ok"; } -export { foo2 } +export { foo2 }; -export { default } from "./bar"; +export default function () { + return "ok"; +} + +export { default as results } from "./bar"; diff --git a/test/cases/parsing/harmony-export-hoist/func-no-args-no-name.js b/test/cases/parsing/harmony-export-hoist/func-no-args-no-name.js new file mode 100644 index 00000000000..9f95e83b4f3 --- /dev/null +++ b/test/cases/parsing/harmony-export-hoist/func-no-args-no-name.js @@ -0,0 +1,7 @@ +import f from "./get-func-no-args-no-name"; + +expect(f()).toBe("ok"); + +export default function () { + return "ok"; +} diff --git a/test/cases/parsing/harmony-export-hoist/func-no-args-with-name.js b/test/cases/parsing/harmony-export-hoist/func-no-args-with-name.js new file mode 100644 index 00000000000..2382658a4ff --- /dev/null +++ b/test/cases/parsing/harmony-export-hoist/func-no-args-with-name.js @@ -0,0 +1,9 @@ +import f from "./get-func-no-args-with-name"; + +expect(f()).toBe("ok"); +expect(def).toBe(f); +if (process.env.NODE_ENV !== "production") expect(f.name).toBe("def"); + +export default function def() { + return "ok"; +} diff --git a/test/cases/parsing/harmony-export-hoist/func-with-args-no-name.js b/test/cases/parsing/harmony-export-hoist/func-with-args-no-name.js new file mode 100644 index 00000000000..5b2480fa595 --- /dev/null +++ b/test/cases/parsing/harmony-export-hoist/func-with-args-no-name.js @@ -0,0 +1,7 @@ +import f from "./get-func-with-args-no-name"; + +expect(f(123)).toBe("ok123"); + +export default function (x) { + return "ok" + x; +} diff --git a/test/cases/parsing/harmony-export-hoist/func-with-args-with-name.js b/test/cases/parsing/harmony-export-hoist/func-with-args-with-name.js new file mode 100644 index 00000000000..1cb19ad9187 --- /dev/null +++ b/test/cases/parsing/harmony-export-hoist/func-with-args-with-name.js @@ -0,0 +1,9 @@ +import f from "./get-func-with-args-with-name"; + +expect(f(123)).toBe("ok123"); +if (process.env.NODE_ENV !== "production") expect(f.name).toBe("def"); +expect(def).toBe(f); + +export default function def(x) { + return "ok" + x; +} diff --git a/test/cases/parsing/harmony-export-hoist/get-class-no-name.js b/test/cases/parsing/harmony-export-hoist/get-class-no-name.js new file mode 100644 index 00000000000..a8c0997e9cb --- /dev/null +++ b/test/cases/parsing/harmony-export-hoist/get-class-no-name.js @@ -0,0 +1 @@ +export { default } from "./class-no-name"; diff --git a/test/cases/parsing/harmony-export-hoist/get-class-with-name.js b/test/cases/parsing/harmony-export-hoist/get-class-with-name.js new file mode 100644 index 00000000000..85d41cfb573 --- /dev/null +++ b/test/cases/parsing/harmony-export-hoist/get-class-with-name.js @@ -0,0 +1 @@ +export { default } from "./class-with-name"; diff --git a/test/cases/parsing/harmony-export-hoist/get-class-with-super-no-name.js b/test/cases/parsing/harmony-export-hoist/get-class-with-super-no-name.js new file mode 100644 index 00000000000..593f95fbf32 --- /dev/null +++ b/test/cases/parsing/harmony-export-hoist/get-class-with-super-no-name.js @@ -0,0 +1 @@ +export { default } from "./class-with-super-no-name"; diff --git a/test/cases/parsing/harmony-export-hoist/get-class-with-super-with-name.js b/test/cases/parsing/harmony-export-hoist/get-class-with-super-with-name.js new file mode 100644 index 00000000000..1e74a77ea15 --- /dev/null +++ b/test/cases/parsing/harmony-export-hoist/get-class-with-super-with-name.js @@ -0,0 +1 @@ +export { default } from "./class-with-super-with-name"; diff --git a/test/cases/parsing/harmony-export-hoist/get-func-no-args-no-name.js b/test/cases/parsing/harmony-export-hoist/get-func-no-args-no-name.js new file mode 100644 index 00000000000..46e348eb733 --- /dev/null +++ b/test/cases/parsing/harmony-export-hoist/get-func-no-args-no-name.js @@ -0,0 +1 @@ +export { default } from "./func-no-args-no-name"; diff --git a/test/cases/parsing/harmony-export-hoist/get-func-no-args-with-name.js b/test/cases/parsing/harmony-export-hoist/get-func-no-args-with-name.js new file mode 100644 index 00000000000..3c2980dc3b3 --- /dev/null +++ b/test/cases/parsing/harmony-export-hoist/get-func-no-args-with-name.js @@ -0,0 +1 @@ +export { default } from "./func-no-args-with-name"; diff --git a/test/cases/parsing/harmony-export-hoist/get-func-with-args-no-name.js b/test/cases/parsing/harmony-export-hoist/get-func-with-args-no-name.js new file mode 100644 index 00000000000..413760fd119 --- /dev/null +++ b/test/cases/parsing/harmony-export-hoist/get-func-with-args-no-name.js @@ -0,0 +1 @@ +export { default } from "./func-with-args-no-name"; diff --git a/test/cases/parsing/harmony-export-hoist/get-func-with-args-with-name.js b/test/cases/parsing/harmony-export-hoist/get-func-with-args-with-name.js new file mode 100644 index 00000000000..934b196e432 --- /dev/null +++ b/test/cases/parsing/harmony-export-hoist/get-func-with-args-with-name.js @@ -0,0 +1 @@ +export { default } from "./func-with-args-with-name"; diff --git a/test/cases/parsing/harmony-export-hoist/index.js b/test/cases/parsing/harmony-export-hoist/index.js index fd5748c9df1..24f54a8ef32 100644 --- a/test/cases/parsing/harmony-export-hoist/index.js +++ b/test/cases/parsing/harmony-export-hoist/index.js @@ -1,9 +1,25 @@ "use strict"; -it("should hoist exports", function() { - var result = require("./foo").default; +it("should hoist exports", function () { + var result = require("./foo").results; expect(typeof result.foo).toEqual("function"); expect(typeof result.foo2).toEqual("function"); + expect(typeof result.foo3).toEqual("function"); expect(result.foo()).toBe("ok"); expect(result.foo2()).toBe("ok"); + expect(result.foo3()).toBe("ok"); +}); + +it("should hoist export default functions", () => { + require("./func-no-args-no-name"); + require("./func-no-args-with-name"); + require("./func-with-args-no-name"); + require("./func-with-args-with-name"); +}); + +it("should hoist export default classes", () => { + require("./class-no-name"); + require("./class-with-name"); + require("./class-with-super-no-name"); + require("./class-with-super-with-name"); }); diff --git a/test/cases/parsing/harmony-export-import-specifier-asi/a.js b/test/cases/parsing/harmony-export-import-specifier-asi/a.js new file mode 100644 index 00000000000..9549e18a567 --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier-asi/a.js @@ -0,0 +1,3 @@ +export const fn = (num) => { + return num; +}; diff --git a/test/cases/parsing/harmony-export-import-specifier-asi/index.js b/test/cases/parsing/harmony-export-import-specifier-asi/index.js new file mode 100644 index 00000000000..3c0ae95aaa7 --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier-asi/index.js @@ -0,0 +1,11 @@ +import { fn } from './a.js'; + +const num = 1 + +export { fn } from './a.js'; + +fn(num); + +it("should work", function() { + expect(fn(num)).toBe(1); +}); diff --git a/test/cases/parsing/harmony-export-import-specifier/b.js b/test/cases/parsing/harmony-export-import-specifier/b.js new file mode 100644 index 00000000000..affbea2d442 --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/b.js @@ -0,0 +1,9 @@ +import {c} from "./c.js"; + +const b2 = 3; +const b3 = c; +export {c as b1, c as b4, b2, b3} +export const usedB1 = __webpack_exports_info__.b1.used; +export const usedB2 = __webpack_exports_info__.b2.used; +export const usedB3 = __webpack_exports_info__.b3.used; +export const usedB4 = __webpack_exports_info__.b4.used; diff --git a/test/cases/parsing/harmony-export-import-specifier/c.js b/test/cases/parsing/harmony-export-import-specifier/c.js new file mode 100644 index 00000000000..f093d6b7cc5 --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/c.js @@ -0,0 +1 @@ +export * as c from "./d.js"; diff --git a/test/cases/parsing/harmony-export-import-specifier/cjs1.js b/test/cases/parsing/harmony-export-import-specifier/cjs1.js new file mode 100644 index 00000000000..01fa3b71d0e --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/cjs1.js @@ -0,0 +1,2 @@ +exports.a = 2; +exports.b = 3; diff --git a/test/cases/parsing/harmony-export-import-specifier/cjs2.js b/test/cases/parsing/harmony-export-import-specifier/cjs2.js new file mode 100644 index 00000000000..e650ca0fe4f --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/cjs2.js @@ -0,0 +1 @@ +module.exports = require("./cjs1"); diff --git a/test/cases/parsing/harmony-export-import-specifier/d.js b/test/cases/parsing/harmony-export-import-specifier/d.js new file mode 100644 index 00000000000..2ca95af9d16 --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/d.js @@ -0,0 +1,4 @@ +export const d1 = 1; +export const d2 = 2; +export const usedD1 = __webpack_exports_info__.d1.used; +export const usedD2 = __webpack_exports_info__.d2.used; diff --git a/test/cases/parsing/harmony-export-import-specifier/e.js b/test/cases/parsing/harmony-export-import-specifier/e.js new file mode 100644 index 00000000000..fc325c5b2bd --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/e.js @@ -0,0 +1,4 @@ +export const e1 = 10; +export const e2 = 20; +export const usedE1 = __webpack_exports_info__.e1.used; +export const usedE2 = __webpack_exports_info__.e2.used; diff --git a/test/cases/parsing/harmony-export-import-specifier/e1.js b/test/cases/parsing/harmony-export-import-specifier/e1.js new file mode 100644 index 00000000000..cc124f19180 --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/e1.js @@ -0,0 +1 @@ +export * as e from "./e.js"; diff --git a/test/cases/parsing/harmony-export-import-specifier/f.js b/test/cases/parsing/harmony-export-import-specifier/f.js new file mode 100644 index 00000000000..3ab2df1b405 --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/f.js @@ -0,0 +1,2 @@ +export * as f1 from "./e1.js"; +export * as f2 from "./e.js"; diff --git a/test/cases/parsing/harmony-export-import-specifier/g.js b/test/cases/parsing/harmony-export-import-specifier/g.js new file mode 100644 index 00000000000..79a3afd84b3 --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/g.js @@ -0,0 +1,3 @@ +import {f1, f2} from "./f.js"; + +export {f1, f2 as g1}; diff --git a/test/cases/parsing/harmony-export-import-specifier/h.js b/test/cases/parsing/harmony-export-import-specifier/h.js new file mode 100644 index 00000000000..f3c2dfce710 --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/h.js @@ -0,0 +1 @@ +export * as h from "./g.js"; diff --git a/test/cases/parsing/harmony-export-import-specifier/index.js b/test/cases/parsing/harmony-export-import-specifier/index.js index e0a4d16b1af..b33516186da 100644 --- a/test/cases/parsing/harmony-export-import-specifier/index.js +++ b/test/cases/parsing/harmony-export-import-specifier/index.js @@ -1,8 +1,90 @@ "use strict"; import { x, y } from "./a"; +import { d2, usedD1, usedD2 } from "./d.js"; +import { b1, usedB1, usedB2, usedB3, usedB4 } from "./b.js"; +import { usedE1, usedE2 } from "./e.js"; +import { h } from "./h.js"; +import * as m from "./m"; +import { object as obj } from "./m"; +import cjs from "./cjs2"; +import * as o from "./o"; +import * as p from "./p"; +import * as q from "./q"; +import * as so from "./side-effect-free/o"; +import * as sm from "./side-effect-free/m"; +import json1 from "./some.json"; +import json2 from "./some1.json"; +import weirdCjs from "./weird-cjs"; -it("namespace export as from commonjs should override named export", function() { +it("namespace export as from commonjs should override named export", function () { expect(x).toBe(1); expect(y).toBe(3); }); + +it("named namespace export should work correctly", function () { + expect(d2).toBe(2); + if (process.env.NODE_ENV === "production") { + expect(usedD1).toBe(false); + } + expect(usedD2).toBe(true); + + expect(b1.d2).toBe(2); + expect(usedB1).toBe(true); + if (process.env.NODE_ENV === "production") { + expect(usedB2).toBe(false); + expect(usedB3).toBe(false); + expect(usedB4).toBe(false); + } +}); + +it("complex case should work correctly", () => { + expect(h.f1.e.e1).toBe(10); + expect(h.g1.e1).toBe(10); + expect(usedE1).toBe(true); + if (process.env.NODE_ENV === "production") { + expect(usedE2).toBe(false); + } +}); + +it("should handle 'm in n' case", () => { + const obj = { aaa: "aaa" in m }; + expect(obj.aaa).toBe(true); + expect("not_here" in m.object).toBe(false); + expect("not_here" in obj).toBe(false); + expect("__esModule" in q).toBe(true); + expect(() => "value" in q.__esModule).toThrow(); + expect(() => "not_here" in json1).toThrow(); + expect("not_here" in json2).toBe(false); + expect("a" in json2).toBe(true); + expect("a" in cjs).toBe(true); + expect("not_here" in cjs).toBe(false); + expect("not_here" in weirdCjs).toBe(false); + expect("a" in weirdCjs).toBe(true); + expect(() => "a" in weirdCjs.a).toThrow(); + expect("aaa" in o).toBe(true); + expect("aaa" in p).toBe(false); + expect("ccc" in m).toBe(false); + expect("aaa" in q).toBe(true); + expect("aaa" in so).toBe(true); + expect("ccc" in sm).toBe(false); + expect("ccc" in (false ? {} : m.ddd)).toBe(true); + expect("ccc" in (false ? {} : sm.ddd)).toBe(true); + expect("ddd" in m.ddd).toBe(false); + expect("ddd" in sm.ddd).toBe(false); + if (process.env.NODE_ENV === "production") { + expect(m.ddd.usedA).toBe(false); + expect(m.usedB).toBe(false); + expect(m.usedA).toBe(true); + expect(m.canMangleA).toBe(true); + } +}); + +it("issue-15759", () => { + function foo() { + // PLEASE CONFIRM there is no space after return + // prettier-ignore + return"usedA"in m; + } + expect(foo.call()).toBe(true); +}); diff --git a/test/cases/parsing/harmony-export-import-specifier/m.js b/test/cases/parsing/harmony-export-import-specifier/m.js new file mode 100644 index 00000000000..d47ba358a40 --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/m.js @@ -0,0 +1,7 @@ +export const aaa = 1; +export const bbb = 2; +export const object = {}; +export * as ddd from "./n"; +export const usedA = __webpack_exports_info__.aaa.used; +export const canMangleA = __webpack_exports_info__.ccc.canMangle; +export const usedB = __webpack_exports_info__.bbb.used; diff --git a/test/cases/parsing/harmony-export-import-specifier/n.js b/test/cases/parsing/harmony-export-import-specifier/n.js new file mode 100644 index 00000000000..f41485c9dc1 --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/n.js @@ -0,0 +1,5 @@ +export const ccc = 3; +export const mmm = () => ({}); +export const aaa = 1; +export const usedA = __webpack_exports_info__.a.used; +export const canMangleC = __webpack_exports_info__.c.canMangle; diff --git a/test/cases/parsing/harmony-export-import-specifier/o.js b/test/cases/parsing/harmony-export-import-specifier/o.js new file mode 100644 index 00000000000..561e90cc163 --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/o.js @@ -0,0 +1,2 @@ +const exports_ = { aaa: 1, bbb: 2 }; +module.exports = exports_; diff --git a/web_modules/node-libs-browser.js b/test/cases/parsing/harmony-export-import-specifier/p.js similarity index 100% rename from web_modules/node-libs-browser.js rename to test/cases/parsing/harmony-export-import-specifier/p.js diff --git a/test/cases/parsing/harmony-export-import-specifier/q.js b/test/cases/parsing/harmony-export-import-specifier/q.js new file mode 100644 index 00000000000..aea63e5b1d8 --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/q.js @@ -0,0 +1 @@ +export * from "./o"; diff --git a/test/cases/parsing/harmony-export-import-specifier/side-effect-free/m.js b/test/cases/parsing/harmony-export-import-specifier/side-effect-free/m.js new file mode 100644 index 00000000000..2385ca4646c --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/side-effect-free/m.js @@ -0,0 +1 @@ +export * from "../m"; diff --git a/test/cases/parsing/harmony-export-import-specifier/side-effect-free/o.js b/test/cases/parsing/harmony-export-import-specifier/side-effect-free/o.js new file mode 100644 index 00000000000..9b7e1d2e4c5 --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/side-effect-free/o.js @@ -0,0 +1 @@ +export * from "../o"; diff --git a/test/cases/parsing/harmony-export-import-specifier/side-effect-free/package.json b/test/cases/parsing/harmony-export-import-specifier/side-effect-free/package.json new file mode 100644 index 00000000000..a43829151e1 --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/side-effect-free/package.json @@ -0,0 +1,3 @@ +{ + "sideEffects": false +} diff --git a/test/cases/parsing/harmony-export-import-specifier/some.json b/test/cases/parsing/harmony-export-import-specifier/some.json new file mode 100644 index 00000000000..27ba77ddaf6 --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/some.json @@ -0,0 +1 @@ +true diff --git a/test/cases/parsing/harmony-export-import-specifier/some1.json b/test/cases/parsing/harmony-export-import-specifier/some1.json new file mode 100644 index 00000000000..8d6b85c7b3f --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/some1.json @@ -0,0 +1,3 @@ +{ + "a": 1 +} diff --git a/test/cases/parsing/harmony-export-import-specifier/weird-cjs.js b/test/cases/parsing/harmony-export-import-specifier/weird-cjs.js new file mode 100644 index 00000000000..698bfce670d --- /dev/null +++ b/test/cases/parsing/harmony-export-import-specifier/weird-cjs.js @@ -0,0 +1,7 @@ +exports.__esModule = false; + +function dynamic(exports) { + exports.a = 1; +} + +dynamic(exports); diff --git a/test/cases/parsing/harmony-export-precedence/warnings.js b/test/cases/parsing/harmony-export-precedence/warnings.js index 811dd591edd..af730a435fd 100644 --- a/test/cases/parsing/harmony-export-precedence/warnings.js +++ b/test/cases/parsing/harmony-export-precedence/warnings.js @@ -1,3 +1,5 @@ module.exports = [ - [/export 'default' \(imported as 'defaultImport'\) was not found in '.\/a'/] + [ + /export 'default' \(imported as 'defaultImport'\) was not found in '.\/a' \(possible exports: a, b, c, d, e, f\)/ + ] ]; diff --git a/test/cases/parsing/harmony-export-specifier-asi/a.js b/test/cases/parsing/harmony-export-specifier-asi/a.js new file mode 100644 index 00000000000..9549e18a567 --- /dev/null +++ b/test/cases/parsing/harmony-export-specifier-asi/a.js @@ -0,0 +1,3 @@ +export const fn = (num) => { + return num; +}; diff --git a/test/cases/parsing/harmony-export-specifier-asi/index.js b/test/cases/parsing/harmony-export-specifier-asi/index.js new file mode 100644 index 00000000000..3bff5046362 --- /dev/null +++ b/test/cases/parsing/harmony-export-specifier-asi/index.js @@ -0,0 +1,11 @@ +import { fn } from './a.js'; + +const num = 1 + +export { num }; + +fn(num); + +it("should work", function() { + expect(fn(num)).toBe(1); +}); diff --git a/test/cases/parsing/harmony-info/warnings.js b/test/cases/parsing/harmony-info/warnings.js index b64a76b270f..d1b24b0fb83 100644 --- a/test/cases/parsing/harmony-info/warnings.js +++ b/test/cases/parsing/harmony-info/warnings.js @@ -1,5 +1,11 @@ module.exports = [ - [/export 'default' \(imported as 'def'\) was not found in '\.\/module'/], - [/export 'e' was not found in '\.\/module'/], - [/export 'a' \(imported as 'aa'\) was not found in '\.\/module'/] + [ + /export 'default' \(imported as 'def'\) was not found in '\.\/module' \(possible exports: b, c, d\)/ + ], + [ + /export 'a' \(imported as 'aa'\) was not found in '\.\/module' \(possible exports: b, c, d\)/ + ], + [ + /export 'e' \(imported as 'e'\) was not found in '\.\/module' \(possible exports: b, c, d\)/ + ] ]; diff --git a/test/cases/parsing/harmony-module-optimization/index.js b/test/cases/parsing/harmony-module-optimization/index.js new file mode 100644 index 00000000000..a1c02e23caa --- /dev/null +++ b/test/cases/parsing/harmony-module-optimization/index.js @@ -0,0 +1,8 @@ +import { value as v1, check as c1 } from "./module"; +import { value as v2, check as c2 } from "./module-normal"; + +it("should allow to optimize exports in modules using 'module'", () => { + expect(v1).toBe(42); + expect(v2).toBe(42); + expect(c1).toBe(c2); +}); diff --git a/test/cases/parsing/harmony-module-optimization/module-normal.js b/test/cases/parsing/harmony-module-optimization/module-normal.js new file mode 100644 index 00000000000..75be8e93d58 --- /dev/null +++ b/test/cases/parsing/harmony-module-optimization/module-normal.js @@ -0,0 +1,3 @@ +export const value = 42; +export const unusedValue = 42; +export const check = __webpack_exports_info__.unusedValue.used; diff --git a/test/cases/parsing/harmony-module-optimization/module.js b/test/cases/parsing/harmony-module-optimization/module.js new file mode 100644 index 00000000000..03dbf9857e1 --- /dev/null +++ b/test/cases/parsing/harmony-module-optimization/module.js @@ -0,0 +1,5 @@ +export const value = 42; +export const unusedValue = 42; +export const check = __webpack_exports_info__.unusedValue.used; + +if (Math.random() < 0) console.log(module.exports); diff --git a/test/cases/parsing/harmony-reexport/a.js b/test/cases/parsing/harmony-reexport/a.js new file mode 100644 index 00000000000..9b794cf0f1a --- /dev/null +++ b/test/cases/parsing/harmony-reexport/a.js @@ -0,0 +1,11 @@ +import { b } from "./b"; + +export function a() { + return b(); +} +export const obj = {}; +export const aUsed = __webpack_exports_info__.a.used; +export const aProvided = __webpack_exports_info__.a.provideInfo; +export const objUsed = __webpack_exports_info__.obj.used; +export const objAProvided = __webpack_exports_info__.obj.A.provideInfo; +export const aToStringProvided = __webpack_exports_info__.a.toString.provideInfo; diff --git a/test/cases/parsing/harmony-reexport/b.js b/test/cases/parsing/harmony-reexport/b.js new file mode 100644 index 00000000000..7554fde97b5 --- /dev/null +++ b/test/cases/parsing/harmony-reexport/b.js @@ -0,0 +1 @@ +export function b() {} diff --git a/test/cases/parsing/harmony-reexport/empty.js b/test/cases/parsing/harmony-reexport/empty.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/cases/parsing/harmony-reexport/index.js b/test/cases/parsing/harmony-reexport/index.js new file mode 100644 index 00000000000..28837e5f54a --- /dev/null +++ b/test/cases/parsing/harmony-reexport/index.js @@ -0,0 +1,12 @@ +import { a, aUsed, aCanBeMangled, aProvided, aToStringProvided, obj, objUsed, objAProvided } from "./reexport"; + +if (a()) console.log("a", obj); + +it("should not allow mangle if some exports are unknown", () => { + expect(aUsed).toBe(true); + expect(aProvided).toBe(true); + expect(aCanBeMangled).toBe(false); + expect(objUsed).toBe(true); + expect(objAProvided).toBe(undefined); + expect(aToStringProvided).toBe(undefined); +}); diff --git a/test/cases/parsing/harmony-reexport/reexport.js b/test/cases/parsing/harmony-reexport/reexport.js new file mode 100644 index 00000000000..648d898edc8 --- /dev/null +++ b/test/cases/parsing/harmony-reexport/reexport.js @@ -0,0 +1,3 @@ +export * from "./a"; +export * from "./empty"; +export const aCanBeMangled = __webpack_exports_info__.a.canMangle; diff --git a/test/cases/parsing/harmony-star-conflict/index.js b/test/cases/parsing/harmony-star-conflict/index.js new file mode 100644 index 00000000000..b3d2c53fb64 --- /dev/null +++ b/test/cases/parsing/harmony-star-conflict/index.js @@ -0,0 +1,41 @@ +import { + named1, + named2, + named3, + named4, + named5, + named6 +} from "./named-with-namespace"; + +it("should point out conflicts from named to namespace", () => { + expect(named1).toBe(1); + expect(named2).toBe(2); + expect(named3).toBe(2); + expect(named4).toMatchObject({ + named1: 1, + named2: 2 + }); + expect(named5).toBe(5); + expect(named6).toBe(1); +}); + +import { + named1 as snamed1, + named2 as snamed2, + named3 as snamed3, + named4 as snamed4, + named5 as snamed5, + named6 as snamed6 +} from "./named-with-namespace-no-side"; + +it("should point out conflicts from named to namespace (without side effects)", () => { + expect(snamed1).toBe(1); + expect(snamed2).toBe(2); + expect(snamed3).toBe(2); + expect(snamed4).toMatchObject({ + named1: 1, + named2: 2 + }); + expect(snamed5).toBe(5); + expect(snamed6).toBe(1); +}); diff --git a/test/cases/parsing/harmony-star-conflict/named-with-namespace-no-side/a.js b/test/cases/parsing/harmony-star-conflict/named-with-namespace-no-side/a.js new file mode 100644 index 00000000000..9ef3ca2f0b6 --- /dev/null +++ b/test/cases/parsing/harmony-star-conflict/named-with-namespace-no-side/a.js @@ -0,0 +1,6 @@ +export const named1 = 1; +export const named2 = 2; +export { named2 as named3 } from "./a.js"; +export * as named4 from "./a.js"; +export const named5 = 5; +export { named1 as named6 } from "./a.js"; diff --git a/test/cases/parsing/harmony-star-conflict/named-with-namespace-no-side/b.js b/test/cases/parsing/harmony-star-conflict/named-with-namespace-no-side/b.js new file mode 100644 index 00000000000..813c9f37cd1 --- /dev/null +++ b/test/cases/parsing/harmony-star-conflict/named-with-namespace-no-side/b.js @@ -0,0 +1,6 @@ +export * as named1 from "./a.js"; +export { named1 as named2 } from "./a.js"; +export { named1 as named3 } from "./a.js"; +export * as named4 from "./a.js"; +export { named5 } from "./a.js"; +export { named1 as named6 } from "./a.js"; diff --git a/test/cases/parsing/harmony-star-conflict/named-with-namespace-no-side/index.js b/test/cases/parsing/harmony-star-conflict/named-with-namespace-no-side/index.js new file mode 100644 index 00000000000..240b21dc43f --- /dev/null +++ b/test/cases/parsing/harmony-star-conflict/named-with-namespace-no-side/index.js @@ -0,0 +1,2 @@ +export * from "./a.js"; +export * from "./b.js"; diff --git a/test/cases/parsing/harmony-star-conflict/named-with-namespace-no-side/package.json b/test/cases/parsing/harmony-star-conflict/named-with-namespace-no-side/package.json new file mode 100644 index 00000000000..43c38c1bb03 --- /dev/null +++ b/test/cases/parsing/harmony-star-conflict/named-with-namespace-no-side/package.json @@ -0,0 +1,3 @@ +{ + "sideEffects": false +} diff --git a/test/cases/parsing/harmony-star-conflict/named-with-namespace/a.js b/test/cases/parsing/harmony-star-conflict/named-with-namespace/a.js new file mode 100644 index 00000000000..9ef3ca2f0b6 --- /dev/null +++ b/test/cases/parsing/harmony-star-conflict/named-with-namespace/a.js @@ -0,0 +1,6 @@ +export const named1 = 1; +export const named2 = 2; +export { named2 as named3 } from "./a.js"; +export * as named4 from "./a.js"; +export const named5 = 5; +export { named1 as named6 } from "./a.js"; diff --git a/test/cases/parsing/harmony-star-conflict/named-with-namespace/b.js b/test/cases/parsing/harmony-star-conflict/named-with-namespace/b.js new file mode 100644 index 00000000000..813c9f37cd1 --- /dev/null +++ b/test/cases/parsing/harmony-star-conflict/named-with-namespace/b.js @@ -0,0 +1,6 @@ +export * as named1 from "./a.js"; +export { named1 as named2 } from "./a.js"; +export { named1 as named3 } from "./a.js"; +export * as named4 from "./a.js"; +export { named5 } from "./a.js"; +export { named1 as named6 } from "./a.js"; diff --git a/test/cases/parsing/harmony-star-conflict/named-with-namespace/index.js b/test/cases/parsing/harmony-star-conflict/named-with-namespace/index.js new file mode 100644 index 00000000000..240b21dc43f --- /dev/null +++ b/test/cases/parsing/harmony-star-conflict/named-with-namespace/index.js @@ -0,0 +1,2 @@ +export * from "./a.js"; +export * from "./b.js"; diff --git a/test/cases/parsing/harmony-star-conflict/warnings.js b/test/cases/parsing/harmony-star-conflict/warnings.js new file mode 100644 index 00000000000..04bf49cc89e --- /dev/null +++ b/test/cases/parsing/harmony-star-conflict/warnings.js @@ -0,0 +1,14 @@ +module.exports = [ + [ + /conflicting star exports/, + /names 'named1', 'named2', 'named3' /, + /\.\/a\.js/, + /\.\/b\.js/ + ], + [ + /conflicting star exports/, + /names 'named1', 'named2', 'named3' /, + /\.\/a\.js/, + /\.\/b\.js/ + ] +]; diff --git a/test/cases/parsing/harmony-tdz/index.js b/test/cases/parsing/harmony-tdz/index.js index 0f2ef06aa98..5459cb4216e 100644 --- a/test/cases/parsing/harmony-tdz/index.js +++ b/test/cases/parsing/harmony-tdz/index.js @@ -1,8 +1,10 @@ import value, { exception } from "./module"; -it("should have a TDZ for exported const values", function() { - expect((typeof exception)).toBe("object"); +it("should have a TDZ for exported const values", () => { + expect(typeof exception).toBe("object"); expect(exception).toBeInstanceOf(Error); - expect(exception.message).toMatch(/ is not defined$/); + expect(exception.message).toMatch( + / is not defined$|^Cannot access '.+?' before initialization$/ + ); expect(value).toBe("value"); }); diff --git a/test/cases/parsing/harmony-tdz/test.filter.js b/test/cases/parsing/harmony-tdz/test.filter.js index 6bc6a7f95c8..ca76a1f9b13 100644 --- a/test/cases/parsing/harmony-tdz/test.filter.js +++ b/test/cases/parsing/harmony-tdz/test.filter.js @@ -1,5 +1,5 @@ -var supportsBlockScoping = require("../../../helpers/supportsBlockScoping"); +const supportsBlockScoping = require("../../../helpers/supportsBlockScoping"); -module.exports = function(config) { - return !config.minimize && supportsBlockScoping(); +module.exports = function (config) { + return supportsBlockScoping(); }; diff --git a/test/cases/parsing/harmony-this/abc.js b/test/cases/parsing/harmony-this/abc.js index f9d8733a270..5fb1b87da74 100644 --- a/test/cases/parsing/harmony-this/abc.js +++ b/test/cases/parsing/harmony-this/abc.js @@ -1,14 +1,11 @@ function returnThis() { - if(typeof this === "undefined") return "undefined"; - return this; + if (typeof this === "undefined") return expect("undefined"); + return expect(this); } var a = returnThis; var b = returnThis; -export { - a, - b -} +export { a, b }; export default returnThis; diff --git a/test/cases/parsing/harmony-this/index.js b/test/cases/parsing/harmony-this/index.js index 0f350bd05db..9e28698ced7 100644 --- a/test/cases/parsing/harmony-this/index.js +++ b/test/cases/parsing/harmony-this/index.js @@ -1,28 +1,28 @@ -"use strict"; +"use strict" -import d, {a, b as B} from "./abc"; +import d, {a, b as B} from "./abc" -import * as abc from "./abc"; +import * as abc from "./abc" function x() { throw new Error("should not be executed"); } it("should have this = undefined on imported non-strict functions", function() { + if(true) x + d().toBe("undefined") x - expect(d()).toBe("undefined"); + a().toBe("undefined") x - expect(a()).toBe("undefined"); - x - expect(B()).toBe("undefined"); -}); + B().toBe("undefined") +}) -import C2, { C } from "./new"; +import C2, { C } from "./new" -import * as New from "./new"; +import * as New from "./new" it("should be possible to use new correctly", function() { x - expect(new C()).toEqual({ok: true}); + new C().ok.toEqual(true) x - expect(new C2()).toEqual({ok: true}); + new C2().ok.toEqual(true) x - expect(new New.C()).toEqual({ok: true}); -}); + new New.C().ok.toEqual(true) +}) diff --git a/test/cases/parsing/harmony-this/new.js b/test/cases/parsing/harmony-this/new.js index 8fe7ff7fbee..42027c3e1dd 100644 --- a/test/cases/parsing/harmony-this/new.js +++ b/test/cases/parsing/harmony-this/new.js @@ -1,10 +1,8 @@ function C() { - this.ok = this.pok; + this.ok = expect(this.pok); } C.prototype.pok = true; export default C; -export { - C -}; +export { C }; diff --git a/test/cases/parsing/harmony/index.js b/test/cases/parsing/harmony/index.js index 2989113bc91..e34e9d4b84d 100644 --- a/test/cases/parsing/harmony/index.js +++ b/test/cases/parsing/harmony/index.js @@ -89,10 +89,13 @@ it("should be able to import commonjs", function() { function x() { throw new Error("should not be executed"); } // next line doesn't end with semicolon x + Thing expect(Thing).toBeTypeOf("function"); x + Thing() expect(Thing()).toBe("thing"); x + Other expect(Other).toBe("other"); expect(Thing2).toBeTypeOf("function"); diff --git a/test/cases/parsing/hashbang/file.js b/test/cases/parsing/hashbang/file.js new file mode 100644 index 00000000000..2866673b1ee --- /dev/null +++ b/test/cases/parsing/hashbang/file.js @@ -0,0 +1,2 @@ +#!/usr/bin/env node +module.exports = "ok"; diff --git a/test/cases/parsing/hashbang/file.mjs b/test/cases/parsing/hashbang/file.mjs new file mode 100644 index 00000000000..97e357ad75e --- /dev/null +++ b/test/cases/parsing/hashbang/file.mjs @@ -0,0 +1,2 @@ +#!/usr/bin/env node +export default "ok"; diff --git a/test/cases/parsing/hashbang/index.js b/test/cases/parsing/hashbang/index.js new file mode 100644 index 00000000000..f4bb6745333 --- /dev/null +++ b/test/cases/parsing/hashbang/index.js @@ -0,0 +1,9 @@ +it("should load a file with hashbang", function () { + var result = require("./file.js"); + expect(result).toEqual("ok"); +}); + +import result from "./file.mjs"; +it("should load a module with hashbang", function () { + expect(result).toEqual("ok"); +}); diff --git a/test/cases/parsing/iife/a.js b/test/cases/parsing/iife/a.js new file mode 100644 index 00000000000..e4430e40aa4 --- /dev/null +++ b/test/cases/parsing/iife/a.js @@ -0,0 +1,4 @@ +export let a = 1e3; + +export function b() { a = 1e2 } +export function c() { a = 1e1 } diff --git a/test/cases/parsing/iife/index.js b/test/cases/parsing/iife/index.js new file mode 100644 index 00000000000..7c46e1bff76 --- /dev/null +++ b/test/cases/parsing/iife/index.js @@ -0,0 +1,10 @@ +import { a } from './a'; +import { track1, track2 } from './side-effect-call'; + +it("should parse params", () => { + expect(a).toBe(1000); + track1(); + expect(a).toBe(100); + track2(); + expect(a).toBe(10); +}); diff --git a/test/cases/parsing/iife/side-effect-call.js b/test/cases/parsing/iife/side-effect-call.js new file mode 100644 index 00000000000..08bef1211ae --- /dev/null +++ b/test/cases/parsing/iife/side-effect-call.js @@ -0,0 +1,9 @@ +import { b, c } from './a' + +export function track1() { + (function (a = b()) {})() +} + +export function track2() { + ((a = c()) => {})() +} diff --git a/test/cases/parsing/iife/test.filter.js b/test/cases/parsing/iife/test.filter.js new file mode 100644 index 00000000000..ca1b2511b77 --- /dev/null +++ b/test/cases/parsing/iife/test.filter.js @@ -0,0 +1,4 @@ +module.exports = function (config) { + // TODO fails due to minimizer bug: https://github.com/terser/terser/issues/880 + return !config.minimize; +}; diff --git a/test/cases/parsing/import-define/index.js b/test/cases/parsing/import-define/index.js new file mode 100644 index 00000000000..10db43f27d5 --- /dev/null +++ b/test/cases/parsing/import-define/index.js @@ -0,0 +1,12 @@ +import define from "./module"; + +const i = x => x; + +it("should allow to import a variable named define (call)", () => { + expect(define()).toBe("ok"); +}); + +it("should allow to import a variable named define (expression)", () => { + const d = i(define); + expect(d()).toBe("ok"); +}); diff --git a/test/cases/parsing/import-define/module.js b/test/cases/parsing/import-define/module.js new file mode 100644 index 00000000000..4d12cdeea55 --- /dev/null +++ b/test/cases/parsing/import-define/module.js @@ -0,0 +1,3 @@ +export const define = () => "ok"; + +export { define as default }; diff --git a/test/cases/parsing/inject-free-vars/fail.js b/test/cases/parsing/inject-free-vars/fail.js deleted file mode 100644 index 3d566b49076..00000000000 --- a/test/cases/parsing/inject-free-vars/fail.js +++ /dev/null @@ -1 +0,0 @@ -throw new Error("Fail"); \ No newline at end of file diff --git a/test/cases/parsing/inject-free-vars/index.js b/test/cases/parsing/inject-free-vars/index.js deleted file mode 100644 index 043b3e4f38d..00000000000 --- a/test/cases/parsing/inject-free-vars/index.js +++ /dev/null @@ -1,18 +0,0 @@ -it("should inject the module object into a chunk (AMD1)", function(done) { - require([], function() { - expect(module.webpackPolyfill).toBe(1); - done(); - }); -}); - -it("should inject the module object into a chunk (AMD2)", function() { - require([module.webpackPolyfill ? "./x1" : "./fail"]); - expect(module.webpackPolyfill).toBe(1); -}); - -it("should inject the module object into a chunk (ensure)", function(done) { - require.ensure([], function(require) { - expect(module.webpackPolyfill).toBe(1); - done(); - }); -}); diff --git a/test/cases/parsing/issue-11283/A.js b/test/cases/parsing/issue-11283/A.js new file mode 100644 index 00000000000..0ff2171d4c7 --- /dev/null +++ b/test/cases/parsing/issue-11283/A.js @@ -0,0 +1 @@ +export default "B"; diff --git a/test/cases/parsing/issue-11283/index.js b/test/cases/parsing/issue-11283/index.js new file mode 100644 index 00000000000..2aef188b65c --- /dev/null +++ b/test/cases/parsing/issue-11283/index.js @@ -0,0 +1,36 @@ +import A from "./A.js"; + +function magicA() { + // To be sure that future optimization + // will not affect test suite + return String.fromCharCode(65); +} + +it("should parse switch case properly", () => { + switch (1) { + case 2: + case 1: + const A = magicA(); + expect(A).toBe("A"); + break; + } + + switch (1) { + case 2: + case 1: { + const A = magicA(); + expect(A).toBe("A"); + break; + } + } +}); + +it("should share block scope for several cases", () => { + switch (1) { + case 1: + const A = magicA(); + case 2: + expect(A).toBe("A"); + break; + } +}); diff --git a/test/cases/parsing/issue-11353/async_generator_function.js b/test/cases/parsing/issue-11353/async_generator_function.js new file mode 100644 index 00000000000..e89057560e0 --- /dev/null +++ b/test/cases/parsing/issue-11353/async_generator_function.js @@ -0,0 +1,10 @@ +"use strict"; + +export default async function* asyncIdMaker(start = 1, end = 5){ + for (let i = start; i <= end; i++) { + + await new Promise(resolve => setTimeout(resolve, 1000)); + + yield i; + } +} diff --git a/test/cases/parsing/issue-11353/generator_function.js b/test/cases/parsing/issue-11353/generator_function.js new file mode 100644 index 00000000000..d257e83f99f --- /dev/null +++ b/test/cases/parsing/issue-11353/generator_function.js @@ -0,0 +1,7 @@ +"use strict"; + +export default function* idMaker(){ + var index = 0; + while(true) + yield index++; +} diff --git a/test/cases/parsing/issue-11353/index.js b/test/cases/parsing/issue-11353/index.js new file mode 100644 index 00000000000..07c01372a59 --- /dev/null +++ b/test/cases/parsing/issue-11353/index.js @@ -0,0 +1,36 @@ +"use strict"; + +import generator from "./generator_function.js"; +import asyncGenerator from "./async_generator_function"; + +it('should correctly import generator function', () => { + expect(typeof generator).toBe("function"); +}); + +it('should correctly build the correct function string', () => { + expect(generator.toString().indexOf('function*')).toBe(0); // 0 +}); + +it('should correctly provide the generator function interface', () => { + let gen = generator(); + expect(gen.next().value).toBe(0); + expect(gen.next().value).toBe(1); + expect(gen.next().value).toBe(2); +}); + +it('should correctly import async generator function', () => { + expect(typeof asyncGenerator).toBe("function"); +}); + +it('should correctly build the correct async function string', () => { + expect(asyncGenerator.toString().indexOf('async function*')).toBe(0); +}); + +it('should correctly provide the async generator function interface', async () => { + let gen = asyncGenerator(1, 5); + let start = 0; + for await (let value of gen) { + start += 1; + expect(value).toBe(start); + } +}); diff --git a/test/cases/parsing/issue-12769/index.js b/test/cases/parsing/issue-12769/index.js new file mode 100644 index 00000000000..54b864932b5 --- /dev/null +++ b/test/cases/parsing/issue-12769/index.js @@ -0,0 +1,19 @@ +import value from "./module"; +import { func } from "./other"; + +function F({ value2 = value }) { + expect(value2).toBe(42); +} + +it("should not apply shorthand code in default values", () => { + const { value2 = value } = {}; + expect(value2).toBe(42); + (function ({ value3 = value }) { + expect(value3).toBe(42); + })({}); + function F({ value3 = value }) { + expect(value3).toBe(42); + } + F({}); + expect(func({})).toBe(2); +}); diff --git a/test/cases/parsing/issue-12769/module.js b/test/cases/parsing/issue-12769/module.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/cases/parsing/issue-12769/module.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/cases/parsing/issue-12769/other.js b/test/cases/parsing/issue-12769/other.js new file mode 100644 index 00000000000..17cac3da8bb --- /dev/null +++ b/test/cases/parsing/issue-12769/other.js @@ -0,0 +1,7 @@ +var value = 2; + +export function func({ value2 = value }) { + return value2; +} + +console.log.bind(console, value); diff --git a/test/cases/parsing/issue-14610/index.js b/test/cases/parsing/issue-14610/index.js new file mode 100644 index 00000000000..bdbeb6fbdc2 --- /dev/null +++ b/test/cases/parsing/issue-14610/index.js @@ -0,0 +1,4 @@ +it("should keep parentheses when replacing", () => { + // prettier-ignore + expect(new (require("./module")).Thing(42).property).toBe(42) +}); diff --git a/test/cases/parsing/issue-14610/module.js b/test/cases/parsing/issue-14610/module.js new file mode 100644 index 00000000000..d532367112a --- /dev/null +++ b/test/cases/parsing/issue-14610/module.js @@ -0,0 +1,5 @@ +export class Thing { + constructor(p) { + this.property = p; + } +} diff --git a/test/cases/parsing/issue-16763/a.js b/test/cases/parsing/issue-16763/a.js new file mode 100644 index 00000000000..cc798ff50da --- /dev/null +++ b/test/cases/parsing/issue-16763/a.js @@ -0,0 +1 @@ +export const a = 1; diff --git a/test/cases/parsing/issue-16763/class.js b/test/cases/parsing/issue-16763/class.js new file mode 100644 index 00000000000..4f5ed245709 --- /dev/null +++ b/test/cases/parsing/issue-16763/class.js @@ -0,0 +1,82 @@ +import { a as C, a as B } from "./a.js"; + +let staticBlockValue; +let staticPrivateBlockValue; +let valueInStaticBlock; +let staticPrivateMethod; +let staticThis; + +let A = class C { + static name = "test"; + + otherName = C.name; + #privateName = C.name; + propertyB = B; + #propertyB = B; + + static otherName = C.name; + static #staticPrivateName = C.name; + static staticB = B; + static #staticB = B; + static #this = this; + static #thisAndC = C.#this; + + #privateMethod() { + return { privateName: this.#privateName, B } + } + publicMethod() { + const privateMethod = this.#privateMethod(); + + return { B, privateMethod, propertyB: this.propertyB, privatePropertyB: this.#propertyB } + } + test() { + return { className: C.name, propertyValue: this.otherName }; + } + static test() { + return C.name; + } + static getB() { + return B; + } + static #staticPrivateMethod() { + return { + staticB: this.staticB, + privateStaticB: this.#staticB, + B + }; + } + static { + staticBlockValue = C.name; + staticPrivateBlockValue = C.#staticPrivateName; + valueInStaticBlock = B; + staticPrivateMethod = C.#staticPrivateMethod(); + staticThis = C.#thisAndC; + } +}; + + +const b = function C() { + return C.name; +} + +const staticProperty = A.otherName; +const staticMethod = A.test(); +const staticB = A.getB(); +const method = new A().test(); +const publicMethod = new A().publicMethod(); +const reexport = C; +const functionName = b(); + +export { + staticBlockValue, + staticProperty, + staticMethod, + reexport, + method, + functionName, + publicMethod, + valueInStaticBlock, + staticB, + staticPrivateMethod, + staticThis +}; diff --git a/test/cases/parsing/issue-16763/index.js b/test/cases/parsing/issue-16763/index.js new file mode 100644 index 00000000000..1ca4c16d620 --- /dev/null +++ b/test/cases/parsing/issue-16763/index.js @@ -0,0 +1,22 @@ +import * as mod from "./class.js"; + +it('should correctly handle class methods and properties (include static)', () => { + expect(mod.staticBlockValue).toBe("test"); + expect(mod.staticProperty).toBe("test"); + expect(mod.staticMethod).toBe("test"); + expect(mod.reexport).toBe(1); + expect(mod.method.className).toBe("test"); + expect(mod.method.propertyValue).toBe("test"); + expect(typeof mod.functionName).toBe("string"); + expect(mod.publicMethod.B).toBe(1); + expect(mod.publicMethod.propertyB).toBe(1); + expect(mod.publicMethod.privatePropertyB).toBe(1); + expect(mod.publicMethod.privateMethod.privateName).toBe("test"); + expect(mod.publicMethod.privateMethod.B).toBe(1); + expect(mod.valueInStaticBlock).toBe(1); + expect(mod.staticB).toBe(1); + expect(mod.staticPrivateMethod.B).toBe(1); + expect(mod.staticPrivateMethod.staticB).toBe(1); + expect(mod.staticPrivateMethod.privateStaticB).toBe(1); + expect(mod.staticThis.name).toBe("test"); +}); diff --git a/test/cases/parsing/issue-16763/test.filter.js b/test/cases/parsing/issue-16763/test.filter.js new file mode 100644 index 00000000000..af5bacb6b77 --- /dev/null +++ b/test/cases/parsing/issue-16763/test.filter.js @@ -0,0 +1,5 @@ +const supportsClassStaticBlock = require("../../../helpers/supportsClassStaticBlock"); + +module.exports = function (config) { + return supportsClassStaticBlock(); +}; diff --git a/test/cases/parsing/issue-17189/index.js b/test/cases/parsing/issue-17189/index.js new file mode 100644 index 00000000000..15775cc183a --- /dev/null +++ b/test/cases/parsing/issue-17189/index.js @@ -0,0 +1,15 @@ +import module from "./module.js"; + +it("should parse sparse arrays", function() { + var { + a, + ...other1 + } = module; + var { + b, + ...other2 + } = module; + + expect(other1).toEqual({ b: 2, c: 3 }); + expect(other2).toEqual({ a: 1, c: 3 }); +}); diff --git a/test/cases/parsing/issue-17189/module.js b/test/cases/parsing/issue-17189/module.js new file mode 100644 index 00000000000..5831362066a --- /dev/null +++ b/test/cases/parsing/issue-17189/module.js @@ -0,0 +1,6 @@ +var test = { + a: 1, + b: 2, + c: 3 +}; +export default test; diff --git a/test/cases/parsing/issue-2006/errors.js b/test/cases/parsing/issue-2006/errors.js index 7936b2e9d73..2b82b710bf3 100644 --- a/test/cases/parsing/issue-2006/errors.js +++ b/test/cases/parsing/issue-2006/errors.js @@ -1,3 +1 @@ -module.exports = [ - [/Empty dependency/] -]; \ No newline at end of file +module.exports = [[/Empty dependency/]]; diff --git a/test/cases/parsing/issue-2522/test.filter.js b/test/cases/parsing/issue-2522/test.filter.js index b4b5c42560c..9cf8a63f9b6 100644 --- a/test/cases/parsing/issue-2522/test.filter.js +++ b/test/cases/parsing/issue-2522/test.filter.js @@ -1,5 +1,5 @@ -var supportsES6 = require("../../../helpers/supportsES6"); +const supportsES6 = require("../../../helpers/supportsES6"); -module.exports = function(config) { - return !config.minimize && supportsES6(); +module.exports = function (config) { + return supportsES6(); }; diff --git a/test/cases/parsing/issue-2523/test.filter.js b/test/cases/parsing/issue-2523/test.filter.js index b4b5c42560c..9cf8a63f9b6 100644 --- a/test/cases/parsing/issue-2523/test.filter.js +++ b/test/cases/parsing/issue-2523/test.filter.js @@ -1,5 +1,5 @@ -var supportsES6 = require("../../../helpers/supportsES6"); +const supportsES6 = require("../../../helpers/supportsES6"); -module.exports = function(config) { - return !config.minimize && supportsES6(); +module.exports = function (config) { + return supportsES6(); }; diff --git a/test/cases/parsing/issue-2600/errors.js b/test/cases/parsing/issue-2600/errors.js index 8894d7a69d5..9cd234c7331 100644 --- a/test/cases/parsing/issue-2600/errors.js +++ b/test/cases/parsing/issue-2600/errors.js @@ -1,3 +1 @@ -module.exports = [ - [/Can't resolve 'missing'/] -]; \ No newline at end of file +module.exports = [[/Can't resolve 'missing'/]]; diff --git a/test/cases/parsing/issue-2618/test.filter.js b/test/cases/parsing/issue-2618/test.filter.js index b4b5c42560c..9cf8a63f9b6 100644 --- a/test/cases/parsing/issue-2618/test.filter.js +++ b/test/cases/parsing/issue-2618/test.filter.js @@ -1,5 +1,5 @@ -var supportsES6 = require("../../../helpers/supportsES6"); +const supportsES6 = require("../../../helpers/supportsES6"); -module.exports = function(config) { - return !config.minimize && supportsES6(); +module.exports = function (config) { + return supportsES6(); }; diff --git a/test/cases/parsing/issue-2622/test.filter.js b/test/cases/parsing/issue-2622/test.filter.js index 92bb3f5232a..f9d5b096954 100644 --- a/test/cases/parsing/issue-2622/test.filter.js +++ b/test/cases/parsing/issue-2622/test.filter.js @@ -1,5 +1,5 @@ -var supportsDefaultArgs = require("../../../helpers/supportsDefaultArgs"); +const supportsDefaultArgs = require("../../../helpers/supportsDefaultArgs"); -module.exports = function(config) { - return !config.minimize && supportsDefaultArgs(); +module.exports = function (config) { + return supportsDefaultArgs(); }; diff --git a/test/cases/parsing/issue-2641/errors.js b/test/cases/parsing/issue-2641/errors.js index 01d80f2952d..4c8eabefcdb 100644 --- a/test/cases/parsing/issue-2641/errors.js +++ b/test/cases/parsing/issue-2641/errors.js @@ -1,3 +1 @@ -module.exports = [ - [/Module not found/, /Can't resolve '\.\/missingModule' /] -]; +module.exports = [[/Module not found/, /Can't resolve '\.\/missingModule' /]]; diff --git a/test/cases/parsing/issue-2895/test.filter.js b/test/cases/parsing/issue-2895/test.filter.js index 6bc6a7f95c8..ca76a1f9b13 100644 --- a/test/cases/parsing/issue-2895/test.filter.js +++ b/test/cases/parsing/issue-2895/test.filter.js @@ -1,5 +1,5 @@ -var supportsBlockScoping = require("../../../helpers/supportsBlockScoping"); +const supportsBlockScoping = require("../../../helpers/supportsBlockScoping"); -module.exports = function(config) { - return !config.minimize && supportsBlockScoping(); +module.exports = function (config) { + return supportsBlockScoping(); }; diff --git a/test/cases/parsing/issue-2942/warnings.js b/test/cases/parsing/issue-2942/warnings.js deleted file mode 100644 index 217c81ed03a..00000000000 --- a/test/cases/parsing/issue-2942/warnings.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = [ - [/System.register is not supported by webpack/], - [/System.get is not supported by webpack/], - [/System.set is not supported by webpack/], -]; diff --git a/test/cases/parsing/issue-3238/test.filter.js b/test/cases/parsing/issue-3238/test.filter.js index 1f395fdc059..8de5703b50f 100644 --- a/test/cases/parsing/issue-3238/test.filter.js +++ b/test/cases/parsing/issue-3238/test.filter.js @@ -1,5 +1,5 @@ -var supportsIteratorDestructuring = require("../../../helpers/supportsIteratorDestructuring"); +const supportsIteratorDestructuring = require("../../../helpers/supportsIteratorDestructuring"); -module.exports = function(config) { - return !config.minimize && supportsIteratorDestructuring(); +module.exports = function (config) { + return supportsIteratorDestructuring(); }; diff --git a/test/cases/parsing/issue-3252/test.filter.js b/test/cases/parsing/issue-3252/test.filter.js index e0de5a3709a..c69e762d0d0 100644 --- a/test/cases/parsing/issue-3252/test.filter.js +++ b/test/cases/parsing/issue-3252/test.filter.js @@ -1,5 +1,5 @@ -var supportsDefaultAssignment = require("../../../helpers/supportDefaultAssignment"); +const supportsDefaultAssignment = require("../../../helpers/supportDefaultAssignment"); -module.exports = function(config) { - return !config.minimize && supportsDefaultAssignment(); +module.exports = function (config) { + return supportsDefaultAssignment(); }; diff --git a/test/cases/parsing/issue-3273/test.filter.js b/test/cases/parsing/issue-3273/test.filter.js index 8f3d0bdcdb2..9732f4c201c 100644 --- a/test/cases/parsing/issue-3273/test.filter.js +++ b/test/cases/parsing/issue-3273/test.filter.js @@ -1,6 +1,6 @@ -var supportsDefaultAssignment = require("../../../helpers/supportDefaultAssignment"); -var supportsObjectDestructuring = require("../../../helpers/supportsObjectDestructuring"); +const supportsDefaultAssignment = require("../../../helpers/supportDefaultAssignment"); +const supportsObjectDestructuring = require("../../../helpers/supportsObjectDestructuring"); -module.exports = function(config) { - return !config.minimize && supportsDefaultAssignment() && supportsObjectDestructuring(); +module.exports = function (config) { + return supportsDefaultAssignment() && supportsObjectDestructuring(); }; diff --git a/test/cases/parsing/issue-4357/test.filter.js b/test/cases/parsing/issue-4357/test.filter.js index 1593528b3bc..79d4c70e76f 100644 --- a/test/cases/parsing/issue-4357/test.filter.js +++ b/test/cases/parsing/issue-4357/test.filter.js @@ -1,6 +1,6 @@ -var supportsIteratorDestructuring = require("../../../helpers/supportsIteratorDestructuring"); -var supportsObjectDestructuring = require("../../../helpers/supportsObjectDestructuring"); +const supportsIteratorDestructuring = require("../../../helpers/supportsIteratorDestructuring"); +const supportsObjectDestructuring = require("../../../helpers/supportsObjectDestructuring"); -module.exports = function(config) { - return !config.minimize && supportsIteratorDestructuring() && supportsObjectDestructuring(); +module.exports = function (config) { + return supportsIteratorDestructuring() && supportsObjectDestructuring(); }; diff --git a/test/cases/parsing/issue-4608-1-non-strict/index.js b/test/cases/parsing/issue-4608-1-non-strict/index.js new file mode 100644 index 00000000000..8ccf3291498 --- /dev/null +++ b/test/cases/parsing/issue-4608-1-non-strict/index.js @@ -0,0 +1,31 @@ +it("should find var declaration in control statements", function () { + var f = function (x) { + expect(x).toBe("fail"); + }; + + (function () { + with ({ a: 1 }) { + var require = f; + } + + require("fail"); + })(); +}); + +it("should find var declaration in control statements after usage", function () { + var f = function (x) { + expect(x).toBe("fail"); + }; + + (function () { + var test = function () { + require("fail"); + }; + + with ({ a: 1 }) { + var require = f; + } + + test(); + })(); +}); diff --git a/test/cases/parsing/issue-4608-1-non-strict/test.filter.js b/test/cases/parsing/issue-4608-1-non-strict/test.filter.js new file mode 100644 index 00000000000..d957820f37a --- /dev/null +++ b/test/cases/parsing/issue-4608-1-non-strict/test.filter.js @@ -0,0 +1,3 @@ +module.exports = function (config) { + return !config.module; +}; diff --git a/test/cases/parsing/issue-4608-1/index.js b/test/cases/parsing/issue-4608-1/index.js index 760ccdba7ce..181f01499a7 100644 --- a/test/cases/parsing/issue-4608-1/index.js +++ b/test/cases/parsing/issue-4608-1/index.js @@ -1,149 +1,142 @@ -it("should find var declaration later in code", function() { - expect((typeof require)).toBe("undefined"); +it("should find var declaration later in code", function () { + expect(typeof require).toBe("undefined"); var require; }); -it("should find var declaration in same statement", function() { - var fn = (function() { - require("fail"); - }), require; +it("should find var declaration in same statement", function () { + var fn = function () { + require("fail"); + }, + require; - require = (function(x) { + require = function (x) { expect(x).toBe("fail"); - }); + }; fn(); }); -it("should find a catch block declaration", function() { +it("should find a catch block declaration", function () { try { - var f = (function(x) { + var f = function (x) { expect(x).toBe("fail"); - }); + }; throw f; - } catch(require) { + } catch (require) { require("fail"); } }); -it("should find var declaration in control statements", function() { - var f = (function(x) { +it("should find var declaration in control statements", function () { + var f = function (x) { expect(x).toBe("fail"); - }); + }; - (function() { + (function () { { var require = f; } require("fail"); - }()); + })(); - (function() { + (function () { var i = 1; - while(i--) { + while (i--) { var require = f; } require("fail"); - }()); + })(); - (function() { + (function () { do { var require = f; - } while(false); - - require("fail"); - }()); - - (function() { - for(var i = 0; i < 1; i++) { - var require = f; - } + } while (false); require("fail"); - }()); + })(); - (function() { - for(var i in {a:1}) { + (function () { + for (var i = 0; i < 1; i++) { var require = f; } require("fail"); - }()); + })(); - (function() { - with({ a: 1 }) { + (function () { + for (var i in { a: 1 }) { var require = f; } require("fail"); - }()); + })(); }); -it("should find var declaration in control statements after usage", function() { - var f = (function(x) { +it("should find var declaration in control statements after usage", function () { + var f = function (x) { expect(x).toBe("fail"); - }); + }; - (function() { - var test = (function() { require("fail"); }); + (function () { + var test = function () { + require("fail"); + }; { var require = f; } test(); - }()); + })(); - (function() { - var test = (function() { require("fail"); }); + (function () { + var test = function () { + require("fail"); + }; var i = 1; - while(i--) { + while (i--) { var require = f; } test(); - }()); + })(); - (function() { - var test = (function() { require("fail"); }); + (function () { + var test = function () { + require("fail"); + }; do { var require = f; - } while(false); - - test(); - }()); - - (function() { - var test = (function() { require("fail"); }); - - for(var i = 0; i < 1; i++) { - var require = f; - } + } while (false); test(); - }()); + })(); - (function() { - var test = (function() { require("fail"); }); + (function () { + var test = function () { + require("fail"); + }; - for(var i in {a:1}) { + for (var i = 0; i < 1; i++) { var require = f; } test(); - }()); + })(); - (function() { - var test = (function() { require("fail"); }); + (function () { + var test = function () { + require("fail"); + }; - with({ a: 1 }) { + for (var i in { a: 1 }) { var require = f; } test(); - }()); + })(); }); diff --git a/test/cases/parsing/issue-4608-2/test.filter.js b/test/cases/parsing/issue-4608-2/test.filter.js index 0a661357de9..752ae650e17 100644 --- a/test/cases/parsing/issue-4608-2/test.filter.js +++ b/test/cases/parsing/issue-4608-2/test.filter.js @@ -1,5 +1,5 @@ -var supportsForOf = require("../../../helpers/supportsForOf"); +const supportsForOf = require("../../../helpers/supportsForOf"); -module.exports = function(config) { - return !config.minimize && supportsForOf(); +module.exports = function (config) { + return supportsForOf(); }; diff --git a/test/cases/parsing/issue-4870/index.js b/test/cases/parsing/issue-4870/index.js index 2e1700560a2..c67767c046c 100644 --- a/test/cases/parsing/issue-4870/index.js +++ b/test/cases/parsing/issue-4870/index.js @@ -1,13 +1,13 @@ import { test } from "./file"; -it("should allow import in array destructing", function() { +it("should allow import in array destructuring", function () { var other; [other = test] = []; expect(other).toBe("test"); }); -it("should allow import in object destructing", function() { +it("should allow import in object destructuring", function () { var other; - ({other = test} = {}); + ({ other = test } = {}); expect(other).toBe("test"); }); diff --git a/test/cases/parsing/issue-4870/test.filter.js b/test/cases/parsing/issue-4870/test.filter.js index f4216934be7..a78e1dd9f14 100644 --- a/test/cases/parsing/issue-4870/test.filter.js +++ b/test/cases/parsing/issue-4870/test.filter.js @@ -1,6 +1,6 @@ -var supportsIteratorDestructuring = require("../../../helpers/supportsIteratorDestructuring"); -var supportsObjectDestructuring = require("../../../helpers/supportsObjectDestructuring"); +const supportsIteratorDestructuring = require("../../../helpers/supportsIteratorDestructuring"); +const supportsObjectDestructuring = require("../../../helpers/supportsObjectDestructuring"); -module.exports = function(config) { - return !config.minimize && supportsObjectDestructuring() && supportsIteratorDestructuring(); +module.exports = function (config) { + return supportsObjectDestructuring() && supportsIteratorDestructuring(); }; diff --git a/test/cases/parsing/issue-494/index.js b/test/cases/parsing/issue-494/index.js deleted file mode 100644 index f50a3046921..00000000000 --- a/test/cases/parsing/issue-494/index.js +++ /dev/null @@ -1,5 +0,0 @@ -it("should replace a free var in a IIFE", function() { - (function(md) { - expect(md).toBeTypeOf("function"); - }(module.deprecate)); -}); diff --git a/test/cases/parsing/issue-627/warnings.js b/test/cases/parsing/issue-627/warnings.js index ea6102af436..f1a4bb46d11 100644 --- a/test/cases/parsing/issue-627/warnings.js +++ b/test/cases/parsing/issue-627/warnings.js @@ -1,3 +1 @@ -module.exports = [ - [/Critical dependency/] -]; +module.exports = [[/Critical dependency/]]; diff --git a/test/cases/parsing/issue-7519/a.js b/test/cases/parsing/issue-7519/a.js new file mode 100644 index 00000000000..3df259fa7ba --- /dev/null +++ b/test/cases/parsing/issue-7519/a.js @@ -0,0 +1,20 @@ +export let count = 1; + +export function inc() { + count++; +} + +export function incTruthy() { + count++; + return true; +} + +export function mult(n) { + count *= n; +} + +export function setCount(c) { + count = c; +} + +export const multUsed = __webpack_exports_info__.mult.used; diff --git a/test/cases/parsing/issue-7519/index.js b/test/cases/parsing/issue-7519/index.js new file mode 100644 index 00000000000..2c25bebe550 --- /dev/null +++ b/test/cases/parsing/issue-7519/index.js @@ -0,0 +1,38 @@ +import { + count, + mult, + inc, + incTruthy, + setCount, + multUsed, + incUsed +} from "./a"; + +it("logical 'and' should work", () => { + setCount(1); + inc() && "true" && 0 && mult(2); + expect(count).toBe(2); + inc() && false && mult(2); + expect(count).toBe(3); + true && inc() && inc() && false && mult(2); + /* inc itself returns undefined */ + expect(count).toBe(4); + true && incTruthy() && incTruthy() && false && mult(2); + expect(count).toBe(6); +}); + +it("logical 'or' should work", () => { + setCount(1); + false || "" || inc(); + expect(count).toBe(2); + (0 || "" || inc() || inc()) && false && mult(2); + expect(count).toBe(4); +}); + +it("mult should not be used", () => { + if (inc() && true && false) { + mult(2); + } + + expect(multUsed).toBe(false); +}); diff --git a/test/cases/parsing/issue-7519/test.filter.js b/test/cases/parsing/issue-7519/test.filter.js new file mode 100644 index 00000000000..49ac5066bb8 --- /dev/null +++ b/test/cases/parsing/issue-7519/test.filter.js @@ -0,0 +1,3 @@ +module.exports = function (config) { + return config.mode !== "development"; +}; diff --git a/test/cases/parsing/issue-758/errors.js b/test/cases/parsing/issue-758/errors.js index 01d80f2952d..4c8eabefcdb 100644 --- a/test/cases/parsing/issue-758/errors.js +++ b/test/cases/parsing/issue-758/errors.js @@ -1,3 +1 @@ -module.exports = [ - [/Module not found/, /Can't resolve '\.\/missingModule' /] -]; +module.exports = [[/Module not found/, /Can't resolve '\.\/missingModule' /]]; diff --git a/test/cases/parsing/issue-758/index.js b/test/cases/parsing/issue-758/index.js index 01ac1344e2d..0ca356dbb16 100644 --- a/test/cases/parsing/issue-758/index.js +++ b/test/cases/parsing/issue-758/index.js @@ -51,8 +51,8 @@ it("should not call error callback on exception thrown in require callback", fun }); it("should call error callback when there is an error loading the chunk", function(done) { - var temp = __webpack_require__.e; - __webpack_require__.e = function() { return Promise.resolve().then(function() { throw 'fake chunk load error'; }); }; + var temp = __webpack_chunk_load__; + __webpack_chunk_load__ = function() { return Promise.resolve().then(function() { throw 'fake chunk load error'; }); }; require.ensure(['./file'], function(){ try { var file = require('./file'); @@ -61,5 +61,5 @@ it("should call error callback when there is an error loading the chunk", functi expect(error).toBe('fake chunk load error'); done(); }); - __webpack_require__.e = temp; + __webpack_chunk_load__ = temp; }); diff --git a/test/cases/parsing/issue-8874/index.js b/test/cases/parsing/issue-8874/index.js new file mode 100644 index 00000000000..68869efb1a6 --- /dev/null +++ b/test/cases/parsing/issue-8874/index.js @@ -0,0 +1,20 @@ +import myFunction from './module'; +import myFunctionDefaultParameter from './moduleDefaultParameter'; +import myFunctionExportedFunctionExpression from './moduleExportedFunctionExpression'; +import myFunctionExportedFunctionExpressionDefaultParameter from './moduleExportedFunctionExpressionDefaultParameter'; + +it('should execute IIFE twice', () => { + expect(myFunction()).toBe(2); +}); + +it('should execute IIFE twice when using IIFE function name as default parameter', () => { + expect(myFunctionDefaultParameter()).toBe(2); +}); + +it('should execute Function Expression twice', () => { + expect(myFunctionExportedFunctionExpression()).toBe(2); +}); + +it('should execute Function Expression twice when using IIFE function name as default parameter', () => { + expect(myFunctionExportedFunctionExpressionDefaultParameter()).toBe(2); +}); diff --git a/test/cases/parsing/issue-8874/module.js b/test/cases/parsing/issue-8874/module.js new file mode 100644 index 00000000000..4ed8ee18eca --- /dev/null +++ b/test/cases/parsing/issue-8874/module.js @@ -0,0 +1,15 @@ +import someFunction from './someFunction'; + +export default function myFunction() { + let iifeExecutionCount = 0; + + (function someFunction (recurse) { + iifeExecutionCount++; + + if (recurse) { + someFunction(false); + } + })(true); + + return iifeExecutionCount; +} diff --git a/test/cases/parsing/issue-8874/moduleDefaultParameter.js b/test/cases/parsing/issue-8874/moduleDefaultParameter.js new file mode 100644 index 00000000000..c95b4896873 --- /dev/null +++ b/test/cases/parsing/issue-8874/moduleDefaultParameter.js @@ -0,0 +1,13 @@ +export default function myFunction() { + let iifeExecutionCount = 0; + + (function someFunction (recurse, recurseFunction = someFunction) { + iifeExecutionCount++; + + if (recurse) { + recurseFunction(false); + } + })(true); + + return iifeExecutionCount; +} diff --git a/test/cases/parsing/issue-8874/moduleExportedFunctionExpression.js b/test/cases/parsing/issue-8874/moduleExportedFunctionExpression.js new file mode 100644 index 00000000000..28de2647879 --- /dev/null +++ b/test/cases/parsing/issue-8874/moduleExportedFunctionExpression.js @@ -0,0 +1,9 @@ +import someFunction from './someFunction'; + +export default (function someFunction (recurse = true) { + if (recurse) { + return 1 + someFunction(false); + } + + return 1; +}); diff --git a/test/cases/parsing/issue-8874/moduleExportedFunctionExpressionDefaultParameter.js b/test/cases/parsing/issue-8874/moduleExportedFunctionExpressionDefaultParameter.js new file mode 100644 index 00000000000..5afc3011c0f --- /dev/null +++ b/test/cases/parsing/issue-8874/moduleExportedFunctionExpressionDefaultParameter.js @@ -0,0 +1,10 @@ + +import someFunction from './someFunction'; + +export default (function someFunction (recurse = true, recurseFunction = someFunction) { + if (recurse) { + return 1 + recurseFunction(false); + } + + return 1; +}); diff --git a/test/cases/parsing/issue-8874/someFunction.js b/test/cases/parsing/issue-8874/someFunction.js new file mode 100644 index 00000000000..4e46c481b73 --- /dev/null +++ b/test/cases/parsing/issue-8874/someFunction.js @@ -0,0 +1,3 @@ +export default function someFunction () { + return -1; +} diff --git a/test/cases/parsing/issue-9817/index.js b/test/cases/parsing/issue-9817/index.js new file mode 100644 index 00000000000..41eb7d781fe --- /dev/null +++ b/test/cases/parsing/issue-9817/index.js @@ -0,0 +1,27 @@ +import lower from "./lo"; + +const tests = { + "simple template": () => import(`./langs/${lower("EN")}`), + "double template": () => import(`./langs/${lower("E")}${lower("N")}`), + "template with prefix": () => import(`./langs/${lower("EN")}.js`), + "double template with prefix": () => + import(`./langs/${lower("E")}${lower("N")}.js`), + "simple concat": () => import("./langs/".concat(lower("EN"))), + "double concat": () => import("./langs/".concat(lower("E"), lower("N"))), + "concat with prefix": () => import("./langs/".concat(lower("EN"), ".js")), + "double concat with prefix": () => + import("./langs/".concat(lower("E"), lower("N"), ".js")), + "simple plus": () => import("./langs/" + lower("EN")), + "double plus": () => import("./langs/" + lower("E") + lower("N")), + "plus with prefix": () => import("./langs/" + lower("EN") + ".js"), + "double plus with prefix": () => + import("./langs/" + lower("E") + lower("N") + ".js") +}; + +for (const name of Object.keys(tests)) { + it(`should handle imports in ${name} strings`, () => { + return tests[name]().then(module => { + expect(module.default).toBe("en"); + }); + }); +} diff --git a/test/cases/parsing/issue-9817/langs/en.js b/test/cases/parsing/issue-9817/langs/en.js new file mode 100644 index 00000000000..8665705472b --- /dev/null +++ b/test/cases/parsing/issue-9817/langs/en.js @@ -0,0 +1 @@ +export default "en"; diff --git a/test/cases/parsing/issue-9817/lo.js b/test/cases/parsing/issue-9817/lo.js new file mode 100644 index 00000000000..b3eeba1f0e8 --- /dev/null +++ b/test/cases/parsing/issue-9817/lo.js @@ -0,0 +1 @@ +export default str => str.toLowerCase(); diff --git a/test/cases/parsing/local-modules/index.js b/test/cases/parsing/local-modules/index.js index 8eae3c39664..919536e0430 100644 --- a/test/cases/parsing/local-modules/index.js +++ b/test/cases/parsing/local-modules/index.js @@ -1,10 +1,10 @@ -it("should define and require a local module", function() { +it("should define and require a local module", function () { module.exports = "not set"; - define("my-module", function() { + define("my-module", function () { return 1234; }); expect(module.exports).toBe("not set"); - define(["my-module"], function(myModule) { + define(["my-module"], function (myModule) { expect(myModule).toBe(1234); return 2345; }); @@ -13,29 +13,29 @@ it("should define and require a local module", function() { require(["my-module"]); }); -it("should not create a chunk for a AMD require to a local module", function(done) { - define("my-module2", function() { +it("should not create a chunk for a AMD require to a local module", function (done) { + define("my-module2", function () { return 1235; }); var sync = false; - require(["my-module2"], function(myModule2) { + require(["my-module2"], function (myModule2) { expect(myModule2).toBe(1235); sync = true; }); - setImmediate(function() { + setImmediate(function () { expect(sync).toBe(true); done(); }); }); -it("should define and require a local module with deps", function() { +it("should define and require a local module with deps", function () { module.exports = "not set"; - define("my-module3", ["./dep"], function(dep) { + define("my-module3", ["./dep"], function (dep) { expect(dep).toBe("dep"); return 1234; }); expect(module.exports).toBe("not set"); - define("my-module4", ["my-module3", "./dep"], function(myModule, dep) { + define("my-module4", ["my-module3", "./dep"], function (myModule, dep) { expect(dep).toBe("dep"); expect(myModule).toBe(1234); return 2345; @@ -46,16 +46,33 @@ it("should define and require a local module with deps", function() { }); it("should define and require a local module that is relative", function () { - define("my-dir/my-module3", function() { + define("my-dir/my-module3", function () { return 1234; }); - define("my-dir/my-other-dir/my-module4", function() { + define("my-dir/my-other-dir/my-module4", function () { return 2345; }); - define("my-dir/my-other-dir/my-module5", ["./my-module4", "../my-module3"], function(myModule4, myModule3) { + define("my-dir/my-other-dir/my-module5", [ + "./my-module4", + "../my-module3" + ], function (myModule4, myModule3) { expect(myModule3).toBe(1234); expect(myModule4).toBe(2345); return 3456; }); expect(require("my-dir/my-other-dir/my-module5")).toBe(3456); -}) +}); + +it("issue 12310", () => { + const obj = { ok: true }; + define("local-module1", obj); + const fn2 = () => ({ ok: true }); + define("local-module2", fn2); + const fn3 = m1 => { + return { m1 }; + }; + define("local-module3", ["local-module1"], fn3); + expect(require("local-module1")).toBe(obj); + expect(require("local-module2")).toEqual(obj); + expect(require("local-module3")).toEqual({ m1: obj }); +}); diff --git a/test/cases/parsing/logical-assignment/index.js b/test/cases/parsing/logical-assignment/index.js new file mode 100644 index 00000000000..c3dc2f77449 --- /dev/null +++ b/test/cases/parsing/logical-assignment/index.js @@ -0,0 +1,5 @@ +import f from "./module"; + +it("should support logical assignment", () => { + expect(f()).toBe(true); +}); diff --git a/test/cases/parsing/logical-assignment/module.js b/test/cases/parsing/logical-assignment/module.js new file mode 100644 index 00000000000..b1fec961eb8 --- /dev/null +++ b/test/cases/parsing/logical-assignment/module.js @@ -0,0 +1,7 @@ +export default function () { + var x = null; + x ??= true; + x &&= true; + x ||= false; + return x; +} diff --git a/test/cases/parsing/logical-assignment/test.filter.js b/test/cases/parsing/logical-assignment/test.filter.js new file mode 100644 index 00000000000..d9ee25da85e --- /dev/null +++ b/test/cases/parsing/logical-assignment/test.filter.js @@ -0,0 +1,5 @@ +const supportsLogicalAssignment = require("../../../helpers/supportsLogicalAssignment"); + +module.exports = function (config) { + return supportsLogicalAssignment(); +}; diff --git a/test/cases/parsing/meta-property/index.js b/test/cases/parsing/meta-property/index.js new file mode 100644 index 00000000000..e1573e8eeeb --- /dev/null +++ b/test/cases/parsing/meta-property/index.js @@ -0,0 +1,32 @@ +class A { + constructor() { + if (new.target === B) { + this.val = 2; + } else { + this.val = 1; + } + if (typeof new.target !== "function") { + this.val = 0; + } + if (typeof new.target.value !== "function") { + this.val = 0; + } + if (typeof new.target.unknown !== "undefined") { + this.val = 0; + } + if (!new.target.value) { + this.val = 0; + } + } + static value() {} +} + +class B extends A {} + +it("should respect meta property name", () => { + const b = new B(); + const a = new A(); + + expect(b.val).toBe(2); + expect(a.val).toBe(1); +}); diff --git a/test/cases/parsing/missing-export-warning-nested/a.js b/test/cases/parsing/missing-export-warning-nested/a.js new file mode 100644 index 00000000000..3aa4a771388 --- /dev/null +++ b/test/cases/parsing/missing-export-warning-nested/a.js @@ -0,0 +1,3 @@ +export const a = 42; +import * as x from "./b"; +export { x }; diff --git a/test/cases/parsing/missing-export-warning-nested/b.js b/test/cases/parsing/missing-export-warning-nested/b.js new file mode 100644 index 00000000000..9902cddc6a8 --- /dev/null +++ b/test/cases/parsing/missing-export-warning-nested/b.js @@ -0,0 +1,3 @@ +export const b = 42; +import * as y from "./c"; +export { y }; diff --git a/test/cases/parsing/missing-export-warning-nested/c.js b/test/cases/parsing/missing-export-warning-nested/c.js new file mode 100644 index 00000000000..912eec884e3 --- /dev/null +++ b/test/cases/parsing/missing-export-warning-nested/c.js @@ -0,0 +1,4 @@ +export const c = 42; +import * as z from "./d"; +import * as Z from "./e"; +export { z, Z }; diff --git a/test/cases/parsing/missing-export-warning-nested/d.js b/test/cases/parsing/missing-export-warning-nested/d.js new file mode 100644 index 00000000000..ab66c514780 --- /dev/null +++ b/test/cases/parsing/missing-export-warning-nested/d.js @@ -0,0 +1 @@ +exports.d = 42; diff --git a/test/cases/parsing/missing-export-warning-nested/e.js b/test/cases/parsing/missing-export-warning-nested/e.js new file mode 100644 index 00000000000..b2c99f44f01 --- /dev/null +++ b/test/cases/parsing/missing-export-warning-nested/e.js @@ -0,0 +1,3 @@ +module.exports = (() => { + return undefined; +})(); diff --git a/test/cases/parsing/missing-export-warning-nested/index.js b/test/cases/parsing/missing-export-warning-nested/index.js new file mode 100644 index 00000000000..42bf73dd556 --- /dev/null +++ b/test/cases/parsing/missing-export-warning-nested/index.js @@ -0,0 +1,14 @@ +import * as m from "./a"; + +if (Math.random() < 0) { + m.A; + m.x.B; + m.x.y.C; + m.x.y.z.D; + m.x.y.Z.D; + m.x.y.z.v.E; + m.x.y.Z.v.E; + m.p.r.q; +} + +it("should emit the correct warnings", () => {}); diff --git a/test/cases/parsing/missing-export-warning-nested/warnings.js b/test/cases/parsing/missing-export-warning-nested/warnings.js new file mode 100644 index 00000000000..fd18632ce2f --- /dev/null +++ b/test/cases/parsing/missing-export-warning-nested/warnings.js @@ -0,0 +1,20 @@ +module.exports = [ + [ + /export 'A' \(imported as 'm'\) was not found in '.\/a' \(possible exports: a, x\)/ + ], + [ + /export 'x'.'B' \(imported as 'm'\) was not found in '.\/a' \(possible exports: b, y\)/ + ], + [ + /export 'x'.'y'.'C' \(imported as 'm'\) was not found in '.\/a' \(possible exports: Z, c, z\)/ + ], + [ + /export 'x'.'y'.'z'.'D' \(imported as 'm'\) was not found in '.\/a' \(possible exports: default, d\)/ + ], + [ + /export 'x'.'y'.'z'.'v' \(imported as 'm'\) was not found in '.\/a' \(possible exports: default, d\)/ + ], + [ + /export 'p' \(imported as 'm'\) was not found in '.\/a' \(possible exports: a, x\)/ + ] +]; diff --git a/test/cases/parsing/nullish-coalescing/a.js b/test/cases/parsing/nullish-coalescing/a.js new file mode 100644 index 00000000000..bd816eaba4c --- /dev/null +++ b/test/cases/parsing/nullish-coalescing/a.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/test/cases/parsing/nullish-coalescing/b.js b/test/cases/parsing/nullish-coalescing/b.js new file mode 100644 index 00000000000..92fde1f2ba2 --- /dev/null +++ b/test/cases/parsing/nullish-coalescing/b.js @@ -0,0 +1 @@ +throw new Error(); diff --git a/test/cases/parsing/nullish-coalescing/index.js b/test/cases/parsing/nullish-coalescing/index.js new file mode 100644 index 00000000000..a45c81a6a6d --- /dev/null +++ b/test/cases/parsing/nullish-coalescing/index.js @@ -0,0 +1,19 @@ +it("should parse nullish coalescing correctly", () => { + let result; + + if ((null ?? false) === null) { + result = require("./b"); + } else if ((0 ?? false) === 0) { + result = require("./a"); + } + + expect(result).toBe(1); +}); + +it("should evaluate module.hot to nullish", () => { + if (module.hot) { + module.hot ?? require("fail"); + } else { + (module.hot ?? 123) !== 123 && require("fail"); + } +}); diff --git a/test/cases/parsing/nullish-coalescing/test.filter.js b/test/cases/parsing/nullish-coalescing/test.filter.js new file mode 100644 index 00000000000..90bebcad9fe --- /dev/null +++ b/test/cases/parsing/nullish-coalescing/test.filter.js @@ -0,0 +1,5 @@ +const supportsNullishCoalescing = require("../../../helpers/supportsNullishCoalescing"); + +module.exports = function (config) { + return supportsNullishCoalescing(); +}; diff --git a/test/cases/parsing/optional-catch-binding/test.filter.js b/test/cases/parsing/optional-catch-binding/test.filter.js index a09b8642687..5e7d911be6e 100644 --- a/test/cases/parsing/optional-catch-binding/test.filter.js +++ b/test/cases/parsing/optional-catch-binding/test.filter.js @@ -1,6 +1,6 @@ const supportsOptionalCatchBinding = require("../../../helpers/supportsOptionalCatchBinding"); -module.exports = function(config) { +module.exports = function (config) { // XXX: Disable this test if Terser is used because it does not support ES 2019 if (config.mode === "production") { return false; diff --git a/test/cases/parsing/optional-chaining/a.js b/test/cases/parsing/optional-chaining/a.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/cases/parsing/optional-chaining/b.js b/test/cases/parsing/optional-chaining/b.js new file mode 100644 index 00000000000..5fe49d553b2 --- /dev/null +++ b/test/cases/parsing/optional-chaining/b.js @@ -0,0 +1,3 @@ +export default {}; +export * as a from "./c"; +export const call = () => ({ c: 1 }); diff --git a/test/cases/parsing/optional-chaining/c.js b/test/cases/parsing/optional-chaining/c.js new file mode 100644 index 00000000000..c37f7387e3e --- /dev/null +++ b/test/cases/parsing/optional-chaining/c.js @@ -0,0 +1,2 @@ +const call = () => 2; +export { call }; diff --git a/test/cases/parsing/optional-chaining/index.js b/test/cases/parsing/optional-chaining/index.js new file mode 100644 index 00000000000..0d48ae94dd1 --- /dev/null +++ b/test/cases/parsing/optional-chaining/index.js @@ -0,0 +1,27 @@ +import b, * as bb from "./b"; + +it("should keep optional chaining", () => { + expect(b?.a?.a).toBe(undefined); + expect(b?.a).toBe(undefined); + expect(typeof bb?.a).toBe("object"); + expect(bb.call?.().c).toBe(1); + expect(bb.call?.().b?.a).toBe(undefined); + expect(bb.a?.call()).toBe(2); + expect(bb.a?.c?.b).toBe(undefined); +}); + +it("should evaluate optional members", () => { + if (!module.hot) { + expect( + module.hot?.accept((() => {throw new Error("fail")})()) + ).toBe(undefined); + } +}); + +it("should evaluate optional chaining as a part of statement", () => { + if (module.hot?.accept) { + module.hot?.accept("./a.js"); + } else { + expect(module.hot).toBe(undefined); + } +}); diff --git a/test/cases/parsing/optional-chaining/test.filter.js b/test/cases/parsing/optional-chaining/test.filter.js new file mode 100644 index 00000000000..a5caf1901f1 --- /dev/null +++ b/test/cases/parsing/optional-chaining/test.filter.js @@ -0,0 +1,5 @@ +const supportsOptionalChaining = require("../../../helpers/supportsOptionalChaining"); + +module.exports = function (config) { + return !config.minimize && supportsOptionalChaining(); +}; diff --git a/test/cases/parsing/precreated-ast/ast-loader.js b/test/cases/parsing/precreated-ast/ast-loader.js index de009844f8c..add7af8cc9e 100644 --- a/test/cases/parsing/precreated-ast/ast-loader.js +++ b/test/cases/parsing/precreated-ast/ast-loader.js @@ -1,23 +1,33 @@ "use strict"; const acorn = require("acorn"); -const acornParser = acorn.Parser.extend(require("acorn-dynamic-import").default); +const acornParser = acorn.Parser; -module.exports = function(source) { +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { + /** @type {TODO} */ const comments = []; + + const semicolons = new Set(); const ast = acornParser.parse(source, { ranges: true, locations: true, - ecmaVersion: 2017, + ecmaVersion: 11, sourceType: "module", - onComment: comments + onComment: comments, + onInsertedSemicolon: (pos) => semicolons.add(pos) }); // change something to test if it's really used + //@ts-ignore ast.body[0].expression.right.arguments[0].value = "./ok"; - ast.body[0].expression.right.arguments[0].raw = "\"./ok\""; + //@ts-ignore + ast.body[0].expression.right.arguments[0].raw = '"./ok"'; + //@ts-ignore ast.comments = comments; + //@ts-ignore + ast.semicolons = semicolons; this.callback(null, source, null, { webpackAST: ast }); diff --git a/test/cases/parsing/requirejs/index.js b/test/cases/parsing/requirejs/index.js deleted file mode 100644 index 93ee59899d7..00000000000 --- a/test/cases/parsing/requirejs/index.js +++ /dev/null @@ -1,20 +0,0 @@ -it("should ignore require.config", function() { - require.config({ - - }); - requirejs.config({ - - }); -}); -it("should have a require.version", function() { - expect(require.version).toBeTypeOf("string"); -}); -it("should have a requirejs.onError function", function() { - function f(){} - expect(requirejs.onError).toBeTypeOf("function"); // has default handler - var org = requirejs.onError; - requirejs.onError = f; - expect(requirejs.onError).toBe(f); - requirejs.onError = org; - require(["./file.js"], function() {}); -}); diff --git a/test/cases/parsing/sequence-expression-asi/a.js b/test/cases/parsing/sequence-expression-asi/a.js new file mode 100644 index 00000000000..9549e18a567 --- /dev/null +++ b/test/cases/parsing/sequence-expression-asi/a.js @@ -0,0 +1,3 @@ +export const fn = (num) => { + return num; +}; diff --git a/test/cases/parsing/sequence-expression-asi/index.js b/test/cases/parsing/sequence-expression-asi/index.js new file mode 100644 index 00000000000..540ac012c81 --- /dev/null +++ b/test/cases/parsing/sequence-expression-asi/index.js @@ -0,0 +1,21 @@ +import { fn } from "./a" + +function d() {} + +var num = 1 +d(), fn(); + +export const b = 2 +d(), fn(); + +export default (function Foo() {}) +d(), fn(); + +export const c = 3 +function foo() { + d(), fn(); +} + +it("should work", function() { + expect(fn(num)).toBe(1); +}); diff --git a/test/cases/parsing/spread/index.js b/test/cases/parsing/spread/index.js index 5a94cdea8bb..17369fd5bba 100644 --- a/test/cases/parsing/spread/index.js +++ b/test/cases/parsing/spread/index.js @@ -8,4 +8,11 @@ it("should support spread operator", function() { expect(o2).toEqual({ X: { A: "A", B: "B" } }); var o3 = { ...M }; expect(o3).toEqual({ default: { A: "A", B: "B" }, A: "A", B: "B" }); + const test = [1, 2, 3]; + expect( + (function(a, b, c) { return test; }(...test)) + ).toEqual([1, 2 ,3]); + expect( + (function(a, b, c) { return test; }.call(...test)) + ).toEqual([1, 2 ,3]); }); diff --git a/test/cases/parsing/spread/test.filter.js b/test/cases/parsing/spread/test.filter.js index 741b76b8c15..499ddd1ca43 100644 --- a/test/cases/parsing/spread/test.filter.js +++ b/test/cases/parsing/spread/test.filter.js @@ -1,5 +1,5 @@ -var supportsSpread = require("../../../helpers/supportsSpread"); +const supportsSpread = require("../../../helpers/supportsSpread"); -module.exports = function(config) { +module.exports = function (config) { return supportsSpread(); }; diff --git a/test/cases/parsing/this-in-arrow-iife/index.js b/test/cases/parsing/this-in-arrow-iife/index.js new file mode 100644 index 00000000000..b7d2e430424 --- /dev/null +++ b/test/cases/parsing/this-in-arrow-iife/index.js @@ -0,0 +1,14 @@ +function x() { + let value; + (() => { + value = this; + })(); + return value; +} + +it("should parse this in an arrow IIFE correctly", () => { + const o = { ok: true }; + expect(x.call(o)).toBe(o); +}); + +export {}; diff --git a/test/cases/parsing/typeof-non-module/index.js b/test/cases/parsing/typeof-non-module/index.js new file mode 100644 index 00000000000..10a88cf80b7 --- /dev/null +++ b/test/cases/parsing/typeof-non-module/index.js @@ -0,0 +1,9 @@ +it("should answer typeof __non_webpack_require__ correctly", function () { + var oldValue; + eval("oldValue = require;"); + expect(typeof __non_webpack_require__).toBe("function"); + eval("require = undefined;"); + expect(typeof __non_webpack_require__).toBe("undefined"); + eval("require = oldValue;"); + expect(typeof __non_webpack_require__).toBe("function"); +}); diff --git a/test/cases/parsing/typeof-non-module/test.filter.js b/test/cases/parsing/typeof-non-module/test.filter.js new file mode 100644 index 00000000000..d957820f37a --- /dev/null +++ b/test/cases/parsing/typeof-non-module/test.filter.js @@ -0,0 +1,3 @@ +module.exports = function (config) { + return !config.module; +}; diff --git a/test/cases/parsing/typeof/index.js b/test/cases/parsing/typeof/index.js index 93e366595ce..0e3fbbb0b97 100644 --- a/test/cases/parsing/typeof/index.js +++ b/test/cases/parsing/typeof/index.js @@ -1,48 +1,48 @@ -it("should not create a context for typeof require", function() { +it("should not create a context for typeof require", function () { expect(require("./typeof")).toBe("function"); }); -it("should answer typeof require correctly", function() { - expect((typeof require)).toBe("function"); +it("should answer typeof require correctly", function () { + expect(typeof require).toBe("function"); }); -it("should answer typeof define correctly", function() { - expect((typeof define)).toBe("function"); +it("should answer typeof define correctly", function () { + expect(typeof define).toBe("function"); }); -it("should answer typeof require.amd correctly", function() { - expect((typeof require.amd)).toBe("object"); +it("should answer typeof require.amd correctly", function () { + expect(typeof require.amd).toBe("object"); }); -it("should answer typeof define.amd correctly", function() { - expect((typeof define.amd)).toBe("object"); +it("should answer typeof define.amd correctly", function () { + expect(typeof define.amd).toBe("object"); }); -it("should answer typeof module correctly", function() { - expect((typeof module)).toBe("object"); +it("should answer typeof module correctly", function () { + expect(typeof module).toBe("object"); }); -it("should answer typeof exports correctly", function() { - expect((typeof exports)).toBe("object"); +it("should answer typeof exports correctly", function () { + expect(typeof exports).toBe("object"); }); -it("should answer typeof require.include correctly", function() { - expect((typeof require.include)).toBe("function"); +it("should answer typeof require.include correctly", function () { + expect(typeof require.include).toBe("function"); }); -it("should answer typeof require.ensure correctly", function() { - expect((typeof require.ensure)).toBe("function"); +it("should answer typeof require.ensure correctly", function () { + expect(typeof require.ensure).toBe("function"); }); -it("should answer typeof require.resolve correctly", function() { - expect((typeof require.resolve)).toBe("function"); +it("should answer typeof require.resolve correctly", function () { + expect(typeof require.resolve).toBe("function"); }); -it("should not parse filtered stuff", function() { - if(typeof require != "function") require("fail"); - if(typeof require !== "function") require("fail"); - if(!(typeof require == "function")) require("fail"); - if(!(typeof require === "function")) require("fail"); - if(typeof require == "undefined") require = require("fail"); - if(typeof require === "undefined") require = require("fail"); - if(typeof require.resolve !== "function") require("fail"); - if(typeof module == "undefined") module = require("fail"); - if(typeof module === "undefined") module = require("fail"); - if(typeof module != "object") module = require("fail"); - if(typeof exports == "undefined") exports = require("fail"); - if(typeof System !== "object") exports = require("fail"); - if(typeof require.include !== "function") require.include("fail"); - if(typeof require.ensure !== "function") require.ensure(["fail"], function(){}); +it("should not parse filtered stuff", function () { + if (typeof require != "function") require("fail"); + if (typeof require !== "function") require("fail"); + if (!(typeof require == "function")) require("fail"); + if (!(typeof require === "function")) require("fail"); + if (typeof require == "undefined") require = require("fail"); + if (typeof require === "undefined") require = require("fail"); + if (typeof require.resolve !== "function") require("fail"); + if (typeof module == "undefined") module = require("fail"); + if (typeof module === "undefined") module = require("fail"); + if (typeof module != "object") module = require("fail"); + if (typeof exports == "undefined") exports = require("fail"); + if (typeof require.include !== "function") require.include("fail"); + if (typeof require.ensure !== "function") + require.ensure(["fail"], function () {}); }); diff --git a/test/cases/parsing/typeof/warnings.js b/test/cases/parsing/typeof/warnings.js new file mode 100644 index 00000000000..59637491241 --- /dev/null +++ b/test/cases/parsing/typeof/warnings.js @@ -0,0 +1,4 @@ +module.exports = [ + [/require.include\(\) is deprecated and will be removed soon/], + [/require.include\(\) is deprecated and will be removed soon/] +]; diff --git a/test/cases/parsing/unsupported-amd/errors.js b/test/cases/parsing/unsupported-amd/errors.js index ea59340cd18..05470a57dca 100644 --- a/test/cases/parsing/unsupported-amd/errors.js +++ b/test/cases/parsing/unsupported-amd/errors.js @@ -1,4 +1,4 @@ module.exports = [ - [/Cannot statically analyse/, /in line 12/], - [/Cannot statically analyse/, /in line 4/] -]; \ No newline at end of file + [/Cannot statically analyse/, /in line 4/], + [/Cannot statically analyse/, /in line 12/] +]; diff --git a/test/cases/parsing/webpack-is-included/index.js b/test/cases/parsing/webpack-is-included/index.js new file mode 100644 index 00000000000..4ba18efb286 --- /dev/null +++ b/test/cases/parsing/webpack-is-included/index.js @@ -0,0 +1,20 @@ +import "./module1"; +import { + isWebpackIncludedFunction, + used, + unused, + notPresented +} from "./module2"; + +it("__webpack_is_included__ should be a function", () => { + expect(isWebpackIncludedFunction).toBe(true); +}); + +it("__webpack_is_included__ should be true for bundled modules, otherwise false", () => { + expect(used).toBe(true); + expect(unused).toBe(false); +}); + +it("__webpack_is_included__ should return false for missing module", () => { + expect(notPresented).toBe(false); +}); diff --git a/test/cases/parsing/webpack-is-included/module1.js b/test/cases/parsing/webpack-is-included/module1.js new file mode 100644 index 00000000000..0ed3b5ff348 --- /dev/null +++ b/test/cases/parsing/webpack-is-included/module1.js @@ -0,0 +1 @@ +import "./moduleUsed"; diff --git a/test/cases/parsing/webpack-is-included/module2.js b/test/cases/parsing/webpack-is-included/module2.js new file mode 100644 index 00000000000..c9455e7cf33 --- /dev/null +++ b/test/cases/parsing/webpack-is-included/module2.js @@ -0,0 +1,4 @@ +export const isWebpackIncludedFunction = typeof __webpack_is_included__ === "function"; +export const unused = __webpack_is_included__("./moduleUnused"); +export const used = __webpack_is_included__("./module" + "Used"); +export const notPresented = __webpack_is_included__("./anyOtherModule"); diff --git a/test/cases/parsing/webpack-is-included/moduleUnused.js b/test/cases/parsing/webpack-is-included/moduleUnused.js new file mode 100644 index 00000000000..368db0f467a --- /dev/null +++ b/test/cases/parsing/webpack-is-included/moduleUnused.js @@ -0,0 +1,2 @@ +export default 2; +console.log.bind(); diff --git a/test/cases/parsing/webpack-is-included/moduleUsed.js b/test/cases/parsing/webpack-is-included/moduleUsed.js new file mode 100644 index 00000000000..6c85825693b --- /dev/null +++ b/test/cases/parsing/webpack-is-included/moduleUsed.js @@ -0,0 +1,2 @@ +export default 1; +console.log.bind(); diff --git a/test/cases/resolving/browser-field/errors.js b/test/cases/resolving/browser-field/errors.js index 4b56bd34420..43f6c3086fc 100644 --- a/test/cases/resolving/browser-field/errors.js +++ b/test/cases/resolving/browser-field/errors.js @@ -3,4 +3,4 @@ module.exports = [ [/Module not found/, /recursive-file\/b/, /Recursion in resolving/], [/Module not found/, /recursive-file\/c/, /Recursion in resolving/], [/Module not found/, /recursive-file\/d/, /Recursion in resolving/] -]; \ No newline at end of file +]; diff --git a/test/cases/resolving/browser-field/index.js b/test/cases/resolving/browser-field/index.js index fb3dba46390..683a9b9cc15 100644 --- a/test/cases/resolving/browser-field/index.js +++ b/test/cases/resolving/browser-field/index.js @@ -31,11 +31,13 @@ it("should ignore recursive module mappings", function() { it("should use empty modules for ignored modules", function() { expect(require("ignoring-module").module).toEqual({}); expect(require("ignoring-module").file).toEqual({}); - expect(require("ignoring-module").module).not.toBe(require("ignoring-module").file); + expect(require("ignoring-module").module).not.toBe( + require("ignoring-module").file + ); }); // Errors -require.include("recursive-file/a"); -require.include("recursive-file/b"); -require.include("recursive-file/c"); -require.include("recursive-file/d"); +if (Math.random() < 0) require("recursive-file/a"); +if (Math.random() < 0) require("recursive-file/b"); +if (Math.random() < 0) require("recursive-file/c"); +if (Math.random() < 0) require("recursive-file/d"); diff --git a/test/cases/resolving/context/loaders/queryloader.js b/test/cases/resolving/context/loaders/queryloader.js index 8d606f560f8..f9bb23e1f55 100644 --- a/test/cases/resolving/context/loaders/queryloader.js +++ b/test/cases/resolving/context/loaders/queryloader.js @@ -1,7 +1,11 @@ -module.exports = function(content) { - return "module.exports = " + JSON.stringify({ - resourceQuery: this.resourceQuery, - query: this.query, - prev: content - }); -} +/** @type {import("../../../../../").LoaderDefinition} */ +module.exports = function (content) { + return ( + "module.exports = " + + JSON.stringify({ + resourceQuery: this.resourceQuery, + query: this.query, + prev: content + }) + ); +}; diff --git a/test/cases/resolving/data-uri/index.js b/test/cases/resolving/data-uri/index.js new file mode 100644 index 00000000000..ba027caf352 --- /dev/null +++ b/test/cases/resolving/data-uri/index.js @@ -0,0 +1,29 @@ +it("should require js module from base64 data-uri", function () { + const mod = require("data:text/javascript;charset=utf-8;base64,ZXhwb3J0IGNvbnN0IG51bWJlciA9IDQyOwpleHBvcnQgZnVuY3Rpb24gZm4oKSB7CiAgcmV0dXJuICJIZWxsbyB3b3JsZCI7Cn0="); + expect(mod.number).toBe(42); + expect(mod.fn()).toBe("Hello world"); +}); + +it("should require js module from ascii data-uri", function () { + const mod = require('data:application/node;charset=utf-8,module.exports={number:42,fn:()=>"Hello world"}'); + expect(mod.number).toBe(42); + expect(mod.fn()).toBe("Hello world"); +}); + +it("should import js module from base64 data-uri", function () { + const mod = require("./module-with-imports"); + expect(mod.number).toBe(42); + expect(mod.fn()).toBe("Hello world"); +}); + +it("should require coffee module from base64 data-uri", function () { + const mod = require("coffee-loader!Data:application/node;charset=utf-8;base64,bW9kdWxlLmV4cG9ydHMgPQogIG51bWJlcjogNDIKICBmbjogKCkgLT4gIkhlbGxvIHdvcmxkIg=="); + expect(mod.number).toBe(42); + expect(mod.fn()).toBe("Hello world"); +}); + +it("should require json module from base64 data-uri", function () { + const mod = require("DATA:application/json;charset=utf-8;base64,ewogICJpdCI6ICJ3b3JrcyIsCiAgIm51bWJlciI6IDQyCn0K"); + expect(mod.it).toBe("works"); + expect(mod.number).toBe(42); +}); diff --git a/test/cases/resolving/data-uri/module-with-imports.js b/test/cases/resolving/data-uri/module-with-imports.js new file mode 100644 index 00000000000..4a6a6bf7fda --- /dev/null +++ b/test/cases/resolving/data-uri/module-with-imports.js @@ -0,0 +1,3 @@ +import { number, fn } from "data:text/javascript;charset=utf-8;base64,ZXhwb3J0IGNvbnN0IG51bWJlciA9IDQyOwpleHBvcnQgY29uc3QgZm4gPSAoKSA9PiAiSGVsbG8gd29ybGQiOw=="; + +export { number, fn }; diff --git a/test/cases/resolving/issue-11555/index.js b/test/cases/resolving/issue-11555/index.js new file mode 100644 index 00000000000..b1e5ba784c6 --- /dev/null +++ b/test/cases/resolving/issue-11555/index.js @@ -0,0 +1,29 @@ +it("should be possible to use # in folders", () => { + const eIndexOf = require("es5-ext/array/#/e-index-of"); + expect(eIndexOf).toBeTypeOf("function"); +}); + +it("should be possible to use # in folders (context)", () => { + const x = "e-index-of"; + const eIndexOf = require(`es5-ext/array/#/${x}`); + expect(eIndexOf).toBeTypeOf("function"); +}); + +it("should be possible to use # in folders (context)", () => { + const array = require("es5-ext/array"); + expect(array).toMatchObject({ + "#": expect.objectContaining({ + clear: expect.toBeTypeOf("function") + }) + }); +}); + +it("should be possible escape # in requests", () => { + const eIndexOf = require("es5-ext/array/\0#/e-index-of#fragment"); + expect(eIndexOf).toBeTypeOf("function"); +}); + +it("should be possible dynamically import # in folders", async () => { + const eIndexOf = await import("es5-ext/array/#/first"); + expect(eIndexOf.default).toBeTypeOf("function"); +}); diff --git a/test/cases/resolving/issue-2986/index.js b/test/cases/resolving/issue-2986/index.js index 57999a1b5b5..3b534fe6da6 100644 --- a/test/cases/resolving/issue-2986/index.js +++ b/test/cases/resolving/issue-2986/index.js @@ -1,4 +1,4 @@ -require.include("any!"); -require.include("other!"); +if (Math.random() < 0) require("any!"); +if (Math.random() < 0) require("other!"); -it("should have correct errors", function() {}) +it("should have correct errors", function() {}); diff --git a/test/cases/runtime/error-handling/errors.js b/test/cases/runtime/error-handling/errors.js index 0761c2861a0..0332131095e 100644 --- a/test/cases/runtime/error-handling/errors.js +++ b/test/cases/runtime/error-handling/errors.js @@ -1,3 +1,7 @@ module.exports = [ - [/Module not found/, /Can't resolve '\.\/missingModule' /, /error-handling\/index.js/] -]; \ No newline at end of file + [ + /Module not found/, + /Can't resolve '\.\/missingModule' /, + { moduleName: /error-handling\/index.js/ } + ] +]; diff --git a/test/cases/runtime/error-handling/warnings.js b/test/cases/runtime/error-handling/warnings.js index e10b267b5ae..c005d4830f8 100644 --- a/test/cases/runtime/error-handling/warnings.js +++ b/test/cases/runtime/error-handling/warnings.js @@ -1,3 +1,7 @@ module.exports = [ - [/Module not found/, /Can't resolve '\.\/missingModule2' /, /error-handling\/index.js/] -]; \ No newline at end of file + [ + /Module not found/, + /Can't resolve '\.\/missingModule2' /, + { moduleName: /error-handling\/index.js/ } + ] +]; diff --git a/test/cases/runtime/issue-15518/dynamic_a/module_a1.js b/test/cases/runtime/issue-15518/dynamic_a/module_a1.js new file mode 100644 index 00000000000..bb015c33f2f --- /dev/null +++ b/test/cases/runtime/issue-15518/dynamic_a/module_a1.js @@ -0,0 +1 @@ +export const log = 1; diff --git a/test/cases/runtime/issue-15518/dynamic_a/module_a2.js b/test/cases/runtime/issue-15518/dynamic_a/module_a2.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/cases/runtime/issue-15518/index.js b/test/cases/runtime/issue-15518/index.js new file mode 100644 index 00000000000..6eb4b80c0ba --- /dev/null +++ b/test/cases/runtime/issue-15518/index.js @@ -0,0 +1,13 @@ +async function dynamic_import(dir, name) { + if (dir === "a") { + return import( + /* webpackChunkName: "a" */ + /* webpackMode: "lazy-once" */ + `./dynamic_a/${name}.js`); + } + throw new Error(); +} + +it("should compile and run", async () => { + await dynamic_import("a", "module_a1"); +}); diff --git a/test/cases/runtime/issue-2391-chunk/index.js b/test/cases/runtime/issue-2391-chunk/index.js deleted file mode 100644 index 7e38eadbdc5..00000000000 --- a/test/cases/runtime/issue-2391-chunk/index.js +++ /dev/null @@ -1,4 +0,0 @@ -it("should have a require.onError function by default", function() { - expect((typeof require.onError)).toBe("function"); - require(["./file"]); -}); diff --git a/test/cases/runtime/issue-2391/index.js b/test/cases/runtime/issue-2391/index.js deleted file mode 100644 index c01b3c35a54..00000000000 --- a/test/cases/runtime/issue-2391/index.js +++ /dev/null @@ -1,3 +0,0 @@ -it("should not have a require.onError function by default", function() { - expect((typeof require.onError)).toBe("undefined"); // expected to fail in browsertests -}); diff --git a/test/cases/runtime/missing-module-exception-dynamic-import/index.js b/test/cases/runtime/missing-module-exception-dynamic-import/index.js new file mode 100644 index 00000000000..8ed1ed4676d --- /dev/null +++ b/test/cases/runtime/missing-module-exception-dynamic-import/index.js @@ -0,0 +1,9 @@ +it("should have correct error code", async function () { + try { + await import("./fail-1"); + await import("./fail-2").property; + await import("./fail-3").property.sub(); + } catch (e) { + expect(e.code).toBe("MODULE_NOT_FOUND"); + } +}); diff --git a/test/cases/runtime/missing-module-exception-dynamic-import/warnings.js b/test/cases/runtime/missing-module-exception-dynamic-import/warnings.js new file mode 100644 index 00000000000..f0cafe0c42f --- /dev/null +++ b/test/cases/runtime/missing-module-exception-dynamic-import/warnings.js @@ -0,0 +1,5 @@ +module.exports = [ + [/Module not found/, /Can't resolve '\.\/fail-1' /], + [/Module not found/, /Can't resolve '\.\/fail-2' /], + [/Module not found/, /Can't resolve '\.\/fail-3' /] +]; diff --git a/test/cases/runtime/missing-module-exception-require/index.js b/test/cases/runtime/missing-module-exception-require/index.js new file mode 100644 index 00000000000..366bdfd7485 --- /dev/null +++ b/test/cases/runtime/missing-module-exception-require/index.js @@ -0,0 +1,9 @@ +it("should have correct error code", function () { + try { + require("./fail-1"); + require("./fail-2").property; + require("./fail-3").property.sub(); + } catch (e) { + expect(e.code).toBe("MODULE_NOT_FOUND"); + } +}); diff --git a/test/cases/runtime/missing-module-exception-require/warnings.js b/test/cases/runtime/missing-module-exception-require/warnings.js new file mode 100644 index 00000000000..f0cafe0c42f --- /dev/null +++ b/test/cases/runtime/missing-module-exception-require/warnings.js @@ -0,0 +1,5 @@ +module.exports = [ + [/Module not found/, /Can't resolve '\.\/fail-1' /], + [/Module not found/, /Can't resolve '\.\/fail-2' /], + [/Module not found/, /Can't resolve '\.\/fail-3' /] +]; diff --git a/test/cases/runtime/missing-module-exception/index.js b/test/cases/runtime/missing-module-exception/index.js deleted file mode 100644 index 3351fb7a5a4..00000000000 --- a/test/cases/runtime/missing-module-exception/index.js +++ /dev/null @@ -1,7 +0,0 @@ -it("should have correct error code", function() { - try { - require("./fail"); - } catch(e) { - expect(e.code).toBe("MODULE_NOT_FOUND"); - } -}); diff --git a/test/cases/runtime/missing-module-exception/warnings.js b/test/cases/runtime/missing-module-exception/warnings.js deleted file mode 100644 index fd523a239ab..00000000000 --- a/test/cases/runtime/missing-module-exception/warnings.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = [ - [/Module not found/, /Can't resolve '\.\/fail' /] -]; \ No newline at end of file diff --git a/test/cases/runtime/missing-module-syntax-error/errors.js b/test/cases/runtime/missing-module-syntax-error/errors.js new file mode 100644 index 00000000000..ced71bb9976 --- /dev/null +++ b/test/cases/runtime/missing-module-syntax-error/errors.js @@ -0,0 +1 @@ +module.exports = [[/Module not found/, /Can't resolve '\.\/someModule' /]]; diff --git a/test/cases/runtime/missing-module-syntax-error/index.js b/test/cases/runtime/missing-module-syntax-error/index.js new file mode 100644 index 00000000000..d4b37ada905 --- /dev/null +++ b/test/cases/runtime/missing-module-syntax-error/index.js @@ -0,0 +1,11 @@ + + +it("should have correct error code", function() { + + try { + require("./module"); + } catch(e) { + expect(e.code).toBe("MODULE_NOT_FOUND"); + } + +}); diff --git a/test/cases/runtime/missing-module-syntax-error/module.js b/test/cases/runtime/missing-module-syntax-error/module.js new file mode 100644 index 00000000000..be691c79099 --- /dev/null +++ b/test/cases/runtime/missing-module-syntax-error/module.js @@ -0,0 +1,3 @@ +import { SomeClass } from "./someModule"; + +new SomeClass(); diff --git a/test/cases/runtime/require-function/index.js b/test/cases/runtime/require-function/index.js index bd6a7caf019..af3f3160050 100644 --- a/test/cases/runtime/require-function/index.js +++ b/test/cases/runtime/require-function/index.js @@ -1,3 +1,7 @@ +__webpack_modules__; +require.cache; +__webpack_public_path__; + it("should have correct properties on the require function", function() { expect(__webpack_require__.c).toBeTypeOf("object"); expect(__webpack_require__.m).toBeTypeOf("object"); diff --git a/test/cases/scope-hoisting/circular-root-export/external-ref.js b/test/cases/scope-hoisting/circular-root-export/external-ref.js new file mode 100644 index 00000000000..1ef8a6f61e6 --- /dev/null +++ b/test/cases/scope-hoisting/circular-root-export/external-ref.js @@ -0,0 +1 @@ +import "./external"; diff --git a/test/cases/scope-hoisting/circular-root-export/external.js b/test/cases/scope-hoisting/circular-root-export/external.js new file mode 100644 index 00000000000..ca5be3c28d9 --- /dev/null +++ b/test/cases/scope-hoisting/circular-root-export/external.js @@ -0,0 +1,13 @@ +import { a, b, c, default as d } from "./root"; + +expect(a()).toBe("a"); +if (process.env.NODE_ENV === "production") { + // These two cases only work correctly when scope hoisted + expect(b()).toBe("b"); + expect(Object(c).b()).toBe("b"); +} +expect(() => d).toThrow(); + +export function test() { + expect(d).toBe(d); +} diff --git a/test/cases/scope-hoisting/circular-root-export/index.js b/test/cases/scope-hoisting/circular-root-export/index.js new file mode 100644 index 00000000000..82c6f8fa9cf --- /dev/null +++ b/test/cases/scope-hoisting/circular-root-export/index.js @@ -0,0 +1,7 @@ +it("should hoist exports in a concatenated module", () => { + return import("./root-ref").then(m => { + m.test(); + }); +}); + +if (Math.random() < 0) import("./external-ref"); diff --git a/test/cases/scope-hoisting/circular-root-export/module.js b/test/cases/scope-hoisting/circular-root-export/module.js new file mode 100644 index 00000000000..6ff994e5f04 --- /dev/null +++ b/test/cases/scope-hoisting/circular-root-export/module.js @@ -0,0 +1,6 @@ +export function b() { + return "b"; +} +export function bb() { + return "bb"; +} diff --git a/test/cases/scope-hoisting/circular-root-export/root-ref.js b/test/cases/scope-hoisting/circular-root-export/root-ref.js new file mode 100644 index 00000000000..63a76f1cbc8 --- /dev/null +++ b/test/cases/scope-hoisting/circular-root-export/root-ref.js @@ -0,0 +1 @@ +export { test } from "./root"; diff --git a/test/cases/scope-hoisting/circular-root-export/root.js b/test/cases/scope-hoisting/circular-root-export/root.js new file mode 100644 index 00000000000..96a61a86c51 --- /dev/null +++ b/test/cases/scope-hoisting/circular-root-export/root.js @@ -0,0 +1,13 @@ +export { test } from "./external"; +import * as c from "./module"; +export { c }; +import * as cc from "./module"; +export { cc }; +export * from "./module"; +export default "d"; +export function a() { + return "a"; +} +export function aa() { + return "aa"; +} diff --git a/test/cases/scope-hoisting/delete-issue-10831/index.js b/test/cases/scope-hoisting/delete-issue-10831/index.js new file mode 100644 index 00000000000..91d7e252ee6 --- /dev/null +++ b/test/cases/scope-hoisting/delete-issue-10831/index.js @@ -0,0 +1,7 @@ +import { object } from "./module"; + +it("should allow to delete a imported property", () => { + expect(object).toEqual({ property: true }); + delete object.property; + expect(object).toEqual({}); +}); diff --git a/test/cases/scope-hoisting/delete-issue-10831/module.js b/test/cases/scope-hoisting/delete-issue-10831/module.js new file mode 100644 index 00000000000..f059c5e4d59 --- /dev/null +++ b/test/cases/scope-hoisting/delete-issue-10831/module.js @@ -0,0 +1 @@ +export const object = { property: true }; diff --git a/test/cases/scope-hoisting/external-root/chunk.js b/test/cases/scope-hoisting/external-root/chunk.js new file mode 100644 index 00000000000..564af59e794 --- /dev/null +++ b/test/cases/scope-hoisting/external-root/chunk.js @@ -0,0 +1 @@ +import result from "./root2"; diff --git a/test/cases/scope-hoisting/external-root/index.js b/test/cases/scope-hoisting/external-root/index.js new file mode 100644 index 00000000000..6c81313f6be --- /dev/null +++ b/test/cases/scope-hoisting/external-root/index.js @@ -0,0 +1,13 @@ +import "./module"; +import f, { ns } from "./root2"; +import * as r2 from "./root2"; + +it("should be able to import a secondary root", () => { + expect(f()).toBe("ok"); + expect(f.x()).toBe("ok"); + expect(ns.f()).toBe("ok"); + expect(ns.f.x()).toBe("ok"); + expect(r2.ns.f()).toBe("ok"); + expect(r2.ns.f.x()).toBe("ok"); + return import("./chunk"); +}); diff --git a/test/cases/scope-hoisting/external-root/module.js b/test/cases/scope-hoisting/external-root/module.js new file mode 100644 index 00000000000..cb0ff5c3b54 --- /dev/null +++ b/test/cases/scope-hoisting/external-root/module.js @@ -0,0 +1 @@ +export {}; diff --git a/test/cases/scope-hoisting/external-root/root2-module.js b/test/cases/scope-hoisting/external-root/root2-module.js new file mode 100644 index 00000000000..00bb122ff6c --- /dev/null +++ b/test/cases/scope-hoisting/external-root/root2-module.js @@ -0,0 +1,5 @@ +const f = () => "ok"; +f.x = function() { + return this(); +}; +export { f }; diff --git a/test/cases/scope-hoisting/external-root/root2.js b/test/cases/scope-hoisting/external-root/root2.js new file mode 100644 index 00000000000..93054dbfff4 --- /dev/null +++ b/test/cases/scope-hoisting/external-root/root2.js @@ -0,0 +1,10 @@ +import * as ns from "./root2-module"; + +const f = () => "ok"; +f.x = function() { + return this(); +}; + +export default f; + +export { ns }; diff --git a/test/cases/scope-hoisting/import-order-11617/a.js b/test/cases/scope-hoisting/import-order-11617/a.js new file mode 100644 index 00000000000..72a4ea378cf --- /dev/null +++ b/test/cases/scope-hoisting/import-order-11617/a.js @@ -0,0 +1,6 @@ +import "./b"; +import "./c"; + +import { track } from "./tracker"; + +track("a"); diff --git a/test/cases/scope-hoisting/import-order-11617/b.js b/test/cases/scope-hoisting/import-order-11617/b.js new file mode 100644 index 00000000000..06015728c19 --- /dev/null +++ b/test/cases/scope-hoisting/import-order-11617/b.js @@ -0,0 +1,5 @@ +import "./x"; + +import { track } from "./tracker"; + +track("b"); diff --git a/test/cases/scope-hoisting/import-order-11617/c.js b/test/cases/scope-hoisting/import-order-11617/c.js new file mode 100644 index 00000000000..df81336b7aa --- /dev/null +++ b/test/cases/scope-hoisting/import-order-11617/c.js @@ -0,0 +1,3 @@ +var track = require("./tracker").track; + +track("c"); diff --git a/test/cases/scope-hoisting/import-order-11617/index.js b/test/cases/scope-hoisting/import-order-11617/index.js new file mode 100644 index 00000000000..620e8555fb4 --- /dev/null +++ b/test/cases/scope-hoisting/import-order-11617/index.js @@ -0,0 +1,8 @@ +import "./x"; +import "./y"; +import "./a"; +import { log } from "./tracker"; + +it("should evaluate import in the correct order", function () { + expect(log).toEqual(["b", "c", "a"]); +}); diff --git a/test/cases/scope-hoisting/import-order-11617/tracker.js b/test/cases/scope-hoisting/import-order-11617/tracker.js new file mode 100644 index 00000000000..15389676588 --- /dev/null +++ b/test/cases/scope-hoisting/import-order-11617/tracker.js @@ -0,0 +1,5 @@ +export var log = []; + +export function track(name) { + log.push(name); +} diff --git a/test/cases/scope-hoisting/import-order-11617/x.js b/test/cases/scope-hoisting/import-order-11617/x.js new file mode 100644 index 00000000000..122ec5d2d79 --- /dev/null +++ b/test/cases/scope-hoisting/import-order-11617/x.js @@ -0,0 +1 @@ +console.log.bind(console); diff --git a/test/cases/scope-hoisting/import-order-11617/y.js b/test/cases/scope-hoisting/import-order-11617/y.js new file mode 100644 index 00000000000..122ec5d2d79 --- /dev/null +++ b/test/cases/scope-hoisting/import-order-11617/y.js @@ -0,0 +1 @@ +console.log.bind(console); diff --git a/test/cases/scope-hoisting/inside-class/test.filter.js b/test/cases/scope-hoisting/inside-class/test.filter.js index b4b5c42560c..9cf8a63f9b6 100644 --- a/test/cases/scope-hoisting/inside-class/test.filter.js +++ b/test/cases/scope-hoisting/inside-class/test.filter.js @@ -1,5 +1,5 @@ -var supportsES6 = require("../../../helpers/supportsES6"); +const supportsES6 = require("../../../helpers/supportsES6"); -module.exports = function(config) { - return !config.minimize && supportsES6(); +module.exports = function (config) { + return supportsES6(); }; diff --git a/test/cases/scope-hoisting/issue-10308/commonjs.js b/test/cases/scope-hoisting/issue-10308/commonjs.js new file mode 100644 index 00000000000..888cae37af9 --- /dev/null +++ b/test/cases/scope-hoisting/issue-10308/commonjs.js @@ -0,0 +1 @@ +module.exports = 42; diff --git a/test/cases/scope-hoisting/issue-10308/external.js b/test/cases/scope-hoisting/issue-10308/external.js new file mode 100644 index 00000000000..47cee2d7ba3 --- /dev/null +++ b/test/cases/scope-hoisting/issue-10308/external.js @@ -0,0 +1,3 @@ +export function test(base) { + return base + 2; +} diff --git a/test/cases/scope-hoisting/issue-10308/index.js b/test/cases/scope-hoisting/issue-10308/index.js new file mode 100644 index 00000000000..b390c356809 --- /dev/null +++ b/test/cases/scope-hoisting/issue-10308/index.js @@ -0,0 +1,6 @@ +import { fn } from "./root"; +import(/* webpackMode: "eager" */ "./external"); + +it("should use the correct names", () => { + expect(fn()).toBe(42); +}); diff --git a/test/cases/scope-hoisting/issue-10308/root.js b/test/cases/scope-hoisting/issue-10308/root.js new file mode 100644 index 00000000000..d417c38e405 --- /dev/null +++ b/test/cases/scope-hoisting/issue-10308/root.js @@ -0,0 +1,14 @@ +import CommonJs from "./commonjs"; +import { test } from "./external"; + +function fn() { + CommonJs; + + var external = 40; + + var externalValue = test(external); + + return externalValue; +} + +export { fn }; diff --git a/test/cases/scope-hoisting/issue-10409/a.js b/test/cases/scope-hoisting/issue-10409/a.js new file mode 100644 index 00000000000..087e90023e4 --- /dev/null +++ b/test/cases/scope-hoisting/issue-10409/a.js @@ -0,0 +1,2 @@ +import cts from "./cts"; +export default cts.connectData(function() {}); diff --git a/test/cases/scope-hoisting/issue-10409/b.js b/test/cases/scope-hoisting/issue-10409/b.js new file mode 100644 index 00000000000..6ad5255ada8 --- /dev/null +++ b/test/cases/scope-hoisting/issue-10409/b.js @@ -0,0 +1,2 @@ +import cts from "./cts"; +export function b() {} diff --git a/test/cases/scope-hoisting/issue-10409/c.js b/test/cases/scope-hoisting/issue-10409/c.js new file mode 100644 index 00000000000..99eff168d1a --- /dev/null +++ b/test/cases/scope-hoisting/issue-10409/c.js @@ -0,0 +1,3 @@ +import cts from "./cts"; +import a from "./a"; +export function c() {} diff --git a/test/cases/scope-hoisting/issue-10409/cts.js b/test/cases/scope-hoisting/issue-10409/cts.js new file mode 100644 index 00000000000..df577722c0a --- /dev/null +++ b/test/cases/scope-hoisting/issue-10409/cts.js @@ -0,0 +1,6 @@ +import * as cts from "./cts"; +export { cts as default }; +export function connectData() {} +export function yyy() {} +export { b } from "./b"; +export { c } from "./c"; diff --git a/test/cases/scope-hoisting/issue-10409/index.js b/test/cases/scope-hoisting/issue-10409/index.js new file mode 100644 index 00000000000..aee4b05ceeb --- /dev/null +++ b/test/cases/scope-hoisting/issue-10409/index.js @@ -0,0 +1,5 @@ +it("should import these modules correctly", () => { + return import("./main"); +}); + +if (Math.random() < 0) import("./b"); diff --git a/test/cases/scope-hoisting/issue-10409/main.js b/test/cases/scope-hoisting/issue-10409/main.js new file mode 100644 index 00000000000..c839869b169 --- /dev/null +++ b/test/cases/scope-hoisting/issue-10409/main.js @@ -0,0 +1,2 @@ +import cts from "./cts"; +import a from "./a"; diff --git a/test/cases/scope-hoisting/issue-11840/Mixin.js b/test/cases/scope-hoisting/issue-11840/Mixin.js new file mode 100644 index 00000000000..ac4784b2e6e --- /dev/null +++ b/test/cases/scope-hoisting/issue-11840/Mixin.js @@ -0,0 +1 @@ +export const Mixin = class Mixin {}; diff --git a/test/cases/scope-hoisting/issue-11840/index.js b/test/cases/scope-hoisting/issue-11840/index.js new file mode 100644 index 00000000000..d4df5f14adc --- /dev/null +++ b/test/cases/scope-hoisting/issue-11840/index.js @@ -0,0 +1,7 @@ +import { Mixin } from "./Mixin"; + +const createMixin = fn => class Mixin extends fn(Mixin) {}; + +it("should have no name conflict", () => { + expect(new (createMixin(x => x))()).toBeInstanceOf(Mixin); +}); diff --git a/test/cases/scope-hoisting/json-reexport-6700/warnings.js b/test/cases/scope-hoisting/json-reexport-6700/warnings.js new file mode 100644 index 00000000000..1bce6f573e7 --- /dev/null +++ b/test/cases/scope-hoisting/json-reexport-6700/warnings.js @@ -0,0 +1,8 @@ +module.exports = [ + [ + /Should not import the named export 'a' \(reexported as 'a'\) from default-exporting module \(only default export is available soon\)/ + ], + [ + /Should not import the named export 'b' \(reexported as 'b'\) from default-exporting module \(only default export is available soon\)/ + ] +]; diff --git a/test/cases/scope-hoisting/orphan/index.js b/test/cases/scope-hoisting/orphan/index.js new file mode 100644 index 00000000000..20dfe4b4d9e --- /dev/null +++ b/test/cases/scope-hoisting/orphan/index.js @@ -0,0 +1,6 @@ +import x from "pkg"; + +it("should compile fine", () => { + const result = x; + expect(result.value).toBe(42); +}); diff --git a/test/cases/scope-hoisting/orphan/node_modules/pkg/b.js b/test/cases/scope-hoisting/orphan/node_modules/pkg/b.js new file mode 100644 index 00000000000..b0f52efa144 --- /dev/null +++ b/test/cases/scope-hoisting/orphan/node_modules/pkg/b.js @@ -0,0 +1,3 @@ +import { y } from './module'; +y; +export default 1; diff --git a/test/cases/scope-hoisting/orphan/node_modules/pkg/index.js b/test/cases/scope-hoisting/orphan/node_modules/pkg/index.js new file mode 100644 index 00000000000..e85b05aa602 --- /dev/null +++ b/test/cases/scope-hoisting/orphan/node_modules/pkg/index.js @@ -0,0 +1,4 @@ +import { y as used } from "./module" +import unused from "./b" + +export default used; diff --git a/test/cases/scope-hoisting/orphan/node_modules/pkg/module.js b/test/cases/scope-hoisting/orphan/node_modules/pkg/module.js new file mode 100644 index 00000000000..c741c4ba314 --- /dev/null +++ b/test/cases/scope-hoisting/orphan/node_modules/pkg/module.js @@ -0,0 +1,4 @@ +import x from './x'; +import * as y from './y'; + +export { x, y }; diff --git a/test/cases/scope-hoisting/orphan/node_modules/pkg/package.json b/test/cases/scope-hoisting/orphan/node_modules/pkg/package.json new file mode 100644 index 00000000000..2124100b0ef --- /dev/null +++ b/test/cases/scope-hoisting/orphan/node_modules/pkg/package.json @@ -0,0 +1,3 @@ +{ + "sideEffects": false +} \ No newline at end of file diff --git a/test/cases/scope-hoisting/orphan/node_modules/pkg/x.js b/test/cases/scope-hoisting/orphan/node_modules/pkg/x.js new file mode 100644 index 00000000000..55bb2097431 --- /dev/null +++ b/test/cases/scope-hoisting/orphan/node_modules/pkg/x.js @@ -0,0 +1 @@ +export default 1 \ No newline at end of file diff --git a/test/cases/scope-hoisting/orphan/node_modules/pkg/y.js b/test/cases/scope-hoisting/orphan/node_modules/pkg/y.js new file mode 100644 index 00000000000..46d3ca8c61f --- /dev/null +++ b/test/cases/scope-hoisting/orphan/node_modules/pkg/y.js @@ -0,0 +1 @@ +export const value = 42; diff --git a/test/cases/scope-hoisting/reexport-star-exposed-cjs/a.js b/test/cases/scope-hoisting/reexport-star-exposed-cjs/a.js new file mode 100644 index 00000000000..c1ce35449b3 --- /dev/null +++ b/test/cases/scope-hoisting/reexport-star-exposed-cjs/a.js @@ -0,0 +1 @@ +exports.named = "named"; diff --git a/test/cases/scope-hoisting/reexport-star-exposed-cjs/b.js b/test/cases/scope-hoisting/reexport-star-exposed-cjs/b.js new file mode 100644 index 00000000000..ee6e29df96d --- /dev/null +++ b/test/cases/scope-hoisting/reexport-star-exposed-cjs/b.js @@ -0,0 +1 @@ +export { named } from "./a"; diff --git a/test/cases/scope-hoisting/reexport-star-exposed-cjs/c.js b/test/cases/scope-hoisting/reexport-star-exposed-cjs/c.js new file mode 100644 index 00000000000..14065b7bb3f --- /dev/null +++ b/test/cases/scope-hoisting/reexport-star-exposed-cjs/c.js @@ -0,0 +1 @@ +export * from "./b"; diff --git a/test/cases/scope-hoisting/reexport-star-exposed-cjs/index.js b/test/cases/scope-hoisting/reexport-star-exposed-cjs/index.js new file mode 100644 index 00000000000..44e195598fc --- /dev/null +++ b/test/cases/scope-hoisting/reexport-star-exposed-cjs/index.js @@ -0,0 +1,5 @@ +var c = require("./c"); + +it("should have the correct values", function() { + expect(c.named).toBe("named"); +}); diff --git a/test/cases/scope-hoisting/reexport-star-external-cjs/a.js b/test/cases/scope-hoisting/reexport-star-external-cjs/a.js new file mode 100644 index 00000000000..c1ce35449b3 --- /dev/null +++ b/test/cases/scope-hoisting/reexport-star-external-cjs/a.js @@ -0,0 +1 @@ +exports.named = "named"; diff --git a/test/cases/scope-hoisting/reexport-star-external-cjs/b.js b/test/cases/scope-hoisting/reexport-star-external-cjs/b.js new file mode 100644 index 00000000000..ad28b32d489 --- /dev/null +++ b/test/cases/scope-hoisting/reexport-star-external-cjs/b.js @@ -0,0 +1 @@ +export var other = "other"; diff --git a/test/cases/scope-hoisting/reexport-star-external-cjs/c.js b/test/cases/scope-hoisting/reexport-star-external-cjs/c.js new file mode 100644 index 00000000000..3ebcd0b9763 --- /dev/null +++ b/test/cases/scope-hoisting/reexport-star-external-cjs/c.js @@ -0,0 +1,2 @@ +export * from "./a"; +export * from "./b"; diff --git a/test/cases/scope-hoisting/reexport-star-external-cjs/index.js b/test/cases/scope-hoisting/reexport-star-external-cjs/index.js new file mode 100644 index 00000000000..44e195598fc --- /dev/null +++ b/test/cases/scope-hoisting/reexport-star-external-cjs/index.js @@ -0,0 +1,5 @@ +var c = require("./c"); + +it("should have the correct values", function() { + expect(c.named).toBe("named"); +}); diff --git a/test/cases/scope-hoisting/renaming-shorthand-5027/test.filter.js b/test/cases/scope-hoisting/renaming-shorthand-5027/test.filter.js index ccd1717d158..c7989392ead 100644 --- a/test/cases/scope-hoisting/renaming-shorthand-5027/test.filter.js +++ b/test/cases/scope-hoisting/renaming-shorthand-5027/test.filter.js @@ -1,12 +1,14 @@ -var supportsES6 = require("../../../helpers/supportsES6"); -var supportDefaultAssignment = require("../../../helpers/supportDefaultAssignment"); -var supportsObjectDestructuring = require("../../../helpers/supportsObjectDestructuring"); -var supportsIteratorDestructuring = require("../../../helpers/supportsIteratorDestructuring"); +const supportsES6 = require("../../../helpers/supportsES6"); +const supportDefaultAssignment = require("../../../helpers/supportDefaultAssignment"); +const supportsObjectDestructuring = require("../../../helpers/supportsObjectDestructuring"); +const supportsIteratorDestructuring = require("../../../helpers/supportsIteratorDestructuring"); -module.exports = function(config) { - return !config.minimize && +module.exports = function (config) { + return ( + !config.minimize && supportsES6() && supportDefaultAssignment() && supportsObjectDestructuring() && - supportsIteratorDestructuring(); + supportsIteratorDestructuring() + ); }; diff --git a/test/cases/scope-hoisting/side-effects-11662/index.js b/test/cases/scope-hoisting/side-effects-11662/index.js new file mode 100644 index 00000000000..3aad51a4c60 --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11662/index.js @@ -0,0 +1,5 @@ +import { value } from "package"; + +it("should import reexported export correctly", () => { + expect(value).toBe(42); +}); diff --git a/test/cases/scope-hoisting/side-effects-11662/node_modules/package/d.js b/test/cases/scope-hoisting/side-effects-11662/node_modules/package/d.js new file mode 100644 index 00000000000..3e339a2d985 --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11662/node_modules/package/d.js @@ -0,0 +1 @@ +export { value } from './e'; diff --git a/test/cases/scope-hoisting/side-effects-11662/node_modules/package/e.js b/test/cases/scope-hoisting/side-effects-11662/node_modules/package/e.js new file mode 100644 index 00000000000..2eae68c5365 --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11662/node_modules/package/e.js @@ -0,0 +1,3 @@ +export { value } from './module'; + +export function func() {} diff --git a/test/cases/scope-hoisting/side-effects-11662/node_modules/package/index.js b/test/cases/scope-hoisting/side-effects-11662/node_modules/package/index.js new file mode 100644 index 00000000000..a45ce9654c0 --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11662/node_modules/package/index.js @@ -0,0 +1,5 @@ +// @uifabric/styling/lib/index.js +export * from "./d"; + +import { func } from './e'; +func(); diff --git a/test/cases/scope-hoisting/side-effects-11662/node_modules/package/module.js b/test/cases/scope-hoisting/side-effects-11662/node_modules/package/module.js new file mode 100644 index 00000000000..46d3ca8c61f --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11662/node_modules/package/module.js @@ -0,0 +1 @@ +export const value = 42; diff --git a/test/cases/scope-hoisting/side-effects-11662/node_modules/package/package.json b/test/cases/scope-hoisting/side-effects-11662/node_modules/package/package.json new file mode 100644 index 00000000000..0942507974a --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11662/node_modules/package/package.json @@ -0,0 +1,5 @@ +{ + "sideEffects": [ + "index.js" + ] +} diff --git a/test/cases/scope-hoisting/side-effects-11990-star/chunk1.js b/test/cases/scope-hoisting/side-effects-11990-star/chunk1.js new file mode 100644 index 00000000000..9ca734f9ba8 --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11990-star/chunk1.js @@ -0,0 +1,2 @@ +import { value3 } from "./reexport"; +expect(value3).toBe(42); diff --git a/test/cases/scope-hoisting/side-effects-11990-star/chunk2.js b/test/cases/scope-hoisting/side-effects-11990-star/chunk2.js new file mode 100644 index 00000000000..22041a0b201 --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11990-star/chunk2.js @@ -0,0 +1,2 @@ +import { value2 } from "./module"; +expect(value2).toBe(42); diff --git a/test/cases/scope-hoisting/side-effects-11990-star/index.js b/test/cases/scope-hoisting/side-effects-11990-star/index.js new file mode 100644 index 00000000000..ef5350b5b0e --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11990-star/index.js @@ -0,0 +1,9 @@ +import { value, value3 } from "./reexport"; + +it("should generate working code", () => { + expect(value).toBe(42); + expect(value3).toBe(42); +}); + +it("should run the chunk1", () => import("./chunk1")); +it("should run the chunk2", () => import("./chunk2")); diff --git a/test/cases/scope-hoisting/side-effects-11990-star/module-concat.js b/test/cases/scope-hoisting/side-effects-11990-star/module-concat.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11990-star/module-concat.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/cases/scope-hoisting/side-effects-11990-star/module.js b/test/cases/scope-hoisting/side-effects-11990-star/module.js new file mode 100644 index 00000000000..3073df0aff2 --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11990-star/module.js @@ -0,0 +1,2 @@ +export const value = 42; +export const value2 = 42; diff --git a/test/cases/scope-hoisting/side-effects-11990-star/package.json b/test/cases/scope-hoisting/side-effects-11990-star/package.json new file mode 100644 index 00000000000..91aa84e230e --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11990-star/package.json @@ -0,0 +1,5 @@ +{ + "sideEffects": [ + "./reexport.js" + ] +} diff --git a/test/cases/scope-hoisting/side-effects-11990-star/reexport-concat.js b/test/cases/scope-hoisting/side-effects-11990-star/reexport-concat.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11990-star/reexport-concat.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/cases/scope-hoisting/side-effects-11990-star/reexport.js b/test/cases/scope-hoisting/side-effects-11990-star/reexport.js new file mode 100644 index 00000000000..a310c34e357 --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11990-star/reexport.js @@ -0,0 +1,4 @@ +export * from "./reexport2"; +import { value4 } from "./reexport2"; +import v from "./reexport-concat"; +export const value3 = v + value4 - value4; diff --git a/test/cases/scope-hoisting/side-effects-11990-star/reexport2.js b/test/cases/scope-hoisting/side-effects-11990-star/reexport2.js new file mode 100644 index 00000000000..c0b882f7916 --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11990-star/reexport2.js @@ -0,0 +1,3 @@ +export * from "./module"; +export const value4 = 42; +module.id; diff --git a/test/cases/scope-hoisting/side-effects-11990/chunk1.js b/test/cases/scope-hoisting/side-effects-11990/chunk1.js new file mode 100644 index 00000000000..9ca734f9ba8 --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11990/chunk1.js @@ -0,0 +1,2 @@ +import { value3 } from "./reexport"; +expect(value3).toBe(42); diff --git a/test/cases/scope-hoisting/side-effects-11990/chunk2.js b/test/cases/scope-hoisting/side-effects-11990/chunk2.js new file mode 100644 index 00000000000..22041a0b201 --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11990/chunk2.js @@ -0,0 +1,2 @@ +import { value2 } from "./module"; +expect(value2).toBe(42); diff --git a/test/cases/scope-hoisting/side-effects-11990/index.js b/test/cases/scope-hoisting/side-effects-11990/index.js new file mode 100644 index 00000000000..ef5350b5b0e --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11990/index.js @@ -0,0 +1,9 @@ +import { value, value3 } from "./reexport"; + +it("should generate working code", () => { + expect(value).toBe(42); + expect(value3).toBe(42); +}); + +it("should run the chunk1", () => import("./chunk1")); +it("should run the chunk2", () => import("./chunk2")); diff --git a/test/cases/scope-hoisting/side-effects-11990/module-concat.js b/test/cases/scope-hoisting/side-effects-11990/module-concat.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11990/module-concat.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/cases/scope-hoisting/side-effects-11990/module.js b/test/cases/scope-hoisting/side-effects-11990/module.js new file mode 100644 index 00000000000..3073df0aff2 --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11990/module.js @@ -0,0 +1,2 @@ +export const value = 42; +export const value2 = 42; diff --git a/test/cases/scope-hoisting/side-effects-11990/package.json b/test/cases/scope-hoisting/side-effects-11990/package.json new file mode 100644 index 00000000000..91aa84e230e --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11990/package.json @@ -0,0 +1,5 @@ +{ + "sideEffects": [ + "./reexport.js" + ] +} diff --git a/test/cases/scope-hoisting/side-effects-11990/reexport-concat.js b/test/cases/scope-hoisting/side-effects-11990/reexport-concat.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11990/reexport-concat.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/cases/scope-hoisting/side-effects-11990/reexport.js b/test/cases/scope-hoisting/side-effects-11990/reexport.js new file mode 100644 index 00000000000..7ea5749578e --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11990/reexport.js @@ -0,0 +1,4 @@ +export { value } from "./reexport2"; +import { value4 } from "./reexport2"; +import v from "./reexport-concat"; +export const value3 = v + value4 - value4; diff --git a/test/cases/scope-hoisting/side-effects-11990/reexport2.js b/test/cases/scope-hoisting/side-effects-11990/reexport2.js new file mode 100644 index 00000000000..9fdf39eb709 --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-11990/reexport2.js @@ -0,0 +1,3 @@ +export { value } from "./module"; +export const value4 = 42; +module.id; diff --git a/test/cases/scope-hoisting/side-effects-9159/index.js b/test/cases/scope-hoisting/side-effects-9159/index.js new file mode 100644 index 00000000000..d079635e771 --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-9159/index.js @@ -0,0 +1,5 @@ +it("should reexport from side-effect-free scope-hoisted module", () => { + const m = require("./reexport"); + expect(m.value).toBe(42); + expect(m.ns.default).toBe(42); +}); diff --git a/test/cases/scope-hoisting/side-effects-9159/package/index.js b/test/cases/scope-hoisting/side-effects-9159/package/index.js new file mode 100644 index 00000000000..8f260e45d50 --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-9159/package/index.js @@ -0,0 +1,4 @@ +export { default as value } from "./module"; + +import * as ns from "./module"; +export { ns }; diff --git a/test/cases/scope-hoisting/side-effects-9159/package/module.js b/test/cases/scope-hoisting/side-effects-9159/package/module.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-9159/package/module.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/cases/scope-hoisting/side-effects-9159/package/package.json b/test/cases/scope-hoisting/side-effects-9159/package/package.json new file mode 100644 index 00000000000..2124100b0ef --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-9159/package/package.json @@ -0,0 +1,3 @@ +{ + "sideEffects": false +} \ No newline at end of file diff --git a/test/cases/scope-hoisting/side-effects-9159/reexport.js b/test/cases/scope-hoisting/side-effects-9159/reexport.js new file mode 100644 index 00000000000..ae7bd1d070b --- /dev/null +++ b/test/cases/scope-hoisting/side-effects-9159/reexport.js @@ -0,0 +1 @@ +export { value, ns } from "./package"; diff --git a/test/cases/scope-hoisting/this-in-import/cjs.js b/test/cases/scope-hoisting/this-in-import/cjs.js new file mode 100644 index 00000000000..6b065c4c769 --- /dev/null +++ b/test/cases/scope-hoisting/this-in-import/cjs.js @@ -0,0 +1,5 @@ +exports.obj2 = { + func() { + return this; + } +}; diff --git a/test/cases/scope-hoisting/this-in-import/index.js b/test/cases/scope-hoisting/this-in-import/index.js new file mode 100644 index 00000000000..14f6fb16398 --- /dev/null +++ b/test/cases/scope-hoisting/this-in-import/index.js @@ -0,0 +1,13 @@ +import { obj } from "./module.js"; +import { obj2 } from "./cjs.js"; + +it("should have correct this in called function", () => { + const r = obj.func(); + expect(r).toBe(obj); + obj.test(); +}); + +it("should have correct this in called function from commonjs", () => { + const r = obj2.func(); + expect(r).toBe(obj2); +}); diff --git a/test/cases/scope-hoisting/this-in-import/module.js b/test/cases/scope-hoisting/this-in-import/module.js new file mode 100644 index 00000000000..0344f832d83 --- /dev/null +++ b/test/cases/scope-hoisting/this-in-import/module.js @@ -0,0 +1,9 @@ +import { obj as obj2 } from "./module"; +export const obj = { + func() { + return this; + }, + test() { + expect(obj2.func()).toBe(obj2); + } +}; diff --git a/test/cases/side-effects/dynamic-reexports/checked-export/dynamic.js b/test/cases/side-effects/dynamic-reexports/checked-export/dynamic.js new file mode 100644 index 00000000000..130e87bcec3 --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/checked-export/dynamic.js @@ -0,0 +1,2 @@ +Object(exports).value = 123; +Object(exports).value2 = 42; diff --git a/test/cases/side-effects/dynamic-reexports/checked-export/index.js b/test/cases/side-effects/dynamic-reexports/checked-export/index.js new file mode 100644 index 00000000000..c30705a797b --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/checked-export/index.js @@ -0,0 +1,3 @@ +export { value, value2 } from "./module"; + +throw new Error("Should not be loaded"); diff --git a/test/cases/side-effects/dynamic-reexports/checked-export/module.js b/test/cases/side-effects/dynamic-reexports/checked-export/module.js new file mode 100644 index 00000000000..6191513cb8b --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/checked-export/module.js @@ -0,0 +1,2 @@ +export const value = 42; +export * from "./dynamic"; diff --git a/test/cases/side-effects/dynamic-reexports/dedupe-target-static/a.js b/test/cases/side-effects/dynamic-reexports/dedupe-target-static/a.js new file mode 100644 index 00000000000..75d3b753f0d --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/dedupe-target-static/a.js @@ -0,0 +1,2 @@ +export * from "./module"; +export const valueUsed = __webpack_exports_info__.value.used; diff --git a/test/cases/side-effects/dynamic-reexports/dedupe-target-static/b.js b/test/cases/side-effects/dynamic-reexports/dedupe-target-static/b.js new file mode 100644 index 00000000000..b999044ad5c --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/dedupe-target-static/b.js @@ -0,0 +1 @@ +export * from "./module"; diff --git a/test/cases/side-effects/dynamic-reexports/dedupe-target-static/index.js b/test/cases/side-effects/dynamic-reexports/dedupe-target-static/index.js new file mode 100644 index 00000000000..c5b3fa6e01c --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/dedupe-target-static/index.js @@ -0,0 +1,4 @@ +export * from "./a"; +export * from "./b"; + +throw new Error("Should not be loaded"); diff --git a/test/cases/side-effects/dynamic-reexports/dedupe-target-static/module.js b/test/cases/side-effects/dynamic-reexports/dedupe-target-static/module.js new file mode 100644 index 00000000000..46d3ca8c61f --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/dedupe-target-static/module.js @@ -0,0 +1 @@ +export const value = 42; diff --git a/test/cases/side-effects/dynamic-reexports/dedupe-target-with-side/a.js b/test/cases/side-effects/dynamic-reexports/dedupe-target-with-side/a.js new file mode 100644 index 00000000000..d8b6513427f --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/dedupe-target-with-side/a.js @@ -0,0 +1,2 @@ +export * from "./empty"; +export const valueUsed = __webpack_exports_info__.value.used; diff --git a/test/cases/side-effects/dynamic-reexports/dedupe-target-with-side/b.js b/test/cases/side-effects/dynamic-reexports/dedupe-target-with-side/b.js new file mode 100644 index 00000000000..7ea57f94bb9 --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/dedupe-target-with-side/b.js @@ -0,0 +1 @@ +export * from "./empty"; diff --git a/test/cases/side-effects/dynamic-reexports/dedupe-target-with-side/empty.js b/test/cases/side-effects/dynamic-reexports/dedupe-target-with-side/empty.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/cases/side-effects/dynamic-reexports/dedupe-target-with-side/index.js b/test/cases/side-effects/dynamic-reexports/dedupe-target-with-side/index.js new file mode 100644 index 00000000000..3ebcd0b9763 --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/dedupe-target-with-side/index.js @@ -0,0 +1,2 @@ +export * from "./a"; +export * from "./b"; diff --git a/test/cases/side-effects/dynamic-reexports/dedupe-target-with-side/package.json b/test/cases/side-effects/dynamic-reexports/dedupe-target-with-side/package.json new file mode 100644 index 00000000000..2c63c085104 --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/dedupe-target-with-side/package.json @@ -0,0 +1,2 @@ +{ +} diff --git a/test/cases/side-effects/dynamic-reexports/dedupe-target/a.js b/test/cases/side-effects/dynamic-reexports/dedupe-target/a.js new file mode 100644 index 00000000000..d8b6513427f --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/dedupe-target/a.js @@ -0,0 +1,2 @@ +export * from "./empty"; +export const valueUsed = __webpack_exports_info__.value.used; diff --git a/test/cases/side-effects/dynamic-reexports/dedupe-target/b.js b/test/cases/side-effects/dynamic-reexports/dedupe-target/b.js new file mode 100644 index 00000000000..7ea57f94bb9 --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/dedupe-target/b.js @@ -0,0 +1 @@ +export * from "./empty"; diff --git a/test/cases/side-effects/dynamic-reexports/dedupe-target/empty.js b/test/cases/side-effects/dynamic-reexports/dedupe-target/empty.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/cases/side-effects/dynamic-reexports/dedupe-target/index.js b/test/cases/side-effects/dynamic-reexports/dedupe-target/index.js new file mode 100644 index 00000000000..c5b3fa6e01c --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/dedupe-target/index.js @@ -0,0 +1,4 @@ +export * from "./a"; +export * from "./b"; + +throw new Error("Should not be loaded"); diff --git a/test/cases/side-effects/dynamic-reexports/default-export/a.js b/test/cases/side-effects/dynamic-reexports/default-export/a.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/default-export/a.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/cases/side-effects/dynamic-reexports/default-export/b.js b/test/cases/side-effects/dynamic-reexports/default-export/b.js new file mode 100644 index 00000000000..888cae37af9 --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/default-export/b.js @@ -0,0 +1 @@ +module.exports = 42; diff --git a/test/cases/side-effects/dynamic-reexports/default-export/empty.js b/test/cases/side-effects/dynamic-reexports/default-export/empty.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/cases/side-effects/dynamic-reexports/default-export/index.js b/test/cases/side-effects/dynamic-reexports/default-export/index.js new file mode 100644 index 00000000000..233397575af --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/default-export/index.js @@ -0,0 +1,6 @@ +export { default as a } from "./a"; +export { default as b } from "./b"; +export { default as empty } from "./empty"; +export { default as json } from "./json"; + +throw new Error("Should not be loaded"); diff --git a/test/cases/side-effects/dynamic-reexports/default-export/json.json b/test/cases/side-effects/dynamic-reexports/default-export/json.json new file mode 100644 index 00000000000..d81cc0710eb --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/default-export/json.json @@ -0,0 +1 @@ +42 diff --git a/test/cases/side-effects/dynamic-reexports/direct-export/dynamic.js b/test/cases/side-effects/dynamic-reexports/direct-export/dynamic.js new file mode 100644 index 00000000000..130e87bcec3 --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/direct-export/dynamic.js @@ -0,0 +1,2 @@ +Object(exports).value = 123; +Object(exports).value2 = 42; diff --git a/test/cases/side-effects/dynamic-reexports/direct-export/index.js b/test/cases/side-effects/dynamic-reexports/direct-export/index.js new file mode 100644 index 00000000000..b999044ad5c --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/direct-export/index.js @@ -0,0 +1 @@ +export * from "./module"; diff --git a/test/cases/side-effects/dynamic-reexports/direct-export/module.js b/test/cases/side-effects/dynamic-reexports/direct-export/module.js new file mode 100644 index 00000000000..6191513cb8b --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/direct-export/module.js @@ -0,0 +1,2 @@ +export const value = 42; +export * from "./dynamic"; diff --git a/test/cases/side-effects/dynamic-reexports/dynamic-reexport-default/dynamic.js b/test/cases/side-effects/dynamic-reexports/dynamic-reexport-default/dynamic.js new file mode 100644 index 00000000000..39c382f2d53 --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/dynamic-reexport-default/dynamic.js @@ -0,0 +1 @@ +Object(exports).default = "dynamic"; diff --git a/test/cases/side-effects/dynamic-reexports/dynamic-reexport-default/index.js b/test/cases/side-effects/dynamic-reexports/dynamic-reexport-default/index.js new file mode 100644 index 00000000000..3e2a2b05e3a --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/dynamic-reexport-default/index.js @@ -0,0 +1,2 @@ +export * from "./dynamic"; +export default "static"; diff --git a/test/cases/side-effects/dynamic-reexports/index.js b/test/cases/side-effects/dynamic-reexports/index.js new file mode 100644 index 00000000000..b720f85ed41 --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/index.js @@ -0,0 +1,78 @@ +import { unused, unprovided } from "./unused"; +import { + value as valueStatic, + valueUsed as valueUsedStatic +} from "./dedupe-target-static"; +import { + value as valueSide, + valueUsed as valueUsedSide +} from "./dedupe-target-with-side"; +import { value, valueUsed } from "./dedupe-target"; +import * as DefaultExport from "./default-export"; +import { + value as valueDirect, + value2 as value2Direct, + default as Default1 +} from "./direct-export"; +import { + value as valueChecked, + value2 as value2Checked +} from "./checked-export"; +import Default2 from "./dynamic-reexport-default"; +import { + value as valueMultipleSources, + value2 as value2MultipleSources +} from "./multiple-sources"; +import { a, b } from "./swapped"; + +it("should dedupe static reexport target", () => { + expect(valueStatic).toBe(42); + expect(valueUsedStatic).toBe(unused); +}); + +it("should dedupe dynamic reexport target", () => { + expect(value).toBe(undefined); + expect(valueUsed).toBe(unused); +}); + +it("should not dedupe dynamic reexport target when it has side-effects", () => { + expect(valueSide).toBe(undefined); + expect(valueUsedSide).toBe(true); +}); + +it("should optimize dynamic default reexport", () => { + expect(DefaultExport.a).toBe(42); + expect(DefaultExport.b).toBe(42); + expect(DefaultExport.empty).toEqual({}); + expect(DefaultExport.json).toBe(42); +}); + +it("should handle default export when reexporting", () => { + const module = Object(require("./reexports-excludes-default")); + expect(module.defaultProvided).toBe(unprovided); +}); + +it("should handle direct export when reexporting", () => { + expect(valueDirect).toBe(42); + expect(value2Direct).toBe(42); +}); + +it("should handle checked dynamic export when reexporting", () => { + expect(valueChecked).toBe(42); + expect(value2Checked).toBe(42); +}); + +it("should handle default export correctly", () => { + expect(Default1).toBe(undefined); + expect(Default2).toBe("static"); +}); + +it("should handle multiple dynamic sources correctly", () => { + expect(valueMultipleSources).toBe(42); + expect(value2MultipleSources).toBe(42); +}); + +it("should handle renamed dynamic reexports", () => { + expect(a).toBe(43); + expect(b).toBe(42); +}); diff --git a/test/cases/side-effects/dynamic-reexports/multiple-sources/a.js b/test/cases/side-effects/dynamic-reexports/multiple-sources/a.js new file mode 100644 index 00000000000..baf3793a747 --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/multiple-sources/a.js @@ -0,0 +1 @@ +Object(exports).value = 42; diff --git a/test/cases/side-effects/dynamic-reexports/multiple-sources/b.js b/test/cases/side-effects/dynamic-reexports/multiple-sources/b.js new file mode 100644 index 00000000000..0e0dd77fafe --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/multiple-sources/b.js @@ -0,0 +1 @@ +Object(exports).value2 = 42; diff --git a/test/cases/side-effects/dynamic-reexports/multiple-sources/index.js b/test/cases/side-effects/dynamic-reexports/multiple-sources/index.js new file mode 100644 index 00000000000..3a1d89b456f --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/multiple-sources/index.js @@ -0,0 +1,3 @@ +export * from "./module"; + +throw new Error("Should not be loaded"); diff --git a/test/cases/side-effects/dynamic-reexports/multiple-sources/module.js b/test/cases/side-effects/dynamic-reexports/multiple-sources/module.js new file mode 100644 index 00000000000..8773acf6d0a --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/multiple-sources/module.js @@ -0,0 +1,2 @@ +export * from "./module2"; +export * from "./a"; diff --git a/test/cases/side-effects/dynamic-reexports/multiple-sources/module2.js b/test/cases/side-effects/dynamic-reexports/multiple-sources/module2.js new file mode 100644 index 00000000000..14065b7bb3f --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/multiple-sources/module2.js @@ -0,0 +1 @@ +export * from "./b"; diff --git a/test/cases/side-effects/dynamic-reexports/package.json b/test/cases/side-effects/dynamic-reexports/package.json new file mode 100644 index 00000000000..a43829151e1 --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/package.json @@ -0,0 +1,3 @@ +{ + "sideEffects": false +} diff --git a/test/cases/side-effects/dynamic-reexports/reexports-excludes-default/empty.js b/test/cases/side-effects/dynamic-reexports/reexports-excludes-default/empty.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/cases/side-effects/dynamic-reexports/reexports-excludes-default/index.js b/test/cases/side-effects/dynamic-reexports/reexports-excludes-default/index.js new file mode 100644 index 00000000000..b999044ad5c --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/reexports-excludes-default/index.js @@ -0,0 +1 @@ +export * from "./module"; diff --git a/test/cases/side-effects/dynamic-reexports/reexports-excludes-default/module.js b/test/cases/side-effects/dynamic-reexports/reexports-excludes-default/module.js new file mode 100644 index 00000000000..1a8a3f1df1f --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/reexports-excludes-default/module.js @@ -0,0 +1,3 @@ +export * from "./empty"; +export const defaultUsed = __webpack_exports_info__.default.used; +export const defaultProvided = __webpack_exports_info__.default.provideInfo; diff --git a/test/cases/side-effects/dynamic-reexports/swapped/a.js b/test/cases/side-effects/dynamic-reexports/swapped/a.js new file mode 100644 index 00000000000..71becd3a350 --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/swapped/a.js @@ -0,0 +1 @@ +export const a = 42; diff --git a/test/cases/side-effects/dynamic-reexports/swapped/b.js b/test/cases/side-effects/dynamic-reexports/swapped/b.js new file mode 100644 index 00000000000..fbf792d371f --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/swapped/b.js @@ -0,0 +1 @@ +Object(exports).b = 43; diff --git a/test/cases/side-effects/dynamic-reexports/swapped/index.js b/test/cases/side-effects/dynamic-reexports/swapped/index.js new file mode 100644 index 00000000000..0706d1f0a74 --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/swapped/index.js @@ -0,0 +1 @@ +export * from "./module2"; diff --git a/test/cases/side-effects/dynamic-reexports/swapped/module.js b/test/cases/side-effects/dynamic-reexports/swapped/module.js new file mode 100644 index 00000000000..3ebcd0b9763 --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/swapped/module.js @@ -0,0 +1,2 @@ +export * from "./a"; +export * from "./b"; diff --git a/test/cases/side-effects/dynamic-reexports/swapped/module2.js b/test/cases/side-effects/dynamic-reexports/swapped/module2.js new file mode 100644 index 00000000000..2cbe904c784 --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/swapped/module2.js @@ -0,0 +1,3 @@ +export { a as b } from "./module"; +export { b as a } from "./module"; +export * from "./module"; diff --git a/test/cases/side-effects/dynamic-reexports/unused.js b/test/cases/side-effects/dynamic-reexports/unused.js new file mode 100644 index 00000000000..eaad7c7da65 --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/unused.js @@ -0,0 +1,3 @@ +export const value = 42; +export const unused = __webpack_exports_info__.value.used; +export const unprovided = __webpack_exports_info__.other.provideInfo; diff --git a/test/cases/side-effects/dynamic-reexports/warnings.js b/test/cases/side-effects/dynamic-reexports/warnings.js new file mode 100644 index 00000000000..82181f096fe --- /dev/null +++ b/test/cases/side-effects/dynamic-reexports/warnings.js @@ -0,0 +1,5 @@ +module.exports = [ + [ + /export 'default' \(imported as 'Default1'\) was not found in '\.\/direct-export'/ + ] +]; diff --git a/test/cases/side-effects/empty-modules/cjs.js b/test/cases/side-effects/empty-modules/cjs.js new file mode 100644 index 00000000000..fef83a9cfe6 --- /dev/null +++ b/test/cases/side-effects/empty-modules/cjs.js @@ -0,0 +1 @@ +// comment diff --git a/test/cases/side-effects/empty-modules/index.js b/test/cases/side-effects/empty-modules/index.js new file mode 100644 index 00000000000..c2cb7bed0e0 --- /dev/null +++ b/test/cases/side-effects/empty-modules/index.js @@ -0,0 +1,19 @@ +import "./module"; +import "./cjs"; +import "./pure"; +import "./referenced"; +import "./side-referenced"; + +if (process.env.NODE_ENV === "production") { + it("should skip imports to empty modules", () => { + expect(require.resolveWeak("./cjs")).toBe(null); + expect(require.resolveWeak("./module")).toBe(null); + expect(require.resolveWeak("./pure")).toBe(null); + expect(require.resolveWeak("./referenced")).toBe(null); + }); +} + +it("should not skip transitive side effects", () => { + expect(global.value).toBe(true); + delete global.value; +}); diff --git a/test/cases/side-effects/empty-modules/module.js b/test/cases/side-effects/empty-modules/module.js new file mode 100644 index 00000000000..c5a5815bd5d --- /dev/null +++ b/test/cases/side-effects/empty-modules/module.js @@ -0,0 +1,2 @@ +// comment +export {}; diff --git a/test/cases/side-effects/empty-modules/pure.js b/test/cases/side-effects/empty-modules/pure.js new file mode 100644 index 00000000000..4f4a4cdcc4a --- /dev/null +++ b/test/cases/side-effects/empty-modules/pure.js @@ -0,0 +1,31 @@ +// comment +export default /*#__PURE__*/ console.log.bind(null, "test"); +const unused = /*#__PURE__*/ console.log.bind(null, "test"); +const unusedExport = /*#__PURE__*/ console.log.bind(null, "test"); +export { unusedExport, class1, class2, fun1, fun2, fun3 }; +function fun1() { + console.log.bind(null, "test"); + return unused; +} +const fun2 = function () { + console.log.bind(null, "test"); +}; +const fun3 = () => { + console.log.bind(null, "test"); +}; +class class1 { + constructor() { + console.log.bind(null, "test"); + } +} +const class2 = class { + constructor() { + console.log.bind(null, "test"); + } +}; +if ("") { + console.log.bind(null, "test"); +} +for (; false; ) {} +for (var i = 0; false; ) {} +while (false) {} diff --git a/test/cases/side-effects/empty-modules/referenced.js b/test/cases/side-effects/empty-modules/referenced.js new file mode 100644 index 00000000000..78ab1819913 --- /dev/null +++ b/test/cases/side-effects/empty-modules/referenced.js @@ -0,0 +1,8 @@ +import "./module"; +import "./cjs"; +import { unusedExport } from "./pure"; +export { unusedExport } from "./pure"; + +export function unused() { + return unusedExport; +} diff --git a/test/cases/side-effects/empty-modules/side-referenced.js b/test/cases/side-effects/empty-modules/side-referenced.js new file mode 100644 index 00000000000..52e867e9f20 --- /dev/null +++ b/test/cases/side-effects/empty-modules/side-referenced.js @@ -0,0 +1 @@ +import "./side"; diff --git a/test/cases/side-effects/empty-modules/side.js b/test/cases/side-effects/empty-modules/side.js new file mode 100644 index 00000000000..c9bec6433a4 --- /dev/null +++ b/test/cases/side-effects/empty-modules/side.js @@ -0,0 +1 @@ +global.value = true; diff --git a/test/cases/side-effects/issue-11673/index.js b/test/cases/side-effects/issue-11673/index.js new file mode 100644 index 00000000000..5f9b0e60b30 --- /dev/null +++ b/test/cases/side-effects/issue-11673/index.js @@ -0,0 +1,12 @@ +import { Worker } from "worker_threads"; +import { X } from "./module"; +// test + +it("should compile", done => { + expect(X()).toBe("X"); + const worker = new Worker(new URL("worker.js", import.meta.url)); + worker.once("message", value => { + expect(value).toBe(42); + Promise.resolve(worker.terminate()).then(() => done(), done); + }); +}); diff --git a/test/cases/side-effects/issue-11673/module.js b/test/cases/side-effects/issue-11673/module.js new file mode 100644 index 00000000000..8d1ac538f8a --- /dev/null +++ b/test/cases/side-effects/issue-11673/module.js @@ -0,0 +1,9 @@ +import value from "package"; + +export function X() { + return "X"; +} + +export function Y() { + return value; +} diff --git a/test/cases/side-effects/issue-11673/node_modules/package/index.js b/test/cases/side-effects/issue-11673/node_modules/package/index.js new file mode 100644 index 00000000000..09c37da1b5c --- /dev/null +++ b/test/cases/side-effects/issue-11673/node_modules/package/index.js @@ -0,0 +1,2 @@ +exports.default = 42; +module.exports = exports.default; diff --git a/test/cases/side-effects/issue-11673/node_modules/package/package.json b/test/cases/side-effects/issue-11673/node_modules/package/package.json new file mode 100644 index 00000000000..a43829151e1 --- /dev/null +++ b/test/cases/side-effects/issue-11673/node_modules/package/package.json @@ -0,0 +1,3 @@ +{ + "sideEffects": false +} diff --git a/test/cases/side-effects/issue-11673/test.filter.js b/test/cases/side-effects/issue-11673/test.filter.js new file mode 100644 index 00000000000..f74eb03f05a --- /dev/null +++ b/test/cases/side-effects/issue-11673/test.filter.js @@ -0,0 +1,5 @@ +const supportsWorker = require("../../../helpers/supportsWorker"); + +module.exports = function (config) { + return supportsWorker(); +}; diff --git a/test/cases/side-effects/issue-11673/worker.js b/test/cases/side-effects/issue-11673/worker.js new file mode 100644 index 00000000000..21dd3fbc552 --- /dev/null +++ b/test/cases/side-effects/issue-11673/worker.js @@ -0,0 +1,4 @@ +import { Y } from "./module"; +import { parentPort } from "worker_threads"; + +parentPort.postMessage(Y()); diff --git a/test/cases/side-effects/issue-12071/index.js b/test/cases/side-effects/issue-12071/index.js new file mode 100644 index 00000000000..db25f5ee8dc --- /dev/null +++ b/test/cases/side-effects/issue-12071/index.js @@ -0,0 +1,11 @@ +require("./module"); +require("./reexport"); + +import { value } from "./reexport2"; +const { value: value2, own } = require("./reexport2"); + +it("should not crash", () => { + expect(value).toBe(42); + expect(value2).toBe(42); + expect(own).toBe(42); +}); diff --git a/test/cases/side-effects/issue-12071/module.js b/test/cases/side-effects/issue-12071/module.js new file mode 100644 index 00000000000..46d3ca8c61f --- /dev/null +++ b/test/cases/side-effects/issue-12071/module.js @@ -0,0 +1 @@ +export const value = 42; diff --git a/test/cases/side-effects/issue-12071/package.json b/test/cases/side-effects/issue-12071/package.json new file mode 100644 index 00000000000..a43829151e1 --- /dev/null +++ b/test/cases/side-effects/issue-12071/package.json @@ -0,0 +1,3 @@ +{ + "sideEffects": false +} diff --git a/test/cases/side-effects/issue-12071/reexport.js b/test/cases/side-effects/issue-12071/reexport.js new file mode 100644 index 00000000000..b72ba5eb7db --- /dev/null +++ b/test/cases/side-effects/issue-12071/reexport.js @@ -0,0 +1,2 @@ +export { value } from "./module"; +export const own = 42; diff --git a/test/cases/side-effects/issue-12071/reexport2-concat.js b/test/cases/side-effects/issue-12071/reexport2-concat.js new file mode 100644 index 00000000000..4bead6aab51 --- /dev/null +++ b/test/cases/side-effects/issue-12071/reexport2-concat.js @@ -0,0 +1 @@ +export const test = () => {}; diff --git a/test/cases/side-effects/issue-12071/reexport2.js b/test/cases/side-effects/issue-12071/reexport2.js new file mode 100644 index 00000000000..a4c89e9f78f --- /dev/null +++ b/test/cases/side-effects/issue-12071/reexport2.js @@ -0,0 +1,3 @@ +import { test } from "./reexport2-concat"; +export * from "./reexport"; +test(); diff --git a/test/cases/side-effects/issue-12114/a.js b/test/cases/side-effects/issue-12114/a.js new file mode 100644 index 00000000000..fea4c811245 --- /dev/null +++ b/test/cases/side-effects/issue-12114/a.js @@ -0,0 +1,5 @@ +import { f } from "./reexport"; + +console.log.bind(console, f); + +export default f(); diff --git a/test/cases/side-effects/issue-12114/b.js b/test/cases/side-effects/issue-12114/b.js new file mode 100644 index 00000000000..5c0d9b9e857 --- /dev/null +++ b/test/cases/side-effects/issue-12114/b.js @@ -0,0 +1,5 @@ +import { f } from "base"; + +console.log.bind(console, f); + +export default f(); diff --git a/test/cases/side-effects/issue-12114/index.js b/test/cases/side-effects/issue-12114/index.js new file mode 100644 index 00000000000..1ce003fbef3 --- /dev/null +++ b/test/cases/side-effects/issue-12114/index.js @@ -0,0 +1,7 @@ +const a = require("./a"); +const b = require("./b"); + +it("should work", () => { + expect(a.default).toBe(42); + expect(b.default).toBe(42); +}); diff --git a/test/cases/side-effects/issue-12114/node_modules/base/index.js b/test/cases/side-effects/issue-12114/node_modules/base/index.js new file mode 100644 index 00000000000..12c6cb3bcea --- /dev/null +++ b/test/cases/side-effects/issue-12114/node_modules/base/index.js @@ -0,0 +1,5 @@ +import { __extends } from 'tslib'; + +console.log.bind(console, __extends); + +export const f = () => __extends; diff --git a/test/cases/side-effects/issue-12114/node_modules/base/package.json b/test/cases/side-effects/issue-12114/node_modules/base/package.json new file mode 100644 index 00000000000..15f20a07625 --- /dev/null +++ b/test/cases/side-effects/issue-12114/node_modules/base/package.json @@ -0,0 +1,5 @@ +{ + "name": "@test/base", + "sideEffects": false, + "version": "0.0.7" +} diff --git a/test/cases/side-effects/issue-12114/node_modules/tslib.js b/test/cases/side-effects/issue-12114/node_modules/tslib.js new file mode 100644 index 00000000000..dae299d0f81 --- /dev/null +++ b/test/cases/side-effects/issue-12114/node_modules/tslib.js @@ -0,0 +1 @@ +export const __extends = 42; diff --git a/test/cases/side-effects/issue-12114/reexport.js b/test/cases/side-effects/issue-12114/reexport.js new file mode 100644 index 00000000000..8f65558157f --- /dev/null +++ b/test/cases/side-effects/issue-12114/reexport.js @@ -0,0 +1 @@ +export { f } from 'base'; diff --git a/test/cases/side-effects/issue-12570-second-try/chunk.js b/test/cases/side-effects/issue-12570-second-try/chunk.js new file mode 100644 index 00000000000..da80a444c89 --- /dev/null +++ b/test/cases/side-effects/issue-12570-second-try/chunk.js @@ -0,0 +1,3 @@ +import { value } from "./inner-module"; + +console.log.bind(console, value); diff --git a/test/cases/side-effects/issue-12570-second-try/index.js b/test/cases/side-effects/issue-12570-second-try/index.js new file mode 100644 index 00000000000..dde84686a48 --- /dev/null +++ b/test/cases/side-effects/issue-12570-second-try/index.js @@ -0,0 +1,4 @@ +it("should compile", () => { + require("./module"); + require("./inner-module"); +}); diff --git a/test/cases/side-effects/issue-12570-second-try/inner-module.js b/test/cases/side-effects/issue-12570-second-try/inner-module.js new file mode 100644 index 00000000000..46d3ca8c61f --- /dev/null +++ b/test/cases/side-effects/issue-12570-second-try/inner-module.js @@ -0,0 +1 @@ +export const value = 42; diff --git a/test/cases/side-effects/issue-12570-second-try/inner-reexport-chain.js b/test/cases/side-effects/issue-12570-second-try/inner-reexport-chain.js new file mode 100644 index 00000000000..087e8eaf1fb --- /dev/null +++ b/test/cases/side-effects/issue-12570-second-try/inner-reexport-chain.js @@ -0,0 +1 @@ +export * from "./inner-reexport.js"; diff --git a/test/cases/side-effects/issue-12570-second-try/inner-reexport.js b/test/cases/side-effects/issue-12570-second-try/inner-reexport.js new file mode 100644 index 00000000000..82fe79841f5 --- /dev/null +++ b/test/cases/side-effects/issue-12570-second-try/inner-reexport.js @@ -0,0 +1,2 @@ +export * from "./inner-module.js"; +export var other = 1; diff --git a/test/cases/side-effects/issue-12570-second-try/inner-reexport2.js b/test/cases/side-effects/issue-12570-second-try/inner-reexport2.js new file mode 100644 index 00000000000..c5d69fc6807 --- /dev/null +++ b/test/cases/side-effects/issue-12570-second-try/inner-reexport2.js @@ -0,0 +1,2 @@ +export * from "./inner-module.js"; +export var other2 = 1; diff --git a/test/cases/side-effects/issue-12570-second-try/module.js b/test/cases/side-effects/issue-12570-second-try/module.js new file mode 100644 index 00000000000..8c5150d7011 --- /dev/null +++ b/test/cases/side-effects/issue-12570-second-try/module.js @@ -0,0 +1 @@ +export * from "./reexport"; diff --git a/test/cases/side-effects/issue-12570-second-try/package.json b/test/cases/side-effects/issue-12570-second-try/package.json new file mode 100644 index 00000000000..a43829151e1 --- /dev/null +++ b/test/cases/side-effects/issue-12570-second-try/package.json @@ -0,0 +1,3 @@ +{ + "sideEffects": false +} diff --git a/test/cases/side-effects/issue-12570-second-try/reexport.js b/test/cases/side-effects/issue-12570-second-try/reexport.js new file mode 100644 index 00000000000..51edcb74432 --- /dev/null +++ b/test/cases/side-effects/issue-12570-second-try/reexport.js @@ -0,0 +1,2 @@ +export * from "./inner-reexport-chain"; +export * from "./inner-reexport2"; diff --git a/test/cases/side-effects/issue-12570/chunk.js b/test/cases/side-effects/issue-12570/chunk.js new file mode 100644 index 00000000000..41abcce2b5f --- /dev/null +++ b/test/cases/side-effects/issue-12570/chunk.js @@ -0,0 +1,3 @@ +import { other } from "./inner-reexport"; + +console.log.bind(console, other); diff --git a/test/cases/side-effects/issue-12570/index.js b/test/cases/side-effects/issue-12570/index.js new file mode 100644 index 00000000000..c6ca2142abc --- /dev/null +++ b/test/cases/side-effects/issue-12570/index.js @@ -0,0 +1,4 @@ +it("should compile", () => { + require("./module"); + require("./chunk"); +}); diff --git a/test/cases/side-effects/issue-12570/inner-module.js b/test/cases/side-effects/issue-12570/inner-module.js new file mode 100644 index 00000000000..46d3ca8c61f --- /dev/null +++ b/test/cases/side-effects/issue-12570/inner-module.js @@ -0,0 +1 @@ +export const value = 42; diff --git a/test/cases/side-effects/issue-12570/inner-reexport.js b/test/cases/side-effects/issue-12570/inner-reexport.js new file mode 100644 index 00000000000..82fe79841f5 --- /dev/null +++ b/test/cases/side-effects/issue-12570/inner-reexport.js @@ -0,0 +1,2 @@ +export * from "./inner-module.js"; +export var other = 1; diff --git a/test/cases/side-effects/issue-12570/module.js b/test/cases/side-effects/issue-12570/module.js new file mode 100644 index 00000000000..8c5150d7011 --- /dev/null +++ b/test/cases/side-effects/issue-12570/module.js @@ -0,0 +1 @@ +export * from "./reexport"; diff --git a/test/cases/side-effects/issue-12570/package.json b/test/cases/side-effects/issue-12570/package.json new file mode 100644 index 00000000000..a43829151e1 --- /dev/null +++ b/test/cases/side-effects/issue-12570/package.json @@ -0,0 +1,3 @@ +{ + "sideEffects": false +} diff --git a/test/cases/side-effects/issue-12570/reexport.js b/test/cases/side-effects/issue-12570/reexport.js new file mode 100644 index 00000000000..861a960415a --- /dev/null +++ b/test/cases/side-effects/issue-12570/reexport.js @@ -0,0 +1,2 @@ +export * from "./inner-reexport"; +export * from "./inner-module"; diff --git a/test/cases/side-effects/order-issue-7665/index.js b/test/cases/side-effects/order-issue-7665/index.js index 378de0e896e..85e9d3df58a 100644 --- a/test/cases/side-effects/order-issue-7665/index.js +++ b/test/cases/side-effects/order-issue-7665/index.js @@ -1,7 +1,7 @@ import array from "./tracker"; import { b } from "./module"; -it("should evaulate modules in the correct order", () => { +it("should evaluate modules in the correct order", () => { expect(b).toEqual("b"); expect(array).toEqual(["b", "a"]); }) diff --git a/test/cases/side-effects/wrong-module-10146/index.js b/test/cases/side-effects/wrong-module-10146/index.js new file mode 100644 index 00000000000..f58afa48ba0 --- /dev/null +++ b/test/cases/side-effects/wrong-module-10146/index.js @@ -0,0 +1,5 @@ +import { A } from "./module"; + +it("should return the correct module", () => { + expect(A()).toEqual("A/index.js"); +}); diff --git a/test/cases/side-effects/wrong-module-10146/module/A/A.js b/test/cases/side-effects/wrong-module-10146/module/A/A.js new file mode 100644 index 00000000000..a718f1bce88 --- /dev/null +++ b/test/cases/side-effects/wrong-module-10146/module/A/A.js @@ -0,0 +1,3 @@ +export default function hello() { + return 'A/A.js' +} diff --git a/test/cases/side-effects/wrong-module-10146/module/A/index.js b/test/cases/side-effects/wrong-module-10146/module/A/index.js new file mode 100644 index 00000000000..e7f7eb5c8c8 --- /dev/null +++ b/test/cases/side-effects/wrong-module-10146/module/A/index.js @@ -0,0 +1,6 @@ + +export { default as A } from "./A"; + +export default function hello() { + return 'A/index.js' +} diff --git a/test/cases/side-effects/wrong-module-10146/module/index.js b/test/cases/side-effects/wrong-module-10146/module/index.js new file mode 100644 index 00000000000..37098dd430f --- /dev/null +++ b/test/cases/side-effects/wrong-module-10146/module/index.js @@ -0,0 +1 @@ +export { default as A } from "./A"; diff --git a/test/cases/side-effects/wrong-module-10146/module/package.json b/test/cases/side-effects/wrong-module-10146/module/package.json new file mode 100644 index 00000000000..a43829151e1 --- /dev/null +++ b/test/cases/side-effects/wrong-module-10146/module/package.json @@ -0,0 +1,3 @@ +{ + "sideEffects": false +} diff --git a/test/cases/wasm/decoding/test.filter.js b/test/cases/wasm/decoding/test.filter.js index 23177349638..cb37e21905f 100644 --- a/test/cases/wasm/decoding/test.filter.js +++ b/test/cases/wasm/decoding/test.filter.js @@ -1,5 +1,5 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); -module.exports = function(config) { +module.exports = function (config) { return supportsWebAssembly(); }; diff --git a/test/cases/wasm/export-imported-global/test.filter.js b/test/cases/wasm/export-imported-global/test.filter.js index 23177349638..cb37e21905f 100644 --- a/test/cases/wasm/export-imported-global/test.filter.js +++ b/test/cases/wasm/export-imported-global/test.filter.js @@ -1,5 +1,5 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); -module.exports = function(config) { +module.exports = function (config) { return supportsWebAssembly(); }; diff --git a/test/cases/wasm/finalize-exports-issue-8261/test.filter.js b/test/cases/wasm/finalize-exports-issue-8261/test.filter.js index 23177349638..cb37e21905f 100644 --- a/test/cases/wasm/finalize-exports-issue-8261/test.filter.js +++ b/test/cases/wasm/finalize-exports-issue-8261/test.filter.js @@ -1,5 +1,5 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); -module.exports = function(config) { +module.exports = function (config) { return supportsWebAssembly(); }; diff --git a/test/cases/wasm/global-refs-imported-global/index.js b/test/cases/wasm/global-refs-imported-global/index.js index 3cb8ff40e28..86aac501c64 100644 --- a/test/cases/wasm/global-refs-imported-global/index.js +++ b/test/cases/wasm/global-refs-imported-global/index.js @@ -1,4 +1,4 @@ -it("should allow global with imported global as initilizer", function() { +it("should allow global with imported global as initializer", function() { return import("./module.wat").then(function({get}) { expect(get()).toEqual(33); }); diff --git a/test/cases/wasm/global-refs-imported-global/test.filter.js b/test/cases/wasm/global-refs-imported-global/test.filter.js index 23177349638..cb37e21905f 100644 --- a/test/cases/wasm/global-refs-imported-global/test.filter.js +++ b/test/cases/wasm/global-refs-imported-global/test.filter.js @@ -1,5 +1,5 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); -module.exports = function(config) { +module.exports = function (config) { return supportsWebAssembly(); }; diff --git a/test/cases/wasm/import-wasm-wasm/test.filter.js b/test/cases/wasm/import-wasm-wasm/test.filter.js index 23177349638..cb37e21905f 100644 --- a/test/cases/wasm/import-wasm-wasm/test.filter.js +++ b/test/cases/wasm/import-wasm-wasm/test.filter.js @@ -1,5 +1,5 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); -module.exports = function(config) { +module.exports = function (config) { return supportsWebAssembly(); }; diff --git a/test/cases/wasm/imported-global-preserve-ordering/test.filter.js b/test/cases/wasm/imported-global-preserve-ordering/test.filter.js index 23177349638..cb37e21905f 100644 --- a/test/cases/wasm/imported-global-preserve-ordering/test.filter.js +++ b/test/cases/wasm/imported-global-preserve-ordering/test.filter.js @@ -1,5 +1,5 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); -module.exports = function(config) { +module.exports = function (config) { return supportsWebAssembly(); }; diff --git a/test/cases/wasm/imported-global-preserve-type/test.filter.js b/test/cases/wasm/imported-global-preserve-type/test.filter.js index 23177349638..cb37e21905f 100644 --- a/test/cases/wasm/imported-global-preserve-type/test.filter.js +++ b/test/cases/wasm/imported-global-preserve-type/test.filter.js @@ -1,5 +1,5 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); -module.exports = function(config) { +module.exports = function (config) { return supportsWebAssembly(); }; diff --git a/test/cases/wasm/imports-circular/test.filter.js b/test/cases/wasm/imports-circular/test.filter.js index 23177349638..cb37e21905f 100644 --- a/test/cases/wasm/imports-circular/test.filter.js +++ b/test/cases/wasm/imports-circular/test.filter.js @@ -1,5 +1,5 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); -module.exports = function(config) { +module.exports = function (config) { return supportsWebAssembly(); }; diff --git a/test/cases/wasm/imports-complex-types/index.js b/test/cases/wasm/imports-complex-types/index.js index c2e0b23fead..3d2b113b93f 100644 --- a/test/cases/wasm/imports-complex-types/index.js +++ b/test/cases/wasm/imports-complex-types/index.js @@ -1,6 +1,6 @@ it("should allow to run a WebAssembly module with non-js-compatible imports", function() { return import("./wasm.wasm").then(function(wasm) { - const result = wasm.testI64(); + const result = wasm.testV128(); expect(result).toEqual(42); }); }); diff --git a/test/cases/wasm/imports-complex-types/other.wasm b/test/cases/wasm/imports-complex-types/other.wasm index 70c5aee0fa3..6949d18dd24 100644 Binary files a/test/cases/wasm/imports-complex-types/other.wasm and b/test/cases/wasm/imports-complex-types/other.wasm differ diff --git a/test/cases/wasm/imports-complex-types/test.filter.js b/test/cases/wasm/imports-complex-types/test.filter.js index 23177349638..d8ad45ba057 100644 --- a/test/cases/wasm/imports-complex-types/test.filter.js +++ b/test/cases/wasm/imports-complex-types/test.filter.js @@ -1,5 +1,5 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supports = require("webassembly-feature"); -module.exports = function(config) { - return supportsWebAssembly(); +module.exports = function (config) { + return supports.simd(); }; diff --git a/test/cases/wasm/imports-complex-types/wasm.wasm b/test/cases/wasm/imports-complex-types/wasm.wasm index 8374df1439f..a94d0954e7b 100644 Binary files a/test/cases/wasm/imports-complex-types/wasm.wasm and b/test/cases/wasm/imports-complex-types/wasm.wasm differ diff --git a/test/cases/wasm/imports-many-direct/test.filter.js b/test/cases/wasm/imports-many-direct/test.filter.js index 23177349638..cb37e21905f 100644 --- a/test/cases/wasm/imports-many-direct/test.filter.js +++ b/test/cases/wasm/imports-many-direct/test.filter.js @@ -1,5 +1,5 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); -module.exports = function(config) { +module.exports = function (config) { return supportsWebAssembly(); }; diff --git a/test/cases/wasm/imports-multiple/test.filter.js b/test/cases/wasm/imports-multiple/test.filter.js index 23177349638..cb37e21905f 100644 --- a/test/cases/wasm/imports-multiple/test.filter.js +++ b/test/cases/wasm/imports-multiple/test.filter.js @@ -1,5 +1,5 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); -module.exports = function(config) { +module.exports = function (config) { return supportsWebAssembly(); }; diff --git a/test/cases/wasm/imports/test.filter.js b/test/cases/wasm/imports/test.filter.js index 23177349638..cb37e21905f 100644 --- a/test/cases/wasm/imports/test.filter.js +++ b/test/cases/wasm/imports/test.filter.js @@ -1,5 +1,5 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); -module.exports = function(config) { +module.exports = function (config) { return supportsWebAssembly(); }; diff --git a/test/cases/wasm/js-incompatible-type/env.js b/test/cases/wasm/js-incompatible-type/env.js deleted file mode 100644 index 39a36559da0..00000000000 --- a/test/cases/wasm/js-incompatible-type/env.js +++ /dev/null @@ -1 +0,0 @@ -export const n = 1; diff --git a/test/cases/wasm/js-incompatible-type/errors.js b/test/cases/wasm/js-incompatible-type/errors.js deleted file mode 100644 index e06824329ce..00000000000 --- a/test/cases/wasm/js-incompatible-type/errors.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = [ - [ - /export-i64-param\.wat/, - /Export "a" with i64 as parameter can only be used for direct wasm to wasm dependencies/, - /export-i64-param\.js/ - ], - [ - /export-i64-result\.wat/, - /Export "a" with i64 as result can only be used for direct wasm to wasm dependencies/, - /export-i64-result\.js/ - ], - [ - /import-i64\.wat/, - /Import "n" from "\.\/env.js" with Non-JS-compatible Global Type \(i64\) can only be used for direct wasm to wasm dependencies/, - /index\.js/ - ] -] diff --git a/test/cases/wasm/js-incompatible-type/export-i64-param.js b/test/cases/wasm/js-incompatible-type/export-i64-param.js deleted file mode 100644 index db1be78bea6..00000000000 --- a/test/cases/wasm/js-incompatible-type/export-i64-param.js +++ /dev/null @@ -1 +0,0 @@ -export { a } from "./export-i64-param.wat"; diff --git a/test/cases/wasm/js-incompatible-type/export-i64-param.wat b/test/cases/wasm/js-incompatible-type/export-i64-param.wat deleted file mode 100644 index f22fc6f5793..00000000000 --- a/test/cases/wasm/js-incompatible-type/export-i64-param.wat +++ /dev/null @@ -1,3 +0,0 @@ -(module - (func (export "a") (param i64) (nop)) -) diff --git a/test/cases/wasm/js-incompatible-type/export-i64-result.js b/test/cases/wasm/js-incompatible-type/export-i64-result.js deleted file mode 100644 index 96a1241ee02..00000000000 --- a/test/cases/wasm/js-incompatible-type/export-i64-result.js +++ /dev/null @@ -1 +0,0 @@ -export { a } from "./export-i64-result.wat"; diff --git a/test/cases/wasm/js-incompatible-type/export-i64-result.wat b/test/cases/wasm/js-incompatible-type/export-i64-result.wat deleted file mode 100644 index 1aada93dbd6..00000000000 --- a/test/cases/wasm/js-incompatible-type/export-i64-result.wat +++ /dev/null @@ -1,5 +0,0 @@ -(module - (func (export "a") (result i64) - (i64.const 1) - ) -) diff --git a/test/cases/wasm/js-incompatible-type/import-i64.wat b/test/cases/wasm/js-incompatible-type/import-i64.wat deleted file mode 100644 index 5be32abf044..00000000000 --- a/test/cases/wasm/js-incompatible-type/import-i64.wat +++ /dev/null @@ -1,3 +0,0 @@ -(module - (import "./env.js" "n" (global i64)) -) diff --git a/test/cases/wasm/js-incompatible-type/index.js b/test/cases/wasm/js-incompatible-type/index.js deleted file mode 100644 index f5258dc4277..00000000000 --- a/test/cases/wasm/js-incompatible-type/index.js +++ /dev/null @@ -1,17 +0,0 @@ -const errorRegex = /wasm function signature contains illegal type|invalid type/; - -it("should disallow exporting a func signature with result i64", function() { - return import("./export-i64-result").then(({a}) => { - expect(() => a()).toThrow(errorRegex); - }); -}); - -it("should disallow exporting a func signature with param i64", function() { - return import("./export-i64-param").then(({a}) => { - expect(() => a()).toThrow(errorRegex); - }); -}); - -it("should disallow importing a value type of i64", function() { - return expect(import("./import-i64.wat")).rejects.toThrow(errorRegex); -}); diff --git a/test/cases/wasm/js-incompatible-type/test.filter.js b/test/cases/wasm/js-incompatible-type/test.filter.js deleted file mode 100644 index bd31021b996..00000000000 --- a/test/cases/wasm/js-incompatible-type/test.filter.js +++ /dev/null @@ -1,5 +0,0 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); - -module.exports = function(config) { - return supportsWebAssembly() && config.mode === "production"; -}; diff --git a/test/cases/wasm/memory/test.filter.js b/test/cases/wasm/memory/test.filter.js index 23177349638..cb37e21905f 100644 --- a/test/cases/wasm/memory/test.filter.js +++ b/test/cases/wasm/memory/test.filter.js @@ -1,5 +1,5 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); -module.exports = function(config) { +module.exports = function (config) { return supportsWebAssembly(); }; diff --git a/test/cases/wasm/order/index.js b/test/cases/wasm/order/index.js index f272a900234..ee625fb86c6 100644 --- a/test/cases/wasm/order/index.js +++ b/test/cases/wasm/order/index.js @@ -1,7 +1,8 @@ it("should be evaluated in the correct order", () => { return import("./a").then(({ default: results }) => { - return Promise.resolve().then(() => { // wait an extra tick to get the tick from the tracker - expect(results).toEqual(["b", "c", "wasm42", "a", "tick"]); + return Promise.resolve().then(() => { + // wait an extra tick to get the tick from the tracker + expect(results).toEqual(["b", "c", "tick", "wasm42", "a"]); }); }); }); diff --git a/test/cases/wasm/order/test.filter.js b/test/cases/wasm/order/test.filter.js index 23177349638..cb37e21905f 100644 --- a/test/cases/wasm/order/test.filter.js +++ b/test/cases/wasm/order/test.filter.js @@ -1,5 +1,5 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); -module.exports = function(config) { +module.exports = function (config) { return supportsWebAssembly(); }; diff --git a/test/cases/wasm/simple/test.filter.js b/test/cases/wasm/simple/test.filter.js index 23177349638..cb37e21905f 100644 --- a/test/cases/wasm/simple/test.filter.js +++ b/test/cases/wasm/simple/test.filter.js @@ -1,5 +1,5 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); -module.exports = function(config) { +module.exports = function (config) { return supportsWebAssembly(); }; diff --git a/test/cases/wasm/table/index.js b/test/cases/wasm/table/index.js index 4d3d85a3b5b..9f77a985056 100644 --- a/test/cases/wasm/table/index.js +++ b/test/cases/wasm/table/index.js @@ -1,16 +1,16 @@ // the message is inconsistency between some nodejs versions -const UNKNOWN_FUNCTION_TABLE = /invalid index into function table|invalid function/; +const UNKNOWN_FUNCTION_TABLE = /table index is out of bounds|invalid index into function table|invalid function/; -it("should support tables", function() { - return import("./wasm-table.wat").then(function(wasm) { +it("should support tables", function () { + return import("./wasm-table.wat").then(function (wasm) { expect(wasm.callByIndex(0)).toEqual(42); expect(wasm.callByIndex(1)).toEqual(13); expect(() => wasm.callByIndex(2)).toThrow(UNKNOWN_FUNCTION_TABLE); }); }); -it("should support exported tables", function() { - return import("./wasm-table-export.wat").then(function(wasm) { +it("should support exported tables", function () { + return import("./wasm-table-export.wat").then(function (wasm) { expect(wasm.table).toBeInstanceOf(WebAssembly.Table); expect(wasm.table.length).toBe(2); const e0 = wasm.table.get(0); @@ -22,8 +22,8 @@ it("should support exported tables", function() { }); }); -it("should support imported tables", function() { - return import("./wasm-table-imported.wat").then(function(wasm) { +it("should support imported tables", function () { + return import("./wasm-table-imported.wat").then(function (wasm) { expect(wasm.callByIndex(0)).toEqual(42); expect(wasm.callByIndex(1)).toEqual(13); expect(() => wasm.callByIndex(2)).toThrow(UNKNOWN_FUNCTION_TABLE); diff --git a/test/cases/wasm/table/test.filter.js b/test/cases/wasm/table/test.filter.js index 23177349638..cb37e21905f 100644 --- a/test/cases/wasm/table/test.filter.js +++ b/test/cases/wasm/table/test.filter.js @@ -1,5 +1,5 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); -module.exports = function(config) { +module.exports = function (config) { return supportsWebAssembly(); }; diff --git a/test/cases/wasm/two-files-loader/test.filter.js b/test/cases/wasm/two-files-loader/test.filter.js index 23177349638..cb37e21905f 100644 --- a/test/cases/wasm/two-files-loader/test.filter.js +++ b/test/cases/wasm/two-files-loader/test.filter.js @@ -1,5 +1,5 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); -module.exports = function(config) { +module.exports = function (config) { return supportsWebAssembly(); }; diff --git a/test/cases/wasm/two-files-loader/wrapper-loader.js b/test/cases/wasm/two-files-loader/wrapper-loader.js index 544fc1a789c..6ffbf502972 100644 --- a/test/cases/wasm/two-files-loader/wrapper-loader.js +++ b/test/cases/wasm/two-files-loader/wrapper-loader.js @@ -1,10 +1,9 @@ -const stringifyRequest = require("loader-utils").stringifyRequest; - -module.exports.pitch = function(remainingRequest) { +/** @type {import("../../../../").PitchLoaderDefinitionFunction} */ +module.exports.pitch = function (remainingRequest) { return ` - import { getString as _getString, memory } from ${stringifyRequest(this, - `${this.resourcePath}.wat!=!${remainingRequest}` - )}; + import { getString as _getString, memory } from ${ + JSON.stringify(`${this.utils.contextify(this.context, this.resourcePath)}.wat!=!${this.utils.contextify(this.context, remainingRequest)}`) + }; export function getString() { const strBuf = new Uint8Array(memory.buffer, _getString()); diff --git a/test/cases/wasm/two-files-loader/wrapper-loader2.js b/test/cases/wasm/two-files-loader/wrapper-loader2.js index 6cd67a7258f..6ffbf502972 100644 --- a/test/cases/wasm/two-files-loader/wrapper-loader2.js +++ b/test/cases/wasm/two-files-loader/wrapper-loader2.js @@ -1,11 +1,9 @@ -const stringifyRequest = require("loader-utils").stringifyRequest; - -module.exports.pitch = function(remainingRequest) { +/** @type {import("../../../../").PitchLoaderDefinitionFunction} */ +module.exports.pitch = function (remainingRequest) { return ` - import { getString as _getString, memory } from ${stringifyRequest( - this, - `${this.resourcePath}.wasm!=!wast-loader!${remainingRequest}` - )}; + import { getString as _getString, memory } from ${ + JSON.stringify(`${this.utils.contextify(this.context, this.resourcePath)}.wat!=!${this.utils.contextify(this.context, remainingRequest)}`) + }; export function getString() { const strBuf = new Uint8Array(memory.buffer, _getString()); diff --git a/test/cases/wasm/unused-export/test.filter.js b/test/cases/wasm/unused-export/test.filter.js index 23177349638..cb37e21905f 100644 --- a/test/cases/wasm/unused-export/test.filter.js +++ b/test/cases/wasm/unused-export/test.filter.js @@ -1,5 +1,5 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); -module.exports = function(config) { +module.exports = function (config) { return supportsWebAssembly(); }; diff --git a/test/cases/wasm/v128/index.js b/test/cases/wasm/v128/index.js new file mode 100644 index 00000000000..43370cf95dc --- /dev/null +++ b/test/cases/wasm/v128/index.js @@ -0,0 +1,3 @@ +it("should support wasm compiled with v128", function() { + return import("./v128.wasm"); +}); diff --git a/test/cases/wasm/v128/test.filter.js b/test/cases/wasm/v128/test.filter.js new file mode 100644 index 00000000000..a4c4664b2ea --- /dev/null +++ b/test/cases/wasm/v128/test.filter.js @@ -0,0 +1,8 @@ +// const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +// const supportsFeature = require("webassembly-feature"); + +module.exports = function (config) { + // TODO fails with CompileError: WebAssembly.instantiate(): Compiling function #0 failed: memory instruction with no memory @+24 + return false; + // return supportsWebAssembly() && supportsFeature.simd(); +}; diff --git a/test/cases/wasm/v128/v128.wasm b/test/cases/wasm/v128/v128.wasm new file mode 100644 index 00000000000..e791af8ef93 Binary files /dev/null and b/test/cases/wasm/v128/v128.wasm differ diff --git a/test/cases/wasm/wasm-explorer-examples-async/test.filter.js b/test/cases/wasm/wasm-explorer-examples-async/test.filter.js index 23177349638..cb37e21905f 100644 --- a/test/cases/wasm/wasm-explorer-examples-async/test.filter.js +++ b/test/cases/wasm/wasm-explorer-examples-async/test.filter.js @@ -1,5 +1,5 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); -module.exports = function(config) { +module.exports = function (config) { return supportsWebAssembly(); }; diff --git a/test/cases/wasm/wasm-explorer-examples-sync/test.filter.js b/test/cases/wasm/wasm-explorer-examples-sync/test.filter.js index 23177349638..cb37e21905f 100644 --- a/test/cases/wasm/wasm-explorer-examples-sync/test.filter.js +++ b/test/cases/wasm/wasm-explorer-examples-sync/test.filter.js @@ -1,5 +1,5 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); -module.exports = function(config) { +module.exports = function (config) { return supportsWebAssembly(); }; diff --git a/test/checkArrayExpectation.js b/test/checkArrayExpectation.js index 4e967de78ba..3cd3d3392f3 100644 --- a/test/checkArrayExpectation.js +++ b/test/checkArrayExpectation.js @@ -1,79 +1,149 @@ "use strict"; -const fs = require("fs"); +const fs = require("graceful-fs"); const path = require("path"); +const check = (expected, actual) => { + if (expected instanceof RegExp) { + expected = { message: expected }; + } + if (Array.isArray(expected)) { + return expected.every(e => check(e, actual)); + } + return Object.keys(expected).every(key => { + let value = actual[key]; + if (typeof value === "object") { + value = JSON.stringify(value); + } + return expected[key].test(value); + }); +}; + +const explain = object => { + if (object instanceof RegExp) { + object = { message: object }; + } + return Object.keys(object) + .map(key => { + let value = object[key]; + if (typeof value === "object" && !(value instanceof RegExp)) { + value = JSON.stringify(value); + } + let msg = `${key} = ${value}`; + if (key !== "stack" && key !== "details" && msg.length > 100) + msg = `${msg.slice(0, 97)}...`; + return msg; + }) + .join("; "); +}; + +const diffItems = (actual, expected, kind) => { + const tooMuch = actual.slice(); + const missing = expected.slice(); + for (let i = 0; i < missing.length; i++) { + const current = missing[i]; + for (let j = 0; j < tooMuch.length; j++) { + if (check(current, tooMuch[j])) { + tooMuch.splice(j, 1); + missing.splice(i, 1); + i--; + break; + } + } + } + const diff = []; + if (missing.length > 0) { + diff.push(`The following expected ${kind}s are missing: +${missing.map(item => `${explain(item)}`).join("\n\n")}`); + } + if (tooMuch.length > 0) { + diff.push(`The following ${kind}s are unexpected: +${tooMuch.map(item => `${explain(item)}`).join("\n\n")}`); + } + return diff.join("\n\n"); +}; + module.exports = function checkArrayExpectation( testDirectory, object, kind, filename, upperCaseKind, + options, done ) { if (!done) { - done = upperCaseKind; + done = options; + options = upperCaseKind; upperCaseKind = filename; filename = `${kind}s`; } - let array = object[`${kind}s`].slice().sort(); - if (kind === "warning") + let array = object[`${kind}s`]; + if (Array.isArray(array) && kind === "warning") { array = array.filter(item => !/from Terser/.test(item)); + } if (fs.existsSync(path.join(testDirectory, `${filename}.js`))) { const expectedFilename = path.join(testDirectory, `${filename}.js`); - const expected = require(expectedFilename); - if (expected.length < array.length) + let expected = require(expectedFilename); + if (typeof expected === "function") { + expected = expected(options); + } + const diff = diffItems(array, expected, kind); + if (expected.length < array.length) { return ( done( new Error( - `More ${kind}s while compiling than expected:\n\n${array.join( - "\n\n" - )}. Check expected warnings: ${filename}` + `More ${kind}s (${array.length} instead of ${expected.length}) while compiling than expected:\n\n${diff}\n\nCheck expected ${kind}s: ${expectedFilename}` ) ), true ); - else if (expected.length > array.length) + } else if (expected.length > array.length) { return ( done( new Error( - `Less ${kind}s while compiling than expected:\n\n${array.join( - "\n\n" - )}. Check expected warnings: ${filename}` + `Less ${kind}s (${array.length} instead of ${expected.length}) while compiling than expected:\n\n${diff}\n\nCheck expected ${kind}s: ${expectedFilename}` ) ), true ); + } for (let i = 0; i < array.length; i++) { if (Array.isArray(expected[i])) { for (let j = 0; j < expected[i].length; j++) { - if (!expected[i][j].test(array[i])) + if (!check(expected[i][j], array[i])) { return ( done( new Error( - `${upperCaseKind} ${i}: ${array[i]} doesn't match ${expected[ - i - ][j].toString()}` + `${upperCaseKind} ${i}: ${explain( + array[i] + )} doesn't match ${explain(expected[i][j])}` ) ), true ); + } } - } else if (!expected[i].test(array[i])) + } else if (!check(expected[i], array[i])) { return ( done( new Error( - `${upperCaseKind} ${i}: ${array[i]} doesn't match ${expected[ - i - ].toString()}` + `${upperCaseKind} ${i}: ${explain( + array[i] + )} doesn't match ${explain(expected[i])}` ) ), true ); + } } } else if (array.length > 0) { return ( done( - new Error(`${upperCaseKind}s while compiling:\n\n${array.join("\n\n")}`) + new Error( + `${upperCaseKind}s while compiling:\n\n${array + .map(explain) + .join("\n\n")}` + ) ), true ); diff --git a/test/cleverMerge.unittest.js b/test/cleverMerge.unittest.js new file mode 100644 index 00000000000..16d9e0306f2 --- /dev/null +++ b/test/cleverMerge.unittest.js @@ -0,0 +1,717 @@ +"use strict"; + +const { + cleverMerge, + DELETE, + removeOperations, + resolveByProperty, + cachedCleverMerge +} = require("../lib/util/cleverMerge"); + +describe("cleverMerge", () => { + const base = { + a1: [1], + a2: [1], + a3: [1], + b1: [1, "...", 2], + b2: [1, "...", 2], + b3: [1, "...", 2], + bySomething: { + x: { + a2: [5], + a3: [5, "...", 6], + a4: [5], + a5: [5, "...", 6], + b2: [5], + b3: [5, "...", 6], + b4: [5], + b5: [5, "...", 6] + } + } + }; + const cases = { + "different properties": [{ a: 1 }, { b: 2 }, { a: 1, b: 2 }], + "same property": [{ a: 1 }, { a: 2 }, { a: 2 }], + arrays: [ + { a1: 1, a2: 1, b1: [], b2: [], c1: [1], c2: [1] }, + { + a1: [2], + a2: [2, "...", 3], + b1: [2], + b2: [2, "...", 3], + c1: [2], + c2: [2, "...", 3] + }, + { + a1: [2], + a2: [2, 1, 3], + b1: [2], + b2: [2, 3], + c1: [2], + c2: [2, 1, 3] + } + ], + "by field override": [ + base, + { + a1: [8], + a2: [8], + a3: [8], + a4: [8], + a5: [8], + b1: [8], + b2: [8], + b3: [8], + b4: [8], + b5: [8] + }, + { + a1: [8], + a2: [8], + a3: [8], + a4: [8], + a5: [8], + b1: [8], + b2: [8], + b3: [8], + b4: [8], + b5: [8] + } + ], + "by field extend default": [ + base, + { + a1: [8, "..."], + a2: [8, "..."], + a3: [8, "..."], + a4: [8, "..."], + a5: [8, "..."], + b1: [8, "..."], + b2: [8, "..."], + b3: [8, "..."] + }, + { + a1: [8, 1], + a2: [8, 1], + a3: [1], + a4: [8, "..."], + b1: [8, 1, "...", 2], + b2: [8, 1, "...", 2], + b3: [1, "...", 2], + bySomething: { + x: { + a2: [8, 5], + a3: [8, 5, "...", 6], + a4: [8, 5], + a5: [8, 5, "...", 6], + b2: [8, 5], + b3: [8, 5, "...", 6], + b4: [5], + b5: [5, "...", 6] + }, + default: { + a3: [8, "..."], + a5: [8, "..."], + b3: [8, "..."] + } + } + } + ], + "by field override other": [ + base, + { + bySomething: { + y: { + a1: [8], + a2: [8], + a3: [8], + a4: [8], + a5: [8], + b1: [8], + b2: [8], + b3: [8], + b4: [8], + b5: [8] + } + } + }, + { + a1: [1], + a2: [1], + a3: [1], + b1: [1, "...", 2], + b2: [1, "...", 2], + b3: [1, "...", 2], + bySomething: { + x: { + a2: [5], + a3: [5, "...", 6], + a4: [5], + a5: [5, "...", 6], + b2: [5], + b3: [5, "...", 6], + b4: [5], + b5: [5, "...", 6] + }, + y: { + a1: [8], + a2: [8], + a3: [8], + a4: [8], + a5: [8], + b1: [8], + b2: [8], + b3: [8], + b4: [8], + b5: [8] + } + } + } + ], + "by field override same": [ + base, + { + bySomething: { + x: { + a1: [8], + a2: [8], + a3: [8], + a4: [8], + a5: [8], + b1: [8], + b2: [8], + b3: [8], + b4: [8], + b5: [8] + } + } + }, + { + a1: [1], + a2: [1], + a3: [1], + b1: [1, "...", 2], + b2: [1, "...", 2], + b3: [1, "...", 2], + bySomething: { + x: { + a1: [8], + a2: [8], + a3: [8], + a4: [8], + a5: [8], + b1: [8], + b2: [8], + b3: [8], + b4: [8], + b5: [8] + } + } + } + ], + "by field extend other": [ + base, + { + bySomething: { + y: { + a1: [8, "..."], + a2: [8, "..."], + a3: [8, "..."], + a4: [8, "..."], + a5: [8, "..."], + b1: [8, "..."], + b2: [8, "..."], + b3: [8, "..."] + } + } + }, + { + a1: [1], + a2: [1], + a3: [1], + b1: [1, "...", 2], + b2: [1, "...", 2], + b3: [1, "...", 2], + bySomething: { + x: { + a2: [5], + a3: [5, "...", 6], + a4: [5], + a5: [5, "...", 6], + b2: [5], + b3: [5, "...", 6], + b4: [5], + b5: [5, "...", 6] + }, + y: { + a1: [8, "..."], + a2: [8, "..."], + a3: [8, "..."], + a4: [8, "..."], + a5: [8, "..."], + b1: [8, "..."], + b2: [8, "..."], + b3: [8, "..."] + } + } + } + ], + "by field extend same": [ + base, + { + bySomething: { + x: { + a1: [8, "..."], + a2: [8, "..."], + a3: [8, "..."], + a4: [8, "..."], + a5: [8, "..."], + b1: [8, "..."], + b2: [8, "..."], + b3: [8, "..."] + } + } + }, + { + a1: [1], + a2: [1], + a3: [1], + b1: [1, "...", 2], + b2: [1, "...", 2], + b3: [1, "...", 2], + bySomething: { + x: { + a1: [8, "..."], + a2: [8, 5], + a3: [8, 5, "...", 6], + a4: [8, 5], + a5: [8, 5, "...", 6], + b1: [8, "..."], + b2: [8, 5], + b3: [8, 5, "...", 6], + b4: [5], + b5: [5, "...", 6] + } + } + } + ], + "by field extend base, same and other": [ + base, + { + a1: [7, "..."], + a2: [7, "..."], + a3: [7, "..."], + a4: [7, "..."], + a5: [7, "..."], + b1: [7, "..."], + b2: [7, "..."], + b3: [7, "..."], + bySomething: { + x: { + a1: [8, "..."], + a2: [8, "..."], + a3: [8, "..."], + a4: [8, "..."], + a5: [8, "..."], + b1: [8, "..."], + b2: [8, "..."], + b3: [8, "..."] + }, + y: { + a1: [9, "..."], + a2: [9, "..."], + a3: [9, "..."], + a4: [9, "..."], + a5: [9, "..."], + b1: [9, "..."], + b2: [9, "..."], + b3: [9, "..."] + } + } + }, + { + a1: [7, 1], + a2: [7, 1], + a3: [1], + a4: [7, "..."], + b1: [7, 1, "...", 2], + b2: [7, 1, "...", 2], + b3: [1, "...", 2], + bySomething: { + x: { + a1: [8, "..."], + a2: [8, 7, 5], + a3: [8, 7, 5, "...", 6], + a4: [8, 7, 5], + a5: [8, 7, 5, "...", 6], + b1: [8, "..."], + b2: [8, 7, 5], + b3: [8, 7, 5, "...", 6], + b4: [5], + b5: [5, "...", 6] + }, + y: { + a1: [9, "..."], + a2: [9, "..."], + a3: [9, 7, "..."], + a4: [9, "..."], + a5: [9, 7, "..."], + b1: [9, "..."], + b2: [9, "..."], + b3: [9, 7, "..."] + }, + default: { + a3: [7, "..."], + a5: [7, "..."], + b3: [7, "..."] + } + } + } + ], + "by field promoting edge cases": [ + { + a: [1, "...", 2], + b: [1, "...", 2], + c: [1, "...", 2], + d: [1, "...", 2], + bySomething: { + x: { + a: [3, "...", 4], + b: [3, "...", 4], + d: [3, "...", 4] + }, + y: { + a: [5], + b: [5] + }, + default: { + a: [6, "...", 7], + c: [6, "...", 7] + } + } + }, + { + a: [8, "...", 9], + b: [8, "...", 9], + c: [8, "...", 9], + d: [8, "...", 9] + }, + { + a: [1, "...", 2], + b: [1, "...", 2], + c: [1, "...", 2], + d: [1, "...", 2], + bySomething: { + x: { + a: [8, 3, "...", 4, 9], + b: [8, 3, "...", 4, 9], + c: [8, "...", 9], + d: [8, 3, "...", 4, 9] + }, + y: { + a: [8, 5, 9], + b: [8, 5, 9], + c: [8, "...", 9], + d: [8, "...", 9] + }, + default: { + a: [8, 6, "...", 7, 9], + b: [8, "...", 9], + c: [8, 6, "...", 7, 9], + d: [8, "...", 9] + } + } + } + ], + "by field clone default": [ + { + a: 1, + bySomething: { + x: { + b: 2 + }, + default: { + c: 3 + } + } + }, + { + bySomething: { + y: { + d: 4 + } + } + }, + { + a: 1, + bySomething: { + x: { + b: 2 + }, + y: { + c: 3, + d: 4 + }, + default: { + c: 3 + } + } + } + ], + deleting: [ + base, + { + a1: DELETE, + a2: DELETE, + a3: DELETE, + a4: DELETE, + a5: DELETE, + b1: DELETE, + b2: DELETE, + b3: DELETE + }, + { + a1: DELETE, + a2: DELETE, + a3: DELETE, + a4: DELETE, + a5: DELETE, + b1: DELETE, + b2: DELETE, + b3: DELETE, + bySomething: { + x: { + b4: [5], + b5: [5, "...", 6] + } + } + } + ], + "merge objects": [ + { + nested: base + }, + { + nested: base + }, + { + nested: { + a1: [1], + a2: [1], + a3: [1], + b1: [1, 1, "...", 2, 2], + b2: [1, 1, "...", 2, 2], + b3: [1, "...", 2], + bySomething: { + x: { + a2: [5], + a3: [5, "...", 6], + a4: [5], + a5: [5, 5, "...", 6, 6], + b2: [5], + b3: [5, 1, 5, "...", 6, 2, 6], + b4: [5], + b5: [5, 5, "...", 6, 6] + }, + default: { + b3: [1, "...", 2] + } + } + } + } + ], + dynamicSecond: [ + { + a: 4, // keep + b: 5, // static override + c: 6 // dynamic override + }, + { + b: 50, + y: 20, + byArguments: (x, y, z) => ({ + c: 60, + x, + y, + z + }) + }, + { + a: 4, + b: 50, + c: 60, + x: 1, + y: 2, + z: 3 + } + ], + dynamicBoth: [ + { + a: 4, // keep + b: 5, // static override + c: 6, // dynamic override + byArguments: (x, y, z) => ({ + x, // keep + y, // static override + z // dynamic override + }) + }, + { + b: 50, + y: 20, + byArguments: (x, y, z) => ({ + c: 60, + z: z * 10 + }) + }, + { + a: 4, + b: 50, + c: 60, + x: 1, + y: 20, + z: 30 + } + ], + dynamicChained: [ + cleverMerge( + { + a: 6, // keep + b: 7, // static override + c: 8, // dynamic override + d: 9, // static override (3rd) + e: 10, // dynamic override (3rd) + byArguments: (x, y, z, v, w) => ({ + x, // keep + y, // static override + z, // dynamic override + v, // static override (3rd) + w // dynamic override (3rd) + }) + }, + { + b: 70, + y: 20, + byArguments: (x, y, z) => ({ + c: 80, + z: z * 10 + }) + } + ), + { + d: 90, + v: 40, + byArguments: (x, y, z, v, w) => ({ + e: 100, + w: w * 10 + }) + }, + { + a: 6, + b: 70, + c: 80, + d: 90, + e: 100, + x: 1, + y: 20, + z: 30, + v: 40, + w: 50 + } + ], + dynamicFalse1: [ + { + a: 1, + byArguments: () => false + }, + { + b: 2 + }, + false + ], + dynamicFalse2: [ + { + a: 1 + }, + { + b: 2, + byArguments: () => false + }, + false + ], + dynamicFalse3: [ + { + a: 1, + byArguments: () => false + }, + { + b: 2, + byArguments: () => false + }, + false + ], + nonObject1: [1, 2, 2], + nonObject2: [1, { a: 1 }, 1], + nonObject3: [{ a: 1 }, 1, 1], + nonObject4: [{ a: 1 }, undefined, { a: 1 }], + nonObject5: [undefined, { a: 1 }, { a: 1 }] + }; + for (const key of Object.keys(cases)) { + const testCase = cases[key]; + it(`should merge ${key} correctly`, () => { + let merged = cleverMerge(testCase[0], testCase[1]); + let merged1 = cachedCleverMerge(testCase[0], testCase[1]); + let merged2 = cachedCleverMerge(testCase[0], testCase[1]); + expect(merged2).toBe(merged1); + merged = resolveByProperty(merged, "byArguments", 1, 2, 3, 4, 5); + merged1 = resolveByProperty(merged1, "byArguments", 1, 2, 3, 4, 5); + merged2 = resolveByProperty(merged2, "byArguments", 1, 2, 3, 4, 5); + expect(merged).toEqual(testCase[2]); + expect(merged1).toEqual(testCase[2]); + expect(merged2).toEqual(testCase[2]); + }); + } + + it("should allow to remove operations", () => { + expect( + removeOperations({ + a: 1, + b: DELETE, + c: ["..."], + d: [1, "...", 2], + e: [1, 2, 3], + f: { + a: 1, + b: DELETE, + c: ["..."], + d: [1, "...", 2], + e: [1, 2, 3], + f: { + a: 1, + b: DELETE, + c: ["..."], + d: [1, "...", 2], + e: [1, 2, 3] + } + } + }) + ).toEqual({ + a: 1, + c: [], + d: [1, 2], + e: [1, 2, 3], + f: { + a: 1, + c: [], + d: [1, 2], + e: [1, 2, 3], + f: { + a: 1, + c: [], + d: [1, 2], + e: [1, 2, 3] + } + } + }); + }); +}); diff --git a/test/compareLocations.unittest.js b/test/compareLocations.unittest.js index 53d68daf569..3c7a03d084e 100644 --- a/test/compareLocations.unittest.js +++ b/test/compareLocations.unittest.js @@ -1,41 +1,22 @@ "use strict"; -const compareLocations = require("../lib/compareLocations"); -const createPosition = overrides => { - return Object.assign( - { - line: 10, - column: 5 - }, - overrides - ); -}; - -const createLocation = (start, end, index) => { - return { - start: createPosition(start), - end: createPosition(end), - index: index || 3 - }; -}; - -describe("compareLocations", () => { - describe("string location comparison", () => { - it("returns -1 when the first string comes before the second string", () => { - expect(compareLocations("alpha", "beta")).toBe(-1); - }); - - it("returns 1 when the first string comes after the second string", () => { - expect(compareLocations("beta", "alpha")).toBe(1); - }); +const { compareLocations } = require("../lib/util/comparators"); +const createPosition = overrides => ({ + line: 10, + column: 5, + ...overrides +}); - it("returns 0 when the first string is the same as the second string", () => { - expect(compareLocations("charlie", "charlie")).toBe(0); - }); - }); +const createLocation = (start, end, index) => ({ + start: createPosition(start), + end: createPosition(end), + index: index || 3 +}); +describe("compareLocations", () => { describe("object location comparison", () => { - let a, b; + let a; + let b; describe("location line number", () => { beforeEach(() => { @@ -102,35 +83,19 @@ describe("compareLocations", () => { }); }); - describe("string and object location comparison", () => { - it("returns 1 when the first parameter is a string and the second parameter is an object", () => { - expect(compareLocations("alpha", createLocation())).toBe(1); - }); - - it("returns -1 when the first parameter is an object and the second parameter is a string", () => { - expect(compareLocations(createLocation(), "alpha")).toBe(-1); - }); - }); - describe("unknown location type comparison", () => { - it("returns 0 when the first parameter is an object and the second parameter is a number", () => { - expect(compareLocations(createLocation(), 123)).toBe(0); - }); - - it("returns undefined when the first parameter is a number and the second parameter is an object", () => { - expect(compareLocations(123, createLocation())).toBe(undefined); - }); - - it("returns 0 when the first parameter is a string and the second parameter is a number", () => { - expect(compareLocations("alpha", 123)).toBe(0); + it("returns 1 when the first parameter is an object and the second parameter is not", () => { + expect(compareLocations(createLocation(), 123)).toBe(1); + expect(compareLocations(createLocation(), "alpha")).toBe(1); }); - it("returns undefined when the first parameter is a number and the second parameter is a string", () => { - expect(compareLocations(123, "alpha")).toBe(undefined); + it("returns -1 when the first parameter is not an object and the second parameter is", () => { + expect(compareLocations(123, createLocation())).toBe(-1); + expect(compareLocations("alpha", createLocation())).toBe(-1); }); - it("returns undefined when both the first parameter and the second parameter is a number", () => { - expect(compareLocations(123, 456)).toBe(undefined); + it("returns 0 when both the first parameter and the second parameter are not objects", () => { + expect(compareLocations(123, 456)).toBe(0); }); }); }); diff --git a/test/compareStringsNumeric.unittest.js b/test/compareStringsNumeric.unittest.js new file mode 100644 index 00000000000..061729ddfc8 --- /dev/null +++ b/test/compareStringsNumeric.unittest.js @@ -0,0 +1,93 @@ +const { compareStringsNumeric } = require("../lib/util/comparators.js"); + +/** + * @param {string} a string + * @param {string} b string + * @returns {-1|0|1} compare result + */ +const referenceComparer = (a, b) => { + const partsA = a.split(/(\d+)/); + const partsB = b.split(/(\d+)/); + const len = Math.min(partsA.length, partsB.length); + for (let i = 0; i < len; i++) { + const pA = partsA[i]; + const pB = partsB[i]; + if (i % 2 === 0) { + if (pA.length > pB.length) { + if (pA.slice(0, pB.length) > pB) return 1; + return -1; + } else if (pB.length > pA.length) { + if (pB.slice(0, pA.length) > pA) return -1; + return 1; + } + if (pA < pB) return -1; + if (pA > pB) return 1; + } else { + const nA = Number(pA); + const nB = Number(pB); + if (nA < nB) return -1; + if (nA > nB) return 1; + } + } + if (partsB.length < partsA.length) return 1; + if (partsB.length > partsA.length) return -1; + return 0; +}; + +describe(compareStringsNumeric.name, () => { + const testCases = [ + ["", "a", 1], + ["a", "", -1], + ["", "0", -1], + ["1", "", 1], + ["", "", 0], + ["a", "1", -1], + ["1", "a", 1], + ["_", "1", -1], + ["1", "_", 1], + ["a", "b", -1], + ["b", "a", 1], + ["a", "a", 0], + ["a1", "a2", -1], + ["a2", "a1", 1], + ["a1", "a1", 0], + ["ab1", "ab2", -1], + ["ab2", "ab1", 1], + ["ab1", "a1", -1], + ["a1", "ab1", 1], + ["a1", "a10", -1], + ["a10", "a1", 1], + ["a1", "a01", 0], + ["a1", "a1a", 1], + ["a1a", "a1", -1], + ["a1a", "a01a", 0], + ["a1a", "a1b", -1], + ["a1b", "a1a", 1], + ["a1a", "a1a1", -1], + ["a1a1", "a1a", 1], + ["a1a1", "a1a1", 0], + ["a1a1", "a1a2", -1], + ["a1a2", "a1a1", 1], + ["a1a1", "a1a01", 0], + ["a1a1", "a1a1a", 1], + ["a1a1a", "a1a1", -1], + ["a1a1a", "a1a1a", 0], + ["a1a1a", "a1a1b", -1], + ["a1a1b", "a1a1a", 1], + ["a1a1a", "a1a1a1", -1], + ["a1a1a1", "a1a1a", 1], + ["a1a1a1", "a1a1a1", 0], + ["a1a1a1", "a1a1a2", -1], + ["a1a1a2", "a1a1a1", 1], + ["a1a1a1", "a1a1a01", 0], + ["a1a1a1", "a1a1a1a", 1] + ]; + + for (const testCase of testCases) { + const [a, b, expected] = testCase; + it(`returns ${expected} when comparing "${a}" to "${b}"`, () => { + expect(referenceComparer(a, b)).toBe(expected); + expect(compareStringsNumeric(a, b)).toBe(expected); + }); + } +}); diff --git a/test/compileBooleanMatcher.unittest.js b/test/compileBooleanMatcher.unittest.js new file mode 100644 index 00000000000..7b2f1998dac --- /dev/null +++ b/test/compileBooleanMatcher.unittest.js @@ -0,0 +1,92 @@ +"use strict"; + +const { itemsToRegexp } = require("../lib/util/compileBooleanMatcher"); +describe("itemsToRegexp", () => { + const expectCompiled = (name, input, fn) => { + it(`should compile ${name}`, () => { + const items = typeof input === "string" ? input.split(",") : input; + const regexp = itemsToRegexp(items); + const r = new RegExp(`^${regexp}$`); + for (const item of items) { + expect(item).toMatch(r); + } + fn(expect(regexp)); + }); + }; + + expect.addSnapshotSerializer({ + test() { + return true; + }, + print(received) { + return received; + } + }); + + expectCompiled("basic", ["abc", "def", "123", "45", "6"], e => + e.toMatchInlineSnapshot("(123|45|6|abc|def)") + ); + + expectCompiled("single chars", ["a", "b", "c", "1", "2", "3"], e => + e.toMatchInlineSnapshot("[123abc]") + ); + + expectCompiled( + "prefixes", + ["ab1", "ab2", "ab3", "ab4", "de5", "de6", "de7", "ef8", "ef9", "gh0"], + e => e.toMatchInlineSnapshot("(ab[1234]|de[567]|ef[89]|gh0)") + ); + + expectCompiled("short prefixes", "a,ab", e => + e.toMatchInlineSnapshot("a(|b)") + ); + + expectCompiled( + "nested prefixes", + ["a", "ab", "abc", "abcd", "abcde", "abcdef"], + e => e.toMatchInlineSnapshot("a(b(c(d(|e|ef)|)|)|)") + ); + + expectCompiled("suffixes", "a1,b1,c1,d1,e1,a2,b2,c2", e => + e.toMatchInlineSnapshot("([abcde]1|[abc]2)") + ); + + expectCompiled( + "common prod", + "674,542,965,12,942,483,445,943,423,995,434,122,995,248,432,165,436,86,435,221", + e => + e.toMatchInlineSnapshot( + "(1(2|22|65)|4(3[2456]|23|45|83)|9(42|43|65|95)|221|248|542|674|86)" + ) + ); + + expectCompiled( + "long strings", + [ + "./path/to/file.js", + "./path/to/file.mjs", + "./path/to/other-file.js", + "./path/to/directory/with/file.js", + "./path/to/directory/with/file.json", + "./path/to/directory/with/file.css", + "./path/to/directory/with/module.css", + "webpack/runtime/module" + ], + e => + e.toMatchInlineSnapshot( + "(\\.\\/path\\/to\\/(directory\\/with\\/(file\\.(js(|on)|css)|module\\.css)|file\\.(|m)js|other\\-file\\.js)|webpack\\/runtime\\/module)" + ) + ); + + expectCompiled( + "prefix and suffix overlap", + [ + "webpack_sharing_consume_default_react_react", + "webpack_sharing_consume_default_classnames_classnames-webpack_sharing_consume_default_react_react" + ], + e => + e.toMatchInlineSnapshot( + "webpack_sharing_consume_default_(|classnames_classnames\\-webpack_sharing_consume_default_)react_react" + ) + ); +}); diff --git a/test/configCases/additional-pass/simple/webpack.config.js b/test/configCases/additional-pass/simple/webpack.config.js index 398236f46f6..eb01a4b25e8 100644 --- a/test/configCases/additional-pass/simple/webpack.config.js +++ b/test/configCases/additional-pass/simple/webpack.config.js @@ -1,13 +1,15 @@ -var testPlugin = function() { - var counter = 1; +/** @type {import("../../../../").WebpackPluginFunction} */ +function testPlugin() { + let counter = 1; this.hooks.compilation.tap("TestPlugin", compilation => { - var nr = counter++; - compilation.hooks.needAdditionalPass.tap("TestPlugin", function() { + const nr = counter++; + compilation.hooks.needAdditionalPass.tap("TestPlugin", function () { if (nr < 5) return true; }); }); -}; +} +/** @type {import("../../../../").Configuration} */ module.exports = { plugins: [testPlugin] }; diff --git a/test/configCases/amd/disabled/index.js b/test/configCases/amd/disabled/index.js new file mode 100644 index 00000000000..d048b1c7aeb --- /dev/null +++ b/test/configCases/amd/disabled/index.js @@ -0,0 +1,8 @@ +it("should compile", function(done) { + done(); +}); + +it("should disable define", function(done) { + expect(typeof define).toBe('undefined') + done() +}) diff --git a/test/configCases/amd/disabled/webpack.config.js b/test/configCases/amd/disabled/webpack.config.js new file mode 100644 index 00000000000..d28e3ce5a87 --- /dev/null +++ b/test/configCases/amd/disabled/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + amd: false +}; diff --git a/test/configCases/asset-emitted/normal/index.js b/test/configCases/asset-emitted/normal/index.js new file mode 100644 index 00000000000..9e1b6b1cd1b --- /dev/null +++ b/test/configCases/asset-emitted/normal/index.js @@ -0,0 +1 @@ +it("should run", () => import("./module")); diff --git a/test/configCases/asset-emitted/normal/module.js b/test/configCases/asset-emitted/normal/module.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/asset-emitted/normal/webpack.config.js b/test/configCases/asset-emitted/normal/webpack.config.js new file mode 100644 index 00000000000..11df5e9a701 --- /dev/null +++ b/test/configCases/asset-emitted/normal/webpack.config.js @@ -0,0 +1,31 @@ +const Compilation = require("../../../../").Compilation; +const Source = require("webpack-sources").Source; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [ + compiler => { + /** @type {Record} */ + const files = {}; + compiler.hooks.assetEmitted.tap( + "Test", + (file, { content, source, outputPath, compilation, targetPath }) => { + expect(Buffer.isBuffer(content)).toBe(true); + expect(source).toBeInstanceOf(Source); + expect(typeof outputPath).toBe("string"); + expect(typeof targetPath).toBe("string"); + expect(compilation).toBeInstanceOf(Compilation); + files[file] = true; + } + ); + compiler.hooks.afterEmit.tap("Test", () => { + expect(files).toMatchInlineSnapshot(` + Object { + "93.bundle0.js": true, + "bundle0.js": true, + } + `); + }); + } + ] +}; diff --git a/test/configCases/asset-modules/_images/file.jpg b/test/configCases/asset-modules/_images/file.jpg new file mode 100644 index 00000000000..fe5c6eefa79 Binary files /dev/null and b/test/configCases/asset-modules/_images/file.jpg differ diff --git a/test/configCases/asset-modules/_images/file.png b/test/configCases/asset-modules/_images/file.png new file mode 100644 index 00000000000..fb53b9dedd3 Binary files /dev/null and b/test/configCases/asset-modules/_images/file.png differ diff --git a/test/configCases/asset-modules/_images/file.svg b/test/configCases/asset-modules/_images/file.svg new file mode 100644 index 00000000000..d7b7e40b4f8 --- /dev/null +++ b/test/configCases/asset-modules/_images/file.svg @@ -0,0 +1 @@ +icon-square-small diff --git a/test/configCases/asset-modules/_images/file_copy.png b/test/configCases/asset-modules/_images/file_copy.png new file mode 100644 index 00000000000..fb53b9dedd3 Binary files /dev/null and b/test/configCases/asset-modules/_images/file_copy.png differ diff --git a/test/configCases/asset-modules/_static/file.html b/test/configCases/asset-modules/_static/file.html new file mode 100644 index 00000000000..e149a394349 --- /dev/null +++ b/test/configCases/asset-modules/_static/file.html @@ -0,0 +1,10 @@ + + + + + Title + + + + + diff --git a/test/configCases/asset-modules/assetModuleFilename/index.js b/test/configCases/asset-modules/assetModuleFilename/index.js new file mode 100644 index 00000000000..0b3685ff809 --- /dev/null +++ b/test/configCases/asset-modules/assetModuleFilename/index.js @@ -0,0 +1,9 @@ +import png from "../_images/file.png"; +import svg from "../_images/file.svg"; +import svg2 from "../_images/file.svg?custom2"; + +it("should change filenames", () => { + expect(png).toEqual("images/[ext]/success-png.png"); + expect(svg).toEqual("images/success-svg.svg"); + expect(svg2).toEqual("custom-images/success.svg"); +}); diff --git a/test/configCases/asset-modules/assetModuleFilename/webpack.config.js b/test/configCases/asset-modules/assetModuleFilename/webpack.config.js new file mode 100644 index 00000000000..d82e276a24f --- /dev/null +++ b/test/configCases/asset-modules/assetModuleFilename/webpack.config.js @@ -0,0 +1,32 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + output: { + assetModuleFilename: ({ filename: _filename }) => { + const filename = /** @type {string} */ (_filename); + if (/.png$/.test(filename)) { + return "images/[\\ext\\]/success-png[ext]"; + } + if (/.svg$/.test(filename)) { + return "images/success-svg[ext]"; + } + return "images/failure[ext]"; + } + }, + module: { + rules: [ + { + test: /\.(png|svg)$/, + type: "asset/resource", + rules: [ + { + resourceQuery: "?custom2", + generator: { + filename: "custom-images/success[ext]" + } + } + ] + } + ] + } +}; diff --git a/test/configCases/asset-modules/base-uri/index.js b/test/configCases/asset-modules/base-uri/index.js new file mode 100644 index 00000000000..6f942545493 --- /dev/null +++ b/test/configCases/asset-modules/base-uri/index.js @@ -0,0 +1,5 @@ +it("should handle different querystrings for assets correctly", () => { + __webpack_base_uri__ = "https://example.com"; + const file = new URL("../_images/file.png", import.meta.url); + expect(file.href).toMatch(/^https:\/\/example.com\/path\/[0-9a-f]+.png$/); +}); diff --git a/test/configCases/asset-modules/base-uri/webpack.config.js b/test/configCases/asset-modules/base-uri/webpack.config.js new file mode 100644 index 00000000000..fbec9a54399 --- /dev/null +++ b/test/configCases/asset-modules/base-uri/webpack.config.js @@ -0,0 +1,7 @@ +module.exports = { + mode: "development", + target: "web", + output: { + publicPath: "/path/" + } +}; diff --git a/test/configCases/asset-modules/build-http/index.js b/test/configCases/asset-modules/build-http/index.js new file mode 100644 index 00000000000..b3aa5ccbf08 --- /dev/null +++ b/test/configCases/asset-modules/build-http/index.js @@ -0,0 +1,8 @@ +const urlSvg = new URL( + "https://raw.githubusercontent.com/webpack/webpack/refs/heads/main/test/configCases/asset-modules/_images/file.svg", + import.meta.url +); + +it("should work", () => { + expect(/[\da-f]{20}\.svg$/.test(urlSvg)).toBe(true); +}); diff --git a/test/configCases/asset-modules/build-http/lock-files/lock.json b/test/configCases/asset-modules/build-http/lock-files/lock.json new file mode 100644 index 00000000000..0fbbbd268da --- /dev/null +++ b/test/configCases/asset-modules/build-http/lock-files/lock.json @@ -0,0 +1,4 @@ +{ + "https://raw.githubusercontent.com/webpack/webpack/refs/heads/main/test/configCases/asset-modules/_images/file.svg": { "integrity": "sha512-ncmj1otv+/Hu0YMJTrkNR+Tnzm9oQZt4PAKpmch4P73Gle2YoMdjhG5lAFxRurztcA/tRy5d8aI5gOet9D1Kag==", "contentType": "image/svg+xml" }, + "version": 1 +} diff --git a/test/configCases/asset-modules/build-http/lock-files/test/https_raw.githubusercontent.com/webpack_webpack_refs_heads_main_test_configCases_asset-modules__images_file_02a283f04807da1b64a1.svg b/test/configCases/asset-modules/build-http/lock-files/test/https_raw.githubusercontent.com/webpack_webpack_refs_heads_main_test_configCases_asset-modules__images_file_02a283f04807da1b64a1.svg new file mode 100644 index 00000000000..d7b7e40b4f8 --- /dev/null +++ b/test/configCases/asset-modules/build-http/lock-files/test/https_raw.githubusercontent.com/webpack_webpack_refs_heads_main_test_configCases_asset-modules__images_file_02a283f04807da1b64a1.svg @@ -0,0 +1 @@ +icon-square-small diff --git a/test/configCases/asset-modules/build-http/webpack.config.js b/test/configCases/asset-modules/build-http/webpack.config.js new file mode 100644 index 00000000000..8884b9730bd --- /dev/null +++ b/test/configCases/asset-modules/build-http/webpack.config.js @@ -0,0 +1,13 @@ +const path = require("path"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + experiments: { + buildHttp: { + allowedUris: [() => true], + lockfileLocation: path.resolve(__dirname, "./lock-files/lock.json"), + cacheLocation: path.resolve(__dirname, "./lock-files/test") + } + } +}; diff --git a/test/configCases/asset-modules/custom-condition/index.js b/test/configCases/asset-modules/custom-condition/index.js new file mode 100644 index 00000000000..dcb926ded57 --- /dev/null +++ b/test/configCases/asset-modules/custom-condition/index.js @@ -0,0 +1,9 @@ +import png from "../_images/file.png"; +import svg from "../_images/file.svg"; +import jpg from "../_images/file.jpg"; + +it("should generate various asset types by a custom encoder", () => { + expect(png).toMatch(/^data:image\/png;base64,[0-9a-zA-Z+/]+=*$/); + expect(jpg).toMatch(/^[\da-f]{20}\.jpg$/); + expect(svg).toMatch(/^[\da-f]{20}\.svg$/); +}); diff --git a/test/configCases/asset-modules/custom-condition/webpack.config.js b/test/configCases/asset-modules/custom-condition/webpack.config.js new file mode 100644 index 00000000000..ccdc354bf26 --- /dev/null +++ b/test/configCases/asset-modules/custom-condition/webpack.config.js @@ -0,0 +1,52 @@ +const path = require("path"); +const NormalModule = require("../../../../").NormalModule; + +/** @typedef {import("../../../../").ParserOptionsByModuleTypeKnown} ParserOptionsByModuleTypeKnown */ + +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + module: { + rules: [ + { + test: /\.png$/, + type: "asset", + /** @type {ParserOptionsByModuleTypeKnown['asset']} */ + parser: { + dataUrlCondition: (source, { filename, module }) => { + expect(source).toBeInstanceOf(Buffer); + expect(filename).toBe( + path.resolve(__dirname, "../_images/file.png") + ); + expect(module).toBeInstanceOf(NormalModule); + return true; + } + } + }, + { + test: /\.jpg$/, + type: "asset", + /** @type {ParserOptionsByModuleTypeKnown['asset']} */ + parser: { + dataUrlCondition: (source, { filename, module }) => { + expect(source).toBeInstanceOf(Buffer); + expect(filename).toBe( + path.resolve(__dirname, "../_images/file.jpg") + ); + expect(module).toBeInstanceOf(NormalModule); + return false; + } + } + }, + { + test: /\.svg$/, + type: "asset", + parser: { + dataUrlCondition: { + maxSize: 0 + } + } + } + ] + } +}; diff --git a/test/configCases/asset-modules/custom-encoder/index.js b/test/configCases/asset-modules/custom-encoder/index.js new file mode 100644 index 00000000000..834baa4cdda --- /dev/null +++ b/test/configCases/asset-modules/custom-encoder/index.js @@ -0,0 +1,9 @@ +import png from "../_images/file.png"; +import svg from "../_images/file.svg"; +import jpg from "../_images/file.jpg"; + +it("should generate various asset types by a custom encoder", () => { + expect(png).toMatch(/^data:mimetype\/png;base64,[0-9a-zA-Z+/]+=*$/); + expect(jpg).toEqual("data:image/jpg;base64,custom-content"); + expect(svg).toMatch(/^data:image\/svg\+xml,/); +}); diff --git a/test/configCases/asset-modules/custom-encoder/webpack.config.js b/test/configCases/asset-modules/custom-encoder/webpack.config.js new file mode 100644 index 00000000000..e6559778189 --- /dev/null +++ b/test/configCases/asset-modules/custom-encoder/webpack.config.js @@ -0,0 +1,35 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + module: { + rules: [ + { + test: /\.png$/, + type: "asset/inline", + generator: { + dataUrl: { + mimetype: "mimetype/png" + } + } + }, + { + test: /\.jpg$/, + type: "asset/inline", + generator: { + dataUrl() { + return "data:image/jpg;base64,custom-content"; + } + } + }, + { + test: /\.svg$/, + type: "asset", + generator: { + dataUrl: { + encoding: false + } + } + } + ] + } +}; diff --git a/test/configCases/asset-modules/data-url-broken/errors.js b/test/configCases/asset-modules/data-url-broken/errors.js new file mode 100644 index 00000000000..7eb520855ca --- /dev/null +++ b/test/configCases/asset-modules/data-url-broken/errors.js @@ -0,0 +1,3 @@ +module.exports = [ + /You may need an additional plugin to handle "unknown:" URIs./ +]; diff --git a/test/configCases/asset-modules/data-url-broken/index.js b/test/configCases/asset-modules/data-url-broken/index.js new file mode 100644 index 00000000000..c7f907bedc1 --- /dev/null +++ b/test/configCases/asset-modules/data-url-broken/index.js @@ -0,0 +1,14 @@ +it("should not crash", () => { + let errored; + + try { + const url = new URL( + "unknown:test", + import.meta.url + ); + } catch (err) { + errored = err; + } + + expect(/Module build failed/.test(errored.message)).toBe(true); +}); diff --git a/test/configCases/asset-modules/data-url-broken/infrastructure-log.js b/test/configCases/asset-modules/data-url-broken/infrastructure-log.js new file mode 100644 index 00000000000..10532afb6b2 --- /dev/null +++ b/test/configCases/asset-modules/data-url-broken/infrastructure-log.js @@ -0,0 +1,7 @@ +module.exports = options => { + if (options.cache && options.cache.type === "filesystem") { + return [/Pack got invalid because of write to/]; + } + + return []; +}; diff --git a/test/configCases/asset-modules/data-url-broken/webpack.config.js b/test/configCases/asset-modules/data-url-broken/webpack.config.js new file mode 100644 index 00000000000..ab9e619ce2f --- /dev/null +++ b/test/configCases/asset-modules/data-url-broken/webpack.config.js @@ -0,0 +1,30 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + module: { + rules: [ + { + test: /\.(png|svg)$/, + type: "asset/inline" + }, + { + mimetype: "image/svg+xml", + type: "asset/inline" + }, + { + test: /\.jpg$/, + type: "asset", + parser: { + dataUrlCondition: { + maxSize: Infinity + } + } + }, + { + mimetype: "text/plain", + type: "asset/inline", + loader: "./loader" + } + ] + } +}; diff --git a/test/configCases/asset-modules/data-url-extract/index.js b/test/configCases/asset-modules/data-url-extract/index.js new file mode 100644 index 00000000000..ae9b19ce4f3 --- /dev/null +++ b/test/configCases/asset-modules/data-url-extract/index.js @@ -0,0 +1,28 @@ +const urlSvg = new URL( + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MDAgNjAwIj48dGl0bGU+aWNvbi1zcXVhcmUtc21hbGw8L3RpdGxlPjxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0zMDAgLjFMNTY1IDE1MHYyOTkuOUwzMDAgNTk5LjggMzUgNDQ5LjlWMTUweiIvPjxwYXRoIGZpbGw9IiM4RUQ2RkIiIGQ9Ik01MTcuNyA0MzkuNUwzMDguOCA1NTcuOHYtOTJMNDM5IDM5NC4xbDc4LjcgNDUuNHptMTQuMy0xMi45VjE3OS40bC03Ni40IDQ0LjF2MTU5bDc2LjQgNDQuMXpNODEuNSA0MzkuNWwyMDguOSAxMTguMnYtOTJsLTEzMC4yLTcxLjYtNzguNyA0NS40em0tMTQuMy0xMi45VjE3OS40bDc2LjQgNDQuMXYxNTlsLTc2LjQgNDQuMXptOC45LTI2My4yTDI5MC40IDQyLjJ2ODlsLTEzNy4zIDc1LjUtMS4xLjYtNzUuOS00My45em00NDYuOSAwTDMwOC44IDQyLjJ2ODlMNDQ2IDIwNi44bDEuMS42IDc1LjktNDR6Ii8+PHBhdGggZmlsbD0iIzFDNzhDMCIgZD0iTTI5MC40IDQ0NC44TDE2MiAzNzQuMVYyMzQuMmwxMjguNCA3NC4xdjEzNi41em0xOC40IDBsMTI4LjQtNzAuNnYtMTQwbC0xMjguNCA3NC4xdjEzNi41ek0yOTkuNiAzMDN6bS0xMjktODVsMTI5LTcwLjlMNDI4LjUgMjE4bC0xMjguOSA3NC40LTEyOS03NC40eiIvPjwvc3ZnPgo=", + import.meta.url +); +const urlHtml = new URL( + "data:text/html,%3Ch1%3EHello%2C%20World!%3C%2Fh1%3E", + import.meta.url +); +const urlPng = new URL( + "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAWJQAAFiUBSVIk8AAAABNJREFUCB1jZGBg+A/EDEwgAgQADigBA//q6GsAAAAASUVORK5CYII%3D", + import.meta.url +); +const urlGif = new URL( + "data:image/gif;base64,R0lGODlhEAAQAMQAAORHHOVSKudfOulrSOp3WOyDZu6QdvCchPGolfO0o/XBs/fNwfjZ0frl3/zy7////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABAALAAAAAAQABAAAAVVICSOZGlCQAosJ6mu7fiyZeKqNKToQGDsM8hBADgUXoGAiqhSvp5QAnQKGIgUhwFUYLCVDFCrKUE1lBavAViFIDlTImbKC5Gm2hB0SlBCBMQiB0UjIQA7", + import.meta.url +); +const urlGif2 = new URL( + "data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=", + import.meta.url +); + +it("should extract DataURI's", () => { + expect(/[0-9abcdef]+\.svg/.test(urlSvg.href)).toBe(true); + expect(/[0-9abcdef]+\.[0-9abcdef]+\.html/.test(urlHtml.href)).toBe(true); + expect(/[0-9abcdef]+\.png/.test(urlPng.href)).toBe(true); + expect(/[0-9abcdef]+\.gif/.test(urlGif.href)).toBe(true); + expect(/[0-9abcdef]+\.gif/.test(urlGif2.href)).toBe(true); +}); diff --git a/test/configCases/asset-modules/data-url-extract/webpack.config.js b/test/configCases/asset-modules/data-url-extract/webpack.config.js new file mode 100644 index 00000000000..540e6dcb74a --- /dev/null +++ b/test/configCases/asset-modules/data-url-extract/webpack.config.js @@ -0,0 +1,33 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + module: { + rules: [ + { + mimetype: "image/gif", + type: "asset/resource", + generator: { + filename: "[name][ext][query]" + } + }, + { + mimetype: "text/html", + type: "asset/resource", + generator: { + filename: "[name].[contenthash][ext]" + } + }, + { + mimetype: "image/png", + type: "asset/resource", + generator: { + filename: "[contenthash][ext][query]" + } + }, + { + mimetype: "image/svg", + type: "asset/resource" + } + ] + } +}; diff --git a/test/configCases/asset-modules/data-url/index.js b/test/configCases/asset-modules/data-url/index.js new file mode 100644 index 00000000000..c76a993d25f --- /dev/null +++ b/test/configCases/asset-modules/data-url/index.js @@ -0,0 +1,37 @@ +import png from "../_images/file.png"; +import svg from "../_images/file.svg"; +import jpg from "../_images/file.jpg"; +import dataSvg from "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MDAgNjAwIj48dGl0bGU+aWNvbi1zcXVhcmUtc21hbGw8L3RpdGxlPjxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0zMDAgLjFMNTY1IDE1MHYyOTkuOUwzMDAgNTk5LjggMzUgNDQ5LjlWMTUweiIvPjxwYXRoIGZpbGw9IiM4RUQ2RkIiIGQ9Ik01MTcuNyA0MzkuNUwzMDguOCA1NTcuOHYtOTJMNDM5IDM5NC4xbDc4LjcgNDUuNHptMTQuMy0xMi45VjE3OS40bC03Ni40IDQ0LjF2MTU5bDc2LjQgNDQuMXpNODEuNSA0MzkuNWwyMDguOSAxMTguMnYtOTJsLTEzMC4yLTcxLjYtNzguNyA0NS40em0tMTQuMy0xMi45VjE3OS40bDc2LjQgNDQuMXYxNTlsLTc2LjQgNDQuMXptOC45LTI2My4yTDI5MC40IDQyLjJ2ODlsLTEzNy4zIDc1LjUtMS4xLjYtNzUuOS00My45em00NDYuOSAwTDMwOC44IDQyLjJ2ODlMNDQ2IDIwNi44bDEuMS42IDc1LjktNDR6Ii8+PHBhdGggZmlsbD0iIzFDNzhDMCIgZD0iTTI5MC40IDQ0NC44TDE2MiAzNzQuMVYyMzQuMmwxMjguNCA3NC4xdjEzNi41em0xOC40IDBsMTI4LjQtNzAuNnYtMTQwbC0xMjguNCA3NC4xdjEzNi41ek0yOTkuNiAzMDN6bS0xMjktODVsMTI5LTcwLjlMNDI4LjUgMjE4bC0xMjguOSA3NC40LTEyOS03NC40eiIvPjwvc3ZnPgo="; +const urlSvg = new URL( + "data:image/svg;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MDAgNjAwIj48dGl0bGU+aWNvbi1zcXVhcmUtc21hbGw8L3RpdGxlPjxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0zMDAgLjFMNTY1IDE1MHYyOTkuOUwzMDAgNTk5LjggMzUgNDQ5LjlWMTUweiIvPjxwYXRoIGZpbGw9IiM4RUQ2RkIiIGQ9Ik01MTcuNyA0MzkuNUwzMDguOCA1NTcuOHYtOTJMNDM5IDM5NC4xbDc4LjcgNDUuNHptMTQuMy0xMi45VjE3OS40bC03Ni40IDQ0LjF2MTU5bDc2LjQgNDQuMXpNODEuNSA0MzkuNWwyMDguOSAxMTguMnYtOTJsLTEzMC4yLTcxLjYtNzguNyA0NS40em0tMTQuMy0xMi45VjE3OS40bDc2LjQgNDQuMXYxNTlsLTc2LjQgNDQuMXptOC45LTI2My4yTDI5MC40IDQyLjJ2ODlsLTEzNy4zIDc1LjUtMS4xLjYtNzUuOS00My45em00NDYuOSAwTDMwOC44IDQyLjJ2ODlMNDQ2IDIwNi44bDEuMS42IDc1LjktNDR6Ii8+PHBhdGggZmlsbD0iIzFDNzhDMCIgZD0iTTI5MC40IDQ0NC44TDE2MiAzNzQuMVYyMzQuMmwxMjguNCA3NC4xdjEzNi41em0xOC40IDBsMTI4LjQtNzAuNnYtMTQwbC0xMjguNCA3NC4xdjEzNi41ek0yOTkuNiAzMDN6bS0xMjktODVsMTI5LTcwLjlMNDI4LjUgMjE4bC0xMjguOSA3NC40LTEyOS03NC40eiIvPjwvc3ZnPgo=" +); +const urlSvg2 = new URL( + "data:image/svg+xml;p=1;q=2,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke=\"%23343a40\" stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e", + import.meta.url +); +const helloWorld = new URL("data:text/plain,Hello", import.meta.url); +const helloWorldBase64 = new URL( + "data:text/plain;base64,SGVsbG8=", + import.meta.url +); + +const urlSvg3 = new URL( + "data:image/svg+xml;,%3Csvg xmlns=%27http://www.w3.org/2000/svg%27 aria-hidden=%27true%27 fill=%27%23535A60%27 width=%2718%27 height=%2718%27 viewBox=%270 0 18 18%27%3E%3Cpath d=%27M3 3a2 2 0 012-2h6l4 4v10a2 2 0 01-2 2H5a2 2 0 01-2-2V3zm7-1.5V6h4.5L10 1.5z%27%3E%3C/path%3E%3C/svg%3E", + import.meta.url +); + +it("should generate various data-url types", () => { + expect(png).toContain("data:image/png;base64,"); + expect(svg).toContain("data:image/svg+xml;base64"); + expect(jpg).toContain("data:image/jpeg;base64,"); + expect(dataSvg).toContain("data:image/svg+xml;base64,"); + expect(urlSvg.href).toContain("data:image/svg;base64,"); + expect(urlSvg2.href).toContain( + "data:image/svg+xml;p=1;q=2,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke=\"%23343a40\" stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e" + ); + expect(urlSvg3.href).toContain("data:image/svg+xml,"); + expect(helloWorld.href).toContain("data:text/plain,Hello%2C%20World%21"); + expect(helloWorldBase64.href).toContain( + "data:text/plain;base64,SGVsbG8sIFdvcmxkIQ==" + ); +}); diff --git a/test/configCases/asset-modules/data-url/loader.js b/test/configCases/asset-modules/data-url/loader.js new file mode 100644 index 00000000000..c5048a9c3df --- /dev/null +++ b/test/configCases/asset-modules/data-url/loader.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition<{ f(): any }>} */ +module.exports = function (source) { + return `${source}, World!`; +}; diff --git a/test/configCases/asset-modules/data-url/webpack.config.js b/test/configCases/asset-modules/data-url/webpack.config.js new file mode 100644 index 00000000000..ab9e619ce2f --- /dev/null +++ b/test/configCases/asset-modules/data-url/webpack.config.js @@ -0,0 +1,30 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + module: { + rules: [ + { + test: /\.(png|svg)$/, + type: "asset/inline" + }, + { + mimetype: "image/svg+xml", + type: "asset/inline" + }, + { + test: /\.jpg$/, + type: "asset", + parser: { + dataUrlCondition: { + maxSize: Infinity + } + } + }, + { + mimetype: "text/plain", + type: "asset/inline", + loader: "./loader" + } + ] + } +}; diff --git a/test/configCases/asset-modules/different-query/index.js b/test/configCases/asset-modules/different-query/index.js new file mode 100644 index 00000000000..6c49de9c5cb --- /dev/null +++ b/test/configCases/asset-modules/different-query/index.js @@ -0,0 +1,12 @@ +it("should handle different querystrings for assets correctly", () => { + const a = new URL("../_images/file.png?foo=bar", import.meta.url); + const b = new URL("../_images/file.png?bar=foo", import.meta.url); + const c = new URL("../_images/file.png", import.meta.url); + const d = new URL("../_images/file.png", import.meta.url); + expect(b.pathname).toBe(a.pathname); + expect(c.pathname).toBe(a.pathname); + expect(d.pathname).toBe(a.pathname); + expect(a.search).toBe("?foo=bar"); + expect(b.search).toBe("?bar=foo"); + expect(c.search).toBe(""); +}); diff --git a/test/configCases/asset-modules/different-query/webpack.config.js b/test/configCases/asset-modules/different-query/webpack.config.js new file mode 100644 index 00000000000..2a2dd0d262f --- /dev/null +++ b/test/configCases/asset-modules/different-query/webpack.config.js @@ -0,0 +1,4 @@ +module.exports = { + mode: "development", + target: "web" +}; diff --git a/test/configCases/asset-modules/emit/index.js b/test/configCases/asset-modules/emit/index.js new file mode 100644 index 00000000000..3bc85a00242 --- /dev/null +++ b/test/configCases/asset-modules/emit/index.js @@ -0,0 +1,12 @@ +import url from "../_images/file.png"; +import url2 from "../_images/file.jpg"; +import fs from "fs"; +import path from "path"; + +it("should output asset with path", () => { + expect(url).toEqual("images/file.png"); + expect(url2).toEqual("images/file.jpg"); + + expect(fs.existsSync(path.join(__STATS__.outputPath, url))).toBe(false); + expect(fs.existsSync(path.join(__STATS__.outputPath, url2))).toBe(true); +}); diff --git a/test/configCases/asset-modules/emit/webpack.config.js b/test/configCases/asset-modules/emit/webpack.config.js new file mode 100644 index 00000000000..f764349bb04 --- /dev/null +++ b/test/configCases/asset-modules/emit/webpack.config.js @@ -0,0 +1,22 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + output: { + assetModuleFilename: "images/file[ext]" + }, + module: { + rules: [ + { + test: /\.png$/, + type: "asset/resource", + generator: { + emit: false + } + }, + { + test: /\.jpg$/, + type: "asset/resource" + } + ] + } +}; diff --git a/test/configCases/asset-modules/entry-with-runtimeChunk/entry.css b/test/configCases/asset-modules/entry-with-runtimeChunk/entry.css new file mode 100644 index 00000000000..72dc1bf90b9 --- /dev/null +++ b/test/configCases/asset-modules/entry-with-runtimeChunk/entry.css @@ -0,0 +1,3 @@ +.class { + background: #000; +} diff --git a/test/configCases/asset-modules/entry-with-runtimeChunk/entry.js b/test/configCases/asset-modules/entry-with-runtimeChunk/entry.js new file mode 100644 index 00000000000..0acee55e319 --- /dev/null +++ b/test/configCases/asset-modules/entry-with-runtimeChunk/entry.js @@ -0,0 +1,3 @@ +it("should compile and run", () => { + expect(true).toBe(true) +}); diff --git a/test/configCases/asset-modules/entry-with-runtimeChunk/test.config.js b/test/configCases/asset-modules/entry-with-runtimeChunk/test.config.js new file mode 100644 index 00000000000..48bb5fe37b6 --- /dev/null +++ b/test/configCases/asset-modules/entry-with-runtimeChunk/test.config.js @@ -0,0 +1,24 @@ +module.exports = { + findBundle(i, options) { + const ext = options.output.module ? "mjs" : "js"; + + switch (i % 4) { + case 0: + return ["test.js", `${i}/runtime~app.${ext}`]; + case 1: + return ["test.js", `${i}/app.${ext}`, `${i}/runtime~app.${ext}`]; + case 2: + return ["test.js", `${i}/app.${ext}`, `${i}/runtime~app.${ext}`]; + case 3: + return [ + "test.js", + `${i}/entry1.${ext}`, + `${i}/entry2.${ext}`, + `${i}/runtime~entry1.${ext}`, + `${i}/runtime~entry2.${ext}` + ]; + default: + break; + } + } +}; diff --git a/test/configCases/asset-modules/entry-with-runtimeChunk/test.js b/test/configCases/asset-modules/entry-with-runtimeChunk/test.js new file mode 100644 index 00000000000..2fe137f49b0 --- /dev/null +++ b/test/configCases/asset-modules/entry-with-runtimeChunk/test.js @@ -0,0 +1,14 @@ +it("should work", () => { + const stats = __STATS__.children[__STATS_I__]; + + const test = stats.assets.find( + a => a.name === "test.js" + ); + expect(Boolean(test)).toBe(true); + + const assetEntry = stats.assets.find( + a => a.info.sourceFilename === "../_images/file.png" + ); + expect(Boolean(assetEntry)).toBe(true); + +}); diff --git a/test/configCases/asset-modules/entry-with-runtimeChunk/webpack.config.js b/test/configCases/asset-modules/entry-with-runtimeChunk/webpack.config.js new file mode 100644 index 00000000000..72c90f6c7f5 --- /dev/null +++ b/test/configCases/asset-modules/entry-with-runtimeChunk/webpack.config.js @@ -0,0 +1,151 @@ +const path = require("path"); +const fs = require("fs"); +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +const common = { + module: { + rules: [ + { + test: /\.png$/, + type: "asset" + } + ] + }, + experiments: { + css: true + }, + plugins: [ + { + apply(compiler) { + compiler.hooks.compilation.tap("Test", compilation => { + compilation.hooks.processAssets.tap( + { + name: "copy-webpack-plugin", + stage: + compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL + }, + () => { + const data = fs.readFileSync( + path.resolve(__dirname, "./test.js") + ); + + compilation.emitAsset( + "test.js", + new webpack.sources.RawSource(data) + ); + } + ); + }); + } + } + ], + optimization: { + runtimeChunk: { + name: entrypoint => `runtime~${entrypoint.name}` + } + } +}; + +/** + * @param {number} i index + * @returns {import("../../../../").Configuration | undefined} configuration + */ +const entry = i => { + switch (i % 4) { + case 0: + return { + entry: { + app: { + import: "../_images/file.png" + } + } + }; + case 1: + return { + entry: { + app: ["../_images/file.png", "./entry.js"] + } + }; + case 2: + return { + entry: { + app: ["../_images/file.png", "./entry.css"] + } + }; + case 3: + return { + entry: { + entry1: "../_images/file.png", + entry2: "./entry.js" + } + }; + default: + break; + } +}; + +/** + * @param {number} i index + * @returns {import("../../../../").Configuration} configuration + */ +const esm = i => ({ + ...common, + ...entry(i), + output: { + filename: `${i}/[name].mjs`, + chunkFilename: `${i}/[name].mjs`, + cssFilename: `${i}/[name].css`, + cssChunkFilename: `${i}/[name].css`, + assetModuleFilename: `${i}/[name][ext][query]`, + module: true + }, + experiments: { + outputModule: true, + css: true + } +}); + +/** + * @param {number} i index + * @returns {import("../../../../").Configuration} configuration + */ +const node = i => ({ + ...common, + ...entry(i), + output: { + filename: `${i}/[name].js`, + chunkFilename: `${i}/[name].js`, + cssFilename: `${i}/[name].css`, + cssChunkFilename: `${i}/[name].css`, + assetModuleFilename: `${i}/[name][ext][query]` + }, + target: "node" +}); + +/** + * @param {number} i index + * @returns {import("../../../../").Configuration} configuration + */ +const web = i => ({ + ...common, + ...entry(i), + output: { + filename: `${i}/[name].js`, + chunkFilename: `${i}/[name].js`, + cssFilename: `${i}/[name].css`, + cssChunkFilename: `${i}/[name].css`, + assetModuleFilename: `${i}/[name][ext][query]` + }, + target: "web" +}); + +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + // web + ...[0, 1, 2, 3].map(i => web(i)), + // node + ...[4, 5, 6, 7].map(i => node(i)), + // ESM + ...[8, 9, 10, 11].map(i => esm(i)) +]; diff --git a/test/configCases/asset-modules/errored/errors.js b/test/configCases/asset-modules/errored/errors.js new file mode 100644 index 00000000000..6cc186c0ea2 --- /dev/null +++ b/test/configCases/asset-modules/errored/errors.js @@ -0,0 +1 @@ +module.exports = [/Error from loader/]; diff --git a/test/configCases/asset-modules/errored/index.js b/test/configCases/asset-modules/errored/index.js new file mode 100644 index 00000000000..0875071fac5 --- /dev/null +++ b/test/configCases/asset-modules/errored/index.js @@ -0,0 +1,7 @@ +it("should use a valid output path", () => { + try { + new URL("./style.css", import.meta.url); + } catch (e) { + // Nothing + } +}); diff --git a/test/configCases/asset-modules/errored/infrastructure-log.js b/test/configCases/asset-modules/errored/infrastructure-log.js new file mode 100644 index 00000000000..10532afb6b2 --- /dev/null +++ b/test/configCases/asset-modules/errored/infrastructure-log.js @@ -0,0 +1,7 @@ +module.exports = options => { + if (options.cache && options.cache.type === "filesystem") { + return [/Pack got invalid because of write to/]; + } + + return []; +}; diff --git a/test/configCases/asset-modules/errored/loader.js b/test/configCases/asset-modules/errored/loader.js new file mode 100644 index 00000000000..4c6707e1a90 --- /dev/null +++ b/test/configCases/asset-modules/errored/loader.js @@ -0,0 +1,3 @@ +module.exports = function loader() { + throw new Error("Error from loader"); +}; diff --git a/test/configCases/asset-modules/errored/style.css b/test/configCases/asset-modules/errored/style.css new file mode 100644 index 00000000000..195b6bcf6d2 --- /dev/null +++ b/test/configCases/asset-modules/errored/style.css @@ -0,0 +1,3 @@ +a { + color: red; +} diff --git a/test/configCases/asset-modules/errored/test.config.js b/test/configCases/asset-modules/errored/test.config.js new file mode 100644 index 00000000000..2fddc833b22 --- /dev/null +++ b/test/configCases/asset-modules/errored/test.config.js @@ -0,0 +1,12 @@ +const fs = require("fs"); +const path = require("path"); + +module.exports = { + afterExecute(options) { + const files = fs.readdirSync(path.resolve(options.output.path, "./css")); + + if (!/style\.[0-9a-f]{8}\.css/.test(files[0])) { + throw new Error(`Invalid path for ${files.join(",")} files.`); + } + } +}; diff --git a/test/configCases/asset-modules/errored/webpack.config.js b/test/configCases/asset-modules/errored/webpack.config.js new file mode 100644 index 00000000000..f615c96802f --- /dev/null +++ b/test/configCases/asset-modules/errored/webpack.config.js @@ -0,0 +1,23 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + output: { + hashDigestLength: 8 + }, + module: { + rules: [ + { + test: /\.css$/i, + type: "asset/resource", + generator: { + filename: () => `css/style.[contenthash].css` + }, + use: [ + { + loader: require.resolve("./loader") + } + ] + } + ] + } +}; diff --git a/test/configCases/asset-modules/file-loader/index.js b/test/configCases/asset-modules/file-loader/index.js new file mode 100644 index 00000000000..7e9d5657ae3 --- /dev/null +++ b/test/configCases/asset-modules/file-loader/index.js @@ -0,0 +1,5 @@ +import url from "../_images/file.png"; + +it("should use file-loader", () => { + expect(url).toEqual("file-loader.png"); +}); diff --git a/test/configCases/asset-modules/file-loader/webpack.config.js b/test/configCases/asset-modules/file-loader/webpack.config.js new file mode 100644 index 00000000000..835a3c38e5e --- /dev/null +++ b/test/configCases/asset-modules/file-loader/webpack.config.js @@ -0,0 +1,15 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + module: { + rules: [ + { + test: /\.png$/, + loader: "file-loader", + options: { + name: "file-loader.[ext]" + } + } + ] + } +}; diff --git a/test/configCases/asset-modules/file-url/.gitignore b/test/configCases/asset-modules/file-url/.gitignore new file mode 100644 index 00000000000..9c595a6fb76 --- /dev/null +++ b/test/configCases/asset-modules/file-url/.gitignore @@ -0,0 +1 @@ +temp diff --git a/test/configCases/asset-modules/file-url/index.js b/test/configCases/asset-modules/file-url/index.js new file mode 100644 index 00000000000..298a345e258 --- /dev/null +++ b/test/configCases/asset-modules/file-url/index.js @@ -0,0 +1,7 @@ +import {val1, val2} from "./temp/index.js"; +import expected from "./src with spaces/module"; + +it("file url request should be supported", () => { + expect(val1).toBe(expected); + expect(val2).toBe(expected); +}); diff --git a/test/configCases/asset-modules/file-url/src with spaces/module.js b/test/configCases/asset-modules/file-url/src with spaces/module.js new file mode 100644 index 00000000000..eb3cab741ed --- /dev/null +++ b/test/configCases/asset-modules/file-url/src with spaces/module.js @@ -0,0 +1 @@ +export default "default" diff --git a/test/configCases/asset-modules/file-url/webpack.config.js b/test/configCases/asset-modules/file-url/webpack.config.js new file mode 100644 index 00000000000..81395d57854 --- /dev/null +++ b/test/configCases/asset-modules/file-url/webpack.config.js @@ -0,0 +1,36 @@ +const fs = require("fs"); +const path = require("path"); +const { pathToFileURL } = require("url"); +const dir = path.resolve(__dirname, "temp"); +const file = path.resolve(dir, "index.js"); + +fs.mkdirSync(dir, { + recursive: true +}); +fs.writeFileSync( + file, + `import v1 from ${JSON.stringify( + pathToFileURL( + path.resolve( + "./test/configCases/asset-modules/file-url/src with spaces/module.js" + ) + ) + )}; +import v2 from ${JSON.stringify( + `file://localhost${pathToFileURL( + path.resolve( + "./test/configCases/asset-modules/file-url/src with spaces/module.js" + ) + ) + .toString() + .slice("file://".length)}` + )}; +export const val1 = v1; +export const val2 = v2;` +); +fs.utimesSync(file, new Date(Date.now() - 10000), new Date(Date.now() - 10000)); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development" +}; diff --git a/test/configCases/asset-modules/generator-asset-publicPath-hash/index.js b/test/configCases/asset-modules/generator-asset-publicPath-hash/index.js new file mode 100644 index 00000000000..2cd9f385a96 --- /dev/null +++ b/test/configCases/asset-modules/generator-asset-publicPath-hash/index.js @@ -0,0 +1,12 @@ +import url from "../_images/file.png"; + +it("should import asset with module.generator.asset.publicPath", () => { + expect(url).toMatch(/^[a-f0-9]{20}\/assets\/[a-f0-9]{10}\.file\.png$/); + const assetInfo = __STATS__.assets.find( + a => a.info.sourceFilename === "../_images/file.png" + ).info; + expect(assetInfo.immutable).toBe(true); + expect(assetInfo.contenthash.length).toBe(2); + expect(assetInfo.contenthash[0].length).toBe(10); + expect(assetInfo.contenthash[1].length).toBe(20); +}); diff --git a/test/configCases/asset-modules/generator-asset-publicPath-hash/webpack.config.js b/test/configCases/asset-modules/generator-asset-publicPath-hash/webpack.config.js new file mode 100644 index 00000000000..f21eb61c884 --- /dev/null +++ b/test/configCases/asset-modules/generator-asset-publicPath-hash/webpack.config.js @@ -0,0 +1,20 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + output: { + assetModuleFilename: "[contenthash:10].file[ext]" + }, + module: { + rules: [ + { + test: /\.png$/, + type: "asset" + } + ], + generator: { + asset: { + publicPath: "[contenthash]/assets/" + } + } + } +}; diff --git a/test/configCases/asset-modules/generator-asset-publicPath/index.js b/test/configCases/asset-modules/generator-asset-publicPath/index.js new file mode 100644 index 00000000000..dfeeec0a55b --- /dev/null +++ b/test/configCases/asset-modules/generator-asset-publicPath/index.js @@ -0,0 +1,5 @@ +import url from "../_images/file.png"; + +it("should import asset with module.generator.asset.publicPath", () => { + expect(url).toEqual("assets/file.png"); +}); diff --git a/test/configCases/asset-modules/generator-asset-publicPath/webpack.config.js b/test/configCases/asset-modules/generator-asset-publicPath/webpack.config.js new file mode 100644 index 00000000000..8dbee301fd5 --- /dev/null +++ b/test/configCases/asset-modules/generator-asset-publicPath/webpack.config.js @@ -0,0 +1,20 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + output: { + assetModuleFilename: "file[ext]" + }, + module: { + rules: [ + { + test: /\.png$/, + type: "asset" + } + ], + generator: { + asset: { + publicPath: "assets/" + } + } + } +}; diff --git a/test/configCases/asset-modules/global-options/index.js b/test/configCases/asset-modules/global-options/index.js new file mode 100644 index 00000000000..f63c1225493 --- /dev/null +++ b/test/configCases/asset-modules/global-options/index.js @@ -0,0 +1,9 @@ +import png from "../_images/file.png"; +import svg from "../_images/file.svg?inline"; +import jpg from "../_images/file.jpg"; + +it("should output various asset types", () => { + expect(png).toMatch(/^[\da-f]{20}\.png$/); + expect(svg).toMatch(/^data:image\/svg\+xml,/); + expect(jpg).toMatch(/^DATA:image\/jpeg;base64,[0-9a-zA-Z+/]+=*$/); +}); diff --git a/test/configCases/asset-modules/global-options/webpack.config.js b/test/configCases/asset-modules/global-options/webpack.config.js new file mode 100644 index 00000000000..ca65a9b6839 --- /dev/null +++ b/test/configCases/asset-modules/global-options/webpack.config.js @@ -0,0 +1,45 @@ +const svgToMiniDataURI = require("mini-svg-data-uri"); +const mimeTypes = require("mime-types"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + module: { + parser: { + asset: { + dataUrlCondition: (source, { filename }) => filename.includes("?inline") + } + }, + generator: { + asset: { + dataUrl: (source, { module }) => { + const mimeType = mimeTypes.lookup( + /** @type {string} */ + (module.nameForCondition()) + ); + if (mimeType === "image/svg+xml") { + if (typeof source !== "string") { + source = source.toString(); + } + + return svgToMiniDataURI(source); + } + + const encodedContent = source.toString("base64"); + + return `DATA:${mimeType};base64,${encodedContent}`; + } + } + }, + rules: [ + { + test: /\.(png|svg)$/, + type: "asset" + }, + { + test: /\.jpg$/, + type: "asset/inline" + } + ] + } +}; diff --git a/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/asset_72216076a225ea0abbaa.txt b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/asset_72216076a225ea0abbaa.txt new file mode 100644 index 00000000000..5e1c309dae7 --- /dev/null +++ b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/asset_72216076a225ea0abbaa.txt @@ -0,0 +1 @@ +Hello World \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/asset_query_590ffbc5acc20bf1dc88.txt b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/asset_query_590ffbc5acc20bf1dc88.txt new file mode 100644 index 00000000000..5e1c309dae7 --- /dev/null +++ b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/asset_query_590ffbc5acc20bf1dc88.txt @@ -0,0 +1 @@ +Hello World \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/fallback_4972219bd28762fbfd18.js b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/fallback_4972219bd28762fbfd18.js new file mode 100644 index 00000000000..e5dfb6da968 --- /dev/null +++ b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/fallback_4972219bd28762fbfd18.js @@ -0,0 +1 @@ +export * from "fallback-package"; \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/folder_dependency_3263dc642c8ad1171873.js b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/folder_dependency_3263dc642c8ad1171873.js new file mode 100644 index 00000000000..e3e81f78e6b --- /dev/null +++ b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/folder_dependency_3263dc642c8ad1171873.js @@ -0,0 +1,2 @@ +export * from "./sub-dependency.js"; +export * from "/folder/sub-dependency2.js"; \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/folder_sub-dependency2_f750536150de4f4db445.js b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/folder_sub-dependency2_f750536150de4f4db445.js new file mode 100644 index 00000000000..72fdbad6cad --- /dev/null +++ b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/folder_sub-dependency2_f750536150de4f4db445.js @@ -0,0 +1 @@ +export const value2 = 42; \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/folder_sub-dependency_a662b3b186898f776088.js b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/folder_sub-dependency_a662b3b186898f776088.js new file mode 100644 index 00000000000..b7159db4840 --- /dev/null +++ b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/folder_sub-dependency_a662b3b186898f776088.js @@ -0,0 +1 @@ +export const value = 42; \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/index_cache_502725659b59ae63a82a.css b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/index_cache_502725659b59ae63a82a.css new file mode 100644 index 00000000000..b978c1b5980 --- /dev/null +++ b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/index_cache_502725659b59ae63a82a.css @@ -0,0 +1 @@ +a {} \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/index_query_169a64b251bcdc02a084.css b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/index_query_169a64b251bcdc02a084.css new file mode 100644 index 00000000000..b978c1b5980 --- /dev/null +++ b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/index_query_169a64b251bcdc02a084.css @@ -0,0 +1 @@ +a {} \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/redirect_d3dcf71bcf15dc29654c.js b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/redirect_d3dcf71bcf15dc29654c.js new file mode 100644 index 00000000000..d31cf81a327 --- /dev/null +++ b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/redirect_d3dcf71bcf15dc29654c.js @@ -0,0 +1 @@ +export default { ok: true }; \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/resolve_69c3f44e55195d0c14cf.js b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/resolve_69c3f44e55195d0c14cf.js new file mode 100644 index 00000000000..7a369ecb8ec --- /dev/null +++ b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/resolve_69c3f44e55195d0c14cf.js @@ -0,0 +1 @@ +export * from "./folder/dependency.js"; \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/url_cc93d527a81c32b07ab8.js b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/url_cc93d527a81c32b07ab8.js new file mode 100644 index 00000000000..1948b244cf1 --- /dev/null +++ b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/http_localhost_9990/url_cc93d527a81c32b07ab8.js @@ -0,0 +1 @@ +export default new URL("asset.txt?query", import.meta.url); \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/https_raw.githubusercontent.com/webpack_webpack_main_CODE_OF_CONDUCT_06e7b335922db99b918d.md b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/https_raw.githubusercontent.com/webpack_webpack_main_CODE_OF_CONDUCT_06e7b335922db99b918d.md new file mode 100644 index 00000000000..4faf227c455 --- /dev/null +++ b/test/configCases/asset-modules/http-url/dev-defaults.webpack.lock.data/https_raw.githubusercontent.com/webpack_webpack_main_CODE_OF_CONDUCT_06e7b335922db99b918d.md @@ -0,0 +1 @@ +[Code of Conduct](https://github.com/openjs-foundation/code-and-learn/blob/master/CODE_OF_CONDUCT.md) diff --git a/test/configCases/asset-modules/http-url/errors.js b/test/configCases/asset-modules/http-url/errors.js new file mode 100644 index 00000000000..4e46c194963 --- /dev/null +++ b/test/configCases/asset-modules/http-url/errors.js @@ -0,0 +1,18 @@ +module.exports = [ + [ + /http:\/\/localhost:9990\/index\.css\?cache used to have no-cache lockfile entry and has content now, but lockfile is frozen/ + ], + [ + /http:\/\/localhost:9990\/index\.css\?no-cache has a lockfile entry and is no-cache now, but lockfile is frozen/ + ], + [ + /http:\/\/localhost:9990\/index\.css has an outdated lockfile entry, but lockfile is frozen/ + ], + [/http:\/\/localhost:9990\/resolve\.js integrity mismatch/], + [ + /http:\/\/localhost:9990\/fallback\.js has no lockfile entry and lockfile is frozen/ + ], + [ + /http:\/\/localhost:9990\/redirect has an outdated lockfile entry, but lockfile is frozen/ + ] +]; diff --git a/test/configCases/asset-modules/http-url/errors.webpack.lock b/test/configCases/asset-modules/http-url/errors.webpack.lock new file mode 100644 index 00000000000..8f9855c35bd --- /dev/null +++ b/test/configCases/asset-modules/http-url/errors.webpack.lock @@ -0,0 +1,13 @@ +{ + "http://localhost:9990/asset.txt?ignore": "ignore", + "http://localhost:9990/index.css": { "integrity": "sha512-sqhF9JAEi5h3ziP48SBnzQnaeei8cf/pfYJBdKL4F7xdu3v5yr71eQ0kCL11/jWRFjLG4TKOudUnS/u6WLMqYw==", "contentType": "invalid" }, + "http://localhost:9990/index.css?query#fragment": { "integrity": "sha512-sqhF9JAEi5h3ziP48SBnzQnaeei8cf/pfYJBdKL4F7xdu3v5yr71eQ0kCL11/jWRFjLG4TKOudUnS/u6WLMqYw==", "contentType": "text/css" }, + "http://localhost:9990/index.css?no-cache": { "integrity": "sha512-sqhF9JAEi5h3ziP48SBnzQnaeei8cf/pfYJBdKL4F7xdu3v5yr71eQ0kCL11/jWRFjLG4TKOudUnS/u6WLMqYw==", "contentType": "text/css" }, + "http://localhost:9990/index.css?cache": "no-cache", + "http://localhost:9990/redirect": { "integrity": "sha512-BV/MK/QTq+NHRve1XpZyQ8V6cjRP/fwbtJvENRdm5C73qNYZ4i2/fw+soj7J4qxzBXMHDbvOnA6E0ShnX2hc1w==", "contentType": "text/javascript" }, + "http://localhost:9990/redirect.js": { "resolved": "http://localhost:9990/redirect", "integrity": "sha512-BV/MK/QTq+NHRve1XpZyQ8V6cjRP/fwbtJvENRdm5C73qNYZ4i2/fw+soj7J4qxzBXMHDbvOnA6E0ShnX2hc1w==", "contentType": "text/javascript" }, + "http://localhost:9990/resolve.js": { "integrity": "sha512-SHOULD_BE_INVALID", "contentType": "text/javascript" }, + "https://raw.githubusercontent.com//webpack//webpack//main/CODE_OF_CONDUCT.md": { "integrity": "sha512-OLJ9q6iSO652hVBkTLsMLtQnFBBTzEbFqLGyWD62nPga/0DZ9bc3oOFb5OYT8RIPzmlOX4WzK2uiLgc1NSGtBA==", "contentType": "text/plain; charset=utf-8" }, + "https://raw.githubusercontent.com/webpack/webpack/main/CODE_OF_CONDUCT.md": { "integrity": "sha512-OLJ9q6iSO652hVBkTLsMLtQnFBBTzEbFqLGyWD62nPga/0DZ9bc3oOFb5OYT8RIPzmlOX4WzK2uiLgc1NSGtBA==", "contentType": "text/plain; charset=utf-8" }, + "version": 1 +} diff --git a/test/configCases/asset-modules/http-url/errors.webpack.lock.data/http_localhost_9990/fallback_4972219bd28762fbfd18.js b/test/configCases/asset-modules/http-url/errors.webpack.lock.data/http_localhost_9990/fallback_4972219bd28762fbfd18.js new file mode 100644 index 00000000000..e5dfb6da968 --- /dev/null +++ b/test/configCases/asset-modules/http-url/errors.webpack.lock.data/http_localhost_9990/fallback_4972219bd28762fbfd18.js @@ -0,0 +1 @@ +export * from "fallback-package"; \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/errors.webpack.lock.data/http_localhost_9990/index_query_169a64b251bcdc02a084.css b/test/configCases/asset-modules/http-url/errors.webpack.lock.data/http_localhost_9990/index_query_169a64b251bcdc02a084.css new file mode 100644 index 00000000000..b978c1b5980 --- /dev/null +++ b/test/configCases/asset-modules/http-url/errors.webpack.lock.data/http_localhost_9990/index_query_169a64b251bcdc02a084.css @@ -0,0 +1 @@ +a {} \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/errors.webpack.lock.data/http_localhost_9990/redirect_d3dcf71bcf15dc29654c.js b/test/configCases/asset-modules/http-url/errors.webpack.lock.data/http_localhost_9990/redirect_d3dcf71bcf15dc29654c.js new file mode 100644 index 00000000000..d31cf81a327 --- /dev/null +++ b/test/configCases/asset-modules/http-url/errors.webpack.lock.data/http_localhost_9990/redirect_d3dcf71bcf15dc29654c.js @@ -0,0 +1 @@ +export default { ok: true }; \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/errors.webpack.lock.data/http_localhost_9990/resolve_69c3f44e55195d0c14cf.js b/test/configCases/asset-modules/http-url/errors.webpack.lock.data/http_localhost_9990/resolve_69c3f44e55195d0c14cf.js new file mode 100644 index 00000000000..7a369ecb8ec --- /dev/null +++ b/test/configCases/asset-modules/http-url/errors.webpack.lock.data/http_localhost_9990/resolve_69c3f44e55195d0c14cf.js @@ -0,0 +1 @@ +export * from "./folder/dependency.js"; \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/errors.webpack.lock.data/https_raw.githubusercontent.com/webpack_webpack_main_CODE_OF_CONDUCT_06e7b335922db99b918d.md b/test/configCases/asset-modules/http-url/errors.webpack.lock.data/https_raw.githubusercontent.com/webpack_webpack_main_CODE_OF_CONDUCT_06e7b335922db99b918d.md new file mode 100644 index 00000000000..4faf227c455 --- /dev/null +++ b/test/configCases/asset-modules/http-url/errors.webpack.lock.data/https_raw.githubusercontent.com/webpack_webpack_main_CODE_OF_CONDUCT_06e7b335922db99b918d.md @@ -0,0 +1 @@ +[Code of Conduct](https://github.com/openjs-foundation/code-and-learn/blob/master/CODE_OF_CONDUCT.md) diff --git a/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock new file mode 100644 index 00000000000..3ced737c148 --- /dev/null +++ b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock @@ -0,0 +1,18 @@ +{ + "http://localhost:9990/asset.txt": { "integrity": "sha512-LHT9F+2v2A6ER7DUZ0HuJDt+t03SFJoKsbkkb7MDgvJ+hT2FhXGeDmfL2g2qj1FnEGRhXWRa4nrLFb+xRH9Fmw==", "contentType": "text/css" }, + "http://localhost:9990/asset.txt?query": { "integrity": "sha512-LHT9F+2v2A6ER7DUZ0HuJDt+t03SFJoKsbkkb7MDgvJ+hT2FhXGeDmfL2g2qj1FnEGRhXWRa4nrLFb+xRH9Fmw==", "contentType": "text/css" }, + "http://localhost:9990/fallback.js": { "integrity": "sha512-BCkBS4Wb0EreudEceuobqZZwTE7SeVUJ2vVHxDQKm8xW6dGJRcUrrSWcjd/61zijOeYAW0P+boOg7u0vxrGwYg==", "contentType": "text/javascript" }, + "http://localhost:9990/folder/dependency.js": { "integrity": "sha512-N0En4W3aNPY82MPu16+50P4PqLLyPLI6l33wR2a3ue8VCRjY8RJl8erRB8ztWSEYNad7yRDPrqlYT+IBtoOA9w==", "contentType": "text/javascript" }, + "http://localhost:9990/folder/sub-dependency.js": { "integrity": "sha512-Jjmwazwmg67EwNPViCBwvSIxhENfS6gwufXoQLrB0B/JDA4v1p+p2S5Y6IGP4SzZqqVTsROlU8meD6ep3q6MTA==", "contentType": "text/javascript" }, + "http://localhost:9990/folder/sub-dependency2.js": { "integrity": "sha512-BDZKEwlnwBabeHEwmMd02NxFEjYy+QwKAKP0S8zMMesX7dUsvh11hM7LUOPPFOS+nIEFZPtnc7kFwmnojVUw5A==", "contentType": "text/javascript" }, + "http://localhost:9990/index.css?cache": { "integrity": "sha512-sqhF9JAEi5h3ziP48SBnzQnaeei8cf/pfYJBdKL4F7xdu3v5yr71eQ0kCL11/jWRFjLG4TKOudUnS/u6WLMqYw==", "contentType": "text/css" }, + "http://localhost:9990/index.css?no-cache": "no-cache", + "http://localhost:9990/index.css?query#fragment": { "integrity": "sha512-sqhF9JAEi5h3ziP48SBnzQnaeei8cf/pfYJBdKL4F7xdu3v5yr71eQ0kCL11/jWRFjLG4TKOudUnS/u6WLMqYw==", "contentType": "text/css" }, + "http://localhost:9990/redirect": { "resolved": "http://localhost:9990/redirect.js", "integrity": "sha512-BV/MK/QTq+NHRve1XpZyQ8V6cjRP/fwbtJvENRdm5C73qNYZ4i2/fw+soj7J4qxzBXMHDbvOnA6E0ShnX2hc1w==", "contentType": "text/javascript" }, + "http://localhost:9990/redirect.js": { "integrity": "sha512-BV/MK/QTq+NHRve1XpZyQ8V6cjRP/fwbtJvENRdm5C73qNYZ4i2/fw+soj7J4qxzBXMHDbvOnA6E0ShnX2hc1w==", "contentType": "text/javascript" }, + "http://localhost:9990/resolve.js": { "integrity": "sha512-6J9zBO2hXSMTO1EtXJOxSRB2nVPHCoNmNHS8an1QeehzJFc3uoBPRWu6hqHPc54gv2/QME9RBR/BXIan68virg==", "contentType": "text/javascript" }, + "http://localhost:9990/url.js": { "integrity": "sha512-Dlw99Gtp/ZRxWvGlqD2EKnvbo1i6j/slwQO4WV8RIRhYZx9ErI+rndpyDMaKykSnq20HCp5H73TJ+dtO+wDyEg==", "contentType": "text/javascript" }, + "https://raw.githubusercontent.com//webpack//webpack//main/CODE_OF_CONDUCT.md": { "resolved": "https://raw.githubusercontent.com/webpack/webpack/main/CODE_OF_CONDUCT.md", "integrity": "sha512-OLJ9q6iSO652hVBkTLsMLtQnFBBTzEbFqLGyWD62nPga/0DZ9bc3oOFb5OYT8RIPzmlOX4WzK2uiLgc1NSGtBA==", "contentType": "text/plain; charset=utf-8" }, + "https://raw.githubusercontent.com/webpack/webpack/main/CODE_OF_CONDUCT.md": { "integrity": "sha512-OLJ9q6iSO652hVBkTLsMLtQnFBBTzEbFqLGyWD62nPga/0DZ9bc3oOFb5OYT8RIPzmlOX4WzK2uiLgc1NSGtBA==", "contentType": "text/plain; charset=utf-8" }, + "version": 1 +} diff --git a/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/asset_72216076a225ea0abbaa.txt b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/asset_72216076a225ea0abbaa.txt new file mode 100644 index 00000000000..5e1c309dae7 --- /dev/null +++ b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/asset_72216076a225ea0abbaa.txt @@ -0,0 +1 @@ +Hello World \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/asset_query_590ffbc5acc20bf1dc88.txt b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/asset_query_590ffbc5acc20bf1dc88.txt new file mode 100644 index 00000000000..5e1c309dae7 --- /dev/null +++ b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/asset_query_590ffbc5acc20bf1dc88.txt @@ -0,0 +1 @@ +Hello World \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/fallback_4972219bd28762fbfd18.js b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/fallback_4972219bd28762fbfd18.js new file mode 100644 index 00000000000..e5dfb6da968 --- /dev/null +++ b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/fallback_4972219bd28762fbfd18.js @@ -0,0 +1 @@ +export * from "fallback-package"; \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/folder_dependency_3263dc642c8ad1171873.js b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/folder_dependency_3263dc642c8ad1171873.js new file mode 100644 index 00000000000..e3e81f78e6b --- /dev/null +++ b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/folder_dependency_3263dc642c8ad1171873.js @@ -0,0 +1,2 @@ +export * from "./sub-dependency.js"; +export * from "/folder/sub-dependency2.js"; \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/folder_sub-dependency2_f750536150de4f4db445.js b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/folder_sub-dependency2_f750536150de4f4db445.js new file mode 100644 index 00000000000..72fdbad6cad --- /dev/null +++ b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/folder_sub-dependency2_f750536150de4f4db445.js @@ -0,0 +1 @@ +export const value2 = 42; \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/folder_sub-dependency_a662b3b186898f776088.js b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/folder_sub-dependency_a662b3b186898f776088.js new file mode 100644 index 00000000000..b7159db4840 --- /dev/null +++ b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/folder_sub-dependency_a662b3b186898f776088.js @@ -0,0 +1 @@ +export const value = 42; \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/index_cache_502725659b59ae63a82a.css b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/index_cache_502725659b59ae63a82a.css new file mode 100644 index 00000000000..b978c1b5980 --- /dev/null +++ b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/index_cache_502725659b59ae63a82a.css @@ -0,0 +1 @@ +a {} \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/index_query_169a64b251bcdc02a084.css b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/index_query_169a64b251bcdc02a084.css new file mode 100644 index 00000000000..b978c1b5980 --- /dev/null +++ b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/index_query_169a64b251bcdc02a084.css @@ -0,0 +1 @@ +a {} \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/redirect_d3dcf71bcf15dc29654c.js b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/redirect_d3dcf71bcf15dc29654c.js new file mode 100644 index 00000000000..d31cf81a327 --- /dev/null +++ b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/redirect_d3dcf71bcf15dc29654c.js @@ -0,0 +1 @@ +export default { ok: true }; \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/resolve_69c3f44e55195d0c14cf.js b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/resolve_69c3f44e55195d0c14cf.js new file mode 100644 index 00000000000..7a369ecb8ec --- /dev/null +++ b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/resolve_69c3f44e55195d0c14cf.js @@ -0,0 +1 @@ +export * from "./folder/dependency.js"; \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/url_cc93d527a81c32b07ab8.js b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/url_cc93d527a81c32b07ab8.js new file mode 100644 index 00000000000..1948b244cf1 --- /dev/null +++ b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/http_localhost_9990/url_cc93d527a81c32b07ab8.js @@ -0,0 +1 @@ +export default new URL("asset.txt?query", import.meta.url); \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/https_raw.githubusercontent.com/webpack_webpack_main_CODE_OF_CONDUCT_06e7b335922db99b918d.md b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/https_raw.githubusercontent.com/webpack_webpack_main_CODE_OF_CONDUCT_06e7b335922db99b918d.md new file mode 100644 index 00000000000..4faf227c455 --- /dev/null +++ b/test/configCases/asset-modules/http-url/frozen-verify.webpack.lock.data/https_raw.githubusercontent.com/webpack_webpack_main_CODE_OF_CONDUCT_06e7b335922db99b918d.md @@ -0,0 +1 @@ +[Code of Conduct](https://github.com/openjs-foundation/code-and-learn/blob/master/CODE_OF_CONDUCT.md) diff --git a/test/configCases/asset-modules/http-url/index.errors.js b/test/configCases/asset-modules/http-url/index.errors.js new file mode 100644 index 00000000000..ee4a379b4e2 --- /dev/null +++ b/test/configCases/asset-modules/http-url/index.errors.js @@ -0,0 +1,32 @@ +it("error when lockfile is outdated/invalid", () => { + expect(() => { + require("http://localhost:9990/index.css?cache"); + }).toThrowError(); + expect(() => { + require("http://localhost:9990/index.css?no-cache"); + }).toThrowError(); + expect(() => { + require("http://localhost:9990/index.css"); + }).toThrowError(); + expect(() => { + require("http://localhost:9990/resolve.js"); + }).toThrowError(); + expect(() => { + require("http://localhost:9990/fallback.js"); + }).toThrowError(); + expect(() => { + require("http://localhost:9990/redirect"); + }).toThrowError(); +}); + +import text from "http://localhost:9990/asset.txt?ignore"; + +it("should allow to ignore lockfile entries", () => { + expect(text.trim()).toBe("Hello World"); +}); + +import cssContent from "http://localhost:9990/index.css?query#fragment"; + +it("should use the entry with query and fragment", () => { + expect(cssContent).toBe("a {}.webpack{}"); +}); diff --git a/test/configCases/asset-modules/http-url/index.js b/test/configCases/asset-modules/http-url/index.js new file mode 100644 index 00000000000..eab2d79add0 --- /dev/null +++ b/test/configCases/asset-modules/http-url/index.js @@ -0,0 +1,31 @@ +import cssContent from "http://localhost:9990/index.css?query#fragment"; +import noCacheCssContent from "http://localhost:9990/index.css?no-cache"; +import cachedCssContent from "http://localhost:9990/index.css?cache"; +import { value, value2 } from "http://localhost:9990/resolve.js"; +import { fallback } from "http://localhost:9990/fallback.js"; +import redirect1 from "http://localhost:9990/redirect"; +import redirect2 from "http://localhost:9990/redirect.js"; +import text from "http://localhost:9990/asset.txt"; +import textUrl from "http://localhost:9990/url.js"; +import codeOfConduct1 from "https://raw.githubusercontent.com//webpack//webpack//main/CODE_OF_CONDUCT.md"; +import codeOfConduct2 from "https://raw.githubusercontent.com/webpack/webpack/main/CODE_OF_CONDUCT.md"; + +it("http url request should be supported", () => { + expect(cssContent).toBe("a {}.webpack{}"); + expect(noCacheCssContent).toBe("a {}.webpack{}"); + expect(cachedCssContent).toBe("a {}.webpack{}"); + expect(value).toBe(42); + expect(value2).toBe(42); + expect(fallback).toBe(42); + expect(redirect1).toEqual({ ok: true }); + expect(redirect2).toEqual({ ok: true }); + expect(redirect2).not.toBe(redirect1); + expect(text.trim()).toBe("Hello World"); + expect(textUrl instanceof URL).toBeTruthy(); + expect(textUrl.href).toMatch(/^file:\/\/.+\.txt\?query$/); +}); + +it("https url request should be supported", () => { + expect(codeOfConduct1.includes("CODE_OF_CONDUCT")).toBeTruthy(); + expect(codeOfConduct2.includes("CODE_OF_CONDUCT")).toBeTruthy(); +}); diff --git a/test/configCases/asset-modules/http-url/loaders/css-loader.js b/test/configCases/asset-modules/http-url/loaders/css-loader.js new file mode 100644 index 00000000000..e3661f9771a --- /dev/null +++ b/test/configCases/asset-modules/http-url/loaders/css-loader.js @@ -0,0 +1,2 @@ +/** @type {import("../../../../../").LoaderDefinition} */ +module.exports = content => `export default ${JSON.stringify(content + ".webpack{}")}`; diff --git a/test/configCases/asset-modules/http-url/loaders/md-loader.js b/test/configCases/asset-modules/http-url/loaders/md-loader.js new file mode 100644 index 00000000000..77795972a3e --- /dev/null +++ b/test/configCases/asset-modules/http-url/loaders/md-loader.js @@ -0,0 +1,2 @@ +/** @type {import("../../../../../").LoaderDefinition} */ +module.exports = content => `export default ${JSON.stringify(content)}`; diff --git a/test/configCases/asset-modules/http-url/no-cache.webpack.lock b/test/configCases/asset-modules/http-url/no-cache.webpack.lock new file mode 100644 index 00000000000..3ced737c148 --- /dev/null +++ b/test/configCases/asset-modules/http-url/no-cache.webpack.lock @@ -0,0 +1,18 @@ +{ + "http://localhost:9990/asset.txt": { "integrity": "sha512-LHT9F+2v2A6ER7DUZ0HuJDt+t03SFJoKsbkkb7MDgvJ+hT2FhXGeDmfL2g2qj1FnEGRhXWRa4nrLFb+xRH9Fmw==", "contentType": "text/css" }, + "http://localhost:9990/asset.txt?query": { "integrity": "sha512-LHT9F+2v2A6ER7DUZ0HuJDt+t03SFJoKsbkkb7MDgvJ+hT2FhXGeDmfL2g2qj1FnEGRhXWRa4nrLFb+xRH9Fmw==", "contentType": "text/css" }, + "http://localhost:9990/fallback.js": { "integrity": "sha512-BCkBS4Wb0EreudEceuobqZZwTE7SeVUJ2vVHxDQKm8xW6dGJRcUrrSWcjd/61zijOeYAW0P+boOg7u0vxrGwYg==", "contentType": "text/javascript" }, + "http://localhost:9990/folder/dependency.js": { "integrity": "sha512-N0En4W3aNPY82MPu16+50P4PqLLyPLI6l33wR2a3ue8VCRjY8RJl8erRB8ztWSEYNad7yRDPrqlYT+IBtoOA9w==", "contentType": "text/javascript" }, + "http://localhost:9990/folder/sub-dependency.js": { "integrity": "sha512-Jjmwazwmg67EwNPViCBwvSIxhENfS6gwufXoQLrB0B/JDA4v1p+p2S5Y6IGP4SzZqqVTsROlU8meD6ep3q6MTA==", "contentType": "text/javascript" }, + "http://localhost:9990/folder/sub-dependency2.js": { "integrity": "sha512-BDZKEwlnwBabeHEwmMd02NxFEjYy+QwKAKP0S8zMMesX7dUsvh11hM7LUOPPFOS+nIEFZPtnc7kFwmnojVUw5A==", "contentType": "text/javascript" }, + "http://localhost:9990/index.css?cache": { "integrity": "sha512-sqhF9JAEi5h3ziP48SBnzQnaeei8cf/pfYJBdKL4F7xdu3v5yr71eQ0kCL11/jWRFjLG4TKOudUnS/u6WLMqYw==", "contentType": "text/css" }, + "http://localhost:9990/index.css?no-cache": "no-cache", + "http://localhost:9990/index.css?query#fragment": { "integrity": "sha512-sqhF9JAEi5h3ziP48SBnzQnaeei8cf/pfYJBdKL4F7xdu3v5yr71eQ0kCL11/jWRFjLG4TKOudUnS/u6WLMqYw==", "contentType": "text/css" }, + "http://localhost:9990/redirect": { "resolved": "http://localhost:9990/redirect.js", "integrity": "sha512-BV/MK/QTq+NHRve1XpZyQ8V6cjRP/fwbtJvENRdm5C73qNYZ4i2/fw+soj7J4qxzBXMHDbvOnA6E0ShnX2hc1w==", "contentType": "text/javascript" }, + "http://localhost:9990/redirect.js": { "integrity": "sha512-BV/MK/QTq+NHRve1XpZyQ8V6cjRP/fwbtJvENRdm5C73qNYZ4i2/fw+soj7J4qxzBXMHDbvOnA6E0ShnX2hc1w==", "contentType": "text/javascript" }, + "http://localhost:9990/resolve.js": { "integrity": "sha512-6J9zBO2hXSMTO1EtXJOxSRB2nVPHCoNmNHS8an1QeehzJFc3uoBPRWu6hqHPc54gv2/QME9RBR/BXIan68virg==", "contentType": "text/javascript" }, + "http://localhost:9990/url.js": { "integrity": "sha512-Dlw99Gtp/ZRxWvGlqD2EKnvbo1i6j/slwQO4WV8RIRhYZx9ErI+rndpyDMaKykSnq20HCp5H73TJ+dtO+wDyEg==", "contentType": "text/javascript" }, + "https://raw.githubusercontent.com//webpack//webpack//main/CODE_OF_CONDUCT.md": { "resolved": "https://raw.githubusercontent.com/webpack/webpack/main/CODE_OF_CONDUCT.md", "integrity": "sha512-OLJ9q6iSO652hVBkTLsMLtQnFBBTzEbFqLGyWD62nPga/0DZ9bc3oOFb5OYT8RIPzmlOX4WzK2uiLgc1NSGtBA==", "contentType": "text/plain; charset=utf-8" }, + "https://raw.githubusercontent.com/webpack/webpack/main/CODE_OF_CONDUCT.md": { "integrity": "sha512-OLJ9q6iSO652hVBkTLsMLtQnFBBTzEbFqLGyWD62nPga/0DZ9bc3oOFb5OYT8RIPzmlOX4WzK2uiLgc1NSGtBA==", "contentType": "text/plain; charset=utf-8" }, + "version": 1 +} diff --git a/test/configCases/asset-modules/http-url/node_modules/fallback-package.js b/test/configCases/asset-modules/http-url/node_modules/fallback-package.js new file mode 100644 index 00000000000..fb9f84be363 --- /dev/null +++ b/test/configCases/asset-modules/http-url/node_modules/fallback-package.js @@ -0,0 +1 @@ +export const fallback = 42; diff --git a/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock new file mode 100644 index 00000000000..3ced737c148 --- /dev/null +++ b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock @@ -0,0 +1,18 @@ +{ + "http://localhost:9990/asset.txt": { "integrity": "sha512-LHT9F+2v2A6ER7DUZ0HuJDt+t03SFJoKsbkkb7MDgvJ+hT2FhXGeDmfL2g2qj1FnEGRhXWRa4nrLFb+xRH9Fmw==", "contentType": "text/css" }, + "http://localhost:9990/asset.txt?query": { "integrity": "sha512-LHT9F+2v2A6ER7DUZ0HuJDt+t03SFJoKsbkkb7MDgvJ+hT2FhXGeDmfL2g2qj1FnEGRhXWRa4nrLFb+xRH9Fmw==", "contentType": "text/css" }, + "http://localhost:9990/fallback.js": { "integrity": "sha512-BCkBS4Wb0EreudEceuobqZZwTE7SeVUJ2vVHxDQKm8xW6dGJRcUrrSWcjd/61zijOeYAW0P+boOg7u0vxrGwYg==", "contentType": "text/javascript" }, + "http://localhost:9990/folder/dependency.js": { "integrity": "sha512-N0En4W3aNPY82MPu16+50P4PqLLyPLI6l33wR2a3ue8VCRjY8RJl8erRB8ztWSEYNad7yRDPrqlYT+IBtoOA9w==", "contentType": "text/javascript" }, + "http://localhost:9990/folder/sub-dependency.js": { "integrity": "sha512-Jjmwazwmg67EwNPViCBwvSIxhENfS6gwufXoQLrB0B/JDA4v1p+p2S5Y6IGP4SzZqqVTsROlU8meD6ep3q6MTA==", "contentType": "text/javascript" }, + "http://localhost:9990/folder/sub-dependency2.js": { "integrity": "sha512-BDZKEwlnwBabeHEwmMd02NxFEjYy+QwKAKP0S8zMMesX7dUsvh11hM7LUOPPFOS+nIEFZPtnc7kFwmnojVUw5A==", "contentType": "text/javascript" }, + "http://localhost:9990/index.css?cache": { "integrity": "sha512-sqhF9JAEi5h3ziP48SBnzQnaeei8cf/pfYJBdKL4F7xdu3v5yr71eQ0kCL11/jWRFjLG4TKOudUnS/u6WLMqYw==", "contentType": "text/css" }, + "http://localhost:9990/index.css?no-cache": "no-cache", + "http://localhost:9990/index.css?query#fragment": { "integrity": "sha512-sqhF9JAEi5h3ziP48SBnzQnaeei8cf/pfYJBdKL4F7xdu3v5yr71eQ0kCL11/jWRFjLG4TKOudUnS/u6WLMqYw==", "contentType": "text/css" }, + "http://localhost:9990/redirect": { "resolved": "http://localhost:9990/redirect.js", "integrity": "sha512-BV/MK/QTq+NHRve1XpZyQ8V6cjRP/fwbtJvENRdm5C73qNYZ4i2/fw+soj7J4qxzBXMHDbvOnA6E0ShnX2hc1w==", "contentType": "text/javascript" }, + "http://localhost:9990/redirect.js": { "integrity": "sha512-BV/MK/QTq+NHRve1XpZyQ8V6cjRP/fwbtJvENRdm5C73qNYZ4i2/fw+soj7J4qxzBXMHDbvOnA6E0ShnX2hc1w==", "contentType": "text/javascript" }, + "http://localhost:9990/resolve.js": { "integrity": "sha512-6J9zBO2hXSMTO1EtXJOxSRB2nVPHCoNmNHS8an1QeehzJFc3uoBPRWu6hqHPc54gv2/QME9RBR/BXIan68virg==", "contentType": "text/javascript" }, + "http://localhost:9990/url.js": { "integrity": "sha512-Dlw99Gtp/ZRxWvGlqD2EKnvbo1i6j/slwQO4WV8RIRhYZx9ErI+rndpyDMaKykSnq20HCp5H73TJ+dtO+wDyEg==", "contentType": "text/javascript" }, + "https://raw.githubusercontent.com//webpack//webpack//main/CODE_OF_CONDUCT.md": { "resolved": "https://raw.githubusercontent.com/webpack/webpack/main/CODE_OF_CONDUCT.md", "integrity": "sha512-OLJ9q6iSO652hVBkTLsMLtQnFBBTzEbFqLGyWD62nPga/0DZ9bc3oOFb5OYT8RIPzmlOX4WzK2uiLgc1NSGtBA==", "contentType": "text/plain; charset=utf-8" }, + "https://raw.githubusercontent.com/webpack/webpack/main/CODE_OF_CONDUCT.md": { "integrity": "sha512-OLJ9q6iSO652hVBkTLsMLtQnFBBTzEbFqLGyWD62nPga/0DZ9bc3oOFb5OYT8RIPzmlOX4WzK2uiLgc1NSGtBA==", "contentType": "text/plain; charset=utf-8" }, + "version": 1 +} diff --git a/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/asset_72216076a225ea0abbaa.txt b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/asset_72216076a225ea0abbaa.txt new file mode 100644 index 00000000000..5e1c309dae7 --- /dev/null +++ b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/asset_72216076a225ea0abbaa.txt @@ -0,0 +1 @@ +Hello World \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/asset_query_590ffbc5acc20bf1dc88.txt b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/asset_query_590ffbc5acc20bf1dc88.txt new file mode 100644 index 00000000000..5e1c309dae7 --- /dev/null +++ b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/asset_query_590ffbc5acc20bf1dc88.txt @@ -0,0 +1 @@ +Hello World \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/fallback_4972219bd28762fbfd18.js b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/fallback_4972219bd28762fbfd18.js new file mode 100644 index 00000000000..e5dfb6da968 --- /dev/null +++ b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/fallback_4972219bd28762fbfd18.js @@ -0,0 +1 @@ +export * from "fallback-package"; \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/folder_dependency_3263dc642c8ad1171873.js b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/folder_dependency_3263dc642c8ad1171873.js new file mode 100644 index 00000000000..e3e81f78e6b --- /dev/null +++ b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/folder_dependency_3263dc642c8ad1171873.js @@ -0,0 +1,2 @@ +export * from "./sub-dependency.js"; +export * from "/folder/sub-dependency2.js"; \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/folder_sub-dependency2_f750536150de4f4db445.js b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/folder_sub-dependency2_f750536150de4f4db445.js new file mode 100644 index 00000000000..72fdbad6cad --- /dev/null +++ b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/folder_sub-dependency2_f750536150de4f4db445.js @@ -0,0 +1 @@ +export const value2 = 42; \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/folder_sub-dependency_a662b3b186898f776088.js b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/folder_sub-dependency_a662b3b186898f776088.js new file mode 100644 index 00000000000..b7159db4840 --- /dev/null +++ b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/folder_sub-dependency_a662b3b186898f776088.js @@ -0,0 +1 @@ +export const value = 42; \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/index_cache_502725659b59ae63a82a.css b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/index_cache_502725659b59ae63a82a.css new file mode 100644 index 00000000000..b978c1b5980 --- /dev/null +++ b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/index_cache_502725659b59ae63a82a.css @@ -0,0 +1 @@ +a {} \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/index_query_169a64b251bcdc02a084.css b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/index_query_169a64b251bcdc02a084.css new file mode 100644 index 00000000000..b978c1b5980 --- /dev/null +++ b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/index_query_169a64b251bcdc02a084.css @@ -0,0 +1 @@ +a {} \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/redirect_d3dcf71bcf15dc29654c.js b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/redirect_d3dcf71bcf15dc29654c.js new file mode 100644 index 00000000000..d31cf81a327 --- /dev/null +++ b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/redirect_d3dcf71bcf15dc29654c.js @@ -0,0 +1 @@ +export default { ok: true }; \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/resolve_69c3f44e55195d0c14cf.js b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/resolve_69c3f44e55195d0c14cf.js new file mode 100644 index 00000000000..7a369ecb8ec --- /dev/null +++ b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/resolve_69c3f44e55195d0c14cf.js @@ -0,0 +1 @@ +export * from "./folder/dependency.js"; \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/url_cc93d527a81c32b07ab8.js b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/url_cc93d527a81c32b07ab8.js new file mode 100644 index 00000000000..1948b244cf1 --- /dev/null +++ b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/http_localhost_9990/url_cc93d527a81c32b07ab8.js @@ -0,0 +1 @@ +export default new URL("asset.txt?query", import.meta.url); \ No newline at end of file diff --git a/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/https_raw.githubusercontent.com/webpack_webpack_main_CODE_OF_CONDUCT_06e7b335922db99b918d.md b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/https_raw.githubusercontent.com/webpack_webpack_main_CODE_OF_CONDUCT_06e7b335922db99b918d.md new file mode 100644 index 00000000000..4faf227c455 --- /dev/null +++ b/test/configCases/asset-modules/http-url/prod-defaults.webpack.lock.data/https_raw.githubusercontent.com/webpack_webpack_main_CODE_OF_CONDUCT_06e7b335922db99b918d.md @@ -0,0 +1 @@ +[Code of Conduct](https://github.com/openjs-foundation/code-and-learn/blob/master/CODE_OF_CONDUCT.md) diff --git a/test/configCases/asset-modules/http-url/server/asset.txt b/test/configCases/asset-modules/http-url/server/asset.txt new file mode 100644 index 00000000000..557db03de99 --- /dev/null +++ b/test/configCases/asset-modules/http-url/server/asset.txt @@ -0,0 +1 @@ +Hello World diff --git a/test/configCases/asset-modules/http-url/server/fallback.js b/test/configCases/asset-modules/http-url/server/fallback.js new file mode 100644 index 00000000000..4dda52bd88e --- /dev/null +++ b/test/configCases/asset-modules/http-url/server/fallback.js @@ -0,0 +1 @@ +export * from "fallback-package"; diff --git a/test/configCases/asset-modules/http-url/server/folder/dependency.js b/test/configCases/asset-modules/http-url/server/folder/dependency.js new file mode 100644 index 00000000000..aaefe3bf362 --- /dev/null +++ b/test/configCases/asset-modules/http-url/server/folder/dependency.js @@ -0,0 +1,2 @@ +export * from "./sub-dependency.js"; +export * from "/folder/sub-dependency2.js"; diff --git a/test/configCases/asset-modules/http-url/server/folder/sub-dependency.js b/test/configCases/asset-modules/http-url/server/folder/sub-dependency.js new file mode 100644 index 00000000000..46d3ca8c61f --- /dev/null +++ b/test/configCases/asset-modules/http-url/server/folder/sub-dependency.js @@ -0,0 +1 @@ +export const value = 42; diff --git a/test/configCases/asset-modules/http-url/server/folder/sub-dependency2.js b/test/configCases/asset-modules/http-url/server/folder/sub-dependency2.js new file mode 100644 index 00000000000..0eb474a6b3f --- /dev/null +++ b/test/configCases/asset-modules/http-url/server/folder/sub-dependency2.js @@ -0,0 +1 @@ +export const value2 = 42; diff --git a/test/configCases/asset-modules/http-url/server/index.css b/test/configCases/asset-modules/http-url/server/index.css new file mode 100644 index 00000000000..077f6dd7c01 --- /dev/null +++ b/test/configCases/asset-modules/http-url/server/index.css @@ -0,0 +1 @@ +a {} diff --git a/test/configCases/asset-modules/http-url/server/index.js b/test/configCases/asset-modules/http-url/server/index.js new file mode 100644 index 00000000000..55a99aff2b6 --- /dev/null +++ b/test/configCases/asset-modules/http-url/server/index.js @@ -0,0 +1,96 @@ +const http = require("http"); +const fs = require("fs"); +const path = require("path"); + +/** @typedef {import("../../../../../").Compiler} Compiler */ + +/** + * @returns {import("http").Server} server instance + */ +function createServer() { + const server = http.createServer((req, res) => { + let file; + const pathname = "." + /** @type {string} */ (req.url).replace(/\?.*$/, ""); + if (/** @type {string} */ (req.url).endsWith("?no-cache")) { + res.setHeader("Cache-Control", "no-cache, max-age=60"); + } else { + res.setHeader("Cache-Control", "public, immutable, max-age=600"); + } + try { + file = fs + .readFileSync(path.resolve(__dirname, pathname)) + .toString() + .replace(/\r\n?/g, "\n") + .trim(); + } catch (e) { + if (fs.existsSync(path.resolve(__dirname, pathname + ".js"))) { + res.statusCode = 301; + res.setHeader("Location", pathname.slice(1) + ".js"); + res.end(); + return; + } + res.statusCode = 404; + res.end(); + return; + } + res.setHeader( + "Content-Type", + pathname.endsWith(".js") ? "text/javascript" : "text/css" + ); + res.end(file); + }); + server.unref(); + return server; +} + +class ServerPlugin { + /** + * @param {number} port + */ + constructor(port) { + this.port = port; + this.refs = 0; + this.server = undefined; + } + + /** + * @param {Compiler} compiler compiler + */ + apply(compiler) { + compiler.hooks.beforeRun.tapPromise( + "ServerPlugin", + async () => { + this.refs++; + if (!this.server) { + this.server = createServer(); + await new Promise( + /** + * @param {(value: void) => void} resolve resolve + * @param {(reason?: Error) => void} _reject reject + */ + (resolve, _reject) => { + /** @type {import("http").Server} */ + (this.server).listen( + this.port, + () => { + resolve(); + } + ); + }); + } + } + ); + + compiler.hooks.done.tapAsync("ServerPlugin", (stats, callback) => { + const s = this.server; + if (s && --this.refs === 0) { + this.server = undefined; + s.close(callback); + } else { + callback(); + } + }); + } +} + +module.exports = ServerPlugin; diff --git a/test/configCases/asset-modules/http-url/server/redirect.js b/test/configCases/asset-modules/http-url/server/redirect.js new file mode 100644 index 00000000000..47362862dc8 --- /dev/null +++ b/test/configCases/asset-modules/http-url/server/redirect.js @@ -0,0 +1 @@ +export default { ok: true }; diff --git a/test/configCases/asset-modules/http-url/server/resolve.js b/test/configCases/asset-modules/http-url/server/resolve.js new file mode 100644 index 00000000000..b181699cfe6 --- /dev/null +++ b/test/configCases/asset-modules/http-url/server/resolve.js @@ -0,0 +1 @@ +export * from "./folder/dependency.js"; diff --git a/test/configCases/asset-modules/http-url/server/url.js b/test/configCases/asset-modules/http-url/server/url.js new file mode 100644 index 00000000000..c2eaf0c491d --- /dev/null +++ b/test/configCases/asset-modules/http-url/server/url.js @@ -0,0 +1 @@ +export default new URL("asset.txt?query", import.meta.url); diff --git a/test/configCases/asset-modules/http-url/test.config.js b/test/configCases/asset-modules/http-url/test.config.js new file mode 100644 index 00000000000..718aa51dc5e --- /dev/null +++ b/test/configCases/asset-modules/http-url/test.config.js @@ -0,0 +1,19 @@ +const fs = require("fs"); +const path = require("path"); + +module.exports = { + beforeExecute() { + try { + fs.unlinkSync(path.join(__dirname, "dev-defaults.webpack.lock")); + } catch (_err) { + // Empty + } + }, + afterExecute() { + try { + fs.unlinkSync(path.join(__dirname, "dev-defaults.webpack.lock")); + } catch (_err) { + // Empty + } + } +}; diff --git a/test/configCases/asset-modules/http-url/webpack.config.js b/test/configCases/asset-modules/http-url/webpack.config.js new file mode 100644 index 00000000000..426378bb04a --- /dev/null +++ b/test/configCases/asset-modules/http-url/webpack.config.js @@ -0,0 +1,99 @@ +const { + experiments: { + schemes: { HttpUriPlugin } + } +} = require("../../../../"); +const ServerPlugin = require("./server"); + +const serverPlugin = new ServerPlugin(9990); +/** @type {import("../../../../").Configuration} */ +const base = { + mode: "development", + module: { + rules: [ + { + test: /\.css$/, + loader: "./loaders/css-loader" + }, + { + test: /\.md$/, + loader: "./loaders/md-loader" + }, + { + test: /\.txt$/, + dependency: { not: "url" }, + type: "asset/source" + } + ] + } +}; + +const frozen = true; +const allowedUris = [ + "http://localhost:9990/", + "https://raw.githubusercontent.com/" +]; + +module.exports = [ + { + name: "frozen-verify", + ...base, + plugins: [ + serverPlugin, + new HttpUriPlugin({ + allowedUris, + upgrade: true, + frozen + }) + ] + }, + { + name: "dev-defaults", + ...base, + plugins: [ + serverPlugin, + new HttpUriPlugin({ + allowedUris, + upgrade: false, + frozen: false + }) + ] + }, + { + name: "prod-defaults", + ...base, + plugins: [ + serverPlugin, + new HttpUriPlugin({ + allowedUris, + upgrade: false, + frozen + }) + ] + }, + { + name: "no-cache", + ...base, + plugins: [ + serverPlugin, + new HttpUriPlugin({ + allowedUris, + cacheLocation: false, + frozen + }) + ] + }, + { + name: "errors", + ...base, + entry: "./index.errors.js", + plugins: [ + serverPlugin, + new HttpUriPlugin({ + allowedUris, + upgrade: true, + frozen: true + }) + ] + } +]; diff --git a/test/configCases/asset-modules/ignore/index.js b/test/configCases/asset-modules/ignore/index.js new file mode 100644 index 00000000000..a3fe671f079 --- /dev/null +++ b/test/configCases/asset-modules/ignore/index.js @@ -0,0 +1,5 @@ +const url = new URL("image.png", import.meta.url); + +it("should output asset with path", () => { + expect(url + "").toBe("data:,"); +}); diff --git a/test/configCases/asset-modules/ignore/webpack.config.js b/test/configCases/asset-modules/ignore/webpack.config.js new file mode 100644 index 00000000000..760607d95cb --- /dev/null +++ b/test/configCases/asset-modules/ignore/webpack.config.js @@ -0,0 +1,9 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + resolve: { + alias: { + "image.png": false + } + } +}; diff --git a/test/configCases/asset-modules/input-data-url-encoding/index.js b/test/configCases/asset-modules/input-data-url-encoding/index.js new file mode 100644 index 00000000000..561c29d9516 --- /dev/null +++ b/test/configCases/asset-modules/input-data-url-encoding/index.js @@ -0,0 +1,33 @@ +it("should keep original encoding", () => { + const url = new URL( + "data:image/svg+xml;p=1;q=2,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke=\"%23343a40\" stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e", + import.meta.url + ); + expect(url.href).toBe( + "data:image/svg+xml;p=1;q=2,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke=\"%23343a40\" stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e" + ); +}); + +it("should work with 'image/svg+xml'", () => { + const one = new URL( + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxNiAxNic+PHBhdGggZmlsbD0nbm9uZScgc3Ryb2tlPScjMzQzYTQwJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnIHN0cm9rZS13aWR0aD0nMicgZD0nTTIgNWw2IDYgNi02Jy8+PC9zdmc+", + import.meta.url + ); + expect(one.href).toBe( + "data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2016%2016%27%3E%3Cpath%20fill%3D%27none%27%20stroke%3D%27%23343a40%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%20stroke-width%3D%272%27%20d%3D%27M2%205l6%206%206-6%27%2F%3E%3C%2Fsvg%3E" + ); + const two = new URL( + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNiAxNiI+PHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMzQzYTQwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS13aWR0aD0iMiIgZD0iTTIgNWw2IDYgNi02Ii8+PC9zdmc+", + import.meta.url + ); + expect(two.href).toBe( + "data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2016%2016%22%3E%3Cpath%20fill%3D%22none%22%20stroke%3D%22%23343a40%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%20stroke-width%3D%222%22%20d%3D%22M2%205l6%206%206-6%22%2F%3E%3C%2Fsvg%3E" + ); + const three = new URL( + "data:IMAGE/SVG+XML;param=123;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxNyAxNyc+PHBhdGggZmlsbD0nbm9uZScgc3Ryb2tlPScjMzQzYTQwJyBzdHJva2UtbGluZWNhcD0ncm91bmQnIHN0cm9rZS1saW5lam9pbj0ncm91bmQnIHN0cm9rZS13aWR0aD0nMicgZD0nTTIgNWw2IDYgNi02Jy8+PC9zdmc+", + import.meta.url + ); + expect(three.href).toBe( + "data:IMAGE/SVG+XML;param=123,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2017%2017%27%3E%3Cpath%20fill%3D%27none%27%20stroke%3D%27%23343a40%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%20stroke-width%3D%272%27%20d%3D%27M2%205l6%206%206-6%27%2F%3E%3C%2Fsvg%3E" + ); +}); diff --git a/test/configCases/asset-modules/input-data-url-encoding/webpack.config.js b/test/configCases/asset-modules/input-data-url-encoding/webpack.config.js new file mode 100644 index 00000000000..dd1ef6a41d9 --- /dev/null +++ b/test/configCases/asset-modules/input-data-url-encoding/webpack.config.js @@ -0,0 +1,19 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + devtool: false, + module: { + rules: [ + { + dependency: "url", + type: "asset", + generator: { + dataUrl: { + encoding: false + } + } + } + ] + }, + target: "web" +}; diff --git a/test/configCases/asset-modules/input-data-url/index.js b/test/configCases/asset-modules/input-data-url/index.js new file mode 100644 index 00000000000..1ad4a669cc4 --- /dev/null +++ b/test/configCases/asset-modules/input-data-url/index.js @@ -0,0 +1,30 @@ +it("should allow empty urls", () => { + const url = new URL("data:,", import.meta.url); + expect(url.href).toBe("data:,"); + expect(url.protocol).toBe("data:"); + expect(url.pathname).toBe(","); +}); + +it("should allow empty urls with mimetype", () => { + const url = new URL("data:test,", import.meta.url); + expect(url.href).toBe("data:test,"); + expect(url.protocol).toBe("data:"); + expect(url.pathname).toBe("test,"); +}); + +it("should allow data urls with mimetype", () => { + const url = new URL( + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MDAgNjAwIj48dGl0bGU+aWNvbi1zcXVhcmUtc21hbGw8L3RpdGxlPjxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0zMDAgLjFMNTY1IDE1MHYyOTkuOUwzMDAgNTk5LjggMzUgNDQ5LjlWMTUweiIvPjxwYXRoIGZpbGw9IiM4RUQ2RkIiIGQ9Ik01MTcuNyA0MzkuNUwzMDguOCA1NTcuOHYtOTJMNDM5IDM5NC4xbDc4LjcgNDUuNHptMTQuMy0xMi45VjE3OS40bC03Ni40IDQ0LjF2MTU5bDc2LjQgNDQuMXpNODEuNSA0MzkuNWwyMDguOSAxMTguMnYtOTJsLTEzMC4yLTcxLjYtNzguNyA0NS40em0tMTQuMy0xMi45VjE3OS40bDc2LjQgNDQuMXYxNTlsLTc2LjQgNDQuMXptOC45LTI2My4yTDI5MC40IDQyLjJ2ODlsLTEzNy4zIDc1LjUtMS4xLjYtNzUuOS00My45em00NDYuOSAwTDMwOC44IDQyLjJ2ODlMNDQ2IDIwNi44bDEuMS42IDc1LjktNDR6Ii8+PHBhdGggZmlsbD0iIzFDNzhDMCIgZD0iTTI5MC40IDQ0NC44TDE2MiAzNzQuMVYyMzQuMmwxMjguNCA3NC4xdjEzNi41em0xOC40IDBsMTI4LjQtNzAuNnYtMTQwbC0xMjguNCA3NC4xdjEzNi41ek0yOTkuNiAzMDN6bS0xMjktODVsMTI5LTcwLjlMNDI4LjUgMjE4bC0xMjguOSA3NC40LTEyOS03NC40eiIvPjwvc3ZnPgo=", + import.meta.url + ); + expect(url.protocol).toBe("data:"); + expect(url.href).toMatch(/^data:image\/svg\+xml;base64,/); +}); + +it("should allow data urls with mimetype mapped to rules", () => { + const url = new URL( + "data:image/svg+xml+external;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MDAgNjAwIj48dGl0bGU+aWNvbi1zcXVhcmUtc21hbGw8L3RpdGxlPjxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0zMDAgLjFMNTY1IDE1MHYyOTkuOUwzMDAgNTk5LjggMzUgNDQ5LjlWMTUweiIvPjxwYXRoIGZpbGw9IiM4RUQ2RkIiIGQ9Ik01MTcuNyA0MzkuNUwzMDguOCA1NTcuOHYtOTJMNDM5IDM5NC4xbDc4LjcgNDUuNHptMTQuMy0xMi45VjE3OS40bC03Ni40IDQ0LjF2MTU5bDc2LjQgNDQuMXpNODEuNSA0MzkuNWwyMDguOSAxMTguMnYtOTJsLTEzMC4yLTcxLjYtNzguNyA0NS40em0tMTQuMy0xMi45VjE3OS40bDc2LjQgNDQuMXYxNTlsLTc2LjQgNDQuMXptOC45LTI2My4yTDI5MC40IDQyLjJ2ODlsLTEzNy4zIDc1LjUtMS4xLjYtNzUuOS00My45em00NDYuOSAwTDMwOC44IDQyLjJ2ODlMNDQ2IDIwNi44bDEuMS42IDc1LjktNDR6Ii8+PHBhdGggZmlsbD0iIzFDNzhDMCIgZD0iTTI5MC40IDQ0NC44TDE2MiAzNzQuMVYyMzQuMmwxMjguNCA3NC4xdjEzNi41em0xOC40IDBsMTI4LjQtNzAuNnYtMTQwbC0xMjguNCA3NC4xdjEzNi41ek0yOTkuNiAzMDN6bS0xMjktODVsMTI5LTcwLjlMNDI4LjUgMjE4bC0xMjguOSA3NC40LTEyOS03NC40eiIvPjwvc3ZnPgo=", + import.meta.url + ); + expect(url.href).toMatch(/^https:\/\/test\.cases\/path\/[a-f0-9]+\.svg$/); +}); diff --git a/test/configCases/asset-modules/input-data-url/webpack.config.js b/test/configCases/asset-modules/input-data-url/webpack.config.js new file mode 100644 index 00000000000..fa4618f8037 --- /dev/null +++ b/test/configCases/asset-modules/input-data-url/webpack.config.js @@ -0,0 +1,16 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + module: { + rules: [ + { + mimetype: "image/svg+xml+external", + type: "asset/resource", + generator: { + filename: "[hash].svg" + } + } + ] + }, + target: "web" +}; diff --git a/test/configCases/asset-modules/keep-source-maps/asset.scss b/test/configCases/asset-modules/keep-source-maps/asset.scss new file mode 100644 index 00000000000..74e5c3fa9a9 --- /dev/null +++ b/test/configCases/asset-modules/keep-source-maps/asset.scss @@ -0,0 +1 @@ +body { background-color: red; } diff --git a/test/configCases/asset-modules/keep-source-maps/data/asset.css b/test/configCases/asset-modules/keep-source-maps/data/asset.css new file mode 100644 index 00000000000..26d7f9d5a51 --- /dev/null +++ b/test/configCases/asset-modules/keep-source-maps/data/asset.css @@ -0,0 +1 @@ +body{background-color:red} diff --git a/test/configCases/asset-modules/keep-source-maps/data/asset.css.map b/test/configCases/asset-modules/keep-source-maps/data/asset.css.map new file mode 100644 index 00000000000..7555b6230b6 --- /dev/null +++ b/test/configCases/asset-modules/keep-source-maps/data/asset.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["asset.scss", "data:;charset=utf-8,@import%20%22base%22;%0A%0Aa%20%7B%0A%20%20color:%20red;%0A%7D%0A", "http://example.com/index.js.map", "https://example.com/index.js.map"],"names":[],"mappings":"AAAA","file":"asset.css"} diff --git a/test/configCases/asset-modules/keep-source-maps/index.js b/test/configCases/asset-modules/keep-source-maps/index.js new file mode 100644 index 00000000000..9d16831156b --- /dev/null +++ b/test/configCases/asset-modules/keep-source-maps/index.js @@ -0,0 +1,17 @@ +it("should write asset file to output directory", function() { + const fs = require("fs"); + const path = require("path"); + const source = fs.readFileSync(path.join(__dirname, "asset.css"), "utf-8"); + expect(source).toMatch("/*# sourceMappingURL=asset.css.map*/"); +}); + +it("should write sourcemap file relative to fileContext", function() { + const fs = require("fs"); + const path = require("path"); + expect(fs.existsSync(path.join(__dirname, "asset.css.map"))).toBe(true); + const source = JSON.parse(fs.readFileSync(path.join(__dirname, "asset.css.map"), "utf-8")); + expect(source.sources[0]).toBe("webpack:///asset.scss"); + expect(source.sources[1]).toBe("data:;charset=utf-8,@import%20%22base%22;%0A%0Aa%20%7B%0A%20%20color:%20red;%0A%7D%0A"); + expect(source.sources[2]).toBe("http://example.com/index.js.map"); + expect(source.sources[3]).toBe('https://example.com/index.js.map'); +}); diff --git a/test/configCases/asset-modules/keep-source-maps/loader.js b/test/configCases/asset-modules/keep-source-maps/loader.js new file mode 100644 index 00000000000..372bf5cf22f --- /dev/null +++ b/test/configCases/asset-modules/keep-source-maps/loader.js @@ -0,0 +1,11 @@ +const fs = require("fs"); +const path = require("path"); + +/** @type {import("../../../../").LoaderDefinition<{ f(): any }>} */ +module.exports = function(_) { + // return the would-be output from SASS without needing the compiler as a dependency + const transformed = fs.readFileSync(path.join(__dirname, "data/asset.css"), { encoding: "utf8" }); + const sourceMap = fs.readFileSync(path.join(__dirname, "data/asset.css.map"), { encoding: "utf8" }); + + this.callback(null, transformed, JSON.parse(sourceMap)); +} diff --git a/test/configCases/asset-modules/keep-source-maps/webpack.config.js b/test/configCases/asset-modules/keep-source-maps/webpack.config.js new file mode 100644 index 00000000000..e18ec0545de --- /dev/null +++ b/test/configCases/asset-modules/keep-source-maps/webpack.config.js @@ -0,0 +1,34 @@ +/** @typedef {import("../../../../").GeneratorOptionsByModuleTypeKnown} GeneratorOptionsByModuleTypeKnown */ + +/** @type {import("../../../../").Configuration} */ +module.exports = { + node: { + __dirname: false, + __filename: false + }, + devtool: "source-map", + entry: { + bundle0: ["./index.js"], + asset: ["./asset.scss"] + }, + output: { + filename: "[name].js", + assetModuleFilename: "[name][ext]" + }, + module: { + rules: [ + { + test: /\.scss$/i, + type: "asset/resource", + /** @type {GeneratorOptionsByModuleTypeKnown['asset/resource']} */ + generator: { + binary: false, + filename: pathInfo => + /** @type {string} */ + (pathInfo.filename).replace(/\.scss/gi, ".css") + }, + use: ["./loader.js"] + } + ] + } +}; diff --git a/test/configCases/asset-modules/only-entry/entry.css b/test/configCases/asset-modules/only-entry/entry.css new file mode 100644 index 00000000000..72dc1bf90b9 --- /dev/null +++ b/test/configCases/asset-modules/only-entry/entry.css @@ -0,0 +1,3 @@ +.class { + background: #000; +} diff --git a/test/configCases/asset-modules/only-entry/entry.js b/test/configCases/asset-modules/only-entry/entry.js new file mode 100644 index 00000000000..ecd447f8ad4 --- /dev/null +++ b/test/configCases/asset-modules/only-entry/entry.js @@ -0,0 +1,5 @@ +function test() { + run(); +} + +test(); diff --git a/test/configCases/asset-modules/only-entry/test.config.js b/test/configCases/asset-modules/only-entry/test.config.js new file mode 100644 index 00000000000..32f4be1d473 --- /dev/null +++ b/test/configCases/asset-modules/only-entry/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["test.js"]; + } +}; diff --git a/test/configCases/asset-modules/only-entry/test.js b/test/configCases/asset-modules/only-entry/test.js new file mode 100644 index 00000000000..79aade0ceb2 --- /dev/null +++ b/test/configCases/asset-modules/only-entry/test.js @@ -0,0 +1,96 @@ +it("should work", () => { + const stats = __STATS__.children[__STATS_I__]; + + const test = stats.assets.find( + a => a.name === "test.js" + ); + expect(Boolean(test)).toBe(true); + + const assetEntry = stats.assets.find( + a => a.info.sourceFilename === "../_images/file.png" + ); + expect(Boolean(assetEntry)).toBe(true); + + switch (__STATS_I__) { + case 0: { + expect(stats.assets.length).toBe(2); + break; + } + case 1: { + expect(stats.assets.length).toBe(3); + + const jsEntry = stats.assets.find( + a => a.name.endsWith("js-entry.js") + ); + expect(Boolean(jsEntry)).toBe(true); + break; + } + case 2: { + expect(stats.assets.length).toBe(4); + + const cssEntryInJs = stats.assets.find( + a => a.name.endsWith("css-entry.js") + ); + expect(Boolean(cssEntryInJs)).toBe(true); + + const cssEntry = stats.assets.find( + a => a.name.endsWith("css-entry.css") + ); + expect(Boolean(cssEntry)).toBe(true); + break; + } + case 3: { + expect(stats.assets.length).toBe(5); + + const jsEntry = stats.assets.find( + a => a.name.endsWith("js-entry.js") + ); + expect(Boolean(jsEntry)).toBe(true); + + const cssEntryInJs = stats.assets.find( + a => a.name.endsWith("css-entry.js") + ); + expect(Boolean(cssEntryInJs)).toBe(true); + + const cssEntry = stats.assets.find( + a => a.name.endsWith("css-entry.css") + ); + expect(Boolean(cssEntry)).toBe(true); + break; + } + case 4: { + expect(stats.assets.length).toBe(4); + + const jsEntry = stats.assets.find( + a => a.name.endsWith("js-entry.js") + ); + expect(Boolean(jsEntry)).toBe(true); + + const cssEntryInJs = stats.assets.find( + a => a.name.endsWith("css-entry.js") + ); + expect(Boolean(cssEntryInJs)).toBe(true); + break; + } + case 5: { + expect(stats.assets.length).toBe(3); + + const jsEntry = stats.assets.find( + a => a.name.endsWith("mixed-entry.js") + ); + expect(Boolean(jsEntry)).toBe(true); + + break; + } + case 6: { + expect(stats.assets.length).toBe(3); + + const jsEntry = stats.assets.find( + a => a.name.endsWith("mixed-entry.js") + ); + expect(Boolean(jsEntry)).toBe(true); + + break; + } + } +}); diff --git a/test/configCases/asset-modules/only-entry/webpack.config.js b/test/configCases/asset-modules/only-entry/webpack.config.js new file mode 100644 index 00000000000..e823ba3b3de --- /dev/null +++ b/test/configCases/asset-modules/only-entry/webpack.config.js @@ -0,0 +1,122 @@ +const path = require("path"); +const fs = require("fs"); +const webpack = require("../../../../"); + +/** @typedef {import("../../../../").Configuration} Configuration */ + +/** @type {(i: number, options: Partial) => Configuration} */ +const common = (i, options) => ({ + target: "web", + output: { + filename: `${i}/[name].js`, + chunkFilename: `${i}/[name].js`, + cssFilename: `${i}/[name].css`, + cssChunkFilename: `${i}/[name].css`, + assetModuleFilename: `${i}/[name][ext][query]` + }, + module: { + rules: [ + { + test: /\.png$/, + type: "asset" + } + ] + }, + experiments: { + css: true + }, + plugins: [ + { + apply(compiler) { + compiler.hooks.compilation.tap("Test", compilation => { + compilation.hooks.processAssets.tap( + { + name: "copy-webpack-plugin", + stage: + compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL + }, + () => { + const data = fs.readFileSync( + path.resolve(__dirname, "./test.js") + ); + + compilation.emitAsset( + "test.js", + new webpack.sources.RawSource(data) + ); + } + ); + }); + } + } + ], + ...options +}); + +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + common(0, { + entry: "../_images/file.png" + }), + common(1, { + entry: { + "asset-entry": { + import: "../_images/file.png" + }, + "js-entry": { + import: "./entry.js" + } + } + }), + common(2, { + entry: { + "asset-entry": { + import: "../_images/file.png" + }, + "css-entry": { + import: "./entry.css" + } + } + }), + common(3, { + entry: { + "asset-entry": { + import: "../_images/file.png" + }, + "js-entry": { + import: "./entry.js" + }, + "css-entry": { + import: "./entry.css" + } + } + }), + common(4, { + target: "node", + entry: { + "asset-entry": { + import: "../_images/file.png" + }, + "js-entry": { + import: "./entry.js" + }, + "css-entry": { + import: "./entry.css" + } + } + }), + common(5, { + entry: { + "mixed-entry": { + import: ["./entry.js", "../_images/file.png"] + } + } + }), + common(6, { + entry: { + "mixed-entry": { + import: ["../_images/file.png", "./entry.js"] + } + } + }) +]; diff --git a/test/configCases/asset-modules/only-hash-url/file.png b/test/configCases/asset-modules/only-hash-url/file.png new file mode 100644 index 00000000000..fb53b9dedd3 Binary files /dev/null and b/test/configCases/asset-modules/only-hash-url/file.png differ diff --git a/test/configCases/asset-modules/only-hash-url/index.js b/test/configCases/asset-modules/only-hash-url/index.js new file mode 100644 index 00000000000..5814f924032 --- /dev/null +++ b/test/configCases/asset-modules/only-hash-url/index.js @@ -0,0 +1,10 @@ +import img from "#internal"; + +it("should allow to use an URL started with '#'", () => { + const url = new URL("#test", import.meta.url); + expect(url.hash).toBe("#test"); +}); + +it("should allow to use an URL started with '#'", () => { + expect(img).toEndWith("path/images/file.png"); +}); diff --git a/test/configCases/asset-modules/only-hash-url/package.json b/test/configCases/asset-modules/only-hash-url/package.json new file mode 100644 index 00000000000..0f6e3543a3e --- /dev/null +++ b/test/configCases/asset-modules/only-hash-url/package.json @@ -0,0 +1,7 @@ +{ + "name": "pkg", + "exports": "./pkg.mjs", + "imports": { + "#internal": "./file.png" + } +} diff --git a/test/configCases/asset-modules/only-hash-url/webpack.config.js b/test/configCases/asset-modules/only-hash-url/webpack.config.js new file mode 100644 index 00000000000..0da77aa0f7a --- /dev/null +++ b/test/configCases/asset-modules/only-hash-url/webpack.config.js @@ -0,0 +1,16 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + output: { + assetModuleFilename: "images/file[ext]" + }, + module: { + rules: [ + { + test: /\.png$/, + type: "asset/resource" + } + ] + }, + target: "web" +}; diff --git a/test/configCases/asset-modules/opus/errors.js b/test/configCases/asset-modules/opus/errors.js new file mode 100644 index 00000000000..878a9afe36d --- /dev/null +++ b/test/configCases/asset-modules/opus/errors.js @@ -0,0 +1 @@ +module.exports = [[/DataUrl can't be generated automatically/]]; diff --git a/test/configCases/asset-modules/opus/file.opuuus b/test/configCases/asset-modules/opus/file.opuuus new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/asset-modules/opus/index.js b/test/configCases/asset-modules/opus/index.js new file mode 100644 index 00000000000..ad63f39a0b1 --- /dev/null +++ b/test/configCases/asset-modules/opus/index.js @@ -0,0 +1,3 @@ +it("should throw an error for unknown mimetype", () => { + if (Math.random() < 0) require("./file.opuuus"); +}); diff --git a/test/configCases/asset-modules/opus/webpack.config.js b/test/configCases/asset-modules/opus/webpack.config.js new file mode 100644 index 00000000000..5a9c737db9b --- /dev/null +++ b/test/configCases/asset-modules/opus/webpack.config.js @@ -0,0 +1,12 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + module: { + rules: [ + { + test: /\.opuuus$/, + type: "asset" + } + ] + } +}; diff --git a/test/configCases/asset-modules/overridePath/index.js b/test/configCases/asset-modules/overridePath/index.js new file mode 100644 index 00000000000..faf4195c741 --- /dev/null +++ b/test/configCases/asset-modules/overridePath/index.js @@ -0,0 +1,7 @@ +import url from "../_images/file.png"; +import index from "../_static/file.html"; + +it("should output asset with path", () => { + expect(url).toEqual("images/file.png"); + expect(index).toEqual("static/index.html"); +}); diff --git a/test/configCases/asset-modules/overridePath/webpack.config.js b/test/configCases/asset-modules/overridePath/webpack.config.js new file mode 100644 index 00000000000..47481e0aae4 --- /dev/null +++ b/test/configCases/asset-modules/overridePath/webpack.config.js @@ -0,0 +1,22 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + output: { + assetModuleFilename: "images/file[ext]" + }, + module: { + rules: [ + { + test: /\.png$/, + type: "asset" + }, + { + test: /\.html$/, + type: "asset/resource", + generator: { + filename: "static/index.html" + } + } + ] + } +}; diff --git a/test/configCases/asset-modules/path/index.js b/test/configCases/asset-modules/path/index.js new file mode 100644 index 00000000000..d3f382dde8d --- /dev/null +++ b/test/configCases/asset-modules/path/index.js @@ -0,0 +1,5 @@ +import url from "../_images/file.png"; + +it("should output asset with path", () => { + expect(url).toEqual("images/file.png"); +}); diff --git a/test/configCases/asset-modules/path/webpack.config.js b/test/configCases/asset-modules/path/webpack.config.js new file mode 100644 index 00000000000..6255f718602 --- /dev/null +++ b/test/configCases/asset-modules/path/webpack.config.js @@ -0,0 +1,15 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + output: { + assetModuleFilename: "images/file[ext]" + }, + module: { + rules: [ + { + test: /\.png$/, + type: "asset" + } + ] + } +}; diff --git a/test/configCases/asset-modules/publicPath/index.js b/test/configCases/asset-modules/publicPath/index.js new file mode 100644 index 00000000000..ebd29d8a2fb --- /dev/null +++ b/test/configCases/asset-modules/publicPath/index.js @@ -0,0 +1,5 @@ +import url from "../_images/file.png"; + +it("should import asset with correct publicPath", () => { + expect(url).toEqual("assets/file.png"); +}); diff --git a/test/configCases/asset-modules/publicPath/webpack.config.js b/test/configCases/asset-modules/publicPath/webpack.config.js new file mode 100644 index 00000000000..d6363ec564d --- /dev/null +++ b/test/configCases/asset-modules/publicPath/webpack.config.js @@ -0,0 +1,19 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + output: { + publicPath: "assets/", + assetModuleFilename: "file[ext]", + environment: { + templateLiteral: true + } + }, + module: { + rules: [ + { + test: /\.png$/, + type: "asset" + } + ] + } +}; diff --git a/test/configCases/asset-modules/query-and-custom-condition/index.js b/test/configCases/asset-modules/query-and-custom-condition/index.js new file mode 100644 index 00000000000..d830a1f8144 --- /dev/null +++ b/test/configCases/asset-modules/query-and-custom-condition/index.js @@ -0,0 +1,9 @@ +import png from "../_images/file.png?foo=bar"; +import svg from "../_images/file.svg"; +import jpg from "../_images/file.jpg?foo=bar#hash"; + +it("should output various asset types", () => { + expect(png).toContain("data:image/png;base64,"); + expect(svg).toMatch(/^[\da-f]{20}\.svg$/); + expect(jpg).toContain("data:image/jpeg;base64,"); +}); diff --git a/test/configCases/asset-modules/query-and-custom-condition/webpack.config.js b/test/configCases/asset-modules/query-and-custom-condition/webpack.config.js new file mode 100644 index 00000000000..a9a1dbbfb6b --- /dev/null +++ b/test/configCases/asset-modules/query-and-custom-condition/webpack.config.js @@ -0,0 +1,19 @@ +/** @typedef {import("../../../../").ParserOptionsByModuleTypeKnown} ParserOptionsByModuleTypeKnown */ + +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + module: { + rules: [ + { + test: /\.(png|svg|jpg)$/, + type: "asset", + /** @type {ParserOptionsByModuleTypeKnown['asset']} */ + parser: { + dataUrlCondition: (source, { filename, module }) => + filename.includes("?foo=bar") + } + } + ] + } +}; diff --git a/test/configCases/asset-modules/query-and-custom-encoder/index.js b/test/configCases/asset-modules/query-and-custom-encoder/index.js new file mode 100644 index 00000000000..5b1059bbb31 --- /dev/null +++ b/test/configCases/asset-modules/query-and-custom-encoder/index.js @@ -0,0 +1,9 @@ +import png from "../_images/file.png"; +import svg from "../_images/file.svg?foo=bar"; +import jpg from "../_images/file.jpg"; + +it("should output various asset types", () => { + expect(png).toMatch(/^data:image\/png;base64,[0-9a-zA-Z+/]+=*$/); + expect(svg).toMatch(/^data:image\/svg\+xml,/); + expect(jpg).toMatch(/^data:image\/jpeg;base64,[0-9a-zA-Z+/]+=*$/); +}); diff --git a/test/configCases/asset-modules/query-and-custom-encoder/webpack.config.js b/test/configCases/asset-modules/query-and-custom-encoder/webpack.config.js new file mode 100644 index 00000000000..d478d4929ac --- /dev/null +++ b/test/configCases/asset-modules/query-and-custom-encoder/webpack.config.js @@ -0,0 +1,37 @@ +const svgToMiniDataURI = require("mini-svg-data-uri"); +const mimeTypes = require("mime-types"); + +/** @typedef {import("../../../../").GeneratorOptionsByModuleTypeKnown} GeneratorOptionsByModuleTypeKnown */ + +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + module: { + rules: [ + { + test: /\.(png|svg|jpg)$/, + type: "asset/inline", + /** @type {GeneratorOptionsByModuleTypeKnown["asset/inline"]} */ + generator: { + dataUrl: (source, { filename, module }) => { + if (filename.endsWith("?foo=bar")) { + if (typeof source !== "string") { + source = source.toString(); + } + + return svgToMiniDataURI(source); + } + + const mimeType = mimeTypes.lookup( + /** @type {string} */ + (module.nameForCondition()) + ); + const encodedContent = source.toString("base64"); + + return `data:${mimeType};base64,${encodedContent}`; + } + } + } + ] + } +}; diff --git a/test/configCases/asset-modules/query/index.js b/test/configCases/asset-modules/query/index.js new file mode 100644 index 00000000000..a20aaa3daaa --- /dev/null +++ b/test/configCases/asset-modules/query/index.js @@ -0,0 +1,9 @@ +import png from "../_images/file.png?foo=bar"; +import svg from "../_images/file.svg?"; +import jpg from "../_images/file.jpg?foo=bar#hash"; + +it("should output various asset types", () => { + expect(png).toMatch(/^[\da-f]{20}\.png\?foo=bar$/); + expect(svg).toMatch(/^[\da-f]{20}\.svg\?$/); + expect(jpg).toMatch(/^[\da-f]{20}\.jpg\?foo=bar$/); +}); diff --git a/test/configCases/asset-modules/query/webpack.config.js b/test/configCases/asset-modules/query/webpack.config.js new file mode 100644 index 00000000000..63b0636fec6 --- /dev/null +++ b/test/configCases/asset-modules/query/webpack.config.js @@ -0,0 +1,17 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + output: { + environment: { + templateLiteral: false + } + }, + module: { + rules: [ + { + test: /\.(png|svg|jpg)$/, + type: "asset/resource" + } + ] + } +}; diff --git a/test/configCases/asset-modules/real-content-hash/index.js b/test/configCases/asset-modules/real-content-hash/index.js new file mode 100644 index 00000000000..8fe6312b369 --- /dev/null +++ b/test/configCases/asset-modules/real-content-hash/index.js @@ -0,0 +1,6 @@ +import a from "../_images/file.png"; +import b from "../_images/file_copy.png"; + +it("should use a real content hash for assets", () => { + expect(a).toBe(b); +}); diff --git a/test/configCases/asset-modules/real-content-hash/webpack.config.js b/test/configCases/asset-modules/real-content-hash/webpack.config.js new file mode 100644 index 00000000000..185587c1654 --- /dev/null +++ b/test/configCases/asset-modules/real-content-hash/webpack.config.js @@ -0,0 +1,16 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + output: { + publicPath: "assets/", + assetModuleFilename: "file[ext]" + }, + module: { + rules: [ + { + test: /\.png$/, + type: "asset/resource" + } + ] + } +}; diff --git a/test/configCases/asset-modules/resource-from-data-uri/index.js b/test/configCases/asset-modules/resource-from-data-uri/index.js new file mode 100644 index 00000000000..57cb7ada446 --- /dev/null +++ b/test/configCases/asset-modules/resource-from-data-uri/index.js @@ -0,0 +1,5 @@ +import asset from "data:image/svg+xml;utf8,icon-square-small" + +it("should compile with correct filename", () => { + expect(asset).toMatch(/public\/media\/[0-9a-zA-Z]{20}\.[0-9a-zA-Z]{8}\.svg/); +}); diff --git a/test/configCases/asset-modules/resource-from-data-uri/webpack.config.js b/test/configCases/asset-modules/resource-from-data-uri/webpack.config.js new file mode 100644 index 00000000000..92bff82560f --- /dev/null +++ b/test/configCases/asset-modules/resource-from-data-uri/webpack.config.js @@ -0,0 +1,16 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + assetModuleFilename: "media/[name].[contenthash:8][ext]", + publicPath: "public/" + }, + module: { + rules: [ + { + mimetype: "image/svg+xml", + type: "asset/resource" + } + ] + }, + target: "web" +}; diff --git a/test/configCases/asset-modules/rule-generator-outputPath/index.js b/test/configCases/asset-modules/rule-generator-outputPath/index.js new file mode 100644 index 00000000000..2995c8b6d23 --- /dev/null +++ b/test/configCases/asset-modules/rule-generator-outputPath/index.js @@ -0,0 +1,10 @@ +import url from "../_images/file.png"; +import fs from "fs"; +import path from "path"; + +it("should emit asset with module.generator.asset.outputPath", () => { + expect(url).toEqual("https://cdn/assets/file.png"); + + const emitPath = path.join(__STATS__.outputPath, "cdn-assets/file.png") + expect(fs.existsSync(emitPath)).toBe(true); +}); diff --git a/test/configCases/asset-modules/rule-generator-outputPath/webpack.config.js b/test/configCases/asset-modules/rule-generator-outputPath/webpack.config.js new file mode 100644 index 00000000000..dd65cf885dc --- /dev/null +++ b/test/configCases/asset-modules/rule-generator-outputPath/webpack.config.js @@ -0,0 +1,19 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + output: { + assetModuleFilename: "file[ext]" + }, + module: { + rules: [ + { + test: /\.png$/, + type: "asset/resource", + generator: { + publicPath: "https://cdn/assets/", + outputPath: "cdn-assets/" + } + } + ] + } +}; diff --git a/test/configCases/asset-modules/rule-generator-publicPath-override/index.js b/test/configCases/asset-modules/rule-generator-publicPath-override/index.js new file mode 100644 index 00000000000..72297579ded --- /dev/null +++ b/test/configCases/asset-modules/rule-generator-publicPath-override/index.js @@ -0,0 +1,5 @@ +import url from "../_images/file.png"; + +it("should import asset with empty string rule.generator.publicPath", () => { + expect(url).toEqual("file.png"); +}); diff --git a/test/configCases/asset-modules/rule-generator-publicPath-override/webpack.config.js b/test/configCases/asset-modules/rule-generator-publicPath-override/webpack.config.js new file mode 100644 index 00000000000..75890c52181 --- /dev/null +++ b/test/configCases/asset-modules/rule-generator-publicPath-override/webpack.config.js @@ -0,0 +1,19 @@ +/** @type {import("../../../../types").Configuration} */ +module.exports = { + mode: "development", + output: { + assetModuleFilename: "file[ext]", + publicPath: "assets/" + }, + module: { + rules: [ + { + test: /\.png$/, + type: "asset", + generator: { + publicPath: "" + } + } + ] + } +}; diff --git a/test/configCases/asset-modules/rule-generator-publicPath/index.js b/test/configCases/asset-modules/rule-generator-publicPath/index.js new file mode 100644 index 00000000000..2a95a2fc5b0 --- /dev/null +++ b/test/configCases/asset-modules/rule-generator-publicPath/index.js @@ -0,0 +1,5 @@ +import url from "../_images/file.png"; + +it("should import asset with rule.generator.publicPath", () => { + expect(url).toEqual("assets/file.png"); +}); diff --git a/test/configCases/asset-modules/rule-generator-publicPath/webpack.config.js b/test/configCases/asset-modules/rule-generator-publicPath/webpack.config.js new file mode 100644 index 00000000000..9f8072e1fa4 --- /dev/null +++ b/test/configCases/asset-modules/rule-generator-publicPath/webpack.config.js @@ -0,0 +1,18 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + output: { + assetModuleFilename: "file[ext]" + }, + module: { + rules: [ + { + test: /\.png$/, + type: "asset", + generator: { + publicPath: () => "assets/" + } + } + ] + } +}; diff --git a/test/configCases/asset-modules/source/index.js b/test/configCases/asset-modules/source/index.js new file mode 100644 index 00000000000..f5716825933 --- /dev/null +++ b/test/configCases/asset-modules/source/index.js @@ -0,0 +1,5 @@ +import svg from "../_images/file.svg"; + +it("should receive asset source", () => { + expect(svg).toMatch(/^\s*$/); +}); diff --git a/test/configCases/asset-modules/source/webpack.config.js b/test/configCases/asset-modules/source/webpack.config.js new file mode 100644 index 00000000000..1d0399ec277 --- /dev/null +++ b/test/configCases/asset-modules/source/webpack.config.js @@ -0,0 +1,12 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + module: { + rules: [ + { + test: /\.svg$/, + type: "asset/source" + } + ] + } +}; diff --git a/test/configCases/asset-modules/types/index.js b/test/configCases/asset-modules/types/index.js new file mode 100644 index 00000000000..b4d0226b5e0 --- /dev/null +++ b/test/configCases/asset-modules/types/index.js @@ -0,0 +1,9 @@ +import png from "../_images/file.png"; +import svg from "../_images/file.svg"; +import jpg from "../_images/file.jpg"; + +it("should output various asset types", () => { + expect(png).toMatch(/^[\da-f]{20}\.png$/); + expect(svg).toMatch(/^[\da-f]{20}\.svg$/); + expect(jpg).toMatch(/^[\da-f]{20}\.jpg$/); +}); diff --git a/test/configCases/asset-modules/types/webpack.config.js b/test/configCases/asset-modules/types/webpack.config.js new file mode 100644 index 00000000000..94be94f16e7 --- /dev/null +++ b/test/configCases/asset-modules/types/webpack.config.js @@ -0,0 +1,16 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + module: { + rules: [ + { + test: /\.(png|svg)$/, + type: "asset/resource" + }, + { + test: /\.jpg$/, + type: "asset/resource" + } + ] + } +}; diff --git a/test/configCases/asset-modules/unsafe-cache-13827/index.js b/test/configCases/asset-modules/unsafe-cache-13827/index.js new file mode 100644 index 00000000000..1e8a11e39c7 --- /dev/null +++ b/test/configCases/asset-modules/unsafe-cache-13827/index.js @@ -0,0 +1,5 @@ +import url from "package"; + +it("should create a data url", () => { + expect(url.protocol).toBe("data:"); +}); diff --git a/test/configCases/asset-modules/unsafe-cache-13827/node_modules/package/file.svg b/test/configCases/asset-modules/unsafe-cache-13827/node_modules/package/file.svg new file mode 100644 index 00000000000..d7b7e40b4f8 --- /dev/null +++ b/test/configCases/asset-modules/unsafe-cache-13827/node_modules/package/file.svg @@ -0,0 +1 @@ +icon-square-small diff --git a/test/configCases/asset-modules/unsafe-cache-13827/node_modules/package/index.js b/test/configCases/asset-modules/unsafe-cache-13827/node_modules/package/index.js new file mode 100644 index 00000000000..b8d757bda87 --- /dev/null +++ b/test/configCases/asset-modules/unsafe-cache-13827/node_modules/package/index.js @@ -0,0 +1 @@ +export default new URL("file.svg", import.meta.url); diff --git a/test/configCases/asset-modules/unsafe-cache-13827/webpack.config.js b/test/configCases/asset-modules/unsafe-cache-13827/webpack.config.js new file mode 100644 index 00000000000..693c302c6c7 --- /dev/null +++ b/test/configCases/asset-modules/unsafe-cache-13827/webpack.config.js @@ -0,0 +1,12 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + module: { + rules: [ + { + dependency: "url", + type: "asset" + } + ] + } +}; diff --git a/test/configCases/asset-url/relative/index.css b/test/configCases/asset-url/relative/index.css new file mode 100644 index 00000000000..077f6dd7c01 --- /dev/null +++ b/test/configCases/asset-url/relative/index.css @@ -0,0 +1 @@ +a {} diff --git a/test/configCases/asset-url/relative/index.js b/test/configCases/asset-url/relative/index.js new file mode 100644 index 00000000000..aa61627b642 --- /dev/null +++ b/test/configCases/asset-url/relative/index.js @@ -0,0 +1,20 @@ +it("should handle import.meta.url in URL()", () => { + const url = new URL("./index.css?query=yes#fragment", import.meta.url); + + expect(url.href).toBe("public/index.css?query=yes#fragment"); + expect(url.origin).toBe(""); + expect(url.protocol).toBe(""); + expect(url.username).toBe(""); + expect(url.password).toBe(""); + expect(url.host).toBe(""); + expect(url.hostname).toBe(""); + expect(url.port).toBe(""); + expect(url.pathname).toBe("public/index.css"); + expect(url.search).toBe("?query=yes"); + expect(url.searchParams.get("query")).toBe("yes"); + expect(url.hash).toBe("#fragment"); + expect(url + "").toBe("public/index.css?query=yes#fragment"); + expect(url.toString()).toBe("public/index.css?query=yes#fragment"); + expect(JSON.stringify(url)).toBe('"public/index.css?query=yes#fragment"'); + expect(url instanceof URL).toBe(true); +}); diff --git a/test/configCases/asset-url/relative/webpack.config.js b/test/configCases/asset-url/relative/webpack.config.js new file mode 100644 index 00000000000..8ac15349c22 --- /dev/null +++ b/test/configCases/asset-url/relative/webpack.config.js @@ -0,0 +1,16 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + devtool: false, + output: { + assetModuleFilename: "[name][ext][query][fragment]", + publicPath: "public/" + }, + module: { + parser: { + javascript: { + url: "relative" + } + } + } +}; diff --git a/test/configCases/asset-url/target-node1/index.css b/test/configCases/asset-url/target-node1/index.css new file mode 100644 index 00000000000..077f6dd7c01 --- /dev/null +++ b/test/configCases/asset-url/target-node1/index.css @@ -0,0 +1 @@ +a {} diff --git a/test/configCases/asset-url/target-node1/index.js b/test/configCases/asset-url/target-node1/index.js new file mode 100644 index 00000000000..8f761ae6778 --- /dev/null +++ b/test/configCases/asset-url/target-node1/index.js @@ -0,0 +1,7 @@ +const currentDir = require("url").pathToFileURL(__dirname); + +it("should handle import.meta.url in URL()", () => { + const {href} = new URL("./index.css", import.meta.url); + + expect(href).toBe(currentDir + "/public/index.css"); +}); diff --git a/test/configCases/asset-url/target-node1/webpack.config.js b/test/configCases/asset-url/target-node1/webpack.config.js new file mode 100644 index 00000000000..315a9e60246 --- /dev/null +++ b/test/configCases/asset-url/target-node1/webpack.config.js @@ -0,0 +1,19 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + target: "node", + devtool: false, + output: { + assetModuleFilename: "[name][ext]", + publicPath: "public/" + }, + module: { + rules: [ + { + test: /\.css$/, + dependency: ["esm", "commonjs"], + loader: "url-loader" + } + ] + } +}; diff --git a/test/configCases/asset-url/target-node2/index.css b/test/configCases/asset-url/target-node2/index.css new file mode 100644 index 00000000000..077f6dd7c01 --- /dev/null +++ b/test/configCases/asset-url/target-node2/index.css @@ -0,0 +1 @@ +a {} diff --git a/test/configCases/asset-url/target-node2/index.js b/test/configCases/asset-url/target-node2/index.js new file mode 100644 index 00000000000..bdb9e62f7c0 --- /dev/null +++ b/test/configCases/asset-url/target-node2/index.js @@ -0,0 +1,7 @@ +const currentDir = require("url").pathToFileURL(__dirname); + +it("should handle import.meta.url in URL()", () => { + const {href} = new URL("./index.css", import.meta.url); + + expect(href).toBe(currentDir + "/index.css"); +}); diff --git a/test/configCases/asset-url/target-node2/webpack.config.js b/test/configCases/asset-url/target-node2/webpack.config.js new file mode 100644 index 00000000000..14934d1135f --- /dev/null +++ b/test/configCases/asset-url/target-node2/webpack.config.js @@ -0,0 +1,9 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + target: "node", + devtool: false, + output: { + assetModuleFilename: "[name][ext]" + } +}; diff --git a/test/configCases/asset-url/target-node3/index.css b/test/configCases/asset-url/target-node3/index.css new file mode 100644 index 00000000000..077f6dd7c01 --- /dev/null +++ b/test/configCases/asset-url/target-node3/index.css @@ -0,0 +1 @@ +a {} diff --git a/test/configCases/asset-url/target-node3/index.js b/test/configCases/asset-url/target-node3/index.js new file mode 100644 index 00000000000..da26b13c3c2 --- /dev/null +++ b/test/configCases/asset-url/target-node3/index.js @@ -0,0 +1,9 @@ +it("should handle import.meta.url in URL()", () => { + ((MyURL, URL) => { + const { href } = new MyURL("./index.css", import.meta.url); + + expect(href).toBe("https://example.com/index.css"); + })(URL, function () { + throw new Error("should not be called"); + }); +}); diff --git a/test/configCases/asset-url/target-node3/webpack.config.js b/test/configCases/asset-url/target-node3/webpack.config.js new file mode 100644 index 00000000000..499de2fe5d6 --- /dev/null +++ b/test/configCases/asset-url/target-node3/webpack.config.js @@ -0,0 +1,10 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + target: "node", + devtool: false, + output: { + assetModuleFilename: "[name][ext]", + publicPath: "https://example.com/" + } +}; diff --git a/test/configCases/asset-url/target-web1/index.css b/test/configCases/asset-url/target-web1/index.css new file mode 100644 index 00000000000..077f6dd7c01 --- /dev/null +++ b/test/configCases/asset-url/target-web1/index.css @@ -0,0 +1 @@ +a {} diff --git a/test/configCases/asset-url/target-web1/index.js b/test/configCases/asset-url/target-web1/index.js new file mode 100644 index 00000000000..5284c3ba8a8 --- /dev/null +++ b/test/configCases/asset-url/target-web1/index.js @@ -0,0 +1,5 @@ +it("should handle import.meta.url in URL()", () => { + const {href} = new URL("./index.css", import.meta.url); + + expect(href).toBe("https://test.cases/path/index.css"); +}); diff --git a/test/configCases/asset-url/target-web1/webpack.config.js b/test/configCases/asset-url/target-web1/webpack.config.js new file mode 100644 index 00000000000..35e16e26f51 --- /dev/null +++ b/test/configCases/asset-url/target-web1/webpack.config.js @@ -0,0 +1,18 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + target: "web", + devtool: false, + output: { + assetModuleFilename: "[name][ext]" + }, + module: { + rules: [ + { + test: /\.css$/, + dependency: "url", + loader: "url-loader" + } + ] + } +}; diff --git a/test/configCases/asset-url/target-web2/a.js b/test/configCases/asset-url/target-web2/a.js new file mode 100644 index 00000000000..296d5492b00 --- /dev/null +++ b/test/configCases/asset-url/target-web2/a.js @@ -0,0 +1 @@ +console.log(1); diff --git a/test/configCases/asset-url/target-web2/index.js b/test/configCases/asset-url/target-web2/index.js new file mode 100644 index 00000000000..62462bee06a --- /dev/null +++ b/test/configCases/asset-url/target-web2/index.js @@ -0,0 +1,11 @@ +it("should handle import.meta.url in URL()", () => { + const { href } = new URL("./a.js", import.meta.url); + + expect(href).toBe("https://test.cases/path2/a.js"); +}); + +it("should handle relative paths in URL()", () => { + const { href } = new URL("a.js", import.meta.url); + + expect(href).toBe("https://test.cases/path2/a.js"); +}); diff --git a/test/configCases/asset-url/target-web2/webpack.config.js b/test/configCases/asset-url/target-web2/webpack.config.js new file mode 100644 index 00000000000..2cbfe9bddbf --- /dev/null +++ b/test/configCases/asset-url/target-web2/webpack.config.js @@ -0,0 +1,10 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + target: "web", + devtool: false, + output: { + assetModuleFilename: "[name][ext]", + publicPath: "/path2/" + } +}; diff --git a/test/configCases/asset-url/target-webworker1/index.js b/test/configCases/asset-url/target-webworker1/index.js new file mode 100644 index 00000000000..20da64467d5 --- /dev/null +++ b/test/configCases/asset-url/target-webworker1/index.js @@ -0,0 +1,5 @@ +it("should handle import.meta.url in URL()", () => { + const { href } = new URL("./inner/a.js", import.meta.url); + + expect(href).toBe("https://test.cases/custom/inner/a.js"); +}); diff --git a/test/configCases/asset-url/target-webworker1/inner/a.js b/test/configCases/asset-url/target-webworker1/inner/a.js new file mode 100644 index 00000000000..296d5492b00 --- /dev/null +++ b/test/configCases/asset-url/target-webworker1/inner/a.js @@ -0,0 +1 @@ +console.log(1); diff --git a/test/configCases/asset-url/target-webworker1/test.config.js b/test/configCases/asset-url/target-webworker1/test.config.js new file mode 100644 index 00000000000..9429e689a15 --- /dev/null +++ b/test/configCases/asset-url/target-webworker1/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + moduleScope(scope) { + scope.self.location = "https://test.cases/custom/deep/path/main.js"; + }, + findBundle() { + return "./deep/path/main.js"; + } +}; diff --git a/test/configCases/asset-url/target-webworker1/webpack.config.js b/test/configCases/asset-url/target-webworker1/webpack.config.js new file mode 100644 index 00000000000..146b9da9c12 --- /dev/null +++ b/test/configCases/asset-url/target-webworker1/webpack.config.js @@ -0,0 +1,11 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + target: "webworker", + devtool: false, + output: { + filename: "deep/path/[name].js", + assetModuleFilename: "[path][name][ext]", + publicPath: "" + } +}; diff --git a/test/configCases/asset-url/target-webworker2/index.css b/test/configCases/asset-url/target-webworker2/index.css new file mode 100644 index 00000000000..077f6dd7c01 --- /dev/null +++ b/test/configCases/asset-url/target-webworker2/index.css @@ -0,0 +1 @@ +a {} diff --git a/test/configCases/asset-url/target-webworker2/index.js b/test/configCases/asset-url/target-webworker2/index.js new file mode 100644 index 00000000000..ee80741fd51 --- /dev/null +++ b/test/configCases/asset-url/target-webworker2/index.js @@ -0,0 +1,5 @@ +it("should handle import.meta.url in URL()", () => { + const {href} = new URL("./index.css", import.meta.url); + + expect(href).toBe("https://test.cases/index.css"); +}); diff --git a/test/configCases/asset-url/target-webworker2/webpack.config.js b/test/configCases/asset-url/target-webworker2/webpack.config.js new file mode 100644 index 00000000000..ef13370aa09 --- /dev/null +++ b/test/configCases/asset-url/target-webworker2/webpack.config.js @@ -0,0 +1,10 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + target: "webworker", + devtool: false, + output: { + assetModuleFilename: "[name][ext]", + publicPath: "/" + } +}; diff --git a/test/configCases/assets/delete-asset/chunk.js b/test/configCases/assets/delete-asset/chunk.js new file mode 100644 index 00000000000..d9b6390e877 --- /dev/null +++ b/test/configCases/assets/delete-asset/chunk.js @@ -0,0 +1,3 @@ +/**! Chunk */ + +console.log("Fail"); diff --git a/test/configCases/assets/delete-asset/chunk2.js b/test/configCases/assets/delete-asset/chunk2.js new file mode 100644 index 00000000000..d9b6390e877 --- /dev/null +++ b/test/configCases/assets/delete-asset/chunk2.js @@ -0,0 +1,3 @@ +/**! Chunk */ + +console.log("Fail"); diff --git a/test/configCases/assets/delete-asset/index.js b/test/configCases/assets/delete-asset/index.js new file mode 100644 index 00000000000..07c8964ef51 --- /dev/null +++ b/test/configCases/assets/delete-asset/index.js @@ -0,0 +1,14 @@ +/**! Main */ + +it("should fail loading a deleted asset", async () => { + await expect(import("./chunk.js")).rejects.toEqual( + expect.objectContaining({ + code: "ENOENT" + }) + ); + await expect(import("./chunk2.js")).rejects.toEqual( + expect.objectContaining({ + code: "ENOENT" + }) + ); +}); diff --git a/test/configCases/assets/delete-asset/infrastructure-log.js b/test/configCases/assets/delete-asset/infrastructure-log.js new file mode 100644 index 00000000000..9d9c6526e4a --- /dev/null +++ b/test/configCases/assets/delete-asset/infrastructure-log.js @@ -0,0 +1,5 @@ +module.exports = [ + // each time sets different assetsInfo object instance in webpack.config.js:54 + // this prevents hit in inmemory cache + /^Pack got invalid because of write to: TerserWebpackPlugin|bundle0\.js$/ +]; diff --git a/test/configCases/assets/delete-asset/webpack.config.js b/test/configCases/assets/delete-asset/webpack.config.js new file mode 100644 index 00000000000..8f2a1c7f2a9 --- /dev/null +++ b/test/configCases/assets/delete-asset/webpack.config.js @@ -0,0 +1,78 @@ +const { Compilation, BannerPlugin } = require("../../../../"); +const TerserPlugin = require("terser-webpack-plugin"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + minimize: true, + minimizer: [ + new TerserPlugin({ + extractComments: { + filename: "LICENSES.txt" + } + }) + ], + chunkIds: "named" + }, + devtool: "source-map", + plugins: [ + new BannerPlugin({ + banner: "Test" + }), + compiler => { + compiler.hooks.compilation.tap("Test", compilation => { + compilation.hooks.processAssets.tap( + { + name: "Test", + stage: Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL + }, + () => { + compilation.deleteAsset("chunk2_js.bundle0.js"); + } + ); + compilation.hooks.processAssets.tap( + { + name: "Test", + stage: Compilation.PROCESS_ASSETS_STAGE_ANALYSE + }, + () => { + expect(compilation.getAsset("chunk_js.bundle0.js")).not.toBe( + undefined + ); + expect(compilation.getAsset("chunk_js.bundle0.js.map")).not.toBe( + undefined + ); + expect(compilation.getAsset("LICENSES.txt")).not.toBe(undefined); + // TODO: terser-webpack-plugin should set related info + compilation.updateAsset( + "chunk_js.bundle0.js", + compilation.assets["chunk_js.bundle0.js"], + { + related: { license: "LICENSES.txt" } + } + ); + compilation.updateAsset( + "bundle0.js", + compilation.assets["bundle0.js"], + { + related: { license: "LICENSES.txt" } + } + ); + compilation.deleteAsset("chunk_js.bundle0.js"); + expect(compilation.getAsset("chunk_js.bundle0.js")).toBe(undefined); + expect(compilation.getAsset("chunk_js.bundle0.js.map")).toBe( + undefined + ); + expect(compilation.getAsset("chunk2_js.bundle0.js")).toBe( + undefined + ); + expect(compilation.getAsset("chunk2_js.bundle0.js.map")).toBe( + undefined + ); + expect(compilation.getAsset("LICENSES.txt")).not.toBe(undefined); + } + ); + }); + } + ] +}; diff --git a/test/configCases/async-commons-chunk/all-selected/webpack.config.js b/test/configCases/async-commons-chunk/all-selected/webpack.config.js index fd4fbccbf34..4224dbc77bb 100644 --- a/test/configCases/async-commons-chunk/all-selected/webpack.config.js +++ b/test/configCases/async-commons-chunk/all-selected/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { optimization: { splitChunks: { diff --git a/test/configCases/async-commons-chunk/duplicate/webpack.config.js b/test/configCases/async-commons-chunk/duplicate/webpack.config.js index fd4fbccbf34..4224dbc77bb 100644 --- a/test/configCases/async-commons-chunk/duplicate/webpack.config.js +++ b/test/configCases/async-commons-chunk/duplicate/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { optimization: { splitChunks: { diff --git a/test/configCases/async-commons-chunk/existing-name/index.js b/test/configCases/async-commons-chunk/existing-name/index.js index b05f483e755..b953c1a09b4 100644 --- a/test/configCases/async-commons-chunk/existing-name/index.js +++ b/test/configCases/async-commons-chunk/existing-name/index.js @@ -1,11 +1,17 @@ const chunkLoadingSpy = jest.spyOn(__webpack_require__, "e"); -it("should not have duplicate chunks in blocks", function(done) { +it("should not have duplicate chunks in blocks", function (done) { + let i = 0; + const d = () => { + if (i++ >= 3) done(); + }; + // This split point should contain: a require.ensure( [], - function(require) { + function (require) { expect(require("./a")).toBe("a"); + d(); }, "a" ); @@ -14,9 +20,10 @@ it("should not have duplicate chunks in blocks", function(done) { // have it only contain b and make chunk a be an async dependency. require.ensure( [], - function(require) { + function (require) { expect(require("./a")).toBe("a"); expect(require("./b")).toBe("b"); + d(); }, "a+b" ); @@ -25,10 +32,11 @@ it("should not have duplicate chunks in blocks", function(done) { // have it only contain c and make chunks a and a+b be async dependencies. require.ensure( [], - function(require) { + function (require) { expect(require("./a")).toBe("a"); expect(require("./b")).toBe("b"); expect(require("./c")).toBe("c"); + d(); }, "a+b+c" ); @@ -46,5 +54,5 @@ it("should not have duplicate chunks in blocks", function(done) { ["a+b" /* == b */], ["a+b+c" /* == c */] ]); - done(); + d(); }); diff --git a/test/configCases/async-commons-chunk/existing-name/webpack.config.js b/test/configCases/async-commons-chunk/existing-name/webpack.config.js index 99f63ca81bc..bf5d082bfa1 100644 --- a/test/configCases/async-commons-chunk/existing-name/webpack.config.js +++ b/test/configCases/async-commons-chunk/existing-name/webpack.config.js @@ -1,14 +1,12 @@ -var webpack = require("../../../../"); - +/** @type {import("../../../../").Configuration} */ module.exports = { performance: { hints: false }, optimization: { splitChunks: { - minSize: 1, - name: true - } - }, - plugins: [new webpack.NamedChunksPlugin()] + minSize: 1 + }, + chunkIds: "named" + } }; diff --git a/test/configCases/async-commons-chunk/nested/webpack.config.js b/test/configCases/async-commons-chunk/nested/webpack.config.js index fd4fbccbf34..4224dbc77bb 100644 --- a/test/configCases/async-commons-chunk/nested/webpack.config.js +++ b/test/configCases/async-commons-chunk/nested/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { optimization: { splitChunks: { diff --git a/test/configCases/async-commons-chunk/node/webpack.config.js b/test/configCases/async-commons-chunk/node/webpack.config.js index 656d3a998b2..d25903acd0d 100644 --- a/test/configCases/async-commons-chunk/node/webpack.config.js +++ b/test/configCases/async-commons-chunk/node/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { mode: "none", entry: { @@ -5,7 +6,7 @@ module.exports = { }, target: "node", optimization: { - namedChunks: true, - namedModules: true + chunkIds: "named", + moduleIds: "named" } }; diff --git a/test/configCases/async-commons-chunk/simple/webpack.config.js b/test/configCases/async-commons-chunk/simple/webpack.config.js index fd4fbccbf34..4224dbc77bb 100644 --- a/test/configCases/async-commons-chunk/simple/webpack.config.js +++ b/test/configCases/async-commons-chunk/simple/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { optimization: { splitChunks: { diff --git a/test/configCases/async-library/0-create-library/a.js b/test/configCases/async-library/0-create-library/a.js new file mode 100644 index 00000000000..b18b50cdba1 --- /dev/null +++ b/test/configCases/async-library/0-create-library/a.js @@ -0,0 +1 @@ +export const a = await Promise.resolve(42); diff --git a/test/configCases/async-library/0-create-library/test.config.js b/test/configCases/async-library/0-create-library/test.config.js new file mode 100644 index 00000000000..04581a81040 --- /dev/null +++ b/test/configCases/async-library/0-create-library/test.config.js @@ -0,0 +1 @@ +module.exports.noTests = true; diff --git a/test/configCases/async-library/0-create-library/webpack.config.js b/test/configCases/async-library/0-create-library/webpack.config.js new file mode 100644 index 00000000000..0f5270b0881 --- /dev/null +++ b/test/configCases/async-library/0-create-library/webpack.config.js @@ -0,0 +1,18 @@ +/** @type {import("../../../../types").Configuration} */ +module.exports = { + entry: "./a.js", + output: { + filename: "lib.js", + library: { + type: "module" + } + }, + target: "node14", + optimization: { + minimize: true + }, + experiments: { + topLevelAwait: true, + outputModule: true + } +}; diff --git a/test/configCases/async-library/1-use-library/index.js b/test/configCases/async-library/1-use-library/index.js new file mode 100644 index 00000000000..c342b51c1e2 --- /dev/null +++ b/test/configCases/async-library/1-use-library/index.js @@ -0,0 +1,5 @@ +it("should get valid export from library", () => { + return import("library").then(({ a }) => { + expect(a).toBe(42); + }); +}); diff --git a/test/configCases/async-library/1-use-library/webpack.config.js b/test/configCases/async-library/1-use-library/webpack.config.js new file mode 100644 index 00000000000..794b8747468 --- /dev/null +++ b/test/configCases/async-library/1-use-library/webpack.config.js @@ -0,0 +1,18 @@ +const path = require("path"); + +/** @type {(env: Env, options: TestOptions) => import("../../../../types").Configuration} */ +module.exports = (env, { testPath }) => ({ + target: "node14", + output: { + chunkLoading: "import" + }, + resolve: { + alias: { + library: path.resolve(testPath, "../0-create-library/lib.js") + } + }, + experiments: { + topLevelAwait: true, + outputModule: true + } +}); diff --git a/test/configCases/async-module/environment-not-support-async-warning/index.js b/test/configCases/async-module/environment-not-support-async-warning/index.js new file mode 100644 index 00000000000..b80f6c769f1 --- /dev/null +++ b/test/configCases/async-module/environment-not-support-async-warning/index.js @@ -0,0 +1,9 @@ +it("should have warnings for environment not support async/await when using asyncModule", () => { + return import("./reexport").then(({ number, getNumber, importRequest, moduleRequest, promiseRequest }) => { + expect(number).toBe(1); + expect(getNumber()).toBe(42); + expect(importRequest).toBe("import.js"); + expect(moduleRequest).toBe("module.js"); + expect(promiseRequest).toBe("promise.js"); + }); +}); diff --git a/test/configCases/async-module/environment-not-support-async-warning/reexport.js b/test/configCases/async-module/environment-not-support-async-warning/reexport.js new file mode 100644 index 00000000000..e4c330e84fe --- /dev/null +++ b/test/configCases/async-module/environment-not-support-async-warning/reexport.js @@ -0,0 +1,5 @@ +export { default as number } from "./tla"; +export { getNumber } from "./wasm.wat" +export { default as moduleRequest } from "external-module" +export { default as importRequest } from "external-import" +export { default as promiseRequest } from "external-promise" diff --git a/test/configCases/async-module/environment-not-support-async-warning/test.filter.js b/test/configCases/async-module/environment-not-support-async-warning/test.filter.js new file mode 100644 index 00000000000..cb37e21905f --- /dev/null +++ b/test/configCases/async-module/environment-not-support-async-warning/test.filter.js @@ -0,0 +1,5 @@ +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); + +module.exports = function (config) { + return supportsWebAssembly(); +}; diff --git a/test/configCases/async-module/environment-not-support-async-warning/tla.js b/test/configCases/async-module/environment-not-support-async-warning/tla.js new file mode 100644 index 00000000000..7ff47b218ac --- /dev/null +++ b/test/configCases/async-module/environment-not-support-async-warning/tla.js @@ -0,0 +1 @@ +export default await Promise.resolve(1) diff --git a/test/configCases/async-module/environment-not-support-async-warning/warnings.js b/test/configCases/async-module/environment-not-support-async-warning/warnings.js new file mode 100644 index 00000000000..e0bb2da70fe --- /dev/null +++ b/test/configCases/async-module/environment-not-support-async-warning/warnings.js @@ -0,0 +1,27 @@ +module.exports = [ + [ + { moduleName: /tla\.js/ }, + /The generated code contains 'async\/await'/, + /"topLevelAwait"/ + ], + [ + { moduleName: /external \["import\.js","request"\]/ }, + /The generated code contains 'async\/await'/, + /"external import"/ + ], + [ + { moduleName: /external \["module\.js","request"\]/ }, + /The generated code contains 'async\/await'/, + /"external module"/ + ], + [ + { moduleName: /external "Promise\.resolve\('promise\.js'\)"/ }, + /The generated code contains 'async\/await'/, + /"external promise"/ + ], + [ + { moduleName: /wasm\.wat/ }, + /The generated code contains 'async\/await'/, + /"asyncWebAssembly"/ + ] +]; diff --git a/test/configCases/async-module/environment-not-support-async-warning/wasm.wat b/test/configCases/async-module/environment-not-support-async-warning/wasm.wat new file mode 100644 index 00000000000..d8081e18c3b --- /dev/null +++ b/test/configCases/async-module/environment-not-support-async-warning/wasm.wat @@ -0,0 +1,4 @@ +(module + (func $getNumber (export "getNumber") (result i32) + (i32.const 42))) + diff --git a/test/configCases/async-module/environment-not-support-async-warning/webpack.config.js b/test/configCases/async-module/environment-not-support-async-warning/webpack.config.js new file mode 100644 index 00000000000..81f034c466e --- /dev/null +++ b/test/configCases/async-module/environment-not-support-async-warning/webpack.config.js @@ -0,0 +1,27 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + module: { + rules: [ + { + test: /\.wat$/, + loader: "wast-loader", + type: "webassembly/async" + } + ] + }, + output: { + environment: { + dynamicImport: true, + asyncFunction: false + }, + importFunctionName: "((name) => Promise.resolve({ request: name }))" + }, + externals: { + "external-module": ["module module.js", "request"], + "external-import": ["import import.js", "request"], + "external-promise": "promise Promise.resolve('promise.js')" + }, + experiments: { + asyncWebAssembly: true + } +}; diff --git a/test/configCases/cache-dependencies/managed-items-unsafe-cache/extra.js b/test/configCases/cache-dependencies/managed-items-unsafe-cache/extra.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/cache-dependencies/managed-items-unsafe-cache/index.js b/test/configCases/cache-dependencies/managed-items-unsafe-cache/index.js new file mode 100644 index 00000000000..3b676a7c54d --- /dev/null +++ b/test/configCases/cache-dependencies/managed-items-unsafe-cache/index.js @@ -0,0 +1,3 @@ +import "./loader!package"; + +it("should compile and run the test in config", () => {}); diff --git a/test/configCases/cache-dependencies/managed-items-unsafe-cache/loader.js b/test/configCases/cache-dependencies/managed-items-unsafe-cache/loader.js new file mode 100644 index 00000000000..3a6935623f6 --- /dev/null +++ b/test/configCases/cache-dependencies/managed-items-unsafe-cache/loader.js @@ -0,0 +1,8 @@ +const path = require("path"); + +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { + this.addDependency(path.resolve(__dirname, "node_modules/package/extra.js")); + this.addDependency(path.resolve(__dirname, "extra.js")); + return source; +}; diff --git a/test/configCases/cache-dependencies/managed-items-unsafe-cache/node_modules/package/extra.js b/test/configCases/cache-dependencies/managed-items-unsafe-cache/node_modules/package/extra.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/cache-dependencies/managed-items-unsafe-cache/node_modules/package/index.js b/test/configCases/cache-dependencies/managed-items-unsafe-cache/node_modules/package/index.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/cache-dependencies/managed-items-unsafe-cache/node_modules/package/package.json b/test/configCases/cache-dependencies/managed-items-unsafe-cache/node_modules/package/package.json new file mode 100644 index 00000000000..75b93e3b25a --- /dev/null +++ b/test/configCases/cache-dependencies/managed-items-unsafe-cache/node_modules/package/package.json @@ -0,0 +1,4 @@ +{ + "name": "package", + "version": "1.0.0" +} diff --git a/test/configCases/cache-dependencies/managed-items-unsafe-cache/webpack.config.js b/test/configCases/cache-dependencies/managed-items-unsafe-cache/webpack.config.js new file mode 100644 index 00000000000..b9132adacad --- /dev/null +++ b/test/configCases/cache-dependencies/managed-items-unsafe-cache/webpack.config.js @@ -0,0 +1,29 @@ +const path = require("path"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + snapshot: { + managedPaths: [path.resolve(__dirname, "node_modules")] + }, + plugins: [ + compiler => { + compiler.hooks.done.tap("Test", ({ compilation }) => { + const fileDeps = Array.from(compilation.fileDependencies); + expect(fileDeps).toContain( + path.resolve(__dirname, "node_modules/package/index.js") + ); + expect(fileDeps).toContain( + path.resolve(__dirname, "node_modules/package/extra.js") + ); + expect(fileDeps).toContain( + path.resolve(__dirname, "node_modules/package/package.json") + ); + expect(fileDeps).toContain(path.resolve(__dirname, "extra.js")); + expect(fileDeps).toContain(path.resolve(__dirname, "index.js")); + }); + } + ], + module: { + unsafeCache: true + } +}; diff --git a/test/configCases/cache-dependencies/managed-items/extra.js b/test/configCases/cache-dependencies/managed-items/extra.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/cache-dependencies/managed-items/index.js b/test/configCases/cache-dependencies/managed-items/index.js new file mode 100644 index 00000000000..3b676a7c54d --- /dev/null +++ b/test/configCases/cache-dependencies/managed-items/index.js @@ -0,0 +1,3 @@ +import "./loader!package"; + +it("should compile and run the test in config", () => {}); diff --git a/test/configCases/cache-dependencies/managed-items/loader.js b/test/configCases/cache-dependencies/managed-items/loader.js new file mode 100644 index 00000000000..3a6935623f6 --- /dev/null +++ b/test/configCases/cache-dependencies/managed-items/loader.js @@ -0,0 +1,8 @@ +const path = require("path"); + +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { + this.addDependency(path.resolve(__dirname, "node_modules/package/extra.js")); + this.addDependency(path.resolve(__dirname, "extra.js")); + return source; +}; diff --git a/test/configCases/cache-dependencies/managed-items/node_modules/package/extra.js b/test/configCases/cache-dependencies/managed-items/node_modules/package/extra.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/cache-dependencies/managed-items/node_modules/package/index.js b/test/configCases/cache-dependencies/managed-items/node_modules/package/index.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/cache-dependencies/managed-items/node_modules/package/package.json b/test/configCases/cache-dependencies/managed-items/node_modules/package/package.json new file mode 100644 index 00000000000..75b93e3b25a --- /dev/null +++ b/test/configCases/cache-dependencies/managed-items/node_modules/package/package.json @@ -0,0 +1,4 @@ +{ + "name": "package", + "version": "1.0.0" +} diff --git a/test/configCases/cache-dependencies/managed-items/webpack.config.js b/test/configCases/cache-dependencies/managed-items/webpack.config.js new file mode 100644 index 00000000000..e79abba3493 --- /dev/null +++ b/test/configCases/cache-dependencies/managed-items/webpack.config.js @@ -0,0 +1,30 @@ +const path = require("path"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + snapshot: { + managedPaths: [path.resolve(__dirname, "node_modules")] + }, + plugins: [ + compiler => { + compiler.hooks.done.tap("Test", ({ compilation }) => { + const fileDeps = Array.from(compilation.fileDependencies); + expect(fileDeps).toContain( + path.resolve(__dirname, "node_modules/package/index.js") + ); + expect(fileDeps).toContain( + path.resolve(__dirname, "node_modules/package/extra.js") + ); + expect(fileDeps).toContain( + path.resolve(__dirname, "node_modules/package/package.json") + ); + expect(fileDeps).toContain(path.resolve(__dirname, "extra.js")); + expect(fileDeps).toContain(path.resolve(__dirname, "loader.js")); + expect(fileDeps).toContain(path.resolve(__dirname, "index.js")); + }); + } + ], + module: { + unsafeCache: false + } +}; diff --git a/test/configCases/cache-filesystem/multicompiler-mode-cache-1/index.js b/test/configCases/cache-filesystem/multicompiler-mode-cache-1/index.js new file mode 100644 index 00000000000..7fd9507bb82 --- /dev/null +++ b/test/configCases/cache-filesystem/multicompiler-mode-cache-1/index.js @@ -0,0 +1 @@ +it("should build", () => {}); diff --git a/test/configCases/cache-filesystem/multicompiler-mode-cache-1/webpack.config.js b/test/configCases/cache-filesystem/multicompiler-mode-cache-1/webpack.config.js new file mode 100644 index 00000000000..6de7ce1389f --- /dev/null +++ b/test/configCases/cache-filesystem/multicompiler-mode-cache-1/webpack.config.js @@ -0,0 +1,33 @@ +"use strict"; + +// default settings. should just work + +/** @type {import("../../../../").Configuration} */ +module.exports = [ + { + mode: "production", + entry: "./index", + cache: { + type: "filesystem", + name: "name2" + } + }, + { + mode: "production", + entry: "./index", + cache: { + type: "filesystem", + name: "name1" + } + }, + { + mode: "production", + entry: "./index", + cache: true + }, + { + mode: "production", + entry: "./index", + cache: true + } +]; diff --git a/test/configCases/cache-filesystem/multicompiler-mode-cache-2/index.js b/test/configCases/cache-filesystem/multicompiler-mode-cache-2/index.js new file mode 100644 index 00000000000..7fd9507bb82 --- /dev/null +++ b/test/configCases/cache-filesystem/multicompiler-mode-cache-2/index.js @@ -0,0 +1 @@ +it("should build", () => {}); diff --git a/test/configCases/cache-filesystem/multicompiler-mode-cache-2/webpack.config.js b/test/configCases/cache-filesystem/multicompiler-mode-cache-2/webpack.config.js new file mode 100644 index 00000000000..a829799c8c1 --- /dev/null +++ b/test/configCases/cache-filesystem/multicompiler-mode-cache-2/webpack.config.js @@ -0,0 +1,29 @@ +"use strict"; + +// no cache names + +/** @type {import("../../../../").Configuration} */ +module.exports = [ + { + mode: "production", + entry: "./index", + cache: { + type: "filesystem" + } + }, + { + mode: "production", + entry: "./index", + cache: { + type: "filesystem" + } + }, + { + name: "3rd compiler", + mode: "production", + entry: "./index", + cache: { + type: "filesystem" + } + } +]; diff --git a/test/configCases/cache-filesystem/multicompiler-mode-cache-3/index.js b/test/configCases/cache-filesystem/multicompiler-mode-cache-3/index.js new file mode 100644 index 00000000000..7fd9507bb82 --- /dev/null +++ b/test/configCases/cache-filesystem/multicompiler-mode-cache-3/index.js @@ -0,0 +1 @@ +it("should build", () => {}); diff --git a/test/configCases/cache-filesystem/multicompiler-mode-cache-3/warnings.js b/test/configCases/cache-filesystem/multicompiler-mode-cache-3/warnings.js new file mode 100644 index 00000000000..c6828833f80 --- /dev/null +++ b/test/configCases/cache-filesystem/multicompiler-mode-cache-3/warnings.js @@ -0,0 +1,4 @@ +module.exports = [ + /Please set unique "cache\.name" option/, + /Compiler with name "3rd compiler" doesn't use unique cache name/ +]; diff --git a/test/configCases/cache-filesystem/multicompiler-mode-cache-3/webpack.config.js b/test/configCases/cache-filesystem/multicompiler-mode-cache-3/webpack.config.js new file mode 100644 index 00000000000..31490f333c5 --- /dev/null +++ b/test/configCases/cache-filesystem/multicompiler-mode-cache-3/webpack.config.js @@ -0,0 +1,71 @@ +"use strict"; + +/** @typedef {import("../../../../").Compiler} Compiler */ +/** @typedef {import("../../../../").FileCacheOptions} FileCacheOptions */ + +// with explicit cache names + +/** @type {import("../../../../").Configuration} */ +module.exports = [ + { + mode: "production", + entry: "./index", + cache: { + name: "filesystem", + type: "filesystem" + }, + plugins: [ + { + /** + * @param {Compiler} compiler compiler + */ + apply(compiler) { + compiler.hooks.environment.tap("FixTestCachePlugin", () => { + /** @type {FileCacheOptions} */ + (compiler.options.cache).cacheLocation = + /** @type {string} */ + ( + /** @type {FileCacheOptions} */ + (compiler.options.cache).cacheLocation + ).replace(/filesystem$/, "filesystem-extra-1"); + }); + } + } + ] + }, + { + mode: "production", + entry: "./index", + cache: { + name: "filesystem", + type: "filesystem" + }, + plugins: [ + { + /** + * @param {Compiler} compiler compiler + */ + apply(compiler) { + compiler.hooks.environment.tap("FixTestCachePlugin", () => { + /** @type {FileCacheOptions} */ + (compiler.options.cache).cacheLocation = + /** @type {string} */ + ( + /** @type {FileCacheOptions} */ + (compiler.options.cache).cacheLocation + ).replace(/filesystem$/, "filesystem-extra-2"); + }); + } + } + ] + }, + { + name: "3rd compiler", + mode: "production", + entry: "./index", + cache: { + name: "filesystem", + type: "filesystem" + } + } +]; diff --git a/test/configCases/cache-filesystem/multicompiler-mode-cache-4/index.js b/test/configCases/cache-filesystem/multicompiler-mode-cache-4/index.js new file mode 100644 index 00000000000..7fd9507bb82 --- /dev/null +++ b/test/configCases/cache-filesystem/multicompiler-mode-cache-4/index.js @@ -0,0 +1 @@ +it("should build", () => {}); diff --git a/test/configCases/cache-filesystem/multicompiler-mode-cache-4/warnings.js b/test/configCases/cache-filesystem/multicompiler-mode-cache-4/warnings.js new file mode 100644 index 00000000000..d0bff241879 --- /dev/null +++ b/test/configCases/cache-filesystem/multicompiler-mode-cache-4/warnings.js @@ -0,0 +1 @@ +module.exports = [/Please set unique "cache\.name" option/]; diff --git a/test/configCases/cache-filesystem/multicompiler-mode-cache-4/webpack.config.js b/test/configCases/cache-filesystem/multicompiler-mode-cache-4/webpack.config.js new file mode 100644 index 00000000000..172e78757b1 --- /dev/null +++ b/test/configCases/cache-filesystem/multicompiler-mode-cache-4/webpack.config.js @@ -0,0 +1,45 @@ +"use strict"; + +// with explicit cache names + +/** @typedef {import("../../../../").Configuration} Configuration */ +/** @typedef {import("../../../../").Compiler} Compiler */ +/** @typedef {import("../../../../").FileCacheOptions} FileCacheOptions */ + +/** @type {Configuration} */ +module.exports = [ + { + mode: "production", + entry: "./index", + cache: { + name: "default", + type: "filesystem" + }, + plugins: [ + { + /** + * @param {Compiler} compiler compiler + */ + apply(compiler) { + compiler.hooks.environment.tap("FixTestCachePlugin", () => { + /** @type {FileCacheOptions} */ + (compiler.options.cache).cacheLocation = + /** @type {string} */ + ( + /** @type {FileCacheOptions} */ + (compiler.options.cache).cacheLocation + ).replace(/default$/, "default-extra"); + }); + } + } + ] + }, + { + mode: "production", + entry: "./index", + cache: { + name: "default", + type: "filesystem" + } + } +]; diff --git a/test/configCases/cache-filesystem/multicompiler-mode-cache-5/index.js b/test/configCases/cache-filesystem/multicompiler-mode-cache-5/index.js new file mode 100644 index 00000000000..7fd9507bb82 --- /dev/null +++ b/test/configCases/cache-filesystem/multicompiler-mode-cache-5/index.js @@ -0,0 +1 @@ +it("should build", () => {}); diff --git a/test/configCases/cache-filesystem/multicompiler-mode-cache-5/webpack.config.js b/test/configCases/cache-filesystem/multicompiler-mode-cache-5/webpack.config.js new file mode 100644 index 00000000000..d285e6a9a2a --- /dev/null +++ b/test/configCases/cache-filesystem/multicompiler-mode-cache-5/webpack.config.js @@ -0,0 +1,22 @@ +"use strict"; + +// no cache names + +/** @type {import("../../../../").Configuration} */ +module.exports = [ + { + mode: "production", + entry: "./index", + cache: { + type: "filesystem", + name: "default" + } + }, + { + mode: "production", + entry: "./index", + cache: { + type: "filesystem" + } + } +]; diff --git a/test/configCases/cache-filesystem/multicompiler-mode-cache-6/index.js b/test/configCases/cache-filesystem/multicompiler-mode-cache-6/index.js new file mode 100644 index 00000000000..7fd9507bb82 --- /dev/null +++ b/test/configCases/cache-filesystem/multicompiler-mode-cache-6/index.js @@ -0,0 +1 @@ +it("should build", () => {}); diff --git a/test/configCases/cache-filesystem/multicompiler-mode-cache-6/webpack.config.js b/test/configCases/cache-filesystem/multicompiler-mode-cache-6/webpack.config.js new file mode 100644 index 00000000000..ee0c98d205c --- /dev/null +++ b/test/configCases/cache-filesystem/multicompiler-mode-cache-6/webpack.config.js @@ -0,0 +1,22 @@ +"use strict"; + +// no cache names + +/** @type {import("../../../../").Configuration} */ +module.exports = [ + { + mode: "production", + entry: "./index", + cache: { + type: "filesystem" + } + }, + { + mode: "production", + entry: "./index", + cache: { + type: "filesystem", + name: "default" + } + } +]; diff --git a/test/configCases/chunk-graph/issue-15173/commonAsync/index.js b/test/configCases/chunk-graph/issue-15173/commonAsync/index.js new file mode 100644 index 00000000000..35d239bab0b --- /dev/null +++ b/test/configCases/chunk-graph/issue-15173/commonAsync/index.js @@ -0,0 +1,5 @@ +import { commonUtil } from "../commonSync"; + +export function getCommonAsync() { + return commonUtil(); +} diff --git a/test/configCases/chunk-graph/issue-15173/commonSync/index.js b/test/configCases/chunk-graph/issue-15173/commonSync/index.js new file mode 100644 index 00000000000..65d10feef9a --- /dev/null +++ b/test/configCases/chunk-graph/issue-15173/commonSync/index.js @@ -0,0 +1,5 @@ +var EmptyObj = {}; + +export function commonUtil() { + return EmptyObj; +} diff --git a/test/configCases/chunk-graph/issue-15173/entries/entryA.js b/test/configCases/chunk-graph/issue-15173/entries/entryA.js new file mode 100644 index 00000000000..a09b91e2e6e --- /dev/null +++ b/test/configCases/chunk-graph/issue-15173/entries/entryA.js @@ -0,0 +1,19 @@ +import { commonUtil } from "../commonSync"; + +export default { + doSomethingInEntryA() { + return commonUtil("entryA"); + }, + getFeatureA() { + return import(/* webpackChunkName: 'featureA' */ "../featureA"); + }, + getFeatureB() { + return import(/* webpackChunkName: 'featureB' */ "../featureB"); + } +}; + +it("common async should contain self only", () => { + expect( + __STATS__.chunks.find(c => c.names.includes("commonAsync")).modules + ).toHaveLength(1); +}); diff --git a/test/configCases/chunk-graph/issue-15173/entries/entryB.js b/test/configCases/chunk-graph/issue-15173/entries/entryB.js new file mode 100644 index 00000000000..e96fa8920c5 --- /dev/null +++ b/test/configCases/chunk-graph/issue-15173/entries/entryB.js @@ -0,0 +1,10 @@ +import { commonUtil } from "../commonSync"; + +export default { + doSomethingInEntryB() { + return commonUtil("entryB"); + }, + getFeatureC() { + return import(/* webpackChunkName: 'featureC' */ "../featureC"); + } +}; diff --git a/test/configCases/chunk-graph/issue-15173/featureA/index.js b/test/configCases/chunk-graph/issue-15173/featureA/index.js new file mode 100644 index 00000000000..1da55f5d93b --- /dev/null +++ b/test/configCases/chunk-graph/issue-15173/featureA/index.js @@ -0,0 +1,5 @@ +import(/* webpackChunkName: 'commonAsync' */ "../commonAsync"); + +export function getFeatureA() { + return "featureA"; +} diff --git a/test/configCases/chunk-graph/issue-15173/featureB/index.js b/test/configCases/chunk-graph/issue-15173/featureB/index.js new file mode 100644 index 00000000000..ea15e118f38 --- /dev/null +++ b/test/configCases/chunk-graph/issue-15173/featureB/index.js @@ -0,0 +1,5 @@ +import(/* webpackChunkName: 'commonAsync' */ "../commonAsync"); + +export function getFeatureB() { + return "featureB"; +} diff --git a/test/configCases/chunk-graph/issue-15173/featureC/index.js b/test/configCases/chunk-graph/issue-15173/featureC/index.js new file mode 100644 index 00000000000..41067715217 --- /dev/null +++ b/test/configCases/chunk-graph/issue-15173/featureC/index.js @@ -0,0 +1,5 @@ +import(/* webpackChunkName: 'commonAsync' */ "../commonAsync"); + +export function getFeatureC() { + return "featuraC"; +} diff --git a/test/configCases/chunk-graph/issue-15173/test.config.js b/test/configCases/chunk-graph/issue-15173/test.config.js new file mode 100644 index 00000000000..6b83bf35112 --- /dev/null +++ b/test/configCases/chunk-graph/issue-15173/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["entryA.js"]; + } +}; diff --git a/test/configCases/chunk-graph/issue-15173/webpack.config.js b/test/configCases/chunk-graph/issue-15173/webpack.config.js new file mode 100644 index 00000000000..b5e57a94a20 --- /dev/null +++ b/test/configCases/chunk-graph/issue-15173/webpack.config.js @@ -0,0 +1,9 @@ +module.exports = { + entry: { + entryA: "./entries/entryA.js", + entryB: "./entries/entryB.js" + }, + output: { + filename: "[name].js" + } +}; diff --git a/test/configCases/chunk-graph/issue-17989/entry-a.js b/test/configCases/chunk-graph/issue-17989/entry-a.js new file mode 100644 index 00000000000..18c5225b738 --- /dev/null +++ b/test/configCases/chunk-graph/issue-17989/entry-a.js @@ -0,0 +1,10 @@ +import loadModule from "./shared" + +it("should not have a.add from entry-a + entry-b", () => { + return loadModule().then(module => { + const { arg } = module; + expect(arg).toBe(42) + expect(typeof __webpack_modules__["./util2.js"]).toBe("function") + expect(require.cache["./util2.js"]).toBe(undefined); // not loaded on __webpack_require__.c["./util2.js"] + }); +}); diff --git a/test/configCases/chunk-graph/issue-17989/entry-b.js b/test/configCases/chunk-graph/issue-17989/entry-b.js new file mode 100644 index 00000000000..f47830e8c37 --- /dev/null +++ b/test/configCases/chunk-graph/issue-17989/entry-b.js @@ -0,0 +1,17 @@ +it("should have util2.js in util chunk", () => { + return import("./shared") + .then(({ default: loadModule }) => loadModule()) + .then((module) => { + let arg = module.arg; + expect(arg).toBe(42) + expect(typeof __webpack_modules__["./util2.js"]).toBe("function") + expect(typeof require.cache["./util2.js"]).toBe("object"); // loaded on __webpack_require__.c["./util2.js"] + return arg + }) + .then(arg => { + return import("./util1").then(module => { + let res = module.f(arg); + expect(res).toBe(84); + }) + }) +}); diff --git a/test/configCases/chunk-graph/issue-17989/shared.js b/test/configCases/chunk-graph/issue-17989/shared.js new file mode 100644 index 00000000000..984113dd888 --- /dev/null +++ b/test/configCases/chunk-graph/issue-17989/shared.js @@ -0,0 +1 @@ +export default () => import("./util") diff --git a/test/configCases/chunk-graph/issue-17989/test.config.js b/test/configCases/chunk-graph/issue-17989/test.config.js new file mode 100644 index 00000000000..fa813148fb8 --- /dev/null +++ b/test/configCases/chunk-graph/issue-17989/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["a.js", "b.js"]; + } +}; diff --git a/test/configCases/chunk-graph/issue-17989/util.js b/test/configCases/chunk-graph/issue-17989/util.js new file mode 100644 index 00000000000..70f7445abfe --- /dev/null +++ b/test/configCases/chunk-graph/issue-17989/util.js @@ -0,0 +1 @@ +export { arg } from './util1' diff --git a/test/configCases/chunk-graph/issue-17989/util1.js b/test/configCases/chunk-graph/issue-17989/util1.js new file mode 100644 index 00000000000..092f75a8fc0 --- /dev/null +++ b/test/configCases/chunk-graph/issue-17989/util1.js @@ -0,0 +1,2 @@ +export const arg = 42 +export { f } from "./util2" diff --git a/test/configCases/chunk-graph/issue-17989/util2.js b/test/configCases/chunk-graph/issue-17989/util2.js new file mode 100644 index 00000000000..95e23faf57c --- /dev/null +++ b/test/configCases/chunk-graph/issue-17989/util2.js @@ -0,0 +1 @@ +export const f = a => a * 2 diff --git a/test/configCases/chunk-graph/issue-17989/webpack.config.js b/test/configCases/chunk-graph/issue-17989/webpack.config.js new file mode 100644 index 00000000000..0410aaf3e99 --- /dev/null +++ b/test/configCases/chunk-graph/issue-17989/webpack.config.js @@ -0,0 +1,17 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + a: "./entry-a", + b: "./entry-b" + }, + optimization: { + sideEffects: true, + providedExports: true, + usedExports: true, + concatenateModules: false, + moduleIds: "named" + }, + output: { + filename: "[name].js" + } +}; diff --git a/test/configCases/chunk-graph/issue-9634/async-b.js b/test/configCases/chunk-graph/issue-9634/async-b.js new file mode 100644 index 00000000000..4aac7c43c3e --- /dev/null +++ b/test/configCases/chunk-graph/issue-9634/async-b.js @@ -0,0 +1 @@ +export default import(/* webpackChunkName: "shared" */ "./shared"); diff --git a/test/configCases/chunk-graph/issue-9634/async-b2.js b/test/configCases/chunk-graph/issue-9634/async-b2.js new file mode 100644 index 00000000000..c002386be38 --- /dev/null +++ b/test/configCases/chunk-graph/issue-9634/async-b2.js @@ -0,0 +1 @@ +export default import(/* webpackChunkName: "async-b" */ "./async-b"); diff --git a/test/configCases/chunk-graph/issue-9634/entry-a.js b/test/configCases/chunk-graph/issue-9634/entry-a.js new file mode 100644 index 00000000000..67559019b2d --- /dev/null +++ b/test/configCases/chunk-graph/issue-9634/entry-a.js @@ -0,0 +1,13 @@ +import leaf from "./leaf"; + +it("should include the leaf module", () => { + expect(leaf).toBe("ok"); +}); + +it("should load the leaf module from a", () => { + return import(/* webpackChunkName: "shared" */ "./shared").then(shared => { + return shared.default.then(module => { + expect(module.default).toBe("ok"); + }); + }); +}); diff --git a/test/configCases/chunk-graph/issue-9634/entry-b.js b/test/configCases/chunk-graph/issue-9634/entry-b.js new file mode 100644 index 00000000000..356285360db --- /dev/null +++ b/test/configCases/chunk-graph/issue-9634/entry-b.js @@ -0,0 +1,11 @@ +it("should load the leaf module from b", () => { + return import(/* webpackChunkName: "async-b2" */ "./async-b2").then(asy => { + return asy.default.then(asy => { + return asy.default.then(shared => { + return shared.default.then(module => { + expect(module.default).toBe("ok"); + }); + }); + }); + }); +}); diff --git a/test/configCases/chunk-graph/issue-9634/leaf.js b/test/configCases/chunk-graph/issue-9634/leaf.js new file mode 100644 index 00000000000..5c6b89abfc8 --- /dev/null +++ b/test/configCases/chunk-graph/issue-9634/leaf.js @@ -0,0 +1 @@ +export default "ok"; diff --git a/test/configCases/chunk-graph/issue-9634/module.js b/test/configCases/chunk-graph/issue-9634/module.js new file mode 100644 index 00000000000..6f1d5125a62 --- /dev/null +++ b/test/configCases/chunk-graph/issue-9634/module.js @@ -0,0 +1,3 @@ +import leaf from "./leaf"; + +export default leaf; diff --git a/test/configCases/chunk-graph/issue-9634/shared.js b/test/configCases/chunk-graph/issue-9634/shared.js new file mode 100644 index 00000000000..23ced5ed605 --- /dev/null +++ b/test/configCases/chunk-graph/issue-9634/shared.js @@ -0,0 +1 @@ +export default import(/* webpackChunkName: "module" */ "./module"); diff --git a/test/configCases/chunk-graph/issue-9634/test.config.js b/test/configCases/chunk-graph/issue-9634/test.config.js new file mode 100644 index 00000000000..fa813148fb8 --- /dev/null +++ b/test/configCases/chunk-graph/issue-9634/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["a.js", "b.js"]; + } +}; diff --git a/test/configCases/chunk-graph/issue-9634/webpack.config.js b/test/configCases/chunk-graph/issue-9634/webpack.config.js new file mode 100644 index 00000000000..42a875cba48 --- /dev/null +++ b/test/configCases/chunk-graph/issue-9634/webpack.config.js @@ -0,0 +1,10 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + b: "./entry-b", + a: "./entry-a" + }, + output: { + filename: "[name].js" + } +}; diff --git a/test/configCases/chunk-graph/rewalk-chunk/index.js b/test/configCases/chunk-graph/rewalk-chunk/index.js new file mode 100644 index 00000000000..cc7a8306bd3 --- /dev/null +++ b/test/configCases/chunk-graph/rewalk-chunk/index.js @@ -0,0 +1,7 @@ +it('should load module c', async () => { + const m1 = await (await import('./module-b')).default + const m2 = await import(/*webpackChunkName: 'module'*/ './module-a') + + expect(m1.default).toBe('module-c') + expect(m2.default).toBe('module-a') +}) diff --git a/test/configCases/chunk-graph/rewalk-chunk/module-a.js b/test/configCases/chunk-graph/rewalk-chunk/module-a.js new file mode 100644 index 00000000000..4d71683571e --- /dev/null +++ b/test/configCases/chunk-graph/rewalk-chunk/module-a.js @@ -0,0 +1 @@ +export default 'module-a' diff --git a/test/configCases/chunk-graph/rewalk-chunk/module-b.js b/test/configCases/chunk-graph/rewalk-chunk/module-b.js new file mode 100644 index 00000000000..8993da56ef9 --- /dev/null +++ b/test/configCases/chunk-graph/rewalk-chunk/module-b.js @@ -0,0 +1 @@ +export default import(/*webpackChunkName: 'module'*/ './module-c') diff --git a/test/configCases/chunk-graph/rewalk-chunk/module-c.js b/test/configCases/chunk-graph/rewalk-chunk/module-c.js new file mode 100644 index 00000000000..8b2ef5ece16 --- /dev/null +++ b/test/configCases/chunk-graph/rewalk-chunk/module-c.js @@ -0,0 +1 @@ +export default 'module-c' diff --git a/test/configCases/chunk-graph/rewalk-chunk/shared.js b/test/configCases/chunk-graph/rewalk-chunk/shared.js new file mode 100644 index 00000000000..c49b96f60da --- /dev/null +++ b/test/configCases/chunk-graph/rewalk-chunk/shared.js @@ -0,0 +1 @@ +export default import(/* webpackChunkName: "module" */ "./module-a"); diff --git a/test/configCases/chunk-graph/rewalk-chunk/test.config.js b/test/configCases/chunk-graph/rewalk-chunk/test.config.js new file mode 100644 index 00000000000..0c4cdb95323 --- /dev/null +++ b/test/configCases/chunk-graph/rewalk-chunk/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["main.js"]; + } +}; diff --git a/test/configCases/chunk-graph/rewalk-chunk/webpack.config.js b/test/configCases/chunk-graph/rewalk-chunk/webpack.config.js new file mode 100644 index 00000000000..57ec6f71520 --- /dev/null +++ b/test/configCases/chunk-graph/rewalk-chunk/webpack.config.js @@ -0,0 +1,9 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + main: "./index.js" + }, + output: { + filename: "[name].js" + } +}; diff --git a/test/configCases/chunk-index/issue-18008/A.js b/test/configCases/chunk-index/issue-18008/A.js new file mode 100644 index 00000000000..38498ca8aab --- /dev/null +++ b/test/configCases/chunk-index/issue-18008/A.js @@ -0,0 +1,3 @@ +import './m.css' + +export default import(/* webpackChunkName: 'shared' */ './shared') diff --git a/test/configCases/chunk-index/issue-18008/B-2.js b/test/configCases/chunk-index/issue-18008/B-2.js new file mode 100644 index 00000000000..d76708775e3 --- /dev/null +++ b/test/configCases/chunk-index/issue-18008/B-2.js @@ -0,0 +1 @@ +export default import(/* webpackChunkName: 'shared' */ './shared') diff --git a/test/configCases/chunk-index/issue-18008/B.js b/test/configCases/chunk-index/issue-18008/B.js new file mode 100644 index 00000000000..06d9beae119 --- /dev/null +++ b/test/configCases/chunk-index/issue-18008/B.js @@ -0,0 +1 @@ +export default import(/* webpackChunkName: 'B-2' */ './B-2') diff --git a/test/configCases/chunk-index/issue-18008/m.css b/test/configCases/chunk-index/issue-18008/m.css new file mode 100644 index 00000000000..42109d1e8e6 --- /dev/null +++ b/test/configCases/chunk-index/issue-18008/m.css @@ -0,0 +1,3 @@ +.m { + color: red; +} \ No newline at end of file diff --git a/test/configCases/chunk-index/issue-18008/main.js b/test/configCases/chunk-index/issue-18008/main.js new file mode 100644 index 00000000000..db0004aced8 --- /dev/null +++ b/test/configCases/chunk-index/issue-18008/main.js @@ -0,0 +1,4 @@ +it('should compile', async () => { + await (await import(/* webpackChunkName: 'A' */ './A')).default + await (await import(/* webpackChunkName: 'B' */ './B')).default +}) diff --git a/test/configCases/chunk-index/issue-18008/n.css b/test/configCases/chunk-index/issue-18008/n.css new file mode 100644 index 00000000000..d98c8a002b6 --- /dev/null +++ b/test/configCases/chunk-index/issue-18008/n.css @@ -0,0 +1,3 @@ +.n { + color: red; +} \ No newline at end of file diff --git a/test/configCases/chunk-index/issue-18008/shared.js b/test/configCases/chunk-index/issue-18008/shared.js new file mode 100644 index 00000000000..fa12217397f --- /dev/null +++ b/test/configCases/chunk-index/issue-18008/shared.js @@ -0,0 +1,2 @@ +import './m.css' +import './n.css' diff --git a/test/configCases/chunk-index/issue-18008/test.config.js b/test/configCases/chunk-index/issue-18008/test.config.js new file mode 100644 index 00000000000..52779458946 --- /dev/null +++ b/test/configCases/chunk-index/issue-18008/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["main.js", "A.js", "shared.js", "B.js", "B-2.js"]; + } +}; diff --git a/test/configCases/chunk-index/issue-18008/webpack.config.js b/test/configCases/chunk-index/issue-18008/webpack.config.js new file mode 100644 index 00000000000..f066baaf7ed --- /dev/null +++ b/test/configCases/chunk-index/issue-18008/webpack.config.js @@ -0,0 +1,66 @@ +/** @typedef {import("../../../../types").Compilation} Compilation */ +/** @typedef {import("../../../../types").Module} Module */ +/** @type {import("../../../../types").Configuration} */ +module.exports = { + entry: { + main: "./main.js" + }, + output: { + filename: "[name].js" + }, + optimization: { + splitChunks: false, + chunkIds: "named" + }, + plugins: [ + function () { + /** + * @param {Compilation} compilation compilation + * @returns {void} + */ + const handler = compilation => { + compilation.hooks.afterSeal.tap("testcase", () => { + /** @type {Record} */ + const data = {}; + for (const [name, group] of compilation.namedChunkGroups) { + /** @type {Map} */ + const modules = new Map(); + for (const chunk of group.chunks) { + for (const module of compilation.chunkGraph.getChunkModulesIterable( + chunk + )) { + const preOrder = group.getModulePreOrderIndex(module); + if (typeof preOrder === "number") { + modules.set(module, preOrder); + } + } + } + const sortedModules = Array.from(modules).sort( + (a, b) => a[1] - b[1] + ); + const text = sortedModules + .map( + ([m, index]) => + `${index}: ${m.readableIdentifier( + compilation.requestShortener + )}` + ) + .join(", "); + data[`${name}Index`] = text; + } + expect(data).toEqual({ + AIndex: "0: ./A.js, 1: css ./m.css", + "B-2Index": "0: ./B-2.js", + BIndex: "0: ./B.js", + mainIndex: "0: ./main.js", + sharedIndex: "1: css ./m.css, 2: css ./n.css" + }); + }); + }; + this.hooks.compilation.tap("testcase", handler); + } + ], + experiments: { + css: true + } +}; diff --git a/test/configCases/chunk-index/order-multiple-entries/async.js b/test/configCases/chunk-index/order-multiple-entries/async.js index e69de29bb2d..122ec5d2d79 100644 --- a/test/configCases/chunk-index/order-multiple-entries/async.js +++ b/test/configCases/chunk-index/order-multiple-entries/async.js @@ -0,0 +1 @@ +console.log.bind(console); diff --git a/test/configCases/chunk-index/order-multiple-entries/c.js b/test/configCases/chunk-index/order-multiple-entries/c.js index e69de29bb2d..122ec5d2d79 100644 --- a/test/configCases/chunk-index/order-multiple-entries/c.js +++ b/test/configCases/chunk-index/order-multiple-entries/c.js @@ -0,0 +1 @@ +console.log.bind(console); diff --git a/test/configCases/chunk-index/order-multiple-entries/entry1.js b/test/configCases/chunk-index/order-multiple-entries/entry1.js index 32a5fa8c867..ff832a0bcad 100644 --- a/test/configCases/chunk-index/order-multiple-entries/entry1.js +++ b/test/configCases/chunk-index/order-multiple-entries/entry1.js @@ -1,6 +1,4 @@ import "./a"; -import(/* webpackChunkName: "async" */ "./async"); +it("should compile", () => import(/* webpackChunkName: "async" */ "./async")); import "./b"; import "./c"; - -it("should compile", () => {}); diff --git a/test/configCases/chunk-index/order-multiple-entries/entry2.js b/test/configCases/chunk-index/order-multiple-entries/entry2.js index aa9ec2317ed..92f9311d3d5 100644 --- a/test/configCases/chunk-index/order-multiple-entries/entry2.js +++ b/test/configCases/chunk-index/order-multiple-entries/entry2.js @@ -1,6 +1,4 @@ import "./c"; -import(/* webpackChunkName: "async" */ "./async"); +it("should compile", () => import(/* webpackChunkName: "async" */ "./async")); import "./b"; import "./a"; - -it("should compile", () => {}); diff --git a/test/configCases/chunk-index/order-multiple-entries/shared.js b/test/configCases/chunk-index/order-multiple-entries/shared.js index e69de29bb2d..122ec5d2d79 100644 --- a/test/configCases/chunk-index/order-multiple-entries/shared.js +++ b/test/configCases/chunk-index/order-multiple-entries/shared.js @@ -0,0 +1 @@ +console.log.bind(console); diff --git a/test/configCases/chunk-index/order-multiple-entries/test.config.js b/test/configCases/chunk-index/order-multiple-entries/test.config.js index 65c1791bce3..76c7ddf80f5 100644 --- a/test/configCases/chunk-index/order-multiple-entries/test.config.js +++ b/test/configCases/chunk-index/order-multiple-entries/test.config.js @@ -1,5 +1,5 @@ module.exports = { - findBundle: function(i, options) { + findBundle(i, options) { return ["entry1.js", "entry2.js"]; } }; diff --git a/test/configCases/chunk-index/order-multiple-entries/webpack.config.js b/test/configCases/chunk-index/order-multiple-entries/webpack.config.js index 29d22978153..00b452aa9ef 100644 --- a/test/configCases/chunk-index/order-multiple-entries/webpack.config.js +++ b/test/configCases/chunk-index/order-multiple-entries/webpack.config.js @@ -1,6 +1,7 @@ -/** @typedef {import("../../../../lib/Compilation")} Compilation */ -/** @typedef {import("../../../../lib/Module")} Module */ +/** @typedef {import("../../../../").Compilation} Compilation */ +/** @typedef {import("../../../../").Module} Module */ +/** @type {import("../../../../").Configuration} */ module.exports = { entry: { entry1: "./entry1", @@ -9,31 +10,45 @@ module.exports = { output: { filename: "[name].js" }, + optimization: { + concatenateModules: false + }, plugins: [ - function() { + function () { /** * @param {Compilation} compilation compilation * @returns {void} */ const handler = compilation => { + const moduleGraph = compilation.moduleGraph; compilation.hooks.afterSeal.tap("testcase", () => { + /** @type {Record} */ const data = {}; for (const [name, group] of compilation.namedChunkGroups) { /** @type {Map} */ const modules = new Map(); + /** @type {Map} */ const modules2 = new Map(); for (const chunk of group.chunks) { - for (const module of chunk.modulesIterable) { - modules.set(module, group.getModuleIndex(module)); - modules2.set(module, group.getModuleIndex2(module)); + for (const module of compilation.chunkGraph.getChunkModulesIterable( + chunk + )) { + const preOrder = group.getModulePreOrderIndex(module); + if (typeof preOrder === "number") { + modules.set(module, preOrder); + } + const postOrder = group.getModulePostOrderIndex(module); + if (typeof postOrder === "number") { + modules2.set(module, postOrder); + } } } - const sortedModules = Array.from(modules).sort((a, b) => { - return a[1] - b[1]; - }); - const sortedModules2 = Array.from(modules2).sort((a, b) => { - return a[1] - b[1]; - }); + const sortedModules = Array.from(modules).sort( + (a, b) => a[1] - b[1] + ); + const sortedModules2 = Array.from(modules2).sort( + (a, b) => a[1] - b[1] + ); const text = sortedModules .map( ([m, index]) => @@ -50,8 +65,8 @@ module.exports = { )}` ) .join(", "); - data[name + "Index"] = text; - data[name + "Index2"] = text2; + data[`${name}Index`] = text; + data[`${name}Index2`] = text2; } expect(data).toEqual({ entry1Index: @@ -65,30 +80,40 @@ module.exports = { asyncIndex: "0: ./async.js", asyncIndex2: "0: ./async.js" }); - const indicies = compilation.modules - .slice() - .sort((a, b) => a.index - b.index) + const indices = Array.from(compilation.modules) .map( m => - `${m.index}: ${m.readableIdentifier( - compilation.requestShortener - )}` + /** @type {[number, Module]} */ ([ + moduleGraph.getPreOrderIndex(m), + m + ]) + ) + .filter(p => typeof p[0] === "number") + .sort((a, b) => a[0] - b[0]) + .map( + ([i, m]) => + `${i}: ${m.readableIdentifier(compilation.requestShortener)}` ) .join(", "); - const indicies2 = compilation.modules - .slice() - .sort((a, b) => a.index2 - b.index2) + const indices2 = Array.from(compilation.modules) .map( m => - `${m.index2}: ${m.readableIdentifier( - compilation.requestShortener - )}` + /** @type {[number, Module]} */ ([ + moduleGraph.getPostOrderIndex(m), + m + ]) + ) + .filter(p => typeof p[0] === "number") + .sort((a, b) => a[0] - b[0]) + .map( + ([i, m]) => + `${i}: ${m.readableIdentifier(compilation.requestShortener)}` ) .join(", "); - expect(indicies).toEqual( + expect(indices).toEqual( "0: ./entry1.js, 1: ./a.js, 2: ./shared.js, 3: ./b.js, 4: ./c.js, 5: ./entry2.js, 6: ./async.js" ); - expect(indicies2).toEqual( + expect(indices2).toEqual( "0: ./shared.js, 1: ./a.js, 2: ./b.js, 3: ./c.js, 4: ./entry1.js, 5: ./entry2.js, 6: ./async.js" ); }); diff --git a/test/configCases/chunk-index/recalc-index/a.css b/test/configCases/chunk-index/recalc-index/a.css new file mode 100644 index 00000000000..5451a331f9c --- /dev/null +++ b/test/configCases/chunk-index/recalc-index/a.css @@ -0,0 +1,3 @@ +.a { + color: red; +} diff --git a/test/configCases/chunk-index/recalc-index/b.css b/test/configCases/chunk-index/recalc-index/b.css new file mode 100644 index 00000000000..c209e56a74e --- /dev/null +++ b/test/configCases/chunk-index/recalc-index/b.css @@ -0,0 +1,5 @@ +@import './a.css'; + +.b { + color: blue; +} diff --git a/test/configCases/chunk-index/recalc-index/dynamic.js b/test/configCases/chunk-index/recalc-index/dynamic.js new file mode 100644 index 00000000000..08cf4e01b3a --- /dev/null +++ b/test/configCases/chunk-index/recalc-index/dynamic.js @@ -0,0 +1,2 @@ +import './b.css' +import './a.css' diff --git a/test/configCases/chunk-index/recalc-index/index.js b/test/configCases/chunk-index/recalc-index/index.js new file mode 100644 index 00000000000..aedaa047530 --- /dev/null +++ b/test/configCases/chunk-index/recalc-index/index.js @@ -0,0 +1,3 @@ +it('should compile', async () => { + await import(/* webpackChunkName: 'dynamic' */ './dynamic') +}) diff --git a/test/configCases/chunk-index/recalc-index/webpack.config.js b/test/configCases/chunk-index/recalc-index/webpack.config.js new file mode 100644 index 00000000000..ea9ef52d7db --- /dev/null +++ b/test/configCases/chunk-index/recalc-index/webpack.config.js @@ -0,0 +1,56 @@ +/** @typedef {import("../../../../types").Compilation} Compilation */ +/** @typedef {import("../../../../types").Module} Module */ +/** @type {import("../../../../types").Configuration} */ +module.exports = { + entry: { + main: "./index.js" + }, + experiments: { + css: true + }, + plugins: [ + function () { + /** + * @param {Compilation} compilation compilation + * @returns {void} + */ + const handler = compilation => { + compilation.hooks.afterSeal.tap("testcase", () => { + /** @type {Record} */ + const data = {}; + for (const [name, group] of compilation.namedChunkGroups) { + /** @type {Map} */ + const modules = new Map(); + for (const chunk of group.chunks) { + for (const module of compilation.chunkGraph.getChunkModulesIterable( + chunk + )) { + const postOrder = group.getModulePostOrderIndex(module); + if (typeof postOrder === "number") { + modules.set(module, postOrder); + } + } + } + const sortedModules = Array.from(modules).sort( + (a, b) => a[1] - b[1] + ); + const text = sortedModules + .map( + ([m, index]) => + `${index}: ${m.readableIdentifier( + compilation.requestShortener + )}` + ) + .join(", "); + data[`${name}Index`] = text; + } + expect(data).toEqual({ + dynamicIndex: "0: css ./a.css, 1: css ./b.css", + mainIndex: "0: ./index.js" + }); + }); + }; + this.hooks.compilation.tap("testcase", handler); + } + ] +}; diff --git a/test/configCases/clean/dry/index.js b/test/configCases/clean/dry/index.js new file mode 100644 index 00000000000..bbd9de4153f --- /dev/null +++ b/test/configCases/clean/dry/index.js @@ -0,0 +1 @@ +it("should compile and run the test", function() {}); diff --git a/test/configCases/clean/dry/webpack.config.js b/test/configCases/clean/dry/webpack.config.js new file mode 100644 index 00000000000..7a1b1fb1d62 --- /dev/null +++ b/test/configCases/clean/dry/webpack.config.js @@ -0,0 +1,48 @@ +const fs = require("fs"); +const path = require("path"); +const { RawSource } = require("webpack-sources"); +const readDir = require("../enabled/readdir"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + clean: { + dry: true + } + }, + plugins: [ + compiler => { + compiler.hooks.thisCompilation.tap("Test", compilation => { + compilation.hooks.processAssets.tap("Test", assets => { + const outputPath = compilation.getPath(compiler.outputPath, {}); + const customDir = path.join(outputPath, "this/dir/should/be/removed"); + fs.mkdirSync(customDir, { recursive: true }); + fs.writeFileSync(path.join(customDir, "file.ext"), ""); + assets["this/dir/should/not/be/removed/file.ext"] = new RawSource(""); + }); + }); + compiler.hooks.afterEmit.tap("Test", compilation => { + const outputPath = compilation.getPath(compiler.outputPath, {}); + expect(readDir(outputPath)).toMatchInlineSnapshot(` + Object { + "directories": Array [ + "this", + "this/dir", + "this/dir/should", + "this/dir/should/not", + "this/dir/should/not/be", + "this/dir/should/not/be/removed", + "this/dir/should/be", + "this/dir/should/be/removed", + ], + "files": Array [ + "this/dir/should/not/be/removed/file.ext", + "this/dir/should/be/removed/file.ext", + "bundle0.js", + ], + } + `); + }); + } + ] +}; diff --git a/test/configCases/clean/enabled/index.js b/test/configCases/clean/enabled/index.js new file mode 100644 index 00000000000..bbd9de4153f --- /dev/null +++ b/test/configCases/clean/enabled/index.js @@ -0,0 +1 @@ +it("should compile and run the test", function() {}); diff --git a/test/configCases/clean/enabled/readdir.js b/test/configCases/clean/enabled/readdir.js new file mode 100644 index 00000000000..7724b597494 --- /dev/null +++ b/test/configCases/clean/enabled/readdir.js @@ -0,0 +1,48 @@ +const fs = require('fs'); +const path = require('path'); + +/** + * @param {string} path path + * @returns {string} path + */ +function handlePath(path) { + return path.replace(/\\/g, "/"); +} + +/** + * @param {string} from from + * @returns {{ files: string[], directories: string[] }} + */ +module.exports = function readDir(from) { + /** @type {string[]} */ + const collectedFiles = []; + /** @type {string[]} */ + const collectedDirectories = []; + const stack = [from]; + let cursor; + + while ((cursor = stack.pop())) { + const stat = fs.statSync(cursor); + + if (stat.isDirectory()) { + const items = fs.readdirSync(cursor); + + if (from !== cursor) { + const relative = path.relative(from, cursor); + collectedDirectories.push(handlePath(relative)); + } + + for (let i = 0; i < items.length; i++) { + stack.push(path.join(cursor, items[i])); + } + } else { + const relative = path.relative(from, cursor); + collectedFiles.push(handlePath(relative)); + } + } + + return { + files: collectedFiles, + directories: collectedDirectories + }; +} diff --git a/test/configCases/clean/enabled/webpack.config.js b/test/configCases/clean/enabled/webpack.config.js new file mode 100644 index 00000000000..16575014af3 --- /dev/null +++ b/test/configCases/clean/enabled/webpack.config.js @@ -0,0 +1,50 @@ +const fs = require("fs"); +const path = require("path"); +const { RawSource } = require("webpack-sources"); +const readDir = require("./readdir"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + clean: true + }, + plugins: [ + compiler => { + let once = true; + compiler.hooks.thisCompilation.tap("Test", compilation => { + compilation.hooks.processAssets.tap("Test", assets => { + if (once) { + const outputPath = compilation.getPath(compiler.outputPath, {}); + const customDir = path.join( + outputPath, + "this/dir/should/be/removed" + ); + fs.mkdirSync(customDir, { recursive: true }); + fs.writeFileSync(path.join(customDir, "file.ext"), ""); + once = false; + } + assets["this/dir/should/not/be/removed/file.ext"] = new RawSource(""); + }); + }); + compiler.hooks.afterEmit.tap("Test", compilation => { + const outputPath = compilation.getPath(compiler.outputPath, {}); + expect(readDir(outputPath)).toMatchInlineSnapshot(` + Object { + "directories": Array [ + "this", + "this/dir", + "this/dir/should", + "this/dir/should/not", + "this/dir/should/not/be", + "this/dir/should/not/be/removed", + ], + "files": Array [ + "this/dir/should/not/be/removed/file.ext", + "bundle0.js", + ], + } + `); + }); + } + ] +}; diff --git a/test/configCases/clean/ignore-fn/index.js b/test/configCases/clean/ignore-fn/index.js new file mode 100644 index 00000000000..bbd9de4153f --- /dev/null +++ b/test/configCases/clean/ignore-fn/index.js @@ -0,0 +1 @@ +it("should compile and run the test", function() {}); diff --git a/test/configCases/clean/ignore-fn/webpack.config.js b/test/configCases/clean/ignore-fn/webpack.config.js new file mode 100644 index 00000000000..9313802ace3 --- /dev/null +++ b/test/configCases/clean/ignore-fn/webpack.config.js @@ -0,0 +1,69 @@ +const fs = require("fs"); +const path = require("path"); +const { RawSource } = require("webpack-sources"); +const readDir = require("../enabled/readdir"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + clean: { + keep(asset) { + return asset.includes("ignored/dir"); + } + } + }, + plugins: [ + compiler => { + let once = true; + compiler.hooks.thisCompilation.tap("Test", compilation => { + compilation.hooks.processAssets.tap("Test", assets => { + if (once) { + const outputPath = compilation.getPath(compiler.outputPath, {}); + const customDir = path.join( + outputPath, + "this/dir/should/be/removed" + ); + const ignoredDir = path.join( + outputPath, + "this/is/ignored/dir/that/should/not/be/removed" + ); + fs.mkdirSync(customDir, { recursive: true }); + fs.writeFileSync(path.join(customDir, "file.ext"), ""); + fs.mkdirSync(ignoredDir, { recursive: true }); + fs.writeFileSync(path.join(ignoredDir, "file.ext"), ""); + once = false; + } + assets["this/dir/should/not/be/removed/file.ext"] = new RawSource(""); + }); + }); + compiler.hooks.afterEmit.tap("Test", compilation => { + const outputPath = compilation.getPath(compiler.outputPath, {}); + expect(readDir(outputPath)).toMatchInlineSnapshot(` + Object { + "directories": Array [ + "this", + "this/is", + "this/is/ignored", + "this/is/ignored/dir", + "this/is/ignored/dir/that", + "this/is/ignored/dir/that/should", + "this/is/ignored/dir/that/should/not", + "this/is/ignored/dir/that/should/not/be", + "this/is/ignored/dir/that/should/not/be/removed", + "this/dir", + "this/dir/should", + "this/dir/should/not", + "this/dir/should/not/be", + "this/dir/should/not/be/removed", + ], + "files": Array [ + "this/is/ignored/dir/that/should/not/be/removed/file.ext", + "this/dir/should/not/be/removed/file.ext", + "bundle0.js", + ], + } + `); + }); + } + ] +}; diff --git a/test/configCases/clean/ignore-hook/index.js b/test/configCases/clean/ignore-hook/index.js new file mode 100644 index 00000000000..bbd9de4153f --- /dev/null +++ b/test/configCases/clean/ignore-hook/index.js @@ -0,0 +1 @@ +it("should compile and run the test", function() {}); diff --git a/test/configCases/clean/ignore-hook/webpack.config.js b/test/configCases/clean/ignore-hook/webpack.config.js new file mode 100644 index 00000000000..312874b4f4d --- /dev/null +++ b/test/configCases/clean/ignore-hook/webpack.config.js @@ -0,0 +1,87 @@ +const fs = require("fs"); +const path = require("path"); +const webpack = require("../../../../"); +const { RawSource } = require("webpack-sources"); +const readDir = require("../enabled/readdir"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + clean: true + }, + plugins: [ + compiler => { + let once = true; + compiler.hooks.thisCompilation.tap("Test", compilation => { + webpack.CleanPlugin.getCompilationHooks(compilation).keep.tap( + "Test", + asset => { + if (/[/\\]ignored[/\\]dir[/\\]/.test(asset)) return true; + if (asset.includes("ignored/too")) return true; + } + ); + compilation.hooks.processAssets.tap("Test", assets => { + if (once) { + const outputPath = compilation.getPath(compiler.outputPath, {}); + const customDir = path.join( + outputPath, + "this/dir/should/be/removed" + ); + const ignoredDir = path.join( + outputPath, + "this/is/ignored/dir/that/should/not/be/removed" + ); + const ignoredTooDir = path.join( + outputPath, + "this/is/ignored/too/dir/that/should/not/be/removed" + ); + fs.mkdirSync(customDir, { recursive: true }); + fs.writeFileSync(path.join(customDir, "file.ext"), ""); + fs.mkdirSync(ignoredDir, { recursive: true }); + fs.writeFileSync(path.join(ignoredDir, "file.ext"), ""); + fs.mkdirSync(ignoredTooDir, { recursive: true }); + fs.writeFileSync(path.join(ignoredTooDir, "file.ext"), ""); + once = false; + } + assets["this/dir/should/not/be/removed/file.ext"] = new RawSource(""); + }); + }); + compiler.hooks.afterEmit.tap("Test", compilation => { + const outputPath = compilation.getPath(compiler.outputPath, {}); + expect(readDir(outputPath)).toMatchInlineSnapshot(` + Object { + "directories": Array [ + "this", + "this/is", + "this/is/ignored", + "this/is/ignored/too", + "this/is/ignored/too/dir", + "this/is/ignored/too/dir/that", + "this/is/ignored/too/dir/that/should", + "this/is/ignored/too/dir/that/should/not", + "this/is/ignored/too/dir/that/should/not/be", + "this/is/ignored/too/dir/that/should/not/be/removed", + "this/is/ignored/dir", + "this/is/ignored/dir/that", + "this/is/ignored/dir/that/should", + "this/is/ignored/dir/that/should/not", + "this/is/ignored/dir/that/should/not/be", + "this/is/ignored/dir/that/should/not/be/removed", + "this/dir", + "this/dir/should", + "this/dir/should/not", + "this/dir/should/not/be", + "this/dir/should/not/be/removed", + ], + "files": Array [ + "this/is/ignored/too/dir/that/should/not/be/removed/file.ext", + "this/is/ignored/dir/that/should/not/be/removed/file.ext", + "this/dir/should/not/be/removed/file.ext", + "bundle0.js", + ], + } + `); + }); + } + ] +}; diff --git a/test/configCases/clean/ignore-rx/index.js b/test/configCases/clean/ignore-rx/index.js new file mode 100644 index 00000000000..bbd9de4153f --- /dev/null +++ b/test/configCases/clean/ignore-rx/index.js @@ -0,0 +1 @@ +it("should compile and run the test", function() {}); diff --git a/test/configCases/clean/ignore-rx/webpack.config.js b/test/configCases/clean/ignore-rx/webpack.config.js new file mode 100644 index 00000000000..82623ce620c --- /dev/null +++ b/test/configCases/clean/ignore-rx/webpack.config.js @@ -0,0 +1,67 @@ +const fs = require("fs"); +const path = require("path"); +const { RawSource } = require("webpack-sources"); +const readDir = require("../enabled/readdir"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + clean: { + keep: /[/\\]ignored[/\\]dir[/\\]/ + } + }, + plugins: [ + compiler => { + let once = true; + compiler.hooks.thisCompilation.tap("Test", compilation => { + compilation.hooks.processAssets.tap("Test", assets => { + if (once) { + const outputPath = compilation.getPath(compiler.outputPath, {}); + const customDir = path.join( + outputPath, + "this/dir/should/be/removed" + ); + const ignoredDir = path.join( + outputPath, + "this/is/ignored/dir/that/should/not/be/removed" + ); + fs.mkdirSync(customDir, { recursive: true }); + fs.writeFileSync(path.join(customDir, "file.ext"), ""); + fs.mkdirSync(ignoredDir, { recursive: true }); + fs.writeFileSync(path.join(ignoredDir, "file.ext"), ""); + once = false; + } + assets["this/dir/should/not/be/removed/file.ext"] = new RawSource(""); + }); + }); + compiler.hooks.afterEmit.tap("Test", compilation => { + const outputPath = compilation.getPath(compiler.outputPath, {}); + expect(readDir(outputPath)).toMatchInlineSnapshot(` + Object { + "directories": Array [ + "this", + "this/is", + "this/is/ignored", + "this/is/ignored/dir", + "this/is/ignored/dir/that", + "this/is/ignored/dir/that/should", + "this/is/ignored/dir/that/should/not", + "this/is/ignored/dir/that/should/not/be", + "this/is/ignored/dir/that/should/not/be/removed", + "this/dir", + "this/dir/should", + "this/dir/should/not", + "this/dir/should/not/be", + "this/dir/should/not/be/removed", + ], + "files": Array [ + "this/is/ignored/dir/that/should/not/be/removed/file.ext", + "this/dir/should/not/be/removed/file.ext", + "bundle0.js", + ], + } + `); + }); + } + ] +}; diff --git a/test/configCases/clean/lib-manifest-plugin/index.js b/test/configCases/clean/lib-manifest-plugin/index.js new file mode 100644 index 00000000000..bbd9de4153f --- /dev/null +++ b/test/configCases/clean/lib-manifest-plugin/index.js @@ -0,0 +1 @@ +it("should compile and run the test", function() {}); diff --git a/test/configCases/clean/lib-manifest-plugin/readdir.js b/test/configCases/clean/lib-manifest-plugin/readdir.js new file mode 100644 index 00000000000..7724b597494 --- /dev/null +++ b/test/configCases/clean/lib-manifest-plugin/readdir.js @@ -0,0 +1,48 @@ +const fs = require('fs'); +const path = require('path'); + +/** + * @param {string} path path + * @returns {string} path + */ +function handlePath(path) { + return path.replace(/\\/g, "/"); +} + +/** + * @param {string} from from + * @returns {{ files: string[], directories: string[] }} + */ +module.exports = function readDir(from) { + /** @type {string[]} */ + const collectedFiles = []; + /** @type {string[]} */ + const collectedDirectories = []; + const stack = [from]; + let cursor; + + while ((cursor = stack.pop())) { + const stat = fs.statSync(cursor); + + if (stat.isDirectory()) { + const items = fs.readdirSync(cursor); + + if (from !== cursor) { + const relative = path.relative(from, cursor); + collectedDirectories.push(handlePath(relative)); + } + + for (let i = 0; i < items.length; i++) { + stack.push(path.join(cursor, items[i])); + } + } else { + const relative = path.relative(from, cursor); + collectedFiles.push(handlePath(relative)); + } + } + + return { + files: collectedFiles, + directories: collectedDirectories + }; +} diff --git a/test/configCases/clean/lib-manifest-plugin/webpack.config.js b/test/configCases/clean/lib-manifest-plugin/webpack.config.js new file mode 100644 index 00000000000..0efe44f4d54 --- /dev/null +++ b/test/configCases/clean/lib-manifest-plugin/webpack.config.js @@ -0,0 +1,33 @@ +const path = require("path"); +const readDir = require("./readdir"); +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + clean: true + }, + plugins: [ + compiler => { + compiler.hooks.thisCompilation.tap("Test", compilation => { + const outputPath = compilation.getPath(compiler.outputPath, {}); + new webpack.DllPlugin({ + name: "[name]_dll", + path: path.resolve(outputPath, "manifest.json") + }).apply(compiler); + }); + compiler.hooks.afterEmit.tap("Test", compilation => { + const outputPath = compilation.getPath(compiler.outputPath, {}); + expect(readDir(outputPath)).toMatchInlineSnapshot(` + Object { + "directories": Array [], + "files": Array [ + "manifest.json", + "bundle0.js", + ], + } + `); + }); + } + ] +}; diff --git a/test/configCases/clean/link/index.js b/test/configCases/clean/link/index.js new file mode 100644 index 00000000000..bbd9de4153f --- /dev/null +++ b/test/configCases/clean/link/index.js @@ -0,0 +1 @@ +it("should compile and run the test", function() {}); diff --git a/test/configCases/clean/link/test.filter.js b/test/configCases/clean/link/test.filter.js new file mode 100644 index 00000000000..e627dbe1937 --- /dev/null +++ b/test/configCases/clean/link/test.filter.js @@ -0,0 +1,16 @@ +const fs = require("fs"); +const path = require("path"); + +module.exports = () => { + try { + fs.symlinkSync( + path.join(__dirname, "index.js"), + path.join(__dirname, ".testlink"), + "file" + ); + fs.unlinkSync(path.join(__dirname, ".testlink")); + return true; + } catch (_err) { + return false; + } +}; diff --git a/test/configCases/clean/link/webpack.config.js b/test/configCases/clean/link/webpack.config.js new file mode 100644 index 00000000000..463218c7eaa --- /dev/null +++ b/test/configCases/clean/link/webpack.config.js @@ -0,0 +1,43 @@ +const fs = require("fs"); +const path = require("path"); +const readDir = require("../enabled/readdir"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + clean: true + }, + plugins: [ + compiler => { + let once = true; + compiler.hooks.environment.tap("Test", () => { + if (once) { + const outputPath = + /** @type {string} */ + (compiler.options.output.path); + const originalPath = path.join(outputPath, "file.ext"); + fs.writeFileSync(originalPath, ""); + const customDir = path.join(outputPath, "this/dir/should/be/removed"); + fs.mkdirSync(customDir, { recursive: true }); + fs.symlinkSync( + originalPath, + path.join(customDir, "file-link.ext"), + "file" + ); + once = false; + } + }); + compiler.hooks.afterEmit.tap("Test", compilation => { + const outputPath = compilation.getPath(compiler.outputPath, {}); + expect(readDir(outputPath)).toMatchInlineSnapshot(` + Object { + "directories": Array [], + "files": Array [ + "bundle0.js", + ], + } + `); + }); + } + ] +}; diff --git a/test/configCases/code-generation/harmony-pure-default/webpack.config.js b/test/configCases/code-generation/harmony-pure-default/webpack.config.js index 94fea42dc99..2ec858900ac 100644 --- a/test/configCases/code-generation/harmony-pure-default/webpack.config.js +++ b/test/configCases/code-generation/harmony-pure-default/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { mode: "production", optimization: { diff --git a/test/configCases/code-generation/import-export-format-2/cjs-module.js b/test/configCases/code-generation/import-export-format-2/cjs-module.js new file mode 100644 index 00000000000..1286372d8b3 --- /dev/null +++ b/test/configCases/code-generation/import-export-format-2/cjs-module.js @@ -0,0 +1,3 @@ +const foo = 42; + +module.exports = { foo }; diff --git a/test/configCases/code-generation/import-export-format-2/export-default-expression.js b/test/configCases/code-generation/import-export-format-2/export-default-expression.js new file mode 100644 index 00000000000..db070255f2c --- /dev/null +++ b/test/configCases/code-generation/import-export-format-2/export-default-expression.js @@ -0,0 +1,3 @@ +const ___CSS_LOADER_EXPORT___ = {}; +___CSS_LOADER_EXPORT___.locals = {}; +export default ___CSS_LOADER_EXPORT___; diff --git a/test/configCases/code-generation/import-export-format-2/harmony-module-2.js b/test/configCases/code-generation/import-export-format-2/harmony-module-2.js new file mode 100644 index 00000000000..4cd5fd6fb2e --- /dev/null +++ b/test/configCases/code-generation/import-export-format-2/harmony-module-2.js @@ -0,0 +1,10 @@ +export const baz = 11; + +import { mod3 } from "./index"; + +function test(value) { + return value; +} + +test(mod3.apple); + diff --git a/test/configCases/code-generation/import-export-format-2/harmony-module-3.js b/test/configCases/code-generation/import-export-format-2/harmony-module-3.js new file mode 100644 index 00000000000..11dbbe78d28 --- /dev/null +++ b/test/configCases/code-generation/import-export-format-2/harmony-module-3.js @@ -0,0 +1 @@ +export var apple = 45; diff --git a/test/configCases/code-generation/import-export-format-2/harmony-module.js b/test/configCases/code-generation/import-export-format-2/harmony-module.js new file mode 100644 index 00000000000..b4f6c9f9a65 --- /dev/null +++ b/test/configCases/code-generation/import-export-format-2/harmony-module.js @@ -0,0 +1,5 @@ +export const bar = 42; + +const def = -12; +export default def; + diff --git a/test/configCases/code-generation/import-export-format-2/index.js b/test/configCases/code-generation/import-export-format-2/index.js new file mode 100644 index 00000000000..ed0e03c8b34 --- /dev/null +++ b/test/configCases/code-generation/import-export-format-2/index.js @@ -0,0 +1,50 @@ +import { foo as cjsexport_harmonyimport } from "./cjs-module"; +import theDefault, { bar as harmonyexport_harmonyimport } from "./harmony-module"; +import theDefaultExpression from "./export-default-expression"; +const { harmonyexport_cjsimport } = require("./harmony-module").bar; +const harmonyexport_cjsimportdefault = require("./export-default-expression").default; +import { baz as harmonyexport_harmonyimport_2 } from "./harmony-module-2"; + +import * as mod3 from "./harmony-module-3"; +export { mod3 }; +export { theDefaultExpression } + +const { expectSourceToContain, expectSourceToMatch } = require("../../../helpers/expectSource"); +const regexEscape = require("../../../helpers/regexEscape.js"); + +// It's important to use propertyName when generating object members to ensure that the exported property name +// uses the same accessor syntax (quotes vs. dot notatation) as the imported property name on the other end +// (which needs to use propertyAccess). Else, minifiers such as Closure Compiler will not be able to minify correctly. +it("should use the same accessor syntax for import and export", function() { + + var fs = require("fs"); + var source = fs.readFileSync(__filename, "utf-8").toString(); + + // Reference these imports to generate uses in the source. + + cjsexport_harmonyimport; + harmonyexport_harmonyimport; + harmonyexport_cjsimport; + harmonyexport_harmonyimport_2; + theDefault; + theDefaultExpression; + harmonyexport_cjsimportdefault; + + /*********** DO NOT MATCH BELOW THIS LINE ***********/ + + // Checking harmonyexportinitfragment.js formation of standard export fragment + expectSourceToContain(source, "/* harmony export */ bar: () => (/* binding */ bar)"); + + // Checking formation of imports + expectSourceToMatch(source, `${regexEscape("const { harmonyexport_cjsimport } = (__webpack_require__(/*! ./harmony-module */ ")}\\d+${regexEscape(").bar);")}`); + expectSourceToMatch(source, `${regexEscape("const harmonyexport_cjsimportdefault = (__webpack_require__(/*! ./export-default-expression */ ")}\\d+${regexEscape(")[\"default\"]);")}`); + + // Checking concatenatedmodule.js formation of exports + expectSourceToContain(source, "mod3: () => (/* reexport */ harmony_module_3_namespaceObject)"); + + // Checking concatenatedmodule.js formation of namespace objects + expectSourceToContain(source, "apple: () => (apple)"); + + // Do not break default option + expectSourceToContain(source, "[\"default\"] = (___CSS_LOADER_EXPORT___)"); +}); diff --git a/test/configCases/code-generation/import-export-format-2/webpack.config.js b/test/configCases/code-generation/import-export-format-2/webpack.config.js new file mode 100644 index 00000000000..777d038c05b --- /dev/null +++ b/test/configCases/code-generation/import-export-format-2/webpack.config.js @@ -0,0 +1,25 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + environment: { + arrowFunction: true, + bigIntLiteral: false, + const: false, + destructuring: false, + forOf: false, + dynamicImport: true, + module: false + } + }, + node: { + __dirname: false, + __filename: false + }, + optimization: { + concatenateModules: true, + usedExports: true, + providedExports: true, + minimize: false, + mangleExports: false + } +}; diff --git a/test/configCases/code-generation/import-export-format/cjs-module.js b/test/configCases/code-generation/import-export-format/cjs-module.js new file mode 100644 index 00000000000..1286372d8b3 --- /dev/null +++ b/test/configCases/code-generation/import-export-format/cjs-module.js @@ -0,0 +1,3 @@ +const foo = 42; + +module.exports = { foo }; diff --git a/test/configCases/code-generation/import-export-format/harmony-module-2.js b/test/configCases/code-generation/import-export-format/harmony-module-2.js new file mode 100644 index 00000000000..4cd5fd6fb2e --- /dev/null +++ b/test/configCases/code-generation/import-export-format/harmony-module-2.js @@ -0,0 +1,10 @@ +export const baz = 11; + +import { mod3 } from "./index"; + +function test(value) { + return value; +} + +test(mod3.apple); + diff --git a/test/configCases/code-generation/import-export-format/harmony-module-3.js b/test/configCases/code-generation/import-export-format/harmony-module-3.js new file mode 100644 index 00000000000..11dbbe78d28 --- /dev/null +++ b/test/configCases/code-generation/import-export-format/harmony-module-3.js @@ -0,0 +1 @@ +export var apple = 45; diff --git a/test/configCases/code-generation/import-export-format/harmony-module.js b/test/configCases/code-generation/import-export-format/harmony-module.js new file mode 100644 index 00000000000..b4f6c9f9a65 --- /dev/null +++ b/test/configCases/code-generation/import-export-format/harmony-module.js @@ -0,0 +1,5 @@ +export const bar = 42; + +const def = -12; +export default def; + diff --git a/test/configCases/code-generation/import-export-format/index.js b/test/configCases/code-generation/import-export-format/index.js new file mode 100644 index 00000000000..836850d5917 --- /dev/null +++ b/test/configCases/code-generation/import-export-format/index.js @@ -0,0 +1,44 @@ +import { foo as cjsexport_harmonyimport } from "./cjs-module"; +import theDefault, { bar as harmonyexport_harmonyimport } from "./harmony-module"; +const { harmonyexport_cjsimport } = require("./harmony-module").bar; +import { baz as harmonyexport_harmonyimport_2 } from "./harmony-module-2"; + +import * as mod3 from "./harmony-module-3"; +export { mod3 }; + +const { expectSourceToContain, expectSourceToMatch } = require("../../../helpers/expectSource"); +const regexEscape = require("../../../helpers/regexEscape.js"); + +// It's important to use propertyName when generating object members to ensure that the exported property name +// uses the same accessor syntax (quotes vs. dot notatation) as the imported property name on the other end +// (which needs to use propertyAccess). Else, minifiers such as Closure Compiler will not be able to minify correctly. +it("should use the same accessor syntax for import and export", function() { + + var fs = require("fs"); + var source = fs.readFileSync(__filename, "utf-8").toString(); + + // Reference these imports to generate uses in the source. + + cjsexport_harmonyimport; + harmonyexport_harmonyimport; + harmonyexport_cjsimport; + harmonyexport_harmonyimport_2; + theDefault; + + /*********** DO NOT MATCH BELOW THIS LINE ***********/ + + // Note that there are no quotes around the "a" and "b" properties in the following lines. + + // Checking harmonyexportinitfragment.js formation of standard export fragment + expectSourceToContain(source, "/* harmony export */ a: () => (/* binding */ bar)"); + + // Checking formation of imports + expectSourceToContain(source, "harmony_module/* bar */.a;"); + expectSourceToMatch(source, `${regexEscape("const { harmonyexport_cjsimport } = (__webpack_require__(/*! ./harmony-module */ ")}\\d+${regexEscape(")/* .bar */ .a);")}`); + + // Checking concatenatedmodule.js formation of exports + expectSourceToContain(source, "a: () => (/* reexport */ harmony_module_3_namespaceObject)"); + + // Checking concatenatedmodule.js formation of namespace objects + expectSourceToContain(source, "a: () => (apple)"); +}); diff --git a/test/configCases/code-generation/import-export-format/webpack.config.js b/test/configCases/code-generation/import-export-format/webpack.config.js new file mode 100644 index 00000000000..d68b9b7d455 --- /dev/null +++ b/test/configCases/code-generation/import-export-format/webpack.config.js @@ -0,0 +1,14 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + node: { + __dirname: false, + __filename: false + }, + optimization: { + concatenateModules: true, + usedExports: true, + providedExports: true, + minimize: false, + mangleExports: "size" + } +}; diff --git a/test/configCases/code-generation/re-export-namespace-concat/data.json b/test/configCases/code-generation/re-export-namespace-concat/data.json new file mode 100644 index 00000000000..7726aedd0c5 --- /dev/null +++ b/test/configCases/code-generation/re-export-namespace-concat/data.json @@ -0,0 +1,5 @@ +{ + "nested": { + "object3": {} + } +} diff --git a/test/configCases/code-generation/re-export-namespace-concat/index.js b/test/configCases/code-generation/re-export-namespace-concat/index.js new file mode 100644 index 00000000000..37eb0a558f5 --- /dev/null +++ b/test/configCases/code-generation/re-export-namespace-concat/index.js @@ -0,0 +1,83 @@ +import { obj1 } from './module1'; +import * as m_1 from './module1'; +import * as m_2 from './module2'; +import * as m_3 from './module3'; +import data from "./data"; + +const { expectSourceToContain } = require("../../../helpers/expectSource"); + +// It's important to preserve the same accessor syntax (quotes vs. dot notatation) after the actual export variable. +// Else, minifiers such as Closure Compiler will not be able to minify correctly in ADVANCED mode. + +it("should use/preserve accessor form for import object and namespaces", function() { + var fs = require("fs"); + var source = fs.readFileSync(__filename, "utf-8").toString(); + + // Reference the imports to generate uses in the source. + + const f = false; + if (f) { + const x1 = m_1; + const x2 = obj1; + + const z1 = obj1["plants"]; + const z2 = obj1["funcs"](); + const z3 = m_1["obj1"]["pots"]; + const z4 = m_1["obj1"]["subs"](); + + const a = m_2["m_1"].obj1["flip"].flap; + const b = m_2["m_1"]["obj1"].zip["zap"]; + const c = m_2.m_1.obj1["ding"].dong(); + const d = m_2.m_1["obj1"].sing["song"](); + + const aa = m_3["m_2"].m_1["obj1"]["zoom"]; + + const bb = obj1.up.down?.left.right; + + const ww = require('./module1').obj1["bing"]?.bang; + const xx = require('./module1').obj1["pip"].pop(); + const yy = require('./module3')["m_2"]["m_1"]["obj1"]["tip"].top(); + + data.nested.object3["unknownProperty"].depth = "deep"; + + (obj1)["aaa"].bbb; + (m_1.obj1)["ccc"].ddd; + (obj1["eee"]).fff; + (m_1.obj1["ggg"]).hhh; + (((m_1).obj1)["iii"]).jjj; + } + + /************ DO NOT MATCH BELOW THIS LINE ************/ + + // Imported objects and import namespaces should use dot notation. Any references to the properties of exports + // should be preserved as either quotes or dot notation, depending on the original source. + + expectSourceToContain(source, 'const x1 = module1;'); + expectSourceToContain(source, 'const x2 = module1.obj1;'); + + expectSourceToContain(source, 'const z1 = module1.obj1["plants"];'); + expectSourceToContain(source, 'const z2 = module1.obj1["funcs"]();'); + expectSourceToContain(source, 'const z3 = module1.obj1["pots"];'); + expectSourceToContain(source, 'const z4 = module1.obj1["subs"]();'); + + expectSourceToContain(source, 'const a = module2/* m_1.obj1 */.a.obj1["flip"].flap;'); + expectSourceToContain(source, 'const b = module2/* m_1.obj1 */.a.obj1.zip["zap"];'); + expectSourceToContain(source, 'const c = module2/* m_1.obj1 */.a.obj1["ding"].dong();'); + expectSourceToContain(source, 'const d = module2/* m_1.obj1 */.a.obj1.sing["song"]();'); + + expectSourceToContain(source, 'const aa = module3/* m_2.m_1.obj1 */.a.a.obj1["zoom"];'); + + expectSourceToContain(source, 'const bb = module1.obj1.up.down?.left.right;'); + + expectSourceToContain(source, 'const ww = (__webpack_require__(/*! ./module1 */ 602).obj1)["bing"]?.bang;'); + expectSourceToContain(source, 'const xx = (__webpack_require__(/*! ./module1 */ 602).obj1)["pip"].pop();'); + expectSourceToContain(source, 'const yy = (__webpack_require__(/*! ./module3 */ 144)/* .m_2.m_1.obj1 */ .a.a.obj1)["tip"].top();'); + + expectSourceToContain(source, 'data_namespaceObject.a.a["unknownProperty"].depth = "deep";'); + + expectSourceToContain(source, '(module1.obj1)["aaa"].bbb;'); + expectSourceToContain(source, '(module1.obj1)["ccc"].ddd;'); + expectSourceToContain(source, '(module1.obj1["eee"]).fff;'); + expectSourceToContain(source, '(module1.obj1["ggg"]).hhh;'); + expectSourceToContain(source, '((module1.obj1)["iii"]).jjj;'); +}); diff --git a/test/configCases/code-generation/re-export-namespace-concat/module1.js b/test/configCases/code-generation/re-export-namespace-concat/module1.js new file mode 100644 index 00000000000..e85ec664386 --- /dev/null +++ b/test/configCases/code-generation/re-export-namespace-concat/module1.js @@ -0,0 +1,3 @@ +export const obj1 = {}; + +export default { obj2: {} }; diff --git a/test/configCases/code-generation/re-export-namespace-concat/module2.js b/test/configCases/code-generation/re-export-namespace-concat/module2.js new file mode 100644 index 00000000000..a91c5e7a055 --- /dev/null +++ b/test/configCases/code-generation/re-export-namespace-concat/module2.js @@ -0,0 +1,2 @@ +import * as m1 from './module1'; +export { m1 as m_1 }; diff --git a/test/configCases/code-generation/re-export-namespace-concat/module3.js b/test/configCases/code-generation/re-export-namespace-concat/module3.js new file mode 100644 index 00000000000..cf0e8cd08d8 --- /dev/null +++ b/test/configCases/code-generation/re-export-namespace-concat/module3.js @@ -0,0 +1,2 @@ +import * as m2 from './module2'; +export { m2 as m_2 }; diff --git a/test/configCases/code-generation/re-export-namespace-concat/test.filter.js b/test/configCases/code-generation/re-export-namespace-concat/test.filter.js new file mode 100644 index 00000000000..846093ba9cf --- /dev/null +++ b/test/configCases/code-generation/re-export-namespace-concat/test.filter.js @@ -0,0 +1,5 @@ +const supportsOptionalChaining = require("../../../helpers/supportsOptionalChaining"); + +module.exports = function (config) { + return supportsOptionalChaining(); +}; diff --git a/test/configCases/code-generation/re-export-namespace-concat/webpack.config.js b/test/configCases/code-generation/re-export-namespace-concat/webpack.config.js new file mode 100644 index 00000000000..7e1057f2f3c --- /dev/null +++ b/test/configCases/code-generation/re-export-namespace-concat/webpack.config.js @@ -0,0 +1,11 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + node: { + __dirname: false, + __filename: false + }, + mode: "production", + optimization: { + mangleExports: "size" + } +}; diff --git a/test/configCases/code-generation/re-export-namespace/data.json b/test/configCases/code-generation/re-export-namespace/data.json new file mode 100644 index 00000000000..7726aedd0c5 --- /dev/null +++ b/test/configCases/code-generation/re-export-namespace/data.json @@ -0,0 +1,5 @@ +{ + "nested": { + "object3": {} + } +} diff --git a/test/configCases/code-generation/re-export-namespace/index.js b/test/configCases/code-generation/re-export-namespace/index.js new file mode 100644 index 00000000000..376c4287873 --- /dev/null +++ b/test/configCases/code-generation/re-export-namespace/index.js @@ -0,0 +1,83 @@ +import { obj1 } from './module1'; +import * as m_1 from './module1'; +import * as m_2 from './module2'; +import * as m_3 from './module3'; +import data from "./data"; + +const { expectSourceToContain } = require("../../../helpers/expectSource"); + +// It's important to preserve the same accessor syntax (quotes vs. dot notatation) after the actual export variable. +// Else, minifiers such as Closure Compiler will not be able to minify correctly in ADVANCED mode. + +it("should use/preserve accessor form for import object and namespaces", function() { + var fs = require("fs"); + var source = fs.readFileSync(__filename, "utf-8").toString(); + + // Reference the imports to generate uses in the source. + + const f = false; + if (f) { + const x1 = m_1; + const x2 = obj1; + + const z1 = obj1["plants"]; + const z2 = obj1["funcs"](); + const z3 = m_1["obj1"]["pots"]; + const z4 = m_1["obj1"]["subs"](); + + const a = m_2["m_1"].obj1["flip"].flap; + const b = m_2["m_1"]["obj1"].zip["zap"]; + const c = m_2.m_1.obj1["ding"].dong(); + const d = m_2.m_1["obj1"].sing["song"](); + + const aa = m_3["m_2"].m_1["obj1"]["zoom"]; + + const bb = obj1.up.down?.left.right; + + const ww = require('./module1').obj1["bing"]?.bang; + const xx = require('./module1').obj1["pip"].pop(); + const yy = require('./module3')["m_2"]["m_1"]["obj1"]["tip"].top(); + + data.nested.object3["unknownProperty"].depth = "deep"; + + (obj1)["aaa"].bbb; + (m_1.obj1)["ccc"].ddd; + (obj1["eee"]).fff; + (m_1.obj1["ggg"]).hhh; + (((m_1).obj1)["iii"]).jjj; + } + + /************ DO NOT MATCH BELOW THIS LINE ************/ + + // Imported objects and import namespaces should use dot notation. Any references to the properties of exports + // should be preserved as either quotes or dot notation, depending on the original source. + + expectSourceToContain(source, 'const x1 = _module1__WEBPACK_IMPORTED_MODULE_0__;'); + expectSourceToContain(source, 'const x2 = _module1__WEBPACK_IMPORTED_MODULE_0__.obj1;'); + + expectSourceToContain(source, 'const z1 = _module1__WEBPACK_IMPORTED_MODULE_0__.obj1["plants"];'); + expectSourceToContain(source, 'const z2 = _module1__WEBPACK_IMPORTED_MODULE_0__.obj1["funcs"]();'); + expectSourceToContain(source, 'const z3 = _module1__WEBPACK_IMPORTED_MODULE_0__.obj1["pots"];'); + expectSourceToContain(source, 'const z4 = _module1__WEBPACK_IMPORTED_MODULE_0__.obj1["subs"]();'); + + expectSourceToContain(source, 'const a = _module2__WEBPACK_IMPORTED_MODULE_1__.m_1.obj1["flip"].flap;'); + expectSourceToContain(source, 'const b = _module2__WEBPACK_IMPORTED_MODULE_1__.m_1.obj1.zip["zap"];'); + expectSourceToContain(source, 'const c = _module2__WEBPACK_IMPORTED_MODULE_1__.m_1.obj1["ding"].dong();'); + expectSourceToContain(source, 'const d = _module2__WEBPACK_IMPORTED_MODULE_1__.m_1.obj1.sing["song"]();'); + + expectSourceToContain(source, 'const aa = _module3__WEBPACK_IMPORTED_MODULE_2__.m_2.m_1.obj1["zoom"];'); + + expectSourceToContain(source, 'const bb = _module1__WEBPACK_IMPORTED_MODULE_0__.obj1.up.down?.left.right;'); + + expectSourceToContain(source, 'const ww = (__webpack_require__(/*! ./module1 */ 602).obj1)["bing"]?.bang;'); + expectSourceToContain(source, 'const xx = (__webpack_require__(/*! ./module1 */ 602).obj1)["pip"].pop();'); + expectSourceToContain(source, 'const yy = (__webpack_require__(/*! ./module3 */ 144).m_2.m_1.obj1)["tip"].top();'); + + expectSourceToContain(source, '_data__WEBPACK_IMPORTED_MODULE_3__.nested.object3["unknownProperty"].depth = "deep";'); + + expectSourceToContain(source, '(_module1__WEBPACK_IMPORTED_MODULE_0__.obj1)["aaa"].bbb;'); + expectSourceToContain(source, '(_module1__WEBPACK_IMPORTED_MODULE_0__.obj1)["ccc"].ddd;'); + expectSourceToContain(source, '(_module1__WEBPACK_IMPORTED_MODULE_0__.obj1["eee"]).fff;'); + expectSourceToContain(source, '(_module1__WEBPACK_IMPORTED_MODULE_0__.obj1["ggg"]).hhh;'); + expectSourceToContain(source, '((_module1__WEBPACK_IMPORTED_MODULE_0__.obj1)["iii"]).jjj;'); +}); diff --git a/test/configCases/code-generation/re-export-namespace/module1.js b/test/configCases/code-generation/re-export-namespace/module1.js new file mode 100644 index 00000000000..e85ec664386 --- /dev/null +++ b/test/configCases/code-generation/re-export-namespace/module1.js @@ -0,0 +1,3 @@ +export const obj1 = {}; + +export default { obj2: {} }; diff --git a/test/configCases/code-generation/re-export-namespace/module2.js b/test/configCases/code-generation/re-export-namespace/module2.js new file mode 100644 index 00000000000..a91c5e7a055 --- /dev/null +++ b/test/configCases/code-generation/re-export-namespace/module2.js @@ -0,0 +1,2 @@ +import * as m1 from './module1'; +export { m1 as m_1 }; diff --git a/test/configCases/code-generation/re-export-namespace/module3.js b/test/configCases/code-generation/re-export-namespace/module3.js new file mode 100644 index 00000000000..cf0e8cd08d8 --- /dev/null +++ b/test/configCases/code-generation/re-export-namespace/module3.js @@ -0,0 +1,2 @@ +import * as m2 from './module2'; +export { m2 as m_2 }; diff --git a/test/configCases/code-generation/re-export-namespace/test.filter.js b/test/configCases/code-generation/re-export-namespace/test.filter.js new file mode 100644 index 00000000000..846093ba9cf --- /dev/null +++ b/test/configCases/code-generation/re-export-namespace/test.filter.js @@ -0,0 +1,5 @@ +const supportsOptionalChaining = require("../../../helpers/supportsOptionalChaining"); + +module.exports = function (config) { + return supportsOptionalChaining(); +}; diff --git a/test/configCases/code-generation/re-export-namespace/webpack.config.js b/test/configCases/code-generation/re-export-namespace/webpack.config.js new file mode 100644 index 00000000000..5da817461a6 --- /dev/null +++ b/test/configCases/code-generation/re-export-namespace/webpack.config.js @@ -0,0 +1,14 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + node: { + __dirname: false, + __filename: false + }, + optimization: { + concatenateModules: false, + usedExports: true, + providedExports: true, + minimize: false, + mangleExports: false + } +}; diff --git a/test/configCases/code-generation/require-context-id/warnings.js b/test/configCases/code-generation/require-context-id/warnings.js new file mode 100644 index 00000000000..70fefa270fb --- /dev/null +++ b/test/configCases/code-generation/require-context-id/warnings.js @@ -0,0 +1 @@ +module.exports = [[/hashed/, /deprecated/]]; diff --git a/test/configCases/code-generation/require-context-id/webpack.config.js b/test/configCases/code-generation/require-context-id/webpack.config.js index 68fbeb15750..e3f2e0b3bf3 100644 --- a/test/configCases/code-generation/require-context-id/webpack.config.js +++ b/test/configCases/code-generation/require-context-id/webpack.config.js @@ -1,4 +1,6 @@ -var webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { - plugins: [new webpack.HashedModuleIdsPlugin()] + optimization: { + moduleIds: "hashed" + } }; diff --git a/test/configCases/code-generation/use-strict/index.js b/test/configCases/code-generation/use-strict/index.js index 8f132820682..f5d77f70844 100644 --- a/test/configCases/code-generation/use-strict/index.js +++ b/test/configCases/code-generation/use-strict/index.js @@ -7,22 +7,15 @@ it("should include only one use strict per module", function() { var fs = require("fs"); var source = fs.readFileSync(__filename, "utf-8"); - var regExp = /\"use strict\";?\s*(.*)/g + var regExp = /\"use strict\";?\s*(.*)/g; var match = regExp.exec(source); var matches = []; - while(match) { + while (match) { matches.push(match[1]); match = regExp.exec(source); } matches.sort(); - expect(matches).toEqual([ - "/* unused harmony default export */ var _unused_webpack_default_export = (\"a\");", - "__webpack_require__.r(__webpack_exports__);", - "__webpack_require__.r(__webpack_exports__);", - "__webpack_require__.r(__webpack_exports__);", - "__webpack_require__.r(__webpack_exports__);", - "it(\"should include only one use strict per module\", function() {", - ]); + expect(matches).toEqual(["/******/ var __webpack_modules__ = ({"]); }); diff --git a/test/configCases/code-generation/use-strict/webpack.config.js b/test/configCases/code-generation/use-strict/webpack.config.js index 430664cf30e..877d7411e93 100644 --- a/test/configCases/code-generation/use-strict/webpack.config.js +++ b/test/configCases/code-generation/use-strict/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { node: { __dirname: false, diff --git a/test/configCases/commons-chunk-plugin/correct-order/test.config.js b/test/configCases/commons-chunk-plugin/correct-order/test.config.js deleted file mode 100644 index 4b70a8281d9..00000000000 --- a/test/configCases/commons-chunk-plugin/correct-order/test.config.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - findBundle: function(i, options) { - return [ - "./vendor.js", - "./main.js" - ] - } -}; diff --git a/test/configCases/commons-chunk-plugin/correct-order/webpack.config.js b/test/configCases/commons-chunk-plugin/correct-order/webpack.config.js deleted file mode 100644 index cc7e99cd653..00000000000 --- a/test/configCases/commons-chunk-plugin/correct-order/webpack.config.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = { - entry: { - vendor: ["./a"], - main: "./index" - }, - target: "web", - output: { - filename: "[name].js" - }, - optimization: { - splitChunks: { - minSize: 1, - name: "vendor" - } - } -}; diff --git a/test/configCases/commons-chunk-plugin/extract-async-from-entry/test.config.js b/test/configCases/commons-chunk-plugin/extract-async-from-entry/test.config.js deleted file mode 100644 index a1fa7e16f53..00000000000 --- a/test/configCases/commons-chunk-plugin/extract-async-from-entry/test.config.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - findBundle: function(i, options) { - return [ - "./main.js" - ]; - } -}; diff --git a/test/configCases/commons-chunk-plugin/extract-async-from-entry/webpack.config.js b/test/configCases/commons-chunk-plugin/extract-async-from-entry/webpack.config.js deleted file mode 100644 index 39260c23ca3..00000000000 --- a/test/configCases/commons-chunk-plugin/extract-async-from-entry/webpack.config.js +++ /dev/null @@ -1,15 +0,0 @@ -module.exports = { - entry: { - main: "./index", - second: "./index" - }, - target: "web", - output: { - filename: "[name].js" - }, - optimization: { - splitChunks: { - minSize: 1 - } - } -}; diff --git a/test/configCases/commons-chunk-plugin/hot-multi/first.js b/test/configCases/commons-chunk-plugin/hot-multi/first.js deleted file mode 100644 index 751a8042f9f..00000000000 --- a/test/configCases/commons-chunk-plugin/hot-multi/first.js +++ /dev/null @@ -1,6 +0,0 @@ -require("./common"); - -it("should have the correct main flag for multi first module", function() { - var multiModule = __webpack_require__.c[module.parents[0]]; - expect(multiModule.hot._main).toBe(true); -}); diff --git a/test/configCases/commons-chunk-plugin/hot-multi/second.js b/test/configCases/commons-chunk-plugin/hot-multi/second.js deleted file mode 100644 index fd42f814811..00000000000 --- a/test/configCases/commons-chunk-plugin/hot-multi/second.js +++ /dev/null @@ -1,6 +0,0 @@ -require("./common"); - -it("should have the correct main flag for multi second module", function() { - var multiModule = __webpack_require__.c[module.parents[0]]; - expect(multiModule.hot._main).toBe(true); -}); diff --git a/test/configCases/commons-chunk-plugin/hot-multi/test.config.js b/test/configCases/commons-chunk-plugin/hot-multi/test.config.js deleted file mode 100644 index 221de612c0b..00000000000 --- a/test/configCases/commons-chunk-plugin/hot-multi/test.config.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - findBundle: function(i, options) { - return [ - "./vendor.js", - "./first.js", - "./second.js" - ] - } -}; diff --git a/test/configCases/commons-chunk-plugin/hot-multi/vendor.js b/test/configCases/commons-chunk-plugin/hot-multi/vendor.js deleted file mode 100644 index abba7de3a31..00000000000 --- a/test/configCases/commons-chunk-plugin/hot-multi/vendor.js +++ /dev/null @@ -1,8 +0,0 @@ -require("./common"); - -module.exports = "vendor"; - -it("should have the correct main flag for multi vendor module", function() { - var multiModule = __webpack_require__.c[module.parents[0]]; - expect(multiModule.hot._main).toBe(true); -}); diff --git a/test/configCases/commons-chunk-plugin/hot-multi/webpack.config.js b/test/configCases/commons-chunk-plugin/hot-multi/webpack.config.js deleted file mode 100644 index 55d33b816d0..00000000000 --- a/test/configCases/commons-chunk-plugin/hot-multi/webpack.config.js +++ /dev/null @@ -1,19 +0,0 @@ -var HotModuleReplacementPlugin = require("../../../../lib/HotModuleReplacementPlugin"); -module.exports = { - entry: { - vendor: ["./vendor"], - first: ["./shared", "./first"], - second: ["./shared", "./second"] - }, - target: "web", - output: { - filename: "[name].js" - }, - optimization: { - splitChunks: { - minSize: 1, - name: "vendor" - } - }, - plugins: [new HotModuleReplacementPlugin()] -}; diff --git a/test/configCases/commons-chunk-plugin/hot/test.config.js b/test/configCases/commons-chunk-plugin/hot/test.config.js deleted file mode 100644 index 4b70a8281d9..00000000000 --- a/test/configCases/commons-chunk-plugin/hot/test.config.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - findBundle: function(i, options) { - return [ - "./vendor.js", - "./main.js" - ] - } -}; diff --git a/test/configCases/commons-chunk-plugin/hot/webpack.config.js b/test/configCases/commons-chunk-plugin/hot/webpack.config.js deleted file mode 100644 index 868db8df35e..00000000000 --- a/test/configCases/commons-chunk-plugin/hot/webpack.config.js +++ /dev/null @@ -1,18 +0,0 @@ -var HotModuleReplacementPlugin = require("../../../../lib/HotModuleReplacementPlugin"); -module.exports = { - entry: { - vendor: ["./vendor"], - main: "./index" - }, - target: "web", - output: { - filename: "[name].js" - }, - optimization: { - splitChunks: { - minSize: 1, - name: "vendor" - } - }, - plugins: [new HotModuleReplacementPlugin()] -}; diff --git a/test/configCases/commons-chunk-plugin/inverted-order/test.config.js b/test/configCases/commons-chunk-plugin/inverted-order/test.config.js deleted file mode 100644 index 9f3aeae9a92..00000000000 --- a/test/configCases/commons-chunk-plugin/inverted-order/test.config.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - findBundle: function(i, options) { - return [ - "./main.js", - "./vendor.js" - ] - } -}; diff --git a/test/configCases/commons-chunk-plugin/inverted-order/webpack.config.js b/test/configCases/commons-chunk-plugin/inverted-order/webpack.config.js deleted file mode 100644 index cc7e99cd653..00000000000 --- a/test/configCases/commons-chunk-plugin/inverted-order/webpack.config.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = { - entry: { - vendor: ["./a"], - main: "./index" - }, - target: "web", - output: { - filename: "[name].js" - }, - optimization: { - splitChunks: { - minSize: 1, - name: "vendor" - } - } -}; diff --git a/test/configCases/commons-chunk-plugin/library/index.js b/test/configCases/commons-chunk-plugin/library/index.js deleted file mode 100644 index 02d3fa5c364..00000000000 --- a/test/configCases/commons-chunk-plugin/library/index.js +++ /dev/null @@ -1,11 +0,0 @@ -require.include("external1"); -require.ensure([], function() { - require.include("external2"); -}) - -it("should have externals in main file", function() { - var a = require("./a"); - expect(a.vendor).toMatch("require(\"external0\")"); - expect(a.main).toMatch("require(\"external1\")"); - expect(a.main).toMatch("require(\"external2\")"); -}); diff --git a/test/configCases/commons-chunk-plugin/library/test.config.js b/test/configCases/commons-chunk-plugin/library/test.config.js deleted file mode 100644 index c50c7988582..00000000000 --- a/test/configCases/commons-chunk-plugin/library/test.config.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = { - findBundle: function(i, options) { - return [ - "./vendor.js", - "./main.js" - ] - }, - modules: { - "external0": "module 0", - "external1": "module 1", - "external2": "module 2" - } -}; diff --git a/test/configCases/commons-chunk-plugin/library/webpack.config.js b/test/configCases/commons-chunk-plugin/library/webpack.config.js deleted file mode 100644 index 56df641cf83..00000000000 --- a/test/configCases/commons-chunk-plugin/library/webpack.config.js +++ /dev/null @@ -1,27 +0,0 @@ -module.exports = { - entry: { - vendor: ["external0", "./a"], - main: "./index" - }, - target: "web", - output: { - filename: "[name].js", - libraryTarget: "umd" - }, - externals: ["external0", "external1", "external2", "fs", "path"], - optimization: { - splitChunks: { - cacheGroups: { - vendor: { - test: "vendor", - name: "vendor", - enforce: true - } - } - } - }, - node: { - __filename: false, - __dirname: false - } -}; diff --git a/test/configCases/commons-chunk-plugin/move-entry/test.config.js b/test/configCases/commons-chunk-plugin/move-entry/test.config.js deleted file mode 100644 index e62df37d337..00000000000 --- a/test/configCases/commons-chunk-plugin/move-entry/test.config.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - findBundle: function(i, options) { - return [ - "./commons.js", - "./main.js" - ] - } -}; diff --git a/test/configCases/commons-chunk-plugin/move-entry/webpack.config.js b/test/configCases/commons-chunk-plugin/move-entry/webpack.config.js deleted file mode 100644 index 9310be1c3c7..00000000000 --- a/test/configCases/commons-chunk-plugin/move-entry/webpack.config.js +++ /dev/null @@ -1,21 +0,0 @@ -module.exports = { - entry: { - main: "./index?0", - second: "./index?1" - }, - target: "web", - output: { - filename: "[name].js" - }, - optimization: { - splitChunks: { - cacheGroups: { - commons: { - chunks: "initial", - minSize: 0, - name: "commons" - } - } - } - } -}; diff --git a/test/configCases/commons-chunk-plugin/move-to-grandparent/index.js b/test/configCases/commons-chunk-plugin/move-to-grandparent/index.js deleted file mode 100644 index abee1e85c1b..00000000000 --- a/test/configCases/commons-chunk-plugin/move-to-grandparent/index.js +++ /dev/null @@ -1,12 +0,0 @@ -it("should correctly include indirect children in common chunk", function(done) { - Promise.all([ - import('./pageA'), - import('./pageB').then(m => m.default) - ]).then((imports) => { - expect(imports[0].default).toBe("reuse"); - expect(imports[1].default).toBe("reuse"); - done(); - }).catch(e => { - done(e); - }) -}); diff --git a/test/configCases/commons-chunk-plugin/move-to-grandparent/test.config.js b/test/configCases/commons-chunk-plugin/move-to-grandparent/test.config.js deleted file mode 100644 index 4c2a87b6f4c..00000000000 --- a/test/configCases/commons-chunk-plugin/move-to-grandparent/test.config.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - findBundle: function(i, options) { - return [ - "./main.js", - "./misc.js", - ]; - } -}; diff --git a/test/configCases/commons-chunk-plugin/move-to-grandparent/webpack.config.js b/test/configCases/commons-chunk-plugin/move-to-grandparent/webpack.config.js deleted file mode 100644 index 520f039b2b2..00000000000 --- a/test/configCases/commons-chunk-plugin/move-to-grandparent/webpack.config.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = { - entry: { - main: "./index", - misc: "./second" - }, - output: { - filename: "[name].js" - }, - optimization: { - splitChunks: { - minSize: 0 - } - } -}; diff --git a/test/configCases/commons-chunk-plugin/simple/test.config.js b/test/configCases/commons-chunk-plugin/simple/test.config.js deleted file mode 100644 index 4b70a8281d9..00000000000 --- a/test/configCases/commons-chunk-plugin/simple/test.config.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - findBundle: function(i, options) { - return [ - "./vendor.js", - "./main.js" - ] - } -}; diff --git a/test/configCases/commons-chunk-plugin/simple/webpack.config.js b/test/configCases/commons-chunk-plugin/simple/webpack.config.js deleted file mode 100644 index cc7e99cd653..00000000000 --- a/test/configCases/commons-chunk-plugin/simple/webpack.config.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = { - entry: { - vendor: ["./a"], - main: "./index" - }, - target: "web", - output: { - filename: "[name].js" - }, - optimization: { - splitChunks: { - minSize: 1, - name: "vendor" - } - } -}; diff --git a/test/configCases/compiletime/error-not-found/errors.js b/test/configCases/compiletime/error-not-found/errors.js index e36b112fde3..59aab9d5ba7 100644 --- a/test/configCases/compiletime/error-not-found/errors.js +++ b/test/configCases/compiletime/error-not-found/errors.js @@ -1,3 +1 @@ -module.exports = [ - /not found/ -]; +module.exports = [/not found/]; diff --git a/test/configCases/compiletime/error-not-found/webpack.config.js b/test/configCases/compiletime/error-not-found/webpack.config.js index 4b24c0e9f06..e3128523e3e 100644 --- a/test/configCases/compiletime/error-not-found/webpack.config.js +++ b/test/configCases/compiletime/error-not-found/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { module: { strictExportPresence: true diff --git a/test/configCases/compiletime/exports-presence/aaa/index.js b/test/configCases/compiletime/exports-presence/aaa/index.js new file mode 100644 index 00000000000..1b2793ba6e3 --- /dev/null +++ b/test/configCases/compiletime/exports-presence/aaa/index.js @@ -0,0 +1,4 @@ +import { NoNo } from "../stub"; +export { NotHere } from "../stub"; + +export default `${typeof NoNo}`; diff --git a/test/configCases/compiletime/exports-presence/bbb/index.js b/test/configCases/compiletime/exports-presence/bbb/index.js new file mode 100644 index 00000000000..1b2793ba6e3 --- /dev/null +++ b/test/configCases/compiletime/exports-presence/bbb/index.js @@ -0,0 +1,4 @@ +import { NoNo } from "../stub"; +export { NotHere } from "../stub"; + +export default `${typeof NoNo}`; diff --git a/test/configCases/compiletime/exports-presence/ccc/index.js b/test/configCases/compiletime/exports-presence/ccc/index.js new file mode 100644 index 00000000000..1b2793ba6e3 --- /dev/null +++ b/test/configCases/compiletime/exports-presence/ccc/index.js @@ -0,0 +1,4 @@ +import { NoNo } from "../stub"; +export { NotHere } from "../stub"; + +export default `${typeof NoNo}`; diff --git a/test/configCases/compiletime/exports-presence/ddd/index.js b/test/configCases/compiletime/exports-presence/ddd/index.js new file mode 100644 index 00000000000..1b2793ba6e3 --- /dev/null +++ b/test/configCases/compiletime/exports-presence/ddd/index.js @@ -0,0 +1,4 @@ +import { NoNo } from "../stub"; +export { NotHere } from "../stub"; + +export default `${typeof NoNo}`; diff --git a/test/configCases/compiletime/exports-presence/errors.js b/test/configCases/compiletime/exports-presence/errors.js new file mode 100644 index 00000000000..257f6952694 --- /dev/null +++ b/test/configCases/compiletime/exports-presence/errors.js @@ -0,0 +1,10 @@ +module.exports = [ + { + moduleName: /ccc/, + message: /NotHere.+not found/ + }, + { + moduleName: /ccc/, + message: /NoNo.+not found/ + } +]; diff --git a/test/configCases/compiletime/exports-presence/index.js b/test/configCases/compiletime/exports-presence/index.js new file mode 100644 index 00000000000..3b8d2e8b66d --- /dev/null +++ b/test/configCases/compiletime/exports-presence/index.js @@ -0,0 +1,11 @@ +import { NotHere as aaa } from "./aaa/index.js"; +import { NotHere as bbb } from "./bbb/index.js"; +import { NotHere as ccc } from "./ccc/index.js"; +import { NotHere as ddd } from "./ddd/index.js"; + +it("should do nothing", () => { + expect(aaa).toBe(undefined); + expect(bbb).toBe(undefined); + expect(ccc).toBe(undefined); + expect(ddd).toBe(undefined); +}); diff --git a/test/configCases/compiletime/exports-presence/stub.js b/test/configCases/compiletime/exports-presence/stub.js new file mode 100644 index 00000000000..131d19e366f --- /dev/null +++ b/test/configCases/compiletime/exports-presence/stub.js @@ -0,0 +1,3 @@ +const foo = 'bar' + +export default foo diff --git a/test/configCases/compiletime/exports-presence/warnings.js b/test/configCases/compiletime/exports-presence/warnings.js new file mode 100644 index 00000000000..ca07ad2aacf --- /dev/null +++ b/test/configCases/compiletime/exports-presence/warnings.js @@ -0,0 +1,14 @@ +module.exports = [ + { + moduleName: /bbb/, + message: /NotHere.+not found/ + }, + { + moduleName: /bbb/, + message: /NoNo.+not found/ + }, + { + moduleName: /ddd/, + message: /NoNo.+not found/ + } +]; diff --git a/test/configCases/compiletime/exports-presence/webpack.config.js b/test/configCases/compiletime/exports-presence/webpack.config.js new file mode 100644 index 00000000000..7634dfd7a65 --- /dev/null +++ b/test/configCases/compiletime/exports-presence/webpack.config.js @@ -0,0 +1,34 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "production", + module: { + rules: [ + { + test: /aaa/, + parser: { + exportsPresence: false + } + }, + { + test: /bbb/, + parser: { + exportsPresence: "warn" + } + }, + { + test: /ccc/, + parser: { + exportsPresence: "error" + } + }, + { + test: /ddd/, + parser: { + exportsPresence: "error", + importExportsPresence: "warn", + reexportExportsPresence: false + } + } + ] + } +}; diff --git a/test/configCases/compiletime/warn-not-found/warnings.js b/test/configCases/compiletime/warn-not-found/warnings.js index e36b112fde3..59aab9d5ba7 100644 --- a/test/configCases/compiletime/warn-not-found/warnings.js +++ b/test/configCases/compiletime/warn-not-found/warnings.js @@ -1,3 +1 @@ -module.exports = [ - /not found/ -]; +module.exports = [/not found/]; diff --git a/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-nested/config.js b/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-nested/config.js new file mode 100644 index 00000000000..7e07c587ca7 --- /dev/null +++ b/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-nested/config.js @@ -0,0 +1,7 @@ +export default { + deeply: { + nested: { + thing: 'Correct value', + }, + }, +}; diff --git a/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-nested/index.js b/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-nested/index.js new file mode 100644 index 00000000000..838175d12be --- /dev/null +++ b/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-nested/index.js @@ -0,0 +1,16 @@ +import * as modA from "./module-a"; +import config from "./config"; + +const { + deeply: { + nested: { thing = "defaultValue" } + } +} = config; + +it("renames a nested destructured assignment with default value correctly", () => { + expect(modA.deeply).toBe("Ignore me please"); + expect(modA.nested).toBe("Ignore me please"); + expect(modA.thing).toBe("Ignore me please"); + + expect(thing).toBe("Correct value"); +}); diff --git a/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-nested/module-a.js b/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-nested/module-a.js new file mode 100644 index 00000000000..68a3c8bae1f --- /dev/null +++ b/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-nested/module-a.js @@ -0,0 +1,3 @@ +export const deeply = "Ignore me please"; +export const nested = "Ignore me please"; +export const thing = "Ignore me please"; diff --git a/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-nested/webpack.config.js b/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-nested/webpack.config.js new file mode 100644 index 00000000000..c939ba33f61 --- /dev/null +++ b/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-nested/webpack.config.js @@ -0,0 +1,6 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + concatenateModules: true + } +}; diff --git a/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-simple/config.js b/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-simple/config.js new file mode 100644 index 00000000000..4598c2dbc74 --- /dev/null +++ b/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-simple/config.js @@ -0,0 +1,3 @@ +export default { + variableClash: "Correct value" +}; diff --git a/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-simple/index.js b/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-simple/index.js new file mode 100644 index 00000000000..29def714ea3 --- /dev/null +++ b/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-simple/index.js @@ -0,0 +1,9 @@ +import modA from "./module-a"; +import config from "./config"; + +const { variableClash = "defaultValue" } = config; + +it("renames a destructured assignment with default value correctly", () => { + expect(modA).toBe("valueFromSomeFile"); + expect(variableClash).toBe("Correct value"); +}); diff --git a/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-simple/module-a.js b/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-simple/module-a.js new file mode 100644 index 00000000000..b9fd2570297 --- /dev/null +++ b/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-simple/module-a.js @@ -0,0 +1,3 @@ +const variableClash = "valueFromSomeFile"; + +export default variableClash; diff --git a/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-simple/webpack.config.js b/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-simple/webpack.config.js new file mode 100644 index 00000000000..c939ba33f61 --- /dev/null +++ b/test/configCases/concatenate-modules/destructuring-assignment-with-default-value-and-variable-collision-simple/webpack.config.js @@ -0,0 +1,6 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + concatenateModules: true + } +}; diff --git a/test/configCases/concatenate-modules/import-module/a.txt b/test/configCases/concatenate-modules/import-module/a.txt new file mode 100644 index 00000000000..1269488f7fb --- /dev/null +++ b/test/configCases/concatenate-modules/import-module/a.txt @@ -0,0 +1 @@ +data diff --git a/test/configCases/concatenate-modules/import-module/index.js b/test/configCases/concatenate-modules/import-module/index.js new file mode 100644 index 00000000000..76922431787 --- /dev/null +++ b/test/configCases/concatenate-modules/import-module/index.js @@ -0,0 +1,7 @@ +import url from "./loader!!"; +import {url as url2} from "./module1"; + +it("should compile and run", () => { + expect(url).toBe("webpack:///a.txt"); + expect(url2.toString()).toMatch(/^file:/); +}); diff --git a/test/configCases/concatenate-modules/import-module/loader.js b/test/configCases/concatenate-modules/import-module/loader.js new file mode 100644 index 00000000000..504ccb68ba8 --- /dev/null +++ b/test/configCases/concatenate-modules/import-module/loader.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { + const callback = this.async(); + this.importModule("./module1", { baseUri: "webpack://" }, (err, exports) => { + if (err) return callback(err); + callback(null, `module.exports = ${JSON.stringify(exports.url)}`); + }); +}; diff --git a/test/configCases/concatenate-modules/import-module/module1.js b/test/configCases/concatenate-modules/import-module/module1.js new file mode 100644 index 00000000000..5600ae2d20d --- /dev/null +++ b/test/configCases/concatenate-modules/import-module/module1.js @@ -0,0 +1,3 @@ +const url = new URL("./a.txt", import.meta.url); + +export { url } diff --git a/test/configCases/concatenate-modules/import-module/webpack.config.js b/test/configCases/concatenate-modules/import-module/webpack.config.js new file mode 100644 index 00000000000..161c13c0dd5 --- /dev/null +++ b/test/configCases/concatenate-modules/import-module/webpack.config.js @@ -0,0 +1,6 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + assetModuleFilename: "[name][ext]" + } +}; diff --git a/test/configCases/concatenate-modules/issue-13022/a.js b/test/configCases/concatenate-modules/issue-13022/a.js new file mode 100644 index 00000000000..a87b4d9f98c --- /dev/null +++ b/test/configCases/concatenate-modules/issue-13022/a.js @@ -0,0 +1,4 @@ +const doc = console; +const setTimeout = 1; + +export default 1; diff --git a/test/configCases/concatenate-modules/issue-13022/index.js b/test/configCases/concatenate-modules/issue-13022/index.js new file mode 100644 index 00000000000..5395e7c6ba8 --- /dev/null +++ b/test/configCases/concatenate-modules/issue-13022/index.js @@ -0,0 +1,11 @@ +import "./a"; + +setTimeout(() => {}, 0); + +const doc = console; + +export default 1; + +it("should compile and run", () => { + expect(doc).toBe(console); +}); diff --git a/test/configCases/concatenate-modules/issue-13022/webpack.config.js b/test/configCases/concatenate-modules/issue-13022/webpack.config.js new file mode 100644 index 00000000000..dbbdda7ead7 --- /dev/null +++ b/test/configCases/concatenate-modules/issue-13022/webpack.config.js @@ -0,0 +1,29 @@ +const path = require("path"); + +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + entry: { + index: path.resolve(__dirname, "./index.js") + }, + output: { + library: "[name]", + libraryExport: "default" + }, + optimization: { + concatenateModules: true + } + }, + { + entry: { + index: path.resolve(__dirname, "./index.js") + }, + output: { + library: "[name]_doc", + libraryExport: "default" + }, + optimization: { + concatenateModules: true + } + } +]; diff --git a/test/configCases/concatenate-modules/load-chunk-function/a.js b/test/configCases/concatenate-modules/load-chunk-function/a.js new file mode 100644 index 00000000000..c55f5601080 --- /dev/null +++ b/test/configCases/concatenate-modules/load-chunk-function/a.js @@ -0,0 +1,2 @@ +import "./c"; +export default import("./b"); diff --git a/test/configCases/concatenate-modules/load-chunk-function/b.js b/test/configCases/concatenate-modules/load-chunk-function/b.js new file mode 100644 index 00000000000..a68ac2819dc --- /dev/null +++ b/test/configCases/concatenate-modules/load-chunk-function/b.js @@ -0,0 +1 @@ +export default 'b'; diff --git a/test/configCases/concatenate-modules/load-chunk-function/c.js b/test/configCases/concatenate-modules/load-chunk-function/c.js new file mode 100644 index 00000000000..37a4d86fac7 --- /dev/null +++ b/test/configCases/concatenate-modules/load-chunk-function/c.js @@ -0,0 +1 @@ +export default 'c'; diff --git a/test/configCases/concatenate-modules/load-chunk-function/entry1.js b/test/configCases/concatenate-modules/load-chunk-function/entry1.js new file mode 100644 index 00000000000..6929783272f --- /dev/null +++ b/test/configCases/concatenate-modules/load-chunk-function/entry1.js @@ -0,0 +1,7 @@ +import a from "./a"; +import b from "./b"; + +it("should load fine", () => { + expect(b).toBe("b"); + return a.then(a => expect(a).toEqual(nsObj({ default: "b" }))); +}); diff --git a/test/configCases/concatenate-modules/load-chunk-function/entry2.js b/test/configCases/concatenate-modules/load-chunk-function/entry2.js new file mode 100644 index 00000000000..f23aa054519 --- /dev/null +++ b/test/configCases/concatenate-modules/load-chunk-function/entry2.js @@ -0,0 +1,5 @@ +import a from "./a"; + +it("should load fine", () => { + return a.then(a => expect(a).toEqual(nsObj({ default: "b" }))); +}); diff --git a/test/configCases/concatenate-modules/load-chunk-function/test.config.js b/test/configCases/concatenate-modules/load-chunk-function/test.config.js new file mode 100644 index 00000000000..76c7ddf80f5 --- /dev/null +++ b/test/configCases/concatenate-modules/load-chunk-function/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["entry1.js", "entry2.js"]; + } +}; diff --git a/test/configCases/concatenate-modules/load-chunk-function/webpack.config.js b/test/configCases/concatenate-modules/load-chunk-function/webpack.config.js new file mode 100644 index 00000000000..1a64af2a394 --- /dev/null +++ b/test/configCases/concatenate-modules/load-chunk-function/webpack.config.js @@ -0,0 +1,13 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + entry1: "./entry1", + entry2: "./entry2" + }, + output: { + filename: "[name].js" + }, + optimization: { + concatenateModules: true + } +}; diff --git a/test/configCases/concatenate-modules/rename-10168/A.js b/test/configCases/concatenate-modules/rename-10168/A.js new file mode 100644 index 00000000000..1e14df5446a --- /dev/null +++ b/test/configCases/concatenate-modules/rename-10168/A.js @@ -0,0 +1 @@ +export class A {} diff --git a/test/configCases/concatenate-modules/rename-10168/B.js b/test/configCases/concatenate-modules/rename-10168/B.js new file mode 100644 index 00000000000..1aa41a54a30 --- /dev/null +++ b/test/configCases/concatenate-modules/rename-10168/B.js @@ -0,0 +1 @@ +export class B {} diff --git a/test/configCases/concatenate-modules/rename-10168/C.js b/test/configCases/concatenate-modules/rename-10168/C.js new file mode 100644 index 00000000000..cab477669da --- /dev/null +++ b/test/configCases/concatenate-modules/rename-10168/C.js @@ -0,0 +1,10 @@ +import { B as BB } from "./B"; + +const X = 0; +var Y = 0; + +export class C extends (function() { + var A = 0; + var B = 0; + return BB; +})() {} diff --git a/test/configCases/concatenate-modules/rename-10168/D.js b/test/configCases/concatenate-modules/rename-10168/D.js new file mode 100644 index 00000000000..01b958f66df --- /dev/null +++ b/test/configCases/concatenate-modules/rename-10168/D.js @@ -0,0 +1 @@ +export class D {} diff --git a/test/configCases/concatenate-modules/rename-10168/E.js b/test/configCases/concatenate-modules/rename-10168/E.js new file mode 100644 index 00000000000..42c6b323aa7 --- /dev/null +++ b/test/configCases/concatenate-modules/rename-10168/E.js @@ -0,0 +1,6 @@ +import { D as DD } from "./D"; + +export class E extends (function() { + var D = 0; + return DD; +})() {} diff --git a/test/configCases/concatenate-modules/rename-10168/all.js b/test/configCases/concatenate-modules/rename-10168/all.js new file mode 100644 index 00000000000..a5a83665bb8 --- /dev/null +++ b/test/configCases/concatenate-modules/rename-10168/all.js @@ -0,0 +1,6 @@ +import { A } from "./A"; +export { A }; +export { B } from "./B"; +export { C as CC } from "./C"; +export { D } from "./D"; +export { E } from "./E"; diff --git a/test/configCases/concatenate-modules/rename-10168/index.js b/test/configCases/concatenate-modules/rename-10168/index.js new file mode 100644 index 00000000000..815de5b0cd0 --- /dev/null +++ b/test/configCases/concatenate-modules/rename-10168/index.js @@ -0,0 +1,12 @@ +import { A, B, CC, D, E } from "./all"; + +require("./all"); +require("./D"); + +it("should not rename classes unnecessary", () => { + expect(A.name).toBe("A"); + expect(B.name).toBe("B_B"); + expect(CC.name).toBe("C"); + expect(D.name).toBe("D"); + expect(E.name).toBe("E"); +}); diff --git a/test/configCases/concatenate-modules/rename-10168/webpack.config.js b/test/configCases/concatenate-modules/rename-10168/webpack.config.js new file mode 100644 index 00000000000..c939ba33f61 --- /dev/null +++ b/test/configCases/concatenate-modules/rename-10168/webpack.config.js @@ -0,0 +1,6 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + concatenateModules: true + } +}; diff --git a/test/configCases/concatenate-modules/side-effects/index.js b/test/configCases/concatenate-modules/side-effects/index.js new file mode 100644 index 00000000000..354609dca02 --- /dev/null +++ b/test/configCases/concatenate-modules/side-effects/index.js @@ -0,0 +1,11 @@ +import { b, a, c } from "dep"; + +c.cc(); +b.bbb(); +a.aa(); + +import { order } from "dep/order.js"; + +it("should import side-effect-free modules in deterministic order (usage order)", () => { + expect(order).toEqual(["c", "b", "a"]); +}); diff --git a/test/configCases/concatenate-modules/side-effects/node_modules/dep/a.js b/test/configCases/concatenate-modules/side-effects/node_modules/dep/a.js new file mode 100644 index 00000000000..e913fb686ff --- /dev/null +++ b/test/configCases/concatenate-modules/side-effects/node_modules/dep/a.js @@ -0,0 +1,4 @@ +import { track } from "./order.js"; +track("a"); +export function aa() {} +export function aaa() {} diff --git a/test/configCases/concatenate-modules/side-effects/node_modules/dep/b.js b/test/configCases/concatenate-modules/side-effects/node_modules/dep/b.js new file mode 100644 index 00000000000..f6ffeb634bc --- /dev/null +++ b/test/configCases/concatenate-modules/side-effects/node_modules/dep/b.js @@ -0,0 +1,4 @@ +import { track } from "./order.js"; +track("b"); +export function bb() {} +export function bbb() {} diff --git a/test/configCases/concatenate-modules/side-effects/node_modules/dep/c.js b/test/configCases/concatenate-modules/side-effects/node_modules/dep/c.js new file mode 100644 index 00000000000..4478c310b26 --- /dev/null +++ b/test/configCases/concatenate-modules/side-effects/node_modules/dep/c.js @@ -0,0 +1,4 @@ +import { track } from "./order.js"; +track("c"); +export function cc() {} +export function ccc() {} diff --git a/test/configCases/concatenate-modules/side-effects/node_modules/dep/index.js b/test/configCases/concatenate-modules/side-effects/node_modules/dep/index.js new file mode 100644 index 00000000000..6195488abca --- /dev/null +++ b/test/configCases/concatenate-modules/side-effects/node_modules/dep/index.js @@ -0,0 +1,8 @@ +import * as a from "./a.js"; +import * as b from "./b.js"; +import * as c from "./c.js"; +export { + a, + b, + c +} diff --git a/test/configCases/concatenate-modules/side-effects/node_modules/dep/order.js b/test/configCases/concatenate-modules/side-effects/node_modules/dep/order.js new file mode 100644 index 00000000000..306f83ab171 --- /dev/null +++ b/test/configCases/concatenate-modules/side-effects/node_modules/dep/order.js @@ -0,0 +1,4 @@ +export let order = []; +export function track(name) { + order.push(name); +} diff --git a/test/configCases/concatenate-modules/side-effects/node_modules/dep/package.json b/test/configCases/concatenate-modules/side-effects/node_modules/dep/package.json new file mode 100644 index 00000000000..644d902d8e0 --- /dev/null +++ b/test/configCases/concatenate-modules/side-effects/node_modules/dep/package.json @@ -0,0 +1,6 @@ +{ + "name": "dep", + "version": "1.0.0", + "type": "module", + "sideEffects": false +} diff --git a/test/configCases/concatenate-modules/side-effects/webpack.config.js b/test/configCases/concatenate-modules/side-effects/webpack.config.js new file mode 100644 index 00000000000..c939ba33f61 --- /dev/null +++ b/test/configCases/concatenate-modules/side-effects/webpack.config.js @@ -0,0 +1,6 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + concatenateModules: true + } +}; diff --git a/test/configCases/concatenate-modules/split-chunk-entry-module/a.js b/test/configCases/concatenate-modules/split-chunk-entry-module/a.js new file mode 100644 index 00000000000..46124d989cb --- /dev/null +++ b/test/configCases/concatenate-modules/split-chunk-entry-module/a.js @@ -0,0 +1 @@ +import './b'; diff --git a/test/configCases/concatenate-modules/split-chunk-entry-module/b.js b/test/configCases/concatenate-modules/split-chunk-entry-module/b.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/concatenate-modules/split-chunk-entry-module/index.js b/test/configCases/concatenate-modules/split-chunk-entry-module/index.js new file mode 100644 index 00000000000..1956e006d1d --- /dev/null +++ b/test/configCases/concatenate-modules/split-chunk-entry-module/index.js @@ -0,0 +1,3 @@ +import './a'; + +it("should compile and evaluate fine", () => {}); diff --git a/test/configCases/concatenate-modules/split-chunk-entry-module/test.config.js b/test/configCases/concatenate-modules/split-chunk-entry-module/test.config.js new file mode 100644 index 00000000000..6f8ffeaa317 --- /dev/null +++ b/test/configCases/concatenate-modules/split-chunk-entry-module/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["runtime.js", "common-index_js.js", "main.js"]; + } +}; diff --git a/test/configCases/concatenate-modules/split-chunk-entry-module/webpack.config.js b/test/configCases/concatenate-modules/split-chunk-entry-module/webpack.config.js new file mode 100644 index 00000000000..16ed8a8d82c --- /dev/null +++ b/test/configCases/concatenate-modules/split-chunk-entry-module/webpack.config.js @@ -0,0 +1,24 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + main: "./index" + }, + target: "web", + output: { + filename: "[name].js" + }, + optimization: { + concatenateModules: true, + chunkIds: "named", + runtimeChunk: "single", + splitChunks: { + minSize: 0, + cacheGroups: { + common: { + chunks: "initial", + minChunks: 1 + } + } + } + } +}; diff --git a/test/configCases/container/0-container-full/App.js b/test/configCases/container/0-container-full/App.js new file mode 100644 index 00000000000..bedb022ffbe --- /dev/null +++ b/test/configCases/container/0-container-full/App.js @@ -0,0 +1,6 @@ +import React from "react"; +import ComponentA from "containerA/ComponentA"; + +export default () => { + return `App rendered with [${React()}] and [${ComponentA()}]`; +}; diff --git a/test/configCases/container/0-container-full/ComponentA.js b/test/configCases/container/0-container-full/ComponentA.js new file mode 100644 index 00000000000..9a98b9948bf --- /dev/null +++ b/test/configCases/container/0-container-full/ComponentA.js @@ -0,0 +1,5 @@ +import React from "react"; + +export default () => { + return `ComponentA rendered with [${React()}]`; +}; diff --git a/test/configCases/container/0-container-full/index.js b/test/configCases/container/0-container-full/index.js new file mode 100644 index 00000000000..a9d2a8ca12d --- /dev/null +++ b/test/configCases/container/0-container-full/index.js @@ -0,0 +1,15 @@ +it("should load the component from container", () => { + return import("./App").then(({ default: App }) => { + const rendered = App(); + expect(rendered).toBe( + "App rendered with [This is react 0.1.2] and [ComponentA rendered with [This is react 0.1.2]]" + ); + return import("./upgrade-react").then(({ default: upgrade }) => { + upgrade(); + const rendered = App(); + expect(rendered).toBe( + "App rendered with [This is react 1.2.3] and [ComponentA rendered with [This is react 1.2.3]]" + ); + }); + }); +}); diff --git a/test/configCases/container/0-container-full/node_modules/react.js b/test/configCases/container/0-container-full/node_modules/react.js new file mode 100644 index 00000000000..bcf433f2afb --- /dev/null +++ b/test/configCases/container/0-container-full/node_modules/react.js @@ -0,0 +1,3 @@ +let version = "0.1.2"; +export default () => `This is react ${version}`; +export function setVersion(v) { version = v; } diff --git a/test/configCases/container/0-container-full/test.config.js b/test/configCases/container/0-container-full/test.config.js new file mode 100644 index 00000000000..0755f427ddc --- /dev/null +++ b/test/configCases/container/0-container-full/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return i === 0 ? "./main.js" : "./module/main.mjs"; + } +}; diff --git a/test/configCases/container/0-container-full/upgrade-react.js b/test/configCases/container/0-container-full/upgrade-react.js new file mode 100644 index 00000000000..d26755be2c7 --- /dev/null +++ b/test/configCases/container/0-container-full/upgrade-react.js @@ -0,0 +1,5 @@ +import { setVersion } from "react"; + +export default function upgrade() { + setVersion("1.2.3"); +} diff --git a/test/configCases/container/0-container-full/webpack.config.js b/test/configCases/container/0-container-full/webpack.config.js new file mode 100644 index 00000000000..3fe8d8bab2c --- /dev/null +++ b/test/configCases/container/0-container-full/webpack.config.js @@ -0,0 +1,61 @@ +const { ModuleFederationPlugin } = require("../../../../").container; + +/** @type {ConstructorParameters[0]} */ +const common = { + name: "container", + exposes: { + "./ComponentA": { + import: "./ComponentA" + } + }, + shared: { + react: { + version: false, + requiredVersion: false + } + } +}; + +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + output: { + filename: "[name].js", + uniqueName: "0-container-full" + }, + plugins: [ + new ModuleFederationPlugin({ + library: { type: "commonjs-module" }, + filename: "container.js", + remotes: { + containerA: { + external: "./container.js" + } + }, + ...common + }) + ] + }, + { + experiments: { + outputModule: true + }, + output: { + filename: "module/[name].mjs", + uniqueName: "0-container-full-mjs" + }, + plugins: [ + new ModuleFederationPlugin({ + library: { type: "module" }, + filename: "module/container.mjs", + remotes: { + containerA: { + external: "./container.mjs" + } + }, + ...common + }) + ], + target: "node14" + } +]; diff --git a/test/configCases/container/0-eager-shared/App.js b/test/configCases/container/0-eager-shared/App.js new file mode 100644 index 00000000000..aa4e4480be0 --- /dev/null +++ b/test/configCases/container/0-eager-shared/App.js @@ -0,0 +1,7 @@ +import { emitter } from "./emitter.js"; + +function App() { + return emitter; +} + +export default App; diff --git a/test/configCases/container/0-eager-shared/emitter.js b/test/configCases/container/0-eager-shared/emitter.js new file mode 100644 index 00000000000..199bf88f9ab --- /dev/null +++ b/test/configCases/container/0-eager-shared/emitter.js @@ -0,0 +1,9 @@ +import { TinyEmitter } from 'tiny-emitter' + +const emitter = new TinyEmitter() + +emitter.on('hello', () => console.log('hello[service]')) + +export { + emitter, +} diff --git a/test/configCases/container/0-eager-shared/index.js b/test/configCases/container/0-eager-shared/index.js new file mode 100644 index 00000000000..d512f614112 --- /dev/null +++ b/test/configCases/container/0-eager-shared/index.js @@ -0,0 +1,6 @@ +it("should allow to import exposed modules sync", () => { + return import("./App").then(({ default: App }) => { + expect(App().e.hello).toBeDefined(); + }); +}); + diff --git a/test/configCases/container/0-eager-shared/node_modules/tiny-emitter/index.js b/test/configCases/container/0-eager-shared/node_modules/tiny-emitter/index.js new file mode 100644 index 00000000000..7ca4a606e18 --- /dev/null +++ b/test/configCases/container/0-eager-shared/node_modules/tiny-emitter/index.js @@ -0,0 +1,67 @@ +function E () { + // Keep this empty so it's easier to inherit from + // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3) +} + +E.prototype = { + on: function (name, callback, ctx) { + var e = this.e || (this.e = {}); + + (e[name] || (e[name] = [])).push({ + fn: callback, + ctx: ctx + }); + + return this; + }, + + once: function (name, callback, ctx) { + var self = this; + function listener () { + self.off(name, listener); + callback.apply(ctx, arguments); + }; + + listener._ = callback + return this.on(name, listener, ctx); + }, + + emit: function (name) { + var data = [].slice.call(arguments, 1); + var evtArr = ((this.e || (this.e = {}))[name] || []).slice(); + var i = 0; + var len = evtArr.length; + + for (i; i < len; i++) { + evtArr[i].fn.apply(evtArr[i].ctx, data); + } + + return this; + }, + + off: function (name, callback) { + var e = this.e || (this.e = {}); + var evts = e[name]; + var liveEvents = []; + + if (evts && callback) { + for (var i = 0, len = evts.length; i < len; i++) { + if (evts[i].fn !== callback && evts[i].fn._ !== callback) + liveEvents.push(evts[i]); + } + } + + // Remove event from queue to prevent memory leak + // Suggested by https://github.com/lazd + // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910 + + (liveEvents.length) + ? e[name] = liveEvents + : delete e[name]; + + return this; + } +}; + +module.exports = E; +module.exports.TinyEmitter = E; diff --git a/test/configCases/container/0-eager-shared/node_modules/tiny-emitter/package.json b/test/configCases/container/0-eager-shared/node_modules/tiny-emitter/package.json new file mode 100644 index 00000000000..4bf445b8e9f --- /dev/null +++ b/test/configCases/container/0-eager-shared/node_modules/tiny-emitter/package.json @@ -0,0 +1,7 @@ +{ + "name": "tiny-emitter", + "version": "2.1.0", + "description": "A tiny (less than 1k) event emitter library", + "main": "index.js", + "license": "MIT" +} diff --git a/test/configCases/container/0-eager-shared/package.json b/test/configCases/container/0-eager-shared/package.json new file mode 100644 index 00000000000..7fc07107aa7 --- /dev/null +++ b/test/configCases/container/0-eager-shared/package.json @@ -0,0 +1,9 @@ +{ + "private": true, + "engines": { + "node": ">=10.13.0" + }, + "dependencies": { + "tiny-emitter": "^2.1.0" + } +} diff --git a/test/configCases/container/0-eager-shared/webpack.config.js b/test/configCases/container/0-eager-shared/webpack.config.js new file mode 100644 index 00000000000..f50ceb49734 --- /dev/null +++ b/test/configCases/container/0-eager-shared/webpack.config.js @@ -0,0 +1,26 @@ +const { dependencies } = require("./package.json"); +const { ModuleFederationPlugin } = require("../../../../").container; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + chunkIds: "named", + moduleIds: "named" + }, + plugins: [ + new ModuleFederationPlugin({ + name: "container", + filename: "container.js", + library: { type: "commonjs-module" }, + exposes: { + "./emitter": { + name: "emitter", + import: "./emitter.js" + } + }, + shared: { + ...dependencies + } + }) + ] +}; diff --git a/test/configCases/container/0-transitive-overriding/a.js b/test/configCases/container/0-transitive-overriding/a.js new file mode 100644 index 00000000000..14065b7bb3f --- /dev/null +++ b/test/configCases/container/0-transitive-overriding/a.js @@ -0,0 +1 @@ +export * from "./b"; diff --git a/test/configCases/container/0-transitive-overriding/b.js b/test/configCases/container/0-transitive-overriding/b.js new file mode 100644 index 00000000000..2ee5f158c98 --- /dev/null +++ b/test/configCases/container/0-transitive-overriding/b.js @@ -0,0 +1 @@ +export * from "./shared"; diff --git a/test/configCases/container/0-transitive-overriding/index.js b/test/configCases/container/0-transitive-overriding/index.js new file mode 100644 index 00000000000..e993ad34d06 --- /dev/null +++ b/test/configCases/container/0-transitive-overriding/index.js @@ -0,0 +1,23 @@ +it("should work normally (a)", () => { + return import("./a").then(({ value }) => { + expect(value).toBe("shared"); + }); +}); + +it("should work normally (b)", () => { + return import("./b").then(({ value }) => { + expect(value).toBe("shared"); + }); +}); + +it("should work normally (container-with-shared/a)", () => { + return import("container-with-shared/a").then(({ value }) => { + expect(value).toBe("shared"); + }); +}); + +it("should work normally (container-with-shared/b)", () => { + return import("container-with-shared/b").then(({ value }) => { + expect(value).toBe("shared"); + }); +}); diff --git a/test/configCases/container/0-transitive-overriding/modules.js b/test/configCases/container/0-transitive-overriding/modules.js new file mode 100644 index 00000000000..8e19db7b0c6 --- /dev/null +++ b/test/configCases/container/0-transitive-overriding/modules.js @@ -0,0 +1 @@ +export default Object.keys(__webpack_modules__).sort(); diff --git a/test/configCases/container/0-transitive-overriding/shared.js b/test/configCases/container/0-transitive-overriding/shared.js new file mode 100644 index 00000000000..1fba08a2ae1 --- /dev/null +++ b/test/configCases/container/0-transitive-overriding/shared.js @@ -0,0 +1 @@ +export const value = "shared"; diff --git a/test/configCases/container/0-transitive-overriding/webpack.config.js b/test/configCases/container/0-transitive-overriding/webpack.config.js new file mode 100644 index 00000000000..82dd86951de --- /dev/null +++ b/test/configCases/container/0-transitive-overriding/webpack.config.js @@ -0,0 +1,26 @@ +const { ModuleFederationPlugin } = require("../../../../").container; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + chunkIds: "named", + moduleIds: "named" + }, + plugins: [ + new ModuleFederationPlugin({ + name: "container-with-shared", + library: { type: "commonjs-module" }, + filename: "container-with-shared.js", + exposes: ["./a", "./b", "./modules"], + remotes: { + "container-with-shared": "./container-with-shared.js" + }, + shared: { + "./shared": { + shareKey: "shared", + version: "1" + } + } + }) + ] +}; diff --git a/test/configCases/container/1-container-full/App.js b/test/configCases/container/1-container-full/App.js new file mode 100644 index 00000000000..43f44221946 --- /dev/null +++ b/test/configCases/container/1-container-full/App.js @@ -0,0 +1,10 @@ +import React from "react"; +import ComponentA from "containerA/ComponentA"; +import ComponentB from "containerB/ComponentB"; +import LocalComponentB from "./ComponentB"; + +export default () => { + return `App rendered with [${React()}] and [${ComponentA()}] and [${ComponentB()}]`; +}; + +expect(ComponentB).not.toBe(LocalComponentB); diff --git a/test/configCases/container/1-container-full/ComponentB.js b/test/configCases/container/1-container-full/ComponentB.js new file mode 100644 index 00000000000..1943469c746 --- /dev/null +++ b/test/configCases/container/1-container-full/ComponentB.js @@ -0,0 +1,5 @@ +import React from "react"; + +export default () => { + return `ComponentB rendered with [${React()}]`; +}; diff --git a/test/configCases/container/1-container-full/ComponentC.js b/test/configCases/container/1-container-full/ComponentC.js new file mode 100644 index 00000000000..3ff3832c718 --- /dev/null +++ b/test/configCases/container/1-container-full/ComponentC.js @@ -0,0 +1,7 @@ +import React from "react"; +import ComponentA from "containerA/ComponentA"; +import ComponentB from "containerB/ComponentB"; + +export default () => { + return `ComponentC rendered with [${React()}] and [${ComponentA()}] and [${ComponentB()}]`; +}; diff --git a/test/configCases/container/1-container-full/index.js b/test/configCases/container/1-container-full/index.js new file mode 100644 index 00000000000..e39cf3c9316 --- /dev/null +++ b/test/configCases/container/1-container-full/index.js @@ -0,0 +1,15 @@ +it("should load the component from container", () => { + return import("./App").then(({ default: App }) => { + const rendered = App(); + expect(rendered).toBe( + "App rendered with [This is react 2.1.0] and [ComponentA rendered with [This is react 2.1.0]] and [ComponentB rendered with [This is react 2.1.0]]" + ); + return import("./upgrade-react").then(({ default: upgrade }) => { + upgrade(); + const rendered = App(); + expect(rendered).toBe( + "App rendered with [This is react 3.2.1] and [ComponentA rendered with [This is react 3.2.1]] and [ComponentB rendered with [This is react 3.2.1]]" + ); + }); + }); +}); diff --git a/test/configCases/container/1-container-full/node_modules/package.json b/test/configCases/container/1-container-full/node_modules/package.json new file mode 100644 index 00000000000..87032da008a --- /dev/null +++ b/test/configCases/container/1-container-full/node_modules/package.json @@ -0,0 +1,3 @@ +{ + "version": "2.1.0" +} diff --git a/test/configCases/container/1-container-full/node_modules/react.js b/test/configCases/container/1-container-full/node_modules/react.js new file mode 100644 index 00000000000..97d35a4bc9c --- /dev/null +++ b/test/configCases/container/1-container-full/node_modules/react.js @@ -0,0 +1,3 @@ +let version = "2.1.0"; +export default () => `This is react ${version}`; +export function setVersion(v) { version = v; } diff --git a/test/configCases/container/1-container-full/package.json b/test/configCases/container/1-container-full/package.json new file mode 100644 index 00000000000..be6238fec84 --- /dev/null +++ b/test/configCases/container/1-container-full/package.json @@ -0,0 +1,9 @@ +{ + "private": true, + "engines": { + "node": ">=10.13.0" + }, + "dependencies": { + "react": "*" + } +} diff --git a/test/configCases/container/1-container-full/test.config.js b/test/configCases/container/1-container-full/test.config.js new file mode 100644 index 00000000000..0755f427ddc --- /dev/null +++ b/test/configCases/container/1-container-full/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return i === 0 ? "./main.js" : "./module/main.mjs"; + } +}; diff --git a/test/configCases/container/1-container-full/upgrade-react.js b/test/configCases/container/1-container-full/upgrade-react.js new file mode 100644 index 00000000000..2cadfc0b71a --- /dev/null +++ b/test/configCases/container/1-container-full/upgrade-react.js @@ -0,0 +1,5 @@ +import { setVersion } from "react"; + +export default function upgrade() { + setVersion("3.2.1"); +} diff --git a/test/configCases/container/1-container-full/webpack.config.js b/test/configCases/container/1-container-full/webpack.config.js new file mode 100644 index 00000000000..0c9d66c16d2 --- /dev/null +++ b/test/configCases/container/1-container-full/webpack.config.js @@ -0,0 +1,66 @@ +const { ModuleFederationPlugin } = require("../../../../").container; + +const common = { + entry: { + main: "./index.js" + }, + optimization: { + runtimeChunk: "single" + } +}; + +/** @type {ConstructorParameters[0]} */ +const commonMF = { + runtime: false, + exposes: { + "./ComponentB": "./ComponentB", + "./ComponentC": "./ComponentC" + }, + shared: ["react"] +}; + +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + ...common, + output: { + filename: "[name].js", + uniqueName: "1-container-full" + }, + plugins: [ + new ModuleFederationPlugin({ + name: "container", + library: { type: "commonjs-module" }, + filename: "container.js", + remotes: { + containerA: "../0-container-full/container.js", + containerB: "./container.js" + }, + ...commonMF + }) + ] + }, + { + ...common, + experiments: { + outputModule: true + }, + output: { + filename: "module/[name].mjs", + uniqueName: "1-container-full-mjs" + }, + plugins: [ + new ModuleFederationPlugin({ + name: "container", + library: { type: "module" }, + filename: "module/container.mjs", + remotes: { + containerA: "../../0-container-full/module/container.mjs", + containerB: "./container.mjs" + }, + ...commonMF + }) + ], + target: "node14" + } +]; diff --git a/test/configCases/container/1-transitive-overriding/a.js b/test/configCases/container/1-transitive-overriding/a.js new file mode 100644 index 00000000000..a8d5b547bb7 --- /dev/null +++ b/test/configCases/container/1-transitive-overriding/a.js @@ -0,0 +1 @@ +export * from "container-with-shared/b"; diff --git a/test/configCases/container/1-transitive-overriding/b.js b/test/configCases/container/1-transitive-overriding/b.js new file mode 100644 index 00000000000..2ee5f158c98 --- /dev/null +++ b/test/configCases/container/1-transitive-overriding/b.js @@ -0,0 +1 @@ +export * from "./shared"; diff --git a/test/configCases/container/1-transitive-overriding/index.js b/test/configCases/container/1-transitive-overriding/index.js new file mode 100644 index 00000000000..b5fd77622f5 --- /dev/null +++ b/test/configCases/container/1-transitive-overriding/index.js @@ -0,0 +1,35 @@ +it("should work normally (a)", () => { + return import("./a").then(({ value }) => { + expect(value).toBe("shared"); + }); +}); + +it("should work normally (b)", () => { + return import("./b").then(({ value }) => { + expect(value).toBe("shared"); + }); +}); + +it("should work normally (container-with-shared/a)", () => { + return import("container-with-shared/a").then(({ value }) => { + expect(value).toBe("shared"); + }); +}); + +it("should work normally (container-with-shared/b)", () => { + return import("container-with-shared/b").then(({ value }) => { + expect(value).toBe("shared"); + }); +}); + +it("should work normally (container-no-shared/a)", () => { + return import("container-no-shared/a").then(({ value }) => { + expect(value).toBe("shared"); + }); +}); + +it("should work normally (container-no-shared/b)", () => { + return import("container-no-shared/b").then(({ value }) => { + expect(value).toBe("shared"); + }); +}); diff --git a/test/configCases/container/1-transitive-overriding/modules-from-remote.js b/test/configCases/container/1-transitive-overriding/modules-from-remote.js new file mode 100644 index 00000000000..673fcd836b4 --- /dev/null +++ b/test/configCases/container/1-transitive-overriding/modules-from-remote.js @@ -0,0 +1 @@ +export { default } from "container-with-shared/modules"; diff --git a/test/configCases/container/1-transitive-overriding/modules.js b/test/configCases/container/1-transitive-overriding/modules.js new file mode 100644 index 00000000000..8e19db7b0c6 --- /dev/null +++ b/test/configCases/container/1-transitive-overriding/modules.js @@ -0,0 +1 @@ +export default Object.keys(__webpack_modules__).sort(); diff --git a/test/configCases/container/1-transitive-overriding/shared.js b/test/configCases/container/1-transitive-overriding/shared.js new file mode 100644 index 00000000000..1fba08a2ae1 --- /dev/null +++ b/test/configCases/container/1-transitive-overriding/shared.js @@ -0,0 +1 @@ +export const value = "shared"; diff --git a/test/configCases/container/1-transitive-overriding/webpack.config.js b/test/configCases/container/1-transitive-overriding/webpack.config.js new file mode 100644 index 00000000000..71b4410b9c8 --- /dev/null +++ b/test/configCases/container/1-transitive-overriding/webpack.config.js @@ -0,0 +1,22 @@ +const { ModuleFederationPlugin } = require("../../../../").container; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + chunkIds: "named", + moduleIds: "named" + }, + plugins: [ + new ModuleFederationPlugin({ + name: "container-no-shared", + library: { type: "commonjs-module" }, + filename: "container-no-shared.js", + exposes: ["./a", "./b", "./modules", "./modules-from-remote"], + remotes: { + "container-with-shared": + "../0-transitive-overriding/container-with-shared.js", + "container-no-shared": "./container-no-shared.js" + } + }) + ] +}; diff --git a/test/configCases/container/2-container-full/App.js b/test/configCases/container/2-container-full/App.js new file mode 100644 index 00000000000..24380bb85a7 --- /dev/null +++ b/test/configCases/container/2-container-full/App.js @@ -0,0 +1,8 @@ +import OldReact from "old-react"; +import OldReactSingleton from "old-react-singleton"; +import React from "react"; +import ComponentC from "containerB/ComponentC"; + +export default () => { + return `App rendered with [${React()}] and [${OldReact()}] and [${OldReactSingleton()}] and [${ComponentC()}]`; +}; diff --git a/test/configCases/container/2-container-full/Self.js b/test/configCases/container/2-container-full/Self.js new file mode 100644 index 00000000000..7a0d1cfcae9 --- /dev/null +++ b/test/configCases/container/2-container-full/Self.js @@ -0,0 +1,3 @@ +export default { + in: __filename +}; diff --git a/test/configCases/container/2-container-full/index.js b/test/configCases/container/2-container-full/index.js new file mode 100644 index 00000000000..4dcf93a5a1e --- /dev/null +++ b/test/configCases/container/2-container-full/index.js @@ -0,0 +1,55 @@ +let warnings = []; +let oldWarn; + +beforeEach(done => { + oldWarn = console.warn; + console.warn = m => warnings.push(m); + done(); +}); + +afterEach(done => { + expectWarning(); + console.warn = oldWarn; + done(); +}); + +const expectWarning = regexp => { + if (!regexp) { + expect(warnings).toEqual([]); + } else { + expect(warnings).toEqual( + expect.objectContaining({ + 0: expect.stringMatching(regexp), + length: 1 + }) + ); + } + warnings.length = 0; +}; + +it("should load the component from container", () => { + return import("./App").then(({ default: App }) => { + expectWarning( + /Unsatisfied version 8 from 2-container-full of shared singleton module react \(required \^2\)/ + ); + const rendered = App(); + expect(rendered).toBe( + "App rendered with [This is react 8] and [This is react 2.1.0] and [This is react 8] and [ComponentC rendered with [This is react 8] and [ComponentA rendered with [This is react 8]] and [ComponentB rendered with [This is react 8]]]" + ); + return import("./upgrade-react").then(({ default: upgrade }) => { + upgrade(); + const rendered = App(); + expect(rendered).toBe( + "App rendered with [This is react 9] and [This is react 2.1.0] and [This is react 9] and [ComponentC rendered with [This is react 9] and [ComponentA rendered with [This is react 9]] and [ComponentB rendered with [This is react 9]]]" + ); + }); + }); +}); + +import Self from "./Self"; + +it("should load itself from its own container", () => { + return import("self/Self").then(({ default: RemoteSelf }) => { + expect(RemoteSelf).toBe(Self); + }); +}); diff --git a/test/configCases/container/2-container-full/node_modules/package.json b/test/configCases/container/2-container-full/node_modules/package.json new file mode 100644 index 00000000000..88d4e7f3e51 --- /dev/null +++ b/test/configCases/container/2-container-full/node_modules/package.json @@ -0,0 +1,3 @@ +{ + "version": "8" +} diff --git a/test/configCases/container/2-container-full/node_modules/react.js b/test/configCases/container/2-container-full/node_modules/react.js new file mode 100644 index 00000000000..ab65e86c7fe --- /dev/null +++ b/test/configCases/container/2-container-full/node_modules/react.js @@ -0,0 +1,3 @@ +let version = "8"; +export default () => `This is react ${version}`; +export function setVersion(v) { version = v; } diff --git a/test/configCases/container/2-container-full/package.json b/test/configCases/container/2-container-full/package.json new file mode 100644 index 00000000000..e04e63e83ad --- /dev/null +++ b/test/configCases/container/2-container-full/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "react": "*" + } +} diff --git a/test/configCases/container/2-container-full/upgrade-react.js b/test/configCases/container/2-container-full/upgrade-react.js new file mode 100644 index 00000000000..083ef3a4541 --- /dev/null +++ b/test/configCases/container/2-container-full/upgrade-react.js @@ -0,0 +1,5 @@ +import { setVersion } from "react"; + +export default function upgrade() { + setVersion("9"); +} diff --git a/test/configCases/container/2-container-full/webpack.config.js b/test/configCases/container/2-container-full/webpack.config.js new file mode 100644 index 00000000000..8f8dc9aac55 --- /dev/null +++ b/test/configCases/container/2-container-full/webpack.config.js @@ -0,0 +1,39 @@ +// eslint-disable-next-line n/no-unpublished-require +const { ModuleFederationPlugin } = require("../../../../").container; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + uniqueName: "2-container-full" + }, + plugins: [ + new ModuleFederationPlugin({ + name: "main", + library: { type: "commonjs-module" }, + remotes: { + containerB: "../1-container-full/container.js", + self: [ + "var undefined", + "var (() => { throw new Error(); })()", + "var { then: (a, b) => b(new Error()) }", + "./bundle0.js" + ] + }, + exposes: ["./Self"], + shared: { + react: "react", + "old-react": { + import: false, + shareKey: "react", + requiredVersion: "^2" + }, + "old-react-singleton": { + import: false, + shareKey: "react", + requiredVersion: "^2", + singleton: true + } + } + }) + ] +}; diff --git a/test/configCases/container/2-transitive-overriding/index.js b/test/configCases/container/2-transitive-overriding/index.js new file mode 100644 index 00000000000..f7771726839 --- /dev/null +++ b/test/configCases/container/2-transitive-overriding/index.js @@ -0,0 +1,44 @@ +it("should allow transitive overrides (container-no-shared/a)", () => { + return import("container-no-shared/a").then(({ value }) => { + expect(value).toBe("new shared"); + }); +}); + +it("should not override non-overridables (container-no-shared/b)", () => { + return import("container-no-shared/b").then(({ value }) => { + expect(value).toBe("shared"); + }); +}); + +it("should have good module ids", async () => { + const { default: m0 } = await import( + "container-no-shared/modules-from-remote" + ); + const { default: m1 } = await import("container-no-shared/modules"); + const m2 = Object.keys(__webpack_modules__).sort(); + expect(m0).toEqual([ + "./b.js", + "./modules.js", + "webpack/container/entry/container-with-shared", + "webpack/sharing/consume/default/shared/./shared" + ]); + expect(m1).toEqual([ + "./a.js", + "./b.js", + "./modules-from-remote.js", + "./modules.js", + "webpack/container/entry/container-no-shared", + "webpack/container/reference/container-with-shared", + "webpack/container/remote/container-with-shared/b", + "webpack/container/remote/container-with-shared/modules" + ]); + expect(m2).toEqual([ + "./index.js", + "./shared.js", + "webpack/container/reference/container-no-shared", + "webpack/container/remote/container-no-shared/a", + "webpack/container/remote/container-no-shared/b", + "webpack/container/remote/container-no-shared/modules", + "webpack/container/remote/container-no-shared/modules-from-remote" + ]); +}); diff --git a/test/configCases/container/2-transitive-overriding/shared.js b/test/configCases/container/2-transitive-overriding/shared.js new file mode 100644 index 00000000000..85dc52f0089 --- /dev/null +++ b/test/configCases/container/2-transitive-overriding/shared.js @@ -0,0 +1 @@ +export const value = "new shared"; diff --git a/test/configCases/container/2-transitive-overriding/webpack.config.js b/test/configCases/container/2-transitive-overriding/webpack.config.js new file mode 100644 index 00000000000..3d384985ccb --- /dev/null +++ b/test/configCases/container/2-transitive-overriding/webpack.config.js @@ -0,0 +1,24 @@ +const { ModuleFederationPlugin } = require("../../../../").container; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + chunkIds: "named", + moduleIds: "named" + }, + plugins: [ + new ModuleFederationPlugin({ + remoteType: "commonjs-module", + remotes: { + "container-no-shared": + "../1-transitive-overriding/container-no-shared.js" + }, + shared: { + "./shared": { + shareKey: "shared", + version: "2" + } + } + }) + ] +}; diff --git a/test/configCases/container/3-container-full/App.js b/test/configCases/container/3-container-full/App.js new file mode 100644 index 00000000000..3544d07aa95 --- /dev/null +++ b/test/configCases/container/3-container-full/App.js @@ -0,0 +1,6 @@ +import React from "react"; +import ComponentC from "containerB/ComponentC"; + +export default () => { + return `App rendered with [${React()}] and [${ComponentC()}]`; +}; diff --git a/test/configCases/container/3-container-full/index.js b/test/configCases/container/3-container-full/index.js new file mode 100644 index 00000000000..b1968f6631b --- /dev/null +++ b/test/configCases/container/3-container-full/index.js @@ -0,0 +1,15 @@ +it("should load the component from container", () => { + return import("./App").then(({ default: App }) => { + const rendered = App(); + expect(rendered).toBe( + "App rendered with [This is react 2.1.0] and [ComponentC rendered with [This is react 2.1.0] and [ComponentA rendered with [This is react 2.1.0]] and [ComponentB rendered with [This is react 2.1.0]]]" + ); + return import("./upgrade-react").then(({ default: upgrade }) => { + upgrade(); + const rendered = App(); + expect(rendered).toBe( + "App rendered with [This is react 9] and [ComponentC rendered with [This is react 9] and [ComponentA rendered with [This is react 9]] and [ComponentB rendered with [This is react 9]]]" + ); + }); + }); +}); diff --git a/test/configCases/container/3-container-full/node_modules/react.js b/test/configCases/container/3-container-full/node_modules/react.js new file mode 100644 index 00000000000..ab65e86c7fe --- /dev/null +++ b/test/configCases/container/3-container-full/node_modules/react.js @@ -0,0 +1,3 @@ +let version = "8"; +export default () => `This is react ${version}`; +export function setVersion(v) { version = v; } diff --git a/test/configCases/container/3-container-full/package.json b/test/configCases/container/3-container-full/package.json new file mode 100644 index 00000000000..e04e63e83ad --- /dev/null +++ b/test/configCases/container/3-container-full/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "react": "*" + } +} diff --git a/test/configCases/container/3-container-full/upgrade-react.js b/test/configCases/container/3-container-full/upgrade-react.js new file mode 100644 index 00000000000..083ef3a4541 --- /dev/null +++ b/test/configCases/container/3-container-full/upgrade-react.js @@ -0,0 +1,5 @@ +import { setVersion } from "react"; + +export default function upgrade() { + setVersion("9"); +} diff --git a/test/configCases/container/3-container-full/warnings.js b/test/configCases/container/3-container-full/warnings.js new file mode 100644 index 00000000000..55cee80a314 --- /dev/null +++ b/test/configCases/container/3-container-full/warnings.js @@ -0,0 +1,3 @@ +module.exports = [ + [/No version specified and unable to automatically determine one/] +]; diff --git a/test/configCases/container/3-container-full/webpack.config.js b/test/configCases/container/3-container-full/webpack.config.js new file mode 100644 index 00000000000..a20051ec9af --- /dev/null +++ b/test/configCases/container/3-container-full/webpack.config.js @@ -0,0 +1,15 @@ +// eslint-disable-next-line n/no-unpublished-require +const { ModuleFederationPlugin } = require("../../../../").container; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [ + new ModuleFederationPlugin({ + remoteType: "commonjs-module", + remotes: { + containerB: "../1-container-full/container.js" + }, + shared: ["react"] + }) + ] +}; diff --git a/test/configCases/container/circular/a.js b/test/configCases/container/circular/a.js new file mode 100644 index 00000000000..6c8e707b838 --- /dev/null +++ b/test/configCases/container/circular/a.js @@ -0,0 +1,2 @@ +export default "a"; +export { default as b, a as ba } from "container2/b"; diff --git a/test/configCases/container/circular/b.js b/test/configCases/container/circular/b.js new file mode 100644 index 00000000000..a75475b401e --- /dev/null +++ b/test/configCases/container/circular/b.js @@ -0,0 +1,2 @@ +export default "b"; +export { default as a, b as ab } from "container/a"; diff --git a/test/configCases/container/circular/index.js b/test/configCases/container/circular/index.js new file mode 100644 index 00000000000..50056156585 --- /dev/null +++ b/test/configCases/container/circular/index.js @@ -0,0 +1,13 @@ +it("should allow circular dependencies between containers (a)", async () => { + const { default: value, b, ba } = await import("container/a"); + expect(value).toBe("a"); + expect(b).toBe("b"); + expect(ba).toBe("a"); +}); + +it("should allow circular dependencies between containers (b)", async () => { + const { default: value, a, ab } = await import("container2/b"); + expect(value).toBe("b"); + expect(a).toBe("a"); + expect(ab).toBe("b"); +}); diff --git a/test/configCases/container/circular/test.config.js b/test/configCases/container/circular/test.config.js new file mode 100644 index 00000000000..c0ec1472777 --- /dev/null +++ b/test/configCases/container/circular/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return "./main.js"; + } +}; diff --git a/test/configCases/container/circular/webpack.config.js b/test/configCases/container/circular/webpack.config.js new file mode 100644 index 00000000000..efdae9fc5da --- /dev/null +++ b/test/configCases/container/circular/webpack.config.js @@ -0,0 +1,34 @@ +const { ModuleFederationPlugin } = require("../../../../").container; + +/** + * @returns {import("../../../../").Configuration} configuration + */ +function createConfig() { + return { + output: { + filename: "[name].js" + }, + plugins: [ + new ModuleFederationPlugin({ + name: "container", + library: { type: "commonjs-module" }, + exposes: ["./a"], + remotes: { + container2: + "promise Promise.resolve().then(() => require('./container2.js'))" + } + }), + new ModuleFederationPlugin({ + name: "container2", + library: { type: "commonjs-module" }, + exposes: ["./b"], + remotes: { + container: + "promise Promise.resolve().then(() => require('./container.js'))" + } + }) + ] + }; +} + +module.exports = createConfig(); diff --git a/test/configCases/container/container-entry-overridables/index.js b/test/configCases/container/container-entry-overridables/index.js new file mode 100644 index 00000000000..d7d663cf3b0 --- /dev/null +++ b/test/configCases/container/container-entry-overridables/index.js @@ -0,0 +1,27 @@ +it("should expose modules from the container", async () => { + const container = __non_webpack_require__("./container-file.js"); + expect(container).toBeTypeOf("object"); + expect(container.init).toBeTypeOf("function"); + container.init({ + value: { + "0": { + get: () => + new Promise(resolve => { + setTimeout(() => { + resolve(() => ({ + __esModule: true, + default: "overridden-value" + })); + }, 100); + }) + } + } + }); + const testFactory = await container.get("./test"); + expect(testFactory).toBeTypeOf("function"); + expect(testFactory()).toEqual( + nsObj({ + default: "test overridden-value" + }) + ); +}); diff --git a/test/configCases/container/container-entry-overridables/test.js b/test/configCases/container/container-entry-overridables/test.js new file mode 100644 index 00000000000..20449c1d099 --- /dev/null +++ b/test/configCases/container/container-entry-overridables/test.js @@ -0,0 +1,3 @@ +import value from "./value"; + +export default `test ${value}`; diff --git a/test/configCases/container/container-entry-overridables/value.js b/test/configCases/container/container-entry-overridables/value.js new file mode 100644 index 00000000000..a0698aa0dbc --- /dev/null +++ b/test/configCases/container/container-entry-overridables/value.js @@ -0,0 +1 @@ +export default "value"; diff --git a/test/configCases/container/container-entry-overridables/webpack.config.js b/test/configCases/container/container-entry-overridables/webpack.config.js new file mode 100644 index 00000000000..770f5f4deac --- /dev/null +++ b/test/configCases/container/container-entry-overridables/webpack.config.js @@ -0,0 +1,25 @@ +const { ContainerPlugin } = require("../../../../").container; +const { ConsumeSharedPlugin } = require("../../../../").sharing; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [ + new ContainerPlugin({ + name: "container", + filename: "container-file.js", + library: { + type: "commonjs-module" + }, + exposes: { + "./test": "./test" + } + }), + new ConsumeSharedPlugin({ + consumes: { + "./value": { + shareKey: "value" + } + } + }) + ] +}; diff --git a/test/configCases/container/container-entry/index.js b/test/configCases/container/container-entry/index.js new file mode 100644 index 00000000000..037fbf070f2 --- /dev/null +++ b/test/configCases/container/container-entry/index.js @@ -0,0 +1,19 @@ +it("should expose modules from the container", async () => { + const container = __non_webpack_require__("./container-file.js"); + expect(container).toBeTypeOf("object"); + expect(container.get).toBeTypeOf("function"); + const testFactory = await container.get("./test"); + expect(testFactory).toBeTypeOf("function"); + expect(testFactory()).toBe("test"); + const mainFactory = await container.get("."); + expect(mainFactory).toBeTypeOf("function"); + expect(mainFactory()).toBe("main"); + const test2Factory = await container.get("./test2"); + expect(test2Factory).toBeTypeOf("function"); + expect(test2Factory()).toEqual( + nsObj({ + default: "test2", + other: "other" + }) + ); +}); diff --git a/test/configCases/container/container-entry/init-module.js b/test/configCases/container/container-entry/init-module.js new file mode 100644 index 00000000000..9c40a8e449f --- /dev/null +++ b/test/configCases/container/container-entry/init-module.js @@ -0,0 +1,2 @@ +import { set } from "./state"; +set("ok"); diff --git a/test/configCases/container/container-entry/main.js b/test/configCases/container/container-entry/main.js new file mode 100644 index 00000000000..0470f820157 --- /dev/null +++ b/test/configCases/container/container-entry/main.js @@ -0,0 +1 @@ +module.exports = "main"; diff --git a/test/configCases/container/container-entry/state.js b/test/configCases/container/container-entry/state.js new file mode 100644 index 00000000000..4f5e85fe7d9 --- /dev/null +++ b/test/configCases/container/container-entry/state.js @@ -0,0 +1,4 @@ +export let value = ""; +export function set(v) { + value = v; +} diff --git a/test/configCases/container/container-entry/test.js b/test/configCases/container/container-entry/test.js new file mode 100644 index 00000000000..1caa3322d9a --- /dev/null +++ b/test/configCases/container/container-entry/test.js @@ -0,0 +1 @@ +module.exports = "test"; diff --git a/test/configCases/container/container-entry/test2.js b/test/configCases/container/container-entry/test2.js new file mode 100644 index 00000000000..121fc0290ed --- /dev/null +++ b/test/configCases/container/container-entry/test2.js @@ -0,0 +1,6 @@ +import { value } from "./state"; + +export default "test2"; +export const other = "other"; + +expect(value).toBe("ok"); diff --git a/test/configCases/container/container-entry/webpack.config.js b/test/configCases/container/container-entry/webpack.config.js new file mode 100644 index 00000000000..414cb69b382 --- /dev/null +++ b/test/configCases/container/container-entry/webpack.config.js @@ -0,0 +1,22 @@ +const { ContainerPlugin } = require("../../../../").container; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + pathinfo: true + }, + plugins: [ + new ContainerPlugin({ + name: "container", + filename: "container-file.js", + library: { + type: "commonjs-module" + }, + exposes: { + "./test": "./test", + "./test2": ["./init-module", "./test2"], + ".": "./main" + } + }) + ] +}; diff --git a/test/configCases/container/container-reference-override/index.js b/test/configCases/container/container-reference-override/index.js new file mode 100644 index 00000000000..c8119498de9 --- /dev/null +++ b/test/configCases/container/container-reference-override/index.js @@ -0,0 +1,3 @@ +it("should import the correct modules", () => { + return import("./module").then(({ test }) => test()); +}); diff --git a/test/configCases/container/container-reference-override/module.js b/test/configCases/container/container-reference-override/module.js new file mode 100644 index 00000000000..4cc821b7759 --- /dev/null +++ b/test/configCases/container/container-reference-override/module.js @@ -0,0 +1,7 @@ +import abc from "abc/hello-world"; +import other from "abc/other"; + +export function test() { + expect(abc).toBe("ok ./hello-world"); + expect(other).toBe("ok ./other"); +} diff --git a/test/configCases/container/container-reference-override/new-test.js b/test/configCases/container/container-reference-override/new-test.js new file mode 100644 index 00000000000..50b9a86597c --- /dev/null +++ b/test/configCases/container/container-reference-override/new-test.js @@ -0,0 +1 @@ +module.exports = x => `ok ${x}`; diff --git a/test/configCases/container/container-reference-override/test.config.js b/test/configCases/container/container-reference-override/test.config.js new file mode 100644 index 00000000000..28fa0bd58bd --- /dev/null +++ b/test/configCases/container/container-reference-override/test.config.js @@ -0,0 +1,15 @@ +module.exports = { + moduleScope(scope) { + let ss; + scope.ABC = { + async get(module) { + const testFactory = await ss.test[Object.keys(ss.test)[0]].get(); + const test = testFactory(); + return () => test(module); + }, + async init(shareScope) { + ss = shareScope; + } + }; + } +}; diff --git a/test/configCases/container/container-reference-override/webpack.config.js b/test/configCases/container/container-reference-override/webpack.config.js new file mode 100644 index 00000000000..8f76ef90daa --- /dev/null +++ b/test/configCases/container/container-reference-override/webpack.config.js @@ -0,0 +1,22 @@ +const { ContainerReferencePlugin } = require("../../../../").container; +const { ProvideSharedPlugin } = require("../../../../").sharing; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [ + new ContainerReferencePlugin({ + remoteType: "var", + remotes: { + abc: "ABC" + } + }), + new ProvideSharedPlugin({ + provides: { + "./new-test": { + shareKey: "test", + version: false + } + } + }) + ] +}; diff --git a/test/configCases/container/container-reference/index.js b/test/configCases/container/container-reference/index.js new file mode 100644 index 00000000000..c8119498de9 --- /dev/null +++ b/test/configCases/container/container-reference/index.js @@ -0,0 +1,3 @@ +it("should import the correct modules", () => { + return import("./module").then(({ test }) => test()); +}); diff --git a/test/configCases/container/container-reference/module.js b/test/configCases/container/container-reference/module.js new file mode 100644 index 00000000000..75c5d9e4e1b --- /dev/null +++ b/test/configCases/container/container-reference/module.js @@ -0,0 +1,13 @@ +import abc from "abc/hello-world"; +import main from "abc"; +import def, { module } from "def/hello-world"; +import def2, { module as module2 } from "def/hello/other/world"; + +export function test() { + expect(abc).toBe("abc ./hello-world"); + expect(main).toBe("abc ."); + expect(def).toBe("def"); + expect(def2).toBe("def"); + expect(module).toBe("./hello-world"); + expect(module2).toBe("./hello/other/world"); +} diff --git a/test/configCases/container/container-reference/test.config.js b/test/configCases/container/container-reference/test.config.js new file mode 100644 index 00000000000..96099b8e50f --- /dev/null +++ b/test/configCases/container/container-reference/test.config.js @@ -0,0 +1,26 @@ +module.exports = { + moduleScope(scope) { + scope.ABC = { + get(module) { + return new Promise(resolve => { + setTimeout(() => { + resolve(() => `abc ${module}`); + }, 100); + }); + } + }; + scope.DEF = { + get(module) { + return new Promise(resolve => { + setTimeout(() => { + resolve(() => ({ + __esModule: true, + module, + default: "def" + })); + }, 100); + }); + } + }; + } +}; diff --git a/test/configCases/container/container-reference/webpack.config.js b/test/configCases/container/container-reference/webpack.config.js new file mode 100644 index 00000000000..a73f9f65dfa --- /dev/null +++ b/test/configCases/container/container-reference/webpack.config.js @@ -0,0 +1,14 @@ +const { ContainerReferencePlugin } = require("../../../../").container; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [ + new ContainerReferencePlugin({ + remoteType: "var", + remotes: { + abc: "ABC", + def: "DEF" + } + }) + ] +}; diff --git a/test/configCases/container/eager-shared/index.js b/test/configCases/container/eager-shared/index.js new file mode 100644 index 00000000000..6ca58a71970 --- /dev/null +++ b/test/configCases/container/eager-shared/index.js @@ -0,0 +1,13 @@ +import TinyEmitter from 'tiny-emitter' + +it("should load the component from container", () => { + const emitter = new TinyEmitter() + + emitter.on('hello', () => {}) + + expect(emitter.e.hello).toBeDefined(); + + return import('service/emitter').then(({ emitter }) => { + expect(emitter.e.hello).toBeDefined(); + }) +}); diff --git a/test/configCases/container/eager-shared/node_modules/tiny-emitter/index.js b/test/configCases/container/eager-shared/node_modules/tiny-emitter/index.js new file mode 100644 index 00000000000..b85d8921718 --- /dev/null +++ b/test/configCases/container/eager-shared/node_modules/tiny-emitter/index.js @@ -0,0 +1,66 @@ +function E () { + // Keep this empty so it's easier to inherit from + // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3) +} + +E.prototype = { + on: function (name, callback, ctx) { + var e = this.e || (this.e = {}); + + (e[name] || (e[name] = [])).push({ + fn: callback, + ctx: ctx + }); + + return this; + }, + + once: function (name, callback, ctx) { + var self = this; + function listener () { + self.off(name, listener); + callback.apply(ctx, arguments); + }; + + listener._ = callback + return this.on(name, listener, ctx); + }, + + emit: function (name) { + var data = [].slice.call(arguments, 1); + var evtArr = ((this.e || (this.e = {}))[name] || []).slice(); + var i = 0; + var len = evtArr.length; + + for (i; i < len; i++) { + evtArr[i].fn.apply(evtArr[i].ctx, data); + } + + return this; + }, + + off: function (name, callback) { + var e = this.e || (this.e = {}); + var evts = e[name]; + var liveEvents = []; + + if (evts && callback) { + for (var i = 0, len = evts.length; i < len; i++) { + if (evts[i].fn !== callback && evts[i].fn._ !== callback) + liveEvents.push(evts[i]); + } + } + + // Remove event from queue to prevent memory leak + // Suggested by https://github.com/lazd + // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910 + + (liveEvents.length) + ? e[name] = liveEvents + : delete e[name]; + + return this; + } +}; + +module.exports = E; diff --git a/test/configCases/container/eager-shared/node_modules/tiny-emitter/package.json b/test/configCases/container/eager-shared/node_modules/tiny-emitter/package.json new file mode 100644 index 00000000000..00786ca095d --- /dev/null +++ b/test/configCases/container/eager-shared/node_modules/tiny-emitter/package.json @@ -0,0 +1,7 @@ +{ + "name": "tiny-emitter", + "version": "2.0.0", + "description": "A tiny (less than 1k) event emitter library", + "main": "index.js", + "license": "MIT" +} diff --git a/test/configCases/container/eager-shared/package.json b/test/configCases/container/eager-shared/package.json new file mode 100644 index 00000000000..4460fc7aaab --- /dev/null +++ b/test/configCases/container/eager-shared/package.json @@ -0,0 +1,9 @@ +{ + "private": true, + "engines": { + "node": ">=10.13.0" + }, + "dependencies": { + "tiny-emitter": "=2.0.0" + } +} diff --git a/test/configCases/container/eager-shared/webpack.config.js b/test/configCases/container/eager-shared/webpack.config.js new file mode 100644 index 00000000000..0d31eaeb68c --- /dev/null +++ b/test/configCases/container/eager-shared/webpack.config.js @@ -0,0 +1,25 @@ +const { dependencies } = require("./package.json"); +const { ModuleFederationPlugin } = require("../../../../").container; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + chunkIds: "named", + moduleIds: "named" + }, + plugins: [ + new ModuleFederationPlugin({ + remoteType: "commonjs-module", + remotes: { + service: "../0-eager-shared/container.js" + }, + shared: { + "tiny-emitter": { + eager: true, + singleton: true, + requiredVersion: dependencies["tiny-emitter"] + } + } + }) + ] +}; diff --git a/test/configCases/container/error-handling/evaluation-error-cjs.js b/test/configCases/container/error-handling/evaluation-error-cjs.js new file mode 100644 index 00000000000..86f098abe19 --- /dev/null +++ b/test/configCases/container/error-handling/evaluation-error-cjs.js @@ -0,0 +1,6 @@ +export let error; +try { + require("remote/module"); +} catch (err) { + error = err; +} diff --git a/test/configCases/container/error-handling/evaluation-error-tl-await.js b/test/configCases/container/error-handling/evaluation-error-tl-await.js new file mode 100644 index 00000000000..f0a3f1bec8a --- /dev/null +++ b/test/configCases/container/error-handling/evaluation-error-tl-await.js @@ -0,0 +1,6 @@ +export let error; +try { + await import("remote/module"); +} catch (err) { + error = err; +} diff --git a/test/configCases/container/error-handling/evaluation-error.js b/test/configCases/container/error-handling/evaluation-error.js new file mode 100644 index 00000000000..e117d4331ee --- /dev/null +++ b/test/configCases/container/error-handling/evaluation-error.js @@ -0,0 +1 @@ +import "remote/module"; diff --git a/test/configCases/container/error-handling/index.js b/test/configCases/container/error-handling/index.js new file mode 100644 index 00000000000..a3a080b43cc --- /dev/null +++ b/test/configCases/container/error-handling/index.js @@ -0,0 +1,113 @@ +"use strict"; + +let warnings = []; +let oldWarn; + +beforeEach(done => { + oldWarn = console.warn; + console.warn = m => warnings.push(m); + done(); +}); + +afterEach(done => { + expectWarning(); + console.warn = oldWarn; + done(); +}); + +const expectWarning = regexp => { + if (!regexp) { + expect(warnings).toEqual([]); + } else { + expect(warnings).toEqual( + expect.objectContaining({ + 0: expect.stringMatching(regexp), + length: 1 + }) + ); + } + warnings.length = 0; +}; + +it("should allow to handle remote loading error with import()", async () => { + await expect(import("./loading-error")).rejects.toEqual( + expect.objectContaining({ + code: "ENOENT" + }) + ); +}); + +it("should allow to handle remote loading error with require", async () => { + const { error } = await import("./loading-error-cjs"); + expect(error).toEqual( + expect.objectContaining({ + code: "ENOENT" + }) + ); +}); + +it("should allow to handle remote loading error with top-level-await import()", async () => { + const { error } = await import("./loading-error-tl-await"); + expect(error).toEqual( + expect.objectContaining({ + code: "ENOENT" + }) + ); +}); + +it("should allow to handle invalid remote module error with import()", async () => { + await expect(import("./invalid-module")).rejects.toEqual( + expect.objectContaining({ + message: + 'Module "./invalid" does not exist in container.\nwhile loading "./invalid" from webpack/container/reference/remote' + }) + ); + // at this point sharing initialization runs and triggers a warning that 'invalid' remote can't be loaded + expectWarning(/ENOENT/); +}); + +it("should allow to handle invalid remote module error with require", async () => { + const { error } = await import("./invalid-module-cjs"); + expect(error).toEqual( + expect.objectContaining({ + message: + 'Module "./invalid" does not exist in container.\nwhile loading "./invalid" from webpack/container/reference/remote' + }) + ); +}); + +it("should allow to handle invalid remote module error with top-level-await import()", async () => { + const { error } = await import("./invalid-module-tl-await"); + expect(error).toEqual( + expect.objectContaining({ + message: + 'Module "./invalid" does not exist in container.\nwhile loading "./invalid" from webpack/container/reference/remote' + }) + ); +}); + +it("should allow to handle remote module evaluation error with import()", async () => { + await expect(import("./evaluation-error")).rejects.toEqual( + expect.objectContaining({ + message: "evaluation error" + }) + ); +}); + +it("should allow to handle remote module evaluation error with require", async () => { + const { error } = await import("./evaluation-error-cjs"); + expect(error).toEqual( + expect.objectContaining({ + message: "evaluation error" + }) + ); +}); + +it("should allow to handle remote module evaluation error with top-level-await import()", async () => { + const { error } = await import("./evaluation-error-tl-await"); + expect(error).toEqual( + expect.objectContaining({ + message: "evaluation error" + }) + ); +}); diff --git a/test/configCases/container/error-handling/invalid-module-cjs.js b/test/configCases/container/error-handling/invalid-module-cjs.js new file mode 100644 index 00000000000..ee4a188b6d7 --- /dev/null +++ b/test/configCases/container/error-handling/invalid-module-cjs.js @@ -0,0 +1,6 @@ +export let error; +try { + require("remote/invalid"); +} catch (err) { + error = err; +} diff --git a/test/configCases/container/error-handling/invalid-module-tl-await.js b/test/configCases/container/error-handling/invalid-module-tl-await.js new file mode 100644 index 00000000000..14d60b4e2d2 --- /dev/null +++ b/test/configCases/container/error-handling/invalid-module-tl-await.js @@ -0,0 +1,6 @@ +export let error; +try { + await import("remote/invalid"); +} catch (err) { + error = err; +} diff --git a/test/configCases/container/error-handling/invalid-module.js b/test/configCases/container/error-handling/invalid-module.js new file mode 100644 index 00000000000..4ee4aa9ce5e --- /dev/null +++ b/test/configCases/container/error-handling/invalid-module.js @@ -0,0 +1 @@ +import "remote/invalid"; diff --git a/test/configCases/container/error-handling/loading-error-cjs.js b/test/configCases/container/error-handling/loading-error-cjs.js new file mode 100644 index 00000000000..8d68ea982b1 --- /dev/null +++ b/test/configCases/container/error-handling/loading-error-cjs.js @@ -0,0 +1,6 @@ +export let error; +try { + require("invalid/module"); +} catch (err) { + error = err; +} diff --git a/test/configCases/container/error-handling/loading-error-tl-await.js b/test/configCases/container/error-handling/loading-error-tl-await.js new file mode 100644 index 00000000000..dadc1be41fa --- /dev/null +++ b/test/configCases/container/error-handling/loading-error-tl-await.js @@ -0,0 +1,6 @@ +export let error; +try { + await import("invalid/module"); +} catch (err) { + error = err; +} diff --git a/test/configCases/container/error-handling/loading-error.js b/test/configCases/container/error-handling/loading-error.js new file mode 100644 index 00000000000..f1a1426aa8f --- /dev/null +++ b/test/configCases/container/error-handling/loading-error.js @@ -0,0 +1 @@ +import "invalid/module"; diff --git a/test/configCases/container/error-handling/module.js b/test/configCases/container/error-handling/module.js new file mode 100644 index 00000000000..1e5c246bc8d --- /dev/null +++ b/test/configCases/container/error-handling/module.js @@ -0,0 +1 @@ +throw new Error("evaluation error"); diff --git a/test/configCases/container/error-handling/webpack.config.js b/test/configCases/container/error-handling/webpack.config.js new file mode 100644 index 00000000000..2e9ac09f1f8 --- /dev/null +++ b/test/configCases/container/error-handling/webpack.config.js @@ -0,0 +1,27 @@ +const { ModuleFederationPlugin } = require("../../../../").container; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + chunkIds: "named", + moduleIds: "named" + }, + output: { + strictModuleExceptionHandling: true + }, + plugins: [ + new ModuleFederationPlugin({ + name: "container", + library: { type: "commonjs-module" }, + filename: "container.js", + exposes: ["./module"], + remotes: { + remote: "./container.js", + invalid: "./invalid.js" + } + }) + ], + experiments: { + topLevelAwait: true + } +}; diff --git a/test/configCases/container/exposed-overridables/App.js b/test/configCases/container/exposed-overridables/App.js new file mode 100644 index 00000000000..f755ba593f3 --- /dev/null +++ b/test/configCases/container/exposed-overridables/App.js @@ -0,0 +1,8 @@ +import LocalButton from "./Button"; +import React from "react"; + +function App() { + return LocalButton() + React; +} + +export default App; diff --git a/test/configCases/container/exposed-overridables/Button.js b/test/configCases/container/exposed-overridables/Button.js new file mode 100644 index 00000000000..be278197f6e --- /dev/null +++ b/test/configCases/container/exposed-overridables/Button.js @@ -0,0 +1,5 @@ +import React from "react"; + +const Button = () => "Button" + React; + +export default Button; diff --git a/test/configCases/container/exposed-overridables/index.js b/test/configCases/container/exposed-overridables/index.js new file mode 100644 index 00000000000..8d758dcbbde --- /dev/null +++ b/test/configCases/container/exposed-overridables/index.js @@ -0,0 +1,4 @@ +it("should allow to import exposed modules sync", () => { + const { default: App } = require("./App"); + expect(App()).toBe("ButtonReactReact"); +}); diff --git a/test/configCases/container/exposed-overridables/node_modules/package.json b/test/configCases/container/exposed-overridables/node_modules/package.json new file mode 100644 index 00000000000..a1069cc8a84 --- /dev/null +++ b/test/configCases/container/exposed-overridables/node_modules/package.json @@ -0,0 +1,4 @@ +{ + "name": "react", + "version": "1.0.0" +} diff --git a/test/configCases/container/exposed-overridables/node_modules/react.js b/test/configCases/container/exposed-overridables/node_modules/react.js new file mode 100644 index 00000000000..ff64eb39526 --- /dev/null +++ b/test/configCases/container/exposed-overridables/node_modules/react.js @@ -0,0 +1 @@ +export default "React"; diff --git a/test/configCases/container/exposed-overridables/package.json b/test/configCases/container/exposed-overridables/package.json new file mode 100644 index 00000000000..7a8cb9b6720 --- /dev/null +++ b/test/configCases/container/exposed-overridables/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "react": "1.0.0" + } +} diff --git a/test/configCases/container/exposed-overridables/webpack.config.js b/test/configCases/container/exposed-overridables/webpack.config.js new file mode 100644 index 00000000000..cc5aa51bb95 --- /dev/null +++ b/test/configCases/container/exposed-overridables/webpack.config.js @@ -0,0 +1,20 @@ +// eslint-disable-next-line n/no-unpublished-require +const { ModuleFederationPlugin } = require("../../../../").container; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [ + new ModuleFederationPlugin({ + name: "container", + filename: "container.js", + exposes: { + "./Button": "./Button" + }, + shared: { + react: { + eager: true + } + } + }) + ] +}; diff --git a/test/configCases/container/module-federation-with-shareScope/App.js b/test/configCases/container/module-federation-with-shareScope/App.js new file mode 100644 index 00000000000..43f44221946 --- /dev/null +++ b/test/configCases/container/module-federation-with-shareScope/App.js @@ -0,0 +1,10 @@ +import React from "react"; +import ComponentA from "containerA/ComponentA"; +import ComponentB from "containerB/ComponentB"; +import LocalComponentB from "./ComponentB"; + +export default () => { + return `App rendered with [${React()}] and [${ComponentA()}] and [${ComponentB()}]`; +}; + +expect(ComponentB).not.toBe(LocalComponentB); diff --git a/test/configCases/container/module-federation-with-shareScope/ComponentB.js b/test/configCases/container/module-federation-with-shareScope/ComponentB.js new file mode 100644 index 00000000000..1943469c746 --- /dev/null +++ b/test/configCases/container/module-federation-with-shareScope/ComponentB.js @@ -0,0 +1,5 @@ +import React from "react"; + +export default () => { + return `ComponentB rendered with [${React()}]`; +}; diff --git a/test/configCases/container/module-federation-with-shareScope/ComponentC.js b/test/configCases/container/module-federation-with-shareScope/ComponentC.js new file mode 100644 index 00000000000..3ff3832c718 --- /dev/null +++ b/test/configCases/container/module-federation-with-shareScope/ComponentC.js @@ -0,0 +1,7 @@ +import React from "react"; +import ComponentA from "containerA/ComponentA"; +import ComponentB from "containerB/ComponentB"; + +export default () => { + return `ComponentC rendered with [${React()}] and [${ComponentA()}] and [${ComponentB()}]`; +}; diff --git a/test/configCases/container/module-federation-with-shareScope/index.js b/test/configCases/container/module-federation-with-shareScope/index.js new file mode 100644 index 00000000000..cedabf6db95 --- /dev/null +++ b/test/configCases/container/module-federation-with-shareScope/index.js @@ -0,0 +1,20 @@ +it("should load the component from container", async () => { + await __webpack_init_sharing__("test-scope"); + + // 2 scopes for "0-container-full-mjs" & "mf-with-shareScope-mjs" + expect(Object.keys(__webpack_share_scopes__["test-scope"].react).length).toBe(2); + + return import("./App").then(({ default: App }) => { + const rendered = App(); + expect(rendered).toBe( + "App rendered with [This is react 2.1.0] and [ComponentA rendered with [This is react 2.1.0]] and [ComponentB rendered with [This is react 2.1.0]]" + ); + return import("./upgrade-react").then(({ default: upgrade }) => { + upgrade(); + const rendered = App(); + expect(rendered).toBe( + "App rendered with [This is react 3.2.1] and [ComponentA rendered with [This is react 3.2.1]] and [ComponentB rendered with [This is react 3.2.1]]" + ); + }); + }); +}); diff --git a/test/configCases/container/module-federation-with-shareScope/node_modules/package.json b/test/configCases/container/module-federation-with-shareScope/node_modules/package.json new file mode 100644 index 00000000000..87032da008a --- /dev/null +++ b/test/configCases/container/module-federation-with-shareScope/node_modules/package.json @@ -0,0 +1,3 @@ +{ + "version": "2.1.0" +} diff --git a/test/configCases/container/module-federation-with-shareScope/node_modules/react.js b/test/configCases/container/module-federation-with-shareScope/node_modules/react.js new file mode 100644 index 00000000000..97d35a4bc9c --- /dev/null +++ b/test/configCases/container/module-federation-with-shareScope/node_modules/react.js @@ -0,0 +1,3 @@ +let version = "2.1.0"; +export default () => `This is react ${version}`; +export function setVersion(v) { version = v; } diff --git a/test/configCases/container/module-federation-with-shareScope/package.json b/test/configCases/container/module-federation-with-shareScope/package.json new file mode 100644 index 00000000000..be6238fec84 --- /dev/null +++ b/test/configCases/container/module-federation-with-shareScope/package.json @@ -0,0 +1,9 @@ +{ + "private": true, + "engines": { + "node": ">=10.13.0" + }, + "dependencies": { + "react": "*" + } +} diff --git a/test/configCases/container/module-federation-with-shareScope/test.config.js b/test/configCases/container/module-federation-with-shareScope/test.config.js new file mode 100644 index 00000000000..0755f427ddc --- /dev/null +++ b/test/configCases/container/module-federation-with-shareScope/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return i === 0 ? "./main.js" : "./module/main.mjs"; + } +}; diff --git a/test/configCases/container/module-federation-with-shareScope/upgrade-react.js b/test/configCases/container/module-federation-with-shareScope/upgrade-react.js new file mode 100644 index 00000000000..2cadfc0b71a --- /dev/null +++ b/test/configCases/container/module-federation-with-shareScope/upgrade-react.js @@ -0,0 +1,5 @@ +import { setVersion } from "react"; + +export default function upgrade() { + setVersion("3.2.1"); +} diff --git a/test/configCases/container/module-federation-with-shareScope/webpack.config.js b/test/configCases/container/module-federation-with-shareScope/webpack.config.js new file mode 100644 index 00000000000..218ebc25ddb --- /dev/null +++ b/test/configCases/container/module-federation-with-shareScope/webpack.config.js @@ -0,0 +1,67 @@ +const { ModuleFederationPlugin } = require("../../../../").container; + +const common = { + entry: { + main: "./index.js" + }, + optimization: { + runtimeChunk: "single" + } +}; + +/** @type {ConstructorParameters[0]} */ +const commonMF = { + runtime: false, + exposes: { + "./ComponentB": "./ComponentB", + "./ComponentC": "./ComponentC" + }, + shared: ["react"], + shareScope: "test-scope" +}; + +/** @type {import("../../../../types").Configuration[]} */ +module.exports = [ + { + ...common, + output: { + filename: "[name].js", + uniqueName: "mf-with-shareScope" + }, + plugins: [ + new ModuleFederationPlugin({ + name: "container", + library: { type: "commonjs-module" }, + filename: "container.js", + remotes: { + containerA: "../0-container-full/container.js", + containerB: "./container.js" + }, + ...commonMF + }) + ] + }, + { + ...common, + experiments: { + outputModule: true + }, + output: { + filename: "module/[name].mjs", + uniqueName: "mf-with-shareScope-mjs" + }, + plugins: [ + new ModuleFederationPlugin({ + name: "container", + library: { type: "module" }, + filename: "module/container.mjs", + remotes: { + containerA: "../../0-container-full/module/container.mjs", + containerB: "./container.mjs" + }, + ...commonMF + }) + ], + target: "node14" + } +]; diff --git a/test/configCases/container/module-federation/dep.js b/test/configCases/container/module-federation/dep.js new file mode 100644 index 00000000000..78809c64c1d --- /dev/null +++ b/test/configCases/container/module-federation/dep.js @@ -0,0 +1 @@ +module.exports = "dep"; diff --git a/test/configCases/container/module-federation/index.js b/test/configCases/container/module-federation/index.js new file mode 100644 index 00000000000..c8119498de9 --- /dev/null +++ b/test/configCases/container/module-federation/index.js @@ -0,0 +1,3 @@ +it("should import the correct modules", () => { + return import("./module").then(({ test }) => test()); +}); diff --git a/test/configCases/container/module-federation/module.js b/test/configCases/container/module-federation/module.js new file mode 100644 index 00000000000..fbea1280632 --- /dev/null +++ b/test/configCases/container/module-federation/module.js @@ -0,0 +1,19 @@ +import abc from "abc/system-hello-world"; +import def, { module } from "def/system-hello-world"; +import def2, { module as module2 } from "def/system-hello/other/world"; +import other from "other/other"; +import otherSelf from "other/self"; +import self from "self/self"; +import selfOther from "self/other"; + +export function test() { + expect(abc).toBe("abc ./system-hello-world"); + expect(def).toBe("def"); + expect(def2).toBe("def"); + expect(module).toBe("./system-hello-world"); + expect(module2).toBe("./system-hello/other/world"); + expect(other).toBe("other and dep"); + expect(otherSelf).toBe("self and dep"); + expect(self).toBe("self and dep"); + expect(selfOther).toBe("other and dep"); +} diff --git a/test/configCases/container/module-federation/other.js b/test/configCases/container/module-federation/other.js new file mode 100644 index 00000000000..ec471310605 --- /dev/null +++ b/test/configCases/container/module-federation/other.js @@ -0,0 +1,3 @@ +import andBack from "other/dep"; + +export default `other and ${andBack}`; diff --git a/test/configCases/container/module-federation/self.js b/test/configCases/container/module-federation/self.js new file mode 100644 index 00000000000..d00db94c429 --- /dev/null +++ b/test/configCases/container/module-federation/self.js @@ -0,0 +1,3 @@ +import andBack from "self/dep"; + +export default `self and ${andBack}`; diff --git a/test/configCases/container/module-federation/test.config.js b/test/configCases/container/module-federation/test.config.js new file mode 100644 index 00000000000..bd9d9060de0 --- /dev/null +++ b/test/configCases/container/module-federation/test.config.js @@ -0,0 +1,36 @@ +const System = require("../../../helpers/fakeSystem"); + +module.exports = { + beforeExecute: () => { + System.init(); + }, + moduleScope(scope) { + System.setRequire(scope.require); + scope.System = System; + System.set("ABC", { + get(module) { + return new Promise(resolve => { + setTimeout(() => { + resolve(() => `abc ${module}`); + }, 100); + }); + } + }); + System.set("DEF", { + get(module) { + return new Promise(resolve => { + setTimeout(() => { + resolve(() => ({ + __esModule: true, + module, + default: "def" + })); + }, 100); + }); + } + }); + }, + afterExecute: () => { + System.execute("(anonym)"); + } +}; diff --git a/test/configCases/container/module-federation/webpack.config.js b/test/configCases/container/module-federation/webpack.config.js new file mode 100644 index 00000000000..1b4c62d6f34 --- /dev/null +++ b/test/configCases/container/module-federation/webpack.config.js @@ -0,0 +1,40 @@ +const { ModuleFederationPlugin } = require("../../../../").container; + +/** + * @returns {import("../../../../").Configuration} configuration + */ +function createConfig() { + return { + output: { + libraryTarget: "system" + }, + plugins: [ + new ModuleFederationPlugin({ + name: "container", + filename: "container.js", + library: { type: "system" }, + exposes: ["./other", "./self", "./dep"], + remotes: { + abc: "ABC", + def: "DEF", + self: "./container.js", + other: "./container2.js" + } + }), + new ModuleFederationPlugin({ + name: "container2", + filename: "container2.js", + library: { type: "system" }, + exposes: ["./other", "./self", "./dep"], + remotes: { + abc: "ABC", + def: "DEF", + self: "./container2.js", + other: "./container.js" + } + }) + ] + }; +} + +module.exports = createConfig(); diff --git a/test/configCases/container/no-shared/index.js b/test/configCases/container/no-shared/index.js new file mode 100644 index 00000000000..f33d17dfb92 --- /dev/null +++ b/test/configCases/container/no-shared/index.js @@ -0,0 +1,7 @@ +it("should allow to work without shared modules", async () => { + await __webpack_init_sharing__("default"); + const container = __non_webpack_require__("./container.js"); + container.init(__webpack_share_scopes__.default); + const moduleFactory = await container.get("./module"); + expect(moduleFactory().ok).toBe(true); +}); diff --git a/test/configCases/container/no-shared/module.js b/test/configCases/container/no-shared/module.js new file mode 100644 index 00000000000..3d6576eacaf --- /dev/null +++ b/test/configCases/container/no-shared/module.js @@ -0,0 +1 @@ +export const ok = true; diff --git a/test/configCases/container/no-shared/webpack.config.js b/test/configCases/container/no-shared/webpack.config.js new file mode 100644 index 00000000000..bce073f4eb2 --- /dev/null +++ b/test/configCases/container/no-shared/webpack.config.js @@ -0,0 +1,13 @@ +const { ModuleFederationPlugin } = require("../../../../").container; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [ + new ModuleFederationPlugin({ + name: "container", + filename: "container.js", + library: { type: "commonjs-module" }, + exposes: ["./module"] + }) + ] +}; diff --git a/test/configCases/container/reference-hoisting/App.js b/test/configCases/container/reference-hoisting/App.js new file mode 100644 index 00000000000..bedb022ffbe --- /dev/null +++ b/test/configCases/container/reference-hoisting/App.js @@ -0,0 +1,6 @@ +import React from "react"; +import ComponentA from "containerA/ComponentA"; + +export default () => { + return `App rendered with [${React()}] and [${ComponentA()}]`; +}; diff --git a/test/configCases/container/reference-hoisting/ComponentA.js b/test/configCases/container/reference-hoisting/ComponentA.js new file mode 100644 index 00000000000..9a98b9948bf --- /dev/null +++ b/test/configCases/container/reference-hoisting/ComponentA.js @@ -0,0 +1,5 @@ +import React from "react"; + +export default () => { + return `ComponentA rendered with [${React()}]`; +}; diff --git a/test/configCases/container/reference-hoisting/index-2.js b/test/configCases/container/reference-hoisting/index-2.js new file mode 100644 index 00000000000..75db3a1d561 --- /dev/null +++ b/test/configCases/container/reference-hoisting/index-2.js @@ -0,0 +1 @@ +import('containerB/ComponentA') diff --git a/test/configCases/container/reference-hoisting/index.js b/test/configCases/container/reference-hoisting/index.js new file mode 100644 index 00000000000..ddc4c6b90a1 --- /dev/null +++ b/test/configCases/container/reference-hoisting/index.js @@ -0,0 +1,21 @@ +it("should have the hoisted container references", () => { + const wpm = __webpack_modules__; + expect(wpm).toHaveProperty("webpack/container/reference/containerA"); + expect(wpm).toHaveProperty("webpack/container/reference/containerB"); +}); + +it("should load the component from container", () => { + return import("./App").then(({ default: App }) => { + const rendered = App(); + expect(rendered).toBe( + "App rendered with [This is react 0.1.2] and [ComponentA rendered with [This is react 0.1.2]]" + ); + return import("./upgrade-react").then(({ default: upgrade }) => { + upgrade(); + const rendered = App(); + expect(rendered).toBe( + "App rendered with [This is react 1.2.3] and [ComponentA rendered with [This is react 1.2.3]]" + ); + }); + }); +}); diff --git a/test/configCases/container/reference-hoisting/node_modules/react.js b/test/configCases/container/reference-hoisting/node_modules/react.js new file mode 100644 index 00000000000..bcf433f2afb --- /dev/null +++ b/test/configCases/container/reference-hoisting/node_modules/react.js @@ -0,0 +1,3 @@ +let version = "0.1.2"; +export default () => `This is react ${version}`; +export function setVersion(v) { version = v; } diff --git a/test/configCases/container/reference-hoisting/test.config.js b/test/configCases/container/reference-hoisting/test.config.js new file mode 100644 index 00000000000..0755f427ddc --- /dev/null +++ b/test/configCases/container/reference-hoisting/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return i === 0 ? "./main.js" : "./module/main.mjs"; + } +}; diff --git a/test/configCases/container/reference-hoisting/upgrade-react.js b/test/configCases/container/reference-hoisting/upgrade-react.js new file mode 100644 index 00000000000..d26755be2c7 --- /dev/null +++ b/test/configCases/container/reference-hoisting/upgrade-react.js @@ -0,0 +1,5 @@ +import { setVersion } from "react"; + +export default function upgrade() { + setVersion("1.2.3"); +} diff --git a/test/configCases/container/reference-hoisting/webpack.config.js b/test/configCases/container/reference-hoisting/webpack.config.js new file mode 100644 index 00000000000..98e4d1fbc76 --- /dev/null +++ b/test/configCases/container/reference-hoisting/webpack.config.js @@ -0,0 +1,85 @@ +const { ModuleFederationPlugin } = require("../../../../").container; + +/** @type {ConstructorParameters[0]} */ +const common = { + name: "container", + exposes: { + "./ComponentA": { + import: "./ComponentA" + } + }, + shared: { + react: { + version: false, + requiredVersion: false + } + } +}; + +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + entry: { + main: "./index.js", + other: "./index-2.js" + }, + output: { + filename: "[name].js", + uniqueName: "ref-hoist" + }, + optimization: { + runtimeChunk: "single", + moduleIds: "named" + }, + plugins: [ + new ModuleFederationPlugin({ + runtime: false, + library: { type: "commonjs-module" }, + filename: "container.js", + remotes: { + containerA: { + external: "./container.js" + }, + containerB: { + external: "../0-container-full/container.js" + } + }, + ...common + }) + ] + }, + { + entry: { + main: "./index.js", + other: "./index-2.js" + }, + experiments: { + outputModule: true + }, + optimization: { + runtimeChunk: "single", + moduleIds: "named" + }, + output: { + filename: "module/[name].mjs", + uniqueName: "ref-hoist-mjs" + }, + plugins: [ + new ModuleFederationPlugin({ + runtime: false, + library: { type: "module" }, + filename: "module/container.mjs", + remotes: { + containerA: { + external: "./container.mjs" + }, + containerB: { + external: "../../0-container-full/module/container.mjs" + } + }, + ...common + }) + ], + target: "node14" + } +]; diff --git a/test/configCases/container/track-initial-chunks/App.js b/test/configCases/container/track-initial-chunks/App.js new file mode 100644 index 00000000000..bedb022ffbe --- /dev/null +++ b/test/configCases/container/track-initial-chunks/App.js @@ -0,0 +1,6 @@ +import React from "react"; +import ComponentA from "containerA/ComponentA"; + +export default () => { + return `App rendered with [${React()}] and [${ComponentA()}]`; +}; diff --git a/test/configCases/container/track-initial-chunks/ComponentA.js b/test/configCases/container/track-initial-chunks/ComponentA.js new file mode 100644 index 00000000000..9a98b9948bf --- /dev/null +++ b/test/configCases/container/track-initial-chunks/ComponentA.js @@ -0,0 +1,5 @@ +import React from "react"; + +export default () => { + return `ComponentA rendered with [${React()}]`; +}; diff --git a/test/configCases/container/track-initial-chunks/index-2.js b/test/configCases/container/track-initial-chunks/index-2.js new file mode 100644 index 00000000000..64c990571cf --- /dev/null +++ b/test/configCases/container/track-initial-chunks/index-2.js @@ -0,0 +1,2 @@ +import React from "react" +console.log(React) diff --git a/test/configCases/container/track-initial-chunks/index.js b/test/configCases/container/track-initial-chunks/index.js new file mode 100644 index 00000000000..1662d14c0ed --- /dev/null +++ b/test/configCases/container/track-initial-chunks/index.js @@ -0,0 +1,35 @@ +it("should have the hoisted container references", async () => { + const before = __webpack_modules__; + debugger; + + // Initialize tracker array + const tracker = []; + + // Call the consumes function to populate tracker with hoisted container references + __webpack_require__.f.consumes("other", tracker); + + // Ensure all references in tracker are resolved + await Promise.all(tracker); + + const after = __webpack_modules__; + debugger; + + // Verify that tracker contains hoisted container references + expect(tracker).not.toHaveLength(0); +}); + +it("should load the component from container", () => { + return import("./App").then(({ default: App }) => { + const rendered = App(); + expect(rendered).toBe( + "App rendered with [This is react 0.1.2] and [ComponentA rendered with [This is react 0.1.2]]" + ); + return import("./upgrade-react").then(({ default: upgrade }) => { + upgrade(); + const rendered = App(); + expect(rendered).toBe( + "App rendered with [This is react 1.2.3] and [ComponentA rendered with [This is react 1.2.3]]" + ); + }); + }); +}); diff --git a/test/configCases/container/track-initial-chunks/node_modules/react.js b/test/configCases/container/track-initial-chunks/node_modules/react.js new file mode 100644 index 00000000000..bcf433f2afb --- /dev/null +++ b/test/configCases/container/track-initial-chunks/node_modules/react.js @@ -0,0 +1,3 @@ +let version = "0.1.2"; +export default () => `This is react ${version}`; +export function setVersion(v) { version = v; } diff --git a/test/configCases/container/track-initial-chunks/test.config.js b/test/configCases/container/track-initial-chunks/test.config.js new file mode 100644 index 00000000000..0755f427ddc --- /dev/null +++ b/test/configCases/container/track-initial-chunks/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return i === 0 ? "./main.js" : "./module/main.mjs"; + } +}; diff --git a/test/configCases/container/track-initial-chunks/upgrade-react.js b/test/configCases/container/track-initial-chunks/upgrade-react.js new file mode 100644 index 00000000000..d26755be2c7 --- /dev/null +++ b/test/configCases/container/track-initial-chunks/upgrade-react.js @@ -0,0 +1,5 @@ +import { setVersion } from "react"; + +export default function upgrade() { + setVersion("1.2.3"); +} diff --git a/test/configCases/container/track-initial-chunks/webpack.config.js b/test/configCases/container/track-initial-chunks/webpack.config.js new file mode 100644 index 00000000000..9036608f1fd --- /dev/null +++ b/test/configCases/container/track-initial-chunks/webpack.config.js @@ -0,0 +1,87 @@ +const { ModuleFederationPlugin } = require("../../../../").container; + +/** @type {ConstructorParameters[0]} */ +const common = { + name: "container", + exposes: { + "./ComponentA": { + import: "./ComponentA" + } + }, + shared: { + react: { + version: false, + requiredVersion: false + } + } +}; + +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + entry: { + main: "./index.js", + other: "./index-2.js" + }, + output: { + filename: "[name].js", + uniqueName: "ref-hoist" + }, + optimization: { + runtimeChunk: "single", + moduleIds: "named", + chunkIds: "named" + }, + plugins: [ + new ModuleFederationPlugin({ + runtime: false, + library: { type: "commonjs-module" }, + filename: "container.js", + remotes: { + containerA: { + external: "./container.js" + }, + containerB: { + external: "../0-container-full/container.js" + } + }, + ...common + }) + ] + }, + { + entry: { + main: "./index.js", + other: "./index-2.js" + }, + experiments: { + outputModule: true + }, + optimization: { + runtimeChunk: "single", + moduleIds: "named", + chunkIds: "named" + }, + output: { + filename: "module/[name].mjs", + uniqueName: "ref-hoist-mjs" + }, + plugins: [ + new ModuleFederationPlugin({ + runtime: false, + library: { type: "module" }, + filename: "module/container.mjs", + remotes: { + containerA: { + external: "./container.mjs" + }, + containerB: { + external: "../../0-container-full/module/container.mjs" + } + }, + ...common + }) + ], + target: "node14" + } +]; diff --git a/test/configCases/contenthash/assets/1.jpg b/test/configCases/contenthash/assets/1.jpg new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/contenthash/assets/index.js b/test/configCases/contenthash/assets/index.js new file mode 100644 index 00000000000..0123092aa0d --- /dev/null +++ b/test/configCases/contenthash/assets/index.js @@ -0,0 +1,5 @@ +import img from "./1.jpg"; + +it("should compile", () => { + expect(typeof img).toBe("string"); +}); diff --git a/test/configCases/contenthash/assets/test.config.js b/test/configCases/contenthash/assets/test.config.js new file mode 100644 index 00000000000..7523cfa4617 --- /dev/null +++ b/test/configCases/contenthash/assets/test.config.js @@ -0,0 +1,31 @@ +const findOutputFiles = require("../../../helpers/findOutputFiles"); + +const allAssets = new Set(); +const allBundles = new Set(); + +module.exports = { + findBundle(i, options) { + const bundle = findOutputFiles(options, new RegExp(`^bundle${i}`))[0]; + allBundles.add(/\.([^.]+)\./.exec(bundle)[1]); + + let asset; + + switch (i) { + case 0: + asset = findOutputFiles(options, /^1\.[^.]*\.jpg$/, "img")[0]; + break; + case 1: + case 5: + asset = findOutputFiles(options, /^1\.[^.]*\.jpg$/, "asset")[0]; + break; + } + + if (asset) allAssets.add(asset); + + return `./${bundle}`; + }, + afterExecute: () => { + expect(allBundles.size).toBe(6); + expect(allAssets.size).toBe(1); + } +}; diff --git a/test/configCases/contenthash/assets/webpack.config.js b/test/configCases/contenthash/assets/webpack.config.js new file mode 100644 index 00000000000..1d6fb419763 --- /dev/null +++ b/test/configCases/contenthash/assets/webpack.config.js @@ -0,0 +1,118 @@ +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + output: { + filename: "bundle0.[contenthash].js", + assetModuleFilename: "img/[name].[contenthash][ext]" + }, + module: { + rules: [ + { + test: /\.jpg$/, + type: "asset/resource" + } + ] + } + }, + { + output: { + filename: "bundle1.[contenthash].js", + assetModuleFilename: "asset/[name].[contenthash][ext]" + }, + module: { + rules: [ + { + test: /\.jpg$/, + type: "asset/resource" + } + ] + } + }, + { + output: { + filename: "bundle2.[contenthash].js", + assetModuleFilename: "asset/[name].[contenthash][ext]" + }, + module: { + rules: [ + { + test: /\.jpg$/, + type: "asset/resource", + generator: { + publicPath: "/public/" + } + } + ] + } + }, + { + output: { + filename: "bundle3.[contenthash].js", + assetModuleFilename: "asset/[name].[contenthash][ext]" + }, + module: { + rules: [ + { + test: /\.jpg$/, + type: "asset/inline" + } + ] + } + }, + { + output: { + filename: "bundle4.[contenthash].js", + assetModuleFilename: "asset/[name].[contenthash][ext]" + }, + module: { + rules: [ + { + test: /\.jpg$/, + type: "asset/inline", + generator: { + dataUrl: { + encoding: false + } + } + } + ] + } + }, + { + output: { + filename: "bundle5.[contenthash].js", + assetModuleFilename: "asset/[name].[contenthash][ext]" + }, + module: { + rules: [ + { + test: /\.jpg$/, + type: "asset/source", + generator: { + dataUrl: { + mimetype: "text/plain" + } + } + } + ] + } + }, + { + output: { + filename: "bundle6.[contenthash].js", + assetModuleFilename: "asset/[name].[contenthash][ext]" + }, + module: { + rules: [ + { + test: /\.jpg$/, + type: "asset/resource", + generator: { + // should result in same hash as bundle2 + publicPath: () => "/public/" + } + } + ] + } + } +]; diff --git a/test/configCases/contenthash/css-generator-options/index.js b/test/configCases/contenthash/css-generator-options/index.js new file mode 100644 index 00000000000..ed3f045974b --- /dev/null +++ b/test/configCases/contenthash/css-generator-options/index.js @@ -0,0 +1,5 @@ +it("should compile", async () => { + await import("./style.module.css"); + // The real test is in test.config.js afterExecute + expect(true).toBe(true); +}); diff --git a/test/configCases/contenthash/css-generator-options/style.module.css b/test/configCases/contenthash/css-generator-options/style.module.css new file mode 100644 index 00000000000..e26591a3906 --- /dev/null +++ b/test/configCases/contenthash/css-generator-options/style.module.css @@ -0,0 +1,7 @@ +.class-a { + color: red; +} + +.class-b { + color: blue; +} diff --git a/test/configCases/contenthash/css-generator-options/test.config.js b/test/configCases/contenthash/css-generator-options/test.config.js new file mode 100644 index 00000000000..1002051a2b8 --- /dev/null +++ b/test/configCases/contenthash/css-generator-options/test.config.js @@ -0,0 +1,20 @@ +const findOutputFiles = require("../../../helpers/findOutputFiles"); + +const allCss = new Set(); +const allBundles = new Set(); + +module.exports = { + findBundle(i, options) { + const bundle = findOutputFiles(options, new RegExp(`^bundle${i}`))[0]; + const async = findOutputFiles(options, /\.js/, `css${i}`); + allBundles.add(/\.([^.]+)\./.exec(bundle)[1]); + const css = findOutputFiles(options, /^.*\.[^.]*\.css$/, `css${i}`)[0]; + allCss.add(css); + + return [`./css${i}/${async}`, `./${bundle}`]; + }, + afterExecute: () => { + expect(allBundles.size).toBe(7); + expect(allCss.size).toBe(7); + } +}; diff --git a/test/configCases/contenthash/css-generator-options/webpack.config.js b/test/configCases/contenthash/css-generator-options/webpack.config.js new file mode 100644 index 00000000000..84979d5e7a7 --- /dev/null +++ b/test/configCases/contenthash/css-generator-options/webpack.config.js @@ -0,0 +1,147 @@ +/** @type {import("../../../../").Configuration} */ +const common = { + target: "web", + optimization: { + realContentHash: false + }, + experiments: { + css: true + } +}; + +/** @typedef {import("../../../../").GeneratorOptionsByModuleTypeKnown} GeneratorOptionsByModuleTypeKnown */ + +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + ...common, + output: { + filename: "bundle0.[contenthash].js", + chunkFilename: "css0/[name].[contenthash].js", + cssChunkFilename: "css0/[name].[contenthash].css" + }, + module: { + rules: [ + { + test: /\.css$/, + type: "css/module" + } + ] + } + }, + { + ...common, + output: { + filename: "bundle1.[contenthash].js", + chunkFilename: "css1/[name].[contenthash].js", + cssChunkFilename: "css1/[name].[contenthash].css" + }, + module: { + rules: [ + { + test: /\.css$/, + type: "css/module", + generator: { + exportsConvention: "camel-case" + } + } + ] + } + }, + { + ...common, + output: { + filename: "bundle2.[contenthash].js", + chunkFilename: "css2/[name].[contenthash].js", + cssChunkFilename: "css2/[name].[contenthash].css" + }, + module: { + rules: [ + { + test: /\.css$/, + type: "css/module", + generator: { + exportsConvention: "camel-case-only" + } + } + ] + } + }, + { + ...common, + output: { + filename: "bundle3.[contenthash].js", + chunkFilename: "css3/[name].[contenthash].js", + cssChunkFilename: "css3/[name].[contenthash].css" + }, + module: { + rules: [ + { + test: /\.css$/, + type: "css/module", + /** @type {GeneratorOptionsByModuleTypeKnown["css/module"]} */ + generator: { + exportsConvention: name => name.toUpperCase() + } + } + ] + } + }, + { + ...common, + output: { + filename: "bundle4.[contenthash].js", + chunkFilename: "css4/[name].[contenthash].js", + cssChunkFilename: "css4/[name].[contenthash].css" + }, + module: { + rules: [ + { + test: /\.css$/, + type: "css/module", + generator: { + localIdentName: "[hash]-[local]" + } + } + ] + } + }, + { + ...common, + output: { + filename: "bundle5.[contenthash].js", + chunkFilename: "css5/[name].[contenthash].js", + cssChunkFilename: "css5/[name].[contenthash].css" + }, + module: { + rules: [ + { + test: /\.css$/, + type: "css/module", + generator: { + localIdentName: "[path][name][ext]__[local]" + } + } + ] + } + }, + { + ...common, + output: { + filename: "bundle6.[contenthash].js", + chunkFilename: "css6/[name].[contenthash].js", + cssChunkFilename: "css6/[name].[contenthash].css" + }, + module: { + rules: [ + { + test: /\.css$/, + type: "css/module", + generator: { + esModule: false + } + } + ] + } + } +]; diff --git a/test/configCases/contenthash/include-chunk-id/test.config.js b/test/configCases/contenthash/include-chunk-id/test.config.js index 6aa0c3c30ca..cc45b50943a 100644 --- a/test/configCases/contenthash/include-chunk-id/test.config.js +++ b/test/configCases/contenthash/include-chunk-id/test.config.js @@ -1,29 +1,19 @@ -var fs = require("fs"); - -var findFile = function(files, regex) { - return files.find(function(file) { - if (regex.test(file)) { - return true; - } - }); -}; +const findOutputFiles = require("../../../helpers/findOutputFiles"); const allFilenameHashes = new Set(); const allChunkHashes = new Set(); module.exports = { - findBundle: function(i, options) { - var files = fs.readdirSync(options.output.path); - - const filename = findFile(files, new RegExp(`^bundle${i}`)); + findBundle(i, options) { + const filename = findOutputFiles(options, new RegExp(`^bundle${i}`))[0]; const filenameHash = /\.([a-f0-9]+)\.js$/.exec(filename)[1]; allFilenameHashes.add(filenameHash); - const chunk = findFile(files, new RegExp(`^chunk${i}`)); + const chunk = findOutputFiles(options, new RegExp(`^chunk${i}`))[0]; const chunkHash = /\.([a-f0-9]+)\.js$/.exec(chunk)[1]; allChunkHashes.add(chunkHash); - return "./" + filename; + return `./${filename}`; }, afterExecute: () => { expect(allFilenameHashes.size).toBe(2); diff --git a/test/configCases/contenthash/include-chunk-id/webpack.config.js b/test/configCases/contenthash/include-chunk-id/webpack.config.js index c5a898a9420..004bb036cb1 100644 --- a/test/configCases/contenthash/include-chunk-id/webpack.config.js +++ b/test/configCases/contenthash/include-chunk-id/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration[]} */ module.exports = [ { mode: "production", diff --git a/test/configCases/contenthash/module-ids-size/1.jpg b/test/configCases/contenthash/module-ids-size/1.jpg new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/contenthash/module-ids-size/async.js b/test/configCases/contenthash/module-ids-size/async.js new file mode 100644 index 00000000000..ec6ae927a27 --- /dev/null +++ b/test/configCases/contenthash/module-ids-size/async.js @@ -0,0 +1,10 @@ +export default function test() { + const a = 1; + const b = 2; + const c = 3; + const d = 4; + const f = 5; + const e = 6; + + return a + b + c + d + f + e; +} diff --git a/test/configCases/contenthash/module-ids-size/file-1.js b/test/configCases/contenthash/module-ids-size/file-1.js new file mode 100644 index 00000000000..a3825a0f846 --- /dev/null +++ b/test/configCases/contenthash/module-ids-size/file-1.js @@ -0,0 +1,19 @@ +async function test() { + const a = 1; + const b = 2; + const c = 3; + const d = 4; + const f = 5; + const e = 6; + + await import("./async.js"); + + return a + b + c + d + f + e; +} + +test(); + +export { test } +export default test; + +test(); diff --git a/test/configCases/contenthash/module-ids-size/file-2.js b/test/configCases/contenthash/module-ids-size/file-2.js new file mode 100644 index 00000000000..5217d109731 --- /dev/null +++ b/test/configCases/contenthash/module-ids-size/file-2.js @@ -0,0 +1,5 @@ +import { test } from "./file-1.js"; + +export default function foobar() { + return "test" + test(); +} diff --git a/test/configCases/contenthash/module-ids-size/file-3.js b/test/configCases/contenthash/module-ids-size/file-3.js new file mode 100644 index 00000000000..5e033ab9f4a --- /dev/null +++ b/test/configCases/contenthash/module-ids-size/file-3.js @@ -0,0 +1,7 @@ +function test() { + return "test"; +} + +test(); + +module.exports = "test"; diff --git a/test/configCases/contenthash/module-ids-size/file.js b/test/configCases/contenthash/module-ids-size/file.js new file mode 100644 index 00000000000..2f8412c218e --- /dev/null +++ b/test/configCases/contenthash/module-ids-size/file.js @@ -0,0 +1,25 @@ +import file from "./file-1.js"; +import file2 from "./file-2.js"; + +async function test() { + const a = 1; + const b = 2; + const c = 3; + const d = 4; + const f = 5; + const e = 6; + + await import(/* webpackMode: "eager" */"./async.js"); + await import(/* webpackMode: "eager" */"./file-3.js"); + + return a + b + c + d + f + e; +} + +test(); + +export { test, file, file2 } +export default function foo() { + return "test"; +} + +test(); diff --git a/test/configCases/contenthash/module-ids-size/index.js b/test/configCases/contenthash/module-ids-size/index.js new file mode 100644 index 00000000000..c43e8c29af8 --- /dev/null +++ b/test/configCases/contenthash/module-ids-size/index.js @@ -0,0 +1,7 @@ +import img from "./1.jpg"; +import file from "./file.js"; + +it("should compile", () => { + expect(typeof img).toBe("string"); + expect(typeof file).toBe("function"); +}); diff --git a/test/configCases/contenthash/module-ids-size/test.config.js b/test/configCases/contenthash/module-ids-size/test.config.js new file mode 100644 index 00000000000..32bb896bf25 --- /dev/null +++ b/test/configCases/contenthash/module-ids-size/test.config.js @@ -0,0 +1,28 @@ +const findOutputFiles = require("../../../helpers/findOutputFiles"); + +const allAssets = new Set(); +const allBundles = new Set(); + +module.exports = { + findBundle(i, options) { + const bundle = findOutputFiles(options, new RegExp(`^bundle${i}`))[0]; + + allBundles.add(/\.([^.]+)\./.exec(bundle)[1]); + + let asset; + + switch (i) { + case 0: + asset = findOutputFiles(options, /^1\.[^.]*\.jpg$/, "img")[0]; + break; + } + + if (asset) allAssets.add(asset); + + return `./${bundle}`; + }, + afterExecute: () => { + // Bundles have the same contenthash + expect(allBundles.size).toBe(1); + } +}; diff --git a/test/configCases/contenthash/module-ids-size/webpack.config.js b/test/configCases/contenthash/module-ids-size/webpack.config.js new file mode 100644 index 00000000000..2b768573875 --- /dev/null +++ b/test/configCases/contenthash/module-ids-size/webpack.config.js @@ -0,0 +1,37 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = [ + { + output: { + filename: "bundle0.[contenthash].a.js", + assetModuleFilename: "img/[name].a.[contenthash][ext]" + }, + optimization: { + moduleIds: "size" + }, + module: { + rules: [ + { + test: /\.jpg$/, + type: "asset/resource" + } + ] + } + }, + { + output: { + filename: "bundle1.[contenthash].b.js", + assetModuleFilename: "img/[name].a.[contenthash][ext]" + }, + optimization: { + moduleIds: "size" + }, + module: { + rules: [ + { + test: /\.jpg$/, + type: "asset/resource" + } + ] + } + } +]; diff --git a/test/configCases/contenthash/salt/img.jpg b/test/configCases/contenthash/salt/img.jpg new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/contenthash/salt/index.js b/test/configCases/contenthash/salt/index.js new file mode 100644 index 00000000000..2d2b98703ee --- /dev/null +++ b/test/configCases/contenthash/salt/index.js @@ -0,0 +1,5 @@ +import img from "./img.jpg"; + +it("should compile", () => { + expect(typeof img).toBe("string"); +}); diff --git a/test/configCases/contenthash/salt/test.config.js b/test/configCases/contenthash/salt/test.config.js new file mode 100644 index 00000000000..9328ad9b72f --- /dev/null +++ b/test/configCases/contenthash/salt/test.config.js @@ -0,0 +1,24 @@ +const findOutputFiles = require("../../../helpers/findOutputFiles"); + +const allAssets = new Set(); +const allBundles = new Set(); + +module.exports = { + findBundle(i, options) { + const bundle = findOutputFiles(options, new RegExp(`^bundle${i}`))[0]; + allBundles.add(/\.([^.]+)\./.exec(bundle)[1]); + + const assets = findOutputFiles(options, /^img/); + for (const asset of assets) { + allAssets.add(asset); + } + + return `./${bundle}`; + }, + afterExecute: () => { + // Since there are exactly 2 unique values of output.hashSalt, + // there should be exactly 2 unique output hashes for each file. + expect(allBundles.size).toBe(2); + expect(allAssets.size).toBe(2); + } +}; diff --git a/test/configCases/contenthash/salt/webpack.config.js b/test/configCases/contenthash/salt/webpack.config.js new file mode 100644 index 00000000000..1ec1c83b9d9 --- /dev/null +++ b/test/configCases/contenthash/salt/webpack.config.js @@ -0,0 +1,48 @@ +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + output: { + filename: "bundle0.[contenthash].js", + assetModuleFilename: "[name].[contenthash][ext]", + hashSalt: "1" + }, + module: { + rules: [ + { + test: /\.jpg$/, + type: "asset/resource" + } + ] + } + }, + { + output: { + filename: "bundle1.[contenthash].js", + assetModuleFilename: "[name].[contenthash][ext]", + hashSalt: "1" + }, + module: { + rules: [ + { + test: /\.jpg$/, + type: "asset/resource" + } + ] + } + }, + { + output: { + filename: "bundle2.[contenthash].js", + assetModuleFilename: "[name].[contenthash][ext]", + hashSalt: "2" + }, + module: { + rules: [ + { + test: /\.jpg$/, + type: "asset/resource" + } + ] + } + } +]; diff --git a/test/configCases/context-exclusion/simple/webpack.config.js b/test/configCases/context-exclusion/simple/webpack.config.js index 914088d01fb..80ca2b09305 100644 --- a/test/configCases/context-exclusion/simple/webpack.config.js +++ b/test/configCases/context-exclusion/simple/webpack.config.js @@ -1,5 +1,6 @@ -var webpack = require("../../../../"); +const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { plugins: [new webpack.ContextExclusionPlugin(/dont/)] }; diff --git a/test/configCases/context-replacement/System.import/webpack.config.js b/test/configCases/context-replacement/System.import/webpack.config.js index dd3a95923e6..3b5569bcc74 100644 --- a/test/configCases/context-replacement/System.import/webpack.config.js +++ b/test/configCases/context-replacement/System.import/webpack.config.js @@ -1,6 +1,7 @@ var path = require("path"); var webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { plugins: [ new webpack.ContextReplacementPlugin( diff --git a/test/configCases/context-replacement/a/webpack.config.js b/test/configCases/context-replacement/a/webpack.config.js index effb49f41d0..2b44d0ceb8f 100644 --- a/test/configCases/context-replacement/a/webpack.config.js +++ b/test/configCases/context-replacement/a/webpack.config.js @@ -1,5 +1,6 @@ -var webpack = require("../../../../"); +const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { plugins: [ new webpack.ContextReplacementPlugin( diff --git a/test/configCases/context-replacement/b/webpack.config.js b/test/configCases/context-replacement/b/webpack.config.js index 90555063f65..3a5a33b4df7 100644 --- a/test/configCases/context-replacement/b/webpack.config.js +++ b/test/configCases/context-replacement/b/webpack.config.js @@ -1,5 +1,6 @@ -var webpack = require("../../../../"); +const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { plugins: [ new webpack.ContextReplacementPlugin(/context-replacement.b$/, /^\.\/only/) diff --git a/test/configCases/context-replacement/c/webpack.config.js b/test/configCases/context-replacement/c/webpack.config.js index 6a7c2c31413..2602bce536a 100644 --- a/test/configCases/context-replacement/c/webpack.config.js +++ b/test/configCases/context-replacement/c/webpack.config.js @@ -1,6 +1,7 @@ -var path = require("path"); -var webpack = require("../../../../"); +const path = require("path"); +const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { plugins: [ new webpack.ContextReplacementPlugin( diff --git a/test/configCases/context-replacement/d/queryloader.js b/test/configCases/context-replacement/d/queryloader.js index 88a2fd607bc..821519145eb 100644 --- a/test/configCases/context-replacement/d/queryloader.js +++ b/test/configCases/context-replacement/d/queryloader.js @@ -1,7 +1,11 @@ -module.exports = function(content) { - return "module.exports = " + JSON.stringify({ - resourceQuery: this.resourceQuery, - query: this.query, - prev: content.replace(/\r\n?/g, "\n") - }); +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (content) { + return ( + "module.exports = " + + JSON.stringify({ + resourceQuery: this.resourceQuery, + query: this.query, + prev: content.replace(/\r\n?/g, "\n") + }) + ); }; diff --git a/test/configCases/context-replacement/d/webpack.config.js b/test/configCases/context-replacement/d/webpack.config.js index 21b667c528f..fb0177ae566 100644 --- a/test/configCases/context-replacement/d/webpack.config.js +++ b/test/configCases/context-replacement/d/webpack.config.js @@ -1,6 +1,7 @@ -var path = require("path"); -var webpack = require("../../../../"); +const path = require("path"); +const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { module: { rules: [ diff --git a/test/configCases/context-replacement/e/index.js b/test/configCases/context-replacement/e/index.js new file mode 100644 index 00000000000..1fddfe65a20 --- /dev/null +++ b/test/configCases/context-replacement/e/index.js @@ -0,0 +1,14 @@ +it("should replace a context with a new resource and reqExp", function (done) { + function rqInContext(x, callback) { + require([x], function (x) { + callback(x); + }); + } + rqInContext("replaced", function (r) { + expect(r).toBe("ok"); + rqInContext("./modules/replaced", function (r) { + expect(r).toBe("ok"); + done(); + }); + }); +}); diff --git a/test/configCases/context-replacement/e/new-context/modules/error.js b/test/configCases/context-replacement/e/new-context/modules/error.js new file mode 100644 index 00000000000..a7450cb49bc --- /dev/null +++ b/test/configCases/context-replacement/e/new-context/modules/error.js @@ -0,0 +1,7 @@ +This +should +result +in +an +error +}]) \ No newline at end of file diff --git a/test/configCases/context-replacement/e/new-context/modules/replaced.js b/test/configCases/context-replacement/e/new-context/modules/replaced.js new file mode 100644 index 00000000000..654e0c92c5f --- /dev/null +++ b/test/configCases/context-replacement/e/new-context/modules/replaced.js @@ -0,0 +1 @@ +module.exports = "ok"; \ No newline at end of file diff --git a/test/configCases/context-replacement/e/webpack.config.js b/test/configCases/context-replacement/e/webpack.config.js new file mode 100644 index 00000000000..302cc942356 --- /dev/null +++ b/test/configCases/context-replacement/e/webpack.config.js @@ -0,0 +1,17 @@ +const path = require("path"); +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + resolve: { + modules: ["...", path.resolve(__dirname, "new-context/modules")] + }, + plugins: [ + new webpack.ContextReplacementPlugin( + /context-replacement.e$/, + "new-context", + true, + /^replaced$|^\.\/modules\/rep/ + ) + ] +}; diff --git a/test/configCases/commons-chunk-plugin/correct-order/a.js b/test/configCases/context-replacement/f/folder/a.js similarity index 100% rename from test/configCases/commons-chunk-plugin/correct-order/a.js rename to test/configCases/context-replacement/f/folder/a.js diff --git a/test/configCases/context-replacement/f/folder/nested/error.js b/test/configCases/context-replacement/f/folder/nested/error.js new file mode 100644 index 00000000000..a7450cb49bc --- /dev/null +++ b/test/configCases/context-replacement/f/folder/nested/error.js @@ -0,0 +1,7 @@ +This +should +result +in +an +error +}]) \ No newline at end of file diff --git a/test/configCases/context-replacement/f/index.js b/test/configCases/context-replacement/f/index.js new file mode 100644 index 00000000000..6051fcfb05f --- /dev/null +++ b/test/configCases/context-replacement/f/index.js @@ -0,0 +1,6 @@ +it("should replace a context with a new regExp", function() { + function rqInContext(x) { + return require('./folder/' + x); + } + expect(rqInContext("a")).toBe("a"); +}); diff --git a/test/configCases/context-replacement/f/webpack.config.js b/test/configCases/context-replacement/f/webpack.config.js new file mode 100644 index 00000000000..84e11a8fd32 --- /dev/null +++ b/test/configCases/context-replacement/f/webpack.config.js @@ -0,0 +1,6 @@ +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [new webpack.ContextReplacementPlugin(/folder$/, false, /(a|b)/)] +}; diff --git a/test/configCases/crossorigin/set-crossorigin/index.js b/test/configCases/crossorigin/set-crossorigin/index.js index 6330978d157..a5e6677d872 100644 --- a/test/configCases/crossorigin/set-crossorigin/index.js +++ b/test/configCases/crossorigin/set-crossorigin/index.js @@ -65,3 +65,17 @@ it("should load script with crossorigin attribute anonymous (different origin)", return promise; }); + +it("should load style with crossorigin attribute anonymous (different origin)", function() { + var originalValue = __webpack_public_path__; + __webpack_public_path__ = "https://example.com/"; + const promise = import("./style.css?e" /* webpackChunkName: "crossorigin-different-origin" */); + __webpack_public_path__ = originalValue; + + var link = document.head._children[0]; + + expect(link.href).toBe("https://example.com/crossorigin-different-origin.web.css"); + expect(link.crossOrigin).toBe("anonymous"); + + return promise; +}); diff --git a/test/configCases/crossorigin/set-crossorigin/style.css b/test/configCases/crossorigin/set-crossorigin/style.css new file mode 100644 index 00000000000..60f1eab9713 --- /dev/null +++ b/test/configCases/crossorigin/set-crossorigin/style.css @@ -0,0 +1,3 @@ +body { + color: red; +} diff --git a/test/configCases/crossorigin/set-crossorigin/webpack.config.js b/test/configCases/crossorigin/set-crossorigin/webpack.config.js index 68eeb96a523..10096afbdf0 100644 --- a/test/configCases/crossorigin/set-crossorigin/webpack.config.js +++ b/test/configCases/crossorigin/set-crossorigin/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { target: "web", output: { @@ -9,5 +10,8 @@ module.exports = { }, optimization: { minimize: false + }, + experiments: { + css: true } }; diff --git a/test/configCases/css/async-chunk-node/index.js b/test/configCases/css/async-chunk-node/index.js new file mode 100644 index 00000000000..5f422e6a82f --- /dev/null +++ b/test/configCases/css/async-chunk-node/index.js @@ -0,0 +1,25 @@ +it("should allow to dynamic import a css module", done => { + import("../pseudo-export/style.module.css").then(x => { + try { + expect(x).toEqual( + nsObj({ + a: "a", + abc: "a b c", + comments: "abc/****/ /* hello world *//****/ def", + whitespace: "abc\n\tdef", + default: "default" + }) + ); + } catch (e) { + return done(e); + } + done(); + }, done); +}); + +it("should allow to dynamic import a pure css", done => { + import("./style.css").then(x => { + expect(Object.keys(x).length).toBe(0) + done(); + }, done); +}); diff --git a/test/configCases/css/async-chunk-node/style.css b/test/configCases/css/async-chunk-node/style.css new file mode 100644 index 00000000000..626e93720d0 --- /dev/null +++ b/test/configCases/css/async-chunk-node/style.css @@ -0,0 +1,3 @@ +.class { + color: red; +} diff --git a/test/configCases/css/async-chunk-node/webpack.config.js b/test/configCases/css/async-chunk-node/webpack.config.js new file mode 100644 index 00000000000..a91e72d278a --- /dev/null +++ b/test/configCases/css/async-chunk-node/webpack.config.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "node", + mode: "development", + experiments: { + css: true + } +}; diff --git a/test/configCases/css/basic-dynamic-only/index.js b/test/configCases/css/basic-dynamic-only/index.js new file mode 100644 index 00000000000..0e786f4ccd9 --- /dev/null +++ b/test/configCases/css/basic-dynamic-only/index.js @@ -0,0 +1,9 @@ +it("should compile and load style on demand", (done) => { + import("./style.css").then(x => { + expect(x).toEqual({}); + const style = getComputedStyle(document.body); + expect(style.getPropertyValue("background")).toBe(" red"); + expect(style.getPropertyValue("margin")).toBe(" 10px"); + done(); + }, done); +}); diff --git a/test/configCases/css/basic-dynamic-only/style-imported.css b/test/configCases/css/basic-dynamic-only/style-imported.css new file mode 100644 index 00000000000..eb0ae451455 --- /dev/null +++ b/test/configCases/css/basic-dynamic-only/style-imported.css @@ -0,0 +1,3 @@ +body { + margin: 10px; +} diff --git a/test/configCases/css/basic-dynamic-only/style.css b/test/configCases/css/basic-dynamic-only/style.css new file mode 100644 index 00000000000..19aa0d1f6d4 --- /dev/null +++ b/test/configCases/css/basic-dynamic-only/style.css @@ -0,0 +1,5 @@ +@import url(https://test.cases/path/../../../../configCases/css/import/external.css); +@import "style-imported.css"; +body { + background: red; +} diff --git a/test/configCases/css/basic-dynamic-only/test.config.js b/test/configCases/css/basic-dynamic-only/test.config.js new file mode 100644 index 00000000000..c141c9959a1 --- /dev/null +++ b/test/configCases/css/basic-dynamic-only/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["style_css.bundle0.js", "bundle0.js"]; + } +}; diff --git a/test/configCases/css/basic-dynamic-only/webpack.config.js b/test/configCases/css/basic-dynamic-only/webpack.config.js new file mode 100644 index 00000000000..eb8b0ebb1bd --- /dev/null +++ b/test/configCases/css/basic-dynamic-only/webpack.config.js @@ -0,0 +1,9 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + externalsPresets: { web: false, webAsync: true }, + experiments: { + css: true + } +}; diff --git a/test/configCases/css/basic-esm-target-node/index.js b/test/configCases/css/basic-esm-target-node/index.js new file mode 100644 index 00000000000..4f3f829ec97 --- /dev/null +++ b/test/configCases/css/basic-esm-target-node/index.js @@ -0,0 +1,9 @@ +import * as style from "./style.css"; + +it("should compile and load style on demand", done => { + expect(style).toEqual({}); + import("./style2.css").then(x => { + expect(x).toEqual({}); + done(); + }, done); +}); diff --git a/test/configCases/css/basic-esm-target-node/style-imported.css b/test/configCases/css/basic-esm-target-node/style-imported.css new file mode 100644 index 00000000000..eb0ae451455 --- /dev/null +++ b/test/configCases/css/basic-esm-target-node/style-imported.css @@ -0,0 +1,3 @@ +body { + margin: 10px; +} diff --git a/test/configCases/css/basic-esm-target-node/style.css b/test/configCases/css/basic-esm-target-node/style.css new file mode 100644 index 00000000000..ba0cfaf6561 --- /dev/null +++ b/test/configCases/css/basic-esm-target-node/style.css @@ -0,0 +1,4 @@ +@import "style-imported.css"; +body { + background: red; +} diff --git a/test/configCases/css/basic-esm-target-node/style2-imported.css b/test/configCases/css/basic-esm-target-node/style2-imported.css new file mode 100644 index 00000000000..ff9387e5d3e --- /dev/null +++ b/test/configCases/css/basic-esm-target-node/style2-imported.css @@ -0,0 +1,3 @@ +body { + padding: 20px 10px; +} diff --git a/test/configCases/css/basic-esm-target-node/style2.css b/test/configCases/css/basic-esm-target-node/style2.css new file mode 100644 index 00000000000..d80cbcd05df --- /dev/null +++ b/test/configCases/css/basic-esm-target-node/style2.css @@ -0,0 +1,4 @@ +@import "./style2-imported.css"; +body { + color: green; +} diff --git a/test/configCases/css/basic-esm-target-node/webpack.config.js b/test/configCases/css/basic-esm-target-node/webpack.config.js new file mode 100644 index 00000000000..91b082607b5 --- /dev/null +++ b/test/configCases/css/basic-esm-target-node/webpack.config.js @@ -0,0 +1,13 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "node", + mode: "development", + experiments: { + outputModule: true, + css: true + }, + output: { + module: true, + chunkFormat: "module" + } +}; diff --git a/test/configCases/css/basic-esm-target-web/index.js b/test/configCases/css/basic-esm-target-web/index.js new file mode 100644 index 00000000000..eb4c93a7f52 --- /dev/null +++ b/test/configCases/css/basic-esm-target-web/index.js @@ -0,0 +1,14 @@ +import * as style from "./style.css"; + +it("should compile and load style on demand", done => { + expect(style).toEqual({}); + import("./style2.css").then(x => { + expect(x).toEqual({}); + const style = getComputedStyle(document.body); + expect(style.getPropertyValue("background")).toBe(" red"); + expect(style.getPropertyValue("margin")).toBe(" 10px"); + expect(style.getPropertyValue("color")).toBe(" green"); + expect(style.getPropertyValue("padding")).toBe(" 20px 10px"); + done(); + }, done); +}); diff --git a/test/configCases/css/basic-esm-target-web/style-imported.css b/test/configCases/css/basic-esm-target-web/style-imported.css new file mode 100644 index 00000000000..eb0ae451455 --- /dev/null +++ b/test/configCases/css/basic-esm-target-web/style-imported.css @@ -0,0 +1,3 @@ +body { + margin: 10px; +} diff --git a/test/configCases/css/basic-esm-target-web/style.css b/test/configCases/css/basic-esm-target-web/style.css new file mode 100644 index 00000000000..ba0cfaf6561 --- /dev/null +++ b/test/configCases/css/basic-esm-target-web/style.css @@ -0,0 +1,4 @@ +@import "style-imported.css"; +body { + background: red; +} diff --git a/test/configCases/css/basic-esm-target-web/style2-imported.css b/test/configCases/css/basic-esm-target-web/style2-imported.css new file mode 100644 index 00000000000..ff9387e5d3e --- /dev/null +++ b/test/configCases/css/basic-esm-target-web/style2-imported.css @@ -0,0 +1,3 @@ +body { + padding: 20px 10px; +} diff --git a/test/configCases/css/basic-esm-target-web/style2.css b/test/configCases/css/basic-esm-target-web/style2.css new file mode 100644 index 00000000000..d80cbcd05df --- /dev/null +++ b/test/configCases/css/basic-esm-target-web/style2.css @@ -0,0 +1,4 @@ +@import "./style2-imported.css"; +body { + color: green; +} diff --git a/test/configCases/css/basic-esm-target-web/test.config.js b/test/configCases/css/basic-esm-target-web/test.config.js new file mode 100644 index 00000000000..0590757288f --- /dev/null +++ b/test/configCases/css/basic-esm-target-web/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "bundle0.css"; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/basic-esm-target-web/webpack.config.js b/test/configCases/css/basic-esm-target-web/webpack.config.js new file mode 100644 index 00000000000..673fa0ebded --- /dev/null +++ b/test/configCases/css/basic-esm-target-web/webpack.config.js @@ -0,0 +1,13 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + experiments: { + outputModule: true, + css: true + }, + output: { + module: true, + chunkFormat: "module" + } +}; diff --git a/test/configCases/css/basic-initial-only/index.js b/test/configCases/css/basic-initial-only/index.js new file mode 100644 index 00000000000..ea3660d24ed --- /dev/null +++ b/test/configCases/css/basic-initial-only/index.js @@ -0,0 +1,8 @@ +import * as style from "./style.css"; + +it("should compile and load initial style", () => { + expect(style).toEqual({}); + const computedStyle = getComputedStyle(document.body); + expect(computedStyle.getPropertyValue("background")).toBe(" red"); + expect(computedStyle.getPropertyValue("margin")).toBe(" 10px"); +}); diff --git a/test/configCases/css/basic-initial-only/style-imported.css b/test/configCases/css/basic-initial-only/style-imported.css new file mode 100644 index 00000000000..eb0ae451455 --- /dev/null +++ b/test/configCases/css/basic-initial-only/style-imported.css @@ -0,0 +1,3 @@ +body { + margin: 10px; +} diff --git a/test/configCases/css/basic-initial-only/style.css b/test/configCases/css/basic-initial-only/style.css new file mode 100644 index 00000000000..19aa0d1f6d4 --- /dev/null +++ b/test/configCases/css/basic-initial-only/style.css @@ -0,0 +1,5 @@ +@import url(https://test.cases/path/../../../../configCases/css/import/external.css); +@import "style-imported.css"; +body { + background: red; +} diff --git a/test/configCases/css/basic-initial-only/test.config.js b/test/configCases/css/basic-initial-only/test.config.js new file mode 100644 index 00000000000..0590757288f --- /dev/null +++ b/test/configCases/css/basic-initial-only/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "bundle0.css"; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/basic-initial-only/webpack.config.js b/test/configCases/css/basic-initial-only/webpack.config.js new file mode 100644 index 00000000000..eb8b0ebb1bd --- /dev/null +++ b/test/configCases/css/basic-initial-only/webpack.config.js @@ -0,0 +1,9 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + externalsPresets: { web: false, webAsync: true }, + experiments: { + css: true + } +}; diff --git a/test/configCases/css/basic-web-async/index.js b/test/configCases/css/basic-web-async/index.js new file mode 100644 index 00000000000..eb4c93a7f52 --- /dev/null +++ b/test/configCases/css/basic-web-async/index.js @@ -0,0 +1,14 @@ +import * as style from "./style.css"; + +it("should compile and load style on demand", done => { + expect(style).toEqual({}); + import("./style2.css").then(x => { + expect(x).toEqual({}); + const style = getComputedStyle(document.body); + expect(style.getPropertyValue("background")).toBe(" red"); + expect(style.getPropertyValue("margin")).toBe(" 10px"); + expect(style.getPropertyValue("color")).toBe(" green"); + expect(style.getPropertyValue("padding")).toBe(" 20px 10px"); + done(); + }, done); +}); diff --git a/test/configCases/css/basic-web-async/style-imported.css b/test/configCases/css/basic-web-async/style-imported.css new file mode 100644 index 00000000000..eb0ae451455 --- /dev/null +++ b/test/configCases/css/basic-web-async/style-imported.css @@ -0,0 +1,3 @@ +body { + margin: 10px; +} diff --git a/test/configCases/css/basic-web-async/style.css b/test/configCases/css/basic-web-async/style.css new file mode 100644 index 00000000000..ba0cfaf6561 --- /dev/null +++ b/test/configCases/css/basic-web-async/style.css @@ -0,0 +1,4 @@ +@import "style-imported.css"; +body { + background: red; +} diff --git a/test/configCases/css/basic-web-async/style2-imported.css b/test/configCases/css/basic-web-async/style2-imported.css new file mode 100644 index 00000000000..ff9387e5d3e --- /dev/null +++ b/test/configCases/css/basic-web-async/style2-imported.css @@ -0,0 +1,3 @@ +body { + padding: 20px 10px; +} diff --git a/test/configCases/css/basic-web-async/style2.css b/test/configCases/css/basic-web-async/style2.css new file mode 100644 index 00000000000..d80cbcd05df --- /dev/null +++ b/test/configCases/css/basic-web-async/style2.css @@ -0,0 +1,4 @@ +@import "./style2-imported.css"; +body { + color: green; +} diff --git a/test/configCases/css/basic-web-async/test.config.js b/test/configCases/css/basic-web-async/test.config.js new file mode 100644 index 00000000000..2462953a0f2 --- /dev/null +++ b/test/configCases/css/basic-web-async/test.config.js @@ -0,0 +1,11 @@ +module.exports = { + findBundle(i, options) { + return ["style2_css.bundle0.js", "bundle0.js"]; + }, + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "bundle0.css"; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/basic-web-async/webpack.config.js b/test/configCases/css/basic-web-async/webpack.config.js new file mode 100644 index 00000000000..eb8b0ebb1bd --- /dev/null +++ b/test/configCases/css/basic-web-async/webpack.config.js @@ -0,0 +1,9 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + externalsPresets: { web: false, webAsync: true }, + experiments: { + css: true + } +}; diff --git a/test/configCases/css/basic/index.js b/test/configCases/css/basic/index.js new file mode 100644 index 00000000000..eb4c93a7f52 --- /dev/null +++ b/test/configCases/css/basic/index.js @@ -0,0 +1,14 @@ +import * as style from "./style.css"; + +it("should compile and load style on demand", done => { + expect(style).toEqual({}); + import("./style2.css").then(x => { + expect(x).toEqual({}); + const style = getComputedStyle(document.body); + expect(style.getPropertyValue("background")).toBe(" red"); + expect(style.getPropertyValue("margin")).toBe(" 10px"); + expect(style.getPropertyValue("color")).toBe(" green"); + expect(style.getPropertyValue("padding")).toBe(" 20px 10px"); + done(); + }, done); +}); diff --git a/test/configCases/css/basic/style-imported.css b/test/configCases/css/basic/style-imported.css new file mode 100644 index 00000000000..eb0ae451455 --- /dev/null +++ b/test/configCases/css/basic/style-imported.css @@ -0,0 +1,3 @@ +body { + margin: 10px; +} diff --git a/test/configCases/css/basic/style.css b/test/configCases/css/basic/style.css new file mode 100644 index 00000000000..ba0cfaf6561 --- /dev/null +++ b/test/configCases/css/basic/style.css @@ -0,0 +1,4 @@ +@import "style-imported.css"; +body { + background: red; +} diff --git a/test/configCases/css/basic/style2-imported.css b/test/configCases/css/basic/style2-imported.css new file mode 100644 index 00000000000..ff9387e5d3e --- /dev/null +++ b/test/configCases/css/basic/style2-imported.css @@ -0,0 +1,3 @@ +body { + padding: 20px 10px; +} diff --git a/test/configCases/css/basic/style2.css b/test/configCases/css/basic/style2.css new file mode 100644 index 00000000000..d80cbcd05df --- /dev/null +++ b/test/configCases/css/basic/style2.css @@ -0,0 +1,4 @@ +@import "./style2-imported.css"; +body { + color: green; +} diff --git a/test/configCases/css/basic/test.config.js b/test/configCases/css/basic/test.config.js new file mode 100644 index 00000000000..2462953a0f2 --- /dev/null +++ b/test/configCases/css/basic/test.config.js @@ -0,0 +1,11 @@ +module.exports = { + findBundle(i, options) { + return ["style2_css.bundle0.js", "bundle0.js"]; + }, + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "bundle0.css"; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/basic/webpack.config.js b/test/configCases/css/basic/webpack.config.js new file mode 100644 index 00000000000..cfb8e5c0346 --- /dev/null +++ b/test/configCases/css/basic/webpack.config.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + experiments: { + css: true + } +}; diff --git a/test/configCases/css/build-http/index.js b/test/configCases/css/build-http/index.js new file mode 100644 index 00000000000..d4120b0b952 --- /dev/null +++ b/test/configCases/css/build-http/index.js @@ -0,0 +1,14 @@ +import "./style.css"; + +it(`should work with URLs in CSS`, done => { + const links = document.getElementsByTagName("link"); + const css = []; + + // Skip first because import it by default + for (const link of links.slice(1)) { + css.push(link.sheet.css); + } + + expect(css).toMatchSnapshot(); + done(); +}); diff --git a/test/configCases/css/build-http/lock-files/lock.json b/test/configCases/css/build-http/lock-files/lock.json new file mode 100644 index 00000000000..a129accb716 --- /dev/null +++ b/test/configCases/css/build-http/lock-files/lock.json @@ -0,0 +1,6 @@ +{ + "https://github.com/webpack/webpack/blob/main/test/configCases/css/url/img1x.png?raw=true": "no-cache", + "https://raw.githubusercontent.com/webpack/webpack/refs/heads/main/test/configCases/css/import/print.css": { "integrity": "sha512-/myPbDE4wFl8iP0bC1CXR+X+TOscaPV9+NbYoBGSQC+isfd0aenGk15EijukV04CW61CXR+c22ZgG0dp7ldntw==", "contentType": "text/plain; charset=utf-8" }, + "https://raw.githubusercontent.com/webpack/webpack/refs/heads/main/test/configCases/css/url/img.png": { "integrity": "sha512-bHqIPBYwzPsVLYcTDqJzwgvIaxLjmezufiCVXAMI0Naelf3eWVdydMA40hXbSuB0dZCGjCepuGaI7Ze8kLM+Ew==", "contentType": "image/png" }, + "version": 1 +} diff --git a/test/configCases/css/build-http/lock-files/test/https_raw.githubusercontent.com/webpack_webpack_refs_heads_main_test_configCases_css_import_print_fe2e4bc761f16d07c5d8.css b/test/configCases/css/build-http/lock-files/test/https_raw.githubusercontent.com/webpack_webpack_refs_heads_main_test_configCases_css_import_print_fe2e4bc761f16d07c5d8.css new file mode 100644 index 00000000000..5fa2bfe59ff --- /dev/null +++ b/test/configCases/css/build-http/lock-files/test/https_raw.githubusercontent.com/webpack_webpack_refs_heads_main_test_configCases_css_import_print_fe2e4bc761f16d07c5d8.css @@ -0,0 +1,3 @@ +body { + background: black; +} diff --git a/test/configCases/css/build-http/lock-files/test/https_raw.githubusercontent.com/webpack_webpack_refs_heads_main_test_configCases_css_url_img_03f8141d33ee58db56db.png b/test/configCases/css/build-http/lock-files/test/https_raw.githubusercontent.com/webpack_webpack_refs_heads_main_test_configCases_css_url_img_03f8141d33ee58db56db.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/build-http/lock-files/test/https_raw.githubusercontent.com/webpack_webpack_refs_heads_main_test_configCases_css_url_img_03f8141d33ee58db56db.png differ diff --git a/test/configCases/css/build-http/style.css b/test/configCases/css/build-http/style.css new file mode 100644 index 00000000000..237c2257f0e --- /dev/null +++ b/test/configCases/css/build-http/style.css @@ -0,0 +1,5 @@ +@import "https://raw.githubusercontent.com/webpack/webpack/refs/heads/main/test/configCases/css/import/print.css"; + +div { + background: url(https://raw.githubusercontent.com/webpack/webpack/refs/heads/main/test/configCases/css/url/img.png) +} diff --git a/test/configCases/css/build-http/test.config.js b/test/configCases/css/build-http/test.config.js new file mode 100644 index 00000000000..0590757288f --- /dev/null +++ b/test/configCases/css/build-http/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "bundle0.css"; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/build-http/webpack.config.js b/test/configCases/css/build-http/webpack.config.js new file mode 100644 index 00000000000..b70654f3461 --- /dev/null +++ b/test/configCases/css/build-http/webpack.config.js @@ -0,0 +1,15 @@ +const path = require("path"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + experiments: { + buildHttp: { + allowedUris: [() => true], + lockfileLocation: path.resolve(__dirname, "./lock-files/lock.json"), + cacheLocation: path.resolve(__dirname, "./lock-files/test") + }, + css: true + } +}; diff --git a/test/configCases/css/cjs-module-syntax/index.js b/test/configCases/css/cjs-module-syntax/index.js new file mode 100644 index 00000000000..96fefdfe99a --- /dev/null +++ b/test/configCases/css/cjs-module-syntax/index.js @@ -0,0 +1,11 @@ +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +it("should able to require the css module as commonjs", () => { + const style = require("./style.module.css"); + const interoperatedStyle = _interopRequireDefault(require("./style.module.css")); + + expect(style).toEqual({ foo: '_style_module_css-foo' }); + expect(style).not.toEqual(nsObj({ foo: '_style_module_css-foo' })); + expect(style.__esModule).toEqual(undefined); + expect(interoperatedStyle.default.foo).toEqual("_style_module_css-foo"); +}); diff --git a/test/configCases/css/cjs-module-syntax/style.module.css b/test/configCases/css/cjs-module-syntax/style.module.css new file mode 100644 index 00000000000..cedf0a6d1f1 --- /dev/null +++ b/test/configCases/css/cjs-module-syntax/style.module.css @@ -0,0 +1,3 @@ +.foo { + color: red; +} diff --git a/test/configCases/css/cjs-module-syntax/test.config.js b/test/configCases/css/cjs-module-syntax/test.config.js new file mode 100644 index 00000000000..d8b1cd2e6ed --- /dev/null +++ b/test/configCases/css/cjs-module-syntax/test.config.js @@ -0,0 +1,10 @@ +module.exports = { + moduleScope(scope) { + if (scope.document) { + const link = scope.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "bundle0.css"; + scope.document.head.appendChild(link); + } + } +}; diff --git a/test/configCases/css/cjs-module-syntax/webpack.config.js b/test/configCases/css/cjs-module-syntax/webpack.config.js new file mode 100644 index 00000000000..c99de4b1ee8 --- /dev/null +++ b/test/configCases/css/cjs-module-syntax/webpack.config.js @@ -0,0 +1,31 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = [ + { + target: "web", + mode: "development", + module: { + generator: { + "css/auto": { + esModule: false + } + } + }, + experiments: { + css: true + } + }, + { + target: "node", + mode: "development", + module: { + generator: { + "css/auto": { + esModule: false + } + } + }, + experiments: { + css: true + } + } +]; diff --git a/test/configCases/css/conflicting-order/a.css b/test/configCases/css/conflicting-order/a.css new file mode 100644 index 00000000000..facff2572fd --- /dev/null +++ b/test/configCases/css/conflicting-order/a.css @@ -0,0 +1,3 @@ +body { + color: a; +} diff --git a/test/configCases/css/conflicting-order/b.css b/test/configCases/css/conflicting-order/b.css new file mode 100644 index 00000000000..d056e75b364 --- /dev/null +++ b/test/configCases/css/conflicting-order/b.css @@ -0,0 +1,3 @@ +body { + color: b; +} diff --git a/test/configCases/css/conflicting-order/c.css b/test/configCases/css/conflicting-order/c.css new file mode 100644 index 00000000000..f3ed682c771 --- /dev/null +++ b/test/configCases/css/conflicting-order/c.css @@ -0,0 +1,3 @@ +body { + color: c; +} diff --git a/test/configCases/css/conflicting-order/d.css b/test/configCases/css/conflicting-order/d.css new file mode 100644 index 00000000000..3f32d017594 --- /dev/null +++ b/test/configCases/css/conflicting-order/d.css @@ -0,0 +1,3 @@ +body { + color: d; +} diff --git a/test/configCases/css/conflicting-order/e.css b/test/configCases/css/conflicting-order/e.css new file mode 100644 index 00000000000..1860e384e83 --- /dev/null +++ b/test/configCases/css/conflicting-order/e.css @@ -0,0 +1,3 @@ +body { + color: e; +} diff --git a/test/configCases/css/conflicting-order/index.js b/test/configCases/css/conflicting-order/index.js new file mode 100644 index 00000000000..1bb72365811 --- /dev/null +++ b/test/configCases/css/conflicting-order/index.js @@ -0,0 +1,23 @@ +import fs from "fs"; +import path from "path"; + +it("should lead to conflicting order warning", done => { + __non_webpack_require__("./lazy4_js.bundle0.js"); + Promise.all([ + import("./lazy1.css"), + import("./lazy2.css"), + import("./lazy3.css"), + import("./lazy4.js") + ]).then(() => { + try { + const matches = fs + .readFileSync(path.join(__dirname, "css.bundle0.css"), "utf-8") + .match(/color: ([a-z0-9])/g) + .map(match => match[7]); + expect(matches).toEqual("bcdea123".split("")); + done(); + } catch (e) { + done(e); + } + }, done); +}); diff --git a/test/configCases/css/conflicting-order/lazy1.css b/test/configCases/css/conflicting-order/lazy1.css new file mode 100644 index 00000000000..0cf98e07196 --- /dev/null +++ b/test/configCases/css/conflicting-order/lazy1.css @@ -0,0 +1,7 @@ +@import "b.css"; +@import "c.css"; +@import "a.css"; + +body { + color: 1; +} diff --git a/test/configCases/css/conflicting-order/lazy2.css b/test/configCases/css/conflicting-order/lazy2.css new file mode 100644 index 00000000000..9926298dfaf --- /dev/null +++ b/test/configCases/css/conflicting-order/lazy2.css @@ -0,0 +1,7 @@ +@import "c.css"; +@import "b.css"; +@import "a.css"; + +body { + color: 2; +} diff --git a/test/configCases/css/conflicting-order/lazy3.css b/test/configCases/css/conflicting-order/lazy3.css new file mode 100644 index 00000000000..945f24b7a0b --- /dev/null +++ b/test/configCases/css/conflicting-order/lazy3.css @@ -0,0 +1,6 @@ +@import "d.css"; +@import "a.css"; + +body { + color: 3; +} diff --git a/test/configCases/css/conflicting-order/lazy4.js b/test/configCases/css/conflicting-order/lazy4.js new file mode 100644 index 00000000000..1e7987525f3 --- /dev/null +++ b/test/configCases/css/conflicting-order/lazy4.js @@ -0,0 +1,2 @@ +import "./e.css"; +import "./a.css"; diff --git a/test/configCases/css/conflicting-order/test.config.js b/test/configCases/css/conflicting-order/test.config.js new file mode 100644 index 00000000000..c53f3453533 --- /dev/null +++ b/test/configCases/css/conflicting-order/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["css.bundle0.js", "lazy4_js.bundle0.js", "bundle0.js"]; + } +}; diff --git a/test/configCases/css/conflicting-order/warnings.js b/test/configCases/css/conflicting-order/warnings.js new file mode 100644 index 00000000000..bf0f21a942d --- /dev/null +++ b/test/configCases/css/conflicting-order/warnings.js @@ -0,0 +1,3 @@ +module.exports = [ + [/Conflicting order between css \.\/b\.css and css \.\/c\.css/] +]; diff --git a/test/configCases/css/conflicting-order/webpack.config.js b/test/configCases/css/conflicting-order/webpack.config.js new file mode 100644 index 00000000000..a5f3136eaa4 --- /dev/null +++ b/test/configCases/css/conflicting-order/webpack.config.js @@ -0,0 +1,25 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + experiments: { + css: true + }, + optimization: { + splitChunks: { + cacheGroups: { + css: { + type: "css/auto", + enforce: true, + name: "css" + } + } + } + }, + externalsPresets: { + node: true + }, + node: { + __dirname: false + } +}; diff --git a/test/configCases/css/contenthash/async.css b/test/configCases/css/contenthash/async.css new file mode 100644 index 00000000000..e05a8819abb --- /dev/null +++ b/test/configCases/css/contenthash/async.css @@ -0,0 +1,4 @@ +body { + background: yellow; + color: green; +} diff --git a/test/configCases/css/contenthash/async.js b/test/configCases/css/contenthash/async.js new file mode 100644 index 00000000000..6308565c261 --- /dev/null +++ b/test/configCases/css/contenthash/async.js @@ -0,0 +1 @@ +export const name = 'async'; diff --git a/test/configCases/css/contenthash/index.js b/test/configCases/css/contenthash/index.js new file mode 100644 index 00000000000..f2504f3a75a --- /dev/null +++ b/test/configCases/css/contenthash/index.js @@ -0,0 +1,28 @@ +import * as style from "./style.css"; + +it("should work with js", done => { + import('./async.js').then(x => { + expect(x.name).toBe("async") + done(); + }, done); +}); + +it("should work with css", done => { + expect(style).toEqual({}); + + const computedStyle = getComputedStyle(document.body); + + expect(computedStyle.getPropertyValue("background")).toBe(" green"); + expect(computedStyle.getPropertyValue("color")).toBe(" yellow"); + + import("./async.css").then(x => { + expect(x).toEqual({}); + + const style = getComputedStyle(document.body); + + expect(style.getPropertyValue("background")).toBe(" yellow"); + expect(style.getPropertyValue("color")).toBe(" green"); + + done(); + }, done); +}); diff --git a/test/configCases/css/contenthash/style.css b/test/configCases/css/contenthash/style.css new file mode 100644 index 00000000000..9cbc00618c7 --- /dev/null +++ b/test/configCases/css/contenthash/style.css @@ -0,0 +1,4 @@ +body { + background: green; + color: yellow; +} diff --git a/test/configCases/css/contenthash/test.config.js b/test/configCases/css/contenthash/test.config.js new file mode 100644 index 00000000000..6a9d21daf11 --- /dev/null +++ b/test/configCases/css/contenthash/test.config.js @@ -0,0 +1,17 @@ +const findOutputFiles = require("../../../helpers/findOutputFiles"); + +module.exports = { + findBundle(i, options) { + const async1 = findOutputFiles(options, /^async.async_js.+.js/)[0]; + const async2 = findOutputFiles(options, /^async.async_css.+.js/)[0]; + const bundle = findOutputFiles(options, /^bundle.+.js/)[0]; + return [async1, async2, bundle]; + }, + moduleScope(scope, options) { + const bundle = findOutputFiles(options, /bundle.+.css/)[0]; + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = bundle; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/contenthash/webpack.config.js b/test/configCases/css/contenthash/webpack.config.js new file mode 100644 index 00000000000..2f799e18d58 --- /dev/null +++ b/test/configCases/css/contenthash/webpack.config.js @@ -0,0 +1,14 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + output: { + filename: "bundle.[name].[contenthash].js", + cssFilename: "bundle.[name].[contenthash].css", + chunkFilename: "async.[name].[contenthash].js", + cssChunkFilename: "async.[name].[contenthash].css" + }, + experiments: { + css: true + } +}; diff --git a/test/configCases/css/css-auto/colors.js b/test/configCases/css/css-auto/colors.js new file mode 100644 index 00000000000..91f7b0d0db4 --- /dev/null +++ b/test/configCases/css/css-auto/colors.js @@ -0,0 +1,2 @@ +export const red = '#f00'; +export const green = '#0f0'; \ No newline at end of file diff --git a/test/configCases/css/css-auto/global.less b/test/configCases/css/css-auto/global.less new file mode 100644 index 00000000000..f815695493b --- /dev/null +++ b/test/configCases/css/css-auto/global.less @@ -0,0 +1,3 @@ +body { + color: green; +} diff --git a/test/configCases/css/css-auto/index.js b/test/configCases/css/css-auto/index.js new file mode 100644 index 00000000000..bcb816d922d --- /dev/null +++ b/test/configCases/css/css-auto/index.js @@ -0,0 +1,17 @@ +import "./global.less"; +import * as style1 from "./style1.module.less"; +import * as style2 from "./style2.modules.less"; +import * as style3 from "./style3.module.less!=!./loader.js!./style3.module.js"; +import * as style4 from "./style4.module.less!=!./loader.js!./style4.js"; +import * as style5 from "./style5.module.css!=!./loader.js!./style4.js"; + +it("should correctly compile css/auto", () => { + const style = getComputedStyle(document.body); + expect(style.getPropertyValue("color")).toBe(" green"); + expect(style.getPropertyValue("background")).toBe(" #f00"); + expect(style1.class).toBe("_style1_module_less-class"); + expect(style2.class).toBe("_style2_modules_less-class"); + expect(style3.class).toBe("_style3_module_less_loader_js_style3_module_js-class"); + expect(style4.class).toBe("_style4_module_less_loader_js_style4_js-class"); + expect(style5.class).toBe("_style5_module_css_loader_js_style4_js-class"); +}); diff --git a/test/configCases/css/css-auto/loader.js b/test/configCases/css/css-auto/loader.js new file mode 100644 index 00000000000..5165d32de03 --- /dev/null +++ b/test/configCases/css/css-auto/loader.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").PitchLoaderDefinitionFunction} */ +exports.pitch = async function (remaining) { + const result = await this.importModule( + this.resourcePath + '.webpack[javascript/auto]' + '!=!' + remaining, { + publicPath: '' + }); + return result.default || result; +}; diff --git a/test/configCases/css/css-auto/style1.module.less b/test/configCases/css/css-auto/style1.module.less new file mode 100644 index 00000000000..626e93720d0 --- /dev/null +++ b/test/configCases/css/css-auto/style1.module.less @@ -0,0 +1,3 @@ +.class { + color: red; +} diff --git a/test/configCases/css/css-auto/style2.modules.less b/test/configCases/css/css-auto/style2.modules.less new file mode 100644 index 00000000000..323ffaed199 --- /dev/null +++ b/test/configCases/css/css-auto/style2.modules.less @@ -0,0 +1,3 @@ +.class { + color: blue; +} diff --git a/test/configCases/css/css-auto/style3.module.js b/test/configCases/css/css-auto/style3.module.js new file mode 100644 index 00000000000..c56e98fb281 --- /dev/null +++ b/test/configCases/css/css-auto/style3.module.js @@ -0,0 +1,6 @@ +import { green, red } from './colors.js'; + +export default ` +.class { color: ${green}; } +body { background: ${red}; } +`; diff --git a/test/configCases/css/css-auto/style4.js b/test/configCases/css/css-auto/style4.js new file mode 100644 index 00000000000..c56e98fb281 --- /dev/null +++ b/test/configCases/css/css-auto/style4.js @@ -0,0 +1,6 @@ +import { green, red } from './colors.js'; + +export default ` +.class { color: ${green}; } +body { background: ${red}; } +`; diff --git a/test/configCases/css/css-auto/style6.modules.css b/test/configCases/css/css-auto/style6.modules.css new file mode 100644 index 00000000000..323ffaed199 --- /dev/null +++ b/test/configCases/css/css-auto/style6.modules.css @@ -0,0 +1,3 @@ +.class { + color: blue; +} diff --git a/test/configCases/css/css-auto/test.config.js b/test/configCases/css/css-auto/test.config.js new file mode 100644 index 00000000000..0590757288f --- /dev/null +++ b/test/configCases/css/css-auto/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "bundle0.css"; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/css-auto/webpack.config.js b/test/configCases/css/css-auto/webpack.config.js new file mode 100644 index 00000000000..a9ddb2d852d --- /dev/null +++ b/test/configCases/css/css-auto/webpack.config.js @@ -0,0 +1,17 @@ +/** @type {import("../../../../types").Configuration} */ +module.exports = { + target: "web", + mode: "development", + experiments: { + css: true + }, + module: { + rules: [ + { + test: /\.less$/, + use: "less-loader", + type: "css/auto" + } + ] + } +}; diff --git a/test/configCases/css/css-modules-broken-keyframes/index.js b/test/configCases/css/css-modules-broken-keyframes/index.js new file mode 100644 index 00000000000..c9d59a1a4ef --- /dev/null +++ b/test/configCases/css/css-modules-broken-keyframes/index.js @@ -0,0 +1,15 @@ +const prod = process.env.NODE_ENV === "production"; + +it("should allow to create css modules", done => { + prod + ? __non_webpack_require__("./340.bundle0.js") + : __non_webpack_require__("./use-style_js.bundle0.js"); + import("./use-style.js").then(({ default: x }) => { + try { + expect(x).toMatchSnapshot(prod ? "prod" : "dev"); + } catch (e) { + return done(e); + } + done(); + }, done); +}); diff --git a/test/configCases/css/css-modules-broken-keyframes/style.module.css b/test/configCases/css/css-modules-broken-keyframes/style.module.css new file mode 100644 index 00000000000..9b20545cc15 --- /dev/null +++ b/test/configCases/css/css-modules-broken-keyframes/style.module.css @@ -0,0 +1,15 @@ +@keyframes broken; + +.class { + color: red; +} + +@keyframes/*test*/animationName/*test*/{ + 0% { + background: white; + } + 100% { + background: red; + } +} + diff --git a/test/configCases/css/css-modules-broken-keyframes/use-style.js b/test/configCases/css/css-modules-broken-keyframes/use-style.js new file mode 100644 index 00000000000..c2929a40c9c --- /dev/null +++ b/test/configCases/css/css-modules-broken-keyframes/use-style.js @@ -0,0 +1,5 @@ +import * as style from "./style.module.css"; + +export default { + class: style.class, +}; diff --git a/test/configCases/css/css-modules-broken-keyframes/webpack.config.js b/test/configCases/css/css-modules-broken-keyframes/webpack.config.js new file mode 100644 index 00000000000..fdd7f26ad01 --- /dev/null +++ b/test/configCases/css/css-modules-broken-keyframes/webpack.config.js @@ -0,0 +1,27 @@ +const webpack = require("../../../../"); +const path = require("path"); + +/** @type {(env: Env, options: TestOptions) => import("../../../../").Configuration} */ +module.exports = (env, { testPath }) => ({ + target: "web", + mode: "production", + output: { + uniqueName: "my-app" + }, + experiments: { + css: true + }, + plugins: [ + new webpack.ids.DeterministicModuleIdsPlugin({ + maxLength: 3, + failOnConflict: true, + fixedLength: true, + test: m => m.type.startsWith("css") + }), + new webpack.experiments.ids.SyncModuleIdsPlugin({ + test: m => m.type.startsWith("css"), + path: path.resolve(testPath, "module-ids.json"), + mode: "create" + }) + ] +}); diff --git a/test/configCases/css/css-modules-in-node/index.js b/test/configCases/css/css-modules-in-node/index.js new file mode 100644 index 00000000000..935999b86c9 --- /dev/null +++ b/test/configCases/css/css-modules-in-node/index.js @@ -0,0 +1,22 @@ +const prod = process.env.NODE_ENV === "production"; + +it("should allow to create css modules", done => { + import("../css-modules/use-style.js").then(({ default: x }) => { + try { + expect(x).toMatchSnapshot(prod ? "prod" : "dev"); + } catch (e) { + return done(e); + } + done(); + }, done); +}); + +import * as style from "../css-modules/style.module.css"; + +it("should allow to import css modules", () => { + expect(style.class).toMatchSnapshot(prod ? "class-prod" : "class-dev"); + expect(style.local1).toMatchSnapshot(prod ? "local1-prod" : "local1-dev"); + expect(style.local2).toMatchSnapshot(prod ? "local2-prod" : "local2-dev"); + expect(style.local3).toMatchSnapshot(prod ? "local3-prod" : "local3-dev"); + expect(style.local4).toMatchSnapshot(prod ? "local4-prod" : "local4-dev"); +}); diff --git a/test/configCases/css/css-modules-in-node/warnings.js b/test/configCases/css/css-modules-in-node/warnings.js new file mode 100644 index 00000000000..6dd56176214 --- /dev/null +++ b/test/configCases/css/css-modules-in-node/warnings.js @@ -0,0 +1,3 @@ +module.exports = require("../css-modules/warnings"); +for (const item of module.exports.slice(0, module.exports.length / 2)) + module.exports.push(item); diff --git a/test/configCases/css/css-modules-in-node/webpack.config.js b/test/configCases/css/css-modules-in-node/webpack.config.js new file mode 100644 index 00000000000..997e2ebb2b9 --- /dev/null +++ b/test/configCases/css/css-modules-in-node/webpack.config.js @@ -0,0 +1,90 @@ +const path = require("path"); +const webpack = require("../../../../"); + +/** @type {(env: Env, options: TestOptions) => import("../../../../").Configuration[]} */ +module.exports = (env, { testPath }) => [ + { + context: path.join(__dirname, "../css-modules"), + entry: "../css-modules-in-node/index.js", + target: "node", + mode: "development", + experiments: { + css: true + }, + module: { + rules: [ + { + test: /\.my-css$/i, + type: "css/auto" + }, + { + test: /\.invalid$/i, + type: "css/auto" + } + ] + } + }, + { + context: path.join(__dirname, "../css-modules"), + entry: "../css-modules-in-node/index.js", + target: "node", + mode: "production", + output: { + uniqueName: "my-app" + }, + experiments: { + css: true + }, + plugins: [ + new webpack.ids.DeterministicModuleIdsPlugin({ + maxLength: 3, + failOnConflict: true, + fixedLength: true, + test: m => m.type.startsWith("css") + }) + ], + module: { + rules: [ + { + test: /\.my-css$/i, + type: "css/auto" + }, + { + test: /\.invalid$/i, + type: "css/auto" + } + ] + } + }, + { + context: path.join(__dirname, "../css-modules"), + entry: "../css-modules-in-node/index.js", + target: "node", + mode: "production", + output: { + uniqueName: "my-app" + }, + experiments: { + css: true + }, + plugins: [ + new webpack.experiments.ids.SyncModuleIdsPlugin({ + test: m => m.type.startsWith("css"), + path: path.resolve(testPath, "../css-modules/module-ids.json"), + mode: "read" + }) + ], + module: { + rules: [ + { + test: /\.my-css$/i, + type: "css/auto" + }, + { + test: /\.invalid$/i, + type: "css/auto" + } + ] + } + } +]; diff --git a/test/configCases/css/css-modules-no-space/index.js b/test/configCases/css/css-modules-no-space/index.js new file mode 100644 index 00000000000..ac04d774fae --- /dev/null +++ b/test/configCases/css/css-modules-no-space/index.js @@ -0,0 +1,23 @@ +const prod = process.env.NODE_ENV === "production"; + +it("should allow to create css modules", done => { + __non_webpack_require__("./use-style_js.bundle0.js"); + import("./use-style.js").then(({ default: x }) => { + try { + expect(x).toMatchSnapshot(); + + const fs = __non_webpack_require__("fs"); + const path = __non_webpack_require__("path"); + const cssOutputFilename = "use-style_js.bundle0.css"; + + const cssContent = fs.readFileSync( + path.join(__dirname, cssOutputFilename), + "utf-8" + ); + expect(cssContent).toMatchSnapshot(); + } catch (e) { + return done(e); + } + done(); + }, done); +}); diff --git a/test/configCases/css/css-modules-no-space/style.module.css b/test/configCases/css/css-modules-no-space/style.module.css new file mode 100644 index 00000000000..f47459a17e3 --- /dev/null +++ b/test/configCases/css/css-modules-no-space/style.module.css @@ -0,0 +1,25 @@ +.no-space { + :global.class { + color: red; + } + + :global/** test **/.class { + color: red; + } + + :local.class { + color: red; + } + + :local/** test **/.class { + color: red; + } + + :local/** test **/#hash { + color: red; + } + + :local/** test **/{ + color: red; + } +} diff --git a/test/configCases/css/css-modules-no-space/use-style.js b/test/configCases/css/css-modules-no-space/use-style.js new file mode 100644 index 00000000000..c2929a40c9c --- /dev/null +++ b/test/configCases/css/css-modules-no-space/use-style.js @@ -0,0 +1,5 @@ +import * as style from "./style.module.css"; + +export default { + class: style.class, +}; diff --git a/test/configCases/css/css-modules-no-space/warnings.js b/test/configCases/css/css-modules-no-space/warnings.js new file mode 100644 index 00000000000..32966cfb211 --- /dev/null +++ b/test/configCases/css/css-modules-no-space/warnings.js @@ -0,0 +1,10 @@ +module.exports = [ + [/Missing whitespace after ':global' in ':global\.class \{/], + [ + /Missing whitespace after ':global' in ':global\/\*\* test \*\*\/\.class \{/ + ], + [/Missing whitespace after ':local' in ':local\.class \{'/], + [/Missing whitespace after ':local' in ':local\/\*\* test \*\*\/\.class \{'/], + [/Missing whitespace after ':local' in ':local\/\*\* test \*\*\/#hash \{'/], + [/Missing whitespace after ':local' in ':local\/\*\* test \*\*\/\{/] +]; diff --git a/test/configCases/css/css-modules-no-space/webpack.config.js b/test/configCases/css/css-modules-no-space/webpack.config.js new file mode 100644 index 00000000000..b8e2164d1ba --- /dev/null +++ b/test/configCases/css/css-modules-no-space/webpack.config.js @@ -0,0 +1,24 @@ +/** @type {(env: Env, options: TestOptions) => import("../../../../").Configuration} */ +module.exports = (env, { testPath }) => ({ + target: "web", + mode: "development", + experiments: { + css: true + }, + module: { + rules: [ + { + test: /\.my-css$/i, + type: "css/auto" + }, + { + test: /\.invalid$/i, + type: "css/auto" + } + ] + }, + node: { + __dirname: false, + __filename: false + } +}); diff --git a/test/configCases/css/css-modules/at-rule-value.module.css b/test/configCases/css/css-modules/at-rule-value.module.css new file mode 100644 index 00000000000..980760c8590 --- /dev/null +++ b/test/configCases/css/css-modules/at-rule-value.module.css @@ -0,0 +1,230 @@ +@value my-red blue; + +.value-in-class { + color: my-red; +} + +@value v-comment-broken:; +@value v-comment-broken-v1:/* comment */; + +@value small: (max-width: 599px); + +@media small { + abbr:hover { + color: limegreen; + transition-duration: 1s; + } +} + +@value blue-v1: red; + +.foo { color: blue-v1; } + +@value blue-v3: red; + +.foo { + &.bar { color: blue-v3; } +} + +@value blue-v3: red; + +.foo { + @media (min-width: 1024px) { + &.bar { color: blue-v3; } + } +} + +@value blue-v4: red; + +.foo { + @media (min-width: 1024px) { + &.bar { + @media (min-width: 1024px) { + color: blue-v4; + } + } + } +} + +@value test-t: 40px; +@value test_q: 36px; + +.foo { height: test-t; height: test_q; } + +@value colorValue: red; + +.colorValue { + color: colorValue; +} + +@value colorValue-v1: red; + +#colorValue-v1 { + color: colorValue-v1; +} + +@value colorValue-v2: red; + +.colorValue-v2 > .colorValue-v2 { + color: colorValue-v2; +} + +@value colorValue-v3: .red; + +colorValue-v3 { + color: colorValue-v3; +} + +@value red-v2 from "./colors.module.css"; + +.export { + color: red-v2; +} + +@value blue-v1 as green from "./colors.module.css"; + +.foo { color: green; } + +@value blue-i, green-v2 from "./colors.module.css"; + +.foo { color: blue-i; } +.bar { color: green-v2 } + +@value red-v3 from colors; +@value colors: "./colors.module.css"; + +.foo { color: red-v3; } + +@value colors: "./colors.module.css"; +@value red-v4 from colors; + +.foo { color: red-v4; } + +@value aaa: red; +@value bbb: aaa; + +.class-a { color: bbb; } + +@value base: 10px; +@value large: calc(base * 2); + +.class-a { margin: large; } + +@value a from "./colors.module.css"; +@value b from "./colors.module.css"; + +.class-a { content: a b; } + +@value --red from "./colors.module.css"; + +.foo { color: --red; } + +@value named: red; +@value _3char #0f0; +@value _6char #00ff00; +@value rgba rgba(34, 12, 64, 0.3); +@value hsla hsla(220, 13.0%, 18.0%, 1); + +.foo { + color: named; + background-color: _3char; + border-top-color: _6char; + border-bottom-color: rgba; + outline-color: hsla; +} + +@value (blue-i, red-i) from "./colors.module.css"; + +.foo { color: red-i; } +.bar { color: blue-i } + +@value coolShadow: 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14) ; + +.foo { box-shadow: coolShadow; } + +@value func: color(red lightness(50%)); + +.foo { color: func; } + +@value v-color: red; + +:root { --color: v-color; } + +@value v-empty: ; + +:root { --color:v-empty; } + +@value v-empty-v2: ; + +:root { --color:v-empty-v2; } + +@value v-empty-v3: /* comment */; + +:root { --color:v-empty-v3; } + +@value override: blue; +@value override: red; + +.override { + color: override; +} + +@value (blue-v1 as my-name) from "./colors.module.css"; +@value (blue-v1 as my-name-again, red-v1) from "./colors.module.css"; + +.class { + color: my-name; + color: my-name-again; + color: red-v1; +} + +@value/* test */blue-v5/* test */:/* test */red/* test */; + +.color { + color: blue-v5; +} + +@value/* test */blue-v6/* test *//* test */red/* test */; + +.color { + color: blue-v6; +} + +@value coolShadow-v2 : 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14) ; + +.foo { box-shadow: coolShadow-v2; } + +@value /* test */ coolShadow-v3 /* test */ : 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14) ; + +.foo { box-shadow: coolShadow-v3; } + +@value /* test */ coolShadow-v4 /* test */ 0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14) ; + +.foo { box-shadow: coolShadow-v4; } + +@value/* test */coolShadow-v5/* test */0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); + +.foo { box-shadow: coolShadow-v5; } + +@value/* test */coolShadow-v6/* test */:0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); + +.foo { box-shadow: coolShadow-v6; } + +@value/* test */coolShadow-v7/* test */:/* test */0 11px 15px -7px rgba(0,0,0,.2),0 24px 38px 3px rgba(0,0,0,.14); + +.foo { box-shadow: coolShadow-v7; } + +@value /* test */ test-v1 /* test */ from /* test */ "./colors.module.css" /* test */; + +.foo { color: test-v1; } + +@value/* test */test-v2/* test */from/* test */"./colors.module.css"/* test */; + +.foo { color: test-v2; } + +@value/* test */(/* test */blue/* test */as/* test */my-name-q/* test */)/* test */from/* test */"./colors.module.css"/* test */; + +.foo { color: my-name-q; } + +@value; +@value test; diff --git a/test/configCases/css/css-modules/colors.module.css b/test/configCases/css/css-modules/colors.module.css new file mode 100644 index 00000000000..8fd97169387 --- /dev/null +++ b/test/configCases/css/css-modules/colors.module.css @@ -0,0 +1,13 @@ +@value red-v1 blue; +@value red-i: blue; +@value blue-v1 red; +@value blue-i: red; +@value a: "test-a"; +@value b: "test-b"; +@value --red: var(--color); +@value test-v1: blue; +@value test-v2: blue; +@value red-v2: blue; +@value green-v2: yellow; +@value red-v3: blue; +@value red-v4: blue; diff --git a/test/configCases/css/css-modules/identifiers.module.css b/test/configCases/css/css-modules/identifiers.module.css new file mode 100644 index 00000000000..100bb05e5e5 --- /dev/null +++ b/test/configCases/css/css-modules/identifiers.module.css @@ -0,0 +1,11 @@ +.UnusedClassName{ + color: red; + padding: var(--variable-unused-class); + --variable-unused-class: 10px; +} + +.UsedClassName { + color: green; + padding: var(--variable-used-class); + --variable-used-class: 10px; +} diff --git a/test/configCases/css/css-modules/index.js b/test/configCases/css/css-modules/index.js new file mode 100644 index 00000000000..a6e608de90a --- /dev/null +++ b/test/configCases/css/css-modules/index.js @@ -0,0 +1,23 @@ +const prod = process.env.NODE_ENV === "production"; + +it("should allow to create css modules", done => { + import("./use-style.js").then(({ default: x }) => { + try { + expect(x).toMatchSnapshot(prod ? "prod" : "dev"); + + const fs = __non_webpack_require__("fs"); + const path = __non_webpack_require__("path"); + const cssOutputFilename = prod ? "142.bundle1.css" : "use-style_js.bundle0.css"; + + const cssContent = fs.readFileSync( + path.join(__dirname, cssOutputFilename), + "utf-8" + ); + expect(cssContent).not.toContain(".my-app--"); + expect(cssContent).toMatchSnapshot(prod ? "prod" : "dev"); + } catch (e) { + return done(e); + } + done(); + }, done); +}); diff --git a/test/configCases/css/css-modules/style.module.css b/test/configCases/css/css-modules/style.module.css new file mode 100644 index 00000000000..cd209e8b698 --- /dev/null +++ b/test/configCases/css/css-modules/style.module.css @@ -0,0 +1,1135 @@ +@import "at-rule-value.module.css"; +@import "var-function.module.css"; + +.class { + color: red; +} + +.local1, +.local2 :global .global, +.local3 { + color: green; +} + +:global .global :local .local4 { + color: yellow; +} + +.local5:global(.global).local6 { + color: blue; +} + +.local7 div:not(.disabled, .mButtonDisabled, .tipOnly) { + pointer-events: initial !important; +} + +.local8 :is(div.parent1.child1.vertical-tiny, + div.parent1.child1.vertical-small, + div.otherDiv.horizontal-tiny, + div.otherDiv.horizontal-small div.description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +.local9 :matches(div.parent1.child1.vertical-tiny, + div.parent1.child1.vertical-small, + div.otherDiv.horizontal-tiny, + div.otherDiv.horizontal-small div.description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +.local10 :where(div.parent1.child1.vertical-tiny, + div.parent1.child1.vertical-small, + div.otherDiv.horizontal-tiny, + div.otherDiv.horizontal-small div.description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +.local11 div:has(.disabled, .mButtonDisabled, .tipOnly) { + pointer-events: initial !important; +} + +.local12 div:current(p, span) { + background-color: yellow; +} + +.local13 div:past(p, span) { + display: none; +} + +.local14 div:future(p, span) { + background-color: yellow; +} + +.local15 div:-moz-any(ol, ul, menu, dir) { + list-style-type: square; +} + +.local16 li:-webkit-any(:first-child, :last-child) { + background-color: aquamarine; +} + +.local9 :matches(div.parent1.child1.vertical-tiny, + div.parent1.child1.vertical-small, + div.otherDiv.horizontal-tiny, + div.otherDiv.horizontal-small div.description) { + max-height: 0; + margin: 0; + overflow: hidden; +} + +:global(:global(:local(.nested1)).nested2).nested3 { + color: pink; +} + +#ident { + color: purple; +} + +@keyframes localkeyframes { + 0% { + left: var(--pos1x); + top: var(--pos1y); + color: var(--theme-color1); + } + 100% { + left: var(--pos2x); + top: var(--pos2y); + color: var(--theme-color2); + } +} + +@keyframes localkeyframes2 { + 0% { + left: 0; + } + 100% { + left: 100px; + } +} + +.animation { + animation-name: localkeyframes; + animation: 3s ease-in 1s 2 reverse both paused localkeyframes, localkeyframes2; + --pos1x: 0px; + --pos1y: 0px; + --pos2x: 10px; + --pos2y: 20px; +} + +/* .composed { + composes: local1; + composes: local2; +} */ + +.vars { + color: var(--local-color); + --local-color: red; +} + +.globalVars :global { + color: var(--global-color); + --global-color: red; +} + +@media (min-width: 1600px) { + .wideScreenClass { + color: var(--local-color); + --local-color: green; + } +} + +@media screen and (max-width: 600px) { + .narrowScreenClass { + color: var(--local-color); + --local-color: purple; + } +} + +@supports (display: grid) { + .displayGridInSupports { + display: grid; + } +} + +@supports not (display: grid) { + .floatRightInNegativeSupports { + float: right; + } +} + +@supports (display: flex) { + @media screen and (min-width: 900px) { + .displayFlexInMediaInSupports { + display: flex; + } + } +} + +@media screen and (min-width: 900px) { + @supports (display: flex) { + .displayFlexInSupportsInMedia { + display: flex; + } + } +} + +@MEDIA screen and (min-width: 900px) { + @SUPPORTS (display: flex) { + .displayFlexInSupportsInMediaUpperCase { + display: flex; + } + } +} + +.animationUpperCase { + ANIMATION-NAME: localkeyframesUPPERCASE; + ANIMATION: 3s ease-in 1s 2 reverse both paused localkeyframesUPPERCASE, localkeyframes2UPPPERCASE; + --pos1x: 0px; + --pos1y: 0px; + --pos2x: 10px; + --pos2y: 20px; +} + +@KEYFRAMES localkeyframesUPPERCASE { + 0% { + left: VAR(--pos1x); + top: VAR(--pos1y); + color: VAR(--theme-color1); + } + 100% { + left: VAR(--pos2x); + top: VAR(--pos2y); + color: VAR(--theme-color2); + } +} + +@KEYframes localkeyframes2UPPPERCASE { + 0% { + left: 0; + } + 100% { + left: 100px; + } +} + +:GLOBAL .globalUpperCase :LOCAL .localUpperCase { + color: yellow; +} + +.VARS { + color: VAR(--LOCAL-COLOR); + --LOCAL-COLOR: red; +} + +.globalVarsUpperCase :GLOBAL { + COLOR: VAR(--GLOBAR-COLOR); + --GLOBAR-COLOR: red; +} + +@supports (top: env(safe-area-inset-top, 0)) { + .inSupportScope { + color: red; + } +} + +.a { + animation: 3s animationName; + -webkit-animation: 3s animationName; +} + +.b { + animation: animationName 3s; + -webkit-animation: animationName 3s; +} + +.c { + animation-name: animationName; + -webkit-animation-name: animationName; +} + +.d { + --animation-name: animationName; +} + +@keyframes animationName { + 0% { + background: white; + } + 100% { + background: red; + } +} + +@-webkit-keyframes animationName { + 0% { + background: white; + } + 100% { + background: red; + } +} + +@-moz-keyframes mozAnimationName { + 0% { + background: white; + } + 100% { + background: red; + } +} + +@counter-style thumbs { + system: cyclic; + symbols: "\1F44D"; + suffix: " "; +} + +@font-feature-values Font One { + @styleset { + nice-style: 12; + } +} + +/* At-rule for "nice-style" in Font Two */ +@font-feature-values Font Two { + @styleset { + nice-style: 4; + } +} + +@property --my-color { + syntax: ""; + inherits: false; + initial-value: #c0ffee; +} + +@property --my-color-1 { + initial-value: #c0ffee; + syntax: ""; + inherits: false; +} + +@property --my-color-2 { + syntax: ""; + initial-value: #c0ffee; + inherits: false; +} + +.class { + color: var(--my-color); +} + +@layer utilities { + .padding-sm { + padding: 0.5rem; + } + + .padding-lg { + padding: 0.8rem; + } +} + +.class { + color: red; + + .nested-pure { + color: red; + } + + @media screen and (min-width: 200px) { + color: blue; + + .nested-media { + color: blue; + } + } + + @supports (display: flex) { + display: flex; + + .nested-supports { + display: flex; + } + } + + @layer foo { + background: red; + + .nested-layer { + background: red; + } + } + + @container foo { + background: red; + + .nested-layer { + background: red; + } + } +} + +.not-selector-inside { + color: #fff; + opacity: 0.12; + padding: .5px; + unknown: :local(.test); + unknown1: :local .test; + unknown2: :global .test; + unknown3: :global .test; + unknown4: .foo, .bar, #bar; +} + +@unknown :local .local :global .global { + color: red; +} + +@unknown :local(.local) :global(.global) { + color: red; +} + +.nested-var { + .again { + color: var(--local-color); + } +} + +.nested-with-local-pseudo { + color: red; + + :local .local-nested { + color: red; + } + + :global .global-nested { + color: red; + } + + :local(.local-nested) { + color: red; + } + + :global(.global-nested) { + color: red; + } + + :local .local-nested, :global .global-nested-next { + color: red; + } + + :local(.local-nested), :global(.global-nested-next) { + color: red; + } + + :global .foo, .bar { + color: red; + } +} + +#id-foo { + color: red; + + #id-bar { + color: red; + } +} + +.nested-parens { + .local9 div:has(.vertical-tiny, .vertical-small) { + max-height: 0; + margin: 0; + overflow: hidden; + } +} + +:global .global-foo { + .nested-global { + color: red; + } + + :local .local-in-global { + color: blue; + } +} + +@unknown .class { + color: red; + + .class { + color: red; + } +} + +:global .class :local .in-local-global-scope, +:global .class :local .in-local-global-scope, +:local .class-local-scope :global .in-local-global-scope { + color: red; +} + +@container (width > 400px) { + .class-in-container { + font-size: 1.5em; + } +} + +@container summary (min-width: 400px) { + @container (width > 400px) { + .deep-class-in-container { + font-size: 1.5em; + } + } +} + +:scope { + color: red; +} + +.placeholder-gray-700:-ms-input-placeholder { + --placeholder-opacity: 1; + color: #4a5568; + color: rgba(74, 85, 104, var(--placeholder-opacity)); +} +.placeholder-gray-700::-ms-input-placeholder { + --placeholder-opacity: 1; + color: #4a5568; + color: rgba(74, 85, 104, var(--placeholder-opacity)); +} +.placeholder-gray-700::placeholder { + --placeholder-opacity: 1; + color: #4a5568; + color: rgba(74, 85, 104, var(--placeholder-opacity)); +} + +:root { + --test: dark; +} + +@media screen and (prefers-color-scheme: var(--test)) { + .baz { + color: white; + } +} + +@keyframes slidein { + from { + margin-left: 100%; + width: 300%; + } + + to { + margin-left: 0%; + width: 100%; + } +} + +.class { + animation: + foo var(--animation-name) 3s, + var(--animation-name) 3s, + 3s linear 1s infinite running slidein, + 3s linear env(foo, var(--baz)) infinite running slidein; +} + +:root { + --baz: 10px; +} + +.class { + bar: env(foo, var(--baz)); +} + +:global .global-foo, :local .bar { + :local .local-in-global { + color: blue; + } + + @media screen { + :global .my-global-class-again, + :local .my-global-class-again { + color: red; + } + } +} + +.first-nested { + .first-nested-nested { + color: red; + } +} + +.first-nested-at-rule { + @media screen { + .first-nested-nested-at-rule-deep { + color: red; + } + } +} + +:global .again-global { + color:red; +} + +:global .again-again-global { + :global .again-again-global { + color: red; + } +} + +:root { + --foo: red; +} + +:global .again-again-global { + color: var(--foo); + + :global .again-again-global { + color: var(--foo); + } +} + +:global .again-again-global { + animation: slidein 3s; + + :global .again-again-global, .class, :global(:global(:local(.nested1)).nested2).nested3 { + animation: slidein 3s; + } + + .local2 :global .global, + .local3 { + color: red; + } +} + +@unknown var(--foo) { + color: red; +} + +.class { + .class { + .class { + .class {} + } + } +} + +.class { + .class { + .class { + .class { + animation: slidein 3s; + } + } + } +} + +.class { + animation: slidein 3s; + .class { + animation: slidein 3s; + .class { + animation: slidein 3s; + .class { + animation: slidein 3s; + } + } + } +} + +.broken { + . global(.class) { + color: red; + } + + : global(.class) { + color: red; + } + + : global .class { + color: red; + } + + : local(.class) { + color: red; + } + + : local .class { + color: red; + } + + # hash { + color: red; + } +} + +.comments { + :/** test */global(.class) { + color: red; + } + + :/** test */global .class { + color: red; + } + + :/** test */local(.class) { + color: red; + } + + :/** test */local .class { + color: red; + } + + ./** test **/class { + color: red; + } + + :local(./** test **/class) { + color: red; + } + + :local ./** test **/class { + color: red; + } +} + +.foo { + color: red; + + .bar + & { color: blue; } +} + +.error, #err-404 { + &:hover > .baz { color: red; } +} + +.foo { + & :is(.bar, &.baz) { color: red; } +} + +.qqq { + color: green; + & .a { color: blue; } + color: red; +} + +.parent { + color: blue; + + @scope (& > .scope) to (& > .limit) { + & .content { + color: red; + } + } +} + +.parent { + color: blue; + + @scope (& > .scope) to (& > .limit) { + .content { + color: red; + } + } + + .a { + color: red; + } +} + +@scope (.card) { + :scope { border-block-end: 1px solid white; } +} + +.card { + inline-size: 40ch; + aspect-ratio: 3/4; + + @scope (&) { + :scope { + border: 1px solid white; + } + } +} + +.foo { + display: grid; + + @media (orientation: landscape) { + .bar { + grid-auto-flow: column; + + @media (min-width > 1024px) { + .baz-1 { + display: grid; + } + + max-inline-size: 1024px; + + .baz-2 { + display: grid; + } + } + } + } +} + +@counter-style thumbs { + system: cyclic; + symbols: "\1F44D"; + suffix: " "; +} + +ul { + list-style: thumbs; +} + +@container (width > 400px) and style(--responsive: true) { + .class { + font-size: 1.5em; + } +} +/* At-rule for "nice-style" in Font One */ +@font-feature-values Font One { + @styleset { + nice-style: 12; + } +} + +@font-palette-values --identifier { + font-family: Bixa; +} + +.my-class { + font-palette: --identifier; +} + +@keyframes foo { /* ... */ } +@keyframes "foo" { /* ... */ } +@keyframes { /* ... */ } +@keyframes{ /* ... */ } + +@supports (display: flex) { + @media screen and (min-width: 900px) { + article { + display: flex; + } + } +} + +@starting-style { + .class { + opacity: 0; + transform: scaleX(0); + } +} + +.class { + opacity: 1; + transform: scaleX(1); + + @starting-style { + opacity: 0; + transform: scaleX(0); + } +} + +@scope (.feature) { + .class { opacity: 0; } + + :scope .class-1 { opacity: 0; } + + & .class { opacity: 0; } +} + +@position-try --custom-left { + position-area: left; + width: 100px; + margin: 0 10px 0 0; +} + +@position-try --custom-bottom { + top: anchor(bottom); + justify-self: anchor-center; + margin: 10px 0 0 0; + position-area: none; +} + +@position-try --custom-right { + left: calc(anchor(right) + 10px); + align-self: anchor-center; + width: 100px; + position-area: none; +} + +@position-try --custom-bottom-right { + position-area: bottom right; + margin: 10px 0 0 10px; +} + +.infobox { + position: fixed; + position-anchor: --myAnchor; + position-area: top; + width: 200px; + margin: 0 0 10px 0; + position-try-fallbacks: + --custom-left, --custom-bottom, + --custom-right, --custom-bottom-right; +} + +@page { + size: 8.5in 9in; + margin-top: 4in; +} + +@color-profile --swop5c { + src: url("https://example.org/SWOP2006_Coated5v2.icc"); +} + +.header { + background-color: color(--swop5c 0% 70% 20% 0%); +} + +.test { + test: (1, 2) [3, 4], { 1: 2}; + .a { + width: 200px; + } +} + +.test { + .test { + width: 200px; + } +} + +.test { + width: 200px; + + .test { + width: 200px; + } +} + +.test { + width: 200px; + + .test { + .test { + width: 200px; + } + } +} + +.test { + width: 200px; + + .test { + width: 200px; + + .test { + width: 200px; + } + } +} + +.test { + .test { + width: 200px; + + .test { + width: 200px; + } + } +} + +.test { + .test { + width: 200px; + } + width: 200px; +} + +.test { + .test { + width: 200px; + } + .test { + width: 200px; + } +} + +.test { + .test { + width: 200px; + } + width: 200px; + .test { + width: 200px; + } +} + +#test { + c: 1; + + #test { + c: 2; + } +} + +@property --item-size { + syntax: ""; + inherits: true; + initial-value: 40%; +} + +.container { + display: flex; + height: 200px; + border: 1px dashed black; + + /* set custom property values on parent */ + --item-size: 20%; + --item-color: orange; +} + +.item { + width: var(--item-size); + height: var(--item-size); + background-color: var(--item-color); +} + +.two { + --item-size: initial; + --item-color: inherit; +} + +.three { + /* invalid values */ + --item-size: 1000px; + --item-color: xyz; +} + +@property invalid { + syntax: ""; + inherits: true; + initial-value: 40%; +} +@property{ + syntax: ""; + inherits: true; + initial-value: 40%; +} +@property { + syntax: ""; + inherits: true; + initial-value: 40%; +} + +@keyframes "initial" { /* ... */ } +@keyframes/**test**/"initial" { /* ... */ } +@keyframes/**test**/"initial"/**test**/{ /* ... */ } +@keyframes/**test**//**test**/"initial"/**test**//**test**/{ /* ... */ } +@keyframes /**test**/ /**test**/ "initial" /**test**/ /**test**/ { /* ... */ } +@keyframes "None" { /* ... */ } +@property/**test**/--item-size { + syntax: ""; + inherits: true; + initial-value: 40%; +} +@property/**test**/--item-size/**test**/{ + syntax: ""; + inherits: true; + initial-value: 40%; +} +@property /**test**/--item-size/**test**/ { + syntax: ""; + inherits: true; + initial-value: 40%; +} +@property /**test**/ --item-size /**test**/ { + syntax: ""; + inherits: true; + initial-value: 40%; +} +@property/**test**/ --item-size /**test**/{ + syntax: ""; + inherits: true; + initial-value: 40%; +} +@property /**test**/ --item-size /**test**/ { + syntax: ""; + inherits: true; + initial-value: 40%; +} +div { + animation: 3s ease-in 1s 2 reverse both paused "initial", localkeyframes2; + animation-name: "initial"; + animation-duration: 2s; +} + +.item-1 { + width: var( --item-size ); + height: var(/**comment**/--item-size); + background-color: var( /**comment**/--item-color); + background-color-1: var(/**comment**/ --item-color); + background-color-2: var( /**comment**/ --item-color); + background-color-3: var( /**comment**/ --item-color /**comment**/ ); + background-color-3: var( /**comment**/--item-color/**comment**/ ); + background-color-3: var(/**comment**/--item-color/**comment**/); +} + +@keyframes/**test**/foo { /* ... */ } +@keyframes /**test**/foo { /* ... */ } +@keyframes/**test**/ foo { /* ... */ } +@keyframes /**test**/ foo { /* ... */ } +@keyframes /**test**//**test**/ foo { /* ... */ } +@keyframes /**test**/ /**test**/ foo { /* ... */ } +@keyframes /**test**/ /**test**/foo { /* ... */ } +@keyframes /**test**//**test**/foo { /* ... */ } +@keyframes/**test**//**test**/foo { /* ... */ } +@keyframes/**test**//**test**/foo/**test**//**test**/{ /* ... */ } +@keyframes /**test**/ /**test**/ foo /**test**/ /**test**/ { /* ... */ } + +./**test**//**test**/class { + background: red; +} + +./**test**/ /**test**/class { + background: red; +} + +.var { + --main-color: black; + --FOO: 10px; + --foo: 10px; + --bar: calc(var(--foo) + 10px); + --accent-background: linear-gradient(to top, var(--main-color), white); + --external-link: "test"; + --custom-prop: yellow; + --default-value: red; + --main-bg-color: red; + --backup-bg-color: black; + -foo: calc(var(--bar) + 10px); + var: var(--main-color); + var1: var(--foo); + var2: var(--FOO); + content: " (" var(--external-link) ")"; + var3: var(--main-color, blue); + var4: var(--custom-prop,); + var5: var(--custom-prop, initial); + var6: var(--custom-prop, var(--default-value)); + var7: var(--custom-prop, var(--default-value, red)); + var8: var(--unknown); + background-color: var(--main-bg-color, var(--backup-bg-color, white)); +} + +.var-order { + background-color: var(--test); + --test: red; +} + diff --git a/test/configCases/css/css-modules/style.module.css.invalid b/test/configCases/css/css-modules/style.module.css.invalid new file mode 100644 index 00000000000..953e362ee15 --- /dev/null +++ b/test/configCases/css/css-modules/style.module.css.invalid @@ -0,0 +1,3 @@ +.class { + color: teal; +} diff --git a/test/configCases/css/css-modules/style.module.my-css b/test/configCases/css/css-modules/style.module.my-css new file mode 100644 index 00000000000..4f4f0b7f873 --- /dev/null +++ b/test/configCases/css/css-modules/style.module.my-css @@ -0,0 +1,3 @@ +.myCssClass { + color: red; +} diff --git a/test/configCases/css/css-modules/test.config.js b/test/configCases/css/css-modules/test.config.js new file mode 100644 index 00000000000..f8d4d18b3fe --- /dev/null +++ b/test/configCases/css/css-modules/test.config.js @@ -0,0 +1,7 @@ +module.exports = { + findBundle(i, options) { + return i === 0 + ? ["./use-style_js.bundle0.js", "./bundle0.js"] + : ["./142.bundle1.js", "./bundle1.js"]; + } +}; diff --git a/test/configCases/css/css-modules/use-style.js b/test/configCases/css/css-modules/use-style.js new file mode 100644 index 00000000000..ca46177588f --- /dev/null +++ b/test/configCases/css/css-modules/use-style.js @@ -0,0 +1,55 @@ +import * as style from "./style.module.css"; +import { local1, local2, local3, local4, ident } from "./style.module.css"; +import { myCssClass } from "./style.module.my-css"; +import * as notACssModule from "./style.module.css.invalid"; +import { UsedClassName } from "./identifiers.module.css"; + +// To prevent analysis export +const isNotACSSModule = typeof notACssModule["c" + "lass"] === "undefined"; +const hasOwnProperty = (obj, p) => Object.hasOwnProperty.call(obj, p); + +export default { + global: style.global, + class: style.class, + local: `${local1} ${local2} ${local3} ${local4}`, + local2: `${style.local5} ${style.local6}`, + nested: `${style.nested1} ${style.nested2} ${style.nested3}`, + notWmultiParams: `${style.local7}`, + isWmultiParams: `${style.local8}`, + matchesWmultiParams: `${style.local9}`, + whereWmultiParams: `${style.local10}`, + hasWmultiParams: `${style.local11}`, + currentWmultiParams: `${style.local12}`, + pastWmultiParams: `${style.local13}`, + futureWmultiParams: `${style.local14}`, + mozAnyWmultiParams: `${style.local15}`, + webkitAnyWmultiParams: `${style.local16}`, + ident, + keyframes: style.localkeyframes, + keyframesUPPERCASE: style.localkeyframesUPPERCASE, + localkeyframes2UPPPERCASE: style.localkeyframes2UPPPERCASE, + animation: style.animation, + vars: `${style["local-color"]} ${style.vars} ${style["global-color"]} ${style.globalVars}`, + media: style.wideScreenClass, + mediaWithOperator: style.narrowScreenClass, + supports: style.displayGridInSupports, + supportsWithOperator: style.floatRightInNegativeSupports, + mediaInSupports: style.displayFlexInMediaInSupports, + supportsInMedia: style.displayFlexInSupportsInMedia, + displayFlexInSupportsInMediaUpperCase: style.displayFlexInSupportsInMediaUpperCase, + VARS: `${style["LOCAL-COLOR"]} ${style.VARS} ${style["GLOBAL-COLOR"]} ${style.globalVarsUpperCase}`, + inSupportScope: style.inSupportScope, + animationName: style.animationName, + mozAnimationName: style.mozAnimationName, + myColor: style['my-color'], + paddingSm: style['padding-sm'], + paddingLg: style['padding-lg'], + inLocalGlobalScope: style['in-local-global-scope'], + classLocalScope: style['class-local-scope'], + classInContainer: style['class-in-container'], + deepClassInContainer: style['deep-class-in-container'], + cssModuleWithCustomFileExtension: myCssClass, + notAValidCssModuleExtension: isNotACSSModule, + UsedClassName, + exportLocalVarsShouldCleanup: `${hasOwnProperty(notACssModule, 'local-color')} ${hasOwnProperty(notACssModule, "LOCAL-COLOR")}` +}; diff --git a/test/configCases/css/css-modules/var-function-export.modules.css b/test/configCases/css/css-modules/var-function-export.modules.css new file mode 100644 index 00000000000..d71e43091bb --- /dev/null +++ b/test/configCases/css/css-modules/var-function-export.modules.css @@ -0,0 +1,12 @@ +:root { + --my-var-u1: red; + --my-var-u2: blue; + --not-override-class: black; + --1: red; + ----a: red; + --main-bg-color: red; +} + +.my-var-u1 { + color: red; +} diff --git a/test/configCases/css/css-modules/var-function.module.css b/test/configCases/css/css-modules/var-function.module.css new file mode 100644 index 00000000000..664c991254d --- /dev/null +++ b/test/configCases/css/css-modules/var-function.module.css @@ -0,0 +1,139 @@ +:root { + --main-bg-color: brown; + --my-var: red; + --my-background: blue; + --my-global: yellow; + --: "reserved"; + --a: green; +} + +.class { + color: var(--main-bg-color); +} + +@property --logo-color { + syntax: ""; + inherits: false; + initial-value: #c0ffee; +} + +@property -- { + syntax: ""; + inherits: false; + initial-value: #c0ffee; +} + +.class { + color: var(--logo-color); +} + +div { + background-color: var(--box-color); +} + +.two { + --box-color: cornflowerblue; +} + +.three { + --box-color: aquamarine; +} + + +.one { + /* Red if --my-var is not defined */ + color: var(--my-var, red); +} + +.two { + /* pink if --my-var and --my-background are not defined */ + color: var(--my-var, var(--my-background, pink)); +} + +.reserved { + color: var(--); +} + +.green { + color: var(--a); +} + +.global { + color: var(--my-global from global); +} + +.global-and-default { + color: var(--my-global from global, pink); +} + +.global-and-default-1 { + color: var(--my-global from global, var(--my-global-background from global)); +} + +.global-and-default-2 { + color: var(--my-global from global, var(--my-global-background from global, pink)); +} + +.global-and-default-3 { + color: var(--my-global from global, var(--my-background, pink)); +} + +.global-and-default-5 { + color: var( --my-global from global,var(--my-background,pink)); +} + +.global-and-default-6 { + background: var( --main-bg-color , var( --my-background , pink ) ) , var(--my-global from global); +} + +.global-and-default-7 { + background: var(--main-bg-color,var(--my-background,pink)),var(--my-global from global); +} + +.from { + color: var(--my-var-u1 from "./var-function-export.modules.css"); +} + +.from-1 { + color: var(--main-bg-color, var(--my-var-u1 from "./var-function-export.modules.css")); +} + +.from-2 { + color: var(--my-var-u1 from "./var-function-export.modules.css", var(--main-bg-color)); +} + +.from-3 { + color: var(--my-var-u1 from "./var-function-export.modules.css", var(--my-var-u2 from "./var-function-export.modules.css")); +} + +.from-4 { + color: var(--1 from "./var-function-export.modules.css"); +} + +.from-5 { + color: var(----a from "./var-function-export.modules.css"); +} + +.from-6 { + color: var(--main-bg-color from "./var-function-export.modules.css"); +} + +.mixed { + color: var(--my-var-u1 from "./var-function-export.modules.css", var(--my-global from global, var(--main-bg-color, red))); +} + +.broken { + color: var(--my-global from); +} + +.broken-1 { + color: var(--my-global from 1); +} + +:root { + --not-override-class: red; +} + +.not-override-class { + color: var(--not-override-class from "./var-function-export.modules.css") +} diff --git a/test/configCases/css/css-modules/warnings.js b/test/configCases/css/css-modules/warnings.js new file mode 100644 index 00000000000..be7a71b2f00 --- /dev/null +++ b/test/configCases/css/css-modules/warnings.js @@ -0,0 +1,12 @@ +module.exports = [ + [/export 'global' \(imported as 'style'\) was not found/], + [/export 'nested2' \(imported as 'style'\) was not found/], + [/export 'global-color' \(imported as 'style'\) was not found/], + [/export 'GLOBAL-COLOR' \(imported as 'style'\) was not found/], + [/Broken '@value' at-rule: @value;'/], + [/export 'global' \(imported as 'style'\) was not found/], + [/export 'nested2' \(imported as 'style'\) was not found/], + [/export 'global-color' \(imported as 'style'\) was not found/], + [/export 'GLOBAL-COLOR' \(imported as 'style'\) was not found/], + [/Broken '@value' at-rule: @value;'/] +]; diff --git a/test/configCases/css/css-modules/webpack.config.js b/test/configCases/css/css-modules/webpack.config.js new file mode 100644 index 00000000000..03231e71559 --- /dev/null +++ b/test/configCases/css/css-modules/webpack.config.js @@ -0,0 +1,68 @@ +const webpack = require("../../../../"); +const path = require("path"); + +/** @type {(env: Env, options: TestOptions) => import("../../../../").Configuration[]} */ +module.exports = (env, { testPath }) => [ + { + target: "web", + mode: "development", + experiments: { + css: true + }, + module: { + rules: [ + { + test: /\.my-css$/i, + type: "css/auto" + }, + { + test: /\.invalid$/i, + type: "css/auto" + } + ] + }, + node: { + __dirname: false, + __filename: false + } + }, + { + target: "web", + mode: "production", + output: { + uniqueName: "my-app" + }, + experiments: { + css: true + }, + module: { + rules: [ + { + test: /\.my-css$/i, + type: "css/auto" + }, + { + test: /\.invalid$/i, + type: "css/auto" + } + ] + }, + node: { + __dirname: false, + __filename: false + }, + plugins: [ + new webpack.ids.DeterministicModuleIdsPlugin({ + maxLength: 3, + failOnConflict: true, + fixedLength: true, + test: m => m.type.startsWith("css") + }), + new webpack.experiments.ids.SyncModuleIdsPlugin({ + test: m => m.type.startsWith("css"), + path: path.resolve(testPath, "module-ids.json"), + mode: "create" + }) + ] + } +]; diff --git a/test/configCases/css/css-types/index.js b/test/configCases/css/css-types/index.js new file mode 100644 index 00000000000..355b9df452a --- /dev/null +++ b/test/configCases/css/css-types/index.js @@ -0,0 +1,46 @@ +import './style.css'; +import * as style1 from './style1.local.css' +import * as style2 from './style2.global.css' +import './style3.auto.css'; +import * as style3 from './style4.modules.css' + +it("should not parse css modules in type: css", () => { + const style = getComputedStyle(document.body); + expect(style.getPropertyValue("color")).toBe(" red"); + const links = document.getElementsByTagName("link"); + const css = links[1].sheet.css; + + expect(css).toMatch(/\:local\(\.foo\)/); + expect(css).toMatch(/\:global\(\.bar\)/); +}); + +it("should compile type: css/module", () => { + const element = document.createElement(".class2"); + const style = getComputedStyle(element); + expect(style.getPropertyValue("background")).toBe(" green"); + expect(style1.class1).toBe('_style1_local_css-class1'); +}); + +it("should compile type: css/global", (done) => { + const element = document.createElement(".class3"); + const style = getComputedStyle(element); + expect(style.getPropertyValue("color")).toBe(" red"); + expect(style2.class4).toBe('_style2_global_css-class4'); + done() +}); + +it("should not parse css modules in type: css/auto", () => { + const style = getComputedStyle(document.body); + expect(style.getPropertyValue("background")).toBe(" red"); + const links = document.getElementsByTagName("link"); + const css = links[1].sheet.css; + expect(css).toMatch(/\:local\(\.baz\)/); + expect(css).toMatch(/\:global\(\.qux\)/); +}); + +it("should parse css modules in type: css/auto", () => { + const element = document.createElement(".class3"); + const style = getComputedStyle(element); + expect(style.getPropertyValue("color")).toBe(" red"); + expect(style3.class3).toBe('_style4_modules_css-class3'); +}); diff --git a/test/configCases/css/css-types/style.css b/test/configCases/css/css-types/style.css new file mode 100644 index 00000000000..6aa7ac92519 --- /dev/null +++ b/test/configCases/css/css-types/style.css @@ -0,0 +1,11 @@ +body { + color: red; +} + +:local(.foo) { + color: red; +} + +:global(.bar) { + color: green; +} \ No newline at end of file diff --git a/test/configCases/css/css-types/style1.local.css b/test/configCases/css/css-types/style1.local.css new file mode 100644 index 00000000000..6f5c6417134 --- /dev/null +++ b/test/configCases/css/css-types/style1.local.css @@ -0,0 +1,6 @@ +.class1 { + color: red; +} +:global(.class2) { + background: green; +} \ No newline at end of file diff --git a/test/configCases/css/css-types/style2.global.css b/test/configCases/css/css-types/style2.global.css new file mode 100644 index 00000000000..6f2aceffff5 --- /dev/null +++ b/test/configCases/css/css-types/style2.global.css @@ -0,0 +1,6 @@ +.class3 { + color: red; +} +:local(.class4) { + background: green; +} \ No newline at end of file diff --git a/test/configCases/css/css-types/style3.auto.css b/test/configCases/css/css-types/style3.auto.css new file mode 100644 index 00000000000..44b4ea515d8 --- /dev/null +++ b/test/configCases/css/css-types/style3.auto.css @@ -0,0 +1,11 @@ +body { + background: red; +} + +:local(.baz) { + color: red; +} + +:global(.qux) { + color: green; +} diff --git a/test/configCases/css/css-types/style4.modules.css b/test/configCases/css/css-types/style4.modules.css new file mode 100644 index 00000000000..b245d11b660 --- /dev/null +++ b/test/configCases/css/css-types/style4.modules.css @@ -0,0 +1,6 @@ +.class3 { + color: red; +} +:global(.class4) { + background: green; +} diff --git a/test/configCases/css/css-types/test.config.js b/test/configCases/css/css-types/test.config.js new file mode 100644 index 00000000000..0590757288f --- /dev/null +++ b/test/configCases/css/css-types/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "bundle0.css"; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/css-types/webpack.config.js b/test/configCases/css/css-types/webpack.config.js new file mode 100644 index 00000000000..12ea75460e6 --- /dev/null +++ b/test/configCases/css/css-types/webpack.config.js @@ -0,0 +1,32 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + module: { + rules: [ + { + test: /\.css$/i, + type: "css" + }, + { + test: /\.local\.css$/i, + type: "css/module" + }, + { + test: /\.global\.css$/i, + type: "css/global" + }, + { + test: /\.auto\.css$/i, + type: "css/auto" + }, + { + test: /\.modules\.css$/i, + type: "css/auto" + } + ] + }, + experiments: { + css: true + } +}; diff --git a/test/configCases/css/default-exports-parser-options/index.js b/test/configCases/css/default-exports-parser-options/index.js new file mode 100644 index 00000000000..a9afb95b3a0 --- /dev/null +++ b/test/configCases/css/default-exports-parser-options/index.js @@ -0,0 +1,19 @@ +import * as style1 from "./style.module.css?namespace"; +import style2 from "./style.module.css?default"; +import { foo } from "./style.module.css?named"; + +it("should able to import with default and named exports", () => { + expect(style1.default).toEqual(nsObj({ foo: '_style_module_css_namespace-foo' })); + expect(style1.foo).toEqual("_style_module_css_namespace-foo"); + expect(style2).toEqual(nsObj({ foo: '_style_module_css_default-foo' })); + expect(foo).toEqual("_style_module_css_named-foo"); +}); + +it("should able to import with different default and namex dynamic export", (done) => { + import("./style.module.css?namespace").then((style1) => { + expect(style1.default).toEqual(nsObj({ foo: '_style_module_css_namespace-foo' })); + expect(style1.foo).toEqual('_style_module_css_namespace-foo'); + + done(); + }, done) +}); diff --git a/test/configCases/css/default-exports-parser-options/style.module.css b/test/configCases/css/default-exports-parser-options/style.module.css new file mode 100644 index 00000000000..cedf0a6d1f1 --- /dev/null +++ b/test/configCases/css/default-exports-parser-options/style.module.css @@ -0,0 +1,3 @@ +.foo { + color: red; +} diff --git a/test/configCases/css/default-exports-parser-options/webpack.config.js b/test/configCases/css/default-exports-parser-options/webpack.config.js new file mode 100644 index 00000000000..b7d7852b059 --- /dev/null +++ b/test/configCases/css/default-exports-parser-options/webpack.config.js @@ -0,0 +1,20 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "node", + mode: "development", + devtool: false, + module: { + rules: [ + { + test: /\.css/, + parser: { + namedExports: false + }, + type: "css/module" + } + ] + }, + experiments: { + css: true + } +}; diff --git a/test/configCases/css/escape-unescape/index.js b/test/configCases/css/escape-unescape/index.js new file mode 100644 index 00000000000..e415950fa1a --- /dev/null +++ b/test/configCases/css/escape-unescape/index.js @@ -0,0 +1,15 @@ +import * as styles from "./style.modules.css"; + +it(`should work with URLs in CSS`, done => { + const links = document.getElementsByTagName("link"); + const css = []; + + // Skip first because import it by default + for (const link of links.slice(1)) { + css.push(link.sheet.css); + } + + expect(css).toMatchSnapshot('css'); + expect(styles).toMatchSnapshot('classes'); + done(); +}); diff --git a/test/configCases/css/escape-unescape/style.modules.css b/test/configCases/css/escape-unescape/style.modules.css new file mode 100644 index 00000000000..1417ffcb0eb --- /dev/null +++ b/test/configCases/css/escape-unescape/style.modules.css @@ -0,0 +1,134 @@ +.class { + color: red; +} + +.cla\ss { + background: blue; +} + +.test { + background: red; +} + +._test { + background: blue; +} + +.className { + background: red; +} + +#someId { + background: green; +} + +.className .subClass { + color: green; +} + +#someId .subClass { + color: blue; +} + +.-a0-34a___f { + color: red; +} + +.m_x_\@ { + margin-left: auto !important; + margin-right: auto !important; +} + +.B\&W\? { + margin-left: auto !important; + margin-right: auto !important; +} + +/* matches elements with class=":`(" */ +.\3A \`\( { + color: aqua; +} + +/* matches elements with class="1a2b3c" */ +.\31 a2b3c { + color: aliceblue; +} + +/* matches the element with id="#fake-id" */ +#\#fake-id { + color: antiquewhite; +} + +/* matches the element with id="-a-b-c-" */ +#-a-b-c- { + color: azure; +} + +/* matches the element with id="©" */ +#© { + color: black; +} + +.♥ { background: lime; } +.© { background: lime; } +.😍 { background: lime; } +.“‘’” { background: lime; } +.☺☃ { background: lime; } +.⌘⌥ { background: lime; } +.𝄞♪♩♫♬ { background: lime; } +.💩 { background: lime; } +.\? { background: lime; } +.\@ { background: lime; } +.\. { background: lime; } +.\3A \) { background: lime; } +.\3A \`\( { background: lime; } +.\31 23 { background: lime; } +.\31 a2b3c { background: lime; } +.\ { background: lime; } +.\<\>\<\<\<\>\>\<\> { background: lime; } +.\+\+\+\+\+\+\+\+\+\+\[\>\+\+\+\+\+\+\+\>\+\+\+\+\+\+\+\+\+\+\>\+\+\+\>\+\<\<\<\<\-\]\>\+\+\.\>\+\.\+\+\+\+\+\+\+\.\.\+\+\+\.\>\+\+\.\<\<\+\+\+\+\+\+\+\+\+\+\+\+\+\+\+\.\>\.\+\+\+\.\-\-\-\-\-\-\.\-\-\-\-\-\-\-\-\.\>\+\.\>\. { background: lime; } +.\# { background: lime; } +.\#\# { background: lime; } +.\#\.\#\.\# { background: lime; } +.\_ { background: lime; } +.\{\} { background: lime; } +.\#fake\-id { background: lime; } +.foo\.bar { background: lime; } +.\3A hover { background: lime; } +.\3A hover\3A focus\3A active { background: lime; } +.\[attr\=value\] { background: lime; } +.f\/o\/o { background: lime; } +.f\\o\\o { background: lime; } +.f\*o\*o { background: lime; } +.f\!o\!o { background: lime; } +.f\'o\'o { background: lime; } +.f\~o\~o { background: lime; } +.f\+o\+o { background: lime; } + +.foo\/bar { + background: hotpink; +} + +.foo\\bar { + background: hotpink; +} + +.foo\/bar\/baz { + background: hotpink; +} + +.foo\\bar\\baz { + background: hotpink; +} + +:root { + --main-bg-color: red; + --main-bg-color-\@2: blue; +} + +details { + background-color: var(--main-bg-color); + background-color: var(--main-bg-color-\@2); +} + +@keyframes f\@oo { from { color: red; } to { color: blue; } } diff --git a/test/configCases/css/escape-unescape/test.config.js b/test/configCases/css/escape-unescape/test.config.js new file mode 100644 index 00000000000..523bd009639 --- /dev/null +++ b/test/configCases/css/escape-unescape/test.config.js @@ -0,0 +1,11 @@ +module.exports = { + findBundle(i, options) { + return ["bundle0.js"]; + }, + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "bundle0.css"; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/escape-unescape/webpack.config.js b/test/configCases/css/escape-unescape/webpack.config.js new file mode 100644 index 00000000000..fb903c5cfa6 --- /dev/null +++ b/test/configCases/css/escape-unescape/webpack.config.js @@ -0,0 +1,17 @@ +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + target: "web", + mode: "development", + experiments: { + css: true + } + }, + { + target: "web", + mode: "production", + experiments: { + css: true + } + } +]; diff --git a/test/configCases/css/exports-convention/index.js b/test/configCases/css/exports-convention/index.js new file mode 100644 index 00000000000..57d97c6ecb1 --- /dev/null +++ b/test/configCases/css/exports-convention/index.js @@ -0,0 +1,50 @@ +import * as styles1 from "./style.module.css?camel-case#1"; +import * as styles2 from "./style.module.css?camel-case#2"; + +const prod = process.env.NODE_ENV === "production"; +const target = process.env.TARGET; + +it("concatenation and mangling should work", () => { + expect(styles1.class).toBe(prod ? "_204-zg" : "_style_module_css_camel-case_1-class"); + expect(styles1["default"]).toBe(prod ? "_204-Ay" : "_style_module_css_camel-case_1-default"); + expect(styles1.fooBar).toBe(prod ? "_204-F0" : "_style_module_css_camel-case_1-foo_bar"); + expect(styles1.foo_bar).toBe(prod ? "_204-F0" :"_style_module_css_camel-case_1-foo_bar"); + + if (prod) { + expect(styles2).toMatchObject({ + "btn--info_is-disabled_1": "_215-btn--info_is-disabled_1", + "btn-info_is-disabled": "_215-btn-info_is-disabled", + "btnInfoIsDisabled": "_215-btn-info_is-disabled", + "btnInfoIsDisabled1": "_215-btn--info_is-disabled_1", + "class": "_215-class", + "default": "_215-default", + "foo": "bar", + "fooBar": "_215-foo_bar", + "foo_bar": "_215-foo_bar", + "my-btn-info_is-disabled": "value", + "myBtnInfoIsDisabled": "value", + "simple": "_215-simple", + }); + + expect(Object.keys(__webpack_modules__).length).toBe(target === "web" ? 7 : 1) + } +}); + +it("should have correct convention for css exports name", (done) => { + Promise.all([ + import("./style.module.css?as-is"), + import("./style.module.css?camel-case"), + import("./style.module.css?camel-case-only"), + import("./style.module.css?dashes"), + import("./style.module.css?dashes-only"), + import("./style.module.css?upper"), + ]).then(([asIs, camelCase, camelCaseOnly, dashes, dashesOnly, upper]) => { + expect(asIs).toMatchSnapshot('as-is'); + expect(camelCase).toMatchSnapshot('camel-case'); + expect(camelCaseOnly).toMatchSnapshot('camel-case-only'); + expect(dashes).toMatchSnapshot('dashes'); + expect(dashesOnly).toMatchSnapshot('dashes-only'); + expect(upper).toMatchSnapshot('upper'); + done() + }).catch(done) +}); diff --git a/test/configCases/css/exports-convention/style.module.css b/test/configCases/css/exports-convention/style.module.css new file mode 100644 index 00000000000..702f167df1e --- /dev/null +++ b/test/configCases/css/exports-convention/style.module.css @@ -0,0 +1,32 @@ +.btn-info_is-disabled { + color: blue; +} + +.btn--info_is-disabled_1 { + color: blue; +} + +.simple { + color: red; +} + +a { + color: yellow; +} + +:export { + foo: bar; + my-btn-info_is-disabled: value; +} + +.foo_bar { + color: red; +} + +.class { + color: green; +} + +.default { + color: blue; +} diff --git a/test/configCases/css/exports-convention/test.config.js b/test/configCases/css/exports-convention/test.config.js new file mode 100644 index 00000000000..1fcdcbd62d5 --- /dev/null +++ b/test/configCases/css/exports-convention/test.config.js @@ -0,0 +1,13 @@ +module.exports = { + findBundle(i, options) { + return [ + `style_module_css_as-is.bundle${i}.js`, + `style_module_css_camel-case.bundle${i}.js`, + `style_module_css_camel-case-only.bundle${i}.js`, + `style_module_css_dashes.bundle${i}.js`, + `style_module_css_dashes-only.bundle${i}.js`, + `style_module_css_upper.bundle${i}.js`, + `bundle${i}.js` + ]; + } +}; diff --git a/test/configCases/css/exports-convention/webpack.config.js b/test/configCases/css/exports-convention/webpack.config.js new file mode 100644 index 00000000000..b05d64aa4ea --- /dev/null +++ b/test/configCases/css/exports-convention/webpack.config.js @@ -0,0 +1,103 @@ +const webpack = require("../../../../"); + +/** @typedef {import("../../../../").GeneratorOptionsByModuleTypeKnown} GeneratorOptionsByModuleTypeKnown */ + +const common = { + optimization: { + chunkIds: "named" + }, + module: { + rules: [ + { + test: /\.module\.css$/, + type: "css/module", + oneOf: [ + { + resourceQuery: /\?as-is$/, + generator: { + exportsConvention: "as-is" + } + }, + { + resourceQuery: /\?camel-case$/, + generator: { + exportsConvention: "camel-case" + } + }, + { + resourceQuery: /\?camel-case-only$/, + generator: { + exportsConvention: "camel-case-only" + } + }, + { + resourceQuery: /\?dashes$/, + generator: { + exportsConvention: "dashes" + } + }, + { + resourceQuery: /\?dashes-only$/, + generator: { + exportsConvention: "dashes-only" + } + }, + { + resourceQuery: /\?upper$/, + /** @type {GeneratorOptionsByModuleTypeKnown["css/module"]} */ + generator: { + exportsConvention: name => name.toUpperCase() + } + } + ] + } + ] + }, + experiments: { + css: true + } +}; + +/** @type {import("../../../../").Configuration} */ +module.exports = [ + { + ...common, + mode: "development", + target: "web", + plugins: [ + new webpack.DefinePlugin({ + "process.env.TARGET": JSON.stringify("web") + }) + ] + }, + { + ...common, + mode: "production", + target: "web", + plugins: [ + new webpack.DefinePlugin({ + "process.env.TARGET": JSON.stringify("web") + }) + ] + }, + { + ...common, + mode: "development", + target: "node", + plugins: [ + new webpack.DefinePlugin({ + "process.env.TARGET": JSON.stringify("node") + }) + ] + }, + { + ...common, + mode: "production", + target: "node", + plugins: [ + new webpack.DefinePlugin({ + "process.env.TARGET": JSON.stringify("node") + }) + ] + } +]; diff --git a/test/configCases/css/exports-in-node/index.js b/test/configCases/css/exports-in-node/index.js new file mode 100644 index 00000000000..5ea47f3f189 --- /dev/null +++ b/test/configCases/css/exports-in-node/index.js @@ -0,0 +1,74 @@ +import * as style from "../pseudo-export/style.module.css?ns"; +import { a, abc } from "../pseudo-export/style.module.css?picked"; +import def from "../pseudo-export/style.module.css?default"; + +it("should allow to import a css module", () => { + expect(style).toEqual( + nsObj({ + a: "a", + abc: "a b c", + comments: "abc/****/ /* hello world *//****/ def", + whitespace: "abc\n\tdef", + default: "default" + }) + ); + expect(a).toBe("a"); + expect(abc).toBe("a b c"); + expect(def).toBe("default"); +}); + +it("should allow to dynamic import a css module", done => { + import("../pseudo-export/style.module.css").then(x => { + try { + expect(x).toEqual( + nsObj({ + a: "a", + abc: "a b c", + comments: "abc/****/ /* hello world *//****/ def", + whitespace: "abc\n\tdef", + default: "default" + }) + ); + } catch (e) { + return done(e); + } + done(); + }, done); +}); + +it("should allow to reexport a css module", done => { + import("../pseudo-export/reexported").then(x => { + try { + expect(x).toEqual( + nsObj({ + a: "a", + abc: "a b c", + comments: "abc/****/ /* hello world *//****/ def", + whitespace: "abc\n\tdef", + }) + ); + } catch (e) { + return done(e); + } + done(); + }, done); +}); + +it("should allow to import a css module", done => { + import("../pseudo-export/imported").then(({ default: x }) => { + try { + expect(x).toEqual( + nsObj({ + a: "a", + abc: "a b c", + comments: "abc/****/ /* hello world *//****/ def", + whitespace: "abc\n\tdef", + default: "default" + }) + ); + } catch (e) { + return done(e); + } + done(); + }, done); +}); diff --git a/test/configCases/css/exports-in-node/webpack.config.js b/test/configCases/css/exports-in-node/webpack.config.js new file mode 100644 index 00000000000..a91e72d278a --- /dev/null +++ b/test/configCases/css/exports-in-node/webpack.config.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "node", + mode: "development", + experiments: { + css: true + } +}; diff --git a/test/configCases/css/exports-only-generator-options/index.js b/test/configCases/css/exports-only-generator-options/index.js new file mode 100644 index 00000000000..f0835d411ee --- /dev/null +++ b/test/configCases/css/exports-only-generator-options/index.js @@ -0,0 +1,26 @@ +it("should not have .css file", (done) => { + __non_webpack_require__("./pseudo-export_style_module_css.bundle0.js"); + __non_webpack_require__("./pseudo-export_style_module_css_exportsOnly.bundle0.js"); + Promise.all([ + import("../pseudo-export/style.module.css"), + import("../pseudo-export/style.module.css?module"), + import("../pseudo-export/style.module.css?exportsOnly"), + ]).then(([style1, style2, style3]) => { + const ns = nsObj({ + a: "a", + abc: "a b c", + comments: "abc/****/ /* hello world *//****/ def", + whitespace: "abc\n\tdef", + default: "default" + }); + expect(style1).toEqual(ns); + expect(style2).toEqual(ns); + expect(style3).toEqual(ns); + }).then(() => { + const fs = __non_webpack_require__("fs"); + const path = __non_webpack_require__("path"); + expect(fs.existsSync(path.resolve(__dirname, "pseudo-export_style_module_css.bundle0.css"))).toBe(false); + expect(fs.existsSync(path.resolve(__dirname, "pseudo-export_style_module_css_exportsOnly.bundle0.css"))).toBe(false); + done() + }).catch(e => done(e)) +}); diff --git a/test/configCases/css/exports-only-generator-options/test.config.js b/test/configCases/css/exports-only-generator-options/test.config.js new file mode 100644 index 00000000000..ee33a038662 --- /dev/null +++ b/test/configCases/css/exports-only-generator-options/test.config.js @@ -0,0 +1,10 @@ +module.exports = { + findBundle(i, options) { + return [ + "pseudo-export_style_module_css.bundle0.js", + "pseudo-export_style_module_css_module.bundle0.js", + "pseudo-export_style_module_css_exportsOnly.bundle0.js", + "bundle0.js" + ]; + } +}; diff --git a/test/configCases/css/exports-only-generator-options/webpack.config.js b/test/configCases/css/exports-only-generator-options/webpack.config.js new file mode 100644 index 00000000000..c2f9beae76e --- /dev/null +++ b/test/configCases/css/exports-only-generator-options/webpack.config.js @@ -0,0 +1,36 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = [ + { + target: "web", + mode: "development", + module: { + generator: { + css: { + exportsOnly: true + }, + "css/module": { + exportsOnly: false + } + }, + rules: [ + { + resourceQuery: /\?module/, + type: "css/module" + }, + { + resourceQuery: /\?exportsOnly/, + generator: { + exportsOnly: true + }, + type: "css/global" + } + ] + }, + experiments: { + css: true + }, + node: { + __dirname: false + } + } +]; diff --git a/test/configCases/css/external-in-node/index.js b/test/configCases/css/external-in-node/index.js new file mode 100644 index 00000000000..827a002ff5a --- /dev/null +++ b/test/configCases/css/external-in-node/index.js @@ -0,0 +1,6 @@ +it("should import an external css", done => { + import("../external/style.css").then(x => { + expect(x).toEqual({}); + done(); + }, done); +}); diff --git a/test/configCases/css/external-in-node/webpack.config.js b/test/configCases/css/external-in-node/webpack.config.js new file mode 100644 index 00000000000..87766dc8dae --- /dev/null +++ b/test/configCases/css/external-in-node/webpack.config.js @@ -0,0 +1,11 @@ +const path = require("path"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + context: path.join(__dirname, "../external"), + entry: "../external-in-node/index.js", + target: "node", + experiments: { + css: true + } +}; diff --git a/test/configCases/css/external/external.css b/test/configCases/css/external/external.css new file mode 100644 index 00000000000..f815695493b --- /dev/null +++ b/test/configCases/css/external/external.css @@ -0,0 +1,3 @@ +body { + color: green; +} diff --git a/test/configCases/css/external/index.js b/test/configCases/css/external/index.js new file mode 100644 index 00000000000..ec3b1155ed6 --- /dev/null +++ b/test/configCases/css/external/index.js @@ -0,0 +1,14 @@ +it("should import an external css", done => { + import("./style.css").then(x => { + expect(x).toEqual({}); + const style = getComputedStyle(document.body); + expect(style.getPropertyValue("color")).toBe(" green"); + expect(style.getPropertyValue("background")).toBe( + " url(//example.com/image.png) url(https://example.com/image.png)" + ); + expect(style.getPropertyValue("background-image")).toBe( + " url(http://example.com/image.png)" + ); + done(); + }, done); +}); diff --git a/test/configCases/css/external/style.css b/test/configCases/css/external/style.css new file mode 100644 index 00000000000..a186274dce1 --- /dev/null +++ b/test/configCases/css/external/style.css @@ -0,0 +1,2 @@ +@import "style2.css"; +@import "https://test.cases/path/../../../../configCases/css/external/external.css"; diff --git a/test/configCases/css/external/style2.css b/test/configCases/css/external/style2.css new file mode 100644 index 00000000000..326ac4a1831 --- /dev/null +++ b/test/configCases/css/external/style2.css @@ -0,0 +1,4 @@ +body { + background: url(//example.com/image.png) url(https://example.com/image.png); + background-image: url(http://example.com/image.png); +} diff --git a/test/configCases/css/external/test.config.js b/test/configCases/css/external/test.config.js new file mode 100644 index 00000000000..f543ee110ce --- /dev/null +++ b/test/configCases/css/external/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["125.bundle0.js", "bundle0.js"]; + } +}; diff --git a/test/configCases/css/external/webpack.config.js b/test/configCases/css/external/webpack.config.js new file mode 100644 index 00000000000..72bc3e86f47 --- /dev/null +++ b/test/configCases/css/external/webpack.config.js @@ -0,0 +1,7 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + experiments: { + css: true + } +}; diff --git a/test/configCases/css/import-at-middle/a.css b/test/configCases/css/import-at-middle/a.css new file mode 100644 index 00000000000..f0d5b13bffd --- /dev/null +++ b/test/configCases/css/import-at-middle/a.css @@ -0,0 +1,3 @@ +body { + background: red; +} diff --git a/test/configCases/css/import-at-middle/b.css b/test/configCases/css/import-at-middle/b.css new file mode 100644 index 00000000000..575be7ba729 --- /dev/null +++ b/test/configCases/css/import-at-middle/b.css @@ -0,0 +1,10 @@ +body { + background: blue; +} + +@import "./a.css"; +@import url(./a.css); + +body { + color: green; +} diff --git a/test/configCases/css/import-at-middle/c.css b/test/configCases/css/import-at-middle/c.css new file mode 100644 index 00000000000..8fc0fb15442 --- /dev/null +++ b/test/configCases/css/import-at-middle/c.css @@ -0,0 +1,9 @@ +body { + background: red; +} +@import "./a.css"; +@import "./b.css"; + +body { + color: yellow; +} diff --git a/test/configCases/css/import-at-middle/index.js b/test/configCases/css/import-at-middle/index.js new file mode 100644 index 00000000000..9b54f968864 --- /dev/null +++ b/test/configCases/css/import-at-middle/index.js @@ -0,0 +1,9 @@ +import "./style.css"; + +it("should compile with warnings", done => { + const style = getComputedStyle(document.body); + expect(style.getPropertyValue("background")).toBe(" blue"); + expect(style.getPropertyValue("color")).toBe(" green"); + + done(); +}); diff --git a/test/configCases/css/import-at-middle/style.css b/test/configCases/css/import-at-middle/style.css new file mode 100644 index 00000000000..1d835e13228 --- /dev/null +++ b/test/configCases/css/import-at-middle/style.css @@ -0,0 +1,2 @@ +@import "./c.css"; +@import "./b.css"; diff --git a/test/configCases/css/import-at-middle/test.config.js b/test/configCases/css/import-at-middle/test.config.js new file mode 100644 index 00000000000..0590757288f --- /dev/null +++ b/test/configCases/css/import-at-middle/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "bundle0.css"; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/import-at-middle/warnings.js b/test/configCases/css/import-at-middle/warnings.js new file mode 100644 index 00000000000..dff5dce2b35 --- /dev/null +++ b/test/configCases/css/import-at-middle/warnings.js @@ -0,0 +1,6 @@ +module.exports = [ + /Any '@import' rules must precede all other rules/, + /Any '@import' rules must precede all other rules/, + /Any '@import' rules must precede all other rules/, + /Any '@import' rules must precede all other rules/ +]; diff --git a/test/configCases/css/import-at-middle/webpack.config.js b/test/configCases/css/import-at-middle/webpack.config.js new file mode 100644 index 00000000000..cfb8e5c0346 --- /dev/null +++ b/test/configCases/css/import-at-middle/webpack.config.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + experiments: { + css: true + } +}; diff --git a/test/configCases/css/import-different-case/index.js b/test/configCases/css/import-different-case/index.js new file mode 100644 index 00000000000..f2d6eae5a97 --- /dev/null +++ b/test/configCases/css/import-different-case/index.js @@ -0,0 +1,8 @@ +import * as style from "./style.css"; + +it("should compile and load style on demand", () => { + expect(style).toEqual({}); + const computedStyle = getComputedStyle(document.body); + expect(computedStyle.getPropertyValue("background")).toBe(" red"); + expect(computedStyle.getPropertyValue("margin")).toBe(" 10px"); +}); diff --git a/test/configCases/css/import-different-case/style-imported.css b/test/configCases/css/import-different-case/style-imported.css new file mode 100644 index 00000000000..eb0ae451455 --- /dev/null +++ b/test/configCases/css/import-different-case/style-imported.css @@ -0,0 +1,3 @@ +body { + margin: 10px; +} diff --git a/test/configCases/css/import-different-case/style.css b/test/configCases/css/import-different-case/style.css new file mode 100644 index 00000000000..602ea2d5aa8 --- /dev/null +++ b/test/configCases/css/import-different-case/style.css @@ -0,0 +1,4 @@ +@IMPORT "style-imported.css"; +body { + background: red; +} diff --git a/test/configCases/css/import-different-case/test.config.js b/test/configCases/css/import-different-case/test.config.js new file mode 100644 index 00000000000..0590757288f --- /dev/null +++ b/test/configCases/css/import-different-case/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "bundle0.css"; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/import-different-case/webpack.config.js b/test/configCases/css/import-different-case/webpack.config.js new file mode 100644 index 00000000000..cfb8e5c0346 --- /dev/null +++ b/test/configCases/css/import-different-case/webpack.config.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + experiments: { + css: true + } +}; diff --git a/test/configCases/css/import-module/a-pitching-loader.js b/test/configCases/css/import-module/a-pitching-loader.js new file mode 100644 index 00000000000..eb9ad595ce8 --- /dev/null +++ b/test/configCases/css/import-module/a-pitching-loader.js @@ -0,0 +1,9 @@ +/** @type {import("../../../../").PitchLoaderDefinitionFunction} */ +exports.pitch = async function (remaining) { + const result = await this.importModule( + this.resourcePath + '.webpack[javascript/auto]' + '!=!' + remaining, { + publicPath: '' + }); + + return result.default || result; +}; diff --git a/test/configCases/css/import-module/colors.js b/test/configCases/css/import-module/colors.js new file mode 100644 index 00000000000..91f7b0d0db4 --- /dev/null +++ b/test/configCases/css/import-module/colors.js @@ -0,0 +1,2 @@ +export const red = '#f00'; +export const green = '#0f0'; \ No newline at end of file diff --git a/test/configCases/css/import-module/index.js b/test/configCases/css/import-module/index.js new file mode 100644 index 00000000000..ba908562a78 --- /dev/null +++ b/test/configCases/css/import-module/index.js @@ -0,0 +1,6 @@ +import stylesheet from './stylesheet.js'; + +it("should compile", () => { + expect(stylesheet).toBe("body { background: #f00; color: #0f0; }"); +}); + diff --git a/test/configCases/css/import-module/stylesheet.js b/test/configCases/css/import-module/stylesheet.js new file mode 100644 index 00000000000..a2400fa41d9 --- /dev/null +++ b/test/configCases/css/import-module/stylesheet.js @@ -0,0 +1,3 @@ +import { green, red } from './colors.js'; + +export default `body { background: ${red}; color: ${green}; }`; diff --git a/test/configCases/css/import-module/webpack.config.js b/test/configCases/css/import-module/webpack.config.js new file mode 100644 index 00000000000..06bb9ba027a --- /dev/null +++ b/test/configCases/css/import-module/webpack.config.js @@ -0,0 +1,19 @@ +const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [new webpack.HotModuleReplacementPlugin()], + target: "web", + mode: "development", + module: { + rules: [ + { + test: /stylesheet\.js$/i, + use: ["./a-pitching-loader.js"], + type: "asset/source" + } + ] + }, + experiments: { + css: true + } +}; diff --git a/test/configCases/css/import/all-deep-deep-nested.css b/test/configCases/css/import/all-deep-deep-nested.css new file mode 100644 index 00000000000..2b3fb00069f --- /dev/null +++ b/test/configCases/css/import/all-deep-deep-nested.css @@ -0,0 +1,3 @@ +.class { + deep-deep-nested: 1; +} diff --git a/test/configCases/css/import/all-deep-nested.css b/test/configCases/css/import/all-deep-nested.css new file mode 100644 index 00000000000..78ed2513899 --- /dev/null +++ b/test/configCases/css/import/all-deep-nested.css @@ -0,0 +1,5 @@ +@import "./all-deep-deep-nested.css" layer(baz) supports(display: table) screen and (min-width: 600px); + +.class { + deep-nested: 1; +} diff --git a/test/configCases/css/import/all-nested.css b/test/configCases/css/import/all-nested.css new file mode 100644 index 00000000000..1bfcebf48ac --- /dev/null +++ b/test/configCases/css/import/all-nested.css @@ -0,0 +1,5 @@ +@import "./all-deep-nested.css" layer(bar) supports(display: grid) screen and (min-width: 500px); + +.class { + nested: 1; +} diff --git a/test/configCases/css/import/anonymous-deep-deep-nested.css b/test/configCases/css/import/anonymous-deep-deep-nested.css new file mode 100644 index 00000000000..2b3fb00069f --- /dev/null +++ b/test/configCases/css/import/anonymous-deep-deep-nested.css @@ -0,0 +1,3 @@ +.class { + deep-deep-nested: 1; +} diff --git a/test/configCases/css/import/anonymous-deep-nested.css b/test/configCases/css/import/anonymous-deep-nested.css new file mode 100644 index 00000000000..f22d30e30b4 --- /dev/null +++ b/test/configCases/css/import/anonymous-deep-nested.css @@ -0,0 +1,5 @@ +@import "./anonymous-deep-deep-nested.css" layer; + +.class { + deep-nested: 1; +} diff --git a/test/configCases/css/import/anonymous-nested.css b/test/configCases/css/import/anonymous-nested.css new file mode 100644 index 00000000000..9187d233eea --- /dev/null +++ b/test/configCases/css/import/anonymous-nested.css @@ -0,0 +1,6 @@ +@import "./anonymous-deep-nested.css" layer; +@import "./layer-deep-nested.css" layer(base); + +.class { + deep-nested: 1; +} diff --git a/test/configCases/css/import/circular-nested.css b/test/configCases/css/import/circular-nested.css new file mode 100644 index 00000000000..98442fa7931 --- /dev/null +++ b/test/configCases/css/import/circular-nested.css @@ -0,0 +1,5 @@ +@import url(circular.css); + +.circular-nested { + color: red; +} diff --git a/test/configCases/css/import/circular.css b/test/configCases/css/import/circular.css new file mode 100644 index 00000000000..caea838fc46 --- /dev/null +++ b/test/configCases/css/import/circular.css @@ -0,0 +1,8 @@ +@import url(circular.css); +@import url(circular.css); +@import url(circular-nested.css); +@import url("./style2.css"); + +.circular { + color: red; +} diff --git a/test/configCases/css/import/dark.css b/test/configCases/css/import/dark.css new file mode 100644 index 00000000000..7e53924e2ed --- /dev/null +++ b/test/configCases/css/import/dark.css @@ -0,0 +1,3 @@ +a { + color: white; +} diff --git a/test/configCases/css/import/directory/index.css b/test/configCases/css/import/directory/index.css new file mode 100644 index 00000000000..dfd5bb45b24 --- /dev/null +++ b/test/configCases/css/import/directory/index.css @@ -0,0 +1,3 @@ +.directory-css { + color: red; +} \ No newline at end of file diff --git a/test/configCases/css/import/duplicate-nested.css b/test/configCases/css/import/duplicate-nested.css new file mode 100644 index 00000000000..94e620d7427 --- /dev/null +++ b/test/configCases/css/import/duplicate-nested.css @@ -0,0 +1,6 @@ +@import url("./style8.css") supports(display: flex); +@import url("./style8.css") supports(display: flex); + +.class { + duplicate-nested: true; +} diff --git a/test/configCases/css/import/errors.js b/test/configCases/css/import/errors.js new file mode 100644 index 00000000000..290655b24f3 --- /dev/null +++ b/test/configCases/css/import/errors.js @@ -0,0 +1,6 @@ +module.exports = [ + /Can't resolve 'non-exported-css'/, + /Can't resolve '\.\/directory'/, + /Can't resolve 'condition-names-subpath\/non-valid\.css'/, + /Can't resolve '\.\/no-extension-in-request'/ +]; diff --git a/test/configCases/css/import/extensions-imported.mycss b/test/configCases/css/import/extensions-imported.mycss new file mode 100644 index 00000000000..d70a689d7e7 --- /dev/null +++ b/test/configCases/css/import/extensions-imported.mycss @@ -0,0 +1,3 @@ +.custom-extension{ + color: green; +} \ No newline at end of file diff --git a/test/configCases/css/import/external.css b/test/configCases/css/import/external.css new file mode 100644 index 00000000000..2da62ee0768 --- /dev/null +++ b/test/configCases/css/import/external.css @@ -0,0 +1,3 @@ +body { + externally-imported: true; +} diff --git a/test/configCases/css/import/external1.css b/test/configCases/css/import/external1.css new file mode 100644 index 00000000000..f334e79ce27 --- /dev/null +++ b/test/configCases/css/import/external1.css @@ -0,0 +1,3 @@ +body { + externally-imported1: true; +} diff --git a/test/configCases/css/import/external2.css b/test/configCases/css/import/external2.css new file mode 100644 index 00000000000..8a7481f3e91 --- /dev/null +++ b/test/configCases/css/import/external2.css @@ -0,0 +1,3 @@ +body { + externally-imported2: true; +} diff --git a/test/configCases/css/import/file.less b/test/configCases/css/import/file.less new file mode 100644 index 00000000000..a5eb48d6d65 --- /dev/null +++ b/test/configCases/css/import/file.less @@ -0,0 +1,5 @@ +@link-color: #428bca; + +.link { + color: @link-color; +} diff --git a/test/configCases/css/import/img.png b/test/configCases/css/import/img.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/import/img.png differ diff --git a/test/configCases/css/import/imported.css b/test/configCases/css/import/imported.css new file mode 100644 index 00000000000..828bff206d5 --- /dev/null +++ b/test/configCases/css/import/imported.css @@ -0,0 +1,3 @@ +body { + background: green; +} diff --git a/test/configCases/css/import/index.js b/test/configCases/css/import/index.js new file mode 100644 index 00000000000..3b26850a1e7 --- /dev/null +++ b/test/configCases/css/import/index.js @@ -0,0 +1,14 @@ +import "./style.css"; + +it("should compile", done => { + const links = document.getElementsByTagName("link"); + const css = []; + + // Skip first because import it by default + for (const link of links.slice(1)) { + css.push(link.sheet.css); + } + + expect(css).toMatchSnapshot(); + done(); +}); diff --git a/test/configCases/css/import/layer-deep-deep-nested.css b/test/configCases/css/import/layer-deep-deep-nested.css new file mode 100644 index 00000000000..2b3fb00069f --- /dev/null +++ b/test/configCases/css/import/layer-deep-deep-nested.css @@ -0,0 +1,3 @@ +.class { + deep-deep-nested: 1; +} diff --git a/test/configCases/css/import/layer-deep-nested.css b/test/configCases/css/import/layer-deep-nested.css new file mode 100644 index 00000000000..ad882bcd450 --- /dev/null +++ b/test/configCases/css/import/layer-deep-nested.css @@ -0,0 +1,5 @@ +@import "./layer-deep-deep-nested.css" layer(baz); + +.class { + deep-nested: 1; +} diff --git a/test/configCases/css/import/layer-nested.css b/test/configCases/css/import/layer-nested.css new file mode 100644 index 00000000000..476020101a6 --- /dev/null +++ b/test/configCases/css/import/layer-nested.css @@ -0,0 +1,5 @@ +@import "./layer-deep-nested.css" layer(bar); + +.class { + nested: 1; +} diff --git a/test/configCases/css/import/layer.css b/test/configCases/css/import/layer.css new file mode 100644 index 00000000000..317776dde97 --- /dev/null +++ b/test/configCases/css/import/layer.css @@ -0,0 +1,3 @@ +.class { + content: "layer.css"; +} diff --git a/test/configCases/css/import/list-of-media-queries.css b/test/configCases/css/import/list-of-media-queries.css new file mode 100644 index 00000000000..4410be1e4db --- /dev/null +++ b/test/configCases/css/import/list-of-media-queries.css @@ -0,0 +1,5 @@ +@import "./dark.css" (prefers-color-scheme: dark); + +a { + color: black; +} diff --git a/test/configCases/css/import/media-deep-deep-nested.css b/test/configCases/css/import/media-deep-deep-nested.css new file mode 100644 index 00000000000..2b3fb00069f --- /dev/null +++ b/test/configCases/css/import/media-deep-deep-nested.css @@ -0,0 +1,3 @@ +.class { + deep-deep-nested: 1; +} diff --git a/test/configCases/css/import/media-deep-nested.css b/test/configCases/css/import/media-deep-nested.css new file mode 100644 index 00000000000..b49af1e9239 --- /dev/null +++ b/test/configCases/css/import/media-deep-nested.css @@ -0,0 +1,5 @@ +@import "./media-deep-deep-nested.css" screen and (orientation: portrait); + +.class { + deep-nested: 1; +} diff --git a/test/configCases/css/import/media-nested.css b/test/configCases/css/import/media-nested.css new file mode 100644 index 00000000000..74f9e969f2c --- /dev/null +++ b/test/configCases/css/import/media-nested.css @@ -0,0 +1,5 @@ +@import "./media-deep-nested.css" screen and (max-width: 500px); + +.class { + nested: 1; +} diff --git a/test/configCases/css/import/mixed-deep-deep-nested.css b/test/configCases/css/import/mixed-deep-deep-nested.css new file mode 100644 index 00000000000..2b3fb00069f --- /dev/null +++ b/test/configCases/css/import/mixed-deep-deep-nested.css @@ -0,0 +1,3 @@ +.class { + deep-deep-nested: 1; +} diff --git a/test/configCases/css/import/mixed-deep-nested.css b/test/configCases/css/import/mixed-deep-nested.css new file mode 100644 index 00000000000..f646d9558db --- /dev/null +++ b/test/configCases/css/import/mixed-deep-nested.css @@ -0,0 +1,5 @@ +@import "./mixed-deep-deep-nested.css" layer(bar); + +.class { + deep-nested: 1; +} diff --git a/test/configCases/css/import/mixed-nested.css b/test/configCases/css/import/mixed-nested.css new file mode 100644 index 00000000000..af6552df728 --- /dev/null +++ b/test/configCases/css/import/mixed-nested.css @@ -0,0 +1,5 @@ +@import "./mixed-deep-nested.css" supports(display: flex); + +.class { + nested: 1; +} diff --git a/test/configCases/css/import/no-extension-in-request.css b/test/configCases/css/import/no-extension-in-request.css new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/css/import/node_modules/condition-names-custom-name/custom-name.css b/test/configCases/css/import/node_modules/condition-names-custom-name/custom-name.css new file mode 100644 index 00000000000..438223bb105 --- /dev/null +++ b/test/configCases/css/import/node_modules/condition-names-custom-name/custom-name.css @@ -0,0 +1,3 @@ +.custom-name { + color: steelblue; +} diff --git a/test/configCases/css/import/node_modules/condition-names-custom-name/default.css b/test/configCases/css/import/node_modules/condition-names-custom-name/default.css new file mode 100644 index 00000000000..03ea02130bf --- /dev/null +++ b/test/configCases/css/import/node_modules/condition-names-custom-name/default.css @@ -0,0 +1,3 @@ +.default { + color: steelblue; +} diff --git a/test/configCases/css/import/node_modules/condition-names-custom-name/package.json b/test/configCases/css/import/node_modules/condition-names-custom-name/package.json new file mode 100644 index 00000000000..72986fb14da --- /dev/null +++ b/test/configCases/css/import/node_modules/condition-names-custom-name/package.json @@ -0,0 +1,9 @@ +{ + "name": "condition-names-custom-name", + "exports": { + ".": { + "custom-name": "./custom-name.css", + "default": "./default.css" + } + } +} diff --git a/test/configCases/css/import/node_modules/condition-names-style-less/default.less b/test/configCases/css/import/node_modules/condition-names-style-less/default.less new file mode 100644 index 00000000000..37deb87d851 --- /dev/null +++ b/test/configCases/css/import/node_modules/condition-names-style-less/default.less @@ -0,0 +1,5 @@ +@link-color: #428bca; + +.conditional-names { + color: @link-color; +} diff --git a/test/configCases/css/import/node_modules/condition-names-style-less/package.json b/test/configCases/css/import/node_modules/condition-names-style-less/package.json new file mode 100644 index 00000000000..3eb7a0ae36c --- /dev/null +++ b/test/configCases/css/import/node_modules/condition-names-style-less/package.json @@ -0,0 +1,8 @@ +{ + "name": "condition-names-style-less", + "exports": { + ".": { + "default": "./default.less" + } + } +} diff --git a/test/configCases/css/import/node_modules/condition-names-style-mode/default.css b/test/configCases/css/import/node_modules/condition-names-style-mode/default.css new file mode 100644 index 00000000000..03ea02130bf --- /dev/null +++ b/test/configCases/css/import/node_modules/condition-names-style-mode/default.css @@ -0,0 +1,3 @@ +.default { + color: steelblue; +} diff --git a/test/configCases/css/import/node_modules/condition-names-style-mode/mode.css b/test/configCases/css/import/node_modules/condition-names-style-mode/mode.css new file mode 100644 index 00000000000..300f0091cfc --- /dev/null +++ b/test/configCases/css/import/node_modules/condition-names-style-mode/mode.css @@ -0,0 +1,3 @@ +.mode { + color: red; +} diff --git a/test/configCases/css/import/node_modules/condition-names-style-mode/package.json b/test/configCases/css/import/node_modules/condition-names-style-mode/package.json new file mode 100644 index 00000000000..55ade3385c8 --- /dev/null +++ b/test/configCases/css/import/node_modules/condition-names-style-mode/package.json @@ -0,0 +1,10 @@ +{ + "name": "condition-names-style-development", + "exports": { + ".": { + "production": "./mode.css", + "development": "./mode.css", + "default": "./default.css" + } + } +} diff --git a/test/configCases/css/import/node_modules/condition-names-style-nested/default.css b/test/configCases/css/import/node_modules/condition-names-style-nested/default.css new file mode 100644 index 00000000000..03ea02130bf --- /dev/null +++ b/test/configCases/css/import/node_modules/condition-names-style-nested/default.css @@ -0,0 +1,3 @@ +.default { + color: steelblue; +} diff --git a/test/configCases/css/import/node_modules/condition-names-style-nested/package.json b/test/configCases/css/import/node_modules/condition-names-style-nested/package.json new file mode 100644 index 00000000000..1181e52d22d --- /dev/null +++ b/test/configCases/css/import/node_modules/condition-names-style-nested/package.json @@ -0,0 +1,8 @@ +{ + "name": "condition-names-style-nested", + "exports": { + "style": { + "default": "./default.css" + } + } +} diff --git a/test/configCases/css/import/node_modules/condition-names-style/default.css b/test/configCases/css/import/node_modules/condition-names-style/default.css new file mode 100644 index 00000000000..03ea02130bf --- /dev/null +++ b/test/configCases/css/import/node_modules/condition-names-style/default.css @@ -0,0 +1,3 @@ +.default { + color: steelblue; +} diff --git a/test/configCases/css/import/node_modules/condition-names-style/package.json b/test/configCases/css/import/node_modules/condition-names-style/package.json new file mode 100644 index 00000000000..b397e56043d --- /dev/null +++ b/test/configCases/css/import/node_modules/condition-names-style/package.json @@ -0,0 +1,9 @@ +{ + "name": "condition-names-style", + "exports": { + ".": { + "style": "./default.css", + "default": "./unknown.css" + } + } +} diff --git a/test/configCases/css/import/node_modules/condition-names-subpath-extra/custom.js b/test/configCases/css/import/node_modules/condition-names-subpath-extra/custom.js new file mode 100644 index 00000000000..b77c717214b --- /dev/null +++ b/test/configCases/css/import/node_modules/condition-names-subpath-extra/custom.js @@ -0,0 +1 @@ +export default "should not be used"; diff --git a/test/configCases/css/import/node_modules/condition-names-subpath-extra/dist/custom.css b/test/configCases/css/import/node_modules/condition-names-subpath-extra/dist/custom.css new file mode 100644 index 00000000000..7920c3d9f42 --- /dev/null +++ b/test/configCases/css/import/node_modules/condition-names-subpath-extra/dist/custom.css @@ -0,0 +1,3 @@ +.dist { + color: steelblue; +} diff --git a/test/configCases/css/import/node_modules/condition-names-subpath-extra/package.json b/test/configCases/css/import/node_modules/condition-names-subpath-extra/package.json new file mode 100644 index 00000000000..795cf640f88 --- /dev/null +++ b/test/configCases/css/import/node_modules/condition-names-subpath-extra/package.json @@ -0,0 +1,6 @@ +{ + "name": "condition-names-subpath-extra", + "exports": { + "./custom.css":"./dist/custom.css" + } +} diff --git a/test/configCases/css/import/node_modules/condition-names-subpath/custom.js b/test/configCases/css/import/node_modules/condition-names-subpath/custom.js new file mode 100644 index 00000000000..b77c717214b --- /dev/null +++ b/test/configCases/css/import/node_modules/condition-names-subpath/custom.js @@ -0,0 +1 @@ +export default "should not be used"; diff --git a/test/configCases/css/import/node_modules/condition-names-subpath/dist/custom.css b/test/configCases/css/import/node_modules/condition-names-subpath/dist/custom.css new file mode 100644 index 00000000000..7920c3d9f42 --- /dev/null +++ b/test/configCases/css/import/node_modules/condition-names-subpath/dist/custom.css @@ -0,0 +1,3 @@ +.dist { + color: steelblue; +} diff --git a/test/configCases/css/import/node_modules/condition-names-subpath/package.json b/test/configCases/css/import/node_modules/condition-names-subpath/package.json new file mode 100644 index 00000000000..8c94521a959 --- /dev/null +++ b/test/configCases/css/import/node_modules/condition-names-subpath/package.json @@ -0,0 +1,11 @@ +{ + "name": "condition-names-subpath", + "exports": { + "./custom.css": { + "default": "./dist/custom.css" + }, + "./non-valid.css": { + "default": "./dist/custom.js" + } + } +} diff --git a/test/configCases/css/import/node_modules/condition-names-webpack-js/package.json b/test/configCases/css/import/node_modules/condition-names-webpack-js/package.json new file mode 100644 index 00000000000..21c3e50d229 --- /dev/null +++ b/test/configCases/css/import/node_modules/condition-names-webpack-js/package.json @@ -0,0 +1,9 @@ +{ + "name": "condition-names-webpack", + "exports": { + ".": { + "webpack": "./webpack.js", + "default": "./unknown.js" + } + } +} diff --git a/test/configCases/css/import/node_modules/condition-names-webpack-js/webpack.js b/test/configCases/css/import/node_modules/condition-names-webpack-js/webpack.js new file mode 100644 index 00000000000..bc0fdf485a6 --- /dev/null +++ b/test/configCases/css/import/node_modules/condition-names-webpack-js/webpack.js @@ -0,0 +1 @@ +export default "webpack"; diff --git a/test/configCases/css/import/node_modules/condition-names-webpack/package.json b/test/configCases/css/import/node_modules/condition-names-webpack/package.json new file mode 100644 index 00000000000..471a210fa9b --- /dev/null +++ b/test/configCases/css/import/node_modules/condition-names-webpack/package.json @@ -0,0 +1,9 @@ +{ + "name": "condition-names-webpack", + "exports": { + ".": { + "webpack": "./webpack.css", + "default": "./unknown.css" + } + } +} diff --git a/test/configCases/css/import/node_modules/condition-names-webpack/webpack.css b/test/configCases/css/import/node_modules/condition-names-webpack/webpack.css new file mode 100644 index 00000000000..44867d273a4 --- /dev/null +++ b/test/configCases/css/import/node_modules/condition-names-webpack/webpack.css @@ -0,0 +1,3 @@ +.webpack { + color: steelblue; +} diff --git a/test/configCases/css/import/node_modules/js-import/index.js b/test/configCases/css/import/node_modules/js-import/index.js new file mode 100644 index 00000000000..0b2a8ed66e2 --- /dev/null +++ b/test/configCases/css/import/node_modules/js-import/index.js @@ -0,0 +1,3 @@ +function someCode() { + console.log('some code'); +} \ No newline at end of file diff --git a/test/configCases/css/import/node_modules/js-import/package.json b/test/configCases/css/import/node_modules/js-import/package.json new file mode 100644 index 00000000000..1f4546b29f3 --- /dev/null +++ b/test/configCases/css/import/node_modules/js-import/package.json @@ -0,0 +1,3 @@ +{ + "main": "index.js" +} \ No newline at end of file diff --git a/test/configCases/css/import/node_modules/main-field/package.json b/test/configCases/css/import/node_modules/main-field/package.json new file mode 100644 index 00000000000..51c982d306f --- /dev/null +++ b/test/configCases/css/import/node_modules/main-field/package.json @@ -0,0 +1,3 @@ +{ + "main": "styles.css" +} \ No newline at end of file diff --git a/test/configCases/css/import/node_modules/main-field/styles.css b/test/configCases/css/import/node_modules/main-field/styles.css new file mode 100644 index 00000000000..7ccc4470fc5 --- /dev/null +++ b/test/configCases/css/import/node_modules/main-field/styles.css @@ -0,0 +1,3 @@ +p { + color: antiquewhite; +} diff --git a/test/configCases/css/import/node_modules/non-exported-css/index.css b/test/configCases/css/import/node_modules/non-exported-css/index.css new file mode 100644 index 00000000000..3b220caa96f --- /dev/null +++ b/test/configCases/css/import/node_modules/non-exported-css/index.css @@ -0,0 +1,3 @@ +.non-exported-css{ + color: red; +} \ No newline at end of file diff --git a/test/configCases/css/import/node_modules/non-exported-css/package.json b/test/configCases/css/import/node_modules/non-exported-css/package.json new file mode 100644 index 00000000000..55c03f597b3 --- /dev/null +++ b/test/configCases/css/import/node_modules/non-exported-css/package.json @@ -0,0 +1,3 @@ +{ + "name": "non-exported-css" +} \ No newline at end of file diff --git a/test/configCases/css/import/node_modules/package-with-exports/index.cjs b/test/configCases/css/import/node_modules/package-with-exports/index.cjs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/css/import/node_modules/package-with-exports/index.js b/test/configCases/css/import/node_modules/package-with-exports/index.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/css/import/node_modules/package-with-exports/package.json b/test/configCases/css/import/node_modules/package-with-exports/package.json new file mode 100644 index 00000000000..9b5e2b602a8 --- /dev/null +++ b/test/configCases/css/import/node_modules/package-with-exports/package.json @@ -0,0 +1,19 @@ +{ + "name": "package-with-exports", + "version": "1.0.0", + "description": "test", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "MIT", + "type": "module", + "module": "index.js", + "main": "index.cjs", + "style": "style.css", + "exports": { + "style": "./style.css", + "require": "./index.cjs", + "import": "./index.js" + } +} diff --git a/test/configCases/css/import/node_modules/package-with-exports/style.css b/test/configCases/css/import/node_modules/package-with-exports/style.css new file mode 100644 index 00000000000..38ef857cb7d --- /dev/null +++ b/test/configCases/css/import/node_modules/package-with-exports/style.css @@ -0,0 +1,3 @@ +.load-me { + color: red; +} diff --git a/test/configCases/css/import/node_modules/prefer-relative.css/package.json b/test/configCases/css/import/node_modules/prefer-relative.css/package.json new file mode 100644 index 00000000000..183575c78ed --- /dev/null +++ b/test/configCases/css/import/node_modules/prefer-relative.css/package.json @@ -0,0 +1,4 @@ +{ + "name": "prefer-relative.css", + "style": "./styles.css" +} diff --git a/test/configCases/css/import/node_modules/prefer-relative.css/styles.css b/test/configCases/css/import/node_modules/prefer-relative.css/styles.css new file mode 100644 index 00000000000..f8ad35f95ed --- /dev/null +++ b/test/configCases/css/import/node_modules/prefer-relative.css/styles.css @@ -0,0 +1,3 @@ +.should-be-not-imported { + color: steelblue; +} diff --git a/test/configCases/css/import/node_modules/style-and-main-library/main.css b/test/configCases/css/import/node_modules/style-and-main-library/main.css new file mode 100644 index 00000000000..864a5060ae2 --- /dev/null +++ b/test/configCases/css/import/node_modules/style-and-main-library/main.css @@ -0,0 +1,3 @@ +.main { + color: steelblue; +} diff --git a/test/configCases/css/import/node_modules/style-and-main-library/package.json b/test/configCases/css/import/node_modules/style-and-main-library/package.json new file mode 100644 index 00000000000..f0dab2e32cb --- /dev/null +++ b/test/configCases/css/import/node_modules/style-and-main-library/package.json @@ -0,0 +1,4 @@ +{ + "name": "style-and-main-library", + "style": "./styles.css" +} diff --git a/test/configCases/css/import/node_modules/style-and-main-library/styles.css b/test/configCases/css/import/node_modules/style-and-main-library/styles.css new file mode 100644 index 00000000000..b5795b7efc5 --- /dev/null +++ b/test/configCases/css/import/node_modules/style-and-main-library/styles.css @@ -0,0 +1,3 @@ +.style { + color: steelblue; +} diff --git a/test/configCases/css/import/node_modules/style-library/package.json b/test/configCases/css/import/node_modules/style-library/package.json new file mode 100644 index 00000000000..4b64f1e4715 --- /dev/null +++ b/test/configCases/css/import/node_modules/style-library/package.json @@ -0,0 +1,4 @@ +{ + "name": "style-library", + "style": "./styles.css" +} diff --git a/test/configCases/css/import/node_modules/style-library/styles.css b/test/configCases/css/import/node_modules/style-library/styles.css new file mode 100644 index 00000000000..cf378a3afca --- /dev/null +++ b/test/configCases/css/import/node_modules/style-library/styles.css @@ -0,0 +1,3 @@ +p { + color: steelblue; +} diff --git a/test/configCases/css/import/prefer-relative.css b/test/configCases/css/import/prefer-relative.css new file mode 100644 index 00000000000..53ebf9f616d --- /dev/null +++ b/test/configCases/css/import/prefer-relative.css @@ -0,0 +1,3 @@ +.relative { + color: red; +} diff --git a/test/configCases/css/import/print.css b/test/configCases/css/import/print.css new file mode 100644 index 00000000000..5fa2bfe59ff --- /dev/null +++ b/test/configCases/css/import/print.css @@ -0,0 +1,3 @@ +body { + background: black; +} diff --git a/test/configCases/css/import/some-file.js b/test/configCases/css/import/some-file.js new file mode 100644 index 00000000000..ba55c81f9c5 --- /dev/null +++ b/test/configCases/css/import/some-file.js @@ -0,0 +1,3 @@ +function doNotImportCss() { + return 'doNotImportCss'; +} \ No newline at end of file diff --git a/test/configCases/css/import/string-loader.js b/test/configCases/css/import/string-loader.js new file mode 100644 index 00000000000..edb02509cad --- /dev/null +++ b/test/configCases/css/import/string-loader.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function loader(content) { + return content + `.using-loader { color: red; }`; +}; diff --git a/test/configCases/css/import/styl'le7.css b/test/configCases/css/import/styl'le7.css new file mode 100644 index 00000000000..8e5fc45d459 --- /dev/null +++ b/test/configCases/css/import/styl'le7.css @@ -0,0 +1,3 @@ +.class { + content: "style7.css"; +} diff --git a/test/configCases/css/import/style-import.css b/test/configCases/css/import/style-import.css new file mode 100644 index 00000000000..043966ece80 --- /dev/null +++ b/test/configCases/css/import/style-import.css @@ -0,0 +1,28 @@ +@import "style-library"; +@import "main-field"; +@import "package-with-exports"; +@import "./extensions-imported.mycss"; +@import "./with-less-import.css"; +@import "prefer-relative.css"; +@import "condition-names-style"; +@import "condition-names-style-mode"; +@import "condition-names-subpath/custom.css"; +@import "condition-names-subpath-extra/custom.css"; +@import "condition-names-style-less"; +@import "condition-names-custom-name"; +@import "style-and-main-library"; +@import "condition-names-webpack"; +@import "condition-names-style-nested"; + +/* Technically, this is not entirely true, but we allow it because the final file can be processed by the loader and return the CSS code */ + +@import "js-import"; +@import "condition-names-webpack-js"; +@import url("some-file.js"); + +/* Failed */ + +@import "non-exported-css"; +@import "./directory"; +@import "condition-names-subpath/non-valid.css"; +@import "./no-extension-in-request"; diff --git a/test/configCases/css/import/style.css b/test/configCases/css/import/style.css new file mode 100644 index 00000000000..ae06c63fd3d --- /dev/null +++ b/test/configCases/css/import/style.css @@ -0,0 +1,269 @@ +@import "./style-import.css"; +@import "print.css?foo=1"; +@import url("print.css?foo=2"); +@import "print.css?foo=3" layer(default); +@import url("print.css?foo=4") layer(default); +@import "print.css?foo=5" supports(display: flex); +@import url("print.css?foo=6") supports(display: flex); +@import "print.css?foo=7" screen and (min-width: 400px); +@import url("print.css?foo=8") screen and (min-width: 400px); +@import "print.css?foo=9" layer(default) supports(display: flex); +@import "print.css?foo=10" layer(default) screen and (min-width: 400px); +@import "print.css?foo=11" supports(display: flex) screen and (min-width: 400px); +@import "print.css?foo=12" layer(default) supports(display: flex) screen and (min-width: 400px); +@import "print.css?foo=13"layer(default)supports(display: flex)screen and (min-width: 400px); +@import url(print.css?foo=14)layer(default)supports(display: flex)screen and (min-width: 400px); +@import url("print.css?foo=15")layer(default)supports(display: flex)screen and (min-width: 400px); +@import url(print.css?foo=16)layer(default)supports(background: url(./img.png))screen and (min-width: 400px); +@import url(print.css?foo=17)layer(default)supports(background: url("./img.png"))screen and (min-width: 400px); +@import url(print.css?foo=18)screen; +@import url("print.css?foo=19")screen; +@import "print.css?foo=20"screen; +@import url(print.css?foo=18) screen ; +@import url("print.css?foo=19") screen ; +@import "print.css?foo=20" screen ; +@import "print.css?foo=21" ; + +/* Has the same URL */ +@import "imported.css"; +@import "imported.css" layer(base); +@import "imported.css" supports(display: flex); +@import "imported.css" screen, print; + +@import url(style2.css?foo=1); +@import url('style2.css?foo=2'); +@import url("style2.css?foo=3"); +@IMPORT url(style2.css?foo=4); +@import URL(style2.css?foo=5); +@import url(style2.css?foo=6 ); +@import url( style2.css?foo=7); +@import url( style2.css?foo=8 ); +@import url( +style2.css?foo=9 +); +@import url(); +@import url(''); +@import url(""); +@import ''; +@import ""; +@import " "; +@import "\ +"; +@import url(); +@import url(''); +@import url(""); +@import url("") /* test */; +@import url("") screen and (orientation:landscape); +@import url(style2.css) screen and (orientation:landscape); +@import url(style2.css) SCREEN AND (ORIENTATION: LANDSCAPE); +@import url(style2.css)screen and (orientation:landscape); +@import url(style2.css) screen and (orientation:landscape); +@import url(style2.css) screen and (orientation:landscape); +@import url(style2.css) (min-width: 100px); +@import url(https://test.cases/path/../../../../configCases/css/import/external.css); +@import url(https://test.cases/path/../../../../configCases/css/import/external.css) screen and (orientation:landscape); +@import "//example.com/style.css"; +@import url('test.css?foo=1&bar=1'); +@import url('style2.css?foo=1&bar=1#hash'); +@import url('style2.css?foo=1&bar=1#hash') screen and (orientation:landscape); +@import url('https://fonts.googleapis.com/css?family=Roboto'); +@import url('https://fonts.googleapis.com/css?family=Noto+Sans+TC'); +@import url('https://fonts.googleapis.com/css?family=Noto+Sans+TC|Roboto'); +@import url('https://fonts.googleapis.com/css?family=Noto+Sans+TC|Roboto?foo=1') layer(super.foo) supports(display: flex) screen and (min-width: 400px); + +@import './sty\ +le3.css?bar=1'; +@import './sty\ +\ +\ +le3.css?bar=2'; +@import url('./sty\ +le3.css?bar=3'); +@import url('./sty\ +\ +\ +le3.css?=bar4'); + +@import "./styl'le7.css"; +@import url("./styl'le7.css?foo=1"); +@import './styl\'le7.css'; +@import url('./styl\'le7.css'); +@import './test test.css'; +@import url('./test test.css?foo=1'); +@import './test\ test.css?foo=2'; +@import url('./test\ test.css?foo=3'); +@import './test%20test.css?foo=4'; +@import url('./test%20test.css?foo=5'); +@import './\74\65\73\74.css'; +@import url('./\74\65\73\74.css?foo=1'); +@import './t\65\73\74.css?foo=2'; +@import url('./t\65\73\74.css?foo=3'); +@import url(./test\ test.css?foo=6); +@import url(./t\65st%20test.css?foo=7); +@import url('./t\65st%20test.css?foo=8'); +@import url("./t\65st%20test.css?foo=9"); +@import "./t\65st%20test.css?fpp=10"; +@import './t\65st%20test.css?foo=11'; +@import url( style6.css?foo=bazz ); +@import '\ +\ +\ +'; +@import url('./string-loader.js?esModule=false!./test.css'); +@import url(style4.css?foo=bar); +@import url(style4.css?foo=bar#hash); +@import url(style4.css?#hash); +@import "style4.css?foo=1" supports(display: flex); +@import "style4.css?foo=2" supports(display: flex) screen and (orientation:landscape); + +@import " ./style4.css?foo=3 "; +@import url(' ./style4.css?foo=4 '); +@import url( ./style4.css?foo=5 ); + +@import url(' https://fonts.googleapis.com/css?family=Roboto '); +@import url('./string-loader.js?esModule=false'); +@import url(' ./string-loader.js?esModule=false!./test.css ') screen and (orientation: landscape); +@import url(data:text/css;charset=utf-8,a%20%7B%0D%0A%20%20color%3A%20red%3B%0D%0A%7D); +@import url(data:text/css;charset=utf-8,a%20%7B%0D%0A%20%20color%3A%20blue%3B%0D%0A%7D) screen and (orientation:landscape); +@import url("data:text/css;charset=utf-8;base64,YSB7DQogIGNvbG9yOiByZWQ7DQp9"); + +@import url("./style5.css?foo=1") supports(); +@import url("./style5.css?foo=2") supports( ); +@import url("./style5.css?foo=3") supports(unknown); +@import url("./style5.css?foo=4") supports(display: flex); +@import url("./style5.css?foo=5") supports(display: flex !important); +@import url("./style5.css?foo=6") supports(display: flex) screen and (min-width: 400px); +@import url("./style5.css?foo=7") supports(selector(a b)); +@import url("./style5.css?foo=8") supports( display: flex ); +@import url("./layer.css?foo=1") layer; +@import url("./layer.css?foo=2") layer(default); +@import url("./layer.css?foo=3") layer(default) supports(display: flex) screen and (min-width: 400px); +@import url("./layer.css?foo=3") layer supports(display: flex) screen and (min-width: 400px); +@import url("./layer.css?foo=4") layer() supports(display: flex) screen and (min-width: 400px); +@import url("./layer.css?foo=5") layer(); +@import url("./layer.css?foo=6") layer( foo.bar.baz ); +@import url("./layer.css?foo=7") layer( ); +@import url("./style6.css")layer(default)supports(display: flex)screen and (min-width:400px); +@import "./style6.css?foo=1"layer(default)supports(display: flex)screen and (min-width:400px); +@import "./style6.css?foo=2"supports(display: flex)screen and (min-width:400px); +@import "./style6.css?foo=3"screen and (min-width:400px); +@import url("./style6.css?foo=4")screen and (min-width:400px); +@import url(./style6.css?foo=5)screen and (min-width:400px); +@import url("./style6.css?foo=6") layer( default ) supports( display : flex ) screen and ( min-width : 400px ); +@import URL("./style6.css?foo=7") LAYER(DEFAULT) SUPPORTS(DISPLAY: FLEX) SCREEN AND (MIN-WIDTH: 400PX); +@import url("./style6.css?foo=8") LAYER SUPPORTS(DISPLAY: FLEX) SCREEN AND (MIN-WIDTH: 400PX); +@import url("./style6.css?foo=9") /* Comment */ layer(/* Comment */default/* Comment */) /* Comment */ supports(/* Comment */display/* Comment */:/* Comment */ flex/* Comment */)/* Comment */ screen/* Comment */ and/* Comment */ (/* Comment */min-width/* Comment */: /* Comment */400px/* Comment */); +@import url(style6.css?foo=10) /* Comment */; +@import url(style6.css?foo=11) /* Comment */ /* Comment */; +@import url(style6.css?foo=12) /* Comment *//* Comment */; +@import url(style6.css?foo=13)/* Comment *//* Comment */; +@import +url(style6.css?foo=14) +/* Comment */ +/* Comment */; +@import /* Comment */ url(style6.css?foo=15) /* Comment */; +@import url(style6.css?foo=16) /* Comment */ print and (orientation:landscape); +@import url(style6.css?foo=17)/* Comment */print and (orientation:landscape)/* Comment */; +@import /* Comment */ url(style6.css?foo=18) /* Comment */ print and (orientation:landscape); + +@import url("./style8.css") screen and (min-width: 400px); +@import url("./style8.css") (prefers-color-scheme: dark); +@import url("./style8.css") supports(display: flex); +@import url("./style8.css") supports(((display: flex))); +@import url("./style8.css") supports(((display: inline-grid))) screen and (((min-width: 400px))); +@import url("./style8.css") supports(display: flex); +@import url('./style8.css') supports(display: grid); +@import url("./style8.css") supports(display: flex) screen and (min-width: 400px); +@import url("./style8.css") layer(framework); +@import url("./style8.css") layer(default); +@import url("./style8.css") layer(base); +@import url("./style8.css") layer(default) supports(display: flex); +@import url("./style8.css") layer(default) supports(display: flex) screen and (min-width: 400px); + +/* anonymous */ +@import "style2.css" layer(); +@import "style2.css" layer; + +/* All unknown parse as media for compatibility */ +@import url("./style9.css") unknown(default) unknown(display: flex) unknown; +@import url("./style9.css") unknown(default); + +@import url("./style10.css"); + +@import "./media-nested.css" screen and (min-width: 400px); +@import "./supports-nested.css" supports(display: flex); +@import "./layer-nested.css" layer(foo); +@import "./all-nested.css" layer(foo) supports(display: flex) screen and (min-width: 400px); +@import "./mixed-nested.css" screen and (min-width: 400px); +@import "./anonymous-nested.css" layer; +@import "./media-deep-deep-nested.css" screen and (orientation: portrait); +@import "./duplicate-nested.css" screen and (orientation: portrait); +@import "./anonymous-nested.css" supports(display: flex) screen and (orientation: portrait); +@import "./all-nested.css" layer(super.foo) supports(display: flex) screen and (min-width: 400px); + +/* Inside support */ + +@import url("/style2.css?warning=6") supports(unknown: layer(super.foo)) screen and (min-width: 400px); +@import url("/style2.css?warning=7") supports(url: url("./unknown.css")) screen and (min-width: 400px); +@import url("/style2.css?warning=8") supports(url: url(./unknown.css)) screen and (min-width: 400px); + +/** Possible syntax in future */ + +@import url("/style2.css?foo=unknown") layer(super.foo) supports(display: flex) unknown("foo") screen and (min-width: 400px); +@import url("/style2.css?foo=unknown1") layer(super.foo) supports(display: url("./unknown.css")) unknown(foo) screen and (min-width: 400px); +@import url("/style2.css?foo=unknown2") layer(super.foo) supports(display: url(./unknown.css)) "foo" screen and (min-width: 400px); +@import "./style2.css?unknown3" "string"; + +/** Unknown */ + +@import-normalize; + +/** Warnings */ + +@import nourl(test.css); +@import ; +@import foo-bar; +@import layer(super.foo) "./style2.css?warning=1" supports(display: flex) screen and (min-width: 400px); +@import layer(super.foo) supports(display: flex) "./style2.css?warning=2" screen and (min-width: 400px); +@import layer(super.foo) supports(display: flex) screen and (min-width: 400px) "./style2.css?warning=3"; +@import layer(super.foo) url("./style2.css?warning=4") supports(display: flex) screen and (min-width: 400px); +@import layer(super.foo) supports(display: flex) url("./style2.css?warning=5") screen and (min-width: 400px); +@import layer(super.foo) supports(display: flex) screen and (min-width: 400px) url("./style2.css?warning=6"); +@import url("/style2.css?wrong-order-but-valid=6") supports(display: flex) layer(super.foo) screen and (min-width: 400px); +@namespace url(http://www.w3.org/1999/xhtml); +@import url("./style2.css?after-namespace"); +@import supports(background: url("./img.png")); +@import supports(background: url("./img.png")) screen and (min-width: 400px); +@import layer(test) supports(background: url("./img.png")) screen and (min-width: 400px); +@import screen and (min-width: 400px); + +@import url(./style2.css?multiple=1) url(./style2.css?multiple=2); +@import url("./style2.css?multiple=3") url("./style2.css?multiple=4"); +@import "./style2.css?strange=3" url("./style2.css?multiple=4"); + +@import url("external-1.css"); +@import url("external-2.css") supports(display: grid) screen and (max-width: 400px); +@import url("external-3.css") supports(not (display: grid) and (display: flex)) screen and (max-width: 400px); +@import url("external-4.css") supports((selector(h2 > p)) and + (font-tech(color-COLRv1))); +@import url(external-5.css) layer(default); +@import url(external-6.css) layer(default); +@import url("external-7.css") layer(); +@import url("external-8.css") layer; +@import url("external-9.css") print; +@import url("external-10.css") print, screen; +@import url("external-11.css") screen; +@import url("external-12.css") screen and (orientation: landscape); +@import url("external-13.css") supports(not (display: flex)); +@import url("external-14.css") layer(default) supports(display: grid) screen and (max-width: 400px); + +@import url("ignore.css"); +@import url("list-of-media-queries.css"); +@import url("/alias.css"); +@import url("circular.css"); +/* FIXME */ +/*@import url("webpackIgnore-order.css");*/ + +body { + background: red; +} diff --git a/test/configCases/css/import/style10.css b/test/configCases/css/import/style10.css new file mode 100644 index 00000000000..b7968ef6254 --- /dev/null +++ b/test/configCases/css/import/style10.css @@ -0,0 +1,9 @@ +@import url(./style11.css); +@import url(https://test.cases/path/../../../../configCases/css/import/external1.css); +@import url(./style12.css); +@import url(./style13.css); + + +.style10 { + color: red; +} diff --git a/test/configCases/css/import/style11.css b/test/configCases/css/import/style11.css new file mode 100644 index 00000000000..09831e221ec --- /dev/null +++ b/test/configCases/css/import/style11.css @@ -0,0 +1,3 @@ +.style11 { + color: red; +} diff --git a/test/configCases/css/import/style12.css b/test/configCases/css/import/style12.css new file mode 100644 index 00000000000..d3f40ad3c33 --- /dev/null +++ b/test/configCases/css/import/style12.css @@ -0,0 +1,5 @@ +@import url(https://test.cases/path/../../../../configCases/css/import/external2.css); + +.style12 { + color: red; +} diff --git a/test/configCases/css/import/style13.css b/test/configCases/css/import/style13.css new file mode 100644 index 00000000000..5c9af29d3f4 --- /dev/null +++ b/test/configCases/css/import/style13.css @@ -0,0 +1 @@ +@import url(https://test.cases/path/../../../../configCases/css/import/external2.css);div{color: red;} diff --git a/test/configCases/css/import/style2.css b/test/configCases/css/import/style2.css new file mode 100644 index 00000000000..195b6bcf6d2 --- /dev/null +++ b/test/configCases/css/import/style2.css @@ -0,0 +1,3 @@ +a { + color: red; +} diff --git a/test/configCases/css/import/style3.css b/test/configCases/css/import/style3.css new file mode 100644 index 00000000000..3da7fa6f9a7 --- /dev/null +++ b/test/configCases/css/import/style3.css @@ -0,0 +1,4 @@ +.class { + content: "style.css"; + color: red; +} diff --git a/test/configCases/css/import/style4.css b/test/configCases/css/import/style4.css new file mode 100644 index 00000000000..ffafcc6bc82 --- /dev/null +++ b/test/configCases/css/import/style4.css @@ -0,0 +1,3 @@ +.class { + content: "style4.css"; +} diff --git a/test/configCases/css/import/style5.css b/test/configCases/css/import/style5.css new file mode 100644 index 00000000000..762f796a624 --- /dev/null +++ b/test/configCases/css/import/style5.css @@ -0,0 +1,3 @@ +.class { + content: "style5.css"; +} diff --git a/test/configCases/css/import/style6.css b/test/configCases/css/import/style6.css new file mode 100644 index 00000000000..07cf8d4947d --- /dev/null +++ b/test/configCases/css/import/style6.css @@ -0,0 +1,3 @@ +.class { + content: "style6.css"; +} diff --git a/test/configCases/css/import/style8.css b/test/configCases/css/import/style8.css new file mode 100644 index 00000000000..cdf5c7ed93a --- /dev/null +++ b/test/configCases/css/import/style8.css @@ -0,0 +1,3 @@ +.class { + content: "style8.css"; +} diff --git a/test/configCases/css/import/style9.css b/test/configCases/css/import/style9.css new file mode 100644 index 00000000000..cdaaa1da655 --- /dev/null +++ b/test/configCases/css/import/style9.css @@ -0,0 +1,3 @@ +.class { + content: "style9.css"; +} diff --git a/test/configCases/css/import/supports-deep-deep-nested.css b/test/configCases/css/import/supports-deep-deep-nested.css new file mode 100644 index 00000000000..2b3fb00069f --- /dev/null +++ b/test/configCases/css/import/supports-deep-deep-nested.css @@ -0,0 +1,3 @@ +.class { + deep-deep-nested: 1; +} diff --git a/test/configCases/css/import/supports-deep-nested.css b/test/configCases/css/import/supports-deep-nested.css new file mode 100644 index 00000000000..7a2e5ae40c8 --- /dev/null +++ b/test/configCases/css/import/supports-deep-nested.css @@ -0,0 +1,5 @@ +@import "./supports-deep-deep-nested.css" supports(display: table); + +.class { + deep-nested: 1; +} diff --git a/test/configCases/css/import/supports-nested.css b/test/configCases/css/import/supports-nested.css new file mode 100644 index 00000000000..29703ad014b --- /dev/null +++ b/test/configCases/css/import/supports-nested.css @@ -0,0 +1,5 @@ +@import "./supports-deep-nested.css" supports(display: grid); + +.class { + nested: 1; +} diff --git a/test/configCases/css/import/test test.css b/test/configCases/css/import/test test.css new file mode 100644 index 00000000000..1e68c3da01e --- /dev/null +++ b/test/configCases/css/import/test test.css @@ -0,0 +1,3 @@ +.class { + content: "test test.css"; +} diff --git a/test/configCases/css/import/test.config.js b/test/configCases/css/import/test.config.js new file mode 100644 index 00000000000..5014f5795fe --- /dev/null +++ b/test/configCases/css/import/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = `bundle${scope.__STATS_I__}.css`; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/import/test.css b/test/configCases/css/import/test.css new file mode 100644 index 00000000000..2c03574bff6 --- /dev/null +++ b/test/configCases/css/import/test.css @@ -0,0 +1,3 @@ +.class { + content: "test.css"; +} diff --git a/test/configCases/css/import/warnings.js b/test/configCases/css/import/warnings.js new file mode 100644 index 00000000000..b6cc2cf76c4 --- /dev/null +++ b/test/configCases/css/import/warnings.js @@ -0,0 +1,17 @@ +module.exports = [ + /Expected URL in '@import nourl\(test\.css\);'/, + /Expected URL in '@import ;'/, + /Expected URL in '@import foo-bar;'/, + /Expected URL in '@import layer\(super\.foo\) "\.\/style2\.css\?warning=1" supports\(display: flex\) screen and \(min-width: 400px\);'/, + /Expected URL in '@import layer\(super\.foo\) supports\(display: flex\) "\.\/style2\.css\?warning=2" screen and \(min-width: 400px\);'/, + /Expected URL in '@import layer\(super\.foo\) supports\(display: flex\) screen and \(min-width: 400px\) "\.\/style2\.css\?warning=3";'/, + /Expected URL in '@import layer\(super\.foo\) supports\(display: flex\) screen and \(min-width: 400px\) url\("\.\/style2\.css\?warning=6"\);'/, + /Expected URL in '@import layer\(super\.foo\) supports\(display: flex\) url\("\.\/style2\.css\?warning=5"\) screen and \(min-width: 400px\);'/, + /Expected URL in '@import layer\(super\.foo\) url\("\.\/style2\.css\?warning=4"\) supports\(display: flex\) screen and \(min-width: 400px\);'/, + /'@namespace' is not supported in bundled CSS/, + /Expected URL in '@import layer\(test\) supports\(background: url\("\.\/img\.png"\)\) screen and \(min-width: 400px\);'/, + /Expected URL in '@import screen and \(min-width: 400px\);'/, + /Expected URL in '@import supports\(background: url\("\.\/img\.png"\)\) screen and \(min-width: 400px\);'/, + /Expected URL in '@import supports\(background: url\("\.\/img\.png"\)\);'/, + /'@namespace' is not supported in bundled CSS/ +]; diff --git a/test/configCases/css/import/webpack.config.js b/test/configCases/css/import/webpack.config.js new file mode 100644 index 00000000000..440985da639 --- /dev/null +++ b/test/configCases/css/import/webpack.config.js @@ -0,0 +1,68 @@ +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = [ + { + target: "web", + mode: "development", + experiments: { + css: true + }, + resolve: { + alias: { + "/alias.css": false + }, + byDependency: { + "css-import": { + conditionNames: ["custom-name", "..."], + extensions: [".mycss", "..."] + } + } + }, + module: { + rules: [ + { + test: /\.mycss$/, + loader: "./string-loader", + type: "css/global" + }, + { + test: /\.less$/, + loader: "less-loader", + type: "css/global" + } + ] + }, + externals: { + "external-1.css": "css-import external-1.css", + "external-2.css": "css-import external-2.css", + "external-3.css": "css-import external-3.css", + "external-4.css": "css-import external-4.css", + "external-5.css": "css-import external-5.css", + "external-6.css": "css-import external-6.css", + "external-7.css": "css-import external-7.css", + "external-8.css": "css-import external-8.css", + "external-9.css": "css-import external-9.css", + "external-10.css": "css-import external-10.css", + "external-11.css": "css-import external-11.css", + "external-12.css": "css-import external-12.css", + "external-13.css": "css-import external-13.css", + "external-14.css": "css-import external-14.css" + }, + plugins: [new webpack.IgnorePlugin({ resourceRegExp: /ignore\.css/ })] + }, + { + target: "web", + mode: "development", + experiments: { + css: true + }, + module: { + parser: { + css: { + import: false + } + } + } + } +]; diff --git a/test/configCases/css/import/webpackIgnore-order.css b/test/configCases/css/import/webpackIgnore-order.css new file mode 100644 index 00000000000..c57b445e8f0 --- /dev/null +++ b/test/configCases/css/import/webpackIgnore-order.css @@ -0,0 +1,6 @@ +@import /* webpackIgnore: true */ url("/assets/themes.css"); +@import "./style2.css"; + +body { + background: red; +} diff --git a/test/configCases/css/import/with-less-import.css b/test/configCases/css/import/with-less-import.css new file mode 100644 index 00000000000..75b8a62307d --- /dev/null +++ b/test/configCases/css/import/with-less-import.css @@ -0,0 +1,5 @@ +@import "./file.less"; + +.foo { + color: red; +} diff --git a/test/configCases/css/large/index.js b/test/configCases/css/large/index.js new file mode 100644 index 00000000000..7ef9c719c31 --- /dev/null +++ b/test/configCases/css/large/index.js @@ -0,0 +1,22 @@ +const prod = process.env.NODE_ENV === "production"; + +it("should allow to create css modules", done => { + prod + ? __non_webpack_require__("./226.bundle1.js") + : __non_webpack_require__("./use-style_js.bundle0.js"); + import("./use-style.js").then(({ default: x }) => { + try { + expect(x).toMatchSnapshot(prod ? "prod" : "dev"); + } catch (e) { + return done(e); + } + done(); + }, done); +}); + +it("should allow to process tailwind as global css", done => { + prod + ? __non_webpack_require__("./382.bundle1.js") + : __non_webpack_require__("./tailwind_min_css.bundle0.js"); + import("./tailwind.min.css").then(() => done(), done); +}); diff --git a/test/configCases/css/large/tailwind.min.css b/test/configCases/css/large/tailwind.min.css new file mode 100644 index 00000000000..dc016181652 --- /dev/null +++ b/test/configCases/css/large/tailwind.min.css @@ -0,0 +1 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset{margin:0;padding:0}ol,ul{list-style:none;margin:0;padding:0}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";line-height:1.5}*,::after,::before{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e2e8f0}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#a0aec0}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:#a0aec0}input::placeholder,textarea::placeholder{color:#a0aec0}[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}.space-y-0>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(0px * var(--space-y-reverse))}.space-x-0>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(0px * var(--space-x-reverse));margin-left:calc(0px * calc(1 - var(--space-x-reverse)))}.space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.25rem * var(--space-y-reverse))}.space-x-1>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.25rem * var(--space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--space-x-reverse)))}.space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.5rem * var(--space-y-reverse))}.space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.5rem * var(--space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--space-x-reverse)))}.space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.75rem * var(--space-y-reverse))}.space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.75rem * var(--space-x-reverse));margin-left:calc(.75rem * calc(1 - var(--space-x-reverse)))}.space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1rem * var(--space-y-reverse))}.space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1rem * var(--space-x-reverse));margin-left:calc(1rem * calc(1 - var(--space-x-reverse)))}.space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1.25rem * var(--space-y-reverse))}.space-x-5>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1.25rem * var(--space-x-reverse));margin-left:calc(1.25rem * calc(1 - var(--space-x-reverse)))}.space-y-6>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1.5rem * var(--space-y-reverse))}.space-x-6>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1.5rem * var(--space-x-reverse));margin-left:calc(1.5rem * calc(1 - var(--space-x-reverse)))}.space-y-8>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(2rem * var(--space-y-reverse))}.space-x-8>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(2rem * var(--space-x-reverse));margin-left:calc(2rem * calc(1 - var(--space-x-reverse)))}.space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(2.5rem * var(--space-y-reverse))}.space-x-10>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(2.5rem * var(--space-x-reverse));margin-left:calc(2.5rem * calc(1 - var(--space-x-reverse)))}.space-y-12>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(3rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(3rem * var(--space-y-reverse))}.space-x-12>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(3rem * var(--space-x-reverse));margin-left:calc(3rem * calc(1 - var(--space-x-reverse)))}.space-y-16>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(4rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(4rem * var(--space-y-reverse))}.space-x-16>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(4rem * var(--space-x-reverse));margin-left:calc(4rem * calc(1 - var(--space-x-reverse)))}.space-y-20>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(5rem * var(--space-y-reverse))}.space-x-20>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(5rem * var(--space-x-reverse));margin-left:calc(5rem * calc(1 - var(--space-x-reverse)))}.space-y-24>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(6rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(6rem * var(--space-y-reverse))}.space-x-24>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(6rem * var(--space-x-reverse));margin-left:calc(6rem * calc(1 - var(--space-x-reverse)))}.space-y-32>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(8rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(8rem * var(--space-y-reverse))}.space-x-32>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(8rem * var(--space-x-reverse));margin-left:calc(8rem * calc(1 - var(--space-x-reverse)))}.space-y-40>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(10rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(10rem * var(--space-y-reverse))}.space-x-40>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(10rem * var(--space-x-reverse));margin-left:calc(10rem * calc(1 - var(--space-x-reverse)))}.space-y-48>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(12rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(12rem * var(--space-y-reverse))}.space-x-48>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(12rem * var(--space-x-reverse));margin-left:calc(12rem * calc(1 - var(--space-x-reverse)))}.space-y-56>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(14rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(14rem * var(--space-y-reverse))}.space-x-56>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(14rem * var(--space-x-reverse));margin-left:calc(14rem * calc(1 - var(--space-x-reverse)))}.space-y-64>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(16rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(16rem * var(--space-y-reverse))}.space-x-64>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(16rem * var(--space-x-reverse));margin-left:calc(16rem * calc(1 - var(--space-x-reverse)))}.space-y-px>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1px * var(--space-y-reverse))}.space-x-px>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1px * var(--space-x-reverse));margin-left:calc(1px * calc(1 - var(--space-x-reverse)))}.-space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.25rem * var(--space-y-reverse))}.-space-x-1>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.25rem * var(--space-x-reverse));margin-left:calc(-.25rem * calc(1 - var(--space-x-reverse)))}.-space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.5rem * var(--space-y-reverse))}.-space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.5rem * var(--space-x-reverse));margin-left:calc(-.5rem * calc(1 - var(--space-x-reverse)))}.-space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.75rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.75rem * var(--space-y-reverse))}.-space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.75rem * var(--space-x-reverse));margin-left:calc(-.75rem * calc(1 - var(--space-x-reverse)))}.-space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1rem * var(--space-y-reverse))}.-space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1rem * var(--space-x-reverse));margin-left:calc(-1rem * calc(1 - var(--space-x-reverse)))}.-space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1.25rem * var(--space-y-reverse))}.-space-x-5>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1.25rem * var(--space-x-reverse));margin-left:calc(-1.25rem * calc(1 - var(--space-x-reverse)))}.-space-y-6>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1.5rem * var(--space-y-reverse))}.-space-x-6>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1.5rem * var(--space-x-reverse));margin-left:calc(-1.5rem * calc(1 - var(--space-x-reverse)))}.-space-y-8>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-2rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-2rem * var(--space-y-reverse))}.-space-x-8>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-2rem * var(--space-x-reverse));margin-left:calc(-2rem * calc(1 - var(--space-x-reverse)))}.-space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-2.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-2.5rem * var(--space-y-reverse))}.-space-x-10>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-2.5rem * var(--space-x-reverse));margin-left:calc(-2.5rem * calc(1 - var(--space-x-reverse)))}.-space-y-12>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-3rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-3rem * var(--space-y-reverse))}.-space-x-12>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-3rem * var(--space-x-reverse));margin-left:calc(-3rem * calc(1 - var(--space-x-reverse)))}.-space-y-16>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-4rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-4rem * var(--space-y-reverse))}.-space-x-16>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-4rem * var(--space-x-reverse));margin-left:calc(-4rem * calc(1 - var(--space-x-reverse)))}.-space-y-20>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-5rem * var(--space-y-reverse))}.-space-x-20>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-5rem * var(--space-x-reverse));margin-left:calc(-5rem * calc(1 - var(--space-x-reverse)))}.-space-y-24>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-6rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-6rem * var(--space-y-reverse))}.-space-x-24>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-6rem * var(--space-x-reverse));margin-left:calc(-6rem * calc(1 - var(--space-x-reverse)))}.-space-y-32>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-8rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-8rem * var(--space-y-reverse))}.-space-x-32>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-8rem * var(--space-x-reverse));margin-left:calc(-8rem * calc(1 - var(--space-x-reverse)))}.-space-y-40>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-10rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-10rem * var(--space-y-reverse))}.-space-x-40>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-10rem * var(--space-x-reverse));margin-left:calc(-10rem * calc(1 - var(--space-x-reverse)))}.-space-y-48>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-12rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-12rem * var(--space-y-reverse))}.-space-x-48>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-12rem * var(--space-x-reverse));margin-left:calc(-12rem * calc(1 - var(--space-x-reverse)))}.-space-y-56>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-14rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-14rem * var(--space-y-reverse))}.-space-x-56>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-14rem * var(--space-x-reverse));margin-left:calc(-14rem * calc(1 - var(--space-x-reverse)))}.-space-y-64>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-16rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-16rem * var(--space-y-reverse))}.-space-x-64>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-16rem * var(--space-x-reverse));margin-left:calc(-16rem * calc(1 - var(--space-x-reverse)))}.-space-y-px>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1px * var(--space-y-reverse))}.-space-x-px>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1px * var(--space-x-reverse));margin-left:calc(-1px * calc(1 - var(--space-x-reverse)))}.space-y-reverse>:not(template)~:not(template){--space-y-reverse:1}.space-x-reverse>:not(template)~:not(template){--space-x-reverse:1}.divide-y-0>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(0px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(0px * var(--divide-y-reverse))}.divide-x-0>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(0px * var(--divide-x-reverse));border-left-width:calc(0px * calc(1 - var(--divide-x-reverse)))}.divide-y-2>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(2px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(2px * var(--divide-y-reverse))}.divide-x-2>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(2px * var(--divide-x-reverse));border-left-width:calc(2px * calc(1 - var(--divide-x-reverse)))}.divide-y-4>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(4px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(4px * var(--divide-y-reverse))}.divide-x-4>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(4px * var(--divide-x-reverse));border-left-width:calc(4px * calc(1 - var(--divide-x-reverse)))}.divide-y-8>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(8px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(8px * var(--divide-y-reverse))}.divide-x-8>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(8px * var(--divide-x-reverse));border-left-width:calc(8px * calc(1 - var(--divide-x-reverse)))}.divide-y>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(1px * var(--divide-y-reverse))}.divide-x>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(1px * var(--divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--divide-x-reverse)))}.divide-y-reverse>:not(template)~:not(template){--divide-y-reverse:1}.divide-x-reverse>:not(template)~:not(template){--divide-x-reverse:1}.divide-transparent>:not(template)~:not(template){border-color:transparent}.divide-current>:not(template)~:not(template){border-color:currentColor}.divide-black>:not(template)~:not(template){--divide-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--divide-opacity))}.divide-white>:not(template)~:not(template){--divide-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--divide-opacity))}.divide-gray-100>:not(template)~:not(template){--divide-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--divide-opacity))}.divide-gray-200>:not(template)~:not(template){--divide-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--divide-opacity))}.divide-gray-300>:not(template)~:not(template){--divide-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--divide-opacity))}.divide-gray-400>:not(template)~:not(template){--divide-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--divide-opacity))}.divide-gray-500>:not(template)~:not(template){--divide-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--divide-opacity))}.divide-gray-600>:not(template)~:not(template){--divide-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--divide-opacity))}.divide-gray-700>:not(template)~:not(template){--divide-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--divide-opacity))}.divide-gray-800>:not(template)~:not(template){--divide-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--divide-opacity))}.divide-gray-900>:not(template)~:not(template){--divide-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--divide-opacity))}.divide-red-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--divide-opacity))}.divide-red-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--divide-opacity))}.divide-red-300>:not(template)~:not(template){--divide-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--divide-opacity))}.divide-red-400>:not(template)~:not(template){--divide-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--divide-opacity))}.divide-red-500>:not(template)~:not(template){--divide-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--divide-opacity))}.divide-red-600>:not(template)~:not(template){--divide-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--divide-opacity))}.divide-red-700>:not(template)~:not(template){--divide-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--divide-opacity))}.divide-red-800>:not(template)~:not(template){--divide-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--divide-opacity))}.divide-red-900>:not(template)~:not(template){--divide-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--divide-opacity))}.divide-orange-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--divide-opacity))}.divide-orange-200>:not(template)~:not(template){--divide-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--divide-opacity))}.divide-orange-300>:not(template)~:not(template){--divide-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--divide-opacity))}.divide-orange-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--divide-opacity))}.divide-orange-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--divide-opacity))}.divide-orange-600>:not(template)~:not(template){--divide-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--divide-opacity))}.divide-orange-700>:not(template)~:not(template){--divide-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--divide-opacity))}.divide-orange-800>:not(template)~:not(template){--divide-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--divide-opacity))}.divide-orange-900>:not(template)~:not(template){--divide-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--divide-opacity))}.divide-yellow-100>:not(template)~:not(template){--divide-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--divide-opacity))}.divide-yellow-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--divide-opacity))}.divide-yellow-300>:not(template)~:not(template){--divide-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--divide-opacity))}.divide-yellow-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--divide-opacity))}.divide-yellow-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--divide-opacity))}.divide-yellow-600>:not(template)~:not(template){--divide-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--divide-opacity))}.divide-yellow-700>:not(template)~:not(template){--divide-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--divide-opacity))}.divide-yellow-800>:not(template)~:not(template){--divide-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--divide-opacity))}.divide-yellow-900>:not(template)~:not(template){--divide-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--divide-opacity))}.divide-green-100>:not(template)~:not(template){--divide-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--divide-opacity))}.divide-green-200>:not(template)~:not(template){--divide-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--divide-opacity))}.divide-green-300>:not(template)~:not(template){--divide-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--divide-opacity))}.divide-green-400>:not(template)~:not(template){--divide-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--divide-opacity))}.divide-green-500>:not(template)~:not(template){--divide-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--divide-opacity))}.divide-green-600>:not(template)~:not(template){--divide-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--divide-opacity))}.divide-green-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--divide-opacity))}.divide-green-800>:not(template)~:not(template){--divide-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--divide-opacity))}.divide-green-900>:not(template)~:not(template){--divide-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--divide-opacity))}.divide-teal-100>:not(template)~:not(template){--divide-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--divide-opacity))}.divide-teal-200>:not(template)~:not(template){--divide-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--divide-opacity))}.divide-teal-300>:not(template)~:not(template){--divide-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--divide-opacity))}.divide-teal-400>:not(template)~:not(template){--divide-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--divide-opacity))}.divide-teal-500>:not(template)~:not(template){--divide-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--divide-opacity))}.divide-teal-600>:not(template)~:not(template){--divide-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--divide-opacity))}.divide-teal-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--divide-opacity))}.divide-teal-800>:not(template)~:not(template){--divide-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--divide-opacity))}.divide-teal-900>:not(template)~:not(template){--divide-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--divide-opacity))}.divide-blue-100>:not(template)~:not(template){--divide-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--divide-opacity))}.divide-blue-200>:not(template)~:not(template){--divide-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--divide-opacity))}.divide-blue-300>:not(template)~:not(template){--divide-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--divide-opacity))}.divide-blue-400>:not(template)~:not(template){--divide-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--divide-opacity))}.divide-blue-500>:not(template)~:not(template){--divide-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--divide-opacity))}.divide-blue-600>:not(template)~:not(template){--divide-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--divide-opacity))}.divide-blue-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--divide-opacity))}.divide-blue-800>:not(template)~:not(template){--divide-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--divide-opacity))}.divide-blue-900>:not(template)~:not(template){--divide-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--divide-opacity))}.divide-indigo-100>:not(template)~:not(template){--divide-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--divide-opacity))}.divide-indigo-200>:not(template)~:not(template){--divide-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--divide-opacity))}.divide-indigo-300>:not(template)~:not(template){--divide-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--divide-opacity))}.divide-indigo-400>:not(template)~:not(template){--divide-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--divide-opacity))}.divide-indigo-500>:not(template)~:not(template){--divide-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--divide-opacity))}.divide-indigo-600>:not(template)~:not(template){--divide-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--divide-opacity))}.divide-indigo-700>:not(template)~:not(template){--divide-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--divide-opacity))}.divide-indigo-800>:not(template)~:not(template){--divide-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--divide-opacity))}.divide-indigo-900>:not(template)~:not(template){--divide-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--divide-opacity))}.divide-purple-100>:not(template)~:not(template){--divide-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--divide-opacity))}.divide-purple-200>:not(template)~:not(template){--divide-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--divide-opacity))}.divide-purple-300>:not(template)~:not(template){--divide-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--divide-opacity))}.divide-purple-400>:not(template)~:not(template){--divide-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--divide-opacity))}.divide-purple-500>:not(template)~:not(template){--divide-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--divide-opacity))}.divide-purple-600>:not(template)~:not(template){--divide-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--divide-opacity))}.divide-purple-700>:not(template)~:not(template){--divide-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--divide-opacity))}.divide-purple-800>:not(template)~:not(template){--divide-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--divide-opacity))}.divide-purple-900>:not(template)~:not(template){--divide-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--divide-opacity))}.divide-pink-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--divide-opacity))}.divide-pink-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--divide-opacity))}.divide-pink-300>:not(template)~:not(template){--divide-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--divide-opacity))}.divide-pink-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--divide-opacity))}.divide-pink-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--divide-opacity))}.divide-pink-600>:not(template)~:not(template){--divide-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--divide-opacity))}.divide-pink-700>:not(template)~:not(template){--divide-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--divide-opacity))}.divide-pink-800>:not(template)~:not(template){--divide-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--divide-opacity))}.divide-pink-900>:not(template)~:not(template){--divide-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--divide-opacity))}.divide-solid>:not(template)~:not(template){border-style:solid}.divide-dashed>:not(template)~:not(template){border-style:dashed}.divide-dotted>:not(template)~:not(template){border-style:dotted}.divide-double>:not(template)~:not(template){border-style:double}.divide-none>:not(template)~:not(template){border-style:none}.divide-opacity-0>:not(template)~:not(template){--divide-opacity:0}.divide-opacity-25>:not(template)~:not(template){--divide-opacity:0.25}.divide-opacity-50>:not(template)~:not(template){--divide-opacity:0.5}.divide-opacity-75>:not(template)~:not(template){--divide-opacity:0.75}.divide-opacity-100>:not(template)~:not(template){--divide-opacity:1}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.focus\:sr-only:focus{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.bg-fixed{background-attachment:fixed}.bg-local{background-attachment:local}.bg-scroll{background-attachment:scroll}.bg-clip-border{background-clip:border-box}.bg-clip-padding{background-clip:padding-box}.bg-clip-content{background-clip:content-box}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.bg-transparent{background-color:transparent}.bg-current{background-color:currentColor}.bg-black{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.bg-gray-200{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.bg-gray-300{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.bg-gray-400{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.bg-gray-500{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.bg-gray-600{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.bg-gray-700{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.bg-gray-800{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.bg-red-100{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.bg-red-200{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.bg-red-300{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.bg-red-400{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.bg-red-500{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.bg-red-600{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.bg-red-700{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.bg-red-800{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.bg-red-900{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.bg-orange-100{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.bg-orange-200{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.bg-orange-300{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.bg-orange-400{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.bg-orange-500{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.bg-orange-600{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.bg-orange-700{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.bg-orange-800{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.bg-orange-900{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.bg-yellow-100{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.bg-yellow-200{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.bg-yellow-300{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.bg-yellow-400{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.bg-yellow-500{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.bg-yellow-600{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.bg-yellow-700{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.bg-yellow-800{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.bg-yellow-900{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.bg-green-100{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.bg-green-200{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.bg-green-300{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.bg-green-400{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.bg-green-500{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.bg-green-600{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.bg-green-700{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.bg-green-800{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.bg-green-900{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.bg-teal-100{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.bg-teal-200{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.bg-teal-300{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.bg-teal-400{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.bg-teal-500{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.bg-teal-600{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.bg-teal-700{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.bg-teal-800{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.bg-teal-900{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.bg-blue-100{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.bg-blue-200{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.bg-blue-300{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.bg-blue-400{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.bg-blue-500{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.bg-blue-600{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.bg-blue-700{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.bg-blue-800{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.bg-blue-900{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.bg-indigo-100{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.bg-indigo-200{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.bg-indigo-300{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.bg-indigo-400{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.bg-indigo-500{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.bg-indigo-600{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.bg-indigo-700{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.bg-indigo-800{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.bg-indigo-900{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.bg-purple-100{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.bg-purple-200{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.bg-purple-300{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.bg-purple-400{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.bg-purple-500{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.bg-purple-600{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.bg-purple-700{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.bg-purple-800{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.bg-purple-900{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.bg-pink-100{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.bg-pink-200{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.bg-pink-300{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.bg-pink-400{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.bg-pink-500{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.bg-pink-600{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.bg-pink-700{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.bg-pink-800{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.bg-pink-900{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.hover\:bg-transparent:hover{background-color:transparent}.hover\:bg-current:hover{background-color:currentColor}.hover\:bg-black:hover{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.hover\:bg-white:hover{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.hover\:bg-gray-100:hover{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.hover\:bg-gray-200:hover{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.hover\:bg-gray-300:hover{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.hover\:bg-gray-400:hover{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.hover\:bg-gray-500:hover{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.hover\:bg-gray-600:hover{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.hover\:bg-gray-700:hover{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.hover\:bg-gray-800:hover{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.hover\:bg-gray-900:hover{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.hover\:bg-red-100:hover{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.hover\:bg-red-200:hover{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.hover\:bg-red-300:hover{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.hover\:bg-red-400:hover{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.hover\:bg-red-500:hover{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.hover\:bg-red-600:hover{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.hover\:bg-red-700:hover{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.hover\:bg-red-800:hover{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.hover\:bg-red-900:hover{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.hover\:bg-orange-100:hover{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.hover\:bg-orange-200:hover{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.hover\:bg-orange-300:hover{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.hover\:bg-orange-400:hover{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.hover\:bg-orange-500:hover{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.hover\:bg-orange-600:hover{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.hover\:bg-orange-700:hover{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.hover\:bg-orange-800:hover{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.hover\:bg-orange-900:hover{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.hover\:bg-yellow-100:hover{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.hover\:bg-yellow-200:hover{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.hover\:bg-yellow-300:hover{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.hover\:bg-yellow-400:hover{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.hover\:bg-yellow-500:hover{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.hover\:bg-yellow-600:hover{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.hover\:bg-yellow-700:hover{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.hover\:bg-yellow-800:hover{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.hover\:bg-yellow-900:hover{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.hover\:bg-green-100:hover{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.hover\:bg-green-200:hover{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.hover\:bg-green-300:hover{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.hover\:bg-green-400:hover{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.hover\:bg-green-500:hover{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.hover\:bg-green-600:hover{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.hover\:bg-green-700:hover{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.hover\:bg-green-800:hover{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.hover\:bg-green-900:hover{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.hover\:bg-teal-100:hover{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.hover\:bg-teal-200:hover{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.hover\:bg-teal-300:hover{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.hover\:bg-teal-400:hover{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.hover\:bg-teal-500:hover{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.hover\:bg-teal-600:hover{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.hover\:bg-teal-700:hover{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.hover\:bg-teal-800:hover{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.hover\:bg-teal-900:hover{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.hover\:bg-blue-100:hover{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.hover\:bg-blue-200:hover{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.hover\:bg-blue-300:hover{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.hover\:bg-blue-400:hover{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.hover\:bg-blue-500:hover{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.hover\:bg-blue-600:hover{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.hover\:bg-blue-700:hover{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.hover\:bg-blue-800:hover{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.hover\:bg-blue-900:hover{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.hover\:bg-indigo-100:hover{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.hover\:bg-indigo-200:hover{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.hover\:bg-indigo-300:hover{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.hover\:bg-indigo-400:hover{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.hover\:bg-indigo-500:hover{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.hover\:bg-indigo-600:hover{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.hover\:bg-indigo-700:hover{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.hover\:bg-indigo-800:hover{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.hover\:bg-indigo-900:hover{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.hover\:bg-purple-100:hover{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.hover\:bg-purple-200:hover{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.hover\:bg-purple-300:hover{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.hover\:bg-purple-400:hover{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.hover\:bg-purple-500:hover{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.hover\:bg-purple-600:hover{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.hover\:bg-purple-700:hover{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.hover\:bg-purple-800:hover{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.hover\:bg-purple-900:hover{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.hover\:bg-pink-100:hover{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.hover\:bg-pink-200:hover{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.hover\:bg-pink-300:hover{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.hover\:bg-pink-400:hover{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.hover\:bg-pink-500:hover{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.hover\:bg-pink-600:hover{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.hover\:bg-pink-700:hover{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.hover\:bg-pink-800:hover{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.hover\:bg-pink-900:hover{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.focus\:bg-transparent:focus{background-color:transparent}.focus\:bg-current:focus{background-color:currentColor}.focus\:bg-black:focus{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.focus\:bg-white:focus{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.focus\:bg-gray-100:focus{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.focus\:bg-gray-200:focus{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.focus\:bg-gray-300:focus{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.focus\:bg-gray-400:focus{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.focus\:bg-gray-500:focus{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.focus\:bg-gray-600:focus{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.focus\:bg-gray-700:focus{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.focus\:bg-gray-800:focus{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.focus\:bg-gray-900:focus{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.focus\:bg-red-100:focus{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.focus\:bg-red-200:focus{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.focus\:bg-red-300:focus{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.focus\:bg-red-400:focus{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.focus\:bg-red-500:focus{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.focus\:bg-red-600:focus{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.focus\:bg-red-700:focus{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.focus\:bg-red-800:focus{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.focus\:bg-red-900:focus{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.focus\:bg-orange-100:focus{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.focus\:bg-orange-200:focus{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.focus\:bg-orange-300:focus{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.focus\:bg-orange-400:focus{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.focus\:bg-orange-500:focus{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.focus\:bg-orange-600:focus{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.focus\:bg-orange-700:focus{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.focus\:bg-orange-800:focus{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.focus\:bg-orange-900:focus{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.focus\:bg-yellow-100:focus{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.focus\:bg-yellow-200:focus{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.focus\:bg-yellow-300:focus{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.focus\:bg-yellow-400:focus{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.focus\:bg-yellow-500:focus{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.focus\:bg-yellow-600:focus{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.focus\:bg-yellow-700:focus{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.focus\:bg-yellow-800:focus{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.focus\:bg-yellow-900:focus{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.focus\:bg-green-100:focus{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.focus\:bg-green-200:focus{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.focus\:bg-green-300:focus{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.focus\:bg-green-400:focus{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.focus\:bg-green-500:focus{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.focus\:bg-green-600:focus{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.focus\:bg-green-700:focus{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.focus\:bg-green-800:focus{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.focus\:bg-green-900:focus{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.focus\:bg-teal-100:focus{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.focus\:bg-teal-200:focus{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.focus\:bg-teal-300:focus{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.focus\:bg-teal-400:focus{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.focus\:bg-teal-500:focus{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.focus\:bg-teal-600:focus{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.focus\:bg-teal-700:focus{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.focus\:bg-teal-800:focus{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.focus\:bg-teal-900:focus{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.focus\:bg-blue-100:focus{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.focus\:bg-blue-200:focus{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.focus\:bg-blue-300:focus{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.focus\:bg-blue-400:focus{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.focus\:bg-blue-500:focus{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.focus\:bg-blue-600:focus{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.focus\:bg-blue-700:focus{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.focus\:bg-blue-800:focus{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.focus\:bg-blue-900:focus{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.focus\:bg-indigo-100:focus{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.focus\:bg-indigo-200:focus{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.focus\:bg-indigo-300:focus{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.focus\:bg-indigo-400:focus{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.focus\:bg-indigo-500:focus{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.focus\:bg-indigo-600:focus{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.focus\:bg-indigo-700:focus{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.focus\:bg-indigo-800:focus{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.focus\:bg-indigo-900:focus{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.focus\:bg-purple-100:focus{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.focus\:bg-purple-200:focus{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.focus\:bg-purple-300:focus{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.focus\:bg-purple-400:focus{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.focus\:bg-purple-500:focus{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.focus\:bg-purple-600:focus{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.focus\:bg-purple-700:focus{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.focus\:bg-purple-800:focus{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.focus\:bg-purple-900:focus{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.focus\:bg-pink-100:focus{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.focus\:bg-pink-200:focus{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.focus\:bg-pink-300:focus{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.focus\:bg-pink-400:focus{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.focus\:bg-pink-500:focus{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.focus\:bg-pink-600:focus{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.focus\:bg-pink-700:focus{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.focus\:bg-pink-800:focus{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.focus\:bg-pink-900:focus{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.bg-none{background-image:none}.bg-gradient-to-t{background-image:linear-gradient(to top,var(--gradient-color-stops))}.bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--gradient-color-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--gradient-color-stops))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--gradient-color-stops))}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--gradient-color-stops))}.bg-gradient-to-bl{background-image:linear-gradient(to bottom left,var(--gradient-color-stops))}.bg-gradient-to-l{background-image:linear-gradient(to left,var(--gradient-color-stops))}.bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--gradient-color-stops))}.from-transparent{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.from-current{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.from-black{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.from-white{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.from-gray-100{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.from-gray-200{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.from-gray-300{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.from-gray-400{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.from-gray-500{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.from-gray-600{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.from-gray-700{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.from-gray-800{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.from-gray-900{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.from-red-100{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.from-red-200{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.from-red-300{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.from-red-400{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.from-red-500{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.from-red-600{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.from-red-700{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.from-red-800{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.from-red-900{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.from-orange-100{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.from-orange-200{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.from-orange-300{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.from-orange-400{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.from-orange-500{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.from-orange-600{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.from-orange-700{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.from-orange-800{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.from-orange-900{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.from-yellow-100{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.from-yellow-200{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.from-yellow-300{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.from-yellow-400{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.from-yellow-500{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.from-yellow-600{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.from-yellow-700{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.from-yellow-800{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.from-yellow-900{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.from-green-100{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.from-green-200{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.from-green-300{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.from-green-400{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.from-green-500{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.from-green-600{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.from-green-700{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.from-green-800{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.from-green-900{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.from-teal-100{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.from-teal-200{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.from-teal-300{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.from-teal-400{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.from-teal-500{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.from-teal-600{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.from-teal-700{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.from-teal-800{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.from-teal-900{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.from-blue-100{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.from-blue-200{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.from-blue-300{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.from-blue-400{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.from-blue-500{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.from-blue-600{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.from-blue-700{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.from-blue-800{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.from-blue-900{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.from-indigo-100{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.from-indigo-200{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.from-indigo-300{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.from-indigo-400{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.from-indigo-500{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.from-indigo-600{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.from-indigo-700{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.from-indigo-800{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.from-indigo-900{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.from-purple-100{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.from-purple-200{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.from-purple-300{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.from-purple-400{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.from-purple-500{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.from-purple-600{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.from-purple-700{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.from-purple-800{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.from-purple-900{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.from-pink-100{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.from-pink-200{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.from-pink-300{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.from-pink-400{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.from-pink-500{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.from-pink-600{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.from-pink-700{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.from-pink-800{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.from-pink-900{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.via-transparent{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.via-current{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.via-black{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.via-white{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.via-gray-100{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.via-gray-200{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.via-gray-300{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.via-gray-400{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.via-gray-500{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.via-gray-600{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.via-gray-700{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.via-gray-800{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.via-gray-900{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.via-red-100{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.via-red-200{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.via-red-300{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.via-red-400{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.via-red-500{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.via-red-600{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.via-red-700{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.via-red-800{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.via-red-900{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.via-orange-100{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.via-orange-200{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.via-orange-300{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.via-orange-400{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.via-orange-500{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.via-orange-600{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.via-orange-700{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.via-orange-800{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.via-orange-900{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.via-yellow-100{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.via-yellow-200{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.via-yellow-300{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.via-yellow-400{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.via-yellow-500{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.via-yellow-600{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.via-yellow-700{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.via-yellow-800{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.via-yellow-900{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.via-green-100{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.via-green-200{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.via-green-300{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.via-green-400{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.via-green-500{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.via-green-600{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.via-green-700{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.via-green-800{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.via-green-900{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.via-teal-100{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.via-teal-200{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.via-teal-300{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.via-teal-400{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.via-teal-500{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.via-teal-600{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.via-teal-700{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.via-teal-800{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.via-teal-900{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.via-blue-100{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.via-blue-200{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.via-blue-300{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.via-blue-400{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.via-blue-500{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.via-blue-600{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.via-blue-700{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.via-blue-800{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.via-blue-900{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.via-indigo-100{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.via-indigo-200{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.via-indigo-300{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.via-indigo-400{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.via-indigo-500{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.via-indigo-600{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.via-indigo-700{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.via-indigo-800{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.via-indigo-900{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.via-purple-100{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.via-purple-200{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.via-purple-300{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.via-purple-400{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.via-purple-500{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.via-purple-600{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.via-purple-700{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.via-purple-800{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.via-purple-900{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.via-pink-100{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.via-pink-200{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.via-pink-300{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.via-pink-400{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.via-pink-500{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.via-pink-600{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.via-pink-700{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.via-pink-800{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.via-pink-900{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.to-transparent{--gradient-to-color:transparent}.to-current{--gradient-to-color:currentColor}.to-black{--gradient-to-color:#000}.to-white{--gradient-to-color:#fff}.to-gray-100{--gradient-to-color:#f7fafc}.to-gray-200{--gradient-to-color:#edf2f7}.to-gray-300{--gradient-to-color:#e2e8f0}.to-gray-400{--gradient-to-color:#cbd5e0}.to-gray-500{--gradient-to-color:#a0aec0}.to-gray-600{--gradient-to-color:#718096}.to-gray-700{--gradient-to-color:#4a5568}.to-gray-800{--gradient-to-color:#2d3748}.to-gray-900{--gradient-to-color:#1a202c}.to-red-100{--gradient-to-color:#fff5f5}.to-red-200{--gradient-to-color:#fed7d7}.to-red-300{--gradient-to-color:#feb2b2}.to-red-400{--gradient-to-color:#fc8181}.to-red-500{--gradient-to-color:#f56565}.to-red-600{--gradient-to-color:#e53e3e}.to-red-700{--gradient-to-color:#c53030}.to-red-800{--gradient-to-color:#9b2c2c}.to-red-900{--gradient-to-color:#742a2a}.to-orange-100{--gradient-to-color:#fffaf0}.to-orange-200{--gradient-to-color:#feebc8}.to-orange-300{--gradient-to-color:#fbd38d}.to-orange-400{--gradient-to-color:#f6ad55}.to-orange-500{--gradient-to-color:#ed8936}.to-orange-600{--gradient-to-color:#dd6b20}.to-orange-700{--gradient-to-color:#c05621}.to-orange-800{--gradient-to-color:#9c4221}.to-orange-900{--gradient-to-color:#7b341e}.to-yellow-100{--gradient-to-color:#fffff0}.to-yellow-200{--gradient-to-color:#fefcbf}.to-yellow-300{--gradient-to-color:#faf089}.to-yellow-400{--gradient-to-color:#f6e05e}.to-yellow-500{--gradient-to-color:#ecc94b}.to-yellow-600{--gradient-to-color:#d69e2e}.to-yellow-700{--gradient-to-color:#b7791f}.to-yellow-800{--gradient-to-color:#975a16}.to-yellow-900{--gradient-to-color:#744210}.to-green-100{--gradient-to-color:#f0fff4}.to-green-200{--gradient-to-color:#c6f6d5}.to-green-300{--gradient-to-color:#9ae6b4}.to-green-400{--gradient-to-color:#68d391}.to-green-500{--gradient-to-color:#48bb78}.to-green-600{--gradient-to-color:#38a169}.to-green-700{--gradient-to-color:#2f855a}.to-green-800{--gradient-to-color:#276749}.to-green-900{--gradient-to-color:#22543d}.to-teal-100{--gradient-to-color:#e6fffa}.to-teal-200{--gradient-to-color:#b2f5ea}.to-teal-300{--gradient-to-color:#81e6d9}.to-teal-400{--gradient-to-color:#4fd1c5}.to-teal-500{--gradient-to-color:#38b2ac}.to-teal-600{--gradient-to-color:#319795}.to-teal-700{--gradient-to-color:#2c7a7b}.to-teal-800{--gradient-to-color:#285e61}.to-teal-900{--gradient-to-color:#234e52}.to-blue-100{--gradient-to-color:#ebf8ff}.to-blue-200{--gradient-to-color:#bee3f8}.to-blue-300{--gradient-to-color:#90cdf4}.to-blue-400{--gradient-to-color:#63b3ed}.to-blue-500{--gradient-to-color:#4299e1}.to-blue-600{--gradient-to-color:#3182ce}.to-blue-700{--gradient-to-color:#2b6cb0}.to-blue-800{--gradient-to-color:#2c5282}.to-blue-900{--gradient-to-color:#2a4365}.to-indigo-100{--gradient-to-color:#ebf4ff}.to-indigo-200{--gradient-to-color:#c3dafe}.to-indigo-300{--gradient-to-color:#a3bffa}.to-indigo-400{--gradient-to-color:#7f9cf5}.to-indigo-500{--gradient-to-color:#667eea}.to-indigo-600{--gradient-to-color:#5a67d8}.to-indigo-700{--gradient-to-color:#4c51bf}.to-indigo-800{--gradient-to-color:#434190}.to-indigo-900{--gradient-to-color:#3c366b}.to-purple-100{--gradient-to-color:#faf5ff}.to-purple-200{--gradient-to-color:#e9d8fd}.to-purple-300{--gradient-to-color:#d6bcfa}.to-purple-400{--gradient-to-color:#b794f4}.to-purple-500{--gradient-to-color:#9f7aea}.to-purple-600{--gradient-to-color:#805ad5}.to-purple-700{--gradient-to-color:#6b46c1}.to-purple-800{--gradient-to-color:#553c9a}.to-purple-900{--gradient-to-color:#44337a}.to-pink-100{--gradient-to-color:#fff5f7}.to-pink-200{--gradient-to-color:#fed7e2}.to-pink-300{--gradient-to-color:#fbb6ce}.to-pink-400{--gradient-to-color:#f687b3}.to-pink-500{--gradient-to-color:#ed64a6}.to-pink-600{--gradient-to-color:#d53f8c}.to-pink-700{--gradient-to-color:#b83280}.to-pink-800{--gradient-to-color:#97266d}.to-pink-900{--gradient-to-color:#702459}.hover\:from-transparent:hover{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.hover\:from-current:hover{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.hover\:from-black:hover{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.hover\:from-white:hover{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.hover\:from-gray-100:hover{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.hover\:from-gray-200:hover{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.hover\:from-gray-300:hover{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.hover\:from-gray-400:hover{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.hover\:from-gray-500:hover{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.hover\:from-gray-600:hover{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.hover\:from-gray-700:hover{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.hover\:from-gray-800:hover{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.hover\:from-gray-900:hover{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.hover\:from-red-100:hover{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.hover\:from-red-200:hover{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.hover\:from-red-300:hover{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.hover\:from-red-400:hover{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.hover\:from-red-500:hover{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.hover\:from-red-600:hover{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.hover\:from-red-700:hover{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.hover\:from-red-800:hover{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.hover\:from-red-900:hover{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.hover\:from-orange-100:hover{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.hover\:from-orange-200:hover{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.hover\:from-orange-300:hover{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.hover\:from-orange-400:hover{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.hover\:from-orange-500:hover{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.hover\:from-orange-600:hover{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.hover\:from-orange-700:hover{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.hover\:from-orange-800:hover{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.hover\:from-orange-900:hover{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.hover\:from-yellow-100:hover{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.hover\:from-yellow-200:hover{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.hover\:from-yellow-300:hover{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.hover\:from-yellow-400:hover{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.hover\:from-yellow-500:hover{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.hover\:from-yellow-600:hover{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.hover\:from-yellow-700:hover{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.hover\:from-yellow-800:hover{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.hover\:from-yellow-900:hover{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.hover\:from-green-100:hover{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.hover\:from-green-200:hover{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.hover\:from-green-300:hover{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.hover\:from-green-400:hover{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.hover\:from-green-500:hover{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.hover\:from-green-600:hover{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.hover\:from-green-700:hover{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.hover\:from-green-800:hover{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.hover\:from-green-900:hover{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.hover\:from-teal-100:hover{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.hover\:from-teal-200:hover{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.hover\:from-teal-300:hover{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.hover\:from-teal-400:hover{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.hover\:from-teal-500:hover{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.hover\:from-teal-600:hover{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.hover\:from-teal-700:hover{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.hover\:from-teal-800:hover{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.hover\:from-teal-900:hover{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.hover\:from-blue-100:hover{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.hover\:from-blue-200:hover{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.hover\:from-blue-300:hover{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.hover\:from-blue-400:hover{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.hover\:from-blue-500:hover{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.hover\:from-blue-600:hover{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.hover\:from-blue-700:hover{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.hover\:from-blue-800:hover{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.hover\:from-blue-900:hover{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.hover\:from-indigo-100:hover{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.hover\:from-indigo-200:hover{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.hover\:from-indigo-300:hover{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.hover\:from-indigo-400:hover{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.hover\:from-indigo-500:hover{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.hover\:from-indigo-600:hover{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.hover\:from-indigo-700:hover{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.hover\:from-indigo-800:hover{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.hover\:from-indigo-900:hover{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.hover\:from-purple-100:hover{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.hover\:from-purple-200:hover{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.hover\:from-purple-300:hover{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.hover\:from-purple-400:hover{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.hover\:from-purple-500:hover{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.hover\:from-purple-600:hover{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.hover\:from-purple-700:hover{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.hover\:from-purple-800:hover{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.hover\:from-purple-900:hover{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.hover\:from-pink-100:hover{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.hover\:from-pink-200:hover{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.hover\:from-pink-300:hover{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.hover\:from-pink-400:hover{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.hover\:from-pink-500:hover{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.hover\:from-pink-600:hover{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.hover\:from-pink-700:hover{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.hover\:from-pink-800:hover{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.hover\:from-pink-900:hover{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.hover\:via-transparent:hover{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.hover\:via-current:hover{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.hover\:via-black:hover{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.hover\:via-white:hover{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.hover\:via-gray-100:hover{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.hover\:via-gray-200:hover{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.hover\:via-gray-300:hover{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.hover\:via-gray-400:hover{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.hover\:via-gray-500:hover{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.hover\:via-gray-600:hover{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.hover\:via-gray-700:hover{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.hover\:via-gray-800:hover{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.hover\:via-gray-900:hover{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.hover\:via-red-100:hover{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.hover\:via-red-200:hover{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.hover\:via-red-300:hover{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.hover\:via-red-400:hover{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.hover\:via-red-500:hover{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.hover\:via-red-600:hover{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.hover\:via-red-700:hover{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.hover\:via-red-800:hover{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.hover\:via-red-900:hover{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.hover\:via-orange-100:hover{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.hover\:via-orange-200:hover{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.hover\:via-orange-300:hover{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.hover\:via-orange-400:hover{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.hover\:via-orange-500:hover{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.hover\:via-orange-600:hover{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.hover\:via-orange-700:hover{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.hover\:via-orange-800:hover{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.hover\:via-orange-900:hover{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.hover\:via-yellow-100:hover{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.hover\:via-yellow-200:hover{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.hover\:via-yellow-300:hover{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.hover\:via-yellow-400:hover{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.hover\:via-yellow-500:hover{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.hover\:via-yellow-600:hover{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.hover\:via-yellow-700:hover{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.hover\:via-yellow-800:hover{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.hover\:via-yellow-900:hover{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.hover\:via-green-100:hover{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.hover\:via-green-200:hover{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.hover\:via-green-300:hover{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.hover\:via-green-400:hover{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.hover\:via-green-500:hover{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.hover\:via-green-600:hover{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.hover\:via-green-700:hover{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.hover\:via-green-800:hover{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.hover\:via-green-900:hover{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.hover\:via-teal-100:hover{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.hover\:via-teal-200:hover{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.hover\:via-teal-300:hover{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.hover\:via-teal-400:hover{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.hover\:via-teal-500:hover{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.hover\:via-teal-600:hover{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.hover\:via-teal-700:hover{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.hover\:via-teal-800:hover{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.hover\:via-teal-900:hover{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.hover\:via-blue-100:hover{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.hover\:via-blue-200:hover{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.hover\:via-blue-300:hover{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.hover\:via-blue-400:hover{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.hover\:via-blue-500:hover{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.hover\:via-blue-600:hover{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.hover\:via-blue-700:hover{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.hover\:via-blue-800:hover{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.hover\:via-blue-900:hover{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.hover\:via-indigo-100:hover{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.hover\:via-indigo-200:hover{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.hover\:via-indigo-300:hover{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.hover\:via-indigo-400:hover{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.hover\:via-indigo-500:hover{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.hover\:via-indigo-600:hover{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.hover\:via-indigo-700:hover{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.hover\:via-indigo-800:hover{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.hover\:via-indigo-900:hover{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.hover\:via-purple-100:hover{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.hover\:via-purple-200:hover{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.hover\:via-purple-300:hover{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.hover\:via-purple-400:hover{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.hover\:via-purple-500:hover{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.hover\:via-purple-600:hover{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.hover\:via-purple-700:hover{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.hover\:via-purple-800:hover{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.hover\:via-purple-900:hover{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.hover\:via-pink-100:hover{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.hover\:via-pink-200:hover{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.hover\:via-pink-300:hover{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.hover\:via-pink-400:hover{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.hover\:via-pink-500:hover{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.hover\:via-pink-600:hover{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.hover\:via-pink-700:hover{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.hover\:via-pink-800:hover{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.hover\:via-pink-900:hover{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.hover\:to-transparent:hover{--gradient-to-color:transparent}.hover\:to-current:hover{--gradient-to-color:currentColor}.hover\:to-black:hover{--gradient-to-color:#000}.hover\:to-white:hover{--gradient-to-color:#fff}.hover\:to-gray-100:hover{--gradient-to-color:#f7fafc}.hover\:to-gray-200:hover{--gradient-to-color:#edf2f7}.hover\:to-gray-300:hover{--gradient-to-color:#e2e8f0}.hover\:to-gray-400:hover{--gradient-to-color:#cbd5e0}.hover\:to-gray-500:hover{--gradient-to-color:#a0aec0}.hover\:to-gray-600:hover{--gradient-to-color:#718096}.hover\:to-gray-700:hover{--gradient-to-color:#4a5568}.hover\:to-gray-800:hover{--gradient-to-color:#2d3748}.hover\:to-gray-900:hover{--gradient-to-color:#1a202c}.hover\:to-red-100:hover{--gradient-to-color:#fff5f5}.hover\:to-red-200:hover{--gradient-to-color:#fed7d7}.hover\:to-red-300:hover{--gradient-to-color:#feb2b2}.hover\:to-red-400:hover{--gradient-to-color:#fc8181}.hover\:to-red-500:hover{--gradient-to-color:#f56565}.hover\:to-red-600:hover{--gradient-to-color:#e53e3e}.hover\:to-red-700:hover{--gradient-to-color:#c53030}.hover\:to-red-800:hover{--gradient-to-color:#9b2c2c}.hover\:to-red-900:hover{--gradient-to-color:#742a2a}.hover\:to-orange-100:hover{--gradient-to-color:#fffaf0}.hover\:to-orange-200:hover{--gradient-to-color:#feebc8}.hover\:to-orange-300:hover{--gradient-to-color:#fbd38d}.hover\:to-orange-400:hover{--gradient-to-color:#f6ad55}.hover\:to-orange-500:hover{--gradient-to-color:#ed8936}.hover\:to-orange-600:hover{--gradient-to-color:#dd6b20}.hover\:to-orange-700:hover{--gradient-to-color:#c05621}.hover\:to-orange-800:hover{--gradient-to-color:#9c4221}.hover\:to-orange-900:hover{--gradient-to-color:#7b341e}.hover\:to-yellow-100:hover{--gradient-to-color:#fffff0}.hover\:to-yellow-200:hover{--gradient-to-color:#fefcbf}.hover\:to-yellow-300:hover{--gradient-to-color:#faf089}.hover\:to-yellow-400:hover{--gradient-to-color:#f6e05e}.hover\:to-yellow-500:hover{--gradient-to-color:#ecc94b}.hover\:to-yellow-600:hover{--gradient-to-color:#d69e2e}.hover\:to-yellow-700:hover{--gradient-to-color:#b7791f}.hover\:to-yellow-800:hover{--gradient-to-color:#975a16}.hover\:to-yellow-900:hover{--gradient-to-color:#744210}.hover\:to-green-100:hover{--gradient-to-color:#f0fff4}.hover\:to-green-200:hover{--gradient-to-color:#c6f6d5}.hover\:to-green-300:hover{--gradient-to-color:#9ae6b4}.hover\:to-green-400:hover{--gradient-to-color:#68d391}.hover\:to-green-500:hover{--gradient-to-color:#48bb78}.hover\:to-green-600:hover{--gradient-to-color:#38a169}.hover\:to-green-700:hover{--gradient-to-color:#2f855a}.hover\:to-green-800:hover{--gradient-to-color:#276749}.hover\:to-green-900:hover{--gradient-to-color:#22543d}.hover\:to-teal-100:hover{--gradient-to-color:#e6fffa}.hover\:to-teal-200:hover{--gradient-to-color:#b2f5ea}.hover\:to-teal-300:hover{--gradient-to-color:#81e6d9}.hover\:to-teal-400:hover{--gradient-to-color:#4fd1c5}.hover\:to-teal-500:hover{--gradient-to-color:#38b2ac}.hover\:to-teal-600:hover{--gradient-to-color:#319795}.hover\:to-teal-700:hover{--gradient-to-color:#2c7a7b}.hover\:to-teal-800:hover{--gradient-to-color:#285e61}.hover\:to-teal-900:hover{--gradient-to-color:#234e52}.hover\:to-blue-100:hover{--gradient-to-color:#ebf8ff}.hover\:to-blue-200:hover{--gradient-to-color:#bee3f8}.hover\:to-blue-300:hover{--gradient-to-color:#90cdf4}.hover\:to-blue-400:hover{--gradient-to-color:#63b3ed}.hover\:to-blue-500:hover{--gradient-to-color:#4299e1}.hover\:to-blue-600:hover{--gradient-to-color:#3182ce}.hover\:to-blue-700:hover{--gradient-to-color:#2b6cb0}.hover\:to-blue-800:hover{--gradient-to-color:#2c5282}.hover\:to-blue-900:hover{--gradient-to-color:#2a4365}.hover\:to-indigo-100:hover{--gradient-to-color:#ebf4ff}.hover\:to-indigo-200:hover{--gradient-to-color:#c3dafe}.hover\:to-indigo-300:hover{--gradient-to-color:#a3bffa}.hover\:to-indigo-400:hover{--gradient-to-color:#7f9cf5}.hover\:to-indigo-500:hover{--gradient-to-color:#667eea}.hover\:to-indigo-600:hover{--gradient-to-color:#5a67d8}.hover\:to-indigo-700:hover{--gradient-to-color:#4c51bf}.hover\:to-indigo-800:hover{--gradient-to-color:#434190}.hover\:to-indigo-900:hover{--gradient-to-color:#3c366b}.hover\:to-purple-100:hover{--gradient-to-color:#faf5ff}.hover\:to-purple-200:hover{--gradient-to-color:#e9d8fd}.hover\:to-purple-300:hover{--gradient-to-color:#d6bcfa}.hover\:to-purple-400:hover{--gradient-to-color:#b794f4}.hover\:to-purple-500:hover{--gradient-to-color:#9f7aea}.hover\:to-purple-600:hover{--gradient-to-color:#805ad5}.hover\:to-purple-700:hover{--gradient-to-color:#6b46c1}.hover\:to-purple-800:hover{--gradient-to-color:#553c9a}.hover\:to-purple-900:hover{--gradient-to-color:#44337a}.hover\:to-pink-100:hover{--gradient-to-color:#fff5f7}.hover\:to-pink-200:hover{--gradient-to-color:#fed7e2}.hover\:to-pink-300:hover{--gradient-to-color:#fbb6ce}.hover\:to-pink-400:hover{--gradient-to-color:#f687b3}.hover\:to-pink-500:hover{--gradient-to-color:#ed64a6}.hover\:to-pink-600:hover{--gradient-to-color:#d53f8c}.hover\:to-pink-700:hover{--gradient-to-color:#b83280}.hover\:to-pink-800:hover{--gradient-to-color:#97266d}.hover\:to-pink-900:hover{--gradient-to-color:#702459}.focus\:from-transparent:focus{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.focus\:from-current:focus{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.focus\:from-black:focus{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.focus\:from-white:focus{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.focus\:from-gray-100:focus{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.focus\:from-gray-200:focus{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.focus\:from-gray-300:focus{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.focus\:from-gray-400:focus{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.focus\:from-gray-500:focus{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.focus\:from-gray-600:focus{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.focus\:from-gray-700:focus{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.focus\:from-gray-800:focus{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.focus\:from-gray-900:focus{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.focus\:from-red-100:focus{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.focus\:from-red-200:focus{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.focus\:from-red-300:focus{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.focus\:from-red-400:focus{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.focus\:from-red-500:focus{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.focus\:from-red-600:focus{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.focus\:from-red-700:focus{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.focus\:from-red-800:focus{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.focus\:from-red-900:focus{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.focus\:from-orange-100:focus{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.focus\:from-orange-200:focus{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.focus\:from-orange-300:focus{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.focus\:from-orange-400:focus{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.focus\:from-orange-500:focus{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.focus\:from-orange-600:focus{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.focus\:from-orange-700:focus{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.focus\:from-orange-800:focus{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.focus\:from-orange-900:focus{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.focus\:from-yellow-100:focus{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.focus\:from-yellow-200:focus{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.focus\:from-yellow-300:focus{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.focus\:from-yellow-400:focus{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.focus\:from-yellow-500:focus{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.focus\:from-yellow-600:focus{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.focus\:from-yellow-700:focus{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.focus\:from-yellow-800:focus{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.focus\:from-yellow-900:focus{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.focus\:from-green-100:focus{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.focus\:from-green-200:focus{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.focus\:from-green-300:focus{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.focus\:from-green-400:focus{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.focus\:from-green-500:focus{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.focus\:from-green-600:focus{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.focus\:from-green-700:focus{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.focus\:from-green-800:focus{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.focus\:from-green-900:focus{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.focus\:from-teal-100:focus{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.focus\:from-teal-200:focus{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.focus\:from-teal-300:focus{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.focus\:from-teal-400:focus{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.focus\:from-teal-500:focus{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.focus\:from-teal-600:focus{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.focus\:from-teal-700:focus{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.focus\:from-teal-800:focus{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.focus\:from-teal-900:focus{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.focus\:from-blue-100:focus{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.focus\:from-blue-200:focus{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.focus\:from-blue-300:focus{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.focus\:from-blue-400:focus{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.focus\:from-blue-500:focus{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.focus\:from-blue-600:focus{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.focus\:from-blue-700:focus{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.focus\:from-blue-800:focus{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.focus\:from-blue-900:focus{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.focus\:from-indigo-100:focus{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.focus\:from-indigo-200:focus{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.focus\:from-indigo-300:focus{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.focus\:from-indigo-400:focus{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.focus\:from-indigo-500:focus{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.focus\:from-indigo-600:focus{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.focus\:from-indigo-700:focus{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.focus\:from-indigo-800:focus{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.focus\:from-indigo-900:focus{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.focus\:from-purple-100:focus{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.focus\:from-purple-200:focus{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.focus\:from-purple-300:focus{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.focus\:from-purple-400:focus{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.focus\:from-purple-500:focus{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.focus\:from-purple-600:focus{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.focus\:from-purple-700:focus{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.focus\:from-purple-800:focus{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.focus\:from-purple-900:focus{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.focus\:from-pink-100:focus{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.focus\:from-pink-200:focus{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.focus\:from-pink-300:focus{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.focus\:from-pink-400:focus{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.focus\:from-pink-500:focus{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.focus\:from-pink-600:focus{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.focus\:from-pink-700:focus{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.focus\:from-pink-800:focus{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.focus\:from-pink-900:focus{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.focus\:via-transparent:focus{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.focus\:via-current:focus{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.focus\:via-black:focus{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.focus\:via-white:focus{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.focus\:via-gray-100:focus{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.focus\:via-gray-200:focus{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.focus\:via-gray-300:focus{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.focus\:via-gray-400:focus{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.focus\:via-gray-500:focus{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.focus\:via-gray-600:focus{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.focus\:via-gray-700:focus{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.focus\:via-gray-800:focus{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.focus\:via-gray-900:focus{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.focus\:via-red-100:focus{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.focus\:via-red-200:focus{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.focus\:via-red-300:focus{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.focus\:via-red-400:focus{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.focus\:via-red-500:focus{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.focus\:via-red-600:focus{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.focus\:via-red-700:focus{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.focus\:via-red-800:focus{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.focus\:via-red-900:focus{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.focus\:via-orange-100:focus{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.focus\:via-orange-200:focus{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.focus\:via-orange-300:focus{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.focus\:via-orange-400:focus{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.focus\:via-orange-500:focus{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.focus\:via-orange-600:focus{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.focus\:via-orange-700:focus{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.focus\:via-orange-800:focus{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.focus\:via-orange-900:focus{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.focus\:via-yellow-100:focus{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.focus\:via-yellow-200:focus{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.focus\:via-yellow-300:focus{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.focus\:via-yellow-400:focus{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.focus\:via-yellow-500:focus{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.focus\:via-yellow-600:focus{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.focus\:via-yellow-700:focus{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.focus\:via-yellow-800:focus{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.focus\:via-yellow-900:focus{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.focus\:via-green-100:focus{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.focus\:via-green-200:focus{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.focus\:via-green-300:focus{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.focus\:via-green-400:focus{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.focus\:via-green-500:focus{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.focus\:via-green-600:focus{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.focus\:via-green-700:focus{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.focus\:via-green-800:focus{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.focus\:via-green-900:focus{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.focus\:via-teal-100:focus{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.focus\:via-teal-200:focus{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.focus\:via-teal-300:focus{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.focus\:via-teal-400:focus{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.focus\:via-teal-500:focus{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.focus\:via-teal-600:focus{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.focus\:via-teal-700:focus{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.focus\:via-teal-800:focus{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.focus\:via-teal-900:focus{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.focus\:via-blue-100:focus{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.focus\:via-blue-200:focus{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.focus\:via-blue-300:focus{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.focus\:via-blue-400:focus{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.focus\:via-blue-500:focus{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.focus\:via-blue-600:focus{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.focus\:via-blue-700:focus{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.focus\:via-blue-800:focus{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.focus\:via-blue-900:focus{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.focus\:via-indigo-100:focus{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.focus\:via-indigo-200:focus{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.focus\:via-indigo-300:focus{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.focus\:via-indigo-400:focus{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.focus\:via-indigo-500:focus{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.focus\:via-indigo-600:focus{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.focus\:via-indigo-700:focus{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.focus\:via-indigo-800:focus{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.focus\:via-indigo-900:focus{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.focus\:via-purple-100:focus{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.focus\:via-purple-200:focus{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.focus\:via-purple-300:focus{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.focus\:via-purple-400:focus{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.focus\:via-purple-500:focus{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.focus\:via-purple-600:focus{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.focus\:via-purple-700:focus{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.focus\:via-purple-800:focus{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.focus\:via-purple-900:focus{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.focus\:via-pink-100:focus{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.focus\:via-pink-200:focus{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.focus\:via-pink-300:focus{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.focus\:via-pink-400:focus{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.focus\:via-pink-500:focus{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.focus\:via-pink-600:focus{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.focus\:via-pink-700:focus{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.focus\:via-pink-800:focus{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.focus\:via-pink-900:focus{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.focus\:to-transparent:focus{--gradient-to-color:transparent}.focus\:to-current:focus{--gradient-to-color:currentColor}.focus\:to-black:focus{--gradient-to-color:#000}.focus\:to-white:focus{--gradient-to-color:#fff}.focus\:to-gray-100:focus{--gradient-to-color:#f7fafc}.focus\:to-gray-200:focus{--gradient-to-color:#edf2f7}.focus\:to-gray-300:focus{--gradient-to-color:#e2e8f0}.focus\:to-gray-400:focus{--gradient-to-color:#cbd5e0}.focus\:to-gray-500:focus{--gradient-to-color:#a0aec0}.focus\:to-gray-600:focus{--gradient-to-color:#718096}.focus\:to-gray-700:focus{--gradient-to-color:#4a5568}.focus\:to-gray-800:focus{--gradient-to-color:#2d3748}.focus\:to-gray-900:focus{--gradient-to-color:#1a202c}.focus\:to-red-100:focus{--gradient-to-color:#fff5f5}.focus\:to-red-200:focus{--gradient-to-color:#fed7d7}.focus\:to-red-300:focus{--gradient-to-color:#feb2b2}.focus\:to-red-400:focus{--gradient-to-color:#fc8181}.focus\:to-red-500:focus{--gradient-to-color:#f56565}.focus\:to-red-600:focus{--gradient-to-color:#e53e3e}.focus\:to-red-700:focus{--gradient-to-color:#c53030}.focus\:to-red-800:focus{--gradient-to-color:#9b2c2c}.focus\:to-red-900:focus{--gradient-to-color:#742a2a}.focus\:to-orange-100:focus{--gradient-to-color:#fffaf0}.focus\:to-orange-200:focus{--gradient-to-color:#feebc8}.focus\:to-orange-300:focus{--gradient-to-color:#fbd38d}.focus\:to-orange-400:focus{--gradient-to-color:#f6ad55}.focus\:to-orange-500:focus{--gradient-to-color:#ed8936}.focus\:to-orange-600:focus{--gradient-to-color:#dd6b20}.focus\:to-orange-700:focus{--gradient-to-color:#c05621}.focus\:to-orange-800:focus{--gradient-to-color:#9c4221}.focus\:to-orange-900:focus{--gradient-to-color:#7b341e}.focus\:to-yellow-100:focus{--gradient-to-color:#fffff0}.focus\:to-yellow-200:focus{--gradient-to-color:#fefcbf}.focus\:to-yellow-300:focus{--gradient-to-color:#faf089}.focus\:to-yellow-400:focus{--gradient-to-color:#f6e05e}.focus\:to-yellow-500:focus{--gradient-to-color:#ecc94b}.focus\:to-yellow-600:focus{--gradient-to-color:#d69e2e}.focus\:to-yellow-700:focus{--gradient-to-color:#b7791f}.focus\:to-yellow-800:focus{--gradient-to-color:#975a16}.focus\:to-yellow-900:focus{--gradient-to-color:#744210}.focus\:to-green-100:focus{--gradient-to-color:#f0fff4}.focus\:to-green-200:focus{--gradient-to-color:#c6f6d5}.focus\:to-green-300:focus{--gradient-to-color:#9ae6b4}.focus\:to-green-400:focus{--gradient-to-color:#68d391}.focus\:to-green-500:focus{--gradient-to-color:#48bb78}.focus\:to-green-600:focus{--gradient-to-color:#38a169}.focus\:to-green-700:focus{--gradient-to-color:#2f855a}.focus\:to-green-800:focus{--gradient-to-color:#276749}.focus\:to-green-900:focus{--gradient-to-color:#22543d}.focus\:to-teal-100:focus{--gradient-to-color:#e6fffa}.focus\:to-teal-200:focus{--gradient-to-color:#b2f5ea}.focus\:to-teal-300:focus{--gradient-to-color:#81e6d9}.focus\:to-teal-400:focus{--gradient-to-color:#4fd1c5}.focus\:to-teal-500:focus{--gradient-to-color:#38b2ac}.focus\:to-teal-600:focus{--gradient-to-color:#319795}.focus\:to-teal-700:focus{--gradient-to-color:#2c7a7b}.focus\:to-teal-800:focus{--gradient-to-color:#285e61}.focus\:to-teal-900:focus{--gradient-to-color:#234e52}.focus\:to-blue-100:focus{--gradient-to-color:#ebf8ff}.focus\:to-blue-200:focus{--gradient-to-color:#bee3f8}.focus\:to-blue-300:focus{--gradient-to-color:#90cdf4}.focus\:to-blue-400:focus{--gradient-to-color:#63b3ed}.focus\:to-blue-500:focus{--gradient-to-color:#4299e1}.focus\:to-blue-600:focus{--gradient-to-color:#3182ce}.focus\:to-blue-700:focus{--gradient-to-color:#2b6cb0}.focus\:to-blue-800:focus{--gradient-to-color:#2c5282}.focus\:to-blue-900:focus{--gradient-to-color:#2a4365}.focus\:to-indigo-100:focus{--gradient-to-color:#ebf4ff}.focus\:to-indigo-200:focus{--gradient-to-color:#c3dafe}.focus\:to-indigo-300:focus{--gradient-to-color:#a3bffa}.focus\:to-indigo-400:focus{--gradient-to-color:#7f9cf5}.focus\:to-indigo-500:focus{--gradient-to-color:#667eea}.focus\:to-indigo-600:focus{--gradient-to-color:#5a67d8}.focus\:to-indigo-700:focus{--gradient-to-color:#4c51bf}.focus\:to-indigo-800:focus{--gradient-to-color:#434190}.focus\:to-indigo-900:focus{--gradient-to-color:#3c366b}.focus\:to-purple-100:focus{--gradient-to-color:#faf5ff}.focus\:to-purple-200:focus{--gradient-to-color:#e9d8fd}.focus\:to-purple-300:focus{--gradient-to-color:#d6bcfa}.focus\:to-purple-400:focus{--gradient-to-color:#b794f4}.focus\:to-purple-500:focus{--gradient-to-color:#9f7aea}.focus\:to-purple-600:focus{--gradient-to-color:#805ad5}.focus\:to-purple-700:focus{--gradient-to-color:#6b46c1}.focus\:to-purple-800:focus{--gradient-to-color:#553c9a}.focus\:to-purple-900:focus{--gradient-to-color:#44337a}.focus\:to-pink-100:focus{--gradient-to-color:#fff5f7}.focus\:to-pink-200:focus{--gradient-to-color:#fed7e2}.focus\:to-pink-300:focus{--gradient-to-color:#fbb6ce}.focus\:to-pink-400:focus{--gradient-to-color:#f687b3}.focus\:to-pink-500:focus{--gradient-to-color:#ed64a6}.focus\:to-pink-600:focus{--gradient-to-color:#d53f8c}.focus\:to-pink-700:focus{--gradient-to-color:#b83280}.focus\:to-pink-800:focus{--gradient-to-color:#97266d}.focus\:to-pink-900:focus{--gradient-to-color:#702459}.bg-opacity-0{--bg-opacity:0}.bg-opacity-25{--bg-opacity:0.25}.bg-opacity-50{--bg-opacity:0.5}.bg-opacity-75{--bg-opacity:0.75}.bg-opacity-100{--bg-opacity:1}.hover\:bg-opacity-0:hover{--bg-opacity:0}.hover\:bg-opacity-25:hover{--bg-opacity:0.25}.hover\:bg-opacity-50:hover{--bg-opacity:0.5}.hover\:bg-opacity-75:hover{--bg-opacity:0.75}.hover\:bg-opacity-100:hover{--bg-opacity:1}.focus\:bg-opacity-0:focus{--bg-opacity:0}.focus\:bg-opacity-25:focus{--bg-opacity:0.25}.focus\:bg-opacity-50:focus{--bg-opacity:0.5}.focus\:bg-opacity-75:focus{--bg-opacity:0.75}.focus\:bg-opacity-100:focus{--bg-opacity:1}.bg-bottom{background-position:bottom}.bg-center{background-position:center}.bg-left{background-position:left}.bg-left-bottom{background-position:left bottom}.bg-left-top{background-position:left top}.bg-right{background-position:right}.bg-right-bottom{background-position:right bottom}.bg-right-top{background-position:right top}.bg-top{background-position:top}.bg-repeat{background-repeat:repeat}.bg-no-repeat{background-repeat:no-repeat}.bg-repeat-x{background-repeat:repeat-x}.bg-repeat-y{background-repeat:repeat-y}.bg-repeat-round{background-repeat:round}.bg-repeat-space{background-repeat:space}.bg-auto{background-size:auto}.bg-cover{background-size:cover}.bg-contain{background-size:contain}.border-collapse{border-collapse:collapse}.border-separate{border-collapse:separate}.border-transparent{border-color:transparent}.border-current{border-color:currentColor}.border-black{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.border-white{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.border-gray-100{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.border-gray-300{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.border-gray-400{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.border-gray-500{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.border-gray-600{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.border-gray-800{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.border-gray-900{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.border-red-100{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.border-red-200{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.border-red-300{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.border-red-400{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.border-red-500{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.border-red-600{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.border-red-700{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.border-red-800{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.border-red-900{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.border-orange-100{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.border-orange-200{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.border-orange-300{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.border-orange-400{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.border-orange-500{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.border-orange-600{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.border-orange-700{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.border-orange-800{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.border-orange-900{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.border-yellow-100{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.border-yellow-200{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.border-yellow-300{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.border-yellow-400{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.border-yellow-500{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.border-yellow-600{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.border-yellow-700{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.border-yellow-800{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.border-yellow-900{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.border-green-100{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.border-green-200{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.border-green-300{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.border-green-400{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.border-green-500{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.border-green-600{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.border-green-700{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.border-green-800{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.border-green-900{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.border-teal-100{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.border-teal-200{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.border-teal-300{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.border-teal-400{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.border-teal-500{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.border-teal-600{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.border-teal-700{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.border-teal-800{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.border-teal-900{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.border-blue-100{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.border-blue-200{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.border-blue-300{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.border-blue-400{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.border-blue-500{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.border-blue-600{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.border-blue-700{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.border-blue-800{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.border-blue-900{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.border-indigo-100{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.border-indigo-200{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.border-indigo-300{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.border-indigo-400{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.border-indigo-500{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.border-indigo-600{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.border-indigo-700{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.border-indigo-800{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.border-indigo-900{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.border-purple-100{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.border-purple-200{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.border-purple-300{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.border-purple-400{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.border-purple-500{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.border-purple-600{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.border-purple-700{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.border-purple-800{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.border-purple-900{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.border-pink-100{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.border-pink-200{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.border-pink-300{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.border-pink-400{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.border-pink-500{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.border-pink-600{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.border-pink-700{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.border-pink-800{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.border-pink-900{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.hover\:border-transparent:hover{border-color:transparent}.hover\:border-current:hover{border-color:currentColor}.hover\:border-black:hover{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.hover\:border-white:hover{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.hover\:border-gray-100:hover{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.hover\:border-gray-200:hover{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.hover\:border-gray-300:hover{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.hover\:border-gray-400:hover{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.hover\:border-gray-500:hover{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.hover\:border-gray-600:hover{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.hover\:border-gray-700:hover{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.hover\:border-gray-800:hover{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.hover\:border-gray-900:hover{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.hover\:border-red-100:hover{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.hover\:border-red-200:hover{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.hover\:border-red-300:hover{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.hover\:border-red-400:hover{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.hover\:border-red-500:hover{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.hover\:border-red-600:hover{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.hover\:border-red-700:hover{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.hover\:border-red-800:hover{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.hover\:border-red-900:hover{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.hover\:border-orange-100:hover{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.hover\:border-orange-200:hover{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.hover\:border-orange-300:hover{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.hover\:border-orange-400:hover{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.hover\:border-orange-500:hover{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.hover\:border-orange-600:hover{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.hover\:border-orange-700:hover{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.hover\:border-orange-800:hover{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.hover\:border-orange-900:hover{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.hover\:border-yellow-100:hover{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.hover\:border-yellow-200:hover{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.hover\:border-yellow-300:hover{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.hover\:border-yellow-400:hover{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.hover\:border-yellow-500:hover{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.hover\:border-yellow-600:hover{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.hover\:border-yellow-700:hover{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.hover\:border-yellow-800:hover{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.hover\:border-yellow-900:hover{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.hover\:border-green-100:hover{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.hover\:border-green-200:hover{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.hover\:border-green-300:hover{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.hover\:border-green-400:hover{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.hover\:border-green-500:hover{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.hover\:border-green-600:hover{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.hover\:border-green-700:hover{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.hover\:border-green-800:hover{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.hover\:border-green-900:hover{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.hover\:border-teal-100:hover{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.hover\:border-teal-200:hover{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.hover\:border-teal-300:hover{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.hover\:border-teal-400:hover{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.hover\:border-teal-500:hover{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.hover\:border-teal-600:hover{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.hover\:border-teal-700:hover{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.hover\:border-teal-800:hover{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.hover\:border-teal-900:hover{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.hover\:border-blue-100:hover{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.hover\:border-blue-200:hover{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.hover\:border-blue-300:hover{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.hover\:border-blue-400:hover{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.hover\:border-blue-500:hover{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.hover\:border-blue-600:hover{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.hover\:border-blue-700:hover{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.hover\:border-blue-800:hover{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.hover\:border-blue-900:hover{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.hover\:border-indigo-100:hover{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.hover\:border-indigo-200:hover{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.hover\:border-indigo-300:hover{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.hover\:border-indigo-400:hover{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.hover\:border-indigo-500:hover{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.hover\:border-indigo-600:hover{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.hover\:border-indigo-700:hover{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.hover\:border-indigo-800:hover{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.hover\:border-indigo-900:hover{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.hover\:border-purple-100:hover{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.hover\:border-purple-200:hover{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.hover\:border-purple-300:hover{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.hover\:border-purple-400:hover{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.hover\:border-purple-500:hover{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.hover\:border-purple-600:hover{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.hover\:border-purple-700:hover{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.hover\:border-purple-800:hover{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.hover\:border-purple-900:hover{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.hover\:border-pink-100:hover{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.hover\:border-pink-200:hover{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.hover\:border-pink-300:hover{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.hover\:border-pink-400:hover{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.hover\:border-pink-500:hover{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.hover\:border-pink-600:hover{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.hover\:border-pink-700:hover{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.hover\:border-pink-800:hover{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.hover\:border-pink-900:hover{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.focus\:border-transparent:focus{border-color:transparent}.focus\:border-current:focus{border-color:currentColor}.focus\:border-black:focus{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.focus\:border-white:focus{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.focus\:border-gray-100:focus{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.focus\:border-gray-200:focus{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.focus\:border-gray-300:focus{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.focus\:border-gray-400:focus{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.focus\:border-gray-500:focus{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.focus\:border-gray-600:focus{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.focus\:border-gray-700:focus{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.focus\:border-gray-800:focus{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.focus\:border-gray-900:focus{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.focus\:border-red-100:focus{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.focus\:border-red-200:focus{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.focus\:border-red-300:focus{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.focus\:border-red-400:focus{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.focus\:border-red-500:focus{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.focus\:border-red-600:focus{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.focus\:border-red-700:focus{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.focus\:border-red-800:focus{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.focus\:border-red-900:focus{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.focus\:border-orange-100:focus{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.focus\:border-orange-200:focus{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.focus\:border-orange-300:focus{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.focus\:border-orange-400:focus{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.focus\:border-orange-500:focus{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.focus\:border-orange-600:focus{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.focus\:border-orange-700:focus{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.focus\:border-orange-800:focus{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.focus\:border-orange-900:focus{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.focus\:border-yellow-100:focus{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.focus\:border-yellow-200:focus{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.focus\:border-yellow-300:focus{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.focus\:border-yellow-400:focus{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.focus\:border-yellow-500:focus{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.focus\:border-yellow-600:focus{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.focus\:border-yellow-700:focus{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.focus\:border-yellow-800:focus{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.focus\:border-yellow-900:focus{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.focus\:border-green-100:focus{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.focus\:border-green-200:focus{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.focus\:border-green-300:focus{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.focus\:border-green-400:focus{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.focus\:border-green-500:focus{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.focus\:border-green-600:focus{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.focus\:border-green-700:focus{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.focus\:border-green-800:focus{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.focus\:border-green-900:focus{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.focus\:border-teal-100:focus{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.focus\:border-teal-200:focus{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.focus\:border-teal-300:focus{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.focus\:border-teal-400:focus{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.focus\:border-teal-500:focus{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.focus\:border-teal-600:focus{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.focus\:border-teal-700:focus{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.focus\:border-teal-800:focus{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.focus\:border-teal-900:focus{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.focus\:border-blue-100:focus{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.focus\:border-blue-200:focus{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.focus\:border-blue-300:focus{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.focus\:border-blue-400:focus{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.focus\:border-blue-500:focus{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.focus\:border-blue-600:focus{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.focus\:border-blue-700:focus{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.focus\:border-blue-800:focus{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.focus\:border-blue-900:focus{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.focus\:border-indigo-100:focus{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.focus\:border-indigo-200:focus{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.focus\:border-indigo-300:focus{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.focus\:border-indigo-400:focus{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.focus\:border-indigo-500:focus{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.focus\:border-indigo-600:focus{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.focus\:border-indigo-700:focus{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.focus\:border-indigo-800:focus{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.focus\:border-indigo-900:focus{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.focus\:border-purple-100:focus{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.focus\:border-purple-200:focus{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.focus\:border-purple-300:focus{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.focus\:border-purple-400:focus{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.focus\:border-purple-500:focus{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.focus\:border-purple-600:focus{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.focus\:border-purple-700:focus{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.focus\:border-purple-800:focus{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.focus\:border-purple-900:focus{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.focus\:border-pink-100:focus{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.focus\:border-pink-200:focus{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.focus\:border-pink-300:focus{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.focus\:border-pink-400:focus{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.focus\:border-pink-500:focus{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.focus\:border-pink-600:focus{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.focus\:border-pink-700:focus{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.focus\:border-pink-800:focus{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.focus\:border-pink-900:focus{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.border-opacity-0{--border-opacity:0}.border-opacity-25{--border-opacity:0.25}.border-opacity-50{--border-opacity:0.5}.border-opacity-75{--border-opacity:0.75}.border-opacity-100{--border-opacity:1}.hover\:border-opacity-0:hover{--border-opacity:0}.hover\:border-opacity-25:hover{--border-opacity:0.25}.hover\:border-opacity-50:hover{--border-opacity:0.5}.hover\:border-opacity-75:hover{--border-opacity:0.75}.hover\:border-opacity-100:hover{--border-opacity:1}.focus\:border-opacity-0:focus{--border-opacity:0}.focus\:border-opacity-25:focus{--border-opacity:0.25}.focus\:border-opacity-50:focus{--border-opacity:0.5}.focus\:border-opacity-75:focus{--border-opacity:0.75}.focus\:border-opacity-100:focus{--border-opacity:1}.rounded-none{border-radius:0}.rounded-sm{border-radius:.125rem}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-t-sm{border-top-left-radius:.125rem;border-top-right-radius:.125rem}.rounded-r-sm{border-top-right-radius:.125rem;border-bottom-right-radius:.125rem}.rounded-b-sm{border-bottom-right-radius:.125rem;border-bottom-left-radius:.125rem}.rounded-l-sm{border-top-left-radius:.125rem;border-bottom-left-radius:.125rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.rounded-l-xl{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.rounded-r-2xl{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.rounded-l-2xl{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.rounded-r-3xl{border-top-right-radius:1.5rem;border-bottom-right-radius:1.5rem}.rounded-b-3xl{border-bottom-right-radius:1.5rem;border-bottom-left-radius:1.5rem}.rounded-l-3xl{border-top-left-radius:1.5rem;border-bottom-left-radius:1.5rem}.rounded-t-full{border-top-left-radius:9999px;border-top-right-radius:9999px}.rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.rounded-b-full{border-bottom-right-radius:9999px;border-bottom-left-radius:9999px}.rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.rounded-tl-none{border-top-left-radius:0}.rounded-tr-none{border-top-right-radius:0}.rounded-br-none{border-bottom-right-radius:0}.rounded-bl-none{border-bottom-left-radius:0}.rounded-tl-sm{border-top-left-radius:.125rem}.rounded-tr-sm{border-top-right-radius:.125rem}.rounded-br-sm{border-bottom-right-radius:.125rem}.rounded-bl-sm{border-bottom-left-radius:.125rem}.rounded-tl{border-top-left-radius:.25rem}.rounded-tr{border-top-right-radius:.25rem}.rounded-br{border-bottom-right-radius:.25rem}.rounded-bl{border-bottom-left-radius:.25rem}.rounded-tl-md{border-top-left-radius:.375rem}.rounded-tr-md{border-top-right-radius:.375rem}.rounded-br-md{border-bottom-right-radius:.375rem}.rounded-bl-md{border-bottom-left-radius:.375rem}.rounded-tl-lg{border-top-left-radius:.5rem}.rounded-tr-lg{border-top-right-radius:.5rem}.rounded-br-lg{border-bottom-right-radius:.5rem}.rounded-bl-lg{border-bottom-left-radius:.5rem}.rounded-tl-xl{border-top-left-radius:.75rem}.rounded-tr-xl{border-top-right-radius:.75rem}.rounded-br-xl{border-bottom-right-radius:.75rem}.rounded-bl-xl{border-bottom-left-radius:.75rem}.rounded-tl-2xl{border-top-left-radius:1rem}.rounded-tr-2xl{border-top-right-radius:1rem}.rounded-br-2xl{border-bottom-right-radius:1rem}.rounded-bl-2xl{border-bottom-left-radius:1rem}.rounded-tl-3xl{border-top-left-radius:1.5rem}.rounded-tr-3xl{border-top-right-radius:1.5rem}.rounded-br-3xl{border-bottom-right-radius:1.5rem}.rounded-bl-3xl{border-bottom-left-radius:1.5rem}.rounded-tl-full{border-top-left-radius:9999px}.rounded-tr-full{border-top-right-radius:9999px}.rounded-br-full{border-bottom-right-radius:9999px}.rounded-bl-full{border-bottom-left-radius:9999px}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-dotted{border-style:dotted}.border-double{border-style:double}.border-none{border-style:none}.border-0{border-width:0}.border-2{border-width:2px}.border-4{border-width:4px}.border-8{border-width:8px}.border{border-width:1px}.border-t-0{border-top-width:0}.border-r-0{border-right-width:0}.border-b-0{border-bottom-width:0}.border-l-0{border-left-width:0}.border-t-2{border-top-width:2px}.border-r-2{border-right-width:2px}.border-b-2{border-bottom-width:2px}.border-l-2{border-left-width:2px}.border-t-4{border-top-width:4px}.border-r-4{border-right-width:4px}.border-b-4{border-bottom-width:4px}.border-l-4{border-left-width:4px}.border-t-8{border-top-width:8px}.border-r-8{border-right-width:8px}.border-b-8{border-bottom-width:8px}.border-l-8{border-left-width:8px}.border-t{border-top-width:1px}.border-r{border-right-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.box-border{box-sizing:border-box}.box-content{box-sizing:content-box}.cursor-auto{cursor:auto}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.cursor-wait{cursor:wait}.cursor-text{cursor:text}.cursor-move{cursor:move}.cursor-not-allowed{cursor:not-allowed}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-column{display:table-column}.table-column-group{display:table-column-group}.table-footer-group{display:table-footer-group}.table-header-group{display:table-header-group}.table-row-group{display:table-row-group}.table-row{display:table-row}.flow-root{display:flow-root}.grid{display:grid}.inline-grid{display:inline-grid}.contents{display:contents}.hidden{display:none}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.flex-wrap-reverse{flex-wrap:wrap-reverse}.flex-no-wrap{flex-wrap:nowrap}.place-items-auto{place-items:auto}.place-items-start{place-items:start}.place-items-end{place-items:end}.place-items-center{place-items:center}.place-items-stretch{place-items:stretch}.place-content-center{place-content:center}.place-content-start{place-content:start}.place-content-end{place-content:end}.place-content-between{place-content:space-between}.place-content-around{place-content:space-around}.place-content-evenly{place-content:space-evenly}.place-content-stretch{place-content:stretch}.place-self-auto{place-self:auto}.place-self-start{place-self:start}.place-self-end{place-self:end}.place-self-center{place-self:center}.place-self-stretch{place-self:stretch}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.content-center{align-content:center}.content-start{align-content:flex-start}.content-end{align-content:flex-end}.content-between{align-content:space-between}.content-around{align-content:space-around}.content-evenly{align-content:space-evenly}.self-auto{align-self:auto}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.self-center{align-self:center}.self-stretch{align-self:stretch}.justify-items-auto{justify-items:auto}.justify-items-start{justify-items:start}.justify-items-end{justify-items:end}.justify-items-center{justify-items:center}.justify-items-stretch{justify-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.justify-self-auto{justify-self:auto}.justify-self-start{justify-self:start}.justify-self-end{justify-self:end}.justify-self-center{justify-self:center}.justify-self-stretch{justify-self:stretch}.flex-1{flex:1 1 0%}.flex-auto{flex:1 1 auto}.flex-initial{flex:0 1 auto}.flex-none{flex:none}.flex-grow-0{flex-grow:0}.flex-grow{flex-grow:1}.flex-shrink-0{flex-shrink:0}.flex-shrink{flex-shrink:1}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.order-first{order:-9999}.order-last{order:9999}.order-none{order:0}.float-right{float:right}.float-left{float:left}.float-none{float:none}.clearfix:after{content:"";display:table;clear:both}.clear-left{clear:left}.clear-right{clear:right}.clear-both{clear:both}.clear-none{clear:none}.font-sans{font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.font-serif{font-family:Georgia,Cambria,"Times New Roman",Times,serif}.font-mono{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.font-hairline{font-weight:100}.font-thin{font-weight:200}.font-light{font-weight:300}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-black{font-weight:900}.hover\:font-hairline:hover{font-weight:100}.hover\:font-thin:hover{font-weight:200}.hover\:font-light:hover{font-weight:300}.hover\:font-normal:hover{font-weight:400}.hover\:font-medium:hover{font-weight:500}.hover\:font-semibold:hover{font-weight:600}.hover\:font-bold:hover{font-weight:700}.hover\:font-extrabold:hover{font-weight:800}.hover\:font-black:hover{font-weight:900}.focus\:font-hairline:focus{font-weight:100}.focus\:font-thin:focus{font-weight:200}.focus\:font-light:focus{font-weight:300}.focus\:font-normal:focus{font-weight:400}.focus\:font-medium:focus{font-weight:500}.focus\:font-semibold:focus{font-weight:600}.focus\:font-bold:focus{font-weight:700}.focus\:font-extrabold:focus{font-weight:800}.focus\:font-black:focus{font-weight:900}.h-0{height:0}.h-1{height:.25rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-16{height:4rem}.h-20{height:5rem}.h-24{height:6rem}.h-32{height:8rem}.h-40{height:10rem}.h-48{height:12rem}.h-56{height:14rem}.h-64{height:16rem}.h-auto{height:auto}.h-px{height:1px}.h-full{height:100%}.h-screen{height:100vh}.text-xs{font-size:.75rem}.text-sm{font-size:.875rem}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-2xl{font-size:1.5rem}.text-3xl{font-size:1.875rem}.text-4xl{font-size:2.25rem}.text-5xl{font-size:3rem}.text-6xl{font-size:4rem}.leading-3{line-height:.75rem}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-8{line-height:2rem}.leading-9{line-height:2.25rem}.leading-10{line-height:2.5rem}.leading-none{line-height:1}.leading-tight{line-height:1.25}.leading-snug{line-height:1.375}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.leading-loose{line-height:2}.list-inside{list-style-position:inside}.list-outside{list-style-position:outside}.list-none{list-style-type:none}.list-disc{list-style-type:disc}.list-decimal{list-style-type:decimal}.m-0{margin:0}.m-1{margin:.25rem}.m-2{margin:.5rem}.m-3{margin:.75rem}.m-4{margin:1rem}.m-5{margin:1.25rem}.m-6{margin:1.5rem}.m-8{margin:2rem}.m-10{margin:2.5rem}.m-12{margin:3rem}.m-16{margin:4rem}.m-20{margin:5rem}.m-24{margin:6rem}.m-32{margin:8rem}.m-40{margin:10rem}.m-48{margin:12rem}.m-56{margin:14rem}.m-64{margin:16rem}.m-auto{margin:auto}.m-px{margin:1px}.-m-1{margin:-.25rem}.-m-2{margin:-.5rem}.-m-3{margin:-.75rem}.-m-4{margin:-1rem}.-m-5{margin:-1.25rem}.-m-6{margin:-1.5rem}.-m-8{margin:-2rem}.-m-10{margin:-2.5rem}.-m-12{margin:-3rem}.-m-16{margin:-4rem}.-m-20{margin:-5rem}.-m-24{margin:-6rem}.-m-32{margin:-8rem}.-m-40{margin:-10rem}.-m-48{margin:-12rem}.-m-56{margin:-14rem}.-m-64{margin:-16rem}.-m-px{margin:-1px}.my-0{margin-top:0;margin-bottom:0}.mx-0{margin-left:0;margin-right:0}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.mx-4{margin-left:1rem;margin-right:1rem}.my-5{margin-top:1.25rem;margin-bottom:1.25rem}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.my-8{margin-top:2rem;margin-bottom:2rem}.mx-8{margin-left:2rem;margin-right:2rem}.my-10{margin-top:2.5rem;margin-bottom:2.5rem}.mx-10{margin-left:2.5rem;margin-right:2.5rem}.my-12{margin-top:3rem;margin-bottom:3rem}.mx-12{margin-left:3rem;margin-right:3rem}.my-16{margin-top:4rem;margin-bottom:4rem}.mx-16{margin-left:4rem;margin-right:4rem}.my-20{margin-top:5rem;margin-bottom:5rem}.mx-20{margin-left:5rem;margin-right:5rem}.my-24{margin-top:6rem;margin-bottom:6rem}.mx-24{margin-left:6rem;margin-right:6rem}.my-32{margin-top:8rem;margin-bottom:8rem}.mx-32{margin-left:8rem;margin-right:8rem}.my-40{margin-top:10rem;margin-bottom:10rem}.mx-40{margin-left:10rem;margin-right:10rem}.my-48{margin-top:12rem;margin-bottom:12rem}.mx-48{margin-left:12rem;margin-right:12rem}.my-56{margin-top:14rem;margin-bottom:14rem}.mx-56{margin-left:14rem;margin-right:14rem}.my-64{margin-top:16rem;margin-bottom:16rem}.mx-64{margin-left:16rem;margin-right:16rem}.my-auto{margin-top:auto;margin-bottom:auto}.mx-auto{margin-left:auto;margin-right:auto}.my-px{margin-top:1px;margin-bottom:1px}.mx-px{margin-left:1px;margin-right:1px}.-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.-mx-3{margin-left:-.75rem;margin-right:-.75rem}.-my-4{margin-top:-1rem;margin-bottom:-1rem}.-mx-4{margin-left:-1rem;margin-right:-1rem}.-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.-my-8{margin-top:-2rem;margin-bottom:-2rem}.-mx-8{margin-left:-2rem;margin-right:-2rem}.-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.-my-12{margin-top:-3rem;margin-bottom:-3rem}.-mx-12{margin-left:-3rem;margin-right:-3rem}.-my-16{margin-top:-4rem;margin-bottom:-4rem}.-mx-16{margin-left:-4rem;margin-right:-4rem}.-my-20{margin-top:-5rem;margin-bottom:-5rem}.-mx-20{margin-left:-5rem;margin-right:-5rem}.-my-24{margin-top:-6rem;margin-bottom:-6rem}.-mx-24{margin-left:-6rem;margin-right:-6rem}.-my-32{margin-top:-8rem;margin-bottom:-8rem}.-mx-32{margin-left:-8rem;margin-right:-8rem}.-my-40{margin-top:-10rem;margin-bottom:-10rem}.-mx-40{margin-left:-10rem;margin-right:-10rem}.-my-48{margin-top:-12rem;margin-bottom:-12rem}.-mx-48{margin-left:-12rem;margin-right:-12rem}.-my-56{margin-top:-14rem;margin-bottom:-14rem}.-mx-56{margin-left:-14rem;margin-right:-14rem}.-my-64{margin-top:-16rem;margin-bottom:-16rem}.-mx-64{margin-left:-16rem;margin-right:-16rem}.-my-px{margin-top:-1px;margin-bottom:-1px}.-mx-px{margin-left:-1px;margin-right:-1px}.mt-0{margin-top:0}.mr-0{margin-right:0}.mb-0{margin-bottom:0}.ml-0{margin-left:0}.mt-1{margin-top:.25rem}.mr-1{margin-right:.25rem}.mb-1{margin-bottom:.25rem}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mt-3{margin-top:.75rem}.mr-3{margin-right:.75rem}.mb-3{margin-bottom:.75rem}.ml-3{margin-left:.75rem}.mt-4{margin-top:1rem}.mr-4{margin-right:1rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.mt-5{margin-top:1.25rem}.mr-5{margin-right:1.25rem}.mb-5{margin-bottom:1.25rem}.ml-5{margin-left:1.25rem}.mt-6{margin-top:1.5rem}.mr-6{margin-right:1.5rem}.mb-6{margin-bottom:1.5rem}.ml-6{margin-left:1.5rem}.mt-8{margin-top:2rem}.mr-8{margin-right:2rem}.mb-8{margin-bottom:2rem}.ml-8{margin-left:2rem}.mt-10{margin-top:2.5rem}.mr-10{margin-right:2.5rem}.mb-10{margin-bottom:2.5rem}.ml-10{margin-left:2.5rem}.mt-12{margin-top:3rem}.mr-12{margin-right:3rem}.mb-12{margin-bottom:3rem}.ml-12{margin-left:3rem}.mt-16{margin-top:4rem}.mr-16{margin-right:4rem}.mb-16{margin-bottom:4rem}.ml-16{margin-left:4rem}.mt-20{margin-top:5rem}.mr-20{margin-right:5rem}.mb-20{margin-bottom:5rem}.ml-20{margin-left:5rem}.mt-24{margin-top:6rem}.mr-24{margin-right:6rem}.mb-24{margin-bottom:6rem}.ml-24{margin-left:6rem}.mt-32{margin-top:8rem}.mr-32{margin-right:8rem}.mb-32{margin-bottom:8rem}.ml-32{margin-left:8rem}.mt-40{margin-top:10rem}.mr-40{margin-right:10rem}.mb-40{margin-bottom:10rem}.ml-40{margin-left:10rem}.mt-48{margin-top:12rem}.mr-48{margin-right:12rem}.mb-48{margin-bottom:12rem}.ml-48{margin-left:12rem}.mt-56{margin-top:14rem}.mr-56{margin-right:14rem}.mb-56{margin-bottom:14rem}.ml-56{margin-left:14rem}.mt-64{margin-top:16rem}.mr-64{margin-right:16rem}.mb-64{margin-bottom:16rem}.ml-64{margin-left:16rem}.mt-auto{margin-top:auto}.mr-auto{margin-right:auto}.mb-auto{margin-bottom:auto}.ml-auto{margin-left:auto}.mt-px{margin-top:1px}.mr-px{margin-right:1px}.mb-px{margin-bottom:1px}.ml-px{margin-left:1px}.-mt-1{margin-top:-.25rem}.-mr-1{margin-right:-.25rem}.-mb-1{margin-bottom:-.25rem}.-ml-1{margin-left:-.25rem}.-mt-2{margin-top:-.5rem}.-mr-2{margin-right:-.5rem}.-mb-2{margin-bottom:-.5rem}.-ml-2{margin-left:-.5rem}.-mt-3{margin-top:-.75rem}.-mr-3{margin-right:-.75rem}.-mb-3{margin-bottom:-.75rem}.-ml-3{margin-left:-.75rem}.-mt-4{margin-top:-1rem}.-mr-4{margin-right:-1rem}.-mb-4{margin-bottom:-1rem}.-ml-4{margin-left:-1rem}.-mt-5{margin-top:-1.25rem}.-mr-5{margin-right:-1.25rem}.-mb-5{margin-bottom:-1.25rem}.-ml-5{margin-left:-1.25rem}.-mt-6{margin-top:-1.5rem}.-mr-6{margin-right:-1.5rem}.-mb-6{margin-bottom:-1.5rem}.-ml-6{margin-left:-1.5rem}.-mt-8{margin-top:-2rem}.-mr-8{margin-right:-2rem}.-mb-8{margin-bottom:-2rem}.-ml-8{margin-left:-2rem}.-mt-10{margin-top:-2.5rem}.-mr-10{margin-right:-2.5rem}.-mb-10{margin-bottom:-2.5rem}.-ml-10{margin-left:-2.5rem}.-mt-12{margin-top:-3rem}.-mr-12{margin-right:-3rem}.-mb-12{margin-bottom:-3rem}.-ml-12{margin-left:-3rem}.-mt-16{margin-top:-4rem}.-mr-16{margin-right:-4rem}.-mb-16{margin-bottom:-4rem}.-ml-16{margin-left:-4rem}.-mt-20{margin-top:-5rem}.-mr-20{margin-right:-5rem}.-mb-20{margin-bottom:-5rem}.-ml-20{margin-left:-5rem}.-mt-24{margin-top:-6rem}.-mr-24{margin-right:-6rem}.-mb-24{margin-bottom:-6rem}.-ml-24{margin-left:-6rem}.-mt-32{margin-top:-8rem}.-mr-32{margin-right:-8rem}.-mb-32{margin-bottom:-8rem}.-ml-32{margin-left:-8rem}.-mt-40{margin-top:-10rem}.-mr-40{margin-right:-10rem}.-mb-40{margin-bottom:-10rem}.-ml-40{margin-left:-10rem}.-mt-48{margin-top:-12rem}.-mr-48{margin-right:-12rem}.-mb-48{margin-bottom:-12rem}.-ml-48{margin-left:-12rem}.-mt-56{margin-top:-14rem}.-mr-56{margin-right:-14rem}.-mb-56{margin-bottom:-14rem}.-ml-56{margin-left:-14rem}.-mt-64{margin-top:-16rem}.-mr-64{margin-right:-16rem}.-mb-64{margin-bottom:-16rem}.-ml-64{margin-left:-16rem}.-mt-px{margin-top:-1px}.-mr-px{margin-right:-1px}.-mb-px{margin-bottom:-1px}.-ml-px{margin-left:-1px}.max-h-full{max-height:100%}.max-h-screen{max-height:100vh}.max-w-none{max-width:none}.max-w-xs{max-width:20rem}.max-w-sm{max-width:24rem}.max-w-md{max-width:28rem}.max-w-lg{max-width:32rem}.max-w-xl{max-width:36rem}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-full{max-width:100%}.max-w-screen-sm{max-width:640px}.max-w-screen-md{max-width:768px}.max-w-screen-lg{max-width:1024px}.max-w-screen-xl{max-width:1280px}.min-h-0{min-height:0}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.min-w-0{min-width:0}.min-w-full{min-width:100%}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.object-fill{object-fit:fill}.object-none{object-fit:none}.object-scale-down{object-fit:scale-down}.object-bottom{object-position:bottom}.object-center{object-position:center}.object-left{object-position:left}.object-left-bottom{object-position:left bottom}.object-left-top{object-position:left top}.object-right{object-position:right}.object-right-bottom{object-position:right bottom}.object-right-top{object-position:right top}.object-top{object-position:top}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.opacity-100{opacity:1}.hover\:opacity-0:hover{opacity:0}.hover\:opacity-25:hover{opacity:.25}.hover\:opacity-50:hover{opacity:.5}.hover\:opacity-75:hover{opacity:.75}.hover\:opacity-100:hover{opacity:1}.focus\:opacity-0:focus{opacity:0}.focus\:opacity-25:focus{opacity:.25}.focus\:opacity-50:focus{opacity:.5}.focus\:opacity-75:focus{opacity:.75}.focus\:opacity-100:focus{opacity:1}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline-white{outline:2px dotted #fff;outline-offset:2px}.outline-black{outline:2px dotted #000;outline-offset:2px}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:outline-white:focus{outline:2px dotted #fff;outline-offset:2px}.focus\:outline-black:focus{outline:2px dotted #000;outline-offset:2px}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-scroll{overflow:scroll}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-hidden{overflow-y:hidden}.overflow-x-visible{overflow-x:visible}.overflow-y-visible{overflow-y:visible}.overflow-x-scroll{overflow-x:scroll}.overflow-y-scroll{overflow-y:scroll}.scrolling-touch{-webkit-overflow-scrolling:touch}.scrolling-auto{-webkit-overflow-scrolling:auto}.overscroll-auto{-ms-scroll-chaining:chained;overscroll-behavior:auto}.overscroll-contain{-ms-scroll-chaining:none;overscroll-behavior:contain}.overscroll-none{-ms-scroll-chaining:none;overscroll-behavior:none}.overscroll-y-auto{overscroll-behavior-y:auto}.overscroll-y-contain{overscroll-behavior-y:contain}.overscroll-y-none{overscroll-behavior-y:none}.overscroll-x-auto{overscroll-behavior-x:auto}.overscroll-x-contain{overscroll-behavior-x:contain}.overscroll-x-none{overscroll-behavior-x:none}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.p-10{padding:2.5rem}.p-12{padding:3rem}.p-16{padding:4rem}.p-20{padding:5rem}.p-24{padding:6rem}.p-32{padding:8rem}.p-40{padding:10rem}.p-48{padding:12rem}.p-56{padding:14rem}.p-64{padding:16rem}.p-px{padding:1px}.py-0{padding-top:0;padding-bottom:0}.px-0{padding-left:0;padding-right:0}.py-1{padding-top:.25rem;padding-bottom:.25rem}.px-1{padding-left:.25rem;padding-right:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.px-8{padding-left:2rem;padding-right:2rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.px-12{padding-left:3rem;padding-right:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.px-16{padding-left:4rem;padding-right:4rem}.py-20{padding-top:5rem;padding-bottom:5rem}.px-20{padding-left:5rem;padding-right:5rem}.py-24{padding-top:6rem;padding-bottom:6rem}.px-24{padding-left:6rem;padding-right:6rem}.py-32{padding-top:8rem;padding-bottom:8rem}.px-32{padding-left:8rem;padding-right:8rem}.py-40{padding-top:10rem;padding-bottom:10rem}.px-40{padding-left:10rem;padding-right:10rem}.py-48{padding-top:12rem;padding-bottom:12rem}.px-48{padding-left:12rem;padding-right:12rem}.py-56{padding-top:14rem;padding-bottom:14rem}.px-56{padding-left:14rem;padding-right:14rem}.py-64{padding-top:16rem;padding-bottom:16rem}.px-64{padding-left:16rem;padding-right:16rem}.py-px{padding-top:1px;padding-bottom:1px}.px-px{padding-left:1px;padding-right:1px}.pt-0{padding-top:0}.pr-0{padding-right:0}.pb-0{padding-bottom:0}.pl-0{padding-left:0}.pt-1{padding-top:.25rem}.pr-1{padding-right:.25rem}.pb-1{padding-bottom:.25rem}.pl-1{padding-left:.25rem}.pt-2{padding-top:.5rem}.pr-2{padding-right:.5rem}.pb-2{padding-bottom:.5rem}.pl-2{padding-left:.5rem}.pt-3{padding-top:.75rem}.pr-3{padding-right:.75rem}.pb-3{padding-bottom:.75rem}.pl-3{padding-left:.75rem}.pt-4{padding-top:1rem}.pr-4{padding-right:1rem}.pb-4{padding-bottom:1rem}.pl-4{padding-left:1rem}.pt-5{padding-top:1.25rem}.pr-5{padding-right:1.25rem}.pb-5{padding-bottom:1.25rem}.pl-5{padding-left:1.25rem}.pt-6{padding-top:1.5rem}.pr-6{padding-right:1.5rem}.pb-6{padding-bottom:1.5rem}.pl-6{padding-left:1.5rem}.pt-8{padding-top:2rem}.pr-8{padding-right:2rem}.pb-8{padding-bottom:2rem}.pl-8{padding-left:2rem}.pt-10{padding-top:2.5rem}.pr-10{padding-right:2.5rem}.pb-10{padding-bottom:2.5rem}.pl-10{padding-left:2.5rem}.pt-12{padding-top:3rem}.pr-12{padding-right:3rem}.pb-12{padding-bottom:3rem}.pl-12{padding-left:3rem}.pt-16{padding-top:4rem}.pr-16{padding-right:4rem}.pb-16{padding-bottom:4rem}.pl-16{padding-left:4rem}.pt-20{padding-top:5rem}.pr-20{padding-right:5rem}.pb-20{padding-bottom:5rem}.pl-20{padding-left:5rem}.pt-24{padding-top:6rem}.pr-24{padding-right:6rem}.pb-24{padding-bottom:6rem}.pl-24{padding-left:6rem}.pt-32{padding-top:8rem}.pr-32{padding-right:8rem}.pb-32{padding-bottom:8rem}.pl-32{padding-left:8rem}.pt-40{padding-top:10rem}.pr-40{padding-right:10rem}.pb-40{padding-bottom:10rem}.pl-40{padding-left:10rem}.pt-48{padding-top:12rem}.pr-48{padding-right:12rem}.pb-48{padding-bottom:12rem}.pl-48{padding-left:12rem}.pt-56{padding-top:14rem}.pr-56{padding-right:14rem}.pb-56{padding-bottom:14rem}.pl-56{padding-left:14rem}.pt-64{padding-top:16rem}.pr-64{padding-right:16rem}.pb-64{padding-bottom:16rem}.pl-64{padding-left:16rem}.pt-px{padding-top:1px}.pr-px{padding-right:1px}.pb-px{padding-bottom:1px}.pl-px{padding-left:1px}.placeholder-transparent:-ms-input-placeholder{color:transparent}.placeholder-transparent::-ms-input-placeholder{color:transparent}.placeholder-transparent::placeholder{color:transparent}.placeholder-current:-ms-input-placeholder{color:currentColor}.placeholder-current::-ms-input-placeholder{color:currentColor}.placeholder-current::placeholder{color:currentColor}.placeholder-black:-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.placeholder-black::-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.placeholder-black::placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.placeholder-white:-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.placeholder-white::-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.placeholder-white::placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.placeholder-gray-100:-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.placeholder-gray-100::-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.placeholder-gray-100::placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.placeholder-gray-200:-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.placeholder-gray-200::-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.placeholder-gray-200::placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.placeholder-gray-300:-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.placeholder-gray-300::-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.placeholder-gray-300::placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.placeholder-gray-400:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.placeholder-gray-400::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.placeholder-gray-400::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.placeholder-gray-500:-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.placeholder-gray-500::-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.placeholder-gray-500::placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.placeholder-gray-600:-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.placeholder-gray-600::-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.placeholder-gray-600::placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.placeholder-gray-700:-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.placeholder-gray-700::-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.placeholder-gray-700::placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.placeholder-gray-800:-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.placeholder-gray-800::-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.placeholder-gray-800::placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.placeholder-gray-900:-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.placeholder-gray-900::-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.placeholder-gray-900::placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.placeholder-red-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.placeholder-red-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.placeholder-red-100::placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.placeholder-red-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.placeholder-red-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.placeholder-red-200::placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.placeholder-red-300:-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.placeholder-red-300::-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.placeholder-red-300::placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.placeholder-red-400:-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.placeholder-red-400::-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.placeholder-red-400::placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.placeholder-red-500:-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.placeholder-red-500::-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.placeholder-red-500::placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.placeholder-red-600:-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.placeholder-red-600::-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.placeholder-red-600::placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.placeholder-red-700:-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.placeholder-red-700::-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.placeholder-red-700::placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.placeholder-red-800:-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.placeholder-red-800::-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.placeholder-red-800::placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.placeholder-red-900:-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.placeholder-red-900::-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.placeholder-red-900::placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.placeholder-orange-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.placeholder-orange-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.placeholder-orange-100::placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.placeholder-orange-200:-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.placeholder-orange-200::-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.placeholder-orange-200::placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.placeholder-orange-300:-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.placeholder-orange-300::-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.placeholder-orange-300::placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.placeholder-orange-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.placeholder-orange-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.placeholder-orange-400::placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.placeholder-orange-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.placeholder-orange-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.placeholder-orange-500::placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.placeholder-orange-600:-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.placeholder-orange-600::-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.placeholder-orange-600::placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.placeholder-orange-700:-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.placeholder-orange-700::-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.placeholder-orange-700::placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.placeholder-orange-800:-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.placeholder-orange-800::-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.placeholder-orange-800::placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.placeholder-orange-900:-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.placeholder-orange-900::-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.placeholder-orange-900::placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.placeholder-yellow-100:-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.placeholder-yellow-100::-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.placeholder-yellow-100::placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.placeholder-yellow-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.placeholder-yellow-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.placeholder-yellow-200::placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.placeholder-yellow-300:-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.placeholder-yellow-300::-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.placeholder-yellow-300::placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.placeholder-yellow-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.placeholder-yellow-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.placeholder-yellow-400::placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.placeholder-yellow-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.placeholder-yellow-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.placeholder-yellow-500::placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.placeholder-yellow-600:-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.placeholder-yellow-600::-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.placeholder-yellow-600::placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.placeholder-yellow-700:-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.placeholder-yellow-700::-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.placeholder-yellow-700::placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.placeholder-yellow-800:-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.placeholder-yellow-800::-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.placeholder-yellow-800::placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.placeholder-yellow-900:-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.placeholder-yellow-900::-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.placeholder-yellow-900::placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.placeholder-green-100:-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.placeholder-green-100::-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.placeholder-green-100::placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.placeholder-green-200:-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.placeholder-green-200::-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.placeholder-green-200::placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.placeholder-green-300:-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.placeholder-green-300::-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.placeholder-green-300::placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.placeholder-green-400:-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.placeholder-green-400::-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.placeholder-green-400::placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.placeholder-green-500:-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.placeholder-green-500::-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.placeholder-green-500::placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.placeholder-green-600:-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.placeholder-green-600::-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.placeholder-green-600::placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.placeholder-green-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.placeholder-green-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.placeholder-green-700::placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.placeholder-green-800:-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.placeholder-green-800::-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.placeholder-green-800::placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.placeholder-green-900:-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.placeholder-green-900::-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.placeholder-green-900::placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.placeholder-teal-100:-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.placeholder-teal-100::-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.placeholder-teal-100::placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.placeholder-teal-200:-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.placeholder-teal-200::-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.placeholder-teal-200::placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.placeholder-teal-300:-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.placeholder-teal-300::-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.placeholder-teal-300::placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.placeholder-teal-400:-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.placeholder-teal-400::-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.placeholder-teal-400::placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.placeholder-teal-500:-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.placeholder-teal-500::-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.placeholder-teal-500::placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.placeholder-teal-600:-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.placeholder-teal-600::-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.placeholder-teal-600::placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.placeholder-teal-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.placeholder-teal-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.placeholder-teal-700::placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.placeholder-teal-800:-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.placeholder-teal-800::-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.placeholder-teal-800::placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.placeholder-teal-900:-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.placeholder-teal-900::-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.placeholder-teal-900::placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.placeholder-blue-100:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.placeholder-blue-100::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.placeholder-blue-100::placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.placeholder-blue-200:-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.placeholder-blue-200::-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.placeholder-blue-200::placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.placeholder-blue-300:-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.placeholder-blue-300::-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.placeholder-blue-300::placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.placeholder-blue-400:-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.placeholder-blue-400::-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.placeholder-blue-400::placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.placeholder-blue-500:-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.placeholder-blue-500::-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.placeholder-blue-500::placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.placeholder-blue-600:-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.placeholder-blue-600::-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.placeholder-blue-600::placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.placeholder-blue-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.placeholder-blue-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.placeholder-blue-700::placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.placeholder-blue-800:-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.placeholder-blue-800::-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.placeholder-blue-800::placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.placeholder-blue-900:-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.placeholder-blue-900::-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.placeholder-blue-900::placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.placeholder-indigo-100:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.placeholder-indigo-100::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.placeholder-indigo-100::placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.placeholder-indigo-200:-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.placeholder-indigo-200::-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.placeholder-indigo-200::placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.placeholder-indigo-300:-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.placeholder-indigo-300::-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.placeholder-indigo-300::placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.placeholder-indigo-400:-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.placeholder-indigo-400::-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.placeholder-indigo-400::placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.placeholder-indigo-500:-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.placeholder-indigo-500::-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.placeholder-indigo-500::placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.placeholder-indigo-600:-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.placeholder-indigo-600::-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.placeholder-indigo-600::placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.placeholder-indigo-700:-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.placeholder-indigo-700::-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.placeholder-indigo-700::placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.placeholder-indigo-800:-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.placeholder-indigo-800::-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.placeholder-indigo-800::placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.placeholder-indigo-900:-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.placeholder-indigo-900::-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.placeholder-indigo-900::placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.placeholder-purple-100:-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.placeholder-purple-100::-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.placeholder-purple-100::placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.placeholder-purple-200:-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.placeholder-purple-200::-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.placeholder-purple-200::placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.placeholder-purple-300:-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.placeholder-purple-300::-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.placeholder-purple-300::placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.placeholder-purple-400:-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.placeholder-purple-400::-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.placeholder-purple-400::placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.placeholder-purple-500:-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.placeholder-purple-500::-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.placeholder-purple-500::placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.placeholder-purple-600:-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.placeholder-purple-600::-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.placeholder-purple-600::placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.placeholder-purple-700:-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.placeholder-purple-700::-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.placeholder-purple-700::placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.placeholder-purple-800:-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.placeholder-purple-800::-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.placeholder-purple-800::placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.placeholder-purple-900:-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.placeholder-purple-900::-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.placeholder-purple-900::placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.placeholder-pink-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.placeholder-pink-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.placeholder-pink-100::placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.placeholder-pink-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.placeholder-pink-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.placeholder-pink-200::placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.placeholder-pink-300:-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.placeholder-pink-300::-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.placeholder-pink-300::placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.placeholder-pink-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.placeholder-pink-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.placeholder-pink-400::placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.placeholder-pink-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.placeholder-pink-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.placeholder-pink-500::placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.placeholder-pink-600:-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.placeholder-pink-600::-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.placeholder-pink-600::placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.placeholder-pink-700:-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.placeholder-pink-700::-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.placeholder-pink-700::placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.placeholder-pink-800:-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.placeholder-pink-800::-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.placeholder-pink-800::placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.placeholder-pink-900:-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.placeholder-pink-900::-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.placeholder-pink-900::placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.focus\:placeholder-transparent:focus:-ms-input-placeholder{color:transparent}.focus\:placeholder-transparent:focus::-ms-input-placeholder{color:transparent}.focus\:placeholder-transparent:focus::placeholder{color:transparent}.focus\:placeholder-current:focus:-ms-input-placeholder{color:currentColor}.focus\:placeholder-current:focus::-ms-input-placeholder{color:currentColor}.focus\:placeholder-current:focus::placeholder{color:currentColor}.focus\:placeholder-black:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.focus\:placeholder-black:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.focus\:placeholder-black:focus::placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.focus\:placeholder-white:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.focus\:placeholder-white:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.focus\:placeholder-white:focus::placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.focus\:placeholder-gray-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.focus\:placeholder-gray-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.focus\:placeholder-gray-100:focus::placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.focus\:placeholder-gray-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.focus\:placeholder-gray-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.focus\:placeholder-gray-200:focus::placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.focus\:placeholder-gray-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.focus\:placeholder-gray-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.focus\:placeholder-gray-300:focus::placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.focus\:placeholder-gray-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.focus\:placeholder-gray-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.focus\:placeholder-gray-400:focus::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.focus\:placeholder-gray-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.focus\:placeholder-gray-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.focus\:placeholder-gray-500:focus::placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.focus\:placeholder-gray-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.focus\:placeholder-gray-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.focus\:placeholder-gray-600:focus::placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.focus\:placeholder-gray-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.focus\:placeholder-gray-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.focus\:placeholder-gray-700:focus::placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.focus\:placeholder-gray-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.focus\:placeholder-gray-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.focus\:placeholder-gray-800:focus::placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.focus\:placeholder-gray-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.focus\:placeholder-gray-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.focus\:placeholder-gray-900:focus::placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.focus\:placeholder-red-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.focus\:placeholder-red-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.focus\:placeholder-red-100:focus::placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.focus\:placeholder-red-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.focus\:placeholder-red-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.focus\:placeholder-red-200:focus::placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.focus\:placeholder-red-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.focus\:placeholder-red-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.focus\:placeholder-red-300:focus::placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.focus\:placeholder-red-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.focus\:placeholder-red-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.focus\:placeholder-red-400:focus::placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.focus\:placeholder-red-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.focus\:placeholder-red-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.focus\:placeholder-red-500:focus::placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.focus\:placeholder-red-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.focus\:placeholder-red-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.focus\:placeholder-red-600:focus::placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.focus\:placeholder-red-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.focus\:placeholder-red-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.focus\:placeholder-red-700:focus::placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.focus\:placeholder-red-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.focus\:placeholder-red-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.focus\:placeholder-red-800:focus::placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.focus\:placeholder-red-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.focus\:placeholder-red-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.focus\:placeholder-red-900:focus::placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.focus\:placeholder-orange-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.focus\:placeholder-orange-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.focus\:placeholder-orange-100:focus::placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.focus\:placeholder-orange-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.focus\:placeholder-orange-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.focus\:placeholder-orange-200:focus::placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.focus\:placeholder-orange-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.focus\:placeholder-orange-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.focus\:placeholder-orange-300:focus::placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.focus\:placeholder-orange-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.focus\:placeholder-orange-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.focus\:placeholder-orange-400:focus::placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.focus\:placeholder-orange-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.focus\:placeholder-orange-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.focus\:placeholder-orange-500:focus::placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.focus\:placeholder-orange-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.focus\:placeholder-orange-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.focus\:placeholder-orange-600:focus::placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.focus\:placeholder-orange-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.focus\:placeholder-orange-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.focus\:placeholder-orange-700:focus::placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.focus\:placeholder-orange-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.focus\:placeholder-orange-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.focus\:placeholder-orange-800:focus::placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.focus\:placeholder-orange-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.focus\:placeholder-orange-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.focus\:placeholder-orange-900:focus::placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.focus\:placeholder-yellow-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.focus\:placeholder-yellow-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.focus\:placeholder-yellow-100:focus::placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.focus\:placeholder-yellow-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.focus\:placeholder-yellow-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.focus\:placeholder-yellow-200:focus::placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.focus\:placeholder-yellow-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.focus\:placeholder-yellow-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.focus\:placeholder-yellow-300:focus::placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.focus\:placeholder-yellow-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.focus\:placeholder-yellow-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.focus\:placeholder-yellow-400:focus::placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.focus\:placeholder-yellow-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.focus\:placeholder-yellow-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.focus\:placeholder-yellow-500:focus::placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.focus\:placeholder-yellow-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.focus\:placeholder-yellow-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.focus\:placeholder-yellow-600:focus::placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.focus\:placeholder-yellow-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.focus\:placeholder-yellow-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.focus\:placeholder-yellow-700:focus::placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.focus\:placeholder-yellow-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.focus\:placeholder-yellow-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.focus\:placeholder-yellow-800:focus::placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.focus\:placeholder-yellow-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.focus\:placeholder-yellow-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.focus\:placeholder-yellow-900:focus::placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.focus\:placeholder-green-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.focus\:placeholder-green-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.focus\:placeholder-green-100:focus::placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.focus\:placeholder-green-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.focus\:placeholder-green-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.focus\:placeholder-green-200:focus::placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.focus\:placeholder-green-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.focus\:placeholder-green-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.focus\:placeholder-green-300:focus::placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.focus\:placeholder-green-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.focus\:placeholder-green-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.focus\:placeholder-green-400:focus::placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.focus\:placeholder-green-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.focus\:placeholder-green-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.focus\:placeholder-green-500:focus::placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.focus\:placeholder-green-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.focus\:placeholder-green-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.focus\:placeholder-green-600:focus::placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.focus\:placeholder-green-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.focus\:placeholder-green-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.focus\:placeholder-green-700:focus::placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.focus\:placeholder-green-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.focus\:placeholder-green-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.focus\:placeholder-green-800:focus::placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.focus\:placeholder-green-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.focus\:placeholder-green-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.focus\:placeholder-green-900:focus::placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.focus\:placeholder-teal-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.focus\:placeholder-teal-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.focus\:placeholder-teal-100:focus::placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.focus\:placeholder-teal-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.focus\:placeholder-teal-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.focus\:placeholder-teal-200:focus::placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.focus\:placeholder-teal-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.focus\:placeholder-teal-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.focus\:placeholder-teal-300:focus::placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.focus\:placeholder-teal-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.focus\:placeholder-teal-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.focus\:placeholder-teal-400:focus::placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.focus\:placeholder-teal-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.focus\:placeholder-teal-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.focus\:placeholder-teal-500:focus::placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.focus\:placeholder-teal-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.focus\:placeholder-teal-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.focus\:placeholder-teal-600:focus::placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.focus\:placeholder-teal-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.focus\:placeholder-teal-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.focus\:placeholder-teal-700:focus::placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.focus\:placeholder-teal-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.focus\:placeholder-teal-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.focus\:placeholder-teal-800:focus::placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.focus\:placeholder-teal-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.focus\:placeholder-teal-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.focus\:placeholder-teal-900:focus::placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.focus\:placeholder-blue-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.focus\:placeholder-blue-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.focus\:placeholder-blue-100:focus::placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.focus\:placeholder-blue-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.focus\:placeholder-blue-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.focus\:placeholder-blue-200:focus::placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.focus\:placeholder-blue-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.focus\:placeholder-blue-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.focus\:placeholder-blue-300:focus::placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.focus\:placeholder-blue-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.focus\:placeholder-blue-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.focus\:placeholder-blue-400:focus::placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.focus\:placeholder-blue-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.focus\:placeholder-blue-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.focus\:placeholder-blue-500:focus::placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.focus\:placeholder-blue-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.focus\:placeholder-blue-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.focus\:placeholder-blue-600:focus::placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.focus\:placeholder-blue-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.focus\:placeholder-blue-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.focus\:placeholder-blue-700:focus::placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.focus\:placeholder-blue-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.focus\:placeholder-blue-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.focus\:placeholder-blue-800:focus::placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.focus\:placeholder-blue-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.focus\:placeholder-blue-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.focus\:placeholder-blue-900:focus::placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.focus\:placeholder-indigo-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.focus\:placeholder-indigo-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.focus\:placeholder-indigo-100:focus::placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.focus\:placeholder-indigo-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.focus\:placeholder-indigo-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.focus\:placeholder-indigo-200:focus::placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.focus\:placeholder-indigo-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.focus\:placeholder-indigo-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.focus\:placeholder-indigo-300:focus::placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.focus\:placeholder-indigo-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.focus\:placeholder-indigo-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.focus\:placeholder-indigo-400:focus::placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.focus\:placeholder-indigo-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.focus\:placeholder-indigo-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.focus\:placeholder-indigo-500:focus::placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.focus\:placeholder-indigo-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.focus\:placeholder-indigo-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.focus\:placeholder-indigo-600:focus::placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.focus\:placeholder-indigo-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.focus\:placeholder-indigo-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.focus\:placeholder-indigo-700:focus::placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.focus\:placeholder-indigo-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.focus\:placeholder-indigo-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.focus\:placeholder-indigo-800:focus::placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.focus\:placeholder-indigo-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.focus\:placeholder-indigo-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.focus\:placeholder-indigo-900:focus::placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.focus\:placeholder-purple-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.focus\:placeholder-purple-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.focus\:placeholder-purple-100:focus::placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.focus\:placeholder-purple-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.focus\:placeholder-purple-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.focus\:placeholder-purple-200:focus::placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.focus\:placeholder-purple-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.focus\:placeholder-purple-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.focus\:placeholder-purple-300:focus::placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.focus\:placeholder-purple-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.focus\:placeholder-purple-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.focus\:placeholder-purple-400:focus::placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.focus\:placeholder-purple-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.focus\:placeholder-purple-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.focus\:placeholder-purple-500:focus::placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.focus\:placeholder-purple-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.focus\:placeholder-purple-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.focus\:placeholder-purple-600:focus::placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.focus\:placeholder-purple-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.focus\:placeholder-purple-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.focus\:placeholder-purple-700:focus::placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.focus\:placeholder-purple-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.focus\:placeholder-purple-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.focus\:placeholder-purple-800:focus::placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.focus\:placeholder-purple-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.focus\:placeholder-purple-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.focus\:placeholder-purple-900:focus::placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.focus\:placeholder-pink-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.focus\:placeholder-pink-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.focus\:placeholder-pink-100:focus::placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.focus\:placeholder-pink-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.focus\:placeholder-pink-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.focus\:placeholder-pink-200:focus::placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.focus\:placeholder-pink-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.focus\:placeholder-pink-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.focus\:placeholder-pink-300:focus::placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.focus\:placeholder-pink-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.focus\:placeholder-pink-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.focus\:placeholder-pink-400:focus::placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.focus\:placeholder-pink-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.focus\:placeholder-pink-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.focus\:placeholder-pink-500:focus::placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.focus\:placeholder-pink-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.focus\:placeholder-pink-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.focus\:placeholder-pink-600:focus::placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.focus\:placeholder-pink-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.focus\:placeholder-pink-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.focus\:placeholder-pink-700:focus::placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.focus\:placeholder-pink-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.focus\:placeholder-pink-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.focus\:placeholder-pink-800:focus::placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.focus\:placeholder-pink-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.focus\:placeholder-pink-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.focus\:placeholder-pink-900:focus::placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.placeholder-opacity-0:-ms-input-placeholder{--placeholder-opacity:0}.placeholder-opacity-0::-ms-input-placeholder{--placeholder-opacity:0}.placeholder-opacity-0::placeholder{--placeholder-opacity:0}.placeholder-opacity-25:-ms-input-placeholder{--placeholder-opacity:0.25}.placeholder-opacity-25::-ms-input-placeholder{--placeholder-opacity:0.25}.placeholder-opacity-25::placeholder{--placeholder-opacity:0.25}.placeholder-opacity-50:-ms-input-placeholder{--placeholder-opacity:0.5}.placeholder-opacity-50::-ms-input-placeholder{--placeholder-opacity:0.5}.placeholder-opacity-50::placeholder{--placeholder-opacity:0.5}.placeholder-opacity-75:-ms-input-placeholder{--placeholder-opacity:0.75}.placeholder-opacity-75::-ms-input-placeholder{--placeholder-opacity:0.75}.placeholder-opacity-75::placeholder{--placeholder-opacity:0.75}.placeholder-opacity-100:-ms-input-placeholder{--placeholder-opacity:1}.placeholder-opacity-100::-ms-input-placeholder{--placeholder-opacity:1}.placeholder-opacity-100::placeholder{--placeholder-opacity:1}.focus\:placeholder-opacity-0:focus:-ms-input-placeholder{--placeholder-opacity:0}.focus\:placeholder-opacity-0:focus::-ms-input-placeholder{--placeholder-opacity:0}.focus\:placeholder-opacity-0:focus::placeholder{--placeholder-opacity:0}.focus\:placeholder-opacity-25:focus:-ms-input-placeholder{--placeholder-opacity:0.25}.focus\:placeholder-opacity-25:focus::-ms-input-placeholder{--placeholder-opacity:0.25}.focus\:placeholder-opacity-25:focus::placeholder{--placeholder-opacity:0.25}.focus\:placeholder-opacity-50:focus:-ms-input-placeholder{--placeholder-opacity:0.5}.focus\:placeholder-opacity-50:focus::-ms-input-placeholder{--placeholder-opacity:0.5}.focus\:placeholder-opacity-50:focus::placeholder{--placeholder-opacity:0.5}.focus\:placeholder-opacity-75:focus:-ms-input-placeholder{--placeholder-opacity:0.75}.focus\:placeholder-opacity-75:focus::-ms-input-placeholder{--placeholder-opacity:0.75}.focus\:placeholder-opacity-75:focus::placeholder{--placeholder-opacity:0.75}.focus\:placeholder-opacity-100:focus:-ms-input-placeholder{--placeholder-opacity:1}.focus\:placeholder-opacity-100:focus::-ms-input-placeholder{--placeholder-opacity:1}.focus\:placeholder-opacity-100:focus::placeholder{--placeholder-opacity:1}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:-webkit-sticky;position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-auto{top:auto;right:auto;bottom:auto;left:auto}.inset-y-0{top:0;bottom:0}.inset-x-0{right:0;left:0}.inset-y-auto{top:auto;bottom:auto}.inset-x-auto{right:auto;left:auto}.top-0{top:0}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}.top-auto{top:auto}.right-auto{right:auto}.bottom-auto{bottom:auto}.left-auto{left:auto}.resize-none{resize:none}.resize-y{resize:vertical}.resize-x{resize:horizontal}.resize{resize:both}.shadow-xs{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.shadow-sm{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.shadow-md{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.shadow-lg{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.shadow-xl{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.shadow-2xl{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.shadow-inner{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.shadow-outline{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.shadow-none{box-shadow:none}.hover\:shadow-xs:hover{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.hover\:shadow-sm:hover{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.hover\:shadow:hover{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.hover\:shadow-md:hover{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.hover\:shadow-lg:hover{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.hover\:shadow-xl:hover{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.hover\:shadow-2xl:hover{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.hover\:shadow-inner:hover{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.hover\:shadow-outline:hover{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.hover\:shadow-none:hover{box-shadow:none}.focus\:shadow-xs:focus{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.focus\:shadow-sm:focus{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.focus\:shadow:focus{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.focus\:shadow-md:focus{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.focus\:shadow-lg:focus{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.focus\:shadow-xl:focus{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.focus\:shadow-2xl:focus{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.focus\:shadow-inner:focus{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.focus\:shadow-outline:focus{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.focus\:shadow-none:focus{box-shadow:none}.fill-current{fill:currentColor}.stroke-current{stroke:currentColor}.stroke-0{stroke-width:0}.stroke-1{stroke-width:1}.stroke-2{stroke-width:2}.table-auto{table-layout:auto}.table-fixed{table-layout:fixed}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-justify{text-align:justify}.text-transparent{color:transparent}.text-current{color:currentColor}.text-black{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.text-gray-100{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.text-gray-200{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.text-gray-300{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.text-gray-800{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.text-red-100{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.text-red-200{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.text-red-300{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.text-red-400{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.text-red-500{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.text-red-600{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.text-red-700{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.text-red-800{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.text-red-900{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.text-orange-100{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.text-orange-200{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.text-orange-300{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.text-orange-400{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.text-orange-500{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.text-orange-600{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.text-orange-700{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.text-orange-800{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.text-orange-900{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.text-yellow-100{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.text-yellow-200{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.text-yellow-300{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.text-yellow-400{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.text-yellow-500{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.text-yellow-600{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.text-yellow-700{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.text-yellow-800{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.text-yellow-900{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.text-green-100{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.text-green-200{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.text-green-300{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.text-green-400{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.text-green-500{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.text-green-600{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.text-green-700{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.text-green-800{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.text-green-900{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.text-teal-100{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.text-teal-200{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.text-teal-300{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.text-teal-400{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.text-teal-500{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.text-teal-600{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.text-teal-700{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.text-teal-800{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.text-teal-900{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.text-blue-100{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.text-blue-200{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.text-blue-300{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.text-blue-400{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.text-blue-500{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.text-blue-600{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.text-blue-700{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.text-blue-800{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.text-blue-900{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.text-indigo-100{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.text-indigo-200{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.text-indigo-300{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.text-indigo-400{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.text-indigo-500{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.text-indigo-600{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.text-indigo-700{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.text-indigo-800{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.text-indigo-900{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.text-purple-100{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.text-purple-200{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.text-purple-300{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.text-purple-400{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.text-purple-500{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.text-purple-600{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.text-purple-700{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.text-purple-800{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.text-purple-900{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.text-pink-100{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.text-pink-200{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.text-pink-300{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.text-pink-400{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.text-pink-500{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.text-pink-600{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.text-pink-700{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.text-pink-800{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.text-pink-900{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.hover\:text-transparent:hover{color:transparent}.hover\:text-current:hover{color:currentColor}.hover\:text-black:hover{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.hover\:text-white:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.hover\:text-gray-100:hover{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.hover\:text-gray-200:hover{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.hover\:text-gray-300:hover{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.hover\:text-gray-400:hover{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.hover\:text-gray-500:hover{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.hover\:text-gray-600:hover{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.hover\:text-gray-700:hover{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.hover\:text-gray-800:hover{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.hover\:text-gray-900:hover{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.hover\:text-red-100:hover{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.hover\:text-red-200:hover{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.hover\:text-red-300:hover{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.hover\:text-red-400:hover{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.hover\:text-red-500:hover{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.hover\:text-red-600:hover{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.hover\:text-red-700:hover{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.hover\:text-red-800:hover{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.hover\:text-red-900:hover{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.hover\:text-orange-100:hover{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.hover\:text-orange-200:hover{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.hover\:text-orange-300:hover{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.hover\:text-orange-400:hover{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.hover\:text-orange-500:hover{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.hover\:text-orange-600:hover{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.hover\:text-orange-700:hover{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.hover\:text-orange-800:hover{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.hover\:text-orange-900:hover{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.hover\:text-yellow-100:hover{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.hover\:text-yellow-200:hover{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.hover\:text-yellow-300:hover{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.hover\:text-yellow-400:hover{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.hover\:text-yellow-500:hover{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.hover\:text-yellow-600:hover{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.hover\:text-yellow-700:hover{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.hover\:text-yellow-800:hover{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.hover\:text-yellow-900:hover{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.hover\:text-green-100:hover{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.hover\:text-green-200:hover{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.hover\:text-green-300:hover{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.hover\:text-green-400:hover{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.hover\:text-green-500:hover{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.hover\:text-green-600:hover{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.hover\:text-green-700:hover{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.hover\:text-green-800:hover{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.hover\:text-green-900:hover{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.hover\:text-teal-100:hover{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.hover\:text-teal-200:hover{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.hover\:text-teal-300:hover{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.hover\:text-teal-400:hover{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.hover\:text-teal-500:hover{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.hover\:text-teal-600:hover{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.hover\:text-teal-700:hover{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.hover\:text-teal-800:hover{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.hover\:text-teal-900:hover{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.hover\:text-blue-100:hover{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.hover\:text-blue-200:hover{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.hover\:text-blue-300:hover{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.hover\:text-blue-400:hover{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.hover\:text-blue-500:hover{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.hover\:text-blue-600:hover{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.hover\:text-blue-700:hover{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.hover\:text-blue-800:hover{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.hover\:text-blue-900:hover{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.hover\:text-indigo-100:hover{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.hover\:text-indigo-200:hover{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.hover\:text-indigo-300:hover{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.hover\:text-indigo-400:hover{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.hover\:text-indigo-500:hover{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.hover\:text-indigo-600:hover{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.hover\:text-indigo-700:hover{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.hover\:text-indigo-800:hover{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.hover\:text-indigo-900:hover{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.hover\:text-purple-100:hover{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.hover\:text-purple-200:hover{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.hover\:text-purple-300:hover{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.hover\:text-purple-400:hover{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.hover\:text-purple-500:hover{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.hover\:text-purple-600:hover{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.hover\:text-purple-700:hover{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.hover\:text-purple-800:hover{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.hover\:text-purple-900:hover{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.hover\:text-pink-100:hover{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.hover\:text-pink-200:hover{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.hover\:text-pink-300:hover{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.hover\:text-pink-400:hover{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.hover\:text-pink-500:hover{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.hover\:text-pink-600:hover{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.hover\:text-pink-700:hover{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.hover\:text-pink-800:hover{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.hover\:text-pink-900:hover{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.focus\:text-transparent:focus{color:transparent}.focus\:text-current:focus{color:currentColor}.focus\:text-black:focus{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.focus\:text-white:focus{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.focus\:text-gray-100:focus{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.focus\:text-gray-200:focus{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.focus\:text-gray-300:focus{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.focus\:text-gray-400:focus{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.focus\:text-gray-500:focus{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.focus\:text-gray-600:focus{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.focus\:text-gray-700:focus{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.focus\:text-gray-800:focus{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.focus\:text-gray-900:focus{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.focus\:text-red-100:focus{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.focus\:text-red-200:focus{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.focus\:text-red-300:focus{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.focus\:text-red-400:focus{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.focus\:text-red-500:focus{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.focus\:text-red-600:focus{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.focus\:text-red-700:focus{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.focus\:text-red-800:focus{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.focus\:text-red-900:focus{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.focus\:text-orange-100:focus{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.focus\:text-orange-200:focus{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.focus\:text-orange-300:focus{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.focus\:text-orange-400:focus{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.focus\:text-orange-500:focus{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.focus\:text-orange-600:focus{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.focus\:text-orange-700:focus{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.focus\:text-orange-800:focus{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.focus\:text-orange-900:focus{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.focus\:text-yellow-100:focus{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.focus\:text-yellow-200:focus{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.focus\:text-yellow-300:focus{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.focus\:text-yellow-400:focus{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.focus\:text-yellow-500:focus{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.focus\:text-yellow-600:focus{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.focus\:text-yellow-700:focus{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.focus\:text-yellow-800:focus{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.focus\:text-yellow-900:focus{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.focus\:text-green-100:focus{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.focus\:text-green-200:focus{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.focus\:text-green-300:focus{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.focus\:text-green-400:focus{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.focus\:text-green-500:focus{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.focus\:text-green-600:focus{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.focus\:text-green-700:focus{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.focus\:text-green-800:focus{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.focus\:text-green-900:focus{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.focus\:text-teal-100:focus{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.focus\:text-teal-200:focus{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.focus\:text-teal-300:focus{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.focus\:text-teal-400:focus{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.focus\:text-teal-500:focus{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.focus\:text-teal-600:focus{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.focus\:text-teal-700:focus{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.focus\:text-teal-800:focus{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.focus\:text-teal-900:focus{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.focus\:text-blue-100:focus{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.focus\:text-blue-200:focus{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.focus\:text-blue-300:focus{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.focus\:text-blue-400:focus{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.focus\:text-blue-500:focus{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.focus\:text-blue-600:focus{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.focus\:text-blue-700:focus{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.focus\:text-blue-800:focus{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.focus\:text-blue-900:focus{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.focus\:text-indigo-100:focus{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.focus\:text-indigo-200:focus{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.focus\:text-indigo-300:focus{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.focus\:text-indigo-400:focus{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.focus\:text-indigo-500:focus{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.focus\:text-indigo-600:focus{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.focus\:text-indigo-700:focus{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.focus\:text-indigo-800:focus{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.focus\:text-indigo-900:focus{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.focus\:text-purple-100:focus{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.focus\:text-purple-200:focus{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.focus\:text-purple-300:focus{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.focus\:text-purple-400:focus{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.focus\:text-purple-500:focus{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.focus\:text-purple-600:focus{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.focus\:text-purple-700:focus{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.focus\:text-purple-800:focus{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.focus\:text-purple-900:focus{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.focus\:text-pink-100:focus{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.focus\:text-pink-200:focus{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.focus\:text-pink-300:focus{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.focus\:text-pink-400:focus{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.focus\:text-pink-500:focus{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.focus\:text-pink-600:focus{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.focus\:text-pink-700:focus{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.focus\:text-pink-800:focus{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.focus\:text-pink-900:focus{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.text-opacity-0{--text-opacity:0}.text-opacity-25{--text-opacity:0.25}.text-opacity-50{--text-opacity:0.5}.text-opacity-75{--text-opacity:0.75}.text-opacity-100{--text-opacity:1}.hover\:text-opacity-0:hover{--text-opacity:0}.hover\:text-opacity-25:hover{--text-opacity:0.25}.hover\:text-opacity-50:hover{--text-opacity:0.5}.hover\:text-opacity-75:hover{--text-opacity:0.75}.hover\:text-opacity-100:hover{--text-opacity:1}.focus\:text-opacity-0:focus{--text-opacity:0}.focus\:text-opacity-25:focus{--text-opacity:0.25}.focus\:text-opacity-50:focus{--text-opacity:0.5}.focus\:text-opacity-75:focus{--text-opacity:0.75}.focus\:text-opacity-100:focus{--text-opacity:1}.italic{font-style:italic}.not-italic{font-style:normal}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.underline{text-decoration:underline}.line-through{text-decoration:line-through}.no-underline{text-decoration:none}.hover\:underline:hover{text-decoration:underline}.hover\:line-through:hover{text-decoration:line-through}.hover\:no-underline:hover{text-decoration:none}.focus\:underline:focus{text-decoration:underline}.focus\:line-through:focus{text-decoration:line-through}.focus\:no-underline:focus{text-decoration:none}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.diagonal-fractions,.lining-nums,.oldstyle-nums,.ordinal,.proportional-nums,.slashed-zero,.stacked-fractions,.tabular-nums{--font-variant-numeric-ordinal:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-slashed-zero:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-figure:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-spacing:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-fraction:var(--tailwind-empty, );/*!*//*!*/font-variant-numeric:var(--font-variant-numeric-ordinal) var(--font-variant-numeric-slashed-zero) var(--font-variant-numeric-figure) var(--font-variant-numeric-spacing) var(--font-variant-numeric-fraction)}.normal-nums{font-variant-numeric:normal}.ordinal{--font-variant-numeric-ordinal:ordinal}.slashed-zero{--font-variant-numeric-slashed-zero:slashed-zero}.lining-nums{--font-variant-numeric-figure:lining-nums}.oldstyle-nums{--font-variant-numeric-figure:oldstyle-nums}.proportional-nums{--font-variant-numeric-spacing:proportional-nums}.tabular-nums{--font-variant-numeric-spacing:tabular-nums}.diagonal-fractions{--font-variant-numeric-fraction:diagonal-fractions}.stacked-fractions{--font-variant-numeric-fraction:stacked-fractions}.tracking-tighter{letter-spacing:-.05em}.tracking-tight{letter-spacing:-.025em}.tracking-normal{letter-spacing:0}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.select-none{-webkit-user-select:none;-ms-user-select:none;user-select:none}.select-text{-webkit-user-select:text;-ms-user-select:text;user-select:text}.select-all{-webkit-user-select:all;-ms-user-select:all;user-select:all}.select-auto{-webkit-user-select:auto;-ms-user-select:auto;user-select:auto}.align-baseline{vertical-align:baseline}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.align-bottom{vertical-align:bottom}.align-text-top{vertical-align:text-top}.align-text-bottom{vertical-align:text-bottom}.visible{visibility:visible}.invisible{visibility:hidden}.whitespace-normal{white-space:normal}.whitespace-no-wrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-normal{word-wrap:normal;overflow-wrap:normal;word-break:normal}.break-words{word-wrap:break-word;overflow-wrap:break-word}.break-all{word-break:break-all}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.w-0{width:0}.w-1{width:.25rem}.w-2{width:.5rem}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-32{width:8rem}.w-40{width:10rem}.w-48{width:12rem}.w-56{width:14rem}.w-64{width:16rem}.w-auto{width:auto}.w-px{width:1px}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-2\/3{width:66.666667%}.w-1\/4{width:25%}.w-2\/4{width:50%}.w-3\/4{width:75%}.w-1\/5{width:20%}.w-2\/5{width:40%}.w-3\/5{width:60%}.w-4\/5{width:80%}.w-1\/6{width:16.666667%}.w-2\/6{width:33.333333%}.w-3\/6{width:50%}.w-4\/6{width:66.666667%}.w-5\/6{width:83.333333%}.w-1\/12{width:8.333333%}.w-2\/12{width:16.666667%}.w-3\/12{width:25%}.w-4\/12{width:33.333333%}.w-5\/12{width:41.666667%}.w-6\/12{width:50%}.w-7\/12{width:58.333333%}.w-8\/12{width:66.666667%}.w-9\/12{width:75%}.w-10\/12{width:83.333333%}.w-11\/12{width:91.666667%}.w-full{width:100%}.w-screen{width:100vw}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-auto{z-index:auto}.gap-0{grid-gap:0;gap:0}.gap-1{grid-gap:.25rem;gap:.25rem}.gap-2{grid-gap:.5rem;gap:.5rem}.gap-3{grid-gap:.75rem;gap:.75rem}.gap-4{grid-gap:1rem;gap:1rem}.gap-5{grid-gap:1.25rem;gap:1.25rem}.gap-6{grid-gap:1.5rem;gap:1.5rem}.gap-8{grid-gap:2rem;gap:2rem}.gap-10{grid-gap:2.5rem;gap:2.5rem}.gap-12{grid-gap:3rem;gap:3rem}.gap-16{grid-gap:4rem;gap:4rem}.gap-20{grid-gap:5rem;gap:5rem}.gap-24{grid-gap:6rem;gap:6rem}.gap-32{grid-gap:8rem;gap:8rem}.gap-40{grid-gap:10rem;gap:10rem}.gap-48{grid-gap:12rem;gap:12rem}.gap-56{grid-gap:14rem;gap:14rem}.gap-64{grid-gap:16rem;gap:16rem}.gap-px{grid-gap:1px;gap:1px}.col-gap-0{grid-column-gap:0;column-gap:0}.col-gap-1{grid-column-gap:.25rem;column-gap:.25rem}.col-gap-2{grid-column-gap:.5rem;column-gap:.5rem}.col-gap-3{grid-column-gap:.75rem;column-gap:.75rem}.col-gap-4{grid-column-gap:1rem;column-gap:1rem}.col-gap-5{grid-column-gap:1.25rem;column-gap:1.25rem}.col-gap-6{grid-column-gap:1.5rem;column-gap:1.5rem}.col-gap-8{grid-column-gap:2rem;column-gap:2rem}.col-gap-10{grid-column-gap:2.5rem;column-gap:2.5rem}.col-gap-12{grid-column-gap:3rem;column-gap:3rem}.col-gap-16{grid-column-gap:4rem;column-gap:4rem}.col-gap-20{grid-column-gap:5rem;column-gap:5rem}.col-gap-24{grid-column-gap:6rem;column-gap:6rem}.col-gap-32{grid-column-gap:8rem;column-gap:8rem}.col-gap-40{grid-column-gap:10rem;column-gap:10rem}.col-gap-48{grid-column-gap:12rem;column-gap:12rem}.col-gap-56{grid-column-gap:14rem;column-gap:14rem}.col-gap-64{grid-column-gap:16rem;column-gap:16rem}.col-gap-px{grid-column-gap:1px;column-gap:1px}.gap-x-0{grid-column-gap:0;column-gap:0}.gap-x-1{grid-column-gap:.25rem;column-gap:.25rem}.gap-x-2{grid-column-gap:.5rem;column-gap:.5rem}.gap-x-3{grid-column-gap:.75rem;column-gap:.75rem}.gap-x-4{grid-column-gap:1rem;column-gap:1rem}.gap-x-5{grid-column-gap:1.25rem;column-gap:1.25rem}.gap-x-6{grid-column-gap:1.5rem;column-gap:1.5rem}.gap-x-8{grid-column-gap:2rem;column-gap:2rem}.gap-x-10{grid-column-gap:2.5rem;column-gap:2.5rem}.gap-x-12{grid-column-gap:3rem;column-gap:3rem}.gap-x-16{grid-column-gap:4rem;column-gap:4rem}.gap-x-20{grid-column-gap:5rem;column-gap:5rem}.gap-x-24{grid-column-gap:6rem;column-gap:6rem}.gap-x-32{grid-column-gap:8rem;column-gap:8rem}.gap-x-40{grid-column-gap:10rem;column-gap:10rem}.gap-x-48{grid-column-gap:12rem;column-gap:12rem}.gap-x-56{grid-column-gap:14rem;column-gap:14rem}.gap-x-64{grid-column-gap:16rem;column-gap:16rem}.gap-x-px{grid-column-gap:1px;column-gap:1px}.row-gap-0{grid-row-gap:0;row-gap:0}.row-gap-1{grid-row-gap:.25rem;row-gap:.25rem}.row-gap-2{grid-row-gap:.5rem;row-gap:.5rem}.row-gap-3{grid-row-gap:.75rem;row-gap:.75rem}.row-gap-4{grid-row-gap:1rem;row-gap:1rem}.row-gap-5{grid-row-gap:1.25rem;row-gap:1.25rem}.row-gap-6{grid-row-gap:1.5rem;row-gap:1.5rem}.row-gap-8{grid-row-gap:2rem;row-gap:2rem}.row-gap-10{grid-row-gap:2.5rem;row-gap:2.5rem}.row-gap-12{grid-row-gap:3rem;row-gap:3rem}.row-gap-16{grid-row-gap:4rem;row-gap:4rem}.row-gap-20{grid-row-gap:5rem;row-gap:5rem}.row-gap-24{grid-row-gap:6rem;row-gap:6rem}.row-gap-32{grid-row-gap:8rem;row-gap:8rem}.row-gap-40{grid-row-gap:10rem;row-gap:10rem}.row-gap-48{grid-row-gap:12rem;row-gap:12rem}.row-gap-56{grid-row-gap:14rem;row-gap:14rem}.row-gap-64{grid-row-gap:16rem;row-gap:16rem}.row-gap-px{grid-row-gap:1px;row-gap:1px}.gap-y-0{grid-row-gap:0;row-gap:0}.gap-y-1{grid-row-gap:.25rem;row-gap:.25rem}.gap-y-2{grid-row-gap:.5rem;row-gap:.5rem}.gap-y-3{grid-row-gap:.75rem;row-gap:.75rem}.gap-y-4{grid-row-gap:1rem;row-gap:1rem}.gap-y-5{grid-row-gap:1.25rem;row-gap:1.25rem}.gap-y-6{grid-row-gap:1.5rem;row-gap:1.5rem}.gap-y-8{grid-row-gap:2rem;row-gap:2rem}.gap-y-10{grid-row-gap:2.5rem;row-gap:2.5rem}.gap-y-12{grid-row-gap:3rem;row-gap:3rem}.gap-y-16{grid-row-gap:4rem;row-gap:4rem}.gap-y-20{grid-row-gap:5rem;row-gap:5rem}.gap-y-24{grid-row-gap:6rem;row-gap:6rem}.gap-y-32{grid-row-gap:8rem;row-gap:8rem}.gap-y-40{grid-row-gap:10rem;row-gap:10rem}.gap-y-48{grid-row-gap:12rem;row-gap:12rem}.gap-y-56{grid-row-gap:14rem;row-gap:14rem}.gap-y-64{grid-row-gap:16rem;row-gap:16rem}.gap-y-px{grid-row-gap:1px;row-gap:1px}.grid-flow-row{grid-auto-flow:row}.grid-flow-col{grid-auto-flow:column}.grid-flow-row-dense{grid-auto-flow:row dense}.grid-flow-col-dense{grid-auto-flow:column dense}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-none{grid-template-columns:none}.auto-cols-auto{grid-auto-columns:auto}.auto-cols-min{grid-auto-columns:-webkit-min-content;grid-auto-columns:min-content}.auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.col-auto{grid-column:auto}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-4{grid-column:span 4/span 4}.col-span-5{grid-column:span 5/span 5}.col-span-6{grid-column:span 6/span 6}.col-span-7{grid-column:span 7/span 7}.col-span-8{grid-column:span 8/span 8}.col-span-9{grid-column:span 9/span 9}.col-span-10{grid-column:span 10/span 10}.col-span-11{grid-column:span 11/span 11}.col-span-12{grid-column:span 12/span 12}.col-span-full{grid-column:1/-1}.col-start-1{grid-column-start:1}.col-start-2{grid-column-start:2}.col-start-3{grid-column-start:3}.col-start-4{grid-column-start:4}.col-start-5{grid-column-start:5}.col-start-6{grid-column-start:6}.col-start-7{grid-column-start:7}.col-start-8{grid-column-start:8}.col-start-9{grid-column-start:9}.col-start-10{grid-column-start:10}.col-start-11{grid-column-start:11}.col-start-12{grid-column-start:12}.col-start-13{grid-column-start:13}.col-start-auto{grid-column-start:auto}.col-end-1{grid-column-end:1}.col-end-2{grid-column-end:2}.col-end-3{grid-column-end:3}.col-end-4{grid-column-end:4}.col-end-5{grid-column-end:5}.col-end-6{grid-column-end:6}.col-end-7{grid-column-end:7}.col-end-8{grid-column-end:8}.col-end-9{grid-column-end:9}.col-end-10{grid-column-end:10}.col-end-11{grid-column-end:11}.col-end-12{grid-column-end:12}.col-end-13{grid-column-end:13}.col-end-auto{grid-column-end:auto}.grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.grid-rows-none{grid-template-rows:none}.auto-rows-auto{grid-auto-rows:auto}.auto-rows-min{grid-auto-rows:-webkit-min-content;grid-auto-rows:min-content}.auto-rows-max{grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}.auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.row-auto{grid-row:auto}.row-span-1{grid-row:span 1/span 1}.row-span-2{grid-row:span 2/span 2}.row-span-3{grid-row:span 3/span 3}.row-span-4{grid-row:span 4/span 4}.row-span-5{grid-row:span 5/span 5}.row-span-6{grid-row:span 6/span 6}.row-span-full{grid-row:1/-1}.row-start-1{grid-row-start:1}.row-start-2{grid-row-start:2}.row-start-3{grid-row-start:3}.row-start-4{grid-row-start:4}.row-start-5{grid-row-start:5}.row-start-6{grid-row-start:6}.row-start-7{grid-row-start:7}.row-start-auto{grid-row-start:auto}.row-end-1{grid-row-end:1}.row-end-2{grid-row-end:2}.row-end-3{grid-row-end:3}.row-end-4{grid-row-end:4}.row-end-5{grid-row-end:5}.row-end-6{grid-row-end:6}.row-end-7{grid-row-end:7}.row-end-auto{grid-row-end:auto}.transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.transform-none{transform:none}.origin-center{transform-origin:center}.origin-top{transform-origin:top}.origin-top-right{transform-origin:top right}.origin-right{transform-origin:right}.origin-bottom-right{transform-origin:bottom right}.origin-bottom{transform-origin:bottom}.origin-bottom-left{transform-origin:bottom left}.origin-left{transform-origin:left}.origin-top-left{transform-origin:top left}.scale-0{--transform-scale-x:0;--transform-scale-y:0}.scale-50{--transform-scale-x:.5;--transform-scale-y:.5}.scale-75{--transform-scale-x:.75;--transform-scale-y:.75}.scale-90{--transform-scale-x:.9;--transform-scale-y:.9}.scale-95{--transform-scale-x:.95;--transform-scale-y:.95}.scale-100{--transform-scale-x:1;--transform-scale-y:1}.scale-105{--transform-scale-x:1.05;--transform-scale-y:1.05}.scale-110{--transform-scale-x:1.1;--transform-scale-y:1.1}.scale-125{--transform-scale-x:1.25;--transform-scale-y:1.25}.scale-150{--transform-scale-x:1.5;--transform-scale-y:1.5}.scale-x-0{--transform-scale-x:0}.scale-x-50{--transform-scale-x:.5}.scale-x-75{--transform-scale-x:.75}.scale-x-90{--transform-scale-x:.9}.scale-x-95{--transform-scale-x:.95}.scale-x-100{--transform-scale-x:1}.scale-x-105{--transform-scale-x:1.05}.scale-x-110{--transform-scale-x:1.1}.scale-x-125{--transform-scale-x:1.25}.scale-x-150{--transform-scale-x:1.5}.scale-y-0{--transform-scale-y:0}.scale-y-50{--transform-scale-y:.5}.scale-y-75{--transform-scale-y:.75}.scale-y-90{--transform-scale-y:.9}.scale-y-95{--transform-scale-y:.95}.scale-y-100{--transform-scale-y:1}.scale-y-105{--transform-scale-y:1.05}.scale-y-110{--transform-scale-y:1.1}.scale-y-125{--transform-scale-y:1.25}.scale-y-150{--transform-scale-y:1.5}.hover\:scale-0:hover{--transform-scale-x:0;--transform-scale-y:0}.hover\:scale-50:hover{--transform-scale-x:.5;--transform-scale-y:.5}.hover\:scale-75:hover{--transform-scale-x:.75;--transform-scale-y:.75}.hover\:scale-90:hover{--transform-scale-x:.9;--transform-scale-y:.9}.hover\:scale-95:hover{--transform-scale-x:.95;--transform-scale-y:.95}.hover\:scale-100:hover{--transform-scale-x:1;--transform-scale-y:1}.hover\:scale-105:hover{--transform-scale-x:1.05;--transform-scale-y:1.05}.hover\:scale-110:hover{--transform-scale-x:1.1;--transform-scale-y:1.1}.hover\:scale-125:hover{--transform-scale-x:1.25;--transform-scale-y:1.25}.hover\:scale-150:hover{--transform-scale-x:1.5;--transform-scale-y:1.5}.hover\:scale-x-0:hover{--transform-scale-x:0}.hover\:scale-x-50:hover{--transform-scale-x:.5}.hover\:scale-x-75:hover{--transform-scale-x:.75}.hover\:scale-x-90:hover{--transform-scale-x:.9}.hover\:scale-x-95:hover{--transform-scale-x:.95}.hover\:scale-x-100:hover{--transform-scale-x:1}.hover\:scale-x-105:hover{--transform-scale-x:1.05}.hover\:scale-x-110:hover{--transform-scale-x:1.1}.hover\:scale-x-125:hover{--transform-scale-x:1.25}.hover\:scale-x-150:hover{--transform-scale-x:1.5}.hover\:scale-y-0:hover{--transform-scale-y:0}.hover\:scale-y-50:hover{--transform-scale-y:.5}.hover\:scale-y-75:hover{--transform-scale-y:.75}.hover\:scale-y-90:hover{--transform-scale-y:.9}.hover\:scale-y-95:hover{--transform-scale-y:.95}.hover\:scale-y-100:hover{--transform-scale-y:1}.hover\:scale-y-105:hover{--transform-scale-y:1.05}.hover\:scale-y-110:hover{--transform-scale-y:1.1}.hover\:scale-y-125:hover{--transform-scale-y:1.25}.hover\:scale-y-150:hover{--transform-scale-y:1.5}.focus\:scale-0:focus{--transform-scale-x:0;--transform-scale-y:0}.focus\:scale-50:focus{--transform-scale-x:.5;--transform-scale-y:.5}.focus\:scale-75:focus{--transform-scale-x:.75;--transform-scale-y:.75}.focus\:scale-90:focus{--transform-scale-x:.9;--transform-scale-y:.9}.focus\:scale-95:focus{--transform-scale-x:.95;--transform-scale-y:.95}.focus\:scale-100:focus{--transform-scale-x:1;--transform-scale-y:1}.focus\:scale-105:focus{--transform-scale-x:1.05;--transform-scale-y:1.05}.focus\:scale-110:focus{--transform-scale-x:1.1;--transform-scale-y:1.1}.focus\:scale-125:focus{--transform-scale-x:1.25;--transform-scale-y:1.25}.focus\:scale-150:focus{--transform-scale-x:1.5;--transform-scale-y:1.5}.focus\:scale-x-0:focus{--transform-scale-x:0}.focus\:scale-x-50:focus{--transform-scale-x:.5}.focus\:scale-x-75:focus{--transform-scale-x:.75}.focus\:scale-x-90:focus{--transform-scale-x:.9}.focus\:scale-x-95:focus{--transform-scale-x:.95}.focus\:scale-x-100:focus{--transform-scale-x:1}.focus\:scale-x-105:focus{--transform-scale-x:1.05}.focus\:scale-x-110:focus{--transform-scale-x:1.1}.focus\:scale-x-125:focus{--transform-scale-x:1.25}.focus\:scale-x-150:focus{--transform-scale-x:1.5}.focus\:scale-y-0:focus{--transform-scale-y:0}.focus\:scale-y-50:focus{--transform-scale-y:.5}.focus\:scale-y-75:focus{--transform-scale-y:.75}.focus\:scale-y-90:focus{--transform-scale-y:.9}.focus\:scale-y-95:focus{--transform-scale-y:.95}.focus\:scale-y-100:focus{--transform-scale-y:1}.focus\:scale-y-105:focus{--transform-scale-y:1.05}.focus\:scale-y-110:focus{--transform-scale-y:1.1}.focus\:scale-y-125:focus{--transform-scale-y:1.25}.focus\:scale-y-150:focus{--transform-scale-y:1.5}.rotate-0{--transform-rotate:0}.rotate-1{--transform-rotate:1deg}.rotate-2{--transform-rotate:2deg}.rotate-3{--transform-rotate:3deg}.rotate-6{--transform-rotate:6deg}.rotate-12{--transform-rotate:12deg}.rotate-45{--transform-rotate:45deg}.rotate-90{--transform-rotate:90deg}.rotate-180{--transform-rotate:180deg}.-rotate-180{--transform-rotate:-180deg}.-rotate-90{--transform-rotate:-90deg}.-rotate-45{--transform-rotate:-45deg}.-rotate-12{--transform-rotate:-12deg}.-rotate-6{--transform-rotate:-6deg}.-rotate-3{--transform-rotate:-3deg}.-rotate-2{--transform-rotate:-2deg}.-rotate-1{--transform-rotate:-1deg}.hover\:rotate-0:hover{--transform-rotate:0}.hover\:rotate-1:hover{--transform-rotate:1deg}.hover\:rotate-2:hover{--transform-rotate:2deg}.hover\:rotate-3:hover{--transform-rotate:3deg}.hover\:rotate-6:hover{--transform-rotate:6deg}.hover\:rotate-12:hover{--transform-rotate:12deg}.hover\:rotate-45:hover{--transform-rotate:45deg}.hover\:rotate-90:hover{--transform-rotate:90deg}.hover\:rotate-180:hover{--transform-rotate:180deg}.hover\:-rotate-180:hover{--transform-rotate:-180deg}.hover\:-rotate-90:hover{--transform-rotate:-90deg}.hover\:-rotate-45:hover{--transform-rotate:-45deg}.hover\:-rotate-12:hover{--transform-rotate:-12deg}.hover\:-rotate-6:hover{--transform-rotate:-6deg}.hover\:-rotate-3:hover{--transform-rotate:-3deg}.hover\:-rotate-2:hover{--transform-rotate:-2deg}.hover\:-rotate-1:hover{--transform-rotate:-1deg}.focus\:rotate-0:focus{--transform-rotate:0}.focus\:rotate-1:focus{--transform-rotate:1deg}.focus\:rotate-2:focus{--transform-rotate:2deg}.focus\:rotate-3:focus{--transform-rotate:3deg}.focus\:rotate-6:focus{--transform-rotate:6deg}.focus\:rotate-12:focus{--transform-rotate:12deg}.focus\:rotate-45:focus{--transform-rotate:45deg}.focus\:rotate-90:focus{--transform-rotate:90deg}.focus\:rotate-180:focus{--transform-rotate:180deg}.focus\:-rotate-180:focus{--transform-rotate:-180deg}.focus\:-rotate-90:focus{--transform-rotate:-90deg}.focus\:-rotate-45:focus{--transform-rotate:-45deg}.focus\:-rotate-12:focus{--transform-rotate:-12deg}.focus\:-rotate-6:focus{--transform-rotate:-6deg}.focus\:-rotate-3:focus{--transform-rotate:-3deg}.focus\:-rotate-2:focus{--transform-rotate:-2deg}.focus\:-rotate-1:focus{--transform-rotate:-1deg}.translate-x-0{--transform-translate-x:0}.translate-x-1{--transform-translate-x:0.25rem}.translate-x-2{--transform-translate-x:0.5rem}.translate-x-3{--transform-translate-x:0.75rem}.translate-x-4{--transform-translate-x:1rem}.translate-x-5{--transform-translate-x:1.25rem}.translate-x-6{--transform-translate-x:1.5rem}.translate-x-8{--transform-translate-x:2rem}.translate-x-10{--transform-translate-x:2.5rem}.translate-x-12{--transform-translate-x:3rem}.translate-x-16{--transform-translate-x:4rem}.translate-x-20{--transform-translate-x:5rem}.translate-x-24{--transform-translate-x:6rem}.translate-x-32{--transform-translate-x:8rem}.translate-x-40{--transform-translate-x:10rem}.translate-x-48{--transform-translate-x:12rem}.translate-x-56{--transform-translate-x:14rem}.translate-x-64{--transform-translate-x:16rem}.translate-x-px{--transform-translate-x:1px}.-translate-x-1{--transform-translate-x:-0.25rem}.-translate-x-2{--transform-translate-x:-0.5rem}.-translate-x-3{--transform-translate-x:-0.75rem}.-translate-x-4{--transform-translate-x:-1rem}.-translate-x-5{--transform-translate-x:-1.25rem}.-translate-x-6{--transform-translate-x:-1.5rem}.-translate-x-8{--transform-translate-x:-2rem}.-translate-x-10{--transform-translate-x:-2.5rem}.-translate-x-12{--transform-translate-x:-3rem}.-translate-x-16{--transform-translate-x:-4rem}.-translate-x-20{--transform-translate-x:-5rem}.-translate-x-24{--transform-translate-x:-6rem}.-translate-x-32{--transform-translate-x:-8rem}.-translate-x-40{--transform-translate-x:-10rem}.-translate-x-48{--transform-translate-x:-12rem}.-translate-x-56{--transform-translate-x:-14rem}.-translate-x-64{--transform-translate-x:-16rem}.-translate-x-px{--transform-translate-x:-1px}.-translate-x-full{--transform-translate-x:-100%}.-translate-x-1\/2{--transform-translate-x:-50%}.translate-x-1\/2{--transform-translate-x:50%}.translate-x-full{--transform-translate-x:100%}.translate-y-0{--transform-translate-y:0}.translate-y-1{--transform-translate-y:0.25rem}.translate-y-2{--transform-translate-y:0.5rem}.translate-y-3{--transform-translate-y:0.75rem}.translate-y-4{--transform-translate-y:1rem}.translate-y-5{--transform-translate-y:1.25rem}.translate-y-6{--transform-translate-y:1.5rem}.translate-y-8{--transform-translate-y:2rem}.translate-y-10{--transform-translate-y:2.5rem}.translate-y-12{--transform-translate-y:3rem}.translate-y-16{--transform-translate-y:4rem}.translate-y-20{--transform-translate-y:5rem}.translate-y-24{--transform-translate-y:6rem}.translate-y-32{--transform-translate-y:8rem}.translate-y-40{--transform-translate-y:10rem}.translate-y-48{--transform-translate-y:12rem}.translate-y-56{--transform-translate-y:14rem}.translate-y-64{--transform-translate-y:16rem}.translate-y-px{--transform-translate-y:1px}.-translate-y-1{--transform-translate-y:-0.25rem}.-translate-y-2{--transform-translate-y:-0.5rem}.-translate-y-3{--transform-translate-y:-0.75rem}.-translate-y-4{--transform-translate-y:-1rem}.-translate-y-5{--transform-translate-y:-1.25rem}.-translate-y-6{--transform-translate-y:-1.5rem}.-translate-y-8{--transform-translate-y:-2rem}.-translate-y-10{--transform-translate-y:-2.5rem}.-translate-y-12{--transform-translate-y:-3rem}.-translate-y-16{--transform-translate-y:-4rem}.-translate-y-20{--transform-translate-y:-5rem}.-translate-y-24{--transform-translate-y:-6rem}.-translate-y-32{--transform-translate-y:-8rem}.-translate-y-40{--transform-translate-y:-10rem}.-translate-y-48{--transform-translate-y:-12rem}.-translate-y-56{--transform-translate-y:-14rem}.-translate-y-64{--transform-translate-y:-16rem}.-translate-y-px{--transform-translate-y:-1px}.-translate-y-full{--transform-translate-y:-100%}.-translate-y-1\/2{--transform-translate-y:-50%}.translate-y-1\/2{--transform-translate-y:50%}.translate-y-full{--transform-translate-y:100%}.hover\:translate-x-0:hover{--transform-translate-x:0}.hover\:translate-x-1:hover{--transform-translate-x:0.25rem}.hover\:translate-x-2:hover{--transform-translate-x:0.5rem}.hover\:translate-x-3:hover{--transform-translate-x:0.75rem}.hover\:translate-x-4:hover{--transform-translate-x:1rem}.hover\:translate-x-5:hover{--transform-translate-x:1.25rem}.hover\:translate-x-6:hover{--transform-translate-x:1.5rem}.hover\:translate-x-8:hover{--transform-translate-x:2rem}.hover\:translate-x-10:hover{--transform-translate-x:2.5rem}.hover\:translate-x-12:hover{--transform-translate-x:3rem}.hover\:translate-x-16:hover{--transform-translate-x:4rem}.hover\:translate-x-20:hover{--transform-translate-x:5rem}.hover\:translate-x-24:hover{--transform-translate-x:6rem}.hover\:translate-x-32:hover{--transform-translate-x:8rem}.hover\:translate-x-40:hover{--transform-translate-x:10rem}.hover\:translate-x-48:hover{--transform-translate-x:12rem}.hover\:translate-x-56:hover{--transform-translate-x:14rem}.hover\:translate-x-64:hover{--transform-translate-x:16rem}.hover\:translate-x-px:hover{--transform-translate-x:1px}.hover\:-translate-x-1:hover{--transform-translate-x:-0.25rem}.hover\:-translate-x-2:hover{--transform-translate-x:-0.5rem}.hover\:-translate-x-3:hover{--transform-translate-x:-0.75rem}.hover\:-translate-x-4:hover{--transform-translate-x:-1rem}.hover\:-translate-x-5:hover{--transform-translate-x:-1.25rem}.hover\:-translate-x-6:hover{--transform-translate-x:-1.5rem}.hover\:-translate-x-8:hover{--transform-translate-x:-2rem}.hover\:-translate-x-10:hover{--transform-translate-x:-2.5rem}.hover\:-translate-x-12:hover{--transform-translate-x:-3rem}.hover\:-translate-x-16:hover{--transform-translate-x:-4rem}.hover\:-translate-x-20:hover{--transform-translate-x:-5rem}.hover\:-translate-x-24:hover{--transform-translate-x:-6rem}.hover\:-translate-x-32:hover{--transform-translate-x:-8rem}.hover\:-translate-x-40:hover{--transform-translate-x:-10rem}.hover\:-translate-x-48:hover{--transform-translate-x:-12rem}.hover\:-translate-x-56:hover{--transform-translate-x:-14rem}.hover\:-translate-x-64:hover{--transform-translate-x:-16rem}.hover\:-translate-x-px:hover{--transform-translate-x:-1px}.hover\:-translate-x-full:hover{--transform-translate-x:-100%}.hover\:-translate-x-1\/2:hover{--transform-translate-x:-50%}.hover\:translate-x-1\/2:hover{--transform-translate-x:50%}.hover\:translate-x-full:hover{--transform-translate-x:100%}.hover\:translate-y-0:hover{--transform-translate-y:0}.hover\:translate-y-1:hover{--transform-translate-y:0.25rem}.hover\:translate-y-2:hover{--transform-translate-y:0.5rem}.hover\:translate-y-3:hover{--transform-translate-y:0.75rem}.hover\:translate-y-4:hover{--transform-translate-y:1rem}.hover\:translate-y-5:hover{--transform-translate-y:1.25rem}.hover\:translate-y-6:hover{--transform-translate-y:1.5rem}.hover\:translate-y-8:hover{--transform-translate-y:2rem}.hover\:translate-y-10:hover{--transform-translate-y:2.5rem}.hover\:translate-y-12:hover{--transform-translate-y:3rem}.hover\:translate-y-16:hover{--transform-translate-y:4rem}.hover\:translate-y-20:hover{--transform-translate-y:5rem}.hover\:translate-y-24:hover{--transform-translate-y:6rem}.hover\:translate-y-32:hover{--transform-translate-y:8rem}.hover\:translate-y-40:hover{--transform-translate-y:10rem}.hover\:translate-y-48:hover{--transform-translate-y:12rem}.hover\:translate-y-56:hover{--transform-translate-y:14rem}.hover\:translate-y-64:hover{--transform-translate-y:16rem}.hover\:translate-y-px:hover{--transform-translate-y:1px}.hover\:-translate-y-1:hover{--transform-translate-y:-0.25rem}.hover\:-translate-y-2:hover{--transform-translate-y:-0.5rem}.hover\:-translate-y-3:hover{--transform-translate-y:-0.75rem}.hover\:-translate-y-4:hover{--transform-translate-y:-1rem}.hover\:-translate-y-5:hover{--transform-translate-y:-1.25rem}.hover\:-translate-y-6:hover{--transform-translate-y:-1.5rem}.hover\:-translate-y-8:hover{--transform-translate-y:-2rem}.hover\:-translate-y-10:hover{--transform-translate-y:-2.5rem}.hover\:-translate-y-12:hover{--transform-translate-y:-3rem}.hover\:-translate-y-16:hover{--transform-translate-y:-4rem}.hover\:-translate-y-20:hover{--transform-translate-y:-5rem}.hover\:-translate-y-24:hover{--transform-translate-y:-6rem}.hover\:-translate-y-32:hover{--transform-translate-y:-8rem}.hover\:-translate-y-40:hover{--transform-translate-y:-10rem}.hover\:-translate-y-48:hover{--transform-translate-y:-12rem}.hover\:-translate-y-56:hover{--transform-translate-y:-14rem}.hover\:-translate-y-64:hover{--transform-translate-y:-16rem}.hover\:-translate-y-px:hover{--transform-translate-y:-1px}.hover\:-translate-y-full:hover{--transform-translate-y:-100%}.hover\:-translate-y-1\/2:hover{--transform-translate-y:-50%}.hover\:translate-y-1\/2:hover{--transform-translate-y:50%}.hover\:translate-y-full:hover{--transform-translate-y:100%}.focus\:translate-x-0:focus{--transform-translate-x:0}.focus\:translate-x-1:focus{--transform-translate-x:0.25rem}.focus\:translate-x-2:focus{--transform-translate-x:0.5rem}.focus\:translate-x-3:focus{--transform-translate-x:0.75rem}.focus\:translate-x-4:focus{--transform-translate-x:1rem}.focus\:translate-x-5:focus{--transform-translate-x:1.25rem}.focus\:translate-x-6:focus{--transform-translate-x:1.5rem}.focus\:translate-x-8:focus{--transform-translate-x:2rem}.focus\:translate-x-10:focus{--transform-translate-x:2.5rem}.focus\:translate-x-12:focus{--transform-translate-x:3rem}.focus\:translate-x-16:focus{--transform-translate-x:4rem}.focus\:translate-x-20:focus{--transform-translate-x:5rem}.focus\:translate-x-24:focus{--transform-translate-x:6rem}.focus\:translate-x-32:focus{--transform-translate-x:8rem}.focus\:translate-x-40:focus{--transform-translate-x:10rem}.focus\:translate-x-48:focus{--transform-translate-x:12rem}.focus\:translate-x-56:focus{--transform-translate-x:14rem}.focus\:translate-x-64:focus{--transform-translate-x:16rem}.focus\:translate-x-px:focus{--transform-translate-x:1px}.focus\:-translate-x-1:focus{--transform-translate-x:-0.25rem}.focus\:-translate-x-2:focus{--transform-translate-x:-0.5rem}.focus\:-translate-x-3:focus{--transform-translate-x:-0.75rem}.focus\:-translate-x-4:focus{--transform-translate-x:-1rem}.focus\:-translate-x-5:focus{--transform-translate-x:-1.25rem}.focus\:-translate-x-6:focus{--transform-translate-x:-1.5rem}.focus\:-translate-x-8:focus{--transform-translate-x:-2rem}.focus\:-translate-x-10:focus{--transform-translate-x:-2.5rem}.focus\:-translate-x-12:focus{--transform-translate-x:-3rem}.focus\:-translate-x-16:focus{--transform-translate-x:-4rem}.focus\:-translate-x-20:focus{--transform-translate-x:-5rem}.focus\:-translate-x-24:focus{--transform-translate-x:-6rem}.focus\:-translate-x-32:focus{--transform-translate-x:-8rem}.focus\:-translate-x-40:focus{--transform-translate-x:-10rem}.focus\:-translate-x-48:focus{--transform-translate-x:-12rem}.focus\:-translate-x-56:focus{--transform-translate-x:-14rem}.focus\:-translate-x-64:focus{--transform-translate-x:-16rem}.focus\:-translate-x-px:focus{--transform-translate-x:-1px}.focus\:-translate-x-full:focus{--transform-translate-x:-100%}.focus\:-translate-x-1\/2:focus{--transform-translate-x:-50%}.focus\:translate-x-1\/2:focus{--transform-translate-x:50%}.focus\:translate-x-full:focus{--transform-translate-x:100%}.focus\:translate-y-0:focus{--transform-translate-y:0}.focus\:translate-y-1:focus{--transform-translate-y:0.25rem}.focus\:translate-y-2:focus{--transform-translate-y:0.5rem}.focus\:translate-y-3:focus{--transform-translate-y:0.75rem}.focus\:translate-y-4:focus{--transform-translate-y:1rem}.focus\:translate-y-5:focus{--transform-translate-y:1.25rem}.focus\:translate-y-6:focus{--transform-translate-y:1.5rem}.focus\:translate-y-8:focus{--transform-translate-y:2rem}.focus\:translate-y-10:focus{--transform-translate-y:2.5rem}.focus\:translate-y-12:focus{--transform-translate-y:3rem}.focus\:translate-y-16:focus{--transform-translate-y:4rem}.focus\:translate-y-20:focus{--transform-translate-y:5rem}.focus\:translate-y-24:focus{--transform-translate-y:6rem}.focus\:translate-y-32:focus{--transform-translate-y:8rem}.focus\:translate-y-40:focus{--transform-translate-y:10rem}.focus\:translate-y-48:focus{--transform-translate-y:12rem}.focus\:translate-y-56:focus{--transform-translate-y:14rem}.focus\:translate-y-64:focus{--transform-translate-y:16rem}.focus\:translate-y-px:focus{--transform-translate-y:1px}.focus\:-translate-y-1:focus{--transform-translate-y:-0.25rem}.focus\:-translate-y-2:focus{--transform-translate-y:-0.5rem}.focus\:-translate-y-3:focus{--transform-translate-y:-0.75rem}.focus\:-translate-y-4:focus{--transform-translate-y:-1rem}.focus\:-translate-y-5:focus{--transform-translate-y:-1.25rem}.focus\:-translate-y-6:focus{--transform-translate-y:-1.5rem}.focus\:-translate-y-8:focus{--transform-translate-y:-2rem}.focus\:-translate-y-10:focus{--transform-translate-y:-2.5rem}.focus\:-translate-y-12:focus{--transform-translate-y:-3rem}.focus\:-translate-y-16:focus{--transform-translate-y:-4rem}.focus\:-translate-y-20:focus{--transform-translate-y:-5rem}.focus\:-translate-y-24:focus{--transform-translate-y:-6rem}.focus\:-translate-y-32:focus{--transform-translate-y:-8rem}.focus\:-translate-y-40:focus{--transform-translate-y:-10rem}.focus\:-translate-y-48:focus{--transform-translate-y:-12rem}.focus\:-translate-y-56:focus{--transform-translate-y:-14rem}.focus\:-translate-y-64:focus{--transform-translate-y:-16rem}.focus\:-translate-y-px:focus{--transform-translate-y:-1px}.focus\:-translate-y-full:focus{--transform-translate-y:-100%}.focus\:-translate-y-1\/2:focus{--transform-translate-y:-50%}.focus\:translate-y-1\/2:focus{--transform-translate-y:50%}.focus\:translate-y-full:focus{--transform-translate-y:100%}.skew-x-0{--transform-skew-x:0}.skew-x-1{--transform-skew-x:1deg}.skew-x-2{--transform-skew-x:2deg}.skew-x-3{--transform-skew-x:3deg}.skew-x-6{--transform-skew-x:6deg}.skew-x-12{--transform-skew-x:12deg}.-skew-x-12{--transform-skew-x:-12deg}.-skew-x-6{--transform-skew-x:-6deg}.-skew-x-3{--transform-skew-x:-3deg}.-skew-x-2{--transform-skew-x:-2deg}.-skew-x-1{--transform-skew-x:-1deg}.skew-y-0{--transform-skew-y:0}.skew-y-1{--transform-skew-y:1deg}.skew-y-2{--transform-skew-y:2deg}.skew-y-3{--transform-skew-y:3deg}.skew-y-6{--transform-skew-y:6deg}.skew-y-12{--transform-skew-y:12deg}.-skew-y-12{--transform-skew-y:-12deg}.-skew-y-6{--transform-skew-y:-6deg}.-skew-y-3{--transform-skew-y:-3deg}.-skew-y-2{--transform-skew-y:-2deg}.-skew-y-1{--transform-skew-y:-1deg}.hover\:skew-x-0:hover{--transform-skew-x:0}.hover\:skew-x-1:hover{--transform-skew-x:1deg}.hover\:skew-x-2:hover{--transform-skew-x:2deg}.hover\:skew-x-3:hover{--transform-skew-x:3deg}.hover\:skew-x-6:hover{--transform-skew-x:6deg}.hover\:skew-x-12:hover{--transform-skew-x:12deg}.hover\:-skew-x-12:hover{--transform-skew-x:-12deg}.hover\:-skew-x-6:hover{--transform-skew-x:-6deg}.hover\:-skew-x-3:hover{--transform-skew-x:-3deg}.hover\:-skew-x-2:hover{--transform-skew-x:-2deg}.hover\:-skew-x-1:hover{--transform-skew-x:-1deg}.hover\:skew-y-0:hover{--transform-skew-y:0}.hover\:skew-y-1:hover{--transform-skew-y:1deg}.hover\:skew-y-2:hover{--transform-skew-y:2deg}.hover\:skew-y-3:hover{--transform-skew-y:3deg}.hover\:skew-y-6:hover{--transform-skew-y:6deg}.hover\:skew-y-12:hover{--transform-skew-y:12deg}.hover\:-skew-y-12:hover{--transform-skew-y:-12deg}.hover\:-skew-y-6:hover{--transform-skew-y:-6deg}.hover\:-skew-y-3:hover{--transform-skew-y:-3deg}.hover\:-skew-y-2:hover{--transform-skew-y:-2deg}.hover\:-skew-y-1:hover{--transform-skew-y:-1deg}.focus\:skew-x-0:focus{--transform-skew-x:0}.focus\:skew-x-1:focus{--transform-skew-x:1deg}.focus\:skew-x-2:focus{--transform-skew-x:2deg}.focus\:skew-x-3:focus{--transform-skew-x:3deg}.focus\:skew-x-6:focus{--transform-skew-x:6deg}.focus\:skew-x-12:focus{--transform-skew-x:12deg}.focus\:-skew-x-12:focus{--transform-skew-x:-12deg}.focus\:-skew-x-6:focus{--transform-skew-x:-6deg}.focus\:-skew-x-3:focus{--transform-skew-x:-3deg}.focus\:-skew-x-2:focus{--transform-skew-x:-2deg}.focus\:-skew-x-1:focus{--transform-skew-x:-1deg}.focus\:skew-y-0:focus{--transform-skew-y:0}.focus\:skew-y-1:focus{--transform-skew-y:1deg}.focus\:skew-y-2:focus{--transform-skew-y:2deg}.focus\:skew-y-3:focus{--transform-skew-y:3deg}.focus\:skew-y-6:focus{--transform-skew-y:6deg}.focus\:skew-y-12:focus{--transform-skew-y:12deg}.focus\:-skew-y-12:focus{--transform-skew-y:-12deg}.focus\:-skew-y-6:focus{--transform-skew-y:-6deg}.focus\:-skew-y-3:focus{--transform-skew-y:-3deg}.focus\:-skew-y-2:focus{--transform-skew-y:-2deg}.focus\:-skew-y-1:focus{--transform-skew-y:-1deg}.transition-none{transition-property:none}.transition-all{transition-property:all}.transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform}.transition-colors{transition-property:background-color,border-color,color,fill,stroke}.transition-opacity{transition-property:opacity}.transition-shadow{transition-property:box-shadow}.transition-transform{transition-property:transform}.ease-linear{transition-timing-function:linear}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-75{transition-duration:75ms}.duration-100{transition-duration:.1s}.duration-150{transition-duration:150ms}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-700{transition-duration:.7s}.duration-1000{transition-duration:1s}.delay-75{transition-delay:75ms}.delay-100{transition-delay:.1s}.delay-150{transition-delay:150ms}.delay-200{transition-delay:.2s}.delay-300{transition-delay:.3s}.delay-500{transition-delay:.5s}.delay-700{transition-delay:.7s}.delay-1000{transition-delay:1s}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{100%,75%{transform:scale(2);opacity:0}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,100%{transform:translateY(-25%);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;animation-timing-function:cubic-bezier(0,0,.2,1)}}.animate-none{animation:none}.animate-spin{animation:spin 1s linear infinite}.animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.animate-bounce{animation:bounce 1s infinite}@media (min-width:640px){.sm\:container{width:100%}@media (min-width:640px){.sm\:container{max-width:640px}}@media (min-width:768px){.sm\:container{max-width:768px}}@media (min-width:1024px){.sm\:container{max-width:1024px}}@media (min-width:1280px){.sm\:container{max-width:1280px}}.sm\:space-y-0>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(0px * var(--space-y-reverse))}.sm\:space-x-0>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(0px * var(--space-x-reverse));margin-left:calc(0px * calc(1 - var(--space-x-reverse)))}.sm\:space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.25rem * var(--space-y-reverse))}.sm\:space-x-1>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.25rem * var(--space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.5rem * var(--space-y-reverse))}.sm\:space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.5rem * var(--space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.75rem * var(--space-y-reverse))}.sm\:space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.75rem * var(--space-x-reverse));margin-left:calc(.75rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1rem * var(--space-y-reverse))}.sm\:space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1rem * var(--space-x-reverse));margin-left:calc(1rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1.25rem * var(--space-y-reverse))}.sm\:space-x-5>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1.25rem * var(--space-x-reverse));margin-left:calc(1.25rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-6>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1.5rem * var(--space-y-reverse))}.sm\:space-x-6>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1.5rem * var(--space-x-reverse));margin-left:calc(1.5rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-8>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(2rem * var(--space-y-reverse))}.sm\:space-x-8>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(2rem * var(--space-x-reverse));margin-left:calc(2rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(2.5rem * var(--space-y-reverse))}.sm\:space-x-10>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(2.5rem * var(--space-x-reverse));margin-left:calc(2.5rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-12>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(3rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(3rem * var(--space-y-reverse))}.sm\:space-x-12>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(3rem * var(--space-x-reverse));margin-left:calc(3rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-16>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(4rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(4rem * var(--space-y-reverse))}.sm\:space-x-16>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(4rem * var(--space-x-reverse));margin-left:calc(4rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-20>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(5rem * var(--space-y-reverse))}.sm\:space-x-20>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(5rem * var(--space-x-reverse));margin-left:calc(5rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-24>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(6rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(6rem * var(--space-y-reverse))}.sm\:space-x-24>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(6rem * var(--space-x-reverse));margin-left:calc(6rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-32>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(8rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(8rem * var(--space-y-reverse))}.sm\:space-x-32>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(8rem * var(--space-x-reverse));margin-left:calc(8rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-40>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(10rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(10rem * var(--space-y-reverse))}.sm\:space-x-40>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(10rem * var(--space-x-reverse));margin-left:calc(10rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-48>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(12rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(12rem * var(--space-y-reverse))}.sm\:space-x-48>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(12rem * var(--space-x-reverse));margin-left:calc(12rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-56>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(14rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(14rem * var(--space-y-reverse))}.sm\:space-x-56>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(14rem * var(--space-x-reverse));margin-left:calc(14rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-64>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(16rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(16rem * var(--space-y-reverse))}.sm\:space-x-64>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(16rem * var(--space-x-reverse));margin-left:calc(16rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-px>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1px * var(--space-y-reverse))}.sm\:space-x-px>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1px * var(--space-x-reverse));margin-left:calc(1px * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.25rem * var(--space-y-reverse))}.sm\:-space-x-1>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.25rem * var(--space-x-reverse));margin-left:calc(-.25rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.5rem * var(--space-y-reverse))}.sm\:-space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.5rem * var(--space-x-reverse));margin-left:calc(-.5rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.75rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.75rem * var(--space-y-reverse))}.sm\:-space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.75rem * var(--space-x-reverse));margin-left:calc(-.75rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1rem * var(--space-y-reverse))}.sm\:-space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1rem * var(--space-x-reverse));margin-left:calc(-1rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1.25rem * var(--space-y-reverse))}.sm\:-space-x-5>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1.25rem * var(--space-x-reverse));margin-left:calc(-1.25rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-6>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1.5rem * var(--space-y-reverse))}.sm\:-space-x-6>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1.5rem * var(--space-x-reverse));margin-left:calc(-1.5rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-8>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-2rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-2rem * var(--space-y-reverse))}.sm\:-space-x-8>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-2rem * var(--space-x-reverse));margin-left:calc(-2rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-2.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-2.5rem * var(--space-y-reverse))}.sm\:-space-x-10>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-2.5rem * var(--space-x-reverse));margin-left:calc(-2.5rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-12>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-3rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-3rem * var(--space-y-reverse))}.sm\:-space-x-12>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-3rem * var(--space-x-reverse));margin-left:calc(-3rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-16>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-4rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-4rem * var(--space-y-reverse))}.sm\:-space-x-16>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-4rem * var(--space-x-reverse));margin-left:calc(-4rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-20>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-5rem * var(--space-y-reverse))}.sm\:-space-x-20>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-5rem * var(--space-x-reverse));margin-left:calc(-5rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-24>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-6rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-6rem * var(--space-y-reverse))}.sm\:-space-x-24>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-6rem * var(--space-x-reverse));margin-left:calc(-6rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-32>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-8rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-8rem * var(--space-y-reverse))}.sm\:-space-x-32>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-8rem * var(--space-x-reverse));margin-left:calc(-8rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-40>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-10rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-10rem * var(--space-y-reverse))}.sm\:-space-x-40>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-10rem * var(--space-x-reverse));margin-left:calc(-10rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-48>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-12rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-12rem * var(--space-y-reverse))}.sm\:-space-x-48>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-12rem * var(--space-x-reverse));margin-left:calc(-12rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-56>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-14rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-14rem * var(--space-y-reverse))}.sm\:-space-x-56>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-14rem * var(--space-x-reverse));margin-left:calc(-14rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-64>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-16rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-16rem * var(--space-y-reverse))}.sm\:-space-x-64>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-16rem * var(--space-x-reverse));margin-left:calc(-16rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-px>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1px * var(--space-y-reverse))}.sm\:-space-x-px>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1px * var(--space-x-reverse));margin-left:calc(-1px * calc(1 - var(--space-x-reverse)))}.sm\:space-y-reverse>:not(template)~:not(template){--space-y-reverse:1}.sm\:space-x-reverse>:not(template)~:not(template){--space-x-reverse:1}.sm\:divide-y-0>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(0px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(0px * var(--divide-y-reverse))}.sm\:divide-x-0>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(0px * var(--divide-x-reverse));border-left-width:calc(0px * calc(1 - var(--divide-x-reverse)))}.sm\:divide-y-2>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(2px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(2px * var(--divide-y-reverse))}.sm\:divide-x-2>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(2px * var(--divide-x-reverse));border-left-width:calc(2px * calc(1 - var(--divide-x-reverse)))}.sm\:divide-y-4>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(4px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(4px * var(--divide-y-reverse))}.sm\:divide-x-4>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(4px * var(--divide-x-reverse));border-left-width:calc(4px * calc(1 - var(--divide-x-reverse)))}.sm\:divide-y-8>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(8px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(8px * var(--divide-y-reverse))}.sm\:divide-x-8>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(8px * var(--divide-x-reverse));border-left-width:calc(8px * calc(1 - var(--divide-x-reverse)))}.sm\:divide-y>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(1px * var(--divide-y-reverse))}.sm\:divide-x>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(1px * var(--divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--divide-x-reverse)))}.sm\:divide-y-reverse>:not(template)~:not(template){--divide-y-reverse:1}.sm\:divide-x-reverse>:not(template)~:not(template){--divide-x-reverse:1}.sm\:divide-transparent>:not(template)~:not(template){border-color:transparent}.sm\:divide-current>:not(template)~:not(template){border-color:currentColor}.sm\:divide-black>:not(template)~:not(template){--divide-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--divide-opacity))}.sm\:divide-white>:not(template)~:not(template){--divide-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--divide-opacity))}.sm\:divide-gray-100>:not(template)~:not(template){--divide-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--divide-opacity))}.sm\:divide-gray-200>:not(template)~:not(template){--divide-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--divide-opacity))}.sm\:divide-gray-300>:not(template)~:not(template){--divide-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--divide-opacity))}.sm\:divide-gray-400>:not(template)~:not(template){--divide-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--divide-opacity))}.sm\:divide-gray-500>:not(template)~:not(template){--divide-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--divide-opacity))}.sm\:divide-gray-600>:not(template)~:not(template){--divide-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--divide-opacity))}.sm\:divide-gray-700>:not(template)~:not(template){--divide-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--divide-opacity))}.sm\:divide-gray-800>:not(template)~:not(template){--divide-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--divide-opacity))}.sm\:divide-gray-900>:not(template)~:not(template){--divide-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--divide-opacity))}.sm\:divide-red-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--divide-opacity))}.sm\:divide-red-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--divide-opacity))}.sm\:divide-red-300>:not(template)~:not(template){--divide-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--divide-opacity))}.sm\:divide-red-400>:not(template)~:not(template){--divide-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--divide-opacity))}.sm\:divide-red-500>:not(template)~:not(template){--divide-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--divide-opacity))}.sm\:divide-red-600>:not(template)~:not(template){--divide-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--divide-opacity))}.sm\:divide-red-700>:not(template)~:not(template){--divide-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--divide-opacity))}.sm\:divide-red-800>:not(template)~:not(template){--divide-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--divide-opacity))}.sm\:divide-red-900>:not(template)~:not(template){--divide-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--divide-opacity))}.sm\:divide-orange-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--divide-opacity))}.sm\:divide-orange-200>:not(template)~:not(template){--divide-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--divide-opacity))}.sm\:divide-orange-300>:not(template)~:not(template){--divide-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--divide-opacity))}.sm\:divide-orange-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--divide-opacity))}.sm\:divide-orange-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--divide-opacity))}.sm\:divide-orange-600>:not(template)~:not(template){--divide-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--divide-opacity))}.sm\:divide-orange-700>:not(template)~:not(template){--divide-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--divide-opacity))}.sm\:divide-orange-800>:not(template)~:not(template){--divide-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--divide-opacity))}.sm\:divide-orange-900>:not(template)~:not(template){--divide-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--divide-opacity))}.sm\:divide-yellow-100>:not(template)~:not(template){--divide-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--divide-opacity))}.sm\:divide-yellow-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--divide-opacity))}.sm\:divide-yellow-300>:not(template)~:not(template){--divide-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--divide-opacity))}.sm\:divide-yellow-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--divide-opacity))}.sm\:divide-yellow-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--divide-opacity))}.sm\:divide-yellow-600>:not(template)~:not(template){--divide-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--divide-opacity))}.sm\:divide-yellow-700>:not(template)~:not(template){--divide-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--divide-opacity))}.sm\:divide-yellow-800>:not(template)~:not(template){--divide-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--divide-opacity))}.sm\:divide-yellow-900>:not(template)~:not(template){--divide-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--divide-opacity))}.sm\:divide-green-100>:not(template)~:not(template){--divide-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--divide-opacity))}.sm\:divide-green-200>:not(template)~:not(template){--divide-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--divide-opacity))}.sm\:divide-green-300>:not(template)~:not(template){--divide-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--divide-opacity))}.sm\:divide-green-400>:not(template)~:not(template){--divide-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--divide-opacity))}.sm\:divide-green-500>:not(template)~:not(template){--divide-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--divide-opacity))}.sm\:divide-green-600>:not(template)~:not(template){--divide-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--divide-opacity))}.sm\:divide-green-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--divide-opacity))}.sm\:divide-green-800>:not(template)~:not(template){--divide-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--divide-opacity))}.sm\:divide-green-900>:not(template)~:not(template){--divide-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--divide-opacity))}.sm\:divide-teal-100>:not(template)~:not(template){--divide-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--divide-opacity))}.sm\:divide-teal-200>:not(template)~:not(template){--divide-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--divide-opacity))}.sm\:divide-teal-300>:not(template)~:not(template){--divide-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--divide-opacity))}.sm\:divide-teal-400>:not(template)~:not(template){--divide-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--divide-opacity))}.sm\:divide-teal-500>:not(template)~:not(template){--divide-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--divide-opacity))}.sm\:divide-teal-600>:not(template)~:not(template){--divide-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--divide-opacity))}.sm\:divide-teal-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--divide-opacity))}.sm\:divide-teal-800>:not(template)~:not(template){--divide-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--divide-opacity))}.sm\:divide-teal-900>:not(template)~:not(template){--divide-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--divide-opacity))}.sm\:divide-blue-100>:not(template)~:not(template){--divide-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--divide-opacity))}.sm\:divide-blue-200>:not(template)~:not(template){--divide-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--divide-opacity))}.sm\:divide-blue-300>:not(template)~:not(template){--divide-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--divide-opacity))}.sm\:divide-blue-400>:not(template)~:not(template){--divide-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--divide-opacity))}.sm\:divide-blue-500>:not(template)~:not(template){--divide-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--divide-opacity))}.sm\:divide-blue-600>:not(template)~:not(template){--divide-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--divide-opacity))}.sm\:divide-blue-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--divide-opacity))}.sm\:divide-blue-800>:not(template)~:not(template){--divide-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--divide-opacity))}.sm\:divide-blue-900>:not(template)~:not(template){--divide-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--divide-opacity))}.sm\:divide-indigo-100>:not(template)~:not(template){--divide-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--divide-opacity))}.sm\:divide-indigo-200>:not(template)~:not(template){--divide-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--divide-opacity))}.sm\:divide-indigo-300>:not(template)~:not(template){--divide-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--divide-opacity))}.sm\:divide-indigo-400>:not(template)~:not(template){--divide-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--divide-opacity))}.sm\:divide-indigo-500>:not(template)~:not(template){--divide-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--divide-opacity))}.sm\:divide-indigo-600>:not(template)~:not(template){--divide-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--divide-opacity))}.sm\:divide-indigo-700>:not(template)~:not(template){--divide-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--divide-opacity))}.sm\:divide-indigo-800>:not(template)~:not(template){--divide-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--divide-opacity))}.sm\:divide-indigo-900>:not(template)~:not(template){--divide-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--divide-opacity))}.sm\:divide-purple-100>:not(template)~:not(template){--divide-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--divide-opacity))}.sm\:divide-purple-200>:not(template)~:not(template){--divide-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--divide-opacity))}.sm\:divide-purple-300>:not(template)~:not(template){--divide-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--divide-opacity))}.sm\:divide-purple-400>:not(template)~:not(template){--divide-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--divide-opacity))}.sm\:divide-purple-500>:not(template)~:not(template){--divide-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--divide-opacity))}.sm\:divide-purple-600>:not(template)~:not(template){--divide-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--divide-opacity))}.sm\:divide-purple-700>:not(template)~:not(template){--divide-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--divide-opacity))}.sm\:divide-purple-800>:not(template)~:not(template){--divide-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--divide-opacity))}.sm\:divide-purple-900>:not(template)~:not(template){--divide-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--divide-opacity))}.sm\:divide-pink-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--divide-opacity))}.sm\:divide-pink-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--divide-opacity))}.sm\:divide-pink-300>:not(template)~:not(template){--divide-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--divide-opacity))}.sm\:divide-pink-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--divide-opacity))}.sm\:divide-pink-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--divide-opacity))}.sm\:divide-pink-600>:not(template)~:not(template){--divide-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--divide-opacity))}.sm\:divide-pink-700>:not(template)~:not(template){--divide-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--divide-opacity))}.sm\:divide-pink-800>:not(template)~:not(template){--divide-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--divide-opacity))}.sm\:divide-pink-900>:not(template)~:not(template){--divide-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--divide-opacity))}.sm\:divide-solid>:not(template)~:not(template){border-style:solid}.sm\:divide-dashed>:not(template)~:not(template){border-style:dashed}.sm\:divide-dotted>:not(template)~:not(template){border-style:dotted}.sm\:divide-double>:not(template)~:not(template){border-style:double}.sm\:divide-none>:not(template)~:not(template){border-style:none}.sm\:divide-opacity-0>:not(template)~:not(template){--divide-opacity:0}.sm\:divide-opacity-25>:not(template)~:not(template){--divide-opacity:0.25}.sm\:divide-opacity-50>:not(template)~:not(template){--divide-opacity:0.5}.sm\:divide-opacity-75>:not(template)~:not(template){--divide-opacity:0.75}.sm\:divide-opacity-100>:not(template)~:not(template){--divide-opacity:1}.sm\:sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sm\:not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.sm\:focus\:sr-only:focus{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sm\:focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.sm\:appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.sm\:bg-fixed{background-attachment:fixed}.sm\:bg-local{background-attachment:local}.sm\:bg-scroll{background-attachment:scroll}.sm\:bg-clip-border{background-clip:border-box}.sm\:bg-clip-padding{background-clip:padding-box}.sm\:bg-clip-content{background-clip:content-box}.sm\:bg-clip-text{-webkit-background-clip:text;background-clip:text}.sm\:bg-transparent{background-color:transparent}.sm\:bg-current{background-color:currentColor}.sm\:bg-black{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.sm\:bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.sm\:bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.sm\:bg-gray-200{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.sm\:bg-gray-300{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.sm\:bg-gray-400{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.sm\:bg-gray-500{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.sm\:bg-gray-600{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.sm\:bg-gray-700{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.sm\:bg-gray-800{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.sm\:bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.sm\:bg-red-100{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.sm\:bg-red-200{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.sm\:bg-red-300{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.sm\:bg-red-400{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.sm\:bg-red-500{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.sm\:bg-red-600{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.sm\:bg-red-700{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.sm\:bg-red-800{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.sm\:bg-red-900{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.sm\:bg-orange-100{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.sm\:bg-orange-200{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.sm\:bg-orange-300{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.sm\:bg-orange-400{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.sm\:bg-orange-500{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.sm\:bg-orange-600{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.sm\:bg-orange-700{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.sm\:bg-orange-800{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.sm\:bg-orange-900{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.sm\:bg-yellow-100{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.sm\:bg-yellow-200{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.sm\:bg-yellow-300{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.sm\:bg-yellow-400{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.sm\:bg-yellow-500{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.sm\:bg-yellow-600{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.sm\:bg-yellow-700{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.sm\:bg-yellow-800{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.sm\:bg-yellow-900{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.sm\:bg-green-100{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.sm\:bg-green-200{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.sm\:bg-green-300{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.sm\:bg-green-400{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.sm\:bg-green-500{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.sm\:bg-green-600{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.sm\:bg-green-700{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.sm\:bg-green-800{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.sm\:bg-green-900{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.sm\:bg-teal-100{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.sm\:bg-teal-200{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.sm\:bg-teal-300{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.sm\:bg-teal-400{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.sm\:bg-teal-500{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.sm\:bg-teal-600{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.sm\:bg-teal-700{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.sm\:bg-teal-800{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.sm\:bg-teal-900{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.sm\:bg-blue-100{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.sm\:bg-blue-200{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.sm\:bg-blue-300{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.sm\:bg-blue-400{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.sm\:bg-blue-500{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.sm\:bg-blue-600{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.sm\:bg-blue-700{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.sm\:bg-blue-800{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.sm\:bg-blue-900{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.sm\:bg-indigo-100{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.sm\:bg-indigo-200{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.sm\:bg-indigo-300{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.sm\:bg-indigo-400{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.sm\:bg-indigo-500{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.sm\:bg-indigo-600{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.sm\:bg-indigo-700{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.sm\:bg-indigo-800{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.sm\:bg-indigo-900{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.sm\:bg-purple-100{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.sm\:bg-purple-200{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.sm\:bg-purple-300{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.sm\:bg-purple-400{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.sm\:bg-purple-500{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.sm\:bg-purple-600{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.sm\:bg-purple-700{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.sm\:bg-purple-800{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.sm\:bg-purple-900{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.sm\:bg-pink-100{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.sm\:bg-pink-200{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.sm\:bg-pink-300{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.sm\:bg-pink-400{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.sm\:bg-pink-500{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.sm\:bg-pink-600{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.sm\:bg-pink-700{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.sm\:bg-pink-800{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.sm\:bg-pink-900{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.sm\:hover\:bg-transparent:hover{background-color:transparent}.sm\:hover\:bg-current:hover{background-color:currentColor}.sm\:hover\:bg-black:hover{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.sm\:hover\:bg-white:hover{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.sm\:hover\:bg-gray-100:hover{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.sm\:hover\:bg-gray-200:hover{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.sm\:hover\:bg-gray-300:hover{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.sm\:hover\:bg-gray-400:hover{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.sm\:hover\:bg-gray-500:hover{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.sm\:hover\:bg-gray-600:hover{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.sm\:hover\:bg-gray-700:hover{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.sm\:hover\:bg-gray-800:hover{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.sm\:hover\:bg-gray-900:hover{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.sm\:hover\:bg-red-100:hover{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.sm\:hover\:bg-red-200:hover{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.sm\:hover\:bg-red-300:hover{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.sm\:hover\:bg-red-400:hover{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.sm\:hover\:bg-red-500:hover{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.sm\:hover\:bg-red-600:hover{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.sm\:hover\:bg-red-700:hover{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.sm\:hover\:bg-red-800:hover{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.sm\:hover\:bg-red-900:hover{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.sm\:hover\:bg-orange-100:hover{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.sm\:hover\:bg-orange-200:hover{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.sm\:hover\:bg-orange-300:hover{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.sm\:hover\:bg-orange-400:hover{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.sm\:hover\:bg-orange-500:hover{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.sm\:hover\:bg-orange-600:hover{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.sm\:hover\:bg-orange-700:hover{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.sm\:hover\:bg-orange-800:hover{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.sm\:hover\:bg-orange-900:hover{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.sm\:hover\:bg-yellow-100:hover{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.sm\:hover\:bg-yellow-200:hover{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.sm\:hover\:bg-yellow-300:hover{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.sm\:hover\:bg-yellow-400:hover{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.sm\:hover\:bg-yellow-500:hover{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.sm\:hover\:bg-yellow-600:hover{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.sm\:hover\:bg-yellow-700:hover{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.sm\:hover\:bg-yellow-800:hover{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.sm\:hover\:bg-yellow-900:hover{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.sm\:hover\:bg-green-100:hover{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.sm\:hover\:bg-green-200:hover{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.sm\:hover\:bg-green-300:hover{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.sm\:hover\:bg-green-400:hover{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.sm\:hover\:bg-green-500:hover{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.sm\:hover\:bg-green-600:hover{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.sm\:hover\:bg-green-700:hover{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.sm\:hover\:bg-green-800:hover{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.sm\:hover\:bg-green-900:hover{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.sm\:hover\:bg-teal-100:hover{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.sm\:hover\:bg-teal-200:hover{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.sm\:hover\:bg-teal-300:hover{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.sm\:hover\:bg-teal-400:hover{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.sm\:hover\:bg-teal-500:hover{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.sm\:hover\:bg-teal-600:hover{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.sm\:hover\:bg-teal-700:hover{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.sm\:hover\:bg-teal-800:hover{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.sm\:hover\:bg-teal-900:hover{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.sm\:hover\:bg-blue-100:hover{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.sm\:hover\:bg-blue-200:hover{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.sm\:hover\:bg-blue-300:hover{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.sm\:hover\:bg-blue-400:hover{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.sm\:hover\:bg-blue-500:hover{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.sm\:hover\:bg-blue-600:hover{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.sm\:hover\:bg-blue-700:hover{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.sm\:hover\:bg-blue-800:hover{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.sm\:hover\:bg-blue-900:hover{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.sm\:hover\:bg-indigo-100:hover{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.sm\:hover\:bg-indigo-200:hover{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.sm\:hover\:bg-indigo-300:hover{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.sm\:hover\:bg-indigo-400:hover{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.sm\:hover\:bg-indigo-500:hover{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.sm\:hover\:bg-indigo-600:hover{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.sm\:hover\:bg-indigo-700:hover{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.sm\:hover\:bg-indigo-800:hover{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.sm\:hover\:bg-indigo-900:hover{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.sm\:hover\:bg-purple-100:hover{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.sm\:hover\:bg-purple-200:hover{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.sm\:hover\:bg-purple-300:hover{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.sm\:hover\:bg-purple-400:hover{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.sm\:hover\:bg-purple-500:hover{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.sm\:hover\:bg-purple-600:hover{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.sm\:hover\:bg-purple-700:hover{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.sm\:hover\:bg-purple-800:hover{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.sm\:hover\:bg-purple-900:hover{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.sm\:hover\:bg-pink-100:hover{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.sm\:hover\:bg-pink-200:hover{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.sm\:hover\:bg-pink-300:hover{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.sm\:hover\:bg-pink-400:hover{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.sm\:hover\:bg-pink-500:hover{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.sm\:hover\:bg-pink-600:hover{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.sm\:hover\:bg-pink-700:hover{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.sm\:hover\:bg-pink-800:hover{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.sm\:hover\:bg-pink-900:hover{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.sm\:focus\:bg-transparent:focus{background-color:transparent}.sm\:focus\:bg-current:focus{background-color:currentColor}.sm\:focus\:bg-black:focus{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.sm\:focus\:bg-white:focus{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.sm\:focus\:bg-gray-100:focus{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.sm\:focus\:bg-gray-200:focus{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.sm\:focus\:bg-gray-300:focus{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.sm\:focus\:bg-gray-400:focus{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.sm\:focus\:bg-gray-500:focus{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.sm\:focus\:bg-gray-600:focus{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.sm\:focus\:bg-gray-700:focus{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.sm\:focus\:bg-gray-800:focus{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.sm\:focus\:bg-gray-900:focus{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.sm\:focus\:bg-red-100:focus{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.sm\:focus\:bg-red-200:focus{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.sm\:focus\:bg-red-300:focus{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.sm\:focus\:bg-red-400:focus{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.sm\:focus\:bg-red-500:focus{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.sm\:focus\:bg-red-600:focus{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.sm\:focus\:bg-red-700:focus{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.sm\:focus\:bg-red-800:focus{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.sm\:focus\:bg-red-900:focus{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.sm\:focus\:bg-orange-100:focus{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.sm\:focus\:bg-orange-200:focus{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.sm\:focus\:bg-orange-300:focus{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.sm\:focus\:bg-orange-400:focus{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.sm\:focus\:bg-orange-500:focus{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.sm\:focus\:bg-orange-600:focus{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.sm\:focus\:bg-orange-700:focus{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.sm\:focus\:bg-orange-800:focus{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.sm\:focus\:bg-orange-900:focus{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.sm\:focus\:bg-yellow-100:focus{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.sm\:focus\:bg-yellow-200:focus{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.sm\:focus\:bg-yellow-300:focus{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.sm\:focus\:bg-yellow-400:focus{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.sm\:focus\:bg-yellow-500:focus{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.sm\:focus\:bg-yellow-600:focus{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.sm\:focus\:bg-yellow-700:focus{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.sm\:focus\:bg-yellow-800:focus{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.sm\:focus\:bg-yellow-900:focus{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.sm\:focus\:bg-green-100:focus{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.sm\:focus\:bg-green-200:focus{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.sm\:focus\:bg-green-300:focus{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.sm\:focus\:bg-green-400:focus{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.sm\:focus\:bg-green-500:focus{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.sm\:focus\:bg-green-600:focus{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.sm\:focus\:bg-green-700:focus{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.sm\:focus\:bg-green-800:focus{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.sm\:focus\:bg-green-900:focus{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.sm\:focus\:bg-teal-100:focus{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.sm\:focus\:bg-teal-200:focus{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.sm\:focus\:bg-teal-300:focus{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.sm\:focus\:bg-teal-400:focus{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.sm\:focus\:bg-teal-500:focus{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.sm\:focus\:bg-teal-600:focus{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.sm\:focus\:bg-teal-700:focus{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.sm\:focus\:bg-teal-800:focus{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.sm\:focus\:bg-teal-900:focus{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.sm\:focus\:bg-blue-100:focus{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.sm\:focus\:bg-blue-200:focus{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.sm\:focus\:bg-blue-300:focus{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.sm\:focus\:bg-blue-400:focus{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.sm\:focus\:bg-blue-500:focus{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.sm\:focus\:bg-blue-600:focus{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.sm\:focus\:bg-blue-700:focus{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.sm\:focus\:bg-blue-800:focus{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.sm\:focus\:bg-blue-900:focus{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.sm\:focus\:bg-indigo-100:focus{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.sm\:focus\:bg-indigo-200:focus{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.sm\:focus\:bg-indigo-300:focus{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.sm\:focus\:bg-indigo-400:focus{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.sm\:focus\:bg-indigo-500:focus{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.sm\:focus\:bg-indigo-600:focus{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.sm\:focus\:bg-indigo-700:focus{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.sm\:focus\:bg-indigo-800:focus{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.sm\:focus\:bg-indigo-900:focus{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.sm\:focus\:bg-purple-100:focus{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.sm\:focus\:bg-purple-200:focus{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.sm\:focus\:bg-purple-300:focus{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.sm\:focus\:bg-purple-400:focus{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.sm\:focus\:bg-purple-500:focus{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.sm\:focus\:bg-purple-600:focus{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.sm\:focus\:bg-purple-700:focus{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.sm\:focus\:bg-purple-800:focus{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.sm\:focus\:bg-purple-900:focus{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.sm\:focus\:bg-pink-100:focus{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.sm\:focus\:bg-pink-200:focus{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.sm\:focus\:bg-pink-300:focus{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.sm\:focus\:bg-pink-400:focus{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.sm\:focus\:bg-pink-500:focus{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.sm\:focus\:bg-pink-600:focus{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.sm\:focus\:bg-pink-700:focus{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.sm\:focus\:bg-pink-800:focus{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.sm\:focus\:bg-pink-900:focus{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.sm\:bg-none{background-image:none}.sm\:bg-gradient-to-t{background-image:linear-gradient(to top,var(--gradient-color-stops))}.sm\:bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--gradient-color-stops))}.sm\:bg-gradient-to-r{background-image:linear-gradient(to right,var(--gradient-color-stops))}.sm\:bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--gradient-color-stops))}.sm\:bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--gradient-color-stops))}.sm\:bg-gradient-to-bl{background-image:linear-gradient(to bottom left,var(--gradient-color-stops))}.sm\:bg-gradient-to-l{background-image:linear-gradient(to left,var(--gradient-color-stops))}.sm\:bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--gradient-color-stops))}.sm\:from-transparent{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:from-current{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:from-black{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:from-white{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:from-gray-100{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.sm\:from-gray-200{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.sm\:from-gray-300{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.sm\:from-gray-400{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.sm\:from-gray-500{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.sm\:from-gray-600{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.sm\:from-gray-700{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.sm\:from-gray-800{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.sm\:from-gray-900{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.sm\:from-red-100{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.sm\:from-red-200{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.sm\:from-red-300{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.sm\:from-red-400{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.sm\:from-red-500{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.sm\:from-red-600{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.sm\:from-red-700{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.sm\:from-red-800{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.sm\:from-red-900{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.sm\:from-orange-100{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.sm\:from-orange-200{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.sm\:from-orange-300{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.sm\:from-orange-400{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.sm\:from-orange-500{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.sm\:from-orange-600{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.sm\:from-orange-700{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.sm\:from-orange-800{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.sm\:from-orange-900{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.sm\:from-yellow-100{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.sm\:from-yellow-200{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.sm\:from-yellow-300{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.sm\:from-yellow-400{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.sm\:from-yellow-500{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.sm\:from-yellow-600{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.sm\:from-yellow-700{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.sm\:from-yellow-800{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.sm\:from-yellow-900{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.sm\:from-green-100{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.sm\:from-green-200{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.sm\:from-green-300{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.sm\:from-green-400{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.sm\:from-green-500{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.sm\:from-green-600{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.sm\:from-green-700{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.sm\:from-green-800{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.sm\:from-green-900{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.sm\:from-teal-100{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.sm\:from-teal-200{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.sm\:from-teal-300{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.sm\:from-teal-400{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.sm\:from-teal-500{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.sm\:from-teal-600{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.sm\:from-teal-700{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.sm\:from-teal-800{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.sm\:from-teal-900{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.sm\:from-blue-100{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.sm\:from-blue-200{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.sm\:from-blue-300{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.sm\:from-blue-400{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.sm\:from-blue-500{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.sm\:from-blue-600{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.sm\:from-blue-700{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.sm\:from-blue-800{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.sm\:from-blue-900{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.sm\:from-indigo-100{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.sm\:from-indigo-200{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.sm\:from-indigo-300{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.sm\:from-indigo-400{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.sm\:from-indigo-500{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.sm\:from-indigo-600{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.sm\:from-indigo-700{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.sm\:from-indigo-800{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.sm\:from-indigo-900{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.sm\:from-purple-100{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.sm\:from-purple-200{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.sm\:from-purple-300{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.sm\:from-purple-400{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.sm\:from-purple-500{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.sm\:from-purple-600{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.sm\:from-purple-700{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.sm\:from-purple-800{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.sm\:from-purple-900{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.sm\:from-pink-100{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.sm\:from-pink-200{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.sm\:from-pink-300{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.sm\:from-pink-400{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.sm\:from-pink-500{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.sm\:from-pink-600{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.sm\:from-pink-700{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.sm\:from-pink-800{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.sm\:from-pink-900{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.sm\:via-transparent{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:via-current{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:via-black{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:via-white{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:via-gray-100{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.sm\:via-gray-200{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.sm\:via-gray-300{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.sm\:via-gray-400{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.sm\:via-gray-500{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.sm\:via-gray-600{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.sm\:via-gray-700{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.sm\:via-gray-800{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.sm\:via-gray-900{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.sm\:via-red-100{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.sm\:via-red-200{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.sm\:via-red-300{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.sm\:via-red-400{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.sm\:via-red-500{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.sm\:via-red-600{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.sm\:via-red-700{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.sm\:via-red-800{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.sm\:via-red-900{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.sm\:via-orange-100{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.sm\:via-orange-200{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.sm\:via-orange-300{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.sm\:via-orange-400{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.sm\:via-orange-500{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.sm\:via-orange-600{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.sm\:via-orange-700{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.sm\:via-orange-800{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.sm\:via-orange-900{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.sm\:via-yellow-100{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.sm\:via-yellow-200{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.sm\:via-yellow-300{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.sm\:via-yellow-400{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.sm\:via-yellow-500{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.sm\:via-yellow-600{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.sm\:via-yellow-700{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.sm\:via-yellow-800{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.sm\:via-yellow-900{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.sm\:via-green-100{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.sm\:via-green-200{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.sm\:via-green-300{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.sm\:via-green-400{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.sm\:via-green-500{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.sm\:via-green-600{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.sm\:via-green-700{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.sm\:via-green-800{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.sm\:via-green-900{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.sm\:via-teal-100{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.sm\:via-teal-200{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.sm\:via-teal-300{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.sm\:via-teal-400{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.sm\:via-teal-500{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.sm\:via-teal-600{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.sm\:via-teal-700{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.sm\:via-teal-800{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.sm\:via-teal-900{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.sm\:via-blue-100{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.sm\:via-blue-200{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.sm\:via-blue-300{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.sm\:via-blue-400{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.sm\:via-blue-500{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.sm\:via-blue-600{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.sm\:via-blue-700{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.sm\:via-blue-800{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.sm\:via-blue-900{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.sm\:via-indigo-100{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.sm\:via-indigo-200{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.sm\:via-indigo-300{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.sm\:via-indigo-400{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.sm\:via-indigo-500{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.sm\:via-indigo-600{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.sm\:via-indigo-700{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.sm\:via-indigo-800{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.sm\:via-indigo-900{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.sm\:via-purple-100{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.sm\:via-purple-200{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.sm\:via-purple-300{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.sm\:via-purple-400{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.sm\:via-purple-500{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.sm\:via-purple-600{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.sm\:via-purple-700{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.sm\:via-purple-800{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.sm\:via-purple-900{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.sm\:via-pink-100{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.sm\:via-pink-200{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.sm\:via-pink-300{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.sm\:via-pink-400{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.sm\:via-pink-500{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.sm\:via-pink-600{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.sm\:via-pink-700{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.sm\:via-pink-800{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.sm\:via-pink-900{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.sm\:to-transparent{--gradient-to-color:transparent}.sm\:to-current{--gradient-to-color:currentColor}.sm\:to-black{--gradient-to-color:#000}.sm\:to-white{--gradient-to-color:#fff}.sm\:to-gray-100{--gradient-to-color:#f7fafc}.sm\:to-gray-200{--gradient-to-color:#edf2f7}.sm\:to-gray-300{--gradient-to-color:#e2e8f0}.sm\:to-gray-400{--gradient-to-color:#cbd5e0}.sm\:to-gray-500{--gradient-to-color:#a0aec0}.sm\:to-gray-600{--gradient-to-color:#718096}.sm\:to-gray-700{--gradient-to-color:#4a5568}.sm\:to-gray-800{--gradient-to-color:#2d3748}.sm\:to-gray-900{--gradient-to-color:#1a202c}.sm\:to-red-100{--gradient-to-color:#fff5f5}.sm\:to-red-200{--gradient-to-color:#fed7d7}.sm\:to-red-300{--gradient-to-color:#feb2b2}.sm\:to-red-400{--gradient-to-color:#fc8181}.sm\:to-red-500{--gradient-to-color:#f56565}.sm\:to-red-600{--gradient-to-color:#e53e3e}.sm\:to-red-700{--gradient-to-color:#c53030}.sm\:to-red-800{--gradient-to-color:#9b2c2c}.sm\:to-red-900{--gradient-to-color:#742a2a}.sm\:to-orange-100{--gradient-to-color:#fffaf0}.sm\:to-orange-200{--gradient-to-color:#feebc8}.sm\:to-orange-300{--gradient-to-color:#fbd38d}.sm\:to-orange-400{--gradient-to-color:#f6ad55}.sm\:to-orange-500{--gradient-to-color:#ed8936}.sm\:to-orange-600{--gradient-to-color:#dd6b20}.sm\:to-orange-700{--gradient-to-color:#c05621}.sm\:to-orange-800{--gradient-to-color:#9c4221}.sm\:to-orange-900{--gradient-to-color:#7b341e}.sm\:to-yellow-100{--gradient-to-color:#fffff0}.sm\:to-yellow-200{--gradient-to-color:#fefcbf}.sm\:to-yellow-300{--gradient-to-color:#faf089}.sm\:to-yellow-400{--gradient-to-color:#f6e05e}.sm\:to-yellow-500{--gradient-to-color:#ecc94b}.sm\:to-yellow-600{--gradient-to-color:#d69e2e}.sm\:to-yellow-700{--gradient-to-color:#b7791f}.sm\:to-yellow-800{--gradient-to-color:#975a16}.sm\:to-yellow-900{--gradient-to-color:#744210}.sm\:to-green-100{--gradient-to-color:#f0fff4}.sm\:to-green-200{--gradient-to-color:#c6f6d5}.sm\:to-green-300{--gradient-to-color:#9ae6b4}.sm\:to-green-400{--gradient-to-color:#68d391}.sm\:to-green-500{--gradient-to-color:#48bb78}.sm\:to-green-600{--gradient-to-color:#38a169}.sm\:to-green-700{--gradient-to-color:#2f855a}.sm\:to-green-800{--gradient-to-color:#276749}.sm\:to-green-900{--gradient-to-color:#22543d}.sm\:to-teal-100{--gradient-to-color:#e6fffa}.sm\:to-teal-200{--gradient-to-color:#b2f5ea}.sm\:to-teal-300{--gradient-to-color:#81e6d9}.sm\:to-teal-400{--gradient-to-color:#4fd1c5}.sm\:to-teal-500{--gradient-to-color:#38b2ac}.sm\:to-teal-600{--gradient-to-color:#319795}.sm\:to-teal-700{--gradient-to-color:#2c7a7b}.sm\:to-teal-800{--gradient-to-color:#285e61}.sm\:to-teal-900{--gradient-to-color:#234e52}.sm\:to-blue-100{--gradient-to-color:#ebf8ff}.sm\:to-blue-200{--gradient-to-color:#bee3f8}.sm\:to-blue-300{--gradient-to-color:#90cdf4}.sm\:to-blue-400{--gradient-to-color:#63b3ed}.sm\:to-blue-500{--gradient-to-color:#4299e1}.sm\:to-blue-600{--gradient-to-color:#3182ce}.sm\:to-blue-700{--gradient-to-color:#2b6cb0}.sm\:to-blue-800{--gradient-to-color:#2c5282}.sm\:to-blue-900{--gradient-to-color:#2a4365}.sm\:to-indigo-100{--gradient-to-color:#ebf4ff}.sm\:to-indigo-200{--gradient-to-color:#c3dafe}.sm\:to-indigo-300{--gradient-to-color:#a3bffa}.sm\:to-indigo-400{--gradient-to-color:#7f9cf5}.sm\:to-indigo-500{--gradient-to-color:#667eea}.sm\:to-indigo-600{--gradient-to-color:#5a67d8}.sm\:to-indigo-700{--gradient-to-color:#4c51bf}.sm\:to-indigo-800{--gradient-to-color:#434190}.sm\:to-indigo-900{--gradient-to-color:#3c366b}.sm\:to-purple-100{--gradient-to-color:#faf5ff}.sm\:to-purple-200{--gradient-to-color:#e9d8fd}.sm\:to-purple-300{--gradient-to-color:#d6bcfa}.sm\:to-purple-400{--gradient-to-color:#b794f4}.sm\:to-purple-500{--gradient-to-color:#9f7aea}.sm\:to-purple-600{--gradient-to-color:#805ad5}.sm\:to-purple-700{--gradient-to-color:#6b46c1}.sm\:to-purple-800{--gradient-to-color:#553c9a}.sm\:to-purple-900{--gradient-to-color:#44337a}.sm\:to-pink-100{--gradient-to-color:#fff5f7}.sm\:to-pink-200{--gradient-to-color:#fed7e2}.sm\:to-pink-300{--gradient-to-color:#fbb6ce}.sm\:to-pink-400{--gradient-to-color:#f687b3}.sm\:to-pink-500{--gradient-to-color:#ed64a6}.sm\:to-pink-600{--gradient-to-color:#d53f8c}.sm\:to-pink-700{--gradient-to-color:#b83280}.sm\:to-pink-800{--gradient-to-color:#97266d}.sm\:to-pink-900{--gradient-to-color:#702459}.sm\:hover\:from-transparent:hover{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:hover\:from-current:hover{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:hover\:from-black:hover{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:hover\:from-white:hover{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:hover\:from-gray-100:hover{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.sm\:hover\:from-gray-200:hover{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.sm\:hover\:from-gray-300:hover{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.sm\:hover\:from-gray-400:hover{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.sm\:hover\:from-gray-500:hover{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.sm\:hover\:from-gray-600:hover{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.sm\:hover\:from-gray-700:hover{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.sm\:hover\:from-gray-800:hover{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.sm\:hover\:from-gray-900:hover{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.sm\:hover\:from-red-100:hover{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.sm\:hover\:from-red-200:hover{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.sm\:hover\:from-red-300:hover{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.sm\:hover\:from-red-400:hover{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.sm\:hover\:from-red-500:hover{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.sm\:hover\:from-red-600:hover{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.sm\:hover\:from-red-700:hover{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.sm\:hover\:from-red-800:hover{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.sm\:hover\:from-red-900:hover{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.sm\:hover\:from-orange-100:hover{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.sm\:hover\:from-orange-200:hover{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.sm\:hover\:from-orange-300:hover{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.sm\:hover\:from-orange-400:hover{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.sm\:hover\:from-orange-500:hover{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.sm\:hover\:from-orange-600:hover{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.sm\:hover\:from-orange-700:hover{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.sm\:hover\:from-orange-800:hover{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.sm\:hover\:from-orange-900:hover{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.sm\:hover\:from-yellow-100:hover{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.sm\:hover\:from-yellow-200:hover{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.sm\:hover\:from-yellow-300:hover{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.sm\:hover\:from-yellow-400:hover{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.sm\:hover\:from-yellow-500:hover{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.sm\:hover\:from-yellow-600:hover{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.sm\:hover\:from-yellow-700:hover{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.sm\:hover\:from-yellow-800:hover{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.sm\:hover\:from-yellow-900:hover{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.sm\:hover\:from-green-100:hover{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.sm\:hover\:from-green-200:hover{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.sm\:hover\:from-green-300:hover{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.sm\:hover\:from-green-400:hover{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.sm\:hover\:from-green-500:hover{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.sm\:hover\:from-green-600:hover{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.sm\:hover\:from-green-700:hover{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.sm\:hover\:from-green-800:hover{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.sm\:hover\:from-green-900:hover{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.sm\:hover\:from-teal-100:hover{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.sm\:hover\:from-teal-200:hover{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.sm\:hover\:from-teal-300:hover{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.sm\:hover\:from-teal-400:hover{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.sm\:hover\:from-teal-500:hover{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.sm\:hover\:from-teal-600:hover{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.sm\:hover\:from-teal-700:hover{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.sm\:hover\:from-teal-800:hover{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.sm\:hover\:from-teal-900:hover{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.sm\:hover\:from-blue-100:hover{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.sm\:hover\:from-blue-200:hover{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.sm\:hover\:from-blue-300:hover{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.sm\:hover\:from-blue-400:hover{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.sm\:hover\:from-blue-500:hover{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.sm\:hover\:from-blue-600:hover{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.sm\:hover\:from-blue-700:hover{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.sm\:hover\:from-blue-800:hover{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.sm\:hover\:from-blue-900:hover{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.sm\:hover\:from-indigo-100:hover{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.sm\:hover\:from-indigo-200:hover{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.sm\:hover\:from-indigo-300:hover{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.sm\:hover\:from-indigo-400:hover{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.sm\:hover\:from-indigo-500:hover{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.sm\:hover\:from-indigo-600:hover{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.sm\:hover\:from-indigo-700:hover{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.sm\:hover\:from-indigo-800:hover{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.sm\:hover\:from-indigo-900:hover{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.sm\:hover\:from-purple-100:hover{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.sm\:hover\:from-purple-200:hover{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.sm\:hover\:from-purple-300:hover{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.sm\:hover\:from-purple-400:hover{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.sm\:hover\:from-purple-500:hover{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.sm\:hover\:from-purple-600:hover{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.sm\:hover\:from-purple-700:hover{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.sm\:hover\:from-purple-800:hover{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.sm\:hover\:from-purple-900:hover{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.sm\:hover\:from-pink-100:hover{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.sm\:hover\:from-pink-200:hover{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.sm\:hover\:from-pink-300:hover{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.sm\:hover\:from-pink-400:hover{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.sm\:hover\:from-pink-500:hover{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.sm\:hover\:from-pink-600:hover{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.sm\:hover\:from-pink-700:hover{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.sm\:hover\:from-pink-800:hover{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.sm\:hover\:from-pink-900:hover{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.sm\:hover\:via-transparent:hover{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:hover\:via-current:hover{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:hover\:via-black:hover{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:hover\:via-white:hover{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:hover\:via-gray-100:hover{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.sm\:hover\:via-gray-200:hover{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.sm\:hover\:via-gray-300:hover{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.sm\:hover\:via-gray-400:hover{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.sm\:hover\:via-gray-500:hover{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.sm\:hover\:via-gray-600:hover{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.sm\:hover\:via-gray-700:hover{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.sm\:hover\:via-gray-800:hover{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.sm\:hover\:via-gray-900:hover{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.sm\:hover\:via-red-100:hover{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.sm\:hover\:via-red-200:hover{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.sm\:hover\:via-red-300:hover{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.sm\:hover\:via-red-400:hover{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.sm\:hover\:via-red-500:hover{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.sm\:hover\:via-red-600:hover{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.sm\:hover\:via-red-700:hover{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.sm\:hover\:via-red-800:hover{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.sm\:hover\:via-red-900:hover{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.sm\:hover\:via-orange-100:hover{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.sm\:hover\:via-orange-200:hover{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.sm\:hover\:via-orange-300:hover{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.sm\:hover\:via-orange-400:hover{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.sm\:hover\:via-orange-500:hover{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.sm\:hover\:via-orange-600:hover{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.sm\:hover\:via-orange-700:hover{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.sm\:hover\:via-orange-800:hover{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.sm\:hover\:via-orange-900:hover{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.sm\:hover\:via-yellow-100:hover{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.sm\:hover\:via-yellow-200:hover{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.sm\:hover\:via-yellow-300:hover{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.sm\:hover\:via-yellow-400:hover{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.sm\:hover\:via-yellow-500:hover{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.sm\:hover\:via-yellow-600:hover{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.sm\:hover\:via-yellow-700:hover{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.sm\:hover\:via-yellow-800:hover{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.sm\:hover\:via-yellow-900:hover{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.sm\:hover\:via-green-100:hover{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.sm\:hover\:via-green-200:hover{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.sm\:hover\:via-green-300:hover{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.sm\:hover\:via-green-400:hover{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.sm\:hover\:via-green-500:hover{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.sm\:hover\:via-green-600:hover{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.sm\:hover\:via-green-700:hover{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.sm\:hover\:via-green-800:hover{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.sm\:hover\:via-green-900:hover{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.sm\:hover\:via-teal-100:hover{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.sm\:hover\:via-teal-200:hover{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.sm\:hover\:via-teal-300:hover{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.sm\:hover\:via-teal-400:hover{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.sm\:hover\:via-teal-500:hover{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.sm\:hover\:via-teal-600:hover{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.sm\:hover\:via-teal-700:hover{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.sm\:hover\:via-teal-800:hover{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.sm\:hover\:via-teal-900:hover{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.sm\:hover\:via-blue-100:hover{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.sm\:hover\:via-blue-200:hover{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.sm\:hover\:via-blue-300:hover{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.sm\:hover\:via-blue-400:hover{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.sm\:hover\:via-blue-500:hover{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.sm\:hover\:via-blue-600:hover{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.sm\:hover\:via-blue-700:hover{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.sm\:hover\:via-blue-800:hover{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.sm\:hover\:via-blue-900:hover{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.sm\:hover\:via-indigo-100:hover{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.sm\:hover\:via-indigo-200:hover{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.sm\:hover\:via-indigo-300:hover{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.sm\:hover\:via-indigo-400:hover{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.sm\:hover\:via-indigo-500:hover{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.sm\:hover\:via-indigo-600:hover{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.sm\:hover\:via-indigo-700:hover{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.sm\:hover\:via-indigo-800:hover{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.sm\:hover\:via-indigo-900:hover{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.sm\:hover\:via-purple-100:hover{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.sm\:hover\:via-purple-200:hover{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.sm\:hover\:via-purple-300:hover{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.sm\:hover\:via-purple-400:hover{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.sm\:hover\:via-purple-500:hover{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.sm\:hover\:via-purple-600:hover{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.sm\:hover\:via-purple-700:hover{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.sm\:hover\:via-purple-800:hover{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.sm\:hover\:via-purple-900:hover{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.sm\:hover\:via-pink-100:hover{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.sm\:hover\:via-pink-200:hover{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.sm\:hover\:via-pink-300:hover{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.sm\:hover\:via-pink-400:hover{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.sm\:hover\:via-pink-500:hover{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.sm\:hover\:via-pink-600:hover{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.sm\:hover\:via-pink-700:hover{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.sm\:hover\:via-pink-800:hover{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.sm\:hover\:via-pink-900:hover{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.sm\:hover\:to-transparent:hover{--gradient-to-color:transparent}.sm\:hover\:to-current:hover{--gradient-to-color:currentColor}.sm\:hover\:to-black:hover{--gradient-to-color:#000}.sm\:hover\:to-white:hover{--gradient-to-color:#fff}.sm\:hover\:to-gray-100:hover{--gradient-to-color:#f7fafc}.sm\:hover\:to-gray-200:hover{--gradient-to-color:#edf2f7}.sm\:hover\:to-gray-300:hover{--gradient-to-color:#e2e8f0}.sm\:hover\:to-gray-400:hover{--gradient-to-color:#cbd5e0}.sm\:hover\:to-gray-500:hover{--gradient-to-color:#a0aec0}.sm\:hover\:to-gray-600:hover{--gradient-to-color:#718096}.sm\:hover\:to-gray-700:hover{--gradient-to-color:#4a5568}.sm\:hover\:to-gray-800:hover{--gradient-to-color:#2d3748}.sm\:hover\:to-gray-900:hover{--gradient-to-color:#1a202c}.sm\:hover\:to-red-100:hover{--gradient-to-color:#fff5f5}.sm\:hover\:to-red-200:hover{--gradient-to-color:#fed7d7}.sm\:hover\:to-red-300:hover{--gradient-to-color:#feb2b2}.sm\:hover\:to-red-400:hover{--gradient-to-color:#fc8181}.sm\:hover\:to-red-500:hover{--gradient-to-color:#f56565}.sm\:hover\:to-red-600:hover{--gradient-to-color:#e53e3e}.sm\:hover\:to-red-700:hover{--gradient-to-color:#c53030}.sm\:hover\:to-red-800:hover{--gradient-to-color:#9b2c2c}.sm\:hover\:to-red-900:hover{--gradient-to-color:#742a2a}.sm\:hover\:to-orange-100:hover{--gradient-to-color:#fffaf0}.sm\:hover\:to-orange-200:hover{--gradient-to-color:#feebc8}.sm\:hover\:to-orange-300:hover{--gradient-to-color:#fbd38d}.sm\:hover\:to-orange-400:hover{--gradient-to-color:#f6ad55}.sm\:hover\:to-orange-500:hover{--gradient-to-color:#ed8936}.sm\:hover\:to-orange-600:hover{--gradient-to-color:#dd6b20}.sm\:hover\:to-orange-700:hover{--gradient-to-color:#c05621}.sm\:hover\:to-orange-800:hover{--gradient-to-color:#9c4221}.sm\:hover\:to-orange-900:hover{--gradient-to-color:#7b341e}.sm\:hover\:to-yellow-100:hover{--gradient-to-color:#fffff0}.sm\:hover\:to-yellow-200:hover{--gradient-to-color:#fefcbf}.sm\:hover\:to-yellow-300:hover{--gradient-to-color:#faf089}.sm\:hover\:to-yellow-400:hover{--gradient-to-color:#f6e05e}.sm\:hover\:to-yellow-500:hover{--gradient-to-color:#ecc94b}.sm\:hover\:to-yellow-600:hover{--gradient-to-color:#d69e2e}.sm\:hover\:to-yellow-700:hover{--gradient-to-color:#b7791f}.sm\:hover\:to-yellow-800:hover{--gradient-to-color:#975a16}.sm\:hover\:to-yellow-900:hover{--gradient-to-color:#744210}.sm\:hover\:to-green-100:hover{--gradient-to-color:#f0fff4}.sm\:hover\:to-green-200:hover{--gradient-to-color:#c6f6d5}.sm\:hover\:to-green-300:hover{--gradient-to-color:#9ae6b4}.sm\:hover\:to-green-400:hover{--gradient-to-color:#68d391}.sm\:hover\:to-green-500:hover{--gradient-to-color:#48bb78}.sm\:hover\:to-green-600:hover{--gradient-to-color:#38a169}.sm\:hover\:to-green-700:hover{--gradient-to-color:#2f855a}.sm\:hover\:to-green-800:hover{--gradient-to-color:#276749}.sm\:hover\:to-green-900:hover{--gradient-to-color:#22543d}.sm\:hover\:to-teal-100:hover{--gradient-to-color:#e6fffa}.sm\:hover\:to-teal-200:hover{--gradient-to-color:#b2f5ea}.sm\:hover\:to-teal-300:hover{--gradient-to-color:#81e6d9}.sm\:hover\:to-teal-400:hover{--gradient-to-color:#4fd1c5}.sm\:hover\:to-teal-500:hover{--gradient-to-color:#38b2ac}.sm\:hover\:to-teal-600:hover{--gradient-to-color:#319795}.sm\:hover\:to-teal-700:hover{--gradient-to-color:#2c7a7b}.sm\:hover\:to-teal-800:hover{--gradient-to-color:#285e61}.sm\:hover\:to-teal-900:hover{--gradient-to-color:#234e52}.sm\:hover\:to-blue-100:hover{--gradient-to-color:#ebf8ff}.sm\:hover\:to-blue-200:hover{--gradient-to-color:#bee3f8}.sm\:hover\:to-blue-300:hover{--gradient-to-color:#90cdf4}.sm\:hover\:to-blue-400:hover{--gradient-to-color:#63b3ed}.sm\:hover\:to-blue-500:hover{--gradient-to-color:#4299e1}.sm\:hover\:to-blue-600:hover{--gradient-to-color:#3182ce}.sm\:hover\:to-blue-700:hover{--gradient-to-color:#2b6cb0}.sm\:hover\:to-blue-800:hover{--gradient-to-color:#2c5282}.sm\:hover\:to-blue-900:hover{--gradient-to-color:#2a4365}.sm\:hover\:to-indigo-100:hover{--gradient-to-color:#ebf4ff}.sm\:hover\:to-indigo-200:hover{--gradient-to-color:#c3dafe}.sm\:hover\:to-indigo-300:hover{--gradient-to-color:#a3bffa}.sm\:hover\:to-indigo-400:hover{--gradient-to-color:#7f9cf5}.sm\:hover\:to-indigo-500:hover{--gradient-to-color:#667eea}.sm\:hover\:to-indigo-600:hover{--gradient-to-color:#5a67d8}.sm\:hover\:to-indigo-700:hover{--gradient-to-color:#4c51bf}.sm\:hover\:to-indigo-800:hover{--gradient-to-color:#434190}.sm\:hover\:to-indigo-900:hover{--gradient-to-color:#3c366b}.sm\:hover\:to-purple-100:hover{--gradient-to-color:#faf5ff}.sm\:hover\:to-purple-200:hover{--gradient-to-color:#e9d8fd}.sm\:hover\:to-purple-300:hover{--gradient-to-color:#d6bcfa}.sm\:hover\:to-purple-400:hover{--gradient-to-color:#b794f4}.sm\:hover\:to-purple-500:hover{--gradient-to-color:#9f7aea}.sm\:hover\:to-purple-600:hover{--gradient-to-color:#805ad5}.sm\:hover\:to-purple-700:hover{--gradient-to-color:#6b46c1}.sm\:hover\:to-purple-800:hover{--gradient-to-color:#553c9a}.sm\:hover\:to-purple-900:hover{--gradient-to-color:#44337a}.sm\:hover\:to-pink-100:hover{--gradient-to-color:#fff5f7}.sm\:hover\:to-pink-200:hover{--gradient-to-color:#fed7e2}.sm\:hover\:to-pink-300:hover{--gradient-to-color:#fbb6ce}.sm\:hover\:to-pink-400:hover{--gradient-to-color:#f687b3}.sm\:hover\:to-pink-500:hover{--gradient-to-color:#ed64a6}.sm\:hover\:to-pink-600:hover{--gradient-to-color:#d53f8c}.sm\:hover\:to-pink-700:hover{--gradient-to-color:#b83280}.sm\:hover\:to-pink-800:hover{--gradient-to-color:#97266d}.sm\:hover\:to-pink-900:hover{--gradient-to-color:#702459}.sm\:focus\:from-transparent:focus{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:focus\:from-current:focus{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:focus\:from-black:focus{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:focus\:from-white:focus{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:focus\:from-gray-100:focus{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.sm\:focus\:from-gray-200:focus{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.sm\:focus\:from-gray-300:focus{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.sm\:focus\:from-gray-400:focus{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.sm\:focus\:from-gray-500:focus{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.sm\:focus\:from-gray-600:focus{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.sm\:focus\:from-gray-700:focus{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.sm\:focus\:from-gray-800:focus{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.sm\:focus\:from-gray-900:focus{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.sm\:focus\:from-red-100:focus{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.sm\:focus\:from-red-200:focus{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.sm\:focus\:from-red-300:focus{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.sm\:focus\:from-red-400:focus{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.sm\:focus\:from-red-500:focus{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.sm\:focus\:from-red-600:focus{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.sm\:focus\:from-red-700:focus{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.sm\:focus\:from-red-800:focus{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.sm\:focus\:from-red-900:focus{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.sm\:focus\:from-orange-100:focus{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.sm\:focus\:from-orange-200:focus{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.sm\:focus\:from-orange-300:focus{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.sm\:focus\:from-orange-400:focus{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.sm\:focus\:from-orange-500:focus{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.sm\:focus\:from-orange-600:focus{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.sm\:focus\:from-orange-700:focus{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.sm\:focus\:from-orange-800:focus{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.sm\:focus\:from-orange-900:focus{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.sm\:focus\:from-yellow-100:focus{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.sm\:focus\:from-yellow-200:focus{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.sm\:focus\:from-yellow-300:focus{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.sm\:focus\:from-yellow-400:focus{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.sm\:focus\:from-yellow-500:focus{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.sm\:focus\:from-yellow-600:focus{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.sm\:focus\:from-yellow-700:focus{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.sm\:focus\:from-yellow-800:focus{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.sm\:focus\:from-yellow-900:focus{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.sm\:focus\:from-green-100:focus{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.sm\:focus\:from-green-200:focus{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.sm\:focus\:from-green-300:focus{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.sm\:focus\:from-green-400:focus{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.sm\:focus\:from-green-500:focus{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.sm\:focus\:from-green-600:focus{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.sm\:focus\:from-green-700:focus{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.sm\:focus\:from-green-800:focus{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.sm\:focus\:from-green-900:focus{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.sm\:focus\:from-teal-100:focus{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.sm\:focus\:from-teal-200:focus{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.sm\:focus\:from-teal-300:focus{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.sm\:focus\:from-teal-400:focus{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.sm\:focus\:from-teal-500:focus{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.sm\:focus\:from-teal-600:focus{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.sm\:focus\:from-teal-700:focus{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.sm\:focus\:from-teal-800:focus{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.sm\:focus\:from-teal-900:focus{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.sm\:focus\:from-blue-100:focus{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.sm\:focus\:from-blue-200:focus{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.sm\:focus\:from-blue-300:focus{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.sm\:focus\:from-blue-400:focus{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.sm\:focus\:from-blue-500:focus{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.sm\:focus\:from-blue-600:focus{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.sm\:focus\:from-blue-700:focus{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.sm\:focus\:from-blue-800:focus{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.sm\:focus\:from-blue-900:focus{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.sm\:focus\:from-indigo-100:focus{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.sm\:focus\:from-indigo-200:focus{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.sm\:focus\:from-indigo-300:focus{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.sm\:focus\:from-indigo-400:focus{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.sm\:focus\:from-indigo-500:focus{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.sm\:focus\:from-indigo-600:focus{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.sm\:focus\:from-indigo-700:focus{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.sm\:focus\:from-indigo-800:focus{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.sm\:focus\:from-indigo-900:focus{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.sm\:focus\:from-purple-100:focus{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.sm\:focus\:from-purple-200:focus{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.sm\:focus\:from-purple-300:focus{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.sm\:focus\:from-purple-400:focus{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.sm\:focus\:from-purple-500:focus{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.sm\:focus\:from-purple-600:focus{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.sm\:focus\:from-purple-700:focus{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.sm\:focus\:from-purple-800:focus{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.sm\:focus\:from-purple-900:focus{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.sm\:focus\:from-pink-100:focus{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.sm\:focus\:from-pink-200:focus{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.sm\:focus\:from-pink-300:focus{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.sm\:focus\:from-pink-400:focus{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.sm\:focus\:from-pink-500:focus{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.sm\:focus\:from-pink-600:focus{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.sm\:focus\:from-pink-700:focus{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.sm\:focus\:from-pink-800:focus{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.sm\:focus\:from-pink-900:focus{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.sm\:focus\:via-transparent:focus{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:focus\:via-current:focus{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:focus\:via-black:focus{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:focus\:via-white:focus{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:focus\:via-gray-100:focus{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.sm\:focus\:via-gray-200:focus{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.sm\:focus\:via-gray-300:focus{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.sm\:focus\:via-gray-400:focus{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.sm\:focus\:via-gray-500:focus{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.sm\:focus\:via-gray-600:focus{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.sm\:focus\:via-gray-700:focus{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.sm\:focus\:via-gray-800:focus{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.sm\:focus\:via-gray-900:focus{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.sm\:focus\:via-red-100:focus{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.sm\:focus\:via-red-200:focus{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.sm\:focus\:via-red-300:focus{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.sm\:focus\:via-red-400:focus{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.sm\:focus\:via-red-500:focus{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.sm\:focus\:via-red-600:focus{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.sm\:focus\:via-red-700:focus{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.sm\:focus\:via-red-800:focus{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.sm\:focus\:via-red-900:focus{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.sm\:focus\:via-orange-100:focus{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.sm\:focus\:via-orange-200:focus{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.sm\:focus\:via-orange-300:focus{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.sm\:focus\:via-orange-400:focus{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.sm\:focus\:via-orange-500:focus{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.sm\:focus\:via-orange-600:focus{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.sm\:focus\:via-orange-700:focus{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.sm\:focus\:via-orange-800:focus{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.sm\:focus\:via-orange-900:focus{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.sm\:focus\:via-yellow-100:focus{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.sm\:focus\:via-yellow-200:focus{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.sm\:focus\:via-yellow-300:focus{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.sm\:focus\:via-yellow-400:focus{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.sm\:focus\:via-yellow-500:focus{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.sm\:focus\:via-yellow-600:focus{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.sm\:focus\:via-yellow-700:focus{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.sm\:focus\:via-yellow-800:focus{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.sm\:focus\:via-yellow-900:focus{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.sm\:focus\:via-green-100:focus{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.sm\:focus\:via-green-200:focus{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.sm\:focus\:via-green-300:focus{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.sm\:focus\:via-green-400:focus{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.sm\:focus\:via-green-500:focus{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.sm\:focus\:via-green-600:focus{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.sm\:focus\:via-green-700:focus{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.sm\:focus\:via-green-800:focus{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.sm\:focus\:via-green-900:focus{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.sm\:focus\:via-teal-100:focus{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.sm\:focus\:via-teal-200:focus{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.sm\:focus\:via-teal-300:focus{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.sm\:focus\:via-teal-400:focus{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.sm\:focus\:via-teal-500:focus{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.sm\:focus\:via-teal-600:focus{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.sm\:focus\:via-teal-700:focus{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.sm\:focus\:via-teal-800:focus{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.sm\:focus\:via-teal-900:focus{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.sm\:focus\:via-blue-100:focus{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.sm\:focus\:via-blue-200:focus{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.sm\:focus\:via-blue-300:focus{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.sm\:focus\:via-blue-400:focus{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.sm\:focus\:via-blue-500:focus{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.sm\:focus\:via-blue-600:focus{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.sm\:focus\:via-blue-700:focus{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.sm\:focus\:via-blue-800:focus{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.sm\:focus\:via-blue-900:focus{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.sm\:focus\:via-indigo-100:focus{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.sm\:focus\:via-indigo-200:focus{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.sm\:focus\:via-indigo-300:focus{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.sm\:focus\:via-indigo-400:focus{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.sm\:focus\:via-indigo-500:focus{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.sm\:focus\:via-indigo-600:focus{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.sm\:focus\:via-indigo-700:focus{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.sm\:focus\:via-indigo-800:focus{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.sm\:focus\:via-indigo-900:focus{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.sm\:focus\:via-purple-100:focus{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.sm\:focus\:via-purple-200:focus{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.sm\:focus\:via-purple-300:focus{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.sm\:focus\:via-purple-400:focus{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.sm\:focus\:via-purple-500:focus{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.sm\:focus\:via-purple-600:focus{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.sm\:focus\:via-purple-700:focus{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.sm\:focus\:via-purple-800:focus{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.sm\:focus\:via-purple-900:focus{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.sm\:focus\:via-pink-100:focus{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.sm\:focus\:via-pink-200:focus{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.sm\:focus\:via-pink-300:focus{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.sm\:focus\:via-pink-400:focus{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.sm\:focus\:via-pink-500:focus{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.sm\:focus\:via-pink-600:focus{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.sm\:focus\:via-pink-700:focus{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.sm\:focus\:via-pink-800:focus{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.sm\:focus\:via-pink-900:focus{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.sm\:focus\:to-transparent:focus{--gradient-to-color:transparent}.sm\:focus\:to-current:focus{--gradient-to-color:currentColor}.sm\:focus\:to-black:focus{--gradient-to-color:#000}.sm\:focus\:to-white:focus{--gradient-to-color:#fff}.sm\:focus\:to-gray-100:focus{--gradient-to-color:#f7fafc}.sm\:focus\:to-gray-200:focus{--gradient-to-color:#edf2f7}.sm\:focus\:to-gray-300:focus{--gradient-to-color:#e2e8f0}.sm\:focus\:to-gray-400:focus{--gradient-to-color:#cbd5e0}.sm\:focus\:to-gray-500:focus{--gradient-to-color:#a0aec0}.sm\:focus\:to-gray-600:focus{--gradient-to-color:#718096}.sm\:focus\:to-gray-700:focus{--gradient-to-color:#4a5568}.sm\:focus\:to-gray-800:focus{--gradient-to-color:#2d3748}.sm\:focus\:to-gray-900:focus{--gradient-to-color:#1a202c}.sm\:focus\:to-red-100:focus{--gradient-to-color:#fff5f5}.sm\:focus\:to-red-200:focus{--gradient-to-color:#fed7d7}.sm\:focus\:to-red-300:focus{--gradient-to-color:#feb2b2}.sm\:focus\:to-red-400:focus{--gradient-to-color:#fc8181}.sm\:focus\:to-red-500:focus{--gradient-to-color:#f56565}.sm\:focus\:to-red-600:focus{--gradient-to-color:#e53e3e}.sm\:focus\:to-red-700:focus{--gradient-to-color:#c53030}.sm\:focus\:to-red-800:focus{--gradient-to-color:#9b2c2c}.sm\:focus\:to-red-900:focus{--gradient-to-color:#742a2a}.sm\:focus\:to-orange-100:focus{--gradient-to-color:#fffaf0}.sm\:focus\:to-orange-200:focus{--gradient-to-color:#feebc8}.sm\:focus\:to-orange-300:focus{--gradient-to-color:#fbd38d}.sm\:focus\:to-orange-400:focus{--gradient-to-color:#f6ad55}.sm\:focus\:to-orange-500:focus{--gradient-to-color:#ed8936}.sm\:focus\:to-orange-600:focus{--gradient-to-color:#dd6b20}.sm\:focus\:to-orange-700:focus{--gradient-to-color:#c05621}.sm\:focus\:to-orange-800:focus{--gradient-to-color:#9c4221}.sm\:focus\:to-orange-900:focus{--gradient-to-color:#7b341e}.sm\:focus\:to-yellow-100:focus{--gradient-to-color:#fffff0}.sm\:focus\:to-yellow-200:focus{--gradient-to-color:#fefcbf}.sm\:focus\:to-yellow-300:focus{--gradient-to-color:#faf089}.sm\:focus\:to-yellow-400:focus{--gradient-to-color:#f6e05e}.sm\:focus\:to-yellow-500:focus{--gradient-to-color:#ecc94b}.sm\:focus\:to-yellow-600:focus{--gradient-to-color:#d69e2e}.sm\:focus\:to-yellow-700:focus{--gradient-to-color:#b7791f}.sm\:focus\:to-yellow-800:focus{--gradient-to-color:#975a16}.sm\:focus\:to-yellow-900:focus{--gradient-to-color:#744210}.sm\:focus\:to-green-100:focus{--gradient-to-color:#f0fff4}.sm\:focus\:to-green-200:focus{--gradient-to-color:#c6f6d5}.sm\:focus\:to-green-300:focus{--gradient-to-color:#9ae6b4}.sm\:focus\:to-green-400:focus{--gradient-to-color:#68d391}.sm\:focus\:to-green-500:focus{--gradient-to-color:#48bb78}.sm\:focus\:to-green-600:focus{--gradient-to-color:#38a169}.sm\:focus\:to-green-700:focus{--gradient-to-color:#2f855a}.sm\:focus\:to-green-800:focus{--gradient-to-color:#276749}.sm\:focus\:to-green-900:focus{--gradient-to-color:#22543d}.sm\:focus\:to-teal-100:focus{--gradient-to-color:#e6fffa}.sm\:focus\:to-teal-200:focus{--gradient-to-color:#b2f5ea}.sm\:focus\:to-teal-300:focus{--gradient-to-color:#81e6d9}.sm\:focus\:to-teal-400:focus{--gradient-to-color:#4fd1c5}.sm\:focus\:to-teal-500:focus{--gradient-to-color:#38b2ac}.sm\:focus\:to-teal-600:focus{--gradient-to-color:#319795}.sm\:focus\:to-teal-700:focus{--gradient-to-color:#2c7a7b}.sm\:focus\:to-teal-800:focus{--gradient-to-color:#285e61}.sm\:focus\:to-teal-900:focus{--gradient-to-color:#234e52}.sm\:focus\:to-blue-100:focus{--gradient-to-color:#ebf8ff}.sm\:focus\:to-blue-200:focus{--gradient-to-color:#bee3f8}.sm\:focus\:to-blue-300:focus{--gradient-to-color:#90cdf4}.sm\:focus\:to-blue-400:focus{--gradient-to-color:#63b3ed}.sm\:focus\:to-blue-500:focus{--gradient-to-color:#4299e1}.sm\:focus\:to-blue-600:focus{--gradient-to-color:#3182ce}.sm\:focus\:to-blue-700:focus{--gradient-to-color:#2b6cb0}.sm\:focus\:to-blue-800:focus{--gradient-to-color:#2c5282}.sm\:focus\:to-blue-900:focus{--gradient-to-color:#2a4365}.sm\:focus\:to-indigo-100:focus{--gradient-to-color:#ebf4ff}.sm\:focus\:to-indigo-200:focus{--gradient-to-color:#c3dafe}.sm\:focus\:to-indigo-300:focus{--gradient-to-color:#a3bffa}.sm\:focus\:to-indigo-400:focus{--gradient-to-color:#7f9cf5}.sm\:focus\:to-indigo-500:focus{--gradient-to-color:#667eea}.sm\:focus\:to-indigo-600:focus{--gradient-to-color:#5a67d8}.sm\:focus\:to-indigo-700:focus{--gradient-to-color:#4c51bf}.sm\:focus\:to-indigo-800:focus{--gradient-to-color:#434190}.sm\:focus\:to-indigo-900:focus{--gradient-to-color:#3c366b}.sm\:focus\:to-purple-100:focus{--gradient-to-color:#faf5ff}.sm\:focus\:to-purple-200:focus{--gradient-to-color:#e9d8fd}.sm\:focus\:to-purple-300:focus{--gradient-to-color:#d6bcfa}.sm\:focus\:to-purple-400:focus{--gradient-to-color:#b794f4}.sm\:focus\:to-purple-500:focus{--gradient-to-color:#9f7aea}.sm\:focus\:to-purple-600:focus{--gradient-to-color:#805ad5}.sm\:focus\:to-purple-700:focus{--gradient-to-color:#6b46c1}.sm\:focus\:to-purple-800:focus{--gradient-to-color:#553c9a}.sm\:focus\:to-purple-900:focus{--gradient-to-color:#44337a}.sm\:focus\:to-pink-100:focus{--gradient-to-color:#fff5f7}.sm\:focus\:to-pink-200:focus{--gradient-to-color:#fed7e2}.sm\:focus\:to-pink-300:focus{--gradient-to-color:#fbb6ce}.sm\:focus\:to-pink-400:focus{--gradient-to-color:#f687b3}.sm\:focus\:to-pink-500:focus{--gradient-to-color:#ed64a6}.sm\:focus\:to-pink-600:focus{--gradient-to-color:#d53f8c}.sm\:focus\:to-pink-700:focus{--gradient-to-color:#b83280}.sm\:focus\:to-pink-800:focus{--gradient-to-color:#97266d}.sm\:focus\:to-pink-900:focus{--gradient-to-color:#702459}.sm\:bg-opacity-0{--bg-opacity:0}.sm\:bg-opacity-25{--bg-opacity:0.25}.sm\:bg-opacity-50{--bg-opacity:0.5}.sm\:bg-opacity-75{--bg-opacity:0.75}.sm\:bg-opacity-100{--bg-opacity:1}.sm\:hover\:bg-opacity-0:hover{--bg-opacity:0}.sm\:hover\:bg-opacity-25:hover{--bg-opacity:0.25}.sm\:hover\:bg-opacity-50:hover{--bg-opacity:0.5}.sm\:hover\:bg-opacity-75:hover{--bg-opacity:0.75}.sm\:hover\:bg-opacity-100:hover{--bg-opacity:1}.sm\:focus\:bg-opacity-0:focus{--bg-opacity:0}.sm\:focus\:bg-opacity-25:focus{--bg-opacity:0.25}.sm\:focus\:bg-opacity-50:focus{--bg-opacity:0.5}.sm\:focus\:bg-opacity-75:focus{--bg-opacity:0.75}.sm\:focus\:bg-opacity-100:focus{--bg-opacity:1}.sm\:bg-bottom{background-position:bottom}.sm\:bg-center{background-position:center}.sm\:bg-left{background-position:left}.sm\:bg-left-bottom{background-position:left bottom}.sm\:bg-left-top{background-position:left top}.sm\:bg-right{background-position:right}.sm\:bg-right-bottom{background-position:right bottom}.sm\:bg-right-top{background-position:right top}.sm\:bg-top{background-position:top}.sm\:bg-repeat{background-repeat:repeat}.sm\:bg-no-repeat{background-repeat:no-repeat}.sm\:bg-repeat-x{background-repeat:repeat-x}.sm\:bg-repeat-y{background-repeat:repeat-y}.sm\:bg-repeat-round{background-repeat:round}.sm\:bg-repeat-space{background-repeat:space}.sm\:bg-auto{background-size:auto}.sm\:bg-cover{background-size:cover}.sm\:bg-contain{background-size:contain}.sm\:border-collapse{border-collapse:collapse}.sm\:border-separate{border-collapse:separate}.sm\:border-transparent{border-color:transparent}.sm\:border-current{border-color:currentColor}.sm\:border-black{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.sm\:border-white{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.sm\:border-gray-100{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.sm\:border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.sm\:border-gray-300{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.sm\:border-gray-400{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.sm\:border-gray-500{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.sm\:border-gray-600{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.sm\:border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.sm\:border-gray-800{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.sm\:border-gray-900{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.sm\:border-red-100{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.sm\:border-red-200{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.sm\:border-red-300{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.sm\:border-red-400{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.sm\:border-red-500{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.sm\:border-red-600{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.sm\:border-red-700{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.sm\:border-red-800{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.sm\:border-red-900{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.sm\:border-orange-100{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.sm\:border-orange-200{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.sm\:border-orange-300{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.sm\:border-orange-400{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.sm\:border-orange-500{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.sm\:border-orange-600{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.sm\:border-orange-700{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.sm\:border-orange-800{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.sm\:border-orange-900{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.sm\:border-yellow-100{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.sm\:border-yellow-200{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.sm\:border-yellow-300{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.sm\:border-yellow-400{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.sm\:border-yellow-500{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.sm\:border-yellow-600{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.sm\:border-yellow-700{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.sm\:border-yellow-800{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.sm\:border-yellow-900{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.sm\:border-green-100{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.sm\:border-green-200{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.sm\:border-green-300{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.sm\:border-green-400{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.sm\:border-green-500{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.sm\:border-green-600{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.sm\:border-green-700{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.sm\:border-green-800{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.sm\:border-green-900{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.sm\:border-teal-100{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.sm\:border-teal-200{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.sm\:border-teal-300{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.sm\:border-teal-400{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.sm\:border-teal-500{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.sm\:border-teal-600{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.sm\:border-teal-700{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.sm\:border-teal-800{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.sm\:border-teal-900{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.sm\:border-blue-100{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.sm\:border-blue-200{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.sm\:border-blue-300{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.sm\:border-blue-400{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.sm\:border-blue-500{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.sm\:border-blue-600{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.sm\:border-blue-700{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.sm\:border-blue-800{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.sm\:border-blue-900{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.sm\:border-indigo-100{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.sm\:border-indigo-200{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.sm\:border-indigo-300{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.sm\:border-indigo-400{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.sm\:border-indigo-500{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.sm\:border-indigo-600{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.sm\:border-indigo-700{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.sm\:border-indigo-800{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.sm\:border-indigo-900{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.sm\:border-purple-100{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.sm\:border-purple-200{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.sm\:border-purple-300{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.sm\:border-purple-400{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.sm\:border-purple-500{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.sm\:border-purple-600{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.sm\:border-purple-700{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.sm\:border-purple-800{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.sm\:border-purple-900{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.sm\:border-pink-100{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.sm\:border-pink-200{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.sm\:border-pink-300{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.sm\:border-pink-400{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.sm\:border-pink-500{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.sm\:border-pink-600{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.sm\:border-pink-700{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.sm\:border-pink-800{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.sm\:border-pink-900{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.sm\:hover\:border-transparent:hover{border-color:transparent}.sm\:hover\:border-current:hover{border-color:currentColor}.sm\:hover\:border-black:hover{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.sm\:hover\:border-white:hover{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.sm\:hover\:border-gray-100:hover{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.sm\:hover\:border-gray-200:hover{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.sm\:hover\:border-gray-300:hover{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.sm\:hover\:border-gray-400:hover{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.sm\:hover\:border-gray-500:hover{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.sm\:hover\:border-gray-600:hover{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.sm\:hover\:border-gray-700:hover{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.sm\:hover\:border-gray-800:hover{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.sm\:hover\:border-gray-900:hover{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.sm\:hover\:border-red-100:hover{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.sm\:hover\:border-red-200:hover{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.sm\:hover\:border-red-300:hover{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.sm\:hover\:border-red-400:hover{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.sm\:hover\:border-red-500:hover{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.sm\:hover\:border-red-600:hover{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.sm\:hover\:border-red-700:hover{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.sm\:hover\:border-red-800:hover{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.sm\:hover\:border-red-900:hover{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.sm\:hover\:border-orange-100:hover{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.sm\:hover\:border-orange-200:hover{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.sm\:hover\:border-orange-300:hover{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.sm\:hover\:border-orange-400:hover{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.sm\:hover\:border-orange-500:hover{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.sm\:hover\:border-orange-600:hover{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.sm\:hover\:border-orange-700:hover{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.sm\:hover\:border-orange-800:hover{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.sm\:hover\:border-orange-900:hover{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.sm\:hover\:border-yellow-100:hover{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.sm\:hover\:border-yellow-200:hover{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.sm\:hover\:border-yellow-300:hover{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.sm\:hover\:border-yellow-400:hover{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.sm\:hover\:border-yellow-500:hover{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.sm\:hover\:border-yellow-600:hover{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.sm\:hover\:border-yellow-700:hover{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.sm\:hover\:border-yellow-800:hover{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.sm\:hover\:border-yellow-900:hover{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.sm\:hover\:border-green-100:hover{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.sm\:hover\:border-green-200:hover{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.sm\:hover\:border-green-300:hover{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.sm\:hover\:border-green-400:hover{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.sm\:hover\:border-green-500:hover{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.sm\:hover\:border-green-600:hover{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.sm\:hover\:border-green-700:hover{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.sm\:hover\:border-green-800:hover{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.sm\:hover\:border-green-900:hover{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.sm\:hover\:border-teal-100:hover{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.sm\:hover\:border-teal-200:hover{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.sm\:hover\:border-teal-300:hover{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.sm\:hover\:border-teal-400:hover{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.sm\:hover\:border-teal-500:hover{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.sm\:hover\:border-teal-600:hover{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.sm\:hover\:border-teal-700:hover{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.sm\:hover\:border-teal-800:hover{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.sm\:hover\:border-teal-900:hover{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.sm\:hover\:border-blue-100:hover{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.sm\:hover\:border-blue-200:hover{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.sm\:hover\:border-blue-300:hover{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.sm\:hover\:border-blue-400:hover{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.sm\:hover\:border-blue-500:hover{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.sm\:hover\:border-blue-600:hover{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.sm\:hover\:border-blue-700:hover{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.sm\:hover\:border-blue-800:hover{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.sm\:hover\:border-blue-900:hover{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.sm\:hover\:border-indigo-100:hover{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.sm\:hover\:border-indigo-200:hover{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.sm\:hover\:border-indigo-300:hover{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.sm\:hover\:border-indigo-400:hover{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.sm\:hover\:border-indigo-500:hover{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.sm\:hover\:border-indigo-600:hover{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.sm\:hover\:border-indigo-700:hover{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.sm\:hover\:border-indigo-800:hover{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.sm\:hover\:border-indigo-900:hover{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.sm\:hover\:border-purple-100:hover{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.sm\:hover\:border-purple-200:hover{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.sm\:hover\:border-purple-300:hover{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.sm\:hover\:border-purple-400:hover{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.sm\:hover\:border-purple-500:hover{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.sm\:hover\:border-purple-600:hover{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.sm\:hover\:border-purple-700:hover{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.sm\:hover\:border-purple-800:hover{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.sm\:hover\:border-purple-900:hover{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.sm\:hover\:border-pink-100:hover{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.sm\:hover\:border-pink-200:hover{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.sm\:hover\:border-pink-300:hover{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.sm\:hover\:border-pink-400:hover{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.sm\:hover\:border-pink-500:hover{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.sm\:hover\:border-pink-600:hover{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.sm\:hover\:border-pink-700:hover{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.sm\:hover\:border-pink-800:hover{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.sm\:hover\:border-pink-900:hover{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.sm\:focus\:border-transparent:focus{border-color:transparent}.sm\:focus\:border-current:focus{border-color:currentColor}.sm\:focus\:border-black:focus{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.sm\:focus\:border-white:focus{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.sm\:focus\:border-gray-100:focus{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.sm\:focus\:border-gray-200:focus{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.sm\:focus\:border-gray-300:focus{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.sm\:focus\:border-gray-400:focus{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.sm\:focus\:border-gray-500:focus{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.sm\:focus\:border-gray-600:focus{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.sm\:focus\:border-gray-700:focus{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.sm\:focus\:border-gray-800:focus{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.sm\:focus\:border-gray-900:focus{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.sm\:focus\:border-red-100:focus{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.sm\:focus\:border-red-200:focus{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.sm\:focus\:border-red-300:focus{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.sm\:focus\:border-red-400:focus{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.sm\:focus\:border-red-500:focus{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.sm\:focus\:border-red-600:focus{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.sm\:focus\:border-red-700:focus{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.sm\:focus\:border-red-800:focus{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.sm\:focus\:border-red-900:focus{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.sm\:focus\:border-orange-100:focus{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.sm\:focus\:border-orange-200:focus{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.sm\:focus\:border-orange-300:focus{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.sm\:focus\:border-orange-400:focus{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.sm\:focus\:border-orange-500:focus{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.sm\:focus\:border-orange-600:focus{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.sm\:focus\:border-orange-700:focus{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.sm\:focus\:border-orange-800:focus{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.sm\:focus\:border-orange-900:focus{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.sm\:focus\:border-yellow-100:focus{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.sm\:focus\:border-yellow-200:focus{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.sm\:focus\:border-yellow-300:focus{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.sm\:focus\:border-yellow-400:focus{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.sm\:focus\:border-yellow-500:focus{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.sm\:focus\:border-yellow-600:focus{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.sm\:focus\:border-yellow-700:focus{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.sm\:focus\:border-yellow-800:focus{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.sm\:focus\:border-yellow-900:focus{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.sm\:focus\:border-green-100:focus{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.sm\:focus\:border-green-200:focus{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.sm\:focus\:border-green-300:focus{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.sm\:focus\:border-green-400:focus{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.sm\:focus\:border-green-500:focus{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.sm\:focus\:border-green-600:focus{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.sm\:focus\:border-green-700:focus{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.sm\:focus\:border-green-800:focus{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.sm\:focus\:border-green-900:focus{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.sm\:focus\:border-teal-100:focus{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.sm\:focus\:border-teal-200:focus{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.sm\:focus\:border-teal-300:focus{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.sm\:focus\:border-teal-400:focus{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.sm\:focus\:border-teal-500:focus{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.sm\:focus\:border-teal-600:focus{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.sm\:focus\:border-teal-700:focus{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.sm\:focus\:border-teal-800:focus{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.sm\:focus\:border-teal-900:focus{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.sm\:focus\:border-blue-100:focus{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.sm\:focus\:border-blue-200:focus{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.sm\:focus\:border-blue-300:focus{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.sm\:focus\:border-blue-400:focus{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.sm\:focus\:border-blue-500:focus{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.sm\:focus\:border-blue-600:focus{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.sm\:focus\:border-blue-700:focus{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.sm\:focus\:border-blue-800:focus{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.sm\:focus\:border-blue-900:focus{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.sm\:focus\:border-indigo-100:focus{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.sm\:focus\:border-indigo-200:focus{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.sm\:focus\:border-indigo-300:focus{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.sm\:focus\:border-indigo-400:focus{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.sm\:focus\:border-indigo-500:focus{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.sm\:focus\:border-indigo-600:focus{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.sm\:focus\:border-indigo-700:focus{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.sm\:focus\:border-indigo-800:focus{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.sm\:focus\:border-indigo-900:focus{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.sm\:focus\:border-purple-100:focus{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.sm\:focus\:border-purple-200:focus{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.sm\:focus\:border-purple-300:focus{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.sm\:focus\:border-purple-400:focus{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.sm\:focus\:border-purple-500:focus{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.sm\:focus\:border-purple-600:focus{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.sm\:focus\:border-purple-700:focus{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.sm\:focus\:border-purple-800:focus{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.sm\:focus\:border-purple-900:focus{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.sm\:focus\:border-pink-100:focus{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.sm\:focus\:border-pink-200:focus{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.sm\:focus\:border-pink-300:focus{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.sm\:focus\:border-pink-400:focus{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.sm\:focus\:border-pink-500:focus{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.sm\:focus\:border-pink-600:focus{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.sm\:focus\:border-pink-700:focus{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.sm\:focus\:border-pink-800:focus{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.sm\:focus\:border-pink-900:focus{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.sm\:border-opacity-0{--border-opacity:0}.sm\:border-opacity-25{--border-opacity:0.25}.sm\:border-opacity-50{--border-opacity:0.5}.sm\:border-opacity-75{--border-opacity:0.75}.sm\:border-opacity-100{--border-opacity:1}.sm\:hover\:border-opacity-0:hover{--border-opacity:0}.sm\:hover\:border-opacity-25:hover{--border-opacity:0.25}.sm\:hover\:border-opacity-50:hover{--border-opacity:0.5}.sm\:hover\:border-opacity-75:hover{--border-opacity:0.75}.sm\:hover\:border-opacity-100:hover{--border-opacity:1}.sm\:focus\:border-opacity-0:focus{--border-opacity:0}.sm\:focus\:border-opacity-25:focus{--border-opacity:0.25}.sm\:focus\:border-opacity-50:focus{--border-opacity:0.5}.sm\:focus\:border-opacity-75:focus{--border-opacity:0.75}.sm\:focus\:border-opacity-100:focus{--border-opacity:1}.sm\:rounded-none{border-radius:0}.sm\:rounded-sm{border-radius:.125rem}.sm\:rounded{border-radius:.25rem}.sm\:rounded-md{border-radius:.375rem}.sm\:rounded-lg{border-radius:.5rem}.sm\:rounded-xl{border-radius:.75rem}.sm\:rounded-2xl{border-radius:1rem}.sm\:rounded-3xl{border-radius:1.5rem}.sm\:rounded-full{border-radius:9999px}.sm\:rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.sm\:rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.sm\:rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.sm\:rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.sm\:rounded-t-sm{border-top-left-radius:.125rem;border-top-right-radius:.125rem}.sm\:rounded-r-sm{border-top-right-radius:.125rem;border-bottom-right-radius:.125rem}.sm\:rounded-b-sm{border-bottom-right-radius:.125rem;border-bottom-left-radius:.125rem}.sm\:rounded-l-sm{border-top-left-radius:.125rem;border-bottom-left-radius:.125rem}.sm\:rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.sm\:rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.sm\:rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.sm\:rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.sm\:rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.sm\:rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.sm\:rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.sm\:rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.sm\:rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.sm\:rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.sm\:rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.sm\:rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.sm\:rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.sm\:rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.sm\:rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.sm\:rounded-l-xl{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.sm\:rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.sm\:rounded-r-2xl{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.sm\:rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.sm\:rounded-l-2xl{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.sm\:rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.sm\:rounded-r-3xl{border-top-right-radius:1.5rem;border-bottom-right-radius:1.5rem}.sm\:rounded-b-3xl{border-bottom-right-radius:1.5rem;border-bottom-left-radius:1.5rem}.sm\:rounded-l-3xl{border-top-left-radius:1.5rem;border-bottom-left-radius:1.5rem}.sm\:rounded-t-full{border-top-left-radius:9999px;border-top-right-radius:9999px}.sm\:rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.sm\:rounded-b-full{border-bottom-right-radius:9999px;border-bottom-left-radius:9999px}.sm\:rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.sm\:rounded-tl-none{border-top-left-radius:0}.sm\:rounded-tr-none{border-top-right-radius:0}.sm\:rounded-br-none{border-bottom-right-radius:0}.sm\:rounded-bl-none{border-bottom-left-radius:0}.sm\:rounded-tl-sm{border-top-left-radius:.125rem}.sm\:rounded-tr-sm{border-top-right-radius:.125rem}.sm\:rounded-br-sm{border-bottom-right-radius:.125rem}.sm\:rounded-bl-sm{border-bottom-left-radius:.125rem}.sm\:rounded-tl{border-top-left-radius:.25rem}.sm\:rounded-tr{border-top-right-radius:.25rem}.sm\:rounded-br{border-bottom-right-radius:.25rem}.sm\:rounded-bl{border-bottom-left-radius:.25rem}.sm\:rounded-tl-md{border-top-left-radius:.375rem}.sm\:rounded-tr-md{border-top-right-radius:.375rem}.sm\:rounded-br-md{border-bottom-right-radius:.375rem}.sm\:rounded-bl-md{border-bottom-left-radius:.375rem}.sm\:rounded-tl-lg{border-top-left-radius:.5rem}.sm\:rounded-tr-lg{border-top-right-radius:.5rem}.sm\:rounded-br-lg{border-bottom-right-radius:.5rem}.sm\:rounded-bl-lg{border-bottom-left-radius:.5rem}.sm\:rounded-tl-xl{border-top-left-radius:.75rem}.sm\:rounded-tr-xl{border-top-right-radius:.75rem}.sm\:rounded-br-xl{border-bottom-right-radius:.75rem}.sm\:rounded-bl-xl{border-bottom-left-radius:.75rem}.sm\:rounded-tl-2xl{border-top-left-radius:1rem}.sm\:rounded-tr-2xl{border-top-right-radius:1rem}.sm\:rounded-br-2xl{border-bottom-right-radius:1rem}.sm\:rounded-bl-2xl{border-bottom-left-radius:1rem}.sm\:rounded-tl-3xl{border-top-left-radius:1.5rem}.sm\:rounded-tr-3xl{border-top-right-radius:1.5rem}.sm\:rounded-br-3xl{border-bottom-right-radius:1.5rem}.sm\:rounded-bl-3xl{border-bottom-left-radius:1.5rem}.sm\:rounded-tl-full{border-top-left-radius:9999px}.sm\:rounded-tr-full{border-top-right-radius:9999px}.sm\:rounded-br-full{border-bottom-right-radius:9999px}.sm\:rounded-bl-full{border-bottom-left-radius:9999px}.sm\:border-solid{border-style:solid}.sm\:border-dashed{border-style:dashed}.sm\:border-dotted{border-style:dotted}.sm\:border-double{border-style:double}.sm\:border-none{border-style:none}.sm\:border-0{border-width:0}.sm\:border-2{border-width:2px}.sm\:border-4{border-width:4px}.sm\:border-8{border-width:8px}.sm\:border{border-width:1px}.sm\:border-t-0{border-top-width:0}.sm\:border-r-0{border-right-width:0}.sm\:border-b-0{border-bottom-width:0}.sm\:border-l-0{border-left-width:0}.sm\:border-t-2{border-top-width:2px}.sm\:border-r-2{border-right-width:2px}.sm\:border-b-2{border-bottom-width:2px}.sm\:border-l-2{border-left-width:2px}.sm\:border-t-4{border-top-width:4px}.sm\:border-r-4{border-right-width:4px}.sm\:border-b-4{border-bottom-width:4px}.sm\:border-l-4{border-left-width:4px}.sm\:border-t-8{border-top-width:8px}.sm\:border-r-8{border-right-width:8px}.sm\:border-b-8{border-bottom-width:8px}.sm\:border-l-8{border-left-width:8px}.sm\:border-t{border-top-width:1px}.sm\:border-r{border-right-width:1px}.sm\:border-b{border-bottom-width:1px}.sm\:border-l{border-left-width:1px}.sm\:box-border{box-sizing:border-box}.sm\:box-content{box-sizing:content-box}.sm\:cursor-auto{cursor:auto}.sm\:cursor-default{cursor:default}.sm\:cursor-pointer{cursor:pointer}.sm\:cursor-wait{cursor:wait}.sm\:cursor-text{cursor:text}.sm\:cursor-move{cursor:move}.sm\:cursor-not-allowed{cursor:not-allowed}.sm\:block{display:block}.sm\:inline-block{display:inline-block}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:inline-flex{display:inline-flex}.sm\:table{display:table}.sm\:table-caption{display:table-caption}.sm\:table-cell{display:table-cell}.sm\:table-column{display:table-column}.sm\:table-column-group{display:table-column-group}.sm\:table-footer-group{display:table-footer-group}.sm\:table-header-group{display:table-header-group}.sm\:table-row-group{display:table-row-group}.sm\:table-row{display:table-row}.sm\:flow-root{display:flow-root}.sm\:grid{display:grid}.sm\:inline-grid{display:inline-grid}.sm\:contents{display:contents}.sm\:hidden{display:none}.sm\:flex-row{flex-direction:row}.sm\:flex-row-reverse{flex-direction:row-reverse}.sm\:flex-col{flex-direction:column}.sm\:flex-col-reverse{flex-direction:column-reverse}.sm\:flex-wrap{flex-wrap:wrap}.sm\:flex-wrap-reverse{flex-wrap:wrap-reverse}.sm\:flex-no-wrap{flex-wrap:nowrap}.sm\:place-items-auto{place-items:auto}.sm\:place-items-start{place-items:start}.sm\:place-items-end{place-items:end}.sm\:place-items-center{place-items:center}.sm\:place-items-stretch{place-items:stretch}.sm\:place-content-center{place-content:center}.sm\:place-content-start{place-content:start}.sm\:place-content-end{place-content:end}.sm\:place-content-between{place-content:space-between}.sm\:place-content-around{place-content:space-around}.sm\:place-content-evenly{place-content:space-evenly}.sm\:place-content-stretch{place-content:stretch}.sm\:place-self-auto{place-self:auto}.sm\:place-self-start{place-self:start}.sm\:place-self-end{place-self:end}.sm\:place-self-center{place-self:center}.sm\:place-self-stretch{place-self:stretch}.sm\:items-start{align-items:flex-start}.sm\:items-end{align-items:flex-end}.sm\:items-center{align-items:center}.sm\:items-baseline{align-items:baseline}.sm\:items-stretch{align-items:stretch}.sm\:content-center{align-content:center}.sm\:content-start{align-content:flex-start}.sm\:content-end{align-content:flex-end}.sm\:content-between{align-content:space-between}.sm\:content-around{align-content:space-around}.sm\:content-evenly{align-content:space-evenly}.sm\:self-auto{align-self:auto}.sm\:self-start{align-self:flex-start}.sm\:self-end{align-self:flex-end}.sm\:self-center{align-self:center}.sm\:self-stretch{align-self:stretch}.sm\:justify-items-auto{justify-items:auto}.sm\:justify-items-start{justify-items:start}.sm\:justify-items-end{justify-items:end}.sm\:justify-items-center{justify-items:center}.sm\:justify-items-stretch{justify-items:stretch}.sm\:justify-start{justify-content:flex-start}.sm\:justify-end{justify-content:flex-end}.sm\:justify-center{justify-content:center}.sm\:justify-between{justify-content:space-between}.sm\:justify-around{justify-content:space-around}.sm\:justify-evenly{justify-content:space-evenly}.sm\:justify-self-auto{justify-self:auto}.sm\:justify-self-start{justify-self:start}.sm\:justify-self-end{justify-self:end}.sm\:justify-self-center{justify-self:center}.sm\:justify-self-stretch{justify-self:stretch}.sm\:flex-1{flex:1 1 0%}.sm\:flex-auto{flex:1 1 auto}.sm\:flex-initial{flex:0 1 auto}.sm\:flex-none{flex:none}.sm\:flex-grow-0{flex-grow:0}.sm\:flex-grow{flex-grow:1}.sm\:flex-shrink-0{flex-shrink:0}.sm\:flex-shrink{flex-shrink:1}.sm\:order-1{order:1}.sm\:order-2{order:2}.sm\:order-3{order:3}.sm\:order-4{order:4}.sm\:order-5{order:5}.sm\:order-6{order:6}.sm\:order-7{order:7}.sm\:order-8{order:8}.sm\:order-9{order:9}.sm\:order-10{order:10}.sm\:order-11{order:11}.sm\:order-12{order:12}.sm\:order-first{order:-9999}.sm\:order-last{order:9999}.sm\:order-none{order:0}.sm\:float-right{float:right}.sm\:float-left{float:left}.sm\:float-none{float:none}.sm\:clearfix:after{content:"";display:table;clear:both}.sm\:clear-left{clear:left}.sm\:clear-right{clear:right}.sm\:clear-both{clear:both}.sm\:clear-none{clear:none}.sm\:font-sans{font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.sm\:font-serif{font-family:Georgia,Cambria,"Times New Roman",Times,serif}.sm\:font-mono{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.sm\:font-hairline{font-weight:100}.sm\:font-thin{font-weight:200}.sm\:font-light{font-weight:300}.sm\:font-normal{font-weight:400}.sm\:font-medium{font-weight:500}.sm\:font-semibold{font-weight:600}.sm\:font-bold{font-weight:700}.sm\:font-extrabold{font-weight:800}.sm\:font-black{font-weight:900}.sm\:hover\:font-hairline:hover{font-weight:100}.sm\:hover\:font-thin:hover{font-weight:200}.sm\:hover\:font-light:hover{font-weight:300}.sm\:hover\:font-normal:hover{font-weight:400}.sm\:hover\:font-medium:hover{font-weight:500}.sm\:hover\:font-semibold:hover{font-weight:600}.sm\:hover\:font-bold:hover{font-weight:700}.sm\:hover\:font-extrabold:hover{font-weight:800}.sm\:hover\:font-black:hover{font-weight:900}.sm\:focus\:font-hairline:focus{font-weight:100}.sm\:focus\:font-thin:focus{font-weight:200}.sm\:focus\:font-light:focus{font-weight:300}.sm\:focus\:font-normal:focus{font-weight:400}.sm\:focus\:font-medium:focus{font-weight:500}.sm\:focus\:font-semibold:focus{font-weight:600}.sm\:focus\:font-bold:focus{font-weight:700}.sm\:focus\:font-extrabold:focus{font-weight:800}.sm\:focus\:font-black:focus{font-weight:900}.sm\:h-0{height:0}.sm\:h-1{height:.25rem}.sm\:h-2{height:.5rem}.sm\:h-3{height:.75rem}.sm\:h-4{height:1rem}.sm\:h-5{height:1.25rem}.sm\:h-6{height:1.5rem}.sm\:h-8{height:2rem}.sm\:h-10{height:2.5rem}.sm\:h-12{height:3rem}.sm\:h-16{height:4rem}.sm\:h-20{height:5rem}.sm\:h-24{height:6rem}.sm\:h-32{height:8rem}.sm\:h-40{height:10rem}.sm\:h-48{height:12rem}.sm\:h-56{height:14rem}.sm\:h-64{height:16rem}.sm\:h-auto{height:auto}.sm\:h-px{height:1px}.sm\:h-full{height:100%}.sm\:h-screen{height:100vh}.sm\:text-xs{font-size:.75rem}.sm\:text-sm{font-size:.875rem}.sm\:text-base{font-size:1rem}.sm\:text-lg{font-size:1.125rem}.sm\:text-xl{font-size:1.25rem}.sm\:text-2xl{font-size:1.5rem}.sm\:text-3xl{font-size:1.875rem}.sm\:text-4xl{font-size:2.25rem}.sm\:text-5xl{font-size:3rem}.sm\:text-6xl{font-size:4rem}.sm\:leading-3{line-height:.75rem}.sm\:leading-4{line-height:1rem}.sm\:leading-5{line-height:1.25rem}.sm\:leading-6{line-height:1.5rem}.sm\:leading-7{line-height:1.75rem}.sm\:leading-8{line-height:2rem}.sm\:leading-9{line-height:2.25rem}.sm\:leading-10{line-height:2.5rem}.sm\:leading-none{line-height:1}.sm\:leading-tight{line-height:1.25}.sm\:leading-snug{line-height:1.375}.sm\:leading-normal{line-height:1.5}.sm\:leading-relaxed{line-height:1.625}.sm\:leading-loose{line-height:2}.sm\:list-inside{list-style-position:inside}.sm\:list-outside{list-style-position:outside}.sm\:list-none{list-style-type:none}.sm\:list-disc{list-style-type:disc}.sm\:list-decimal{list-style-type:decimal}.sm\:m-0{margin:0}.sm\:m-1{margin:.25rem}.sm\:m-2{margin:.5rem}.sm\:m-3{margin:.75rem}.sm\:m-4{margin:1rem}.sm\:m-5{margin:1.25rem}.sm\:m-6{margin:1.5rem}.sm\:m-8{margin:2rem}.sm\:m-10{margin:2.5rem}.sm\:m-12{margin:3rem}.sm\:m-16{margin:4rem}.sm\:m-20{margin:5rem}.sm\:m-24{margin:6rem}.sm\:m-32{margin:8rem}.sm\:m-40{margin:10rem}.sm\:m-48{margin:12rem}.sm\:m-56{margin:14rem}.sm\:m-64{margin:16rem}.sm\:m-auto{margin:auto}.sm\:m-px{margin:1px}.sm\:-m-1{margin:-.25rem}.sm\:-m-2{margin:-.5rem}.sm\:-m-3{margin:-.75rem}.sm\:-m-4{margin:-1rem}.sm\:-m-5{margin:-1.25rem}.sm\:-m-6{margin:-1.5rem}.sm\:-m-8{margin:-2rem}.sm\:-m-10{margin:-2.5rem}.sm\:-m-12{margin:-3rem}.sm\:-m-16{margin:-4rem}.sm\:-m-20{margin:-5rem}.sm\:-m-24{margin:-6rem}.sm\:-m-32{margin:-8rem}.sm\:-m-40{margin:-10rem}.sm\:-m-48{margin:-12rem}.sm\:-m-56{margin:-14rem}.sm\:-m-64{margin:-16rem}.sm\:-m-px{margin:-1px}.sm\:my-0{margin-top:0;margin-bottom:0}.sm\:mx-0{margin-left:0;margin-right:0}.sm\:my-1{margin-top:.25rem;margin-bottom:.25rem}.sm\:mx-1{margin-left:.25rem;margin-right:.25rem}.sm\:my-2{margin-top:.5rem;margin-bottom:.5rem}.sm\:mx-2{margin-left:.5rem;margin-right:.5rem}.sm\:my-3{margin-top:.75rem;margin-bottom:.75rem}.sm\:mx-3{margin-left:.75rem;margin-right:.75rem}.sm\:my-4{margin-top:1rem;margin-bottom:1rem}.sm\:mx-4{margin-left:1rem;margin-right:1rem}.sm\:my-5{margin-top:1.25rem;margin-bottom:1.25rem}.sm\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.sm\:my-6{margin-top:1.5rem;margin-bottom:1.5rem}.sm\:mx-6{margin-left:1.5rem;margin-right:1.5rem}.sm\:my-8{margin-top:2rem;margin-bottom:2rem}.sm\:mx-8{margin-left:2rem;margin-right:2rem}.sm\:my-10{margin-top:2.5rem;margin-bottom:2.5rem}.sm\:mx-10{margin-left:2.5rem;margin-right:2.5rem}.sm\:my-12{margin-top:3rem;margin-bottom:3rem}.sm\:mx-12{margin-left:3rem;margin-right:3rem}.sm\:my-16{margin-top:4rem;margin-bottom:4rem}.sm\:mx-16{margin-left:4rem;margin-right:4rem}.sm\:my-20{margin-top:5rem;margin-bottom:5rem}.sm\:mx-20{margin-left:5rem;margin-right:5rem}.sm\:my-24{margin-top:6rem;margin-bottom:6rem}.sm\:mx-24{margin-left:6rem;margin-right:6rem}.sm\:my-32{margin-top:8rem;margin-bottom:8rem}.sm\:mx-32{margin-left:8rem;margin-right:8rem}.sm\:my-40{margin-top:10rem;margin-bottom:10rem}.sm\:mx-40{margin-left:10rem;margin-right:10rem}.sm\:my-48{margin-top:12rem;margin-bottom:12rem}.sm\:mx-48{margin-left:12rem;margin-right:12rem}.sm\:my-56{margin-top:14rem;margin-bottom:14rem}.sm\:mx-56{margin-left:14rem;margin-right:14rem}.sm\:my-64{margin-top:16rem;margin-bottom:16rem}.sm\:mx-64{margin-left:16rem;margin-right:16rem}.sm\:my-auto{margin-top:auto;margin-bottom:auto}.sm\:mx-auto{margin-left:auto;margin-right:auto}.sm\:my-px{margin-top:1px;margin-bottom:1px}.sm\:mx-px{margin-left:1px;margin-right:1px}.sm\:-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.sm\:-mx-1{margin-left:-.25rem;margin-right:-.25rem}.sm\:-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.sm\:-mx-2{margin-left:-.5rem;margin-right:-.5rem}.sm\:-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.sm\:-mx-3{margin-left:-.75rem;margin-right:-.75rem}.sm\:-my-4{margin-top:-1rem;margin-bottom:-1rem}.sm\:-mx-4{margin-left:-1rem;margin-right:-1rem}.sm\:-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.sm\:-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.sm\:-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.sm\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.sm\:-my-8{margin-top:-2rem;margin-bottom:-2rem}.sm\:-mx-8{margin-left:-2rem;margin-right:-2rem}.sm\:-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.sm\:-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.sm\:-my-12{margin-top:-3rem;margin-bottom:-3rem}.sm\:-mx-12{margin-left:-3rem;margin-right:-3rem}.sm\:-my-16{margin-top:-4rem;margin-bottom:-4rem}.sm\:-mx-16{margin-left:-4rem;margin-right:-4rem}.sm\:-my-20{margin-top:-5rem;margin-bottom:-5rem}.sm\:-mx-20{margin-left:-5rem;margin-right:-5rem}.sm\:-my-24{margin-top:-6rem;margin-bottom:-6rem}.sm\:-mx-24{margin-left:-6rem;margin-right:-6rem}.sm\:-my-32{margin-top:-8rem;margin-bottom:-8rem}.sm\:-mx-32{margin-left:-8rem;margin-right:-8rem}.sm\:-my-40{margin-top:-10rem;margin-bottom:-10rem}.sm\:-mx-40{margin-left:-10rem;margin-right:-10rem}.sm\:-my-48{margin-top:-12rem;margin-bottom:-12rem}.sm\:-mx-48{margin-left:-12rem;margin-right:-12rem}.sm\:-my-56{margin-top:-14rem;margin-bottom:-14rem}.sm\:-mx-56{margin-left:-14rem;margin-right:-14rem}.sm\:-my-64{margin-top:-16rem;margin-bottom:-16rem}.sm\:-mx-64{margin-left:-16rem;margin-right:-16rem}.sm\:-my-px{margin-top:-1px;margin-bottom:-1px}.sm\:-mx-px{margin-left:-1px;margin-right:-1px}.sm\:mt-0{margin-top:0}.sm\:mr-0{margin-right:0}.sm\:mb-0{margin-bottom:0}.sm\:ml-0{margin-left:0}.sm\:mt-1{margin-top:.25rem}.sm\:mr-1{margin-right:.25rem}.sm\:mb-1{margin-bottom:.25rem}.sm\:ml-1{margin-left:.25rem}.sm\:mt-2{margin-top:.5rem}.sm\:mr-2{margin-right:.5rem}.sm\:mb-2{margin-bottom:.5rem}.sm\:ml-2{margin-left:.5rem}.sm\:mt-3{margin-top:.75rem}.sm\:mr-3{margin-right:.75rem}.sm\:mb-3{margin-bottom:.75rem}.sm\:ml-3{margin-left:.75rem}.sm\:mt-4{margin-top:1rem}.sm\:mr-4{margin-right:1rem}.sm\:mb-4{margin-bottom:1rem}.sm\:ml-4{margin-left:1rem}.sm\:mt-5{margin-top:1.25rem}.sm\:mr-5{margin-right:1.25rem}.sm\:mb-5{margin-bottom:1.25rem}.sm\:ml-5{margin-left:1.25rem}.sm\:mt-6{margin-top:1.5rem}.sm\:mr-6{margin-right:1.5rem}.sm\:mb-6{margin-bottom:1.5rem}.sm\:ml-6{margin-left:1.5rem}.sm\:mt-8{margin-top:2rem}.sm\:mr-8{margin-right:2rem}.sm\:mb-8{margin-bottom:2rem}.sm\:ml-8{margin-left:2rem}.sm\:mt-10{margin-top:2.5rem}.sm\:mr-10{margin-right:2.5rem}.sm\:mb-10{margin-bottom:2.5rem}.sm\:ml-10{margin-left:2.5rem}.sm\:mt-12{margin-top:3rem}.sm\:mr-12{margin-right:3rem}.sm\:mb-12{margin-bottom:3rem}.sm\:ml-12{margin-left:3rem}.sm\:mt-16{margin-top:4rem}.sm\:mr-16{margin-right:4rem}.sm\:mb-16{margin-bottom:4rem}.sm\:ml-16{margin-left:4rem}.sm\:mt-20{margin-top:5rem}.sm\:mr-20{margin-right:5rem}.sm\:mb-20{margin-bottom:5rem}.sm\:ml-20{margin-left:5rem}.sm\:mt-24{margin-top:6rem}.sm\:mr-24{margin-right:6rem}.sm\:mb-24{margin-bottom:6rem}.sm\:ml-24{margin-left:6rem}.sm\:mt-32{margin-top:8rem}.sm\:mr-32{margin-right:8rem}.sm\:mb-32{margin-bottom:8rem}.sm\:ml-32{margin-left:8rem}.sm\:mt-40{margin-top:10rem}.sm\:mr-40{margin-right:10rem}.sm\:mb-40{margin-bottom:10rem}.sm\:ml-40{margin-left:10rem}.sm\:mt-48{margin-top:12rem}.sm\:mr-48{margin-right:12rem}.sm\:mb-48{margin-bottom:12rem}.sm\:ml-48{margin-left:12rem}.sm\:mt-56{margin-top:14rem}.sm\:mr-56{margin-right:14rem}.sm\:mb-56{margin-bottom:14rem}.sm\:ml-56{margin-left:14rem}.sm\:mt-64{margin-top:16rem}.sm\:mr-64{margin-right:16rem}.sm\:mb-64{margin-bottom:16rem}.sm\:ml-64{margin-left:16rem}.sm\:mt-auto{margin-top:auto}.sm\:mr-auto{margin-right:auto}.sm\:mb-auto{margin-bottom:auto}.sm\:ml-auto{margin-left:auto}.sm\:mt-px{margin-top:1px}.sm\:mr-px{margin-right:1px}.sm\:mb-px{margin-bottom:1px}.sm\:ml-px{margin-left:1px}.sm\:-mt-1{margin-top:-.25rem}.sm\:-mr-1{margin-right:-.25rem}.sm\:-mb-1{margin-bottom:-.25rem}.sm\:-ml-1{margin-left:-.25rem}.sm\:-mt-2{margin-top:-.5rem}.sm\:-mr-2{margin-right:-.5rem}.sm\:-mb-2{margin-bottom:-.5rem}.sm\:-ml-2{margin-left:-.5rem}.sm\:-mt-3{margin-top:-.75rem}.sm\:-mr-3{margin-right:-.75rem}.sm\:-mb-3{margin-bottom:-.75rem}.sm\:-ml-3{margin-left:-.75rem}.sm\:-mt-4{margin-top:-1rem}.sm\:-mr-4{margin-right:-1rem}.sm\:-mb-4{margin-bottom:-1rem}.sm\:-ml-4{margin-left:-1rem}.sm\:-mt-5{margin-top:-1.25rem}.sm\:-mr-5{margin-right:-1.25rem}.sm\:-mb-5{margin-bottom:-1.25rem}.sm\:-ml-5{margin-left:-1.25rem}.sm\:-mt-6{margin-top:-1.5rem}.sm\:-mr-6{margin-right:-1.5rem}.sm\:-mb-6{margin-bottom:-1.5rem}.sm\:-ml-6{margin-left:-1.5rem}.sm\:-mt-8{margin-top:-2rem}.sm\:-mr-8{margin-right:-2rem}.sm\:-mb-8{margin-bottom:-2rem}.sm\:-ml-8{margin-left:-2rem}.sm\:-mt-10{margin-top:-2.5rem}.sm\:-mr-10{margin-right:-2.5rem}.sm\:-mb-10{margin-bottom:-2.5rem}.sm\:-ml-10{margin-left:-2.5rem}.sm\:-mt-12{margin-top:-3rem}.sm\:-mr-12{margin-right:-3rem}.sm\:-mb-12{margin-bottom:-3rem}.sm\:-ml-12{margin-left:-3rem}.sm\:-mt-16{margin-top:-4rem}.sm\:-mr-16{margin-right:-4rem}.sm\:-mb-16{margin-bottom:-4rem}.sm\:-ml-16{margin-left:-4rem}.sm\:-mt-20{margin-top:-5rem}.sm\:-mr-20{margin-right:-5rem}.sm\:-mb-20{margin-bottom:-5rem}.sm\:-ml-20{margin-left:-5rem}.sm\:-mt-24{margin-top:-6rem}.sm\:-mr-24{margin-right:-6rem}.sm\:-mb-24{margin-bottom:-6rem}.sm\:-ml-24{margin-left:-6rem}.sm\:-mt-32{margin-top:-8rem}.sm\:-mr-32{margin-right:-8rem}.sm\:-mb-32{margin-bottom:-8rem}.sm\:-ml-32{margin-left:-8rem}.sm\:-mt-40{margin-top:-10rem}.sm\:-mr-40{margin-right:-10rem}.sm\:-mb-40{margin-bottom:-10rem}.sm\:-ml-40{margin-left:-10rem}.sm\:-mt-48{margin-top:-12rem}.sm\:-mr-48{margin-right:-12rem}.sm\:-mb-48{margin-bottom:-12rem}.sm\:-ml-48{margin-left:-12rem}.sm\:-mt-56{margin-top:-14rem}.sm\:-mr-56{margin-right:-14rem}.sm\:-mb-56{margin-bottom:-14rem}.sm\:-ml-56{margin-left:-14rem}.sm\:-mt-64{margin-top:-16rem}.sm\:-mr-64{margin-right:-16rem}.sm\:-mb-64{margin-bottom:-16rem}.sm\:-ml-64{margin-left:-16rem}.sm\:-mt-px{margin-top:-1px}.sm\:-mr-px{margin-right:-1px}.sm\:-mb-px{margin-bottom:-1px}.sm\:-ml-px{margin-left:-1px}.sm\:max-h-full{max-height:100%}.sm\:max-h-screen{max-height:100vh}.sm\:max-w-none{max-width:none}.sm\:max-w-xs{max-width:20rem}.sm\:max-w-sm{max-width:24rem}.sm\:max-w-md{max-width:28rem}.sm\:max-w-lg{max-width:32rem}.sm\:max-w-xl{max-width:36rem}.sm\:max-w-2xl{max-width:42rem}.sm\:max-w-3xl{max-width:48rem}.sm\:max-w-4xl{max-width:56rem}.sm\:max-w-5xl{max-width:64rem}.sm\:max-w-6xl{max-width:72rem}.sm\:max-w-full{max-width:100%}.sm\:max-w-screen-sm{max-width:640px}.sm\:max-w-screen-md{max-width:768px}.sm\:max-w-screen-lg{max-width:1024px}.sm\:max-w-screen-xl{max-width:1280px}.sm\:min-h-0{min-height:0}.sm\:min-h-full{min-height:100%}.sm\:min-h-screen{min-height:100vh}.sm\:min-w-0{min-width:0}.sm\:min-w-full{min-width:100%}.sm\:object-contain{object-fit:contain}.sm\:object-cover{object-fit:cover}.sm\:object-fill{object-fit:fill}.sm\:object-none{object-fit:none}.sm\:object-scale-down{object-fit:scale-down}.sm\:object-bottom{object-position:bottom}.sm\:object-center{object-position:center}.sm\:object-left{object-position:left}.sm\:object-left-bottom{object-position:left bottom}.sm\:object-left-top{object-position:left top}.sm\:object-right{object-position:right}.sm\:object-right-bottom{object-position:right bottom}.sm\:object-right-top{object-position:right top}.sm\:object-top{object-position:top}.sm\:opacity-0{opacity:0}.sm\:opacity-25{opacity:.25}.sm\:opacity-50{opacity:.5}.sm\:opacity-75{opacity:.75}.sm\:opacity-100{opacity:1}.sm\:hover\:opacity-0:hover{opacity:0}.sm\:hover\:opacity-25:hover{opacity:.25}.sm\:hover\:opacity-50:hover{opacity:.5}.sm\:hover\:opacity-75:hover{opacity:.75}.sm\:hover\:opacity-100:hover{opacity:1}.sm\:focus\:opacity-0:focus{opacity:0}.sm\:focus\:opacity-25:focus{opacity:.25}.sm\:focus\:opacity-50:focus{opacity:.5}.sm\:focus\:opacity-75:focus{opacity:.75}.sm\:focus\:opacity-100:focus{opacity:1}.sm\:outline-none{outline:2px solid transparent;outline-offset:2px}.sm\:outline-white{outline:2px dotted #fff;outline-offset:2px}.sm\:outline-black{outline:2px dotted #000;outline-offset:2px}.sm\:focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.sm\:focus\:outline-white:focus{outline:2px dotted #fff;outline-offset:2px}.sm\:focus\:outline-black:focus{outline:2px dotted #000;outline-offset:2px}.sm\:overflow-auto{overflow:auto}.sm\:overflow-hidden{overflow:hidden}.sm\:overflow-visible{overflow:visible}.sm\:overflow-scroll{overflow:scroll}.sm\:overflow-x-auto{overflow-x:auto}.sm\:overflow-y-auto{overflow-y:auto}.sm\:overflow-x-hidden{overflow-x:hidden}.sm\:overflow-y-hidden{overflow-y:hidden}.sm\:overflow-x-visible{overflow-x:visible}.sm\:overflow-y-visible{overflow-y:visible}.sm\:overflow-x-scroll{overflow-x:scroll}.sm\:overflow-y-scroll{overflow-y:scroll}.sm\:scrolling-touch{-webkit-overflow-scrolling:touch}.sm\:scrolling-auto{-webkit-overflow-scrolling:auto}.sm\:overscroll-auto{-ms-scroll-chaining:chained;overscroll-behavior:auto}.sm\:overscroll-contain{-ms-scroll-chaining:none;overscroll-behavior:contain}.sm\:overscroll-none{-ms-scroll-chaining:none;overscroll-behavior:none}.sm\:overscroll-y-auto{overscroll-behavior-y:auto}.sm\:overscroll-y-contain{overscroll-behavior-y:contain}.sm\:overscroll-y-none{overscroll-behavior-y:none}.sm\:overscroll-x-auto{overscroll-behavior-x:auto}.sm\:overscroll-x-contain{overscroll-behavior-x:contain}.sm\:overscroll-x-none{overscroll-behavior-x:none}.sm\:p-0{padding:0}.sm\:p-1{padding:.25rem}.sm\:p-2{padding:.5rem}.sm\:p-3{padding:.75rem}.sm\:p-4{padding:1rem}.sm\:p-5{padding:1.25rem}.sm\:p-6{padding:1.5rem}.sm\:p-8{padding:2rem}.sm\:p-10{padding:2.5rem}.sm\:p-12{padding:3rem}.sm\:p-16{padding:4rem}.sm\:p-20{padding:5rem}.sm\:p-24{padding:6rem}.sm\:p-32{padding:8rem}.sm\:p-40{padding:10rem}.sm\:p-48{padding:12rem}.sm\:p-56{padding:14rem}.sm\:p-64{padding:16rem}.sm\:p-px{padding:1px}.sm\:py-0{padding-top:0;padding-bottom:0}.sm\:px-0{padding-left:0;padding-right:0}.sm\:py-1{padding-top:.25rem;padding-bottom:.25rem}.sm\:px-1{padding-left:.25rem;padding-right:.25rem}.sm\:py-2{padding-top:.5rem;padding-bottom:.5rem}.sm\:px-2{padding-left:.5rem;padding-right:.5rem}.sm\:py-3{padding-top:.75rem;padding-bottom:.75rem}.sm\:px-3{padding-left:.75rem;padding-right:.75rem}.sm\:py-4{padding-top:1rem;padding-bottom:1rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.sm\:px-5{padding-left:1.25rem;padding-right:1.25rem}.sm\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-8{padding-top:2rem;padding-bottom:2rem}.sm\:px-8{padding-left:2rem;padding-right:2rem}.sm\:py-10{padding-top:2.5rem;padding-bottom:2.5rem}.sm\:px-10{padding-left:2.5rem;padding-right:2.5rem}.sm\:py-12{padding-top:3rem;padding-bottom:3rem}.sm\:px-12{padding-left:3rem;padding-right:3rem}.sm\:py-16{padding-top:4rem;padding-bottom:4rem}.sm\:px-16{padding-left:4rem;padding-right:4rem}.sm\:py-20{padding-top:5rem;padding-bottom:5rem}.sm\:px-20{padding-left:5rem;padding-right:5rem}.sm\:py-24{padding-top:6rem;padding-bottom:6rem}.sm\:px-24{padding-left:6rem;padding-right:6rem}.sm\:py-32{padding-top:8rem;padding-bottom:8rem}.sm\:px-32{padding-left:8rem;padding-right:8rem}.sm\:py-40{padding-top:10rem;padding-bottom:10rem}.sm\:px-40{padding-left:10rem;padding-right:10rem}.sm\:py-48{padding-top:12rem;padding-bottom:12rem}.sm\:px-48{padding-left:12rem;padding-right:12rem}.sm\:py-56{padding-top:14rem;padding-bottom:14rem}.sm\:px-56{padding-left:14rem;padding-right:14rem}.sm\:py-64{padding-top:16rem;padding-bottom:16rem}.sm\:px-64{padding-left:16rem;padding-right:16rem}.sm\:py-px{padding-top:1px;padding-bottom:1px}.sm\:px-px{padding-left:1px;padding-right:1px}.sm\:pt-0{padding-top:0}.sm\:pr-0{padding-right:0}.sm\:pb-0{padding-bottom:0}.sm\:pl-0{padding-left:0}.sm\:pt-1{padding-top:.25rem}.sm\:pr-1{padding-right:.25rem}.sm\:pb-1{padding-bottom:.25rem}.sm\:pl-1{padding-left:.25rem}.sm\:pt-2{padding-top:.5rem}.sm\:pr-2{padding-right:.5rem}.sm\:pb-2{padding-bottom:.5rem}.sm\:pl-2{padding-left:.5rem}.sm\:pt-3{padding-top:.75rem}.sm\:pr-3{padding-right:.75rem}.sm\:pb-3{padding-bottom:.75rem}.sm\:pl-3{padding-left:.75rem}.sm\:pt-4{padding-top:1rem}.sm\:pr-4{padding-right:1rem}.sm\:pb-4{padding-bottom:1rem}.sm\:pl-4{padding-left:1rem}.sm\:pt-5{padding-top:1.25rem}.sm\:pr-5{padding-right:1.25rem}.sm\:pb-5{padding-bottom:1.25rem}.sm\:pl-5{padding-left:1.25rem}.sm\:pt-6{padding-top:1.5rem}.sm\:pr-6{padding-right:1.5rem}.sm\:pb-6{padding-bottom:1.5rem}.sm\:pl-6{padding-left:1.5rem}.sm\:pt-8{padding-top:2rem}.sm\:pr-8{padding-right:2rem}.sm\:pb-8{padding-bottom:2rem}.sm\:pl-8{padding-left:2rem}.sm\:pt-10{padding-top:2.5rem}.sm\:pr-10{padding-right:2.5rem}.sm\:pb-10{padding-bottom:2.5rem}.sm\:pl-10{padding-left:2.5rem}.sm\:pt-12{padding-top:3rem}.sm\:pr-12{padding-right:3rem}.sm\:pb-12{padding-bottom:3rem}.sm\:pl-12{padding-left:3rem}.sm\:pt-16{padding-top:4rem}.sm\:pr-16{padding-right:4rem}.sm\:pb-16{padding-bottom:4rem}.sm\:pl-16{padding-left:4rem}.sm\:pt-20{padding-top:5rem}.sm\:pr-20{padding-right:5rem}.sm\:pb-20{padding-bottom:5rem}.sm\:pl-20{padding-left:5rem}.sm\:pt-24{padding-top:6rem}.sm\:pr-24{padding-right:6rem}.sm\:pb-24{padding-bottom:6rem}.sm\:pl-24{padding-left:6rem}.sm\:pt-32{padding-top:8rem}.sm\:pr-32{padding-right:8rem}.sm\:pb-32{padding-bottom:8rem}.sm\:pl-32{padding-left:8rem}.sm\:pt-40{padding-top:10rem}.sm\:pr-40{padding-right:10rem}.sm\:pb-40{padding-bottom:10rem}.sm\:pl-40{padding-left:10rem}.sm\:pt-48{padding-top:12rem}.sm\:pr-48{padding-right:12rem}.sm\:pb-48{padding-bottom:12rem}.sm\:pl-48{padding-left:12rem}.sm\:pt-56{padding-top:14rem}.sm\:pr-56{padding-right:14rem}.sm\:pb-56{padding-bottom:14rem}.sm\:pl-56{padding-left:14rem}.sm\:pt-64{padding-top:16rem}.sm\:pr-64{padding-right:16rem}.sm\:pb-64{padding-bottom:16rem}.sm\:pl-64{padding-left:16rem}.sm\:pt-px{padding-top:1px}.sm\:pr-px{padding-right:1px}.sm\:pb-px{padding-bottom:1px}.sm\:pl-px{padding-left:1px}.sm\:placeholder-transparent:-ms-input-placeholder{color:transparent}.sm\:placeholder-transparent::-ms-input-placeholder{color:transparent}.sm\:placeholder-transparent::placeholder{color:transparent}.sm\:placeholder-current:-ms-input-placeholder{color:currentColor}.sm\:placeholder-current::-ms-input-placeholder{color:currentColor}.sm\:placeholder-current::placeholder{color:currentColor}.sm\:placeholder-black:-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.sm\:placeholder-black::-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.sm\:placeholder-black::placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.sm\:placeholder-white:-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.sm\:placeholder-white::-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.sm\:placeholder-white::placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.sm\:placeholder-gray-100:-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.sm\:placeholder-gray-100::-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.sm\:placeholder-gray-100::placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.sm\:placeholder-gray-200:-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.sm\:placeholder-gray-200::-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.sm\:placeholder-gray-200::placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.sm\:placeholder-gray-300:-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.sm\:placeholder-gray-300::-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.sm\:placeholder-gray-300::placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.sm\:placeholder-gray-400:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.sm\:placeholder-gray-400::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.sm\:placeholder-gray-400::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.sm\:placeholder-gray-500:-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.sm\:placeholder-gray-500::-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.sm\:placeholder-gray-500::placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.sm\:placeholder-gray-600:-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.sm\:placeholder-gray-600::-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.sm\:placeholder-gray-600::placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.sm\:placeholder-gray-700:-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.sm\:placeholder-gray-700::-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.sm\:placeholder-gray-700::placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.sm\:placeholder-gray-800:-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.sm\:placeholder-gray-800::-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.sm\:placeholder-gray-800::placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.sm\:placeholder-gray-900:-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.sm\:placeholder-gray-900::-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.sm\:placeholder-gray-900::placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.sm\:placeholder-red-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.sm\:placeholder-red-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.sm\:placeholder-red-100::placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.sm\:placeholder-red-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.sm\:placeholder-red-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.sm\:placeholder-red-200::placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.sm\:placeholder-red-300:-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.sm\:placeholder-red-300::-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.sm\:placeholder-red-300::placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.sm\:placeholder-red-400:-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.sm\:placeholder-red-400::-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.sm\:placeholder-red-400::placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.sm\:placeholder-red-500:-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.sm\:placeholder-red-500::-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.sm\:placeholder-red-500::placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.sm\:placeholder-red-600:-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.sm\:placeholder-red-600::-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.sm\:placeholder-red-600::placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.sm\:placeholder-red-700:-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.sm\:placeholder-red-700::-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.sm\:placeholder-red-700::placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.sm\:placeholder-red-800:-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.sm\:placeholder-red-800::-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.sm\:placeholder-red-800::placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.sm\:placeholder-red-900:-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.sm\:placeholder-red-900::-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.sm\:placeholder-red-900::placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.sm\:placeholder-orange-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.sm\:placeholder-orange-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.sm\:placeholder-orange-100::placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.sm\:placeholder-orange-200:-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.sm\:placeholder-orange-200::-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.sm\:placeholder-orange-200::placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.sm\:placeholder-orange-300:-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.sm\:placeholder-orange-300::-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.sm\:placeholder-orange-300::placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.sm\:placeholder-orange-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.sm\:placeholder-orange-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.sm\:placeholder-orange-400::placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.sm\:placeholder-orange-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.sm\:placeholder-orange-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.sm\:placeholder-orange-500::placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.sm\:placeholder-orange-600:-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.sm\:placeholder-orange-600::-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.sm\:placeholder-orange-600::placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.sm\:placeholder-orange-700:-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.sm\:placeholder-orange-700::-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.sm\:placeholder-orange-700::placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.sm\:placeholder-orange-800:-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.sm\:placeholder-orange-800::-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.sm\:placeholder-orange-800::placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.sm\:placeholder-orange-900:-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.sm\:placeholder-orange-900::-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.sm\:placeholder-orange-900::placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.sm\:placeholder-yellow-100:-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.sm\:placeholder-yellow-100::-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.sm\:placeholder-yellow-100::placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.sm\:placeholder-yellow-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.sm\:placeholder-yellow-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.sm\:placeholder-yellow-200::placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.sm\:placeholder-yellow-300:-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.sm\:placeholder-yellow-300::-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.sm\:placeholder-yellow-300::placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.sm\:placeholder-yellow-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.sm\:placeholder-yellow-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.sm\:placeholder-yellow-400::placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.sm\:placeholder-yellow-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.sm\:placeholder-yellow-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.sm\:placeholder-yellow-500::placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.sm\:placeholder-yellow-600:-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.sm\:placeholder-yellow-600::-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.sm\:placeholder-yellow-600::placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.sm\:placeholder-yellow-700:-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.sm\:placeholder-yellow-700::-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.sm\:placeholder-yellow-700::placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.sm\:placeholder-yellow-800:-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.sm\:placeholder-yellow-800::-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.sm\:placeholder-yellow-800::placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.sm\:placeholder-yellow-900:-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.sm\:placeholder-yellow-900::-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.sm\:placeholder-yellow-900::placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.sm\:placeholder-green-100:-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.sm\:placeholder-green-100::-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.sm\:placeholder-green-100::placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.sm\:placeholder-green-200:-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.sm\:placeholder-green-200::-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.sm\:placeholder-green-200::placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.sm\:placeholder-green-300:-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.sm\:placeholder-green-300::-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.sm\:placeholder-green-300::placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.sm\:placeholder-green-400:-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.sm\:placeholder-green-400::-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.sm\:placeholder-green-400::placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.sm\:placeholder-green-500:-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.sm\:placeholder-green-500::-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.sm\:placeholder-green-500::placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.sm\:placeholder-green-600:-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.sm\:placeholder-green-600::-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.sm\:placeholder-green-600::placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.sm\:placeholder-green-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.sm\:placeholder-green-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.sm\:placeholder-green-700::placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.sm\:placeholder-green-800:-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.sm\:placeholder-green-800::-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.sm\:placeholder-green-800::placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.sm\:placeholder-green-900:-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.sm\:placeholder-green-900::-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.sm\:placeholder-green-900::placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.sm\:placeholder-teal-100:-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.sm\:placeholder-teal-100::-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.sm\:placeholder-teal-100::placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.sm\:placeholder-teal-200:-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.sm\:placeholder-teal-200::-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.sm\:placeholder-teal-200::placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.sm\:placeholder-teal-300:-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.sm\:placeholder-teal-300::-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.sm\:placeholder-teal-300::placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.sm\:placeholder-teal-400:-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.sm\:placeholder-teal-400::-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.sm\:placeholder-teal-400::placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.sm\:placeholder-teal-500:-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.sm\:placeholder-teal-500::-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.sm\:placeholder-teal-500::placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.sm\:placeholder-teal-600:-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.sm\:placeholder-teal-600::-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.sm\:placeholder-teal-600::placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.sm\:placeholder-teal-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.sm\:placeholder-teal-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.sm\:placeholder-teal-700::placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.sm\:placeholder-teal-800:-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.sm\:placeholder-teal-800::-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.sm\:placeholder-teal-800::placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.sm\:placeholder-teal-900:-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.sm\:placeholder-teal-900::-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.sm\:placeholder-teal-900::placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.sm\:placeholder-blue-100:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.sm\:placeholder-blue-100::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.sm\:placeholder-blue-100::placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.sm\:placeholder-blue-200:-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.sm\:placeholder-blue-200::-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.sm\:placeholder-blue-200::placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.sm\:placeholder-blue-300:-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.sm\:placeholder-blue-300::-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.sm\:placeholder-blue-300::placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.sm\:placeholder-blue-400:-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.sm\:placeholder-blue-400::-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.sm\:placeholder-blue-400::placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.sm\:placeholder-blue-500:-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.sm\:placeholder-blue-500::-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.sm\:placeholder-blue-500::placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.sm\:placeholder-blue-600:-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.sm\:placeholder-blue-600::-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.sm\:placeholder-blue-600::placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.sm\:placeholder-blue-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.sm\:placeholder-blue-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.sm\:placeholder-blue-700::placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.sm\:placeholder-blue-800:-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.sm\:placeholder-blue-800::-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.sm\:placeholder-blue-800::placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.sm\:placeholder-blue-900:-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.sm\:placeholder-blue-900::-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.sm\:placeholder-blue-900::placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.sm\:placeholder-indigo-100:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.sm\:placeholder-indigo-100::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.sm\:placeholder-indigo-100::placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.sm\:placeholder-indigo-200:-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.sm\:placeholder-indigo-200::-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.sm\:placeholder-indigo-200::placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.sm\:placeholder-indigo-300:-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.sm\:placeholder-indigo-300::-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.sm\:placeholder-indigo-300::placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.sm\:placeholder-indigo-400:-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.sm\:placeholder-indigo-400::-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.sm\:placeholder-indigo-400::placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.sm\:placeholder-indigo-500:-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.sm\:placeholder-indigo-500::-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.sm\:placeholder-indigo-500::placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.sm\:placeholder-indigo-600:-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.sm\:placeholder-indigo-600::-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.sm\:placeholder-indigo-600::placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.sm\:placeholder-indigo-700:-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.sm\:placeholder-indigo-700::-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.sm\:placeholder-indigo-700::placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.sm\:placeholder-indigo-800:-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.sm\:placeholder-indigo-800::-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.sm\:placeholder-indigo-800::placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.sm\:placeholder-indigo-900:-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.sm\:placeholder-indigo-900::-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.sm\:placeholder-indigo-900::placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.sm\:placeholder-purple-100:-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.sm\:placeholder-purple-100::-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.sm\:placeholder-purple-100::placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.sm\:placeholder-purple-200:-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.sm\:placeholder-purple-200::-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.sm\:placeholder-purple-200::placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.sm\:placeholder-purple-300:-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.sm\:placeholder-purple-300::-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.sm\:placeholder-purple-300::placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.sm\:placeholder-purple-400:-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.sm\:placeholder-purple-400::-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.sm\:placeholder-purple-400::placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.sm\:placeholder-purple-500:-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.sm\:placeholder-purple-500::-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.sm\:placeholder-purple-500::placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.sm\:placeholder-purple-600:-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.sm\:placeholder-purple-600::-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.sm\:placeholder-purple-600::placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.sm\:placeholder-purple-700:-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.sm\:placeholder-purple-700::-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.sm\:placeholder-purple-700::placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.sm\:placeholder-purple-800:-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.sm\:placeholder-purple-800::-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.sm\:placeholder-purple-800::placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.sm\:placeholder-purple-900:-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.sm\:placeholder-purple-900::-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.sm\:placeholder-purple-900::placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.sm\:placeholder-pink-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.sm\:placeholder-pink-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.sm\:placeholder-pink-100::placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.sm\:placeholder-pink-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.sm\:placeholder-pink-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.sm\:placeholder-pink-200::placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.sm\:placeholder-pink-300:-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.sm\:placeholder-pink-300::-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.sm\:placeholder-pink-300::placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.sm\:placeholder-pink-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.sm\:placeholder-pink-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.sm\:placeholder-pink-400::placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.sm\:placeholder-pink-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.sm\:placeholder-pink-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.sm\:placeholder-pink-500::placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.sm\:placeholder-pink-600:-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.sm\:placeholder-pink-600::-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.sm\:placeholder-pink-600::placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.sm\:placeholder-pink-700:-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.sm\:placeholder-pink-700::-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.sm\:placeholder-pink-700::placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.sm\:placeholder-pink-800:-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.sm\:placeholder-pink-800::-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.sm\:placeholder-pink-800::placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.sm\:placeholder-pink-900:-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.sm\:placeholder-pink-900::-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.sm\:placeholder-pink-900::placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.sm\:focus\:placeholder-transparent:focus:-ms-input-placeholder{color:transparent}.sm\:focus\:placeholder-transparent:focus::-ms-input-placeholder{color:transparent}.sm\:focus\:placeholder-transparent:focus::placeholder{color:transparent}.sm\:focus\:placeholder-current:focus:-ms-input-placeholder{color:currentColor}.sm\:focus\:placeholder-current:focus::-ms-input-placeholder{color:currentColor}.sm\:focus\:placeholder-current:focus::placeholder{color:currentColor}.sm\:focus\:placeholder-black:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.sm\:focus\:placeholder-black:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.sm\:focus\:placeholder-black:focus::placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.sm\:focus\:placeholder-white:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-white:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-white:focus::placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-100:focus::placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-200:focus::placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-300:focus::placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-400:focus::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-500:focus::placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-600:focus::placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-700:focus::placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-800:focus::placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-900:focus::placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-100:focus::placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-200:focus::placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-300:focus::placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-400:focus::placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-500:focus::placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-600:focus::placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-700:focus::placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-800:focus::placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-900:focus::placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-100:focus::placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-200:focus::placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-300:focus::placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-400:focus::placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-500:focus::placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-600:focus::placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-700:focus::placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-800:focus::placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-900:focus::placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-100:focus::placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-200:focus::placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-300:focus::placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-400:focus::placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-500:focus::placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-600:focus::placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-700:focus::placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-800:focus::placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-900:focus::placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-100:focus::placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-200:focus::placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-300:focus::placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-400:focus::placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-500:focus::placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-600:focus::placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-700:focus::placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-800:focus::placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-900:focus::placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-100:focus::placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-200:focus::placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-300:focus::placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-400:focus::placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-500:focus::placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-600:focus::placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-700:focus::placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-800:focus::placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-900:focus::placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-100:focus::placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-200:focus::placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-300:focus::placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-400:focus::placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-500:focus::placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-600:focus::placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-700:focus::placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-800:focus::placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-900:focus::placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-100:focus::placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-200:focus::placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-300:focus::placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-400:focus::placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-500:focus::placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-600:focus::placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-700:focus::placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-800:focus::placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-900:focus::placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-100:focus::placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-200:focus::placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-300:focus::placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-400:focus::placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-500:focus::placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-600:focus::placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-700:focus::placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-800:focus::placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-900:focus::placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-100:focus::placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-200:focus::placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-300:focus::placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-400:focus::placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-500:focus::placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-600:focus::placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-700:focus::placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-800:focus::placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-900:focus::placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.sm\:placeholder-opacity-0:-ms-input-placeholder{--placeholder-opacity:0}.sm\:placeholder-opacity-0::-ms-input-placeholder{--placeholder-opacity:0}.sm\:placeholder-opacity-0::placeholder{--placeholder-opacity:0}.sm\:placeholder-opacity-25:-ms-input-placeholder{--placeholder-opacity:0.25}.sm\:placeholder-opacity-25::-ms-input-placeholder{--placeholder-opacity:0.25}.sm\:placeholder-opacity-25::placeholder{--placeholder-opacity:0.25}.sm\:placeholder-opacity-50:-ms-input-placeholder{--placeholder-opacity:0.5}.sm\:placeholder-opacity-50::-ms-input-placeholder{--placeholder-opacity:0.5}.sm\:placeholder-opacity-50::placeholder{--placeholder-opacity:0.5}.sm\:placeholder-opacity-75:-ms-input-placeholder{--placeholder-opacity:0.75}.sm\:placeholder-opacity-75::-ms-input-placeholder{--placeholder-opacity:0.75}.sm\:placeholder-opacity-75::placeholder{--placeholder-opacity:0.75}.sm\:placeholder-opacity-100:-ms-input-placeholder{--placeholder-opacity:1}.sm\:placeholder-opacity-100::-ms-input-placeholder{--placeholder-opacity:1}.sm\:placeholder-opacity-100::placeholder{--placeholder-opacity:1}.sm\:focus\:placeholder-opacity-0:focus:-ms-input-placeholder{--placeholder-opacity:0}.sm\:focus\:placeholder-opacity-0:focus::-ms-input-placeholder{--placeholder-opacity:0}.sm\:focus\:placeholder-opacity-0:focus::placeholder{--placeholder-opacity:0}.sm\:focus\:placeholder-opacity-25:focus:-ms-input-placeholder{--placeholder-opacity:0.25}.sm\:focus\:placeholder-opacity-25:focus::-ms-input-placeholder{--placeholder-opacity:0.25}.sm\:focus\:placeholder-opacity-25:focus::placeholder{--placeholder-opacity:0.25}.sm\:focus\:placeholder-opacity-50:focus:-ms-input-placeholder{--placeholder-opacity:0.5}.sm\:focus\:placeholder-opacity-50:focus::-ms-input-placeholder{--placeholder-opacity:0.5}.sm\:focus\:placeholder-opacity-50:focus::placeholder{--placeholder-opacity:0.5}.sm\:focus\:placeholder-opacity-75:focus:-ms-input-placeholder{--placeholder-opacity:0.75}.sm\:focus\:placeholder-opacity-75:focus::-ms-input-placeholder{--placeholder-opacity:0.75}.sm\:focus\:placeholder-opacity-75:focus::placeholder{--placeholder-opacity:0.75}.sm\:focus\:placeholder-opacity-100:focus:-ms-input-placeholder{--placeholder-opacity:1}.sm\:focus\:placeholder-opacity-100:focus::-ms-input-placeholder{--placeholder-opacity:1}.sm\:focus\:placeholder-opacity-100:focus::placeholder{--placeholder-opacity:1}.sm\:pointer-events-none{pointer-events:none}.sm\:pointer-events-auto{pointer-events:auto}.sm\:static{position:static}.sm\:fixed{position:fixed}.sm\:absolute{position:absolute}.sm\:relative{position:relative}.sm\:sticky{position:-webkit-sticky;position:sticky}.sm\:inset-0{top:0;right:0;bottom:0;left:0}.sm\:inset-auto{top:auto;right:auto;bottom:auto;left:auto}.sm\:inset-y-0{top:0;bottom:0}.sm\:inset-x-0{right:0;left:0}.sm\:inset-y-auto{top:auto;bottom:auto}.sm\:inset-x-auto{right:auto;left:auto}.sm\:top-0{top:0}.sm\:right-0{right:0}.sm\:bottom-0{bottom:0}.sm\:left-0{left:0}.sm\:top-auto{top:auto}.sm\:right-auto{right:auto}.sm\:bottom-auto{bottom:auto}.sm\:left-auto{left:auto}.sm\:resize-none{resize:none}.sm\:resize-y{resize:vertical}.sm\:resize-x{resize:horizontal}.sm\:resize{resize:both}.sm\:shadow-xs{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.sm\:shadow-sm{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.sm\:shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.sm\:shadow-md{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.sm\:shadow-lg{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.sm\:shadow-xl{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.sm\:shadow-2xl{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.sm\:shadow-inner{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.sm\:shadow-outline{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.sm\:shadow-none{box-shadow:none}.sm\:hover\:shadow-xs:hover{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.sm\:hover\:shadow-sm:hover{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.sm\:hover\:shadow:hover{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.sm\:hover\:shadow-md:hover{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.sm\:hover\:shadow-lg:hover{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.sm\:hover\:shadow-xl:hover{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.sm\:hover\:shadow-2xl:hover{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.sm\:hover\:shadow-inner:hover{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.sm\:hover\:shadow-outline:hover{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.sm\:hover\:shadow-none:hover{box-shadow:none}.sm\:focus\:shadow-xs:focus{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.sm\:focus\:shadow-sm:focus{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.sm\:focus\:shadow:focus{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.sm\:focus\:shadow-md:focus{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.sm\:focus\:shadow-lg:focus{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.sm\:focus\:shadow-xl:focus{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.sm\:focus\:shadow-2xl:focus{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.sm\:focus\:shadow-inner:focus{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.sm\:focus\:shadow-outline:focus{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.sm\:focus\:shadow-none:focus{box-shadow:none}.sm\:fill-current{fill:currentColor}.sm\:stroke-current{stroke:currentColor}.sm\:stroke-0{stroke-width:0}.sm\:stroke-1{stroke-width:1}.sm\:stroke-2{stroke-width:2}.sm\:table-auto{table-layout:auto}.sm\:table-fixed{table-layout:fixed}.sm\:text-left{text-align:left}.sm\:text-center{text-align:center}.sm\:text-right{text-align:right}.sm\:text-justify{text-align:justify}.sm\:text-transparent{color:transparent}.sm\:text-current{color:currentColor}.sm\:text-black{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.sm\:text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.sm\:text-gray-100{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.sm\:text-gray-200{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.sm\:text-gray-300{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.sm\:text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.sm\:text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.sm\:text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.sm\:text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.sm\:text-gray-800{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.sm\:text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.sm\:text-red-100{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.sm\:text-red-200{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.sm\:text-red-300{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.sm\:text-red-400{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.sm\:text-red-500{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.sm\:text-red-600{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.sm\:text-red-700{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.sm\:text-red-800{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.sm\:text-red-900{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.sm\:text-orange-100{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.sm\:text-orange-200{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.sm\:text-orange-300{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.sm\:text-orange-400{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.sm\:text-orange-500{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.sm\:text-orange-600{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.sm\:text-orange-700{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.sm\:text-orange-800{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.sm\:text-orange-900{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.sm\:text-yellow-100{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.sm\:text-yellow-200{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.sm\:text-yellow-300{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.sm\:text-yellow-400{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.sm\:text-yellow-500{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.sm\:text-yellow-600{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.sm\:text-yellow-700{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.sm\:text-yellow-800{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.sm\:text-yellow-900{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.sm\:text-green-100{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.sm\:text-green-200{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.sm\:text-green-300{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.sm\:text-green-400{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.sm\:text-green-500{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.sm\:text-green-600{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.sm\:text-green-700{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.sm\:text-green-800{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.sm\:text-green-900{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.sm\:text-teal-100{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.sm\:text-teal-200{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.sm\:text-teal-300{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.sm\:text-teal-400{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.sm\:text-teal-500{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.sm\:text-teal-600{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.sm\:text-teal-700{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.sm\:text-teal-800{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.sm\:text-teal-900{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.sm\:text-blue-100{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.sm\:text-blue-200{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.sm\:text-blue-300{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.sm\:text-blue-400{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.sm\:text-blue-500{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.sm\:text-blue-600{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.sm\:text-blue-700{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.sm\:text-blue-800{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.sm\:text-blue-900{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.sm\:text-indigo-100{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.sm\:text-indigo-200{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.sm\:text-indigo-300{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.sm\:text-indigo-400{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.sm\:text-indigo-500{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.sm\:text-indigo-600{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.sm\:text-indigo-700{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.sm\:text-indigo-800{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.sm\:text-indigo-900{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.sm\:text-purple-100{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.sm\:text-purple-200{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.sm\:text-purple-300{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.sm\:text-purple-400{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.sm\:text-purple-500{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.sm\:text-purple-600{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.sm\:text-purple-700{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.sm\:text-purple-800{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.sm\:text-purple-900{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.sm\:text-pink-100{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.sm\:text-pink-200{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.sm\:text-pink-300{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.sm\:text-pink-400{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.sm\:text-pink-500{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.sm\:text-pink-600{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.sm\:text-pink-700{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.sm\:text-pink-800{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.sm\:text-pink-900{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.sm\:hover\:text-transparent:hover{color:transparent}.sm\:hover\:text-current:hover{color:currentColor}.sm\:hover\:text-black:hover{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.sm\:hover\:text-white:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.sm\:hover\:text-gray-100:hover{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.sm\:hover\:text-gray-200:hover{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.sm\:hover\:text-gray-300:hover{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.sm\:hover\:text-gray-400:hover{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.sm\:hover\:text-gray-500:hover{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.sm\:hover\:text-gray-600:hover{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.sm\:hover\:text-gray-700:hover{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.sm\:hover\:text-gray-800:hover{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.sm\:hover\:text-gray-900:hover{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.sm\:hover\:text-red-100:hover{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.sm\:hover\:text-red-200:hover{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.sm\:hover\:text-red-300:hover{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.sm\:hover\:text-red-400:hover{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.sm\:hover\:text-red-500:hover{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.sm\:hover\:text-red-600:hover{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.sm\:hover\:text-red-700:hover{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.sm\:hover\:text-red-800:hover{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.sm\:hover\:text-red-900:hover{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.sm\:hover\:text-orange-100:hover{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.sm\:hover\:text-orange-200:hover{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.sm\:hover\:text-orange-300:hover{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.sm\:hover\:text-orange-400:hover{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.sm\:hover\:text-orange-500:hover{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.sm\:hover\:text-orange-600:hover{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.sm\:hover\:text-orange-700:hover{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.sm\:hover\:text-orange-800:hover{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.sm\:hover\:text-orange-900:hover{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.sm\:hover\:text-yellow-100:hover{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.sm\:hover\:text-yellow-200:hover{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.sm\:hover\:text-yellow-300:hover{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.sm\:hover\:text-yellow-400:hover{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.sm\:hover\:text-yellow-500:hover{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.sm\:hover\:text-yellow-600:hover{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.sm\:hover\:text-yellow-700:hover{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.sm\:hover\:text-yellow-800:hover{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.sm\:hover\:text-yellow-900:hover{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.sm\:hover\:text-green-100:hover{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.sm\:hover\:text-green-200:hover{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.sm\:hover\:text-green-300:hover{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.sm\:hover\:text-green-400:hover{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.sm\:hover\:text-green-500:hover{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.sm\:hover\:text-green-600:hover{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.sm\:hover\:text-green-700:hover{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.sm\:hover\:text-green-800:hover{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.sm\:hover\:text-green-900:hover{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.sm\:hover\:text-teal-100:hover{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.sm\:hover\:text-teal-200:hover{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.sm\:hover\:text-teal-300:hover{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.sm\:hover\:text-teal-400:hover{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.sm\:hover\:text-teal-500:hover{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.sm\:hover\:text-teal-600:hover{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.sm\:hover\:text-teal-700:hover{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.sm\:hover\:text-teal-800:hover{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.sm\:hover\:text-teal-900:hover{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.sm\:hover\:text-blue-100:hover{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.sm\:hover\:text-blue-200:hover{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.sm\:hover\:text-blue-300:hover{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.sm\:hover\:text-blue-400:hover{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.sm\:hover\:text-blue-500:hover{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.sm\:hover\:text-blue-600:hover{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.sm\:hover\:text-blue-700:hover{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.sm\:hover\:text-blue-800:hover{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.sm\:hover\:text-blue-900:hover{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.sm\:hover\:text-indigo-100:hover{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.sm\:hover\:text-indigo-200:hover{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.sm\:hover\:text-indigo-300:hover{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.sm\:hover\:text-indigo-400:hover{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.sm\:hover\:text-indigo-500:hover{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.sm\:hover\:text-indigo-600:hover{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.sm\:hover\:text-indigo-700:hover{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.sm\:hover\:text-indigo-800:hover{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.sm\:hover\:text-indigo-900:hover{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.sm\:hover\:text-purple-100:hover{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.sm\:hover\:text-purple-200:hover{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.sm\:hover\:text-purple-300:hover{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.sm\:hover\:text-purple-400:hover{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.sm\:hover\:text-purple-500:hover{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.sm\:hover\:text-purple-600:hover{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.sm\:hover\:text-purple-700:hover{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.sm\:hover\:text-purple-800:hover{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.sm\:hover\:text-purple-900:hover{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.sm\:hover\:text-pink-100:hover{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.sm\:hover\:text-pink-200:hover{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.sm\:hover\:text-pink-300:hover{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.sm\:hover\:text-pink-400:hover{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.sm\:hover\:text-pink-500:hover{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.sm\:hover\:text-pink-600:hover{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.sm\:hover\:text-pink-700:hover{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.sm\:hover\:text-pink-800:hover{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.sm\:hover\:text-pink-900:hover{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.sm\:focus\:text-transparent:focus{color:transparent}.sm\:focus\:text-current:focus{color:currentColor}.sm\:focus\:text-black:focus{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.sm\:focus\:text-white:focus{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.sm\:focus\:text-gray-100:focus{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.sm\:focus\:text-gray-200:focus{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.sm\:focus\:text-gray-300:focus{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.sm\:focus\:text-gray-400:focus{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.sm\:focus\:text-gray-500:focus{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.sm\:focus\:text-gray-600:focus{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.sm\:focus\:text-gray-700:focus{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.sm\:focus\:text-gray-800:focus{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.sm\:focus\:text-gray-900:focus{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.sm\:focus\:text-red-100:focus{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.sm\:focus\:text-red-200:focus{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.sm\:focus\:text-red-300:focus{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.sm\:focus\:text-red-400:focus{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.sm\:focus\:text-red-500:focus{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.sm\:focus\:text-red-600:focus{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.sm\:focus\:text-red-700:focus{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.sm\:focus\:text-red-800:focus{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.sm\:focus\:text-red-900:focus{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.sm\:focus\:text-orange-100:focus{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.sm\:focus\:text-orange-200:focus{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.sm\:focus\:text-orange-300:focus{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.sm\:focus\:text-orange-400:focus{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.sm\:focus\:text-orange-500:focus{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.sm\:focus\:text-orange-600:focus{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.sm\:focus\:text-orange-700:focus{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.sm\:focus\:text-orange-800:focus{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.sm\:focus\:text-orange-900:focus{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.sm\:focus\:text-yellow-100:focus{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.sm\:focus\:text-yellow-200:focus{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.sm\:focus\:text-yellow-300:focus{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.sm\:focus\:text-yellow-400:focus{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.sm\:focus\:text-yellow-500:focus{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.sm\:focus\:text-yellow-600:focus{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.sm\:focus\:text-yellow-700:focus{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.sm\:focus\:text-yellow-800:focus{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.sm\:focus\:text-yellow-900:focus{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.sm\:focus\:text-green-100:focus{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.sm\:focus\:text-green-200:focus{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.sm\:focus\:text-green-300:focus{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.sm\:focus\:text-green-400:focus{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.sm\:focus\:text-green-500:focus{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.sm\:focus\:text-green-600:focus{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.sm\:focus\:text-green-700:focus{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.sm\:focus\:text-green-800:focus{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.sm\:focus\:text-green-900:focus{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.sm\:focus\:text-teal-100:focus{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.sm\:focus\:text-teal-200:focus{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.sm\:focus\:text-teal-300:focus{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.sm\:focus\:text-teal-400:focus{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.sm\:focus\:text-teal-500:focus{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.sm\:focus\:text-teal-600:focus{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.sm\:focus\:text-teal-700:focus{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.sm\:focus\:text-teal-800:focus{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.sm\:focus\:text-teal-900:focus{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.sm\:focus\:text-blue-100:focus{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.sm\:focus\:text-blue-200:focus{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.sm\:focus\:text-blue-300:focus{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.sm\:focus\:text-blue-400:focus{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.sm\:focus\:text-blue-500:focus{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.sm\:focus\:text-blue-600:focus{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.sm\:focus\:text-blue-700:focus{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.sm\:focus\:text-blue-800:focus{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.sm\:focus\:text-blue-900:focus{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.sm\:focus\:text-indigo-100:focus{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.sm\:focus\:text-indigo-200:focus{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.sm\:focus\:text-indigo-300:focus{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.sm\:focus\:text-indigo-400:focus{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.sm\:focus\:text-indigo-500:focus{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.sm\:focus\:text-indigo-600:focus{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.sm\:focus\:text-indigo-700:focus{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.sm\:focus\:text-indigo-800:focus{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.sm\:focus\:text-indigo-900:focus{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.sm\:focus\:text-purple-100:focus{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.sm\:focus\:text-purple-200:focus{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.sm\:focus\:text-purple-300:focus{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.sm\:focus\:text-purple-400:focus{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.sm\:focus\:text-purple-500:focus{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.sm\:focus\:text-purple-600:focus{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.sm\:focus\:text-purple-700:focus{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.sm\:focus\:text-purple-800:focus{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.sm\:focus\:text-purple-900:focus{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.sm\:focus\:text-pink-100:focus{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.sm\:focus\:text-pink-200:focus{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.sm\:focus\:text-pink-300:focus{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.sm\:focus\:text-pink-400:focus{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.sm\:focus\:text-pink-500:focus{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.sm\:focus\:text-pink-600:focus{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.sm\:focus\:text-pink-700:focus{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.sm\:focus\:text-pink-800:focus{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.sm\:focus\:text-pink-900:focus{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.sm\:text-opacity-0{--text-opacity:0}.sm\:text-opacity-25{--text-opacity:0.25}.sm\:text-opacity-50{--text-opacity:0.5}.sm\:text-opacity-75{--text-opacity:0.75}.sm\:text-opacity-100{--text-opacity:1}.sm\:hover\:text-opacity-0:hover{--text-opacity:0}.sm\:hover\:text-opacity-25:hover{--text-opacity:0.25}.sm\:hover\:text-opacity-50:hover{--text-opacity:0.5}.sm\:hover\:text-opacity-75:hover{--text-opacity:0.75}.sm\:hover\:text-opacity-100:hover{--text-opacity:1}.sm\:focus\:text-opacity-0:focus{--text-opacity:0}.sm\:focus\:text-opacity-25:focus{--text-opacity:0.25}.sm\:focus\:text-opacity-50:focus{--text-opacity:0.5}.sm\:focus\:text-opacity-75:focus{--text-opacity:0.75}.sm\:focus\:text-opacity-100:focus{--text-opacity:1}.sm\:italic{font-style:italic}.sm\:not-italic{font-style:normal}.sm\:uppercase{text-transform:uppercase}.sm\:lowercase{text-transform:lowercase}.sm\:capitalize{text-transform:capitalize}.sm\:normal-case{text-transform:none}.sm\:underline{text-decoration:underline}.sm\:line-through{text-decoration:line-through}.sm\:no-underline{text-decoration:none}.sm\:hover\:underline:hover{text-decoration:underline}.sm\:hover\:line-through:hover{text-decoration:line-through}.sm\:hover\:no-underline:hover{text-decoration:none}.sm\:focus\:underline:focus{text-decoration:underline}.sm\:focus\:line-through:focus{text-decoration:line-through}.sm\:focus\:no-underline:focus{text-decoration:none}.sm\:antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.sm\:subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.sm\:diagonal-fractions,.sm\:lining-nums,.sm\:oldstyle-nums,.sm\:ordinal,.sm\:proportional-nums,.sm\:slashed-zero,.sm\:stacked-fractions,.sm\:tabular-nums{--font-variant-numeric-ordinal:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-slashed-zero:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-figure:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-spacing:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-fraction:var(--tailwind-empty, );/*!*//*!*/font-variant-numeric:var(--font-variant-numeric-ordinal) var(--font-variant-numeric-slashed-zero) var(--font-variant-numeric-figure) var(--font-variant-numeric-spacing) var(--font-variant-numeric-fraction)}.sm\:normal-nums{font-variant-numeric:normal}.sm\:ordinal{--font-variant-numeric-ordinal:ordinal}.sm\:slashed-zero{--font-variant-numeric-slashed-zero:slashed-zero}.sm\:lining-nums{--font-variant-numeric-figure:lining-nums}.sm\:oldstyle-nums{--font-variant-numeric-figure:oldstyle-nums}.sm\:proportional-nums{--font-variant-numeric-spacing:proportional-nums}.sm\:tabular-nums{--font-variant-numeric-spacing:tabular-nums}.sm\:diagonal-fractions{--font-variant-numeric-fraction:diagonal-fractions}.sm\:stacked-fractions{--font-variant-numeric-fraction:stacked-fractions}.sm\:tracking-tighter{letter-spacing:-.05em}.sm\:tracking-tight{letter-spacing:-.025em}.sm\:tracking-normal{letter-spacing:0}.sm\:tracking-wide{letter-spacing:.025em}.sm\:tracking-wider{letter-spacing:.05em}.sm\:tracking-widest{letter-spacing:.1em}.sm\:select-none{-webkit-user-select:none;-ms-user-select:none;user-select:none}.sm\:select-text{-webkit-user-select:text;-ms-user-select:text;user-select:text}.sm\:select-all{-webkit-user-select:all;-ms-user-select:all;user-select:all}.sm\:select-auto{-webkit-user-select:auto;-ms-user-select:auto;user-select:auto}.sm\:align-baseline{vertical-align:baseline}.sm\:align-top{vertical-align:top}.sm\:align-middle{vertical-align:middle}.sm\:align-bottom{vertical-align:bottom}.sm\:align-text-top{vertical-align:text-top}.sm\:align-text-bottom{vertical-align:text-bottom}.sm\:visible{visibility:visible}.sm\:invisible{visibility:hidden}.sm\:whitespace-normal{white-space:normal}.sm\:whitespace-no-wrap{white-space:nowrap}.sm\:whitespace-pre{white-space:pre}.sm\:whitespace-pre-line{white-space:pre-line}.sm\:whitespace-pre-wrap{white-space:pre-wrap}.sm\:break-normal{word-wrap:normal;overflow-wrap:normal;word-break:normal}.sm\:break-words{word-wrap:break-word;overflow-wrap:break-word}.sm\:break-all{word-break:break-all}.sm\:truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sm\:w-0{width:0}.sm\:w-1{width:.25rem}.sm\:w-2{width:.5rem}.sm\:w-3{width:.75rem}.sm\:w-4{width:1rem}.sm\:w-5{width:1.25rem}.sm\:w-6{width:1.5rem}.sm\:w-8{width:2rem}.sm\:w-10{width:2.5rem}.sm\:w-12{width:3rem}.sm\:w-16{width:4rem}.sm\:w-20{width:5rem}.sm\:w-24{width:6rem}.sm\:w-32{width:8rem}.sm\:w-40{width:10rem}.sm\:w-48{width:12rem}.sm\:w-56{width:14rem}.sm\:w-64{width:16rem}.sm\:w-auto{width:auto}.sm\:w-px{width:1px}.sm\:w-1\/2{width:50%}.sm\:w-1\/3{width:33.333333%}.sm\:w-2\/3{width:66.666667%}.sm\:w-1\/4{width:25%}.sm\:w-2\/4{width:50%}.sm\:w-3\/4{width:75%}.sm\:w-1\/5{width:20%}.sm\:w-2\/5{width:40%}.sm\:w-3\/5{width:60%}.sm\:w-4\/5{width:80%}.sm\:w-1\/6{width:16.666667%}.sm\:w-2\/6{width:33.333333%}.sm\:w-3\/6{width:50%}.sm\:w-4\/6{width:66.666667%}.sm\:w-5\/6{width:83.333333%}.sm\:w-1\/12{width:8.333333%}.sm\:w-2\/12{width:16.666667%}.sm\:w-3\/12{width:25%}.sm\:w-4\/12{width:33.333333%}.sm\:w-5\/12{width:41.666667%}.sm\:w-6\/12{width:50%}.sm\:w-7\/12{width:58.333333%}.sm\:w-8\/12{width:66.666667%}.sm\:w-9\/12{width:75%}.sm\:w-10\/12{width:83.333333%}.sm\:w-11\/12{width:91.666667%}.sm\:w-full{width:100%}.sm\:w-screen{width:100vw}.sm\:z-0{z-index:0}.sm\:z-10{z-index:10}.sm\:z-20{z-index:20}.sm\:z-30{z-index:30}.sm\:z-40{z-index:40}.sm\:z-50{z-index:50}.sm\:z-auto{z-index:auto}.sm\:gap-0{grid-gap:0;gap:0}.sm\:gap-1{grid-gap:.25rem;gap:.25rem}.sm\:gap-2{grid-gap:.5rem;gap:.5rem}.sm\:gap-3{grid-gap:.75rem;gap:.75rem}.sm\:gap-4{grid-gap:1rem;gap:1rem}.sm\:gap-5{grid-gap:1.25rem;gap:1.25rem}.sm\:gap-6{grid-gap:1.5rem;gap:1.5rem}.sm\:gap-8{grid-gap:2rem;gap:2rem}.sm\:gap-10{grid-gap:2.5rem;gap:2.5rem}.sm\:gap-12{grid-gap:3rem;gap:3rem}.sm\:gap-16{grid-gap:4rem;gap:4rem}.sm\:gap-20{grid-gap:5rem;gap:5rem}.sm\:gap-24{grid-gap:6rem;gap:6rem}.sm\:gap-32{grid-gap:8rem;gap:8rem}.sm\:gap-40{grid-gap:10rem;gap:10rem}.sm\:gap-48{grid-gap:12rem;gap:12rem}.sm\:gap-56{grid-gap:14rem;gap:14rem}.sm\:gap-64{grid-gap:16rem;gap:16rem}.sm\:gap-px{grid-gap:1px;gap:1px}.sm\:col-gap-0{grid-column-gap:0;column-gap:0}.sm\:col-gap-1{grid-column-gap:.25rem;column-gap:.25rem}.sm\:col-gap-2{grid-column-gap:.5rem;column-gap:.5rem}.sm\:col-gap-3{grid-column-gap:.75rem;column-gap:.75rem}.sm\:col-gap-4{grid-column-gap:1rem;column-gap:1rem}.sm\:col-gap-5{grid-column-gap:1.25rem;column-gap:1.25rem}.sm\:col-gap-6{grid-column-gap:1.5rem;column-gap:1.5rem}.sm\:col-gap-8{grid-column-gap:2rem;column-gap:2rem}.sm\:col-gap-10{grid-column-gap:2.5rem;column-gap:2.5rem}.sm\:col-gap-12{grid-column-gap:3rem;column-gap:3rem}.sm\:col-gap-16{grid-column-gap:4rem;column-gap:4rem}.sm\:col-gap-20{grid-column-gap:5rem;column-gap:5rem}.sm\:col-gap-24{grid-column-gap:6rem;column-gap:6rem}.sm\:col-gap-32{grid-column-gap:8rem;column-gap:8rem}.sm\:col-gap-40{grid-column-gap:10rem;column-gap:10rem}.sm\:col-gap-48{grid-column-gap:12rem;column-gap:12rem}.sm\:col-gap-56{grid-column-gap:14rem;column-gap:14rem}.sm\:col-gap-64{grid-column-gap:16rem;column-gap:16rem}.sm\:col-gap-px{grid-column-gap:1px;column-gap:1px}.sm\:gap-x-0{grid-column-gap:0;column-gap:0}.sm\:gap-x-1{grid-column-gap:.25rem;column-gap:.25rem}.sm\:gap-x-2{grid-column-gap:.5rem;column-gap:.5rem}.sm\:gap-x-3{grid-column-gap:.75rem;column-gap:.75rem}.sm\:gap-x-4{grid-column-gap:1rem;column-gap:1rem}.sm\:gap-x-5{grid-column-gap:1.25rem;column-gap:1.25rem}.sm\:gap-x-6{grid-column-gap:1.5rem;column-gap:1.5rem}.sm\:gap-x-8{grid-column-gap:2rem;column-gap:2rem}.sm\:gap-x-10{grid-column-gap:2.5rem;column-gap:2.5rem}.sm\:gap-x-12{grid-column-gap:3rem;column-gap:3rem}.sm\:gap-x-16{grid-column-gap:4rem;column-gap:4rem}.sm\:gap-x-20{grid-column-gap:5rem;column-gap:5rem}.sm\:gap-x-24{grid-column-gap:6rem;column-gap:6rem}.sm\:gap-x-32{grid-column-gap:8rem;column-gap:8rem}.sm\:gap-x-40{grid-column-gap:10rem;column-gap:10rem}.sm\:gap-x-48{grid-column-gap:12rem;column-gap:12rem}.sm\:gap-x-56{grid-column-gap:14rem;column-gap:14rem}.sm\:gap-x-64{grid-column-gap:16rem;column-gap:16rem}.sm\:gap-x-px{grid-column-gap:1px;column-gap:1px}.sm\:row-gap-0{grid-row-gap:0;row-gap:0}.sm\:row-gap-1{grid-row-gap:.25rem;row-gap:.25rem}.sm\:row-gap-2{grid-row-gap:.5rem;row-gap:.5rem}.sm\:row-gap-3{grid-row-gap:.75rem;row-gap:.75rem}.sm\:row-gap-4{grid-row-gap:1rem;row-gap:1rem}.sm\:row-gap-5{grid-row-gap:1.25rem;row-gap:1.25rem}.sm\:row-gap-6{grid-row-gap:1.5rem;row-gap:1.5rem}.sm\:row-gap-8{grid-row-gap:2rem;row-gap:2rem}.sm\:row-gap-10{grid-row-gap:2.5rem;row-gap:2.5rem}.sm\:row-gap-12{grid-row-gap:3rem;row-gap:3rem}.sm\:row-gap-16{grid-row-gap:4rem;row-gap:4rem}.sm\:row-gap-20{grid-row-gap:5rem;row-gap:5rem}.sm\:row-gap-24{grid-row-gap:6rem;row-gap:6rem}.sm\:row-gap-32{grid-row-gap:8rem;row-gap:8rem}.sm\:row-gap-40{grid-row-gap:10rem;row-gap:10rem}.sm\:row-gap-48{grid-row-gap:12rem;row-gap:12rem}.sm\:row-gap-56{grid-row-gap:14rem;row-gap:14rem}.sm\:row-gap-64{grid-row-gap:16rem;row-gap:16rem}.sm\:row-gap-px{grid-row-gap:1px;row-gap:1px}.sm\:gap-y-0{grid-row-gap:0;row-gap:0}.sm\:gap-y-1{grid-row-gap:.25rem;row-gap:.25rem}.sm\:gap-y-2{grid-row-gap:.5rem;row-gap:.5rem}.sm\:gap-y-3{grid-row-gap:.75rem;row-gap:.75rem}.sm\:gap-y-4{grid-row-gap:1rem;row-gap:1rem}.sm\:gap-y-5{grid-row-gap:1.25rem;row-gap:1.25rem}.sm\:gap-y-6{grid-row-gap:1.5rem;row-gap:1.5rem}.sm\:gap-y-8{grid-row-gap:2rem;row-gap:2rem}.sm\:gap-y-10{grid-row-gap:2.5rem;row-gap:2.5rem}.sm\:gap-y-12{grid-row-gap:3rem;row-gap:3rem}.sm\:gap-y-16{grid-row-gap:4rem;row-gap:4rem}.sm\:gap-y-20{grid-row-gap:5rem;row-gap:5rem}.sm\:gap-y-24{grid-row-gap:6rem;row-gap:6rem}.sm\:gap-y-32{grid-row-gap:8rem;row-gap:8rem}.sm\:gap-y-40{grid-row-gap:10rem;row-gap:10rem}.sm\:gap-y-48{grid-row-gap:12rem;row-gap:12rem}.sm\:gap-y-56{grid-row-gap:14rem;row-gap:14rem}.sm\:gap-y-64{grid-row-gap:16rem;row-gap:16rem}.sm\:gap-y-px{grid-row-gap:1px;row-gap:1px}.sm\:grid-flow-row{grid-auto-flow:row}.sm\:grid-flow-col{grid-auto-flow:column}.sm\:grid-flow-row-dense{grid-auto-flow:row dense}.sm\:grid-flow-col-dense{grid-auto-flow:column dense}.sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.sm\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.sm\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.sm\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.sm\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.sm\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.sm\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.sm\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.sm\:grid-cols-none{grid-template-columns:none}.sm\:auto-cols-auto{grid-auto-columns:auto}.sm\:auto-cols-min{grid-auto-columns:-webkit-min-content;grid-auto-columns:min-content}.sm\:auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.sm\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.sm\:col-auto{grid-column:auto}.sm\:col-span-1{grid-column:span 1/span 1}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:col-span-3{grid-column:span 3/span 3}.sm\:col-span-4{grid-column:span 4/span 4}.sm\:col-span-5{grid-column:span 5/span 5}.sm\:col-span-6{grid-column:span 6/span 6}.sm\:col-span-7{grid-column:span 7/span 7}.sm\:col-span-8{grid-column:span 8/span 8}.sm\:col-span-9{grid-column:span 9/span 9}.sm\:col-span-10{grid-column:span 10/span 10}.sm\:col-span-11{grid-column:span 11/span 11}.sm\:col-span-12{grid-column:span 12/span 12}.sm\:col-span-full{grid-column:1/-1}.sm\:col-start-1{grid-column-start:1}.sm\:col-start-2{grid-column-start:2}.sm\:col-start-3{grid-column-start:3}.sm\:col-start-4{grid-column-start:4}.sm\:col-start-5{grid-column-start:5}.sm\:col-start-6{grid-column-start:6}.sm\:col-start-7{grid-column-start:7}.sm\:col-start-8{grid-column-start:8}.sm\:col-start-9{grid-column-start:9}.sm\:col-start-10{grid-column-start:10}.sm\:col-start-11{grid-column-start:11}.sm\:col-start-12{grid-column-start:12}.sm\:col-start-13{grid-column-start:13}.sm\:col-start-auto{grid-column-start:auto}.sm\:col-end-1{grid-column-end:1}.sm\:col-end-2{grid-column-end:2}.sm\:col-end-3{grid-column-end:3}.sm\:col-end-4{grid-column-end:4}.sm\:col-end-5{grid-column-end:5}.sm\:col-end-6{grid-column-end:6}.sm\:col-end-7{grid-column-end:7}.sm\:col-end-8{grid-column-end:8}.sm\:col-end-9{grid-column-end:9}.sm\:col-end-10{grid-column-end:10}.sm\:col-end-11{grid-column-end:11}.sm\:col-end-12{grid-column-end:12}.sm\:col-end-13{grid-column-end:13}.sm\:col-end-auto{grid-column-end:auto}.sm\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.sm\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.sm\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.sm\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.sm\:grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.sm\:grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.sm\:grid-rows-none{grid-template-rows:none}.sm\:auto-rows-auto{grid-auto-rows:auto}.sm\:auto-rows-min{grid-auto-rows:-webkit-min-content;grid-auto-rows:min-content}.sm\:auto-rows-max{grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}.sm\:auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.sm\:row-auto{grid-row:auto}.sm\:row-span-1{grid-row:span 1/span 1}.sm\:row-span-2{grid-row:span 2/span 2}.sm\:row-span-3{grid-row:span 3/span 3}.sm\:row-span-4{grid-row:span 4/span 4}.sm\:row-span-5{grid-row:span 5/span 5}.sm\:row-span-6{grid-row:span 6/span 6}.sm\:row-span-full{grid-row:1/-1}.sm\:row-start-1{grid-row-start:1}.sm\:row-start-2{grid-row-start:2}.sm\:row-start-3{grid-row-start:3}.sm\:row-start-4{grid-row-start:4}.sm\:row-start-5{grid-row-start:5}.sm\:row-start-6{grid-row-start:6}.sm\:row-start-7{grid-row-start:7}.sm\:row-start-auto{grid-row-start:auto}.sm\:row-end-1{grid-row-end:1}.sm\:row-end-2{grid-row-end:2}.sm\:row-end-3{grid-row-end:3}.sm\:row-end-4{grid-row-end:4}.sm\:row-end-5{grid-row-end:5}.sm\:row-end-6{grid-row-end:6}.sm\:row-end-7{grid-row-end:7}.sm\:row-end-auto{grid-row-end:auto}.sm\:transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.sm\:transform-none{transform:none}.sm\:origin-center{transform-origin:center}.sm\:origin-top{transform-origin:top}.sm\:origin-top-right{transform-origin:top right}.sm\:origin-right{transform-origin:right}.sm\:origin-bottom-right{transform-origin:bottom right}.sm\:origin-bottom{transform-origin:bottom}.sm\:origin-bottom-left{transform-origin:bottom left}.sm\:origin-left{transform-origin:left}.sm\:origin-top-left{transform-origin:top left}.sm\:scale-0{--transform-scale-x:0;--transform-scale-y:0}.sm\:scale-50{--transform-scale-x:.5;--transform-scale-y:.5}.sm\:scale-75{--transform-scale-x:.75;--transform-scale-y:.75}.sm\:scale-90{--transform-scale-x:.9;--transform-scale-y:.9}.sm\:scale-95{--transform-scale-x:.95;--transform-scale-y:.95}.sm\:scale-100{--transform-scale-x:1;--transform-scale-y:1}.sm\:scale-105{--transform-scale-x:1.05;--transform-scale-y:1.05}.sm\:scale-110{--transform-scale-x:1.1;--transform-scale-y:1.1}.sm\:scale-125{--transform-scale-x:1.25;--transform-scale-y:1.25}.sm\:scale-150{--transform-scale-x:1.5;--transform-scale-y:1.5}.sm\:scale-x-0{--transform-scale-x:0}.sm\:scale-x-50{--transform-scale-x:.5}.sm\:scale-x-75{--transform-scale-x:.75}.sm\:scale-x-90{--transform-scale-x:.9}.sm\:scale-x-95{--transform-scale-x:.95}.sm\:scale-x-100{--transform-scale-x:1}.sm\:scale-x-105{--transform-scale-x:1.05}.sm\:scale-x-110{--transform-scale-x:1.1}.sm\:scale-x-125{--transform-scale-x:1.25}.sm\:scale-x-150{--transform-scale-x:1.5}.sm\:scale-y-0{--transform-scale-y:0}.sm\:scale-y-50{--transform-scale-y:.5}.sm\:scale-y-75{--transform-scale-y:.75}.sm\:scale-y-90{--transform-scale-y:.9}.sm\:scale-y-95{--transform-scale-y:.95}.sm\:scale-y-100{--transform-scale-y:1}.sm\:scale-y-105{--transform-scale-y:1.05}.sm\:scale-y-110{--transform-scale-y:1.1}.sm\:scale-y-125{--transform-scale-y:1.25}.sm\:scale-y-150{--transform-scale-y:1.5}.sm\:hover\:scale-0:hover{--transform-scale-x:0;--transform-scale-y:0}.sm\:hover\:scale-50:hover{--transform-scale-x:.5;--transform-scale-y:.5}.sm\:hover\:scale-75:hover{--transform-scale-x:.75;--transform-scale-y:.75}.sm\:hover\:scale-90:hover{--transform-scale-x:.9;--transform-scale-y:.9}.sm\:hover\:scale-95:hover{--transform-scale-x:.95;--transform-scale-y:.95}.sm\:hover\:scale-100:hover{--transform-scale-x:1;--transform-scale-y:1}.sm\:hover\:scale-105:hover{--transform-scale-x:1.05;--transform-scale-y:1.05}.sm\:hover\:scale-110:hover{--transform-scale-x:1.1;--transform-scale-y:1.1}.sm\:hover\:scale-125:hover{--transform-scale-x:1.25;--transform-scale-y:1.25}.sm\:hover\:scale-150:hover{--transform-scale-x:1.5;--transform-scale-y:1.5}.sm\:hover\:scale-x-0:hover{--transform-scale-x:0}.sm\:hover\:scale-x-50:hover{--transform-scale-x:.5}.sm\:hover\:scale-x-75:hover{--transform-scale-x:.75}.sm\:hover\:scale-x-90:hover{--transform-scale-x:.9}.sm\:hover\:scale-x-95:hover{--transform-scale-x:.95}.sm\:hover\:scale-x-100:hover{--transform-scale-x:1}.sm\:hover\:scale-x-105:hover{--transform-scale-x:1.05}.sm\:hover\:scale-x-110:hover{--transform-scale-x:1.1}.sm\:hover\:scale-x-125:hover{--transform-scale-x:1.25}.sm\:hover\:scale-x-150:hover{--transform-scale-x:1.5}.sm\:hover\:scale-y-0:hover{--transform-scale-y:0}.sm\:hover\:scale-y-50:hover{--transform-scale-y:.5}.sm\:hover\:scale-y-75:hover{--transform-scale-y:.75}.sm\:hover\:scale-y-90:hover{--transform-scale-y:.9}.sm\:hover\:scale-y-95:hover{--transform-scale-y:.95}.sm\:hover\:scale-y-100:hover{--transform-scale-y:1}.sm\:hover\:scale-y-105:hover{--transform-scale-y:1.05}.sm\:hover\:scale-y-110:hover{--transform-scale-y:1.1}.sm\:hover\:scale-y-125:hover{--transform-scale-y:1.25}.sm\:hover\:scale-y-150:hover{--transform-scale-y:1.5}.sm\:focus\:scale-0:focus{--transform-scale-x:0;--transform-scale-y:0}.sm\:focus\:scale-50:focus{--transform-scale-x:.5;--transform-scale-y:.5}.sm\:focus\:scale-75:focus{--transform-scale-x:.75;--transform-scale-y:.75}.sm\:focus\:scale-90:focus{--transform-scale-x:.9;--transform-scale-y:.9}.sm\:focus\:scale-95:focus{--transform-scale-x:.95;--transform-scale-y:.95}.sm\:focus\:scale-100:focus{--transform-scale-x:1;--transform-scale-y:1}.sm\:focus\:scale-105:focus{--transform-scale-x:1.05;--transform-scale-y:1.05}.sm\:focus\:scale-110:focus{--transform-scale-x:1.1;--transform-scale-y:1.1}.sm\:focus\:scale-125:focus{--transform-scale-x:1.25;--transform-scale-y:1.25}.sm\:focus\:scale-150:focus{--transform-scale-x:1.5;--transform-scale-y:1.5}.sm\:focus\:scale-x-0:focus{--transform-scale-x:0}.sm\:focus\:scale-x-50:focus{--transform-scale-x:.5}.sm\:focus\:scale-x-75:focus{--transform-scale-x:.75}.sm\:focus\:scale-x-90:focus{--transform-scale-x:.9}.sm\:focus\:scale-x-95:focus{--transform-scale-x:.95}.sm\:focus\:scale-x-100:focus{--transform-scale-x:1}.sm\:focus\:scale-x-105:focus{--transform-scale-x:1.05}.sm\:focus\:scale-x-110:focus{--transform-scale-x:1.1}.sm\:focus\:scale-x-125:focus{--transform-scale-x:1.25}.sm\:focus\:scale-x-150:focus{--transform-scale-x:1.5}.sm\:focus\:scale-y-0:focus{--transform-scale-y:0}.sm\:focus\:scale-y-50:focus{--transform-scale-y:.5}.sm\:focus\:scale-y-75:focus{--transform-scale-y:.75}.sm\:focus\:scale-y-90:focus{--transform-scale-y:.9}.sm\:focus\:scale-y-95:focus{--transform-scale-y:.95}.sm\:focus\:scale-y-100:focus{--transform-scale-y:1}.sm\:focus\:scale-y-105:focus{--transform-scale-y:1.05}.sm\:focus\:scale-y-110:focus{--transform-scale-y:1.1}.sm\:focus\:scale-y-125:focus{--transform-scale-y:1.25}.sm\:focus\:scale-y-150:focus{--transform-scale-y:1.5}.sm\:rotate-0{--transform-rotate:0}.sm\:rotate-1{--transform-rotate:1deg}.sm\:rotate-2{--transform-rotate:2deg}.sm\:rotate-3{--transform-rotate:3deg}.sm\:rotate-6{--transform-rotate:6deg}.sm\:rotate-12{--transform-rotate:12deg}.sm\:rotate-45{--transform-rotate:45deg}.sm\:rotate-90{--transform-rotate:90deg}.sm\:rotate-180{--transform-rotate:180deg}.sm\:-rotate-180{--transform-rotate:-180deg}.sm\:-rotate-90{--transform-rotate:-90deg}.sm\:-rotate-45{--transform-rotate:-45deg}.sm\:-rotate-12{--transform-rotate:-12deg}.sm\:-rotate-6{--transform-rotate:-6deg}.sm\:-rotate-3{--transform-rotate:-3deg}.sm\:-rotate-2{--transform-rotate:-2deg}.sm\:-rotate-1{--transform-rotate:-1deg}.sm\:hover\:rotate-0:hover{--transform-rotate:0}.sm\:hover\:rotate-1:hover{--transform-rotate:1deg}.sm\:hover\:rotate-2:hover{--transform-rotate:2deg}.sm\:hover\:rotate-3:hover{--transform-rotate:3deg}.sm\:hover\:rotate-6:hover{--transform-rotate:6deg}.sm\:hover\:rotate-12:hover{--transform-rotate:12deg}.sm\:hover\:rotate-45:hover{--transform-rotate:45deg}.sm\:hover\:rotate-90:hover{--transform-rotate:90deg}.sm\:hover\:rotate-180:hover{--transform-rotate:180deg}.sm\:hover\:-rotate-180:hover{--transform-rotate:-180deg}.sm\:hover\:-rotate-90:hover{--transform-rotate:-90deg}.sm\:hover\:-rotate-45:hover{--transform-rotate:-45deg}.sm\:hover\:-rotate-12:hover{--transform-rotate:-12deg}.sm\:hover\:-rotate-6:hover{--transform-rotate:-6deg}.sm\:hover\:-rotate-3:hover{--transform-rotate:-3deg}.sm\:hover\:-rotate-2:hover{--transform-rotate:-2deg}.sm\:hover\:-rotate-1:hover{--transform-rotate:-1deg}.sm\:focus\:rotate-0:focus{--transform-rotate:0}.sm\:focus\:rotate-1:focus{--transform-rotate:1deg}.sm\:focus\:rotate-2:focus{--transform-rotate:2deg}.sm\:focus\:rotate-3:focus{--transform-rotate:3deg}.sm\:focus\:rotate-6:focus{--transform-rotate:6deg}.sm\:focus\:rotate-12:focus{--transform-rotate:12deg}.sm\:focus\:rotate-45:focus{--transform-rotate:45deg}.sm\:focus\:rotate-90:focus{--transform-rotate:90deg}.sm\:focus\:rotate-180:focus{--transform-rotate:180deg}.sm\:focus\:-rotate-180:focus{--transform-rotate:-180deg}.sm\:focus\:-rotate-90:focus{--transform-rotate:-90deg}.sm\:focus\:-rotate-45:focus{--transform-rotate:-45deg}.sm\:focus\:-rotate-12:focus{--transform-rotate:-12deg}.sm\:focus\:-rotate-6:focus{--transform-rotate:-6deg}.sm\:focus\:-rotate-3:focus{--transform-rotate:-3deg}.sm\:focus\:-rotate-2:focus{--transform-rotate:-2deg}.sm\:focus\:-rotate-1:focus{--transform-rotate:-1deg}.sm\:translate-x-0{--transform-translate-x:0}.sm\:translate-x-1{--transform-translate-x:0.25rem}.sm\:translate-x-2{--transform-translate-x:0.5rem}.sm\:translate-x-3{--transform-translate-x:0.75rem}.sm\:translate-x-4{--transform-translate-x:1rem}.sm\:translate-x-5{--transform-translate-x:1.25rem}.sm\:translate-x-6{--transform-translate-x:1.5rem}.sm\:translate-x-8{--transform-translate-x:2rem}.sm\:translate-x-10{--transform-translate-x:2.5rem}.sm\:translate-x-12{--transform-translate-x:3rem}.sm\:translate-x-16{--transform-translate-x:4rem}.sm\:translate-x-20{--transform-translate-x:5rem}.sm\:translate-x-24{--transform-translate-x:6rem}.sm\:translate-x-32{--transform-translate-x:8rem}.sm\:translate-x-40{--transform-translate-x:10rem}.sm\:translate-x-48{--transform-translate-x:12rem}.sm\:translate-x-56{--transform-translate-x:14rem}.sm\:translate-x-64{--transform-translate-x:16rem}.sm\:translate-x-px{--transform-translate-x:1px}.sm\:-translate-x-1{--transform-translate-x:-0.25rem}.sm\:-translate-x-2{--transform-translate-x:-0.5rem}.sm\:-translate-x-3{--transform-translate-x:-0.75rem}.sm\:-translate-x-4{--transform-translate-x:-1rem}.sm\:-translate-x-5{--transform-translate-x:-1.25rem}.sm\:-translate-x-6{--transform-translate-x:-1.5rem}.sm\:-translate-x-8{--transform-translate-x:-2rem}.sm\:-translate-x-10{--transform-translate-x:-2.5rem}.sm\:-translate-x-12{--transform-translate-x:-3rem}.sm\:-translate-x-16{--transform-translate-x:-4rem}.sm\:-translate-x-20{--transform-translate-x:-5rem}.sm\:-translate-x-24{--transform-translate-x:-6rem}.sm\:-translate-x-32{--transform-translate-x:-8rem}.sm\:-translate-x-40{--transform-translate-x:-10rem}.sm\:-translate-x-48{--transform-translate-x:-12rem}.sm\:-translate-x-56{--transform-translate-x:-14rem}.sm\:-translate-x-64{--transform-translate-x:-16rem}.sm\:-translate-x-px{--transform-translate-x:-1px}.sm\:-translate-x-full{--transform-translate-x:-100%}.sm\:-translate-x-1\/2{--transform-translate-x:-50%}.sm\:translate-x-1\/2{--transform-translate-x:50%}.sm\:translate-x-full{--transform-translate-x:100%}.sm\:translate-y-0{--transform-translate-y:0}.sm\:translate-y-1{--transform-translate-y:0.25rem}.sm\:translate-y-2{--transform-translate-y:0.5rem}.sm\:translate-y-3{--transform-translate-y:0.75rem}.sm\:translate-y-4{--transform-translate-y:1rem}.sm\:translate-y-5{--transform-translate-y:1.25rem}.sm\:translate-y-6{--transform-translate-y:1.5rem}.sm\:translate-y-8{--transform-translate-y:2rem}.sm\:translate-y-10{--transform-translate-y:2.5rem}.sm\:translate-y-12{--transform-translate-y:3rem}.sm\:translate-y-16{--transform-translate-y:4rem}.sm\:translate-y-20{--transform-translate-y:5rem}.sm\:translate-y-24{--transform-translate-y:6rem}.sm\:translate-y-32{--transform-translate-y:8rem}.sm\:translate-y-40{--transform-translate-y:10rem}.sm\:translate-y-48{--transform-translate-y:12rem}.sm\:translate-y-56{--transform-translate-y:14rem}.sm\:translate-y-64{--transform-translate-y:16rem}.sm\:translate-y-px{--transform-translate-y:1px}.sm\:-translate-y-1{--transform-translate-y:-0.25rem}.sm\:-translate-y-2{--transform-translate-y:-0.5rem}.sm\:-translate-y-3{--transform-translate-y:-0.75rem}.sm\:-translate-y-4{--transform-translate-y:-1rem}.sm\:-translate-y-5{--transform-translate-y:-1.25rem}.sm\:-translate-y-6{--transform-translate-y:-1.5rem}.sm\:-translate-y-8{--transform-translate-y:-2rem}.sm\:-translate-y-10{--transform-translate-y:-2.5rem}.sm\:-translate-y-12{--transform-translate-y:-3rem}.sm\:-translate-y-16{--transform-translate-y:-4rem}.sm\:-translate-y-20{--transform-translate-y:-5rem}.sm\:-translate-y-24{--transform-translate-y:-6rem}.sm\:-translate-y-32{--transform-translate-y:-8rem}.sm\:-translate-y-40{--transform-translate-y:-10rem}.sm\:-translate-y-48{--transform-translate-y:-12rem}.sm\:-translate-y-56{--transform-translate-y:-14rem}.sm\:-translate-y-64{--transform-translate-y:-16rem}.sm\:-translate-y-px{--transform-translate-y:-1px}.sm\:-translate-y-full{--transform-translate-y:-100%}.sm\:-translate-y-1\/2{--transform-translate-y:-50%}.sm\:translate-y-1\/2{--transform-translate-y:50%}.sm\:translate-y-full{--transform-translate-y:100%}.sm\:hover\:translate-x-0:hover{--transform-translate-x:0}.sm\:hover\:translate-x-1:hover{--transform-translate-x:0.25rem}.sm\:hover\:translate-x-2:hover{--transform-translate-x:0.5rem}.sm\:hover\:translate-x-3:hover{--transform-translate-x:0.75rem}.sm\:hover\:translate-x-4:hover{--transform-translate-x:1rem}.sm\:hover\:translate-x-5:hover{--transform-translate-x:1.25rem}.sm\:hover\:translate-x-6:hover{--transform-translate-x:1.5rem}.sm\:hover\:translate-x-8:hover{--transform-translate-x:2rem}.sm\:hover\:translate-x-10:hover{--transform-translate-x:2.5rem}.sm\:hover\:translate-x-12:hover{--transform-translate-x:3rem}.sm\:hover\:translate-x-16:hover{--transform-translate-x:4rem}.sm\:hover\:translate-x-20:hover{--transform-translate-x:5rem}.sm\:hover\:translate-x-24:hover{--transform-translate-x:6rem}.sm\:hover\:translate-x-32:hover{--transform-translate-x:8rem}.sm\:hover\:translate-x-40:hover{--transform-translate-x:10rem}.sm\:hover\:translate-x-48:hover{--transform-translate-x:12rem}.sm\:hover\:translate-x-56:hover{--transform-translate-x:14rem}.sm\:hover\:translate-x-64:hover{--transform-translate-x:16rem}.sm\:hover\:translate-x-px:hover{--transform-translate-x:1px}.sm\:hover\:-translate-x-1:hover{--transform-translate-x:-0.25rem}.sm\:hover\:-translate-x-2:hover{--transform-translate-x:-0.5rem}.sm\:hover\:-translate-x-3:hover{--transform-translate-x:-0.75rem}.sm\:hover\:-translate-x-4:hover{--transform-translate-x:-1rem}.sm\:hover\:-translate-x-5:hover{--transform-translate-x:-1.25rem}.sm\:hover\:-translate-x-6:hover{--transform-translate-x:-1.5rem}.sm\:hover\:-translate-x-8:hover{--transform-translate-x:-2rem}.sm\:hover\:-translate-x-10:hover{--transform-translate-x:-2.5rem}.sm\:hover\:-translate-x-12:hover{--transform-translate-x:-3rem}.sm\:hover\:-translate-x-16:hover{--transform-translate-x:-4rem}.sm\:hover\:-translate-x-20:hover{--transform-translate-x:-5rem}.sm\:hover\:-translate-x-24:hover{--transform-translate-x:-6rem}.sm\:hover\:-translate-x-32:hover{--transform-translate-x:-8rem}.sm\:hover\:-translate-x-40:hover{--transform-translate-x:-10rem}.sm\:hover\:-translate-x-48:hover{--transform-translate-x:-12rem}.sm\:hover\:-translate-x-56:hover{--transform-translate-x:-14rem}.sm\:hover\:-translate-x-64:hover{--transform-translate-x:-16rem}.sm\:hover\:-translate-x-px:hover{--transform-translate-x:-1px}.sm\:hover\:-translate-x-full:hover{--transform-translate-x:-100%}.sm\:hover\:-translate-x-1\/2:hover{--transform-translate-x:-50%}.sm\:hover\:translate-x-1\/2:hover{--transform-translate-x:50%}.sm\:hover\:translate-x-full:hover{--transform-translate-x:100%}.sm\:hover\:translate-y-0:hover{--transform-translate-y:0}.sm\:hover\:translate-y-1:hover{--transform-translate-y:0.25rem}.sm\:hover\:translate-y-2:hover{--transform-translate-y:0.5rem}.sm\:hover\:translate-y-3:hover{--transform-translate-y:0.75rem}.sm\:hover\:translate-y-4:hover{--transform-translate-y:1rem}.sm\:hover\:translate-y-5:hover{--transform-translate-y:1.25rem}.sm\:hover\:translate-y-6:hover{--transform-translate-y:1.5rem}.sm\:hover\:translate-y-8:hover{--transform-translate-y:2rem}.sm\:hover\:translate-y-10:hover{--transform-translate-y:2.5rem}.sm\:hover\:translate-y-12:hover{--transform-translate-y:3rem}.sm\:hover\:translate-y-16:hover{--transform-translate-y:4rem}.sm\:hover\:translate-y-20:hover{--transform-translate-y:5rem}.sm\:hover\:translate-y-24:hover{--transform-translate-y:6rem}.sm\:hover\:translate-y-32:hover{--transform-translate-y:8rem}.sm\:hover\:translate-y-40:hover{--transform-translate-y:10rem}.sm\:hover\:translate-y-48:hover{--transform-translate-y:12rem}.sm\:hover\:translate-y-56:hover{--transform-translate-y:14rem}.sm\:hover\:translate-y-64:hover{--transform-translate-y:16rem}.sm\:hover\:translate-y-px:hover{--transform-translate-y:1px}.sm\:hover\:-translate-y-1:hover{--transform-translate-y:-0.25rem}.sm\:hover\:-translate-y-2:hover{--transform-translate-y:-0.5rem}.sm\:hover\:-translate-y-3:hover{--transform-translate-y:-0.75rem}.sm\:hover\:-translate-y-4:hover{--transform-translate-y:-1rem}.sm\:hover\:-translate-y-5:hover{--transform-translate-y:-1.25rem}.sm\:hover\:-translate-y-6:hover{--transform-translate-y:-1.5rem}.sm\:hover\:-translate-y-8:hover{--transform-translate-y:-2rem}.sm\:hover\:-translate-y-10:hover{--transform-translate-y:-2.5rem}.sm\:hover\:-translate-y-12:hover{--transform-translate-y:-3rem}.sm\:hover\:-translate-y-16:hover{--transform-translate-y:-4rem}.sm\:hover\:-translate-y-20:hover{--transform-translate-y:-5rem}.sm\:hover\:-translate-y-24:hover{--transform-translate-y:-6rem}.sm\:hover\:-translate-y-32:hover{--transform-translate-y:-8rem}.sm\:hover\:-translate-y-40:hover{--transform-translate-y:-10rem}.sm\:hover\:-translate-y-48:hover{--transform-translate-y:-12rem}.sm\:hover\:-translate-y-56:hover{--transform-translate-y:-14rem}.sm\:hover\:-translate-y-64:hover{--transform-translate-y:-16rem}.sm\:hover\:-translate-y-px:hover{--transform-translate-y:-1px}.sm\:hover\:-translate-y-full:hover{--transform-translate-y:-100%}.sm\:hover\:-translate-y-1\/2:hover{--transform-translate-y:-50%}.sm\:hover\:translate-y-1\/2:hover{--transform-translate-y:50%}.sm\:hover\:translate-y-full:hover{--transform-translate-y:100%}.sm\:focus\:translate-x-0:focus{--transform-translate-x:0}.sm\:focus\:translate-x-1:focus{--transform-translate-x:0.25rem}.sm\:focus\:translate-x-2:focus{--transform-translate-x:0.5rem}.sm\:focus\:translate-x-3:focus{--transform-translate-x:0.75rem}.sm\:focus\:translate-x-4:focus{--transform-translate-x:1rem}.sm\:focus\:translate-x-5:focus{--transform-translate-x:1.25rem}.sm\:focus\:translate-x-6:focus{--transform-translate-x:1.5rem}.sm\:focus\:translate-x-8:focus{--transform-translate-x:2rem}.sm\:focus\:translate-x-10:focus{--transform-translate-x:2.5rem}.sm\:focus\:translate-x-12:focus{--transform-translate-x:3rem}.sm\:focus\:translate-x-16:focus{--transform-translate-x:4rem}.sm\:focus\:translate-x-20:focus{--transform-translate-x:5rem}.sm\:focus\:translate-x-24:focus{--transform-translate-x:6rem}.sm\:focus\:translate-x-32:focus{--transform-translate-x:8rem}.sm\:focus\:translate-x-40:focus{--transform-translate-x:10rem}.sm\:focus\:translate-x-48:focus{--transform-translate-x:12rem}.sm\:focus\:translate-x-56:focus{--transform-translate-x:14rem}.sm\:focus\:translate-x-64:focus{--transform-translate-x:16rem}.sm\:focus\:translate-x-px:focus{--transform-translate-x:1px}.sm\:focus\:-translate-x-1:focus{--transform-translate-x:-0.25rem}.sm\:focus\:-translate-x-2:focus{--transform-translate-x:-0.5rem}.sm\:focus\:-translate-x-3:focus{--transform-translate-x:-0.75rem}.sm\:focus\:-translate-x-4:focus{--transform-translate-x:-1rem}.sm\:focus\:-translate-x-5:focus{--transform-translate-x:-1.25rem}.sm\:focus\:-translate-x-6:focus{--transform-translate-x:-1.5rem}.sm\:focus\:-translate-x-8:focus{--transform-translate-x:-2rem}.sm\:focus\:-translate-x-10:focus{--transform-translate-x:-2.5rem}.sm\:focus\:-translate-x-12:focus{--transform-translate-x:-3rem}.sm\:focus\:-translate-x-16:focus{--transform-translate-x:-4rem}.sm\:focus\:-translate-x-20:focus{--transform-translate-x:-5rem}.sm\:focus\:-translate-x-24:focus{--transform-translate-x:-6rem}.sm\:focus\:-translate-x-32:focus{--transform-translate-x:-8rem}.sm\:focus\:-translate-x-40:focus{--transform-translate-x:-10rem}.sm\:focus\:-translate-x-48:focus{--transform-translate-x:-12rem}.sm\:focus\:-translate-x-56:focus{--transform-translate-x:-14rem}.sm\:focus\:-translate-x-64:focus{--transform-translate-x:-16rem}.sm\:focus\:-translate-x-px:focus{--transform-translate-x:-1px}.sm\:focus\:-translate-x-full:focus{--transform-translate-x:-100%}.sm\:focus\:-translate-x-1\/2:focus{--transform-translate-x:-50%}.sm\:focus\:translate-x-1\/2:focus{--transform-translate-x:50%}.sm\:focus\:translate-x-full:focus{--transform-translate-x:100%}.sm\:focus\:translate-y-0:focus{--transform-translate-y:0}.sm\:focus\:translate-y-1:focus{--transform-translate-y:0.25rem}.sm\:focus\:translate-y-2:focus{--transform-translate-y:0.5rem}.sm\:focus\:translate-y-3:focus{--transform-translate-y:0.75rem}.sm\:focus\:translate-y-4:focus{--transform-translate-y:1rem}.sm\:focus\:translate-y-5:focus{--transform-translate-y:1.25rem}.sm\:focus\:translate-y-6:focus{--transform-translate-y:1.5rem}.sm\:focus\:translate-y-8:focus{--transform-translate-y:2rem}.sm\:focus\:translate-y-10:focus{--transform-translate-y:2.5rem}.sm\:focus\:translate-y-12:focus{--transform-translate-y:3rem}.sm\:focus\:translate-y-16:focus{--transform-translate-y:4rem}.sm\:focus\:translate-y-20:focus{--transform-translate-y:5rem}.sm\:focus\:translate-y-24:focus{--transform-translate-y:6rem}.sm\:focus\:translate-y-32:focus{--transform-translate-y:8rem}.sm\:focus\:translate-y-40:focus{--transform-translate-y:10rem}.sm\:focus\:translate-y-48:focus{--transform-translate-y:12rem}.sm\:focus\:translate-y-56:focus{--transform-translate-y:14rem}.sm\:focus\:translate-y-64:focus{--transform-translate-y:16rem}.sm\:focus\:translate-y-px:focus{--transform-translate-y:1px}.sm\:focus\:-translate-y-1:focus{--transform-translate-y:-0.25rem}.sm\:focus\:-translate-y-2:focus{--transform-translate-y:-0.5rem}.sm\:focus\:-translate-y-3:focus{--transform-translate-y:-0.75rem}.sm\:focus\:-translate-y-4:focus{--transform-translate-y:-1rem}.sm\:focus\:-translate-y-5:focus{--transform-translate-y:-1.25rem}.sm\:focus\:-translate-y-6:focus{--transform-translate-y:-1.5rem}.sm\:focus\:-translate-y-8:focus{--transform-translate-y:-2rem}.sm\:focus\:-translate-y-10:focus{--transform-translate-y:-2.5rem}.sm\:focus\:-translate-y-12:focus{--transform-translate-y:-3rem}.sm\:focus\:-translate-y-16:focus{--transform-translate-y:-4rem}.sm\:focus\:-translate-y-20:focus{--transform-translate-y:-5rem}.sm\:focus\:-translate-y-24:focus{--transform-translate-y:-6rem}.sm\:focus\:-translate-y-32:focus{--transform-translate-y:-8rem}.sm\:focus\:-translate-y-40:focus{--transform-translate-y:-10rem}.sm\:focus\:-translate-y-48:focus{--transform-translate-y:-12rem}.sm\:focus\:-translate-y-56:focus{--transform-translate-y:-14rem}.sm\:focus\:-translate-y-64:focus{--transform-translate-y:-16rem}.sm\:focus\:-translate-y-px:focus{--transform-translate-y:-1px}.sm\:focus\:-translate-y-full:focus{--transform-translate-y:-100%}.sm\:focus\:-translate-y-1\/2:focus{--transform-translate-y:-50%}.sm\:focus\:translate-y-1\/2:focus{--transform-translate-y:50%}.sm\:focus\:translate-y-full:focus{--transform-translate-y:100%}.sm\:skew-x-0{--transform-skew-x:0}.sm\:skew-x-1{--transform-skew-x:1deg}.sm\:skew-x-2{--transform-skew-x:2deg}.sm\:skew-x-3{--transform-skew-x:3deg}.sm\:skew-x-6{--transform-skew-x:6deg}.sm\:skew-x-12{--transform-skew-x:12deg}.sm\:-skew-x-12{--transform-skew-x:-12deg}.sm\:-skew-x-6{--transform-skew-x:-6deg}.sm\:-skew-x-3{--transform-skew-x:-3deg}.sm\:-skew-x-2{--transform-skew-x:-2deg}.sm\:-skew-x-1{--transform-skew-x:-1deg}.sm\:skew-y-0{--transform-skew-y:0}.sm\:skew-y-1{--transform-skew-y:1deg}.sm\:skew-y-2{--transform-skew-y:2deg}.sm\:skew-y-3{--transform-skew-y:3deg}.sm\:skew-y-6{--transform-skew-y:6deg}.sm\:skew-y-12{--transform-skew-y:12deg}.sm\:-skew-y-12{--transform-skew-y:-12deg}.sm\:-skew-y-6{--transform-skew-y:-6deg}.sm\:-skew-y-3{--transform-skew-y:-3deg}.sm\:-skew-y-2{--transform-skew-y:-2deg}.sm\:-skew-y-1{--transform-skew-y:-1deg}.sm\:hover\:skew-x-0:hover{--transform-skew-x:0}.sm\:hover\:skew-x-1:hover{--transform-skew-x:1deg}.sm\:hover\:skew-x-2:hover{--transform-skew-x:2deg}.sm\:hover\:skew-x-3:hover{--transform-skew-x:3deg}.sm\:hover\:skew-x-6:hover{--transform-skew-x:6deg}.sm\:hover\:skew-x-12:hover{--transform-skew-x:12deg}.sm\:hover\:-skew-x-12:hover{--transform-skew-x:-12deg}.sm\:hover\:-skew-x-6:hover{--transform-skew-x:-6deg}.sm\:hover\:-skew-x-3:hover{--transform-skew-x:-3deg}.sm\:hover\:-skew-x-2:hover{--transform-skew-x:-2deg}.sm\:hover\:-skew-x-1:hover{--transform-skew-x:-1deg}.sm\:hover\:skew-y-0:hover{--transform-skew-y:0}.sm\:hover\:skew-y-1:hover{--transform-skew-y:1deg}.sm\:hover\:skew-y-2:hover{--transform-skew-y:2deg}.sm\:hover\:skew-y-3:hover{--transform-skew-y:3deg}.sm\:hover\:skew-y-6:hover{--transform-skew-y:6deg}.sm\:hover\:skew-y-12:hover{--transform-skew-y:12deg}.sm\:hover\:-skew-y-12:hover{--transform-skew-y:-12deg}.sm\:hover\:-skew-y-6:hover{--transform-skew-y:-6deg}.sm\:hover\:-skew-y-3:hover{--transform-skew-y:-3deg}.sm\:hover\:-skew-y-2:hover{--transform-skew-y:-2deg}.sm\:hover\:-skew-y-1:hover{--transform-skew-y:-1deg}.sm\:focus\:skew-x-0:focus{--transform-skew-x:0}.sm\:focus\:skew-x-1:focus{--transform-skew-x:1deg}.sm\:focus\:skew-x-2:focus{--transform-skew-x:2deg}.sm\:focus\:skew-x-3:focus{--transform-skew-x:3deg}.sm\:focus\:skew-x-6:focus{--transform-skew-x:6deg}.sm\:focus\:skew-x-12:focus{--transform-skew-x:12deg}.sm\:focus\:-skew-x-12:focus{--transform-skew-x:-12deg}.sm\:focus\:-skew-x-6:focus{--transform-skew-x:-6deg}.sm\:focus\:-skew-x-3:focus{--transform-skew-x:-3deg}.sm\:focus\:-skew-x-2:focus{--transform-skew-x:-2deg}.sm\:focus\:-skew-x-1:focus{--transform-skew-x:-1deg}.sm\:focus\:skew-y-0:focus{--transform-skew-y:0}.sm\:focus\:skew-y-1:focus{--transform-skew-y:1deg}.sm\:focus\:skew-y-2:focus{--transform-skew-y:2deg}.sm\:focus\:skew-y-3:focus{--transform-skew-y:3deg}.sm\:focus\:skew-y-6:focus{--transform-skew-y:6deg}.sm\:focus\:skew-y-12:focus{--transform-skew-y:12deg}.sm\:focus\:-skew-y-12:focus{--transform-skew-y:-12deg}.sm\:focus\:-skew-y-6:focus{--transform-skew-y:-6deg}.sm\:focus\:-skew-y-3:focus{--transform-skew-y:-3deg}.sm\:focus\:-skew-y-2:focus{--transform-skew-y:-2deg}.sm\:focus\:-skew-y-1:focus{--transform-skew-y:-1deg}.sm\:transition-none{transition-property:none}.sm\:transition-all{transition-property:all}.sm\:transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform}.sm\:transition-colors{transition-property:background-color,border-color,color,fill,stroke}.sm\:transition-opacity{transition-property:opacity}.sm\:transition-shadow{transition-property:box-shadow}.sm\:transition-transform{transition-property:transform}.sm\:ease-linear{transition-timing-function:linear}.sm\:ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.sm\:ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.sm\:ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.sm\:duration-75{transition-duration:75ms}.sm\:duration-100{transition-duration:.1s}.sm\:duration-150{transition-duration:150ms}.sm\:duration-200{transition-duration:.2s}.sm\:duration-300{transition-duration:.3s}.sm\:duration-500{transition-duration:.5s}.sm\:duration-700{transition-duration:.7s}.sm\:duration-1000{transition-duration:1s}.sm\:delay-75{transition-delay:75ms}.sm\:delay-100{transition-delay:.1s}.sm\:delay-150{transition-delay:150ms}.sm\:delay-200{transition-delay:.2s}.sm\:delay-300{transition-delay:.3s}.sm\:delay-500{transition-delay:.5s}.sm\:delay-700{transition-delay:.7s}.sm\:delay-1000{transition-delay:1s}.sm\:animate-none{animation:none}.sm\:animate-spin{animation:spin 1s linear infinite}.sm\:animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.sm\:animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.sm\:animate-bounce{animation:bounce 1s infinite}}@media (min-width:768px){.md\:container{width:100%}@media (min-width:640px){.md\:container{max-width:640px}}@media (min-width:768px){.md\:container{max-width:768px}}@media (min-width:1024px){.md\:container{max-width:1024px}}@media (min-width:1280px){.md\:container{max-width:1280px}}.md\:space-y-0>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(0px * var(--space-y-reverse))}.md\:space-x-0>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(0px * var(--space-x-reverse));margin-left:calc(0px * calc(1 - var(--space-x-reverse)))}.md\:space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.25rem * var(--space-y-reverse))}.md\:space-x-1>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.25rem * var(--space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.5rem * var(--space-y-reverse))}.md\:space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.5rem * var(--space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.75rem * var(--space-y-reverse))}.md\:space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.75rem * var(--space-x-reverse));margin-left:calc(.75rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1rem * var(--space-y-reverse))}.md\:space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1rem * var(--space-x-reverse));margin-left:calc(1rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1.25rem * var(--space-y-reverse))}.md\:space-x-5>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1.25rem * var(--space-x-reverse));margin-left:calc(1.25rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-6>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1.5rem * var(--space-y-reverse))}.md\:space-x-6>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1.5rem * var(--space-x-reverse));margin-left:calc(1.5rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-8>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(2rem * var(--space-y-reverse))}.md\:space-x-8>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(2rem * var(--space-x-reverse));margin-left:calc(2rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(2.5rem * var(--space-y-reverse))}.md\:space-x-10>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(2.5rem * var(--space-x-reverse));margin-left:calc(2.5rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-12>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(3rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(3rem * var(--space-y-reverse))}.md\:space-x-12>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(3rem * var(--space-x-reverse));margin-left:calc(3rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-16>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(4rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(4rem * var(--space-y-reverse))}.md\:space-x-16>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(4rem * var(--space-x-reverse));margin-left:calc(4rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-20>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(5rem * var(--space-y-reverse))}.md\:space-x-20>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(5rem * var(--space-x-reverse));margin-left:calc(5rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-24>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(6rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(6rem * var(--space-y-reverse))}.md\:space-x-24>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(6rem * var(--space-x-reverse));margin-left:calc(6rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-32>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(8rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(8rem * var(--space-y-reverse))}.md\:space-x-32>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(8rem * var(--space-x-reverse));margin-left:calc(8rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-40>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(10rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(10rem * var(--space-y-reverse))}.md\:space-x-40>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(10rem * var(--space-x-reverse));margin-left:calc(10rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-48>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(12rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(12rem * var(--space-y-reverse))}.md\:space-x-48>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(12rem * var(--space-x-reverse));margin-left:calc(12rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-56>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(14rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(14rem * var(--space-y-reverse))}.md\:space-x-56>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(14rem * var(--space-x-reverse));margin-left:calc(14rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-64>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(16rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(16rem * var(--space-y-reverse))}.md\:space-x-64>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(16rem * var(--space-x-reverse));margin-left:calc(16rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-px>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1px * var(--space-y-reverse))}.md\:space-x-px>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1px * var(--space-x-reverse));margin-left:calc(1px * calc(1 - var(--space-x-reverse)))}.md\:-space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.25rem * var(--space-y-reverse))}.md\:-space-x-1>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.25rem * var(--space-x-reverse));margin-left:calc(-.25rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.5rem * var(--space-y-reverse))}.md\:-space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.5rem * var(--space-x-reverse));margin-left:calc(-.5rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.75rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.75rem * var(--space-y-reverse))}.md\:-space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.75rem * var(--space-x-reverse));margin-left:calc(-.75rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1rem * var(--space-y-reverse))}.md\:-space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1rem * var(--space-x-reverse));margin-left:calc(-1rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1.25rem * var(--space-y-reverse))}.md\:-space-x-5>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1.25rem * var(--space-x-reverse));margin-left:calc(-1.25rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-6>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1.5rem * var(--space-y-reverse))}.md\:-space-x-6>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1.5rem * var(--space-x-reverse));margin-left:calc(-1.5rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-8>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-2rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-2rem * var(--space-y-reverse))}.md\:-space-x-8>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-2rem * var(--space-x-reverse));margin-left:calc(-2rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-2.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-2.5rem * var(--space-y-reverse))}.md\:-space-x-10>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-2.5rem * var(--space-x-reverse));margin-left:calc(-2.5rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-12>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-3rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-3rem * var(--space-y-reverse))}.md\:-space-x-12>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-3rem * var(--space-x-reverse));margin-left:calc(-3rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-16>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-4rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-4rem * var(--space-y-reverse))}.md\:-space-x-16>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-4rem * var(--space-x-reverse));margin-left:calc(-4rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-20>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-5rem * var(--space-y-reverse))}.md\:-space-x-20>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-5rem * var(--space-x-reverse));margin-left:calc(-5rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-24>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-6rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-6rem * var(--space-y-reverse))}.md\:-space-x-24>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-6rem * var(--space-x-reverse));margin-left:calc(-6rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-32>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-8rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-8rem * var(--space-y-reverse))}.md\:-space-x-32>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-8rem * var(--space-x-reverse));margin-left:calc(-8rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-40>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-10rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-10rem * var(--space-y-reverse))}.md\:-space-x-40>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-10rem * var(--space-x-reverse));margin-left:calc(-10rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-48>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-12rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-12rem * var(--space-y-reverse))}.md\:-space-x-48>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-12rem * var(--space-x-reverse));margin-left:calc(-12rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-56>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-14rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-14rem * var(--space-y-reverse))}.md\:-space-x-56>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-14rem * var(--space-x-reverse));margin-left:calc(-14rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-64>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-16rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-16rem * var(--space-y-reverse))}.md\:-space-x-64>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-16rem * var(--space-x-reverse));margin-left:calc(-16rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-px>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1px * var(--space-y-reverse))}.md\:-space-x-px>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1px * var(--space-x-reverse));margin-left:calc(-1px * calc(1 - var(--space-x-reverse)))}.md\:space-y-reverse>:not(template)~:not(template){--space-y-reverse:1}.md\:space-x-reverse>:not(template)~:not(template){--space-x-reverse:1}.md\:divide-y-0>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(0px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(0px * var(--divide-y-reverse))}.md\:divide-x-0>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(0px * var(--divide-x-reverse));border-left-width:calc(0px * calc(1 - var(--divide-x-reverse)))}.md\:divide-y-2>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(2px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(2px * var(--divide-y-reverse))}.md\:divide-x-2>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(2px * var(--divide-x-reverse));border-left-width:calc(2px * calc(1 - var(--divide-x-reverse)))}.md\:divide-y-4>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(4px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(4px * var(--divide-y-reverse))}.md\:divide-x-4>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(4px * var(--divide-x-reverse));border-left-width:calc(4px * calc(1 - var(--divide-x-reverse)))}.md\:divide-y-8>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(8px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(8px * var(--divide-y-reverse))}.md\:divide-x-8>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(8px * var(--divide-x-reverse));border-left-width:calc(8px * calc(1 - var(--divide-x-reverse)))}.md\:divide-y>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(1px * var(--divide-y-reverse))}.md\:divide-x>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(1px * var(--divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--divide-x-reverse)))}.md\:divide-y-reverse>:not(template)~:not(template){--divide-y-reverse:1}.md\:divide-x-reverse>:not(template)~:not(template){--divide-x-reverse:1}.md\:divide-transparent>:not(template)~:not(template){border-color:transparent}.md\:divide-current>:not(template)~:not(template){border-color:currentColor}.md\:divide-black>:not(template)~:not(template){--divide-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--divide-opacity))}.md\:divide-white>:not(template)~:not(template){--divide-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--divide-opacity))}.md\:divide-gray-100>:not(template)~:not(template){--divide-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--divide-opacity))}.md\:divide-gray-200>:not(template)~:not(template){--divide-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--divide-opacity))}.md\:divide-gray-300>:not(template)~:not(template){--divide-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--divide-opacity))}.md\:divide-gray-400>:not(template)~:not(template){--divide-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--divide-opacity))}.md\:divide-gray-500>:not(template)~:not(template){--divide-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--divide-opacity))}.md\:divide-gray-600>:not(template)~:not(template){--divide-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--divide-opacity))}.md\:divide-gray-700>:not(template)~:not(template){--divide-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--divide-opacity))}.md\:divide-gray-800>:not(template)~:not(template){--divide-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--divide-opacity))}.md\:divide-gray-900>:not(template)~:not(template){--divide-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--divide-opacity))}.md\:divide-red-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--divide-opacity))}.md\:divide-red-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--divide-opacity))}.md\:divide-red-300>:not(template)~:not(template){--divide-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--divide-opacity))}.md\:divide-red-400>:not(template)~:not(template){--divide-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--divide-opacity))}.md\:divide-red-500>:not(template)~:not(template){--divide-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--divide-opacity))}.md\:divide-red-600>:not(template)~:not(template){--divide-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--divide-opacity))}.md\:divide-red-700>:not(template)~:not(template){--divide-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--divide-opacity))}.md\:divide-red-800>:not(template)~:not(template){--divide-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--divide-opacity))}.md\:divide-red-900>:not(template)~:not(template){--divide-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--divide-opacity))}.md\:divide-orange-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--divide-opacity))}.md\:divide-orange-200>:not(template)~:not(template){--divide-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--divide-opacity))}.md\:divide-orange-300>:not(template)~:not(template){--divide-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--divide-opacity))}.md\:divide-orange-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--divide-opacity))}.md\:divide-orange-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--divide-opacity))}.md\:divide-orange-600>:not(template)~:not(template){--divide-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--divide-opacity))}.md\:divide-orange-700>:not(template)~:not(template){--divide-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--divide-opacity))}.md\:divide-orange-800>:not(template)~:not(template){--divide-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--divide-opacity))}.md\:divide-orange-900>:not(template)~:not(template){--divide-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--divide-opacity))}.md\:divide-yellow-100>:not(template)~:not(template){--divide-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--divide-opacity))}.md\:divide-yellow-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--divide-opacity))}.md\:divide-yellow-300>:not(template)~:not(template){--divide-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--divide-opacity))}.md\:divide-yellow-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--divide-opacity))}.md\:divide-yellow-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--divide-opacity))}.md\:divide-yellow-600>:not(template)~:not(template){--divide-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--divide-opacity))}.md\:divide-yellow-700>:not(template)~:not(template){--divide-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--divide-opacity))}.md\:divide-yellow-800>:not(template)~:not(template){--divide-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--divide-opacity))}.md\:divide-yellow-900>:not(template)~:not(template){--divide-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--divide-opacity))}.md\:divide-green-100>:not(template)~:not(template){--divide-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--divide-opacity))}.md\:divide-green-200>:not(template)~:not(template){--divide-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--divide-opacity))}.md\:divide-green-300>:not(template)~:not(template){--divide-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--divide-opacity))}.md\:divide-green-400>:not(template)~:not(template){--divide-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--divide-opacity))}.md\:divide-green-500>:not(template)~:not(template){--divide-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--divide-opacity))}.md\:divide-green-600>:not(template)~:not(template){--divide-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--divide-opacity))}.md\:divide-green-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--divide-opacity))}.md\:divide-green-800>:not(template)~:not(template){--divide-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--divide-opacity))}.md\:divide-green-900>:not(template)~:not(template){--divide-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--divide-opacity))}.md\:divide-teal-100>:not(template)~:not(template){--divide-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--divide-opacity))}.md\:divide-teal-200>:not(template)~:not(template){--divide-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--divide-opacity))}.md\:divide-teal-300>:not(template)~:not(template){--divide-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--divide-opacity))}.md\:divide-teal-400>:not(template)~:not(template){--divide-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--divide-opacity))}.md\:divide-teal-500>:not(template)~:not(template){--divide-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--divide-opacity))}.md\:divide-teal-600>:not(template)~:not(template){--divide-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--divide-opacity))}.md\:divide-teal-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--divide-opacity))}.md\:divide-teal-800>:not(template)~:not(template){--divide-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--divide-opacity))}.md\:divide-teal-900>:not(template)~:not(template){--divide-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--divide-opacity))}.md\:divide-blue-100>:not(template)~:not(template){--divide-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--divide-opacity))}.md\:divide-blue-200>:not(template)~:not(template){--divide-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--divide-opacity))}.md\:divide-blue-300>:not(template)~:not(template){--divide-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--divide-opacity))}.md\:divide-blue-400>:not(template)~:not(template){--divide-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--divide-opacity))}.md\:divide-blue-500>:not(template)~:not(template){--divide-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--divide-opacity))}.md\:divide-blue-600>:not(template)~:not(template){--divide-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--divide-opacity))}.md\:divide-blue-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--divide-opacity))}.md\:divide-blue-800>:not(template)~:not(template){--divide-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--divide-opacity))}.md\:divide-blue-900>:not(template)~:not(template){--divide-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--divide-opacity))}.md\:divide-indigo-100>:not(template)~:not(template){--divide-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--divide-opacity))}.md\:divide-indigo-200>:not(template)~:not(template){--divide-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--divide-opacity))}.md\:divide-indigo-300>:not(template)~:not(template){--divide-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--divide-opacity))}.md\:divide-indigo-400>:not(template)~:not(template){--divide-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--divide-opacity))}.md\:divide-indigo-500>:not(template)~:not(template){--divide-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--divide-opacity))}.md\:divide-indigo-600>:not(template)~:not(template){--divide-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--divide-opacity))}.md\:divide-indigo-700>:not(template)~:not(template){--divide-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--divide-opacity))}.md\:divide-indigo-800>:not(template)~:not(template){--divide-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--divide-opacity))}.md\:divide-indigo-900>:not(template)~:not(template){--divide-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--divide-opacity))}.md\:divide-purple-100>:not(template)~:not(template){--divide-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--divide-opacity))}.md\:divide-purple-200>:not(template)~:not(template){--divide-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--divide-opacity))}.md\:divide-purple-300>:not(template)~:not(template){--divide-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--divide-opacity))}.md\:divide-purple-400>:not(template)~:not(template){--divide-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--divide-opacity))}.md\:divide-purple-500>:not(template)~:not(template){--divide-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--divide-opacity))}.md\:divide-purple-600>:not(template)~:not(template){--divide-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--divide-opacity))}.md\:divide-purple-700>:not(template)~:not(template){--divide-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--divide-opacity))}.md\:divide-purple-800>:not(template)~:not(template){--divide-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--divide-opacity))}.md\:divide-purple-900>:not(template)~:not(template){--divide-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--divide-opacity))}.md\:divide-pink-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--divide-opacity))}.md\:divide-pink-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--divide-opacity))}.md\:divide-pink-300>:not(template)~:not(template){--divide-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--divide-opacity))}.md\:divide-pink-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--divide-opacity))}.md\:divide-pink-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--divide-opacity))}.md\:divide-pink-600>:not(template)~:not(template){--divide-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--divide-opacity))}.md\:divide-pink-700>:not(template)~:not(template){--divide-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--divide-opacity))}.md\:divide-pink-800>:not(template)~:not(template){--divide-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--divide-opacity))}.md\:divide-pink-900>:not(template)~:not(template){--divide-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--divide-opacity))}.md\:divide-solid>:not(template)~:not(template){border-style:solid}.md\:divide-dashed>:not(template)~:not(template){border-style:dashed}.md\:divide-dotted>:not(template)~:not(template){border-style:dotted}.md\:divide-double>:not(template)~:not(template){border-style:double}.md\:divide-none>:not(template)~:not(template){border-style:none}.md\:divide-opacity-0>:not(template)~:not(template){--divide-opacity:0}.md\:divide-opacity-25>:not(template)~:not(template){--divide-opacity:0.25}.md\:divide-opacity-50>:not(template)~:not(template){--divide-opacity:0.5}.md\:divide-opacity-75>:not(template)~:not(template){--divide-opacity:0.75}.md\:divide-opacity-100>:not(template)~:not(template){--divide-opacity:1}.md\:sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.md\:not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.md\:focus\:sr-only:focus{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.md\:focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.md\:appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.md\:bg-fixed{background-attachment:fixed}.md\:bg-local{background-attachment:local}.md\:bg-scroll{background-attachment:scroll}.md\:bg-clip-border{background-clip:border-box}.md\:bg-clip-padding{background-clip:padding-box}.md\:bg-clip-content{background-clip:content-box}.md\:bg-clip-text{-webkit-background-clip:text;background-clip:text}.md\:bg-transparent{background-color:transparent}.md\:bg-current{background-color:currentColor}.md\:bg-black{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.md\:bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.md\:bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.md\:bg-gray-200{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.md\:bg-gray-300{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.md\:bg-gray-400{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.md\:bg-gray-500{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.md\:bg-gray-600{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.md\:bg-gray-700{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.md\:bg-gray-800{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.md\:bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.md\:bg-red-100{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.md\:bg-red-200{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.md\:bg-red-300{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.md\:bg-red-400{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.md\:bg-red-500{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.md\:bg-red-600{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.md\:bg-red-700{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.md\:bg-red-800{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.md\:bg-red-900{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.md\:bg-orange-100{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.md\:bg-orange-200{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.md\:bg-orange-300{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.md\:bg-orange-400{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.md\:bg-orange-500{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.md\:bg-orange-600{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.md\:bg-orange-700{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.md\:bg-orange-800{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.md\:bg-orange-900{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.md\:bg-yellow-100{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.md\:bg-yellow-200{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.md\:bg-yellow-300{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.md\:bg-yellow-400{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.md\:bg-yellow-500{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.md\:bg-yellow-600{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.md\:bg-yellow-700{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.md\:bg-yellow-800{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.md\:bg-yellow-900{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.md\:bg-green-100{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.md\:bg-green-200{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.md\:bg-green-300{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.md\:bg-green-400{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.md\:bg-green-500{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.md\:bg-green-600{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.md\:bg-green-700{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.md\:bg-green-800{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.md\:bg-green-900{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.md\:bg-teal-100{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.md\:bg-teal-200{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.md\:bg-teal-300{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.md\:bg-teal-400{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.md\:bg-teal-500{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.md\:bg-teal-600{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.md\:bg-teal-700{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.md\:bg-teal-800{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.md\:bg-teal-900{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.md\:bg-blue-100{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.md\:bg-blue-200{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.md\:bg-blue-300{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.md\:bg-blue-400{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.md\:bg-blue-500{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.md\:bg-blue-600{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.md\:bg-blue-700{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.md\:bg-blue-800{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.md\:bg-blue-900{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.md\:bg-indigo-100{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.md\:bg-indigo-200{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.md\:bg-indigo-300{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.md\:bg-indigo-400{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.md\:bg-indigo-500{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.md\:bg-indigo-600{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.md\:bg-indigo-700{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.md\:bg-indigo-800{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.md\:bg-indigo-900{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.md\:bg-purple-100{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.md\:bg-purple-200{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.md\:bg-purple-300{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.md\:bg-purple-400{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.md\:bg-purple-500{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.md\:bg-purple-600{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.md\:bg-purple-700{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.md\:bg-purple-800{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.md\:bg-purple-900{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.md\:bg-pink-100{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.md\:bg-pink-200{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.md\:bg-pink-300{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.md\:bg-pink-400{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.md\:bg-pink-500{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.md\:bg-pink-600{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.md\:bg-pink-700{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.md\:bg-pink-800{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.md\:bg-pink-900{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.md\:hover\:bg-transparent:hover{background-color:transparent}.md\:hover\:bg-current:hover{background-color:currentColor}.md\:hover\:bg-black:hover{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.md\:hover\:bg-white:hover{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.md\:hover\:bg-gray-100:hover{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.md\:hover\:bg-gray-200:hover{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.md\:hover\:bg-gray-300:hover{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.md\:hover\:bg-gray-400:hover{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.md\:hover\:bg-gray-500:hover{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.md\:hover\:bg-gray-600:hover{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.md\:hover\:bg-gray-700:hover{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.md\:hover\:bg-gray-800:hover{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.md\:hover\:bg-gray-900:hover{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.md\:hover\:bg-red-100:hover{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.md\:hover\:bg-red-200:hover{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.md\:hover\:bg-red-300:hover{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.md\:hover\:bg-red-400:hover{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.md\:hover\:bg-red-500:hover{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.md\:hover\:bg-red-600:hover{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.md\:hover\:bg-red-700:hover{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.md\:hover\:bg-red-800:hover{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.md\:hover\:bg-red-900:hover{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.md\:hover\:bg-orange-100:hover{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.md\:hover\:bg-orange-200:hover{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.md\:hover\:bg-orange-300:hover{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.md\:hover\:bg-orange-400:hover{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.md\:hover\:bg-orange-500:hover{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.md\:hover\:bg-orange-600:hover{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.md\:hover\:bg-orange-700:hover{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.md\:hover\:bg-orange-800:hover{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.md\:hover\:bg-orange-900:hover{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.md\:hover\:bg-yellow-100:hover{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.md\:hover\:bg-yellow-200:hover{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.md\:hover\:bg-yellow-300:hover{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.md\:hover\:bg-yellow-400:hover{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.md\:hover\:bg-yellow-500:hover{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.md\:hover\:bg-yellow-600:hover{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.md\:hover\:bg-yellow-700:hover{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.md\:hover\:bg-yellow-800:hover{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.md\:hover\:bg-yellow-900:hover{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.md\:hover\:bg-green-100:hover{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.md\:hover\:bg-green-200:hover{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.md\:hover\:bg-green-300:hover{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.md\:hover\:bg-green-400:hover{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.md\:hover\:bg-green-500:hover{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.md\:hover\:bg-green-600:hover{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.md\:hover\:bg-green-700:hover{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.md\:hover\:bg-green-800:hover{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.md\:hover\:bg-green-900:hover{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.md\:hover\:bg-teal-100:hover{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.md\:hover\:bg-teal-200:hover{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.md\:hover\:bg-teal-300:hover{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.md\:hover\:bg-teal-400:hover{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.md\:hover\:bg-teal-500:hover{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.md\:hover\:bg-teal-600:hover{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.md\:hover\:bg-teal-700:hover{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.md\:hover\:bg-teal-800:hover{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.md\:hover\:bg-teal-900:hover{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.md\:hover\:bg-blue-100:hover{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.md\:hover\:bg-blue-200:hover{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.md\:hover\:bg-blue-300:hover{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.md\:hover\:bg-blue-400:hover{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.md\:hover\:bg-blue-500:hover{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.md\:hover\:bg-blue-600:hover{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.md\:hover\:bg-blue-700:hover{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.md\:hover\:bg-blue-800:hover{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.md\:hover\:bg-blue-900:hover{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.md\:hover\:bg-indigo-100:hover{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.md\:hover\:bg-indigo-200:hover{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.md\:hover\:bg-indigo-300:hover{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.md\:hover\:bg-indigo-400:hover{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.md\:hover\:bg-indigo-500:hover{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.md\:hover\:bg-indigo-600:hover{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.md\:hover\:bg-indigo-700:hover{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.md\:hover\:bg-indigo-800:hover{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.md\:hover\:bg-indigo-900:hover{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.md\:hover\:bg-purple-100:hover{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.md\:hover\:bg-purple-200:hover{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.md\:hover\:bg-purple-300:hover{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.md\:hover\:bg-purple-400:hover{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.md\:hover\:bg-purple-500:hover{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.md\:hover\:bg-purple-600:hover{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.md\:hover\:bg-purple-700:hover{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.md\:hover\:bg-purple-800:hover{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.md\:hover\:bg-purple-900:hover{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.md\:hover\:bg-pink-100:hover{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.md\:hover\:bg-pink-200:hover{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.md\:hover\:bg-pink-300:hover{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.md\:hover\:bg-pink-400:hover{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.md\:hover\:bg-pink-500:hover{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.md\:hover\:bg-pink-600:hover{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.md\:hover\:bg-pink-700:hover{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.md\:hover\:bg-pink-800:hover{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.md\:hover\:bg-pink-900:hover{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.md\:focus\:bg-transparent:focus{background-color:transparent}.md\:focus\:bg-current:focus{background-color:currentColor}.md\:focus\:bg-black:focus{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.md\:focus\:bg-white:focus{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.md\:focus\:bg-gray-100:focus{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.md\:focus\:bg-gray-200:focus{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.md\:focus\:bg-gray-300:focus{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.md\:focus\:bg-gray-400:focus{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.md\:focus\:bg-gray-500:focus{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.md\:focus\:bg-gray-600:focus{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.md\:focus\:bg-gray-700:focus{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.md\:focus\:bg-gray-800:focus{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.md\:focus\:bg-gray-900:focus{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.md\:focus\:bg-red-100:focus{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.md\:focus\:bg-red-200:focus{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.md\:focus\:bg-red-300:focus{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.md\:focus\:bg-red-400:focus{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.md\:focus\:bg-red-500:focus{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.md\:focus\:bg-red-600:focus{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.md\:focus\:bg-red-700:focus{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.md\:focus\:bg-red-800:focus{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.md\:focus\:bg-red-900:focus{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.md\:focus\:bg-orange-100:focus{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.md\:focus\:bg-orange-200:focus{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.md\:focus\:bg-orange-300:focus{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.md\:focus\:bg-orange-400:focus{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.md\:focus\:bg-orange-500:focus{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.md\:focus\:bg-orange-600:focus{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.md\:focus\:bg-orange-700:focus{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.md\:focus\:bg-orange-800:focus{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.md\:focus\:bg-orange-900:focus{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.md\:focus\:bg-yellow-100:focus{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.md\:focus\:bg-yellow-200:focus{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.md\:focus\:bg-yellow-300:focus{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.md\:focus\:bg-yellow-400:focus{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.md\:focus\:bg-yellow-500:focus{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.md\:focus\:bg-yellow-600:focus{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.md\:focus\:bg-yellow-700:focus{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.md\:focus\:bg-yellow-800:focus{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.md\:focus\:bg-yellow-900:focus{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.md\:focus\:bg-green-100:focus{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.md\:focus\:bg-green-200:focus{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.md\:focus\:bg-green-300:focus{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.md\:focus\:bg-green-400:focus{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.md\:focus\:bg-green-500:focus{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.md\:focus\:bg-green-600:focus{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.md\:focus\:bg-green-700:focus{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.md\:focus\:bg-green-800:focus{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.md\:focus\:bg-green-900:focus{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.md\:focus\:bg-teal-100:focus{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.md\:focus\:bg-teal-200:focus{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.md\:focus\:bg-teal-300:focus{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.md\:focus\:bg-teal-400:focus{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.md\:focus\:bg-teal-500:focus{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.md\:focus\:bg-teal-600:focus{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.md\:focus\:bg-teal-700:focus{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.md\:focus\:bg-teal-800:focus{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.md\:focus\:bg-teal-900:focus{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.md\:focus\:bg-blue-100:focus{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.md\:focus\:bg-blue-200:focus{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.md\:focus\:bg-blue-300:focus{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.md\:focus\:bg-blue-400:focus{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.md\:focus\:bg-blue-500:focus{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.md\:focus\:bg-blue-600:focus{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.md\:focus\:bg-blue-700:focus{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.md\:focus\:bg-blue-800:focus{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.md\:focus\:bg-blue-900:focus{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.md\:focus\:bg-indigo-100:focus{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.md\:focus\:bg-indigo-200:focus{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.md\:focus\:bg-indigo-300:focus{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.md\:focus\:bg-indigo-400:focus{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.md\:focus\:bg-indigo-500:focus{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.md\:focus\:bg-indigo-600:focus{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.md\:focus\:bg-indigo-700:focus{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.md\:focus\:bg-indigo-800:focus{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.md\:focus\:bg-indigo-900:focus{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.md\:focus\:bg-purple-100:focus{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.md\:focus\:bg-purple-200:focus{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.md\:focus\:bg-purple-300:focus{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.md\:focus\:bg-purple-400:focus{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.md\:focus\:bg-purple-500:focus{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.md\:focus\:bg-purple-600:focus{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.md\:focus\:bg-purple-700:focus{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.md\:focus\:bg-purple-800:focus{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.md\:focus\:bg-purple-900:focus{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.md\:focus\:bg-pink-100:focus{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.md\:focus\:bg-pink-200:focus{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.md\:focus\:bg-pink-300:focus{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.md\:focus\:bg-pink-400:focus{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.md\:focus\:bg-pink-500:focus{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.md\:focus\:bg-pink-600:focus{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.md\:focus\:bg-pink-700:focus{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.md\:focus\:bg-pink-800:focus{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.md\:focus\:bg-pink-900:focus{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.md\:bg-none{background-image:none}.md\:bg-gradient-to-t{background-image:linear-gradient(to top,var(--gradient-color-stops))}.md\:bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--gradient-color-stops))}.md\:bg-gradient-to-r{background-image:linear-gradient(to right,var(--gradient-color-stops))}.md\:bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--gradient-color-stops))}.md\:bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--gradient-color-stops))}.md\:bg-gradient-to-bl{background-image:linear-gradient(to bottom left,var(--gradient-color-stops))}.md\:bg-gradient-to-l{background-image:linear-gradient(to left,var(--gradient-color-stops))}.md\:bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--gradient-color-stops))}.md\:from-transparent{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:from-current{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:from-black{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:from-white{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:from-gray-100{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.md\:from-gray-200{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.md\:from-gray-300{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.md\:from-gray-400{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.md\:from-gray-500{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.md\:from-gray-600{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.md\:from-gray-700{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.md\:from-gray-800{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.md\:from-gray-900{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.md\:from-red-100{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.md\:from-red-200{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.md\:from-red-300{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.md\:from-red-400{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.md\:from-red-500{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.md\:from-red-600{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.md\:from-red-700{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.md\:from-red-800{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.md\:from-red-900{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.md\:from-orange-100{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.md\:from-orange-200{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.md\:from-orange-300{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.md\:from-orange-400{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.md\:from-orange-500{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.md\:from-orange-600{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.md\:from-orange-700{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.md\:from-orange-800{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.md\:from-orange-900{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.md\:from-yellow-100{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.md\:from-yellow-200{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.md\:from-yellow-300{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.md\:from-yellow-400{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.md\:from-yellow-500{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.md\:from-yellow-600{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.md\:from-yellow-700{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.md\:from-yellow-800{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.md\:from-yellow-900{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.md\:from-green-100{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.md\:from-green-200{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.md\:from-green-300{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.md\:from-green-400{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.md\:from-green-500{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.md\:from-green-600{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.md\:from-green-700{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.md\:from-green-800{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.md\:from-green-900{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.md\:from-teal-100{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.md\:from-teal-200{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.md\:from-teal-300{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.md\:from-teal-400{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.md\:from-teal-500{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.md\:from-teal-600{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.md\:from-teal-700{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.md\:from-teal-800{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.md\:from-teal-900{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.md\:from-blue-100{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.md\:from-blue-200{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.md\:from-blue-300{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.md\:from-blue-400{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.md\:from-blue-500{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.md\:from-blue-600{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.md\:from-blue-700{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.md\:from-blue-800{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.md\:from-blue-900{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.md\:from-indigo-100{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.md\:from-indigo-200{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.md\:from-indigo-300{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.md\:from-indigo-400{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.md\:from-indigo-500{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.md\:from-indigo-600{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.md\:from-indigo-700{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.md\:from-indigo-800{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.md\:from-indigo-900{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.md\:from-purple-100{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.md\:from-purple-200{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.md\:from-purple-300{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.md\:from-purple-400{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.md\:from-purple-500{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.md\:from-purple-600{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.md\:from-purple-700{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.md\:from-purple-800{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.md\:from-purple-900{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.md\:from-pink-100{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.md\:from-pink-200{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.md\:from-pink-300{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.md\:from-pink-400{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.md\:from-pink-500{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.md\:from-pink-600{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.md\:from-pink-700{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.md\:from-pink-800{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.md\:from-pink-900{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.md\:via-transparent{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:via-current{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:via-black{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:via-white{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:via-gray-100{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.md\:via-gray-200{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.md\:via-gray-300{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.md\:via-gray-400{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.md\:via-gray-500{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.md\:via-gray-600{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.md\:via-gray-700{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.md\:via-gray-800{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.md\:via-gray-900{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.md\:via-red-100{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.md\:via-red-200{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.md\:via-red-300{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.md\:via-red-400{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.md\:via-red-500{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.md\:via-red-600{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.md\:via-red-700{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.md\:via-red-800{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.md\:via-red-900{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.md\:via-orange-100{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.md\:via-orange-200{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.md\:via-orange-300{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.md\:via-orange-400{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.md\:via-orange-500{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.md\:via-orange-600{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.md\:via-orange-700{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.md\:via-orange-800{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.md\:via-orange-900{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.md\:via-yellow-100{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.md\:via-yellow-200{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.md\:via-yellow-300{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.md\:via-yellow-400{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.md\:via-yellow-500{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.md\:via-yellow-600{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.md\:via-yellow-700{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.md\:via-yellow-800{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.md\:via-yellow-900{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.md\:via-green-100{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.md\:via-green-200{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.md\:via-green-300{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.md\:via-green-400{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.md\:via-green-500{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.md\:via-green-600{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.md\:via-green-700{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.md\:via-green-800{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.md\:via-green-900{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.md\:via-teal-100{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.md\:via-teal-200{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.md\:via-teal-300{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.md\:via-teal-400{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.md\:via-teal-500{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.md\:via-teal-600{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.md\:via-teal-700{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.md\:via-teal-800{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.md\:via-teal-900{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.md\:via-blue-100{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.md\:via-blue-200{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.md\:via-blue-300{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.md\:via-blue-400{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.md\:via-blue-500{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.md\:via-blue-600{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.md\:via-blue-700{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.md\:via-blue-800{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.md\:via-blue-900{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.md\:via-indigo-100{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.md\:via-indigo-200{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.md\:via-indigo-300{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.md\:via-indigo-400{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.md\:via-indigo-500{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.md\:via-indigo-600{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.md\:via-indigo-700{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.md\:via-indigo-800{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.md\:via-indigo-900{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.md\:via-purple-100{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.md\:via-purple-200{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.md\:via-purple-300{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.md\:via-purple-400{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.md\:via-purple-500{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.md\:via-purple-600{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.md\:via-purple-700{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.md\:via-purple-800{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.md\:via-purple-900{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.md\:via-pink-100{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.md\:via-pink-200{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.md\:via-pink-300{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.md\:via-pink-400{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.md\:via-pink-500{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.md\:via-pink-600{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.md\:via-pink-700{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.md\:via-pink-800{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.md\:via-pink-900{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.md\:to-transparent{--gradient-to-color:transparent}.md\:to-current{--gradient-to-color:currentColor}.md\:to-black{--gradient-to-color:#000}.md\:to-white{--gradient-to-color:#fff}.md\:to-gray-100{--gradient-to-color:#f7fafc}.md\:to-gray-200{--gradient-to-color:#edf2f7}.md\:to-gray-300{--gradient-to-color:#e2e8f0}.md\:to-gray-400{--gradient-to-color:#cbd5e0}.md\:to-gray-500{--gradient-to-color:#a0aec0}.md\:to-gray-600{--gradient-to-color:#718096}.md\:to-gray-700{--gradient-to-color:#4a5568}.md\:to-gray-800{--gradient-to-color:#2d3748}.md\:to-gray-900{--gradient-to-color:#1a202c}.md\:to-red-100{--gradient-to-color:#fff5f5}.md\:to-red-200{--gradient-to-color:#fed7d7}.md\:to-red-300{--gradient-to-color:#feb2b2}.md\:to-red-400{--gradient-to-color:#fc8181}.md\:to-red-500{--gradient-to-color:#f56565}.md\:to-red-600{--gradient-to-color:#e53e3e}.md\:to-red-700{--gradient-to-color:#c53030}.md\:to-red-800{--gradient-to-color:#9b2c2c}.md\:to-red-900{--gradient-to-color:#742a2a}.md\:to-orange-100{--gradient-to-color:#fffaf0}.md\:to-orange-200{--gradient-to-color:#feebc8}.md\:to-orange-300{--gradient-to-color:#fbd38d}.md\:to-orange-400{--gradient-to-color:#f6ad55}.md\:to-orange-500{--gradient-to-color:#ed8936}.md\:to-orange-600{--gradient-to-color:#dd6b20}.md\:to-orange-700{--gradient-to-color:#c05621}.md\:to-orange-800{--gradient-to-color:#9c4221}.md\:to-orange-900{--gradient-to-color:#7b341e}.md\:to-yellow-100{--gradient-to-color:#fffff0}.md\:to-yellow-200{--gradient-to-color:#fefcbf}.md\:to-yellow-300{--gradient-to-color:#faf089}.md\:to-yellow-400{--gradient-to-color:#f6e05e}.md\:to-yellow-500{--gradient-to-color:#ecc94b}.md\:to-yellow-600{--gradient-to-color:#d69e2e}.md\:to-yellow-700{--gradient-to-color:#b7791f}.md\:to-yellow-800{--gradient-to-color:#975a16}.md\:to-yellow-900{--gradient-to-color:#744210}.md\:to-green-100{--gradient-to-color:#f0fff4}.md\:to-green-200{--gradient-to-color:#c6f6d5}.md\:to-green-300{--gradient-to-color:#9ae6b4}.md\:to-green-400{--gradient-to-color:#68d391}.md\:to-green-500{--gradient-to-color:#48bb78}.md\:to-green-600{--gradient-to-color:#38a169}.md\:to-green-700{--gradient-to-color:#2f855a}.md\:to-green-800{--gradient-to-color:#276749}.md\:to-green-900{--gradient-to-color:#22543d}.md\:to-teal-100{--gradient-to-color:#e6fffa}.md\:to-teal-200{--gradient-to-color:#b2f5ea}.md\:to-teal-300{--gradient-to-color:#81e6d9}.md\:to-teal-400{--gradient-to-color:#4fd1c5}.md\:to-teal-500{--gradient-to-color:#38b2ac}.md\:to-teal-600{--gradient-to-color:#319795}.md\:to-teal-700{--gradient-to-color:#2c7a7b}.md\:to-teal-800{--gradient-to-color:#285e61}.md\:to-teal-900{--gradient-to-color:#234e52}.md\:to-blue-100{--gradient-to-color:#ebf8ff}.md\:to-blue-200{--gradient-to-color:#bee3f8}.md\:to-blue-300{--gradient-to-color:#90cdf4}.md\:to-blue-400{--gradient-to-color:#63b3ed}.md\:to-blue-500{--gradient-to-color:#4299e1}.md\:to-blue-600{--gradient-to-color:#3182ce}.md\:to-blue-700{--gradient-to-color:#2b6cb0}.md\:to-blue-800{--gradient-to-color:#2c5282}.md\:to-blue-900{--gradient-to-color:#2a4365}.md\:to-indigo-100{--gradient-to-color:#ebf4ff}.md\:to-indigo-200{--gradient-to-color:#c3dafe}.md\:to-indigo-300{--gradient-to-color:#a3bffa}.md\:to-indigo-400{--gradient-to-color:#7f9cf5}.md\:to-indigo-500{--gradient-to-color:#667eea}.md\:to-indigo-600{--gradient-to-color:#5a67d8}.md\:to-indigo-700{--gradient-to-color:#4c51bf}.md\:to-indigo-800{--gradient-to-color:#434190}.md\:to-indigo-900{--gradient-to-color:#3c366b}.md\:to-purple-100{--gradient-to-color:#faf5ff}.md\:to-purple-200{--gradient-to-color:#e9d8fd}.md\:to-purple-300{--gradient-to-color:#d6bcfa}.md\:to-purple-400{--gradient-to-color:#b794f4}.md\:to-purple-500{--gradient-to-color:#9f7aea}.md\:to-purple-600{--gradient-to-color:#805ad5}.md\:to-purple-700{--gradient-to-color:#6b46c1}.md\:to-purple-800{--gradient-to-color:#553c9a}.md\:to-purple-900{--gradient-to-color:#44337a}.md\:to-pink-100{--gradient-to-color:#fff5f7}.md\:to-pink-200{--gradient-to-color:#fed7e2}.md\:to-pink-300{--gradient-to-color:#fbb6ce}.md\:to-pink-400{--gradient-to-color:#f687b3}.md\:to-pink-500{--gradient-to-color:#ed64a6}.md\:to-pink-600{--gradient-to-color:#d53f8c}.md\:to-pink-700{--gradient-to-color:#b83280}.md\:to-pink-800{--gradient-to-color:#97266d}.md\:to-pink-900{--gradient-to-color:#702459}.md\:hover\:from-transparent:hover{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:hover\:from-current:hover{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:hover\:from-black:hover{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:hover\:from-white:hover{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:hover\:from-gray-100:hover{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.md\:hover\:from-gray-200:hover{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.md\:hover\:from-gray-300:hover{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.md\:hover\:from-gray-400:hover{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.md\:hover\:from-gray-500:hover{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.md\:hover\:from-gray-600:hover{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.md\:hover\:from-gray-700:hover{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.md\:hover\:from-gray-800:hover{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.md\:hover\:from-gray-900:hover{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.md\:hover\:from-red-100:hover{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.md\:hover\:from-red-200:hover{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.md\:hover\:from-red-300:hover{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.md\:hover\:from-red-400:hover{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.md\:hover\:from-red-500:hover{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.md\:hover\:from-red-600:hover{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.md\:hover\:from-red-700:hover{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.md\:hover\:from-red-800:hover{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.md\:hover\:from-red-900:hover{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.md\:hover\:from-orange-100:hover{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.md\:hover\:from-orange-200:hover{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.md\:hover\:from-orange-300:hover{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.md\:hover\:from-orange-400:hover{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.md\:hover\:from-orange-500:hover{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.md\:hover\:from-orange-600:hover{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.md\:hover\:from-orange-700:hover{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.md\:hover\:from-orange-800:hover{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.md\:hover\:from-orange-900:hover{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.md\:hover\:from-yellow-100:hover{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.md\:hover\:from-yellow-200:hover{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.md\:hover\:from-yellow-300:hover{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.md\:hover\:from-yellow-400:hover{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.md\:hover\:from-yellow-500:hover{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.md\:hover\:from-yellow-600:hover{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.md\:hover\:from-yellow-700:hover{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.md\:hover\:from-yellow-800:hover{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.md\:hover\:from-yellow-900:hover{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.md\:hover\:from-green-100:hover{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.md\:hover\:from-green-200:hover{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.md\:hover\:from-green-300:hover{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.md\:hover\:from-green-400:hover{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.md\:hover\:from-green-500:hover{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.md\:hover\:from-green-600:hover{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.md\:hover\:from-green-700:hover{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.md\:hover\:from-green-800:hover{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.md\:hover\:from-green-900:hover{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.md\:hover\:from-teal-100:hover{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.md\:hover\:from-teal-200:hover{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.md\:hover\:from-teal-300:hover{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.md\:hover\:from-teal-400:hover{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.md\:hover\:from-teal-500:hover{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.md\:hover\:from-teal-600:hover{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.md\:hover\:from-teal-700:hover{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.md\:hover\:from-teal-800:hover{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.md\:hover\:from-teal-900:hover{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.md\:hover\:from-blue-100:hover{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.md\:hover\:from-blue-200:hover{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.md\:hover\:from-blue-300:hover{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.md\:hover\:from-blue-400:hover{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.md\:hover\:from-blue-500:hover{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.md\:hover\:from-blue-600:hover{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.md\:hover\:from-blue-700:hover{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.md\:hover\:from-blue-800:hover{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.md\:hover\:from-blue-900:hover{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.md\:hover\:from-indigo-100:hover{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.md\:hover\:from-indigo-200:hover{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.md\:hover\:from-indigo-300:hover{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.md\:hover\:from-indigo-400:hover{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.md\:hover\:from-indigo-500:hover{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.md\:hover\:from-indigo-600:hover{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.md\:hover\:from-indigo-700:hover{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.md\:hover\:from-indigo-800:hover{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.md\:hover\:from-indigo-900:hover{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.md\:hover\:from-purple-100:hover{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.md\:hover\:from-purple-200:hover{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.md\:hover\:from-purple-300:hover{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.md\:hover\:from-purple-400:hover{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.md\:hover\:from-purple-500:hover{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.md\:hover\:from-purple-600:hover{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.md\:hover\:from-purple-700:hover{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.md\:hover\:from-purple-800:hover{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.md\:hover\:from-purple-900:hover{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.md\:hover\:from-pink-100:hover{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.md\:hover\:from-pink-200:hover{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.md\:hover\:from-pink-300:hover{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.md\:hover\:from-pink-400:hover{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.md\:hover\:from-pink-500:hover{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.md\:hover\:from-pink-600:hover{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.md\:hover\:from-pink-700:hover{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.md\:hover\:from-pink-800:hover{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.md\:hover\:from-pink-900:hover{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.md\:hover\:via-transparent:hover{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:hover\:via-current:hover{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:hover\:via-black:hover{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:hover\:via-white:hover{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:hover\:via-gray-100:hover{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.md\:hover\:via-gray-200:hover{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.md\:hover\:via-gray-300:hover{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.md\:hover\:via-gray-400:hover{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.md\:hover\:via-gray-500:hover{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.md\:hover\:via-gray-600:hover{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.md\:hover\:via-gray-700:hover{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.md\:hover\:via-gray-800:hover{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.md\:hover\:via-gray-900:hover{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.md\:hover\:via-red-100:hover{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.md\:hover\:via-red-200:hover{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.md\:hover\:via-red-300:hover{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.md\:hover\:via-red-400:hover{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.md\:hover\:via-red-500:hover{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.md\:hover\:via-red-600:hover{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.md\:hover\:via-red-700:hover{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.md\:hover\:via-red-800:hover{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.md\:hover\:via-red-900:hover{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.md\:hover\:via-orange-100:hover{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.md\:hover\:via-orange-200:hover{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.md\:hover\:via-orange-300:hover{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.md\:hover\:via-orange-400:hover{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.md\:hover\:via-orange-500:hover{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.md\:hover\:via-orange-600:hover{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.md\:hover\:via-orange-700:hover{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.md\:hover\:via-orange-800:hover{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.md\:hover\:via-orange-900:hover{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.md\:hover\:via-yellow-100:hover{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.md\:hover\:via-yellow-200:hover{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.md\:hover\:via-yellow-300:hover{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.md\:hover\:via-yellow-400:hover{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.md\:hover\:via-yellow-500:hover{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.md\:hover\:via-yellow-600:hover{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.md\:hover\:via-yellow-700:hover{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.md\:hover\:via-yellow-800:hover{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.md\:hover\:via-yellow-900:hover{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.md\:hover\:via-green-100:hover{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.md\:hover\:via-green-200:hover{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.md\:hover\:via-green-300:hover{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.md\:hover\:via-green-400:hover{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.md\:hover\:via-green-500:hover{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.md\:hover\:via-green-600:hover{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.md\:hover\:via-green-700:hover{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.md\:hover\:via-green-800:hover{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.md\:hover\:via-green-900:hover{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.md\:hover\:via-teal-100:hover{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.md\:hover\:via-teal-200:hover{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.md\:hover\:via-teal-300:hover{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.md\:hover\:via-teal-400:hover{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.md\:hover\:via-teal-500:hover{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.md\:hover\:via-teal-600:hover{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.md\:hover\:via-teal-700:hover{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.md\:hover\:via-teal-800:hover{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.md\:hover\:via-teal-900:hover{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.md\:hover\:via-blue-100:hover{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.md\:hover\:via-blue-200:hover{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.md\:hover\:via-blue-300:hover{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.md\:hover\:via-blue-400:hover{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.md\:hover\:via-blue-500:hover{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.md\:hover\:via-blue-600:hover{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.md\:hover\:via-blue-700:hover{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.md\:hover\:via-blue-800:hover{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.md\:hover\:via-blue-900:hover{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.md\:hover\:via-indigo-100:hover{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.md\:hover\:via-indigo-200:hover{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.md\:hover\:via-indigo-300:hover{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.md\:hover\:via-indigo-400:hover{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.md\:hover\:via-indigo-500:hover{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.md\:hover\:via-indigo-600:hover{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.md\:hover\:via-indigo-700:hover{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.md\:hover\:via-indigo-800:hover{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.md\:hover\:via-indigo-900:hover{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.md\:hover\:via-purple-100:hover{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.md\:hover\:via-purple-200:hover{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.md\:hover\:via-purple-300:hover{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.md\:hover\:via-purple-400:hover{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.md\:hover\:via-purple-500:hover{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.md\:hover\:via-purple-600:hover{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.md\:hover\:via-purple-700:hover{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.md\:hover\:via-purple-800:hover{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.md\:hover\:via-purple-900:hover{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.md\:hover\:via-pink-100:hover{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.md\:hover\:via-pink-200:hover{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.md\:hover\:via-pink-300:hover{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.md\:hover\:via-pink-400:hover{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.md\:hover\:via-pink-500:hover{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.md\:hover\:via-pink-600:hover{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.md\:hover\:via-pink-700:hover{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.md\:hover\:via-pink-800:hover{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.md\:hover\:via-pink-900:hover{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.md\:hover\:to-transparent:hover{--gradient-to-color:transparent}.md\:hover\:to-current:hover{--gradient-to-color:currentColor}.md\:hover\:to-black:hover{--gradient-to-color:#000}.md\:hover\:to-white:hover{--gradient-to-color:#fff}.md\:hover\:to-gray-100:hover{--gradient-to-color:#f7fafc}.md\:hover\:to-gray-200:hover{--gradient-to-color:#edf2f7}.md\:hover\:to-gray-300:hover{--gradient-to-color:#e2e8f0}.md\:hover\:to-gray-400:hover{--gradient-to-color:#cbd5e0}.md\:hover\:to-gray-500:hover{--gradient-to-color:#a0aec0}.md\:hover\:to-gray-600:hover{--gradient-to-color:#718096}.md\:hover\:to-gray-700:hover{--gradient-to-color:#4a5568}.md\:hover\:to-gray-800:hover{--gradient-to-color:#2d3748}.md\:hover\:to-gray-900:hover{--gradient-to-color:#1a202c}.md\:hover\:to-red-100:hover{--gradient-to-color:#fff5f5}.md\:hover\:to-red-200:hover{--gradient-to-color:#fed7d7}.md\:hover\:to-red-300:hover{--gradient-to-color:#feb2b2}.md\:hover\:to-red-400:hover{--gradient-to-color:#fc8181}.md\:hover\:to-red-500:hover{--gradient-to-color:#f56565}.md\:hover\:to-red-600:hover{--gradient-to-color:#e53e3e}.md\:hover\:to-red-700:hover{--gradient-to-color:#c53030}.md\:hover\:to-red-800:hover{--gradient-to-color:#9b2c2c}.md\:hover\:to-red-900:hover{--gradient-to-color:#742a2a}.md\:hover\:to-orange-100:hover{--gradient-to-color:#fffaf0}.md\:hover\:to-orange-200:hover{--gradient-to-color:#feebc8}.md\:hover\:to-orange-300:hover{--gradient-to-color:#fbd38d}.md\:hover\:to-orange-400:hover{--gradient-to-color:#f6ad55}.md\:hover\:to-orange-500:hover{--gradient-to-color:#ed8936}.md\:hover\:to-orange-600:hover{--gradient-to-color:#dd6b20}.md\:hover\:to-orange-700:hover{--gradient-to-color:#c05621}.md\:hover\:to-orange-800:hover{--gradient-to-color:#9c4221}.md\:hover\:to-orange-900:hover{--gradient-to-color:#7b341e}.md\:hover\:to-yellow-100:hover{--gradient-to-color:#fffff0}.md\:hover\:to-yellow-200:hover{--gradient-to-color:#fefcbf}.md\:hover\:to-yellow-300:hover{--gradient-to-color:#faf089}.md\:hover\:to-yellow-400:hover{--gradient-to-color:#f6e05e}.md\:hover\:to-yellow-500:hover{--gradient-to-color:#ecc94b}.md\:hover\:to-yellow-600:hover{--gradient-to-color:#d69e2e}.md\:hover\:to-yellow-700:hover{--gradient-to-color:#b7791f}.md\:hover\:to-yellow-800:hover{--gradient-to-color:#975a16}.md\:hover\:to-yellow-900:hover{--gradient-to-color:#744210}.md\:hover\:to-green-100:hover{--gradient-to-color:#f0fff4}.md\:hover\:to-green-200:hover{--gradient-to-color:#c6f6d5}.md\:hover\:to-green-300:hover{--gradient-to-color:#9ae6b4}.md\:hover\:to-green-400:hover{--gradient-to-color:#68d391}.md\:hover\:to-green-500:hover{--gradient-to-color:#48bb78}.md\:hover\:to-green-600:hover{--gradient-to-color:#38a169}.md\:hover\:to-green-700:hover{--gradient-to-color:#2f855a}.md\:hover\:to-green-800:hover{--gradient-to-color:#276749}.md\:hover\:to-green-900:hover{--gradient-to-color:#22543d}.md\:hover\:to-teal-100:hover{--gradient-to-color:#e6fffa}.md\:hover\:to-teal-200:hover{--gradient-to-color:#b2f5ea}.md\:hover\:to-teal-300:hover{--gradient-to-color:#81e6d9}.md\:hover\:to-teal-400:hover{--gradient-to-color:#4fd1c5}.md\:hover\:to-teal-500:hover{--gradient-to-color:#38b2ac}.md\:hover\:to-teal-600:hover{--gradient-to-color:#319795}.md\:hover\:to-teal-700:hover{--gradient-to-color:#2c7a7b}.md\:hover\:to-teal-800:hover{--gradient-to-color:#285e61}.md\:hover\:to-teal-900:hover{--gradient-to-color:#234e52}.md\:hover\:to-blue-100:hover{--gradient-to-color:#ebf8ff}.md\:hover\:to-blue-200:hover{--gradient-to-color:#bee3f8}.md\:hover\:to-blue-300:hover{--gradient-to-color:#90cdf4}.md\:hover\:to-blue-400:hover{--gradient-to-color:#63b3ed}.md\:hover\:to-blue-500:hover{--gradient-to-color:#4299e1}.md\:hover\:to-blue-600:hover{--gradient-to-color:#3182ce}.md\:hover\:to-blue-700:hover{--gradient-to-color:#2b6cb0}.md\:hover\:to-blue-800:hover{--gradient-to-color:#2c5282}.md\:hover\:to-blue-900:hover{--gradient-to-color:#2a4365}.md\:hover\:to-indigo-100:hover{--gradient-to-color:#ebf4ff}.md\:hover\:to-indigo-200:hover{--gradient-to-color:#c3dafe}.md\:hover\:to-indigo-300:hover{--gradient-to-color:#a3bffa}.md\:hover\:to-indigo-400:hover{--gradient-to-color:#7f9cf5}.md\:hover\:to-indigo-500:hover{--gradient-to-color:#667eea}.md\:hover\:to-indigo-600:hover{--gradient-to-color:#5a67d8}.md\:hover\:to-indigo-700:hover{--gradient-to-color:#4c51bf}.md\:hover\:to-indigo-800:hover{--gradient-to-color:#434190}.md\:hover\:to-indigo-900:hover{--gradient-to-color:#3c366b}.md\:hover\:to-purple-100:hover{--gradient-to-color:#faf5ff}.md\:hover\:to-purple-200:hover{--gradient-to-color:#e9d8fd}.md\:hover\:to-purple-300:hover{--gradient-to-color:#d6bcfa}.md\:hover\:to-purple-400:hover{--gradient-to-color:#b794f4}.md\:hover\:to-purple-500:hover{--gradient-to-color:#9f7aea}.md\:hover\:to-purple-600:hover{--gradient-to-color:#805ad5}.md\:hover\:to-purple-700:hover{--gradient-to-color:#6b46c1}.md\:hover\:to-purple-800:hover{--gradient-to-color:#553c9a}.md\:hover\:to-purple-900:hover{--gradient-to-color:#44337a}.md\:hover\:to-pink-100:hover{--gradient-to-color:#fff5f7}.md\:hover\:to-pink-200:hover{--gradient-to-color:#fed7e2}.md\:hover\:to-pink-300:hover{--gradient-to-color:#fbb6ce}.md\:hover\:to-pink-400:hover{--gradient-to-color:#f687b3}.md\:hover\:to-pink-500:hover{--gradient-to-color:#ed64a6}.md\:hover\:to-pink-600:hover{--gradient-to-color:#d53f8c}.md\:hover\:to-pink-700:hover{--gradient-to-color:#b83280}.md\:hover\:to-pink-800:hover{--gradient-to-color:#97266d}.md\:hover\:to-pink-900:hover{--gradient-to-color:#702459}.md\:focus\:from-transparent:focus{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:focus\:from-current:focus{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:focus\:from-black:focus{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:focus\:from-white:focus{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:focus\:from-gray-100:focus{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.md\:focus\:from-gray-200:focus{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.md\:focus\:from-gray-300:focus{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.md\:focus\:from-gray-400:focus{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.md\:focus\:from-gray-500:focus{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.md\:focus\:from-gray-600:focus{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.md\:focus\:from-gray-700:focus{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.md\:focus\:from-gray-800:focus{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.md\:focus\:from-gray-900:focus{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.md\:focus\:from-red-100:focus{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.md\:focus\:from-red-200:focus{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.md\:focus\:from-red-300:focus{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.md\:focus\:from-red-400:focus{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.md\:focus\:from-red-500:focus{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.md\:focus\:from-red-600:focus{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.md\:focus\:from-red-700:focus{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.md\:focus\:from-red-800:focus{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.md\:focus\:from-red-900:focus{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.md\:focus\:from-orange-100:focus{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.md\:focus\:from-orange-200:focus{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.md\:focus\:from-orange-300:focus{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.md\:focus\:from-orange-400:focus{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.md\:focus\:from-orange-500:focus{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.md\:focus\:from-orange-600:focus{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.md\:focus\:from-orange-700:focus{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.md\:focus\:from-orange-800:focus{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.md\:focus\:from-orange-900:focus{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.md\:focus\:from-yellow-100:focus{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.md\:focus\:from-yellow-200:focus{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.md\:focus\:from-yellow-300:focus{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.md\:focus\:from-yellow-400:focus{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.md\:focus\:from-yellow-500:focus{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.md\:focus\:from-yellow-600:focus{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.md\:focus\:from-yellow-700:focus{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.md\:focus\:from-yellow-800:focus{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.md\:focus\:from-yellow-900:focus{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.md\:focus\:from-green-100:focus{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.md\:focus\:from-green-200:focus{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.md\:focus\:from-green-300:focus{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.md\:focus\:from-green-400:focus{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.md\:focus\:from-green-500:focus{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.md\:focus\:from-green-600:focus{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.md\:focus\:from-green-700:focus{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.md\:focus\:from-green-800:focus{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.md\:focus\:from-green-900:focus{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.md\:focus\:from-teal-100:focus{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.md\:focus\:from-teal-200:focus{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.md\:focus\:from-teal-300:focus{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.md\:focus\:from-teal-400:focus{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.md\:focus\:from-teal-500:focus{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.md\:focus\:from-teal-600:focus{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.md\:focus\:from-teal-700:focus{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.md\:focus\:from-teal-800:focus{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.md\:focus\:from-teal-900:focus{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.md\:focus\:from-blue-100:focus{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.md\:focus\:from-blue-200:focus{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.md\:focus\:from-blue-300:focus{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.md\:focus\:from-blue-400:focus{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.md\:focus\:from-blue-500:focus{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.md\:focus\:from-blue-600:focus{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.md\:focus\:from-blue-700:focus{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.md\:focus\:from-blue-800:focus{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.md\:focus\:from-blue-900:focus{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.md\:focus\:from-indigo-100:focus{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.md\:focus\:from-indigo-200:focus{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.md\:focus\:from-indigo-300:focus{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.md\:focus\:from-indigo-400:focus{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.md\:focus\:from-indigo-500:focus{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.md\:focus\:from-indigo-600:focus{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.md\:focus\:from-indigo-700:focus{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.md\:focus\:from-indigo-800:focus{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.md\:focus\:from-indigo-900:focus{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.md\:focus\:from-purple-100:focus{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.md\:focus\:from-purple-200:focus{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.md\:focus\:from-purple-300:focus{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.md\:focus\:from-purple-400:focus{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.md\:focus\:from-purple-500:focus{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.md\:focus\:from-purple-600:focus{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.md\:focus\:from-purple-700:focus{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.md\:focus\:from-purple-800:focus{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.md\:focus\:from-purple-900:focus{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.md\:focus\:from-pink-100:focus{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.md\:focus\:from-pink-200:focus{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.md\:focus\:from-pink-300:focus{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.md\:focus\:from-pink-400:focus{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.md\:focus\:from-pink-500:focus{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.md\:focus\:from-pink-600:focus{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.md\:focus\:from-pink-700:focus{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.md\:focus\:from-pink-800:focus{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.md\:focus\:from-pink-900:focus{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.md\:focus\:via-transparent:focus{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:focus\:via-current:focus{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:focus\:via-black:focus{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:focus\:via-white:focus{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:focus\:via-gray-100:focus{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.md\:focus\:via-gray-200:focus{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.md\:focus\:via-gray-300:focus{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.md\:focus\:via-gray-400:focus{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.md\:focus\:via-gray-500:focus{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.md\:focus\:via-gray-600:focus{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.md\:focus\:via-gray-700:focus{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.md\:focus\:via-gray-800:focus{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.md\:focus\:via-gray-900:focus{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.md\:focus\:via-red-100:focus{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.md\:focus\:via-red-200:focus{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.md\:focus\:via-red-300:focus{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.md\:focus\:via-red-400:focus{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.md\:focus\:via-red-500:focus{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.md\:focus\:via-red-600:focus{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.md\:focus\:via-red-700:focus{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.md\:focus\:via-red-800:focus{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.md\:focus\:via-red-900:focus{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.md\:focus\:via-orange-100:focus{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.md\:focus\:via-orange-200:focus{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.md\:focus\:via-orange-300:focus{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.md\:focus\:via-orange-400:focus{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.md\:focus\:via-orange-500:focus{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.md\:focus\:via-orange-600:focus{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.md\:focus\:via-orange-700:focus{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.md\:focus\:via-orange-800:focus{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.md\:focus\:via-orange-900:focus{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.md\:focus\:via-yellow-100:focus{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.md\:focus\:via-yellow-200:focus{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.md\:focus\:via-yellow-300:focus{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.md\:focus\:via-yellow-400:focus{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.md\:focus\:via-yellow-500:focus{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.md\:focus\:via-yellow-600:focus{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.md\:focus\:via-yellow-700:focus{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.md\:focus\:via-yellow-800:focus{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.md\:focus\:via-yellow-900:focus{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.md\:focus\:via-green-100:focus{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.md\:focus\:via-green-200:focus{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.md\:focus\:via-green-300:focus{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.md\:focus\:via-green-400:focus{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.md\:focus\:via-green-500:focus{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.md\:focus\:via-green-600:focus{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.md\:focus\:via-green-700:focus{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.md\:focus\:via-green-800:focus{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.md\:focus\:via-green-900:focus{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.md\:focus\:via-teal-100:focus{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.md\:focus\:via-teal-200:focus{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.md\:focus\:via-teal-300:focus{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.md\:focus\:via-teal-400:focus{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.md\:focus\:via-teal-500:focus{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.md\:focus\:via-teal-600:focus{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.md\:focus\:via-teal-700:focus{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.md\:focus\:via-teal-800:focus{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.md\:focus\:via-teal-900:focus{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.md\:focus\:via-blue-100:focus{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.md\:focus\:via-blue-200:focus{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.md\:focus\:via-blue-300:focus{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.md\:focus\:via-blue-400:focus{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.md\:focus\:via-blue-500:focus{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.md\:focus\:via-blue-600:focus{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.md\:focus\:via-blue-700:focus{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.md\:focus\:via-blue-800:focus{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.md\:focus\:via-blue-900:focus{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.md\:focus\:via-indigo-100:focus{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.md\:focus\:via-indigo-200:focus{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.md\:focus\:via-indigo-300:focus{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.md\:focus\:via-indigo-400:focus{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.md\:focus\:via-indigo-500:focus{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.md\:focus\:via-indigo-600:focus{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.md\:focus\:via-indigo-700:focus{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.md\:focus\:via-indigo-800:focus{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.md\:focus\:via-indigo-900:focus{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.md\:focus\:via-purple-100:focus{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.md\:focus\:via-purple-200:focus{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.md\:focus\:via-purple-300:focus{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.md\:focus\:via-purple-400:focus{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.md\:focus\:via-purple-500:focus{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.md\:focus\:via-purple-600:focus{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.md\:focus\:via-purple-700:focus{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.md\:focus\:via-purple-800:focus{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.md\:focus\:via-purple-900:focus{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.md\:focus\:via-pink-100:focus{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.md\:focus\:via-pink-200:focus{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.md\:focus\:via-pink-300:focus{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.md\:focus\:via-pink-400:focus{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.md\:focus\:via-pink-500:focus{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.md\:focus\:via-pink-600:focus{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.md\:focus\:via-pink-700:focus{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.md\:focus\:via-pink-800:focus{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.md\:focus\:via-pink-900:focus{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.md\:focus\:to-transparent:focus{--gradient-to-color:transparent}.md\:focus\:to-current:focus{--gradient-to-color:currentColor}.md\:focus\:to-black:focus{--gradient-to-color:#000}.md\:focus\:to-white:focus{--gradient-to-color:#fff}.md\:focus\:to-gray-100:focus{--gradient-to-color:#f7fafc}.md\:focus\:to-gray-200:focus{--gradient-to-color:#edf2f7}.md\:focus\:to-gray-300:focus{--gradient-to-color:#e2e8f0}.md\:focus\:to-gray-400:focus{--gradient-to-color:#cbd5e0}.md\:focus\:to-gray-500:focus{--gradient-to-color:#a0aec0}.md\:focus\:to-gray-600:focus{--gradient-to-color:#718096}.md\:focus\:to-gray-700:focus{--gradient-to-color:#4a5568}.md\:focus\:to-gray-800:focus{--gradient-to-color:#2d3748}.md\:focus\:to-gray-900:focus{--gradient-to-color:#1a202c}.md\:focus\:to-red-100:focus{--gradient-to-color:#fff5f5}.md\:focus\:to-red-200:focus{--gradient-to-color:#fed7d7}.md\:focus\:to-red-300:focus{--gradient-to-color:#feb2b2}.md\:focus\:to-red-400:focus{--gradient-to-color:#fc8181}.md\:focus\:to-red-500:focus{--gradient-to-color:#f56565}.md\:focus\:to-red-600:focus{--gradient-to-color:#e53e3e}.md\:focus\:to-red-700:focus{--gradient-to-color:#c53030}.md\:focus\:to-red-800:focus{--gradient-to-color:#9b2c2c}.md\:focus\:to-red-900:focus{--gradient-to-color:#742a2a}.md\:focus\:to-orange-100:focus{--gradient-to-color:#fffaf0}.md\:focus\:to-orange-200:focus{--gradient-to-color:#feebc8}.md\:focus\:to-orange-300:focus{--gradient-to-color:#fbd38d}.md\:focus\:to-orange-400:focus{--gradient-to-color:#f6ad55}.md\:focus\:to-orange-500:focus{--gradient-to-color:#ed8936}.md\:focus\:to-orange-600:focus{--gradient-to-color:#dd6b20}.md\:focus\:to-orange-700:focus{--gradient-to-color:#c05621}.md\:focus\:to-orange-800:focus{--gradient-to-color:#9c4221}.md\:focus\:to-orange-900:focus{--gradient-to-color:#7b341e}.md\:focus\:to-yellow-100:focus{--gradient-to-color:#fffff0}.md\:focus\:to-yellow-200:focus{--gradient-to-color:#fefcbf}.md\:focus\:to-yellow-300:focus{--gradient-to-color:#faf089}.md\:focus\:to-yellow-400:focus{--gradient-to-color:#f6e05e}.md\:focus\:to-yellow-500:focus{--gradient-to-color:#ecc94b}.md\:focus\:to-yellow-600:focus{--gradient-to-color:#d69e2e}.md\:focus\:to-yellow-700:focus{--gradient-to-color:#b7791f}.md\:focus\:to-yellow-800:focus{--gradient-to-color:#975a16}.md\:focus\:to-yellow-900:focus{--gradient-to-color:#744210}.md\:focus\:to-green-100:focus{--gradient-to-color:#f0fff4}.md\:focus\:to-green-200:focus{--gradient-to-color:#c6f6d5}.md\:focus\:to-green-300:focus{--gradient-to-color:#9ae6b4}.md\:focus\:to-green-400:focus{--gradient-to-color:#68d391}.md\:focus\:to-green-500:focus{--gradient-to-color:#48bb78}.md\:focus\:to-green-600:focus{--gradient-to-color:#38a169}.md\:focus\:to-green-700:focus{--gradient-to-color:#2f855a}.md\:focus\:to-green-800:focus{--gradient-to-color:#276749}.md\:focus\:to-green-900:focus{--gradient-to-color:#22543d}.md\:focus\:to-teal-100:focus{--gradient-to-color:#e6fffa}.md\:focus\:to-teal-200:focus{--gradient-to-color:#b2f5ea}.md\:focus\:to-teal-300:focus{--gradient-to-color:#81e6d9}.md\:focus\:to-teal-400:focus{--gradient-to-color:#4fd1c5}.md\:focus\:to-teal-500:focus{--gradient-to-color:#38b2ac}.md\:focus\:to-teal-600:focus{--gradient-to-color:#319795}.md\:focus\:to-teal-700:focus{--gradient-to-color:#2c7a7b}.md\:focus\:to-teal-800:focus{--gradient-to-color:#285e61}.md\:focus\:to-teal-900:focus{--gradient-to-color:#234e52}.md\:focus\:to-blue-100:focus{--gradient-to-color:#ebf8ff}.md\:focus\:to-blue-200:focus{--gradient-to-color:#bee3f8}.md\:focus\:to-blue-300:focus{--gradient-to-color:#90cdf4}.md\:focus\:to-blue-400:focus{--gradient-to-color:#63b3ed}.md\:focus\:to-blue-500:focus{--gradient-to-color:#4299e1}.md\:focus\:to-blue-600:focus{--gradient-to-color:#3182ce}.md\:focus\:to-blue-700:focus{--gradient-to-color:#2b6cb0}.md\:focus\:to-blue-800:focus{--gradient-to-color:#2c5282}.md\:focus\:to-blue-900:focus{--gradient-to-color:#2a4365}.md\:focus\:to-indigo-100:focus{--gradient-to-color:#ebf4ff}.md\:focus\:to-indigo-200:focus{--gradient-to-color:#c3dafe}.md\:focus\:to-indigo-300:focus{--gradient-to-color:#a3bffa}.md\:focus\:to-indigo-400:focus{--gradient-to-color:#7f9cf5}.md\:focus\:to-indigo-500:focus{--gradient-to-color:#667eea}.md\:focus\:to-indigo-600:focus{--gradient-to-color:#5a67d8}.md\:focus\:to-indigo-700:focus{--gradient-to-color:#4c51bf}.md\:focus\:to-indigo-800:focus{--gradient-to-color:#434190}.md\:focus\:to-indigo-900:focus{--gradient-to-color:#3c366b}.md\:focus\:to-purple-100:focus{--gradient-to-color:#faf5ff}.md\:focus\:to-purple-200:focus{--gradient-to-color:#e9d8fd}.md\:focus\:to-purple-300:focus{--gradient-to-color:#d6bcfa}.md\:focus\:to-purple-400:focus{--gradient-to-color:#b794f4}.md\:focus\:to-purple-500:focus{--gradient-to-color:#9f7aea}.md\:focus\:to-purple-600:focus{--gradient-to-color:#805ad5}.md\:focus\:to-purple-700:focus{--gradient-to-color:#6b46c1}.md\:focus\:to-purple-800:focus{--gradient-to-color:#553c9a}.md\:focus\:to-purple-900:focus{--gradient-to-color:#44337a}.md\:focus\:to-pink-100:focus{--gradient-to-color:#fff5f7}.md\:focus\:to-pink-200:focus{--gradient-to-color:#fed7e2}.md\:focus\:to-pink-300:focus{--gradient-to-color:#fbb6ce}.md\:focus\:to-pink-400:focus{--gradient-to-color:#f687b3}.md\:focus\:to-pink-500:focus{--gradient-to-color:#ed64a6}.md\:focus\:to-pink-600:focus{--gradient-to-color:#d53f8c}.md\:focus\:to-pink-700:focus{--gradient-to-color:#b83280}.md\:focus\:to-pink-800:focus{--gradient-to-color:#97266d}.md\:focus\:to-pink-900:focus{--gradient-to-color:#702459}.md\:bg-opacity-0{--bg-opacity:0}.md\:bg-opacity-25{--bg-opacity:0.25}.md\:bg-opacity-50{--bg-opacity:0.5}.md\:bg-opacity-75{--bg-opacity:0.75}.md\:bg-opacity-100{--bg-opacity:1}.md\:hover\:bg-opacity-0:hover{--bg-opacity:0}.md\:hover\:bg-opacity-25:hover{--bg-opacity:0.25}.md\:hover\:bg-opacity-50:hover{--bg-opacity:0.5}.md\:hover\:bg-opacity-75:hover{--bg-opacity:0.75}.md\:hover\:bg-opacity-100:hover{--bg-opacity:1}.md\:focus\:bg-opacity-0:focus{--bg-opacity:0}.md\:focus\:bg-opacity-25:focus{--bg-opacity:0.25}.md\:focus\:bg-opacity-50:focus{--bg-opacity:0.5}.md\:focus\:bg-opacity-75:focus{--bg-opacity:0.75}.md\:focus\:bg-opacity-100:focus{--bg-opacity:1}.md\:bg-bottom{background-position:bottom}.md\:bg-center{background-position:center}.md\:bg-left{background-position:left}.md\:bg-left-bottom{background-position:left bottom}.md\:bg-left-top{background-position:left top}.md\:bg-right{background-position:right}.md\:bg-right-bottom{background-position:right bottom}.md\:bg-right-top{background-position:right top}.md\:bg-top{background-position:top}.md\:bg-repeat{background-repeat:repeat}.md\:bg-no-repeat{background-repeat:no-repeat}.md\:bg-repeat-x{background-repeat:repeat-x}.md\:bg-repeat-y{background-repeat:repeat-y}.md\:bg-repeat-round{background-repeat:round}.md\:bg-repeat-space{background-repeat:space}.md\:bg-auto{background-size:auto}.md\:bg-cover{background-size:cover}.md\:bg-contain{background-size:contain}.md\:border-collapse{border-collapse:collapse}.md\:border-separate{border-collapse:separate}.md\:border-transparent{border-color:transparent}.md\:border-current{border-color:currentColor}.md\:border-black{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.md\:border-white{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.md\:border-gray-100{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.md\:border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.md\:border-gray-300{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.md\:border-gray-400{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.md\:border-gray-500{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.md\:border-gray-600{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.md\:border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.md\:border-gray-800{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.md\:border-gray-900{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.md\:border-red-100{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.md\:border-red-200{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.md\:border-red-300{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.md\:border-red-400{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.md\:border-red-500{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.md\:border-red-600{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.md\:border-red-700{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.md\:border-red-800{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.md\:border-red-900{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.md\:border-orange-100{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.md\:border-orange-200{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.md\:border-orange-300{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.md\:border-orange-400{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.md\:border-orange-500{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.md\:border-orange-600{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.md\:border-orange-700{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.md\:border-orange-800{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.md\:border-orange-900{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.md\:border-yellow-100{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.md\:border-yellow-200{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.md\:border-yellow-300{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.md\:border-yellow-400{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.md\:border-yellow-500{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.md\:border-yellow-600{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.md\:border-yellow-700{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.md\:border-yellow-800{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.md\:border-yellow-900{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.md\:border-green-100{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.md\:border-green-200{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.md\:border-green-300{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.md\:border-green-400{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.md\:border-green-500{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.md\:border-green-600{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.md\:border-green-700{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.md\:border-green-800{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.md\:border-green-900{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.md\:border-teal-100{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.md\:border-teal-200{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.md\:border-teal-300{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.md\:border-teal-400{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.md\:border-teal-500{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.md\:border-teal-600{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.md\:border-teal-700{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.md\:border-teal-800{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.md\:border-teal-900{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.md\:border-blue-100{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.md\:border-blue-200{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.md\:border-blue-300{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.md\:border-blue-400{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.md\:border-blue-500{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.md\:border-blue-600{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.md\:border-blue-700{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.md\:border-blue-800{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.md\:border-blue-900{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.md\:border-indigo-100{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.md\:border-indigo-200{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.md\:border-indigo-300{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.md\:border-indigo-400{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.md\:border-indigo-500{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.md\:border-indigo-600{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.md\:border-indigo-700{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.md\:border-indigo-800{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.md\:border-indigo-900{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.md\:border-purple-100{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.md\:border-purple-200{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.md\:border-purple-300{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.md\:border-purple-400{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.md\:border-purple-500{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.md\:border-purple-600{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.md\:border-purple-700{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.md\:border-purple-800{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.md\:border-purple-900{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.md\:border-pink-100{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.md\:border-pink-200{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.md\:border-pink-300{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.md\:border-pink-400{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.md\:border-pink-500{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.md\:border-pink-600{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.md\:border-pink-700{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.md\:border-pink-800{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.md\:border-pink-900{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.md\:hover\:border-transparent:hover{border-color:transparent}.md\:hover\:border-current:hover{border-color:currentColor}.md\:hover\:border-black:hover{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.md\:hover\:border-white:hover{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.md\:hover\:border-gray-100:hover{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.md\:hover\:border-gray-200:hover{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.md\:hover\:border-gray-300:hover{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.md\:hover\:border-gray-400:hover{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.md\:hover\:border-gray-500:hover{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.md\:hover\:border-gray-600:hover{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.md\:hover\:border-gray-700:hover{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.md\:hover\:border-gray-800:hover{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.md\:hover\:border-gray-900:hover{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.md\:hover\:border-red-100:hover{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.md\:hover\:border-red-200:hover{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.md\:hover\:border-red-300:hover{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.md\:hover\:border-red-400:hover{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.md\:hover\:border-red-500:hover{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.md\:hover\:border-red-600:hover{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.md\:hover\:border-red-700:hover{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.md\:hover\:border-red-800:hover{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.md\:hover\:border-red-900:hover{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.md\:hover\:border-orange-100:hover{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.md\:hover\:border-orange-200:hover{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.md\:hover\:border-orange-300:hover{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.md\:hover\:border-orange-400:hover{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.md\:hover\:border-orange-500:hover{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.md\:hover\:border-orange-600:hover{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.md\:hover\:border-orange-700:hover{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.md\:hover\:border-orange-800:hover{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.md\:hover\:border-orange-900:hover{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.md\:hover\:border-yellow-100:hover{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.md\:hover\:border-yellow-200:hover{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.md\:hover\:border-yellow-300:hover{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.md\:hover\:border-yellow-400:hover{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.md\:hover\:border-yellow-500:hover{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.md\:hover\:border-yellow-600:hover{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.md\:hover\:border-yellow-700:hover{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.md\:hover\:border-yellow-800:hover{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.md\:hover\:border-yellow-900:hover{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.md\:hover\:border-green-100:hover{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.md\:hover\:border-green-200:hover{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.md\:hover\:border-green-300:hover{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.md\:hover\:border-green-400:hover{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.md\:hover\:border-green-500:hover{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.md\:hover\:border-green-600:hover{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.md\:hover\:border-green-700:hover{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.md\:hover\:border-green-800:hover{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.md\:hover\:border-green-900:hover{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.md\:hover\:border-teal-100:hover{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.md\:hover\:border-teal-200:hover{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.md\:hover\:border-teal-300:hover{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.md\:hover\:border-teal-400:hover{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.md\:hover\:border-teal-500:hover{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.md\:hover\:border-teal-600:hover{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.md\:hover\:border-teal-700:hover{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.md\:hover\:border-teal-800:hover{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.md\:hover\:border-teal-900:hover{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.md\:hover\:border-blue-100:hover{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.md\:hover\:border-blue-200:hover{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.md\:hover\:border-blue-300:hover{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.md\:hover\:border-blue-400:hover{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.md\:hover\:border-blue-500:hover{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.md\:hover\:border-blue-600:hover{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.md\:hover\:border-blue-700:hover{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.md\:hover\:border-blue-800:hover{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.md\:hover\:border-blue-900:hover{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.md\:hover\:border-indigo-100:hover{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.md\:hover\:border-indigo-200:hover{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.md\:hover\:border-indigo-300:hover{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.md\:hover\:border-indigo-400:hover{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.md\:hover\:border-indigo-500:hover{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.md\:hover\:border-indigo-600:hover{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.md\:hover\:border-indigo-700:hover{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.md\:hover\:border-indigo-800:hover{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.md\:hover\:border-indigo-900:hover{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.md\:hover\:border-purple-100:hover{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.md\:hover\:border-purple-200:hover{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.md\:hover\:border-purple-300:hover{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.md\:hover\:border-purple-400:hover{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.md\:hover\:border-purple-500:hover{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.md\:hover\:border-purple-600:hover{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.md\:hover\:border-purple-700:hover{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.md\:hover\:border-purple-800:hover{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.md\:hover\:border-purple-900:hover{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.md\:hover\:border-pink-100:hover{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.md\:hover\:border-pink-200:hover{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.md\:hover\:border-pink-300:hover{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.md\:hover\:border-pink-400:hover{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.md\:hover\:border-pink-500:hover{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.md\:hover\:border-pink-600:hover{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.md\:hover\:border-pink-700:hover{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.md\:hover\:border-pink-800:hover{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.md\:hover\:border-pink-900:hover{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.md\:focus\:border-transparent:focus{border-color:transparent}.md\:focus\:border-current:focus{border-color:currentColor}.md\:focus\:border-black:focus{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.md\:focus\:border-white:focus{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.md\:focus\:border-gray-100:focus{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.md\:focus\:border-gray-200:focus{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.md\:focus\:border-gray-300:focus{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.md\:focus\:border-gray-400:focus{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.md\:focus\:border-gray-500:focus{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.md\:focus\:border-gray-600:focus{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.md\:focus\:border-gray-700:focus{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.md\:focus\:border-gray-800:focus{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.md\:focus\:border-gray-900:focus{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.md\:focus\:border-red-100:focus{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.md\:focus\:border-red-200:focus{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.md\:focus\:border-red-300:focus{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.md\:focus\:border-red-400:focus{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.md\:focus\:border-red-500:focus{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.md\:focus\:border-red-600:focus{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.md\:focus\:border-red-700:focus{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.md\:focus\:border-red-800:focus{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.md\:focus\:border-red-900:focus{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.md\:focus\:border-orange-100:focus{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.md\:focus\:border-orange-200:focus{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.md\:focus\:border-orange-300:focus{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.md\:focus\:border-orange-400:focus{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.md\:focus\:border-orange-500:focus{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.md\:focus\:border-orange-600:focus{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.md\:focus\:border-orange-700:focus{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.md\:focus\:border-orange-800:focus{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.md\:focus\:border-orange-900:focus{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.md\:focus\:border-yellow-100:focus{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.md\:focus\:border-yellow-200:focus{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.md\:focus\:border-yellow-300:focus{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.md\:focus\:border-yellow-400:focus{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.md\:focus\:border-yellow-500:focus{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.md\:focus\:border-yellow-600:focus{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.md\:focus\:border-yellow-700:focus{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.md\:focus\:border-yellow-800:focus{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.md\:focus\:border-yellow-900:focus{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.md\:focus\:border-green-100:focus{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.md\:focus\:border-green-200:focus{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.md\:focus\:border-green-300:focus{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.md\:focus\:border-green-400:focus{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.md\:focus\:border-green-500:focus{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.md\:focus\:border-green-600:focus{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.md\:focus\:border-green-700:focus{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.md\:focus\:border-green-800:focus{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.md\:focus\:border-green-900:focus{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.md\:focus\:border-teal-100:focus{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.md\:focus\:border-teal-200:focus{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.md\:focus\:border-teal-300:focus{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.md\:focus\:border-teal-400:focus{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.md\:focus\:border-teal-500:focus{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.md\:focus\:border-teal-600:focus{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.md\:focus\:border-teal-700:focus{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.md\:focus\:border-teal-800:focus{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.md\:focus\:border-teal-900:focus{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.md\:focus\:border-blue-100:focus{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.md\:focus\:border-blue-200:focus{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.md\:focus\:border-blue-300:focus{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.md\:focus\:border-blue-400:focus{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.md\:focus\:border-blue-500:focus{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.md\:focus\:border-blue-600:focus{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.md\:focus\:border-blue-700:focus{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.md\:focus\:border-blue-800:focus{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.md\:focus\:border-blue-900:focus{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.md\:focus\:border-indigo-100:focus{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.md\:focus\:border-indigo-200:focus{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.md\:focus\:border-indigo-300:focus{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.md\:focus\:border-indigo-400:focus{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.md\:focus\:border-indigo-500:focus{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.md\:focus\:border-indigo-600:focus{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.md\:focus\:border-indigo-700:focus{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.md\:focus\:border-indigo-800:focus{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.md\:focus\:border-indigo-900:focus{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.md\:focus\:border-purple-100:focus{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.md\:focus\:border-purple-200:focus{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.md\:focus\:border-purple-300:focus{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.md\:focus\:border-purple-400:focus{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.md\:focus\:border-purple-500:focus{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.md\:focus\:border-purple-600:focus{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.md\:focus\:border-purple-700:focus{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.md\:focus\:border-purple-800:focus{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.md\:focus\:border-purple-900:focus{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.md\:focus\:border-pink-100:focus{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.md\:focus\:border-pink-200:focus{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.md\:focus\:border-pink-300:focus{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.md\:focus\:border-pink-400:focus{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.md\:focus\:border-pink-500:focus{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.md\:focus\:border-pink-600:focus{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.md\:focus\:border-pink-700:focus{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.md\:focus\:border-pink-800:focus{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.md\:focus\:border-pink-900:focus{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.md\:border-opacity-0{--border-opacity:0}.md\:border-opacity-25{--border-opacity:0.25}.md\:border-opacity-50{--border-opacity:0.5}.md\:border-opacity-75{--border-opacity:0.75}.md\:border-opacity-100{--border-opacity:1}.md\:hover\:border-opacity-0:hover{--border-opacity:0}.md\:hover\:border-opacity-25:hover{--border-opacity:0.25}.md\:hover\:border-opacity-50:hover{--border-opacity:0.5}.md\:hover\:border-opacity-75:hover{--border-opacity:0.75}.md\:hover\:border-opacity-100:hover{--border-opacity:1}.md\:focus\:border-opacity-0:focus{--border-opacity:0}.md\:focus\:border-opacity-25:focus{--border-opacity:0.25}.md\:focus\:border-opacity-50:focus{--border-opacity:0.5}.md\:focus\:border-opacity-75:focus{--border-opacity:0.75}.md\:focus\:border-opacity-100:focus{--border-opacity:1}.md\:rounded-none{border-radius:0}.md\:rounded-sm{border-radius:.125rem}.md\:rounded{border-radius:.25rem}.md\:rounded-md{border-radius:.375rem}.md\:rounded-lg{border-radius:.5rem}.md\:rounded-xl{border-radius:.75rem}.md\:rounded-2xl{border-radius:1rem}.md\:rounded-3xl{border-radius:1.5rem}.md\:rounded-full{border-radius:9999px}.md\:rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.md\:rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.md\:rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.md\:rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.md\:rounded-t-sm{border-top-left-radius:.125rem;border-top-right-radius:.125rem}.md\:rounded-r-sm{border-top-right-radius:.125rem;border-bottom-right-radius:.125rem}.md\:rounded-b-sm{border-bottom-right-radius:.125rem;border-bottom-left-radius:.125rem}.md\:rounded-l-sm{border-top-left-radius:.125rem;border-bottom-left-radius:.125rem}.md\:rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.md\:rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.md\:rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.md\:rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.md\:rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.md\:rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.md\:rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.md\:rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.md\:rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.md\:rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.md\:rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.md\:rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.md\:rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.md\:rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.md\:rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.md\:rounded-l-xl{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.md\:rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.md\:rounded-r-2xl{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.md\:rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.md\:rounded-l-2xl{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.md\:rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.md\:rounded-r-3xl{border-top-right-radius:1.5rem;border-bottom-right-radius:1.5rem}.md\:rounded-b-3xl{border-bottom-right-radius:1.5rem;border-bottom-left-radius:1.5rem}.md\:rounded-l-3xl{border-top-left-radius:1.5rem;border-bottom-left-radius:1.5rem}.md\:rounded-t-full{border-top-left-radius:9999px;border-top-right-radius:9999px}.md\:rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.md\:rounded-b-full{border-bottom-right-radius:9999px;border-bottom-left-radius:9999px}.md\:rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.md\:rounded-tl-none{border-top-left-radius:0}.md\:rounded-tr-none{border-top-right-radius:0}.md\:rounded-br-none{border-bottom-right-radius:0}.md\:rounded-bl-none{border-bottom-left-radius:0}.md\:rounded-tl-sm{border-top-left-radius:.125rem}.md\:rounded-tr-sm{border-top-right-radius:.125rem}.md\:rounded-br-sm{border-bottom-right-radius:.125rem}.md\:rounded-bl-sm{border-bottom-left-radius:.125rem}.md\:rounded-tl{border-top-left-radius:.25rem}.md\:rounded-tr{border-top-right-radius:.25rem}.md\:rounded-br{border-bottom-right-radius:.25rem}.md\:rounded-bl{border-bottom-left-radius:.25rem}.md\:rounded-tl-md{border-top-left-radius:.375rem}.md\:rounded-tr-md{border-top-right-radius:.375rem}.md\:rounded-br-md{border-bottom-right-radius:.375rem}.md\:rounded-bl-md{border-bottom-left-radius:.375rem}.md\:rounded-tl-lg{border-top-left-radius:.5rem}.md\:rounded-tr-lg{border-top-right-radius:.5rem}.md\:rounded-br-lg{border-bottom-right-radius:.5rem}.md\:rounded-bl-lg{border-bottom-left-radius:.5rem}.md\:rounded-tl-xl{border-top-left-radius:.75rem}.md\:rounded-tr-xl{border-top-right-radius:.75rem}.md\:rounded-br-xl{border-bottom-right-radius:.75rem}.md\:rounded-bl-xl{border-bottom-left-radius:.75rem}.md\:rounded-tl-2xl{border-top-left-radius:1rem}.md\:rounded-tr-2xl{border-top-right-radius:1rem}.md\:rounded-br-2xl{border-bottom-right-radius:1rem}.md\:rounded-bl-2xl{border-bottom-left-radius:1rem}.md\:rounded-tl-3xl{border-top-left-radius:1.5rem}.md\:rounded-tr-3xl{border-top-right-radius:1.5rem}.md\:rounded-br-3xl{border-bottom-right-radius:1.5rem}.md\:rounded-bl-3xl{border-bottom-left-radius:1.5rem}.md\:rounded-tl-full{border-top-left-radius:9999px}.md\:rounded-tr-full{border-top-right-radius:9999px}.md\:rounded-br-full{border-bottom-right-radius:9999px}.md\:rounded-bl-full{border-bottom-left-radius:9999px}.md\:border-solid{border-style:solid}.md\:border-dashed{border-style:dashed}.md\:border-dotted{border-style:dotted}.md\:border-double{border-style:double}.md\:border-none{border-style:none}.md\:border-0{border-width:0}.md\:border-2{border-width:2px}.md\:border-4{border-width:4px}.md\:border-8{border-width:8px}.md\:border{border-width:1px}.md\:border-t-0{border-top-width:0}.md\:border-r-0{border-right-width:0}.md\:border-b-0{border-bottom-width:0}.md\:border-l-0{border-left-width:0}.md\:border-t-2{border-top-width:2px}.md\:border-r-2{border-right-width:2px}.md\:border-b-2{border-bottom-width:2px}.md\:border-l-2{border-left-width:2px}.md\:border-t-4{border-top-width:4px}.md\:border-r-4{border-right-width:4px}.md\:border-b-4{border-bottom-width:4px}.md\:border-l-4{border-left-width:4px}.md\:border-t-8{border-top-width:8px}.md\:border-r-8{border-right-width:8px}.md\:border-b-8{border-bottom-width:8px}.md\:border-l-8{border-left-width:8px}.md\:border-t{border-top-width:1px}.md\:border-r{border-right-width:1px}.md\:border-b{border-bottom-width:1px}.md\:border-l{border-left-width:1px}.md\:box-border{box-sizing:border-box}.md\:box-content{box-sizing:content-box}.md\:cursor-auto{cursor:auto}.md\:cursor-default{cursor:default}.md\:cursor-pointer{cursor:pointer}.md\:cursor-wait{cursor:wait}.md\:cursor-text{cursor:text}.md\:cursor-move{cursor:move}.md\:cursor-not-allowed{cursor:not-allowed}.md\:block{display:block}.md\:inline-block{display:inline-block}.md\:inline{display:inline}.md\:flex{display:flex}.md\:inline-flex{display:inline-flex}.md\:table{display:table}.md\:table-caption{display:table-caption}.md\:table-cell{display:table-cell}.md\:table-column{display:table-column}.md\:table-column-group{display:table-column-group}.md\:table-footer-group{display:table-footer-group}.md\:table-header-group{display:table-header-group}.md\:table-row-group{display:table-row-group}.md\:table-row{display:table-row}.md\:flow-root{display:flow-root}.md\:grid{display:grid}.md\:inline-grid{display:inline-grid}.md\:contents{display:contents}.md\:hidden{display:none}.md\:flex-row{flex-direction:row}.md\:flex-row-reverse{flex-direction:row-reverse}.md\:flex-col{flex-direction:column}.md\:flex-col-reverse{flex-direction:column-reverse}.md\:flex-wrap{flex-wrap:wrap}.md\:flex-wrap-reverse{flex-wrap:wrap-reverse}.md\:flex-no-wrap{flex-wrap:nowrap}.md\:place-items-auto{place-items:auto}.md\:place-items-start{place-items:start}.md\:place-items-end{place-items:end}.md\:place-items-center{place-items:center}.md\:place-items-stretch{place-items:stretch}.md\:place-content-center{place-content:center}.md\:place-content-start{place-content:start}.md\:place-content-end{place-content:end}.md\:place-content-between{place-content:space-between}.md\:place-content-around{place-content:space-around}.md\:place-content-evenly{place-content:space-evenly}.md\:place-content-stretch{place-content:stretch}.md\:place-self-auto{place-self:auto}.md\:place-self-start{place-self:start}.md\:place-self-end{place-self:end}.md\:place-self-center{place-self:center}.md\:place-self-stretch{place-self:stretch}.md\:items-start{align-items:flex-start}.md\:items-end{align-items:flex-end}.md\:items-center{align-items:center}.md\:items-baseline{align-items:baseline}.md\:items-stretch{align-items:stretch}.md\:content-center{align-content:center}.md\:content-start{align-content:flex-start}.md\:content-end{align-content:flex-end}.md\:content-between{align-content:space-between}.md\:content-around{align-content:space-around}.md\:content-evenly{align-content:space-evenly}.md\:self-auto{align-self:auto}.md\:self-start{align-self:flex-start}.md\:self-end{align-self:flex-end}.md\:self-center{align-self:center}.md\:self-stretch{align-self:stretch}.md\:justify-items-auto{justify-items:auto}.md\:justify-items-start{justify-items:start}.md\:justify-items-end{justify-items:end}.md\:justify-items-center{justify-items:center}.md\:justify-items-stretch{justify-items:stretch}.md\:justify-start{justify-content:flex-start}.md\:justify-end{justify-content:flex-end}.md\:justify-center{justify-content:center}.md\:justify-between{justify-content:space-between}.md\:justify-around{justify-content:space-around}.md\:justify-evenly{justify-content:space-evenly}.md\:justify-self-auto{justify-self:auto}.md\:justify-self-start{justify-self:start}.md\:justify-self-end{justify-self:end}.md\:justify-self-center{justify-self:center}.md\:justify-self-stretch{justify-self:stretch}.md\:flex-1{flex:1 1 0%}.md\:flex-auto{flex:1 1 auto}.md\:flex-initial{flex:0 1 auto}.md\:flex-none{flex:none}.md\:flex-grow-0{flex-grow:0}.md\:flex-grow{flex-grow:1}.md\:flex-shrink-0{flex-shrink:0}.md\:flex-shrink{flex-shrink:1}.md\:order-1{order:1}.md\:order-2{order:2}.md\:order-3{order:3}.md\:order-4{order:4}.md\:order-5{order:5}.md\:order-6{order:6}.md\:order-7{order:7}.md\:order-8{order:8}.md\:order-9{order:9}.md\:order-10{order:10}.md\:order-11{order:11}.md\:order-12{order:12}.md\:order-first{order:-9999}.md\:order-last{order:9999}.md\:order-none{order:0}.md\:float-right{float:right}.md\:float-left{float:left}.md\:float-none{float:none}.md\:clearfix:after{content:"";display:table;clear:both}.md\:clear-left{clear:left}.md\:clear-right{clear:right}.md\:clear-both{clear:both}.md\:clear-none{clear:none}.md\:font-sans{font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.md\:font-serif{font-family:Georgia,Cambria,"Times New Roman",Times,serif}.md\:font-mono{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.md\:font-hairline{font-weight:100}.md\:font-thin{font-weight:200}.md\:font-light{font-weight:300}.md\:font-normal{font-weight:400}.md\:font-medium{font-weight:500}.md\:font-semibold{font-weight:600}.md\:font-bold{font-weight:700}.md\:font-extrabold{font-weight:800}.md\:font-black{font-weight:900}.md\:hover\:font-hairline:hover{font-weight:100}.md\:hover\:font-thin:hover{font-weight:200}.md\:hover\:font-light:hover{font-weight:300}.md\:hover\:font-normal:hover{font-weight:400}.md\:hover\:font-medium:hover{font-weight:500}.md\:hover\:font-semibold:hover{font-weight:600}.md\:hover\:font-bold:hover{font-weight:700}.md\:hover\:font-extrabold:hover{font-weight:800}.md\:hover\:font-black:hover{font-weight:900}.md\:focus\:font-hairline:focus{font-weight:100}.md\:focus\:font-thin:focus{font-weight:200}.md\:focus\:font-light:focus{font-weight:300}.md\:focus\:font-normal:focus{font-weight:400}.md\:focus\:font-medium:focus{font-weight:500}.md\:focus\:font-semibold:focus{font-weight:600}.md\:focus\:font-bold:focus{font-weight:700}.md\:focus\:font-extrabold:focus{font-weight:800}.md\:focus\:font-black:focus{font-weight:900}.md\:h-0{height:0}.md\:h-1{height:.25rem}.md\:h-2{height:.5rem}.md\:h-3{height:.75rem}.md\:h-4{height:1rem}.md\:h-5{height:1.25rem}.md\:h-6{height:1.5rem}.md\:h-8{height:2rem}.md\:h-10{height:2.5rem}.md\:h-12{height:3rem}.md\:h-16{height:4rem}.md\:h-20{height:5rem}.md\:h-24{height:6rem}.md\:h-32{height:8rem}.md\:h-40{height:10rem}.md\:h-48{height:12rem}.md\:h-56{height:14rem}.md\:h-64{height:16rem}.md\:h-auto{height:auto}.md\:h-px{height:1px}.md\:h-full{height:100%}.md\:h-screen{height:100vh}.md\:text-xs{font-size:.75rem}.md\:text-sm{font-size:.875rem}.md\:text-base{font-size:1rem}.md\:text-lg{font-size:1.125rem}.md\:text-xl{font-size:1.25rem}.md\:text-2xl{font-size:1.5rem}.md\:text-3xl{font-size:1.875rem}.md\:text-4xl{font-size:2.25rem}.md\:text-5xl{font-size:3rem}.md\:text-6xl{font-size:4rem}.md\:leading-3{line-height:.75rem}.md\:leading-4{line-height:1rem}.md\:leading-5{line-height:1.25rem}.md\:leading-6{line-height:1.5rem}.md\:leading-7{line-height:1.75rem}.md\:leading-8{line-height:2rem}.md\:leading-9{line-height:2.25rem}.md\:leading-10{line-height:2.5rem}.md\:leading-none{line-height:1}.md\:leading-tight{line-height:1.25}.md\:leading-snug{line-height:1.375}.md\:leading-normal{line-height:1.5}.md\:leading-relaxed{line-height:1.625}.md\:leading-loose{line-height:2}.md\:list-inside{list-style-position:inside}.md\:list-outside{list-style-position:outside}.md\:list-none{list-style-type:none}.md\:list-disc{list-style-type:disc}.md\:list-decimal{list-style-type:decimal}.md\:m-0{margin:0}.md\:m-1{margin:.25rem}.md\:m-2{margin:.5rem}.md\:m-3{margin:.75rem}.md\:m-4{margin:1rem}.md\:m-5{margin:1.25rem}.md\:m-6{margin:1.5rem}.md\:m-8{margin:2rem}.md\:m-10{margin:2.5rem}.md\:m-12{margin:3rem}.md\:m-16{margin:4rem}.md\:m-20{margin:5rem}.md\:m-24{margin:6rem}.md\:m-32{margin:8rem}.md\:m-40{margin:10rem}.md\:m-48{margin:12rem}.md\:m-56{margin:14rem}.md\:m-64{margin:16rem}.md\:m-auto{margin:auto}.md\:m-px{margin:1px}.md\:-m-1{margin:-.25rem}.md\:-m-2{margin:-.5rem}.md\:-m-3{margin:-.75rem}.md\:-m-4{margin:-1rem}.md\:-m-5{margin:-1.25rem}.md\:-m-6{margin:-1.5rem}.md\:-m-8{margin:-2rem}.md\:-m-10{margin:-2.5rem}.md\:-m-12{margin:-3rem}.md\:-m-16{margin:-4rem}.md\:-m-20{margin:-5rem}.md\:-m-24{margin:-6rem}.md\:-m-32{margin:-8rem}.md\:-m-40{margin:-10rem}.md\:-m-48{margin:-12rem}.md\:-m-56{margin:-14rem}.md\:-m-64{margin:-16rem}.md\:-m-px{margin:-1px}.md\:my-0{margin-top:0;margin-bottom:0}.md\:mx-0{margin-left:0;margin-right:0}.md\:my-1{margin-top:.25rem;margin-bottom:.25rem}.md\:mx-1{margin-left:.25rem;margin-right:.25rem}.md\:my-2{margin-top:.5rem;margin-bottom:.5rem}.md\:mx-2{margin-left:.5rem;margin-right:.5rem}.md\:my-3{margin-top:.75rem;margin-bottom:.75rem}.md\:mx-3{margin-left:.75rem;margin-right:.75rem}.md\:my-4{margin-top:1rem;margin-bottom:1rem}.md\:mx-4{margin-left:1rem;margin-right:1rem}.md\:my-5{margin-top:1.25rem;margin-bottom:1.25rem}.md\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.md\:my-6{margin-top:1.5rem;margin-bottom:1.5rem}.md\:mx-6{margin-left:1.5rem;margin-right:1.5rem}.md\:my-8{margin-top:2rem;margin-bottom:2rem}.md\:mx-8{margin-left:2rem;margin-right:2rem}.md\:my-10{margin-top:2.5rem;margin-bottom:2.5rem}.md\:mx-10{margin-left:2.5rem;margin-right:2.5rem}.md\:my-12{margin-top:3rem;margin-bottom:3rem}.md\:mx-12{margin-left:3rem;margin-right:3rem}.md\:my-16{margin-top:4rem;margin-bottom:4rem}.md\:mx-16{margin-left:4rem;margin-right:4rem}.md\:my-20{margin-top:5rem;margin-bottom:5rem}.md\:mx-20{margin-left:5rem;margin-right:5rem}.md\:my-24{margin-top:6rem;margin-bottom:6rem}.md\:mx-24{margin-left:6rem;margin-right:6rem}.md\:my-32{margin-top:8rem;margin-bottom:8rem}.md\:mx-32{margin-left:8rem;margin-right:8rem}.md\:my-40{margin-top:10rem;margin-bottom:10rem}.md\:mx-40{margin-left:10rem;margin-right:10rem}.md\:my-48{margin-top:12rem;margin-bottom:12rem}.md\:mx-48{margin-left:12rem;margin-right:12rem}.md\:my-56{margin-top:14rem;margin-bottom:14rem}.md\:mx-56{margin-left:14rem;margin-right:14rem}.md\:my-64{margin-top:16rem;margin-bottom:16rem}.md\:mx-64{margin-left:16rem;margin-right:16rem}.md\:my-auto{margin-top:auto;margin-bottom:auto}.md\:mx-auto{margin-left:auto;margin-right:auto}.md\:my-px{margin-top:1px;margin-bottom:1px}.md\:mx-px{margin-left:1px;margin-right:1px}.md\:-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.md\:-mx-1{margin-left:-.25rem;margin-right:-.25rem}.md\:-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.md\:-mx-2{margin-left:-.5rem;margin-right:-.5rem}.md\:-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.md\:-mx-3{margin-left:-.75rem;margin-right:-.75rem}.md\:-my-4{margin-top:-1rem;margin-bottom:-1rem}.md\:-mx-4{margin-left:-1rem;margin-right:-1rem}.md\:-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.md\:-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.md\:-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.md\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.md\:-my-8{margin-top:-2rem;margin-bottom:-2rem}.md\:-mx-8{margin-left:-2rem;margin-right:-2rem}.md\:-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.md\:-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.md\:-my-12{margin-top:-3rem;margin-bottom:-3rem}.md\:-mx-12{margin-left:-3rem;margin-right:-3rem}.md\:-my-16{margin-top:-4rem;margin-bottom:-4rem}.md\:-mx-16{margin-left:-4rem;margin-right:-4rem}.md\:-my-20{margin-top:-5rem;margin-bottom:-5rem}.md\:-mx-20{margin-left:-5rem;margin-right:-5rem}.md\:-my-24{margin-top:-6rem;margin-bottom:-6rem}.md\:-mx-24{margin-left:-6rem;margin-right:-6rem}.md\:-my-32{margin-top:-8rem;margin-bottom:-8rem}.md\:-mx-32{margin-left:-8rem;margin-right:-8rem}.md\:-my-40{margin-top:-10rem;margin-bottom:-10rem}.md\:-mx-40{margin-left:-10rem;margin-right:-10rem}.md\:-my-48{margin-top:-12rem;margin-bottom:-12rem}.md\:-mx-48{margin-left:-12rem;margin-right:-12rem}.md\:-my-56{margin-top:-14rem;margin-bottom:-14rem}.md\:-mx-56{margin-left:-14rem;margin-right:-14rem}.md\:-my-64{margin-top:-16rem;margin-bottom:-16rem}.md\:-mx-64{margin-left:-16rem;margin-right:-16rem}.md\:-my-px{margin-top:-1px;margin-bottom:-1px}.md\:-mx-px{margin-left:-1px;margin-right:-1px}.md\:mt-0{margin-top:0}.md\:mr-0{margin-right:0}.md\:mb-0{margin-bottom:0}.md\:ml-0{margin-left:0}.md\:mt-1{margin-top:.25rem}.md\:mr-1{margin-right:.25rem}.md\:mb-1{margin-bottom:.25rem}.md\:ml-1{margin-left:.25rem}.md\:mt-2{margin-top:.5rem}.md\:mr-2{margin-right:.5rem}.md\:mb-2{margin-bottom:.5rem}.md\:ml-2{margin-left:.5rem}.md\:mt-3{margin-top:.75rem}.md\:mr-3{margin-right:.75rem}.md\:mb-3{margin-bottom:.75rem}.md\:ml-3{margin-left:.75rem}.md\:mt-4{margin-top:1rem}.md\:mr-4{margin-right:1rem}.md\:mb-4{margin-bottom:1rem}.md\:ml-4{margin-left:1rem}.md\:mt-5{margin-top:1.25rem}.md\:mr-5{margin-right:1.25rem}.md\:mb-5{margin-bottom:1.25rem}.md\:ml-5{margin-left:1.25rem}.md\:mt-6{margin-top:1.5rem}.md\:mr-6{margin-right:1.5rem}.md\:mb-6{margin-bottom:1.5rem}.md\:ml-6{margin-left:1.5rem}.md\:mt-8{margin-top:2rem}.md\:mr-8{margin-right:2rem}.md\:mb-8{margin-bottom:2rem}.md\:ml-8{margin-left:2rem}.md\:mt-10{margin-top:2.5rem}.md\:mr-10{margin-right:2.5rem}.md\:mb-10{margin-bottom:2.5rem}.md\:ml-10{margin-left:2.5rem}.md\:mt-12{margin-top:3rem}.md\:mr-12{margin-right:3rem}.md\:mb-12{margin-bottom:3rem}.md\:ml-12{margin-left:3rem}.md\:mt-16{margin-top:4rem}.md\:mr-16{margin-right:4rem}.md\:mb-16{margin-bottom:4rem}.md\:ml-16{margin-left:4rem}.md\:mt-20{margin-top:5rem}.md\:mr-20{margin-right:5rem}.md\:mb-20{margin-bottom:5rem}.md\:ml-20{margin-left:5rem}.md\:mt-24{margin-top:6rem}.md\:mr-24{margin-right:6rem}.md\:mb-24{margin-bottom:6rem}.md\:ml-24{margin-left:6rem}.md\:mt-32{margin-top:8rem}.md\:mr-32{margin-right:8rem}.md\:mb-32{margin-bottom:8rem}.md\:ml-32{margin-left:8rem}.md\:mt-40{margin-top:10rem}.md\:mr-40{margin-right:10rem}.md\:mb-40{margin-bottom:10rem}.md\:ml-40{margin-left:10rem}.md\:mt-48{margin-top:12rem}.md\:mr-48{margin-right:12rem}.md\:mb-48{margin-bottom:12rem}.md\:ml-48{margin-left:12rem}.md\:mt-56{margin-top:14rem}.md\:mr-56{margin-right:14rem}.md\:mb-56{margin-bottom:14rem}.md\:ml-56{margin-left:14rem}.md\:mt-64{margin-top:16rem}.md\:mr-64{margin-right:16rem}.md\:mb-64{margin-bottom:16rem}.md\:ml-64{margin-left:16rem}.md\:mt-auto{margin-top:auto}.md\:mr-auto{margin-right:auto}.md\:mb-auto{margin-bottom:auto}.md\:ml-auto{margin-left:auto}.md\:mt-px{margin-top:1px}.md\:mr-px{margin-right:1px}.md\:mb-px{margin-bottom:1px}.md\:ml-px{margin-left:1px}.md\:-mt-1{margin-top:-.25rem}.md\:-mr-1{margin-right:-.25rem}.md\:-mb-1{margin-bottom:-.25rem}.md\:-ml-1{margin-left:-.25rem}.md\:-mt-2{margin-top:-.5rem}.md\:-mr-2{margin-right:-.5rem}.md\:-mb-2{margin-bottom:-.5rem}.md\:-ml-2{margin-left:-.5rem}.md\:-mt-3{margin-top:-.75rem}.md\:-mr-3{margin-right:-.75rem}.md\:-mb-3{margin-bottom:-.75rem}.md\:-ml-3{margin-left:-.75rem}.md\:-mt-4{margin-top:-1rem}.md\:-mr-4{margin-right:-1rem}.md\:-mb-4{margin-bottom:-1rem}.md\:-ml-4{margin-left:-1rem}.md\:-mt-5{margin-top:-1.25rem}.md\:-mr-5{margin-right:-1.25rem}.md\:-mb-5{margin-bottom:-1.25rem}.md\:-ml-5{margin-left:-1.25rem}.md\:-mt-6{margin-top:-1.5rem}.md\:-mr-6{margin-right:-1.5rem}.md\:-mb-6{margin-bottom:-1.5rem}.md\:-ml-6{margin-left:-1.5rem}.md\:-mt-8{margin-top:-2rem}.md\:-mr-8{margin-right:-2rem}.md\:-mb-8{margin-bottom:-2rem}.md\:-ml-8{margin-left:-2rem}.md\:-mt-10{margin-top:-2.5rem}.md\:-mr-10{margin-right:-2.5rem}.md\:-mb-10{margin-bottom:-2.5rem}.md\:-ml-10{margin-left:-2.5rem}.md\:-mt-12{margin-top:-3rem}.md\:-mr-12{margin-right:-3rem}.md\:-mb-12{margin-bottom:-3rem}.md\:-ml-12{margin-left:-3rem}.md\:-mt-16{margin-top:-4rem}.md\:-mr-16{margin-right:-4rem}.md\:-mb-16{margin-bottom:-4rem}.md\:-ml-16{margin-left:-4rem}.md\:-mt-20{margin-top:-5rem}.md\:-mr-20{margin-right:-5rem}.md\:-mb-20{margin-bottom:-5rem}.md\:-ml-20{margin-left:-5rem}.md\:-mt-24{margin-top:-6rem}.md\:-mr-24{margin-right:-6rem}.md\:-mb-24{margin-bottom:-6rem}.md\:-ml-24{margin-left:-6rem}.md\:-mt-32{margin-top:-8rem}.md\:-mr-32{margin-right:-8rem}.md\:-mb-32{margin-bottom:-8rem}.md\:-ml-32{margin-left:-8rem}.md\:-mt-40{margin-top:-10rem}.md\:-mr-40{margin-right:-10rem}.md\:-mb-40{margin-bottom:-10rem}.md\:-ml-40{margin-left:-10rem}.md\:-mt-48{margin-top:-12rem}.md\:-mr-48{margin-right:-12rem}.md\:-mb-48{margin-bottom:-12rem}.md\:-ml-48{margin-left:-12rem}.md\:-mt-56{margin-top:-14rem}.md\:-mr-56{margin-right:-14rem}.md\:-mb-56{margin-bottom:-14rem}.md\:-ml-56{margin-left:-14rem}.md\:-mt-64{margin-top:-16rem}.md\:-mr-64{margin-right:-16rem}.md\:-mb-64{margin-bottom:-16rem}.md\:-ml-64{margin-left:-16rem}.md\:-mt-px{margin-top:-1px}.md\:-mr-px{margin-right:-1px}.md\:-mb-px{margin-bottom:-1px}.md\:-ml-px{margin-left:-1px}.md\:max-h-full{max-height:100%}.md\:max-h-screen{max-height:100vh}.md\:max-w-none{max-width:none}.md\:max-w-xs{max-width:20rem}.md\:max-w-sm{max-width:24rem}.md\:max-w-md{max-width:28rem}.md\:max-w-lg{max-width:32rem}.md\:max-w-xl{max-width:36rem}.md\:max-w-2xl{max-width:42rem}.md\:max-w-3xl{max-width:48rem}.md\:max-w-4xl{max-width:56rem}.md\:max-w-5xl{max-width:64rem}.md\:max-w-6xl{max-width:72rem}.md\:max-w-full{max-width:100%}.md\:max-w-screen-sm{max-width:640px}.md\:max-w-screen-md{max-width:768px}.md\:max-w-screen-lg{max-width:1024px}.md\:max-w-screen-xl{max-width:1280px}.md\:min-h-0{min-height:0}.md\:min-h-full{min-height:100%}.md\:min-h-screen{min-height:100vh}.md\:min-w-0{min-width:0}.md\:min-w-full{min-width:100%}.md\:object-contain{object-fit:contain}.md\:object-cover{object-fit:cover}.md\:object-fill{object-fit:fill}.md\:object-none{object-fit:none}.md\:object-scale-down{object-fit:scale-down}.md\:object-bottom{object-position:bottom}.md\:object-center{object-position:center}.md\:object-left{object-position:left}.md\:object-left-bottom{object-position:left bottom}.md\:object-left-top{object-position:left top}.md\:object-right{object-position:right}.md\:object-right-bottom{object-position:right bottom}.md\:object-right-top{object-position:right top}.md\:object-top{object-position:top}.md\:opacity-0{opacity:0}.md\:opacity-25{opacity:.25}.md\:opacity-50{opacity:.5}.md\:opacity-75{opacity:.75}.md\:opacity-100{opacity:1}.md\:hover\:opacity-0:hover{opacity:0}.md\:hover\:opacity-25:hover{opacity:.25}.md\:hover\:opacity-50:hover{opacity:.5}.md\:hover\:opacity-75:hover{opacity:.75}.md\:hover\:opacity-100:hover{opacity:1}.md\:focus\:opacity-0:focus{opacity:0}.md\:focus\:opacity-25:focus{opacity:.25}.md\:focus\:opacity-50:focus{opacity:.5}.md\:focus\:opacity-75:focus{opacity:.75}.md\:focus\:opacity-100:focus{opacity:1}.md\:outline-none{outline:2px solid transparent;outline-offset:2px}.md\:outline-white{outline:2px dotted #fff;outline-offset:2px}.md\:outline-black{outline:2px dotted #000;outline-offset:2px}.md\:focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.md\:focus\:outline-white:focus{outline:2px dotted #fff;outline-offset:2px}.md\:focus\:outline-black:focus{outline:2px dotted #000;outline-offset:2px}.md\:overflow-auto{overflow:auto}.md\:overflow-hidden{overflow:hidden}.md\:overflow-visible{overflow:visible}.md\:overflow-scroll{overflow:scroll}.md\:overflow-x-auto{overflow-x:auto}.md\:overflow-y-auto{overflow-y:auto}.md\:overflow-x-hidden{overflow-x:hidden}.md\:overflow-y-hidden{overflow-y:hidden}.md\:overflow-x-visible{overflow-x:visible}.md\:overflow-y-visible{overflow-y:visible}.md\:overflow-x-scroll{overflow-x:scroll}.md\:overflow-y-scroll{overflow-y:scroll}.md\:scrolling-touch{-webkit-overflow-scrolling:touch}.md\:scrolling-auto{-webkit-overflow-scrolling:auto}.md\:overscroll-auto{-ms-scroll-chaining:chained;overscroll-behavior:auto}.md\:overscroll-contain{-ms-scroll-chaining:none;overscroll-behavior:contain}.md\:overscroll-none{-ms-scroll-chaining:none;overscroll-behavior:none}.md\:overscroll-y-auto{overscroll-behavior-y:auto}.md\:overscroll-y-contain{overscroll-behavior-y:contain}.md\:overscroll-y-none{overscroll-behavior-y:none}.md\:overscroll-x-auto{overscroll-behavior-x:auto}.md\:overscroll-x-contain{overscroll-behavior-x:contain}.md\:overscroll-x-none{overscroll-behavior-x:none}.md\:p-0{padding:0}.md\:p-1{padding:.25rem}.md\:p-2{padding:.5rem}.md\:p-3{padding:.75rem}.md\:p-4{padding:1rem}.md\:p-5{padding:1.25rem}.md\:p-6{padding:1.5rem}.md\:p-8{padding:2rem}.md\:p-10{padding:2.5rem}.md\:p-12{padding:3rem}.md\:p-16{padding:4rem}.md\:p-20{padding:5rem}.md\:p-24{padding:6rem}.md\:p-32{padding:8rem}.md\:p-40{padding:10rem}.md\:p-48{padding:12rem}.md\:p-56{padding:14rem}.md\:p-64{padding:16rem}.md\:p-px{padding:1px}.md\:py-0{padding-top:0;padding-bottom:0}.md\:px-0{padding-left:0;padding-right:0}.md\:py-1{padding-top:.25rem;padding-bottom:.25rem}.md\:px-1{padding-left:.25rem;padding-right:.25rem}.md\:py-2{padding-top:.5rem;padding-bottom:.5rem}.md\:px-2{padding-left:.5rem;padding-right:.5rem}.md\:py-3{padding-top:.75rem;padding-bottom:.75rem}.md\:px-3{padding-left:.75rem;padding-right:.75rem}.md\:py-4{padding-top:1rem;padding-bottom:1rem}.md\:px-4{padding-left:1rem;padding-right:1rem}.md\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.md\:px-5{padding-left:1.25rem;padding-right:1.25rem}.md\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:py-8{padding-top:2rem;padding-bottom:2rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:py-10{padding-top:2.5rem;padding-bottom:2.5rem}.md\:px-10{padding-left:2.5rem;padding-right:2.5rem}.md\:py-12{padding-top:3rem;padding-bottom:3rem}.md\:px-12{padding-left:3rem;padding-right:3rem}.md\:py-16{padding-top:4rem;padding-bottom:4rem}.md\:px-16{padding-left:4rem;padding-right:4rem}.md\:py-20{padding-top:5rem;padding-bottom:5rem}.md\:px-20{padding-left:5rem;padding-right:5rem}.md\:py-24{padding-top:6rem;padding-bottom:6rem}.md\:px-24{padding-left:6rem;padding-right:6rem}.md\:py-32{padding-top:8rem;padding-bottom:8rem}.md\:px-32{padding-left:8rem;padding-right:8rem}.md\:py-40{padding-top:10rem;padding-bottom:10rem}.md\:px-40{padding-left:10rem;padding-right:10rem}.md\:py-48{padding-top:12rem;padding-bottom:12rem}.md\:px-48{padding-left:12rem;padding-right:12rem}.md\:py-56{padding-top:14rem;padding-bottom:14rem}.md\:px-56{padding-left:14rem;padding-right:14rem}.md\:py-64{padding-top:16rem;padding-bottom:16rem}.md\:px-64{padding-left:16rem;padding-right:16rem}.md\:py-px{padding-top:1px;padding-bottom:1px}.md\:px-px{padding-left:1px;padding-right:1px}.md\:pt-0{padding-top:0}.md\:pr-0{padding-right:0}.md\:pb-0{padding-bottom:0}.md\:pl-0{padding-left:0}.md\:pt-1{padding-top:.25rem}.md\:pr-1{padding-right:.25rem}.md\:pb-1{padding-bottom:.25rem}.md\:pl-1{padding-left:.25rem}.md\:pt-2{padding-top:.5rem}.md\:pr-2{padding-right:.5rem}.md\:pb-2{padding-bottom:.5rem}.md\:pl-2{padding-left:.5rem}.md\:pt-3{padding-top:.75rem}.md\:pr-3{padding-right:.75rem}.md\:pb-3{padding-bottom:.75rem}.md\:pl-3{padding-left:.75rem}.md\:pt-4{padding-top:1rem}.md\:pr-4{padding-right:1rem}.md\:pb-4{padding-bottom:1rem}.md\:pl-4{padding-left:1rem}.md\:pt-5{padding-top:1.25rem}.md\:pr-5{padding-right:1.25rem}.md\:pb-5{padding-bottom:1.25rem}.md\:pl-5{padding-left:1.25rem}.md\:pt-6{padding-top:1.5rem}.md\:pr-6{padding-right:1.5rem}.md\:pb-6{padding-bottom:1.5rem}.md\:pl-6{padding-left:1.5rem}.md\:pt-8{padding-top:2rem}.md\:pr-8{padding-right:2rem}.md\:pb-8{padding-bottom:2rem}.md\:pl-8{padding-left:2rem}.md\:pt-10{padding-top:2.5rem}.md\:pr-10{padding-right:2.5rem}.md\:pb-10{padding-bottom:2.5rem}.md\:pl-10{padding-left:2.5rem}.md\:pt-12{padding-top:3rem}.md\:pr-12{padding-right:3rem}.md\:pb-12{padding-bottom:3rem}.md\:pl-12{padding-left:3rem}.md\:pt-16{padding-top:4rem}.md\:pr-16{padding-right:4rem}.md\:pb-16{padding-bottom:4rem}.md\:pl-16{padding-left:4rem}.md\:pt-20{padding-top:5rem}.md\:pr-20{padding-right:5rem}.md\:pb-20{padding-bottom:5rem}.md\:pl-20{padding-left:5rem}.md\:pt-24{padding-top:6rem}.md\:pr-24{padding-right:6rem}.md\:pb-24{padding-bottom:6rem}.md\:pl-24{padding-left:6rem}.md\:pt-32{padding-top:8rem}.md\:pr-32{padding-right:8rem}.md\:pb-32{padding-bottom:8rem}.md\:pl-32{padding-left:8rem}.md\:pt-40{padding-top:10rem}.md\:pr-40{padding-right:10rem}.md\:pb-40{padding-bottom:10rem}.md\:pl-40{padding-left:10rem}.md\:pt-48{padding-top:12rem}.md\:pr-48{padding-right:12rem}.md\:pb-48{padding-bottom:12rem}.md\:pl-48{padding-left:12rem}.md\:pt-56{padding-top:14rem}.md\:pr-56{padding-right:14rem}.md\:pb-56{padding-bottom:14rem}.md\:pl-56{padding-left:14rem}.md\:pt-64{padding-top:16rem}.md\:pr-64{padding-right:16rem}.md\:pb-64{padding-bottom:16rem}.md\:pl-64{padding-left:16rem}.md\:pt-px{padding-top:1px}.md\:pr-px{padding-right:1px}.md\:pb-px{padding-bottom:1px}.md\:pl-px{padding-left:1px}.md\:placeholder-transparent:-ms-input-placeholder{color:transparent}.md\:placeholder-transparent::-ms-input-placeholder{color:transparent}.md\:placeholder-transparent::placeholder{color:transparent}.md\:placeholder-current:-ms-input-placeholder{color:currentColor}.md\:placeholder-current::-ms-input-placeholder{color:currentColor}.md\:placeholder-current::placeholder{color:currentColor}.md\:placeholder-black:-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.md\:placeholder-black::-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.md\:placeholder-black::placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.md\:placeholder-white:-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.md\:placeholder-white::-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.md\:placeholder-white::placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.md\:placeholder-gray-100:-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.md\:placeholder-gray-100::-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.md\:placeholder-gray-100::placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.md\:placeholder-gray-200:-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.md\:placeholder-gray-200::-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.md\:placeholder-gray-200::placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.md\:placeholder-gray-300:-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.md\:placeholder-gray-300::-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.md\:placeholder-gray-300::placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.md\:placeholder-gray-400:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.md\:placeholder-gray-400::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.md\:placeholder-gray-400::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.md\:placeholder-gray-500:-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.md\:placeholder-gray-500::-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.md\:placeholder-gray-500::placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.md\:placeholder-gray-600:-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.md\:placeholder-gray-600::-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.md\:placeholder-gray-600::placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.md\:placeholder-gray-700:-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.md\:placeholder-gray-700::-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.md\:placeholder-gray-700::placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.md\:placeholder-gray-800:-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.md\:placeholder-gray-800::-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.md\:placeholder-gray-800::placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.md\:placeholder-gray-900:-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.md\:placeholder-gray-900::-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.md\:placeholder-gray-900::placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.md\:placeholder-red-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.md\:placeholder-red-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.md\:placeholder-red-100::placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.md\:placeholder-red-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.md\:placeholder-red-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.md\:placeholder-red-200::placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.md\:placeholder-red-300:-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.md\:placeholder-red-300::-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.md\:placeholder-red-300::placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.md\:placeholder-red-400:-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.md\:placeholder-red-400::-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.md\:placeholder-red-400::placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.md\:placeholder-red-500:-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.md\:placeholder-red-500::-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.md\:placeholder-red-500::placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.md\:placeholder-red-600:-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.md\:placeholder-red-600::-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.md\:placeholder-red-600::placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.md\:placeholder-red-700:-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.md\:placeholder-red-700::-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.md\:placeholder-red-700::placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.md\:placeholder-red-800:-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.md\:placeholder-red-800::-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.md\:placeholder-red-800::placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.md\:placeholder-red-900:-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.md\:placeholder-red-900::-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.md\:placeholder-red-900::placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.md\:placeholder-orange-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.md\:placeholder-orange-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.md\:placeholder-orange-100::placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.md\:placeholder-orange-200:-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.md\:placeholder-orange-200::-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.md\:placeholder-orange-200::placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.md\:placeholder-orange-300:-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.md\:placeholder-orange-300::-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.md\:placeholder-orange-300::placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.md\:placeholder-orange-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.md\:placeholder-orange-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.md\:placeholder-orange-400::placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.md\:placeholder-orange-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.md\:placeholder-orange-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.md\:placeholder-orange-500::placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.md\:placeholder-orange-600:-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.md\:placeholder-orange-600::-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.md\:placeholder-orange-600::placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.md\:placeholder-orange-700:-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.md\:placeholder-orange-700::-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.md\:placeholder-orange-700::placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.md\:placeholder-orange-800:-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.md\:placeholder-orange-800::-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.md\:placeholder-orange-800::placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.md\:placeholder-orange-900:-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.md\:placeholder-orange-900::-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.md\:placeholder-orange-900::placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.md\:placeholder-yellow-100:-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.md\:placeholder-yellow-100::-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.md\:placeholder-yellow-100::placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.md\:placeholder-yellow-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.md\:placeholder-yellow-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.md\:placeholder-yellow-200::placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.md\:placeholder-yellow-300:-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.md\:placeholder-yellow-300::-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.md\:placeholder-yellow-300::placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.md\:placeholder-yellow-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.md\:placeholder-yellow-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.md\:placeholder-yellow-400::placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.md\:placeholder-yellow-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.md\:placeholder-yellow-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.md\:placeholder-yellow-500::placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.md\:placeholder-yellow-600:-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.md\:placeholder-yellow-600::-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.md\:placeholder-yellow-600::placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.md\:placeholder-yellow-700:-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.md\:placeholder-yellow-700::-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.md\:placeholder-yellow-700::placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.md\:placeholder-yellow-800:-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.md\:placeholder-yellow-800::-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.md\:placeholder-yellow-800::placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.md\:placeholder-yellow-900:-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.md\:placeholder-yellow-900::-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.md\:placeholder-yellow-900::placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.md\:placeholder-green-100:-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.md\:placeholder-green-100::-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.md\:placeholder-green-100::placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.md\:placeholder-green-200:-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.md\:placeholder-green-200::-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.md\:placeholder-green-200::placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.md\:placeholder-green-300:-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.md\:placeholder-green-300::-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.md\:placeholder-green-300::placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.md\:placeholder-green-400:-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.md\:placeholder-green-400::-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.md\:placeholder-green-400::placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.md\:placeholder-green-500:-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.md\:placeholder-green-500::-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.md\:placeholder-green-500::placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.md\:placeholder-green-600:-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.md\:placeholder-green-600::-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.md\:placeholder-green-600::placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.md\:placeholder-green-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.md\:placeholder-green-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.md\:placeholder-green-700::placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.md\:placeholder-green-800:-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.md\:placeholder-green-800::-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.md\:placeholder-green-800::placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.md\:placeholder-green-900:-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.md\:placeholder-green-900::-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.md\:placeholder-green-900::placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.md\:placeholder-teal-100:-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.md\:placeholder-teal-100::-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.md\:placeholder-teal-100::placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.md\:placeholder-teal-200:-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.md\:placeholder-teal-200::-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.md\:placeholder-teal-200::placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.md\:placeholder-teal-300:-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.md\:placeholder-teal-300::-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.md\:placeholder-teal-300::placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.md\:placeholder-teal-400:-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.md\:placeholder-teal-400::-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.md\:placeholder-teal-400::placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.md\:placeholder-teal-500:-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.md\:placeholder-teal-500::-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.md\:placeholder-teal-500::placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.md\:placeholder-teal-600:-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.md\:placeholder-teal-600::-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.md\:placeholder-teal-600::placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.md\:placeholder-teal-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.md\:placeholder-teal-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.md\:placeholder-teal-700::placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.md\:placeholder-teal-800:-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.md\:placeholder-teal-800::-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.md\:placeholder-teal-800::placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.md\:placeholder-teal-900:-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.md\:placeholder-teal-900::-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.md\:placeholder-teal-900::placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.md\:placeholder-blue-100:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.md\:placeholder-blue-100::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.md\:placeholder-blue-100::placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.md\:placeholder-blue-200:-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.md\:placeholder-blue-200::-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.md\:placeholder-blue-200::placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.md\:placeholder-blue-300:-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.md\:placeholder-blue-300::-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.md\:placeholder-blue-300::placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.md\:placeholder-blue-400:-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.md\:placeholder-blue-400::-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.md\:placeholder-blue-400::placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.md\:placeholder-blue-500:-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.md\:placeholder-blue-500::-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.md\:placeholder-blue-500::placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.md\:placeholder-blue-600:-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.md\:placeholder-blue-600::-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.md\:placeholder-blue-600::placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.md\:placeholder-blue-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.md\:placeholder-blue-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.md\:placeholder-blue-700::placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.md\:placeholder-blue-800:-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.md\:placeholder-blue-800::-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.md\:placeholder-blue-800::placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.md\:placeholder-blue-900:-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.md\:placeholder-blue-900::-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.md\:placeholder-blue-900::placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.md\:placeholder-indigo-100:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.md\:placeholder-indigo-100::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.md\:placeholder-indigo-100::placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.md\:placeholder-indigo-200:-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.md\:placeholder-indigo-200::-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.md\:placeholder-indigo-200::placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.md\:placeholder-indigo-300:-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.md\:placeholder-indigo-300::-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.md\:placeholder-indigo-300::placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.md\:placeholder-indigo-400:-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.md\:placeholder-indigo-400::-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.md\:placeholder-indigo-400::placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.md\:placeholder-indigo-500:-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.md\:placeholder-indigo-500::-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.md\:placeholder-indigo-500::placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.md\:placeholder-indigo-600:-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.md\:placeholder-indigo-600::-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.md\:placeholder-indigo-600::placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.md\:placeholder-indigo-700:-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.md\:placeholder-indigo-700::-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.md\:placeholder-indigo-700::placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.md\:placeholder-indigo-800:-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.md\:placeholder-indigo-800::-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.md\:placeholder-indigo-800::placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.md\:placeholder-indigo-900:-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.md\:placeholder-indigo-900::-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.md\:placeholder-indigo-900::placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.md\:placeholder-purple-100:-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.md\:placeholder-purple-100::-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.md\:placeholder-purple-100::placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.md\:placeholder-purple-200:-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.md\:placeholder-purple-200::-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.md\:placeholder-purple-200::placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.md\:placeholder-purple-300:-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.md\:placeholder-purple-300::-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.md\:placeholder-purple-300::placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.md\:placeholder-purple-400:-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.md\:placeholder-purple-400::-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.md\:placeholder-purple-400::placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.md\:placeholder-purple-500:-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.md\:placeholder-purple-500::-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.md\:placeholder-purple-500::placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.md\:placeholder-purple-600:-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.md\:placeholder-purple-600::-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.md\:placeholder-purple-600::placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.md\:placeholder-purple-700:-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.md\:placeholder-purple-700::-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.md\:placeholder-purple-700::placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.md\:placeholder-purple-800:-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.md\:placeholder-purple-800::-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.md\:placeholder-purple-800::placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.md\:placeholder-purple-900:-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.md\:placeholder-purple-900::-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.md\:placeholder-purple-900::placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.md\:placeholder-pink-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.md\:placeholder-pink-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.md\:placeholder-pink-100::placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.md\:placeholder-pink-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.md\:placeholder-pink-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.md\:placeholder-pink-200::placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.md\:placeholder-pink-300:-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.md\:placeholder-pink-300::-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.md\:placeholder-pink-300::placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.md\:placeholder-pink-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.md\:placeholder-pink-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.md\:placeholder-pink-400::placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.md\:placeholder-pink-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.md\:placeholder-pink-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.md\:placeholder-pink-500::placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.md\:placeholder-pink-600:-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.md\:placeholder-pink-600::-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.md\:placeholder-pink-600::placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.md\:placeholder-pink-700:-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.md\:placeholder-pink-700::-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.md\:placeholder-pink-700::placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.md\:placeholder-pink-800:-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.md\:placeholder-pink-800::-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.md\:placeholder-pink-800::placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.md\:placeholder-pink-900:-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.md\:placeholder-pink-900::-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.md\:placeholder-pink-900::placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.md\:focus\:placeholder-transparent:focus:-ms-input-placeholder{color:transparent}.md\:focus\:placeholder-transparent:focus::-ms-input-placeholder{color:transparent}.md\:focus\:placeholder-transparent:focus::placeholder{color:transparent}.md\:focus\:placeholder-current:focus:-ms-input-placeholder{color:currentColor}.md\:focus\:placeholder-current:focus::-ms-input-placeholder{color:currentColor}.md\:focus\:placeholder-current:focus::placeholder{color:currentColor}.md\:focus\:placeholder-black:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.md\:focus\:placeholder-black:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.md\:focus\:placeholder-black:focus::placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.md\:focus\:placeholder-white:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.md\:focus\:placeholder-white:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.md\:focus\:placeholder-white:focus::placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-100:focus::placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-200:focus::placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-300:focus::placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-400:focus::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-500:focus::placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-600:focus::placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-700:focus::placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-800:focus::placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-900:focus::placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.md\:focus\:placeholder-red-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.md\:focus\:placeholder-red-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.md\:focus\:placeholder-red-100:focus::placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.md\:focus\:placeholder-red-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.md\:focus\:placeholder-red-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.md\:focus\:placeholder-red-200:focus::placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.md\:focus\:placeholder-red-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.md\:focus\:placeholder-red-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.md\:focus\:placeholder-red-300:focus::placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.md\:focus\:placeholder-red-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.md\:focus\:placeholder-red-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.md\:focus\:placeholder-red-400:focus::placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.md\:focus\:placeholder-red-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.md\:focus\:placeholder-red-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.md\:focus\:placeholder-red-500:focus::placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.md\:focus\:placeholder-red-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.md\:focus\:placeholder-red-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.md\:focus\:placeholder-red-600:focus::placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.md\:focus\:placeholder-red-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.md\:focus\:placeholder-red-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.md\:focus\:placeholder-red-700:focus::placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.md\:focus\:placeholder-red-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.md\:focus\:placeholder-red-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.md\:focus\:placeholder-red-800:focus::placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.md\:focus\:placeholder-red-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.md\:focus\:placeholder-red-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.md\:focus\:placeholder-red-900:focus::placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-100:focus::placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-200:focus::placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-300:focus::placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-400:focus::placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-500:focus::placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-600:focus::placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-700:focus::placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-800:focus::placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-900:focus::placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-100:focus::placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-200:focus::placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-300:focus::placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-400:focus::placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-500:focus::placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-600:focus::placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-700:focus::placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-800:focus::placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-900:focus::placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.md\:focus\:placeholder-green-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.md\:focus\:placeholder-green-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.md\:focus\:placeholder-green-100:focus::placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.md\:focus\:placeholder-green-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.md\:focus\:placeholder-green-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.md\:focus\:placeholder-green-200:focus::placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.md\:focus\:placeholder-green-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.md\:focus\:placeholder-green-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.md\:focus\:placeholder-green-300:focus::placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.md\:focus\:placeholder-green-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.md\:focus\:placeholder-green-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.md\:focus\:placeholder-green-400:focus::placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.md\:focus\:placeholder-green-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.md\:focus\:placeholder-green-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.md\:focus\:placeholder-green-500:focus::placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.md\:focus\:placeholder-green-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.md\:focus\:placeholder-green-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.md\:focus\:placeholder-green-600:focus::placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.md\:focus\:placeholder-green-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.md\:focus\:placeholder-green-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.md\:focus\:placeholder-green-700:focus::placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.md\:focus\:placeholder-green-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.md\:focus\:placeholder-green-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.md\:focus\:placeholder-green-800:focus::placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.md\:focus\:placeholder-green-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.md\:focus\:placeholder-green-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.md\:focus\:placeholder-green-900:focus::placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-100:focus::placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-200:focus::placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-300:focus::placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-400:focus::placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-500:focus::placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-600:focus::placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-700:focus::placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-800:focus::placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-900:focus::placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-100:focus::placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-200:focus::placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-300:focus::placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-400:focus::placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-500:focus::placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-600:focus::placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-700:focus::placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-800:focus::placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-900:focus::placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-100:focus::placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-200:focus::placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-300:focus::placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-400:focus::placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-500:focus::placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-600:focus::placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-700:focus::placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-800:focus::placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-900:focus::placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-100:focus::placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-200:focus::placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-300:focus::placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-400:focus::placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-500:focus::placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-600:focus::placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-700:focus::placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-800:focus::placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-900:focus::placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-100:focus::placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-200:focus::placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-300:focus::placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-400:focus::placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-500:focus::placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-600:focus::placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-700:focus::placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-800:focus::placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-900:focus::placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.md\:placeholder-opacity-0:-ms-input-placeholder{--placeholder-opacity:0}.md\:placeholder-opacity-0::-ms-input-placeholder{--placeholder-opacity:0}.md\:placeholder-opacity-0::placeholder{--placeholder-opacity:0}.md\:placeholder-opacity-25:-ms-input-placeholder{--placeholder-opacity:0.25}.md\:placeholder-opacity-25::-ms-input-placeholder{--placeholder-opacity:0.25}.md\:placeholder-opacity-25::placeholder{--placeholder-opacity:0.25}.md\:placeholder-opacity-50:-ms-input-placeholder{--placeholder-opacity:0.5}.md\:placeholder-opacity-50::-ms-input-placeholder{--placeholder-opacity:0.5}.md\:placeholder-opacity-50::placeholder{--placeholder-opacity:0.5}.md\:placeholder-opacity-75:-ms-input-placeholder{--placeholder-opacity:0.75}.md\:placeholder-opacity-75::-ms-input-placeholder{--placeholder-opacity:0.75}.md\:placeholder-opacity-75::placeholder{--placeholder-opacity:0.75}.md\:placeholder-opacity-100:-ms-input-placeholder{--placeholder-opacity:1}.md\:placeholder-opacity-100::-ms-input-placeholder{--placeholder-opacity:1}.md\:placeholder-opacity-100::placeholder{--placeholder-opacity:1}.md\:focus\:placeholder-opacity-0:focus:-ms-input-placeholder{--placeholder-opacity:0}.md\:focus\:placeholder-opacity-0:focus::-ms-input-placeholder{--placeholder-opacity:0}.md\:focus\:placeholder-opacity-0:focus::placeholder{--placeholder-opacity:0}.md\:focus\:placeholder-opacity-25:focus:-ms-input-placeholder{--placeholder-opacity:0.25}.md\:focus\:placeholder-opacity-25:focus::-ms-input-placeholder{--placeholder-opacity:0.25}.md\:focus\:placeholder-opacity-25:focus::placeholder{--placeholder-opacity:0.25}.md\:focus\:placeholder-opacity-50:focus:-ms-input-placeholder{--placeholder-opacity:0.5}.md\:focus\:placeholder-opacity-50:focus::-ms-input-placeholder{--placeholder-opacity:0.5}.md\:focus\:placeholder-opacity-50:focus::placeholder{--placeholder-opacity:0.5}.md\:focus\:placeholder-opacity-75:focus:-ms-input-placeholder{--placeholder-opacity:0.75}.md\:focus\:placeholder-opacity-75:focus::-ms-input-placeholder{--placeholder-opacity:0.75}.md\:focus\:placeholder-opacity-75:focus::placeholder{--placeholder-opacity:0.75}.md\:focus\:placeholder-opacity-100:focus:-ms-input-placeholder{--placeholder-opacity:1}.md\:focus\:placeholder-opacity-100:focus::-ms-input-placeholder{--placeholder-opacity:1}.md\:focus\:placeholder-opacity-100:focus::placeholder{--placeholder-opacity:1}.md\:pointer-events-none{pointer-events:none}.md\:pointer-events-auto{pointer-events:auto}.md\:static{position:static}.md\:fixed{position:fixed}.md\:absolute{position:absolute}.md\:relative{position:relative}.md\:sticky{position:-webkit-sticky;position:sticky}.md\:inset-0{top:0;right:0;bottom:0;left:0}.md\:inset-auto{top:auto;right:auto;bottom:auto;left:auto}.md\:inset-y-0{top:0;bottom:0}.md\:inset-x-0{right:0;left:0}.md\:inset-y-auto{top:auto;bottom:auto}.md\:inset-x-auto{right:auto;left:auto}.md\:top-0{top:0}.md\:right-0{right:0}.md\:bottom-0{bottom:0}.md\:left-0{left:0}.md\:top-auto{top:auto}.md\:right-auto{right:auto}.md\:bottom-auto{bottom:auto}.md\:left-auto{left:auto}.md\:resize-none{resize:none}.md\:resize-y{resize:vertical}.md\:resize-x{resize:horizontal}.md\:resize{resize:both}.md\:shadow-xs{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.md\:shadow-sm{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.md\:shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.md\:shadow-md{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.md\:shadow-lg{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.md\:shadow-xl{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.md\:shadow-2xl{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.md\:shadow-inner{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.md\:shadow-outline{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.md\:shadow-none{box-shadow:none}.md\:hover\:shadow-xs:hover{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.md\:hover\:shadow-sm:hover{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.md\:hover\:shadow:hover{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.md\:hover\:shadow-md:hover{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.md\:hover\:shadow-lg:hover{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.md\:hover\:shadow-xl:hover{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.md\:hover\:shadow-2xl:hover{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.md\:hover\:shadow-inner:hover{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.md\:hover\:shadow-outline:hover{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.md\:hover\:shadow-none:hover{box-shadow:none}.md\:focus\:shadow-xs:focus{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.md\:focus\:shadow-sm:focus{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.md\:focus\:shadow:focus{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.md\:focus\:shadow-md:focus{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.md\:focus\:shadow-lg:focus{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.md\:focus\:shadow-xl:focus{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.md\:focus\:shadow-2xl:focus{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.md\:focus\:shadow-inner:focus{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.md\:focus\:shadow-outline:focus{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.md\:focus\:shadow-none:focus{box-shadow:none}.md\:fill-current{fill:currentColor}.md\:stroke-current{stroke:currentColor}.md\:stroke-0{stroke-width:0}.md\:stroke-1{stroke-width:1}.md\:stroke-2{stroke-width:2}.md\:table-auto{table-layout:auto}.md\:table-fixed{table-layout:fixed}.md\:text-left{text-align:left}.md\:text-center{text-align:center}.md\:text-right{text-align:right}.md\:text-justify{text-align:justify}.md\:text-transparent{color:transparent}.md\:text-current{color:currentColor}.md\:text-black{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.md\:text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.md\:text-gray-100{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.md\:text-gray-200{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.md\:text-gray-300{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.md\:text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.md\:text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.md\:text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.md\:text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.md\:text-gray-800{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.md\:text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.md\:text-red-100{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.md\:text-red-200{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.md\:text-red-300{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.md\:text-red-400{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.md\:text-red-500{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.md\:text-red-600{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.md\:text-red-700{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.md\:text-red-800{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.md\:text-red-900{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.md\:text-orange-100{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.md\:text-orange-200{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.md\:text-orange-300{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.md\:text-orange-400{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.md\:text-orange-500{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.md\:text-orange-600{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.md\:text-orange-700{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.md\:text-orange-800{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.md\:text-orange-900{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.md\:text-yellow-100{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.md\:text-yellow-200{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.md\:text-yellow-300{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.md\:text-yellow-400{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.md\:text-yellow-500{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.md\:text-yellow-600{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.md\:text-yellow-700{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.md\:text-yellow-800{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.md\:text-yellow-900{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.md\:text-green-100{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.md\:text-green-200{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.md\:text-green-300{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.md\:text-green-400{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.md\:text-green-500{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.md\:text-green-600{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.md\:text-green-700{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.md\:text-green-800{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.md\:text-green-900{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.md\:text-teal-100{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.md\:text-teal-200{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.md\:text-teal-300{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.md\:text-teal-400{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.md\:text-teal-500{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.md\:text-teal-600{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.md\:text-teal-700{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.md\:text-teal-800{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.md\:text-teal-900{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.md\:text-blue-100{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.md\:text-blue-200{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.md\:text-blue-300{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.md\:text-blue-400{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.md\:text-blue-500{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.md\:text-blue-600{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.md\:text-blue-700{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.md\:text-blue-800{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.md\:text-blue-900{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.md\:text-indigo-100{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.md\:text-indigo-200{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.md\:text-indigo-300{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.md\:text-indigo-400{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.md\:text-indigo-500{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.md\:text-indigo-600{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.md\:text-indigo-700{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.md\:text-indigo-800{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.md\:text-indigo-900{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.md\:text-purple-100{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.md\:text-purple-200{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.md\:text-purple-300{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.md\:text-purple-400{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.md\:text-purple-500{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.md\:text-purple-600{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.md\:text-purple-700{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.md\:text-purple-800{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.md\:text-purple-900{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.md\:text-pink-100{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.md\:text-pink-200{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.md\:text-pink-300{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.md\:text-pink-400{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.md\:text-pink-500{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.md\:text-pink-600{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.md\:text-pink-700{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.md\:text-pink-800{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.md\:text-pink-900{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.md\:hover\:text-transparent:hover{color:transparent}.md\:hover\:text-current:hover{color:currentColor}.md\:hover\:text-black:hover{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.md\:hover\:text-white:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.md\:hover\:text-gray-100:hover{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.md\:hover\:text-gray-200:hover{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.md\:hover\:text-gray-300:hover{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.md\:hover\:text-gray-400:hover{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.md\:hover\:text-gray-500:hover{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.md\:hover\:text-gray-600:hover{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.md\:hover\:text-gray-700:hover{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.md\:hover\:text-gray-800:hover{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.md\:hover\:text-gray-900:hover{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.md\:hover\:text-red-100:hover{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.md\:hover\:text-red-200:hover{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.md\:hover\:text-red-300:hover{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.md\:hover\:text-red-400:hover{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.md\:hover\:text-red-500:hover{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.md\:hover\:text-red-600:hover{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.md\:hover\:text-red-700:hover{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.md\:hover\:text-red-800:hover{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.md\:hover\:text-red-900:hover{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.md\:hover\:text-orange-100:hover{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.md\:hover\:text-orange-200:hover{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.md\:hover\:text-orange-300:hover{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.md\:hover\:text-orange-400:hover{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.md\:hover\:text-orange-500:hover{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.md\:hover\:text-orange-600:hover{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.md\:hover\:text-orange-700:hover{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.md\:hover\:text-orange-800:hover{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.md\:hover\:text-orange-900:hover{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.md\:hover\:text-yellow-100:hover{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.md\:hover\:text-yellow-200:hover{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.md\:hover\:text-yellow-300:hover{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.md\:hover\:text-yellow-400:hover{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.md\:hover\:text-yellow-500:hover{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.md\:hover\:text-yellow-600:hover{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.md\:hover\:text-yellow-700:hover{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.md\:hover\:text-yellow-800:hover{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.md\:hover\:text-yellow-900:hover{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.md\:hover\:text-green-100:hover{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.md\:hover\:text-green-200:hover{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.md\:hover\:text-green-300:hover{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.md\:hover\:text-green-400:hover{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.md\:hover\:text-green-500:hover{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.md\:hover\:text-green-600:hover{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.md\:hover\:text-green-700:hover{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.md\:hover\:text-green-800:hover{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.md\:hover\:text-green-900:hover{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.md\:hover\:text-teal-100:hover{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.md\:hover\:text-teal-200:hover{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.md\:hover\:text-teal-300:hover{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.md\:hover\:text-teal-400:hover{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.md\:hover\:text-teal-500:hover{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.md\:hover\:text-teal-600:hover{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.md\:hover\:text-teal-700:hover{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.md\:hover\:text-teal-800:hover{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.md\:hover\:text-teal-900:hover{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.md\:hover\:text-blue-100:hover{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.md\:hover\:text-blue-200:hover{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.md\:hover\:text-blue-300:hover{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.md\:hover\:text-blue-400:hover{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.md\:hover\:text-blue-500:hover{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.md\:hover\:text-blue-600:hover{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.md\:hover\:text-blue-700:hover{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.md\:hover\:text-blue-800:hover{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.md\:hover\:text-blue-900:hover{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.md\:hover\:text-indigo-100:hover{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.md\:hover\:text-indigo-200:hover{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.md\:hover\:text-indigo-300:hover{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.md\:hover\:text-indigo-400:hover{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.md\:hover\:text-indigo-500:hover{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.md\:hover\:text-indigo-600:hover{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.md\:hover\:text-indigo-700:hover{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.md\:hover\:text-indigo-800:hover{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.md\:hover\:text-indigo-900:hover{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.md\:hover\:text-purple-100:hover{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.md\:hover\:text-purple-200:hover{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.md\:hover\:text-purple-300:hover{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.md\:hover\:text-purple-400:hover{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.md\:hover\:text-purple-500:hover{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.md\:hover\:text-purple-600:hover{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.md\:hover\:text-purple-700:hover{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.md\:hover\:text-purple-800:hover{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.md\:hover\:text-purple-900:hover{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.md\:hover\:text-pink-100:hover{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.md\:hover\:text-pink-200:hover{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.md\:hover\:text-pink-300:hover{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.md\:hover\:text-pink-400:hover{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.md\:hover\:text-pink-500:hover{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.md\:hover\:text-pink-600:hover{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.md\:hover\:text-pink-700:hover{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.md\:hover\:text-pink-800:hover{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.md\:hover\:text-pink-900:hover{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.md\:focus\:text-transparent:focus{color:transparent}.md\:focus\:text-current:focus{color:currentColor}.md\:focus\:text-black:focus{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.md\:focus\:text-white:focus{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.md\:focus\:text-gray-100:focus{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.md\:focus\:text-gray-200:focus{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.md\:focus\:text-gray-300:focus{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.md\:focus\:text-gray-400:focus{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.md\:focus\:text-gray-500:focus{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.md\:focus\:text-gray-600:focus{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.md\:focus\:text-gray-700:focus{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.md\:focus\:text-gray-800:focus{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.md\:focus\:text-gray-900:focus{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.md\:focus\:text-red-100:focus{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.md\:focus\:text-red-200:focus{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.md\:focus\:text-red-300:focus{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.md\:focus\:text-red-400:focus{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.md\:focus\:text-red-500:focus{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.md\:focus\:text-red-600:focus{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.md\:focus\:text-red-700:focus{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.md\:focus\:text-red-800:focus{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.md\:focus\:text-red-900:focus{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.md\:focus\:text-orange-100:focus{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.md\:focus\:text-orange-200:focus{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.md\:focus\:text-orange-300:focus{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.md\:focus\:text-orange-400:focus{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.md\:focus\:text-orange-500:focus{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.md\:focus\:text-orange-600:focus{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.md\:focus\:text-orange-700:focus{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.md\:focus\:text-orange-800:focus{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.md\:focus\:text-orange-900:focus{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.md\:focus\:text-yellow-100:focus{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.md\:focus\:text-yellow-200:focus{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.md\:focus\:text-yellow-300:focus{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.md\:focus\:text-yellow-400:focus{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.md\:focus\:text-yellow-500:focus{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.md\:focus\:text-yellow-600:focus{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.md\:focus\:text-yellow-700:focus{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.md\:focus\:text-yellow-800:focus{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.md\:focus\:text-yellow-900:focus{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.md\:focus\:text-green-100:focus{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.md\:focus\:text-green-200:focus{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.md\:focus\:text-green-300:focus{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.md\:focus\:text-green-400:focus{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.md\:focus\:text-green-500:focus{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.md\:focus\:text-green-600:focus{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.md\:focus\:text-green-700:focus{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.md\:focus\:text-green-800:focus{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.md\:focus\:text-green-900:focus{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.md\:focus\:text-teal-100:focus{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.md\:focus\:text-teal-200:focus{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.md\:focus\:text-teal-300:focus{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.md\:focus\:text-teal-400:focus{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.md\:focus\:text-teal-500:focus{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.md\:focus\:text-teal-600:focus{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.md\:focus\:text-teal-700:focus{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.md\:focus\:text-teal-800:focus{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.md\:focus\:text-teal-900:focus{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.md\:focus\:text-blue-100:focus{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.md\:focus\:text-blue-200:focus{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.md\:focus\:text-blue-300:focus{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.md\:focus\:text-blue-400:focus{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.md\:focus\:text-blue-500:focus{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.md\:focus\:text-blue-600:focus{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.md\:focus\:text-blue-700:focus{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.md\:focus\:text-blue-800:focus{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.md\:focus\:text-blue-900:focus{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.md\:focus\:text-indigo-100:focus{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.md\:focus\:text-indigo-200:focus{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.md\:focus\:text-indigo-300:focus{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.md\:focus\:text-indigo-400:focus{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.md\:focus\:text-indigo-500:focus{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.md\:focus\:text-indigo-600:focus{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.md\:focus\:text-indigo-700:focus{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.md\:focus\:text-indigo-800:focus{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.md\:focus\:text-indigo-900:focus{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.md\:focus\:text-purple-100:focus{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.md\:focus\:text-purple-200:focus{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.md\:focus\:text-purple-300:focus{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.md\:focus\:text-purple-400:focus{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.md\:focus\:text-purple-500:focus{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.md\:focus\:text-purple-600:focus{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.md\:focus\:text-purple-700:focus{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.md\:focus\:text-purple-800:focus{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.md\:focus\:text-purple-900:focus{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.md\:focus\:text-pink-100:focus{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.md\:focus\:text-pink-200:focus{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.md\:focus\:text-pink-300:focus{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.md\:focus\:text-pink-400:focus{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.md\:focus\:text-pink-500:focus{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.md\:focus\:text-pink-600:focus{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.md\:focus\:text-pink-700:focus{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.md\:focus\:text-pink-800:focus{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.md\:focus\:text-pink-900:focus{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.md\:text-opacity-0{--text-opacity:0}.md\:text-opacity-25{--text-opacity:0.25}.md\:text-opacity-50{--text-opacity:0.5}.md\:text-opacity-75{--text-opacity:0.75}.md\:text-opacity-100{--text-opacity:1}.md\:hover\:text-opacity-0:hover{--text-opacity:0}.md\:hover\:text-opacity-25:hover{--text-opacity:0.25}.md\:hover\:text-opacity-50:hover{--text-opacity:0.5}.md\:hover\:text-opacity-75:hover{--text-opacity:0.75}.md\:hover\:text-opacity-100:hover{--text-opacity:1}.md\:focus\:text-opacity-0:focus{--text-opacity:0}.md\:focus\:text-opacity-25:focus{--text-opacity:0.25}.md\:focus\:text-opacity-50:focus{--text-opacity:0.5}.md\:focus\:text-opacity-75:focus{--text-opacity:0.75}.md\:focus\:text-opacity-100:focus{--text-opacity:1}.md\:italic{font-style:italic}.md\:not-italic{font-style:normal}.md\:uppercase{text-transform:uppercase}.md\:lowercase{text-transform:lowercase}.md\:capitalize{text-transform:capitalize}.md\:normal-case{text-transform:none}.md\:underline{text-decoration:underline}.md\:line-through{text-decoration:line-through}.md\:no-underline{text-decoration:none}.md\:hover\:underline:hover{text-decoration:underline}.md\:hover\:line-through:hover{text-decoration:line-through}.md\:hover\:no-underline:hover{text-decoration:none}.md\:focus\:underline:focus{text-decoration:underline}.md\:focus\:line-through:focus{text-decoration:line-through}.md\:focus\:no-underline:focus{text-decoration:none}.md\:antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.md\:subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.md\:diagonal-fractions,.md\:lining-nums,.md\:oldstyle-nums,.md\:ordinal,.md\:proportional-nums,.md\:slashed-zero,.md\:stacked-fractions,.md\:tabular-nums{--font-variant-numeric-ordinal:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-slashed-zero:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-figure:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-spacing:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-fraction:var(--tailwind-empty, );/*!*//*!*/font-variant-numeric:var(--font-variant-numeric-ordinal) var(--font-variant-numeric-slashed-zero) var(--font-variant-numeric-figure) var(--font-variant-numeric-spacing) var(--font-variant-numeric-fraction)}.md\:normal-nums{font-variant-numeric:normal}.md\:ordinal{--font-variant-numeric-ordinal:ordinal}.md\:slashed-zero{--font-variant-numeric-slashed-zero:slashed-zero}.md\:lining-nums{--font-variant-numeric-figure:lining-nums}.md\:oldstyle-nums{--font-variant-numeric-figure:oldstyle-nums}.md\:proportional-nums{--font-variant-numeric-spacing:proportional-nums}.md\:tabular-nums{--font-variant-numeric-spacing:tabular-nums}.md\:diagonal-fractions{--font-variant-numeric-fraction:diagonal-fractions}.md\:stacked-fractions{--font-variant-numeric-fraction:stacked-fractions}.md\:tracking-tighter{letter-spacing:-.05em}.md\:tracking-tight{letter-spacing:-.025em}.md\:tracking-normal{letter-spacing:0}.md\:tracking-wide{letter-spacing:.025em}.md\:tracking-wider{letter-spacing:.05em}.md\:tracking-widest{letter-spacing:.1em}.md\:select-none{-webkit-user-select:none;-ms-user-select:none;user-select:none}.md\:select-text{-webkit-user-select:text;-ms-user-select:text;user-select:text}.md\:select-all{-webkit-user-select:all;-ms-user-select:all;user-select:all}.md\:select-auto{-webkit-user-select:auto;-ms-user-select:auto;user-select:auto}.md\:align-baseline{vertical-align:baseline}.md\:align-top{vertical-align:top}.md\:align-middle{vertical-align:middle}.md\:align-bottom{vertical-align:bottom}.md\:align-text-top{vertical-align:text-top}.md\:align-text-bottom{vertical-align:text-bottom}.md\:visible{visibility:visible}.md\:invisible{visibility:hidden}.md\:whitespace-normal{white-space:normal}.md\:whitespace-no-wrap{white-space:nowrap}.md\:whitespace-pre{white-space:pre}.md\:whitespace-pre-line{white-space:pre-line}.md\:whitespace-pre-wrap{white-space:pre-wrap}.md\:break-normal{word-wrap:normal;overflow-wrap:normal;word-break:normal}.md\:break-words{word-wrap:break-word;overflow-wrap:break-word}.md\:break-all{word-break:break-all}.md\:truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.md\:w-0{width:0}.md\:w-1{width:.25rem}.md\:w-2{width:.5rem}.md\:w-3{width:.75rem}.md\:w-4{width:1rem}.md\:w-5{width:1.25rem}.md\:w-6{width:1.5rem}.md\:w-8{width:2rem}.md\:w-10{width:2.5rem}.md\:w-12{width:3rem}.md\:w-16{width:4rem}.md\:w-20{width:5rem}.md\:w-24{width:6rem}.md\:w-32{width:8rem}.md\:w-40{width:10rem}.md\:w-48{width:12rem}.md\:w-56{width:14rem}.md\:w-64{width:16rem}.md\:w-auto{width:auto}.md\:w-px{width:1px}.md\:w-1\/2{width:50%}.md\:w-1\/3{width:33.333333%}.md\:w-2\/3{width:66.666667%}.md\:w-1\/4{width:25%}.md\:w-2\/4{width:50%}.md\:w-3\/4{width:75%}.md\:w-1\/5{width:20%}.md\:w-2\/5{width:40%}.md\:w-3\/5{width:60%}.md\:w-4\/5{width:80%}.md\:w-1\/6{width:16.666667%}.md\:w-2\/6{width:33.333333%}.md\:w-3\/6{width:50%}.md\:w-4\/6{width:66.666667%}.md\:w-5\/6{width:83.333333%}.md\:w-1\/12{width:8.333333%}.md\:w-2\/12{width:16.666667%}.md\:w-3\/12{width:25%}.md\:w-4\/12{width:33.333333%}.md\:w-5\/12{width:41.666667%}.md\:w-6\/12{width:50%}.md\:w-7\/12{width:58.333333%}.md\:w-8\/12{width:66.666667%}.md\:w-9\/12{width:75%}.md\:w-10\/12{width:83.333333%}.md\:w-11\/12{width:91.666667%}.md\:w-full{width:100%}.md\:w-screen{width:100vw}.md\:z-0{z-index:0}.md\:z-10{z-index:10}.md\:z-20{z-index:20}.md\:z-30{z-index:30}.md\:z-40{z-index:40}.md\:z-50{z-index:50}.md\:z-auto{z-index:auto}.md\:gap-0{grid-gap:0;gap:0}.md\:gap-1{grid-gap:.25rem;gap:.25rem}.md\:gap-2{grid-gap:.5rem;gap:.5rem}.md\:gap-3{grid-gap:.75rem;gap:.75rem}.md\:gap-4{grid-gap:1rem;gap:1rem}.md\:gap-5{grid-gap:1.25rem;gap:1.25rem}.md\:gap-6{grid-gap:1.5rem;gap:1.5rem}.md\:gap-8{grid-gap:2rem;gap:2rem}.md\:gap-10{grid-gap:2.5rem;gap:2.5rem}.md\:gap-12{grid-gap:3rem;gap:3rem}.md\:gap-16{grid-gap:4rem;gap:4rem}.md\:gap-20{grid-gap:5rem;gap:5rem}.md\:gap-24{grid-gap:6rem;gap:6rem}.md\:gap-32{grid-gap:8rem;gap:8rem}.md\:gap-40{grid-gap:10rem;gap:10rem}.md\:gap-48{grid-gap:12rem;gap:12rem}.md\:gap-56{grid-gap:14rem;gap:14rem}.md\:gap-64{grid-gap:16rem;gap:16rem}.md\:gap-px{grid-gap:1px;gap:1px}.md\:col-gap-0{grid-column-gap:0;column-gap:0}.md\:col-gap-1{grid-column-gap:.25rem;column-gap:.25rem}.md\:col-gap-2{grid-column-gap:.5rem;column-gap:.5rem}.md\:col-gap-3{grid-column-gap:.75rem;column-gap:.75rem}.md\:col-gap-4{grid-column-gap:1rem;column-gap:1rem}.md\:col-gap-5{grid-column-gap:1.25rem;column-gap:1.25rem}.md\:col-gap-6{grid-column-gap:1.5rem;column-gap:1.5rem}.md\:col-gap-8{grid-column-gap:2rem;column-gap:2rem}.md\:col-gap-10{grid-column-gap:2.5rem;column-gap:2.5rem}.md\:col-gap-12{grid-column-gap:3rem;column-gap:3rem}.md\:col-gap-16{grid-column-gap:4rem;column-gap:4rem}.md\:col-gap-20{grid-column-gap:5rem;column-gap:5rem}.md\:col-gap-24{grid-column-gap:6rem;column-gap:6rem}.md\:col-gap-32{grid-column-gap:8rem;column-gap:8rem}.md\:col-gap-40{grid-column-gap:10rem;column-gap:10rem}.md\:col-gap-48{grid-column-gap:12rem;column-gap:12rem}.md\:col-gap-56{grid-column-gap:14rem;column-gap:14rem}.md\:col-gap-64{grid-column-gap:16rem;column-gap:16rem}.md\:col-gap-px{grid-column-gap:1px;column-gap:1px}.md\:gap-x-0{grid-column-gap:0;column-gap:0}.md\:gap-x-1{grid-column-gap:.25rem;column-gap:.25rem}.md\:gap-x-2{grid-column-gap:.5rem;column-gap:.5rem}.md\:gap-x-3{grid-column-gap:.75rem;column-gap:.75rem}.md\:gap-x-4{grid-column-gap:1rem;column-gap:1rem}.md\:gap-x-5{grid-column-gap:1.25rem;column-gap:1.25rem}.md\:gap-x-6{grid-column-gap:1.5rem;column-gap:1.5rem}.md\:gap-x-8{grid-column-gap:2rem;column-gap:2rem}.md\:gap-x-10{grid-column-gap:2.5rem;column-gap:2.5rem}.md\:gap-x-12{grid-column-gap:3rem;column-gap:3rem}.md\:gap-x-16{grid-column-gap:4rem;column-gap:4rem}.md\:gap-x-20{grid-column-gap:5rem;column-gap:5rem}.md\:gap-x-24{grid-column-gap:6rem;column-gap:6rem}.md\:gap-x-32{grid-column-gap:8rem;column-gap:8rem}.md\:gap-x-40{grid-column-gap:10rem;column-gap:10rem}.md\:gap-x-48{grid-column-gap:12rem;column-gap:12rem}.md\:gap-x-56{grid-column-gap:14rem;column-gap:14rem}.md\:gap-x-64{grid-column-gap:16rem;column-gap:16rem}.md\:gap-x-px{grid-column-gap:1px;column-gap:1px}.md\:row-gap-0{grid-row-gap:0;row-gap:0}.md\:row-gap-1{grid-row-gap:.25rem;row-gap:.25rem}.md\:row-gap-2{grid-row-gap:.5rem;row-gap:.5rem}.md\:row-gap-3{grid-row-gap:.75rem;row-gap:.75rem}.md\:row-gap-4{grid-row-gap:1rem;row-gap:1rem}.md\:row-gap-5{grid-row-gap:1.25rem;row-gap:1.25rem}.md\:row-gap-6{grid-row-gap:1.5rem;row-gap:1.5rem}.md\:row-gap-8{grid-row-gap:2rem;row-gap:2rem}.md\:row-gap-10{grid-row-gap:2.5rem;row-gap:2.5rem}.md\:row-gap-12{grid-row-gap:3rem;row-gap:3rem}.md\:row-gap-16{grid-row-gap:4rem;row-gap:4rem}.md\:row-gap-20{grid-row-gap:5rem;row-gap:5rem}.md\:row-gap-24{grid-row-gap:6rem;row-gap:6rem}.md\:row-gap-32{grid-row-gap:8rem;row-gap:8rem}.md\:row-gap-40{grid-row-gap:10rem;row-gap:10rem}.md\:row-gap-48{grid-row-gap:12rem;row-gap:12rem}.md\:row-gap-56{grid-row-gap:14rem;row-gap:14rem}.md\:row-gap-64{grid-row-gap:16rem;row-gap:16rem}.md\:row-gap-px{grid-row-gap:1px;row-gap:1px}.md\:gap-y-0{grid-row-gap:0;row-gap:0}.md\:gap-y-1{grid-row-gap:.25rem;row-gap:.25rem}.md\:gap-y-2{grid-row-gap:.5rem;row-gap:.5rem}.md\:gap-y-3{grid-row-gap:.75rem;row-gap:.75rem}.md\:gap-y-4{grid-row-gap:1rem;row-gap:1rem}.md\:gap-y-5{grid-row-gap:1.25rem;row-gap:1.25rem}.md\:gap-y-6{grid-row-gap:1.5rem;row-gap:1.5rem}.md\:gap-y-8{grid-row-gap:2rem;row-gap:2rem}.md\:gap-y-10{grid-row-gap:2.5rem;row-gap:2.5rem}.md\:gap-y-12{grid-row-gap:3rem;row-gap:3rem}.md\:gap-y-16{grid-row-gap:4rem;row-gap:4rem}.md\:gap-y-20{grid-row-gap:5rem;row-gap:5rem}.md\:gap-y-24{grid-row-gap:6rem;row-gap:6rem}.md\:gap-y-32{grid-row-gap:8rem;row-gap:8rem}.md\:gap-y-40{grid-row-gap:10rem;row-gap:10rem}.md\:gap-y-48{grid-row-gap:12rem;row-gap:12rem}.md\:gap-y-56{grid-row-gap:14rem;row-gap:14rem}.md\:gap-y-64{grid-row-gap:16rem;row-gap:16rem}.md\:gap-y-px{grid-row-gap:1px;row-gap:1px}.md\:grid-flow-row{grid-auto-flow:row}.md\:grid-flow-col{grid-auto-flow:column}.md\:grid-flow-row-dense{grid-auto-flow:row dense}.md\:grid-flow-col-dense{grid-auto-flow:column dense}.md\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.md\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.md\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.md\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.md\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.md\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.md\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:grid-cols-none{grid-template-columns:none}.md\:auto-cols-auto{grid-auto-columns:auto}.md\:auto-cols-min{grid-auto-columns:-webkit-min-content;grid-auto-columns:min-content}.md\:auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.md\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.md\:col-auto{grid-column:auto}.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-3{grid-column:span 3/span 3}.md\:col-span-4{grid-column:span 4/span 4}.md\:col-span-5{grid-column:span 5/span 5}.md\:col-span-6{grid-column:span 6/span 6}.md\:col-span-7{grid-column:span 7/span 7}.md\:col-span-8{grid-column:span 8/span 8}.md\:col-span-9{grid-column:span 9/span 9}.md\:col-span-10{grid-column:span 10/span 10}.md\:col-span-11{grid-column:span 11/span 11}.md\:col-span-12{grid-column:span 12/span 12}.md\:col-span-full{grid-column:1/-1}.md\:col-start-1{grid-column-start:1}.md\:col-start-2{grid-column-start:2}.md\:col-start-3{grid-column-start:3}.md\:col-start-4{grid-column-start:4}.md\:col-start-5{grid-column-start:5}.md\:col-start-6{grid-column-start:6}.md\:col-start-7{grid-column-start:7}.md\:col-start-8{grid-column-start:8}.md\:col-start-9{grid-column-start:9}.md\:col-start-10{grid-column-start:10}.md\:col-start-11{grid-column-start:11}.md\:col-start-12{grid-column-start:12}.md\:col-start-13{grid-column-start:13}.md\:col-start-auto{grid-column-start:auto}.md\:col-end-1{grid-column-end:1}.md\:col-end-2{grid-column-end:2}.md\:col-end-3{grid-column-end:3}.md\:col-end-4{grid-column-end:4}.md\:col-end-5{grid-column-end:5}.md\:col-end-6{grid-column-end:6}.md\:col-end-7{grid-column-end:7}.md\:col-end-8{grid-column-end:8}.md\:col-end-9{grid-column-end:9}.md\:col-end-10{grid-column-end:10}.md\:col-end-11{grid-column-end:11}.md\:col-end-12{grid-column-end:12}.md\:col-end-13{grid-column-end:13}.md\:col-end-auto{grid-column-end:auto}.md\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.md\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.md\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.md\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.md\:grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.md\:grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.md\:grid-rows-none{grid-template-rows:none}.md\:auto-rows-auto{grid-auto-rows:auto}.md\:auto-rows-min{grid-auto-rows:-webkit-min-content;grid-auto-rows:min-content}.md\:auto-rows-max{grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}.md\:auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.md\:row-auto{grid-row:auto}.md\:row-span-1{grid-row:span 1/span 1}.md\:row-span-2{grid-row:span 2/span 2}.md\:row-span-3{grid-row:span 3/span 3}.md\:row-span-4{grid-row:span 4/span 4}.md\:row-span-5{grid-row:span 5/span 5}.md\:row-span-6{grid-row:span 6/span 6}.md\:row-span-full{grid-row:1/-1}.md\:row-start-1{grid-row-start:1}.md\:row-start-2{grid-row-start:2}.md\:row-start-3{grid-row-start:3}.md\:row-start-4{grid-row-start:4}.md\:row-start-5{grid-row-start:5}.md\:row-start-6{grid-row-start:6}.md\:row-start-7{grid-row-start:7}.md\:row-start-auto{grid-row-start:auto}.md\:row-end-1{grid-row-end:1}.md\:row-end-2{grid-row-end:2}.md\:row-end-3{grid-row-end:3}.md\:row-end-4{grid-row-end:4}.md\:row-end-5{grid-row-end:5}.md\:row-end-6{grid-row-end:6}.md\:row-end-7{grid-row-end:7}.md\:row-end-auto{grid-row-end:auto}.md\:transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.md\:transform-none{transform:none}.md\:origin-center{transform-origin:center}.md\:origin-top{transform-origin:top}.md\:origin-top-right{transform-origin:top right}.md\:origin-right{transform-origin:right}.md\:origin-bottom-right{transform-origin:bottom right}.md\:origin-bottom{transform-origin:bottom}.md\:origin-bottom-left{transform-origin:bottom left}.md\:origin-left{transform-origin:left}.md\:origin-top-left{transform-origin:top left}.md\:scale-0{--transform-scale-x:0;--transform-scale-y:0}.md\:scale-50{--transform-scale-x:.5;--transform-scale-y:.5}.md\:scale-75{--transform-scale-x:.75;--transform-scale-y:.75}.md\:scale-90{--transform-scale-x:.9;--transform-scale-y:.9}.md\:scale-95{--transform-scale-x:.95;--transform-scale-y:.95}.md\:scale-100{--transform-scale-x:1;--transform-scale-y:1}.md\:scale-105{--transform-scale-x:1.05;--transform-scale-y:1.05}.md\:scale-110{--transform-scale-x:1.1;--transform-scale-y:1.1}.md\:scale-125{--transform-scale-x:1.25;--transform-scale-y:1.25}.md\:scale-150{--transform-scale-x:1.5;--transform-scale-y:1.5}.md\:scale-x-0{--transform-scale-x:0}.md\:scale-x-50{--transform-scale-x:.5}.md\:scale-x-75{--transform-scale-x:.75}.md\:scale-x-90{--transform-scale-x:.9}.md\:scale-x-95{--transform-scale-x:.95}.md\:scale-x-100{--transform-scale-x:1}.md\:scale-x-105{--transform-scale-x:1.05}.md\:scale-x-110{--transform-scale-x:1.1}.md\:scale-x-125{--transform-scale-x:1.25}.md\:scale-x-150{--transform-scale-x:1.5}.md\:scale-y-0{--transform-scale-y:0}.md\:scale-y-50{--transform-scale-y:.5}.md\:scale-y-75{--transform-scale-y:.75}.md\:scale-y-90{--transform-scale-y:.9}.md\:scale-y-95{--transform-scale-y:.95}.md\:scale-y-100{--transform-scale-y:1}.md\:scale-y-105{--transform-scale-y:1.05}.md\:scale-y-110{--transform-scale-y:1.1}.md\:scale-y-125{--transform-scale-y:1.25}.md\:scale-y-150{--transform-scale-y:1.5}.md\:hover\:scale-0:hover{--transform-scale-x:0;--transform-scale-y:0}.md\:hover\:scale-50:hover{--transform-scale-x:.5;--transform-scale-y:.5}.md\:hover\:scale-75:hover{--transform-scale-x:.75;--transform-scale-y:.75}.md\:hover\:scale-90:hover{--transform-scale-x:.9;--transform-scale-y:.9}.md\:hover\:scale-95:hover{--transform-scale-x:.95;--transform-scale-y:.95}.md\:hover\:scale-100:hover{--transform-scale-x:1;--transform-scale-y:1}.md\:hover\:scale-105:hover{--transform-scale-x:1.05;--transform-scale-y:1.05}.md\:hover\:scale-110:hover{--transform-scale-x:1.1;--transform-scale-y:1.1}.md\:hover\:scale-125:hover{--transform-scale-x:1.25;--transform-scale-y:1.25}.md\:hover\:scale-150:hover{--transform-scale-x:1.5;--transform-scale-y:1.5}.md\:hover\:scale-x-0:hover{--transform-scale-x:0}.md\:hover\:scale-x-50:hover{--transform-scale-x:.5}.md\:hover\:scale-x-75:hover{--transform-scale-x:.75}.md\:hover\:scale-x-90:hover{--transform-scale-x:.9}.md\:hover\:scale-x-95:hover{--transform-scale-x:.95}.md\:hover\:scale-x-100:hover{--transform-scale-x:1}.md\:hover\:scale-x-105:hover{--transform-scale-x:1.05}.md\:hover\:scale-x-110:hover{--transform-scale-x:1.1}.md\:hover\:scale-x-125:hover{--transform-scale-x:1.25}.md\:hover\:scale-x-150:hover{--transform-scale-x:1.5}.md\:hover\:scale-y-0:hover{--transform-scale-y:0}.md\:hover\:scale-y-50:hover{--transform-scale-y:.5}.md\:hover\:scale-y-75:hover{--transform-scale-y:.75}.md\:hover\:scale-y-90:hover{--transform-scale-y:.9}.md\:hover\:scale-y-95:hover{--transform-scale-y:.95}.md\:hover\:scale-y-100:hover{--transform-scale-y:1}.md\:hover\:scale-y-105:hover{--transform-scale-y:1.05}.md\:hover\:scale-y-110:hover{--transform-scale-y:1.1}.md\:hover\:scale-y-125:hover{--transform-scale-y:1.25}.md\:hover\:scale-y-150:hover{--transform-scale-y:1.5}.md\:focus\:scale-0:focus{--transform-scale-x:0;--transform-scale-y:0}.md\:focus\:scale-50:focus{--transform-scale-x:.5;--transform-scale-y:.5}.md\:focus\:scale-75:focus{--transform-scale-x:.75;--transform-scale-y:.75}.md\:focus\:scale-90:focus{--transform-scale-x:.9;--transform-scale-y:.9}.md\:focus\:scale-95:focus{--transform-scale-x:.95;--transform-scale-y:.95}.md\:focus\:scale-100:focus{--transform-scale-x:1;--transform-scale-y:1}.md\:focus\:scale-105:focus{--transform-scale-x:1.05;--transform-scale-y:1.05}.md\:focus\:scale-110:focus{--transform-scale-x:1.1;--transform-scale-y:1.1}.md\:focus\:scale-125:focus{--transform-scale-x:1.25;--transform-scale-y:1.25}.md\:focus\:scale-150:focus{--transform-scale-x:1.5;--transform-scale-y:1.5}.md\:focus\:scale-x-0:focus{--transform-scale-x:0}.md\:focus\:scale-x-50:focus{--transform-scale-x:.5}.md\:focus\:scale-x-75:focus{--transform-scale-x:.75}.md\:focus\:scale-x-90:focus{--transform-scale-x:.9}.md\:focus\:scale-x-95:focus{--transform-scale-x:.95}.md\:focus\:scale-x-100:focus{--transform-scale-x:1}.md\:focus\:scale-x-105:focus{--transform-scale-x:1.05}.md\:focus\:scale-x-110:focus{--transform-scale-x:1.1}.md\:focus\:scale-x-125:focus{--transform-scale-x:1.25}.md\:focus\:scale-x-150:focus{--transform-scale-x:1.5}.md\:focus\:scale-y-0:focus{--transform-scale-y:0}.md\:focus\:scale-y-50:focus{--transform-scale-y:.5}.md\:focus\:scale-y-75:focus{--transform-scale-y:.75}.md\:focus\:scale-y-90:focus{--transform-scale-y:.9}.md\:focus\:scale-y-95:focus{--transform-scale-y:.95}.md\:focus\:scale-y-100:focus{--transform-scale-y:1}.md\:focus\:scale-y-105:focus{--transform-scale-y:1.05}.md\:focus\:scale-y-110:focus{--transform-scale-y:1.1}.md\:focus\:scale-y-125:focus{--transform-scale-y:1.25}.md\:focus\:scale-y-150:focus{--transform-scale-y:1.5}.md\:rotate-0{--transform-rotate:0}.md\:rotate-1{--transform-rotate:1deg}.md\:rotate-2{--transform-rotate:2deg}.md\:rotate-3{--transform-rotate:3deg}.md\:rotate-6{--transform-rotate:6deg}.md\:rotate-12{--transform-rotate:12deg}.md\:rotate-45{--transform-rotate:45deg}.md\:rotate-90{--transform-rotate:90deg}.md\:rotate-180{--transform-rotate:180deg}.md\:-rotate-180{--transform-rotate:-180deg}.md\:-rotate-90{--transform-rotate:-90deg}.md\:-rotate-45{--transform-rotate:-45deg}.md\:-rotate-12{--transform-rotate:-12deg}.md\:-rotate-6{--transform-rotate:-6deg}.md\:-rotate-3{--transform-rotate:-3deg}.md\:-rotate-2{--transform-rotate:-2deg}.md\:-rotate-1{--transform-rotate:-1deg}.md\:hover\:rotate-0:hover{--transform-rotate:0}.md\:hover\:rotate-1:hover{--transform-rotate:1deg}.md\:hover\:rotate-2:hover{--transform-rotate:2deg}.md\:hover\:rotate-3:hover{--transform-rotate:3deg}.md\:hover\:rotate-6:hover{--transform-rotate:6deg}.md\:hover\:rotate-12:hover{--transform-rotate:12deg}.md\:hover\:rotate-45:hover{--transform-rotate:45deg}.md\:hover\:rotate-90:hover{--transform-rotate:90deg}.md\:hover\:rotate-180:hover{--transform-rotate:180deg}.md\:hover\:-rotate-180:hover{--transform-rotate:-180deg}.md\:hover\:-rotate-90:hover{--transform-rotate:-90deg}.md\:hover\:-rotate-45:hover{--transform-rotate:-45deg}.md\:hover\:-rotate-12:hover{--transform-rotate:-12deg}.md\:hover\:-rotate-6:hover{--transform-rotate:-6deg}.md\:hover\:-rotate-3:hover{--transform-rotate:-3deg}.md\:hover\:-rotate-2:hover{--transform-rotate:-2deg}.md\:hover\:-rotate-1:hover{--transform-rotate:-1deg}.md\:focus\:rotate-0:focus{--transform-rotate:0}.md\:focus\:rotate-1:focus{--transform-rotate:1deg}.md\:focus\:rotate-2:focus{--transform-rotate:2deg}.md\:focus\:rotate-3:focus{--transform-rotate:3deg}.md\:focus\:rotate-6:focus{--transform-rotate:6deg}.md\:focus\:rotate-12:focus{--transform-rotate:12deg}.md\:focus\:rotate-45:focus{--transform-rotate:45deg}.md\:focus\:rotate-90:focus{--transform-rotate:90deg}.md\:focus\:rotate-180:focus{--transform-rotate:180deg}.md\:focus\:-rotate-180:focus{--transform-rotate:-180deg}.md\:focus\:-rotate-90:focus{--transform-rotate:-90deg}.md\:focus\:-rotate-45:focus{--transform-rotate:-45deg}.md\:focus\:-rotate-12:focus{--transform-rotate:-12deg}.md\:focus\:-rotate-6:focus{--transform-rotate:-6deg}.md\:focus\:-rotate-3:focus{--transform-rotate:-3deg}.md\:focus\:-rotate-2:focus{--transform-rotate:-2deg}.md\:focus\:-rotate-1:focus{--transform-rotate:-1deg}.md\:translate-x-0{--transform-translate-x:0}.md\:translate-x-1{--transform-translate-x:0.25rem}.md\:translate-x-2{--transform-translate-x:0.5rem}.md\:translate-x-3{--transform-translate-x:0.75rem}.md\:translate-x-4{--transform-translate-x:1rem}.md\:translate-x-5{--transform-translate-x:1.25rem}.md\:translate-x-6{--transform-translate-x:1.5rem}.md\:translate-x-8{--transform-translate-x:2rem}.md\:translate-x-10{--transform-translate-x:2.5rem}.md\:translate-x-12{--transform-translate-x:3rem}.md\:translate-x-16{--transform-translate-x:4rem}.md\:translate-x-20{--transform-translate-x:5rem}.md\:translate-x-24{--transform-translate-x:6rem}.md\:translate-x-32{--transform-translate-x:8rem}.md\:translate-x-40{--transform-translate-x:10rem}.md\:translate-x-48{--transform-translate-x:12rem}.md\:translate-x-56{--transform-translate-x:14rem}.md\:translate-x-64{--transform-translate-x:16rem}.md\:translate-x-px{--transform-translate-x:1px}.md\:-translate-x-1{--transform-translate-x:-0.25rem}.md\:-translate-x-2{--transform-translate-x:-0.5rem}.md\:-translate-x-3{--transform-translate-x:-0.75rem}.md\:-translate-x-4{--transform-translate-x:-1rem}.md\:-translate-x-5{--transform-translate-x:-1.25rem}.md\:-translate-x-6{--transform-translate-x:-1.5rem}.md\:-translate-x-8{--transform-translate-x:-2rem}.md\:-translate-x-10{--transform-translate-x:-2.5rem}.md\:-translate-x-12{--transform-translate-x:-3rem}.md\:-translate-x-16{--transform-translate-x:-4rem}.md\:-translate-x-20{--transform-translate-x:-5rem}.md\:-translate-x-24{--transform-translate-x:-6rem}.md\:-translate-x-32{--transform-translate-x:-8rem}.md\:-translate-x-40{--transform-translate-x:-10rem}.md\:-translate-x-48{--transform-translate-x:-12rem}.md\:-translate-x-56{--transform-translate-x:-14rem}.md\:-translate-x-64{--transform-translate-x:-16rem}.md\:-translate-x-px{--transform-translate-x:-1px}.md\:-translate-x-full{--transform-translate-x:-100%}.md\:-translate-x-1\/2{--transform-translate-x:-50%}.md\:translate-x-1\/2{--transform-translate-x:50%}.md\:translate-x-full{--transform-translate-x:100%}.md\:translate-y-0{--transform-translate-y:0}.md\:translate-y-1{--transform-translate-y:0.25rem}.md\:translate-y-2{--transform-translate-y:0.5rem}.md\:translate-y-3{--transform-translate-y:0.75rem}.md\:translate-y-4{--transform-translate-y:1rem}.md\:translate-y-5{--transform-translate-y:1.25rem}.md\:translate-y-6{--transform-translate-y:1.5rem}.md\:translate-y-8{--transform-translate-y:2rem}.md\:translate-y-10{--transform-translate-y:2.5rem}.md\:translate-y-12{--transform-translate-y:3rem}.md\:translate-y-16{--transform-translate-y:4rem}.md\:translate-y-20{--transform-translate-y:5rem}.md\:translate-y-24{--transform-translate-y:6rem}.md\:translate-y-32{--transform-translate-y:8rem}.md\:translate-y-40{--transform-translate-y:10rem}.md\:translate-y-48{--transform-translate-y:12rem}.md\:translate-y-56{--transform-translate-y:14rem}.md\:translate-y-64{--transform-translate-y:16rem}.md\:translate-y-px{--transform-translate-y:1px}.md\:-translate-y-1{--transform-translate-y:-0.25rem}.md\:-translate-y-2{--transform-translate-y:-0.5rem}.md\:-translate-y-3{--transform-translate-y:-0.75rem}.md\:-translate-y-4{--transform-translate-y:-1rem}.md\:-translate-y-5{--transform-translate-y:-1.25rem}.md\:-translate-y-6{--transform-translate-y:-1.5rem}.md\:-translate-y-8{--transform-translate-y:-2rem}.md\:-translate-y-10{--transform-translate-y:-2.5rem}.md\:-translate-y-12{--transform-translate-y:-3rem}.md\:-translate-y-16{--transform-translate-y:-4rem}.md\:-translate-y-20{--transform-translate-y:-5rem}.md\:-translate-y-24{--transform-translate-y:-6rem}.md\:-translate-y-32{--transform-translate-y:-8rem}.md\:-translate-y-40{--transform-translate-y:-10rem}.md\:-translate-y-48{--transform-translate-y:-12rem}.md\:-translate-y-56{--transform-translate-y:-14rem}.md\:-translate-y-64{--transform-translate-y:-16rem}.md\:-translate-y-px{--transform-translate-y:-1px}.md\:-translate-y-full{--transform-translate-y:-100%}.md\:-translate-y-1\/2{--transform-translate-y:-50%}.md\:translate-y-1\/2{--transform-translate-y:50%}.md\:translate-y-full{--transform-translate-y:100%}.md\:hover\:translate-x-0:hover{--transform-translate-x:0}.md\:hover\:translate-x-1:hover{--transform-translate-x:0.25rem}.md\:hover\:translate-x-2:hover{--transform-translate-x:0.5rem}.md\:hover\:translate-x-3:hover{--transform-translate-x:0.75rem}.md\:hover\:translate-x-4:hover{--transform-translate-x:1rem}.md\:hover\:translate-x-5:hover{--transform-translate-x:1.25rem}.md\:hover\:translate-x-6:hover{--transform-translate-x:1.5rem}.md\:hover\:translate-x-8:hover{--transform-translate-x:2rem}.md\:hover\:translate-x-10:hover{--transform-translate-x:2.5rem}.md\:hover\:translate-x-12:hover{--transform-translate-x:3rem}.md\:hover\:translate-x-16:hover{--transform-translate-x:4rem}.md\:hover\:translate-x-20:hover{--transform-translate-x:5rem}.md\:hover\:translate-x-24:hover{--transform-translate-x:6rem}.md\:hover\:translate-x-32:hover{--transform-translate-x:8rem}.md\:hover\:translate-x-40:hover{--transform-translate-x:10rem}.md\:hover\:translate-x-48:hover{--transform-translate-x:12rem}.md\:hover\:translate-x-56:hover{--transform-translate-x:14rem}.md\:hover\:translate-x-64:hover{--transform-translate-x:16rem}.md\:hover\:translate-x-px:hover{--transform-translate-x:1px}.md\:hover\:-translate-x-1:hover{--transform-translate-x:-0.25rem}.md\:hover\:-translate-x-2:hover{--transform-translate-x:-0.5rem}.md\:hover\:-translate-x-3:hover{--transform-translate-x:-0.75rem}.md\:hover\:-translate-x-4:hover{--transform-translate-x:-1rem}.md\:hover\:-translate-x-5:hover{--transform-translate-x:-1.25rem}.md\:hover\:-translate-x-6:hover{--transform-translate-x:-1.5rem}.md\:hover\:-translate-x-8:hover{--transform-translate-x:-2rem}.md\:hover\:-translate-x-10:hover{--transform-translate-x:-2.5rem}.md\:hover\:-translate-x-12:hover{--transform-translate-x:-3rem}.md\:hover\:-translate-x-16:hover{--transform-translate-x:-4rem}.md\:hover\:-translate-x-20:hover{--transform-translate-x:-5rem}.md\:hover\:-translate-x-24:hover{--transform-translate-x:-6rem}.md\:hover\:-translate-x-32:hover{--transform-translate-x:-8rem}.md\:hover\:-translate-x-40:hover{--transform-translate-x:-10rem}.md\:hover\:-translate-x-48:hover{--transform-translate-x:-12rem}.md\:hover\:-translate-x-56:hover{--transform-translate-x:-14rem}.md\:hover\:-translate-x-64:hover{--transform-translate-x:-16rem}.md\:hover\:-translate-x-px:hover{--transform-translate-x:-1px}.md\:hover\:-translate-x-full:hover{--transform-translate-x:-100%}.md\:hover\:-translate-x-1\/2:hover{--transform-translate-x:-50%}.md\:hover\:translate-x-1\/2:hover{--transform-translate-x:50%}.md\:hover\:translate-x-full:hover{--transform-translate-x:100%}.md\:hover\:translate-y-0:hover{--transform-translate-y:0}.md\:hover\:translate-y-1:hover{--transform-translate-y:0.25rem}.md\:hover\:translate-y-2:hover{--transform-translate-y:0.5rem}.md\:hover\:translate-y-3:hover{--transform-translate-y:0.75rem}.md\:hover\:translate-y-4:hover{--transform-translate-y:1rem}.md\:hover\:translate-y-5:hover{--transform-translate-y:1.25rem}.md\:hover\:translate-y-6:hover{--transform-translate-y:1.5rem}.md\:hover\:translate-y-8:hover{--transform-translate-y:2rem}.md\:hover\:translate-y-10:hover{--transform-translate-y:2.5rem}.md\:hover\:translate-y-12:hover{--transform-translate-y:3rem}.md\:hover\:translate-y-16:hover{--transform-translate-y:4rem}.md\:hover\:translate-y-20:hover{--transform-translate-y:5rem}.md\:hover\:translate-y-24:hover{--transform-translate-y:6rem}.md\:hover\:translate-y-32:hover{--transform-translate-y:8rem}.md\:hover\:translate-y-40:hover{--transform-translate-y:10rem}.md\:hover\:translate-y-48:hover{--transform-translate-y:12rem}.md\:hover\:translate-y-56:hover{--transform-translate-y:14rem}.md\:hover\:translate-y-64:hover{--transform-translate-y:16rem}.md\:hover\:translate-y-px:hover{--transform-translate-y:1px}.md\:hover\:-translate-y-1:hover{--transform-translate-y:-0.25rem}.md\:hover\:-translate-y-2:hover{--transform-translate-y:-0.5rem}.md\:hover\:-translate-y-3:hover{--transform-translate-y:-0.75rem}.md\:hover\:-translate-y-4:hover{--transform-translate-y:-1rem}.md\:hover\:-translate-y-5:hover{--transform-translate-y:-1.25rem}.md\:hover\:-translate-y-6:hover{--transform-translate-y:-1.5rem}.md\:hover\:-translate-y-8:hover{--transform-translate-y:-2rem}.md\:hover\:-translate-y-10:hover{--transform-translate-y:-2.5rem}.md\:hover\:-translate-y-12:hover{--transform-translate-y:-3rem}.md\:hover\:-translate-y-16:hover{--transform-translate-y:-4rem}.md\:hover\:-translate-y-20:hover{--transform-translate-y:-5rem}.md\:hover\:-translate-y-24:hover{--transform-translate-y:-6rem}.md\:hover\:-translate-y-32:hover{--transform-translate-y:-8rem}.md\:hover\:-translate-y-40:hover{--transform-translate-y:-10rem}.md\:hover\:-translate-y-48:hover{--transform-translate-y:-12rem}.md\:hover\:-translate-y-56:hover{--transform-translate-y:-14rem}.md\:hover\:-translate-y-64:hover{--transform-translate-y:-16rem}.md\:hover\:-translate-y-px:hover{--transform-translate-y:-1px}.md\:hover\:-translate-y-full:hover{--transform-translate-y:-100%}.md\:hover\:-translate-y-1\/2:hover{--transform-translate-y:-50%}.md\:hover\:translate-y-1\/2:hover{--transform-translate-y:50%}.md\:hover\:translate-y-full:hover{--transform-translate-y:100%}.md\:focus\:translate-x-0:focus{--transform-translate-x:0}.md\:focus\:translate-x-1:focus{--transform-translate-x:0.25rem}.md\:focus\:translate-x-2:focus{--transform-translate-x:0.5rem}.md\:focus\:translate-x-3:focus{--transform-translate-x:0.75rem}.md\:focus\:translate-x-4:focus{--transform-translate-x:1rem}.md\:focus\:translate-x-5:focus{--transform-translate-x:1.25rem}.md\:focus\:translate-x-6:focus{--transform-translate-x:1.5rem}.md\:focus\:translate-x-8:focus{--transform-translate-x:2rem}.md\:focus\:translate-x-10:focus{--transform-translate-x:2.5rem}.md\:focus\:translate-x-12:focus{--transform-translate-x:3rem}.md\:focus\:translate-x-16:focus{--transform-translate-x:4rem}.md\:focus\:translate-x-20:focus{--transform-translate-x:5rem}.md\:focus\:translate-x-24:focus{--transform-translate-x:6rem}.md\:focus\:translate-x-32:focus{--transform-translate-x:8rem}.md\:focus\:translate-x-40:focus{--transform-translate-x:10rem}.md\:focus\:translate-x-48:focus{--transform-translate-x:12rem}.md\:focus\:translate-x-56:focus{--transform-translate-x:14rem}.md\:focus\:translate-x-64:focus{--transform-translate-x:16rem}.md\:focus\:translate-x-px:focus{--transform-translate-x:1px}.md\:focus\:-translate-x-1:focus{--transform-translate-x:-0.25rem}.md\:focus\:-translate-x-2:focus{--transform-translate-x:-0.5rem}.md\:focus\:-translate-x-3:focus{--transform-translate-x:-0.75rem}.md\:focus\:-translate-x-4:focus{--transform-translate-x:-1rem}.md\:focus\:-translate-x-5:focus{--transform-translate-x:-1.25rem}.md\:focus\:-translate-x-6:focus{--transform-translate-x:-1.5rem}.md\:focus\:-translate-x-8:focus{--transform-translate-x:-2rem}.md\:focus\:-translate-x-10:focus{--transform-translate-x:-2.5rem}.md\:focus\:-translate-x-12:focus{--transform-translate-x:-3rem}.md\:focus\:-translate-x-16:focus{--transform-translate-x:-4rem}.md\:focus\:-translate-x-20:focus{--transform-translate-x:-5rem}.md\:focus\:-translate-x-24:focus{--transform-translate-x:-6rem}.md\:focus\:-translate-x-32:focus{--transform-translate-x:-8rem}.md\:focus\:-translate-x-40:focus{--transform-translate-x:-10rem}.md\:focus\:-translate-x-48:focus{--transform-translate-x:-12rem}.md\:focus\:-translate-x-56:focus{--transform-translate-x:-14rem}.md\:focus\:-translate-x-64:focus{--transform-translate-x:-16rem}.md\:focus\:-translate-x-px:focus{--transform-translate-x:-1px}.md\:focus\:-translate-x-full:focus{--transform-translate-x:-100%}.md\:focus\:-translate-x-1\/2:focus{--transform-translate-x:-50%}.md\:focus\:translate-x-1\/2:focus{--transform-translate-x:50%}.md\:focus\:translate-x-full:focus{--transform-translate-x:100%}.md\:focus\:translate-y-0:focus{--transform-translate-y:0}.md\:focus\:translate-y-1:focus{--transform-translate-y:0.25rem}.md\:focus\:translate-y-2:focus{--transform-translate-y:0.5rem}.md\:focus\:translate-y-3:focus{--transform-translate-y:0.75rem}.md\:focus\:translate-y-4:focus{--transform-translate-y:1rem}.md\:focus\:translate-y-5:focus{--transform-translate-y:1.25rem}.md\:focus\:translate-y-6:focus{--transform-translate-y:1.5rem}.md\:focus\:translate-y-8:focus{--transform-translate-y:2rem}.md\:focus\:translate-y-10:focus{--transform-translate-y:2.5rem}.md\:focus\:translate-y-12:focus{--transform-translate-y:3rem}.md\:focus\:translate-y-16:focus{--transform-translate-y:4rem}.md\:focus\:translate-y-20:focus{--transform-translate-y:5rem}.md\:focus\:translate-y-24:focus{--transform-translate-y:6rem}.md\:focus\:translate-y-32:focus{--transform-translate-y:8rem}.md\:focus\:translate-y-40:focus{--transform-translate-y:10rem}.md\:focus\:translate-y-48:focus{--transform-translate-y:12rem}.md\:focus\:translate-y-56:focus{--transform-translate-y:14rem}.md\:focus\:translate-y-64:focus{--transform-translate-y:16rem}.md\:focus\:translate-y-px:focus{--transform-translate-y:1px}.md\:focus\:-translate-y-1:focus{--transform-translate-y:-0.25rem}.md\:focus\:-translate-y-2:focus{--transform-translate-y:-0.5rem}.md\:focus\:-translate-y-3:focus{--transform-translate-y:-0.75rem}.md\:focus\:-translate-y-4:focus{--transform-translate-y:-1rem}.md\:focus\:-translate-y-5:focus{--transform-translate-y:-1.25rem}.md\:focus\:-translate-y-6:focus{--transform-translate-y:-1.5rem}.md\:focus\:-translate-y-8:focus{--transform-translate-y:-2rem}.md\:focus\:-translate-y-10:focus{--transform-translate-y:-2.5rem}.md\:focus\:-translate-y-12:focus{--transform-translate-y:-3rem}.md\:focus\:-translate-y-16:focus{--transform-translate-y:-4rem}.md\:focus\:-translate-y-20:focus{--transform-translate-y:-5rem}.md\:focus\:-translate-y-24:focus{--transform-translate-y:-6rem}.md\:focus\:-translate-y-32:focus{--transform-translate-y:-8rem}.md\:focus\:-translate-y-40:focus{--transform-translate-y:-10rem}.md\:focus\:-translate-y-48:focus{--transform-translate-y:-12rem}.md\:focus\:-translate-y-56:focus{--transform-translate-y:-14rem}.md\:focus\:-translate-y-64:focus{--transform-translate-y:-16rem}.md\:focus\:-translate-y-px:focus{--transform-translate-y:-1px}.md\:focus\:-translate-y-full:focus{--transform-translate-y:-100%}.md\:focus\:-translate-y-1\/2:focus{--transform-translate-y:-50%}.md\:focus\:translate-y-1\/2:focus{--transform-translate-y:50%}.md\:focus\:translate-y-full:focus{--transform-translate-y:100%}.md\:skew-x-0{--transform-skew-x:0}.md\:skew-x-1{--transform-skew-x:1deg}.md\:skew-x-2{--transform-skew-x:2deg}.md\:skew-x-3{--transform-skew-x:3deg}.md\:skew-x-6{--transform-skew-x:6deg}.md\:skew-x-12{--transform-skew-x:12deg}.md\:-skew-x-12{--transform-skew-x:-12deg}.md\:-skew-x-6{--transform-skew-x:-6deg}.md\:-skew-x-3{--transform-skew-x:-3deg}.md\:-skew-x-2{--transform-skew-x:-2deg}.md\:-skew-x-1{--transform-skew-x:-1deg}.md\:skew-y-0{--transform-skew-y:0}.md\:skew-y-1{--transform-skew-y:1deg}.md\:skew-y-2{--transform-skew-y:2deg}.md\:skew-y-3{--transform-skew-y:3deg}.md\:skew-y-6{--transform-skew-y:6deg}.md\:skew-y-12{--transform-skew-y:12deg}.md\:-skew-y-12{--transform-skew-y:-12deg}.md\:-skew-y-6{--transform-skew-y:-6deg}.md\:-skew-y-3{--transform-skew-y:-3deg}.md\:-skew-y-2{--transform-skew-y:-2deg}.md\:-skew-y-1{--transform-skew-y:-1deg}.md\:hover\:skew-x-0:hover{--transform-skew-x:0}.md\:hover\:skew-x-1:hover{--transform-skew-x:1deg}.md\:hover\:skew-x-2:hover{--transform-skew-x:2deg}.md\:hover\:skew-x-3:hover{--transform-skew-x:3deg}.md\:hover\:skew-x-6:hover{--transform-skew-x:6deg}.md\:hover\:skew-x-12:hover{--transform-skew-x:12deg}.md\:hover\:-skew-x-12:hover{--transform-skew-x:-12deg}.md\:hover\:-skew-x-6:hover{--transform-skew-x:-6deg}.md\:hover\:-skew-x-3:hover{--transform-skew-x:-3deg}.md\:hover\:-skew-x-2:hover{--transform-skew-x:-2deg}.md\:hover\:-skew-x-1:hover{--transform-skew-x:-1deg}.md\:hover\:skew-y-0:hover{--transform-skew-y:0}.md\:hover\:skew-y-1:hover{--transform-skew-y:1deg}.md\:hover\:skew-y-2:hover{--transform-skew-y:2deg}.md\:hover\:skew-y-3:hover{--transform-skew-y:3deg}.md\:hover\:skew-y-6:hover{--transform-skew-y:6deg}.md\:hover\:skew-y-12:hover{--transform-skew-y:12deg}.md\:hover\:-skew-y-12:hover{--transform-skew-y:-12deg}.md\:hover\:-skew-y-6:hover{--transform-skew-y:-6deg}.md\:hover\:-skew-y-3:hover{--transform-skew-y:-3deg}.md\:hover\:-skew-y-2:hover{--transform-skew-y:-2deg}.md\:hover\:-skew-y-1:hover{--transform-skew-y:-1deg}.md\:focus\:skew-x-0:focus{--transform-skew-x:0}.md\:focus\:skew-x-1:focus{--transform-skew-x:1deg}.md\:focus\:skew-x-2:focus{--transform-skew-x:2deg}.md\:focus\:skew-x-3:focus{--transform-skew-x:3deg}.md\:focus\:skew-x-6:focus{--transform-skew-x:6deg}.md\:focus\:skew-x-12:focus{--transform-skew-x:12deg}.md\:focus\:-skew-x-12:focus{--transform-skew-x:-12deg}.md\:focus\:-skew-x-6:focus{--transform-skew-x:-6deg}.md\:focus\:-skew-x-3:focus{--transform-skew-x:-3deg}.md\:focus\:-skew-x-2:focus{--transform-skew-x:-2deg}.md\:focus\:-skew-x-1:focus{--transform-skew-x:-1deg}.md\:focus\:skew-y-0:focus{--transform-skew-y:0}.md\:focus\:skew-y-1:focus{--transform-skew-y:1deg}.md\:focus\:skew-y-2:focus{--transform-skew-y:2deg}.md\:focus\:skew-y-3:focus{--transform-skew-y:3deg}.md\:focus\:skew-y-6:focus{--transform-skew-y:6deg}.md\:focus\:skew-y-12:focus{--transform-skew-y:12deg}.md\:focus\:-skew-y-12:focus{--transform-skew-y:-12deg}.md\:focus\:-skew-y-6:focus{--transform-skew-y:-6deg}.md\:focus\:-skew-y-3:focus{--transform-skew-y:-3deg}.md\:focus\:-skew-y-2:focus{--transform-skew-y:-2deg}.md\:focus\:-skew-y-1:focus{--transform-skew-y:-1deg}.md\:transition-none{transition-property:none}.md\:transition-all{transition-property:all}.md\:transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform}.md\:transition-colors{transition-property:background-color,border-color,color,fill,stroke}.md\:transition-opacity{transition-property:opacity}.md\:transition-shadow{transition-property:box-shadow}.md\:transition-transform{transition-property:transform}.md\:ease-linear{transition-timing-function:linear}.md\:ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.md\:ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.md\:ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.md\:duration-75{transition-duration:75ms}.md\:duration-100{transition-duration:.1s}.md\:duration-150{transition-duration:150ms}.md\:duration-200{transition-duration:.2s}.md\:duration-300{transition-duration:.3s}.md\:duration-500{transition-duration:.5s}.md\:duration-700{transition-duration:.7s}.md\:duration-1000{transition-duration:1s}.md\:delay-75{transition-delay:75ms}.md\:delay-100{transition-delay:.1s}.md\:delay-150{transition-delay:150ms}.md\:delay-200{transition-delay:.2s}.md\:delay-300{transition-delay:.3s}.md\:delay-500{transition-delay:.5s}.md\:delay-700{transition-delay:.7s}.md\:delay-1000{transition-delay:1s}.md\:animate-none{animation:none}.md\:animate-spin{animation:spin 1s linear infinite}.md\:animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.md\:animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.md\:animate-bounce{animation:bounce 1s infinite}}@media (min-width:1024px){.lg\:container{width:100%}@media (min-width:640px){.lg\:container{max-width:640px}}@media (min-width:768px){.lg\:container{max-width:768px}}@media (min-width:1024px){.lg\:container{max-width:1024px}}@media (min-width:1280px){.lg\:container{max-width:1280px}}.lg\:space-y-0>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(0px * var(--space-y-reverse))}.lg\:space-x-0>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(0px * var(--space-x-reverse));margin-left:calc(0px * calc(1 - var(--space-x-reverse)))}.lg\:space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.25rem * var(--space-y-reverse))}.lg\:space-x-1>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.25rem * var(--space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.5rem * var(--space-y-reverse))}.lg\:space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.5rem * var(--space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.75rem * var(--space-y-reverse))}.lg\:space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.75rem * var(--space-x-reverse));margin-left:calc(.75rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1rem * var(--space-y-reverse))}.lg\:space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1rem * var(--space-x-reverse));margin-left:calc(1rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1.25rem * var(--space-y-reverse))}.lg\:space-x-5>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1.25rem * var(--space-x-reverse));margin-left:calc(1.25rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-6>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1.5rem * var(--space-y-reverse))}.lg\:space-x-6>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1.5rem * var(--space-x-reverse));margin-left:calc(1.5rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-8>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(2rem * var(--space-y-reverse))}.lg\:space-x-8>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(2rem * var(--space-x-reverse));margin-left:calc(2rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(2.5rem * var(--space-y-reverse))}.lg\:space-x-10>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(2.5rem * var(--space-x-reverse));margin-left:calc(2.5rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-12>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(3rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(3rem * var(--space-y-reverse))}.lg\:space-x-12>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(3rem * var(--space-x-reverse));margin-left:calc(3rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-16>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(4rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(4rem * var(--space-y-reverse))}.lg\:space-x-16>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(4rem * var(--space-x-reverse));margin-left:calc(4rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-20>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(5rem * var(--space-y-reverse))}.lg\:space-x-20>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(5rem * var(--space-x-reverse));margin-left:calc(5rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-24>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(6rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(6rem * var(--space-y-reverse))}.lg\:space-x-24>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(6rem * var(--space-x-reverse));margin-left:calc(6rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-32>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(8rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(8rem * var(--space-y-reverse))}.lg\:space-x-32>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(8rem * var(--space-x-reverse));margin-left:calc(8rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-40>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(10rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(10rem * var(--space-y-reverse))}.lg\:space-x-40>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(10rem * var(--space-x-reverse));margin-left:calc(10rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-48>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(12rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(12rem * var(--space-y-reverse))}.lg\:space-x-48>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(12rem * var(--space-x-reverse));margin-left:calc(12rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-56>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(14rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(14rem * var(--space-y-reverse))}.lg\:space-x-56>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(14rem * var(--space-x-reverse));margin-left:calc(14rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-64>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(16rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(16rem * var(--space-y-reverse))}.lg\:space-x-64>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(16rem * var(--space-x-reverse));margin-left:calc(16rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-px>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1px * var(--space-y-reverse))}.lg\:space-x-px>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1px * var(--space-x-reverse));margin-left:calc(1px * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.25rem * var(--space-y-reverse))}.lg\:-space-x-1>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.25rem * var(--space-x-reverse));margin-left:calc(-.25rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.5rem * var(--space-y-reverse))}.lg\:-space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.5rem * var(--space-x-reverse));margin-left:calc(-.5rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.75rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.75rem * var(--space-y-reverse))}.lg\:-space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.75rem * var(--space-x-reverse));margin-left:calc(-.75rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1rem * var(--space-y-reverse))}.lg\:-space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1rem * var(--space-x-reverse));margin-left:calc(-1rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1.25rem * var(--space-y-reverse))}.lg\:-space-x-5>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1.25rem * var(--space-x-reverse));margin-left:calc(-1.25rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-6>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1.5rem * var(--space-y-reverse))}.lg\:-space-x-6>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1.5rem * var(--space-x-reverse));margin-left:calc(-1.5rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-8>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-2rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-2rem * var(--space-y-reverse))}.lg\:-space-x-8>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-2rem * var(--space-x-reverse));margin-left:calc(-2rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-2.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-2.5rem * var(--space-y-reverse))}.lg\:-space-x-10>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-2.5rem * var(--space-x-reverse));margin-left:calc(-2.5rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-12>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-3rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-3rem * var(--space-y-reverse))}.lg\:-space-x-12>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-3rem * var(--space-x-reverse));margin-left:calc(-3rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-16>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-4rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-4rem * var(--space-y-reverse))}.lg\:-space-x-16>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-4rem * var(--space-x-reverse));margin-left:calc(-4rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-20>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-5rem * var(--space-y-reverse))}.lg\:-space-x-20>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-5rem * var(--space-x-reverse));margin-left:calc(-5rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-24>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-6rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-6rem * var(--space-y-reverse))}.lg\:-space-x-24>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-6rem * var(--space-x-reverse));margin-left:calc(-6rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-32>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-8rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-8rem * var(--space-y-reverse))}.lg\:-space-x-32>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-8rem * var(--space-x-reverse));margin-left:calc(-8rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-40>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-10rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-10rem * var(--space-y-reverse))}.lg\:-space-x-40>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-10rem * var(--space-x-reverse));margin-left:calc(-10rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-48>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-12rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-12rem * var(--space-y-reverse))}.lg\:-space-x-48>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-12rem * var(--space-x-reverse));margin-left:calc(-12rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-56>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-14rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-14rem * var(--space-y-reverse))}.lg\:-space-x-56>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-14rem * var(--space-x-reverse));margin-left:calc(-14rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-64>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-16rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-16rem * var(--space-y-reverse))}.lg\:-space-x-64>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-16rem * var(--space-x-reverse));margin-left:calc(-16rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-px>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1px * var(--space-y-reverse))}.lg\:-space-x-px>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1px * var(--space-x-reverse));margin-left:calc(-1px * calc(1 - var(--space-x-reverse)))}.lg\:space-y-reverse>:not(template)~:not(template){--space-y-reverse:1}.lg\:space-x-reverse>:not(template)~:not(template){--space-x-reverse:1}.lg\:divide-y-0>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(0px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(0px * var(--divide-y-reverse))}.lg\:divide-x-0>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(0px * var(--divide-x-reverse));border-left-width:calc(0px * calc(1 - var(--divide-x-reverse)))}.lg\:divide-y-2>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(2px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(2px * var(--divide-y-reverse))}.lg\:divide-x-2>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(2px * var(--divide-x-reverse));border-left-width:calc(2px * calc(1 - var(--divide-x-reverse)))}.lg\:divide-y-4>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(4px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(4px * var(--divide-y-reverse))}.lg\:divide-x-4>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(4px * var(--divide-x-reverse));border-left-width:calc(4px * calc(1 - var(--divide-x-reverse)))}.lg\:divide-y-8>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(8px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(8px * var(--divide-y-reverse))}.lg\:divide-x-8>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(8px * var(--divide-x-reverse));border-left-width:calc(8px * calc(1 - var(--divide-x-reverse)))}.lg\:divide-y>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(1px * var(--divide-y-reverse))}.lg\:divide-x>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(1px * var(--divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--divide-x-reverse)))}.lg\:divide-y-reverse>:not(template)~:not(template){--divide-y-reverse:1}.lg\:divide-x-reverse>:not(template)~:not(template){--divide-x-reverse:1}.lg\:divide-transparent>:not(template)~:not(template){border-color:transparent}.lg\:divide-current>:not(template)~:not(template){border-color:currentColor}.lg\:divide-black>:not(template)~:not(template){--divide-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--divide-opacity))}.lg\:divide-white>:not(template)~:not(template){--divide-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--divide-opacity))}.lg\:divide-gray-100>:not(template)~:not(template){--divide-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--divide-opacity))}.lg\:divide-gray-200>:not(template)~:not(template){--divide-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--divide-opacity))}.lg\:divide-gray-300>:not(template)~:not(template){--divide-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--divide-opacity))}.lg\:divide-gray-400>:not(template)~:not(template){--divide-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--divide-opacity))}.lg\:divide-gray-500>:not(template)~:not(template){--divide-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--divide-opacity))}.lg\:divide-gray-600>:not(template)~:not(template){--divide-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--divide-opacity))}.lg\:divide-gray-700>:not(template)~:not(template){--divide-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--divide-opacity))}.lg\:divide-gray-800>:not(template)~:not(template){--divide-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--divide-opacity))}.lg\:divide-gray-900>:not(template)~:not(template){--divide-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--divide-opacity))}.lg\:divide-red-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--divide-opacity))}.lg\:divide-red-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--divide-opacity))}.lg\:divide-red-300>:not(template)~:not(template){--divide-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--divide-opacity))}.lg\:divide-red-400>:not(template)~:not(template){--divide-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--divide-opacity))}.lg\:divide-red-500>:not(template)~:not(template){--divide-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--divide-opacity))}.lg\:divide-red-600>:not(template)~:not(template){--divide-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--divide-opacity))}.lg\:divide-red-700>:not(template)~:not(template){--divide-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--divide-opacity))}.lg\:divide-red-800>:not(template)~:not(template){--divide-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--divide-opacity))}.lg\:divide-red-900>:not(template)~:not(template){--divide-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--divide-opacity))}.lg\:divide-orange-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--divide-opacity))}.lg\:divide-orange-200>:not(template)~:not(template){--divide-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--divide-opacity))}.lg\:divide-orange-300>:not(template)~:not(template){--divide-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--divide-opacity))}.lg\:divide-orange-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--divide-opacity))}.lg\:divide-orange-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--divide-opacity))}.lg\:divide-orange-600>:not(template)~:not(template){--divide-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--divide-opacity))}.lg\:divide-orange-700>:not(template)~:not(template){--divide-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--divide-opacity))}.lg\:divide-orange-800>:not(template)~:not(template){--divide-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--divide-opacity))}.lg\:divide-orange-900>:not(template)~:not(template){--divide-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--divide-opacity))}.lg\:divide-yellow-100>:not(template)~:not(template){--divide-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--divide-opacity))}.lg\:divide-yellow-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--divide-opacity))}.lg\:divide-yellow-300>:not(template)~:not(template){--divide-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--divide-opacity))}.lg\:divide-yellow-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--divide-opacity))}.lg\:divide-yellow-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--divide-opacity))}.lg\:divide-yellow-600>:not(template)~:not(template){--divide-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--divide-opacity))}.lg\:divide-yellow-700>:not(template)~:not(template){--divide-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--divide-opacity))}.lg\:divide-yellow-800>:not(template)~:not(template){--divide-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--divide-opacity))}.lg\:divide-yellow-900>:not(template)~:not(template){--divide-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--divide-opacity))}.lg\:divide-green-100>:not(template)~:not(template){--divide-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--divide-opacity))}.lg\:divide-green-200>:not(template)~:not(template){--divide-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--divide-opacity))}.lg\:divide-green-300>:not(template)~:not(template){--divide-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--divide-opacity))}.lg\:divide-green-400>:not(template)~:not(template){--divide-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--divide-opacity))}.lg\:divide-green-500>:not(template)~:not(template){--divide-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--divide-opacity))}.lg\:divide-green-600>:not(template)~:not(template){--divide-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--divide-opacity))}.lg\:divide-green-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--divide-opacity))}.lg\:divide-green-800>:not(template)~:not(template){--divide-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--divide-opacity))}.lg\:divide-green-900>:not(template)~:not(template){--divide-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--divide-opacity))}.lg\:divide-teal-100>:not(template)~:not(template){--divide-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--divide-opacity))}.lg\:divide-teal-200>:not(template)~:not(template){--divide-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--divide-opacity))}.lg\:divide-teal-300>:not(template)~:not(template){--divide-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--divide-opacity))}.lg\:divide-teal-400>:not(template)~:not(template){--divide-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--divide-opacity))}.lg\:divide-teal-500>:not(template)~:not(template){--divide-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--divide-opacity))}.lg\:divide-teal-600>:not(template)~:not(template){--divide-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--divide-opacity))}.lg\:divide-teal-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--divide-opacity))}.lg\:divide-teal-800>:not(template)~:not(template){--divide-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--divide-opacity))}.lg\:divide-teal-900>:not(template)~:not(template){--divide-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--divide-opacity))}.lg\:divide-blue-100>:not(template)~:not(template){--divide-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--divide-opacity))}.lg\:divide-blue-200>:not(template)~:not(template){--divide-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--divide-opacity))}.lg\:divide-blue-300>:not(template)~:not(template){--divide-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--divide-opacity))}.lg\:divide-blue-400>:not(template)~:not(template){--divide-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--divide-opacity))}.lg\:divide-blue-500>:not(template)~:not(template){--divide-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--divide-opacity))}.lg\:divide-blue-600>:not(template)~:not(template){--divide-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--divide-opacity))}.lg\:divide-blue-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--divide-opacity))}.lg\:divide-blue-800>:not(template)~:not(template){--divide-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--divide-opacity))}.lg\:divide-blue-900>:not(template)~:not(template){--divide-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--divide-opacity))}.lg\:divide-indigo-100>:not(template)~:not(template){--divide-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--divide-opacity))}.lg\:divide-indigo-200>:not(template)~:not(template){--divide-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--divide-opacity))}.lg\:divide-indigo-300>:not(template)~:not(template){--divide-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--divide-opacity))}.lg\:divide-indigo-400>:not(template)~:not(template){--divide-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--divide-opacity))}.lg\:divide-indigo-500>:not(template)~:not(template){--divide-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--divide-opacity))}.lg\:divide-indigo-600>:not(template)~:not(template){--divide-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--divide-opacity))}.lg\:divide-indigo-700>:not(template)~:not(template){--divide-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--divide-opacity))}.lg\:divide-indigo-800>:not(template)~:not(template){--divide-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--divide-opacity))}.lg\:divide-indigo-900>:not(template)~:not(template){--divide-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--divide-opacity))}.lg\:divide-purple-100>:not(template)~:not(template){--divide-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--divide-opacity))}.lg\:divide-purple-200>:not(template)~:not(template){--divide-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--divide-opacity))}.lg\:divide-purple-300>:not(template)~:not(template){--divide-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--divide-opacity))}.lg\:divide-purple-400>:not(template)~:not(template){--divide-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--divide-opacity))}.lg\:divide-purple-500>:not(template)~:not(template){--divide-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--divide-opacity))}.lg\:divide-purple-600>:not(template)~:not(template){--divide-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--divide-opacity))}.lg\:divide-purple-700>:not(template)~:not(template){--divide-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--divide-opacity))}.lg\:divide-purple-800>:not(template)~:not(template){--divide-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--divide-opacity))}.lg\:divide-purple-900>:not(template)~:not(template){--divide-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--divide-opacity))}.lg\:divide-pink-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--divide-opacity))}.lg\:divide-pink-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--divide-opacity))}.lg\:divide-pink-300>:not(template)~:not(template){--divide-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--divide-opacity))}.lg\:divide-pink-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--divide-opacity))}.lg\:divide-pink-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--divide-opacity))}.lg\:divide-pink-600>:not(template)~:not(template){--divide-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--divide-opacity))}.lg\:divide-pink-700>:not(template)~:not(template){--divide-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--divide-opacity))}.lg\:divide-pink-800>:not(template)~:not(template){--divide-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--divide-opacity))}.lg\:divide-pink-900>:not(template)~:not(template){--divide-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--divide-opacity))}.lg\:divide-solid>:not(template)~:not(template){border-style:solid}.lg\:divide-dashed>:not(template)~:not(template){border-style:dashed}.lg\:divide-dotted>:not(template)~:not(template){border-style:dotted}.lg\:divide-double>:not(template)~:not(template){border-style:double}.lg\:divide-none>:not(template)~:not(template){border-style:none}.lg\:divide-opacity-0>:not(template)~:not(template){--divide-opacity:0}.lg\:divide-opacity-25>:not(template)~:not(template){--divide-opacity:0.25}.lg\:divide-opacity-50>:not(template)~:not(template){--divide-opacity:0.5}.lg\:divide-opacity-75>:not(template)~:not(template){--divide-opacity:0.75}.lg\:divide-opacity-100>:not(template)~:not(template){--divide-opacity:1}.lg\:sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.lg\:not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.lg\:focus\:sr-only:focus{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.lg\:focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.lg\:appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.lg\:bg-fixed{background-attachment:fixed}.lg\:bg-local{background-attachment:local}.lg\:bg-scroll{background-attachment:scroll}.lg\:bg-clip-border{background-clip:border-box}.lg\:bg-clip-padding{background-clip:padding-box}.lg\:bg-clip-content{background-clip:content-box}.lg\:bg-clip-text{-webkit-background-clip:text;background-clip:text}.lg\:bg-transparent{background-color:transparent}.lg\:bg-current{background-color:currentColor}.lg\:bg-black{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.lg\:bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.lg\:bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.lg\:bg-gray-200{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.lg\:bg-gray-300{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.lg\:bg-gray-400{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.lg\:bg-gray-500{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.lg\:bg-gray-600{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.lg\:bg-gray-700{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.lg\:bg-gray-800{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.lg\:bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.lg\:bg-red-100{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.lg\:bg-red-200{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.lg\:bg-red-300{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.lg\:bg-red-400{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.lg\:bg-red-500{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.lg\:bg-red-600{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.lg\:bg-red-700{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.lg\:bg-red-800{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.lg\:bg-red-900{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.lg\:bg-orange-100{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.lg\:bg-orange-200{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.lg\:bg-orange-300{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.lg\:bg-orange-400{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.lg\:bg-orange-500{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.lg\:bg-orange-600{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.lg\:bg-orange-700{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.lg\:bg-orange-800{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.lg\:bg-orange-900{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.lg\:bg-yellow-100{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.lg\:bg-yellow-200{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.lg\:bg-yellow-300{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.lg\:bg-yellow-400{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.lg\:bg-yellow-500{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.lg\:bg-yellow-600{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.lg\:bg-yellow-700{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.lg\:bg-yellow-800{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.lg\:bg-yellow-900{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.lg\:bg-green-100{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.lg\:bg-green-200{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.lg\:bg-green-300{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.lg\:bg-green-400{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.lg\:bg-green-500{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.lg\:bg-green-600{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.lg\:bg-green-700{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.lg\:bg-green-800{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.lg\:bg-green-900{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.lg\:bg-teal-100{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.lg\:bg-teal-200{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.lg\:bg-teal-300{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.lg\:bg-teal-400{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.lg\:bg-teal-500{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.lg\:bg-teal-600{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.lg\:bg-teal-700{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.lg\:bg-teal-800{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.lg\:bg-teal-900{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.lg\:bg-blue-100{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.lg\:bg-blue-200{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.lg\:bg-blue-300{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.lg\:bg-blue-400{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.lg\:bg-blue-500{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.lg\:bg-blue-600{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.lg\:bg-blue-700{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.lg\:bg-blue-800{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.lg\:bg-blue-900{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.lg\:bg-indigo-100{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.lg\:bg-indigo-200{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.lg\:bg-indigo-300{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.lg\:bg-indigo-400{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.lg\:bg-indigo-500{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.lg\:bg-indigo-600{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.lg\:bg-indigo-700{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.lg\:bg-indigo-800{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.lg\:bg-indigo-900{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.lg\:bg-purple-100{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.lg\:bg-purple-200{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.lg\:bg-purple-300{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.lg\:bg-purple-400{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.lg\:bg-purple-500{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.lg\:bg-purple-600{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.lg\:bg-purple-700{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.lg\:bg-purple-800{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.lg\:bg-purple-900{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.lg\:bg-pink-100{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.lg\:bg-pink-200{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.lg\:bg-pink-300{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.lg\:bg-pink-400{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.lg\:bg-pink-500{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.lg\:bg-pink-600{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.lg\:bg-pink-700{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.lg\:bg-pink-800{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.lg\:bg-pink-900{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.lg\:hover\:bg-transparent:hover{background-color:transparent}.lg\:hover\:bg-current:hover{background-color:currentColor}.lg\:hover\:bg-black:hover{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.lg\:hover\:bg-white:hover{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.lg\:hover\:bg-gray-100:hover{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.lg\:hover\:bg-gray-200:hover{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.lg\:hover\:bg-gray-300:hover{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.lg\:hover\:bg-gray-400:hover{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.lg\:hover\:bg-gray-500:hover{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.lg\:hover\:bg-gray-600:hover{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.lg\:hover\:bg-gray-700:hover{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.lg\:hover\:bg-gray-800:hover{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.lg\:hover\:bg-gray-900:hover{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.lg\:hover\:bg-red-100:hover{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.lg\:hover\:bg-red-200:hover{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.lg\:hover\:bg-red-300:hover{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.lg\:hover\:bg-red-400:hover{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.lg\:hover\:bg-red-500:hover{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.lg\:hover\:bg-red-600:hover{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.lg\:hover\:bg-red-700:hover{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.lg\:hover\:bg-red-800:hover{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.lg\:hover\:bg-red-900:hover{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.lg\:hover\:bg-orange-100:hover{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.lg\:hover\:bg-orange-200:hover{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.lg\:hover\:bg-orange-300:hover{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.lg\:hover\:bg-orange-400:hover{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.lg\:hover\:bg-orange-500:hover{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.lg\:hover\:bg-orange-600:hover{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.lg\:hover\:bg-orange-700:hover{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.lg\:hover\:bg-orange-800:hover{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.lg\:hover\:bg-orange-900:hover{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.lg\:hover\:bg-yellow-100:hover{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.lg\:hover\:bg-yellow-200:hover{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.lg\:hover\:bg-yellow-300:hover{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.lg\:hover\:bg-yellow-400:hover{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.lg\:hover\:bg-yellow-500:hover{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.lg\:hover\:bg-yellow-600:hover{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.lg\:hover\:bg-yellow-700:hover{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.lg\:hover\:bg-yellow-800:hover{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.lg\:hover\:bg-yellow-900:hover{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.lg\:hover\:bg-green-100:hover{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.lg\:hover\:bg-green-200:hover{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.lg\:hover\:bg-green-300:hover{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.lg\:hover\:bg-green-400:hover{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.lg\:hover\:bg-green-500:hover{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.lg\:hover\:bg-green-600:hover{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.lg\:hover\:bg-green-700:hover{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.lg\:hover\:bg-green-800:hover{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.lg\:hover\:bg-green-900:hover{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.lg\:hover\:bg-teal-100:hover{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.lg\:hover\:bg-teal-200:hover{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.lg\:hover\:bg-teal-300:hover{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.lg\:hover\:bg-teal-400:hover{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.lg\:hover\:bg-teal-500:hover{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.lg\:hover\:bg-teal-600:hover{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.lg\:hover\:bg-teal-700:hover{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.lg\:hover\:bg-teal-800:hover{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.lg\:hover\:bg-teal-900:hover{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.lg\:hover\:bg-blue-100:hover{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.lg\:hover\:bg-blue-200:hover{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.lg\:hover\:bg-blue-300:hover{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.lg\:hover\:bg-blue-400:hover{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.lg\:hover\:bg-blue-500:hover{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.lg\:hover\:bg-blue-600:hover{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.lg\:hover\:bg-blue-700:hover{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.lg\:hover\:bg-blue-800:hover{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.lg\:hover\:bg-blue-900:hover{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.lg\:hover\:bg-indigo-100:hover{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.lg\:hover\:bg-indigo-200:hover{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.lg\:hover\:bg-indigo-300:hover{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.lg\:hover\:bg-indigo-400:hover{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.lg\:hover\:bg-indigo-500:hover{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.lg\:hover\:bg-indigo-600:hover{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.lg\:hover\:bg-indigo-700:hover{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.lg\:hover\:bg-indigo-800:hover{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.lg\:hover\:bg-indigo-900:hover{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.lg\:hover\:bg-purple-100:hover{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.lg\:hover\:bg-purple-200:hover{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.lg\:hover\:bg-purple-300:hover{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.lg\:hover\:bg-purple-400:hover{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.lg\:hover\:bg-purple-500:hover{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.lg\:hover\:bg-purple-600:hover{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.lg\:hover\:bg-purple-700:hover{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.lg\:hover\:bg-purple-800:hover{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.lg\:hover\:bg-purple-900:hover{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.lg\:hover\:bg-pink-100:hover{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.lg\:hover\:bg-pink-200:hover{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.lg\:hover\:bg-pink-300:hover{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.lg\:hover\:bg-pink-400:hover{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.lg\:hover\:bg-pink-500:hover{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.lg\:hover\:bg-pink-600:hover{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.lg\:hover\:bg-pink-700:hover{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.lg\:hover\:bg-pink-800:hover{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.lg\:hover\:bg-pink-900:hover{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.lg\:focus\:bg-transparent:focus{background-color:transparent}.lg\:focus\:bg-current:focus{background-color:currentColor}.lg\:focus\:bg-black:focus{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.lg\:focus\:bg-white:focus{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.lg\:focus\:bg-gray-100:focus{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.lg\:focus\:bg-gray-200:focus{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.lg\:focus\:bg-gray-300:focus{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.lg\:focus\:bg-gray-400:focus{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.lg\:focus\:bg-gray-500:focus{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.lg\:focus\:bg-gray-600:focus{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.lg\:focus\:bg-gray-700:focus{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.lg\:focus\:bg-gray-800:focus{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.lg\:focus\:bg-gray-900:focus{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.lg\:focus\:bg-red-100:focus{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.lg\:focus\:bg-red-200:focus{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.lg\:focus\:bg-red-300:focus{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.lg\:focus\:bg-red-400:focus{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.lg\:focus\:bg-red-500:focus{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.lg\:focus\:bg-red-600:focus{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.lg\:focus\:bg-red-700:focus{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.lg\:focus\:bg-red-800:focus{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.lg\:focus\:bg-red-900:focus{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.lg\:focus\:bg-orange-100:focus{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.lg\:focus\:bg-orange-200:focus{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.lg\:focus\:bg-orange-300:focus{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.lg\:focus\:bg-orange-400:focus{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.lg\:focus\:bg-orange-500:focus{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.lg\:focus\:bg-orange-600:focus{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.lg\:focus\:bg-orange-700:focus{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.lg\:focus\:bg-orange-800:focus{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.lg\:focus\:bg-orange-900:focus{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.lg\:focus\:bg-yellow-100:focus{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.lg\:focus\:bg-yellow-200:focus{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.lg\:focus\:bg-yellow-300:focus{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.lg\:focus\:bg-yellow-400:focus{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.lg\:focus\:bg-yellow-500:focus{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.lg\:focus\:bg-yellow-600:focus{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.lg\:focus\:bg-yellow-700:focus{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.lg\:focus\:bg-yellow-800:focus{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.lg\:focus\:bg-yellow-900:focus{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.lg\:focus\:bg-green-100:focus{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.lg\:focus\:bg-green-200:focus{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.lg\:focus\:bg-green-300:focus{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.lg\:focus\:bg-green-400:focus{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.lg\:focus\:bg-green-500:focus{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.lg\:focus\:bg-green-600:focus{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.lg\:focus\:bg-green-700:focus{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.lg\:focus\:bg-green-800:focus{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.lg\:focus\:bg-green-900:focus{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.lg\:focus\:bg-teal-100:focus{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.lg\:focus\:bg-teal-200:focus{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.lg\:focus\:bg-teal-300:focus{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.lg\:focus\:bg-teal-400:focus{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.lg\:focus\:bg-teal-500:focus{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.lg\:focus\:bg-teal-600:focus{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.lg\:focus\:bg-teal-700:focus{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.lg\:focus\:bg-teal-800:focus{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.lg\:focus\:bg-teal-900:focus{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.lg\:focus\:bg-blue-100:focus{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.lg\:focus\:bg-blue-200:focus{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.lg\:focus\:bg-blue-300:focus{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.lg\:focus\:bg-blue-400:focus{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.lg\:focus\:bg-blue-500:focus{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.lg\:focus\:bg-blue-600:focus{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.lg\:focus\:bg-blue-700:focus{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.lg\:focus\:bg-blue-800:focus{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.lg\:focus\:bg-blue-900:focus{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.lg\:focus\:bg-indigo-100:focus{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.lg\:focus\:bg-indigo-200:focus{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.lg\:focus\:bg-indigo-300:focus{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.lg\:focus\:bg-indigo-400:focus{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.lg\:focus\:bg-indigo-500:focus{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.lg\:focus\:bg-indigo-600:focus{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.lg\:focus\:bg-indigo-700:focus{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.lg\:focus\:bg-indigo-800:focus{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.lg\:focus\:bg-indigo-900:focus{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.lg\:focus\:bg-purple-100:focus{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.lg\:focus\:bg-purple-200:focus{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.lg\:focus\:bg-purple-300:focus{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.lg\:focus\:bg-purple-400:focus{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.lg\:focus\:bg-purple-500:focus{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.lg\:focus\:bg-purple-600:focus{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.lg\:focus\:bg-purple-700:focus{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.lg\:focus\:bg-purple-800:focus{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.lg\:focus\:bg-purple-900:focus{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.lg\:focus\:bg-pink-100:focus{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.lg\:focus\:bg-pink-200:focus{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.lg\:focus\:bg-pink-300:focus{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.lg\:focus\:bg-pink-400:focus{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.lg\:focus\:bg-pink-500:focus{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.lg\:focus\:bg-pink-600:focus{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.lg\:focus\:bg-pink-700:focus{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.lg\:focus\:bg-pink-800:focus{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.lg\:focus\:bg-pink-900:focus{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.lg\:bg-none{background-image:none}.lg\:bg-gradient-to-t{background-image:linear-gradient(to top,var(--gradient-color-stops))}.lg\:bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--gradient-color-stops))}.lg\:bg-gradient-to-r{background-image:linear-gradient(to right,var(--gradient-color-stops))}.lg\:bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--gradient-color-stops))}.lg\:bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--gradient-color-stops))}.lg\:bg-gradient-to-bl{background-image:linear-gradient(to bottom left,var(--gradient-color-stops))}.lg\:bg-gradient-to-l{background-image:linear-gradient(to left,var(--gradient-color-stops))}.lg\:bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--gradient-color-stops))}.lg\:from-transparent{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:from-current{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:from-black{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:from-white{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:from-gray-100{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.lg\:from-gray-200{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.lg\:from-gray-300{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.lg\:from-gray-400{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.lg\:from-gray-500{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.lg\:from-gray-600{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.lg\:from-gray-700{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.lg\:from-gray-800{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.lg\:from-gray-900{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.lg\:from-red-100{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.lg\:from-red-200{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.lg\:from-red-300{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.lg\:from-red-400{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.lg\:from-red-500{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.lg\:from-red-600{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.lg\:from-red-700{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.lg\:from-red-800{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.lg\:from-red-900{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.lg\:from-orange-100{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.lg\:from-orange-200{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.lg\:from-orange-300{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.lg\:from-orange-400{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.lg\:from-orange-500{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.lg\:from-orange-600{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.lg\:from-orange-700{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.lg\:from-orange-800{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.lg\:from-orange-900{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.lg\:from-yellow-100{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.lg\:from-yellow-200{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.lg\:from-yellow-300{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.lg\:from-yellow-400{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.lg\:from-yellow-500{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.lg\:from-yellow-600{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.lg\:from-yellow-700{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.lg\:from-yellow-800{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.lg\:from-yellow-900{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.lg\:from-green-100{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.lg\:from-green-200{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.lg\:from-green-300{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.lg\:from-green-400{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.lg\:from-green-500{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.lg\:from-green-600{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.lg\:from-green-700{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.lg\:from-green-800{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.lg\:from-green-900{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.lg\:from-teal-100{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.lg\:from-teal-200{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.lg\:from-teal-300{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.lg\:from-teal-400{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.lg\:from-teal-500{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.lg\:from-teal-600{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.lg\:from-teal-700{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.lg\:from-teal-800{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.lg\:from-teal-900{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.lg\:from-blue-100{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.lg\:from-blue-200{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.lg\:from-blue-300{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.lg\:from-blue-400{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.lg\:from-blue-500{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.lg\:from-blue-600{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.lg\:from-blue-700{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.lg\:from-blue-800{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.lg\:from-blue-900{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.lg\:from-indigo-100{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.lg\:from-indigo-200{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.lg\:from-indigo-300{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.lg\:from-indigo-400{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.lg\:from-indigo-500{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.lg\:from-indigo-600{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.lg\:from-indigo-700{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.lg\:from-indigo-800{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.lg\:from-indigo-900{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.lg\:from-purple-100{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.lg\:from-purple-200{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.lg\:from-purple-300{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.lg\:from-purple-400{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.lg\:from-purple-500{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.lg\:from-purple-600{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.lg\:from-purple-700{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.lg\:from-purple-800{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.lg\:from-purple-900{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.lg\:from-pink-100{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.lg\:from-pink-200{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.lg\:from-pink-300{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.lg\:from-pink-400{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.lg\:from-pink-500{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.lg\:from-pink-600{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.lg\:from-pink-700{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.lg\:from-pink-800{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.lg\:from-pink-900{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.lg\:via-transparent{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:via-current{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:via-black{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:via-white{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:via-gray-100{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.lg\:via-gray-200{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.lg\:via-gray-300{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.lg\:via-gray-400{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.lg\:via-gray-500{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.lg\:via-gray-600{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.lg\:via-gray-700{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.lg\:via-gray-800{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.lg\:via-gray-900{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.lg\:via-red-100{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.lg\:via-red-200{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.lg\:via-red-300{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.lg\:via-red-400{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.lg\:via-red-500{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.lg\:via-red-600{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.lg\:via-red-700{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.lg\:via-red-800{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.lg\:via-red-900{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.lg\:via-orange-100{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.lg\:via-orange-200{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.lg\:via-orange-300{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.lg\:via-orange-400{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.lg\:via-orange-500{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.lg\:via-orange-600{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.lg\:via-orange-700{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.lg\:via-orange-800{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.lg\:via-orange-900{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.lg\:via-yellow-100{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.lg\:via-yellow-200{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.lg\:via-yellow-300{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.lg\:via-yellow-400{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.lg\:via-yellow-500{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.lg\:via-yellow-600{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.lg\:via-yellow-700{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.lg\:via-yellow-800{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.lg\:via-yellow-900{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.lg\:via-green-100{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.lg\:via-green-200{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.lg\:via-green-300{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.lg\:via-green-400{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.lg\:via-green-500{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.lg\:via-green-600{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.lg\:via-green-700{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.lg\:via-green-800{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.lg\:via-green-900{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.lg\:via-teal-100{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.lg\:via-teal-200{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.lg\:via-teal-300{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.lg\:via-teal-400{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.lg\:via-teal-500{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.lg\:via-teal-600{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.lg\:via-teal-700{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.lg\:via-teal-800{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.lg\:via-teal-900{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.lg\:via-blue-100{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.lg\:via-blue-200{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.lg\:via-blue-300{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.lg\:via-blue-400{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.lg\:via-blue-500{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.lg\:via-blue-600{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.lg\:via-blue-700{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.lg\:via-blue-800{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.lg\:via-blue-900{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.lg\:via-indigo-100{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.lg\:via-indigo-200{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.lg\:via-indigo-300{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.lg\:via-indigo-400{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.lg\:via-indigo-500{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.lg\:via-indigo-600{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.lg\:via-indigo-700{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.lg\:via-indigo-800{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.lg\:via-indigo-900{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.lg\:via-purple-100{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.lg\:via-purple-200{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.lg\:via-purple-300{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.lg\:via-purple-400{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.lg\:via-purple-500{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.lg\:via-purple-600{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.lg\:via-purple-700{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.lg\:via-purple-800{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.lg\:via-purple-900{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.lg\:via-pink-100{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.lg\:via-pink-200{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.lg\:via-pink-300{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.lg\:via-pink-400{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.lg\:via-pink-500{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.lg\:via-pink-600{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.lg\:via-pink-700{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.lg\:via-pink-800{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.lg\:via-pink-900{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.lg\:to-transparent{--gradient-to-color:transparent}.lg\:to-current{--gradient-to-color:currentColor}.lg\:to-black{--gradient-to-color:#000}.lg\:to-white{--gradient-to-color:#fff}.lg\:to-gray-100{--gradient-to-color:#f7fafc}.lg\:to-gray-200{--gradient-to-color:#edf2f7}.lg\:to-gray-300{--gradient-to-color:#e2e8f0}.lg\:to-gray-400{--gradient-to-color:#cbd5e0}.lg\:to-gray-500{--gradient-to-color:#a0aec0}.lg\:to-gray-600{--gradient-to-color:#718096}.lg\:to-gray-700{--gradient-to-color:#4a5568}.lg\:to-gray-800{--gradient-to-color:#2d3748}.lg\:to-gray-900{--gradient-to-color:#1a202c}.lg\:to-red-100{--gradient-to-color:#fff5f5}.lg\:to-red-200{--gradient-to-color:#fed7d7}.lg\:to-red-300{--gradient-to-color:#feb2b2}.lg\:to-red-400{--gradient-to-color:#fc8181}.lg\:to-red-500{--gradient-to-color:#f56565}.lg\:to-red-600{--gradient-to-color:#e53e3e}.lg\:to-red-700{--gradient-to-color:#c53030}.lg\:to-red-800{--gradient-to-color:#9b2c2c}.lg\:to-red-900{--gradient-to-color:#742a2a}.lg\:to-orange-100{--gradient-to-color:#fffaf0}.lg\:to-orange-200{--gradient-to-color:#feebc8}.lg\:to-orange-300{--gradient-to-color:#fbd38d}.lg\:to-orange-400{--gradient-to-color:#f6ad55}.lg\:to-orange-500{--gradient-to-color:#ed8936}.lg\:to-orange-600{--gradient-to-color:#dd6b20}.lg\:to-orange-700{--gradient-to-color:#c05621}.lg\:to-orange-800{--gradient-to-color:#9c4221}.lg\:to-orange-900{--gradient-to-color:#7b341e}.lg\:to-yellow-100{--gradient-to-color:#fffff0}.lg\:to-yellow-200{--gradient-to-color:#fefcbf}.lg\:to-yellow-300{--gradient-to-color:#faf089}.lg\:to-yellow-400{--gradient-to-color:#f6e05e}.lg\:to-yellow-500{--gradient-to-color:#ecc94b}.lg\:to-yellow-600{--gradient-to-color:#d69e2e}.lg\:to-yellow-700{--gradient-to-color:#b7791f}.lg\:to-yellow-800{--gradient-to-color:#975a16}.lg\:to-yellow-900{--gradient-to-color:#744210}.lg\:to-green-100{--gradient-to-color:#f0fff4}.lg\:to-green-200{--gradient-to-color:#c6f6d5}.lg\:to-green-300{--gradient-to-color:#9ae6b4}.lg\:to-green-400{--gradient-to-color:#68d391}.lg\:to-green-500{--gradient-to-color:#48bb78}.lg\:to-green-600{--gradient-to-color:#38a169}.lg\:to-green-700{--gradient-to-color:#2f855a}.lg\:to-green-800{--gradient-to-color:#276749}.lg\:to-green-900{--gradient-to-color:#22543d}.lg\:to-teal-100{--gradient-to-color:#e6fffa}.lg\:to-teal-200{--gradient-to-color:#b2f5ea}.lg\:to-teal-300{--gradient-to-color:#81e6d9}.lg\:to-teal-400{--gradient-to-color:#4fd1c5}.lg\:to-teal-500{--gradient-to-color:#38b2ac}.lg\:to-teal-600{--gradient-to-color:#319795}.lg\:to-teal-700{--gradient-to-color:#2c7a7b}.lg\:to-teal-800{--gradient-to-color:#285e61}.lg\:to-teal-900{--gradient-to-color:#234e52}.lg\:to-blue-100{--gradient-to-color:#ebf8ff}.lg\:to-blue-200{--gradient-to-color:#bee3f8}.lg\:to-blue-300{--gradient-to-color:#90cdf4}.lg\:to-blue-400{--gradient-to-color:#63b3ed}.lg\:to-blue-500{--gradient-to-color:#4299e1}.lg\:to-blue-600{--gradient-to-color:#3182ce}.lg\:to-blue-700{--gradient-to-color:#2b6cb0}.lg\:to-blue-800{--gradient-to-color:#2c5282}.lg\:to-blue-900{--gradient-to-color:#2a4365}.lg\:to-indigo-100{--gradient-to-color:#ebf4ff}.lg\:to-indigo-200{--gradient-to-color:#c3dafe}.lg\:to-indigo-300{--gradient-to-color:#a3bffa}.lg\:to-indigo-400{--gradient-to-color:#7f9cf5}.lg\:to-indigo-500{--gradient-to-color:#667eea}.lg\:to-indigo-600{--gradient-to-color:#5a67d8}.lg\:to-indigo-700{--gradient-to-color:#4c51bf}.lg\:to-indigo-800{--gradient-to-color:#434190}.lg\:to-indigo-900{--gradient-to-color:#3c366b}.lg\:to-purple-100{--gradient-to-color:#faf5ff}.lg\:to-purple-200{--gradient-to-color:#e9d8fd}.lg\:to-purple-300{--gradient-to-color:#d6bcfa}.lg\:to-purple-400{--gradient-to-color:#b794f4}.lg\:to-purple-500{--gradient-to-color:#9f7aea}.lg\:to-purple-600{--gradient-to-color:#805ad5}.lg\:to-purple-700{--gradient-to-color:#6b46c1}.lg\:to-purple-800{--gradient-to-color:#553c9a}.lg\:to-purple-900{--gradient-to-color:#44337a}.lg\:to-pink-100{--gradient-to-color:#fff5f7}.lg\:to-pink-200{--gradient-to-color:#fed7e2}.lg\:to-pink-300{--gradient-to-color:#fbb6ce}.lg\:to-pink-400{--gradient-to-color:#f687b3}.lg\:to-pink-500{--gradient-to-color:#ed64a6}.lg\:to-pink-600{--gradient-to-color:#d53f8c}.lg\:to-pink-700{--gradient-to-color:#b83280}.lg\:to-pink-800{--gradient-to-color:#97266d}.lg\:to-pink-900{--gradient-to-color:#702459}.lg\:hover\:from-transparent:hover{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:hover\:from-current:hover{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:hover\:from-black:hover{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:hover\:from-white:hover{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:hover\:from-gray-100:hover{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.lg\:hover\:from-gray-200:hover{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.lg\:hover\:from-gray-300:hover{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.lg\:hover\:from-gray-400:hover{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.lg\:hover\:from-gray-500:hover{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.lg\:hover\:from-gray-600:hover{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.lg\:hover\:from-gray-700:hover{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.lg\:hover\:from-gray-800:hover{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.lg\:hover\:from-gray-900:hover{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.lg\:hover\:from-red-100:hover{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.lg\:hover\:from-red-200:hover{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.lg\:hover\:from-red-300:hover{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.lg\:hover\:from-red-400:hover{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.lg\:hover\:from-red-500:hover{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.lg\:hover\:from-red-600:hover{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.lg\:hover\:from-red-700:hover{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.lg\:hover\:from-red-800:hover{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.lg\:hover\:from-red-900:hover{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.lg\:hover\:from-orange-100:hover{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.lg\:hover\:from-orange-200:hover{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.lg\:hover\:from-orange-300:hover{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.lg\:hover\:from-orange-400:hover{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.lg\:hover\:from-orange-500:hover{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.lg\:hover\:from-orange-600:hover{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.lg\:hover\:from-orange-700:hover{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.lg\:hover\:from-orange-800:hover{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.lg\:hover\:from-orange-900:hover{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.lg\:hover\:from-yellow-100:hover{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.lg\:hover\:from-yellow-200:hover{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.lg\:hover\:from-yellow-300:hover{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.lg\:hover\:from-yellow-400:hover{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.lg\:hover\:from-yellow-500:hover{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.lg\:hover\:from-yellow-600:hover{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.lg\:hover\:from-yellow-700:hover{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.lg\:hover\:from-yellow-800:hover{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.lg\:hover\:from-yellow-900:hover{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.lg\:hover\:from-green-100:hover{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.lg\:hover\:from-green-200:hover{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.lg\:hover\:from-green-300:hover{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.lg\:hover\:from-green-400:hover{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.lg\:hover\:from-green-500:hover{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.lg\:hover\:from-green-600:hover{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.lg\:hover\:from-green-700:hover{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.lg\:hover\:from-green-800:hover{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.lg\:hover\:from-green-900:hover{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.lg\:hover\:from-teal-100:hover{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.lg\:hover\:from-teal-200:hover{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.lg\:hover\:from-teal-300:hover{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.lg\:hover\:from-teal-400:hover{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.lg\:hover\:from-teal-500:hover{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.lg\:hover\:from-teal-600:hover{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.lg\:hover\:from-teal-700:hover{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.lg\:hover\:from-teal-800:hover{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.lg\:hover\:from-teal-900:hover{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.lg\:hover\:from-blue-100:hover{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.lg\:hover\:from-blue-200:hover{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.lg\:hover\:from-blue-300:hover{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.lg\:hover\:from-blue-400:hover{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.lg\:hover\:from-blue-500:hover{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.lg\:hover\:from-blue-600:hover{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.lg\:hover\:from-blue-700:hover{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.lg\:hover\:from-blue-800:hover{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.lg\:hover\:from-blue-900:hover{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.lg\:hover\:from-indigo-100:hover{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.lg\:hover\:from-indigo-200:hover{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.lg\:hover\:from-indigo-300:hover{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.lg\:hover\:from-indigo-400:hover{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.lg\:hover\:from-indigo-500:hover{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.lg\:hover\:from-indigo-600:hover{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.lg\:hover\:from-indigo-700:hover{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.lg\:hover\:from-indigo-800:hover{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.lg\:hover\:from-indigo-900:hover{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.lg\:hover\:from-purple-100:hover{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.lg\:hover\:from-purple-200:hover{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.lg\:hover\:from-purple-300:hover{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.lg\:hover\:from-purple-400:hover{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.lg\:hover\:from-purple-500:hover{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.lg\:hover\:from-purple-600:hover{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.lg\:hover\:from-purple-700:hover{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.lg\:hover\:from-purple-800:hover{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.lg\:hover\:from-purple-900:hover{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.lg\:hover\:from-pink-100:hover{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.lg\:hover\:from-pink-200:hover{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.lg\:hover\:from-pink-300:hover{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.lg\:hover\:from-pink-400:hover{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.lg\:hover\:from-pink-500:hover{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.lg\:hover\:from-pink-600:hover{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.lg\:hover\:from-pink-700:hover{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.lg\:hover\:from-pink-800:hover{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.lg\:hover\:from-pink-900:hover{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.lg\:hover\:via-transparent:hover{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:hover\:via-current:hover{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:hover\:via-black:hover{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:hover\:via-white:hover{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:hover\:via-gray-100:hover{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.lg\:hover\:via-gray-200:hover{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.lg\:hover\:via-gray-300:hover{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.lg\:hover\:via-gray-400:hover{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.lg\:hover\:via-gray-500:hover{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.lg\:hover\:via-gray-600:hover{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.lg\:hover\:via-gray-700:hover{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.lg\:hover\:via-gray-800:hover{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.lg\:hover\:via-gray-900:hover{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.lg\:hover\:via-red-100:hover{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.lg\:hover\:via-red-200:hover{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.lg\:hover\:via-red-300:hover{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.lg\:hover\:via-red-400:hover{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.lg\:hover\:via-red-500:hover{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.lg\:hover\:via-red-600:hover{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.lg\:hover\:via-red-700:hover{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.lg\:hover\:via-red-800:hover{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.lg\:hover\:via-red-900:hover{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.lg\:hover\:via-orange-100:hover{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.lg\:hover\:via-orange-200:hover{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.lg\:hover\:via-orange-300:hover{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.lg\:hover\:via-orange-400:hover{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.lg\:hover\:via-orange-500:hover{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.lg\:hover\:via-orange-600:hover{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.lg\:hover\:via-orange-700:hover{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.lg\:hover\:via-orange-800:hover{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.lg\:hover\:via-orange-900:hover{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.lg\:hover\:via-yellow-100:hover{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.lg\:hover\:via-yellow-200:hover{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.lg\:hover\:via-yellow-300:hover{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.lg\:hover\:via-yellow-400:hover{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.lg\:hover\:via-yellow-500:hover{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.lg\:hover\:via-yellow-600:hover{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.lg\:hover\:via-yellow-700:hover{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.lg\:hover\:via-yellow-800:hover{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.lg\:hover\:via-yellow-900:hover{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.lg\:hover\:via-green-100:hover{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.lg\:hover\:via-green-200:hover{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.lg\:hover\:via-green-300:hover{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.lg\:hover\:via-green-400:hover{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.lg\:hover\:via-green-500:hover{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.lg\:hover\:via-green-600:hover{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.lg\:hover\:via-green-700:hover{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.lg\:hover\:via-green-800:hover{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.lg\:hover\:via-green-900:hover{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.lg\:hover\:via-teal-100:hover{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.lg\:hover\:via-teal-200:hover{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.lg\:hover\:via-teal-300:hover{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.lg\:hover\:via-teal-400:hover{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.lg\:hover\:via-teal-500:hover{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.lg\:hover\:via-teal-600:hover{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.lg\:hover\:via-teal-700:hover{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.lg\:hover\:via-teal-800:hover{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.lg\:hover\:via-teal-900:hover{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.lg\:hover\:via-blue-100:hover{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.lg\:hover\:via-blue-200:hover{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.lg\:hover\:via-blue-300:hover{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.lg\:hover\:via-blue-400:hover{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.lg\:hover\:via-blue-500:hover{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.lg\:hover\:via-blue-600:hover{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.lg\:hover\:via-blue-700:hover{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.lg\:hover\:via-blue-800:hover{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.lg\:hover\:via-blue-900:hover{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.lg\:hover\:via-indigo-100:hover{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.lg\:hover\:via-indigo-200:hover{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.lg\:hover\:via-indigo-300:hover{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.lg\:hover\:via-indigo-400:hover{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.lg\:hover\:via-indigo-500:hover{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.lg\:hover\:via-indigo-600:hover{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.lg\:hover\:via-indigo-700:hover{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.lg\:hover\:via-indigo-800:hover{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.lg\:hover\:via-indigo-900:hover{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.lg\:hover\:via-purple-100:hover{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.lg\:hover\:via-purple-200:hover{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.lg\:hover\:via-purple-300:hover{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.lg\:hover\:via-purple-400:hover{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.lg\:hover\:via-purple-500:hover{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.lg\:hover\:via-purple-600:hover{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.lg\:hover\:via-purple-700:hover{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.lg\:hover\:via-purple-800:hover{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.lg\:hover\:via-purple-900:hover{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.lg\:hover\:via-pink-100:hover{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.lg\:hover\:via-pink-200:hover{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.lg\:hover\:via-pink-300:hover{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.lg\:hover\:via-pink-400:hover{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.lg\:hover\:via-pink-500:hover{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.lg\:hover\:via-pink-600:hover{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.lg\:hover\:via-pink-700:hover{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.lg\:hover\:via-pink-800:hover{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.lg\:hover\:via-pink-900:hover{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.lg\:hover\:to-transparent:hover{--gradient-to-color:transparent}.lg\:hover\:to-current:hover{--gradient-to-color:currentColor}.lg\:hover\:to-black:hover{--gradient-to-color:#000}.lg\:hover\:to-white:hover{--gradient-to-color:#fff}.lg\:hover\:to-gray-100:hover{--gradient-to-color:#f7fafc}.lg\:hover\:to-gray-200:hover{--gradient-to-color:#edf2f7}.lg\:hover\:to-gray-300:hover{--gradient-to-color:#e2e8f0}.lg\:hover\:to-gray-400:hover{--gradient-to-color:#cbd5e0}.lg\:hover\:to-gray-500:hover{--gradient-to-color:#a0aec0}.lg\:hover\:to-gray-600:hover{--gradient-to-color:#718096}.lg\:hover\:to-gray-700:hover{--gradient-to-color:#4a5568}.lg\:hover\:to-gray-800:hover{--gradient-to-color:#2d3748}.lg\:hover\:to-gray-900:hover{--gradient-to-color:#1a202c}.lg\:hover\:to-red-100:hover{--gradient-to-color:#fff5f5}.lg\:hover\:to-red-200:hover{--gradient-to-color:#fed7d7}.lg\:hover\:to-red-300:hover{--gradient-to-color:#feb2b2}.lg\:hover\:to-red-400:hover{--gradient-to-color:#fc8181}.lg\:hover\:to-red-500:hover{--gradient-to-color:#f56565}.lg\:hover\:to-red-600:hover{--gradient-to-color:#e53e3e}.lg\:hover\:to-red-700:hover{--gradient-to-color:#c53030}.lg\:hover\:to-red-800:hover{--gradient-to-color:#9b2c2c}.lg\:hover\:to-red-900:hover{--gradient-to-color:#742a2a}.lg\:hover\:to-orange-100:hover{--gradient-to-color:#fffaf0}.lg\:hover\:to-orange-200:hover{--gradient-to-color:#feebc8}.lg\:hover\:to-orange-300:hover{--gradient-to-color:#fbd38d}.lg\:hover\:to-orange-400:hover{--gradient-to-color:#f6ad55}.lg\:hover\:to-orange-500:hover{--gradient-to-color:#ed8936}.lg\:hover\:to-orange-600:hover{--gradient-to-color:#dd6b20}.lg\:hover\:to-orange-700:hover{--gradient-to-color:#c05621}.lg\:hover\:to-orange-800:hover{--gradient-to-color:#9c4221}.lg\:hover\:to-orange-900:hover{--gradient-to-color:#7b341e}.lg\:hover\:to-yellow-100:hover{--gradient-to-color:#fffff0}.lg\:hover\:to-yellow-200:hover{--gradient-to-color:#fefcbf}.lg\:hover\:to-yellow-300:hover{--gradient-to-color:#faf089}.lg\:hover\:to-yellow-400:hover{--gradient-to-color:#f6e05e}.lg\:hover\:to-yellow-500:hover{--gradient-to-color:#ecc94b}.lg\:hover\:to-yellow-600:hover{--gradient-to-color:#d69e2e}.lg\:hover\:to-yellow-700:hover{--gradient-to-color:#b7791f}.lg\:hover\:to-yellow-800:hover{--gradient-to-color:#975a16}.lg\:hover\:to-yellow-900:hover{--gradient-to-color:#744210}.lg\:hover\:to-green-100:hover{--gradient-to-color:#f0fff4}.lg\:hover\:to-green-200:hover{--gradient-to-color:#c6f6d5}.lg\:hover\:to-green-300:hover{--gradient-to-color:#9ae6b4}.lg\:hover\:to-green-400:hover{--gradient-to-color:#68d391}.lg\:hover\:to-green-500:hover{--gradient-to-color:#48bb78}.lg\:hover\:to-green-600:hover{--gradient-to-color:#38a169}.lg\:hover\:to-green-700:hover{--gradient-to-color:#2f855a}.lg\:hover\:to-green-800:hover{--gradient-to-color:#276749}.lg\:hover\:to-green-900:hover{--gradient-to-color:#22543d}.lg\:hover\:to-teal-100:hover{--gradient-to-color:#e6fffa}.lg\:hover\:to-teal-200:hover{--gradient-to-color:#b2f5ea}.lg\:hover\:to-teal-300:hover{--gradient-to-color:#81e6d9}.lg\:hover\:to-teal-400:hover{--gradient-to-color:#4fd1c5}.lg\:hover\:to-teal-500:hover{--gradient-to-color:#38b2ac}.lg\:hover\:to-teal-600:hover{--gradient-to-color:#319795}.lg\:hover\:to-teal-700:hover{--gradient-to-color:#2c7a7b}.lg\:hover\:to-teal-800:hover{--gradient-to-color:#285e61}.lg\:hover\:to-teal-900:hover{--gradient-to-color:#234e52}.lg\:hover\:to-blue-100:hover{--gradient-to-color:#ebf8ff}.lg\:hover\:to-blue-200:hover{--gradient-to-color:#bee3f8}.lg\:hover\:to-blue-300:hover{--gradient-to-color:#90cdf4}.lg\:hover\:to-blue-400:hover{--gradient-to-color:#63b3ed}.lg\:hover\:to-blue-500:hover{--gradient-to-color:#4299e1}.lg\:hover\:to-blue-600:hover{--gradient-to-color:#3182ce}.lg\:hover\:to-blue-700:hover{--gradient-to-color:#2b6cb0}.lg\:hover\:to-blue-800:hover{--gradient-to-color:#2c5282}.lg\:hover\:to-blue-900:hover{--gradient-to-color:#2a4365}.lg\:hover\:to-indigo-100:hover{--gradient-to-color:#ebf4ff}.lg\:hover\:to-indigo-200:hover{--gradient-to-color:#c3dafe}.lg\:hover\:to-indigo-300:hover{--gradient-to-color:#a3bffa}.lg\:hover\:to-indigo-400:hover{--gradient-to-color:#7f9cf5}.lg\:hover\:to-indigo-500:hover{--gradient-to-color:#667eea}.lg\:hover\:to-indigo-600:hover{--gradient-to-color:#5a67d8}.lg\:hover\:to-indigo-700:hover{--gradient-to-color:#4c51bf}.lg\:hover\:to-indigo-800:hover{--gradient-to-color:#434190}.lg\:hover\:to-indigo-900:hover{--gradient-to-color:#3c366b}.lg\:hover\:to-purple-100:hover{--gradient-to-color:#faf5ff}.lg\:hover\:to-purple-200:hover{--gradient-to-color:#e9d8fd}.lg\:hover\:to-purple-300:hover{--gradient-to-color:#d6bcfa}.lg\:hover\:to-purple-400:hover{--gradient-to-color:#b794f4}.lg\:hover\:to-purple-500:hover{--gradient-to-color:#9f7aea}.lg\:hover\:to-purple-600:hover{--gradient-to-color:#805ad5}.lg\:hover\:to-purple-700:hover{--gradient-to-color:#6b46c1}.lg\:hover\:to-purple-800:hover{--gradient-to-color:#553c9a}.lg\:hover\:to-purple-900:hover{--gradient-to-color:#44337a}.lg\:hover\:to-pink-100:hover{--gradient-to-color:#fff5f7}.lg\:hover\:to-pink-200:hover{--gradient-to-color:#fed7e2}.lg\:hover\:to-pink-300:hover{--gradient-to-color:#fbb6ce}.lg\:hover\:to-pink-400:hover{--gradient-to-color:#f687b3}.lg\:hover\:to-pink-500:hover{--gradient-to-color:#ed64a6}.lg\:hover\:to-pink-600:hover{--gradient-to-color:#d53f8c}.lg\:hover\:to-pink-700:hover{--gradient-to-color:#b83280}.lg\:hover\:to-pink-800:hover{--gradient-to-color:#97266d}.lg\:hover\:to-pink-900:hover{--gradient-to-color:#702459}.lg\:focus\:from-transparent:focus{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:focus\:from-current:focus{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:focus\:from-black:focus{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:focus\:from-white:focus{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:focus\:from-gray-100:focus{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.lg\:focus\:from-gray-200:focus{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.lg\:focus\:from-gray-300:focus{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.lg\:focus\:from-gray-400:focus{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.lg\:focus\:from-gray-500:focus{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.lg\:focus\:from-gray-600:focus{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.lg\:focus\:from-gray-700:focus{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.lg\:focus\:from-gray-800:focus{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.lg\:focus\:from-gray-900:focus{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.lg\:focus\:from-red-100:focus{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.lg\:focus\:from-red-200:focus{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.lg\:focus\:from-red-300:focus{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.lg\:focus\:from-red-400:focus{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.lg\:focus\:from-red-500:focus{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.lg\:focus\:from-red-600:focus{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.lg\:focus\:from-red-700:focus{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.lg\:focus\:from-red-800:focus{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.lg\:focus\:from-red-900:focus{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.lg\:focus\:from-orange-100:focus{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.lg\:focus\:from-orange-200:focus{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.lg\:focus\:from-orange-300:focus{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.lg\:focus\:from-orange-400:focus{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.lg\:focus\:from-orange-500:focus{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.lg\:focus\:from-orange-600:focus{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.lg\:focus\:from-orange-700:focus{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.lg\:focus\:from-orange-800:focus{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.lg\:focus\:from-orange-900:focus{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.lg\:focus\:from-yellow-100:focus{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.lg\:focus\:from-yellow-200:focus{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.lg\:focus\:from-yellow-300:focus{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.lg\:focus\:from-yellow-400:focus{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.lg\:focus\:from-yellow-500:focus{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.lg\:focus\:from-yellow-600:focus{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.lg\:focus\:from-yellow-700:focus{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.lg\:focus\:from-yellow-800:focus{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.lg\:focus\:from-yellow-900:focus{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.lg\:focus\:from-green-100:focus{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.lg\:focus\:from-green-200:focus{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.lg\:focus\:from-green-300:focus{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.lg\:focus\:from-green-400:focus{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.lg\:focus\:from-green-500:focus{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.lg\:focus\:from-green-600:focus{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.lg\:focus\:from-green-700:focus{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.lg\:focus\:from-green-800:focus{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.lg\:focus\:from-green-900:focus{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.lg\:focus\:from-teal-100:focus{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.lg\:focus\:from-teal-200:focus{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.lg\:focus\:from-teal-300:focus{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.lg\:focus\:from-teal-400:focus{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.lg\:focus\:from-teal-500:focus{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.lg\:focus\:from-teal-600:focus{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.lg\:focus\:from-teal-700:focus{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.lg\:focus\:from-teal-800:focus{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.lg\:focus\:from-teal-900:focus{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.lg\:focus\:from-blue-100:focus{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.lg\:focus\:from-blue-200:focus{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.lg\:focus\:from-blue-300:focus{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.lg\:focus\:from-blue-400:focus{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.lg\:focus\:from-blue-500:focus{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.lg\:focus\:from-blue-600:focus{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.lg\:focus\:from-blue-700:focus{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.lg\:focus\:from-blue-800:focus{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.lg\:focus\:from-blue-900:focus{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.lg\:focus\:from-indigo-100:focus{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.lg\:focus\:from-indigo-200:focus{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.lg\:focus\:from-indigo-300:focus{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.lg\:focus\:from-indigo-400:focus{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.lg\:focus\:from-indigo-500:focus{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.lg\:focus\:from-indigo-600:focus{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.lg\:focus\:from-indigo-700:focus{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.lg\:focus\:from-indigo-800:focus{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.lg\:focus\:from-indigo-900:focus{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.lg\:focus\:from-purple-100:focus{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.lg\:focus\:from-purple-200:focus{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.lg\:focus\:from-purple-300:focus{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.lg\:focus\:from-purple-400:focus{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.lg\:focus\:from-purple-500:focus{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.lg\:focus\:from-purple-600:focus{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.lg\:focus\:from-purple-700:focus{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.lg\:focus\:from-purple-800:focus{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.lg\:focus\:from-purple-900:focus{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.lg\:focus\:from-pink-100:focus{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.lg\:focus\:from-pink-200:focus{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.lg\:focus\:from-pink-300:focus{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.lg\:focus\:from-pink-400:focus{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.lg\:focus\:from-pink-500:focus{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.lg\:focus\:from-pink-600:focus{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.lg\:focus\:from-pink-700:focus{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.lg\:focus\:from-pink-800:focus{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.lg\:focus\:from-pink-900:focus{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.lg\:focus\:via-transparent:focus{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:focus\:via-current:focus{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:focus\:via-black:focus{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:focus\:via-white:focus{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:focus\:via-gray-100:focus{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.lg\:focus\:via-gray-200:focus{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.lg\:focus\:via-gray-300:focus{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.lg\:focus\:via-gray-400:focus{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.lg\:focus\:via-gray-500:focus{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.lg\:focus\:via-gray-600:focus{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.lg\:focus\:via-gray-700:focus{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.lg\:focus\:via-gray-800:focus{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.lg\:focus\:via-gray-900:focus{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.lg\:focus\:via-red-100:focus{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.lg\:focus\:via-red-200:focus{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.lg\:focus\:via-red-300:focus{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.lg\:focus\:via-red-400:focus{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.lg\:focus\:via-red-500:focus{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.lg\:focus\:via-red-600:focus{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.lg\:focus\:via-red-700:focus{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.lg\:focus\:via-red-800:focus{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.lg\:focus\:via-red-900:focus{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.lg\:focus\:via-orange-100:focus{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.lg\:focus\:via-orange-200:focus{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.lg\:focus\:via-orange-300:focus{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.lg\:focus\:via-orange-400:focus{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.lg\:focus\:via-orange-500:focus{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.lg\:focus\:via-orange-600:focus{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.lg\:focus\:via-orange-700:focus{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.lg\:focus\:via-orange-800:focus{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.lg\:focus\:via-orange-900:focus{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.lg\:focus\:via-yellow-100:focus{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.lg\:focus\:via-yellow-200:focus{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.lg\:focus\:via-yellow-300:focus{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.lg\:focus\:via-yellow-400:focus{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.lg\:focus\:via-yellow-500:focus{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.lg\:focus\:via-yellow-600:focus{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.lg\:focus\:via-yellow-700:focus{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.lg\:focus\:via-yellow-800:focus{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.lg\:focus\:via-yellow-900:focus{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.lg\:focus\:via-green-100:focus{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.lg\:focus\:via-green-200:focus{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.lg\:focus\:via-green-300:focus{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.lg\:focus\:via-green-400:focus{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.lg\:focus\:via-green-500:focus{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.lg\:focus\:via-green-600:focus{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.lg\:focus\:via-green-700:focus{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.lg\:focus\:via-green-800:focus{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.lg\:focus\:via-green-900:focus{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.lg\:focus\:via-teal-100:focus{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.lg\:focus\:via-teal-200:focus{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.lg\:focus\:via-teal-300:focus{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.lg\:focus\:via-teal-400:focus{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.lg\:focus\:via-teal-500:focus{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.lg\:focus\:via-teal-600:focus{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.lg\:focus\:via-teal-700:focus{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.lg\:focus\:via-teal-800:focus{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.lg\:focus\:via-teal-900:focus{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.lg\:focus\:via-blue-100:focus{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.lg\:focus\:via-blue-200:focus{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.lg\:focus\:via-blue-300:focus{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.lg\:focus\:via-blue-400:focus{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.lg\:focus\:via-blue-500:focus{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.lg\:focus\:via-blue-600:focus{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.lg\:focus\:via-blue-700:focus{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.lg\:focus\:via-blue-800:focus{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.lg\:focus\:via-blue-900:focus{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.lg\:focus\:via-indigo-100:focus{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.lg\:focus\:via-indigo-200:focus{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.lg\:focus\:via-indigo-300:focus{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.lg\:focus\:via-indigo-400:focus{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.lg\:focus\:via-indigo-500:focus{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.lg\:focus\:via-indigo-600:focus{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.lg\:focus\:via-indigo-700:focus{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.lg\:focus\:via-indigo-800:focus{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.lg\:focus\:via-indigo-900:focus{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.lg\:focus\:via-purple-100:focus{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.lg\:focus\:via-purple-200:focus{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.lg\:focus\:via-purple-300:focus{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.lg\:focus\:via-purple-400:focus{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.lg\:focus\:via-purple-500:focus{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.lg\:focus\:via-purple-600:focus{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.lg\:focus\:via-purple-700:focus{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.lg\:focus\:via-purple-800:focus{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.lg\:focus\:via-purple-900:focus{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.lg\:focus\:via-pink-100:focus{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.lg\:focus\:via-pink-200:focus{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.lg\:focus\:via-pink-300:focus{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.lg\:focus\:via-pink-400:focus{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.lg\:focus\:via-pink-500:focus{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.lg\:focus\:via-pink-600:focus{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.lg\:focus\:via-pink-700:focus{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.lg\:focus\:via-pink-800:focus{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.lg\:focus\:via-pink-900:focus{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.lg\:focus\:to-transparent:focus{--gradient-to-color:transparent}.lg\:focus\:to-current:focus{--gradient-to-color:currentColor}.lg\:focus\:to-black:focus{--gradient-to-color:#000}.lg\:focus\:to-white:focus{--gradient-to-color:#fff}.lg\:focus\:to-gray-100:focus{--gradient-to-color:#f7fafc}.lg\:focus\:to-gray-200:focus{--gradient-to-color:#edf2f7}.lg\:focus\:to-gray-300:focus{--gradient-to-color:#e2e8f0}.lg\:focus\:to-gray-400:focus{--gradient-to-color:#cbd5e0}.lg\:focus\:to-gray-500:focus{--gradient-to-color:#a0aec0}.lg\:focus\:to-gray-600:focus{--gradient-to-color:#718096}.lg\:focus\:to-gray-700:focus{--gradient-to-color:#4a5568}.lg\:focus\:to-gray-800:focus{--gradient-to-color:#2d3748}.lg\:focus\:to-gray-900:focus{--gradient-to-color:#1a202c}.lg\:focus\:to-red-100:focus{--gradient-to-color:#fff5f5}.lg\:focus\:to-red-200:focus{--gradient-to-color:#fed7d7}.lg\:focus\:to-red-300:focus{--gradient-to-color:#feb2b2}.lg\:focus\:to-red-400:focus{--gradient-to-color:#fc8181}.lg\:focus\:to-red-500:focus{--gradient-to-color:#f56565}.lg\:focus\:to-red-600:focus{--gradient-to-color:#e53e3e}.lg\:focus\:to-red-700:focus{--gradient-to-color:#c53030}.lg\:focus\:to-red-800:focus{--gradient-to-color:#9b2c2c}.lg\:focus\:to-red-900:focus{--gradient-to-color:#742a2a}.lg\:focus\:to-orange-100:focus{--gradient-to-color:#fffaf0}.lg\:focus\:to-orange-200:focus{--gradient-to-color:#feebc8}.lg\:focus\:to-orange-300:focus{--gradient-to-color:#fbd38d}.lg\:focus\:to-orange-400:focus{--gradient-to-color:#f6ad55}.lg\:focus\:to-orange-500:focus{--gradient-to-color:#ed8936}.lg\:focus\:to-orange-600:focus{--gradient-to-color:#dd6b20}.lg\:focus\:to-orange-700:focus{--gradient-to-color:#c05621}.lg\:focus\:to-orange-800:focus{--gradient-to-color:#9c4221}.lg\:focus\:to-orange-900:focus{--gradient-to-color:#7b341e}.lg\:focus\:to-yellow-100:focus{--gradient-to-color:#fffff0}.lg\:focus\:to-yellow-200:focus{--gradient-to-color:#fefcbf}.lg\:focus\:to-yellow-300:focus{--gradient-to-color:#faf089}.lg\:focus\:to-yellow-400:focus{--gradient-to-color:#f6e05e}.lg\:focus\:to-yellow-500:focus{--gradient-to-color:#ecc94b}.lg\:focus\:to-yellow-600:focus{--gradient-to-color:#d69e2e}.lg\:focus\:to-yellow-700:focus{--gradient-to-color:#b7791f}.lg\:focus\:to-yellow-800:focus{--gradient-to-color:#975a16}.lg\:focus\:to-yellow-900:focus{--gradient-to-color:#744210}.lg\:focus\:to-green-100:focus{--gradient-to-color:#f0fff4}.lg\:focus\:to-green-200:focus{--gradient-to-color:#c6f6d5}.lg\:focus\:to-green-300:focus{--gradient-to-color:#9ae6b4}.lg\:focus\:to-green-400:focus{--gradient-to-color:#68d391}.lg\:focus\:to-green-500:focus{--gradient-to-color:#48bb78}.lg\:focus\:to-green-600:focus{--gradient-to-color:#38a169}.lg\:focus\:to-green-700:focus{--gradient-to-color:#2f855a}.lg\:focus\:to-green-800:focus{--gradient-to-color:#276749}.lg\:focus\:to-green-900:focus{--gradient-to-color:#22543d}.lg\:focus\:to-teal-100:focus{--gradient-to-color:#e6fffa}.lg\:focus\:to-teal-200:focus{--gradient-to-color:#b2f5ea}.lg\:focus\:to-teal-300:focus{--gradient-to-color:#81e6d9}.lg\:focus\:to-teal-400:focus{--gradient-to-color:#4fd1c5}.lg\:focus\:to-teal-500:focus{--gradient-to-color:#38b2ac}.lg\:focus\:to-teal-600:focus{--gradient-to-color:#319795}.lg\:focus\:to-teal-700:focus{--gradient-to-color:#2c7a7b}.lg\:focus\:to-teal-800:focus{--gradient-to-color:#285e61}.lg\:focus\:to-teal-900:focus{--gradient-to-color:#234e52}.lg\:focus\:to-blue-100:focus{--gradient-to-color:#ebf8ff}.lg\:focus\:to-blue-200:focus{--gradient-to-color:#bee3f8}.lg\:focus\:to-blue-300:focus{--gradient-to-color:#90cdf4}.lg\:focus\:to-blue-400:focus{--gradient-to-color:#63b3ed}.lg\:focus\:to-blue-500:focus{--gradient-to-color:#4299e1}.lg\:focus\:to-blue-600:focus{--gradient-to-color:#3182ce}.lg\:focus\:to-blue-700:focus{--gradient-to-color:#2b6cb0}.lg\:focus\:to-blue-800:focus{--gradient-to-color:#2c5282}.lg\:focus\:to-blue-900:focus{--gradient-to-color:#2a4365}.lg\:focus\:to-indigo-100:focus{--gradient-to-color:#ebf4ff}.lg\:focus\:to-indigo-200:focus{--gradient-to-color:#c3dafe}.lg\:focus\:to-indigo-300:focus{--gradient-to-color:#a3bffa}.lg\:focus\:to-indigo-400:focus{--gradient-to-color:#7f9cf5}.lg\:focus\:to-indigo-500:focus{--gradient-to-color:#667eea}.lg\:focus\:to-indigo-600:focus{--gradient-to-color:#5a67d8}.lg\:focus\:to-indigo-700:focus{--gradient-to-color:#4c51bf}.lg\:focus\:to-indigo-800:focus{--gradient-to-color:#434190}.lg\:focus\:to-indigo-900:focus{--gradient-to-color:#3c366b}.lg\:focus\:to-purple-100:focus{--gradient-to-color:#faf5ff}.lg\:focus\:to-purple-200:focus{--gradient-to-color:#e9d8fd}.lg\:focus\:to-purple-300:focus{--gradient-to-color:#d6bcfa}.lg\:focus\:to-purple-400:focus{--gradient-to-color:#b794f4}.lg\:focus\:to-purple-500:focus{--gradient-to-color:#9f7aea}.lg\:focus\:to-purple-600:focus{--gradient-to-color:#805ad5}.lg\:focus\:to-purple-700:focus{--gradient-to-color:#6b46c1}.lg\:focus\:to-purple-800:focus{--gradient-to-color:#553c9a}.lg\:focus\:to-purple-900:focus{--gradient-to-color:#44337a}.lg\:focus\:to-pink-100:focus{--gradient-to-color:#fff5f7}.lg\:focus\:to-pink-200:focus{--gradient-to-color:#fed7e2}.lg\:focus\:to-pink-300:focus{--gradient-to-color:#fbb6ce}.lg\:focus\:to-pink-400:focus{--gradient-to-color:#f687b3}.lg\:focus\:to-pink-500:focus{--gradient-to-color:#ed64a6}.lg\:focus\:to-pink-600:focus{--gradient-to-color:#d53f8c}.lg\:focus\:to-pink-700:focus{--gradient-to-color:#b83280}.lg\:focus\:to-pink-800:focus{--gradient-to-color:#97266d}.lg\:focus\:to-pink-900:focus{--gradient-to-color:#702459}.lg\:bg-opacity-0{--bg-opacity:0}.lg\:bg-opacity-25{--bg-opacity:0.25}.lg\:bg-opacity-50{--bg-opacity:0.5}.lg\:bg-opacity-75{--bg-opacity:0.75}.lg\:bg-opacity-100{--bg-opacity:1}.lg\:hover\:bg-opacity-0:hover{--bg-opacity:0}.lg\:hover\:bg-opacity-25:hover{--bg-opacity:0.25}.lg\:hover\:bg-opacity-50:hover{--bg-opacity:0.5}.lg\:hover\:bg-opacity-75:hover{--bg-opacity:0.75}.lg\:hover\:bg-opacity-100:hover{--bg-opacity:1}.lg\:focus\:bg-opacity-0:focus{--bg-opacity:0}.lg\:focus\:bg-opacity-25:focus{--bg-opacity:0.25}.lg\:focus\:bg-opacity-50:focus{--bg-opacity:0.5}.lg\:focus\:bg-opacity-75:focus{--bg-opacity:0.75}.lg\:focus\:bg-opacity-100:focus{--bg-opacity:1}.lg\:bg-bottom{background-position:bottom}.lg\:bg-center{background-position:center}.lg\:bg-left{background-position:left}.lg\:bg-left-bottom{background-position:left bottom}.lg\:bg-left-top{background-position:left top}.lg\:bg-right{background-position:right}.lg\:bg-right-bottom{background-position:right bottom}.lg\:bg-right-top{background-position:right top}.lg\:bg-top{background-position:top}.lg\:bg-repeat{background-repeat:repeat}.lg\:bg-no-repeat{background-repeat:no-repeat}.lg\:bg-repeat-x{background-repeat:repeat-x}.lg\:bg-repeat-y{background-repeat:repeat-y}.lg\:bg-repeat-round{background-repeat:round}.lg\:bg-repeat-space{background-repeat:space}.lg\:bg-auto{background-size:auto}.lg\:bg-cover{background-size:cover}.lg\:bg-contain{background-size:contain}.lg\:border-collapse{border-collapse:collapse}.lg\:border-separate{border-collapse:separate}.lg\:border-transparent{border-color:transparent}.lg\:border-current{border-color:currentColor}.lg\:border-black{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.lg\:border-white{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.lg\:border-gray-100{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.lg\:border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.lg\:border-gray-300{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.lg\:border-gray-400{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.lg\:border-gray-500{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.lg\:border-gray-600{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.lg\:border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.lg\:border-gray-800{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.lg\:border-gray-900{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.lg\:border-red-100{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.lg\:border-red-200{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.lg\:border-red-300{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.lg\:border-red-400{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.lg\:border-red-500{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.lg\:border-red-600{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.lg\:border-red-700{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.lg\:border-red-800{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.lg\:border-red-900{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.lg\:border-orange-100{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.lg\:border-orange-200{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.lg\:border-orange-300{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.lg\:border-orange-400{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.lg\:border-orange-500{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.lg\:border-orange-600{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.lg\:border-orange-700{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.lg\:border-orange-800{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.lg\:border-orange-900{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.lg\:border-yellow-100{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.lg\:border-yellow-200{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.lg\:border-yellow-300{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.lg\:border-yellow-400{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.lg\:border-yellow-500{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.lg\:border-yellow-600{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.lg\:border-yellow-700{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.lg\:border-yellow-800{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.lg\:border-yellow-900{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.lg\:border-green-100{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.lg\:border-green-200{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.lg\:border-green-300{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.lg\:border-green-400{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.lg\:border-green-500{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.lg\:border-green-600{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.lg\:border-green-700{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.lg\:border-green-800{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.lg\:border-green-900{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.lg\:border-teal-100{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.lg\:border-teal-200{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.lg\:border-teal-300{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.lg\:border-teal-400{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.lg\:border-teal-500{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.lg\:border-teal-600{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.lg\:border-teal-700{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.lg\:border-teal-800{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.lg\:border-teal-900{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.lg\:border-blue-100{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.lg\:border-blue-200{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.lg\:border-blue-300{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.lg\:border-blue-400{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.lg\:border-blue-500{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.lg\:border-blue-600{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.lg\:border-blue-700{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.lg\:border-blue-800{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.lg\:border-blue-900{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.lg\:border-indigo-100{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.lg\:border-indigo-200{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.lg\:border-indigo-300{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.lg\:border-indigo-400{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.lg\:border-indigo-500{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.lg\:border-indigo-600{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.lg\:border-indigo-700{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.lg\:border-indigo-800{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.lg\:border-indigo-900{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.lg\:border-purple-100{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.lg\:border-purple-200{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.lg\:border-purple-300{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.lg\:border-purple-400{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.lg\:border-purple-500{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.lg\:border-purple-600{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.lg\:border-purple-700{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.lg\:border-purple-800{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.lg\:border-purple-900{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.lg\:border-pink-100{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.lg\:border-pink-200{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.lg\:border-pink-300{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.lg\:border-pink-400{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.lg\:border-pink-500{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.lg\:border-pink-600{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.lg\:border-pink-700{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.lg\:border-pink-800{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.lg\:border-pink-900{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.lg\:hover\:border-transparent:hover{border-color:transparent}.lg\:hover\:border-current:hover{border-color:currentColor}.lg\:hover\:border-black:hover{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.lg\:hover\:border-white:hover{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.lg\:hover\:border-gray-100:hover{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.lg\:hover\:border-gray-200:hover{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.lg\:hover\:border-gray-300:hover{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.lg\:hover\:border-gray-400:hover{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.lg\:hover\:border-gray-500:hover{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.lg\:hover\:border-gray-600:hover{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.lg\:hover\:border-gray-700:hover{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.lg\:hover\:border-gray-800:hover{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.lg\:hover\:border-gray-900:hover{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.lg\:hover\:border-red-100:hover{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.lg\:hover\:border-red-200:hover{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.lg\:hover\:border-red-300:hover{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.lg\:hover\:border-red-400:hover{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.lg\:hover\:border-red-500:hover{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.lg\:hover\:border-red-600:hover{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.lg\:hover\:border-red-700:hover{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.lg\:hover\:border-red-800:hover{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.lg\:hover\:border-red-900:hover{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.lg\:hover\:border-orange-100:hover{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.lg\:hover\:border-orange-200:hover{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.lg\:hover\:border-orange-300:hover{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.lg\:hover\:border-orange-400:hover{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.lg\:hover\:border-orange-500:hover{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.lg\:hover\:border-orange-600:hover{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.lg\:hover\:border-orange-700:hover{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.lg\:hover\:border-orange-800:hover{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.lg\:hover\:border-orange-900:hover{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.lg\:hover\:border-yellow-100:hover{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.lg\:hover\:border-yellow-200:hover{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.lg\:hover\:border-yellow-300:hover{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.lg\:hover\:border-yellow-400:hover{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.lg\:hover\:border-yellow-500:hover{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.lg\:hover\:border-yellow-600:hover{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.lg\:hover\:border-yellow-700:hover{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.lg\:hover\:border-yellow-800:hover{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.lg\:hover\:border-yellow-900:hover{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.lg\:hover\:border-green-100:hover{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.lg\:hover\:border-green-200:hover{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.lg\:hover\:border-green-300:hover{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.lg\:hover\:border-green-400:hover{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.lg\:hover\:border-green-500:hover{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.lg\:hover\:border-green-600:hover{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.lg\:hover\:border-green-700:hover{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.lg\:hover\:border-green-800:hover{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.lg\:hover\:border-green-900:hover{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.lg\:hover\:border-teal-100:hover{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.lg\:hover\:border-teal-200:hover{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.lg\:hover\:border-teal-300:hover{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.lg\:hover\:border-teal-400:hover{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.lg\:hover\:border-teal-500:hover{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.lg\:hover\:border-teal-600:hover{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.lg\:hover\:border-teal-700:hover{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.lg\:hover\:border-teal-800:hover{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.lg\:hover\:border-teal-900:hover{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.lg\:hover\:border-blue-100:hover{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.lg\:hover\:border-blue-200:hover{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.lg\:hover\:border-blue-300:hover{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.lg\:hover\:border-blue-400:hover{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.lg\:hover\:border-blue-500:hover{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.lg\:hover\:border-blue-600:hover{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.lg\:hover\:border-blue-700:hover{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.lg\:hover\:border-blue-800:hover{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.lg\:hover\:border-blue-900:hover{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.lg\:hover\:border-indigo-100:hover{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.lg\:hover\:border-indigo-200:hover{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.lg\:hover\:border-indigo-300:hover{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.lg\:hover\:border-indigo-400:hover{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.lg\:hover\:border-indigo-500:hover{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.lg\:hover\:border-indigo-600:hover{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.lg\:hover\:border-indigo-700:hover{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.lg\:hover\:border-indigo-800:hover{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.lg\:hover\:border-indigo-900:hover{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.lg\:hover\:border-purple-100:hover{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.lg\:hover\:border-purple-200:hover{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.lg\:hover\:border-purple-300:hover{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.lg\:hover\:border-purple-400:hover{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.lg\:hover\:border-purple-500:hover{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.lg\:hover\:border-purple-600:hover{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.lg\:hover\:border-purple-700:hover{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.lg\:hover\:border-purple-800:hover{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.lg\:hover\:border-purple-900:hover{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.lg\:hover\:border-pink-100:hover{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.lg\:hover\:border-pink-200:hover{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.lg\:hover\:border-pink-300:hover{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.lg\:hover\:border-pink-400:hover{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.lg\:hover\:border-pink-500:hover{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.lg\:hover\:border-pink-600:hover{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.lg\:hover\:border-pink-700:hover{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.lg\:hover\:border-pink-800:hover{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.lg\:hover\:border-pink-900:hover{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.lg\:focus\:border-transparent:focus{border-color:transparent}.lg\:focus\:border-current:focus{border-color:currentColor}.lg\:focus\:border-black:focus{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.lg\:focus\:border-white:focus{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.lg\:focus\:border-gray-100:focus{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.lg\:focus\:border-gray-200:focus{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.lg\:focus\:border-gray-300:focus{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.lg\:focus\:border-gray-400:focus{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.lg\:focus\:border-gray-500:focus{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.lg\:focus\:border-gray-600:focus{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.lg\:focus\:border-gray-700:focus{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.lg\:focus\:border-gray-800:focus{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.lg\:focus\:border-gray-900:focus{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.lg\:focus\:border-red-100:focus{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.lg\:focus\:border-red-200:focus{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.lg\:focus\:border-red-300:focus{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.lg\:focus\:border-red-400:focus{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.lg\:focus\:border-red-500:focus{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.lg\:focus\:border-red-600:focus{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.lg\:focus\:border-red-700:focus{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.lg\:focus\:border-red-800:focus{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.lg\:focus\:border-red-900:focus{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.lg\:focus\:border-orange-100:focus{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.lg\:focus\:border-orange-200:focus{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.lg\:focus\:border-orange-300:focus{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.lg\:focus\:border-orange-400:focus{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.lg\:focus\:border-orange-500:focus{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.lg\:focus\:border-orange-600:focus{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.lg\:focus\:border-orange-700:focus{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.lg\:focus\:border-orange-800:focus{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.lg\:focus\:border-orange-900:focus{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.lg\:focus\:border-yellow-100:focus{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.lg\:focus\:border-yellow-200:focus{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.lg\:focus\:border-yellow-300:focus{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.lg\:focus\:border-yellow-400:focus{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.lg\:focus\:border-yellow-500:focus{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.lg\:focus\:border-yellow-600:focus{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.lg\:focus\:border-yellow-700:focus{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.lg\:focus\:border-yellow-800:focus{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.lg\:focus\:border-yellow-900:focus{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.lg\:focus\:border-green-100:focus{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.lg\:focus\:border-green-200:focus{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.lg\:focus\:border-green-300:focus{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.lg\:focus\:border-green-400:focus{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.lg\:focus\:border-green-500:focus{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.lg\:focus\:border-green-600:focus{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.lg\:focus\:border-green-700:focus{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.lg\:focus\:border-green-800:focus{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.lg\:focus\:border-green-900:focus{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.lg\:focus\:border-teal-100:focus{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.lg\:focus\:border-teal-200:focus{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.lg\:focus\:border-teal-300:focus{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.lg\:focus\:border-teal-400:focus{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.lg\:focus\:border-teal-500:focus{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.lg\:focus\:border-teal-600:focus{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.lg\:focus\:border-teal-700:focus{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.lg\:focus\:border-teal-800:focus{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.lg\:focus\:border-teal-900:focus{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.lg\:focus\:border-blue-100:focus{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.lg\:focus\:border-blue-200:focus{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.lg\:focus\:border-blue-300:focus{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.lg\:focus\:border-blue-400:focus{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.lg\:focus\:border-blue-500:focus{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.lg\:focus\:border-blue-600:focus{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.lg\:focus\:border-blue-700:focus{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.lg\:focus\:border-blue-800:focus{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.lg\:focus\:border-blue-900:focus{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.lg\:focus\:border-indigo-100:focus{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.lg\:focus\:border-indigo-200:focus{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.lg\:focus\:border-indigo-300:focus{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.lg\:focus\:border-indigo-400:focus{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.lg\:focus\:border-indigo-500:focus{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.lg\:focus\:border-indigo-600:focus{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.lg\:focus\:border-indigo-700:focus{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.lg\:focus\:border-indigo-800:focus{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.lg\:focus\:border-indigo-900:focus{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.lg\:focus\:border-purple-100:focus{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.lg\:focus\:border-purple-200:focus{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.lg\:focus\:border-purple-300:focus{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.lg\:focus\:border-purple-400:focus{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.lg\:focus\:border-purple-500:focus{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.lg\:focus\:border-purple-600:focus{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.lg\:focus\:border-purple-700:focus{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.lg\:focus\:border-purple-800:focus{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.lg\:focus\:border-purple-900:focus{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.lg\:focus\:border-pink-100:focus{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.lg\:focus\:border-pink-200:focus{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.lg\:focus\:border-pink-300:focus{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.lg\:focus\:border-pink-400:focus{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.lg\:focus\:border-pink-500:focus{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.lg\:focus\:border-pink-600:focus{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.lg\:focus\:border-pink-700:focus{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.lg\:focus\:border-pink-800:focus{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.lg\:focus\:border-pink-900:focus{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.lg\:border-opacity-0{--border-opacity:0}.lg\:border-opacity-25{--border-opacity:0.25}.lg\:border-opacity-50{--border-opacity:0.5}.lg\:border-opacity-75{--border-opacity:0.75}.lg\:border-opacity-100{--border-opacity:1}.lg\:hover\:border-opacity-0:hover{--border-opacity:0}.lg\:hover\:border-opacity-25:hover{--border-opacity:0.25}.lg\:hover\:border-opacity-50:hover{--border-opacity:0.5}.lg\:hover\:border-opacity-75:hover{--border-opacity:0.75}.lg\:hover\:border-opacity-100:hover{--border-opacity:1}.lg\:focus\:border-opacity-0:focus{--border-opacity:0}.lg\:focus\:border-opacity-25:focus{--border-opacity:0.25}.lg\:focus\:border-opacity-50:focus{--border-opacity:0.5}.lg\:focus\:border-opacity-75:focus{--border-opacity:0.75}.lg\:focus\:border-opacity-100:focus{--border-opacity:1}.lg\:rounded-none{border-radius:0}.lg\:rounded-sm{border-radius:.125rem}.lg\:rounded{border-radius:.25rem}.lg\:rounded-md{border-radius:.375rem}.lg\:rounded-lg{border-radius:.5rem}.lg\:rounded-xl{border-radius:.75rem}.lg\:rounded-2xl{border-radius:1rem}.lg\:rounded-3xl{border-radius:1.5rem}.lg\:rounded-full{border-radius:9999px}.lg\:rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.lg\:rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.lg\:rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.lg\:rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.lg\:rounded-t-sm{border-top-left-radius:.125rem;border-top-right-radius:.125rem}.lg\:rounded-r-sm{border-top-right-radius:.125rem;border-bottom-right-radius:.125rem}.lg\:rounded-b-sm{border-bottom-right-radius:.125rem;border-bottom-left-radius:.125rem}.lg\:rounded-l-sm{border-top-left-radius:.125rem;border-bottom-left-radius:.125rem}.lg\:rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.lg\:rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.lg\:rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.lg\:rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.lg\:rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.lg\:rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.lg\:rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.lg\:rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.lg\:rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.lg\:rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.lg\:rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.lg\:rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.lg\:rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.lg\:rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.lg\:rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.lg\:rounded-l-xl{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.lg\:rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.lg\:rounded-r-2xl{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.lg\:rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.lg\:rounded-l-2xl{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.lg\:rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.lg\:rounded-r-3xl{border-top-right-radius:1.5rem;border-bottom-right-radius:1.5rem}.lg\:rounded-b-3xl{border-bottom-right-radius:1.5rem;border-bottom-left-radius:1.5rem}.lg\:rounded-l-3xl{border-top-left-radius:1.5rem;border-bottom-left-radius:1.5rem}.lg\:rounded-t-full{border-top-left-radius:9999px;border-top-right-radius:9999px}.lg\:rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.lg\:rounded-b-full{border-bottom-right-radius:9999px;border-bottom-left-radius:9999px}.lg\:rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.lg\:rounded-tl-none{border-top-left-radius:0}.lg\:rounded-tr-none{border-top-right-radius:0}.lg\:rounded-br-none{border-bottom-right-radius:0}.lg\:rounded-bl-none{border-bottom-left-radius:0}.lg\:rounded-tl-sm{border-top-left-radius:.125rem}.lg\:rounded-tr-sm{border-top-right-radius:.125rem}.lg\:rounded-br-sm{border-bottom-right-radius:.125rem}.lg\:rounded-bl-sm{border-bottom-left-radius:.125rem}.lg\:rounded-tl{border-top-left-radius:.25rem}.lg\:rounded-tr{border-top-right-radius:.25rem}.lg\:rounded-br{border-bottom-right-radius:.25rem}.lg\:rounded-bl{border-bottom-left-radius:.25rem}.lg\:rounded-tl-md{border-top-left-radius:.375rem}.lg\:rounded-tr-md{border-top-right-radius:.375rem}.lg\:rounded-br-md{border-bottom-right-radius:.375rem}.lg\:rounded-bl-md{border-bottom-left-radius:.375rem}.lg\:rounded-tl-lg{border-top-left-radius:.5rem}.lg\:rounded-tr-lg{border-top-right-radius:.5rem}.lg\:rounded-br-lg{border-bottom-right-radius:.5rem}.lg\:rounded-bl-lg{border-bottom-left-radius:.5rem}.lg\:rounded-tl-xl{border-top-left-radius:.75rem}.lg\:rounded-tr-xl{border-top-right-radius:.75rem}.lg\:rounded-br-xl{border-bottom-right-radius:.75rem}.lg\:rounded-bl-xl{border-bottom-left-radius:.75rem}.lg\:rounded-tl-2xl{border-top-left-radius:1rem}.lg\:rounded-tr-2xl{border-top-right-radius:1rem}.lg\:rounded-br-2xl{border-bottom-right-radius:1rem}.lg\:rounded-bl-2xl{border-bottom-left-radius:1rem}.lg\:rounded-tl-3xl{border-top-left-radius:1.5rem}.lg\:rounded-tr-3xl{border-top-right-radius:1.5rem}.lg\:rounded-br-3xl{border-bottom-right-radius:1.5rem}.lg\:rounded-bl-3xl{border-bottom-left-radius:1.5rem}.lg\:rounded-tl-full{border-top-left-radius:9999px}.lg\:rounded-tr-full{border-top-right-radius:9999px}.lg\:rounded-br-full{border-bottom-right-radius:9999px}.lg\:rounded-bl-full{border-bottom-left-radius:9999px}.lg\:border-solid{border-style:solid}.lg\:border-dashed{border-style:dashed}.lg\:border-dotted{border-style:dotted}.lg\:border-double{border-style:double}.lg\:border-none{border-style:none}.lg\:border-0{border-width:0}.lg\:border-2{border-width:2px}.lg\:border-4{border-width:4px}.lg\:border-8{border-width:8px}.lg\:border{border-width:1px}.lg\:border-t-0{border-top-width:0}.lg\:border-r-0{border-right-width:0}.lg\:border-b-0{border-bottom-width:0}.lg\:border-l-0{border-left-width:0}.lg\:border-t-2{border-top-width:2px}.lg\:border-r-2{border-right-width:2px}.lg\:border-b-2{border-bottom-width:2px}.lg\:border-l-2{border-left-width:2px}.lg\:border-t-4{border-top-width:4px}.lg\:border-r-4{border-right-width:4px}.lg\:border-b-4{border-bottom-width:4px}.lg\:border-l-4{border-left-width:4px}.lg\:border-t-8{border-top-width:8px}.lg\:border-r-8{border-right-width:8px}.lg\:border-b-8{border-bottom-width:8px}.lg\:border-l-8{border-left-width:8px}.lg\:border-t{border-top-width:1px}.lg\:border-r{border-right-width:1px}.lg\:border-b{border-bottom-width:1px}.lg\:border-l{border-left-width:1px}.lg\:box-border{box-sizing:border-box}.lg\:box-content{box-sizing:content-box}.lg\:cursor-auto{cursor:auto}.lg\:cursor-default{cursor:default}.lg\:cursor-pointer{cursor:pointer}.lg\:cursor-wait{cursor:wait}.lg\:cursor-text{cursor:text}.lg\:cursor-move{cursor:move}.lg\:cursor-not-allowed{cursor:not-allowed}.lg\:block{display:block}.lg\:inline-block{display:inline-block}.lg\:inline{display:inline}.lg\:flex{display:flex}.lg\:inline-flex{display:inline-flex}.lg\:table{display:table}.lg\:table-caption{display:table-caption}.lg\:table-cell{display:table-cell}.lg\:table-column{display:table-column}.lg\:table-column-group{display:table-column-group}.lg\:table-footer-group{display:table-footer-group}.lg\:table-header-group{display:table-header-group}.lg\:table-row-group{display:table-row-group}.lg\:table-row{display:table-row}.lg\:flow-root{display:flow-root}.lg\:grid{display:grid}.lg\:inline-grid{display:inline-grid}.lg\:contents{display:contents}.lg\:hidden{display:none}.lg\:flex-row{flex-direction:row}.lg\:flex-row-reverse{flex-direction:row-reverse}.lg\:flex-col{flex-direction:column}.lg\:flex-col-reverse{flex-direction:column-reverse}.lg\:flex-wrap{flex-wrap:wrap}.lg\:flex-wrap-reverse{flex-wrap:wrap-reverse}.lg\:flex-no-wrap{flex-wrap:nowrap}.lg\:place-items-auto{place-items:auto}.lg\:place-items-start{place-items:start}.lg\:place-items-end{place-items:end}.lg\:place-items-center{place-items:center}.lg\:place-items-stretch{place-items:stretch}.lg\:place-content-center{place-content:center}.lg\:place-content-start{place-content:start}.lg\:place-content-end{place-content:end}.lg\:place-content-between{place-content:space-between}.lg\:place-content-around{place-content:space-around}.lg\:place-content-evenly{place-content:space-evenly}.lg\:place-content-stretch{place-content:stretch}.lg\:place-self-auto{place-self:auto}.lg\:place-self-start{place-self:start}.lg\:place-self-end{place-self:end}.lg\:place-self-center{place-self:center}.lg\:place-self-stretch{place-self:stretch}.lg\:items-start{align-items:flex-start}.lg\:items-end{align-items:flex-end}.lg\:items-center{align-items:center}.lg\:items-baseline{align-items:baseline}.lg\:items-stretch{align-items:stretch}.lg\:content-center{align-content:center}.lg\:content-start{align-content:flex-start}.lg\:content-end{align-content:flex-end}.lg\:content-between{align-content:space-between}.lg\:content-around{align-content:space-around}.lg\:content-evenly{align-content:space-evenly}.lg\:self-auto{align-self:auto}.lg\:self-start{align-self:flex-start}.lg\:self-end{align-self:flex-end}.lg\:self-center{align-self:center}.lg\:self-stretch{align-self:stretch}.lg\:justify-items-auto{justify-items:auto}.lg\:justify-items-start{justify-items:start}.lg\:justify-items-end{justify-items:end}.lg\:justify-items-center{justify-items:center}.lg\:justify-items-stretch{justify-items:stretch}.lg\:justify-start{justify-content:flex-start}.lg\:justify-end{justify-content:flex-end}.lg\:justify-center{justify-content:center}.lg\:justify-between{justify-content:space-between}.lg\:justify-around{justify-content:space-around}.lg\:justify-evenly{justify-content:space-evenly}.lg\:justify-self-auto{justify-self:auto}.lg\:justify-self-start{justify-self:start}.lg\:justify-self-end{justify-self:end}.lg\:justify-self-center{justify-self:center}.lg\:justify-self-stretch{justify-self:stretch}.lg\:flex-1{flex:1 1 0%}.lg\:flex-auto{flex:1 1 auto}.lg\:flex-initial{flex:0 1 auto}.lg\:flex-none{flex:none}.lg\:flex-grow-0{flex-grow:0}.lg\:flex-grow{flex-grow:1}.lg\:flex-shrink-0{flex-shrink:0}.lg\:flex-shrink{flex-shrink:1}.lg\:order-1{order:1}.lg\:order-2{order:2}.lg\:order-3{order:3}.lg\:order-4{order:4}.lg\:order-5{order:5}.lg\:order-6{order:6}.lg\:order-7{order:7}.lg\:order-8{order:8}.lg\:order-9{order:9}.lg\:order-10{order:10}.lg\:order-11{order:11}.lg\:order-12{order:12}.lg\:order-first{order:-9999}.lg\:order-last{order:9999}.lg\:order-none{order:0}.lg\:float-right{float:right}.lg\:float-left{float:left}.lg\:float-none{float:none}.lg\:clearfix:after{content:"";display:table;clear:both}.lg\:clear-left{clear:left}.lg\:clear-right{clear:right}.lg\:clear-both{clear:both}.lg\:clear-none{clear:none}.lg\:font-sans{font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.lg\:font-serif{font-family:Georgia,Cambria,"Times New Roman",Times,serif}.lg\:font-mono{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.lg\:font-hairline{font-weight:100}.lg\:font-thin{font-weight:200}.lg\:font-light{font-weight:300}.lg\:font-normal{font-weight:400}.lg\:font-medium{font-weight:500}.lg\:font-semibold{font-weight:600}.lg\:font-bold{font-weight:700}.lg\:font-extrabold{font-weight:800}.lg\:font-black{font-weight:900}.lg\:hover\:font-hairline:hover{font-weight:100}.lg\:hover\:font-thin:hover{font-weight:200}.lg\:hover\:font-light:hover{font-weight:300}.lg\:hover\:font-normal:hover{font-weight:400}.lg\:hover\:font-medium:hover{font-weight:500}.lg\:hover\:font-semibold:hover{font-weight:600}.lg\:hover\:font-bold:hover{font-weight:700}.lg\:hover\:font-extrabold:hover{font-weight:800}.lg\:hover\:font-black:hover{font-weight:900}.lg\:focus\:font-hairline:focus{font-weight:100}.lg\:focus\:font-thin:focus{font-weight:200}.lg\:focus\:font-light:focus{font-weight:300}.lg\:focus\:font-normal:focus{font-weight:400}.lg\:focus\:font-medium:focus{font-weight:500}.lg\:focus\:font-semibold:focus{font-weight:600}.lg\:focus\:font-bold:focus{font-weight:700}.lg\:focus\:font-extrabold:focus{font-weight:800}.lg\:focus\:font-black:focus{font-weight:900}.lg\:h-0{height:0}.lg\:h-1{height:.25rem}.lg\:h-2{height:.5rem}.lg\:h-3{height:.75rem}.lg\:h-4{height:1rem}.lg\:h-5{height:1.25rem}.lg\:h-6{height:1.5rem}.lg\:h-8{height:2rem}.lg\:h-10{height:2.5rem}.lg\:h-12{height:3rem}.lg\:h-16{height:4rem}.lg\:h-20{height:5rem}.lg\:h-24{height:6rem}.lg\:h-32{height:8rem}.lg\:h-40{height:10rem}.lg\:h-48{height:12rem}.lg\:h-56{height:14rem}.lg\:h-64{height:16rem}.lg\:h-auto{height:auto}.lg\:h-px{height:1px}.lg\:h-full{height:100%}.lg\:h-screen{height:100vh}.lg\:text-xs{font-size:.75rem}.lg\:text-sm{font-size:.875rem}.lg\:text-base{font-size:1rem}.lg\:text-lg{font-size:1.125rem}.lg\:text-xl{font-size:1.25rem}.lg\:text-2xl{font-size:1.5rem}.lg\:text-3xl{font-size:1.875rem}.lg\:text-4xl{font-size:2.25rem}.lg\:text-5xl{font-size:3rem}.lg\:text-6xl{font-size:4rem}.lg\:leading-3{line-height:.75rem}.lg\:leading-4{line-height:1rem}.lg\:leading-5{line-height:1.25rem}.lg\:leading-6{line-height:1.5rem}.lg\:leading-7{line-height:1.75rem}.lg\:leading-8{line-height:2rem}.lg\:leading-9{line-height:2.25rem}.lg\:leading-10{line-height:2.5rem}.lg\:leading-none{line-height:1}.lg\:leading-tight{line-height:1.25}.lg\:leading-snug{line-height:1.375}.lg\:leading-normal{line-height:1.5}.lg\:leading-relaxed{line-height:1.625}.lg\:leading-loose{line-height:2}.lg\:list-inside{list-style-position:inside}.lg\:list-outside{list-style-position:outside}.lg\:list-none{list-style-type:none}.lg\:list-disc{list-style-type:disc}.lg\:list-decimal{list-style-type:decimal}.lg\:m-0{margin:0}.lg\:m-1{margin:.25rem}.lg\:m-2{margin:.5rem}.lg\:m-3{margin:.75rem}.lg\:m-4{margin:1rem}.lg\:m-5{margin:1.25rem}.lg\:m-6{margin:1.5rem}.lg\:m-8{margin:2rem}.lg\:m-10{margin:2.5rem}.lg\:m-12{margin:3rem}.lg\:m-16{margin:4rem}.lg\:m-20{margin:5rem}.lg\:m-24{margin:6rem}.lg\:m-32{margin:8rem}.lg\:m-40{margin:10rem}.lg\:m-48{margin:12rem}.lg\:m-56{margin:14rem}.lg\:m-64{margin:16rem}.lg\:m-auto{margin:auto}.lg\:m-px{margin:1px}.lg\:-m-1{margin:-.25rem}.lg\:-m-2{margin:-.5rem}.lg\:-m-3{margin:-.75rem}.lg\:-m-4{margin:-1rem}.lg\:-m-5{margin:-1.25rem}.lg\:-m-6{margin:-1.5rem}.lg\:-m-8{margin:-2rem}.lg\:-m-10{margin:-2.5rem}.lg\:-m-12{margin:-3rem}.lg\:-m-16{margin:-4rem}.lg\:-m-20{margin:-5rem}.lg\:-m-24{margin:-6rem}.lg\:-m-32{margin:-8rem}.lg\:-m-40{margin:-10rem}.lg\:-m-48{margin:-12rem}.lg\:-m-56{margin:-14rem}.lg\:-m-64{margin:-16rem}.lg\:-m-px{margin:-1px}.lg\:my-0{margin-top:0;margin-bottom:0}.lg\:mx-0{margin-left:0;margin-right:0}.lg\:my-1{margin-top:.25rem;margin-bottom:.25rem}.lg\:mx-1{margin-left:.25rem;margin-right:.25rem}.lg\:my-2{margin-top:.5rem;margin-bottom:.5rem}.lg\:mx-2{margin-left:.5rem;margin-right:.5rem}.lg\:my-3{margin-top:.75rem;margin-bottom:.75rem}.lg\:mx-3{margin-left:.75rem;margin-right:.75rem}.lg\:my-4{margin-top:1rem;margin-bottom:1rem}.lg\:mx-4{margin-left:1rem;margin-right:1rem}.lg\:my-5{margin-top:1.25rem;margin-bottom:1.25rem}.lg\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.lg\:my-6{margin-top:1.5rem;margin-bottom:1.5rem}.lg\:mx-6{margin-left:1.5rem;margin-right:1.5rem}.lg\:my-8{margin-top:2rem;margin-bottom:2rem}.lg\:mx-8{margin-left:2rem;margin-right:2rem}.lg\:my-10{margin-top:2.5rem;margin-bottom:2.5rem}.lg\:mx-10{margin-left:2.5rem;margin-right:2.5rem}.lg\:my-12{margin-top:3rem;margin-bottom:3rem}.lg\:mx-12{margin-left:3rem;margin-right:3rem}.lg\:my-16{margin-top:4rem;margin-bottom:4rem}.lg\:mx-16{margin-left:4rem;margin-right:4rem}.lg\:my-20{margin-top:5rem;margin-bottom:5rem}.lg\:mx-20{margin-left:5rem;margin-right:5rem}.lg\:my-24{margin-top:6rem;margin-bottom:6rem}.lg\:mx-24{margin-left:6rem;margin-right:6rem}.lg\:my-32{margin-top:8rem;margin-bottom:8rem}.lg\:mx-32{margin-left:8rem;margin-right:8rem}.lg\:my-40{margin-top:10rem;margin-bottom:10rem}.lg\:mx-40{margin-left:10rem;margin-right:10rem}.lg\:my-48{margin-top:12rem;margin-bottom:12rem}.lg\:mx-48{margin-left:12rem;margin-right:12rem}.lg\:my-56{margin-top:14rem;margin-bottom:14rem}.lg\:mx-56{margin-left:14rem;margin-right:14rem}.lg\:my-64{margin-top:16rem;margin-bottom:16rem}.lg\:mx-64{margin-left:16rem;margin-right:16rem}.lg\:my-auto{margin-top:auto;margin-bottom:auto}.lg\:mx-auto{margin-left:auto;margin-right:auto}.lg\:my-px{margin-top:1px;margin-bottom:1px}.lg\:mx-px{margin-left:1px;margin-right:1px}.lg\:-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.lg\:-mx-1{margin-left:-.25rem;margin-right:-.25rem}.lg\:-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.lg\:-mx-2{margin-left:-.5rem;margin-right:-.5rem}.lg\:-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.lg\:-mx-3{margin-left:-.75rem;margin-right:-.75rem}.lg\:-my-4{margin-top:-1rem;margin-bottom:-1rem}.lg\:-mx-4{margin-left:-1rem;margin-right:-1rem}.lg\:-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.lg\:-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.lg\:-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.lg\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.lg\:-my-8{margin-top:-2rem;margin-bottom:-2rem}.lg\:-mx-8{margin-left:-2rem;margin-right:-2rem}.lg\:-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.lg\:-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.lg\:-my-12{margin-top:-3rem;margin-bottom:-3rem}.lg\:-mx-12{margin-left:-3rem;margin-right:-3rem}.lg\:-my-16{margin-top:-4rem;margin-bottom:-4rem}.lg\:-mx-16{margin-left:-4rem;margin-right:-4rem}.lg\:-my-20{margin-top:-5rem;margin-bottom:-5rem}.lg\:-mx-20{margin-left:-5rem;margin-right:-5rem}.lg\:-my-24{margin-top:-6rem;margin-bottom:-6rem}.lg\:-mx-24{margin-left:-6rem;margin-right:-6rem}.lg\:-my-32{margin-top:-8rem;margin-bottom:-8rem}.lg\:-mx-32{margin-left:-8rem;margin-right:-8rem}.lg\:-my-40{margin-top:-10rem;margin-bottom:-10rem}.lg\:-mx-40{margin-left:-10rem;margin-right:-10rem}.lg\:-my-48{margin-top:-12rem;margin-bottom:-12rem}.lg\:-mx-48{margin-left:-12rem;margin-right:-12rem}.lg\:-my-56{margin-top:-14rem;margin-bottom:-14rem}.lg\:-mx-56{margin-left:-14rem;margin-right:-14rem}.lg\:-my-64{margin-top:-16rem;margin-bottom:-16rem}.lg\:-mx-64{margin-left:-16rem;margin-right:-16rem}.lg\:-my-px{margin-top:-1px;margin-bottom:-1px}.lg\:-mx-px{margin-left:-1px;margin-right:-1px}.lg\:mt-0{margin-top:0}.lg\:mr-0{margin-right:0}.lg\:mb-0{margin-bottom:0}.lg\:ml-0{margin-left:0}.lg\:mt-1{margin-top:.25rem}.lg\:mr-1{margin-right:.25rem}.lg\:mb-1{margin-bottom:.25rem}.lg\:ml-1{margin-left:.25rem}.lg\:mt-2{margin-top:.5rem}.lg\:mr-2{margin-right:.5rem}.lg\:mb-2{margin-bottom:.5rem}.lg\:ml-2{margin-left:.5rem}.lg\:mt-3{margin-top:.75rem}.lg\:mr-3{margin-right:.75rem}.lg\:mb-3{margin-bottom:.75rem}.lg\:ml-3{margin-left:.75rem}.lg\:mt-4{margin-top:1rem}.lg\:mr-4{margin-right:1rem}.lg\:mb-4{margin-bottom:1rem}.lg\:ml-4{margin-left:1rem}.lg\:mt-5{margin-top:1.25rem}.lg\:mr-5{margin-right:1.25rem}.lg\:mb-5{margin-bottom:1.25rem}.lg\:ml-5{margin-left:1.25rem}.lg\:mt-6{margin-top:1.5rem}.lg\:mr-6{margin-right:1.5rem}.lg\:mb-6{margin-bottom:1.5rem}.lg\:ml-6{margin-left:1.5rem}.lg\:mt-8{margin-top:2rem}.lg\:mr-8{margin-right:2rem}.lg\:mb-8{margin-bottom:2rem}.lg\:ml-8{margin-left:2rem}.lg\:mt-10{margin-top:2.5rem}.lg\:mr-10{margin-right:2.5rem}.lg\:mb-10{margin-bottom:2.5rem}.lg\:ml-10{margin-left:2.5rem}.lg\:mt-12{margin-top:3rem}.lg\:mr-12{margin-right:3rem}.lg\:mb-12{margin-bottom:3rem}.lg\:ml-12{margin-left:3rem}.lg\:mt-16{margin-top:4rem}.lg\:mr-16{margin-right:4rem}.lg\:mb-16{margin-bottom:4rem}.lg\:ml-16{margin-left:4rem}.lg\:mt-20{margin-top:5rem}.lg\:mr-20{margin-right:5rem}.lg\:mb-20{margin-bottom:5rem}.lg\:ml-20{margin-left:5rem}.lg\:mt-24{margin-top:6rem}.lg\:mr-24{margin-right:6rem}.lg\:mb-24{margin-bottom:6rem}.lg\:ml-24{margin-left:6rem}.lg\:mt-32{margin-top:8rem}.lg\:mr-32{margin-right:8rem}.lg\:mb-32{margin-bottom:8rem}.lg\:ml-32{margin-left:8rem}.lg\:mt-40{margin-top:10rem}.lg\:mr-40{margin-right:10rem}.lg\:mb-40{margin-bottom:10rem}.lg\:ml-40{margin-left:10rem}.lg\:mt-48{margin-top:12rem}.lg\:mr-48{margin-right:12rem}.lg\:mb-48{margin-bottom:12rem}.lg\:ml-48{margin-left:12rem}.lg\:mt-56{margin-top:14rem}.lg\:mr-56{margin-right:14rem}.lg\:mb-56{margin-bottom:14rem}.lg\:ml-56{margin-left:14rem}.lg\:mt-64{margin-top:16rem}.lg\:mr-64{margin-right:16rem}.lg\:mb-64{margin-bottom:16rem}.lg\:ml-64{margin-left:16rem}.lg\:mt-auto{margin-top:auto}.lg\:mr-auto{margin-right:auto}.lg\:mb-auto{margin-bottom:auto}.lg\:ml-auto{margin-left:auto}.lg\:mt-px{margin-top:1px}.lg\:mr-px{margin-right:1px}.lg\:mb-px{margin-bottom:1px}.lg\:ml-px{margin-left:1px}.lg\:-mt-1{margin-top:-.25rem}.lg\:-mr-1{margin-right:-.25rem}.lg\:-mb-1{margin-bottom:-.25rem}.lg\:-ml-1{margin-left:-.25rem}.lg\:-mt-2{margin-top:-.5rem}.lg\:-mr-2{margin-right:-.5rem}.lg\:-mb-2{margin-bottom:-.5rem}.lg\:-ml-2{margin-left:-.5rem}.lg\:-mt-3{margin-top:-.75rem}.lg\:-mr-3{margin-right:-.75rem}.lg\:-mb-3{margin-bottom:-.75rem}.lg\:-ml-3{margin-left:-.75rem}.lg\:-mt-4{margin-top:-1rem}.lg\:-mr-4{margin-right:-1rem}.lg\:-mb-4{margin-bottom:-1rem}.lg\:-ml-4{margin-left:-1rem}.lg\:-mt-5{margin-top:-1.25rem}.lg\:-mr-5{margin-right:-1.25rem}.lg\:-mb-5{margin-bottom:-1.25rem}.lg\:-ml-5{margin-left:-1.25rem}.lg\:-mt-6{margin-top:-1.5rem}.lg\:-mr-6{margin-right:-1.5rem}.lg\:-mb-6{margin-bottom:-1.5rem}.lg\:-ml-6{margin-left:-1.5rem}.lg\:-mt-8{margin-top:-2rem}.lg\:-mr-8{margin-right:-2rem}.lg\:-mb-8{margin-bottom:-2rem}.lg\:-ml-8{margin-left:-2rem}.lg\:-mt-10{margin-top:-2.5rem}.lg\:-mr-10{margin-right:-2.5rem}.lg\:-mb-10{margin-bottom:-2.5rem}.lg\:-ml-10{margin-left:-2.5rem}.lg\:-mt-12{margin-top:-3rem}.lg\:-mr-12{margin-right:-3rem}.lg\:-mb-12{margin-bottom:-3rem}.lg\:-ml-12{margin-left:-3rem}.lg\:-mt-16{margin-top:-4rem}.lg\:-mr-16{margin-right:-4rem}.lg\:-mb-16{margin-bottom:-4rem}.lg\:-ml-16{margin-left:-4rem}.lg\:-mt-20{margin-top:-5rem}.lg\:-mr-20{margin-right:-5rem}.lg\:-mb-20{margin-bottom:-5rem}.lg\:-ml-20{margin-left:-5rem}.lg\:-mt-24{margin-top:-6rem}.lg\:-mr-24{margin-right:-6rem}.lg\:-mb-24{margin-bottom:-6rem}.lg\:-ml-24{margin-left:-6rem}.lg\:-mt-32{margin-top:-8rem}.lg\:-mr-32{margin-right:-8rem}.lg\:-mb-32{margin-bottom:-8rem}.lg\:-ml-32{margin-left:-8rem}.lg\:-mt-40{margin-top:-10rem}.lg\:-mr-40{margin-right:-10rem}.lg\:-mb-40{margin-bottom:-10rem}.lg\:-ml-40{margin-left:-10rem}.lg\:-mt-48{margin-top:-12rem}.lg\:-mr-48{margin-right:-12rem}.lg\:-mb-48{margin-bottom:-12rem}.lg\:-ml-48{margin-left:-12rem}.lg\:-mt-56{margin-top:-14rem}.lg\:-mr-56{margin-right:-14rem}.lg\:-mb-56{margin-bottom:-14rem}.lg\:-ml-56{margin-left:-14rem}.lg\:-mt-64{margin-top:-16rem}.lg\:-mr-64{margin-right:-16rem}.lg\:-mb-64{margin-bottom:-16rem}.lg\:-ml-64{margin-left:-16rem}.lg\:-mt-px{margin-top:-1px}.lg\:-mr-px{margin-right:-1px}.lg\:-mb-px{margin-bottom:-1px}.lg\:-ml-px{margin-left:-1px}.lg\:max-h-full{max-height:100%}.lg\:max-h-screen{max-height:100vh}.lg\:max-w-none{max-width:none}.lg\:max-w-xs{max-width:20rem}.lg\:max-w-sm{max-width:24rem}.lg\:max-w-md{max-width:28rem}.lg\:max-w-lg{max-width:32rem}.lg\:max-w-xl{max-width:36rem}.lg\:max-w-2xl{max-width:42rem}.lg\:max-w-3xl{max-width:48rem}.lg\:max-w-4xl{max-width:56rem}.lg\:max-w-5xl{max-width:64rem}.lg\:max-w-6xl{max-width:72rem}.lg\:max-w-full{max-width:100%}.lg\:max-w-screen-sm{max-width:640px}.lg\:max-w-screen-md{max-width:768px}.lg\:max-w-screen-lg{max-width:1024px}.lg\:max-w-screen-xl{max-width:1280px}.lg\:min-h-0{min-height:0}.lg\:min-h-full{min-height:100%}.lg\:min-h-screen{min-height:100vh}.lg\:min-w-0{min-width:0}.lg\:min-w-full{min-width:100%}.lg\:object-contain{object-fit:contain}.lg\:object-cover{object-fit:cover}.lg\:object-fill{object-fit:fill}.lg\:object-none{object-fit:none}.lg\:object-scale-down{object-fit:scale-down}.lg\:object-bottom{object-position:bottom}.lg\:object-center{object-position:center}.lg\:object-left{object-position:left}.lg\:object-left-bottom{object-position:left bottom}.lg\:object-left-top{object-position:left top}.lg\:object-right{object-position:right}.lg\:object-right-bottom{object-position:right bottom}.lg\:object-right-top{object-position:right top}.lg\:object-top{object-position:top}.lg\:opacity-0{opacity:0}.lg\:opacity-25{opacity:.25}.lg\:opacity-50{opacity:.5}.lg\:opacity-75{opacity:.75}.lg\:opacity-100{opacity:1}.lg\:hover\:opacity-0:hover{opacity:0}.lg\:hover\:opacity-25:hover{opacity:.25}.lg\:hover\:opacity-50:hover{opacity:.5}.lg\:hover\:opacity-75:hover{opacity:.75}.lg\:hover\:opacity-100:hover{opacity:1}.lg\:focus\:opacity-0:focus{opacity:0}.lg\:focus\:opacity-25:focus{opacity:.25}.lg\:focus\:opacity-50:focus{opacity:.5}.lg\:focus\:opacity-75:focus{opacity:.75}.lg\:focus\:opacity-100:focus{opacity:1}.lg\:outline-none{outline:2px solid transparent;outline-offset:2px}.lg\:outline-white{outline:2px dotted #fff;outline-offset:2px}.lg\:outline-black{outline:2px dotted #000;outline-offset:2px}.lg\:focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.lg\:focus\:outline-white:focus{outline:2px dotted #fff;outline-offset:2px}.lg\:focus\:outline-black:focus{outline:2px dotted #000;outline-offset:2px}.lg\:overflow-auto{overflow:auto}.lg\:overflow-hidden{overflow:hidden}.lg\:overflow-visible{overflow:visible}.lg\:overflow-scroll{overflow:scroll}.lg\:overflow-x-auto{overflow-x:auto}.lg\:overflow-y-auto{overflow-y:auto}.lg\:overflow-x-hidden{overflow-x:hidden}.lg\:overflow-y-hidden{overflow-y:hidden}.lg\:overflow-x-visible{overflow-x:visible}.lg\:overflow-y-visible{overflow-y:visible}.lg\:overflow-x-scroll{overflow-x:scroll}.lg\:overflow-y-scroll{overflow-y:scroll}.lg\:scrolling-touch{-webkit-overflow-scrolling:touch}.lg\:scrolling-auto{-webkit-overflow-scrolling:auto}.lg\:overscroll-auto{-ms-scroll-chaining:chained;overscroll-behavior:auto}.lg\:overscroll-contain{-ms-scroll-chaining:none;overscroll-behavior:contain}.lg\:overscroll-none{-ms-scroll-chaining:none;overscroll-behavior:none}.lg\:overscroll-y-auto{overscroll-behavior-y:auto}.lg\:overscroll-y-contain{overscroll-behavior-y:contain}.lg\:overscroll-y-none{overscroll-behavior-y:none}.lg\:overscroll-x-auto{overscroll-behavior-x:auto}.lg\:overscroll-x-contain{overscroll-behavior-x:contain}.lg\:overscroll-x-none{overscroll-behavior-x:none}.lg\:p-0{padding:0}.lg\:p-1{padding:.25rem}.lg\:p-2{padding:.5rem}.lg\:p-3{padding:.75rem}.lg\:p-4{padding:1rem}.lg\:p-5{padding:1.25rem}.lg\:p-6{padding:1.5rem}.lg\:p-8{padding:2rem}.lg\:p-10{padding:2.5rem}.lg\:p-12{padding:3rem}.lg\:p-16{padding:4rem}.lg\:p-20{padding:5rem}.lg\:p-24{padding:6rem}.lg\:p-32{padding:8rem}.lg\:p-40{padding:10rem}.lg\:p-48{padding:12rem}.lg\:p-56{padding:14rem}.lg\:p-64{padding:16rem}.lg\:p-px{padding:1px}.lg\:py-0{padding-top:0;padding-bottom:0}.lg\:px-0{padding-left:0;padding-right:0}.lg\:py-1{padding-top:.25rem;padding-bottom:.25rem}.lg\:px-1{padding-left:.25rem;padding-right:.25rem}.lg\:py-2{padding-top:.5rem;padding-bottom:.5rem}.lg\:px-2{padding-left:.5rem;padding-right:.5rem}.lg\:py-3{padding-top:.75rem;padding-bottom:.75rem}.lg\:px-3{padding-left:.75rem;padding-right:.75rem}.lg\:py-4{padding-top:1rem;padding-bottom:1rem}.lg\:px-4{padding-left:1rem;padding-right:1rem}.lg\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.lg\:px-5{padding-left:1.25rem;padding-right:1.25rem}.lg\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.lg\:px-6{padding-left:1.5rem;padding-right:1.5rem}.lg\:py-8{padding-top:2rem;padding-bottom:2rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:py-10{padding-top:2.5rem;padding-bottom:2.5rem}.lg\:px-10{padding-left:2.5rem;padding-right:2.5rem}.lg\:py-12{padding-top:3rem;padding-bottom:3rem}.lg\:px-12{padding-left:3rem;padding-right:3rem}.lg\:py-16{padding-top:4rem;padding-bottom:4rem}.lg\:px-16{padding-left:4rem;padding-right:4rem}.lg\:py-20{padding-top:5rem;padding-bottom:5rem}.lg\:px-20{padding-left:5rem;padding-right:5rem}.lg\:py-24{padding-top:6rem;padding-bottom:6rem}.lg\:px-24{padding-left:6rem;padding-right:6rem}.lg\:py-32{padding-top:8rem;padding-bottom:8rem}.lg\:px-32{padding-left:8rem;padding-right:8rem}.lg\:py-40{padding-top:10rem;padding-bottom:10rem}.lg\:px-40{padding-left:10rem;padding-right:10rem}.lg\:py-48{padding-top:12rem;padding-bottom:12rem}.lg\:px-48{padding-left:12rem;padding-right:12rem}.lg\:py-56{padding-top:14rem;padding-bottom:14rem}.lg\:px-56{padding-left:14rem;padding-right:14rem}.lg\:py-64{padding-top:16rem;padding-bottom:16rem}.lg\:px-64{padding-left:16rem;padding-right:16rem}.lg\:py-px{padding-top:1px;padding-bottom:1px}.lg\:px-px{padding-left:1px;padding-right:1px}.lg\:pt-0{padding-top:0}.lg\:pr-0{padding-right:0}.lg\:pb-0{padding-bottom:0}.lg\:pl-0{padding-left:0}.lg\:pt-1{padding-top:.25rem}.lg\:pr-1{padding-right:.25rem}.lg\:pb-1{padding-bottom:.25rem}.lg\:pl-1{padding-left:.25rem}.lg\:pt-2{padding-top:.5rem}.lg\:pr-2{padding-right:.5rem}.lg\:pb-2{padding-bottom:.5rem}.lg\:pl-2{padding-left:.5rem}.lg\:pt-3{padding-top:.75rem}.lg\:pr-3{padding-right:.75rem}.lg\:pb-3{padding-bottom:.75rem}.lg\:pl-3{padding-left:.75rem}.lg\:pt-4{padding-top:1rem}.lg\:pr-4{padding-right:1rem}.lg\:pb-4{padding-bottom:1rem}.lg\:pl-4{padding-left:1rem}.lg\:pt-5{padding-top:1.25rem}.lg\:pr-5{padding-right:1.25rem}.lg\:pb-5{padding-bottom:1.25rem}.lg\:pl-5{padding-left:1.25rem}.lg\:pt-6{padding-top:1.5rem}.lg\:pr-6{padding-right:1.5rem}.lg\:pb-6{padding-bottom:1.5rem}.lg\:pl-6{padding-left:1.5rem}.lg\:pt-8{padding-top:2rem}.lg\:pr-8{padding-right:2rem}.lg\:pb-8{padding-bottom:2rem}.lg\:pl-8{padding-left:2rem}.lg\:pt-10{padding-top:2.5rem}.lg\:pr-10{padding-right:2.5rem}.lg\:pb-10{padding-bottom:2.5rem}.lg\:pl-10{padding-left:2.5rem}.lg\:pt-12{padding-top:3rem}.lg\:pr-12{padding-right:3rem}.lg\:pb-12{padding-bottom:3rem}.lg\:pl-12{padding-left:3rem}.lg\:pt-16{padding-top:4rem}.lg\:pr-16{padding-right:4rem}.lg\:pb-16{padding-bottom:4rem}.lg\:pl-16{padding-left:4rem}.lg\:pt-20{padding-top:5rem}.lg\:pr-20{padding-right:5rem}.lg\:pb-20{padding-bottom:5rem}.lg\:pl-20{padding-left:5rem}.lg\:pt-24{padding-top:6rem}.lg\:pr-24{padding-right:6rem}.lg\:pb-24{padding-bottom:6rem}.lg\:pl-24{padding-left:6rem}.lg\:pt-32{padding-top:8rem}.lg\:pr-32{padding-right:8rem}.lg\:pb-32{padding-bottom:8rem}.lg\:pl-32{padding-left:8rem}.lg\:pt-40{padding-top:10rem}.lg\:pr-40{padding-right:10rem}.lg\:pb-40{padding-bottom:10rem}.lg\:pl-40{padding-left:10rem}.lg\:pt-48{padding-top:12rem}.lg\:pr-48{padding-right:12rem}.lg\:pb-48{padding-bottom:12rem}.lg\:pl-48{padding-left:12rem}.lg\:pt-56{padding-top:14rem}.lg\:pr-56{padding-right:14rem}.lg\:pb-56{padding-bottom:14rem}.lg\:pl-56{padding-left:14rem}.lg\:pt-64{padding-top:16rem}.lg\:pr-64{padding-right:16rem}.lg\:pb-64{padding-bottom:16rem}.lg\:pl-64{padding-left:16rem}.lg\:pt-px{padding-top:1px}.lg\:pr-px{padding-right:1px}.lg\:pb-px{padding-bottom:1px}.lg\:pl-px{padding-left:1px}.lg\:placeholder-transparent:-ms-input-placeholder{color:transparent}.lg\:placeholder-transparent::-ms-input-placeholder{color:transparent}.lg\:placeholder-transparent::placeholder{color:transparent}.lg\:placeholder-current:-ms-input-placeholder{color:currentColor}.lg\:placeholder-current::-ms-input-placeholder{color:currentColor}.lg\:placeholder-current::placeholder{color:currentColor}.lg\:placeholder-black:-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.lg\:placeholder-black::-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.lg\:placeholder-black::placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.lg\:placeholder-white:-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.lg\:placeholder-white::-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.lg\:placeholder-white::placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.lg\:placeholder-gray-100:-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.lg\:placeholder-gray-100::-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.lg\:placeholder-gray-100::placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.lg\:placeholder-gray-200:-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.lg\:placeholder-gray-200::-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.lg\:placeholder-gray-200::placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.lg\:placeholder-gray-300:-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.lg\:placeholder-gray-300::-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.lg\:placeholder-gray-300::placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.lg\:placeholder-gray-400:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.lg\:placeholder-gray-400::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.lg\:placeholder-gray-400::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.lg\:placeholder-gray-500:-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.lg\:placeholder-gray-500::-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.lg\:placeholder-gray-500::placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.lg\:placeholder-gray-600:-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.lg\:placeholder-gray-600::-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.lg\:placeholder-gray-600::placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.lg\:placeholder-gray-700:-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.lg\:placeholder-gray-700::-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.lg\:placeholder-gray-700::placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.lg\:placeholder-gray-800:-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.lg\:placeholder-gray-800::-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.lg\:placeholder-gray-800::placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.lg\:placeholder-gray-900:-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.lg\:placeholder-gray-900::-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.lg\:placeholder-gray-900::placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.lg\:placeholder-red-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.lg\:placeholder-red-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.lg\:placeholder-red-100::placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.lg\:placeholder-red-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.lg\:placeholder-red-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.lg\:placeholder-red-200::placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.lg\:placeholder-red-300:-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.lg\:placeholder-red-300::-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.lg\:placeholder-red-300::placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.lg\:placeholder-red-400:-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.lg\:placeholder-red-400::-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.lg\:placeholder-red-400::placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.lg\:placeholder-red-500:-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.lg\:placeholder-red-500::-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.lg\:placeholder-red-500::placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.lg\:placeholder-red-600:-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.lg\:placeholder-red-600::-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.lg\:placeholder-red-600::placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.lg\:placeholder-red-700:-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.lg\:placeholder-red-700::-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.lg\:placeholder-red-700::placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.lg\:placeholder-red-800:-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.lg\:placeholder-red-800::-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.lg\:placeholder-red-800::placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.lg\:placeholder-red-900:-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.lg\:placeholder-red-900::-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.lg\:placeholder-red-900::placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.lg\:placeholder-orange-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.lg\:placeholder-orange-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.lg\:placeholder-orange-100::placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.lg\:placeholder-orange-200:-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.lg\:placeholder-orange-200::-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.lg\:placeholder-orange-200::placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.lg\:placeholder-orange-300:-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.lg\:placeholder-orange-300::-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.lg\:placeholder-orange-300::placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.lg\:placeholder-orange-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.lg\:placeholder-orange-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.lg\:placeholder-orange-400::placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.lg\:placeholder-orange-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.lg\:placeholder-orange-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.lg\:placeholder-orange-500::placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.lg\:placeholder-orange-600:-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.lg\:placeholder-orange-600::-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.lg\:placeholder-orange-600::placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.lg\:placeholder-orange-700:-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.lg\:placeholder-orange-700::-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.lg\:placeholder-orange-700::placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.lg\:placeholder-orange-800:-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.lg\:placeholder-orange-800::-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.lg\:placeholder-orange-800::placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.lg\:placeholder-orange-900:-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.lg\:placeholder-orange-900::-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.lg\:placeholder-orange-900::placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.lg\:placeholder-yellow-100:-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.lg\:placeholder-yellow-100::-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.lg\:placeholder-yellow-100::placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.lg\:placeholder-yellow-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.lg\:placeholder-yellow-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.lg\:placeholder-yellow-200::placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.lg\:placeholder-yellow-300:-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.lg\:placeholder-yellow-300::-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.lg\:placeholder-yellow-300::placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.lg\:placeholder-yellow-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.lg\:placeholder-yellow-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.lg\:placeholder-yellow-400::placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.lg\:placeholder-yellow-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.lg\:placeholder-yellow-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.lg\:placeholder-yellow-500::placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.lg\:placeholder-yellow-600:-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.lg\:placeholder-yellow-600::-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.lg\:placeholder-yellow-600::placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.lg\:placeholder-yellow-700:-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.lg\:placeholder-yellow-700::-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.lg\:placeholder-yellow-700::placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.lg\:placeholder-yellow-800:-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.lg\:placeholder-yellow-800::-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.lg\:placeholder-yellow-800::placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.lg\:placeholder-yellow-900:-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.lg\:placeholder-yellow-900::-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.lg\:placeholder-yellow-900::placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.lg\:placeholder-green-100:-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.lg\:placeholder-green-100::-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.lg\:placeholder-green-100::placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.lg\:placeholder-green-200:-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.lg\:placeholder-green-200::-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.lg\:placeholder-green-200::placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.lg\:placeholder-green-300:-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.lg\:placeholder-green-300::-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.lg\:placeholder-green-300::placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.lg\:placeholder-green-400:-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.lg\:placeholder-green-400::-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.lg\:placeholder-green-400::placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.lg\:placeholder-green-500:-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.lg\:placeholder-green-500::-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.lg\:placeholder-green-500::placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.lg\:placeholder-green-600:-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.lg\:placeholder-green-600::-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.lg\:placeholder-green-600::placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.lg\:placeholder-green-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.lg\:placeholder-green-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.lg\:placeholder-green-700::placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.lg\:placeholder-green-800:-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.lg\:placeholder-green-800::-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.lg\:placeholder-green-800::placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.lg\:placeholder-green-900:-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.lg\:placeholder-green-900::-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.lg\:placeholder-green-900::placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.lg\:placeholder-teal-100:-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.lg\:placeholder-teal-100::-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.lg\:placeholder-teal-100::placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.lg\:placeholder-teal-200:-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.lg\:placeholder-teal-200::-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.lg\:placeholder-teal-200::placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.lg\:placeholder-teal-300:-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.lg\:placeholder-teal-300::-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.lg\:placeholder-teal-300::placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.lg\:placeholder-teal-400:-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.lg\:placeholder-teal-400::-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.lg\:placeholder-teal-400::placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.lg\:placeholder-teal-500:-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.lg\:placeholder-teal-500::-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.lg\:placeholder-teal-500::placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.lg\:placeholder-teal-600:-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.lg\:placeholder-teal-600::-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.lg\:placeholder-teal-600::placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.lg\:placeholder-teal-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.lg\:placeholder-teal-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.lg\:placeholder-teal-700::placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.lg\:placeholder-teal-800:-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.lg\:placeholder-teal-800::-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.lg\:placeholder-teal-800::placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.lg\:placeholder-teal-900:-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.lg\:placeholder-teal-900::-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.lg\:placeholder-teal-900::placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.lg\:placeholder-blue-100:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.lg\:placeholder-blue-100::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.lg\:placeholder-blue-100::placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.lg\:placeholder-blue-200:-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.lg\:placeholder-blue-200::-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.lg\:placeholder-blue-200::placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.lg\:placeholder-blue-300:-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.lg\:placeholder-blue-300::-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.lg\:placeholder-blue-300::placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.lg\:placeholder-blue-400:-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.lg\:placeholder-blue-400::-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.lg\:placeholder-blue-400::placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.lg\:placeholder-blue-500:-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.lg\:placeholder-blue-500::-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.lg\:placeholder-blue-500::placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.lg\:placeholder-blue-600:-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.lg\:placeholder-blue-600::-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.lg\:placeholder-blue-600::placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.lg\:placeholder-blue-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.lg\:placeholder-blue-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.lg\:placeholder-blue-700::placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.lg\:placeholder-blue-800:-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.lg\:placeholder-blue-800::-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.lg\:placeholder-blue-800::placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.lg\:placeholder-blue-900:-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.lg\:placeholder-blue-900::-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.lg\:placeholder-blue-900::placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.lg\:placeholder-indigo-100:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.lg\:placeholder-indigo-100::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.lg\:placeholder-indigo-100::placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.lg\:placeholder-indigo-200:-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.lg\:placeholder-indigo-200::-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.lg\:placeholder-indigo-200::placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.lg\:placeholder-indigo-300:-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.lg\:placeholder-indigo-300::-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.lg\:placeholder-indigo-300::placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.lg\:placeholder-indigo-400:-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.lg\:placeholder-indigo-400::-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.lg\:placeholder-indigo-400::placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.lg\:placeholder-indigo-500:-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.lg\:placeholder-indigo-500::-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.lg\:placeholder-indigo-500::placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.lg\:placeholder-indigo-600:-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.lg\:placeholder-indigo-600::-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.lg\:placeholder-indigo-600::placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.lg\:placeholder-indigo-700:-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.lg\:placeholder-indigo-700::-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.lg\:placeholder-indigo-700::placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.lg\:placeholder-indigo-800:-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.lg\:placeholder-indigo-800::-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.lg\:placeholder-indigo-800::placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.lg\:placeholder-indigo-900:-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.lg\:placeholder-indigo-900::-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.lg\:placeholder-indigo-900::placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.lg\:placeholder-purple-100:-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.lg\:placeholder-purple-100::-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.lg\:placeholder-purple-100::placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.lg\:placeholder-purple-200:-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.lg\:placeholder-purple-200::-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.lg\:placeholder-purple-200::placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.lg\:placeholder-purple-300:-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.lg\:placeholder-purple-300::-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.lg\:placeholder-purple-300::placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.lg\:placeholder-purple-400:-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.lg\:placeholder-purple-400::-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.lg\:placeholder-purple-400::placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.lg\:placeholder-purple-500:-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.lg\:placeholder-purple-500::-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.lg\:placeholder-purple-500::placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.lg\:placeholder-purple-600:-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.lg\:placeholder-purple-600::-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.lg\:placeholder-purple-600::placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.lg\:placeholder-purple-700:-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.lg\:placeholder-purple-700::-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.lg\:placeholder-purple-700::placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.lg\:placeholder-purple-800:-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.lg\:placeholder-purple-800::-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.lg\:placeholder-purple-800::placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.lg\:placeholder-purple-900:-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.lg\:placeholder-purple-900::-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.lg\:placeholder-purple-900::placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.lg\:placeholder-pink-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.lg\:placeholder-pink-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.lg\:placeholder-pink-100::placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.lg\:placeholder-pink-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.lg\:placeholder-pink-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.lg\:placeholder-pink-200::placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.lg\:placeholder-pink-300:-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.lg\:placeholder-pink-300::-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.lg\:placeholder-pink-300::placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.lg\:placeholder-pink-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.lg\:placeholder-pink-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.lg\:placeholder-pink-400::placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.lg\:placeholder-pink-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.lg\:placeholder-pink-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.lg\:placeholder-pink-500::placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.lg\:placeholder-pink-600:-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.lg\:placeholder-pink-600::-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.lg\:placeholder-pink-600::placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.lg\:placeholder-pink-700:-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.lg\:placeholder-pink-700::-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.lg\:placeholder-pink-700::placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.lg\:placeholder-pink-800:-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.lg\:placeholder-pink-800::-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.lg\:placeholder-pink-800::placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.lg\:placeholder-pink-900:-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.lg\:placeholder-pink-900::-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.lg\:placeholder-pink-900::placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.lg\:focus\:placeholder-transparent:focus:-ms-input-placeholder{color:transparent}.lg\:focus\:placeholder-transparent:focus::-ms-input-placeholder{color:transparent}.lg\:focus\:placeholder-transparent:focus::placeholder{color:transparent}.lg\:focus\:placeholder-current:focus:-ms-input-placeholder{color:currentColor}.lg\:focus\:placeholder-current:focus::-ms-input-placeholder{color:currentColor}.lg\:focus\:placeholder-current:focus::placeholder{color:currentColor}.lg\:focus\:placeholder-black:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.lg\:focus\:placeholder-black:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.lg\:focus\:placeholder-black:focus::placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.lg\:focus\:placeholder-white:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-white:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-white:focus::placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-100:focus::placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-200:focus::placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-300:focus::placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-400:focus::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-500:focus::placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-600:focus::placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-700:focus::placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-800:focus::placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-900:focus::placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-100:focus::placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-200:focus::placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-300:focus::placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-400:focus::placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-500:focus::placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-600:focus::placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-700:focus::placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-800:focus::placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-900:focus::placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-100:focus::placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-200:focus::placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-300:focus::placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-400:focus::placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-500:focus::placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-600:focus::placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-700:focus::placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-800:focus::placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-900:focus::placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-100:focus::placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-200:focus::placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-300:focus::placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-400:focus::placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-500:focus::placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-600:focus::placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-700:focus::placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-800:focus::placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-900:focus::placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-100:focus::placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-200:focus::placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-300:focus::placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-400:focus::placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-500:focus::placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-600:focus::placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-700:focus::placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-800:focus::placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-900:focus::placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-100:focus::placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-200:focus::placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-300:focus::placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-400:focus::placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-500:focus::placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-600:focus::placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-700:focus::placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-800:focus::placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-900:focus::placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-100:focus::placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-200:focus::placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-300:focus::placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-400:focus::placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-500:focus::placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-600:focus::placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-700:focus::placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-800:focus::placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-900:focus::placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-100:focus::placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-200:focus::placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-300:focus::placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-400:focus::placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-500:focus::placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-600:focus::placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-700:focus::placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-800:focus::placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-900:focus::placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-100:focus::placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-200:focus::placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-300:focus::placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-400:focus::placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-500:focus::placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-600:focus::placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-700:focus::placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-800:focus::placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-900:focus::placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-100:focus::placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-200:focus::placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-300:focus::placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-400:focus::placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-500:focus::placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-600:focus::placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-700:focus::placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-800:focus::placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-900:focus::placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.lg\:placeholder-opacity-0:-ms-input-placeholder{--placeholder-opacity:0}.lg\:placeholder-opacity-0::-ms-input-placeholder{--placeholder-opacity:0}.lg\:placeholder-opacity-0::placeholder{--placeholder-opacity:0}.lg\:placeholder-opacity-25:-ms-input-placeholder{--placeholder-opacity:0.25}.lg\:placeholder-opacity-25::-ms-input-placeholder{--placeholder-opacity:0.25}.lg\:placeholder-opacity-25::placeholder{--placeholder-opacity:0.25}.lg\:placeholder-opacity-50:-ms-input-placeholder{--placeholder-opacity:0.5}.lg\:placeholder-opacity-50::-ms-input-placeholder{--placeholder-opacity:0.5}.lg\:placeholder-opacity-50::placeholder{--placeholder-opacity:0.5}.lg\:placeholder-opacity-75:-ms-input-placeholder{--placeholder-opacity:0.75}.lg\:placeholder-opacity-75::-ms-input-placeholder{--placeholder-opacity:0.75}.lg\:placeholder-opacity-75::placeholder{--placeholder-opacity:0.75}.lg\:placeholder-opacity-100:-ms-input-placeholder{--placeholder-opacity:1}.lg\:placeholder-opacity-100::-ms-input-placeholder{--placeholder-opacity:1}.lg\:placeholder-opacity-100::placeholder{--placeholder-opacity:1}.lg\:focus\:placeholder-opacity-0:focus:-ms-input-placeholder{--placeholder-opacity:0}.lg\:focus\:placeholder-opacity-0:focus::-ms-input-placeholder{--placeholder-opacity:0}.lg\:focus\:placeholder-opacity-0:focus::placeholder{--placeholder-opacity:0}.lg\:focus\:placeholder-opacity-25:focus:-ms-input-placeholder{--placeholder-opacity:0.25}.lg\:focus\:placeholder-opacity-25:focus::-ms-input-placeholder{--placeholder-opacity:0.25}.lg\:focus\:placeholder-opacity-25:focus::placeholder{--placeholder-opacity:0.25}.lg\:focus\:placeholder-opacity-50:focus:-ms-input-placeholder{--placeholder-opacity:0.5}.lg\:focus\:placeholder-opacity-50:focus::-ms-input-placeholder{--placeholder-opacity:0.5}.lg\:focus\:placeholder-opacity-50:focus::placeholder{--placeholder-opacity:0.5}.lg\:focus\:placeholder-opacity-75:focus:-ms-input-placeholder{--placeholder-opacity:0.75}.lg\:focus\:placeholder-opacity-75:focus::-ms-input-placeholder{--placeholder-opacity:0.75}.lg\:focus\:placeholder-opacity-75:focus::placeholder{--placeholder-opacity:0.75}.lg\:focus\:placeholder-opacity-100:focus:-ms-input-placeholder{--placeholder-opacity:1}.lg\:focus\:placeholder-opacity-100:focus::-ms-input-placeholder{--placeholder-opacity:1}.lg\:focus\:placeholder-opacity-100:focus::placeholder{--placeholder-opacity:1}.lg\:pointer-events-none{pointer-events:none}.lg\:pointer-events-auto{pointer-events:auto}.lg\:static{position:static}.lg\:fixed{position:fixed}.lg\:absolute{position:absolute}.lg\:relative{position:relative}.lg\:sticky{position:-webkit-sticky;position:sticky}.lg\:inset-0{top:0;right:0;bottom:0;left:0}.lg\:inset-auto{top:auto;right:auto;bottom:auto;left:auto}.lg\:inset-y-0{top:0;bottom:0}.lg\:inset-x-0{right:0;left:0}.lg\:inset-y-auto{top:auto;bottom:auto}.lg\:inset-x-auto{right:auto;left:auto}.lg\:top-0{top:0}.lg\:right-0{right:0}.lg\:bottom-0{bottom:0}.lg\:left-0{left:0}.lg\:top-auto{top:auto}.lg\:right-auto{right:auto}.lg\:bottom-auto{bottom:auto}.lg\:left-auto{left:auto}.lg\:resize-none{resize:none}.lg\:resize-y{resize:vertical}.lg\:resize-x{resize:horizontal}.lg\:resize{resize:both}.lg\:shadow-xs{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.lg\:shadow-sm{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.lg\:shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.lg\:shadow-md{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.lg\:shadow-lg{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.lg\:shadow-xl{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.lg\:shadow-2xl{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.lg\:shadow-inner{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.lg\:shadow-outline{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.lg\:shadow-none{box-shadow:none}.lg\:hover\:shadow-xs:hover{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.lg\:hover\:shadow-sm:hover{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.lg\:hover\:shadow:hover{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.lg\:hover\:shadow-md:hover{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.lg\:hover\:shadow-lg:hover{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.lg\:hover\:shadow-xl:hover{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.lg\:hover\:shadow-2xl:hover{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.lg\:hover\:shadow-inner:hover{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.lg\:hover\:shadow-outline:hover{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.lg\:hover\:shadow-none:hover{box-shadow:none}.lg\:focus\:shadow-xs:focus{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.lg\:focus\:shadow-sm:focus{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.lg\:focus\:shadow:focus{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.lg\:focus\:shadow-md:focus{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.lg\:focus\:shadow-lg:focus{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.lg\:focus\:shadow-xl:focus{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.lg\:focus\:shadow-2xl:focus{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.lg\:focus\:shadow-inner:focus{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.lg\:focus\:shadow-outline:focus{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.lg\:focus\:shadow-none:focus{box-shadow:none}.lg\:fill-current{fill:currentColor}.lg\:stroke-current{stroke:currentColor}.lg\:stroke-0{stroke-width:0}.lg\:stroke-1{stroke-width:1}.lg\:stroke-2{stroke-width:2}.lg\:table-auto{table-layout:auto}.lg\:table-fixed{table-layout:fixed}.lg\:text-left{text-align:left}.lg\:text-center{text-align:center}.lg\:text-right{text-align:right}.lg\:text-justify{text-align:justify}.lg\:text-transparent{color:transparent}.lg\:text-current{color:currentColor}.lg\:text-black{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.lg\:text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.lg\:text-gray-100{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.lg\:text-gray-200{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.lg\:text-gray-300{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.lg\:text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.lg\:text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.lg\:text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.lg\:text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.lg\:text-gray-800{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.lg\:text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.lg\:text-red-100{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.lg\:text-red-200{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.lg\:text-red-300{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.lg\:text-red-400{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.lg\:text-red-500{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.lg\:text-red-600{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.lg\:text-red-700{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.lg\:text-red-800{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.lg\:text-red-900{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.lg\:text-orange-100{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.lg\:text-orange-200{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.lg\:text-orange-300{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.lg\:text-orange-400{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.lg\:text-orange-500{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.lg\:text-orange-600{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.lg\:text-orange-700{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.lg\:text-orange-800{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.lg\:text-orange-900{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.lg\:text-yellow-100{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.lg\:text-yellow-200{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.lg\:text-yellow-300{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.lg\:text-yellow-400{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.lg\:text-yellow-500{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.lg\:text-yellow-600{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.lg\:text-yellow-700{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.lg\:text-yellow-800{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.lg\:text-yellow-900{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.lg\:text-green-100{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.lg\:text-green-200{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.lg\:text-green-300{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.lg\:text-green-400{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.lg\:text-green-500{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.lg\:text-green-600{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.lg\:text-green-700{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.lg\:text-green-800{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.lg\:text-green-900{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.lg\:text-teal-100{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.lg\:text-teal-200{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.lg\:text-teal-300{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.lg\:text-teal-400{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.lg\:text-teal-500{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.lg\:text-teal-600{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.lg\:text-teal-700{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.lg\:text-teal-800{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.lg\:text-teal-900{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.lg\:text-blue-100{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.lg\:text-blue-200{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.lg\:text-blue-300{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.lg\:text-blue-400{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.lg\:text-blue-500{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.lg\:text-blue-600{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.lg\:text-blue-700{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.lg\:text-blue-800{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.lg\:text-blue-900{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.lg\:text-indigo-100{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.lg\:text-indigo-200{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.lg\:text-indigo-300{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.lg\:text-indigo-400{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.lg\:text-indigo-500{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.lg\:text-indigo-600{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.lg\:text-indigo-700{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.lg\:text-indigo-800{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.lg\:text-indigo-900{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.lg\:text-purple-100{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.lg\:text-purple-200{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.lg\:text-purple-300{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.lg\:text-purple-400{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.lg\:text-purple-500{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.lg\:text-purple-600{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.lg\:text-purple-700{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.lg\:text-purple-800{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.lg\:text-purple-900{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.lg\:text-pink-100{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.lg\:text-pink-200{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.lg\:text-pink-300{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.lg\:text-pink-400{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.lg\:text-pink-500{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.lg\:text-pink-600{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.lg\:text-pink-700{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.lg\:text-pink-800{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.lg\:text-pink-900{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.lg\:hover\:text-transparent:hover{color:transparent}.lg\:hover\:text-current:hover{color:currentColor}.lg\:hover\:text-black:hover{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.lg\:hover\:text-white:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.lg\:hover\:text-gray-100:hover{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.lg\:hover\:text-gray-200:hover{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.lg\:hover\:text-gray-300:hover{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.lg\:hover\:text-gray-400:hover{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.lg\:hover\:text-gray-500:hover{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.lg\:hover\:text-gray-600:hover{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.lg\:hover\:text-gray-700:hover{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.lg\:hover\:text-gray-800:hover{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.lg\:hover\:text-gray-900:hover{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.lg\:hover\:text-red-100:hover{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.lg\:hover\:text-red-200:hover{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.lg\:hover\:text-red-300:hover{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.lg\:hover\:text-red-400:hover{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.lg\:hover\:text-red-500:hover{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.lg\:hover\:text-red-600:hover{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.lg\:hover\:text-red-700:hover{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.lg\:hover\:text-red-800:hover{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.lg\:hover\:text-red-900:hover{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.lg\:hover\:text-orange-100:hover{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.lg\:hover\:text-orange-200:hover{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.lg\:hover\:text-orange-300:hover{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.lg\:hover\:text-orange-400:hover{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.lg\:hover\:text-orange-500:hover{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.lg\:hover\:text-orange-600:hover{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.lg\:hover\:text-orange-700:hover{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.lg\:hover\:text-orange-800:hover{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.lg\:hover\:text-orange-900:hover{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.lg\:hover\:text-yellow-100:hover{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.lg\:hover\:text-yellow-200:hover{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.lg\:hover\:text-yellow-300:hover{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.lg\:hover\:text-yellow-400:hover{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.lg\:hover\:text-yellow-500:hover{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.lg\:hover\:text-yellow-600:hover{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.lg\:hover\:text-yellow-700:hover{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.lg\:hover\:text-yellow-800:hover{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.lg\:hover\:text-yellow-900:hover{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.lg\:hover\:text-green-100:hover{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.lg\:hover\:text-green-200:hover{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.lg\:hover\:text-green-300:hover{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.lg\:hover\:text-green-400:hover{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.lg\:hover\:text-green-500:hover{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.lg\:hover\:text-green-600:hover{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.lg\:hover\:text-green-700:hover{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.lg\:hover\:text-green-800:hover{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.lg\:hover\:text-green-900:hover{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.lg\:hover\:text-teal-100:hover{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.lg\:hover\:text-teal-200:hover{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.lg\:hover\:text-teal-300:hover{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.lg\:hover\:text-teal-400:hover{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.lg\:hover\:text-teal-500:hover{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.lg\:hover\:text-teal-600:hover{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.lg\:hover\:text-teal-700:hover{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.lg\:hover\:text-teal-800:hover{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.lg\:hover\:text-teal-900:hover{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.lg\:hover\:text-blue-100:hover{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.lg\:hover\:text-blue-200:hover{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.lg\:hover\:text-blue-300:hover{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.lg\:hover\:text-blue-400:hover{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.lg\:hover\:text-blue-500:hover{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.lg\:hover\:text-blue-600:hover{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.lg\:hover\:text-blue-700:hover{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.lg\:hover\:text-blue-800:hover{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.lg\:hover\:text-blue-900:hover{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.lg\:hover\:text-indigo-100:hover{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.lg\:hover\:text-indigo-200:hover{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.lg\:hover\:text-indigo-300:hover{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.lg\:hover\:text-indigo-400:hover{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.lg\:hover\:text-indigo-500:hover{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.lg\:hover\:text-indigo-600:hover{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.lg\:hover\:text-indigo-700:hover{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.lg\:hover\:text-indigo-800:hover{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.lg\:hover\:text-indigo-900:hover{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.lg\:hover\:text-purple-100:hover{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.lg\:hover\:text-purple-200:hover{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.lg\:hover\:text-purple-300:hover{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.lg\:hover\:text-purple-400:hover{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.lg\:hover\:text-purple-500:hover{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.lg\:hover\:text-purple-600:hover{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.lg\:hover\:text-purple-700:hover{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.lg\:hover\:text-purple-800:hover{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.lg\:hover\:text-purple-900:hover{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.lg\:hover\:text-pink-100:hover{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.lg\:hover\:text-pink-200:hover{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.lg\:hover\:text-pink-300:hover{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.lg\:hover\:text-pink-400:hover{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.lg\:hover\:text-pink-500:hover{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.lg\:hover\:text-pink-600:hover{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.lg\:hover\:text-pink-700:hover{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.lg\:hover\:text-pink-800:hover{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.lg\:hover\:text-pink-900:hover{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.lg\:focus\:text-transparent:focus{color:transparent}.lg\:focus\:text-current:focus{color:currentColor}.lg\:focus\:text-black:focus{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.lg\:focus\:text-white:focus{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.lg\:focus\:text-gray-100:focus{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.lg\:focus\:text-gray-200:focus{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.lg\:focus\:text-gray-300:focus{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.lg\:focus\:text-gray-400:focus{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.lg\:focus\:text-gray-500:focus{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.lg\:focus\:text-gray-600:focus{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.lg\:focus\:text-gray-700:focus{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.lg\:focus\:text-gray-800:focus{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.lg\:focus\:text-gray-900:focus{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.lg\:focus\:text-red-100:focus{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.lg\:focus\:text-red-200:focus{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.lg\:focus\:text-red-300:focus{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.lg\:focus\:text-red-400:focus{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.lg\:focus\:text-red-500:focus{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.lg\:focus\:text-red-600:focus{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.lg\:focus\:text-red-700:focus{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.lg\:focus\:text-red-800:focus{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.lg\:focus\:text-red-900:focus{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.lg\:focus\:text-orange-100:focus{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.lg\:focus\:text-orange-200:focus{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.lg\:focus\:text-orange-300:focus{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.lg\:focus\:text-orange-400:focus{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.lg\:focus\:text-orange-500:focus{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.lg\:focus\:text-orange-600:focus{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.lg\:focus\:text-orange-700:focus{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.lg\:focus\:text-orange-800:focus{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.lg\:focus\:text-orange-900:focus{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.lg\:focus\:text-yellow-100:focus{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.lg\:focus\:text-yellow-200:focus{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.lg\:focus\:text-yellow-300:focus{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.lg\:focus\:text-yellow-400:focus{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.lg\:focus\:text-yellow-500:focus{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.lg\:focus\:text-yellow-600:focus{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.lg\:focus\:text-yellow-700:focus{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.lg\:focus\:text-yellow-800:focus{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.lg\:focus\:text-yellow-900:focus{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.lg\:focus\:text-green-100:focus{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.lg\:focus\:text-green-200:focus{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.lg\:focus\:text-green-300:focus{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.lg\:focus\:text-green-400:focus{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.lg\:focus\:text-green-500:focus{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.lg\:focus\:text-green-600:focus{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.lg\:focus\:text-green-700:focus{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.lg\:focus\:text-green-800:focus{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.lg\:focus\:text-green-900:focus{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.lg\:focus\:text-teal-100:focus{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.lg\:focus\:text-teal-200:focus{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.lg\:focus\:text-teal-300:focus{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.lg\:focus\:text-teal-400:focus{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.lg\:focus\:text-teal-500:focus{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.lg\:focus\:text-teal-600:focus{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.lg\:focus\:text-teal-700:focus{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.lg\:focus\:text-teal-800:focus{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.lg\:focus\:text-teal-900:focus{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.lg\:focus\:text-blue-100:focus{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.lg\:focus\:text-blue-200:focus{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.lg\:focus\:text-blue-300:focus{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.lg\:focus\:text-blue-400:focus{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.lg\:focus\:text-blue-500:focus{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.lg\:focus\:text-blue-600:focus{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.lg\:focus\:text-blue-700:focus{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.lg\:focus\:text-blue-800:focus{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.lg\:focus\:text-blue-900:focus{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.lg\:focus\:text-indigo-100:focus{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.lg\:focus\:text-indigo-200:focus{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.lg\:focus\:text-indigo-300:focus{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.lg\:focus\:text-indigo-400:focus{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.lg\:focus\:text-indigo-500:focus{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.lg\:focus\:text-indigo-600:focus{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.lg\:focus\:text-indigo-700:focus{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.lg\:focus\:text-indigo-800:focus{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.lg\:focus\:text-indigo-900:focus{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.lg\:focus\:text-purple-100:focus{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.lg\:focus\:text-purple-200:focus{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.lg\:focus\:text-purple-300:focus{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.lg\:focus\:text-purple-400:focus{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.lg\:focus\:text-purple-500:focus{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.lg\:focus\:text-purple-600:focus{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.lg\:focus\:text-purple-700:focus{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.lg\:focus\:text-purple-800:focus{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.lg\:focus\:text-purple-900:focus{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.lg\:focus\:text-pink-100:focus{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.lg\:focus\:text-pink-200:focus{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.lg\:focus\:text-pink-300:focus{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.lg\:focus\:text-pink-400:focus{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.lg\:focus\:text-pink-500:focus{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.lg\:focus\:text-pink-600:focus{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.lg\:focus\:text-pink-700:focus{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.lg\:focus\:text-pink-800:focus{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.lg\:focus\:text-pink-900:focus{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.lg\:text-opacity-0{--text-opacity:0}.lg\:text-opacity-25{--text-opacity:0.25}.lg\:text-opacity-50{--text-opacity:0.5}.lg\:text-opacity-75{--text-opacity:0.75}.lg\:text-opacity-100{--text-opacity:1}.lg\:hover\:text-opacity-0:hover{--text-opacity:0}.lg\:hover\:text-opacity-25:hover{--text-opacity:0.25}.lg\:hover\:text-opacity-50:hover{--text-opacity:0.5}.lg\:hover\:text-opacity-75:hover{--text-opacity:0.75}.lg\:hover\:text-opacity-100:hover{--text-opacity:1}.lg\:focus\:text-opacity-0:focus{--text-opacity:0}.lg\:focus\:text-opacity-25:focus{--text-opacity:0.25}.lg\:focus\:text-opacity-50:focus{--text-opacity:0.5}.lg\:focus\:text-opacity-75:focus{--text-opacity:0.75}.lg\:focus\:text-opacity-100:focus{--text-opacity:1}.lg\:italic{font-style:italic}.lg\:not-italic{font-style:normal}.lg\:uppercase{text-transform:uppercase}.lg\:lowercase{text-transform:lowercase}.lg\:capitalize{text-transform:capitalize}.lg\:normal-case{text-transform:none}.lg\:underline{text-decoration:underline}.lg\:line-through{text-decoration:line-through}.lg\:no-underline{text-decoration:none}.lg\:hover\:underline:hover{text-decoration:underline}.lg\:hover\:line-through:hover{text-decoration:line-through}.lg\:hover\:no-underline:hover{text-decoration:none}.lg\:focus\:underline:focus{text-decoration:underline}.lg\:focus\:line-through:focus{text-decoration:line-through}.lg\:focus\:no-underline:focus{text-decoration:none}.lg\:antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.lg\:subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.lg\:diagonal-fractions,.lg\:lining-nums,.lg\:oldstyle-nums,.lg\:ordinal,.lg\:proportional-nums,.lg\:slashed-zero,.lg\:stacked-fractions,.lg\:tabular-nums{--font-variant-numeric-ordinal:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-slashed-zero:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-figure:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-spacing:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-fraction:var(--tailwind-empty, );/*!*//*!*/font-variant-numeric:var(--font-variant-numeric-ordinal) var(--font-variant-numeric-slashed-zero) var(--font-variant-numeric-figure) var(--font-variant-numeric-spacing) var(--font-variant-numeric-fraction)}.lg\:normal-nums{font-variant-numeric:normal}.lg\:ordinal{--font-variant-numeric-ordinal:ordinal}.lg\:slashed-zero{--font-variant-numeric-slashed-zero:slashed-zero}.lg\:lining-nums{--font-variant-numeric-figure:lining-nums}.lg\:oldstyle-nums{--font-variant-numeric-figure:oldstyle-nums}.lg\:proportional-nums{--font-variant-numeric-spacing:proportional-nums}.lg\:tabular-nums{--font-variant-numeric-spacing:tabular-nums}.lg\:diagonal-fractions{--font-variant-numeric-fraction:diagonal-fractions}.lg\:stacked-fractions{--font-variant-numeric-fraction:stacked-fractions}.lg\:tracking-tighter{letter-spacing:-.05em}.lg\:tracking-tight{letter-spacing:-.025em}.lg\:tracking-normal{letter-spacing:0}.lg\:tracking-wide{letter-spacing:.025em}.lg\:tracking-wider{letter-spacing:.05em}.lg\:tracking-widest{letter-spacing:.1em}.lg\:select-none{-webkit-user-select:none;-ms-user-select:none;user-select:none}.lg\:select-text{-webkit-user-select:text;-ms-user-select:text;user-select:text}.lg\:select-all{-webkit-user-select:all;-ms-user-select:all;user-select:all}.lg\:select-auto{-webkit-user-select:auto;-ms-user-select:auto;user-select:auto}.lg\:align-baseline{vertical-align:baseline}.lg\:align-top{vertical-align:top}.lg\:align-middle{vertical-align:middle}.lg\:align-bottom{vertical-align:bottom}.lg\:align-text-top{vertical-align:text-top}.lg\:align-text-bottom{vertical-align:text-bottom}.lg\:visible{visibility:visible}.lg\:invisible{visibility:hidden}.lg\:whitespace-normal{white-space:normal}.lg\:whitespace-no-wrap{white-space:nowrap}.lg\:whitespace-pre{white-space:pre}.lg\:whitespace-pre-line{white-space:pre-line}.lg\:whitespace-pre-wrap{white-space:pre-wrap}.lg\:break-normal{word-wrap:normal;overflow-wrap:normal;word-break:normal}.lg\:break-words{word-wrap:break-word;overflow-wrap:break-word}.lg\:break-all{word-break:break-all}.lg\:truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.lg\:w-0{width:0}.lg\:w-1{width:.25rem}.lg\:w-2{width:.5rem}.lg\:w-3{width:.75rem}.lg\:w-4{width:1rem}.lg\:w-5{width:1.25rem}.lg\:w-6{width:1.5rem}.lg\:w-8{width:2rem}.lg\:w-10{width:2.5rem}.lg\:w-12{width:3rem}.lg\:w-16{width:4rem}.lg\:w-20{width:5rem}.lg\:w-24{width:6rem}.lg\:w-32{width:8rem}.lg\:w-40{width:10rem}.lg\:w-48{width:12rem}.lg\:w-56{width:14rem}.lg\:w-64{width:16rem}.lg\:w-auto{width:auto}.lg\:w-px{width:1px}.lg\:w-1\/2{width:50%}.lg\:w-1\/3{width:33.333333%}.lg\:w-2\/3{width:66.666667%}.lg\:w-1\/4{width:25%}.lg\:w-2\/4{width:50%}.lg\:w-3\/4{width:75%}.lg\:w-1\/5{width:20%}.lg\:w-2\/5{width:40%}.lg\:w-3\/5{width:60%}.lg\:w-4\/5{width:80%}.lg\:w-1\/6{width:16.666667%}.lg\:w-2\/6{width:33.333333%}.lg\:w-3\/6{width:50%}.lg\:w-4\/6{width:66.666667%}.lg\:w-5\/6{width:83.333333%}.lg\:w-1\/12{width:8.333333%}.lg\:w-2\/12{width:16.666667%}.lg\:w-3\/12{width:25%}.lg\:w-4\/12{width:33.333333%}.lg\:w-5\/12{width:41.666667%}.lg\:w-6\/12{width:50%}.lg\:w-7\/12{width:58.333333%}.lg\:w-8\/12{width:66.666667%}.lg\:w-9\/12{width:75%}.lg\:w-10\/12{width:83.333333%}.lg\:w-11\/12{width:91.666667%}.lg\:w-full{width:100%}.lg\:w-screen{width:100vw}.lg\:z-0{z-index:0}.lg\:z-10{z-index:10}.lg\:z-20{z-index:20}.lg\:z-30{z-index:30}.lg\:z-40{z-index:40}.lg\:z-50{z-index:50}.lg\:z-auto{z-index:auto}.lg\:gap-0{grid-gap:0;gap:0}.lg\:gap-1{grid-gap:.25rem;gap:.25rem}.lg\:gap-2{grid-gap:.5rem;gap:.5rem}.lg\:gap-3{grid-gap:.75rem;gap:.75rem}.lg\:gap-4{grid-gap:1rem;gap:1rem}.lg\:gap-5{grid-gap:1.25rem;gap:1.25rem}.lg\:gap-6{grid-gap:1.5rem;gap:1.5rem}.lg\:gap-8{grid-gap:2rem;gap:2rem}.lg\:gap-10{grid-gap:2.5rem;gap:2.5rem}.lg\:gap-12{grid-gap:3rem;gap:3rem}.lg\:gap-16{grid-gap:4rem;gap:4rem}.lg\:gap-20{grid-gap:5rem;gap:5rem}.lg\:gap-24{grid-gap:6rem;gap:6rem}.lg\:gap-32{grid-gap:8rem;gap:8rem}.lg\:gap-40{grid-gap:10rem;gap:10rem}.lg\:gap-48{grid-gap:12rem;gap:12rem}.lg\:gap-56{grid-gap:14rem;gap:14rem}.lg\:gap-64{grid-gap:16rem;gap:16rem}.lg\:gap-px{grid-gap:1px;gap:1px}.lg\:col-gap-0{grid-column-gap:0;column-gap:0}.lg\:col-gap-1{grid-column-gap:.25rem;column-gap:.25rem}.lg\:col-gap-2{grid-column-gap:.5rem;column-gap:.5rem}.lg\:col-gap-3{grid-column-gap:.75rem;column-gap:.75rem}.lg\:col-gap-4{grid-column-gap:1rem;column-gap:1rem}.lg\:col-gap-5{grid-column-gap:1.25rem;column-gap:1.25rem}.lg\:col-gap-6{grid-column-gap:1.5rem;column-gap:1.5rem}.lg\:col-gap-8{grid-column-gap:2rem;column-gap:2rem}.lg\:col-gap-10{grid-column-gap:2.5rem;column-gap:2.5rem}.lg\:col-gap-12{grid-column-gap:3rem;column-gap:3rem}.lg\:col-gap-16{grid-column-gap:4rem;column-gap:4rem}.lg\:col-gap-20{grid-column-gap:5rem;column-gap:5rem}.lg\:col-gap-24{grid-column-gap:6rem;column-gap:6rem}.lg\:col-gap-32{grid-column-gap:8rem;column-gap:8rem}.lg\:col-gap-40{grid-column-gap:10rem;column-gap:10rem}.lg\:col-gap-48{grid-column-gap:12rem;column-gap:12rem}.lg\:col-gap-56{grid-column-gap:14rem;column-gap:14rem}.lg\:col-gap-64{grid-column-gap:16rem;column-gap:16rem}.lg\:col-gap-px{grid-column-gap:1px;column-gap:1px}.lg\:gap-x-0{grid-column-gap:0;column-gap:0}.lg\:gap-x-1{grid-column-gap:.25rem;column-gap:.25rem}.lg\:gap-x-2{grid-column-gap:.5rem;column-gap:.5rem}.lg\:gap-x-3{grid-column-gap:.75rem;column-gap:.75rem}.lg\:gap-x-4{grid-column-gap:1rem;column-gap:1rem}.lg\:gap-x-5{grid-column-gap:1.25rem;column-gap:1.25rem}.lg\:gap-x-6{grid-column-gap:1.5rem;column-gap:1.5rem}.lg\:gap-x-8{grid-column-gap:2rem;column-gap:2rem}.lg\:gap-x-10{grid-column-gap:2.5rem;column-gap:2.5rem}.lg\:gap-x-12{grid-column-gap:3rem;column-gap:3rem}.lg\:gap-x-16{grid-column-gap:4rem;column-gap:4rem}.lg\:gap-x-20{grid-column-gap:5rem;column-gap:5rem}.lg\:gap-x-24{grid-column-gap:6rem;column-gap:6rem}.lg\:gap-x-32{grid-column-gap:8rem;column-gap:8rem}.lg\:gap-x-40{grid-column-gap:10rem;column-gap:10rem}.lg\:gap-x-48{grid-column-gap:12rem;column-gap:12rem}.lg\:gap-x-56{grid-column-gap:14rem;column-gap:14rem}.lg\:gap-x-64{grid-column-gap:16rem;column-gap:16rem}.lg\:gap-x-px{grid-column-gap:1px;column-gap:1px}.lg\:row-gap-0{grid-row-gap:0;row-gap:0}.lg\:row-gap-1{grid-row-gap:.25rem;row-gap:.25rem}.lg\:row-gap-2{grid-row-gap:.5rem;row-gap:.5rem}.lg\:row-gap-3{grid-row-gap:.75rem;row-gap:.75rem}.lg\:row-gap-4{grid-row-gap:1rem;row-gap:1rem}.lg\:row-gap-5{grid-row-gap:1.25rem;row-gap:1.25rem}.lg\:row-gap-6{grid-row-gap:1.5rem;row-gap:1.5rem}.lg\:row-gap-8{grid-row-gap:2rem;row-gap:2rem}.lg\:row-gap-10{grid-row-gap:2.5rem;row-gap:2.5rem}.lg\:row-gap-12{grid-row-gap:3rem;row-gap:3rem}.lg\:row-gap-16{grid-row-gap:4rem;row-gap:4rem}.lg\:row-gap-20{grid-row-gap:5rem;row-gap:5rem}.lg\:row-gap-24{grid-row-gap:6rem;row-gap:6rem}.lg\:row-gap-32{grid-row-gap:8rem;row-gap:8rem}.lg\:row-gap-40{grid-row-gap:10rem;row-gap:10rem}.lg\:row-gap-48{grid-row-gap:12rem;row-gap:12rem}.lg\:row-gap-56{grid-row-gap:14rem;row-gap:14rem}.lg\:row-gap-64{grid-row-gap:16rem;row-gap:16rem}.lg\:row-gap-px{grid-row-gap:1px;row-gap:1px}.lg\:gap-y-0{grid-row-gap:0;row-gap:0}.lg\:gap-y-1{grid-row-gap:.25rem;row-gap:.25rem}.lg\:gap-y-2{grid-row-gap:.5rem;row-gap:.5rem}.lg\:gap-y-3{grid-row-gap:.75rem;row-gap:.75rem}.lg\:gap-y-4{grid-row-gap:1rem;row-gap:1rem}.lg\:gap-y-5{grid-row-gap:1.25rem;row-gap:1.25rem}.lg\:gap-y-6{grid-row-gap:1.5rem;row-gap:1.5rem}.lg\:gap-y-8{grid-row-gap:2rem;row-gap:2rem}.lg\:gap-y-10{grid-row-gap:2.5rem;row-gap:2.5rem}.lg\:gap-y-12{grid-row-gap:3rem;row-gap:3rem}.lg\:gap-y-16{grid-row-gap:4rem;row-gap:4rem}.lg\:gap-y-20{grid-row-gap:5rem;row-gap:5rem}.lg\:gap-y-24{grid-row-gap:6rem;row-gap:6rem}.lg\:gap-y-32{grid-row-gap:8rem;row-gap:8rem}.lg\:gap-y-40{grid-row-gap:10rem;row-gap:10rem}.lg\:gap-y-48{grid-row-gap:12rem;row-gap:12rem}.lg\:gap-y-56{grid-row-gap:14rem;row-gap:14rem}.lg\:gap-y-64{grid-row-gap:16rem;row-gap:16rem}.lg\:gap-y-px{grid-row-gap:1px;row-gap:1px}.lg\:grid-flow-row{grid-auto-flow:row}.lg\:grid-flow-col{grid-auto-flow:column}.lg\:grid-flow-row-dense{grid-auto-flow:row dense}.lg\:grid-flow-col-dense{grid-auto-flow:column dense}.lg\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.lg\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.lg\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.lg\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lg\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-none{grid-template-columns:none}.lg\:auto-cols-auto{grid-auto-columns:auto}.lg\:auto-cols-min{grid-auto-columns:-webkit-min-content;grid-auto-columns:min-content}.lg\:auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.lg\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.lg\:col-auto{grid-column:auto}.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-5{grid-column:span 5/span 5}.lg\:col-span-6{grid-column:span 6/span 6}.lg\:col-span-7{grid-column:span 7/span 7}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:col-span-9{grid-column:span 9/span 9}.lg\:col-span-10{grid-column:span 10/span 10}.lg\:col-span-11{grid-column:span 11/span 11}.lg\:col-span-12{grid-column:span 12/span 12}.lg\:col-span-full{grid-column:1/-1}.lg\:col-start-1{grid-column-start:1}.lg\:col-start-2{grid-column-start:2}.lg\:col-start-3{grid-column-start:3}.lg\:col-start-4{grid-column-start:4}.lg\:col-start-5{grid-column-start:5}.lg\:col-start-6{grid-column-start:6}.lg\:col-start-7{grid-column-start:7}.lg\:col-start-8{grid-column-start:8}.lg\:col-start-9{grid-column-start:9}.lg\:col-start-10{grid-column-start:10}.lg\:col-start-11{grid-column-start:11}.lg\:col-start-12{grid-column-start:12}.lg\:col-start-13{grid-column-start:13}.lg\:col-start-auto{grid-column-start:auto}.lg\:col-end-1{grid-column-end:1}.lg\:col-end-2{grid-column-end:2}.lg\:col-end-3{grid-column-end:3}.lg\:col-end-4{grid-column-end:4}.lg\:col-end-5{grid-column-end:5}.lg\:col-end-6{grid-column-end:6}.lg\:col-end-7{grid-column-end:7}.lg\:col-end-8{grid-column-end:8}.lg\:col-end-9{grid-column-end:9}.lg\:col-end-10{grid-column-end:10}.lg\:col-end-11{grid-column-end:11}.lg\:col-end-12{grid-column-end:12}.lg\:col-end-13{grid-column-end:13}.lg\:col-end-auto{grid-column-end:auto}.lg\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.lg\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.lg\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.lg\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.lg\:grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.lg\:grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.lg\:grid-rows-none{grid-template-rows:none}.lg\:auto-rows-auto{grid-auto-rows:auto}.lg\:auto-rows-min{grid-auto-rows:-webkit-min-content;grid-auto-rows:min-content}.lg\:auto-rows-max{grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}.lg\:auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.lg\:row-auto{grid-row:auto}.lg\:row-span-1{grid-row:span 1/span 1}.lg\:row-span-2{grid-row:span 2/span 2}.lg\:row-span-3{grid-row:span 3/span 3}.lg\:row-span-4{grid-row:span 4/span 4}.lg\:row-span-5{grid-row:span 5/span 5}.lg\:row-span-6{grid-row:span 6/span 6}.lg\:row-span-full{grid-row:1/-1}.lg\:row-start-1{grid-row-start:1}.lg\:row-start-2{grid-row-start:2}.lg\:row-start-3{grid-row-start:3}.lg\:row-start-4{grid-row-start:4}.lg\:row-start-5{grid-row-start:5}.lg\:row-start-6{grid-row-start:6}.lg\:row-start-7{grid-row-start:7}.lg\:row-start-auto{grid-row-start:auto}.lg\:row-end-1{grid-row-end:1}.lg\:row-end-2{grid-row-end:2}.lg\:row-end-3{grid-row-end:3}.lg\:row-end-4{grid-row-end:4}.lg\:row-end-5{grid-row-end:5}.lg\:row-end-6{grid-row-end:6}.lg\:row-end-7{grid-row-end:7}.lg\:row-end-auto{grid-row-end:auto}.lg\:transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.lg\:transform-none{transform:none}.lg\:origin-center{transform-origin:center}.lg\:origin-top{transform-origin:top}.lg\:origin-top-right{transform-origin:top right}.lg\:origin-right{transform-origin:right}.lg\:origin-bottom-right{transform-origin:bottom right}.lg\:origin-bottom{transform-origin:bottom}.lg\:origin-bottom-left{transform-origin:bottom left}.lg\:origin-left{transform-origin:left}.lg\:origin-top-left{transform-origin:top left}.lg\:scale-0{--transform-scale-x:0;--transform-scale-y:0}.lg\:scale-50{--transform-scale-x:.5;--transform-scale-y:.5}.lg\:scale-75{--transform-scale-x:.75;--transform-scale-y:.75}.lg\:scale-90{--transform-scale-x:.9;--transform-scale-y:.9}.lg\:scale-95{--transform-scale-x:.95;--transform-scale-y:.95}.lg\:scale-100{--transform-scale-x:1;--transform-scale-y:1}.lg\:scale-105{--transform-scale-x:1.05;--transform-scale-y:1.05}.lg\:scale-110{--transform-scale-x:1.1;--transform-scale-y:1.1}.lg\:scale-125{--transform-scale-x:1.25;--transform-scale-y:1.25}.lg\:scale-150{--transform-scale-x:1.5;--transform-scale-y:1.5}.lg\:scale-x-0{--transform-scale-x:0}.lg\:scale-x-50{--transform-scale-x:.5}.lg\:scale-x-75{--transform-scale-x:.75}.lg\:scale-x-90{--transform-scale-x:.9}.lg\:scale-x-95{--transform-scale-x:.95}.lg\:scale-x-100{--transform-scale-x:1}.lg\:scale-x-105{--transform-scale-x:1.05}.lg\:scale-x-110{--transform-scale-x:1.1}.lg\:scale-x-125{--transform-scale-x:1.25}.lg\:scale-x-150{--transform-scale-x:1.5}.lg\:scale-y-0{--transform-scale-y:0}.lg\:scale-y-50{--transform-scale-y:.5}.lg\:scale-y-75{--transform-scale-y:.75}.lg\:scale-y-90{--transform-scale-y:.9}.lg\:scale-y-95{--transform-scale-y:.95}.lg\:scale-y-100{--transform-scale-y:1}.lg\:scale-y-105{--transform-scale-y:1.05}.lg\:scale-y-110{--transform-scale-y:1.1}.lg\:scale-y-125{--transform-scale-y:1.25}.lg\:scale-y-150{--transform-scale-y:1.5}.lg\:hover\:scale-0:hover{--transform-scale-x:0;--transform-scale-y:0}.lg\:hover\:scale-50:hover{--transform-scale-x:.5;--transform-scale-y:.5}.lg\:hover\:scale-75:hover{--transform-scale-x:.75;--transform-scale-y:.75}.lg\:hover\:scale-90:hover{--transform-scale-x:.9;--transform-scale-y:.9}.lg\:hover\:scale-95:hover{--transform-scale-x:.95;--transform-scale-y:.95}.lg\:hover\:scale-100:hover{--transform-scale-x:1;--transform-scale-y:1}.lg\:hover\:scale-105:hover{--transform-scale-x:1.05;--transform-scale-y:1.05}.lg\:hover\:scale-110:hover{--transform-scale-x:1.1;--transform-scale-y:1.1}.lg\:hover\:scale-125:hover{--transform-scale-x:1.25;--transform-scale-y:1.25}.lg\:hover\:scale-150:hover{--transform-scale-x:1.5;--transform-scale-y:1.5}.lg\:hover\:scale-x-0:hover{--transform-scale-x:0}.lg\:hover\:scale-x-50:hover{--transform-scale-x:.5}.lg\:hover\:scale-x-75:hover{--transform-scale-x:.75}.lg\:hover\:scale-x-90:hover{--transform-scale-x:.9}.lg\:hover\:scale-x-95:hover{--transform-scale-x:.95}.lg\:hover\:scale-x-100:hover{--transform-scale-x:1}.lg\:hover\:scale-x-105:hover{--transform-scale-x:1.05}.lg\:hover\:scale-x-110:hover{--transform-scale-x:1.1}.lg\:hover\:scale-x-125:hover{--transform-scale-x:1.25}.lg\:hover\:scale-x-150:hover{--transform-scale-x:1.5}.lg\:hover\:scale-y-0:hover{--transform-scale-y:0}.lg\:hover\:scale-y-50:hover{--transform-scale-y:.5}.lg\:hover\:scale-y-75:hover{--transform-scale-y:.75}.lg\:hover\:scale-y-90:hover{--transform-scale-y:.9}.lg\:hover\:scale-y-95:hover{--transform-scale-y:.95}.lg\:hover\:scale-y-100:hover{--transform-scale-y:1}.lg\:hover\:scale-y-105:hover{--transform-scale-y:1.05}.lg\:hover\:scale-y-110:hover{--transform-scale-y:1.1}.lg\:hover\:scale-y-125:hover{--transform-scale-y:1.25}.lg\:hover\:scale-y-150:hover{--transform-scale-y:1.5}.lg\:focus\:scale-0:focus{--transform-scale-x:0;--transform-scale-y:0}.lg\:focus\:scale-50:focus{--transform-scale-x:.5;--transform-scale-y:.5}.lg\:focus\:scale-75:focus{--transform-scale-x:.75;--transform-scale-y:.75}.lg\:focus\:scale-90:focus{--transform-scale-x:.9;--transform-scale-y:.9}.lg\:focus\:scale-95:focus{--transform-scale-x:.95;--transform-scale-y:.95}.lg\:focus\:scale-100:focus{--transform-scale-x:1;--transform-scale-y:1}.lg\:focus\:scale-105:focus{--transform-scale-x:1.05;--transform-scale-y:1.05}.lg\:focus\:scale-110:focus{--transform-scale-x:1.1;--transform-scale-y:1.1}.lg\:focus\:scale-125:focus{--transform-scale-x:1.25;--transform-scale-y:1.25}.lg\:focus\:scale-150:focus{--transform-scale-x:1.5;--transform-scale-y:1.5}.lg\:focus\:scale-x-0:focus{--transform-scale-x:0}.lg\:focus\:scale-x-50:focus{--transform-scale-x:.5}.lg\:focus\:scale-x-75:focus{--transform-scale-x:.75}.lg\:focus\:scale-x-90:focus{--transform-scale-x:.9}.lg\:focus\:scale-x-95:focus{--transform-scale-x:.95}.lg\:focus\:scale-x-100:focus{--transform-scale-x:1}.lg\:focus\:scale-x-105:focus{--transform-scale-x:1.05}.lg\:focus\:scale-x-110:focus{--transform-scale-x:1.1}.lg\:focus\:scale-x-125:focus{--transform-scale-x:1.25}.lg\:focus\:scale-x-150:focus{--transform-scale-x:1.5}.lg\:focus\:scale-y-0:focus{--transform-scale-y:0}.lg\:focus\:scale-y-50:focus{--transform-scale-y:.5}.lg\:focus\:scale-y-75:focus{--transform-scale-y:.75}.lg\:focus\:scale-y-90:focus{--transform-scale-y:.9}.lg\:focus\:scale-y-95:focus{--transform-scale-y:.95}.lg\:focus\:scale-y-100:focus{--transform-scale-y:1}.lg\:focus\:scale-y-105:focus{--transform-scale-y:1.05}.lg\:focus\:scale-y-110:focus{--transform-scale-y:1.1}.lg\:focus\:scale-y-125:focus{--transform-scale-y:1.25}.lg\:focus\:scale-y-150:focus{--transform-scale-y:1.5}.lg\:rotate-0{--transform-rotate:0}.lg\:rotate-1{--transform-rotate:1deg}.lg\:rotate-2{--transform-rotate:2deg}.lg\:rotate-3{--transform-rotate:3deg}.lg\:rotate-6{--transform-rotate:6deg}.lg\:rotate-12{--transform-rotate:12deg}.lg\:rotate-45{--transform-rotate:45deg}.lg\:rotate-90{--transform-rotate:90deg}.lg\:rotate-180{--transform-rotate:180deg}.lg\:-rotate-180{--transform-rotate:-180deg}.lg\:-rotate-90{--transform-rotate:-90deg}.lg\:-rotate-45{--transform-rotate:-45deg}.lg\:-rotate-12{--transform-rotate:-12deg}.lg\:-rotate-6{--transform-rotate:-6deg}.lg\:-rotate-3{--transform-rotate:-3deg}.lg\:-rotate-2{--transform-rotate:-2deg}.lg\:-rotate-1{--transform-rotate:-1deg}.lg\:hover\:rotate-0:hover{--transform-rotate:0}.lg\:hover\:rotate-1:hover{--transform-rotate:1deg}.lg\:hover\:rotate-2:hover{--transform-rotate:2deg}.lg\:hover\:rotate-3:hover{--transform-rotate:3deg}.lg\:hover\:rotate-6:hover{--transform-rotate:6deg}.lg\:hover\:rotate-12:hover{--transform-rotate:12deg}.lg\:hover\:rotate-45:hover{--transform-rotate:45deg}.lg\:hover\:rotate-90:hover{--transform-rotate:90deg}.lg\:hover\:rotate-180:hover{--transform-rotate:180deg}.lg\:hover\:-rotate-180:hover{--transform-rotate:-180deg}.lg\:hover\:-rotate-90:hover{--transform-rotate:-90deg}.lg\:hover\:-rotate-45:hover{--transform-rotate:-45deg}.lg\:hover\:-rotate-12:hover{--transform-rotate:-12deg}.lg\:hover\:-rotate-6:hover{--transform-rotate:-6deg}.lg\:hover\:-rotate-3:hover{--transform-rotate:-3deg}.lg\:hover\:-rotate-2:hover{--transform-rotate:-2deg}.lg\:hover\:-rotate-1:hover{--transform-rotate:-1deg}.lg\:focus\:rotate-0:focus{--transform-rotate:0}.lg\:focus\:rotate-1:focus{--transform-rotate:1deg}.lg\:focus\:rotate-2:focus{--transform-rotate:2deg}.lg\:focus\:rotate-3:focus{--transform-rotate:3deg}.lg\:focus\:rotate-6:focus{--transform-rotate:6deg}.lg\:focus\:rotate-12:focus{--transform-rotate:12deg}.lg\:focus\:rotate-45:focus{--transform-rotate:45deg}.lg\:focus\:rotate-90:focus{--transform-rotate:90deg}.lg\:focus\:rotate-180:focus{--transform-rotate:180deg}.lg\:focus\:-rotate-180:focus{--transform-rotate:-180deg}.lg\:focus\:-rotate-90:focus{--transform-rotate:-90deg}.lg\:focus\:-rotate-45:focus{--transform-rotate:-45deg}.lg\:focus\:-rotate-12:focus{--transform-rotate:-12deg}.lg\:focus\:-rotate-6:focus{--transform-rotate:-6deg}.lg\:focus\:-rotate-3:focus{--transform-rotate:-3deg}.lg\:focus\:-rotate-2:focus{--transform-rotate:-2deg}.lg\:focus\:-rotate-1:focus{--transform-rotate:-1deg}.lg\:translate-x-0{--transform-translate-x:0}.lg\:translate-x-1{--transform-translate-x:0.25rem}.lg\:translate-x-2{--transform-translate-x:0.5rem}.lg\:translate-x-3{--transform-translate-x:0.75rem}.lg\:translate-x-4{--transform-translate-x:1rem}.lg\:translate-x-5{--transform-translate-x:1.25rem}.lg\:translate-x-6{--transform-translate-x:1.5rem}.lg\:translate-x-8{--transform-translate-x:2rem}.lg\:translate-x-10{--transform-translate-x:2.5rem}.lg\:translate-x-12{--transform-translate-x:3rem}.lg\:translate-x-16{--transform-translate-x:4rem}.lg\:translate-x-20{--transform-translate-x:5rem}.lg\:translate-x-24{--transform-translate-x:6rem}.lg\:translate-x-32{--transform-translate-x:8rem}.lg\:translate-x-40{--transform-translate-x:10rem}.lg\:translate-x-48{--transform-translate-x:12rem}.lg\:translate-x-56{--transform-translate-x:14rem}.lg\:translate-x-64{--transform-translate-x:16rem}.lg\:translate-x-px{--transform-translate-x:1px}.lg\:-translate-x-1{--transform-translate-x:-0.25rem}.lg\:-translate-x-2{--transform-translate-x:-0.5rem}.lg\:-translate-x-3{--transform-translate-x:-0.75rem}.lg\:-translate-x-4{--transform-translate-x:-1rem}.lg\:-translate-x-5{--transform-translate-x:-1.25rem}.lg\:-translate-x-6{--transform-translate-x:-1.5rem}.lg\:-translate-x-8{--transform-translate-x:-2rem}.lg\:-translate-x-10{--transform-translate-x:-2.5rem}.lg\:-translate-x-12{--transform-translate-x:-3rem}.lg\:-translate-x-16{--transform-translate-x:-4rem}.lg\:-translate-x-20{--transform-translate-x:-5rem}.lg\:-translate-x-24{--transform-translate-x:-6rem}.lg\:-translate-x-32{--transform-translate-x:-8rem}.lg\:-translate-x-40{--transform-translate-x:-10rem}.lg\:-translate-x-48{--transform-translate-x:-12rem}.lg\:-translate-x-56{--transform-translate-x:-14rem}.lg\:-translate-x-64{--transform-translate-x:-16rem}.lg\:-translate-x-px{--transform-translate-x:-1px}.lg\:-translate-x-full{--transform-translate-x:-100%}.lg\:-translate-x-1\/2{--transform-translate-x:-50%}.lg\:translate-x-1\/2{--transform-translate-x:50%}.lg\:translate-x-full{--transform-translate-x:100%}.lg\:translate-y-0{--transform-translate-y:0}.lg\:translate-y-1{--transform-translate-y:0.25rem}.lg\:translate-y-2{--transform-translate-y:0.5rem}.lg\:translate-y-3{--transform-translate-y:0.75rem}.lg\:translate-y-4{--transform-translate-y:1rem}.lg\:translate-y-5{--transform-translate-y:1.25rem}.lg\:translate-y-6{--transform-translate-y:1.5rem}.lg\:translate-y-8{--transform-translate-y:2rem}.lg\:translate-y-10{--transform-translate-y:2.5rem}.lg\:translate-y-12{--transform-translate-y:3rem}.lg\:translate-y-16{--transform-translate-y:4rem}.lg\:translate-y-20{--transform-translate-y:5rem}.lg\:translate-y-24{--transform-translate-y:6rem}.lg\:translate-y-32{--transform-translate-y:8rem}.lg\:translate-y-40{--transform-translate-y:10rem}.lg\:translate-y-48{--transform-translate-y:12rem}.lg\:translate-y-56{--transform-translate-y:14rem}.lg\:translate-y-64{--transform-translate-y:16rem}.lg\:translate-y-px{--transform-translate-y:1px}.lg\:-translate-y-1{--transform-translate-y:-0.25rem}.lg\:-translate-y-2{--transform-translate-y:-0.5rem}.lg\:-translate-y-3{--transform-translate-y:-0.75rem}.lg\:-translate-y-4{--transform-translate-y:-1rem}.lg\:-translate-y-5{--transform-translate-y:-1.25rem}.lg\:-translate-y-6{--transform-translate-y:-1.5rem}.lg\:-translate-y-8{--transform-translate-y:-2rem}.lg\:-translate-y-10{--transform-translate-y:-2.5rem}.lg\:-translate-y-12{--transform-translate-y:-3rem}.lg\:-translate-y-16{--transform-translate-y:-4rem}.lg\:-translate-y-20{--transform-translate-y:-5rem}.lg\:-translate-y-24{--transform-translate-y:-6rem}.lg\:-translate-y-32{--transform-translate-y:-8rem}.lg\:-translate-y-40{--transform-translate-y:-10rem}.lg\:-translate-y-48{--transform-translate-y:-12rem}.lg\:-translate-y-56{--transform-translate-y:-14rem}.lg\:-translate-y-64{--transform-translate-y:-16rem}.lg\:-translate-y-px{--transform-translate-y:-1px}.lg\:-translate-y-full{--transform-translate-y:-100%}.lg\:-translate-y-1\/2{--transform-translate-y:-50%}.lg\:translate-y-1\/2{--transform-translate-y:50%}.lg\:translate-y-full{--transform-translate-y:100%}.lg\:hover\:translate-x-0:hover{--transform-translate-x:0}.lg\:hover\:translate-x-1:hover{--transform-translate-x:0.25rem}.lg\:hover\:translate-x-2:hover{--transform-translate-x:0.5rem}.lg\:hover\:translate-x-3:hover{--transform-translate-x:0.75rem}.lg\:hover\:translate-x-4:hover{--transform-translate-x:1rem}.lg\:hover\:translate-x-5:hover{--transform-translate-x:1.25rem}.lg\:hover\:translate-x-6:hover{--transform-translate-x:1.5rem}.lg\:hover\:translate-x-8:hover{--transform-translate-x:2rem}.lg\:hover\:translate-x-10:hover{--transform-translate-x:2.5rem}.lg\:hover\:translate-x-12:hover{--transform-translate-x:3rem}.lg\:hover\:translate-x-16:hover{--transform-translate-x:4rem}.lg\:hover\:translate-x-20:hover{--transform-translate-x:5rem}.lg\:hover\:translate-x-24:hover{--transform-translate-x:6rem}.lg\:hover\:translate-x-32:hover{--transform-translate-x:8rem}.lg\:hover\:translate-x-40:hover{--transform-translate-x:10rem}.lg\:hover\:translate-x-48:hover{--transform-translate-x:12rem}.lg\:hover\:translate-x-56:hover{--transform-translate-x:14rem}.lg\:hover\:translate-x-64:hover{--transform-translate-x:16rem}.lg\:hover\:translate-x-px:hover{--transform-translate-x:1px}.lg\:hover\:-translate-x-1:hover{--transform-translate-x:-0.25rem}.lg\:hover\:-translate-x-2:hover{--transform-translate-x:-0.5rem}.lg\:hover\:-translate-x-3:hover{--transform-translate-x:-0.75rem}.lg\:hover\:-translate-x-4:hover{--transform-translate-x:-1rem}.lg\:hover\:-translate-x-5:hover{--transform-translate-x:-1.25rem}.lg\:hover\:-translate-x-6:hover{--transform-translate-x:-1.5rem}.lg\:hover\:-translate-x-8:hover{--transform-translate-x:-2rem}.lg\:hover\:-translate-x-10:hover{--transform-translate-x:-2.5rem}.lg\:hover\:-translate-x-12:hover{--transform-translate-x:-3rem}.lg\:hover\:-translate-x-16:hover{--transform-translate-x:-4rem}.lg\:hover\:-translate-x-20:hover{--transform-translate-x:-5rem}.lg\:hover\:-translate-x-24:hover{--transform-translate-x:-6rem}.lg\:hover\:-translate-x-32:hover{--transform-translate-x:-8rem}.lg\:hover\:-translate-x-40:hover{--transform-translate-x:-10rem}.lg\:hover\:-translate-x-48:hover{--transform-translate-x:-12rem}.lg\:hover\:-translate-x-56:hover{--transform-translate-x:-14rem}.lg\:hover\:-translate-x-64:hover{--transform-translate-x:-16rem}.lg\:hover\:-translate-x-px:hover{--transform-translate-x:-1px}.lg\:hover\:-translate-x-full:hover{--transform-translate-x:-100%}.lg\:hover\:-translate-x-1\/2:hover{--transform-translate-x:-50%}.lg\:hover\:translate-x-1\/2:hover{--transform-translate-x:50%}.lg\:hover\:translate-x-full:hover{--transform-translate-x:100%}.lg\:hover\:translate-y-0:hover{--transform-translate-y:0}.lg\:hover\:translate-y-1:hover{--transform-translate-y:0.25rem}.lg\:hover\:translate-y-2:hover{--transform-translate-y:0.5rem}.lg\:hover\:translate-y-3:hover{--transform-translate-y:0.75rem}.lg\:hover\:translate-y-4:hover{--transform-translate-y:1rem}.lg\:hover\:translate-y-5:hover{--transform-translate-y:1.25rem}.lg\:hover\:translate-y-6:hover{--transform-translate-y:1.5rem}.lg\:hover\:translate-y-8:hover{--transform-translate-y:2rem}.lg\:hover\:translate-y-10:hover{--transform-translate-y:2.5rem}.lg\:hover\:translate-y-12:hover{--transform-translate-y:3rem}.lg\:hover\:translate-y-16:hover{--transform-translate-y:4rem}.lg\:hover\:translate-y-20:hover{--transform-translate-y:5rem}.lg\:hover\:translate-y-24:hover{--transform-translate-y:6rem}.lg\:hover\:translate-y-32:hover{--transform-translate-y:8rem}.lg\:hover\:translate-y-40:hover{--transform-translate-y:10rem}.lg\:hover\:translate-y-48:hover{--transform-translate-y:12rem}.lg\:hover\:translate-y-56:hover{--transform-translate-y:14rem}.lg\:hover\:translate-y-64:hover{--transform-translate-y:16rem}.lg\:hover\:translate-y-px:hover{--transform-translate-y:1px}.lg\:hover\:-translate-y-1:hover{--transform-translate-y:-0.25rem}.lg\:hover\:-translate-y-2:hover{--transform-translate-y:-0.5rem}.lg\:hover\:-translate-y-3:hover{--transform-translate-y:-0.75rem}.lg\:hover\:-translate-y-4:hover{--transform-translate-y:-1rem}.lg\:hover\:-translate-y-5:hover{--transform-translate-y:-1.25rem}.lg\:hover\:-translate-y-6:hover{--transform-translate-y:-1.5rem}.lg\:hover\:-translate-y-8:hover{--transform-translate-y:-2rem}.lg\:hover\:-translate-y-10:hover{--transform-translate-y:-2.5rem}.lg\:hover\:-translate-y-12:hover{--transform-translate-y:-3rem}.lg\:hover\:-translate-y-16:hover{--transform-translate-y:-4rem}.lg\:hover\:-translate-y-20:hover{--transform-translate-y:-5rem}.lg\:hover\:-translate-y-24:hover{--transform-translate-y:-6rem}.lg\:hover\:-translate-y-32:hover{--transform-translate-y:-8rem}.lg\:hover\:-translate-y-40:hover{--transform-translate-y:-10rem}.lg\:hover\:-translate-y-48:hover{--transform-translate-y:-12rem}.lg\:hover\:-translate-y-56:hover{--transform-translate-y:-14rem}.lg\:hover\:-translate-y-64:hover{--transform-translate-y:-16rem}.lg\:hover\:-translate-y-px:hover{--transform-translate-y:-1px}.lg\:hover\:-translate-y-full:hover{--transform-translate-y:-100%}.lg\:hover\:-translate-y-1\/2:hover{--transform-translate-y:-50%}.lg\:hover\:translate-y-1\/2:hover{--transform-translate-y:50%}.lg\:hover\:translate-y-full:hover{--transform-translate-y:100%}.lg\:focus\:translate-x-0:focus{--transform-translate-x:0}.lg\:focus\:translate-x-1:focus{--transform-translate-x:0.25rem}.lg\:focus\:translate-x-2:focus{--transform-translate-x:0.5rem}.lg\:focus\:translate-x-3:focus{--transform-translate-x:0.75rem}.lg\:focus\:translate-x-4:focus{--transform-translate-x:1rem}.lg\:focus\:translate-x-5:focus{--transform-translate-x:1.25rem}.lg\:focus\:translate-x-6:focus{--transform-translate-x:1.5rem}.lg\:focus\:translate-x-8:focus{--transform-translate-x:2rem}.lg\:focus\:translate-x-10:focus{--transform-translate-x:2.5rem}.lg\:focus\:translate-x-12:focus{--transform-translate-x:3rem}.lg\:focus\:translate-x-16:focus{--transform-translate-x:4rem}.lg\:focus\:translate-x-20:focus{--transform-translate-x:5rem}.lg\:focus\:translate-x-24:focus{--transform-translate-x:6rem}.lg\:focus\:translate-x-32:focus{--transform-translate-x:8rem}.lg\:focus\:translate-x-40:focus{--transform-translate-x:10rem}.lg\:focus\:translate-x-48:focus{--transform-translate-x:12rem}.lg\:focus\:translate-x-56:focus{--transform-translate-x:14rem}.lg\:focus\:translate-x-64:focus{--transform-translate-x:16rem}.lg\:focus\:translate-x-px:focus{--transform-translate-x:1px}.lg\:focus\:-translate-x-1:focus{--transform-translate-x:-0.25rem}.lg\:focus\:-translate-x-2:focus{--transform-translate-x:-0.5rem}.lg\:focus\:-translate-x-3:focus{--transform-translate-x:-0.75rem}.lg\:focus\:-translate-x-4:focus{--transform-translate-x:-1rem}.lg\:focus\:-translate-x-5:focus{--transform-translate-x:-1.25rem}.lg\:focus\:-translate-x-6:focus{--transform-translate-x:-1.5rem}.lg\:focus\:-translate-x-8:focus{--transform-translate-x:-2rem}.lg\:focus\:-translate-x-10:focus{--transform-translate-x:-2.5rem}.lg\:focus\:-translate-x-12:focus{--transform-translate-x:-3rem}.lg\:focus\:-translate-x-16:focus{--transform-translate-x:-4rem}.lg\:focus\:-translate-x-20:focus{--transform-translate-x:-5rem}.lg\:focus\:-translate-x-24:focus{--transform-translate-x:-6rem}.lg\:focus\:-translate-x-32:focus{--transform-translate-x:-8rem}.lg\:focus\:-translate-x-40:focus{--transform-translate-x:-10rem}.lg\:focus\:-translate-x-48:focus{--transform-translate-x:-12rem}.lg\:focus\:-translate-x-56:focus{--transform-translate-x:-14rem}.lg\:focus\:-translate-x-64:focus{--transform-translate-x:-16rem}.lg\:focus\:-translate-x-px:focus{--transform-translate-x:-1px}.lg\:focus\:-translate-x-full:focus{--transform-translate-x:-100%}.lg\:focus\:-translate-x-1\/2:focus{--transform-translate-x:-50%}.lg\:focus\:translate-x-1\/2:focus{--transform-translate-x:50%}.lg\:focus\:translate-x-full:focus{--transform-translate-x:100%}.lg\:focus\:translate-y-0:focus{--transform-translate-y:0}.lg\:focus\:translate-y-1:focus{--transform-translate-y:0.25rem}.lg\:focus\:translate-y-2:focus{--transform-translate-y:0.5rem}.lg\:focus\:translate-y-3:focus{--transform-translate-y:0.75rem}.lg\:focus\:translate-y-4:focus{--transform-translate-y:1rem}.lg\:focus\:translate-y-5:focus{--transform-translate-y:1.25rem}.lg\:focus\:translate-y-6:focus{--transform-translate-y:1.5rem}.lg\:focus\:translate-y-8:focus{--transform-translate-y:2rem}.lg\:focus\:translate-y-10:focus{--transform-translate-y:2.5rem}.lg\:focus\:translate-y-12:focus{--transform-translate-y:3rem}.lg\:focus\:translate-y-16:focus{--transform-translate-y:4rem}.lg\:focus\:translate-y-20:focus{--transform-translate-y:5rem}.lg\:focus\:translate-y-24:focus{--transform-translate-y:6rem}.lg\:focus\:translate-y-32:focus{--transform-translate-y:8rem}.lg\:focus\:translate-y-40:focus{--transform-translate-y:10rem}.lg\:focus\:translate-y-48:focus{--transform-translate-y:12rem}.lg\:focus\:translate-y-56:focus{--transform-translate-y:14rem}.lg\:focus\:translate-y-64:focus{--transform-translate-y:16rem}.lg\:focus\:translate-y-px:focus{--transform-translate-y:1px}.lg\:focus\:-translate-y-1:focus{--transform-translate-y:-0.25rem}.lg\:focus\:-translate-y-2:focus{--transform-translate-y:-0.5rem}.lg\:focus\:-translate-y-3:focus{--transform-translate-y:-0.75rem}.lg\:focus\:-translate-y-4:focus{--transform-translate-y:-1rem}.lg\:focus\:-translate-y-5:focus{--transform-translate-y:-1.25rem}.lg\:focus\:-translate-y-6:focus{--transform-translate-y:-1.5rem}.lg\:focus\:-translate-y-8:focus{--transform-translate-y:-2rem}.lg\:focus\:-translate-y-10:focus{--transform-translate-y:-2.5rem}.lg\:focus\:-translate-y-12:focus{--transform-translate-y:-3rem}.lg\:focus\:-translate-y-16:focus{--transform-translate-y:-4rem}.lg\:focus\:-translate-y-20:focus{--transform-translate-y:-5rem}.lg\:focus\:-translate-y-24:focus{--transform-translate-y:-6rem}.lg\:focus\:-translate-y-32:focus{--transform-translate-y:-8rem}.lg\:focus\:-translate-y-40:focus{--transform-translate-y:-10rem}.lg\:focus\:-translate-y-48:focus{--transform-translate-y:-12rem}.lg\:focus\:-translate-y-56:focus{--transform-translate-y:-14rem}.lg\:focus\:-translate-y-64:focus{--transform-translate-y:-16rem}.lg\:focus\:-translate-y-px:focus{--transform-translate-y:-1px}.lg\:focus\:-translate-y-full:focus{--transform-translate-y:-100%}.lg\:focus\:-translate-y-1\/2:focus{--transform-translate-y:-50%}.lg\:focus\:translate-y-1\/2:focus{--transform-translate-y:50%}.lg\:focus\:translate-y-full:focus{--transform-translate-y:100%}.lg\:skew-x-0{--transform-skew-x:0}.lg\:skew-x-1{--transform-skew-x:1deg}.lg\:skew-x-2{--transform-skew-x:2deg}.lg\:skew-x-3{--transform-skew-x:3deg}.lg\:skew-x-6{--transform-skew-x:6deg}.lg\:skew-x-12{--transform-skew-x:12deg}.lg\:-skew-x-12{--transform-skew-x:-12deg}.lg\:-skew-x-6{--transform-skew-x:-6deg}.lg\:-skew-x-3{--transform-skew-x:-3deg}.lg\:-skew-x-2{--transform-skew-x:-2deg}.lg\:-skew-x-1{--transform-skew-x:-1deg}.lg\:skew-y-0{--transform-skew-y:0}.lg\:skew-y-1{--transform-skew-y:1deg}.lg\:skew-y-2{--transform-skew-y:2deg}.lg\:skew-y-3{--transform-skew-y:3deg}.lg\:skew-y-6{--transform-skew-y:6deg}.lg\:skew-y-12{--transform-skew-y:12deg}.lg\:-skew-y-12{--transform-skew-y:-12deg}.lg\:-skew-y-6{--transform-skew-y:-6deg}.lg\:-skew-y-3{--transform-skew-y:-3deg}.lg\:-skew-y-2{--transform-skew-y:-2deg}.lg\:-skew-y-1{--transform-skew-y:-1deg}.lg\:hover\:skew-x-0:hover{--transform-skew-x:0}.lg\:hover\:skew-x-1:hover{--transform-skew-x:1deg}.lg\:hover\:skew-x-2:hover{--transform-skew-x:2deg}.lg\:hover\:skew-x-3:hover{--transform-skew-x:3deg}.lg\:hover\:skew-x-6:hover{--transform-skew-x:6deg}.lg\:hover\:skew-x-12:hover{--transform-skew-x:12deg}.lg\:hover\:-skew-x-12:hover{--transform-skew-x:-12deg}.lg\:hover\:-skew-x-6:hover{--transform-skew-x:-6deg}.lg\:hover\:-skew-x-3:hover{--transform-skew-x:-3deg}.lg\:hover\:-skew-x-2:hover{--transform-skew-x:-2deg}.lg\:hover\:-skew-x-1:hover{--transform-skew-x:-1deg}.lg\:hover\:skew-y-0:hover{--transform-skew-y:0}.lg\:hover\:skew-y-1:hover{--transform-skew-y:1deg}.lg\:hover\:skew-y-2:hover{--transform-skew-y:2deg}.lg\:hover\:skew-y-3:hover{--transform-skew-y:3deg}.lg\:hover\:skew-y-6:hover{--transform-skew-y:6deg}.lg\:hover\:skew-y-12:hover{--transform-skew-y:12deg}.lg\:hover\:-skew-y-12:hover{--transform-skew-y:-12deg}.lg\:hover\:-skew-y-6:hover{--transform-skew-y:-6deg}.lg\:hover\:-skew-y-3:hover{--transform-skew-y:-3deg}.lg\:hover\:-skew-y-2:hover{--transform-skew-y:-2deg}.lg\:hover\:-skew-y-1:hover{--transform-skew-y:-1deg}.lg\:focus\:skew-x-0:focus{--transform-skew-x:0}.lg\:focus\:skew-x-1:focus{--transform-skew-x:1deg}.lg\:focus\:skew-x-2:focus{--transform-skew-x:2deg}.lg\:focus\:skew-x-3:focus{--transform-skew-x:3deg}.lg\:focus\:skew-x-6:focus{--transform-skew-x:6deg}.lg\:focus\:skew-x-12:focus{--transform-skew-x:12deg}.lg\:focus\:-skew-x-12:focus{--transform-skew-x:-12deg}.lg\:focus\:-skew-x-6:focus{--transform-skew-x:-6deg}.lg\:focus\:-skew-x-3:focus{--transform-skew-x:-3deg}.lg\:focus\:-skew-x-2:focus{--transform-skew-x:-2deg}.lg\:focus\:-skew-x-1:focus{--transform-skew-x:-1deg}.lg\:focus\:skew-y-0:focus{--transform-skew-y:0}.lg\:focus\:skew-y-1:focus{--transform-skew-y:1deg}.lg\:focus\:skew-y-2:focus{--transform-skew-y:2deg}.lg\:focus\:skew-y-3:focus{--transform-skew-y:3deg}.lg\:focus\:skew-y-6:focus{--transform-skew-y:6deg}.lg\:focus\:skew-y-12:focus{--transform-skew-y:12deg}.lg\:focus\:-skew-y-12:focus{--transform-skew-y:-12deg}.lg\:focus\:-skew-y-6:focus{--transform-skew-y:-6deg}.lg\:focus\:-skew-y-3:focus{--transform-skew-y:-3deg}.lg\:focus\:-skew-y-2:focus{--transform-skew-y:-2deg}.lg\:focus\:-skew-y-1:focus{--transform-skew-y:-1deg}.lg\:transition-none{transition-property:none}.lg\:transition-all{transition-property:all}.lg\:transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform}.lg\:transition-colors{transition-property:background-color,border-color,color,fill,stroke}.lg\:transition-opacity{transition-property:opacity}.lg\:transition-shadow{transition-property:box-shadow}.lg\:transition-transform{transition-property:transform}.lg\:ease-linear{transition-timing-function:linear}.lg\:ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.lg\:ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.lg\:ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.lg\:duration-75{transition-duration:75ms}.lg\:duration-100{transition-duration:.1s}.lg\:duration-150{transition-duration:150ms}.lg\:duration-200{transition-duration:.2s}.lg\:duration-300{transition-duration:.3s}.lg\:duration-500{transition-duration:.5s}.lg\:duration-700{transition-duration:.7s}.lg\:duration-1000{transition-duration:1s}.lg\:delay-75{transition-delay:75ms}.lg\:delay-100{transition-delay:.1s}.lg\:delay-150{transition-delay:150ms}.lg\:delay-200{transition-delay:.2s}.lg\:delay-300{transition-delay:.3s}.lg\:delay-500{transition-delay:.5s}.lg\:delay-700{transition-delay:.7s}.lg\:delay-1000{transition-delay:1s}.lg\:animate-none{animation:none}.lg\:animate-spin{animation:spin 1s linear infinite}.lg\:animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.lg\:animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.lg\:animate-bounce{animation:bounce 1s infinite}}@media (min-width:1280px){.xl\:container{width:100%}@media (min-width:640px){.xl\:container{max-width:640px}}@media (min-width:768px){.xl\:container{max-width:768px}}@media (min-width:1024px){.xl\:container{max-width:1024px}}@media (min-width:1280px){.xl\:container{max-width:1280px}}.xl\:space-y-0>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(0px * var(--space-y-reverse))}.xl\:space-x-0>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(0px * var(--space-x-reverse));margin-left:calc(0px * calc(1 - var(--space-x-reverse)))}.xl\:space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.25rem * var(--space-y-reverse))}.xl\:space-x-1>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.25rem * var(--space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.5rem * var(--space-y-reverse))}.xl\:space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.5rem * var(--space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.75rem * var(--space-y-reverse))}.xl\:space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.75rem * var(--space-x-reverse));margin-left:calc(.75rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1rem * var(--space-y-reverse))}.xl\:space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1rem * var(--space-x-reverse));margin-left:calc(1rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1.25rem * var(--space-y-reverse))}.xl\:space-x-5>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1.25rem * var(--space-x-reverse));margin-left:calc(1.25rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-6>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1.5rem * var(--space-y-reverse))}.xl\:space-x-6>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1.5rem * var(--space-x-reverse));margin-left:calc(1.5rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-8>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(2rem * var(--space-y-reverse))}.xl\:space-x-8>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(2rem * var(--space-x-reverse));margin-left:calc(2rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(2.5rem * var(--space-y-reverse))}.xl\:space-x-10>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(2.5rem * var(--space-x-reverse));margin-left:calc(2.5rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-12>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(3rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(3rem * var(--space-y-reverse))}.xl\:space-x-12>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(3rem * var(--space-x-reverse));margin-left:calc(3rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-16>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(4rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(4rem * var(--space-y-reverse))}.xl\:space-x-16>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(4rem * var(--space-x-reverse));margin-left:calc(4rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-20>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(5rem * var(--space-y-reverse))}.xl\:space-x-20>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(5rem * var(--space-x-reverse));margin-left:calc(5rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-24>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(6rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(6rem * var(--space-y-reverse))}.xl\:space-x-24>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(6rem * var(--space-x-reverse));margin-left:calc(6rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-32>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(8rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(8rem * var(--space-y-reverse))}.xl\:space-x-32>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(8rem * var(--space-x-reverse));margin-left:calc(8rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-40>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(10rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(10rem * var(--space-y-reverse))}.xl\:space-x-40>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(10rem * var(--space-x-reverse));margin-left:calc(10rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-48>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(12rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(12rem * var(--space-y-reverse))}.xl\:space-x-48>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(12rem * var(--space-x-reverse));margin-left:calc(12rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-56>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(14rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(14rem * var(--space-y-reverse))}.xl\:space-x-56>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(14rem * var(--space-x-reverse));margin-left:calc(14rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-64>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(16rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(16rem * var(--space-y-reverse))}.xl\:space-x-64>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(16rem * var(--space-x-reverse));margin-left:calc(16rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-px>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1px * var(--space-y-reverse))}.xl\:space-x-px>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1px * var(--space-x-reverse));margin-left:calc(1px * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.25rem * var(--space-y-reverse))}.xl\:-space-x-1>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.25rem * var(--space-x-reverse));margin-left:calc(-.25rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.5rem * var(--space-y-reverse))}.xl\:-space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.5rem * var(--space-x-reverse));margin-left:calc(-.5rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.75rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.75rem * var(--space-y-reverse))}.xl\:-space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.75rem * var(--space-x-reverse));margin-left:calc(-.75rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1rem * var(--space-y-reverse))}.xl\:-space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1rem * var(--space-x-reverse));margin-left:calc(-1rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1.25rem * var(--space-y-reverse))}.xl\:-space-x-5>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1.25rem * var(--space-x-reverse));margin-left:calc(-1.25rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-6>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1.5rem * var(--space-y-reverse))}.xl\:-space-x-6>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1.5rem * var(--space-x-reverse));margin-left:calc(-1.5rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-8>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-2rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-2rem * var(--space-y-reverse))}.xl\:-space-x-8>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-2rem * var(--space-x-reverse));margin-left:calc(-2rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-2.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-2.5rem * var(--space-y-reverse))}.xl\:-space-x-10>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-2.5rem * var(--space-x-reverse));margin-left:calc(-2.5rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-12>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-3rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-3rem * var(--space-y-reverse))}.xl\:-space-x-12>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-3rem * var(--space-x-reverse));margin-left:calc(-3rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-16>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-4rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-4rem * var(--space-y-reverse))}.xl\:-space-x-16>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-4rem * var(--space-x-reverse));margin-left:calc(-4rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-20>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-5rem * var(--space-y-reverse))}.xl\:-space-x-20>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-5rem * var(--space-x-reverse));margin-left:calc(-5rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-24>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-6rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-6rem * var(--space-y-reverse))}.xl\:-space-x-24>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-6rem * var(--space-x-reverse));margin-left:calc(-6rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-32>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-8rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-8rem * var(--space-y-reverse))}.xl\:-space-x-32>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-8rem * var(--space-x-reverse));margin-left:calc(-8rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-40>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-10rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-10rem * var(--space-y-reverse))}.xl\:-space-x-40>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-10rem * var(--space-x-reverse));margin-left:calc(-10rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-48>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-12rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-12rem * var(--space-y-reverse))}.xl\:-space-x-48>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-12rem * var(--space-x-reverse));margin-left:calc(-12rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-56>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-14rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-14rem * var(--space-y-reverse))}.xl\:-space-x-56>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-14rem * var(--space-x-reverse));margin-left:calc(-14rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-64>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-16rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-16rem * var(--space-y-reverse))}.xl\:-space-x-64>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-16rem * var(--space-x-reverse));margin-left:calc(-16rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-px>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1px * var(--space-y-reverse))}.xl\:-space-x-px>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1px * var(--space-x-reverse));margin-left:calc(-1px * calc(1 - var(--space-x-reverse)))}.xl\:space-y-reverse>:not(template)~:not(template){--space-y-reverse:1}.xl\:space-x-reverse>:not(template)~:not(template){--space-x-reverse:1}.xl\:divide-y-0>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(0px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(0px * var(--divide-y-reverse))}.xl\:divide-x-0>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(0px * var(--divide-x-reverse));border-left-width:calc(0px * calc(1 - var(--divide-x-reverse)))}.xl\:divide-y-2>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(2px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(2px * var(--divide-y-reverse))}.xl\:divide-x-2>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(2px * var(--divide-x-reverse));border-left-width:calc(2px * calc(1 - var(--divide-x-reverse)))}.xl\:divide-y-4>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(4px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(4px * var(--divide-y-reverse))}.xl\:divide-x-4>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(4px * var(--divide-x-reverse));border-left-width:calc(4px * calc(1 - var(--divide-x-reverse)))}.xl\:divide-y-8>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(8px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(8px * var(--divide-y-reverse))}.xl\:divide-x-8>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(8px * var(--divide-x-reverse));border-left-width:calc(8px * calc(1 - var(--divide-x-reverse)))}.xl\:divide-y>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(1px * var(--divide-y-reverse))}.xl\:divide-x>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(1px * var(--divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--divide-x-reverse)))}.xl\:divide-y-reverse>:not(template)~:not(template){--divide-y-reverse:1}.xl\:divide-x-reverse>:not(template)~:not(template){--divide-x-reverse:1}.xl\:divide-transparent>:not(template)~:not(template){border-color:transparent}.xl\:divide-current>:not(template)~:not(template){border-color:currentColor}.xl\:divide-black>:not(template)~:not(template){--divide-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--divide-opacity))}.xl\:divide-white>:not(template)~:not(template){--divide-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--divide-opacity))}.xl\:divide-gray-100>:not(template)~:not(template){--divide-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--divide-opacity))}.xl\:divide-gray-200>:not(template)~:not(template){--divide-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--divide-opacity))}.xl\:divide-gray-300>:not(template)~:not(template){--divide-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--divide-opacity))}.xl\:divide-gray-400>:not(template)~:not(template){--divide-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--divide-opacity))}.xl\:divide-gray-500>:not(template)~:not(template){--divide-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--divide-opacity))}.xl\:divide-gray-600>:not(template)~:not(template){--divide-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--divide-opacity))}.xl\:divide-gray-700>:not(template)~:not(template){--divide-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--divide-opacity))}.xl\:divide-gray-800>:not(template)~:not(template){--divide-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--divide-opacity))}.xl\:divide-gray-900>:not(template)~:not(template){--divide-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--divide-opacity))}.xl\:divide-red-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--divide-opacity))}.xl\:divide-red-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--divide-opacity))}.xl\:divide-red-300>:not(template)~:not(template){--divide-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--divide-opacity))}.xl\:divide-red-400>:not(template)~:not(template){--divide-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--divide-opacity))}.xl\:divide-red-500>:not(template)~:not(template){--divide-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--divide-opacity))}.xl\:divide-red-600>:not(template)~:not(template){--divide-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--divide-opacity))}.xl\:divide-red-700>:not(template)~:not(template){--divide-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--divide-opacity))}.xl\:divide-red-800>:not(template)~:not(template){--divide-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--divide-opacity))}.xl\:divide-red-900>:not(template)~:not(template){--divide-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--divide-opacity))}.xl\:divide-orange-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--divide-opacity))}.xl\:divide-orange-200>:not(template)~:not(template){--divide-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--divide-opacity))}.xl\:divide-orange-300>:not(template)~:not(template){--divide-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--divide-opacity))}.xl\:divide-orange-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--divide-opacity))}.xl\:divide-orange-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--divide-opacity))}.xl\:divide-orange-600>:not(template)~:not(template){--divide-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--divide-opacity))}.xl\:divide-orange-700>:not(template)~:not(template){--divide-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--divide-opacity))}.xl\:divide-orange-800>:not(template)~:not(template){--divide-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--divide-opacity))}.xl\:divide-orange-900>:not(template)~:not(template){--divide-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--divide-opacity))}.xl\:divide-yellow-100>:not(template)~:not(template){--divide-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--divide-opacity))}.xl\:divide-yellow-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--divide-opacity))}.xl\:divide-yellow-300>:not(template)~:not(template){--divide-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--divide-opacity))}.xl\:divide-yellow-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--divide-opacity))}.xl\:divide-yellow-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--divide-opacity))}.xl\:divide-yellow-600>:not(template)~:not(template){--divide-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--divide-opacity))}.xl\:divide-yellow-700>:not(template)~:not(template){--divide-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--divide-opacity))}.xl\:divide-yellow-800>:not(template)~:not(template){--divide-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--divide-opacity))}.xl\:divide-yellow-900>:not(template)~:not(template){--divide-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--divide-opacity))}.xl\:divide-green-100>:not(template)~:not(template){--divide-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--divide-opacity))}.xl\:divide-green-200>:not(template)~:not(template){--divide-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--divide-opacity))}.xl\:divide-green-300>:not(template)~:not(template){--divide-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--divide-opacity))}.xl\:divide-green-400>:not(template)~:not(template){--divide-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--divide-opacity))}.xl\:divide-green-500>:not(template)~:not(template){--divide-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--divide-opacity))}.xl\:divide-green-600>:not(template)~:not(template){--divide-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--divide-opacity))}.xl\:divide-green-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--divide-opacity))}.xl\:divide-green-800>:not(template)~:not(template){--divide-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--divide-opacity))}.xl\:divide-green-900>:not(template)~:not(template){--divide-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--divide-opacity))}.xl\:divide-teal-100>:not(template)~:not(template){--divide-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--divide-opacity))}.xl\:divide-teal-200>:not(template)~:not(template){--divide-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--divide-opacity))}.xl\:divide-teal-300>:not(template)~:not(template){--divide-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--divide-opacity))}.xl\:divide-teal-400>:not(template)~:not(template){--divide-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--divide-opacity))}.xl\:divide-teal-500>:not(template)~:not(template){--divide-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--divide-opacity))}.xl\:divide-teal-600>:not(template)~:not(template){--divide-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--divide-opacity))}.xl\:divide-teal-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--divide-opacity))}.xl\:divide-teal-800>:not(template)~:not(template){--divide-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--divide-opacity))}.xl\:divide-teal-900>:not(template)~:not(template){--divide-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--divide-opacity))}.xl\:divide-blue-100>:not(template)~:not(template){--divide-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--divide-opacity))}.xl\:divide-blue-200>:not(template)~:not(template){--divide-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--divide-opacity))}.xl\:divide-blue-300>:not(template)~:not(template){--divide-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--divide-opacity))}.xl\:divide-blue-400>:not(template)~:not(template){--divide-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--divide-opacity))}.xl\:divide-blue-500>:not(template)~:not(template){--divide-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--divide-opacity))}.xl\:divide-blue-600>:not(template)~:not(template){--divide-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--divide-opacity))}.xl\:divide-blue-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--divide-opacity))}.xl\:divide-blue-800>:not(template)~:not(template){--divide-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--divide-opacity))}.xl\:divide-blue-900>:not(template)~:not(template){--divide-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--divide-opacity))}.xl\:divide-indigo-100>:not(template)~:not(template){--divide-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--divide-opacity))}.xl\:divide-indigo-200>:not(template)~:not(template){--divide-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--divide-opacity))}.xl\:divide-indigo-300>:not(template)~:not(template){--divide-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--divide-opacity))}.xl\:divide-indigo-400>:not(template)~:not(template){--divide-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--divide-opacity))}.xl\:divide-indigo-500>:not(template)~:not(template){--divide-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--divide-opacity))}.xl\:divide-indigo-600>:not(template)~:not(template){--divide-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--divide-opacity))}.xl\:divide-indigo-700>:not(template)~:not(template){--divide-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--divide-opacity))}.xl\:divide-indigo-800>:not(template)~:not(template){--divide-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--divide-opacity))}.xl\:divide-indigo-900>:not(template)~:not(template){--divide-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--divide-opacity))}.xl\:divide-purple-100>:not(template)~:not(template){--divide-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--divide-opacity))}.xl\:divide-purple-200>:not(template)~:not(template){--divide-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--divide-opacity))}.xl\:divide-purple-300>:not(template)~:not(template){--divide-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--divide-opacity))}.xl\:divide-purple-400>:not(template)~:not(template){--divide-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--divide-opacity))}.xl\:divide-purple-500>:not(template)~:not(template){--divide-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--divide-opacity))}.xl\:divide-purple-600>:not(template)~:not(template){--divide-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--divide-opacity))}.xl\:divide-purple-700>:not(template)~:not(template){--divide-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--divide-opacity))}.xl\:divide-purple-800>:not(template)~:not(template){--divide-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--divide-opacity))}.xl\:divide-purple-900>:not(template)~:not(template){--divide-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--divide-opacity))}.xl\:divide-pink-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--divide-opacity))}.xl\:divide-pink-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--divide-opacity))}.xl\:divide-pink-300>:not(template)~:not(template){--divide-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--divide-opacity))}.xl\:divide-pink-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--divide-opacity))}.xl\:divide-pink-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--divide-opacity))}.xl\:divide-pink-600>:not(template)~:not(template){--divide-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--divide-opacity))}.xl\:divide-pink-700>:not(template)~:not(template){--divide-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--divide-opacity))}.xl\:divide-pink-800>:not(template)~:not(template){--divide-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--divide-opacity))}.xl\:divide-pink-900>:not(template)~:not(template){--divide-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--divide-opacity))}.xl\:divide-solid>:not(template)~:not(template){border-style:solid}.xl\:divide-dashed>:not(template)~:not(template){border-style:dashed}.xl\:divide-dotted>:not(template)~:not(template){border-style:dotted}.xl\:divide-double>:not(template)~:not(template){border-style:double}.xl\:divide-none>:not(template)~:not(template){border-style:none}.xl\:divide-opacity-0>:not(template)~:not(template){--divide-opacity:0}.xl\:divide-opacity-25>:not(template)~:not(template){--divide-opacity:0.25}.xl\:divide-opacity-50>:not(template)~:not(template){--divide-opacity:0.5}.xl\:divide-opacity-75>:not(template)~:not(template){--divide-opacity:0.75}.xl\:divide-opacity-100>:not(template)~:not(template){--divide-opacity:1}.xl\:sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.xl\:not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.xl\:focus\:sr-only:focus{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.xl\:focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.xl\:appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.xl\:bg-fixed{background-attachment:fixed}.xl\:bg-local{background-attachment:local}.xl\:bg-scroll{background-attachment:scroll}.xl\:bg-clip-border{background-clip:border-box}.xl\:bg-clip-padding{background-clip:padding-box}.xl\:bg-clip-content{background-clip:content-box}.xl\:bg-clip-text{-webkit-background-clip:text;background-clip:text}.xl\:bg-transparent{background-color:transparent}.xl\:bg-current{background-color:currentColor}.xl\:bg-black{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.xl\:bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.xl\:bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.xl\:bg-gray-200{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.xl\:bg-gray-300{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.xl\:bg-gray-400{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.xl\:bg-gray-500{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.xl\:bg-gray-600{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.xl\:bg-gray-700{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.xl\:bg-gray-800{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.xl\:bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.xl\:bg-red-100{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.xl\:bg-red-200{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.xl\:bg-red-300{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.xl\:bg-red-400{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.xl\:bg-red-500{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.xl\:bg-red-600{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.xl\:bg-red-700{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.xl\:bg-red-800{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.xl\:bg-red-900{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.xl\:bg-orange-100{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.xl\:bg-orange-200{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.xl\:bg-orange-300{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.xl\:bg-orange-400{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.xl\:bg-orange-500{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.xl\:bg-orange-600{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.xl\:bg-orange-700{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.xl\:bg-orange-800{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.xl\:bg-orange-900{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.xl\:bg-yellow-100{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.xl\:bg-yellow-200{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.xl\:bg-yellow-300{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.xl\:bg-yellow-400{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.xl\:bg-yellow-500{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.xl\:bg-yellow-600{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.xl\:bg-yellow-700{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.xl\:bg-yellow-800{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.xl\:bg-yellow-900{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.xl\:bg-green-100{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.xl\:bg-green-200{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.xl\:bg-green-300{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.xl\:bg-green-400{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.xl\:bg-green-500{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.xl\:bg-green-600{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.xl\:bg-green-700{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.xl\:bg-green-800{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.xl\:bg-green-900{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.xl\:bg-teal-100{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.xl\:bg-teal-200{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.xl\:bg-teal-300{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.xl\:bg-teal-400{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.xl\:bg-teal-500{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.xl\:bg-teal-600{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.xl\:bg-teal-700{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.xl\:bg-teal-800{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.xl\:bg-teal-900{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.xl\:bg-blue-100{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.xl\:bg-blue-200{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.xl\:bg-blue-300{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.xl\:bg-blue-400{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.xl\:bg-blue-500{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.xl\:bg-blue-600{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.xl\:bg-blue-700{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.xl\:bg-blue-800{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.xl\:bg-blue-900{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.xl\:bg-indigo-100{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.xl\:bg-indigo-200{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.xl\:bg-indigo-300{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.xl\:bg-indigo-400{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.xl\:bg-indigo-500{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.xl\:bg-indigo-600{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.xl\:bg-indigo-700{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.xl\:bg-indigo-800{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.xl\:bg-indigo-900{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.xl\:bg-purple-100{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.xl\:bg-purple-200{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.xl\:bg-purple-300{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.xl\:bg-purple-400{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.xl\:bg-purple-500{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.xl\:bg-purple-600{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.xl\:bg-purple-700{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.xl\:bg-purple-800{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.xl\:bg-purple-900{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.xl\:bg-pink-100{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.xl\:bg-pink-200{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.xl\:bg-pink-300{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.xl\:bg-pink-400{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.xl\:bg-pink-500{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.xl\:bg-pink-600{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.xl\:bg-pink-700{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.xl\:bg-pink-800{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.xl\:bg-pink-900{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.xl\:hover\:bg-transparent:hover{background-color:transparent}.xl\:hover\:bg-current:hover{background-color:currentColor}.xl\:hover\:bg-black:hover{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.xl\:hover\:bg-white:hover{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.xl\:hover\:bg-gray-100:hover{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.xl\:hover\:bg-gray-200:hover{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.xl\:hover\:bg-gray-300:hover{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.xl\:hover\:bg-gray-400:hover{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.xl\:hover\:bg-gray-500:hover{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.xl\:hover\:bg-gray-600:hover{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.xl\:hover\:bg-gray-700:hover{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.xl\:hover\:bg-gray-800:hover{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.xl\:hover\:bg-gray-900:hover{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.xl\:hover\:bg-red-100:hover{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.xl\:hover\:bg-red-200:hover{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.xl\:hover\:bg-red-300:hover{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.xl\:hover\:bg-red-400:hover{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.xl\:hover\:bg-red-500:hover{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.xl\:hover\:bg-red-600:hover{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.xl\:hover\:bg-red-700:hover{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.xl\:hover\:bg-red-800:hover{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.xl\:hover\:bg-red-900:hover{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.xl\:hover\:bg-orange-100:hover{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.xl\:hover\:bg-orange-200:hover{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.xl\:hover\:bg-orange-300:hover{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.xl\:hover\:bg-orange-400:hover{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.xl\:hover\:bg-orange-500:hover{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.xl\:hover\:bg-orange-600:hover{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.xl\:hover\:bg-orange-700:hover{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.xl\:hover\:bg-orange-800:hover{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.xl\:hover\:bg-orange-900:hover{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.xl\:hover\:bg-yellow-100:hover{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.xl\:hover\:bg-yellow-200:hover{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.xl\:hover\:bg-yellow-300:hover{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.xl\:hover\:bg-yellow-400:hover{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.xl\:hover\:bg-yellow-500:hover{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.xl\:hover\:bg-yellow-600:hover{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.xl\:hover\:bg-yellow-700:hover{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.xl\:hover\:bg-yellow-800:hover{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.xl\:hover\:bg-yellow-900:hover{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.xl\:hover\:bg-green-100:hover{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.xl\:hover\:bg-green-200:hover{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.xl\:hover\:bg-green-300:hover{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.xl\:hover\:bg-green-400:hover{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.xl\:hover\:bg-green-500:hover{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.xl\:hover\:bg-green-600:hover{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.xl\:hover\:bg-green-700:hover{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.xl\:hover\:bg-green-800:hover{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.xl\:hover\:bg-green-900:hover{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.xl\:hover\:bg-teal-100:hover{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.xl\:hover\:bg-teal-200:hover{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.xl\:hover\:bg-teal-300:hover{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.xl\:hover\:bg-teal-400:hover{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.xl\:hover\:bg-teal-500:hover{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.xl\:hover\:bg-teal-600:hover{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.xl\:hover\:bg-teal-700:hover{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.xl\:hover\:bg-teal-800:hover{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.xl\:hover\:bg-teal-900:hover{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.xl\:hover\:bg-blue-100:hover{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.xl\:hover\:bg-blue-200:hover{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.xl\:hover\:bg-blue-300:hover{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.xl\:hover\:bg-blue-400:hover{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.xl\:hover\:bg-blue-500:hover{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.xl\:hover\:bg-blue-600:hover{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.xl\:hover\:bg-blue-700:hover{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.xl\:hover\:bg-blue-800:hover{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.xl\:hover\:bg-blue-900:hover{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.xl\:hover\:bg-indigo-100:hover{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.xl\:hover\:bg-indigo-200:hover{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.xl\:hover\:bg-indigo-300:hover{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.xl\:hover\:bg-indigo-400:hover{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.xl\:hover\:bg-indigo-500:hover{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.xl\:hover\:bg-indigo-600:hover{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.xl\:hover\:bg-indigo-700:hover{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.xl\:hover\:bg-indigo-800:hover{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.xl\:hover\:bg-indigo-900:hover{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.xl\:hover\:bg-purple-100:hover{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.xl\:hover\:bg-purple-200:hover{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.xl\:hover\:bg-purple-300:hover{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.xl\:hover\:bg-purple-400:hover{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.xl\:hover\:bg-purple-500:hover{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.xl\:hover\:bg-purple-600:hover{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.xl\:hover\:bg-purple-700:hover{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.xl\:hover\:bg-purple-800:hover{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.xl\:hover\:bg-purple-900:hover{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.xl\:hover\:bg-pink-100:hover{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.xl\:hover\:bg-pink-200:hover{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.xl\:hover\:bg-pink-300:hover{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.xl\:hover\:bg-pink-400:hover{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.xl\:hover\:bg-pink-500:hover{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.xl\:hover\:bg-pink-600:hover{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.xl\:hover\:bg-pink-700:hover{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.xl\:hover\:bg-pink-800:hover{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.xl\:hover\:bg-pink-900:hover{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.xl\:focus\:bg-transparent:focus{background-color:transparent}.xl\:focus\:bg-current:focus{background-color:currentColor}.xl\:focus\:bg-black:focus{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.xl\:focus\:bg-white:focus{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.xl\:focus\:bg-gray-100:focus{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.xl\:focus\:bg-gray-200:focus{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.xl\:focus\:bg-gray-300:focus{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.xl\:focus\:bg-gray-400:focus{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.xl\:focus\:bg-gray-500:focus{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.xl\:focus\:bg-gray-600:focus{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.xl\:focus\:bg-gray-700:focus{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.xl\:focus\:bg-gray-800:focus{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.xl\:focus\:bg-gray-900:focus{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.xl\:focus\:bg-red-100:focus{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.xl\:focus\:bg-red-200:focus{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.xl\:focus\:bg-red-300:focus{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.xl\:focus\:bg-red-400:focus{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.xl\:focus\:bg-red-500:focus{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.xl\:focus\:bg-red-600:focus{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.xl\:focus\:bg-red-700:focus{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.xl\:focus\:bg-red-800:focus{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.xl\:focus\:bg-red-900:focus{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.xl\:focus\:bg-orange-100:focus{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.xl\:focus\:bg-orange-200:focus{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.xl\:focus\:bg-orange-300:focus{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.xl\:focus\:bg-orange-400:focus{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.xl\:focus\:bg-orange-500:focus{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.xl\:focus\:bg-orange-600:focus{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.xl\:focus\:bg-orange-700:focus{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.xl\:focus\:bg-orange-800:focus{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.xl\:focus\:bg-orange-900:focus{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.xl\:focus\:bg-yellow-100:focus{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.xl\:focus\:bg-yellow-200:focus{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.xl\:focus\:bg-yellow-300:focus{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.xl\:focus\:bg-yellow-400:focus{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.xl\:focus\:bg-yellow-500:focus{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.xl\:focus\:bg-yellow-600:focus{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.xl\:focus\:bg-yellow-700:focus{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.xl\:focus\:bg-yellow-800:focus{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.xl\:focus\:bg-yellow-900:focus{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.xl\:focus\:bg-green-100:focus{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.xl\:focus\:bg-green-200:focus{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.xl\:focus\:bg-green-300:focus{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.xl\:focus\:bg-green-400:focus{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.xl\:focus\:bg-green-500:focus{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.xl\:focus\:bg-green-600:focus{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.xl\:focus\:bg-green-700:focus{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.xl\:focus\:bg-green-800:focus{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.xl\:focus\:bg-green-900:focus{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.xl\:focus\:bg-teal-100:focus{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.xl\:focus\:bg-teal-200:focus{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.xl\:focus\:bg-teal-300:focus{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.xl\:focus\:bg-teal-400:focus{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.xl\:focus\:bg-teal-500:focus{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.xl\:focus\:bg-teal-600:focus{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.xl\:focus\:bg-teal-700:focus{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.xl\:focus\:bg-teal-800:focus{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.xl\:focus\:bg-teal-900:focus{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.xl\:focus\:bg-blue-100:focus{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.xl\:focus\:bg-blue-200:focus{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.xl\:focus\:bg-blue-300:focus{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.xl\:focus\:bg-blue-400:focus{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.xl\:focus\:bg-blue-500:focus{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.xl\:focus\:bg-blue-600:focus{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.xl\:focus\:bg-blue-700:focus{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.xl\:focus\:bg-blue-800:focus{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.xl\:focus\:bg-blue-900:focus{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.xl\:focus\:bg-indigo-100:focus{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.xl\:focus\:bg-indigo-200:focus{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.xl\:focus\:bg-indigo-300:focus{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.xl\:focus\:bg-indigo-400:focus{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.xl\:focus\:bg-indigo-500:focus{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.xl\:focus\:bg-indigo-600:focus{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.xl\:focus\:bg-indigo-700:focus{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.xl\:focus\:bg-indigo-800:focus{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.xl\:focus\:bg-indigo-900:focus{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.xl\:focus\:bg-purple-100:focus{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.xl\:focus\:bg-purple-200:focus{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.xl\:focus\:bg-purple-300:focus{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.xl\:focus\:bg-purple-400:focus{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.xl\:focus\:bg-purple-500:focus{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.xl\:focus\:bg-purple-600:focus{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.xl\:focus\:bg-purple-700:focus{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.xl\:focus\:bg-purple-800:focus{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.xl\:focus\:bg-purple-900:focus{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.xl\:focus\:bg-pink-100:focus{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.xl\:focus\:bg-pink-200:focus{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.xl\:focus\:bg-pink-300:focus{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.xl\:focus\:bg-pink-400:focus{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.xl\:focus\:bg-pink-500:focus{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.xl\:focus\:bg-pink-600:focus{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.xl\:focus\:bg-pink-700:focus{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.xl\:focus\:bg-pink-800:focus{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.xl\:focus\:bg-pink-900:focus{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.xl\:bg-none{background-image:none}.xl\:bg-gradient-to-t{background-image:linear-gradient(to top,var(--gradient-color-stops))}.xl\:bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--gradient-color-stops))}.xl\:bg-gradient-to-r{background-image:linear-gradient(to right,var(--gradient-color-stops))}.xl\:bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--gradient-color-stops))}.xl\:bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--gradient-color-stops))}.xl\:bg-gradient-to-bl{background-image:linear-gradient(to bottom left,var(--gradient-color-stops))}.xl\:bg-gradient-to-l{background-image:linear-gradient(to left,var(--gradient-color-stops))}.xl\:bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--gradient-color-stops))}.xl\:from-transparent{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:from-current{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:from-black{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:from-white{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:from-gray-100{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.xl\:from-gray-200{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.xl\:from-gray-300{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.xl\:from-gray-400{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.xl\:from-gray-500{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.xl\:from-gray-600{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.xl\:from-gray-700{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.xl\:from-gray-800{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.xl\:from-gray-900{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.xl\:from-red-100{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.xl\:from-red-200{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.xl\:from-red-300{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.xl\:from-red-400{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.xl\:from-red-500{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.xl\:from-red-600{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.xl\:from-red-700{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.xl\:from-red-800{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.xl\:from-red-900{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.xl\:from-orange-100{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.xl\:from-orange-200{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.xl\:from-orange-300{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.xl\:from-orange-400{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.xl\:from-orange-500{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.xl\:from-orange-600{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.xl\:from-orange-700{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.xl\:from-orange-800{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.xl\:from-orange-900{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.xl\:from-yellow-100{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.xl\:from-yellow-200{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.xl\:from-yellow-300{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.xl\:from-yellow-400{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.xl\:from-yellow-500{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.xl\:from-yellow-600{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.xl\:from-yellow-700{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.xl\:from-yellow-800{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.xl\:from-yellow-900{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.xl\:from-green-100{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.xl\:from-green-200{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.xl\:from-green-300{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.xl\:from-green-400{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.xl\:from-green-500{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.xl\:from-green-600{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.xl\:from-green-700{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.xl\:from-green-800{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.xl\:from-green-900{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.xl\:from-teal-100{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.xl\:from-teal-200{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.xl\:from-teal-300{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.xl\:from-teal-400{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.xl\:from-teal-500{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.xl\:from-teal-600{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.xl\:from-teal-700{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.xl\:from-teal-800{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.xl\:from-teal-900{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.xl\:from-blue-100{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.xl\:from-blue-200{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.xl\:from-blue-300{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.xl\:from-blue-400{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.xl\:from-blue-500{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.xl\:from-blue-600{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.xl\:from-blue-700{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.xl\:from-blue-800{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.xl\:from-blue-900{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.xl\:from-indigo-100{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.xl\:from-indigo-200{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.xl\:from-indigo-300{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.xl\:from-indigo-400{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.xl\:from-indigo-500{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.xl\:from-indigo-600{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.xl\:from-indigo-700{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.xl\:from-indigo-800{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.xl\:from-indigo-900{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.xl\:from-purple-100{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.xl\:from-purple-200{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.xl\:from-purple-300{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.xl\:from-purple-400{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.xl\:from-purple-500{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.xl\:from-purple-600{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.xl\:from-purple-700{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.xl\:from-purple-800{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.xl\:from-purple-900{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.xl\:from-pink-100{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.xl\:from-pink-200{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.xl\:from-pink-300{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.xl\:from-pink-400{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.xl\:from-pink-500{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.xl\:from-pink-600{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.xl\:from-pink-700{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.xl\:from-pink-800{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.xl\:from-pink-900{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.xl\:via-transparent{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:via-current{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:via-black{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:via-white{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:via-gray-100{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.xl\:via-gray-200{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.xl\:via-gray-300{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.xl\:via-gray-400{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.xl\:via-gray-500{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.xl\:via-gray-600{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.xl\:via-gray-700{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.xl\:via-gray-800{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.xl\:via-gray-900{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.xl\:via-red-100{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.xl\:via-red-200{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.xl\:via-red-300{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.xl\:via-red-400{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.xl\:via-red-500{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.xl\:via-red-600{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.xl\:via-red-700{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.xl\:via-red-800{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.xl\:via-red-900{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.xl\:via-orange-100{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.xl\:via-orange-200{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.xl\:via-orange-300{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.xl\:via-orange-400{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.xl\:via-orange-500{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.xl\:via-orange-600{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.xl\:via-orange-700{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.xl\:via-orange-800{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.xl\:via-orange-900{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.xl\:via-yellow-100{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.xl\:via-yellow-200{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.xl\:via-yellow-300{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.xl\:via-yellow-400{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.xl\:via-yellow-500{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.xl\:via-yellow-600{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.xl\:via-yellow-700{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.xl\:via-yellow-800{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.xl\:via-yellow-900{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.xl\:via-green-100{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.xl\:via-green-200{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.xl\:via-green-300{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.xl\:via-green-400{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.xl\:via-green-500{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.xl\:via-green-600{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.xl\:via-green-700{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.xl\:via-green-800{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.xl\:via-green-900{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.xl\:via-teal-100{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.xl\:via-teal-200{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.xl\:via-teal-300{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.xl\:via-teal-400{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.xl\:via-teal-500{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.xl\:via-teal-600{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.xl\:via-teal-700{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.xl\:via-teal-800{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.xl\:via-teal-900{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.xl\:via-blue-100{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.xl\:via-blue-200{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.xl\:via-blue-300{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.xl\:via-blue-400{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.xl\:via-blue-500{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.xl\:via-blue-600{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.xl\:via-blue-700{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.xl\:via-blue-800{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.xl\:via-blue-900{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.xl\:via-indigo-100{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.xl\:via-indigo-200{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.xl\:via-indigo-300{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.xl\:via-indigo-400{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.xl\:via-indigo-500{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.xl\:via-indigo-600{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.xl\:via-indigo-700{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.xl\:via-indigo-800{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.xl\:via-indigo-900{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.xl\:via-purple-100{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.xl\:via-purple-200{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.xl\:via-purple-300{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.xl\:via-purple-400{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.xl\:via-purple-500{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.xl\:via-purple-600{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.xl\:via-purple-700{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.xl\:via-purple-800{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.xl\:via-purple-900{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.xl\:via-pink-100{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.xl\:via-pink-200{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.xl\:via-pink-300{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.xl\:via-pink-400{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.xl\:via-pink-500{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.xl\:via-pink-600{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.xl\:via-pink-700{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.xl\:via-pink-800{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.xl\:via-pink-900{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.xl\:to-transparent{--gradient-to-color:transparent}.xl\:to-current{--gradient-to-color:currentColor}.xl\:to-black{--gradient-to-color:#000}.xl\:to-white{--gradient-to-color:#fff}.xl\:to-gray-100{--gradient-to-color:#f7fafc}.xl\:to-gray-200{--gradient-to-color:#edf2f7}.xl\:to-gray-300{--gradient-to-color:#e2e8f0}.xl\:to-gray-400{--gradient-to-color:#cbd5e0}.xl\:to-gray-500{--gradient-to-color:#a0aec0}.xl\:to-gray-600{--gradient-to-color:#718096}.xl\:to-gray-700{--gradient-to-color:#4a5568}.xl\:to-gray-800{--gradient-to-color:#2d3748}.xl\:to-gray-900{--gradient-to-color:#1a202c}.xl\:to-red-100{--gradient-to-color:#fff5f5}.xl\:to-red-200{--gradient-to-color:#fed7d7}.xl\:to-red-300{--gradient-to-color:#feb2b2}.xl\:to-red-400{--gradient-to-color:#fc8181}.xl\:to-red-500{--gradient-to-color:#f56565}.xl\:to-red-600{--gradient-to-color:#e53e3e}.xl\:to-red-700{--gradient-to-color:#c53030}.xl\:to-red-800{--gradient-to-color:#9b2c2c}.xl\:to-red-900{--gradient-to-color:#742a2a}.xl\:to-orange-100{--gradient-to-color:#fffaf0}.xl\:to-orange-200{--gradient-to-color:#feebc8}.xl\:to-orange-300{--gradient-to-color:#fbd38d}.xl\:to-orange-400{--gradient-to-color:#f6ad55}.xl\:to-orange-500{--gradient-to-color:#ed8936}.xl\:to-orange-600{--gradient-to-color:#dd6b20}.xl\:to-orange-700{--gradient-to-color:#c05621}.xl\:to-orange-800{--gradient-to-color:#9c4221}.xl\:to-orange-900{--gradient-to-color:#7b341e}.xl\:to-yellow-100{--gradient-to-color:#fffff0}.xl\:to-yellow-200{--gradient-to-color:#fefcbf}.xl\:to-yellow-300{--gradient-to-color:#faf089}.xl\:to-yellow-400{--gradient-to-color:#f6e05e}.xl\:to-yellow-500{--gradient-to-color:#ecc94b}.xl\:to-yellow-600{--gradient-to-color:#d69e2e}.xl\:to-yellow-700{--gradient-to-color:#b7791f}.xl\:to-yellow-800{--gradient-to-color:#975a16}.xl\:to-yellow-900{--gradient-to-color:#744210}.xl\:to-green-100{--gradient-to-color:#f0fff4}.xl\:to-green-200{--gradient-to-color:#c6f6d5}.xl\:to-green-300{--gradient-to-color:#9ae6b4}.xl\:to-green-400{--gradient-to-color:#68d391}.xl\:to-green-500{--gradient-to-color:#48bb78}.xl\:to-green-600{--gradient-to-color:#38a169}.xl\:to-green-700{--gradient-to-color:#2f855a}.xl\:to-green-800{--gradient-to-color:#276749}.xl\:to-green-900{--gradient-to-color:#22543d}.xl\:to-teal-100{--gradient-to-color:#e6fffa}.xl\:to-teal-200{--gradient-to-color:#b2f5ea}.xl\:to-teal-300{--gradient-to-color:#81e6d9}.xl\:to-teal-400{--gradient-to-color:#4fd1c5}.xl\:to-teal-500{--gradient-to-color:#38b2ac}.xl\:to-teal-600{--gradient-to-color:#319795}.xl\:to-teal-700{--gradient-to-color:#2c7a7b}.xl\:to-teal-800{--gradient-to-color:#285e61}.xl\:to-teal-900{--gradient-to-color:#234e52}.xl\:to-blue-100{--gradient-to-color:#ebf8ff}.xl\:to-blue-200{--gradient-to-color:#bee3f8}.xl\:to-blue-300{--gradient-to-color:#90cdf4}.xl\:to-blue-400{--gradient-to-color:#63b3ed}.xl\:to-blue-500{--gradient-to-color:#4299e1}.xl\:to-blue-600{--gradient-to-color:#3182ce}.xl\:to-blue-700{--gradient-to-color:#2b6cb0}.xl\:to-blue-800{--gradient-to-color:#2c5282}.xl\:to-blue-900{--gradient-to-color:#2a4365}.xl\:to-indigo-100{--gradient-to-color:#ebf4ff}.xl\:to-indigo-200{--gradient-to-color:#c3dafe}.xl\:to-indigo-300{--gradient-to-color:#a3bffa}.xl\:to-indigo-400{--gradient-to-color:#7f9cf5}.xl\:to-indigo-500{--gradient-to-color:#667eea}.xl\:to-indigo-600{--gradient-to-color:#5a67d8}.xl\:to-indigo-700{--gradient-to-color:#4c51bf}.xl\:to-indigo-800{--gradient-to-color:#434190}.xl\:to-indigo-900{--gradient-to-color:#3c366b}.xl\:to-purple-100{--gradient-to-color:#faf5ff}.xl\:to-purple-200{--gradient-to-color:#e9d8fd}.xl\:to-purple-300{--gradient-to-color:#d6bcfa}.xl\:to-purple-400{--gradient-to-color:#b794f4}.xl\:to-purple-500{--gradient-to-color:#9f7aea}.xl\:to-purple-600{--gradient-to-color:#805ad5}.xl\:to-purple-700{--gradient-to-color:#6b46c1}.xl\:to-purple-800{--gradient-to-color:#553c9a}.xl\:to-purple-900{--gradient-to-color:#44337a}.xl\:to-pink-100{--gradient-to-color:#fff5f7}.xl\:to-pink-200{--gradient-to-color:#fed7e2}.xl\:to-pink-300{--gradient-to-color:#fbb6ce}.xl\:to-pink-400{--gradient-to-color:#f687b3}.xl\:to-pink-500{--gradient-to-color:#ed64a6}.xl\:to-pink-600{--gradient-to-color:#d53f8c}.xl\:to-pink-700{--gradient-to-color:#b83280}.xl\:to-pink-800{--gradient-to-color:#97266d}.xl\:to-pink-900{--gradient-to-color:#702459}.xl\:hover\:from-transparent:hover{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:hover\:from-current:hover{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:hover\:from-black:hover{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:hover\:from-white:hover{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:hover\:from-gray-100:hover{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.xl\:hover\:from-gray-200:hover{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.xl\:hover\:from-gray-300:hover{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.xl\:hover\:from-gray-400:hover{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.xl\:hover\:from-gray-500:hover{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.xl\:hover\:from-gray-600:hover{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.xl\:hover\:from-gray-700:hover{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.xl\:hover\:from-gray-800:hover{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.xl\:hover\:from-gray-900:hover{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.xl\:hover\:from-red-100:hover{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.xl\:hover\:from-red-200:hover{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.xl\:hover\:from-red-300:hover{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.xl\:hover\:from-red-400:hover{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.xl\:hover\:from-red-500:hover{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.xl\:hover\:from-red-600:hover{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.xl\:hover\:from-red-700:hover{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.xl\:hover\:from-red-800:hover{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.xl\:hover\:from-red-900:hover{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.xl\:hover\:from-orange-100:hover{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.xl\:hover\:from-orange-200:hover{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.xl\:hover\:from-orange-300:hover{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.xl\:hover\:from-orange-400:hover{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.xl\:hover\:from-orange-500:hover{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.xl\:hover\:from-orange-600:hover{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.xl\:hover\:from-orange-700:hover{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.xl\:hover\:from-orange-800:hover{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.xl\:hover\:from-orange-900:hover{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.xl\:hover\:from-yellow-100:hover{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.xl\:hover\:from-yellow-200:hover{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.xl\:hover\:from-yellow-300:hover{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.xl\:hover\:from-yellow-400:hover{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.xl\:hover\:from-yellow-500:hover{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.xl\:hover\:from-yellow-600:hover{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.xl\:hover\:from-yellow-700:hover{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.xl\:hover\:from-yellow-800:hover{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.xl\:hover\:from-yellow-900:hover{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.xl\:hover\:from-green-100:hover{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.xl\:hover\:from-green-200:hover{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.xl\:hover\:from-green-300:hover{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.xl\:hover\:from-green-400:hover{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.xl\:hover\:from-green-500:hover{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.xl\:hover\:from-green-600:hover{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.xl\:hover\:from-green-700:hover{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.xl\:hover\:from-green-800:hover{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.xl\:hover\:from-green-900:hover{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.xl\:hover\:from-teal-100:hover{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.xl\:hover\:from-teal-200:hover{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.xl\:hover\:from-teal-300:hover{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.xl\:hover\:from-teal-400:hover{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.xl\:hover\:from-teal-500:hover{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.xl\:hover\:from-teal-600:hover{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.xl\:hover\:from-teal-700:hover{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.xl\:hover\:from-teal-800:hover{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.xl\:hover\:from-teal-900:hover{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.xl\:hover\:from-blue-100:hover{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.xl\:hover\:from-blue-200:hover{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.xl\:hover\:from-blue-300:hover{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.xl\:hover\:from-blue-400:hover{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.xl\:hover\:from-blue-500:hover{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.xl\:hover\:from-blue-600:hover{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.xl\:hover\:from-blue-700:hover{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.xl\:hover\:from-blue-800:hover{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.xl\:hover\:from-blue-900:hover{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.xl\:hover\:from-indigo-100:hover{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.xl\:hover\:from-indigo-200:hover{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.xl\:hover\:from-indigo-300:hover{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.xl\:hover\:from-indigo-400:hover{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.xl\:hover\:from-indigo-500:hover{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.xl\:hover\:from-indigo-600:hover{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.xl\:hover\:from-indigo-700:hover{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.xl\:hover\:from-indigo-800:hover{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.xl\:hover\:from-indigo-900:hover{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.xl\:hover\:from-purple-100:hover{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.xl\:hover\:from-purple-200:hover{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.xl\:hover\:from-purple-300:hover{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.xl\:hover\:from-purple-400:hover{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.xl\:hover\:from-purple-500:hover{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.xl\:hover\:from-purple-600:hover{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.xl\:hover\:from-purple-700:hover{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.xl\:hover\:from-purple-800:hover{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.xl\:hover\:from-purple-900:hover{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.xl\:hover\:from-pink-100:hover{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.xl\:hover\:from-pink-200:hover{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.xl\:hover\:from-pink-300:hover{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.xl\:hover\:from-pink-400:hover{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.xl\:hover\:from-pink-500:hover{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.xl\:hover\:from-pink-600:hover{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.xl\:hover\:from-pink-700:hover{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.xl\:hover\:from-pink-800:hover{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.xl\:hover\:from-pink-900:hover{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.xl\:hover\:via-transparent:hover{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:hover\:via-current:hover{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:hover\:via-black:hover{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:hover\:via-white:hover{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:hover\:via-gray-100:hover{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.xl\:hover\:via-gray-200:hover{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.xl\:hover\:via-gray-300:hover{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.xl\:hover\:via-gray-400:hover{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.xl\:hover\:via-gray-500:hover{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.xl\:hover\:via-gray-600:hover{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.xl\:hover\:via-gray-700:hover{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.xl\:hover\:via-gray-800:hover{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.xl\:hover\:via-gray-900:hover{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.xl\:hover\:via-red-100:hover{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.xl\:hover\:via-red-200:hover{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.xl\:hover\:via-red-300:hover{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.xl\:hover\:via-red-400:hover{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.xl\:hover\:via-red-500:hover{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.xl\:hover\:via-red-600:hover{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.xl\:hover\:via-red-700:hover{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.xl\:hover\:via-red-800:hover{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.xl\:hover\:via-red-900:hover{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.xl\:hover\:via-orange-100:hover{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.xl\:hover\:via-orange-200:hover{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.xl\:hover\:via-orange-300:hover{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.xl\:hover\:via-orange-400:hover{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.xl\:hover\:via-orange-500:hover{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.xl\:hover\:via-orange-600:hover{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.xl\:hover\:via-orange-700:hover{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.xl\:hover\:via-orange-800:hover{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.xl\:hover\:via-orange-900:hover{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.xl\:hover\:via-yellow-100:hover{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.xl\:hover\:via-yellow-200:hover{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.xl\:hover\:via-yellow-300:hover{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.xl\:hover\:via-yellow-400:hover{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.xl\:hover\:via-yellow-500:hover{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.xl\:hover\:via-yellow-600:hover{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.xl\:hover\:via-yellow-700:hover{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.xl\:hover\:via-yellow-800:hover{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.xl\:hover\:via-yellow-900:hover{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.xl\:hover\:via-green-100:hover{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.xl\:hover\:via-green-200:hover{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.xl\:hover\:via-green-300:hover{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.xl\:hover\:via-green-400:hover{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.xl\:hover\:via-green-500:hover{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.xl\:hover\:via-green-600:hover{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.xl\:hover\:via-green-700:hover{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.xl\:hover\:via-green-800:hover{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.xl\:hover\:via-green-900:hover{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.xl\:hover\:via-teal-100:hover{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.xl\:hover\:via-teal-200:hover{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.xl\:hover\:via-teal-300:hover{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.xl\:hover\:via-teal-400:hover{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.xl\:hover\:via-teal-500:hover{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.xl\:hover\:via-teal-600:hover{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.xl\:hover\:via-teal-700:hover{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.xl\:hover\:via-teal-800:hover{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.xl\:hover\:via-teal-900:hover{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.xl\:hover\:via-blue-100:hover{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.xl\:hover\:via-blue-200:hover{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.xl\:hover\:via-blue-300:hover{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.xl\:hover\:via-blue-400:hover{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.xl\:hover\:via-blue-500:hover{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.xl\:hover\:via-blue-600:hover{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.xl\:hover\:via-blue-700:hover{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.xl\:hover\:via-blue-800:hover{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.xl\:hover\:via-blue-900:hover{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.xl\:hover\:via-indigo-100:hover{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.xl\:hover\:via-indigo-200:hover{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.xl\:hover\:via-indigo-300:hover{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.xl\:hover\:via-indigo-400:hover{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.xl\:hover\:via-indigo-500:hover{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.xl\:hover\:via-indigo-600:hover{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.xl\:hover\:via-indigo-700:hover{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.xl\:hover\:via-indigo-800:hover{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.xl\:hover\:via-indigo-900:hover{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.xl\:hover\:via-purple-100:hover{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.xl\:hover\:via-purple-200:hover{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.xl\:hover\:via-purple-300:hover{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.xl\:hover\:via-purple-400:hover{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.xl\:hover\:via-purple-500:hover{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.xl\:hover\:via-purple-600:hover{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.xl\:hover\:via-purple-700:hover{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.xl\:hover\:via-purple-800:hover{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.xl\:hover\:via-purple-900:hover{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.xl\:hover\:via-pink-100:hover{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.xl\:hover\:via-pink-200:hover{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.xl\:hover\:via-pink-300:hover{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.xl\:hover\:via-pink-400:hover{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.xl\:hover\:via-pink-500:hover{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.xl\:hover\:via-pink-600:hover{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.xl\:hover\:via-pink-700:hover{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.xl\:hover\:via-pink-800:hover{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.xl\:hover\:via-pink-900:hover{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.xl\:hover\:to-transparent:hover{--gradient-to-color:transparent}.xl\:hover\:to-current:hover{--gradient-to-color:currentColor}.xl\:hover\:to-black:hover{--gradient-to-color:#000}.xl\:hover\:to-white:hover{--gradient-to-color:#fff}.xl\:hover\:to-gray-100:hover{--gradient-to-color:#f7fafc}.xl\:hover\:to-gray-200:hover{--gradient-to-color:#edf2f7}.xl\:hover\:to-gray-300:hover{--gradient-to-color:#e2e8f0}.xl\:hover\:to-gray-400:hover{--gradient-to-color:#cbd5e0}.xl\:hover\:to-gray-500:hover{--gradient-to-color:#a0aec0}.xl\:hover\:to-gray-600:hover{--gradient-to-color:#718096}.xl\:hover\:to-gray-700:hover{--gradient-to-color:#4a5568}.xl\:hover\:to-gray-800:hover{--gradient-to-color:#2d3748}.xl\:hover\:to-gray-900:hover{--gradient-to-color:#1a202c}.xl\:hover\:to-red-100:hover{--gradient-to-color:#fff5f5}.xl\:hover\:to-red-200:hover{--gradient-to-color:#fed7d7}.xl\:hover\:to-red-300:hover{--gradient-to-color:#feb2b2}.xl\:hover\:to-red-400:hover{--gradient-to-color:#fc8181}.xl\:hover\:to-red-500:hover{--gradient-to-color:#f56565}.xl\:hover\:to-red-600:hover{--gradient-to-color:#e53e3e}.xl\:hover\:to-red-700:hover{--gradient-to-color:#c53030}.xl\:hover\:to-red-800:hover{--gradient-to-color:#9b2c2c}.xl\:hover\:to-red-900:hover{--gradient-to-color:#742a2a}.xl\:hover\:to-orange-100:hover{--gradient-to-color:#fffaf0}.xl\:hover\:to-orange-200:hover{--gradient-to-color:#feebc8}.xl\:hover\:to-orange-300:hover{--gradient-to-color:#fbd38d}.xl\:hover\:to-orange-400:hover{--gradient-to-color:#f6ad55}.xl\:hover\:to-orange-500:hover{--gradient-to-color:#ed8936}.xl\:hover\:to-orange-600:hover{--gradient-to-color:#dd6b20}.xl\:hover\:to-orange-700:hover{--gradient-to-color:#c05621}.xl\:hover\:to-orange-800:hover{--gradient-to-color:#9c4221}.xl\:hover\:to-orange-900:hover{--gradient-to-color:#7b341e}.xl\:hover\:to-yellow-100:hover{--gradient-to-color:#fffff0}.xl\:hover\:to-yellow-200:hover{--gradient-to-color:#fefcbf}.xl\:hover\:to-yellow-300:hover{--gradient-to-color:#faf089}.xl\:hover\:to-yellow-400:hover{--gradient-to-color:#f6e05e}.xl\:hover\:to-yellow-500:hover{--gradient-to-color:#ecc94b}.xl\:hover\:to-yellow-600:hover{--gradient-to-color:#d69e2e}.xl\:hover\:to-yellow-700:hover{--gradient-to-color:#b7791f}.xl\:hover\:to-yellow-800:hover{--gradient-to-color:#975a16}.xl\:hover\:to-yellow-900:hover{--gradient-to-color:#744210}.xl\:hover\:to-green-100:hover{--gradient-to-color:#f0fff4}.xl\:hover\:to-green-200:hover{--gradient-to-color:#c6f6d5}.xl\:hover\:to-green-300:hover{--gradient-to-color:#9ae6b4}.xl\:hover\:to-green-400:hover{--gradient-to-color:#68d391}.xl\:hover\:to-green-500:hover{--gradient-to-color:#48bb78}.xl\:hover\:to-green-600:hover{--gradient-to-color:#38a169}.xl\:hover\:to-green-700:hover{--gradient-to-color:#2f855a}.xl\:hover\:to-green-800:hover{--gradient-to-color:#276749}.xl\:hover\:to-green-900:hover{--gradient-to-color:#22543d}.xl\:hover\:to-teal-100:hover{--gradient-to-color:#e6fffa}.xl\:hover\:to-teal-200:hover{--gradient-to-color:#b2f5ea}.xl\:hover\:to-teal-300:hover{--gradient-to-color:#81e6d9}.xl\:hover\:to-teal-400:hover{--gradient-to-color:#4fd1c5}.xl\:hover\:to-teal-500:hover{--gradient-to-color:#38b2ac}.xl\:hover\:to-teal-600:hover{--gradient-to-color:#319795}.xl\:hover\:to-teal-700:hover{--gradient-to-color:#2c7a7b}.xl\:hover\:to-teal-800:hover{--gradient-to-color:#285e61}.xl\:hover\:to-teal-900:hover{--gradient-to-color:#234e52}.xl\:hover\:to-blue-100:hover{--gradient-to-color:#ebf8ff}.xl\:hover\:to-blue-200:hover{--gradient-to-color:#bee3f8}.xl\:hover\:to-blue-300:hover{--gradient-to-color:#90cdf4}.xl\:hover\:to-blue-400:hover{--gradient-to-color:#63b3ed}.xl\:hover\:to-blue-500:hover{--gradient-to-color:#4299e1}.xl\:hover\:to-blue-600:hover{--gradient-to-color:#3182ce}.xl\:hover\:to-blue-700:hover{--gradient-to-color:#2b6cb0}.xl\:hover\:to-blue-800:hover{--gradient-to-color:#2c5282}.xl\:hover\:to-blue-900:hover{--gradient-to-color:#2a4365}.xl\:hover\:to-indigo-100:hover{--gradient-to-color:#ebf4ff}.xl\:hover\:to-indigo-200:hover{--gradient-to-color:#c3dafe}.xl\:hover\:to-indigo-300:hover{--gradient-to-color:#a3bffa}.xl\:hover\:to-indigo-400:hover{--gradient-to-color:#7f9cf5}.xl\:hover\:to-indigo-500:hover{--gradient-to-color:#667eea}.xl\:hover\:to-indigo-600:hover{--gradient-to-color:#5a67d8}.xl\:hover\:to-indigo-700:hover{--gradient-to-color:#4c51bf}.xl\:hover\:to-indigo-800:hover{--gradient-to-color:#434190}.xl\:hover\:to-indigo-900:hover{--gradient-to-color:#3c366b}.xl\:hover\:to-purple-100:hover{--gradient-to-color:#faf5ff}.xl\:hover\:to-purple-200:hover{--gradient-to-color:#e9d8fd}.xl\:hover\:to-purple-300:hover{--gradient-to-color:#d6bcfa}.xl\:hover\:to-purple-400:hover{--gradient-to-color:#b794f4}.xl\:hover\:to-purple-500:hover{--gradient-to-color:#9f7aea}.xl\:hover\:to-purple-600:hover{--gradient-to-color:#805ad5}.xl\:hover\:to-purple-700:hover{--gradient-to-color:#6b46c1}.xl\:hover\:to-purple-800:hover{--gradient-to-color:#553c9a}.xl\:hover\:to-purple-900:hover{--gradient-to-color:#44337a}.xl\:hover\:to-pink-100:hover{--gradient-to-color:#fff5f7}.xl\:hover\:to-pink-200:hover{--gradient-to-color:#fed7e2}.xl\:hover\:to-pink-300:hover{--gradient-to-color:#fbb6ce}.xl\:hover\:to-pink-400:hover{--gradient-to-color:#f687b3}.xl\:hover\:to-pink-500:hover{--gradient-to-color:#ed64a6}.xl\:hover\:to-pink-600:hover{--gradient-to-color:#d53f8c}.xl\:hover\:to-pink-700:hover{--gradient-to-color:#b83280}.xl\:hover\:to-pink-800:hover{--gradient-to-color:#97266d}.xl\:hover\:to-pink-900:hover{--gradient-to-color:#702459}.xl\:focus\:from-transparent:focus{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:focus\:from-current:focus{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:focus\:from-black:focus{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:focus\:from-white:focus{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:focus\:from-gray-100:focus{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.xl\:focus\:from-gray-200:focus{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.xl\:focus\:from-gray-300:focus{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.xl\:focus\:from-gray-400:focus{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.xl\:focus\:from-gray-500:focus{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.xl\:focus\:from-gray-600:focus{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.xl\:focus\:from-gray-700:focus{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.xl\:focus\:from-gray-800:focus{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.xl\:focus\:from-gray-900:focus{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.xl\:focus\:from-red-100:focus{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.xl\:focus\:from-red-200:focus{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.xl\:focus\:from-red-300:focus{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.xl\:focus\:from-red-400:focus{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.xl\:focus\:from-red-500:focus{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.xl\:focus\:from-red-600:focus{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.xl\:focus\:from-red-700:focus{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.xl\:focus\:from-red-800:focus{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.xl\:focus\:from-red-900:focus{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.xl\:focus\:from-orange-100:focus{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.xl\:focus\:from-orange-200:focus{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.xl\:focus\:from-orange-300:focus{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.xl\:focus\:from-orange-400:focus{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.xl\:focus\:from-orange-500:focus{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.xl\:focus\:from-orange-600:focus{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.xl\:focus\:from-orange-700:focus{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.xl\:focus\:from-orange-800:focus{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.xl\:focus\:from-orange-900:focus{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.xl\:focus\:from-yellow-100:focus{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.xl\:focus\:from-yellow-200:focus{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.xl\:focus\:from-yellow-300:focus{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.xl\:focus\:from-yellow-400:focus{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.xl\:focus\:from-yellow-500:focus{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.xl\:focus\:from-yellow-600:focus{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.xl\:focus\:from-yellow-700:focus{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.xl\:focus\:from-yellow-800:focus{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.xl\:focus\:from-yellow-900:focus{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.xl\:focus\:from-green-100:focus{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.xl\:focus\:from-green-200:focus{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.xl\:focus\:from-green-300:focus{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.xl\:focus\:from-green-400:focus{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.xl\:focus\:from-green-500:focus{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.xl\:focus\:from-green-600:focus{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.xl\:focus\:from-green-700:focus{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.xl\:focus\:from-green-800:focus{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.xl\:focus\:from-green-900:focus{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.xl\:focus\:from-teal-100:focus{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.xl\:focus\:from-teal-200:focus{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.xl\:focus\:from-teal-300:focus{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.xl\:focus\:from-teal-400:focus{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.xl\:focus\:from-teal-500:focus{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.xl\:focus\:from-teal-600:focus{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.xl\:focus\:from-teal-700:focus{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.xl\:focus\:from-teal-800:focus{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.xl\:focus\:from-teal-900:focus{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.xl\:focus\:from-blue-100:focus{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.xl\:focus\:from-blue-200:focus{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.xl\:focus\:from-blue-300:focus{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.xl\:focus\:from-blue-400:focus{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.xl\:focus\:from-blue-500:focus{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.xl\:focus\:from-blue-600:focus{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.xl\:focus\:from-blue-700:focus{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.xl\:focus\:from-blue-800:focus{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.xl\:focus\:from-blue-900:focus{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.xl\:focus\:from-indigo-100:focus{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.xl\:focus\:from-indigo-200:focus{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.xl\:focus\:from-indigo-300:focus{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.xl\:focus\:from-indigo-400:focus{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.xl\:focus\:from-indigo-500:focus{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.xl\:focus\:from-indigo-600:focus{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.xl\:focus\:from-indigo-700:focus{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.xl\:focus\:from-indigo-800:focus{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.xl\:focus\:from-indigo-900:focus{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.xl\:focus\:from-purple-100:focus{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.xl\:focus\:from-purple-200:focus{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.xl\:focus\:from-purple-300:focus{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.xl\:focus\:from-purple-400:focus{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.xl\:focus\:from-purple-500:focus{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.xl\:focus\:from-purple-600:focus{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.xl\:focus\:from-purple-700:focus{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.xl\:focus\:from-purple-800:focus{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.xl\:focus\:from-purple-900:focus{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.xl\:focus\:from-pink-100:focus{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.xl\:focus\:from-pink-200:focus{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.xl\:focus\:from-pink-300:focus{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.xl\:focus\:from-pink-400:focus{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.xl\:focus\:from-pink-500:focus{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.xl\:focus\:from-pink-600:focus{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.xl\:focus\:from-pink-700:focus{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.xl\:focus\:from-pink-800:focus{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.xl\:focus\:from-pink-900:focus{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.xl\:focus\:via-transparent:focus{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:focus\:via-current:focus{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:focus\:via-black:focus{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:focus\:via-white:focus{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:focus\:via-gray-100:focus{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.xl\:focus\:via-gray-200:focus{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.xl\:focus\:via-gray-300:focus{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.xl\:focus\:via-gray-400:focus{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.xl\:focus\:via-gray-500:focus{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.xl\:focus\:via-gray-600:focus{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.xl\:focus\:via-gray-700:focus{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.xl\:focus\:via-gray-800:focus{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.xl\:focus\:via-gray-900:focus{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.xl\:focus\:via-red-100:focus{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.xl\:focus\:via-red-200:focus{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.xl\:focus\:via-red-300:focus{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.xl\:focus\:via-red-400:focus{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.xl\:focus\:via-red-500:focus{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.xl\:focus\:via-red-600:focus{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.xl\:focus\:via-red-700:focus{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.xl\:focus\:via-red-800:focus{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.xl\:focus\:via-red-900:focus{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.xl\:focus\:via-orange-100:focus{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.xl\:focus\:via-orange-200:focus{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.xl\:focus\:via-orange-300:focus{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.xl\:focus\:via-orange-400:focus{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.xl\:focus\:via-orange-500:focus{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.xl\:focus\:via-orange-600:focus{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.xl\:focus\:via-orange-700:focus{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.xl\:focus\:via-orange-800:focus{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.xl\:focus\:via-orange-900:focus{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.xl\:focus\:via-yellow-100:focus{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.xl\:focus\:via-yellow-200:focus{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.xl\:focus\:via-yellow-300:focus{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.xl\:focus\:via-yellow-400:focus{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.xl\:focus\:via-yellow-500:focus{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.xl\:focus\:via-yellow-600:focus{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.xl\:focus\:via-yellow-700:focus{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.xl\:focus\:via-yellow-800:focus{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.xl\:focus\:via-yellow-900:focus{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.xl\:focus\:via-green-100:focus{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.xl\:focus\:via-green-200:focus{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.xl\:focus\:via-green-300:focus{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.xl\:focus\:via-green-400:focus{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.xl\:focus\:via-green-500:focus{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.xl\:focus\:via-green-600:focus{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.xl\:focus\:via-green-700:focus{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.xl\:focus\:via-green-800:focus{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.xl\:focus\:via-green-900:focus{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.xl\:focus\:via-teal-100:focus{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.xl\:focus\:via-teal-200:focus{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.xl\:focus\:via-teal-300:focus{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.xl\:focus\:via-teal-400:focus{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.xl\:focus\:via-teal-500:focus{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.xl\:focus\:via-teal-600:focus{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.xl\:focus\:via-teal-700:focus{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.xl\:focus\:via-teal-800:focus{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.xl\:focus\:via-teal-900:focus{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.xl\:focus\:via-blue-100:focus{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.xl\:focus\:via-blue-200:focus{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.xl\:focus\:via-blue-300:focus{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.xl\:focus\:via-blue-400:focus{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.xl\:focus\:via-blue-500:focus{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.xl\:focus\:via-blue-600:focus{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.xl\:focus\:via-blue-700:focus{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.xl\:focus\:via-blue-800:focus{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.xl\:focus\:via-blue-900:focus{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.xl\:focus\:via-indigo-100:focus{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.xl\:focus\:via-indigo-200:focus{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.xl\:focus\:via-indigo-300:focus{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.xl\:focus\:via-indigo-400:focus{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.xl\:focus\:via-indigo-500:focus{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.xl\:focus\:via-indigo-600:focus{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.xl\:focus\:via-indigo-700:focus{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.xl\:focus\:via-indigo-800:focus{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.xl\:focus\:via-indigo-900:focus{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.xl\:focus\:via-purple-100:focus{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.xl\:focus\:via-purple-200:focus{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.xl\:focus\:via-purple-300:focus{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.xl\:focus\:via-purple-400:focus{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.xl\:focus\:via-purple-500:focus{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.xl\:focus\:via-purple-600:focus{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.xl\:focus\:via-purple-700:focus{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.xl\:focus\:via-purple-800:focus{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.xl\:focus\:via-purple-900:focus{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.xl\:focus\:via-pink-100:focus{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.xl\:focus\:via-pink-200:focus{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.xl\:focus\:via-pink-300:focus{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.xl\:focus\:via-pink-400:focus{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.xl\:focus\:via-pink-500:focus{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.xl\:focus\:via-pink-600:focus{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.xl\:focus\:via-pink-700:focus{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.xl\:focus\:via-pink-800:focus{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.xl\:focus\:via-pink-900:focus{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.xl\:focus\:to-transparent:focus{--gradient-to-color:transparent}.xl\:focus\:to-current:focus{--gradient-to-color:currentColor}.xl\:focus\:to-black:focus{--gradient-to-color:#000}.xl\:focus\:to-white:focus{--gradient-to-color:#fff}.xl\:focus\:to-gray-100:focus{--gradient-to-color:#f7fafc}.xl\:focus\:to-gray-200:focus{--gradient-to-color:#edf2f7}.xl\:focus\:to-gray-300:focus{--gradient-to-color:#e2e8f0}.xl\:focus\:to-gray-400:focus{--gradient-to-color:#cbd5e0}.xl\:focus\:to-gray-500:focus{--gradient-to-color:#a0aec0}.xl\:focus\:to-gray-600:focus{--gradient-to-color:#718096}.xl\:focus\:to-gray-700:focus{--gradient-to-color:#4a5568}.xl\:focus\:to-gray-800:focus{--gradient-to-color:#2d3748}.xl\:focus\:to-gray-900:focus{--gradient-to-color:#1a202c}.xl\:focus\:to-red-100:focus{--gradient-to-color:#fff5f5}.xl\:focus\:to-red-200:focus{--gradient-to-color:#fed7d7}.xl\:focus\:to-red-300:focus{--gradient-to-color:#feb2b2}.xl\:focus\:to-red-400:focus{--gradient-to-color:#fc8181}.xl\:focus\:to-red-500:focus{--gradient-to-color:#f56565}.xl\:focus\:to-red-600:focus{--gradient-to-color:#e53e3e}.xl\:focus\:to-red-700:focus{--gradient-to-color:#c53030}.xl\:focus\:to-red-800:focus{--gradient-to-color:#9b2c2c}.xl\:focus\:to-red-900:focus{--gradient-to-color:#742a2a}.xl\:focus\:to-orange-100:focus{--gradient-to-color:#fffaf0}.xl\:focus\:to-orange-200:focus{--gradient-to-color:#feebc8}.xl\:focus\:to-orange-300:focus{--gradient-to-color:#fbd38d}.xl\:focus\:to-orange-400:focus{--gradient-to-color:#f6ad55}.xl\:focus\:to-orange-500:focus{--gradient-to-color:#ed8936}.xl\:focus\:to-orange-600:focus{--gradient-to-color:#dd6b20}.xl\:focus\:to-orange-700:focus{--gradient-to-color:#c05621}.xl\:focus\:to-orange-800:focus{--gradient-to-color:#9c4221}.xl\:focus\:to-orange-900:focus{--gradient-to-color:#7b341e}.xl\:focus\:to-yellow-100:focus{--gradient-to-color:#fffff0}.xl\:focus\:to-yellow-200:focus{--gradient-to-color:#fefcbf}.xl\:focus\:to-yellow-300:focus{--gradient-to-color:#faf089}.xl\:focus\:to-yellow-400:focus{--gradient-to-color:#f6e05e}.xl\:focus\:to-yellow-500:focus{--gradient-to-color:#ecc94b}.xl\:focus\:to-yellow-600:focus{--gradient-to-color:#d69e2e}.xl\:focus\:to-yellow-700:focus{--gradient-to-color:#b7791f}.xl\:focus\:to-yellow-800:focus{--gradient-to-color:#975a16}.xl\:focus\:to-yellow-900:focus{--gradient-to-color:#744210}.xl\:focus\:to-green-100:focus{--gradient-to-color:#f0fff4}.xl\:focus\:to-green-200:focus{--gradient-to-color:#c6f6d5}.xl\:focus\:to-green-300:focus{--gradient-to-color:#9ae6b4}.xl\:focus\:to-green-400:focus{--gradient-to-color:#68d391}.xl\:focus\:to-green-500:focus{--gradient-to-color:#48bb78}.xl\:focus\:to-green-600:focus{--gradient-to-color:#38a169}.xl\:focus\:to-green-700:focus{--gradient-to-color:#2f855a}.xl\:focus\:to-green-800:focus{--gradient-to-color:#276749}.xl\:focus\:to-green-900:focus{--gradient-to-color:#22543d}.xl\:focus\:to-teal-100:focus{--gradient-to-color:#e6fffa}.xl\:focus\:to-teal-200:focus{--gradient-to-color:#b2f5ea}.xl\:focus\:to-teal-300:focus{--gradient-to-color:#81e6d9}.xl\:focus\:to-teal-400:focus{--gradient-to-color:#4fd1c5}.xl\:focus\:to-teal-500:focus{--gradient-to-color:#38b2ac}.xl\:focus\:to-teal-600:focus{--gradient-to-color:#319795}.xl\:focus\:to-teal-700:focus{--gradient-to-color:#2c7a7b}.xl\:focus\:to-teal-800:focus{--gradient-to-color:#285e61}.xl\:focus\:to-teal-900:focus{--gradient-to-color:#234e52}.xl\:focus\:to-blue-100:focus{--gradient-to-color:#ebf8ff}.xl\:focus\:to-blue-200:focus{--gradient-to-color:#bee3f8}.xl\:focus\:to-blue-300:focus{--gradient-to-color:#90cdf4}.xl\:focus\:to-blue-400:focus{--gradient-to-color:#63b3ed}.xl\:focus\:to-blue-500:focus{--gradient-to-color:#4299e1}.xl\:focus\:to-blue-600:focus{--gradient-to-color:#3182ce}.xl\:focus\:to-blue-700:focus{--gradient-to-color:#2b6cb0}.xl\:focus\:to-blue-800:focus{--gradient-to-color:#2c5282}.xl\:focus\:to-blue-900:focus{--gradient-to-color:#2a4365}.xl\:focus\:to-indigo-100:focus{--gradient-to-color:#ebf4ff}.xl\:focus\:to-indigo-200:focus{--gradient-to-color:#c3dafe}.xl\:focus\:to-indigo-300:focus{--gradient-to-color:#a3bffa}.xl\:focus\:to-indigo-400:focus{--gradient-to-color:#7f9cf5}.xl\:focus\:to-indigo-500:focus{--gradient-to-color:#667eea}.xl\:focus\:to-indigo-600:focus{--gradient-to-color:#5a67d8}.xl\:focus\:to-indigo-700:focus{--gradient-to-color:#4c51bf}.xl\:focus\:to-indigo-800:focus{--gradient-to-color:#434190}.xl\:focus\:to-indigo-900:focus{--gradient-to-color:#3c366b}.xl\:focus\:to-purple-100:focus{--gradient-to-color:#faf5ff}.xl\:focus\:to-purple-200:focus{--gradient-to-color:#e9d8fd}.xl\:focus\:to-purple-300:focus{--gradient-to-color:#d6bcfa}.xl\:focus\:to-purple-400:focus{--gradient-to-color:#b794f4}.xl\:focus\:to-purple-500:focus{--gradient-to-color:#9f7aea}.xl\:focus\:to-purple-600:focus{--gradient-to-color:#805ad5}.xl\:focus\:to-purple-700:focus{--gradient-to-color:#6b46c1}.xl\:focus\:to-purple-800:focus{--gradient-to-color:#553c9a}.xl\:focus\:to-purple-900:focus{--gradient-to-color:#44337a}.xl\:focus\:to-pink-100:focus{--gradient-to-color:#fff5f7}.xl\:focus\:to-pink-200:focus{--gradient-to-color:#fed7e2}.xl\:focus\:to-pink-300:focus{--gradient-to-color:#fbb6ce}.xl\:focus\:to-pink-400:focus{--gradient-to-color:#f687b3}.xl\:focus\:to-pink-500:focus{--gradient-to-color:#ed64a6}.xl\:focus\:to-pink-600:focus{--gradient-to-color:#d53f8c}.xl\:focus\:to-pink-700:focus{--gradient-to-color:#b83280}.xl\:focus\:to-pink-800:focus{--gradient-to-color:#97266d}.xl\:focus\:to-pink-900:focus{--gradient-to-color:#702459}.xl\:bg-opacity-0{--bg-opacity:0}.xl\:bg-opacity-25{--bg-opacity:0.25}.xl\:bg-opacity-50{--bg-opacity:0.5}.xl\:bg-opacity-75{--bg-opacity:0.75}.xl\:bg-opacity-100{--bg-opacity:1}.xl\:hover\:bg-opacity-0:hover{--bg-opacity:0}.xl\:hover\:bg-opacity-25:hover{--bg-opacity:0.25}.xl\:hover\:bg-opacity-50:hover{--bg-opacity:0.5}.xl\:hover\:bg-opacity-75:hover{--bg-opacity:0.75}.xl\:hover\:bg-opacity-100:hover{--bg-opacity:1}.xl\:focus\:bg-opacity-0:focus{--bg-opacity:0}.xl\:focus\:bg-opacity-25:focus{--bg-opacity:0.25}.xl\:focus\:bg-opacity-50:focus{--bg-opacity:0.5}.xl\:focus\:bg-opacity-75:focus{--bg-opacity:0.75}.xl\:focus\:bg-opacity-100:focus{--bg-opacity:1}.xl\:bg-bottom{background-position:bottom}.xl\:bg-center{background-position:center}.xl\:bg-left{background-position:left}.xl\:bg-left-bottom{background-position:left bottom}.xl\:bg-left-top{background-position:left top}.xl\:bg-right{background-position:right}.xl\:bg-right-bottom{background-position:right bottom}.xl\:bg-right-top{background-position:right top}.xl\:bg-top{background-position:top}.xl\:bg-repeat{background-repeat:repeat}.xl\:bg-no-repeat{background-repeat:no-repeat}.xl\:bg-repeat-x{background-repeat:repeat-x}.xl\:bg-repeat-y{background-repeat:repeat-y}.xl\:bg-repeat-round{background-repeat:round}.xl\:bg-repeat-space{background-repeat:space}.xl\:bg-auto{background-size:auto}.xl\:bg-cover{background-size:cover}.xl\:bg-contain{background-size:contain}.xl\:border-collapse{border-collapse:collapse}.xl\:border-separate{border-collapse:separate}.xl\:border-transparent{border-color:transparent}.xl\:border-current{border-color:currentColor}.xl\:border-black{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.xl\:border-white{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.xl\:border-gray-100{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.xl\:border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.xl\:border-gray-300{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.xl\:border-gray-400{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.xl\:border-gray-500{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.xl\:border-gray-600{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.xl\:border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.xl\:border-gray-800{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.xl\:border-gray-900{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.xl\:border-red-100{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.xl\:border-red-200{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.xl\:border-red-300{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.xl\:border-red-400{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.xl\:border-red-500{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.xl\:border-red-600{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.xl\:border-red-700{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.xl\:border-red-800{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.xl\:border-red-900{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.xl\:border-orange-100{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.xl\:border-orange-200{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.xl\:border-orange-300{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.xl\:border-orange-400{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.xl\:border-orange-500{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.xl\:border-orange-600{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.xl\:border-orange-700{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.xl\:border-orange-800{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.xl\:border-orange-900{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.xl\:border-yellow-100{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.xl\:border-yellow-200{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.xl\:border-yellow-300{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.xl\:border-yellow-400{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.xl\:border-yellow-500{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.xl\:border-yellow-600{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.xl\:border-yellow-700{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.xl\:border-yellow-800{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.xl\:border-yellow-900{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.xl\:border-green-100{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.xl\:border-green-200{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.xl\:border-green-300{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.xl\:border-green-400{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.xl\:border-green-500{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.xl\:border-green-600{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.xl\:border-green-700{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.xl\:border-green-800{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.xl\:border-green-900{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.xl\:border-teal-100{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.xl\:border-teal-200{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.xl\:border-teal-300{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.xl\:border-teal-400{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.xl\:border-teal-500{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.xl\:border-teal-600{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.xl\:border-teal-700{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.xl\:border-teal-800{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.xl\:border-teal-900{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.xl\:border-blue-100{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.xl\:border-blue-200{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.xl\:border-blue-300{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.xl\:border-blue-400{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.xl\:border-blue-500{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.xl\:border-blue-600{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.xl\:border-blue-700{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.xl\:border-blue-800{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.xl\:border-blue-900{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.xl\:border-indigo-100{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.xl\:border-indigo-200{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.xl\:border-indigo-300{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.xl\:border-indigo-400{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.xl\:border-indigo-500{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.xl\:border-indigo-600{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.xl\:border-indigo-700{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.xl\:border-indigo-800{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.xl\:border-indigo-900{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.xl\:border-purple-100{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.xl\:border-purple-200{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.xl\:border-purple-300{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.xl\:border-purple-400{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.xl\:border-purple-500{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.xl\:border-purple-600{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.xl\:border-purple-700{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.xl\:border-purple-800{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.xl\:border-purple-900{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.xl\:border-pink-100{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.xl\:border-pink-200{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.xl\:border-pink-300{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.xl\:border-pink-400{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.xl\:border-pink-500{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.xl\:border-pink-600{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.xl\:border-pink-700{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.xl\:border-pink-800{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.xl\:border-pink-900{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.xl\:hover\:border-transparent:hover{border-color:transparent}.xl\:hover\:border-current:hover{border-color:currentColor}.xl\:hover\:border-black:hover{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.xl\:hover\:border-white:hover{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.xl\:hover\:border-gray-100:hover{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.xl\:hover\:border-gray-200:hover{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.xl\:hover\:border-gray-300:hover{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.xl\:hover\:border-gray-400:hover{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.xl\:hover\:border-gray-500:hover{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.xl\:hover\:border-gray-600:hover{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.xl\:hover\:border-gray-700:hover{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.xl\:hover\:border-gray-800:hover{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.xl\:hover\:border-gray-900:hover{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.xl\:hover\:border-red-100:hover{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.xl\:hover\:border-red-200:hover{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.xl\:hover\:border-red-300:hover{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.xl\:hover\:border-red-400:hover{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.xl\:hover\:border-red-500:hover{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.xl\:hover\:border-red-600:hover{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.xl\:hover\:border-red-700:hover{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.xl\:hover\:border-red-800:hover{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.xl\:hover\:border-red-900:hover{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.xl\:hover\:border-orange-100:hover{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.xl\:hover\:border-orange-200:hover{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.xl\:hover\:border-orange-300:hover{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.xl\:hover\:border-orange-400:hover{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.xl\:hover\:border-orange-500:hover{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.xl\:hover\:border-orange-600:hover{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.xl\:hover\:border-orange-700:hover{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.xl\:hover\:border-orange-800:hover{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.xl\:hover\:border-orange-900:hover{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.xl\:hover\:border-yellow-100:hover{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.xl\:hover\:border-yellow-200:hover{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.xl\:hover\:border-yellow-300:hover{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.xl\:hover\:border-yellow-400:hover{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.xl\:hover\:border-yellow-500:hover{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.xl\:hover\:border-yellow-600:hover{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.xl\:hover\:border-yellow-700:hover{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.xl\:hover\:border-yellow-800:hover{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.xl\:hover\:border-yellow-900:hover{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.xl\:hover\:border-green-100:hover{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.xl\:hover\:border-green-200:hover{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.xl\:hover\:border-green-300:hover{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.xl\:hover\:border-green-400:hover{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.xl\:hover\:border-green-500:hover{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.xl\:hover\:border-green-600:hover{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.xl\:hover\:border-green-700:hover{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.xl\:hover\:border-green-800:hover{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.xl\:hover\:border-green-900:hover{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.xl\:hover\:border-teal-100:hover{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.xl\:hover\:border-teal-200:hover{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.xl\:hover\:border-teal-300:hover{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.xl\:hover\:border-teal-400:hover{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.xl\:hover\:border-teal-500:hover{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.xl\:hover\:border-teal-600:hover{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.xl\:hover\:border-teal-700:hover{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.xl\:hover\:border-teal-800:hover{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.xl\:hover\:border-teal-900:hover{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.xl\:hover\:border-blue-100:hover{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.xl\:hover\:border-blue-200:hover{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.xl\:hover\:border-blue-300:hover{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.xl\:hover\:border-blue-400:hover{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.xl\:hover\:border-blue-500:hover{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.xl\:hover\:border-blue-600:hover{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.xl\:hover\:border-blue-700:hover{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.xl\:hover\:border-blue-800:hover{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.xl\:hover\:border-blue-900:hover{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.xl\:hover\:border-indigo-100:hover{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.xl\:hover\:border-indigo-200:hover{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.xl\:hover\:border-indigo-300:hover{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.xl\:hover\:border-indigo-400:hover{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.xl\:hover\:border-indigo-500:hover{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.xl\:hover\:border-indigo-600:hover{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.xl\:hover\:border-indigo-700:hover{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.xl\:hover\:border-indigo-800:hover{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.xl\:hover\:border-indigo-900:hover{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.xl\:hover\:border-purple-100:hover{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.xl\:hover\:border-purple-200:hover{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.xl\:hover\:border-purple-300:hover{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.xl\:hover\:border-purple-400:hover{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.xl\:hover\:border-purple-500:hover{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.xl\:hover\:border-purple-600:hover{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.xl\:hover\:border-purple-700:hover{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.xl\:hover\:border-purple-800:hover{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.xl\:hover\:border-purple-900:hover{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.xl\:hover\:border-pink-100:hover{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.xl\:hover\:border-pink-200:hover{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.xl\:hover\:border-pink-300:hover{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.xl\:hover\:border-pink-400:hover{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.xl\:hover\:border-pink-500:hover{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.xl\:hover\:border-pink-600:hover{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.xl\:hover\:border-pink-700:hover{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.xl\:hover\:border-pink-800:hover{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.xl\:hover\:border-pink-900:hover{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.xl\:focus\:border-transparent:focus{border-color:transparent}.xl\:focus\:border-current:focus{border-color:currentColor}.xl\:focus\:border-black:focus{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.xl\:focus\:border-white:focus{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.xl\:focus\:border-gray-100:focus{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.xl\:focus\:border-gray-200:focus{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.xl\:focus\:border-gray-300:focus{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.xl\:focus\:border-gray-400:focus{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.xl\:focus\:border-gray-500:focus{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.xl\:focus\:border-gray-600:focus{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.xl\:focus\:border-gray-700:focus{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.xl\:focus\:border-gray-800:focus{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.xl\:focus\:border-gray-900:focus{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.xl\:focus\:border-red-100:focus{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.xl\:focus\:border-red-200:focus{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.xl\:focus\:border-red-300:focus{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.xl\:focus\:border-red-400:focus{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.xl\:focus\:border-red-500:focus{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.xl\:focus\:border-red-600:focus{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.xl\:focus\:border-red-700:focus{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.xl\:focus\:border-red-800:focus{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.xl\:focus\:border-red-900:focus{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.xl\:focus\:border-orange-100:focus{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.xl\:focus\:border-orange-200:focus{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.xl\:focus\:border-orange-300:focus{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.xl\:focus\:border-orange-400:focus{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.xl\:focus\:border-orange-500:focus{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.xl\:focus\:border-orange-600:focus{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.xl\:focus\:border-orange-700:focus{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.xl\:focus\:border-orange-800:focus{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.xl\:focus\:border-orange-900:focus{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.xl\:focus\:border-yellow-100:focus{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.xl\:focus\:border-yellow-200:focus{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.xl\:focus\:border-yellow-300:focus{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.xl\:focus\:border-yellow-400:focus{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.xl\:focus\:border-yellow-500:focus{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.xl\:focus\:border-yellow-600:focus{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.xl\:focus\:border-yellow-700:focus{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.xl\:focus\:border-yellow-800:focus{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.xl\:focus\:border-yellow-900:focus{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.xl\:focus\:border-green-100:focus{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.xl\:focus\:border-green-200:focus{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.xl\:focus\:border-green-300:focus{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.xl\:focus\:border-green-400:focus{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.xl\:focus\:border-green-500:focus{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.xl\:focus\:border-green-600:focus{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.xl\:focus\:border-green-700:focus{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.xl\:focus\:border-green-800:focus{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.xl\:focus\:border-green-900:focus{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.xl\:focus\:border-teal-100:focus{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.xl\:focus\:border-teal-200:focus{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.xl\:focus\:border-teal-300:focus{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.xl\:focus\:border-teal-400:focus{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.xl\:focus\:border-teal-500:focus{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.xl\:focus\:border-teal-600:focus{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.xl\:focus\:border-teal-700:focus{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.xl\:focus\:border-teal-800:focus{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.xl\:focus\:border-teal-900:focus{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.xl\:focus\:border-blue-100:focus{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.xl\:focus\:border-blue-200:focus{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.xl\:focus\:border-blue-300:focus{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.xl\:focus\:border-blue-400:focus{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.xl\:focus\:border-blue-500:focus{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.xl\:focus\:border-blue-600:focus{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.xl\:focus\:border-blue-700:focus{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.xl\:focus\:border-blue-800:focus{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.xl\:focus\:border-blue-900:focus{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.xl\:focus\:border-indigo-100:focus{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.xl\:focus\:border-indigo-200:focus{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.xl\:focus\:border-indigo-300:focus{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.xl\:focus\:border-indigo-400:focus{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.xl\:focus\:border-indigo-500:focus{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.xl\:focus\:border-indigo-600:focus{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.xl\:focus\:border-indigo-700:focus{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.xl\:focus\:border-indigo-800:focus{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.xl\:focus\:border-indigo-900:focus{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.xl\:focus\:border-purple-100:focus{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.xl\:focus\:border-purple-200:focus{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.xl\:focus\:border-purple-300:focus{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.xl\:focus\:border-purple-400:focus{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.xl\:focus\:border-purple-500:focus{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.xl\:focus\:border-purple-600:focus{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.xl\:focus\:border-purple-700:focus{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.xl\:focus\:border-purple-800:focus{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.xl\:focus\:border-purple-900:focus{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.xl\:focus\:border-pink-100:focus{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.xl\:focus\:border-pink-200:focus{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.xl\:focus\:border-pink-300:focus{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.xl\:focus\:border-pink-400:focus{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.xl\:focus\:border-pink-500:focus{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.xl\:focus\:border-pink-600:focus{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.xl\:focus\:border-pink-700:focus{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.xl\:focus\:border-pink-800:focus{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.xl\:focus\:border-pink-900:focus{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.xl\:border-opacity-0{--border-opacity:0}.xl\:border-opacity-25{--border-opacity:0.25}.xl\:border-opacity-50{--border-opacity:0.5}.xl\:border-opacity-75{--border-opacity:0.75}.xl\:border-opacity-100{--border-opacity:1}.xl\:hover\:border-opacity-0:hover{--border-opacity:0}.xl\:hover\:border-opacity-25:hover{--border-opacity:0.25}.xl\:hover\:border-opacity-50:hover{--border-opacity:0.5}.xl\:hover\:border-opacity-75:hover{--border-opacity:0.75}.xl\:hover\:border-opacity-100:hover{--border-opacity:1}.xl\:focus\:border-opacity-0:focus{--border-opacity:0}.xl\:focus\:border-opacity-25:focus{--border-opacity:0.25}.xl\:focus\:border-opacity-50:focus{--border-opacity:0.5}.xl\:focus\:border-opacity-75:focus{--border-opacity:0.75}.xl\:focus\:border-opacity-100:focus{--border-opacity:1}.xl\:rounded-none{border-radius:0}.xl\:rounded-sm{border-radius:.125rem}.xl\:rounded{border-radius:.25rem}.xl\:rounded-md{border-radius:.375rem}.xl\:rounded-lg{border-radius:.5rem}.xl\:rounded-xl{border-radius:.75rem}.xl\:rounded-2xl{border-radius:1rem}.xl\:rounded-3xl{border-radius:1.5rem}.xl\:rounded-full{border-radius:9999px}.xl\:rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.xl\:rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.xl\:rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.xl\:rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.xl\:rounded-t-sm{border-top-left-radius:.125rem;border-top-right-radius:.125rem}.xl\:rounded-r-sm{border-top-right-radius:.125rem;border-bottom-right-radius:.125rem}.xl\:rounded-b-sm{border-bottom-right-radius:.125rem;border-bottom-left-radius:.125rem}.xl\:rounded-l-sm{border-top-left-radius:.125rem;border-bottom-left-radius:.125rem}.xl\:rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.xl\:rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.xl\:rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.xl\:rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.xl\:rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.xl\:rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.xl\:rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.xl\:rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.xl\:rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.xl\:rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.xl\:rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.xl\:rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.xl\:rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.xl\:rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.xl\:rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.xl\:rounded-l-xl{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.xl\:rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.xl\:rounded-r-2xl{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.xl\:rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.xl\:rounded-l-2xl{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.xl\:rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.xl\:rounded-r-3xl{border-top-right-radius:1.5rem;border-bottom-right-radius:1.5rem}.xl\:rounded-b-3xl{border-bottom-right-radius:1.5rem;border-bottom-left-radius:1.5rem}.xl\:rounded-l-3xl{border-top-left-radius:1.5rem;border-bottom-left-radius:1.5rem}.xl\:rounded-t-full{border-top-left-radius:9999px;border-top-right-radius:9999px}.xl\:rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.xl\:rounded-b-full{border-bottom-right-radius:9999px;border-bottom-left-radius:9999px}.xl\:rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.xl\:rounded-tl-none{border-top-left-radius:0}.xl\:rounded-tr-none{border-top-right-radius:0}.xl\:rounded-br-none{border-bottom-right-radius:0}.xl\:rounded-bl-none{border-bottom-left-radius:0}.xl\:rounded-tl-sm{border-top-left-radius:.125rem}.xl\:rounded-tr-sm{border-top-right-radius:.125rem}.xl\:rounded-br-sm{border-bottom-right-radius:.125rem}.xl\:rounded-bl-sm{border-bottom-left-radius:.125rem}.xl\:rounded-tl{border-top-left-radius:.25rem}.xl\:rounded-tr{border-top-right-radius:.25rem}.xl\:rounded-br{border-bottom-right-radius:.25rem}.xl\:rounded-bl{border-bottom-left-radius:.25rem}.xl\:rounded-tl-md{border-top-left-radius:.375rem}.xl\:rounded-tr-md{border-top-right-radius:.375rem}.xl\:rounded-br-md{border-bottom-right-radius:.375rem}.xl\:rounded-bl-md{border-bottom-left-radius:.375rem}.xl\:rounded-tl-lg{border-top-left-radius:.5rem}.xl\:rounded-tr-lg{border-top-right-radius:.5rem}.xl\:rounded-br-lg{border-bottom-right-radius:.5rem}.xl\:rounded-bl-lg{border-bottom-left-radius:.5rem}.xl\:rounded-tl-xl{border-top-left-radius:.75rem}.xl\:rounded-tr-xl{border-top-right-radius:.75rem}.xl\:rounded-br-xl{border-bottom-right-radius:.75rem}.xl\:rounded-bl-xl{border-bottom-left-radius:.75rem}.xl\:rounded-tl-2xl{border-top-left-radius:1rem}.xl\:rounded-tr-2xl{border-top-right-radius:1rem}.xl\:rounded-br-2xl{border-bottom-right-radius:1rem}.xl\:rounded-bl-2xl{border-bottom-left-radius:1rem}.xl\:rounded-tl-3xl{border-top-left-radius:1.5rem}.xl\:rounded-tr-3xl{border-top-right-radius:1.5rem}.xl\:rounded-br-3xl{border-bottom-right-radius:1.5rem}.xl\:rounded-bl-3xl{border-bottom-left-radius:1.5rem}.xl\:rounded-tl-full{border-top-left-radius:9999px}.xl\:rounded-tr-full{border-top-right-radius:9999px}.xl\:rounded-br-full{border-bottom-right-radius:9999px}.xl\:rounded-bl-full{border-bottom-left-radius:9999px}.xl\:border-solid{border-style:solid}.xl\:border-dashed{border-style:dashed}.xl\:border-dotted{border-style:dotted}.xl\:border-double{border-style:double}.xl\:border-none{border-style:none}.xl\:border-0{border-width:0}.xl\:border-2{border-width:2px}.xl\:border-4{border-width:4px}.xl\:border-8{border-width:8px}.xl\:border{border-width:1px}.xl\:border-t-0{border-top-width:0}.xl\:border-r-0{border-right-width:0}.xl\:border-b-0{border-bottom-width:0}.xl\:border-l-0{border-left-width:0}.xl\:border-t-2{border-top-width:2px}.xl\:border-r-2{border-right-width:2px}.xl\:border-b-2{border-bottom-width:2px}.xl\:border-l-2{border-left-width:2px}.xl\:border-t-4{border-top-width:4px}.xl\:border-r-4{border-right-width:4px}.xl\:border-b-4{border-bottom-width:4px}.xl\:border-l-4{border-left-width:4px}.xl\:border-t-8{border-top-width:8px}.xl\:border-r-8{border-right-width:8px}.xl\:border-b-8{border-bottom-width:8px}.xl\:border-l-8{border-left-width:8px}.xl\:border-t{border-top-width:1px}.xl\:border-r{border-right-width:1px}.xl\:border-b{border-bottom-width:1px}.xl\:border-l{border-left-width:1px}.xl\:box-border{box-sizing:border-box}.xl\:box-content{box-sizing:content-box}.xl\:cursor-auto{cursor:auto}.xl\:cursor-default{cursor:default}.xl\:cursor-pointer{cursor:pointer}.xl\:cursor-wait{cursor:wait}.xl\:cursor-text{cursor:text}.xl\:cursor-move{cursor:move}.xl\:cursor-not-allowed{cursor:not-allowed}.xl\:block{display:block}.xl\:inline-block{display:inline-block}.xl\:inline{display:inline}.xl\:flex{display:flex}.xl\:inline-flex{display:inline-flex}.xl\:table{display:table}.xl\:table-caption{display:table-caption}.xl\:table-cell{display:table-cell}.xl\:table-column{display:table-column}.xl\:table-column-group{display:table-column-group}.xl\:table-footer-group{display:table-footer-group}.xl\:table-header-group{display:table-header-group}.xl\:table-row-group{display:table-row-group}.xl\:table-row{display:table-row}.xl\:flow-root{display:flow-root}.xl\:grid{display:grid}.xl\:inline-grid{display:inline-grid}.xl\:contents{display:contents}.xl\:hidden{display:none}.xl\:flex-row{flex-direction:row}.xl\:flex-row-reverse{flex-direction:row-reverse}.xl\:flex-col{flex-direction:column}.xl\:flex-col-reverse{flex-direction:column-reverse}.xl\:flex-wrap{flex-wrap:wrap}.xl\:flex-wrap-reverse{flex-wrap:wrap-reverse}.xl\:flex-no-wrap{flex-wrap:nowrap}.xl\:place-items-auto{place-items:auto}.xl\:place-items-start{place-items:start}.xl\:place-items-end{place-items:end}.xl\:place-items-center{place-items:center}.xl\:place-items-stretch{place-items:stretch}.xl\:place-content-center{place-content:center}.xl\:place-content-start{place-content:start}.xl\:place-content-end{place-content:end}.xl\:place-content-between{place-content:space-between}.xl\:place-content-around{place-content:space-around}.xl\:place-content-evenly{place-content:space-evenly}.xl\:place-content-stretch{place-content:stretch}.xl\:place-self-auto{place-self:auto}.xl\:place-self-start{place-self:start}.xl\:place-self-end{place-self:end}.xl\:place-self-center{place-self:center}.xl\:place-self-stretch{place-self:stretch}.xl\:items-start{align-items:flex-start}.xl\:items-end{align-items:flex-end}.xl\:items-center{align-items:center}.xl\:items-baseline{align-items:baseline}.xl\:items-stretch{align-items:stretch}.xl\:content-center{align-content:center}.xl\:content-start{align-content:flex-start}.xl\:content-end{align-content:flex-end}.xl\:content-between{align-content:space-between}.xl\:content-around{align-content:space-around}.xl\:content-evenly{align-content:space-evenly}.xl\:self-auto{align-self:auto}.xl\:self-start{align-self:flex-start}.xl\:self-end{align-self:flex-end}.xl\:self-center{align-self:center}.xl\:self-stretch{align-self:stretch}.xl\:justify-items-auto{justify-items:auto}.xl\:justify-items-start{justify-items:start}.xl\:justify-items-end{justify-items:end}.xl\:justify-items-center{justify-items:center}.xl\:justify-items-stretch{justify-items:stretch}.xl\:justify-start{justify-content:flex-start}.xl\:justify-end{justify-content:flex-end}.xl\:justify-center{justify-content:center}.xl\:justify-between{justify-content:space-between}.xl\:justify-around{justify-content:space-around}.xl\:justify-evenly{justify-content:space-evenly}.xl\:justify-self-auto{justify-self:auto}.xl\:justify-self-start{justify-self:start}.xl\:justify-self-end{justify-self:end}.xl\:justify-self-center{justify-self:center}.xl\:justify-self-stretch{justify-self:stretch}.xl\:flex-1{flex:1 1 0%}.xl\:flex-auto{flex:1 1 auto}.xl\:flex-initial{flex:0 1 auto}.xl\:flex-none{flex:none}.xl\:flex-grow-0{flex-grow:0}.xl\:flex-grow{flex-grow:1}.xl\:flex-shrink-0{flex-shrink:0}.xl\:flex-shrink{flex-shrink:1}.xl\:order-1{order:1}.xl\:order-2{order:2}.xl\:order-3{order:3}.xl\:order-4{order:4}.xl\:order-5{order:5}.xl\:order-6{order:6}.xl\:order-7{order:7}.xl\:order-8{order:8}.xl\:order-9{order:9}.xl\:order-10{order:10}.xl\:order-11{order:11}.xl\:order-12{order:12}.xl\:order-first{order:-9999}.xl\:order-last{order:9999}.xl\:order-none{order:0}.xl\:float-right{float:right}.xl\:float-left{float:left}.xl\:float-none{float:none}.xl\:clearfix:after{content:"";display:table;clear:both}.xl\:clear-left{clear:left}.xl\:clear-right{clear:right}.xl\:clear-both{clear:both}.xl\:clear-none{clear:none}.xl\:font-sans{font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.xl\:font-serif{font-family:Georgia,Cambria,"Times New Roman",Times,serif}.xl\:font-mono{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.xl\:font-hairline{font-weight:100}.xl\:font-thin{font-weight:200}.xl\:font-light{font-weight:300}.xl\:font-normal{font-weight:400}.xl\:font-medium{font-weight:500}.xl\:font-semibold{font-weight:600}.xl\:font-bold{font-weight:700}.xl\:font-extrabold{font-weight:800}.xl\:font-black{font-weight:900}.xl\:hover\:font-hairline:hover{font-weight:100}.xl\:hover\:font-thin:hover{font-weight:200}.xl\:hover\:font-light:hover{font-weight:300}.xl\:hover\:font-normal:hover{font-weight:400}.xl\:hover\:font-medium:hover{font-weight:500}.xl\:hover\:font-semibold:hover{font-weight:600}.xl\:hover\:font-bold:hover{font-weight:700}.xl\:hover\:font-extrabold:hover{font-weight:800}.xl\:hover\:font-black:hover{font-weight:900}.xl\:focus\:font-hairline:focus{font-weight:100}.xl\:focus\:font-thin:focus{font-weight:200}.xl\:focus\:font-light:focus{font-weight:300}.xl\:focus\:font-normal:focus{font-weight:400}.xl\:focus\:font-medium:focus{font-weight:500}.xl\:focus\:font-semibold:focus{font-weight:600}.xl\:focus\:font-bold:focus{font-weight:700}.xl\:focus\:font-extrabold:focus{font-weight:800}.xl\:focus\:font-black:focus{font-weight:900}.xl\:h-0{height:0}.xl\:h-1{height:.25rem}.xl\:h-2{height:.5rem}.xl\:h-3{height:.75rem}.xl\:h-4{height:1rem}.xl\:h-5{height:1.25rem}.xl\:h-6{height:1.5rem}.xl\:h-8{height:2rem}.xl\:h-10{height:2.5rem}.xl\:h-12{height:3rem}.xl\:h-16{height:4rem}.xl\:h-20{height:5rem}.xl\:h-24{height:6rem}.xl\:h-32{height:8rem}.xl\:h-40{height:10rem}.xl\:h-48{height:12rem}.xl\:h-56{height:14rem}.xl\:h-64{height:16rem}.xl\:h-auto{height:auto}.xl\:h-px{height:1px}.xl\:h-full{height:100%}.xl\:h-screen{height:100vh}.xl\:text-xs{font-size:.75rem}.xl\:text-sm{font-size:.875rem}.xl\:text-base{font-size:1rem}.xl\:text-lg{font-size:1.125rem}.xl\:text-xl{font-size:1.25rem}.xl\:text-2xl{font-size:1.5rem}.xl\:text-3xl{font-size:1.875rem}.xl\:text-4xl{font-size:2.25rem}.xl\:text-5xl{font-size:3rem}.xl\:text-6xl{font-size:4rem}.xl\:leading-3{line-height:.75rem}.xl\:leading-4{line-height:1rem}.xl\:leading-5{line-height:1.25rem}.xl\:leading-6{line-height:1.5rem}.xl\:leading-7{line-height:1.75rem}.xl\:leading-8{line-height:2rem}.xl\:leading-9{line-height:2.25rem}.xl\:leading-10{line-height:2.5rem}.xl\:leading-none{line-height:1}.xl\:leading-tight{line-height:1.25}.xl\:leading-snug{line-height:1.375}.xl\:leading-normal{line-height:1.5}.xl\:leading-relaxed{line-height:1.625}.xl\:leading-loose{line-height:2}.xl\:list-inside{list-style-position:inside}.xl\:list-outside{list-style-position:outside}.xl\:list-none{list-style-type:none}.xl\:list-disc{list-style-type:disc}.xl\:list-decimal{list-style-type:decimal}.xl\:m-0{margin:0}.xl\:m-1{margin:.25rem}.xl\:m-2{margin:.5rem}.xl\:m-3{margin:.75rem}.xl\:m-4{margin:1rem}.xl\:m-5{margin:1.25rem}.xl\:m-6{margin:1.5rem}.xl\:m-8{margin:2rem}.xl\:m-10{margin:2.5rem}.xl\:m-12{margin:3rem}.xl\:m-16{margin:4rem}.xl\:m-20{margin:5rem}.xl\:m-24{margin:6rem}.xl\:m-32{margin:8rem}.xl\:m-40{margin:10rem}.xl\:m-48{margin:12rem}.xl\:m-56{margin:14rem}.xl\:m-64{margin:16rem}.xl\:m-auto{margin:auto}.xl\:m-px{margin:1px}.xl\:-m-1{margin:-.25rem}.xl\:-m-2{margin:-.5rem}.xl\:-m-3{margin:-.75rem}.xl\:-m-4{margin:-1rem}.xl\:-m-5{margin:-1.25rem}.xl\:-m-6{margin:-1.5rem}.xl\:-m-8{margin:-2rem}.xl\:-m-10{margin:-2.5rem}.xl\:-m-12{margin:-3rem}.xl\:-m-16{margin:-4rem}.xl\:-m-20{margin:-5rem}.xl\:-m-24{margin:-6rem}.xl\:-m-32{margin:-8rem}.xl\:-m-40{margin:-10rem}.xl\:-m-48{margin:-12rem}.xl\:-m-56{margin:-14rem}.xl\:-m-64{margin:-16rem}.xl\:-m-px{margin:-1px}.xl\:my-0{margin-top:0;margin-bottom:0}.xl\:mx-0{margin-left:0;margin-right:0}.xl\:my-1{margin-top:.25rem;margin-bottom:.25rem}.xl\:mx-1{margin-left:.25rem;margin-right:.25rem}.xl\:my-2{margin-top:.5rem;margin-bottom:.5rem}.xl\:mx-2{margin-left:.5rem;margin-right:.5rem}.xl\:my-3{margin-top:.75rem;margin-bottom:.75rem}.xl\:mx-3{margin-left:.75rem;margin-right:.75rem}.xl\:my-4{margin-top:1rem;margin-bottom:1rem}.xl\:mx-4{margin-left:1rem;margin-right:1rem}.xl\:my-5{margin-top:1.25rem;margin-bottom:1.25rem}.xl\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.xl\:my-6{margin-top:1.5rem;margin-bottom:1.5rem}.xl\:mx-6{margin-left:1.5rem;margin-right:1.5rem}.xl\:my-8{margin-top:2rem;margin-bottom:2rem}.xl\:mx-8{margin-left:2rem;margin-right:2rem}.xl\:my-10{margin-top:2.5rem;margin-bottom:2.5rem}.xl\:mx-10{margin-left:2.5rem;margin-right:2.5rem}.xl\:my-12{margin-top:3rem;margin-bottom:3rem}.xl\:mx-12{margin-left:3rem;margin-right:3rem}.xl\:my-16{margin-top:4rem;margin-bottom:4rem}.xl\:mx-16{margin-left:4rem;margin-right:4rem}.xl\:my-20{margin-top:5rem;margin-bottom:5rem}.xl\:mx-20{margin-left:5rem;margin-right:5rem}.xl\:my-24{margin-top:6rem;margin-bottom:6rem}.xl\:mx-24{margin-left:6rem;margin-right:6rem}.xl\:my-32{margin-top:8rem;margin-bottom:8rem}.xl\:mx-32{margin-left:8rem;margin-right:8rem}.xl\:my-40{margin-top:10rem;margin-bottom:10rem}.xl\:mx-40{margin-left:10rem;margin-right:10rem}.xl\:my-48{margin-top:12rem;margin-bottom:12rem}.xl\:mx-48{margin-left:12rem;margin-right:12rem}.xl\:my-56{margin-top:14rem;margin-bottom:14rem}.xl\:mx-56{margin-left:14rem;margin-right:14rem}.xl\:my-64{margin-top:16rem;margin-bottom:16rem}.xl\:mx-64{margin-left:16rem;margin-right:16rem}.xl\:my-auto{margin-top:auto;margin-bottom:auto}.xl\:mx-auto{margin-left:auto;margin-right:auto}.xl\:my-px{margin-top:1px;margin-bottom:1px}.xl\:mx-px{margin-left:1px;margin-right:1px}.xl\:-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.xl\:-mx-1{margin-left:-.25rem;margin-right:-.25rem}.xl\:-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.xl\:-mx-2{margin-left:-.5rem;margin-right:-.5rem}.xl\:-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.xl\:-mx-3{margin-left:-.75rem;margin-right:-.75rem}.xl\:-my-4{margin-top:-1rem;margin-bottom:-1rem}.xl\:-mx-4{margin-left:-1rem;margin-right:-1rem}.xl\:-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.xl\:-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.xl\:-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.xl\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.xl\:-my-8{margin-top:-2rem;margin-bottom:-2rem}.xl\:-mx-8{margin-left:-2rem;margin-right:-2rem}.xl\:-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.xl\:-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.xl\:-my-12{margin-top:-3rem;margin-bottom:-3rem}.xl\:-mx-12{margin-left:-3rem;margin-right:-3rem}.xl\:-my-16{margin-top:-4rem;margin-bottom:-4rem}.xl\:-mx-16{margin-left:-4rem;margin-right:-4rem}.xl\:-my-20{margin-top:-5rem;margin-bottom:-5rem}.xl\:-mx-20{margin-left:-5rem;margin-right:-5rem}.xl\:-my-24{margin-top:-6rem;margin-bottom:-6rem}.xl\:-mx-24{margin-left:-6rem;margin-right:-6rem}.xl\:-my-32{margin-top:-8rem;margin-bottom:-8rem}.xl\:-mx-32{margin-left:-8rem;margin-right:-8rem}.xl\:-my-40{margin-top:-10rem;margin-bottom:-10rem}.xl\:-mx-40{margin-left:-10rem;margin-right:-10rem}.xl\:-my-48{margin-top:-12rem;margin-bottom:-12rem}.xl\:-mx-48{margin-left:-12rem;margin-right:-12rem}.xl\:-my-56{margin-top:-14rem;margin-bottom:-14rem}.xl\:-mx-56{margin-left:-14rem;margin-right:-14rem}.xl\:-my-64{margin-top:-16rem;margin-bottom:-16rem}.xl\:-mx-64{margin-left:-16rem;margin-right:-16rem}.xl\:-my-px{margin-top:-1px;margin-bottom:-1px}.xl\:-mx-px{margin-left:-1px;margin-right:-1px}.xl\:mt-0{margin-top:0}.xl\:mr-0{margin-right:0}.xl\:mb-0{margin-bottom:0}.xl\:ml-0{margin-left:0}.xl\:mt-1{margin-top:.25rem}.xl\:mr-1{margin-right:.25rem}.xl\:mb-1{margin-bottom:.25rem}.xl\:ml-1{margin-left:.25rem}.xl\:mt-2{margin-top:.5rem}.xl\:mr-2{margin-right:.5rem}.xl\:mb-2{margin-bottom:.5rem}.xl\:ml-2{margin-left:.5rem}.xl\:mt-3{margin-top:.75rem}.xl\:mr-3{margin-right:.75rem}.xl\:mb-3{margin-bottom:.75rem}.xl\:ml-3{margin-left:.75rem}.xl\:mt-4{margin-top:1rem}.xl\:mr-4{margin-right:1rem}.xl\:mb-4{margin-bottom:1rem}.xl\:ml-4{margin-left:1rem}.xl\:mt-5{margin-top:1.25rem}.xl\:mr-5{margin-right:1.25rem}.xl\:mb-5{margin-bottom:1.25rem}.xl\:ml-5{margin-left:1.25rem}.xl\:mt-6{margin-top:1.5rem}.xl\:mr-6{margin-right:1.5rem}.xl\:mb-6{margin-bottom:1.5rem}.xl\:ml-6{margin-left:1.5rem}.xl\:mt-8{margin-top:2rem}.xl\:mr-8{margin-right:2rem}.xl\:mb-8{margin-bottom:2rem}.xl\:ml-8{margin-left:2rem}.xl\:mt-10{margin-top:2.5rem}.xl\:mr-10{margin-right:2.5rem}.xl\:mb-10{margin-bottom:2.5rem}.xl\:ml-10{margin-left:2.5rem}.xl\:mt-12{margin-top:3rem}.xl\:mr-12{margin-right:3rem}.xl\:mb-12{margin-bottom:3rem}.xl\:ml-12{margin-left:3rem}.xl\:mt-16{margin-top:4rem}.xl\:mr-16{margin-right:4rem}.xl\:mb-16{margin-bottom:4rem}.xl\:ml-16{margin-left:4rem}.xl\:mt-20{margin-top:5rem}.xl\:mr-20{margin-right:5rem}.xl\:mb-20{margin-bottom:5rem}.xl\:ml-20{margin-left:5rem}.xl\:mt-24{margin-top:6rem}.xl\:mr-24{margin-right:6rem}.xl\:mb-24{margin-bottom:6rem}.xl\:ml-24{margin-left:6rem}.xl\:mt-32{margin-top:8rem}.xl\:mr-32{margin-right:8rem}.xl\:mb-32{margin-bottom:8rem}.xl\:ml-32{margin-left:8rem}.xl\:mt-40{margin-top:10rem}.xl\:mr-40{margin-right:10rem}.xl\:mb-40{margin-bottom:10rem}.xl\:ml-40{margin-left:10rem}.xl\:mt-48{margin-top:12rem}.xl\:mr-48{margin-right:12rem}.xl\:mb-48{margin-bottom:12rem}.xl\:ml-48{margin-left:12rem}.xl\:mt-56{margin-top:14rem}.xl\:mr-56{margin-right:14rem}.xl\:mb-56{margin-bottom:14rem}.xl\:ml-56{margin-left:14rem}.xl\:mt-64{margin-top:16rem}.xl\:mr-64{margin-right:16rem}.xl\:mb-64{margin-bottom:16rem}.xl\:ml-64{margin-left:16rem}.xl\:mt-auto{margin-top:auto}.xl\:mr-auto{margin-right:auto}.xl\:mb-auto{margin-bottom:auto}.xl\:ml-auto{margin-left:auto}.xl\:mt-px{margin-top:1px}.xl\:mr-px{margin-right:1px}.xl\:mb-px{margin-bottom:1px}.xl\:ml-px{margin-left:1px}.xl\:-mt-1{margin-top:-.25rem}.xl\:-mr-1{margin-right:-.25rem}.xl\:-mb-1{margin-bottom:-.25rem}.xl\:-ml-1{margin-left:-.25rem}.xl\:-mt-2{margin-top:-.5rem}.xl\:-mr-2{margin-right:-.5rem}.xl\:-mb-2{margin-bottom:-.5rem}.xl\:-ml-2{margin-left:-.5rem}.xl\:-mt-3{margin-top:-.75rem}.xl\:-mr-3{margin-right:-.75rem}.xl\:-mb-3{margin-bottom:-.75rem}.xl\:-ml-3{margin-left:-.75rem}.xl\:-mt-4{margin-top:-1rem}.xl\:-mr-4{margin-right:-1rem}.xl\:-mb-4{margin-bottom:-1rem}.xl\:-ml-4{margin-left:-1rem}.xl\:-mt-5{margin-top:-1.25rem}.xl\:-mr-5{margin-right:-1.25rem}.xl\:-mb-5{margin-bottom:-1.25rem}.xl\:-ml-5{margin-left:-1.25rem}.xl\:-mt-6{margin-top:-1.5rem}.xl\:-mr-6{margin-right:-1.5rem}.xl\:-mb-6{margin-bottom:-1.5rem}.xl\:-ml-6{margin-left:-1.5rem}.xl\:-mt-8{margin-top:-2rem}.xl\:-mr-8{margin-right:-2rem}.xl\:-mb-8{margin-bottom:-2rem}.xl\:-ml-8{margin-left:-2rem}.xl\:-mt-10{margin-top:-2.5rem}.xl\:-mr-10{margin-right:-2.5rem}.xl\:-mb-10{margin-bottom:-2.5rem}.xl\:-ml-10{margin-left:-2.5rem}.xl\:-mt-12{margin-top:-3rem}.xl\:-mr-12{margin-right:-3rem}.xl\:-mb-12{margin-bottom:-3rem}.xl\:-ml-12{margin-left:-3rem}.xl\:-mt-16{margin-top:-4rem}.xl\:-mr-16{margin-right:-4rem}.xl\:-mb-16{margin-bottom:-4rem}.xl\:-ml-16{margin-left:-4rem}.xl\:-mt-20{margin-top:-5rem}.xl\:-mr-20{margin-right:-5rem}.xl\:-mb-20{margin-bottom:-5rem}.xl\:-ml-20{margin-left:-5rem}.xl\:-mt-24{margin-top:-6rem}.xl\:-mr-24{margin-right:-6rem}.xl\:-mb-24{margin-bottom:-6rem}.xl\:-ml-24{margin-left:-6rem}.xl\:-mt-32{margin-top:-8rem}.xl\:-mr-32{margin-right:-8rem}.xl\:-mb-32{margin-bottom:-8rem}.xl\:-ml-32{margin-left:-8rem}.xl\:-mt-40{margin-top:-10rem}.xl\:-mr-40{margin-right:-10rem}.xl\:-mb-40{margin-bottom:-10rem}.xl\:-ml-40{margin-left:-10rem}.xl\:-mt-48{margin-top:-12rem}.xl\:-mr-48{margin-right:-12rem}.xl\:-mb-48{margin-bottom:-12rem}.xl\:-ml-48{margin-left:-12rem}.xl\:-mt-56{margin-top:-14rem}.xl\:-mr-56{margin-right:-14rem}.xl\:-mb-56{margin-bottom:-14rem}.xl\:-ml-56{margin-left:-14rem}.xl\:-mt-64{margin-top:-16rem}.xl\:-mr-64{margin-right:-16rem}.xl\:-mb-64{margin-bottom:-16rem}.xl\:-ml-64{margin-left:-16rem}.xl\:-mt-px{margin-top:-1px}.xl\:-mr-px{margin-right:-1px}.xl\:-mb-px{margin-bottom:-1px}.xl\:-ml-px{margin-left:-1px}.xl\:max-h-full{max-height:100%}.xl\:max-h-screen{max-height:100vh}.xl\:max-w-none{max-width:none}.xl\:max-w-xs{max-width:20rem}.xl\:max-w-sm{max-width:24rem}.xl\:max-w-md{max-width:28rem}.xl\:max-w-lg{max-width:32rem}.xl\:max-w-xl{max-width:36rem}.xl\:max-w-2xl{max-width:42rem}.xl\:max-w-3xl{max-width:48rem}.xl\:max-w-4xl{max-width:56rem}.xl\:max-w-5xl{max-width:64rem}.xl\:max-w-6xl{max-width:72rem}.xl\:max-w-full{max-width:100%}.xl\:max-w-screen-sm{max-width:640px}.xl\:max-w-screen-md{max-width:768px}.xl\:max-w-screen-lg{max-width:1024px}.xl\:max-w-screen-xl{max-width:1280px}.xl\:min-h-0{min-height:0}.xl\:min-h-full{min-height:100%}.xl\:min-h-screen{min-height:100vh}.xl\:min-w-0{min-width:0}.xl\:min-w-full{min-width:100%}.xl\:object-contain{object-fit:contain}.xl\:object-cover{object-fit:cover}.xl\:object-fill{object-fit:fill}.xl\:object-none{object-fit:none}.xl\:object-scale-down{object-fit:scale-down}.xl\:object-bottom{object-position:bottom}.xl\:object-center{object-position:center}.xl\:object-left{object-position:left}.xl\:object-left-bottom{object-position:left bottom}.xl\:object-left-top{object-position:left top}.xl\:object-right{object-position:right}.xl\:object-right-bottom{object-position:right bottom}.xl\:object-right-top{object-position:right top}.xl\:object-top{object-position:top}.xl\:opacity-0{opacity:0}.xl\:opacity-25{opacity:.25}.xl\:opacity-50{opacity:.5}.xl\:opacity-75{opacity:.75}.xl\:opacity-100{opacity:1}.xl\:hover\:opacity-0:hover{opacity:0}.xl\:hover\:opacity-25:hover{opacity:.25}.xl\:hover\:opacity-50:hover{opacity:.5}.xl\:hover\:opacity-75:hover{opacity:.75}.xl\:hover\:opacity-100:hover{opacity:1}.xl\:focus\:opacity-0:focus{opacity:0}.xl\:focus\:opacity-25:focus{opacity:.25}.xl\:focus\:opacity-50:focus{opacity:.5}.xl\:focus\:opacity-75:focus{opacity:.75}.xl\:focus\:opacity-100:focus{opacity:1}.xl\:outline-none{outline:2px solid transparent;outline-offset:2px}.xl\:outline-white{outline:2px dotted #fff;outline-offset:2px}.xl\:outline-black{outline:2px dotted #000;outline-offset:2px}.xl\:focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.xl\:focus\:outline-white:focus{outline:2px dotted #fff;outline-offset:2px}.xl\:focus\:outline-black:focus{outline:2px dotted #000;outline-offset:2px}.xl\:overflow-auto{overflow:auto}.xl\:overflow-hidden{overflow:hidden}.xl\:overflow-visible{overflow:visible}.xl\:overflow-scroll{overflow:scroll}.xl\:overflow-x-auto{overflow-x:auto}.xl\:overflow-y-auto{overflow-y:auto}.xl\:overflow-x-hidden{overflow-x:hidden}.xl\:overflow-y-hidden{overflow-y:hidden}.xl\:overflow-x-visible{overflow-x:visible}.xl\:overflow-y-visible{overflow-y:visible}.xl\:overflow-x-scroll{overflow-x:scroll}.xl\:overflow-y-scroll{overflow-y:scroll}.xl\:scrolling-touch{-webkit-overflow-scrolling:touch}.xl\:scrolling-auto{-webkit-overflow-scrolling:auto}.xl\:overscroll-auto{-ms-scroll-chaining:chained;overscroll-behavior:auto}.xl\:overscroll-contain{-ms-scroll-chaining:none;overscroll-behavior:contain}.xl\:overscroll-none{-ms-scroll-chaining:none;overscroll-behavior:none}.xl\:overscroll-y-auto{overscroll-behavior-y:auto}.xl\:overscroll-y-contain{overscroll-behavior-y:contain}.xl\:overscroll-y-none{overscroll-behavior-y:none}.xl\:overscroll-x-auto{overscroll-behavior-x:auto}.xl\:overscroll-x-contain{overscroll-behavior-x:contain}.xl\:overscroll-x-none{overscroll-behavior-x:none}.xl\:p-0{padding:0}.xl\:p-1{padding:.25rem}.xl\:p-2{padding:.5rem}.xl\:p-3{padding:.75rem}.xl\:p-4{padding:1rem}.xl\:p-5{padding:1.25rem}.xl\:p-6{padding:1.5rem}.xl\:p-8{padding:2rem}.xl\:p-10{padding:2.5rem}.xl\:p-12{padding:3rem}.xl\:p-16{padding:4rem}.xl\:p-20{padding:5rem}.xl\:p-24{padding:6rem}.xl\:p-32{padding:8rem}.xl\:p-40{padding:10rem}.xl\:p-48{padding:12rem}.xl\:p-56{padding:14rem}.xl\:p-64{padding:16rem}.xl\:p-px{padding:1px}.xl\:py-0{padding-top:0;padding-bottom:0}.xl\:px-0{padding-left:0;padding-right:0}.xl\:py-1{padding-top:.25rem;padding-bottom:.25rem}.xl\:px-1{padding-left:.25rem;padding-right:.25rem}.xl\:py-2{padding-top:.5rem;padding-bottom:.5rem}.xl\:px-2{padding-left:.5rem;padding-right:.5rem}.xl\:py-3{padding-top:.75rem;padding-bottom:.75rem}.xl\:px-3{padding-left:.75rem;padding-right:.75rem}.xl\:py-4{padding-top:1rem;padding-bottom:1rem}.xl\:px-4{padding-left:1rem;padding-right:1rem}.xl\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.xl\:px-5{padding-left:1.25rem;padding-right:1.25rem}.xl\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.xl\:px-6{padding-left:1.5rem;padding-right:1.5rem}.xl\:py-8{padding-top:2rem;padding-bottom:2rem}.xl\:px-8{padding-left:2rem;padding-right:2rem}.xl\:py-10{padding-top:2.5rem;padding-bottom:2.5rem}.xl\:px-10{padding-left:2.5rem;padding-right:2.5rem}.xl\:py-12{padding-top:3rem;padding-bottom:3rem}.xl\:px-12{padding-left:3rem;padding-right:3rem}.xl\:py-16{padding-top:4rem;padding-bottom:4rem}.xl\:px-16{padding-left:4rem;padding-right:4rem}.xl\:py-20{padding-top:5rem;padding-bottom:5rem}.xl\:px-20{padding-left:5rem;padding-right:5rem}.xl\:py-24{padding-top:6rem;padding-bottom:6rem}.xl\:px-24{padding-left:6rem;padding-right:6rem}.xl\:py-32{padding-top:8rem;padding-bottom:8rem}.xl\:px-32{padding-left:8rem;padding-right:8rem}.xl\:py-40{padding-top:10rem;padding-bottom:10rem}.xl\:px-40{padding-left:10rem;padding-right:10rem}.xl\:py-48{padding-top:12rem;padding-bottom:12rem}.xl\:px-48{padding-left:12rem;padding-right:12rem}.xl\:py-56{padding-top:14rem;padding-bottom:14rem}.xl\:px-56{padding-left:14rem;padding-right:14rem}.xl\:py-64{padding-top:16rem;padding-bottom:16rem}.xl\:px-64{padding-left:16rem;padding-right:16rem}.xl\:py-px{padding-top:1px;padding-bottom:1px}.xl\:px-px{padding-left:1px;padding-right:1px}.xl\:pt-0{padding-top:0}.xl\:pr-0{padding-right:0}.xl\:pb-0{padding-bottom:0}.xl\:pl-0{padding-left:0}.xl\:pt-1{padding-top:.25rem}.xl\:pr-1{padding-right:.25rem}.xl\:pb-1{padding-bottom:.25rem}.xl\:pl-1{padding-left:.25rem}.xl\:pt-2{padding-top:.5rem}.xl\:pr-2{padding-right:.5rem}.xl\:pb-2{padding-bottom:.5rem}.xl\:pl-2{padding-left:.5rem}.xl\:pt-3{padding-top:.75rem}.xl\:pr-3{padding-right:.75rem}.xl\:pb-3{padding-bottom:.75rem}.xl\:pl-3{padding-left:.75rem}.xl\:pt-4{padding-top:1rem}.xl\:pr-4{padding-right:1rem}.xl\:pb-4{padding-bottom:1rem}.xl\:pl-4{padding-left:1rem}.xl\:pt-5{padding-top:1.25rem}.xl\:pr-5{padding-right:1.25rem}.xl\:pb-5{padding-bottom:1.25rem}.xl\:pl-5{padding-left:1.25rem}.xl\:pt-6{padding-top:1.5rem}.xl\:pr-6{padding-right:1.5rem}.xl\:pb-6{padding-bottom:1.5rem}.xl\:pl-6{padding-left:1.5rem}.xl\:pt-8{padding-top:2rem}.xl\:pr-8{padding-right:2rem}.xl\:pb-8{padding-bottom:2rem}.xl\:pl-8{padding-left:2rem}.xl\:pt-10{padding-top:2.5rem}.xl\:pr-10{padding-right:2.5rem}.xl\:pb-10{padding-bottom:2.5rem}.xl\:pl-10{padding-left:2.5rem}.xl\:pt-12{padding-top:3rem}.xl\:pr-12{padding-right:3rem}.xl\:pb-12{padding-bottom:3rem}.xl\:pl-12{padding-left:3rem}.xl\:pt-16{padding-top:4rem}.xl\:pr-16{padding-right:4rem}.xl\:pb-16{padding-bottom:4rem}.xl\:pl-16{padding-left:4rem}.xl\:pt-20{padding-top:5rem}.xl\:pr-20{padding-right:5rem}.xl\:pb-20{padding-bottom:5rem}.xl\:pl-20{padding-left:5rem}.xl\:pt-24{padding-top:6rem}.xl\:pr-24{padding-right:6rem}.xl\:pb-24{padding-bottom:6rem}.xl\:pl-24{padding-left:6rem}.xl\:pt-32{padding-top:8rem}.xl\:pr-32{padding-right:8rem}.xl\:pb-32{padding-bottom:8rem}.xl\:pl-32{padding-left:8rem}.xl\:pt-40{padding-top:10rem}.xl\:pr-40{padding-right:10rem}.xl\:pb-40{padding-bottom:10rem}.xl\:pl-40{padding-left:10rem}.xl\:pt-48{padding-top:12rem}.xl\:pr-48{padding-right:12rem}.xl\:pb-48{padding-bottom:12rem}.xl\:pl-48{padding-left:12rem}.xl\:pt-56{padding-top:14rem}.xl\:pr-56{padding-right:14rem}.xl\:pb-56{padding-bottom:14rem}.xl\:pl-56{padding-left:14rem}.xl\:pt-64{padding-top:16rem}.xl\:pr-64{padding-right:16rem}.xl\:pb-64{padding-bottom:16rem}.xl\:pl-64{padding-left:16rem}.xl\:pt-px{padding-top:1px}.xl\:pr-px{padding-right:1px}.xl\:pb-px{padding-bottom:1px}.xl\:pl-px{padding-left:1px}.xl\:placeholder-transparent:-ms-input-placeholder{color:transparent}.xl\:placeholder-transparent::-ms-input-placeholder{color:transparent}.xl\:placeholder-transparent::placeholder{color:transparent}.xl\:placeholder-current:-ms-input-placeholder{color:currentColor}.xl\:placeholder-current::-ms-input-placeholder{color:currentColor}.xl\:placeholder-current::placeholder{color:currentColor}.xl\:placeholder-black:-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.xl\:placeholder-black::-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.xl\:placeholder-black::placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.xl\:placeholder-white:-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.xl\:placeholder-white::-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.xl\:placeholder-white::placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.xl\:placeholder-gray-100:-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.xl\:placeholder-gray-100::-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.xl\:placeholder-gray-100::placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.xl\:placeholder-gray-200:-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.xl\:placeholder-gray-200::-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.xl\:placeholder-gray-200::placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.xl\:placeholder-gray-300:-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.xl\:placeholder-gray-300::-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.xl\:placeholder-gray-300::placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.xl\:placeholder-gray-400:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.xl\:placeholder-gray-400::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.xl\:placeholder-gray-400::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.xl\:placeholder-gray-500:-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.xl\:placeholder-gray-500::-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.xl\:placeholder-gray-500::placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.xl\:placeholder-gray-600:-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.xl\:placeholder-gray-600::-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.xl\:placeholder-gray-600::placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.xl\:placeholder-gray-700:-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.xl\:placeholder-gray-700::-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.xl\:placeholder-gray-700::placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.xl\:placeholder-gray-800:-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.xl\:placeholder-gray-800::-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.xl\:placeholder-gray-800::placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.xl\:placeholder-gray-900:-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.xl\:placeholder-gray-900::-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.xl\:placeholder-gray-900::placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.xl\:placeholder-red-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.xl\:placeholder-red-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.xl\:placeholder-red-100::placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.xl\:placeholder-red-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.xl\:placeholder-red-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.xl\:placeholder-red-200::placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.xl\:placeholder-red-300:-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.xl\:placeholder-red-300::-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.xl\:placeholder-red-300::placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.xl\:placeholder-red-400:-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.xl\:placeholder-red-400::-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.xl\:placeholder-red-400::placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.xl\:placeholder-red-500:-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.xl\:placeholder-red-500::-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.xl\:placeholder-red-500::placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.xl\:placeholder-red-600:-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.xl\:placeholder-red-600::-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.xl\:placeholder-red-600::placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.xl\:placeholder-red-700:-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.xl\:placeholder-red-700::-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.xl\:placeholder-red-700::placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.xl\:placeholder-red-800:-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.xl\:placeholder-red-800::-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.xl\:placeholder-red-800::placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.xl\:placeholder-red-900:-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.xl\:placeholder-red-900::-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.xl\:placeholder-red-900::placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.xl\:placeholder-orange-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.xl\:placeholder-orange-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.xl\:placeholder-orange-100::placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.xl\:placeholder-orange-200:-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.xl\:placeholder-orange-200::-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.xl\:placeholder-orange-200::placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.xl\:placeholder-orange-300:-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.xl\:placeholder-orange-300::-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.xl\:placeholder-orange-300::placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.xl\:placeholder-orange-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.xl\:placeholder-orange-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.xl\:placeholder-orange-400::placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.xl\:placeholder-orange-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.xl\:placeholder-orange-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.xl\:placeholder-orange-500::placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.xl\:placeholder-orange-600:-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.xl\:placeholder-orange-600::-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.xl\:placeholder-orange-600::placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.xl\:placeholder-orange-700:-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.xl\:placeholder-orange-700::-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.xl\:placeholder-orange-700::placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.xl\:placeholder-orange-800:-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.xl\:placeholder-orange-800::-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.xl\:placeholder-orange-800::placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.xl\:placeholder-orange-900:-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.xl\:placeholder-orange-900::-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.xl\:placeholder-orange-900::placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.xl\:placeholder-yellow-100:-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.xl\:placeholder-yellow-100::-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.xl\:placeholder-yellow-100::placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.xl\:placeholder-yellow-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.xl\:placeholder-yellow-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.xl\:placeholder-yellow-200::placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.xl\:placeholder-yellow-300:-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.xl\:placeholder-yellow-300::-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.xl\:placeholder-yellow-300::placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.xl\:placeholder-yellow-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.xl\:placeholder-yellow-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.xl\:placeholder-yellow-400::placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.xl\:placeholder-yellow-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.xl\:placeholder-yellow-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.xl\:placeholder-yellow-500::placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.xl\:placeholder-yellow-600:-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.xl\:placeholder-yellow-600::-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.xl\:placeholder-yellow-600::placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.xl\:placeholder-yellow-700:-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.xl\:placeholder-yellow-700::-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.xl\:placeholder-yellow-700::placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.xl\:placeholder-yellow-800:-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.xl\:placeholder-yellow-800::-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.xl\:placeholder-yellow-800::placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.xl\:placeholder-yellow-900:-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.xl\:placeholder-yellow-900::-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.xl\:placeholder-yellow-900::placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.xl\:placeholder-green-100:-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.xl\:placeholder-green-100::-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.xl\:placeholder-green-100::placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.xl\:placeholder-green-200:-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.xl\:placeholder-green-200::-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.xl\:placeholder-green-200::placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.xl\:placeholder-green-300:-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.xl\:placeholder-green-300::-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.xl\:placeholder-green-300::placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.xl\:placeholder-green-400:-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.xl\:placeholder-green-400::-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.xl\:placeholder-green-400::placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.xl\:placeholder-green-500:-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.xl\:placeholder-green-500::-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.xl\:placeholder-green-500::placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.xl\:placeholder-green-600:-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.xl\:placeholder-green-600::-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.xl\:placeholder-green-600::placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.xl\:placeholder-green-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.xl\:placeholder-green-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.xl\:placeholder-green-700::placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.xl\:placeholder-green-800:-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.xl\:placeholder-green-800::-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.xl\:placeholder-green-800::placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.xl\:placeholder-green-900:-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.xl\:placeholder-green-900::-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.xl\:placeholder-green-900::placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.xl\:placeholder-teal-100:-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.xl\:placeholder-teal-100::-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.xl\:placeholder-teal-100::placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.xl\:placeholder-teal-200:-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.xl\:placeholder-teal-200::-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.xl\:placeholder-teal-200::placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.xl\:placeholder-teal-300:-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.xl\:placeholder-teal-300::-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.xl\:placeholder-teal-300::placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.xl\:placeholder-teal-400:-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.xl\:placeholder-teal-400::-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.xl\:placeholder-teal-400::placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.xl\:placeholder-teal-500:-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.xl\:placeholder-teal-500::-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.xl\:placeholder-teal-500::placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.xl\:placeholder-teal-600:-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.xl\:placeholder-teal-600::-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.xl\:placeholder-teal-600::placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.xl\:placeholder-teal-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.xl\:placeholder-teal-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.xl\:placeholder-teal-700::placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.xl\:placeholder-teal-800:-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.xl\:placeholder-teal-800::-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.xl\:placeholder-teal-800::placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.xl\:placeholder-teal-900:-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.xl\:placeholder-teal-900::-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.xl\:placeholder-teal-900::placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.xl\:placeholder-blue-100:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.xl\:placeholder-blue-100::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.xl\:placeholder-blue-100::placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.xl\:placeholder-blue-200:-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.xl\:placeholder-blue-200::-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.xl\:placeholder-blue-200::placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.xl\:placeholder-blue-300:-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.xl\:placeholder-blue-300::-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.xl\:placeholder-blue-300::placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.xl\:placeholder-blue-400:-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.xl\:placeholder-blue-400::-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.xl\:placeholder-blue-400::placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.xl\:placeholder-blue-500:-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.xl\:placeholder-blue-500::-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.xl\:placeholder-blue-500::placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.xl\:placeholder-blue-600:-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.xl\:placeholder-blue-600::-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.xl\:placeholder-blue-600::placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.xl\:placeholder-blue-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.xl\:placeholder-blue-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.xl\:placeholder-blue-700::placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.xl\:placeholder-blue-800:-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.xl\:placeholder-blue-800::-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.xl\:placeholder-blue-800::placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.xl\:placeholder-blue-900:-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.xl\:placeholder-blue-900::-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.xl\:placeholder-blue-900::placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.xl\:placeholder-indigo-100:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.xl\:placeholder-indigo-100::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.xl\:placeholder-indigo-100::placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.xl\:placeholder-indigo-200:-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.xl\:placeholder-indigo-200::-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.xl\:placeholder-indigo-200::placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.xl\:placeholder-indigo-300:-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.xl\:placeholder-indigo-300::-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.xl\:placeholder-indigo-300::placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.xl\:placeholder-indigo-400:-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.xl\:placeholder-indigo-400::-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.xl\:placeholder-indigo-400::placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.xl\:placeholder-indigo-500:-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.xl\:placeholder-indigo-500::-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.xl\:placeholder-indigo-500::placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.xl\:placeholder-indigo-600:-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.xl\:placeholder-indigo-600::-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.xl\:placeholder-indigo-600::placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.xl\:placeholder-indigo-700:-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.xl\:placeholder-indigo-700::-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.xl\:placeholder-indigo-700::placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.xl\:placeholder-indigo-800:-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.xl\:placeholder-indigo-800::-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.xl\:placeholder-indigo-800::placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.xl\:placeholder-indigo-900:-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.xl\:placeholder-indigo-900::-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.xl\:placeholder-indigo-900::placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.xl\:placeholder-purple-100:-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.xl\:placeholder-purple-100::-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.xl\:placeholder-purple-100::placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.xl\:placeholder-purple-200:-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.xl\:placeholder-purple-200::-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.xl\:placeholder-purple-200::placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.xl\:placeholder-purple-300:-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.xl\:placeholder-purple-300::-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.xl\:placeholder-purple-300::placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.xl\:placeholder-purple-400:-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.xl\:placeholder-purple-400::-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.xl\:placeholder-purple-400::placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.xl\:placeholder-purple-500:-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.xl\:placeholder-purple-500::-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.xl\:placeholder-purple-500::placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.xl\:placeholder-purple-600:-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.xl\:placeholder-purple-600::-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.xl\:placeholder-purple-600::placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.xl\:placeholder-purple-700:-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.xl\:placeholder-purple-700::-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.xl\:placeholder-purple-700::placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.xl\:placeholder-purple-800:-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.xl\:placeholder-purple-800::-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.xl\:placeholder-purple-800::placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.xl\:placeholder-purple-900:-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.xl\:placeholder-purple-900::-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.xl\:placeholder-purple-900::placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.xl\:placeholder-pink-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.xl\:placeholder-pink-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.xl\:placeholder-pink-100::placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.xl\:placeholder-pink-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.xl\:placeholder-pink-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.xl\:placeholder-pink-200::placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.xl\:placeholder-pink-300:-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.xl\:placeholder-pink-300::-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.xl\:placeholder-pink-300::placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.xl\:placeholder-pink-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.xl\:placeholder-pink-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.xl\:placeholder-pink-400::placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.xl\:placeholder-pink-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.xl\:placeholder-pink-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.xl\:placeholder-pink-500::placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.xl\:placeholder-pink-600:-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.xl\:placeholder-pink-600::-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.xl\:placeholder-pink-600::placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.xl\:placeholder-pink-700:-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.xl\:placeholder-pink-700::-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.xl\:placeholder-pink-700::placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.xl\:placeholder-pink-800:-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.xl\:placeholder-pink-800::-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.xl\:placeholder-pink-800::placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.xl\:placeholder-pink-900:-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.xl\:placeholder-pink-900::-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.xl\:placeholder-pink-900::placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.xl\:focus\:placeholder-transparent:focus:-ms-input-placeholder{color:transparent}.xl\:focus\:placeholder-transparent:focus::-ms-input-placeholder{color:transparent}.xl\:focus\:placeholder-transparent:focus::placeholder{color:transparent}.xl\:focus\:placeholder-current:focus:-ms-input-placeholder{color:currentColor}.xl\:focus\:placeholder-current:focus::-ms-input-placeholder{color:currentColor}.xl\:focus\:placeholder-current:focus::placeholder{color:currentColor}.xl\:focus\:placeholder-black:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.xl\:focus\:placeholder-black:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.xl\:focus\:placeholder-black:focus::placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.xl\:focus\:placeholder-white:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-white:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-white:focus::placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-100:focus::placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-200:focus::placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-300:focus::placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-400:focus::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-500:focus::placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-600:focus::placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-700:focus::placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-800:focus::placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-900:focus::placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-100:focus::placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-200:focus::placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-300:focus::placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-400:focus::placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-500:focus::placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-600:focus::placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-700:focus::placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-800:focus::placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-900:focus::placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-100:focus::placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-200:focus::placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-300:focus::placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-400:focus::placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-500:focus::placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-600:focus::placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-700:focus::placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-800:focus::placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-900:focus::placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-100:focus::placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-200:focus::placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-300:focus::placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-400:focus::placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-500:focus::placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-600:focus::placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-700:focus::placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-800:focus::placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-900:focus::placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-100:focus::placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-200:focus::placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-300:focus::placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-400:focus::placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-500:focus::placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-600:focus::placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-700:focus::placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-800:focus::placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-900:focus::placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-100:focus::placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-200:focus::placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-300:focus::placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-400:focus::placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-500:focus::placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-600:focus::placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-700:focus::placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-800:focus::placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-900:focus::placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-100:focus::placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-200:focus::placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-300:focus::placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-400:focus::placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-500:focus::placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-600:focus::placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-700:focus::placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-800:focus::placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-900:focus::placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-100:focus::placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-200:focus::placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-300:focus::placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-400:focus::placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-500:focus::placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-600:focus::placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-700:focus::placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-800:focus::placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-900:focus::placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-100:focus::placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-200:focus::placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-300:focus::placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-400:focus::placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-500:focus::placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-600:focus::placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-700:focus::placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-800:focus::placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-900:focus::placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-100:focus::placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-200:focus::placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-300:focus::placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-400:focus::placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-500:focus::placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-600:focus::placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-700:focus::placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-800:focus::placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-900:focus::placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.xl\:placeholder-opacity-0:-ms-input-placeholder{--placeholder-opacity:0}.xl\:placeholder-opacity-0::-ms-input-placeholder{--placeholder-opacity:0}.xl\:placeholder-opacity-0::placeholder{--placeholder-opacity:0}.xl\:placeholder-opacity-25:-ms-input-placeholder{--placeholder-opacity:0.25}.xl\:placeholder-opacity-25::-ms-input-placeholder{--placeholder-opacity:0.25}.xl\:placeholder-opacity-25::placeholder{--placeholder-opacity:0.25}.xl\:placeholder-opacity-50:-ms-input-placeholder{--placeholder-opacity:0.5}.xl\:placeholder-opacity-50::-ms-input-placeholder{--placeholder-opacity:0.5}.xl\:placeholder-opacity-50::placeholder{--placeholder-opacity:0.5}.xl\:placeholder-opacity-75:-ms-input-placeholder{--placeholder-opacity:0.75}.xl\:placeholder-opacity-75::-ms-input-placeholder{--placeholder-opacity:0.75}.xl\:placeholder-opacity-75::placeholder{--placeholder-opacity:0.75}.xl\:placeholder-opacity-100:-ms-input-placeholder{--placeholder-opacity:1}.xl\:placeholder-opacity-100::-ms-input-placeholder{--placeholder-opacity:1}.xl\:placeholder-opacity-100::placeholder{--placeholder-opacity:1}.xl\:focus\:placeholder-opacity-0:focus:-ms-input-placeholder{--placeholder-opacity:0}.xl\:focus\:placeholder-opacity-0:focus::-ms-input-placeholder{--placeholder-opacity:0}.xl\:focus\:placeholder-opacity-0:focus::placeholder{--placeholder-opacity:0}.xl\:focus\:placeholder-opacity-25:focus:-ms-input-placeholder{--placeholder-opacity:0.25}.xl\:focus\:placeholder-opacity-25:focus::-ms-input-placeholder{--placeholder-opacity:0.25}.xl\:focus\:placeholder-opacity-25:focus::placeholder{--placeholder-opacity:0.25}.xl\:focus\:placeholder-opacity-50:focus:-ms-input-placeholder{--placeholder-opacity:0.5}.xl\:focus\:placeholder-opacity-50:focus::-ms-input-placeholder{--placeholder-opacity:0.5}.xl\:focus\:placeholder-opacity-50:focus::placeholder{--placeholder-opacity:0.5}.xl\:focus\:placeholder-opacity-75:focus:-ms-input-placeholder{--placeholder-opacity:0.75}.xl\:focus\:placeholder-opacity-75:focus::-ms-input-placeholder{--placeholder-opacity:0.75}.xl\:focus\:placeholder-opacity-75:focus::placeholder{--placeholder-opacity:0.75}.xl\:focus\:placeholder-opacity-100:focus:-ms-input-placeholder{--placeholder-opacity:1}.xl\:focus\:placeholder-opacity-100:focus::-ms-input-placeholder{--placeholder-opacity:1}.xl\:focus\:placeholder-opacity-100:focus::placeholder{--placeholder-opacity:1}.xl\:pointer-events-none{pointer-events:none}.xl\:pointer-events-auto{pointer-events:auto}.xl\:static{position:static}.xl\:fixed{position:fixed}.xl\:absolute{position:absolute}.xl\:relative{position:relative}.xl\:sticky{position:-webkit-sticky;position:sticky}.xl\:inset-0{top:0;right:0;bottom:0;left:0}.xl\:inset-auto{top:auto;right:auto;bottom:auto;left:auto}.xl\:inset-y-0{top:0;bottom:0}.xl\:inset-x-0{right:0;left:0}.xl\:inset-y-auto{top:auto;bottom:auto}.xl\:inset-x-auto{right:auto;left:auto}.xl\:top-0{top:0}.xl\:right-0{right:0}.xl\:bottom-0{bottom:0}.xl\:left-0{left:0}.xl\:top-auto{top:auto}.xl\:right-auto{right:auto}.xl\:bottom-auto{bottom:auto}.xl\:left-auto{left:auto}.xl\:resize-none{resize:none}.xl\:resize-y{resize:vertical}.xl\:resize-x{resize:horizontal}.xl\:resize{resize:both}.xl\:shadow-xs{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.xl\:shadow-sm{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.xl\:shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.xl\:shadow-md{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.xl\:shadow-lg{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.xl\:shadow-xl{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.xl\:shadow-2xl{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.xl\:shadow-inner{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.xl\:shadow-outline{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.xl\:shadow-none{box-shadow:none}.xl\:hover\:shadow-xs:hover{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.xl\:hover\:shadow-sm:hover{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.xl\:hover\:shadow:hover{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.xl\:hover\:shadow-md:hover{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.xl\:hover\:shadow-lg:hover{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.xl\:hover\:shadow-xl:hover{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.xl\:hover\:shadow-2xl:hover{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.xl\:hover\:shadow-inner:hover{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.xl\:hover\:shadow-outline:hover{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.xl\:hover\:shadow-none:hover{box-shadow:none}.xl\:focus\:shadow-xs:focus{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.xl\:focus\:shadow-sm:focus{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.xl\:focus\:shadow:focus{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.xl\:focus\:shadow-md:focus{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.xl\:focus\:shadow-lg:focus{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.xl\:focus\:shadow-xl:focus{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.xl\:focus\:shadow-2xl:focus{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.xl\:focus\:shadow-inner:focus{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.xl\:focus\:shadow-outline:focus{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.xl\:focus\:shadow-none:focus{box-shadow:none}.xl\:fill-current{fill:currentColor}.xl\:stroke-current{stroke:currentColor}.xl\:stroke-0{stroke-width:0}.xl\:stroke-1{stroke-width:1}.xl\:stroke-2{stroke-width:2}.xl\:table-auto{table-layout:auto}.xl\:table-fixed{table-layout:fixed}.xl\:text-left{text-align:left}.xl\:text-center{text-align:center}.xl\:text-right{text-align:right}.xl\:text-justify{text-align:justify}.xl\:text-transparent{color:transparent}.xl\:text-current{color:currentColor}.xl\:text-black{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.xl\:text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.xl\:text-gray-100{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.xl\:text-gray-200{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.xl\:text-gray-300{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.xl\:text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.xl\:text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.xl\:text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.xl\:text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.xl\:text-gray-800{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.xl\:text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.xl\:text-red-100{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.xl\:text-red-200{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.xl\:text-red-300{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.xl\:text-red-400{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.xl\:text-red-500{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.xl\:text-red-600{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.xl\:text-red-700{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.xl\:text-red-800{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.xl\:text-red-900{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.xl\:text-orange-100{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.xl\:text-orange-200{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.xl\:text-orange-300{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.xl\:text-orange-400{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.xl\:text-orange-500{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.xl\:text-orange-600{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.xl\:text-orange-700{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.xl\:text-orange-800{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.xl\:text-orange-900{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.xl\:text-yellow-100{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.xl\:text-yellow-200{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.xl\:text-yellow-300{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.xl\:text-yellow-400{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.xl\:text-yellow-500{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.xl\:text-yellow-600{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.xl\:text-yellow-700{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.xl\:text-yellow-800{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.xl\:text-yellow-900{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.xl\:text-green-100{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.xl\:text-green-200{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.xl\:text-green-300{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.xl\:text-green-400{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.xl\:text-green-500{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.xl\:text-green-600{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.xl\:text-green-700{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.xl\:text-green-800{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.xl\:text-green-900{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.xl\:text-teal-100{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.xl\:text-teal-200{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.xl\:text-teal-300{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.xl\:text-teal-400{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.xl\:text-teal-500{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.xl\:text-teal-600{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.xl\:text-teal-700{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.xl\:text-teal-800{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.xl\:text-teal-900{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.xl\:text-blue-100{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.xl\:text-blue-200{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.xl\:text-blue-300{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.xl\:text-blue-400{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.xl\:text-blue-500{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.xl\:text-blue-600{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.xl\:text-blue-700{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.xl\:text-blue-800{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.xl\:text-blue-900{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.xl\:text-indigo-100{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.xl\:text-indigo-200{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.xl\:text-indigo-300{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.xl\:text-indigo-400{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.xl\:text-indigo-500{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.xl\:text-indigo-600{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.xl\:text-indigo-700{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.xl\:text-indigo-800{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.xl\:text-indigo-900{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.xl\:text-purple-100{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.xl\:text-purple-200{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.xl\:text-purple-300{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.xl\:text-purple-400{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.xl\:text-purple-500{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.xl\:text-purple-600{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.xl\:text-purple-700{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.xl\:text-purple-800{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.xl\:text-purple-900{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.xl\:text-pink-100{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.xl\:text-pink-200{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.xl\:text-pink-300{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.xl\:text-pink-400{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.xl\:text-pink-500{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.xl\:text-pink-600{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.xl\:text-pink-700{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.xl\:text-pink-800{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.xl\:text-pink-900{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.xl\:hover\:text-transparent:hover{color:transparent}.xl\:hover\:text-current:hover{color:currentColor}.xl\:hover\:text-black:hover{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.xl\:hover\:text-white:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.xl\:hover\:text-gray-100:hover{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.xl\:hover\:text-gray-200:hover{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.xl\:hover\:text-gray-300:hover{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.xl\:hover\:text-gray-400:hover{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.xl\:hover\:text-gray-500:hover{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.xl\:hover\:text-gray-600:hover{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.xl\:hover\:text-gray-700:hover{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.xl\:hover\:text-gray-800:hover{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.xl\:hover\:text-gray-900:hover{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.xl\:hover\:text-red-100:hover{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.xl\:hover\:text-red-200:hover{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.xl\:hover\:text-red-300:hover{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.xl\:hover\:text-red-400:hover{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.xl\:hover\:text-red-500:hover{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.xl\:hover\:text-red-600:hover{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.xl\:hover\:text-red-700:hover{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.xl\:hover\:text-red-800:hover{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.xl\:hover\:text-red-900:hover{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.xl\:hover\:text-orange-100:hover{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.xl\:hover\:text-orange-200:hover{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.xl\:hover\:text-orange-300:hover{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.xl\:hover\:text-orange-400:hover{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.xl\:hover\:text-orange-500:hover{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.xl\:hover\:text-orange-600:hover{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.xl\:hover\:text-orange-700:hover{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.xl\:hover\:text-orange-800:hover{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.xl\:hover\:text-orange-900:hover{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.xl\:hover\:text-yellow-100:hover{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.xl\:hover\:text-yellow-200:hover{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.xl\:hover\:text-yellow-300:hover{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.xl\:hover\:text-yellow-400:hover{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.xl\:hover\:text-yellow-500:hover{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.xl\:hover\:text-yellow-600:hover{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.xl\:hover\:text-yellow-700:hover{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.xl\:hover\:text-yellow-800:hover{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.xl\:hover\:text-yellow-900:hover{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.xl\:hover\:text-green-100:hover{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.xl\:hover\:text-green-200:hover{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.xl\:hover\:text-green-300:hover{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.xl\:hover\:text-green-400:hover{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.xl\:hover\:text-green-500:hover{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.xl\:hover\:text-green-600:hover{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.xl\:hover\:text-green-700:hover{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.xl\:hover\:text-green-800:hover{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.xl\:hover\:text-green-900:hover{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.xl\:hover\:text-teal-100:hover{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.xl\:hover\:text-teal-200:hover{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.xl\:hover\:text-teal-300:hover{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.xl\:hover\:text-teal-400:hover{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.xl\:hover\:text-teal-500:hover{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.xl\:hover\:text-teal-600:hover{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.xl\:hover\:text-teal-700:hover{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.xl\:hover\:text-teal-800:hover{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.xl\:hover\:text-teal-900:hover{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.xl\:hover\:text-blue-100:hover{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.xl\:hover\:text-blue-200:hover{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.xl\:hover\:text-blue-300:hover{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.xl\:hover\:text-blue-400:hover{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.xl\:hover\:text-blue-500:hover{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.xl\:hover\:text-blue-600:hover{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.xl\:hover\:text-blue-700:hover{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.xl\:hover\:text-blue-800:hover{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.xl\:hover\:text-blue-900:hover{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.xl\:hover\:text-indigo-100:hover{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.xl\:hover\:text-indigo-200:hover{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.xl\:hover\:text-indigo-300:hover{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.xl\:hover\:text-indigo-400:hover{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.xl\:hover\:text-indigo-500:hover{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.xl\:hover\:text-indigo-600:hover{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.xl\:hover\:text-indigo-700:hover{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.xl\:hover\:text-indigo-800:hover{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.xl\:hover\:text-indigo-900:hover{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.xl\:hover\:text-purple-100:hover{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.xl\:hover\:text-purple-200:hover{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.xl\:hover\:text-purple-300:hover{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.xl\:hover\:text-purple-400:hover{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.xl\:hover\:text-purple-500:hover{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.xl\:hover\:text-purple-600:hover{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.xl\:hover\:text-purple-700:hover{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.xl\:hover\:text-purple-800:hover{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.xl\:hover\:text-purple-900:hover{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.xl\:hover\:text-pink-100:hover{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.xl\:hover\:text-pink-200:hover{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.xl\:hover\:text-pink-300:hover{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.xl\:hover\:text-pink-400:hover{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.xl\:hover\:text-pink-500:hover{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.xl\:hover\:text-pink-600:hover{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.xl\:hover\:text-pink-700:hover{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.xl\:hover\:text-pink-800:hover{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.xl\:hover\:text-pink-900:hover{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.xl\:focus\:text-transparent:focus{color:transparent}.xl\:focus\:text-current:focus{color:currentColor}.xl\:focus\:text-black:focus{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.xl\:focus\:text-white:focus{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.xl\:focus\:text-gray-100:focus{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.xl\:focus\:text-gray-200:focus{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.xl\:focus\:text-gray-300:focus{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.xl\:focus\:text-gray-400:focus{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.xl\:focus\:text-gray-500:focus{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.xl\:focus\:text-gray-600:focus{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.xl\:focus\:text-gray-700:focus{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.xl\:focus\:text-gray-800:focus{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.xl\:focus\:text-gray-900:focus{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.xl\:focus\:text-red-100:focus{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.xl\:focus\:text-red-200:focus{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.xl\:focus\:text-red-300:focus{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.xl\:focus\:text-red-400:focus{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.xl\:focus\:text-red-500:focus{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.xl\:focus\:text-red-600:focus{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.xl\:focus\:text-red-700:focus{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.xl\:focus\:text-red-800:focus{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.xl\:focus\:text-red-900:focus{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.xl\:focus\:text-orange-100:focus{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.xl\:focus\:text-orange-200:focus{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.xl\:focus\:text-orange-300:focus{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.xl\:focus\:text-orange-400:focus{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.xl\:focus\:text-orange-500:focus{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.xl\:focus\:text-orange-600:focus{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.xl\:focus\:text-orange-700:focus{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.xl\:focus\:text-orange-800:focus{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.xl\:focus\:text-orange-900:focus{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.xl\:focus\:text-yellow-100:focus{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.xl\:focus\:text-yellow-200:focus{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.xl\:focus\:text-yellow-300:focus{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.xl\:focus\:text-yellow-400:focus{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.xl\:focus\:text-yellow-500:focus{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.xl\:focus\:text-yellow-600:focus{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.xl\:focus\:text-yellow-700:focus{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.xl\:focus\:text-yellow-800:focus{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.xl\:focus\:text-yellow-900:focus{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.xl\:focus\:text-green-100:focus{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.xl\:focus\:text-green-200:focus{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.xl\:focus\:text-green-300:focus{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.xl\:focus\:text-green-400:focus{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.xl\:focus\:text-green-500:focus{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.xl\:focus\:text-green-600:focus{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.xl\:focus\:text-green-700:focus{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.xl\:focus\:text-green-800:focus{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.xl\:focus\:text-green-900:focus{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.xl\:focus\:text-teal-100:focus{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.xl\:focus\:text-teal-200:focus{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.xl\:focus\:text-teal-300:focus{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.xl\:focus\:text-teal-400:focus{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.xl\:focus\:text-teal-500:focus{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.xl\:focus\:text-teal-600:focus{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.xl\:focus\:text-teal-700:focus{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.xl\:focus\:text-teal-800:focus{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.xl\:focus\:text-teal-900:focus{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.xl\:focus\:text-blue-100:focus{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.xl\:focus\:text-blue-200:focus{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.xl\:focus\:text-blue-300:focus{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.xl\:focus\:text-blue-400:focus{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.xl\:focus\:text-blue-500:focus{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.xl\:focus\:text-blue-600:focus{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.xl\:focus\:text-blue-700:focus{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.xl\:focus\:text-blue-800:focus{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.xl\:focus\:text-blue-900:focus{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.xl\:focus\:text-indigo-100:focus{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.xl\:focus\:text-indigo-200:focus{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.xl\:focus\:text-indigo-300:focus{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.xl\:focus\:text-indigo-400:focus{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.xl\:focus\:text-indigo-500:focus{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.xl\:focus\:text-indigo-600:focus{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.xl\:focus\:text-indigo-700:focus{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.xl\:focus\:text-indigo-800:focus{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.xl\:focus\:text-indigo-900:focus{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.xl\:focus\:text-purple-100:focus{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.xl\:focus\:text-purple-200:focus{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.xl\:focus\:text-purple-300:focus{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.xl\:focus\:text-purple-400:focus{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.xl\:focus\:text-purple-500:focus{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.xl\:focus\:text-purple-600:focus{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.xl\:focus\:text-purple-700:focus{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.xl\:focus\:text-purple-800:focus{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.xl\:focus\:text-purple-900:focus{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.xl\:focus\:text-pink-100:focus{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.xl\:focus\:text-pink-200:focus{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.xl\:focus\:text-pink-300:focus{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.xl\:focus\:text-pink-400:focus{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.xl\:focus\:text-pink-500:focus{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.xl\:focus\:text-pink-600:focus{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.xl\:focus\:text-pink-700:focus{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.xl\:focus\:text-pink-800:focus{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.xl\:focus\:text-pink-900:focus{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.xl\:text-opacity-0{--text-opacity:0}.xl\:text-opacity-25{--text-opacity:0.25}.xl\:text-opacity-50{--text-opacity:0.5}.xl\:text-opacity-75{--text-opacity:0.75}.xl\:text-opacity-100{--text-opacity:1}.xl\:hover\:text-opacity-0:hover{--text-opacity:0}.xl\:hover\:text-opacity-25:hover{--text-opacity:0.25}.xl\:hover\:text-opacity-50:hover{--text-opacity:0.5}.xl\:hover\:text-opacity-75:hover{--text-opacity:0.75}.xl\:hover\:text-opacity-100:hover{--text-opacity:1}.xl\:focus\:text-opacity-0:focus{--text-opacity:0}.xl\:focus\:text-opacity-25:focus{--text-opacity:0.25}.xl\:focus\:text-opacity-50:focus{--text-opacity:0.5}.xl\:focus\:text-opacity-75:focus{--text-opacity:0.75}.xl\:focus\:text-opacity-100:focus{--text-opacity:1}.xl\:italic{font-style:italic}.xl\:not-italic{font-style:normal}.xl\:uppercase{text-transform:uppercase}.xl\:lowercase{text-transform:lowercase}.xl\:capitalize{text-transform:capitalize}.xl\:normal-case{text-transform:none}.xl\:underline{text-decoration:underline}.xl\:line-through{text-decoration:line-through}.xl\:no-underline{text-decoration:none}.xl\:hover\:underline:hover{text-decoration:underline}.xl\:hover\:line-through:hover{text-decoration:line-through}.xl\:hover\:no-underline:hover{text-decoration:none}.xl\:focus\:underline:focus{text-decoration:underline}.xl\:focus\:line-through:focus{text-decoration:line-through}.xl\:focus\:no-underline:focus{text-decoration:none}.xl\:antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.xl\:subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.xl\:diagonal-fractions,.xl\:lining-nums,.xl\:oldstyle-nums,.xl\:ordinal,.xl\:proportional-nums,.xl\:slashed-zero,.xl\:stacked-fractions,.xl\:tabular-nums{--font-variant-numeric-ordinal:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-slashed-zero:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-figure:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-spacing:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-fraction:var(--tailwind-empty, );/*!*//*!*/font-variant-numeric:var(--font-variant-numeric-ordinal) var(--font-variant-numeric-slashed-zero) var(--font-variant-numeric-figure) var(--font-variant-numeric-spacing) var(--font-variant-numeric-fraction)}.xl\:normal-nums{font-variant-numeric:normal}.xl\:ordinal{--font-variant-numeric-ordinal:ordinal}.xl\:slashed-zero{--font-variant-numeric-slashed-zero:slashed-zero}.xl\:lining-nums{--font-variant-numeric-figure:lining-nums}.xl\:oldstyle-nums{--font-variant-numeric-figure:oldstyle-nums}.xl\:proportional-nums{--font-variant-numeric-spacing:proportional-nums}.xl\:tabular-nums{--font-variant-numeric-spacing:tabular-nums}.xl\:diagonal-fractions{--font-variant-numeric-fraction:diagonal-fractions}.xl\:stacked-fractions{--font-variant-numeric-fraction:stacked-fractions}.xl\:tracking-tighter{letter-spacing:-.05em}.xl\:tracking-tight{letter-spacing:-.025em}.xl\:tracking-normal{letter-spacing:0}.xl\:tracking-wide{letter-spacing:.025em}.xl\:tracking-wider{letter-spacing:.05em}.xl\:tracking-widest{letter-spacing:.1em}.xl\:select-none{-webkit-user-select:none;-ms-user-select:none;user-select:none}.xl\:select-text{-webkit-user-select:text;-ms-user-select:text;user-select:text}.xl\:select-all{-webkit-user-select:all;-ms-user-select:all;user-select:all}.xl\:select-auto{-webkit-user-select:auto;-ms-user-select:auto;user-select:auto}.xl\:align-baseline{vertical-align:baseline}.xl\:align-top{vertical-align:top}.xl\:align-middle{vertical-align:middle}.xl\:align-bottom{vertical-align:bottom}.xl\:align-text-top{vertical-align:text-top}.xl\:align-text-bottom{vertical-align:text-bottom}.xl\:visible{visibility:visible}.xl\:invisible{visibility:hidden}.xl\:whitespace-normal{white-space:normal}.xl\:whitespace-no-wrap{white-space:nowrap}.xl\:whitespace-pre{white-space:pre}.xl\:whitespace-pre-line{white-space:pre-line}.xl\:whitespace-pre-wrap{white-space:pre-wrap}.xl\:break-normal{word-wrap:normal;overflow-wrap:normal;word-break:normal}.xl\:break-words{word-wrap:break-word;overflow-wrap:break-word}.xl\:break-all{word-break:break-all}.xl\:truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xl\:w-0{width:0}.xl\:w-1{width:.25rem}.xl\:w-2{width:.5rem}.xl\:w-3{width:.75rem}.xl\:w-4{width:1rem}.xl\:w-5{width:1.25rem}.xl\:w-6{width:1.5rem}.xl\:w-8{width:2rem}.xl\:w-10{width:2.5rem}.xl\:w-12{width:3rem}.xl\:w-16{width:4rem}.xl\:w-20{width:5rem}.xl\:w-24{width:6rem}.xl\:w-32{width:8rem}.xl\:w-40{width:10rem}.xl\:w-48{width:12rem}.xl\:w-56{width:14rem}.xl\:w-64{width:16rem}.xl\:w-auto{width:auto}.xl\:w-px{width:1px}.xl\:w-1\/2{width:50%}.xl\:w-1\/3{width:33.333333%}.xl\:w-2\/3{width:66.666667%}.xl\:w-1\/4{width:25%}.xl\:w-2\/4{width:50%}.xl\:w-3\/4{width:75%}.xl\:w-1\/5{width:20%}.xl\:w-2\/5{width:40%}.xl\:w-3\/5{width:60%}.xl\:w-4\/5{width:80%}.xl\:w-1\/6{width:16.666667%}.xl\:w-2\/6{width:33.333333%}.xl\:w-3\/6{width:50%}.xl\:w-4\/6{width:66.666667%}.xl\:w-5\/6{width:83.333333%}.xl\:w-1\/12{width:8.333333%}.xl\:w-2\/12{width:16.666667%}.xl\:w-3\/12{width:25%}.xl\:w-4\/12{width:33.333333%}.xl\:w-5\/12{width:41.666667%}.xl\:w-6\/12{width:50%}.xl\:w-7\/12{width:58.333333%}.xl\:w-8\/12{width:66.666667%}.xl\:w-9\/12{width:75%}.xl\:w-10\/12{width:83.333333%}.xl\:w-11\/12{width:91.666667%}.xl\:w-full{width:100%}.xl\:w-screen{width:100vw}.xl\:z-0{z-index:0}.xl\:z-10{z-index:10}.xl\:z-20{z-index:20}.xl\:z-30{z-index:30}.xl\:z-40{z-index:40}.xl\:z-50{z-index:50}.xl\:z-auto{z-index:auto}.xl\:gap-0{grid-gap:0;gap:0}.xl\:gap-1{grid-gap:.25rem;gap:.25rem}.xl\:gap-2{grid-gap:.5rem;gap:.5rem}.xl\:gap-3{grid-gap:.75rem;gap:.75rem}.xl\:gap-4{grid-gap:1rem;gap:1rem}.xl\:gap-5{grid-gap:1.25rem;gap:1.25rem}.xl\:gap-6{grid-gap:1.5rem;gap:1.5rem}.xl\:gap-8{grid-gap:2rem;gap:2rem}.xl\:gap-10{grid-gap:2.5rem;gap:2.5rem}.xl\:gap-12{grid-gap:3rem;gap:3rem}.xl\:gap-16{grid-gap:4rem;gap:4rem}.xl\:gap-20{grid-gap:5rem;gap:5rem}.xl\:gap-24{grid-gap:6rem;gap:6rem}.xl\:gap-32{grid-gap:8rem;gap:8rem}.xl\:gap-40{grid-gap:10rem;gap:10rem}.xl\:gap-48{grid-gap:12rem;gap:12rem}.xl\:gap-56{grid-gap:14rem;gap:14rem}.xl\:gap-64{grid-gap:16rem;gap:16rem}.xl\:gap-px{grid-gap:1px;gap:1px}.xl\:col-gap-0{grid-column-gap:0;column-gap:0}.xl\:col-gap-1{grid-column-gap:.25rem;column-gap:.25rem}.xl\:col-gap-2{grid-column-gap:.5rem;column-gap:.5rem}.xl\:col-gap-3{grid-column-gap:.75rem;column-gap:.75rem}.xl\:col-gap-4{grid-column-gap:1rem;column-gap:1rem}.xl\:col-gap-5{grid-column-gap:1.25rem;column-gap:1.25rem}.xl\:col-gap-6{grid-column-gap:1.5rem;column-gap:1.5rem}.xl\:col-gap-8{grid-column-gap:2rem;column-gap:2rem}.xl\:col-gap-10{grid-column-gap:2.5rem;column-gap:2.5rem}.xl\:col-gap-12{grid-column-gap:3rem;column-gap:3rem}.xl\:col-gap-16{grid-column-gap:4rem;column-gap:4rem}.xl\:col-gap-20{grid-column-gap:5rem;column-gap:5rem}.xl\:col-gap-24{grid-column-gap:6rem;column-gap:6rem}.xl\:col-gap-32{grid-column-gap:8rem;column-gap:8rem}.xl\:col-gap-40{grid-column-gap:10rem;column-gap:10rem}.xl\:col-gap-48{grid-column-gap:12rem;column-gap:12rem}.xl\:col-gap-56{grid-column-gap:14rem;column-gap:14rem}.xl\:col-gap-64{grid-column-gap:16rem;column-gap:16rem}.xl\:col-gap-px{grid-column-gap:1px;column-gap:1px}.xl\:gap-x-0{grid-column-gap:0;column-gap:0}.xl\:gap-x-1{grid-column-gap:.25rem;column-gap:.25rem}.xl\:gap-x-2{grid-column-gap:.5rem;column-gap:.5rem}.xl\:gap-x-3{grid-column-gap:.75rem;column-gap:.75rem}.xl\:gap-x-4{grid-column-gap:1rem;column-gap:1rem}.xl\:gap-x-5{grid-column-gap:1.25rem;column-gap:1.25rem}.xl\:gap-x-6{grid-column-gap:1.5rem;column-gap:1.5rem}.xl\:gap-x-8{grid-column-gap:2rem;column-gap:2rem}.xl\:gap-x-10{grid-column-gap:2.5rem;column-gap:2.5rem}.xl\:gap-x-12{grid-column-gap:3rem;column-gap:3rem}.xl\:gap-x-16{grid-column-gap:4rem;column-gap:4rem}.xl\:gap-x-20{grid-column-gap:5rem;column-gap:5rem}.xl\:gap-x-24{grid-column-gap:6rem;column-gap:6rem}.xl\:gap-x-32{grid-column-gap:8rem;column-gap:8rem}.xl\:gap-x-40{grid-column-gap:10rem;column-gap:10rem}.xl\:gap-x-48{grid-column-gap:12rem;column-gap:12rem}.xl\:gap-x-56{grid-column-gap:14rem;column-gap:14rem}.xl\:gap-x-64{grid-column-gap:16rem;column-gap:16rem}.xl\:gap-x-px{grid-column-gap:1px;column-gap:1px}.xl\:row-gap-0{grid-row-gap:0;row-gap:0}.xl\:row-gap-1{grid-row-gap:.25rem;row-gap:.25rem}.xl\:row-gap-2{grid-row-gap:.5rem;row-gap:.5rem}.xl\:row-gap-3{grid-row-gap:.75rem;row-gap:.75rem}.xl\:row-gap-4{grid-row-gap:1rem;row-gap:1rem}.xl\:row-gap-5{grid-row-gap:1.25rem;row-gap:1.25rem}.xl\:row-gap-6{grid-row-gap:1.5rem;row-gap:1.5rem}.xl\:row-gap-8{grid-row-gap:2rem;row-gap:2rem}.xl\:row-gap-10{grid-row-gap:2.5rem;row-gap:2.5rem}.xl\:row-gap-12{grid-row-gap:3rem;row-gap:3rem}.xl\:row-gap-16{grid-row-gap:4rem;row-gap:4rem}.xl\:row-gap-20{grid-row-gap:5rem;row-gap:5rem}.xl\:row-gap-24{grid-row-gap:6rem;row-gap:6rem}.xl\:row-gap-32{grid-row-gap:8rem;row-gap:8rem}.xl\:row-gap-40{grid-row-gap:10rem;row-gap:10rem}.xl\:row-gap-48{grid-row-gap:12rem;row-gap:12rem}.xl\:row-gap-56{grid-row-gap:14rem;row-gap:14rem}.xl\:row-gap-64{grid-row-gap:16rem;row-gap:16rem}.xl\:row-gap-px{grid-row-gap:1px;row-gap:1px}.xl\:gap-y-0{grid-row-gap:0;row-gap:0}.xl\:gap-y-1{grid-row-gap:.25rem;row-gap:.25rem}.xl\:gap-y-2{grid-row-gap:.5rem;row-gap:.5rem}.xl\:gap-y-3{grid-row-gap:.75rem;row-gap:.75rem}.xl\:gap-y-4{grid-row-gap:1rem;row-gap:1rem}.xl\:gap-y-5{grid-row-gap:1.25rem;row-gap:1.25rem}.xl\:gap-y-6{grid-row-gap:1.5rem;row-gap:1.5rem}.xl\:gap-y-8{grid-row-gap:2rem;row-gap:2rem}.xl\:gap-y-10{grid-row-gap:2.5rem;row-gap:2.5rem}.xl\:gap-y-12{grid-row-gap:3rem;row-gap:3rem}.xl\:gap-y-16{grid-row-gap:4rem;row-gap:4rem}.xl\:gap-y-20{grid-row-gap:5rem;row-gap:5rem}.xl\:gap-y-24{grid-row-gap:6rem;row-gap:6rem}.xl\:gap-y-32{grid-row-gap:8rem;row-gap:8rem}.xl\:gap-y-40{grid-row-gap:10rem;row-gap:10rem}.xl\:gap-y-48{grid-row-gap:12rem;row-gap:12rem}.xl\:gap-y-56{grid-row-gap:14rem;row-gap:14rem}.xl\:gap-y-64{grid-row-gap:16rem;row-gap:16rem}.xl\:gap-y-px{grid-row-gap:1px;row-gap:1px}.xl\:grid-flow-row{grid-auto-flow:row}.xl\:grid-flow-col{grid-auto-flow:column}.xl\:grid-flow-row-dense{grid-auto-flow:row dense}.xl\:grid-flow-col-dense{grid-auto-flow:column dense}.xl\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.xl\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.xl\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.xl\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.xl\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.xl\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.xl\:grid-cols-none{grid-template-columns:none}.xl\:auto-cols-auto{grid-auto-columns:auto}.xl\:auto-cols-min{grid-auto-columns:-webkit-min-content;grid-auto-columns:min-content}.xl\:auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.xl\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.xl\:col-auto{grid-column:auto}.xl\:col-span-1{grid-column:span 1/span 1}.xl\:col-span-2{grid-column:span 2/span 2}.xl\:col-span-3{grid-column:span 3/span 3}.xl\:col-span-4{grid-column:span 4/span 4}.xl\:col-span-5{grid-column:span 5/span 5}.xl\:col-span-6{grid-column:span 6/span 6}.xl\:col-span-7{grid-column:span 7/span 7}.xl\:col-span-8{grid-column:span 8/span 8}.xl\:col-span-9{grid-column:span 9/span 9}.xl\:col-span-10{grid-column:span 10/span 10}.xl\:col-span-11{grid-column:span 11/span 11}.xl\:col-span-12{grid-column:span 12/span 12}.xl\:col-span-full{grid-column:1/-1}.xl\:col-start-1{grid-column-start:1}.xl\:col-start-2{grid-column-start:2}.xl\:col-start-3{grid-column-start:3}.xl\:col-start-4{grid-column-start:4}.xl\:col-start-5{grid-column-start:5}.xl\:col-start-6{grid-column-start:6}.xl\:col-start-7{grid-column-start:7}.xl\:col-start-8{grid-column-start:8}.xl\:col-start-9{grid-column-start:9}.xl\:col-start-10{grid-column-start:10}.xl\:col-start-11{grid-column-start:11}.xl\:col-start-12{grid-column-start:12}.xl\:col-start-13{grid-column-start:13}.xl\:col-start-auto{grid-column-start:auto}.xl\:col-end-1{grid-column-end:1}.xl\:col-end-2{grid-column-end:2}.xl\:col-end-3{grid-column-end:3}.xl\:col-end-4{grid-column-end:4}.xl\:col-end-5{grid-column-end:5}.xl\:col-end-6{grid-column-end:6}.xl\:col-end-7{grid-column-end:7}.xl\:col-end-8{grid-column-end:8}.xl\:col-end-9{grid-column-end:9}.xl\:col-end-10{grid-column-end:10}.xl\:col-end-11{grid-column-end:11}.xl\:col-end-12{grid-column-end:12}.xl\:col-end-13{grid-column-end:13}.xl\:col-end-auto{grid-column-end:auto}.xl\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.xl\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.xl\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.xl\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.xl\:grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.xl\:grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.xl\:grid-rows-none{grid-template-rows:none}.xl\:auto-rows-auto{grid-auto-rows:auto}.xl\:auto-rows-min{grid-auto-rows:-webkit-min-content;grid-auto-rows:min-content}.xl\:auto-rows-max{grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}.xl\:auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.xl\:row-auto{grid-row:auto}.xl\:row-span-1{grid-row:span 1/span 1}.xl\:row-span-2{grid-row:span 2/span 2}.xl\:row-span-3{grid-row:span 3/span 3}.xl\:row-span-4{grid-row:span 4/span 4}.xl\:row-span-5{grid-row:span 5/span 5}.xl\:row-span-6{grid-row:span 6/span 6}.xl\:row-span-full{grid-row:1/-1}.xl\:row-start-1{grid-row-start:1}.xl\:row-start-2{grid-row-start:2}.xl\:row-start-3{grid-row-start:3}.xl\:row-start-4{grid-row-start:4}.xl\:row-start-5{grid-row-start:5}.xl\:row-start-6{grid-row-start:6}.xl\:row-start-7{grid-row-start:7}.xl\:row-start-auto{grid-row-start:auto}.xl\:row-end-1{grid-row-end:1}.xl\:row-end-2{grid-row-end:2}.xl\:row-end-3{grid-row-end:3}.xl\:row-end-4{grid-row-end:4}.xl\:row-end-5{grid-row-end:5}.xl\:row-end-6{grid-row-end:6}.xl\:row-end-7{grid-row-end:7}.xl\:row-end-auto{grid-row-end:auto}.xl\:transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.xl\:transform-none{transform:none}.xl\:origin-center{transform-origin:center}.xl\:origin-top{transform-origin:top}.xl\:origin-top-right{transform-origin:top right}.xl\:origin-right{transform-origin:right}.xl\:origin-bottom-right{transform-origin:bottom right}.xl\:origin-bottom{transform-origin:bottom}.xl\:origin-bottom-left{transform-origin:bottom left}.xl\:origin-left{transform-origin:left}.xl\:origin-top-left{transform-origin:top left}.xl\:scale-0{--transform-scale-x:0;--transform-scale-y:0}.xl\:scale-50{--transform-scale-x:.5;--transform-scale-y:.5}.xl\:scale-75{--transform-scale-x:.75;--transform-scale-y:.75}.xl\:scale-90{--transform-scale-x:.9;--transform-scale-y:.9}.xl\:scale-95{--transform-scale-x:.95;--transform-scale-y:.95}.xl\:scale-100{--transform-scale-x:1;--transform-scale-y:1}.xl\:scale-105{--transform-scale-x:1.05;--transform-scale-y:1.05}.xl\:scale-110{--transform-scale-x:1.1;--transform-scale-y:1.1}.xl\:scale-125{--transform-scale-x:1.25;--transform-scale-y:1.25}.xl\:scale-150{--transform-scale-x:1.5;--transform-scale-y:1.5}.xl\:scale-x-0{--transform-scale-x:0}.xl\:scale-x-50{--transform-scale-x:.5}.xl\:scale-x-75{--transform-scale-x:.75}.xl\:scale-x-90{--transform-scale-x:.9}.xl\:scale-x-95{--transform-scale-x:.95}.xl\:scale-x-100{--transform-scale-x:1}.xl\:scale-x-105{--transform-scale-x:1.05}.xl\:scale-x-110{--transform-scale-x:1.1}.xl\:scale-x-125{--transform-scale-x:1.25}.xl\:scale-x-150{--transform-scale-x:1.5}.xl\:scale-y-0{--transform-scale-y:0}.xl\:scale-y-50{--transform-scale-y:.5}.xl\:scale-y-75{--transform-scale-y:.75}.xl\:scale-y-90{--transform-scale-y:.9}.xl\:scale-y-95{--transform-scale-y:.95}.xl\:scale-y-100{--transform-scale-y:1}.xl\:scale-y-105{--transform-scale-y:1.05}.xl\:scale-y-110{--transform-scale-y:1.1}.xl\:scale-y-125{--transform-scale-y:1.25}.xl\:scale-y-150{--transform-scale-y:1.5}.xl\:hover\:scale-0:hover{--transform-scale-x:0;--transform-scale-y:0}.xl\:hover\:scale-50:hover{--transform-scale-x:.5;--transform-scale-y:.5}.xl\:hover\:scale-75:hover{--transform-scale-x:.75;--transform-scale-y:.75}.xl\:hover\:scale-90:hover{--transform-scale-x:.9;--transform-scale-y:.9}.xl\:hover\:scale-95:hover{--transform-scale-x:.95;--transform-scale-y:.95}.xl\:hover\:scale-100:hover{--transform-scale-x:1;--transform-scale-y:1}.xl\:hover\:scale-105:hover{--transform-scale-x:1.05;--transform-scale-y:1.05}.xl\:hover\:scale-110:hover{--transform-scale-x:1.1;--transform-scale-y:1.1}.xl\:hover\:scale-125:hover{--transform-scale-x:1.25;--transform-scale-y:1.25}.xl\:hover\:scale-150:hover{--transform-scale-x:1.5;--transform-scale-y:1.5}.xl\:hover\:scale-x-0:hover{--transform-scale-x:0}.xl\:hover\:scale-x-50:hover{--transform-scale-x:.5}.xl\:hover\:scale-x-75:hover{--transform-scale-x:.75}.xl\:hover\:scale-x-90:hover{--transform-scale-x:.9}.xl\:hover\:scale-x-95:hover{--transform-scale-x:.95}.xl\:hover\:scale-x-100:hover{--transform-scale-x:1}.xl\:hover\:scale-x-105:hover{--transform-scale-x:1.05}.xl\:hover\:scale-x-110:hover{--transform-scale-x:1.1}.xl\:hover\:scale-x-125:hover{--transform-scale-x:1.25}.xl\:hover\:scale-x-150:hover{--transform-scale-x:1.5}.xl\:hover\:scale-y-0:hover{--transform-scale-y:0}.xl\:hover\:scale-y-50:hover{--transform-scale-y:.5}.xl\:hover\:scale-y-75:hover{--transform-scale-y:.75}.xl\:hover\:scale-y-90:hover{--transform-scale-y:.9}.xl\:hover\:scale-y-95:hover{--transform-scale-y:.95}.xl\:hover\:scale-y-100:hover{--transform-scale-y:1}.xl\:hover\:scale-y-105:hover{--transform-scale-y:1.05}.xl\:hover\:scale-y-110:hover{--transform-scale-y:1.1}.xl\:hover\:scale-y-125:hover{--transform-scale-y:1.25}.xl\:hover\:scale-y-150:hover{--transform-scale-y:1.5}.xl\:focus\:scale-0:focus{--transform-scale-x:0;--transform-scale-y:0}.xl\:focus\:scale-50:focus{--transform-scale-x:.5;--transform-scale-y:.5}.xl\:focus\:scale-75:focus{--transform-scale-x:.75;--transform-scale-y:.75}.xl\:focus\:scale-90:focus{--transform-scale-x:.9;--transform-scale-y:.9}.xl\:focus\:scale-95:focus{--transform-scale-x:.95;--transform-scale-y:.95}.xl\:focus\:scale-100:focus{--transform-scale-x:1;--transform-scale-y:1}.xl\:focus\:scale-105:focus{--transform-scale-x:1.05;--transform-scale-y:1.05}.xl\:focus\:scale-110:focus{--transform-scale-x:1.1;--transform-scale-y:1.1}.xl\:focus\:scale-125:focus{--transform-scale-x:1.25;--transform-scale-y:1.25}.xl\:focus\:scale-150:focus{--transform-scale-x:1.5;--transform-scale-y:1.5}.xl\:focus\:scale-x-0:focus{--transform-scale-x:0}.xl\:focus\:scale-x-50:focus{--transform-scale-x:.5}.xl\:focus\:scale-x-75:focus{--transform-scale-x:.75}.xl\:focus\:scale-x-90:focus{--transform-scale-x:.9}.xl\:focus\:scale-x-95:focus{--transform-scale-x:.95}.xl\:focus\:scale-x-100:focus{--transform-scale-x:1}.xl\:focus\:scale-x-105:focus{--transform-scale-x:1.05}.xl\:focus\:scale-x-110:focus{--transform-scale-x:1.1}.xl\:focus\:scale-x-125:focus{--transform-scale-x:1.25}.xl\:focus\:scale-x-150:focus{--transform-scale-x:1.5}.xl\:focus\:scale-y-0:focus{--transform-scale-y:0}.xl\:focus\:scale-y-50:focus{--transform-scale-y:.5}.xl\:focus\:scale-y-75:focus{--transform-scale-y:.75}.xl\:focus\:scale-y-90:focus{--transform-scale-y:.9}.xl\:focus\:scale-y-95:focus{--transform-scale-y:.95}.xl\:focus\:scale-y-100:focus{--transform-scale-y:1}.xl\:focus\:scale-y-105:focus{--transform-scale-y:1.05}.xl\:focus\:scale-y-110:focus{--transform-scale-y:1.1}.xl\:focus\:scale-y-125:focus{--transform-scale-y:1.25}.xl\:focus\:scale-y-150:focus{--transform-scale-y:1.5}.xl\:rotate-0{--transform-rotate:0}.xl\:rotate-1{--transform-rotate:1deg}.xl\:rotate-2{--transform-rotate:2deg}.xl\:rotate-3{--transform-rotate:3deg}.xl\:rotate-6{--transform-rotate:6deg}.xl\:rotate-12{--transform-rotate:12deg}.xl\:rotate-45{--transform-rotate:45deg}.xl\:rotate-90{--transform-rotate:90deg}.xl\:rotate-180{--transform-rotate:180deg}.xl\:-rotate-180{--transform-rotate:-180deg}.xl\:-rotate-90{--transform-rotate:-90deg}.xl\:-rotate-45{--transform-rotate:-45deg}.xl\:-rotate-12{--transform-rotate:-12deg}.xl\:-rotate-6{--transform-rotate:-6deg}.xl\:-rotate-3{--transform-rotate:-3deg}.xl\:-rotate-2{--transform-rotate:-2deg}.xl\:-rotate-1{--transform-rotate:-1deg}.xl\:hover\:rotate-0:hover{--transform-rotate:0}.xl\:hover\:rotate-1:hover{--transform-rotate:1deg}.xl\:hover\:rotate-2:hover{--transform-rotate:2deg}.xl\:hover\:rotate-3:hover{--transform-rotate:3deg}.xl\:hover\:rotate-6:hover{--transform-rotate:6deg}.xl\:hover\:rotate-12:hover{--transform-rotate:12deg}.xl\:hover\:rotate-45:hover{--transform-rotate:45deg}.xl\:hover\:rotate-90:hover{--transform-rotate:90deg}.xl\:hover\:rotate-180:hover{--transform-rotate:180deg}.xl\:hover\:-rotate-180:hover{--transform-rotate:-180deg}.xl\:hover\:-rotate-90:hover{--transform-rotate:-90deg}.xl\:hover\:-rotate-45:hover{--transform-rotate:-45deg}.xl\:hover\:-rotate-12:hover{--transform-rotate:-12deg}.xl\:hover\:-rotate-6:hover{--transform-rotate:-6deg}.xl\:hover\:-rotate-3:hover{--transform-rotate:-3deg}.xl\:hover\:-rotate-2:hover{--transform-rotate:-2deg}.xl\:hover\:-rotate-1:hover{--transform-rotate:-1deg}.xl\:focus\:rotate-0:focus{--transform-rotate:0}.xl\:focus\:rotate-1:focus{--transform-rotate:1deg}.xl\:focus\:rotate-2:focus{--transform-rotate:2deg}.xl\:focus\:rotate-3:focus{--transform-rotate:3deg}.xl\:focus\:rotate-6:focus{--transform-rotate:6deg}.xl\:focus\:rotate-12:focus{--transform-rotate:12deg}.xl\:focus\:rotate-45:focus{--transform-rotate:45deg}.xl\:focus\:rotate-90:focus{--transform-rotate:90deg}.xl\:focus\:rotate-180:focus{--transform-rotate:180deg}.xl\:focus\:-rotate-180:focus{--transform-rotate:-180deg}.xl\:focus\:-rotate-90:focus{--transform-rotate:-90deg}.xl\:focus\:-rotate-45:focus{--transform-rotate:-45deg}.xl\:focus\:-rotate-12:focus{--transform-rotate:-12deg}.xl\:focus\:-rotate-6:focus{--transform-rotate:-6deg}.xl\:focus\:-rotate-3:focus{--transform-rotate:-3deg}.xl\:focus\:-rotate-2:focus{--transform-rotate:-2deg}.xl\:focus\:-rotate-1:focus{--transform-rotate:-1deg}.xl\:translate-x-0{--transform-translate-x:0}.xl\:translate-x-1{--transform-translate-x:0.25rem}.xl\:translate-x-2{--transform-translate-x:0.5rem}.xl\:translate-x-3{--transform-translate-x:0.75rem}.xl\:translate-x-4{--transform-translate-x:1rem}.xl\:translate-x-5{--transform-translate-x:1.25rem}.xl\:translate-x-6{--transform-translate-x:1.5rem}.xl\:translate-x-8{--transform-translate-x:2rem}.xl\:translate-x-10{--transform-translate-x:2.5rem}.xl\:translate-x-12{--transform-translate-x:3rem}.xl\:translate-x-16{--transform-translate-x:4rem}.xl\:translate-x-20{--transform-translate-x:5rem}.xl\:translate-x-24{--transform-translate-x:6rem}.xl\:translate-x-32{--transform-translate-x:8rem}.xl\:translate-x-40{--transform-translate-x:10rem}.xl\:translate-x-48{--transform-translate-x:12rem}.xl\:translate-x-56{--transform-translate-x:14rem}.xl\:translate-x-64{--transform-translate-x:16rem}.xl\:translate-x-px{--transform-translate-x:1px}.xl\:-translate-x-1{--transform-translate-x:-0.25rem}.xl\:-translate-x-2{--transform-translate-x:-0.5rem}.xl\:-translate-x-3{--transform-translate-x:-0.75rem}.xl\:-translate-x-4{--transform-translate-x:-1rem}.xl\:-translate-x-5{--transform-translate-x:-1.25rem}.xl\:-translate-x-6{--transform-translate-x:-1.5rem}.xl\:-translate-x-8{--transform-translate-x:-2rem}.xl\:-translate-x-10{--transform-translate-x:-2.5rem}.xl\:-translate-x-12{--transform-translate-x:-3rem}.xl\:-translate-x-16{--transform-translate-x:-4rem}.xl\:-translate-x-20{--transform-translate-x:-5rem}.xl\:-translate-x-24{--transform-translate-x:-6rem}.xl\:-translate-x-32{--transform-translate-x:-8rem}.xl\:-translate-x-40{--transform-translate-x:-10rem}.xl\:-translate-x-48{--transform-translate-x:-12rem}.xl\:-translate-x-56{--transform-translate-x:-14rem}.xl\:-translate-x-64{--transform-translate-x:-16rem}.xl\:-translate-x-px{--transform-translate-x:-1px}.xl\:-translate-x-full{--transform-translate-x:-100%}.xl\:-translate-x-1\/2{--transform-translate-x:-50%}.xl\:translate-x-1\/2{--transform-translate-x:50%}.xl\:translate-x-full{--transform-translate-x:100%}.xl\:translate-y-0{--transform-translate-y:0}.xl\:translate-y-1{--transform-translate-y:0.25rem}.xl\:translate-y-2{--transform-translate-y:0.5rem}.xl\:translate-y-3{--transform-translate-y:0.75rem}.xl\:translate-y-4{--transform-translate-y:1rem}.xl\:translate-y-5{--transform-translate-y:1.25rem}.xl\:translate-y-6{--transform-translate-y:1.5rem}.xl\:translate-y-8{--transform-translate-y:2rem}.xl\:translate-y-10{--transform-translate-y:2.5rem}.xl\:translate-y-12{--transform-translate-y:3rem}.xl\:translate-y-16{--transform-translate-y:4rem}.xl\:translate-y-20{--transform-translate-y:5rem}.xl\:translate-y-24{--transform-translate-y:6rem}.xl\:translate-y-32{--transform-translate-y:8rem}.xl\:translate-y-40{--transform-translate-y:10rem}.xl\:translate-y-48{--transform-translate-y:12rem}.xl\:translate-y-56{--transform-translate-y:14rem}.xl\:translate-y-64{--transform-translate-y:16rem}.xl\:translate-y-px{--transform-translate-y:1px}.xl\:-translate-y-1{--transform-translate-y:-0.25rem}.xl\:-translate-y-2{--transform-translate-y:-0.5rem}.xl\:-translate-y-3{--transform-translate-y:-0.75rem}.xl\:-translate-y-4{--transform-translate-y:-1rem}.xl\:-translate-y-5{--transform-translate-y:-1.25rem}.xl\:-translate-y-6{--transform-translate-y:-1.5rem}.xl\:-translate-y-8{--transform-translate-y:-2rem}.xl\:-translate-y-10{--transform-translate-y:-2.5rem}.xl\:-translate-y-12{--transform-translate-y:-3rem}.xl\:-translate-y-16{--transform-translate-y:-4rem}.xl\:-translate-y-20{--transform-translate-y:-5rem}.xl\:-translate-y-24{--transform-translate-y:-6rem}.xl\:-translate-y-32{--transform-translate-y:-8rem}.xl\:-translate-y-40{--transform-translate-y:-10rem}.xl\:-translate-y-48{--transform-translate-y:-12rem}.xl\:-translate-y-56{--transform-translate-y:-14rem}.xl\:-translate-y-64{--transform-translate-y:-16rem}.xl\:-translate-y-px{--transform-translate-y:-1px}.xl\:-translate-y-full{--transform-translate-y:-100%}.xl\:-translate-y-1\/2{--transform-translate-y:-50%}.xl\:translate-y-1\/2{--transform-translate-y:50%}.xl\:translate-y-full{--transform-translate-y:100%}.xl\:hover\:translate-x-0:hover{--transform-translate-x:0}.xl\:hover\:translate-x-1:hover{--transform-translate-x:0.25rem}.xl\:hover\:translate-x-2:hover{--transform-translate-x:0.5rem}.xl\:hover\:translate-x-3:hover{--transform-translate-x:0.75rem}.xl\:hover\:translate-x-4:hover{--transform-translate-x:1rem}.xl\:hover\:translate-x-5:hover{--transform-translate-x:1.25rem}.xl\:hover\:translate-x-6:hover{--transform-translate-x:1.5rem}.xl\:hover\:translate-x-8:hover{--transform-translate-x:2rem}.xl\:hover\:translate-x-10:hover{--transform-translate-x:2.5rem}.xl\:hover\:translate-x-12:hover{--transform-translate-x:3rem}.xl\:hover\:translate-x-16:hover{--transform-translate-x:4rem}.xl\:hover\:translate-x-20:hover{--transform-translate-x:5rem}.xl\:hover\:translate-x-24:hover{--transform-translate-x:6rem}.xl\:hover\:translate-x-32:hover{--transform-translate-x:8rem}.xl\:hover\:translate-x-40:hover{--transform-translate-x:10rem}.xl\:hover\:translate-x-48:hover{--transform-translate-x:12rem}.xl\:hover\:translate-x-56:hover{--transform-translate-x:14rem}.xl\:hover\:translate-x-64:hover{--transform-translate-x:16rem}.xl\:hover\:translate-x-px:hover{--transform-translate-x:1px}.xl\:hover\:-translate-x-1:hover{--transform-translate-x:-0.25rem}.xl\:hover\:-translate-x-2:hover{--transform-translate-x:-0.5rem}.xl\:hover\:-translate-x-3:hover{--transform-translate-x:-0.75rem}.xl\:hover\:-translate-x-4:hover{--transform-translate-x:-1rem}.xl\:hover\:-translate-x-5:hover{--transform-translate-x:-1.25rem}.xl\:hover\:-translate-x-6:hover{--transform-translate-x:-1.5rem}.xl\:hover\:-translate-x-8:hover{--transform-translate-x:-2rem}.xl\:hover\:-translate-x-10:hover{--transform-translate-x:-2.5rem}.xl\:hover\:-translate-x-12:hover{--transform-translate-x:-3rem}.xl\:hover\:-translate-x-16:hover{--transform-translate-x:-4rem}.xl\:hover\:-translate-x-20:hover{--transform-translate-x:-5rem}.xl\:hover\:-translate-x-24:hover{--transform-translate-x:-6rem}.xl\:hover\:-translate-x-32:hover{--transform-translate-x:-8rem}.xl\:hover\:-translate-x-40:hover{--transform-translate-x:-10rem}.xl\:hover\:-translate-x-48:hover{--transform-translate-x:-12rem}.xl\:hover\:-translate-x-56:hover{--transform-translate-x:-14rem}.xl\:hover\:-translate-x-64:hover{--transform-translate-x:-16rem}.xl\:hover\:-translate-x-px:hover{--transform-translate-x:-1px}.xl\:hover\:-translate-x-full:hover{--transform-translate-x:-100%}.xl\:hover\:-translate-x-1\/2:hover{--transform-translate-x:-50%}.xl\:hover\:translate-x-1\/2:hover{--transform-translate-x:50%}.xl\:hover\:translate-x-full:hover{--transform-translate-x:100%}.xl\:hover\:translate-y-0:hover{--transform-translate-y:0}.xl\:hover\:translate-y-1:hover{--transform-translate-y:0.25rem}.xl\:hover\:translate-y-2:hover{--transform-translate-y:0.5rem}.xl\:hover\:translate-y-3:hover{--transform-translate-y:0.75rem}.xl\:hover\:translate-y-4:hover{--transform-translate-y:1rem}.xl\:hover\:translate-y-5:hover{--transform-translate-y:1.25rem}.xl\:hover\:translate-y-6:hover{--transform-translate-y:1.5rem}.xl\:hover\:translate-y-8:hover{--transform-translate-y:2rem}.xl\:hover\:translate-y-10:hover{--transform-translate-y:2.5rem}.xl\:hover\:translate-y-12:hover{--transform-translate-y:3rem}.xl\:hover\:translate-y-16:hover{--transform-translate-y:4rem}.xl\:hover\:translate-y-20:hover{--transform-translate-y:5rem}.xl\:hover\:translate-y-24:hover{--transform-translate-y:6rem}.xl\:hover\:translate-y-32:hover{--transform-translate-y:8rem}.xl\:hover\:translate-y-40:hover{--transform-translate-y:10rem}.xl\:hover\:translate-y-48:hover{--transform-translate-y:12rem}.xl\:hover\:translate-y-56:hover{--transform-translate-y:14rem}.xl\:hover\:translate-y-64:hover{--transform-translate-y:16rem}.xl\:hover\:translate-y-px:hover{--transform-translate-y:1px}.xl\:hover\:-translate-y-1:hover{--transform-translate-y:-0.25rem}.xl\:hover\:-translate-y-2:hover{--transform-translate-y:-0.5rem}.xl\:hover\:-translate-y-3:hover{--transform-translate-y:-0.75rem}.xl\:hover\:-translate-y-4:hover{--transform-translate-y:-1rem}.xl\:hover\:-translate-y-5:hover{--transform-translate-y:-1.25rem}.xl\:hover\:-translate-y-6:hover{--transform-translate-y:-1.5rem}.xl\:hover\:-translate-y-8:hover{--transform-translate-y:-2rem}.xl\:hover\:-translate-y-10:hover{--transform-translate-y:-2.5rem}.xl\:hover\:-translate-y-12:hover{--transform-translate-y:-3rem}.xl\:hover\:-translate-y-16:hover{--transform-translate-y:-4rem}.xl\:hover\:-translate-y-20:hover{--transform-translate-y:-5rem}.xl\:hover\:-translate-y-24:hover{--transform-translate-y:-6rem}.xl\:hover\:-translate-y-32:hover{--transform-translate-y:-8rem}.xl\:hover\:-translate-y-40:hover{--transform-translate-y:-10rem}.xl\:hover\:-translate-y-48:hover{--transform-translate-y:-12rem}.xl\:hover\:-translate-y-56:hover{--transform-translate-y:-14rem}.xl\:hover\:-translate-y-64:hover{--transform-translate-y:-16rem}.xl\:hover\:-translate-y-px:hover{--transform-translate-y:-1px}.xl\:hover\:-translate-y-full:hover{--transform-translate-y:-100%}.xl\:hover\:-translate-y-1\/2:hover{--transform-translate-y:-50%}.xl\:hover\:translate-y-1\/2:hover{--transform-translate-y:50%}.xl\:hover\:translate-y-full:hover{--transform-translate-y:100%}.xl\:focus\:translate-x-0:focus{--transform-translate-x:0}.xl\:focus\:translate-x-1:focus{--transform-translate-x:0.25rem}.xl\:focus\:translate-x-2:focus{--transform-translate-x:0.5rem}.xl\:focus\:translate-x-3:focus{--transform-translate-x:0.75rem}.xl\:focus\:translate-x-4:focus{--transform-translate-x:1rem}.xl\:focus\:translate-x-5:focus{--transform-translate-x:1.25rem}.xl\:focus\:translate-x-6:focus{--transform-translate-x:1.5rem}.xl\:focus\:translate-x-8:focus{--transform-translate-x:2rem}.xl\:focus\:translate-x-10:focus{--transform-translate-x:2.5rem}.xl\:focus\:translate-x-12:focus{--transform-translate-x:3rem}.xl\:focus\:translate-x-16:focus{--transform-translate-x:4rem}.xl\:focus\:translate-x-20:focus{--transform-translate-x:5rem}.xl\:focus\:translate-x-24:focus{--transform-translate-x:6rem}.xl\:focus\:translate-x-32:focus{--transform-translate-x:8rem}.xl\:focus\:translate-x-40:focus{--transform-translate-x:10rem}.xl\:focus\:translate-x-48:focus{--transform-translate-x:12rem}.xl\:focus\:translate-x-56:focus{--transform-translate-x:14rem}.xl\:focus\:translate-x-64:focus{--transform-translate-x:16rem}.xl\:focus\:translate-x-px:focus{--transform-translate-x:1px}.xl\:focus\:-translate-x-1:focus{--transform-translate-x:-0.25rem}.xl\:focus\:-translate-x-2:focus{--transform-translate-x:-0.5rem}.xl\:focus\:-translate-x-3:focus{--transform-translate-x:-0.75rem}.xl\:focus\:-translate-x-4:focus{--transform-translate-x:-1rem}.xl\:focus\:-translate-x-5:focus{--transform-translate-x:-1.25rem}.xl\:focus\:-translate-x-6:focus{--transform-translate-x:-1.5rem}.xl\:focus\:-translate-x-8:focus{--transform-translate-x:-2rem}.xl\:focus\:-translate-x-10:focus{--transform-translate-x:-2.5rem}.xl\:focus\:-translate-x-12:focus{--transform-translate-x:-3rem}.xl\:focus\:-translate-x-16:focus{--transform-translate-x:-4rem}.xl\:focus\:-translate-x-20:focus{--transform-translate-x:-5rem}.xl\:focus\:-translate-x-24:focus{--transform-translate-x:-6rem}.xl\:focus\:-translate-x-32:focus{--transform-translate-x:-8rem}.xl\:focus\:-translate-x-40:focus{--transform-translate-x:-10rem}.xl\:focus\:-translate-x-48:focus{--transform-translate-x:-12rem}.xl\:focus\:-translate-x-56:focus{--transform-translate-x:-14rem}.xl\:focus\:-translate-x-64:focus{--transform-translate-x:-16rem}.xl\:focus\:-translate-x-px:focus{--transform-translate-x:-1px}.xl\:focus\:-translate-x-full:focus{--transform-translate-x:-100%}.xl\:focus\:-translate-x-1\/2:focus{--transform-translate-x:-50%}.xl\:focus\:translate-x-1\/2:focus{--transform-translate-x:50%}.xl\:focus\:translate-x-full:focus{--transform-translate-x:100%}.xl\:focus\:translate-y-0:focus{--transform-translate-y:0}.xl\:focus\:translate-y-1:focus{--transform-translate-y:0.25rem}.xl\:focus\:translate-y-2:focus{--transform-translate-y:0.5rem}.xl\:focus\:translate-y-3:focus{--transform-translate-y:0.75rem}.xl\:focus\:translate-y-4:focus{--transform-translate-y:1rem}.xl\:focus\:translate-y-5:focus{--transform-translate-y:1.25rem}.xl\:focus\:translate-y-6:focus{--transform-translate-y:1.5rem}.xl\:focus\:translate-y-8:focus{--transform-translate-y:2rem}.xl\:focus\:translate-y-10:focus{--transform-translate-y:2.5rem}.xl\:focus\:translate-y-12:focus{--transform-translate-y:3rem}.xl\:focus\:translate-y-16:focus{--transform-translate-y:4rem}.xl\:focus\:translate-y-20:focus{--transform-translate-y:5rem}.xl\:focus\:translate-y-24:focus{--transform-translate-y:6rem}.xl\:focus\:translate-y-32:focus{--transform-translate-y:8rem}.xl\:focus\:translate-y-40:focus{--transform-translate-y:10rem}.xl\:focus\:translate-y-48:focus{--transform-translate-y:12rem}.xl\:focus\:translate-y-56:focus{--transform-translate-y:14rem}.xl\:focus\:translate-y-64:focus{--transform-translate-y:16rem}.xl\:focus\:translate-y-px:focus{--transform-translate-y:1px}.xl\:focus\:-translate-y-1:focus{--transform-translate-y:-0.25rem}.xl\:focus\:-translate-y-2:focus{--transform-translate-y:-0.5rem}.xl\:focus\:-translate-y-3:focus{--transform-translate-y:-0.75rem}.xl\:focus\:-translate-y-4:focus{--transform-translate-y:-1rem}.xl\:focus\:-translate-y-5:focus{--transform-translate-y:-1.25rem}.xl\:focus\:-translate-y-6:focus{--transform-translate-y:-1.5rem}.xl\:focus\:-translate-y-8:focus{--transform-translate-y:-2rem}.xl\:focus\:-translate-y-10:focus{--transform-translate-y:-2.5rem}.xl\:focus\:-translate-y-12:focus{--transform-translate-y:-3rem}.xl\:focus\:-translate-y-16:focus{--transform-translate-y:-4rem}.xl\:focus\:-translate-y-20:focus{--transform-translate-y:-5rem}.xl\:focus\:-translate-y-24:focus{--transform-translate-y:-6rem}.xl\:focus\:-translate-y-32:focus{--transform-translate-y:-8rem}.xl\:focus\:-translate-y-40:focus{--transform-translate-y:-10rem}.xl\:focus\:-translate-y-48:focus{--transform-translate-y:-12rem}.xl\:focus\:-translate-y-56:focus{--transform-translate-y:-14rem}.xl\:focus\:-translate-y-64:focus{--transform-translate-y:-16rem}.xl\:focus\:-translate-y-px:focus{--transform-translate-y:-1px}.xl\:focus\:-translate-y-full:focus{--transform-translate-y:-100%}.xl\:focus\:-translate-y-1\/2:focus{--transform-translate-y:-50%}.xl\:focus\:translate-y-1\/2:focus{--transform-translate-y:50%}.xl\:focus\:translate-y-full:focus{--transform-translate-y:100%}.xl\:skew-x-0{--transform-skew-x:0}.xl\:skew-x-1{--transform-skew-x:1deg}.xl\:skew-x-2{--transform-skew-x:2deg}.xl\:skew-x-3{--transform-skew-x:3deg}.xl\:skew-x-6{--transform-skew-x:6deg}.xl\:skew-x-12{--transform-skew-x:12deg}.xl\:-skew-x-12{--transform-skew-x:-12deg}.xl\:-skew-x-6{--transform-skew-x:-6deg}.xl\:-skew-x-3{--transform-skew-x:-3deg}.xl\:-skew-x-2{--transform-skew-x:-2deg}.xl\:-skew-x-1{--transform-skew-x:-1deg}.xl\:skew-y-0{--transform-skew-y:0}.xl\:skew-y-1{--transform-skew-y:1deg}.xl\:skew-y-2{--transform-skew-y:2deg}.xl\:skew-y-3{--transform-skew-y:3deg}.xl\:skew-y-6{--transform-skew-y:6deg}.xl\:skew-y-12{--transform-skew-y:12deg}.xl\:-skew-y-12{--transform-skew-y:-12deg}.xl\:-skew-y-6{--transform-skew-y:-6deg}.xl\:-skew-y-3{--transform-skew-y:-3deg}.xl\:-skew-y-2{--transform-skew-y:-2deg}.xl\:-skew-y-1{--transform-skew-y:-1deg}.xl\:hover\:skew-x-0:hover{--transform-skew-x:0}.xl\:hover\:skew-x-1:hover{--transform-skew-x:1deg}.xl\:hover\:skew-x-2:hover{--transform-skew-x:2deg}.xl\:hover\:skew-x-3:hover{--transform-skew-x:3deg}.xl\:hover\:skew-x-6:hover{--transform-skew-x:6deg}.xl\:hover\:skew-x-12:hover{--transform-skew-x:12deg}.xl\:hover\:-skew-x-12:hover{--transform-skew-x:-12deg}.xl\:hover\:-skew-x-6:hover{--transform-skew-x:-6deg}.xl\:hover\:-skew-x-3:hover{--transform-skew-x:-3deg}.xl\:hover\:-skew-x-2:hover{--transform-skew-x:-2deg}.xl\:hover\:-skew-x-1:hover{--transform-skew-x:-1deg}.xl\:hover\:skew-y-0:hover{--transform-skew-y:0}.xl\:hover\:skew-y-1:hover{--transform-skew-y:1deg}.xl\:hover\:skew-y-2:hover{--transform-skew-y:2deg}.xl\:hover\:skew-y-3:hover{--transform-skew-y:3deg}.xl\:hover\:skew-y-6:hover{--transform-skew-y:6deg}.xl\:hover\:skew-y-12:hover{--transform-skew-y:12deg}.xl\:hover\:-skew-y-12:hover{--transform-skew-y:-12deg}.xl\:hover\:-skew-y-6:hover{--transform-skew-y:-6deg}.xl\:hover\:-skew-y-3:hover{--transform-skew-y:-3deg}.xl\:hover\:-skew-y-2:hover{--transform-skew-y:-2deg}.xl\:hover\:-skew-y-1:hover{--transform-skew-y:-1deg}.xl\:focus\:skew-x-0:focus{--transform-skew-x:0}.xl\:focus\:skew-x-1:focus{--transform-skew-x:1deg}.xl\:focus\:skew-x-2:focus{--transform-skew-x:2deg}.xl\:focus\:skew-x-3:focus{--transform-skew-x:3deg}.xl\:focus\:skew-x-6:focus{--transform-skew-x:6deg}.xl\:focus\:skew-x-12:focus{--transform-skew-x:12deg}.xl\:focus\:-skew-x-12:focus{--transform-skew-x:-12deg}.xl\:focus\:-skew-x-6:focus{--transform-skew-x:-6deg}.xl\:focus\:-skew-x-3:focus{--transform-skew-x:-3deg}.xl\:focus\:-skew-x-2:focus{--transform-skew-x:-2deg}.xl\:focus\:-skew-x-1:focus{--transform-skew-x:-1deg}.xl\:focus\:skew-y-0:focus{--transform-skew-y:0}.xl\:focus\:skew-y-1:focus{--transform-skew-y:1deg}.xl\:focus\:skew-y-2:focus{--transform-skew-y:2deg}.xl\:focus\:skew-y-3:focus{--transform-skew-y:3deg}.xl\:focus\:skew-y-6:focus{--transform-skew-y:6deg}.xl\:focus\:skew-y-12:focus{--transform-skew-y:12deg}.xl\:focus\:-skew-y-12:focus{--transform-skew-y:-12deg}.xl\:focus\:-skew-y-6:focus{--transform-skew-y:-6deg}.xl\:focus\:-skew-y-3:focus{--transform-skew-y:-3deg}.xl\:focus\:-skew-y-2:focus{--transform-skew-y:-2deg}.xl\:focus\:-skew-y-1:focus{--transform-skew-y:-1deg}.xl\:transition-none{transition-property:none}.xl\:transition-all{transition-property:all}.xl\:transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform}.xl\:transition-colors{transition-property:background-color,border-color,color,fill,stroke}.xl\:transition-opacity{transition-property:opacity}.xl\:transition-shadow{transition-property:box-shadow}.xl\:transition-transform{transition-property:transform}.xl\:ease-linear{transition-timing-function:linear}.xl\:ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.xl\:ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.xl\:ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.xl\:duration-75{transition-duration:75ms}.xl\:duration-100{transition-duration:.1s}.xl\:duration-150{transition-duration:150ms}.xl\:duration-200{transition-duration:.2s}.xl\:duration-300{transition-duration:.3s}.xl\:duration-500{transition-duration:.5s}.xl\:duration-700{transition-duration:.7s}.xl\:duration-1000{transition-duration:1s}.xl\:delay-75{transition-delay:75ms}.xl\:delay-100{transition-delay:.1s}.xl\:delay-150{transition-delay:150ms}.xl\:delay-200{transition-delay:.2s}.xl\:delay-300{transition-delay:.3s}.xl\:delay-500{transition-delay:.5s}.xl\:delay-700{transition-delay:.7s}.xl\:delay-1000{transition-delay:1s}.xl\:animate-none{animation:none}.xl\:animate-spin{animation:spin 1s linear infinite}.xl\:animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.xl\:animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.xl\:animate-bounce{animation:bounce 1s infinite}} \ No newline at end of file diff --git a/test/configCases/css/large/tailwind.module.css b/test/configCases/css/large/tailwind.module.css new file mode 100644 index 00000000000..dc016181652 --- /dev/null +++ b/test/configCases/css/large/tailwind.module.css @@ -0,0 +1 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset{margin:0;padding:0}ol,ul{list-style:none;margin:0;padding:0}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";line-height:1.5}*,::after,::before{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e2e8f0}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#a0aec0}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:#a0aec0}input::placeholder,textarea::placeholder{color:#a0aec0}[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}.space-y-0>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(0px * var(--space-y-reverse))}.space-x-0>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(0px * var(--space-x-reverse));margin-left:calc(0px * calc(1 - var(--space-x-reverse)))}.space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.25rem * var(--space-y-reverse))}.space-x-1>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.25rem * var(--space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--space-x-reverse)))}.space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.5rem * var(--space-y-reverse))}.space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.5rem * var(--space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--space-x-reverse)))}.space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.75rem * var(--space-y-reverse))}.space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.75rem * var(--space-x-reverse));margin-left:calc(.75rem * calc(1 - var(--space-x-reverse)))}.space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1rem * var(--space-y-reverse))}.space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1rem * var(--space-x-reverse));margin-left:calc(1rem * calc(1 - var(--space-x-reverse)))}.space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1.25rem * var(--space-y-reverse))}.space-x-5>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1.25rem * var(--space-x-reverse));margin-left:calc(1.25rem * calc(1 - var(--space-x-reverse)))}.space-y-6>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1.5rem * var(--space-y-reverse))}.space-x-6>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1.5rem * var(--space-x-reverse));margin-left:calc(1.5rem * calc(1 - var(--space-x-reverse)))}.space-y-8>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(2rem * var(--space-y-reverse))}.space-x-8>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(2rem * var(--space-x-reverse));margin-left:calc(2rem * calc(1 - var(--space-x-reverse)))}.space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(2.5rem * var(--space-y-reverse))}.space-x-10>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(2.5rem * var(--space-x-reverse));margin-left:calc(2.5rem * calc(1 - var(--space-x-reverse)))}.space-y-12>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(3rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(3rem * var(--space-y-reverse))}.space-x-12>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(3rem * var(--space-x-reverse));margin-left:calc(3rem * calc(1 - var(--space-x-reverse)))}.space-y-16>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(4rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(4rem * var(--space-y-reverse))}.space-x-16>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(4rem * var(--space-x-reverse));margin-left:calc(4rem * calc(1 - var(--space-x-reverse)))}.space-y-20>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(5rem * var(--space-y-reverse))}.space-x-20>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(5rem * var(--space-x-reverse));margin-left:calc(5rem * calc(1 - var(--space-x-reverse)))}.space-y-24>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(6rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(6rem * var(--space-y-reverse))}.space-x-24>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(6rem * var(--space-x-reverse));margin-left:calc(6rem * calc(1 - var(--space-x-reverse)))}.space-y-32>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(8rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(8rem * var(--space-y-reverse))}.space-x-32>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(8rem * var(--space-x-reverse));margin-left:calc(8rem * calc(1 - var(--space-x-reverse)))}.space-y-40>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(10rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(10rem * var(--space-y-reverse))}.space-x-40>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(10rem * var(--space-x-reverse));margin-left:calc(10rem * calc(1 - var(--space-x-reverse)))}.space-y-48>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(12rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(12rem * var(--space-y-reverse))}.space-x-48>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(12rem * var(--space-x-reverse));margin-left:calc(12rem * calc(1 - var(--space-x-reverse)))}.space-y-56>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(14rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(14rem * var(--space-y-reverse))}.space-x-56>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(14rem * var(--space-x-reverse));margin-left:calc(14rem * calc(1 - var(--space-x-reverse)))}.space-y-64>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(16rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(16rem * var(--space-y-reverse))}.space-x-64>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(16rem * var(--space-x-reverse));margin-left:calc(16rem * calc(1 - var(--space-x-reverse)))}.space-y-px>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1px * var(--space-y-reverse))}.space-x-px>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1px * var(--space-x-reverse));margin-left:calc(1px * calc(1 - var(--space-x-reverse)))}.-space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.25rem * var(--space-y-reverse))}.-space-x-1>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.25rem * var(--space-x-reverse));margin-left:calc(-.25rem * calc(1 - var(--space-x-reverse)))}.-space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.5rem * var(--space-y-reverse))}.-space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.5rem * var(--space-x-reverse));margin-left:calc(-.5rem * calc(1 - var(--space-x-reverse)))}.-space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.75rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.75rem * var(--space-y-reverse))}.-space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.75rem * var(--space-x-reverse));margin-left:calc(-.75rem * calc(1 - var(--space-x-reverse)))}.-space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1rem * var(--space-y-reverse))}.-space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1rem * var(--space-x-reverse));margin-left:calc(-1rem * calc(1 - var(--space-x-reverse)))}.-space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1.25rem * var(--space-y-reverse))}.-space-x-5>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1.25rem * var(--space-x-reverse));margin-left:calc(-1.25rem * calc(1 - var(--space-x-reverse)))}.-space-y-6>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1.5rem * var(--space-y-reverse))}.-space-x-6>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1.5rem * var(--space-x-reverse));margin-left:calc(-1.5rem * calc(1 - var(--space-x-reverse)))}.-space-y-8>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-2rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-2rem * var(--space-y-reverse))}.-space-x-8>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-2rem * var(--space-x-reverse));margin-left:calc(-2rem * calc(1 - var(--space-x-reverse)))}.-space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-2.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-2.5rem * var(--space-y-reverse))}.-space-x-10>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-2.5rem * var(--space-x-reverse));margin-left:calc(-2.5rem * calc(1 - var(--space-x-reverse)))}.-space-y-12>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-3rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-3rem * var(--space-y-reverse))}.-space-x-12>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-3rem * var(--space-x-reverse));margin-left:calc(-3rem * calc(1 - var(--space-x-reverse)))}.-space-y-16>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-4rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-4rem * var(--space-y-reverse))}.-space-x-16>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-4rem * var(--space-x-reverse));margin-left:calc(-4rem * calc(1 - var(--space-x-reverse)))}.-space-y-20>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-5rem * var(--space-y-reverse))}.-space-x-20>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-5rem * var(--space-x-reverse));margin-left:calc(-5rem * calc(1 - var(--space-x-reverse)))}.-space-y-24>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-6rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-6rem * var(--space-y-reverse))}.-space-x-24>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-6rem * var(--space-x-reverse));margin-left:calc(-6rem * calc(1 - var(--space-x-reverse)))}.-space-y-32>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-8rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-8rem * var(--space-y-reverse))}.-space-x-32>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-8rem * var(--space-x-reverse));margin-left:calc(-8rem * calc(1 - var(--space-x-reverse)))}.-space-y-40>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-10rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-10rem * var(--space-y-reverse))}.-space-x-40>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-10rem * var(--space-x-reverse));margin-left:calc(-10rem * calc(1 - var(--space-x-reverse)))}.-space-y-48>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-12rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-12rem * var(--space-y-reverse))}.-space-x-48>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-12rem * var(--space-x-reverse));margin-left:calc(-12rem * calc(1 - var(--space-x-reverse)))}.-space-y-56>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-14rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-14rem * var(--space-y-reverse))}.-space-x-56>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-14rem * var(--space-x-reverse));margin-left:calc(-14rem * calc(1 - var(--space-x-reverse)))}.-space-y-64>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-16rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-16rem * var(--space-y-reverse))}.-space-x-64>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-16rem * var(--space-x-reverse));margin-left:calc(-16rem * calc(1 - var(--space-x-reverse)))}.-space-y-px>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1px * var(--space-y-reverse))}.-space-x-px>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1px * var(--space-x-reverse));margin-left:calc(-1px * calc(1 - var(--space-x-reverse)))}.space-y-reverse>:not(template)~:not(template){--space-y-reverse:1}.space-x-reverse>:not(template)~:not(template){--space-x-reverse:1}.divide-y-0>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(0px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(0px * var(--divide-y-reverse))}.divide-x-0>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(0px * var(--divide-x-reverse));border-left-width:calc(0px * calc(1 - var(--divide-x-reverse)))}.divide-y-2>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(2px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(2px * var(--divide-y-reverse))}.divide-x-2>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(2px * var(--divide-x-reverse));border-left-width:calc(2px * calc(1 - var(--divide-x-reverse)))}.divide-y-4>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(4px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(4px * var(--divide-y-reverse))}.divide-x-4>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(4px * var(--divide-x-reverse));border-left-width:calc(4px * calc(1 - var(--divide-x-reverse)))}.divide-y-8>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(8px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(8px * var(--divide-y-reverse))}.divide-x-8>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(8px * var(--divide-x-reverse));border-left-width:calc(8px * calc(1 - var(--divide-x-reverse)))}.divide-y>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(1px * var(--divide-y-reverse))}.divide-x>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(1px * var(--divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--divide-x-reverse)))}.divide-y-reverse>:not(template)~:not(template){--divide-y-reverse:1}.divide-x-reverse>:not(template)~:not(template){--divide-x-reverse:1}.divide-transparent>:not(template)~:not(template){border-color:transparent}.divide-current>:not(template)~:not(template){border-color:currentColor}.divide-black>:not(template)~:not(template){--divide-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--divide-opacity))}.divide-white>:not(template)~:not(template){--divide-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--divide-opacity))}.divide-gray-100>:not(template)~:not(template){--divide-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--divide-opacity))}.divide-gray-200>:not(template)~:not(template){--divide-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--divide-opacity))}.divide-gray-300>:not(template)~:not(template){--divide-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--divide-opacity))}.divide-gray-400>:not(template)~:not(template){--divide-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--divide-opacity))}.divide-gray-500>:not(template)~:not(template){--divide-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--divide-opacity))}.divide-gray-600>:not(template)~:not(template){--divide-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--divide-opacity))}.divide-gray-700>:not(template)~:not(template){--divide-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--divide-opacity))}.divide-gray-800>:not(template)~:not(template){--divide-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--divide-opacity))}.divide-gray-900>:not(template)~:not(template){--divide-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--divide-opacity))}.divide-red-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--divide-opacity))}.divide-red-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--divide-opacity))}.divide-red-300>:not(template)~:not(template){--divide-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--divide-opacity))}.divide-red-400>:not(template)~:not(template){--divide-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--divide-opacity))}.divide-red-500>:not(template)~:not(template){--divide-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--divide-opacity))}.divide-red-600>:not(template)~:not(template){--divide-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--divide-opacity))}.divide-red-700>:not(template)~:not(template){--divide-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--divide-opacity))}.divide-red-800>:not(template)~:not(template){--divide-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--divide-opacity))}.divide-red-900>:not(template)~:not(template){--divide-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--divide-opacity))}.divide-orange-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--divide-opacity))}.divide-orange-200>:not(template)~:not(template){--divide-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--divide-opacity))}.divide-orange-300>:not(template)~:not(template){--divide-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--divide-opacity))}.divide-orange-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--divide-opacity))}.divide-orange-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--divide-opacity))}.divide-orange-600>:not(template)~:not(template){--divide-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--divide-opacity))}.divide-orange-700>:not(template)~:not(template){--divide-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--divide-opacity))}.divide-orange-800>:not(template)~:not(template){--divide-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--divide-opacity))}.divide-orange-900>:not(template)~:not(template){--divide-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--divide-opacity))}.divide-yellow-100>:not(template)~:not(template){--divide-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--divide-opacity))}.divide-yellow-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--divide-opacity))}.divide-yellow-300>:not(template)~:not(template){--divide-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--divide-opacity))}.divide-yellow-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--divide-opacity))}.divide-yellow-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--divide-opacity))}.divide-yellow-600>:not(template)~:not(template){--divide-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--divide-opacity))}.divide-yellow-700>:not(template)~:not(template){--divide-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--divide-opacity))}.divide-yellow-800>:not(template)~:not(template){--divide-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--divide-opacity))}.divide-yellow-900>:not(template)~:not(template){--divide-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--divide-opacity))}.divide-green-100>:not(template)~:not(template){--divide-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--divide-opacity))}.divide-green-200>:not(template)~:not(template){--divide-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--divide-opacity))}.divide-green-300>:not(template)~:not(template){--divide-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--divide-opacity))}.divide-green-400>:not(template)~:not(template){--divide-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--divide-opacity))}.divide-green-500>:not(template)~:not(template){--divide-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--divide-opacity))}.divide-green-600>:not(template)~:not(template){--divide-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--divide-opacity))}.divide-green-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--divide-opacity))}.divide-green-800>:not(template)~:not(template){--divide-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--divide-opacity))}.divide-green-900>:not(template)~:not(template){--divide-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--divide-opacity))}.divide-teal-100>:not(template)~:not(template){--divide-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--divide-opacity))}.divide-teal-200>:not(template)~:not(template){--divide-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--divide-opacity))}.divide-teal-300>:not(template)~:not(template){--divide-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--divide-opacity))}.divide-teal-400>:not(template)~:not(template){--divide-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--divide-opacity))}.divide-teal-500>:not(template)~:not(template){--divide-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--divide-opacity))}.divide-teal-600>:not(template)~:not(template){--divide-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--divide-opacity))}.divide-teal-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--divide-opacity))}.divide-teal-800>:not(template)~:not(template){--divide-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--divide-opacity))}.divide-teal-900>:not(template)~:not(template){--divide-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--divide-opacity))}.divide-blue-100>:not(template)~:not(template){--divide-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--divide-opacity))}.divide-blue-200>:not(template)~:not(template){--divide-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--divide-opacity))}.divide-blue-300>:not(template)~:not(template){--divide-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--divide-opacity))}.divide-blue-400>:not(template)~:not(template){--divide-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--divide-opacity))}.divide-blue-500>:not(template)~:not(template){--divide-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--divide-opacity))}.divide-blue-600>:not(template)~:not(template){--divide-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--divide-opacity))}.divide-blue-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--divide-opacity))}.divide-blue-800>:not(template)~:not(template){--divide-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--divide-opacity))}.divide-blue-900>:not(template)~:not(template){--divide-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--divide-opacity))}.divide-indigo-100>:not(template)~:not(template){--divide-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--divide-opacity))}.divide-indigo-200>:not(template)~:not(template){--divide-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--divide-opacity))}.divide-indigo-300>:not(template)~:not(template){--divide-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--divide-opacity))}.divide-indigo-400>:not(template)~:not(template){--divide-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--divide-opacity))}.divide-indigo-500>:not(template)~:not(template){--divide-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--divide-opacity))}.divide-indigo-600>:not(template)~:not(template){--divide-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--divide-opacity))}.divide-indigo-700>:not(template)~:not(template){--divide-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--divide-opacity))}.divide-indigo-800>:not(template)~:not(template){--divide-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--divide-opacity))}.divide-indigo-900>:not(template)~:not(template){--divide-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--divide-opacity))}.divide-purple-100>:not(template)~:not(template){--divide-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--divide-opacity))}.divide-purple-200>:not(template)~:not(template){--divide-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--divide-opacity))}.divide-purple-300>:not(template)~:not(template){--divide-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--divide-opacity))}.divide-purple-400>:not(template)~:not(template){--divide-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--divide-opacity))}.divide-purple-500>:not(template)~:not(template){--divide-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--divide-opacity))}.divide-purple-600>:not(template)~:not(template){--divide-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--divide-opacity))}.divide-purple-700>:not(template)~:not(template){--divide-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--divide-opacity))}.divide-purple-800>:not(template)~:not(template){--divide-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--divide-opacity))}.divide-purple-900>:not(template)~:not(template){--divide-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--divide-opacity))}.divide-pink-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--divide-opacity))}.divide-pink-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--divide-opacity))}.divide-pink-300>:not(template)~:not(template){--divide-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--divide-opacity))}.divide-pink-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--divide-opacity))}.divide-pink-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--divide-opacity))}.divide-pink-600>:not(template)~:not(template){--divide-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--divide-opacity))}.divide-pink-700>:not(template)~:not(template){--divide-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--divide-opacity))}.divide-pink-800>:not(template)~:not(template){--divide-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--divide-opacity))}.divide-pink-900>:not(template)~:not(template){--divide-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--divide-opacity))}.divide-solid>:not(template)~:not(template){border-style:solid}.divide-dashed>:not(template)~:not(template){border-style:dashed}.divide-dotted>:not(template)~:not(template){border-style:dotted}.divide-double>:not(template)~:not(template){border-style:double}.divide-none>:not(template)~:not(template){border-style:none}.divide-opacity-0>:not(template)~:not(template){--divide-opacity:0}.divide-opacity-25>:not(template)~:not(template){--divide-opacity:0.25}.divide-opacity-50>:not(template)~:not(template){--divide-opacity:0.5}.divide-opacity-75>:not(template)~:not(template){--divide-opacity:0.75}.divide-opacity-100>:not(template)~:not(template){--divide-opacity:1}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.focus\:sr-only:focus{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.bg-fixed{background-attachment:fixed}.bg-local{background-attachment:local}.bg-scroll{background-attachment:scroll}.bg-clip-border{background-clip:border-box}.bg-clip-padding{background-clip:padding-box}.bg-clip-content{background-clip:content-box}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.bg-transparent{background-color:transparent}.bg-current{background-color:currentColor}.bg-black{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.bg-gray-200{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.bg-gray-300{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.bg-gray-400{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.bg-gray-500{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.bg-gray-600{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.bg-gray-700{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.bg-gray-800{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.bg-red-100{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.bg-red-200{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.bg-red-300{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.bg-red-400{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.bg-red-500{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.bg-red-600{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.bg-red-700{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.bg-red-800{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.bg-red-900{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.bg-orange-100{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.bg-orange-200{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.bg-orange-300{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.bg-orange-400{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.bg-orange-500{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.bg-orange-600{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.bg-orange-700{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.bg-orange-800{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.bg-orange-900{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.bg-yellow-100{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.bg-yellow-200{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.bg-yellow-300{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.bg-yellow-400{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.bg-yellow-500{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.bg-yellow-600{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.bg-yellow-700{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.bg-yellow-800{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.bg-yellow-900{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.bg-green-100{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.bg-green-200{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.bg-green-300{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.bg-green-400{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.bg-green-500{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.bg-green-600{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.bg-green-700{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.bg-green-800{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.bg-green-900{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.bg-teal-100{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.bg-teal-200{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.bg-teal-300{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.bg-teal-400{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.bg-teal-500{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.bg-teal-600{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.bg-teal-700{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.bg-teal-800{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.bg-teal-900{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.bg-blue-100{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.bg-blue-200{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.bg-blue-300{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.bg-blue-400{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.bg-blue-500{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.bg-blue-600{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.bg-blue-700{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.bg-blue-800{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.bg-blue-900{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.bg-indigo-100{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.bg-indigo-200{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.bg-indigo-300{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.bg-indigo-400{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.bg-indigo-500{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.bg-indigo-600{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.bg-indigo-700{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.bg-indigo-800{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.bg-indigo-900{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.bg-purple-100{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.bg-purple-200{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.bg-purple-300{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.bg-purple-400{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.bg-purple-500{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.bg-purple-600{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.bg-purple-700{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.bg-purple-800{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.bg-purple-900{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.bg-pink-100{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.bg-pink-200{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.bg-pink-300{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.bg-pink-400{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.bg-pink-500{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.bg-pink-600{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.bg-pink-700{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.bg-pink-800{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.bg-pink-900{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.hover\:bg-transparent:hover{background-color:transparent}.hover\:bg-current:hover{background-color:currentColor}.hover\:bg-black:hover{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.hover\:bg-white:hover{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.hover\:bg-gray-100:hover{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.hover\:bg-gray-200:hover{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.hover\:bg-gray-300:hover{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.hover\:bg-gray-400:hover{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.hover\:bg-gray-500:hover{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.hover\:bg-gray-600:hover{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.hover\:bg-gray-700:hover{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.hover\:bg-gray-800:hover{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.hover\:bg-gray-900:hover{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.hover\:bg-red-100:hover{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.hover\:bg-red-200:hover{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.hover\:bg-red-300:hover{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.hover\:bg-red-400:hover{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.hover\:bg-red-500:hover{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.hover\:bg-red-600:hover{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.hover\:bg-red-700:hover{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.hover\:bg-red-800:hover{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.hover\:bg-red-900:hover{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.hover\:bg-orange-100:hover{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.hover\:bg-orange-200:hover{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.hover\:bg-orange-300:hover{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.hover\:bg-orange-400:hover{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.hover\:bg-orange-500:hover{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.hover\:bg-orange-600:hover{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.hover\:bg-orange-700:hover{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.hover\:bg-orange-800:hover{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.hover\:bg-orange-900:hover{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.hover\:bg-yellow-100:hover{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.hover\:bg-yellow-200:hover{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.hover\:bg-yellow-300:hover{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.hover\:bg-yellow-400:hover{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.hover\:bg-yellow-500:hover{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.hover\:bg-yellow-600:hover{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.hover\:bg-yellow-700:hover{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.hover\:bg-yellow-800:hover{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.hover\:bg-yellow-900:hover{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.hover\:bg-green-100:hover{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.hover\:bg-green-200:hover{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.hover\:bg-green-300:hover{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.hover\:bg-green-400:hover{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.hover\:bg-green-500:hover{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.hover\:bg-green-600:hover{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.hover\:bg-green-700:hover{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.hover\:bg-green-800:hover{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.hover\:bg-green-900:hover{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.hover\:bg-teal-100:hover{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.hover\:bg-teal-200:hover{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.hover\:bg-teal-300:hover{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.hover\:bg-teal-400:hover{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.hover\:bg-teal-500:hover{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.hover\:bg-teal-600:hover{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.hover\:bg-teal-700:hover{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.hover\:bg-teal-800:hover{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.hover\:bg-teal-900:hover{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.hover\:bg-blue-100:hover{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.hover\:bg-blue-200:hover{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.hover\:bg-blue-300:hover{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.hover\:bg-blue-400:hover{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.hover\:bg-blue-500:hover{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.hover\:bg-blue-600:hover{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.hover\:bg-blue-700:hover{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.hover\:bg-blue-800:hover{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.hover\:bg-blue-900:hover{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.hover\:bg-indigo-100:hover{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.hover\:bg-indigo-200:hover{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.hover\:bg-indigo-300:hover{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.hover\:bg-indigo-400:hover{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.hover\:bg-indigo-500:hover{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.hover\:bg-indigo-600:hover{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.hover\:bg-indigo-700:hover{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.hover\:bg-indigo-800:hover{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.hover\:bg-indigo-900:hover{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.hover\:bg-purple-100:hover{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.hover\:bg-purple-200:hover{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.hover\:bg-purple-300:hover{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.hover\:bg-purple-400:hover{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.hover\:bg-purple-500:hover{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.hover\:bg-purple-600:hover{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.hover\:bg-purple-700:hover{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.hover\:bg-purple-800:hover{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.hover\:bg-purple-900:hover{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.hover\:bg-pink-100:hover{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.hover\:bg-pink-200:hover{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.hover\:bg-pink-300:hover{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.hover\:bg-pink-400:hover{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.hover\:bg-pink-500:hover{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.hover\:bg-pink-600:hover{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.hover\:bg-pink-700:hover{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.hover\:bg-pink-800:hover{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.hover\:bg-pink-900:hover{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.focus\:bg-transparent:focus{background-color:transparent}.focus\:bg-current:focus{background-color:currentColor}.focus\:bg-black:focus{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.focus\:bg-white:focus{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.focus\:bg-gray-100:focus{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.focus\:bg-gray-200:focus{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.focus\:bg-gray-300:focus{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.focus\:bg-gray-400:focus{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.focus\:bg-gray-500:focus{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.focus\:bg-gray-600:focus{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.focus\:bg-gray-700:focus{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.focus\:bg-gray-800:focus{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.focus\:bg-gray-900:focus{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.focus\:bg-red-100:focus{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.focus\:bg-red-200:focus{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.focus\:bg-red-300:focus{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.focus\:bg-red-400:focus{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.focus\:bg-red-500:focus{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.focus\:bg-red-600:focus{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.focus\:bg-red-700:focus{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.focus\:bg-red-800:focus{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.focus\:bg-red-900:focus{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.focus\:bg-orange-100:focus{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.focus\:bg-orange-200:focus{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.focus\:bg-orange-300:focus{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.focus\:bg-orange-400:focus{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.focus\:bg-orange-500:focus{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.focus\:bg-orange-600:focus{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.focus\:bg-orange-700:focus{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.focus\:bg-orange-800:focus{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.focus\:bg-orange-900:focus{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.focus\:bg-yellow-100:focus{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.focus\:bg-yellow-200:focus{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.focus\:bg-yellow-300:focus{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.focus\:bg-yellow-400:focus{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.focus\:bg-yellow-500:focus{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.focus\:bg-yellow-600:focus{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.focus\:bg-yellow-700:focus{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.focus\:bg-yellow-800:focus{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.focus\:bg-yellow-900:focus{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.focus\:bg-green-100:focus{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.focus\:bg-green-200:focus{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.focus\:bg-green-300:focus{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.focus\:bg-green-400:focus{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.focus\:bg-green-500:focus{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.focus\:bg-green-600:focus{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.focus\:bg-green-700:focus{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.focus\:bg-green-800:focus{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.focus\:bg-green-900:focus{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.focus\:bg-teal-100:focus{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.focus\:bg-teal-200:focus{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.focus\:bg-teal-300:focus{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.focus\:bg-teal-400:focus{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.focus\:bg-teal-500:focus{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.focus\:bg-teal-600:focus{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.focus\:bg-teal-700:focus{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.focus\:bg-teal-800:focus{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.focus\:bg-teal-900:focus{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.focus\:bg-blue-100:focus{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.focus\:bg-blue-200:focus{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.focus\:bg-blue-300:focus{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.focus\:bg-blue-400:focus{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.focus\:bg-blue-500:focus{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.focus\:bg-blue-600:focus{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.focus\:bg-blue-700:focus{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.focus\:bg-blue-800:focus{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.focus\:bg-blue-900:focus{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.focus\:bg-indigo-100:focus{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.focus\:bg-indigo-200:focus{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.focus\:bg-indigo-300:focus{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.focus\:bg-indigo-400:focus{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.focus\:bg-indigo-500:focus{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.focus\:bg-indigo-600:focus{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.focus\:bg-indigo-700:focus{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.focus\:bg-indigo-800:focus{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.focus\:bg-indigo-900:focus{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.focus\:bg-purple-100:focus{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.focus\:bg-purple-200:focus{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.focus\:bg-purple-300:focus{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.focus\:bg-purple-400:focus{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.focus\:bg-purple-500:focus{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.focus\:bg-purple-600:focus{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.focus\:bg-purple-700:focus{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.focus\:bg-purple-800:focus{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.focus\:bg-purple-900:focus{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.focus\:bg-pink-100:focus{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.focus\:bg-pink-200:focus{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.focus\:bg-pink-300:focus{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.focus\:bg-pink-400:focus{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.focus\:bg-pink-500:focus{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.focus\:bg-pink-600:focus{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.focus\:bg-pink-700:focus{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.focus\:bg-pink-800:focus{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.focus\:bg-pink-900:focus{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.bg-none{background-image:none}.bg-gradient-to-t{background-image:linear-gradient(to top,var(--gradient-color-stops))}.bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--gradient-color-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--gradient-color-stops))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--gradient-color-stops))}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--gradient-color-stops))}.bg-gradient-to-bl{background-image:linear-gradient(to bottom left,var(--gradient-color-stops))}.bg-gradient-to-l{background-image:linear-gradient(to left,var(--gradient-color-stops))}.bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--gradient-color-stops))}.from-transparent{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.from-current{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.from-black{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.from-white{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.from-gray-100{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.from-gray-200{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.from-gray-300{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.from-gray-400{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.from-gray-500{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.from-gray-600{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.from-gray-700{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.from-gray-800{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.from-gray-900{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.from-red-100{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.from-red-200{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.from-red-300{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.from-red-400{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.from-red-500{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.from-red-600{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.from-red-700{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.from-red-800{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.from-red-900{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.from-orange-100{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.from-orange-200{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.from-orange-300{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.from-orange-400{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.from-orange-500{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.from-orange-600{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.from-orange-700{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.from-orange-800{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.from-orange-900{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.from-yellow-100{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.from-yellow-200{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.from-yellow-300{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.from-yellow-400{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.from-yellow-500{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.from-yellow-600{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.from-yellow-700{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.from-yellow-800{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.from-yellow-900{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.from-green-100{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.from-green-200{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.from-green-300{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.from-green-400{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.from-green-500{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.from-green-600{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.from-green-700{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.from-green-800{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.from-green-900{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.from-teal-100{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.from-teal-200{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.from-teal-300{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.from-teal-400{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.from-teal-500{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.from-teal-600{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.from-teal-700{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.from-teal-800{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.from-teal-900{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.from-blue-100{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.from-blue-200{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.from-blue-300{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.from-blue-400{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.from-blue-500{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.from-blue-600{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.from-blue-700{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.from-blue-800{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.from-blue-900{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.from-indigo-100{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.from-indigo-200{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.from-indigo-300{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.from-indigo-400{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.from-indigo-500{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.from-indigo-600{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.from-indigo-700{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.from-indigo-800{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.from-indigo-900{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.from-purple-100{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.from-purple-200{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.from-purple-300{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.from-purple-400{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.from-purple-500{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.from-purple-600{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.from-purple-700{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.from-purple-800{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.from-purple-900{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.from-pink-100{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.from-pink-200{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.from-pink-300{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.from-pink-400{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.from-pink-500{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.from-pink-600{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.from-pink-700{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.from-pink-800{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.from-pink-900{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.via-transparent{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.via-current{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.via-black{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.via-white{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.via-gray-100{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.via-gray-200{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.via-gray-300{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.via-gray-400{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.via-gray-500{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.via-gray-600{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.via-gray-700{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.via-gray-800{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.via-gray-900{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.via-red-100{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.via-red-200{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.via-red-300{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.via-red-400{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.via-red-500{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.via-red-600{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.via-red-700{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.via-red-800{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.via-red-900{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.via-orange-100{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.via-orange-200{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.via-orange-300{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.via-orange-400{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.via-orange-500{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.via-orange-600{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.via-orange-700{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.via-orange-800{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.via-orange-900{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.via-yellow-100{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.via-yellow-200{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.via-yellow-300{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.via-yellow-400{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.via-yellow-500{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.via-yellow-600{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.via-yellow-700{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.via-yellow-800{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.via-yellow-900{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.via-green-100{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.via-green-200{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.via-green-300{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.via-green-400{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.via-green-500{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.via-green-600{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.via-green-700{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.via-green-800{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.via-green-900{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.via-teal-100{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.via-teal-200{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.via-teal-300{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.via-teal-400{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.via-teal-500{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.via-teal-600{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.via-teal-700{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.via-teal-800{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.via-teal-900{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.via-blue-100{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.via-blue-200{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.via-blue-300{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.via-blue-400{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.via-blue-500{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.via-blue-600{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.via-blue-700{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.via-blue-800{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.via-blue-900{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.via-indigo-100{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.via-indigo-200{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.via-indigo-300{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.via-indigo-400{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.via-indigo-500{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.via-indigo-600{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.via-indigo-700{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.via-indigo-800{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.via-indigo-900{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.via-purple-100{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.via-purple-200{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.via-purple-300{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.via-purple-400{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.via-purple-500{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.via-purple-600{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.via-purple-700{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.via-purple-800{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.via-purple-900{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.via-pink-100{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.via-pink-200{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.via-pink-300{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.via-pink-400{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.via-pink-500{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.via-pink-600{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.via-pink-700{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.via-pink-800{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.via-pink-900{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.to-transparent{--gradient-to-color:transparent}.to-current{--gradient-to-color:currentColor}.to-black{--gradient-to-color:#000}.to-white{--gradient-to-color:#fff}.to-gray-100{--gradient-to-color:#f7fafc}.to-gray-200{--gradient-to-color:#edf2f7}.to-gray-300{--gradient-to-color:#e2e8f0}.to-gray-400{--gradient-to-color:#cbd5e0}.to-gray-500{--gradient-to-color:#a0aec0}.to-gray-600{--gradient-to-color:#718096}.to-gray-700{--gradient-to-color:#4a5568}.to-gray-800{--gradient-to-color:#2d3748}.to-gray-900{--gradient-to-color:#1a202c}.to-red-100{--gradient-to-color:#fff5f5}.to-red-200{--gradient-to-color:#fed7d7}.to-red-300{--gradient-to-color:#feb2b2}.to-red-400{--gradient-to-color:#fc8181}.to-red-500{--gradient-to-color:#f56565}.to-red-600{--gradient-to-color:#e53e3e}.to-red-700{--gradient-to-color:#c53030}.to-red-800{--gradient-to-color:#9b2c2c}.to-red-900{--gradient-to-color:#742a2a}.to-orange-100{--gradient-to-color:#fffaf0}.to-orange-200{--gradient-to-color:#feebc8}.to-orange-300{--gradient-to-color:#fbd38d}.to-orange-400{--gradient-to-color:#f6ad55}.to-orange-500{--gradient-to-color:#ed8936}.to-orange-600{--gradient-to-color:#dd6b20}.to-orange-700{--gradient-to-color:#c05621}.to-orange-800{--gradient-to-color:#9c4221}.to-orange-900{--gradient-to-color:#7b341e}.to-yellow-100{--gradient-to-color:#fffff0}.to-yellow-200{--gradient-to-color:#fefcbf}.to-yellow-300{--gradient-to-color:#faf089}.to-yellow-400{--gradient-to-color:#f6e05e}.to-yellow-500{--gradient-to-color:#ecc94b}.to-yellow-600{--gradient-to-color:#d69e2e}.to-yellow-700{--gradient-to-color:#b7791f}.to-yellow-800{--gradient-to-color:#975a16}.to-yellow-900{--gradient-to-color:#744210}.to-green-100{--gradient-to-color:#f0fff4}.to-green-200{--gradient-to-color:#c6f6d5}.to-green-300{--gradient-to-color:#9ae6b4}.to-green-400{--gradient-to-color:#68d391}.to-green-500{--gradient-to-color:#48bb78}.to-green-600{--gradient-to-color:#38a169}.to-green-700{--gradient-to-color:#2f855a}.to-green-800{--gradient-to-color:#276749}.to-green-900{--gradient-to-color:#22543d}.to-teal-100{--gradient-to-color:#e6fffa}.to-teal-200{--gradient-to-color:#b2f5ea}.to-teal-300{--gradient-to-color:#81e6d9}.to-teal-400{--gradient-to-color:#4fd1c5}.to-teal-500{--gradient-to-color:#38b2ac}.to-teal-600{--gradient-to-color:#319795}.to-teal-700{--gradient-to-color:#2c7a7b}.to-teal-800{--gradient-to-color:#285e61}.to-teal-900{--gradient-to-color:#234e52}.to-blue-100{--gradient-to-color:#ebf8ff}.to-blue-200{--gradient-to-color:#bee3f8}.to-blue-300{--gradient-to-color:#90cdf4}.to-blue-400{--gradient-to-color:#63b3ed}.to-blue-500{--gradient-to-color:#4299e1}.to-blue-600{--gradient-to-color:#3182ce}.to-blue-700{--gradient-to-color:#2b6cb0}.to-blue-800{--gradient-to-color:#2c5282}.to-blue-900{--gradient-to-color:#2a4365}.to-indigo-100{--gradient-to-color:#ebf4ff}.to-indigo-200{--gradient-to-color:#c3dafe}.to-indigo-300{--gradient-to-color:#a3bffa}.to-indigo-400{--gradient-to-color:#7f9cf5}.to-indigo-500{--gradient-to-color:#667eea}.to-indigo-600{--gradient-to-color:#5a67d8}.to-indigo-700{--gradient-to-color:#4c51bf}.to-indigo-800{--gradient-to-color:#434190}.to-indigo-900{--gradient-to-color:#3c366b}.to-purple-100{--gradient-to-color:#faf5ff}.to-purple-200{--gradient-to-color:#e9d8fd}.to-purple-300{--gradient-to-color:#d6bcfa}.to-purple-400{--gradient-to-color:#b794f4}.to-purple-500{--gradient-to-color:#9f7aea}.to-purple-600{--gradient-to-color:#805ad5}.to-purple-700{--gradient-to-color:#6b46c1}.to-purple-800{--gradient-to-color:#553c9a}.to-purple-900{--gradient-to-color:#44337a}.to-pink-100{--gradient-to-color:#fff5f7}.to-pink-200{--gradient-to-color:#fed7e2}.to-pink-300{--gradient-to-color:#fbb6ce}.to-pink-400{--gradient-to-color:#f687b3}.to-pink-500{--gradient-to-color:#ed64a6}.to-pink-600{--gradient-to-color:#d53f8c}.to-pink-700{--gradient-to-color:#b83280}.to-pink-800{--gradient-to-color:#97266d}.to-pink-900{--gradient-to-color:#702459}.hover\:from-transparent:hover{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.hover\:from-current:hover{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.hover\:from-black:hover{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.hover\:from-white:hover{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.hover\:from-gray-100:hover{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.hover\:from-gray-200:hover{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.hover\:from-gray-300:hover{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.hover\:from-gray-400:hover{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.hover\:from-gray-500:hover{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.hover\:from-gray-600:hover{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.hover\:from-gray-700:hover{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.hover\:from-gray-800:hover{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.hover\:from-gray-900:hover{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.hover\:from-red-100:hover{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.hover\:from-red-200:hover{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.hover\:from-red-300:hover{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.hover\:from-red-400:hover{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.hover\:from-red-500:hover{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.hover\:from-red-600:hover{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.hover\:from-red-700:hover{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.hover\:from-red-800:hover{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.hover\:from-red-900:hover{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.hover\:from-orange-100:hover{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.hover\:from-orange-200:hover{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.hover\:from-orange-300:hover{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.hover\:from-orange-400:hover{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.hover\:from-orange-500:hover{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.hover\:from-orange-600:hover{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.hover\:from-orange-700:hover{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.hover\:from-orange-800:hover{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.hover\:from-orange-900:hover{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.hover\:from-yellow-100:hover{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.hover\:from-yellow-200:hover{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.hover\:from-yellow-300:hover{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.hover\:from-yellow-400:hover{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.hover\:from-yellow-500:hover{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.hover\:from-yellow-600:hover{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.hover\:from-yellow-700:hover{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.hover\:from-yellow-800:hover{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.hover\:from-yellow-900:hover{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.hover\:from-green-100:hover{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.hover\:from-green-200:hover{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.hover\:from-green-300:hover{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.hover\:from-green-400:hover{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.hover\:from-green-500:hover{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.hover\:from-green-600:hover{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.hover\:from-green-700:hover{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.hover\:from-green-800:hover{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.hover\:from-green-900:hover{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.hover\:from-teal-100:hover{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.hover\:from-teal-200:hover{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.hover\:from-teal-300:hover{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.hover\:from-teal-400:hover{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.hover\:from-teal-500:hover{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.hover\:from-teal-600:hover{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.hover\:from-teal-700:hover{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.hover\:from-teal-800:hover{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.hover\:from-teal-900:hover{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.hover\:from-blue-100:hover{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.hover\:from-blue-200:hover{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.hover\:from-blue-300:hover{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.hover\:from-blue-400:hover{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.hover\:from-blue-500:hover{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.hover\:from-blue-600:hover{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.hover\:from-blue-700:hover{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.hover\:from-blue-800:hover{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.hover\:from-blue-900:hover{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.hover\:from-indigo-100:hover{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.hover\:from-indigo-200:hover{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.hover\:from-indigo-300:hover{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.hover\:from-indigo-400:hover{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.hover\:from-indigo-500:hover{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.hover\:from-indigo-600:hover{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.hover\:from-indigo-700:hover{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.hover\:from-indigo-800:hover{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.hover\:from-indigo-900:hover{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.hover\:from-purple-100:hover{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.hover\:from-purple-200:hover{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.hover\:from-purple-300:hover{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.hover\:from-purple-400:hover{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.hover\:from-purple-500:hover{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.hover\:from-purple-600:hover{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.hover\:from-purple-700:hover{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.hover\:from-purple-800:hover{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.hover\:from-purple-900:hover{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.hover\:from-pink-100:hover{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.hover\:from-pink-200:hover{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.hover\:from-pink-300:hover{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.hover\:from-pink-400:hover{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.hover\:from-pink-500:hover{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.hover\:from-pink-600:hover{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.hover\:from-pink-700:hover{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.hover\:from-pink-800:hover{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.hover\:from-pink-900:hover{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.hover\:via-transparent:hover{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.hover\:via-current:hover{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.hover\:via-black:hover{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.hover\:via-white:hover{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.hover\:via-gray-100:hover{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.hover\:via-gray-200:hover{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.hover\:via-gray-300:hover{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.hover\:via-gray-400:hover{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.hover\:via-gray-500:hover{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.hover\:via-gray-600:hover{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.hover\:via-gray-700:hover{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.hover\:via-gray-800:hover{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.hover\:via-gray-900:hover{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.hover\:via-red-100:hover{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.hover\:via-red-200:hover{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.hover\:via-red-300:hover{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.hover\:via-red-400:hover{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.hover\:via-red-500:hover{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.hover\:via-red-600:hover{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.hover\:via-red-700:hover{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.hover\:via-red-800:hover{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.hover\:via-red-900:hover{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.hover\:via-orange-100:hover{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.hover\:via-orange-200:hover{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.hover\:via-orange-300:hover{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.hover\:via-orange-400:hover{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.hover\:via-orange-500:hover{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.hover\:via-orange-600:hover{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.hover\:via-orange-700:hover{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.hover\:via-orange-800:hover{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.hover\:via-orange-900:hover{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.hover\:via-yellow-100:hover{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.hover\:via-yellow-200:hover{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.hover\:via-yellow-300:hover{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.hover\:via-yellow-400:hover{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.hover\:via-yellow-500:hover{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.hover\:via-yellow-600:hover{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.hover\:via-yellow-700:hover{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.hover\:via-yellow-800:hover{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.hover\:via-yellow-900:hover{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.hover\:via-green-100:hover{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.hover\:via-green-200:hover{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.hover\:via-green-300:hover{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.hover\:via-green-400:hover{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.hover\:via-green-500:hover{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.hover\:via-green-600:hover{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.hover\:via-green-700:hover{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.hover\:via-green-800:hover{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.hover\:via-green-900:hover{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.hover\:via-teal-100:hover{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.hover\:via-teal-200:hover{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.hover\:via-teal-300:hover{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.hover\:via-teal-400:hover{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.hover\:via-teal-500:hover{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.hover\:via-teal-600:hover{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.hover\:via-teal-700:hover{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.hover\:via-teal-800:hover{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.hover\:via-teal-900:hover{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.hover\:via-blue-100:hover{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.hover\:via-blue-200:hover{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.hover\:via-blue-300:hover{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.hover\:via-blue-400:hover{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.hover\:via-blue-500:hover{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.hover\:via-blue-600:hover{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.hover\:via-blue-700:hover{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.hover\:via-blue-800:hover{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.hover\:via-blue-900:hover{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.hover\:via-indigo-100:hover{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.hover\:via-indigo-200:hover{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.hover\:via-indigo-300:hover{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.hover\:via-indigo-400:hover{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.hover\:via-indigo-500:hover{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.hover\:via-indigo-600:hover{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.hover\:via-indigo-700:hover{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.hover\:via-indigo-800:hover{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.hover\:via-indigo-900:hover{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.hover\:via-purple-100:hover{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.hover\:via-purple-200:hover{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.hover\:via-purple-300:hover{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.hover\:via-purple-400:hover{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.hover\:via-purple-500:hover{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.hover\:via-purple-600:hover{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.hover\:via-purple-700:hover{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.hover\:via-purple-800:hover{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.hover\:via-purple-900:hover{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.hover\:via-pink-100:hover{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.hover\:via-pink-200:hover{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.hover\:via-pink-300:hover{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.hover\:via-pink-400:hover{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.hover\:via-pink-500:hover{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.hover\:via-pink-600:hover{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.hover\:via-pink-700:hover{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.hover\:via-pink-800:hover{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.hover\:via-pink-900:hover{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.hover\:to-transparent:hover{--gradient-to-color:transparent}.hover\:to-current:hover{--gradient-to-color:currentColor}.hover\:to-black:hover{--gradient-to-color:#000}.hover\:to-white:hover{--gradient-to-color:#fff}.hover\:to-gray-100:hover{--gradient-to-color:#f7fafc}.hover\:to-gray-200:hover{--gradient-to-color:#edf2f7}.hover\:to-gray-300:hover{--gradient-to-color:#e2e8f0}.hover\:to-gray-400:hover{--gradient-to-color:#cbd5e0}.hover\:to-gray-500:hover{--gradient-to-color:#a0aec0}.hover\:to-gray-600:hover{--gradient-to-color:#718096}.hover\:to-gray-700:hover{--gradient-to-color:#4a5568}.hover\:to-gray-800:hover{--gradient-to-color:#2d3748}.hover\:to-gray-900:hover{--gradient-to-color:#1a202c}.hover\:to-red-100:hover{--gradient-to-color:#fff5f5}.hover\:to-red-200:hover{--gradient-to-color:#fed7d7}.hover\:to-red-300:hover{--gradient-to-color:#feb2b2}.hover\:to-red-400:hover{--gradient-to-color:#fc8181}.hover\:to-red-500:hover{--gradient-to-color:#f56565}.hover\:to-red-600:hover{--gradient-to-color:#e53e3e}.hover\:to-red-700:hover{--gradient-to-color:#c53030}.hover\:to-red-800:hover{--gradient-to-color:#9b2c2c}.hover\:to-red-900:hover{--gradient-to-color:#742a2a}.hover\:to-orange-100:hover{--gradient-to-color:#fffaf0}.hover\:to-orange-200:hover{--gradient-to-color:#feebc8}.hover\:to-orange-300:hover{--gradient-to-color:#fbd38d}.hover\:to-orange-400:hover{--gradient-to-color:#f6ad55}.hover\:to-orange-500:hover{--gradient-to-color:#ed8936}.hover\:to-orange-600:hover{--gradient-to-color:#dd6b20}.hover\:to-orange-700:hover{--gradient-to-color:#c05621}.hover\:to-orange-800:hover{--gradient-to-color:#9c4221}.hover\:to-orange-900:hover{--gradient-to-color:#7b341e}.hover\:to-yellow-100:hover{--gradient-to-color:#fffff0}.hover\:to-yellow-200:hover{--gradient-to-color:#fefcbf}.hover\:to-yellow-300:hover{--gradient-to-color:#faf089}.hover\:to-yellow-400:hover{--gradient-to-color:#f6e05e}.hover\:to-yellow-500:hover{--gradient-to-color:#ecc94b}.hover\:to-yellow-600:hover{--gradient-to-color:#d69e2e}.hover\:to-yellow-700:hover{--gradient-to-color:#b7791f}.hover\:to-yellow-800:hover{--gradient-to-color:#975a16}.hover\:to-yellow-900:hover{--gradient-to-color:#744210}.hover\:to-green-100:hover{--gradient-to-color:#f0fff4}.hover\:to-green-200:hover{--gradient-to-color:#c6f6d5}.hover\:to-green-300:hover{--gradient-to-color:#9ae6b4}.hover\:to-green-400:hover{--gradient-to-color:#68d391}.hover\:to-green-500:hover{--gradient-to-color:#48bb78}.hover\:to-green-600:hover{--gradient-to-color:#38a169}.hover\:to-green-700:hover{--gradient-to-color:#2f855a}.hover\:to-green-800:hover{--gradient-to-color:#276749}.hover\:to-green-900:hover{--gradient-to-color:#22543d}.hover\:to-teal-100:hover{--gradient-to-color:#e6fffa}.hover\:to-teal-200:hover{--gradient-to-color:#b2f5ea}.hover\:to-teal-300:hover{--gradient-to-color:#81e6d9}.hover\:to-teal-400:hover{--gradient-to-color:#4fd1c5}.hover\:to-teal-500:hover{--gradient-to-color:#38b2ac}.hover\:to-teal-600:hover{--gradient-to-color:#319795}.hover\:to-teal-700:hover{--gradient-to-color:#2c7a7b}.hover\:to-teal-800:hover{--gradient-to-color:#285e61}.hover\:to-teal-900:hover{--gradient-to-color:#234e52}.hover\:to-blue-100:hover{--gradient-to-color:#ebf8ff}.hover\:to-blue-200:hover{--gradient-to-color:#bee3f8}.hover\:to-blue-300:hover{--gradient-to-color:#90cdf4}.hover\:to-blue-400:hover{--gradient-to-color:#63b3ed}.hover\:to-blue-500:hover{--gradient-to-color:#4299e1}.hover\:to-blue-600:hover{--gradient-to-color:#3182ce}.hover\:to-blue-700:hover{--gradient-to-color:#2b6cb0}.hover\:to-blue-800:hover{--gradient-to-color:#2c5282}.hover\:to-blue-900:hover{--gradient-to-color:#2a4365}.hover\:to-indigo-100:hover{--gradient-to-color:#ebf4ff}.hover\:to-indigo-200:hover{--gradient-to-color:#c3dafe}.hover\:to-indigo-300:hover{--gradient-to-color:#a3bffa}.hover\:to-indigo-400:hover{--gradient-to-color:#7f9cf5}.hover\:to-indigo-500:hover{--gradient-to-color:#667eea}.hover\:to-indigo-600:hover{--gradient-to-color:#5a67d8}.hover\:to-indigo-700:hover{--gradient-to-color:#4c51bf}.hover\:to-indigo-800:hover{--gradient-to-color:#434190}.hover\:to-indigo-900:hover{--gradient-to-color:#3c366b}.hover\:to-purple-100:hover{--gradient-to-color:#faf5ff}.hover\:to-purple-200:hover{--gradient-to-color:#e9d8fd}.hover\:to-purple-300:hover{--gradient-to-color:#d6bcfa}.hover\:to-purple-400:hover{--gradient-to-color:#b794f4}.hover\:to-purple-500:hover{--gradient-to-color:#9f7aea}.hover\:to-purple-600:hover{--gradient-to-color:#805ad5}.hover\:to-purple-700:hover{--gradient-to-color:#6b46c1}.hover\:to-purple-800:hover{--gradient-to-color:#553c9a}.hover\:to-purple-900:hover{--gradient-to-color:#44337a}.hover\:to-pink-100:hover{--gradient-to-color:#fff5f7}.hover\:to-pink-200:hover{--gradient-to-color:#fed7e2}.hover\:to-pink-300:hover{--gradient-to-color:#fbb6ce}.hover\:to-pink-400:hover{--gradient-to-color:#f687b3}.hover\:to-pink-500:hover{--gradient-to-color:#ed64a6}.hover\:to-pink-600:hover{--gradient-to-color:#d53f8c}.hover\:to-pink-700:hover{--gradient-to-color:#b83280}.hover\:to-pink-800:hover{--gradient-to-color:#97266d}.hover\:to-pink-900:hover{--gradient-to-color:#702459}.focus\:from-transparent:focus{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.focus\:from-current:focus{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.focus\:from-black:focus{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.focus\:from-white:focus{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.focus\:from-gray-100:focus{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.focus\:from-gray-200:focus{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.focus\:from-gray-300:focus{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.focus\:from-gray-400:focus{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.focus\:from-gray-500:focus{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.focus\:from-gray-600:focus{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.focus\:from-gray-700:focus{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.focus\:from-gray-800:focus{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.focus\:from-gray-900:focus{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.focus\:from-red-100:focus{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.focus\:from-red-200:focus{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.focus\:from-red-300:focus{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.focus\:from-red-400:focus{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.focus\:from-red-500:focus{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.focus\:from-red-600:focus{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.focus\:from-red-700:focus{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.focus\:from-red-800:focus{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.focus\:from-red-900:focus{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.focus\:from-orange-100:focus{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.focus\:from-orange-200:focus{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.focus\:from-orange-300:focus{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.focus\:from-orange-400:focus{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.focus\:from-orange-500:focus{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.focus\:from-orange-600:focus{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.focus\:from-orange-700:focus{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.focus\:from-orange-800:focus{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.focus\:from-orange-900:focus{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.focus\:from-yellow-100:focus{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.focus\:from-yellow-200:focus{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.focus\:from-yellow-300:focus{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.focus\:from-yellow-400:focus{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.focus\:from-yellow-500:focus{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.focus\:from-yellow-600:focus{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.focus\:from-yellow-700:focus{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.focus\:from-yellow-800:focus{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.focus\:from-yellow-900:focus{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.focus\:from-green-100:focus{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.focus\:from-green-200:focus{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.focus\:from-green-300:focus{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.focus\:from-green-400:focus{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.focus\:from-green-500:focus{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.focus\:from-green-600:focus{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.focus\:from-green-700:focus{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.focus\:from-green-800:focus{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.focus\:from-green-900:focus{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.focus\:from-teal-100:focus{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.focus\:from-teal-200:focus{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.focus\:from-teal-300:focus{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.focus\:from-teal-400:focus{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.focus\:from-teal-500:focus{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.focus\:from-teal-600:focus{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.focus\:from-teal-700:focus{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.focus\:from-teal-800:focus{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.focus\:from-teal-900:focus{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.focus\:from-blue-100:focus{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.focus\:from-blue-200:focus{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.focus\:from-blue-300:focus{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.focus\:from-blue-400:focus{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.focus\:from-blue-500:focus{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.focus\:from-blue-600:focus{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.focus\:from-blue-700:focus{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.focus\:from-blue-800:focus{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.focus\:from-blue-900:focus{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.focus\:from-indigo-100:focus{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.focus\:from-indigo-200:focus{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.focus\:from-indigo-300:focus{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.focus\:from-indigo-400:focus{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.focus\:from-indigo-500:focus{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.focus\:from-indigo-600:focus{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.focus\:from-indigo-700:focus{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.focus\:from-indigo-800:focus{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.focus\:from-indigo-900:focus{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.focus\:from-purple-100:focus{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.focus\:from-purple-200:focus{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.focus\:from-purple-300:focus{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.focus\:from-purple-400:focus{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.focus\:from-purple-500:focus{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.focus\:from-purple-600:focus{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.focus\:from-purple-700:focus{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.focus\:from-purple-800:focus{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.focus\:from-purple-900:focus{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.focus\:from-pink-100:focus{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.focus\:from-pink-200:focus{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.focus\:from-pink-300:focus{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.focus\:from-pink-400:focus{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.focus\:from-pink-500:focus{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.focus\:from-pink-600:focus{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.focus\:from-pink-700:focus{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.focus\:from-pink-800:focus{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.focus\:from-pink-900:focus{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.focus\:via-transparent:focus{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.focus\:via-current:focus{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.focus\:via-black:focus{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.focus\:via-white:focus{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.focus\:via-gray-100:focus{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.focus\:via-gray-200:focus{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.focus\:via-gray-300:focus{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.focus\:via-gray-400:focus{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.focus\:via-gray-500:focus{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.focus\:via-gray-600:focus{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.focus\:via-gray-700:focus{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.focus\:via-gray-800:focus{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.focus\:via-gray-900:focus{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.focus\:via-red-100:focus{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.focus\:via-red-200:focus{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.focus\:via-red-300:focus{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.focus\:via-red-400:focus{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.focus\:via-red-500:focus{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.focus\:via-red-600:focus{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.focus\:via-red-700:focus{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.focus\:via-red-800:focus{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.focus\:via-red-900:focus{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.focus\:via-orange-100:focus{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.focus\:via-orange-200:focus{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.focus\:via-orange-300:focus{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.focus\:via-orange-400:focus{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.focus\:via-orange-500:focus{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.focus\:via-orange-600:focus{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.focus\:via-orange-700:focus{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.focus\:via-orange-800:focus{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.focus\:via-orange-900:focus{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.focus\:via-yellow-100:focus{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.focus\:via-yellow-200:focus{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.focus\:via-yellow-300:focus{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.focus\:via-yellow-400:focus{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.focus\:via-yellow-500:focus{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.focus\:via-yellow-600:focus{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.focus\:via-yellow-700:focus{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.focus\:via-yellow-800:focus{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.focus\:via-yellow-900:focus{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.focus\:via-green-100:focus{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.focus\:via-green-200:focus{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.focus\:via-green-300:focus{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.focus\:via-green-400:focus{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.focus\:via-green-500:focus{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.focus\:via-green-600:focus{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.focus\:via-green-700:focus{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.focus\:via-green-800:focus{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.focus\:via-green-900:focus{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.focus\:via-teal-100:focus{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.focus\:via-teal-200:focus{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.focus\:via-teal-300:focus{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.focus\:via-teal-400:focus{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.focus\:via-teal-500:focus{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.focus\:via-teal-600:focus{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.focus\:via-teal-700:focus{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.focus\:via-teal-800:focus{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.focus\:via-teal-900:focus{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.focus\:via-blue-100:focus{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.focus\:via-blue-200:focus{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.focus\:via-blue-300:focus{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.focus\:via-blue-400:focus{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.focus\:via-blue-500:focus{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.focus\:via-blue-600:focus{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.focus\:via-blue-700:focus{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.focus\:via-blue-800:focus{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.focus\:via-blue-900:focus{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.focus\:via-indigo-100:focus{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.focus\:via-indigo-200:focus{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.focus\:via-indigo-300:focus{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.focus\:via-indigo-400:focus{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.focus\:via-indigo-500:focus{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.focus\:via-indigo-600:focus{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.focus\:via-indigo-700:focus{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.focus\:via-indigo-800:focus{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.focus\:via-indigo-900:focus{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.focus\:via-purple-100:focus{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.focus\:via-purple-200:focus{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.focus\:via-purple-300:focus{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.focus\:via-purple-400:focus{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.focus\:via-purple-500:focus{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.focus\:via-purple-600:focus{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.focus\:via-purple-700:focus{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.focus\:via-purple-800:focus{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.focus\:via-purple-900:focus{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.focus\:via-pink-100:focus{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.focus\:via-pink-200:focus{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.focus\:via-pink-300:focus{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.focus\:via-pink-400:focus{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.focus\:via-pink-500:focus{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.focus\:via-pink-600:focus{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.focus\:via-pink-700:focus{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.focus\:via-pink-800:focus{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.focus\:via-pink-900:focus{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.focus\:to-transparent:focus{--gradient-to-color:transparent}.focus\:to-current:focus{--gradient-to-color:currentColor}.focus\:to-black:focus{--gradient-to-color:#000}.focus\:to-white:focus{--gradient-to-color:#fff}.focus\:to-gray-100:focus{--gradient-to-color:#f7fafc}.focus\:to-gray-200:focus{--gradient-to-color:#edf2f7}.focus\:to-gray-300:focus{--gradient-to-color:#e2e8f0}.focus\:to-gray-400:focus{--gradient-to-color:#cbd5e0}.focus\:to-gray-500:focus{--gradient-to-color:#a0aec0}.focus\:to-gray-600:focus{--gradient-to-color:#718096}.focus\:to-gray-700:focus{--gradient-to-color:#4a5568}.focus\:to-gray-800:focus{--gradient-to-color:#2d3748}.focus\:to-gray-900:focus{--gradient-to-color:#1a202c}.focus\:to-red-100:focus{--gradient-to-color:#fff5f5}.focus\:to-red-200:focus{--gradient-to-color:#fed7d7}.focus\:to-red-300:focus{--gradient-to-color:#feb2b2}.focus\:to-red-400:focus{--gradient-to-color:#fc8181}.focus\:to-red-500:focus{--gradient-to-color:#f56565}.focus\:to-red-600:focus{--gradient-to-color:#e53e3e}.focus\:to-red-700:focus{--gradient-to-color:#c53030}.focus\:to-red-800:focus{--gradient-to-color:#9b2c2c}.focus\:to-red-900:focus{--gradient-to-color:#742a2a}.focus\:to-orange-100:focus{--gradient-to-color:#fffaf0}.focus\:to-orange-200:focus{--gradient-to-color:#feebc8}.focus\:to-orange-300:focus{--gradient-to-color:#fbd38d}.focus\:to-orange-400:focus{--gradient-to-color:#f6ad55}.focus\:to-orange-500:focus{--gradient-to-color:#ed8936}.focus\:to-orange-600:focus{--gradient-to-color:#dd6b20}.focus\:to-orange-700:focus{--gradient-to-color:#c05621}.focus\:to-orange-800:focus{--gradient-to-color:#9c4221}.focus\:to-orange-900:focus{--gradient-to-color:#7b341e}.focus\:to-yellow-100:focus{--gradient-to-color:#fffff0}.focus\:to-yellow-200:focus{--gradient-to-color:#fefcbf}.focus\:to-yellow-300:focus{--gradient-to-color:#faf089}.focus\:to-yellow-400:focus{--gradient-to-color:#f6e05e}.focus\:to-yellow-500:focus{--gradient-to-color:#ecc94b}.focus\:to-yellow-600:focus{--gradient-to-color:#d69e2e}.focus\:to-yellow-700:focus{--gradient-to-color:#b7791f}.focus\:to-yellow-800:focus{--gradient-to-color:#975a16}.focus\:to-yellow-900:focus{--gradient-to-color:#744210}.focus\:to-green-100:focus{--gradient-to-color:#f0fff4}.focus\:to-green-200:focus{--gradient-to-color:#c6f6d5}.focus\:to-green-300:focus{--gradient-to-color:#9ae6b4}.focus\:to-green-400:focus{--gradient-to-color:#68d391}.focus\:to-green-500:focus{--gradient-to-color:#48bb78}.focus\:to-green-600:focus{--gradient-to-color:#38a169}.focus\:to-green-700:focus{--gradient-to-color:#2f855a}.focus\:to-green-800:focus{--gradient-to-color:#276749}.focus\:to-green-900:focus{--gradient-to-color:#22543d}.focus\:to-teal-100:focus{--gradient-to-color:#e6fffa}.focus\:to-teal-200:focus{--gradient-to-color:#b2f5ea}.focus\:to-teal-300:focus{--gradient-to-color:#81e6d9}.focus\:to-teal-400:focus{--gradient-to-color:#4fd1c5}.focus\:to-teal-500:focus{--gradient-to-color:#38b2ac}.focus\:to-teal-600:focus{--gradient-to-color:#319795}.focus\:to-teal-700:focus{--gradient-to-color:#2c7a7b}.focus\:to-teal-800:focus{--gradient-to-color:#285e61}.focus\:to-teal-900:focus{--gradient-to-color:#234e52}.focus\:to-blue-100:focus{--gradient-to-color:#ebf8ff}.focus\:to-blue-200:focus{--gradient-to-color:#bee3f8}.focus\:to-blue-300:focus{--gradient-to-color:#90cdf4}.focus\:to-blue-400:focus{--gradient-to-color:#63b3ed}.focus\:to-blue-500:focus{--gradient-to-color:#4299e1}.focus\:to-blue-600:focus{--gradient-to-color:#3182ce}.focus\:to-blue-700:focus{--gradient-to-color:#2b6cb0}.focus\:to-blue-800:focus{--gradient-to-color:#2c5282}.focus\:to-blue-900:focus{--gradient-to-color:#2a4365}.focus\:to-indigo-100:focus{--gradient-to-color:#ebf4ff}.focus\:to-indigo-200:focus{--gradient-to-color:#c3dafe}.focus\:to-indigo-300:focus{--gradient-to-color:#a3bffa}.focus\:to-indigo-400:focus{--gradient-to-color:#7f9cf5}.focus\:to-indigo-500:focus{--gradient-to-color:#667eea}.focus\:to-indigo-600:focus{--gradient-to-color:#5a67d8}.focus\:to-indigo-700:focus{--gradient-to-color:#4c51bf}.focus\:to-indigo-800:focus{--gradient-to-color:#434190}.focus\:to-indigo-900:focus{--gradient-to-color:#3c366b}.focus\:to-purple-100:focus{--gradient-to-color:#faf5ff}.focus\:to-purple-200:focus{--gradient-to-color:#e9d8fd}.focus\:to-purple-300:focus{--gradient-to-color:#d6bcfa}.focus\:to-purple-400:focus{--gradient-to-color:#b794f4}.focus\:to-purple-500:focus{--gradient-to-color:#9f7aea}.focus\:to-purple-600:focus{--gradient-to-color:#805ad5}.focus\:to-purple-700:focus{--gradient-to-color:#6b46c1}.focus\:to-purple-800:focus{--gradient-to-color:#553c9a}.focus\:to-purple-900:focus{--gradient-to-color:#44337a}.focus\:to-pink-100:focus{--gradient-to-color:#fff5f7}.focus\:to-pink-200:focus{--gradient-to-color:#fed7e2}.focus\:to-pink-300:focus{--gradient-to-color:#fbb6ce}.focus\:to-pink-400:focus{--gradient-to-color:#f687b3}.focus\:to-pink-500:focus{--gradient-to-color:#ed64a6}.focus\:to-pink-600:focus{--gradient-to-color:#d53f8c}.focus\:to-pink-700:focus{--gradient-to-color:#b83280}.focus\:to-pink-800:focus{--gradient-to-color:#97266d}.focus\:to-pink-900:focus{--gradient-to-color:#702459}.bg-opacity-0{--bg-opacity:0}.bg-opacity-25{--bg-opacity:0.25}.bg-opacity-50{--bg-opacity:0.5}.bg-opacity-75{--bg-opacity:0.75}.bg-opacity-100{--bg-opacity:1}.hover\:bg-opacity-0:hover{--bg-opacity:0}.hover\:bg-opacity-25:hover{--bg-opacity:0.25}.hover\:bg-opacity-50:hover{--bg-opacity:0.5}.hover\:bg-opacity-75:hover{--bg-opacity:0.75}.hover\:bg-opacity-100:hover{--bg-opacity:1}.focus\:bg-opacity-0:focus{--bg-opacity:0}.focus\:bg-opacity-25:focus{--bg-opacity:0.25}.focus\:bg-opacity-50:focus{--bg-opacity:0.5}.focus\:bg-opacity-75:focus{--bg-opacity:0.75}.focus\:bg-opacity-100:focus{--bg-opacity:1}.bg-bottom{background-position:bottom}.bg-center{background-position:center}.bg-left{background-position:left}.bg-left-bottom{background-position:left bottom}.bg-left-top{background-position:left top}.bg-right{background-position:right}.bg-right-bottom{background-position:right bottom}.bg-right-top{background-position:right top}.bg-top{background-position:top}.bg-repeat{background-repeat:repeat}.bg-no-repeat{background-repeat:no-repeat}.bg-repeat-x{background-repeat:repeat-x}.bg-repeat-y{background-repeat:repeat-y}.bg-repeat-round{background-repeat:round}.bg-repeat-space{background-repeat:space}.bg-auto{background-size:auto}.bg-cover{background-size:cover}.bg-contain{background-size:contain}.border-collapse{border-collapse:collapse}.border-separate{border-collapse:separate}.border-transparent{border-color:transparent}.border-current{border-color:currentColor}.border-black{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.border-white{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.border-gray-100{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.border-gray-300{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.border-gray-400{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.border-gray-500{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.border-gray-600{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.border-gray-800{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.border-gray-900{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.border-red-100{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.border-red-200{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.border-red-300{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.border-red-400{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.border-red-500{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.border-red-600{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.border-red-700{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.border-red-800{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.border-red-900{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.border-orange-100{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.border-orange-200{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.border-orange-300{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.border-orange-400{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.border-orange-500{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.border-orange-600{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.border-orange-700{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.border-orange-800{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.border-orange-900{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.border-yellow-100{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.border-yellow-200{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.border-yellow-300{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.border-yellow-400{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.border-yellow-500{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.border-yellow-600{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.border-yellow-700{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.border-yellow-800{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.border-yellow-900{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.border-green-100{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.border-green-200{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.border-green-300{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.border-green-400{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.border-green-500{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.border-green-600{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.border-green-700{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.border-green-800{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.border-green-900{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.border-teal-100{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.border-teal-200{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.border-teal-300{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.border-teal-400{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.border-teal-500{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.border-teal-600{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.border-teal-700{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.border-teal-800{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.border-teal-900{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.border-blue-100{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.border-blue-200{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.border-blue-300{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.border-blue-400{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.border-blue-500{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.border-blue-600{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.border-blue-700{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.border-blue-800{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.border-blue-900{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.border-indigo-100{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.border-indigo-200{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.border-indigo-300{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.border-indigo-400{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.border-indigo-500{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.border-indigo-600{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.border-indigo-700{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.border-indigo-800{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.border-indigo-900{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.border-purple-100{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.border-purple-200{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.border-purple-300{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.border-purple-400{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.border-purple-500{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.border-purple-600{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.border-purple-700{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.border-purple-800{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.border-purple-900{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.border-pink-100{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.border-pink-200{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.border-pink-300{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.border-pink-400{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.border-pink-500{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.border-pink-600{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.border-pink-700{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.border-pink-800{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.border-pink-900{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.hover\:border-transparent:hover{border-color:transparent}.hover\:border-current:hover{border-color:currentColor}.hover\:border-black:hover{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.hover\:border-white:hover{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.hover\:border-gray-100:hover{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.hover\:border-gray-200:hover{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.hover\:border-gray-300:hover{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.hover\:border-gray-400:hover{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.hover\:border-gray-500:hover{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.hover\:border-gray-600:hover{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.hover\:border-gray-700:hover{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.hover\:border-gray-800:hover{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.hover\:border-gray-900:hover{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.hover\:border-red-100:hover{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.hover\:border-red-200:hover{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.hover\:border-red-300:hover{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.hover\:border-red-400:hover{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.hover\:border-red-500:hover{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.hover\:border-red-600:hover{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.hover\:border-red-700:hover{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.hover\:border-red-800:hover{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.hover\:border-red-900:hover{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.hover\:border-orange-100:hover{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.hover\:border-orange-200:hover{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.hover\:border-orange-300:hover{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.hover\:border-orange-400:hover{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.hover\:border-orange-500:hover{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.hover\:border-orange-600:hover{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.hover\:border-orange-700:hover{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.hover\:border-orange-800:hover{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.hover\:border-orange-900:hover{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.hover\:border-yellow-100:hover{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.hover\:border-yellow-200:hover{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.hover\:border-yellow-300:hover{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.hover\:border-yellow-400:hover{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.hover\:border-yellow-500:hover{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.hover\:border-yellow-600:hover{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.hover\:border-yellow-700:hover{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.hover\:border-yellow-800:hover{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.hover\:border-yellow-900:hover{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.hover\:border-green-100:hover{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.hover\:border-green-200:hover{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.hover\:border-green-300:hover{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.hover\:border-green-400:hover{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.hover\:border-green-500:hover{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.hover\:border-green-600:hover{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.hover\:border-green-700:hover{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.hover\:border-green-800:hover{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.hover\:border-green-900:hover{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.hover\:border-teal-100:hover{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.hover\:border-teal-200:hover{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.hover\:border-teal-300:hover{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.hover\:border-teal-400:hover{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.hover\:border-teal-500:hover{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.hover\:border-teal-600:hover{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.hover\:border-teal-700:hover{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.hover\:border-teal-800:hover{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.hover\:border-teal-900:hover{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.hover\:border-blue-100:hover{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.hover\:border-blue-200:hover{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.hover\:border-blue-300:hover{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.hover\:border-blue-400:hover{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.hover\:border-blue-500:hover{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.hover\:border-blue-600:hover{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.hover\:border-blue-700:hover{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.hover\:border-blue-800:hover{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.hover\:border-blue-900:hover{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.hover\:border-indigo-100:hover{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.hover\:border-indigo-200:hover{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.hover\:border-indigo-300:hover{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.hover\:border-indigo-400:hover{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.hover\:border-indigo-500:hover{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.hover\:border-indigo-600:hover{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.hover\:border-indigo-700:hover{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.hover\:border-indigo-800:hover{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.hover\:border-indigo-900:hover{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.hover\:border-purple-100:hover{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.hover\:border-purple-200:hover{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.hover\:border-purple-300:hover{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.hover\:border-purple-400:hover{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.hover\:border-purple-500:hover{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.hover\:border-purple-600:hover{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.hover\:border-purple-700:hover{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.hover\:border-purple-800:hover{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.hover\:border-purple-900:hover{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.hover\:border-pink-100:hover{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.hover\:border-pink-200:hover{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.hover\:border-pink-300:hover{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.hover\:border-pink-400:hover{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.hover\:border-pink-500:hover{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.hover\:border-pink-600:hover{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.hover\:border-pink-700:hover{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.hover\:border-pink-800:hover{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.hover\:border-pink-900:hover{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.focus\:border-transparent:focus{border-color:transparent}.focus\:border-current:focus{border-color:currentColor}.focus\:border-black:focus{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.focus\:border-white:focus{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.focus\:border-gray-100:focus{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.focus\:border-gray-200:focus{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.focus\:border-gray-300:focus{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.focus\:border-gray-400:focus{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.focus\:border-gray-500:focus{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.focus\:border-gray-600:focus{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.focus\:border-gray-700:focus{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.focus\:border-gray-800:focus{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.focus\:border-gray-900:focus{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.focus\:border-red-100:focus{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.focus\:border-red-200:focus{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.focus\:border-red-300:focus{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.focus\:border-red-400:focus{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.focus\:border-red-500:focus{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.focus\:border-red-600:focus{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.focus\:border-red-700:focus{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.focus\:border-red-800:focus{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.focus\:border-red-900:focus{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.focus\:border-orange-100:focus{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.focus\:border-orange-200:focus{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.focus\:border-orange-300:focus{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.focus\:border-orange-400:focus{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.focus\:border-orange-500:focus{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.focus\:border-orange-600:focus{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.focus\:border-orange-700:focus{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.focus\:border-orange-800:focus{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.focus\:border-orange-900:focus{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.focus\:border-yellow-100:focus{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.focus\:border-yellow-200:focus{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.focus\:border-yellow-300:focus{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.focus\:border-yellow-400:focus{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.focus\:border-yellow-500:focus{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.focus\:border-yellow-600:focus{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.focus\:border-yellow-700:focus{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.focus\:border-yellow-800:focus{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.focus\:border-yellow-900:focus{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.focus\:border-green-100:focus{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.focus\:border-green-200:focus{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.focus\:border-green-300:focus{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.focus\:border-green-400:focus{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.focus\:border-green-500:focus{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.focus\:border-green-600:focus{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.focus\:border-green-700:focus{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.focus\:border-green-800:focus{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.focus\:border-green-900:focus{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.focus\:border-teal-100:focus{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.focus\:border-teal-200:focus{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.focus\:border-teal-300:focus{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.focus\:border-teal-400:focus{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.focus\:border-teal-500:focus{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.focus\:border-teal-600:focus{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.focus\:border-teal-700:focus{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.focus\:border-teal-800:focus{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.focus\:border-teal-900:focus{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.focus\:border-blue-100:focus{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.focus\:border-blue-200:focus{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.focus\:border-blue-300:focus{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.focus\:border-blue-400:focus{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.focus\:border-blue-500:focus{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.focus\:border-blue-600:focus{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.focus\:border-blue-700:focus{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.focus\:border-blue-800:focus{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.focus\:border-blue-900:focus{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.focus\:border-indigo-100:focus{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.focus\:border-indigo-200:focus{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.focus\:border-indigo-300:focus{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.focus\:border-indigo-400:focus{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.focus\:border-indigo-500:focus{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.focus\:border-indigo-600:focus{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.focus\:border-indigo-700:focus{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.focus\:border-indigo-800:focus{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.focus\:border-indigo-900:focus{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.focus\:border-purple-100:focus{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.focus\:border-purple-200:focus{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.focus\:border-purple-300:focus{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.focus\:border-purple-400:focus{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.focus\:border-purple-500:focus{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.focus\:border-purple-600:focus{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.focus\:border-purple-700:focus{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.focus\:border-purple-800:focus{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.focus\:border-purple-900:focus{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.focus\:border-pink-100:focus{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.focus\:border-pink-200:focus{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.focus\:border-pink-300:focus{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.focus\:border-pink-400:focus{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.focus\:border-pink-500:focus{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.focus\:border-pink-600:focus{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.focus\:border-pink-700:focus{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.focus\:border-pink-800:focus{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.focus\:border-pink-900:focus{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.border-opacity-0{--border-opacity:0}.border-opacity-25{--border-opacity:0.25}.border-opacity-50{--border-opacity:0.5}.border-opacity-75{--border-opacity:0.75}.border-opacity-100{--border-opacity:1}.hover\:border-opacity-0:hover{--border-opacity:0}.hover\:border-opacity-25:hover{--border-opacity:0.25}.hover\:border-opacity-50:hover{--border-opacity:0.5}.hover\:border-opacity-75:hover{--border-opacity:0.75}.hover\:border-opacity-100:hover{--border-opacity:1}.focus\:border-opacity-0:focus{--border-opacity:0}.focus\:border-opacity-25:focus{--border-opacity:0.25}.focus\:border-opacity-50:focus{--border-opacity:0.5}.focus\:border-opacity-75:focus{--border-opacity:0.75}.focus\:border-opacity-100:focus{--border-opacity:1}.rounded-none{border-radius:0}.rounded-sm{border-radius:.125rem}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-t-sm{border-top-left-radius:.125rem;border-top-right-radius:.125rem}.rounded-r-sm{border-top-right-radius:.125rem;border-bottom-right-radius:.125rem}.rounded-b-sm{border-bottom-right-radius:.125rem;border-bottom-left-radius:.125rem}.rounded-l-sm{border-top-left-radius:.125rem;border-bottom-left-radius:.125rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.rounded-l-xl{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.rounded-r-2xl{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.rounded-l-2xl{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.rounded-r-3xl{border-top-right-radius:1.5rem;border-bottom-right-radius:1.5rem}.rounded-b-3xl{border-bottom-right-radius:1.5rem;border-bottom-left-radius:1.5rem}.rounded-l-3xl{border-top-left-radius:1.5rem;border-bottom-left-radius:1.5rem}.rounded-t-full{border-top-left-radius:9999px;border-top-right-radius:9999px}.rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.rounded-b-full{border-bottom-right-radius:9999px;border-bottom-left-radius:9999px}.rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.rounded-tl-none{border-top-left-radius:0}.rounded-tr-none{border-top-right-radius:0}.rounded-br-none{border-bottom-right-radius:0}.rounded-bl-none{border-bottom-left-radius:0}.rounded-tl-sm{border-top-left-radius:.125rem}.rounded-tr-sm{border-top-right-radius:.125rem}.rounded-br-sm{border-bottom-right-radius:.125rem}.rounded-bl-sm{border-bottom-left-radius:.125rem}.rounded-tl{border-top-left-radius:.25rem}.rounded-tr{border-top-right-radius:.25rem}.rounded-br{border-bottom-right-radius:.25rem}.rounded-bl{border-bottom-left-radius:.25rem}.rounded-tl-md{border-top-left-radius:.375rem}.rounded-tr-md{border-top-right-radius:.375rem}.rounded-br-md{border-bottom-right-radius:.375rem}.rounded-bl-md{border-bottom-left-radius:.375rem}.rounded-tl-lg{border-top-left-radius:.5rem}.rounded-tr-lg{border-top-right-radius:.5rem}.rounded-br-lg{border-bottom-right-radius:.5rem}.rounded-bl-lg{border-bottom-left-radius:.5rem}.rounded-tl-xl{border-top-left-radius:.75rem}.rounded-tr-xl{border-top-right-radius:.75rem}.rounded-br-xl{border-bottom-right-radius:.75rem}.rounded-bl-xl{border-bottom-left-radius:.75rem}.rounded-tl-2xl{border-top-left-radius:1rem}.rounded-tr-2xl{border-top-right-radius:1rem}.rounded-br-2xl{border-bottom-right-radius:1rem}.rounded-bl-2xl{border-bottom-left-radius:1rem}.rounded-tl-3xl{border-top-left-radius:1.5rem}.rounded-tr-3xl{border-top-right-radius:1.5rem}.rounded-br-3xl{border-bottom-right-radius:1.5rem}.rounded-bl-3xl{border-bottom-left-radius:1.5rem}.rounded-tl-full{border-top-left-radius:9999px}.rounded-tr-full{border-top-right-radius:9999px}.rounded-br-full{border-bottom-right-radius:9999px}.rounded-bl-full{border-bottom-left-radius:9999px}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-dotted{border-style:dotted}.border-double{border-style:double}.border-none{border-style:none}.border-0{border-width:0}.border-2{border-width:2px}.border-4{border-width:4px}.border-8{border-width:8px}.border{border-width:1px}.border-t-0{border-top-width:0}.border-r-0{border-right-width:0}.border-b-0{border-bottom-width:0}.border-l-0{border-left-width:0}.border-t-2{border-top-width:2px}.border-r-2{border-right-width:2px}.border-b-2{border-bottom-width:2px}.border-l-2{border-left-width:2px}.border-t-4{border-top-width:4px}.border-r-4{border-right-width:4px}.border-b-4{border-bottom-width:4px}.border-l-4{border-left-width:4px}.border-t-8{border-top-width:8px}.border-r-8{border-right-width:8px}.border-b-8{border-bottom-width:8px}.border-l-8{border-left-width:8px}.border-t{border-top-width:1px}.border-r{border-right-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.box-border{box-sizing:border-box}.box-content{box-sizing:content-box}.cursor-auto{cursor:auto}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.cursor-wait{cursor:wait}.cursor-text{cursor:text}.cursor-move{cursor:move}.cursor-not-allowed{cursor:not-allowed}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-column{display:table-column}.table-column-group{display:table-column-group}.table-footer-group{display:table-footer-group}.table-header-group{display:table-header-group}.table-row-group{display:table-row-group}.table-row{display:table-row}.flow-root{display:flow-root}.grid{display:grid}.inline-grid{display:inline-grid}.contents{display:contents}.hidden{display:none}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.flex-wrap-reverse{flex-wrap:wrap-reverse}.flex-no-wrap{flex-wrap:nowrap}.place-items-auto{place-items:auto}.place-items-start{place-items:start}.place-items-end{place-items:end}.place-items-center{place-items:center}.place-items-stretch{place-items:stretch}.place-content-center{place-content:center}.place-content-start{place-content:start}.place-content-end{place-content:end}.place-content-between{place-content:space-between}.place-content-around{place-content:space-around}.place-content-evenly{place-content:space-evenly}.place-content-stretch{place-content:stretch}.place-self-auto{place-self:auto}.place-self-start{place-self:start}.place-self-end{place-self:end}.place-self-center{place-self:center}.place-self-stretch{place-self:stretch}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.content-center{align-content:center}.content-start{align-content:flex-start}.content-end{align-content:flex-end}.content-between{align-content:space-between}.content-around{align-content:space-around}.content-evenly{align-content:space-evenly}.self-auto{align-self:auto}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.self-center{align-self:center}.self-stretch{align-self:stretch}.justify-items-auto{justify-items:auto}.justify-items-start{justify-items:start}.justify-items-end{justify-items:end}.justify-items-center{justify-items:center}.justify-items-stretch{justify-items:stretch}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.justify-self-auto{justify-self:auto}.justify-self-start{justify-self:start}.justify-self-end{justify-self:end}.justify-self-center{justify-self:center}.justify-self-stretch{justify-self:stretch}.flex-1{flex:1 1 0%}.flex-auto{flex:1 1 auto}.flex-initial{flex:0 1 auto}.flex-none{flex:none}.flex-grow-0{flex-grow:0}.flex-grow{flex-grow:1}.flex-shrink-0{flex-shrink:0}.flex-shrink{flex-shrink:1}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.order-first{order:-9999}.order-last{order:9999}.order-none{order:0}.float-right{float:right}.float-left{float:left}.float-none{float:none}.clearfix:after{content:"";display:table;clear:both}.clear-left{clear:left}.clear-right{clear:right}.clear-both{clear:both}.clear-none{clear:none}.font-sans{font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.font-serif{font-family:Georgia,Cambria,"Times New Roman",Times,serif}.font-mono{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.font-hairline{font-weight:100}.font-thin{font-weight:200}.font-light{font-weight:300}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-black{font-weight:900}.hover\:font-hairline:hover{font-weight:100}.hover\:font-thin:hover{font-weight:200}.hover\:font-light:hover{font-weight:300}.hover\:font-normal:hover{font-weight:400}.hover\:font-medium:hover{font-weight:500}.hover\:font-semibold:hover{font-weight:600}.hover\:font-bold:hover{font-weight:700}.hover\:font-extrabold:hover{font-weight:800}.hover\:font-black:hover{font-weight:900}.focus\:font-hairline:focus{font-weight:100}.focus\:font-thin:focus{font-weight:200}.focus\:font-light:focus{font-weight:300}.focus\:font-normal:focus{font-weight:400}.focus\:font-medium:focus{font-weight:500}.focus\:font-semibold:focus{font-weight:600}.focus\:font-bold:focus{font-weight:700}.focus\:font-extrabold:focus{font-weight:800}.focus\:font-black:focus{font-weight:900}.h-0{height:0}.h-1{height:.25rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-16{height:4rem}.h-20{height:5rem}.h-24{height:6rem}.h-32{height:8rem}.h-40{height:10rem}.h-48{height:12rem}.h-56{height:14rem}.h-64{height:16rem}.h-auto{height:auto}.h-px{height:1px}.h-full{height:100%}.h-screen{height:100vh}.text-xs{font-size:.75rem}.text-sm{font-size:.875rem}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-2xl{font-size:1.5rem}.text-3xl{font-size:1.875rem}.text-4xl{font-size:2.25rem}.text-5xl{font-size:3rem}.text-6xl{font-size:4rem}.leading-3{line-height:.75rem}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-8{line-height:2rem}.leading-9{line-height:2.25rem}.leading-10{line-height:2.5rem}.leading-none{line-height:1}.leading-tight{line-height:1.25}.leading-snug{line-height:1.375}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.leading-loose{line-height:2}.list-inside{list-style-position:inside}.list-outside{list-style-position:outside}.list-none{list-style-type:none}.list-disc{list-style-type:disc}.list-decimal{list-style-type:decimal}.m-0{margin:0}.m-1{margin:.25rem}.m-2{margin:.5rem}.m-3{margin:.75rem}.m-4{margin:1rem}.m-5{margin:1.25rem}.m-6{margin:1.5rem}.m-8{margin:2rem}.m-10{margin:2.5rem}.m-12{margin:3rem}.m-16{margin:4rem}.m-20{margin:5rem}.m-24{margin:6rem}.m-32{margin:8rem}.m-40{margin:10rem}.m-48{margin:12rem}.m-56{margin:14rem}.m-64{margin:16rem}.m-auto{margin:auto}.m-px{margin:1px}.-m-1{margin:-.25rem}.-m-2{margin:-.5rem}.-m-3{margin:-.75rem}.-m-4{margin:-1rem}.-m-5{margin:-1.25rem}.-m-6{margin:-1.5rem}.-m-8{margin:-2rem}.-m-10{margin:-2.5rem}.-m-12{margin:-3rem}.-m-16{margin:-4rem}.-m-20{margin:-5rem}.-m-24{margin:-6rem}.-m-32{margin:-8rem}.-m-40{margin:-10rem}.-m-48{margin:-12rem}.-m-56{margin:-14rem}.-m-64{margin:-16rem}.-m-px{margin:-1px}.my-0{margin-top:0;margin-bottom:0}.mx-0{margin-left:0;margin-right:0}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.mx-4{margin-left:1rem;margin-right:1rem}.my-5{margin-top:1.25rem;margin-bottom:1.25rem}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.my-8{margin-top:2rem;margin-bottom:2rem}.mx-8{margin-left:2rem;margin-right:2rem}.my-10{margin-top:2.5rem;margin-bottom:2.5rem}.mx-10{margin-left:2.5rem;margin-right:2.5rem}.my-12{margin-top:3rem;margin-bottom:3rem}.mx-12{margin-left:3rem;margin-right:3rem}.my-16{margin-top:4rem;margin-bottom:4rem}.mx-16{margin-left:4rem;margin-right:4rem}.my-20{margin-top:5rem;margin-bottom:5rem}.mx-20{margin-left:5rem;margin-right:5rem}.my-24{margin-top:6rem;margin-bottom:6rem}.mx-24{margin-left:6rem;margin-right:6rem}.my-32{margin-top:8rem;margin-bottom:8rem}.mx-32{margin-left:8rem;margin-right:8rem}.my-40{margin-top:10rem;margin-bottom:10rem}.mx-40{margin-left:10rem;margin-right:10rem}.my-48{margin-top:12rem;margin-bottom:12rem}.mx-48{margin-left:12rem;margin-right:12rem}.my-56{margin-top:14rem;margin-bottom:14rem}.mx-56{margin-left:14rem;margin-right:14rem}.my-64{margin-top:16rem;margin-bottom:16rem}.mx-64{margin-left:16rem;margin-right:16rem}.my-auto{margin-top:auto;margin-bottom:auto}.mx-auto{margin-left:auto;margin-right:auto}.my-px{margin-top:1px;margin-bottom:1px}.mx-px{margin-left:1px;margin-right:1px}.-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.-mx-3{margin-left:-.75rem;margin-right:-.75rem}.-my-4{margin-top:-1rem;margin-bottom:-1rem}.-mx-4{margin-left:-1rem;margin-right:-1rem}.-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.-my-8{margin-top:-2rem;margin-bottom:-2rem}.-mx-8{margin-left:-2rem;margin-right:-2rem}.-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.-my-12{margin-top:-3rem;margin-bottom:-3rem}.-mx-12{margin-left:-3rem;margin-right:-3rem}.-my-16{margin-top:-4rem;margin-bottom:-4rem}.-mx-16{margin-left:-4rem;margin-right:-4rem}.-my-20{margin-top:-5rem;margin-bottom:-5rem}.-mx-20{margin-left:-5rem;margin-right:-5rem}.-my-24{margin-top:-6rem;margin-bottom:-6rem}.-mx-24{margin-left:-6rem;margin-right:-6rem}.-my-32{margin-top:-8rem;margin-bottom:-8rem}.-mx-32{margin-left:-8rem;margin-right:-8rem}.-my-40{margin-top:-10rem;margin-bottom:-10rem}.-mx-40{margin-left:-10rem;margin-right:-10rem}.-my-48{margin-top:-12rem;margin-bottom:-12rem}.-mx-48{margin-left:-12rem;margin-right:-12rem}.-my-56{margin-top:-14rem;margin-bottom:-14rem}.-mx-56{margin-left:-14rem;margin-right:-14rem}.-my-64{margin-top:-16rem;margin-bottom:-16rem}.-mx-64{margin-left:-16rem;margin-right:-16rem}.-my-px{margin-top:-1px;margin-bottom:-1px}.-mx-px{margin-left:-1px;margin-right:-1px}.mt-0{margin-top:0}.mr-0{margin-right:0}.mb-0{margin-bottom:0}.ml-0{margin-left:0}.mt-1{margin-top:.25rem}.mr-1{margin-right:.25rem}.mb-1{margin-bottom:.25rem}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mt-3{margin-top:.75rem}.mr-3{margin-right:.75rem}.mb-3{margin-bottom:.75rem}.ml-3{margin-left:.75rem}.mt-4{margin-top:1rem}.mr-4{margin-right:1rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.mt-5{margin-top:1.25rem}.mr-5{margin-right:1.25rem}.mb-5{margin-bottom:1.25rem}.ml-5{margin-left:1.25rem}.mt-6{margin-top:1.5rem}.mr-6{margin-right:1.5rem}.mb-6{margin-bottom:1.5rem}.ml-6{margin-left:1.5rem}.mt-8{margin-top:2rem}.mr-8{margin-right:2rem}.mb-8{margin-bottom:2rem}.ml-8{margin-left:2rem}.mt-10{margin-top:2.5rem}.mr-10{margin-right:2.5rem}.mb-10{margin-bottom:2.5rem}.ml-10{margin-left:2.5rem}.mt-12{margin-top:3rem}.mr-12{margin-right:3rem}.mb-12{margin-bottom:3rem}.ml-12{margin-left:3rem}.mt-16{margin-top:4rem}.mr-16{margin-right:4rem}.mb-16{margin-bottom:4rem}.ml-16{margin-left:4rem}.mt-20{margin-top:5rem}.mr-20{margin-right:5rem}.mb-20{margin-bottom:5rem}.ml-20{margin-left:5rem}.mt-24{margin-top:6rem}.mr-24{margin-right:6rem}.mb-24{margin-bottom:6rem}.ml-24{margin-left:6rem}.mt-32{margin-top:8rem}.mr-32{margin-right:8rem}.mb-32{margin-bottom:8rem}.ml-32{margin-left:8rem}.mt-40{margin-top:10rem}.mr-40{margin-right:10rem}.mb-40{margin-bottom:10rem}.ml-40{margin-left:10rem}.mt-48{margin-top:12rem}.mr-48{margin-right:12rem}.mb-48{margin-bottom:12rem}.ml-48{margin-left:12rem}.mt-56{margin-top:14rem}.mr-56{margin-right:14rem}.mb-56{margin-bottom:14rem}.ml-56{margin-left:14rem}.mt-64{margin-top:16rem}.mr-64{margin-right:16rem}.mb-64{margin-bottom:16rem}.ml-64{margin-left:16rem}.mt-auto{margin-top:auto}.mr-auto{margin-right:auto}.mb-auto{margin-bottom:auto}.ml-auto{margin-left:auto}.mt-px{margin-top:1px}.mr-px{margin-right:1px}.mb-px{margin-bottom:1px}.ml-px{margin-left:1px}.-mt-1{margin-top:-.25rem}.-mr-1{margin-right:-.25rem}.-mb-1{margin-bottom:-.25rem}.-ml-1{margin-left:-.25rem}.-mt-2{margin-top:-.5rem}.-mr-2{margin-right:-.5rem}.-mb-2{margin-bottom:-.5rem}.-ml-2{margin-left:-.5rem}.-mt-3{margin-top:-.75rem}.-mr-3{margin-right:-.75rem}.-mb-3{margin-bottom:-.75rem}.-ml-3{margin-left:-.75rem}.-mt-4{margin-top:-1rem}.-mr-4{margin-right:-1rem}.-mb-4{margin-bottom:-1rem}.-ml-4{margin-left:-1rem}.-mt-5{margin-top:-1.25rem}.-mr-5{margin-right:-1.25rem}.-mb-5{margin-bottom:-1.25rem}.-ml-5{margin-left:-1.25rem}.-mt-6{margin-top:-1.5rem}.-mr-6{margin-right:-1.5rem}.-mb-6{margin-bottom:-1.5rem}.-ml-6{margin-left:-1.5rem}.-mt-8{margin-top:-2rem}.-mr-8{margin-right:-2rem}.-mb-8{margin-bottom:-2rem}.-ml-8{margin-left:-2rem}.-mt-10{margin-top:-2.5rem}.-mr-10{margin-right:-2.5rem}.-mb-10{margin-bottom:-2.5rem}.-ml-10{margin-left:-2.5rem}.-mt-12{margin-top:-3rem}.-mr-12{margin-right:-3rem}.-mb-12{margin-bottom:-3rem}.-ml-12{margin-left:-3rem}.-mt-16{margin-top:-4rem}.-mr-16{margin-right:-4rem}.-mb-16{margin-bottom:-4rem}.-ml-16{margin-left:-4rem}.-mt-20{margin-top:-5rem}.-mr-20{margin-right:-5rem}.-mb-20{margin-bottom:-5rem}.-ml-20{margin-left:-5rem}.-mt-24{margin-top:-6rem}.-mr-24{margin-right:-6rem}.-mb-24{margin-bottom:-6rem}.-ml-24{margin-left:-6rem}.-mt-32{margin-top:-8rem}.-mr-32{margin-right:-8rem}.-mb-32{margin-bottom:-8rem}.-ml-32{margin-left:-8rem}.-mt-40{margin-top:-10rem}.-mr-40{margin-right:-10rem}.-mb-40{margin-bottom:-10rem}.-ml-40{margin-left:-10rem}.-mt-48{margin-top:-12rem}.-mr-48{margin-right:-12rem}.-mb-48{margin-bottom:-12rem}.-ml-48{margin-left:-12rem}.-mt-56{margin-top:-14rem}.-mr-56{margin-right:-14rem}.-mb-56{margin-bottom:-14rem}.-ml-56{margin-left:-14rem}.-mt-64{margin-top:-16rem}.-mr-64{margin-right:-16rem}.-mb-64{margin-bottom:-16rem}.-ml-64{margin-left:-16rem}.-mt-px{margin-top:-1px}.-mr-px{margin-right:-1px}.-mb-px{margin-bottom:-1px}.-ml-px{margin-left:-1px}.max-h-full{max-height:100%}.max-h-screen{max-height:100vh}.max-w-none{max-width:none}.max-w-xs{max-width:20rem}.max-w-sm{max-width:24rem}.max-w-md{max-width:28rem}.max-w-lg{max-width:32rem}.max-w-xl{max-width:36rem}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-full{max-width:100%}.max-w-screen-sm{max-width:640px}.max-w-screen-md{max-width:768px}.max-w-screen-lg{max-width:1024px}.max-w-screen-xl{max-width:1280px}.min-h-0{min-height:0}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.min-w-0{min-width:0}.min-w-full{min-width:100%}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.object-fill{object-fit:fill}.object-none{object-fit:none}.object-scale-down{object-fit:scale-down}.object-bottom{object-position:bottom}.object-center{object-position:center}.object-left{object-position:left}.object-left-bottom{object-position:left bottom}.object-left-top{object-position:left top}.object-right{object-position:right}.object-right-bottom{object-position:right bottom}.object-right-top{object-position:right top}.object-top{object-position:top}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.opacity-100{opacity:1}.hover\:opacity-0:hover{opacity:0}.hover\:opacity-25:hover{opacity:.25}.hover\:opacity-50:hover{opacity:.5}.hover\:opacity-75:hover{opacity:.75}.hover\:opacity-100:hover{opacity:1}.focus\:opacity-0:focus{opacity:0}.focus\:opacity-25:focus{opacity:.25}.focus\:opacity-50:focus{opacity:.5}.focus\:opacity-75:focus{opacity:.75}.focus\:opacity-100:focus{opacity:1}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline-white{outline:2px dotted #fff;outline-offset:2px}.outline-black{outline:2px dotted #000;outline-offset:2px}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:outline-white:focus{outline:2px dotted #fff;outline-offset:2px}.focus\:outline-black:focus{outline:2px dotted #000;outline-offset:2px}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-scroll{overflow:scroll}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-hidden{overflow-y:hidden}.overflow-x-visible{overflow-x:visible}.overflow-y-visible{overflow-y:visible}.overflow-x-scroll{overflow-x:scroll}.overflow-y-scroll{overflow-y:scroll}.scrolling-touch{-webkit-overflow-scrolling:touch}.scrolling-auto{-webkit-overflow-scrolling:auto}.overscroll-auto{-ms-scroll-chaining:chained;overscroll-behavior:auto}.overscroll-contain{-ms-scroll-chaining:none;overscroll-behavior:contain}.overscroll-none{-ms-scroll-chaining:none;overscroll-behavior:none}.overscroll-y-auto{overscroll-behavior-y:auto}.overscroll-y-contain{overscroll-behavior-y:contain}.overscroll-y-none{overscroll-behavior-y:none}.overscroll-x-auto{overscroll-behavior-x:auto}.overscroll-x-contain{overscroll-behavior-x:contain}.overscroll-x-none{overscroll-behavior-x:none}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.p-10{padding:2.5rem}.p-12{padding:3rem}.p-16{padding:4rem}.p-20{padding:5rem}.p-24{padding:6rem}.p-32{padding:8rem}.p-40{padding:10rem}.p-48{padding:12rem}.p-56{padding:14rem}.p-64{padding:16rem}.p-px{padding:1px}.py-0{padding-top:0;padding-bottom:0}.px-0{padding-left:0;padding-right:0}.py-1{padding-top:.25rem;padding-bottom:.25rem}.px-1{padding-left:.25rem;padding-right:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.px-8{padding-left:2rem;padding-right:2rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.px-12{padding-left:3rem;padding-right:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.px-16{padding-left:4rem;padding-right:4rem}.py-20{padding-top:5rem;padding-bottom:5rem}.px-20{padding-left:5rem;padding-right:5rem}.py-24{padding-top:6rem;padding-bottom:6rem}.px-24{padding-left:6rem;padding-right:6rem}.py-32{padding-top:8rem;padding-bottom:8rem}.px-32{padding-left:8rem;padding-right:8rem}.py-40{padding-top:10rem;padding-bottom:10rem}.px-40{padding-left:10rem;padding-right:10rem}.py-48{padding-top:12rem;padding-bottom:12rem}.px-48{padding-left:12rem;padding-right:12rem}.py-56{padding-top:14rem;padding-bottom:14rem}.px-56{padding-left:14rem;padding-right:14rem}.py-64{padding-top:16rem;padding-bottom:16rem}.px-64{padding-left:16rem;padding-right:16rem}.py-px{padding-top:1px;padding-bottom:1px}.px-px{padding-left:1px;padding-right:1px}.pt-0{padding-top:0}.pr-0{padding-right:0}.pb-0{padding-bottom:0}.pl-0{padding-left:0}.pt-1{padding-top:.25rem}.pr-1{padding-right:.25rem}.pb-1{padding-bottom:.25rem}.pl-1{padding-left:.25rem}.pt-2{padding-top:.5rem}.pr-2{padding-right:.5rem}.pb-2{padding-bottom:.5rem}.pl-2{padding-left:.5rem}.pt-3{padding-top:.75rem}.pr-3{padding-right:.75rem}.pb-3{padding-bottom:.75rem}.pl-3{padding-left:.75rem}.pt-4{padding-top:1rem}.pr-4{padding-right:1rem}.pb-4{padding-bottom:1rem}.pl-4{padding-left:1rem}.pt-5{padding-top:1.25rem}.pr-5{padding-right:1.25rem}.pb-5{padding-bottom:1.25rem}.pl-5{padding-left:1.25rem}.pt-6{padding-top:1.5rem}.pr-6{padding-right:1.5rem}.pb-6{padding-bottom:1.5rem}.pl-6{padding-left:1.5rem}.pt-8{padding-top:2rem}.pr-8{padding-right:2rem}.pb-8{padding-bottom:2rem}.pl-8{padding-left:2rem}.pt-10{padding-top:2.5rem}.pr-10{padding-right:2.5rem}.pb-10{padding-bottom:2.5rem}.pl-10{padding-left:2.5rem}.pt-12{padding-top:3rem}.pr-12{padding-right:3rem}.pb-12{padding-bottom:3rem}.pl-12{padding-left:3rem}.pt-16{padding-top:4rem}.pr-16{padding-right:4rem}.pb-16{padding-bottom:4rem}.pl-16{padding-left:4rem}.pt-20{padding-top:5rem}.pr-20{padding-right:5rem}.pb-20{padding-bottom:5rem}.pl-20{padding-left:5rem}.pt-24{padding-top:6rem}.pr-24{padding-right:6rem}.pb-24{padding-bottom:6rem}.pl-24{padding-left:6rem}.pt-32{padding-top:8rem}.pr-32{padding-right:8rem}.pb-32{padding-bottom:8rem}.pl-32{padding-left:8rem}.pt-40{padding-top:10rem}.pr-40{padding-right:10rem}.pb-40{padding-bottom:10rem}.pl-40{padding-left:10rem}.pt-48{padding-top:12rem}.pr-48{padding-right:12rem}.pb-48{padding-bottom:12rem}.pl-48{padding-left:12rem}.pt-56{padding-top:14rem}.pr-56{padding-right:14rem}.pb-56{padding-bottom:14rem}.pl-56{padding-left:14rem}.pt-64{padding-top:16rem}.pr-64{padding-right:16rem}.pb-64{padding-bottom:16rem}.pl-64{padding-left:16rem}.pt-px{padding-top:1px}.pr-px{padding-right:1px}.pb-px{padding-bottom:1px}.pl-px{padding-left:1px}.placeholder-transparent:-ms-input-placeholder{color:transparent}.placeholder-transparent::-ms-input-placeholder{color:transparent}.placeholder-transparent::placeholder{color:transparent}.placeholder-current:-ms-input-placeholder{color:currentColor}.placeholder-current::-ms-input-placeholder{color:currentColor}.placeholder-current::placeholder{color:currentColor}.placeholder-black:-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.placeholder-black::-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.placeholder-black::placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.placeholder-white:-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.placeholder-white::-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.placeholder-white::placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.placeholder-gray-100:-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.placeholder-gray-100::-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.placeholder-gray-100::placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.placeholder-gray-200:-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.placeholder-gray-200::-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.placeholder-gray-200::placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.placeholder-gray-300:-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.placeholder-gray-300::-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.placeholder-gray-300::placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.placeholder-gray-400:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.placeholder-gray-400::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.placeholder-gray-400::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.placeholder-gray-500:-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.placeholder-gray-500::-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.placeholder-gray-500::placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.placeholder-gray-600:-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.placeholder-gray-600::-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.placeholder-gray-600::placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.placeholder-gray-700:-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.placeholder-gray-700::-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.placeholder-gray-700::placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.placeholder-gray-800:-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.placeholder-gray-800::-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.placeholder-gray-800::placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.placeholder-gray-900:-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.placeholder-gray-900::-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.placeholder-gray-900::placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.placeholder-red-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.placeholder-red-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.placeholder-red-100::placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.placeholder-red-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.placeholder-red-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.placeholder-red-200::placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.placeholder-red-300:-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.placeholder-red-300::-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.placeholder-red-300::placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.placeholder-red-400:-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.placeholder-red-400::-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.placeholder-red-400::placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.placeholder-red-500:-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.placeholder-red-500::-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.placeholder-red-500::placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.placeholder-red-600:-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.placeholder-red-600::-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.placeholder-red-600::placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.placeholder-red-700:-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.placeholder-red-700::-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.placeholder-red-700::placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.placeholder-red-800:-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.placeholder-red-800::-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.placeholder-red-800::placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.placeholder-red-900:-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.placeholder-red-900::-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.placeholder-red-900::placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.placeholder-orange-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.placeholder-orange-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.placeholder-orange-100::placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.placeholder-orange-200:-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.placeholder-orange-200::-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.placeholder-orange-200::placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.placeholder-orange-300:-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.placeholder-orange-300::-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.placeholder-orange-300::placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.placeholder-orange-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.placeholder-orange-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.placeholder-orange-400::placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.placeholder-orange-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.placeholder-orange-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.placeholder-orange-500::placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.placeholder-orange-600:-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.placeholder-orange-600::-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.placeholder-orange-600::placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.placeholder-orange-700:-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.placeholder-orange-700::-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.placeholder-orange-700::placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.placeholder-orange-800:-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.placeholder-orange-800::-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.placeholder-orange-800::placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.placeholder-orange-900:-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.placeholder-orange-900::-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.placeholder-orange-900::placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.placeholder-yellow-100:-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.placeholder-yellow-100::-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.placeholder-yellow-100::placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.placeholder-yellow-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.placeholder-yellow-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.placeholder-yellow-200::placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.placeholder-yellow-300:-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.placeholder-yellow-300::-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.placeholder-yellow-300::placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.placeholder-yellow-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.placeholder-yellow-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.placeholder-yellow-400::placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.placeholder-yellow-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.placeholder-yellow-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.placeholder-yellow-500::placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.placeholder-yellow-600:-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.placeholder-yellow-600::-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.placeholder-yellow-600::placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.placeholder-yellow-700:-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.placeholder-yellow-700::-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.placeholder-yellow-700::placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.placeholder-yellow-800:-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.placeholder-yellow-800::-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.placeholder-yellow-800::placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.placeholder-yellow-900:-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.placeholder-yellow-900::-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.placeholder-yellow-900::placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.placeholder-green-100:-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.placeholder-green-100::-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.placeholder-green-100::placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.placeholder-green-200:-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.placeholder-green-200::-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.placeholder-green-200::placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.placeholder-green-300:-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.placeholder-green-300::-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.placeholder-green-300::placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.placeholder-green-400:-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.placeholder-green-400::-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.placeholder-green-400::placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.placeholder-green-500:-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.placeholder-green-500::-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.placeholder-green-500::placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.placeholder-green-600:-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.placeholder-green-600::-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.placeholder-green-600::placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.placeholder-green-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.placeholder-green-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.placeholder-green-700::placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.placeholder-green-800:-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.placeholder-green-800::-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.placeholder-green-800::placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.placeholder-green-900:-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.placeholder-green-900::-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.placeholder-green-900::placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.placeholder-teal-100:-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.placeholder-teal-100::-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.placeholder-teal-100::placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.placeholder-teal-200:-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.placeholder-teal-200::-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.placeholder-teal-200::placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.placeholder-teal-300:-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.placeholder-teal-300::-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.placeholder-teal-300::placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.placeholder-teal-400:-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.placeholder-teal-400::-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.placeholder-teal-400::placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.placeholder-teal-500:-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.placeholder-teal-500::-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.placeholder-teal-500::placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.placeholder-teal-600:-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.placeholder-teal-600::-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.placeholder-teal-600::placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.placeholder-teal-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.placeholder-teal-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.placeholder-teal-700::placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.placeholder-teal-800:-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.placeholder-teal-800::-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.placeholder-teal-800::placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.placeholder-teal-900:-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.placeholder-teal-900::-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.placeholder-teal-900::placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.placeholder-blue-100:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.placeholder-blue-100::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.placeholder-blue-100::placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.placeholder-blue-200:-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.placeholder-blue-200::-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.placeholder-blue-200::placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.placeholder-blue-300:-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.placeholder-blue-300::-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.placeholder-blue-300::placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.placeholder-blue-400:-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.placeholder-blue-400::-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.placeholder-blue-400::placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.placeholder-blue-500:-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.placeholder-blue-500::-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.placeholder-blue-500::placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.placeholder-blue-600:-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.placeholder-blue-600::-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.placeholder-blue-600::placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.placeholder-blue-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.placeholder-blue-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.placeholder-blue-700::placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.placeholder-blue-800:-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.placeholder-blue-800::-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.placeholder-blue-800::placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.placeholder-blue-900:-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.placeholder-blue-900::-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.placeholder-blue-900::placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.placeholder-indigo-100:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.placeholder-indigo-100::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.placeholder-indigo-100::placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.placeholder-indigo-200:-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.placeholder-indigo-200::-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.placeholder-indigo-200::placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.placeholder-indigo-300:-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.placeholder-indigo-300::-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.placeholder-indigo-300::placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.placeholder-indigo-400:-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.placeholder-indigo-400::-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.placeholder-indigo-400::placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.placeholder-indigo-500:-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.placeholder-indigo-500::-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.placeholder-indigo-500::placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.placeholder-indigo-600:-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.placeholder-indigo-600::-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.placeholder-indigo-600::placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.placeholder-indigo-700:-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.placeholder-indigo-700::-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.placeholder-indigo-700::placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.placeholder-indigo-800:-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.placeholder-indigo-800::-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.placeholder-indigo-800::placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.placeholder-indigo-900:-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.placeholder-indigo-900::-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.placeholder-indigo-900::placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.placeholder-purple-100:-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.placeholder-purple-100::-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.placeholder-purple-100::placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.placeholder-purple-200:-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.placeholder-purple-200::-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.placeholder-purple-200::placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.placeholder-purple-300:-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.placeholder-purple-300::-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.placeholder-purple-300::placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.placeholder-purple-400:-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.placeholder-purple-400::-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.placeholder-purple-400::placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.placeholder-purple-500:-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.placeholder-purple-500::-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.placeholder-purple-500::placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.placeholder-purple-600:-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.placeholder-purple-600::-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.placeholder-purple-600::placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.placeholder-purple-700:-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.placeholder-purple-700::-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.placeholder-purple-700::placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.placeholder-purple-800:-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.placeholder-purple-800::-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.placeholder-purple-800::placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.placeholder-purple-900:-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.placeholder-purple-900::-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.placeholder-purple-900::placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.placeholder-pink-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.placeholder-pink-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.placeholder-pink-100::placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.placeholder-pink-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.placeholder-pink-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.placeholder-pink-200::placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.placeholder-pink-300:-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.placeholder-pink-300::-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.placeholder-pink-300::placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.placeholder-pink-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.placeholder-pink-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.placeholder-pink-400::placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.placeholder-pink-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.placeholder-pink-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.placeholder-pink-500::placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.placeholder-pink-600:-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.placeholder-pink-600::-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.placeholder-pink-600::placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.placeholder-pink-700:-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.placeholder-pink-700::-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.placeholder-pink-700::placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.placeholder-pink-800:-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.placeholder-pink-800::-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.placeholder-pink-800::placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.placeholder-pink-900:-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.placeholder-pink-900::-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.placeholder-pink-900::placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.focus\:placeholder-transparent:focus:-ms-input-placeholder{color:transparent}.focus\:placeholder-transparent:focus::-ms-input-placeholder{color:transparent}.focus\:placeholder-transparent:focus::placeholder{color:transparent}.focus\:placeholder-current:focus:-ms-input-placeholder{color:currentColor}.focus\:placeholder-current:focus::-ms-input-placeholder{color:currentColor}.focus\:placeholder-current:focus::placeholder{color:currentColor}.focus\:placeholder-black:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.focus\:placeholder-black:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.focus\:placeholder-black:focus::placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.focus\:placeholder-white:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.focus\:placeholder-white:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.focus\:placeholder-white:focus::placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.focus\:placeholder-gray-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.focus\:placeholder-gray-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.focus\:placeholder-gray-100:focus::placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.focus\:placeholder-gray-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.focus\:placeholder-gray-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.focus\:placeholder-gray-200:focus::placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.focus\:placeholder-gray-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.focus\:placeholder-gray-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.focus\:placeholder-gray-300:focus::placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.focus\:placeholder-gray-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.focus\:placeholder-gray-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.focus\:placeholder-gray-400:focus::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.focus\:placeholder-gray-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.focus\:placeholder-gray-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.focus\:placeholder-gray-500:focus::placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.focus\:placeholder-gray-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.focus\:placeholder-gray-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.focus\:placeholder-gray-600:focus::placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.focus\:placeholder-gray-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.focus\:placeholder-gray-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.focus\:placeholder-gray-700:focus::placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.focus\:placeholder-gray-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.focus\:placeholder-gray-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.focus\:placeholder-gray-800:focus::placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.focus\:placeholder-gray-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.focus\:placeholder-gray-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.focus\:placeholder-gray-900:focus::placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.focus\:placeholder-red-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.focus\:placeholder-red-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.focus\:placeholder-red-100:focus::placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.focus\:placeholder-red-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.focus\:placeholder-red-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.focus\:placeholder-red-200:focus::placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.focus\:placeholder-red-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.focus\:placeholder-red-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.focus\:placeholder-red-300:focus::placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.focus\:placeholder-red-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.focus\:placeholder-red-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.focus\:placeholder-red-400:focus::placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.focus\:placeholder-red-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.focus\:placeholder-red-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.focus\:placeholder-red-500:focus::placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.focus\:placeholder-red-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.focus\:placeholder-red-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.focus\:placeholder-red-600:focus::placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.focus\:placeholder-red-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.focus\:placeholder-red-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.focus\:placeholder-red-700:focus::placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.focus\:placeholder-red-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.focus\:placeholder-red-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.focus\:placeholder-red-800:focus::placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.focus\:placeholder-red-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.focus\:placeholder-red-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.focus\:placeholder-red-900:focus::placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.focus\:placeholder-orange-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.focus\:placeholder-orange-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.focus\:placeholder-orange-100:focus::placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.focus\:placeholder-orange-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.focus\:placeholder-orange-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.focus\:placeholder-orange-200:focus::placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.focus\:placeholder-orange-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.focus\:placeholder-orange-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.focus\:placeholder-orange-300:focus::placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.focus\:placeholder-orange-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.focus\:placeholder-orange-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.focus\:placeholder-orange-400:focus::placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.focus\:placeholder-orange-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.focus\:placeholder-orange-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.focus\:placeholder-orange-500:focus::placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.focus\:placeholder-orange-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.focus\:placeholder-orange-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.focus\:placeholder-orange-600:focus::placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.focus\:placeholder-orange-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.focus\:placeholder-orange-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.focus\:placeholder-orange-700:focus::placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.focus\:placeholder-orange-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.focus\:placeholder-orange-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.focus\:placeholder-orange-800:focus::placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.focus\:placeholder-orange-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.focus\:placeholder-orange-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.focus\:placeholder-orange-900:focus::placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.focus\:placeholder-yellow-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.focus\:placeholder-yellow-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.focus\:placeholder-yellow-100:focus::placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.focus\:placeholder-yellow-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.focus\:placeholder-yellow-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.focus\:placeholder-yellow-200:focus::placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.focus\:placeholder-yellow-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.focus\:placeholder-yellow-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.focus\:placeholder-yellow-300:focus::placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.focus\:placeholder-yellow-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.focus\:placeholder-yellow-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.focus\:placeholder-yellow-400:focus::placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.focus\:placeholder-yellow-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.focus\:placeholder-yellow-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.focus\:placeholder-yellow-500:focus::placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.focus\:placeholder-yellow-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.focus\:placeholder-yellow-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.focus\:placeholder-yellow-600:focus::placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.focus\:placeholder-yellow-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.focus\:placeholder-yellow-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.focus\:placeholder-yellow-700:focus::placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.focus\:placeholder-yellow-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.focus\:placeholder-yellow-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.focus\:placeholder-yellow-800:focus::placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.focus\:placeholder-yellow-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.focus\:placeholder-yellow-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.focus\:placeholder-yellow-900:focus::placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.focus\:placeholder-green-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.focus\:placeholder-green-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.focus\:placeholder-green-100:focus::placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.focus\:placeholder-green-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.focus\:placeholder-green-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.focus\:placeholder-green-200:focus::placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.focus\:placeholder-green-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.focus\:placeholder-green-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.focus\:placeholder-green-300:focus::placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.focus\:placeholder-green-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.focus\:placeholder-green-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.focus\:placeholder-green-400:focus::placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.focus\:placeholder-green-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.focus\:placeholder-green-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.focus\:placeholder-green-500:focus::placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.focus\:placeholder-green-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.focus\:placeholder-green-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.focus\:placeholder-green-600:focus::placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.focus\:placeholder-green-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.focus\:placeholder-green-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.focus\:placeholder-green-700:focus::placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.focus\:placeholder-green-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.focus\:placeholder-green-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.focus\:placeholder-green-800:focus::placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.focus\:placeholder-green-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.focus\:placeholder-green-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.focus\:placeholder-green-900:focus::placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.focus\:placeholder-teal-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.focus\:placeholder-teal-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.focus\:placeholder-teal-100:focus::placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.focus\:placeholder-teal-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.focus\:placeholder-teal-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.focus\:placeholder-teal-200:focus::placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.focus\:placeholder-teal-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.focus\:placeholder-teal-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.focus\:placeholder-teal-300:focus::placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.focus\:placeholder-teal-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.focus\:placeholder-teal-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.focus\:placeholder-teal-400:focus::placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.focus\:placeholder-teal-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.focus\:placeholder-teal-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.focus\:placeholder-teal-500:focus::placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.focus\:placeholder-teal-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.focus\:placeholder-teal-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.focus\:placeholder-teal-600:focus::placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.focus\:placeholder-teal-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.focus\:placeholder-teal-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.focus\:placeholder-teal-700:focus::placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.focus\:placeholder-teal-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.focus\:placeholder-teal-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.focus\:placeholder-teal-800:focus::placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.focus\:placeholder-teal-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.focus\:placeholder-teal-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.focus\:placeholder-teal-900:focus::placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.focus\:placeholder-blue-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.focus\:placeholder-blue-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.focus\:placeholder-blue-100:focus::placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.focus\:placeholder-blue-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.focus\:placeholder-blue-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.focus\:placeholder-blue-200:focus::placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.focus\:placeholder-blue-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.focus\:placeholder-blue-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.focus\:placeholder-blue-300:focus::placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.focus\:placeholder-blue-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.focus\:placeholder-blue-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.focus\:placeholder-blue-400:focus::placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.focus\:placeholder-blue-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.focus\:placeholder-blue-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.focus\:placeholder-blue-500:focus::placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.focus\:placeholder-blue-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.focus\:placeholder-blue-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.focus\:placeholder-blue-600:focus::placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.focus\:placeholder-blue-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.focus\:placeholder-blue-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.focus\:placeholder-blue-700:focus::placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.focus\:placeholder-blue-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.focus\:placeholder-blue-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.focus\:placeholder-blue-800:focus::placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.focus\:placeholder-blue-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.focus\:placeholder-blue-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.focus\:placeholder-blue-900:focus::placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.focus\:placeholder-indigo-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.focus\:placeholder-indigo-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.focus\:placeholder-indigo-100:focus::placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.focus\:placeholder-indigo-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.focus\:placeholder-indigo-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.focus\:placeholder-indigo-200:focus::placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.focus\:placeholder-indigo-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.focus\:placeholder-indigo-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.focus\:placeholder-indigo-300:focus::placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.focus\:placeholder-indigo-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.focus\:placeholder-indigo-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.focus\:placeholder-indigo-400:focus::placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.focus\:placeholder-indigo-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.focus\:placeholder-indigo-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.focus\:placeholder-indigo-500:focus::placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.focus\:placeholder-indigo-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.focus\:placeholder-indigo-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.focus\:placeholder-indigo-600:focus::placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.focus\:placeholder-indigo-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.focus\:placeholder-indigo-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.focus\:placeholder-indigo-700:focus::placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.focus\:placeholder-indigo-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.focus\:placeholder-indigo-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.focus\:placeholder-indigo-800:focus::placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.focus\:placeholder-indigo-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.focus\:placeholder-indigo-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.focus\:placeholder-indigo-900:focus::placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.focus\:placeholder-purple-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.focus\:placeholder-purple-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.focus\:placeholder-purple-100:focus::placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.focus\:placeholder-purple-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.focus\:placeholder-purple-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.focus\:placeholder-purple-200:focus::placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.focus\:placeholder-purple-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.focus\:placeholder-purple-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.focus\:placeholder-purple-300:focus::placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.focus\:placeholder-purple-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.focus\:placeholder-purple-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.focus\:placeholder-purple-400:focus::placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.focus\:placeholder-purple-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.focus\:placeholder-purple-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.focus\:placeholder-purple-500:focus::placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.focus\:placeholder-purple-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.focus\:placeholder-purple-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.focus\:placeholder-purple-600:focus::placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.focus\:placeholder-purple-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.focus\:placeholder-purple-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.focus\:placeholder-purple-700:focus::placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.focus\:placeholder-purple-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.focus\:placeholder-purple-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.focus\:placeholder-purple-800:focus::placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.focus\:placeholder-purple-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.focus\:placeholder-purple-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.focus\:placeholder-purple-900:focus::placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.focus\:placeholder-pink-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.focus\:placeholder-pink-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.focus\:placeholder-pink-100:focus::placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.focus\:placeholder-pink-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.focus\:placeholder-pink-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.focus\:placeholder-pink-200:focus::placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.focus\:placeholder-pink-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.focus\:placeholder-pink-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.focus\:placeholder-pink-300:focus::placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.focus\:placeholder-pink-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.focus\:placeholder-pink-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.focus\:placeholder-pink-400:focus::placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.focus\:placeholder-pink-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.focus\:placeholder-pink-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.focus\:placeholder-pink-500:focus::placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.focus\:placeholder-pink-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.focus\:placeholder-pink-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.focus\:placeholder-pink-600:focus::placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.focus\:placeholder-pink-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.focus\:placeholder-pink-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.focus\:placeholder-pink-700:focus::placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.focus\:placeholder-pink-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.focus\:placeholder-pink-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.focus\:placeholder-pink-800:focus::placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.focus\:placeholder-pink-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.focus\:placeholder-pink-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.focus\:placeholder-pink-900:focus::placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.placeholder-opacity-0:-ms-input-placeholder{--placeholder-opacity:0}.placeholder-opacity-0::-ms-input-placeholder{--placeholder-opacity:0}.placeholder-opacity-0::placeholder{--placeholder-opacity:0}.placeholder-opacity-25:-ms-input-placeholder{--placeholder-opacity:0.25}.placeholder-opacity-25::-ms-input-placeholder{--placeholder-opacity:0.25}.placeholder-opacity-25::placeholder{--placeholder-opacity:0.25}.placeholder-opacity-50:-ms-input-placeholder{--placeholder-opacity:0.5}.placeholder-opacity-50::-ms-input-placeholder{--placeholder-opacity:0.5}.placeholder-opacity-50::placeholder{--placeholder-opacity:0.5}.placeholder-opacity-75:-ms-input-placeholder{--placeholder-opacity:0.75}.placeholder-opacity-75::-ms-input-placeholder{--placeholder-opacity:0.75}.placeholder-opacity-75::placeholder{--placeholder-opacity:0.75}.placeholder-opacity-100:-ms-input-placeholder{--placeholder-opacity:1}.placeholder-opacity-100::-ms-input-placeholder{--placeholder-opacity:1}.placeholder-opacity-100::placeholder{--placeholder-opacity:1}.focus\:placeholder-opacity-0:focus:-ms-input-placeholder{--placeholder-opacity:0}.focus\:placeholder-opacity-0:focus::-ms-input-placeholder{--placeholder-opacity:0}.focus\:placeholder-opacity-0:focus::placeholder{--placeholder-opacity:0}.focus\:placeholder-opacity-25:focus:-ms-input-placeholder{--placeholder-opacity:0.25}.focus\:placeholder-opacity-25:focus::-ms-input-placeholder{--placeholder-opacity:0.25}.focus\:placeholder-opacity-25:focus::placeholder{--placeholder-opacity:0.25}.focus\:placeholder-opacity-50:focus:-ms-input-placeholder{--placeholder-opacity:0.5}.focus\:placeholder-opacity-50:focus::-ms-input-placeholder{--placeholder-opacity:0.5}.focus\:placeholder-opacity-50:focus::placeholder{--placeholder-opacity:0.5}.focus\:placeholder-opacity-75:focus:-ms-input-placeholder{--placeholder-opacity:0.75}.focus\:placeholder-opacity-75:focus::-ms-input-placeholder{--placeholder-opacity:0.75}.focus\:placeholder-opacity-75:focus::placeholder{--placeholder-opacity:0.75}.focus\:placeholder-opacity-100:focus:-ms-input-placeholder{--placeholder-opacity:1}.focus\:placeholder-opacity-100:focus::-ms-input-placeholder{--placeholder-opacity:1}.focus\:placeholder-opacity-100:focus::placeholder{--placeholder-opacity:1}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:-webkit-sticky;position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-auto{top:auto;right:auto;bottom:auto;left:auto}.inset-y-0{top:0;bottom:0}.inset-x-0{right:0;left:0}.inset-y-auto{top:auto;bottom:auto}.inset-x-auto{right:auto;left:auto}.top-0{top:0}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}.top-auto{top:auto}.right-auto{right:auto}.bottom-auto{bottom:auto}.left-auto{left:auto}.resize-none{resize:none}.resize-y{resize:vertical}.resize-x{resize:horizontal}.resize{resize:both}.shadow-xs{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.shadow-sm{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.shadow-md{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.shadow-lg{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.shadow-xl{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.shadow-2xl{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.shadow-inner{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.shadow-outline{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.shadow-none{box-shadow:none}.hover\:shadow-xs:hover{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.hover\:shadow-sm:hover{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.hover\:shadow:hover{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.hover\:shadow-md:hover{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.hover\:shadow-lg:hover{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.hover\:shadow-xl:hover{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.hover\:shadow-2xl:hover{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.hover\:shadow-inner:hover{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.hover\:shadow-outline:hover{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.hover\:shadow-none:hover{box-shadow:none}.focus\:shadow-xs:focus{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.focus\:shadow-sm:focus{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.focus\:shadow:focus{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.focus\:shadow-md:focus{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.focus\:shadow-lg:focus{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.focus\:shadow-xl:focus{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.focus\:shadow-2xl:focus{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.focus\:shadow-inner:focus{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.focus\:shadow-outline:focus{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.focus\:shadow-none:focus{box-shadow:none}.fill-current{fill:currentColor}.stroke-current{stroke:currentColor}.stroke-0{stroke-width:0}.stroke-1{stroke-width:1}.stroke-2{stroke-width:2}.table-auto{table-layout:auto}.table-fixed{table-layout:fixed}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-justify{text-align:justify}.text-transparent{color:transparent}.text-current{color:currentColor}.text-black{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.text-gray-100{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.text-gray-200{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.text-gray-300{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.text-gray-800{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.text-red-100{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.text-red-200{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.text-red-300{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.text-red-400{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.text-red-500{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.text-red-600{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.text-red-700{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.text-red-800{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.text-red-900{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.text-orange-100{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.text-orange-200{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.text-orange-300{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.text-orange-400{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.text-orange-500{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.text-orange-600{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.text-orange-700{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.text-orange-800{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.text-orange-900{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.text-yellow-100{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.text-yellow-200{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.text-yellow-300{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.text-yellow-400{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.text-yellow-500{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.text-yellow-600{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.text-yellow-700{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.text-yellow-800{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.text-yellow-900{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.text-green-100{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.text-green-200{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.text-green-300{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.text-green-400{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.text-green-500{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.text-green-600{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.text-green-700{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.text-green-800{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.text-green-900{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.text-teal-100{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.text-teal-200{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.text-teal-300{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.text-teal-400{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.text-teal-500{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.text-teal-600{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.text-teal-700{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.text-teal-800{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.text-teal-900{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.text-blue-100{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.text-blue-200{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.text-blue-300{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.text-blue-400{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.text-blue-500{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.text-blue-600{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.text-blue-700{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.text-blue-800{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.text-blue-900{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.text-indigo-100{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.text-indigo-200{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.text-indigo-300{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.text-indigo-400{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.text-indigo-500{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.text-indigo-600{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.text-indigo-700{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.text-indigo-800{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.text-indigo-900{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.text-purple-100{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.text-purple-200{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.text-purple-300{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.text-purple-400{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.text-purple-500{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.text-purple-600{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.text-purple-700{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.text-purple-800{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.text-purple-900{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.text-pink-100{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.text-pink-200{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.text-pink-300{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.text-pink-400{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.text-pink-500{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.text-pink-600{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.text-pink-700{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.text-pink-800{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.text-pink-900{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.hover\:text-transparent:hover{color:transparent}.hover\:text-current:hover{color:currentColor}.hover\:text-black:hover{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.hover\:text-white:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.hover\:text-gray-100:hover{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.hover\:text-gray-200:hover{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.hover\:text-gray-300:hover{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.hover\:text-gray-400:hover{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.hover\:text-gray-500:hover{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.hover\:text-gray-600:hover{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.hover\:text-gray-700:hover{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.hover\:text-gray-800:hover{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.hover\:text-gray-900:hover{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.hover\:text-red-100:hover{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.hover\:text-red-200:hover{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.hover\:text-red-300:hover{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.hover\:text-red-400:hover{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.hover\:text-red-500:hover{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.hover\:text-red-600:hover{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.hover\:text-red-700:hover{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.hover\:text-red-800:hover{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.hover\:text-red-900:hover{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.hover\:text-orange-100:hover{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.hover\:text-orange-200:hover{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.hover\:text-orange-300:hover{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.hover\:text-orange-400:hover{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.hover\:text-orange-500:hover{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.hover\:text-orange-600:hover{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.hover\:text-orange-700:hover{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.hover\:text-orange-800:hover{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.hover\:text-orange-900:hover{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.hover\:text-yellow-100:hover{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.hover\:text-yellow-200:hover{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.hover\:text-yellow-300:hover{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.hover\:text-yellow-400:hover{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.hover\:text-yellow-500:hover{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.hover\:text-yellow-600:hover{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.hover\:text-yellow-700:hover{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.hover\:text-yellow-800:hover{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.hover\:text-yellow-900:hover{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.hover\:text-green-100:hover{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.hover\:text-green-200:hover{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.hover\:text-green-300:hover{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.hover\:text-green-400:hover{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.hover\:text-green-500:hover{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.hover\:text-green-600:hover{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.hover\:text-green-700:hover{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.hover\:text-green-800:hover{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.hover\:text-green-900:hover{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.hover\:text-teal-100:hover{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.hover\:text-teal-200:hover{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.hover\:text-teal-300:hover{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.hover\:text-teal-400:hover{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.hover\:text-teal-500:hover{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.hover\:text-teal-600:hover{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.hover\:text-teal-700:hover{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.hover\:text-teal-800:hover{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.hover\:text-teal-900:hover{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.hover\:text-blue-100:hover{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.hover\:text-blue-200:hover{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.hover\:text-blue-300:hover{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.hover\:text-blue-400:hover{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.hover\:text-blue-500:hover{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.hover\:text-blue-600:hover{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.hover\:text-blue-700:hover{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.hover\:text-blue-800:hover{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.hover\:text-blue-900:hover{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.hover\:text-indigo-100:hover{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.hover\:text-indigo-200:hover{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.hover\:text-indigo-300:hover{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.hover\:text-indigo-400:hover{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.hover\:text-indigo-500:hover{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.hover\:text-indigo-600:hover{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.hover\:text-indigo-700:hover{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.hover\:text-indigo-800:hover{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.hover\:text-indigo-900:hover{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.hover\:text-purple-100:hover{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.hover\:text-purple-200:hover{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.hover\:text-purple-300:hover{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.hover\:text-purple-400:hover{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.hover\:text-purple-500:hover{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.hover\:text-purple-600:hover{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.hover\:text-purple-700:hover{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.hover\:text-purple-800:hover{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.hover\:text-purple-900:hover{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.hover\:text-pink-100:hover{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.hover\:text-pink-200:hover{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.hover\:text-pink-300:hover{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.hover\:text-pink-400:hover{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.hover\:text-pink-500:hover{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.hover\:text-pink-600:hover{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.hover\:text-pink-700:hover{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.hover\:text-pink-800:hover{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.hover\:text-pink-900:hover{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.focus\:text-transparent:focus{color:transparent}.focus\:text-current:focus{color:currentColor}.focus\:text-black:focus{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.focus\:text-white:focus{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.focus\:text-gray-100:focus{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.focus\:text-gray-200:focus{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.focus\:text-gray-300:focus{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.focus\:text-gray-400:focus{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.focus\:text-gray-500:focus{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.focus\:text-gray-600:focus{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.focus\:text-gray-700:focus{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.focus\:text-gray-800:focus{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.focus\:text-gray-900:focus{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.focus\:text-red-100:focus{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.focus\:text-red-200:focus{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.focus\:text-red-300:focus{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.focus\:text-red-400:focus{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.focus\:text-red-500:focus{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.focus\:text-red-600:focus{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.focus\:text-red-700:focus{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.focus\:text-red-800:focus{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.focus\:text-red-900:focus{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.focus\:text-orange-100:focus{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.focus\:text-orange-200:focus{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.focus\:text-orange-300:focus{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.focus\:text-orange-400:focus{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.focus\:text-orange-500:focus{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.focus\:text-orange-600:focus{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.focus\:text-orange-700:focus{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.focus\:text-orange-800:focus{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.focus\:text-orange-900:focus{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.focus\:text-yellow-100:focus{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.focus\:text-yellow-200:focus{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.focus\:text-yellow-300:focus{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.focus\:text-yellow-400:focus{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.focus\:text-yellow-500:focus{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.focus\:text-yellow-600:focus{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.focus\:text-yellow-700:focus{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.focus\:text-yellow-800:focus{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.focus\:text-yellow-900:focus{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.focus\:text-green-100:focus{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.focus\:text-green-200:focus{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.focus\:text-green-300:focus{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.focus\:text-green-400:focus{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.focus\:text-green-500:focus{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.focus\:text-green-600:focus{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.focus\:text-green-700:focus{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.focus\:text-green-800:focus{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.focus\:text-green-900:focus{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.focus\:text-teal-100:focus{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.focus\:text-teal-200:focus{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.focus\:text-teal-300:focus{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.focus\:text-teal-400:focus{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.focus\:text-teal-500:focus{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.focus\:text-teal-600:focus{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.focus\:text-teal-700:focus{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.focus\:text-teal-800:focus{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.focus\:text-teal-900:focus{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.focus\:text-blue-100:focus{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.focus\:text-blue-200:focus{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.focus\:text-blue-300:focus{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.focus\:text-blue-400:focus{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.focus\:text-blue-500:focus{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.focus\:text-blue-600:focus{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.focus\:text-blue-700:focus{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.focus\:text-blue-800:focus{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.focus\:text-blue-900:focus{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.focus\:text-indigo-100:focus{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.focus\:text-indigo-200:focus{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.focus\:text-indigo-300:focus{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.focus\:text-indigo-400:focus{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.focus\:text-indigo-500:focus{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.focus\:text-indigo-600:focus{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.focus\:text-indigo-700:focus{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.focus\:text-indigo-800:focus{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.focus\:text-indigo-900:focus{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.focus\:text-purple-100:focus{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.focus\:text-purple-200:focus{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.focus\:text-purple-300:focus{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.focus\:text-purple-400:focus{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.focus\:text-purple-500:focus{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.focus\:text-purple-600:focus{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.focus\:text-purple-700:focus{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.focus\:text-purple-800:focus{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.focus\:text-purple-900:focus{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.focus\:text-pink-100:focus{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.focus\:text-pink-200:focus{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.focus\:text-pink-300:focus{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.focus\:text-pink-400:focus{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.focus\:text-pink-500:focus{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.focus\:text-pink-600:focus{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.focus\:text-pink-700:focus{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.focus\:text-pink-800:focus{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.focus\:text-pink-900:focus{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.text-opacity-0{--text-opacity:0}.text-opacity-25{--text-opacity:0.25}.text-opacity-50{--text-opacity:0.5}.text-opacity-75{--text-opacity:0.75}.text-opacity-100{--text-opacity:1}.hover\:text-opacity-0:hover{--text-opacity:0}.hover\:text-opacity-25:hover{--text-opacity:0.25}.hover\:text-opacity-50:hover{--text-opacity:0.5}.hover\:text-opacity-75:hover{--text-opacity:0.75}.hover\:text-opacity-100:hover{--text-opacity:1}.focus\:text-opacity-0:focus{--text-opacity:0}.focus\:text-opacity-25:focus{--text-opacity:0.25}.focus\:text-opacity-50:focus{--text-opacity:0.5}.focus\:text-opacity-75:focus{--text-opacity:0.75}.focus\:text-opacity-100:focus{--text-opacity:1}.italic{font-style:italic}.not-italic{font-style:normal}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.underline{text-decoration:underline}.line-through{text-decoration:line-through}.no-underline{text-decoration:none}.hover\:underline:hover{text-decoration:underline}.hover\:line-through:hover{text-decoration:line-through}.hover\:no-underline:hover{text-decoration:none}.focus\:underline:focus{text-decoration:underline}.focus\:line-through:focus{text-decoration:line-through}.focus\:no-underline:focus{text-decoration:none}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.diagonal-fractions,.lining-nums,.oldstyle-nums,.ordinal,.proportional-nums,.slashed-zero,.stacked-fractions,.tabular-nums{--font-variant-numeric-ordinal:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-slashed-zero:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-figure:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-spacing:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-fraction:var(--tailwind-empty, );/*!*//*!*/font-variant-numeric:var(--font-variant-numeric-ordinal) var(--font-variant-numeric-slashed-zero) var(--font-variant-numeric-figure) var(--font-variant-numeric-spacing) var(--font-variant-numeric-fraction)}.normal-nums{font-variant-numeric:normal}.ordinal{--font-variant-numeric-ordinal:ordinal}.slashed-zero{--font-variant-numeric-slashed-zero:slashed-zero}.lining-nums{--font-variant-numeric-figure:lining-nums}.oldstyle-nums{--font-variant-numeric-figure:oldstyle-nums}.proportional-nums{--font-variant-numeric-spacing:proportional-nums}.tabular-nums{--font-variant-numeric-spacing:tabular-nums}.diagonal-fractions{--font-variant-numeric-fraction:diagonal-fractions}.stacked-fractions{--font-variant-numeric-fraction:stacked-fractions}.tracking-tighter{letter-spacing:-.05em}.tracking-tight{letter-spacing:-.025em}.tracking-normal{letter-spacing:0}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.select-none{-webkit-user-select:none;-ms-user-select:none;user-select:none}.select-text{-webkit-user-select:text;-ms-user-select:text;user-select:text}.select-all{-webkit-user-select:all;-ms-user-select:all;user-select:all}.select-auto{-webkit-user-select:auto;-ms-user-select:auto;user-select:auto}.align-baseline{vertical-align:baseline}.align-top{vertical-align:top}.align-middle{vertical-align:middle}.align-bottom{vertical-align:bottom}.align-text-top{vertical-align:text-top}.align-text-bottom{vertical-align:text-bottom}.visible{visibility:visible}.invisible{visibility:hidden}.whitespace-normal{white-space:normal}.whitespace-no-wrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-normal{word-wrap:normal;overflow-wrap:normal;word-break:normal}.break-words{word-wrap:break-word;overflow-wrap:break-word}.break-all{word-break:break-all}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.w-0{width:0}.w-1{width:.25rem}.w-2{width:.5rem}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-20{width:5rem}.w-24{width:6rem}.w-32{width:8rem}.w-40{width:10rem}.w-48{width:12rem}.w-56{width:14rem}.w-64{width:16rem}.w-auto{width:auto}.w-px{width:1px}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-2\/3{width:66.666667%}.w-1\/4{width:25%}.w-2\/4{width:50%}.w-3\/4{width:75%}.w-1\/5{width:20%}.w-2\/5{width:40%}.w-3\/5{width:60%}.w-4\/5{width:80%}.w-1\/6{width:16.666667%}.w-2\/6{width:33.333333%}.w-3\/6{width:50%}.w-4\/6{width:66.666667%}.w-5\/6{width:83.333333%}.w-1\/12{width:8.333333%}.w-2\/12{width:16.666667%}.w-3\/12{width:25%}.w-4\/12{width:33.333333%}.w-5\/12{width:41.666667%}.w-6\/12{width:50%}.w-7\/12{width:58.333333%}.w-8\/12{width:66.666667%}.w-9\/12{width:75%}.w-10\/12{width:83.333333%}.w-11\/12{width:91.666667%}.w-full{width:100%}.w-screen{width:100vw}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-auto{z-index:auto}.gap-0{grid-gap:0;gap:0}.gap-1{grid-gap:.25rem;gap:.25rem}.gap-2{grid-gap:.5rem;gap:.5rem}.gap-3{grid-gap:.75rem;gap:.75rem}.gap-4{grid-gap:1rem;gap:1rem}.gap-5{grid-gap:1.25rem;gap:1.25rem}.gap-6{grid-gap:1.5rem;gap:1.5rem}.gap-8{grid-gap:2rem;gap:2rem}.gap-10{grid-gap:2.5rem;gap:2.5rem}.gap-12{grid-gap:3rem;gap:3rem}.gap-16{grid-gap:4rem;gap:4rem}.gap-20{grid-gap:5rem;gap:5rem}.gap-24{grid-gap:6rem;gap:6rem}.gap-32{grid-gap:8rem;gap:8rem}.gap-40{grid-gap:10rem;gap:10rem}.gap-48{grid-gap:12rem;gap:12rem}.gap-56{grid-gap:14rem;gap:14rem}.gap-64{grid-gap:16rem;gap:16rem}.gap-px{grid-gap:1px;gap:1px}.col-gap-0{grid-column-gap:0;column-gap:0}.col-gap-1{grid-column-gap:.25rem;column-gap:.25rem}.col-gap-2{grid-column-gap:.5rem;column-gap:.5rem}.col-gap-3{grid-column-gap:.75rem;column-gap:.75rem}.col-gap-4{grid-column-gap:1rem;column-gap:1rem}.col-gap-5{grid-column-gap:1.25rem;column-gap:1.25rem}.col-gap-6{grid-column-gap:1.5rem;column-gap:1.5rem}.col-gap-8{grid-column-gap:2rem;column-gap:2rem}.col-gap-10{grid-column-gap:2.5rem;column-gap:2.5rem}.col-gap-12{grid-column-gap:3rem;column-gap:3rem}.col-gap-16{grid-column-gap:4rem;column-gap:4rem}.col-gap-20{grid-column-gap:5rem;column-gap:5rem}.col-gap-24{grid-column-gap:6rem;column-gap:6rem}.col-gap-32{grid-column-gap:8rem;column-gap:8rem}.col-gap-40{grid-column-gap:10rem;column-gap:10rem}.col-gap-48{grid-column-gap:12rem;column-gap:12rem}.col-gap-56{grid-column-gap:14rem;column-gap:14rem}.col-gap-64{grid-column-gap:16rem;column-gap:16rem}.col-gap-px{grid-column-gap:1px;column-gap:1px}.gap-x-0{grid-column-gap:0;column-gap:0}.gap-x-1{grid-column-gap:.25rem;column-gap:.25rem}.gap-x-2{grid-column-gap:.5rem;column-gap:.5rem}.gap-x-3{grid-column-gap:.75rem;column-gap:.75rem}.gap-x-4{grid-column-gap:1rem;column-gap:1rem}.gap-x-5{grid-column-gap:1.25rem;column-gap:1.25rem}.gap-x-6{grid-column-gap:1.5rem;column-gap:1.5rem}.gap-x-8{grid-column-gap:2rem;column-gap:2rem}.gap-x-10{grid-column-gap:2.5rem;column-gap:2.5rem}.gap-x-12{grid-column-gap:3rem;column-gap:3rem}.gap-x-16{grid-column-gap:4rem;column-gap:4rem}.gap-x-20{grid-column-gap:5rem;column-gap:5rem}.gap-x-24{grid-column-gap:6rem;column-gap:6rem}.gap-x-32{grid-column-gap:8rem;column-gap:8rem}.gap-x-40{grid-column-gap:10rem;column-gap:10rem}.gap-x-48{grid-column-gap:12rem;column-gap:12rem}.gap-x-56{grid-column-gap:14rem;column-gap:14rem}.gap-x-64{grid-column-gap:16rem;column-gap:16rem}.gap-x-px{grid-column-gap:1px;column-gap:1px}.row-gap-0{grid-row-gap:0;row-gap:0}.row-gap-1{grid-row-gap:.25rem;row-gap:.25rem}.row-gap-2{grid-row-gap:.5rem;row-gap:.5rem}.row-gap-3{grid-row-gap:.75rem;row-gap:.75rem}.row-gap-4{grid-row-gap:1rem;row-gap:1rem}.row-gap-5{grid-row-gap:1.25rem;row-gap:1.25rem}.row-gap-6{grid-row-gap:1.5rem;row-gap:1.5rem}.row-gap-8{grid-row-gap:2rem;row-gap:2rem}.row-gap-10{grid-row-gap:2.5rem;row-gap:2.5rem}.row-gap-12{grid-row-gap:3rem;row-gap:3rem}.row-gap-16{grid-row-gap:4rem;row-gap:4rem}.row-gap-20{grid-row-gap:5rem;row-gap:5rem}.row-gap-24{grid-row-gap:6rem;row-gap:6rem}.row-gap-32{grid-row-gap:8rem;row-gap:8rem}.row-gap-40{grid-row-gap:10rem;row-gap:10rem}.row-gap-48{grid-row-gap:12rem;row-gap:12rem}.row-gap-56{grid-row-gap:14rem;row-gap:14rem}.row-gap-64{grid-row-gap:16rem;row-gap:16rem}.row-gap-px{grid-row-gap:1px;row-gap:1px}.gap-y-0{grid-row-gap:0;row-gap:0}.gap-y-1{grid-row-gap:.25rem;row-gap:.25rem}.gap-y-2{grid-row-gap:.5rem;row-gap:.5rem}.gap-y-3{grid-row-gap:.75rem;row-gap:.75rem}.gap-y-4{grid-row-gap:1rem;row-gap:1rem}.gap-y-5{grid-row-gap:1.25rem;row-gap:1.25rem}.gap-y-6{grid-row-gap:1.5rem;row-gap:1.5rem}.gap-y-8{grid-row-gap:2rem;row-gap:2rem}.gap-y-10{grid-row-gap:2.5rem;row-gap:2.5rem}.gap-y-12{grid-row-gap:3rem;row-gap:3rem}.gap-y-16{grid-row-gap:4rem;row-gap:4rem}.gap-y-20{grid-row-gap:5rem;row-gap:5rem}.gap-y-24{grid-row-gap:6rem;row-gap:6rem}.gap-y-32{grid-row-gap:8rem;row-gap:8rem}.gap-y-40{grid-row-gap:10rem;row-gap:10rem}.gap-y-48{grid-row-gap:12rem;row-gap:12rem}.gap-y-56{grid-row-gap:14rem;row-gap:14rem}.gap-y-64{grid-row-gap:16rem;row-gap:16rem}.gap-y-px{grid-row-gap:1px;row-gap:1px}.grid-flow-row{grid-auto-flow:row}.grid-flow-col{grid-auto-flow:column}.grid-flow-row-dense{grid-auto-flow:row dense}.grid-flow-col-dense{grid-auto-flow:column dense}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-none{grid-template-columns:none}.auto-cols-auto{grid-auto-columns:auto}.auto-cols-min{grid-auto-columns:-webkit-min-content;grid-auto-columns:min-content}.auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.col-auto{grid-column:auto}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-4{grid-column:span 4/span 4}.col-span-5{grid-column:span 5/span 5}.col-span-6{grid-column:span 6/span 6}.col-span-7{grid-column:span 7/span 7}.col-span-8{grid-column:span 8/span 8}.col-span-9{grid-column:span 9/span 9}.col-span-10{grid-column:span 10/span 10}.col-span-11{grid-column:span 11/span 11}.col-span-12{grid-column:span 12/span 12}.col-span-full{grid-column:1/-1}.col-start-1{grid-column-start:1}.col-start-2{grid-column-start:2}.col-start-3{grid-column-start:3}.col-start-4{grid-column-start:4}.col-start-5{grid-column-start:5}.col-start-6{grid-column-start:6}.col-start-7{grid-column-start:7}.col-start-8{grid-column-start:8}.col-start-9{grid-column-start:9}.col-start-10{grid-column-start:10}.col-start-11{grid-column-start:11}.col-start-12{grid-column-start:12}.col-start-13{grid-column-start:13}.col-start-auto{grid-column-start:auto}.col-end-1{grid-column-end:1}.col-end-2{grid-column-end:2}.col-end-3{grid-column-end:3}.col-end-4{grid-column-end:4}.col-end-5{grid-column-end:5}.col-end-6{grid-column-end:6}.col-end-7{grid-column-end:7}.col-end-8{grid-column-end:8}.col-end-9{grid-column-end:9}.col-end-10{grid-column-end:10}.col-end-11{grid-column-end:11}.col-end-12{grid-column-end:12}.col-end-13{grid-column-end:13}.col-end-auto{grid-column-end:auto}.grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.grid-rows-none{grid-template-rows:none}.auto-rows-auto{grid-auto-rows:auto}.auto-rows-min{grid-auto-rows:-webkit-min-content;grid-auto-rows:min-content}.auto-rows-max{grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}.auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.row-auto{grid-row:auto}.row-span-1{grid-row:span 1/span 1}.row-span-2{grid-row:span 2/span 2}.row-span-3{grid-row:span 3/span 3}.row-span-4{grid-row:span 4/span 4}.row-span-5{grid-row:span 5/span 5}.row-span-6{grid-row:span 6/span 6}.row-span-full{grid-row:1/-1}.row-start-1{grid-row-start:1}.row-start-2{grid-row-start:2}.row-start-3{grid-row-start:3}.row-start-4{grid-row-start:4}.row-start-5{grid-row-start:5}.row-start-6{grid-row-start:6}.row-start-7{grid-row-start:7}.row-start-auto{grid-row-start:auto}.row-end-1{grid-row-end:1}.row-end-2{grid-row-end:2}.row-end-3{grid-row-end:3}.row-end-4{grid-row-end:4}.row-end-5{grid-row-end:5}.row-end-6{grid-row-end:6}.row-end-7{grid-row-end:7}.row-end-auto{grid-row-end:auto}.transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.transform-none{transform:none}.origin-center{transform-origin:center}.origin-top{transform-origin:top}.origin-top-right{transform-origin:top right}.origin-right{transform-origin:right}.origin-bottom-right{transform-origin:bottom right}.origin-bottom{transform-origin:bottom}.origin-bottom-left{transform-origin:bottom left}.origin-left{transform-origin:left}.origin-top-left{transform-origin:top left}.scale-0{--transform-scale-x:0;--transform-scale-y:0}.scale-50{--transform-scale-x:.5;--transform-scale-y:.5}.scale-75{--transform-scale-x:.75;--transform-scale-y:.75}.scale-90{--transform-scale-x:.9;--transform-scale-y:.9}.scale-95{--transform-scale-x:.95;--transform-scale-y:.95}.scale-100{--transform-scale-x:1;--transform-scale-y:1}.scale-105{--transform-scale-x:1.05;--transform-scale-y:1.05}.scale-110{--transform-scale-x:1.1;--transform-scale-y:1.1}.scale-125{--transform-scale-x:1.25;--transform-scale-y:1.25}.scale-150{--transform-scale-x:1.5;--transform-scale-y:1.5}.scale-x-0{--transform-scale-x:0}.scale-x-50{--transform-scale-x:.5}.scale-x-75{--transform-scale-x:.75}.scale-x-90{--transform-scale-x:.9}.scale-x-95{--transform-scale-x:.95}.scale-x-100{--transform-scale-x:1}.scale-x-105{--transform-scale-x:1.05}.scale-x-110{--transform-scale-x:1.1}.scale-x-125{--transform-scale-x:1.25}.scale-x-150{--transform-scale-x:1.5}.scale-y-0{--transform-scale-y:0}.scale-y-50{--transform-scale-y:.5}.scale-y-75{--transform-scale-y:.75}.scale-y-90{--transform-scale-y:.9}.scale-y-95{--transform-scale-y:.95}.scale-y-100{--transform-scale-y:1}.scale-y-105{--transform-scale-y:1.05}.scale-y-110{--transform-scale-y:1.1}.scale-y-125{--transform-scale-y:1.25}.scale-y-150{--transform-scale-y:1.5}.hover\:scale-0:hover{--transform-scale-x:0;--transform-scale-y:0}.hover\:scale-50:hover{--transform-scale-x:.5;--transform-scale-y:.5}.hover\:scale-75:hover{--transform-scale-x:.75;--transform-scale-y:.75}.hover\:scale-90:hover{--transform-scale-x:.9;--transform-scale-y:.9}.hover\:scale-95:hover{--transform-scale-x:.95;--transform-scale-y:.95}.hover\:scale-100:hover{--transform-scale-x:1;--transform-scale-y:1}.hover\:scale-105:hover{--transform-scale-x:1.05;--transform-scale-y:1.05}.hover\:scale-110:hover{--transform-scale-x:1.1;--transform-scale-y:1.1}.hover\:scale-125:hover{--transform-scale-x:1.25;--transform-scale-y:1.25}.hover\:scale-150:hover{--transform-scale-x:1.5;--transform-scale-y:1.5}.hover\:scale-x-0:hover{--transform-scale-x:0}.hover\:scale-x-50:hover{--transform-scale-x:.5}.hover\:scale-x-75:hover{--transform-scale-x:.75}.hover\:scale-x-90:hover{--transform-scale-x:.9}.hover\:scale-x-95:hover{--transform-scale-x:.95}.hover\:scale-x-100:hover{--transform-scale-x:1}.hover\:scale-x-105:hover{--transform-scale-x:1.05}.hover\:scale-x-110:hover{--transform-scale-x:1.1}.hover\:scale-x-125:hover{--transform-scale-x:1.25}.hover\:scale-x-150:hover{--transform-scale-x:1.5}.hover\:scale-y-0:hover{--transform-scale-y:0}.hover\:scale-y-50:hover{--transform-scale-y:.5}.hover\:scale-y-75:hover{--transform-scale-y:.75}.hover\:scale-y-90:hover{--transform-scale-y:.9}.hover\:scale-y-95:hover{--transform-scale-y:.95}.hover\:scale-y-100:hover{--transform-scale-y:1}.hover\:scale-y-105:hover{--transform-scale-y:1.05}.hover\:scale-y-110:hover{--transform-scale-y:1.1}.hover\:scale-y-125:hover{--transform-scale-y:1.25}.hover\:scale-y-150:hover{--transform-scale-y:1.5}.focus\:scale-0:focus{--transform-scale-x:0;--transform-scale-y:0}.focus\:scale-50:focus{--transform-scale-x:.5;--transform-scale-y:.5}.focus\:scale-75:focus{--transform-scale-x:.75;--transform-scale-y:.75}.focus\:scale-90:focus{--transform-scale-x:.9;--transform-scale-y:.9}.focus\:scale-95:focus{--transform-scale-x:.95;--transform-scale-y:.95}.focus\:scale-100:focus{--transform-scale-x:1;--transform-scale-y:1}.focus\:scale-105:focus{--transform-scale-x:1.05;--transform-scale-y:1.05}.focus\:scale-110:focus{--transform-scale-x:1.1;--transform-scale-y:1.1}.focus\:scale-125:focus{--transform-scale-x:1.25;--transform-scale-y:1.25}.focus\:scale-150:focus{--transform-scale-x:1.5;--transform-scale-y:1.5}.focus\:scale-x-0:focus{--transform-scale-x:0}.focus\:scale-x-50:focus{--transform-scale-x:.5}.focus\:scale-x-75:focus{--transform-scale-x:.75}.focus\:scale-x-90:focus{--transform-scale-x:.9}.focus\:scale-x-95:focus{--transform-scale-x:.95}.focus\:scale-x-100:focus{--transform-scale-x:1}.focus\:scale-x-105:focus{--transform-scale-x:1.05}.focus\:scale-x-110:focus{--transform-scale-x:1.1}.focus\:scale-x-125:focus{--transform-scale-x:1.25}.focus\:scale-x-150:focus{--transform-scale-x:1.5}.focus\:scale-y-0:focus{--transform-scale-y:0}.focus\:scale-y-50:focus{--transform-scale-y:.5}.focus\:scale-y-75:focus{--transform-scale-y:.75}.focus\:scale-y-90:focus{--transform-scale-y:.9}.focus\:scale-y-95:focus{--transform-scale-y:.95}.focus\:scale-y-100:focus{--transform-scale-y:1}.focus\:scale-y-105:focus{--transform-scale-y:1.05}.focus\:scale-y-110:focus{--transform-scale-y:1.1}.focus\:scale-y-125:focus{--transform-scale-y:1.25}.focus\:scale-y-150:focus{--transform-scale-y:1.5}.rotate-0{--transform-rotate:0}.rotate-1{--transform-rotate:1deg}.rotate-2{--transform-rotate:2deg}.rotate-3{--transform-rotate:3deg}.rotate-6{--transform-rotate:6deg}.rotate-12{--transform-rotate:12deg}.rotate-45{--transform-rotate:45deg}.rotate-90{--transform-rotate:90deg}.rotate-180{--transform-rotate:180deg}.-rotate-180{--transform-rotate:-180deg}.-rotate-90{--transform-rotate:-90deg}.-rotate-45{--transform-rotate:-45deg}.-rotate-12{--transform-rotate:-12deg}.-rotate-6{--transform-rotate:-6deg}.-rotate-3{--transform-rotate:-3deg}.-rotate-2{--transform-rotate:-2deg}.-rotate-1{--transform-rotate:-1deg}.hover\:rotate-0:hover{--transform-rotate:0}.hover\:rotate-1:hover{--transform-rotate:1deg}.hover\:rotate-2:hover{--transform-rotate:2deg}.hover\:rotate-3:hover{--transform-rotate:3deg}.hover\:rotate-6:hover{--transform-rotate:6deg}.hover\:rotate-12:hover{--transform-rotate:12deg}.hover\:rotate-45:hover{--transform-rotate:45deg}.hover\:rotate-90:hover{--transform-rotate:90deg}.hover\:rotate-180:hover{--transform-rotate:180deg}.hover\:-rotate-180:hover{--transform-rotate:-180deg}.hover\:-rotate-90:hover{--transform-rotate:-90deg}.hover\:-rotate-45:hover{--transform-rotate:-45deg}.hover\:-rotate-12:hover{--transform-rotate:-12deg}.hover\:-rotate-6:hover{--transform-rotate:-6deg}.hover\:-rotate-3:hover{--transform-rotate:-3deg}.hover\:-rotate-2:hover{--transform-rotate:-2deg}.hover\:-rotate-1:hover{--transform-rotate:-1deg}.focus\:rotate-0:focus{--transform-rotate:0}.focus\:rotate-1:focus{--transform-rotate:1deg}.focus\:rotate-2:focus{--transform-rotate:2deg}.focus\:rotate-3:focus{--transform-rotate:3deg}.focus\:rotate-6:focus{--transform-rotate:6deg}.focus\:rotate-12:focus{--transform-rotate:12deg}.focus\:rotate-45:focus{--transform-rotate:45deg}.focus\:rotate-90:focus{--transform-rotate:90deg}.focus\:rotate-180:focus{--transform-rotate:180deg}.focus\:-rotate-180:focus{--transform-rotate:-180deg}.focus\:-rotate-90:focus{--transform-rotate:-90deg}.focus\:-rotate-45:focus{--transform-rotate:-45deg}.focus\:-rotate-12:focus{--transform-rotate:-12deg}.focus\:-rotate-6:focus{--transform-rotate:-6deg}.focus\:-rotate-3:focus{--transform-rotate:-3deg}.focus\:-rotate-2:focus{--transform-rotate:-2deg}.focus\:-rotate-1:focus{--transform-rotate:-1deg}.translate-x-0{--transform-translate-x:0}.translate-x-1{--transform-translate-x:0.25rem}.translate-x-2{--transform-translate-x:0.5rem}.translate-x-3{--transform-translate-x:0.75rem}.translate-x-4{--transform-translate-x:1rem}.translate-x-5{--transform-translate-x:1.25rem}.translate-x-6{--transform-translate-x:1.5rem}.translate-x-8{--transform-translate-x:2rem}.translate-x-10{--transform-translate-x:2.5rem}.translate-x-12{--transform-translate-x:3rem}.translate-x-16{--transform-translate-x:4rem}.translate-x-20{--transform-translate-x:5rem}.translate-x-24{--transform-translate-x:6rem}.translate-x-32{--transform-translate-x:8rem}.translate-x-40{--transform-translate-x:10rem}.translate-x-48{--transform-translate-x:12rem}.translate-x-56{--transform-translate-x:14rem}.translate-x-64{--transform-translate-x:16rem}.translate-x-px{--transform-translate-x:1px}.-translate-x-1{--transform-translate-x:-0.25rem}.-translate-x-2{--transform-translate-x:-0.5rem}.-translate-x-3{--transform-translate-x:-0.75rem}.-translate-x-4{--transform-translate-x:-1rem}.-translate-x-5{--transform-translate-x:-1.25rem}.-translate-x-6{--transform-translate-x:-1.5rem}.-translate-x-8{--transform-translate-x:-2rem}.-translate-x-10{--transform-translate-x:-2.5rem}.-translate-x-12{--transform-translate-x:-3rem}.-translate-x-16{--transform-translate-x:-4rem}.-translate-x-20{--transform-translate-x:-5rem}.-translate-x-24{--transform-translate-x:-6rem}.-translate-x-32{--transform-translate-x:-8rem}.-translate-x-40{--transform-translate-x:-10rem}.-translate-x-48{--transform-translate-x:-12rem}.-translate-x-56{--transform-translate-x:-14rem}.-translate-x-64{--transform-translate-x:-16rem}.-translate-x-px{--transform-translate-x:-1px}.-translate-x-full{--transform-translate-x:-100%}.-translate-x-1\/2{--transform-translate-x:-50%}.translate-x-1\/2{--transform-translate-x:50%}.translate-x-full{--transform-translate-x:100%}.translate-y-0{--transform-translate-y:0}.translate-y-1{--transform-translate-y:0.25rem}.translate-y-2{--transform-translate-y:0.5rem}.translate-y-3{--transform-translate-y:0.75rem}.translate-y-4{--transform-translate-y:1rem}.translate-y-5{--transform-translate-y:1.25rem}.translate-y-6{--transform-translate-y:1.5rem}.translate-y-8{--transform-translate-y:2rem}.translate-y-10{--transform-translate-y:2.5rem}.translate-y-12{--transform-translate-y:3rem}.translate-y-16{--transform-translate-y:4rem}.translate-y-20{--transform-translate-y:5rem}.translate-y-24{--transform-translate-y:6rem}.translate-y-32{--transform-translate-y:8rem}.translate-y-40{--transform-translate-y:10rem}.translate-y-48{--transform-translate-y:12rem}.translate-y-56{--transform-translate-y:14rem}.translate-y-64{--transform-translate-y:16rem}.translate-y-px{--transform-translate-y:1px}.-translate-y-1{--transform-translate-y:-0.25rem}.-translate-y-2{--transform-translate-y:-0.5rem}.-translate-y-3{--transform-translate-y:-0.75rem}.-translate-y-4{--transform-translate-y:-1rem}.-translate-y-5{--transform-translate-y:-1.25rem}.-translate-y-6{--transform-translate-y:-1.5rem}.-translate-y-8{--transform-translate-y:-2rem}.-translate-y-10{--transform-translate-y:-2.5rem}.-translate-y-12{--transform-translate-y:-3rem}.-translate-y-16{--transform-translate-y:-4rem}.-translate-y-20{--transform-translate-y:-5rem}.-translate-y-24{--transform-translate-y:-6rem}.-translate-y-32{--transform-translate-y:-8rem}.-translate-y-40{--transform-translate-y:-10rem}.-translate-y-48{--transform-translate-y:-12rem}.-translate-y-56{--transform-translate-y:-14rem}.-translate-y-64{--transform-translate-y:-16rem}.-translate-y-px{--transform-translate-y:-1px}.-translate-y-full{--transform-translate-y:-100%}.-translate-y-1\/2{--transform-translate-y:-50%}.translate-y-1\/2{--transform-translate-y:50%}.translate-y-full{--transform-translate-y:100%}.hover\:translate-x-0:hover{--transform-translate-x:0}.hover\:translate-x-1:hover{--transform-translate-x:0.25rem}.hover\:translate-x-2:hover{--transform-translate-x:0.5rem}.hover\:translate-x-3:hover{--transform-translate-x:0.75rem}.hover\:translate-x-4:hover{--transform-translate-x:1rem}.hover\:translate-x-5:hover{--transform-translate-x:1.25rem}.hover\:translate-x-6:hover{--transform-translate-x:1.5rem}.hover\:translate-x-8:hover{--transform-translate-x:2rem}.hover\:translate-x-10:hover{--transform-translate-x:2.5rem}.hover\:translate-x-12:hover{--transform-translate-x:3rem}.hover\:translate-x-16:hover{--transform-translate-x:4rem}.hover\:translate-x-20:hover{--transform-translate-x:5rem}.hover\:translate-x-24:hover{--transform-translate-x:6rem}.hover\:translate-x-32:hover{--transform-translate-x:8rem}.hover\:translate-x-40:hover{--transform-translate-x:10rem}.hover\:translate-x-48:hover{--transform-translate-x:12rem}.hover\:translate-x-56:hover{--transform-translate-x:14rem}.hover\:translate-x-64:hover{--transform-translate-x:16rem}.hover\:translate-x-px:hover{--transform-translate-x:1px}.hover\:-translate-x-1:hover{--transform-translate-x:-0.25rem}.hover\:-translate-x-2:hover{--transform-translate-x:-0.5rem}.hover\:-translate-x-3:hover{--transform-translate-x:-0.75rem}.hover\:-translate-x-4:hover{--transform-translate-x:-1rem}.hover\:-translate-x-5:hover{--transform-translate-x:-1.25rem}.hover\:-translate-x-6:hover{--transform-translate-x:-1.5rem}.hover\:-translate-x-8:hover{--transform-translate-x:-2rem}.hover\:-translate-x-10:hover{--transform-translate-x:-2.5rem}.hover\:-translate-x-12:hover{--transform-translate-x:-3rem}.hover\:-translate-x-16:hover{--transform-translate-x:-4rem}.hover\:-translate-x-20:hover{--transform-translate-x:-5rem}.hover\:-translate-x-24:hover{--transform-translate-x:-6rem}.hover\:-translate-x-32:hover{--transform-translate-x:-8rem}.hover\:-translate-x-40:hover{--transform-translate-x:-10rem}.hover\:-translate-x-48:hover{--transform-translate-x:-12rem}.hover\:-translate-x-56:hover{--transform-translate-x:-14rem}.hover\:-translate-x-64:hover{--transform-translate-x:-16rem}.hover\:-translate-x-px:hover{--transform-translate-x:-1px}.hover\:-translate-x-full:hover{--transform-translate-x:-100%}.hover\:-translate-x-1\/2:hover{--transform-translate-x:-50%}.hover\:translate-x-1\/2:hover{--transform-translate-x:50%}.hover\:translate-x-full:hover{--transform-translate-x:100%}.hover\:translate-y-0:hover{--transform-translate-y:0}.hover\:translate-y-1:hover{--transform-translate-y:0.25rem}.hover\:translate-y-2:hover{--transform-translate-y:0.5rem}.hover\:translate-y-3:hover{--transform-translate-y:0.75rem}.hover\:translate-y-4:hover{--transform-translate-y:1rem}.hover\:translate-y-5:hover{--transform-translate-y:1.25rem}.hover\:translate-y-6:hover{--transform-translate-y:1.5rem}.hover\:translate-y-8:hover{--transform-translate-y:2rem}.hover\:translate-y-10:hover{--transform-translate-y:2.5rem}.hover\:translate-y-12:hover{--transform-translate-y:3rem}.hover\:translate-y-16:hover{--transform-translate-y:4rem}.hover\:translate-y-20:hover{--transform-translate-y:5rem}.hover\:translate-y-24:hover{--transform-translate-y:6rem}.hover\:translate-y-32:hover{--transform-translate-y:8rem}.hover\:translate-y-40:hover{--transform-translate-y:10rem}.hover\:translate-y-48:hover{--transform-translate-y:12rem}.hover\:translate-y-56:hover{--transform-translate-y:14rem}.hover\:translate-y-64:hover{--transform-translate-y:16rem}.hover\:translate-y-px:hover{--transform-translate-y:1px}.hover\:-translate-y-1:hover{--transform-translate-y:-0.25rem}.hover\:-translate-y-2:hover{--transform-translate-y:-0.5rem}.hover\:-translate-y-3:hover{--transform-translate-y:-0.75rem}.hover\:-translate-y-4:hover{--transform-translate-y:-1rem}.hover\:-translate-y-5:hover{--transform-translate-y:-1.25rem}.hover\:-translate-y-6:hover{--transform-translate-y:-1.5rem}.hover\:-translate-y-8:hover{--transform-translate-y:-2rem}.hover\:-translate-y-10:hover{--transform-translate-y:-2.5rem}.hover\:-translate-y-12:hover{--transform-translate-y:-3rem}.hover\:-translate-y-16:hover{--transform-translate-y:-4rem}.hover\:-translate-y-20:hover{--transform-translate-y:-5rem}.hover\:-translate-y-24:hover{--transform-translate-y:-6rem}.hover\:-translate-y-32:hover{--transform-translate-y:-8rem}.hover\:-translate-y-40:hover{--transform-translate-y:-10rem}.hover\:-translate-y-48:hover{--transform-translate-y:-12rem}.hover\:-translate-y-56:hover{--transform-translate-y:-14rem}.hover\:-translate-y-64:hover{--transform-translate-y:-16rem}.hover\:-translate-y-px:hover{--transform-translate-y:-1px}.hover\:-translate-y-full:hover{--transform-translate-y:-100%}.hover\:-translate-y-1\/2:hover{--transform-translate-y:-50%}.hover\:translate-y-1\/2:hover{--transform-translate-y:50%}.hover\:translate-y-full:hover{--transform-translate-y:100%}.focus\:translate-x-0:focus{--transform-translate-x:0}.focus\:translate-x-1:focus{--transform-translate-x:0.25rem}.focus\:translate-x-2:focus{--transform-translate-x:0.5rem}.focus\:translate-x-3:focus{--transform-translate-x:0.75rem}.focus\:translate-x-4:focus{--transform-translate-x:1rem}.focus\:translate-x-5:focus{--transform-translate-x:1.25rem}.focus\:translate-x-6:focus{--transform-translate-x:1.5rem}.focus\:translate-x-8:focus{--transform-translate-x:2rem}.focus\:translate-x-10:focus{--transform-translate-x:2.5rem}.focus\:translate-x-12:focus{--transform-translate-x:3rem}.focus\:translate-x-16:focus{--transform-translate-x:4rem}.focus\:translate-x-20:focus{--transform-translate-x:5rem}.focus\:translate-x-24:focus{--transform-translate-x:6rem}.focus\:translate-x-32:focus{--transform-translate-x:8rem}.focus\:translate-x-40:focus{--transform-translate-x:10rem}.focus\:translate-x-48:focus{--transform-translate-x:12rem}.focus\:translate-x-56:focus{--transform-translate-x:14rem}.focus\:translate-x-64:focus{--transform-translate-x:16rem}.focus\:translate-x-px:focus{--transform-translate-x:1px}.focus\:-translate-x-1:focus{--transform-translate-x:-0.25rem}.focus\:-translate-x-2:focus{--transform-translate-x:-0.5rem}.focus\:-translate-x-3:focus{--transform-translate-x:-0.75rem}.focus\:-translate-x-4:focus{--transform-translate-x:-1rem}.focus\:-translate-x-5:focus{--transform-translate-x:-1.25rem}.focus\:-translate-x-6:focus{--transform-translate-x:-1.5rem}.focus\:-translate-x-8:focus{--transform-translate-x:-2rem}.focus\:-translate-x-10:focus{--transform-translate-x:-2.5rem}.focus\:-translate-x-12:focus{--transform-translate-x:-3rem}.focus\:-translate-x-16:focus{--transform-translate-x:-4rem}.focus\:-translate-x-20:focus{--transform-translate-x:-5rem}.focus\:-translate-x-24:focus{--transform-translate-x:-6rem}.focus\:-translate-x-32:focus{--transform-translate-x:-8rem}.focus\:-translate-x-40:focus{--transform-translate-x:-10rem}.focus\:-translate-x-48:focus{--transform-translate-x:-12rem}.focus\:-translate-x-56:focus{--transform-translate-x:-14rem}.focus\:-translate-x-64:focus{--transform-translate-x:-16rem}.focus\:-translate-x-px:focus{--transform-translate-x:-1px}.focus\:-translate-x-full:focus{--transform-translate-x:-100%}.focus\:-translate-x-1\/2:focus{--transform-translate-x:-50%}.focus\:translate-x-1\/2:focus{--transform-translate-x:50%}.focus\:translate-x-full:focus{--transform-translate-x:100%}.focus\:translate-y-0:focus{--transform-translate-y:0}.focus\:translate-y-1:focus{--transform-translate-y:0.25rem}.focus\:translate-y-2:focus{--transform-translate-y:0.5rem}.focus\:translate-y-3:focus{--transform-translate-y:0.75rem}.focus\:translate-y-4:focus{--transform-translate-y:1rem}.focus\:translate-y-5:focus{--transform-translate-y:1.25rem}.focus\:translate-y-6:focus{--transform-translate-y:1.5rem}.focus\:translate-y-8:focus{--transform-translate-y:2rem}.focus\:translate-y-10:focus{--transform-translate-y:2.5rem}.focus\:translate-y-12:focus{--transform-translate-y:3rem}.focus\:translate-y-16:focus{--transform-translate-y:4rem}.focus\:translate-y-20:focus{--transform-translate-y:5rem}.focus\:translate-y-24:focus{--transform-translate-y:6rem}.focus\:translate-y-32:focus{--transform-translate-y:8rem}.focus\:translate-y-40:focus{--transform-translate-y:10rem}.focus\:translate-y-48:focus{--transform-translate-y:12rem}.focus\:translate-y-56:focus{--transform-translate-y:14rem}.focus\:translate-y-64:focus{--transform-translate-y:16rem}.focus\:translate-y-px:focus{--transform-translate-y:1px}.focus\:-translate-y-1:focus{--transform-translate-y:-0.25rem}.focus\:-translate-y-2:focus{--transform-translate-y:-0.5rem}.focus\:-translate-y-3:focus{--transform-translate-y:-0.75rem}.focus\:-translate-y-4:focus{--transform-translate-y:-1rem}.focus\:-translate-y-5:focus{--transform-translate-y:-1.25rem}.focus\:-translate-y-6:focus{--transform-translate-y:-1.5rem}.focus\:-translate-y-8:focus{--transform-translate-y:-2rem}.focus\:-translate-y-10:focus{--transform-translate-y:-2.5rem}.focus\:-translate-y-12:focus{--transform-translate-y:-3rem}.focus\:-translate-y-16:focus{--transform-translate-y:-4rem}.focus\:-translate-y-20:focus{--transform-translate-y:-5rem}.focus\:-translate-y-24:focus{--transform-translate-y:-6rem}.focus\:-translate-y-32:focus{--transform-translate-y:-8rem}.focus\:-translate-y-40:focus{--transform-translate-y:-10rem}.focus\:-translate-y-48:focus{--transform-translate-y:-12rem}.focus\:-translate-y-56:focus{--transform-translate-y:-14rem}.focus\:-translate-y-64:focus{--transform-translate-y:-16rem}.focus\:-translate-y-px:focus{--transform-translate-y:-1px}.focus\:-translate-y-full:focus{--transform-translate-y:-100%}.focus\:-translate-y-1\/2:focus{--transform-translate-y:-50%}.focus\:translate-y-1\/2:focus{--transform-translate-y:50%}.focus\:translate-y-full:focus{--transform-translate-y:100%}.skew-x-0{--transform-skew-x:0}.skew-x-1{--transform-skew-x:1deg}.skew-x-2{--transform-skew-x:2deg}.skew-x-3{--transform-skew-x:3deg}.skew-x-6{--transform-skew-x:6deg}.skew-x-12{--transform-skew-x:12deg}.-skew-x-12{--transform-skew-x:-12deg}.-skew-x-6{--transform-skew-x:-6deg}.-skew-x-3{--transform-skew-x:-3deg}.-skew-x-2{--transform-skew-x:-2deg}.-skew-x-1{--transform-skew-x:-1deg}.skew-y-0{--transform-skew-y:0}.skew-y-1{--transform-skew-y:1deg}.skew-y-2{--transform-skew-y:2deg}.skew-y-3{--transform-skew-y:3deg}.skew-y-6{--transform-skew-y:6deg}.skew-y-12{--transform-skew-y:12deg}.-skew-y-12{--transform-skew-y:-12deg}.-skew-y-6{--transform-skew-y:-6deg}.-skew-y-3{--transform-skew-y:-3deg}.-skew-y-2{--transform-skew-y:-2deg}.-skew-y-1{--transform-skew-y:-1deg}.hover\:skew-x-0:hover{--transform-skew-x:0}.hover\:skew-x-1:hover{--transform-skew-x:1deg}.hover\:skew-x-2:hover{--transform-skew-x:2deg}.hover\:skew-x-3:hover{--transform-skew-x:3deg}.hover\:skew-x-6:hover{--transform-skew-x:6deg}.hover\:skew-x-12:hover{--transform-skew-x:12deg}.hover\:-skew-x-12:hover{--transform-skew-x:-12deg}.hover\:-skew-x-6:hover{--transform-skew-x:-6deg}.hover\:-skew-x-3:hover{--transform-skew-x:-3deg}.hover\:-skew-x-2:hover{--transform-skew-x:-2deg}.hover\:-skew-x-1:hover{--transform-skew-x:-1deg}.hover\:skew-y-0:hover{--transform-skew-y:0}.hover\:skew-y-1:hover{--transform-skew-y:1deg}.hover\:skew-y-2:hover{--transform-skew-y:2deg}.hover\:skew-y-3:hover{--transform-skew-y:3deg}.hover\:skew-y-6:hover{--transform-skew-y:6deg}.hover\:skew-y-12:hover{--transform-skew-y:12deg}.hover\:-skew-y-12:hover{--transform-skew-y:-12deg}.hover\:-skew-y-6:hover{--transform-skew-y:-6deg}.hover\:-skew-y-3:hover{--transform-skew-y:-3deg}.hover\:-skew-y-2:hover{--transform-skew-y:-2deg}.hover\:-skew-y-1:hover{--transform-skew-y:-1deg}.focus\:skew-x-0:focus{--transform-skew-x:0}.focus\:skew-x-1:focus{--transform-skew-x:1deg}.focus\:skew-x-2:focus{--transform-skew-x:2deg}.focus\:skew-x-3:focus{--transform-skew-x:3deg}.focus\:skew-x-6:focus{--transform-skew-x:6deg}.focus\:skew-x-12:focus{--transform-skew-x:12deg}.focus\:-skew-x-12:focus{--transform-skew-x:-12deg}.focus\:-skew-x-6:focus{--transform-skew-x:-6deg}.focus\:-skew-x-3:focus{--transform-skew-x:-3deg}.focus\:-skew-x-2:focus{--transform-skew-x:-2deg}.focus\:-skew-x-1:focus{--transform-skew-x:-1deg}.focus\:skew-y-0:focus{--transform-skew-y:0}.focus\:skew-y-1:focus{--transform-skew-y:1deg}.focus\:skew-y-2:focus{--transform-skew-y:2deg}.focus\:skew-y-3:focus{--transform-skew-y:3deg}.focus\:skew-y-6:focus{--transform-skew-y:6deg}.focus\:skew-y-12:focus{--transform-skew-y:12deg}.focus\:-skew-y-12:focus{--transform-skew-y:-12deg}.focus\:-skew-y-6:focus{--transform-skew-y:-6deg}.focus\:-skew-y-3:focus{--transform-skew-y:-3deg}.focus\:-skew-y-2:focus{--transform-skew-y:-2deg}.focus\:-skew-y-1:focus{--transform-skew-y:-1deg}.transition-none{transition-property:none}.transition-all{transition-property:all}.transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform}.transition-colors{transition-property:background-color,border-color,color,fill,stroke}.transition-opacity{transition-property:opacity}.transition-shadow{transition-property:box-shadow}.transition-transform{transition-property:transform}.ease-linear{transition-timing-function:linear}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-75{transition-duration:75ms}.duration-100{transition-duration:.1s}.duration-150{transition-duration:150ms}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-700{transition-duration:.7s}.duration-1000{transition-duration:1s}.delay-75{transition-delay:75ms}.delay-100{transition-delay:.1s}.delay-150{transition-delay:150ms}.delay-200{transition-delay:.2s}.delay-300{transition-delay:.3s}.delay-500{transition-delay:.5s}.delay-700{transition-delay:.7s}.delay-1000{transition-delay:1s}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{100%,75%{transform:scale(2);opacity:0}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,100%{transform:translateY(-25%);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;animation-timing-function:cubic-bezier(0,0,.2,1)}}.animate-none{animation:none}.animate-spin{animation:spin 1s linear infinite}.animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.animate-bounce{animation:bounce 1s infinite}@media (min-width:640px){.sm\:container{width:100%}@media (min-width:640px){.sm\:container{max-width:640px}}@media (min-width:768px){.sm\:container{max-width:768px}}@media (min-width:1024px){.sm\:container{max-width:1024px}}@media (min-width:1280px){.sm\:container{max-width:1280px}}.sm\:space-y-0>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(0px * var(--space-y-reverse))}.sm\:space-x-0>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(0px * var(--space-x-reverse));margin-left:calc(0px * calc(1 - var(--space-x-reverse)))}.sm\:space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.25rem * var(--space-y-reverse))}.sm\:space-x-1>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.25rem * var(--space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.5rem * var(--space-y-reverse))}.sm\:space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.5rem * var(--space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.75rem * var(--space-y-reverse))}.sm\:space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.75rem * var(--space-x-reverse));margin-left:calc(.75rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1rem * var(--space-y-reverse))}.sm\:space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1rem * var(--space-x-reverse));margin-left:calc(1rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1.25rem * var(--space-y-reverse))}.sm\:space-x-5>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1.25rem * var(--space-x-reverse));margin-left:calc(1.25rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-6>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1.5rem * var(--space-y-reverse))}.sm\:space-x-6>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1.5rem * var(--space-x-reverse));margin-left:calc(1.5rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-8>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(2rem * var(--space-y-reverse))}.sm\:space-x-8>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(2rem * var(--space-x-reverse));margin-left:calc(2rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(2.5rem * var(--space-y-reverse))}.sm\:space-x-10>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(2.5rem * var(--space-x-reverse));margin-left:calc(2.5rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-12>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(3rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(3rem * var(--space-y-reverse))}.sm\:space-x-12>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(3rem * var(--space-x-reverse));margin-left:calc(3rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-16>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(4rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(4rem * var(--space-y-reverse))}.sm\:space-x-16>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(4rem * var(--space-x-reverse));margin-left:calc(4rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-20>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(5rem * var(--space-y-reverse))}.sm\:space-x-20>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(5rem * var(--space-x-reverse));margin-left:calc(5rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-24>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(6rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(6rem * var(--space-y-reverse))}.sm\:space-x-24>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(6rem * var(--space-x-reverse));margin-left:calc(6rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-32>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(8rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(8rem * var(--space-y-reverse))}.sm\:space-x-32>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(8rem * var(--space-x-reverse));margin-left:calc(8rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-40>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(10rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(10rem * var(--space-y-reverse))}.sm\:space-x-40>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(10rem * var(--space-x-reverse));margin-left:calc(10rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-48>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(12rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(12rem * var(--space-y-reverse))}.sm\:space-x-48>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(12rem * var(--space-x-reverse));margin-left:calc(12rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-56>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(14rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(14rem * var(--space-y-reverse))}.sm\:space-x-56>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(14rem * var(--space-x-reverse));margin-left:calc(14rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-64>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(16rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(16rem * var(--space-y-reverse))}.sm\:space-x-64>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(16rem * var(--space-x-reverse));margin-left:calc(16rem * calc(1 - var(--space-x-reverse)))}.sm\:space-y-px>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1px * var(--space-y-reverse))}.sm\:space-x-px>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1px * var(--space-x-reverse));margin-left:calc(1px * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.25rem * var(--space-y-reverse))}.sm\:-space-x-1>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.25rem * var(--space-x-reverse));margin-left:calc(-.25rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.5rem * var(--space-y-reverse))}.sm\:-space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.5rem * var(--space-x-reverse));margin-left:calc(-.5rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.75rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.75rem * var(--space-y-reverse))}.sm\:-space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.75rem * var(--space-x-reverse));margin-left:calc(-.75rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1rem * var(--space-y-reverse))}.sm\:-space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1rem * var(--space-x-reverse));margin-left:calc(-1rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1.25rem * var(--space-y-reverse))}.sm\:-space-x-5>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1.25rem * var(--space-x-reverse));margin-left:calc(-1.25rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-6>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1.5rem * var(--space-y-reverse))}.sm\:-space-x-6>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1.5rem * var(--space-x-reverse));margin-left:calc(-1.5rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-8>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-2rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-2rem * var(--space-y-reverse))}.sm\:-space-x-8>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-2rem * var(--space-x-reverse));margin-left:calc(-2rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-2.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-2.5rem * var(--space-y-reverse))}.sm\:-space-x-10>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-2.5rem * var(--space-x-reverse));margin-left:calc(-2.5rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-12>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-3rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-3rem * var(--space-y-reverse))}.sm\:-space-x-12>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-3rem * var(--space-x-reverse));margin-left:calc(-3rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-16>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-4rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-4rem * var(--space-y-reverse))}.sm\:-space-x-16>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-4rem * var(--space-x-reverse));margin-left:calc(-4rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-20>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-5rem * var(--space-y-reverse))}.sm\:-space-x-20>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-5rem * var(--space-x-reverse));margin-left:calc(-5rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-24>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-6rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-6rem * var(--space-y-reverse))}.sm\:-space-x-24>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-6rem * var(--space-x-reverse));margin-left:calc(-6rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-32>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-8rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-8rem * var(--space-y-reverse))}.sm\:-space-x-32>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-8rem * var(--space-x-reverse));margin-left:calc(-8rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-40>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-10rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-10rem * var(--space-y-reverse))}.sm\:-space-x-40>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-10rem * var(--space-x-reverse));margin-left:calc(-10rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-48>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-12rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-12rem * var(--space-y-reverse))}.sm\:-space-x-48>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-12rem * var(--space-x-reverse));margin-left:calc(-12rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-56>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-14rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-14rem * var(--space-y-reverse))}.sm\:-space-x-56>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-14rem * var(--space-x-reverse));margin-left:calc(-14rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-64>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-16rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-16rem * var(--space-y-reverse))}.sm\:-space-x-64>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-16rem * var(--space-x-reverse));margin-left:calc(-16rem * calc(1 - var(--space-x-reverse)))}.sm\:-space-y-px>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1px * var(--space-y-reverse))}.sm\:-space-x-px>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1px * var(--space-x-reverse));margin-left:calc(-1px * calc(1 - var(--space-x-reverse)))}.sm\:space-y-reverse>:not(template)~:not(template){--space-y-reverse:1}.sm\:space-x-reverse>:not(template)~:not(template){--space-x-reverse:1}.sm\:divide-y-0>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(0px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(0px * var(--divide-y-reverse))}.sm\:divide-x-0>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(0px * var(--divide-x-reverse));border-left-width:calc(0px * calc(1 - var(--divide-x-reverse)))}.sm\:divide-y-2>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(2px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(2px * var(--divide-y-reverse))}.sm\:divide-x-2>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(2px * var(--divide-x-reverse));border-left-width:calc(2px * calc(1 - var(--divide-x-reverse)))}.sm\:divide-y-4>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(4px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(4px * var(--divide-y-reverse))}.sm\:divide-x-4>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(4px * var(--divide-x-reverse));border-left-width:calc(4px * calc(1 - var(--divide-x-reverse)))}.sm\:divide-y-8>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(8px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(8px * var(--divide-y-reverse))}.sm\:divide-x-8>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(8px * var(--divide-x-reverse));border-left-width:calc(8px * calc(1 - var(--divide-x-reverse)))}.sm\:divide-y>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(1px * var(--divide-y-reverse))}.sm\:divide-x>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(1px * var(--divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--divide-x-reverse)))}.sm\:divide-y-reverse>:not(template)~:not(template){--divide-y-reverse:1}.sm\:divide-x-reverse>:not(template)~:not(template){--divide-x-reverse:1}.sm\:divide-transparent>:not(template)~:not(template){border-color:transparent}.sm\:divide-current>:not(template)~:not(template){border-color:currentColor}.sm\:divide-black>:not(template)~:not(template){--divide-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--divide-opacity))}.sm\:divide-white>:not(template)~:not(template){--divide-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--divide-opacity))}.sm\:divide-gray-100>:not(template)~:not(template){--divide-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--divide-opacity))}.sm\:divide-gray-200>:not(template)~:not(template){--divide-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--divide-opacity))}.sm\:divide-gray-300>:not(template)~:not(template){--divide-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--divide-opacity))}.sm\:divide-gray-400>:not(template)~:not(template){--divide-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--divide-opacity))}.sm\:divide-gray-500>:not(template)~:not(template){--divide-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--divide-opacity))}.sm\:divide-gray-600>:not(template)~:not(template){--divide-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--divide-opacity))}.sm\:divide-gray-700>:not(template)~:not(template){--divide-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--divide-opacity))}.sm\:divide-gray-800>:not(template)~:not(template){--divide-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--divide-opacity))}.sm\:divide-gray-900>:not(template)~:not(template){--divide-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--divide-opacity))}.sm\:divide-red-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--divide-opacity))}.sm\:divide-red-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--divide-opacity))}.sm\:divide-red-300>:not(template)~:not(template){--divide-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--divide-opacity))}.sm\:divide-red-400>:not(template)~:not(template){--divide-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--divide-opacity))}.sm\:divide-red-500>:not(template)~:not(template){--divide-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--divide-opacity))}.sm\:divide-red-600>:not(template)~:not(template){--divide-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--divide-opacity))}.sm\:divide-red-700>:not(template)~:not(template){--divide-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--divide-opacity))}.sm\:divide-red-800>:not(template)~:not(template){--divide-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--divide-opacity))}.sm\:divide-red-900>:not(template)~:not(template){--divide-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--divide-opacity))}.sm\:divide-orange-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--divide-opacity))}.sm\:divide-orange-200>:not(template)~:not(template){--divide-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--divide-opacity))}.sm\:divide-orange-300>:not(template)~:not(template){--divide-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--divide-opacity))}.sm\:divide-orange-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--divide-opacity))}.sm\:divide-orange-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--divide-opacity))}.sm\:divide-orange-600>:not(template)~:not(template){--divide-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--divide-opacity))}.sm\:divide-orange-700>:not(template)~:not(template){--divide-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--divide-opacity))}.sm\:divide-orange-800>:not(template)~:not(template){--divide-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--divide-opacity))}.sm\:divide-orange-900>:not(template)~:not(template){--divide-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--divide-opacity))}.sm\:divide-yellow-100>:not(template)~:not(template){--divide-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--divide-opacity))}.sm\:divide-yellow-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--divide-opacity))}.sm\:divide-yellow-300>:not(template)~:not(template){--divide-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--divide-opacity))}.sm\:divide-yellow-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--divide-opacity))}.sm\:divide-yellow-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--divide-opacity))}.sm\:divide-yellow-600>:not(template)~:not(template){--divide-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--divide-opacity))}.sm\:divide-yellow-700>:not(template)~:not(template){--divide-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--divide-opacity))}.sm\:divide-yellow-800>:not(template)~:not(template){--divide-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--divide-opacity))}.sm\:divide-yellow-900>:not(template)~:not(template){--divide-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--divide-opacity))}.sm\:divide-green-100>:not(template)~:not(template){--divide-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--divide-opacity))}.sm\:divide-green-200>:not(template)~:not(template){--divide-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--divide-opacity))}.sm\:divide-green-300>:not(template)~:not(template){--divide-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--divide-opacity))}.sm\:divide-green-400>:not(template)~:not(template){--divide-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--divide-opacity))}.sm\:divide-green-500>:not(template)~:not(template){--divide-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--divide-opacity))}.sm\:divide-green-600>:not(template)~:not(template){--divide-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--divide-opacity))}.sm\:divide-green-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--divide-opacity))}.sm\:divide-green-800>:not(template)~:not(template){--divide-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--divide-opacity))}.sm\:divide-green-900>:not(template)~:not(template){--divide-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--divide-opacity))}.sm\:divide-teal-100>:not(template)~:not(template){--divide-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--divide-opacity))}.sm\:divide-teal-200>:not(template)~:not(template){--divide-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--divide-opacity))}.sm\:divide-teal-300>:not(template)~:not(template){--divide-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--divide-opacity))}.sm\:divide-teal-400>:not(template)~:not(template){--divide-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--divide-opacity))}.sm\:divide-teal-500>:not(template)~:not(template){--divide-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--divide-opacity))}.sm\:divide-teal-600>:not(template)~:not(template){--divide-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--divide-opacity))}.sm\:divide-teal-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--divide-opacity))}.sm\:divide-teal-800>:not(template)~:not(template){--divide-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--divide-opacity))}.sm\:divide-teal-900>:not(template)~:not(template){--divide-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--divide-opacity))}.sm\:divide-blue-100>:not(template)~:not(template){--divide-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--divide-opacity))}.sm\:divide-blue-200>:not(template)~:not(template){--divide-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--divide-opacity))}.sm\:divide-blue-300>:not(template)~:not(template){--divide-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--divide-opacity))}.sm\:divide-blue-400>:not(template)~:not(template){--divide-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--divide-opacity))}.sm\:divide-blue-500>:not(template)~:not(template){--divide-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--divide-opacity))}.sm\:divide-blue-600>:not(template)~:not(template){--divide-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--divide-opacity))}.sm\:divide-blue-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--divide-opacity))}.sm\:divide-blue-800>:not(template)~:not(template){--divide-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--divide-opacity))}.sm\:divide-blue-900>:not(template)~:not(template){--divide-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--divide-opacity))}.sm\:divide-indigo-100>:not(template)~:not(template){--divide-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--divide-opacity))}.sm\:divide-indigo-200>:not(template)~:not(template){--divide-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--divide-opacity))}.sm\:divide-indigo-300>:not(template)~:not(template){--divide-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--divide-opacity))}.sm\:divide-indigo-400>:not(template)~:not(template){--divide-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--divide-opacity))}.sm\:divide-indigo-500>:not(template)~:not(template){--divide-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--divide-opacity))}.sm\:divide-indigo-600>:not(template)~:not(template){--divide-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--divide-opacity))}.sm\:divide-indigo-700>:not(template)~:not(template){--divide-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--divide-opacity))}.sm\:divide-indigo-800>:not(template)~:not(template){--divide-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--divide-opacity))}.sm\:divide-indigo-900>:not(template)~:not(template){--divide-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--divide-opacity))}.sm\:divide-purple-100>:not(template)~:not(template){--divide-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--divide-opacity))}.sm\:divide-purple-200>:not(template)~:not(template){--divide-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--divide-opacity))}.sm\:divide-purple-300>:not(template)~:not(template){--divide-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--divide-opacity))}.sm\:divide-purple-400>:not(template)~:not(template){--divide-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--divide-opacity))}.sm\:divide-purple-500>:not(template)~:not(template){--divide-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--divide-opacity))}.sm\:divide-purple-600>:not(template)~:not(template){--divide-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--divide-opacity))}.sm\:divide-purple-700>:not(template)~:not(template){--divide-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--divide-opacity))}.sm\:divide-purple-800>:not(template)~:not(template){--divide-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--divide-opacity))}.sm\:divide-purple-900>:not(template)~:not(template){--divide-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--divide-opacity))}.sm\:divide-pink-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--divide-opacity))}.sm\:divide-pink-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--divide-opacity))}.sm\:divide-pink-300>:not(template)~:not(template){--divide-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--divide-opacity))}.sm\:divide-pink-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--divide-opacity))}.sm\:divide-pink-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--divide-opacity))}.sm\:divide-pink-600>:not(template)~:not(template){--divide-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--divide-opacity))}.sm\:divide-pink-700>:not(template)~:not(template){--divide-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--divide-opacity))}.sm\:divide-pink-800>:not(template)~:not(template){--divide-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--divide-opacity))}.sm\:divide-pink-900>:not(template)~:not(template){--divide-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--divide-opacity))}.sm\:divide-solid>:not(template)~:not(template){border-style:solid}.sm\:divide-dashed>:not(template)~:not(template){border-style:dashed}.sm\:divide-dotted>:not(template)~:not(template){border-style:dotted}.sm\:divide-double>:not(template)~:not(template){border-style:double}.sm\:divide-none>:not(template)~:not(template){border-style:none}.sm\:divide-opacity-0>:not(template)~:not(template){--divide-opacity:0}.sm\:divide-opacity-25>:not(template)~:not(template){--divide-opacity:0.25}.sm\:divide-opacity-50>:not(template)~:not(template){--divide-opacity:0.5}.sm\:divide-opacity-75>:not(template)~:not(template){--divide-opacity:0.75}.sm\:divide-opacity-100>:not(template)~:not(template){--divide-opacity:1}.sm\:sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sm\:not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.sm\:focus\:sr-only:focus{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.sm\:focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.sm\:appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.sm\:bg-fixed{background-attachment:fixed}.sm\:bg-local{background-attachment:local}.sm\:bg-scroll{background-attachment:scroll}.sm\:bg-clip-border{background-clip:border-box}.sm\:bg-clip-padding{background-clip:padding-box}.sm\:bg-clip-content{background-clip:content-box}.sm\:bg-clip-text{-webkit-background-clip:text;background-clip:text}.sm\:bg-transparent{background-color:transparent}.sm\:bg-current{background-color:currentColor}.sm\:bg-black{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.sm\:bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.sm\:bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.sm\:bg-gray-200{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.sm\:bg-gray-300{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.sm\:bg-gray-400{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.sm\:bg-gray-500{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.sm\:bg-gray-600{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.sm\:bg-gray-700{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.sm\:bg-gray-800{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.sm\:bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.sm\:bg-red-100{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.sm\:bg-red-200{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.sm\:bg-red-300{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.sm\:bg-red-400{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.sm\:bg-red-500{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.sm\:bg-red-600{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.sm\:bg-red-700{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.sm\:bg-red-800{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.sm\:bg-red-900{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.sm\:bg-orange-100{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.sm\:bg-orange-200{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.sm\:bg-orange-300{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.sm\:bg-orange-400{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.sm\:bg-orange-500{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.sm\:bg-orange-600{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.sm\:bg-orange-700{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.sm\:bg-orange-800{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.sm\:bg-orange-900{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.sm\:bg-yellow-100{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.sm\:bg-yellow-200{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.sm\:bg-yellow-300{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.sm\:bg-yellow-400{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.sm\:bg-yellow-500{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.sm\:bg-yellow-600{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.sm\:bg-yellow-700{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.sm\:bg-yellow-800{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.sm\:bg-yellow-900{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.sm\:bg-green-100{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.sm\:bg-green-200{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.sm\:bg-green-300{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.sm\:bg-green-400{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.sm\:bg-green-500{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.sm\:bg-green-600{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.sm\:bg-green-700{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.sm\:bg-green-800{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.sm\:bg-green-900{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.sm\:bg-teal-100{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.sm\:bg-teal-200{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.sm\:bg-teal-300{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.sm\:bg-teal-400{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.sm\:bg-teal-500{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.sm\:bg-teal-600{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.sm\:bg-teal-700{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.sm\:bg-teal-800{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.sm\:bg-teal-900{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.sm\:bg-blue-100{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.sm\:bg-blue-200{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.sm\:bg-blue-300{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.sm\:bg-blue-400{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.sm\:bg-blue-500{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.sm\:bg-blue-600{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.sm\:bg-blue-700{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.sm\:bg-blue-800{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.sm\:bg-blue-900{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.sm\:bg-indigo-100{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.sm\:bg-indigo-200{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.sm\:bg-indigo-300{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.sm\:bg-indigo-400{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.sm\:bg-indigo-500{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.sm\:bg-indigo-600{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.sm\:bg-indigo-700{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.sm\:bg-indigo-800{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.sm\:bg-indigo-900{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.sm\:bg-purple-100{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.sm\:bg-purple-200{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.sm\:bg-purple-300{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.sm\:bg-purple-400{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.sm\:bg-purple-500{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.sm\:bg-purple-600{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.sm\:bg-purple-700{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.sm\:bg-purple-800{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.sm\:bg-purple-900{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.sm\:bg-pink-100{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.sm\:bg-pink-200{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.sm\:bg-pink-300{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.sm\:bg-pink-400{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.sm\:bg-pink-500{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.sm\:bg-pink-600{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.sm\:bg-pink-700{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.sm\:bg-pink-800{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.sm\:bg-pink-900{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.sm\:hover\:bg-transparent:hover{background-color:transparent}.sm\:hover\:bg-current:hover{background-color:currentColor}.sm\:hover\:bg-black:hover{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.sm\:hover\:bg-white:hover{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.sm\:hover\:bg-gray-100:hover{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.sm\:hover\:bg-gray-200:hover{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.sm\:hover\:bg-gray-300:hover{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.sm\:hover\:bg-gray-400:hover{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.sm\:hover\:bg-gray-500:hover{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.sm\:hover\:bg-gray-600:hover{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.sm\:hover\:bg-gray-700:hover{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.sm\:hover\:bg-gray-800:hover{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.sm\:hover\:bg-gray-900:hover{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.sm\:hover\:bg-red-100:hover{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.sm\:hover\:bg-red-200:hover{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.sm\:hover\:bg-red-300:hover{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.sm\:hover\:bg-red-400:hover{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.sm\:hover\:bg-red-500:hover{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.sm\:hover\:bg-red-600:hover{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.sm\:hover\:bg-red-700:hover{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.sm\:hover\:bg-red-800:hover{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.sm\:hover\:bg-red-900:hover{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.sm\:hover\:bg-orange-100:hover{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.sm\:hover\:bg-orange-200:hover{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.sm\:hover\:bg-orange-300:hover{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.sm\:hover\:bg-orange-400:hover{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.sm\:hover\:bg-orange-500:hover{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.sm\:hover\:bg-orange-600:hover{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.sm\:hover\:bg-orange-700:hover{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.sm\:hover\:bg-orange-800:hover{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.sm\:hover\:bg-orange-900:hover{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.sm\:hover\:bg-yellow-100:hover{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.sm\:hover\:bg-yellow-200:hover{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.sm\:hover\:bg-yellow-300:hover{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.sm\:hover\:bg-yellow-400:hover{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.sm\:hover\:bg-yellow-500:hover{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.sm\:hover\:bg-yellow-600:hover{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.sm\:hover\:bg-yellow-700:hover{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.sm\:hover\:bg-yellow-800:hover{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.sm\:hover\:bg-yellow-900:hover{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.sm\:hover\:bg-green-100:hover{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.sm\:hover\:bg-green-200:hover{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.sm\:hover\:bg-green-300:hover{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.sm\:hover\:bg-green-400:hover{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.sm\:hover\:bg-green-500:hover{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.sm\:hover\:bg-green-600:hover{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.sm\:hover\:bg-green-700:hover{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.sm\:hover\:bg-green-800:hover{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.sm\:hover\:bg-green-900:hover{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.sm\:hover\:bg-teal-100:hover{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.sm\:hover\:bg-teal-200:hover{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.sm\:hover\:bg-teal-300:hover{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.sm\:hover\:bg-teal-400:hover{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.sm\:hover\:bg-teal-500:hover{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.sm\:hover\:bg-teal-600:hover{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.sm\:hover\:bg-teal-700:hover{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.sm\:hover\:bg-teal-800:hover{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.sm\:hover\:bg-teal-900:hover{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.sm\:hover\:bg-blue-100:hover{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.sm\:hover\:bg-blue-200:hover{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.sm\:hover\:bg-blue-300:hover{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.sm\:hover\:bg-blue-400:hover{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.sm\:hover\:bg-blue-500:hover{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.sm\:hover\:bg-blue-600:hover{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.sm\:hover\:bg-blue-700:hover{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.sm\:hover\:bg-blue-800:hover{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.sm\:hover\:bg-blue-900:hover{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.sm\:hover\:bg-indigo-100:hover{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.sm\:hover\:bg-indigo-200:hover{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.sm\:hover\:bg-indigo-300:hover{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.sm\:hover\:bg-indigo-400:hover{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.sm\:hover\:bg-indigo-500:hover{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.sm\:hover\:bg-indigo-600:hover{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.sm\:hover\:bg-indigo-700:hover{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.sm\:hover\:bg-indigo-800:hover{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.sm\:hover\:bg-indigo-900:hover{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.sm\:hover\:bg-purple-100:hover{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.sm\:hover\:bg-purple-200:hover{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.sm\:hover\:bg-purple-300:hover{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.sm\:hover\:bg-purple-400:hover{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.sm\:hover\:bg-purple-500:hover{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.sm\:hover\:bg-purple-600:hover{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.sm\:hover\:bg-purple-700:hover{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.sm\:hover\:bg-purple-800:hover{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.sm\:hover\:bg-purple-900:hover{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.sm\:hover\:bg-pink-100:hover{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.sm\:hover\:bg-pink-200:hover{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.sm\:hover\:bg-pink-300:hover{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.sm\:hover\:bg-pink-400:hover{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.sm\:hover\:bg-pink-500:hover{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.sm\:hover\:bg-pink-600:hover{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.sm\:hover\:bg-pink-700:hover{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.sm\:hover\:bg-pink-800:hover{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.sm\:hover\:bg-pink-900:hover{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.sm\:focus\:bg-transparent:focus{background-color:transparent}.sm\:focus\:bg-current:focus{background-color:currentColor}.sm\:focus\:bg-black:focus{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.sm\:focus\:bg-white:focus{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.sm\:focus\:bg-gray-100:focus{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.sm\:focus\:bg-gray-200:focus{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.sm\:focus\:bg-gray-300:focus{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.sm\:focus\:bg-gray-400:focus{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.sm\:focus\:bg-gray-500:focus{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.sm\:focus\:bg-gray-600:focus{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.sm\:focus\:bg-gray-700:focus{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.sm\:focus\:bg-gray-800:focus{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.sm\:focus\:bg-gray-900:focus{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.sm\:focus\:bg-red-100:focus{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.sm\:focus\:bg-red-200:focus{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.sm\:focus\:bg-red-300:focus{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.sm\:focus\:bg-red-400:focus{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.sm\:focus\:bg-red-500:focus{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.sm\:focus\:bg-red-600:focus{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.sm\:focus\:bg-red-700:focus{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.sm\:focus\:bg-red-800:focus{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.sm\:focus\:bg-red-900:focus{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.sm\:focus\:bg-orange-100:focus{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.sm\:focus\:bg-orange-200:focus{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.sm\:focus\:bg-orange-300:focus{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.sm\:focus\:bg-orange-400:focus{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.sm\:focus\:bg-orange-500:focus{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.sm\:focus\:bg-orange-600:focus{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.sm\:focus\:bg-orange-700:focus{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.sm\:focus\:bg-orange-800:focus{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.sm\:focus\:bg-orange-900:focus{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.sm\:focus\:bg-yellow-100:focus{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.sm\:focus\:bg-yellow-200:focus{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.sm\:focus\:bg-yellow-300:focus{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.sm\:focus\:bg-yellow-400:focus{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.sm\:focus\:bg-yellow-500:focus{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.sm\:focus\:bg-yellow-600:focus{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.sm\:focus\:bg-yellow-700:focus{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.sm\:focus\:bg-yellow-800:focus{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.sm\:focus\:bg-yellow-900:focus{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.sm\:focus\:bg-green-100:focus{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.sm\:focus\:bg-green-200:focus{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.sm\:focus\:bg-green-300:focus{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.sm\:focus\:bg-green-400:focus{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.sm\:focus\:bg-green-500:focus{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.sm\:focus\:bg-green-600:focus{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.sm\:focus\:bg-green-700:focus{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.sm\:focus\:bg-green-800:focus{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.sm\:focus\:bg-green-900:focus{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.sm\:focus\:bg-teal-100:focus{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.sm\:focus\:bg-teal-200:focus{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.sm\:focus\:bg-teal-300:focus{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.sm\:focus\:bg-teal-400:focus{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.sm\:focus\:bg-teal-500:focus{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.sm\:focus\:bg-teal-600:focus{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.sm\:focus\:bg-teal-700:focus{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.sm\:focus\:bg-teal-800:focus{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.sm\:focus\:bg-teal-900:focus{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.sm\:focus\:bg-blue-100:focus{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.sm\:focus\:bg-blue-200:focus{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.sm\:focus\:bg-blue-300:focus{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.sm\:focus\:bg-blue-400:focus{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.sm\:focus\:bg-blue-500:focus{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.sm\:focus\:bg-blue-600:focus{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.sm\:focus\:bg-blue-700:focus{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.sm\:focus\:bg-blue-800:focus{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.sm\:focus\:bg-blue-900:focus{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.sm\:focus\:bg-indigo-100:focus{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.sm\:focus\:bg-indigo-200:focus{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.sm\:focus\:bg-indigo-300:focus{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.sm\:focus\:bg-indigo-400:focus{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.sm\:focus\:bg-indigo-500:focus{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.sm\:focus\:bg-indigo-600:focus{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.sm\:focus\:bg-indigo-700:focus{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.sm\:focus\:bg-indigo-800:focus{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.sm\:focus\:bg-indigo-900:focus{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.sm\:focus\:bg-purple-100:focus{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.sm\:focus\:bg-purple-200:focus{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.sm\:focus\:bg-purple-300:focus{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.sm\:focus\:bg-purple-400:focus{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.sm\:focus\:bg-purple-500:focus{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.sm\:focus\:bg-purple-600:focus{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.sm\:focus\:bg-purple-700:focus{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.sm\:focus\:bg-purple-800:focus{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.sm\:focus\:bg-purple-900:focus{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.sm\:focus\:bg-pink-100:focus{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.sm\:focus\:bg-pink-200:focus{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.sm\:focus\:bg-pink-300:focus{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.sm\:focus\:bg-pink-400:focus{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.sm\:focus\:bg-pink-500:focus{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.sm\:focus\:bg-pink-600:focus{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.sm\:focus\:bg-pink-700:focus{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.sm\:focus\:bg-pink-800:focus{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.sm\:focus\:bg-pink-900:focus{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.sm\:bg-none{background-image:none}.sm\:bg-gradient-to-t{background-image:linear-gradient(to top,var(--gradient-color-stops))}.sm\:bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--gradient-color-stops))}.sm\:bg-gradient-to-r{background-image:linear-gradient(to right,var(--gradient-color-stops))}.sm\:bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--gradient-color-stops))}.sm\:bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--gradient-color-stops))}.sm\:bg-gradient-to-bl{background-image:linear-gradient(to bottom left,var(--gradient-color-stops))}.sm\:bg-gradient-to-l{background-image:linear-gradient(to left,var(--gradient-color-stops))}.sm\:bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--gradient-color-stops))}.sm\:from-transparent{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:from-current{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:from-black{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:from-white{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:from-gray-100{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.sm\:from-gray-200{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.sm\:from-gray-300{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.sm\:from-gray-400{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.sm\:from-gray-500{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.sm\:from-gray-600{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.sm\:from-gray-700{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.sm\:from-gray-800{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.sm\:from-gray-900{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.sm\:from-red-100{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.sm\:from-red-200{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.sm\:from-red-300{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.sm\:from-red-400{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.sm\:from-red-500{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.sm\:from-red-600{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.sm\:from-red-700{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.sm\:from-red-800{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.sm\:from-red-900{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.sm\:from-orange-100{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.sm\:from-orange-200{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.sm\:from-orange-300{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.sm\:from-orange-400{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.sm\:from-orange-500{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.sm\:from-orange-600{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.sm\:from-orange-700{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.sm\:from-orange-800{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.sm\:from-orange-900{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.sm\:from-yellow-100{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.sm\:from-yellow-200{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.sm\:from-yellow-300{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.sm\:from-yellow-400{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.sm\:from-yellow-500{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.sm\:from-yellow-600{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.sm\:from-yellow-700{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.sm\:from-yellow-800{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.sm\:from-yellow-900{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.sm\:from-green-100{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.sm\:from-green-200{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.sm\:from-green-300{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.sm\:from-green-400{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.sm\:from-green-500{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.sm\:from-green-600{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.sm\:from-green-700{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.sm\:from-green-800{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.sm\:from-green-900{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.sm\:from-teal-100{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.sm\:from-teal-200{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.sm\:from-teal-300{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.sm\:from-teal-400{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.sm\:from-teal-500{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.sm\:from-teal-600{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.sm\:from-teal-700{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.sm\:from-teal-800{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.sm\:from-teal-900{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.sm\:from-blue-100{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.sm\:from-blue-200{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.sm\:from-blue-300{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.sm\:from-blue-400{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.sm\:from-blue-500{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.sm\:from-blue-600{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.sm\:from-blue-700{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.sm\:from-blue-800{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.sm\:from-blue-900{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.sm\:from-indigo-100{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.sm\:from-indigo-200{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.sm\:from-indigo-300{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.sm\:from-indigo-400{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.sm\:from-indigo-500{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.sm\:from-indigo-600{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.sm\:from-indigo-700{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.sm\:from-indigo-800{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.sm\:from-indigo-900{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.sm\:from-purple-100{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.sm\:from-purple-200{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.sm\:from-purple-300{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.sm\:from-purple-400{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.sm\:from-purple-500{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.sm\:from-purple-600{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.sm\:from-purple-700{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.sm\:from-purple-800{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.sm\:from-purple-900{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.sm\:from-pink-100{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.sm\:from-pink-200{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.sm\:from-pink-300{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.sm\:from-pink-400{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.sm\:from-pink-500{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.sm\:from-pink-600{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.sm\:from-pink-700{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.sm\:from-pink-800{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.sm\:from-pink-900{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.sm\:via-transparent{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:via-current{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:via-black{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:via-white{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:via-gray-100{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.sm\:via-gray-200{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.sm\:via-gray-300{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.sm\:via-gray-400{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.sm\:via-gray-500{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.sm\:via-gray-600{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.sm\:via-gray-700{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.sm\:via-gray-800{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.sm\:via-gray-900{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.sm\:via-red-100{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.sm\:via-red-200{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.sm\:via-red-300{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.sm\:via-red-400{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.sm\:via-red-500{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.sm\:via-red-600{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.sm\:via-red-700{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.sm\:via-red-800{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.sm\:via-red-900{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.sm\:via-orange-100{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.sm\:via-orange-200{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.sm\:via-orange-300{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.sm\:via-orange-400{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.sm\:via-orange-500{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.sm\:via-orange-600{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.sm\:via-orange-700{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.sm\:via-orange-800{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.sm\:via-orange-900{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.sm\:via-yellow-100{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.sm\:via-yellow-200{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.sm\:via-yellow-300{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.sm\:via-yellow-400{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.sm\:via-yellow-500{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.sm\:via-yellow-600{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.sm\:via-yellow-700{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.sm\:via-yellow-800{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.sm\:via-yellow-900{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.sm\:via-green-100{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.sm\:via-green-200{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.sm\:via-green-300{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.sm\:via-green-400{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.sm\:via-green-500{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.sm\:via-green-600{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.sm\:via-green-700{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.sm\:via-green-800{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.sm\:via-green-900{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.sm\:via-teal-100{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.sm\:via-teal-200{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.sm\:via-teal-300{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.sm\:via-teal-400{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.sm\:via-teal-500{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.sm\:via-teal-600{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.sm\:via-teal-700{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.sm\:via-teal-800{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.sm\:via-teal-900{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.sm\:via-blue-100{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.sm\:via-blue-200{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.sm\:via-blue-300{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.sm\:via-blue-400{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.sm\:via-blue-500{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.sm\:via-blue-600{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.sm\:via-blue-700{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.sm\:via-blue-800{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.sm\:via-blue-900{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.sm\:via-indigo-100{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.sm\:via-indigo-200{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.sm\:via-indigo-300{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.sm\:via-indigo-400{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.sm\:via-indigo-500{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.sm\:via-indigo-600{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.sm\:via-indigo-700{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.sm\:via-indigo-800{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.sm\:via-indigo-900{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.sm\:via-purple-100{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.sm\:via-purple-200{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.sm\:via-purple-300{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.sm\:via-purple-400{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.sm\:via-purple-500{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.sm\:via-purple-600{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.sm\:via-purple-700{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.sm\:via-purple-800{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.sm\:via-purple-900{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.sm\:via-pink-100{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.sm\:via-pink-200{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.sm\:via-pink-300{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.sm\:via-pink-400{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.sm\:via-pink-500{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.sm\:via-pink-600{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.sm\:via-pink-700{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.sm\:via-pink-800{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.sm\:via-pink-900{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.sm\:to-transparent{--gradient-to-color:transparent}.sm\:to-current{--gradient-to-color:currentColor}.sm\:to-black{--gradient-to-color:#000}.sm\:to-white{--gradient-to-color:#fff}.sm\:to-gray-100{--gradient-to-color:#f7fafc}.sm\:to-gray-200{--gradient-to-color:#edf2f7}.sm\:to-gray-300{--gradient-to-color:#e2e8f0}.sm\:to-gray-400{--gradient-to-color:#cbd5e0}.sm\:to-gray-500{--gradient-to-color:#a0aec0}.sm\:to-gray-600{--gradient-to-color:#718096}.sm\:to-gray-700{--gradient-to-color:#4a5568}.sm\:to-gray-800{--gradient-to-color:#2d3748}.sm\:to-gray-900{--gradient-to-color:#1a202c}.sm\:to-red-100{--gradient-to-color:#fff5f5}.sm\:to-red-200{--gradient-to-color:#fed7d7}.sm\:to-red-300{--gradient-to-color:#feb2b2}.sm\:to-red-400{--gradient-to-color:#fc8181}.sm\:to-red-500{--gradient-to-color:#f56565}.sm\:to-red-600{--gradient-to-color:#e53e3e}.sm\:to-red-700{--gradient-to-color:#c53030}.sm\:to-red-800{--gradient-to-color:#9b2c2c}.sm\:to-red-900{--gradient-to-color:#742a2a}.sm\:to-orange-100{--gradient-to-color:#fffaf0}.sm\:to-orange-200{--gradient-to-color:#feebc8}.sm\:to-orange-300{--gradient-to-color:#fbd38d}.sm\:to-orange-400{--gradient-to-color:#f6ad55}.sm\:to-orange-500{--gradient-to-color:#ed8936}.sm\:to-orange-600{--gradient-to-color:#dd6b20}.sm\:to-orange-700{--gradient-to-color:#c05621}.sm\:to-orange-800{--gradient-to-color:#9c4221}.sm\:to-orange-900{--gradient-to-color:#7b341e}.sm\:to-yellow-100{--gradient-to-color:#fffff0}.sm\:to-yellow-200{--gradient-to-color:#fefcbf}.sm\:to-yellow-300{--gradient-to-color:#faf089}.sm\:to-yellow-400{--gradient-to-color:#f6e05e}.sm\:to-yellow-500{--gradient-to-color:#ecc94b}.sm\:to-yellow-600{--gradient-to-color:#d69e2e}.sm\:to-yellow-700{--gradient-to-color:#b7791f}.sm\:to-yellow-800{--gradient-to-color:#975a16}.sm\:to-yellow-900{--gradient-to-color:#744210}.sm\:to-green-100{--gradient-to-color:#f0fff4}.sm\:to-green-200{--gradient-to-color:#c6f6d5}.sm\:to-green-300{--gradient-to-color:#9ae6b4}.sm\:to-green-400{--gradient-to-color:#68d391}.sm\:to-green-500{--gradient-to-color:#48bb78}.sm\:to-green-600{--gradient-to-color:#38a169}.sm\:to-green-700{--gradient-to-color:#2f855a}.sm\:to-green-800{--gradient-to-color:#276749}.sm\:to-green-900{--gradient-to-color:#22543d}.sm\:to-teal-100{--gradient-to-color:#e6fffa}.sm\:to-teal-200{--gradient-to-color:#b2f5ea}.sm\:to-teal-300{--gradient-to-color:#81e6d9}.sm\:to-teal-400{--gradient-to-color:#4fd1c5}.sm\:to-teal-500{--gradient-to-color:#38b2ac}.sm\:to-teal-600{--gradient-to-color:#319795}.sm\:to-teal-700{--gradient-to-color:#2c7a7b}.sm\:to-teal-800{--gradient-to-color:#285e61}.sm\:to-teal-900{--gradient-to-color:#234e52}.sm\:to-blue-100{--gradient-to-color:#ebf8ff}.sm\:to-blue-200{--gradient-to-color:#bee3f8}.sm\:to-blue-300{--gradient-to-color:#90cdf4}.sm\:to-blue-400{--gradient-to-color:#63b3ed}.sm\:to-blue-500{--gradient-to-color:#4299e1}.sm\:to-blue-600{--gradient-to-color:#3182ce}.sm\:to-blue-700{--gradient-to-color:#2b6cb0}.sm\:to-blue-800{--gradient-to-color:#2c5282}.sm\:to-blue-900{--gradient-to-color:#2a4365}.sm\:to-indigo-100{--gradient-to-color:#ebf4ff}.sm\:to-indigo-200{--gradient-to-color:#c3dafe}.sm\:to-indigo-300{--gradient-to-color:#a3bffa}.sm\:to-indigo-400{--gradient-to-color:#7f9cf5}.sm\:to-indigo-500{--gradient-to-color:#667eea}.sm\:to-indigo-600{--gradient-to-color:#5a67d8}.sm\:to-indigo-700{--gradient-to-color:#4c51bf}.sm\:to-indigo-800{--gradient-to-color:#434190}.sm\:to-indigo-900{--gradient-to-color:#3c366b}.sm\:to-purple-100{--gradient-to-color:#faf5ff}.sm\:to-purple-200{--gradient-to-color:#e9d8fd}.sm\:to-purple-300{--gradient-to-color:#d6bcfa}.sm\:to-purple-400{--gradient-to-color:#b794f4}.sm\:to-purple-500{--gradient-to-color:#9f7aea}.sm\:to-purple-600{--gradient-to-color:#805ad5}.sm\:to-purple-700{--gradient-to-color:#6b46c1}.sm\:to-purple-800{--gradient-to-color:#553c9a}.sm\:to-purple-900{--gradient-to-color:#44337a}.sm\:to-pink-100{--gradient-to-color:#fff5f7}.sm\:to-pink-200{--gradient-to-color:#fed7e2}.sm\:to-pink-300{--gradient-to-color:#fbb6ce}.sm\:to-pink-400{--gradient-to-color:#f687b3}.sm\:to-pink-500{--gradient-to-color:#ed64a6}.sm\:to-pink-600{--gradient-to-color:#d53f8c}.sm\:to-pink-700{--gradient-to-color:#b83280}.sm\:to-pink-800{--gradient-to-color:#97266d}.sm\:to-pink-900{--gradient-to-color:#702459}.sm\:hover\:from-transparent:hover{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:hover\:from-current:hover{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:hover\:from-black:hover{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:hover\:from-white:hover{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:hover\:from-gray-100:hover{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.sm\:hover\:from-gray-200:hover{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.sm\:hover\:from-gray-300:hover{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.sm\:hover\:from-gray-400:hover{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.sm\:hover\:from-gray-500:hover{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.sm\:hover\:from-gray-600:hover{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.sm\:hover\:from-gray-700:hover{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.sm\:hover\:from-gray-800:hover{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.sm\:hover\:from-gray-900:hover{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.sm\:hover\:from-red-100:hover{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.sm\:hover\:from-red-200:hover{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.sm\:hover\:from-red-300:hover{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.sm\:hover\:from-red-400:hover{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.sm\:hover\:from-red-500:hover{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.sm\:hover\:from-red-600:hover{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.sm\:hover\:from-red-700:hover{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.sm\:hover\:from-red-800:hover{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.sm\:hover\:from-red-900:hover{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.sm\:hover\:from-orange-100:hover{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.sm\:hover\:from-orange-200:hover{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.sm\:hover\:from-orange-300:hover{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.sm\:hover\:from-orange-400:hover{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.sm\:hover\:from-orange-500:hover{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.sm\:hover\:from-orange-600:hover{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.sm\:hover\:from-orange-700:hover{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.sm\:hover\:from-orange-800:hover{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.sm\:hover\:from-orange-900:hover{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.sm\:hover\:from-yellow-100:hover{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.sm\:hover\:from-yellow-200:hover{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.sm\:hover\:from-yellow-300:hover{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.sm\:hover\:from-yellow-400:hover{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.sm\:hover\:from-yellow-500:hover{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.sm\:hover\:from-yellow-600:hover{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.sm\:hover\:from-yellow-700:hover{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.sm\:hover\:from-yellow-800:hover{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.sm\:hover\:from-yellow-900:hover{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.sm\:hover\:from-green-100:hover{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.sm\:hover\:from-green-200:hover{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.sm\:hover\:from-green-300:hover{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.sm\:hover\:from-green-400:hover{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.sm\:hover\:from-green-500:hover{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.sm\:hover\:from-green-600:hover{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.sm\:hover\:from-green-700:hover{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.sm\:hover\:from-green-800:hover{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.sm\:hover\:from-green-900:hover{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.sm\:hover\:from-teal-100:hover{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.sm\:hover\:from-teal-200:hover{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.sm\:hover\:from-teal-300:hover{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.sm\:hover\:from-teal-400:hover{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.sm\:hover\:from-teal-500:hover{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.sm\:hover\:from-teal-600:hover{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.sm\:hover\:from-teal-700:hover{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.sm\:hover\:from-teal-800:hover{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.sm\:hover\:from-teal-900:hover{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.sm\:hover\:from-blue-100:hover{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.sm\:hover\:from-blue-200:hover{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.sm\:hover\:from-blue-300:hover{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.sm\:hover\:from-blue-400:hover{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.sm\:hover\:from-blue-500:hover{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.sm\:hover\:from-blue-600:hover{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.sm\:hover\:from-blue-700:hover{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.sm\:hover\:from-blue-800:hover{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.sm\:hover\:from-blue-900:hover{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.sm\:hover\:from-indigo-100:hover{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.sm\:hover\:from-indigo-200:hover{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.sm\:hover\:from-indigo-300:hover{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.sm\:hover\:from-indigo-400:hover{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.sm\:hover\:from-indigo-500:hover{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.sm\:hover\:from-indigo-600:hover{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.sm\:hover\:from-indigo-700:hover{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.sm\:hover\:from-indigo-800:hover{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.sm\:hover\:from-indigo-900:hover{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.sm\:hover\:from-purple-100:hover{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.sm\:hover\:from-purple-200:hover{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.sm\:hover\:from-purple-300:hover{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.sm\:hover\:from-purple-400:hover{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.sm\:hover\:from-purple-500:hover{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.sm\:hover\:from-purple-600:hover{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.sm\:hover\:from-purple-700:hover{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.sm\:hover\:from-purple-800:hover{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.sm\:hover\:from-purple-900:hover{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.sm\:hover\:from-pink-100:hover{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.sm\:hover\:from-pink-200:hover{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.sm\:hover\:from-pink-300:hover{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.sm\:hover\:from-pink-400:hover{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.sm\:hover\:from-pink-500:hover{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.sm\:hover\:from-pink-600:hover{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.sm\:hover\:from-pink-700:hover{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.sm\:hover\:from-pink-800:hover{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.sm\:hover\:from-pink-900:hover{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.sm\:hover\:via-transparent:hover{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:hover\:via-current:hover{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:hover\:via-black:hover{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:hover\:via-white:hover{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:hover\:via-gray-100:hover{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.sm\:hover\:via-gray-200:hover{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.sm\:hover\:via-gray-300:hover{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.sm\:hover\:via-gray-400:hover{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.sm\:hover\:via-gray-500:hover{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.sm\:hover\:via-gray-600:hover{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.sm\:hover\:via-gray-700:hover{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.sm\:hover\:via-gray-800:hover{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.sm\:hover\:via-gray-900:hover{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.sm\:hover\:via-red-100:hover{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.sm\:hover\:via-red-200:hover{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.sm\:hover\:via-red-300:hover{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.sm\:hover\:via-red-400:hover{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.sm\:hover\:via-red-500:hover{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.sm\:hover\:via-red-600:hover{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.sm\:hover\:via-red-700:hover{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.sm\:hover\:via-red-800:hover{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.sm\:hover\:via-red-900:hover{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.sm\:hover\:via-orange-100:hover{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.sm\:hover\:via-orange-200:hover{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.sm\:hover\:via-orange-300:hover{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.sm\:hover\:via-orange-400:hover{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.sm\:hover\:via-orange-500:hover{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.sm\:hover\:via-orange-600:hover{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.sm\:hover\:via-orange-700:hover{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.sm\:hover\:via-orange-800:hover{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.sm\:hover\:via-orange-900:hover{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.sm\:hover\:via-yellow-100:hover{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.sm\:hover\:via-yellow-200:hover{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.sm\:hover\:via-yellow-300:hover{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.sm\:hover\:via-yellow-400:hover{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.sm\:hover\:via-yellow-500:hover{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.sm\:hover\:via-yellow-600:hover{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.sm\:hover\:via-yellow-700:hover{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.sm\:hover\:via-yellow-800:hover{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.sm\:hover\:via-yellow-900:hover{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.sm\:hover\:via-green-100:hover{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.sm\:hover\:via-green-200:hover{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.sm\:hover\:via-green-300:hover{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.sm\:hover\:via-green-400:hover{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.sm\:hover\:via-green-500:hover{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.sm\:hover\:via-green-600:hover{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.sm\:hover\:via-green-700:hover{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.sm\:hover\:via-green-800:hover{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.sm\:hover\:via-green-900:hover{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.sm\:hover\:via-teal-100:hover{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.sm\:hover\:via-teal-200:hover{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.sm\:hover\:via-teal-300:hover{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.sm\:hover\:via-teal-400:hover{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.sm\:hover\:via-teal-500:hover{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.sm\:hover\:via-teal-600:hover{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.sm\:hover\:via-teal-700:hover{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.sm\:hover\:via-teal-800:hover{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.sm\:hover\:via-teal-900:hover{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.sm\:hover\:via-blue-100:hover{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.sm\:hover\:via-blue-200:hover{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.sm\:hover\:via-blue-300:hover{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.sm\:hover\:via-blue-400:hover{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.sm\:hover\:via-blue-500:hover{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.sm\:hover\:via-blue-600:hover{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.sm\:hover\:via-blue-700:hover{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.sm\:hover\:via-blue-800:hover{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.sm\:hover\:via-blue-900:hover{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.sm\:hover\:via-indigo-100:hover{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.sm\:hover\:via-indigo-200:hover{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.sm\:hover\:via-indigo-300:hover{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.sm\:hover\:via-indigo-400:hover{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.sm\:hover\:via-indigo-500:hover{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.sm\:hover\:via-indigo-600:hover{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.sm\:hover\:via-indigo-700:hover{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.sm\:hover\:via-indigo-800:hover{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.sm\:hover\:via-indigo-900:hover{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.sm\:hover\:via-purple-100:hover{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.sm\:hover\:via-purple-200:hover{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.sm\:hover\:via-purple-300:hover{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.sm\:hover\:via-purple-400:hover{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.sm\:hover\:via-purple-500:hover{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.sm\:hover\:via-purple-600:hover{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.sm\:hover\:via-purple-700:hover{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.sm\:hover\:via-purple-800:hover{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.sm\:hover\:via-purple-900:hover{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.sm\:hover\:via-pink-100:hover{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.sm\:hover\:via-pink-200:hover{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.sm\:hover\:via-pink-300:hover{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.sm\:hover\:via-pink-400:hover{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.sm\:hover\:via-pink-500:hover{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.sm\:hover\:via-pink-600:hover{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.sm\:hover\:via-pink-700:hover{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.sm\:hover\:via-pink-800:hover{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.sm\:hover\:via-pink-900:hover{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.sm\:hover\:to-transparent:hover{--gradient-to-color:transparent}.sm\:hover\:to-current:hover{--gradient-to-color:currentColor}.sm\:hover\:to-black:hover{--gradient-to-color:#000}.sm\:hover\:to-white:hover{--gradient-to-color:#fff}.sm\:hover\:to-gray-100:hover{--gradient-to-color:#f7fafc}.sm\:hover\:to-gray-200:hover{--gradient-to-color:#edf2f7}.sm\:hover\:to-gray-300:hover{--gradient-to-color:#e2e8f0}.sm\:hover\:to-gray-400:hover{--gradient-to-color:#cbd5e0}.sm\:hover\:to-gray-500:hover{--gradient-to-color:#a0aec0}.sm\:hover\:to-gray-600:hover{--gradient-to-color:#718096}.sm\:hover\:to-gray-700:hover{--gradient-to-color:#4a5568}.sm\:hover\:to-gray-800:hover{--gradient-to-color:#2d3748}.sm\:hover\:to-gray-900:hover{--gradient-to-color:#1a202c}.sm\:hover\:to-red-100:hover{--gradient-to-color:#fff5f5}.sm\:hover\:to-red-200:hover{--gradient-to-color:#fed7d7}.sm\:hover\:to-red-300:hover{--gradient-to-color:#feb2b2}.sm\:hover\:to-red-400:hover{--gradient-to-color:#fc8181}.sm\:hover\:to-red-500:hover{--gradient-to-color:#f56565}.sm\:hover\:to-red-600:hover{--gradient-to-color:#e53e3e}.sm\:hover\:to-red-700:hover{--gradient-to-color:#c53030}.sm\:hover\:to-red-800:hover{--gradient-to-color:#9b2c2c}.sm\:hover\:to-red-900:hover{--gradient-to-color:#742a2a}.sm\:hover\:to-orange-100:hover{--gradient-to-color:#fffaf0}.sm\:hover\:to-orange-200:hover{--gradient-to-color:#feebc8}.sm\:hover\:to-orange-300:hover{--gradient-to-color:#fbd38d}.sm\:hover\:to-orange-400:hover{--gradient-to-color:#f6ad55}.sm\:hover\:to-orange-500:hover{--gradient-to-color:#ed8936}.sm\:hover\:to-orange-600:hover{--gradient-to-color:#dd6b20}.sm\:hover\:to-orange-700:hover{--gradient-to-color:#c05621}.sm\:hover\:to-orange-800:hover{--gradient-to-color:#9c4221}.sm\:hover\:to-orange-900:hover{--gradient-to-color:#7b341e}.sm\:hover\:to-yellow-100:hover{--gradient-to-color:#fffff0}.sm\:hover\:to-yellow-200:hover{--gradient-to-color:#fefcbf}.sm\:hover\:to-yellow-300:hover{--gradient-to-color:#faf089}.sm\:hover\:to-yellow-400:hover{--gradient-to-color:#f6e05e}.sm\:hover\:to-yellow-500:hover{--gradient-to-color:#ecc94b}.sm\:hover\:to-yellow-600:hover{--gradient-to-color:#d69e2e}.sm\:hover\:to-yellow-700:hover{--gradient-to-color:#b7791f}.sm\:hover\:to-yellow-800:hover{--gradient-to-color:#975a16}.sm\:hover\:to-yellow-900:hover{--gradient-to-color:#744210}.sm\:hover\:to-green-100:hover{--gradient-to-color:#f0fff4}.sm\:hover\:to-green-200:hover{--gradient-to-color:#c6f6d5}.sm\:hover\:to-green-300:hover{--gradient-to-color:#9ae6b4}.sm\:hover\:to-green-400:hover{--gradient-to-color:#68d391}.sm\:hover\:to-green-500:hover{--gradient-to-color:#48bb78}.sm\:hover\:to-green-600:hover{--gradient-to-color:#38a169}.sm\:hover\:to-green-700:hover{--gradient-to-color:#2f855a}.sm\:hover\:to-green-800:hover{--gradient-to-color:#276749}.sm\:hover\:to-green-900:hover{--gradient-to-color:#22543d}.sm\:hover\:to-teal-100:hover{--gradient-to-color:#e6fffa}.sm\:hover\:to-teal-200:hover{--gradient-to-color:#b2f5ea}.sm\:hover\:to-teal-300:hover{--gradient-to-color:#81e6d9}.sm\:hover\:to-teal-400:hover{--gradient-to-color:#4fd1c5}.sm\:hover\:to-teal-500:hover{--gradient-to-color:#38b2ac}.sm\:hover\:to-teal-600:hover{--gradient-to-color:#319795}.sm\:hover\:to-teal-700:hover{--gradient-to-color:#2c7a7b}.sm\:hover\:to-teal-800:hover{--gradient-to-color:#285e61}.sm\:hover\:to-teal-900:hover{--gradient-to-color:#234e52}.sm\:hover\:to-blue-100:hover{--gradient-to-color:#ebf8ff}.sm\:hover\:to-blue-200:hover{--gradient-to-color:#bee3f8}.sm\:hover\:to-blue-300:hover{--gradient-to-color:#90cdf4}.sm\:hover\:to-blue-400:hover{--gradient-to-color:#63b3ed}.sm\:hover\:to-blue-500:hover{--gradient-to-color:#4299e1}.sm\:hover\:to-blue-600:hover{--gradient-to-color:#3182ce}.sm\:hover\:to-blue-700:hover{--gradient-to-color:#2b6cb0}.sm\:hover\:to-blue-800:hover{--gradient-to-color:#2c5282}.sm\:hover\:to-blue-900:hover{--gradient-to-color:#2a4365}.sm\:hover\:to-indigo-100:hover{--gradient-to-color:#ebf4ff}.sm\:hover\:to-indigo-200:hover{--gradient-to-color:#c3dafe}.sm\:hover\:to-indigo-300:hover{--gradient-to-color:#a3bffa}.sm\:hover\:to-indigo-400:hover{--gradient-to-color:#7f9cf5}.sm\:hover\:to-indigo-500:hover{--gradient-to-color:#667eea}.sm\:hover\:to-indigo-600:hover{--gradient-to-color:#5a67d8}.sm\:hover\:to-indigo-700:hover{--gradient-to-color:#4c51bf}.sm\:hover\:to-indigo-800:hover{--gradient-to-color:#434190}.sm\:hover\:to-indigo-900:hover{--gradient-to-color:#3c366b}.sm\:hover\:to-purple-100:hover{--gradient-to-color:#faf5ff}.sm\:hover\:to-purple-200:hover{--gradient-to-color:#e9d8fd}.sm\:hover\:to-purple-300:hover{--gradient-to-color:#d6bcfa}.sm\:hover\:to-purple-400:hover{--gradient-to-color:#b794f4}.sm\:hover\:to-purple-500:hover{--gradient-to-color:#9f7aea}.sm\:hover\:to-purple-600:hover{--gradient-to-color:#805ad5}.sm\:hover\:to-purple-700:hover{--gradient-to-color:#6b46c1}.sm\:hover\:to-purple-800:hover{--gradient-to-color:#553c9a}.sm\:hover\:to-purple-900:hover{--gradient-to-color:#44337a}.sm\:hover\:to-pink-100:hover{--gradient-to-color:#fff5f7}.sm\:hover\:to-pink-200:hover{--gradient-to-color:#fed7e2}.sm\:hover\:to-pink-300:hover{--gradient-to-color:#fbb6ce}.sm\:hover\:to-pink-400:hover{--gradient-to-color:#f687b3}.sm\:hover\:to-pink-500:hover{--gradient-to-color:#ed64a6}.sm\:hover\:to-pink-600:hover{--gradient-to-color:#d53f8c}.sm\:hover\:to-pink-700:hover{--gradient-to-color:#b83280}.sm\:hover\:to-pink-800:hover{--gradient-to-color:#97266d}.sm\:hover\:to-pink-900:hover{--gradient-to-color:#702459}.sm\:focus\:from-transparent:focus{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:focus\:from-current:focus{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:focus\:from-black:focus{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:focus\:from-white:focus{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:focus\:from-gray-100:focus{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.sm\:focus\:from-gray-200:focus{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.sm\:focus\:from-gray-300:focus{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.sm\:focus\:from-gray-400:focus{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.sm\:focus\:from-gray-500:focus{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.sm\:focus\:from-gray-600:focus{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.sm\:focus\:from-gray-700:focus{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.sm\:focus\:from-gray-800:focus{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.sm\:focus\:from-gray-900:focus{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.sm\:focus\:from-red-100:focus{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.sm\:focus\:from-red-200:focus{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.sm\:focus\:from-red-300:focus{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.sm\:focus\:from-red-400:focus{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.sm\:focus\:from-red-500:focus{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.sm\:focus\:from-red-600:focus{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.sm\:focus\:from-red-700:focus{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.sm\:focus\:from-red-800:focus{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.sm\:focus\:from-red-900:focus{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.sm\:focus\:from-orange-100:focus{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.sm\:focus\:from-orange-200:focus{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.sm\:focus\:from-orange-300:focus{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.sm\:focus\:from-orange-400:focus{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.sm\:focus\:from-orange-500:focus{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.sm\:focus\:from-orange-600:focus{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.sm\:focus\:from-orange-700:focus{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.sm\:focus\:from-orange-800:focus{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.sm\:focus\:from-orange-900:focus{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.sm\:focus\:from-yellow-100:focus{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.sm\:focus\:from-yellow-200:focus{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.sm\:focus\:from-yellow-300:focus{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.sm\:focus\:from-yellow-400:focus{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.sm\:focus\:from-yellow-500:focus{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.sm\:focus\:from-yellow-600:focus{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.sm\:focus\:from-yellow-700:focus{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.sm\:focus\:from-yellow-800:focus{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.sm\:focus\:from-yellow-900:focus{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.sm\:focus\:from-green-100:focus{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.sm\:focus\:from-green-200:focus{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.sm\:focus\:from-green-300:focus{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.sm\:focus\:from-green-400:focus{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.sm\:focus\:from-green-500:focus{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.sm\:focus\:from-green-600:focus{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.sm\:focus\:from-green-700:focus{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.sm\:focus\:from-green-800:focus{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.sm\:focus\:from-green-900:focus{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.sm\:focus\:from-teal-100:focus{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.sm\:focus\:from-teal-200:focus{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.sm\:focus\:from-teal-300:focus{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.sm\:focus\:from-teal-400:focus{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.sm\:focus\:from-teal-500:focus{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.sm\:focus\:from-teal-600:focus{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.sm\:focus\:from-teal-700:focus{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.sm\:focus\:from-teal-800:focus{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.sm\:focus\:from-teal-900:focus{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.sm\:focus\:from-blue-100:focus{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.sm\:focus\:from-blue-200:focus{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.sm\:focus\:from-blue-300:focus{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.sm\:focus\:from-blue-400:focus{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.sm\:focus\:from-blue-500:focus{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.sm\:focus\:from-blue-600:focus{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.sm\:focus\:from-blue-700:focus{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.sm\:focus\:from-blue-800:focus{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.sm\:focus\:from-blue-900:focus{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.sm\:focus\:from-indigo-100:focus{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.sm\:focus\:from-indigo-200:focus{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.sm\:focus\:from-indigo-300:focus{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.sm\:focus\:from-indigo-400:focus{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.sm\:focus\:from-indigo-500:focus{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.sm\:focus\:from-indigo-600:focus{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.sm\:focus\:from-indigo-700:focus{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.sm\:focus\:from-indigo-800:focus{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.sm\:focus\:from-indigo-900:focus{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.sm\:focus\:from-purple-100:focus{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.sm\:focus\:from-purple-200:focus{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.sm\:focus\:from-purple-300:focus{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.sm\:focus\:from-purple-400:focus{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.sm\:focus\:from-purple-500:focus{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.sm\:focus\:from-purple-600:focus{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.sm\:focus\:from-purple-700:focus{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.sm\:focus\:from-purple-800:focus{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.sm\:focus\:from-purple-900:focus{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.sm\:focus\:from-pink-100:focus{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.sm\:focus\:from-pink-200:focus{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.sm\:focus\:from-pink-300:focus{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.sm\:focus\:from-pink-400:focus{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.sm\:focus\:from-pink-500:focus{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.sm\:focus\:from-pink-600:focus{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.sm\:focus\:from-pink-700:focus{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.sm\:focus\:from-pink-800:focus{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.sm\:focus\:from-pink-900:focus{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.sm\:focus\:via-transparent:focus{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:focus\:via-current:focus{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:focus\:via-black:focus{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.sm\:focus\:via-white:focus{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.sm\:focus\:via-gray-100:focus{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.sm\:focus\:via-gray-200:focus{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.sm\:focus\:via-gray-300:focus{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.sm\:focus\:via-gray-400:focus{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.sm\:focus\:via-gray-500:focus{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.sm\:focus\:via-gray-600:focus{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.sm\:focus\:via-gray-700:focus{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.sm\:focus\:via-gray-800:focus{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.sm\:focus\:via-gray-900:focus{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.sm\:focus\:via-red-100:focus{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.sm\:focus\:via-red-200:focus{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.sm\:focus\:via-red-300:focus{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.sm\:focus\:via-red-400:focus{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.sm\:focus\:via-red-500:focus{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.sm\:focus\:via-red-600:focus{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.sm\:focus\:via-red-700:focus{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.sm\:focus\:via-red-800:focus{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.sm\:focus\:via-red-900:focus{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.sm\:focus\:via-orange-100:focus{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.sm\:focus\:via-orange-200:focus{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.sm\:focus\:via-orange-300:focus{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.sm\:focus\:via-orange-400:focus{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.sm\:focus\:via-orange-500:focus{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.sm\:focus\:via-orange-600:focus{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.sm\:focus\:via-orange-700:focus{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.sm\:focus\:via-orange-800:focus{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.sm\:focus\:via-orange-900:focus{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.sm\:focus\:via-yellow-100:focus{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.sm\:focus\:via-yellow-200:focus{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.sm\:focus\:via-yellow-300:focus{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.sm\:focus\:via-yellow-400:focus{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.sm\:focus\:via-yellow-500:focus{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.sm\:focus\:via-yellow-600:focus{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.sm\:focus\:via-yellow-700:focus{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.sm\:focus\:via-yellow-800:focus{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.sm\:focus\:via-yellow-900:focus{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.sm\:focus\:via-green-100:focus{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.sm\:focus\:via-green-200:focus{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.sm\:focus\:via-green-300:focus{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.sm\:focus\:via-green-400:focus{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.sm\:focus\:via-green-500:focus{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.sm\:focus\:via-green-600:focus{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.sm\:focus\:via-green-700:focus{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.sm\:focus\:via-green-800:focus{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.sm\:focus\:via-green-900:focus{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.sm\:focus\:via-teal-100:focus{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.sm\:focus\:via-teal-200:focus{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.sm\:focus\:via-teal-300:focus{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.sm\:focus\:via-teal-400:focus{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.sm\:focus\:via-teal-500:focus{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.sm\:focus\:via-teal-600:focus{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.sm\:focus\:via-teal-700:focus{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.sm\:focus\:via-teal-800:focus{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.sm\:focus\:via-teal-900:focus{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.sm\:focus\:via-blue-100:focus{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.sm\:focus\:via-blue-200:focus{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.sm\:focus\:via-blue-300:focus{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.sm\:focus\:via-blue-400:focus{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.sm\:focus\:via-blue-500:focus{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.sm\:focus\:via-blue-600:focus{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.sm\:focus\:via-blue-700:focus{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.sm\:focus\:via-blue-800:focus{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.sm\:focus\:via-blue-900:focus{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.sm\:focus\:via-indigo-100:focus{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.sm\:focus\:via-indigo-200:focus{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.sm\:focus\:via-indigo-300:focus{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.sm\:focus\:via-indigo-400:focus{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.sm\:focus\:via-indigo-500:focus{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.sm\:focus\:via-indigo-600:focus{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.sm\:focus\:via-indigo-700:focus{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.sm\:focus\:via-indigo-800:focus{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.sm\:focus\:via-indigo-900:focus{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.sm\:focus\:via-purple-100:focus{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.sm\:focus\:via-purple-200:focus{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.sm\:focus\:via-purple-300:focus{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.sm\:focus\:via-purple-400:focus{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.sm\:focus\:via-purple-500:focus{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.sm\:focus\:via-purple-600:focus{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.sm\:focus\:via-purple-700:focus{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.sm\:focus\:via-purple-800:focus{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.sm\:focus\:via-purple-900:focus{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.sm\:focus\:via-pink-100:focus{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.sm\:focus\:via-pink-200:focus{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.sm\:focus\:via-pink-300:focus{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.sm\:focus\:via-pink-400:focus{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.sm\:focus\:via-pink-500:focus{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.sm\:focus\:via-pink-600:focus{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.sm\:focus\:via-pink-700:focus{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.sm\:focus\:via-pink-800:focus{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.sm\:focus\:via-pink-900:focus{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.sm\:focus\:to-transparent:focus{--gradient-to-color:transparent}.sm\:focus\:to-current:focus{--gradient-to-color:currentColor}.sm\:focus\:to-black:focus{--gradient-to-color:#000}.sm\:focus\:to-white:focus{--gradient-to-color:#fff}.sm\:focus\:to-gray-100:focus{--gradient-to-color:#f7fafc}.sm\:focus\:to-gray-200:focus{--gradient-to-color:#edf2f7}.sm\:focus\:to-gray-300:focus{--gradient-to-color:#e2e8f0}.sm\:focus\:to-gray-400:focus{--gradient-to-color:#cbd5e0}.sm\:focus\:to-gray-500:focus{--gradient-to-color:#a0aec0}.sm\:focus\:to-gray-600:focus{--gradient-to-color:#718096}.sm\:focus\:to-gray-700:focus{--gradient-to-color:#4a5568}.sm\:focus\:to-gray-800:focus{--gradient-to-color:#2d3748}.sm\:focus\:to-gray-900:focus{--gradient-to-color:#1a202c}.sm\:focus\:to-red-100:focus{--gradient-to-color:#fff5f5}.sm\:focus\:to-red-200:focus{--gradient-to-color:#fed7d7}.sm\:focus\:to-red-300:focus{--gradient-to-color:#feb2b2}.sm\:focus\:to-red-400:focus{--gradient-to-color:#fc8181}.sm\:focus\:to-red-500:focus{--gradient-to-color:#f56565}.sm\:focus\:to-red-600:focus{--gradient-to-color:#e53e3e}.sm\:focus\:to-red-700:focus{--gradient-to-color:#c53030}.sm\:focus\:to-red-800:focus{--gradient-to-color:#9b2c2c}.sm\:focus\:to-red-900:focus{--gradient-to-color:#742a2a}.sm\:focus\:to-orange-100:focus{--gradient-to-color:#fffaf0}.sm\:focus\:to-orange-200:focus{--gradient-to-color:#feebc8}.sm\:focus\:to-orange-300:focus{--gradient-to-color:#fbd38d}.sm\:focus\:to-orange-400:focus{--gradient-to-color:#f6ad55}.sm\:focus\:to-orange-500:focus{--gradient-to-color:#ed8936}.sm\:focus\:to-orange-600:focus{--gradient-to-color:#dd6b20}.sm\:focus\:to-orange-700:focus{--gradient-to-color:#c05621}.sm\:focus\:to-orange-800:focus{--gradient-to-color:#9c4221}.sm\:focus\:to-orange-900:focus{--gradient-to-color:#7b341e}.sm\:focus\:to-yellow-100:focus{--gradient-to-color:#fffff0}.sm\:focus\:to-yellow-200:focus{--gradient-to-color:#fefcbf}.sm\:focus\:to-yellow-300:focus{--gradient-to-color:#faf089}.sm\:focus\:to-yellow-400:focus{--gradient-to-color:#f6e05e}.sm\:focus\:to-yellow-500:focus{--gradient-to-color:#ecc94b}.sm\:focus\:to-yellow-600:focus{--gradient-to-color:#d69e2e}.sm\:focus\:to-yellow-700:focus{--gradient-to-color:#b7791f}.sm\:focus\:to-yellow-800:focus{--gradient-to-color:#975a16}.sm\:focus\:to-yellow-900:focus{--gradient-to-color:#744210}.sm\:focus\:to-green-100:focus{--gradient-to-color:#f0fff4}.sm\:focus\:to-green-200:focus{--gradient-to-color:#c6f6d5}.sm\:focus\:to-green-300:focus{--gradient-to-color:#9ae6b4}.sm\:focus\:to-green-400:focus{--gradient-to-color:#68d391}.sm\:focus\:to-green-500:focus{--gradient-to-color:#48bb78}.sm\:focus\:to-green-600:focus{--gradient-to-color:#38a169}.sm\:focus\:to-green-700:focus{--gradient-to-color:#2f855a}.sm\:focus\:to-green-800:focus{--gradient-to-color:#276749}.sm\:focus\:to-green-900:focus{--gradient-to-color:#22543d}.sm\:focus\:to-teal-100:focus{--gradient-to-color:#e6fffa}.sm\:focus\:to-teal-200:focus{--gradient-to-color:#b2f5ea}.sm\:focus\:to-teal-300:focus{--gradient-to-color:#81e6d9}.sm\:focus\:to-teal-400:focus{--gradient-to-color:#4fd1c5}.sm\:focus\:to-teal-500:focus{--gradient-to-color:#38b2ac}.sm\:focus\:to-teal-600:focus{--gradient-to-color:#319795}.sm\:focus\:to-teal-700:focus{--gradient-to-color:#2c7a7b}.sm\:focus\:to-teal-800:focus{--gradient-to-color:#285e61}.sm\:focus\:to-teal-900:focus{--gradient-to-color:#234e52}.sm\:focus\:to-blue-100:focus{--gradient-to-color:#ebf8ff}.sm\:focus\:to-blue-200:focus{--gradient-to-color:#bee3f8}.sm\:focus\:to-blue-300:focus{--gradient-to-color:#90cdf4}.sm\:focus\:to-blue-400:focus{--gradient-to-color:#63b3ed}.sm\:focus\:to-blue-500:focus{--gradient-to-color:#4299e1}.sm\:focus\:to-blue-600:focus{--gradient-to-color:#3182ce}.sm\:focus\:to-blue-700:focus{--gradient-to-color:#2b6cb0}.sm\:focus\:to-blue-800:focus{--gradient-to-color:#2c5282}.sm\:focus\:to-blue-900:focus{--gradient-to-color:#2a4365}.sm\:focus\:to-indigo-100:focus{--gradient-to-color:#ebf4ff}.sm\:focus\:to-indigo-200:focus{--gradient-to-color:#c3dafe}.sm\:focus\:to-indigo-300:focus{--gradient-to-color:#a3bffa}.sm\:focus\:to-indigo-400:focus{--gradient-to-color:#7f9cf5}.sm\:focus\:to-indigo-500:focus{--gradient-to-color:#667eea}.sm\:focus\:to-indigo-600:focus{--gradient-to-color:#5a67d8}.sm\:focus\:to-indigo-700:focus{--gradient-to-color:#4c51bf}.sm\:focus\:to-indigo-800:focus{--gradient-to-color:#434190}.sm\:focus\:to-indigo-900:focus{--gradient-to-color:#3c366b}.sm\:focus\:to-purple-100:focus{--gradient-to-color:#faf5ff}.sm\:focus\:to-purple-200:focus{--gradient-to-color:#e9d8fd}.sm\:focus\:to-purple-300:focus{--gradient-to-color:#d6bcfa}.sm\:focus\:to-purple-400:focus{--gradient-to-color:#b794f4}.sm\:focus\:to-purple-500:focus{--gradient-to-color:#9f7aea}.sm\:focus\:to-purple-600:focus{--gradient-to-color:#805ad5}.sm\:focus\:to-purple-700:focus{--gradient-to-color:#6b46c1}.sm\:focus\:to-purple-800:focus{--gradient-to-color:#553c9a}.sm\:focus\:to-purple-900:focus{--gradient-to-color:#44337a}.sm\:focus\:to-pink-100:focus{--gradient-to-color:#fff5f7}.sm\:focus\:to-pink-200:focus{--gradient-to-color:#fed7e2}.sm\:focus\:to-pink-300:focus{--gradient-to-color:#fbb6ce}.sm\:focus\:to-pink-400:focus{--gradient-to-color:#f687b3}.sm\:focus\:to-pink-500:focus{--gradient-to-color:#ed64a6}.sm\:focus\:to-pink-600:focus{--gradient-to-color:#d53f8c}.sm\:focus\:to-pink-700:focus{--gradient-to-color:#b83280}.sm\:focus\:to-pink-800:focus{--gradient-to-color:#97266d}.sm\:focus\:to-pink-900:focus{--gradient-to-color:#702459}.sm\:bg-opacity-0{--bg-opacity:0}.sm\:bg-opacity-25{--bg-opacity:0.25}.sm\:bg-opacity-50{--bg-opacity:0.5}.sm\:bg-opacity-75{--bg-opacity:0.75}.sm\:bg-opacity-100{--bg-opacity:1}.sm\:hover\:bg-opacity-0:hover{--bg-opacity:0}.sm\:hover\:bg-opacity-25:hover{--bg-opacity:0.25}.sm\:hover\:bg-opacity-50:hover{--bg-opacity:0.5}.sm\:hover\:bg-opacity-75:hover{--bg-opacity:0.75}.sm\:hover\:bg-opacity-100:hover{--bg-opacity:1}.sm\:focus\:bg-opacity-0:focus{--bg-opacity:0}.sm\:focus\:bg-opacity-25:focus{--bg-opacity:0.25}.sm\:focus\:bg-opacity-50:focus{--bg-opacity:0.5}.sm\:focus\:bg-opacity-75:focus{--bg-opacity:0.75}.sm\:focus\:bg-opacity-100:focus{--bg-opacity:1}.sm\:bg-bottom{background-position:bottom}.sm\:bg-center{background-position:center}.sm\:bg-left{background-position:left}.sm\:bg-left-bottom{background-position:left bottom}.sm\:bg-left-top{background-position:left top}.sm\:bg-right{background-position:right}.sm\:bg-right-bottom{background-position:right bottom}.sm\:bg-right-top{background-position:right top}.sm\:bg-top{background-position:top}.sm\:bg-repeat{background-repeat:repeat}.sm\:bg-no-repeat{background-repeat:no-repeat}.sm\:bg-repeat-x{background-repeat:repeat-x}.sm\:bg-repeat-y{background-repeat:repeat-y}.sm\:bg-repeat-round{background-repeat:round}.sm\:bg-repeat-space{background-repeat:space}.sm\:bg-auto{background-size:auto}.sm\:bg-cover{background-size:cover}.sm\:bg-contain{background-size:contain}.sm\:border-collapse{border-collapse:collapse}.sm\:border-separate{border-collapse:separate}.sm\:border-transparent{border-color:transparent}.sm\:border-current{border-color:currentColor}.sm\:border-black{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.sm\:border-white{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.sm\:border-gray-100{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.sm\:border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.sm\:border-gray-300{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.sm\:border-gray-400{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.sm\:border-gray-500{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.sm\:border-gray-600{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.sm\:border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.sm\:border-gray-800{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.sm\:border-gray-900{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.sm\:border-red-100{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.sm\:border-red-200{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.sm\:border-red-300{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.sm\:border-red-400{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.sm\:border-red-500{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.sm\:border-red-600{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.sm\:border-red-700{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.sm\:border-red-800{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.sm\:border-red-900{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.sm\:border-orange-100{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.sm\:border-orange-200{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.sm\:border-orange-300{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.sm\:border-orange-400{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.sm\:border-orange-500{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.sm\:border-orange-600{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.sm\:border-orange-700{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.sm\:border-orange-800{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.sm\:border-orange-900{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.sm\:border-yellow-100{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.sm\:border-yellow-200{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.sm\:border-yellow-300{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.sm\:border-yellow-400{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.sm\:border-yellow-500{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.sm\:border-yellow-600{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.sm\:border-yellow-700{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.sm\:border-yellow-800{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.sm\:border-yellow-900{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.sm\:border-green-100{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.sm\:border-green-200{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.sm\:border-green-300{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.sm\:border-green-400{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.sm\:border-green-500{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.sm\:border-green-600{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.sm\:border-green-700{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.sm\:border-green-800{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.sm\:border-green-900{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.sm\:border-teal-100{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.sm\:border-teal-200{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.sm\:border-teal-300{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.sm\:border-teal-400{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.sm\:border-teal-500{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.sm\:border-teal-600{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.sm\:border-teal-700{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.sm\:border-teal-800{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.sm\:border-teal-900{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.sm\:border-blue-100{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.sm\:border-blue-200{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.sm\:border-blue-300{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.sm\:border-blue-400{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.sm\:border-blue-500{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.sm\:border-blue-600{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.sm\:border-blue-700{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.sm\:border-blue-800{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.sm\:border-blue-900{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.sm\:border-indigo-100{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.sm\:border-indigo-200{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.sm\:border-indigo-300{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.sm\:border-indigo-400{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.sm\:border-indigo-500{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.sm\:border-indigo-600{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.sm\:border-indigo-700{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.sm\:border-indigo-800{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.sm\:border-indigo-900{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.sm\:border-purple-100{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.sm\:border-purple-200{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.sm\:border-purple-300{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.sm\:border-purple-400{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.sm\:border-purple-500{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.sm\:border-purple-600{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.sm\:border-purple-700{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.sm\:border-purple-800{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.sm\:border-purple-900{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.sm\:border-pink-100{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.sm\:border-pink-200{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.sm\:border-pink-300{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.sm\:border-pink-400{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.sm\:border-pink-500{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.sm\:border-pink-600{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.sm\:border-pink-700{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.sm\:border-pink-800{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.sm\:border-pink-900{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.sm\:hover\:border-transparent:hover{border-color:transparent}.sm\:hover\:border-current:hover{border-color:currentColor}.sm\:hover\:border-black:hover{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.sm\:hover\:border-white:hover{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.sm\:hover\:border-gray-100:hover{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.sm\:hover\:border-gray-200:hover{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.sm\:hover\:border-gray-300:hover{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.sm\:hover\:border-gray-400:hover{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.sm\:hover\:border-gray-500:hover{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.sm\:hover\:border-gray-600:hover{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.sm\:hover\:border-gray-700:hover{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.sm\:hover\:border-gray-800:hover{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.sm\:hover\:border-gray-900:hover{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.sm\:hover\:border-red-100:hover{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.sm\:hover\:border-red-200:hover{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.sm\:hover\:border-red-300:hover{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.sm\:hover\:border-red-400:hover{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.sm\:hover\:border-red-500:hover{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.sm\:hover\:border-red-600:hover{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.sm\:hover\:border-red-700:hover{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.sm\:hover\:border-red-800:hover{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.sm\:hover\:border-red-900:hover{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.sm\:hover\:border-orange-100:hover{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.sm\:hover\:border-orange-200:hover{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.sm\:hover\:border-orange-300:hover{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.sm\:hover\:border-orange-400:hover{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.sm\:hover\:border-orange-500:hover{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.sm\:hover\:border-orange-600:hover{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.sm\:hover\:border-orange-700:hover{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.sm\:hover\:border-orange-800:hover{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.sm\:hover\:border-orange-900:hover{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.sm\:hover\:border-yellow-100:hover{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.sm\:hover\:border-yellow-200:hover{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.sm\:hover\:border-yellow-300:hover{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.sm\:hover\:border-yellow-400:hover{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.sm\:hover\:border-yellow-500:hover{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.sm\:hover\:border-yellow-600:hover{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.sm\:hover\:border-yellow-700:hover{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.sm\:hover\:border-yellow-800:hover{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.sm\:hover\:border-yellow-900:hover{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.sm\:hover\:border-green-100:hover{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.sm\:hover\:border-green-200:hover{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.sm\:hover\:border-green-300:hover{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.sm\:hover\:border-green-400:hover{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.sm\:hover\:border-green-500:hover{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.sm\:hover\:border-green-600:hover{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.sm\:hover\:border-green-700:hover{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.sm\:hover\:border-green-800:hover{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.sm\:hover\:border-green-900:hover{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.sm\:hover\:border-teal-100:hover{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.sm\:hover\:border-teal-200:hover{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.sm\:hover\:border-teal-300:hover{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.sm\:hover\:border-teal-400:hover{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.sm\:hover\:border-teal-500:hover{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.sm\:hover\:border-teal-600:hover{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.sm\:hover\:border-teal-700:hover{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.sm\:hover\:border-teal-800:hover{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.sm\:hover\:border-teal-900:hover{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.sm\:hover\:border-blue-100:hover{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.sm\:hover\:border-blue-200:hover{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.sm\:hover\:border-blue-300:hover{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.sm\:hover\:border-blue-400:hover{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.sm\:hover\:border-blue-500:hover{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.sm\:hover\:border-blue-600:hover{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.sm\:hover\:border-blue-700:hover{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.sm\:hover\:border-blue-800:hover{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.sm\:hover\:border-blue-900:hover{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.sm\:hover\:border-indigo-100:hover{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.sm\:hover\:border-indigo-200:hover{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.sm\:hover\:border-indigo-300:hover{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.sm\:hover\:border-indigo-400:hover{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.sm\:hover\:border-indigo-500:hover{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.sm\:hover\:border-indigo-600:hover{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.sm\:hover\:border-indigo-700:hover{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.sm\:hover\:border-indigo-800:hover{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.sm\:hover\:border-indigo-900:hover{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.sm\:hover\:border-purple-100:hover{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.sm\:hover\:border-purple-200:hover{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.sm\:hover\:border-purple-300:hover{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.sm\:hover\:border-purple-400:hover{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.sm\:hover\:border-purple-500:hover{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.sm\:hover\:border-purple-600:hover{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.sm\:hover\:border-purple-700:hover{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.sm\:hover\:border-purple-800:hover{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.sm\:hover\:border-purple-900:hover{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.sm\:hover\:border-pink-100:hover{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.sm\:hover\:border-pink-200:hover{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.sm\:hover\:border-pink-300:hover{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.sm\:hover\:border-pink-400:hover{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.sm\:hover\:border-pink-500:hover{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.sm\:hover\:border-pink-600:hover{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.sm\:hover\:border-pink-700:hover{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.sm\:hover\:border-pink-800:hover{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.sm\:hover\:border-pink-900:hover{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.sm\:focus\:border-transparent:focus{border-color:transparent}.sm\:focus\:border-current:focus{border-color:currentColor}.sm\:focus\:border-black:focus{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.sm\:focus\:border-white:focus{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.sm\:focus\:border-gray-100:focus{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.sm\:focus\:border-gray-200:focus{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.sm\:focus\:border-gray-300:focus{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.sm\:focus\:border-gray-400:focus{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.sm\:focus\:border-gray-500:focus{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.sm\:focus\:border-gray-600:focus{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.sm\:focus\:border-gray-700:focus{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.sm\:focus\:border-gray-800:focus{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.sm\:focus\:border-gray-900:focus{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.sm\:focus\:border-red-100:focus{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.sm\:focus\:border-red-200:focus{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.sm\:focus\:border-red-300:focus{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.sm\:focus\:border-red-400:focus{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.sm\:focus\:border-red-500:focus{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.sm\:focus\:border-red-600:focus{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.sm\:focus\:border-red-700:focus{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.sm\:focus\:border-red-800:focus{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.sm\:focus\:border-red-900:focus{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.sm\:focus\:border-orange-100:focus{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.sm\:focus\:border-orange-200:focus{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.sm\:focus\:border-orange-300:focus{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.sm\:focus\:border-orange-400:focus{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.sm\:focus\:border-orange-500:focus{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.sm\:focus\:border-orange-600:focus{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.sm\:focus\:border-orange-700:focus{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.sm\:focus\:border-orange-800:focus{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.sm\:focus\:border-orange-900:focus{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.sm\:focus\:border-yellow-100:focus{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.sm\:focus\:border-yellow-200:focus{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.sm\:focus\:border-yellow-300:focus{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.sm\:focus\:border-yellow-400:focus{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.sm\:focus\:border-yellow-500:focus{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.sm\:focus\:border-yellow-600:focus{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.sm\:focus\:border-yellow-700:focus{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.sm\:focus\:border-yellow-800:focus{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.sm\:focus\:border-yellow-900:focus{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.sm\:focus\:border-green-100:focus{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.sm\:focus\:border-green-200:focus{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.sm\:focus\:border-green-300:focus{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.sm\:focus\:border-green-400:focus{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.sm\:focus\:border-green-500:focus{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.sm\:focus\:border-green-600:focus{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.sm\:focus\:border-green-700:focus{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.sm\:focus\:border-green-800:focus{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.sm\:focus\:border-green-900:focus{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.sm\:focus\:border-teal-100:focus{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.sm\:focus\:border-teal-200:focus{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.sm\:focus\:border-teal-300:focus{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.sm\:focus\:border-teal-400:focus{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.sm\:focus\:border-teal-500:focus{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.sm\:focus\:border-teal-600:focus{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.sm\:focus\:border-teal-700:focus{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.sm\:focus\:border-teal-800:focus{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.sm\:focus\:border-teal-900:focus{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.sm\:focus\:border-blue-100:focus{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.sm\:focus\:border-blue-200:focus{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.sm\:focus\:border-blue-300:focus{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.sm\:focus\:border-blue-400:focus{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.sm\:focus\:border-blue-500:focus{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.sm\:focus\:border-blue-600:focus{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.sm\:focus\:border-blue-700:focus{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.sm\:focus\:border-blue-800:focus{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.sm\:focus\:border-blue-900:focus{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.sm\:focus\:border-indigo-100:focus{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.sm\:focus\:border-indigo-200:focus{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.sm\:focus\:border-indigo-300:focus{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.sm\:focus\:border-indigo-400:focus{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.sm\:focus\:border-indigo-500:focus{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.sm\:focus\:border-indigo-600:focus{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.sm\:focus\:border-indigo-700:focus{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.sm\:focus\:border-indigo-800:focus{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.sm\:focus\:border-indigo-900:focus{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.sm\:focus\:border-purple-100:focus{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.sm\:focus\:border-purple-200:focus{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.sm\:focus\:border-purple-300:focus{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.sm\:focus\:border-purple-400:focus{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.sm\:focus\:border-purple-500:focus{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.sm\:focus\:border-purple-600:focus{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.sm\:focus\:border-purple-700:focus{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.sm\:focus\:border-purple-800:focus{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.sm\:focus\:border-purple-900:focus{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.sm\:focus\:border-pink-100:focus{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.sm\:focus\:border-pink-200:focus{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.sm\:focus\:border-pink-300:focus{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.sm\:focus\:border-pink-400:focus{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.sm\:focus\:border-pink-500:focus{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.sm\:focus\:border-pink-600:focus{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.sm\:focus\:border-pink-700:focus{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.sm\:focus\:border-pink-800:focus{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.sm\:focus\:border-pink-900:focus{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.sm\:border-opacity-0{--border-opacity:0}.sm\:border-opacity-25{--border-opacity:0.25}.sm\:border-opacity-50{--border-opacity:0.5}.sm\:border-opacity-75{--border-opacity:0.75}.sm\:border-opacity-100{--border-opacity:1}.sm\:hover\:border-opacity-0:hover{--border-opacity:0}.sm\:hover\:border-opacity-25:hover{--border-opacity:0.25}.sm\:hover\:border-opacity-50:hover{--border-opacity:0.5}.sm\:hover\:border-opacity-75:hover{--border-opacity:0.75}.sm\:hover\:border-opacity-100:hover{--border-opacity:1}.sm\:focus\:border-opacity-0:focus{--border-opacity:0}.sm\:focus\:border-opacity-25:focus{--border-opacity:0.25}.sm\:focus\:border-opacity-50:focus{--border-opacity:0.5}.sm\:focus\:border-opacity-75:focus{--border-opacity:0.75}.sm\:focus\:border-opacity-100:focus{--border-opacity:1}.sm\:rounded-none{border-radius:0}.sm\:rounded-sm{border-radius:.125rem}.sm\:rounded{border-radius:.25rem}.sm\:rounded-md{border-radius:.375rem}.sm\:rounded-lg{border-radius:.5rem}.sm\:rounded-xl{border-radius:.75rem}.sm\:rounded-2xl{border-radius:1rem}.sm\:rounded-3xl{border-radius:1.5rem}.sm\:rounded-full{border-radius:9999px}.sm\:rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.sm\:rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.sm\:rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.sm\:rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.sm\:rounded-t-sm{border-top-left-radius:.125rem;border-top-right-radius:.125rem}.sm\:rounded-r-sm{border-top-right-radius:.125rem;border-bottom-right-radius:.125rem}.sm\:rounded-b-sm{border-bottom-right-radius:.125rem;border-bottom-left-radius:.125rem}.sm\:rounded-l-sm{border-top-left-radius:.125rem;border-bottom-left-radius:.125rem}.sm\:rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.sm\:rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.sm\:rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.sm\:rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.sm\:rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.sm\:rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.sm\:rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.sm\:rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.sm\:rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.sm\:rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.sm\:rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.sm\:rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.sm\:rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.sm\:rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.sm\:rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.sm\:rounded-l-xl{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.sm\:rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.sm\:rounded-r-2xl{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.sm\:rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.sm\:rounded-l-2xl{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.sm\:rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.sm\:rounded-r-3xl{border-top-right-radius:1.5rem;border-bottom-right-radius:1.5rem}.sm\:rounded-b-3xl{border-bottom-right-radius:1.5rem;border-bottom-left-radius:1.5rem}.sm\:rounded-l-3xl{border-top-left-radius:1.5rem;border-bottom-left-radius:1.5rem}.sm\:rounded-t-full{border-top-left-radius:9999px;border-top-right-radius:9999px}.sm\:rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.sm\:rounded-b-full{border-bottom-right-radius:9999px;border-bottom-left-radius:9999px}.sm\:rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.sm\:rounded-tl-none{border-top-left-radius:0}.sm\:rounded-tr-none{border-top-right-radius:0}.sm\:rounded-br-none{border-bottom-right-radius:0}.sm\:rounded-bl-none{border-bottom-left-radius:0}.sm\:rounded-tl-sm{border-top-left-radius:.125rem}.sm\:rounded-tr-sm{border-top-right-radius:.125rem}.sm\:rounded-br-sm{border-bottom-right-radius:.125rem}.sm\:rounded-bl-sm{border-bottom-left-radius:.125rem}.sm\:rounded-tl{border-top-left-radius:.25rem}.sm\:rounded-tr{border-top-right-radius:.25rem}.sm\:rounded-br{border-bottom-right-radius:.25rem}.sm\:rounded-bl{border-bottom-left-radius:.25rem}.sm\:rounded-tl-md{border-top-left-radius:.375rem}.sm\:rounded-tr-md{border-top-right-radius:.375rem}.sm\:rounded-br-md{border-bottom-right-radius:.375rem}.sm\:rounded-bl-md{border-bottom-left-radius:.375rem}.sm\:rounded-tl-lg{border-top-left-radius:.5rem}.sm\:rounded-tr-lg{border-top-right-radius:.5rem}.sm\:rounded-br-lg{border-bottom-right-radius:.5rem}.sm\:rounded-bl-lg{border-bottom-left-radius:.5rem}.sm\:rounded-tl-xl{border-top-left-radius:.75rem}.sm\:rounded-tr-xl{border-top-right-radius:.75rem}.sm\:rounded-br-xl{border-bottom-right-radius:.75rem}.sm\:rounded-bl-xl{border-bottom-left-radius:.75rem}.sm\:rounded-tl-2xl{border-top-left-radius:1rem}.sm\:rounded-tr-2xl{border-top-right-radius:1rem}.sm\:rounded-br-2xl{border-bottom-right-radius:1rem}.sm\:rounded-bl-2xl{border-bottom-left-radius:1rem}.sm\:rounded-tl-3xl{border-top-left-radius:1.5rem}.sm\:rounded-tr-3xl{border-top-right-radius:1.5rem}.sm\:rounded-br-3xl{border-bottom-right-radius:1.5rem}.sm\:rounded-bl-3xl{border-bottom-left-radius:1.5rem}.sm\:rounded-tl-full{border-top-left-radius:9999px}.sm\:rounded-tr-full{border-top-right-radius:9999px}.sm\:rounded-br-full{border-bottom-right-radius:9999px}.sm\:rounded-bl-full{border-bottom-left-radius:9999px}.sm\:border-solid{border-style:solid}.sm\:border-dashed{border-style:dashed}.sm\:border-dotted{border-style:dotted}.sm\:border-double{border-style:double}.sm\:border-none{border-style:none}.sm\:border-0{border-width:0}.sm\:border-2{border-width:2px}.sm\:border-4{border-width:4px}.sm\:border-8{border-width:8px}.sm\:border{border-width:1px}.sm\:border-t-0{border-top-width:0}.sm\:border-r-0{border-right-width:0}.sm\:border-b-0{border-bottom-width:0}.sm\:border-l-0{border-left-width:0}.sm\:border-t-2{border-top-width:2px}.sm\:border-r-2{border-right-width:2px}.sm\:border-b-2{border-bottom-width:2px}.sm\:border-l-2{border-left-width:2px}.sm\:border-t-4{border-top-width:4px}.sm\:border-r-4{border-right-width:4px}.sm\:border-b-4{border-bottom-width:4px}.sm\:border-l-4{border-left-width:4px}.sm\:border-t-8{border-top-width:8px}.sm\:border-r-8{border-right-width:8px}.sm\:border-b-8{border-bottom-width:8px}.sm\:border-l-8{border-left-width:8px}.sm\:border-t{border-top-width:1px}.sm\:border-r{border-right-width:1px}.sm\:border-b{border-bottom-width:1px}.sm\:border-l{border-left-width:1px}.sm\:box-border{box-sizing:border-box}.sm\:box-content{box-sizing:content-box}.sm\:cursor-auto{cursor:auto}.sm\:cursor-default{cursor:default}.sm\:cursor-pointer{cursor:pointer}.sm\:cursor-wait{cursor:wait}.sm\:cursor-text{cursor:text}.sm\:cursor-move{cursor:move}.sm\:cursor-not-allowed{cursor:not-allowed}.sm\:block{display:block}.sm\:inline-block{display:inline-block}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:inline-flex{display:inline-flex}.sm\:table{display:table}.sm\:table-caption{display:table-caption}.sm\:table-cell{display:table-cell}.sm\:table-column{display:table-column}.sm\:table-column-group{display:table-column-group}.sm\:table-footer-group{display:table-footer-group}.sm\:table-header-group{display:table-header-group}.sm\:table-row-group{display:table-row-group}.sm\:table-row{display:table-row}.sm\:flow-root{display:flow-root}.sm\:grid{display:grid}.sm\:inline-grid{display:inline-grid}.sm\:contents{display:contents}.sm\:hidden{display:none}.sm\:flex-row{flex-direction:row}.sm\:flex-row-reverse{flex-direction:row-reverse}.sm\:flex-col{flex-direction:column}.sm\:flex-col-reverse{flex-direction:column-reverse}.sm\:flex-wrap{flex-wrap:wrap}.sm\:flex-wrap-reverse{flex-wrap:wrap-reverse}.sm\:flex-no-wrap{flex-wrap:nowrap}.sm\:place-items-auto{place-items:auto}.sm\:place-items-start{place-items:start}.sm\:place-items-end{place-items:end}.sm\:place-items-center{place-items:center}.sm\:place-items-stretch{place-items:stretch}.sm\:place-content-center{place-content:center}.sm\:place-content-start{place-content:start}.sm\:place-content-end{place-content:end}.sm\:place-content-between{place-content:space-between}.sm\:place-content-around{place-content:space-around}.sm\:place-content-evenly{place-content:space-evenly}.sm\:place-content-stretch{place-content:stretch}.sm\:place-self-auto{place-self:auto}.sm\:place-self-start{place-self:start}.sm\:place-self-end{place-self:end}.sm\:place-self-center{place-self:center}.sm\:place-self-stretch{place-self:stretch}.sm\:items-start{align-items:flex-start}.sm\:items-end{align-items:flex-end}.sm\:items-center{align-items:center}.sm\:items-baseline{align-items:baseline}.sm\:items-stretch{align-items:stretch}.sm\:content-center{align-content:center}.sm\:content-start{align-content:flex-start}.sm\:content-end{align-content:flex-end}.sm\:content-between{align-content:space-between}.sm\:content-around{align-content:space-around}.sm\:content-evenly{align-content:space-evenly}.sm\:self-auto{align-self:auto}.sm\:self-start{align-self:flex-start}.sm\:self-end{align-self:flex-end}.sm\:self-center{align-self:center}.sm\:self-stretch{align-self:stretch}.sm\:justify-items-auto{justify-items:auto}.sm\:justify-items-start{justify-items:start}.sm\:justify-items-end{justify-items:end}.sm\:justify-items-center{justify-items:center}.sm\:justify-items-stretch{justify-items:stretch}.sm\:justify-start{justify-content:flex-start}.sm\:justify-end{justify-content:flex-end}.sm\:justify-center{justify-content:center}.sm\:justify-between{justify-content:space-between}.sm\:justify-around{justify-content:space-around}.sm\:justify-evenly{justify-content:space-evenly}.sm\:justify-self-auto{justify-self:auto}.sm\:justify-self-start{justify-self:start}.sm\:justify-self-end{justify-self:end}.sm\:justify-self-center{justify-self:center}.sm\:justify-self-stretch{justify-self:stretch}.sm\:flex-1{flex:1 1 0%}.sm\:flex-auto{flex:1 1 auto}.sm\:flex-initial{flex:0 1 auto}.sm\:flex-none{flex:none}.sm\:flex-grow-0{flex-grow:0}.sm\:flex-grow{flex-grow:1}.sm\:flex-shrink-0{flex-shrink:0}.sm\:flex-shrink{flex-shrink:1}.sm\:order-1{order:1}.sm\:order-2{order:2}.sm\:order-3{order:3}.sm\:order-4{order:4}.sm\:order-5{order:5}.sm\:order-6{order:6}.sm\:order-7{order:7}.sm\:order-8{order:8}.sm\:order-9{order:9}.sm\:order-10{order:10}.sm\:order-11{order:11}.sm\:order-12{order:12}.sm\:order-first{order:-9999}.sm\:order-last{order:9999}.sm\:order-none{order:0}.sm\:float-right{float:right}.sm\:float-left{float:left}.sm\:float-none{float:none}.sm\:clearfix:after{content:"";display:table;clear:both}.sm\:clear-left{clear:left}.sm\:clear-right{clear:right}.sm\:clear-both{clear:both}.sm\:clear-none{clear:none}.sm\:font-sans{font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.sm\:font-serif{font-family:Georgia,Cambria,"Times New Roman",Times,serif}.sm\:font-mono{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.sm\:font-hairline{font-weight:100}.sm\:font-thin{font-weight:200}.sm\:font-light{font-weight:300}.sm\:font-normal{font-weight:400}.sm\:font-medium{font-weight:500}.sm\:font-semibold{font-weight:600}.sm\:font-bold{font-weight:700}.sm\:font-extrabold{font-weight:800}.sm\:font-black{font-weight:900}.sm\:hover\:font-hairline:hover{font-weight:100}.sm\:hover\:font-thin:hover{font-weight:200}.sm\:hover\:font-light:hover{font-weight:300}.sm\:hover\:font-normal:hover{font-weight:400}.sm\:hover\:font-medium:hover{font-weight:500}.sm\:hover\:font-semibold:hover{font-weight:600}.sm\:hover\:font-bold:hover{font-weight:700}.sm\:hover\:font-extrabold:hover{font-weight:800}.sm\:hover\:font-black:hover{font-weight:900}.sm\:focus\:font-hairline:focus{font-weight:100}.sm\:focus\:font-thin:focus{font-weight:200}.sm\:focus\:font-light:focus{font-weight:300}.sm\:focus\:font-normal:focus{font-weight:400}.sm\:focus\:font-medium:focus{font-weight:500}.sm\:focus\:font-semibold:focus{font-weight:600}.sm\:focus\:font-bold:focus{font-weight:700}.sm\:focus\:font-extrabold:focus{font-weight:800}.sm\:focus\:font-black:focus{font-weight:900}.sm\:h-0{height:0}.sm\:h-1{height:.25rem}.sm\:h-2{height:.5rem}.sm\:h-3{height:.75rem}.sm\:h-4{height:1rem}.sm\:h-5{height:1.25rem}.sm\:h-6{height:1.5rem}.sm\:h-8{height:2rem}.sm\:h-10{height:2.5rem}.sm\:h-12{height:3rem}.sm\:h-16{height:4rem}.sm\:h-20{height:5rem}.sm\:h-24{height:6rem}.sm\:h-32{height:8rem}.sm\:h-40{height:10rem}.sm\:h-48{height:12rem}.sm\:h-56{height:14rem}.sm\:h-64{height:16rem}.sm\:h-auto{height:auto}.sm\:h-px{height:1px}.sm\:h-full{height:100%}.sm\:h-screen{height:100vh}.sm\:text-xs{font-size:.75rem}.sm\:text-sm{font-size:.875rem}.sm\:text-base{font-size:1rem}.sm\:text-lg{font-size:1.125rem}.sm\:text-xl{font-size:1.25rem}.sm\:text-2xl{font-size:1.5rem}.sm\:text-3xl{font-size:1.875rem}.sm\:text-4xl{font-size:2.25rem}.sm\:text-5xl{font-size:3rem}.sm\:text-6xl{font-size:4rem}.sm\:leading-3{line-height:.75rem}.sm\:leading-4{line-height:1rem}.sm\:leading-5{line-height:1.25rem}.sm\:leading-6{line-height:1.5rem}.sm\:leading-7{line-height:1.75rem}.sm\:leading-8{line-height:2rem}.sm\:leading-9{line-height:2.25rem}.sm\:leading-10{line-height:2.5rem}.sm\:leading-none{line-height:1}.sm\:leading-tight{line-height:1.25}.sm\:leading-snug{line-height:1.375}.sm\:leading-normal{line-height:1.5}.sm\:leading-relaxed{line-height:1.625}.sm\:leading-loose{line-height:2}.sm\:list-inside{list-style-position:inside}.sm\:list-outside{list-style-position:outside}.sm\:list-none{list-style-type:none}.sm\:list-disc{list-style-type:disc}.sm\:list-decimal{list-style-type:decimal}.sm\:m-0{margin:0}.sm\:m-1{margin:.25rem}.sm\:m-2{margin:.5rem}.sm\:m-3{margin:.75rem}.sm\:m-4{margin:1rem}.sm\:m-5{margin:1.25rem}.sm\:m-6{margin:1.5rem}.sm\:m-8{margin:2rem}.sm\:m-10{margin:2.5rem}.sm\:m-12{margin:3rem}.sm\:m-16{margin:4rem}.sm\:m-20{margin:5rem}.sm\:m-24{margin:6rem}.sm\:m-32{margin:8rem}.sm\:m-40{margin:10rem}.sm\:m-48{margin:12rem}.sm\:m-56{margin:14rem}.sm\:m-64{margin:16rem}.sm\:m-auto{margin:auto}.sm\:m-px{margin:1px}.sm\:-m-1{margin:-.25rem}.sm\:-m-2{margin:-.5rem}.sm\:-m-3{margin:-.75rem}.sm\:-m-4{margin:-1rem}.sm\:-m-5{margin:-1.25rem}.sm\:-m-6{margin:-1.5rem}.sm\:-m-8{margin:-2rem}.sm\:-m-10{margin:-2.5rem}.sm\:-m-12{margin:-3rem}.sm\:-m-16{margin:-4rem}.sm\:-m-20{margin:-5rem}.sm\:-m-24{margin:-6rem}.sm\:-m-32{margin:-8rem}.sm\:-m-40{margin:-10rem}.sm\:-m-48{margin:-12rem}.sm\:-m-56{margin:-14rem}.sm\:-m-64{margin:-16rem}.sm\:-m-px{margin:-1px}.sm\:my-0{margin-top:0;margin-bottom:0}.sm\:mx-0{margin-left:0;margin-right:0}.sm\:my-1{margin-top:.25rem;margin-bottom:.25rem}.sm\:mx-1{margin-left:.25rem;margin-right:.25rem}.sm\:my-2{margin-top:.5rem;margin-bottom:.5rem}.sm\:mx-2{margin-left:.5rem;margin-right:.5rem}.sm\:my-3{margin-top:.75rem;margin-bottom:.75rem}.sm\:mx-3{margin-left:.75rem;margin-right:.75rem}.sm\:my-4{margin-top:1rem;margin-bottom:1rem}.sm\:mx-4{margin-left:1rem;margin-right:1rem}.sm\:my-5{margin-top:1.25rem;margin-bottom:1.25rem}.sm\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.sm\:my-6{margin-top:1.5rem;margin-bottom:1.5rem}.sm\:mx-6{margin-left:1.5rem;margin-right:1.5rem}.sm\:my-8{margin-top:2rem;margin-bottom:2rem}.sm\:mx-8{margin-left:2rem;margin-right:2rem}.sm\:my-10{margin-top:2.5rem;margin-bottom:2.5rem}.sm\:mx-10{margin-left:2.5rem;margin-right:2.5rem}.sm\:my-12{margin-top:3rem;margin-bottom:3rem}.sm\:mx-12{margin-left:3rem;margin-right:3rem}.sm\:my-16{margin-top:4rem;margin-bottom:4rem}.sm\:mx-16{margin-left:4rem;margin-right:4rem}.sm\:my-20{margin-top:5rem;margin-bottom:5rem}.sm\:mx-20{margin-left:5rem;margin-right:5rem}.sm\:my-24{margin-top:6rem;margin-bottom:6rem}.sm\:mx-24{margin-left:6rem;margin-right:6rem}.sm\:my-32{margin-top:8rem;margin-bottom:8rem}.sm\:mx-32{margin-left:8rem;margin-right:8rem}.sm\:my-40{margin-top:10rem;margin-bottom:10rem}.sm\:mx-40{margin-left:10rem;margin-right:10rem}.sm\:my-48{margin-top:12rem;margin-bottom:12rem}.sm\:mx-48{margin-left:12rem;margin-right:12rem}.sm\:my-56{margin-top:14rem;margin-bottom:14rem}.sm\:mx-56{margin-left:14rem;margin-right:14rem}.sm\:my-64{margin-top:16rem;margin-bottom:16rem}.sm\:mx-64{margin-left:16rem;margin-right:16rem}.sm\:my-auto{margin-top:auto;margin-bottom:auto}.sm\:mx-auto{margin-left:auto;margin-right:auto}.sm\:my-px{margin-top:1px;margin-bottom:1px}.sm\:mx-px{margin-left:1px;margin-right:1px}.sm\:-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.sm\:-mx-1{margin-left:-.25rem;margin-right:-.25rem}.sm\:-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.sm\:-mx-2{margin-left:-.5rem;margin-right:-.5rem}.sm\:-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.sm\:-mx-3{margin-left:-.75rem;margin-right:-.75rem}.sm\:-my-4{margin-top:-1rem;margin-bottom:-1rem}.sm\:-mx-4{margin-left:-1rem;margin-right:-1rem}.sm\:-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.sm\:-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.sm\:-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.sm\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.sm\:-my-8{margin-top:-2rem;margin-bottom:-2rem}.sm\:-mx-8{margin-left:-2rem;margin-right:-2rem}.sm\:-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.sm\:-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.sm\:-my-12{margin-top:-3rem;margin-bottom:-3rem}.sm\:-mx-12{margin-left:-3rem;margin-right:-3rem}.sm\:-my-16{margin-top:-4rem;margin-bottom:-4rem}.sm\:-mx-16{margin-left:-4rem;margin-right:-4rem}.sm\:-my-20{margin-top:-5rem;margin-bottom:-5rem}.sm\:-mx-20{margin-left:-5rem;margin-right:-5rem}.sm\:-my-24{margin-top:-6rem;margin-bottom:-6rem}.sm\:-mx-24{margin-left:-6rem;margin-right:-6rem}.sm\:-my-32{margin-top:-8rem;margin-bottom:-8rem}.sm\:-mx-32{margin-left:-8rem;margin-right:-8rem}.sm\:-my-40{margin-top:-10rem;margin-bottom:-10rem}.sm\:-mx-40{margin-left:-10rem;margin-right:-10rem}.sm\:-my-48{margin-top:-12rem;margin-bottom:-12rem}.sm\:-mx-48{margin-left:-12rem;margin-right:-12rem}.sm\:-my-56{margin-top:-14rem;margin-bottom:-14rem}.sm\:-mx-56{margin-left:-14rem;margin-right:-14rem}.sm\:-my-64{margin-top:-16rem;margin-bottom:-16rem}.sm\:-mx-64{margin-left:-16rem;margin-right:-16rem}.sm\:-my-px{margin-top:-1px;margin-bottom:-1px}.sm\:-mx-px{margin-left:-1px;margin-right:-1px}.sm\:mt-0{margin-top:0}.sm\:mr-0{margin-right:0}.sm\:mb-0{margin-bottom:0}.sm\:ml-0{margin-left:0}.sm\:mt-1{margin-top:.25rem}.sm\:mr-1{margin-right:.25rem}.sm\:mb-1{margin-bottom:.25rem}.sm\:ml-1{margin-left:.25rem}.sm\:mt-2{margin-top:.5rem}.sm\:mr-2{margin-right:.5rem}.sm\:mb-2{margin-bottom:.5rem}.sm\:ml-2{margin-left:.5rem}.sm\:mt-3{margin-top:.75rem}.sm\:mr-3{margin-right:.75rem}.sm\:mb-3{margin-bottom:.75rem}.sm\:ml-3{margin-left:.75rem}.sm\:mt-4{margin-top:1rem}.sm\:mr-4{margin-right:1rem}.sm\:mb-4{margin-bottom:1rem}.sm\:ml-4{margin-left:1rem}.sm\:mt-5{margin-top:1.25rem}.sm\:mr-5{margin-right:1.25rem}.sm\:mb-5{margin-bottom:1.25rem}.sm\:ml-5{margin-left:1.25rem}.sm\:mt-6{margin-top:1.5rem}.sm\:mr-6{margin-right:1.5rem}.sm\:mb-6{margin-bottom:1.5rem}.sm\:ml-6{margin-left:1.5rem}.sm\:mt-8{margin-top:2rem}.sm\:mr-8{margin-right:2rem}.sm\:mb-8{margin-bottom:2rem}.sm\:ml-8{margin-left:2rem}.sm\:mt-10{margin-top:2.5rem}.sm\:mr-10{margin-right:2.5rem}.sm\:mb-10{margin-bottom:2.5rem}.sm\:ml-10{margin-left:2.5rem}.sm\:mt-12{margin-top:3rem}.sm\:mr-12{margin-right:3rem}.sm\:mb-12{margin-bottom:3rem}.sm\:ml-12{margin-left:3rem}.sm\:mt-16{margin-top:4rem}.sm\:mr-16{margin-right:4rem}.sm\:mb-16{margin-bottom:4rem}.sm\:ml-16{margin-left:4rem}.sm\:mt-20{margin-top:5rem}.sm\:mr-20{margin-right:5rem}.sm\:mb-20{margin-bottom:5rem}.sm\:ml-20{margin-left:5rem}.sm\:mt-24{margin-top:6rem}.sm\:mr-24{margin-right:6rem}.sm\:mb-24{margin-bottom:6rem}.sm\:ml-24{margin-left:6rem}.sm\:mt-32{margin-top:8rem}.sm\:mr-32{margin-right:8rem}.sm\:mb-32{margin-bottom:8rem}.sm\:ml-32{margin-left:8rem}.sm\:mt-40{margin-top:10rem}.sm\:mr-40{margin-right:10rem}.sm\:mb-40{margin-bottom:10rem}.sm\:ml-40{margin-left:10rem}.sm\:mt-48{margin-top:12rem}.sm\:mr-48{margin-right:12rem}.sm\:mb-48{margin-bottom:12rem}.sm\:ml-48{margin-left:12rem}.sm\:mt-56{margin-top:14rem}.sm\:mr-56{margin-right:14rem}.sm\:mb-56{margin-bottom:14rem}.sm\:ml-56{margin-left:14rem}.sm\:mt-64{margin-top:16rem}.sm\:mr-64{margin-right:16rem}.sm\:mb-64{margin-bottom:16rem}.sm\:ml-64{margin-left:16rem}.sm\:mt-auto{margin-top:auto}.sm\:mr-auto{margin-right:auto}.sm\:mb-auto{margin-bottom:auto}.sm\:ml-auto{margin-left:auto}.sm\:mt-px{margin-top:1px}.sm\:mr-px{margin-right:1px}.sm\:mb-px{margin-bottom:1px}.sm\:ml-px{margin-left:1px}.sm\:-mt-1{margin-top:-.25rem}.sm\:-mr-1{margin-right:-.25rem}.sm\:-mb-1{margin-bottom:-.25rem}.sm\:-ml-1{margin-left:-.25rem}.sm\:-mt-2{margin-top:-.5rem}.sm\:-mr-2{margin-right:-.5rem}.sm\:-mb-2{margin-bottom:-.5rem}.sm\:-ml-2{margin-left:-.5rem}.sm\:-mt-3{margin-top:-.75rem}.sm\:-mr-3{margin-right:-.75rem}.sm\:-mb-3{margin-bottom:-.75rem}.sm\:-ml-3{margin-left:-.75rem}.sm\:-mt-4{margin-top:-1rem}.sm\:-mr-4{margin-right:-1rem}.sm\:-mb-4{margin-bottom:-1rem}.sm\:-ml-4{margin-left:-1rem}.sm\:-mt-5{margin-top:-1.25rem}.sm\:-mr-5{margin-right:-1.25rem}.sm\:-mb-5{margin-bottom:-1.25rem}.sm\:-ml-5{margin-left:-1.25rem}.sm\:-mt-6{margin-top:-1.5rem}.sm\:-mr-6{margin-right:-1.5rem}.sm\:-mb-6{margin-bottom:-1.5rem}.sm\:-ml-6{margin-left:-1.5rem}.sm\:-mt-8{margin-top:-2rem}.sm\:-mr-8{margin-right:-2rem}.sm\:-mb-8{margin-bottom:-2rem}.sm\:-ml-8{margin-left:-2rem}.sm\:-mt-10{margin-top:-2.5rem}.sm\:-mr-10{margin-right:-2.5rem}.sm\:-mb-10{margin-bottom:-2.5rem}.sm\:-ml-10{margin-left:-2.5rem}.sm\:-mt-12{margin-top:-3rem}.sm\:-mr-12{margin-right:-3rem}.sm\:-mb-12{margin-bottom:-3rem}.sm\:-ml-12{margin-left:-3rem}.sm\:-mt-16{margin-top:-4rem}.sm\:-mr-16{margin-right:-4rem}.sm\:-mb-16{margin-bottom:-4rem}.sm\:-ml-16{margin-left:-4rem}.sm\:-mt-20{margin-top:-5rem}.sm\:-mr-20{margin-right:-5rem}.sm\:-mb-20{margin-bottom:-5rem}.sm\:-ml-20{margin-left:-5rem}.sm\:-mt-24{margin-top:-6rem}.sm\:-mr-24{margin-right:-6rem}.sm\:-mb-24{margin-bottom:-6rem}.sm\:-ml-24{margin-left:-6rem}.sm\:-mt-32{margin-top:-8rem}.sm\:-mr-32{margin-right:-8rem}.sm\:-mb-32{margin-bottom:-8rem}.sm\:-ml-32{margin-left:-8rem}.sm\:-mt-40{margin-top:-10rem}.sm\:-mr-40{margin-right:-10rem}.sm\:-mb-40{margin-bottom:-10rem}.sm\:-ml-40{margin-left:-10rem}.sm\:-mt-48{margin-top:-12rem}.sm\:-mr-48{margin-right:-12rem}.sm\:-mb-48{margin-bottom:-12rem}.sm\:-ml-48{margin-left:-12rem}.sm\:-mt-56{margin-top:-14rem}.sm\:-mr-56{margin-right:-14rem}.sm\:-mb-56{margin-bottom:-14rem}.sm\:-ml-56{margin-left:-14rem}.sm\:-mt-64{margin-top:-16rem}.sm\:-mr-64{margin-right:-16rem}.sm\:-mb-64{margin-bottom:-16rem}.sm\:-ml-64{margin-left:-16rem}.sm\:-mt-px{margin-top:-1px}.sm\:-mr-px{margin-right:-1px}.sm\:-mb-px{margin-bottom:-1px}.sm\:-ml-px{margin-left:-1px}.sm\:max-h-full{max-height:100%}.sm\:max-h-screen{max-height:100vh}.sm\:max-w-none{max-width:none}.sm\:max-w-xs{max-width:20rem}.sm\:max-w-sm{max-width:24rem}.sm\:max-w-md{max-width:28rem}.sm\:max-w-lg{max-width:32rem}.sm\:max-w-xl{max-width:36rem}.sm\:max-w-2xl{max-width:42rem}.sm\:max-w-3xl{max-width:48rem}.sm\:max-w-4xl{max-width:56rem}.sm\:max-w-5xl{max-width:64rem}.sm\:max-w-6xl{max-width:72rem}.sm\:max-w-full{max-width:100%}.sm\:max-w-screen-sm{max-width:640px}.sm\:max-w-screen-md{max-width:768px}.sm\:max-w-screen-lg{max-width:1024px}.sm\:max-w-screen-xl{max-width:1280px}.sm\:min-h-0{min-height:0}.sm\:min-h-full{min-height:100%}.sm\:min-h-screen{min-height:100vh}.sm\:min-w-0{min-width:0}.sm\:min-w-full{min-width:100%}.sm\:object-contain{object-fit:contain}.sm\:object-cover{object-fit:cover}.sm\:object-fill{object-fit:fill}.sm\:object-none{object-fit:none}.sm\:object-scale-down{object-fit:scale-down}.sm\:object-bottom{object-position:bottom}.sm\:object-center{object-position:center}.sm\:object-left{object-position:left}.sm\:object-left-bottom{object-position:left bottom}.sm\:object-left-top{object-position:left top}.sm\:object-right{object-position:right}.sm\:object-right-bottom{object-position:right bottom}.sm\:object-right-top{object-position:right top}.sm\:object-top{object-position:top}.sm\:opacity-0{opacity:0}.sm\:opacity-25{opacity:.25}.sm\:opacity-50{opacity:.5}.sm\:opacity-75{opacity:.75}.sm\:opacity-100{opacity:1}.sm\:hover\:opacity-0:hover{opacity:0}.sm\:hover\:opacity-25:hover{opacity:.25}.sm\:hover\:opacity-50:hover{opacity:.5}.sm\:hover\:opacity-75:hover{opacity:.75}.sm\:hover\:opacity-100:hover{opacity:1}.sm\:focus\:opacity-0:focus{opacity:0}.sm\:focus\:opacity-25:focus{opacity:.25}.sm\:focus\:opacity-50:focus{opacity:.5}.sm\:focus\:opacity-75:focus{opacity:.75}.sm\:focus\:opacity-100:focus{opacity:1}.sm\:outline-none{outline:2px solid transparent;outline-offset:2px}.sm\:outline-white{outline:2px dotted #fff;outline-offset:2px}.sm\:outline-black{outline:2px dotted #000;outline-offset:2px}.sm\:focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.sm\:focus\:outline-white:focus{outline:2px dotted #fff;outline-offset:2px}.sm\:focus\:outline-black:focus{outline:2px dotted #000;outline-offset:2px}.sm\:overflow-auto{overflow:auto}.sm\:overflow-hidden{overflow:hidden}.sm\:overflow-visible{overflow:visible}.sm\:overflow-scroll{overflow:scroll}.sm\:overflow-x-auto{overflow-x:auto}.sm\:overflow-y-auto{overflow-y:auto}.sm\:overflow-x-hidden{overflow-x:hidden}.sm\:overflow-y-hidden{overflow-y:hidden}.sm\:overflow-x-visible{overflow-x:visible}.sm\:overflow-y-visible{overflow-y:visible}.sm\:overflow-x-scroll{overflow-x:scroll}.sm\:overflow-y-scroll{overflow-y:scroll}.sm\:scrolling-touch{-webkit-overflow-scrolling:touch}.sm\:scrolling-auto{-webkit-overflow-scrolling:auto}.sm\:overscroll-auto{-ms-scroll-chaining:chained;overscroll-behavior:auto}.sm\:overscroll-contain{-ms-scroll-chaining:none;overscroll-behavior:contain}.sm\:overscroll-none{-ms-scroll-chaining:none;overscroll-behavior:none}.sm\:overscroll-y-auto{overscroll-behavior-y:auto}.sm\:overscroll-y-contain{overscroll-behavior-y:contain}.sm\:overscroll-y-none{overscroll-behavior-y:none}.sm\:overscroll-x-auto{overscroll-behavior-x:auto}.sm\:overscroll-x-contain{overscroll-behavior-x:contain}.sm\:overscroll-x-none{overscroll-behavior-x:none}.sm\:p-0{padding:0}.sm\:p-1{padding:.25rem}.sm\:p-2{padding:.5rem}.sm\:p-3{padding:.75rem}.sm\:p-4{padding:1rem}.sm\:p-5{padding:1.25rem}.sm\:p-6{padding:1.5rem}.sm\:p-8{padding:2rem}.sm\:p-10{padding:2.5rem}.sm\:p-12{padding:3rem}.sm\:p-16{padding:4rem}.sm\:p-20{padding:5rem}.sm\:p-24{padding:6rem}.sm\:p-32{padding:8rem}.sm\:p-40{padding:10rem}.sm\:p-48{padding:12rem}.sm\:p-56{padding:14rem}.sm\:p-64{padding:16rem}.sm\:p-px{padding:1px}.sm\:py-0{padding-top:0;padding-bottom:0}.sm\:px-0{padding-left:0;padding-right:0}.sm\:py-1{padding-top:.25rem;padding-bottom:.25rem}.sm\:px-1{padding-left:.25rem;padding-right:.25rem}.sm\:py-2{padding-top:.5rem;padding-bottom:.5rem}.sm\:px-2{padding-left:.5rem;padding-right:.5rem}.sm\:py-3{padding-top:.75rem;padding-bottom:.75rem}.sm\:px-3{padding-left:.75rem;padding-right:.75rem}.sm\:py-4{padding-top:1rem;padding-bottom:1rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.sm\:px-5{padding-left:1.25rem;padding-right:1.25rem}.sm\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-8{padding-top:2rem;padding-bottom:2rem}.sm\:px-8{padding-left:2rem;padding-right:2rem}.sm\:py-10{padding-top:2.5rem;padding-bottom:2.5rem}.sm\:px-10{padding-left:2.5rem;padding-right:2.5rem}.sm\:py-12{padding-top:3rem;padding-bottom:3rem}.sm\:px-12{padding-left:3rem;padding-right:3rem}.sm\:py-16{padding-top:4rem;padding-bottom:4rem}.sm\:px-16{padding-left:4rem;padding-right:4rem}.sm\:py-20{padding-top:5rem;padding-bottom:5rem}.sm\:px-20{padding-left:5rem;padding-right:5rem}.sm\:py-24{padding-top:6rem;padding-bottom:6rem}.sm\:px-24{padding-left:6rem;padding-right:6rem}.sm\:py-32{padding-top:8rem;padding-bottom:8rem}.sm\:px-32{padding-left:8rem;padding-right:8rem}.sm\:py-40{padding-top:10rem;padding-bottom:10rem}.sm\:px-40{padding-left:10rem;padding-right:10rem}.sm\:py-48{padding-top:12rem;padding-bottom:12rem}.sm\:px-48{padding-left:12rem;padding-right:12rem}.sm\:py-56{padding-top:14rem;padding-bottom:14rem}.sm\:px-56{padding-left:14rem;padding-right:14rem}.sm\:py-64{padding-top:16rem;padding-bottom:16rem}.sm\:px-64{padding-left:16rem;padding-right:16rem}.sm\:py-px{padding-top:1px;padding-bottom:1px}.sm\:px-px{padding-left:1px;padding-right:1px}.sm\:pt-0{padding-top:0}.sm\:pr-0{padding-right:0}.sm\:pb-0{padding-bottom:0}.sm\:pl-0{padding-left:0}.sm\:pt-1{padding-top:.25rem}.sm\:pr-1{padding-right:.25rem}.sm\:pb-1{padding-bottom:.25rem}.sm\:pl-1{padding-left:.25rem}.sm\:pt-2{padding-top:.5rem}.sm\:pr-2{padding-right:.5rem}.sm\:pb-2{padding-bottom:.5rem}.sm\:pl-2{padding-left:.5rem}.sm\:pt-3{padding-top:.75rem}.sm\:pr-3{padding-right:.75rem}.sm\:pb-3{padding-bottom:.75rem}.sm\:pl-3{padding-left:.75rem}.sm\:pt-4{padding-top:1rem}.sm\:pr-4{padding-right:1rem}.sm\:pb-4{padding-bottom:1rem}.sm\:pl-4{padding-left:1rem}.sm\:pt-5{padding-top:1.25rem}.sm\:pr-5{padding-right:1.25rem}.sm\:pb-5{padding-bottom:1.25rem}.sm\:pl-5{padding-left:1.25rem}.sm\:pt-6{padding-top:1.5rem}.sm\:pr-6{padding-right:1.5rem}.sm\:pb-6{padding-bottom:1.5rem}.sm\:pl-6{padding-left:1.5rem}.sm\:pt-8{padding-top:2rem}.sm\:pr-8{padding-right:2rem}.sm\:pb-8{padding-bottom:2rem}.sm\:pl-8{padding-left:2rem}.sm\:pt-10{padding-top:2.5rem}.sm\:pr-10{padding-right:2.5rem}.sm\:pb-10{padding-bottom:2.5rem}.sm\:pl-10{padding-left:2.5rem}.sm\:pt-12{padding-top:3rem}.sm\:pr-12{padding-right:3rem}.sm\:pb-12{padding-bottom:3rem}.sm\:pl-12{padding-left:3rem}.sm\:pt-16{padding-top:4rem}.sm\:pr-16{padding-right:4rem}.sm\:pb-16{padding-bottom:4rem}.sm\:pl-16{padding-left:4rem}.sm\:pt-20{padding-top:5rem}.sm\:pr-20{padding-right:5rem}.sm\:pb-20{padding-bottom:5rem}.sm\:pl-20{padding-left:5rem}.sm\:pt-24{padding-top:6rem}.sm\:pr-24{padding-right:6rem}.sm\:pb-24{padding-bottom:6rem}.sm\:pl-24{padding-left:6rem}.sm\:pt-32{padding-top:8rem}.sm\:pr-32{padding-right:8rem}.sm\:pb-32{padding-bottom:8rem}.sm\:pl-32{padding-left:8rem}.sm\:pt-40{padding-top:10rem}.sm\:pr-40{padding-right:10rem}.sm\:pb-40{padding-bottom:10rem}.sm\:pl-40{padding-left:10rem}.sm\:pt-48{padding-top:12rem}.sm\:pr-48{padding-right:12rem}.sm\:pb-48{padding-bottom:12rem}.sm\:pl-48{padding-left:12rem}.sm\:pt-56{padding-top:14rem}.sm\:pr-56{padding-right:14rem}.sm\:pb-56{padding-bottom:14rem}.sm\:pl-56{padding-left:14rem}.sm\:pt-64{padding-top:16rem}.sm\:pr-64{padding-right:16rem}.sm\:pb-64{padding-bottom:16rem}.sm\:pl-64{padding-left:16rem}.sm\:pt-px{padding-top:1px}.sm\:pr-px{padding-right:1px}.sm\:pb-px{padding-bottom:1px}.sm\:pl-px{padding-left:1px}.sm\:placeholder-transparent:-ms-input-placeholder{color:transparent}.sm\:placeholder-transparent::-ms-input-placeholder{color:transparent}.sm\:placeholder-transparent::placeholder{color:transparent}.sm\:placeholder-current:-ms-input-placeholder{color:currentColor}.sm\:placeholder-current::-ms-input-placeholder{color:currentColor}.sm\:placeholder-current::placeholder{color:currentColor}.sm\:placeholder-black:-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.sm\:placeholder-black::-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.sm\:placeholder-black::placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.sm\:placeholder-white:-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.sm\:placeholder-white::-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.sm\:placeholder-white::placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.sm\:placeholder-gray-100:-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.sm\:placeholder-gray-100::-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.sm\:placeholder-gray-100::placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.sm\:placeholder-gray-200:-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.sm\:placeholder-gray-200::-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.sm\:placeholder-gray-200::placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.sm\:placeholder-gray-300:-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.sm\:placeholder-gray-300::-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.sm\:placeholder-gray-300::placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.sm\:placeholder-gray-400:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.sm\:placeholder-gray-400::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.sm\:placeholder-gray-400::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.sm\:placeholder-gray-500:-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.sm\:placeholder-gray-500::-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.sm\:placeholder-gray-500::placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.sm\:placeholder-gray-600:-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.sm\:placeholder-gray-600::-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.sm\:placeholder-gray-600::placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.sm\:placeholder-gray-700:-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.sm\:placeholder-gray-700::-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.sm\:placeholder-gray-700::placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.sm\:placeholder-gray-800:-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.sm\:placeholder-gray-800::-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.sm\:placeholder-gray-800::placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.sm\:placeholder-gray-900:-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.sm\:placeholder-gray-900::-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.sm\:placeholder-gray-900::placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.sm\:placeholder-red-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.sm\:placeholder-red-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.sm\:placeholder-red-100::placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.sm\:placeholder-red-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.sm\:placeholder-red-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.sm\:placeholder-red-200::placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.sm\:placeholder-red-300:-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.sm\:placeholder-red-300::-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.sm\:placeholder-red-300::placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.sm\:placeholder-red-400:-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.sm\:placeholder-red-400::-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.sm\:placeholder-red-400::placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.sm\:placeholder-red-500:-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.sm\:placeholder-red-500::-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.sm\:placeholder-red-500::placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.sm\:placeholder-red-600:-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.sm\:placeholder-red-600::-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.sm\:placeholder-red-600::placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.sm\:placeholder-red-700:-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.sm\:placeholder-red-700::-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.sm\:placeholder-red-700::placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.sm\:placeholder-red-800:-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.sm\:placeholder-red-800::-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.sm\:placeholder-red-800::placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.sm\:placeholder-red-900:-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.sm\:placeholder-red-900::-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.sm\:placeholder-red-900::placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.sm\:placeholder-orange-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.sm\:placeholder-orange-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.sm\:placeholder-orange-100::placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.sm\:placeholder-orange-200:-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.sm\:placeholder-orange-200::-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.sm\:placeholder-orange-200::placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.sm\:placeholder-orange-300:-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.sm\:placeholder-orange-300::-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.sm\:placeholder-orange-300::placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.sm\:placeholder-orange-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.sm\:placeholder-orange-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.sm\:placeholder-orange-400::placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.sm\:placeholder-orange-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.sm\:placeholder-orange-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.sm\:placeholder-orange-500::placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.sm\:placeholder-orange-600:-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.sm\:placeholder-orange-600::-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.sm\:placeholder-orange-600::placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.sm\:placeholder-orange-700:-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.sm\:placeholder-orange-700::-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.sm\:placeholder-orange-700::placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.sm\:placeholder-orange-800:-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.sm\:placeholder-orange-800::-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.sm\:placeholder-orange-800::placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.sm\:placeholder-orange-900:-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.sm\:placeholder-orange-900::-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.sm\:placeholder-orange-900::placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.sm\:placeholder-yellow-100:-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.sm\:placeholder-yellow-100::-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.sm\:placeholder-yellow-100::placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.sm\:placeholder-yellow-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.sm\:placeholder-yellow-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.sm\:placeholder-yellow-200::placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.sm\:placeholder-yellow-300:-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.sm\:placeholder-yellow-300::-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.sm\:placeholder-yellow-300::placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.sm\:placeholder-yellow-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.sm\:placeholder-yellow-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.sm\:placeholder-yellow-400::placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.sm\:placeholder-yellow-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.sm\:placeholder-yellow-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.sm\:placeholder-yellow-500::placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.sm\:placeholder-yellow-600:-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.sm\:placeholder-yellow-600::-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.sm\:placeholder-yellow-600::placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.sm\:placeholder-yellow-700:-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.sm\:placeholder-yellow-700::-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.sm\:placeholder-yellow-700::placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.sm\:placeholder-yellow-800:-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.sm\:placeholder-yellow-800::-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.sm\:placeholder-yellow-800::placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.sm\:placeholder-yellow-900:-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.sm\:placeholder-yellow-900::-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.sm\:placeholder-yellow-900::placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.sm\:placeholder-green-100:-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.sm\:placeholder-green-100::-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.sm\:placeholder-green-100::placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.sm\:placeholder-green-200:-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.sm\:placeholder-green-200::-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.sm\:placeholder-green-200::placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.sm\:placeholder-green-300:-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.sm\:placeholder-green-300::-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.sm\:placeholder-green-300::placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.sm\:placeholder-green-400:-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.sm\:placeholder-green-400::-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.sm\:placeholder-green-400::placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.sm\:placeholder-green-500:-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.sm\:placeholder-green-500::-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.sm\:placeholder-green-500::placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.sm\:placeholder-green-600:-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.sm\:placeholder-green-600::-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.sm\:placeholder-green-600::placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.sm\:placeholder-green-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.sm\:placeholder-green-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.sm\:placeholder-green-700::placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.sm\:placeholder-green-800:-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.sm\:placeholder-green-800::-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.sm\:placeholder-green-800::placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.sm\:placeholder-green-900:-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.sm\:placeholder-green-900::-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.sm\:placeholder-green-900::placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.sm\:placeholder-teal-100:-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.sm\:placeholder-teal-100::-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.sm\:placeholder-teal-100::placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.sm\:placeholder-teal-200:-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.sm\:placeholder-teal-200::-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.sm\:placeholder-teal-200::placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.sm\:placeholder-teal-300:-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.sm\:placeholder-teal-300::-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.sm\:placeholder-teal-300::placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.sm\:placeholder-teal-400:-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.sm\:placeholder-teal-400::-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.sm\:placeholder-teal-400::placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.sm\:placeholder-teal-500:-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.sm\:placeholder-teal-500::-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.sm\:placeholder-teal-500::placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.sm\:placeholder-teal-600:-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.sm\:placeholder-teal-600::-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.sm\:placeholder-teal-600::placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.sm\:placeholder-teal-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.sm\:placeholder-teal-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.sm\:placeholder-teal-700::placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.sm\:placeholder-teal-800:-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.sm\:placeholder-teal-800::-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.sm\:placeholder-teal-800::placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.sm\:placeholder-teal-900:-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.sm\:placeholder-teal-900::-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.sm\:placeholder-teal-900::placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.sm\:placeholder-blue-100:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.sm\:placeholder-blue-100::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.sm\:placeholder-blue-100::placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.sm\:placeholder-blue-200:-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.sm\:placeholder-blue-200::-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.sm\:placeholder-blue-200::placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.sm\:placeholder-blue-300:-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.sm\:placeholder-blue-300::-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.sm\:placeholder-blue-300::placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.sm\:placeholder-blue-400:-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.sm\:placeholder-blue-400::-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.sm\:placeholder-blue-400::placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.sm\:placeholder-blue-500:-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.sm\:placeholder-blue-500::-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.sm\:placeholder-blue-500::placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.sm\:placeholder-blue-600:-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.sm\:placeholder-blue-600::-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.sm\:placeholder-blue-600::placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.sm\:placeholder-blue-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.sm\:placeholder-blue-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.sm\:placeholder-blue-700::placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.sm\:placeholder-blue-800:-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.sm\:placeholder-blue-800::-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.sm\:placeholder-blue-800::placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.sm\:placeholder-blue-900:-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.sm\:placeholder-blue-900::-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.sm\:placeholder-blue-900::placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.sm\:placeholder-indigo-100:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.sm\:placeholder-indigo-100::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.sm\:placeholder-indigo-100::placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.sm\:placeholder-indigo-200:-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.sm\:placeholder-indigo-200::-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.sm\:placeholder-indigo-200::placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.sm\:placeholder-indigo-300:-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.sm\:placeholder-indigo-300::-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.sm\:placeholder-indigo-300::placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.sm\:placeholder-indigo-400:-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.sm\:placeholder-indigo-400::-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.sm\:placeholder-indigo-400::placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.sm\:placeholder-indigo-500:-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.sm\:placeholder-indigo-500::-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.sm\:placeholder-indigo-500::placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.sm\:placeholder-indigo-600:-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.sm\:placeholder-indigo-600::-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.sm\:placeholder-indigo-600::placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.sm\:placeholder-indigo-700:-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.sm\:placeholder-indigo-700::-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.sm\:placeholder-indigo-700::placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.sm\:placeholder-indigo-800:-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.sm\:placeholder-indigo-800::-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.sm\:placeholder-indigo-800::placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.sm\:placeholder-indigo-900:-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.sm\:placeholder-indigo-900::-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.sm\:placeholder-indigo-900::placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.sm\:placeholder-purple-100:-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.sm\:placeholder-purple-100::-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.sm\:placeholder-purple-100::placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.sm\:placeholder-purple-200:-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.sm\:placeholder-purple-200::-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.sm\:placeholder-purple-200::placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.sm\:placeholder-purple-300:-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.sm\:placeholder-purple-300::-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.sm\:placeholder-purple-300::placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.sm\:placeholder-purple-400:-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.sm\:placeholder-purple-400::-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.sm\:placeholder-purple-400::placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.sm\:placeholder-purple-500:-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.sm\:placeholder-purple-500::-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.sm\:placeholder-purple-500::placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.sm\:placeholder-purple-600:-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.sm\:placeholder-purple-600::-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.sm\:placeholder-purple-600::placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.sm\:placeholder-purple-700:-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.sm\:placeholder-purple-700::-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.sm\:placeholder-purple-700::placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.sm\:placeholder-purple-800:-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.sm\:placeholder-purple-800::-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.sm\:placeholder-purple-800::placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.sm\:placeholder-purple-900:-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.sm\:placeholder-purple-900::-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.sm\:placeholder-purple-900::placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.sm\:placeholder-pink-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.sm\:placeholder-pink-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.sm\:placeholder-pink-100::placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.sm\:placeholder-pink-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.sm\:placeholder-pink-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.sm\:placeholder-pink-200::placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.sm\:placeholder-pink-300:-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.sm\:placeholder-pink-300::-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.sm\:placeholder-pink-300::placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.sm\:placeholder-pink-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.sm\:placeholder-pink-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.sm\:placeholder-pink-400::placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.sm\:placeholder-pink-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.sm\:placeholder-pink-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.sm\:placeholder-pink-500::placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.sm\:placeholder-pink-600:-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.sm\:placeholder-pink-600::-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.sm\:placeholder-pink-600::placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.sm\:placeholder-pink-700:-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.sm\:placeholder-pink-700::-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.sm\:placeholder-pink-700::placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.sm\:placeholder-pink-800:-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.sm\:placeholder-pink-800::-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.sm\:placeholder-pink-800::placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.sm\:placeholder-pink-900:-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.sm\:placeholder-pink-900::-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.sm\:placeholder-pink-900::placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.sm\:focus\:placeholder-transparent:focus:-ms-input-placeholder{color:transparent}.sm\:focus\:placeholder-transparent:focus::-ms-input-placeholder{color:transparent}.sm\:focus\:placeholder-transparent:focus::placeholder{color:transparent}.sm\:focus\:placeholder-current:focus:-ms-input-placeholder{color:currentColor}.sm\:focus\:placeholder-current:focus::-ms-input-placeholder{color:currentColor}.sm\:focus\:placeholder-current:focus::placeholder{color:currentColor}.sm\:focus\:placeholder-black:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.sm\:focus\:placeholder-black:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.sm\:focus\:placeholder-black:focus::placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.sm\:focus\:placeholder-white:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-white:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-white:focus::placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-100:focus::placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-200:focus::placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-300:focus::placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-400:focus::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-500:focus::placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-600:focus::placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-700:focus::placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-800:focus::placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.sm\:focus\:placeholder-gray-900:focus::placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-100:focus::placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-200:focus::placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-300:focus::placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-400:focus::placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-500:focus::placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-600:focus::placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-700:focus::placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-800:focus::placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.sm\:focus\:placeholder-red-900:focus::placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-100:focus::placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-200:focus::placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-300:focus::placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-400:focus::placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-500:focus::placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-600:focus::placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-700:focus::placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-800:focus::placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.sm\:focus\:placeholder-orange-900:focus::placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-100:focus::placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-200:focus::placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-300:focus::placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-400:focus::placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-500:focus::placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-600:focus::placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-700:focus::placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-800:focus::placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.sm\:focus\:placeholder-yellow-900:focus::placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-100:focus::placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-200:focus::placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-300:focus::placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-400:focus::placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-500:focus::placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-600:focus::placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-700:focus::placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-800:focus::placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.sm\:focus\:placeholder-green-900:focus::placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-100:focus::placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-200:focus::placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-300:focus::placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-400:focus::placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-500:focus::placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-600:focus::placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-700:focus::placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-800:focus::placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.sm\:focus\:placeholder-teal-900:focus::placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-100:focus::placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-200:focus::placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-300:focus::placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-400:focus::placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-500:focus::placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-600:focus::placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-700:focus::placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-800:focus::placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.sm\:focus\:placeholder-blue-900:focus::placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-100:focus::placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-200:focus::placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-300:focus::placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-400:focus::placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-500:focus::placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-600:focus::placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-700:focus::placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-800:focus::placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.sm\:focus\:placeholder-indigo-900:focus::placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-100:focus::placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-200:focus::placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-300:focus::placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-400:focus::placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-500:focus::placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-600:focus::placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-700:focus::placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-800:focus::placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.sm\:focus\:placeholder-purple-900:focus::placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-100:focus::placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-200:focus::placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-300:focus::placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-400:focus::placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-500:focus::placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-600:focus::placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-700:focus::placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-800:focus::placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.sm\:focus\:placeholder-pink-900:focus::placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.sm\:placeholder-opacity-0:-ms-input-placeholder{--placeholder-opacity:0}.sm\:placeholder-opacity-0::-ms-input-placeholder{--placeholder-opacity:0}.sm\:placeholder-opacity-0::placeholder{--placeholder-opacity:0}.sm\:placeholder-opacity-25:-ms-input-placeholder{--placeholder-opacity:0.25}.sm\:placeholder-opacity-25::-ms-input-placeholder{--placeholder-opacity:0.25}.sm\:placeholder-opacity-25::placeholder{--placeholder-opacity:0.25}.sm\:placeholder-opacity-50:-ms-input-placeholder{--placeholder-opacity:0.5}.sm\:placeholder-opacity-50::-ms-input-placeholder{--placeholder-opacity:0.5}.sm\:placeholder-opacity-50::placeholder{--placeholder-opacity:0.5}.sm\:placeholder-opacity-75:-ms-input-placeholder{--placeholder-opacity:0.75}.sm\:placeholder-opacity-75::-ms-input-placeholder{--placeholder-opacity:0.75}.sm\:placeholder-opacity-75::placeholder{--placeholder-opacity:0.75}.sm\:placeholder-opacity-100:-ms-input-placeholder{--placeholder-opacity:1}.sm\:placeholder-opacity-100::-ms-input-placeholder{--placeholder-opacity:1}.sm\:placeholder-opacity-100::placeholder{--placeholder-opacity:1}.sm\:focus\:placeholder-opacity-0:focus:-ms-input-placeholder{--placeholder-opacity:0}.sm\:focus\:placeholder-opacity-0:focus::-ms-input-placeholder{--placeholder-opacity:0}.sm\:focus\:placeholder-opacity-0:focus::placeholder{--placeholder-opacity:0}.sm\:focus\:placeholder-opacity-25:focus:-ms-input-placeholder{--placeholder-opacity:0.25}.sm\:focus\:placeholder-opacity-25:focus::-ms-input-placeholder{--placeholder-opacity:0.25}.sm\:focus\:placeholder-opacity-25:focus::placeholder{--placeholder-opacity:0.25}.sm\:focus\:placeholder-opacity-50:focus:-ms-input-placeholder{--placeholder-opacity:0.5}.sm\:focus\:placeholder-opacity-50:focus::-ms-input-placeholder{--placeholder-opacity:0.5}.sm\:focus\:placeholder-opacity-50:focus::placeholder{--placeholder-opacity:0.5}.sm\:focus\:placeholder-opacity-75:focus:-ms-input-placeholder{--placeholder-opacity:0.75}.sm\:focus\:placeholder-opacity-75:focus::-ms-input-placeholder{--placeholder-opacity:0.75}.sm\:focus\:placeholder-opacity-75:focus::placeholder{--placeholder-opacity:0.75}.sm\:focus\:placeholder-opacity-100:focus:-ms-input-placeholder{--placeholder-opacity:1}.sm\:focus\:placeholder-opacity-100:focus::-ms-input-placeholder{--placeholder-opacity:1}.sm\:focus\:placeholder-opacity-100:focus::placeholder{--placeholder-opacity:1}.sm\:pointer-events-none{pointer-events:none}.sm\:pointer-events-auto{pointer-events:auto}.sm\:static{position:static}.sm\:fixed{position:fixed}.sm\:absolute{position:absolute}.sm\:relative{position:relative}.sm\:sticky{position:-webkit-sticky;position:sticky}.sm\:inset-0{top:0;right:0;bottom:0;left:0}.sm\:inset-auto{top:auto;right:auto;bottom:auto;left:auto}.sm\:inset-y-0{top:0;bottom:0}.sm\:inset-x-0{right:0;left:0}.sm\:inset-y-auto{top:auto;bottom:auto}.sm\:inset-x-auto{right:auto;left:auto}.sm\:top-0{top:0}.sm\:right-0{right:0}.sm\:bottom-0{bottom:0}.sm\:left-0{left:0}.sm\:top-auto{top:auto}.sm\:right-auto{right:auto}.sm\:bottom-auto{bottom:auto}.sm\:left-auto{left:auto}.sm\:resize-none{resize:none}.sm\:resize-y{resize:vertical}.sm\:resize-x{resize:horizontal}.sm\:resize{resize:both}.sm\:shadow-xs{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.sm\:shadow-sm{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.sm\:shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.sm\:shadow-md{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.sm\:shadow-lg{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.sm\:shadow-xl{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.sm\:shadow-2xl{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.sm\:shadow-inner{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.sm\:shadow-outline{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.sm\:shadow-none{box-shadow:none}.sm\:hover\:shadow-xs:hover{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.sm\:hover\:shadow-sm:hover{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.sm\:hover\:shadow:hover{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.sm\:hover\:shadow-md:hover{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.sm\:hover\:shadow-lg:hover{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.sm\:hover\:shadow-xl:hover{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.sm\:hover\:shadow-2xl:hover{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.sm\:hover\:shadow-inner:hover{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.sm\:hover\:shadow-outline:hover{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.sm\:hover\:shadow-none:hover{box-shadow:none}.sm\:focus\:shadow-xs:focus{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.sm\:focus\:shadow-sm:focus{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.sm\:focus\:shadow:focus{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.sm\:focus\:shadow-md:focus{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.sm\:focus\:shadow-lg:focus{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.sm\:focus\:shadow-xl:focus{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.sm\:focus\:shadow-2xl:focus{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.sm\:focus\:shadow-inner:focus{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.sm\:focus\:shadow-outline:focus{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.sm\:focus\:shadow-none:focus{box-shadow:none}.sm\:fill-current{fill:currentColor}.sm\:stroke-current{stroke:currentColor}.sm\:stroke-0{stroke-width:0}.sm\:stroke-1{stroke-width:1}.sm\:stroke-2{stroke-width:2}.sm\:table-auto{table-layout:auto}.sm\:table-fixed{table-layout:fixed}.sm\:text-left{text-align:left}.sm\:text-center{text-align:center}.sm\:text-right{text-align:right}.sm\:text-justify{text-align:justify}.sm\:text-transparent{color:transparent}.sm\:text-current{color:currentColor}.sm\:text-black{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.sm\:text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.sm\:text-gray-100{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.sm\:text-gray-200{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.sm\:text-gray-300{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.sm\:text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.sm\:text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.sm\:text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.sm\:text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.sm\:text-gray-800{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.sm\:text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.sm\:text-red-100{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.sm\:text-red-200{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.sm\:text-red-300{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.sm\:text-red-400{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.sm\:text-red-500{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.sm\:text-red-600{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.sm\:text-red-700{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.sm\:text-red-800{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.sm\:text-red-900{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.sm\:text-orange-100{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.sm\:text-orange-200{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.sm\:text-orange-300{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.sm\:text-orange-400{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.sm\:text-orange-500{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.sm\:text-orange-600{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.sm\:text-orange-700{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.sm\:text-orange-800{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.sm\:text-orange-900{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.sm\:text-yellow-100{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.sm\:text-yellow-200{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.sm\:text-yellow-300{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.sm\:text-yellow-400{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.sm\:text-yellow-500{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.sm\:text-yellow-600{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.sm\:text-yellow-700{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.sm\:text-yellow-800{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.sm\:text-yellow-900{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.sm\:text-green-100{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.sm\:text-green-200{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.sm\:text-green-300{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.sm\:text-green-400{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.sm\:text-green-500{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.sm\:text-green-600{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.sm\:text-green-700{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.sm\:text-green-800{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.sm\:text-green-900{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.sm\:text-teal-100{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.sm\:text-teal-200{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.sm\:text-teal-300{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.sm\:text-teal-400{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.sm\:text-teal-500{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.sm\:text-teal-600{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.sm\:text-teal-700{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.sm\:text-teal-800{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.sm\:text-teal-900{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.sm\:text-blue-100{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.sm\:text-blue-200{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.sm\:text-blue-300{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.sm\:text-blue-400{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.sm\:text-blue-500{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.sm\:text-blue-600{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.sm\:text-blue-700{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.sm\:text-blue-800{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.sm\:text-blue-900{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.sm\:text-indigo-100{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.sm\:text-indigo-200{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.sm\:text-indigo-300{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.sm\:text-indigo-400{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.sm\:text-indigo-500{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.sm\:text-indigo-600{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.sm\:text-indigo-700{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.sm\:text-indigo-800{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.sm\:text-indigo-900{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.sm\:text-purple-100{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.sm\:text-purple-200{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.sm\:text-purple-300{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.sm\:text-purple-400{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.sm\:text-purple-500{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.sm\:text-purple-600{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.sm\:text-purple-700{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.sm\:text-purple-800{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.sm\:text-purple-900{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.sm\:text-pink-100{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.sm\:text-pink-200{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.sm\:text-pink-300{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.sm\:text-pink-400{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.sm\:text-pink-500{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.sm\:text-pink-600{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.sm\:text-pink-700{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.sm\:text-pink-800{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.sm\:text-pink-900{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.sm\:hover\:text-transparent:hover{color:transparent}.sm\:hover\:text-current:hover{color:currentColor}.sm\:hover\:text-black:hover{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.sm\:hover\:text-white:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.sm\:hover\:text-gray-100:hover{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.sm\:hover\:text-gray-200:hover{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.sm\:hover\:text-gray-300:hover{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.sm\:hover\:text-gray-400:hover{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.sm\:hover\:text-gray-500:hover{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.sm\:hover\:text-gray-600:hover{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.sm\:hover\:text-gray-700:hover{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.sm\:hover\:text-gray-800:hover{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.sm\:hover\:text-gray-900:hover{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.sm\:hover\:text-red-100:hover{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.sm\:hover\:text-red-200:hover{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.sm\:hover\:text-red-300:hover{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.sm\:hover\:text-red-400:hover{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.sm\:hover\:text-red-500:hover{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.sm\:hover\:text-red-600:hover{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.sm\:hover\:text-red-700:hover{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.sm\:hover\:text-red-800:hover{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.sm\:hover\:text-red-900:hover{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.sm\:hover\:text-orange-100:hover{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.sm\:hover\:text-orange-200:hover{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.sm\:hover\:text-orange-300:hover{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.sm\:hover\:text-orange-400:hover{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.sm\:hover\:text-orange-500:hover{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.sm\:hover\:text-orange-600:hover{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.sm\:hover\:text-orange-700:hover{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.sm\:hover\:text-orange-800:hover{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.sm\:hover\:text-orange-900:hover{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.sm\:hover\:text-yellow-100:hover{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.sm\:hover\:text-yellow-200:hover{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.sm\:hover\:text-yellow-300:hover{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.sm\:hover\:text-yellow-400:hover{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.sm\:hover\:text-yellow-500:hover{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.sm\:hover\:text-yellow-600:hover{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.sm\:hover\:text-yellow-700:hover{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.sm\:hover\:text-yellow-800:hover{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.sm\:hover\:text-yellow-900:hover{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.sm\:hover\:text-green-100:hover{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.sm\:hover\:text-green-200:hover{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.sm\:hover\:text-green-300:hover{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.sm\:hover\:text-green-400:hover{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.sm\:hover\:text-green-500:hover{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.sm\:hover\:text-green-600:hover{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.sm\:hover\:text-green-700:hover{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.sm\:hover\:text-green-800:hover{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.sm\:hover\:text-green-900:hover{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.sm\:hover\:text-teal-100:hover{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.sm\:hover\:text-teal-200:hover{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.sm\:hover\:text-teal-300:hover{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.sm\:hover\:text-teal-400:hover{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.sm\:hover\:text-teal-500:hover{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.sm\:hover\:text-teal-600:hover{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.sm\:hover\:text-teal-700:hover{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.sm\:hover\:text-teal-800:hover{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.sm\:hover\:text-teal-900:hover{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.sm\:hover\:text-blue-100:hover{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.sm\:hover\:text-blue-200:hover{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.sm\:hover\:text-blue-300:hover{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.sm\:hover\:text-blue-400:hover{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.sm\:hover\:text-blue-500:hover{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.sm\:hover\:text-blue-600:hover{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.sm\:hover\:text-blue-700:hover{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.sm\:hover\:text-blue-800:hover{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.sm\:hover\:text-blue-900:hover{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.sm\:hover\:text-indigo-100:hover{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.sm\:hover\:text-indigo-200:hover{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.sm\:hover\:text-indigo-300:hover{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.sm\:hover\:text-indigo-400:hover{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.sm\:hover\:text-indigo-500:hover{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.sm\:hover\:text-indigo-600:hover{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.sm\:hover\:text-indigo-700:hover{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.sm\:hover\:text-indigo-800:hover{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.sm\:hover\:text-indigo-900:hover{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.sm\:hover\:text-purple-100:hover{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.sm\:hover\:text-purple-200:hover{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.sm\:hover\:text-purple-300:hover{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.sm\:hover\:text-purple-400:hover{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.sm\:hover\:text-purple-500:hover{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.sm\:hover\:text-purple-600:hover{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.sm\:hover\:text-purple-700:hover{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.sm\:hover\:text-purple-800:hover{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.sm\:hover\:text-purple-900:hover{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.sm\:hover\:text-pink-100:hover{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.sm\:hover\:text-pink-200:hover{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.sm\:hover\:text-pink-300:hover{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.sm\:hover\:text-pink-400:hover{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.sm\:hover\:text-pink-500:hover{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.sm\:hover\:text-pink-600:hover{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.sm\:hover\:text-pink-700:hover{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.sm\:hover\:text-pink-800:hover{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.sm\:hover\:text-pink-900:hover{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.sm\:focus\:text-transparent:focus{color:transparent}.sm\:focus\:text-current:focus{color:currentColor}.sm\:focus\:text-black:focus{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.sm\:focus\:text-white:focus{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.sm\:focus\:text-gray-100:focus{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.sm\:focus\:text-gray-200:focus{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.sm\:focus\:text-gray-300:focus{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.sm\:focus\:text-gray-400:focus{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.sm\:focus\:text-gray-500:focus{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.sm\:focus\:text-gray-600:focus{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.sm\:focus\:text-gray-700:focus{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.sm\:focus\:text-gray-800:focus{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.sm\:focus\:text-gray-900:focus{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.sm\:focus\:text-red-100:focus{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.sm\:focus\:text-red-200:focus{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.sm\:focus\:text-red-300:focus{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.sm\:focus\:text-red-400:focus{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.sm\:focus\:text-red-500:focus{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.sm\:focus\:text-red-600:focus{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.sm\:focus\:text-red-700:focus{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.sm\:focus\:text-red-800:focus{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.sm\:focus\:text-red-900:focus{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.sm\:focus\:text-orange-100:focus{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.sm\:focus\:text-orange-200:focus{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.sm\:focus\:text-orange-300:focus{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.sm\:focus\:text-orange-400:focus{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.sm\:focus\:text-orange-500:focus{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.sm\:focus\:text-orange-600:focus{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.sm\:focus\:text-orange-700:focus{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.sm\:focus\:text-orange-800:focus{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.sm\:focus\:text-orange-900:focus{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.sm\:focus\:text-yellow-100:focus{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.sm\:focus\:text-yellow-200:focus{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.sm\:focus\:text-yellow-300:focus{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.sm\:focus\:text-yellow-400:focus{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.sm\:focus\:text-yellow-500:focus{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.sm\:focus\:text-yellow-600:focus{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.sm\:focus\:text-yellow-700:focus{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.sm\:focus\:text-yellow-800:focus{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.sm\:focus\:text-yellow-900:focus{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.sm\:focus\:text-green-100:focus{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.sm\:focus\:text-green-200:focus{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.sm\:focus\:text-green-300:focus{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.sm\:focus\:text-green-400:focus{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.sm\:focus\:text-green-500:focus{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.sm\:focus\:text-green-600:focus{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.sm\:focus\:text-green-700:focus{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.sm\:focus\:text-green-800:focus{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.sm\:focus\:text-green-900:focus{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.sm\:focus\:text-teal-100:focus{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.sm\:focus\:text-teal-200:focus{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.sm\:focus\:text-teal-300:focus{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.sm\:focus\:text-teal-400:focus{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.sm\:focus\:text-teal-500:focus{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.sm\:focus\:text-teal-600:focus{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.sm\:focus\:text-teal-700:focus{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.sm\:focus\:text-teal-800:focus{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.sm\:focus\:text-teal-900:focus{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.sm\:focus\:text-blue-100:focus{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.sm\:focus\:text-blue-200:focus{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.sm\:focus\:text-blue-300:focus{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.sm\:focus\:text-blue-400:focus{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.sm\:focus\:text-blue-500:focus{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.sm\:focus\:text-blue-600:focus{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.sm\:focus\:text-blue-700:focus{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.sm\:focus\:text-blue-800:focus{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.sm\:focus\:text-blue-900:focus{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.sm\:focus\:text-indigo-100:focus{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.sm\:focus\:text-indigo-200:focus{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.sm\:focus\:text-indigo-300:focus{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.sm\:focus\:text-indigo-400:focus{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.sm\:focus\:text-indigo-500:focus{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.sm\:focus\:text-indigo-600:focus{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.sm\:focus\:text-indigo-700:focus{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.sm\:focus\:text-indigo-800:focus{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.sm\:focus\:text-indigo-900:focus{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.sm\:focus\:text-purple-100:focus{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.sm\:focus\:text-purple-200:focus{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.sm\:focus\:text-purple-300:focus{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.sm\:focus\:text-purple-400:focus{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.sm\:focus\:text-purple-500:focus{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.sm\:focus\:text-purple-600:focus{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.sm\:focus\:text-purple-700:focus{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.sm\:focus\:text-purple-800:focus{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.sm\:focus\:text-purple-900:focus{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.sm\:focus\:text-pink-100:focus{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.sm\:focus\:text-pink-200:focus{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.sm\:focus\:text-pink-300:focus{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.sm\:focus\:text-pink-400:focus{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.sm\:focus\:text-pink-500:focus{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.sm\:focus\:text-pink-600:focus{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.sm\:focus\:text-pink-700:focus{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.sm\:focus\:text-pink-800:focus{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.sm\:focus\:text-pink-900:focus{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.sm\:text-opacity-0{--text-opacity:0}.sm\:text-opacity-25{--text-opacity:0.25}.sm\:text-opacity-50{--text-opacity:0.5}.sm\:text-opacity-75{--text-opacity:0.75}.sm\:text-opacity-100{--text-opacity:1}.sm\:hover\:text-opacity-0:hover{--text-opacity:0}.sm\:hover\:text-opacity-25:hover{--text-opacity:0.25}.sm\:hover\:text-opacity-50:hover{--text-opacity:0.5}.sm\:hover\:text-opacity-75:hover{--text-opacity:0.75}.sm\:hover\:text-opacity-100:hover{--text-opacity:1}.sm\:focus\:text-opacity-0:focus{--text-opacity:0}.sm\:focus\:text-opacity-25:focus{--text-opacity:0.25}.sm\:focus\:text-opacity-50:focus{--text-opacity:0.5}.sm\:focus\:text-opacity-75:focus{--text-opacity:0.75}.sm\:focus\:text-opacity-100:focus{--text-opacity:1}.sm\:italic{font-style:italic}.sm\:not-italic{font-style:normal}.sm\:uppercase{text-transform:uppercase}.sm\:lowercase{text-transform:lowercase}.sm\:capitalize{text-transform:capitalize}.sm\:normal-case{text-transform:none}.sm\:underline{text-decoration:underline}.sm\:line-through{text-decoration:line-through}.sm\:no-underline{text-decoration:none}.sm\:hover\:underline:hover{text-decoration:underline}.sm\:hover\:line-through:hover{text-decoration:line-through}.sm\:hover\:no-underline:hover{text-decoration:none}.sm\:focus\:underline:focus{text-decoration:underline}.sm\:focus\:line-through:focus{text-decoration:line-through}.sm\:focus\:no-underline:focus{text-decoration:none}.sm\:antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.sm\:subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.sm\:diagonal-fractions,.sm\:lining-nums,.sm\:oldstyle-nums,.sm\:ordinal,.sm\:proportional-nums,.sm\:slashed-zero,.sm\:stacked-fractions,.sm\:tabular-nums{--font-variant-numeric-ordinal:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-slashed-zero:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-figure:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-spacing:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-fraction:var(--tailwind-empty, );/*!*//*!*/font-variant-numeric:var(--font-variant-numeric-ordinal) var(--font-variant-numeric-slashed-zero) var(--font-variant-numeric-figure) var(--font-variant-numeric-spacing) var(--font-variant-numeric-fraction)}.sm\:normal-nums{font-variant-numeric:normal}.sm\:ordinal{--font-variant-numeric-ordinal:ordinal}.sm\:slashed-zero{--font-variant-numeric-slashed-zero:slashed-zero}.sm\:lining-nums{--font-variant-numeric-figure:lining-nums}.sm\:oldstyle-nums{--font-variant-numeric-figure:oldstyle-nums}.sm\:proportional-nums{--font-variant-numeric-spacing:proportional-nums}.sm\:tabular-nums{--font-variant-numeric-spacing:tabular-nums}.sm\:diagonal-fractions{--font-variant-numeric-fraction:diagonal-fractions}.sm\:stacked-fractions{--font-variant-numeric-fraction:stacked-fractions}.sm\:tracking-tighter{letter-spacing:-.05em}.sm\:tracking-tight{letter-spacing:-.025em}.sm\:tracking-normal{letter-spacing:0}.sm\:tracking-wide{letter-spacing:.025em}.sm\:tracking-wider{letter-spacing:.05em}.sm\:tracking-widest{letter-spacing:.1em}.sm\:select-none{-webkit-user-select:none;-ms-user-select:none;user-select:none}.sm\:select-text{-webkit-user-select:text;-ms-user-select:text;user-select:text}.sm\:select-all{-webkit-user-select:all;-ms-user-select:all;user-select:all}.sm\:select-auto{-webkit-user-select:auto;-ms-user-select:auto;user-select:auto}.sm\:align-baseline{vertical-align:baseline}.sm\:align-top{vertical-align:top}.sm\:align-middle{vertical-align:middle}.sm\:align-bottom{vertical-align:bottom}.sm\:align-text-top{vertical-align:text-top}.sm\:align-text-bottom{vertical-align:text-bottom}.sm\:visible{visibility:visible}.sm\:invisible{visibility:hidden}.sm\:whitespace-normal{white-space:normal}.sm\:whitespace-no-wrap{white-space:nowrap}.sm\:whitespace-pre{white-space:pre}.sm\:whitespace-pre-line{white-space:pre-line}.sm\:whitespace-pre-wrap{white-space:pre-wrap}.sm\:break-normal{word-wrap:normal;overflow-wrap:normal;word-break:normal}.sm\:break-words{word-wrap:break-word;overflow-wrap:break-word}.sm\:break-all{word-break:break-all}.sm\:truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sm\:w-0{width:0}.sm\:w-1{width:.25rem}.sm\:w-2{width:.5rem}.sm\:w-3{width:.75rem}.sm\:w-4{width:1rem}.sm\:w-5{width:1.25rem}.sm\:w-6{width:1.5rem}.sm\:w-8{width:2rem}.sm\:w-10{width:2.5rem}.sm\:w-12{width:3rem}.sm\:w-16{width:4rem}.sm\:w-20{width:5rem}.sm\:w-24{width:6rem}.sm\:w-32{width:8rem}.sm\:w-40{width:10rem}.sm\:w-48{width:12rem}.sm\:w-56{width:14rem}.sm\:w-64{width:16rem}.sm\:w-auto{width:auto}.sm\:w-px{width:1px}.sm\:w-1\/2{width:50%}.sm\:w-1\/3{width:33.333333%}.sm\:w-2\/3{width:66.666667%}.sm\:w-1\/4{width:25%}.sm\:w-2\/4{width:50%}.sm\:w-3\/4{width:75%}.sm\:w-1\/5{width:20%}.sm\:w-2\/5{width:40%}.sm\:w-3\/5{width:60%}.sm\:w-4\/5{width:80%}.sm\:w-1\/6{width:16.666667%}.sm\:w-2\/6{width:33.333333%}.sm\:w-3\/6{width:50%}.sm\:w-4\/6{width:66.666667%}.sm\:w-5\/6{width:83.333333%}.sm\:w-1\/12{width:8.333333%}.sm\:w-2\/12{width:16.666667%}.sm\:w-3\/12{width:25%}.sm\:w-4\/12{width:33.333333%}.sm\:w-5\/12{width:41.666667%}.sm\:w-6\/12{width:50%}.sm\:w-7\/12{width:58.333333%}.sm\:w-8\/12{width:66.666667%}.sm\:w-9\/12{width:75%}.sm\:w-10\/12{width:83.333333%}.sm\:w-11\/12{width:91.666667%}.sm\:w-full{width:100%}.sm\:w-screen{width:100vw}.sm\:z-0{z-index:0}.sm\:z-10{z-index:10}.sm\:z-20{z-index:20}.sm\:z-30{z-index:30}.sm\:z-40{z-index:40}.sm\:z-50{z-index:50}.sm\:z-auto{z-index:auto}.sm\:gap-0{grid-gap:0;gap:0}.sm\:gap-1{grid-gap:.25rem;gap:.25rem}.sm\:gap-2{grid-gap:.5rem;gap:.5rem}.sm\:gap-3{grid-gap:.75rem;gap:.75rem}.sm\:gap-4{grid-gap:1rem;gap:1rem}.sm\:gap-5{grid-gap:1.25rem;gap:1.25rem}.sm\:gap-6{grid-gap:1.5rem;gap:1.5rem}.sm\:gap-8{grid-gap:2rem;gap:2rem}.sm\:gap-10{grid-gap:2.5rem;gap:2.5rem}.sm\:gap-12{grid-gap:3rem;gap:3rem}.sm\:gap-16{grid-gap:4rem;gap:4rem}.sm\:gap-20{grid-gap:5rem;gap:5rem}.sm\:gap-24{grid-gap:6rem;gap:6rem}.sm\:gap-32{grid-gap:8rem;gap:8rem}.sm\:gap-40{grid-gap:10rem;gap:10rem}.sm\:gap-48{grid-gap:12rem;gap:12rem}.sm\:gap-56{grid-gap:14rem;gap:14rem}.sm\:gap-64{grid-gap:16rem;gap:16rem}.sm\:gap-px{grid-gap:1px;gap:1px}.sm\:col-gap-0{grid-column-gap:0;column-gap:0}.sm\:col-gap-1{grid-column-gap:.25rem;column-gap:.25rem}.sm\:col-gap-2{grid-column-gap:.5rem;column-gap:.5rem}.sm\:col-gap-3{grid-column-gap:.75rem;column-gap:.75rem}.sm\:col-gap-4{grid-column-gap:1rem;column-gap:1rem}.sm\:col-gap-5{grid-column-gap:1.25rem;column-gap:1.25rem}.sm\:col-gap-6{grid-column-gap:1.5rem;column-gap:1.5rem}.sm\:col-gap-8{grid-column-gap:2rem;column-gap:2rem}.sm\:col-gap-10{grid-column-gap:2.5rem;column-gap:2.5rem}.sm\:col-gap-12{grid-column-gap:3rem;column-gap:3rem}.sm\:col-gap-16{grid-column-gap:4rem;column-gap:4rem}.sm\:col-gap-20{grid-column-gap:5rem;column-gap:5rem}.sm\:col-gap-24{grid-column-gap:6rem;column-gap:6rem}.sm\:col-gap-32{grid-column-gap:8rem;column-gap:8rem}.sm\:col-gap-40{grid-column-gap:10rem;column-gap:10rem}.sm\:col-gap-48{grid-column-gap:12rem;column-gap:12rem}.sm\:col-gap-56{grid-column-gap:14rem;column-gap:14rem}.sm\:col-gap-64{grid-column-gap:16rem;column-gap:16rem}.sm\:col-gap-px{grid-column-gap:1px;column-gap:1px}.sm\:gap-x-0{grid-column-gap:0;column-gap:0}.sm\:gap-x-1{grid-column-gap:.25rem;column-gap:.25rem}.sm\:gap-x-2{grid-column-gap:.5rem;column-gap:.5rem}.sm\:gap-x-3{grid-column-gap:.75rem;column-gap:.75rem}.sm\:gap-x-4{grid-column-gap:1rem;column-gap:1rem}.sm\:gap-x-5{grid-column-gap:1.25rem;column-gap:1.25rem}.sm\:gap-x-6{grid-column-gap:1.5rem;column-gap:1.5rem}.sm\:gap-x-8{grid-column-gap:2rem;column-gap:2rem}.sm\:gap-x-10{grid-column-gap:2.5rem;column-gap:2.5rem}.sm\:gap-x-12{grid-column-gap:3rem;column-gap:3rem}.sm\:gap-x-16{grid-column-gap:4rem;column-gap:4rem}.sm\:gap-x-20{grid-column-gap:5rem;column-gap:5rem}.sm\:gap-x-24{grid-column-gap:6rem;column-gap:6rem}.sm\:gap-x-32{grid-column-gap:8rem;column-gap:8rem}.sm\:gap-x-40{grid-column-gap:10rem;column-gap:10rem}.sm\:gap-x-48{grid-column-gap:12rem;column-gap:12rem}.sm\:gap-x-56{grid-column-gap:14rem;column-gap:14rem}.sm\:gap-x-64{grid-column-gap:16rem;column-gap:16rem}.sm\:gap-x-px{grid-column-gap:1px;column-gap:1px}.sm\:row-gap-0{grid-row-gap:0;row-gap:0}.sm\:row-gap-1{grid-row-gap:.25rem;row-gap:.25rem}.sm\:row-gap-2{grid-row-gap:.5rem;row-gap:.5rem}.sm\:row-gap-3{grid-row-gap:.75rem;row-gap:.75rem}.sm\:row-gap-4{grid-row-gap:1rem;row-gap:1rem}.sm\:row-gap-5{grid-row-gap:1.25rem;row-gap:1.25rem}.sm\:row-gap-6{grid-row-gap:1.5rem;row-gap:1.5rem}.sm\:row-gap-8{grid-row-gap:2rem;row-gap:2rem}.sm\:row-gap-10{grid-row-gap:2.5rem;row-gap:2.5rem}.sm\:row-gap-12{grid-row-gap:3rem;row-gap:3rem}.sm\:row-gap-16{grid-row-gap:4rem;row-gap:4rem}.sm\:row-gap-20{grid-row-gap:5rem;row-gap:5rem}.sm\:row-gap-24{grid-row-gap:6rem;row-gap:6rem}.sm\:row-gap-32{grid-row-gap:8rem;row-gap:8rem}.sm\:row-gap-40{grid-row-gap:10rem;row-gap:10rem}.sm\:row-gap-48{grid-row-gap:12rem;row-gap:12rem}.sm\:row-gap-56{grid-row-gap:14rem;row-gap:14rem}.sm\:row-gap-64{grid-row-gap:16rem;row-gap:16rem}.sm\:row-gap-px{grid-row-gap:1px;row-gap:1px}.sm\:gap-y-0{grid-row-gap:0;row-gap:0}.sm\:gap-y-1{grid-row-gap:.25rem;row-gap:.25rem}.sm\:gap-y-2{grid-row-gap:.5rem;row-gap:.5rem}.sm\:gap-y-3{grid-row-gap:.75rem;row-gap:.75rem}.sm\:gap-y-4{grid-row-gap:1rem;row-gap:1rem}.sm\:gap-y-5{grid-row-gap:1.25rem;row-gap:1.25rem}.sm\:gap-y-6{grid-row-gap:1.5rem;row-gap:1.5rem}.sm\:gap-y-8{grid-row-gap:2rem;row-gap:2rem}.sm\:gap-y-10{grid-row-gap:2.5rem;row-gap:2.5rem}.sm\:gap-y-12{grid-row-gap:3rem;row-gap:3rem}.sm\:gap-y-16{grid-row-gap:4rem;row-gap:4rem}.sm\:gap-y-20{grid-row-gap:5rem;row-gap:5rem}.sm\:gap-y-24{grid-row-gap:6rem;row-gap:6rem}.sm\:gap-y-32{grid-row-gap:8rem;row-gap:8rem}.sm\:gap-y-40{grid-row-gap:10rem;row-gap:10rem}.sm\:gap-y-48{grid-row-gap:12rem;row-gap:12rem}.sm\:gap-y-56{grid-row-gap:14rem;row-gap:14rem}.sm\:gap-y-64{grid-row-gap:16rem;row-gap:16rem}.sm\:gap-y-px{grid-row-gap:1px;row-gap:1px}.sm\:grid-flow-row{grid-auto-flow:row}.sm\:grid-flow-col{grid-auto-flow:column}.sm\:grid-flow-row-dense{grid-auto-flow:row dense}.sm\:grid-flow-col-dense{grid-auto-flow:column dense}.sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.sm\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.sm\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.sm\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.sm\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.sm\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.sm\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.sm\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.sm\:grid-cols-none{grid-template-columns:none}.sm\:auto-cols-auto{grid-auto-columns:auto}.sm\:auto-cols-min{grid-auto-columns:-webkit-min-content;grid-auto-columns:min-content}.sm\:auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.sm\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.sm\:col-auto{grid-column:auto}.sm\:col-span-1{grid-column:span 1/span 1}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:col-span-3{grid-column:span 3/span 3}.sm\:col-span-4{grid-column:span 4/span 4}.sm\:col-span-5{grid-column:span 5/span 5}.sm\:col-span-6{grid-column:span 6/span 6}.sm\:col-span-7{grid-column:span 7/span 7}.sm\:col-span-8{grid-column:span 8/span 8}.sm\:col-span-9{grid-column:span 9/span 9}.sm\:col-span-10{grid-column:span 10/span 10}.sm\:col-span-11{grid-column:span 11/span 11}.sm\:col-span-12{grid-column:span 12/span 12}.sm\:col-span-full{grid-column:1/-1}.sm\:col-start-1{grid-column-start:1}.sm\:col-start-2{grid-column-start:2}.sm\:col-start-3{grid-column-start:3}.sm\:col-start-4{grid-column-start:4}.sm\:col-start-5{grid-column-start:5}.sm\:col-start-6{grid-column-start:6}.sm\:col-start-7{grid-column-start:7}.sm\:col-start-8{grid-column-start:8}.sm\:col-start-9{grid-column-start:9}.sm\:col-start-10{grid-column-start:10}.sm\:col-start-11{grid-column-start:11}.sm\:col-start-12{grid-column-start:12}.sm\:col-start-13{grid-column-start:13}.sm\:col-start-auto{grid-column-start:auto}.sm\:col-end-1{grid-column-end:1}.sm\:col-end-2{grid-column-end:2}.sm\:col-end-3{grid-column-end:3}.sm\:col-end-4{grid-column-end:4}.sm\:col-end-5{grid-column-end:5}.sm\:col-end-6{grid-column-end:6}.sm\:col-end-7{grid-column-end:7}.sm\:col-end-8{grid-column-end:8}.sm\:col-end-9{grid-column-end:9}.sm\:col-end-10{grid-column-end:10}.sm\:col-end-11{grid-column-end:11}.sm\:col-end-12{grid-column-end:12}.sm\:col-end-13{grid-column-end:13}.sm\:col-end-auto{grid-column-end:auto}.sm\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.sm\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.sm\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.sm\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.sm\:grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.sm\:grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.sm\:grid-rows-none{grid-template-rows:none}.sm\:auto-rows-auto{grid-auto-rows:auto}.sm\:auto-rows-min{grid-auto-rows:-webkit-min-content;grid-auto-rows:min-content}.sm\:auto-rows-max{grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}.sm\:auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.sm\:row-auto{grid-row:auto}.sm\:row-span-1{grid-row:span 1/span 1}.sm\:row-span-2{grid-row:span 2/span 2}.sm\:row-span-3{grid-row:span 3/span 3}.sm\:row-span-4{grid-row:span 4/span 4}.sm\:row-span-5{grid-row:span 5/span 5}.sm\:row-span-6{grid-row:span 6/span 6}.sm\:row-span-full{grid-row:1/-1}.sm\:row-start-1{grid-row-start:1}.sm\:row-start-2{grid-row-start:2}.sm\:row-start-3{grid-row-start:3}.sm\:row-start-4{grid-row-start:4}.sm\:row-start-5{grid-row-start:5}.sm\:row-start-6{grid-row-start:6}.sm\:row-start-7{grid-row-start:7}.sm\:row-start-auto{grid-row-start:auto}.sm\:row-end-1{grid-row-end:1}.sm\:row-end-2{grid-row-end:2}.sm\:row-end-3{grid-row-end:3}.sm\:row-end-4{grid-row-end:4}.sm\:row-end-5{grid-row-end:5}.sm\:row-end-6{grid-row-end:6}.sm\:row-end-7{grid-row-end:7}.sm\:row-end-auto{grid-row-end:auto}.sm\:transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.sm\:transform-none{transform:none}.sm\:origin-center{transform-origin:center}.sm\:origin-top{transform-origin:top}.sm\:origin-top-right{transform-origin:top right}.sm\:origin-right{transform-origin:right}.sm\:origin-bottom-right{transform-origin:bottom right}.sm\:origin-bottom{transform-origin:bottom}.sm\:origin-bottom-left{transform-origin:bottom left}.sm\:origin-left{transform-origin:left}.sm\:origin-top-left{transform-origin:top left}.sm\:scale-0{--transform-scale-x:0;--transform-scale-y:0}.sm\:scale-50{--transform-scale-x:.5;--transform-scale-y:.5}.sm\:scale-75{--transform-scale-x:.75;--transform-scale-y:.75}.sm\:scale-90{--transform-scale-x:.9;--transform-scale-y:.9}.sm\:scale-95{--transform-scale-x:.95;--transform-scale-y:.95}.sm\:scale-100{--transform-scale-x:1;--transform-scale-y:1}.sm\:scale-105{--transform-scale-x:1.05;--transform-scale-y:1.05}.sm\:scale-110{--transform-scale-x:1.1;--transform-scale-y:1.1}.sm\:scale-125{--transform-scale-x:1.25;--transform-scale-y:1.25}.sm\:scale-150{--transform-scale-x:1.5;--transform-scale-y:1.5}.sm\:scale-x-0{--transform-scale-x:0}.sm\:scale-x-50{--transform-scale-x:.5}.sm\:scale-x-75{--transform-scale-x:.75}.sm\:scale-x-90{--transform-scale-x:.9}.sm\:scale-x-95{--transform-scale-x:.95}.sm\:scale-x-100{--transform-scale-x:1}.sm\:scale-x-105{--transform-scale-x:1.05}.sm\:scale-x-110{--transform-scale-x:1.1}.sm\:scale-x-125{--transform-scale-x:1.25}.sm\:scale-x-150{--transform-scale-x:1.5}.sm\:scale-y-0{--transform-scale-y:0}.sm\:scale-y-50{--transform-scale-y:.5}.sm\:scale-y-75{--transform-scale-y:.75}.sm\:scale-y-90{--transform-scale-y:.9}.sm\:scale-y-95{--transform-scale-y:.95}.sm\:scale-y-100{--transform-scale-y:1}.sm\:scale-y-105{--transform-scale-y:1.05}.sm\:scale-y-110{--transform-scale-y:1.1}.sm\:scale-y-125{--transform-scale-y:1.25}.sm\:scale-y-150{--transform-scale-y:1.5}.sm\:hover\:scale-0:hover{--transform-scale-x:0;--transform-scale-y:0}.sm\:hover\:scale-50:hover{--transform-scale-x:.5;--transform-scale-y:.5}.sm\:hover\:scale-75:hover{--transform-scale-x:.75;--transform-scale-y:.75}.sm\:hover\:scale-90:hover{--transform-scale-x:.9;--transform-scale-y:.9}.sm\:hover\:scale-95:hover{--transform-scale-x:.95;--transform-scale-y:.95}.sm\:hover\:scale-100:hover{--transform-scale-x:1;--transform-scale-y:1}.sm\:hover\:scale-105:hover{--transform-scale-x:1.05;--transform-scale-y:1.05}.sm\:hover\:scale-110:hover{--transform-scale-x:1.1;--transform-scale-y:1.1}.sm\:hover\:scale-125:hover{--transform-scale-x:1.25;--transform-scale-y:1.25}.sm\:hover\:scale-150:hover{--transform-scale-x:1.5;--transform-scale-y:1.5}.sm\:hover\:scale-x-0:hover{--transform-scale-x:0}.sm\:hover\:scale-x-50:hover{--transform-scale-x:.5}.sm\:hover\:scale-x-75:hover{--transform-scale-x:.75}.sm\:hover\:scale-x-90:hover{--transform-scale-x:.9}.sm\:hover\:scale-x-95:hover{--transform-scale-x:.95}.sm\:hover\:scale-x-100:hover{--transform-scale-x:1}.sm\:hover\:scale-x-105:hover{--transform-scale-x:1.05}.sm\:hover\:scale-x-110:hover{--transform-scale-x:1.1}.sm\:hover\:scale-x-125:hover{--transform-scale-x:1.25}.sm\:hover\:scale-x-150:hover{--transform-scale-x:1.5}.sm\:hover\:scale-y-0:hover{--transform-scale-y:0}.sm\:hover\:scale-y-50:hover{--transform-scale-y:.5}.sm\:hover\:scale-y-75:hover{--transform-scale-y:.75}.sm\:hover\:scale-y-90:hover{--transform-scale-y:.9}.sm\:hover\:scale-y-95:hover{--transform-scale-y:.95}.sm\:hover\:scale-y-100:hover{--transform-scale-y:1}.sm\:hover\:scale-y-105:hover{--transform-scale-y:1.05}.sm\:hover\:scale-y-110:hover{--transform-scale-y:1.1}.sm\:hover\:scale-y-125:hover{--transform-scale-y:1.25}.sm\:hover\:scale-y-150:hover{--transform-scale-y:1.5}.sm\:focus\:scale-0:focus{--transform-scale-x:0;--transform-scale-y:0}.sm\:focus\:scale-50:focus{--transform-scale-x:.5;--transform-scale-y:.5}.sm\:focus\:scale-75:focus{--transform-scale-x:.75;--transform-scale-y:.75}.sm\:focus\:scale-90:focus{--transform-scale-x:.9;--transform-scale-y:.9}.sm\:focus\:scale-95:focus{--transform-scale-x:.95;--transform-scale-y:.95}.sm\:focus\:scale-100:focus{--transform-scale-x:1;--transform-scale-y:1}.sm\:focus\:scale-105:focus{--transform-scale-x:1.05;--transform-scale-y:1.05}.sm\:focus\:scale-110:focus{--transform-scale-x:1.1;--transform-scale-y:1.1}.sm\:focus\:scale-125:focus{--transform-scale-x:1.25;--transform-scale-y:1.25}.sm\:focus\:scale-150:focus{--transform-scale-x:1.5;--transform-scale-y:1.5}.sm\:focus\:scale-x-0:focus{--transform-scale-x:0}.sm\:focus\:scale-x-50:focus{--transform-scale-x:.5}.sm\:focus\:scale-x-75:focus{--transform-scale-x:.75}.sm\:focus\:scale-x-90:focus{--transform-scale-x:.9}.sm\:focus\:scale-x-95:focus{--transform-scale-x:.95}.sm\:focus\:scale-x-100:focus{--transform-scale-x:1}.sm\:focus\:scale-x-105:focus{--transform-scale-x:1.05}.sm\:focus\:scale-x-110:focus{--transform-scale-x:1.1}.sm\:focus\:scale-x-125:focus{--transform-scale-x:1.25}.sm\:focus\:scale-x-150:focus{--transform-scale-x:1.5}.sm\:focus\:scale-y-0:focus{--transform-scale-y:0}.sm\:focus\:scale-y-50:focus{--transform-scale-y:.5}.sm\:focus\:scale-y-75:focus{--transform-scale-y:.75}.sm\:focus\:scale-y-90:focus{--transform-scale-y:.9}.sm\:focus\:scale-y-95:focus{--transform-scale-y:.95}.sm\:focus\:scale-y-100:focus{--transform-scale-y:1}.sm\:focus\:scale-y-105:focus{--transform-scale-y:1.05}.sm\:focus\:scale-y-110:focus{--transform-scale-y:1.1}.sm\:focus\:scale-y-125:focus{--transform-scale-y:1.25}.sm\:focus\:scale-y-150:focus{--transform-scale-y:1.5}.sm\:rotate-0{--transform-rotate:0}.sm\:rotate-1{--transform-rotate:1deg}.sm\:rotate-2{--transform-rotate:2deg}.sm\:rotate-3{--transform-rotate:3deg}.sm\:rotate-6{--transform-rotate:6deg}.sm\:rotate-12{--transform-rotate:12deg}.sm\:rotate-45{--transform-rotate:45deg}.sm\:rotate-90{--transform-rotate:90deg}.sm\:rotate-180{--transform-rotate:180deg}.sm\:-rotate-180{--transform-rotate:-180deg}.sm\:-rotate-90{--transform-rotate:-90deg}.sm\:-rotate-45{--transform-rotate:-45deg}.sm\:-rotate-12{--transform-rotate:-12deg}.sm\:-rotate-6{--transform-rotate:-6deg}.sm\:-rotate-3{--transform-rotate:-3deg}.sm\:-rotate-2{--transform-rotate:-2deg}.sm\:-rotate-1{--transform-rotate:-1deg}.sm\:hover\:rotate-0:hover{--transform-rotate:0}.sm\:hover\:rotate-1:hover{--transform-rotate:1deg}.sm\:hover\:rotate-2:hover{--transform-rotate:2deg}.sm\:hover\:rotate-3:hover{--transform-rotate:3deg}.sm\:hover\:rotate-6:hover{--transform-rotate:6deg}.sm\:hover\:rotate-12:hover{--transform-rotate:12deg}.sm\:hover\:rotate-45:hover{--transform-rotate:45deg}.sm\:hover\:rotate-90:hover{--transform-rotate:90deg}.sm\:hover\:rotate-180:hover{--transform-rotate:180deg}.sm\:hover\:-rotate-180:hover{--transform-rotate:-180deg}.sm\:hover\:-rotate-90:hover{--transform-rotate:-90deg}.sm\:hover\:-rotate-45:hover{--transform-rotate:-45deg}.sm\:hover\:-rotate-12:hover{--transform-rotate:-12deg}.sm\:hover\:-rotate-6:hover{--transform-rotate:-6deg}.sm\:hover\:-rotate-3:hover{--transform-rotate:-3deg}.sm\:hover\:-rotate-2:hover{--transform-rotate:-2deg}.sm\:hover\:-rotate-1:hover{--transform-rotate:-1deg}.sm\:focus\:rotate-0:focus{--transform-rotate:0}.sm\:focus\:rotate-1:focus{--transform-rotate:1deg}.sm\:focus\:rotate-2:focus{--transform-rotate:2deg}.sm\:focus\:rotate-3:focus{--transform-rotate:3deg}.sm\:focus\:rotate-6:focus{--transform-rotate:6deg}.sm\:focus\:rotate-12:focus{--transform-rotate:12deg}.sm\:focus\:rotate-45:focus{--transform-rotate:45deg}.sm\:focus\:rotate-90:focus{--transform-rotate:90deg}.sm\:focus\:rotate-180:focus{--transform-rotate:180deg}.sm\:focus\:-rotate-180:focus{--transform-rotate:-180deg}.sm\:focus\:-rotate-90:focus{--transform-rotate:-90deg}.sm\:focus\:-rotate-45:focus{--transform-rotate:-45deg}.sm\:focus\:-rotate-12:focus{--transform-rotate:-12deg}.sm\:focus\:-rotate-6:focus{--transform-rotate:-6deg}.sm\:focus\:-rotate-3:focus{--transform-rotate:-3deg}.sm\:focus\:-rotate-2:focus{--transform-rotate:-2deg}.sm\:focus\:-rotate-1:focus{--transform-rotate:-1deg}.sm\:translate-x-0{--transform-translate-x:0}.sm\:translate-x-1{--transform-translate-x:0.25rem}.sm\:translate-x-2{--transform-translate-x:0.5rem}.sm\:translate-x-3{--transform-translate-x:0.75rem}.sm\:translate-x-4{--transform-translate-x:1rem}.sm\:translate-x-5{--transform-translate-x:1.25rem}.sm\:translate-x-6{--transform-translate-x:1.5rem}.sm\:translate-x-8{--transform-translate-x:2rem}.sm\:translate-x-10{--transform-translate-x:2.5rem}.sm\:translate-x-12{--transform-translate-x:3rem}.sm\:translate-x-16{--transform-translate-x:4rem}.sm\:translate-x-20{--transform-translate-x:5rem}.sm\:translate-x-24{--transform-translate-x:6rem}.sm\:translate-x-32{--transform-translate-x:8rem}.sm\:translate-x-40{--transform-translate-x:10rem}.sm\:translate-x-48{--transform-translate-x:12rem}.sm\:translate-x-56{--transform-translate-x:14rem}.sm\:translate-x-64{--transform-translate-x:16rem}.sm\:translate-x-px{--transform-translate-x:1px}.sm\:-translate-x-1{--transform-translate-x:-0.25rem}.sm\:-translate-x-2{--transform-translate-x:-0.5rem}.sm\:-translate-x-3{--transform-translate-x:-0.75rem}.sm\:-translate-x-4{--transform-translate-x:-1rem}.sm\:-translate-x-5{--transform-translate-x:-1.25rem}.sm\:-translate-x-6{--transform-translate-x:-1.5rem}.sm\:-translate-x-8{--transform-translate-x:-2rem}.sm\:-translate-x-10{--transform-translate-x:-2.5rem}.sm\:-translate-x-12{--transform-translate-x:-3rem}.sm\:-translate-x-16{--transform-translate-x:-4rem}.sm\:-translate-x-20{--transform-translate-x:-5rem}.sm\:-translate-x-24{--transform-translate-x:-6rem}.sm\:-translate-x-32{--transform-translate-x:-8rem}.sm\:-translate-x-40{--transform-translate-x:-10rem}.sm\:-translate-x-48{--transform-translate-x:-12rem}.sm\:-translate-x-56{--transform-translate-x:-14rem}.sm\:-translate-x-64{--transform-translate-x:-16rem}.sm\:-translate-x-px{--transform-translate-x:-1px}.sm\:-translate-x-full{--transform-translate-x:-100%}.sm\:-translate-x-1\/2{--transform-translate-x:-50%}.sm\:translate-x-1\/2{--transform-translate-x:50%}.sm\:translate-x-full{--transform-translate-x:100%}.sm\:translate-y-0{--transform-translate-y:0}.sm\:translate-y-1{--transform-translate-y:0.25rem}.sm\:translate-y-2{--transform-translate-y:0.5rem}.sm\:translate-y-3{--transform-translate-y:0.75rem}.sm\:translate-y-4{--transform-translate-y:1rem}.sm\:translate-y-5{--transform-translate-y:1.25rem}.sm\:translate-y-6{--transform-translate-y:1.5rem}.sm\:translate-y-8{--transform-translate-y:2rem}.sm\:translate-y-10{--transform-translate-y:2.5rem}.sm\:translate-y-12{--transform-translate-y:3rem}.sm\:translate-y-16{--transform-translate-y:4rem}.sm\:translate-y-20{--transform-translate-y:5rem}.sm\:translate-y-24{--transform-translate-y:6rem}.sm\:translate-y-32{--transform-translate-y:8rem}.sm\:translate-y-40{--transform-translate-y:10rem}.sm\:translate-y-48{--transform-translate-y:12rem}.sm\:translate-y-56{--transform-translate-y:14rem}.sm\:translate-y-64{--transform-translate-y:16rem}.sm\:translate-y-px{--transform-translate-y:1px}.sm\:-translate-y-1{--transform-translate-y:-0.25rem}.sm\:-translate-y-2{--transform-translate-y:-0.5rem}.sm\:-translate-y-3{--transform-translate-y:-0.75rem}.sm\:-translate-y-4{--transform-translate-y:-1rem}.sm\:-translate-y-5{--transform-translate-y:-1.25rem}.sm\:-translate-y-6{--transform-translate-y:-1.5rem}.sm\:-translate-y-8{--transform-translate-y:-2rem}.sm\:-translate-y-10{--transform-translate-y:-2.5rem}.sm\:-translate-y-12{--transform-translate-y:-3rem}.sm\:-translate-y-16{--transform-translate-y:-4rem}.sm\:-translate-y-20{--transform-translate-y:-5rem}.sm\:-translate-y-24{--transform-translate-y:-6rem}.sm\:-translate-y-32{--transform-translate-y:-8rem}.sm\:-translate-y-40{--transform-translate-y:-10rem}.sm\:-translate-y-48{--transform-translate-y:-12rem}.sm\:-translate-y-56{--transform-translate-y:-14rem}.sm\:-translate-y-64{--transform-translate-y:-16rem}.sm\:-translate-y-px{--transform-translate-y:-1px}.sm\:-translate-y-full{--transform-translate-y:-100%}.sm\:-translate-y-1\/2{--transform-translate-y:-50%}.sm\:translate-y-1\/2{--transform-translate-y:50%}.sm\:translate-y-full{--transform-translate-y:100%}.sm\:hover\:translate-x-0:hover{--transform-translate-x:0}.sm\:hover\:translate-x-1:hover{--transform-translate-x:0.25rem}.sm\:hover\:translate-x-2:hover{--transform-translate-x:0.5rem}.sm\:hover\:translate-x-3:hover{--transform-translate-x:0.75rem}.sm\:hover\:translate-x-4:hover{--transform-translate-x:1rem}.sm\:hover\:translate-x-5:hover{--transform-translate-x:1.25rem}.sm\:hover\:translate-x-6:hover{--transform-translate-x:1.5rem}.sm\:hover\:translate-x-8:hover{--transform-translate-x:2rem}.sm\:hover\:translate-x-10:hover{--transform-translate-x:2.5rem}.sm\:hover\:translate-x-12:hover{--transform-translate-x:3rem}.sm\:hover\:translate-x-16:hover{--transform-translate-x:4rem}.sm\:hover\:translate-x-20:hover{--transform-translate-x:5rem}.sm\:hover\:translate-x-24:hover{--transform-translate-x:6rem}.sm\:hover\:translate-x-32:hover{--transform-translate-x:8rem}.sm\:hover\:translate-x-40:hover{--transform-translate-x:10rem}.sm\:hover\:translate-x-48:hover{--transform-translate-x:12rem}.sm\:hover\:translate-x-56:hover{--transform-translate-x:14rem}.sm\:hover\:translate-x-64:hover{--transform-translate-x:16rem}.sm\:hover\:translate-x-px:hover{--transform-translate-x:1px}.sm\:hover\:-translate-x-1:hover{--transform-translate-x:-0.25rem}.sm\:hover\:-translate-x-2:hover{--transform-translate-x:-0.5rem}.sm\:hover\:-translate-x-3:hover{--transform-translate-x:-0.75rem}.sm\:hover\:-translate-x-4:hover{--transform-translate-x:-1rem}.sm\:hover\:-translate-x-5:hover{--transform-translate-x:-1.25rem}.sm\:hover\:-translate-x-6:hover{--transform-translate-x:-1.5rem}.sm\:hover\:-translate-x-8:hover{--transform-translate-x:-2rem}.sm\:hover\:-translate-x-10:hover{--transform-translate-x:-2.5rem}.sm\:hover\:-translate-x-12:hover{--transform-translate-x:-3rem}.sm\:hover\:-translate-x-16:hover{--transform-translate-x:-4rem}.sm\:hover\:-translate-x-20:hover{--transform-translate-x:-5rem}.sm\:hover\:-translate-x-24:hover{--transform-translate-x:-6rem}.sm\:hover\:-translate-x-32:hover{--transform-translate-x:-8rem}.sm\:hover\:-translate-x-40:hover{--transform-translate-x:-10rem}.sm\:hover\:-translate-x-48:hover{--transform-translate-x:-12rem}.sm\:hover\:-translate-x-56:hover{--transform-translate-x:-14rem}.sm\:hover\:-translate-x-64:hover{--transform-translate-x:-16rem}.sm\:hover\:-translate-x-px:hover{--transform-translate-x:-1px}.sm\:hover\:-translate-x-full:hover{--transform-translate-x:-100%}.sm\:hover\:-translate-x-1\/2:hover{--transform-translate-x:-50%}.sm\:hover\:translate-x-1\/2:hover{--transform-translate-x:50%}.sm\:hover\:translate-x-full:hover{--transform-translate-x:100%}.sm\:hover\:translate-y-0:hover{--transform-translate-y:0}.sm\:hover\:translate-y-1:hover{--transform-translate-y:0.25rem}.sm\:hover\:translate-y-2:hover{--transform-translate-y:0.5rem}.sm\:hover\:translate-y-3:hover{--transform-translate-y:0.75rem}.sm\:hover\:translate-y-4:hover{--transform-translate-y:1rem}.sm\:hover\:translate-y-5:hover{--transform-translate-y:1.25rem}.sm\:hover\:translate-y-6:hover{--transform-translate-y:1.5rem}.sm\:hover\:translate-y-8:hover{--transform-translate-y:2rem}.sm\:hover\:translate-y-10:hover{--transform-translate-y:2.5rem}.sm\:hover\:translate-y-12:hover{--transform-translate-y:3rem}.sm\:hover\:translate-y-16:hover{--transform-translate-y:4rem}.sm\:hover\:translate-y-20:hover{--transform-translate-y:5rem}.sm\:hover\:translate-y-24:hover{--transform-translate-y:6rem}.sm\:hover\:translate-y-32:hover{--transform-translate-y:8rem}.sm\:hover\:translate-y-40:hover{--transform-translate-y:10rem}.sm\:hover\:translate-y-48:hover{--transform-translate-y:12rem}.sm\:hover\:translate-y-56:hover{--transform-translate-y:14rem}.sm\:hover\:translate-y-64:hover{--transform-translate-y:16rem}.sm\:hover\:translate-y-px:hover{--transform-translate-y:1px}.sm\:hover\:-translate-y-1:hover{--transform-translate-y:-0.25rem}.sm\:hover\:-translate-y-2:hover{--transform-translate-y:-0.5rem}.sm\:hover\:-translate-y-3:hover{--transform-translate-y:-0.75rem}.sm\:hover\:-translate-y-4:hover{--transform-translate-y:-1rem}.sm\:hover\:-translate-y-5:hover{--transform-translate-y:-1.25rem}.sm\:hover\:-translate-y-6:hover{--transform-translate-y:-1.5rem}.sm\:hover\:-translate-y-8:hover{--transform-translate-y:-2rem}.sm\:hover\:-translate-y-10:hover{--transform-translate-y:-2.5rem}.sm\:hover\:-translate-y-12:hover{--transform-translate-y:-3rem}.sm\:hover\:-translate-y-16:hover{--transform-translate-y:-4rem}.sm\:hover\:-translate-y-20:hover{--transform-translate-y:-5rem}.sm\:hover\:-translate-y-24:hover{--transform-translate-y:-6rem}.sm\:hover\:-translate-y-32:hover{--transform-translate-y:-8rem}.sm\:hover\:-translate-y-40:hover{--transform-translate-y:-10rem}.sm\:hover\:-translate-y-48:hover{--transform-translate-y:-12rem}.sm\:hover\:-translate-y-56:hover{--transform-translate-y:-14rem}.sm\:hover\:-translate-y-64:hover{--transform-translate-y:-16rem}.sm\:hover\:-translate-y-px:hover{--transform-translate-y:-1px}.sm\:hover\:-translate-y-full:hover{--transform-translate-y:-100%}.sm\:hover\:-translate-y-1\/2:hover{--transform-translate-y:-50%}.sm\:hover\:translate-y-1\/2:hover{--transform-translate-y:50%}.sm\:hover\:translate-y-full:hover{--transform-translate-y:100%}.sm\:focus\:translate-x-0:focus{--transform-translate-x:0}.sm\:focus\:translate-x-1:focus{--transform-translate-x:0.25rem}.sm\:focus\:translate-x-2:focus{--transform-translate-x:0.5rem}.sm\:focus\:translate-x-3:focus{--transform-translate-x:0.75rem}.sm\:focus\:translate-x-4:focus{--transform-translate-x:1rem}.sm\:focus\:translate-x-5:focus{--transform-translate-x:1.25rem}.sm\:focus\:translate-x-6:focus{--transform-translate-x:1.5rem}.sm\:focus\:translate-x-8:focus{--transform-translate-x:2rem}.sm\:focus\:translate-x-10:focus{--transform-translate-x:2.5rem}.sm\:focus\:translate-x-12:focus{--transform-translate-x:3rem}.sm\:focus\:translate-x-16:focus{--transform-translate-x:4rem}.sm\:focus\:translate-x-20:focus{--transform-translate-x:5rem}.sm\:focus\:translate-x-24:focus{--transform-translate-x:6rem}.sm\:focus\:translate-x-32:focus{--transform-translate-x:8rem}.sm\:focus\:translate-x-40:focus{--transform-translate-x:10rem}.sm\:focus\:translate-x-48:focus{--transform-translate-x:12rem}.sm\:focus\:translate-x-56:focus{--transform-translate-x:14rem}.sm\:focus\:translate-x-64:focus{--transform-translate-x:16rem}.sm\:focus\:translate-x-px:focus{--transform-translate-x:1px}.sm\:focus\:-translate-x-1:focus{--transform-translate-x:-0.25rem}.sm\:focus\:-translate-x-2:focus{--transform-translate-x:-0.5rem}.sm\:focus\:-translate-x-3:focus{--transform-translate-x:-0.75rem}.sm\:focus\:-translate-x-4:focus{--transform-translate-x:-1rem}.sm\:focus\:-translate-x-5:focus{--transform-translate-x:-1.25rem}.sm\:focus\:-translate-x-6:focus{--transform-translate-x:-1.5rem}.sm\:focus\:-translate-x-8:focus{--transform-translate-x:-2rem}.sm\:focus\:-translate-x-10:focus{--transform-translate-x:-2.5rem}.sm\:focus\:-translate-x-12:focus{--transform-translate-x:-3rem}.sm\:focus\:-translate-x-16:focus{--transform-translate-x:-4rem}.sm\:focus\:-translate-x-20:focus{--transform-translate-x:-5rem}.sm\:focus\:-translate-x-24:focus{--transform-translate-x:-6rem}.sm\:focus\:-translate-x-32:focus{--transform-translate-x:-8rem}.sm\:focus\:-translate-x-40:focus{--transform-translate-x:-10rem}.sm\:focus\:-translate-x-48:focus{--transform-translate-x:-12rem}.sm\:focus\:-translate-x-56:focus{--transform-translate-x:-14rem}.sm\:focus\:-translate-x-64:focus{--transform-translate-x:-16rem}.sm\:focus\:-translate-x-px:focus{--transform-translate-x:-1px}.sm\:focus\:-translate-x-full:focus{--transform-translate-x:-100%}.sm\:focus\:-translate-x-1\/2:focus{--transform-translate-x:-50%}.sm\:focus\:translate-x-1\/2:focus{--transform-translate-x:50%}.sm\:focus\:translate-x-full:focus{--transform-translate-x:100%}.sm\:focus\:translate-y-0:focus{--transform-translate-y:0}.sm\:focus\:translate-y-1:focus{--transform-translate-y:0.25rem}.sm\:focus\:translate-y-2:focus{--transform-translate-y:0.5rem}.sm\:focus\:translate-y-3:focus{--transform-translate-y:0.75rem}.sm\:focus\:translate-y-4:focus{--transform-translate-y:1rem}.sm\:focus\:translate-y-5:focus{--transform-translate-y:1.25rem}.sm\:focus\:translate-y-6:focus{--transform-translate-y:1.5rem}.sm\:focus\:translate-y-8:focus{--transform-translate-y:2rem}.sm\:focus\:translate-y-10:focus{--transform-translate-y:2.5rem}.sm\:focus\:translate-y-12:focus{--transform-translate-y:3rem}.sm\:focus\:translate-y-16:focus{--transform-translate-y:4rem}.sm\:focus\:translate-y-20:focus{--transform-translate-y:5rem}.sm\:focus\:translate-y-24:focus{--transform-translate-y:6rem}.sm\:focus\:translate-y-32:focus{--transform-translate-y:8rem}.sm\:focus\:translate-y-40:focus{--transform-translate-y:10rem}.sm\:focus\:translate-y-48:focus{--transform-translate-y:12rem}.sm\:focus\:translate-y-56:focus{--transform-translate-y:14rem}.sm\:focus\:translate-y-64:focus{--transform-translate-y:16rem}.sm\:focus\:translate-y-px:focus{--transform-translate-y:1px}.sm\:focus\:-translate-y-1:focus{--transform-translate-y:-0.25rem}.sm\:focus\:-translate-y-2:focus{--transform-translate-y:-0.5rem}.sm\:focus\:-translate-y-3:focus{--transform-translate-y:-0.75rem}.sm\:focus\:-translate-y-4:focus{--transform-translate-y:-1rem}.sm\:focus\:-translate-y-5:focus{--transform-translate-y:-1.25rem}.sm\:focus\:-translate-y-6:focus{--transform-translate-y:-1.5rem}.sm\:focus\:-translate-y-8:focus{--transform-translate-y:-2rem}.sm\:focus\:-translate-y-10:focus{--transform-translate-y:-2.5rem}.sm\:focus\:-translate-y-12:focus{--transform-translate-y:-3rem}.sm\:focus\:-translate-y-16:focus{--transform-translate-y:-4rem}.sm\:focus\:-translate-y-20:focus{--transform-translate-y:-5rem}.sm\:focus\:-translate-y-24:focus{--transform-translate-y:-6rem}.sm\:focus\:-translate-y-32:focus{--transform-translate-y:-8rem}.sm\:focus\:-translate-y-40:focus{--transform-translate-y:-10rem}.sm\:focus\:-translate-y-48:focus{--transform-translate-y:-12rem}.sm\:focus\:-translate-y-56:focus{--transform-translate-y:-14rem}.sm\:focus\:-translate-y-64:focus{--transform-translate-y:-16rem}.sm\:focus\:-translate-y-px:focus{--transform-translate-y:-1px}.sm\:focus\:-translate-y-full:focus{--transform-translate-y:-100%}.sm\:focus\:-translate-y-1\/2:focus{--transform-translate-y:-50%}.sm\:focus\:translate-y-1\/2:focus{--transform-translate-y:50%}.sm\:focus\:translate-y-full:focus{--transform-translate-y:100%}.sm\:skew-x-0{--transform-skew-x:0}.sm\:skew-x-1{--transform-skew-x:1deg}.sm\:skew-x-2{--transform-skew-x:2deg}.sm\:skew-x-3{--transform-skew-x:3deg}.sm\:skew-x-6{--transform-skew-x:6deg}.sm\:skew-x-12{--transform-skew-x:12deg}.sm\:-skew-x-12{--transform-skew-x:-12deg}.sm\:-skew-x-6{--transform-skew-x:-6deg}.sm\:-skew-x-3{--transform-skew-x:-3deg}.sm\:-skew-x-2{--transform-skew-x:-2deg}.sm\:-skew-x-1{--transform-skew-x:-1deg}.sm\:skew-y-0{--transform-skew-y:0}.sm\:skew-y-1{--transform-skew-y:1deg}.sm\:skew-y-2{--transform-skew-y:2deg}.sm\:skew-y-3{--transform-skew-y:3deg}.sm\:skew-y-6{--transform-skew-y:6deg}.sm\:skew-y-12{--transform-skew-y:12deg}.sm\:-skew-y-12{--transform-skew-y:-12deg}.sm\:-skew-y-6{--transform-skew-y:-6deg}.sm\:-skew-y-3{--transform-skew-y:-3deg}.sm\:-skew-y-2{--transform-skew-y:-2deg}.sm\:-skew-y-1{--transform-skew-y:-1deg}.sm\:hover\:skew-x-0:hover{--transform-skew-x:0}.sm\:hover\:skew-x-1:hover{--transform-skew-x:1deg}.sm\:hover\:skew-x-2:hover{--transform-skew-x:2deg}.sm\:hover\:skew-x-3:hover{--transform-skew-x:3deg}.sm\:hover\:skew-x-6:hover{--transform-skew-x:6deg}.sm\:hover\:skew-x-12:hover{--transform-skew-x:12deg}.sm\:hover\:-skew-x-12:hover{--transform-skew-x:-12deg}.sm\:hover\:-skew-x-6:hover{--transform-skew-x:-6deg}.sm\:hover\:-skew-x-3:hover{--transform-skew-x:-3deg}.sm\:hover\:-skew-x-2:hover{--transform-skew-x:-2deg}.sm\:hover\:-skew-x-1:hover{--transform-skew-x:-1deg}.sm\:hover\:skew-y-0:hover{--transform-skew-y:0}.sm\:hover\:skew-y-1:hover{--transform-skew-y:1deg}.sm\:hover\:skew-y-2:hover{--transform-skew-y:2deg}.sm\:hover\:skew-y-3:hover{--transform-skew-y:3deg}.sm\:hover\:skew-y-6:hover{--transform-skew-y:6deg}.sm\:hover\:skew-y-12:hover{--transform-skew-y:12deg}.sm\:hover\:-skew-y-12:hover{--transform-skew-y:-12deg}.sm\:hover\:-skew-y-6:hover{--transform-skew-y:-6deg}.sm\:hover\:-skew-y-3:hover{--transform-skew-y:-3deg}.sm\:hover\:-skew-y-2:hover{--transform-skew-y:-2deg}.sm\:hover\:-skew-y-1:hover{--transform-skew-y:-1deg}.sm\:focus\:skew-x-0:focus{--transform-skew-x:0}.sm\:focus\:skew-x-1:focus{--transform-skew-x:1deg}.sm\:focus\:skew-x-2:focus{--transform-skew-x:2deg}.sm\:focus\:skew-x-3:focus{--transform-skew-x:3deg}.sm\:focus\:skew-x-6:focus{--transform-skew-x:6deg}.sm\:focus\:skew-x-12:focus{--transform-skew-x:12deg}.sm\:focus\:-skew-x-12:focus{--transform-skew-x:-12deg}.sm\:focus\:-skew-x-6:focus{--transform-skew-x:-6deg}.sm\:focus\:-skew-x-3:focus{--transform-skew-x:-3deg}.sm\:focus\:-skew-x-2:focus{--transform-skew-x:-2deg}.sm\:focus\:-skew-x-1:focus{--transform-skew-x:-1deg}.sm\:focus\:skew-y-0:focus{--transform-skew-y:0}.sm\:focus\:skew-y-1:focus{--transform-skew-y:1deg}.sm\:focus\:skew-y-2:focus{--transform-skew-y:2deg}.sm\:focus\:skew-y-3:focus{--transform-skew-y:3deg}.sm\:focus\:skew-y-6:focus{--transform-skew-y:6deg}.sm\:focus\:skew-y-12:focus{--transform-skew-y:12deg}.sm\:focus\:-skew-y-12:focus{--transform-skew-y:-12deg}.sm\:focus\:-skew-y-6:focus{--transform-skew-y:-6deg}.sm\:focus\:-skew-y-3:focus{--transform-skew-y:-3deg}.sm\:focus\:-skew-y-2:focus{--transform-skew-y:-2deg}.sm\:focus\:-skew-y-1:focus{--transform-skew-y:-1deg}.sm\:transition-none{transition-property:none}.sm\:transition-all{transition-property:all}.sm\:transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform}.sm\:transition-colors{transition-property:background-color,border-color,color,fill,stroke}.sm\:transition-opacity{transition-property:opacity}.sm\:transition-shadow{transition-property:box-shadow}.sm\:transition-transform{transition-property:transform}.sm\:ease-linear{transition-timing-function:linear}.sm\:ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.sm\:ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.sm\:ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.sm\:duration-75{transition-duration:75ms}.sm\:duration-100{transition-duration:.1s}.sm\:duration-150{transition-duration:150ms}.sm\:duration-200{transition-duration:.2s}.sm\:duration-300{transition-duration:.3s}.sm\:duration-500{transition-duration:.5s}.sm\:duration-700{transition-duration:.7s}.sm\:duration-1000{transition-duration:1s}.sm\:delay-75{transition-delay:75ms}.sm\:delay-100{transition-delay:.1s}.sm\:delay-150{transition-delay:150ms}.sm\:delay-200{transition-delay:.2s}.sm\:delay-300{transition-delay:.3s}.sm\:delay-500{transition-delay:.5s}.sm\:delay-700{transition-delay:.7s}.sm\:delay-1000{transition-delay:1s}.sm\:animate-none{animation:none}.sm\:animate-spin{animation:spin 1s linear infinite}.sm\:animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.sm\:animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.sm\:animate-bounce{animation:bounce 1s infinite}}@media (min-width:768px){.md\:container{width:100%}@media (min-width:640px){.md\:container{max-width:640px}}@media (min-width:768px){.md\:container{max-width:768px}}@media (min-width:1024px){.md\:container{max-width:1024px}}@media (min-width:1280px){.md\:container{max-width:1280px}}.md\:space-y-0>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(0px * var(--space-y-reverse))}.md\:space-x-0>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(0px * var(--space-x-reverse));margin-left:calc(0px * calc(1 - var(--space-x-reverse)))}.md\:space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.25rem * var(--space-y-reverse))}.md\:space-x-1>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.25rem * var(--space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.5rem * var(--space-y-reverse))}.md\:space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.5rem * var(--space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.75rem * var(--space-y-reverse))}.md\:space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.75rem * var(--space-x-reverse));margin-left:calc(.75rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1rem * var(--space-y-reverse))}.md\:space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1rem * var(--space-x-reverse));margin-left:calc(1rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1.25rem * var(--space-y-reverse))}.md\:space-x-5>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1.25rem * var(--space-x-reverse));margin-left:calc(1.25rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-6>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1.5rem * var(--space-y-reverse))}.md\:space-x-6>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1.5rem * var(--space-x-reverse));margin-left:calc(1.5rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-8>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(2rem * var(--space-y-reverse))}.md\:space-x-8>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(2rem * var(--space-x-reverse));margin-left:calc(2rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(2.5rem * var(--space-y-reverse))}.md\:space-x-10>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(2.5rem * var(--space-x-reverse));margin-left:calc(2.5rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-12>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(3rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(3rem * var(--space-y-reverse))}.md\:space-x-12>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(3rem * var(--space-x-reverse));margin-left:calc(3rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-16>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(4rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(4rem * var(--space-y-reverse))}.md\:space-x-16>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(4rem * var(--space-x-reverse));margin-left:calc(4rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-20>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(5rem * var(--space-y-reverse))}.md\:space-x-20>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(5rem * var(--space-x-reverse));margin-left:calc(5rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-24>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(6rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(6rem * var(--space-y-reverse))}.md\:space-x-24>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(6rem * var(--space-x-reverse));margin-left:calc(6rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-32>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(8rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(8rem * var(--space-y-reverse))}.md\:space-x-32>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(8rem * var(--space-x-reverse));margin-left:calc(8rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-40>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(10rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(10rem * var(--space-y-reverse))}.md\:space-x-40>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(10rem * var(--space-x-reverse));margin-left:calc(10rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-48>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(12rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(12rem * var(--space-y-reverse))}.md\:space-x-48>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(12rem * var(--space-x-reverse));margin-left:calc(12rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-56>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(14rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(14rem * var(--space-y-reverse))}.md\:space-x-56>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(14rem * var(--space-x-reverse));margin-left:calc(14rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-64>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(16rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(16rem * var(--space-y-reverse))}.md\:space-x-64>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(16rem * var(--space-x-reverse));margin-left:calc(16rem * calc(1 - var(--space-x-reverse)))}.md\:space-y-px>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1px * var(--space-y-reverse))}.md\:space-x-px>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1px * var(--space-x-reverse));margin-left:calc(1px * calc(1 - var(--space-x-reverse)))}.md\:-space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.25rem * var(--space-y-reverse))}.md\:-space-x-1>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.25rem * var(--space-x-reverse));margin-left:calc(-.25rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.5rem * var(--space-y-reverse))}.md\:-space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.5rem * var(--space-x-reverse));margin-left:calc(-.5rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.75rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.75rem * var(--space-y-reverse))}.md\:-space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.75rem * var(--space-x-reverse));margin-left:calc(-.75rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1rem * var(--space-y-reverse))}.md\:-space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1rem * var(--space-x-reverse));margin-left:calc(-1rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1.25rem * var(--space-y-reverse))}.md\:-space-x-5>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1.25rem * var(--space-x-reverse));margin-left:calc(-1.25rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-6>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1.5rem * var(--space-y-reverse))}.md\:-space-x-6>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1.5rem * var(--space-x-reverse));margin-left:calc(-1.5rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-8>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-2rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-2rem * var(--space-y-reverse))}.md\:-space-x-8>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-2rem * var(--space-x-reverse));margin-left:calc(-2rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-2.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-2.5rem * var(--space-y-reverse))}.md\:-space-x-10>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-2.5rem * var(--space-x-reverse));margin-left:calc(-2.5rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-12>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-3rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-3rem * var(--space-y-reverse))}.md\:-space-x-12>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-3rem * var(--space-x-reverse));margin-left:calc(-3rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-16>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-4rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-4rem * var(--space-y-reverse))}.md\:-space-x-16>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-4rem * var(--space-x-reverse));margin-left:calc(-4rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-20>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-5rem * var(--space-y-reverse))}.md\:-space-x-20>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-5rem * var(--space-x-reverse));margin-left:calc(-5rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-24>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-6rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-6rem * var(--space-y-reverse))}.md\:-space-x-24>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-6rem * var(--space-x-reverse));margin-left:calc(-6rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-32>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-8rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-8rem * var(--space-y-reverse))}.md\:-space-x-32>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-8rem * var(--space-x-reverse));margin-left:calc(-8rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-40>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-10rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-10rem * var(--space-y-reverse))}.md\:-space-x-40>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-10rem * var(--space-x-reverse));margin-left:calc(-10rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-48>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-12rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-12rem * var(--space-y-reverse))}.md\:-space-x-48>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-12rem * var(--space-x-reverse));margin-left:calc(-12rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-56>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-14rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-14rem * var(--space-y-reverse))}.md\:-space-x-56>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-14rem * var(--space-x-reverse));margin-left:calc(-14rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-64>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-16rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-16rem * var(--space-y-reverse))}.md\:-space-x-64>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-16rem * var(--space-x-reverse));margin-left:calc(-16rem * calc(1 - var(--space-x-reverse)))}.md\:-space-y-px>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1px * var(--space-y-reverse))}.md\:-space-x-px>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1px * var(--space-x-reverse));margin-left:calc(-1px * calc(1 - var(--space-x-reverse)))}.md\:space-y-reverse>:not(template)~:not(template){--space-y-reverse:1}.md\:space-x-reverse>:not(template)~:not(template){--space-x-reverse:1}.md\:divide-y-0>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(0px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(0px * var(--divide-y-reverse))}.md\:divide-x-0>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(0px * var(--divide-x-reverse));border-left-width:calc(0px * calc(1 - var(--divide-x-reverse)))}.md\:divide-y-2>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(2px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(2px * var(--divide-y-reverse))}.md\:divide-x-2>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(2px * var(--divide-x-reverse));border-left-width:calc(2px * calc(1 - var(--divide-x-reverse)))}.md\:divide-y-4>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(4px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(4px * var(--divide-y-reverse))}.md\:divide-x-4>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(4px * var(--divide-x-reverse));border-left-width:calc(4px * calc(1 - var(--divide-x-reverse)))}.md\:divide-y-8>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(8px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(8px * var(--divide-y-reverse))}.md\:divide-x-8>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(8px * var(--divide-x-reverse));border-left-width:calc(8px * calc(1 - var(--divide-x-reverse)))}.md\:divide-y>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(1px * var(--divide-y-reverse))}.md\:divide-x>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(1px * var(--divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--divide-x-reverse)))}.md\:divide-y-reverse>:not(template)~:not(template){--divide-y-reverse:1}.md\:divide-x-reverse>:not(template)~:not(template){--divide-x-reverse:1}.md\:divide-transparent>:not(template)~:not(template){border-color:transparent}.md\:divide-current>:not(template)~:not(template){border-color:currentColor}.md\:divide-black>:not(template)~:not(template){--divide-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--divide-opacity))}.md\:divide-white>:not(template)~:not(template){--divide-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--divide-opacity))}.md\:divide-gray-100>:not(template)~:not(template){--divide-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--divide-opacity))}.md\:divide-gray-200>:not(template)~:not(template){--divide-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--divide-opacity))}.md\:divide-gray-300>:not(template)~:not(template){--divide-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--divide-opacity))}.md\:divide-gray-400>:not(template)~:not(template){--divide-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--divide-opacity))}.md\:divide-gray-500>:not(template)~:not(template){--divide-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--divide-opacity))}.md\:divide-gray-600>:not(template)~:not(template){--divide-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--divide-opacity))}.md\:divide-gray-700>:not(template)~:not(template){--divide-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--divide-opacity))}.md\:divide-gray-800>:not(template)~:not(template){--divide-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--divide-opacity))}.md\:divide-gray-900>:not(template)~:not(template){--divide-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--divide-opacity))}.md\:divide-red-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--divide-opacity))}.md\:divide-red-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--divide-opacity))}.md\:divide-red-300>:not(template)~:not(template){--divide-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--divide-opacity))}.md\:divide-red-400>:not(template)~:not(template){--divide-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--divide-opacity))}.md\:divide-red-500>:not(template)~:not(template){--divide-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--divide-opacity))}.md\:divide-red-600>:not(template)~:not(template){--divide-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--divide-opacity))}.md\:divide-red-700>:not(template)~:not(template){--divide-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--divide-opacity))}.md\:divide-red-800>:not(template)~:not(template){--divide-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--divide-opacity))}.md\:divide-red-900>:not(template)~:not(template){--divide-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--divide-opacity))}.md\:divide-orange-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--divide-opacity))}.md\:divide-orange-200>:not(template)~:not(template){--divide-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--divide-opacity))}.md\:divide-orange-300>:not(template)~:not(template){--divide-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--divide-opacity))}.md\:divide-orange-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--divide-opacity))}.md\:divide-orange-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--divide-opacity))}.md\:divide-orange-600>:not(template)~:not(template){--divide-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--divide-opacity))}.md\:divide-orange-700>:not(template)~:not(template){--divide-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--divide-opacity))}.md\:divide-orange-800>:not(template)~:not(template){--divide-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--divide-opacity))}.md\:divide-orange-900>:not(template)~:not(template){--divide-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--divide-opacity))}.md\:divide-yellow-100>:not(template)~:not(template){--divide-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--divide-opacity))}.md\:divide-yellow-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--divide-opacity))}.md\:divide-yellow-300>:not(template)~:not(template){--divide-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--divide-opacity))}.md\:divide-yellow-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--divide-opacity))}.md\:divide-yellow-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--divide-opacity))}.md\:divide-yellow-600>:not(template)~:not(template){--divide-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--divide-opacity))}.md\:divide-yellow-700>:not(template)~:not(template){--divide-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--divide-opacity))}.md\:divide-yellow-800>:not(template)~:not(template){--divide-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--divide-opacity))}.md\:divide-yellow-900>:not(template)~:not(template){--divide-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--divide-opacity))}.md\:divide-green-100>:not(template)~:not(template){--divide-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--divide-opacity))}.md\:divide-green-200>:not(template)~:not(template){--divide-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--divide-opacity))}.md\:divide-green-300>:not(template)~:not(template){--divide-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--divide-opacity))}.md\:divide-green-400>:not(template)~:not(template){--divide-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--divide-opacity))}.md\:divide-green-500>:not(template)~:not(template){--divide-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--divide-opacity))}.md\:divide-green-600>:not(template)~:not(template){--divide-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--divide-opacity))}.md\:divide-green-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--divide-opacity))}.md\:divide-green-800>:not(template)~:not(template){--divide-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--divide-opacity))}.md\:divide-green-900>:not(template)~:not(template){--divide-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--divide-opacity))}.md\:divide-teal-100>:not(template)~:not(template){--divide-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--divide-opacity))}.md\:divide-teal-200>:not(template)~:not(template){--divide-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--divide-opacity))}.md\:divide-teal-300>:not(template)~:not(template){--divide-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--divide-opacity))}.md\:divide-teal-400>:not(template)~:not(template){--divide-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--divide-opacity))}.md\:divide-teal-500>:not(template)~:not(template){--divide-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--divide-opacity))}.md\:divide-teal-600>:not(template)~:not(template){--divide-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--divide-opacity))}.md\:divide-teal-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--divide-opacity))}.md\:divide-teal-800>:not(template)~:not(template){--divide-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--divide-opacity))}.md\:divide-teal-900>:not(template)~:not(template){--divide-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--divide-opacity))}.md\:divide-blue-100>:not(template)~:not(template){--divide-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--divide-opacity))}.md\:divide-blue-200>:not(template)~:not(template){--divide-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--divide-opacity))}.md\:divide-blue-300>:not(template)~:not(template){--divide-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--divide-opacity))}.md\:divide-blue-400>:not(template)~:not(template){--divide-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--divide-opacity))}.md\:divide-blue-500>:not(template)~:not(template){--divide-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--divide-opacity))}.md\:divide-blue-600>:not(template)~:not(template){--divide-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--divide-opacity))}.md\:divide-blue-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--divide-opacity))}.md\:divide-blue-800>:not(template)~:not(template){--divide-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--divide-opacity))}.md\:divide-blue-900>:not(template)~:not(template){--divide-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--divide-opacity))}.md\:divide-indigo-100>:not(template)~:not(template){--divide-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--divide-opacity))}.md\:divide-indigo-200>:not(template)~:not(template){--divide-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--divide-opacity))}.md\:divide-indigo-300>:not(template)~:not(template){--divide-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--divide-opacity))}.md\:divide-indigo-400>:not(template)~:not(template){--divide-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--divide-opacity))}.md\:divide-indigo-500>:not(template)~:not(template){--divide-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--divide-opacity))}.md\:divide-indigo-600>:not(template)~:not(template){--divide-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--divide-opacity))}.md\:divide-indigo-700>:not(template)~:not(template){--divide-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--divide-opacity))}.md\:divide-indigo-800>:not(template)~:not(template){--divide-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--divide-opacity))}.md\:divide-indigo-900>:not(template)~:not(template){--divide-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--divide-opacity))}.md\:divide-purple-100>:not(template)~:not(template){--divide-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--divide-opacity))}.md\:divide-purple-200>:not(template)~:not(template){--divide-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--divide-opacity))}.md\:divide-purple-300>:not(template)~:not(template){--divide-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--divide-opacity))}.md\:divide-purple-400>:not(template)~:not(template){--divide-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--divide-opacity))}.md\:divide-purple-500>:not(template)~:not(template){--divide-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--divide-opacity))}.md\:divide-purple-600>:not(template)~:not(template){--divide-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--divide-opacity))}.md\:divide-purple-700>:not(template)~:not(template){--divide-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--divide-opacity))}.md\:divide-purple-800>:not(template)~:not(template){--divide-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--divide-opacity))}.md\:divide-purple-900>:not(template)~:not(template){--divide-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--divide-opacity))}.md\:divide-pink-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--divide-opacity))}.md\:divide-pink-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--divide-opacity))}.md\:divide-pink-300>:not(template)~:not(template){--divide-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--divide-opacity))}.md\:divide-pink-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--divide-opacity))}.md\:divide-pink-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--divide-opacity))}.md\:divide-pink-600>:not(template)~:not(template){--divide-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--divide-opacity))}.md\:divide-pink-700>:not(template)~:not(template){--divide-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--divide-opacity))}.md\:divide-pink-800>:not(template)~:not(template){--divide-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--divide-opacity))}.md\:divide-pink-900>:not(template)~:not(template){--divide-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--divide-opacity))}.md\:divide-solid>:not(template)~:not(template){border-style:solid}.md\:divide-dashed>:not(template)~:not(template){border-style:dashed}.md\:divide-dotted>:not(template)~:not(template){border-style:dotted}.md\:divide-double>:not(template)~:not(template){border-style:double}.md\:divide-none>:not(template)~:not(template){border-style:none}.md\:divide-opacity-0>:not(template)~:not(template){--divide-opacity:0}.md\:divide-opacity-25>:not(template)~:not(template){--divide-opacity:0.25}.md\:divide-opacity-50>:not(template)~:not(template){--divide-opacity:0.5}.md\:divide-opacity-75>:not(template)~:not(template){--divide-opacity:0.75}.md\:divide-opacity-100>:not(template)~:not(template){--divide-opacity:1}.md\:sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.md\:not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.md\:focus\:sr-only:focus{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.md\:focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.md\:appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.md\:bg-fixed{background-attachment:fixed}.md\:bg-local{background-attachment:local}.md\:bg-scroll{background-attachment:scroll}.md\:bg-clip-border{background-clip:border-box}.md\:bg-clip-padding{background-clip:padding-box}.md\:bg-clip-content{background-clip:content-box}.md\:bg-clip-text{-webkit-background-clip:text;background-clip:text}.md\:bg-transparent{background-color:transparent}.md\:bg-current{background-color:currentColor}.md\:bg-black{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.md\:bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.md\:bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.md\:bg-gray-200{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.md\:bg-gray-300{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.md\:bg-gray-400{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.md\:bg-gray-500{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.md\:bg-gray-600{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.md\:bg-gray-700{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.md\:bg-gray-800{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.md\:bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.md\:bg-red-100{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.md\:bg-red-200{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.md\:bg-red-300{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.md\:bg-red-400{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.md\:bg-red-500{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.md\:bg-red-600{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.md\:bg-red-700{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.md\:bg-red-800{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.md\:bg-red-900{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.md\:bg-orange-100{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.md\:bg-orange-200{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.md\:bg-orange-300{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.md\:bg-orange-400{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.md\:bg-orange-500{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.md\:bg-orange-600{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.md\:bg-orange-700{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.md\:bg-orange-800{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.md\:bg-orange-900{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.md\:bg-yellow-100{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.md\:bg-yellow-200{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.md\:bg-yellow-300{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.md\:bg-yellow-400{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.md\:bg-yellow-500{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.md\:bg-yellow-600{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.md\:bg-yellow-700{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.md\:bg-yellow-800{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.md\:bg-yellow-900{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.md\:bg-green-100{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.md\:bg-green-200{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.md\:bg-green-300{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.md\:bg-green-400{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.md\:bg-green-500{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.md\:bg-green-600{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.md\:bg-green-700{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.md\:bg-green-800{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.md\:bg-green-900{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.md\:bg-teal-100{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.md\:bg-teal-200{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.md\:bg-teal-300{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.md\:bg-teal-400{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.md\:bg-teal-500{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.md\:bg-teal-600{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.md\:bg-teal-700{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.md\:bg-teal-800{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.md\:bg-teal-900{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.md\:bg-blue-100{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.md\:bg-blue-200{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.md\:bg-blue-300{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.md\:bg-blue-400{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.md\:bg-blue-500{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.md\:bg-blue-600{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.md\:bg-blue-700{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.md\:bg-blue-800{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.md\:bg-blue-900{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.md\:bg-indigo-100{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.md\:bg-indigo-200{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.md\:bg-indigo-300{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.md\:bg-indigo-400{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.md\:bg-indigo-500{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.md\:bg-indigo-600{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.md\:bg-indigo-700{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.md\:bg-indigo-800{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.md\:bg-indigo-900{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.md\:bg-purple-100{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.md\:bg-purple-200{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.md\:bg-purple-300{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.md\:bg-purple-400{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.md\:bg-purple-500{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.md\:bg-purple-600{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.md\:bg-purple-700{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.md\:bg-purple-800{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.md\:bg-purple-900{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.md\:bg-pink-100{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.md\:bg-pink-200{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.md\:bg-pink-300{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.md\:bg-pink-400{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.md\:bg-pink-500{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.md\:bg-pink-600{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.md\:bg-pink-700{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.md\:bg-pink-800{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.md\:bg-pink-900{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.md\:hover\:bg-transparent:hover{background-color:transparent}.md\:hover\:bg-current:hover{background-color:currentColor}.md\:hover\:bg-black:hover{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.md\:hover\:bg-white:hover{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.md\:hover\:bg-gray-100:hover{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.md\:hover\:bg-gray-200:hover{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.md\:hover\:bg-gray-300:hover{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.md\:hover\:bg-gray-400:hover{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.md\:hover\:bg-gray-500:hover{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.md\:hover\:bg-gray-600:hover{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.md\:hover\:bg-gray-700:hover{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.md\:hover\:bg-gray-800:hover{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.md\:hover\:bg-gray-900:hover{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.md\:hover\:bg-red-100:hover{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.md\:hover\:bg-red-200:hover{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.md\:hover\:bg-red-300:hover{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.md\:hover\:bg-red-400:hover{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.md\:hover\:bg-red-500:hover{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.md\:hover\:bg-red-600:hover{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.md\:hover\:bg-red-700:hover{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.md\:hover\:bg-red-800:hover{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.md\:hover\:bg-red-900:hover{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.md\:hover\:bg-orange-100:hover{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.md\:hover\:bg-orange-200:hover{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.md\:hover\:bg-orange-300:hover{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.md\:hover\:bg-orange-400:hover{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.md\:hover\:bg-orange-500:hover{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.md\:hover\:bg-orange-600:hover{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.md\:hover\:bg-orange-700:hover{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.md\:hover\:bg-orange-800:hover{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.md\:hover\:bg-orange-900:hover{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.md\:hover\:bg-yellow-100:hover{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.md\:hover\:bg-yellow-200:hover{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.md\:hover\:bg-yellow-300:hover{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.md\:hover\:bg-yellow-400:hover{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.md\:hover\:bg-yellow-500:hover{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.md\:hover\:bg-yellow-600:hover{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.md\:hover\:bg-yellow-700:hover{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.md\:hover\:bg-yellow-800:hover{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.md\:hover\:bg-yellow-900:hover{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.md\:hover\:bg-green-100:hover{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.md\:hover\:bg-green-200:hover{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.md\:hover\:bg-green-300:hover{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.md\:hover\:bg-green-400:hover{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.md\:hover\:bg-green-500:hover{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.md\:hover\:bg-green-600:hover{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.md\:hover\:bg-green-700:hover{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.md\:hover\:bg-green-800:hover{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.md\:hover\:bg-green-900:hover{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.md\:hover\:bg-teal-100:hover{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.md\:hover\:bg-teal-200:hover{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.md\:hover\:bg-teal-300:hover{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.md\:hover\:bg-teal-400:hover{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.md\:hover\:bg-teal-500:hover{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.md\:hover\:bg-teal-600:hover{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.md\:hover\:bg-teal-700:hover{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.md\:hover\:bg-teal-800:hover{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.md\:hover\:bg-teal-900:hover{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.md\:hover\:bg-blue-100:hover{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.md\:hover\:bg-blue-200:hover{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.md\:hover\:bg-blue-300:hover{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.md\:hover\:bg-blue-400:hover{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.md\:hover\:bg-blue-500:hover{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.md\:hover\:bg-blue-600:hover{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.md\:hover\:bg-blue-700:hover{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.md\:hover\:bg-blue-800:hover{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.md\:hover\:bg-blue-900:hover{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.md\:hover\:bg-indigo-100:hover{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.md\:hover\:bg-indigo-200:hover{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.md\:hover\:bg-indigo-300:hover{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.md\:hover\:bg-indigo-400:hover{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.md\:hover\:bg-indigo-500:hover{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.md\:hover\:bg-indigo-600:hover{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.md\:hover\:bg-indigo-700:hover{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.md\:hover\:bg-indigo-800:hover{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.md\:hover\:bg-indigo-900:hover{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.md\:hover\:bg-purple-100:hover{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.md\:hover\:bg-purple-200:hover{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.md\:hover\:bg-purple-300:hover{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.md\:hover\:bg-purple-400:hover{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.md\:hover\:bg-purple-500:hover{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.md\:hover\:bg-purple-600:hover{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.md\:hover\:bg-purple-700:hover{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.md\:hover\:bg-purple-800:hover{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.md\:hover\:bg-purple-900:hover{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.md\:hover\:bg-pink-100:hover{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.md\:hover\:bg-pink-200:hover{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.md\:hover\:bg-pink-300:hover{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.md\:hover\:bg-pink-400:hover{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.md\:hover\:bg-pink-500:hover{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.md\:hover\:bg-pink-600:hover{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.md\:hover\:bg-pink-700:hover{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.md\:hover\:bg-pink-800:hover{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.md\:hover\:bg-pink-900:hover{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.md\:focus\:bg-transparent:focus{background-color:transparent}.md\:focus\:bg-current:focus{background-color:currentColor}.md\:focus\:bg-black:focus{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.md\:focus\:bg-white:focus{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.md\:focus\:bg-gray-100:focus{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.md\:focus\:bg-gray-200:focus{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.md\:focus\:bg-gray-300:focus{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.md\:focus\:bg-gray-400:focus{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.md\:focus\:bg-gray-500:focus{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.md\:focus\:bg-gray-600:focus{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.md\:focus\:bg-gray-700:focus{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.md\:focus\:bg-gray-800:focus{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.md\:focus\:bg-gray-900:focus{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.md\:focus\:bg-red-100:focus{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.md\:focus\:bg-red-200:focus{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.md\:focus\:bg-red-300:focus{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.md\:focus\:bg-red-400:focus{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.md\:focus\:bg-red-500:focus{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.md\:focus\:bg-red-600:focus{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.md\:focus\:bg-red-700:focus{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.md\:focus\:bg-red-800:focus{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.md\:focus\:bg-red-900:focus{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.md\:focus\:bg-orange-100:focus{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.md\:focus\:bg-orange-200:focus{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.md\:focus\:bg-orange-300:focus{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.md\:focus\:bg-orange-400:focus{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.md\:focus\:bg-orange-500:focus{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.md\:focus\:bg-orange-600:focus{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.md\:focus\:bg-orange-700:focus{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.md\:focus\:bg-orange-800:focus{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.md\:focus\:bg-orange-900:focus{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.md\:focus\:bg-yellow-100:focus{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.md\:focus\:bg-yellow-200:focus{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.md\:focus\:bg-yellow-300:focus{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.md\:focus\:bg-yellow-400:focus{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.md\:focus\:bg-yellow-500:focus{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.md\:focus\:bg-yellow-600:focus{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.md\:focus\:bg-yellow-700:focus{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.md\:focus\:bg-yellow-800:focus{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.md\:focus\:bg-yellow-900:focus{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.md\:focus\:bg-green-100:focus{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.md\:focus\:bg-green-200:focus{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.md\:focus\:bg-green-300:focus{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.md\:focus\:bg-green-400:focus{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.md\:focus\:bg-green-500:focus{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.md\:focus\:bg-green-600:focus{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.md\:focus\:bg-green-700:focus{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.md\:focus\:bg-green-800:focus{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.md\:focus\:bg-green-900:focus{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.md\:focus\:bg-teal-100:focus{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.md\:focus\:bg-teal-200:focus{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.md\:focus\:bg-teal-300:focus{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.md\:focus\:bg-teal-400:focus{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.md\:focus\:bg-teal-500:focus{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.md\:focus\:bg-teal-600:focus{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.md\:focus\:bg-teal-700:focus{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.md\:focus\:bg-teal-800:focus{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.md\:focus\:bg-teal-900:focus{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.md\:focus\:bg-blue-100:focus{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.md\:focus\:bg-blue-200:focus{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.md\:focus\:bg-blue-300:focus{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.md\:focus\:bg-blue-400:focus{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.md\:focus\:bg-blue-500:focus{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.md\:focus\:bg-blue-600:focus{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.md\:focus\:bg-blue-700:focus{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.md\:focus\:bg-blue-800:focus{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.md\:focus\:bg-blue-900:focus{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.md\:focus\:bg-indigo-100:focus{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.md\:focus\:bg-indigo-200:focus{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.md\:focus\:bg-indigo-300:focus{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.md\:focus\:bg-indigo-400:focus{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.md\:focus\:bg-indigo-500:focus{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.md\:focus\:bg-indigo-600:focus{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.md\:focus\:bg-indigo-700:focus{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.md\:focus\:bg-indigo-800:focus{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.md\:focus\:bg-indigo-900:focus{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.md\:focus\:bg-purple-100:focus{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.md\:focus\:bg-purple-200:focus{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.md\:focus\:bg-purple-300:focus{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.md\:focus\:bg-purple-400:focus{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.md\:focus\:bg-purple-500:focus{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.md\:focus\:bg-purple-600:focus{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.md\:focus\:bg-purple-700:focus{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.md\:focus\:bg-purple-800:focus{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.md\:focus\:bg-purple-900:focus{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.md\:focus\:bg-pink-100:focus{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.md\:focus\:bg-pink-200:focus{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.md\:focus\:bg-pink-300:focus{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.md\:focus\:bg-pink-400:focus{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.md\:focus\:bg-pink-500:focus{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.md\:focus\:bg-pink-600:focus{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.md\:focus\:bg-pink-700:focus{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.md\:focus\:bg-pink-800:focus{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.md\:focus\:bg-pink-900:focus{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.md\:bg-none{background-image:none}.md\:bg-gradient-to-t{background-image:linear-gradient(to top,var(--gradient-color-stops))}.md\:bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--gradient-color-stops))}.md\:bg-gradient-to-r{background-image:linear-gradient(to right,var(--gradient-color-stops))}.md\:bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--gradient-color-stops))}.md\:bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--gradient-color-stops))}.md\:bg-gradient-to-bl{background-image:linear-gradient(to bottom left,var(--gradient-color-stops))}.md\:bg-gradient-to-l{background-image:linear-gradient(to left,var(--gradient-color-stops))}.md\:bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--gradient-color-stops))}.md\:from-transparent{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:from-current{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:from-black{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:from-white{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:from-gray-100{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.md\:from-gray-200{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.md\:from-gray-300{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.md\:from-gray-400{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.md\:from-gray-500{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.md\:from-gray-600{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.md\:from-gray-700{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.md\:from-gray-800{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.md\:from-gray-900{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.md\:from-red-100{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.md\:from-red-200{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.md\:from-red-300{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.md\:from-red-400{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.md\:from-red-500{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.md\:from-red-600{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.md\:from-red-700{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.md\:from-red-800{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.md\:from-red-900{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.md\:from-orange-100{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.md\:from-orange-200{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.md\:from-orange-300{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.md\:from-orange-400{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.md\:from-orange-500{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.md\:from-orange-600{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.md\:from-orange-700{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.md\:from-orange-800{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.md\:from-orange-900{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.md\:from-yellow-100{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.md\:from-yellow-200{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.md\:from-yellow-300{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.md\:from-yellow-400{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.md\:from-yellow-500{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.md\:from-yellow-600{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.md\:from-yellow-700{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.md\:from-yellow-800{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.md\:from-yellow-900{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.md\:from-green-100{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.md\:from-green-200{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.md\:from-green-300{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.md\:from-green-400{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.md\:from-green-500{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.md\:from-green-600{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.md\:from-green-700{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.md\:from-green-800{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.md\:from-green-900{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.md\:from-teal-100{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.md\:from-teal-200{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.md\:from-teal-300{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.md\:from-teal-400{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.md\:from-teal-500{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.md\:from-teal-600{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.md\:from-teal-700{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.md\:from-teal-800{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.md\:from-teal-900{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.md\:from-blue-100{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.md\:from-blue-200{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.md\:from-blue-300{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.md\:from-blue-400{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.md\:from-blue-500{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.md\:from-blue-600{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.md\:from-blue-700{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.md\:from-blue-800{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.md\:from-blue-900{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.md\:from-indigo-100{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.md\:from-indigo-200{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.md\:from-indigo-300{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.md\:from-indigo-400{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.md\:from-indigo-500{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.md\:from-indigo-600{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.md\:from-indigo-700{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.md\:from-indigo-800{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.md\:from-indigo-900{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.md\:from-purple-100{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.md\:from-purple-200{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.md\:from-purple-300{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.md\:from-purple-400{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.md\:from-purple-500{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.md\:from-purple-600{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.md\:from-purple-700{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.md\:from-purple-800{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.md\:from-purple-900{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.md\:from-pink-100{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.md\:from-pink-200{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.md\:from-pink-300{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.md\:from-pink-400{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.md\:from-pink-500{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.md\:from-pink-600{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.md\:from-pink-700{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.md\:from-pink-800{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.md\:from-pink-900{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.md\:via-transparent{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:via-current{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:via-black{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:via-white{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:via-gray-100{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.md\:via-gray-200{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.md\:via-gray-300{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.md\:via-gray-400{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.md\:via-gray-500{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.md\:via-gray-600{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.md\:via-gray-700{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.md\:via-gray-800{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.md\:via-gray-900{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.md\:via-red-100{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.md\:via-red-200{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.md\:via-red-300{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.md\:via-red-400{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.md\:via-red-500{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.md\:via-red-600{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.md\:via-red-700{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.md\:via-red-800{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.md\:via-red-900{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.md\:via-orange-100{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.md\:via-orange-200{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.md\:via-orange-300{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.md\:via-orange-400{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.md\:via-orange-500{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.md\:via-orange-600{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.md\:via-orange-700{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.md\:via-orange-800{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.md\:via-orange-900{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.md\:via-yellow-100{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.md\:via-yellow-200{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.md\:via-yellow-300{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.md\:via-yellow-400{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.md\:via-yellow-500{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.md\:via-yellow-600{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.md\:via-yellow-700{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.md\:via-yellow-800{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.md\:via-yellow-900{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.md\:via-green-100{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.md\:via-green-200{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.md\:via-green-300{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.md\:via-green-400{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.md\:via-green-500{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.md\:via-green-600{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.md\:via-green-700{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.md\:via-green-800{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.md\:via-green-900{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.md\:via-teal-100{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.md\:via-teal-200{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.md\:via-teal-300{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.md\:via-teal-400{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.md\:via-teal-500{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.md\:via-teal-600{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.md\:via-teal-700{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.md\:via-teal-800{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.md\:via-teal-900{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.md\:via-blue-100{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.md\:via-blue-200{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.md\:via-blue-300{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.md\:via-blue-400{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.md\:via-blue-500{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.md\:via-blue-600{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.md\:via-blue-700{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.md\:via-blue-800{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.md\:via-blue-900{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.md\:via-indigo-100{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.md\:via-indigo-200{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.md\:via-indigo-300{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.md\:via-indigo-400{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.md\:via-indigo-500{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.md\:via-indigo-600{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.md\:via-indigo-700{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.md\:via-indigo-800{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.md\:via-indigo-900{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.md\:via-purple-100{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.md\:via-purple-200{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.md\:via-purple-300{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.md\:via-purple-400{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.md\:via-purple-500{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.md\:via-purple-600{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.md\:via-purple-700{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.md\:via-purple-800{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.md\:via-purple-900{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.md\:via-pink-100{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.md\:via-pink-200{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.md\:via-pink-300{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.md\:via-pink-400{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.md\:via-pink-500{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.md\:via-pink-600{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.md\:via-pink-700{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.md\:via-pink-800{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.md\:via-pink-900{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.md\:to-transparent{--gradient-to-color:transparent}.md\:to-current{--gradient-to-color:currentColor}.md\:to-black{--gradient-to-color:#000}.md\:to-white{--gradient-to-color:#fff}.md\:to-gray-100{--gradient-to-color:#f7fafc}.md\:to-gray-200{--gradient-to-color:#edf2f7}.md\:to-gray-300{--gradient-to-color:#e2e8f0}.md\:to-gray-400{--gradient-to-color:#cbd5e0}.md\:to-gray-500{--gradient-to-color:#a0aec0}.md\:to-gray-600{--gradient-to-color:#718096}.md\:to-gray-700{--gradient-to-color:#4a5568}.md\:to-gray-800{--gradient-to-color:#2d3748}.md\:to-gray-900{--gradient-to-color:#1a202c}.md\:to-red-100{--gradient-to-color:#fff5f5}.md\:to-red-200{--gradient-to-color:#fed7d7}.md\:to-red-300{--gradient-to-color:#feb2b2}.md\:to-red-400{--gradient-to-color:#fc8181}.md\:to-red-500{--gradient-to-color:#f56565}.md\:to-red-600{--gradient-to-color:#e53e3e}.md\:to-red-700{--gradient-to-color:#c53030}.md\:to-red-800{--gradient-to-color:#9b2c2c}.md\:to-red-900{--gradient-to-color:#742a2a}.md\:to-orange-100{--gradient-to-color:#fffaf0}.md\:to-orange-200{--gradient-to-color:#feebc8}.md\:to-orange-300{--gradient-to-color:#fbd38d}.md\:to-orange-400{--gradient-to-color:#f6ad55}.md\:to-orange-500{--gradient-to-color:#ed8936}.md\:to-orange-600{--gradient-to-color:#dd6b20}.md\:to-orange-700{--gradient-to-color:#c05621}.md\:to-orange-800{--gradient-to-color:#9c4221}.md\:to-orange-900{--gradient-to-color:#7b341e}.md\:to-yellow-100{--gradient-to-color:#fffff0}.md\:to-yellow-200{--gradient-to-color:#fefcbf}.md\:to-yellow-300{--gradient-to-color:#faf089}.md\:to-yellow-400{--gradient-to-color:#f6e05e}.md\:to-yellow-500{--gradient-to-color:#ecc94b}.md\:to-yellow-600{--gradient-to-color:#d69e2e}.md\:to-yellow-700{--gradient-to-color:#b7791f}.md\:to-yellow-800{--gradient-to-color:#975a16}.md\:to-yellow-900{--gradient-to-color:#744210}.md\:to-green-100{--gradient-to-color:#f0fff4}.md\:to-green-200{--gradient-to-color:#c6f6d5}.md\:to-green-300{--gradient-to-color:#9ae6b4}.md\:to-green-400{--gradient-to-color:#68d391}.md\:to-green-500{--gradient-to-color:#48bb78}.md\:to-green-600{--gradient-to-color:#38a169}.md\:to-green-700{--gradient-to-color:#2f855a}.md\:to-green-800{--gradient-to-color:#276749}.md\:to-green-900{--gradient-to-color:#22543d}.md\:to-teal-100{--gradient-to-color:#e6fffa}.md\:to-teal-200{--gradient-to-color:#b2f5ea}.md\:to-teal-300{--gradient-to-color:#81e6d9}.md\:to-teal-400{--gradient-to-color:#4fd1c5}.md\:to-teal-500{--gradient-to-color:#38b2ac}.md\:to-teal-600{--gradient-to-color:#319795}.md\:to-teal-700{--gradient-to-color:#2c7a7b}.md\:to-teal-800{--gradient-to-color:#285e61}.md\:to-teal-900{--gradient-to-color:#234e52}.md\:to-blue-100{--gradient-to-color:#ebf8ff}.md\:to-blue-200{--gradient-to-color:#bee3f8}.md\:to-blue-300{--gradient-to-color:#90cdf4}.md\:to-blue-400{--gradient-to-color:#63b3ed}.md\:to-blue-500{--gradient-to-color:#4299e1}.md\:to-blue-600{--gradient-to-color:#3182ce}.md\:to-blue-700{--gradient-to-color:#2b6cb0}.md\:to-blue-800{--gradient-to-color:#2c5282}.md\:to-blue-900{--gradient-to-color:#2a4365}.md\:to-indigo-100{--gradient-to-color:#ebf4ff}.md\:to-indigo-200{--gradient-to-color:#c3dafe}.md\:to-indigo-300{--gradient-to-color:#a3bffa}.md\:to-indigo-400{--gradient-to-color:#7f9cf5}.md\:to-indigo-500{--gradient-to-color:#667eea}.md\:to-indigo-600{--gradient-to-color:#5a67d8}.md\:to-indigo-700{--gradient-to-color:#4c51bf}.md\:to-indigo-800{--gradient-to-color:#434190}.md\:to-indigo-900{--gradient-to-color:#3c366b}.md\:to-purple-100{--gradient-to-color:#faf5ff}.md\:to-purple-200{--gradient-to-color:#e9d8fd}.md\:to-purple-300{--gradient-to-color:#d6bcfa}.md\:to-purple-400{--gradient-to-color:#b794f4}.md\:to-purple-500{--gradient-to-color:#9f7aea}.md\:to-purple-600{--gradient-to-color:#805ad5}.md\:to-purple-700{--gradient-to-color:#6b46c1}.md\:to-purple-800{--gradient-to-color:#553c9a}.md\:to-purple-900{--gradient-to-color:#44337a}.md\:to-pink-100{--gradient-to-color:#fff5f7}.md\:to-pink-200{--gradient-to-color:#fed7e2}.md\:to-pink-300{--gradient-to-color:#fbb6ce}.md\:to-pink-400{--gradient-to-color:#f687b3}.md\:to-pink-500{--gradient-to-color:#ed64a6}.md\:to-pink-600{--gradient-to-color:#d53f8c}.md\:to-pink-700{--gradient-to-color:#b83280}.md\:to-pink-800{--gradient-to-color:#97266d}.md\:to-pink-900{--gradient-to-color:#702459}.md\:hover\:from-transparent:hover{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:hover\:from-current:hover{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:hover\:from-black:hover{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:hover\:from-white:hover{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:hover\:from-gray-100:hover{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.md\:hover\:from-gray-200:hover{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.md\:hover\:from-gray-300:hover{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.md\:hover\:from-gray-400:hover{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.md\:hover\:from-gray-500:hover{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.md\:hover\:from-gray-600:hover{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.md\:hover\:from-gray-700:hover{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.md\:hover\:from-gray-800:hover{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.md\:hover\:from-gray-900:hover{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.md\:hover\:from-red-100:hover{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.md\:hover\:from-red-200:hover{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.md\:hover\:from-red-300:hover{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.md\:hover\:from-red-400:hover{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.md\:hover\:from-red-500:hover{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.md\:hover\:from-red-600:hover{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.md\:hover\:from-red-700:hover{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.md\:hover\:from-red-800:hover{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.md\:hover\:from-red-900:hover{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.md\:hover\:from-orange-100:hover{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.md\:hover\:from-orange-200:hover{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.md\:hover\:from-orange-300:hover{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.md\:hover\:from-orange-400:hover{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.md\:hover\:from-orange-500:hover{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.md\:hover\:from-orange-600:hover{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.md\:hover\:from-orange-700:hover{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.md\:hover\:from-orange-800:hover{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.md\:hover\:from-orange-900:hover{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.md\:hover\:from-yellow-100:hover{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.md\:hover\:from-yellow-200:hover{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.md\:hover\:from-yellow-300:hover{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.md\:hover\:from-yellow-400:hover{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.md\:hover\:from-yellow-500:hover{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.md\:hover\:from-yellow-600:hover{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.md\:hover\:from-yellow-700:hover{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.md\:hover\:from-yellow-800:hover{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.md\:hover\:from-yellow-900:hover{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.md\:hover\:from-green-100:hover{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.md\:hover\:from-green-200:hover{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.md\:hover\:from-green-300:hover{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.md\:hover\:from-green-400:hover{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.md\:hover\:from-green-500:hover{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.md\:hover\:from-green-600:hover{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.md\:hover\:from-green-700:hover{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.md\:hover\:from-green-800:hover{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.md\:hover\:from-green-900:hover{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.md\:hover\:from-teal-100:hover{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.md\:hover\:from-teal-200:hover{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.md\:hover\:from-teal-300:hover{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.md\:hover\:from-teal-400:hover{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.md\:hover\:from-teal-500:hover{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.md\:hover\:from-teal-600:hover{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.md\:hover\:from-teal-700:hover{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.md\:hover\:from-teal-800:hover{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.md\:hover\:from-teal-900:hover{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.md\:hover\:from-blue-100:hover{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.md\:hover\:from-blue-200:hover{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.md\:hover\:from-blue-300:hover{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.md\:hover\:from-blue-400:hover{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.md\:hover\:from-blue-500:hover{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.md\:hover\:from-blue-600:hover{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.md\:hover\:from-blue-700:hover{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.md\:hover\:from-blue-800:hover{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.md\:hover\:from-blue-900:hover{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.md\:hover\:from-indigo-100:hover{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.md\:hover\:from-indigo-200:hover{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.md\:hover\:from-indigo-300:hover{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.md\:hover\:from-indigo-400:hover{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.md\:hover\:from-indigo-500:hover{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.md\:hover\:from-indigo-600:hover{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.md\:hover\:from-indigo-700:hover{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.md\:hover\:from-indigo-800:hover{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.md\:hover\:from-indigo-900:hover{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.md\:hover\:from-purple-100:hover{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.md\:hover\:from-purple-200:hover{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.md\:hover\:from-purple-300:hover{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.md\:hover\:from-purple-400:hover{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.md\:hover\:from-purple-500:hover{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.md\:hover\:from-purple-600:hover{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.md\:hover\:from-purple-700:hover{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.md\:hover\:from-purple-800:hover{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.md\:hover\:from-purple-900:hover{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.md\:hover\:from-pink-100:hover{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.md\:hover\:from-pink-200:hover{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.md\:hover\:from-pink-300:hover{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.md\:hover\:from-pink-400:hover{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.md\:hover\:from-pink-500:hover{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.md\:hover\:from-pink-600:hover{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.md\:hover\:from-pink-700:hover{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.md\:hover\:from-pink-800:hover{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.md\:hover\:from-pink-900:hover{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.md\:hover\:via-transparent:hover{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:hover\:via-current:hover{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:hover\:via-black:hover{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:hover\:via-white:hover{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:hover\:via-gray-100:hover{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.md\:hover\:via-gray-200:hover{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.md\:hover\:via-gray-300:hover{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.md\:hover\:via-gray-400:hover{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.md\:hover\:via-gray-500:hover{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.md\:hover\:via-gray-600:hover{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.md\:hover\:via-gray-700:hover{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.md\:hover\:via-gray-800:hover{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.md\:hover\:via-gray-900:hover{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.md\:hover\:via-red-100:hover{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.md\:hover\:via-red-200:hover{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.md\:hover\:via-red-300:hover{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.md\:hover\:via-red-400:hover{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.md\:hover\:via-red-500:hover{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.md\:hover\:via-red-600:hover{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.md\:hover\:via-red-700:hover{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.md\:hover\:via-red-800:hover{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.md\:hover\:via-red-900:hover{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.md\:hover\:via-orange-100:hover{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.md\:hover\:via-orange-200:hover{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.md\:hover\:via-orange-300:hover{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.md\:hover\:via-orange-400:hover{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.md\:hover\:via-orange-500:hover{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.md\:hover\:via-orange-600:hover{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.md\:hover\:via-orange-700:hover{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.md\:hover\:via-orange-800:hover{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.md\:hover\:via-orange-900:hover{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.md\:hover\:via-yellow-100:hover{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.md\:hover\:via-yellow-200:hover{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.md\:hover\:via-yellow-300:hover{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.md\:hover\:via-yellow-400:hover{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.md\:hover\:via-yellow-500:hover{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.md\:hover\:via-yellow-600:hover{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.md\:hover\:via-yellow-700:hover{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.md\:hover\:via-yellow-800:hover{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.md\:hover\:via-yellow-900:hover{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.md\:hover\:via-green-100:hover{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.md\:hover\:via-green-200:hover{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.md\:hover\:via-green-300:hover{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.md\:hover\:via-green-400:hover{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.md\:hover\:via-green-500:hover{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.md\:hover\:via-green-600:hover{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.md\:hover\:via-green-700:hover{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.md\:hover\:via-green-800:hover{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.md\:hover\:via-green-900:hover{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.md\:hover\:via-teal-100:hover{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.md\:hover\:via-teal-200:hover{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.md\:hover\:via-teal-300:hover{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.md\:hover\:via-teal-400:hover{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.md\:hover\:via-teal-500:hover{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.md\:hover\:via-teal-600:hover{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.md\:hover\:via-teal-700:hover{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.md\:hover\:via-teal-800:hover{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.md\:hover\:via-teal-900:hover{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.md\:hover\:via-blue-100:hover{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.md\:hover\:via-blue-200:hover{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.md\:hover\:via-blue-300:hover{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.md\:hover\:via-blue-400:hover{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.md\:hover\:via-blue-500:hover{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.md\:hover\:via-blue-600:hover{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.md\:hover\:via-blue-700:hover{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.md\:hover\:via-blue-800:hover{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.md\:hover\:via-blue-900:hover{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.md\:hover\:via-indigo-100:hover{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.md\:hover\:via-indigo-200:hover{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.md\:hover\:via-indigo-300:hover{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.md\:hover\:via-indigo-400:hover{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.md\:hover\:via-indigo-500:hover{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.md\:hover\:via-indigo-600:hover{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.md\:hover\:via-indigo-700:hover{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.md\:hover\:via-indigo-800:hover{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.md\:hover\:via-indigo-900:hover{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.md\:hover\:via-purple-100:hover{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.md\:hover\:via-purple-200:hover{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.md\:hover\:via-purple-300:hover{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.md\:hover\:via-purple-400:hover{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.md\:hover\:via-purple-500:hover{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.md\:hover\:via-purple-600:hover{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.md\:hover\:via-purple-700:hover{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.md\:hover\:via-purple-800:hover{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.md\:hover\:via-purple-900:hover{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.md\:hover\:via-pink-100:hover{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.md\:hover\:via-pink-200:hover{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.md\:hover\:via-pink-300:hover{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.md\:hover\:via-pink-400:hover{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.md\:hover\:via-pink-500:hover{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.md\:hover\:via-pink-600:hover{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.md\:hover\:via-pink-700:hover{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.md\:hover\:via-pink-800:hover{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.md\:hover\:via-pink-900:hover{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.md\:hover\:to-transparent:hover{--gradient-to-color:transparent}.md\:hover\:to-current:hover{--gradient-to-color:currentColor}.md\:hover\:to-black:hover{--gradient-to-color:#000}.md\:hover\:to-white:hover{--gradient-to-color:#fff}.md\:hover\:to-gray-100:hover{--gradient-to-color:#f7fafc}.md\:hover\:to-gray-200:hover{--gradient-to-color:#edf2f7}.md\:hover\:to-gray-300:hover{--gradient-to-color:#e2e8f0}.md\:hover\:to-gray-400:hover{--gradient-to-color:#cbd5e0}.md\:hover\:to-gray-500:hover{--gradient-to-color:#a0aec0}.md\:hover\:to-gray-600:hover{--gradient-to-color:#718096}.md\:hover\:to-gray-700:hover{--gradient-to-color:#4a5568}.md\:hover\:to-gray-800:hover{--gradient-to-color:#2d3748}.md\:hover\:to-gray-900:hover{--gradient-to-color:#1a202c}.md\:hover\:to-red-100:hover{--gradient-to-color:#fff5f5}.md\:hover\:to-red-200:hover{--gradient-to-color:#fed7d7}.md\:hover\:to-red-300:hover{--gradient-to-color:#feb2b2}.md\:hover\:to-red-400:hover{--gradient-to-color:#fc8181}.md\:hover\:to-red-500:hover{--gradient-to-color:#f56565}.md\:hover\:to-red-600:hover{--gradient-to-color:#e53e3e}.md\:hover\:to-red-700:hover{--gradient-to-color:#c53030}.md\:hover\:to-red-800:hover{--gradient-to-color:#9b2c2c}.md\:hover\:to-red-900:hover{--gradient-to-color:#742a2a}.md\:hover\:to-orange-100:hover{--gradient-to-color:#fffaf0}.md\:hover\:to-orange-200:hover{--gradient-to-color:#feebc8}.md\:hover\:to-orange-300:hover{--gradient-to-color:#fbd38d}.md\:hover\:to-orange-400:hover{--gradient-to-color:#f6ad55}.md\:hover\:to-orange-500:hover{--gradient-to-color:#ed8936}.md\:hover\:to-orange-600:hover{--gradient-to-color:#dd6b20}.md\:hover\:to-orange-700:hover{--gradient-to-color:#c05621}.md\:hover\:to-orange-800:hover{--gradient-to-color:#9c4221}.md\:hover\:to-orange-900:hover{--gradient-to-color:#7b341e}.md\:hover\:to-yellow-100:hover{--gradient-to-color:#fffff0}.md\:hover\:to-yellow-200:hover{--gradient-to-color:#fefcbf}.md\:hover\:to-yellow-300:hover{--gradient-to-color:#faf089}.md\:hover\:to-yellow-400:hover{--gradient-to-color:#f6e05e}.md\:hover\:to-yellow-500:hover{--gradient-to-color:#ecc94b}.md\:hover\:to-yellow-600:hover{--gradient-to-color:#d69e2e}.md\:hover\:to-yellow-700:hover{--gradient-to-color:#b7791f}.md\:hover\:to-yellow-800:hover{--gradient-to-color:#975a16}.md\:hover\:to-yellow-900:hover{--gradient-to-color:#744210}.md\:hover\:to-green-100:hover{--gradient-to-color:#f0fff4}.md\:hover\:to-green-200:hover{--gradient-to-color:#c6f6d5}.md\:hover\:to-green-300:hover{--gradient-to-color:#9ae6b4}.md\:hover\:to-green-400:hover{--gradient-to-color:#68d391}.md\:hover\:to-green-500:hover{--gradient-to-color:#48bb78}.md\:hover\:to-green-600:hover{--gradient-to-color:#38a169}.md\:hover\:to-green-700:hover{--gradient-to-color:#2f855a}.md\:hover\:to-green-800:hover{--gradient-to-color:#276749}.md\:hover\:to-green-900:hover{--gradient-to-color:#22543d}.md\:hover\:to-teal-100:hover{--gradient-to-color:#e6fffa}.md\:hover\:to-teal-200:hover{--gradient-to-color:#b2f5ea}.md\:hover\:to-teal-300:hover{--gradient-to-color:#81e6d9}.md\:hover\:to-teal-400:hover{--gradient-to-color:#4fd1c5}.md\:hover\:to-teal-500:hover{--gradient-to-color:#38b2ac}.md\:hover\:to-teal-600:hover{--gradient-to-color:#319795}.md\:hover\:to-teal-700:hover{--gradient-to-color:#2c7a7b}.md\:hover\:to-teal-800:hover{--gradient-to-color:#285e61}.md\:hover\:to-teal-900:hover{--gradient-to-color:#234e52}.md\:hover\:to-blue-100:hover{--gradient-to-color:#ebf8ff}.md\:hover\:to-blue-200:hover{--gradient-to-color:#bee3f8}.md\:hover\:to-blue-300:hover{--gradient-to-color:#90cdf4}.md\:hover\:to-blue-400:hover{--gradient-to-color:#63b3ed}.md\:hover\:to-blue-500:hover{--gradient-to-color:#4299e1}.md\:hover\:to-blue-600:hover{--gradient-to-color:#3182ce}.md\:hover\:to-blue-700:hover{--gradient-to-color:#2b6cb0}.md\:hover\:to-blue-800:hover{--gradient-to-color:#2c5282}.md\:hover\:to-blue-900:hover{--gradient-to-color:#2a4365}.md\:hover\:to-indigo-100:hover{--gradient-to-color:#ebf4ff}.md\:hover\:to-indigo-200:hover{--gradient-to-color:#c3dafe}.md\:hover\:to-indigo-300:hover{--gradient-to-color:#a3bffa}.md\:hover\:to-indigo-400:hover{--gradient-to-color:#7f9cf5}.md\:hover\:to-indigo-500:hover{--gradient-to-color:#667eea}.md\:hover\:to-indigo-600:hover{--gradient-to-color:#5a67d8}.md\:hover\:to-indigo-700:hover{--gradient-to-color:#4c51bf}.md\:hover\:to-indigo-800:hover{--gradient-to-color:#434190}.md\:hover\:to-indigo-900:hover{--gradient-to-color:#3c366b}.md\:hover\:to-purple-100:hover{--gradient-to-color:#faf5ff}.md\:hover\:to-purple-200:hover{--gradient-to-color:#e9d8fd}.md\:hover\:to-purple-300:hover{--gradient-to-color:#d6bcfa}.md\:hover\:to-purple-400:hover{--gradient-to-color:#b794f4}.md\:hover\:to-purple-500:hover{--gradient-to-color:#9f7aea}.md\:hover\:to-purple-600:hover{--gradient-to-color:#805ad5}.md\:hover\:to-purple-700:hover{--gradient-to-color:#6b46c1}.md\:hover\:to-purple-800:hover{--gradient-to-color:#553c9a}.md\:hover\:to-purple-900:hover{--gradient-to-color:#44337a}.md\:hover\:to-pink-100:hover{--gradient-to-color:#fff5f7}.md\:hover\:to-pink-200:hover{--gradient-to-color:#fed7e2}.md\:hover\:to-pink-300:hover{--gradient-to-color:#fbb6ce}.md\:hover\:to-pink-400:hover{--gradient-to-color:#f687b3}.md\:hover\:to-pink-500:hover{--gradient-to-color:#ed64a6}.md\:hover\:to-pink-600:hover{--gradient-to-color:#d53f8c}.md\:hover\:to-pink-700:hover{--gradient-to-color:#b83280}.md\:hover\:to-pink-800:hover{--gradient-to-color:#97266d}.md\:hover\:to-pink-900:hover{--gradient-to-color:#702459}.md\:focus\:from-transparent:focus{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:focus\:from-current:focus{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:focus\:from-black:focus{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:focus\:from-white:focus{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:focus\:from-gray-100:focus{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.md\:focus\:from-gray-200:focus{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.md\:focus\:from-gray-300:focus{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.md\:focus\:from-gray-400:focus{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.md\:focus\:from-gray-500:focus{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.md\:focus\:from-gray-600:focus{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.md\:focus\:from-gray-700:focus{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.md\:focus\:from-gray-800:focus{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.md\:focus\:from-gray-900:focus{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.md\:focus\:from-red-100:focus{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.md\:focus\:from-red-200:focus{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.md\:focus\:from-red-300:focus{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.md\:focus\:from-red-400:focus{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.md\:focus\:from-red-500:focus{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.md\:focus\:from-red-600:focus{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.md\:focus\:from-red-700:focus{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.md\:focus\:from-red-800:focus{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.md\:focus\:from-red-900:focus{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.md\:focus\:from-orange-100:focus{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.md\:focus\:from-orange-200:focus{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.md\:focus\:from-orange-300:focus{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.md\:focus\:from-orange-400:focus{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.md\:focus\:from-orange-500:focus{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.md\:focus\:from-orange-600:focus{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.md\:focus\:from-orange-700:focus{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.md\:focus\:from-orange-800:focus{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.md\:focus\:from-orange-900:focus{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.md\:focus\:from-yellow-100:focus{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.md\:focus\:from-yellow-200:focus{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.md\:focus\:from-yellow-300:focus{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.md\:focus\:from-yellow-400:focus{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.md\:focus\:from-yellow-500:focus{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.md\:focus\:from-yellow-600:focus{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.md\:focus\:from-yellow-700:focus{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.md\:focus\:from-yellow-800:focus{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.md\:focus\:from-yellow-900:focus{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.md\:focus\:from-green-100:focus{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.md\:focus\:from-green-200:focus{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.md\:focus\:from-green-300:focus{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.md\:focus\:from-green-400:focus{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.md\:focus\:from-green-500:focus{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.md\:focus\:from-green-600:focus{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.md\:focus\:from-green-700:focus{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.md\:focus\:from-green-800:focus{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.md\:focus\:from-green-900:focus{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.md\:focus\:from-teal-100:focus{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.md\:focus\:from-teal-200:focus{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.md\:focus\:from-teal-300:focus{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.md\:focus\:from-teal-400:focus{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.md\:focus\:from-teal-500:focus{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.md\:focus\:from-teal-600:focus{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.md\:focus\:from-teal-700:focus{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.md\:focus\:from-teal-800:focus{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.md\:focus\:from-teal-900:focus{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.md\:focus\:from-blue-100:focus{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.md\:focus\:from-blue-200:focus{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.md\:focus\:from-blue-300:focus{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.md\:focus\:from-blue-400:focus{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.md\:focus\:from-blue-500:focus{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.md\:focus\:from-blue-600:focus{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.md\:focus\:from-blue-700:focus{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.md\:focus\:from-blue-800:focus{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.md\:focus\:from-blue-900:focus{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.md\:focus\:from-indigo-100:focus{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.md\:focus\:from-indigo-200:focus{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.md\:focus\:from-indigo-300:focus{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.md\:focus\:from-indigo-400:focus{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.md\:focus\:from-indigo-500:focus{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.md\:focus\:from-indigo-600:focus{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.md\:focus\:from-indigo-700:focus{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.md\:focus\:from-indigo-800:focus{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.md\:focus\:from-indigo-900:focus{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.md\:focus\:from-purple-100:focus{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.md\:focus\:from-purple-200:focus{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.md\:focus\:from-purple-300:focus{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.md\:focus\:from-purple-400:focus{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.md\:focus\:from-purple-500:focus{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.md\:focus\:from-purple-600:focus{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.md\:focus\:from-purple-700:focus{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.md\:focus\:from-purple-800:focus{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.md\:focus\:from-purple-900:focus{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.md\:focus\:from-pink-100:focus{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.md\:focus\:from-pink-200:focus{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.md\:focus\:from-pink-300:focus{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.md\:focus\:from-pink-400:focus{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.md\:focus\:from-pink-500:focus{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.md\:focus\:from-pink-600:focus{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.md\:focus\:from-pink-700:focus{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.md\:focus\:from-pink-800:focus{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.md\:focus\:from-pink-900:focus{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.md\:focus\:via-transparent:focus{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:focus\:via-current:focus{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:focus\:via-black:focus{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.md\:focus\:via-white:focus{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.md\:focus\:via-gray-100:focus{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.md\:focus\:via-gray-200:focus{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.md\:focus\:via-gray-300:focus{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.md\:focus\:via-gray-400:focus{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.md\:focus\:via-gray-500:focus{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.md\:focus\:via-gray-600:focus{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.md\:focus\:via-gray-700:focus{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.md\:focus\:via-gray-800:focus{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.md\:focus\:via-gray-900:focus{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.md\:focus\:via-red-100:focus{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.md\:focus\:via-red-200:focus{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.md\:focus\:via-red-300:focus{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.md\:focus\:via-red-400:focus{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.md\:focus\:via-red-500:focus{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.md\:focus\:via-red-600:focus{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.md\:focus\:via-red-700:focus{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.md\:focus\:via-red-800:focus{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.md\:focus\:via-red-900:focus{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.md\:focus\:via-orange-100:focus{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.md\:focus\:via-orange-200:focus{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.md\:focus\:via-orange-300:focus{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.md\:focus\:via-orange-400:focus{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.md\:focus\:via-orange-500:focus{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.md\:focus\:via-orange-600:focus{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.md\:focus\:via-orange-700:focus{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.md\:focus\:via-orange-800:focus{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.md\:focus\:via-orange-900:focus{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.md\:focus\:via-yellow-100:focus{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.md\:focus\:via-yellow-200:focus{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.md\:focus\:via-yellow-300:focus{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.md\:focus\:via-yellow-400:focus{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.md\:focus\:via-yellow-500:focus{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.md\:focus\:via-yellow-600:focus{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.md\:focus\:via-yellow-700:focus{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.md\:focus\:via-yellow-800:focus{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.md\:focus\:via-yellow-900:focus{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.md\:focus\:via-green-100:focus{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.md\:focus\:via-green-200:focus{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.md\:focus\:via-green-300:focus{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.md\:focus\:via-green-400:focus{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.md\:focus\:via-green-500:focus{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.md\:focus\:via-green-600:focus{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.md\:focus\:via-green-700:focus{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.md\:focus\:via-green-800:focus{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.md\:focus\:via-green-900:focus{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.md\:focus\:via-teal-100:focus{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.md\:focus\:via-teal-200:focus{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.md\:focus\:via-teal-300:focus{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.md\:focus\:via-teal-400:focus{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.md\:focus\:via-teal-500:focus{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.md\:focus\:via-teal-600:focus{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.md\:focus\:via-teal-700:focus{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.md\:focus\:via-teal-800:focus{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.md\:focus\:via-teal-900:focus{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.md\:focus\:via-blue-100:focus{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.md\:focus\:via-blue-200:focus{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.md\:focus\:via-blue-300:focus{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.md\:focus\:via-blue-400:focus{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.md\:focus\:via-blue-500:focus{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.md\:focus\:via-blue-600:focus{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.md\:focus\:via-blue-700:focus{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.md\:focus\:via-blue-800:focus{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.md\:focus\:via-blue-900:focus{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.md\:focus\:via-indigo-100:focus{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.md\:focus\:via-indigo-200:focus{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.md\:focus\:via-indigo-300:focus{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.md\:focus\:via-indigo-400:focus{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.md\:focus\:via-indigo-500:focus{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.md\:focus\:via-indigo-600:focus{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.md\:focus\:via-indigo-700:focus{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.md\:focus\:via-indigo-800:focus{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.md\:focus\:via-indigo-900:focus{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.md\:focus\:via-purple-100:focus{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.md\:focus\:via-purple-200:focus{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.md\:focus\:via-purple-300:focus{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.md\:focus\:via-purple-400:focus{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.md\:focus\:via-purple-500:focus{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.md\:focus\:via-purple-600:focus{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.md\:focus\:via-purple-700:focus{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.md\:focus\:via-purple-800:focus{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.md\:focus\:via-purple-900:focus{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.md\:focus\:via-pink-100:focus{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.md\:focus\:via-pink-200:focus{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.md\:focus\:via-pink-300:focus{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.md\:focus\:via-pink-400:focus{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.md\:focus\:via-pink-500:focus{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.md\:focus\:via-pink-600:focus{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.md\:focus\:via-pink-700:focus{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.md\:focus\:via-pink-800:focus{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.md\:focus\:via-pink-900:focus{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.md\:focus\:to-transparent:focus{--gradient-to-color:transparent}.md\:focus\:to-current:focus{--gradient-to-color:currentColor}.md\:focus\:to-black:focus{--gradient-to-color:#000}.md\:focus\:to-white:focus{--gradient-to-color:#fff}.md\:focus\:to-gray-100:focus{--gradient-to-color:#f7fafc}.md\:focus\:to-gray-200:focus{--gradient-to-color:#edf2f7}.md\:focus\:to-gray-300:focus{--gradient-to-color:#e2e8f0}.md\:focus\:to-gray-400:focus{--gradient-to-color:#cbd5e0}.md\:focus\:to-gray-500:focus{--gradient-to-color:#a0aec0}.md\:focus\:to-gray-600:focus{--gradient-to-color:#718096}.md\:focus\:to-gray-700:focus{--gradient-to-color:#4a5568}.md\:focus\:to-gray-800:focus{--gradient-to-color:#2d3748}.md\:focus\:to-gray-900:focus{--gradient-to-color:#1a202c}.md\:focus\:to-red-100:focus{--gradient-to-color:#fff5f5}.md\:focus\:to-red-200:focus{--gradient-to-color:#fed7d7}.md\:focus\:to-red-300:focus{--gradient-to-color:#feb2b2}.md\:focus\:to-red-400:focus{--gradient-to-color:#fc8181}.md\:focus\:to-red-500:focus{--gradient-to-color:#f56565}.md\:focus\:to-red-600:focus{--gradient-to-color:#e53e3e}.md\:focus\:to-red-700:focus{--gradient-to-color:#c53030}.md\:focus\:to-red-800:focus{--gradient-to-color:#9b2c2c}.md\:focus\:to-red-900:focus{--gradient-to-color:#742a2a}.md\:focus\:to-orange-100:focus{--gradient-to-color:#fffaf0}.md\:focus\:to-orange-200:focus{--gradient-to-color:#feebc8}.md\:focus\:to-orange-300:focus{--gradient-to-color:#fbd38d}.md\:focus\:to-orange-400:focus{--gradient-to-color:#f6ad55}.md\:focus\:to-orange-500:focus{--gradient-to-color:#ed8936}.md\:focus\:to-orange-600:focus{--gradient-to-color:#dd6b20}.md\:focus\:to-orange-700:focus{--gradient-to-color:#c05621}.md\:focus\:to-orange-800:focus{--gradient-to-color:#9c4221}.md\:focus\:to-orange-900:focus{--gradient-to-color:#7b341e}.md\:focus\:to-yellow-100:focus{--gradient-to-color:#fffff0}.md\:focus\:to-yellow-200:focus{--gradient-to-color:#fefcbf}.md\:focus\:to-yellow-300:focus{--gradient-to-color:#faf089}.md\:focus\:to-yellow-400:focus{--gradient-to-color:#f6e05e}.md\:focus\:to-yellow-500:focus{--gradient-to-color:#ecc94b}.md\:focus\:to-yellow-600:focus{--gradient-to-color:#d69e2e}.md\:focus\:to-yellow-700:focus{--gradient-to-color:#b7791f}.md\:focus\:to-yellow-800:focus{--gradient-to-color:#975a16}.md\:focus\:to-yellow-900:focus{--gradient-to-color:#744210}.md\:focus\:to-green-100:focus{--gradient-to-color:#f0fff4}.md\:focus\:to-green-200:focus{--gradient-to-color:#c6f6d5}.md\:focus\:to-green-300:focus{--gradient-to-color:#9ae6b4}.md\:focus\:to-green-400:focus{--gradient-to-color:#68d391}.md\:focus\:to-green-500:focus{--gradient-to-color:#48bb78}.md\:focus\:to-green-600:focus{--gradient-to-color:#38a169}.md\:focus\:to-green-700:focus{--gradient-to-color:#2f855a}.md\:focus\:to-green-800:focus{--gradient-to-color:#276749}.md\:focus\:to-green-900:focus{--gradient-to-color:#22543d}.md\:focus\:to-teal-100:focus{--gradient-to-color:#e6fffa}.md\:focus\:to-teal-200:focus{--gradient-to-color:#b2f5ea}.md\:focus\:to-teal-300:focus{--gradient-to-color:#81e6d9}.md\:focus\:to-teal-400:focus{--gradient-to-color:#4fd1c5}.md\:focus\:to-teal-500:focus{--gradient-to-color:#38b2ac}.md\:focus\:to-teal-600:focus{--gradient-to-color:#319795}.md\:focus\:to-teal-700:focus{--gradient-to-color:#2c7a7b}.md\:focus\:to-teal-800:focus{--gradient-to-color:#285e61}.md\:focus\:to-teal-900:focus{--gradient-to-color:#234e52}.md\:focus\:to-blue-100:focus{--gradient-to-color:#ebf8ff}.md\:focus\:to-blue-200:focus{--gradient-to-color:#bee3f8}.md\:focus\:to-blue-300:focus{--gradient-to-color:#90cdf4}.md\:focus\:to-blue-400:focus{--gradient-to-color:#63b3ed}.md\:focus\:to-blue-500:focus{--gradient-to-color:#4299e1}.md\:focus\:to-blue-600:focus{--gradient-to-color:#3182ce}.md\:focus\:to-blue-700:focus{--gradient-to-color:#2b6cb0}.md\:focus\:to-blue-800:focus{--gradient-to-color:#2c5282}.md\:focus\:to-blue-900:focus{--gradient-to-color:#2a4365}.md\:focus\:to-indigo-100:focus{--gradient-to-color:#ebf4ff}.md\:focus\:to-indigo-200:focus{--gradient-to-color:#c3dafe}.md\:focus\:to-indigo-300:focus{--gradient-to-color:#a3bffa}.md\:focus\:to-indigo-400:focus{--gradient-to-color:#7f9cf5}.md\:focus\:to-indigo-500:focus{--gradient-to-color:#667eea}.md\:focus\:to-indigo-600:focus{--gradient-to-color:#5a67d8}.md\:focus\:to-indigo-700:focus{--gradient-to-color:#4c51bf}.md\:focus\:to-indigo-800:focus{--gradient-to-color:#434190}.md\:focus\:to-indigo-900:focus{--gradient-to-color:#3c366b}.md\:focus\:to-purple-100:focus{--gradient-to-color:#faf5ff}.md\:focus\:to-purple-200:focus{--gradient-to-color:#e9d8fd}.md\:focus\:to-purple-300:focus{--gradient-to-color:#d6bcfa}.md\:focus\:to-purple-400:focus{--gradient-to-color:#b794f4}.md\:focus\:to-purple-500:focus{--gradient-to-color:#9f7aea}.md\:focus\:to-purple-600:focus{--gradient-to-color:#805ad5}.md\:focus\:to-purple-700:focus{--gradient-to-color:#6b46c1}.md\:focus\:to-purple-800:focus{--gradient-to-color:#553c9a}.md\:focus\:to-purple-900:focus{--gradient-to-color:#44337a}.md\:focus\:to-pink-100:focus{--gradient-to-color:#fff5f7}.md\:focus\:to-pink-200:focus{--gradient-to-color:#fed7e2}.md\:focus\:to-pink-300:focus{--gradient-to-color:#fbb6ce}.md\:focus\:to-pink-400:focus{--gradient-to-color:#f687b3}.md\:focus\:to-pink-500:focus{--gradient-to-color:#ed64a6}.md\:focus\:to-pink-600:focus{--gradient-to-color:#d53f8c}.md\:focus\:to-pink-700:focus{--gradient-to-color:#b83280}.md\:focus\:to-pink-800:focus{--gradient-to-color:#97266d}.md\:focus\:to-pink-900:focus{--gradient-to-color:#702459}.md\:bg-opacity-0{--bg-opacity:0}.md\:bg-opacity-25{--bg-opacity:0.25}.md\:bg-opacity-50{--bg-opacity:0.5}.md\:bg-opacity-75{--bg-opacity:0.75}.md\:bg-opacity-100{--bg-opacity:1}.md\:hover\:bg-opacity-0:hover{--bg-opacity:0}.md\:hover\:bg-opacity-25:hover{--bg-opacity:0.25}.md\:hover\:bg-opacity-50:hover{--bg-opacity:0.5}.md\:hover\:bg-opacity-75:hover{--bg-opacity:0.75}.md\:hover\:bg-opacity-100:hover{--bg-opacity:1}.md\:focus\:bg-opacity-0:focus{--bg-opacity:0}.md\:focus\:bg-opacity-25:focus{--bg-opacity:0.25}.md\:focus\:bg-opacity-50:focus{--bg-opacity:0.5}.md\:focus\:bg-opacity-75:focus{--bg-opacity:0.75}.md\:focus\:bg-opacity-100:focus{--bg-opacity:1}.md\:bg-bottom{background-position:bottom}.md\:bg-center{background-position:center}.md\:bg-left{background-position:left}.md\:bg-left-bottom{background-position:left bottom}.md\:bg-left-top{background-position:left top}.md\:bg-right{background-position:right}.md\:bg-right-bottom{background-position:right bottom}.md\:bg-right-top{background-position:right top}.md\:bg-top{background-position:top}.md\:bg-repeat{background-repeat:repeat}.md\:bg-no-repeat{background-repeat:no-repeat}.md\:bg-repeat-x{background-repeat:repeat-x}.md\:bg-repeat-y{background-repeat:repeat-y}.md\:bg-repeat-round{background-repeat:round}.md\:bg-repeat-space{background-repeat:space}.md\:bg-auto{background-size:auto}.md\:bg-cover{background-size:cover}.md\:bg-contain{background-size:contain}.md\:border-collapse{border-collapse:collapse}.md\:border-separate{border-collapse:separate}.md\:border-transparent{border-color:transparent}.md\:border-current{border-color:currentColor}.md\:border-black{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.md\:border-white{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.md\:border-gray-100{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.md\:border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.md\:border-gray-300{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.md\:border-gray-400{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.md\:border-gray-500{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.md\:border-gray-600{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.md\:border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.md\:border-gray-800{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.md\:border-gray-900{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.md\:border-red-100{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.md\:border-red-200{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.md\:border-red-300{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.md\:border-red-400{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.md\:border-red-500{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.md\:border-red-600{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.md\:border-red-700{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.md\:border-red-800{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.md\:border-red-900{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.md\:border-orange-100{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.md\:border-orange-200{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.md\:border-orange-300{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.md\:border-orange-400{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.md\:border-orange-500{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.md\:border-orange-600{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.md\:border-orange-700{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.md\:border-orange-800{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.md\:border-orange-900{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.md\:border-yellow-100{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.md\:border-yellow-200{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.md\:border-yellow-300{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.md\:border-yellow-400{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.md\:border-yellow-500{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.md\:border-yellow-600{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.md\:border-yellow-700{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.md\:border-yellow-800{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.md\:border-yellow-900{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.md\:border-green-100{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.md\:border-green-200{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.md\:border-green-300{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.md\:border-green-400{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.md\:border-green-500{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.md\:border-green-600{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.md\:border-green-700{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.md\:border-green-800{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.md\:border-green-900{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.md\:border-teal-100{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.md\:border-teal-200{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.md\:border-teal-300{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.md\:border-teal-400{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.md\:border-teal-500{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.md\:border-teal-600{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.md\:border-teal-700{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.md\:border-teal-800{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.md\:border-teal-900{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.md\:border-blue-100{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.md\:border-blue-200{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.md\:border-blue-300{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.md\:border-blue-400{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.md\:border-blue-500{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.md\:border-blue-600{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.md\:border-blue-700{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.md\:border-blue-800{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.md\:border-blue-900{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.md\:border-indigo-100{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.md\:border-indigo-200{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.md\:border-indigo-300{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.md\:border-indigo-400{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.md\:border-indigo-500{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.md\:border-indigo-600{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.md\:border-indigo-700{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.md\:border-indigo-800{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.md\:border-indigo-900{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.md\:border-purple-100{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.md\:border-purple-200{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.md\:border-purple-300{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.md\:border-purple-400{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.md\:border-purple-500{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.md\:border-purple-600{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.md\:border-purple-700{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.md\:border-purple-800{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.md\:border-purple-900{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.md\:border-pink-100{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.md\:border-pink-200{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.md\:border-pink-300{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.md\:border-pink-400{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.md\:border-pink-500{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.md\:border-pink-600{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.md\:border-pink-700{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.md\:border-pink-800{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.md\:border-pink-900{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.md\:hover\:border-transparent:hover{border-color:transparent}.md\:hover\:border-current:hover{border-color:currentColor}.md\:hover\:border-black:hover{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.md\:hover\:border-white:hover{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.md\:hover\:border-gray-100:hover{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.md\:hover\:border-gray-200:hover{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.md\:hover\:border-gray-300:hover{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.md\:hover\:border-gray-400:hover{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.md\:hover\:border-gray-500:hover{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.md\:hover\:border-gray-600:hover{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.md\:hover\:border-gray-700:hover{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.md\:hover\:border-gray-800:hover{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.md\:hover\:border-gray-900:hover{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.md\:hover\:border-red-100:hover{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.md\:hover\:border-red-200:hover{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.md\:hover\:border-red-300:hover{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.md\:hover\:border-red-400:hover{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.md\:hover\:border-red-500:hover{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.md\:hover\:border-red-600:hover{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.md\:hover\:border-red-700:hover{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.md\:hover\:border-red-800:hover{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.md\:hover\:border-red-900:hover{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.md\:hover\:border-orange-100:hover{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.md\:hover\:border-orange-200:hover{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.md\:hover\:border-orange-300:hover{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.md\:hover\:border-orange-400:hover{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.md\:hover\:border-orange-500:hover{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.md\:hover\:border-orange-600:hover{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.md\:hover\:border-orange-700:hover{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.md\:hover\:border-orange-800:hover{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.md\:hover\:border-orange-900:hover{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.md\:hover\:border-yellow-100:hover{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.md\:hover\:border-yellow-200:hover{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.md\:hover\:border-yellow-300:hover{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.md\:hover\:border-yellow-400:hover{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.md\:hover\:border-yellow-500:hover{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.md\:hover\:border-yellow-600:hover{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.md\:hover\:border-yellow-700:hover{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.md\:hover\:border-yellow-800:hover{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.md\:hover\:border-yellow-900:hover{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.md\:hover\:border-green-100:hover{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.md\:hover\:border-green-200:hover{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.md\:hover\:border-green-300:hover{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.md\:hover\:border-green-400:hover{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.md\:hover\:border-green-500:hover{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.md\:hover\:border-green-600:hover{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.md\:hover\:border-green-700:hover{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.md\:hover\:border-green-800:hover{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.md\:hover\:border-green-900:hover{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.md\:hover\:border-teal-100:hover{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.md\:hover\:border-teal-200:hover{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.md\:hover\:border-teal-300:hover{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.md\:hover\:border-teal-400:hover{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.md\:hover\:border-teal-500:hover{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.md\:hover\:border-teal-600:hover{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.md\:hover\:border-teal-700:hover{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.md\:hover\:border-teal-800:hover{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.md\:hover\:border-teal-900:hover{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.md\:hover\:border-blue-100:hover{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.md\:hover\:border-blue-200:hover{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.md\:hover\:border-blue-300:hover{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.md\:hover\:border-blue-400:hover{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.md\:hover\:border-blue-500:hover{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.md\:hover\:border-blue-600:hover{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.md\:hover\:border-blue-700:hover{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.md\:hover\:border-blue-800:hover{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.md\:hover\:border-blue-900:hover{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.md\:hover\:border-indigo-100:hover{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.md\:hover\:border-indigo-200:hover{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.md\:hover\:border-indigo-300:hover{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.md\:hover\:border-indigo-400:hover{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.md\:hover\:border-indigo-500:hover{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.md\:hover\:border-indigo-600:hover{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.md\:hover\:border-indigo-700:hover{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.md\:hover\:border-indigo-800:hover{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.md\:hover\:border-indigo-900:hover{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.md\:hover\:border-purple-100:hover{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.md\:hover\:border-purple-200:hover{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.md\:hover\:border-purple-300:hover{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.md\:hover\:border-purple-400:hover{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.md\:hover\:border-purple-500:hover{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.md\:hover\:border-purple-600:hover{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.md\:hover\:border-purple-700:hover{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.md\:hover\:border-purple-800:hover{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.md\:hover\:border-purple-900:hover{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.md\:hover\:border-pink-100:hover{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.md\:hover\:border-pink-200:hover{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.md\:hover\:border-pink-300:hover{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.md\:hover\:border-pink-400:hover{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.md\:hover\:border-pink-500:hover{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.md\:hover\:border-pink-600:hover{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.md\:hover\:border-pink-700:hover{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.md\:hover\:border-pink-800:hover{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.md\:hover\:border-pink-900:hover{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.md\:focus\:border-transparent:focus{border-color:transparent}.md\:focus\:border-current:focus{border-color:currentColor}.md\:focus\:border-black:focus{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.md\:focus\:border-white:focus{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.md\:focus\:border-gray-100:focus{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.md\:focus\:border-gray-200:focus{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.md\:focus\:border-gray-300:focus{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.md\:focus\:border-gray-400:focus{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.md\:focus\:border-gray-500:focus{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.md\:focus\:border-gray-600:focus{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.md\:focus\:border-gray-700:focus{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.md\:focus\:border-gray-800:focus{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.md\:focus\:border-gray-900:focus{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.md\:focus\:border-red-100:focus{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.md\:focus\:border-red-200:focus{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.md\:focus\:border-red-300:focus{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.md\:focus\:border-red-400:focus{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.md\:focus\:border-red-500:focus{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.md\:focus\:border-red-600:focus{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.md\:focus\:border-red-700:focus{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.md\:focus\:border-red-800:focus{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.md\:focus\:border-red-900:focus{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.md\:focus\:border-orange-100:focus{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.md\:focus\:border-orange-200:focus{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.md\:focus\:border-orange-300:focus{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.md\:focus\:border-orange-400:focus{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.md\:focus\:border-orange-500:focus{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.md\:focus\:border-orange-600:focus{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.md\:focus\:border-orange-700:focus{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.md\:focus\:border-orange-800:focus{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.md\:focus\:border-orange-900:focus{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.md\:focus\:border-yellow-100:focus{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.md\:focus\:border-yellow-200:focus{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.md\:focus\:border-yellow-300:focus{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.md\:focus\:border-yellow-400:focus{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.md\:focus\:border-yellow-500:focus{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.md\:focus\:border-yellow-600:focus{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.md\:focus\:border-yellow-700:focus{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.md\:focus\:border-yellow-800:focus{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.md\:focus\:border-yellow-900:focus{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.md\:focus\:border-green-100:focus{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.md\:focus\:border-green-200:focus{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.md\:focus\:border-green-300:focus{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.md\:focus\:border-green-400:focus{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.md\:focus\:border-green-500:focus{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.md\:focus\:border-green-600:focus{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.md\:focus\:border-green-700:focus{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.md\:focus\:border-green-800:focus{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.md\:focus\:border-green-900:focus{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.md\:focus\:border-teal-100:focus{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.md\:focus\:border-teal-200:focus{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.md\:focus\:border-teal-300:focus{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.md\:focus\:border-teal-400:focus{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.md\:focus\:border-teal-500:focus{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.md\:focus\:border-teal-600:focus{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.md\:focus\:border-teal-700:focus{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.md\:focus\:border-teal-800:focus{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.md\:focus\:border-teal-900:focus{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.md\:focus\:border-blue-100:focus{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.md\:focus\:border-blue-200:focus{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.md\:focus\:border-blue-300:focus{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.md\:focus\:border-blue-400:focus{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.md\:focus\:border-blue-500:focus{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.md\:focus\:border-blue-600:focus{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.md\:focus\:border-blue-700:focus{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.md\:focus\:border-blue-800:focus{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.md\:focus\:border-blue-900:focus{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.md\:focus\:border-indigo-100:focus{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.md\:focus\:border-indigo-200:focus{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.md\:focus\:border-indigo-300:focus{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.md\:focus\:border-indigo-400:focus{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.md\:focus\:border-indigo-500:focus{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.md\:focus\:border-indigo-600:focus{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.md\:focus\:border-indigo-700:focus{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.md\:focus\:border-indigo-800:focus{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.md\:focus\:border-indigo-900:focus{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.md\:focus\:border-purple-100:focus{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.md\:focus\:border-purple-200:focus{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.md\:focus\:border-purple-300:focus{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.md\:focus\:border-purple-400:focus{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.md\:focus\:border-purple-500:focus{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.md\:focus\:border-purple-600:focus{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.md\:focus\:border-purple-700:focus{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.md\:focus\:border-purple-800:focus{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.md\:focus\:border-purple-900:focus{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.md\:focus\:border-pink-100:focus{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.md\:focus\:border-pink-200:focus{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.md\:focus\:border-pink-300:focus{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.md\:focus\:border-pink-400:focus{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.md\:focus\:border-pink-500:focus{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.md\:focus\:border-pink-600:focus{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.md\:focus\:border-pink-700:focus{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.md\:focus\:border-pink-800:focus{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.md\:focus\:border-pink-900:focus{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.md\:border-opacity-0{--border-opacity:0}.md\:border-opacity-25{--border-opacity:0.25}.md\:border-opacity-50{--border-opacity:0.5}.md\:border-opacity-75{--border-opacity:0.75}.md\:border-opacity-100{--border-opacity:1}.md\:hover\:border-opacity-0:hover{--border-opacity:0}.md\:hover\:border-opacity-25:hover{--border-opacity:0.25}.md\:hover\:border-opacity-50:hover{--border-opacity:0.5}.md\:hover\:border-opacity-75:hover{--border-opacity:0.75}.md\:hover\:border-opacity-100:hover{--border-opacity:1}.md\:focus\:border-opacity-0:focus{--border-opacity:0}.md\:focus\:border-opacity-25:focus{--border-opacity:0.25}.md\:focus\:border-opacity-50:focus{--border-opacity:0.5}.md\:focus\:border-opacity-75:focus{--border-opacity:0.75}.md\:focus\:border-opacity-100:focus{--border-opacity:1}.md\:rounded-none{border-radius:0}.md\:rounded-sm{border-radius:.125rem}.md\:rounded{border-radius:.25rem}.md\:rounded-md{border-radius:.375rem}.md\:rounded-lg{border-radius:.5rem}.md\:rounded-xl{border-radius:.75rem}.md\:rounded-2xl{border-radius:1rem}.md\:rounded-3xl{border-radius:1.5rem}.md\:rounded-full{border-radius:9999px}.md\:rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.md\:rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.md\:rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.md\:rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.md\:rounded-t-sm{border-top-left-radius:.125rem;border-top-right-radius:.125rem}.md\:rounded-r-sm{border-top-right-radius:.125rem;border-bottom-right-radius:.125rem}.md\:rounded-b-sm{border-bottom-right-radius:.125rem;border-bottom-left-radius:.125rem}.md\:rounded-l-sm{border-top-left-radius:.125rem;border-bottom-left-radius:.125rem}.md\:rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.md\:rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.md\:rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.md\:rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.md\:rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.md\:rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.md\:rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.md\:rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.md\:rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.md\:rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.md\:rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.md\:rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.md\:rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.md\:rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.md\:rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.md\:rounded-l-xl{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.md\:rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.md\:rounded-r-2xl{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.md\:rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.md\:rounded-l-2xl{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.md\:rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.md\:rounded-r-3xl{border-top-right-radius:1.5rem;border-bottom-right-radius:1.5rem}.md\:rounded-b-3xl{border-bottom-right-radius:1.5rem;border-bottom-left-radius:1.5rem}.md\:rounded-l-3xl{border-top-left-radius:1.5rem;border-bottom-left-radius:1.5rem}.md\:rounded-t-full{border-top-left-radius:9999px;border-top-right-radius:9999px}.md\:rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.md\:rounded-b-full{border-bottom-right-radius:9999px;border-bottom-left-radius:9999px}.md\:rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.md\:rounded-tl-none{border-top-left-radius:0}.md\:rounded-tr-none{border-top-right-radius:0}.md\:rounded-br-none{border-bottom-right-radius:0}.md\:rounded-bl-none{border-bottom-left-radius:0}.md\:rounded-tl-sm{border-top-left-radius:.125rem}.md\:rounded-tr-sm{border-top-right-radius:.125rem}.md\:rounded-br-sm{border-bottom-right-radius:.125rem}.md\:rounded-bl-sm{border-bottom-left-radius:.125rem}.md\:rounded-tl{border-top-left-radius:.25rem}.md\:rounded-tr{border-top-right-radius:.25rem}.md\:rounded-br{border-bottom-right-radius:.25rem}.md\:rounded-bl{border-bottom-left-radius:.25rem}.md\:rounded-tl-md{border-top-left-radius:.375rem}.md\:rounded-tr-md{border-top-right-radius:.375rem}.md\:rounded-br-md{border-bottom-right-radius:.375rem}.md\:rounded-bl-md{border-bottom-left-radius:.375rem}.md\:rounded-tl-lg{border-top-left-radius:.5rem}.md\:rounded-tr-lg{border-top-right-radius:.5rem}.md\:rounded-br-lg{border-bottom-right-radius:.5rem}.md\:rounded-bl-lg{border-bottom-left-radius:.5rem}.md\:rounded-tl-xl{border-top-left-radius:.75rem}.md\:rounded-tr-xl{border-top-right-radius:.75rem}.md\:rounded-br-xl{border-bottom-right-radius:.75rem}.md\:rounded-bl-xl{border-bottom-left-radius:.75rem}.md\:rounded-tl-2xl{border-top-left-radius:1rem}.md\:rounded-tr-2xl{border-top-right-radius:1rem}.md\:rounded-br-2xl{border-bottom-right-radius:1rem}.md\:rounded-bl-2xl{border-bottom-left-radius:1rem}.md\:rounded-tl-3xl{border-top-left-radius:1.5rem}.md\:rounded-tr-3xl{border-top-right-radius:1.5rem}.md\:rounded-br-3xl{border-bottom-right-radius:1.5rem}.md\:rounded-bl-3xl{border-bottom-left-radius:1.5rem}.md\:rounded-tl-full{border-top-left-radius:9999px}.md\:rounded-tr-full{border-top-right-radius:9999px}.md\:rounded-br-full{border-bottom-right-radius:9999px}.md\:rounded-bl-full{border-bottom-left-radius:9999px}.md\:border-solid{border-style:solid}.md\:border-dashed{border-style:dashed}.md\:border-dotted{border-style:dotted}.md\:border-double{border-style:double}.md\:border-none{border-style:none}.md\:border-0{border-width:0}.md\:border-2{border-width:2px}.md\:border-4{border-width:4px}.md\:border-8{border-width:8px}.md\:border{border-width:1px}.md\:border-t-0{border-top-width:0}.md\:border-r-0{border-right-width:0}.md\:border-b-0{border-bottom-width:0}.md\:border-l-0{border-left-width:0}.md\:border-t-2{border-top-width:2px}.md\:border-r-2{border-right-width:2px}.md\:border-b-2{border-bottom-width:2px}.md\:border-l-2{border-left-width:2px}.md\:border-t-4{border-top-width:4px}.md\:border-r-4{border-right-width:4px}.md\:border-b-4{border-bottom-width:4px}.md\:border-l-4{border-left-width:4px}.md\:border-t-8{border-top-width:8px}.md\:border-r-8{border-right-width:8px}.md\:border-b-8{border-bottom-width:8px}.md\:border-l-8{border-left-width:8px}.md\:border-t{border-top-width:1px}.md\:border-r{border-right-width:1px}.md\:border-b{border-bottom-width:1px}.md\:border-l{border-left-width:1px}.md\:box-border{box-sizing:border-box}.md\:box-content{box-sizing:content-box}.md\:cursor-auto{cursor:auto}.md\:cursor-default{cursor:default}.md\:cursor-pointer{cursor:pointer}.md\:cursor-wait{cursor:wait}.md\:cursor-text{cursor:text}.md\:cursor-move{cursor:move}.md\:cursor-not-allowed{cursor:not-allowed}.md\:block{display:block}.md\:inline-block{display:inline-block}.md\:inline{display:inline}.md\:flex{display:flex}.md\:inline-flex{display:inline-flex}.md\:table{display:table}.md\:table-caption{display:table-caption}.md\:table-cell{display:table-cell}.md\:table-column{display:table-column}.md\:table-column-group{display:table-column-group}.md\:table-footer-group{display:table-footer-group}.md\:table-header-group{display:table-header-group}.md\:table-row-group{display:table-row-group}.md\:table-row{display:table-row}.md\:flow-root{display:flow-root}.md\:grid{display:grid}.md\:inline-grid{display:inline-grid}.md\:contents{display:contents}.md\:hidden{display:none}.md\:flex-row{flex-direction:row}.md\:flex-row-reverse{flex-direction:row-reverse}.md\:flex-col{flex-direction:column}.md\:flex-col-reverse{flex-direction:column-reverse}.md\:flex-wrap{flex-wrap:wrap}.md\:flex-wrap-reverse{flex-wrap:wrap-reverse}.md\:flex-no-wrap{flex-wrap:nowrap}.md\:place-items-auto{place-items:auto}.md\:place-items-start{place-items:start}.md\:place-items-end{place-items:end}.md\:place-items-center{place-items:center}.md\:place-items-stretch{place-items:stretch}.md\:place-content-center{place-content:center}.md\:place-content-start{place-content:start}.md\:place-content-end{place-content:end}.md\:place-content-between{place-content:space-between}.md\:place-content-around{place-content:space-around}.md\:place-content-evenly{place-content:space-evenly}.md\:place-content-stretch{place-content:stretch}.md\:place-self-auto{place-self:auto}.md\:place-self-start{place-self:start}.md\:place-self-end{place-self:end}.md\:place-self-center{place-self:center}.md\:place-self-stretch{place-self:stretch}.md\:items-start{align-items:flex-start}.md\:items-end{align-items:flex-end}.md\:items-center{align-items:center}.md\:items-baseline{align-items:baseline}.md\:items-stretch{align-items:stretch}.md\:content-center{align-content:center}.md\:content-start{align-content:flex-start}.md\:content-end{align-content:flex-end}.md\:content-between{align-content:space-between}.md\:content-around{align-content:space-around}.md\:content-evenly{align-content:space-evenly}.md\:self-auto{align-self:auto}.md\:self-start{align-self:flex-start}.md\:self-end{align-self:flex-end}.md\:self-center{align-self:center}.md\:self-stretch{align-self:stretch}.md\:justify-items-auto{justify-items:auto}.md\:justify-items-start{justify-items:start}.md\:justify-items-end{justify-items:end}.md\:justify-items-center{justify-items:center}.md\:justify-items-stretch{justify-items:stretch}.md\:justify-start{justify-content:flex-start}.md\:justify-end{justify-content:flex-end}.md\:justify-center{justify-content:center}.md\:justify-between{justify-content:space-between}.md\:justify-around{justify-content:space-around}.md\:justify-evenly{justify-content:space-evenly}.md\:justify-self-auto{justify-self:auto}.md\:justify-self-start{justify-self:start}.md\:justify-self-end{justify-self:end}.md\:justify-self-center{justify-self:center}.md\:justify-self-stretch{justify-self:stretch}.md\:flex-1{flex:1 1 0%}.md\:flex-auto{flex:1 1 auto}.md\:flex-initial{flex:0 1 auto}.md\:flex-none{flex:none}.md\:flex-grow-0{flex-grow:0}.md\:flex-grow{flex-grow:1}.md\:flex-shrink-0{flex-shrink:0}.md\:flex-shrink{flex-shrink:1}.md\:order-1{order:1}.md\:order-2{order:2}.md\:order-3{order:3}.md\:order-4{order:4}.md\:order-5{order:5}.md\:order-6{order:6}.md\:order-7{order:7}.md\:order-8{order:8}.md\:order-9{order:9}.md\:order-10{order:10}.md\:order-11{order:11}.md\:order-12{order:12}.md\:order-first{order:-9999}.md\:order-last{order:9999}.md\:order-none{order:0}.md\:float-right{float:right}.md\:float-left{float:left}.md\:float-none{float:none}.md\:clearfix:after{content:"";display:table;clear:both}.md\:clear-left{clear:left}.md\:clear-right{clear:right}.md\:clear-both{clear:both}.md\:clear-none{clear:none}.md\:font-sans{font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.md\:font-serif{font-family:Georgia,Cambria,"Times New Roman",Times,serif}.md\:font-mono{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.md\:font-hairline{font-weight:100}.md\:font-thin{font-weight:200}.md\:font-light{font-weight:300}.md\:font-normal{font-weight:400}.md\:font-medium{font-weight:500}.md\:font-semibold{font-weight:600}.md\:font-bold{font-weight:700}.md\:font-extrabold{font-weight:800}.md\:font-black{font-weight:900}.md\:hover\:font-hairline:hover{font-weight:100}.md\:hover\:font-thin:hover{font-weight:200}.md\:hover\:font-light:hover{font-weight:300}.md\:hover\:font-normal:hover{font-weight:400}.md\:hover\:font-medium:hover{font-weight:500}.md\:hover\:font-semibold:hover{font-weight:600}.md\:hover\:font-bold:hover{font-weight:700}.md\:hover\:font-extrabold:hover{font-weight:800}.md\:hover\:font-black:hover{font-weight:900}.md\:focus\:font-hairline:focus{font-weight:100}.md\:focus\:font-thin:focus{font-weight:200}.md\:focus\:font-light:focus{font-weight:300}.md\:focus\:font-normal:focus{font-weight:400}.md\:focus\:font-medium:focus{font-weight:500}.md\:focus\:font-semibold:focus{font-weight:600}.md\:focus\:font-bold:focus{font-weight:700}.md\:focus\:font-extrabold:focus{font-weight:800}.md\:focus\:font-black:focus{font-weight:900}.md\:h-0{height:0}.md\:h-1{height:.25rem}.md\:h-2{height:.5rem}.md\:h-3{height:.75rem}.md\:h-4{height:1rem}.md\:h-5{height:1.25rem}.md\:h-6{height:1.5rem}.md\:h-8{height:2rem}.md\:h-10{height:2.5rem}.md\:h-12{height:3rem}.md\:h-16{height:4rem}.md\:h-20{height:5rem}.md\:h-24{height:6rem}.md\:h-32{height:8rem}.md\:h-40{height:10rem}.md\:h-48{height:12rem}.md\:h-56{height:14rem}.md\:h-64{height:16rem}.md\:h-auto{height:auto}.md\:h-px{height:1px}.md\:h-full{height:100%}.md\:h-screen{height:100vh}.md\:text-xs{font-size:.75rem}.md\:text-sm{font-size:.875rem}.md\:text-base{font-size:1rem}.md\:text-lg{font-size:1.125rem}.md\:text-xl{font-size:1.25rem}.md\:text-2xl{font-size:1.5rem}.md\:text-3xl{font-size:1.875rem}.md\:text-4xl{font-size:2.25rem}.md\:text-5xl{font-size:3rem}.md\:text-6xl{font-size:4rem}.md\:leading-3{line-height:.75rem}.md\:leading-4{line-height:1rem}.md\:leading-5{line-height:1.25rem}.md\:leading-6{line-height:1.5rem}.md\:leading-7{line-height:1.75rem}.md\:leading-8{line-height:2rem}.md\:leading-9{line-height:2.25rem}.md\:leading-10{line-height:2.5rem}.md\:leading-none{line-height:1}.md\:leading-tight{line-height:1.25}.md\:leading-snug{line-height:1.375}.md\:leading-normal{line-height:1.5}.md\:leading-relaxed{line-height:1.625}.md\:leading-loose{line-height:2}.md\:list-inside{list-style-position:inside}.md\:list-outside{list-style-position:outside}.md\:list-none{list-style-type:none}.md\:list-disc{list-style-type:disc}.md\:list-decimal{list-style-type:decimal}.md\:m-0{margin:0}.md\:m-1{margin:.25rem}.md\:m-2{margin:.5rem}.md\:m-3{margin:.75rem}.md\:m-4{margin:1rem}.md\:m-5{margin:1.25rem}.md\:m-6{margin:1.5rem}.md\:m-8{margin:2rem}.md\:m-10{margin:2.5rem}.md\:m-12{margin:3rem}.md\:m-16{margin:4rem}.md\:m-20{margin:5rem}.md\:m-24{margin:6rem}.md\:m-32{margin:8rem}.md\:m-40{margin:10rem}.md\:m-48{margin:12rem}.md\:m-56{margin:14rem}.md\:m-64{margin:16rem}.md\:m-auto{margin:auto}.md\:m-px{margin:1px}.md\:-m-1{margin:-.25rem}.md\:-m-2{margin:-.5rem}.md\:-m-3{margin:-.75rem}.md\:-m-4{margin:-1rem}.md\:-m-5{margin:-1.25rem}.md\:-m-6{margin:-1.5rem}.md\:-m-8{margin:-2rem}.md\:-m-10{margin:-2.5rem}.md\:-m-12{margin:-3rem}.md\:-m-16{margin:-4rem}.md\:-m-20{margin:-5rem}.md\:-m-24{margin:-6rem}.md\:-m-32{margin:-8rem}.md\:-m-40{margin:-10rem}.md\:-m-48{margin:-12rem}.md\:-m-56{margin:-14rem}.md\:-m-64{margin:-16rem}.md\:-m-px{margin:-1px}.md\:my-0{margin-top:0;margin-bottom:0}.md\:mx-0{margin-left:0;margin-right:0}.md\:my-1{margin-top:.25rem;margin-bottom:.25rem}.md\:mx-1{margin-left:.25rem;margin-right:.25rem}.md\:my-2{margin-top:.5rem;margin-bottom:.5rem}.md\:mx-2{margin-left:.5rem;margin-right:.5rem}.md\:my-3{margin-top:.75rem;margin-bottom:.75rem}.md\:mx-3{margin-left:.75rem;margin-right:.75rem}.md\:my-4{margin-top:1rem;margin-bottom:1rem}.md\:mx-4{margin-left:1rem;margin-right:1rem}.md\:my-5{margin-top:1.25rem;margin-bottom:1.25rem}.md\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.md\:my-6{margin-top:1.5rem;margin-bottom:1.5rem}.md\:mx-6{margin-left:1.5rem;margin-right:1.5rem}.md\:my-8{margin-top:2rem;margin-bottom:2rem}.md\:mx-8{margin-left:2rem;margin-right:2rem}.md\:my-10{margin-top:2.5rem;margin-bottom:2.5rem}.md\:mx-10{margin-left:2.5rem;margin-right:2.5rem}.md\:my-12{margin-top:3rem;margin-bottom:3rem}.md\:mx-12{margin-left:3rem;margin-right:3rem}.md\:my-16{margin-top:4rem;margin-bottom:4rem}.md\:mx-16{margin-left:4rem;margin-right:4rem}.md\:my-20{margin-top:5rem;margin-bottom:5rem}.md\:mx-20{margin-left:5rem;margin-right:5rem}.md\:my-24{margin-top:6rem;margin-bottom:6rem}.md\:mx-24{margin-left:6rem;margin-right:6rem}.md\:my-32{margin-top:8rem;margin-bottom:8rem}.md\:mx-32{margin-left:8rem;margin-right:8rem}.md\:my-40{margin-top:10rem;margin-bottom:10rem}.md\:mx-40{margin-left:10rem;margin-right:10rem}.md\:my-48{margin-top:12rem;margin-bottom:12rem}.md\:mx-48{margin-left:12rem;margin-right:12rem}.md\:my-56{margin-top:14rem;margin-bottom:14rem}.md\:mx-56{margin-left:14rem;margin-right:14rem}.md\:my-64{margin-top:16rem;margin-bottom:16rem}.md\:mx-64{margin-left:16rem;margin-right:16rem}.md\:my-auto{margin-top:auto;margin-bottom:auto}.md\:mx-auto{margin-left:auto;margin-right:auto}.md\:my-px{margin-top:1px;margin-bottom:1px}.md\:mx-px{margin-left:1px;margin-right:1px}.md\:-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.md\:-mx-1{margin-left:-.25rem;margin-right:-.25rem}.md\:-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.md\:-mx-2{margin-left:-.5rem;margin-right:-.5rem}.md\:-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.md\:-mx-3{margin-left:-.75rem;margin-right:-.75rem}.md\:-my-4{margin-top:-1rem;margin-bottom:-1rem}.md\:-mx-4{margin-left:-1rem;margin-right:-1rem}.md\:-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.md\:-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.md\:-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.md\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.md\:-my-8{margin-top:-2rem;margin-bottom:-2rem}.md\:-mx-8{margin-left:-2rem;margin-right:-2rem}.md\:-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.md\:-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.md\:-my-12{margin-top:-3rem;margin-bottom:-3rem}.md\:-mx-12{margin-left:-3rem;margin-right:-3rem}.md\:-my-16{margin-top:-4rem;margin-bottom:-4rem}.md\:-mx-16{margin-left:-4rem;margin-right:-4rem}.md\:-my-20{margin-top:-5rem;margin-bottom:-5rem}.md\:-mx-20{margin-left:-5rem;margin-right:-5rem}.md\:-my-24{margin-top:-6rem;margin-bottom:-6rem}.md\:-mx-24{margin-left:-6rem;margin-right:-6rem}.md\:-my-32{margin-top:-8rem;margin-bottom:-8rem}.md\:-mx-32{margin-left:-8rem;margin-right:-8rem}.md\:-my-40{margin-top:-10rem;margin-bottom:-10rem}.md\:-mx-40{margin-left:-10rem;margin-right:-10rem}.md\:-my-48{margin-top:-12rem;margin-bottom:-12rem}.md\:-mx-48{margin-left:-12rem;margin-right:-12rem}.md\:-my-56{margin-top:-14rem;margin-bottom:-14rem}.md\:-mx-56{margin-left:-14rem;margin-right:-14rem}.md\:-my-64{margin-top:-16rem;margin-bottom:-16rem}.md\:-mx-64{margin-left:-16rem;margin-right:-16rem}.md\:-my-px{margin-top:-1px;margin-bottom:-1px}.md\:-mx-px{margin-left:-1px;margin-right:-1px}.md\:mt-0{margin-top:0}.md\:mr-0{margin-right:0}.md\:mb-0{margin-bottom:0}.md\:ml-0{margin-left:0}.md\:mt-1{margin-top:.25rem}.md\:mr-1{margin-right:.25rem}.md\:mb-1{margin-bottom:.25rem}.md\:ml-1{margin-left:.25rem}.md\:mt-2{margin-top:.5rem}.md\:mr-2{margin-right:.5rem}.md\:mb-2{margin-bottom:.5rem}.md\:ml-2{margin-left:.5rem}.md\:mt-3{margin-top:.75rem}.md\:mr-3{margin-right:.75rem}.md\:mb-3{margin-bottom:.75rem}.md\:ml-3{margin-left:.75rem}.md\:mt-4{margin-top:1rem}.md\:mr-4{margin-right:1rem}.md\:mb-4{margin-bottom:1rem}.md\:ml-4{margin-left:1rem}.md\:mt-5{margin-top:1.25rem}.md\:mr-5{margin-right:1.25rem}.md\:mb-5{margin-bottom:1.25rem}.md\:ml-5{margin-left:1.25rem}.md\:mt-6{margin-top:1.5rem}.md\:mr-6{margin-right:1.5rem}.md\:mb-6{margin-bottom:1.5rem}.md\:ml-6{margin-left:1.5rem}.md\:mt-8{margin-top:2rem}.md\:mr-8{margin-right:2rem}.md\:mb-8{margin-bottom:2rem}.md\:ml-8{margin-left:2rem}.md\:mt-10{margin-top:2.5rem}.md\:mr-10{margin-right:2.5rem}.md\:mb-10{margin-bottom:2.5rem}.md\:ml-10{margin-left:2.5rem}.md\:mt-12{margin-top:3rem}.md\:mr-12{margin-right:3rem}.md\:mb-12{margin-bottom:3rem}.md\:ml-12{margin-left:3rem}.md\:mt-16{margin-top:4rem}.md\:mr-16{margin-right:4rem}.md\:mb-16{margin-bottom:4rem}.md\:ml-16{margin-left:4rem}.md\:mt-20{margin-top:5rem}.md\:mr-20{margin-right:5rem}.md\:mb-20{margin-bottom:5rem}.md\:ml-20{margin-left:5rem}.md\:mt-24{margin-top:6rem}.md\:mr-24{margin-right:6rem}.md\:mb-24{margin-bottom:6rem}.md\:ml-24{margin-left:6rem}.md\:mt-32{margin-top:8rem}.md\:mr-32{margin-right:8rem}.md\:mb-32{margin-bottom:8rem}.md\:ml-32{margin-left:8rem}.md\:mt-40{margin-top:10rem}.md\:mr-40{margin-right:10rem}.md\:mb-40{margin-bottom:10rem}.md\:ml-40{margin-left:10rem}.md\:mt-48{margin-top:12rem}.md\:mr-48{margin-right:12rem}.md\:mb-48{margin-bottom:12rem}.md\:ml-48{margin-left:12rem}.md\:mt-56{margin-top:14rem}.md\:mr-56{margin-right:14rem}.md\:mb-56{margin-bottom:14rem}.md\:ml-56{margin-left:14rem}.md\:mt-64{margin-top:16rem}.md\:mr-64{margin-right:16rem}.md\:mb-64{margin-bottom:16rem}.md\:ml-64{margin-left:16rem}.md\:mt-auto{margin-top:auto}.md\:mr-auto{margin-right:auto}.md\:mb-auto{margin-bottom:auto}.md\:ml-auto{margin-left:auto}.md\:mt-px{margin-top:1px}.md\:mr-px{margin-right:1px}.md\:mb-px{margin-bottom:1px}.md\:ml-px{margin-left:1px}.md\:-mt-1{margin-top:-.25rem}.md\:-mr-1{margin-right:-.25rem}.md\:-mb-1{margin-bottom:-.25rem}.md\:-ml-1{margin-left:-.25rem}.md\:-mt-2{margin-top:-.5rem}.md\:-mr-2{margin-right:-.5rem}.md\:-mb-2{margin-bottom:-.5rem}.md\:-ml-2{margin-left:-.5rem}.md\:-mt-3{margin-top:-.75rem}.md\:-mr-3{margin-right:-.75rem}.md\:-mb-3{margin-bottom:-.75rem}.md\:-ml-3{margin-left:-.75rem}.md\:-mt-4{margin-top:-1rem}.md\:-mr-4{margin-right:-1rem}.md\:-mb-4{margin-bottom:-1rem}.md\:-ml-4{margin-left:-1rem}.md\:-mt-5{margin-top:-1.25rem}.md\:-mr-5{margin-right:-1.25rem}.md\:-mb-5{margin-bottom:-1.25rem}.md\:-ml-5{margin-left:-1.25rem}.md\:-mt-6{margin-top:-1.5rem}.md\:-mr-6{margin-right:-1.5rem}.md\:-mb-6{margin-bottom:-1.5rem}.md\:-ml-6{margin-left:-1.5rem}.md\:-mt-8{margin-top:-2rem}.md\:-mr-8{margin-right:-2rem}.md\:-mb-8{margin-bottom:-2rem}.md\:-ml-8{margin-left:-2rem}.md\:-mt-10{margin-top:-2.5rem}.md\:-mr-10{margin-right:-2.5rem}.md\:-mb-10{margin-bottom:-2.5rem}.md\:-ml-10{margin-left:-2.5rem}.md\:-mt-12{margin-top:-3rem}.md\:-mr-12{margin-right:-3rem}.md\:-mb-12{margin-bottom:-3rem}.md\:-ml-12{margin-left:-3rem}.md\:-mt-16{margin-top:-4rem}.md\:-mr-16{margin-right:-4rem}.md\:-mb-16{margin-bottom:-4rem}.md\:-ml-16{margin-left:-4rem}.md\:-mt-20{margin-top:-5rem}.md\:-mr-20{margin-right:-5rem}.md\:-mb-20{margin-bottom:-5rem}.md\:-ml-20{margin-left:-5rem}.md\:-mt-24{margin-top:-6rem}.md\:-mr-24{margin-right:-6rem}.md\:-mb-24{margin-bottom:-6rem}.md\:-ml-24{margin-left:-6rem}.md\:-mt-32{margin-top:-8rem}.md\:-mr-32{margin-right:-8rem}.md\:-mb-32{margin-bottom:-8rem}.md\:-ml-32{margin-left:-8rem}.md\:-mt-40{margin-top:-10rem}.md\:-mr-40{margin-right:-10rem}.md\:-mb-40{margin-bottom:-10rem}.md\:-ml-40{margin-left:-10rem}.md\:-mt-48{margin-top:-12rem}.md\:-mr-48{margin-right:-12rem}.md\:-mb-48{margin-bottom:-12rem}.md\:-ml-48{margin-left:-12rem}.md\:-mt-56{margin-top:-14rem}.md\:-mr-56{margin-right:-14rem}.md\:-mb-56{margin-bottom:-14rem}.md\:-ml-56{margin-left:-14rem}.md\:-mt-64{margin-top:-16rem}.md\:-mr-64{margin-right:-16rem}.md\:-mb-64{margin-bottom:-16rem}.md\:-ml-64{margin-left:-16rem}.md\:-mt-px{margin-top:-1px}.md\:-mr-px{margin-right:-1px}.md\:-mb-px{margin-bottom:-1px}.md\:-ml-px{margin-left:-1px}.md\:max-h-full{max-height:100%}.md\:max-h-screen{max-height:100vh}.md\:max-w-none{max-width:none}.md\:max-w-xs{max-width:20rem}.md\:max-w-sm{max-width:24rem}.md\:max-w-md{max-width:28rem}.md\:max-w-lg{max-width:32rem}.md\:max-w-xl{max-width:36rem}.md\:max-w-2xl{max-width:42rem}.md\:max-w-3xl{max-width:48rem}.md\:max-w-4xl{max-width:56rem}.md\:max-w-5xl{max-width:64rem}.md\:max-w-6xl{max-width:72rem}.md\:max-w-full{max-width:100%}.md\:max-w-screen-sm{max-width:640px}.md\:max-w-screen-md{max-width:768px}.md\:max-w-screen-lg{max-width:1024px}.md\:max-w-screen-xl{max-width:1280px}.md\:min-h-0{min-height:0}.md\:min-h-full{min-height:100%}.md\:min-h-screen{min-height:100vh}.md\:min-w-0{min-width:0}.md\:min-w-full{min-width:100%}.md\:object-contain{object-fit:contain}.md\:object-cover{object-fit:cover}.md\:object-fill{object-fit:fill}.md\:object-none{object-fit:none}.md\:object-scale-down{object-fit:scale-down}.md\:object-bottom{object-position:bottom}.md\:object-center{object-position:center}.md\:object-left{object-position:left}.md\:object-left-bottom{object-position:left bottom}.md\:object-left-top{object-position:left top}.md\:object-right{object-position:right}.md\:object-right-bottom{object-position:right bottom}.md\:object-right-top{object-position:right top}.md\:object-top{object-position:top}.md\:opacity-0{opacity:0}.md\:opacity-25{opacity:.25}.md\:opacity-50{opacity:.5}.md\:opacity-75{opacity:.75}.md\:opacity-100{opacity:1}.md\:hover\:opacity-0:hover{opacity:0}.md\:hover\:opacity-25:hover{opacity:.25}.md\:hover\:opacity-50:hover{opacity:.5}.md\:hover\:opacity-75:hover{opacity:.75}.md\:hover\:opacity-100:hover{opacity:1}.md\:focus\:opacity-0:focus{opacity:0}.md\:focus\:opacity-25:focus{opacity:.25}.md\:focus\:opacity-50:focus{opacity:.5}.md\:focus\:opacity-75:focus{opacity:.75}.md\:focus\:opacity-100:focus{opacity:1}.md\:outline-none{outline:2px solid transparent;outline-offset:2px}.md\:outline-white{outline:2px dotted #fff;outline-offset:2px}.md\:outline-black{outline:2px dotted #000;outline-offset:2px}.md\:focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.md\:focus\:outline-white:focus{outline:2px dotted #fff;outline-offset:2px}.md\:focus\:outline-black:focus{outline:2px dotted #000;outline-offset:2px}.md\:overflow-auto{overflow:auto}.md\:overflow-hidden{overflow:hidden}.md\:overflow-visible{overflow:visible}.md\:overflow-scroll{overflow:scroll}.md\:overflow-x-auto{overflow-x:auto}.md\:overflow-y-auto{overflow-y:auto}.md\:overflow-x-hidden{overflow-x:hidden}.md\:overflow-y-hidden{overflow-y:hidden}.md\:overflow-x-visible{overflow-x:visible}.md\:overflow-y-visible{overflow-y:visible}.md\:overflow-x-scroll{overflow-x:scroll}.md\:overflow-y-scroll{overflow-y:scroll}.md\:scrolling-touch{-webkit-overflow-scrolling:touch}.md\:scrolling-auto{-webkit-overflow-scrolling:auto}.md\:overscroll-auto{-ms-scroll-chaining:chained;overscroll-behavior:auto}.md\:overscroll-contain{-ms-scroll-chaining:none;overscroll-behavior:contain}.md\:overscroll-none{-ms-scroll-chaining:none;overscroll-behavior:none}.md\:overscroll-y-auto{overscroll-behavior-y:auto}.md\:overscroll-y-contain{overscroll-behavior-y:contain}.md\:overscroll-y-none{overscroll-behavior-y:none}.md\:overscroll-x-auto{overscroll-behavior-x:auto}.md\:overscroll-x-contain{overscroll-behavior-x:contain}.md\:overscroll-x-none{overscroll-behavior-x:none}.md\:p-0{padding:0}.md\:p-1{padding:.25rem}.md\:p-2{padding:.5rem}.md\:p-3{padding:.75rem}.md\:p-4{padding:1rem}.md\:p-5{padding:1.25rem}.md\:p-6{padding:1.5rem}.md\:p-8{padding:2rem}.md\:p-10{padding:2.5rem}.md\:p-12{padding:3rem}.md\:p-16{padding:4rem}.md\:p-20{padding:5rem}.md\:p-24{padding:6rem}.md\:p-32{padding:8rem}.md\:p-40{padding:10rem}.md\:p-48{padding:12rem}.md\:p-56{padding:14rem}.md\:p-64{padding:16rem}.md\:p-px{padding:1px}.md\:py-0{padding-top:0;padding-bottom:0}.md\:px-0{padding-left:0;padding-right:0}.md\:py-1{padding-top:.25rem;padding-bottom:.25rem}.md\:px-1{padding-left:.25rem;padding-right:.25rem}.md\:py-2{padding-top:.5rem;padding-bottom:.5rem}.md\:px-2{padding-left:.5rem;padding-right:.5rem}.md\:py-3{padding-top:.75rem;padding-bottom:.75rem}.md\:px-3{padding-left:.75rem;padding-right:.75rem}.md\:py-4{padding-top:1rem;padding-bottom:1rem}.md\:px-4{padding-left:1rem;padding-right:1rem}.md\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.md\:px-5{padding-left:1.25rem;padding-right:1.25rem}.md\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:py-8{padding-top:2rem;padding-bottom:2rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:py-10{padding-top:2.5rem;padding-bottom:2.5rem}.md\:px-10{padding-left:2.5rem;padding-right:2.5rem}.md\:py-12{padding-top:3rem;padding-bottom:3rem}.md\:px-12{padding-left:3rem;padding-right:3rem}.md\:py-16{padding-top:4rem;padding-bottom:4rem}.md\:px-16{padding-left:4rem;padding-right:4rem}.md\:py-20{padding-top:5rem;padding-bottom:5rem}.md\:px-20{padding-left:5rem;padding-right:5rem}.md\:py-24{padding-top:6rem;padding-bottom:6rem}.md\:px-24{padding-left:6rem;padding-right:6rem}.md\:py-32{padding-top:8rem;padding-bottom:8rem}.md\:px-32{padding-left:8rem;padding-right:8rem}.md\:py-40{padding-top:10rem;padding-bottom:10rem}.md\:px-40{padding-left:10rem;padding-right:10rem}.md\:py-48{padding-top:12rem;padding-bottom:12rem}.md\:px-48{padding-left:12rem;padding-right:12rem}.md\:py-56{padding-top:14rem;padding-bottom:14rem}.md\:px-56{padding-left:14rem;padding-right:14rem}.md\:py-64{padding-top:16rem;padding-bottom:16rem}.md\:px-64{padding-left:16rem;padding-right:16rem}.md\:py-px{padding-top:1px;padding-bottom:1px}.md\:px-px{padding-left:1px;padding-right:1px}.md\:pt-0{padding-top:0}.md\:pr-0{padding-right:0}.md\:pb-0{padding-bottom:0}.md\:pl-0{padding-left:0}.md\:pt-1{padding-top:.25rem}.md\:pr-1{padding-right:.25rem}.md\:pb-1{padding-bottom:.25rem}.md\:pl-1{padding-left:.25rem}.md\:pt-2{padding-top:.5rem}.md\:pr-2{padding-right:.5rem}.md\:pb-2{padding-bottom:.5rem}.md\:pl-2{padding-left:.5rem}.md\:pt-3{padding-top:.75rem}.md\:pr-3{padding-right:.75rem}.md\:pb-3{padding-bottom:.75rem}.md\:pl-3{padding-left:.75rem}.md\:pt-4{padding-top:1rem}.md\:pr-4{padding-right:1rem}.md\:pb-4{padding-bottom:1rem}.md\:pl-4{padding-left:1rem}.md\:pt-5{padding-top:1.25rem}.md\:pr-5{padding-right:1.25rem}.md\:pb-5{padding-bottom:1.25rem}.md\:pl-5{padding-left:1.25rem}.md\:pt-6{padding-top:1.5rem}.md\:pr-6{padding-right:1.5rem}.md\:pb-6{padding-bottom:1.5rem}.md\:pl-6{padding-left:1.5rem}.md\:pt-8{padding-top:2rem}.md\:pr-8{padding-right:2rem}.md\:pb-8{padding-bottom:2rem}.md\:pl-8{padding-left:2rem}.md\:pt-10{padding-top:2.5rem}.md\:pr-10{padding-right:2.5rem}.md\:pb-10{padding-bottom:2.5rem}.md\:pl-10{padding-left:2.5rem}.md\:pt-12{padding-top:3rem}.md\:pr-12{padding-right:3rem}.md\:pb-12{padding-bottom:3rem}.md\:pl-12{padding-left:3rem}.md\:pt-16{padding-top:4rem}.md\:pr-16{padding-right:4rem}.md\:pb-16{padding-bottom:4rem}.md\:pl-16{padding-left:4rem}.md\:pt-20{padding-top:5rem}.md\:pr-20{padding-right:5rem}.md\:pb-20{padding-bottom:5rem}.md\:pl-20{padding-left:5rem}.md\:pt-24{padding-top:6rem}.md\:pr-24{padding-right:6rem}.md\:pb-24{padding-bottom:6rem}.md\:pl-24{padding-left:6rem}.md\:pt-32{padding-top:8rem}.md\:pr-32{padding-right:8rem}.md\:pb-32{padding-bottom:8rem}.md\:pl-32{padding-left:8rem}.md\:pt-40{padding-top:10rem}.md\:pr-40{padding-right:10rem}.md\:pb-40{padding-bottom:10rem}.md\:pl-40{padding-left:10rem}.md\:pt-48{padding-top:12rem}.md\:pr-48{padding-right:12rem}.md\:pb-48{padding-bottom:12rem}.md\:pl-48{padding-left:12rem}.md\:pt-56{padding-top:14rem}.md\:pr-56{padding-right:14rem}.md\:pb-56{padding-bottom:14rem}.md\:pl-56{padding-left:14rem}.md\:pt-64{padding-top:16rem}.md\:pr-64{padding-right:16rem}.md\:pb-64{padding-bottom:16rem}.md\:pl-64{padding-left:16rem}.md\:pt-px{padding-top:1px}.md\:pr-px{padding-right:1px}.md\:pb-px{padding-bottom:1px}.md\:pl-px{padding-left:1px}.md\:placeholder-transparent:-ms-input-placeholder{color:transparent}.md\:placeholder-transparent::-ms-input-placeholder{color:transparent}.md\:placeholder-transparent::placeholder{color:transparent}.md\:placeholder-current:-ms-input-placeholder{color:currentColor}.md\:placeholder-current::-ms-input-placeholder{color:currentColor}.md\:placeholder-current::placeholder{color:currentColor}.md\:placeholder-black:-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.md\:placeholder-black::-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.md\:placeholder-black::placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.md\:placeholder-white:-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.md\:placeholder-white::-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.md\:placeholder-white::placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.md\:placeholder-gray-100:-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.md\:placeholder-gray-100::-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.md\:placeholder-gray-100::placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.md\:placeholder-gray-200:-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.md\:placeholder-gray-200::-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.md\:placeholder-gray-200::placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.md\:placeholder-gray-300:-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.md\:placeholder-gray-300::-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.md\:placeholder-gray-300::placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.md\:placeholder-gray-400:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.md\:placeholder-gray-400::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.md\:placeholder-gray-400::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.md\:placeholder-gray-500:-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.md\:placeholder-gray-500::-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.md\:placeholder-gray-500::placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.md\:placeholder-gray-600:-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.md\:placeholder-gray-600::-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.md\:placeholder-gray-600::placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.md\:placeholder-gray-700:-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.md\:placeholder-gray-700::-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.md\:placeholder-gray-700::placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.md\:placeholder-gray-800:-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.md\:placeholder-gray-800::-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.md\:placeholder-gray-800::placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.md\:placeholder-gray-900:-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.md\:placeholder-gray-900::-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.md\:placeholder-gray-900::placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.md\:placeholder-red-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.md\:placeholder-red-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.md\:placeholder-red-100::placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.md\:placeholder-red-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.md\:placeholder-red-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.md\:placeholder-red-200::placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.md\:placeholder-red-300:-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.md\:placeholder-red-300::-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.md\:placeholder-red-300::placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.md\:placeholder-red-400:-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.md\:placeholder-red-400::-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.md\:placeholder-red-400::placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.md\:placeholder-red-500:-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.md\:placeholder-red-500::-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.md\:placeholder-red-500::placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.md\:placeholder-red-600:-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.md\:placeholder-red-600::-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.md\:placeholder-red-600::placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.md\:placeholder-red-700:-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.md\:placeholder-red-700::-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.md\:placeholder-red-700::placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.md\:placeholder-red-800:-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.md\:placeholder-red-800::-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.md\:placeholder-red-800::placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.md\:placeholder-red-900:-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.md\:placeholder-red-900::-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.md\:placeholder-red-900::placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.md\:placeholder-orange-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.md\:placeholder-orange-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.md\:placeholder-orange-100::placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.md\:placeholder-orange-200:-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.md\:placeholder-orange-200::-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.md\:placeholder-orange-200::placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.md\:placeholder-orange-300:-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.md\:placeholder-orange-300::-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.md\:placeholder-orange-300::placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.md\:placeholder-orange-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.md\:placeholder-orange-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.md\:placeholder-orange-400::placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.md\:placeholder-orange-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.md\:placeholder-orange-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.md\:placeholder-orange-500::placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.md\:placeholder-orange-600:-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.md\:placeholder-orange-600::-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.md\:placeholder-orange-600::placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.md\:placeholder-orange-700:-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.md\:placeholder-orange-700::-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.md\:placeholder-orange-700::placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.md\:placeholder-orange-800:-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.md\:placeholder-orange-800::-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.md\:placeholder-orange-800::placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.md\:placeholder-orange-900:-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.md\:placeholder-orange-900::-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.md\:placeholder-orange-900::placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.md\:placeholder-yellow-100:-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.md\:placeholder-yellow-100::-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.md\:placeholder-yellow-100::placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.md\:placeholder-yellow-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.md\:placeholder-yellow-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.md\:placeholder-yellow-200::placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.md\:placeholder-yellow-300:-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.md\:placeholder-yellow-300::-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.md\:placeholder-yellow-300::placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.md\:placeholder-yellow-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.md\:placeholder-yellow-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.md\:placeholder-yellow-400::placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.md\:placeholder-yellow-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.md\:placeholder-yellow-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.md\:placeholder-yellow-500::placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.md\:placeholder-yellow-600:-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.md\:placeholder-yellow-600::-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.md\:placeholder-yellow-600::placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.md\:placeholder-yellow-700:-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.md\:placeholder-yellow-700::-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.md\:placeholder-yellow-700::placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.md\:placeholder-yellow-800:-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.md\:placeholder-yellow-800::-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.md\:placeholder-yellow-800::placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.md\:placeholder-yellow-900:-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.md\:placeholder-yellow-900::-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.md\:placeholder-yellow-900::placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.md\:placeholder-green-100:-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.md\:placeholder-green-100::-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.md\:placeholder-green-100::placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.md\:placeholder-green-200:-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.md\:placeholder-green-200::-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.md\:placeholder-green-200::placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.md\:placeholder-green-300:-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.md\:placeholder-green-300::-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.md\:placeholder-green-300::placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.md\:placeholder-green-400:-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.md\:placeholder-green-400::-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.md\:placeholder-green-400::placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.md\:placeholder-green-500:-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.md\:placeholder-green-500::-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.md\:placeholder-green-500::placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.md\:placeholder-green-600:-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.md\:placeholder-green-600::-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.md\:placeholder-green-600::placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.md\:placeholder-green-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.md\:placeholder-green-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.md\:placeholder-green-700::placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.md\:placeholder-green-800:-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.md\:placeholder-green-800::-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.md\:placeholder-green-800::placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.md\:placeholder-green-900:-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.md\:placeholder-green-900::-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.md\:placeholder-green-900::placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.md\:placeholder-teal-100:-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.md\:placeholder-teal-100::-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.md\:placeholder-teal-100::placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.md\:placeholder-teal-200:-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.md\:placeholder-teal-200::-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.md\:placeholder-teal-200::placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.md\:placeholder-teal-300:-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.md\:placeholder-teal-300::-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.md\:placeholder-teal-300::placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.md\:placeholder-teal-400:-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.md\:placeholder-teal-400::-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.md\:placeholder-teal-400::placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.md\:placeholder-teal-500:-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.md\:placeholder-teal-500::-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.md\:placeholder-teal-500::placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.md\:placeholder-teal-600:-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.md\:placeholder-teal-600::-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.md\:placeholder-teal-600::placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.md\:placeholder-teal-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.md\:placeholder-teal-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.md\:placeholder-teal-700::placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.md\:placeholder-teal-800:-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.md\:placeholder-teal-800::-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.md\:placeholder-teal-800::placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.md\:placeholder-teal-900:-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.md\:placeholder-teal-900::-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.md\:placeholder-teal-900::placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.md\:placeholder-blue-100:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.md\:placeholder-blue-100::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.md\:placeholder-blue-100::placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.md\:placeholder-blue-200:-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.md\:placeholder-blue-200::-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.md\:placeholder-blue-200::placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.md\:placeholder-blue-300:-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.md\:placeholder-blue-300::-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.md\:placeholder-blue-300::placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.md\:placeholder-blue-400:-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.md\:placeholder-blue-400::-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.md\:placeholder-blue-400::placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.md\:placeholder-blue-500:-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.md\:placeholder-blue-500::-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.md\:placeholder-blue-500::placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.md\:placeholder-blue-600:-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.md\:placeholder-blue-600::-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.md\:placeholder-blue-600::placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.md\:placeholder-blue-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.md\:placeholder-blue-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.md\:placeholder-blue-700::placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.md\:placeholder-blue-800:-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.md\:placeholder-blue-800::-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.md\:placeholder-blue-800::placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.md\:placeholder-blue-900:-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.md\:placeholder-blue-900::-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.md\:placeholder-blue-900::placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.md\:placeholder-indigo-100:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.md\:placeholder-indigo-100::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.md\:placeholder-indigo-100::placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.md\:placeholder-indigo-200:-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.md\:placeholder-indigo-200::-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.md\:placeholder-indigo-200::placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.md\:placeholder-indigo-300:-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.md\:placeholder-indigo-300::-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.md\:placeholder-indigo-300::placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.md\:placeholder-indigo-400:-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.md\:placeholder-indigo-400::-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.md\:placeholder-indigo-400::placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.md\:placeholder-indigo-500:-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.md\:placeholder-indigo-500::-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.md\:placeholder-indigo-500::placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.md\:placeholder-indigo-600:-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.md\:placeholder-indigo-600::-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.md\:placeholder-indigo-600::placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.md\:placeholder-indigo-700:-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.md\:placeholder-indigo-700::-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.md\:placeholder-indigo-700::placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.md\:placeholder-indigo-800:-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.md\:placeholder-indigo-800::-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.md\:placeholder-indigo-800::placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.md\:placeholder-indigo-900:-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.md\:placeholder-indigo-900::-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.md\:placeholder-indigo-900::placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.md\:placeholder-purple-100:-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.md\:placeholder-purple-100::-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.md\:placeholder-purple-100::placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.md\:placeholder-purple-200:-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.md\:placeholder-purple-200::-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.md\:placeholder-purple-200::placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.md\:placeholder-purple-300:-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.md\:placeholder-purple-300::-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.md\:placeholder-purple-300::placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.md\:placeholder-purple-400:-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.md\:placeholder-purple-400::-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.md\:placeholder-purple-400::placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.md\:placeholder-purple-500:-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.md\:placeholder-purple-500::-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.md\:placeholder-purple-500::placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.md\:placeholder-purple-600:-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.md\:placeholder-purple-600::-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.md\:placeholder-purple-600::placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.md\:placeholder-purple-700:-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.md\:placeholder-purple-700::-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.md\:placeholder-purple-700::placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.md\:placeholder-purple-800:-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.md\:placeholder-purple-800::-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.md\:placeholder-purple-800::placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.md\:placeholder-purple-900:-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.md\:placeholder-purple-900::-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.md\:placeholder-purple-900::placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.md\:placeholder-pink-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.md\:placeholder-pink-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.md\:placeholder-pink-100::placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.md\:placeholder-pink-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.md\:placeholder-pink-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.md\:placeholder-pink-200::placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.md\:placeholder-pink-300:-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.md\:placeholder-pink-300::-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.md\:placeholder-pink-300::placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.md\:placeholder-pink-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.md\:placeholder-pink-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.md\:placeholder-pink-400::placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.md\:placeholder-pink-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.md\:placeholder-pink-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.md\:placeholder-pink-500::placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.md\:placeholder-pink-600:-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.md\:placeholder-pink-600::-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.md\:placeholder-pink-600::placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.md\:placeholder-pink-700:-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.md\:placeholder-pink-700::-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.md\:placeholder-pink-700::placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.md\:placeholder-pink-800:-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.md\:placeholder-pink-800::-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.md\:placeholder-pink-800::placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.md\:placeholder-pink-900:-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.md\:placeholder-pink-900::-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.md\:placeholder-pink-900::placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.md\:focus\:placeholder-transparent:focus:-ms-input-placeholder{color:transparent}.md\:focus\:placeholder-transparent:focus::-ms-input-placeholder{color:transparent}.md\:focus\:placeholder-transparent:focus::placeholder{color:transparent}.md\:focus\:placeholder-current:focus:-ms-input-placeholder{color:currentColor}.md\:focus\:placeholder-current:focus::-ms-input-placeholder{color:currentColor}.md\:focus\:placeholder-current:focus::placeholder{color:currentColor}.md\:focus\:placeholder-black:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.md\:focus\:placeholder-black:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.md\:focus\:placeholder-black:focus::placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.md\:focus\:placeholder-white:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.md\:focus\:placeholder-white:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.md\:focus\:placeholder-white:focus::placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-100:focus::placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-200:focus::placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-300:focus::placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-400:focus::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-500:focus::placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-600:focus::placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-700:focus::placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-800:focus::placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.md\:focus\:placeholder-gray-900:focus::placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.md\:focus\:placeholder-red-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.md\:focus\:placeholder-red-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.md\:focus\:placeholder-red-100:focus::placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.md\:focus\:placeholder-red-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.md\:focus\:placeholder-red-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.md\:focus\:placeholder-red-200:focus::placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.md\:focus\:placeholder-red-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.md\:focus\:placeholder-red-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.md\:focus\:placeholder-red-300:focus::placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.md\:focus\:placeholder-red-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.md\:focus\:placeholder-red-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.md\:focus\:placeholder-red-400:focus::placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.md\:focus\:placeholder-red-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.md\:focus\:placeholder-red-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.md\:focus\:placeholder-red-500:focus::placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.md\:focus\:placeholder-red-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.md\:focus\:placeholder-red-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.md\:focus\:placeholder-red-600:focus::placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.md\:focus\:placeholder-red-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.md\:focus\:placeholder-red-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.md\:focus\:placeholder-red-700:focus::placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.md\:focus\:placeholder-red-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.md\:focus\:placeholder-red-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.md\:focus\:placeholder-red-800:focus::placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.md\:focus\:placeholder-red-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.md\:focus\:placeholder-red-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.md\:focus\:placeholder-red-900:focus::placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-100:focus::placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-200:focus::placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-300:focus::placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-400:focus::placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-500:focus::placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-600:focus::placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-700:focus::placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-800:focus::placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.md\:focus\:placeholder-orange-900:focus::placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-100:focus::placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-200:focus::placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-300:focus::placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-400:focus::placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-500:focus::placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-600:focus::placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-700:focus::placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-800:focus::placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.md\:focus\:placeholder-yellow-900:focus::placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.md\:focus\:placeholder-green-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.md\:focus\:placeholder-green-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.md\:focus\:placeholder-green-100:focus::placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.md\:focus\:placeholder-green-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.md\:focus\:placeholder-green-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.md\:focus\:placeholder-green-200:focus::placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.md\:focus\:placeholder-green-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.md\:focus\:placeholder-green-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.md\:focus\:placeholder-green-300:focus::placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.md\:focus\:placeholder-green-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.md\:focus\:placeholder-green-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.md\:focus\:placeholder-green-400:focus::placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.md\:focus\:placeholder-green-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.md\:focus\:placeholder-green-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.md\:focus\:placeholder-green-500:focus::placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.md\:focus\:placeholder-green-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.md\:focus\:placeholder-green-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.md\:focus\:placeholder-green-600:focus::placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.md\:focus\:placeholder-green-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.md\:focus\:placeholder-green-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.md\:focus\:placeholder-green-700:focus::placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.md\:focus\:placeholder-green-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.md\:focus\:placeholder-green-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.md\:focus\:placeholder-green-800:focus::placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.md\:focus\:placeholder-green-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.md\:focus\:placeholder-green-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.md\:focus\:placeholder-green-900:focus::placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-100:focus::placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-200:focus::placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-300:focus::placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-400:focus::placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-500:focus::placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-600:focus::placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-700:focus::placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-800:focus::placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.md\:focus\:placeholder-teal-900:focus::placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-100:focus::placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-200:focus::placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-300:focus::placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-400:focus::placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-500:focus::placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-600:focus::placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-700:focus::placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-800:focus::placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.md\:focus\:placeholder-blue-900:focus::placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-100:focus::placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-200:focus::placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-300:focus::placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-400:focus::placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-500:focus::placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-600:focus::placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-700:focus::placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-800:focus::placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.md\:focus\:placeholder-indigo-900:focus::placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-100:focus::placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-200:focus::placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-300:focus::placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-400:focus::placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-500:focus::placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-600:focus::placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-700:focus::placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-800:focus::placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.md\:focus\:placeholder-purple-900:focus::placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-100:focus::placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-200:focus::placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-300:focus::placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-400:focus::placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-500:focus::placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-600:focus::placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-700:focus::placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-800:focus::placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.md\:focus\:placeholder-pink-900:focus::placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.md\:placeholder-opacity-0:-ms-input-placeholder{--placeholder-opacity:0}.md\:placeholder-opacity-0::-ms-input-placeholder{--placeholder-opacity:0}.md\:placeholder-opacity-0::placeholder{--placeholder-opacity:0}.md\:placeholder-opacity-25:-ms-input-placeholder{--placeholder-opacity:0.25}.md\:placeholder-opacity-25::-ms-input-placeholder{--placeholder-opacity:0.25}.md\:placeholder-opacity-25::placeholder{--placeholder-opacity:0.25}.md\:placeholder-opacity-50:-ms-input-placeholder{--placeholder-opacity:0.5}.md\:placeholder-opacity-50::-ms-input-placeholder{--placeholder-opacity:0.5}.md\:placeholder-opacity-50::placeholder{--placeholder-opacity:0.5}.md\:placeholder-opacity-75:-ms-input-placeholder{--placeholder-opacity:0.75}.md\:placeholder-opacity-75::-ms-input-placeholder{--placeholder-opacity:0.75}.md\:placeholder-opacity-75::placeholder{--placeholder-opacity:0.75}.md\:placeholder-opacity-100:-ms-input-placeholder{--placeholder-opacity:1}.md\:placeholder-opacity-100::-ms-input-placeholder{--placeholder-opacity:1}.md\:placeholder-opacity-100::placeholder{--placeholder-opacity:1}.md\:focus\:placeholder-opacity-0:focus:-ms-input-placeholder{--placeholder-opacity:0}.md\:focus\:placeholder-opacity-0:focus::-ms-input-placeholder{--placeholder-opacity:0}.md\:focus\:placeholder-opacity-0:focus::placeholder{--placeholder-opacity:0}.md\:focus\:placeholder-opacity-25:focus:-ms-input-placeholder{--placeholder-opacity:0.25}.md\:focus\:placeholder-opacity-25:focus::-ms-input-placeholder{--placeholder-opacity:0.25}.md\:focus\:placeholder-opacity-25:focus::placeholder{--placeholder-opacity:0.25}.md\:focus\:placeholder-opacity-50:focus:-ms-input-placeholder{--placeholder-opacity:0.5}.md\:focus\:placeholder-opacity-50:focus::-ms-input-placeholder{--placeholder-opacity:0.5}.md\:focus\:placeholder-opacity-50:focus::placeholder{--placeholder-opacity:0.5}.md\:focus\:placeholder-opacity-75:focus:-ms-input-placeholder{--placeholder-opacity:0.75}.md\:focus\:placeholder-opacity-75:focus::-ms-input-placeholder{--placeholder-opacity:0.75}.md\:focus\:placeholder-opacity-75:focus::placeholder{--placeholder-opacity:0.75}.md\:focus\:placeholder-opacity-100:focus:-ms-input-placeholder{--placeholder-opacity:1}.md\:focus\:placeholder-opacity-100:focus::-ms-input-placeholder{--placeholder-opacity:1}.md\:focus\:placeholder-opacity-100:focus::placeholder{--placeholder-opacity:1}.md\:pointer-events-none{pointer-events:none}.md\:pointer-events-auto{pointer-events:auto}.md\:static{position:static}.md\:fixed{position:fixed}.md\:absolute{position:absolute}.md\:relative{position:relative}.md\:sticky{position:-webkit-sticky;position:sticky}.md\:inset-0{top:0;right:0;bottom:0;left:0}.md\:inset-auto{top:auto;right:auto;bottom:auto;left:auto}.md\:inset-y-0{top:0;bottom:0}.md\:inset-x-0{right:0;left:0}.md\:inset-y-auto{top:auto;bottom:auto}.md\:inset-x-auto{right:auto;left:auto}.md\:top-0{top:0}.md\:right-0{right:0}.md\:bottom-0{bottom:0}.md\:left-0{left:0}.md\:top-auto{top:auto}.md\:right-auto{right:auto}.md\:bottom-auto{bottom:auto}.md\:left-auto{left:auto}.md\:resize-none{resize:none}.md\:resize-y{resize:vertical}.md\:resize-x{resize:horizontal}.md\:resize{resize:both}.md\:shadow-xs{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.md\:shadow-sm{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.md\:shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.md\:shadow-md{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.md\:shadow-lg{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.md\:shadow-xl{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.md\:shadow-2xl{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.md\:shadow-inner{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.md\:shadow-outline{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.md\:shadow-none{box-shadow:none}.md\:hover\:shadow-xs:hover{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.md\:hover\:shadow-sm:hover{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.md\:hover\:shadow:hover{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.md\:hover\:shadow-md:hover{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.md\:hover\:shadow-lg:hover{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.md\:hover\:shadow-xl:hover{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.md\:hover\:shadow-2xl:hover{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.md\:hover\:shadow-inner:hover{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.md\:hover\:shadow-outline:hover{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.md\:hover\:shadow-none:hover{box-shadow:none}.md\:focus\:shadow-xs:focus{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.md\:focus\:shadow-sm:focus{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.md\:focus\:shadow:focus{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.md\:focus\:shadow-md:focus{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.md\:focus\:shadow-lg:focus{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.md\:focus\:shadow-xl:focus{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.md\:focus\:shadow-2xl:focus{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.md\:focus\:shadow-inner:focus{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.md\:focus\:shadow-outline:focus{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.md\:focus\:shadow-none:focus{box-shadow:none}.md\:fill-current{fill:currentColor}.md\:stroke-current{stroke:currentColor}.md\:stroke-0{stroke-width:0}.md\:stroke-1{stroke-width:1}.md\:stroke-2{stroke-width:2}.md\:table-auto{table-layout:auto}.md\:table-fixed{table-layout:fixed}.md\:text-left{text-align:left}.md\:text-center{text-align:center}.md\:text-right{text-align:right}.md\:text-justify{text-align:justify}.md\:text-transparent{color:transparent}.md\:text-current{color:currentColor}.md\:text-black{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.md\:text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.md\:text-gray-100{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.md\:text-gray-200{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.md\:text-gray-300{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.md\:text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.md\:text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.md\:text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.md\:text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.md\:text-gray-800{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.md\:text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.md\:text-red-100{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.md\:text-red-200{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.md\:text-red-300{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.md\:text-red-400{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.md\:text-red-500{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.md\:text-red-600{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.md\:text-red-700{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.md\:text-red-800{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.md\:text-red-900{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.md\:text-orange-100{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.md\:text-orange-200{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.md\:text-orange-300{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.md\:text-orange-400{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.md\:text-orange-500{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.md\:text-orange-600{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.md\:text-orange-700{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.md\:text-orange-800{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.md\:text-orange-900{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.md\:text-yellow-100{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.md\:text-yellow-200{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.md\:text-yellow-300{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.md\:text-yellow-400{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.md\:text-yellow-500{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.md\:text-yellow-600{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.md\:text-yellow-700{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.md\:text-yellow-800{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.md\:text-yellow-900{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.md\:text-green-100{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.md\:text-green-200{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.md\:text-green-300{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.md\:text-green-400{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.md\:text-green-500{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.md\:text-green-600{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.md\:text-green-700{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.md\:text-green-800{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.md\:text-green-900{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.md\:text-teal-100{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.md\:text-teal-200{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.md\:text-teal-300{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.md\:text-teal-400{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.md\:text-teal-500{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.md\:text-teal-600{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.md\:text-teal-700{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.md\:text-teal-800{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.md\:text-teal-900{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.md\:text-blue-100{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.md\:text-blue-200{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.md\:text-blue-300{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.md\:text-blue-400{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.md\:text-blue-500{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.md\:text-blue-600{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.md\:text-blue-700{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.md\:text-blue-800{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.md\:text-blue-900{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.md\:text-indigo-100{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.md\:text-indigo-200{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.md\:text-indigo-300{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.md\:text-indigo-400{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.md\:text-indigo-500{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.md\:text-indigo-600{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.md\:text-indigo-700{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.md\:text-indigo-800{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.md\:text-indigo-900{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.md\:text-purple-100{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.md\:text-purple-200{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.md\:text-purple-300{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.md\:text-purple-400{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.md\:text-purple-500{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.md\:text-purple-600{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.md\:text-purple-700{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.md\:text-purple-800{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.md\:text-purple-900{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.md\:text-pink-100{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.md\:text-pink-200{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.md\:text-pink-300{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.md\:text-pink-400{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.md\:text-pink-500{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.md\:text-pink-600{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.md\:text-pink-700{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.md\:text-pink-800{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.md\:text-pink-900{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.md\:hover\:text-transparent:hover{color:transparent}.md\:hover\:text-current:hover{color:currentColor}.md\:hover\:text-black:hover{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.md\:hover\:text-white:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.md\:hover\:text-gray-100:hover{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.md\:hover\:text-gray-200:hover{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.md\:hover\:text-gray-300:hover{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.md\:hover\:text-gray-400:hover{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.md\:hover\:text-gray-500:hover{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.md\:hover\:text-gray-600:hover{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.md\:hover\:text-gray-700:hover{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.md\:hover\:text-gray-800:hover{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.md\:hover\:text-gray-900:hover{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.md\:hover\:text-red-100:hover{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.md\:hover\:text-red-200:hover{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.md\:hover\:text-red-300:hover{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.md\:hover\:text-red-400:hover{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.md\:hover\:text-red-500:hover{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.md\:hover\:text-red-600:hover{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.md\:hover\:text-red-700:hover{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.md\:hover\:text-red-800:hover{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.md\:hover\:text-red-900:hover{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.md\:hover\:text-orange-100:hover{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.md\:hover\:text-orange-200:hover{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.md\:hover\:text-orange-300:hover{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.md\:hover\:text-orange-400:hover{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.md\:hover\:text-orange-500:hover{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.md\:hover\:text-orange-600:hover{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.md\:hover\:text-orange-700:hover{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.md\:hover\:text-orange-800:hover{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.md\:hover\:text-orange-900:hover{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.md\:hover\:text-yellow-100:hover{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.md\:hover\:text-yellow-200:hover{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.md\:hover\:text-yellow-300:hover{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.md\:hover\:text-yellow-400:hover{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.md\:hover\:text-yellow-500:hover{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.md\:hover\:text-yellow-600:hover{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.md\:hover\:text-yellow-700:hover{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.md\:hover\:text-yellow-800:hover{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.md\:hover\:text-yellow-900:hover{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.md\:hover\:text-green-100:hover{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.md\:hover\:text-green-200:hover{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.md\:hover\:text-green-300:hover{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.md\:hover\:text-green-400:hover{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.md\:hover\:text-green-500:hover{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.md\:hover\:text-green-600:hover{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.md\:hover\:text-green-700:hover{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.md\:hover\:text-green-800:hover{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.md\:hover\:text-green-900:hover{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.md\:hover\:text-teal-100:hover{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.md\:hover\:text-teal-200:hover{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.md\:hover\:text-teal-300:hover{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.md\:hover\:text-teal-400:hover{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.md\:hover\:text-teal-500:hover{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.md\:hover\:text-teal-600:hover{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.md\:hover\:text-teal-700:hover{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.md\:hover\:text-teal-800:hover{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.md\:hover\:text-teal-900:hover{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.md\:hover\:text-blue-100:hover{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.md\:hover\:text-blue-200:hover{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.md\:hover\:text-blue-300:hover{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.md\:hover\:text-blue-400:hover{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.md\:hover\:text-blue-500:hover{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.md\:hover\:text-blue-600:hover{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.md\:hover\:text-blue-700:hover{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.md\:hover\:text-blue-800:hover{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.md\:hover\:text-blue-900:hover{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.md\:hover\:text-indigo-100:hover{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.md\:hover\:text-indigo-200:hover{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.md\:hover\:text-indigo-300:hover{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.md\:hover\:text-indigo-400:hover{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.md\:hover\:text-indigo-500:hover{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.md\:hover\:text-indigo-600:hover{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.md\:hover\:text-indigo-700:hover{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.md\:hover\:text-indigo-800:hover{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.md\:hover\:text-indigo-900:hover{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.md\:hover\:text-purple-100:hover{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.md\:hover\:text-purple-200:hover{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.md\:hover\:text-purple-300:hover{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.md\:hover\:text-purple-400:hover{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.md\:hover\:text-purple-500:hover{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.md\:hover\:text-purple-600:hover{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.md\:hover\:text-purple-700:hover{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.md\:hover\:text-purple-800:hover{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.md\:hover\:text-purple-900:hover{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.md\:hover\:text-pink-100:hover{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.md\:hover\:text-pink-200:hover{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.md\:hover\:text-pink-300:hover{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.md\:hover\:text-pink-400:hover{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.md\:hover\:text-pink-500:hover{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.md\:hover\:text-pink-600:hover{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.md\:hover\:text-pink-700:hover{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.md\:hover\:text-pink-800:hover{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.md\:hover\:text-pink-900:hover{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.md\:focus\:text-transparent:focus{color:transparent}.md\:focus\:text-current:focus{color:currentColor}.md\:focus\:text-black:focus{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.md\:focus\:text-white:focus{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.md\:focus\:text-gray-100:focus{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.md\:focus\:text-gray-200:focus{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.md\:focus\:text-gray-300:focus{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.md\:focus\:text-gray-400:focus{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.md\:focus\:text-gray-500:focus{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.md\:focus\:text-gray-600:focus{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.md\:focus\:text-gray-700:focus{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.md\:focus\:text-gray-800:focus{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.md\:focus\:text-gray-900:focus{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.md\:focus\:text-red-100:focus{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.md\:focus\:text-red-200:focus{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.md\:focus\:text-red-300:focus{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.md\:focus\:text-red-400:focus{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.md\:focus\:text-red-500:focus{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.md\:focus\:text-red-600:focus{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.md\:focus\:text-red-700:focus{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.md\:focus\:text-red-800:focus{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.md\:focus\:text-red-900:focus{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.md\:focus\:text-orange-100:focus{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.md\:focus\:text-orange-200:focus{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.md\:focus\:text-orange-300:focus{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.md\:focus\:text-orange-400:focus{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.md\:focus\:text-orange-500:focus{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.md\:focus\:text-orange-600:focus{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.md\:focus\:text-orange-700:focus{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.md\:focus\:text-orange-800:focus{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.md\:focus\:text-orange-900:focus{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.md\:focus\:text-yellow-100:focus{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.md\:focus\:text-yellow-200:focus{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.md\:focus\:text-yellow-300:focus{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.md\:focus\:text-yellow-400:focus{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.md\:focus\:text-yellow-500:focus{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.md\:focus\:text-yellow-600:focus{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.md\:focus\:text-yellow-700:focus{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.md\:focus\:text-yellow-800:focus{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.md\:focus\:text-yellow-900:focus{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.md\:focus\:text-green-100:focus{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.md\:focus\:text-green-200:focus{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.md\:focus\:text-green-300:focus{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.md\:focus\:text-green-400:focus{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.md\:focus\:text-green-500:focus{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.md\:focus\:text-green-600:focus{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.md\:focus\:text-green-700:focus{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.md\:focus\:text-green-800:focus{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.md\:focus\:text-green-900:focus{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.md\:focus\:text-teal-100:focus{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.md\:focus\:text-teal-200:focus{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.md\:focus\:text-teal-300:focus{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.md\:focus\:text-teal-400:focus{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.md\:focus\:text-teal-500:focus{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.md\:focus\:text-teal-600:focus{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.md\:focus\:text-teal-700:focus{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.md\:focus\:text-teal-800:focus{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.md\:focus\:text-teal-900:focus{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.md\:focus\:text-blue-100:focus{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.md\:focus\:text-blue-200:focus{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.md\:focus\:text-blue-300:focus{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.md\:focus\:text-blue-400:focus{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.md\:focus\:text-blue-500:focus{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.md\:focus\:text-blue-600:focus{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.md\:focus\:text-blue-700:focus{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.md\:focus\:text-blue-800:focus{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.md\:focus\:text-blue-900:focus{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.md\:focus\:text-indigo-100:focus{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.md\:focus\:text-indigo-200:focus{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.md\:focus\:text-indigo-300:focus{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.md\:focus\:text-indigo-400:focus{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.md\:focus\:text-indigo-500:focus{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.md\:focus\:text-indigo-600:focus{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.md\:focus\:text-indigo-700:focus{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.md\:focus\:text-indigo-800:focus{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.md\:focus\:text-indigo-900:focus{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.md\:focus\:text-purple-100:focus{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.md\:focus\:text-purple-200:focus{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.md\:focus\:text-purple-300:focus{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.md\:focus\:text-purple-400:focus{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.md\:focus\:text-purple-500:focus{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.md\:focus\:text-purple-600:focus{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.md\:focus\:text-purple-700:focus{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.md\:focus\:text-purple-800:focus{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.md\:focus\:text-purple-900:focus{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.md\:focus\:text-pink-100:focus{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.md\:focus\:text-pink-200:focus{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.md\:focus\:text-pink-300:focus{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.md\:focus\:text-pink-400:focus{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.md\:focus\:text-pink-500:focus{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.md\:focus\:text-pink-600:focus{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.md\:focus\:text-pink-700:focus{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.md\:focus\:text-pink-800:focus{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.md\:focus\:text-pink-900:focus{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.md\:text-opacity-0{--text-opacity:0}.md\:text-opacity-25{--text-opacity:0.25}.md\:text-opacity-50{--text-opacity:0.5}.md\:text-opacity-75{--text-opacity:0.75}.md\:text-opacity-100{--text-opacity:1}.md\:hover\:text-opacity-0:hover{--text-opacity:0}.md\:hover\:text-opacity-25:hover{--text-opacity:0.25}.md\:hover\:text-opacity-50:hover{--text-opacity:0.5}.md\:hover\:text-opacity-75:hover{--text-opacity:0.75}.md\:hover\:text-opacity-100:hover{--text-opacity:1}.md\:focus\:text-opacity-0:focus{--text-opacity:0}.md\:focus\:text-opacity-25:focus{--text-opacity:0.25}.md\:focus\:text-opacity-50:focus{--text-opacity:0.5}.md\:focus\:text-opacity-75:focus{--text-opacity:0.75}.md\:focus\:text-opacity-100:focus{--text-opacity:1}.md\:italic{font-style:italic}.md\:not-italic{font-style:normal}.md\:uppercase{text-transform:uppercase}.md\:lowercase{text-transform:lowercase}.md\:capitalize{text-transform:capitalize}.md\:normal-case{text-transform:none}.md\:underline{text-decoration:underline}.md\:line-through{text-decoration:line-through}.md\:no-underline{text-decoration:none}.md\:hover\:underline:hover{text-decoration:underline}.md\:hover\:line-through:hover{text-decoration:line-through}.md\:hover\:no-underline:hover{text-decoration:none}.md\:focus\:underline:focus{text-decoration:underline}.md\:focus\:line-through:focus{text-decoration:line-through}.md\:focus\:no-underline:focus{text-decoration:none}.md\:antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.md\:subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.md\:diagonal-fractions,.md\:lining-nums,.md\:oldstyle-nums,.md\:ordinal,.md\:proportional-nums,.md\:slashed-zero,.md\:stacked-fractions,.md\:tabular-nums{--font-variant-numeric-ordinal:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-slashed-zero:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-figure:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-spacing:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-fraction:var(--tailwind-empty, );/*!*//*!*/font-variant-numeric:var(--font-variant-numeric-ordinal) var(--font-variant-numeric-slashed-zero) var(--font-variant-numeric-figure) var(--font-variant-numeric-spacing) var(--font-variant-numeric-fraction)}.md\:normal-nums{font-variant-numeric:normal}.md\:ordinal{--font-variant-numeric-ordinal:ordinal}.md\:slashed-zero{--font-variant-numeric-slashed-zero:slashed-zero}.md\:lining-nums{--font-variant-numeric-figure:lining-nums}.md\:oldstyle-nums{--font-variant-numeric-figure:oldstyle-nums}.md\:proportional-nums{--font-variant-numeric-spacing:proportional-nums}.md\:tabular-nums{--font-variant-numeric-spacing:tabular-nums}.md\:diagonal-fractions{--font-variant-numeric-fraction:diagonal-fractions}.md\:stacked-fractions{--font-variant-numeric-fraction:stacked-fractions}.md\:tracking-tighter{letter-spacing:-.05em}.md\:tracking-tight{letter-spacing:-.025em}.md\:tracking-normal{letter-spacing:0}.md\:tracking-wide{letter-spacing:.025em}.md\:tracking-wider{letter-spacing:.05em}.md\:tracking-widest{letter-spacing:.1em}.md\:select-none{-webkit-user-select:none;-ms-user-select:none;user-select:none}.md\:select-text{-webkit-user-select:text;-ms-user-select:text;user-select:text}.md\:select-all{-webkit-user-select:all;-ms-user-select:all;user-select:all}.md\:select-auto{-webkit-user-select:auto;-ms-user-select:auto;user-select:auto}.md\:align-baseline{vertical-align:baseline}.md\:align-top{vertical-align:top}.md\:align-middle{vertical-align:middle}.md\:align-bottom{vertical-align:bottom}.md\:align-text-top{vertical-align:text-top}.md\:align-text-bottom{vertical-align:text-bottom}.md\:visible{visibility:visible}.md\:invisible{visibility:hidden}.md\:whitespace-normal{white-space:normal}.md\:whitespace-no-wrap{white-space:nowrap}.md\:whitespace-pre{white-space:pre}.md\:whitespace-pre-line{white-space:pre-line}.md\:whitespace-pre-wrap{white-space:pre-wrap}.md\:break-normal{word-wrap:normal;overflow-wrap:normal;word-break:normal}.md\:break-words{word-wrap:break-word;overflow-wrap:break-word}.md\:break-all{word-break:break-all}.md\:truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.md\:w-0{width:0}.md\:w-1{width:.25rem}.md\:w-2{width:.5rem}.md\:w-3{width:.75rem}.md\:w-4{width:1rem}.md\:w-5{width:1.25rem}.md\:w-6{width:1.5rem}.md\:w-8{width:2rem}.md\:w-10{width:2.5rem}.md\:w-12{width:3rem}.md\:w-16{width:4rem}.md\:w-20{width:5rem}.md\:w-24{width:6rem}.md\:w-32{width:8rem}.md\:w-40{width:10rem}.md\:w-48{width:12rem}.md\:w-56{width:14rem}.md\:w-64{width:16rem}.md\:w-auto{width:auto}.md\:w-px{width:1px}.md\:w-1\/2{width:50%}.md\:w-1\/3{width:33.333333%}.md\:w-2\/3{width:66.666667%}.md\:w-1\/4{width:25%}.md\:w-2\/4{width:50%}.md\:w-3\/4{width:75%}.md\:w-1\/5{width:20%}.md\:w-2\/5{width:40%}.md\:w-3\/5{width:60%}.md\:w-4\/5{width:80%}.md\:w-1\/6{width:16.666667%}.md\:w-2\/6{width:33.333333%}.md\:w-3\/6{width:50%}.md\:w-4\/6{width:66.666667%}.md\:w-5\/6{width:83.333333%}.md\:w-1\/12{width:8.333333%}.md\:w-2\/12{width:16.666667%}.md\:w-3\/12{width:25%}.md\:w-4\/12{width:33.333333%}.md\:w-5\/12{width:41.666667%}.md\:w-6\/12{width:50%}.md\:w-7\/12{width:58.333333%}.md\:w-8\/12{width:66.666667%}.md\:w-9\/12{width:75%}.md\:w-10\/12{width:83.333333%}.md\:w-11\/12{width:91.666667%}.md\:w-full{width:100%}.md\:w-screen{width:100vw}.md\:z-0{z-index:0}.md\:z-10{z-index:10}.md\:z-20{z-index:20}.md\:z-30{z-index:30}.md\:z-40{z-index:40}.md\:z-50{z-index:50}.md\:z-auto{z-index:auto}.md\:gap-0{grid-gap:0;gap:0}.md\:gap-1{grid-gap:.25rem;gap:.25rem}.md\:gap-2{grid-gap:.5rem;gap:.5rem}.md\:gap-3{grid-gap:.75rem;gap:.75rem}.md\:gap-4{grid-gap:1rem;gap:1rem}.md\:gap-5{grid-gap:1.25rem;gap:1.25rem}.md\:gap-6{grid-gap:1.5rem;gap:1.5rem}.md\:gap-8{grid-gap:2rem;gap:2rem}.md\:gap-10{grid-gap:2.5rem;gap:2.5rem}.md\:gap-12{grid-gap:3rem;gap:3rem}.md\:gap-16{grid-gap:4rem;gap:4rem}.md\:gap-20{grid-gap:5rem;gap:5rem}.md\:gap-24{grid-gap:6rem;gap:6rem}.md\:gap-32{grid-gap:8rem;gap:8rem}.md\:gap-40{grid-gap:10rem;gap:10rem}.md\:gap-48{grid-gap:12rem;gap:12rem}.md\:gap-56{grid-gap:14rem;gap:14rem}.md\:gap-64{grid-gap:16rem;gap:16rem}.md\:gap-px{grid-gap:1px;gap:1px}.md\:col-gap-0{grid-column-gap:0;column-gap:0}.md\:col-gap-1{grid-column-gap:.25rem;column-gap:.25rem}.md\:col-gap-2{grid-column-gap:.5rem;column-gap:.5rem}.md\:col-gap-3{grid-column-gap:.75rem;column-gap:.75rem}.md\:col-gap-4{grid-column-gap:1rem;column-gap:1rem}.md\:col-gap-5{grid-column-gap:1.25rem;column-gap:1.25rem}.md\:col-gap-6{grid-column-gap:1.5rem;column-gap:1.5rem}.md\:col-gap-8{grid-column-gap:2rem;column-gap:2rem}.md\:col-gap-10{grid-column-gap:2.5rem;column-gap:2.5rem}.md\:col-gap-12{grid-column-gap:3rem;column-gap:3rem}.md\:col-gap-16{grid-column-gap:4rem;column-gap:4rem}.md\:col-gap-20{grid-column-gap:5rem;column-gap:5rem}.md\:col-gap-24{grid-column-gap:6rem;column-gap:6rem}.md\:col-gap-32{grid-column-gap:8rem;column-gap:8rem}.md\:col-gap-40{grid-column-gap:10rem;column-gap:10rem}.md\:col-gap-48{grid-column-gap:12rem;column-gap:12rem}.md\:col-gap-56{grid-column-gap:14rem;column-gap:14rem}.md\:col-gap-64{grid-column-gap:16rem;column-gap:16rem}.md\:col-gap-px{grid-column-gap:1px;column-gap:1px}.md\:gap-x-0{grid-column-gap:0;column-gap:0}.md\:gap-x-1{grid-column-gap:.25rem;column-gap:.25rem}.md\:gap-x-2{grid-column-gap:.5rem;column-gap:.5rem}.md\:gap-x-3{grid-column-gap:.75rem;column-gap:.75rem}.md\:gap-x-4{grid-column-gap:1rem;column-gap:1rem}.md\:gap-x-5{grid-column-gap:1.25rem;column-gap:1.25rem}.md\:gap-x-6{grid-column-gap:1.5rem;column-gap:1.5rem}.md\:gap-x-8{grid-column-gap:2rem;column-gap:2rem}.md\:gap-x-10{grid-column-gap:2.5rem;column-gap:2.5rem}.md\:gap-x-12{grid-column-gap:3rem;column-gap:3rem}.md\:gap-x-16{grid-column-gap:4rem;column-gap:4rem}.md\:gap-x-20{grid-column-gap:5rem;column-gap:5rem}.md\:gap-x-24{grid-column-gap:6rem;column-gap:6rem}.md\:gap-x-32{grid-column-gap:8rem;column-gap:8rem}.md\:gap-x-40{grid-column-gap:10rem;column-gap:10rem}.md\:gap-x-48{grid-column-gap:12rem;column-gap:12rem}.md\:gap-x-56{grid-column-gap:14rem;column-gap:14rem}.md\:gap-x-64{grid-column-gap:16rem;column-gap:16rem}.md\:gap-x-px{grid-column-gap:1px;column-gap:1px}.md\:row-gap-0{grid-row-gap:0;row-gap:0}.md\:row-gap-1{grid-row-gap:.25rem;row-gap:.25rem}.md\:row-gap-2{grid-row-gap:.5rem;row-gap:.5rem}.md\:row-gap-3{grid-row-gap:.75rem;row-gap:.75rem}.md\:row-gap-4{grid-row-gap:1rem;row-gap:1rem}.md\:row-gap-5{grid-row-gap:1.25rem;row-gap:1.25rem}.md\:row-gap-6{grid-row-gap:1.5rem;row-gap:1.5rem}.md\:row-gap-8{grid-row-gap:2rem;row-gap:2rem}.md\:row-gap-10{grid-row-gap:2.5rem;row-gap:2.5rem}.md\:row-gap-12{grid-row-gap:3rem;row-gap:3rem}.md\:row-gap-16{grid-row-gap:4rem;row-gap:4rem}.md\:row-gap-20{grid-row-gap:5rem;row-gap:5rem}.md\:row-gap-24{grid-row-gap:6rem;row-gap:6rem}.md\:row-gap-32{grid-row-gap:8rem;row-gap:8rem}.md\:row-gap-40{grid-row-gap:10rem;row-gap:10rem}.md\:row-gap-48{grid-row-gap:12rem;row-gap:12rem}.md\:row-gap-56{grid-row-gap:14rem;row-gap:14rem}.md\:row-gap-64{grid-row-gap:16rem;row-gap:16rem}.md\:row-gap-px{grid-row-gap:1px;row-gap:1px}.md\:gap-y-0{grid-row-gap:0;row-gap:0}.md\:gap-y-1{grid-row-gap:.25rem;row-gap:.25rem}.md\:gap-y-2{grid-row-gap:.5rem;row-gap:.5rem}.md\:gap-y-3{grid-row-gap:.75rem;row-gap:.75rem}.md\:gap-y-4{grid-row-gap:1rem;row-gap:1rem}.md\:gap-y-5{grid-row-gap:1.25rem;row-gap:1.25rem}.md\:gap-y-6{grid-row-gap:1.5rem;row-gap:1.5rem}.md\:gap-y-8{grid-row-gap:2rem;row-gap:2rem}.md\:gap-y-10{grid-row-gap:2.5rem;row-gap:2.5rem}.md\:gap-y-12{grid-row-gap:3rem;row-gap:3rem}.md\:gap-y-16{grid-row-gap:4rem;row-gap:4rem}.md\:gap-y-20{grid-row-gap:5rem;row-gap:5rem}.md\:gap-y-24{grid-row-gap:6rem;row-gap:6rem}.md\:gap-y-32{grid-row-gap:8rem;row-gap:8rem}.md\:gap-y-40{grid-row-gap:10rem;row-gap:10rem}.md\:gap-y-48{grid-row-gap:12rem;row-gap:12rem}.md\:gap-y-56{grid-row-gap:14rem;row-gap:14rem}.md\:gap-y-64{grid-row-gap:16rem;row-gap:16rem}.md\:gap-y-px{grid-row-gap:1px;row-gap:1px}.md\:grid-flow-row{grid-auto-flow:row}.md\:grid-flow-col{grid-auto-flow:column}.md\:grid-flow-row-dense{grid-auto-flow:row dense}.md\:grid-flow-col-dense{grid-auto-flow:column dense}.md\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.md\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.md\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.md\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.md\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.md\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.md\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:grid-cols-none{grid-template-columns:none}.md\:auto-cols-auto{grid-auto-columns:auto}.md\:auto-cols-min{grid-auto-columns:-webkit-min-content;grid-auto-columns:min-content}.md\:auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.md\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.md\:col-auto{grid-column:auto}.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-3{grid-column:span 3/span 3}.md\:col-span-4{grid-column:span 4/span 4}.md\:col-span-5{grid-column:span 5/span 5}.md\:col-span-6{grid-column:span 6/span 6}.md\:col-span-7{grid-column:span 7/span 7}.md\:col-span-8{grid-column:span 8/span 8}.md\:col-span-9{grid-column:span 9/span 9}.md\:col-span-10{grid-column:span 10/span 10}.md\:col-span-11{grid-column:span 11/span 11}.md\:col-span-12{grid-column:span 12/span 12}.md\:col-span-full{grid-column:1/-1}.md\:col-start-1{grid-column-start:1}.md\:col-start-2{grid-column-start:2}.md\:col-start-3{grid-column-start:3}.md\:col-start-4{grid-column-start:4}.md\:col-start-5{grid-column-start:5}.md\:col-start-6{grid-column-start:6}.md\:col-start-7{grid-column-start:7}.md\:col-start-8{grid-column-start:8}.md\:col-start-9{grid-column-start:9}.md\:col-start-10{grid-column-start:10}.md\:col-start-11{grid-column-start:11}.md\:col-start-12{grid-column-start:12}.md\:col-start-13{grid-column-start:13}.md\:col-start-auto{grid-column-start:auto}.md\:col-end-1{grid-column-end:1}.md\:col-end-2{grid-column-end:2}.md\:col-end-3{grid-column-end:3}.md\:col-end-4{grid-column-end:4}.md\:col-end-5{grid-column-end:5}.md\:col-end-6{grid-column-end:6}.md\:col-end-7{grid-column-end:7}.md\:col-end-8{grid-column-end:8}.md\:col-end-9{grid-column-end:9}.md\:col-end-10{grid-column-end:10}.md\:col-end-11{grid-column-end:11}.md\:col-end-12{grid-column-end:12}.md\:col-end-13{grid-column-end:13}.md\:col-end-auto{grid-column-end:auto}.md\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.md\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.md\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.md\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.md\:grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.md\:grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.md\:grid-rows-none{grid-template-rows:none}.md\:auto-rows-auto{grid-auto-rows:auto}.md\:auto-rows-min{grid-auto-rows:-webkit-min-content;grid-auto-rows:min-content}.md\:auto-rows-max{grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}.md\:auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.md\:row-auto{grid-row:auto}.md\:row-span-1{grid-row:span 1/span 1}.md\:row-span-2{grid-row:span 2/span 2}.md\:row-span-3{grid-row:span 3/span 3}.md\:row-span-4{grid-row:span 4/span 4}.md\:row-span-5{grid-row:span 5/span 5}.md\:row-span-6{grid-row:span 6/span 6}.md\:row-span-full{grid-row:1/-1}.md\:row-start-1{grid-row-start:1}.md\:row-start-2{grid-row-start:2}.md\:row-start-3{grid-row-start:3}.md\:row-start-4{grid-row-start:4}.md\:row-start-5{grid-row-start:5}.md\:row-start-6{grid-row-start:6}.md\:row-start-7{grid-row-start:7}.md\:row-start-auto{grid-row-start:auto}.md\:row-end-1{grid-row-end:1}.md\:row-end-2{grid-row-end:2}.md\:row-end-3{grid-row-end:3}.md\:row-end-4{grid-row-end:4}.md\:row-end-5{grid-row-end:5}.md\:row-end-6{grid-row-end:6}.md\:row-end-7{grid-row-end:7}.md\:row-end-auto{grid-row-end:auto}.md\:transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.md\:transform-none{transform:none}.md\:origin-center{transform-origin:center}.md\:origin-top{transform-origin:top}.md\:origin-top-right{transform-origin:top right}.md\:origin-right{transform-origin:right}.md\:origin-bottom-right{transform-origin:bottom right}.md\:origin-bottom{transform-origin:bottom}.md\:origin-bottom-left{transform-origin:bottom left}.md\:origin-left{transform-origin:left}.md\:origin-top-left{transform-origin:top left}.md\:scale-0{--transform-scale-x:0;--transform-scale-y:0}.md\:scale-50{--transform-scale-x:.5;--transform-scale-y:.5}.md\:scale-75{--transform-scale-x:.75;--transform-scale-y:.75}.md\:scale-90{--transform-scale-x:.9;--transform-scale-y:.9}.md\:scale-95{--transform-scale-x:.95;--transform-scale-y:.95}.md\:scale-100{--transform-scale-x:1;--transform-scale-y:1}.md\:scale-105{--transform-scale-x:1.05;--transform-scale-y:1.05}.md\:scale-110{--transform-scale-x:1.1;--transform-scale-y:1.1}.md\:scale-125{--transform-scale-x:1.25;--transform-scale-y:1.25}.md\:scale-150{--transform-scale-x:1.5;--transform-scale-y:1.5}.md\:scale-x-0{--transform-scale-x:0}.md\:scale-x-50{--transform-scale-x:.5}.md\:scale-x-75{--transform-scale-x:.75}.md\:scale-x-90{--transform-scale-x:.9}.md\:scale-x-95{--transform-scale-x:.95}.md\:scale-x-100{--transform-scale-x:1}.md\:scale-x-105{--transform-scale-x:1.05}.md\:scale-x-110{--transform-scale-x:1.1}.md\:scale-x-125{--transform-scale-x:1.25}.md\:scale-x-150{--transform-scale-x:1.5}.md\:scale-y-0{--transform-scale-y:0}.md\:scale-y-50{--transform-scale-y:.5}.md\:scale-y-75{--transform-scale-y:.75}.md\:scale-y-90{--transform-scale-y:.9}.md\:scale-y-95{--transform-scale-y:.95}.md\:scale-y-100{--transform-scale-y:1}.md\:scale-y-105{--transform-scale-y:1.05}.md\:scale-y-110{--transform-scale-y:1.1}.md\:scale-y-125{--transform-scale-y:1.25}.md\:scale-y-150{--transform-scale-y:1.5}.md\:hover\:scale-0:hover{--transform-scale-x:0;--transform-scale-y:0}.md\:hover\:scale-50:hover{--transform-scale-x:.5;--transform-scale-y:.5}.md\:hover\:scale-75:hover{--transform-scale-x:.75;--transform-scale-y:.75}.md\:hover\:scale-90:hover{--transform-scale-x:.9;--transform-scale-y:.9}.md\:hover\:scale-95:hover{--transform-scale-x:.95;--transform-scale-y:.95}.md\:hover\:scale-100:hover{--transform-scale-x:1;--transform-scale-y:1}.md\:hover\:scale-105:hover{--transform-scale-x:1.05;--transform-scale-y:1.05}.md\:hover\:scale-110:hover{--transform-scale-x:1.1;--transform-scale-y:1.1}.md\:hover\:scale-125:hover{--transform-scale-x:1.25;--transform-scale-y:1.25}.md\:hover\:scale-150:hover{--transform-scale-x:1.5;--transform-scale-y:1.5}.md\:hover\:scale-x-0:hover{--transform-scale-x:0}.md\:hover\:scale-x-50:hover{--transform-scale-x:.5}.md\:hover\:scale-x-75:hover{--transform-scale-x:.75}.md\:hover\:scale-x-90:hover{--transform-scale-x:.9}.md\:hover\:scale-x-95:hover{--transform-scale-x:.95}.md\:hover\:scale-x-100:hover{--transform-scale-x:1}.md\:hover\:scale-x-105:hover{--transform-scale-x:1.05}.md\:hover\:scale-x-110:hover{--transform-scale-x:1.1}.md\:hover\:scale-x-125:hover{--transform-scale-x:1.25}.md\:hover\:scale-x-150:hover{--transform-scale-x:1.5}.md\:hover\:scale-y-0:hover{--transform-scale-y:0}.md\:hover\:scale-y-50:hover{--transform-scale-y:.5}.md\:hover\:scale-y-75:hover{--transform-scale-y:.75}.md\:hover\:scale-y-90:hover{--transform-scale-y:.9}.md\:hover\:scale-y-95:hover{--transform-scale-y:.95}.md\:hover\:scale-y-100:hover{--transform-scale-y:1}.md\:hover\:scale-y-105:hover{--transform-scale-y:1.05}.md\:hover\:scale-y-110:hover{--transform-scale-y:1.1}.md\:hover\:scale-y-125:hover{--transform-scale-y:1.25}.md\:hover\:scale-y-150:hover{--transform-scale-y:1.5}.md\:focus\:scale-0:focus{--transform-scale-x:0;--transform-scale-y:0}.md\:focus\:scale-50:focus{--transform-scale-x:.5;--transform-scale-y:.5}.md\:focus\:scale-75:focus{--transform-scale-x:.75;--transform-scale-y:.75}.md\:focus\:scale-90:focus{--transform-scale-x:.9;--transform-scale-y:.9}.md\:focus\:scale-95:focus{--transform-scale-x:.95;--transform-scale-y:.95}.md\:focus\:scale-100:focus{--transform-scale-x:1;--transform-scale-y:1}.md\:focus\:scale-105:focus{--transform-scale-x:1.05;--transform-scale-y:1.05}.md\:focus\:scale-110:focus{--transform-scale-x:1.1;--transform-scale-y:1.1}.md\:focus\:scale-125:focus{--transform-scale-x:1.25;--transform-scale-y:1.25}.md\:focus\:scale-150:focus{--transform-scale-x:1.5;--transform-scale-y:1.5}.md\:focus\:scale-x-0:focus{--transform-scale-x:0}.md\:focus\:scale-x-50:focus{--transform-scale-x:.5}.md\:focus\:scale-x-75:focus{--transform-scale-x:.75}.md\:focus\:scale-x-90:focus{--transform-scale-x:.9}.md\:focus\:scale-x-95:focus{--transform-scale-x:.95}.md\:focus\:scale-x-100:focus{--transform-scale-x:1}.md\:focus\:scale-x-105:focus{--transform-scale-x:1.05}.md\:focus\:scale-x-110:focus{--transform-scale-x:1.1}.md\:focus\:scale-x-125:focus{--transform-scale-x:1.25}.md\:focus\:scale-x-150:focus{--transform-scale-x:1.5}.md\:focus\:scale-y-0:focus{--transform-scale-y:0}.md\:focus\:scale-y-50:focus{--transform-scale-y:.5}.md\:focus\:scale-y-75:focus{--transform-scale-y:.75}.md\:focus\:scale-y-90:focus{--transform-scale-y:.9}.md\:focus\:scale-y-95:focus{--transform-scale-y:.95}.md\:focus\:scale-y-100:focus{--transform-scale-y:1}.md\:focus\:scale-y-105:focus{--transform-scale-y:1.05}.md\:focus\:scale-y-110:focus{--transform-scale-y:1.1}.md\:focus\:scale-y-125:focus{--transform-scale-y:1.25}.md\:focus\:scale-y-150:focus{--transform-scale-y:1.5}.md\:rotate-0{--transform-rotate:0}.md\:rotate-1{--transform-rotate:1deg}.md\:rotate-2{--transform-rotate:2deg}.md\:rotate-3{--transform-rotate:3deg}.md\:rotate-6{--transform-rotate:6deg}.md\:rotate-12{--transform-rotate:12deg}.md\:rotate-45{--transform-rotate:45deg}.md\:rotate-90{--transform-rotate:90deg}.md\:rotate-180{--transform-rotate:180deg}.md\:-rotate-180{--transform-rotate:-180deg}.md\:-rotate-90{--transform-rotate:-90deg}.md\:-rotate-45{--transform-rotate:-45deg}.md\:-rotate-12{--transform-rotate:-12deg}.md\:-rotate-6{--transform-rotate:-6deg}.md\:-rotate-3{--transform-rotate:-3deg}.md\:-rotate-2{--transform-rotate:-2deg}.md\:-rotate-1{--transform-rotate:-1deg}.md\:hover\:rotate-0:hover{--transform-rotate:0}.md\:hover\:rotate-1:hover{--transform-rotate:1deg}.md\:hover\:rotate-2:hover{--transform-rotate:2deg}.md\:hover\:rotate-3:hover{--transform-rotate:3deg}.md\:hover\:rotate-6:hover{--transform-rotate:6deg}.md\:hover\:rotate-12:hover{--transform-rotate:12deg}.md\:hover\:rotate-45:hover{--transform-rotate:45deg}.md\:hover\:rotate-90:hover{--transform-rotate:90deg}.md\:hover\:rotate-180:hover{--transform-rotate:180deg}.md\:hover\:-rotate-180:hover{--transform-rotate:-180deg}.md\:hover\:-rotate-90:hover{--transform-rotate:-90deg}.md\:hover\:-rotate-45:hover{--transform-rotate:-45deg}.md\:hover\:-rotate-12:hover{--transform-rotate:-12deg}.md\:hover\:-rotate-6:hover{--transform-rotate:-6deg}.md\:hover\:-rotate-3:hover{--transform-rotate:-3deg}.md\:hover\:-rotate-2:hover{--transform-rotate:-2deg}.md\:hover\:-rotate-1:hover{--transform-rotate:-1deg}.md\:focus\:rotate-0:focus{--transform-rotate:0}.md\:focus\:rotate-1:focus{--transform-rotate:1deg}.md\:focus\:rotate-2:focus{--transform-rotate:2deg}.md\:focus\:rotate-3:focus{--transform-rotate:3deg}.md\:focus\:rotate-6:focus{--transform-rotate:6deg}.md\:focus\:rotate-12:focus{--transform-rotate:12deg}.md\:focus\:rotate-45:focus{--transform-rotate:45deg}.md\:focus\:rotate-90:focus{--transform-rotate:90deg}.md\:focus\:rotate-180:focus{--transform-rotate:180deg}.md\:focus\:-rotate-180:focus{--transform-rotate:-180deg}.md\:focus\:-rotate-90:focus{--transform-rotate:-90deg}.md\:focus\:-rotate-45:focus{--transform-rotate:-45deg}.md\:focus\:-rotate-12:focus{--transform-rotate:-12deg}.md\:focus\:-rotate-6:focus{--transform-rotate:-6deg}.md\:focus\:-rotate-3:focus{--transform-rotate:-3deg}.md\:focus\:-rotate-2:focus{--transform-rotate:-2deg}.md\:focus\:-rotate-1:focus{--transform-rotate:-1deg}.md\:translate-x-0{--transform-translate-x:0}.md\:translate-x-1{--transform-translate-x:0.25rem}.md\:translate-x-2{--transform-translate-x:0.5rem}.md\:translate-x-3{--transform-translate-x:0.75rem}.md\:translate-x-4{--transform-translate-x:1rem}.md\:translate-x-5{--transform-translate-x:1.25rem}.md\:translate-x-6{--transform-translate-x:1.5rem}.md\:translate-x-8{--transform-translate-x:2rem}.md\:translate-x-10{--transform-translate-x:2.5rem}.md\:translate-x-12{--transform-translate-x:3rem}.md\:translate-x-16{--transform-translate-x:4rem}.md\:translate-x-20{--transform-translate-x:5rem}.md\:translate-x-24{--transform-translate-x:6rem}.md\:translate-x-32{--transform-translate-x:8rem}.md\:translate-x-40{--transform-translate-x:10rem}.md\:translate-x-48{--transform-translate-x:12rem}.md\:translate-x-56{--transform-translate-x:14rem}.md\:translate-x-64{--transform-translate-x:16rem}.md\:translate-x-px{--transform-translate-x:1px}.md\:-translate-x-1{--transform-translate-x:-0.25rem}.md\:-translate-x-2{--transform-translate-x:-0.5rem}.md\:-translate-x-3{--transform-translate-x:-0.75rem}.md\:-translate-x-4{--transform-translate-x:-1rem}.md\:-translate-x-5{--transform-translate-x:-1.25rem}.md\:-translate-x-6{--transform-translate-x:-1.5rem}.md\:-translate-x-8{--transform-translate-x:-2rem}.md\:-translate-x-10{--transform-translate-x:-2.5rem}.md\:-translate-x-12{--transform-translate-x:-3rem}.md\:-translate-x-16{--transform-translate-x:-4rem}.md\:-translate-x-20{--transform-translate-x:-5rem}.md\:-translate-x-24{--transform-translate-x:-6rem}.md\:-translate-x-32{--transform-translate-x:-8rem}.md\:-translate-x-40{--transform-translate-x:-10rem}.md\:-translate-x-48{--transform-translate-x:-12rem}.md\:-translate-x-56{--transform-translate-x:-14rem}.md\:-translate-x-64{--transform-translate-x:-16rem}.md\:-translate-x-px{--transform-translate-x:-1px}.md\:-translate-x-full{--transform-translate-x:-100%}.md\:-translate-x-1\/2{--transform-translate-x:-50%}.md\:translate-x-1\/2{--transform-translate-x:50%}.md\:translate-x-full{--transform-translate-x:100%}.md\:translate-y-0{--transform-translate-y:0}.md\:translate-y-1{--transform-translate-y:0.25rem}.md\:translate-y-2{--transform-translate-y:0.5rem}.md\:translate-y-3{--transform-translate-y:0.75rem}.md\:translate-y-4{--transform-translate-y:1rem}.md\:translate-y-5{--transform-translate-y:1.25rem}.md\:translate-y-6{--transform-translate-y:1.5rem}.md\:translate-y-8{--transform-translate-y:2rem}.md\:translate-y-10{--transform-translate-y:2.5rem}.md\:translate-y-12{--transform-translate-y:3rem}.md\:translate-y-16{--transform-translate-y:4rem}.md\:translate-y-20{--transform-translate-y:5rem}.md\:translate-y-24{--transform-translate-y:6rem}.md\:translate-y-32{--transform-translate-y:8rem}.md\:translate-y-40{--transform-translate-y:10rem}.md\:translate-y-48{--transform-translate-y:12rem}.md\:translate-y-56{--transform-translate-y:14rem}.md\:translate-y-64{--transform-translate-y:16rem}.md\:translate-y-px{--transform-translate-y:1px}.md\:-translate-y-1{--transform-translate-y:-0.25rem}.md\:-translate-y-2{--transform-translate-y:-0.5rem}.md\:-translate-y-3{--transform-translate-y:-0.75rem}.md\:-translate-y-4{--transform-translate-y:-1rem}.md\:-translate-y-5{--transform-translate-y:-1.25rem}.md\:-translate-y-6{--transform-translate-y:-1.5rem}.md\:-translate-y-8{--transform-translate-y:-2rem}.md\:-translate-y-10{--transform-translate-y:-2.5rem}.md\:-translate-y-12{--transform-translate-y:-3rem}.md\:-translate-y-16{--transform-translate-y:-4rem}.md\:-translate-y-20{--transform-translate-y:-5rem}.md\:-translate-y-24{--transform-translate-y:-6rem}.md\:-translate-y-32{--transform-translate-y:-8rem}.md\:-translate-y-40{--transform-translate-y:-10rem}.md\:-translate-y-48{--transform-translate-y:-12rem}.md\:-translate-y-56{--transform-translate-y:-14rem}.md\:-translate-y-64{--transform-translate-y:-16rem}.md\:-translate-y-px{--transform-translate-y:-1px}.md\:-translate-y-full{--transform-translate-y:-100%}.md\:-translate-y-1\/2{--transform-translate-y:-50%}.md\:translate-y-1\/2{--transform-translate-y:50%}.md\:translate-y-full{--transform-translate-y:100%}.md\:hover\:translate-x-0:hover{--transform-translate-x:0}.md\:hover\:translate-x-1:hover{--transform-translate-x:0.25rem}.md\:hover\:translate-x-2:hover{--transform-translate-x:0.5rem}.md\:hover\:translate-x-3:hover{--transform-translate-x:0.75rem}.md\:hover\:translate-x-4:hover{--transform-translate-x:1rem}.md\:hover\:translate-x-5:hover{--transform-translate-x:1.25rem}.md\:hover\:translate-x-6:hover{--transform-translate-x:1.5rem}.md\:hover\:translate-x-8:hover{--transform-translate-x:2rem}.md\:hover\:translate-x-10:hover{--transform-translate-x:2.5rem}.md\:hover\:translate-x-12:hover{--transform-translate-x:3rem}.md\:hover\:translate-x-16:hover{--transform-translate-x:4rem}.md\:hover\:translate-x-20:hover{--transform-translate-x:5rem}.md\:hover\:translate-x-24:hover{--transform-translate-x:6rem}.md\:hover\:translate-x-32:hover{--transform-translate-x:8rem}.md\:hover\:translate-x-40:hover{--transform-translate-x:10rem}.md\:hover\:translate-x-48:hover{--transform-translate-x:12rem}.md\:hover\:translate-x-56:hover{--transform-translate-x:14rem}.md\:hover\:translate-x-64:hover{--transform-translate-x:16rem}.md\:hover\:translate-x-px:hover{--transform-translate-x:1px}.md\:hover\:-translate-x-1:hover{--transform-translate-x:-0.25rem}.md\:hover\:-translate-x-2:hover{--transform-translate-x:-0.5rem}.md\:hover\:-translate-x-3:hover{--transform-translate-x:-0.75rem}.md\:hover\:-translate-x-4:hover{--transform-translate-x:-1rem}.md\:hover\:-translate-x-5:hover{--transform-translate-x:-1.25rem}.md\:hover\:-translate-x-6:hover{--transform-translate-x:-1.5rem}.md\:hover\:-translate-x-8:hover{--transform-translate-x:-2rem}.md\:hover\:-translate-x-10:hover{--transform-translate-x:-2.5rem}.md\:hover\:-translate-x-12:hover{--transform-translate-x:-3rem}.md\:hover\:-translate-x-16:hover{--transform-translate-x:-4rem}.md\:hover\:-translate-x-20:hover{--transform-translate-x:-5rem}.md\:hover\:-translate-x-24:hover{--transform-translate-x:-6rem}.md\:hover\:-translate-x-32:hover{--transform-translate-x:-8rem}.md\:hover\:-translate-x-40:hover{--transform-translate-x:-10rem}.md\:hover\:-translate-x-48:hover{--transform-translate-x:-12rem}.md\:hover\:-translate-x-56:hover{--transform-translate-x:-14rem}.md\:hover\:-translate-x-64:hover{--transform-translate-x:-16rem}.md\:hover\:-translate-x-px:hover{--transform-translate-x:-1px}.md\:hover\:-translate-x-full:hover{--transform-translate-x:-100%}.md\:hover\:-translate-x-1\/2:hover{--transform-translate-x:-50%}.md\:hover\:translate-x-1\/2:hover{--transform-translate-x:50%}.md\:hover\:translate-x-full:hover{--transform-translate-x:100%}.md\:hover\:translate-y-0:hover{--transform-translate-y:0}.md\:hover\:translate-y-1:hover{--transform-translate-y:0.25rem}.md\:hover\:translate-y-2:hover{--transform-translate-y:0.5rem}.md\:hover\:translate-y-3:hover{--transform-translate-y:0.75rem}.md\:hover\:translate-y-4:hover{--transform-translate-y:1rem}.md\:hover\:translate-y-5:hover{--transform-translate-y:1.25rem}.md\:hover\:translate-y-6:hover{--transform-translate-y:1.5rem}.md\:hover\:translate-y-8:hover{--transform-translate-y:2rem}.md\:hover\:translate-y-10:hover{--transform-translate-y:2.5rem}.md\:hover\:translate-y-12:hover{--transform-translate-y:3rem}.md\:hover\:translate-y-16:hover{--transform-translate-y:4rem}.md\:hover\:translate-y-20:hover{--transform-translate-y:5rem}.md\:hover\:translate-y-24:hover{--transform-translate-y:6rem}.md\:hover\:translate-y-32:hover{--transform-translate-y:8rem}.md\:hover\:translate-y-40:hover{--transform-translate-y:10rem}.md\:hover\:translate-y-48:hover{--transform-translate-y:12rem}.md\:hover\:translate-y-56:hover{--transform-translate-y:14rem}.md\:hover\:translate-y-64:hover{--transform-translate-y:16rem}.md\:hover\:translate-y-px:hover{--transform-translate-y:1px}.md\:hover\:-translate-y-1:hover{--transform-translate-y:-0.25rem}.md\:hover\:-translate-y-2:hover{--transform-translate-y:-0.5rem}.md\:hover\:-translate-y-3:hover{--transform-translate-y:-0.75rem}.md\:hover\:-translate-y-4:hover{--transform-translate-y:-1rem}.md\:hover\:-translate-y-5:hover{--transform-translate-y:-1.25rem}.md\:hover\:-translate-y-6:hover{--transform-translate-y:-1.5rem}.md\:hover\:-translate-y-8:hover{--transform-translate-y:-2rem}.md\:hover\:-translate-y-10:hover{--transform-translate-y:-2.5rem}.md\:hover\:-translate-y-12:hover{--transform-translate-y:-3rem}.md\:hover\:-translate-y-16:hover{--transform-translate-y:-4rem}.md\:hover\:-translate-y-20:hover{--transform-translate-y:-5rem}.md\:hover\:-translate-y-24:hover{--transform-translate-y:-6rem}.md\:hover\:-translate-y-32:hover{--transform-translate-y:-8rem}.md\:hover\:-translate-y-40:hover{--transform-translate-y:-10rem}.md\:hover\:-translate-y-48:hover{--transform-translate-y:-12rem}.md\:hover\:-translate-y-56:hover{--transform-translate-y:-14rem}.md\:hover\:-translate-y-64:hover{--transform-translate-y:-16rem}.md\:hover\:-translate-y-px:hover{--transform-translate-y:-1px}.md\:hover\:-translate-y-full:hover{--transform-translate-y:-100%}.md\:hover\:-translate-y-1\/2:hover{--transform-translate-y:-50%}.md\:hover\:translate-y-1\/2:hover{--transform-translate-y:50%}.md\:hover\:translate-y-full:hover{--transform-translate-y:100%}.md\:focus\:translate-x-0:focus{--transform-translate-x:0}.md\:focus\:translate-x-1:focus{--transform-translate-x:0.25rem}.md\:focus\:translate-x-2:focus{--transform-translate-x:0.5rem}.md\:focus\:translate-x-3:focus{--transform-translate-x:0.75rem}.md\:focus\:translate-x-4:focus{--transform-translate-x:1rem}.md\:focus\:translate-x-5:focus{--transform-translate-x:1.25rem}.md\:focus\:translate-x-6:focus{--transform-translate-x:1.5rem}.md\:focus\:translate-x-8:focus{--transform-translate-x:2rem}.md\:focus\:translate-x-10:focus{--transform-translate-x:2.5rem}.md\:focus\:translate-x-12:focus{--transform-translate-x:3rem}.md\:focus\:translate-x-16:focus{--transform-translate-x:4rem}.md\:focus\:translate-x-20:focus{--transform-translate-x:5rem}.md\:focus\:translate-x-24:focus{--transform-translate-x:6rem}.md\:focus\:translate-x-32:focus{--transform-translate-x:8rem}.md\:focus\:translate-x-40:focus{--transform-translate-x:10rem}.md\:focus\:translate-x-48:focus{--transform-translate-x:12rem}.md\:focus\:translate-x-56:focus{--transform-translate-x:14rem}.md\:focus\:translate-x-64:focus{--transform-translate-x:16rem}.md\:focus\:translate-x-px:focus{--transform-translate-x:1px}.md\:focus\:-translate-x-1:focus{--transform-translate-x:-0.25rem}.md\:focus\:-translate-x-2:focus{--transform-translate-x:-0.5rem}.md\:focus\:-translate-x-3:focus{--transform-translate-x:-0.75rem}.md\:focus\:-translate-x-4:focus{--transform-translate-x:-1rem}.md\:focus\:-translate-x-5:focus{--transform-translate-x:-1.25rem}.md\:focus\:-translate-x-6:focus{--transform-translate-x:-1.5rem}.md\:focus\:-translate-x-8:focus{--transform-translate-x:-2rem}.md\:focus\:-translate-x-10:focus{--transform-translate-x:-2.5rem}.md\:focus\:-translate-x-12:focus{--transform-translate-x:-3rem}.md\:focus\:-translate-x-16:focus{--transform-translate-x:-4rem}.md\:focus\:-translate-x-20:focus{--transform-translate-x:-5rem}.md\:focus\:-translate-x-24:focus{--transform-translate-x:-6rem}.md\:focus\:-translate-x-32:focus{--transform-translate-x:-8rem}.md\:focus\:-translate-x-40:focus{--transform-translate-x:-10rem}.md\:focus\:-translate-x-48:focus{--transform-translate-x:-12rem}.md\:focus\:-translate-x-56:focus{--transform-translate-x:-14rem}.md\:focus\:-translate-x-64:focus{--transform-translate-x:-16rem}.md\:focus\:-translate-x-px:focus{--transform-translate-x:-1px}.md\:focus\:-translate-x-full:focus{--transform-translate-x:-100%}.md\:focus\:-translate-x-1\/2:focus{--transform-translate-x:-50%}.md\:focus\:translate-x-1\/2:focus{--transform-translate-x:50%}.md\:focus\:translate-x-full:focus{--transform-translate-x:100%}.md\:focus\:translate-y-0:focus{--transform-translate-y:0}.md\:focus\:translate-y-1:focus{--transform-translate-y:0.25rem}.md\:focus\:translate-y-2:focus{--transform-translate-y:0.5rem}.md\:focus\:translate-y-3:focus{--transform-translate-y:0.75rem}.md\:focus\:translate-y-4:focus{--transform-translate-y:1rem}.md\:focus\:translate-y-5:focus{--transform-translate-y:1.25rem}.md\:focus\:translate-y-6:focus{--transform-translate-y:1.5rem}.md\:focus\:translate-y-8:focus{--transform-translate-y:2rem}.md\:focus\:translate-y-10:focus{--transform-translate-y:2.5rem}.md\:focus\:translate-y-12:focus{--transform-translate-y:3rem}.md\:focus\:translate-y-16:focus{--transform-translate-y:4rem}.md\:focus\:translate-y-20:focus{--transform-translate-y:5rem}.md\:focus\:translate-y-24:focus{--transform-translate-y:6rem}.md\:focus\:translate-y-32:focus{--transform-translate-y:8rem}.md\:focus\:translate-y-40:focus{--transform-translate-y:10rem}.md\:focus\:translate-y-48:focus{--transform-translate-y:12rem}.md\:focus\:translate-y-56:focus{--transform-translate-y:14rem}.md\:focus\:translate-y-64:focus{--transform-translate-y:16rem}.md\:focus\:translate-y-px:focus{--transform-translate-y:1px}.md\:focus\:-translate-y-1:focus{--transform-translate-y:-0.25rem}.md\:focus\:-translate-y-2:focus{--transform-translate-y:-0.5rem}.md\:focus\:-translate-y-3:focus{--transform-translate-y:-0.75rem}.md\:focus\:-translate-y-4:focus{--transform-translate-y:-1rem}.md\:focus\:-translate-y-5:focus{--transform-translate-y:-1.25rem}.md\:focus\:-translate-y-6:focus{--transform-translate-y:-1.5rem}.md\:focus\:-translate-y-8:focus{--transform-translate-y:-2rem}.md\:focus\:-translate-y-10:focus{--transform-translate-y:-2.5rem}.md\:focus\:-translate-y-12:focus{--transform-translate-y:-3rem}.md\:focus\:-translate-y-16:focus{--transform-translate-y:-4rem}.md\:focus\:-translate-y-20:focus{--transform-translate-y:-5rem}.md\:focus\:-translate-y-24:focus{--transform-translate-y:-6rem}.md\:focus\:-translate-y-32:focus{--transform-translate-y:-8rem}.md\:focus\:-translate-y-40:focus{--transform-translate-y:-10rem}.md\:focus\:-translate-y-48:focus{--transform-translate-y:-12rem}.md\:focus\:-translate-y-56:focus{--transform-translate-y:-14rem}.md\:focus\:-translate-y-64:focus{--transform-translate-y:-16rem}.md\:focus\:-translate-y-px:focus{--transform-translate-y:-1px}.md\:focus\:-translate-y-full:focus{--transform-translate-y:-100%}.md\:focus\:-translate-y-1\/2:focus{--transform-translate-y:-50%}.md\:focus\:translate-y-1\/2:focus{--transform-translate-y:50%}.md\:focus\:translate-y-full:focus{--transform-translate-y:100%}.md\:skew-x-0{--transform-skew-x:0}.md\:skew-x-1{--transform-skew-x:1deg}.md\:skew-x-2{--transform-skew-x:2deg}.md\:skew-x-3{--transform-skew-x:3deg}.md\:skew-x-6{--transform-skew-x:6deg}.md\:skew-x-12{--transform-skew-x:12deg}.md\:-skew-x-12{--transform-skew-x:-12deg}.md\:-skew-x-6{--transform-skew-x:-6deg}.md\:-skew-x-3{--transform-skew-x:-3deg}.md\:-skew-x-2{--transform-skew-x:-2deg}.md\:-skew-x-1{--transform-skew-x:-1deg}.md\:skew-y-0{--transform-skew-y:0}.md\:skew-y-1{--transform-skew-y:1deg}.md\:skew-y-2{--transform-skew-y:2deg}.md\:skew-y-3{--transform-skew-y:3deg}.md\:skew-y-6{--transform-skew-y:6deg}.md\:skew-y-12{--transform-skew-y:12deg}.md\:-skew-y-12{--transform-skew-y:-12deg}.md\:-skew-y-6{--transform-skew-y:-6deg}.md\:-skew-y-3{--transform-skew-y:-3deg}.md\:-skew-y-2{--transform-skew-y:-2deg}.md\:-skew-y-1{--transform-skew-y:-1deg}.md\:hover\:skew-x-0:hover{--transform-skew-x:0}.md\:hover\:skew-x-1:hover{--transform-skew-x:1deg}.md\:hover\:skew-x-2:hover{--transform-skew-x:2deg}.md\:hover\:skew-x-3:hover{--transform-skew-x:3deg}.md\:hover\:skew-x-6:hover{--transform-skew-x:6deg}.md\:hover\:skew-x-12:hover{--transform-skew-x:12deg}.md\:hover\:-skew-x-12:hover{--transform-skew-x:-12deg}.md\:hover\:-skew-x-6:hover{--transform-skew-x:-6deg}.md\:hover\:-skew-x-3:hover{--transform-skew-x:-3deg}.md\:hover\:-skew-x-2:hover{--transform-skew-x:-2deg}.md\:hover\:-skew-x-1:hover{--transform-skew-x:-1deg}.md\:hover\:skew-y-0:hover{--transform-skew-y:0}.md\:hover\:skew-y-1:hover{--transform-skew-y:1deg}.md\:hover\:skew-y-2:hover{--transform-skew-y:2deg}.md\:hover\:skew-y-3:hover{--transform-skew-y:3deg}.md\:hover\:skew-y-6:hover{--transform-skew-y:6deg}.md\:hover\:skew-y-12:hover{--transform-skew-y:12deg}.md\:hover\:-skew-y-12:hover{--transform-skew-y:-12deg}.md\:hover\:-skew-y-6:hover{--transform-skew-y:-6deg}.md\:hover\:-skew-y-3:hover{--transform-skew-y:-3deg}.md\:hover\:-skew-y-2:hover{--transform-skew-y:-2deg}.md\:hover\:-skew-y-1:hover{--transform-skew-y:-1deg}.md\:focus\:skew-x-0:focus{--transform-skew-x:0}.md\:focus\:skew-x-1:focus{--transform-skew-x:1deg}.md\:focus\:skew-x-2:focus{--transform-skew-x:2deg}.md\:focus\:skew-x-3:focus{--transform-skew-x:3deg}.md\:focus\:skew-x-6:focus{--transform-skew-x:6deg}.md\:focus\:skew-x-12:focus{--transform-skew-x:12deg}.md\:focus\:-skew-x-12:focus{--transform-skew-x:-12deg}.md\:focus\:-skew-x-6:focus{--transform-skew-x:-6deg}.md\:focus\:-skew-x-3:focus{--transform-skew-x:-3deg}.md\:focus\:-skew-x-2:focus{--transform-skew-x:-2deg}.md\:focus\:-skew-x-1:focus{--transform-skew-x:-1deg}.md\:focus\:skew-y-0:focus{--transform-skew-y:0}.md\:focus\:skew-y-1:focus{--transform-skew-y:1deg}.md\:focus\:skew-y-2:focus{--transform-skew-y:2deg}.md\:focus\:skew-y-3:focus{--transform-skew-y:3deg}.md\:focus\:skew-y-6:focus{--transform-skew-y:6deg}.md\:focus\:skew-y-12:focus{--transform-skew-y:12deg}.md\:focus\:-skew-y-12:focus{--transform-skew-y:-12deg}.md\:focus\:-skew-y-6:focus{--transform-skew-y:-6deg}.md\:focus\:-skew-y-3:focus{--transform-skew-y:-3deg}.md\:focus\:-skew-y-2:focus{--transform-skew-y:-2deg}.md\:focus\:-skew-y-1:focus{--transform-skew-y:-1deg}.md\:transition-none{transition-property:none}.md\:transition-all{transition-property:all}.md\:transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform}.md\:transition-colors{transition-property:background-color,border-color,color,fill,stroke}.md\:transition-opacity{transition-property:opacity}.md\:transition-shadow{transition-property:box-shadow}.md\:transition-transform{transition-property:transform}.md\:ease-linear{transition-timing-function:linear}.md\:ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.md\:ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.md\:ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.md\:duration-75{transition-duration:75ms}.md\:duration-100{transition-duration:.1s}.md\:duration-150{transition-duration:150ms}.md\:duration-200{transition-duration:.2s}.md\:duration-300{transition-duration:.3s}.md\:duration-500{transition-duration:.5s}.md\:duration-700{transition-duration:.7s}.md\:duration-1000{transition-duration:1s}.md\:delay-75{transition-delay:75ms}.md\:delay-100{transition-delay:.1s}.md\:delay-150{transition-delay:150ms}.md\:delay-200{transition-delay:.2s}.md\:delay-300{transition-delay:.3s}.md\:delay-500{transition-delay:.5s}.md\:delay-700{transition-delay:.7s}.md\:delay-1000{transition-delay:1s}.md\:animate-none{animation:none}.md\:animate-spin{animation:spin 1s linear infinite}.md\:animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.md\:animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.md\:animate-bounce{animation:bounce 1s infinite}}@media (min-width:1024px){.lg\:container{width:100%}@media (min-width:640px){.lg\:container{max-width:640px}}@media (min-width:768px){.lg\:container{max-width:768px}}@media (min-width:1024px){.lg\:container{max-width:1024px}}@media (min-width:1280px){.lg\:container{max-width:1280px}}.lg\:space-y-0>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(0px * var(--space-y-reverse))}.lg\:space-x-0>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(0px * var(--space-x-reverse));margin-left:calc(0px * calc(1 - var(--space-x-reverse)))}.lg\:space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.25rem * var(--space-y-reverse))}.lg\:space-x-1>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.25rem * var(--space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.5rem * var(--space-y-reverse))}.lg\:space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.5rem * var(--space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.75rem * var(--space-y-reverse))}.lg\:space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.75rem * var(--space-x-reverse));margin-left:calc(.75rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1rem * var(--space-y-reverse))}.lg\:space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1rem * var(--space-x-reverse));margin-left:calc(1rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1.25rem * var(--space-y-reverse))}.lg\:space-x-5>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1.25rem * var(--space-x-reverse));margin-left:calc(1.25rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-6>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1.5rem * var(--space-y-reverse))}.lg\:space-x-6>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1.5rem * var(--space-x-reverse));margin-left:calc(1.5rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-8>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(2rem * var(--space-y-reverse))}.lg\:space-x-8>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(2rem * var(--space-x-reverse));margin-left:calc(2rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(2.5rem * var(--space-y-reverse))}.lg\:space-x-10>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(2.5rem * var(--space-x-reverse));margin-left:calc(2.5rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-12>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(3rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(3rem * var(--space-y-reverse))}.lg\:space-x-12>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(3rem * var(--space-x-reverse));margin-left:calc(3rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-16>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(4rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(4rem * var(--space-y-reverse))}.lg\:space-x-16>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(4rem * var(--space-x-reverse));margin-left:calc(4rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-20>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(5rem * var(--space-y-reverse))}.lg\:space-x-20>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(5rem * var(--space-x-reverse));margin-left:calc(5rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-24>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(6rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(6rem * var(--space-y-reverse))}.lg\:space-x-24>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(6rem * var(--space-x-reverse));margin-left:calc(6rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-32>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(8rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(8rem * var(--space-y-reverse))}.lg\:space-x-32>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(8rem * var(--space-x-reverse));margin-left:calc(8rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-40>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(10rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(10rem * var(--space-y-reverse))}.lg\:space-x-40>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(10rem * var(--space-x-reverse));margin-left:calc(10rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-48>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(12rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(12rem * var(--space-y-reverse))}.lg\:space-x-48>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(12rem * var(--space-x-reverse));margin-left:calc(12rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-56>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(14rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(14rem * var(--space-y-reverse))}.lg\:space-x-56>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(14rem * var(--space-x-reverse));margin-left:calc(14rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-64>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(16rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(16rem * var(--space-y-reverse))}.lg\:space-x-64>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(16rem * var(--space-x-reverse));margin-left:calc(16rem * calc(1 - var(--space-x-reverse)))}.lg\:space-y-px>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1px * var(--space-y-reverse))}.lg\:space-x-px>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1px * var(--space-x-reverse));margin-left:calc(1px * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.25rem * var(--space-y-reverse))}.lg\:-space-x-1>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.25rem * var(--space-x-reverse));margin-left:calc(-.25rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.5rem * var(--space-y-reverse))}.lg\:-space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.5rem * var(--space-x-reverse));margin-left:calc(-.5rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.75rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.75rem * var(--space-y-reverse))}.lg\:-space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.75rem * var(--space-x-reverse));margin-left:calc(-.75rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1rem * var(--space-y-reverse))}.lg\:-space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1rem * var(--space-x-reverse));margin-left:calc(-1rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1.25rem * var(--space-y-reverse))}.lg\:-space-x-5>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1.25rem * var(--space-x-reverse));margin-left:calc(-1.25rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-6>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1.5rem * var(--space-y-reverse))}.lg\:-space-x-6>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1.5rem * var(--space-x-reverse));margin-left:calc(-1.5rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-8>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-2rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-2rem * var(--space-y-reverse))}.lg\:-space-x-8>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-2rem * var(--space-x-reverse));margin-left:calc(-2rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-2.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-2.5rem * var(--space-y-reverse))}.lg\:-space-x-10>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-2.5rem * var(--space-x-reverse));margin-left:calc(-2.5rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-12>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-3rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-3rem * var(--space-y-reverse))}.lg\:-space-x-12>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-3rem * var(--space-x-reverse));margin-left:calc(-3rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-16>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-4rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-4rem * var(--space-y-reverse))}.lg\:-space-x-16>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-4rem * var(--space-x-reverse));margin-left:calc(-4rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-20>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-5rem * var(--space-y-reverse))}.lg\:-space-x-20>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-5rem * var(--space-x-reverse));margin-left:calc(-5rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-24>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-6rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-6rem * var(--space-y-reverse))}.lg\:-space-x-24>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-6rem * var(--space-x-reverse));margin-left:calc(-6rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-32>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-8rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-8rem * var(--space-y-reverse))}.lg\:-space-x-32>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-8rem * var(--space-x-reverse));margin-left:calc(-8rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-40>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-10rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-10rem * var(--space-y-reverse))}.lg\:-space-x-40>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-10rem * var(--space-x-reverse));margin-left:calc(-10rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-48>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-12rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-12rem * var(--space-y-reverse))}.lg\:-space-x-48>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-12rem * var(--space-x-reverse));margin-left:calc(-12rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-56>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-14rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-14rem * var(--space-y-reverse))}.lg\:-space-x-56>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-14rem * var(--space-x-reverse));margin-left:calc(-14rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-64>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-16rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-16rem * var(--space-y-reverse))}.lg\:-space-x-64>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-16rem * var(--space-x-reverse));margin-left:calc(-16rem * calc(1 - var(--space-x-reverse)))}.lg\:-space-y-px>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1px * var(--space-y-reverse))}.lg\:-space-x-px>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1px * var(--space-x-reverse));margin-left:calc(-1px * calc(1 - var(--space-x-reverse)))}.lg\:space-y-reverse>:not(template)~:not(template){--space-y-reverse:1}.lg\:space-x-reverse>:not(template)~:not(template){--space-x-reverse:1}.lg\:divide-y-0>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(0px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(0px * var(--divide-y-reverse))}.lg\:divide-x-0>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(0px * var(--divide-x-reverse));border-left-width:calc(0px * calc(1 - var(--divide-x-reverse)))}.lg\:divide-y-2>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(2px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(2px * var(--divide-y-reverse))}.lg\:divide-x-2>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(2px * var(--divide-x-reverse));border-left-width:calc(2px * calc(1 - var(--divide-x-reverse)))}.lg\:divide-y-4>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(4px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(4px * var(--divide-y-reverse))}.lg\:divide-x-4>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(4px * var(--divide-x-reverse));border-left-width:calc(4px * calc(1 - var(--divide-x-reverse)))}.lg\:divide-y-8>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(8px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(8px * var(--divide-y-reverse))}.lg\:divide-x-8>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(8px * var(--divide-x-reverse));border-left-width:calc(8px * calc(1 - var(--divide-x-reverse)))}.lg\:divide-y>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(1px * var(--divide-y-reverse))}.lg\:divide-x>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(1px * var(--divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--divide-x-reverse)))}.lg\:divide-y-reverse>:not(template)~:not(template){--divide-y-reverse:1}.lg\:divide-x-reverse>:not(template)~:not(template){--divide-x-reverse:1}.lg\:divide-transparent>:not(template)~:not(template){border-color:transparent}.lg\:divide-current>:not(template)~:not(template){border-color:currentColor}.lg\:divide-black>:not(template)~:not(template){--divide-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--divide-opacity))}.lg\:divide-white>:not(template)~:not(template){--divide-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--divide-opacity))}.lg\:divide-gray-100>:not(template)~:not(template){--divide-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--divide-opacity))}.lg\:divide-gray-200>:not(template)~:not(template){--divide-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--divide-opacity))}.lg\:divide-gray-300>:not(template)~:not(template){--divide-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--divide-opacity))}.lg\:divide-gray-400>:not(template)~:not(template){--divide-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--divide-opacity))}.lg\:divide-gray-500>:not(template)~:not(template){--divide-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--divide-opacity))}.lg\:divide-gray-600>:not(template)~:not(template){--divide-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--divide-opacity))}.lg\:divide-gray-700>:not(template)~:not(template){--divide-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--divide-opacity))}.lg\:divide-gray-800>:not(template)~:not(template){--divide-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--divide-opacity))}.lg\:divide-gray-900>:not(template)~:not(template){--divide-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--divide-opacity))}.lg\:divide-red-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--divide-opacity))}.lg\:divide-red-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--divide-opacity))}.lg\:divide-red-300>:not(template)~:not(template){--divide-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--divide-opacity))}.lg\:divide-red-400>:not(template)~:not(template){--divide-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--divide-opacity))}.lg\:divide-red-500>:not(template)~:not(template){--divide-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--divide-opacity))}.lg\:divide-red-600>:not(template)~:not(template){--divide-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--divide-opacity))}.lg\:divide-red-700>:not(template)~:not(template){--divide-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--divide-opacity))}.lg\:divide-red-800>:not(template)~:not(template){--divide-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--divide-opacity))}.lg\:divide-red-900>:not(template)~:not(template){--divide-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--divide-opacity))}.lg\:divide-orange-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--divide-opacity))}.lg\:divide-orange-200>:not(template)~:not(template){--divide-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--divide-opacity))}.lg\:divide-orange-300>:not(template)~:not(template){--divide-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--divide-opacity))}.lg\:divide-orange-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--divide-opacity))}.lg\:divide-orange-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--divide-opacity))}.lg\:divide-orange-600>:not(template)~:not(template){--divide-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--divide-opacity))}.lg\:divide-orange-700>:not(template)~:not(template){--divide-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--divide-opacity))}.lg\:divide-orange-800>:not(template)~:not(template){--divide-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--divide-opacity))}.lg\:divide-orange-900>:not(template)~:not(template){--divide-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--divide-opacity))}.lg\:divide-yellow-100>:not(template)~:not(template){--divide-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--divide-opacity))}.lg\:divide-yellow-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--divide-opacity))}.lg\:divide-yellow-300>:not(template)~:not(template){--divide-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--divide-opacity))}.lg\:divide-yellow-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--divide-opacity))}.lg\:divide-yellow-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--divide-opacity))}.lg\:divide-yellow-600>:not(template)~:not(template){--divide-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--divide-opacity))}.lg\:divide-yellow-700>:not(template)~:not(template){--divide-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--divide-opacity))}.lg\:divide-yellow-800>:not(template)~:not(template){--divide-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--divide-opacity))}.lg\:divide-yellow-900>:not(template)~:not(template){--divide-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--divide-opacity))}.lg\:divide-green-100>:not(template)~:not(template){--divide-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--divide-opacity))}.lg\:divide-green-200>:not(template)~:not(template){--divide-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--divide-opacity))}.lg\:divide-green-300>:not(template)~:not(template){--divide-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--divide-opacity))}.lg\:divide-green-400>:not(template)~:not(template){--divide-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--divide-opacity))}.lg\:divide-green-500>:not(template)~:not(template){--divide-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--divide-opacity))}.lg\:divide-green-600>:not(template)~:not(template){--divide-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--divide-opacity))}.lg\:divide-green-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--divide-opacity))}.lg\:divide-green-800>:not(template)~:not(template){--divide-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--divide-opacity))}.lg\:divide-green-900>:not(template)~:not(template){--divide-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--divide-opacity))}.lg\:divide-teal-100>:not(template)~:not(template){--divide-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--divide-opacity))}.lg\:divide-teal-200>:not(template)~:not(template){--divide-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--divide-opacity))}.lg\:divide-teal-300>:not(template)~:not(template){--divide-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--divide-opacity))}.lg\:divide-teal-400>:not(template)~:not(template){--divide-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--divide-opacity))}.lg\:divide-teal-500>:not(template)~:not(template){--divide-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--divide-opacity))}.lg\:divide-teal-600>:not(template)~:not(template){--divide-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--divide-opacity))}.lg\:divide-teal-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--divide-opacity))}.lg\:divide-teal-800>:not(template)~:not(template){--divide-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--divide-opacity))}.lg\:divide-teal-900>:not(template)~:not(template){--divide-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--divide-opacity))}.lg\:divide-blue-100>:not(template)~:not(template){--divide-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--divide-opacity))}.lg\:divide-blue-200>:not(template)~:not(template){--divide-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--divide-opacity))}.lg\:divide-blue-300>:not(template)~:not(template){--divide-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--divide-opacity))}.lg\:divide-blue-400>:not(template)~:not(template){--divide-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--divide-opacity))}.lg\:divide-blue-500>:not(template)~:not(template){--divide-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--divide-opacity))}.lg\:divide-blue-600>:not(template)~:not(template){--divide-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--divide-opacity))}.lg\:divide-blue-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--divide-opacity))}.lg\:divide-blue-800>:not(template)~:not(template){--divide-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--divide-opacity))}.lg\:divide-blue-900>:not(template)~:not(template){--divide-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--divide-opacity))}.lg\:divide-indigo-100>:not(template)~:not(template){--divide-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--divide-opacity))}.lg\:divide-indigo-200>:not(template)~:not(template){--divide-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--divide-opacity))}.lg\:divide-indigo-300>:not(template)~:not(template){--divide-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--divide-opacity))}.lg\:divide-indigo-400>:not(template)~:not(template){--divide-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--divide-opacity))}.lg\:divide-indigo-500>:not(template)~:not(template){--divide-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--divide-opacity))}.lg\:divide-indigo-600>:not(template)~:not(template){--divide-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--divide-opacity))}.lg\:divide-indigo-700>:not(template)~:not(template){--divide-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--divide-opacity))}.lg\:divide-indigo-800>:not(template)~:not(template){--divide-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--divide-opacity))}.lg\:divide-indigo-900>:not(template)~:not(template){--divide-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--divide-opacity))}.lg\:divide-purple-100>:not(template)~:not(template){--divide-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--divide-opacity))}.lg\:divide-purple-200>:not(template)~:not(template){--divide-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--divide-opacity))}.lg\:divide-purple-300>:not(template)~:not(template){--divide-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--divide-opacity))}.lg\:divide-purple-400>:not(template)~:not(template){--divide-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--divide-opacity))}.lg\:divide-purple-500>:not(template)~:not(template){--divide-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--divide-opacity))}.lg\:divide-purple-600>:not(template)~:not(template){--divide-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--divide-opacity))}.lg\:divide-purple-700>:not(template)~:not(template){--divide-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--divide-opacity))}.lg\:divide-purple-800>:not(template)~:not(template){--divide-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--divide-opacity))}.lg\:divide-purple-900>:not(template)~:not(template){--divide-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--divide-opacity))}.lg\:divide-pink-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--divide-opacity))}.lg\:divide-pink-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--divide-opacity))}.lg\:divide-pink-300>:not(template)~:not(template){--divide-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--divide-opacity))}.lg\:divide-pink-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--divide-opacity))}.lg\:divide-pink-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--divide-opacity))}.lg\:divide-pink-600>:not(template)~:not(template){--divide-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--divide-opacity))}.lg\:divide-pink-700>:not(template)~:not(template){--divide-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--divide-opacity))}.lg\:divide-pink-800>:not(template)~:not(template){--divide-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--divide-opacity))}.lg\:divide-pink-900>:not(template)~:not(template){--divide-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--divide-opacity))}.lg\:divide-solid>:not(template)~:not(template){border-style:solid}.lg\:divide-dashed>:not(template)~:not(template){border-style:dashed}.lg\:divide-dotted>:not(template)~:not(template){border-style:dotted}.lg\:divide-double>:not(template)~:not(template){border-style:double}.lg\:divide-none>:not(template)~:not(template){border-style:none}.lg\:divide-opacity-0>:not(template)~:not(template){--divide-opacity:0}.lg\:divide-opacity-25>:not(template)~:not(template){--divide-opacity:0.25}.lg\:divide-opacity-50>:not(template)~:not(template){--divide-opacity:0.5}.lg\:divide-opacity-75>:not(template)~:not(template){--divide-opacity:0.75}.lg\:divide-opacity-100>:not(template)~:not(template){--divide-opacity:1}.lg\:sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.lg\:not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.lg\:focus\:sr-only:focus{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.lg\:focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.lg\:appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.lg\:bg-fixed{background-attachment:fixed}.lg\:bg-local{background-attachment:local}.lg\:bg-scroll{background-attachment:scroll}.lg\:bg-clip-border{background-clip:border-box}.lg\:bg-clip-padding{background-clip:padding-box}.lg\:bg-clip-content{background-clip:content-box}.lg\:bg-clip-text{-webkit-background-clip:text;background-clip:text}.lg\:bg-transparent{background-color:transparent}.lg\:bg-current{background-color:currentColor}.lg\:bg-black{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.lg\:bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.lg\:bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.lg\:bg-gray-200{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.lg\:bg-gray-300{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.lg\:bg-gray-400{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.lg\:bg-gray-500{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.lg\:bg-gray-600{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.lg\:bg-gray-700{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.lg\:bg-gray-800{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.lg\:bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.lg\:bg-red-100{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.lg\:bg-red-200{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.lg\:bg-red-300{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.lg\:bg-red-400{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.lg\:bg-red-500{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.lg\:bg-red-600{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.lg\:bg-red-700{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.lg\:bg-red-800{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.lg\:bg-red-900{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.lg\:bg-orange-100{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.lg\:bg-orange-200{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.lg\:bg-orange-300{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.lg\:bg-orange-400{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.lg\:bg-orange-500{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.lg\:bg-orange-600{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.lg\:bg-orange-700{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.lg\:bg-orange-800{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.lg\:bg-orange-900{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.lg\:bg-yellow-100{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.lg\:bg-yellow-200{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.lg\:bg-yellow-300{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.lg\:bg-yellow-400{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.lg\:bg-yellow-500{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.lg\:bg-yellow-600{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.lg\:bg-yellow-700{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.lg\:bg-yellow-800{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.lg\:bg-yellow-900{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.lg\:bg-green-100{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.lg\:bg-green-200{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.lg\:bg-green-300{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.lg\:bg-green-400{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.lg\:bg-green-500{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.lg\:bg-green-600{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.lg\:bg-green-700{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.lg\:bg-green-800{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.lg\:bg-green-900{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.lg\:bg-teal-100{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.lg\:bg-teal-200{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.lg\:bg-teal-300{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.lg\:bg-teal-400{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.lg\:bg-teal-500{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.lg\:bg-teal-600{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.lg\:bg-teal-700{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.lg\:bg-teal-800{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.lg\:bg-teal-900{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.lg\:bg-blue-100{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.lg\:bg-blue-200{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.lg\:bg-blue-300{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.lg\:bg-blue-400{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.lg\:bg-blue-500{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.lg\:bg-blue-600{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.lg\:bg-blue-700{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.lg\:bg-blue-800{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.lg\:bg-blue-900{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.lg\:bg-indigo-100{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.lg\:bg-indigo-200{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.lg\:bg-indigo-300{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.lg\:bg-indigo-400{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.lg\:bg-indigo-500{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.lg\:bg-indigo-600{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.lg\:bg-indigo-700{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.lg\:bg-indigo-800{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.lg\:bg-indigo-900{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.lg\:bg-purple-100{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.lg\:bg-purple-200{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.lg\:bg-purple-300{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.lg\:bg-purple-400{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.lg\:bg-purple-500{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.lg\:bg-purple-600{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.lg\:bg-purple-700{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.lg\:bg-purple-800{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.lg\:bg-purple-900{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.lg\:bg-pink-100{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.lg\:bg-pink-200{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.lg\:bg-pink-300{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.lg\:bg-pink-400{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.lg\:bg-pink-500{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.lg\:bg-pink-600{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.lg\:bg-pink-700{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.lg\:bg-pink-800{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.lg\:bg-pink-900{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.lg\:hover\:bg-transparent:hover{background-color:transparent}.lg\:hover\:bg-current:hover{background-color:currentColor}.lg\:hover\:bg-black:hover{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.lg\:hover\:bg-white:hover{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.lg\:hover\:bg-gray-100:hover{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.lg\:hover\:bg-gray-200:hover{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.lg\:hover\:bg-gray-300:hover{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.lg\:hover\:bg-gray-400:hover{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.lg\:hover\:bg-gray-500:hover{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.lg\:hover\:bg-gray-600:hover{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.lg\:hover\:bg-gray-700:hover{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.lg\:hover\:bg-gray-800:hover{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.lg\:hover\:bg-gray-900:hover{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.lg\:hover\:bg-red-100:hover{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.lg\:hover\:bg-red-200:hover{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.lg\:hover\:bg-red-300:hover{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.lg\:hover\:bg-red-400:hover{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.lg\:hover\:bg-red-500:hover{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.lg\:hover\:bg-red-600:hover{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.lg\:hover\:bg-red-700:hover{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.lg\:hover\:bg-red-800:hover{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.lg\:hover\:bg-red-900:hover{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.lg\:hover\:bg-orange-100:hover{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.lg\:hover\:bg-orange-200:hover{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.lg\:hover\:bg-orange-300:hover{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.lg\:hover\:bg-orange-400:hover{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.lg\:hover\:bg-orange-500:hover{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.lg\:hover\:bg-orange-600:hover{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.lg\:hover\:bg-orange-700:hover{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.lg\:hover\:bg-orange-800:hover{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.lg\:hover\:bg-orange-900:hover{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.lg\:hover\:bg-yellow-100:hover{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.lg\:hover\:bg-yellow-200:hover{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.lg\:hover\:bg-yellow-300:hover{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.lg\:hover\:bg-yellow-400:hover{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.lg\:hover\:bg-yellow-500:hover{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.lg\:hover\:bg-yellow-600:hover{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.lg\:hover\:bg-yellow-700:hover{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.lg\:hover\:bg-yellow-800:hover{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.lg\:hover\:bg-yellow-900:hover{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.lg\:hover\:bg-green-100:hover{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.lg\:hover\:bg-green-200:hover{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.lg\:hover\:bg-green-300:hover{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.lg\:hover\:bg-green-400:hover{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.lg\:hover\:bg-green-500:hover{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.lg\:hover\:bg-green-600:hover{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.lg\:hover\:bg-green-700:hover{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.lg\:hover\:bg-green-800:hover{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.lg\:hover\:bg-green-900:hover{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.lg\:hover\:bg-teal-100:hover{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.lg\:hover\:bg-teal-200:hover{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.lg\:hover\:bg-teal-300:hover{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.lg\:hover\:bg-teal-400:hover{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.lg\:hover\:bg-teal-500:hover{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.lg\:hover\:bg-teal-600:hover{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.lg\:hover\:bg-teal-700:hover{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.lg\:hover\:bg-teal-800:hover{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.lg\:hover\:bg-teal-900:hover{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.lg\:hover\:bg-blue-100:hover{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.lg\:hover\:bg-blue-200:hover{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.lg\:hover\:bg-blue-300:hover{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.lg\:hover\:bg-blue-400:hover{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.lg\:hover\:bg-blue-500:hover{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.lg\:hover\:bg-blue-600:hover{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.lg\:hover\:bg-blue-700:hover{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.lg\:hover\:bg-blue-800:hover{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.lg\:hover\:bg-blue-900:hover{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.lg\:hover\:bg-indigo-100:hover{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.lg\:hover\:bg-indigo-200:hover{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.lg\:hover\:bg-indigo-300:hover{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.lg\:hover\:bg-indigo-400:hover{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.lg\:hover\:bg-indigo-500:hover{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.lg\:hover\:bg-indigo-600:hover{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.lg\:hover\:bg-indigo-700:hover{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.lg\:hover\:bg-indigo-800:hover{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.lg\:hover\:bg-indigo-900:hover{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.lg\:hover\:bg-purple-100:hover{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.lg\:hover\:bg-purple-200:hover{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.lg\:hover\:bg-purple-300:hover{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.lg\:hover\:bg-purple-400:hover{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.lg\:hover\:bg-purple-500:hover{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.lg\:hover\:bg-purple-600:hover{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.lg\:hover\:bg-purple-700:hover{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.lg\:hover\:bg-purple-800:hover{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.lg\:hover\:bg-purple-900:hover{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.lg\:hover\:bg-pink-100:hover{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.lg\:hover\:bg-pink-200:hover{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.lg\:hover\:bg-pink-300:hover{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.lg\:hover\:bg-pink-400:hover{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.lg\:hover\:bg-pink-500:hover{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.lg\:hover\:bg-pink-600:hover{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.lg\:hover\:bg-pink-700:hover{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.lg\:hover\:bg-pink-800:hover{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.lg\:hover\:bg-pink-900:hover{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.lg\:focus\:bg-transparent:focus{background-color:transparent}.lg\:focus\:bg-current:focus{background-color:currentColor}.lg\:focus\:bg-black:focus{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.lg\:focus\:bg-white:focus{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.lg\:focus\:bg-gray-100:focus{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.lg\:focus\:bg-gray-200:focus{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.lg\:focus\:bg-gray-300:focus{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.lg\:focus\:bg-gray-400:focus{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.lg\:focus\:bg-gray-500:focus{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.lg\:focus\:bg-gray-600:focus{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.lg\:focus\:bg-gray-700:focus{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.lg\:focus\:bg-gray-800:focus{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.lg\:focus\:bg-gray-900:focus{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.lg\:focus\:bg-red-100:focus{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.lg\:focus\:bg-red-200:focus{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.lg\:focus\:bg-red-300:focus{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.lg\:focus\:bg-red-400:focus{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.lg\:focus\:bg-red-500:focus{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.lg\:focus\:bg-red-600:focus{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.lg\:focus\:bg-red-700:focus{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.lg\:focus\:bg-red-800:focus{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.lg\:focus\:bg-red-900:focus{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.lg\:focus\:bg-orange-100:focus{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.lg\:focus\:bg-orange-200:focus{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.lg\:focus\:bg-orange-300:focus{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.lg\:focus\:bg-orange-400:focus{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.lg\:focus\:bg-orange-500:focus{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.lg\:focus\:bg-orange-600:focus{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.lg\:focus\:bg-orange-700:focus{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.lg\:focus\:bg-orange-800:focus{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.lg\:focus\:bg-orange-900:focus{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.lg\:focus\:bg-yellow-100:focus{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.lg\:focus\:bg-yellow-200:focus{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.lg\:focus\:bg-yellow-300:focus{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.lg\:focus\:bg-yellow-400:focus{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.lg\:focus\:bg-yellow-500:focus{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.lg\:focus\:bg-yellow-600:focus{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.lg\:focus\:bg-yellow-700:focus{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.lg\:focus\:bg-yellow-800:focus{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.lg\:focus\:bg-yellow-900:focus{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.lg\:focus\:bg-green-100:focus{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.lg\:focus\:bg-green-200:focus{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.lg\:focus\:bg-green-300:focus{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.lg\:focus\:bg-green-400:focus{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.lg\:focus\:bg-green-500:focus{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.lg\:focus\:bg-green-600:focus{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.lg\:focus\:bg-green-700:focus{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.lg\:focus\:bg-green-800:focus{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.lg\:focus\:bg-green-900:focus{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.lg\:focus\:bg-teal-100:focus{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.lg\:focus\:bg-teal-200:focus{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.lg\:focus\:bg-teal-300:focus{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.lg\:focus\:bg-teal-400:focus{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.lg\:focus\:bg-teal-500:focus{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.lg\:focus\:bg-teal-600:focus{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.lg\:focus\:bg-teal-700:focus{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.lg\:focus\:bg-teal-800:focus{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.lg\:focus\:bg-teal-900:focus{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.lg\:focus\:bg-blue-100:focus{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.lg\:focus\:bg-blue-200:focus{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.lg\:focus\:bg-blue-300:focus{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.lg\:focus\:bg-blue-400:focus{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.lg\:focus\:bg-blue-500:focus{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.lg\:focus\:bg-blue-600:focus{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.lg\:focus\:bg-blue-700:focus{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.lg\:focus\:bg-blue-800:focus{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.lg\:focus\:bg-blue-900:focus{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.lg\:focus\:bg-indigo-100:focus{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.lg\:focus\:bg-indigo-200:focus{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.lg\:focus\:bg-indigo-300:focus{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.lg\:focus\:bg-indigo-400:focus{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.lg\:focus\:bg-indigo-500:focus{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.lg\:focus\:bg-indigo-600:focus{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.lg\:focus\:bg-indigo-700:focus{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.lg\:focus\:bg-indigo-800:focus{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.lg\:focus\:bg-indigo-900:focus{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.lg\:focus\:bg-purple-100:focus{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.lg\:focus\:bg-purple-200:focus{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.lg\:focus\:bg-purple-300:focus{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.lg\:focus\:bg-purple-400:focus{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.lg\:focus\:bg-purple-500:focus{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.lg\:focus\:bg-purple-600:focus{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.lg\:focus\:bg-purple-700:focus{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.lg\:focus\:bg-purple-800:focus{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.lg\:focus\:bg-purple-900:focus{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.lg\:focus\:bg-pink-100:focus{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.lg\:focus\:bg-pink-200:focus{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.lg\:focus\:bg-pink-300:focus{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.lg\:focus\:bg-pink-400:focus{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.lg\:focus\:bg-pink-500:focus{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.lg\:focus\:bg-pink-600:focus{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.lg\:focus\:bg-pink-700:focus{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.lg\:focus\:bg-pink-800:focus{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.lg\:focus\:bg-pink-900:focus{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.lg\:bg-none{background-image:none}.lg\:bg-gradient-to-t{background-image:linear-gradient(to top,var(--gradient-color-stops))}.lg\:bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--gradient-color-stops))}.lg\:bg-gradient-to-r{background-image:linear-gradient(to right,var(--gradient-color-stops))}.lg\:bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--gradient-color-stops))}.lg\:bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--gradient-color-stops))}.lg\:bg-gradient-to-bl{background-image:linear-gradient(to bottom left,var(--gradient-color-stops))}.lg\:bg-gradient-to-l{background-image:linear-gradient(to left,var(--gradient-color-stops))}.lg\:bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--gradient-color-stops))}.lg\:from-transparent{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:from-current{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:from-black{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:from-white{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:from-gray-100{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.lg\:from-gray-200{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.lg\:from-gray-300{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.lg\:from-gray-400{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.lg\:from-gray-500{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.lg\:from-gray-600{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.lg\:from-gray-700{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.lg\:from-gray-800{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.lg\:from-gray-900{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.lg\:from-red-100{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.lg\:from-red-200{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.lg\:from-red-300{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.lg\:from-red-400{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.lg\:from-red-500{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.lg\:from-red-600{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.lg\:from-red-700{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.lg\:from-red-800{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.lg\:from-red-900{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.lg\:from-orange-100{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.lg\:from-orange-200{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.lg\:from-orange-300{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.lg\:from-orange-400{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.lg\:from-orange-500{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.lg\:from-orange-600{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.lg\:from-orange-700{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.lg\:from-orange-800{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.lg\:from-orange-900{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.lg\:from-yellow-100{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.lg\:from-yellow-200{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.lg\:from-yellow-300{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.lg\:from-yellow-400{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.lg\:from-yellow-500{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.lg\:from-yellow-600{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.lg\:from-yellow-700{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.lg\:from-yellow-800{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.lg\:from-yellow-900{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.lg\:from-green-100{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.lg\:from-green-200{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.lg\:from-green-300{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.lg\:from-green-400{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.lg\:from-green-500{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.lg\:from-green-600{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.lg\:from-green-700{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.lg\:from-green-800{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.lg\:from-green-900{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.lg\:from-teal-100{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.lg\:from-teal-200{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.lg\:from-teal-300{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.lg\:from-teal-400{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.lg\:from-teal-500{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.lg\:from-teal-600{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.lg\:from-teal-700{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.lg\:from-teal-800{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.lg\:from-teal-900{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.lg\:from-blue-100{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.lg\:from-blue-200{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.lg\:from-blue-300{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.lg\:from-blue-400{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.lg\:from-blue-500{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.lg\:from-blue-600{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.lg\:from-blue-700{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.lg\:from-blue-800{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.lg\:from-blue-900{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.lg\:from-indigo-100{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.lg\:from-indigo-200{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.lg\:from-indigo-300{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.lg\:from-indigo-400{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.lg\:from-indigo-500{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.lg\:from-indigo-600{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.lg\:from-indigo-700{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.lg\:from-indigo-800{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.lg\:from-indigo-900{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.lg\:from-purple-100{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.lg\:from-purple-200{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.lg\:from-purple-300{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.lg\:from-purple-400{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.lg\:from-purple-500{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.lg\:from-purple-600{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.lg\:from-purple-700{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.lg\:from-purple-800{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.lg\:from-purple-900{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.lg\:from-pink-100{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.lg\:from-pink-200{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.lg\:from-pink-300{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.lg\:from-pink-400{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.lg\:from-pink-500{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.lg\:from-pink-600{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.lg\:from-pink-700{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.lg\:from-pink-800{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.lg\:from-pink-900{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.lg\:via-transparent{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:via-current{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:via-black{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:via-white{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:via-gray-100{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.lg\:via-gray-200{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.lg\:via-gray-300{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.lg\:via-gray-400{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.lg\:via-gray-500{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.lg\:via-gray-600{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.lg\:via-gray-700{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.lg\:via-gray-800{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.lg\:via-gray-900{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.lg\:via-red-100{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.lg\:via-red-200{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.lg\:via-red-300{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.lg\:via-red-400{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.lg\:via-red-500{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.lg\:via-red-600{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.lg\:via-red-700{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.lg\:via-red-800{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.lg\:via-red-900{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.lg\:via-orange-100{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.lg\:via-orange-200{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.lg\:via-orange-300{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.lg\:via-orange-400{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.lg\:via-orange-500{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.lg\:via-orange-600{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.lg\:via-orange-700{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.lg\:via-orange-800{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.lg\:via-orange-900{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.lg\:via-yellow-100{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.lg\:via-yellow-200{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.lg\:via-yellow-300{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.lg\:via-yellow-400{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.lg\:via-yellow-500{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.lg\:via-yellow-600{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.lg\:via-yellow-700{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.lg\:via-yellow-800{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.lg\:via-yellow-900{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.lg\:via-green-100{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.lg\:via-green-200{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.lg\:via-green-300{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.lg\:via-green-400{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.lg\:via-green-500{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.lg\:via-green-600{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.lg\:via-green-700{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.lg\:via-green-800{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.lg\:via-green-900{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.lg\:via-teal-100{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.lg\:via-teal-200{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.lg\:via-teal-300{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.lg\:via-teal-400{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.lg\:via-teal-500{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.lg\:via-teal-600{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.lg\:via-teal-700{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.lg\:via-teal-800{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.lg\:via-teal-900{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.lg\:via-blue-100{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.lg\:via-blue-200{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.lg\:via-blue-300{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.lg\:via-blue-400{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.lg\:via-blue-500{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.lg\:via-blue-600{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.lg\:via-blue-700{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.lg\:via-blue-800{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.lg\:via-blue-900{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.lg\:via-indigo-100{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.lg\:via-indigo-200{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.lg\:via-indigo-300{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.lg\:via-indigo-400{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.lg\:via-indigo-500{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.lg\:via-indigo-600{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.lg\:via-indigo-700{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.lg\:via-indigo-800{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.lg\:via-indigo-900{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.lg\:via-purple-100{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.lg\:via-purple-200{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.lg\:via-purple-300{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.lg\:via-purple-400{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.lg\:via-purple-500{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.lg\:via-purple-600{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.lg\:via-purple-700{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.lg\:via-purple-800{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.lg\:via-purple-900{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.lg\:via-pink-100{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.lg\:via-pink-200{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.lg\:via-pink-300{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.lg\:via-pink-400{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.lg\:via-pink-500{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.lg\:via-pink-600{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.lg\:via-pink-700{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.lg\:via-pink-800{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.lg\:via-pink-900{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.lg\:to-transparent{--gradient-to-color:transparent}.lg\:to-current{--gradient-to-color:currentColor}.lg\:to-black{--gradient-to-color:#000}.lg\:to-white{--gradient-to-color:#fff}.lg\:to-gray-100{--gradient-to-color:#f7fafc}.lg\:to-gray-200{--gradient-to-color:#edf2f7}.lg\:to-gray-300{--gradient-to-color:#e2e8f0}.lg\:to-gray-400{--gradient-to-color:#cbd5e0}.lg\:to-gray-500{--gradient-to-color:#a0aec0}.lg\:to-gray-600{--gradient-to-color:#718096}.lg\:to-gray-700{--gradient-to-color:#4a5568}.lg\:to-gray-800{--gradient-to-color:#2d3748}.lg\:to-gray-900{--gradient-to-color:#1a202c}.lg\:to-red-100{--gradient-to-color:#fff5f5}.lg\:to-red-200{--gradient-to-color:#fed7d7}.lg\:to-red-300{--gradient-to-color:#feb2b2}.lg\:to-red-400{--gradient-to-color:#fc8181}.lg\:to-red-500{--gradient-to-color:#f56565}.lg\:to-red-600{--gradient-to-color:#e53e3e}.lg\:to-red-700{--gradient-to-color:#c53030}.lg\:to-red-800{--gradient-to-color:#9b2c2c}.lg\:to-red-900{--gradient-to-color:#742a2a}.lg\:to-orange-100{--gradient-to-color:#fffaf0}.lg\:to-orange-200{--gradient-to-color:#feebc8}.lg\:to-orange-300{--gradient-to-color:#fbd38d}.lg\:to-orange-400{--gradient-to-color:#f6ad55}.lg\:to-orange-500{--gradient-to-color:#ed8936}.lg\:to-orange-600{--gradient-to-color:#dd6b20}.lg\:to-orange-700{--gradient-to-color:#c05621}.lg\:to-orange-800{--gradient-to-color:#9c4221}.lg\:to-orange-900{--gradient-to-color:#7b341e}.lg\:to-yellow-100{--gradient-to-color:#fffff0}.lg\:to-yellow-200{--gradient-to-color:#fefcbf}.lg\:to-yellow-300{--gradient-to-color:#faf089}.lg\:to-yellow-400{--gradient-to-color:#f6e05e}.lg\:to-yellow-500{--gradient-to-color:#ecc94b}.lg\:to-yellow-600{--gradient-to-color:#d69e2e}.lg\:to-yellow-700{--gradient-to-color:#b7791f}.lg\:to-yellow-800{--gradient-to-color:#975a16}.lg\:to-yellow-900{--gradient-to-color:#744210}.lg\:to-green-100{--gradient-to-color:#f0fff4}.lg\:to-green-200{--gradient-to-color:#c6f6d5}.lg\:to-green-300{--gradient-to-color:#9ae6b4}.lg\:to-green-400{--gradient-to-color:#68d391}.lg\:to-green-500{--gradient-to-color:#48bb78}.lg\:to-green-600{--gradient-to-color:#38a169}.lg\:to-green-700{--gradient-to-color:#2f855a}.lg\:to-green-800{--gradient-to-color:#276749}.lg\:to-green-900{--gradient-to-color:#22543d}.lg\:to-teal-100{--gradient-to-color:#e6fffa}.lg\:to-teal-200{--gradient-to-color:#b2f5ea}.lg\:to-teal-300{--gradient-to-color:#81e6d9}.lg\:to-teal-400{--gradient-to-color:#4fd1c5}.lg\:to-teal-500{--gradient-to-color:#38b2ac}.lg\:to-teal-600{--gradient-to-color:#319795}.lg\:to-teal-700{--gradient-to-color:#2c7a7b}.lg\:to-teal-800{--gradient-to-color:#285e61}.lg\:to-teal-900{--gradient-to-color:#234e52}.lg\:to-blue-100{--gradient-to-color:#ebf8ff}.lg\:to-blue-200{--gradient-to-color:#bee3f8}.lg\:to-blue-300{--gradient-to-color:#90cdf4}.lg\:to-blue-400{--gradient-to-color:#63b3ed}.lg\:to-blue-500{--gradient-to-color:#4299e1}.lg\:to-blue-600{--gradient-to-color:#3182ce}.lg\:to-blue-700{--gradient-to-color:#2b6cb0}.lg\:to-blue-800{--gradient-to-color:#2c5282}.lg\:to-blue-900{--gradient-to-color:#2a4365}.lg\:to-indigo-100{--gradient-to-color:#ebf4ff}.lg\:to-indigo-200{--gradient-to-color:#c3dafe}.lg\:to-indigo-300{--gradient-to-color:#a3bffa}.lg\:to-indigo-400{--gradient-to-color:#7f9cf5}.lg\:to-indigo-500{--gradient-to-color:#667eea}.lg\:to-indigo-600{--gradient-to-color:#5a67d8}.lg\:to-indigo-700{--gradient-to-color:#4c51bf}.lg\:to-indigo-800{--gradient-to-color:#434190}.lg\:to-indigo-900{--gradient-to-color:#3c366b}.lg\:to-purple-100{--gradient-to-color:#faf5ff}.lg\:to-purple-200{--gradient-to-color:#e9d8fd}.lg\:to-purple-300{--gradient-to-color:#d6bcfa}.lg\:to-purple-400{--gradient-to-color:#b794f4}.lg\:to-purple-500{--gradient-to-color:#9f7aea}.lg\:to-purple-600{--gradient-to-color:#805ad5}.lg\:to-purple-700{--gradient-to-color:#6b46c1}.lg\:to-purple-800{--gradient-to-color:#553c9a}.lg\:to-purple-900{--gradient-to-color:#44337a}.lg\:to-pink-100{--gradient-to-color:#fff5f7}.lg\:to-pink-200{--gradient-to-color:#fed7e2}.lg\:to-pink-300{--gradient-to-color:#fbb6ce}.lg\:to-pink-400{--gradient-to-color:#f687b3}.lg\:to-pink-500{--gradient-to-color:#ed64a6}.lg\:to-pink-600{--gradient-to-color:#d53f8c}.lg\:to-pink-700{--gradient-to-color:#b83280}.lg\:to-pink-800{--gradient-to-color:#97266d}.lg\:to-pink-900{--gradient-to-color:#702459}.lg\:hover\:from-transparent:hover{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:hover\:from-current:hover{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:hover\:from-black:hover{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:hover\:from-white:hover{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:hover\:from-gray-100:hover{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.lg\:hover\:from-gray-200:hover{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.lg\:hover\:from-gray-300:hover{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.lg\:hover\:from-gray-400:hover{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.lg\:hover\:from-gray-500:hover{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.lg\:hover\:from-gray-600:hover{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.lg\:hover\:from-gray-700:hover{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.lg\:hover\:from-gray-800:hover{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.lg\:hover\:from-gray-900:hover{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.lg\:hover\:from-red-100:hover{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.lg\:hover\:from-red-200:hover{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.lg\:hover\:from-red-300:hover{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.lg\:hover\:from-red-400:hover{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.lg\:hover\:from-red-500:hover{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.lg\:hover\:from-red-600:hover{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.lg\:hover\:from-red-700:hover{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.lg\:hover\:from-red-800:hover{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.lg\:hover\:from-red-900:hover{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.lg\:hover\:from-orange-100:hover{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.lg\:hover\:from-orange-200:hover{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.lg\:hover\:from-orange-300:hover{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.lg\:hover\:from-orange-400:hover{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.lg\:hover\:from-orange-500:hover{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.lg\:hover\:from-orange-600:hover{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.lg\:hover\:from-orange-700:hover{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.lg\:hover\:from-orange-800:hover{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.lg\:hover\:from-orange-900:hover{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.lg\:hover\:from-yellow-100:hover{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.lg\:hover\:from-yellow-200:hover{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.lg\:hover\:from-yellow-300:hover{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.lg\:hover\:from-yellow-400:hover{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.lg\:hover\:from-yellow-500:hover{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.lg\:hover\:from-yellow-600:hover{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.lg\:hover\:from-yellow-700:hover{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.lg\:hover\:from-yellow-800:hover{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.lg\:hover\:from-yellow-900:hover{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.lg\:hover\:from-green-100:hover{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.lg\:hover\:from-green-200:hover{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.lg\:hover\:from-green-300:hover{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.lg\:hover\:from-green-400:hover{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.lg\:hover\:from-green-500:hover{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.lg\:hover\:from-green-600:hover{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.lg\:hover\:from-green-700:hover{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.lg\:hover\:from-green-800:hover{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.lg\:hover\:from-green-900:hover{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.lg\:hover\:from-teal-100:hover{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.lg\:hover\:from-teal-200:hover{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.lg\:hover\:from-teal-300:hover{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.lg\:hover\:from-teal-400:hover{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.lg\:hover\:from-teal-500:hover{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.lg\:hover\:from-teal-600:hover{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.lg\:hover\:from-teal-700:hover{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.lg\:hover\:from-teal-800:hover{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.lg\:hover\:from-teal-900:hover{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.lg\:hover\:from-blue-100:hover{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.lg\:hover\:from-blue-200:hover{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.lg\:hover\:from-blue-300:hover{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.lg\:hover\:from-blue-400:hover{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.lg\:hover\:from-blue-500:hover{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.lg\:hover\:from-blue-600:hover{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.lg\:hover\:from-blue-700:hover{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.lg\:hover\:from-blue-800:hover{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.lg\:hover\:from-blue-900:hover{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.lg\:hover\:from-indigo-100:hover{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.lg\:hover\:from-indigo-200:hover{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.lg\:hover\:from-indigo-300:hover{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.lg\:hover\:from-indigo-400:hover{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.lg\:hover\:from-indigo-500:hover{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.lg\:hover\:from-indigo-600:hover{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.lg\:hover\:from-indigo-700:hover{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.lg\:hover\:from-indigo-800:hover{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.lg\:hover\:from-indigo-900:hover{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.lg\:hover\:from-purple-100:hover{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.lg\:hover\:from-purple-200:hover{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.lg\:hover\:from-purple-300:hover{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.lg\:hover\:from-purple-400:hover{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.lg\:hover\:from-purple-500:hover{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.lg\:hover\:from-purple-600:hover{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.lg\:hover\:from-purple-700:hover{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.lg\:hover\:from-purple-800:hover{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.lg\:hover\:from-purple-900:hover{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.lg\:hover\:from-pink-100:hover{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.lg\:hover\:from-pink-200:hover{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.lg\:hover\:from-pink-300:hover{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.lg\:hover\:from-pink-400:hover{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.lg\:hover\:from-pink-500:hover{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.lg\:hover\:from-pink-600:hover{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.lg\:hover\:from-pink-700:hover{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.lg\:hover\:from-pink-800:hover{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.lg\:hover\:from-pink-900:hover{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.lg\:hover\:via-transparent:hover{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:hover\:via-current:hover{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:hover\:via-black:hover{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:hover\:via-white:hover{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:hover\:via-gray-100:hover{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.lg\:hover\:via-gray-200:hover{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.lg\:hover\:via-gray-300:hover{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.lg\:hover\:via-gray-400:hover{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.lg\:hover\:via-gray-500:hover{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.lg\:hover\:via-gray-600:hover{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.lg\:hover\:via-gray-700:hover{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.lg\:hover\:via-gray-800:hover{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.lg\:hover\:via-gray-900:hover{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.lg\:hover\:via-red-100:hover{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.lg\:hover\:via-red-200:hover{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.lg\:hover\:via-red-300:hover{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.lg\:hover\:via-red-400:hover{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.lg\:hover\:via-red-500:hover{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.lg\:hover\:via-red-600:hover{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.lg\:hover\:via-red-700:hover{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.lg\:hover\:via-red-800:hover{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.lg\:hover\:via-red-900:hover{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.lg\:hover\:via-orange-100:hover{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.lg\:hover\:via-orange-200:hover{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.lg\:hover\:via-orange-300:hover{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.lg\:hover\:via-orange-400:hover{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.lg\:hover\:via-orange-500:hover{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.lg\:hover\:via-orange-600:hover{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.lg\:hover\:via-orange-700:hover{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.lg\:hover\:via-orange-800:hover{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.lg\:hover\:via-orange-900:hover{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.lg\:hover\:via-yellow-100:hover{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.lg\:hover\:via-yellow-200:hover{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.lg\:hover\:via-yellow-300:hover{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.lg\:hover\:via-yellow-400:hover{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.lg\:hover\:via-yellow-500:hover{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.lg\:hover\:via-yellow-600:hover{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.lg\:hover\:via-yellow-700:hover{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.lg\:hover\:via-yellow-800:hover{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.lg\:hover\:via-yellow-900:hover{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.lg\:hover\:via-green-100:hover{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.lg\:hover\:via-green-200:hover{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.lg\:hover\:via-green-300:hover{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.lg\:hover\:via-green-400:hover{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.lg\:hover\:via-green-500:hover{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.lg\:hover\:via-green-600:hover{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.lg\:hover\:via-green-700:hover{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.lg\:hover\:via-green-800:hover{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.lg\:hover\:via-green-900:hover{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.lg\:hover\:via-teal-100:hover{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.lg\:hover\:via-teal-200:hover{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.lg\:hover\:via-teal-300:hover{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.lg\:hover\:via-teal-400:hover{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.lg\:hover\:via-teal-500:hover{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.lg\:hover\:via-teal-600:hover{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.lg\:hover\:via-teal-700:hover{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.lg\:hover\:via-teal-800:hover{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.lg\:hover\:via-teal-900:hover{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.lg\:hover\:via-blue-100:hover{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.lg\:hover\:via-blue-200:hover{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.lg\:hover\:via-blue-300:hover{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.lg\:hover\:via-blue-400:hover{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.lg\:hover\:via-blue-500:hover{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.lg\:hover\:via-blue-600:hover{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.lg\:hover\:via-blue-700:hover{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.lg\:hover\:via-blue-800:hover{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.lg\:hover\:via-blue-900:hover{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.lg\:hover\:via-indigo-100:hover{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.lg\:hover\:via-indigo-200:hover{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.lg\:hover\:via-indigo-300:hover{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.lg\:hover\:via-indigo-400:hover{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.lg\:hover\:via-indigo-500:hover{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.lg\:hover\:via-indigo-600:hover{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.lg\:hover\:via-indigo-700:hover{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.lg\:hover\:via-indigo-800:hover{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.lg\:hover\:via-indigo-900:hover{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.lg\:hover\:via-purple-100:hover{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.lg\:hover\:via-purple-200:hover{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.lg\:hover\:via-purple-300:hover{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.lg\:hover\:via-purple-400:hover{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.lg\:hover\:via-purple-500:hover{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.lg\:hover\:via-purple-600:hover{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.lg\:hover\:via-purple-700:hover{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.lg\:hover\:via-purple-800:hover{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.lg\:hover\:via-purple-900:hover{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.lg\:hover\:via-pink-100:hover{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.lg\:hover\:via-pink-200:hover{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.lg\:hover\:via-pink-300:hover{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.lg\:hover\:via-pink-400:hover{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.lg\:hover\:via-pink-500:hover{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.lg\:hover\:via-pink-600:hover{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.lg\:hover\:via-pink-700:hover{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.lg\:hover\:via-pink-800:hover{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.lg\:hover\:via-pink-900:hover{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.lg\:hover\:to-transparent:hover{--gradient-to-color:transparent}.lg\:hover\:to-current:hover{--gradient-to-color:currentColor}.lg\:hover\:to-black:hover{--gradient-to-color:#000}.lg\:hover\:to-white:hover{--gradient-to-color:#fff}.lg\:hover\:to-gray-100:hover{--gradient-to-color:#f7fafc}.lg\:hover\:to-gray-200:hover{--gradient-to-color:#edf2f7}.lg\:hover\:to-gray-300:hover{--gradient-to-color:#e2e8f0}.lg\:hover\:to-gray-400:hover{--gradient-to-color:#cbd5e0}.lg\:hover\:to-gray-500:hover{--gradient-to-color:#a0aec0}.lg\:hover\:to-gray-600:hover{--gradient-to-color:#718096}.lg\:hover\:to-gray-700:hover{--gradient-to-color:#4a5568}.lg\:hover\:to-gray-800:hover{--gradient-to-color:#2d3748}.lg\:hover\:to-gray-900:hover{--gradient-to-color:#1a202c}.lg\:hover\:to-red-100:hover{--gradient-to-color:#fff5f5}.lg\:hover\:to-red-200:hover{--gradient-to-color:#fed7d7}.lg\:hover\:to-red-300:hover{--gradient-to-color:#feb2b2}.lg\:hover\:to-red-400:hover{--gradient-to-color:#fc8181}.lg\:hover\:to-red-500:hover{--gradient-to-color:#f56565}.lg\:hover\:to-red-600:hover{--gradient-to-color:#e53e3e}.lg\:hover\:to-red-700:hover{--gradient-to-color:#c53030}.lg\:hover\:to-red-800:hover{--gradient-to-color:#9b2c2c}.lg\:hover\:to-red-900:hover{--gradient-to-color:#742a2a}.lg\:hover\:to-orange-100:hover{--gradient-to-color:#fffaf0}.lg\:hover\:to-orange-200:hover{--gradient-to-color:#feebc8}.lg\:hover\:to-orange-300:hover{--gradient-to-color:#fbd38d}.lg\:hover\:to-orange-400:hover{--gradient-to-color:#f6ad55}.lg\:hover\:to-orange-500:hover{--gradient-to-color:#ed8936}.lg\:hover\:to-orange-600:hover{--gradient-to-color:#dd6b20}.lg\:hover\:to-orange-700:hover{--gradient-to-color:#c05621}.lg\:hover\:to-orange-800:hover{--gradient-to-color:#9c4221}.lg\:hover\:to-orange-900:hover{--gradient-to-color:#7b341e}.lg\:hover\:to-yellow-100:hover{--gradient-to-color:#fffff0}.lg\:hover\:to-yellow-200:hover{--gradient-to-color:#fefcbf}.lg\:hover\:to-yellow-300:hover{--gradient-to-color:#faf089}.lg\:hover\:to-yellow-400:hover{--gradient-to-color:#f6e05e}.lg\:hover\:to-yellow-500:hover{--gradient-to-color:#ecc94b}.lg\:hover\:to-yellow-600:hover{--gradient-to-color:#d69e2e}.lg\:hover\:to-yellow-700:hover{--gradient-to-color:#b7791f}.lg\:hover\:to-yellow-800:hover{--gradient-to-color:#975a16}.lg\:hover\:to-yellow-900:hover{--gradient-to-color:#744210}.lg\:hover\:to-green-100:hover{--gradient-to-color:#f0fff4}.lg\:hover\:to-green-200:hover{--gradient-to-color:#c6f6d5}.lg\:hover\:to-green-300:hover{--gradient-to-color:#9ae6b4}.lg\:hover\:to-green-400:hover{--gradient-to-color:#68d391}.lg\:hover\:to-green-500:hover{--gradient-to-color:#48bb78}.lg\:hover\:to-green-600:hover{--gradient-to-color:#38a169}.lg\:hover\:to-green-700:hover{--gradient-to-color:#2f855a}.lg\:hover\:to-green-800:hover{--gradient-to-color:#276749}.lg\:hover\:to-green-900:hover{--gradient-to-color:#22543d}.lg\:hover\:to-teal-100:hover{--gradient-to-color:#e6fffa}.lg\:hover\:to-teal-200:hover{--gradient-to-color:#b2f5ea}.lg\:hover\:to-teal-300:hover{--gradient-to-color:#81e6d9}.lg\:hover\:to-teal-400:hover{--gradient-to-color:#4fd1c5}.lg\:hover\:to-teal-500:hover{--gradient-to-color:#38b2ac}.lg\:hover\:to-teal-600:hover{--gradient-to-color:#319795}.lg\:hover\:to-teal-700:hover{--gradient-to-color:#2c7a7b}.lg\:hover\:to-teal-800:hover{--gradient-to-color:#285e61}.lg\:hover\:to-teal-900:hover{--gradient-to-color:#234e52}.lg\:hover\:to-blue-100:hover{--gradient-to-color:#ebf8ff}.lg\:hover\:to-blue-200:hover{--gradient-to-color:#bee3f8}.lg\:hover\:to-blue-300:hover{--gradient-to-color:#90cdf4}.lg\:hover\:to-blue-400:hover{--gradient-to-color:#63b3ed}.lg\:hover\:to-blue-500:hover{--gradient-to-color:#4299e1}.lg\:hover\:to-blue-600:hover{--gradient-to-color:#3182ce}.lg\:hover\:to-blue-700:hover{--gradient-to-color:#2b6cb0}.lg\:hover\:to-blue-800:hover{--gradient-to-color:#2c5282}.lg\:hover\:to-blue-900:hover{--gradient-to-color:#2a4365}.lg\:hover\:to-indigo-100:hover{--gradient-to-color:#ebf4ff}.lg\:hover\:to-indigo-200:hover{--gradient-to-color:#c3dafe}.lg\:hover\:to-indigo-300:hover{--gradient-to-color:#a3bffa}.lg\:hover\:to-indigo-400:hover{--gradient-to-color:#7f9cf5}.lg\:hover\:to-indigo-500:hover{--gradient-to-color:#667eea}.lg\:hover\:to-indigo-600:hover{--gradient-to-color:#5a67d8}.lg\:hover\:to-indigo-700:hover{--gradient-to-color:#4c51bf}.lg\:hover\:to-indigo-800:hover{--gradient-to-color:#434190}.lg\:hover\:to-indigo-900:hover{--gradient-to-color:#3c366b}.lg\:hover\:to-purple-100:hover{--gradient-to-color:#faf5ff}.lg\:hover\:to-purple-200:hover{--gradient-to-color:#e9d8fd}.lg\:hover\:to-purple-300:hover{--gradient-to-color:#d6bcfa}.lg\:hover\:to-purple-400:hover{--gradient-to-color:#b794f4}.lg\:hover\:to-purple-500:hover{--gradient-to-color:#9f7aea}.lg\:hover\:to-purple-600:hover{--gradient-to-color:#805ad5}.lg\:hover\:to-purple-700:hover{--gradient-to-color:#6b46c1}.lg\:hover\:to-purple-800:hover{--gradient-to-color:#553c9a}.lg\:hover\:to-purple-900:hover{--gradient-to-color:#44337a}.lg\:hover\:to-pink-100:hover{--gradient-to-color:#fff5f7}.lg\:hover\:to-pink-200:hover{--gradient-to-color:#fed7e2}.lg\:hover\:to-pink-300:hover{--gradient-to-color:#fbb6ce}.lg\:hover\:to-pink-400:hover{--gradient-to-color:#f687b3}.lg\:hover\:to-pink-500:hover{--gradient-to-color:#ed64a6}.lg\:hover\:to-pink-600:hover{--gradient-to-color:#d53f8c}.lg\:hover\:to-pink-700:hover{--gradient-to-color:#b83280}.lg\:hover\:to-pink-800:hover{--gradient-to-color:#97266d}.lg\:hover\:to-pink-900:hover{--gradient-to-color:#702459}.lg\:focus\:from-transparent:focus{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:focus\:from-current:focus{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:focus\:from-black:focus{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:focus\:from-white:focus{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:focus\:from-gray-100:focus{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.lg\:focus\:from-gray-200:focus{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.lg\:focus\:from-gray-300:focus{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.lg\:focus\:from-gray-400:focus{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.lg\:focus\:from-gray-500:focus{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.lg\:focus\:from-gray-600:focus{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.lg\:focus\:from-gray-700:focus{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.lg\:focus\:from-gray-800:focus{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.lg\:focus\:from-gray-900:focus{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.lg\:focus\:from-red-100:focus{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.lg\:focus\:from-red-200:focus{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.lg\:focus\:from-red-300:focus{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.lg\:focus\:from-red-400:focus{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.lg\:focus\:from-red-500:focus{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.lg\:focus\:from-red-600:focus{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.lg\:focus\:from-red-700:focus{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.lg\:focus\:from-red-800:focus{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.lg\:focus\:from-red-900:focus{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.lg\:focus\:from-orange-100:focus{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.lg\:focus\:from-orange-200:focus{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.lg\:focus\:from-orange-300:focus{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.lg\:focus\:from-orange-400:focus{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.lg\:focus\:from-orange-500:focus{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.lg\:focus\:from-orange-600:focus{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.lg\:focus\:from-orange-700:focus{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.lg\:focus\:from-orange-800:focus{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.lg\:focus\:from-orange-900:focus{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.lg\:focus\:from-yellow-100:focus{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.lg\:focus\:from-yellow-200:focus{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.lg\:focus\:from-yellow-300:focus{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.lg\:focus\:from-yellow-400:focus{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.lg\:focus\:from-yellow-500:focus{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.lg\:focus\:from-yellow-600:focus{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.lg\:focus\:from-yellow-700:focus{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.lg\:focus\:from-yellow-800:focus{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.lg\:focus\:from-yellow-900:focus{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.lg\:focus\:from-green-100:focus{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.lg\:focus\:from-green-200:focus{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.lg\:focus\:from-green-300:focus{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.lg\:focus\:from-green-400:focus{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.lg\:focus\:from-green-500:focus{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.lg\:focus\:from-green-600:focus{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.lg\:focus\:from-green-700:focus{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.lg\:focus\:from-green-800:focus{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.lg\:focus\:from-green-900:focus{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.lg\:focus\:from-teal-100:focus{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.lg\:focus\:from-teal-200:focus{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.lg\:focus\:from-teal-300:focus{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.lg\:focus\:from-teal-400:focus{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.lg\:focus\:from-teal-500:focus{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.lg\:focus\:from-teal-600:focus{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.lg\:focus\:from-teal-700:focus{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.lg\:focus\:from-teal-800:focus{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.lg\:focus\:from-teal-900:focus{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.lg\:focus\:from-blue-100:focus{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.lg\:focus\:from-blue-200:focus{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.lg\:focus\:from-blue-300:focus{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.lg\:focus\:from-blue-400:focus{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.lg\:focus\:from-blue-500:focus{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.lg\:focus\:from-blue-600:focus{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.lg\:focus\:from-blue-700:focus{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.lg\:focus\:from-blue-800:focus{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.lg\:focus\:from-blue-900:focus{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.lg\:focus\:from-indigo-100:focus{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.lg\:focus\:from-indigo-200:focus{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.lg\:focus\:from-indigo-300:focus{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.lg\:focus\:from-indigo-400:focus{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.lg\:focus\:from-indigo-500:focus{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.lg\:focus\:from-indigo-600:focus{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.lg\:focus\:from-indigo-700:focus{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.lg\:focus\:from-indigo-800:focus{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.lg\:focus\:from-indigo-900:focus{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.lg\:focus\:from-purple-100:focus{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.lg\:focus\:from-purple-200:focus{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.lg\:focus\:from-purple-300:focus{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.lg\:focus\:from-purple-400:focus{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.lg\:focus\:from-purple-500:focus{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.lg\:focus\:from-purple-600:focus{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.lg\:focus\:from-purple-700:focus{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.lg\:focus\:from-purple-800:focus{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.lg\:focus\:from-purple-900:focus{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.lg\:focus\:from-pink-100:focus{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.lg\:focus\:from-pink-200:focus{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.lg\:focus\:from-pink-300:focus{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.lg\:focus\:from-pink-400:focus{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.lg\:focus\:from-pink-500:focus{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.lg\:focus\:from-pink-600:focus{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.lg\:focus\:from-pink-700:focus{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.lg\:focus\:from-pink-800:focus{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.lg\:focus\:from-pink-900:focus{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.lg\:focus\:via-transparent:focus{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:focus\:via-current:focus{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:focus\:via-black:focus{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.lg\:focus\:via-white:focus{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.lg\:focus\:via-gray-100:focus{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.lg\:focus\:via-gray-200:focus{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.lg\:focus\:via-gray-300:focus{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.lg\:focus\:via-gray-400:focus{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.lg\:focus\:via-gray-500:focus{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.lg\:focus\:via-gray-600:focus{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.lg\:focus\:via-gray-700:focus{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.lg\:focus\:via-gray-800:focus{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.lg\:focus\:via-gray-900:focus{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.lg\:focus\:via-red-100:focus{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.lg\:focus\:via-red-200:focus{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.lg\:focus\:via-red-300:focus{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.lg\:focus\:via-red-400:focus{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.lg\:focus\:via-red-500:focus{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.lg\:focus\:via-red-600:focus{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.lg\:focus\:via-red-700:focus{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.lg\:focus\:via-red-800:focus{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.lg\:focus\:via-red-900:focus{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.lg\:focus\:via-orange-100:focus{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.lg\:focus\:via-orange-200:focus{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.lg\:focus\:via-orange-300:focus{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.lg\:focus\:via-orange-400:focus{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.lg\:focus\:via-orange-500:focus{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.lg\:focus\:via-orange-600:focus{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.lg\:focus\:via-orange-700:focus{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.lg\:focus\:via-orange-800:focus{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.lg\:focus\:via-orange-900:focus{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.lg\:focus\:via-yellow-100:focus{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.lg\:focus\:via-yellow-200:focus{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.lg\:focus\:via-yellow-300:focus{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.lg\:focus\:via-yellow-400:focus{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.lg\:focus\:via-yellow-500:focus{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.lg\:focus\:via-yellow-600:focus{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.lg\:focus\:via-yellow-700:focus{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.lg\:focus\:via-yellow-800:focus{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.lg\:focus\:via-yellow-900:focus{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.lg\:focus\:via-green-100:focus{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.lg\:focus\:via-green-200:focus{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.lg\:focus\:via-green-300:focus{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.lg\:focus\:via-green-400:focus{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.lg\:focus\:via-green-500:focus{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.lg\:focus\:via-green-600:focus{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.lg\:focus\:via-green-700:focus{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.lg\:focus\:via-green-800:focus{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.lg\:focus\:via-green-900:focus{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.lg\:focus\:via-teal-100:focus{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.lg\:focus\:via-teal-200:focus{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.lg\:focus\:via-teal-300:focus{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.lg\:focus\:via-teal-400:focus{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.lg\:focus\:via-teal-500:focus{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.lg\:focus\:via-teal-600:focus{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.lg\:focus\:via-teal-700:focus{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.lg\:focus\:via-teal-800:focus{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.lg\:focus\:via-teal-900:focus{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.lg\:focus\:via-blue-100:focus{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.lg\:focus\:via-blue-200:focus{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.lg\:focus\:via-blue-300:focus{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.lg\:focus\:via-blue-400:focus{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.lg\:focus\:via-blue-500:focus{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.lg\:focus\:via-blue-600:focus{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.lg\:focus\:via-blue-700:focus{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.lg\:focus\:via-blue-800:focus{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.lg\:focus\:via-blue-900:focus{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.lg\:focus\:via-indigo-100:focus{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.lg\:focus\:via-indigo-200:focus{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.lg\:focus\:via-indigo-300:focus{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.lg\:focus\:via-indigo-400:focus{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.lg\:focus\:via-indigo-500:focus{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.lg\:focus\:via-indigo-600:focus{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.lg\:focus\:via-indigo-700:focus{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.lg\:focus\:via-indigo-800:focus{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.lg\:focus\:via-indigo-900:focus{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.lg\:focus\:via-purple-100:focus{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.lg\:focus\:via-purple-200:focus{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.lg\:focus\:via-purple-300:focus{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.lg\:focus\:via-purple-400:focus{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.lg\:focus\:via-purple-500:focus{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.lg\:focus\:via-purple-600:focus{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.lg\:focus\:via-purple-700:focus{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.lg\:focus\:via-purple-800:focus{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.lg\:focus\:via-purple-900:focus{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.lg\:focus\:via-pink-100:focus{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.lg\:focus\:via-pink-200:focus{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.lg\:focus\:via-pink-300:focus{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.lg\:focus\:via-pink-400:focus{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.lg\:focus\:via-pink-500:focus{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.lg\:focus\:via-pink-600:focus{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.lg\:focus\:via-pink-700:focus{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.lg\:focus\:via-pink-800:focus{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.lg\:focus\:via-pink-900:focus{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.lg\:focus\:to-transparent:focus{--gradient-to-color:transparent}.lg\:focus\:to-current:focus{--gradient-to-color:currentColor}.lg\:focus\:to-black:focus{--gradient-to-color:#000}.lg\:focus\:to-white:focus{--gradient-to-color:#fff}.lg\:focus\:to-gray-100:focus{--gradient-to-color:#f7fafc}.lg\:focus\:to-gray-200:focus{--gradient-to-color:#edf2f7}.lg\:focus\:to-gray-300:focus{--gradient-to-color:#e2e8f0}.lg\:focus\:to-gray-400:focus{--gradient-to-color:#cbd5e0}.lg\:focus\:to-gray-500:focus{--gradient-to-color:#a0aec0}.lg\:focus\:to-gray-600:focus{--gradient-to-color:#718096}.lg\:focus\:to-gray-700:focus{--gradient-to-color:#4a5568}.lg\:focus\:to-gray-800:focus{--gradient-to-color:#2d3748}.lg\:focus\:to-gray-900:focus{--gradient-to-color:#1a202c}.lg\:focus\:to-red-100:focus{--gradient-to-color:#fff5f5}.lg\:focus\:to-red-200:focus{--gradient-to-color:#fed7d7}.lg\:focus\:to-red-300:focus{--gradient-to-color:#feb2b2}.lg\:focus\:to-red-400:focus{--gradient-to-color:#fc8181}.lg\:focus\:to-red-500:focus{--gradient-to-color:#f56565}.lg\:focus\:to-red-600:focus{--gradient-to-color:#e53e3e}.lg\:focus\:to-red-700:focus{--gradient-to-color:#c53030}.lg\:focus\:to-red-800:focus{--gradient-to-color:#9b2c2c}.lg\:focus\:to-red-900:focus{--gradient-to-color:#742a2a}.lg\:focus\:to-orange-100:focus{--gradient-to-color:#fffaf0}.lg\:focus\:to-orange-200:focus{--gradient-to-color:#feebc8}.lg\:focus\:to-orange-300:focus{--gradient-to-color:#fbd38d}.lg\:focus\:to-orange-400:focus{--gradient-to-color:#f6ad55}.lg\:focus\:to-orange-500:focus{--gradient-to-color:#ed8936}.lg\:focus\:to-orange-600:focus{--gradient-to-color:#dd6b20}.lg\:focus\:to-orange-700:focus{--gradient-to-color:#c05621}.lg\:focus\:to-orange-800:focus{--gradient-to-color:#9c4221}.lg\:focus\:to-orange-900:focus{--gradient-to-color:#7b341e}.lg\:focus\:to-yellow-100:focus{--gradient-to-color:#fffff0}.lg\:focus\:to-yellow-200:focus{--gradient-to-color:#fefcbf}.lg\:focus\:to-yellow-300:focus{--gradient-to-color:#faf089}.lg\:focus\:to-yellow-400:focus{--gradient-to-color:#f6e05e}.lg\:focus\:to-yellow-500:focus{--gradient-to-color:#ecc94b}.lg\:focus\:to-yellow-600:focus{--gradient-to-color:#d69e2e}.lg\:focus\:to-yellow-700:focus{--gradient-to-color:#b7791f}.lg\:focus\:to-yellow-800:focus{--gradient-to-color:#975a16}.lg\:focus\:to-yellow-900:focus{--gradient-to-color:#744210}.lg\:focus\:to-green-100:focus{--gradient-to-color:#f0fff4}.lg\:focus\:to-green-200:focus{--gradient-to-color:#c6f6d5}.lg\:focus\:to-green-300:focus{--gradient-to-color:#9ae6b4}.lg\:focus\:to-green-400:focus{--gradient-to-color:#68d391}.lg\:focus\:to-green-500:focus{--gradient-to-color:#48bb78}.lg\:focus\:to-green-600:focus{--gradient-to-color:#38a169}.lg\:focus\:to-green-700:focus{--gradient-to-color:#2f855a}.lg\:focus\:to-green-800:focus{--gradient-to-color:#276749}.lg\:focus\:to-green-900:focus{--gradient-to-color:#22543d}.lg\:focus\:to-teal-100:focus{--gradient-to-color:#e6fffa}.lg\:focus\:to-teal-200:focus{--gradient-to-color:#b2f5ea}.lg\:focus\:to-teal-300:focus{--gradient-to-color:#81e6d9}.lg\:focus\:to-teal-400:focus{--gradient-to-color:#4fd1c5}.lg\:focus\:to-teal-500:focus{--gradient-to-color:#38b2ac}.lg\:focus\:to-teal-600:focus{--gradient-to-color:#319795}.lg\:focus\:to-teal-700:focus{--gradient-to-color:#2c7a7b}.lg\:focus\:to-teal-800:focus{--gradient-to-color:#285e61}.lg\:focus\:to-teal-900:focus{--gradient-to-color:#234e52}.lg\:focus\:to-blue-100:focus{--gradient-to-color:#ebf8ff}.lg\:focus\:to-blue-200:focus{--gradient-to-color:#bee3f8}.lg\:focus\:to-blue-300:focus{--gradient-to-color:#90cdf4}.lg\:focus\:to-blue-400:focus{--gradient-to-color:#63b3ed}.lg\:focus\:to-blue-500:focus{--gradient-to-color:#4299e1}.lg\:focus\:to-blue-600:focus{--gradient-to-color:#3182ce}.lg\:focus\:to-blue-700:focus{--gradient-to-color:#2b6cb0}.lg\:focus\:to-blue-800:focus{--gradient-to-color:#2c5282}.lg\:focus\:to-blue-900:focus{--gradient-to-color:#2a4365}.lg\:focus\:to-indigo-100:focus{--gradient-to-color:#ebf4ff}.lg\:focus\:to-indigo-200:focus{--gradient-to-color:#c3dafe}.lg\:focus\:to-indigo-300:focus{--gradient-to-color:#a3bffa}.lg\:focus\:to-indigo-400:focus{--gradient-to-color:#7f9cf5}.lg\:focus\:to-indigo-500:focus{--gradient-to-color:#667eea}.lg\:focus\:to-indigo-600:focus{--gradient-to-color:#5a67d8}.lg\:focus\:to-indigo-700:focus{--gradient-to-color:#4c51bf}.lg\:focus\:to-indigo-800:focus{--gradient-to-color:#434190}.lg\:focus\:to-indigo-900:focus{--gradient-to-color:#3c366b}.lg\:focus\:to-purple-100:focus{--gradient-to-color:#faf5ff}.lg\:focus\:to-purple-200:focus{--gradient-to-color:#e9d8fd}.lg\:focus\:to-purple-300:focus{--gradient-to-color:#d6bcfa}.lg\:focus\:to-purple-400:focus{--gradient-to-color:#b794f4}.lg\:focus\:to-purple-500:focus{--gradient-to-color:#9f7aea}.lg\:focus\:to-purple-600:focus{--gradient-to-color:#805ad5}.lg\:focus\:to-purple-700:focus{--gradient-to-color:#6b46c1}.lg\:focus\:to-purple-800:focus{--gradient-to-color:#553c9a}.lg\:focus\:to-purple-900:focus{--gradient-to-color:#44337a}.lg\:focus\:to-pink-100:focus{--gradient-to-color:#fff5f7}.lg\:focus\:to-pink-200:focus{--gradient-to-color:#fed7e2}.lg\:focus\:to-pink-300:focus{--gradient-to-color:#fbb6ce}.lg\:focus\:to-pink-400:focus{--gradient-to-color:#f687b3}.lg\:focus\:to-pink-500:focus{--gradient-to-color:#ed64a6}.lg\:focus\:to-pink-600:focus{--gradient-to-color:#d53f8c}.lg\:focus\:to-pink-700:focus{--gradient-to-color:#b83280}.lg\:focus\:to-pink-800:focus{--gradient-to-color:#97266d}.lg\:focus\:to-pink-900:focus{--gradient-to-color:#702459}.lg\:bg-opacity-0{--bg-opacity:0}.lg\:bg-opacity-25{--bg-opacity:0.25}.lg\:bg-opacity-50{--bg-opacity:0.5}.lg\:bg-opacity-75{--bg-opacity:0.75}.lg\:bg-opacity-100{--bg-opacity:1}.lg\:hover\:bg-opacity-0:hover{--bg-opacity:0}.lg\:hover\:bg-opacity-25:hover{--bg-opacity:0.25}.lg\:hover\:bg-opacity-50:hover{--bg-opacity:0.5}.lg\:hover\:bg-opacity-75:hover{--bg-opacity:0.75}.lg\:hover\:bg-opacity-100:hover{--bg-opacity:1}.lg\:focus\:bg-opacity-0:focus{--bg-opacity:0}.lg\:focus\:bg-opacity-25:focus{--bg-opacity:0.25}.lg\:focus\:bg-opacity-50:focus{--bg-opacity:0.5}.lg\:focus\:bg-opacity-75:focus{--bg-opacity:0.75}.lg\:focus\:bg-opacity-100:focus{--bg-opacity:1}.lg\:bg-bottom{background-position:bottom}.lg\:bg-center{background-position:center}.lg\:bg-left{background-position:left}.lg\:bg-left-bottom{background-position:left bottom}.lg\:bg-left-top{background-position:left top}.lg\:bg-right{background-position:right}.lg\:bg-right-bottom{background-position:right bottom}.lg\:bg-right-top{background-position:right top}.lg\:bg-top{background-position:top}.lg\:bg-repeat{background-repeat:repeat}.lg\:bg-no-repeat{background-repeat:no-repeat}.lg\:bg-repeat-x{background-repeat:repeat-x}.lg\:bg-repeat-y{background-repeat:repeat-y}.lg\:bg-repeat-round{background-repeat:round}.lg\:bg-repeat-space{background-repeat:space}.lg\:bg-auto{background-size:auto}.lg\:bg-cover{background-size:cover}.lg\:bg-contain{background-size:contain}.lg\:border-collapse{border-collapse:collapse}.lg\:border-separate{border-collapse:separate}.lg\:border-transparent{border-color:transparent}.lg\:border-current{border-color:currentColor}.lg\:border-black{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.lg\:border-white{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.lg\:border-gray-100{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.lg\:border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.lg\:border-gray-300{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.lg\:border-gray-400{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.lg\:border-gray-500{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.lg\:border-gray-600{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.lg\:border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.lg\:border-gray-800{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.lg\:border-gray-900{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.lg\:border-red-100{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.lg\:border-red-200{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.lg\:border-red-300{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.lg\:border-red-400{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.lg\:border-red-500{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.lg\:border-red-600{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.lg\:border-red-700{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.lg\:border-red-800{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.lg\:border-red-900{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.lg\:border-orange-100{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.lg\:border-orange-200{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.lg\:border-orange-300{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.lg\:border-orange-400{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.lg\:border-orange-500{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.lg\:border-orange-600{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.lg\:border-orange-700{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.lg\:border-orange-800{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.lg\:border-orange-900{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.lg\:border-yellow-100{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.lg\:border-yellow-200{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.lg\:border-yellow-300{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.lg\:border-yellow-400{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.lg\:border-yellow-500{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.lg\:border-yellow-600{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.lg\:border-yellow-700{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.lg\:border-yellow-800{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.lg\:border-yellow-900{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.lg\:border-green-100{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.lg\:border-green-200{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.lg\:border-green-300{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.lg\:border-green-400{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.lg\:border-green-500{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.lg\:border-green-600{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.lg\:border-green-700{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.lg\:border-green-800{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.lg\:border-green-900{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.lg\:border-teal-100{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.lg\:border-teal-200{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.lg\:border-teal-300{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.lg\:border-teal-400{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.lg\:border-teal-500{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.lg\:border-teal-600{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.lg\:border-teal-700{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.lg\:border-teal-800{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.lg\:border-teal-900{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.lg\:border-blue-100{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.lg\:border-blue-200{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.lg\:border-blue-300{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.lg\:border-blue-400{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.lg\:border-blue-500{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.lg\:border-blue-600{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.lg\:border-blue-700{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.lg\:border-blue-800{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.lg\:border-blue-900{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.lg\:border-indigo-100{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.lg\:border-indigo-200{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.lg\:border-indigo-300{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.lg\:border-indigo-400{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.lg\:border-indigo-500{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.lg\:border-indigo-600{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.lg\:border-indigo-700{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.lg\:border-indigo-800{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.lg\:border-indigo-900{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.lg\:border-purple-100{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.lg\:border-purple-200{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.lg\:border-purple-300{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.lg\:border-purple-400{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.lg\:border-purple-500{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.lg\:border-purple-600{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.lg\:border-purple-700{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.lg\:border-purple-800{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.lg\:border-purple-900{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.lg\:border-pink-100{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.lg\:border-pink-200{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.lg\:border-pink-300{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.lg\:border-pink-400{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.lg\:border-pink-500{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.lg\:border-pink-600{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.lg\:border-pink-700{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.lg\:border-pink-800{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.lg\:border-pink-900{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.lg\:hover\:border-transparent:hover{border-color:transparent}.lg\:hover\:border-current:hover{border-color:currentColor}.lg\:hover\:border-black:hover{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.lg\:hover\:border-white:hover{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.lg\:hover\:border-gray-100:hover{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.lg\:hover\:border-gray-200:hover{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.lg\:hover\:border-gray-300:hover{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.lg\:hover\:border-gray-400:hover{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.lg\:hover\:border-gray-500:hover{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.lg\:hover\:border-gray-600:hover{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.lg\:hover\:border-gray-700:hover{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.lg\:hover\:border-gray-800:hover{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.lg\:hover\:border-gray-900:hover{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.lg\:hover\:border-red-100:hover{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.lg\:hover\:border-red-200:hover{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.lg\:hover\:border-red-300:hover{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.lg\:hover\:border-red-400:hover{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.lg\:hover\:border-red-500:hover{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.lg\:hover\:border-red-600:hover{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.lg\:hover\:border-red-700:hover{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.lg\:hover\:border-red-800:hover{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.lg\:hover\:border-red-900:hover{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.lg\:hover\:border-orange-100:hover{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.lg\:hover\:border-orange-200:hover{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.lg\:hover\:border-orange-300:hover{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.lg\:hover\:border-orange-400:hover{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.lg\:hover\:border-orange-500:hover{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.lg\:hover\:border-orange-600:hover{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.lg\:hover\:border-orange-700:hover{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.lg\:hover\:border-orange-800:hover{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.lg\:hover\:border-orange-900:hover{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.lg\:hover\:border-yellow-100:hover{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.lg\:hover\:border-yellow-200:hover{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.lg\:hover\:border-yellow-300:hover{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.lg\:hover\:border-yellow-400:hover{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.lg\:hover\:border-yellow-500:hover{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.lg\:hover\:border-yellow-600:hover{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.lg\:hover\:border-yellow-700:hover{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.lg\:hover\:border-yellow-800:hover{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.lg\:hover\:border-yellow-900:hover{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.lg\:hover\:border-green-100:hover{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.lg\:hover\:border-green-200:hover{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.lg\:hover\:border-green-300:hover{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.lg\:hover\:border-green-400:hover{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.lg\:hover\:border-green-500:hover{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.lg\:hover\:border-green-600:hover{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.lg\:hover\:border-green-700:hover{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.lg\:hover\:border-green-800:hover{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.lg\:hover\:border-green-900:hover{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.lg\:hover\:border-teal-100:hover{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.lg\:hover\:border-teal-200:hover{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.lg\:hover\:border-teal-300:hover{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.lg\:hover\:border-teal-400:hover{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.lg\:hover\:border-teal-500:hover{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.lg\:hover\:border-teal-600:hover{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.lg\:hover\:border-teal-700:hover{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.lg\:hover\:border-teal-800:hover{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.lg\:hover\:border-teal-900:hover{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.lg\:hover\:border-blue-100:hover{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.lg\:hover\:border-blue-200:hover{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.lg\:hover\:border-blue-300:hover{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.lg\:hover\:border-blue-400:hover{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.lg\:hover\:border-blue-500:hover{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.lg\:hover\:border-blue-600:hover{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.lg\:hover\:border-blue-700:hover{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.lg\:hover\:border-blue-800:hover{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.lg\:hover\:border-blue-900:hover{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.lg\:hover\:border-indigo-100:hover{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.lg\:hover\:border-indigo-200:hover{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.lg\:hover\:border-indigo-300:hover{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.lg\:hover\:border-indigo-400:hover{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.lg\:hover\:border-indigo-500:hover{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.lg\:hover\:border-indigo-600:hover{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.lg\:hover\:border-indigo-700:hover{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.lg\:hover\:border-indigo-800:hover{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.lg\:hover\:border-indigo-900:hover{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.lg\:hover\:border-purple-100:hover{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.lg\:hover\:border-purple-200:hover{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.lg\:hover\:border-purple-300:hover{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.lg\:hover\:border-purple-400:hover{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.lg\:hover\:border-purple-500:hover{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.lg\:hover\:border-purple-600:hover{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.lg\:hover\:border-purple-700:hover{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.lg\:hover\:border-purple-800:hover{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.lg\:hover\:border-purple-900:hover{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.lg\:hover\:border-pink-100:hover{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.lg\:hover\:border-pink-200:hover{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.lg\:hover\:border-pink-300:hover{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.lg\:hover\:border-pink-400:hover{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.lg\:hover\:border-pink-500:hover{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.lg\:hover\:border-pink-600:hover{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.lg\:hover\:border-pink-700:hover{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.lg\:hover\:border-pink-800:hover{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.lg\:hover\:border-pink-900:hover{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.lg\:focus\:border-transparent:focus{border-color:transparent}.lg\:focus\:border-current:focus{border-color:currentColor}.lg\:focus\:border-black:focus{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.lg\:focus\:border-white:focus{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.lg\:focus\:border-gray-100:focus{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.lg\:focus\:border-gray-200:focus{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.lg\:focus\:border-gray-300:focus{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.lg\:focus\:border-gray-400:focus{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.lg\:focus\:border-gray-500:focus{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.lg\:focus\:border-gray-600:focus{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.lg\:focus\:border-gray-700:focus{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.lg\:focus\:border-gray-800:focus{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.lg\:focus\:border-gray-900:focus{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.lg\:focus\:border-red-100:focus{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.lg\:focus\:border-red-200:focus{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.lg\:focus\:border-red-300:focus{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.lg\:focus\:border-red-400:focus{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.lg\:focus\:border-red-500:focus{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.lg\:focus\:border-red-600:focus{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.lg\:focus\:border-red-700:focus{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.lg\:focus\:border-red-800:focus{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.lg\:focus\:border-red-900:focus{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.lg\:focus\:border-orange-100:focus{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.lg\:focus\:border-orange-200:focus{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.lg\:focus\:border-orange-300:focus{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.lg\:focus\:border-orange-400:focus{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.lg\:focus\:border-orange-500:focus{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.lg\:focus\:border-orange-600:focus{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.lg\:focus\:border-orange-700:focus{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.lg\:focus\:border-orange-800:focus{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.lg\:focus\:border-orange-900:focus{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.lg\:focus\:border-yellow-100:focus{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.lg\:focus\:border-yellow-200:focus{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.lg\:focus\:border-yellow-300:focus{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.lg\:focus\:border-yellow-400:focus{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.lg\:focus\:border-yellow-500:focus{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.lg\:focus\:border-yellow-600:focus{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.lg\:focus\:border-yellow-700:focus{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.lg\:focus\:border-yellow-800:focus{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.lg\:focus\:border-yellow-900:focus{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.lg\:focus\:border-green-100:focus{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.lg\:focus\:border-green-200:focus{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.lg\:focus\:border-green-300:focus{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.lg\:focus\:border-green-400:focus{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.lg\:focus\:border-green-500:focus{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.lg\:focus\:border-green-600:focus{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.lg\:focus\:border-green-700:focus{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.lg\:focus\:border-green-800:focus{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.lg\:focus\:border-green-900:focus{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.lg\:focus\:border-teal-100:focus{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.lg\:focus\:border-teal-200:focus{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.lg\:focus\:border-teal-300:focus{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.lg\:focus\:border-teal-400:focus{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.lg\:focus\:border-teal-500:focus{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.lg\:focus\:border-teal-600:focus{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.lg\:focus\:border-teal-700:focus{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.lg\:focus\:border-teal-800:focus{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.lg\:focus\:border-teal-900:focus{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.lg\:focus\:border-blue-100:focus{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.lg\:focus\:border-blue-200:focus{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.lg\:focus\:border-blue-300:focus{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.lg\:focus\:border-blue-400:focus{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.lg\:focus\:border-blue-500:focus{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.lg\:focus\:border-blue-600:focus{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.lg\:focus\:border-blue-700:focus{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.lg\:focus\:border-blue-800:focus{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.lg\:focus\:border-blue-900:focus{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.lg\:focus\:border-indigo-100:focus{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.lg\:focus\:border-indigo-200:focus{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.lg\:focus\:border-indigo-300:focus{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.lg\:focus\:border-indigo-400:focus{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.lg\:focus\:border-indigo-500:focus{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.lg\:focus\:border-indigo-600:focus{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.lg\:focus\:border-indigo-700:focus{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.lg\:focus\:border-indigo-800:focus{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.lg\:focus\:border-indigo-900:focus{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.lg\:focus\:border-purple-100:focus{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.lg\:focus\:border-purple-200:focus{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.lg\:focus\:border-purple-300:focus{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.lg\:focus\:border-purple-400:focus{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.lg\:focus\:border-purple-500:focus{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.lg\:focus\:border-purple-600:focus{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.lg\:focus\:border-purple-700:focus{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.lg\:focus\:border-purple-800:focus{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.lg\:focus\:border-purple-900:focus{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.lg\:focus\:border-pink-100:focus{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.lg\:focus\:border-pink-200:focus{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.lg\:focus\:border-pink-300:focus{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.lg\:focus\:border-pink-400:focus{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.lg\:focus\:border-pink-500:focus{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.lg\:focus\:border-pink-600:focus{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.lg\:focus\:border-pink-700:focus{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.lg\:focus\:border-pink-800:focus{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.lg\:focus\:border-pink-900:focus{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.lg\:border-opacity-0{--border-opacity:0}.lg\:border-opacity-25{--border-opacity:0.25}.lg\:border-opacity-50{--border-opacity:0.5}.lg\:border-opacity-75{--border-opacity:0.75}.lg\:border-opacity-100{--border-opacity:1}.lg\:hover\:border-opacity-0:hover{--border-opacity:0}.lg\:hover\:border-opacity-25:hover{--border-opacity:0.25}.lg\:hover\:border-opacity-50:hover{--border-opacity:0.5}.lg\:hover\:border-opacity-75:hover{--border-opacity:0.75}.lg\:hover\:border-opacity-100:hover{--border-opacity:1}.lg\:focus\:border-opacity-0:focus{--border-opacity:0}.lg\:focus\:border-opacity-25:focus{--border-opacity:0.25}.lg\:focus\:border-opacity-50:focus{--border-opacity:0.5}.lg\:focus\:border-opacity-75:focus{--border-opacity:0.75}.lg\:focus\:border-opacity-100:focus{--border-opacity:1}.lg\:rounded-none{border-radius:0}.lg\:rounded-sm{border-radius:.125rem}.lg\:rounded{border-radius:.25rem}.lg\:rounded-md{border-radius:.375rem}.lg\:rounded-lg{border-radius:.5rem}.lg\:rounded-xl{border-radius:.75rem}.lg\:rounded-2xl{border-radius:1rem}.lg\:rounded-3xl{border-radius:1.5rem}.lg\:rounded-full{border-radius:9999px}.lg\:rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.lg\:rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.lg\:rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.lg\:rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.lg\:rounded-t-sm{border-top-left-radius:.125rem;border-top-right-radius:.125rem}.lg\:rounded-r-sm{border-top-right-radius:.125rem;border-bottom-right-radius:.125rem}.lg\:rounded-b-sm{border-bottom-right-radius:.125rem;border-bottom-left-radius:.125rem}.lg\:rounded-l-sm{border-top-left-radius:.125rem;border-bottom-left-radius:.125rem}.lg\:rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.lg\:rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.lg\:rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.lg\:rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.lg\:rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.lg\:rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.lg\:rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.lg\:rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.lg\:rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.lg\:rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.lg\:rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.lg\:rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.lg\:rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.lg\:rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.lg\:rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.lg\:rounded-l-xl{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.lg\:rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.lg\:rounded-r-2xl{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.lg\:rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.lg\:rounded-l-2xl{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.lg\:rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.lg\:rounded-r-3xl{border-top-right-radius:1.5rem;border-bottom-right-radius:1.5rem}.lg\:rounded-b-3xl{border-bottom-right-radius:1.5rem;border-bottom-left-radius:1.5rem}.lg\:rounded-l-3xl{border-top-left-radius:1.5rem;border-bottom-left-radius:1.5rem}.lg\:rounded-t-full{border-top-left-radius:9999px;border-top-right-radius:9999px}.lg\:rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.lg\:rounded-b-full{border-bottom-right-radius:9999px;border-bottom-left-radius:9999px}.lg\:rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.lg\:rounded-tl-none{border-top-left-radius:0}.lg\:rounded-tr-none{border-top-right-radius:0}.lg\:rounded-br-none{border-bottom-right-radius:0}.lg\:rounded-bl-none{border-bottom-left-radius:0}.lg\:rounded-tl-sm{border-top-left-radius:.125rem}.lg\:rounded-tr-sm{border-top-right-radius:.125rem}.lg\:rounded-br-sm{border-bottom-right-radius:.125rem}.lg\:rounded-bl-sm{border-bottom-left-radius:.125rem}.lg\:rounded-tl{border-top-left-radius:.25rem}.lg\:rounded-tr{border-top-right-radius:.25rem}.lg\:rounded-br{border-bottom-right-radius:.25rem}.lg\:rounded-bl{border-bottom-left-radius:.25rem}.lg\:rounded-tl-md{border-top-left-radius:.375rem}.lg\:rounded-tr-md{border-top-right-radius:.375rem}.lg\:rounded-br-md{border-bottom-right-radius:.375rem}.lg\:rounded-bl-md{border-bottom-left-radius:.375rem}.lg\:rounded-tl-lg{border-top-left-radius:.5rem}.lg\:rounded-tr-lg{border-top-right-radius:.5rem}.lg\:rounded-br-lg{border-bottom-right-radius:.5rem}.lg\:rounded-bl-lg{border-bottom-left-radius:.5rem}.lg\:rounded-tl-xl{border-top-left-radius:.75rem}.lg\:rounded-tr-xl{border-top-right-radius:.75rem}.lg\:rounded-br-xl{border-bottom-right-radius:.75rem}.lg\:rounded-bl-xl{border-bottom-left-radius:.75rem}.lg\:rounded-tl-2xl{border-top-left-radius:1rem}.lg\:rounded-tr-2xl{border-top-right-radius:1rem}.lg\:rounded-br-2xl{border-bottom-right-radius:1rem}.lg\:rounded-bl-2xl{border-bottom-left-radius:1rem}.lg\:rounded-tl-3xl{border-top-left-radius:1.5rem}.lg\:rounded-tr-3xl{border-top-right-radius:1.5rem}.lg\:rounded-br-3xl{border-bottom-right-radius:1.5rem}.lg\:rounded-bl-3xl{border-bottom-left-radius:1.5rem}.lg\:rounded-tl-full{border-top-left-radius:9999px}.lg\:rounded-tr-full{border-top-right-radius:9999px}.lg\:rounded-br-full{border-bottom-right-radius:9999px}.lg\:rounded-bl-full{border-bottom-left-radius:9999px}.lg\:border-solid{border-style:solid}.lg\:border-dashed{border-style:dashed}.lg\:border-dotted{border-style:dotted}.lg\:border-double{border-style:double}.lg\:border-none{border-style:none}.lg\:border-0{border-width:0}.lg\:border-2{border-width:2px}.lg\:border-4{border-width:4px}.lg\:border-8{border-width:8px}.lg\:border{border-width:1px}.lg\:border-t-0{border-top-width:0}.lg\:border-r-0{border-right-width:0}.lg\:border-b-0{border-bottom-width:0}.lg\:border-l-0{border-left-width:0}.lg\:border-t-2{border-top-width:2px}.lg\:border-r-2{border-right-width:2px}.lg\:border-b-2{border-bottom-width:2px}.lg\:border-l-2{border-left-width:2px}.lg\:border-t-4{border-top-width:4px}.lg\:border-r-4{border-right-width:4px}.lg\:border-b-4{border-bottom-width:4px}.lg\:border-l-4{border-left-width:4px}.lg\:border-t-8{border-top-width:8px}.lg\:border-r-8{border-right-width:8px}.lg\:border-b-8{border-bottom-width:8px}.lg\:border-l-8{border-left-width:8px}.lg\:border-t{border-top-width:1px}.lg\:border-r{border-right-width:1px}.lg\:border-b{border-bottom-width:1px}.lg\:border-l{border-left-width:1px}.lg\:box-border{box-sizing:border-box}.lg\:box-content{box-sizing:content-box}.lg\:cursor-auto{cursor:auto}.lg\:cursor-default{cursor:default}.lg\:cursor-pointer{cursor:pointer}.lg\:cursor-wait{cursor:wait}.lg\:cursor-text{cursor:text}.lg\:cursor-move{cursor:move}.lg\:cursor-not-allowed{cursor:not-allowed}.lg\:block{display:block}.lg\:inline-block{display:inline-block}.lg\:inline{display:inline}.lg\:flex{display:flex}.lg\:inline-flex{display:inline-flex}.lg\:table{display:table}.lg\:table-caption{display:table-caption}.lg\:table-cell{display:table-cell}.lg\:table-column{display:table-column}.lg\:table-column-group{display:table-column-group}.lg\:table-footer-group{display:table-footer-group}.lg\:table-header-group{display:table-header-group}.lg\:table-row-group{display:table-row-group}.lg\:table-row{display:table-row}.lg\:flow-root{display:flow-root}.lg\:grid{display:grid}.lg\:inline-grid{display:inline-grid}.lg\:contents{display:contents}.lg\:hidden{display:none}.lg\:flex-row{flex-direction:row}.lg\:flex-row-reverse{flex-direction:row-reverse}.lg\:flex-col{flex-direction:column}.lg\:flex-col-reverse{flex-direction:column-reverse}.lg\:flex-wrap{flex-wrap:wrap}.lg\:flex-wrap-reverse{flex-wrap:wrap-reverse}.lg\:flex-no-wrap{flex-wrap:nowrap}.lg\:place-items-auto{place-items:auto}.lg\:place-items-start{place-items:start}.lg\:place-items-end{place-items:end}.lg\:place-items-center{place-items:center}.lg\:place-items-stretch{place-items:stretch}.lg\:place-content-center{place-content:center}.lg\:place-content-start{place-content:start}.lg\:place-content-end{place-content:end}.lg\:place-content-between{place-content:space-between}.lg\:place-content-around{place-content:space-around}.lg\:place-content-evenly{place-content:space-evenly}.lg\:place-content-stretch{place-content:stretch}.lg\:place-self-auto{place-self:auto}.lg\:place-self-start{place-self:start}.lg\:place-self-end{place-self:end}.lg\:place-self-center{place-self:center}.lg\:place-self-stretch{place-self:stretch}.lg\:items-start{align-items:flex-start}.lg\:items-end{align-items:flex-end}.lg\:items-center{align-items:center}.lg\:items-baseline{align-items:baseline}.lg\:items-stretch{align-items:stretch}.lg\:content-center{align-content:center}.lg\:content-start{align-content:flex-start}.lg\:content-end{align-content:flex-end}.lg\:content-between{align-content:space-between}.lg\:content-around{align-content:space-around}.lg\:content-evenly{align-content:space-evenly}.lg\:self-auto{align-self:auto}.lg\:self-start{align-self:flex-start}.lg\:self-end{align-self:flex-end}.lg\:self-center{align-self:center}.lg\:self-stretch{align-self:stretch}.lg\:justify-items-auto{justify-items:auto}.lg\:justify-items-start{justify-items:start}.lg\:justify-items-end{justify-items:end}.lg\:justify-items-center{justify-items:center}.lg\:justify-items-stretch{justify-items:stretch}.lg\:justify-start{justify-content:flex-start}.lg\:justify-end{justify-content:flex-end}.lg\:justify-center{justify-content:center}.lg\:justify-between{justify-content:space-between}.lg\:justify-around{justify-content:space-around}.lg\:justify-evenly{justify-content:space-evenly}.lg\:justify-self-auto{justify-self:auto}.lg\:justify-self-start{justify-self:start}.lg\:justify-self-end{justify-self:end}.lg\:justify-self-center{justify-self:center}.lg\:justify-self-stretch{justify-self:stretch}.lg\:flex-1{flex:1 1 0%}.lg\:flex-auto{flex:1 1 auto}.lg\:flex-initial{flex:0 1 auto}.lg\:flex-none{flex:none}.lg\:flex-grow-0{flex-grow:0}.lg\:flex-grow{flex-grow:1}.lg\:flex-shrink-0{flex-shrink:0}.lg\:flex-shrink{flex-shrink:1}.lg\:order-1{order:1}.lg\:order-2{order:2}.lg\:order-3{order:3}.lg\:order-4{order:4}.lg\:order-5{order:5}.lg\:order-6{order:6}.lg\:order-7{order:7}.lg\:order-8{order:8}.lg\:order-9{order:9}.lg\:order-10{order:10}.lg\:order-11{order:11}.lg\:order-12{order:12}.lg\:order-first{order:-9999}.lg\:order-last{order:9999}.lg\:order-none{order:0}.lg\:float-right{float:right}.lg\:float-left{float:left}.lg\:float-none{float:none}.lg\:clearfix:after{content:"";display:table;clear:both}.lg\:clear-left{clear:left}.lg\:clear-right{clear:right}.lg\:clear-both{clear:both}.lg\:clear-none{clear:none}.lg\:font-sans{font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.lg\:font-serif{font-family:Georgia,Cambria,"Times New Roman",Times,serif}.lg\:font-mono{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.lg\:font-hairline{font-weight:100}.lg\:font-thin{font-weight:200}.lg\:font-light{font-weight:300}.lg\:font-normal{font-weight:400}.lg\:font-medium{font-weight:500}.lg\:font-semibold{font-weight:600}.lg\:font-bold{font-weight:700}.lg\:font-extrabold{font-weight:800}.lg\:font-black{font-weight:900}.lg\:hover\:font-hairline:hover{font-weight:100}.lg\:hover\:font-thin:hover{font-weight:200}.lg\:hover\:font-light:hover{font-weight:300}.lg\:hover\:font-normal:hover{font-weight:400}.lg\:hover\:font-medium:hover{font-weight:500}.lg\:hover\:font-semibold:hover{font-weight:600}.lg\:hover\:font-bold:hover{font-weight:700}.lg\:hover\:font-extrabold:hover{font-weight:800}.lg\:hover\:font-black:hover{font-weight:900}.lg\:focus\:font-hairline:focus{font-weight:100}.lg\:focus\:font-thin:focus{font-weight:200}.lg\:focus\:font-light:focus{font-weight:300}.lg\:focus\:font-normal:focus{font-weight:400}.lg\:focus\:font-medium:focus{font-weight:500}.lg\:focus\:font-semibold:focus{font-weight:600}.lg\:focus\:font-bold:focus{font-weight:700}.lg\:focus\:font-extrabold:focus{font-weight:800}.lg\:focus\:font-black:focus{font-weight:900}.lg\:h-0{height:0}.lg\:h-1{height:.25rem}.lg\:h-2{height:.5rem}.lg\:h-3{height:.75rem}.lg\:h-4{height:1rem}.lg\:h-5{height:1.25rem}.lg\:h-6{height:1.5rem}.lg\:h-8{height:2rem}.lg\:h-10{height:2.5rem}.lg\:h-12{height:3rem}.lg\:h-16{height:4rem}.lg\:h-20{height:5rem}.lg\:h-24{height:6rem}.lg\:h-32{height:8rem}.lg\:h-40{height:10rem}.lg\:h-48{height:12rem}.lg\:h-56{height:14rem}.lg\:h-64{height:16rem}.lg\:h-auto{height:auto}.lg\:h-px{height:1px}.lg\:h-full{height:100%}.lg\:h-screen{height:100vh}.lg\:text-xs{font-size:.75rem}.lg\:text-sm{font-size:.875rem}.lg\:text-base{font-size:1rem}.lg\:text-lg{font-size:1.125rem}.lg\:text-xl{font-size:1.25rem}.lg\:text-2xl{font-size:1.5rem}.lg\:text-3xl{font-size:1.875rem}.lg\:text-4xl{font-size:2.25rem}.lg\:text-5xl{font-size:3rem}.lg\:text-6xl{font-size:4rem}.lg\:leading-3{line-height:.75rem}.lg\:leading-4{line-height:1rem}.lg\:leading-5{line-height:1.25rem}.lg\:leading-6{line-height:1.5rem}.lg\:leading-7{line-height:1.75rem}.lg\:leading-8{line-height:2rem}.lg\:leading-9{line-height:2.25rem}.lg\:leading-10{line-height:2.5rem}.lg\:leading-none{line-height:1}.lg\:leading-tight{line-height:1.25}.lg\:leading-snug{line-height:1.375}.lg\:leading-normal{line-height:1.5}.lg\:leading-relaxed{line-height:1.625}.lg\:leading-loose{line-height:2}.lg\:list-inside{list-style-position:inside}.lg\:list-outside{list-style-position:outside}.lg\:list-none{list-style-type:none}.lg\:list-disc{list-style-type:disc}.lg\:list-decimal{list-style-type:decimal}.lg\:m-0{margin:0}.lg\:m-1{margin:.25rem}.lg\:m-2{margin:.5rem}.lg\:m-3{margin:.75rem}.lg\:m-4{margin:1rem}.lg\:m-5{margin:1.25rem}.lg\:m-6{margin:1.5rem}.lg\:m-8{margin:2rem}.lg\:m-10{margin:2.5rem}.lg\:m-12{margin:3rem}.lg\:m-16{margin:4rem}.lg\:m-20{margin:5rem}.lg\:m-24{margin:6rem}.lg\:m-32{margin:8rem}.lg\:m-40{margin:10rem}.lg\:m-48{margin:12rem}.lg\:m-56{margin:14rem}.lg\:m-64{margin:16rem}.lg\:m-auto{margin:auto}.lg\:m-px{margin:1px}.lg\:-m-1{margin:-.25rem}.lg\:-m-2{margin:-.5rem}.lg\:-m-3{margin:-.75rem}.lg\:-m-4{margin:-1rem}.lg\:-m-5{margin:-1.25rem}.lg\:-m-6{margin:-1.5rem}.lg\:-m-8{margin:-2rem}.lg\:-m-10{margin:-2.5rem}.lg\:-m-12{margin:-3rem}.lg\:-m-16{margin:-4rem}.lg\:-m-20{margin:-5rem}.lg\:-m-24{margin:-6rem}.lg\:-m-32{margin:-8rem}.lg\:-m-40{margin:-10rem}.lg\:-m-48{margin:-12rem}.lg\:-m-56{margin:-14rem}.lg\:-m-64{margin:-16rem}.lg\:-m-px{margin:-1px}.lg\:my-0{margin-top:0;margin-bottom:0}.lg\:mx-0{margin-left:0;margin-right:0}.lg\:my-1{margin-top:.25rem;margin-bottom:.25rem}.lg\:mx-1{margin-left:.25rem;margin-right:.25rem}.lg\:my-2{margin-top:.5rem;margin-bottom:.5rem}.lg\:mx-2{margin-left:.5rem;margin-right:.5rem}.lg\:my-3{margin-top:.75rem;margin-bottom:.75rem}.lg\:mx-3{margin-left:.75rem;margin-right:.75rem}.lg\:my-4{margin-top:1rem;margin-bottom:1rem}.lg\:mx-4{margin-left:1rem;margin-right:1rem}.lg\:my-5{margin-top:1.25rem;margin-bottom:1.25rem}.lg\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.lg\:my-6{margin-top:1.5rem;margin-bottom:1.5rem}.lg\:mx-6{margin-left:1.5rem;margin-right:1.5rem}.lg\:my-8{margin-top:2rem;margin-bottom:2rem}.lg\:mx-8{margin-left:2rem;margin-right:2rem}.lg\:my-10{margin-top:2.5rem;margin-bottom:2.5rem}.lg\:mx-10{margin-left:2.5rem;margin-right:2.5rem}.lg\:my-12{margin-top:3rem;margin-bottom:3rem}.lg\:mx-12{margin-left:3rem;margin-right:3rem}.lg\:my-16{margin-top:4rem;margin-bottom:4rem}.lg\:mx-16{margin-left:4rem;margin-right:4rem}.lg\:my-20{margin-top:5rem;margin-bottom:5rem}.lg\:mx-20{margin-left:5rem;margin-right:5rem}.lg\:my-24{margin-top:6rem;margin-bottom:6rem}.lg\:mx-24{margin-left:6rem;margin-right:6rem}.lg\:my-32{margin-top:8rem;margin-bottom:8rem}.lg\:mx-32{margin-left:8rem;margin-right:8rem}.lg\:my-40{margin-top:10rem;margin-bottom:10rem}.lg\:mx-40{margin-left:10rem;margin-right:10rem}.lg\:my-48{margin-top:12rem;margin-bottom:12rem}.lg\:mx-48{margin-left:12rem;margin-right:12rem}.lg\:my-56{margin-top:14rem;margin-bottom:14rem}.lg\:mx-56{margin-left:14rem;margin-right:14rem}.lg\:my-64{margin-top:16rem;margin-bottom:16rem}.lg\:mx-64{margin-left:16rem;margin-right:16rem}.lg\:my-auto{margin-top:auto;margin-bottom:auto}.lg\:mx-auto{margin-left:auto;margin-right:auto}.lg\:my-px{margin-top:1px;margin-bottom:1px}.lg\:mx-px{margin-left:1px;margin-right:1px}.lg\:-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.lg\:-mx-1{margin-left:-.25rem;margin-right:-.25rem}.lg\:-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.lg\:-mx-2{margin-left:-.5rem;margin-right:-.5rem}.lg\:-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.lg\:-mx-3{margin-left:-.75rem;margin-right:-.75rem}.lg\:-my-4{margin-top:-1rem;margin-bottom:-1rem}.lg\:-mx-4{margin-left:-1rem;margin-right:-1rem}.lg\:-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.lg\:-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.lg\:-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.lg\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.lg\:-my-8{margin-top:-2rem;margin-bottom:-2rem}.lg\:-mx-8{margin-left:-2rem;margin-right:-2rem}.lg\:-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.lg\:-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.lg\:-my-12{margin-top:-3rem;margin-bottom:-3rem}.lg\:-mx-12{margin-left:-3rem;margin-right:-3rem}.lg\:-my-16{margin-top:-4rem;margin-bottom:-4rem}.lg\:-mx-16{margin-left:-4rem;margin-right:-4rem}.lg\:-my-20{margin-top:-5rem;margin-bottom:-5rem}.lg\:-mx-20{margin-left:-5rem;margin-right:-5rem}.lg\:-my-24{margin-top:-6rem;margin-bottom:-6rem}.lg\:-mx-24{margin-left:-6rem;margin-right:-6rem}.lg\:-my-32{margin-top:-8rem;margin-bottom:-8rem}.lg\:-mx-32{margin-left:-8rem;margin-right:-8rem}.lg\:-my-40{margin-top:-10rem;margin-bottom:-10rem}.lg\:-mx-40{margin-left:-10rem;margin-right:-10rem}.lg\:-my-48{margin-top:-12rem;margin-bottom:-12rem}.lg\:-mx-48{margin-left:-12rem;margin-right:-12rem}.lg\:-my-56{margin-top:-14rem;margin-bottom:-14rem}.lg\:-mx-56{margin-left:-14rem;margin-right:-14rem}.lg\:-my-64{margin-top:-16rem;margin-bottom:-16rem}.lg\:-mx-64{margin-left:-16rem;margin-right:-16rem}.lg\:-my-px{margin-top:-1px;margin-bottom:-1px}.lg\:-mx-px{margin-left:-1px;margin-right:-1px}.lg\:mt-0{margin-top:0}.lg\:mr-0{margin-right:0}.lg\:mb-0{margin-bottom:0}.lg\:ml-0{margin-left:0}.lg\:mt-1{margin-top:.25rem}.lg\:mr-1{margin-right:.25rem}.lg\:mb-1{margin-bottom:.25rem}.lg\:ml-1{margin-left:.25rem}.lg\:mt-2{margin-top:.5rem}.lg\:mr-2{margin-right:.5rem}.lg\:mb-2{margin-bottom:.5rem}.lg\:ml-2{margin-left:.5rem}.lg\:mt-3{margin-top:.75rem}.lg\:mr-3{margin-right:.75rem}.lg\:mb-3{margin-bottom:.75rem}.lg\:ml-3{margin-left:.75rem}.lg\:mt-4{margin-top:1rem}.lg\:mr-4{margin-right:1rem}.lg\:mb-4{margin-bottom:1rem}.lg\:ml-4{margin-left:1rem}.lg\:mt-5{margin-top:1.25rem}.lg\:mr-5{margin-right:1.25rem}.lg\:mb-5{margin-bottom:1.25rem}.lg\:ml-5{margin-left:1.25rem}.lg\:mt-6{margin-top:1.5rem}.lg\:mr-6{margin-right:1.5rem}.lg\:mb-6{margin-bottom:1.5rem}.lg\:ml-6{margin-left:1.5rem}.lg\:mt-8{margin-top:2rem}.lg\:mr-8{margin-right:2rem}.lg\:mb-8{margin-bottom:2rem}.lg\:ml-8{margin-left:2rem}.lg\:mt-10{margin-top:2.5rem}.lg\:mr-10{margin-right:2.5rem}.lg\:mb-10{margin-bottom:2.5rem}.lg\:ml-10{margin-left:2.5rem}.lg\:mt-12{margin-top:3rem}.lg\:mr-12{margin-right:3rem}.lg\:mb-12{margin-bottom:3rem}.lg\:ml-12{margin-left:3rem}.lg\:mt-16{margin-top:4rem}.lg\:mr-16{margin-right:4rem}.lg\:mb-16{margin-bottom:4rem}.lg\:ml-16{margin-left:4rem}.lg\:mt-20{margin-top:5rem}.lg\:mr-20{margin-right:5rem}.lg\:mb-20{margin-bottom:5rem}.lg\:ml-20{margin-left:5rem}.lg\:mt-24{margin-top:6rem}.lg\:mr-24{margin-right:6rem}.lg\:mb-24{margin-bottom:6rem}.lg\:ml-24{margin-left:6rem}.lg\:mt-32{margin-top:8rem}.lg\:mr-32{margin-right:8rem}.lg\:mb-32{margin-bottom:8rem}.lg\:ml-32{margin-left:8rem}.lg\:mt-40{margin-top:10rem}.lg\:mr-40{margin-right:10rem}.lg\:mb-40{margin-bottom:10rem}.lg\:ml-40{margin-left:10rem}.lg\:mt-48{margin-top:12rem}.lg\:mr-48{margin-right:12rem}.lg\:mb-48{margin-bottom:12rem}.lg\:ml-48{margin-left:12rem}.lg\:mt-56{margin-top:14rem}.lg\:mr-56{margin-right:14rem}.lg\:mb-56{margin-bottom:14rem}.lg\:ml-56{margin-left:14rem}.lg\:mt-64{margin-top:16rem}.lg\:mr-64{margin-right:16rem}.lg\:mb-64{margin-bottom:16rem}.lg\:ml-64{margin-left:16rem}.lg\:mt-auto{margin-top:auto}.lg\:mr-auto{margin-right:auto}.lg\:mb-auto{margin-bottom:auto}.lg\:ml-auto{margin-left:auto}.lg\:mt-px{margin-top:1px}.lg\:mr-px{margin-right:1px}.lg\:mb-px{margin-bottom:1px}.lg\:ml-px{margin-left:1px}.lg\:-mt-1{margin-top:-.25rem}.lg\:-mr-1{margin-right:-.25rem}.lg\:-mb-1{margin-bottom:-.25rem}.lg\:-ml-1{margin-left:-.25rem}.lg\:-mt-2{margin-top:-.5rem}.lg\:-mr-2{margin-right:-.5rem}.lg\:-mb-2{margin-bottom:-.5rem}.lg\:-ml-2{margin-left:-.5rem}.lg\:-mt-3{margin-top:-.75rem}.lg\:-mr-3{margin-right:-.75rem}.lg\:-mb-3{margin-bottom:-.75rem}.lg\:-ml-3{margin-left:-.75rem}.lg\:-mt-4{margin-top:-1rem}.lg\:-mr-4{margin-right:-1rem}.lg\:-mb-4{margin-bottom:-1rem}.lg\:-ml-4{margin-left:-1rem}.lg\:-mt-5{margin-top:-1.25rem}.lg\:-mr-5{margin-right:-1.25rem}.lg\:-mb-5{margin-bottom:-1.25rem}.lg\:-ml-5{margin-left:-1.25rem}.lg\:-mt-6{margin-top:-1.5rem}.lg\:-mr-6{margin-right:-1.5rem}.lg\:-mb-6{margin-bottom:-1.5rem}.lg\:-ml-6{margin-left:-1.5rem}.lg\:-mt-8{margin-top:-2rem}.lg\:-mr-8{margin-right:-2rem}.lg\:-mb-8{margin-bottom:-2rem}.lg\:-ml-8{margin-left:-2rem}.lg\:-mt-10{margin-top:-2.5rem}.lg\:-mr-10{margin-right:-2.5rem}.lg\:-mb-10{margin-bottom:-2.5rem}.lg\:-ml-10{margin-left:-2.5rem}.lg\:-mt-12{margin-top:-3rem}.lg\:-mr-12{margin-right:-3rem}.lg\:-mb-12{margin-bottom:-3rem}.lg\:-ml-12{margin-left:-3rem}.lg\:-mt-16{margin-top:-4rem}.lg\:-mr-16{margin-right:-4rem}.lg\:-mb-16{margin-bottom:-4rem}.lg\:-ml-16{margin-left:-4rem}.lg\:-mt-20{margin-top:-5rem}.lg\:-mr-20{margin-right:-5rem}.lg\:-mb-20{margin-bottom:-5rem}.lg\:-ml-20{margin-left:-5rem}.lg\:-mt-24{margin-top:-6rem}.lg\:-mr-24{margin-right:-6rem}.lg\:-mb-24{margin-bottom:-6rem}.lg\:-ml-24{margin-left:-6rem}.lg\:-mt-32{margin-top:-8rem}.lg\:-mr-32{margin-right:-8rem}.lg\:-mb-32{margin-bottom:-8rem}.lg\:-ml-32{margin-left:-8rem}.lg\:-mt-40{margin-top:-10rem}.lg\:-mr-40{margin-right:-10rem}.lg\:-mb-40{margin-bottom:-10rem}.lg\:-ml-40{margin-left:-10rem}.lg\:-mt-48{margin-top:-12rem}.lg\:-mr-48{margin-right:-12rem}.lg\:-mb-48{margin-bottom:-12rem}.lg\:-ml-48{margin-left:-12rem}.lg\:-mt-56{margin-top:-14rem}.lg\:-mr-56{margin-right:-14rem}.lg\:-mb-56{margin-bottom:-14rem}.lg\:-ml-56{margin-left:-14rem}.lg\:-mt-64{margin-top:-16rem}.lg\:-mr-64{margin-right:-16rem}.lg\:-mb-64{margin-bottom:-16rem}.lg\:-ml-64{margin-left:-16rem}.lg\:-mt-px{margin-top:-1px}.lg\:-mr-px{margin-right:-1px}.lg\:-mb-px{margin-bottom:-1px}.lg\:-ml-px{margin-left:-1px}.lg\:max-h-full{max-height:100%}.lg\:max-h-screen{max-height:100vh}.lg\:max-w-none{max-width:none}.lg\:max-w-xs{max-width:20rem}.lg\:max-w-sm{max-width:24rem}.lg\:max-w-md{max-width:28rem}.lg\:max-w-lg{max-width:32rem}.lg\:max-w-xl{max-width:36rem}.lg\:max-w-2xl{max-width:42rem}.lg\:max-w-3xl{max-width:48rem}.lg\:max-w-4xl{max-width:56rem}.lg\:max-w-5xl{max-width:64rem}.lg\:max-w-6xl{max-width:72rem}.lg\:max-w-full{max-width:100%}.lg\:max-w-screen-sm{max-width:640px}.lg\:max-w-screen-md{max-width:768px}.lg\:max-w-screen-lg{max-width:1024px}.lg\:max-w-screen-xl{max-width:1280px}.lg\:min-h-0{min-height:0}.lg\:min-h-full{min-height:100%}.lg\:min-h-screen{min-height:100vh}.lg\:min-w-0{min-width:0}.lg\:min-w-full{min-width:100%}.lg\:object-contain{object-fit:contain}.lg\:object-cover{object-fit:cover}.lg\:object-fill{object-fit:fill}.lg\:object-none{object-fit:none}.lg\:object-scale-down{object-fit:scale-down}.lg\:object-bottom{object-position:bottom}.lg\:object-center{object-position:center}.lg\:object-left{object-position:left}.lg\:object-left-bottom{object-position:left bottom}.lg\:object-left-top{object-position:left top}.lg\:object-right{object-position:right}.lg\:object-right-bottom{object-position:right bottom}.lg\:object-right-top{object-position:right top}.lg\:object-top{object-position:top}.lg\:opacity-0{opacity:0}.lg\:opacity-25{opacity:.25}.lg\:opacity-50{opacity:.5}.lg\:opacity-75{opacity:.75}.lg\:opacity-100{opacity:1}.lg\:hover\:opacity-0:hover{opacity:0}.lg\:hover\:opacity-25:hover{opacity:.25}.lg\:hover\:opacity-50:hover{opacity:.5}.lg\:hover\:opacity-75:hover{opacity:.75}.lg\:hover\:opacity-100:hover{opacity:1}.lg\:focus\:opacity-0:focus{opacity:0}.lg\:focus\:opacity-25:focus{opacity:.25}.lg\:focus\:opacity-50:focus{opacity:.5}.lg\:focus\:opacity-75:focus{opacity:.75}.lg\:focus\:opacity-100:focus{opacity:1}.lg\:outline-none{outline:2px solid transparent;outline-offset:2px}.lg\:outline-white{outline:2px dotted #fff;outline-offset:2px}.lg\:outline-black{outline:2px dotted #000;outline-offset:2px}.lg\:focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.lg\:focus\:outline-white:focus{outline:2px dotted #fff;outline-offset:2px}.lg\:focus\:outline-black:focus{outline:2px dotted #000;outline-offset:2px}.lg\:overflow-auto{overflow:auto}.lg\:overflow-hidden{overflow:hidden}.lg\:overflow-visible{overflow:visible}.lg\:overflow-scroll{overflow:scroll}.lg\:overflow-x-auto{overflow-x:auto}.lg\:overflow-y-auto{overflow-y:auto}.lg\:overflow-x-hidden{overflow-x:hidden}.lg\:overflow-y-hidden{overflow-y:hidden}.lg\:overflow-x-visible{overflow-x:visible}.lg\:overflow-y-visible{overflow-y:visible}.lg\:overflow-x-scroll{overflow-x:scroll}.lg\:overflow-y-scroll{overflow-y:scroll}.lg\:scrolling-touch{-webkit-overflow-scrolling:touch}.lg\:scrolling-auto{-webkit-overflow-scrolling:auto}.lg\:overscroll-auto{-ms-scroll-chaining:chained;overscroll-behavior:auto}.lg\:overscroll-contain{-ms-scroll-chaining:none;overscroll-behavior:contain}.lg\:overscroll-none{-ms-scroll-chaining:none;overscroll-behavior:none}.lg\:overscroll-y-auto{overscroll-behavior-y:auto}.lg\:overscroll-y-contain{overscroll-behavior-y:contain}.lg\:overscroll-y-none{overscroll-behavior-y:none}.lg\:overscroll-x-auto{overscroll-behavior-x:auto}.lg\:overscroll-x-contain{overscroll-behavior-x:contain}.lg\:overscroll-x-none{overscroll-behavior-x:none}.lg\:p-0{padding:0}.lg\:p-1{padding:.25rem}.lg\:p-2{padding:.5rem}.lg\:p-3{padding:.75rem}.lg\:p-4{padding:1rem}.lg\:p-5{padding:1.25rem}.lg\:p-6{padding:1.5rem}.lg\:p-8{padding:2rem}.lg\:p-10{padding:2.5rem}.lg\:p-12{padding:3rem}.lg\:p-16{padding:4rem}.lg\:p-20{padding:5rem}.lg\:p-24{padding:6rem}.lg\:p-32{padding:8rem}.lg\:p-40{padding:10rem}.lg\:p-48{padding:12rem}.lg\:p-56{padding:14rem}.lg\:p-64{padding:16rem}.lg\:p-px{padding:1px}.lg\:py-0{padding-top:0;padding-bottom:0}.lg\:px-0{padding-left:0;padding-right:0}.lg\:py-1{padding-top:.25rem;padding-bottom:.25rem}.lg\:px-1{padding-left:.25rem;padding-right:.25rem}.lg\:py-2{padding-top:.5rem;padding-bottom:.5rem}.lg\:px-2{padding-left:.5rem;padding-right:.5rem}.lg\:py-3{padding-top:.75rem;padding-bottom:.75rem}.lg\:px-3{padding-left:.75rem;padding-right:.75rem}.lg\:py-4{padding-top:1rem;padding-bottom:1rem}.lg\:px-4{padding-left:1rem;padding-right:1rem}.lg\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.lg\:px-5{padding-left:1.25rem;padding-right:1.25rem}.lg\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.lg\:px-6{padding-left:1.5rem;padding-right:1.5rem}.lg\:py-8{padding-top:2rem;padding-bottom:2rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:py-10{padding-top:2.5rem;padding-bottom:2.5rem}.lg\:px-10{padding-left:2.5rem;padding-right:2.5rem}.lg\:py-12{padding-top:3rem;padding-bottom:3rem}.lg\:px-12{padding-left:3rem;padding-right:3rem}.lg\:py-16{padding-top:4rem;padding-bottom:4rem}.lg\:px-16{padding-left:4rem;padding-right:4rem}.lg\:py-20{padding-top:5rem;padding-bottom:5rem}.lg\:px-20{padding-left:5rem;padding-right:5rem}.lg\:py-24{padding-top:6rem;padding-bottom:6rem}.lg\:px-24{padding-left:6rem;padding-right:6rem}.lg\:py-32{padding-top:8rem;padding-bottom:8rem}.lg\:px-32{padding-left:8rem;padding-right:8rem}.lg\:py-40{padding-top:10rem;padding-bottom:10rem}.lg\:px-40{padding-left:10rem;padding-right:10rem}.lg\:py-48{padding-top:12rem;padding-bottom:12rem}.lg\:px-48{padding-left:12rem;padding-right:12rem}.lg\:py-56{padding-top:14rem;padding-bottom:14rem}.lg\:px-56{padding-left:14rem;padding-right:14rem}.lg\:py-64{padding-top:16rem;padding-bottom:16rem}.lg\:px-64{padding-left:16rem;padding-right:16rem}.lg\:py-px{padding-top:1px;padding-bottom:1px}.lg\:px-px{padding-left:1px;padding-right:1px}.lg\:pt-0{padding-top:0}.lg\:pr-0{padding-right:0}.lg\:pb-0{padding-bottom:0}.lg\:pl-0{padding-left:0}.lg\:pt-1{padding-top:.25rem}.lg\:pr-1{padding-right:.25rem}.lg\:pb-1{padding-bottom:.25rem}.lg\:pl-1{padding-left:.25rem}.lg\:pt-2{padding-top:.5rem}.lg\:pr-2{padding-right:.5rem}.lg\:pb-2{padding-bottom:.5rem}.lg\:pl-2{padding-left:.5rem}.lg\:pt-3{padding-top:.75rem}.lg\:pr-3{padding-right:.75rem}.lg\:pb-3{padding-bottom:.75rem}.lg\:pl-3{padding-left:.75rem}.lg\:pt-4{padding-top:1rem}.lg\:pr-4{padding-right:1rem}.lg\:pb-4{padding-bottom:1rem}.lg\:pl-4{padding-left:1rem}.lg\:pt-5{padding-top:1.25rem}.lg\:pr-5{padding-right:1.25rem}.lg\:pb-5{padding-bottom:1.25rem}.lg\:pl-5{padding-left:1.25rem}.lg\:pt-6{padding-top:1.5rem}.lg\:pr-6{padding-right:1.5rem}.lg\:pb-6{padding-bottom:1.5rem}.lg\:pl-6{padding-left:1.5rem}.lg\:pt-8{padding-top:2rem}.lg\:pr-8{padding-right:2rem}.lg\:pb-8{padding-bottom:2rem}.lg\:pl-8{padding-left:2rem}.lg\:pt-10{padding-top:2.5rem}.lg\:pr-10{padding-right:2.5rem}.lg\:pb-10{padding-bottom:2.5rem}.lg\:pl-10{padding-left:2.5rem}.lg\:pt-12{padding-top:3rem}.lg\:pr-12{padding-right:3rem}.lg\:pb-12{padding-bottom:3rem}.lg\:pl-12{padding-left:3rem}.lg\:pt-16{padding-top:4rem}.lg\:pr-16{padding-right:4rem}.lg\:pb-16{padding-bottom:4rem}.lg\:pl-16{padding-left:4rem}.lg\:pt-20{padding-top:5rem}.lg\:pr-20{padding-right:5rem}.lg\:pb-20{padding-bottom:5rem}.lg\:pl-20{padding-left:5rem}.lg\:pt-24{padding-top:6rem}.lg\:pr-24{padding-right:6rem}.lg\:pb-24{padding-bottom:6rem}.lg\:pl-24{padding-left:6rem}.lg\:pt-32{padding-top:8rem}.lg\:pr-32{padding-right:8rem}.lg\:pb-32{padding-bottom:8rem}.lg\:pl-32{padding-left:8rem}.lg\:pt-40{padding-top:10rem}.lg\:pr-40{padding-right:10rem}.lg\:pb-40{padding-bottom:10rem}.lg\:pl-40{padding-left:10rem}.lg\:pt-48{padding-top:12rem}.lg\:pr-48{padding-right:12rem}.lg\:pb-48{padding-bottom:12rem}.lg\:pl-48{padding-left:12rem}.lg\:pt-56{padding-top:14rem}.lg\:pr-56{padding-right:14rem}.lg\:pb-56{padding-bottom:14rem}.lg\:pl-56{padding-left:14rem}.lg\:pt-64{padding-top:16rem}.lg\:pr-64{padding-right:16rem}.lg\:pb-64{padding-bottom:16rem}.lg\:pl-64{padding-left:16rem}.lg\:pt-px{padding-top:1px}.lg\:pr-px{padding-right:1px}.lg\:pb-px{padding-bottom:1px}.lg\:pl-px{padding-left:1px}.lg\:placeholder-transparent:-ms-input-placeholder{color:transparent}.lg\:placeholder-transparent::-ms-input-placeholder{color:transparent}.lg\:placeholder-transparent::placeholder{color:transparent}.lg\:placeholder-current:-ms-input-placeholder{color:currentColor}.lg\:placeholder-current::-ms-input-placeholder{color:currentColor}.lg\:placeholder-current::placeholder{color:currentColor}.lg\:placeholder-black:-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.lg\:placeholder-black::-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.lg\:placeholder-black::placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.lg\:placeholder-white:-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.lg\:placeholder-white::-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.lg\:placeholder-white::placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.lg\:placeholder-gray-100:-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.lg\:placeholder-gray-100::-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.lg\:placeholder-gray-100::placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.lg\:placeholder-gray-200:-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.lg\:placeholder-gray-200::-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.lg\:placeholder-gray-200::placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.lg\:placeholder-gray-300:-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.lg\:placeholder-gray-300::-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.lg\:placeholder-gray-300::placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.lg\:placeholder-gray-400:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.lg\:placeholder-gray-400::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.lg\:placeholder-gray-400::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.lg\:placeholder-gray-500:-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.lg\:placeholder-gray-500::-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.lg\:placeholder-gray-500::placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.lg\:placeholder-gray-600:-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.lg\:placeholder-gray-600::-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.lg\:placeholder-gray-600::placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.lg\:placeholder-gray-700:-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.lg\:placeholder-gray-700::-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.lg\:placeholder-gray-700::placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.lg\:placeholder-gray-800:-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.lg\:placeholder-gray-800::-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.lg\:placeholder-gray-800::placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.lg\:placeholder-gray-900:-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.lg\:placeholder-gray-900::-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.lg\:placeholder-gray-900::placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.lg\:placeholder-red-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.lg\:placeholder-red-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.lg\:placeholder-red-100::placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.lg\:placeholder-red-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.lg\:placeholder-red-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.lg\:placeholder-red-200::placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.lg\:placeholder-red-300:-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.lg\:placeholder-red-300::-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.lg\:placeholder-red-300::placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.lg\:placeholder-red-400:-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.lg\:placeholder-red-400::-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.lg\:placeholder-red-400::placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.lg\:placeholder-red-500:-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.lg\:placeholder-red-500::-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.lg\:placeholder-red-500::placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.lg\:placeholder-red-600:-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.lg\:placeholder-red-600::-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.lg\:placeholder-red-600::placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.lg\:placeholder-red-700:-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.lg\:placeholder-red-700::-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.lg\:placeholder-red-700::placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.lg\:placeholder-red-800:-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.lg\:placeholder-red-800::-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.lg\:placeholder-red-800::placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.lg\:placeholder-red-900:-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.lg\:placeholder-red-900::-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.lg\:placeholder-red-900::placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.lg\:placeholder-orange-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.lg\:placeholder-orange-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.lg\:placeholder-orange-100::placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.lg\:placeholder-orange-200:-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.lg\:placeholder-orange-200::-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.lg\:placeholder-orange-200::placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.lg\:placeholder-orange-300:-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.lg\:placeholder-orange-300::-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.lg\:placeholder-orange-300::placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.lg\:placeholder-orange-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.lg\:placeholder-orange-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.lg\:placeholder-orange-400::placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.lg\:placeholder-orange-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.lg\:placeholder-orange-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.lg\:placeholder-orange-500::placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.lg\:placeholder-orange-600:-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.lg\:placeholder-orange-600::-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.lg\:placeholder-orange-600::placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.lg\:placeholder-orange-700:-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.lg\:placeholder-orange-700::-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.lg\:placeholder-orange-700::placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.lg\:placeholder-orange-800:-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.lg\:placeholder-orange-800::-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.lg\:placeholder-orange-800::placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.lg\:placeholder-orange-900:-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.lg\:placeholder-orange-900::-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.lg\:placeholder-orange-900::placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.lg\:placeholder-yellow-100:-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.lg\:placeholder-yellow-100::-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.lg\:placeholder-yellow-100::placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.lg\:placeholder-yellow-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.lg\:placeholder-yellow-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.lg\:placeholder-yellow-200::placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.lg\:placeholder-yellow-300:-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.lg\:placeholder-yellow-300::-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.lg\:placeholder-yellow-300::placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.lg\:placeholder-yellow-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.lg\:placeholder-yellow-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.lg\:placeholder-yellow-400::placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.lg\:placeholder-yellow-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.lg\:placeholder-yellow-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.lg\:placeholder-yellow-500::placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.lg\:placeholder-yellow-600:-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.lg\:placeholder-yellow-600::-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.lg\:placeholder-yellow-600::placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.lg\:placeholder-yellow-700:-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.lg\:placeholder-yellow-700::-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.lg\:placeholder-yellow-700::placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.lg\:placeholder-yellow-800:-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.lg\:placeholder-yellow-800::-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.lg\:placeholder-yellow-800::placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.lg\:placeholder-yellow-900:-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.lg\:placeholder-yellow-900::-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.lg\:placeholder-yellow-900::placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.lg\:placeholder-green-100:-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.lg\:placeholder-green-100::-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.lg\:placeholder-green-100::placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.lg\:placeholder-green-200:-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.lg\:placeholder-green-200::-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.lg\:placeholder-green-200::placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.lg\:placeholder-green-300:-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.lg\:placeholder-green-300::-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.lg\:placeholder-green-300::placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.lg\:placeholder-green-400:-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.lg\:placeholder-green-400::-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.lg\:placeholder-green-400::placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.lg\:placeholder-green-500:-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.lg\:placeholder-green-500::-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.lg\:placeholder-green-500::placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.lg\:placeholder-green-600:-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.lg\:placeholder-green-600::-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.lg\:placeholder-green-600::placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.lg\:placeholder-green-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.lg\:placeholder-green-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.lg\:placeholder-green-700::placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.lg\:placeholder-green-800:-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.lg\:placeholder-green-800::-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.lg\:placeholder-green-800::placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.lg\:placeholder-green-900:-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.lg\:placeholder-green-900::-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.lg\:placeholder-green-900::placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.lg\:placeholder-teal-100:-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.lg\:placeholder-teal-100::-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.lg\:placeholder-teal-100::placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.lg\:placeholder-teal-200:-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.lg\:placeholder-teal-200::-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.lg\:placeholder-teal-200::placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.lg\:placeholder-teal-300:-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.lg\:placeholder-teal-300::-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.lg\:placeholder-teal-300::placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.lg\:placeholder-teal-400:-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.lg\:placeholder-teal-400::-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.lg\:placeholder-teal-400::placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.lg\:placeholder-teal-500:-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.lg\:placeholder-teal-500::-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.lg\:placeholder-teal-500::placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.lg\:placeholder-teal-600:-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.lg\:placeholder-teal-600::-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.lg\:placeholder-teal-600::placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.lg\:placeholder-teal-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.lg\:placeholder-teal-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.lg\:placeholder-teal-700::placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.lg\:placeholder-teal-800:-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.lg\:placeholder-teal-800::-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.lg\:placeholder-teal-800::placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.lg\:placeholder-teal-900:-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.lg\:placeholder-teal-900::-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.lg\:placeholder-teal-900::placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.lg\:placeholder-blue-100:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.lg\:placeholder-blue-100::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.lg\:placeholder-blue-100::placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.lg\:placeholder-blue-200:-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.lg\:placeholder-blue-200::-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.lg\:placeholder-blue-200::placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.lg\:placeholder-blue-300:-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.lg\:placeholder-blue-300::-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.lg\:placeholder-blue-300::placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.lg\:placeholder-blue-400:-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.lg\:placeholder-blue-400::-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.lg\:placeholder-blue-400::placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.lg\:placeholder-blue-500:-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.lg\:placeholder-blue-500::-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.lg\:placeholder-blue-500::placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.lg\:placeholder-blue-600:-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.lg\:placeholder-blue-600::-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.lg\:placeholder-blue-600::placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.lg\:placeholder-blue-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.lg\:placeholder-blue-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.lg\:placeholder-blue-700::placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.lg\:placeholder-blue-800:-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.lg\:placeholder-blue-800::-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.lg\:placeholder-blue-800::placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.lg\:placeholder-blue-900:-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.lg\:placeholder-blue-900::-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.lg\:placeholder-blue-900::placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.lg\:placeholder-indigo-100:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.lg\:placeholder-indigo-100::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.lg\:placeholder-indigo-100::placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.lg\:placeholder-indigo-200:-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.lg\:placeholder-indigo-200::-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.lg\:placeholder-indigo-200::placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.lg\:placeholder-indigo-300:-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.lg\:placeholder-indigo-300::-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.lg\:placeholder-indigo-300::placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.lg\:placeholder-indigo-400:-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.lg\:placeholder-indigo-400::-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.lg\:placeholder-indigo-400::placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.lg\:placeholder-indigo-500:-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.lg\:placeholder-indigo-500::-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.lg\:placeholder-indigo-500::placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.lg\:placeholder-indigo-600:-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.lg\:placeholder-indigo-600::-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.lg\:placeholder-indigo-600::placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.lg\:placeholder-indigo-700:-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.lg\:placeholder-indigo-700::-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.lg\:placeholder-indigo-700::placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.lg\:placeholder-indigo-800:-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.lg\:placeholder-indigo-800::-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.lg\:placeholder-indigo-800::placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.lg\:placeholder-indigo-900:-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.lg\:placeholder-indigo-900::-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.lg\:placeholder-indigo-900::placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.lg\:placeholder-purple-100:-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.lg\:placeholder-purple-100::-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.lg\:placeholder-purple-100::placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.lg\:placeholder-purple-200:-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.lg\:placeholder-purple-200::-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.lg\:placeholder-purple-200::placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.lg\:placeholder-purple-300:-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.lg\:placeholder-purple-300::-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.lg\:placeholder-purple-300::placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.lg\:placeholder-purple-400:-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.lg\:placeholder-purple-400::-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.lg\:placeholder-purple-400::placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.lg\:placeholder-purple-500:-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.lg\:placeholder-purple-500::-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.lg\:placeholder-purple-500::placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.lg\:placeholder-purple-600:-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.lg\:placeholder-purple-600::-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.lg\:placeholder-purple-600::placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.lg\:placeholder-purple-700:-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.lg\:placeholder-purple-700::-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.lg\:placeholder-purple-700::placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.lg\:placeholder-purple-800:-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.lg\:placeholder-purple-800::-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.lg\:placeholder-purple-800::placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.lg\:placeholder-purple-900:-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.lg\:placeholder-purple-900::-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.lg\:placeholder-purple-900::placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.lg\:placeholder-pink-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.lg\:placeholder-pink-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.lg\:placeholder-pink-100::placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.lg\:placeholder-pink-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.lg\:placeholder-pink-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.lg\:placeholder-pink-200::placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.lg\:placeholder-pink-300:-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.lg\:placeholder-pink-300::-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.lg\:placeholder-pink-300::placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.lg\:placeholder-pink-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.lg\:placeholder-pink-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.lg\:placeholder-pink-400::placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.lg\:placeholder-pink-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.lg\:placeholder-pink-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.lg\:placeholder-pink-500::placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.lg\:placeholder-pink-600:-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.lg\:placeholder-pink-600::-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.lg\:placeholder-pink-600::placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.lg\:placeholder-pink-700:-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.lg\:placeholder-pink-700::-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.lg\:placeholder-pink-700::placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.lg\:placeholder-pink-800:-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.lg\:placeholder-pink-800::-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.lg\:placeholder-pink-800::placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.lg\:placeholder-pink-900:-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.lg\:placeholder-pink-900::-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.lg\:placeholder-pink-900::placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.lg\:focus\:placeholder-transparent:focus:-ms-input-placeholder{color:transparent}.lg\:focus\:placeholder-transparent:focus::-ms-input-placeholder{color:transparent}.lg\:focus\:placeholder-transparent:focus::placeholder{color:transparent}.lg\:focus\:placeholder-current:focus:-ms-input-placeholder{color:currentColor}.lg\:focus\:placeholder-current:focus::-ms-input-placeholder{color:currentColor}.lg\:focus\:placeholder-current:focus::placeholder{color:currentColor}.lg\:focus\:placeholder-black:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.lg\:focus\:placeholder-black:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.lg\:focus\:placeholder-black:focus::placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.lg\:focus\:placeholder-white:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-white:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-white:focus::placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-100:focus::placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-200:focus::placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-300:focus::placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-400:focus::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-500:focus::placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-600:focus::placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-700:focus::placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-800:focus::placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.lg\:focus\:placeholder-gray-900:focus::placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-100:focus::placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-200:focus::placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-300:focus::placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-400:focus::placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-500:focus::placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-600:focus::placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-700:focus::placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-800:focus::placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.lg\:focus\:placeholder-red-900:focus::placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-100:focus::placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-200:focus::placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-300:focus::placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-400:focus::placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-500:focus::placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-600:focus::placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-700:focus::placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-800:focus::placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.lg\:focus\:placeholder-orange-900:focus::placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-100:focus::placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-200:focus::placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-300:focus::placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-400:focus::placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-500:focus::placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-600:focus::placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-700:focus::placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-800:focus::placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.lg\:focus\:placeholder-yellow-900:focus::placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-100:focus::placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-200:focus::placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-300:focus::placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-400:focus::placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-500:focus::placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-600:focus::placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-700:focus::placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-800:focus::placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.lg\:focus\:placeholder-green-900:focus::placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-100:focus::placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-200:focus::placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-300:focus::placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-400:focus::placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-500:focus::placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-600:focus::placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-700:focus::placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-800:focus::placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.lg\:focus\:placeholder-teal-900:focus::placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-100:focus::placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-200:focus::placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-300:focus::placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-400:focus::placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-500:focus::placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-600:focus::placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-700:focus::placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-800:focus::placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.lg\:focus\:placeholder-blue-900:focus::placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-100:focus::placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-200:focus::placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-300:focus::placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-400:focus::placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-500:focus::placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-600:focus::placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-700:focus::placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-800:focus::placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.lg\:focus\:placeholder-indigo-900:focus::placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-100:focus::placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-200:focus::placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-300:focus::placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-400:focus::placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-500:focus::placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-600:focus::placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-700:focus::placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-800:focus::placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.lg\:focus\:placeholder-purple-900:focus::placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-100:focus::placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-200:focus::placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-300:focus::placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-400:focus::placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-500:focus::placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-600:focus::placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-700:focus::placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-800:focus::placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.lg\:focus\:placeholder-pink-900:focus::placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.lg\:placeholder-opacity-0:-ms-input-placeholder{--placeholder-opacity:0}.lg\:placeholder-opacity-0::-ms-input-placeholder{--placeholder-opacity:0}.lg\:placeholder-opacity-0::placeholder{--placeholder-opacity:0}.lg\:placeholder-opacity-25:-ms-input-placeholder{--placeholder-opacity:0.25}.lg\:placeholder-opacity-25::-ms-input-placeholder{--placeholder-opacity:0.25}.lg\:placeholder-opacity-25::placeholder{--placeholder-opacity:0.25}.lg\:placeholder-opacity-50:-ms-input-placeholder{--placeholder-opacity:0.5}.lg\:placeholder-opacity-50::-ms-input-placeholder{--placeholder-opacity:0.5}.lg\:placeholder-opacity-50::placeholder{--placeholder-opacity:0.5}.lg\:placeholder-opacity-75:-ms-input-placeholder{--placeholder-opacity:0.75}.lg\:placeholder-opacity-75::-ms-input-placeholder{--placeholder-opacity:0.75}.lg\:placeholder-opacity-75::placeholder{--placeholder-opacity:0.75}.lg\:placeholder-opacity-100:-ms-input-placeholder{--placeholder-opacity:1}.lg\:placeholder-opacity-100::-ms-input-placeholder{--placeholder-opacity:1}.lg\:placeholder-opacity-100::placeholder{--placeholder-opacity:1}.lg\:focus\:placeholder-opacity-0:focus:-ms-input-placeholder{--placeholder-opacity:0}.lg\:focus\:placeholder-opacity-0:focus::-ms-input-placeholder{--placeholder-opacity:0}.lg\:focus\:placeholder-opacity-0:focus::placeholder{--placeholder-opacity:0}.lg\:focus\:placeholder-opacity-25:focus:-ms-input-placeholder{--placeholder-opacity:0.25}.lg\:focus\:placeholder-opacity-25:focus::-ms-input-placeholder{--placeholder-opacity:0.25}.lg\:focus\:placeholder-opacity-25:focus::placeholder{--placeholder-opacity:0.25}.lg\:focus\:placeholder-opacity-50:focus:-ms-input-placeholder{--placeholder-opacity:0.5}.lg\:focus\:placeholder-opacity-50:focus::-ms-input-placeholder{--placeholder-opacity:0.5}.lg\:focus\:placeholder-opacity-50:focus::placeholder{--placeholder-opacity:0.5}.lg\:focus\:placeholder-opacity-75:focus:-ms-input-placeholder{--placeholder-opacity:0.75}.lg\:focus\:placeholder-opacity-75:focus::-ms-input-placeholder{--placeholder-opacity:0.75}.lg\:focus\:placeholder-opacity-75:focus::placeholder{--placeholder-opacity:0.75}.lg\:focus\:placeholder-opacity-100:focus:-ms-input-placeholder{--placeholder-opacity:1}.lg\:focus\:placeholder-opacity-100:focus::-ms-input-placeholder{--placeholder-opacity:1}.lg\:focus\:placeholder-opacity-100:focus::placeholder{--placeholder-opacity:1}.lg\:pointer-events-none{pointer-events:none}.lg\:pointer-events-auto{pointer-events:auto}.lg\:static{position:static}.lg\:fixed{position:fixed}.lg\:absolute{position:absolute}.lg\:relative{position:relative}.lg\:sticky{position:-webkit-sticky;position:sticky}.lg\:inset-0{top:0;right:0;bottom:0;left:0}.lg\:inset-auto{top:auto;right:auto;bottom:auto;left:auto}.lg\:inset-y-0{top:0;bottom:0}.lg\:inset-x-0{right:0;left:0}.lg\:inset-y-auto{top:auto;bottom:auto}.lg\:inset-x-auto{right:auto;left:auto}.lg\:top-0{top:0}.lg\:right-0{right:0}.lg\:bottom-0{bottom:0}.lg\:left-0{left:0}.lg\:top-auto{top:auto}.lg\:right-auto{right:auto}.lg\:bottom-auto{bottom:auto}.lg\:left-auto{left:auto}.lg\:resize-none{resize:none}.lg\:resize-y{resize:vertical}.lg\:resize-x{resize:horizontal}.lg\:resize{resize:both}.lg\:shadow-xs{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.lg\:shadow-sm{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.lg\:shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.lg\:shadow-md{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.lg\:shadow-lg{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.lg\:shadow-xl{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.lg\:shadow-2xl{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.lg\:shadow-inner{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.lg\:shadow-outline{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.lg\:shadow-none{box-shadow:none}.lg\:hover\:shadow-xs:hover{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.lg\:hover\:shadow-sm:hover{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.lg\:hover\:shadow:hover{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.lg\:hover\:shadow-md:hover{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.lg\:hover\:shadow-lg:hover{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.lg\:hover\:shadow-xl:hover{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.lg\:hover\:shadow-2xl:hover{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.lg\:hover\:shadow-inner:hover{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.lg\:hover\:shadow-outline:hover{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.lg\:hover\:shadow-none:hover{box-shadow:none}.lg\:focus\:shadow-xs:focus{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.lg\:focus\:shadow-sm:focus{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.lg\:focus\:shadow:focus{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.lg\:focus\:shadow-md:focus{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.lg\:focus\:shadow-lg:focus{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.lg\:focus\:shadow-xl:focus{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.lg\:focus\:shadow-2xl:focus{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.lg\:focus\:shadow-inner:focus{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.lg\:focus\:shadow-outline:focus{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.lg\:focus\:shadow-none:focus{box-shadow:none}.lg\:fill-current{fill:currentColor}.lg\:stroke-current{stroke:currentColor}.lg\:stroke-0{stroke-width:0}.lg\:stroke-1{stroke-width:1}.lg\:stroke-2{stroke-width:2}.lg\:table-auto{table-layout:auto}.lg\:table-fixed{table-layout:fixed}.lg\:text-left{text-align:left}.lg\:text-center{text-align:center}.lg\:text-right{text-align:right}.lg\:text-justify{text-align:justify}.lg\:text-transparent{color:transparent}.lg\:text-current{color:currentColor}.lg\:text-black{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.lg\:text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.lg\:text-gray-100{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.lg\:text-gray-200{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.lg\:text-gray-300{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.lg\:text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.lg\:text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.lg\:text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.lg\:text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.lg\:text-gray-800{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.lg\:text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.lg\:text-red-100{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.lg\:text-red-200{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.lg\:text-red-300{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.lg\:text-red-400{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.lg\:text-red-500{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.lg\:text-red-600{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.lg\:text-red-700{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.lg\:text-red-800{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.lg\:text-red-900{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.lg\:text-orange-100{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.lg\:text-orange-200{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.lg\:text-orange-300{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.lg\:text-orange-400{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.lg\:text-orange-500{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.lg\:text-orange-600{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.lg\:text-orange-700{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.lg\:text-orange-800{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.lg\:text-orange-900{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.lg\:text-yellow-100{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.lg\:text-yellow-200{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.lg\:text-yellow-300{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.lg\:text-yellow-400{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.lg\:text-yellow-500{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.lg\:text-yellow-600{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.lg\:text-yellow-700{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.lg\:text-yellow-800{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.lg\:text-yellow-900{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.lg\:text-green-100{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.lg\:text-green-200{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.lg\:text-green-300{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.lg\:text-green-400{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.lg\:text-green-500{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.lg\:text-green-600{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.lg\:text-green-700{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.lg\:text-green-800{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.lg\:text-green-900{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.lg\:text-teal-100{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.lg\:text-teal-200{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.lg\:text-teal-300{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.lg\:text-teal-400{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.lg\:text-teal-500{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.lg\:text-teal-600{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.lg\:text-teal-700{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.lg\:text-teal-800{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.lg\:text-teal-900{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.lg\:text-blue-100{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.lg\:text-blue-200{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.lg\:text-blue-300{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.lg\:text-blue-400{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.lg\:text-blue-500{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.lg\:text-blue-600{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.lg\:text-blue-700{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.lg\:text-blue-800{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.lg\:text-blue-900{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.lg\:text-indigo-100{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.lg\:text-indigo-200{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.lg\:text-indigo-300{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.lg\:text-indigo-400{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.lg\:text-indigo-500{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.lg\:text-indigo-600{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.lg\:text-indigo-700{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.lg\:text-indigo-800{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.lg\:text-indigo-900{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.lg\:text-purple-100{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.lg\:text-purple-200{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.lg\:text-purple-300{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.lg\:text-purple-400{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.lg\:text-purple-500{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.lg\:text-purple-600{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.lg\:text-purple-700{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.lg\:text-purple-800{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.lg\:text-purple-900{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.lg\:text-pink-100{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.lg\:text-pink-200{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.lg\:text-pink-300{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.lg\:text-pink-400{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.lg\:text-pink-500{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.lg\:text-pink-600{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.lg\:text-pink-700{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.lg\:text-pink-800{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.lg\:text-pink-900{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.lg\:hover\:text-transparent:hover{color:transparent}.lg\:hover\:text-current:hover{color:currentColor}.lg\:hover\:text-black:hover{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.lg\:hover\:text-white:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.lg\:hover\:text-gray-100:hover{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.lg\:hover\:text-gray-200:hover{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.lg\:hover\:text-gray-300:hover{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.lg\:hover\:text-gray-400:hover{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.lg\:hover\:text-gray-500:hover{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.lg\:hover\:text-gray-600:hover{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.lg\:hover\:text-gray-700:hover{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.lg\:hover\:text-gray-800:hover{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.lg\:hover\:text-gray-900:hover{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.lg\:hover\:text-red-100:hover{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.lg\:hover\:text-red-200:hover{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.lg\:hover\:text-red-300:hover{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.lg\:hover\:text-red-400:hover{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.lg\:hover\:text-red-500:hover{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.lg\:hover\:text-red-600:hover{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.lg\:hover\:text-red-700:hover{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.lg\:hover\:text-red-800:hover{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.lg\:hover\:text-red-900:hover{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.lg\:hover\:text-orange-100:hover{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.lg\:hover\:text-orange-200:hover{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.lg\:hover\:text-orange-300:hover{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.lg\:hover\:text-orange-400:hover{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.lg\:hover\:text-orange-500:hover{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.lg\:hover\:text-orange-600:hover{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.lg\:hover\:text-orange-700:hover{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.lg\:hover\:text-orange-800:hover{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.lg\:hover\:text-orange-900:hover{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.lg\:hover\:text-yellow-100:hover{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.lg\:hover\:text-yellow-200:hover{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.lg\:hover\:text-yellow-300:hover{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.lg\:hover\:text-yellow-400:hover{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.lg\:hover\:text-yellow-500:hover{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.lg\:hover\:text-yellow-600:hover{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.lg\:hover\:text-yellow-700:hover{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.lg\:hover\:text-yellow-800:hover{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.lg\:hover\:text-yellow-900:hover{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.lg\:hover\:text-green-100:hover{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.lg\:hover\:text-green-200:hover{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.lg\:hover\:text-green-300:hover{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.lg\:hover\:text-green-400:hover{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.lg\:hover\:text-green-500:hover{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.lg\:hover\:text-green-600:hover{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.lg\:hover\:text-green-700:hover{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.lg\:hover\:text-green-800:hover{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.lg\:hover\:text-green-900:hover{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.lg\:hover\:text-teal-100:hover{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.lg\:hover\:text-teal-200:hover{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.lg\:hover\:text-teal-300:hover{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.lg\:hover\:text-teal-400:hover{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.lg\:hover\:text-teal-500:hover{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.lg\:hover\:text-teal-600:hover{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.lg\:hover\:text-teal-700:hover{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.lg\:hover\:text-teal-800:hover{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.lg\:hover\:text-teal-900:hover{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.lg\:hover\:text-blue-100:hover{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.lg\:hover\:text-blue-200:hover{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.lg\:hover\:text-blue-300:hover{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.lg\:hover\:text-blue-400:hover{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.lg\:hover\:text-blue-500:hover{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.lg\:hover\:text-blue-600:hover{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.lg\:hover\:text-blue-700:hover{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.lg\:hover\:text-blue-800:hover{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.lg\:hover\:text-blue-900:hover{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.lg\:hover\:text-indigo-100:hover{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.lg\:hover\:text-indigo-200:hover{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.lg\:hover\:text-indigo-300:hover{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.lg\:hover\:text-indigo-400:hover{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.lg\:hover\:text-indigo-500:hover{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.lg\:hover\:text-indigo-600:hover{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.lg\:hover\:text-indigo-700:hover{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.lg\:hover\:text-indigo-800:hover{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.lg\:hover\:text-indigo-900:hover{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.lg\:hover\:text-purple-100:hover{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.lg\:hover\:text-purple-200:hover{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.lg\:hover\:text-purple-300:hover{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.lg\:hover\:text-purple-400:hover{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.lg\:hover\:text-purple-500:hover{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.lg\:hover\:text-purple-600:hover{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.lg\:hover\:text-purple-700:hover{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.lg\:hover\:text-purple-800:hover{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.lg\:hover\:text-purple-900:hover{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.lg\:hover\:text-pink-100:hover{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.lg\:hover\:text-pink-200:hover{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.lg\:hover\:text-pink-300:hover{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.lg\:hover\:text-pink-400:hover{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.lg\:hover\:text-pink-500:hover{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.lg\:hover\:text-pink-600:hover{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.lg\:hover\:text-pink-700:hover{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.lg\:hover\:text-pink-800:hover{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.lg\:hover\:text-pink-900:hover{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.lg\:focus\:text-transparent:focus{color:transparent}.lg\:focus\:text-current:focus{color:currentColor}.lg\:focus\:text-black:focus{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.lg\:focus\:text-white:focus{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.lg\:focus\:text-gray-100:focus{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.lg\:focus\:text-gray-200:focus{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.lg\:focus\:text-gray-300:focus{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.lg\:focus\:text-gray-400:focus{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.lg\:focus\:text-gray-500:focus{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.lg\:focus\:text-gray-600:focus{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.lg\:focus\:text-gray-700:focus{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.lg\:focus\:text-gray-800:focus{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.lg\:focus\:text-gray-900:focus{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.lg\:focus\:text-red-100:focus{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.lg\:focus\:text-red-200:focus{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.lg\:focus\:text-red-300:focus{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.lg\:focus\:text-red-400:focus{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.lg\:focus\:text-red-500:focus{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.lg\:focus\:text-red-600:focus{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.lg\:focus\:text-red-700:focus{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.lg\:focus\:text-red-800:focus{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.lg\:focus\:text-red-900:focus{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.lg\:focus\:text-orange-100:focus{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.lg\:focus\:text-orange-200:focus{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.lg\:focus\:text-orange-300:focus{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.lg\:focus\:text-orange-400:focus{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.lg\:focus\:text-orange-500:focus{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.lg\:focus\:text-orange-600:focus{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.lg\:focus\:text-orange-700:focus{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.lg\:focus\:text-orange-800:focus{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.lg\:focus\:text-orange-900:focus{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.lg\:focus\:text-yellow-100:focus{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.lg\:focus\:text-yellow-200:focus{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.lg\:focus\:text-yellow-300:focus{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.lg\:focus\:text-yellow-400:focus{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.lg\:focus\:text-yellow-500:focus{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.lg\:focus\:text-yellow-600:focus{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.lg\:focus\:text-yellow-700:focus{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.lg\:focus\:text-yellow-800:focus{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.lg\:focus\:text-yellow-900:focus{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.lg\:focus\:text-green-100:focus{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.lg\:focus\:text-green-200:focus{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.lg\:focus\:text-green-300:focus{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.lg\:focus\:text-green-400:focus{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.lg\:focus\:text-green-500:focus{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.lg\:focus\:text-green-600:focus{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.lg\:focus\:text-green-700:focus{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.lg\:focus\:text-green-800:focus{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.lg\:focus\:text-green-900:focus{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.lg\:focus\:text-teal-100:focus{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.lg\:focus\:text-teal-200:focus{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.lg\:focus\:text-teal-300:focus{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.lg\:focus\:text-teal-400:focus{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.lg\:focus\:text-teal-500:focus{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.lg\:focus\:text-teal-600:focus{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.lg\:focus\:text-teal-700:focus{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.lg\:focus\:text-teal-800:focus{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.lg\:focus\:text-teal-900:focus{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.lg\:focus\:text-blue-100:focus{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.lg\:focus\:text-blue-200:focus{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.lg\:focus\:text-blue-300:focus{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.lg\:focus\:text-blue-400:focus{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.lg\:focus\:text-blue-500:focus{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.lg\:focus\:text-blue-600:focus{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.lg\:focus\:text-blue-700:focus{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.lg\:focus\:text-blue-800:focus{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.lg\:focus\:text-blue-900:focus{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.lg\:focus\:text-indigo-100:focus{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.lg\:focus\:text-indigo-200:focus{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.lg\:focus\:text-indigo-300:focus{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.lg\:focus\:text-indigo-400:focus{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.lg\:focus\:text-indigo-500:focus{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.lg\:focus\:text-indigo-600:focus{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.lg\:focus\:text-indigo-700:focus{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.lg\:focus\:text-indigo-800:focus{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.lg\:focus\:text-indigo-900:focus{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.lg\:focus\:text-purple-100:focus{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.lg\:focus\:text-purple-200:focus{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.lg\:focus\:text-purple-300:focus{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.lg\:focus\:text-purple-400:focus{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.lg\:focus\:text-purple-500:focus{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.lg\:focus\:text-purple-600:focus{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.lg\:focus\:text-purple-700:focus{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.lg\:focus\:text-purple-800:focus{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.lg\:focus\:text-purple-900:focus{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.lg\:focus\:text-pink-100:focus{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.lg\:focus\:text-pink-200:focus{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.lg\:focus\:text-pink-300:focus{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.lg\:focus\:text-pink-400:focus{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.lg\:focus\:text-pink-500:focus{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.lg\:focus\:text-pink-600:focus{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.lg\:focus\:text-pink-700:focus{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.lg\:focus\:text-pink-800:focus{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.lg\:focus\:text-pink-900:focus{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.lg\:text-opacity-0{--text-opacity:0}.lg\:text-opacity-25{--text-opacity:0.25}.lg\:text-opacity-50{--text-opacity:0.5}.lg\:text-opacity-75{--text-opacity:0.75}.lg\:text-opacity-100{--text-opacity:1}.lg\:hover\:text-opacity-0:hover{--text-opacity:0}.lg\:hover\:text-opacity-25:hover{--text-opacity:0.25}.lg\:hover\:text-opacity-50:hover{--text-opacity:0.5}.lg\:hover\:text-opacity-75:hover{--text-opacity:0.75}.lg\:hover\:text-opacity-100:hover{--text-opacity:1}.lg\:focus\:text-opacity-0:focus{--text-opacity:0}.lg\:focus\:text-opacity-25:focus{--text-opacity:0.25}.lg\:focus\:text-opacity-50:focus{--text-opacity:0.5}.lg\:focus\:text-opacity-75:focus{--text-opacity:0.75}.lg\:focus\:text-opacity-100:focus{--text-opacity:1}.lg\:italic{font-style:italic}.lg\:not-italic{font-style:normal}.lg\:uppercase{text-transform:uppercase}.lg\:lowercase{text-transform:lowercase}.lg\:capitalize{text-transform:capitalize}.lg\:normal-case{text-transform:none}.lg\:underline{text-decoration:underline}.lg\:line-through{text-decoration:line-through}.lg\:no-underline{text-decoration:none}.lg\:hover\:underline:hover{text-decoration:underline}.lg\:hover\:line-through:hover{text-decoration:line-through}.lg\:hover\:no-underline:hover{text-decoration:none}.lg\:focus\:underline:focus{text-decoration:underline}.lg\:focus\:line-through:focus{text-decoration:line-through}.lg\:focus\:no-underline:focus{text-decoration:none}.lg\:antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.lg\:subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.lg\:diagonal-fractions,.lg\:lining-nums,.lg\:oldstyle-nums,.lg\:ordinal,.lg\:proportional-nums,.lg\:slashed-zero,.lg\:stacked-fractions,.lg\:tabular-nums{--font-variant-numeric-ordinal:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-slashed-zero:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-figure:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-spacing:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-fraction:var(--tailwind-empty, );/*!*//*!*/font-variant-numeric:var(--font-variant-numeric-ordinal) var(--font-variant-numeric-slashed-zero) var(--font-variant-numeric-figure) var(--font-variant-numeric-spacing) var(--font-variant-numeric-fraction)}.lg\:normal-nums{font-variant-numeric:normal}.lg\:ordinal{--font-variant-numeric-ordinal:ordinal}.lg\:slashed-zero{--font-variant-numeric-slashed-zero:slashed-zero}.lg\:lining-nums{--font-variant-numeric-figure:lining-nums}.lg\:oldstyle-nums{--font-variant-numeric-figure:oldstyle-nums}.lg\:proportional-nums{--font-variant-numeric-spacing:proportional-nums}.lg\:tabular-nums{--font-variant-numeric-spacing:tabular-nums}.lg\:diagonal-fractions{--font-variant-numeric-fraction:diagonal-fractions}.lg\:stacked-fractions{--font-variant-numeric-fraction:stacked-fractions}.lg\:tracking-tighter{letter-spacing:-.05em}.lg\:tracking-tight{letter-spacing:-.025em}.lg\:tracking-normal{letter-spacing:0}.lg\:tracking-wide{letter-spacing:.025em}.lg\:tracking-wider{letter-spacing:.05em}.lg\:tracking-widest{letter-spacing:.1em}.lg\:select-none{-webkit-user-select:none;-ms-user-select:none;user-select:none}.lg\:select-text{-webkit-user-select:text;-ms-user-select:text;user-select:text}.lg\:select-all{-webkit-user-select:all;-ms-user-select:all;user-select:all}.lg\:select-auto{-webkit-user-select:auto;-ms-user-select:auto;user-select:auto}.lg\:align-baseline{vertical-align:baseline}.lg\:align-top{vertical-align:top}.lg\:align-middle{vertical-align:middle}.lg\:align-bottom{vertical-align:bottom}.lg\:align-text-top{vertical-align:text-top}.lg\:align-text-bottom{vertical-align:text-bottom}.lg\:visible{visibility:visible}.lg\:invisible{visibility:hidden}.lg\:whitespace-normal{white-space:normal}.lg\:whitespace-no-wrap{white-space:nowrap}.lg\:whitespace-pre{white-space:pre}.lg\:whitespace-pre-line{white-space:pre-line}.lg\:whitespace-pre-wrap{white-space:pre-wrap}.lg\:break-normal{word-wrap:normal;overflow-wrap:normal;word-break:normal}.lg\:break-words{word-wrap:break-word;overflow-wrap:break-word}.lg\:break-all{word-break:break-all}.lg\:truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.lg\:w-0{width:0}.lg\:w-1{width:.25rem}.lg\:w-2{width:.5rem}.lg\:w-3{width:.75rem}.lg\:w-4{width:1rem}.lg\:w-5{width:1.25rem}.lg\:w-6{width:1.5rem}.lg\:w-8{width:2rem}.lg\:w-10{width:2.5rem}.lg\:w-12{width:3rem}.lg\:w-16{width:4rem}.lg\:w-20{width:5rem}.lg\:w-24{width:6rem}.lg\:w-32{width:8rem}.lg\:w-40{width:10rem}.lg\:w-48{width:12rem}.lg\:w-56{width:14rem}.lg\:w-64{width:16rem}.lg\:w-auto{width:auto}.lg\:w-px{width:1px}.lg\:w-1\/2{width:50%}.lg\:w-1\/3{width:33.333333%}.lg\:w-2\/3{width:66.666667%}.lg\:w-1\/4{width:25%}.lg\:w-2\/4{width:50%}.lg\:w-3\/4{width:75%}.lg\:w-1\/5{width:20%}.lg\:w-2\/5{width:40%}.lg\:w-3\/5{width:60%}.lg\:w-4\/5{width:80%}.lg\:w-1\/6{width:16.666667%}.lg\:w-2\/6{width:33.333333%}.lg\:w-3\/6{width:50%}.lg\:w-4\/6{width:66.666667%}.lg\:w-5\/6{width:83.333333%}.lg\:w-1\/12{width:8.333333%}.lg\:w-2\/12{width:16.666667%}.lg\:w-3\/12{width:25%}.lg\:w-4\/12{width:33.333333%}.lg\:w-5\/12{width:41.666667%}.lg\:w-6\/12{width:50%}.lg\:w-7\/12{width:58.333333%}.lg\:w-8\/12{width:66.666667%}.lg\:w-9\/12{width:75%}.lg\:w-10\/12{width:83.333333%}.lg\:w-11\/12{width:91.666667%}.lg\:w-full{width:100%}.lg\:w-screen{width:100vw}.lg\:z-0{z-index:0}.lg\:z-10{z-index:10}.lg\:z-20{z-index:20}.lg\:z-30{z-index:30}.lg\:z-40{z-index:40}.lg\:z-50{z-index:50}.lg\:z-auto{z-index:auto}.lg\:gap-0{grid-gap:0;gap:0}.lg\:gap-1{grid-gap:.25rem;gap:.25rem}.lg\:gap-2{grid-gap:.5rem;gap:.5rem}.lg\:gap-3{grid-gap:.75rem;gap:.75rem}.lg\:gap-4{grid-gap:1rem;gap:1rem}.lg\:gap-5{grid-gap:1.25rem;gap:1.25rem}.lg\:gap-6{grid-gap:1.5rem;gap:1.5rem}.lg\:gap-8{grid-gap:2rem;gap:2rem}.lg\:gap-10{grid-gap:2.5rem;gap:2.5rem}.lg\:gap-12{grid-gap:3rem;gap:3rem}.lg\:gap-16{grid-gap:4rem;gap:4rem}.lg\:gap-20{grid-gap:5rem;gap:5rem}.lg\:gap-24{grid-gap:6rem;gap:6rem}.lg\:gap-32{grid-gap:8rem;gap:8rem}.lg\:gap-40{grid-gap:10rem;gap:10rem}.lg\:gap-48{grid-gap:12rem;gap:12rem}.lg\:gap-56{grid-gap:14rem;gap:14rem}.lg\:gap-64{grid-gap:16rem;gap:16rem}.lg\:gap-px{grid-gap:1px;gap:1px}.lg\:col-gap-0{grid-column-gap:0;column-gap:0}.lg\:col-gap-1{grid-column-gap:.25rem;column-gap:.25rem}.lg\:col-gap-2{grid-column-gap:.5rem;column-gap:.5rem}.lg\:col-gap-3{grid-column-gap:.75rem;column-gap:.75rem}.lg\:col-gap-4{grid-column-gap:1rem;column-gap:1rem}.lg\:col-gap-5{grid-column-gap:1.25rem;column-gap:1.25rem}.lg\:col-gap-6{grid-column-gap:1.5rem;column-gap:1.5rem}.lg\:col-gap-8{grid-column-gap:2rem;column-gap:2rem}.lg\:col-gap-10{grid-column-gap:2.5rem;column-gap:2.5rem}.lg\:col-gap-12{grid-column-gap:3rem;column-gap:3rem}.lg\:col-gap-16{grid-column-gap:4rem;column-gap:4rem}.lg\:col-gap-20{grid-column-gap:5rem;column-gap:5rem}.lg\:col-gap-24{grid-column-gap:6rem;column-gap:6rem}.lg\:col-gap-32{grid-column-gap:8rem;column-gap:8rem}.lg\:col-gap-40{grid-column-gap:10rem;column-gap:10rem}.lg\:col-gap-48{grid-column-gap:12rem;column-gap:12rem}.lg\:col-gap-56{grid-column-gap:14rem;column-gap:14rem}.lg\:col-gap-64{grid-column-gap:16rem;column-gap:16rem}.lg\:col-gap-px{grid-column-gap:1px;column-gap:1px}.lg\:gap-x-0{grid-column-gap:0;column-gap:0}.lg\:gap-x-1{grid-column-gap:.25rem;column-gap:.25rem}.lg\:gap-x-2{grid-column-gap:.5rem;column-gap:.5rem}.lg\:gap-x-3{grid-column-gap:.75rem;column-gap:.75rem}.lg\:gap-x-4{grid-column-gap:1rem;column-gap:1rem}.lg\:gap-x-5{grid-column-gap:1.25rem;column-gap:1.25rem}.lg\:gap-x-6{grid-column-gap:1.5rem;column-gap:1.5rem}.lg\:gap-x-8{grid-column-gap:2rem;column-gap:2rem}.lg\:gap-x-10{grid-column-gap:2.5rem;column-gap:2.5rem}.lg\:gap-x-12{grid-column-gap:3rem;column-gap:3rem}.lg\:gap-x-16{grid-column-gap:4rem;column-gap:4rem}.lg\:gap-x-20{grid-column-gap:5rem;column-gap:5rem}.lg\:gap-x-24{grid-column-gap:6rem;column-gap:6rem}.lg\:gap-x-32{grid-column-gap:8rem;column-gap:8rem}.lg\:gap-x-40{grid-column-gap:10rem;column-gap:10rem}.lg\:gap-x-48{grid-column-gap:12rem;column-gap:12rem}.lg\:gap-x-56{grid-column-gap:14rem;column-gap:14rem}.lg\:gap-x-64{grid-column-gap:16rem;column-gap:16rem}.lg\:gap-x-px{grid-column-gap:1px;column-gap:1px}.lg\:row-gap-0{grid-row-gap:0;row-gap:0}.lg\:row-gap-1{grid-row-gap:.25rem;row-gap:.25rem}.lg\:row-gap-2{grid-row-gap:.5rem;row-gap:.5rem}.lg\:row-gap-3{grid-row-gap:.75rem;row-gap:.75rem}.lg\:row-gap-4{grid-row-gap:1rem;row-gap:1rem}.lg\:row-gap-5{grid-row-gap:1.25rem;row-gap:1.25rem}.lg\:row-gap-6{grid-row-gap:1.5rem;row-gap:1.5rem}.lg\:row-gap-8{grid-row-gap:2rem;row-gap:2rem}.lg\:row-gap-10{grid-row-gap:2.5rem;row-gap:2.5rem}.lg\:row-gap-12{grid-row-gap:3rem;row-gap:3rem}.lg\:row-gap-16{grid-row-gap:4rem;row-gap:4rem}.lg\:row-gap-20{grid-row-gap:5rem;row-gap:5rem}.lg\:row-gap-24{grid-row-gap:6rem;row-gap:6rem}.lg\:row-gap-32{grid-row-gap:8rem;row-gap:8rem}.lg\:row-gap-40{grid-row-gap:10rem;row-gap:10rem}.lg\:row-gap-48{grid-row-gap:12rem;row-gap:12rem}.lg\:row-gap-56{grid-row-gap:14rem;row-gap:14rem}.lg\:row-gap-64{grid-row-gap:16rem;row-gap:16rem}.lg\:row-gap-px{grid-row-gap:1px;row-gap:1px}.lg\:gap-y-0{grid-row-gap:0;row-gap:0}.lg\:gap-y-1{grid-row-gap:.25rem;row-gap:.25rem}.lg\:gap-y-2{grid-row-gap:.5rem;row-gap:.5rem}.lg\:gap-y-3{grid-row-gap:.75rem;row-gap:.75rem}.lg\:gap-y-4{grid-row-gap:1rem;row-gap:1rem}.lg\:gap-y-5{grid-row-gap:1.25rem;row-gap:1.25rem}.lg\:gap-y-6{grid-row-gap:1.5rem;row-gap:1.5rem}.lg\:gap-y-8{grid-row-gap:2rem;row-gap:2rem}.lg\:gap-y-10{grid-row-gap:2.5rem;row-gap:2.5rem}.lg\:gap-y-12{grid-row-gap:3rem;row-gap:3rem}.lg\:gap-y-16{grid-row-gap:4rem;row-gap:4rem}.lg\:gap-y-20{grid-row-gap:5rem;row-gap:5rem}.lg\:gap-y-24{grid-row-gap:6rem;row-gap:6rem}.lg\:gap-y-32{grid-row-gap:8rem;row-gap:8rem}.lg\:gap-y-40{grid-row-gap:10rem;row-gap:10rem}.lg\:gap-y-48{grid-row-gap:12rem;row-gap:12rem}.lg\:gap-y-56{grid-row-gap:14rem;row-gap:14rem}.lg\:gap-y-64{grid-row-gap:16rem;row-gap:16rem}.lg\:gap-y-px{grid-row-gap:1px;row-gap:1px}.lg\:grid-flow-row{grid-auto-flow:row}.lg\:grid-flow-col{grid-auto-flow:column}.lg\:grid-flow-row-dense{grid-auto-flow:row dense}.lg\:grid-flow-col-dense{grid-auto-flow:column dense}.lg\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.lg\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.lg\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.lg\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lg\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-cols-none{grid-template-columns:none}.lg\:auto-cols-auto{grid-auto-columns:auto}.lg\:auto-cols-min{grid-auto-columns:-webkit-min-content;grid-auto-columns:min-content}.lg\:auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.lg\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.lg\:col-auto{grid-column:auto}.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-5{grid-column:span 5/span 5}.lg\:col-span-6{grid-column:span 6/span 6}.lg\:col-span-7{grid-column:span 7/span 7}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:col-span-9{grid-column:span 9/span 9}.lg\:col-span-10{grid-column:span 10/span 10}.lg\:col-span-11{grid-column:span 11/span 11}.lg\:col-span-12{grid-column:span 12/span 12}.lg\:col-span-full{grid-column:1/-1}.lg\:col-start-1{grid-column-start:1}.lg\:col-start-2{grid-column-start:2}.lg\:col-start-3{grid-column-start:3}.lg\:col-start-4{grid-column-start:4}.lg\:col-start-5{grid-column-start:5}.lg\:col-start-6{grid-column-start:6}.lg\:col-start-7{grid-column-start:7}.lg\:col-start-8{grid-column-start:8}.lg\:col-start-9{grid-column-start:9}.lg\:col-start-10{grid-column-start:10}.lg\:col-start-11{grid-column-start:11}.lg\:col-start-12{grid-column-start:12}.lg\:col-start-13{grid-column-start:13}.lg\:col-start-auto{grid-column-start:auto}.lg\:col-end-1{grid-column-end:1}.lg\:col-end-2{grid-column-end:2}.lg\:col-end-3{grid-column-end:3}.lg\:col-end-4{grid-column-end:4}.lg\:col-end-5{grid-column-end:5}.lg\:col-end-6{grid-column-end:6}.lg\:col-end-7{grid-column-end:7}.lg\:col-end-8{grid-column-end:8}.lg\:col-end-9{grid-column-end:9}.lg\:col-end-10{grid-column-end:10}.lg\:col-end-11{grid-column-end:11}.lg\:col-end-12{grid-column-end:12}.lg\:col-end-13{grid-column-end:13}.lg\:col-end-auto{grid-column-end:auto}.lg\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.lg\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.lg\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.lg\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.lg\:grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.lg\:grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.lg\:grid-rows-none{grid-template-rows:none}.lg\:auto-rows-auto{grid-auto-rows:auto}.lg\:auto-rows-min{grid-auto-rows:-webkit-min-content;grid-auto-rows:min-content}.lg\:auto-rows-max{grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}.lg\:auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.lg\:row-auto{grid-row:auto}.lg\:row-span-1{grid-row:span 1/span 1}.lg\:row-span-2{grid-row:span 2/span 2}.lg\:row-span-3{grid-row:span 3/span 3}.lg\:row-span-4{grid-row:span 4/span 4}.lg\:row-span-5{grid-row:span 5/span 5}.lg\:row-span-6{grid-row:span 6/span 6}.lg\:row-span-full{grid-row:1/-1}.lg\:row-start-1{grid-row-start:1}.lg\:row-start-2{grid-row-start:2}.lg\:row-start-3{grid-row-start:3}.lg\:row-start-4{grid-row-start:4}.lg\:row-start-5{grid-row-start:5}.lg\:row-start-6{grid-row-start:6}.lg\:row-start-7{grid-row-start:7}.lg\:row-start-auto{grid-row-start:auto}.lg\:row-end-1{grid-row-end:1}.lg\:row-end-2{grid-row-end:2}.lg\:row-end-3{grid-row-end:3}.lg\:row-end-4{grid-row-end:4}.lg\:row-end-5{grid-row-end:5}.lg\:row-end-6{grid-row-end:6}.lg\:row-end-7{grid-row-end:7}.lg\:row-end-auto{grid-row-end:auto}.lg\:transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.lg\:transform-none{transform:none}.lg\:origin-center{transform-origin:center}.lg\:origin-top{transform-origin:top}.lg\:origin-top-right{transform-origin:top right}.lg\:origin-right{transform-origin:right}.lg\:origin-bottom-right{transform-origin:bottom right}.lg\:origin-bottom{transform-origin:bottom}.lg\:origin-bottom-left{transform-origin:bottom left}.lg\:origin-left{transform-origin:left}.lg\:origin-top-left{transform-origin:top left}.lg\:scale-0{--transform-scale-x:0;--transform-scale-y:0}.lg\:scale-50{--transform-scale-x:.5;--transform-scale-y:.5}.lg\:scale-75{--transform-scale-x:.75;--transform-scale-y:.75}.lg\:scale-90{--transform-scale-x:.9;--transform-scale-y:.9}.lg\:scale-95{--transform-scale-x:.95;--transform-scale-y:.95}.lg\:scale-100{--transform-scale-x:1;--transform-scale-y:1}.lg\:scale-105{--transform-scale-x:1.05;--transform-scale-y:1.05}.lg\:scale-110{--transform-scale-x:1.1;--transform-scale-y:1.1}.lg\:scale-125{--transform-scale-x:1.25;--transform-scale-y:1.25}.lg\:scale-150{--transform-scale-x:1.5;--transform-scale-y:1.5}.lg\:scale-x-0{--transform-scale-x:0}.lg\:scale-x-50{--transform-scale-x:.5}.lg\:scale-x-75{--transform-scale-x:.75}.lg\:scale-x-90{--transform-scale-x:.9}.lg\:scale-x-95{--transform-scale-x:.95}.lg\:scale-x-100{--transform-scale-x:1}.lg\:scale-x-105{--transform-scale-x:1.05}.lg\:scale-x-110{--transform-scale-x:1.1}.lg\:scale-x-125{--transform-scale-x:1.25}.lg\:scale-x-150{--transform-scale-x:1.5}.lg\:scale-y-0{--transform-scale-y:0}.lg\:scale-y-50{--transform-scale-y:.5}.lg\:scale-y-75{--transform-scale-y:.75}.lg\:scale-y-90{--transform-scale-y:.9}.lg\:scale-y-95{--transform-scale-y:.95}.lg\:scale-y-100{--transform-scale-y:1}.lg\:scale-y-105{--transform-scale-y:1.05}.lg\:scale-y-110{--transform-scale-y:1.1}.lg\:scale-y-125{--transform-scale-y:1.25}.lg\:scale-y-150{--transform-scale-y:1.5}.lg\:hover\:scale-0:hover{--transform-scale-x:0;--transform-scale-y:0}.lg\:hover\:scale-50:hover{--transform-scale-x:.5;--transform-scale-y:.5}.lg\:hover\:scale-75:hover{--transform-scale-x:.75;--transform-scale-y:.75}.lg\:hover\:scale-90:hover{--transform-scale-x:.9;--transform-scale-y:.9}.lg\:hover\:scale-95:hover{--transform-scale-x:.95;--transform-scale-y:.95}.lg\:hover\:scale-100:hover{--transform-scale-x:1;--transform-scale-y:1}.lg\:hover\:scale-105:hover{--transform-scale-x:1.05;--transform-scale-y:1.05}.lg\:hover\:scale-110:hover{--transform-scale-x:1.1;--transform-scale-y:1.1}.lg\:hover\:scale-125:hover{--transform-scale-x:1.25;--transform-scale-y:1.25}.lg\:hover\:scale-150:hover{--transform-scale-x:1.5;--transform-scale-y:1.5}.lg\:hover\:scale-x-0:hover{--transform-scale-x:0}.lg\:hover\:scale-x-50:hover{--transform-scale-x:.5}.lg\:hover\:scale-x-75:hover{--transform-scale-x:.75}.lg\:hover\:scale-x-90:hover{--transform-scale-x:.9}.lg\:hover\:scale-x-95:hover{--transform-scale-x:.95}.lg\:hover\:scale-x-100:hover{--transform-scale-x:1}.lg\:hover\:scale-x-105:hover{--transform-scale-x:1.05}.lg\:hover\:scale-x-110:hover{--transform-scale-x:1.1}.lg\:hover\:scale-x-125:hover{--transform-scale-x:1.25}.lg\:hover\:scale-x-150:hover{--transform-scale-x:1.5}.lg\:hover\:scale-y-0:hover{--transform-scale-y:0}.lg\:hover\:scale-y-50:hover{--transform-scale-y:.5}.lg\:hover\:scale-y-75:hover{--transform-scale-y:.75}.lg\:hover\:scale-y-90:hover{--transform-scale-y:.9}.lg\:hover\:scale-y-95:hover{--transform-scale-y:.95}.lg\:hover\:scale-y-100:hover{--transform-scale-y:1}.lg\:hover\:scale-y-105:hover{--transform-scale-y:1.05}.lg\:hover\:scale-y-110:hover{--transform-scale-y:1.1}.lg\:hover\:scale-y-125:hover{--transform-scale-y:1.25}.lg\:hover\:scale-y-150:hover{--transform-scale-y:1.5}.lg\:focus\:scale-0:focus{--transform-scale-x:0;--transform-scale-y:0}.lg\:focus\:scale-50:focus{--transform-scale-x:.5;--transform-scale-y:.5}.lg\:focus\:scale-75:focus{--transform-scale-x:.75;--transform-scale-y:.75}.lg\:focus\:scale-90:focus{--transform-scale-x:.9;--transform-scale-y:.9}.lg\:focus\:scale-95:focus{--transform-scale-x:.95;--transform-scale-y:.95}.lg\:focus\:scale-100:focus{--transform-scale-x:1;--transform-scale-y:1}.lg\:focus\:scale-105:focus{--transform-scale-x:1.05;--transform-scale-y:1.05}.lg\:focus\:scale-110:focus{--transform-scale-x:1.1;--transform-scale-y:1.1}.lg\:focus\:scale-125:focus{--transform-scale-x:1.25;--transform-scale-y:1.25}.lg\:focus\:scale-150:focus{--transform-scale-x:1.5;--transform-scale-y:1.5}.lg\:focus\:scale-x-0:focus{--transform-scale-x:0}.lg\:focus\:scale-x-50:focus{--transform-scale-x:.5}.lg\:focus\:scale-x-75:focus{--transform-scale-x:.75}.lg\:focus\:scale-x-90:focus{--transform-scale-x:.9}.lg\:focus\:scale-x-95:focus{--transform-scale-x:.95}.lg\:focus\:scale-x-100:focus{--transform-scale-x:1}.lg\:focus\:scale-x-105:focus{--transform-scale-x:1.05}.lg\:focus\:scale-x-110:focus{--transform-scale-x:1.1}.lg\:focus\:scale-x-125:focus{--transform-scale-x:1.25}.lg\:focus\:scale-x-150:focus{--transform-scale-x:1.5}.lg\:focus\:scale-y-0:focus{--transform-scale-y:0}.lg\:focus\:scale-y-50:focus{--transform-scale-y:.5}.lg\:focus\:scale-y-75:focus{--transform-scale-y:.75}.lg\:focus\:scale-y-90:focus{--transform-scale-y:.9}.lg\:focus\:scale-y-95:focus{--transform-scale-y:.95}.lg\:focus\:scale-y-100:focus{--transform-scale-y:1}.lg\:focus\:scale-y-105:focus{--transform-scale-y:1.05}.lg\:focus\:scale-y-110:focus{--transform-scale-y:1.1}.lg\:focus\:scale-y-125:focus{--transform-scale-y:1.25}.lg\:focus\:scale-y-150:focus{--transform-scale-y:1.5}.lg\:rotate-0{--transform-rotate:0}.lg\:rotate-1{--transform-rotate:1deg}.lg\:rotate-2{--transform-rotate:2deg}.lg\:rotate-3{--transform-rotate:3deg}.lg\:rotate-6{--transform-rotate:6deg}.lg\:rotate-12{--transform-rotate:12deg}.lg\:rotate-45{--transform-rotate:45deg}.lg\:rotate-90{--transform-rotate:90deg}.lg\:rotate-180{--transform-rotate:180deg}.lg\:-rotate-180{--transform-rotate:-180deg}.lg\:-rotate-90{--transform-rotate:-90deg}.lg\:-rotate-45{--transform-rotate:-45deg}.lg\:-rotate-12{--transform-rotate:-12deg}.lg\:-rotate-6{--transform-rotate:-6deg}.lg\:-rotate-3{--transform-rotate:-3deg}.lg\:-rotate-2{--transform-rotate:-2deg}.lg\:-rotate-1{--transform-rotate:-1deg}.lg\:hover\:rotate-0:hover{--transform-rotate:0}.lg\:hover\:rotate-1:hover{--transform-rotate:1deg}.lg\:hover\:rotate-2:hover{--transform-rotate:2deg}.lg\:hover\:rotate-3:hover{--transform-rotate:3deg}.lg\:hover\:rotate-6:hover{--transform-rotate:6deg}.lg\:hover\:rotate-12:hover{--transform-rotate:12deg}.lg\:hover\:rotate-45:hover{--transform-rotate:45deg}.lg\:hover\:rotate-90:hover{--transform-rotate:90deg}.lg\:hover\:rotate-180:hover{--transform-rotate:180deg}.lg\:hover\:-rotate-180:hover{--transform-rotate:-180deg}.lg\:hover\:-rotate-90:hover{--transform-rotate:-90deg}.lg\:hover\:-rotate-45:hover{--transform-rotate:-45deg}.lg\:hover\:-rotate-12:hover{--transform-rotate:-12deg}.lg\:hover\:-rotate-6:hover{--transform-rotate:-6deg}.lg\:hover\:-rotate-3:hover{--transform-rotate:-3deg}.lg\:hover\:-rotate-2:hover{--transform-rotate:-2deg}.lg\:hover\:-rotate-1:hover{--transform-rotate:-1deg}.lg\:focus\:rotate-0:focus{--transform-rotate:0}.lg\:focus\:rotate-1:focus{--transform-rotate:1deg}.lg\:focus\:rotate-2:focus{--transform-rotate:2deg}.lg\:focus\:rotate-3:focus{--transform-rotate:3deg}.lg\:focus\:rotate-6:focus{--transform-rotate:6deg}.lg\:focus\:rotate-12:focus{--transform-rotate:12deg}.lg\:focus\:rotate-45:focus{--transform-rotate:45deg}.lg\:focus\:rotate-90:focus{--transform-rotate:90deg}.lg\:focus\:rotate-180:focus{--transform-rotate:180deg}.lg\:focus\:-rotate-180:focus{--transform-rotate:-180deg}.lg\:focus\:-rotate-90:focus{--transform-rotate:-90deg}.lg\:focus\:-rotate-45:focus{--transform-rotate:-45deg}.lg\:focus\:-rotate-12:focus{--transform-rotate:-12deg}.lg\:focus\:-rotate-6:focus{--transform-rotate:-6deg}.lg\:focus\:-rotate-3:focus{--transform-rotate:-3deg}.lg\:focus\:-rotate-2:focus{--transform-rotate:-2deg}.lg\:focus\:-rotate-1:focus{--transform-rotate:-1deg}.lg\:translate-x-0{--transform-translate-x:0}.lg\:translate-x-1{--transform-translate-x:0.25rem}.lg\:translate-x-2{--transform-translate-x:0.5rem}.lg\:translate-x-3{--transform-translate-x:0.75rem}.lg\:translate-x-4{--transform-translate-x:1rem}.lg\:translate-x-5{--transform-translate-x:1.25rem}.lg\:translate-x-6{--transform-translate-x:1.5rem}.lg\:translate-x-8{--transform-translate-x:2rem}.lg\:translate-x-10{--transform-translate-x:2.5rem}.lg\:translate-x-12{--transform-translate-x:3rem}.lg\:translate-x-16{--transform-translate-x:4rem}.lg\:translate-x-20{--transform-translate-x:5rem}.lg\:translate-x-24{--transform-translate-x:6rem}.lg\:translate-x-32{--transform-translate-x:8rem}.lg\:translate-x-40{--transform-translate-x:10rem}.lg\:translate-x-48{--transform-translate-x:12rem}.lg\:translate-x-56{--transform-translate-x:14rem}.lg\:translate-x-64{--transform-translate-x:16rem}.lg\:translate-x-px{--transform-translate-x:1px}.lg\:-translate-x-1{--transform-translate-x:-0.25rem}.lg\:-translate-x-2{--transform-translate-x:-0.5rem}.lg\:-translate-x-3{--transform-translate-x:-0.75rem}.lg\:-translate-x-4{--transform-translate-x:-1rem}.lg\:-translate-x-5{--transform-translate-x:-1.25rem}.lg\:-translate-x-6{--transform-translate-x:-1.5rem}.lg\:-translate-x-8{--transform-translate-x:-2rem}.lg\:-translate-x-10{--transform-translate-x:-2.5rem}.lg\:-translate-x-12{--transform-translate-x:-3rem}.lg\:-translate-x-16{--transform-translate-x:-4rem}.lg\:-translate-x-20{--transform-translate-x:-5rem}.lg\:-translate-x-24{--transform-translate-x:-6rem}.lg\:-translate-x-32{--transform-translate-x:-8rem}.lg\:-translate-x-40{--transform-translate-x:-10rem}.lg\:-translate-x-48{--transform-translate-x:-12rem}.lg\:-translate-x-56{--transform-translate-x:-14rem}.lg\:-translate-x-64{--transform-translate-x:-16rem}.lg\:-translate-x-px{--transform-translate-x:-1px}.lg\:-translate-x-full{--transform-translate-x:-100%}.lg\:-translate-x-1\/2{--transform-translate-x:-50%}.lg\:translate-x-1\/2{--transform-translate-x:50%}.lg\:translate-x-full{--transform-translate-x:100%}.lg\:translate-y-0{--transform-translate-y:0}.lg\:translate-y-1{--transform-translate-y:0.25rem}.lg\:translate-y-2{--transform-translate-y:0.5rem}.lg\:translate-y-3{--transform-translate-y:0.75rem}.lg\:translate-y-4{--transform-translate-y:1rem}.lg\:translate-y-5{--transform-translate-y:1.25rem}.lg\:translate-y-6{--transform-translate-y:1.5rem}.lg\:translate-y-8{--transform-translate-y:2rem}.lg\:translate-y-10{--transform-translate-y:2.5rem}.lg\:translate-y-12{--transform-translate-y:3rem}.lg\:translate-y-16{--transform-translate-y:4rem}.lg\:translate-y-20{--transform-translate-y:5rem}.lg\:translate-y-24{--transform-translate-y:6rem}.lg\:translate-y-32{--transform-translate-y:8rem}.lg\:translate-y-40{--transform-translate-y:10rem}.lg\:translate-y-48{--transform-translate-y:12rem}.lg\:translate-y-56{--transform-translate-y:14rem}.lg\:translate-y-64{--transform-translate-y:16rem}.lg\:translate-y-px{--transform-translate-y:1px}.lg\:-translate-y-1{--transform-translate-y:-0.25rem}.lg\:-translate-y-2{--transform-translate-y:-0.5rem}.lg\:-translate-y-3{--transform-translate-y:-0.75rem}.lg\:-translate-y-4{--transform-translate-y:-1rem}.lg\:-translate-y-5{--transform-translate-y:-1.25rem}.lg\:-translate-y-6{--transform-translate-y:-1.5rem}.lg\:-translate-y-8{--transform-translate-y:-2rem}.lg\:-translate-y-10{--transform-translate-y:-2.5rem}.lg\:-translate-y-12{--transform-translate-y:-3rem}.lg\:-translate-y-16{--transform-translate-y:-4rem}.lg\:-translate-y-20{--transform-translate-y:-5rem}.lg\:-translate-y-24{--transform-translate-y:-6rem}.lg\:-translate-y-32{--transform-translate-y:-8rem}.lg\:-translate-y-40{--transform-translate-y:-10rem}.lg\:-translate-y-48{--transform-translate-y:-12rem}.lg\:-translate-y-56{--transform-translate-y:-14rem}.lg\:-translate-y-64{--transform-translate-y:-16rem}.lg\:-translate-y-px{--transform-translate-y:-1px}.lg\:-translate-y-full{--transform-translate-y:-100%}.lg\:-translate-y-1\/2{--transform-translate-y:-50%}.lg\:translate-y-1\/2{--transform-translate-y:50%}.lg\:translate-y-full{--transform-translate-y:100%}.lg\:hover\:translate-x-0:hover{--transform-translate-x:0}.lg\:hover\:translate-x-1:hover{--transform-translate-x:0.25rem}.lg\:hover\:translate-x-2:hover{--transform-translate-x:0.5rem}.lg\:hover\:translate-x-3:hover{--transform-translate-x:0.75rem}.lg\:hover\:translate-x-4:hover{--transform-translate-x:1rem}.lg\:hover\:translate-x-5:hover{--transform-translate-x:1.25rem}.lg\:hover\:translate-x-6:hover{--transform-translate-x:1.5rem}.lg\:hover\:translate-x-8:hover{--transform-translate-x:2rem}.lg\:hover\:translate-x-10:hover{--transform-translate-x:2.5rem}.lg\:hover\:translate-x-12:hover{--transform-translate-x:3rem}.lg\:hover\:translate-x-16:hover{--transform-translate-x:4rem}.lg\:hover\:translate-x-20:hover{--transform-translate-x:5rem}.lg\:hover\:translate-x-24:hover{--transform-translate-x:6rem}.lg\:hover\:translate-x-32:hover{--transform-translate-x:8rem}.lg\:hover\:translate-x-40:hover{--transform-translate-x:10rem}.lg\:hover\:translate-x-48:hover{--transform-translate-x:12rem}.lg\:hover\:translate-x-56:hover{--transform-translate-x:14rem}.lg\:hover\:translate-x-64:hover{--transform-translate-x:16rem}.lg\:hover\:translate-x-px:hover{--transform-translate-x:1px}.lg\:hover\:-translate-x-1:hover{--transform-translate-x:-0.25rem}.lg\:hover\:-translate-x-2:hover{--transform-translate-x:-0.5rem}.lg\:hover\:-translate-x-3:hover{--transform-translate-x:-0.75rem}.lg\:hover\:-translate-x-4:hover{--transform-translate-x:-1rem}.lg\:hover\:-translate-x-5:hover{--transform-translate-x:-1.25rem}.lg\:hover\:-translate-x-6:hover{--transform-translate-x:-1.5rem}.lg\:hover\:-translate-x-8:hover{--transform-translate-x:-2rem}.lg\:hover\:-translate-x-10:hover{--transform-translate-x:-2.5rem}.lg\:hover\:-translate-x-12:hover{--transform-translate-x:-3rem}.lg\:hover\:-translate-x-16:hover{--transform-translate-x:-4rem}.lg\:hover\:-translate-x-20:hover{--transform-translate-x:-5rem}.lg\:hover\:-translate-x-24:hover{--transform-translate-x:-6rem}.lg\:hover\:-translate-x-32:hover{--transform-translate-x:-8rem}.lg\:hover\:-translate-x-40:hover{--transform-translate-x:-10rem}.lg\:hover\:-translate-x-48:hover{--transform-translate-x:-12rem}.lg\:hover\:-translate-x-56:hover{--transform-translate-x:-14rem}.lg\:hover\:-translate-x-64:hover{--transform-translate-x:-16rem}.lg\:hover\:-translate-x-px:hover{--transform-translate-x:-1px}.lg\:hover\:-translate-x-full:hover{--transform-translate-x:-100%}.lg\:hover\:-translate-x-1\/2:hover{--transform-translate-x:-50%}.lg\:hover\:translate-x-1\/2:hover{--transform-translate-x:50%}.lg\:hover\:translate-x-full:hover{--transform-translate-x:100%}.lg\:hover\:translate-y-0:hover{--transform-translate-y:0}.lg\:hover\:translate-y-1:hover{--transform-translate-y:0.25rem}.lg\:hover\:translate-y-2:hover{--transform-translate-y:0.5rem}.lg\:hover\:translate-y-3:hover{--transform-translate-y:0.75rem}.lg\:hover\:translate-y-4:hover{--transform-translate-y:1rem}.lg\:hover\:translate-y-5:hover{--transform-translate-y:1.25rem}.lg\:hover\:translate-y-6:hover{--transform-translate-y:1.5rem}.lg\:hover\:translate-y-8:hover{--transform-translate-y:2rem}.lg\:hover\:translate-y-10:hover{--transform-translate-y:2.5rem}.lg\:hover\:translate-y-12:hover{--transform-translate-y:3rem}.lg\:hover\:translate-y-16:hover{--transform-translate-y:4rem}.lg\:hover\:translate-y-20:hover{--transform-translate-y:5rem}.lg\:hover\:translate-y-24:hover{--transform-translate-y:6rem}.lg\:hover\:translate-y-32:hover{--transform-translate-y:8rem}.lg\:hover\:translate-y-40:hover{--transform-translate-y:10rem}.lg\:hover\:translate-y-48:hover{--transform-translate-y:12rem}.lg\:hover\:translate-y-56:hover{--transform-translate-y:14rem}.lg\:hover\:translate-y-64:hover{--transform-translate-y:16rem}.lg\:hover\:translate-y-px:hover{--transform-translate-y:1px}.lg\:hover\:-translate-y-1:hover{--transform-translate-y:-0.25rem}.lg\:hover\:-translate-y-2:hover{--transform-translate-y:-0.5rem}.lg\:hover\:-translate-y-3:hover{--transform-translate-y:-0.75rem}.lg\:hover\:-translate-y-4:hover{--transform-translate-y:-1rem}.lg\:hover\:-translate-y-5:hover{--transform-translate-y:-1.25rem}.lg\:hover\:-translate-y-6:hover{--transform-translate-y:-1.5rem}.lg\:hover\:-translate-y-8:hover{--transform-translate-y:-2rem}.lg\:hover\:-translate-y-10:hover{--transform-translate-y:-2.5rem}.lg\:hover\:-translate-y-12:hover{--transform-translate-y:-3rem}.lg\:hover\:-translate-y-16:hover{--transform-translate-y:-4rem}.lg\:hover\:-translate-y-20:hover{--transform-translate-y:-5rem}.lg\:hover\:-translate-y-24:hover{--transform-translate-y:-6rem}.lg\:hover\:-translate-y-32:hover{--transform-translate-y:-8rem}.lg\:hover\:-translate-y-40:hover{--transform-translate-y:-10rem}.lg\:hover\:-translate-y-48:hover{--transform-translate-y:-12rem}.lg\:hover\:-translate-y-56:hover{--transform-translate-y:-14rem}.lg\:hover\:-translate-y-64:hover{--transform-translate-y:-16rem}.lg\:hover\:-translate-y-px:hover{--transform-translate-y:-1px}.lg\:hover\:-translate-y-full:hover{--transform-translate-y:-100%}.lg\:hover\:-translate-y-1\/2:hover{--transform-translate-y:-50%}.lg\:hover\:translate-y-1\/2:hover{--transform-translate-y:50%}.lg\:hover\:translate-y-full:hover{--transform-translate-y:100%}.lg\:focus\:translate-x-0:focus{--transform-translate-x:0}.lg\:focus\:translate-x-1:focus{--transform-translate-x:0.25rem}.lg\:focus\:translate-x-2:focus{--transform-translate-x:0.5rem}.lg\:focus\:translate-x-3:focus{--transform-translate-x:0.75rem}.lg\:focus\:translate-x-4:focus{--transform-translate-x:1rem}.lg\:focus\:translate-x-5:focus{--transform-translate-x:1.25rem}.lg\:focus\:translate-x-6:focus{--transform-translate-x:1.5rem}.lg\:focus\:translate-x-8:focus{--transform-translate-x:2rem}.lg\:focus\:translate-x-10:focus{--transform-translate-x:2.5rem}.lg\:focus\:translate-x-12:focus{--transform-translate-x:3rem}.lg\:focus\:translate-x-16:focus{--transform-translate-x:4rem}.lg\:focus\:translate-x-20:focus{--transform-translate-x:5rem}.lg\:focus\:translate-x-24:focus{--transform-translate-x:6rem}.lg\:focus\:translate-x-32:focus{--transform-translate-x:8rem}.lg\:focus\:translate-x-40:focus{--transform-translate-x:10rem}.lg\:focus\:translate-x-48:focus{--transform-translate-x:12rem}.lg\:focus\:translate-x-56:focus{--transform-translate-x:14rem}.lg\:focus\:translate-x-64:focus{--transform-translate-x:16rem}.lg\:focus\:translate-x-px:focus{--transform-translate-x:1px}.lg\:focus\:-translate-x-1:focus{--transform-translate-x:-0.25rem}.lg\:focus\:-translate-x-2:focus{--transform-translate-x:-0.5rem}.lg\:focus\:-translate-x-3:focus{--transform-translate-x:-0.75rem}.lg\:focus\:-translate-x-4:focus{--transform-translate-x:-1rem}.lg\:focus\:-translate-x-5:focus{--transform-translate-x:-1.25rem}.lg\:focus\:-translate-x-6:focus{--transform-translate-x:-1.5rem}.lg\:focus\:-translate-x-8:focus{--transform-translate-x:-2rem}.lg\:focus\:-translate-x-10:focus{--transform-translate-x:-2.5rem}.lg\:focus\:-translate-x-12:focus{--transform-translate-x:-3rem}.lg\:focus\:-translate-x-16:focus{--transform-translate-x:-4rem}.lg\:focus\:-translate-x-20:focus{--transform-translate-x:-5rem}.lg\:focus\:-translate-x-24:focus{--transform-translate-x:-6rem}.lg\:focus\:-translate-x-32:focus{--transform-translate-x:-8rem}.lg\:focus\:-translate-x-40:focus{--transform-translate-x:-10rem}.lg\:focus\:-translate-x-48:focus{--transform-translate-x:-12rem}.lg\:focus\:-translate-x-56:focus{--transform-translate-x:-14rem}.lg\:focus\:-translate-x-64:focus{--transform-translate-x:-16rem}.lg\:focus\:-translate-x-px:focus{--transform-translate-x:-1px}.lg\:focus\:-translate-x-full:focus{--transform-translate-x:-100%}.lg\:focus\:-translate-x-1\/2:focus{--transform-translate-x:-50%}.lg\:focus\:translate-x-1\/2:focus{--transform-translate-x:50%}.lg\:focus\:translate-x-full:focus{--transform-translate-x:100%}.lg\:focus\:translate-y-0:focus{--transform-translate-y:0}.lg\:focus\:translate-y-1:focus{--transform-translate-y:0.25rem}.lg\:focus\:translate-y-2:focus{--transform-translate-y:0.5rem}.lg\:focus\:translate-y-3:focus{--transform-translate-y:0.75rem}.lg\:focus\:translate-y-4:focus{--transform-translate-y:1rem}.lg\:focus\:translate-y-5:focus{--transform-translate-y:1.25rem}.lg\:focus\:translate-y-6:focus{--transform-translate-y:1.5rem}.lg\:focus\:translate-y-8:focus{--transform-translate-y:2rem}.lg\:focus\:translate-y-10:focus{--transform-translate-y:2.5rem}.lg\:focus\:translate-y-12:focus{--transform-translate-y:3rem}.lg\:focus\:translate-y-16:focus{--transform-translate-y:4rem}.lg\:focus\:translate-y-20:focus{--transform-translate-y:5rem}.lg\:focus\:translate-y-24:focus{--transform-translate-y:6rem}.lg\:focus\:translate-y-32:focus{--transform-translate-y:8rem}.lg\:focus\:translate-y-40:focus{--transform-translate-y:10rem}.lg\:focus\:translate-y-48:focus{--transform-translate-y:12rem}.lg\:focus\:translate-y-56:focus{--transform-translate-y:14rem}.lg\:focus\:translate-y-64:focus{--transform-translate-y:16rem}.lg\:focus\:translate-y-px:focus{--transform-translate-y:1px}.lg\:focus\:-translate-y-1:focus{--transform-translate-y:-0.25rem}.lg\:focus\:-translate-y-2:focus{--transform-translate-y:-0.5rem}.lg\:focus\:-translate-y-3:focus{--transform-translate-y:-0.75rem}.lg\:focus\:-translate-y-4:focus{--transform-translate-y:-1rem}.lg\:focus\:-translate-y-5:focus{--transform-translate-y:-1.25rem}.lg\:focus\:-translate-y-6:focus{--transform-translate-y:-1.5rem}.lg\:focus\:-translate-y-8:focus{--transform-translate-y:-2rem}.lg\:focus\:-translate-y-10:focus{--transform-translate-y:-2.5rem}.lg\:focus\:-translate-y-12:focus{--transform-translate-y:-3rem}.lg\:focus\:-translate-y-16:focus{--transform-translate-y:-4rem}.lg\:focus\:-translate-y-20:focus{--transform-translate-y:-5rem}.lg\:focus\:-translate-y-24:focus{--transform-translate-y:-6rem}.lg\:focus\:-translate-y-32:focus{--transform-translate-y:-8rem}.lg\:focus\:-translate-y-40:focus{--transform-translate-y:-10rem}.lg\:focus\:-translate-y-48:focus{--transform-translate-y:-12rem}.lg\:focus\:-translate-y-56:focus{--transform-translate-y:-14rem}.lg\:focus\:-translate-y-64:focus{--transform-translate-y:-16rem}.lg\:focus\:-translate-y-px:focus{--transform-translate-y:-1px}.lg\:focus\:-translate-y-full:focus{--transform-translate-y:-100%}.lg\:focus\:-translate-y-1\/2:focus{--transform-translate-y:-50%}.lg\:focus\:translate-y-1\/2:focus{--transform-translate-y:50%}.lg\:focus\:translate-y-full:focus{--transform-translate-y:100%}.lg\:skew-x-0{--transform-skew-x:0}.lg\:skew-x-1{--transform-skew-x:1deg}.lg\:skew-x-2{--transform-skew-x:2deg}.lg\:skew-x-3{--transform-skew-x:3deg}.lg\:skew-x-6{--transform-skew-x:6deg}.lg\:skew-x-12{--transform-skew-x:12deg}.lg\:-skew-x-12{--transform-skew-x:-12deg}.lg\:-skew-x-6{--transform-skew-x:-6deg}.lg\:-skew-x-3{--transform-skew-x:-3deg}.lg\:-skew-x-2{--transform-skew-x:-2deg}.lg\:-skew-x-1{--transform-skew-x:-1deg}.lg\:skew-y-0{--transform-skew-y:0}.lg\:skew-y-1{--transform-skew-y:1deg}.lg\:skew-y-2{--transform-skew-y:2deg}.lg\:skew-y-3{--transform-skew-y:3deg}.lg\:skew-y-6{--transform-skew-y:6deg}.lg\:skew-y-12{--transform-skew-y:12deg}.lg\:-skew-y-12{--transform-skew-y:-12deg}.lg\:-skew-y-6{--transform-skew-y:-6deg}.lg\:-skew-y-3{--transform-skew-y:-3deg}.lg\:-skew-y-2{--transform-skew-y:-2deg}.lg\:-skew-y-1{--transform-skew-y:-1deg}.lg\:hover\:skew-x-0:hover{--transform-skew-x:0}.lg\:hover\:skew-x-1:hover{--transform-skew-x:1deg}.lg\:hover\:skew-x-2:hover{--transform-skew-x:2deg}.lg\:hover\:skew-x-3:hover{--transform-skew-x:3deg}.lg\:hover\:skew-x-6:hover{--transform-skew-x:6deg}.lg\:hover\:skew-x-12:hover{--transform-skew-x:12deg}.lg\:hover\:-skew-x-12:hover{--transform-skew-x:-12deg}.lg\:hover\:-skew-x-6:hover{--transform-skew-x:-6deg}.lg\:hover\:-skew-x-3:hover{--transform-skew-x:-3deg}.lg\:hover\:-skew-x-2:hover{--transform-skew-x:-2deg}.lg\:hover\:-skew-x-1:hover{--transform-skew-x:-1deg}.lg\:hover\:skew-y-0:hover{--transform-skew-y:0}.lg\:hover\:skew-y-1:hover{--transform-skew-y:1deg}.lg\:hover\:skew-y-2:hover{--transform-skew-y:2deg}.lg\:hover\:skew-y-3:hover{--transform-skew-y:3deg}.lg\:hover\:skew-y-6:hover{--transform-skew-y:6deg}.lg\:hover\:skew-y-12:hover{--transform-skew-y:12deg}.lg\:hover\:-skew-y-12:hover{--transform-skew-y:-12deg}.lg\:hover\:-skew-y-6:hover{--transform-skew-y:-6deg}.lg\:hover\:-skew-y-3:hover{--transform-skew-y:-3deg}.lg\:hover\:-skew-y-2:hover{--transform-skew-y:-2deg}.lg\:hover\:-skew-y-1:hover{--transform-skew-y:-1deg}.lg\:focus\:skew-x-0:focus{--transform-skew-x:0}.lg\:focus\:skew-x-1:focus{--transform-skew-x:1deg}.lg\:focus\:skew-x-2:focus{--transform-skew-x:2deg}.lg\:focus\:skew-x-3:focus{--transform-skew-x:3deg}.lg\:focus\:skew-x-6:focus{--transform-skew-x:6deg}.lg\:focus\:skew-x-12:focus{--transform-skew-x:12deg}.lg\:focus\:-skew-x-12:focus{--transform-skew-x:-12deg}.lg\:focus\:-skew-x-6:focus{--transform-skew-x:-6deg}.lg\:focus\:-skew-x-3:focus{--transform-skew-x:-3deg}.lg\:focus\:-skew-x-2:focus{--transform-skew-x:-2deg}.lg\:focus\:-skew-x-1:focus{--transform-skew-x:-1deg}.lg\:focus\:skew-y-0:focus{--transform-skew-y:0}.lg\:focus\:skew-y-1:focus{--transform-skew-y:1deg}.lg\:focus\:skew-y-2:focus{--transform-skew-y:2deg}.lg\:focus\:skew-y-3:focus{--transform-skew-y:3deg}.lg\:focus\:skew-y-6:focus{--transform-skew-y:6deg}.lg\:focus\:skew-y-12:focus{--transform-skew-y:12deg}.lg\:focus\:-skew-y-12:focus{--transform-skew-y:-12deg}.lg\:focus\:-skew-y-6:focus{--transform-skew-y:-6deg}.lg\:focus\:-skew-y-3:focus{--transform-skew-y:-3deg}.lg\:focus\:-skew-y-2:focus{--transform-skew-y:-2deg}.lg\:focus\:-skew-y-1:focus{--transform-skew-y:-1deg}.lg\:transition-none{transition-property:none}.lg\:transition-all{transition-property:all}.lg\:transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform}.lg\:transition-colors{transition-property:background-color,border-color,color,fill,stroke}.lg\:transition-opacity{transition-property:opacity}.lg\:transition-shadow{transition-property:box-shadow}.lg\:transition-transform{transition-property:transform}.lg\:ease-linear{transition-timing-function:linear}.lg\:ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.lg\:ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.lg\:ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.lg\:duration-75{transition-duration:75ms}.lg\:duration-100{transition-duration:.1s}.lg\:duration-150{transition-duration:150ms}.lg\:duration-200{transition-duration:.2s}.lg\:duration-300{transition-duration:.3s}.lg\:duration-500{transition-duration:.5s}.lg\:duration-700{transition-duration:.7s}.lg\:duration-1000{transition-duration:1s}.lg\:delay-75{transition-delay:75ms}.lg\:delay-100{transition-delay:.1s}.lg\:delay-150{transition-delay:150ms}.lg\:delay-200{transition-delay:.2s}.lg\:delay-300{transition-delay:.3s}.lg\:delay-500{transition-delay:.5s}.lg\:delay-700{transition-delay:.7s}.lg\:delay-1000{transition-delay:1s}.lg\:animate-none{animation:none}.lg\:animate-spin{animation:spin 1s linear infinite}.lg\:animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.lg\:animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.lg\:animate-bounce{animation:bounce 1s infinite}}@media (min-width:1280px){.xl\:container{width:100%}@media (min-width:640px){.xl\:container{max-width:640px}}@media (min-width:768px){.xl\:container{max-width:768px}}@media (min-width:1024px){.xl\:container{max-width:1024px}}@media (min-width:1280px){.xl\:container{max-width:1280px}}.xl\:space-y-0>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(0px * var(--space-y-reverse))}.xl\:space-x-0>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(0px * var(--space-x-reverse));margin-left:calc(0px * calc(1 - var(--space-x-reverse)))}.xl\:space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.25rem * var(--space-y-reverse))}.xl\:space-x-1>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.25rem * var(--space-x-reverse));margin-left:calc(.25rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.5rem * var(--space-y-reverse))}.xl\:space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.5rem * var(--space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(.75rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(.75rem * var(--space-y-reverse))}.xl\:space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(.75rem * var(--space-x-reverse));margin-left:calc(.75rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1rem * var(--space-y-reverse))}.xl\:space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1rem * var(--space-x-reverse));margin-left:calc(1rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1.25rem * var(--space-y-reverse))}.xl\:space-x-5>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1.25rem * var(--space-x-reverse));margin-left:calc(1.25rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-6>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1.5rem * var(--space-y-reverse))}.xl\:space-x-6>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1.5rem * var(--space-x-reverse));margin-left:calc(1.5rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-8>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(2rem * var(--space-y-reverse))}.xl\:space-x-8>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(2rem * var(--space-x-reverse));margin-left:calc(2rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(2.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(2.5rem * var(--space-y-reverse))}.xl\:space-x-10>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(2.5rem * var(--space-x-reverse));margin-left:calc(2.5rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-12>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(3rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(3rem * var(--space-y-reverse))}.xl\:space-x-12>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(3rem * var(--space-x-reverse));margin-left:calc(3rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-16>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(4rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(4rem * var(--space-y-reverse))}.xl\:space-x-16>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(4rem * var(--space-x-reverse));margin-left:calc(4rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-20>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(5rem * var(--space-y-reverse))}.xl\:space-x-20>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(5rem * var(--space-x-reverse));margin-left:calc(5rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-24>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(6rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(6rem * var(--space-y-reverse))}.xl\:space-x-24>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(6rem * var(--space-x-reverse));margin-left:calc(6rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-32>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(8rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(8rem * var(--space-y-reverse))}.xl\:space-x-32>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(8rem * var(--space-x-reverse));margin-left:calc(8rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-40>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(10rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(10rem * var(--space-y-reverse))}.xl\:space-x-40>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(10rem * var(--space-x-reverse));margin-left:calc(10rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-48>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(12rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(12rem * var(--space-y-reverse))}.xl\:space-x-48>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(12rem * var(--space-x-reverse));margin-left:calc(12rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-56>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(14rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(14rem * var(--space-y-reverse))}.xl\:space-x-56>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(14rem * var(--space-x-reverse));margin-left:calc(14rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-64>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(16rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(16rem * var(--space-y-reverse))}.xl\:space-x-64>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(16rem * var(--space-x-reverse));margin-left:calc(16rem * calc(1 - var(--space-x-reverse)))}.xl\:space-y-px>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(1px * var(--space-y-reverse))}.xl\:space-x-px>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1px * var(--space-x-reverse));margin-left:calc(1px * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.25rem * var(--space-y-reverse))}.xl\:-space-x-1>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.25rem * var(--space-x-reverse));margin-left:calc(-.25rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.5rem * var(--space-y-reverse))}.xl\:-space-x-2>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.5rem * var(--space-x-reverse));margin-left:calc(-.5rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-.75rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-.75rem * var(--space-y-reverse))}.xl\:-space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-.75rem * var(--space-x-reverse));margin-left:calc(-.75rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1rem * var(--space-y-reverse))}.xl\:-space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1rem * var(--space-x-reverse));margin-left:calc(-1rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1.25rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1.25rem * var(--space-y-reverse))}.xl\:-space-x-5>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1.25rem * var(--space-x-reverse));margin-left:calc(-1.25rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-6>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1.5rem * var(--space-y-reverse))}.xl\:-space-x-6>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1.5rem * var(--space-x-reverse));margin-left:calc(-1.5rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-8>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-2rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-2rem * var(--space-y-reverse))}.xl\:-space-x-8>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-2rem * var(--space-x-reverse));margin-left:calc(-2rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-10>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-2.5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-2.5rem * var(--space-y-reverse))}.xl\:-space-x-10>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-2.5rem * var(--space-x-reverse));margin-left:calc(-2.5rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-12>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-3rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-3rem * var(--space-y-reverse))}.xl\:-space-x-12>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-3rem * var(--space-x-reverse));margin-left:calc(-3rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-16>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-4rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-4rem * var(--space-y-reverse))}.xl\:-space-x-16>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-4rem * var(--space-x-reverse));margin-left:calc(-4rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-20>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-5rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-5rem * var(--space-y-reverse))}.xl\:-space-x-20>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-5rem * var(--space-x-reverse));margin-left:calc(-5rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-24>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-6rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-6rem * var(--space-y-reverse))}.xl\:-space-x-24>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-6rem * var(--space-x-reverse));margin-left:calc(-6rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-32>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-8rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-8rem * var(--space-y-reverse))}.xl\:-space-x-32>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-8rem * var(--space-x-reverse));margin-left:calc(-8rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-40>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-10rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-10rem * var(--space-y-reverse))}.xl\:-space-x-40>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-10rem * var(--space-x-reverse));margin-left:calc(-10rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-48>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-12rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-12rem * var(--space-y-reverse))}.xl\:-space-x-48>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-12rem * var(--space-x-reverse));margin-left:calc(-12rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-56>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-14rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-14rem * var(--space-y-reverse))}.xl\:-space-x-56>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-14rem * var(--space-x-reverse));margin-left:calc(-14rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-64>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-16rem * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-16rem * var(--space-y-reverse))}.xl\:-space-x-64>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-16rem * var(--space-x-reverse));margin-left:calc(-16rem * calc(1 - var(--space-x-reverse)))}.xl\:-space-y-px>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(-1px * calc(1 - var(--space-y-reverse)));margin-bottom:calc(-1px * var(--space-y-reverse))}.xl\:-space-x-px>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(-1px * var(--space-x-reverse));margin-left:calc(-1px * calc(1 - var(--space-x-reverse)))}.xl\:space-y-reverse>:not(template)~:not(template){--space-y-reverse:1}.xl\:space-x-reverse>:not(template)~:not(template){--space-x-reverse:1}.xl\:divide-y-0>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(0px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(0px * var(--divide-y-reverse))}.xl\:divide-x-0>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(0px * var(--divide-x-reverse));border-left-width:calc(0px * calc(1 - var(--divide-x-reverse)))}.xl\:divide-y-2>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(2px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(2px * var(--divide-y-reverse))}.xl\:divide-x-2>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(2px * var(--divide-x-reverse));border-left-width:calc(2px * calc(1 - var(--divide-x-reverse)))}.xl\:divide-y-4>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(4px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(4px * var(--divide-y-reverse))}.xl\:divide-x-4>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(4px * var(--divide-x-reverse));border-left-width:calc(4px * calc(1 - var(--divide-x-reverse)))}.xl\:divide-y-8>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(8px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(8px * var(--divide-y-reverse))}.xl\:divide-x-8>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(8px * var(--divide-x-reverse));border-left-width:calc(8px * calc(1 - var(--divide-x-reverse)))}.xl\:divide-y>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(1px * calc(1 - var(--divide-y-reverse)));border-bottom-width:calc(1px * var(--divide-y-reverse))}.xl\:divide-x>:not(template)~:not(template){--divide-x-reverse:0;border-right-width:calc(1px * var(--divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--divide-x-reverse)))}.xl\:divide-y-reverse>:not(template)~:not(template){--divide-y-reverse:1}.xl\:divide-x-reverse>:not(template)~:not(template){--divide-x-reverse:1}.xl\:divide-transparent>:not(template)~:not(template){border-color:transparent}.xl\:divide-current>:not(template)~:not(template){border-color:currentColor}.xl\:divide-black>:not(template)~:not(template){--divide-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--divide-opacity))}.xl\:divide-white>:not(template)~:not(template){--divide-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--divide-opacity))}.xl\:divide-gray-100>:not(template)~:not(template){--divide-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--divide-opacity))}.xl\:divide-gray-200>:not(template)~:not(template){--divide-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--divide-opacity))}.xl\:divide-gray-300>:not(template)~:not(template){--divide-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--divide-opacity))}.xl\:divide-gray-400>:not(template)~:not(template){--divide-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--divide-opacity))}.xl\:divide-gray-500>:not(template)~:not(template){--divide-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--divide-opacity))}.xl\:divide-gray-600>:not(template)~:not(template){--divide-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--divide-opacity))}.xl\:divide-gray-700>:not(template)~:not(template){--divide-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--divide-opacity))}.xl\:divide-gray-800>:not(template)~:not(template){--divide-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--divide-opacity))}.xl\:divide-gray-900>:not(template)~:not(template){--divide-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--divide-opacity))}.xl\:divide-red-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--divide-opacity))}.xl\:divide-red-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--divide-opacity))}.xl\:divide-red-300>:not(template)~:not(template){--divide-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--divide-opacity))}.xl\:divide-red-400>:not(template)~:not(template){--divide-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--divide-opacity))}.xl\:divide-red-500>:not(template)~:not(template){--divide-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--divide-opacity))}.xl\:divide-red-600>:not(template)~:not(template){--divide-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--divide-opacity))}.xl\:divide-red-700>:not(template)~:not(template){--divide-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--divide-opacity))}.xl\:divide-red-800>:not(template)~:not(template){--divide-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--divide-opacity))}.xl\:divide-red-900>:not(template)~:not(template){--divide-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--divide-opacity))}.xl\:divide-orange-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--divide-opacity))}.xl\:divide-orange-200>:not(template)~:not(template){--divide-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--divide-opacity))}.xl\:divide-orange-300>:not(template)~:not(template){--divide-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--divide-opacity))}.xl\:divide-orange-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--divide-opacity))}.xl\:divide-orange-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--divide-opacity))}.xl\:divide-orange-600>:not(template)~:not(template){--divide-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--divide-opacity))}.xl\:divide-orange-700>:not(template)~:not(template){--divide-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--divide-opacity))}.xl\:divide-orange-800>:not(template)~:not(template){--divide-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--divide-opacity))}.xl\:divide-orange-900>:not(template)~:not(template){--divide-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--divide-opacity))}.xl\:divide-yellow-100>:not(template)~:not(template){--divide-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--divide-opacity))}.xl\:divide-yellow-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--divide-opacity))}.xl\:divide-yellow-300>:not(template)~:not(template){--divide-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--divide-opacity))}.xl\:divide-yellow-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--divide-opacity))}.xl\:divide-yellow-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--divide-opacity))}.xl\:divide-yellow-600>:not(template)~:not(template){--divide-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--divide-opacity))}.xl\:divide-yellow-700>:not(template)~:not(template){--divide-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--divide-opacity))}.xl\:divide-yellow-800>:not(template)~:not(template){--divide-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--divide-opacity))}.xl\:divide-yellow-900>:not(template)~:not(template){--divide-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--divide-opacity))}.xl\:divide-green-100>:not(template)~:not(template){--divide-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--divide-opacity))}.xl\:divide-green-200>:not(template)~:not(template){--divide-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--divide-opacity))}.xl\:divide-green-300>:not(template)~:not(template){--divide-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--divide-opacity))}.xl\:divide-green-400>:not(template)~:not(template){--divide-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--divide-opacity))}.xl\:divide-green-500>:not(template)~:not(template){--divide-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--divide-opacity))}.xl\:divide-green-600>:not(template)~:not(template){--divide-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--divide-opacity))}.xl\:divide-green-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--divide-opacity))}.xl\:divide-green-800>:not(template)~:not(template){--divide-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--divide-opacity))}.xl\:divide-green-900>:not(template)~:not(template){--divide-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--divide-opacity))}.xl\:divide-teal-100>:not(template)~:not(template){--divide-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--divide-opacity))}.xl\:divide-teal-200>:not(template)~:not(template){--divide-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--divide-opacity))}.xl\:divide-teal-300>:not(template)~:not(template){--divide-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--divide-opacity))}.xl\:divide-teal-400>:not(template)~:not(template){--divide-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--divide-opacity))}.xl\:divide-teal-500>:not(template)~:not(template){--divide-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--divide-opacity))}.xl\:divide-teal-600>:not(template)~:not(template){--divide-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--divide-opacity))}.xl\:divide-teal-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--divide-opacity))}.xl\:divide-teal-800>:not(template)~:not(template){--divide-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--divide-opacity))}.xl\:divide-teal-900>:not(template)~:not(template){--divide-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--divide-opacity))}.xl\:divide-blue-100>:not(template)~:not(template){--divide-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--divide-opacity))}.xl\:divide-blue-200>:not(template)~:not(template){--divide-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--divide-opacity))}.xl\:divide-blue-300>:not(template)~:not(template){--divide-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--divide-opacity))}.xl\:divide-blue-400>:not(template)~:not(template){--divide-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--divide-opacity))}.xl\:divide-blue-500>:not(template)~:not(template){--divide-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--divide-opacity))}.xl\:divide-blue-600>:not(template)~:not(template){--divide-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--divide-opacity))}.xl\:divide-blue-700>:not(template)~:not(template){--divide-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--divide-opacity))}.xl\:divide-blue-800>:not(template)~:not(template){--divide-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--divide-opacity))}.xl\:divide-blue-900>:not(template)~:not(template){--divide-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--divide-opacity))}.xl\:divide-indigo-100>:not(template)~:not(template){--divide-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--divide-opacity))}.xl\:divide-indigo-200>:not(template)~:not(template){--divide-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--divide-opacity))}.xl\:divide-indigo-300>:not(template)~:not(template){--divide-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--divide-opacity))}.xl\:divide-indigo-400>:not(template)~:not(template){--divide-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--divide-opacity))}.xl\:divide-indigo-500>:not(template)~:not(template){--divide-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--divide-opacity))}.xl\:divide-indigo-600>:not(template)~:not(template){--divide-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--divide-opacity))}.xl\:divide-indigo-700>:not(template)~:not(template){--divide-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--divide-opacity))}.xl\:divide-indigo-800>:not(template)~:not(template){--divide-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--divide-opacity))}.xl\:divide-indigo-900>:not(template)~:not(template){--divide-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--divide-opacity))}.xl\:divide-purple-100>:not(template)~:not(template){--divide-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--divide-opacity))}.xl\:divide-purple-200>:not(template)~:not(template){--divide-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--divide-opacity))}.xl\:divide-purple-300>:not(template)~:not(template){--divide-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--divide-opacity))}.xl\:divide-purple-400>:not(template)~:not(template){--divide-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--divide-opacity))}.xl\:divide-purple-500>:not(template)~:not(template){--divide-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--divide-opacity))}.xl\:divide-purple-600>:not(template)~:not(template){--divide-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--divide-opacity))}.xl\:divide-purple-700>:not(template)~:not(template){--divide-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--divide-opacity))}.xl\:divide-purple-800>:not(template)~:not(template){--divide-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--divide-opacity))}.xl\:divide-purple-900>:not(template)~:not(template){--divide-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--divide-opacity))}.xl\:divide-pink-100>:not(template)~:not(template){--divide-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--divide-opacity))}.xl\:divide-pink-200>:not(template)~:not(template){--divide-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--divide-opacity))}.xl\:divide-pink-300>:not(template)~:not(template){--divide-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--divide-opacity))}.xl\:divide-pink-400>:not(template)~:not(template){--divide-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--divide-opacity))}.xl\:divide-pink-500>:not(template)~:not(template){--divide-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--divide-opacity))}.xl\:divide-pink-600>:not(template)~:not(template){--divide-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--divide-opacity))}.xl\:divide-pink-700>:not(template)~:not(template){--divide-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--divide-opacity))}.xl\:divide-pink-800>:not(template)~:not(template){--divide-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--divide-opacity))}.xl\:divide-pink-900>:not(template)~:not(template){--divide-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--divide-opacity))}.xl\:divide-solid>:not(template)~:not(template){border-style:solid}.xl\:divide-dashed>:not(template)~:not(template){border-style:dashed}.xl\:divide-dotted>:not(template)~:not(template){border-style:dotted}.xl\:divide-double>:not(template)~:not(template){border-style:double}.xl\:divide-none>:not(template)~:not(template){border-style:none}.xl\:divide-opacity-0>:not(template)~:not(template){--divide-opacity:0}.xl\:divide-opacity-25>:not(template)~:not(template){--divide-opacity:0.25}.xl\:divide-opacity-50>:not(template)~:not(template){--divide-opacity:0.5}.xl\:divide-opacity-75>:not(template)~:not(template){--divide-opacity:0.75}.xl\:divide-opacity-100>:not(template)~:not(template){--divide-opacity:1}.xl\:sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.xl\:not-sr-only{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.xl\:focus\:sr-only:focus{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.xl\:focus\:not-sr-only:focus{position:static;width:auto;height:auto;padding:0;margin:0;overflow:visible;clip:auto;white-space:normal}.xl\:appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.xl\:bg-fixed{background-attachment:fixed}.xl\:bg-local{background-attachment:local}.xl\:bg-scroll{background-attachment:scroll}.xl\:bg-clip-border{background-clip:border-box}.xl\:bg-clip-padding{background-clip:padding-box}.xl\:bg-clip-content{background-clip:content-box}.xl\:bg-clip-text{-webkit-background-clip:text;background-clip:text}.xl\:bg-transparent{background-color:transparent}.xl\:bg-current{background-color:currentColor}.xl\:bg-black{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.xl\:bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.xl\:bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.xl\:bg-gray-200{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.xl\:bg-gray-300{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.xl\:bg-gray-400{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.xl\:bg-gray-500{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.xl\:bg-gray-600{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.xl\:bg-gray-700{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.xl\:bg-gray-800{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.xl\:bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.xl\:bg-red-100{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.xl\:bg-red-200{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.xl\:bg-red-300{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.xl\:bg-red-400{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.xl\:bg-red-500{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.xl\:bg-red-600{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.xl\:bg-red-700{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.xl\:bg-red-800{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.xl\:bg-red-900{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.xl\:bg-orange-100{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.xl\:bg-orange-200{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.xl\:bg-orange-300{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.xl\:bg-orange-400{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.xl\:bg-orange-500{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.xl\:bg-orange-600{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.xl\:bg-orange-700{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.xl\:bg-orange-800{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.xl\:bg-orange-900{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.xl\:bg-yellow-100{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.xl\:bg-yellow-200{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.xl\:bg-yellow-300{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.xl\:bg-yellow-400{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.xl\:bg-yellow-500{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.xl\:bg-yellow-600{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.xl\:bg-yellow-700{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.xl\:bg-yellow-800{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.xl\:bg-yellow-900{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.xl\:bg-green-100{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.xl\:bg-green-200{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.xl\:bg-green-300{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.xl\:bg-green-400{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.xl\:bg-green-500{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.xl\:bg-green-600{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.xl\:bg-green-700{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.xl\:bg-green-800{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.xl\:bg-green-900{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.xl\:bg-teal-100{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.xl\:bg-teal-200{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.xl\:bg-teal-300{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.xl\:bg-teal-400{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.xl\:bg-teal-500{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.xl\:bg-teal-600{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.xl\:bg-teal-700{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.xl\:bg-teal-800{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.xl\:bg-teal-900{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.xl\:bg-blue-100{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.xl\:bg-blue-200{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.xl\:bg-blue-300{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.xl\:bg-blue-400{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.xl\:bg-blue-500{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.xl\:bg-blue-600{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.xl\:bg-blue-700{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.xl\:bg-blue-800{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.xl\:bg-blue-900{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.xl\:bg-indigo-100{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.xl\:bg-indigo-200{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.xl\:bg-indigo-300{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.xl\:bg-indigo-400{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.xl\:bg-indigo-500{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.xl\:bg-indigo-600{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.xl\:bg-indigo-700{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.xl\:bg-indigo-800{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.xl\:bg-indigo-900{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.xl\:bg-purple-100{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.xl\:bg-purple-200{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.xl\:bg-purple-300{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.xl\:bg-purple-400{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.xl\:bg-purple-500{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.xl\:bg-purple-600{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.xl\:bg-purple-700{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.xl\:bg-purple-800{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.xl\:bg-purple-900{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.xl\:bg-pink-100{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.xl\:bg-pink-200{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.xl\:bg-pink-300{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.xl\:bg-pink-400{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.xl\:bg-pink-500{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.xl\:bg-pink-600{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.xl\:bg-pink-700{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.xl\:bg-pink-800{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.xl\:bg-pink-900{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.xl\:hover\:bg-transparent:hover{background-color:transparent}.xl\:hover\:bg-current:hover{background-color:currentColor}.xl\:hover\:bg-black:hover{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.xl\:hover\:bg-white:hover{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.xl\:hover\:bg-gray-100:hover{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.xl\:hover\:bg-gray-200:hover{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.xl\:hover\:bg-gray-300:hover{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.xl\:hover\:bg-gray-400:hover{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.xl\:hover\:bg-gray-500:hover{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.xl\:hover\:bg-gray-600:hover{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.xl\:hover\:bg-gray-700:hover{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.xl\:hover\:bg-gray-800:hover{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.xl\:hover\:bg-gray-900:hover{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.xl\:hover\:bg-red-100:hover{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.xl\:hover\:bg-red-200:hover{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.xl\:hover\:bg-red-300:hover{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.xl\:hover\:bg-red-400:hover{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.xl\:hover\:bg-red-500:hover{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.xl\:hover\:bg-red-600:hover{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.xl\:hover\:bg-red-700:hover{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.xl\:hover\:bg-red-800:hover{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.xl\:hover\:bg-red-900:hover{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.xl\:hover\:bg-orange-100:hover{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.xl\:hover\:bg-orange-200:hover{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.xl\:hover\:bg-orange-300:hover{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.xl\:hover\:bg-orange-400:hover{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.xl\:hover\:bg-orange-500:hover{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.xl\:hover\:bg-orange-600:hover{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.xl\:hover\:bg-orange-700:hover{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.xl\:hover\:bg-orange-800:hover{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.xl\:hover\:bg-orange-900:hover{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.xl\:hover\:bg-yellow-100:hover{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.xl\:hover\:bg-yellow-200:hover{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.xl\:hover\:bg-yellow-300:hover{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.xl\:hover\:bg-yellow-400:hover{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.xl\:hover\:bg-yellow-500:hover{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.xl\:hover\:bg-yellow-600:hover{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.xl\:hover\:bg-yellow-700:hover{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.xl\:hover\:bg-yellow-800:hover{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.xl\:hover\:bg-yellow-900:hover{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.xl\:hover\:bg-green-100:hover{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.xl\:hover\:bg-green-200:hover{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.xl\:hover\:bg-green-300:hover{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.xl\:hover\:bg-green-400:hover{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.xl\:hover\:bg-green-500:hover{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.xl\:hover\:bg-green-600:hover{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.xl\:hover\:bg-green-700:hover{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.xl\:hover\:bg-green-800:hover{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.xl\:hover\:bg-green-900:hover{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.xl\:hover\:bg-teal-100:hover{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.xl\:hover\:bg-teal-200:hover{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.xl\:hover\:bg-teal-300:hover{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.xl\:hover\:bg-teal-400:hover{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.xl\:hover\:bg-teal-500:hover{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.xl\:hover\:bg-teal-600:hover{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.xl\:hover\:bg-teal-700:hover{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.xl\:hover\:bg-teal-800:hover{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.xl\:hover\:bg-teal-900:hover{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.xl\:hover\:bg-blue-100:hover{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.xl\:hover\:bg-blue-200:hover{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.xl\:hover\:bg-blue-300:hover{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.xl\:hover\:bg-blue-400:hover{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.xl\:hover\:bg-blue-500:hover{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.xl\:hover\:bg-blue-600:hover{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.xl\:hover\:bg-blue-700:hover{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.xl\:hover\:bg-blue-800:hover{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.xl\:hover\:bg-blue-900:hover{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.xl\:hover\:bg-indigo-100:hover{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.xl\:hover\:bg-indigo-200:hover{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.xl\:hover\:bg-indigo-300:hover{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.xl\:hover\:bg-indigo-400:hover{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.xl\:hover\:bg-indigo-500:hover{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.xl\:hover\:bg-indigo-600:hover{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.xl\:hover\:bg-indigo-700:hover{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.xl\:hover\:bg-indigo-800:hover{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.xl\:hover\:bg-indigo-900:hover{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.xl\:hover\:bg-purple-100:hover{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.xl\:hover\:bg-purple-200:hover{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.xl\:hover\:bg-purple-300:hover{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.xl\:hover\:bg-purple-400:hover{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.xl\:hover\:bg-purple-500:hover{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.xl\:hover\:bg-purple-600:hover{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.xl\:hover\:bg-purple-700:hover{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.xl\:hover\:bg-purple-800:hover{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.xl\:hover\:bg-purple-900:hover{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.xl\:hover\:bg-pink-100:hover{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.xl\:hover\:bg-pink-200:hover{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.xl\:hover\:bg-pink-300:hover{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.xl\:hover\:bg-pink-400:hover{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.xl\:hover\:bg-pink-500:hover{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.xl\:hover\:bg-pink-600:hover{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.xl\:hover\:bg-pink-700:hover{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.xl\:hover\:bg-pink-800:hover{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.xl\:hover\:bg-pink-900:hover{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.xl\:focus\:bg-transparent:focus{background-color:transparent}.xl\:focus\:bg-current:focus{background-color:currentColor}.xl\:focus\:bg-black:focus{--bg-opacity:1;background-color:#000;background-color:rgba(0,0,0,var(--bg-opacity))}.xl\:focus\:bg-white:focus{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.xl\:focus\:bg-gray-100:focus{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.xl\:focus\:bg-gray-200:focus{--bg-opacity:1;background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity))}.xl\:focus\:bg-gray-300:focus{--bg-opacity:1;background-color:#e2e8f0;background-color:rgba(226,232,240,var(--bg-opacity))}.xl\:focus\:bg-gray-400:focus{--bg-opacity:1;background-color:#cbd5e0;background-color:rgba(203,213,224,var(--bg-opacity))}.xl\:focus\:bg-gray-500:focus{--bg-opacity:1;background-color:#a0aec0;background-color:rgba(160,174,192,var(--bg-opacity))}.xl\:focus\:bg-gray-600:focus{--bg-opacity:1;background-color:#718096;background-color:rgba(113,128,150,var(--bg-opacity))}.xl\:focus\:bg-gray-700:focus{--bg-opacity:1;background-color:#4a5568;background-color:rgba(74,85,104,var(--bg-opacity))}.xl\:focus\:bg-gray-800:focus{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.xl\:focus\:bg-gray-900:focus{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.xl\:focus\:bg-red-100:focus{--bg-opacity:1;background-color:#fff5f5;background-color:rgba(255,245,245,var(--bg-opacity))}.xl\:focus\:bg-red-200:focus{--bg-opacity:1;background-color:#fed7d7;background-color:rgba(254,215,215,var(--bg-opacity))}.xl\:focus\:bg-red-300:focus{--bg-opacity:1;background-color:#feb2b2;background-color:rgba(254,178,178,var(--bg-opacity))}.xl\:focus\:bg-red-400:focus{--bg-opacity:1;background-color:#fc8181;background-color:rgba(252,129,129,var(--bg-opacity))}.xl\:focus\:bg-red-500:focus{--bg-opacity:1;background-color:#f56565;background-color:rgba(245,101,101,var(--bg-opacity))}.xl\:focus\:bg-red-600:focus{--bg-opacity:1;background-color:#e53e3e;background-color:rgba(229,62,62,var(--bg-opacity))}.xl\:focus\:bg-red-700:focus{--bg-opacity:1;background-color:#c53030;background-color:rgba(197,48,48,var(--bg-opacity))}.xl\:focus\:bg-red-800:focus{--bg-opacity:1;background-color:#9b2c2c;background-color:rgba(155,44,44,var(--bg-opacity))}.xl\:focus\:bg-red-900:focus{--bg-opacity:1;background-color:#742a2a;background-color:rgba(116,42,42,var(--bg-opacity))}.xl\:focus\:bg-orange-100:focus{--bg-opacity:1;background-color:#fffaf0;background-color:rgba(255,250,240,var(--bg-opacity))}.xl\:focus\:bg-orange-200:focus{--bg-opacity:1;background-color:#feebc8;background-color:rgba(254,235,200,var(--bg-opacity))}.xl\:focus\:bg-orange-300:focus{--bg-opacity:1;background-color:#fbd38d;background-color:rgba(251,211,141,var(--bg-opacity))}.xl\:focus\:bg-orange-400:focus{--bg-opacity:1;background-color:#f6ad55;background-color:rgba(246,173,85,var(--bg-opacity))}.xl\:focus\:bg-orange-500:focus{--bg-opacity:1;background-color:#ed8936;background-color:rgba(237,137,54,var(--bg-opacity))}.xl\:focus\:bg-orange-600:focus{--bg-opacity:1;background-color:#dd6b20;background-color:rgba(221,107,32,var(--bg-opacity))}.xl\:focus\:bg-orange-700:focus{--bg-opacity:1;background-color:#c05621;background-color:rgba(192,86,33,var(--bg-opacity))}.xl\:focus\:bg-orange-800:focus{--bg-opacity:1;background-color:#9c4221;background-color:rgba(156,66,33,var(--bg-opacity))}.xl\:focus\:bg-orange-900:focus{--bg-opacity:1;background-color:#7b341e;background-color:rgba(123,52,30,var(--bg-opacity))}.xl\:focus\:bg-yellow-100:focus{--bg-opacity:1;background-color:ivory;background-color:rgba(255,255,240,var(--bg-opacity))}.xl\:focus\:bg-yellow-200:focus{--bg-opacity:1;background-color:#fefcbf;background-color:rgba(254,252,191,var(--bg-opacity))}.xl\:focus\:bg-yellow-300:focus{--bg-opacity:1;background-color:#faf089;background-color:rgba(250,240,137,var(--bg-opacity))}.xl\:focus\:bg-yellow-400:focus{--bg-opacity:1;background-color:#f6e05e;background-color:rgba(246,224,94,var(--bg-opacity))}.xl\:focus\:bg-yellow-500:focus{--bg-opacity:1;background-color:#ecc94b;background-color:rgba(236,201,75,var(--bg-opacity))}.xl\:focus\:bg-yellow-600:focus{--bg-opacity:1;background-color:#d69e2e;background-color:rgba(214,158,46,var(--bg-opacity))}.xl\:focus\:bg-yellow-700:focus{--bg-opacity:1;background-color:#b7791f;background-color:rgba(183,121,31,var(--bg-opacity))}.xl\:focus\:bg-yellow-800:focus{--bg-opacity:1;background-color:#975a16;background-color:rgba(151,90,22,var(--bg-opacity))}.xl\:focus\:bg-yellow-900:focus{--bg-opacity:1;background-color:#744210;background-color:rgba(116,66,16,var(--bg-opacity))}.xl\:focus\:bg-green-100:focus{--bg-opacity:1;background-color:#f0fff4;background-color:rgba(240,255,244,var(--bg-opacity))}.xl\:focus\:bg-green-200:focus{--bg-opacity:1;background-color:#c6f6d5;background-color:rgba(198,246,213,var(--bg-opacity))}.xl\:focus\:bg-green-300:focus{--bg-opacity:1;background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity))}.xl\:focus\:bg-green-400:focus{--bg-opacity:1;background-color:#68d391;background-color:rgba(104,211,145,var(--bg-opacity))}.xl\:focus\:bg-green-500:focus{--bg-opacity:1;background-color:#48bb78;background-color:rgba(72,187,120,var(--bg-opacity))}.xl\:focus\:bg-green-600:focus{--bg-opacity:1;background-color:#38a169;background-color:rgba(56,161,105,var(--bg-opacity))}.xl\:focus\:bg-green-700:focus{--bg-opacity:1;background-color:#2f855a;background-color:rgba(47,133,90,var(--bg-opacity))}.xl\:focus\:bg-green-800:focus{--bg-opacity:1;background-color:#276749;background-color:rgba(39,103,73,var(--bg-opacity))}.xl\:focus\:bg-green-900:focus{--bg-opacity:1;background-color:#22543d;background-color:rgba(34,84,61,var(--bg-opacity))}.xl\:focus\:bg-teal-100:focus{--bg-opacity:1;background-color:#e6fffa;background-color:rgba(230,255,250,var(--bg-opacity))}.xl\:focus\:bg-teal-200:focus{--bg-opacity:1;background-color:#b2f5ea;background-color:rgba(178,245,234,var(--bg-opacity))}.xl\:focus\:bg-teal-300:focus{--bg-opacity:1;background-color:#81e6d9;background-color:rgba(129,230,217,var(--bg-opacity))}.xl\:focus\:bg-teal-400:focus{--bg-opacity:1;background-color:#4fd1c5;background-color:rgba(79,209,197,var(--bg-opacity))}.xl\:focus\:bg-teal-500:focus{--bg-opacity:1;background-color:#38b2ac;background-color:rgba(56,178,172,var(--bg-opacity))}.xl\:focus\:bg-teal-600:focus{--bg-opacity:1;background-color:#319795;background-color:rgba(49,151,149,var(--bg-opacity))}.xl\:focus\:bg-teal-700:focus{--bg-opacity:1;background-color:#2c7a7b;background-color:rgba(44,122,123,var(--bg-opacity))}.xl\:focus\:bg-teal-800:focus{--bg-opacity:1;background-color:#285e61;background-color:rgba(40,94,97,var(--bg-opacity))}.xl\:focus\:bg-teal-900:focus{--bg-opacity:1;background-color:#234e52;background-color:rgba(35,78,82,var(--bg-opacity))}.xl\:focus\:bg-blue-100:focus{--bg-opacity:1;background-color:#ebf8ff;background-color:rgba(235,248,255,var(--bg-opacity))}.xl\:focus\:bg-blue-200:focus{--bg-opacity:1;background-color:#bee3f8;background-color:rgba(190,227,248,var(--bg-opacity))}.xl\:focus\:bg-blue-300:focus{--bg-opacity:1;background-color:#90cdf4;background-color:rgba(144,205,244,var(--bg-opacity))}.xl\:focus\:bg-blue-400:focus{--bg-opacity:1;background-color:#63b3ed;background-color:rgba(99,179,237,var(--bg-opacity))}.xl\:focus\:bg-blue-500:focus{--bg-opacity:1;background-color:#4299e1;background-color:rgba(66,153,225,var(--bg-opacity))}.xl\:focus\:bg-blue-600:focus{--bg-opacity:1;background-color:#3182ce;background-color:rgba(49,130,206,var(--bg-opacity))}.xl\:focus\:bg-blue-700:focus{--bg-opacity:1;background-color:#2b6cb0;background-color:rgba(43,108,176,var(--bg-opacity))}.xl\:focus\:bg-blue-800:focus{--bg-opacity:1;background-color:#2c5282;background-color:rgba(44,82,130,var(--bg-opacity))}.xl\:focus\:bg-blue-900:focus{--bg-opacity:1;background-color:#2a4365;background-color:rgba(42,67,101,var(--bg-opacity))}.xl\:focus\:bg-indigo-100:focus{--bg-opacity:1;background-color:#ebf4ff;background-color:rgba(235,244,255,var(--bg-opacity))}.xl\:focus\:bg-indigo-200:focus{--bg-opacity:1;background-color:#c3dafe;background-color:rgba(195,218,254,var(--bg-opacity))}.xl\:focus\:bg-indigo-300:focus{--bg-opacity:1;background-color:#a3bffa;background-color:rgba(163,191,250,var(--bg-opacity))}.xl\:focus\:bg-indigo-400:focus{--bg-opacity:1;background-color:#7f9cf5;background-color:rgba(127,156,245,var(--bg-opacity))}.xl\:focus\:bg-indigo-500:focus{--bg-opacity:1;background-color:#667eea;background-color:rgba(102,126,234,var(--bg-opacity))}.xl\:focus\:bg-indigo-600:focus{--bg-opacity:1;background-color:#5a67d8;background-color:rgba(90,103,216,var(--bg-opacity))}.xl\:focus\:bg-indigo-700:focus{--bg-opacity:1;background-color:#4c51bf;background-color:rgba(76,81,191,var(--bg-opacity))}.xl\:focus\:bg-indigo-800:focus{--bg-opacity:1;background-color:#434190;background-color:rgba(67,65,144,var(--bg-opacity))}.xl\:focus\:bg-indigo-900:focus{--bg-opacity:1;background-color:#3c366b;background-color:rgba(60,54,107,var(--bg-opacity))}.xl\:focus\:bg-purple-100:focus{--bg-opacity:1;background-color:#faf5ff;background-color:rgba(250,245,255,var(--bg-opacity))}.xl\:focus\:bg-purple-200:focus{--bg-opacity:1;background-color:#e9d8fd;background-color:rgba(233,216,253,var(--bg-opacity))}.xl\:focus\:bg-purple-300:focus{--bg-opacity:1;background-color:#d6bcfa;background-color:rgba(214,188,250,var(--bg-opacity))}.xl\:focus\:bg-purple-400:focus{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity))}.xl\:focus\:bg-purple-500:focus{--bg-opacity:1;background-color:#9f7aea;background-color:rgba(159,122,234,var(--bg-opacity))}.xl\:focus\:bg-purple-600:focus{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.xl\:focus\:bg-purple-700:focus{--bg-opacity:1;background-color:#6b46c1;background-color:rgba(107,70,193,var(--bg-opacity))}.xl\:focus\:bg-purple-800:focus{--bg-opacity:1;background-color:#553c9a;background-color:rgba(85,60,154,var(--bg-opacity))}.xl\:focus\:bg-purple-900:focus{--bg-opacity:1;background-color:#44337a;background-color:rgba(68,51,122,var(--bg-opacity))}.xl\:focus\:bg-pink-100:focus{--bg-opacity:1;background-color:#fff5f7;background-color:rgba(255,245,247,var(--bg-opacity))}.xl\:focus\:bg-pink-200:focus{--bg-opacity:1;background-color:#fed7e2;background-color:rgba(254,215,226,var(--bg-opacity))}.xl\:focus\:bg-pink-300:focus{--bg-opacity:1;background-color:#fbb6ce;background-color:rgba(251,182,206,var(--bg-opacity))}.xl\:focus\:bg-pink-400:focus{--bg-opacity:1;background-color:#f687b3;background-color:rgba(246,135,179,var(--bg-opacity))}.xl\:focus\:bg-pink-500:focus{--bg-opacity:1;background-color:#ed64a6;background-color:rgba(237,100,166,var(--bg-opacity))}.xl\:focus\:bg-pink-600:focus{--bg-opacity:1;background-color:#d53f8c;background-color:rgba(213,63,140,var(--bg-opacity))}.xl\:focus\:bg-pink-700:focus{--bg-opacity:1;background-color:#b83280;background-color:rgba(184,50,128,var(--bg-opacity))}.xl\:focus\:bg-pink-800:focus{--bg-opacity:1;background-color:#97266d;background-color:rgba(151,38,109,var(--bg-opacity))}.xl\:focus\:bg-pink-900:focus{--bg-opacity:1;background-color:#702459;background-color:rgba(112,36,89,var(--bg-opacity))}.xl\:bg-none{background-image:none}.xl\:bg-gradient-to-t{background-image:linear-gradient(to top,var(--gradient-color-stops))}.xl\:bg-gradient-to-tr{background-image:linear-gradient(to top right,var(--gradient-color-stops))}.xl\:bg-gradient-to-r{background-image:linear-gradient(to right,var(--gradient-color-stops))}.xl\:bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--gradient-color-stops))}.xl\:bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--gradient-color-stops))}.xl\:bg-gradient-to-bl{background-image:linear-gradient(to bottom left,var(--gradient-color-stops))}.xl\:bg-gradient-to-l{background-image:linear-gradient(to left,var(--gradient-color-stops))}.xl\:bg-gradient-to-tl{background-image:linear-gradient(to top left,var(--gradient-color-stops))}.xl\:from-transparent{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:from-current{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:from-black{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:from-white{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:from-gray-100{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.xl\:from-gray-200{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.xl\:from-gray-300{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.xl\:from-gray-400{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.xl\:from-gray-500{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.xl\:from-gray-600{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.xl\:from-gray-700{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.xl\:from-gray-800{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.xl\:from-gray-900{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.xl\:from-red-100{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.xl\:from-red-200{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.xl\:from-red-300{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.xl\:from-red-400{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.xl\:from-red-500{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.xl\:from-red-600{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.xl\:from-red-700{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.xl\:from-red-800{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.xl\:from-red-900{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.xl\:from-orange-100{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.xl\:from-orange-200{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.xl\:from-orange-300{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.xl\:from-orange-400{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.xl\:from-orange-500{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.xl\:from-orange-600{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.xl\:from-orange-700{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.xl\:from-orange-800{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.xl\:from-orange-900{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.xl\:from-yellow-100{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.xl\:from-yellow-200{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.xl\:from-yellow-300{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.xl\:from-yellow-400{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.xl\:from-yellow-500{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.xl\:from-yellow-600{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.xl\:from-yellow-700{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.xl\:from-yellow-800{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.xl\:from-yellow-900{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.xl\:from-green-100{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.xl\:from-green-200{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.xl\:from-green-300{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.xl\:from-green-400{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.xl\:from-green-500{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.xl\:from-green-600{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.xl\:from-green-700{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.xl\:from-green-800{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.xl\:from-green-900{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.xl\:from-teal-100{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.xl\:from-teal-200{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.xl\:from-teal-300{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.xl\:from-teal-400{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.xl\:from-teal-500{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.xl\:from-teal-600{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.xl\:from-teal-700{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.xl\:from-teal-800{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.xl\:from-teal-900{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.xl\:from-blue-100{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.xl\:from-blue-200{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.xl\:from-blue-300{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.xl\:from-blue-400{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.xl\:from-blue-500{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.xl\:from-blue-600{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.xl\:from-blue-700{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.xl\:from-blue-800{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.xl\:from-blue-900{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.xl\:from-indigo-100{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.xl\:from-indigo-200{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.xl\:from-indigo-300{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.xl\:from-indigo-400{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.xl\:from-indigo-500{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.xl\:from-indigo-600{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.xl\:from-indigo-700{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.xl\:from-indigo-800{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.xl\:from-indigo-900{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.xl\:from-purple-100{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.xl\:from-purple-200{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.xl\:from-purple-300{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.xl\:from-purple-400{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.xl\:from-purple-500{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.xl\:from-purple-600{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.xl\:from-purple-700{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.xl\:from-purple-800{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.xl\:from-purple-900{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.xl\:from-pink-100{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.xl\:from-pink-200{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.xl\:from-pink-300{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.xl\:from-pink-400{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.xl\:from-pink-500{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.xl\:from-pink-600{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.xl\:from-pink-700{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.xl\:from-pink-800{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.xl\:from-pink-900{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.xl\:via-transparent{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:via-current{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:via-black{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:via-white{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:via-gray-100{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.xl\:via-gray-200{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.xl\:via-gray-300{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.xl\:via-gray-400{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.xl\:via-gray-500{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.xl\:via-gray-600{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.xl\:via-gray-700{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.xl\:via-gray-800{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.xl\:via-gray-900{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.xl\:via-red-100{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.xl\:via-red-200{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.xl\:via-red-300{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.xl\:via-red-400{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.xl\:via-red-500{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.xl\:via-red-600{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.xl\:via-red-700{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.xl\:via-red-800{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.xl\:via-red-900{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.xl\:via-orange-100{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.xl\:via-orange-200{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.xl\:via-orange-300{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.xl\:via-orange-400{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.xl\:via-orange-500{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.xl\:via-orange-600{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.xl\:via-orange-700{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.xl\:via-orange-800{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.xl\:via-orange-900{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.xl\:via-yellow-100{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.xl\:via-yellow-200{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.xl\:via-yellow-300{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.xl\:via-yellow-400{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.xl\:via-yellow-500{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.xl\:via-yellow-600{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.xl\:via-yellow-700{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.xl\:via-yellow-800{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.xl\:via-yellow-900{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.xl\:via-green-100{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.xl\:via-green-200{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.xl\:via-green-300{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.xl\:via-green-400{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.xl\:via-green-500{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.xl\:via-green-600{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.xl\:via-green-700{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.xl\:via-green-800{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.xl\:via-green-900{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.xl\:via-teal-100{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.xl\:via-teal-200{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.xl\:via-teal-300{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.xl\:via-teal-400{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.xl\:via-teal-500{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.xl\:via-teal-600{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.xl\:via-teal-700{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.xl\:via-teal-800{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.xl\:via-teal-900{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.xl\:via-blue-100{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.xl\:via-blue-200{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.xl\:via-blue-300{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.xl\:via-blue-400{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.xl\:via-blue-500{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.xl\:via-blue-600{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.xl\:via-blue-700{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.xl\:via-blue-800{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.xl\:via-blue-900{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.xl\:via-indigo-100{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.xl\:via-indigo-200{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.xl\:via-indigo-300{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.xl\:via-indigo-400{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.xl\:via-indigo-500{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.xl\:via-indigo-600{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.xl\:via-indigo-700{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.xl\:via-indigo-800{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.xl\:via-indigo-900{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.xl\:via-purple-100{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.xl\:via-purple-200{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.xl\:via-purple-300{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.xl\:via-purple-400{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.xl\:via-purple-500{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.xl\:via-purple-600{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.xl\:via-purple-700{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.xl\:via-purple-800{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.xl\:via-purple-900{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.xl\:via-pink-100{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.xl\:via-pink-200{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.xl\:via-pink-300{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.xl\:via-pink-400{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.xl\:via-pink-500{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.xl\:via-pink-600{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.xl\:via-pink-700{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.xl\:via-pink-800{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.xl\:via-pink-900{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.xl\:to-transparent{--gradient-to-color:transparent}.xl\:to-current{--gradient-to-color:currentColor}.xl\:to-black{--gradient-to-color:#000}.xl\:to-white{--gradient-to-color:#fff}.xl\:to-gray-100{--gradient-to-color:#f7fafc}.xl\:to-gray-200{--gradient-to-color:#edf2f7}.xl\:to-gray-300{--gradient-to-color:#e2e8f0}.xl\:to-gray-400{--gradient-to-color:#cbd5e0}.xl\:to-gray-500{--gradient-to-color:#a0aec0}.xl\:to-gray-600{--gradient-to-color:#718096}.xl\:to-gray-700{--gradient-to-color:#4a5568}.xl\:to-gray-800{--gradient-to-color:#2d3748}.xl\:to-gray-900{--gradient-to-color:#1a202c}.xl\:to-red-100{--gradient-to-color:#fff5f5}.xl\:to-red-200{--gradient-to-color:#fed7d7}.xl\:to-red-300{--gradient-to-color:#feb2b2}.xl\:to-red-400{--gradient-to-color:#fc8181}.xl\:to-red-500{--gradient-to-color:#f56565}.xl\:to-red-600{--gradient-to-color:#e53e3e}.xl\:to-red-700{--gradient-to-color:#c53030}.xl\:to-red-800{--gradient-to-color:#9b2c2c}.xl\:to-red-900{--gradient-to-color:#742a2a}.xl\:to-orange-100{--gradient-to-color:#fffaf0}.xl\:to-orange-200{--gradient-to-color:#feebc8}.xl\:to-orange-300{--gradient-to-color:#fbd38d}.xl\:to-orange-400{--gradient-to-color:#f6ad55}.xl\:to-orange-500{--gradient-to-color:#ed8936}.xl\:to-orange-600{--gradient-to-color:#dd6b20}.xl\:to-orange-700{--gradient-to-color:#c05621}.xl\:to-orange-800{--gradient-to-color:#9c4221}.xl\:to-orange-900{--gradient-to-color:#7b341e}.xl\:to-yellow-100{--gradient-to-color:#fffff0}.xl\:to-yellow-200{--gradient-to-color:#fefcbf}.xl\:to-yellow-300{--gradient-to-color:#faf089}.xl\:to-yellow-400{--gradient-to-color:#f6e05e}.xl\:to-yellow-500{--gradient-to-color:#ecc94b}.xl\:to-yellow-600{--gradient-to-color:#d69e2e}.xl\:to-yellow-700{--gradient-to-color:#b7791f}.xl\:to-yellow-800{--gradient-to-color:#975a16}.xl\:to-yellow-900{--gradient-to-color:#744210}.xl\:to-green-100{--gradient-to-color:#f0fff4}.xl\:to-green-200{--gradient-to-color:#c6f6d5}.xl\:to-green-300{--gradient-to-color:#9ae6b4}.xl\:to-green-400{--gradient-to-color:#68d391}.xl\:to-green-500{--gradient-to-color:#48bb78}.xl\:to-green-600{--gradient-to-color:#38a169}.xl\:to-green-700{--gradient-to-color:#2f855a}.xl\:to-green-800{--gradient-to-color:#276749}.xl\:to-green-900{--gradient-to-color:#22543d}.xl\:to-teal-100{--gradient-to-color:#e6fffa}.xl\:to-teal-200{--gradient-to-color:#b2f5ea}.xl\:to-teal-300{--gradient-to-color:#81e6d9}.xl\:to-teal-400{--gradient-to-color:#4fd1c5}.xl\:to-teal-500{--gradient-to-color:#38b2ac}.xl\:to-teal-600{--gradient-to-color:#319795}.xl\:to-teal-700{--gradient-to-color:#2c7a7b}.xl\:to-teal-800{--gradient-to-color:#285e61}.xl\:to-teal-900{--gradient-to-color:#234e52}.xl\:to-blue-100{--gradient-to-color:#ebf8ff}.xl\:to-blue-200{--gradient-to-color:#bee3f8}.xl\:to-blue-300{--gradient-to-color:#90cdf4}.xl\:to-blue-400{--gradient-to-color:#63b3ed}.xl\:to-blue-500{--gradient-to-color:#4299e1}.xl\:to-blue-600{--gradient-to-color:#3182ce}.xl\:to-blue-700{--gradient-to-color:#2b6cb0}.xl\:to-blue-800{--gradient-to-color:#2c5282}.xl\:to-blue-900{--gradient-to-color:#2a4365}.xl\:to-indigo-100{--gradient-to-color:#ebf4ff}.xl\:to-indigo-200{--gradient-to-color:#c3dafe}.xl\:to-indigo-300{--gradient-to-color:#a3bffa}.xl\:to-indigo-400{--gradient-to-color:#7f9cf5}.xl\:to-indigo-500{--gradient-to-color:#667eea}.xl\:to-indigo-600{--gradient-to-color:#5a67d8}.xl\:to-indigo-700{--gradient-to-color:#4c51bf}.xl\:to-indigo-800{--gradient-to-color:#434190}.xl\:to-indigo-900{--gradient-to-color:#3c366b}.xl\:to-purple-100{--gradient-to-color:#faf5ff}.xl\:to-purple-200{--gradient-to-color:#e9d8fd}.xl\:to-purple-300{--gradient-to-color:#d6bcfa}.xl\:to-purple-400{--gradient-to-color:#b794f4}.xl\:to-purple-500{--gradient-to-color:#9f7aea}.xl\:to-purple-600{--gradient-to-color:#805ad5}.xl\:to-purple-700{--gradient-to-color:#6b46c1}.xl\:to-purple-800{--gradient-to-color:#553c9a}.xl\:to-purple-900{--gradient-to-color:#44337a}.xl\:to-pink-100{--gradient-to-color:#fff5f7}.xl\:to-pink-200{--gradient-to-color:#fed7e2}.xl\:to-pink-300{--gradient-to-color:#fbb6ce}.xl\:to-pink-400{--gradient-to-color:#f687b3}.xl\:to-pink-500{--gradient-to-color:#ed64a6}.xl\:to-pink-600{--gradient-to-color:#d53f8c}.xl\:to-pink-700{--gradient-to-color:#b83280}.xl\:to-pink-800{--gradient-to-color:#97266d}.xl\:to-pink-900{--gradient-to-color:#702459}.xl\:hover\:from-transparent:hover{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:hover\:from-current:hover{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:hover\:from-black:hover{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:hover\:from-white:hover{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:hover\:from-gray-100:hover{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.xl\:hover\:from-gray-200:hover{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.xl\:hover\:from-gray-300:hover{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.xl\:hover\:from-gray-400:hover{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.xl\:hover\:from-gray-500:hover{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.xl\:hover\:from-gray-600:hover{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.xl\:hover\:from-gray-700:hover{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.xl\:hover\:from-gray-800:hover{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.xl\:hover\:from-gray-900:hover{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.xl\:hover\:from-red-100:hover{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.xl\:hover\:from-red-200:hover{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.xl\:hover\:from-red-300:hover{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.xl\:hover\:from-red-400:hover{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.xl\:hover\:from-red-500:hover{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.xl\:hover\:from-red-600:hover{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.xl\:hover\:from-red-700:hover{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.xl\:hover\:from-red-800:hover{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.xl\:hover\:from-red-900:hover{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.xl\:hover\:from-orange-100:hover{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.xl\:hover\:from-orange-200:hover{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.xl\:hover\:from-orange-300:hover{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.xl\:hover\:from-orange-400:hover{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.xl\:hover\:from-orange-500:hover{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.xl\:hover\:from-orange-600:hover{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.xl\:hover\:from-orange-700:hover{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.xl\:hover\:from-orange-800:hover{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.xl\:hover\:from-orange-900:hover{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.xl\:hover\:from-yellow-100:hover{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.xl\:hover\:from-yellow-200:hover{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.xl\:hover\:from-yellow-300:hover{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.xl\:hover\:from-yellow-400:hover{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.xl\:hover\:from-yellow-500:hover{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.xl\:hover\:from-yellow-600:hover{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.xl\:hover\:from-yellow-700:hover{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.xl\:hover\:from-yellow-800:hover{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.xl\:hover\:from-yellow-900:hover{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.xl\:hover\:from-green-100:hover{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.xl\:hover\:from-green-200:hover{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.xl\:hover\:from-green-300:hover{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.xl\:hover\:from-green-400:hover{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.xl\:hover\:from-green-500:hover{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.xl\:hover\:from-green-600:hover{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.xl\:hover\:from-green-700:hover{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.xl\:hover\:from-green-800:hover{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.xl\:hover\:from-green-900:hover{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.xl\:hover\:from-teal-100:hover{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.xl\:hover\:from-teal-200:hover{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.xl\:hover\:from-teal-300:hover{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.xl\:hover\:from-teal-400:hover{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.xl\:hover\:from-teal-500:hover{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.xl\:hover\:from-teal-600:hover{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.xl\:hover\:from-teal-700:hover{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.xl\:hover\:from-teal-800:hover{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.xl\:hover\:from-teal-900:hover{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.xl\:hover\:from-blue-100:hover{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.xl\:hover\:from-blue-200:hover{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.xl\:hover\:from-blue-300:hover{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.xl\:hover\:from-blue-400:hover{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.xl\:hover\:from-blue-500:hover{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.xl\:hover\:from-blue-600:hover{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.xl\:hover\:from-blue-700:hover{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.xl\:hover\:from-blue-800:hover{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.xl\:hover\:from-blue-900:hover{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.xl\:hover\:from-indigo-100:hover{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.xl\:hover\:from-indigo-200:hover{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.xl\:hover\:from-indigo-300:hover{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.xl\:hover\:from-indigo-400:hover{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.xl\:hover\:from-indigo-500:hover{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.xl\:hover\:from-indigo-600:hover{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.xl\:hover\:from-indigo-700:hover{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.xl\:hover\:from-indigo-800:hover{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.xl\:hover\:from-indigo-900:hover{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.xl\:hover\:from-purple-100:hover{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.xl\:hover\:from-purple-200:hover{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.xl\:hover\:from-purple-300:hover{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.xl\:hover\:from-purple-400:hover{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.xl\:hover\:from-purple-500:hover{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.xl\:hover\:from-purple-600:hover{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.xl\:hover\:from-purple-700:hover{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.xl\:hover\:from-purple-800:hover{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.xl\:hover\:from-purple-900:hover{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.xl\:hover\:from-pink-100:hover{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.xl\:hover\:from-pink-200:hover{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.xl\:hover\:from-pink-300:hover{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.xl\:hover\:from-pink-400:hover{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.xl\:hover\:from-pink-500:hover{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.xl\:hover\:from-pink-600:hover{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.xl\:hover\:from-pink-700:hover{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.xl\:hover\:from-pink-800:hover{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.xl\:hover\:from-pink-900:hover{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.xl\:hover\:via-transparent:hover{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:hover\:via-current:hover{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:hover\:via-black:hover{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:hover\:via-white:hover{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:hover\:via-gray-100:hover{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.xl\:hover\:via-gray-200:hover{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.xl\:hover\:via-gray-300:hover{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.xl\:hover\:via-gray-400:hover{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.xl\:hover\:via-gray-500:hover{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.xl\:hover\:via-gray-600:hover{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.xl\:hover\:via-gray-700:hover{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.xl\:hover\:via-gray-800:hover{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.xl\:hover\:via-gray-900:hover{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.xl\:hover\:via-red-100:hover{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.xl\:hover\:via-red-200:hover{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.xl\:hover\:via-red-300:hover{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.xl\:hover\:via-red-400:hover{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.xl\:hover\:via-red-500:hover{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.xl\:hover\:via-red-600:hover{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.xl\:hover\:via-red-700:hover{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.xl\:hover\:via-red-800:hover{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.xl\:hover\:via-red-900:hover{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.xl\:hover\:via-orange-100:hover{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.xl\:hover\:via-orange-200:hover{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.xl\:hover\:via-orange-300:hover{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.xl\:hover\:via-orange-400:hover{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.xl\:hover\:via-orange-500:hover{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.xl\:hover\:via-orange-600:hover{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.xl\:hover\:via-orange-700:hover{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.xl\:hover\:via-orange-800:hover{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.xl\:hover\:via-orange-900:hover{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.xl\:hover\:via-yellow-100:hover{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.xl\:hover\:via-yellow-200:hover{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.xl\:hover\:via-yellow-300:hover{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.xl\:hover\:via-yellow-400:hover{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.xl\:hover\:via-yellow-500:hover{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.xl\:hover\:via-yellow-600:hover{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.xl\:hover\:via-yellow-700:hover{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.xl\:hover\:via-yellow-800:hover{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.xl\:hover\:via-yellow-900:hover{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.xl\:hover\:via-green-100:hover{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.xl\:hover\:via-green-200:hover{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.xl\:hover\:via-green-300:hover{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.xl\:hover\:via-green-400:hover{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.xl\:hover\:via-green-500:hover{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.xl\:hover\:via-green-600:hover{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.xl\:hover\:via-green-700:hover{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.xl\:hover\:via-green-800:hover{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.xl\:hover\:via-green-900:hover{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.xl\:hover\:via-teal-100:hover{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.xl\:hover\:via-teal-200:hover{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.xl\:hover\:via-teal-300:hover{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.xl\:hover\:via-teal-400:hover{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.xl\:hover\:via-teal-500:hover{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.xl\:hover\:via-teal-600:hover{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.xl\:hover\:via-teal-700:hover{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.xl\:hover\:via-teal-800:hover{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.xl\:hover\:via-teal-900:hover{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.xl\:hover\:via-blue-100:hover{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.xl\:hover\:via-blue-200:hover{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.xl\:hover\:via-blue-300:hover{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.xl\:hover\:via-blue-400:hover{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.xl\:hover\:via-blue-500:hover{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.xl\:hover\:via-blue-600:hover{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.xl\:hover\:via-blue-700:hover{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.xl\:hover\:via-blue-800:hover{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.xl\:hover\:via-blue-900:hover{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.xl\:hover\:via-indigo-100:hover{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.xl\:hover\:via-indigo-200:hover{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.xl\:hover\:via-indigo-300:hover{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.xl\:hover\:via-indigo-400:hover{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.xl\:hover\:via-indigo-500:hover{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.xl\:hover\:via-indigo-600:hover{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.xl\:hover\:via-indigo-700:hover{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.xl\:hover\:via-indigo-800:hover{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.xl\:hover\:via-indigo-900:hover{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.xl\:hover\:via-purple-100:hover{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.xl\:hover\:via-purple-200:hover{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.xl\:hover\:via-purple-300:hover{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.xl\:hover\:via-purple-400:hover{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.xl\:hover\:via-purple-500:hover{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.xl\:hover\:via-purple-600:hover{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.xl\:hover\:via-purple-700:hover{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.xl\:hover\:via-purple-800:hover{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.xl\:hover\:via-purple-900:hover{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.xl\:hover\:via-pink-100:hover{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.xl\:hover\:via-pink-200:hover{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.xl\:hover\:via-pink-300:hover{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.xl\:hover\:via-pink-400:hover{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.xl\:hover\:via-pink-500:hover{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.xl\:hover\:via-pink-600:hover{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.xl\:hover\:via-pink-700:hover{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.xl\:hover\:via-pink-800:hover{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.xl\:hover\:via-pink-900:hover{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.xl\:hover\:to-transparent:hover{--gradient-to-color:transparent}.xl\:hover\:to-current:hover{--gradient-to-color:currentColor}.xl\:hover\:to-black:hover{--gradient-to-color:#000}.xl\:hover\:to-white:hover{--gradient-to-color:#fff}.xl\:hover\:to-gray-100:hover{--gradient-to-color:#f7fafc}.xl\:hover\:to-gray-200:hover{--gradient-to-color:#edf2f7}.xl\:hover\:to-gray-300:hover{--gradient-to-color:#e2e8f0}.xl\:hover\:to-gray-400:hover{--gradient-to-color:#cbd5e0}.xl\:hover\:to-gray-500:hover{--gradient-to-color:#a0aec0}.xl\:hover\:to-gray-600:hover{--gradient-to-color:#718096}.xl\:hover\:to-gray-700:hover{--gradient-to-color:#4a5568}.xl\:hover\:to-gray-800:hover{--gradient-to-color:#2d3748}.xl\:hover\:to-gray-900:hover{--gradient-to-color:#1a202c}.xl\:hover\:to-red-100:hover{--gradient-to-color:#fff5f5}.xl\:hover\:to-red-200:hover{--gradient-to-color:#fed7d7}.xl\:hover\:to-red-300:hover{--gradient-to-color:#feb2b2}.xl\:hover\:to-red-400:hover{--gradient-to-color:#fc8181}.xl\:hover\:to-red-500:hover{--gradient-to-color:#f56565}.xl\:hover\:to-red-600:hover{--gradient-to-color:#e53e3e}.xl\:hover\:to-red-700:hover{--gradient-to-color:#c53030}.xl\:hover\:to-red-800:hover{--gradient-to-color:#9b2c2c}.xl\:hover\:to-red-900:hover{--gradient-to-color:#742a2a}.xl\:hover\:to-orange-100:hover{--gradient-to-color:#fffaf0}.xl\:hover\:to-orange-200:hover{--gradient-to-color:#feebc8}.xl\:hover\:to-orange-300:hover{--gradient-to-color:#fbd38d}.xl\:hover\:to-orange-400:hover{--gradient-to-color:#f6ad55}.xl\:hover\:to-orange-500:hover{--gradient-to-color:#ed8936}.xl\:hover\:to-orange-600:hover{--gradient-to-color:#dd6b20}.xl\:hover\:to-orange-700:hover{--gradient-to-color:#c05621}.xl\:hover\:to-orange-800:hover{--gradient-to-color:#9c4221}.xl\:hover\:to-orange-900:hover{--gradient-to-color:#7b341e}.xl\:hover\:to-yellow-100:hover{--gradient-to-color:#fffff0}.xl\:hover\:to-yellow-200:hover{--gradient-to-color:#fefcbf}.xl\:hover\:to-yellow-300:hover{--gradient-to-color:#faf089}.xl\:hover\:to-yellow-400:hover{--gradient-to-color:#f6e05e}.xl\:hover\:to-yellow-500:hover{--gradient-to-color:#ecc94b}.xl\:hover\:to-yellow-600:hover{--gradient-to-color:#d69e2e}.xl\:hover\:to-yellow-700:hover{--gradient-to-color:#b7791f}.xl\:hover\:to-yellow-800:hover{--gradient-to-color:#975a16}.xl\:hover\:to-yellow-900:hover{--gradient-to-color:#744210}.xl\:hover\:to-green-100:hover{--gradient-to-color:#f0fff4}.xl\:hover\:to-green-200:hover{--gradient-to-color:#c6f6d5}.xl\:hover\:to-green-300:hover{--gradient-to-color:#9ae6b4}.xl\:hover\:to-green-400:hover{--gradient-to-color:#68d391}.xl\:hover\:to-green-500:hover{--gradient-to-color:#48bb78}.xl\:hover\:to-green-600:hover{--gradient-to-color:#38a169}.xl\:hover\:to-green-700:hover{--gradient-to-color:#2f855a}.xl\:hover\:to-green-800:hover{--gradient-to-color:#276749}.xl\:hover\:to-green-900:hover{--gradient-to-color:#22543d}.xl\:hover\:to-teal-100:hover{--gradient-to-color:#e6fffa}.xl\:hover\:to-teal-200:hover{--gradient-to-color:#b2f5ea}.xl\:hover\:to-teal-300:hover{--gradient-to-color:#81e6d9}.xl\:hover\:to-teal-400:hover{--gradient-to-color:#4fd1c5}.xl\:hover\:to-teal-500:hover{--gradient-to-color:#38b2ac}.xl\:hover\:to-teal-600:hover{--gradient-to-color:#319795}.xl\:hover\:to-teal-700:hover{--gradient-to-color:#2c7a7b}.xl\:hover\:to-teal-800:hover{--gradient-to-color:#285e61}.xl\:hover\:to-teal-900:hover{--gradient-to-color:#234e52}.xl\:hover\:to-blue-100:hover{--gradient-to-color:#ebf8ff}.xl\:hover\:to-blue-200:hover{--gradient-to-color:#bee3f8}.xl\:hover\:to-blue-300:hover{--gradient-to-color:#90cdf4}.xl\:hover\:to-blue-400:hover{--gradient-to-color:#63b3ed}.xl\:hover\:to-blue-500:hover{--gradient-to-color:#4299e1}.xl\:hover\:to-blue-600:hover{--gradient-to-color:#3182ce}.xl\:hover\:to-blue-700:hover{--gradient-to-color:#2b6cb0}.xl\:hover\:to-blue-800:hover{--gradient-to-color:#2c5282}.xl\:hover\:to-blue-900:hover{--gradient-to-color:#2a4365}.xl\:hover\:to-indigo-100:hover{--gradient-to-color:#ebf4ff}.xl\:hover\:to-indigo-200:hover{--gradient-to-color:#c3dafe}.xl\:hover\:to-indigo-300:hover{--gradient-to-color:#a3bffa}.xl\:hover\:to-indigo-400:hover{--gradient-to-color:#7f9cf5}.xl\:hover\:to-indigo-500:hover{--gradient-to-color:#667eea}.xl\:hover\:to-indigo-600:hover{--gradient-to-color:#5a67d8}.xl\:hover\:to-indigo-700:hover{--gradient-to-color:#4c51bf}.xl\:hover\:to-indigo-800:hover{--gradient-to-color:#434190}.xl\:hover\:to-indigo-900:hover{--gradient-to-color:#3c366b}.xl\:hover\:to-purple-100:hover{--gradient-to-color:#faf5ff}.xl\:hover\:to-purple-200:hover{--gradient-to-color:#e9d8fd}.xl\:hover\:to-purple-300:hover{--gradient-to-color:#d6bcfa}.xl\:hover\:to-purple-400:hover{--gradient-to-color:#b794f4}.xl\:hover\:to-purple-500:hover{--gradient-to-color:#9f7aea}.xl\:hover\:to-purple-600:hover{--gradient-to-color:#805ad5}.xl\:hover\:to-purple-700:hover{--gradient-to-color:#6b46c1}.xl\:hover\:to-purple-800:hover{--gradient-to-color:#553c9a}.xl\:hover\:to-purple-900:hover{--gradient-to-color:#44337a}.xl\:hover\:to-pink-100:hover{--gradient-to-color:#fff5f7}.xl\:hover\:to-pink-200:hover{--gradient-to-color:#fed7e2}.xl\:hover\:to-pink-300:hover{--gradient-to-color:#fbb6ce}.xl\:hover\:to-pink-400:hover{--gradient-to-color:#f687b3}.xl\:hover\:to-pink-500:hover{--gradient-to-color:#ed64a6}.xl\:hover\:to-pink-600:hover{--gradient-to-color:#d53f8c}.xl\:hover\:to-pink-700:hover{--gradient-to-color:#b83280}.xl\:hover\:to-pink-800:hover{--gradient-to-color:#97266d}.xl\:hover\:to-pink-900:hover{--gradient-to-color:#702459}.xl\:focus\:from-transparent:focus{--gradient-from-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:focus\:from-current:focus{--gradient-from-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:focus\:from-black:focus{--gradient-from-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:focus\:from-white:focus{--gradient-from-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:focus\:from-gray-100:focus{--gradient-from-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.xl\:focus\:from-gray-200:focus{--gradient-from-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.xl\:focus\:from-gray-300:focus{--gradient-from-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.xl\:focus\:from-gray-400:focus{--gradient-from-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.xl\:focus\:from-gray-500:focus{--gradient-from-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.xl\:focus\:from-gray-600:focus{--gradient-from-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.xl\:focus\:from-gray-700:focus{--gradient-from-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.xl\:focus\:from-gray-800:focus{--gradient-from-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.xl\:focus\:from-gray-900:focus{--gradient-from-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.xl\:focus\:from-red-100:focus{--gradient-from-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.xl\:focus\:from-red-200:focus{--gradient-from-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.xl\:focus\:from-red-300:focus{--gradient-from-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.xl\:focus\:from-red-400:focus{--gradient-from-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.xl\:focus\:from-red-500:focus{--gradient-from-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.xl\:focus\:from-red-600:focus{--gradient-from-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.xl\:focus\:from-red-700:focus{--gradient-from-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.xl\:focus\:from-red-800:focus{--gradient-from-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.xl\:focus\:from-red-900:focus{--gradient-from-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.xl\:focus\:from-orange-100:focus{--gradient-from-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.xl\:focus\:from-orange-200:focus{--gradient-from-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.xl\:focus\:from-orange-300:focus{--gradient-from-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.xl\:focus\:from-orange-400:focus{--gradient-from-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.xl\:focus\:from-orange-500:focus{--gradient-from-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.xl\:focus\:from-orange-600:focus{--gradient-from-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.xl\:focus\:from-orange-700:focus{--gradient-from-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.xl\:focus\:from-orange-800:focus{--gradient-from-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.xl\:focus\:from-orange-900:focus{--gradient-from-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.xl\:focus\:from-yellow-100:focus{--gradient-from-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.xl\:focus\:from-yellow-200:focus{--gradient-from-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.xl\:focus\:from-yellow-300:focus{--gradient-from-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.xl\:focus\:from-yellow-400:focus{--gradient-from-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.xl\:focus\:from-yellow-500:focus{--gradient-from-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.xl\:focus\:from-yellow-600:focus{--gradient-from-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.xl\:focus\:from-yellow-700:focus{--gradient-from-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.xl\:focus\:from-yellow-800:focus{--gradient-from-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.xl\:focus\:from-yellow-900:focus{--gradient-from-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.xl\:focus\:from-green-100:focus{--gradient-from-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.xl\:focus\:from-green-200:focus{--gradient-from-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.xl\:focus\:from-green-300:focus{--gradient-from-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.xl\:focus\:from-green-400:focus{--gradient-from-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.xl\:focus\:from-green-500:focus{--gradient-from-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.xl\:focus\:from-green-600:focus{--gradient-from-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.xl\:focus\:from-green-700:focus{--gradient-from-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.xl\:focus\:from-green-800:focus{--gradient-from-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.xl\:focus\:from-green-900:focus{--gradient-from-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.xl\:focus\:from-teal-100:focus{--gradient-from-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.xl\:focus\:from-teal-200:focus{--gradient-from-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.xl\:focus\:from-teal-300:focus{--gradient-from-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.xl\:focus\:from-teal-400:focus{--gradient-from-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.xl\:focus\:from-teal-500:focus{--gradient-from-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.xl\:focus\:from-teal-600:focus{--gradient-from-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.xl\:focus\:from-teal-700:focus{--gradient-from-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.xl\:focus\:from-teal-800:focus{--gradient-from-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.xl\:focus\:from-teal-900:focus{--gradient-from-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.xl\:focus\:from-blue-100:focus{--gradient-from-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.xl\:focus\:from-blue-200:focus{--gradient-from-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.xl\:focus\:from-blue-300:focus{--gradient-from-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.xl\:focus\:from-blue-400:focus{--gradient-from-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.xl\:focus\:from-blue-500:focus{--gradient-from-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.xl\:focus\:from-blue-600:focus{--gradient-from-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.xl\:focus\:from-blue-700:focus{--gradient-from-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.xl\:focus\:from-blue-800:focus{--gradient-from-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.xl\:focus\:from-blue-900:focus{--gradient-from-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.xl\:focus\:from-indigo-100:focus{--gradient-from-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.xl\:focus\:from-indigo-200:focus{--gradient-from-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.xl\:focus\:from-indigo-300:focus{--gradient-from-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.xl\:focus\:from-indigo-400:focus{--gradient-from-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.xl\:focus\:from-indigo-500:focus{--gradient-from-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.xl\:focus\:from-indigo-600:focus{--gradient-from-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.xl\:focus\:from-indigo-700:focus{--gradient-from-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.xl\:focus\:from-indigo-800:focus{--gradient-from-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.xl\:focus\:from-indigo-900:focus{--gradient-from-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.xl\:focus\:from-purple-100:focus{--gradient-from-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.xl\:focus\:from-purple-200:focus{--gradient-from-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.xl\:focus\:from-purple-300:focus{--gradient-from-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.xl\:focus\:from-purple-400:focus{--gradient-from-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.xl\:focus\:from-purple-500:focus{--gradient-from-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.xl\:focus\:from-purple-600:focus{--gradient-from-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.xl\:focus\:from-purple-700:focus{--gradient-from-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.xl\:focus\:from-purple-800:focus{--gradient-from-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.xl\:focus\:from-purple-900:focus{--gradient-from-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.xl\:focus\:from-pink-100:focus{--gradient-from-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.xl\:focus\:from-pink-200:focus{--gradient-from-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.xl\:focus\:from-pink-300:focus{--gradient-from-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.xl\:focus\:from-pink-400:focus{--gradient-from-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.xl\:focus\:from-pink-500:focus{--gradient-from-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.xl\:focus\:from-pink-600:focus{--gradient-from-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.xl\:focus\:from-pink-700:focus{--gradient-from-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.xl\:focus\:from-pink-800:focus{--gradient-from-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.xl\:focus\:from-pink-900:focus{--gradient-from-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.xl\:focus\:via-transparent:focus{--gradient-via-color:transparent;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:focus\:via-current:focus{--gradient-via-color:currentColor;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:focus\:via-black:focus{--gradient-via-color:#000;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(0, 0, 0, 0))}.xl\:focus\:via-white:focus{--gradient-via-color:#fff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 255, 0))}.xl\:focus\:via-gray-100:focus{--gradient-via-color:#f7fafc;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(247, 250, 252, 0))}.xl\:focus\:via-gray-200:focus{--gradient-via-color:#edf2f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 242, 247, 0))}.xl\:focus\:via-gray-300:focus{--gradient-via-color:#e2e8f0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(226, 232, 240, 0))}.xl\:focus\:via-gray-400:focus{--gradient-via-color:#cbd5e0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(203, 213, 224, 0))}.xl\:focus\:via-gray-500:focus{--gradient-via-color:#a0aec0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(160, 174, 192, 0))}.xl\:focus\:via-gray-600:focus{--gradient-via-color:#718096;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(113, 128, 150, 0))}.xl\:focus\:via-gray-700:focus{--gradient-via-color:#4a5568;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(74, 85, 104, 0))}.xl\:focus\:via-gray-800:focus{--gradient-via-color:#2d3748;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(45, 55, 72, 0))}.xl\:focus\:via-gray-900:focus{--gradient-via-color:#1a202c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(26, 32, 44, 0))}.xl\:focus\:via-red-100:focus{--gradient-via-color:#fff5f5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 245, 0))}.xl\:focus\:via-red-200:focus{--gradient-via-color:#fed7d7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 215, 0))}.xl\:focus\:via-red-300:focus{--gradient-via-color:#feb2b2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 178, 178, 0))}.xl\:focus\:via-red-400:focus{--gradient-via-color:#fc8181;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(252, 129, 129, 0))}.xl\:focus\:via-red-500:focus{--gradient-via-color:#f56565;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(245, 101, 101, 0))}.xl\:focus\:via-red-600:focus{--gradient-via-color:#e53e3e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(229, 62, 62, 0))}.xl\:focus\:via-red-700:focus{--gradient-via-color:#c53030;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(197, 48, 48, 0))}.xl\:focus\:via-red-800:focus{--gradient-via-color:#9b2c2c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(155, 44, 44, 0))}.xl\:focus\:via-red-900:focus{--gradient-via-color:#742a2a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 42, 42, 0))}.xl\:focus\:via-orange-100:focus{--gradient-via-color:#fffaf0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 250, 240, 0))}.xl\:focus\:via-orange-200:focus{--gradient-via-color:#feebc8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 235, 200, 0))}.xl\:focus\:via-orange-300:focus{--gradient-via-color:#fbd38d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 211, 141, 0))}.xl\:focus\:via-orange-400:focus{--gradient-via-color:#f6ad55;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 173, 85, 0))}.xl\:focus\:via-orange-500:focus{--gradient-via-color:#ed8936;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 137, 54, 0))}.xl\:focus\:via-orange-600:focus{--gradient-via-color:#dd6b20;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(221, 107, 32, 0))}.xl\:focus\:via-orange-700:focus{--gradient-via-color:#c05621;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(192, 86, 33, 0))}.xl\:focus\:via-orange-800:focus{--gradient-via-color:#9c4221;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(156, 66, 33, 0))}.xl\:focus\:via-orange-900:focus{--gradient-via-color:#7b341e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(123, 52, 30, 0))}.xl\:focus\:via-yellow-100:focus{--gradient-via-color:#fffff0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 255, 240, 0))}.xl\:focus\:via-yellow-200:focus{--gradient-via-color:#fefcbf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 252, 191, 0))}.xl\:focus\:via-yellow-300:focus{--gradient-via-color:#faf089;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 240, 137, 0))}.xl\:focus\:via-yellow-400:focus{--gradient-via-color:#f6e05e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 224, 94, 0))}.xl\:focus\:via-yellow-500:focus{--gradient-via-color:#ecc94b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(236, 201, 75, 0))}.xl\:focus\:via-yellow-600:focus{--gradient-via-color:#d69e2e;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 158, 46, 0))}.xl\:focus\:via-yellow-700:focus{--gradient-via-color:#b7791f;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 121, 31, 0))}.xl\:focus\:via-yellow-800:focus{--gradient-via-color:#975a16;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 90, 22, 0))}.xl\:focus\:via-yellow-900:focus{--gradient-via-color:#744210;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(116, 66, 16, 0))}.xl\:focus\:via-green-100:focus{--gradient-via-color:#f0fff4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(240, 255, 244, 0))}.xl\:focus\:via-green-200:focus{--gradient-via-color:#c6f6d5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(198, 246, 213, 0))}.xl\:focus\:via-green-300:focus{--gradient-via-color:#9ae6b4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(154, 230, 180, 0))}.xl\:focus\:via-green-400:focus{--gradient-via-color:#68d391;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(104, 211, 145, 0))}.xl\:focus\:via-green-500:focus{--gradient-via-color:#48bb78;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(72, 187, 120, 0))}.xl\:focus\:via-green-600:focus{--gradient-via-color:#38a169;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 161, 105, 0))}.xl\:focus\:via-green-700:focus{--gradient-via-color:#2f855a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(47, 133, 90, 0))}.xl\:focus\:via-green-800:focus{--gradient-via-color:#276749;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(39, 103, 73, 0))}.xl\:focus\:via-green-900:focus{--gradient-via-color:#22543d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(34, 84, 61, 0))}.xl\:focus\:via-teal-100:focus{--gradient-via-color:#e6fffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(230, 255, 250, 0))}.xl\:focus\:via-teal-200:focus{--gradient-via-color:#b2f5ea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(178, 245, 234, 0))}.xl\:focus\:via-teal-300:focus{--gradient-via-color:#81e6d9;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(129, 230, 217, 0))}.xl\:focus\:via-teal-400:focus{--gradient-via-color:#4fd1c5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(79, 209, 197, 0))}.xl\:focus\:via-teal-500:focus{--gradient-via-color:#38b2ac;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(56, 178, 172, 0))}.xl\:focus\:via-teal-600:focus{--gradient-via-color:#319795;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 151, 149, 0))}.xl\:focus\:via-teal-700:focus{--gradient-via-color:#2c7a7b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 122, 123, 0))}.xl\:focus\:via-teal-800:focus{--gradient-via-color:#285e61;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(40, 94, 97, 0))}.xl\:focus\:via-teal-900:focus{--gradient-via-color:#234e52;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(35, 78, 82, 0))}.xl\:focus\:via-blue-100:focus{--gradient-via-color:#ebf8ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 248, 255, 0))}.xl\:focus\:via-blue-200:focus{--gradient-via-color:#bee3f8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(190, 227, 248, 0))}.xl\:focus\:via-blue-300:focus{--gradient-via-color:#90cdf4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(144, 205, 244, 0))}.xl\:focus\:via-blue-400:focus{--gradient-via-color:#63b3ed;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(99, 179, 237, 0))}.xl\:focus\:via-blue-500:focus{--gradient-via-color:#4299e1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(66, 153, 225, 0))}.xl\:focus\:via-blue-600:focus{--gradient-via-color:#3182ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(49, 130, 206, 0))}.xl\:focus\:via-blue-700:focus{--gradient-via-color:#2b6cb0;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(43, 108, 176, 0))}.xl\:focus\:via-blue-800:focus{--gradient-via-color:#2c5282;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(44, 82, 130, 0))}.xl\:focus\:via-blue-900:focus{--gradient-via-color:#2a4365;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(42, 67, 101, 0))}.xl\:focus\:via-indigo-100:focus{--gradient-via-color:#ebf4ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(235, 244, 255, 0))}.xl\:focus\:via-indigo-200:focus{--gradient-via-color:#c3dafe;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(195, 218, 254, 0))}.xl\:focus\:via-indigo-300:focus{--gradient-via-color:#a3bffa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(163, 191, 250, 0))}.xl\:focus\:via-indigo-400:focus{--gradient-via-color:#7f9cf5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(127, 156, 245, 0))}.xl\:focus\:via-indigo-500:focus{--gradient-via-color:#667eea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(102, 126, 234, 0))}.xl\:focus\:via-indigo-600:focus{--gradient-via-color:#5a67d8;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(90, 103, 216, 0))}.xl\:focus\:via-indigo-700:focus{--gradient-via-color:#4c51bf;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(76, 81, 191, 0))}.xl\:focus\:via-indigo-800:focus{--gradient-via-color:#434190;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(67, 65, 144, 0))}.xl\:focus\:via-indigo-900:focus{--gradient-via-color:#3c366b;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(60, 54, 107, 0))}.xl\:focus\:via-purple-100:focus{--gradient-via-color:#faf5ff;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(250, 245, 255, 0))}.xl\:focus\:via-purple-200:focus{--gradient-via-color:#e9d8fd;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(233, 216, 253, 0))}.xl\:focus\:via-purple-300:focus{--gradient-via-color:#d6bcfa;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(214, 188, 250, 0))}.xl\:focus\:via-purple-400:focus{--gradient-via-color:#b794f4;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(183, 148, 244, 0))}.xl\:focus\:via-purple-500:focus{--gradient-via-color:#9f7aea;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(159, 122, 234, 0))}.xl\:focus\:via-purple-600:focus{--gradient-via-color:#805ad5;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(128, 90, 213, 0))}.xl\:focus\:via-purple-700:focus{--gradient-via-color:#6b46c1;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(107, 70, 193, 0))}.xl\:focus\:via-purple-800:focus{--gradient-via-color:#553c9a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(85, 60, 154, 0))}.xl\:focus\:via-purple-900:focus{--gradient-via-color:#44337a;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(68, 51, 122, 0))}.xl\:focus\:via-pink-100:focus{--gradient-via-color:#fff5f7;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(255, 245, 247, 0))}.xl\:focus\:via-pink-200:focus{--gradient-via-color:#fed7e2;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(254, 215, 226, 0))}.xl\:focus\:via-pink-300:focus{--gradient-via-color:#fbb6ce;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(251, 182, 206, 0))}.xl\:focus\:via-pink-400:focus{--gradient-via-color:#f687b3;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(246, 135, 179, 0))}.xl\:focus\:via-pink-500:focus{--gradient-via-color:#ed64a6;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(237, 100, 166, 0))}.xl\:focus\:via-pink-600:focus{--gradient-via-color:#d53f8c;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(213, 63, 140, 0))}.xl\:focus\:via-pink-700:focus{--gradient-via-color:#b83280;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(184, 50, 128, 0))}.xl\:focus\:via-pink-800:focus{--gradient-via-color:#97266d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(151, 38, 109, 0))}.xl\:focus\:via-pink-900:focus{--gradient-via-color:#702459;--gradient-color-stops:var(--gradient-from-color),var(--gradient-via-color),var(--gradient-to-color, rgba(112, 36, 89, 0))}.xl\:focus\:to-transparent:focus{--gradient-to-color:transparent}.xl\:focus\:to-current:focus{--gradient-to-color:currentColor}.xl\:focus\:to-black:focus{--gradient-to-color:#000}.xl\:focus\:to-white:focus{--gradient-to-color:#fff}.xl\:focus\:to-gray-100:focus{--gradient-to-color:#f7fafc}.xl\:focus\:to-gray-200:focus{--gradient-to-color:#edf2f7}.xl\:focus\:to-gray-300:focus{--gradient-to-color:#e2e8f0}.xl\:focus\:to-gray-400:focus{--gradient-to-color:#cbd5e0}.xl\:focus\:to-gray-500:focus{--gradient-to-color:#a0aec0}.xl\:focus\:to-gray-600:focus{--gradient-to-color:#718096}.xl\:focus\:to-gray-700:focus{--gradient-to-color:#4a5568}.xl\:focus\:to-gray-800:focus{--gradient-to-color:#2d3748}.xl\:focus\:to-gray-900:focus{--gradient-to-color:#1a202c}.xl\:focus\:to-red-100:focus{--gradient-to-color:#fff5f5}.xl\:focus\:to-red-200:focus{--gradient-to-color:#fed7d7}.xl\:focus\:to-red-300:focus{--gradient-to-color:#feb2b2}.xl\:focus\:to-red-400:focus{--gradient-to-color:#fc8181}.xl\:focus\:to-red-500:focus{--gradient-to-color:#f56565}.xl\:focus\:to-red-600:focus{--gradient-to-color:#e53e3e}.xl\:focus\:to-red-700:focus{--gradient-to-color:#c53030}.xl\:focus\:to-red-800:focus{--gradient-to-color:#9b2c2c}.xl\:focus\:to-red-900:focus{--gradient-to-color:#742a2a}.xl\:focus\:to-orange-100:focus{--gradient-to-color:#fffaf0}.xl\:focus\:to-orange-200:focus{--gradient-to-color:#feebc8}.xl\:focus\:to-orange-300:focus{--gradient-to-color:#fbd38d}.xl\:focus\:to-orange-400:focus{--gradient-to-color:#f6ad55}.xl\:focus\:to-orange-500:focus{--gradient-to-color:#ed8936}.xl\:focus\:to-orange-600:focus{--gradient-to-color:#dd6b20}.xl\:focus\:to-orange-700:focus{--gradient-to-color:#c05621}.xl\:focus\:to-orange-800:focus{--gradient-to-color:#9c4221}.xl\:focus\:to-orange-900:focus{--gradient-to-color:#7b341e}.xl\:focus\:to-yellow-100:focus{--gradient-to-color:#fffff0}.xl\:focus\:to-yellow-200:focus{--gradient-to-color:#fefcbf}.xl\:focus\:to-yellow-300:focus{--gradient-to-color:#faf089}.xl\:focus\:to-yellow-400:focus{--gradient-to-color:#f6e05e}.xl\:focus\:to-yellow-500:focus{--gradient-to-color:#ecc94b}.xl\:focus\:to-yellow-600:focus{--gradient-to-color:#d69e2e}.xl\:focus\:to-yellow-700:focus{--gradient-to-color:#b7791f}.xl\:focus\:to-yellow-800:focus{--gradient-to-color:#975a16}.xl\:focus\:to-yellow-900:focus{--gradient-to-color:#744210}.xl\:focus\:to-green-100:focus{--gradient-to-color:#f0fff4}.xl\:focus\:to-green-200:focus{--gradient-to-color:#c6f6d5}.xl\:focus\:to-green-300:focus{--gradient-to-color:#9ae6b4}.xl\:focus\:to-green-400:focus{--gradient-to-color:#68d391}.xl\:focus\:to-green-500:focus{--gradient-to-color:#48bb78}.xl\:focus\:to-green-600:focus{--gradient-to-color:#38a169}.xl\:focus\:to-green-700:focus{--gradient-to-color:#2f855a}.xl\:focus\:to-green-800:focus{--gradient-to-color:#276749}.xl\:focus\:to-green-900:focus{--gradient-to-color:#22543d}.xl\:focus\:to-teal-100:focus{--gradient-to-color:#e6fffa}.xl\:focus\:to-teal-200:focus{--gradient-to-color:#b2f5ea}.xl\:focus\:to-teal-300:focus{--gradient-to-color:#81e6d9}.xl\:focus\:to-teal-400:focus{--gradient-to-color:#4fd1c5}.xl\:focus\:to-teal-500:focus{--gradient-to-color:#38b2ac}.xl\:focus\:to-teal-600:focus{--gradient-to-color:#319795}.xl\:focus\:to-teal-700:focus{--gradient-to-color:#2c7a7b}.xl\:focus\:to-teal-800:focus{--gradient-to-color:#285e61}.xl\:focus\:to-teal-900:focus{--gradient-to-color:#234e52}.xl\:focus\:to-blue-100:focus{--gradient-to-color:#ebf8ff}.xl\:focus\:to-blue-200:focus{--gradient-to-color:#bee3f8}.xl\:focus\:to-blue-300:focus{--gradient-to-color:#90cdf4}.xl\:focus\:to-blue-400:focus{--gradient-to-color:#63b3ed}.xl\:focus\:to-blue-500:focus{--gradient-to-color:#4299e1}.xl\:focus\:to-blue-600:focus{--gradient-to-color:#3182ce}.xl\:focus\:to-blue-700:focus{--gradient-to-color:#2b6cb0}.xl\:focus\:to-blue-800:focus{--gradient-to-color:#2c5282}.xl\:focus\:to-blue-900:focus{--gradient-to-color:#2a4365}.xl\:focus\:to-indigo-100:focus{--gradient-to-color:#ebf4ff}.xl\:focus\:to-indigo-200:focus{--gradient-to-color:#c3dafe}.xl\:focus\:to-indigo-300:focus{--gradient-to-color:#a3bffa}.xl\:focus\:to-indigo-400:focus{--gradient-to-color:#7f9cf5}.xl\:focus\:to-indigo-500:focus{--gradient-to-color:#667eea}.xl\:focus\:to-indigo-600:focus{--gradient-to-color:#5a67d8}.xl\:focus\:to-indigo-700:focus{--gradient-to-color:#4c51bf}.xl\:focus\:to-indigo-800:focus{--gradient-to-color:#434190}.xl\:focus\:to-indigo-900:focus{--gradient-to-color:#3c366b}.xl\:focus\:to-purple-100:focus{--gradient-to-color:#faf5ff}.xl\:focus\:to-purple-200:focus{--gradient-to-color:#e9d8fd}.xl\:focus\:to-purple-300:focus{--gradient-to-color:#d6bcfa}.xl\:focus\:to-purple-400:focus{--gradient-to-color:#b794f4}.xl\:focus\:to-purple-500:focus{--gradient-to-color:#9f7aea}.xl\:focus\:to-purple-600:focus{--gradient-to-color:#805ad5}.xl\:focus\:to-purple-700:focus{--gradient-to-color:#6b46c1}.xl\:focus\:to-purple-800:focus{--gradient-to-color:#553c9a}.xl\:focus\:to-purple-900:focus{--gradient-to-color:#44337a}.xl\:focus\:to-pink-100:focus{--gradient-to-color:#fff5f7}.xl\:focus\:to-pink-200:focus{--gradient-to-color:#fed7e2}.xl\:focus\:to-pink-300:focus{--gradient-to-color:#fbb6ce}.xl\:focus\:to-pink-400:focus{--gradient-to-color:#f687b3}.xl\:focus\:to-pink-500:focus{--gradient-to-color:#ed64a6}.xl\:focus\:to-pink-600:focus{--gradient-to-color:#d53f8c}.xl\:focus\:to-pink-700:focus{--gradient-to-color:#b83280}.xl\:focus\:to-pink-800:focus{--gradient-to-color:#97266d}.xl\:focus\:to-pink-900:focus{--gradient-to-color:#702459}.xl\:bg-opacity-0{--bg-opacity:0}.xl\:bg-opacity-25{--bg-opacity:0.25}.xl\:bg-opacity-50{--bg-opacity:0.5}.xl\:bg-opacity-75{--bg-opacity:0.75}.xl\:bg-opacity-100{--bg-opacity:1}.xl\:hover\:bg-opacity-0:hover{--bg-opacity:0}.xl\:hover\:bg-opacity-25:hover{--bg-opacity:0.25}.xl\:hover\:bg-opacity-50:hover{--bg-opacity:0.5}.xl\:hover\:bg-opacity-75:hover{--bg-opacity:0.75}.xl\:hover\:bg-opacity-100:hover{--bg-opacity:1}.xl\:focus\:bg-opacity-0:focus{--bg-opacity:0}.xl\:focus\:bg-opacity-25:focus{--bg-opacity:0.25}.xl\:focus\:bg-opacity-50:focus{--bg-opacity:0.5}.xl\:focus\:bg-opacity-75:focus{--bg-opacity:0.75}.xl\:focus\:bg-opacity-100:focus{--bg-opacity:1}.xl\:bg-bottom{background-position:bottom}.xl\:bg-center{background-position:center}.xl\:bg-left{background-position:left}.xl\:bg-left-bottom{background-position:left bottom}.xl\:bg-left-top{background-position:left top}.xl\:bg-right{background-position:right}.xl\:bg-right-bottom{background-position:right bottom}.xl\:bg-right-top{background-position:right top}.xl\:bg-top{background-position:top}.xl\:bg-repeat{background-repeat:repeat}.xl\:bg-no-repeat{background-repeat:no-repeat}.xl\:bg-repeat-x{background-repeat:repeat-x}.xl\:bg-repeat-y{background-repeat:repeat-y}.xl\:bg-repeat-round{background-repeat:round}.xl\:bg-repeat-space{background-repeat:space}.xl\:bg-auto{background-size:auto}.xl\:bg-cover{background-size:cover}.xl\:bg-contain{background-size:contain}.xl\:border-collapse{border-collapse:collapse}.xl\:border-separate{border-collapse:separate}.xl\:border-transparent{border-color:transparent}.xl\:border-current{border-color:currentColor}.xl\:border-black{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.xl\:border-white{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.xl\:border-gray-100{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.xl\:border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.xl\:border-gray-300{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.xl\:border-gray-400{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.xl\:border-gray-500{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.xl\:border-gray-600{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.xl\:border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.xl\:border-gray-800{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.xl\:border-gray-900{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.xl\:border-red-100{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.xl\:border-red-200{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.xl\:border-red-300{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.xl\:border-red-400{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.xl\:border-red-500{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.xl\:border-red-600{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.xl\:border-red-700{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.xl\:border-red-800{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.xl\:border-red-900{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.xl\:border-orange-100{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.xl\:border-orange-200{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.xl\:border-orange-300{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.xl\:border-orange-400{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.xl\:border-orange-500{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.xl\:border-orange-600{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.xl\:border-orange-700{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.xl\:border-orange-800{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.xl\:border-orange-900{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.xl\:border-yellow-100{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.xl\:border-yellow-200{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.xl\:border-yellow-300{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.xl\:border-yellow-400{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.xl\:border-yellow-500{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.xl\:border-yellow-600{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.xl\:border-yellow-700{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.xl\:border-yellow-800{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.xl\:border-yellow-900{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.xl\:border-green-100{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.xl\:border-green-200{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.xl\:border-green-300{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.xl\:border-green-400{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.xl\:border-green-500{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.xl\:border-green-600{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.xl\:border-green-700{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.xl\:border-green-800{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.xl\:border-green-900{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.xl\:border-teal-100{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.xl\:border-teal-200{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.xl\:border-teal-300{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.xl\:border-teal-400{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.xl\:border-teal-500{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.xl\:border-teal-600{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.xl\:border-teal-700{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.xl\:border-teal-800{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.xl\:border-teal-900{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.xl\:border-blue-100{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.xl\:border-blue-200{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.xl\:border-blue-300{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.xl\:border-blue-400{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.xl\:border-blue-500{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.xl\:border-blue-600{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.xl\:border-blue-700{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.xl\:border-blue-800{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.xl\:border-blue-900{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.xl\:border-indigo-100{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.xl\:border-indigo-200{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.xl\:border-indigo-300{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.xl\:border-indigo-400{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.xl\:border-indigo-500{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.xl\:border-indigo-600{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.xl\:border-indigo-700{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.xl\:border-indigo-800{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.xl\:border-indigo-900{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.xl\:border-purple-100{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.xl\:border-purple-200{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.xl\:border-purple-300{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.xl\:border-purple-400{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.xl\:border-purple-500{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.xl\:border-purple-600{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.xl\:border-purple-700{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.xl\:border-purple-800{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.xl\:border-purple-900{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.xl\:border-pink-100{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.xl\:border-pink-200{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.xl\:border-pink-300{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.xl\:border-pink-400{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.xl\:border-pink-500{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.xl\:border-pink-600{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.xl\:border-pink-700{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.xl\:border-pink-800{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.xl\:border-pink-900{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.xl\:hover\:border-transparent:hover{border-color:transparent}.xl\:hover\:border-current:hover{border-color:currentColor}.xl\:hover\:border-black:hover{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.xl\:hover\:border-white:hover{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.xl\:hover\:border-gray-100:hover{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.xl\:hover\:border-gray-200:hover{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.xl\:hover\:border-gray-300:hover{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.xl\:hover\:border-gray-400:hover{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.xl\:hover\:border-gray-500:hover{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.xl\:hover\:border-gray-600:hover{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.xl\:hover\:border-gray-700:hover{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.xl\:hover\:border-gray-800:hover{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.xl\:hover\:border-gray-900:hover{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.xl\:hover\:border-red-100:hover{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.xl\:hover\:border-red-200:hover{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.xl\:hover\:border-red-300:hover{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.xl\:hover\:border-red-400:hover{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.xl\:hover\:border-red-500:hover{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.xl\:hover\:border-red-600:hover{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.xl\:hover\:border-red-700:hover{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.xl\:hover\:border-red-800:hover{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.xl\:hover\:border-red-900:hover{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.xl\:hover\:border-orange-100:hover{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.xl\:hover\:border-orange-200:hover{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.xl\:hover\:border-orange-300:hover{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.xl\:hover\:border-orange-400:hover{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.xl\:hover\:border-orange-500:hover{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.xl\:hover\:border-orange-600:hover{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.xl\:hover\:border-orange-700:hover{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.xl\:hover\:border-orange-800:hover{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.xl\:hover\:border-orange-900:hover{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.xl\:hover\:border-yellow-100:hover{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.xl\:hover\:border-yellow-200:hover{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.xl\:hover\:border-yellow-300:hover{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.xl\:hover\:border-yellow-400:hover{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.xl\:hover\:border-yellow-500:hover{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.xl\:hover\:border-yellow-600:hover{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.xl\:hover\:border-yellow-700:hover{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.xl\:hover\:border-yellow-800:hover{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.xl\:hover\:border-yellow-900:hover{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.xl\:hover\:border-green-100:hover{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.xl\:hover\:border-green-200:hover{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.xl\:hover\:border-green-300:hover{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.xl\:hover\:border-green-400:hover{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.xl\:hover\:border-green-500:hover{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.xl\:hover\:border-green-600:hover{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.xl\:hover\:border-green-700:hover{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.xl\:hover\:border-green-800:hover{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.xl\:hover\:border-green-900:hover{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.xl\:hover\:border-teal-100:hover{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.xl\:hover\:border-teal-200:hover{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.xl\:hover\:border-teal-300:hover{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.xl\:hover\:border-teal-400:hover{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.xl\:hover\:border-teal-500:hover{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.xl\:hover\:border-teal-600:hover{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.xl\:hover\:border-teal-700:hover{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.xl\:hover\:border-teal-800:hover{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.xl\:hover\:border-teal-900:hover{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.xl\:hover\:border-blue-100:hover{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.xl\:hover\:border-blue-200:hover{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.xl\:hover\:border-blue-300:hover{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.xl\:hover\:border-blue-400:hover{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.xl\:hover\:border-blue-500:hover{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.xl\:hover\:border-blue-600:hover{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.xl\:hover\:border-blue-700:hover{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.xl\:hover\:border-blue-800:hover{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.xl\:hover\:border-blue-900:hover{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.xl\:hover\:border-indigo-100:hover{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.xl\:hover\:border-indigo-200:hover{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.xl\:hover\:border-indigo-300:hover{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.xl\:hover\:border-indigo-400:hover{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.xl\:hover\:border-indigo-500:hover{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.xl\:hover\:border-indigo-600:hover{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.xl\:hover\:border-indigo-700:hover{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.xl\:hover\:border-indigo-800:hover{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.xl\:hover\:border-indigo-900:hover{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.xl\:hover\:border-purple-100:hover{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.xl\:hover\:border-purple-200:hover{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.xl\:hover\:border-purple-300:hover{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.xl\:hover\:border-purple-400:hover{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.xl\:hover\:border-purple-500:hover{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.xl\:hover\:border-purple-600:hover{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.xl\:hover\:border-purple-700:hover{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.xl\:hover\:border-purple-800:hover{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.xl\:hover\:border-purple-900:hover{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.xl\:hover\:border-pink-100:hover{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.xl\:hover\:border-pink-200:hover{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.xl\:hover\:border-pink-300:hover{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.xl\:hover\:border-pink-400:hover{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.xl\:hover\:border-pink-500:hover{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.xl\:hover\:border-pink-600:hover{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.xl\:hover\:border-pink-700:hover{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.xl\:hover\:border-pink-800:hover{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.xl\:hover\:border-pink-900:hover{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.xl\:focus\:border-transparent:focus{border-color:transparent}.xl\:focus\:border-current:focus{border-color:currentColor}.xl\:focus\:border-black:focus{--border-opacity:1;border-color:#000;border-color:rgba(0,0,0,var(--border-opacity))}.xl\:focus\:border-white:focus{--border-opacity:1;border-color:#fff;border-color:rgba(255,255,255,var(--border-opacity))}.xl\:focus\:border-gray-100:focus{--border-opacity:1;border-color:#f7fafc;border-color:rgba(247,250,252,var(--border-opacity))}.xl\:focus\:border-gray-200:focus{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.xl\:focus\:border-gray-300:focus{--border-opacity:1;border-color:#e2e8f0;border-color:rgba(226,232,240,var(--border-opacity))}.xl\:focus\:border-gray-400:focus{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.xl\:focus\:border-gray-500:focus{--border-opacity:1;border-color:#a0aec0;border-color:rgba(160,174,192,var(--border-opacity))}.xl\:focus\:border-gray-600:focus{--border-opacity:1;border-color:#718096;border-color:rgba(113,128,150,var(--border-opacity))}.xl\:focus\:border-gray-700:focus{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.xl\:focus\:border-gray-800:focus{--border-opacity:1;border-color:#2d3748;border-color:rgba(45,55,72,var(--border-opacity))}.xl\:focus\:border-gray-900:focus{--border-opacity:1;border-color:#1a202c;border-color:rgba(26,32,44,var(--border-opacity))}.xl\:focus\:border-red-100:focus{--border-opacity:1;border-color:#fff5f5;border-color:rgba(255,245,245,var(--border-opacity))}.xl\:focus\:border-red-200:focus{--border-opacity:1;border-color:#fed7d7;border-color:rgba(254,215,215,var(--border-opacity))}.xl\:focus\:border-red-300:focus{--border-opacity:1;border-color:#feb2b2;border-color:rgba(254,178,178,var(--border-opacity))}.xl\:focus\:border-red-400:focus{--border-opacity:1;border-color:#fc8181;border-color:rgba(252,129,129,var(--border-opacity))}.xl\:focus\:border-red-500:focus{--border-opacity:1;border-color:#f56565;border-color:rgba(245,101,101,var(--border-opacity))}.xl\:focus\:border-red-600:focus{--border-opacity:1;border-color:#e53e3e;border-color:rgba(229,62,62,var(--border-opacity))}.xl\:focus\:border-red-700:focus{--border-opacity:1;border-color:#c53030;border-color:rgba(197,48,48,var(--border-opacity))}.xl\:focus\:border-red-800:focus{--border-opacity:1;border-color:#9b2c2c;border-color:rgba(155,44,44,var(--border-opacity))}.xl\:focus\:border-red-900:focus{--border-opacity:1;border-color:#742a2a;border-color:rgba(116,42,42,var(--border-opacity))}.xl\:focus\:border-orange-100:focus{--border-opacity:1;border-color:#fffaf0;border-color:rgba(255,250,240,var(--border-opacity))}.xl\:focus\:border-orange-200:focus{--border-opacity:1;border-color:#feebc8;border-color:rgba(254,235,200,var(--border-opacity))}.xl\:focus\:border-orange-300:focus{--border-opacity:1;border-color:#fbd38d;border-color:rgba(251,211,141,var(--border-opacity))}.xl\:focus\:border-orange-400:focus{--border-opacity:1;border-color:#f6ad55;border-color:rgba(246,173,85,var(--border-opacity))}.xl\:focus\:border-orange-500:focus{--border-opacity:1;border-color:#ed8936;border-color:rgba(237,137,54,var(--border-opacity))}.xl\:focus\:border-orange-600:focus{--border-opacity:1;border-color:#dd6b20;border-color:rgba(221,107,32,var(--border-opacity))}.xl\:focus\:border-orange-700:focus{--border-opacity:1;border-color:#c05621;border-color:rgba(192,86,33,var(--border-opacity))}.xl\:focus\:border-orange-800:focus{--border-opacity:1;border-color:#9c4221;border-color:rgba(156,66,33,var(--border-opacity))}.xl\:focus\:border-orange-900:focus{--border-opacity:1;border-color:#7b341e;border-color:rgba(123,52,30,var(--border-opacity))}.xl\:focus\:border-yellow-100:focus{--border-opacity:1;border-color:ivory;border-color:rgba(255,255,240,var(--border-opacity))}.xl\:focus\:border-yellow-200:focus{--border-opacity:1;border-color:#fefcbf;border-color:rgba(254,252,191,var(--border-opacity))}.xl\:focus\:border-yellow-300:focus{--border-opacity:1;border-color:#faf089;border-color:rgba(250,240,137,var(--border-opacity))}.xl\:focus\:border-yellow-400:focus{--border-opacity:1;border-color:#f6e05e;border-color:rgba(246,224,94,var(--border-opacity))}.xl\:focus\:border-yellow-500:focus{--border-opacity:1;border-color:#ecc94b;border-color:rgba(236,201,75,var(--border-opacity))}.xl\:focus\:border-yellow-600:focus{--border-opacity:1;border-color:#d69e2e;border-color:rgba(214,158,46,var(--border-opacity))}.xl\:focus\:border-yellow-700:focus{--border-opacity:1;border-color:#b7791f;border-color:rgba(183,121,31,var(--border-opacity))}.xl\:focus\:border-yellow-800:focus{--border-opacity:1;border-color:#975a16;border-color:rgba(151,90,22,var(--border-opacity))}.xl\:focus\:border-yellow-900:focus{--border-opacity:1;border-color:#744210;border-color:rgba(116,66,16,var(--border-opacity))}.xl\:focus\:border-green-100:focus{--border-opacity:1;border-color:#f0fff4;border-color:rgba(240,255,244,var(--border-opacity))}.xl\:focus\:border-green-200:focus{--border-opacity:1;border-color:#c6f6d5;border-color:rgba(198,246,213,var(--border-opacity))}.xl\:focus\:border-green-300:focus{--border-opacity:1;border-color:#9ae6b4;border-color:rgba(154,230,180,var(--border-opacity))}.xl\:focus\:border-green-400:focus{--border-opacity:1;border-color:#68d391;border-color:rgba(104,211,145,var(--border-opacity))}.xl\:focus\:border-green-500:focus{--border-opacity:1;border-color:#48bb78;border-color:rgba(72,187,120,var(--border-opacity))}.xl\:focus\:border-green-600:focus{--border-opacity:1;border-color:#38a169;border-color:rgba(56,161,105,var(--border-opacity))}.xl\:focus\:border-green-700:focus{--border-opacity:1;border-color:#2f855a;border-color:rgba(47,133,90,var(--border-opacity))}.xl\:focus\:border-green-800:focus{--border-opacity:1;border-color:#276749;border-color:rgba(39,103,73,var(--border-opacity))}.xl\:focus\:border-green-900:focus{--border-opacity:1;border-color:#22543d;border-color:rgba(34,84,61,var(--border-opacity))}.xl\:focus\:border-teal-100:focus{--border-opacity:1;border-color:#e6fffa;border-color:rgba(230,255,250,var(--border-opacity))}.xl\:focus\:border-teal-200:focus{--border-opacity:1;border-color:#b2f5ea;border-color:rgba(178,245,234,var(--border-opacity))}.xl\:focus\:border-teal-300:focus{--border-opacity:1;border-color:#81e6d9;border-color:rgba(129,230,217,var(--border-opacity))}.xl\:focus\:border-teal-400:focus{--border-opacity:1;border-color:#4fd1c5;border-color:rgba(79,209,197,var(--border-opacity))}.xl\:focus\:border-teal-500:focus{--border-opacity:1;border-color:#38b2ac;border-color:rgba(56,178,172,var(--border-opacity))}.xl\:focus\:border-teal-600:focus{--border-opacity:1;border-color:#319795;border-color:rgba(49,151,149,var(--border-opacity))}.xl\:focus\:border-teal-700:focus{--border-opacity:1;border-color:#2c7a7b;border-color:rgba(44,122,123,var(--border-opacity))}.xl\:focus\:border-teal-800:focus{--border-opacity:1;border-color:#285e61;border-color:rgba(40,94,97,var(--border-opacity))}.xl\:focus\:border-teal-900:focus{--border-opacity:1;border-color:#234e52;border-color:rgba(35,78,82,var(--border-opacity))}.xl\:focus\:border-blue-100:focus{--border-opacity:1;border-color:#ebf8ff;border-color:rgba(235,248,255,var(--border-opacity))}.xl\:focus\:border-blue-200:focus{--border-opacity:1;border-color:#bee3f8;border-color:rgba(190,227,248,var(--border-opacity))}.xl\:focus\:border-blue-300:focus{--border-opacity:1;border-color:#90cdf4;border-color:rgba(144,205,244,var(--border-opacity))}.xl\:focus\:border-blue-400:focus{--border-opacity:1;border-color:#63b3ed;border-color:rgba(99,179,237,var(--border-opacity))}.xl\:focus\:border-blue-500:focus{--border-opacity:1;border-color:#4299e1;border-color:rgba(66,153,225,var(--border-opacity))}.xl\:focus\:border-blue-600:focus{--border-opacity:1;border-color:#3182ce;border-color:rgba(49,130,206,var(--border-opacity))}.xl\:focus\:border-blue-700:focus{--border-opacity:1;border-color:#2b6cb0;border-color:rgba(43,108,176,var(--border-opacity))}.xl\:focus\:border-blue-800:focus{--border-opacity:1;border-color:#2c5282;border-color:rgba(44,82,130,var(--border-opacity))}.xl\:focus\:border-blue-900:focus{--border-opacity:1;border-color:#2a4365;border-color:rgba(42,67,101,var(--border-opacity))}.xl\:focus\:border-indigo-100:focus{--border-opacity:1;border-color:#ebf4ff;border-color:rgba(235,244,255,var(--border-opacity))}.xl\:focus\:border-indigo-200:focus{--border-opacity:1;border-color:#c3dafe;border-color:rgba(195,218,254,var(--border-opacity))}.xl\:focus\:border-indigo-300:focus{--border-opacity:1;border-color:#a3bffa;border-color:rgba(163,191,250,var(--border-opacity))}.xl\:focus\:border-indigo-400:focus{--border-opacity:1;border-color:#7f9cf5;border-color:rgba(127,156,245,var(--border-opacity))}.xl\:focus\:border-indigo-500:focus{--border-opacity:1;border-color:#667eea;border-color:rgba(102,126,234,var(--border-opacity))}.xl\:focus\:border-indigo-600:focus{--border-opacity:1;border-color:#5a67d8;border-color:rgba(90,103,216,var(--border-opacity))}.xl\:focus\:border-indigo-700:focus{--border-opacity:1;border-color:#4c51bf;border-color:rgba(76,81,191,var(--border-opacity))}.xl\:focus\:border-indigo-800:focus{--border-opacity:1;border-color:#434190;border-color:rgba(67,65,144,var(--border-opacity))}.xl\:focus\:border-indigo-900:focus{--border-opacity:1;border-color:#3c366b;border-color:rgba(60,54,107,var(--border-opacity))}.xl\:focus\:border-purple-100:focus{--border-opacity:1;border-color:#faf5ff;border-color:rgba(250,245,255,var(--border-opacity))}.xl\:focus\:border-purple-200:focus{--border-opacity:1;border-color:#e9d8fd;border-color:rgba(233,216,253,var(--border-opacity))}.xl\:focus\:border-purple-300:focus{--border-opacity:1;border-color:#d6bcfa;border-color:rgba(214,188,250,var(--border-opacity))}.xl\:focus\:border-purple-400:focus{--border-opacity:1;border-color:#b794f4;border-color:rgba(183,148,244,var(--border-opacity))}.xl\:focus\:border-purple-500:focus{--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.xl\:focus\:border-purple-600:focus{--border-opacity:1;border-color:#805ad5;border-color:rgba(128,90,213,var(--border-opacity))}.xl\:focus\:border-purple-700:focus{--border-opacity:1;border-color:#6b46c1;border-color:rgba(107,70,193,var(--border-opacity))}.xl\:focus\:border-purple-800:focus{--border-opacity:1;border-color:#553c9a;border-color:rgba(85,60,154,var(--border-opacity))}.xl\:focus\:border-purple-900:focus{--border-opacity:1;border-color:#44337a;border-color:rgba(68,51,122,var(--border-opacity))}.xl\:focus\:border-pink-100:focus{--border-opacity:1;border-color:#fff5f7;border-color:rgba(255,245,247,var(--border-opacity))}.xl\:focus\:border-pink-200:focus{--border-opacity:1;border-color:#fed7e2;border-color:rgba(254,215,226,var(--border-opacity))}.xl\:focus\:border-pink-300:focus{--border-opacity:1;border-color:#fbb6ce;border-color:rgba(251,182,206,var(--border-opacity))}.xl\:focus\:border-pink-400:focus{--border-opacity:1;border-color:#f687b3;border-color:rgba(246,135,179,var(--border-opacity))}.xl\:focus\:border-pink-500:focus{--border-opacity:1;border-color:#ed64a6;border-color:rgba(237,100,166,var(--border-opacity))}.xl\:focus\:border-pink-600:focus{--border-opacity:1;border-color:#d53f8c;border-color:rgba(213,63,140,var(--border-opacity))}.xl\:focus\:border-pink-700:focus{--border-opacity:1;border-color:#b83280;border-color:rgba(184,50,128,var(--border-opacity))}.xl\:focus\:border-pink-800:focus{--border-opacity:1;border-color:#97266d;border-color:rgba(151,38,109,var(--border-opacity))}.xl\:focus\:border-pink-900:focus{--border-opacity:1;border-color:#702459;border-color:rgba(112,36,89,var(--border-opacity))}.xl\:border-opacity-0{--border-opacity:0}.xl\:border-opacity-25{--border-opacity:0.25}.xl\:border-opacity-50{--border-opacity:0.5}.xl\:border-opacity-75{--border-opacity:0.75}.xl\:border-opacity-100{--border-opacity:1}.xl\:hover\:border-opacity-0:hover{--border-opacity:0}.xl\:hover\:border-opacity-25:hover{--border-opacity:0.25}.xl\:hover\:border-opacity-50:hover{--border-opacity:0.5}.xl\:hover\:border-opacity-75:hover{--border-opacity:0.75}.xl\:hover\:border-opacity-100:hover{--border-opacity:1}.xl\:focus\:border-opacity-0:focus{--border-opacity:0}.xl\:focus\:border-opacity-25:focus{--border-opacity:0.25}.xl\:focus\:border-opacity-50:focus{--border-opacity:0.5}.xl\:focus\:border-opacity-75:focus{--border-opacity:0.75}.xl\:focus\:border-opacity-100:focus{--border-opacity:1}.xl\:rounded-none{border-radius:0}.xl\:rounded-sm{border-radius:.125rem}.xl\:rounded{border-radius:.25rem}.xl\:rounded-md{border-radius:.375rem}.xl\:rounded-lg{border-radius:.5rem}.xl\:rounded-xl{border-radius:.75rem}.xl\:rounded-2xl{border-radius:1rem}.xl\:rounded-3xl{border-radius:1.5rem}.xl\:rounded-full{border-radius:9999px}.xl\:rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.xl\:rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.xl\:rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.xl\:rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.xl\:rounded-t-sm{border-top-left-radius:.125rem;border-top-right-radius:.125rem}.xl\:rounded-r-sm{border-top-right-radius:.125rem;border-bottom-right-radius:.125rem}.xl\:rounded-b-sm{border-bottom-right-radius:.125rem;border-bottom-left-radius:.125rem}.xl\:rounded-l-sm{border-top-left-radius:.125rem;border-bottom-left-radius:.125rem}.xl\:rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.xl\:rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.xl\:rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.xl\:rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.xl\:rounded-t-md{border-top-left-radius:.375rem;border-top-right-radius:.375rem}.xl\:rounded-r-md{border-top-right-radius:.375rem;border-bottom-right-radius:.375rem}.xl\:rounded-b-md{border-bottom-right-radius:.375rem;border-bottom-left-radius:.375rem}.xl\:rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.xl\:rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.xl\:rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.xl\:rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.xl\:rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.xl\:rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.xl\:rounded-r-xl{border-top-right-radius:.75rem;border-bottom-right-radius:.75rem}.xl\:rounded-b-xl{border-bottom-right-radius:.75rem;border-bottom-left-radius:.75rem}.xl\:rounded-l-xl{border-top-left-radius:.75rem;border-bottom-left-radius:.75rem}.xl\:rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.xl\:rounded-r-2xl{border-top-right-radius:1rem;border-bottom-right-radius:1rem}.xl\:rounded-b-2xl{border-bottom-right-radius:1rem;border-bottom-left-radius:1rem}.xl\:rounded-l-2xl{border-top-left-radius:1rem;border-bottom-left-radius:1rem}.xl\:rounded-t-3xl{border-top-left-radius:1.5rem;border-top-right-radius:1.5rem}.xl\:rounded-r-3xl{border-top-right-radius:1.5rem;border-bottom-right-radius:1.5rem}.xl\:rounded-b-3xl{border-bottom-right-radius:1.5rem;border-bottom-left-radius:1.5rem}.xl\:rounded-l-3xl{border-top-left-radius:1.5rem;border-bottom-left-radius:1.5rem}.xl\:rounded-t-full{border-top-left-radius:9999px;border-top-right-radius:9999px}.xl\:rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.xl\:rounded-b-full{border-bottom-right-radius:9999px;border-bottom-left-radius:9999px}.xl\:rounded-l-full{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.xl\:rounded-tl-none{border-top-left-radius:0}.xl\:rounded-tr-none{border-top-right-radius:0}.xl\:rounded-br-none{border-bottom-right-radius:0}.xl\:rounded-bl-none{border-bottom-left-radius:0}.xl\:rounded-tl-sm{border-top-left-radius:.125rem}.xl\:rounded-tr-sm{border-top-right-radius:.125rem}.xl\:rounded-br-sm{border-bottom-right-radius:.125rem}.xl\:rounded-bl-sm{border-bottom-left-radius:.125rem}.xl\:rounded-tl{border-top-left-radius:.25rem}.xl\:rounded-tr{border-top-right-radius:.25rem}.xl\:rounded-br{border-bottom-right-radius:.25rem}.xl\:rounded-bl{border-bottom-left-radius:.25rem}.xl\:rounded-tl-md{border-top-left-radius:.375rem}.xl\:rounded-tr-md{border-top-right-radius:.375rem}.xl\:rounded-br-md{border-bottom-right-radius:.375rem}.xl\:rounded-bl-md{border-bottom-left-radius:.375rem}.xl\:rounded-tl-lg{border-top-left-radius:.5rem}.xl\:rounded-tr-lg{border-top-right-radius:.5rem}.xl\:rounded-br-lg{border-bottom-right-radius:.5rem}.xl\:rounded-bl-lg{border-bottom-left-radius:.5rem}.xl\:rounded-tl-xl{border-top-left-radius:.75rem}.xl\:rounded-tr-xl{border-top-right-radius:.75rem}.xl\:rounded-br-xl{border-bottom-right-radius:.75rem}.xl\:rounded-bl-xl{border-bottom-left-radius:.75rem}.xl\:rounded-tl-2xl{border-top-left-radius:1rem}.xl\:rounded-tr-2xl{border-top-right-radius:1rem}.xl\:rounded-br-2xl{border-bottom-right-radius:1rem}.xl\:rounded-bl-2xl{border-bottom-left-radius:1rem}.xl\:rounded-tl-3xl{border-top-left-radius:1.5rem}.xl\:rounded-tr-3xl{border-top-right-radius:1.5rem}.xl\:rounded-br-3xl{border-bottom-right-radius:1.5rem}.xl\:rounded-bl-3xl{border-bottom-left-radius:1.5rem}.xl\:rounded-tl-full{border-top-left-radius:9999px}.xl\:rounded-tr-full{border-top-right-radius:9999px}.xl\:rounded-br-full{border-bottom-right-radius:9999px}.xl\:rounded-bl-full{border-bottom-left-radius:9999px}.xl\:border-solid{border-style:solid}.xl\:border-dashed{border-style:dashed}.xl\:border-dotted{border-style:dotted}.xl\:border-double{border-style:double}.xl\:border-none{border-style:none}.xl\:border-0{border-width:0}.xl\:border-2{border-width:2px}.xl\:border-4{border-width:4px}.xl\:border-8{border-width:8px}.xl\:border{border-width:1px}.xl\:border-t-0{border-top-width:0}.xl\:border-r-0{border-right-width:0}.xl\:border-b-0{border-bottom-width:0}.xl\:border-l-0{border-left-width:0}.xl\:border-t-2{border-top-width:2px}.xl\:border-r-2{border-right-width:2px}.xl\:border-b-2{border-bottom-width:2px}.xl\:border-l-2{border-left-width:2px}.xl\:border-t-4{border-top-width:4px}.xl\:border-r-4{border-right-width:4px}.xl\:border-b-4{border-bottom-width:4px}.xl\:border-l-4{border-left-width:4px}.xl\:border-t-8{border-top-width:8px}.xl\:border-r-8{border-right-width:8px}.xl\:border-b-8{border-bottom-width:8px}.xl\:border-l-8{border-left-width:8px}.xl\:border-t{border-top-width:1px}.xl\:border-r{border-right-width:1px}.xl\:border-b{border-bottom-width:1px}.xl\:border-l{border-left-width:1px}.xl\:box-border{box-sizing:border-box}.xl\:box-content{box-sizing:content-box}.xl\:cursor-auto{cursor:auto}.xl\:cursor-default{cursor:default}.xl\:cursor-pointer{cursor:pointer}.xl\:cursor-wait{cursor:wait}.xl\:cursor-text{cursor:text}.xl\:cursor-move{cursor:move}.xl\:cursor-not-allowed{cursor:not-allowed}.xl\:block{display:block}.xl\:inline-block{display:inline-block}.xl\:inline{display:inline}.xl\:flex{display:flex}.xl\:inline-flex{display:inline-flex}.xl\:table{display:table}.xl\:table-caption{display:table-caption}.xl\:table-cell{display:table-cell}.xl\:table-column{display:table-column}.xl\:table-column-group{display:table-column-group}.xl\:table-footer-group{display:table-footer-group}.xl\:table-header-group{display:table-header-group}.xl\:table-row-group{display:table-row-group}.xl\:table-row{display:table-row}.xl\:flow-root{display:flow-root}.xl\:grid{display:grid}.xl\:inline-grid{display:inline-grid}.xl\:contents{display:contents}.xl\:hidden{display:none}.xl\:flex-row{flex-direction:row}.xl\:flex-row-reverse{flex-direction:row-reverse}.xl\:flex-col{flex-direction:column}.xl\:flex-col-reverse{flex-direction:column-reverse}.xl\:flex-wrap{flex-wrap:wrap}.xl\:flex-wrap-reverse{flex-wrap:wrap-reverse}.xl\:flex-no-wrap{flex-wrap:nowrap}.xl\:place-items-auto{place-items:auto}.xl\:place-items-start{place-items:start}.xl\:place-items-end{place-items:end}.xl\:place-items-center{place-items:center}.xl\:place-items-stretch{place-items:stretch}.xl\:place-content-center{place-content:center}.xl\:place-content-start{place-content:start}.xl\:place-content-end{place-content:end}.xl\:place-content-between{place-content:space-between}.xl\:place-content-around{place-content:space-around}.xl\:place-content-evenly{place-content:space-evenly}.xl\:place-content-stretch{place-content:stretch}.xl\:place-self-auto{place-self:auto}.xl\:place-self-start{place-self:start}.xl\:place-self-end{place-self:end}.xl\:place-self-center{place-self:center}.xl\:place-self-stretch{place-self:stretch}.xl\:items-start{align-items:flex-start}.xl\:items-end{align-items:flex-end}.xl\:items-center{align-items:center}.xl\:items-baseline{align-items:baseline}.xl\:items-stretch{align-items:stretch}.xl\:content-center{align-content:center}.xl\:content-start{align-content:flex-start}.xl\:content-end{align-content:flex-end}.xl\:content-between{align-content:space-between}.xl\:content-around{align-content:space-around}.xl\:content-evenly{align-content:space-evenly}.xl\:self-auto{align-self:auto}.xl\:self-start{align-self:flex-start}.xl\:self-end{align-self:flex-end}.xl\:self-center{align-self:center}.xl\:self-stretch{align-self:stretch}.xl\:justify-items-auto{justify-items:auto}.xl\:justify-items-start{justify-items:start}.xl\:justify-items-end{justify-items:end}.xl\:justify-items-center{justify-items:center}.xl\:justify-items-stretch{justify-items:stretch}.xl\:justify-start{justify-content:flex-start}.xl\:justify-end{justify-content:flex-end}.xl\:justify-center{justify-content:center}.xl\:justify-between{justify-content:space-between}.xl\:justify-around{justify-content:space-around}.xl\:justify-evenly{justify-content:space-evenly}.xl\:justify-self-auto{justify-self:auto}.xl\:justify-self-start{justify-self:start}.xl\:justify-self-end{justify-self:end}.xl\:justify-self-center{justify-self:center}.xl\:justify-self-stretch{justify-self:stretch}.xl\:flex-1{flex:1 1 0%}.xl\:flex-auto{flex:1 1 auto}.xl\:flex-initial{flex:0 1 auto}.xl\:flex-none{flex:none}.xl\:flex-grow-0{flex-grow:0}.xl\:flex-grow{flex-grow:1}.xl\:flex-shrink-0{flex-shrink:0}.xl\:flex-shrink{flex-shrink:1}.xl\:order-1{order:1}.xl\:order-2{order:2}.xl\:order-3{order:3}.xl\:order-4{order:4}.xl\:order-5{order:5}.xl\:order-6{order:6}.xl\:order-7{order:7}.xl\:order-8{order:8}.xl\:order-9{order:9}.xl\:order-10{order:10}.xl\:order-11{order:11}.xl\:order-12{order:12}.xl\:order-first{order:-9999}.xl\:order-last{order:9999}.xl\:order-none{order:0}.xl\:float-right{float:right}.xl\:float-left{float:left}.xl\:float-none{float:none}.xl\:clearfix:after{content:"";display:table;clear:both}.xl\:clear-left{clear:left}.xl\:clear-right{clear:right}.xl\:clear-both{clear:both}.xl\:clear-none{clear:none}.xl\:font-sans{font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.xl\:font-serif{font-family:Georgia,Cambria,"Times New Roman",Times,serif}.xl\:font-mono{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}.xl\:font-hairline{font-weight:100}.xl\:font-thin{font-weight:200}.xl\:font-light{font-weight:300}.xl\:font-normal{font-weight:400}.xl\:font-medium{font-weight:500}.xl\:font-semibold{font-weight:600}.xl\:font-bold{font-weight:700}.xl\:font-extrabold{font-weight:800}.xl\:font-black{font-weight:900}.xl\:hover\:font-hairline:hover{font-weight:100}.xl\:hover\:font-thin:hover{font-weight:200}.xl\:hover\:font-light:hover{font-weight:300}.xl\:hover\:font-normal:hover{font-weight:400}.xl\:hover\:font-medium:hover{font-weight:500}.xl\:hover\:font-semibold:hover{font-weight:600}.xl\:hover\:font-bold:hover{font-weight:700}.xl\:hover\:font-extrabold:hover{font-weight:800}.xl\:hover\:font-black:hover{font-weight:900}.xl\:focus\:font-hairline:focus{font-weight:100}.xl\:focus\:font-thin:focus{font-weight:200}.xl\:focus\:font-light:focus{font-weight:300}.xl\:focus\:font-normal:focus{font-weight:400}.xl\:focus\:font-medium:focus{font-weight:500}.xl\:focus\:font-semibold:focus{font-weight:600}.xl\:focus\:font-bold:focus{font-weight:700}.xl\:focus\:font-extrabold:focus{font-weight:800}.xl\:focus\:font-black:focus{font-weight:900}.xl\:h-0{height:0}.xl\:h-1{height:.25rem}.xl\:h-2{height:.5rem}.xl\:h-3{height:.75rem}.xl\:h-4{height:1rem}.xl\:h-5{height:1.25rem}.xl\:h-6{height:1.5rem}.xl\:h-8{height:2rem}.xl\:h-10{height:2.5rem}.xl\:h-12{height:3rem}.xl\:h-16{height:4rem}.xl\:h-20{height:5rem}.xl\:h-24{height:6rem}.xl\:h-32{height:8rem}.xl\:h-40{height:10rem}.xl\:h-48{height:12rem}.xl\:h-56{height:14rem}.xl\:h-64{height:16rem}.xl\:h-auto{height:auto}.xl\:h-px{height:1px}.xl\:h-full{height:100%}.xl\:h-screen{height:100vh}.xl\:text-xs{font-size:.75rem}.xl\:text-sm{font-size:.875rem}.xl\:text-base{font-size:1rem}.xl\:text-lg{font-size:1.125rem}.xl\:text-xl{font-size:1.25rem}.xl\:text-2xl{font-size:1.5rem}.xl\:text-3xl{font-size:1.875rem}.xl\:text-4xl{font-size:2.25rem}.xl\:text-5xl{font-size:3rem}.xl\:text-6xl{font-size:4rem}.xl\:leading-3{line-height:.75rem}.xl\:leading-4{line-height:1rem}.xl\:leading-5{line-height:1.25rem}.xl\:leading-6{line-height:1.5rem}.xl\:leading-7{line-height:1.75rem}.xl\:leading-8{line-height:2rem}.xl\:leading-9{line-height:2.25rem}.xl\:leading-10{line-height:2.5rem}.xl\:leading-none{line-height:1}.xl\:leading-tight{line-height:1.25}.xl\:leading-snug{line-height:1.375}.xl\:leading-normal{line-height:1.5}.xl\:leading-relaxed{line-height:1.625}.xl\:leading-loose{line-height:2}.xl\:list-inside{list-style-position:inside}.xl\:list-outside{list-style-position:outside}.xl\:list-none{list-style-type:none}.xl\:list-disc{list-style-type:disc}.xl\:list-decimal{list-style-type:decimal}.xl\:m-0{margin:0}.xl\:m-1{margin:.25rem}.xl\:m-2{margin:.5rem}.xl\:m-3{margin:.75rem}.xl\:m-4{margin:1rem}.xl\:m-5{margin:1.25rem}.xl\:m-6{margin:1.5rem}.xl\:m-8{margin:2rem}.xl\:m-10{margin:2.5rem}.xl\:m-12{margin:3rem}.xl\:m-16{margin:4rem}.xl\:m-20{margin:5rem}.xl\:m-24{margin:6rem}.xl\:m-32{margin:8rem}.xl\:m-40{margin:10rem}.xl\:m-48{margin:12rem}.xl\:m-56{margin:14rem}.xl\:m-64{margin:16rem}.xl\:m-auto{margin:auto}.xl\:m-px{margin:1px}.xl\:-m-1{margin:-.25rem}.xl\:-m-2{margin:-.5rem}.xl\:-m-3{margin:-.75rem}.xl\:-m-4{margin:-1rem}.xl\:-m-5{margin:-1.25rem}.xl\:-m-6{margin:-1.5rem}.xl\:-m-8{margin:-2rem}.xl\:-m-10{margin:-2.5rem}.xl\:-m-12{margin:-3rem}.xl\:-m-16{margin:-4rem}.xl\:-m-20{margin:-5rem}.xl\:-m-24{margin:-6rem}.xl\:-m-32{margin:-8rem}.xl\:-m-40{margin:-10rem}.xl\:-m-48{margin:-12rem}.xl\:-m-56{margin:-14rem}.xl\:-m-64{margin:-16rem}.xl\:-m-px{margin:-1px}.xl\:my-0{margin-top:0;margin-bottom:0}.xl\:mx-0{margin-left:0;margin-right:0}.xl\:my-1{margin-top:.25rem;margin-bottom:.25rem}.xl\:mx-1{margin-left:.25rem;margin-right:.25rem}.xl\:my-2{margin-top:.5rem;margin-bottom:.5rem}.xl\:mx-2{margin-left:.5rem;margin-right:.5rem}.xl\:my-3{margin-top:.75rem;margin-bottom:.75rem}.xl\:mx-3{margin-left:.75rem;margin-right:.75rem}.xl\:my-4{margin-top:1rem;margin-bottom:1rem}.xl\:mx-4{margin-left:1rem;margin-right:1rem}.xl\:my-5{margin-top:1.25rem;margin-bottom:1.25rem}.xl\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.xl\:my-6{margin-top:1.5rem;margin-bottom:1.5rem}.xl\:mx-6{margin-left:1.5rem;margin-right:1.5rem}.xl\:my-8{margin-top:2rem;margin-bottom:2rem}.xl\:mx-8{margin-left:2rem;margin-right:2rem}.xl\:my-10{margin-top:2.5rem;margin-bottom:2.5rem}.xl\:mx-10{margin-left:2.5rem;margin-right:2.5rem}.xl\:my-12{margin-top:3rem;margin-bottom:3rem}.xl\:mx-12{margin-left:3rem;margin-right:3rem}.xl\:my-16{margin-top:4rem;margin-bottom:4rem}.xl\:mx-16{margin-left:4rem;margin-right:4rem}.xl\:my-20{margin-top:5rem;margin-bottom:5rem}.xl\:mx-20{margin-left:5rem;margin-right:5rem}.xl\:my-24{margin-top:6rem;margin-bottom:6rem}.xl\:mx-24{margin-left:6rem;margin-right:6rem}.xl\:my-32{margin-top:8rem;margin-bottom:8rem}.xl\:mx-32{margin-left:8rem;margin-right:8rem}.xl\:my-40{margin-top:10rem;margin-bottom:10rem}.xl\:mx-40{margin-left:10rem;margin-right:10rem}.xl\:my-48{margin-top:12rem;margin-bottom:12rem}.xl\:mx-48{margin-left:12rem;margin-right:12rem}.xl\:my-56{margin-top:14rem;margin-bottom:14rem}.xl\:mx-56{margin-left:14rem;margin-right:14rem}.xl\:my-64{margin-top:16rem;margin-bottom:16rem}.xl\:mx-64{margin-left:16rem;margin-right:16rem}.xl\:my-auto{margin-top:auto;margin-bottom:auto}.xl\:mx-auto{margin-left:auto;margin-right:auto}.xl\:my-px{margin-top:1px;margin-bottom:1px}.xl\:mx-px{margin-left:1px;margin-right:1px}.xl\:-my-1{margin-top:-.25rem;margin-bottom:-.25rem}.xl\:-mx-1{margin-left:-.25rem;margin-right:-.25rem}.xl\:-my-2{margin-top:-.5rem;margin-bottom:-.5rem}.xl\:-mx-2{margin-left:-.5rem;margin-right:-.5rem}.xl\:-my-3{margin-top:-.75rem;margin-bottom:-.75rem}.xl\:-mx-3{margin-left:-.75rem;margin-right:-.75rem}.xl\:-my-4{margin-top:-1rem;margin-bottom:-1rem}.xl\:-mx-4{margin-left:-1rem;margin-right:-1rem}.xl\:-my-5{margin-top:-1.25rem;margin-bottom:-1.25rem}.xl\:-mx-5{margin-left:-1.25rem;margin-right:-1.25rem}.xl\:-my-6{margin-top:-1.5rem;margin-bottom:-1.5rem}.xl\:-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.xl\:-my-8{margin-top:-2rem;margin-bottom:-2rem}.xl\:-mx-8{margin-left:-2rem;margin-right:-2rem}.xl\:-my-10{margin-top:-2.5rem;margin-bottom:-2.5rem}.xl\:-mx-10{margin-left:-2.5rem;margin-right:-2.5rem}.xl\:-my-12{margin-top:-3rem;margin-bottom:-3rem}.xl\:-mx-12{margin-left:-3rem;margin-right:-3rem}.xl\:-my-16{margin-top:-4rem;margin-bottom:-4rem}.xl\:-mx-16{margin-left:-4rem;margin-right:-4rem}.xl\:-my-20{margin-top:-5rem;margin-bottom:-5rem}.xl\:-mx-20{margin-left:-5rem;margin-right:-5rem}.xl\:-my-24{margin-top:-6rem;margin-bottom:-6rem}.xl\:-mx-24{margin-left:-6rem;margin-right:-6rem}.xl\:-my-32{margin-top:-8rem;margin-bottom:-8rem}.xl\:-mx-32{margin-left:-8rem;margin-right:-8rem}.xl\:-my-40{margin-top:-10rem;margin-bottom:-10rem}.xl\:-mx-40{margin-left:-10rem;margin-right:-10rem}.xl\:-my-48{margin-top:-12rem;margin-bottom:-12rem}.xl\:-mx-48{margin-left:-12rem;margin-right:-12rem}.xl\:-my-56{margin-top:-14rem;margin-bottom:-14rem}.xl\:-mx-56{margin-left:-14rem;margin-right:-14rem}.xl\:-my-64{margin-top:-16rem;margin-bottom:-16rem}.xl\:-mx-64{margin-left:-16rem;margin-right:-16rem}.xl\:-my-px{margin-top:-1px;margin-bottom:-1px}.xl\:-mx-px{margin-left:-1px;margin-right:-1px}.xl\:mt-0{margin-top:0}.xl\:mr-0{margin-right:0}.xl\:mb-0{margin-bottom:0}.xl\:ml-0{margin-left:0}.xl\:mt-1{margin-top:.25rem}.xl\:mr-1{margin-right:.25rem}.xl\:mb-1{margin-bottom:.25rem}.xl\:ml-1{margin-left:.25rem}.xl\:mt-2{margin-top:.5rem}.xl\:mr-2{margin-right:.5rem}.xl\:mb-2{margin-bottom:.5rem}.xl\:ml-2{margin-left:.5rem}.xl\:mt-3{margin-top:.75rem}.xl\:mr-3{margin-right:.75rem}.xl\:mb-3{margin-bottom:.75rem}.xl\:ml-3{margin-left:.75rem}.xl\:mt-4{margin-top:1rem}.xl\:mr-4{margin-right:1rem}.xl\:mb-4{margin-bottom:1rem}.xl\:ml-4{margin-left:1rem}.xl\:mt-5{margin-top:1.25rem}.xl\:mr-5{margin-right:1.25rem}.xl\:mb-5{margin-bottom:1.25rem}.xl\:ml-5{margin-left:1.25rem}.xl\:mt-6{margin-top:1.5rem}.xl\:mr-6{margin-right:1.5rem}.xl\:mb-6{margin-bottom:1.5rem}.xl\:ml-6{margin-left:1.5rem}.xl\:mt-8{margin-top:2rem}.xl\:mr-8{margin-right:2rem}.xl\:mb-8{margin-bottom:2rem}.xl\:ml-8{margin-left:2rem}.xl\:mt-10{margin-top:2.5rem}.xl\:mr-10{margin-right:2.5rem}.xl\:mb-10{margin-bottom:2.5rem}.xl\:ml-10{margin-left:2.5rem}.xl\:mt-12{margin-top:3rem}.xl\:mr-12{margin-right:3rem}.xl\:mb-12{margin-bottom:3rem}.xl\:ml-12{margin-left:3rem}.xl\:mt-16{margin-top:4rem}.xl\:mr-16{margin-right:4rem}.xl\:mb-16{margin-bottom:4rem}.xl\:ml-16{margin-left:4rem}.xl\:mt-20{margin-top:5rem}.xl\:mr-20{margin-right:5rem}.xl\:mb-20{margin-bottom:5rem}.xl\:ml-20{margin-left:5rem}.xl\:mt-24{margin-top:6rem}.xl\:mr-24{margin-right:6rem}.xl\:mb-24{margin-bottom:6rem}.xl\:ml-24{margin-left:6rem}.xl\:mt-32{margin-top:8rem}.xl\:mr-32{margin-right:8rem}.xl\:mb-32{margin-bottom:8rem}.xl\:ml-32{margin-left:8rem}.xl\:mt-40{margin-top:10rem}.xl\:mr-40{margin-right:10rem}.xl\:mb-40{margin-bottom:10rem}.xl\:ml-40{margin-left:10rem}.xl\:mt-48{margin-top:12rem}.xl\:mr-48{margin-right:12rem}.xl\:mb-48{margin-bottom:12rem}.xl\:ml-48{margin-left:12rem}.xl\:mt-56{margin-top:14rem}.xl\:mr-56{margin-right:14rem}.xl\:mb-56{margin-bottom:14rem}.xl\:ml-56{margin-left:14rem}.xl\:mt-64{margin-top:16rem}.xl\:mr-64{margin-right:16rem}.xl\:mb-64{margin-bottom:16rem}.xl\:ml-64{margin-left:16rem}.xl\:mt-auto{margin-top:auto}.xl\:mr-auto{margin-right:auto}.xl\:mb-auto{margin-bottom:auto}.xl\:ml-auto{margin-left:auto}.xl\:mt-px{margin-top:1px}.xl\:mr-px{margin-right:1px}.xl\:mb-px{margin-bottom:1px}.xl\:ml-px{margin-left:1px}.xl\:-mt-1{margin-top:-.25rem}.xl\:-mr-1{margin-right:-.25rem}.xl\:-mb-1{margin-bottom:-.25rem}.xl\:-ml-1{margin-left:-.25rem}.xl\:-mt-2{margin-top:-.5rem}.xl\:-mr-2{margin-right:-.5rem}.xl\:-mb-2{margin-bottom:-.5rem}.xl\:-ml-2{margin-left:-.5rem}.xl\:-mt-3{margin-top:-.75rem}.xl\:-mr-3{margin-right:-.75rem}.xl\:-mb-3{margin-bottom:-.75rem}.xl\:-ml-3{margin-left:-.75rem}.xl\:-mt-4{margin-top:-1rem}.xl\:-mr-4{margin-right:-1rem}.xl\:-mb-4{margin-bottom:-1rem}.xl\:-ml-4{margin-left:-1rem}.xl\:-mt-5{margin-top:-1.25rem}.xl\:-mr-5{margin-right:-1.25rem}.xl\:-mb-5{margin-bottom:-1.25rem}.xl\:-ml-5{margin-left:-1.25rem}.xl\:-mt-6{margin-top:-1.5rem}.xl\:-mr-6{margin-right:-1.5rem}.xl\:-mb-6{margin-bottom:-1.5rem}.xl\:-ml-6{margin-left:-1.5rem}.xl\:-mt-8{margin-top:-2rem}.xl\:-mr-8{margin-right:-2rem}.xl\:-mb-8{margin-bottom:-2rem}.xl\:-ml-8{margin-left:-2rem}.xl\:-mt-10{margin-top:-2.5rem}.xl\:-mr-10{margin-right:-2.5rem}.xl\:-mb-10{margin-bottom:-2.5rem}.xl\:-ml-10{margin-left:-2.5rem}.xl\:-mt-12{margin-top:-3rem}.xl\:-mr-12{margin-right:-3rem}.xl\:-mb-12{margin-bottom:-3rem}.xl\:-ml-12{margin-left:-3rem}.xl\:-mt-16{margin-top:-4rem}.xl\:-mr-16{margin-right:-4rem}.xl\:-mb-16{margin-bottom:-4rem}.xl\:-ml-16{margin-left:-4rem}.xl\:-mt-20{margin-top:-5rem}.xl\:-mr-20{margin-right:-5rem}.xl\:-mb-20{margin-bottom:-5rem}.xl\:-ml-20{margin-left:-5rem}.xl\:-mt-24{margin-top:-6rem}.xl\:-mr-24{margin-right:-6rem}.xl\:-mb-24{margin-bottom:-6rem}.xl\:-ml-24{margin-left:-6rem}.xl\:-mt-32{margin-top:-8rem}.xl\:-mr-32{margin-right:-8rem}.xl\:-mb-32{margin-bottom:-8rem}.xl\:-ml-32{margin-left:-8rem}.xl\:-mt-40{margin-top:-10rem}.xl\:-mr-40{margin-right:-10rem}.xl\:-mb-40{margin-bottom:-10rem}.xl\:-ml-40{margin-left:-10rem}.xl\:-mt-48{margin-top:-12rem}.xl\:-mr-48{margin-right:-12rem}.xl\:-mb-48{margin-bottom:-12rem}.xl\:-ml-48{margin-left:-12rem}.xl\:-mt-56{margin-top:-14rem}.xl\:-mr-56{margin-right:-14rem}.xl\:-mb-56{margin-bottom:-14rem}.xl\:-ml-56{margin-left:-14rem}.xl\:-mt-64{margin-top:-16rem}.xl\:-mr-64{margin-right:-16rem}.xl\:-mb-64{margin-bottom:-16rem}.xl\:-ml-64{margin-left:-16rem}.xl\:-mt-px{margin-top:-1px}.xl\:-mr-px{margin-right:-1px}.xl\:-mb-px{margin-bottom:-1px}.xl\:-ml-px{margin-left:-1px}.xl\:max-h-full{max-height:100%}.xl\:max-h-screen{max-height:100vh}.xl\:max-w-none{max-width:none}.xl\:max-w-xs{max-width:20rem}.xl\:max-w-sm{max-width:24rem}.xl\:max-w-md{max-width:28rem}.xl\:max-w-lg{max-width:32rem}.xl\:max-w-xl{max-width:36rem}.xl\:max-w-2xl{max-width:42rem}.xl\:max-w-3xl{max-width:48rem}.xl\:max-w-4xl{max-width:56rem}.xl\:max-w-5xl{max-width:64rem}.xl\:max-w-6xl{max-width:72rem}.xl\:max-w-full{max-width:100%}.xl\:max-w-screen-sm{max-width:640px}.xl\:max-w-screen-md{max-width:768px}.xl\:max-w-screen-lg{max-width:1024px}.xl\:max-w-screen-xl{max-width:1280px}.xl\:min-h-0{min-height:0}.xl\:min-h-full{min-height:100%}.xl\:min-h-screen{min-height:100vh}.xl\:min-w-0{min-width:0}.xl\:min-w-full{min-width:100%}.xl\:object-contain{object-fit:contain}.xl\:object-cover{object-fit:cover}.xl\:object-fill{object-fit:fill}.xl\:object-none{object-fit:none}.xl\:object-scale-down{object-fit:scale-down}.xl\:object-bottom{object-position:bottom}.xl\:object-center{object-position:center}.xl\:object-left{object-position:left}.xl\:object-left-bottom{object-position:left bottom}.xl\:object-left-top{object-position:left top}.xl\:object-right{object-position:right}.xl\:object-right-bottom{object-position:right bottom}.xl\:object-right-top{object-position:right top}.xl\:object-top{object-position:top}.xl\:opacity-0{opacity:0}.xl\:opacity-25{opacity:.25}.xl\:opacity-50{opacity:.5}.xl\:opacity-75{opacity:.75}.xl\:opacity-100{opacity:1}.xl\:hover\:opacity-0:hover{opacity:0}.xl\:hover\:opacity-25:hover{opacity:.25}.xl\:hover\:opacity-50:hover{opacity:.5}.xl\:hover\:opacity-75:hover{opacity:.75}.xl\:hover\:opacity-100:hover{opacity:1}.xl\:focus\:opacity-0:focus{opacity:0}.xl\:focus\:opacity-25:focus{opacity:.25}.xl\:focus\:opacity-50:focus{opacity:.5}.xl\:focus\:opacity-75:focus{opacity:.75}.xl\:focus\:opacity-100:focus{opacity:1}.xl\:outline-none{outline:2px solid transparent;outline-offset:2px}.xl\:outline-white{outline:2px dotted #fff;outline-offset:2px}.xl\:outline-black{outline:2px dotted #000;outline-offset:2px}.xl\:focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.xl\:focus\:outline-white:focus{outline:2px dotted #fff;outline-offset:2px}.xl\:focus\:outline-black:focus{outline:2px dotted #000;outline-offset:2px}.xl\:overflow-auto{overflow:auto}.xl\:overflow-hidden{overflow:hidden}.xl\:overflow-visible{overflow:visible}.xl\:overflow-scroll{overflow:scroll}.xl\:overflow-x-auto{overflow-x:auto}.xl\:overflow-y-auto{overflow-y:auto}.xl\:overflow-x-hidden{overflow-x:hidden}.xl\:overflow-y-hidden{overflow-y:hidden}.xl\:overflow-x-visible{overflow-x:visible}.xl\:overflow-y-visible{overflow-y:visible}.xl\:overflow-x-scroll{overflow-x:scroll}.xl\:overflow-y-scroll{overflow-y:scroll}.xl\:scrolling-touch{-webkit-overflow-scrolling:touch}.xl\:scrolling-auto{-webkit-overflow-scrolling:auto}.xl\:overscroll-auto{-ms-scroll-chaining:chained;overscroll-behavior:auto}.xl\:overscroll-contain{-ms-scroll-chaining:none;overscroll-behavior:contain}.xl\:overscroll-none{-ms-scroll-chaining:none;overscroll-behavior:none}.xl\:overscroll-y-auto{overscroll-behavior-y:auto}.xl\:overscroll-y-contain{overscroll-behavior-y:contain}.xl\:overscroll-y-none{overscroll-behavior-y:none}.xl\:overscroll-x-auto{overscroll-behavior-x:auto}.xl\:overscroll-x-contain{overscroll-behavior-x:contain}.xl\:overscroll-x-none{overscroll-behavior-x:none}.xl\:p-0{padding:0}.xl\:p-1{padding:.25rem}.xl\:p-2{padding:.5rem}.xl\:p-3{padding:.75rem}.xl\:p-4{padding:1rem}.xl\:p-5{padding:1.25rem}.xl\:p-6{padding:1.5rem}.xl\:p-8{padding:2rem}.xl\:p-10{padding:2.5rem}.xl\:p-12{padding:3rem}.xl\:p-16{padding:4rem}.xl\:p-20{padding:5rem}.xl\:p-24{padding:6rem}.xl\:p-32{padding:8rem}.xl\:p-40{padding:10rem}.xl\:p-48{padding:12rem}.xl\:p-56{padding:14rem}.xl\:p-64{padding:16rem}.xl\:p-px{padding:1px}.xl\:py-0{padding-top:0;padding-bottom:0}.xl\:px-0{padding-left:0;padding-right:0}.xl\:py-1{padding-top:.25rem;padding-bottom:.25rem}.xl\:px-1{padding-left:.25rem;padding-right:.25rem}.xl\:py-2{padding-top:.5rem;padding-bottom:.5rem}.xl\:px-2{padding-left:.5rem;padding-right:.5rem}.xl\:py-3{padding-top:.75rem;padding-bottom:.75rem}.xl\:px-3{padding-left:.75rem;padding-right:.75rem}.xl\:py-4{padding-top:1rem;padding-bottom:1rem}.xl\:px-4{padding-left:1rem;padding-right:1rem}.xl\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.xl\:px-5{padding-left:1.25rem;padding-right:1.25rem}.xl\:py-6{padding-top:1.5rem;padding-bottom:1.5rem}.xl\:px-6{padding-left:1.5rem;padding-right:1.5rem}.xl\:py-8{padding-top:2rem;padding-bottom:2rem}.xl\:px-8{padding-left:2rem;padding-right:2rem}.xl\:py-10{padding-top:2.5rem;padding-bottom:2.5rem}.xl\:px-10{padding-left:2.5rem;padding-right:2.5rem}.xl\:py-12{padding-top:3rem;padding-bottom:3rem}.xl\:px-12{padding-left:3rem;padding-right:3rem}.xl\:py-16{padding-top:4rem;padding-bottom:4rem}.xl\:px-16{padding-left:4rem;padding-right:4rem}.xl\:py-20{padding-top:5rem;padding-bottom:5rem}.xl\:px-20{padding-left:5rem;padding-right:5rem}.xl\:py-24{padding-top:6rem;padding-bottom:6rem}.xl\:px-24{padding-left:6rem;padding-right:6rem}.xl\:py-32{padding-top:8rem;padding-bottom:8rem}.xl\:px-32{padding-left:8rem;padding-right:8rem}.xl\:py-40{padding-top:10rem;padding-bottom:10rem}.xl\:px-40{padding-left:10rem;padding-right:10rem}.xl\:py-48{padding-top:12rem;padding-bottom:12rem}.xl\:px-48{padding-left:12rem;padding-right:12rem}.xl\:py-56{padding-top:14rem;padding-bottom:14rem}.xl\:px-56{padding-left:14rem;padding-right:14rem}.xl\:py-64{padding-top:16rem;padding-bottom:16rem}.xl\:px-64{padding-left:16rem;padding-right:16rem}.xl\:py-px{padding-top:1px;padding-bottom:1px}.xl\:px-px{padding-left:1px;padding-right:1px}.xl\:pt-0{padding-top:0}.xl\:pr-0{padding-right:0}.xl\:pb-0{padding-bottom:0}.xl\:pl-0{padding-left:0}.xl\:pt-1{padding-top:.25rem}.xl\:pr-1{padding-right:.25rem}.xl\:pb-1{padding-bottom:.25rem}.xl\:pl-1{padding-left:.25rem}.xl\:pt-2{padding-top:.5rem}.xl\:pr-2{padding-right:.5rem}.xl\:pb-2{padding-bottom:.5rem}.xl\:pl-2{padding-left:.5rem}.xl\:pt-3{padding-top:.75rem}.xl\:pr-3{padding-right:.75rem}.xl\:pb-3{padding-bottom:.75rem}.xl\:pl-3{padding-left:.75rem}.xl\:pt-4{padding-top:1rem}.xl\:pr-4{padding-right:1rem}.xl\:pb-4{padding-bottom:1rem}.xl\:pl-4{padding-left:1rem}.xl\:pt-5{padding-top:1.25rem}.xl\:pr-5{padding-right:1.25rem}.xl\:pb-5{padding-bottom:1.25rem}.xl\:pl-5{padding-left:1.25rem}.xl\:pt-6{padding-top:1.5rem}.xl\:pr-6{padding-right:1.5rem}.xl\:pb-6{padding-bottom:1.5rem}.xl\:pl-6{padding-left:1.5rem}.xl\:pt-8{padding-top:2rem}.xl\:pr-8{padding-right:2rem}.xl\:pb-8{padding-bottom:2rem}.xl\:pl-8{padding-left:2rem}.xl\:pt-10{padding-top:2.5rem}.xl\:pr-10{padding-right:2.5rem}.xl\:pb-10{padding-bottom:2.5rem}.xl\:pl-10{padding-left:2.5rem}.xl\:pt-12{padding-top:3rem}.xl\:pr-12{padding-right:3rem}.xl\:pb-12{padding-bottom:3rem}.xl\:pl-12{padding-left:3rem}.xl\:pt-16{padding-top:4rem}.xl\:pr-16{padding-right:4rem}.xl\:pb-16{padding-bottom:4rem}.xl\:pl-16{padding-left:4rem}.xl\:pt-20{padding-top:5rem}.xl\:pr-20{padding-right:5rem}.xl\:pb-20{padding-bottom:5rem}.xl\:pl-20{padding-left:5rem}.xl\:pt-24{padding-top:6rem}.xl\:pr-24{padding-right:6rem}.xl\:pb-24{padding-bottom:6rem}.xl\:pl-24{padding-left:6rem}.xl\:pt-32{padding-top:8rem}.xl\:pr-32{padding-right:8rem}.xl\:pb-32{padding-bottom:8rem}.xl\:pl-32{padding-left:8rem}.xl\:pt-40{padding-top:10rem}.xl\:pr-40{padding-right:10rem}.xl\:pb-40{padding-bottom:10rem}.xl\:pl-40{padding-left:10rem}.xl\:pt-48{padding-top:12rem}.xl\:pr-48{padding-right:12rem}.xl\:pb-48{padding-bottom:12rem}.xl\:pl-48{padding-left:12rem}.xl\:pt-56{padding-top:14rem}.xl\:pr-56{padding-right:14rem}.xl\:pb-56{padding-bottom:14rem}.xl\:pl-56{padding-left:14rem}.xl\:pt-64{padding-top:16rem}.xl\:pr-64{padding-right:16rem}.xl\:pb-64{padding-bottom:16rem}.xl\:pl-64{padding-left:16rem}.xl\:pt-px{padding-top:1px}.xl\:pr-px{padding-right:1px}.xl\:pb-px{padding-bottom:1px}.xl\:pl-px{padding-left:1px}.xl\:placeholder-transparent:-ms-input-placeholder{color:transparent}.xl\:placeholder-transparent::-ms-input-placeholder{color:transparent}.xl\:placeholder-transparent::placeholder{color:transparent}.xl\:placeholder-current:-ms-input-placeholder{color:currentColor}.xl\:placeholder-current::-ms-input-placeholder{color:currentColor}.xl\:placeholder-current::placeholder{color:currentColor}.xl\:placeholder-black:-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.xl\:placeholder-black::-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.xl\:placeholder-black::placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.xl\:placeholder-white:-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.xl\:placeholder-white::-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.xl\:placeholder-white::placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.xl\:placeholder-gray-100:-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.xl\:placeholder-gray-100::-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.xl\:placeholder-gray-100::placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.xl\:placeholder-gray-200:-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.xl\:placeholder-gray-200::-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.xl\:placeholder-gray-200::placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.xl\:placeholder-gray-300:-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.xl\:placeholder-gray-300::-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.xl\:placeholder-gray-300::placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.xl\:placeholder-gray-400:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.xl\:placeholder-gray-400::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.xl\:placeholder-gray-400::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.xl\:placeholder-gray-500:-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.xl\:placeholder-gray-500::-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.xl\:placeholder-gray-500::placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.xl\:placeholder-gray-600:-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.xl\:placeholder-gray-600::-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.xl\:placeholder-gray-600::placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.xl\:placeholder-gray-700:-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.xl\:placeholder-gray-700::-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.xl\:placeholder-gray-700::placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.xl\:placeholder-gray-800:-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.xl\:placeholder-gray-800::-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.xl\:placeholder-gray-800::placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.xl\:placeholder-gray-900:-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.xl\:placeholder-gray-900::-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.xl\:placeholder-gray-900::placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.xl\:placeholder-red-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.xl\:placeholder-red-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.xl\:placeholder-red-100::placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.xl\:placeholder-red-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.xl\:placeholder-red-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.xl\:placeholder-red-200::placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.xl\:placeholder-red-300:-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.xl\:placeholder-red-300::-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.xl\:placeholder-red-300::placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.xl\:placeholder-red-400:-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.xl\:placeholder-red-400::-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.xl\:placeholder-red-400::placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.xl\:placeholder-red-500:-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.xl\:placeholder-red-500::-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.xl\:placeholder-red-500::placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.xl\:placeholder-red-600:-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.xl\:placeholder-red-600::-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.xl\:placeholder-red-600::placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.xl\:placeholder-red-700:-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.xl\:placeholder-red-700::-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.xl\:placeholder-red-700::placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.xl\:placeholder-red-800:-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.xl\:placeholder-red-800::-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.xl\:placeholder-red-800::placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.xl\:placeholder-red-900:-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.xl\:placeholder-red-900::-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.xl\:placeholder-red-900::placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.xl\:placeholder-orange-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.xl\:placeholder-orange-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.xl\:placeholder-orange-100::placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.xl\:placeholder-orange-200:-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.xl\:placeholder-orange-200::-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.xl\:placeholder-orange-200::placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.xl\:placeholder-orange-300:-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.xl\:placeholder-orange-300::-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.xl\:placeholder-orange-300::placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.xl\:placeholder-orange-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.xl\:placeholder-orange-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.xl\:placeholder-orange-400::placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.xl\:placeholder-orange-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.xl\:placeholder-orange-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.xl\:placeholder-orange-500::placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.xl\:placeholder-orange-600:-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.xl\:placeholder-orange-600::-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.xl\:placeholder-orange-600::placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.xl\:placeholder-orange-700:-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.xl\:placeholder-orange-700::-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.xl\:placeholder-orange-700::placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.xl\:placeholder-orange-800:-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.xl\:placeholder-orange-800::-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.xl\:placeholder-orange-800::placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.xl\:placeholder-orange-900:-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.xl\:placeholder-orange-900::-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.xl\:placeholder-orange-900::placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.xl\:placeholder-yellow-100:-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.xl\:placeholder-yellow-100::-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.xl\:placeholder-yellow-100::placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.xl\:placeholder-yellow-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.xl\:placeholder-yellow-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.xl\:placeholder-yellow-200::placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.xl\:placeholder-yellow-300:-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.xl\:placeholder-yellow-300::-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.xl\:placeholder-yellow-300::placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.xl\:placeholder-yellow-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.xl\:placeholder-yellow-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.xl\:placeholder-yellow-400::placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.xl\:placeholder-yellow-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.xl\:placeholder-yellow-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.xl\:placeholder-yellow-500::placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.xl\:placeholder-yellow-600:-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.xl\:placeholder-yellow-600::-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.xl\:placeholder-yellow-600::placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.xl\:placeholder-yellow-700:-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.xl\:placeholder-yellow-700::-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.xl\:placeholder-yellow-700::placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.xl\:placeholder-yellow-800:-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.xl\:placeholder-yellow-800::-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.xl\:placeholder-yellow-800::placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.xl\:placeholder-yellow-900:-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.xl\:placeholder-yellow-900::-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.xl\:placeholder-yellow-900::placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.xl\:placeholder-green-100:-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.xl\:placeholder-green-100::-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.xl\:placeholder-green-100::placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.xl\:placeholder-green-200:-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.xl\:placeholder-green-200::-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.xl\:placeholder-green-200::placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.xl\:placeholder-green-300:-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.xl\:placeholder-green-300::-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.xl\:placeholder-green-300::placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.xl\:placeholder-green-400:-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.xl\:placeholder-green-400::-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.xl\:placeholder-green-400::placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.xl\:placeholder-green-500:-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.xl\:placeholder-green-500::-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.xl\:placeholder-green-500::placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.xl\:placeholder-green-600:-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.xl\:placeholder-green-600::-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.xl\:placeholder-green-600::placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.xl\:placeholder-green-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.xl\:placeholder-green-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.xl\:placeholder-green-700::placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.xl\:placeholder-green-800:-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.xl\:placeholder-green-800::-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.xl\:placeholder-green-800::placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.xl\:placeholder-green-900:-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.xl\:placeholder-green-900::-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.xl\:placeholder-green-900::placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.xl\:placeholder-teal-100:-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.xl\:placeholder-teal-100::-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.xl\:placeholder-teal-100::placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.xl\:placeholder-teal-200:-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.xl\:placeholder-teal-200::-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.xl\:placeholder-teal-200::placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.xl\:placeholder-teal-300:-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.xl\:placeholder-teal-300::-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.xl\:placeholder-teal-300::placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.xl\:placeholder-teal-400:-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.xl\:placeholder-teal-400::-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.xl\:placeholder-teal-400::placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.xl\:placeholder-teal-500:-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.xl\:placeholder-teal-500::-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.xl\:placeholder-teal-500::placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.xl\:placeholder-teal-600:-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.xl\:placeholder-teal-600::-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.xl\:placeholder-teal-600::placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.xl\:placeholder-teal-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.xl\:placeholder-teal-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.xl\:placeholder-teal-700::placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.xl\:placeholder-teal-800:-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.xl\:placeholder-teal-800::-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.xl\:placeholder-teal-800::placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.xl\:placeholder-teal-900:-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.xl\:placeholder-teal-900::-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.xl\:placeholder-teal-900::placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.xl\:placeholder-blue-100:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.xl\:placeholder-blue-100::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.xl\:placeholder-blue-100::placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.xl\:placeholder-blue-200:-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.xl\:placeholder-blue-200::-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.xl\:placeholder-blue-200::placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.xl\:placeholder-blue-300:-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.xl\:placeholder-blue-300::-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.xl\:placeholder-blue-300::placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.xl\:placeholder-blue-400:-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.xl\:placeholder-blue-400::-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.xl\:placeholder-blue-400::placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.xl\:placeholder-blue-500:-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.xl\:placeholder-blue-500::-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.xl\:placeholder-blue-500::placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.xl\:placeholder-blue-600:-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.xl\:placeholder-blue-600::-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.xl\:placeholder-blue-600::placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.xl\:placeholder-blue-700:-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.xl\:placeholder-blue-700::-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.xl\:placeholder-blue-700::placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.xl\:placeholder-blue-800:-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.xl\:placeholder-blue-800::-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.xl\:placeholder-blue-800::placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.xl\:placeholder-blue-900:-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.xl\:placeholder-blue-900::-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.xl\:placeholder-blue-900::placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.xl\:placeholder-indigo-100:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.xl\:placeholder-indigo-100::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.xl\:placeholder-indigo-100::placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.xl\:placeholder-indigo-200:-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.xl\:placeholder-indigo-200::-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.xl\:placeholder-indigo-200::placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.xl\:placeholder-indigo-300:-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.xl\:placeholder-indigo-300::-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.xl\:placeholder-indigo-300::placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.xl\:placeholder-indigo-400:-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.xl\:placeholder-indigo-400::-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.xl\:placeholder-indigo-400::placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.xl\:placeholder-indigo-500:-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.xl\:placeholder-indigo-500::-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.xl\:placeholder-indigo-500::placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.xl\:placeholder-indigo-600:-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.xl\:placeholder-indigo-600::-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.xl\:placeholder-indigo-600::placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.xl\:placeholder-indigo-700:-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.xl\:placeholder-indigo-700::-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.xl\:placeholder-indigo-700::placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.xl\:placeholder-indigo-800:-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.xl\:placeholder-indigo-800::-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.xl\:placeholder-indigo-800::placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.xl\:placeholder-indigo-900:-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.xl\:placeholder-indigo-900::-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.xl\:placeholder-indigo-900::placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.xl\:placeholder-purple-100:-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.xl\:placeholder-purple-100::-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.xl\:placeholder-purple-100::placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.xl\:placeholder-purple-200:-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.xl\:placeholder-purple-200::-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.xl\:placeholder-purple-200::placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.xl\:placeholder-purple-300:-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.xl\:placeholder-purple-300::-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.xl\:placeholder-purple-300::placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.xl\:placeholder-purple-400:-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.xl\:placeholder-purple-400::-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.xl\:placeholder-purple-400::placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.xl\:placeholder-purple-500:-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.xl\:placeholder-purple-500::-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.xl\:placeholder-purple-500::placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.xl\:placeholder-purple-600:-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.xl\:placeholder-purple-600::-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.xl\:placeholder-purple-600::placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.xl\:placeholder-purple-700:-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.xl\:placeholder-purple-700::-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.xl\:placeholder-purple-700::placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.xl\:placeholder-purple-800:-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.xl\:placeholder-purple-800::-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.xl\:placeholder-purple-800::placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.xl\:placeholder-purple-900:-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.xl\:placeholder-purple-900::-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.xl\:placeholder-purple-900::placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.xl\:placeholder-pink-100:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.xl\:placeholder-pink-100::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.xl\:placeholder-pink-100::placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.xl\:placeholder-pink-200:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.xl\:placeholder-pink-200::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.xl\:placeholder-pink-200::placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.xl\:placeholder-pink-300:-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.xl\:placeholder-pink-300::-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.xl\:placeholder-pink-300::placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.xl\:placeholder-pink-400:-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.xl\:placeholder-pink-400::-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.xl\:placeholder-pink-400::placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.xl\:placeholder-pink-500:-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.xl\:placeholder-pink-500::-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.xl\:placeholder-pink-500::placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.xl\:placeholder-pink-600:-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.xl\:placeholder-pink-600::-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.xl\:placeholder-pink-600::placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.xl\:placeholder-pink-700:-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.xl\:placeholder-pink-700::-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.xl\:placeholder-pink-700::placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.xl\:placeholder-pink-800:-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.xl\:placeholder-pink-800::-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.xl\:placeholder-pink-800::placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.xl\:placeholder-pink-900:-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.xl\:placeholder-pink-900::-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.xl\:placeholder-pink-900::placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.xl\:focus\:placeholder-transparent:focus:-ms-input-placeholder{color:transparent}.xl\:focus\:placeholder-transparent:focus::-ms-input-placeholder{color:transparent}.xl\:focus\:placeholder-transparent:focus::placeholder{color:transparent}.xl\:focus\:placeholder-current:focus:-ms-input-placeholder{color:currentColor}.xl\:focus\:placeholder-current:focus::-ms-input-placeholder{color:currentColor}.xl\:focus\:placeholder-current:focus::placeholder{color:currentColor}.xl\:focus\:placeholder-black:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.xl\:focus\:placeholder-black:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.xl\:focus\:placeholder-black:focus::placeholder{--placeholder-opacity:1;color:#000;color:rgba(0,0,0,var(--placeholder-opacity))}.xl\:focus\:placeholder-white:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-white:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-white:focus::placeholder{--placeholder-opacity:1;color:#fff;color:rgba(255,255,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-100:focus::placeholder{--placeholder-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-200:focus::placeholder{--placeholder-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-300:focus::placeholder{--placeholder-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-400:focus::placeholder{--placeholder-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-500:focus::placeholder{--placeholder-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-600:focus::placeholder{--placeholder-opacity:1;color:#718096;color:rgba(113,128,150,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-700:focus::placeholder{--placeholder-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-800:focus::placeholder{--placeholder-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.xl\:focus\:placeholder-gray-900:focus::placeholder{--placeholder-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-100:focus::placeholder{--placeholder-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-200:focus::placeholder{--placeholder-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-300:focus::placeholder{--placeholder-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-400:focus::placeholder{--placeholder-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-500:focus::placeholder{--placeholder-opacity:1;color:#f56565;color:rgba(245,101,101,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-600:focus::placeholder{--placeholder-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-700:focus::placeholder{--placeholder-opacity:1;color:#c53030;color:rgba(197,48,48,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-800:focus::placeholder{--placeholder-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.xl\:focus\:placeholder-red-900:focus::placeholder{--placeholder-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-100:focus::placeholder{--placeholder-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-200:focus::placeholder{--placeholder-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-300:focus::placeholder{--placeholder-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-400:focus::placeholder{--placeholder-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-500:focus::placeholder{--placeholder-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-600:focus::placeholder{--placeholder-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-700:focus::placeholder{--placeholder-opacity:1;color:#c05621;color:rgba(192,86,33,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-800:focus::placeholder{--placeholder-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.xl\:focus\:placeholder-orange-900:focus::placeholder{--placeholder-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-100:focus::placeholder{--placeholder-opacity:1;color:ivory;color:rgba(255,255,240,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-200:focus::placeholder{--placeholder-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-300:focus::placeholder{--placeholder-opacity:1;color:#faf089;color:rgba(250,240,137,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-400:focus::placeholder{--placeholder-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-500:focus::placeholder{--placeholder-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-600:focus::placeholder{--placeholder-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-700:focus::placeholder{--placeholder-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-800:focus::placeholder{--placeholder-opacity:1;color:#975a16;color:rgba(151,90,22,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.xl\:focus\:placeholder-yellow-900:focus::placeholder{--placeholder-opacity:1;color:#744210;color:rgba(116,66,16,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-100:focus::placeholder{--placeholder-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-200:focus::placeholder{--placeholder-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-300:focus::placeholder{--placeholder-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-400:focus::placeholder{--placeholder-opacity:1;color:#68d391;color:rgba(104,211,145,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-500:focus::placeholder{--placeholder-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-600:focus::placeholder{--placeholder-opacity:1;color:#38a169;color:rgba(56,161,105,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-700:focus::placeholder{--placeholder-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-800:focus::placeholder{--placeholder-opacity:1;color:#276749;color:rgba(39,103,73,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.xl\:focus\:placeholder-green-900:focus::placeholder{--placeholder-opacity:1;color:#22543d;color:rgba(34,84,61,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-100:focus::placeholder{--placeholder-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-200:focus::placeholder{--placeholder-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-300:focus::placeholder{--placeholder-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-400:focus::placeholder{--placeholder-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-500:focus::placeholder{--placeholder-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-600:focus::placeholder{--placeholder-opacity:1;color:#319795;color:rgba(49,151,149,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-700:focus::placeholder{--placeholder-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-800:focus::placeholder{--placeholder-opacity:1;color:#285e61;color:rgba(40,94,97,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.xl\:focus\:placeholder-teal-900:focus::placeholder{--placeholder-opacity:1;color:#234e52;color:rgba(35,78,82,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-100:focus::placeholder{--placeholder-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-200:focus::placeholder{--placeholder-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-300:focus::placeholder{--placeholder-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-400:focus::placeholder{--placeholder-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-500:focus::placeholder{--placeholder-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-600:focus::placeholder{--placeholder-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-700:focus::placeholder{--placeholder-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-800:focus::placeholder{--placeholder-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.xl\:focus\:placeholder-blue-900:focus::placeholder{--placeholder-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-100:focus::placeholder{--placeholder-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-200:focus::placeholder{--placeholder-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-300:focus::placeholder{--placeholder-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-400:focus::placeholder{--placeholder-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-500:focus::placeholder{--placeholder-opacity:1;color:#667eea;color:rgba(102,126,234,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-600:focus::placeholder{--placeholder-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-700:focus::placeholder{--placeholder-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-800:focus::placeholder{--placeholder-opacity:1;color:#434190;color:rgba(67,65,144,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.xl\:focus\:placeholder-indigo-900:focus::placeholder{--placeholder-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-100:focus::placeholder{--placeholder-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-200:focus::placeholder{--placeholder-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-300:focus::placeholder{--placeholder-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-400:focus::placeholder{--placeholder-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-500:focus::placeholder{--placeholder-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-600:focus::placeholder{--placeholder-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-700:focus::placeholder{--placeholder-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-800:focus::placeholder{--placeholder-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.xl\:focus\:placeholder-purple-900:focus::placeholder{--placeholder-opacity:1;color:#44337a;color:rgba(68,51,122,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-100:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-100:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-100:focus::placeholder{--placeholder-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-200:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-200:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-200:focus::placeholder{--placeholder-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-300:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-300:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-300:focus::placeholder{--placeholder-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-400:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-400:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-400:focus::placeholder{--placeholder-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-500:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-500:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-500:focus::placeholder{--placeholder-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-600:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-600:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-600:focus::placeholder{--placeholder-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-700:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-700:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-700:focus::placeholder{--placeholder-opacity:1;color:#b83280;color:rgba(184,50,128,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-800:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-800:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-800:focus::placeholder{--placeholder-opacity:1;color:#97266d;color:rgba(151,38,109,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-900:focus:-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-900:focus::-ms-input-placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.xl\:focus\:placeholder-pink-900:focus::placeholder{--placeholder-opacity:1;color:#702459;color:rgba(112,36,89,var(--placeholder-opacity))}.xl\:placeholder-opacity-0:-ms-input-placeholder{--placeholder-opacity:0}.xl\:placeholder-opacity-0::-ms-input-placeholder{--placeholder-opacity:0}.xl\:placeholder-opacity-0::placeholder{--placeholder-opacity:0}.xl\:placeholder-opacity-25:-ms-input-placeholder{--placeholder-opacity:0.25}.xl\:placeholder-opacity-25::-ms-input-placeholder{--placeholder-opacity:0.25}.xl\:placeholder-opacity-25::placeholder{--placeholder-opacity:0.25}.xl\:placeholder-opacity-50:-ms-input-placeholder{--placeholder-opacity:0.5}.xl\:placeholder-opacity-50::-ms-input-placeholder{--placeholder-opacity:0.5}.xl\:placeholder-opacity-50::placeholder{--placeholder-opacity:0.5}.xl\:placeholder-opacity-75:-ms-input-placeholder{--placeholder-opacity:0.75}.xl\:placeholder-opacity-75::-ms-input-placeholder{--placeholder-opacity:0.75}.xl\:placeholder-opacity-75::placeholder{--placeholder-opacity:0.75}.xl\:placeholder-opacity-100:-ms-input-placeholder{--placeholder-opacity:1}.xl\:placeholder-opacity-100::-ms-input-placeholder{--placeholder-opacity:1}.xl\:placeholder-opacity-100::placeholder{--placeholder-opacity:1}.xl\:focus\:placeholder-opacity-0:focus:-ms-input-placeholder{--placeholder-opacity:0}.xl\:focus\:placeholder-opacity-0:focus::-ms-input-placeholder{--placeholder-opacity:0}.xl\:focus\:placeholder-opacity-0:focus::placeholder{--placeholder-opacity:0}.xl\:focus\:placeholder-opacity-25:focus:-ms-input-placeholder{--placeholder-opacity:0.25}.xl\:focus\:placeholder-opacity-25:focus::-ms-input-placeholder{--placeholder-opacity:0.25}.xl\:focus\:placeholder-opacity-25:focus::placeholder{--placeholder-opacity:0.25}.xl\:focus\:placeholder-opacity-50:focus:-ms-input-placeholder{--placeholder-opacity:0.5}.xl\:focus\:placeholder-opacity-50:focus::-ms-input-placeholder{--placeholder-opacity:0.5}.xl\:focus\:placeholder-opacity-50:focus::placeholder{--placeholder-opacity:0.5}.xl\:focus\:placeholder-opacity-75:focus:-ms-input-placeholder{--placeholder-opacity:0.75}.xl\:focus\:placeholder-opacity-75:focus::-ms-input-placeholder{--placeholder-opacity:0.75}.xl\:focus\:placeholder-opacity-75:focus::placeholder{--placeholder-opacity:0.75}.xl\:focus\:placeholder-opacity-100:focus:-ms-input-placeholder{--placeholder-opacity:1}.xl\:focus\:placeholder-opacity-100:focus::-ms-input-placeholder{--placeholder-opacity:1}.xl\:focus\:placeholder-opacity-100:focus::placeholder{--placeholder-opacity:1}.xl\:pointer-events-none{pointer-events:none}.xl\:pointer-events-auto{pointer-events:auto}.xl\:static{position:static}.xl\:fixed{position:fixed}.xl\:absolute{position:absolute}.xl\:relative{position:relative}.xl\:sticky{position:-webkit-sticky;position:sticky}.xl\:inset-0{top:0;right:0;bottom:0;left:0}.xl\:inset-auto{top:auto;right:auto;bottom:auto;left:auto}.xl\:inset-y-0{top:0;bottom:0}.xl\:inset-x-0{right:0;left:0}.xl\:inset-y-auto{top:auto;bottom:auto}.xl\:inset-x-auto{right:auto;left:auto}.xl\:top-0{top:0}.xl\:right-0{right:0}.xl\:bottom-0{bottom:0}.xl\:left-0{left:0}.xl\:top-auto{top:auto}.xl\:right-auto{right:auto}.xl\:bottom-auto{bottom:auto}.xl\:left-auto{left:auto}.xl\:resize-none{resize:none}.xl\:resize-y{resize:vertical}.xl\:resize-x{resize:horizontal}.xl\:resize{resize:both}.xl\:shadow-xs{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.xl\:shadow-sm{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.xl\:shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.xl\:shadow-md{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.xl\:shadow-lg{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.xl\:shadow-xl{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.xl\:shadow-2xl{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.xl\:shadow-inner{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.xl\:shadow-outline{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.xl\:shadow-none{box-shadow:none}.xl\:hover\:shadow-xs:hover{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.xl\:hover\:shadow-sm:hover{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.xl\:hover\:shadow:hover{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.xl\:hover\:shadow-md:hover{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.xl\:hover\:shadow-lg:hover{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.xl\:hover\:shadow-xl:hover{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.xl\:hover\:shadow-2xl:hover{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.xl\:hover\:shadow-inner:hover{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.xl\:hover\:shadow-outline:hover{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.xl\:hover\:shadow-none:hover{box-shadow:none}.xl\:focus\:shadow-xs:focus{box-shadow:0 0 0 1px rgba(0,0,0,.05)}.xl\:focus\:shadow-sm:focus{box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.xl\:focus\:shadow:focus{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.xl\:focus\:shadow-md:focus{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.xl\:focus\:shadow-lg:focus{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.xl\:focus\:shadow-xl:focus{box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.xl\:focus\:shadow-2xl:focus{box-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.xl\:focus\:shadow-inner:focus{box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.xl\:focus\:shadow-outline:focus{box-shadow:0 0 0 3px rgba(66,153,225,.5)}.xl\:focus\:shadow-none:focus{box-shadow:none}.xl\:fill-current{fill:currentColor}.xl\:stroke-current{stroke:currentColor}.xl\:stroke-0{stroke-width:0}.xl\:stroke-1{stroke-width:1}.xl\:stroke-2{stroke-width:2}.xl\:table-auto{table-layout:auto}.xl\:table-fixed{table-layout:fixed}.xl\:text-left{text-align:left}.xl\:text-center{text-align:center}.xl\:text-right{text-align:right}.xl\:text-justify{text-align:justify}.xl\:text-transparent{color:transparent}.xl\:text-current{color:currentColor}.xl\:text-black{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.xl\:text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.xl\:text-gray-100{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.xl\:text-gray-200{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.xl\:text-gray-300{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.xl\:text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.xl\:text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.xl\:text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.xl\:text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.xl\:text-gray-800{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.xl\:text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.xl\:text-red-100{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.xl\:text-red-200{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.xl\:text-red-300{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.xl\:text-red-400{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.xl\:text-red-500{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.xl\:text-red-600{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.xl\:text-red-700{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.xl\:text-red-800{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.xl\:text-red-900{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.xl\:text-orange-100{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.xl\:text-orange-200{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.xl\:text-orange-300{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.xl\:text-orange-400{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.xl\:text-orange-500{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.xl\:text-orange-600{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.xl\:text-orange-700{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.xl\:text-orange-800{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.xl\:text-orange-900{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.xl\:text-yellow-100{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.xl\:text-yellow-200{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.xl\:text-yellow-300{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.xl\:text-yellow-400{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.xl\:text-yellow-500{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.xl\:text-yellow-600{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.xl\:text-yellow-700{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.xl\:text-yellow-800{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.xl\:text-yellow-900{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.xl\:text-green-100{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.xl\:text-green-200{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.xl\:text-green-300{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.xl\:text-green-400{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.xl\:text-green-500{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.xl\:text-green-600{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.xl\:text-green-700{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.xl\:text-green-800{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.xl\:text-green-900{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.xl\:text-teal-100{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.xl\:text-teal-200{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.xl\:text-teal-300{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.xl\:text-teal-400{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.xl\:text-teal-500{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.xl\:text-teal-600{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.xl\:text-teal-700{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.xl\:text-teal-800{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.xl\:text-teal-900{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.xl\:text-blue-100{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.xl\:text-blue-200{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.xl\:text-blue-300{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.xl\:text-blue-400{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.xl\:text-blue-500{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.xl\:text-blue-600{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.xl\:text-blue-700{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.xl\:text-blue-800{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.xl\:text-blue-900{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.xl\:text-indigo-100{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.xl\:text-indigo-200{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.xl\:text-indigo-300{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.xl\:text-indigo-400{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.xl\:text-indigo-500{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.xl\:text-indigo-600{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.xl\:text-indigo-700{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.xl\:text-indigo-800{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.xl\:text-indigo-900{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.xl\:text-purple-100{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.xl\:text-purple-200{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.xl\:text-purple-300{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.xl\:text-purple-400{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.xl\:text-purple-500{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.xl\:text-purple-600{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.xl\:text-purple-700{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.xl\:text-purple-800{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.xl\:text-purple-900{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.xl\:text-pink-100{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.xl\:text-pink-200{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.xl\:text-pink-300{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.xl\:text-pink-400{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.xl\:text-pink-500{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.xl\:text-pink-600{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.xl\:text-pink-700{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.xl\:text-pink-800{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.xl\:text-pink-900{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.xl\:hover\:text-transparent:hover{color:transparent}.xl\:hover\:text-current:hover{color:currentColor}.xl\:hover\:text-black:hover{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.xl\:hover\:text-white:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.xl\:hover\:text-gray-100:hover{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.xl\:hover\:text-gray-200:hover{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.xl\:hover\:text-gray-300:hover{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.xl\:hover\:text-gray-400:hover{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.xl\:hover\:text-gray-500:hover{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.xl\:hover\:text-gray-600:hover{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.xl\:hover\:text-gray-700:hover{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.xl\:hover\:text-gray-800:hover{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.xl\:hover\:text-gray-900:hover{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.xl\:hover\:text-red-100:hover{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.xl\:hover\:text-red-200:hover{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.xl\:hover\:text-red-300:hover{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.xl\:hover\:text-red-400:hover{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.xl\:hover\:text-red-500:hover{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.xl\:hover\:text-red-600:hover{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.xl\:hover\:text-red-700:hover{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.xl\:hover\:text-red-800:hover{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.xl\:hover\:text-red-900:hover{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.xl\:hover\:text-orange-100:hover{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.xl\:hover\:text-orange-200:hover{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.xl\:hover\:text-orange-300:hover{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.xl\:hover\:text-orange-400:hover{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.xl\:hover\:text-orange-500:hover{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.xl\:hover\:text-orange-600:hover{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.xl\:hover\:text-orange-700:hover{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.xl\:hover\:text-orange-800:hover{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.xl\:hover\:text-orange-900:hover{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.xl\:hover\:text-yellow-100:hover{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.xl\:hover\:text-yellow-200:hover{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.xl\:hover\:text-yellow-300:hover{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.xl\:hover\:text-yellow-400:hover{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.xl\:hover\:text-yellow-500:hover{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.xl\:hover\:text-yellow-600:hover{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.xl\:hover\:text-yellow-700:hover{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.xl\:hover\:text-yellow-800:hover{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.xl\:hover\:text-yellow-900:hover{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.xl\:hover\:text-green-100:hover{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.xl\:hover\:text-green-200:hover{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.xl\:hover\:text-green-300:hover{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.xl\:hover\:text-green-400:hover{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.xl\:hover\:text-green-500:hover{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.xl\:hover\:text-green-600:hover{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.xl\:hover\:text-green-700:hover{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.xl\:hover\:text-green-800:hover{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.xl\:hover\:text-green-900:hover{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.xl\:hover\:text-teal-100:hover{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.xl\:hover\:text-teal-200:hover{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.xl\:hover\:text-teal-300:hover{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.xl\:hover\:text-teal-400:hover{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.xl\:hover\:text-teal-500:hover{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.xl\:hover\:text-teal-600:hover{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.xl\:hover\:text-teal-700:hover{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.xl\:hover\:text-teal-800:hover{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.xl\:hover\:text-teal-900:hover{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.xl\:hover\:text-blue-100:hover{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.xl\:hover\:text-blue-200:hover{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.xl\:hover\:text-blue-300:hover{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.xl\:hover\:text-blue-400:hover{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.xl\:hover\:text-blue-500:hover{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.xl\:hover\:text-blue-600:hover{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.xl\:hover\:text-blue-700:hover{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.xl\:hover\:text-blue-800:hover{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.xl\:hover\:text-blue-900:hover{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.xl\:hover\:text-indigo-100:hover{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.xl\:hover\:text-indigo-200:hover{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.xl\:hover\:text-indigo-300:hover{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.xl\:hover\:text-indigo-400:hover{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.xl\:hover\:text-indigo-500:hover{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.xl\:hover\:text-indigo-600:hover{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.xl\:hover\:text-indigo-700:hover{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.xl\:hover\:text-indigo-800:hover{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.xl\:hover\:text-indigo-900:hover{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.xl\:hover\:text-purple-100:hover{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.xl\:hover\:text-purple-200:hover{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.xl\:hover\:text-purple-300:hover{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.xl\:hover\:text-purple-400:hover{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.xl\:hover\:text-purple-500:hover{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.xl\:hover\:text-purple-600:hover{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.xl\:hover\:text-purple-700:hover{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.xl\:hover\:text-purple-800:hover{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.xl\:hover\:text-purple-900:hover{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.xl\:hover\:text-pink-100:hover{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.xl\:hover\:text-pink-200:hover{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.xl\:hover\:text-pink-300:hover{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.xl\:hover\:text-pink-400:hover{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.xl\:hover\:text-pink-500:hover{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.xl\:hover\:text-pink-600:hover{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.xl\:hover\:text-pink-700:hover{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.xl\:hover\:text-pink-800:hover{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.xl\:hover\:text-pink-900:hover{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.xl\:focus\:text-transparent:focus{color:transparent}.xl\:focus\:text-current:focus{color:currentColor}.xl\:focus\:text-black:focus{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.xl\:focus\:text-white:focus{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.xl\:focus\:text-gray-100:focus{--text-opacity:1;color:#f7fafc;color:rgba(247,250,252,var(--text-opacity))}.xl\:focus\:text-gray-200:focus{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.xl\:focus\:text-gray-300:focus{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.xl\:focus\:text-gray-400:focus{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.xl\:focus\:text-gray-500:focus{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.xl\:focus\:text-gray-600:focus{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.xl\:focus\:text-gray-700:focus{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.xl\:focus\:text-gray-800:focus{--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.xl\:focus\:text-gray-900:focus{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.xl\:focus\:text-red-100:focus{--text-opacity:1;color:#fff5f5;color:rgba(255,245,245,var(--text-opacity))}.xl\:focus\:text-red-200:focus{--text-opacity:1;color:#fed7d7;color:rgba(254,215,215,var(--text-opacity))}.xl\:focus\:text-red-300:focus{--text-opacity:1;color:#feb2b2;color:rgba(254,178,178,var(--text-opacity))}.xl\:focus\:text-red-400:focus{--text-opacity:1;color:#fc8181;color:rgba(252,129,129,var(--text-opacity))}.xl\:focus\:text-red-500:focus{--text-opacity:1;color:#f56565;color:rgba(245,101,101,var(--text-opacity))}.xl\:focus\:text-red-600:focus{--text-opacity:1;color:#e53e3e;color:rgba(229,62,62,var(--text-opacity))}.xl\:focus\:text-red-700:focus{--text-opacity:1;color:#c53030;color:rgba(197,48,48,var(--text-opacity))}.xl\:focus\:text-red-800:focus{--text-opacity:1;color:#9b2c2c;color:rgba(155,44,44,var(--text-opacity))}.xl\:focus\:text-red-900:focus{--text-opacity:1;color:#742a2a;color:rgba(116,42,42,var(--text-opacity))}.xl\:focus\:text-orange-100:focus{--text-opacity:1;color:#fffaf0;color:rgba(255,250,240,var(--text-opacity))}.xl\:focus\:text-orange-200:focus{--text-opacity:1;color:#feebc8;color:rgba(254,235,200,var(--text-opacity))}.xl\:focus\:text-orange-300:focus{--text-opacity:1;color:#fbd38d;color:rgba(251,211,141,var(--text-opacity))}.xl\:focus\:text-orange-400:focus{--text-opacity:1;color:#f6ad55;color:rgba(246,173,85,var(--text-opacity))}.xl\:focus\:text-orange-500:focus{--text-opacity:1;color:#ed8936;color:rgba(237,137,54,var(--text-opacity))}.xl\:focus\:text-orange-600:focus{--text-opacity:1;color:#dd6b20;color:rgba(221,107,32,var(--text-opacity))}.xl\:focus\:text-orange-700:focus{--text-opacity:1;color:#c05621;color:rgba(192,86,33,var(--text-opacity))}.xl\:focus\:text-orange-800:focus{--text-opacity:1;color:#9c4221;color:rgba(156,66,33,var(--text-opacity))}.xl\:focus\:text-orange-900:focus{--text-opacity:1;color:#7b341e;color:rgba(123,52,30,var(--text-opacity))}.xl\:focus\:text-yellow-100:focus{--text-opacity:1;color:ivory;color:rgba(255,255,240,var(--text-opacity))}.xl\:focus\:text-yellow-200:focus{--text-opacity:1;color:#fefcbf;color:rgba(254,252,191,var(--text-opacity))}.xl\:focus\:text-yellow-300:focus{--text-opacity:1;color:#faf089;color:rgba(250,240,137,var(--text-opacity))}.xl\:focus\:text-yellow-400:focus{--text-opacity:1;color:#f6e05e;color:rgba(246,224,94,var(--text-opacity))}.xl\:focus\:text-yellow-500:focus{--text-opacity:1;color:#ecc94b;color:rgba(236,201,75,var(--text-opacity))}.xl\:focus\:text-yellow-600:focus{--text-opacity:1;color:#d69e2e;color:rgba(214,158,46,var(--text-opacity))}.xl\:focus\:text-yellow-700:focus{--text-opacity:1;color:#b7791f;color:rgba(183,121,31,var(--text-opacity))}.xl\:focus\:text-yellow-800:focus{--text-opacity:1;color:#975a16;color:rgba(151,90,22,var(--text-opacity))}.xl\:focus\:text-yellow-900:focus{--text-opacity:1;color:#744210;color:rgba(116,66,16,var(--text-opacity))}.xl\:focus\:text-green-100:focus{--text-opacity:1;color:#f0fff4;color:rgba(240,255,244,var(--text-opacity))}.xl\:focus\:text-green-200:focus{--text-opacity:1;color:#c6f6d5;color:rgba(198,246,213,var(--text-opacity))}.xl\:focus\:text-green-300:focus{--text-opacity:1;color:#9ae6b4;color:rgba(154,230,180,var(--text-opacity))}.xl\:focus\:text-green-400:focus{--text-opacity:1;color:#68d391;color:rgba(104,211,145,var(--text-opacity))}.xl\:focus\:text-green-500:focus{--text-opacity:1;color:#48bb78;color:rgba(72,187,120,var(--text-opacity))}.xl\:focus\:text-green-600:focus{--text-opacity:1;color:#38a169;color:rgba(56,161,105,var(--text-opacity))}.xl\:focus\:text-green-700:focus{--text-opacity:1;color:#2f855a;color:rgba(47,133,90,var(--text-opacity))}.xl\:focus\:text-green-800:focus{--text-opacity:1;color:#276749;color:rgba(39,103,73,var(--text-opacity))}.xl\:focus\:text-green-900:focus{--text-opacity:1;color:#22543d;color:rgba(34,84,61,var(--text-opacity))}.xl\:focus\:text-teal-100:focus{--text-opacity:1;color:#e6fffa;color:rgba(230,255,250,var(--text-opacity))}.xl\:focus\:text-teal-200:focus{--text-opacity:1;color:#b2f5ea;color:rgba(178,245,234,var(--text-opacity))}.xl\:focus\:text-teal-300:focus{--text-opacity:1;color:#81e6d9;color:rgba(129,230,217,var(--text-opacity))}.xl\:focus\:text-teal-400:focus{--text-opacity:1;color:#4fd1c5;color:rgba(79,209,197,var(--text-opacity))}.xl\:focus\:text-teal-500:focus{--text-opacity:1;color:#38b2ac;color:rgba(56,178,172,var(--text-opacity))}.xl\:focus\:text-teal-600:focus{--text-opacity:1;color:#319795;color:rgba(49,151,149,var(--text-opacity))}.xl\:focus\:text-teal-700:focus{--text-opacity:1;color:#2c7a7b;color:rgba(44,122,123,var(--text-opacity))}.xl\:focus\:text-teal-800:focus{--text-opacity:1;color:#285e61;color:rgba(40,94,97,var(--text-opacity))}.xl\:focus\:text-teal-900:focus{--text-opacity:1;color:#234e52;color:rgba(35,78,82,var(--text-opacity))}.xl\:focus\:text-blue-100:focus{--text-opacity:1;color:#ebf8ff;color:rgba(235,248,255,var(--text-opacity))}.xl\:focus\:text-blue-200:focus{--text-opacity:1;color:#bee3f8;color:rgba(190,227,248,var(--text-opacity))}.xl\:focus\:text-blue-300:focus{--text-opacity:1;color:#90cdf4;color:rgba(144,205,244,var(--text-opacity))}.xl\:focus\:text-blue-400:focus{--text-opacity:1;color:#63b3ed;color:rgba(99,179,237,var(--text-opacity))}.xl\:focus\:text-blue-500:focus{--text-opacity:1;color:#4299e1;color:rgba(66,153,225,var(--text-opacity))}.xl\:focus\:text-blue-600:focus{--text-opacity:1;color:#3182ce;color:rgba(49,130,206,var(--text-opacity))}.xl\:focus\:text-blue-700:focus{--text-opacity:1;color:#2b6cb0;color:rgba(43,108,176,var(--text-opacity))}.xl\:focus\:text-blue-800:focus{--text-opacity:1;color:#2c5282;color:rgba(44,82,130,var(--text-opacity))}.xl\:focus\:text-blue-900:focus{--text-opacity:1;color:#2a4365;color:rgba(42,67,101,var(--text-opacity))}.xl\:focus\:text-indigo-100:focus{--text-opacity:1;color:#ebf4ff;color:rgba(235,244,255,var(--text-opacity))}.xl\:focus\:text-indigo-200:focus{--text-opacity:1;color:#c3dafe;color:rgba(195,218,254,var(--text-opacity))}.xl\:focus\:text-indigo-300:focus{--text-opacity:1;color:#a3bffa;color:rgba(163,191,250,var(--text-opacity))}.xl\:focus\:text-indigo-400:focus{--text-opacity:1;color:#7f9cf5;color:rgba(127,156,245,var(--text-opacity))}.xl\:focus\:text-indigo-500:focus{--text-opacity:1;color:#667eea;color:rgba(102,126,234,var(--text-opacity))}.xl\:focus\:text-indigo-600:focus{--text-opacity:1;color:#5a67d8;color:rgba(90,103,216,var(--text-opacity))}.xl\:focus\:text-indigo-700:focus{--text-opacity:1;color:#4c51bf;color:rgba(76,81,191,var(--text-opacity))}.xl\:focus\:text-indigo-800:focus{--text-opacity:1;color:#434190;color:rgba(67,65,144,var(--text-opacity))}.xl\:focus\:text-indigo-900:focus{--text-opacity:1;color:#3c366b;color:rgba(60,54,107,var(--text-opacity))}.xl\:focus\:text-purple-100:focus{--text-opacity:1;color:#faf5ff;color:rgba(250,245,255,var(--text-opacity))}.xl\:focus\:text-purple-200:focus{--text-opacity:1;color:#e9d8fd;color:rgba(233,216,253,var(--text-opacity))}.xl\:focus\:text-purple-300:focus{--text-opacity:1;color:#d6bcfa;color:rgba(214,188,250,var(--text-opacity))}.xl\:focus\:text-purple-400:focus{--text-opacity:1;color:#b794f4;color:rgba(183,148,244,var(--text-opacity))}.xl\:focus\:text-purple-500:focus{--text-opacity:1;color:#9f7aea;color:rgba(159,122,234,var(--text-opacity))}.xl\:focus\:text-purple-600:focus{--text-opacity:1;color:#805ad5;color:rgba(128,90,213,var(--text-opacity))}.xl\:focus\:text-purple-700:focus{--text-opacity:1;color:#6b46c1;color:rgba(107,70,193,var(--text-opacity))}.xl\:focus\:text-purple-800:focus{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.xl\:focus\:text-purple-900:focus{--text-opacity:1;color:#44337a;color:rgba(68,51,122,var(--text-opacity))}.xl\:focus\:text-pink-100:focus{--text-opacity:1;color:#fff5f7;color:rgba(255,245,247,var(--text-opacity))}.xl\:focus\:text-pink-200:focus{--text-opacity:1;color:#fed7e2;color:rgba(254,215,226,var(--text-opacity))}.xl\:focus\:text-pink-300:focus{--text-opacity:1;color:#fbb6ce;color:rgba(251,182,206,var(--text-opacity))}.xl\:focus\:text-pink-400:focus{--text-opacity:1;color:#f687b3;color:rgba(246,135,179,var(--text-opacity))}.xl\:focus\:text-pink-500:focus{--text-opacity:1;color:#ed64a6;color:rgba(237,100,166,var(--text-opacity))}.xl\:focus\:text-pink-600:focus{--text-opacity:1;color:#d53f8c;color:rgba(213,63,140,var(--text-opacity))}.xl\:focus\:text-pink-700:focus{--text-opacity:1;color:#b83280;color:rgba(184,50,128,var(--text-opacity))}.xl\:focus\:text-pink-800:focus{--text-opacity:1;color:#97266d;color:rgba(151,38,109,var(--text-opacity))}.xl\:focus\:text-pink-900:focus{--text-opacity:1;color:#702459;color:rgba(112,36,89,var(--text-opacity))}.xl\:text-opacity-0{--text-opacity:0}.xl\:text-opacity-25{--text-opacity:0.25}.xl\:text-opacity-50{--text-opacity:0.5}.xl\:text-opacity-75{--text-opacity:0.75}.xl\:text-opacity-100{--text-opacity:1}.xl\:hover\:text-opacity-0:hover{--text-opacity:0}.xl\:hover\:text-opacity-25:hover{--text-opacity:0.25}.xl\:hover\:text-opacity-50:hover{--text-opacity:0.5}.xl\:hover\:text-opacity-75:hover{--text-opacity:0.75}.xl\:hover\:text-opacity-100:hover{--text-opacity:1}.xl\:focus\:text-opacity-0:focus{--text-opacity:0}.xl\:focus\:text-opacity-25:focus{--text-opacity:0.25}.xl\:focus\:text-opacity-50:focus{--text-opacity:0.5}.xl\:focus\:text-opacity-75:focus{--text-opacity:0.75}.xl\:focus\:text-opacity-100:focus{--text-opacity:1}.xl\:italic{font-style:italic}.xl\:not-italic{font-style:normal}.xl\:uppercase{text-transform:uppercase}.xl\:lowercase{text-transform:lowercase}.xl\:capitalize{text-transform:capitalize}.xl\:normal-case{text-transform:none}.xl\:underline{text-decoration:underline}.xl\:line-through{text-decoration:line-through}.xl\:no-underline{text-decoration:none}.xl\:hover\:underline:hover{text-decoration:underline}.xl\:hover\:line-through:hover{text-decoration:line-through}.xl\:hover\:no-underline:hover{text-decoration:none}.xl\:focus\:underline:focus{text-decoration:underline}.xl\:focus\:line-through:focus{text-decoration:line-through}.xl\:focus\:no-underline:focus{text-decoration:none}.xl\:antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.xl\:subpixel-antialiased{-webkit-font-smoothing:auto;-moz-osx-font-smoothing:auto}.xl\:diagonal-fractions,.xl\:lining-nums,.xl\:oldstyle-nums,.xl\:ordinal,.xl\:proportional-nums,.xl\:slashed-zero,.xl\:stacked-fractions,.xl\:tabular-nums{--font-variant-numeric-ordinal:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-slashed-zero:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-figure:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-spacing:var(--tailwind-empty, );/*!*//*!*/--font-variant-numeric-fraction:var(--tailwind-empty, );/*!*//*!*/font-variant-numeric:var(--font-variant-numeric-ordinal) var(--font-variant-numeric-slashed-zero) var(--font-variant-numeric-figure) var(--font-variant-numeric-spacing) var(--font-variant-numeric-fraction)}.xl\:normal-nums{font-variant-numeric:normal}.xl\:ordinal{--font-variant-numeric-ordinal:ordinal}.xl\:slashed-zero{--font-variant-numeric-slashed-zero:slashed-zero}.xl\:lining-nums{--font-variant-numeric-figure:lining-nums}.xl\:oldstyle-nums{--font-variant-numeric-figure:oldstyle-nums}.xl\:proportional-nums{--font-variant-numeric-spacing:proportional-nums}.xl\:tabular-nums{--font-variant-numeric-spacing:tabular-nums}.xl\:diagonal-fractions{--font-variant-numeric-fraction:diagonal-fractions}.xl\:stacked-fractions{--font-variant-numeric-fraction:stacked-fractions}.xl\:tracking-tighter{letter-spacing:-.05em}.xl\:tracking-tight{letter-spacing:-.025em}.xl\:tracking-normal{letter-spacing:0}.xl\:tracking-wide{letter-spacing:.025em}.xl\:tracking-wider{letter-spacing:.05em}.xl\:tracking-widest{letter-spacing:.1em}.xl\:select-none{-webkit-user-select:none;-ms-user-select:none;user-select:none}.xl\:select-text{-webkit-user-select:text;-ms-user-select:text;user-select:text}.xl\:select-all{-webkit-user-select:all;-ms-user-select:all;user-select:all}.xl\:select-auto{-webkit-user-select:auto;-ms-user-select:auto;user-select:auto}.xl\:align-baseline{vertical-align:baseline}.xl\:align-top{vertical-align:top}.xl\:align-middle{vertical-align:middle}.xl\:align-bottom{vertical-align:bottom}.xl\:align-text-top{vertical-align:text-top}.xl\:align-text-bottom{vertical-align:text-bottom}.xl\:visible{visibility:visible}.xl\:invisible{visibility:hidden}.xl\:whitespace-normal{white-space:normal}.xl\:whitespace-no-wrap{white-space:nowrap}.xl\:whitespace-pre{white-space:pre}.xl\:whitespace-pre-line{white-space:pre-line}.xl\:whitespace-pre-wrap{white-space:pre-wrap}.xl\:break-normal{word-wrap:normal;overflow-wrap:normal;word-break:normal}.xl\:break-words{word-wrap:break-word;overflow-wrap:break-word}.xl\:break-all{word-break:break-all}.xl\:truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.xl\:w-0{width:0}.xl\:w-1{width:.25rem}.xl\:w-2{width:.5rem}.xl\:w-3{width:.75rem}.xl\:w-4{width:1rem}.xl\:w-5{width:1.25rem}.xl\:w-6{width:1.5rem}.xl\:w-8{width:2rem}.xl\:w-10{width:2.5rem}.xl\:w-12{width:3rem}.xl\:w-16{width:4rem}.xl\:w-20{width:5rem}.xl\:w-24{width:6rem}.xl\:w-32{width:8rem}.xl\:w-40{width:10rem}.xl\:w-48{width:12rem}.xl\:w-56{width:14rem}.xl\:w-64{width:16rem}.xl\:w-auto{width:auto}.xl\:w-px{width:1px}.xl\:w-1\/2{width:50%}.xl\:w-1\/3{width:33.333333%}.xl\:w-2\/3{width:66.666667%}.xl\:w-1\/4{width:25%}.xl\:w-2\/4{width:50%}.xl\:w-3\/4{width:75%}.xl\:w-1\/5{width:20%}.xl\:w-2\/5{width:40%}.xl\:w-3\/5{width:60%}.xl\:w-4\/5{width:80%}.xl\:w-1\/6{width:16.666667%}.xl\:w-2\/6{width:33.333333%}.xl\:w-3\/6{width:50%}.xl\:w-4\/6{width:66.666667%}.xl\:w-5\/6{width:83.333333%}.xl\:w-1\/12{width:8.333333%}.xl\:w-2\/12{width:16.666667%}.xl\:w-3\/12{width:25%}.xl\:w-4\/12{width:33.333333%}.xl\:w-5\/12{width:41.666667%}.xl\:w-6\/12{width:50%}.xl\:w-7\/12{width:58.333333%}.xl\:w-8\/12{width:66.666667%}.xl\:w-9\/12{width:75%}.xl\:w-10\/12{width:83.333333%}.xl\:w-11\/12{width:91.666667%}.xl\:w-full{width:100%}.xl\:w-screen{width:100vw}.xl\:z-0{z-index:0}.xl\:z-10{z-index:10}.xl\:z-20{z-index:20}.xl\:z-30{z-index:30}.xl\:z-40{z-index:40}.xl\:z-50{z-index:50}.xl\:z-auto{z-index:auto}.xl\:gap-0{grid-gap:0;gap:0}.xl\:gap-1{grid-gap:.25rem;gap:.25rem}.xl\:gap-2{grid-gap:.5rem;gap:.5rem}.xl\:gap-3{grid-gap:.75rem;gap:.75rem}.xl\:gap-4{grid-gap:1rem;gap:1rem}.xl\:gap-5{grid-gap:1.25rem;gap:1.25rem}.xl\:gap-6{grid-gap:1.5rem;gap:1.5rem}.xl\:gap-8{grid-gap:2rem;gap:2rem}.xl\:gap-10{grid-gap:2.5rem;gap:2.5rem}.xl\:gap-12{grid-gap:3rem;gap:3rem}.xl\:gap-16{grid-gap:4rem;gap:4rem}.xl\:gap-20{grid-gap:5rem;gap:5rem}.xl\:gap-24{grid-gap:6rem;gap:6rem}.xl\:gap-32{grid-gap:8rem;gap:8rem}.xl\:gap-40{grid-gap:10rem;gap:10rem}.xl\:gap-48{grid-gap:12rem;gap:12rem}.xl\:gap-56{grid-gap:14rem;gap:14rem}.xl\:gap-64{grid-gap:16rem;gap:16rem}.xl\:gap-px{grid-gap:1px;gap:1px}.xl\:col-gap-0{grid-column-gap:0;column-gap:0}.xl\:col-gap-1{grid-column-gap:.25rem;column-gap:.25rem}.xl\:col-gap-2{grid-column-gap:.5rem;column-gap:.5rem}.xl\:col-gap-3{grid-column-gap:.75rem;column-gap:.75rem}.xl\:col-gap-4{grid-column-gap:1rem;column-gap:1rem}.xl\:col-gap-5{grid-column-gap:1.25rem;column-gap:1.25rem}.xl\:col-gap-6{grid-column-gap:1.5rem;column-gap:1.5rem}.xl\:col-gap-8{grid-column-gap:2rem;column-gap:2rem}.xl\:col-gap-10{grid-column-gap:2.5rem;column-gap:2.5rem}.xl\:col-gap-12{grid-column-gap:3rem;column-gap:3rem}.xl\:col-gap-16{grid-column-gap:4rem;column-gap:4rem}.xl\:col-gap-20{grid-column-gap:5rem;column-gap:5rem}.xl\:col-gap-24{grid-column-gap:6rem;column-gap:6rem}.xl\:col-gap-32{grid-column-gap:8rem;column-gap:8rem}.xl\:col-gap-40{grid-column-gap:10rem;column-gap:10rem}.xl\:col-gap-48{grid-column-gap:12rem;column-gap:12rem}.xl\:col-gap-56{grid-column-gap:14rem;column-gap:14rem}.xl\:col-gap-64{grid-column-gap:16rem;column-gap:16rem}.xl\:col-gap-px{grid-column-gap:1px;column-gap:1px}.xl\:gap-x-0{grid-column-gap:0;column-gap:0}.xl\:gap-x-1{grid-column-gap:.25rem;column-gap:.25rem}.xl\:gap-x-2{grid-column-gap:.5rem;column-gap:.5rem}.xl\:gap-x-3{grid-column-gap:.75rem;column-gap:.75rem}.xl\:gap-x-4{grid-column-gap:1rem;column-gap:1rem}.xl\:gap-x-5{grid-column-gap:1.25rem;column-gap:1.25rem}.xl\:gap-x-6{grid-column-gap:1.5rem;column-gap:1.5rem}.xl\:gap-x-8{grid-column-gap:2rem;column-gap:2rem}.xl\:gap-x-10{grid-column-gap:2.5rem;column-gap:2.5rem}.xl\:gap-x-12{grid-column-gap:3rem;column-gap:3rem}.xl\:gap-x-16{grid-column-gap:4rem;column-gap:4rem}.xl\:gap-x-20{grid-column-gap:5rem;column-gap:5rem}.xl\:gap-x-24{grid-column-gap:6rem;column-gap:6rem}.xl\:gap-x-32{grid-column-gap:8rem;column-gap:8rem}.xl\:gap-x-40{grid-column-gap:10rem;column-gap:10rem}.xl\:gap-x-48{grid-column-gap:12rem;column-gap:12rem}.xl\:gap-x-56{grid-column-gap:14rem;column-gap:14rem}.xl\:gap-x-64{grid-column-gap:16rem;column-gap:16rem}.xl\:gap-x-px{grid-column-gap:1px;column-gap:1px}.xl\:row-gap-0{grid-row-gap:0;row-gap:0}.xl\:row-gap-1{grid-row-gap:.25rem;row-gap:.25rem}.xl\:row-gap-2{grid-row-gap:.5rem;row-gap:.5rem}.xl\:row-gap-3{grid-row-gap:.75rem;row-gap:.75rem}.xl\:row-gap-4{grid-row-gap:1rem;row-gap:1rem}.xl\:row-gap-5{grid-row-gap:1.25rem;row-gap:1.25rem}.xl\:row-gap-6{grid-row-gap:1.5rem;row-gap:1.5rem}.xl\:row-gap-8{grid-row-gap:2rem;row-gap:2rem}.xl\:row-gap-10{grid-row-gap:2.5rem;row-gap:2.5rem}.xl\:row-gap-12{grid-row-gap:3rem;row-gap:3rem}.xl\:row-gap-16{grid-row-gap:4rem;row-gap:4rem}.xl\:row-gap-20{grid-row-gap:5rem;row-gap:5rem}.xl\:row-gap-24{grid-row-gap:6rem;row-gap:6rem}.xl\:row-gap-32{grid-row-gap:8rem;row-gap:8rem}.xl\:row-gap-40{grid-row-gap:10rem;row-gap:10rem}.xl\:row-gap-48{grid-row-gap:12rem;row-gap:12rem}.xl\:row-gap-56{grid-row-gap:14rem;row-gap:14rem}.xl\:row-gap-64{grid-row-gap:16rem;row-gap:16rem}.xl\:row-gap-px{grid-row-gap:1px;row-gap:1px}.xl\:gap-y-0{grid-row-gap:0;row-gap:0}.xl\:gap-y-1{grid-row-gap:.25rem;row-gap:.25rem}.xl\:gap-y-2{grid-row-gap:.5rem;row-gap:.5rem}.xl\:gap-y-3{grid-row-gap:.75rem;row-gap:.75rem}.xl\:gap-y-4{grid-row-gap:1rem;row-gap:1rem}.xl\:gap-y-5{grid-row-gap:1.25rem;row-gap:1.25rem}.xl\:gap-y-6{grid-row-gap:1.5rem;row-gap:1.5rem}.xl\:gap-y-8{grid-row-gap:2rem;row-gap:2rem}.xl\:gap-y-10{grid-row-gap:2.5rem;row-gap:2.5rem}.xl\:gap-y-12{grid-row-gap:3rem;row-gap:3rem}.xl\:gap-y-16{grid-row-gap:4rem;row-gap:4rem}.xl\:gap-y-20{grid-row-gap:5rem;row-gap:5rem}.xl\:gap-y-24{grid-row-gap:6rem;row-gap:6rem}.xl\:gap-y-32{grid-row-gap:8rem;row-gap:8rem}.xl\:gap-y-40{grid-row-gap:10rem;row-gap:10rem}.xl\:gap-y-48{grid-row-gap:12rem;row-gap:12rem}.xl\:gap-y-56{grid-row-gap:14rem;row-gap:14rem}.xl\:gap-y-64{grid-row-gap:16rem;row-gap:16rem}.xl\:gap-y-px{grid-row-gap:1px;row-gap:1px}.xl\:grid-flow-row{grid-auto-flow:row}.xl\:grid-flow-col{grid-auto-flow:column}.xl\:grid-flow-row-dense{grid-auto-flow:row dense}.xl\:grid-flow-col-dense{grid-auto-flow:column dense}.xl\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.xl\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.xl\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.xl\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.xl\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.xl\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.xl\:grid-cols-none{grid-template-columns:none}.xl\:auto-cols-auto{grid-auto-columns:auto}.xl\:auto-cols-min{grid-auto-columns:-webkit-min-content;grid-auto-columns:min-content}.xl\:auto-cols-max{grid-auto-columns:-webkit-max-content;grid-auto-columns:max-content}.xl\:auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.xl\:col-auto{grid-column:auto}.xl\:col-span-1{grid-column:span 1/span 1}.xl\:col-span-2{grid-column:span 2/span 2}.xl\:col-span-3{grid-column:span 3/span 3}.xl\:col-span-4{grid-column:span 4/span 4}.xl\:col-span-5{grid-column:span 5/span 5}.xl\:col-span-6{grid-column:span 6/span 6}.xl\:col-span-7{grid-column:span 7/span 7}.xl\:col-span-8{grid-column:span 8/span 8}.xl\:col-span-9{grid-column:span 9/span 9}.xl\:col-span-10{grid-column:span 10/span 10}.xl\:col-span-11{grid-column:span 11/span 11}.xl\:col-span-12{grid-column:span 12/span 12}.xl\:col-span-full{grid-column:1/-1}.xl\:col-start-1{grid-column-start:1}.xl\:col-start-2{grid-column-start:2}.xl\:col-start-3{grid-column-start:3}.xl\:col-start-4{grid-column-start:4}.xl\:col-start-5{grid-column-start:5}.xl\:col-start-6{grid-column-start:6}.xl\:col-start-7{grid-column-start:7}.xl\:col-start-8{grid-column-start:8}.xl\:col-start-9{grid-column-start:9}.xl\:col-start-10{grid-column-start:10}.xl\:col-start-11{grid-column-start:11}.xl\:col-start-12{grid-column-start:12}.xl\:col-start-13{grid-column-start:13}.xl\:col-start-auto{grid-column-start:auto}.xl\:col-end-1{grid-column-end:1}.xl\:col-end-2{grid-column-end:2}.xl\:col-end-3{grid-column-end:3}.xl\:col-end-4{grid-column-end:4}.xl\:col-end-5{grid-column-end:5}.xl\:col-end-6{grid-column-end:6}.xl\:col-end-7{grid-column-end:7}.xl\:col-end-8{grid-column-end:8}.xl\:col-end-9{grid-column-end:9}.xl\:col-end-10{grid-column-end:10}.xl\:col-end-11{grid-column-end:11}.xl\:col-end-12{grid-column-end:12}.xl\:col-end-13{grid-column-end:13}.xl\:col-end-auto{grid-column-end:auto}.xl\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.xl\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.xl\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.xl\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.xl\:grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.xl\:grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.xl\:grid-rows-none{grid-template-rows:none}.xl\:auto-rows-auto{grid-auto-rows:auto}.xl\:auto-rows-min{grid-auto-rows:-webkit-min-content;grid-auto-rows:min-content}.xl\:auto-rows-max{grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}.xl\:auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.xl\:row-auto{grid-row:auto}.xl\:row-span-1{grid-row:span 1/span 1}.xl\:row-span-2{grid-row:span 2/span 2}.xl\:row-span-3{grid-row:span 3/span 3}.xl\:row-span-4{grid-row:span 4/span 4}.xl\:row-span-5{grid-row:span 5/span 5}.xl\:row-span-6{grid-row:span 6/span 6}.xl\:row-span-full{grid-row:1/-1}.xl\:row-start-1{grid-row-start:1}.xl\:row-start-2{grid-row-start:2}.xl\:row-start-3{grid-row-start:3}.xl\:row-start-4{grid-row-start:4}.xl\:row-start-5{grid-row-start:5}.xl\:row-start-6{grid-row-start:6}.xl\:row-start-7{grid-row-start:7}.xl\:row-start-auto{grid-row-start:auto}.xl\:row-end-1{grid-row-end:1}.xl\:row-end-2{grid-row-end:2}.xl\:row-end-3{grid-row-end:3}.xl\:row-end-4{grid-row-end:4}.xl\:row-end-5{grid-row-end:5}.xl\:row-end-6{grid-row-end:6}.xl\:row-end-7{grid-row-end:7}.xl\:row-end-auto{grid-row-end:auto}.xl\:transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.xl\:transform-none{transform:none}.xl\:origin-center{transform-origin:center}.xl\:origin-top{transform-origin:top}.xl\:origin-top-right{transform-origin:top right}.xl\:origin-right{transform-origin:right}.xl\:origin-bottom-right{transform-origin:bottom right}.xl\:origin-bottom{transform-origin:bottom}.xl\:origin-bottom-left{transform-origin:bottom left}.xl\:origin-left{transform-origin:left}.xl\:origin-top-left{transform-origin:top left}.xl\:scale-0{--transform-scale-x:0;--transform-scale-y:0}.xl\:scale-50{--transform-scale-x:.5;--transform-scale-y:.5}.xl\:scale-75{--transform-scale-x:.75;--transform-scale-y:.75}.xl\:scale-90{--transform-scale-x:.9;--transform-scale-y:.9}.xl\:scale-95{--transform-scale-x:.95;--transform-scale-y:.95}.xl\:scale-100{--transform-scale-x:1;--transform-scale-y:1}.xl\:scale-105{--transform-scale-x:1.05;--transform-scale-y:1.05}.xl\:scale-110{--transform-scale-x:1.1;--transform-scale-y:1.1}.xl\:scale-125{--transform-scale-x:1.25;--transform-scale-y:1.25}.xl\:scale-150{--transform-scale-x:1.5;--transform-scale-y:1.5}.xl\:scale-x-0{--transform-scale-x:0}.xl\:scale-x-50{--transform-scale-x:.5}.xl\:scale-x-75{--transform-scale-x:.75}.xl\:scale-x-90{--transform-scale-x:.9}.xl\:scale-x-95{--transform-scale-x:.95}.xl\:scale-x-100{--transform-scale-x:1}.xl\:scale-x-105{--transform-scale-x:1.05}.xl\:scale-x-110{--transform-scale-x:1.1}.xl\:scale-x-125{--transform-scale-x:1.25}.xl\:scale-x-150{--transform-scale-x:1.5}.xl\:scale-y-0{--transform-scale-y:0}.xl\:scale-y-50{--transform-scale-y:.5}.xl\:scale-y-75{--transform-scale-y:.75}.xl\:scale-y-90{--transform-scale-y:.9}.xl\:scale-y-95{--transform-scale-y:.95}.xl\:scale-y-100{--transform-scale-y:1}.xl\:scale-y-105{--transform-scale-y:1.05}.xl\:scale-y-110{--transform-scale-y:1.1}.xl\:scale-y-125{--transform-scale-y:1.25}.xl\:scale-y-150{--transform-scale-y:1.5}.xl\:hover\:scale-0:hover{--transform-scale-x:0;--transform-scale-y:0}.xl\:hover\:scale-50:hover{--transform-scale-x:.5;--transform-scale-y:.5}.xl\:hover\:scale-75:hover{--transform-scale-x:.75;--transform-scale-y:.75}.xl\:hover\:scale-90:hover{--transform-scale-x:.9;--transform-scale-y:.9}.xl\:hover\:scale-95:hover{--transform-scale-x:.95;--transform-scale-y:.95}.xl\:hover\:scale-100:hover{--transform-scale-x:1;--transform-scale-y:1}.xl\:hover\:scale-105:hover{--transform-scale-x:1.05;--transform-scale-y:1.05}.xl\:hover\:scale-110:hover{--transform-scale-x:1.1;--transform-scale-y:1.1}.xl\:hover\:scale-125:hover{--transform-scale-x:1.25;--transform-scale-y:1.25}.xl\:hover\:scale-150:hover{--transform-scale-x:1.5;--transform-scale-y:1.5}.xl\:hover\:scale-x-0:hover{--transform-scale-x:0}.xl\:hover\:scale-x-50:hover{--transform-scale-x:.5}.xl\:hover\:scale-x-75:hover{--transform-scale-x:.75}.xl\:hover\:scale-x-90:hover{--transform-scale-x:.9}.xl\:hover\:scale-x-95:hover{--transform-scale-x:.95}.xl\:hover\:scale-x-100:hover{--transform-scale-x:1}.xl\:hover\:scale-x-105:hover{--transform-scale-x:1.05}.xl\:hover\:scale-x-110:hover{--transform-scale-x:1.1}.xl\:hover\:scale-x-125:hover{--transform-scale-x:1.25}.xl\:hover\:scale-x-150:hover{--transform-scale-x:1.5}.xl\:hover\:scale-y-0:hover{--transform-scale-y:0}.xl\:hover\:scale-y-50:hover{--transform-scale-y:.5}.xl\:hover\:scale-y-75:hover{--transform-scale-y:.75}.xl\:hover\:scale-y-90:hover{--transform-scale-y:.9}.xl\:hover\:scale-y-95:hover{--transform-scale-y:.95}.xl\:hover\:scale-y-100:hover{--transform-scale-y:1}.xl\:hover\:scale-y-105:hover{--transform-scale-y:1.05}.xl\:hover\:scale-y-110:hover{--transform-scale-y:1.1}.xl\:hover\:scale-y-125:hover{--transform-scale-y:1.25}.xl\:hover\:scale-y-150:hover{--transform-scale-y:1.5}.xl\:focus\:scale-0:focus{--transform-scale-x:0;--transform-scale-y:0}.xl\:focus\:scale-50:focus{--transform-scale-x:.5;--transform-scale-y:.5}.xl\:focus\:scale-75:focus{--transform-scale-x:.75;--transform-scale-y:.75}.xl\:focus\:scale-90:focus{--transform-scale-x:.9;--transform-scale-y:.9}.xl\:focus\:scale-95:focus{--transform-scale-x:.95;--transform-scale-y:.95}.xl\:focus\:scale-100:focus{--transform-scale-x:1;--transform-scale-y:1}.xl\:focus\:scale-105:focus{--transform-scale-x:1.05;--transform-scale-y:1.05}.xl\:focus\:scale-110:focus{--transform-scale-x:1.1;--transform-scale-y:1.1}.xl\:focus\:scale-125:focus{--transform-scale-x:1.25;--transform-scale-y:1.25}.xl\:focus\:scale-150:focus{--transform-scale-x:1.5;--transform-scale-y:1.5}.xl\:focus\:scale-x-0:focus{--transform-scale-x:0}.xl\:focus\:scale-x-50:focus{--transform-scale-x:.5}.xl\:focus\:scale-x-75:focus{--transform-scale-x:.75}.xl\:focus\:scale-x-90:focus{--transform-scale-x:.9}.xl\:focus\:scale-x-95:focus{--transform-scale-x:.95}.xl\:focus\:scale-x-100:focus{--transform-scale-x:1}.xl\:focus\:scale-x-105:focus{--transform-scale-x:1.05}.xl\:focus\:scale-x-110:focus{--transform-scale-x:1.1}.xl\:focus\:scale-x-125:focus{--transform-scale-x:1.25}.xl\:focus\:scale-x-150:focus{--transform-scale-x:1.5}.xl\:focus\:scale-y-0:focus{--transform-scale-y:0}.xl\:focus\:scale-y-50:focus{--transform-scale-y:.5}.xl\:focus\:scale-y-75:focus{--transform-scale-y:.75}.xl\:focus\:scale-y-90:focus{--transform-scale-y:.9}.xl\:focus\:scale-y-95:focus{--transform-scale-y:.95}.xl\:focus\:scale-y-100:focus{--transform-scale-y:1}.xl\:focus\:scale-y-105:focus{--transform-scale-y:1.05}.xl\:focus\:scale-y-110:focus{--transform-scale-y:1.1}.xl\:focus\:scale-y-125:focus{--transform-scale-y:1.25}.xl\:focus\:scale-y-150:focus{--transform-scale-y:1.5}.xl\:rotate-0{--transform-rotate:0}.xl\:rotate-1{--transform-rotate:1deg}.xl\:rotate-2{--transform-rotate:2deg}.xl\:rotate-3{--transform-rotate:3deg}.xl\:rotate-6{--transform-rotate:6deg}.xl\:rotate-12{--transform-rotate:12deg}.xl\:rotate-45{--transform-rotate:45deg}.xl\:rotate-90{--transform-rotate:90deg}.xl\:rotate-180{--transform-rotate:180deg}.xl\:-rotate-180{--transform-rotate:-180deg}.xl\:-rotate-90{--transform-rotate:-90deg}.xl\:-rotate-45{--transform-rotate:-45deg}.xl\:-rotate-12{--transform-rotate:-12deg}.xl\:-rotate-6{--transform-rotate:-6deg}.xl\:-rotate-3{--transform-rotate:-3deg}.xl\:-rotate-2{--transform-rotate:-2deg}.xl\:-rotate-1{--transform-rotate:-1deg}.xl\:hover\:rotate-0:hover{--transform-rotate:0}.xl\:hover\:rotate-1:hover{--transform-rotate:1deg}.xl\:hover\:rotate-2:hover{--transform-rotate:2deg}.xl\:hover\:rotate-3:hover{--transform-rotate:3deg}.xl\:hover\:rotate-6:hover{--transform-rotate:6deg}.xl\:hover\:rotate-12:hover{--transform-rotate:12deg}.xl\:hover\:rotate-45:hover{--transform-rotate:45deg}.xl\:hover\:rotate-90:hover{--transform-rotate:90deg}.xl\:hover\:rotate-180:hover{--transform-rotate:180deg}.xl\:hover\:-rotate-180:hover{--transform-rotate:-180deg}.xl\:hover\:-rotate-90:hover{--transform-rotate:-90deg}.xl\:hover\:-rotate-45:hover{--transform-rotate:-45deg}.xl\:hover\:-rotate-12:hover{--transform-rotate:-12deg}.xl\:hover\:-rotate-6:hover{--transform-rotate:-6deg}.xl\:hover\:-rotate-3:hover{--transform-rotate:-3deg}.xl\:hover\:-rotate-2:hover{--transform-rotate:-2deg}.xl\:hover\:-rotate-1:hover{--transform-rotate:-1deg}.xl\:focus\:rotate-0:focus{--transform-rotate:0}.xl\:focus\:rotate-1:focus{--transform-rotate:1deg}.xl\:focus\:rotate-2:focus{--transform-rotate:2deg}.xl\:focus\:rotate-3:focus{--transform-rotate:3deg}.xl\:focus\:rotate-6:focus{--transform-rotate:6deg}.xl\:focus\:rotate-12:focus{--transform-rotate:12deg}.xl\:focus\:rotate-45:focus{--transform-rotate:45deg}.xl\:focus\:rotate-90:focus{--transform-rotate:90deg}.xl\:focus\:rotate-180:focus{--transform-rotate:180deg}.xl\:focus\:-rotate-180:focus{--transform-rotate:-180deg}.xl\:focus\:-rotate-90:focus{--transform-rotate:-90deg}.xl\:focus\:-rotate-45:focus{--transform-rotate:-45deg}.xl\:focus\:-rotate-12:focus{--transform-rotate:-12deg}.xl\:focus\:-rotate-6:focus{--transform-rotate:-6deg}.xl\:focus\:-rotate-3:focus{--transform-rotate:-3deg}.xl\:focus\:-rotate-2:focus{--transform-rotate:-2deg}.xl\:focus\:-rotate-1:focus{--transform-rotate:-1deg}.xl\:translate-x-0{--transform-translate-x:0}.xl\:translate-x-1{--transform-translate-x:0.25rem}.xl\:translate-x-2{--transform-translate-x:0.5rem}.xl\:translate-x-3{--transform-translate-x:0.75rem}.xl\:translate-x-4{--transform-translate-x:1rem}.xl\:translate-x-5{--transform-translate-x:1.25rem}.xl\:translate-x-6{--transform-translate-x:1.5rem}.xl\:translate-x-8{--transform-translate-x:2rem}.xl\:translate-x-10{--transform-translate-x:2.5rem}.xl\:translate-x-12{--transform-translate-x:3rem}.xl\:translate-x-16{--transform-translate-x:4rem}.xl\:translate-x-20{--transform-translate-x:5rem}.xl\:translate-x-24{--transform-translate-x:6rem}.xl\:translate-x-32{--transform-translate-x:8rem}.xl\:translate-x-40{--transform-translate-x:10rem}.xl\:translate-x-48{--transform-translate-x:12rem}.xl\:translate-x-56{--transform-translate-x:14rem}.xl\:translate-x-64{--transform-translate-x:16rem}.xl\:translate-x-px{--transform-translate-x:1px}.xl\:-translate-x-1{--transform-translate-x:-0.25rem}.xl\:-translate-x-2{--transform-translate-x:-0.5rem}.xl\:-translate-x-3{--transform-translate-x:-0.75rem}.xl\:-translate-x-4{--transform-translate-x:-1rem}.xl\:-translate-x-5{--transform-translate-x:-1.25rem}.xl\:-translate-x-6{--transform-translate-x:-1.5rem}.xl\:-translate-x-8{--transform-translate-x:-2rem}.xl\:-translate-x-10{--transform-translate-x:-2.5rem}.xl\:-translate-x-12{--transform-translate-x:-3rem}.xl\:-translate-x-16{--transform-translate-x:-4rem}.xl\:-translate-x-20{--transform-translate-x:-5rem}.xl\:-translate-x-24{--transform-translate-x:-6rem}.xl\:-translate-x-32{--transform-translate-x:-8rem}.xl\:-translate-x-40{--transform-translate-x:-10rem}.xl\:-translate-x-48{--transform-translate-x:-12rem}.xl\:-translate-x-56{--transform-translate-x:-14rem}.xl\:-translate-x-64{--transform-translate-x:-16rem}.xl\:-translate-x-px{--transform-translate-x:-1px}.xl\:-translate-x-full{--transform-translate-x:-100%}.xl\:-translate-x-1\/2{--transform-translate-x:-50%}.xl\:translate-x-1\/2{--transform-translate-x:50%}.xl\:translate-x-full{--transform-translate-x:100%}.xl\:translate-y-0{--transform-translate-y:0}.xl\:translate-y-1{--transform-translate-y:0.25rem}.xl\:translate-y-2{--transform-translate-y:0.5rem}.xl\:translate-y-3{--transform-translate-y:0.75rem}.xl\:translate-y-4{--transform-translate-y:1rem}.xl\:translate-y-5{--transform-translate-y:1.25rem}.xl\:translate-y-6{--transform-translate-y:1.5rem}.xl\:translate-y-8{--transform-translate-y:2rem}.xl\:translate-y-10{--transform-translate-y:2.5rem}.xl\:translate-y-12{--transform-translate-y:3rem}.xl\:translate-y-16{--transform-translate-y:4rem}.xl\:translate-y-20{--transform-translate-y:5rem}.xl\:translate-y-24{--transform-translate-y:6rem}.xl\:translate-y-32{--transform-translate-y:8rem}.xl\:translate-y-40{--transform-translate-y:10rem}.xl\:translate-y-48{--transform-translate-y:12rem}.xl\:translate-y-56{--transform-translate-y:14rem}.xl\:translate-y-64{--transform-translate-y:16rem}.xl\:translate-y-px{--transform-translate-y:1px}.xl\:-translate-y-1{--transform-translate-y:-0.25rem}.xl\:-translate-y-2{--transform-translate-y:-0.5rem}.xl\:-translate-y-3{--transform-translate-y:-0.75rem}.xl\:-translate-y-4{--transform-translate-y:-1rem}.xl\:-translate-y-5{--transform-translate-y:-1.25rem}.xl\:-translate-y-6{--transform-translate-y:-1.5rem}.xl\:-translate-y-8{--transform-translate-y:-2rem}.xl\:-translate-y-10{--transform-translate-y:-2.5rem}.xl\:-translate-y-12{--transform-translate-y:-3rem}.xl\:-translate-y-16{--transform-translate-y:-4rem}.xl\:-translate-y-20{--transform-translate-y:-5rem}.xl\:-translate-y-24{--transform-translate-y:-6rem}.xl\:-translate-y-32{--transform-translate-y:-8rem}.xl\:-translate-y-40{--transform-translate-y:-10rem}.xl\:-translate-y-48{--transform-translate-y:-12rem}.xl\:-translate-y-56{--transform-translate-y:-14rem}.xl\:-translate-y-64{--transform-translate-y:-16rem}.xl\:-translate-y-px{--transform-translate-y:-1px}.xl\:-translate-y-full{--transform-translate-y:-100%}.xl\:-translate-y-1\/2{--transform-translate-y:-50%}.xl\:translate-y-1\/2{--transform-translate-y:50%}.xl\:translate-y-full{--transform-translate-y:100%}.xl\:hover\:translate-x-0:hover{--transform-translate-x:0}.xl\:hover\:translate-x-1:hover{--transform-translate-x:0.25rem}.xl\:hover\:translate-x-2:hover{--transform-translate-x:0.5rem}.xl\:hover\:translate-x-3:hover{--transform-translate-x:0.75rem}.xl\:hover\:translate-x-4:hover{--transform-translate-x:1rem}.xl\:hover\:translate-x-5:hover{--transform-translate-x:1.25rem}.xl\:hover\:translate-x-6:hover{--transform-translate-x:1.5rem}.xl\:hover\:translate-x-8:hover{--transform-translate-x:2rem}.xl\:hover\:translate-x-10:hover{--transform-translate-x:2.5rem}.xl\:hover\:translate-x-12:hover{--transform-translate-x:3rem}.xl\:hover\:translate-x-16:hover{--transform-translate-x:4rem}.xl\:hover\:translate-x-20:hover{--transform-translate-x:5rem}.xl\:hover\:translate-x-24:hover{--transform-translate-x:6rem}.xl\:hover\:translate-x-32:hover{--transform-translate-x:8rem}.xl\:hover\:translate-x-40:hover{--transform-translate-x:10rem}.xl\:hover\:translate-x-48:hover{--transform-translate-x:12rem}.xl\:hover\:translate-x-56:hover{--transform-translate-x:14rem}.xl\:hover\:translate-x-64:hover{--transform-translate-x:16rem}.xl\:hover\:translate-x-px:hover{--transform-translate-x:1px}.xl\:hover\:-translate-x-1:hover{--transform-translate-x:-0.25rem}.xl\:hover\:-translate-x-2:hover{--transform-translate-x:-0.5rem}.xl\:hover\:-translate-x-3:hover{--transform-translate-x:-0.75rem}.xl\:hover\:-translate-x-4:hover{--transform-translate-x:-1rem}.xl\:hover\:-translate-x-5:hover{--transform-translate-x:-1.25rem}.xl\:hover\:-translate-x-6:hover{--transform-translate-x:-1.5rem}.xl\:hover\:-translate-x-8:hover{--transform-translate-x:-2rem}.xl\:hover\:-translate-x-10:hover{--transform-translate-x:-2.5rem}.xl\:hover\:-translate-x-12:hover{--transform-translate-x:-3rem}.xl\:hover\:-translate-x-16:hover{--transform-translate-x:-4rem}.xl\:hover\:-translate-x-20:hover{--transform-translate-x:-5rem}.xl\:hover\:-translate-x-24:hover{--transform-translate-x:-6rem}.xl\:hover\:-translate-x-32:hover{--transform-translate-x:-8rem}.xl\:hover\:-translate-x-40:hover{--transform-translate-x:-10rem}.xl\:hover\:-translate-x-48:hover{--transform-translate-x:-12rem}.xl\:hover\:-translate-x-56:hover{--transform-translate-x:-14rem}.xl\:hover\:-translate-x-64:hover{--transform-translate-x:-16rem}.xl\:hover\:-translate-x-px:hover{--transform-translate-x:-1px}.xl\:hover\:-translate-x-full:hover{--transform-translate-x:-100%}.xl\:hover\:-translate-x-1\/2:hover{--transform-translate-x:-50%}.xl\:hover\:translate-x-1\/2:hover{--transform-translate-x:50%}.xl\:hover\:translate-x-full:hover{--transform-translate-x:100%}.xl\:hover\:translate-y-0:hover{--transform-translate-y:0}.xl\:hover\:translate-y-1:hover{--transform-translate-y:0.25rem}.xl\:hover\:translate-y-2:hover{--transform-translate-y:0.5rem}.xl\:hover\:translate-y-3:hover{--transform-translate-y:0.75rem}.xl\:hover\:translate-y-4:hover{--transform-translate-y:1rem}.xl\:hover\:translate-y-5:hover{--transform-translate-y:1.25rem}.xl\:hover\:translate-y-6:hover{--transform-translate-y:1.5rem}.xl\:hover\:translate-y-8:hover{--transform-translate-y:2rem}.xl\:hover\:translate-y-10:hover{--transform-translate-y:2.5rem}.xl\:hover\:translate-y-12:hover{--transform-translate-y:3rem}.xl\:hover\:translate-y-16:hover{--transform-translate-y:4rem}.xl\:hover\:translate-y-20:hover{--transform-translate-y:5rem}.xl\:hover\:translate-y-24:hover{--transform-translate-y:6rem}.xl\:hover\:translate-y-32:hover{--transform-translate-y:8rem}.xl\:hover\:translate-y-40:hover{--transform-translate-y:10rem}.xl\:hover\:translate-y-48:hover{--transform-translate-y:12rem}.xl\:hover\:translate-y-56:hover{--transform-translate-y:14rem}.xl\:hover\:translate-y-64:hover{--transform-translate-y:16rem}.xl\:hover\:translate-y-px:hover{--transform-translate-y:1px}.xl\:hover\:-translate-y-1:hover{--transform-translate-y:-0.25rem}.xl\:hover\:-translate-y-2:hover{--transform-translate-y:-0.5rem}.xl\:hover\:-translate-y-3:hover{--transform-translate-y:-0.75rem}.xl\:hover\:-translate-y-4:hover{--transform-translate-y:-1rem}.xl\:hover\:-translate-y-5:hover{--transform-translate-y:-1.25rem}.xl\:hover\:-translate-y-6:hover{--transform-translate-y:-1.5rem}.xl\:hover\:-translate-y-8:hover{--transform-translate-y:-2rem}.xl\:hover\:-translate-y-10:hover{--transform-translate-y:-2.5rem}.xl\:hover\:-translate-y-12:hover{--transform-translate-y:-3rem}.xl\:hover\:-translate-y-16:hover{--transform-translate-y:-4rem}.xl\:hover\:-translate-y-20:hover{--transform-translate-y:-5rem}.xl\:hover\:-translate-y-24:hover{--transform-translate-y:-6rem}.xl\:hover\:-translate-y-32:hover{--transform-translate-y:-8rem}.xl\:hover\:-translate-y-40:hover{--transform-translate-y:-10rem}.xl\:hover\:-translate-y-48:hover{--transform-translate-y:-12rem}.xl\:hover\:-translate-y-56:hover{--transform-translate-y:-14rem}.xl\:hover\:-translate-y-64:hover{--transform-translate-y:-16rem}.xl\:hover\:-translate-y-px:hover{--transform-translate-y:-1px}.xl\:hover\:-translate-y-full:hover{--transform-translate-y:-100%}.xl\:hover\:-translate-y-1\/2:hover{--transform-translate-y:-50%}.xl\:hover\:translate-y-1\/2:hover{--transform-translate-y:50%}.xl\:hover\:translate-y-full:hover{--transform-translate-y:100%}.xl\:focus\:translate-x-0:focus{--transform-translate-x:0}.xl\:focus\:translate-x-1:focus{--transform-translate-x:0.25rem}.xl\:focus\:translate-x-2:focus{--transform-translate-x:0.5rem}.xl\:focus\:translate-x-3:focus{--transform-translate-x:0.75rem}.xl\:focus\:translate-x-4:focus{--transform-translate-x:1rem}.xl\:focus\:translate-x-5:focus{--transform-translate-x:1.25rem}.xl\:focus\:translate-x-6:focus{--transform-translate-x:1.5rem}.xl\:focus\:translate-x-8:focus{--transform-translate-x:2rem}.xl\:focus\:translate-x-10:focus{--transform-translate-x:2.5rem}.xl\:focus\:translate-x-12:focus{--transform-translate-x:3rem}.xl\:focus\:translate-x-16:focus{--transform-translate-x:4rem}.xl\:focus\:translate-x-20:focus{--transform-translate-x:5rem}.xl\:focus\:translate-x-24:focus{--transform-translate-x:6rem}.xl\:focus\:translate-x-32:focus{--transform-translate-x:8rem}.xl\:focus\:translate-x-40:focus{--transform-translate-x:10rem}.xl\:focus\:translate-x-48:focus{--transform-translate-x:12rem}.xl\:focus\:translate-x-56:focus{--transform-translate-x:14rem}.xl\:focus\:translate-x-64:focus{--transform-translate-x:16rem}.xl\:focus\:translate-x-px:focus{--transform-translate-x:1px}.xl\:focus\:-translate-x-1:focus{--transform-translate-x:-0.25rem}.xl\:focus\:-translate-x-2:focus{--transform-translate-x:-0.5rem}.xl\:focus\:-translate-x-3:focus{--transform-translate-x:-0.75rem}.xl\:focus\:-translate-x-4:focus{--transform-translate-x:-1rem}.xl\:focus\:-translate-x-5:focus{--transform-translate-x:-1.25rem}.xl\:focus\:-translate-x-6:focus{--transform-translate-x:-1.5rem}.xl\:focus\:-translate-x-8:focus{--transform-translate-x:-2rem}.xl\:focus\:-translate-x-10:focus{--transform-translate-x:-2.5rem}.xl\:focus\:-translate-x-12:focus{--transform-translate-x:-3rem}.xl\:focus\:-translate-x-16:focus{--transform-translate-x:-4rem}.xl\:focus\:-translate-x-20:focus{--transform-translate-x:-5rem}.xl\:focus\:-translate-x-24:focus{--transform-translate-x:-6rem}.xl\:focus\:-translate-x-32:focus{--transform-translate-x:-8rem}.xl\:focus\:-translate-x-40:focus{--transform-translate-x:-10rem}.xl\:focus\:-translate-x-48:focus{--transform-translate-x:-12rem}.xl\:focus\:-translate-x-56:focus{--transform-translate-x:-14rem}.xl\:focus\:-translate-x-64:focus{--transform-translate-x:-16rem}.xl\:focus\:-translate-x-px:focus{--transform-translate-x:-1px}.xl\:focus\:-translate-x-full:focus{--transform-translate-x:-100%}.xl\:focus\:-translate-x-1\/2:focus{--transform-translate-x:-50%}.xl\:focus\:translate-x-1\/2:focus{--transform-translate-x:50%}.xl\:focus\:translate-x-full:focus{--transform-translate-x:100%}.xl\:focus\:translate-y-0:focus{--transform-translate-y:0}.xl\:focus\:translate-y-1:focus{--transform-translate-y:0.25rem}.xl\:focus\:translate-y-2:focus{--transform-translate-y:0.5rem}.xl\:focus\:translate-y-3:focus{--transform-translate-y:0.75rem}.xl\:focus\:translate-y-4:focus{--transform-translate-y:1rem}.xl\:focus\:translate-y-5:focus{--transform-translate-y:1.25rem}.xl\:focus\:translate-y-6:focus{--transform-translate-y:1.5rem}.xl\:focus\:translate-y-8:focus{--transform-translate-y:2rem}.xl\:focus\:translate-y-10:focus{--transform-translate-y:2.5rem}.xl\:focus\:translate-y-12:focus{--transform-translate-y:3rem}.xl\:focus\:translate-y-16:focus{--transform-translate-y:4rem}.xl\:focus\:translate-y-20:focus{--transform-translate-y:5rem}.xl\:focus\:translate-y-24:focus{--transform-translate-y:6rem}.xl\:focus\:translate-y-32:focus{--transform-translate-y:8rem}.xl\:focus\:translate-y-40:focus{--transform-translate-y:10rem}.xl\:focus\:translate-y-48:focus{--transform-translate-y:12rem}.xl\:focus\:translate-y-56:focus{--transform-translate-y:14rem}.xl\:focus\:translate-y-64:focus{--transform-translate-y:16rem}.xl\:focus\:translate-y-px:focus{--transform-translate-y:1px}.xl\:focus\:-translate-y-1:focus{--transform-translate-y:-0.25rem}.xl\:focus\:-translate-y-2:focus{--transform-translate-y:-0.5rem}.xl\:focus\:-translate-y-3:focus{--transform-translate-y:-0.75rem}.xl\:focus\:-translate-y-4:focus{--transform-translate-y:-1rem}.xl\:focus\:-translate-y-5:focus{--transform-translate-y:-1.25rem}.xl\:focus\:-translate-y-6:focus{--transform-translate-y:-1.5rem}.xl\:focus\:-translate-y-8:focus{--transform-translate-y:-2rem}.xl\:focus\:-translate-y-10:focus{--transform-translate-y:-2.5rem}.xl\:focus\:-translate-y-12:focus{--transform-translate-y:-3rem}.xl\:focus\:-translate-y-16:focus{--transform-translate-y:-4rem}.xl\:focus\:-translate-y-20:focus{--transform-translate-y:-5rem}.xl\:focus\:-translate-y-24:focus{--transform-translate-y:-6rem}.xl\:focus\:-translate-y-32:focus{--transform-translate-y:-8rem}.xl\:focus\:-translate-y-40:focus{--transform-translate-y:-10rem}.xl\:focus\:-translate-y-48:focus{--transform-translate-y:-12rem}.xl\:focus\:-translate-y-56:focus{--transform-translate-y:-14rem}.xl\:focus\:-translate-y-64:focus{--transform-translate-y:-16rem}.xl\:focus\:-translate-y-px:focus{--transform-translate-y:-1px}.xl\:focus\:-translate-y-full:focus{--transform-translate-y:-100%}.xl\:focus\:-translate-y-1\/2:focus{--transform-translate-y:-50%}.xl\:focus\:translate-y-1\/2:focus{--transform-translate-y:50%}.xl\:focus\:translate-y-full:focus{--transform-translate-y:100%}.xl\:skew-x-0{--transform-skew-x:0}.xl\:skew-x-1{--transform-skew-x:1deg}.xl\:skew-x-2{--transform-skew-x:2deg}.xl\:skew-x-3{--transform-skew-x:3deg}.xl\:skew-x-6{--transform-skew-x:6deg}.xl\:skew-x-12{--transform-skew-x:12deg}.xl\:-skew-x-12{--transform-skew-x:-12deg}.xl\:-skew-x-6{--transform-skew-x:-6deg}.xl\:-skew-x-3{--transform-skew-x:-3deg}.xl\:-skew-x-2{--transform-skew-x:-2deg}.xl\:-skew-x-1{--transform-skew-x:-1deg}.xl\:skew-y-0{--transform-skew-y:0}.xl\:skew-y-1{--transform-skew-y:1deg}.xl\:skew-y-2{--transform-skew-y:2deg}.xl\:skew-y-3{--transform-skew-y:3deg}.xl\:skew-y-6{--transform-skew-y:6deg}.xl\:skew-y-12{--transform-skew-y:12deg}.xl\:-skew-y-12{--transform-skew-y:-12deg}.xl\:-skew-y-6{--transform-skew-y:-6deg}.xl\:-skew-y-3{--transform-skew-y:-3deg}.xl\:-skew-y-2{--transform-skew-y:-2deg}.xl\:-skew-y-1{--transform-skew-y:-1deg}.xl\:hover\:skew-x-0:hover{--transform-skew-x:0}.xl\:hover\:skew-x-1:hover{--transform-skew-x:1deg}.xl\:hover\:skew-x-2:hover{--transform-skew-x:2deg}.xl\:hover\:skew-x-3:hover{--transform-skew-x:3deg}.xl\:hover\:skew-x-6:hover{--transform-skew-x:6deg}.xl\:hover\:skew-x-12:hover{--transform-skew-x:12deg}.xl\:hover\:-skew-x-12:hover{--transform-skew-x:-12deg}.xl\:hover\:-skew-x-6:hover{--transform-skew-x:-6deg}.xl\:hover\:-skew-x-3:hover{--transform-skew-x:-3deg}.xl\:hover\:-skew-x-2:hover{--transform-skew-x:-2deg}.xl\:hover\:-skew-x-1:hover{--transform-skew-x:-1deg}.xl\:hover\:skew-y-0:hover{--transform-skew-y:0}.xl\:hover\:skew-y-1:hover{--transform-skew-y:1deg}.xl\:hover\:skew-y-2:hover{--transform-skew-y:2deg}.xl\:hover\:skew-y-3:hover{--transform-skew-y:3deg}.xl\:hover\:skew-y-6:hover{--transform-skew-y:6deg}.xl\:hover\:skew-y-12:hover{--transform-skew-y:12deg}.xl\:hover\:-skew-y-12:hover{--transform-skew-y:-12deg}.xl\:hover\:-skew-y-6:hover{--transform-skew-y:-6deg}.xl\:hover\:-skew-y-3:hover{--transform-skew-y:-3deg}.xl\:hover\:-skew-y-2:hover{--transform-skew-y:-2deg}.xl\:hover\:-skew-y-1:hover{--transform-skew-y:-1deg}.xl\:focus\:skew-x-0:focus{--transform-skew-x:0}.xl\:focus\:skew-x-1:focus{--transform-skew-x:1deg}.xl\:focus\:skew-x-2:focus{--transform-skew-x:2deg}.xl\:focus\:skew-x-3:focus{--transform-skew-x:3deg}.xl\:focus\:skew-x-6:focus{--transform-skew-x:6deg}.xl\:focus\:skew-x-12:focus{--transform-skew-x:12deg}.xl\:focus\:-skew-x-12:focus{--transform-skew-x:-12deg}.xl\:focus\:-skew-x-6:focus{--transform-skew-x:-6deg}.xl\:focus\:-skew-x-3:focus{--transform-skew-x:-3deg}.xl\:focus\:-skew-x-2:focus{--transform-skew-x:-2deg}.xl\:focus\:-skew-x-1:focus{--transform-skew-x:-1deg}.xl\:focus\:skew-y-0:focus{--transform-skew-y:0}.xl\:focus\:skew-y-1:focus{--transform-skew-y:1deg}.xl\:focus\:skew-y-2:focus{--transform-skew-y:2deg}.xl\:focus\:skew-y-3:focus{--transform-skew-y:3deg}.xl\:focus\:skew-y-6:focus{--transform-skew-y:6deg}.xl\:focus\:skew-y-12:focus{--transform-skew-y:12deg}.xl\:focus\:-skew-y-12:focus{--transform-skew-y:-12deg}.xl\:focus\:-skew-y-6:focus{--transform-skew-y:-6deg}.xl\:focus\:-skew-y-3:focus{--transform-skew-y:-3deg}.xl\:focus\:-skew-y-2:focus{--transform-skew-y:-2deg}.xl\:focus\:-skew-y-1:focus{--transform-skew-y:-1deg}.xl\:transition-none{transition-property:none}.xl\:transition-all{transition-property:all}.xl\:transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform}.xl\:transition-colors{transition-property:background-color,border-color,color,fill,stroke}.xl\:transition-opacity{transition-property:opacity}.xl\:transition-shadow{transition-property:box-shadow}.xl\:transition-transform{transition-property:transform}.xl\:ease-linear{transition-timing-function:linear}.xl\:ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.xl\:ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.xl\:ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.xl\:duration-75{transition-duration:75ms}.xl\:duration-100{transition-duration:.1s}.xl\:duration-150{transition-duration:150ms}.xl\:duration-200{transition-duration:.2s}.xl\:duration-300{transition-duration:.3s}.xl\:duration-500{transition-duration:.5s}.xl\:duration-700{transition-duration:.7s}.xl\:duration-1000{transition-duration:1s}.xl\:delay-75{transition-delay:75ms}.xl\:delay-100{transition-delay:.1s}.xl\:delay-150{transition-delay:150ms}.xl\:delay-200{transition-delay:.2s}.xl\:delay-300{transition-delay:.3s}.xl\:delay-500{transition-delay:.5s}.xl\:delay-700{transition-delay:.7s}.xl\:delay-1000{transition-delay:1s}.xl\:animate-none{animation:none}.xl\:animate-spin{animation:spin 1s linear infinite}.xl\:animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.xl\:animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.xl\:animate-bounce{animation:bounce 1s infinite}} \ No newline at end of file diff --git a/test/configCases/css/large/use-style.js b/test/configCases/css/large/use-style.js new file mode 100644 index 00000000000..8f394120676 --- /dev/null +++ b/test/configCases/css/large/use-style.js @@ -0,0 +1,5 @@ +import * as style from "./tailwind.module.css"; + +export default { + placeholder: style["placeholder-gray-700"] +}; diff --git a/test/configCases/css/large/webpack.config.js b/test/configCases/css/large/webpack.config.js new file mode 100644 index 00000000000..c6289845d73 --- /dev/null +++ b/test/configCases/css/large/webpack.config.js @@ -0,0 +1,21 @@ +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + target: "web", + mode: "development", + output: { + uniqueName: "my-app" + }, + experiments: { + css: true + } + }, + { + target: "web", + mode: "production", + performance: false, + experiments: { + css: true + } + } +]; diff --git a/test/configCases/css/local-ident-name/index.js b/test/configCases/css/local-ident-name/index.js new file mode 100644 index 00000000000..816c494697a --- /dev/null +++ b/test/configCases/css/local-ident-name/index.js @@ -0,0 +1,22 @@ +it("should have correct local ident for css export locals", (done) => { + Promise.all([ + import("./style.module.css"), + import("./style.module.css?hash"), + import("./style.module.css?hash-local"), + import("./style.module.css?path-name-local"), + import("./style.module.css?file-local"), + import("./style.module.css?q#f"), + import("./style.module.css?uniqueName-id-contenthash"), + import("./style.module.less"), + ]).then(([idLocal, hash, hashLocal, pathNameLocal, fileLocal, queryFragment, uniqueNameIdContenthash, less]) => { + expect(idLocal).toMatchSnapshot(); + expect(hash).toMatchSnapshot(); + expect(hashLocal).toMatchSnapshot(); + expect(pathNameLocal).toMatchSnapshot(); + expect(fileLocal).toMatchSnapshot(); + expect(queryFragment).toMatchSnapshot(); + expect(uniqueNameIdContenthash).toMatchSnapshot(); + expect(less).toMatchSnapshot(); + done() + }).catch(done) +}); diff --git a/test/configCases/css/local-ident-name/style.module.css b/test/configCases/css/local-ident-name/style.module.css new file mode 100644 index 00000000000..864a29382e0 --- /dev/null +++ b/test/configCases/css/local-ident-name/style.module.css @@ -0,0 +1,25 @@ +.btn-info_is-disabled { + color: blue; +} + +.btn--info_is-disabled_1 { + color: blue; +} + +.simple { + color: red; +} + +a { + color: yellow; +} + +:export { + foo: bar; + my-btn-info_is-disabled: value; +} + +.foo_bar { + --color-red: red; + color: var(--color-red); +} diff --git a/test/configCases/css/local-ident-name/style.module.less b/test/configCases/css/local-ident-name/style.module.less new file mode 100644 index 00000000000..864a29382e0 --- /dev/null +++ b/test/configCases/css/local-ident-name/style.module.less @@ -0,0 +1,25 @@ +.btn-info_is-disabled { + color: blue; +} + +.btn--info_is-disabled_1 { + color: blue; +} + +.simple { + color: red; +} + +a { + color: yellow; +} + +:export { + foo: bar; + my-btn-info_is-disabled: value; +} + +.foo_bar { + --color-red: red; + color: var(--color-red); +} diff --git a/test/configCases/css/local-ident-name/test.config.js b/test/configCases/css/local-ident-name/test.config.js new file mode 100644 index 00000000000..621df3274ac --- /dev/null +++ b/test/configCases/css/local-ident-name/test.config.js @@ -0,0 +1,15 @@ +module.exports = { + findBundle(i, options) { + return [ + `style_module_css.bundle${i}.js`, + `style_module_css_hash.bundle${i}.js`, + `style_module_css_hash-local.bundle${i}.js`, + `style_module_css_path-name-local.bundle${i}.js`, + `style_module_css_file-local.bundle${i}.js`, + `style_module_css_q_f.bundle${i}.js`, + `style_module_css_uniqueName-id-contenthash.bundle${i}.js`, + `style_module_less.bundle${i}.js`, + `bundle${i}.js` + ]; + } +}; diff --git a/test/configCases/css/local-ident-name/webpack.config.js b/test/configCases/css/local-ident-name/webpack.config.js new file mode 100644 index 00000000000..99d0a8346c2 --- /dev/null +++ b/test/configCases/css/local-ident-name/webpack.config.js @@ -0,0 +1,73 @@ +const common = { + mode: "development", + module: { + rules: [ + { + test: /\.less$/, + type: "css/auto", + use: ["less-loader"], + generator: { + localIdentName: "[path][name][ext]__[local]" + } + }, + { + test: /\.css$/, + type: "css/auto", + oneOf: [ + { + resourceQuery: /\?hash$/, + generator: { + localIdentName: "[hash]" + } + }, + { + resourceQuery: /\?hash-local$/, + generator: { + localIdentName: "[hash]-[local]" + } + }, + { + resourceQuery: /\?path-name-local$/, + generator: { + localIdentName: "[path][name]__[local]" + } + }, + { + resourceQuery: /\?file-local$/, + generator: { + localIdentName: "[file]__[local]" + } + }, + { + resourceQuery: /\?q$/, + resourceFragment: /#f$/, + generator: { + localIdentName: "[file][query][fragment]__[local]" + } + }, + { + resourceQuery: /\?uniqueName-id-contenthash$/, + generator: { + localIdentName: "[uniqueName]-[id]-[contenthash]" + } + } + ] + } + ] + }, + experiments: { + css: true + } +}; + +/** @type {import("../../../../").Configuration} */ +module.exports = [ + { + ...common, + target: "web" + }, + { + ...common, + target: "node" + } +]; diff --git a/test/configCases/css/named-exports-parser-options/index.js b/test/configCases/css/named-exports-parser-options/index.js new file mode 100644 index 00000000000..55cfd4e61f9 --- /dev/null +++ b/test/configCases/css/named-exports-parser-options/index.js @@ -0,0 +1,25 @@ +import * as style1 from "./style.module.css" +import style2 from "./style.module.css?default" +import * as style3 from "./style.module.css?named" + +it("should able to import with different namedExports", () => { + expect(style1).toEqual(nsObj({ class: '_style_module_css-class' })); + expect(style2).toEqual(nsObj({ class: '_style_module_css_default-class' })); + expect(style3).toEqual(nsObj({ class: '_style_module_css_named-class' })); +}); + +it("should able to import with different namedExports (async)", (done) => { + Promise.all([ + import("./style.module.css"), + import("./style.module.css?default"), + import("./style.module.css?named"), + ]).then(([style1, style2, style3]) => { + expect(style1).toEqual(nsObj({ class: '_style_module_css-class' })); + expect(style2).toEqual(nsObj({ + class: "_style_module_css_default-class", + default: nsObj({ class: '_style_module_css_default-class' }) + })); + expect(style3).toEqual(nsObj({ class: '_style_module_css_named-class' })); + done() + }, done) +}); diff --git a/test/configCases/css/named-exports-parser-options/style.module.css b/test/configCases/css/named-exports-parser-options/style.module.css new file mode 100644 index 00000000000..626e93720d0 --- /dev/null +++ b/test/configCases/css/named-exports-parser-options/style.module.css @@ -0,0 +1,3 @@ +.class { + color: red; +} diff --git a/test/configCases/css/named-exports-parser-options/webpack.config.js b/test/configCases/css/named-exports-parser-options/webpack.config.js new file mode 100644 index 00000000000..50b4c7745cf --- /dev/null +++ b/test/configCases/css/named-exports-parser-options/webpack.config.js @@ -0,0 +1,26 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "node", + mode: "development", + module: { + rules: [ + { + resourceQuery: /\?default/, + parser: { + namedExports: false + }, + type: "css/module" + }, + { + resourceQuery: /\?named/, + parser: { + namedExports: true + }, + type: "css/module" + } + ] + }, + experiments: { + css: true + } +}; diff --git a/test/configCases/css/namespace/index.js b/test/configCases/css/namespace/index.js new file mode 100644 index 00000000000..78be77a3a32 --- /dev/null +++ b/test/configCases/css/namespace/index.js @@ -0,0 +1,7 @@ +import "./style.css"; + +it("should compile with warning", done => { + const style = getComputedStyle(document.body); + expect(style.getPropertyValue("background")).toBe(" red"); + done(); +}); diff --git a/test/configCases/css/namespace/style.css b/test/configCases/css/namespace/style.css new file mode 100644 index 00000000000..e16ce897e5d --- /dev/null +++ b/test/configCases/css/namespace/style.css @@ -0,0 +1,5 @@ +@namespace svg url('http://www.w3.org/2000/svg'); + +body { + background: red; +} diff --git a/test/configCases/css/namespace/test.config.js b/test/configCases/css/namespace/test.config.js new file mode 100644 index 00000000000..0590757288f --- /dev/null +++ b/test/configCases/css/namespace/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "bundle0.css"; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/namespace/warnings.js b/test/configCases/css/namespace/warnings.js new file mode 100644 index 00000000000..b10e066e2f7 --- /dev/null +++ b/test/configCases/css/namespace/warnings.js @@ -0,0 +1 @@ +module.exports = [/'@namespace' is not supported in bundled CSS/]; diff --git a/test/configCases/css/namespace/webpack.config.js b/test/configCases/css/namespace/webpack.config.js new file mode 100644 index 00000000000..cfb8e5c0346 --- /dev/null +++ b/test/configCases/css/namespace/webpack.config.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + experiments: { + css: true + } +}; diff --git a/test/configCases/css/no-extra-js-exports-output/a1.css b/test/configCases/css/no-extra-js-exports-output/a1.css new file mode 100644 index 00000000000..be9d5269a9b --- /dev/null +++ b/test/configCases/css/no-extra-js-exports-output/a1.css @@ -0,0 +1,3 @@ +.bar { + background-color: black; +} diff --git a/test/configCases/css/no-extra-js-exports-output/a1.module.css b/test/configCases/css/no-extra-js-exports-output/a1.module.css new file mode 100644 index 00000000000..be9d5269a9b --- /dev/null +++ b/test/configCases/css/no-extra-js-exports-output/a1.module.css @@ -0,0 +1,3 @@ +.bar { + background-color: black; +} diff --git a/test/configCases/css/no-extra-js-exports-output/a2.css b/test/configCases/css/no-extra-js-exports-output/a2.css new file mode 100644 index 00000000000..be9d5269a9b --- /dev/null +++ b/test/configCases/css/no-extra-js-exports-output/a2.css @@ -0,0 +1,3 @@ +.bar { + background-color: black; +} diff --git a/test/configCases/css/no-extra-js-exports-output/a2.module.css b/test/configCases/css/no-extra-js-exports-output/a2.module.css new file mode 100644 index 00000000000..be9d5269a9b --- /dev/null +++ b/test/configCases/css/no-extra-js-exports-output/a2.module.css @@ -0,0 +1,3 @@ +.bar { + background-color: black; +} diff --git a/test/configCases/css/no-extra-js-exports-output/a3.module.css b/test/configCases/css/no-extra-js-exports-output/a3.module.css new file mode 100644 index 00000000000..be9d5269a9b --- /dev/null +++ b/test/configCases/css/no-extra-js-exports-output/a3.module.css @@ -0,0 +1,3 @@ +.bar { + background-color: black; +} diff --git a/test/configCases/css/no-extra-js-exports-output/main.css b/test/configCases/css/no-extra-js-exports-output/main.css new file mode 100644 index 00000000000..f56551dd69a --- /dev/null +++ b/test/configCases/css/no-extra-js-exports-output/main.css @@ -0,0 +1,5 @@ +@import url("./a1.css"); + +.foo { + background-color: red; +} diff --git a/test/configCases/css/no-extra-js-exports-output/main1.js b/test/configCases/css/no-extra-js-exports-output/main1.js new file mode 100644 index 00000000000..dd349e5cf4d --- /dev/null +++ b/test/configCases/css/no-extra-js-exports-output/main1.js @@ -0,0 +1,4 @@ +import "./main.css" +require("./a2.css") +import("./a2.css").then(() => {}) + diff --git a/test/configCases/css/no-extra-js-exports-output/main2.js b/test/configCases/css/no-extra-js-exports-output/main2.js new file mode 100644 index 00000000000..4d2835fe754 --- /dev/null +++ b/test/configCases/css/no-extra-js-exports-output/main2.js @@ -0,0 +1,3 @@ +import a1 from "./a1.module.css" +const a2 = require("./a2.module.css") +import("./a3.module.css").then(() => {}) diff --git a/test/configCases/css/no-extra-js-exports-output/test.config.js b/test/configCases/css/no-extra-js-exports-output/test.config.js new file mode 100644 index 00000000000..fd533708688 --- /dev/null +++ b/test/configCases/css/no-extra-js-exports-output/test.config.js @@ -0,0 +1,12 @@ +module.exports = { + findBundle(i) { + switch (i) { + case 0: + return ["test.js"]; + case 1: + return ["test.js", `1/main.js`]; + case 2: + return ["test.js", `2/main.js`]; + } + } +}; diff --git a/test/configCases/css/no-extra-js-exports-output/test.js b/test/configCases/css/no-extra-js-exports-output/test.js new file mode 100644 index 00000000000..691d2ce7ecb --- /dev/null +++ b/test/configCases/css/no-extra-js-exports-output/test.js @@ -0,0 +1,30 @@ +it("should work", () => { + const stats = __STATS__.children[__STATS_I__]; + + expect(stats.assets.findIndex(a => a.name === "test.js") > -1).toBe(true); + + expect( + stats.assets.findIndex(a => a.name === `${__STATS_I__}/main.css`) > -1 + ).toBe(true); + + if (__STATS_I__ === 0) { + // ./main.css + // ./a.css + // and it still output two runtime module: + // 'webpack/runtime/make namespace object' + // 'webpack/runtime/css loading' + expect(stats.modules.length).toBe(4); + } else if (__STATS_I__ === 1) { + stats.modules + .filter(module => module.moduleType === "css/auto") + .forEach(module => { + expect(module.sizes["javascript"] === 1).toBe(true); + }); + } else if (__STATS_I__ === 2) { + stats.modules + .filter(module => module.moduleType === "css/auto") + .forEach(module => { + expect(module.sizes["javascript"] === 1).toBe(false); + }); + } +}); diff --git a/test/configCases/css/no-extra-js-exports-output/webpack.config.js b/test/configCases/css/no-extra-js-exports-output/webpack.config.js new file mode 100644 index 00000000000..6d994ee74e7 --- /dev/null +++ b/test/configCases/css/no-extra-js-exports-output/webpack.config.js @@ -0,0 +1,73 @@ +const path = require("path"); +const fs = require("fs"); +const webpack = require("../../../../"); + +/** + * @param {0 | 1 | 2} i index + * @returns {{ main: string[] }} entry + */ +const entry = i => { + switch (i) { + case 0: + return { + main: ["./main.css"] + }; + case 1: + return { + main: ["./main1.js"] + }; + case 2: + return { + main: ["./main2.js"] + }; + } +}; + +/** + * @param {0 | 1 | 2} i param + * @returns {import("../../../../").Configuration} return + */ +const common = i => ({ + entry: { + ...entry(i) + }, + target: "web", + devtool: false, + experiments: { + css: true + }, + output: { + filename: `${i}/[name].js`, + chunkFilename: `${i}/[name].js`, + cssFilename: `${i}/[name].css`, + cssChunkFilename: `${i}/[name].css` + }, + plugins: [ + { + apply(compiler) { + compiler.hooks.compilation.tap("Test", compilation => { + compilation.hooks.processAssets.tap( + { + name: "copy-webpack-plugin", + stage: + compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL + }, + () => { + const data = fs.readFileSync( + path.resolve(__dirname, "./test.js") + ); + + compilation.emitAsset( + "test.js", + new webpack.sources.RawSource(data) + ); + } + ); + }); + } + } + ] +}); + +/** @type {import("../../../../").Configuration[]} */ +module.exports = [.../** @type {(0 | 1 | 2)[]} */ ([0, 1]).map(i => common(i))]; diff --git a/test/configCases/css/no-extra-runtime-in-js/img.png b/test/configCases/css/no-extra-runtime-in-js/img.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/no-extra-runtime-in-js/img.png differ diff --git a/test/configCases/css/no-extra-runtime-in-js/index.js b/test/configCases/css/no-extra-runtime-in-js/index.js new file mode 100644 index 00000000000..239d1c7f3e5 --- /dev/null +++ b/test/configCases/css/no-extra-runtime-in-js/index.js @@ -0,0 +1,47 @@ +import "./style.css"; + +it("should compile", () => { + const links = document.getElementsByTagName("link"); + const css = []; + + // Skip first because import it by default + for (const link of links.slice(1)) { + css.push(link.sheet.css); + } + + expect(css).toMatchSnapshot(); + expect(Object.keys(__webpack_modules__).length).toBe(7); + expect(__webpack_modules__['./index.js']).toBeDefined(); + expect(__webpack_modules__['./shared-external.png']).toBeDefined(); + expect(__webpack_modules__['./shared.png']).toBeDefined(); + expect(__webpack_modules__['data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAWJQAAFiUBSVIk8AAAABNJREFUCB1jZGBg+A/EDEwgAgQADigBA//q6GsAAAAASUVORK5CYII%3D']).toBeDefined(); + expect(__webpack_modules__['data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MDAgNjAwIj48dGl0bGU+aWNvbi1zcXVhcmUtc21hbGw8L3RpdGxlPjxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0zMDAgLjFMNTY1IDE1MHYyOTkuOUwzMDAgNTk5LjggMzUgNDQ5LjlWMTUweiIvPjxwYXRoIGZpbGw9IiM4RUQ2RkIiIGQ9Ik01MTcuNyA0MzkuNUwzMDguOCA1NTcuOHYtOTJMNDM5IDM5NC4xbDc4LjcgNDUuNHptMTQuMy0xMi45VjE3OS40bC03Ni40IDQ0LjF2MTU5bDc2LjQgNDQuMXpNODEuNSA0MzkuNWwyMDguOSAxMTguMnYtOTJsLTEzMC4yLTcxLjYtNzguNyA0NS40em0tMTQuMy0xMi45VjE3OS40bDc2LjQgNDQuMXYxNTlsLTc2LjQgNDQuMXptOC45LTI2My4yTDI5MC40IDQyLjJ2ODlsLTEzNy4zIDc1LjUtMS4xLjYtNzUuOS00My45em00NDYuOSAwTDMwOC44IDQyLjJ2ODlMNDQ2IDIwNi44bDEuMS42IDc1LjktNDR6Ii8+PHBhdGggZmlsbD0iIzFDNzhDMCIgZD0iTTI5MC40IDQ0NC44TDE2MiAzNzQuMVYyMzQuMmwxMjguNCA3NC4xdjEzNi41em0xOC40IDBsMTI4LjQtNzAuNnYtMTQwbC0xMjguNCA3NC4xdjEzNi41ek0yOTkuNiAzMDN6bS0xMjktODVsMTI5LTcwLjlMNDI4LjUgMjE4bC0xMjguOSA3NC40LTEyOS03NC40eiIvPjwvc3ZnPgo=']).toBeDefined(); + expect(__webpack_modules__['https://example.com/only-external.png']).toBeDefined(); + expect(__webpack_modules__['./style.css']).toBeDefined(); + +}); + +it("should work with shared asset module", () => { + const img = new URL("./shared.png", import.meta.url); + expect(img.href.endsWith("shared.png")).toBe(true); +}); + +it("should work with shared external asset module", () => { + const img = new URL("./shared-external.png", import.meta.url); + expect(img.href.endsWith("shared-external.png")).toBe(true); +}); + +it("should work with external asset module", () => { + const img = new URL("https://example.com/only-external.png", import.meta.url); + expect(img.href.endsWith("only-external.png")).toBe(true); +}); + +it("should work and extract DataURI", () => { + const img = new URL("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2MDAgNjAwIj48dGl0bGU+aWNvbi1zcXVhcmUtc21hbGw8L3RpdGxlPjxwYXRoIGZpbGw9IiNGRkYiIGQ9Ik0zMDAgLjFMNTY1IDE1MHYyOTkuOUwzMDAgNTk5LjggMzUgNDQ5LjlWMTUweiIvPjxwYXRoIGZpbGw9IiM4RUQ2RkIiIGQ9Ik01MTcuNyA0MzkuNUwzMDguOCA1NTcuOHYtOTJMNDM5IDM5NC4xbDc4LjcgNDUuNHptMTQuMy0xMi45VjE3OS40bC03Ni40IDQ0LjF2MTU5bDc2LjQgNDQuMXpNODEuNSA0MzkuNWwyMDguOSAxMTguMnYtOTJsLTEzMC4yLTcxLjYtNzguNyA0NS40em0tMTQuMy0xMi45VjE3OS40bDc2LjQgNDQuMXYxNTlsLTc2LjQgNDQuMXptOC45LTI2My4yTDI5MC40IDQyLjJ2ODlsLTEzNy4zIDc1LjUtMS4xLjYtNzUuOS00My45em00NDYuOSAwTDMwOC44IDQyLjJ2ODlMNDQ2IDIwNi44bDEuMS42IDc1LjktNDR6Ii8+PHBhdGggZmlsbD0iIzFDNzhDMCIgZD0iTTI5MC40IDQ0NC44TDE2MiAzNzQuMVYyMzQuMmwxMjguNCA3NC4xdjEzNi41em0xOC40IDBsMTI4LjQtNzAuNnYtMTQwbC0xMjguNCA3NC4xdjEzNi41ek0yOTkuNiAzMDN6bS0xMjktODVsMTI5LTcwLjlMNDI4LjUgMjE4bC0xMjguOSA3NC40LTEyOS03NC40eiIvPjwvc3ZnPgo=", import.meta.url); + expect(img.href.endsWith(".svg")).toBe(true); +}); + +it("should work and extract shared DataURI", () => { + const img = new URL("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAWJQAAFiUBSVIk8AAAABNJREFUCB1jZGBg+A/EDEwgAgQADigBA//q6GsAAAAASUVORK5CYII%3D", import.meta.url); + expect(img.href.endsWith(".png")).toBe(true); +}); diff --git a/test/configCases/css/no-extra-runtime-in-js/inline.png b/test/configCases/css/no-extra-runtime-in-js/inline.png new file mode 100644 index 00000000000..1914264c087 Binary files /dev/null and b/test/configCases/css/no-extra-runtime-in-js/inline.png differ diff --git a/test/configCases/css/no-extra-runtime-in-js/resource.png b/test/configCases/css/no-extra-runtime-in-js/resource.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/no-extra-runtime-in-js/resource.png differ diff --git a/test/configCases/css/no-extra-runtime-in-js/shared-external.png b/test/configCases/css/no-extra-runtime-in-js/shared-external.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/no-extra-runtime-in-js/shared-external.png differ diff --git a/test/configCases/css/no-extra-runtime-in-js/shared.png b/test/configCases/css/no-extra-runtime-in-js/shared.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/no-extra-runtime-in-js/shared.png differ diff --git a/test/configCases/css/no-extra-runtime-in-js/source.text b/test/configCases/css/no-extra-runtime-in-js/source.text new file mode 100644 index 00000000000..595b9c8ccf1 --- /dev/null +++ b/test/configCases/css/no-extra-runtime-in-js/source.text @@ -0,0 +1 @@ +data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII= \ No newline at end of file diff --git a/test/configCases/css/no-extra-runtime-in-js/style.css b/test/configCases/css/no-extra-runtime-in-js/style.css new file mode 100644 index 00000000000..a3011b70388 --- /dev/null +++ b/test/configCases/css/no-extra-runtime-in-js/style.css @@ -0,0 +1,28 @@ +.class { + color: red; + background: + url("./img.png"), + url("./img.png"), + url("data:image/png;base64,AAA"); + url('./inline.png'), + url('./resource.png'), + url('./source.text'), + url('data:text/html,%3Ch1%3EHello%2C%20World!%3C%2Fh1%3E'), + url('https://example.com/img.png'); +} + +.class-2 { + background: url("./shared.png"); +} + +.class-3 { + background: url("./shared-external.png"); +} + +.class-4 { + background: url("data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs="); +} + +.class-5 { + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAAXNSR0IArs4c6QAAAAlwSFlzAAAWJQAAFiUBSVIk8AAAABNJREFUCB1jZGBg+A/EDEwgAgQADigBA//q6GsAAAAASUVORK5CYII%3D"); +} diff --git a/test/configCases/css/no-extra-runtime-in-js/test.config.js b/test/configCases/css/no-extra-runtime-in-js/test.config.js new file mode 100644 index 00000000000..0590757288f --- /dev/null +++ b/test/configCases/css/no-extra-runtime-in-js/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "bundle0.css"; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/no-extra-runtime-in-js/webpack.config.js b/test/configCases/css/no-extra-runtime-in-js/webpack.config.js new file mode 100644 index 00000000000..aa3c745380b --- /dev/null +++ b/test/configCases/css/no-extra-runtime-in-js/webpack.config.js @@ -0,0 +1,47 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + devtool: false, + experiments: { + css: true + }, + module: { + rules: [ + { + test: /resource\.png$/, + type: "asset/resource" + }, + { + test: /inline\.png$/, + type: "asset/inline" + }, + { + test: /source\.text$/, + type: "asset/source" + }, + { + mimetype: "text/html", + type: "asset/resource" + }, + { + mimetype: "image/svg", + type: "asset/resource" + }, + { + mimetype: "image/gif", + type: "asset/resource" + }, + { + mimetype: "image/png", + type: "asset/resource" + } + ] + }, + output: { + assetModuleFilename: "[name][ext]" + }, + externals: { + "shared-external.png": "asset shared-external.png" + } +}; diff --git a/test/configCases/css/parsing/cases/at-rule.css b/test/configCases/css/parsing/cases/at-rule.css new file mode 100644 index 00000000000..70f5adac94b --- /dev/null +++ b/test/configCases/css/parsing/cases/at-rule.css @@ -0,0 +1,65 @@ +@unknown; +@unknown x y; +@unknown "blah"; +@unknown \"blah\"; +@unknown /*test*/; +@unknown /*test*/x/*test*/ y; +@unknown ; +@unknown x y; + +@unknown {} +@\unknown {} +@unknown a b {} +@unknown {p:v} +@unknown x y {p:v} +@unknown x, y x(1) {p:v} +@unknown x, y x(1+2) {p:v} +@unknown/*test*/{/*test*/p/*test*/:/*test*/v/*test*/} +@unknown /*test*/x/*test*/ y/*test*/{/*test*/p/*test*/:/*test*/v/*test*/} +@unknown /*test*/x/*test*/,/*test*/y/*test*/ x(/*test*/1/*test*/+/*test*/2/*test*/)/*test*/{/*test*/p/*test*/:/*test*/v/*test*/} +@unknown { p : v } +@unknown x y { p : v } +@unknown x , y x( 1 + 2 ) { p : v } + +@unknown {s{p:v}} +@unknown x y {s{p:v}} +@unknown x, y f(1) {s{p:v}} +@unknown x, y f(1+2) {s{p:v}} +@unknown { .a { p: v; } .b { p: v } } +@unknown/*test*/{/*test*/s/*test*/{/*test*/p/*test*/:/*test*/v/*test*/}/*test*/} +@unknown /*test*/x/*test*/ y/*test*/{/*test*/s/*test*/{/*test*/p/*test*/:/*test*/v/*test*/}/*test*/} +@unknown /*test*/x/*test*/,/*test*/y/*test*/ f(/*test*/1/*test*/+/*test*/2/*test*/)/*test*/{/*test*/s/*test*/{/*test*/p/*test*/:/*test*/v/*test*/}/*test*/} +@unknown { s { p : v } } +@unknown x y { s { p : v } } +@unknown x , y f( 1 ) { s { p : v } } +@unknown x , y f( 1 2 ) { s { p : v } } + +@unknown { +--> {} + + + + + + +div { + color: red; +} + + + +.test {} diff --git a/test/configCases/css/parsing/cases/comment.css b/test/configCases/css/parsing/cases/comment.css new file mode 100644 index 00000000000..1aafff30502 --- /dev/null +++ b/test/configCases/css/parsing/cases/comment.css @@ -0,0 +1,51 @@ +/* comment */a/* comment */ +{ + /* comment */color/* comment */:/* comment */red/* comment */; +} + +/* a { color: black } */ +/**/ +/* */ +div { + /* inside */ + color: black; + /* between */ + background: red; + /* end */ +} +/* b */ + +a { + color: black; + /* c */ +} + +@media/* comment */screen/* comment */{} +@media /* comment */ screen /* comment */ {} + +/*!test*/ +/*!te +st*/ +/*!te + + +st*/ +/*!te**st*/ +/****************************/ +/*************** FOO *****************/ +/* comment *//* comment */ + +/* comment *//* comment */ +/**/ +/*a*/ +/* +*/ +/**//**/ +/**//**//*a*/ +/**//**//* a *//**//**/ +./**test*//**test**/a { background: red; } + +/** + + */ + diff --git a/test/configCases/css/parsing/cases/dashed-ident.css b/test/configCases/css/parsing/cases/dashed-ident.css new file mode 100644 index 00000000000..0b325e13088 --- /dev/null +++ b/test/configCases/css/parsing/cases/dashed-ident.css @@ -0,0 +1,19 @@ +:root { + --main-color: #06c; + --accent-color: #006; +} + +.foo { + --fg-color: blue; +} + +#foo h1 { + color: var(--main-color); +} + +@--custom {} +@--library1-custom {} + +.class { + --vendor-property: --vendor-function("test"); +} diff --git a/test/configCases/css/parsing/cases/declaration.css b/test/configCases/css/parsing/cases/declaration.css new file mode 100644 index 00000000000..d10de1b7a7c --- /dev/null +++ b/test/configCases/css/parsing/cases/declaration.css @@ -0,0 +1,40 @@ +div { + prop: value; + prop: (value); + prop: {value}; + prop: [value]; + prop: fn(value); + prop: fn(value)fn(value); + prop: value, value; + prop: value ,value; + prop: value,value; + prop: value , value; + prop: 100%100%; + prop: "string""string"; + prop: #ccc#ccc; + prop: url(img.png)url(img.png); + prop: (value)(value); + prop: {value}{value}; + prop: [value][value]; + prop: center/1em; + prop: center/ 1em; + prop: center /1em; + prop: center / 1em; + c\olor: red; + prop/**/: big; + prop: (;); + prop: [;]; + prop: {;}; +} + +a { color: a/* ; */ b ; } +a{color:black} + +a {;; + color: black; + ; ; +} + +a { + color: \\ red \\ blue; +} diff --git a/test/configCases/css/parsing/cases/dimension.css b/test/configCases/css/parsing/cases/dimension.css new file mode 100644 index 00000000000..bedd4bd93bb --- /dev/null +++ b/test/configCases/css/parsing/cases/dimension.css @@ -0,0 +1,9 @@ +a { + prop: 10px; + prop: .10px; + prop: 12.34px; + prop: 0000.000px; + prop: 1px\\9; + prop: 1e; + prop: 1unknown; +} diff --git a/test/configCases/css/parsing/cases/function.css b/test/configCases/css/parsing/cases/function.css new file mode 100644 index 00000000000..df13997bb96 --- /dev/null +++ b/test/configCases/css/parsing/cases/function.css @@ -0,0 +1,234 @@ +div { + prod: fn(100px); + prod: --fn(100px); + prod: --fn--fn(100px); +} + +:root { + font-size: calc(100vw / 35); +} + +div { + --width: calc(10% + 30px); + + width: calc(0px); + line-height: calc(0); + line-height: calc(2 + 3 * 4); + line-height: calc((2 + 3) * 4); + line-height: calc(-5 * 0); + width: calc((100px + 100px)); + width: calc( ( 100px + 100px ) ); + width: calc( 100px + 100px ); + width: calc(500px + 50%); + width: calc(10% + 20%); + width: calc(2pc + 3pt); + width: calc(100% / 3 - 2 * 1em - 2 * 1px); + + width: calc(calc(50px)); + width: calc(calc(60%) - 20px); + width: calc(calc(3 * 25%)); + width: calc(2 * var(--width)); + width: calc(pow(pow(30px / 1px, 3), 1/3) * 1px); + width: calc(infinity); + width: calc(InFiNiTy); + width: calc(-InFiNiTy); + width: calc(NaN); + width: calc((1 * 2) * (5px + 20em / 2) - 80% / (3 - 1) + 5px); +} + +.bar { + font-size: calc(1rem * pow(1.5, -1)); + font-size: calc(1rem * pow(1.5, 0)); + font-size: calc(1rem * pow(1.5, 1)); + font-size: calc(1rem * pow(1.5, 2)); + font-size: calc(1rem * pow(1.5, 3)); + font-size: calc(1rem * pow(1.5, 4)); +} + +.fade { + background-image: linear-gradient(silver 0%, white 20px, white calc(100% - 20px), silver 100%); +} + +div { + /*height: -webkit-calc(9/16 * 100%)!important;*/ + /*width: -moz-calc((50px - 50%)*2);*/ +} +div { width: calc(100% / 4); } +div { margin-top: calc(-120% - 4px); } +div { width: calc(50% - ( ( 4% ) * 0.5 ) ); } + +.fade { + background-image: linear-gradient(silver 0%, white 20px, + white calc(100% - 20px), silver 100%); +} + +.type { + /* Set font-size to 10x the average of vw and vh, + but don’t let it go below 12px. */ + font-size: max(10 * (1vw + 1vh) / 2, 12px); +} + +.type { + /* Force the font-size to stay between 12px and 100px */ + font-size: clamp(12px, 10 * (1vw + 1vh) / 2, 100px); +} + +.more { + width: mod(18px, 5px); + transform: rotate(mod(-140deg, -90deg)); + transform: rotate(atan2(1, -1)); + transform: rotate(tan(90deg)); + transform: rotate(atan(tan(90deg))); + font-size: hypot(2em); + font-size: hypot(-2em); + font-size: hypot(30px, 40px); + background-position: sign(10%); + width: calc(pow(e, pi) - pi); + width: min(pi, 5, e); + width: log(5); + width: log(5, 5); + width: round(var(--width), 50px); + width: round(nearest, var(--width), 50px); + width: round(up, var(--width), 50px); + width: round(down, var(--width), 50px); + width: round(to-zero, var(--width), 50px); +} + +.min-max { + width: min(10px, 20px, 40px, 100px); + width: max(10px, 20px, 40px, 100px); + width: min( 10px , 20px , 40px , 100px ); +} + +.rem { + width: rem(-18px, 5px); +} + +.sin { + transform: rotate(sin(45deg)); + transform: rotate(sin(3.14159 / 4)); +} + +.cos { + transform: rotate(cos(45deg)); + transform: rotate(cos(3.14159 / 4)); +} + +.asin { + transform: rotate(asin(45deg)); + transform: rotate(asin(pi / 4)); +} + +.acos { + transform: rotate(acos(45deg)); + transform: rotate(acos(pi / 4)); +} + +.atan { + transform: rotate(atan(1 / -1)); +} + +.atan2 { + transform: rotate(atan2(1, -1)); +} + +.sqrt { + size: sqrt(250); +} + +.exp { + size: exp(250 * 2); +} + +.abs { + background-position: calc(10% * abs(-10%)); +} + +.sign { + background-position: sign(10%); + background-position: sign(10% * 2); + background-position: sign( 10% * 2 ); + background-position: sign(10%*2); + background-position: sign( 10 + 10 ); + background-position: sign( 10% ); + width: calc( ( 100px + 100px ) * 2 ); +} + +a { + background: element(#css-source) no-repeat; + background: element(var(--foo)) no-repeat; + background: -moz-element(#css-source) no-repeat; + background: -moz-element(var(--foo)) no-repeat; +} + +a { + background: linear-gradient(white, gray); + background: linear-gradient(yellow, blue); + background: linear-gradient(to bottom, yellow, blue); + background: linear-gradient(180deg, yellow, blue); + background: linear-gradient(to top, blue, yellow); + background: linear-gradient(to bottom, yellow 0%, blue 100%); + background: linear-gradient(135deg, yellow, blue); + background: linear-gradient(-45deg, blue, yellow); + background: linear-gradient(yellow, blue 20%, #0f0); + background: linear-gradient(to top right, red, white, blue); + background: linear-gradient(0deg, blue, green 40%, red); + background: linear-gradient(.25turn, red 10%, blue); + background: linear-gradient(45deg, red 0 50%, blue 50% 100%); +} + +div { + /* mix( [ && [ by ]? ] ; ; ) */ + opacity: mix( 70% by ease ; 0% ; 100% ); + opacity: mix(70%;0%;100%); +} + +a { + background-image: url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7); + background-image: url("./img.png"); + background-image: url('./img.png'); + background-image: URL('./img.png'); + background-image: url( './img.png'); + background-image: url('./img.png' ); + background-image: url( './img.png' ); + background-image: url( + 'img.png' + ); + background-image: url(); + background-image: url( ); + background-image: url(""); + background-image: url( "" ); + background-image: url(''); + background-image: url( '' ); + background-image: url( ' ' ); + background-image: url(./img.png); + background-image: url( ./img.png ); + background-image: url( ./image\32.png ); + background-image: url( + ./image\32.png + ); + background-image: url( + + + + ./image\32.png + + + + ); + background-image: url( + + + + ./image\32.png + + + + ); +} + +div { + color: var(--a); + color: var(--a,); + color: var(--a, blue); +} diff --git a/test/configCases/css/parsing/cases/hacks.css b/test/configCases/css/parsing/cases/hacks.css new file mode 100644 index 00000000000..526596eaa77 --- /dev/null +++ b/test/configCases/css/parsing/cases/hacks.css @@ -0,0 +1,7 @@ +html > /**/ body .selector {} +head ~ /**/ body .selector {} + +.selector { _property: value; } +.selector { -property: value; } +.selector { property: value\9; } +.selector { property/*\**/: value\9; } diff --git a/test/configCases/css/parsing/cases/hex-colors.css b/test/configCases/css/parsing/cases/hex-colors.css new file mode 100644 index 00000000000..e5dfdab55d4 --- /dev/null +++ b/test/configCases/css/parsing/cases/hex-colors.css @@ -0,0 +1,18 @@ +a { + color: #000000; + color: #ffffff; + color: #FFFFFF; + color: #0000ffcc; + color: #0000FFCC; + color: #000; + color: #fff; + color: #FFF; + color: #0000; + color: #ffff; + color: #FFFF; + color: #1; + color: #FF; + color: #123456789; + color: #abc; + color: #aa\61; +} diff --git a/test/configCases/css/parsing/cases/image2.png b/test/configCases/css/parsing/cases/image2.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/parsing/cases/image2.png differ diff --git a/test/configCases/css/parsing/cases/img.png b/test/configCases/css/parsing/cases/img.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/parsing/cases/img.png differ diff --git a/test/configCases/css/parsing/cases/important.css b/test/configCases/css/parsing/cases/important.css new file mode 100644 index 00000000000..a4407339b9b --- /dev/null +++ b/test/configCases/css/parsing/cases/important.css @@ -0,0 +1,19 @@ +.a { + prop: important; + color: red important; + width: 1px!important; + color: red!important; + color: red !important; + color: red !important; + color: red ! important ; + color: blue !IMPORTANT; + color: white ! IMPORTANT ; + margin: 10px ! important; + padding: 20px ! /* test */ important; + width: 100px ! /*! test */ important; + height: 100px /*! test */ important; + z-index: 1 ""! important; + padding: 1px/* sep */!important; + prop: red !iMpOrTaNt; + color: red !imp\ortant; +} diff --git a/test/configCases/css/parsing/cases/nesting.css b/test/configCases/css/parsing/cases/nesting.css new file mode 100644 index 00000000000..8f287052a00 --- /dev/null +++ b/test/configCases/css/parsing/cases/nesting.css @@ -0,0 +1,392 @@ +.foo { + color: green; + .bar { + font-size: 1.4rem; + } +} + +main { + div { color: red } + .bar { color: red } + #baz { color: red } + :has(p) { color: red } + ::backdrop { color: red } + [lang|="zh"] { color: red } + * { color: red } +} + +main { + + article { color: red } + > p { color: red } + ~ main { color: red } +} + +main { + & + article { color: red } + & > p { color: red } + & ~ main { color: red } +} + +ul { + padding-left: 1em; + .component & { + padding-left: 0; + } +} + +a { + color: blue; + &:hover { + color: lightblue; + } +} + +/* & can be used on its own */ +.foo { + color: blue; + & > .bar { color: red; } + > .baz { color: green; } +} +/* equivalent to + .foo { color: blue; } + .foo > .bar { color: red; } + .foo > .baz { color: green; } +*/ + + +/* or in a compound selector, + refining the parent’s selector */ +.foo { + color: blue; + &.bar { color: red; } +} +/* equivalent to + .foo { color: blue; } + .foo.bar { color: red; } +*/ + +/* multiple selectors in the list are all + relative to the parent */ +.foo, .bar { + color: blue; + + .baz, &.qux { color: red; } +} +/* equivalent to + .foo, .bar { color: blue; } + :is(.foo, .bar) + .baz, + :is(.foo, .bar).qux { color: red; } +*/ + +/* & can be used multiple times in a single selector */ +.foo { + color: blue; + & .bar & .baz & .qux { color: red; } +} +/* equivalent to + .foo { color: blue; } + .foo .bar .foo .baz .foo .qux { color: red; } +*/ + +/* & doesn’t have to be at the beginning of the selector */ + +.foo { + color: red; + .parent & { + color: blue; + } +} +/* equivalent to + .foo { color: red; } + .parent .foo { color: blue; } +*/ + +.foo { + color: red; + :not(&) { + color: blue; + } +} +/* equivalent to + .foo { color: red; } + :not(.foo) { color: blue; } +*/ + +/* But if you use a relative selector, + an initial & is implied automatically */ + +.foo { + color: red; + + .bar + & { color: blue; } +} + +/* equivalent to + .foo { color: red; } + .foo + .bar + .foo { color: blue; } +*/ + +/* Somewhat silly, but & can be used all on its own, as well. */ +.foo { + color: blue; + & { padding: 2ch; } +} +/* equivalent to + .foo { color: blue; } + .foo { padding: 2ch; } + + // or + + .foo { + color: blue; + padding: 2ch; + } +*/ + +/* Again, silly, but can even be doubled up. */ +.foo { + color: blue; + && { padding: 2ch; } +} +/* equivalent to + .foo { color: blue; } + .foo.foo { padding: 2ch; } +*/ + +/* The parent selector can be arbitrarily complicated */ +.error, #404 { + &:hover > .baz { color: red; } +} +/* equivalent to + :is(.error, #404):hover > .baz { color: red; } +*/ + +.ancestor .el { + .other-ancestor & { color: red; } +} +/* equivalent to + .other-ancestor :is(.ancestor .el) { color: red; } + +/* As can the nested selector */ +.foo { + & :is(.bar, &.baz) { color: red; } +} +/* equivalent to + .foo :is(.bar, .foo.baz) { color: red; } +*/ + +/* Multiple levels of nesting "stack up" the selectors */ +figure { + margin: 0; + + > figcaption { + background: hsl(0 0% 0% / 50%); + + > p { + font-size: .9rem; + } + } +} +/* equivalent to + figure { margin: 0; } + figure > figcaption { background: hsl(0 0% 0% / 50%); } + figure > figcaption > p { font-size: .9rem; } +*/ + +/* Example usage with Cascade Layers */ +@layer base { + html { + block-size: 100%; + + body { + min-block-size: 100%; + } + } +} +/* equivalent to + @layer base { + html { block-size: 100%; } + html body { min-block-size: 100%; } + } +*/ + +/* Example nesting Cascade Layers */ +@layer base { + html { + block-size: 100%; + + @layer support { + body { + min-block-size: 100%; + } + } + } +} +/* equivalent to + @layer base { + html { block-size: 100%; } + } + @layer base.support { + html body { min-block-size: 100%; } + } +*/ + +/* Example usage with Scoping */ +@scope (.card) to (> header) { + :scope { + inline-size: 40ch; + aspect-ratio: 3/4; + + > header { + border-block-end: 1px solid white; + } + } +} +/* equivalent to + @scope (.card) to (> header) { + :scope { inline-size: 40ch; aspect-ratio: 3/4; } + :scope > header { border-block-end: 1px solid white; } + } +*/ + +/* Example nesting Scoping */ +.card { + inline-size: 40ch; + aspect-ratio: 3/4; + + @scope (&) to (> header > *) { + :scope > header { + border-block-end: 1px solid white; + } + } +} + +/* equivalent to + .card { inline-size: 40ch; aspect-ratio: 3/4; } + @scope (.card) to (> header > *) { + :scope > header { border-block-end: 1px solid white; } + } +*/ + +/* Properties can be directly used */ +.foo { + display: grid; + + @media (orientation: landscape) { + grid-auto-flow: column; + } +} + +/* equivalent to: */ +.foo { + display: grid; +} +@media (orientation: landscape) { + .foo { + grid-auto-flow: column + } +} + +/* and also equivalent to the unnested: */ +.foo { display: grid; } + +@media (orientation: landscape) { + .foo { + grid-auto-flow: column; + } +} + +/* Conditionals can be further nested */ +.foo { + display: grid; + + @media (orientation: landscape) { + grid-auto-flow: column; + + @media (min-width > 1024px) { + max-inline-size: 1024px; + } + } +} + +/* equivalent to */ +.foo { display: grid; } + +@media (orientation: landscape) { + .foo { + grid-auto-flow: column; + } +} + +@media (orientation: landscape) and (min-width > 1024px) { + .foo { + max-inline-size: 1024px; + } +} + +/* Example nesting Cascade Layers */ +html { + @layer base { + block-size: 100%; + + @layer support { + & body { + min-block-size: 100%; + } + } + } +} + +/* equivalent to */ +@layer base { + html { block-size: 100%; } +} +@layer base.support { + html body { min-block-size: 100%; } +} + +/* Example nesting Scoping */ +.card { + inline-size: 40ch; + aspect-ratio: 3/4; + + @scope (&) { + :scope { + border: 1px solid white; + } + } +} + +/* equivalent to */ +.card { inline-size: 40ch; aspect-ratio: 3/4; } + +@scope (.card) { + :scope { border-block-end: 1px solid white; } +} + +.parent { + color: blue; + + @scope (& > .scope) to (& > .limit) { + & .content { + color: red; + } + } +} + +article { + color: green; + & { color: blue; } + color: red; +} + +a, b { + & c { color: blue; } +} + +.foo, .foo::before, .foo::after { + color: black; + @media (prefers-color-scheme: dark) { + & { + color: white; + } + } +} diff --git a/test/configCases/css/parsing/cases/newline-windows.css b/test/configCases/css/parsing/cases/newline-windows.css new file mode 100644 index 00000000000..d5105eec8c5 --- /dev/null +++ b/test/configCases/css/parsing/cases/newline-windows.css @@ -0,0 +1,23 @@ +a::before { + content: "A really long \ +awesome string"; + color: #00ff00; + a24: \123456 + B; + test: url( + + + "./img.png" + + + ); + test: url( + + + ./img.png + + + ); + test: url( "" ); + test: url( '' ); +} diff --git a/test/configCases/css/parsing/cases/number.css b/test/configCases/css/parsing/cases/number.css new file mode 100644 index 00000000000..5597c09a849 --- /dev/null +++ b/test/configCases/css/parsing/cases/number.css @@ -0,0 +1,59 @@ +div { + property: 10; + property: +10; + property: -10; + property: 0.1; + property: +0.1; + property: -0.1; + property: -.1; + property: +.1; + property: 0; + property: 10; + property: .10; + property: 12.34; + property: 0.1; + property: 1.0; + property: 0.0; + property: +0.0; + property: -0.0; + property: .0; + property: 1.200000; + property: 1.2e2; + property: 1e2; + property: .2e2; + property: 1.2E2; + property: 1.2e+2; + property: 1.2e-2; + property: -1; + property: -1.2; + property: .2; + property: -.2; + property: +.2; + property: -1.2e3; + property: 1.75; + property: +1.75; + property: 1e0; + property: 1e1; + property: 1e+1; + property: 1e-1; + property: 1e-10; + property: 1+2; + property: 1-2; + property: 4.01; + property: -456.8; + property: .60; + property: .0060; + property: 10e3; + property: -3.4e-2; + property: 0.5600000000; + property: 10e6; + property: 10000000; + property: 0.0; + property: -0.0; + property: +0.0; + property: 1e1; + property: 1e2; + property: 1e3; + property: 1e4; + property: 100.1e-6; +} diff --git a/test/configCases/css/parsing/cases/pseudo-functions.css b/test/configCases/css/parsing/cases/pseudo-functions.css new file mode 100644 index 00000000000..830b3477a9f --- /dev/null +++ b/test/configCases/css/parsing/cases/pseudo-functions.css @@ -0,0 +1,3 @@ +:local(.class#id, .class:not(*:hover)) { color: red; } + +:import(something from ":somewhere") {} diff --git a/test/configCases/css/parsing/cases/selectors.css b/test/configCases/css/parsing/cases/selectors.css new file mode 100644 index 00000000000..79b6c36bd16 --- /dev/null +++ b/test/configCases/css/parsing/cases/selectors.css @@ -0,0 +1,746 @@ +[title] {} +[title=foo] {} +[title="foo"] {} +[ title = "foo" ] {} +[ title = "foo" ] {} +[lang~="en-us"] {} +[lang|="zh"] {} +[href^="#"] {} +[href$=".org"] {} +[href*="example"] {} +[href*="insensitive" i] {} +[href*="insensitive" I] {} +[href*="cAsE" s] {} +[href*="cAsE" S] {} +[foo|att=val] {} +[*|att] {} +[ *|att ] {} +[|att] {} +[ |att ] {} +[ |att ] {} +[att] {} +[ att ] {} +[ att ] {} +a[ class = "test" ] {} +a[ class = "test" ] {} +[href*="insensitive" i] {} +[ href*="insensitive" i ] {} +[ href *= "insensitive" i ] {} +[ href ] {} +[frame=hsides i] {} +#id.class[target] {} +#id[target] {} +[target].class {} +[title='foo'] {} +[data-style='value'][data-loading] {} +a[href="te's't"] {} +a[href='te"s"t'] {} +[ng\:cloak] {} +[ng\3a cloak] {} +[ng\00003acloak] {} +:not([foo=")"]) {} +:not(div/*)*/) { } +[foo=\"] {} +[foo=\{] {} +[foo=\(] {} +[foo=yes\:\(it\'s\ work\)] {} +[attr=\;] { } +[*|attr|="test"] {} +[foo|attr|="test"] {} + +.class {} +.♥ {} +.© {} +.“‘’” {} +.☺☃ {} +.⌘⌥ {} +.𝄞♪♩♫♬ {} +.💩 {} +.\? {} +.\@ {} +.\. {} +.\3A \) {} +.\3A \`\( {} +.\31 23 {} +.\31 a2b3c {} +.\ {} +.\<\>\<\<\<\>\>\<\> {} +.\+\+\+\+\+\+\+\+\+\+\[\>\+\+\+\+\+\+\+\>\+\+\+\+\+\+\+\+\+\+\>\+\+\+\>\+\<\<\<\<\-\]\>\+\+\.\>\+\.\+\+\+\+\+\+\+\.\.\+\+\+\.\>\+\+\.\<\<\+\+\+\+\+\+\+\+\+\+\+\+\+\+\+\.\>\.\+\+\+\.\-\-\-\-\-\-\.\-\-\-\-\-\-\-\-\.\>\+\.\>\. {} +.\# {} +.\#\# {} +.\#\.\#\.\# {} +.\_ {} +.\{\} {} +.\.fake\-class {} +.foo\.bar {} +.\3A hover {} +.\3A hover\3A focus\3A active {} +.\[attr\=value\] {} +.f\/o\/o {} +.f\\o\\o {} +.f\*o\*o {} +.f\!o\!o {} +.f\'o\'o {} +.f\~o\~o {} +.f\+o\+o {} +.-a-b-c- {} +.\#fake-id {} +foo.class > .foo.class {} +.foo#id {} +.class[target] {} +.class#id[target] {} +ul.list {} +ul.list::before {} +.\31 a2b3c {} +.\<\>\<\<\<\>\>\<\> {} +.\31 23 {} +.\# {} +.\#\# {} +.\#fake\-id {} +.foo\.bar {} +.\3A hover {} +.\3A hover\3A focus\3A active {} +.\[attr\=value\] {} +.not-pseudo\:focus {} +.not-pseudo\:\:focus {} +.\\1D306 {} +.\; {} + +/* { } */a b {} +/* test */a b {} +/* { } */ a b {} +/* test */ a b {} +a/* { } */b {} +a/* test */b {} +a /* { } */ b {} +a /* test */ b {} +a b/* { } */ {} +a b/* test */ {} +a b /* { } */ {} +a b /* test */ {} +a b/* { } */{} +a b/* test */{} +a/* test */,/* test */b{} +a /* test */ , /* test */ b {} + +article p {} +article +p {} +article p {} +article > p {} +article +> +p {} +article > p {} +p + img {} +p ++ +img {} +p + img {} +p ~ img {} +p +~ +img {} +p ~ img {} +article > p > a {} +article +> +p +> +a {} +div p {} +.class p {} +div .class {} +.class .class {} +#id p {} +div #id {} +#id #id {} +[attribute] p {} +div [attribute] {} +[attribute] [src] {} +div > p {} +.class > p {} +div > .class {} +.class > .class {} +#id > p {} +div > #id {} +#id > #id {} +[attribute] > p {} +div > [attribute] {} +[attribute] > [src] {} +div + p {} +.class + p {} +div + .class {} +.class + .class {} +#id + p {} +div + #id {} +#id + #id {} +[attribute] + p {} +div + [attribute] {} +[attribute] + [src] {} +div ~ p {} +.class ~ p {} +div ~ .class {} +.class ~ .class {} +#id ~ p {} +div ~ #id {} +#id ~ #id {} +[attribute] ~ p {} +div ~ [attribute] {} +[attribute] ~ [src] {} +a:hover [attribute] {} +a:hover #id {} +a:hover .class {} +a:hover div#thing {} +a + a[href='place'] {} +ul.list + a {} +.foo ~ a + bar {} +a+ a {} +a> a {} +a~ a {} +a +a {} +a >a {} +a ~a {} +a+a {} +a>a {} +a~a {} +a [type='button'] {} +a +[type='button'] {} +a a {} +namespace|type#id > .foo {} +#id > .cl + .cl2 {} +a c, d + e h {} +a ~ h + d {} +div div div div div div div div div div div {} +[href][class][name] h1 > h2 {} +[href*="test.com"][rel='external'][id][class~="test"] > [name] {} +[data-weird-attr*="Something=weird"], [data-weird-attr^="Something=weird"], [data-weird-attr$="Something=weird"], [data-weird-attr|="Something=weird"] {} +* + * {} +* * {} +* * {} +*[href] *:not(*.green) {} +*::-webkit-media-controls-play-button {} +col.selected || td {} +col.selected +|| +td +{} +col.selected||td {} + +.one {} +.foo.bar {} +.foo#id {} +.class[target] {} +.class#id[target] {} +#id.class {} +#id.class[target] {} +div#thing:hover {} +div#thing::before {} +a[href='place']:hover {} +a[href='place']::before {} +.one.two.three {} +button.btn-primary {} +*#z98y {} +#one#two {} +#one.two.three {} + +#id {} +#♥ {} +#© {} +#“‘’” {} +#☺☃ {} +#⌘⌥ {} +#𝄞♪♩♫♬ {} +#💩 {} +#\? {} +#\@ {} +#\. {} +#\3A \) {} +#\3A \`\( {} +#\31 23 {} +#\31 a2b3c {} +#\ {} +#\<\>\<\<\<\>\>\<\> {} +#\+\+\+\+\+\+\+\+\+\+\[\>\+\+\+\+\+\+\+\>\+\+\+\+\+\+\+\+\+\+\>\+\+\+\>\+\<\<\<\<\-\]\>\+\+\.\>\+\.\+\+\+\+\+\+\+\.\.\+\+\+\.\>\+\+\.\<\<\+\+\+\+\+\+\+\+\+\+\+\+\+\+\+\.\>\.\+\+\+\.\-\-\-\-\-\-\.\-\-\-\-\-\-\-\-\.\>\+\.\>\. {} +#\# {} +#\#\# {} +#\#\.\#\.\# {} +#\_ {} +#\{\} {} +#\.fake\-class {} +#foo\.bar {} +#\3A hover {} +#\3A hover\3A focus\3A active {} +#\[attr\=value\] {} +#f\/o\/o {} +#f\\o\\o {} +#f\*o\*o {} +#f\!o\!o {} +#f\'o\'o {} +#f\~o\~o {} +#f\+o\+o {} +#id {} +#id.class {} +#id.class[target] {} +div#thing:hover {} +div#thing:nth-child(2n+1) {} +div#thing::before {} +#foo[lang^=en] {} +#\; {} +#u-m\00002b {} +#♥ {} +#“‘’” {} +#☺☃ {} +#\@ {} +#\. {} +#\3A \) {} +#\3A \`\( {} +#\31 23 {} +#\31 a2b3c {} +#\ {} +#\<\>\<\<\<\>\>\<\> {} +#\# {} +#\#\# {} +#\#\.\#\.\# {} +#\_ {} +#\{\} {} +#\.fake\-class {} +#foo\.bar {} +#\3A hover {} +#\3A hover\3A focus\3A active {} +#\[attr\=value\] {} +#f\/o\/o {} +#f\\o\\o {} +#f\*o\*o {} +#f\!o\!o {} +#f\\\'o\\\'o {} +#f\~o\~o {} +#f\+o\+o {} + +div, p {} +div , p {} +div , p {} +a, a[href='place'] {} +a #foo > [foo='bar'], .FOO {} +div, p, a {} +div,p,a{} +div , p , a {} +div +, +p +, +a +{} +.foo, .bar, *.baz {} +input::-moz-placeholder, input::placeholder {} +a,b,c,d,e,f,g {} +a, b, c, d, e, f, g {} +*, * {} +#id, #id2 {} +h1, h2 {} +.class, .foo {} +[attr], [attrtoo] {} +a/* { } */ b {} + +table.colortable { + & td { + text-align: center; + &.c { text-transform:uppercase } + &:first-child, &:first-child + td { border:1px solid black } + } + + & th { + text-align:center; + background:black; + color:white; + } +} + +.foo { + color: blue; + & > .bar { color: red; } +} + +.foo { + color: blue; + &.bar { color: red; } +} + +.foo, .bar { + color: blue; + & + .baz, &.qux { color: red; } +} + +.foo { + color: blue; + & .bar & .baz & .qux { color: red; } +} + +.foo { + color: blue; + & { padding: 2ch; } +} + +/* TODO fix me */ +/*.foo {*/ +/* color: blue;*/ +/* && { padding: 2ch; }*/ +/*}*/ + +.error, #test { + &:hover > .baz { color: red; } +} + +.foo { + &:is(.bar, &.baz) { color: red; } +} + +figure { + margin: 0; + + & > figcaption { + background: hsl(0 0% 0% / 50%); + + & > p { + font-size: .9rem; + } + } +} + +.foo { + color: blue; + &__bar { color: red; } +} + +.foo { + color: red; + + .bar { + color: blue; + } +} + +.foo { + color: red; + + + .bar { + color: blue; + } +} + +.foo { + color: blue; + & > .bar { color: red; } + > .baz { color: green; } +} + +div { + color: red; + + & input { margin: 1em; } + /* valid, no longer starts with an identifier */ + + :is(input) { margin: 1em; } + /* valid, starts with a colon, + and equivalent to the previous rule. */ +} + +.foo, .bar { + color: blue; + + .baz, &.qux { color: red; } +} + +.foo { + color: blue; + & .bar & .baz & .qux { color: red; } +} + +.foo { + color: red; + .parent & { + color: blue; + } +} + +.foo { + color: red; + :not(&) { + color: blue; + } +} + +.foo { + color: red; + + .bar + & { color: blue; } +} + +.ancestor .el { + .other-ancestor & { color: red; } +} + +.foo { + & :is(.bar, &.baz) { color: red; } +} + +@layer base { + html { + block-size: 100%; + + & body { + min-block-size: 100%; + } + } +} + +@layer base { + html { + block-size: 100%; + + @layer base.support { + & body { + min-block-size: 100%; + } + } + } +} + +article { + color: green; + & { color: blue; } + color: red; +} + +.foo { + color: red; + @media (min-width: 480px) { + & h1, & h2 { + color: blue; + } + } +} + +:unknown {} +:unknown() {} +:unknown(foo) {} +:unknown(foo bar) {} +:unknown(foo, bar) {} +:unknown([foo]) {} +:unknown((foo bar)) {} +:unknown(((foo bar))) {} +:unknown({foo: bar}) {} +:unknown({{foo: bar}}) {} +:unknown({foo: bar !important}) {} +:unknown("string") {} +:unknown("string", foo) {} +:unknown('string') {} +:unknown(url(img.png)) {} +:unknown({!}) {} +:unknown(!) {} +:unknown({;}) {} +:unknown(;) {} + +:nth-child(2n+1) {} +:nth-child(2n +1) {} +:nth-child(2n + 1) {} +:nth-child(2n+ 1) {} +:nth-child(2n-1) {} +:nth-child(2n -1) {} +:nth-child(2n- 1) {} +:nth-child(2n - 1) {} +:nth-child(-2n+1) {} +:nth-child(-2n +1) {} +:nth-child(-2n + 1) {} +:nth-child(-2n+ 1) {} +:nth-child(-2n-1) {} +:nth-child(-2n -1) {} +:nth-child(-2n - 1) {} +:nth-child(+2n+1) {} +:nth-child(+2n +1) {} +:nth-child(+2n + 1) {} +:nth-child(+2n+ 1) {} +:nth-child(+2n-1) {} +:nth-child(+2n -1) {} +:nth-child(+2n- 1) {} +:nth-child(+2n - 1) {} +:nth-child(n+1) {} +:nth-child(n +1) {} +:nth-child(n + 1) {} +:nth-child(n+ 1) {} +:nth-child(n-1) {} +:nth-child(n -1) {} +:nth-child(n- 1) {} +:nth-child(n - 1) {} +:nth-child(-n+1) {} +:nth-child(-n +1) {} +:nth-child(-n + 1) {} +:nth-child(-n+ 1) {} +:nth-child(-n-1) {} +:nth-child(-n -1) {} +:nth-child(-n- 1) {} +:nth-child(-n - 1) {} +:nth-child(+n+1) {} +:nth-child(+n +1) {} +:nth-child(+n + 1) {} +:nth-child(+n+ 1) {} +:nth-child(+n-1) {} +:nth-child(+n -1) {} +:nth-child(+n- 1) {} +:nth-child(+n - 1) {} +:nth-child(n) {} +:nth-child(-n) {} +:nth-child(+n) {} +:nth-child(2n) {} +:nth-child(-2n) {} +:nth-child(+2n) {} +:nth-child(N) {} +:nth-child(-N) {} +:nth-child(+N) {} +:nth-child(2N) {} +:nth-child(-2N) {} +:nth-child(+2N) {} +:nth-child(1) {} +:nth-child(-1) {} +:nth-child(+1) {} +:nth-child(123456n-12345678) {} + +:Nth-Child(2n+1) {} +:NTH-CHILD(2n+1) {} + +:nth-child(odd) {} +:nth-child(ODD) {} +:nth-child(oDd) {} +:nth-child(even) {} +:nth-child(eVeN) {} +:nth-child(EVEN) {} + +:nth-child(/*test*/2n/*test*/+/*test*/1/*test*/) {} +:nth-last-child(/*test*/+3n/*test*/-/*test*/2/*test*/) {} + +:nth-child( 2n + 1 ) {} +:nth-last-child( +3n - 2 ) {} + +:nth-child(-2n+1) {} +:nth-last-child(2n+1) {} +:nth-of-type(2n+1) {} +:nth-last-of-type(2n+1) {} + +:nth-col(odd) {} +:nth-col(2n+1) {} +:nth-last-col(odd) {} +:nth-last-col(2n+1) {} + + +p:nth-child(0){} +p:nth-child(+0){} +p:nth-child(-0){} +p:nth-child(1){} +p:nth-child(+1){} +p:nth-child(-1){} +p:nth-child(3){} +p:nth-child(+3){} +p:nth-child(-3){} + +:nth-child(2n+1 of li) {} +:nth-child( 2n+1 of li ) {} +:nth-child(2n+1 of li,.test) {} +:nth-child(2n+1 of li, .test) {} +:nth-child(-n+3 of li.important) {} +tr:nth-child(even of :not([hidden])) {} + +:root {} +:any-link {} +button:hover {} +div\:before {} +div\::before {} +iNpUt {} +:matches(section, article, aside, nav) h1 {} +input:not([type='submit']) {} +div.sidebar:has(*:nth-child(5)):not(:has(*:nth-child(6))) {} +::-webkit-scrollbar-thumb:window-inactive {} +::-webkit-scrollbar-button:horizontal:decrement {} +.test::-webkit-scrollbar-button:horizontal:decrement {} +*:is(*) {} +:--heading {} +a:-moz-placeholder {} +a:hover::before {} +div :nth-child(2) {} +a:hOvEr {} +:-webkit-full-screen a {} + +a::after {} + +dialog::backdrop {} + +a::before {} + +video::cue {} +video::cue(b) {} + +video::cue-region {} +video::cue-region(#scroll) {} + +::grammar-error {} + +::marker {} + +tabbed-custom-element::part(tab) {} + +::placeholder {} + +::selection {} + +::slotted(*) {} +::slotted(span) {} + +::spelling-error {} + +::target-text {} + +.form-range::-webkit-slider-thumb:active {} + +a::bEfOrE {} + +a:hover::before {} +a:hover::-moz-placeholder {} +a, b > .foo::before {} +*:hover.class {} + +*|* {} +foo|h1 {} +foo|* {} +|h1 {} +*|h1 {} +h1 {} +\2d {} +\2d a {} +div\:before {} +d\iv {} +foreignObject {} +html textPath {} +div#thing {} +* {} +* #foo {} +*#foo {} +#foo * {} +.bar * {} +*.bar {} +*[lang^=en] {} +*:hover {} +*::before {} +* *:not(*) {} +a/**/{} +a/**/ +{} +\@noat { } +h1\\{ + color: \\; +} +. a { + +} + +# a { + +} + diff --git a/test/configCases/css/parsing/cases/urls.css b/test/configCases/css/parsing/cases/urls.css new file mode 100644 index 00000000000..7d9694915f0 --- /dev/null +++ b/test/configCases/css/parsing/cases/urls.css @@ -0,0 +1,26 @@ +body { + background: url( + https://example\2f4a8f.com\image.png + ) +} + +--element name.class name#_id { + background: + url( "https://example.com/some url \"with\" 'spaces'.png" ) + url('https://example.com/\'"quotes"\'.png'); +} + +div { + color: red; + a200:-webkit-image-set("img.png"1x); +} + +div { + color: red; + a201:url("img.png"); +} + +div { + color: red; + a202:url(img.png); +} diff --git a/test/configCases/css/parsing/cases/values.css b/test/configCases/css/parsing/cases/values.css new file mode 100644 index 00000000000..2649ab32383 --- /dev/null +++ b/test/configCases/css/parsing/cases/values.css @@ -0,0 +1,615 @@ +div { + transform: rotate(45deg); + transform: rotate(-50grad); + transform: rotate(3.1416rad); + transform: rotate(1.75turn); +} + +.hex-color { + color: #00ff00; + color: #0000ffcc; + color: #123; + color: #123c; +} + +.rgb { + color: rgb(255, 165, 0); + color: rgb(255,165,0); + color: rGb(255,165,0); + color: rgb(0 255 0); + color: rgb(0%100%0%); + color: rgb(29 164 192 / 95%); + color: rgb(123 255 255 / .5); + color: rgb(123 255 255 / 50%); + color: rgb(48% 100% 100% / 50%); + color: rgb(48% none 100% / 50%); + color: rgb(48% 100% 100% / none); + color: rgb(var(--red), var(--green), var(--blue)); + color: rgb(var(--red) var(--green) var(--blue)); + color: rgb(var(--red) var(--green) var(--blue) / var(--alpha)); +} + +.rgba { + color: rgba(255, 0, 0, 100%); + color: rgba(255, 255, 0, 1); + color: rgba(255, 255, 0, 0.8); + color: rgba(255, 165, 0); + color: rgba(255,165,0); + color: rGbA(255,165,0); + color: rgba(0 255 0); + color: rgba(0%100%0%); + color: rgba(29 164 192 / 95%); + color: rgba(123 255 255 / .5); + color: rgba(123 255 255 / 50%); + color: rgba(48% 100% 100% / 50%); + color: rgba(48% none 100% / 50%); + color: rgba(48% 100% 100% / none); + color: rgba(123 none 123 / 50%); + color: rgba(123 123 123 / none); + color: rgb(var(--red), var(--green), var(--blue), var(--alpha)); +} + +.hsl { + color: hsl(38.824 100% 50%); + color: HsL(39 100% 50%); + color: hsl(100deg, 100%, 50%); + color: hsl(100, 100%, 50%); + color: hsl(100 100% 50%); + color: hsl(100, 100%, 50%, .8); + color: hsl(100 100% 50% / .8); + color: hsl(var(--a), var(--b), var(--c)); + color: hsl(var(--a), var(--b), var(--c), var(--d)); + color: hsl(var(--a) var(--b) var(--c)); + color: hsl(var(--a) var(--b) var(--c) / var(--d)); +} + +.hsla { + color: hsla(100, 100%, 50%, .8); + color: hsla(100 100% 50% / .8); + color: hsla(var(--a), var(--b), var(--c), var(--d)); +} + +.hwb { + color: hwb(194 0% 0%); + color: hwb(194 0% 0% / 50%); + color: hwb(194 0% 50%); + color: hwb(194 50% 0%); + color: hwb(194 50% 50%); + color: hwb(var(--a) var(--b) var(--c)); + color: hwb(var(--a) var(--b) var(--c) / var(--d)); +} + +.lab { + color: lab(29.2345% 39.3825 20.0664); + color: lab(29.2345% 39.3825 20.0664 / 100%); + color: lab(29.2345% 39.3825 20.0664 / 50%); + color: lab(var(--a) var(--b) var(--c)); + color: lab(var(--a) var(--b) var(--c) / var(--d)); +} + +.lch { + color: lch(52.2345% 72.2 56.2 / 1); + color: lch(29.2345% 44.2 27); + color: lch(29.2345% 44.2 45deg); + color: lch(29.2345% 44.2 .5turn); + color: lch(29.2345% 44.2 27 / 100%); + color: lch(29.2345% 44.2 27 / 50%); + color: lch(var(--a) var(--b) var(--c)); + color: lch(var(--a) var(--b) var(--c) / var(--d)); +} + +.oklab { + color: oklab(40.101% 0.1147 0.0453); + color: oklab(var(--a) var(--b) var(--c)); +} + +.oklch { + color: oklch(42.1% 0.192 328.6 / 1); + color: oklch(42.1% 0.192 328.6); + color: oklch(var(--a) var(--b) var(--c)); + color: oklch(var(--a) var(--b) var(--c) / var(--d)); +} + +.color { + color: color(sRGB 0 1 0); + color: color(srgb-linear 0 1 0); + color: color(display-p3 0 1 0); + color: color(a98-rgb 0 1 0); + color: color(prophoto-rgb 0 1 0); + color: color(rec2020 0 1 0); + color: color(sRGB 0 none 0); + color: color(display-p3 0.823 0.6554 0.2537 /1); + color: color(display-p3 0.823 0.6554 0.2537 / 1); + color: color(display-p3 0.823 0.6554 0.2537/1); + color: color(display-p3 0.823 0.6554 0.2537); + color: color(xyz 0.472 0.372 0.131); + color: color(xyz-d50 0.472 0.372 0.131); + color: color(xyz-d65 0.472 0.372 0.131); + color: color(display-p3 -0.6112 1.0079 -0.2192); + color: color(sRGB 0.41587 0.503670 0.36664); + color: color(display-p3 0.43313 0.50108 0.37950); + color: color(a98-rgb 0.44091 0.49971 0.37408); + color: color(prophoto-rgb 0.36589 0.41717 0.31333); + color: color(rec2020 0.42210 0.47580 0.35605); + color: color(profoto-rgb 0.4835 0.9167 0.2188); + color: color(var(--a) var(--b) var(--c) var(--d)); + color: color(var(--a) var(--b) var(--c) var(--d) / var(--e)); +} + +@color-profile --fogra55beta { + src: url('https://example.org/2020_13.003_FOGRA55beta_CL_Profile.icc'); +} + +.dark_skin { + background-color: color(--fogra55beta 0.183596 0.464444 0.461729 0.612490 0.156903 0.000000 0.000000); + background-color: color(--fogra55beta 0.070804 0.334971 0.321802 0.215606 0.103107 0.000000 0.000000); + background-color: color(--fogra55beta 0.572088 0.229346 0.081708 0.282044 0.000000 0.000000 0.168260); + background-color: color(--fogra55beta 0.314566 0.145687 0.661941 0.582879 0.000000 0.234362 0.000000); + background-color: color(--fogra55beta 0.375515 0.259934 0.034849 0.107161 0.000000 0.000000 0.308200); + background-color: color(--fogra55beta 0.397575 0.010047 0.223682 0.031140 0.000000 0.317066 0.000000); +} + +.device-cmyk { + color: device-cmyk(0 81% 81% 30%); + color: device-cmyk(0% 70% 20% 0%); + color: device-cmyk(0% 70% 20% 0%); + color: device-cmyk(0 0.7 0.2 0); + color: device-cmyk(var(--a) var(--b) var(--c) var(--d)); +} + +.color-mix { + color: color-mix(in lch, purple 50%, plum 50%); + color: color-mix(in lch, purple 50%, plum); + color: color-mix(in lch, purple, plum 50%); + color: color-mix(in lch, purple, plum); + color: color-mix(in lch, plum, purple); + color: color-mix(in lch, purple 80%, plum 80%); +} + +.color-contrast { + color: color-contrast(currentColor vs hsl(200 83% 23%), purple to AA); + color: color-contrast(currentColor vs rgb(10 75 107), rgb(128 0 128) to 4.5); +} + +.foo { + color: device-cmyk(0 81% 81% 30%); + color: rgb(178 34 34); + color: firebrick; +} + +.bar { + color: device-cmyk(0 81% 81% 30%); + color: lab(45.060% 45.477 35.459); + color: rgb(70.690% 26.851% 19.724%); +} + +.calc { + color: rgba(calc(255 - 1), 255, 255, 1); + color: rgba(255, calc(255 - 1), 255, 1); + color: rgba(255, 255, calc(255 - 1), 1); + color: rgba(255, 255, 255, calc(1 - 1)); + color: hsla(calc(120deg + 16deg) 100% 50%); + color: hsla(120deg calc(20% + 10%) 50%); + color: hsla(120deg 40% calc(20% + 10%)); + color: hsl(120deg 40% 20% / calc(20% + 10%)); + color: hwb(194 calc(20% + 10%) 0% / .5); + color: device-cmyk(0 calc(20%) 81% 30%); + color: color(display-p3 calc(1 + 2) 0.5 0); +} + +.relative { + color: rgb(from indianred 255 255 255); + color: rgb(from transparent 255 255 255); + color: lch(from var(--mygray) 62% 30 -34); + color: rgb(from Canvas 255 255 255); + color: rgb(from canvas 255 255 255); + color: rgb(from ActiveBorder 255 255 255); + color: rgb(from -moz-buttondefault 255 255 255); + color: rgb(from -moz-activehyperlinktext 255 255 255); + color: rgb(from currentColor 255 255 255); +} + + +.var { + color: rgb(var(--red) var(--green) var(--blue)); + color: rgb(var(--red) var(--green) var(--blue) / var(--alpha)); + + color: rgb(env(--red) env(--green) env(--blue)); + color: rgb(env(--red) env(--green) env(--blue) / env(--alpha)); + + color: rgb(constant(--red) constant(--green) constant(--blue)); + color: rgb(constant(--red) constant(--green) constant(--blue) / constant(--alpha)); +} + +div { + color: hsl(var(--b2, var(--b1)) / var(--tw-bg-opacity)); + color: lab(var(--mycolor)); + color: rgba(var(--bg-color) 1); + color: rgba(var(--bg-color) / 1); + color: lab(var(--mycolor) 0); + color: lab(var(--mycolor) var(--mycolor)); + color: lab(from var(--mycolor) 0 0 0); + color: lab(from var(--mycolor) var(--color)); + color: rgb(var(--bg-color)); + color: rgb(var(--bg-color), var(--bg-color-a)); + color: rgb(var(--bg-color) var(--bg-color-a)); + color: rgba(var(--bg-color) 1); + color: rgb(var(--mycolor) var(--mycolor) var(--mycolor)); + color: lab(var(--mycolor) var(--mycolor) var(--mycolor)); + color: color(from var(--bg-color) var(--bg-color)); + color: color(from var(--bg-color) var(--bg-color) var(--bg-color)); + color: color(var(--bg-color) var(--bg-color)); + color: color(var(--bg-color)); + color: color(from var(--base) mi calc(pi * 2) calc(pi / 2)); + color: color(var(--bg-color)); + color: color(--unwise 35% 20% 8%); + color: color(--unwise var(--bg-color)); + color: color(--unwise var(--bg-color) var(--bg-color)); + color: device-cmyk(var(--bg-color)); + color: device-cmyk(var(--bg-color) var(--bg-color)); + color: device-cmyk(var(--bg-color) var(--bg-color) var(--bg-color)); + color: device-cmyk(var(--bg-color) var(--bg-color) var(--bg-color) var(--bg-color)); + color: device-cmyk(var(--bg-color) var(--bg-color) var(--bg-color) var(--bg-color) / var(--bg-color)); + color: device-cmyk(var(--bg-color) var(--bg-color) / var(--bg-color)); + color: device-cmyk(var(--bg-color) / var(--bg-color)); + color: device-cmyk(var(--bg-color) var(--bg-color)); + color: rgb(var(--bg-color)); + color: rgb(var(--bg-color) var(--bg-color)); + color: rgb(var(--bg-color) var(--bg-color) var(--bg-color)); + color: rgb(var(--bg-color) var(--bg-color) var(--bg-color) / var(--bg-color)); + color: rgb(var(--bg-color) var(--bg-color) / var(--bg-color)); + color: rgb(var(--bg-color) / var(--bg-color)); + color: rgb(var(--bg-color) var(--bg-color)); + color: rgb(var(--bg-color)); + color: rgb(var(--bg-color), var(--bg-color)); + color: rgb(var(--bg-color), var(--bg-color), var(--bg-color)); + color: rgb(var(--bg-color), var(--bg-color), var(--bg-color), var(--bg-color)); + color: rgb(var(--bg-color), var(--bg-color), var(--bg-color)); + color: hwb(var(--bg-color)); + color: hwb(var(--bg-color) var(--bg-color)); + color: hwb(var(--bg-color) var(--bg-color) var(--bg-color)); + color: hwb(var(--bg-color) var(--bg-color) var(--bg-color) / var(--bg-color)); + color: hwb(var(--bg-color) var(--bg-color) / var(--bg-color)); + color: hwb(var(--bg-color) / var(--bg-color)); + color: hwb(var(--bg-color) var(--bg-color)); + color: hwb(var(--bg-color)); + color: hwb(120 0% 49.8039%); + color: hwb(120 var(--bg-color) 49.8039%); + color: hwb(120 var(--bg-color) 49.8039% / 1); + color: hwb(120 var(--bg-color) 49.8039% / 100); + color: hwb(120 var(--bg-color) var(--bg-color)); + color: hwb(var(--bg-color) var(--bg-color) var(--bg-color)); + color: color(rec2020 0.42053 0.979780 0.00579); + color: color(rec2020 0.42053 0.979780 0.00579 / var(--color)); + color: color(rec2020 0.42053 var(--color)); + color: color(rec2020 0.42053 var(--color) / 100%); + color: color(rec2020 var(--color)); + color: color(rec2020 var(--color) / var(--color)); + color: color(var(--color) var(--color)); + color: color(var(--color)); + color: color(xyz-d50 0.2005 0.14089 0.4472); + color: color(sRGB 0.41587 0.503670 0.36664); + color: color(display-p3 0.43313 0.50108 0.37950); + color: color(a98-rgb 0.44091 0.49971 0.37408); + color: color(prophoto-rgb 0.36589 0.41717 0.31333); + color: color(rec2020 0.42210 0.47580 0.35605); +} + +:root { + ---:value; + + --important:value!important; + --important1: value!important; + --important2: value !important; + --important3:value !important; + --important4: calc(1)!important; + + --empty: ; + --empty2: /**/; + --empty3: !important; + --empty4:/**/ !important; + --empty5:/* 1 */ /* 2 */; + + --no-whitespace:ident; + --number: 1; + --unit: 100vw; + --color: #06c; + + --function: calc(1 + 1); + --variable: var(--unit); + + --string: 'single quoted string'; + --string: "double quoted string"; + + --square-block: [1, 2, 3]; + --square-block1: []; + --square-block2:[]; + --round-block: (1, 2, 3); + --round-block1: (); + --round-block2:(); + --bracket-block: {1, 2, 3}; + --bracket-block1: {}; + --bracket-block2:{}; + + + --JSON: [1, "2", {"three": {"a":1}}, [4]]; +--javascript: function(rule) { console.log(rule) }; + +--CDO: ; + +--complex-balanced:{[({()})()()[({})]]}[{()}]([]); +--fake-important:{!important}; +--semicolon-not-top-level: (;); +--delim-not-top-level: (!); +--zero-size: { +width: 0; +height: 0; +}; +--small-icon: { +width: 16px; +height: 16px; +} +; +} + +:root{--a:1} +:root {--foo: } +:root { + --foo: +} + +:root { + --var: value; +} + +div { + width: 100\%; + width: 100px2p; + width: 100px; + width: 100PX; + width: 100UNKNOWN; + width: 100НЕИЗВЕСТНО; +} + +table { + color: \red; +} + +a { + background: \;a; +} +:not([foo=")"]) { } +:not(div/*)*/) { } +:not(:nth-child(2n of [foo=")"])) { } +[foo=\"] { } +[foo=\{] { } +[foo=\(] { } +[foo=yes\:\(it\'s\ work\)] { } + +\@noat { } + +h1\\{ + color: \\; +} + +[attr="\;"] { } + +.prop { + \62 olor: red +} + +div { + prop: 1Hz; + prop: 1kHz; +} + +a { animation: test; } +a { animation: тест; } +a { animation: т\ест; } +a { animation: 😋; } +a { animation: \\😋; } +a { animation: \😋; } + +div { + z-index: 12; + z-index: +123; + z-index: -456; + z-index: 0; + z-index: +0; + z-index: -0; +} + +div { + width: 100e\x; + width: 100ex; + width: 100px; + width: 100PX; + width: 100pX; +} + +div { + width: 0%; + width: 0.1%; + width: 100%; + width: 100.5%; + width: 100.1000%; + width: 1e0%; + width: 1e1%; + width: 1e2%; + width: 10e-1%; + width: 10e-5%; + width: 10e+2%; +} + +div { + margin: -5%; + margin: -5.5%; +} + +a::before { + content: "This string is demarcated by double quotes."; + content: 'This string is demarcated by single quotes.'; + content: "This is a string with \" an escaped double quote."; + content: "This string also has \22 an escaped double quote."; + content: 'This is a string with \' an escaped single quote.'; + content: 'This string also has \27 an escaped single quote.'; + content: "This is a string with \\ an escaped backslash."; + content: "This string also has \22an escaped double quote."; + content: "This string also has \22 an escaped double quote."; + content: "This string has a \Aline break in it."; + content: "A really long \ +awesome string"; + content: ";'@ /**/\""; + content: '\'"\\'; + content: "a\ +b"; + content: "a\ +b"; + content: "a\ +b"; + content: "a\ b"; + content: "a\ +\ +\ +\ \ +b"; + content: 'a\62 c'; +} + +a[title="a not s\ +o very long title"] { + color: red; +} +a[title="a not so very long title"] { + color: red; +} + +div { + family-name: "A;' /**/"; +} + + +.foo { + content: ";'@ /**/\""; + content: '\'"\\'; +} + +@media print and (min-resolution: 300dpi) {} +@media print and (min-resolution: 300dpcm) {} +@media print and (min-resolution: 300dppx) {} +@media print and (min-resolution: 300x) {} + +div { + prop: []; + prop: [ ]; + prop: [row1-start]; + prop: [ row1-start-with-spaces-around ]; + prop: [red #fff 12px]; + prop: [row1-start] 25% [row1-end row2-start] 25% [row2-end]; +} + +#delay { + font-size: 14px; + transition-property: font-size; + transition-duration: 4s; + transition-delay: 2s; +} + +.box { + transition: width 2s, height 2s, background-color 2s, transform 2s; +} + +.time { + transition-duration: 4s; + transition-duration: 4000ms; +} + +@font-face { + font-family: 'Ampersand'; + src: local('Times New Roman'); + unicode-range: U+26; /* single codepoint */ + unicode-range: u+26; + unicode-range: U+0-7F; + unicode-range: U+0025-00FF; /* codepoint range */ + unicode-range: U+4??; /* wildcard range */ + unicode-range: U+0025-00FF, U+4??; /* multiple values */ + unicode-range: U+A5, U+4E00-9FFF, U+30??, U+FF00-FF9F; /* multiple values */ + unicode-range: U+????; + unicode-range: U+??????; + unicode-range: U+12; + unicode-range: U+12e112; + unicode-range: U+1e1ee1; + unicode-range: U+1e1ee1-FFFFFF; + unicode-range: U+1e1ee?; + unicode-range: U+12-13; +} + +div { + background: url(https://example.com/image.png); + background: URL(https://example.com/image.png); + background: \URL(https://example.com/image.png); + background: url("https://example.com/image.png"); + background: url('https://example.com/image.png'); + background: URL('https://example.com/image.png'); + background: \URL('https://example.com/image.png'); + background: url(data:image/png;base64,iRxVB0); + background: url(#IDofSVGpath); + + /* A is either an or a functional notation. */ + background: url("//aa.com/img.svg" prefetch); + background: url("//aa.com/img.svg" foo bar baz func(test)); + background: url("http://example.com/image.svg" param(--color var(--primary-color))); + + background: url(); + background: url(""); + background: url(''); + + --foo: "http://www.example.com/pinkish.gif"; + + background: src("http://www.example.com/pinkish.gif"); + background: SRC("http://www.example.com/pinkish.gif"); + background: src(var(--foo)); + background: url( https://example.com/image.png ); + background: u\rl( https://example.com/image.png ); + background: url( + https://example.com/image.png + ); + background: url( + + + https://example.com/image.png + + + ); + background: URL(https://example.com/ima\)ge.png); + background: url( "https://example.com/image.png" ); +} + +.delim { + a1: @ 12; + a2: 1 # 1; + a3: ( 1 2 3 ); + a4: 1 + 1; + a5: +s1; + a6: "test", "test"; + a7: 1 - 2 - 3; + a8: fn("test");;;;; + a9: < >; + a10: \ ; + a11: $ ; + a12: --1; + a13: -+1; + a14: ident1ident2; + a15: --fn("test"); + a16: +3.4e2; + a17: +3.4e-2; + a18: +3.4e+2; + a19: 12.1.1; + a20: +-12.2; + a21: 12.; + a22: \A; + a23: \00000A; + a23: \00000AB; + a24: \123456 B; +} diff --git a/test/configCases/css/parsing/index.js b/test/configCases/css/parsing/index.js new file mode 100644 index 00000000000..e352817466b --- /dev/null +++ b/test/configCases/css/parsing/index.js @@ -0,0 +1,8 @@ +import "./style.css"; + +it("should compile and load style on demand", done => { + const style = getComputedStyle(document.body); + expect(style.getPropertyValue("background")).toBe(" red"); + + done(); +}); diff --git a/test/configCases/css/parsing/style.css b/test/configCases/css/parsing/style.css new file mode 100644 index 00000000000..d5336c1e145 --- /dev/null +++ b/test/configCases/css/parsing/style.css @@ -0,0 +1,22 @@ +@import "./cases/at-rule.css"; +@import "./cases/bad-url-token.css"; +@import "./cases/cdo-and-cdc.css"; +@import "./cases/comment.css"; +@import "./cases/dashed-ident.css"; +@import "./cases/declaration.css"; +@import "./cases/dimension.css"; +@import "./cases/function.css"; +@import "./cases/hacks.css"; +@import "./cases/hex-colors.css"; +@import "./cases/important.css"; +@import "./cases/nesting.css"; +@import "./cases/number.css"; +@import "./cases/pseudo-functions.css"; +@import "./cases/selectors.css"; +@import "./cases/urls.css"; +@import "./cases/values.css"; +@import "./cases/newline-windows.css"; + +body { + background: red; +} diff --git a/test/configCases/css/parsing/test.config.js b/test/configCases/css/parsing/test.config.js new file mode 100644 index 00000000000..0590757288f --- /dev/null +++ b/test/configCases/css/parsing/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "bundle0.css"; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/parsing/webpack.config.js b/test/configCases/css/parsing/webpack.config.js new file mode 100644 index 00000000000..cfb8e5c0346 --- /dev/null +++ b/test/configCases/css/parsing/webpack.config.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + experiments: { + css: true + } +}; diff --git a/test/configCases/css/pathinfo/index.js b/test/configCases/css/pathinfo/index.js new file mode 100644 index 00000000000..eb4c93a7f52 --- /dev/null +++ b/test/configCases/css/pathinfo/index.js @@ -0,0 +1,14 @@ +import * as style from "./style.css"; + +it("should compile and load style on demand", done => { + expect(style).toEqual({}); + import("./style2.css").then(x => { + expect(x).toEqual({}); + const style = getComputedStyle(document.body); + expect(style.getPropertyValue("background")).toBe(" red"); + expect(style.getPropertyValue("margin")).toBe(" 10px"); + expect(style.getPropertyValue("color")).toBe(" green"); + expect(style.getPropertyValue("padding")).toBe(" 20px 10px"); + done(); + }, done); +}); diff --git a/test/configCases/css/pathinfo/style-imported.css b/test/configCases/css/pathinfo/style-imported.css new file mode 100644 index 00000000000..eb0ae451455 --- /dev/null +++ b/test/configCases/css/pathinfo/style-imported.css @@ -0,0 +1,3 @@ +body { + margin: 10px; +} diff --git a/test/configCases/css/pathinfo/style.css b/test/configCases/css/pathinfo/style.css new file mode 100644 index 00000000000..ba0cfaf6561 --- /dev/null +++ b/test/configCases/css/pathinfo/style.css @@ -0,0 +1,4 @@ +@import "style-imported.css"; +body { + background: red; +} diff --git a/test/configCases/css/pathinfo/style2-imported.css b/test/configCases/css/pathinfo/style2-imported.css new file mode 100644 index 00000000000..ff9387e5d3e --- /dev/null +++ b/test/configCases/css/pathinfo/style2-imported.css @@ -0,0 +1,3 @@ +body { + padding: 20px 10px; +} diff --git a/test/configCases/css/pathinfo/style2.css b/test/configCases/css/pathinfo/style2.css new file mode 100644 index 00000000000..d80cbcd05df --- /dev/null +++ b/test/configCases/css/pathinfo/style2.css @@ -0,0 +1,4 @@ +@import "./style2-imported.css"; +body { + color: green; +} diff --git a/test/configCases/css/pathinfo/test.config.js b/test/configCases/css/pathinfo/test.config.js new file mode 100644 index 00000000000..eb641abf5f0 --- /dev/null +++ b/test/configCases/css/pathinfo/test.config.js @@ -0,0 +1,30 @@ +const fs = require("fs"); +const path = require("path"); + +module.exports = { + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "bundle0.css"; + scope.window.document.head.appendChild(link); + }, + findBundle(i, options) { + const source = fs.readFileSync( + path.resolve(options.output.path, "bundle0.css"), + "utf-8" + ); + + if ( + !source.includes(`/*!********************************!*\\ + !*** css ./style-imported.css ***! + \\********************************/`) && + !source.includes(`/*!***********************!*\\ + !*** css ./style.css ***! + \\***********************/`) + ) { + throw new Error("The `pathinfo` option doesn't work."); + } + + return ["./style2_css.bundle0.js", "./bundle0.js"]; + } +}; diff --git a/test/configCases/css/pathinfo/webpack.config.js b/test/configCases/css/pathinfo/webpack.config.js new file mode 100644 index 00000000000..e2848b6a973 --- /dev/null +++ b/test/configCases/css/pathinfo/webpack.config.js @@ -0,0 +1,13 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + devtool: false, + output: { + pathinfo: true, + cssChunkFilename: "[name].[chunkhash].css" + }, + experiments: { + css: true + } +}; diff --git a/test/configCases/css/prefer-relative-css-import/bar.modules.css b/test/configCases/css/prefer-relative-css-import/bar.modules.css new file mode 100644 index 00000000000..212af39cfba --- /dev/null +++ b/test/configCases/css/prefer-relative-css-import/bar.modules.css @@ -0,0 +1,7 @@ +body { + color: red; +} + +.bar { + color: red; +} diff --git a/test/configCases/css/prefer-relative-css-import/foo.css b/test/configCases/css/prefer-relative-css-import/foo.css new file mode 100644 index 00000000000..bb644f91459 --- /dev/null +++ b/test/configCases/css/prefer-relative-css-import/foo.css @@ -0,0 +1,7 @@ +body { + background: red; +} + +.foo { + color: red; +} diff --git a/test/configCases/css/prefer-relative-css-import/index.js b/test/configCases/css/prefer-relative-css-import/index.js new file mode 100644 index 00000000000..06444c6a111 --- /dev/null +++ b/test/configCases/css/prefer-relative-css-import/index.js @@ -0,0 +1,14 @@ +import * as styles1 from "./style.less"; +import * as styles2 from "./style.modules.less"; + +it("should prefer relative", () => { + expect(styles1).toEqual({}); + expect(styles2).toEqual(nsObj({ + "style-module": "_style_modules_less-style-module", + })); + + const style = getComputedStyle(document.body); + + expect(style.getPropertyValue("background")).toBe(" red"); + expect(style.getPropertyValue("color")).toBe(" red"); +}); diff --git a/test/configCases/css/prefer-relative-css-import/node_modules/bar.modules.css/package.json b/test/configCases/css/prefer-relative-css-import/node_modules/bar.modules.css/package.json new file mode 100644 index 00000000000..bfdbb88698b --- /dev/null +++ b/test/configCases/css/prefer-relative-css-import/node_modules/bar.modules.css/package.json @@ -0,0 +1,4 @@ +{ + "name": "bar.modules.css", + "main": "style.css" +} diff --git a/test/configCases/css/prefer-relative-css-import/node_modules/bar.modules.css/style.css b/test/configCases/css/prefer-relative-css-import/node_modules/bar.modules.css/style.css new file mode 100644 index 00000000000..36505138bc9 --- /dev/null +++ b/test/configCases/css/prefer-relative-css-import/node_modules/bar.modules.css/style.css @@ -0,0 +1,3 @@ +body { + color: blue; +} diff --git a/test/configCases/css/prefer-relative-css-import/node_modules/foo.css/package.json b/test/configCases/css/prefer-relative-css-import/node_modules/foo.css/package.json new file mode 100644 index 00000000000..f273efd2294 --- /dev/null +++ b/test/configCases/css/prefer-relative-css-import/node_modules/foo.css/package.json @@ -0,0 +1,4 @@ +{ + "name": "foo.css", + "main": "style.css" +} diff --git a/test/configCases/css/prefer-relative-css-import/node_modules/foo.css/style.css b/test/configCases/css/prefer-relative-css-import/node_modules/foo.css/style.css new file mode 100644 index 00000000000..eedeb9d0ff9 --- /dev/null +++ b/test/configCases/css/prefer-relative-css-import/node_modules/foo.css/style.css @@ -0,0 +1,3 @@ +body { + background: blue; +} diff --git a/test/configCases/css/prefer-relative-css-import/style.less b/test/configCases/css/prefer-relative-css-import/style.less new file mode 100644 index 00000000000..7aed5ec6680 --- /dev/null +++ b/test/configCases/css/prefer-relative-css-import/style.less @@ -0,0 +1,5 @@ +@import 'foo.css'; + +.style { + color: red; +} diff --git a/test/configCases/css/prefer-relative-css-import/style.modules.less b/test/configCases/css/prefer-relative-css-import/style.modules.less new file mode 100644 index 00000000000..69dc14ca454 --- /dev/null +++ b/test/configCases/css/prefer-relative-css-import/style.modules.less @@ -0,0 +1,5 @@ +@import 'bar.modules.css'; + +.style-module { + color: red; +} diff --git a/test/configCases/css/prefer-relative-css-import/test.config.js b/test/configCases/css/prefer-relative-css-import/test.config.js new file mode 100644 index 00000000000..0590757288f --- /dev/null +++ b/test/configCases/css/prefer-relative-css-import/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "bundle0.css"; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/prefer-relative-css-import/webpack.config.js b/test/configCases/css/prefer-relative-css-import/webpack.config.js new file mode 100644 index 00000000000..b4ebfb3d73f --- /dev/null +++ b/test/configCases/css/prefer-relative-css-import/webpack.config.js @@ -0,0 +1,17 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + module: { + rules: [ + { + test: /\.less$/, + use: "less-loader", + type: "css/auto" + } + ] + }, + experiments: { + css: true + } +}; diff --git a/test/configCases/css/prefer-relative/bar.modules.css b/test/configCases/css/prefer-relative/bar.modules.css new file mode 100644 index 00000000000..212af39cfba --- /dev/null +++ b/test/configCases/css/prefer-relative/bar.modules.css @@ -0,0 +1,7 @@ +body { + color: red; +} + +.bar { + color: red; +} diff --git a/test/configCases/css/prefer-relative/foo.css b/test/configCases/css/prefer-relative/foo.css new file mode 100644 index 00000000000..bb644f91459 --- /dev/null +++ b/test/configCases/css/prefer-relative/foo.css @@ -0,0 +1,7 @@ +body { + background: red; +} + +.foo { + color: red; +} diff --git a/test/configCases/css/prefer-relative/index.js b/test/configCases/css/prefer-relative/index.js new file mode 100644 index 00000000000..9701a0453ff --- /dev/null +++ b/test/configCases/css/prefer-relative/index.js @@ -0,0 +1,14 @@ +import * as styles1 from "./style.css"; +import * as styles2 from "./style.modules.css"; + +it("should prefer relative", () => { + expect(styles1).toEqual({}); + expect(styles2).toEqual(nsObj({ + "style-module": "_style_modules_css-style-module", + })); + + const style = getComputedStyle(document.body); + + expect(style.getPropertyValue("background")).toBe(" red"); + expect(style.getPropertyValue("color")).toBe(" red"); +}); diff --git a/test/configCases/css/prefer-relative/node_modules/bar.modules.css/package.json b/test/configCases/css/prefer-relative/node_modules/bar.modules.css/package.json new file mode 100644 index 00000000000..bfdbb88698b --- /dev/null +++ b/test/configCases/css/prefer-relative/node_modules/bar.modules.css/package.json @@ -0,0 +1,4 @@ +{ + "name": "bar.modules.css", + "main": "style.css" +} diff --git a/test/configCases/css/prefer-relative/node_modules/bar.modules.css/style.css b/test/configCases/css/prefer-relative/node_modules/bar.modules.css/style.css new file mode 100644 index 00000000000..36505138bc9 --- /dev/null +++ b/test/configCases/css/prefer-relative/node_modules/bar.modules.css/style.css @@ -0,0 +1,3 @@ +body { + color: blue; +} diff --git a/test/configCases/css/prefer-relative/node_modules/foo.css/package.json b/test/configCases/css/prefer-relative/node_modules/foo.css/package.json new file mode 100644 index 00000000000..f273efd2294 --- /dev/null +++ b/test/configCases/css/prefer-relative/node_modules/foo.css/package.json @@ -0,0 +1,4 @@ +{ + "name": "foo.css", + "main": "style.css" +} diff --git a/test/configCases/css/prefer-relative/node_modules/foo.css/style.css b/test/configCases/css/prefer-relative/node_modules/foo.css/style.css new file mode 100644 index 00000000000..eedeb9d0ff9 --- /dev/null +++ b/test/configCases/css/prefer-relative/node_modules/foo.css/style.css @@ -0,0 +1,3 @@ +body { + background: blue; +} diff --git a/test/configCases/css/prefer-relative/style.css b/test/configCases/css/prefer-relative/style.css new file mode 100644 index 00000000000..7aed5ec6680 --- /dev/null +++ b/test/configCases/css/prefer-relative/style.css @@ -0,0 +1,5 @@ +@import 'foo.css'; + +.style { + color: red; +} diff --git a/test/configCases/css/prefer-relative/style.modules.css b/test/configCases/css/prefer-relative/style.modules.css new file mode 100644 index 00000000000..69dc14ca454 --- /dev/null +++ b/test/configCases/css/prefer-relative/style.modules.css @@ -0,0 +1,5 @@ +@import 'bar.modules.css'; + +.style-module { + color: red; +} diff --git a/test/configCases/css/prefer-relative/test.config.js b/test/configCases/css/prefer-relative/test.config.js new file mode 100644 index 00000000000..0590757288f --- /dev/null +++ b/test/configCases/css/prefer-relative/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "bundle0.css"; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/prefer-relative/webpack.config.js b/test/configCases/css/prefer-relative/webpack.config.js new file mode 100644 index 00000000000..cfb8e5c0346 --- /dev/null +++ b/test/configCases/css/prefer-relative/webpack.config.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + experiments: { + css: true + } +}; diff --git a/test/configCases/css/prefetch-preload-module-only-css/chunk1-a.css b/test/configCases/css/prefetch-preload-module-only-css/chunk1-a.css new file mode 100644 index 00000000000..195b6bcf6d2 --- /dev/null +++ b/test/configCases/css/prefetch-preload-module-only-css/chunk1-a.css @@ -0,0 +1,3 @@ +a { + color: red; +} diff --git a/test/configCases/css/prefetch-preload-module-only-css/chunk1-a.mjs b/test/configCases/css/prefetch-preload-module-only-css/chunk1-a.mjs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/css/prefetch-preload-module-only-css/chunk1-b.mjs b/test/configCases/css/prefetch-preload-module-only-css/chunk1-b.mjs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/css/prefetch-preload-module-only-css/chunk1-c.mjs b/test/configCases/css/prefetch-preload-module-only-css/chunk1-c.mjs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/css/prefetch-preload-module-only-css/chunk1.css b/test/configCases/css/prefetch-preload-module-only-css/chunk1.css new file mode 100644 index 00000000000..195b6bcf6d2 --- /dev/null +++ b/test/configCases/css/prefetch-preload-module-only-css/chunk1.css @@ -0,0 +1,3 @@ +a { + color: red; +} diff --git a/test/configCases/css/prefetch-preload-module-only-css/chunk1.mjs b/test/configCases/css/prefetch-preload-module-only-css/chunk1.mjs new file mode 100644 index 00000000000..ade3f333705 --- /dev/null +++ b/test/configCases/css/prefetch-preload-module-only-css/chunk1.mjs @@ -0,0 +1,6 @@ +export default function() { + import(/* webpackChunkName: "chunk1-a" */ "./chunk1-a.mjs"); + import(/* webpackChunkName: "chunk1-b" */ "./chunk1-b.mjs"); + import(/* webpackPreload: true, webpackChunkName: "chunk1-a-css" */ "./chunk1-a.css"); + import(/* webpackChunkName: "chunk1-c" */ "./chunk1-c.mjs"); +} diff --git a/test/configCases/css/prefetch-preload-module-only-css/chunk2.css b/test/configCases/css/prefetch-preload-module-only-css/chunk2.css new file mode 100644 index 00000000000..3b4cc03b68a --- /dev/null +++ b/test/configCases/css/prefetch-preload-module-only-css/chunk2.css @@ -0,0 +1,3 @@ +a { + color: blue; +} diff --git a/test/configCases/css/prefetch-preload-module-only-css/chunk2.mjs b/test/configCases/css/prefetch-preload-module-only-css/chunk2.mjs new file mode 100644 index 00000000000..efa843a62fb --- /dev/null +++ b/test/configCases/css/prefetch-preload-module-only-css/chunk2.mjs @@ -0,0 +1,4 @@ +export default function() { + import(/* webpackChunkName: "chunk1-a" */ "./chunk1-a.mjs"); + import(/* webpackChunkName: "chunk1-b" */ "./chunk1-b.mjs"); +} diff --git a/test/configCases/css/prefetch-preload-module-only-css/index.mjs b/test/configCases/css/prefetch-preload-module-only-css/index.mjs new file mode 100644 index 00000000000..6e881e5c99a --- /dev/null +++ b/test/configCases/css/prefetch-preload-module-only-css/index.mjs @@ -0,0 +1,74 @@ +// This config need to be set on initial evaluation to be effective + +__webpack_nonce__ = "nonce"; +__webpack_public_path__ = "https://example.com/public/path/"; + +it("should prefetch and preload child chunks on chunk load", () => { + let link; + + expect(document.head._children).toHaveLength(2); + + // Test prefetch + link = document.head._children[0]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("prefetch"); + expect(link.as).toBe("style"); + expect(link.href).toBe("https://example.com/public/path/chunk2-css.css"); + + link = document.head._children[1]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("prefetch"); + expect(link.as).toBe("script"); + expect(link.href).toBe("https://example.com/public/path/chunk2-css.mjs"); + + const promise = import( + /* webpackChunkName: "chunk1" */ "./chunk1.mjs" + ); + + expect(document.head._children).toHaveLength(4); + + link = document.head._children[2]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("preload"); + expect(link.as).toBe("style"); + expect(link.href).toBe("https://example.com/public/path/chunk1-a-css.css"); + + link = document.head._children[3]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("modulepreload"); + expect(link.href).toBe("https://example.com/public/path/chunk1-a-css.mjs"); + + return promise.then(() => { + expect(document.head._children).toHaveLength(4); + + const promise2 = import( + /* webpackChunkName: "chunk1" */ "./chunk1.mjs" + ); + + const promise3 = import(/* webpackChunkNafme: "chunk2" */ "./chunk2.mjs"); + + return promise3.then(() => { + expect(document.head._children).toHaveLength(4); + + const promise4 = import(/* webpackChunkName: "chunk1-css" */ "./chunk1.css"); + + expect(document.head._children).toHaveLength(5); + + link = document.head._children[4]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("stylesheet"); + expect(link.href).toBe("https://example.com/public/path/chunk1-css.css"); + expect(link.crossOrigin).toBe("anonymous"); + + const promise5 = import(/* webpackChunkName: "chunk2-css", webpackPrefetch: true */ "./chunk2.css"); + + expect(document.head._children).toHaveLength(6); + + link = document.head._children[5]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("stylesheet"); + expect(link.href).toBe("https://example.com/public/path/chunk2-css.css"); + expect(link.crossOrigin).toBe("anonymous"); + }); + }); +}); diff --git a/test/configCases/css/prefetch-preload-module-only-css/webpack.config.js b/test/configCases/css/prefetch-preload-module-only-css/webpack.config.js new file mode 100644 index 00000000000..1d4d67a7068 --- /dev/null +++ b/test/configCases/css/prefetch-preload-module-only-css/webpack.config.js @@ -0,0 +1,24 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: "./index.mjs", + experiments: { + outputModule: true, + css: true + }, + name: "esm", + target: "web", + output: { + publicPath: "", + module: true, + filename: "bundle0.mjs", + chunkFilename: "[name].mjs", + crossOriginLoading: "anonymous", + chunkFormat: "module" + }, + performance: { + hints: false + }, + optimization: { + minimize: false + } +}; diff --git a/test/configCases/css/prefetch-preload-module/chunk1-a.css b/test/configCases/css/prefetch-preload-module/chunk1-a.css new file mode 100644 index 00000000000..195b6bcf6d2 --- /dev/null +++ b/test/configCases/css/prefetch-preload-module/chunk1-a.css @@ -0,0 +1,3 @@ +a { + color: red; +} diff --git a/test/configCases/css/prefetch-preload-module/chunk1-a.mjs b/test/configCases/css/prefetch-preload-module/chunk1-a.mjs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/css/prefetch-preload-module/chunk1-b.mjs b/test/configCases/css/prefetch-preload-module/chunk1-b.mjs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/css/prefetch-preload-module/chunk1-c.mjs b/test/configCases/css/prefetch-preload-module/chunk1-c.mjs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/css/prefetch-preload-module/chunk1.css b/test/configCases/css/prefetch-preload-module/chunk1.css new file mode 100644 index 00000000000..195b6bcf6d2 --- /dev/null +++ b/test/configCases/css/prefetch-preload-module/chunk1.css @@ -0,0 +1,3 @@ +a { + color: red; +} diff --git a/test/configCases/css/prefetch-preload-module/chunk1.mjs b/test/configCases/css/prefetch-preload-module/chunk1.mjs new file mode 100644 index 00000000000..eedf378375d --- /dev/null +++ b/test/configCases/css/prefetch-preload-module/chunk1.mjs @@ -0,0 +1,6 @@ +export default function() { + import(/* webpackPrefetch: true, webpackChunkName: "chunk1-a" */ "./chunk1-a.mjs"); + import(/* webpackPreload: true, webpackChunkName: "chunk1-b" */ "./chunk1-b.mjs"); + import(/* webpackPreload: true, webpackChunkName: "chunk1-a-css" */ "./chunk1-a.css"); + import(/* webpackPrefetch: 10, webpackChunkName: "chunk1-c" */ "./chunk1-c.mjs"); +} diff --git a/test/configCases/css/prefetch-preload-module/chunk2.css b/test/configCases/css/prefetch-preload-module/chunk2.css new file mode 100644 index 00000000000..3b4cc03b68a --- /dev/null +++ b/test/configCases/css/prefetch-preload-module/chunk2.css @@ -0,0 +1,3 @@ +a { + color: blue; +} diff --git a/test/configCases/css/prefetch-preload-module/chunk2.mjs b/test/configCases/css/prefetch-preload-module/chunk2.mjs new file mode 100644 index 00000000000..1c565540ef9 --- /dev/null +++ b/test/configCases/css/prefetch-preload-module/chunk2.mjs @@ -0,0 +1,4 @@ +export default function() { + import(/* webpackPrefetch: true, webpackChunkName: "chunk1-a" */ "./chunk1-a.mjs"); + import(/* webpackPreload: true, webpackChunkName: "chunk1-b" */ "./chunk1-b.mjs"); +} diff --git a/test/configCases/css/prefetch-preload-module/index.mjs b/test/configCases/css/prefetch-preload-module/index.mjs new file mode 100644 index 00000000000..86b97ef2ea3 --- /dev/null +++ b/test/configCases/css/prefetch-preload-module/index.mjs @@ -0,0 +1,103 @@ +// This config need to be set on initial evaluation to be effective +__webpack_nonce__ = "nonce"; +__webpack_public_path__ = "https://example.com/public/path/"; + +it("should prefetch and preload child chunks on chunk load", () => { + let link, script; + + expect(document.head._children).toHaveLength(3); + + // Test preload + link = document.head._children[0]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("prefetch"); + expect(link.as).toBe("script"); + expect(link.href).toBe("https://example.com/public/path/chunk1.mjs"); + + // Test prefetch + link = document.head._children[1]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("prefetch"); + expect(link.as).toBe("style"); + expect(link.href).toBe("https://example.com/public/path/chunk2-css.css"); + + link = document.head._children[2]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("prefetch"); + expect(link.as).toBe("script"); + expect(link.href).toBe("https://example.com/public/path/chunk2-css.mjs"); + + const promise = import( + /* webpackChunkName: "chunk1", webpackPrefetch: true */ "./chunk1.mjs" + ); + + expect(document.head._children).toHaveLength(6); + + // Test normal script loading + link = document.head._children[3]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("preload"); + expect(link.as).toBe("style"); + expect(link.href).toBe("https://example.com/public/path/chunk1-a-css.css"); + + link = document.head._children[4]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("modulepreload"); + expect(link.href).toBe("https://example.com/public/path/chunk1-a-css.mjs"); + + link = document.head._children[5]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("modulepreload"); + expect(link.href).toBe("https://example.com/public/path/chunk1-b.mjs"); + + return promise.then(() => { + expect(document.head._children).toHaveLength(8); + + link = document.head._children[6]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("prefetch"); + expect(link.as).toBe("script"); + expect(link.href).toBe("https://example.com/public/path/chunk1-c.mjs"); + + link = document.head._children[7]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("prefetch"); + expect(link.as).toBe("script"); + expect(link.href).toBe("https://example.com/public/path/chunk1-a.mjs"); + + const promise2 = import( + /* webpackChunkName: "chunk1", webpackPrefetch: true */ "./chunk1.mjs" + ); + + // Loading chunk1 again should not trigger prefetch/preload + expect(document.head._children).toHaveLength(8); + + const promise3 = import(/* webpackChunkName: "chunk2" */ "./chunk2.mjs"); + + expect(document.head._children).toHaveLength(8); + + return promise3.then(() => { + expect(document.head._children).toHaveLength(8); + + const promise4 = import(/* webpackChunkName: "chunk1-css" */ "./chunk1.css"); + + expect(document.head._children).toHaveLength(9); + + link = document.head._children[8]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("stylesheet"); + expect(link.href).toBe("https://example.com/public/path/chunk1-css.css"); + expect(link.crossOrigin).toBe("anonymous"); + + const promise5 = import(/* webpackChunkName: "chunk2-css", webpackPrefetch: true */ "./chunk2.css"); + + expect(document.head._children).toHaveLength(10); + + link = document.head._children[9]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("stylesheet"); + expect(link.href).toBe("https://example.com/public/path/chunk2-css.css"); + expect(link.crossOrigin).toBe("anonymous"); + }); + }); +}); diff --git a/test/configCases/css/prefetch-preload-module/webpack.config.js b/test/configCases/css/prefetch-preload-module/webpack.config.js new file mode 100644 index 00000000000..1d4d67a7068 --- /dev/null +++ b/test/configCases/css/prefetch-preload-module/webpack.config.js @@ -0,0 +1,24 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: "./index.mjs", + experiments: { + outputModule: true, + css: true + }, + name: "esm", + target: "web", + output: { + publicPath: "", + module: true, + filename: "bundle0.mjs", + chunkFilename: "[name].mjs", + crossOriginLoading: "anonymous", + chunkFormat: "module" + }, + performance: { + hints: false + }, + optimization: { + minimize: false + } +}; diff --git a/test/configCases/css/pseudo-export/imported.js b/test/configCases/css/pseudo-export/imported.js new file mode 100644 index 00000000000..c00487d795d --- /dev/null +++ b/test/configCases/css/pseudo-export/imported.js @@ -0,0 +1,3 @@ +import * as style from "./style.module.css?imported"; + +export default Object(style); diff --git a/test/configCases/css/pseudo-export/index.js b/test/configCases/css/pseudo-export/index.js new file mode 100644 index 00000000000..a5544176023 --- /dev/null +++ b/test/configCases/css/pseudo-export/index.js @@ -0,0 +1,58 @@ +it("should allow to dynamic import a css module", done => { + __non_webpack_require__("./style_module_css.bundle0.js"); + import("./style.module.css").then(x => { + try { + expect(x).toEqual( + nsObj({ + a: "a", + abc: "a b c", + comments: "abc/****/ /* hello world *//****/ def", + whitespace: "abc\n\tdef", + default: "default" + }) + ); + } catch (e) { + return done(e); + } + done(); + }, done); +}); + +it("should allow to reexport a css module", done => { + __non_webpack_require__("./reexported_js.bundle0.js"); + import("./reexported").then(x => { + try { + expect(x).toEqual( + nsObj({ + a: "a", + abc: "a b c", + comments: "abc/****/ /* hello world *//****/ def", + whitespace: "abc\n\tdef" + }) + ); + } catch (e) { + return done(e); + } + done(); + }, done); +}); + +it("should allow to import a css module", done => { + __non_webpack_require__("./imported_js.bundle0.js"); + import("./imported").then(({ default: x }) => { + try { + expect(x).toEqual( + nsObj({ + a: "a", + abc: "a b c", + comments: "abc/****/ /* hello world *//****/ def", + whitespace: "abc\n\tdef", + default: "default" + }) + ); + } catch (e) { + return done(e); + } + done(); + }, done); +}); diff --git a/test/configCases/css/pseudo-export/reexported.js b/test/configCases/css/pseudo-export/reexported.js new file mode 100644 index 00000000000..d50dc4c5003 --- /dev/null +++ b/test/configCases/css/pseudo-export/reexported.js @@ -0,0 +1 @@ +export * from "./style.module.css?reexported"; diff --git a/test/configCases/css/pseudo-export/style.module.css b/test/configCases/css/pseudo-export/style.module.css new file mode 100644 index 00000000000..24f1786c047 --- /dev/null +++ b/test/configCases/css/pseudo-export/style.module.css @@ -0,0 +1,25 @@ +:export { + a: a; +} + +:export { + abc: a b c; + comments: abc/****/ /* hello world *//****/ def +} + +:export + + +{ + + + whitespace + + : + + abc + def + +} + +:export{default:default} diff --git a/test/configCases/css/pseudo-export/webpack.config.js b/test/configCases/css/pseudo-export/webpack.config.js new file mode 100644 index 00000000000..cfb8e5c0346 --- /dev/null +++ b/test/configCases/css/pseudo-export/webpack.config.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + experiments: { + css: true + } +}; diff --git a/test/configCases/css/pseudo-import/after.modules.css b/test/configCases/css/pseudo-import/after.modules.css new file mode 100644 index 00000000000..2c01aa6cf1c --- /dev/null +++ b/test/configCases/css/pseudo-import/after.modules.css @@ -0,0 +1,3 @@ +:export { + somevalue: red; +} diff --git a/test/configCases/css/pseudo-import/export.modules.css b/test/configCases/css/pseudo-import/export.modules.css new file mode 100644 index 00000000000..26d29938006 --- /dev/null +++ b/test/configCases/css/pseudo-import/export.modules.css @@ -0,0 +1,3 @@ +:export { + primary-color: red; +} diff --git a/test/configCases/css/pseudo-import/index.js b/test/configCases/css/pseudo-import/index.js new file mode 100644 index 00000000000..e501979567d --- /dev/null +++ b/test/configCases/css/pseudo-import/index.js @@ -0,0 +1,30 @@ +import './style.modules.css'; + +it("should compile", () => { + const links = document.getElementsByTagName("link"); + const css = []; + + // Skip first because import it by default + for (const link of links.slice(1)) { + css.push(link.sheet.css); + } + + expect(css).toMatchSnapshot(); +}); + +it("should re-export", (done) => { + import("./reexport.modules.css").then((module) => { + try { + expect(module).toEqual(nsObj({ + "className": "_reexport_modules_css-className", + "primary-color": "constructor", + "secondary-color": "toString", + })); + } catch(e) { + done(e); + return; + } + + done() + }, done) +}); diff --git a/test/configCases/css/pseudo-import/library.modules.css b/test/configCases/css/pseudo-import/library.modules.css new file mode 100644 index 00000000000..08ed1e13494 --- /dev/null +++ b/test/configCases/css/pseudo-import/library.modules.css @@ -0,0 +1,6 @@ +:export { + a: red; + -b: red; + --c: red; + _d: red; +} diff --git a/test/configCases/css/pseudo-import/reexport.modules.css b/test/configCases/css/pseudo-import/reexport.modules.css new file mode 100644 index 00000000000..edcae7e7a8a --- /dev/null +++ b/test/configCases/css/pseudo-import/reexport.modules.css @@ -0,0 +1,14 @@ +:import("./vars.modules.css") { + constructor: primary-color; + toString: secondary-color; +} + +.className { + color: constructor; + display: toString; +} + +:export { + primary-color: constructor; + secondary-color: toString; +} diff --git a/test/configCases/css/pseudo-import/style.modules.css b/test/configCases/css/pseudo-import/style.modules.css new file mode 100644 index 00000000000..bc8006bb559 --- /dev/null +++ b/test/configCases/css/pseudo-import/style.modules.css @@ -0,0 +1,68 @@ +:import( /* test */ "./export.modules.css" /* test */ ) { + IMPORTED_NAME: primary-color; +} + +:import("library.modules.css") { + i__imported_a_0: a; + i__imported__b_1: -b; + i__imported___c_2: --c; + i__imported__d_3: _d; +} + +.class { + color: IMPORTED_NAME; + background: IMPORTED_NAME; +} + + +.class {background: IMPORTED_NAME} + +.class { + color: i__imported_a_0; + color: i__imported__b_1; + color: i__imported___c_2; + color: i__imported__d_3; +} + +:import("./after.modules.css") { + something: somevalue; +} + +.class { + color: something; +} + +:import("./after.modules.css") { + again: somevalue; +} + +.class { + color: again; +} + +/* TODO fix me */ +/*:import("reexport.modules.css") { + primary-color: _my_color; +} + +.class {color: primary-color}*/ + +:import("vars-1.modules.css") { + _i_multile_values: multile-values; +} + +.class { + color: _i_multile_values ; +} + +.nest { + :import("./export.modules.css") { + unknown: unknown; + } + + :export { + unknown: unknown; + } + + unknown: unknown; +} diff --git a/test/configCases/css/pseudo-import/test.config.js b/test/configCases/css/pseudo-import/test.config.js new file mode 100644 index 00000000000..1d05d5addff --- /dev/null +++ b/test/configCases/css/pseudo-import/test.config.js @@ -0,0 +1,11 @@ +module.exports = { + findBundle(i, options) { + return ["reexport_modules_css.bundle0.js", "bundle0.js"]; + }, + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "bundle0.css"; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/pseudo-import/vars-1.modules.css b/test/configCases/css/pseudo-import/vars-1.modules.css new file mode 100644 index 00000000000..eeffd40f3e7 --- /dev/null +++ b/test/configCases/css/pseudo-import/vars-1.modules.css @@ -0,0 +1,3 @@ +:export { + multile-values: red, red, func() +} diff --git a/test/configCases/css/pseudo-import/vars.modules.css b/test/configCases/css/pseudo-import/vars.modules.css new file mode 100644 index 00000000000..0c56d212b11 --- /dev/null +++ b/test/configCases/css/pseudo-import/vars.modules.css @@ -0,0 +1,4 @@ +:export { + primary-color: red; + secondary-color: block; +} diff --git a/test/configCases/css/pseudo-import/warnings.js b/test/configCases/css/pseudo-import/warnings.js new file mode 100644 index 00000000000..b9c29247d8c --- /dev/null +++ b/test/configCases/css/pseudo-import/warnings.js @@ -0,0 +1,3 @@ +module.exports = [ + // /ICSS import "NONE_IMPORT" has no value./ +]; diff --git a/test/configCases/css/pseudo-import/webpack.config.js b/test/configCases/css/pseudo-import/webpack.config.js new file mode 100644 index 00000000000..cfb8e5c0346 --- /dev/null +++ b/test/configCases/css/pseudo-import/webpack.config.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + experiments: { + css: true + } +}; diff --git a/test/configCases/css/pure-css/index.js b/test/configCases/css/pure-css/index.js new file mode 100644 index 00000000000..3b26850a1e7 --- /dev/null +++ b/test/configCases/css/pure-css/index.js @@ -0,0 +1,14 @@ +import "./style.css"; + +it("should compile", done => { + const links = document.getElementsByTagName("link"); + const css = []; + + // Skip first because import it by default + for (const link of links.slice(1)) { + css.push(link.sheet.css); + } + + expect(css).toMatchSnapshot(); + done(); +}); diff --git a/test/configCases/css/pure-css/style.css b/test/configCases/css/pure-css/style.css new file mode 100644 index 00000000000..6d8da5a2a7b --- /dev/null +++ b/test/configCases/css/pure-css/style.css @@ -0,0 +1,39 @@ +@import url("../css-modules/style.module.css"); + +.class { + color: red; + background: var(--color); +} + +@keyframes test { + 0% { + color: red; + } + 100% { + color: blue; + } +} + +:local(.class) { + color: red; +} + +:local .class { + color: green; +} + +:global(.class) { + color: blue; +} + +:global .class { + color: white; +} + +:export { + foo: bar; +} + +.class { + animation: test 1s, test; +} diff --git a/test/configCases/css/pure-css/test.config.js b/test/configCases/css/pure-css/test.config.js new file mode 100644 index 00000000000..0590757288f --- /dev/null +++ b/test/configCases/css/pure-css/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "bundle0.css"; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/pure-css/webpack.config.js b/test/configCases/css/pure-css/webpack.config.js new file mode 100644 index 00000000000..53df0bf1ff2 --- /dev/null +++ b/test/configCases/css/pure-css/webpack.config.js @@ -0,0 +1,16 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + module: { + rules: [ + { + test: /\.css$/i, + type: "css" + } + ] + }, + experiments: { + css: true + } +}; diff --git a/test/configCases/css/runtime-data-webpack/index.js b/test/configCases/css/runtime-data-webpack/index.js new file mode 100644 index 00000000000..46360d4fd0d --- /dev/null +++ b/test/configCases/css/runtime-data-webpack/index.js @@ -0,0 +1,7 @@ +import "./style.css"; + +it("should work", () => { + const computedStyle = getComputedStyle(document.body); + expect(computedStyle.getPropertyValue("color")).toBe(" red"); + expect(computedStyle.getPropertyValue("background")).toBe(" red"); +}); diff --git a/test/configCases/css/runtime-data-webpack/other-style.css b/test/configCases/css/runtime-data-webpack/other-style.css new file mode 100644 index 00000000000..575d19f7b0e --- /dev/null +++ b/test/configCases/css/runtime-data-webpack/other-style.css @@ -0,0 +1,3 @@ +body { + color: red; +} diff --git a/test/configCases/css/runtime-data-webpack/style.css b/test/configCases/css/runtime-data-webpack/style.css new file mode 100644 index 00000000000..812c07c7f78 --- /dev/null +++ b/test/configCases/css/runtime-data-webpack/style.css @@ -0,0 +1,5 @@ +@import "other-style.css"; + +body { + background: red; +} diff --git a/test/configCases/css/runtime-data-webpack/test.config.js b/test/configCases/css/runtime-data-webpack/test.config.js new file mode 100644 index 00000000000..a24512f1ae0 --- /dev/null +++ b/test/configCases/css/runtime-data-webpack/test.config.js @@ -0,0 +1,9 @@ +module.exports = { + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "bundle0.css"; + link.setAttribute("data-webpack", "test:chunk-main"); + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/runtime-data-webpack/webpack.config.js b/test/configCases/css/runtime-data-webpack/webpack.config.js new file mode 100644 index 00000000000..336fd9f9fba --- /dev/null +++ b/test/configCases/css/runtime-data-webpack/webpack.config.js @@ -0,0 +1,40 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + output: { + uniqueName: "test" + }, + plugins: [ + { + apply(compiler) { + compiler.hooks.compilation.tap("Test", compilation => { + compilation.hooks.processAssets.tap( + { + name: "Test", + stage: + compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE + }, + assets => { + const name = "bundle0.css"; + const code = /** @type {string} */ (assets[name].source()); + + compilation.updateAsset( + name, + new compiler.webpack.sources.RawSource( + `${code.replace( + "head{", + ".class, head, body{" + )}\n\n.after-head { color: red; }` + ) + ); + } + ); + }); + } + } + ], + experiments: { + css: true + } +}; diff --git a/test/configCases/css/runtime-document-head-get-computed-style/index.js b/test/configCases/css/runtime-document-head-get-computed-style/index.js new file mode 100644 index 00000000000..46360d4fd0d --- /dev/null +++ b/test/configCases/css/runtime-document-head-get-computed-style/index.js @@ -0,0 +1,7 @@ +import "./style.css"; + +it("should work", () => { + const computedStyle = getComputedStyle(document.body); + expect(computedStyle.getPropertyValue("color")).toBe(" red"); + expect(computedStyle.getPropertyValue("background")).toBe(" red"); +}); diff --git a/test/configCases/css/runtime-document-head-get-computed-style/other-style.css b/test/configCases/css/runtime-document-head-get-computed-style/other-style.css new file mode 100644 index 00000000000..575d19f7b0e --- /dev/null +++ b/test/configCases/css/runtime-document-head-get-computed-style/other-style.css @@ -0,0 +1,3 @@ +body { + color: red; +} diff --git a/test/configCases/css/runtime-document-head-get-computed-style/style.css b/test/configCases/css/runtime-document-head-get-computed-style/style.css new file mode 100644 index 00000000000..812c07c7f78 --- /dev/null +++ b/test/configCases/css/runtime-document-head-get-computed-style/style.css @@ -0,0 +1,5 @@ +@import "other-style.css"; + +body { + background: red; +} diff --git a/test/configCases/css/runtime-document-head-get-computed-style/test.config.js b/test/configCases/css/runtime-document-head-get-computed-style/test.config.js new file mode 100644 index 00000000000..0590757288f --- /dev/null +++ b/test/configCases/css/runtime-document-head-get-computed-style/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "bundle0.css"; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/runtime-document-head-get-computed-style/webpack.config.js b/test/configCases/css/runtime-document-head-get-computed-style/webpack.config.js new file mode 100644 index 00000000000..7fb1039d0f9 --- /dev/null +++ b/test/configCases/css/runtime-document-head-get-computed-style/webpack.config.js @@ -0,0 +1,37 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + output: { + uniqueName: "test" + }, + plugins: [ + { + apply(compiler) { + compiler.hooks.compilation.tap("Test", compilation => { + compilation.hooks.processAssets.tap( + { + name: "Test", + stage: + compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE + }, + assets => { + const name = "bundle0.css"; + const code = assets[name].source(); + + compilation.updateAsset( + name, + new compiler.webpack.sources.RawSource( + `${code}\n\n.after-head { color: red; }` + ) + ); + } + ); + }); + } + } + ], + experiments: { + css: true + } +}; diff --git a/test/configCases/css/runtime-issue/asyncChunk.js b/test/configCases/css/runtime-issue/asyncChunk.js new file mode 100644 index 00000000000..7494648b883 --- /dev/null +++ b/test/configCases/css/runtime-issue/asyncChunk.js @@ -0,0 +1,2 @@ +import * as style from "./styles.js"; +export default style; \ No newline at end of file diff --git a/test/configCases/css/runtime-issue/asyncChunk2.js b/test/configCases/css/runtime-issue/asyncChunk2.js new file mode 100644 index 00000000000..7494648b883 --- /dev/null +++ b/test/configCases/css/runtime-issue/asyncChunk2.js @@ -0,0 +1,2 @@ +import * as style from "./styles.js"; +export default style; \ No newline at end of file diff --git a/test/configCases/css/runtime-issue/entry1.js b/test/configCases/css/runtime-issue/entry1.js new file mode 100644 index 00000000000..b67a66a7fdd --- /dev/null +++ b/test/configCases/css/runtime-issue/entry1.js @@ -0,0 +1,14 @@ +const img = new URL("./img.png", import.meta.url); + +it("should allow to create css modules", done => { + import("./asyncChunk").then(({ default: x }) => { + try { + expect(img.toString()).toBe("https://test.cases/path/img.png"); + expect(x.default.class).toEqual("_test_module_css-class"); + } catch (e) { + return done(e); + } + + done(); + }, done); +}); diff --git a/test/configCases/css/runtime-issue/entry2.js b/test/configCases/css/runtime-issue/entry2.js new file mode 100644 index 00000000000..c4d8a74c5af --- /dev/null +++ b/test/configCases/css/runtime-issue/entry2.js @@ -0,0 +1,14 @@ +const img = new URL("./img.png", import.meta.url); + +it("should allow to create css modules", done => { + import("./asyncChunk2").then(({ default: x }) => { + try { + expect(img.toString()).toBe("https://test.cases/path/img.png"); + expect(x.default.class).toEqual("_test_module_css-class"); + } catch (e) { + return done(e); + } + + done(); + }, done); +}); diff --git a/test/configCases/css/runtime-issue/img.png b/test/configCases/css/runtime-issue/img.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/runtime-issue/img.png differ diff --git a/test/configCases/css/runtime-issue/share.js b/test/configCases/css/runtime-issue/share.js new file mode 100644 index 00000000000..9bb91edb2e3 --- /dev/null +++ b/test/configCases/css/runtime-issue/share.js @@ -0,0 +1 @@ +const foo = `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa` diff --git a/test/configCases/css/runtime-issue/styles.js b/test/configCases/css/runtime-issue/styles.js new file mode 100644 index 00000000000..7034f505d08 --- /dev/null +++ b/test/configCases/css/runtime-issue/styles.js @@ -0,0 +1,2 @@ +import * as style from "./test.module.css"; +export default style; \ No newline at end of file diff --git a/test/configCases/css/runtime-issue/test.config.js b/test/configCases/css/runtime-issue/test.config.js new file mode 100644 index 00000000000..6362048d5f5 --- /dev/null +++ b/test/configCases/css/runtime-issue/test.config.js @@ -0,0 +1,21 @@ +module.exports = { + moduleScope(scope) { + const link1 = scope.window.document.createElement("link"); + link1.rel = "stylesheet"; + link1.href = "asyncChunk_js.css"; + scope.window.document.head.appendChild(link1); + const link2 = scope.window.document.createElement("link"); + link2.rel = "stylesheet"; + link2.href = "asyncChunk2_js.css"; + scope.window.document.head.appendChild(link2); + }, + findBundle(i, options) { + return [ + "./common-share_js-img_png.js", + "./asyncChunk_js.js", + "./main.js", + "./secondMain.js", + "./asyncChunk2_js.js" + ]; + } +}; diff --git a/test/configCases/css/runtime-issue/test.module.css b/test/configCases/css/runtime-issue/test.module.css new file mode 100644 index 00000000000..bfaebe6d7b7 --- /dev/null +++ b/test/configCases/css/runtime-issue/test.module.css @@ -0,0 +1,3 @@ +.class { + background-image: url('./img.png'); +} diff --git a/test/configCases/css/runtime-issue/webpack.config.js b/test/configCases/css/runtime-issue/webpack.config.js new file mode 100644 index 00000000000..8937b822ac1 --- /dev/null +++ b/test/configCases/css/runtime-issue/webpack.config.js @@ -0,0 +1,34 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + experiments: { + css: true + }, + entry: { + main: { + import: ["./share.js", "./entry1.js"] + }, + secondMain: { + import: ["./share.js", "./entry2.js"] + } + }, + optimization: { + splitChunks: { + chunks: "all", + cacheGroups: { + common: { + name: false, + chunks: "all", + test() { + return true; + } + } + } + } + }, + output: { + filename: "[name].js", + assetModuleFilename: "[name][ext]" + } +}; diff --git a/test/configCases/css/universal/index.js b/test/configCases/css/universal/index.js new file mode 100644 index 00000000000..4c7821b40d3 --- /dev/null +++ b/test/configCases/css/universal/index.js @@ -0,0 +1,34 @@ +import * as pureStyle from "./style.css"; +import * as styles from "./style.modules.css"; + +it("should work", done => { + expect(pureStyle).toEqual({}); + const style = getComputedStyle(document.body); + expect(style.getPropertyValue("background")).toBe(" red"); + expect(styles.foo).toBe('_style_modules_css-foo'); + + import(/* webpackPrefetch: true */ "./style2.css").then(x => { + expect(x).toEqual({}); + const style = getComputedStyle(document.body); + expect(style.getPropertyValue("color")).toBe(" blue"); + + import(/* webpackPrefetch: true */ "./style2.modules.css").then(x => { + expect(x.bar).toBe("_style2_modules_css-bar"); + done(); + }, done); + }, done); +}); + +it("should work in worker", async () => { + const worker = new Worker(new URL("./worker.js", import.meta.url), { + type: "module" + }); + worker.postMessage("ok"); + const result = await new Promise(resolve => { + worker.onmessage = event => { + resolve(event.data); + }; + }); + expect(result).toBe("data: _style_modules_css-foo _style2_modules_css-bar _style3_modules_css-baz, thanks"); + await worker.terminate(); +}); diff --git a/test/configCases/css/universal/style.css b/test/configCases/css/universal/style.css new file mode 100644 index 00000000000..f0d5b13bffd --- /dev/null +++ b/test/configCases/css/universal/style.css @@ -0,0 +1,3 @@ +body { + background: red; +} diff --git a/test/configCases/css/universal/style.modules.css b/test/configCases/css/universal/style.modules.css new file mode 100644 index 00000000000..cedf0a6d1f1 --- /dev/null +++ b/test/configCases/css/universal/style.modules.css @@ -0,0 +1,3 @@ +.foo { + color: red; +} diff --git a/test/configCases/css/universal/style2.css b/test/configCases/css/universal/style2.css new file mode 100644 index 00000000000..36505138bc9 --- /dev/null +++ b/test/configCases/css/universal/style2.css @@ -0,0 +1,3 @@ +body { + color: blue; +} diff --git a/test/configCases/css/universal/style2.modules.css b/test/configCases/css/universal/style2.modules.css new file mode 100644 index 00000000000..de51739f73d --- /dev/null +++ b/test/configCases/css/universal/style2.modules.css @@ -0,0 +1,3 @@ +.bar { + background: blue; +} diff --git a/test/configCases/css/universal/style3.modules.css b/test/configCases/css/universal/style3.modules.css new file mode 100644 index 00000000000..2e28374deb9 --- /dev/null +++ b/test/configCases/css/universal/style3.modules.css @@ -0,0 +1,3 @@ +.baz { + background: blue; +} diff --git a/test/configCases/css/universal/test.config.js b/test/configCases/css/universal/test.config.js new file mode 100644 index 00000000000..0590757288f --- /dev/null +++ b/test/configCases/css/universal/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "bundle0.css"; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/universal/test.filter.js b/test/configCases/css/universal/test.filter.js new file mode 100644 index 00000000000..f74eb03f05a --- /dev/null +++ b/test/configCases/css/universal/test.filter.js @@ -0,0 +1,5 @@ +const supportsWorker = require("../../../helpers/supportsWorker"); + +module.exports = function (config) { + return supportsWorker(); +}; diff --git a/test/configCases/css/universal/webpack.config.js b/test/configCases/css/universal/webpack.config.js new file mode 100644 index 00000000000..18c6fd14735 --- /dev/null +++ b/test/configCases/css/universal/webpack.config.js @@ -0,0 +1,9 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: ["web", "node"], + mode: "development", + experiments: { + css: true, + outputModule: true + } +}; diff --git a/test/configCases/css/universal/worker.js b/test/configCases/css/universal/worker.js new file mode 100644 index 00000000000..cad22f2a187 --- /dev/null +++ b/test/configCases/css/universal/worker.js @@ -0,0 +1,7 @@ +self.onmessage = async event => { + const { foo } = await import("./style.modules.css"); + const { bar } = await import("./style2.modules.css"); + const { baz } = await import("./style3.modules.css"); + + postMessage(`data: ${foo} ${bar} ${baz}, thanks`); +}; diff --git a/test/configCases/css/url-and-asset-module-filename/img1.png b/test/configCases/css/url-and-asset-module-filename/img1.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/url-and-asset-module-filename/img1.png differ diff --git a/test/configCases/css/url-and-asset-module-filename/index.css b/test/configCases/css/url-and-asset-module-filename/index.css new file mode 100644 index 00000000000..f6776450de8 --- /dev/null +++ b/test/configCases/css/url-and-asset-module-filename/index.css @@ -0,0 +1,7 @@ +@import "./nested/index.css"; + +h1 { + same-dir: url('./img1.png'); + nested-dir: url('./nested/img2.png'); + nested-nested-dir: url('./nested/nested/img3.png'); +} diff --git a/test/configCases/css/url-and-asset-module-filename/index.js b/test/configCases/css/url-and-asset-module-filename/index.js new file mode 100644 index 00000000000..db8244a0d78 --- /dev/null +++ b/test/configCases/css/url-and-asset-module-filename/index.js @@ -0,0 +1,22 @@ +it(`should generate correct url public path with css filename`, done => { + const h1 = document.createElement('h1'); + document.body.appendChild(h1); + const h2 = document.createElement('h2'); + document.body.appendChild(h1); + const h3 = document.createElement('h3'); + document.body.appendChild(h1); + import("./index.css").then(x => { + try { + expect(x).toEqual({}); + const style1 = getComputedStyle(h1); + expect(style1).toMatchSnapshot(); + const style2 = getComputedStyle(h2); + expect(style2).toMatchSnapshot(); + const style3 = getComputedStyle(h3); + expect(style3).toMatchSnapshot(); + done(); + } catch (e) { + done(e); + } + }, done); +}); diff --git a/test/configCases/css/url-and-asset-module-filename/nested/img2.png b/test/configCases/css/url-and-asset-module-filename/nested/img2.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/url-and-asset-module-filename/nested/img2.png differ diff --git a/test/configCases/css/url-and-asset-module-filename/nested/index.css b/test/configCases/css/url-and-asset-module-filename/nested/index.css new file mode 100644 index 00000000000..e681e125745 --- /dev/null +++ b/test/configCases/css/url-and-asset-module-filename/nested/index.css @@ -0,0 +1,7 @@ +@import "./nested/index.css"; + +h2 { + same-dir: url('./img2.png'); + nested-dir: url('./nested/img3.png'); + outer-dir: url('../img1.png'); +} diff --git a/test/configCases/css/url-and-asset-module-filename/nested/nested/img3.png b/test/configCases/css/url-and-asset-module-filename/nested/nested/img3.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/url-and-asset-module-filename/nested/nested/img3.png differ diff --git a/test/configCases/css/url-and-asset-module-filename/nested/nested/index.css b/test/configCases/css/url-and-asset-module-filename/nested/nested/index.css new file mode 100644 index 00000000000..acdd96d9881 --- /dev/null +++ b/test/configCases/css/url-and-asset-module-filename/nested/nested/index.css @@ -0,0 +1,5 @@ +h3 { + same-dir: url('./img3.png'); + outer-dir: url('../img2.png'); + outer-outer-dir: url('../../img1.png'); +} diff --git a/test/configCases/css/url-and-asset-module-filename/test.config.js b/test/configCases/css/url-and-asset-module-filename/test.config.js new file mode 100644 index 00000000000..d34e2224b44 --- /dev/null +++ b/test/configCases/css/url-and-asset-module-filename/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return [`index_css.bundle${i}.js`, `bundle${i}.js`]; + } +}; diff --git a/test/configCases/css/url-and-asset-module-filename/webpack.config.js b/test/configCases/css/url-and-asset-module-filename/webpack.config.js new file mode 100644 index 00000000000..3d6979860e5 --- /dev/null +++ b/test/configCases/css/url-and-asset-module-filename/webpack.config.js @@ -0,0 +1,48 @@ +/** @type {import("../../../../").Configuration} */ +const common = { + target: "web", + mode: "development", + devtool: false, + experiments: { + css: true + } +}; + +/** @type {import("../../../../").Configuration} */ +module.exports = [ + { + ...common, + output: { + publicPath: "auto", + cssChunkFilename: "bundle0/css/[name].css", + assetModuleFilename: "bundle0/assets/[name][ext]" + } + }, + { + ...common, + output: { + publicPath: "https://test.cases/path/", + cssChunkFilename: "bundle1/css/[name].css", + assetModuleFilename: "bundle1/assets/[name][ext]" + } + }, + { + ...common, + output: { + cssChunkFilename: "bundle2/css/[name].css" + }, + module: { + rules: [ + { + test: /\.png$/i, + type: "asset/resource", + generator: { + filename: "[name][ext]", + outputPath: "bundle2/assets/", + publicPath: "https://test.cases/path/bundle2/assets/" + } + } + ] + } + } +]; diff --git a/test/configCases/css/url/errors.js b/test/configCases/css/url/errors.js new file mode 100644 index 00000000000..0b3629f382e --- /dev/null +++ b/test/configCases/css/url/errors.js @@ -0,0 +1 @@ +module.exports = [/Can't resolve 'unresolved.png'/]; diff --git a/test/configCases/css/url/font with spaces.eot b/test/configCases/css/url/font with spaces.eot new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/css/url/font.eot b/test/configCases/css/url/font.eot new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/css/url/font.svg b/test/configCases/css/url/font.svg new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/css/url/font.ttf b/test/configCases/css/url/font.ttf new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/css/url/font.woff b/test/configCases/css/url/font.woff new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/css/url/font.woff2 b/test/configCases/css/url/font.woff2 new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/css/url/img img.png b/test/configCases/css/url/img img.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/url/img img.png differ diff --git a/test/configCases/css/url/img'''img.png b/test/configCases/css/url/img'''img.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/url/img'''img.png differ diff --git a/test/configCases/css/url/img'() img.png b/test/configCases/css/url/img'() img.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/url/img'() img.png differ diff --git a/test/configCases/css/url/img'img.png b/test/configCases/css/url/img'img.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/url/img'img.png differ diff --git a/test/configCases/css/url/img(img.png b/test/configCases/css/url/img(img.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/url/img(img.png differ diff --git a/test/configCases/css/url/img)img.png b/test/configCases/css/url/img)img.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/url/img)img.png differ diff --git a/test/configCases/css/url/img.png b/test/configCases/css/url/img.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/url/img.png differ diff --git a/test/configCases/css/url/img1x.png b/test/configCases/css/url/img1x.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/url/img1x.png differ diff --git a/test/configCases/css/url/img2x.png b/test/configCases/css/url/img2x.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/url/img2x.png differ diff --git a/test/configCases/css/url/img3x.png b/test/configCases/css/url/img3x.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/url/img3x.png differ diff --git a/test/configCases/css/url/imgimg.png b/test/configCases/css/url/imgimg.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/url/imgimg.png differ diff --git a/test/configCases/css/url/imgn.png b/test/configCases/css/url/imgn.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/url/imgn.png differ diff --git a/test/configCases/css/url/index.js b/test/configCases/css/url/index.js new file mode 100644 index 00000000000..d4120b0b952 --- /dev/null +++ b/test/configCases/css/url/index.js @@ -0,0 +1,14 @@ +import "./style.css"; + +it(`should work with URLs in CSS`, done => { + const links = document.getElementsByTagName("link"); + const css = []; + + // Skip first because import it by default + for (const link of links.slice(1)) { + css.push(link.sheet.css); + } + + expect(css).toMatchSnapshot(); + done(); +}); diff --git a/test/configCases/css/url/nested.css b/test/configCases/css/url/nested.css new file mode 100644 index 00000000000..fcf3dab244c --- /dev/null +++ b/test/configCases/css/url/nested.css @@ -0,0 +1,5 @@ +@import url("#test"); + +.nested { + background: url('./img.png'); +} diff --git a/test/configCases/css/url/nested/img-simple.png b/test/configCases/css/url/nested/img-simple.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/url/nested/img-simple.png differ diff --git a/test/configCases/css/url/nested/img.png b/test/configCases/css/url/nested/img.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/url/nested/img.png differ diff --git a/test/configCases/css/url/nested/other.png b/test/configCases/css/url/nested/other.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/url/nested/other.png differ diff --git a/test/configCases/css/url/node_modules/package/img.png b/test/configCases/css/url/node_modules/package/img.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/url/node_modules/package/img.png differ diff --git a/test/configCases/css/url/node_modules/package/package.json b/test/configCases/css/url/node_modules/package/package.json new file mode 100644 index 00000000000..75b93e3b25a --- /dev/null +++ b/test/configCases/css/url/node_modules/package/package.json @@ -0,0 +1,4 @@ +{ + "name": "package", + "version": "1.0.0" +} diff --git a/test/configCases/css/url/other-img.png b/test/configCases/css/url/other-img.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/url/other-img.png differ diff --git a/test/configCases/css/url/style.css b/test/configCases/css/url/style.css new file mode 100644 index 00000000000..f2dce0bcd1c --- /dev/null +++ b/test/configCases/css/url/style.css @@ -0,0 +1,621 @@ +@import "./nested.css"; + +div { + a: url('./img.png'); +} + +div { + b: url("./img.png"); +} + +div { + c: url(./img.png); +} + +div { + d: url("./img.png#hash"); +} + +div { + e: url( + "./img.png" + ); +} + +div { + f: green url( './img.png' ) xyz; +} + +div { + g: green url( "./img.png" ) xyz; +} + +div { + h: green url( ./img.png ) xyz; +} + +div { + i: green url(package/img.png) url(./img.png) xyz; +} + +div { + j: green url( "./img img.png" ) xyz; +} + +div { + k: green url( './img img.png' ) xyz; +} + +div { + l: green url(/img.png) xyz; +} + +div { + m: green URL(/img.png) xyz; +} + +div { + n: green uRl(/img.png) xyz; +} + +div { + --foo: url('./img.png'); +} + +div { + a1: url('./img.png'); +} + +div { + a2: url("./img.png"); +} + +div { + a3: url(./img.png); +} + +div { + a4: url("./img.png#hash"); +} + +div { + a5: url( + "./img.png" + ); +} + +div { + a6: green url( './img.png' ) xyz; +} + +div { + a7: green url( "./img.png" ) xyz; +} + +div { + a8: green url( ./img.png ) xyz; +} + +div { + a9: green url(package/img.png) url(./other-img.png) xyz; +} + +div { + a10: green url( "./img img.png" ) xyz; +} + +div { + a11: green url( './img img.png' ) xyz; +} + +div { + a12: green url(/img.png) xyz; +} + +div { + a13: green url(data:image/png;base64,AAA) url(http://example.com/image.jpg) url(//example.com/image.png) xyz; +} + +div { + a14: url("data:image/svg+xml;charset=utf-8,"); +} + +div { + a15: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2042%2026%27%20fill%3D%27%2523007aff%27%3E%3Crect%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%271%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2711%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2712%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3Crect%20y%3D%2722%27%20width%3D%274%27%20height%3D%274%27%2F%3E%3Crect%20x%3D%278%27%20y%3D%2723%27%20width%3D%2734%27%20height%3D%272%27%2F%3E%3C%2Fsvg%3E"); +} + +div { + a16: url('data:image/svg+xml;charset=utf-8,#filter'); +} + +div { + a17: url('data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%5C%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%5C%22%3E%3Cfilter%20id%3D%5C%22filter%5C%22%3E%3CfeGaussianBlur%20in%3D%5C%22SourceAlpha%5C%22%20stdDeviation%3D%5C%220%5C%22%20%2F%3E%3CfeOffset%20dx%3D%5C%221%5C%22%20dy%3D%5C%222%5C%22%20result%3D%5C%22offsetblur%5C%22%20%2F%3E%3CfeFlood%20flood-color%3D%5C%22rgba(255%2C255%2C255%2C1)%5C%22%20%2F%3E%3CfeComposite%20in2%3D%5C%22offsetblur%5C%22%20operator%3D%5C%22in%5C%22%20%2F%3E%3CfeMerge%3E%3CfeMergeNode%20%2F%3E%3CfeMergeNode%20in%3D%5C%22SourceGraphic%5C%22%20%2F%3E%3C%2FfeMerge%3E%3C%2Ffilter%3E%3C%2Fsvg%3E%23filter'); +} + +div { + a18: url(#highlight); +} + +div { + a19: url('#line-marker'); +} + +@font-face { + a20: url(./font.woff) format('woff'), + url('./font.woff2') format('woff2'), + url("./font.eot") format('eot'), + url(./font.ttf) format('truetype'), + url("./font with spaces.eot") format("embedded-opentype"), + url('./font.svg#svgFontName') format('svg'), + url('./font.woff2?foo=bar') format('woff2'), + url("./font.eot?#iefix") format('embedded-opentype'), + url("./font with spaces.eot?#iefix") format('embedded-opentype'); +} + +@media (min-width: 500px) { + div { + a21: url("./img.png"); + } +} + +div { + a22: "do not use url(path)"; +} + +div { + a23: 'do not "use" url(path)'; +} + +div { + a24: -webkit-image-set(url('./img1x.png') 1x, url('./img2x.png') 2x) +} + +div { + a25: image-set(url('./img1x.png') 1x, url('./img2x.png') 2x) +} + +div { + a26: green url() xyz; +} + +div { + a27: green url('') xyz; +} + +div { + a28: green url("") xyz; +} + +div { + a29: green url(' ') xyz; +} + +div { + a30: green url( + ) xyz; +} + +div { + a40: green url(https://raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz; +} + +div { + a41: green url(//raw.githubusercontent.com/webpack/media/master/logo/icon.png) xyz; +} + +div { + a42: url("./img.png?foo"); +} + +div { + a43: url("./img.png?foo=bar"); +} + +div { + a44: url("./img.png?foo=bar#hash"); +} + +div { + a45: url("./img.png?foo=bar#hash"); +} + +div { + a46: url("./img.png?"); +} + +div { + a47: url('./img.png') url("data:image/svg+xml;charset=utf-8,") url('./img.png'); +} + +div { + a48: __URL__(); +} + +div { + a49: url('./nested/../nested/img-simple.png'); +} + +div { + a50: url('/nested/img-simple.png'); +} + +div { + a51: url('../url/nested/img-simple.png'); +} + +div { + a52: url(./nested/img.png); +} + +div { + a53: url(nested/img.png); +} + +@font-face { + a54: url("//at.alicdn.com/t/font_515771_emcns5054x3whfr.eot"); +} + +div { + a55: -webkit-image-set(); + a56: -webkit-image-set(''); + a56: image-set(); + a58: image-set(''); + a59: image-set(""); + a60: image-set("" 1x); + a61: image-set(url()); + a62: image-set( + url() + ); + a63: image-set(URL()); + a64: image-set(url('')); + a65: image-set(url("")); + a66: image-set(url('') 1x); + a67: image-set(1x); + a68: image-set( + 1x + ); + a69: image-set(calc(1rem + 1px) 1x); + + a70: -webkit-image-set("./img1x.png" 1x, "./img2x.png" 2x); + a71: image-set("./img1x.png" 1x); + a72: image-set("./img1x.png" 1x, "./img2x.png" 2x); + a73: image-set("./img img.png" 1x, "./img img.png" 2x); + a74: image-set("./img1x.png" 1x, "./img2x.png" 2x), + image-set("./img1x.png" 1x, "./img2x.png" 2x); + a75: image-set( + "./img1x.png" 1x, + "./img2x.png" 2x, + "./img3x.png" 600dpi + ); + a76: image-set("./img1x.png?foo=bar" 1x); + a77: image-set("./img1x.png#hash" 1x); + a78: image-set("./img1x.png?#iefix" 1x); + + a79: -webkit-image-set(url("./img1x.png") 1x, url("./img2x.png") 2x); + a80: -webkit-image-set(url("./img1x.png") 1x); + a81: -webkit-image-set( + url("./img1x.png") 1x + ); + a82: image-set(url(./img1x.png) 1x); + a83: image-set( + url(./img1x.png) 1x + ); + a84: image-set(url("./img1x.png") 1x, url("./img2x.png") 2x); + a85: image-set( + url(./img1x.png) 1x, + url(./img2x.png) 2x, + url(./img3x.png) 600dpi + ); + a86: image-set(url("./img img.png") 1x, url("./img img.png") 2x); + + a87: image-set(url("./img1x.png") 1x, "./img2x.png" 2x); +} + +div { + a88: url(./img\img.png); + a89: url(./img\'img.png); + a90: url(./img\'\'\'img.png); + a91: url(./img\(img.png); + a92: url(./img\)img.png); + a93: url(./img\ img.png); + a94: url(./img\'\(\)\ img.png); + + a95: image-set( + url(./img\img.png) 1x, + url(./img\'\'\'img.png) 2x, + url(./img\'img.png) 3x, + url(./img\(img.png) 4x, + url(./img\)img.png) 5x, + url(./img\ img.png) 6x, + url(./img\'\(\)\ img.png) 7x + ); +} + +div { + a96: url("./img'''img.png"); + a97: url("./img'() img.png"); + a98: url("./img'img.png"); + a99: url("./img(img.png"); + a100: url("./img)img.png"); + a101: url('./img img.png'); + a102: url("./img img.png"); +} + +div { + a103: url('./img\ +(img.png'); + a104: url('./img\ +(img.png'); + a105: url('./img\ +(img.png'); + a106: url('./img\ +\ +\ +\ +(img.png'); +} + +div { + a107: url("./img%27%27%27img.png"); + a108: url("./img%27%28%29%20img.png"); + a109: url("./img%27img.png"); + a110: url("./img%28img.png"); + a111: url("./img%29img.png"); + a112: url("./img%20img.png"); + a113: url(./img%27%27%27img.png); + a114: url(./img%27%28%29%20img.png); + a115: url(./img%27img.png); + a116: url(./img%28img.png); + a117: url(./img%29img.png); + a118: url(./img%20img.png); +} + +div { + a119: url('img.png'); +} + +div { + a120: url("./img\'\'\'img.png"); + a121: url("./img\'\(\)\ img.png"); + a122: url("./img\'img.png"); + a123: url("./img\(img.png"); + a124: url("./img\)img.png"); + a125: url("./img\ img.png"); + a126: url("./\69\6D\67.png"); + a127: url(./\69\6D\67.png); + a128: url("./img\27img.png"); + a129: url("./img\'\28%29 img.png"); + a130: url(./img\'\28%29\ img.png); +} + +div { + a131: url('./img.png'); + a132: url('./img.png'); + + a133: url('./img.png?foo=bar'); + a134: url('./img.png?foo=bar'); + + a135: url('./img.png?foo=bar#hash'); + a136: url('./img.png?foo=bar#hash'); + + a137: url('./img.png?foo=bar'); + a138: url('./img.png?bar=foo'); + + a139: url('./img.png?foo=bar#foo'); + a140: url('./img.png?bar=foo#bar'); + + a141: url('./img.png?foo=1&bar=2'); + a142: url('./img.png?foo=2&bar=1'); +} + +div { + a143: url("data:image/svg+xml;charset=UTF-8,%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%3F%3E%0A%3C!DOCTYPE%20svg%20PUBLIC%20%22-%2F%2FW3C%2F%2FDTD%20SVG%201.1%2F%2FEN%22%20%22http%3A%2F%2Fwww.w3.org%2FGraphics%2FSVG%2F1.1%2FDTD%2Fsvg11.dtd%22%3E%0A%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%0A%09%20width%3D%22191px%22%20height%3D%22191px%22%20viewBox%3D%220%200%20191%20191%22%20enable-background%3D%22new%200%200%20191%20191%22%20xml%3Aspace%3D%22preserve%22%3E%0A%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M95.5%2C0C42.8%2C0%2C0%2C42.8%2C0%2C95.5S42.8%2C191%2C95.5%2C191S191%2C148.2%2C191%2C95.5S148.2%2C0%2C95.5%2C0z%20M95.5%2C187.6%0A%09c-50.848%2C0-92.1-41.25-92.1-92.1c0-50.848%2C41.252-92.1%2C92.1-92.1c50.85%2C0%2C92.1%2C41.252%2C92.1%2C92.1%0A%09C187.6%2C146.35%2C146.35%2C187.6%2C95.5%2C187.6z%22%2F%3E%0A%3Cg%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M92.9%2C10v8.6H91v-6.5c-0.1%2C0.1-0.2%2C0.2-0.4%2C0.3c-0.2%2C0.1-0.3%2C0.2-0.4%2C0.2c-0.1%2C0-0.3%2C0.1-0.5%2C0.2%0A%09%09c-0.2%2C0.1-0.3%2C0.1-0.5%2C0.1v-1.6c0.5-0.1%2C0.9-0.3%2C1.4-0.5c0.5-0.2%2C0.8-0.5%2C1.2-0.7h1.1V10z%22%2F%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M97.1%2C17.1h3.602v1.5h-5.6V18c0-0.4%2C0.1-0.8%2C0.2-1.2c0.1-0.4%2C0.3-0.6%2C0.5-0.9c0.2-0.3%2C0.5-0.5%2C0.7-0.7%0A%09%09c0.2-0.2%2C0.5-0.4%2C0.7-0.6c0.199-0.2%2C0.5-0.3%2C0.6-0.5c0.102-0.2%2C0.301-0.3%2C0.5-0.5c0.2-0.2%2C0.2-0.3%2C0.301-0.5%0A%09%09c0.101-0.2%2C0.101-0.3%2C0.101-0.5c0-0.4-0.101-0.6-0.3-0.8c-0.2-0.2-0.4-0.3-0.801-0.3c-0.699%2C0-1.399%2C0.3-2.101%2C0.9v-1.6%0A%09%09c0.7-0.5%2C1.5-0.7%2C2.5-0.7c0.399%2C0%2C0.8%2C0.1%2C1.101%2C0.2c0.301%2C0.1%2C0.601%2C0.3%2C0.899%2C0.5c0.3%2C0.2%2C0.399%2C0.5%2C0.5%2C0.8%0A%09%09c0.101%2C0.3%2C0.2%2C0.6%2C0.2%2C1s-0.102%2C0.7-0.2%2C1c-0.099%2C0.3-0.3%2C0.6-0.5%2C0.8c-0.2%2C0.2-0.399%2C0.5-0.7%2C0.7c-0.3%2C0.2-0.5%2C0.4-0.8%2C0.6%0A%09%09c-0.2%2C0.1-0.399%2C0.3-0.5%2C0.4s-0.3%2C0.3-0.5%2C0.4s-0.2%2C0.3-0.3%2C0.4C97.1%2C17%2C97.1%2C17%2C97.1%2C17.1z%22%2F%3E%0A%3C%2Fg%3E%0A%3Cg%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M15%2C95.4c0%2C0.7-0.1%2C1.4-0.2%2C2c-0.1%2C0.6-0.4%2C1.1-0.7%2C1.5C13.8%2C99.3%2C13.4%2C99.6%2C12.9%2C99.8s-1%2C0.3-1.5%2C0.3%0A%09%09c-0.7%2C0-1.3-0.1-1.8-0.3v-1.5c0.4%2C0.3%2C1%2C0.4%2C1.6%2C0.4c0.6%2C0%2C1.1-0.2%2C1.5-0.7c0.4-0.5%2C0.5-1.1%2C0.5-1.9l0%2C0%0A%09%09C12.8%2C96.7%2C12.3%2C96.9%2C11.5%2C96.9c-0.3%2C0-0.7-0.102-1-0.2c-0.3-0.101-0.5-0.3-0.8-0.5c-0.3-0.2-0.4-0.5-0.5-0.8%0A%09%09c-0.1-0.3-0.2-0.7-0.2-1c0-0.4%2C0.1-0.8%2C0.2-1.2c0.1-0.4%2C0.3-0.7%2C0.6-0.9c0.3-0.2%2C0.6-0.5%2C0.9-0.6c0.3-0.1%2C0.8-0.2%2C1.2-0.2%0A%09%09c0.5%2C0%2C0.9%2C0.1%2C1.2%2C0.3c0.3%2C0.2%2C0.7%2C0.4%2C0.9%2C0.8s0.5%2C0.7%2C0.6%2C1.2S15%2C94.8%2C15%2C95.4z%20M13.1%2C94.4c0-0.2%2C0-0.4-0.1-0.6%0A%09%09c-0.1-0.2-0.1-0.4-0.2-0.5c-0.1-0.1-0.2-0.2-0.4-0.3c-0.2-0.1-0.3-0.1-0.5-0.1c-0.2%2C0-0.3%2C0-0.4%2C0.1s-0.3%2C0.2-0.3%2C0.3%0A%09%09c0%2C0.1-0.2%2C0.3-0.2%2C0.4c0%2C0.1-0.1%2C0.4-0.1%2C0.6c0%2C0.2%2C0%2C0.4%2C0.1%2C0.6c0.1%2C0.2%2C0.1%2C0.3%2C0.2%2C0.4c0.1%2C0.1%2C0.2%2C0.2%2C0.4%2C0.3%0A%09%09c0.2%2C0.1%2C0.3%2C0.1%2C0.5%2C0.1c0.2%2C0%2C0.3%2C0%2C0.4-0.1s0.2-0.2%2C0.3-0.3c0.1-0.1%2C0.2-0.2%2C0.2-0.4C13%2C94.7%2C13.1%2C94.6%2C13.1%2C94.4z%22%2F%3E%0A%3C%2Fg%3E%0A%3Cg%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M176%2C99.7V98.1c0.6%2C0.4%2C1.2%2C0.602%2C2%2C0.602c0.5%2C0%2C0.8-0.102%2C1.1-0.301c0.301-0.199%2C0.4-0.5%2C0.4-0.801%0A%09%09c0-0.398-0.2-0.699-0.5-0.898c-0.3-0.2-0.8-0.301-1.3-0.301h-0.802V95h0.701c1.101%2C0%2C1.601-0.4%2C1.601-1.1c0-0.7-0.4-1-1.302-1%0A%09%09c-0.6%2C0-1.1%2C0.2-1.6%2C0.5v-1.5c0.6-0.3%2C1.301-0.4%2C2.1-0.4c0.9%2C0%2C1.5%2C0.2%2C2%2C0.6s0.701%2C0.9%2C0.701%2C1.5c0%2C1.1-0.601%2C1.8-1.701%2C2.1l0%2C0%0A%09%09c0.602%2C0.1%2C1.102%2C0.3%2C1.4%2C0.6s0.5%2C0.8%2C0.5%2C1.3c0%2C0.801-0.3%2C1.4-0.9%2C1.9c-0.6%2C0.5-1.398%2C0.7-2.398%2C0.7%0A%09%09C177.2%2C100.1%2C176.5%2C100%2C176%2C99.7z%22%2F%3E%0A%3C%2Fg%3E%0A%3Cg%3E%0A%09%3Cpath%20fill%3D%22%23636363%22%20d%3D%22M98.5%2C179.102c0%2C0.398-0.1%2C0.799-0.2%2C1.199C98.2%2C180.7%2C98%2C181%2C97.7%2C181.2s-0.601%2C0.5-0.9%2C0.601%0A%09%09c-0.3%2C0.1-0.7%2C0.199-1.2%2C0.199c-0.5%2C0-0.9-0.1-1.3-0.3c-0.4-0.2-0.7-0.399-0.9-0.8c-0.2-0.4-0.5-0.7-0.6-1.2%0A%09%09c-0.1-0.5-0.2-1-0.2-1.601c0-0.699%2C0.1-1.399%2C0.3-2c0.2-0.601%2C0.4-1.101%2C0.8-1.5c0.4-0.399%2C0.7-0.699%2C1.2-1c0.5-0.3%2C1-0.3%2C1.6-0.3%0A%09%09c0.6%2C0%2C1.2%2C0.101%2C1.5%2C0.199v1.5c-0.4-0.199-0.9-0.399-1.4-0.399c-0.3%2C0-0.6%2C0.101-0.8%2C0.2c-0.2%2C0.101-0.5%2C0.3-0.7%2C0.5%0A%09%09c-0.2%2C0.199-0.3%2C0.5-0.4%2C0.8c-0.1%2C0.301-0.2%2C0.7-0.2%2C1.101l0%2C0c0.4-0.601%2C1-0.8%2C1.8-0.8c0.3%2C0%2C0.7%2C0.1%2C0.9%2C0.199%0A%09%09c0.2%2C0.101%2C0.5%2C0.301%2C0.7%2C0.5c0.199%2C0.2%2C0.398%2C0.5%2C0.5%2C0.801C98.5%2C178.2%2C98.5%2C178.7%2C98.5%2C179.102z%20M96.7%2C179.2%0A%09%09c0-0.899-0.4-1.399-1.1-1.399c-0.2%2C0-0.3%2C0-0.5%2C0.1c-0.2%2C0.101-0.3%2C0.201-0.4%2C0.301c-0.1%2C0.101-0.2%2C0.199-0.2%2C0.4%0A%09%09c0%2C0.199-0.1%2C0.299-0.1%2C0.5c0%2C0.199%2C0%2C0.398%2C0.1%2C0.6s0.1%2C0.3%2C0.2%2C0.5c0.1%2C0.199%2C0.2%2C0.199%2C0.4%2C0.3c0.2%2C0.101%2C0.3%2C0.101%2C0.5%2C0.101%0A%09%09c0.2%2C0%2C0.3%2C0%2C0.5-0.101c0.2-0.101%2C0.301-0.199%2C0.301-0.3c0-0.1%2C0.199-0.301%2C0.199-0.399C96.6%2C179.7%2C96.7%2C179.4%2C96.7%2C179.2z%22%2F%3E%0A%3C%2Fg%3E%0A%3Ccircle%20fill%3D%22%23636363%22%20cx%3D%2295%22%20cy%3D%2295%22%20r%3D%227%22%2F%3E%0A%3C%2Fsvg%3E%0A") 50% 50%/191px no-repeat; +} + +div { + a144: url('%2E/img.png'); +} + +div { + a145: url("/img.png"); +} + +div { + /* TODO fix me */ + /*a146: url('./img.png', 'foo', './img.png', url('./img.png'));*/ + /*a147: image-set(url('./img.png', 'foo', './img.png', url('./img.png')) 1x, url("./img2x.png") 2x);*/ +} + +div { + a148: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg"%3E%3Crect width="100%25" height="100%25" style="stroke: rgb(223,224,225); stroke-width: 2px; fill: none; stroke-dasharray: 6px 3px" /%3E%3C/svg%3E'); + a149: url('DATA:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg"%3E%3Crect width="100%25" height="100%25" style="stroke: rgb(223,224,225); stroke-width: 2px; fill: none; stroke-dasharray: 6px 3px" /%3E%3C/svg%3E'); + a150: url('DATA:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg"%3E%3Crect width="100%25" height="100%25" style="stroke: rgb(223,224,225); stroke-width: 2px; fill: none; stroke-dasharray: 6px 3px" /%3E%3C/svg%3E'); + a151: url('data:image/svg+xml;utf8,'); + a152: url('DATA:image/svg+xml;utf8,'); +} + +div { + a152: url("img.png"); +} + +div { + a153: url("nested/img.png"); +} + +div { + a154: url("nested/other.png"); +} + +div { + a155: url("package/img.png"); +} + +div { + a156: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"); +} + +div { + a157: url('data:image/svg+xml;utf8,'); +} + +div { + a158: src("http://www.example.com/pinkish.gif"); + --foo-bar: "http://www.example.com/pinkish.gif"; + a159: src(var(--foo)); +} + +div { + a160: url("img.png" param(--color var(--primary-color))); + a161: src("img.png" param(--color var(--primary-color))); +} + +div { + a162: url('img\ + i\ +mg.png\ + '); + +} + +div { + a163: url(" img.png "); +} + + +div { + a164: url( img.png bug); +} + +div { + a165: url(img\n.png); +} + +div { + a166: url(' data:image/svg+xml;utf8, '); +} + +div { + a167: url(http://example.com/image.jpg); + a168: url(http://example.com/image.jpg); +} + +div { + a169: url('data:,'); + a170: url('data:,'); +} + +div { + a171: image(ltr 'img.png#xywh=0,0,16,16', red); + a172: cross-fade(20% url(img.png), url(img.png)) +} + +div { + a172: image-set( + linear-gradient(blue, white) 1x, + linear-gradient(blue, green) 2x + ); + a173: image-set( + url("img.png") type("image/png"), + url("img.png") type("image/png") + ); + a174: image-set( + "img.png" 1x, + "img.png" 2x + ); + a175: image-set( + url("img.png") 1x, + url("img.png") 2x, + url("img.png") 3x + ); + a176: image-set( + "img.png" type("image/png"), + "img.png" type("image/png") + ) "img.png"; + a177: image-set( + "img.png" 1x type("image/png"), + "img.png" 2x type("image/png") + ); + a178: image-set( + "img.png" type("image/png") 1x, + "img.png" type("image/png") 2x + ); + a179: -webkit-image-set( + "img.png" 1x + ); + a180: -webkit-image-set( + url("img.png" var(--foo, "test.png")) 1x + ); +} + +div { + a181: src("img.png"); + a181: src( "img.png" ); + a182: src('img.png'); + a183: src('img.png' var(--foo, "test.png")); + a184: src(var(--foo, "test.png")); + a185: src(" img.png "); +} + +div { + a186: image-set("img.png"1x,"img.png"2x,"img.png"3x); + a187: image-set("img.png"1x,url("img.png")2x,"img.png"3x); + a188: image-set("img.png"1x,"img.png"2x,url("img.png")3x); + a189: image-set(url("img.png")1x,"img.png"2x,"img.png"3x); + a190: image-set("img.png"1x); + a191: image-set("img.png"1x/* test*/,/* test*/"img.png"2x); +} + +@supports (background-image: image-set("unknown.png"1x,"unknown.png"2x,"unknown.png"3x)) { + div { + a192: url("img.png"); + a193: image-set("img.png"1x); + } +} + +@supports (background-image: url("unknown.png" param(--test))) { + div { + a194: url("img.png"); + } +} + +@supports (background-image: url("unknown.png")) { + div { + a195: url("img.png"); + } +} + +@supports (display: grid) { + @media (min-width: 100px) { + @layer special { + div { + a196: url("img.png"); + } + } + } +} + +div { + a197: \u\r\l("img.png"); + a198: \image-\set("img.png"1x,"img.png"2x,"img.png"3x); + a199: \-webk\it-image-set("img.png"1x); + a200:-webkit-image-set("img.png"1x); +} + +div { + a201: src("http://www.example.com/pinkish.gif"); + --foo: "http://www.example.com/pinkish.gif"; + a202: src(var(--foo)); + a203: src("./img.png"); + a204: src("img.png"); +} + +div { + a205: url(alias-url.png); + a206: url(alias-url-1.png); + a208: url(external-url.png); + a208: url(external-url-2.png); + a209: url(unresolved.png); + a210: url(ignore.png); + a211: url("schema:test"); +} diff --git a/test/configCases/css/url/test.config.js b/test/configCases/css/url/test.config.js new file mode 100644 index 00000000000..5014f5795fe --- /dev/null +++ b/test/configCases/css/url/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = `bundle${scope.__STATS_I__}.css`; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/url/unknown.png b/test/configCases/css/url/unknown.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/url/unknown.png differ diff --git a/test/configCases/css/url/webpack.config.js b/test/configCases/css/url/webpack.config.js new file mode 100644 index 00000000000..6f0cf2090e0 --- /dev/null +++ b/test/configCases/css/url/webpack.config.js @@ -0,0 +1,47 @@ +const path = require("path"); +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = [ + { + target: "web", + mode: "development", + devtool: false, + experiments: { + css: true + }, + output: { + assetModuleFilename: "[name].[hash][ext][query][fragment]" + }, + resolve: { + alias: { + "alias-url.png": path.resolve(__dirname, "img.png"), + "alias-url-1.png": false + } + }, + externals: { + "external-url.png": "asset ./img.png", + "external-url-2.png": "test", + "schema:test": "asset 'img.png'" + }, + plugins: [new webpack.IgnorePlugin({ resourceRegExp: /ignore\.png/ })] + }, + { + target: "web", + mode: "development", + devtool: false, + experiments: { + css: true + }, + module: { + parser: { + css: { + url: false + } + } + }, + output: { + assetModuleFilename: "[name].[hash][ext][query][fragment]" + } + } +]; diff --git a/test/configCases/css/webpack-ignore/basic.css b/test/configCases/css/webpack-ignore/basic.css new file mode 100644 index 00000000000..626e93720d0 --- /dev/null +++ b/test/configCases/css/webpack-ignore/basic.css @@ -0,0 +1,3 @@ +.class { + color: red; +} diff --git a/test/configCases/css/webpack-ignore/fonts/Roboto-Regular.eot b/test/configCases/css/webpack-ignore/fonts/Roboto-Regular.eot new file mode 100644 index 00000000000..5f4be13f2be Binary files /dev/null and b/test/configCases/css/webpack-ignore/fonts/Roboto-Regular.eot differ diff --git a/test/configCases/css/webpack-ignore/fonts/Roboto-Regular.svg b/test/configCases/css/webpack-ignore/fonts/Roboto-Regular.svg new file mode 100644 index 00000000000..311d46d824f --- /dev/null +++ b/test/configCases/css/webpack-ignore/fonts/Roboto-Regular.svg @@ -0,0 +1,2606 @@ + + + + +Created by FontForge 20170731 at Wed Mar 29 15:03:00 2017 + By Aleksey,,, +Copyright 2011 Google Inc. All Rights Reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/configCases/css/webpack-ignore/fonts/Roboto-Regular.ttf b/test/configCases/css/webpack-ignore/fonts/Roboto-Regular.ttf new file mode 100644 index 00000000000..2880e77f472 Binary files /dev/null and b/test/configCases/css/webpack-ignore/fonts/Roboto-Regular.ttf differ diff --git a/test/configCases/css/webpack-ignore/fonts/Roboto-Regular.woff b/test/configCases/css/webpack-ignore/fonts/Roboto-Regular.woff new file mode 100644 index 00000000000..33c01a14747 Binary files /dev/null and b/test/configCases/css/webpack-ignore/fonts/Roboto-Regular.woff differ diff --git a/test/configCases/css/webpack-ignore/fonts/Roboto-Regular.woff2 b/test/configCases/css/webpack-ignore/fonts/Roboto-Regular.woff2 new file mode 100644 index 00000000000..c5773af3825 Binary files /dev/null and b/test/configCases/css/webpack-ignore/fonts/Roboto-Regular.woff2 differ diff --git a/test/configCases/css/webpack-ignore/img.png b/test/configCases/css/webpack-ignore/img.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/webpack-ignore/img.png differ diff --git a/test/configCases/css/webpack-ignore/index.js b/test/configCases/css/webpack-ignore/index.js new file mode 100644 index 00000000000..f323ebfc4d7 --- /dev/null +++ b/test/configCases/css/webpack-ignore/index.js @@ -0,0 +1,9 @@ +import "./style.css"; + +it("should compile", done => { + const links = document.getElementsByTagName("link"); + const css = links[1].sheet.css; + + expect(css).toMatchSnapshot(); + done(); +}); diff --git a/test/configCases/css/webpack-ignore/style.css b/test/configCases/css/webpack-ignore/style.css new file mode 100644 index 00000000000..54d1fb42586 --- /dev/null +++ b/test/configCases/css/webpack-ignore/style.css @@ -0,0 +1,313 @@ +@import/* webpackIgnore: true */url(./basic.css); +@import /* webpackIgnore: true */ url(./basic.css); +@import /* webpackIgnore: false */ /* webpackIgnore: true */ url(./basic.css); +@import /* webpackIgnore: false */ /* webpackIgnore: true */ /* webpackIgnore: true */ url(./basic.css); +@import /* webpackIgnore: false */ /* webpackIgnore: false */ /* webpackIgnore: true */ url(./basic.css); + + +@import /* webpackIgnore: true */ url(./basic.css); + +/** Resolved **/ +@import /* webpackIgnore: false */ url(./basic.css); +@import /****webpackIgnore: false***/ url(./basic.css); +@import /* * * * webpackIgnore: false * * */ url(./basic.css); +@import /* webpackIgnore: false */ /* webpackIgnore: true */ /* webpackIgnore: false */ url(./basic.css); +@import /* webpackIgnore: 1 */ url(./basic.css); +/** Resolved **/ + +.class { + color: red; + background: /* webpackIgnore: true */ url("./url/img.png"), url("./url/img.png"); +} + +.class { + color: red; + background:/* webpackIgnore: true */url("./url/img.png"), url("./url/img.png"); +} + +.class { + color: red; + background: url("./url/img.png"), /* webpackIgnore: true */ url("./url/img.png"); +} + +.class { + color: red; + background: + /* webpackIgnore: true */ + url("./url/img.png"), + url("./url/img.png"); +} + + +.class { + color: red; + background: + url("./url/img.png"), + /* webpackIgnore: true */ + url("./url/img.png"); +} + +.class { + color: red; + background: /* webpackIgnore: true */ url("./url/img.png"), /* webpackIgnore: false */ url("./url/img.png"); +} + +.class { + color: red; + background: url("./url/img.png"), /* webpackIgnore: false */ url("./url/img.png"), /* webpackIgnore: true */ url("./url/img.png"), /* webpackIgnore: false */ url("./url/img.png"); +} + +.class { + color: red; + background: /* webpackIgnore: false */ url("./url/img.png"), /* webpackIgnore: true */ url("./url/img.png"); +} + +.class { + color: red; + background: /* webpackIgnore: true */ /* webpackIgnore: false */ url("./url/img.png"), url("./url/img.png"); +} + +.class { + color: red; + background: url("./url/img.png"), /* webpackIgnore: true */ /* webpackIgnore: false */ url("./url/img.png"); +} + +.class { + color: red; + background: url("./url/img.png"), /* webpackIgnore: false */ /* webpackIgnore: true */ url("./url/img.png"); +} + +.class { + background: + url("./url/img.png"), + url("./url/img.png"), + /* webpackIgnore: true */ url("./url/img.png"), + url("./url/img.png"), + /* webpackIgnore: true */ url("./url/img.png"), + url("./url/img.png"), + url("./url/img.png"), + url("./url/img.png"), + /* webpackIgnore: true */ + url("./url/img.png"); +} + +@font-face { + font-family: "Roboto"; + src: /* webpackIgnore: true */ url("./fonts/Roboto-Regular.eot"); + src: + /* webpackIgnore: true */ + url("./fonts/Roboto-Regular.eot#iefix") format("embedded-opentype"), + url("./fonts/Roboto-Regular.woff2") format("woff"), + url("./fonts/Roboto-Regular.woff") format("woff"), + url("./fonts/Roboto-Regular.ttf") format("truetype"), + url("./fonts/Roboto-Regular.svg#Roboto-Regular") format("svg"); + font-weight: 400; + font-style: normal; +} + +@font-face { + font-family: "Roboto"; + src: /* webpackIgnore: true */ url("./fonts/Roboto-Regular.eot"); + src: + url("./fonts/Roboto-Regular.eot#iefix") format("embedded-opentype"), + url("./fonts/Roboto-Regular.woff2") format("woff"), + /* webpackIgnore: true */ + url("./fonts/Roboto-Regular.woff") + format("woff"), + url("./fonts/Roboto-Regular.ttf") format("truetype"), + url("./fonts/Roboto-Regular.svg#Roboto-Regular") format("svg"); + font-weight: 400; + font-style: normal; +} + +@font-face { + font-family: "Roboto"; + src: url("./fonts/Roboto-Regular.eot"); + src: + url("./fonts/Roboto-Regular.eot#iefix") format("embedded-opentype"), + /* webpackIgnore: true */ + url("./fonts/Roboto-Regular.woff2") format("woff"), + url("./fonts/Roboto-Regular.woff") format("woff"), + /* webpackIgnore: true */ + url("./fonts/Roboto-Regular.ttf") format("truetype"), + url("./fonts/Roboto-Regular.svg#Roboto-Regular") format("svg"); + font-weight: 400; + font-style: normal; +} + +.class { + background-image: image-set( + /*webpackIgnore: true*/ + + + url(./url/img.png) 2x, + url(./url/img.png) 3x, + url(./url/img.png) 4x + ); +} + +.class { + background-image: + image-set( + /*webpackIgnore: false*/ + url(./url/img.png) 2x, + /*webpackIgnore: true*/ + url(./url/img.png) 3x, + url(./url/img.png) 4x, + /*webpackIgnore: false */ + /*webpackIgnore: true */ + url(./url/img.png) 5x + ),/*webpackIgnore: true*/url('./url/img.png'); +} + +.class { + background-image: + image-set( + /*webpackIgnore: false*/ + url(./url/img.png) 2x, + /*webpackIgnore: true*/ + url(./url/img.png) 3x, + url(./url/img.png) 4x, + /*webpackIgnore: false */ + /*webpackIgnore: true */ + url(./url/img.png) 5x + ), + /*webpackIgnore: false*/ + url('./url/img.png'), + /*webpackIgnore: true*/ + url('./url/img.png'); +} + +.class { + background-image: + image-set( + /*webpackIgnore: false*/ + url(./url/img.png) 2x, + /*webpackIgnore: true*/ + url(./url/img.png) 3x, + url(./url/img.png) 4x, + /*webpackIgnore: false */ + /*webpackIgnore: true */ + url(./url/img.png) 5x + ), + url('./url/img.png'); +} + +.class { + background-image: image-set( + /*webpackIgnore: true*/ + url(./url/img.png) 2x, + url(./url/img.png) 3x, + /*webpackIgnore: true*/ + url(./url/img.png) 5x + ); +} + +.class { + background-image: image-set( + /*webpackIgnore: true*/ + './url/img.png' 2x, + './url/img.png' 3x, + /*webpackIgnore: true*/ + './url/img.png' 5x + ); +} + +.class { + background-image: image-set( + /*webpackIgnore: false*/ + url(./url/img.png) 2x, + /*webpackIgnore: true*/ + url(./url/img.png) 3x, + /*webpackIgnore: false*/ + url(./url/img.png) 4x, + + + /*webpackIgnore: true*/ + + + url(./url/img.png) 5x + ); +} + +.class { + color: red; + background: url("./url/img.png"), /* webpackIgnore: true */url("./url/img.png"); +} + +.class { + color: red; + background: url("./url/img.png"), /* webpackIgnore: true */ url("./url/img.png"); +} + +.class { + color: red; + background: url("./url/img.png")/* webpackIgnore: true */, url("./url/img.png"); +} + +.class { + background-image: + image-set( + url(./url/img.png) 2x /*webpackIgnore: true*/, + url(./url/img.png) /*webpackIgnore: true*/ 3x, + url(./url/img.png) 4x /*webpackIgnore: true*/, + /*webpackIgnore: true*/url(./url/img.png) 5x, + /*webpackIgnore: true*/ url(./url/img.png) 6x, + /*webpackIgnore: true*/ + url(./url/img.png) 7x, + url(./url/img.png) 8x + ), + /*webpackIgnore: false*/ + url('./url/img.png'), + /*webpackIgnore: true*/ + url('./url/img.png'); +} + +@font-face { + font-family: "anticon"; + src: url("//at.alicdn.com/t/font_1434092639_4910953.eot?#iefix") format("embedded-opentype"), + /* this comment is required */ + url("//at.alicdn.com/t/font_1434092639_4910953.woff") format("woff"); +} + +.class { + background-image: image-set( + /*webpackIgnore: true*/ + url("./url/img.png") 2x, + url("./url/img.png") 3x, + /*webpackIgnore: true*/ + url("./url/img.png") 4x + ); +} + +.class { + background-image: /* webpackIgnore: 1 */ url("./url/img.png"); + background-image: /* webpackIgnore: 1 */ url(./url/img.png); + background-image: image-set(/* webpackIgnore: 1 */ url("./url/img.png") 2x) +} + +.class { + background-image /*webpackIgnore: true*/ : url(./url/img.png); + /*webpackIgnore: true*/ background-image: url('./url/img.png'); +} + +.class { + background-image:/*webpackIgnore: true*/ + + + + + + + + + + + url(./url/img.png); +} + +.class { + background-image: /***webpackIgnore: true***/ url(./url/img.png); + background-image: /***webpackIgnore: true***/ url("./url/img.png"); + background-image: image-set(/***webpackIgnore: true***/ url("./url/img.png") 2x) +} diff --git a/test/configCases/css/webpack-ignore/test.config.js b/test/configCases/css/webpack-ignore/test.config.js new file mode 100644 index 00000000000..0590757288f --- /dev/null +++ b/test/configCases/css/webpack-ignore/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "bundle0.css"; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/css/webpack-ignore/url/img.png b/test/configCases/css/webpack-ignore/url/img.png new file mode 100644 index 00000000000..b74b839e2b8 Binary files /dev/null and b/test/configCases/css/webpack-ignore/url/img.png differ diff --git a/test/configCases/css/webpack-ignore/warnings.js b/test/configCases/css/webpack-ignore/warnings.js new file mode 100644 index 00000000000..52aba8cc706 --- /dev/null +++ b/test/configCases/css/webpack-ignore/warnings.js @@ -0,0 +1,12 @@ +module.exports = [ + /Compilation error while processing magic comment\(-s\): \/\*\*\*\*webpackIgnore: false\*\*\*\//, + /Compilation error while processing magic comment\(-s\): \/\* {3}\* {3}\* {3}\* {3}webpackIgnore: {3}false {3}\* {3}\* {3}\*\//, + /`webpackIgnore` expected a boolean, but received: 1\./, + /`webpackIgnore` expected a boolean, but received: 1\./, + /`webpackIgnore` expected a boolean, but received: 1\./, + /`webpackIgnore` expected a boolean, but received: 1\./, + /Compilation error while processing magic comment\(-s\): \/\*\*\*webpackIgnore: {2}true\*\*\*\//, + /Compilation error while processing magic comment\(-s\): \/\*\*\*webpackIgnore: {2}true\*\*\*\//, + /Compilation error while processing magic comment\(-s\): \/\*\*\*webpackIgnore: {2}true\*\*\*\//, + /Compilation error while processing magic comment\(-s\): \/\*\*\*webpackIgnore: {2}true\*\*\*\// +]; diff --git a/test/configCases/css/webpack-ignore/webpack.config.js b/test/configCases/css/webpack-ignore/webpack.config.js new file mode 100644 index 00000000000..cfb8e5c0346 --- /dev/null +++ b/test/configCases/css/webpack-ignore/webpack.config.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + mode: "development", + experiments: { + css: true + } +}; diff --git a/test/configCases/custom-hash-function/debug-hash/files/file1.js b/test/configCases/custom-hash-function/debug-hash/files/file1.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/custom-hash-function/debug-hash/files/file1.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/custom-hash-function/debug-hash/files/file10.js b/test/configCases/custom-hash-function/debug-hash/files/file10.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/custom-hash-function/debug-hash/files/file10.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/custom-hash-function/debug-hash/files/file11.js b/test/configCases/custom-hash-function/debug-hash/files/file11.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/custom-hash-function/debug-hash/files/file11.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/custom-hash-function/debug-hash/files/file12.js b/test/configCases/custom-hash-function/debug-hash/files/file12.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/custom-hash-function/debug-hash/files/file12.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/custom-hash-function/debug-hash/files/file13.js b/test/configCases/custom-hash-function/debug-hash/files/file13.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/custom-hash-function/debug-hash/files/file13.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/custom-hash-function/debug-hash/files/file14.js b/test/configCases/custom-hash-function/debug-hash/files/file14.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/custom-hash-function/debug-hash/files/file14.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/custom-hash-function/debug-hash/files/file15.js b/test/configCases/custom-hash-function/debug-hash/files/file15.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/custom-hash-function/debug-hash/files/file15.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/custom-hash-function/debug-hash/files/file2.js b/test/configCases/custom-hash-function/debug-hash/files/file2.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/custom-hash-function/debug-hash/files/file2.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/custom-hash-function/debug-hash/files/file3.js b/test/configCases/custom-hash-function/debug-hash/files/file3.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/custom-hash-function/debug-hash/files/file3.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/custom-hash-function/debug-hash/files/file4.js b/test/configCases/custom-hash-function/debug-hash/files/file4.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/custom-hash-function/debug-hash/files/file4.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/custom-hash-function/debug-hash/files/file5.js b/test/configCases/custom-hash-function/debug-hash/files/file5.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/custom-hash-function/debug-hash/files/file5.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/custom-hash-function/debug-hash/files/file6.js b/test/configCases/custom-hash-function/debug-hash/files/file6.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/custom-hash-function/debug-hash/files/file6.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/custom-hash-function/debug-hash/files/file7.js b/test/configCases/custom-hash-function/debug-hash/files/file7.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/custom-hash-function/debug-hash/files/file7.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/custom-hash-function/debug-hash/files/file8.js b/test/configCases/custom-hash-function/debug-hash/files/file8.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/custom-hash-function/debug-hash/files/file8.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/custom-hash-function/debug-hash/files/file9.js b/test/configCases/custom-hash-function/debug-hash/files/file9.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/custom-hash-function/debug-hash/files/file9.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/custom-hash-function/debug-hash/index.js b/test/configCases/custom-hash-function/debug-hash/index.js new file mode 100644 index 00000000000..7b74a5a384f --- /dev/null +++ b/test/configCases/custom-hash-function/debug-hash/index.js @@ -0,0 +1,8 @@ +it("debug hash should works", function () { + var ids = []; + for(var i = 1; i <= 15; i++) { + var id = require("./files/file" + i + ".js"); + expect(ids.indexOf(id)).toBe(-1); + ids.push(id); + } +}); diff --git a/test/configCases/custom-hash-function/debug-hash/webpack.config.js b/test/configCases/custom-hash-function/debug-hash/webpack.config.js new file mode 100644 index 00000000000..ee9e650c781 --- /dev/null +++ b/test/configCases/custom-hash-function/debug-hash/webpack.config.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + output: { + hashFunction: "debug" + } + } +]; diff --git a/test/configCases/custom-hash-function/xxhash/webpack.config.js b/test/configCases/custom-hash-function/xxhash/webpack.config.js index b2d734eaba4..66e7927080a 100644 --- a/test/configCases/custom-hash-function/xxhash/webpack.config.js +++ b/test/configCases/custom-hash-function/xxhash/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration[]} */ module.exports = [ { output: { diff --git a/test/configCases/custom-modules/_files/data.toml b/test/configCases/custom-modules/_files/data.toml new file mode 100644 index 00000000000..bf6c9dd3363 --- /dev/null +++ b/test/configCases/custom-modules/_files/data.toml @@ -0,0 +1,7 @@ +title = "TOML Example" + +[owner] +name = "Tom Preston-Werner" +organization = "GitHub" +bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." +dob = 1979-05-27T07:32:00Z diff --git a/test/configCases/custom-modules/json-custom/index.js b/test/configCases/custom-modules/json-custom/index.js new file mode 100644 index 00000000000..adad70f603c --- /dev/null +++ b/test/configCases/custom-modules/json-custom/index.js @@ -0,0 +1,13 @@ +import toml from "../_files/data.toml"; + +it("should transform toml to json", () => { + expect(toml).toMatchObject({ + title: "TOML Example", + owner: { + name: 'Tom Preston-Werner', + organization: 'GitHub', + bio: 'GitHub Cofounder & CEO\nLikes tater tots and beer.', + dob: '1979-05-27T07:32:00.000Z' + } + }); +}); diff --git a/test/configCases/custom-modules/json-custom/webpack.config.js b/test/configCases/custom-modules/json-custom/webpack.config.js new file mode 100644 index 00000000000..e756232dcc1 --- /dev/null +++ b/test/configCases/custom-modules/json-custom/webpack.config.js @@ -0,0 +1,25 @@ +const toml = require("toml"); + +/** @typedef {import("../../../../").ParserOptionsByModuleTypeKnown} ParserOptionsByModuleTypeKnown */ + +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + mode: "development", + module: { + rules: [ + { + test: /\.toml$/, + type: "json", + /** @type {ParserOptionsByModuleTypeKnown['json']} */ + parser: { + parse(input) { + expect(arguments.length).toBe(1); + return toml.parse(input); + } + } + } + ] + } + } +]; diff --git a/test/configCases/custom-source-type/localization/content.loc b/test/configCases/custom-source-type/localization/content.loc new file mode 100644 index 00000000000..c00bd06c6f8 --- /dev/null +++ b/test/configCases/custom-source-type/localization/content.loc @@ -0,0 +1,3 @@ +{ + "value": "Translated text" +} diff --git a/test/configCases/custom-source-type/localization/content2.loc b/test/configCases/custom-source-type/localization/content2.loc new file mode 100644 index 00000000000..6feebdf4b53 --- /dev/null +++ b/test/configCases/custom-source-type/localization/content2.loc @@ -0,0 +1,3 @@ +{ + "value": "Translated text 2" +} diff --git a/test/configCases/custom-source-type/localization/deprecations.js b/test/configCases/custom-source-type/localization/deprecations.js new file mode 100644 index 00000000000..44a05b2a72a --- /dev/null +++ b/test/configCases/custom-source-type/localization/deprecations.js @@ -0,0 +1 @@ +module.exports = [{ code: /DEP_WEBPACK_CHUNK_TEMPLATE_RENDER_MANIFEST/ }]; diff --git a/test/configCases/custom-source-type/localization/index.js b/test/configCases/custom-source-type/localization/index.js new file mode 100644 index 00000000000..36cde08e00e --- /dev/null +++ b/test/configCases/custom-source-type/localization/index.js @@ -0,0 +1,62 @@ +it("should generate the correct output files", () => { + // It should not generate a JS chunk file for the localization-only chunk + expect( + __STATS__.children[INDEX].assets.map(asset => asset.name).sort() + ).toEqual( + [ + NORMAL1 && `286.bundle${INDEX}.js`, + NORMAL2 && `678.bundle${INDEX}.js`, + `bundle${INDEX}.js`, + "localization-248.js", + NORMAL1 && "localization-286.js", + NORMAL2 && "localization-678.js", + CONTENT2 && "localization-702.js" + ].filter(Boolean) + ); +}); + +it("should load a chunk with only the custom source type", () => { + return import("./content.loc").then(({ default: content }) => { + expect(content).toEqual({ + value: "Translated text" + }); + }); +}); + +if (CONTENT2) { + it("should load a chunk with only the custom source type", () => { + return import("./content2.loc").then(({ default: content }) => { + expect(content).toEqual({ + value: "Translated text 2" + }); + }); + }); +} + +if (NORMAL1) { + it("should still load normal chunks", () => { + if (TARGET === "web") { + Promise.resolve().then(() => { + __non_webpack_require__(`./286.bundle${INDEX}.js`); + }); + } + + return import("./normal.js").then(({ default: value }) => { + expect(value).toBe(42); + }); + }); +} + +if (NORMAL2) { + it("should still another load normal chunks", () => { + if (TARGET === "web") { + Promise.resolve().then(() => { + __non_webpack_require__(`./678.bundle${INDEX}.js`); + }); + } + + return import("./normal2.js").then(({ default: value }) => { + expect(value).toBe(43); + }); + }); +} diff --git a/test/configCases/custom-source-type/localization/normal.js b/test/configCases/custom-source-type/localization/normal.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/configCases/custom-source-type/localization/normal.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/configCases/custom-source-type/localization/normal2.js b/test/configCases/custom-source-type/localization/normal2.js new file mode 100644 index 00000000000..8efc7299424 --- /dev/null +++ b/test/configCases/custom-source-type/localization/normal2.js @@ -0,0 +1 @@ +export default 43; diff --git a/test/configCases/custom-source-type/localization/webpack.config.js b/test/configCases/custom-source-type/localization/webpack.config.js new file mode 100644 index 00000000000..c23373fd850 --- /dev/null +++ b/test/configCases/custom-source-type/localization/webpack.config.js @@ -0,0 +1,210 @@ +const { RawSource } = require("webpack-sources"); +const Generator = require("../../../../").Generator; +const RuntimeModule = require("../../../../").RuntimeModule; +const RuntimeGlobals = require("../../../../").RuntimeGlobals; +const Parser = require("../../../../").Parser; +const webpack = require("../../../../"); + +/** @typedef {import("../../../../").Compiler} Compiler */ +/** @typedef {import("../../../../").ParserState} ParserState */ +/** @typedef {import("../../../../lib/Parser").PreparsedAst} PreparsedAst */ +/** @typedef {import("../../../../").Module} Module */ + +class LocalizationParser extends Parser { + /** + * @param {string | Buffer | PreparsedAst} source input source + * @param {ParserState} state state + * @returns {ParserState} state + */ + parse(source, state) { + if (typeof source !== "string") throw new Error("Unexpected input"); + const { module } = state; + /** @type {NonNullable} */ + (module.buildInfo).content = JSON.parse(source); + return state; + } +} + +const TYPES = new Set(["localization"]); + +/** + * @extends {Generator} + */ +class LocalizationGenerator extends Generator { + getTypes() { + return TYPES; + } + + /** @type {Generator["getSize"]} */ + getSize(module, type) { + return 42; + } + + /** @type {Generator["generate"]} */ + generate(module, { type }) { + return null; + } +} + +class LocalizationLoadingRuntimeModule extends RuntimeModule { + constructor() { + super("localization chunk loading", 10); + } + + /** + * @returns {string} runtime code + */ + generate() { + return ` +${RuntimeGlobals.ensureChunkHandlers}.localization = (chunkId, promises) => { + const data = require("./localization-" + chunkId + ".js"); + for(const moduleId of Object.keys(data)) { + ${RuntimeGlobals.moduleCache}[moduleId] = { + i: moduleId, + l: true, + exports: data[moduleId] + }; + } +}`; + } +} + +/** + * @type {{ TARGET: string, CONTENT2: boolean, NORMAL1: boolean, NORMAL2: boolean }[]} + */ +const definitions = ["node", "async-node", "web"].reduce( + (arr, target) => + arr.concat([ + { + TARGET: JSON.stringify(target), + CONTENT2: false, + NORMAL1: true, + NORMAL2: false + }, + { + TARGET: JSON.stringify(target), + CONTENT2: true, + NORMAL1: true, + NORMAL2: false + }, + { + TARGET: JSON.stringify(target), + CONTENT2: false, + NORMAL1: true, + NORMAL2: true + }, + { + TARGET: JSON.stringify(target), + CONTENT2: true, + NORMAL1: true, + NORMAL2: true + }, + { + TARGET: JSON.stringify(target), + CONTENT2: true, + NORMAL1: false, + NORMAL2: false + }, + { + TARGET: JSON.stringify(target), + CONTENT2: false, + NORMAL1: false, + NORMAL2: false + } + ]), + /** @type {{ TARGET: string, CONTENT2: boolean, NORMAL1: boolean, NORMAL2: boolean }[]} */ + ([]) +); + +module.exports = definitions.map((defs, i) => ({ + module: { + rules: [ + { + test: /\.loc$/, + type: "localization" + } + ] + }, + target: JSON.parse(defs.TARGET), + plugins: [ + new webpack.DefinePlugin(defs), + new webpack.DefinePlugin({ INDEX: i }), + /** + * @param {Compiler} compiler the compiler + */ + compiler => { + compiler.hooks.thisCompilation.tap( + "LocalizationPlugin", + (compilation, { normalModuleFactory }) => { + normalModuleFactory.hooks.createParser + .for("localization") + .tap("LocalizationPlugin", () => new LocalizationParser()); + + normalModuleFactory.hooks.createGenerator + .for("localization") + .tap("LocalizationPlugin", () => new LocalizationGenerator()); + + compilation.chunkTemplate.hooks.renderManifest.tap( + "LocalizationPlugin", + (result, { chunk, chunkGraph }) => { + /** @type {Module[]} */ + const localizationModules = []; + for (const module of chunkGraph.getChunkModulesIterable(chunk)) { + if (module.getSourceTypes().has("localization")) + localizationModules.push(module); + } + + result.push({ + render: () => { + /** @type {Record} */ + const data = {}; + for (const module of localizationModules) { + data[ + /** @type {number | string} */ + (chunkGraph.getModuleId(module)) + ] = + /** @type {NonNullable} */ + (module.buildInfo).content; + } + return new RawSource( + `module.exports = ${JSON.stringify(data)}` + ); + }, + filenameTemplate: "localization-[id].js", + pathOptions: { + chunk, + contentHashType: "localization" + }, + identifier: `localizationchunk${chunk.id}`, + hash: chunk.hash + }); + + return result; + } + ); + + compilation.hooks.runtimeRequirementInTree + .for(RuntimeGlobals.ensureChunkHandlers) + .tap("LocalizationPlugin", (chunk, set) => { + const chunkGraph = compilation.chunkGraph; + if ( + !chunkGraph.hasModuleInGraph(chunk, m => + m.type.startsWith("localization") + ) + ) { + return; + } + set.add(RuntimeGlobals.moduleCache); + compilation.addRuntimeModule( + chunk, + new LocalizationLoadingRuntimeModule() + ); + }); + } + ); + } + ], + node: { + __dirname: false + } +})); diff --git a/test/configCases/deep-scope-analysis/remove-export-scope-hoisting/webpack.config.js b/test/configCases/deep-scope-analysis/remove-export-scope-hoisting/webpack.config.js index 3c8519e2a44..cc78a9b6e5c 100644 --- a/test/configCases/deep-scope-analysis/remove-export-scope-hoisting/webpack.config.js +++ b/test/configCases/deep-scope-analysis/remove-export-scope-hoisting/webpack.config.js @@ -1,34 +1,53 @@ -const DependencyReference = require("../../../../").dependencies - .DependencyReference; +/** @typedef {import("../../../../").Compilation} Compilation */ +/** @typedef {import("../../../../").Module} Module */ + +/** @type {import("../../../../").Configuration} */ module.exports = { optimization: { usedExports: true, - concatenateModules: true + concatenateModules: true, + sideEffects: false }, plugins: [ - function() { - this.hooks.compilation.tap("Test", compilation => { - compilation.hooks.dependencyReference.tap( - "Test", - (ref, dep, module) => { - if ( - module.identifier().endsWith("module.js") && - ref.module && - ref.module.identifier().endsWith("reference.js") && - Array.isArray(ref.importedNames) && - ref.importedNames.includes("unused") - ) { - return new DependencyReference( - ref.module, - ref.importedNames.filter(item => item !== "unused"), - ref.weak, - ref.order - ); + function () { + this.hooks.compilation.tap( + "Test", + /** + * @param {Compilation} compilation the compilation + * @returns {void} + */ + compilation => { + compilation.hooks.dependencyReferencedExports.tap( + "Test", + (referencedExports, dep) => { + const module = + /** @type {Module} */ + (compilation.moduleGraph.getParentModule(dep)); + if (!module.identifier().endsWith("module.js")) + return referencedExports; + const refModule = compilation.moduleGraph.getModule(dep); + if ( + refModule && + refModule.identifier().endsWith("reference.js") && + referencedExports.some( + names => + Array.isArray(names) && + names.length === 1 && + names[0] === "unused" + ) + ) { + return referencedExports.filter( + names => + (Array.isArray(names) && names.length !== 1) || + /** @type {string[]} */ + (names)[0] !== "unused" + ); + } + return referencedExports; } - return ref; - } - ); - }); + ); + } + ); } ] }; diff --git a/test/configCases/deep-scope-analysis/remove-export/webpack.config.js b/test/configCases/deep-scope-analysis/remove-export/webpack.config.js index 1b15ba720d7..55d888cc030 100644 --- a/test/configCases/deep-scope-analysis/remove-export/webpack.config.js +++ b/test/configCases/deep-scope-analysis/remove-export/webpack.config.js @@ -1,31 +1,43 @@ -const DependencyReference = require("../../../../").dependencies - .DependencyReference; +/** @typedef {import("../../../../").Compilation} Compilation */ +/** @typedef {import("../../../../").Module} Module */ + +/** @type {import("../../../../").Configuration} */ module.exports = { optimization: { usedExports: true, - concatenateModules: false + concatenateModules: false, + sideEffects: false }, plugins: [ - function() { + function () { this.hooks.compilation.tap("Test", compilation => { - compilation.hooks.dependencyReference.tap( + compilation.hooks.dependencyReferencedExports.tap( "Test", - (ref, dep, module) => { + (referencedExports, dep) => { + const module = + /** @type {Module} */ + (compilation.moduleGraph.getParentModule(dep)); + if (!module.identifier().endsWith("module.js")) + return referencedExports; + const refModule = compilation.moduleGraph.getModule(dep); if ( - module.identifier().endsWith("module.js") && - ref.module && - ref.module.identifier().endsWith("reference.js") && - Array.isArray(ref.importedNames) && - ref.importedNames.includes("unused") + refModule && + refModule.identifier().endsWith("reference.js") && + referencedExports.some( + names => + Array.isArray(names) && + names.length === 1 && + names[0] === "unused" + ) ) { - return new DependencyReference( - ref.module, - ref.importedNames.filter(item => item !== "unused"), - ref.weak, - ref.order + return referencedExports.filter( + names => + (Array.isArray(names) && names.length !== 1) || + /** @type {string[]} */ + (names)[0] !== "unused" ); } - return ref; + return referencedExports; } ); }); diff --git a/test/configCases/defaulter/immutable-config/webpack.config.js b/test/configCases/defaulter/immutable-config/webpack.config.js index ede6057b069..6d30166043c 100644 --- a/test/configCases/defaulter/immutable-config/webpack.config.js +++ b/test/configCases/defaulter/immutable-config/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { resolve: Object.freeze({}) // this fails to compile when the object is not cloned diff --git a/test/configCases/delegated-hash/simple/warnings.js b/test/configCases/delegated-hash/simple/warnings.js new file mode 100644 index 00000000000..70fefa270fb --- /dev/null +++ b/test/configCases/delegated-hash/simple/warnings.js @@ -0,0 +1 @@ +module.exports = [[/hashed/, /deprecated/]]; diff --git a/test/configCases/delegated-hash/simple/webpack.config.js b/test/configCases/delegated-hash/simple/webpack.config.js index ba5394c40db..d9e01efb3d3 100644 --- a/test/configCases/delegated-hash/simple/webpack.config.js +++ b/test/configCases/delegated-hash/simple/webpack.config.js @@ -1,8 +1,11 @@ -var DelegatedPlugin = require("../../../../lib/DelegatedPlugin"); -var HashedModuleIdsPlugin = require("../../../../lib/HashedModuleIdsPlugin"); +const DelegatedPlugin = require("../../../../").DelegatedPlugin; + +/** @type {import("../../../../").Configuration} */ module.exports = { + optimization: { + moduleIds: "hashed" + }, plugins: [ - new HashedModuleIdsPlugin(), new DelegatedPlugin({ source: "./bundle", type: "require", diff --git a/test/configCases/delegated/simple/webpack.config.js b/test/configCases/delegated/simple/webpack.config.js index d729444b38c..655614cc18a 100644 --- a/test/configCases/delegated/simple/webpack.config.js +++ b/test/configCases/delegated/simple/webpack.config.js @@ -1,4 +1,6 @@ -var DelegatedPlugin = require("../../../../lib/DelegatedPlugin"); +const DelegatedPlugin = require("../../../../").DelegatedPlugin; + +/** @type {import("../../../../").Configuration} */ module.exports = { plugins: [ new DelegatedPlugin({ diff --git a/test/configCases/deprecations/chunk-and-module/deprecations.js b/test/configCases/deprecations/chunk-and-module/deprecations.js new file mode 100644 index 00000000000..6f776e23226 --- /dev/null +++ b/test/configCases/deprecations/chunk-and-module/deprecations.js @@ -0,0 +1,33 @@ +module.exports = [ + { code: /DEP_WEBPACK_CHUNK_ADD_MODULE/ }, + { code: /DEP_WEBPACK_CHUNK_CONTAINS_MODULE/ }, + { code: /DEP_WEBPACK_CHUNK_ENTRY_MODULE/ }, + { code: /DEP_WEBPACK_CHUNK_GET_CHUNK_MODULE_MAPS/ }, + { code: /DEP_WEBPACK_CHUNK_GET_MODULES/ }, + { code: /DEP_WEBPACK_CHUNK_GET_NUMBER_OF_MODULES/ }, + { code: /DEP_WEBPACK_CHUNK_HAS_ENTRY_MODULE/ }, + { code: /DEP_WEBPACK_CHUNK_HAS_MODULE_IN_GRAPH/ }, + { code: /DEP_WEBPACK_CHUNK_IS_EMPTY/ }, + { code: /DEP_WEBPACK_CHUNK_MODULES_ITERABLE/ }, + { code: /DEP_WEBPACK_CHUNK_MODULES_SIZE/ }, + { code: /DEP_WEBPACK_CHUNK_REMOVE_MODULE/ }, + { code: /DEP_WEBPACK_CHUNK_SIZE/ }, + { code: /DEP_WEBPACK_MODULE_ADD_CHUNK/ }, + { code: /DEP_WEBPACK_MODULE_CHUNKS_ITERABLE/ }, + { code: /DEP_WEBPACK_MODULE_DEPTH/ }, + { code: /DEP_WEBPACK_MODULE_GET_CHUNKS/ }, + { code: /DEP_WEBPACK_MODULE_GET_NUMBER_OF_CHUNKS/ }, + { code: /DEP_WEBPACK_MODULE_HASH/ }, + { code: /DEP_WEBPACK_MODULE_INDEX2/ }, + { code: /DEP_WEBPACK_MODULE_INDEX/ }, + { code: /DEP_WEBPACK_MODULE_ISSUER/ }, + { code: /DEP_WEBPACK_MODULE_IS_ENTRY_MODULE/ }, + { code: /DEP_WEBPACK_MODULE_IS_IN_CHUNK/ }, + { code: /DEP_WEBPACK_MODULE_OPTIMIZATION_BAILOUT/ }, + { code: /DEP_WEBPACK_MODULE_OPTIONAL/ }, + { code: /DEP_WEBPACK_MODULE_PROFILE/ }, + { code: /DEP_WEBPACK_MODULE_REMOVE_CHUNK/ }, + { code: /DEP_WEBPACK_MODULE_RENDERED_HASH/ }, + { code: /DEP_WEBPACK_MODULE_SOURCE/ }, + { code: /DEP_WEBPACK_MODULE_USED_EXPORTS/ } +]; diff --git a/test/configCases/deprecations/chunk-and-module/index.js b/test/configCases/deprecations/chunk-and-module/index.js new file mode 100644 index 00000000000..493d4ee534d --- /dev/null +++ b/test/configCases/deprecations/chunk-and-module/index.js @@ -0,0 +1,7 @@ +import { testExport as importedTestExport } from "./index"; + +export const testExport = 42; + +it("should compile with deprecations", () => { + expect(importedTestExport).toBe(42); +}); diff --git a/test/configCases/deprecations/chunk-and-module/webpack.config.js b/test/configCases/deprecations/chunk-and-module/webpack.config.js new file mode 100644 index 00000000000..bc905194fdc --- /dev/null +++ b/test/configCases/deprecations/chunk-and-module/webpack.config.js @@ -0,0 +1,80 @@ +const { ChunkGraph, ExternalModule } = require("../../../../"); + +/** @typedef {import("../../../../").Module} Module */ + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [ + compiler => { + compiler.hooks.done.tap("Test", ({ compilation }) => { + const { chunkGraph } = compilation; + for (const chunk of compilation.chunks) { + expect(chunk.entryModule).toBe( + [...chunkGraph.getChunkEntryModulesIterable(chunk)][0] + ); + expect(chunk.hasEntryModule()).toBe(true); + expect(chunk.getNumberOfModules()).toBe(3); + const module = new ExternalModule("external", "var", "external"); + ChunkGraph.setChunkGraphForModule(module, chunkGraph); + chunk.addModule(module); + module.addChunk(chunk); + expect(chunk.getNumberOfModules()).toBe(4); + expect(new Set(chunk.modulesIterable)).toContain(module); + expect(new Set(chunk.getModules())).toContain(chunk.entryModule); + expect(chunk.hasModuleInGraph(m => m === module)).toBe(true); + expect(chunk.containsModule(module)).toBe(true); + chunk.removeModule(module); + module.removeChunk(chunk); + expect(chunk.getNumberOfModules()).toBe(3); + expect(chunk.containsModule(module)).toBe(false); + expect(chunk.isEmpty()).toBe(false); + expect(chunk.modulesSize()).toBeTypeOf("number"); + expect(chunk.size()).toBe(chunk.modulesSize() * 10 + 10000); + expect(chunk.getChunkModuleMaps(m => true)).toEqual({ + id: {}, + hash: {} + }); + + const m = chunk.entryModule; + expect( + m + .source( + compilation.dependencyTemplates, + compilation.runtimeTemplate + ) + .source() + ).toMatch(/should compile with deprecations/); + expect(m.hash).toMatch(/^[0-9a-f]{32}$/); + expect(m.renderedHash).toMatch(/^[0-9a-f]{20}$/); + expect(m.profile).toBe(undefined); + expect(m.index).toBe(0); + m.index = 1000; + expect(m.index).toBe(1000); + expect(m.index2).toBe(0); + m.index2 = 1000; + expect(m.index2).toBe(1000); + expect(m.depth).toBe(0); + m.depth = 1000; + expect(m.depth).toBe(1000); + expect(m.issuer).toBe(null); + m.issuer = module; + expect(m.issuer).toBe(module); + expect( + typeof m.usedExports === "boolean" + ? [] + : [.../** @type {Set} */ (m.usedExports)] + ).toEqual(["testExport"]); + expect(Array.isArray(m.optimizationBailout)).toBe(true); + expect(m.optional).toBe(false); + expect(m.isInChunk(chunk)).toBe(true); + expect(m.isEntryModule()).toBe(true); + expect(m.getChunks()).toEqual([chunk]); + expect(m.getNumberOfChunks()).toBe(1); + expect(Array.from(m.chunksIterable)).toEqual([chunk]); + expect(m.isProvided("testExport")).toBe(true); + expect(m.isProvided("otherExport")).toBe(false); + } + }); + } + ] +}; diff --git a/test/configCases/deprecations/chunk-files/deprecations.js b/test/configCases/deprecations/chunk-files/deprecations.js new file mode 100644 index 00000000000..99016892f87 --- /dev/null +++ b/test/configCases/deprecations/chunk-files/deprecations.js @@ -0,0 +1,6 @@ +module.exports = [ + { code: /DEP_WEBPACK_DEPRECATION_ARRAY_TO_SET/ }, + { code: /DEP_WEBPACK_DEPRECATION_ARRAY_TO_SET_INDEXER/ }, + { code: /DEP_WEBPACK_DEPRECATION_ARRAY_TO_SET_LENGTH/ }, + { code: /DEP_WEBPACK_DEPRECATION_ARRAY_TO_SET_PUSH/ } +]; diff --git a/test/configCases/deprecations/chunk-files/index.js b/test/configCases/deprecations/chunk-files/index.js new file mode 100644 index 00000000000..a2db56a057e --- /dev/null +++ b/test/configCases/deprecations/chunk-files/index.js @@ -0,0 +1 @@ +it("should compile with deprecations", () => {}); diff --git a/test/configCases/deprecations/chunk-files/webpack.config.js b/test/configCases/deprecations/chunk-files/webpack.config.js new file mode 100644 index 00000000000..b393f4cfbc2 --- /dev/null +++ b/test/configCases/deprecations/chunk-files/webpack.config.js @@ -0,0 +1,23 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [ + compiler => { + compiler.hooks.done.tap("Test", ({ compilation }) => { + for (const c of compilation.chunks) { + const chunk = + /** @type {{ files: string[] } & import("../../../../").Chunk} */ ( + c + ); + expect(chunk.files.length).toBe(chunk.files.size); + expect(chunk.files[0]).toBe(Array.from(chunk.files)[0]); + expect(chunk.files.join(",")).toBe(Array.from(chunk.files).join(",")); + expect(() => (chunk.files.length = 0)).toThrow(); + expect(() => chunk.files.pop()).toThrow(); + chunk.files.push("test.js"); + expect(chunk.files).toContain("test.js"); + chunk.files.delete("test.js"); + } + }); + } + ] +}; diff --git a/test/configCases/deprecations/config/deprecations.js b/test/configCases/deprecations/config/deprecations.js new file mode 100644 index 00000000000..51cb32875d7 --- /dev/null +++ b/test/configCases/deprecations/config/deprecations.js @@ -0,0 +1,3 @@ +module.exports = [ + { code: /DEP_WEBPACK_CONFIGURATION_OPTIMIZATION_NO_EMIT_ON_ERRORS/ } +]; diff --git a/test/configCases/deprecations/config/index.js b/test/configCases/deprecations/config/index.js new file mode 100644 index 00000000000..a2db56a057e --- /dev/null +++ b/test/configCases/deprecations/config/index.js @@ -0,0 +1 @@ +it("should compile with deprecations", () => {}); diff --git a/test/configCases/deprecations/config/webpack.config.js b/test/configCases/deprecations/config/webpack.config.js new file mode 100644 index 00000000000..8542bc3b97f --- /dev/null +++ b/test/configCases/deprecations/config/webpack.config.js @@ -0,0 +1,6 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + noEmitOnErrors: true + } +}; diff --git a/test/configCases/deprecations/invalid-dependencies/index.js b/test/configCases/deprecations/invalid-dependencies/index.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/deprecations/invalid-dependencies/index.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/deprecations/invalid-dependencies/loader.js b/test/configCases/deprecations/invalid-dependencies/loader.js new file mode 100644 index 00000000000..71212ed09b8 --- /dev/null +++ b/test/configCases/deprecations/invalid-dependencies/loader.js @@ -0,0 +1,12 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { + this.addDependency("loader.js"); + this.addDependency("../**/dir/*.js"); + this.addDependency("../**/file.js"); + this.addContextDependency("."); + this.addMissingDependency("./missing1.js"); + this.addMissingDependency("missing2.js"); + this.addMissingDependency("missing3.js"); + this.addMissingDependency("missing4.js"); + return source; +}; diff --git a/test/configCases/deprecations/invalid-dependencies/warnings.js b/test/configCases/deprecations/invalid-dependencies/warnings.js new file mode 100644 index 00000000000..6debc775746 --- /dev/null +++ b/test/configCases/deprecations/invalid-dependencies/warnings.js @@ -0,0 +1,12 @@ +module.exports = [ + [ + { moduleName: /\.\/index\.js/ }, + /Invalid dependencies have been reported/, + /"\."/, + /"\.\.\/\*\*\/dir\/\*\.js"/, + { details: /"\.\/missing1\.js"/ }, + { details: /"loader\.js"/ }, + /and more/, + { details: /"missing3\.js"/ } + ] +]; diff --git a/test/configCases/deprecations/invalid-dependencies/webpack.config.js b/test/configCases/deprecations/invalid-dependencies/webpack.config.js new file mode 100644 index 00000000000..5a8344b421c --- /dev/null +++ b/test/configCases/deprecations/invalid-dependencies/webpack.config.js @@ -0,0 +1,50 @@ +const webpack = require("../../../../"); +const path = require("path"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + module: { + rules: [ + { + test: /index\.js$/, + loader: "./loader.js" + } + ] + }, + plugins: [ + compiler => { + compiler.hooks.compilation.tap("Test", compilation => { + compilation.hooks.succeedModule.tap("Test", module => { + const fileDeps = new webpack.util.LazySet(); + const contextDeps = new webpack.util.LazySet(); + const missingDeps = new webpack.util.LazySet(); + const buildDeps = new webpack.util.LazySet(); + module.addCacheDependencies( + fileDeps, + contextDeps, + missingDeps, + buildDeps + ); + expect(Array.from(fileDeps).sort()).toEqual([ + path.join(__dirname, "index.js"), + path.join(__dirname, "loader.js") + ]); + expect(Array.from(contextDeps).sort()).toEqual([ + path.join(__dirname, ".."), + __dirname + ]); + expect(Array.from(missingDeps).sort()).toEqual([ + path.join(__dirname, "missing1.js"), + path.join(__dirname, "missing2.js"), + path.join(__dirname, "missing3.js"), + path.join(__dirname, "missing4.js") + ]); + expect(Array.from(fileDeps).sort()).toEqual([ + path.join(__dirname, "index.js"), + path.join(__dirname, "loader.js") + ]); + }); + }); + } + ] +}; diff --git a/test/configCases/deprecations/non-unique-hash/a.js b/test/configCases/deprecations/non-unique-hash/a.js new file mode 100644 index 00000000000..1a4fb062cd4 --- /dev/null +++ b/test/configCases/deprecations/non-unique-hash/a.js @@ -0,0 +1,3 @@ +import { a } from "./module"; + +console.log(a); diff --git a/test/configCases/deprecations/non-unique-hash/b.js b/test/configCases/deprecations/non-unique-hash/b.js new file mode 100644 index 00000000000..1e82c8fd056 --- /dev/null +++ b/test/configCases/deprecations/non-unique-hash/b.js @@ -0,0 +1,3 @@ +import { b } from "./module"; + +console.log(b); diff --git a/test/configCases/deprecations/non-unique-hash/deprecations.js b/test/configCases/deprecations/non-unique-hash/deprecations.js new file mode 100644 index 00000000000..8a3adf14664 --- /dev/null +++ b/test/configCases/deprecations/non-unique-hash/deprecations.js @@ -0,0 +1 @@ +module.exports = [{ code: /DEP_WEBPACK_MODULE_HASH/ }]; diff --git a/test/configCases/deprecations/non-unique-hash/index.js b/test/configCases/deprecations/non-unique-hash/index.js new file mode 100644 index 00000000000..37da9f04e2d --- /dev/null +++ b/test/configCases/deprecations/non-unique-hash/index.js @@ -0,0 +1 @@ +it("should compile fine", () => {}); diff --git a/test/configCases/deprecations/non-unique-hash/module.js b/test/configCases/deprecations/non-unique-hash/module.js new file mode 100644 index 00000000000..72ab60e17a2 --- /dev/null +++ b/test/configCases/deprecations/non-unique-hash/module.js @@ -0,0 +1,2 @@ +export const a = 1; +export const b = 2; diff --git a/test/configCases/deprecations/non-unique-hash/webpack.config.js b/test/configCases/deprecations/non-unique-hash/webpack.config.js new file mode 100644 index 00000000000..d5db5c2229b --- /dev/null +++ b/test/configCases/deprecations/non-unique-hash/webpack.config.js @@ -0,0 +1,36 @@ +/** @typedef {import("../../../../").Chunk} Chunk */ + +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + bundle0: "./index", + a: "./a", + b: "./b" + }, + output: { + filename: "[name].js" + }, + optimization: { + usedExports: true, + concatenateModules: false + }, + plugins: [ + compiler => { + compiler.hooks.compilation.tap("Test", compilation => { + compilation.hooks.afterModuleHash.tap("Test", () => { + const hashes = []; + expect(() => { + for (const module of compilation.chunkGraph.getChunkModulesIterable( + /** @type {Chunk} */ + (compilation.namedChunks.get("a")) + )) { + hashes.push(module.hash); + } + }).toThrow( + /No unique hash info entry for unspecified runtime .+ \(existing runtimes: a, b\)\.\n.+opt-out via optimization\.usedExports: "global"/ + ); + }); + }); + } + ] +}; diff --git a/test/configCases/devtools/harmony-eval-source-map/webpack.config.js b/test/configCases/devtools/harmony-eval-source-map/webpack.config.js deleted file mode 100644 index 21e4f13b47e..00000000000 --- a/test/configCases/devtools/harmony-eval-source-map/webpack.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - devtool: "eval-source-map" -}; diff --git a/test/configCases/devtools/harmony-eval/webpack.config.js b/test/configCases/devtools/harmony-eval/webpack.config.js deleted file mode 100644 index 8c6a61a3d54..00000000000 --- a/test/configCases/devtools/harmony-eval/webpack.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - devtool: "eval" -}; diff --git a/test/configCases/dll-plugin-entry/0-create-dll/test.config.js b/test/configCases/dll-plugin-entry/0-create-dll/test.config.js index 08ea6c319c8..04581a81040 100644 --- a/test/configCases/dll-plugin-entry/0-create-dll/test.config.js +++ b/test/configCases/dll-plugin-entry/0-create-dll/test.config.js @@ -1 +1 @@ -exports.noTests = true; +module.exports.noTests = true; diff --git a/test/configCases/dll-plugin-entry/0-create-dll/webpack.config.js b/test/configCases/dll-plugin-entry/0-create-dll/webpack.config.js index 6824e7f92bf..6a358cd66a7 100644 --- a/test/configCases/dll-plugin-entry/0-create-dll/webpack.config.js +++ b/test/configCases/dll-plugin-entry/0-create-dll/webpack.config.js @@ -1,6 +1,7 @@ -var path = require("path"); -var webpack = require("../../../../"); +const path = require("path"); +const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { entry: ["."], output: { @@ -13,8 +14,7 @@ module.exports = { path: path.resolve( __dirname, "../../../js/config/dll-plugin-entry/manifest0.json" - ), - entryOnly: true + ) }) ] }; diff --git a/test/configCases/dll-plugin-entry/1-use-dll/index.js b/test/configCases/dll-plugin-entry/1-use-dll/index.js index 203fc2d122f..535df50edf1 100644 --- a/test/configCases/dll-plugin-entry/1-use-dll/index.js +++ b/test/configCases/dll-plugin-entry/1-use-dll/index.js @@ -13,7 +13,11 @@ it("should load an harmony module from dll (star export)", function() { }); it("should give modules the correct ids", function() { - expect(Object.keys(__webpack_modules__).filter(m => !m.startsWith("../.."))).toEqual([ + expect( + Object.keys(__webpack_modules__) + .filter(m => !m.startsWith("../..")) + .sort() + ).toEqual([ "./index.js", "dll-reference ../0-create-dll/dll.js", "dll/index.js" diff --git a/test/configCases/dll-plugin-entry/1-use-dll/webpack.config.js b/test/configCases/dll-plugin-entry/1-use-dll/webpack.config.js index c708464f132..be916ac443e 100644 --- a/test/configCases/dll-plugin-entry/1-use-dll/webpack.config.js +++ b/test/configCases/dll-plugin-entry/1-use-dll/webpack.config.js @@ -1,13 +1,16 @@ -var webpack = require("../../../../"); +const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { + optimization: { + moduleIds: "named" + }, plugins: [ new webpack.DllReferencePlugin({ - manifest: require("../../../js/config/dll-plugin-entry/manifest0.json"), // eslint-disable-line node/no-missing-require + manifest: require("../../../js/config/dll-plugin-entry/manifest0.json"), name: "../0-create-dll/dll.js", scope: "dll", sourceType: "commonjs2" - }), - new webpack.NamedModulesPlugin() + }) ] }; diff --git a/test/configCases/dll-plugin-entry/2-error-non-entry/webpack.config.js b/test/configCases/dll-plugin-entry/2-error-non-entry/webpack.config.js index c708464f132..be916ac443e 100644 --- a/test/configCases/dll-plugin-entry/2-error-non-entry/webpack.config.js +++ b/test/configCases/dll-plugin-entry/2-error-non-entry/webpack.config.js @@ -1,13 +1,16 @@ -var webpack = require("../../../../"); +const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { + optimization: { + moduleIds: "named" + }, plugins: [ new webpack.DllReferencePlugin({ - manifest: require("../../../js/config/dll-plugin-entry/manifest0.json"), // eslint-disable-line node/no-missing-require + manifest: require("../../../js/config/dll-plugin-entry/manifest0.json"), name: "../0-create-dll/dll.js", scope: "dll", sourceType: "commonjs2" - }), - new webpack.NamedModulesPlugin() + }) ] }; diff --git a/test/configCases/dll-plugin-format/0-create-dll/test.config.js b/test/configCases/dll-plugin-format/0-create-dll/test.config.js index 08ea6c319c8..04581a81040 100644 --- a/test/configCases/dll-plugin-format/0-create-dll/test.config.js +++ b/test/configCases/dll-plugin-format/0-create-dll/test.config.js @@ -1 +1 @@ -exports.noTests = true; +module.exports.noTests = true; diff --git a/test/configCases/dll-plugin-format/0-create-dll/webpack.config.js b/test/configCases/dll-plugin-format/0-create-dll/webpack.config.js index a9739e313e2..eb75dc1c172 100644 --- a/test/configCases/dll-plugin-format/0-create-dll/webpack.config.js +++ b/test/configCases/dll-plugin-format/0-create-dll/webpack.config.js @@ -1,6 +1,7 @@ -var path = require("path"); -var webpack = require("../../../../"); +const path = require("path"); +const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { entry: ["."], resolve: { diff --git a/test/configCases/dll-plugin-side-effects/0-create-dll/dependency.js b/test/configCases/dll-plugin-side-effects/0-create-dll/dependency.js new file mode 100644 index 00000000000..1946cd07cb8 --- /dev/null +++ b/test/configCases/dll-plugin-side-effects/0-create-dll/dependency.js @@ -0,0 +1,3 @@ +export default function createB() { + return "b"; +} diff --git a/test/configCases/dll-plugin-side-effects/0-create-dll/dependency2.js b/test/configCases/dll-plugin-side-effects/0-create-dll/dependency2.js new file mode 100644 index 00000000000..0809fdd0180 --- /dev/null +++ b/test/configCases/dll-plugin-side-effects/0-create-dll/dependency2.js @@ -0,0 +1,3 @@ +export default function createC() { + return "c"; +} diff --git a/test/configCases/dll-plugin-side-effects/0-create-dll/index.js b/test/configCases/dll-plugin-side-effects/0-create-dll/index.js new file mode 100644 index 00000000000..3a02fe46bff --- /dev/null +++ b/test/configCases/dll-plugin-side-effects/0-create-dll/index.js @@ -0,0 +1,3 @@ +import { a } from "./module"; + +export default a(); diff --git a/test/configCases/dll-plugin-side-effects/0-create-dll/module.js b/test/configCases/dll-plugin-side-effects/0-create-dll/module.js new file mode 100644 index 00000000000..257c5b97d93 --- /dev/null +++ b/test/configCases/dll-plugin-side-effects/0-create-dll/module.js @@ -0,0 +1,12 @@ +import createB from "./dependency"; +import createC from "./dependency2"; + +export function a() { + return "a"; +} + +export { createB as b }; + +export function c() { + return createC(); +} diff --git a/test/configCases/dll-plugin-side-effects/0-create-dll/test.config.js b/test/configCases/dll-plugin-side-effects/0-create-dll/test.config.js new file mode 100644 index 00000000000..04581a81040 --- /dev/null +++ b/test/configCases/dll-plugin-side-effects/0-create-dll/test.config.js @@ -0,0 +1 @@ +module.exports.noTests = true; diff --git a/test/configCases/dll-plugin-side-effects/0-create-dll/webpack.config.js b/test/configCases/dll-plugin-side-effects/0-create-dll/webpack.config.js new file mode 100644 index 00000000000..2fab4e47191 --- /dev/null +++ b/test/configCases/dll-plugin-side-effects/0-create-dll/webpack.config.js @@ -0,0 +1,33 @@ +const path = require("path"); +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: ["./index"], + output: { + filename: "dll.js", + chunkFilename: "[id].dll.js", + libraryTarget: "commonjs2" + }, + module: { + rules: [ + { + test: /0-create-dll.(module|dependency)/, + sideEffects: false + } + ] + }, + optimization: { + usedExports: true, + sideEffects: true + }, + plugins: [ + new webpack.DllPlugin({ + path: path.resolve( + __dirname, + "../../../js/config/dll-plugin-side-effects/manifest0.json" + ), + entryOnly: false + }) + ] +}; diff --git a/test/configCases/dll-plugin-side-effects/1-use-dll/index.js b/test/configCases/dll-plugin-side-effects/1-use-dll/index.js new file mode 100644 index 00000000000..db354f9f5d6 --- /dev/null +++ b/test/configCases/dll-plugin-side-effects/1-use-dll/index.js @@ -0,0 +1,9 @@ +it("should include all exports and modules in the dll", function() { + const { a, b, c } = require("dll/module"); + expect(typeof a).toBe("function"); + expect(a()).toBe("a"); + expect(typeof b).toBe("function"); + expect(b()).toBe("b"); + expect(typeof c).toBe("function"); + expect(c()).toBe("c"); +}); diff --git a/test/configCases/dll-plugin-side-effects/1-use-dll/webpack.config.js b/test/configCases/dll-plugin-side-effects/1-use-dll/webpack.config.js new file mode 100644 index 00000000000..e4efbfe5ff0 --- /dev/null +++ b/test/configCases/dll-plugin-side-effects/1-use-dll/webpack.config.js @@ -0,0 +1,13 @@ +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [ + new webpack.DllReferencePlugin({ + manifest: require("../../../js/config/dll-plugin-side-effects/manifest0.json"), + name: "../0-create-dll/dll.js", + scope: "dll", + sourceType: "commonjs2" + }) + ] +}; diff --git a/test/configCases/dll-plugin/0-create-dll-with-contenthash/_d.js b/test/configCases/dll-plugin/0-create-dll-with-contenthash/_d.js new file mode 100644 index 00000000000..d108c9a3722 --- /dev/null +++ b/test/configCases/dll-plugin/0-create-dll-with-contenthash/_d.js @@ -0,0 +1 @@ +import "./d"; \ No newline at end of file diff --git a/test/configCases/dll-plugin/0-create-dll-with-contenthash/_e.js b/test/configCases/dll-plugin/0-create-dll-with-contenthash/_e.js new file mode 100644 index 00000000000..586eb3aa06b --- /dev/null +++ b/test/configCases/dll-plugin/0-create-dll-with-contenthash/_e.js @@ -0,0 +1,3 @@ +import "./e1"; +import "./e2"; +import "./e"; \ No newline at end of file diff --git a/test/configCases/commons-chunk-plugin/inverted-order/a.js b/test/configCases/dll-plugin/0-create-dll-with-contenthash/a.js similarity index 100% rename from test/configCases/commons-chunk-plugin/inverted-order/a.js rename to test/configCases/dll-plugin/0-create-dll-with-contenthash/a.js diff --git a/test/configCases/dll-plugin/0-create-dll-with-contenthash/b.js b/test/configCases/dll-plugin/0-create-dll-with-contenthash/b.js new file mode 100644 index 00000000000..58a90d8f841 --- /dev/null +++ b/test/configCases/dll-plugin/0-create-dll-with-contenthash/b.js @@ -0,0 +1,3 @@ +module.exports = function() { + return import("./c"); +} diff --git a/test/configCases/dll-plugin/0-create-dll-with-contenthash/c.js b/test/configCases/dll-plugin/0-create-dll-with-contenthash/c.js new file mode 100644 index 00000000000..b2091de76d6 --- /dev/null +++ b/test/configCases/dll-plugin/0-create-dll-with-contenthash/c.js @@ -0,0 +1 @@ +export default "c"; \ No newline at end of file diff --git a/test/configCases/dll-plugin/0-create-dll-with-contenthash/d.js b/test/configCases/dll-plugin/0-create-dll-with-contenthash/d.js new file mode 100644 index 00000000000..987d6d7e401 --- /dev/null +++ b/test/configCases/dll-plugin/0-create-dll-with-contenthash/d.js @@ -0,0 +1 @@ +export default "d"; diff --git a/test/configCases/dll-plugin/0-create-dll-with-contenthash/e.js b/test/configCases/dll-plugin/0-create-dll-with-contenthash/e.js new file mode 100644 index 00000000000..9fbe80f85cf --- /dev/null +++ b/test/configCases/dll-plugin/0-create-dll-with-contenthash/e.js @@ -0,0 +1,4 @@ +export * from "./e1"; +export * from "./ee2"; + +console.log.bind(console); // side effect to avoid removing module diff --git a/test/configCases/dll-plugin/0-create-dll-with-contenthash/e1.js b/test/configCases/dll-plugin/0-create-dll-with-contenthash/e1.js new file mode 100644 index 00000000000..23709cd95ff --- /dev/null +++ b/test/configCases/dll-plugin/0-create-dll-with-contenthash/e1.js @@ -0,0 +1,3 @@ +export * from "./ee1"; + +console.log.bind(console); // side effect to avoid removing module diff --git a/test/configCases/dll-plugin/0-create-dll-with-contenthash/e2.js b/test/configCases/dll-plugin/0-create-dll-with-contenthash/e2.js new file mode 100644 index 00000000000..25612746b57 --- /dev/null +++ b/test/configCases/dll-plugin/0-create-dll-with-contenthash/e2.js @@ -0,0 +1,3 @@ +export * from "./ee2"; + +console.log.bind(console); // side effect to avoid removing module diff --git a/test/configCases/dll-plugin/0-create-dll-with-contenthash/ee1.js b/test/configCases/dll-plugin/0-create-dll-with-contenthash/ee1.js new file mode 100644 index 00000000000..359c69fe3e7 --- /dev/null +++ b/test/configCases/dll-plugin/0-create-dll-with-contenthash/ee1.js @@ -0,0 +1,2 @@ +export var x1 = 123; +export var y1 = 456; \ No newline at end of file diff --git a/test/configCases/dll-plugin/0-create-dll-with-contenthash/ee2.js b/test/configCases/dll-plugin/0-create-dll-with-contenthash/ee2.js new file mode 100644 index 00000000000..634e1a91947 --- /dev/null +++ b/test/configCases/dll-plugin/0-create-dll-with-contenthash/ee2.js @@ -0,0 +1,2 @@ +export var x2 = 123; +export var y2 = 456; \ No newline at end of file diff --git a/test/configCases/dll-plugin/0-create-dll-with-contenthash/f.jsx b/test/configCases/dll-plugin/0-create-dll-with-contenthash/f.jsx new file mode 100644 index 00000000000..61445975b07 --- /dev/null +++ b/test/configCases/dll-plugin/0-create-dll-with-contenthash/f.jsx @@ -0,0 +1 @@ +module.exports = 'f'; \ No newline at end of file diff --git a/test/configCases/dll-plugin/0-create-dll-with-contenthash/g-loader.js b/test/configCases/dll-plugin/0-create-dll-with-contenthash/g-loader.js new file mode 100644 index 00000000000..c6d8a635121 --- /dev/null +++ b/test/configCases/dll-plugin/0-create-dll-with-contenthash/g-loader.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { + return source; +}; diff --git a/test/configCases/dll-plugin/0-create-dll-with-contenthash/g.abc.js b/test/configCases/dll-plugin/0-create-dll-with-contenthash/g.abc.js new file mode 100644 index 00000000000..483352ffbff --- /dev/null +++ b/test/configCases/dll-plugin/0-create-dll-with-contenthash/g.abc.js @@ -0,0 +1 @@ +module.exports = typeof module.id; diff --git a/test/configCases/dll-plugin/0-create-dll-with-contenthash/h.js b/test/configCases/dll-plugin/0-create-dll-with-contenthash/h.js new file mode 100644 index 00000000000..1fa89a4fb1c --- /dev/null +++ b/test/configCases/dll-plugin/0-create-dll-with-contenthash/h.js @@ -0,0 +1 @@ +export { B } from "./h1.js"; diff --git a/test/configCases/dll-plugin/0-create-dll-with-contenthash/h1.js b/test/configCases/dll-plugin/0-create-dll-with-contenthash/h1.js new file mode 100644 index 00000000000..a392743d956 --- /dev/null +++ b/test/configCases/dll-plugin/0-create-dll-with-contenthash/h1.js @@ -0,0 +1,2 @@ +export { A } from "./ha.js"; +export { B } from "./hb.js"; diff --git a/test/configCases/dll-plugin/0-create-dll-with-contenthash/ha.js b/test/configCases/dll-plugin/0-create-dll-with-contenthash/ha.js new file mode 100644 index 00000000000..6506d8d86b2 --- /dev/null +++ b/test/configCases/dll-plugin/0-create-dll-with-contenthash/ha.js @@ -0,0 +1 @@ +export const A = "A"; \ No newline at end of file diff --git a/test/configCases/dll-plugin/0-create-dll-with-contenthash/hb.js b/test/configCases/dll-plugin/0-create-dll-with-contenthash/hb.js new file mode 100644 index 00000000000..f3c1f2c5d79 --- /dev/null +++ b/test/configCases/dll-plugin/0-create-dll-with-contenthash/hb.js @@ -0,0 +1 @@ +export const B = "B"; \ No newline at end of file diff --git a/test/configCases/dll-plugin/0-create-dll-with-contenthash/test.config.js b/test/configCases/dll-plugin/0-create-dll-with-contenthash/test.config.js new file mode 100644 index 00000000000..04581a81040 --- /dev/null +++ b/test/configCases/dll-plugin/0-create-dll-with-contenthash/test.config.js @@ -0,0 +1 @@ +module.exports.noTests = true; diff --git a/test/configCases/dll-plugin/0-create-dll-with-contenthash/webpack.config.js b/test/configCases/dll-plugin/0-create-dll-with-contenthash/webpack.config.js new file mode 100644 index 00000000000..11e52fffca4 --- /dev/null +++ b/test/configCases/dll-plugin/0-create-dll-with-contenthash/webpack.config.js @@ -0,0 +1,44 @@ +const path = require("path"); +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: ["./a", "./b", "./_d", "./_e", "./f", "./g.abc", "./h"], + resolve: { + extensions: [".js", ".jsx"] + }, + output: { + filename: "dll.js", + chunkFilename: "[id].dll.js", + libraryTarget: "commonjs2" + }, + module: { + rules: [ + { + test: /\.abc\.js$/, + loader: "./g-loader.js", + options: { + test: 1 + } + }, + { + test: /0-create-dll.h/, + sideEffects: false + } + ] + }, + optimization: { + usedExports: true, + sideEffects: true + }, + plugins: [ + new webpack.DllPlugin({ + path: path.resolve( + __dirname, + "../../../js/config/dll-plugin/manifest0.json" + ), + name: "[name]_[contenthash]", + entryOnly: false + }) + ] +}; diff --git a/test/configCases/dll-plugin/0-create-dll/d.js b/test/configCases/dll-plugin/0-create-dll/d.js index 2911b30a88e..987d6d7e401 100644 --- a/test/configCases/dll-plugin/0-create-dll/d.js +++ b/test/configCases/dll-plugin/0-create-dll/d.js @@ -1 +1 @@ -export default "d"; \ No newline at end of file +export default "d"; diff --git a/test/configCases/dll-plugin/0-create-dll/e.js b/test/configCases/dll-plugin/0-create-dll/e.js index ab48149bfd3..9fbe80f85cf 100644 --- a/test/configCases/dll-plugin/0-create-dll/e.js +++ b/test/configCases/dll-plugin/0-create-dll/e.js @@ -1,2 +1,4 @@ export * from "./e1"; export * from "./ee2"; + +console.log.bind(console); // side effect to avoid removing module diff --git a/test/configCases/dll-plugin/0-create-dll/e1.js b/test/configCases/dll-plugin/0-create-dll/e1.js index 27a6a6af130..23709cd95ff 100644 --- a/test/configCases/dll-plugin/0-create-dll/e1.js +++ b/test/configCases/dll-plugin/0-create-dll/e1.js @@ -1 +1,3 @@ export * from "./ee1"; + +console.log.bind(console); // side effect to avoid removing module diff --git a/test/configCases/dll-plugin/0-create-dll/e2.js b/test/configCases/dll-plugin/0-create-dll/e2.js index 558ac28c2d5..25612746b57 100644 --- a/test/configCases/dll-plugin/0-create-dll/e2.js +++ b/test/configCases/dll-plugin/0-create-dll/e2.js @@ -1 +1,3 @@ export * from "./ee2"; + +console.log.bind(console); // side effect to avoid removing module diff --git a/test/configCases/dll-plugin/0-create-dll/g-loader.js b/test/configCases/dll-plugin/0-create-dll/g-loader.js index 6e64f4af6bb..c6d8a635121 100644 --- a/test/configCases/dll-plugin/0-create-dll/g-loader.js +++ b/test/configCases/dll-plugin/0-create-dll/g-loader.js @@ -1,3 +1,4 @@ -module.exports = function(source) { +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { return source; }; diff --git a/test/configCases/dll-plugin/0-create-dll/h.js b/test/configCases/dll-plugin/0-create-dll/h.js new file mode 100644 index 00000000000..1fa89a4fb1c --- /dev/null +++ b/test/configCases/dll-plugin/0-create-dll/h.js @@ -0,0 +1 @@ +export { B } from "./h1.js"; diff --git a/test/configCases/dll-plugin/0-create-dll/h1.js b/test/configCases/dll-plugin/0-create-dll/h1.js new file mode 100644 index 00000000000..a392743d956 --- /dev/null +++ b/test/configCases/dll-plugin/0-create-dll/h1.js @@ -0,0 +1,2 @@ +export { A } from "./ha.js"; +export { B } from "./hb.js"; diff --git a/test/configCases/dll-plugin/0-create-dll/ha.js b/test/configCases/dll-plugin/0-create-dll/ha.js new file mode 100644 index 00000000000..6506d8d86b2 --- /dev/null +++ b/test/configCases/dll-plugin/0-create-dll/ha.js @@ -0,0 +1 @@ +export const A = "A"; \ No newline at end of file diff --git a/test/configCases/dll-plugin/0-create-dll/hb.js b/test/configCases/dll-plugin/0-create-dll/hb.js new file mode 100644 index 00000000000..f3c1f2c5d79 --- /dev/null +++ b/test/configCases/dll-plugin/0-create-dll/hb.js @@ -0,0 +1 @@ +export const B = "B"; \ No newline at end of file diff --git a/test/configCases/dll-plugin/0-create-dll/test.config.js b/test/configCases/dll-plugin/0-create-dll/test.config.js index 08ea6c319c8..04581a81040 100644 --- a/test/configCases/dll-plugin/0-create-dll/test.config.js +++ b/test/configCases/dll-plugin/0-create-dll/test.config.js @@ -1 +1 @@ -exports.noTests = true; +module.exports.noTests = true; diff --git a/test/configCases/dll-plugin/0-create-dll/webpack.config.js b/test/configCases/dll-plugin/0-create-dll/webpack.config.js index af773ff4f75..1983141cd1c 100644 --- a/test/configCases/dll-plugin/0-create-dll/webpack.config.js +++ b/test/configCases/dll-plugin/0-create-dll/webpack.config.js @@ -1,8 +1,9 @@ -var path = require("path"); -var webpack = require("../../../../"); +const path = require("path"); +const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { - entry: ["./a", "./b", "./_d", "./_e", "./f", "./g.abc"], + entry: ["./a", "./b", "./_d", "./_e", "./f", "./g.abc", "./h"], resolve: { extensions: [".js", ".jsx"] }, @@ -19,15 +20,24 @@ module.exports = { options: { test: 1 } + }, + { + test: /0-create-dll.h/, + sideEffects: false } ] }, + optimization: { + usedExports: true, + sideEffects: true + }, plugins: [ new webpack.DllPlugin({ path: path.resolve( __dirname, "../../../js/config/dll-plugin/manifest0.json" - ) + ), + entryOnly: false }) ] }; diff --git a/test/configCases/dll-plugin/0-issue-10475/index.js b/test/configCases/dll-plugin/0-issue-10475/index.js new file mode 100644 index 00000000000..e34a6754188 --- /dev/null +++ b/test/configCases/dll-plugin/0-issue-10475/index.js @@ -0,0 +1,3 @@ +import { constants } from "test-package"; + +var x = constants; diff --git a/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/constants.js b/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/constants.js new file mode 100644 index 00000000000..84fc2484ce4 --- /dev/null +++ b/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/constants.js @@ -0,0 +1,2 @@ +export const constant1 = 'constant1'; +export const constant2 = 'constant2'; diff --git a/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/index.js b/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/index.js new file mode 100644 index 00000000000..89b290e87fa --- /dev/null +++ b/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/index.js @@ -0,0 +1,5 @@ +import * as _constants from './constants'; +export var constants = _constants; +export { default as someFunction } from './someFunction'; + +if(Math.random() < 0) console.log(constants); diff --git a/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/package.json b/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/package.json new file mode 100644 index 00000000000..ce5fa639dd0 --- /dev/null +++ b/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/package.json @@ -0,0 +1,4 @@ +{ + "main": "index.js", + "sideEffects": false +} diff --git a/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/someFunction.js b/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/someFunction.js new file mode 100644 index 00000000000..757d25c6ae7 --- /dev/null +++ b/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/someFunction.js @@ -0,0 +1,3 @@ +export default function someFunction() { + console.log('This is some function'); +} diff --git a/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/working-constants.js b/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/working-constants.js new file mode 100644 index 00000000000..cd433005d3a --- /dev/null +++ b/test/configCases/dll-plugin/0-issue-10475/node_modules/test-package/working-constants.js @@ -0,0 +1,7 @@ +export const constant1 = 'constant1'; +export const constant2 = 'constant2'; + +export default { + constant1, + constant2, +}; diff --git a/test/configCases/dll-plugin/0-issue-10475/test.config.js b/test/configCases/dll-plugin/0-issue-10475/test.config.js new file mode 100644 index 00000000000..04581a81040 --- /dev/null +++ b/test/configCases/dll-plugin/0-issue-10475/test.config.js @@ -0,0 +1 @@ +module.exports.noTests = true; diff --git a/test/configCases/dll-plugin/0-issue-10475/webpack.config.js b/test/configCases/dll-plugin/0-issue-10475/webpack.config.js new file mode 100644 index 00000000000..7ea13a7cef0 --- /dev/null +++ b/test/configCases/dll-plugin/0-issue-10475/webpack.config.js @@ -0,0 +1,20 @@ +const path = require("path"); +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: ["./index.js"], + output: { + filename: "dll.js", + chunkFilename: "[id].dll.js", + libraryTarget: "commonjs2" + }, + plugins: [ + new webpack.DllPlugin({ + path: path.resolve( + __dirname, + "../../../js/config/dll-plugin/issue-10475.json" + ) + }) + ] +}; diff --git a/test/configCases/dll-plugin/1-issue-10475/index.js b/test/configCases/dll-plugin/1-issue-10475/index.js new file mode 100644 index 00000000000..ae5367529b1 --- /dev/null +++ b/test/configCases/dll-plugin/1-issue-10475/index.js @@ -0,0 +1,3 @@ +it("should have all modules", () => { + require("dll/index.js"); +}); diff --git a/test/configCases/dll-plugin/1-issue-10475/webpack.config.js b/test/configCases/dll-plugin/1-issue-10475/webpack.config.js new file mode 100644 index 00000000000..cd2640f87c3 --- /dev/null +++ b/test/configCases/dll-plugin/1-issue-10475/webpack.config.js @@ -0,0 +1,13 @@ +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [ + new webpack.DllReferencePlugin({ + manifest: require("../../../js/config/dll-plugin/issue-10475.json"), + name: "../0-issue-10475/dll.js", + scope: "dll", + sourceType: "commonjs2" + }) + ] +}; diff --git a/test/configCases/dll-plugin/1-use-dll/index.js b/test/configCases/dll-plugin/1-use-dll/index.js index 9d0f47340b7..638fe966db9 100644 --- a/test/configCases/dll-plugin/1-use-dll/index.js +++ b/test/configCases/dll-plugin/1-use-dll/index.js @@ -1,6 +1,7 @@ import d from "dll/d"; import { x1, y2 } from "./e"; import { x2, y1 } from "dll/e"; +import { B } from "dll/h"; it("should load a module from dll", function() { expect(require("dll/a")).toBe("a"); @@ -11,10 +12,12 @@ it("should load a module of non-default type without extension from dll", functi }); it("should load an async module from dll", function(done) { - require("dll/b")().then(function(c) { - expect(c).toEqual(nsObj({ default: "c" })); - done(); - }).catch(done); + require("dll/b")() + .then(function(c) { + expect(c).toEqual(nsObj({ default: "c" })); + done(); + }) + .catch(done); }); it("should load an harmony module from dll (default export)", function() { @@ -33,7 +36,11 @@ it("should load a module with loader applied", function() { }); it("should give modules the correct ids", function() { - expect(Object.keys(__webpack_modules__).filter(m => !m.startsWith("../.."))).toEqual([ + expect( + Object.keys(__webpack_modules__) + .filter(m => !m.startsWith("../..")) + .sort() + ).toEqual([ "./index.js", "dll-reference ../0-create-dll/dll.js", "dll/a.js", @@ -43,6 +50,11 @@ it("should give modules the correct ids", function() { "dll/e1.js", "dll/e2.js", "dll/f.jsx", - "dll/g.abc.js" - ]); + "dll/g.abc.js", + "dll/h.js" + ]); +}); + +it("should not crash on side-effect-free modules", function() { + expect(B).toBe("B"); }); diff --git a/test/configCases/dll-plugin/1-use-dll/webpack.config.js b/test/configCases/dll-plugin/1-use-dll/webpack.config.js index c6349c1e93b..27906ea6f66 100644 --- a/test/configCases/dll-plugin/1-use-dll/webpack.config.js +++ b/test/configCases/dll-plugin/1-use-dll/webpack.config.js @@ -1,14 +1,17 @@ -var webpack = require("../../../../"); +const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { + optimization: { + moduleIds: "named" + }, plugins: [ new webpack.DllReferencePlugin({ - manifest: require("../../../js/config/dll-plugin/manifest0.json"), // eslint-disable-line node/no-missing-require + manifest: require("../../../js/config/dll-plugin/manifest0.json"), name: "../0-create-dll/dll.js", scope: "dll", sourceType: "commonjs2", extensions: [".js", ".jsx"] - }), - new webpack.NamedModulesPlugin() + }) ] }; diff --git a/test/configCases/dll-plugin/2-use-dll-without-scope/index.js b/test/configCases/dll-plugin/2-use-dll-without-scope/index.js index 28f81259339..70482da8fdc 100644 --- a/test/configCases/dll-plugin/2-use-dll-without-scope/index.js +++ b/test/configCases/dll-plugin/2-use-dll-without-scope/index.js @@ -1,39 +1,47 @@ import d from "../0-create-dll/d"; import { x1, y2 } from "./e"; import { x2, y1 } from "../0-create-dll/e"; +import { B } from "../0-create-dll/h"; +import { A } from "../0-create-dll/h1"; -it("should load a module from dll", function() { +it("should load a module from dll", function () { expect(require("../0-create-dll/a")).toBe("a"); }); -it("should load a module of non-default type without extension from dll", function() { +it("should load a module of non-default type without extension from dll", function () { expect(require("../0-create-dll/f")).toBe("f"); }); -it("should load an async module from dll", function(done) { - require("../0-create-dll/b")().then(function(c) { - expect(c).toEqual(nsObj({ default: "c" })); - done(); - }).catch(done); +it("should load an async module from dll", function (done) { + require("../0-create-dll/b")() + .then(function (c) { + expect(c).toEqual(nsObj({ default: "c" })); + done(); + }) + .catch(done); }); -it("should load an harmony module from dll (default export)", function() { +it("should load an harmony module from dll (default export)", function () { expect(d).toBe("d"); }); -it("should load an harmony module from dll (star export)", function() { +it("should load an harmony module from dll (star export)", function () { expect(x1).toBe(123); expect(x2).toBe(123); expect(y1).toBe(456); expect(y2).toBe(456); }); -it("should load a module with loader applied", function() { +it("should load a module with loader applied", function () { expect(require("../0-create-dll/g.abc.js")).toBe("number"); }); -it("should give modules the correct ids", function() { - expect(Object.keys(__webpack_modules__).filter(m => !m.startsWith("../.."))).toEqual([ +it("should give modules the correct ids", function () { + expect( + Object.keys(__webpack_modules__) + .filter(m => !m.startsWith("../..")) + .sort() + ).toEqual([ "../0-create-dll/a.js", "../0-create-dll/b.js", "../0-create-dll/d.js", @@ -42,7 +50,17 @@ it("should give modules the correct ids", function() { "../0-create-dll/e2.js", "../0-create-dll/f.jsx", "../0-create-dll/g.abc.js", + "../0-create-dll/h.js", + "../0-create-dll/h1.js", "./index.js", "dll-reference ../0-create-dll/dll.js" ]); }); + +it("should not crash on side-effect-free modules", function () { + expect(B).toBe("B"); +}); + +it("should be able to reference side-effect-free reexport-only module", function () { + expect(A).toBe("A"); +}); diff --git a/test/configCases/dll-plugin/2-use-dll-without-scope/webpack.config.js b/test/configCases/dll-plugin/2-use-dll-without-scope/webpack.config.js index 4e5545d2de4..ce7262fa49a 100644 --- a/test/configCases/dll-plugin/2-use-dll-without-scope/webpack.config.js +++ b/test/configCases/dll-plugin/2-use-dll-without-scope/webpack.config.js @@ -1,6 +1,7 @@ -var path = require("path"); -var webpack = require("../../../../"); +const path = require("path"); +const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { module: { rules: [ @@ -17,16 +18,18 @@ module.exports = { } ] }, + optimization: { + moduleIds: "named" + }, resolve: { extensions: [".js", ".jsx"] }, plugins: [ new webpack.DllReferencePlugin({ - manifest: require("../../../js/config/dll-plugin/manifest0.json"), // eslint-disable-line node/no-missing-require + manifest: require("../../../js/config/dll-plugin/manifest0.json"), name: "../0-create-dll/dll.js", context: path.resolve(__dirname, "../0-create-dll"), sourceType: "commonjs2" - }), - new webpack.NamedModulesPlugin() + }) ] }; diff --git a/test/configCases/dll-plugin/3-use-dll-with-hashid/warnings.js b/test/configCases/dll-plugin/3-use-dll-with-hashid/warnings.js new file mode 100644 index 00000000000..70fefa270fb --- /dev/null +++ b/test/configCases/dll-plugin/3-use-dll-with-hashid/warnings.js @@ -0,0 +1 @@ +module.exports = [[/hashed/, /deprecated/]]; diff --git a/test/configCases/dll-plugin/3-use-dll-with-hashid/webpack.config.js b/test/configCases/dll-plugin/3-use-dll-with-hashid/webpack.config.js index 9b07dd08d75..7039a3c5a61 100644 --- a/test/configCases/dll-plugin/3-use-dll-with-hashid/webpack.config.js +++ b/test/configCases/dll-plugin/3-use-dll-with-hashid/webpack.config.js @@ -1,6 +1,7 @@ -var path = require("path"); -var webpack = require("../../../../"); +const path = require("path"); +const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { module: { rules: [ @@ -17,13 +18,15 @@ module.exports = { } ] }, + optimization: { + moduleIds: "hashed" + }, plugins: [ new webpack.DllReferencePlugin({ - manifest: require("../../../js/config/dll-plugin/manifest0.json"), // eslint-disable-line node/no-missing-require + manifest: require("../../../js/config/dll-plugin/manifest0.json"), name: "../0-create-dll/dll.js", context: path.resolve(__dirname, "../0-create-dll"), sourceType: "commonjs2" - }), - new webpack.HashedModuleIdsPlugin() + }) ] }; diff --git a/test/configCases/dll-plugin/4-use-dll-with-contenthash/e.js b/test/configCases/dll-plugin/4-use-dll-with-contenthash/e.js new file mode 100644 index 00000000000..f490fc4645b --- /dev/null +++ b/test/configCases/dll-plugin/4-use-dll-with-contenthash/e.js @@ -0,0 +1,2 @@ +export * from "dll/e1"; +export * from "dll/e2"; diff --git a/test/configCases/dll-plugin/4-use-dll-with-contenthash/index.js b/test/configCases/dll-plugin/4-use-dll-with-contenthash/index.js new file mode 100644 index 00000000000..d771fcdc8c0 --- /dev/null +++ b/test/configCases/dll-plugin/4-use-dll-with-contenthash/index.js @@ -0,0 +1,60 @@ +import d from "dll/d"; +import { x1, y2 } from "./e"; +import { x2, y1 } from "dll/e"; +import { B } from "dll/h"; + +it("should load a module from dll", function() { + expect(require("dll/a")).toBe("a"); +}); + +it("should load a module of non-default type without extension from dll", function() { + expect(require("dll/f")).toBe("f"); +}); + +it("should load an async module from dll", function(done) { + require("dll/b")() + .then(function(c) { + expect(c).toEqual(nsObj({ default: "c" })); + done(); + }) + .catch(done); +}); + +it("should load an harmony module from dll (default export)", function() { + expect(d).toBe("d"); +}); + +it("should load an harmony module from dll (star export)", function() { + expect(x1).toBe(123); + expect(x2).toBe(123); + expect(y1).toBe(456); + expect(y2).toBe(456); +}); + +it("should load a module with loader applied", function() { + expect(require("dll/g.abc.js")).toBe("number"); +}); + +it("should give modules the correct ids", function() { + expect( + Object.keys(__webpack_modules__) + .filter(m => !m.startsWith("../..")) + .sort() + ).toEqual([ + "./index.js", + "dll-reference ../0-create-dll-with-contenthash/dll.js", + "dll/a.js", + "dll/b.js", + "dll/d.js", + "dll/e.js", + "dll/e1.js", + "dll/e2.js", + "dll/f.jsx", + "dll/g.abc.js", + "dll/h.js" + ]); +}); + +it("should not crash on side-effect-free modules", function() { + expect(B).toBe("B"); +}); diff --git a/test/configCases/dll-plugin/4-use-dll-with-contenthash/webpack.config.js b/test/configCases/dll-plugin/4-use-dll-with-contenthash/webpack.config.js new file mode 100644 index 00000000000..5b88d83b098 --- /dev/null +++ b/test/configCases/dll-plugin/4-use-dll-with-contenthash/webpack.config.js @@ -0,0 +1,17 @@ +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + moduleIds: "named" + }, + plugins: [ + new webpack.DllReferencePlugin({ + manifest: require("../../../js/config/dll-plugin/manifest0.json"), + name: "../0-create-dll-with-contenthash/dll.js", + scope: "dll", + sourceType: "commonjs2", + extensions: [".js", ".jsx"] + }) + ] +}; diff --git a/test/configCases/commons-chunk-plugin/move-entry/a.js b/test/configCases/dll-plugin/5-issue-18200/a.js similarity index 100% rename from test/configCases/commons-chunk-plugin/move-entry/a.js rename to test/configCases/dll-plugin/5-issue-18200/a.js diff --git a/test/configCases/dll-plugin/5-issue-18200/b.js b/test/configCases/dll-plugin/5-issue-18200/b.js new file mode 100644 index 00000000000..dfbbeb621fa --- /dev/null +++ b/test/configCases/dll-plugin/5-issue-18200/b.js @@ -0,0 +1 @@ +module.exports = "b"; diff --git a/test/configCases/dll-plugin/5-issue-18200/errors.js b/test/configCases/dll-plugin/5-issue-18200/errors.js new file mode 100644 index 00000000000..48720d5cbae --- /dev/null +++ b/test/configCases/dll-plugin/5-issue-18200/errors.js @@ -0,0 +1 @@ +module.exports = [[/each chunk must have a unique path/]]; diff --git a/test/configCases/dll-plugin/5-issue-18200/webpack.config.js b/test/configCases/dll-plugin/5-issue-18200/webpack.config.js new file mode 100644 index 00000000000..a34ec169331 --- /dev/null +++ b/test/configCases/dll-plugin/5-issue-18200/webpack.config.js @@ -0,0 +1,22 @@ +const path = require("path"); +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + a: "./a", + b: "./b" + }, + output: { + filename: "MyDll.[name].js", + library: "[name]_[fullhash]" + }, + plugins: [ + new webpack.DllPlugin({ + path: path.resolve( + __dirname, + "../../../js/config/dll-plugin/manifest_without_string_template.json" + ) + }) + ] +}; diff --git a/test/configCases/ecmaVersion/2015/index.js b/test/configCases/ecmaVersion/2015/index.js new file mode 100644 index 00000000000..bbd9de4153f --- /dev/null +++ b/test/configCases/ecmaVersion/2015/index.js @@ -0,0 +1 @@ +it("should compile and run the test", function() {}); diff --git a/test/configCases/ecmaVersion/2015/webpack.config.js b/test/configCases/ecmaVersion/2015/webpack.config.js new file mode 100644 index 00000000000..989d5457ba3 --- /dev/null +++ b/test/configCases/ecmaVersion/2015/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: ["node", "es2015"] +}; diff --git a/test/configCases/ecmaVersion/2020/index.js b/test/configCases/ecmaVersion/2020/index.js new file mode 100644 index 00000000000..bbd9de4153f --- /dev/null +++ b/test/configCases/ecmaVersion/2020/index.js @@ -0,0 +1 @@ +it("should compile and run the test", function() {}); diff --git a/test/configCases/ecmaVersion/2020/webpack.config.js b/test/configCases/ecmaVersion/2020/webpack.config.js new file mode 100644 index 00000000000..a4c801f0a7b --- /dev/null +++ b/test/configCases/ecmaVersion/2020/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: ["node", "es2020"] +}; diff --git a/test/configCases/ecmaVersion/5/index.js b/test/configCases/ecmaVersion/5/index.js new file mode 100644 index 00000000000..bbd9de4153f --- /dev/null +++ b/test/configCases/ecmaVersion/5/index.js @@ -0,0 +1 @@ +it("should compile and run the test", function() {}); diff --git a/test/configCases/ecmaVersion/5/webpack.config.js b/test/configCases/ecmaVersion/5/webpack.config.js new file mode 100644 index 00000000000..12f3d9f6535 --- /dev/null +++ b/test/configCases/ecmaVersion/5/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: ["node", "es5"] +}; diff --git a/test/configCases/ecmaVersion/browserslist-config-env/.browserslistrc b/test/configCases/ecmaVersion/browserslist-config-env/.browserslistrc new file mode 100644 index 00000000000..68719cd9208 --- /dev/null +++ b/test/configCases/ecmaVersion/browserslist-config-env/.browserslistrc @@ -0,0 +1,4 @@ +maintained node versions + +[modern] +ie 9 diff --git a/test/configCases/ecmaVersion/browserslist-config-env/index.js b/test/configCases/ecmaVersion/browserslist-config-env/index.js new file mode 100644 index 00000000000..bbd9de4153f --- /dev/null +++ b/test/configCases/ecmaVersion/browserslist-config-env/index.js @@ -0,0 +1 @@ +it("should compile and run the test", function() {}); diff --git a/test/configCases/ecmaVersion/browserslist-config-env/webpack.config.js b/test/configCases/ecmaVersion/browserslist-config-env/webpack.config.js new file mode 100644 index 00000000000..47b717ab3c7 --- /dev/null +++ b/test/configCases/ecmaVersion/browserslist-config-env/webpack.config.js @@ -0,0 +1,41 @@ +const path = require("path"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: `browserslist:${path.join(__dirname, ".browserslistrc")}:modern`, + plugins: [ + compiler => { + compiler.hooks.compilation.tap("Test", compilation => { + expect(compilation.outputOptions.environment).toMatchInlineSnapshot(` + Object { + "arrowFunction": false, + "asyncFunction": false, + "bigIntLiteral": false, + "const": false, + "destructuring": false, + "document": true, + "dynamicImport": false, + "dynamicImportInWorker": false, + "forOf": false, + "globalThis": false, + "module": false, + "nodePrefixForCoreModules": false, + "optionalChaining": false, + "templateLiteral": false, + } + `); + expect(compilation.options.externalsPresets).toMatchInlineSnapshot(` + Object { + "electron": false, + "electronMain": false, + "electronPreload": false, + "electronRenderer": false, + "node": false, + "nwjs": false, + "web": true, + } + `); + }); + } + ] +}; diff --git a/test/configCases/ecmaVersion/browserslist-config/.browserslistrc b/test/configCases/ecmaVersion/browserslist-config/.browserslistrc new file mode 100644 index 00000000000..0b647179adc --- /dev/null +++ b/test/configCases/ecmaVersion/browserslist-config/.browserslistrc @@ -0,0 +1 @@ +ie 9 diff --git a/test/configCases/ecmaVersion/browserslist-config/index.js b/test/configCases/ecmaVersion/browserslist-config/index.js new file mode 100644 index 00000000000..bbd9de4153f --- /dev/null +++ b/test/configCases/ecmaVersion/browserslist-config/index.js @@ -0,0 +1 @@ +it("should compile and run the test", function() {}); diff --git a/test/configCases/ecmaVersion/browserslist-config/webpack.config.js b/test/configCases/ecmaVersion/browserslist-config/webpack.config.js new file mode 100644 index 00000000000..6772fe11465 --- /dev/null +++ b/test/configCases/ecmaVersion/browserslist-config/webpack.config.js @@ -0,0 +1,41 @@ +const path = require("path"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: `browserslist:${path.join(__dirname, ".browserslistrc")}`, + plugins: [ + compiler => { + compiler.hooks.compilation.tap("Test", compilation => { + expect(compilation.outputOptions.environment).toMatchInlineSnapshot(` + Object { + "arrowFunction": false, + "asyncFunction": false, + "bigIntLiteral": false, + "const": false, + "destructuring": false, + "document": true, + "dynamicImport": false, + "dynamicImportInWorker": false, + "forOf": false, + "globalThis": false, + "module": false, + "nodePrefixForCoreModules": false, + "optionalChaining": false, + "templateLiteral": false, + } + `); + expect(compilation.options.externalsPresets).toMatchInlineSnapshot(` + Object { + "electron": false, + "electronMain": false, + "electronPreload": false, + "electronRenderer": false, + "node": false, + "nwjs": false, + "web": true, + } + `); + }); + } + ] +}; diff --git a/test/configCases/ecmaVersion/browserslist-missing/errors.js b/test/configCases/ecmaVersion/browserslist-missing/errors.js new file mode 100644 index 00000000000..a02f9820e5c --- /dev/null +++ b/test/configCases/ecmaVersion/browserslist-missing/errors.js @@ -0,0 +1 @@ +module.exports = [[/No browserslist config found/]]; diff --git a/test/configCases/ecmaVersion/browserslist-missing/index.js b/test/configCases/ecmaVersion/browserslist-missing/index.js new file mode 100644 index 00000000000..bbd9de4153f --- /dev/null +++ b/test/configCases/ecmaVersion/browserslist-missing/index.js @@ -0,0 +1 @@ +it("should compile and run the test", function() {}); diff --git a/test/configCases/ecmaVersion/browserslist-missing/package.json b/test/configCases/ecmaVersion/browserslist-missing/package.json new file mode 100644 index 00000000000..0db3279e44b --- /dev/null +++ b/test/configCases/ecmaVersion/browserslist-missing/package.json @@ -0,0 +1,3 @@ +{ + +} diff --git a/test/configCases/ecmaVersion/browserslist-missing/test.filter.js b/test/configCases/ecmaVersion/browserslist-missing/test.filter.js new file mode 100644 index 00000000000..d5852188b3e --- /dev/null +++ b/test/configCases/ecmaVersion/browserslist-missing/test.filter.js @@ -0,0 +1 @@ +module.exports = config => !config.cache; diff --git a/test/configCases/ecmaVersion/browserslist-missing/webpack.config.js b/test/configCases/ecmaVersion/browserslist-missing/webpack.config.js new file mode 100644 index 00000000000..57dbb3363da --- /dev/null +++ b/test/configCases/ecmaVersion/browserslist-missing/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: ["browserslist"] +}; diff --git a/test/configCases/ecmaVersion/browserslist-query/index.js b/test/configCases/ecmaVersion/browserslist-query/index.js new file mode 100644 index 00000000000..bbd9de4153f --- /dev/null +++ b/test/configCases/ecmaVersion/browserslist-query/index.js @@ -0,0 +1 @@ +it("should compile and run the test", function() {}); diff --git a/test/configCases/ecmaVersion/browserslist-query/webpack.config.js b/test/configCases/ecmaVersion/browserslist-query/webpack.config.js new file mode 100644 index 00000000000..5a2b52a97aa --- /dev/null +++ b/test/configCases/ecmaVersion/browserslist-query/webpack.config.js @@ -0,0 +1,39 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "browserslist: ie 9", + plugins: [ + compiler => { + compiler.hooks.compilation.tap("Test", compilation => { + expect(compilation.outputOptions.environment).toMatchInlineSnapshot(` + Object { + "arrowFunction": false, + "asyncFunction": false, + "bigIntLiteral": false, + "const": false, + "destructuring": false, + "document": true, + "dynamicImport": false, + "dynamicImportInWorker": false, + "forOf": false, + "globalThis": false, + "module": false, + "nodePrefixForCoreModules": false, + "optionalChaining": false, + "templateLiteral": false, + } + `); + expect(compilation.options.externalsPresets).toMatchInlineSnapshot(` + Object { + "electron": false, + "electronMain": false, + "electronPreload": false, + "electronRenderer": false, + "node": false, + "nwjs": false, + "web": true, + } + `); + }); + } + ] +}; diff --git a/test/configCases/ecmaVersion/browserslist/index.js b/test/configCases/ecmaVersion/browserslist/index.js new file mode 100644 index 00000000000..bbd9de4153f --- /dev/null +++ b/test/configCases/ecmaVersion/browserslist/index.js @@ -0,0 +1 @@ +it("should compile and run the test", function() {}); diff --git a/test/configCases/ecmaVersion/browserslist/package.json b/test/configCases/ecmaVersion/browserslist/package.json new file mode 100644 index 00000000000..58771cfd607 --- /dev/null +++ b/test/configCases/ecmaVersion/browserslist/package.json @@ -0,0 +1,5 @@ +{ + "browserslist": [ + "maintained node versions" + ] +} diff --git a/test/configCases/ecmaVersion/browserslist/webpack.config.js b/test/configCases/ecmaVersion/browserslist/webpack.config.js new file mode 100644 index 00000000000..cbaaab50eda --- /dev/null +++ b/test/configCases/ecmaVersion/browserslist/webpack.config.js @@ -0,0 +1,39 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: ["browserslist"], + plugins: [ + compiler => { + compiler.hooks.compilation.tap("Test", compilation => { + expect(compilation.outputOptions.environment).toMatchInlineSnapshot(` + Object { + "arrowFunction": true, + "asyncFunction": true, + "bigIntLiteral": true, + "const": true, + "destructuring": true, + "document": false, + "dynamicImport": true, + "dynamicImportInWorker": false, + "forOf": true, + "globalThis": true, + "module": true, + "nodePrefixForCoreModules": true, + "optionalChaining": true, + "templateLiteral": true, + } + `); + expect(compilation.options.externalsPresets).toMatchInlineSnapshot(` + Object { + "electron": false, + "electronMain": false, + "electronPreload": false, + "electronRenderer": false, + "node": true, + "nwjs": false, + "web": false, + } + `); + }); + } + ] +}; diff --git a/test/configCases/ecmaVersion/custom/index.js b/test/configCases/ecmaVersion/custom/index.js new file mode 100644 index 00000000000..bbd9de4153f --- /dev/null +++ b/test/configCases/ecmaVersion/custom/index.js @@ -0,0 +1 @@ +it("should compile and run the test", function() {}); diff --git a/test/configCases/ecmaVersion/custom/webpack.config.js b/test/configCases/ecmaVersion/custom/webpack.config.js new file mode 100644 index 00000000000..53945cfba1e --- /dev/null +++ b/test/configCases/ecmaVersion/custom/webpack.config.js @@ -0,0 +1,14 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + environment: { + arrowFunction: true, + bigIntLiteral: false, + const: false, + destructuring: false, + forOf: false, + dynamicImport: true, + module: false + } + } +}; diff --git a/test/configCases/ecmaVersion/loader-context/index.js b/test/configCases/ecmaVersion/loader-context/index.js new file mode 100644 index 00000000000..71b94e507ee --- /dev/null +++ b/test/configCases/ecmaVersion/loader-context/index.js @@ -0,0 +1,9 @@ +import mod from "./loader.js!./module"; + +it("should compile and export target and environment", function() { + expect(mod.target).toBe("node"); + expect(mod.environment.globalThis).toBe(false); + expect(mod.environment.optionalChaining).toBe(true); + expect(mod.environment.templateLiteral).toBe(true); + expect(mod.environment.dynamicImportInWorker).toBe(true); +}); diff --git a/test/configCases/ecmaVersion/loader-context/loader.js b/test/configCases/ecmaVersion/loader-context/loader.js new file mode 100644 index 00000000000..1a1f276bb41 --- /dev/null +++ b/test/configCases/ecmaVersion/loader-context/loader.js @@ -0,0 +1,7 @@ +/** @type {import("../../../../types").LoaderDefinition<{}>} */ +module.exports = function loader(content) { + const target = this.target; + const environment = this.environment; + + return `export default ${JSON.stringify({ target, environment})}`; +} diff --git a/test/configCases/ecmaVersion/loader-context/module.js b/test/configCases/ecmaVersion/loader-context/module.js new file mode 100644 index 00000000000..58c57157d36 --- /dev/null +++ b/test/configCases/ecmaVersion/loader-context/module.js @@ -0,0 +1 @@ +export default "test"; diff --git a/test/configCases/ecmaVersion/loader-context/webpack.config.js b/test/configCases/ecmaVersion/loader-context/webpack.config.js new file mode 100644 index 00000000000..72cbad754c1 --- /dev/null +++ b/test/configCases/ecmaVersion/loader-context/webpack.config.js @@ -0,0 +1,10 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: ["node", "es2020"], + output: { + environment: { + // Our target supports `globalThis`, but for test purposes we set it to `false` + globalThis: false + } + } +}; diff --git a/test/configCases/emit-asset/different-source/errors.js b/test/configCases/emit-asset/different-source/errors.js new file mode 100644 index 00000000000..4ca3183d5ae --- /dev/null +++ b/test/configCases/emit-asset/different-source/errors.js @@ -0,0 +1,7 @@ +module.exports = [ + [ + /Conflict/, + /Multiple assets emit different content to the same filename/, + /same-name\.txt/ + ] +]; diff --git a/test/configCases/emit-asset/different-source/index.js b/test/configCases/emit-asset/different-source/index.js new file mode 100644 index 00000000000..a03fbd7bd6c --- /dev/null +++ b/test/configCases/emit-asset/different-source/index.js @@ -0,0 +1,4 @@ +it("should compile without warnings", () => { + require("./test1.txt"); + require("./test2.txt"); +}); diff --git a/test/configCases/emit-asset/different-source/test1.txt b/test/configCases/emit-asset/different-source/test1.txt new file mode 100644 index 00000000000..557db03de99 --- /dev/null +++ b/test/configCases/emit-asset/different-source/test1.txt @@ -0,0 +1 @@ +Hello World diff --git a/test/configCases/emit-asset/different-source/test2.txt b/test/configCases/emit-asset/different-source/test2.txt new file mode 100644 index 00000000000..299d09ff310 --- /dev/null +++ b/test/configCases/emit-asset/different-source/test2.txt @@ -0,0 +1 @@ +Something else diff --git a/test/configCases/emit-asset/different-source/webpack.config.js b/test/configCases/emit-asset/different-source/webpack.config.js new file mode 100644 index 00000000000..c124af72167 --- /dev/null +++ b/test/configCases/emit-asset/different-source/webpack.config.js @@ -0,0 +1,16 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + module: { + rules: [ + { + test: /\.txt$/, + use: { + loader: "file-loader", + options: { + name: "same-name.txt" + } + } + } + ] + } +}; diff --git a/test/configCases/emit-asset/equal-source/index.js b/test/configCases/emit-asset/equal-source/index.js new file mode 100644 index 00000000000..a03fbd7bd6c --- /dev/null +++ b/test/configCases/emit-asset/equal-source/index.js @@ -0,0 +1,4 @@ +it("should compile without warnings", () => { + require("./test1.txt"); + require("./test2.txt"); +}); diff --git a/test/configCases/emit-asset/equal-source/test1.txt b/test/configCases/emit-asset/equal-source/test1.txt new file mode 100644 index 00000000000..557db03de99 --- /dev/null +++ b/test/configCases/emit-asset/equal-source/test1.txt @@ -0,0 +1 @@ +Hello World diff --git a/test/configCases/emit-asset/equal-source/test2.txt b/test/configCases/emit-asset/equal-source/test2.txt new file mode 100644 index 00000000000..557db03de99 --- /dev/null +++ b/test/configCases/emit-asset/equal-source/test2.txt @@ -0,0 +1 @@ +Hello World diff --git a/test/configCases/emit-asset/equal-source/webpack.config.js b/test/configCases/emit-asset/equal-source/webpack.config.js new file mode 100644 index 00000000000..c124af72167 --- /dev/null +++ b/test/configCases/emit-asset/equal-source/webpack.config.js @@ -0,0 +1,16 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + module: { + rules: [ + { + test: /\.txt$/, + use: { + loader: "file-loader", + options: { + name: "same-name.txt" + } + } + } + ] + } +}; diff --git a/test/configCases/entry/adding-multiple-entry-points/fail.js b/test/configCases/entry/adding-multiple-entry-points/fail.js new file mode 100644 index 00000000000..e5f60bc2f7d --- /dev/null +++ b/test/configCases/entry/adding-multiple-entry-points/fail.js @@ -0,0 +1 @@ +// no test here, this will fail when only this entry is loaded diff --git a/test/configCases/entry/override-entry-point/ok.js b/test/configCases/entry/adding-multiple-entry-points/ok.js similarity index 100% rename from test/configCases/entry/override-entry-point/ok.js rename to test/configCases/entry/adding-multiple-entry-points/ok.js diff --git a/test/configCases/entry/adding-multiple-entry-points/test.config.js b/test/configCases/entry/adding-multiple-entry-points/test.config.js new file mode 100644 index 00000000000..1a96fecb170 --- /dev/null +++ b/test/configCases/entry/adding-multiple-entry-points/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./runtime~main.js", "./main.js"]; + } +}; diff --git a/test/configCases/entry/adding-multiple-entry-points/webpack.config.js b/test/configCases/entry/adding-multiple-entry-points/webpack.config.js new file mode 100644 index 00000000000..994b605b471 --- /dev/null +++ b/test/configCases/entry/adding-multiple-entry-points/webpack.config.js @@ -0,0 +1,18 @@ +const EntryPlugin = require("../../../../").EntryPlugin; +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: () => ({}), + optimization: { + runtimeChunk: true + }, + output: { + filename: "[name].js", + chunkFilename: "[name].chunk.js" + }, + target: "web", + plugins: [ + new EntryPlugin(__dirname, "./fail", "main"), + new EntryPlugin(__dirname, "./ok", "main"), + new EntryPlugin(__dirname, "./fail", "main") + ] +}; diff --git a/test/configCases/entry/depend-on-advanced/app.js b/test/configCases/entry/depend-on-advanced/app.js new file mode 100644 index 00000000000..00d61511587 --- /dev/null +++ b/test/configCases/entry/depend-on-advanced/app.js @@ -0,0 +1,2 @@ +import isomorphicFetch from "isomorphic-fetch"; +import lodash from "lodash"; diff --git a/test/configCases/entry/depend-on-advanced/lazy.js b/test/configCases/entry/depend-on-advanced/lazy.js new file mode 100644 index 00000000000..63ef6b95d3c --- /dev/null +++ b/test/configCases/entry/depend-on-advanced/lazy.js @@ -0,0 +1,7 @@ +import lodash from "lodash"; +import propTypes from "prop-types"; + +export default function() { + expect(lodash).toBe("lodash"); + expect(propTypes).toBe("prop-types"); +} diff --git a/test/configCases/entry/depend-on-advanced/node_modules/isomorphic-fetch.js b/test/configCases/entry/depend-on-advanced/node_modules/isomorphic-fetch.js new file mode 100644 index 00000000000..ce0c36b3158 --- /dev/null +++ b/test/configCases/entry/depend-on-advanced/node_modules/isomorphic-fetch.js @@ -0,0 +1 @@ +module.exports = "isomorphic-fetch"; diff --git a/test/configCases/entry/depend-on-advanced/node_modules/lodash.js b/test/configCases/entry/depend-on-advanced/node_modules/lodash.js new file mode 100644 index 00000000000..8cae1154e6b --- /dev/null +++ b/test/configCases/entry/depend-on-advanced/node_modules/lodash.js @@ -0,0 +1 @@ +module.exports = 'lodash'; diff --git a/test/configCases/entry/depend-on-advanced/node_modules/prop-types.js b/test/configCases/entry/depend-on-advanced/node_modules/prop-types.js new file mode 100644 index 00000000000..9c6971329ce --- /dev/null +++ b/test/configCases/entry/depend-on-advanced/node_modules/prop-types.js @@ -0,0 +1 @@ +module.exports = 'prop-types'; diff --git a/test/configCases/entry/depend-on-advanced/node_modules/react-dom.js b/test/configCases/entry/depend-on-advanced/node_modules/react-dom.js new file mode 100644 index 00000000000..d2f4c643e28 --- /dev/null +++ b/test/configCases/entry/depend-on-advanced/node_modules/react-dom.js @@ -0,0 +1 @@ +module.exports = 'react-dom'; diff --git a/test/configCases/entry/depend-on-advanced/node_modules/react.js b/test/configCases/entry/depend-on-advanced/node_modules/react.js new file mode 100644 index 00000000000..11c0b89c737 --- /dev/null +++ b/test/configCases/entry/depend-on-advanced/node_modules/react.js @@ -0,0 +1 @@ +module.exports = 'react'; diff --git a/test/configCases/entry/depend-on-advanced/node_modules/test.js b/test/configCases/entry/depend-on-advanced/node_modules/test.js new file mode 100644 index 00000000000..25b8e921775 --- /dev/null +++ b/test/configCases/entry/depend-on-advanced/node_modules/test.js @@ -0,0 +1,2 @@ +export let value = "fail"; +export function set(v) { value = v; } diff --git a/test/configCases/entry/depend-on-advanced/other-vendors.js b/test/configCases/entry/depend-on-advanced/other-vendors.js new file mode 100644 index 00000000000..8d844056e1a --- /dev/null +++ b/test/configCases/entry/depend-on-advanced/other-vendors.js @@ -0,0 +1,4 @@ +import lodash from "lodash"; +import { set } from "test"; + +set("ok"); diff --git a/test/configCases/entry/depend-on-advanced/page1.js b/test/configCases/entry/depend-on-advanced/page1.js new file mode 100644 index 00000000000..71d11a2b2fc --- /dev/null +++ b/test/configCases/entry/depend-on-advanced/page1.js @@ -0,0 +1,26 @@ +import isomorphicFetch from "isomorphic-fetch"; +import react from "react"; +import reactDOM from "react-dom"; + +it("should be able to load the modules", () => { + expect(isomorphicFetch).toBe("isomorphic-fetch"); + expect(react).toBe("react"); + expect(reactDOM).toBe("react-dom"); +}); + +it("should have the correct modules in a lazy chunk", () => { + const promise = import(/* webpackChunkName: "lazy" */ "./lazy").then( + module => { + module.default(); + } + ); + __non_webpack_require__("./lazy.js"); + document.head._children[0].onload(); + return promise; +}); + +import { value } from "test"; + +it("other-vendors should run too", () => { + expect(value).toBe("ok"); +}); diff --git a/test/configCases/entry/depend-on-advanced/page2.js b/test/configCases/entry/depend-on-advanced/page2.js new file mode 100644 index 00000000000..32f96417bc7 --- /dev/null +++ b/test/configCases/entry/depend-on-advanced/page2.js @@ -0,0 +1,26 @@ +import isomorphicFetch from "isomorphic-fetch"; +import react from "react"; +import reactDOM from "react-dom"; + +it("should be able to load the modules", () => { + expect(isomorphicFetch).toBe("isomorphic-fetch"); + expect(react).toBe("react"); + expect(reactDOM).toBe("react-dom"); +}); + +it("should have the correct modules in a lazy chunk", () => { + const promise = import(/* webpackChunkName: "lazy" */ "./lazy").then( + module => { + module.default(); + } + ); + __non_webpack_require__("./lazy.js"); + if (document.head._children[0]) document.head._children[0].onload(); + return promise; +}); + +import { value } from "test"; + +it("other-vendors should run too", () => { + expect(value).toBe("ok"); +}); diff --git a/test/configCases/entry/depend-on-advanced/page3.js b/test/configCases/entry/depend-on-advanced/page3.js new file mode 100644 index 00000000000..32f96417bc7 --- /dev/null +++ b/test/configCases/entry/depend-on-advanced/page3.js @@ -0,0 +1,26 @@ +import isomorphicFetch from "isomorphic-fetch"; +import react from "react"; +import reactDOM from "react-dom"; + +it("should be able to load the modules", () => { + expect(isomorphicFetch).toBe("isomorphic-fetch"); + expect(react).toBe("react"); + expect(reactDOM).toBe("react-dom"); +}); + +it("should have the correct modules in a lazy chunk", () => { + const promise = import(/* webpackChunkName: "lazy" */ "./lazy").then( + module => { + module.default(); + } + ); + __non_webpack_require__("./lazy.js"); + if (document.head._children[0]) document.head._children[0].onload(); + return promise; +}); + +import { value } from "test"; + +it("other-vendors should run too", () => { + expect(value).toBe("ok"); +}); diff --git a/test/configCases/entry/depend-on-advanced/test.config.js b/test/configCases/entry/depend-on-advanced/test.config.js new file mode 100644 index 00000000000..e4418ec8151 --- /dev/null +++ b/test/configCases/entry/depend-on-advanced/test.config.js @@ -0,0 +1,13 @@ +module.exports = { + findBundle() { + return [ + "./app.js", + "./runtime.js", + "./page1.js", + "./react-vendors.js", + "./page2.js", + "./other-vendors.js", + "./page3.js" + ]; + } +}; diff --git a/test/configCases/entry/depend-on-advanced/webpack.config.js b/test/configCases/entry/depend-on-advanced/webpack.config.js new file mode 100644 index 00000000000..7212cf3a429 --- /dev/null +++ b/test/configCases/entry/depend-on-advanced/webpack.config.js @@ -0,0 +1,78 @@ +/** @typedef {import("../../../../").Compiler} Compiler */ +/** @typedef {import("../../../../").Compilation} Compilation */ +/** @typedef {import("../../../../").Configuration} Configuration */ +/** @typedef {import("../../../../").Chunk} Chunk */ + +/** @type {Configuration} */ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry() { + return Promise.resolve({ + app: { import: "./app.js", dependOn: ["other-vendors"] }, + page1: { import: "./page1.js", dependOn: ["app", "react-vendors"] }, + page2: { import: "./page2.js", dependOn: ["app", "react-vendors"] }, + page3: { import: "./page3.js", dependOn: ["app"] }, + "react-vendors": ["react", "react-dom", "prop-types"], + "other-vendors": "./other-vendors" + }); + }, + target: "web", + optimization: { + runtimeChunk: "single" + }, + output: { + filename: "[name].js" + }, + plugins: [ + /** + * @this {Compiler} compiler + */ + function () { + /** + * @param {Compilation} compilation compilation + * @returns {void} + */ + const handler = compilation => { + compilation.hooks.afterSeal.tap("testcase", () => { + const { chunkGraph } = compilation; + /** @type {Record>} */ + const chunkModules = {}; + for (const chunk of compilation.chunks) { + chunkModules[ + /** @type {NonNullable} */ + (chunk.name) + ] = new Set(); + + for (const module of chunkGraph.getChunkModulesIterable(chunk)) { + chunkModules[ + /** @type {NonNullable} */ + (chunk.name) + ].add(module.identifier()); + } + } + + for (const module of chunkModules["other-vendors"]) { + expect([...chunkModules.app]).not.toContain(module); + } + + for (const module of [ + ...chunkModules["other-vendors"], + ...chunkModules["react-vendors"], + ...chunkModules.app + ]) { + expect(chunkModules.page1).not.toContain(module); + expect(chunkModules.page2).not.toContain(module); + } + + for (const module of [ + ...chunkModules["other-vendors"], + ...chunkModules.app + ]) { + expect([...chunkModules.page3]).not.toContain(module); + } + }); + }; + this.hooks.compilation.tap("testcase", handler); + } + ] +}; diff --git a/test/configCases/entry/depend-on-bug/app.js b/test/configCases/entry/depend-on-bug/app.js new file mode 100644 index 00000000000..b6eb6a3130b --- /dev/null +++ b/test/configCases/entry/depend-on-bug/app.js @@ -0,0 +1 @@ +import isomorphicFetch from "isomorphic-fetch"; diff --git a/test/configCases/entry/depend-on-bug/node_modules/isomorphic-fetch.js b/test/configCases/entry/depend-on-bug/node_modules/isomorphic-fetch.js new file mode 100644 index 00000000000..ce0c36b3158 --- /dev/null +++ b/test/configCases/entry/depend-on-bug/node_modules/isomorphic-fetch.js @@ -0,0 +1 @@ +module.exports = "isomorphic-fetch"; diff --git a/test/configCases/entry/depend-on-bug/other-vendors.js b/test/configCases/entry/depend-on-bug/other-vendors.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/entry/depend-on-bug/page1.js b/test/configCases/entry/depend-on-bug/page1.js new file mode 100644 index 00000000000..36a7db85bbe --- /dev/null +++ b/test/configCases/entry/depend-on-bug/page1.js @@ -0,0 +1,7 @@ +import isomorphicFetch from "isomorphic-fetch"; + +it("should run", () => { + expect( + __STATS__.modules.find(m => m.name.includes("isomorphic-fetch")).chunks + ).toHaveLength(1); +}); diff --git a/test/configCases/entry/depend-on-bug/test.config.js b/test/configCases/entry/depend-on-bug/test.config.js new file mode 100644 index 00000000000..f0f5067ae54 --- /dev/null +++ b/test/configCases/entry/depend-on-bug/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./other-vendors.js", "./page1.js", "./app.js"]; + } +}; diff --git a/test/configCases/entry/depend-on-bug/webpack.config.js b/test/configCases/entry/depend-on-bug/webpack.config.js new file mode 100644 index 00000000000..e55145af4c7 --- /dev/null +++ b/test/configCases/entry/depend-on-bug/webpack.config.js @@ -0,0 +1,19 @@ +/** @typedef {import("../../../../").Compiler} Compiler */ +/** @typedef {import("../../../../").Compilation} Compilation */ +/** @typedef {import("../../../../").Configuration} Configuration */ + +/** @type {Configuration} */ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry() { + return Promise.resolve({ + app: { import: "./app.js", dependOn: ["other-vendors"] }, + page1: { import: "./page1.js", dependOn: ["app"] }, + "other-vendors": "./other-vendors" + }); + }, + target: "web", + output: { + filename: "[name].js" + } +}; diff --git a/test/configCases/entry/depend-on-non-js/a.css b/test/configCases/entry/depend-on-non-js/a.css new file mode 100644 index 00000000000..58362a94448 --- /dev/null +++ b/test/configCases/entry/depend-on-non-js/a.css @@ -0,0 +1 @@ +module.exports = [[module.id, "body { background-color: green; }"]]; diff --git a/test/configCases/entry/depend-on-non-js/a.js b/test/configCases/entry/depend-on-non-js/a.js new file mode 100644 index 00000000000..bc7652000f3 --- /dev/null +++ b/test/configCases/entry/depend-on-non-js/a.js @@ -0,0 +1 @@ +if (Math.random() < 0) require("./a.css"); diff --git a/test/configCases/entry/depend-on-non-js/b.css b/test/configCases/entry/depend-on-non-js/b.css new file mode 100644 index 00000000000..867e7070dc8 --- /dev/null +++ b/test/configCases/entry/depend-on-non-js/b.css @@ -0,0 +1 @@ +module.exports = [[module.id, "body { color: red; }"]]; diff --git a/test/configCases/entry/depend-on-non-js/b.js b/test/configCases/entry/depend-on-non-js/b.js new file mode 100644 index 00000000000..7c96074e6e3 --- /dev/null +++ b/test/configCases/entry/depend-on-non-js/b.js @@ -0,0 +1,3 @@ +if (Math.random() < 0) require("./b.css"); + +it("should run the test", () => {}); diff --git a/test/configCases/entry/depend-on-non-js/test.config.js b/test/configCases/entry/depend-on-non-js/test.config.js new file mode 100644 index 00000000000..bb4a0a53e21 --- /dev/null +++ b/test/configCases/entry/depend-on-non-js/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./runtime.js", "./a.js", "./b.js"]; + } +}; diff --git a/test/configCases/entry/depend-on-non-js/webpack.config.js b/test/configCases/entry/depend-on-non-js/webpack.config.js new file mode 100644 index 00000000000..1d85d3a86ad --- /dev/null +++ b/test/configCases/entry/depend-on-non-js/webpack.config.js @@ -0,0 +1,38 @@ +const MiniCssPlugin = require("mini-css-extract-plugin"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + a: "./a.js", + b: { import: "./b.js", dependOn: "a" } + }, + module: { + rules: [ + { + test: /\.css$/, + loader: MiniCssPlugin.loader + } + ] + }, + output: { + filename: "[name].js" + }, + optimization: { + runtimeChunk: "single", + splitChunks: { + chunks: "all", + cacheGroups: { + styles: { + type: "css/mini-extract", + enforce: true + } + } + } + }, + target: "web", + plugins: [ + new MiniCssPlugin({ + experimentalUseImportModule: true + }) + ] +}; diff --git a/test/configCases/entry/depend-on-simple/app.js b/test/configCases/entry/depend-on-simple/app.js new file mode 100644 index 00000000000..a43ae345ce5 --- /dev/null +++ b/test/configCases/entry/depend-on-simple/app.js @@ -0,0 +1,9 @@ +import react from "react"; +import reactDOM from "react-dom"; +import propTypes from "prop-types"; + +it("should load modules correctly", () => { + expect(react).toBe("react"); + expect(reactDOM).toBe("react-dom"); + expect(propTypes).toBe("prop-types"); +}); diff --git a/test/configCases/entry/depend-on-simple/node_modules/prop-types.js b/test/configCases/entry/depend-on-simple/node_modules/prop-types.js new file mode 100644 index 00000000000..9c6971329ce --- /dev/null +++ b/test/configCases/entry/depend-on-simple/node_modules/prop-types.js @@ -0,0 +1 @@ +module.exports = 'prop-types'; diff --git a/test/configCases/entry/depend-on-simple/node_modules/react-dom.js b/test/configCases/entry/depend-on-simple/node_modules/react-dom.js new file mode 100644 index 00000000000..d2f4c643e28 --- /dev/null +++ b/test/configCases/entry/depend-on-simple/node_modules/react-dom.js @@ -0,0 +1 @@ +module.exports = 'react-dom'; diff --git a/test/configCases/entry/depend-on-simple/node_modules/react.js b/test/configCases/entry/depend-on-simple/node_modules/react.js new file mode 100644 index 00000000000..11c0b89c737 --- /dev/null +++ b/test/configCases/entry/depend-on-simple/node_modules/react.js @@ -0,0 +1 @@ +module.exports = 'react'; diff --git a/test/configCases/entry/depend-on-simple/test.config.js b/test/configCases/entry/depend-on-simple/test.config.js new file mode 100644 index 00000000000..49dc848d75a --- /dev/null +++ b/test/configCases/entry/depend-on-simple/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./app.js", "./react-vendors.js"]; + } +}; diff --git a/test/configCases/entry/depend-on-simple/webpack.config.js b/test/configCases/entry/depend-on-simple/webpack.config.js new file mode 100644 index 00000000000..7fc599a4e42 --- /dev/null +++ b/test/configCases/entry/depend-on-simple/webpack.config.js @@ -0,0 +1,52 @@ +/** @typedef {import("../../../../").Compiler} Compiler */ +/** @typedef {import("../../../../").Compilation} Compilation */ +/** @typedef {import("../../../../").Chunk} Chunk */ +/** @typedef {import("../../../../").Module} Module */ + +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + app: { import: "./app.js", dependOn: "react-vendors" }, + "react-vendors": ["react", "react-dom", "prop-types"] + }, + target: "web", + output: { + filename: "[name].js" + }, + plugins: [ + /** + * @this {Compiler} compiler + */ + function () { + /** + * @param {Compilation} compilation compilation + * @returns {void} + */ + const handler = compilation => { + compilation.hooks.afterSeal.tap("testcase", () => { + const { chunkGraph } = compilation; + /** @type {Record>} */ + const chunkModules = {}; + for (const chunk of compilation.chunks) { + chunkModules[ + /** @type {NonNullable} */ + (chunk.name) + ] = new Set(); + + for (const module of chunkGraph.getChunkModulesIterable(chunk)) { + chunkModules[ + /** @type {NonNullable} */ + (chunk.name) + ].add(module); + } + } + + expect([...chunkModules.app]).toStrictEqual( + expect.not.arrayContaining([...chunkModules["react-vendors"]]) + ); + }); + }; + this.hooks.compilation.tap("testcase", handler); + } + ] +}; diff --git a/test/configCases/entry/descriptor/a.js b/test/configCases/entry/descriptor/a.js new file mode 100644 index 00000000000..0041c02292d --- /dev/null +++ b/test/configCases/entry/descriptor/a.js @@ -0,0 +1,3 @@ +it("should compile", (done) => { + done() +}); diff --git a/test/configCases/entry/descriptor/b.js b/test/configCases/entry/descriptor/b.js new file mode 100644 index 00000000000..0041c02292d --- /dev/null +++ b/test/configCases/entry/descriptor/b.js @@ -0,0 +1,3 @@ +it("should compile", (done) => { + done() +}); diff --git a/test/configCases/entry/descriptor/test.config.js b/test/configCases/entry/descriptor/test.config.js new file mode 100644 index 00000000000..212b2e5fc13 --- /dev/null +++ b/test/configCases/entry/descriptor/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./a.js", "./b.js"]; + } +}; diff --git a/test/configCases/entry/descriptor/webpack.config.js b/test/configCases/entry/descriptor/webpack.config.js new file mode 100644 index 00000000000..d6e64eb6ec6 --- /dev/null +++ b/test/configCases/entry/descriptor/webpack.config.js @@ -0,0 +1,12 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry() { + return { + a: { import: "./a" }, + b: { import: ["./b"] } + }; + }, + output: { + filename: "[name].js" + } +}; diff --git a/test/configCases/entry/entry-base-uri/1.jpg b/test/configCases/entry/entry-base-uri/1.jpg new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/entry/entry-base-uri/index.js b/test/configCases/entry/entry-base-uri/index.js new file mode 100644 index 00000000000..7d00291f23b --- /dev/null +++ b/test/configCases/entry/entry-base-uri/index.js @@ -0,0 +1,5 @@ +const jpg = new URL("./1.jpg", import.meta.url); + +it("should provide custom base uri", () => { + expect(jpg.toString()).toBe("my-scheme://baseuri/1.jpg"); +}); diff --git a/test/configCases/entry/entry-base-uri/webpack.config.js b/test/configCases/entry/entry-base-uri/webpack.config.js new file mode 100644 index 00000000000..283ccf45eef --- /dev/null +++ b/test/configCases/entry/entry-base-uri/webpack.config.js @@ -0,0 +1,14 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + bundle0: { + import: "./index.js", + baseUri: "my-scheme://baseuri", + publicPath: "/" + } + }, + output: { + assetModuleFilename: "[name][ext]" + }, + target: "web" +}; diff --git a/test/configCases/entry/function-promise/test.config.js b/test/configCases/entry/function-promise/test.config.js index 8a5b96a8434..212b2e5fc13 100644 --- a/test/configCases/entry/function-promise/test.config.js +++ b/test/configCases/entry/function-promise/test.config.js @@ -1,8 +1,5 @@ module.exports = { - findBundle: function() { - return [ - "./a.js", - "./b.js" - ] + findBundle() { + return ["./a.js", "./b.js"]; } }; diff --git a/test/configCases/entry/function-promise/webpack.config.js b/test/configCases/entry/function-promise/webpack.config.js index 51f96abb8ed..50d4e430802 100644 --- a/test/configCases/entry/function-promise/webpack.config.js +++ b/test/configCases/entry/function-promise/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { entry() { return Promise.resolve({ diff --git a/test/configCases/entry/function/test.config.js b/test/configCases/entry/function/test.config.js index 8a5b96a8434..212b2e5fc13 100644 --- a/test/configCases/entry/function/test.config.js +++ b/test/configCases/entry/function/test.config.js @@ -1,8 +1,5 @@ module.exports = { - findBundle: function() { - return [ - "./a.js", - "./b.js" - ] + findBundle() { + return ["./a.js", "./b.js"]; } }; diff --git a/test/configCases/entry/function/webpack.config.js b/test/configCases/entry/function/webpack.config.js index aaeba7d0f45..b7bf7cdd8ec 100644 --- a/test/configCases/entry/function/webpack.config.js +++ b/test/configCases/entry/function/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { entry() { return { diff --git a/test/configCases/entry/issue-1068/webpack.config.js b/test/configCases/entry/issue-1068/webpack.config.js index 9f42fbd69f1..e1229c307c1 100644 --- a/test/configCases/entry/issue-1068/webpack.config.js +++ b/test/configCases/entry/issue-1068/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { entry: [ "./a", diff --git a/test/configCases/entry/issue-12562/app.js b/test/configCases/entry/issue-12562/app.js new file mode 100644 index 00000000000..03392144212 --- /dev/null +++ b/test/configCases/entry/issue-12562/app.js @@ -0,0 +1 @@ +it("should load", () => import("./test.js")); diff --git a/test/configCases/entry/issue-12562/home.js b/test/configCases/entry/issue-12562/home.js new file mode 100644 index 00000000000..6a0525ff48f --- /dev/null +++ b/test/configCases/entry/issue-12562/home.js @@ -0,0 +1,4 @@ +import log from "./log"; +log("Hi"); + +it("should load", () => {}); diff --git a/test/configCases/entry/issue-12562/log.js b/test/configCases/entry/issue-12562/log.js new file mode 100644 index 00000000000..1dde663cf13 --- /dev/null +++ b/test/configCases/entry/issue-12562/log.js @@ -0,0 +1,3 @@ +export default function (msg) { + console.log.bind(console, msg); +} diff --git a/test/configCases/entry/issue-12562/test.config.js b/test/configCases/entry/issue-12562/test.config.js new file mode 100644 index 00000000000..b1fbb4ba6a7 --- /dev/null +++ b/test/configCases/entry/issue-12562/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./runtime.js", "./app.js", "./home.js"]; + } +}; diff --git a/test/configCases/entry/issue-12562/test.js b/test/configCases/entry/issue-12562/test.js new file mode 100644 index 00000000000..d3cb28b6458 --- /dev/null +++ b/test/configCases/entry/issue-12562/test.js @@ -0,0 +1,2 @@ +import log from "./log"; +log("Hi"); diff --git a/test/configCases/entry/issue-12562/webpack.config.js b/test/configCases/entry/issue-12562/webpack.config.js new file mode 100644 index 00000000000..2e0423bbc89 --- /dev/null +++ b/test/configCases/entry/issue-12562/webpack.config.js @@ -0,0 +1,17 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + app: "./app.js", + home: { + import: "./home.js", + dependOn: "app" + } + }, + output: { + pathinfo: "verbose", + filename: "[name].js" + }, + optimization: { + runtimeChunk: "single" + } +}; diff --git a/test/configCases/entry/issue-13637/index-system.js b/test/configCases/entry/issue-13637/index-system.js new file mode 100644 index 00000000000..ac93b355f7c --- /dev/null +++ b/test/configCases/entry/issue-13637/index-system.js @@ -0,0 +1,8 @@ +// This test verifies that the System.register context is made available to webpack bundles + +it("should be able to use the System.register context in entries where library.type is system", function() { + expect(__system_context__).toBeTruthy(); + expect(__system_context__.meta).toBeTruthy(); + expect(typeof __system_context__.import).toBe("function"); + expect(typeof __system_context__.meta.url).toBe("string"); +}); diff --git a/test/configCases/entry/issue-13637/index-umd.js b/test/configCases/entry/issue-13637/index-umd.js new file mode 100644 index 00000000000..73fb58795cc --- /dev/null +++ b/test/configCases/entry/issue-13637/index-umd.js @@ -0,0 +1,5 @@ +// This test verifies that the System.register context is not available for non-system entries + +it("should not be able to use the System.register context in entries where library.type is not system", function() { + expect(__system_context__).toBeUndefined(); +}); diff --git a/test/configCases/entry/issue-13637/test.config.js b/test/configCases/entry/issue-13637/test.config.js new file mode 100644 index 00000000000..89dad6d83d7 --- /dev/null +++ b/test/configCases/entry/issue-13637/test.config.js @@ -0,0 +1,16 @@ +const System = require("../../../helpers/fakeSystem"); + +module.exports = { + beforeExecute: () => { + System.init(); + }, + moduleScope(scope) { + scope.System = System; + }, + afterExecute: () => { + System.execute("(anonym)"); + }, + findBundle() { + return ["./main.system.js", "./main.umd.js"]; + } +}; diff --git a/test/configCases/entry/issue-13637/webpack.config.js b/test/configCases/entry/issue-13637/webpack.config.js new file mode 100644 index 00000000000..ba3c6618ca1 --- /dev/null +++ b/test/configCases/entry/issue-13637/webpack.config.js @@ -0,0 +1,23 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + "main-system": { + import: "./index-system.js", + library: { + type: "system" + }, + filename: "main.system.js" + }, + "main-umd": { + import: "./index-umd.js", + library: { + type: "umd" + }, + filename: "main.umd.js" + } + }, + node: { + __dirname: false, + __filename: false + } +}; diff --git a/test/configCases/entry/issue-8110/webpack.config.js b/test/configCases/entry/issue-8110/webpack.config.js index ca8fd308d0a..1954865e205 100644 --- a/test/configCases/entry/issue-8110/webpack.config.js +++ b/test/configCases/entry/issue-8110/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { entry: { bundle0: "./a", diff --git a/test/configCases/entry/no-chunking/a.js b/test/configCases/entry/no-chunking/a.js new file mode 100644 index 00000000000..b5c7af9a9a2 --- /dev/null +++ b/test/configCases/entry/no-chunking/a.js @@ -0,0 +1,12 @@ +import fs from "fs"; + +it("should load chunks on demand", async () => { + expect((await import("./async")).default).toEqual(42); + expect((await (await import("./async")).nested()).default).toEqual(43); + expect(fs.readFileSync(__filename, "utf-8")).not.toContain( + "This is the" + " async chunk" + ); + expect(fs.readFileSync(__filename, "utf-8")).not.toContain( + "This is the" + " nested async chunk" + ); +}); diff --git a/test/configCases/entry/no-chunking/async.js b/test/configCases/entry/no-chunking/async.js new file mode 100644 index 00000000000..5bb02b6aef8 --- /dev/null +++ b/test/configCases/entry/no-chunking/async.js @@ -0,0 +1,3 @@ +// This is the async chunk +export default 42; +export const nested = () => import("./nested"); diff --git a/test/configCases/entry/no-chunking/b.js b/test/configCases/entry/no-chunking/b.js new file mode 100644 index 00000000000..963cac2f617 --- /dev/null +++ b/test/configCases/entry/no-chunking/b.js @@ -0,0 +1,12 @@ +import fs from "fs"; + +it("should include all async imports in the main chunk", async () => { + expect((await import("./async")).default).toEqual(42); + expect((await (await import("./async")).nested()).default).toEqual(43); + expect(fs.readFileSync(__filename, "utf-8")).toContain( + "This is the async chunk" + ); + expect(fs.readFileSync(__filename, "utf-8")).toContain( + "This is the nested async chunk" + ); +}); diff --git a/test/configCases/entry/no-chunking/nested.js b/test/configCases/entry/no-chunking/nested.js new file mode 100644 index 00000000000..423e55b22e2 --- /dev/null +++ b/test/configCases/entry/no-chunking/nested.js @@ -0,0 +1,2 @@ +// This is the nested async chunk +export default 43; diff --git a/test/configCases/entry/no-chunking/test.config.js b/test/configCases/entry/no-chunking/test.config.js new file mode 100644 index 00000000000..c8bd29f48c3 --- /dev/null +++ b/test/configCases/entry/no-chunking/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["./a.js", "./b.js", "./c.js", "./runtime.js", "./d.js"]; + } +}; diff --git a/test/configCases/entry/no-chunking/webpack.config.js b/test/configCases/entry/no-chunking/webpack.config.js new file mode 100644 index 00000000000..3becbc09b6f --- /dev/null +++ b/test/configCases/entry/no-chunking/webpack.config.js @@ -0,0 +1,29 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + a: "./a.js", + b: { + import: "./b.js", + chunkLoading: false + }, + c: { + import: "./b.js", + asyncChunks: false + }, + d: { + import: "./b.js", + asyncChunks: false, + runtime: "runtime" + } + }, + output: { + filename: "[name].js" + }, + target: "web", + externals: { + fs: "commonjs fs" + }, + node: { + __filename: false + } +}; diff --git a/test/configCases/entry/override-entry-point/fail.js b/test/configCases/entry/override-entry-point/fail.js deleted file mode 100644 index bfab02f2fe4..00000000000 --- a/test/configCases/entry/override-entry-point/fail.js +++ /dev/null @@ -1,3 +0,0 @@ -it("should load correct entry", function() { - throw new Error("This entrypoint should not be used"); -}); diff --git a/test/configCases/entry/override-entry-point/test.config.js b/test/configCases/entry/override-entry-point/test.config.js deleted file mode 100644 index f7e765f2978..00000000000 --- a/test/configCases/entry/override-entry-point/test.config.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - findBundle: function() { - return [ - "./runtime~main.js", - "./main.chunk.js" - ] - } -}; diff --git a/test/configCases/entry/override-entry-point/webpack.config.js b/test/configCases/entry/override-entry-point/webpack.config.js deleted file mode 100644 index 2eb94ff79d8..00000000000 --- a/test/configCases/entry/override-entry-point/webpack.config.js +++ /dev/null @@ -1,16 +0,0 @@ -const SingleEntryPlugin = require("../../../../lib/SingleEntryPlugin"); -module.exports = { - entry: () => ({}), - optimization: { - runtimeChunk: true - }, - output: { - filename: "[name].js", - chunkFilename: "[name].chunk.js" - }, - target: "web", - plugins: [ - new SingleEntryPlugin(__dirname, "./fail", "main"), - new SingleEntryPlugin(__dirname, "./ok", "main") - ] -}; diff --git a/test/configCases/entry/require-entry-point/webpack.config.js b/test/configCases/entry/require-entry-point/webpack.config.js index 54b25366f4f..f8d4436d2a3 100644 --- a/test/configCases/entry/require-entry-point/webpack.config.js +++ b/test/configCases/entry/require-entry-point/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { entry: { bundle0: "./require-entry-point", diff --git a/test/configCases/entry/single-entry-point/webpack.config.js b/test/configCases/entry/single-entry-point/webpack.config.js index d663ad3c400..777b9f6bd71 100644 --- a/test/configCases/entry/single-entry-point/webpack.config.js +++ b/test/configCases/entry/single-entry-point/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { entry: "./single-entry-point" }; diff --git a/test/configCases/entry/usage-info-in-multiple-entry-points/a.js b/test/configCases/entry/usage-info-in-multiple-entry-points/a.js new file mode 100644 index 00000000000..54cbd8611e3 --- /dev/null +++ b/test/configCases/entry/usage-info-in-multiple-entry-points/a.js @@ -0,0 +1,5 @@ +import value from "./module"; + +it("should have usage info in this module", () => { + expect(value).toBe(42); +}) diff --git a/test/configCases/entry/usage-info-in-multiple-entry-points/b.js b/test/configCases/entry/usage-info-in-multiple-entry-points/b.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/entry/usage-info-in-multiple-entry-points/module.js b/test/configCases/entry/usage-info-in-multiple-entry-points/module.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/configCases/entry/usage-info-in-multiple-entry-points/module.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/configCases/entry/usage-info-in-multiple-entry-points/webpack.config.js b/test/configCases/entry/usage-info-in-multiple-entry-points/webpack.config.js new file mode 100644 index 00000000000..294adb67dd1 --- /dev/null +++ b/test/configCases/entry/usage-info-in-multiple-entry-points/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: ["./a", "./b"] +}; diff --git a/test/configCases/entry/weird-names/chunk.js b/test/configCases/entry/weird-names/chunk.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/configCases/entry/weird-names/chunk.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/configCases/entry/weird-names/index.js b/test/configCases/entry/weird-names/index.js new file mode 100644 index 00000000000..062fb7b2685 --- /dev/null +++ b/test/configCases/entry/weird-names/index.js @@ -0,0 +1,4 @@ +it("should load on demand", () => + import(/* webpackChunkName: "././../chunk/chunk/./../" */ "./chunk").then(r => + expect(r).toEqual(expect.objectContaining({ default: 42 })) + )); diff --git a/test/configCases/entry/weird-names/test.config.js b/test/configCases/entry/weird-names/test.config.js new file mode 100644 index 00000000000..f6819f8a118 --- /dev/null +++ b/test/configCases/entry/weird-names/test.config.js @@ -0,0 +1,9 @@ +module.exports = { + findBundle(i, options) { + return [ + `./${options.target}/folder/entry/-x/file.js`, + `./${options.target}/folder/x-/-x/file.js`, + `./${options.target}/folder/x-../entry-x/file.js` + ]; + } +}; diff --git a/test/configCases/entry/weird-names/webpack.config.js b/test/configCases/entry/weird-names/webpack.config.js new file mode 100644 index 00000000000..6d3833d4946 --- /dev/null +++ b/test/configCases/entry/weird-names/webpack.config.js @@ -0,0 +1,33 @@ +const entry = { + "././../entry/point/./../": "./index.js", + "/////": "./index.js", + "../entry": "./index.js" +}; + +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + target: "async-node", + entry, + output: { + filename: "async-node/folder/x-[name]-x/file.js", + chunkFilename: "async-node/chunks/x-[name]-x/file.js" + } + }, + { + target: "node", + entry, + output: { + filename: "node/folder/x-[name]-x/file.js", + chunkFilename: "node/chunks/x-[name]-x/file.js" + } + }, + { + target: "webworker", + entry, + output: { + filename: "webworker/folder/x-[name]-x/file.js", + chunkFilename: "webworker/chunks/x-[name]-x/file.js" + } + } +]; diff --git a/test/configCases/entry/weird-names2/chunk.js b/test/configCases/entry/weird-names2/chunk.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/configCases/entry/weird-names2/chunk.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/configCases/entry/weird-names2/index.js b/test/configCases/entry/weird-names2/index.js new file mode 100644 index 00000000000..062fb7b2685 --- /dev/null +++ b/test/configCases/entry/weird-names2/index.js @@ -0,0 +1,4 @@ +it("should load on demand", () => + import(/* webpackChunkName: "././../chunk/chunk/./../" */ "./chunk").then(r => + expect(r).toEqual(expect.objectContaining({ default: 42 })) + )); diff --git a/test/configCases/entry/weird-names2/test.config.js b/test/configCases/entry/weird-names2/test.config.js new file mode 100644 index 00000000000..d54f564d233 --- /dev/null +++ b/test/configCases/entry/weird-names2/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + findBundle(i, options) { + return [ + `../weird-names2-out/entry/entry-${options.target}.js`, + `../weird-names2-out/entry-${options.target}.js` + ]; + } +}; diff --git a/test/configCases/entry/weird-names2/webpack.config.js b/test/configCases/entry/weird-names2/webpack.config.js new file mode 100644 index 00000000000..831cc48f4d4 --- /dev/null +++ b/test/configCases/entry/weird-names2/webpack.config.js @@ -0,0 +1,32 @@ +const entry = { + "././../weird-names2-out/entry/point/./../entry": "./index.js", + "..//weird-names2-out////entry": "./index.js" +}; + +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + target: "async-node", + entry, + output: { + filename: "[name]-async-node.js", + chunkFilename: "chunks/[name]-async-node.js" + } + }, + { + target: "node", + entry, + output: { + filename: "[name]-node.js", + chunkFilename: "chunks/[name]-node.js" + } + }, + { + target: "webworker", + entry, + output: { + filename: "[name]-webworker.js", + chunkFilename: "chunks/[name]-webworker.js" + } + } +]; diff --git a/test/configCases/errors/asset-options-validation/errors.js b/test/configCases/errors/asset-options-validation/errors.js new file mode 100644 index 00000000000..cc7b138a373 --- /dev/null +++ b/test/configCases/errors/asset-options-validation/errors.js @@ -0,0 +1,6 @@ +module.exports = [ + [ + /Invalid generator object\. Asset Modules Plugin has been initialized using a generator object that does not match the API schema/, + /generator has an unknown property 'filename'/ + ] +]; diff --git a/test/configCases/errors/asset-options-validation/index.js b/test/configCases/errors/asset-options-validation/index.js new file mode 100644 index 00000000000..39765156136 --- /dev/null +++ b/test/configCases/errors/asset-options-validation/index.js @@ -0,0 +1 @@ +import url from "./text.txt"; diff --git a/test/configCases/errors/asset-options-validation/text.txt b/test/configCases/errors/asset-options-validation/text.txt new file mode 100644 index 00000000000..557db03de99 --- /dev/null +++ b/test/configCases/errors/asset-options-validation/text.txt @@ -0,0 +1 @@ +Hello World diff --git a/test/configCases/errors/asset-options-validation/webpack.config.js b/test/configCases/errors/asset-options-validation/webpack.config.js new file mode 100644 index 00000000000..6a2069d8c86 --- /dev/null +++ b/test/configCases/errors/asset-options-validation/webpack.config.js @@ -0,0 +1,14 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + module: { + rules: [ + { + test: /\.txt$/, + type: "asset/inline", + generator: { + filename: "[name].txt" + } + } + ] + } +}; diff --git a/test/configCases/errors/case-emit/errors.js b/test/configCases/errors/case-emit/errors.js new file mode 100644 index 00000000000..0e4de24617e --- /dev/null +++ b/test/configCases/errors/case-emit/errors.js @@ -0,0 +1 @@ +module.exports = [[/only differs in casing/, /a\.js/, /A\.js/]]; diff --git a/test/configCases/errors/case-emit/index.js b/test/configCases/errors/case-emit/index.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/errors/case-emit/webpack.config.js b/test/configCases/errors/case-emit/webpack.config.js new file mode 100644 index 00000000000..9b771c2547c --- /dev/null +++ b/test/configCases/errors/case-emit/webpack.config.js @@ -0,0 +1,10 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + a: "./index.js?1", + A: "./index.js?2" + }, + output: { + filename: "[name].js" + } +}; diff --git a/test/configCases/errors/depend-on-and-runtime/a.js b/test/configCases/errors/depend-on-and-runtime/a.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/errors/depend-on-and-runtime/b.js b/test/configCases/errors/depend-on-and-runtime/b.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/errors/depend-on-and-runtime/errors.js b/test/configCases/errors/depend-on-and-runtime/errors.js new file mode 100644 index 00000000000..30fed466758 --- /dev/null +++ b/test/configCases/errors/depend-on-and-runtime/errors.js @@ -0,0 +1,9 @@ +module.exports = [ + [ + /Entrypoint 'b1' has a 'runtime' option which points to another entrypoint named 'a1'/ + ], + [/Entrypoint 'b2' has 'dependOn' and 'runtime' specified/], + [ + /Entrypoints 'b3' and 'a3' use 'dependOn' to depend on each other in a circular way/ + ] +]; diff --git a/test/configCases/errors/depend-on-and-runtime/webpack.config.js b/test/configCases/errors/depend-on-and-runtime/webpack.config.js new file mode 100644 index 00000000000..964c679dc0d --- /dev/null +++ b/test/configCases/errors/depend-on-and-runtime/webpack.config.js @@ -0,0 +1,43 @@ +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + output: { + filename: "runtime-to-entrypoint-[name].js" + }, + entry: { + a1: "./a", + b1: { + runtime: "a1", + import: "./b" + } + } + }, + { + output: { + filename: "dependOn-plus-runtime-[name].js" + }, + entry: { + a2: "./a", + b2: { + runtime: "x2", + dependOn: "a2", + import: "./b" + } + } + }, + { + output: { + filename: "circular-dependOn-[name].js" + }, + entry: { + a3: { + import: "./a", + dependOn: "b3" + }, + b3: { + import: "./b", + dependOn: "a3" + } + } + } +]; diff --git a/test/configCases/errors/depend-on-error/errors.js b/test/configCases/errors/depend-on-error/errors.js new file mode 100644 index 00000000000..190bf41d53d --- /dev/null +++ b/test/configCases/errors/depend-on-error/errors.js @@ -0,0 +1 @@ +module.exports = [[/Can't resolve '\.\/file-does-not-exist\.js'/]]; diff --git a/test/configCases/errors/depend-on-error/index.js b/test/configCases/errors/depend-on-error/index.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/errors/depend-on-error/webpack.config.js b/test/configCases/errors/depend-on-error/webpack.config.js new file mode 100644 index 00000000000..967e70817c4 --- /dev/null +++ b/test/configCases/errors/depend-on-error/webpack.config.js @@ -0,0 +1,13 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + foo: "./file-does-not-exist.js", + bar: { + import: ["./index.js"], + dependOn: ["foo"] + } + }, + output: { + filename: "[name].js" + } +}; diff --git a/test/configCases/errors/entry-not-found/errors.js b/test/configCases/errors/entry-not-found/errors.js index 8529ae88883..648b41f3f03 100644 --- a/test/configCases/errors/entry-not-found/errors.js +++ b/test/configCases/errors/entry-not-found/errors.js @@ -1,3 +1 @@ -module.exports = [ - [/^Entry module not found/, /.\/index\.js/] -]; \ No newline at end of file +module.exports = [[/^Module not found/, /.\/index\.js/]]; diff --git a/test/configCases/errors/entry-not-found/webpack.config.js b/test/configCases/errors/entry-not-found/webpack.config.js index f053ebf7976..3583b70a321 100644 --- a/test/configCases/errors/entry-not-found/webpack.config.js +++ b/test/configCases/errors/entry-not-found/webpack.config.js @@ -1 +1,2 @@ +/** @type {import("../../../../").Configuration} */ module.exports = {}; diff --git a/test/configCases/errors/exception-in-chunk-renderer/errors.js b/test/configCases/errors/exception-in-chunk-renderer/errors.js index d9088af16b8..69525586300 100644 --- a/test/configCases/errors/exception-in-chunk-renderer/errors.js +++ b/test/configCases/errors/exception-in-chunk-renderer/errors.js @@ -1,4 +1 @@ -module.exports = [ - [/Test exception/], - [/Test exception/] -]; +module.exports = [[/Test exception/]]; diff --git a/test/configCases/errors/exception-in-chunk-renderer/webpack.config.js b/test/configCases/errors/exception-in-chunk-renderer/webpack.config.js index 6a98bf6ebc8..d769e2c6e59 100644 --- a/test/configCases/errors/exception-in-chunk-renderer/webpack.config.js +++ b/test/configCases/errors/exception-in-chunk-renderer/webpack.config.js @@ -1,4 +1,9 @@ +/** @typedef {import("../../../../").Compiler} Compiler */ + class ThrowsExceptionInRender { + /** + * @param {Compiler} compiler compiler + */ apply(compiler) { compiler.hooks.compilation.tap("ThrowsException", compilation => { compilation.mainTemplate.hooks.requireExtensions.tap( @@ -11,6 +16,7 @@ class ThrowsExceptionInRender { } } +/** @type {import("../../../../").Configuration} */ module.exports = { plugins: [new ThrowsExceptionInRender()] }; diff --git a/test/configCases/errors/generator-generate-error/async-wasm.wat b/test/configCases/errors/generator-generate-error/async-wasm.wat new file mode 100644 index 00000000000..477902e7f3c --- /dev/null +++ b/test/configCases/errors/generator-generate-error/async-wasm.wat @@ -0,0 +1,10 @@ +(module + (type $t0 (func (param i32 i32) (result i32))) + (type $t1 (func (result i32))) + (func $add (export "add") (type $t0) (param $p0 i32) (param $p1 i32) (result i32) + (i32.add + (get_local $p0) + (get_local $p1))) + (func $getNumber (export "getNumber") (type $t1) (result i32) + (i32.const 40))) + diff --git a/test/configCases/errors/generator-generate-error/errors.js b/test/configCases/errors/generator-generate-error/errors.js new file mode 100644 index 00000000000..5cc27fc1939 --- /dev/null +++ b/test/configCases/errors/generator-generate-error/errors.js @@ -0,0 +1,14 @@ +module.exports = [ + /javascript\/auto error message/, + /asset\/inline error message/, + /asset\/resource error message/, + /asset\/resource other error message/, + /asset\/resource in css error message/, + /asset\/source error message/, + /asset\/source in css error message/, + /css\/auto error message/, + /css error message/, + /json error message/, + /json other error message/, + /webassembly\/async error message/ +]; diff --git a/test/configCases/errors/generator-generate-error/file.json b/test/configCases/errors/generator-generate-error/file.json new file mode 100644 index 00000000000..d0ae716dbe4 --- /dev/null +++ b/test/configCases/errors/generator-generate-error/file.json @@ -0,0 +1,3 @@ +{ + "test": "test" +} diff --git a/test/configCases/errors/generator-generate-error/file.svg b/test/configCases/errors/generator-generate-error/file.svg new file mode 100644 index 00000000000..d7b7e40b4f8 --- /dev/null +++ b/test/configCases/errors/generator-generate-error/file.svg @@ -0,0 +1 @@ +icon-square-small diff --git a/test/configCases/errors/generator-generate-error/in-style-source.png b/test/configCases/errors/generator-generate-error/in-style-source.png new file mode 100644 index 00000000000..fb53b9dedd3 Binary files /dev/null and b/test/configCases/errors/generator-generate-error/in-style-source.png differ diff --git a/test/configCases/errors/generator-generate-error/in-style.png b/test/configCases/errors/generator-generate-error/in-style.png new file mode 100644 index 00000000000..fb53b9dedd3 Binary files /dev/null and b/test/configCases/errors/generator-generate-error/in-style.png differ diff --git a/test/configCases/errors/generator-generate-error/index.js b/test/configCases/errors/generator-generate-error/index.js new file mode 100644 index 00000000000..6b2ab4b1408 --- /dev/null +++ b/test/configCases/errors/generator-generate-error/index.js @@ -0,0 +1,118 @@ +it("should generate a custom error content", async () => { + expect(__STATS__.modules.filter(m => m.moduleType !== "runtime").length).toEqual(14); + expect(__STATS__.assets.length).toEqual(19); + expect(__STATS__.chunks.length).toEqual(12); + + let errored; + + let json; + + try { + json = await import("./file.json"); + } catch (error) { + errored = error; + } + + expect(errored.toString()).toMatch(/json error message/); + + let otherJson; + + try { + otherJson = await import("./other.json"); + } catch (error) { + errored = error; + } + + expect(errored.toString()).toMatch(/json other error message/); + + let source; + + try { + source = await import("./source.txt"); + } catch (error) { + errored = error; + } + + expect(errored.toString()).toMatch(/asset\/source error message/); + + let resource; + + try { + resource = await import("./file.svg"); + } catch (error) { + errored = error; + } + + expect(errored.toString()).toMatch(/asset\/resource error message/); + + let otherResource; + + try { + otherResource = await import("./other.svg"); + } catch (error) { + errored = error; + } + + expect(errored.toString()).toMatch(/asset\/resource other error message/); + + let inline; + + try { + inline = await import("./inline.txt"); + } catch (error) { + errored = error; + } + + expect(errored.toString()).toMatch(/asset\/inline error message/); + + let style; + + try { + style = await import("./style.css"); + } catch (error) { + errored = error; + } + + expect(errored.toString()).toMatch(/css error message/); + + let js; + + try { + js = await import("./module.js"); + } catch (error) { + errored = error; + } + + expect(errored.toString()).toMatch(/javascript\/auto error message/); + + let otherStyle; + errored = undefined; + + try { + otherStyle = await import("./style-other.css"); + } catch (error) { + errored = error; + } + + expect(errored).toBeUndefined(); + + let cssModules; + + try { + cssModules = await import("./style.modules.css"); + } catch (error) { + errored = error; + } + + expect(errored.toString()).toMatch(/css\/auto error message/); + + let asyncWasm; + + try { + asyncWasm = await import("./async-wasm.wat"); + } catch (error) { + errored = error; + } + + expect(errored.toString()).toMatch(/webassembly\/async error message/); +}); diff --git a/test/configCases/errors/generator-generate-error/infrastructure-log.js b/test/configCases/errors/generator-generate-error/infrastructure-log.js new file mode 100644 index 00000000000..10532afb6b2 --- /dev/null +++ b/test/configCases/errors/generator-generate-error/infrastructure-log.js @@ -0,0 +1,7 @@ +module.exports = options => { + if (options.cache && options.cache.type === "filesystem") { + return [/Pack got invalid because of write to/]; + } + + return []; +}; diff --git a/test/configCases/errors/generator-generate-error/inline.txt b/test/configCases/errors/generator-generate-error/inline.txt new file mode 100644 index 00000000000..aea48f26d4b --- /dev/null +++ b/test/configCases/errors/generator-generate-error/inline.txt @@ -0,0 +1 @@ +inline diff --git a/test/configCases/errors/generator-generate-error/loader.js b/test/configCases/errors/generator-generate-error/loader.js new file mode 100644 index 00000000000..fb9baec030e --- /dev/null +++ b/test/configCases/errors/generator-generate-error/loader.js @@ -0,0 +1,7 @@ +/** @type {import("../../../../").LoaderDefinition<{ message: string }>} */ +module.exports = function() { + const callback = this.async(); + const options = this.getOptions(); + + callback(new Error(options.message || 'Message')); +}; diff --git a/test/configCases/errors/generator-generate-error/module.js b/test/configCases/errors/generator-generate-error/module.js new file mode 100644 index 00000000000..58c57157d36 --- /dev/null +++ b/test/configCases/errors/generator-generate-error/module.js @@ -0,0 +1 @@ +export default "test"; diff --git a/test/configCases/errors/generator-generate-error/other.json b/test/configCases/errors/generator-generate-error/other.json new file mode 100644 index 00000000000..d0ae716dbe4 --- /dev/null +++ b/test/configCases/errors/generator-generate-error/other.json @@ -0,0 +1,3 @@ +{ + "test": "test" +} diff --git a/test/configCases/errors/generator-generate-error/other.svg b/test/configCases/errors/generator-generate-error/other.svg new file mode 100644 index 00000000000..d7b7e40b4f8 --- /dev/null +++ b/test/configCases/errors/generator-generate-error/other.svg @@ -0,0 +1 @@ +icon-square-small diff --git a/test/configCases/errors/generator-generate-error/source.txt b/test/configCases/errors/generator-generate-error/source.txt new file mode 100644 index 00000000000..9daeafb9864 --- /dev/null +++ b/test/configCases/errors/generator-generate-error/source.txt @@ -0,0 +1 @@ +test diff --git a/test/configCases/errors/generator-generate-error/style-other.css b/test/configCases/errors/generator-generate-error/style-other.css new file mode 100644 index 00000000000..b1617bcfceb --- /dev/null +++ b/test/configCases/errors/generator-generate-error/style-other.css @@ -0,0 +1,4 @@ +div { + background: url("./in-style.png"); + background: url("./in-style-source.png"); +} diff --git a/test/configCases/errors/generator-generate-error/style.css b/test/configCases/errors/generator-generate-error/style.css new file mode 100644 index 00000000000..195b6bcf6d2 --- /dev/null +++ b/test/configCases/errors/generator-generate-error/style.css @@ -0,0 +1,3 @@ +a { + color: red; +} diff --git a/test/configCases/errors/generator-generate-error/style.modules.css b/test/configCases/errors/generator-generate-error/style.modules.css new file mode 100644 index 00000000000..626e93720d0 --- /dev/null +++ b/test/configCases/errors/generator-generate-error/style.modules.css @@ -0,0 +1,3 @@ +.class { + color: red; +} diff --git a/test/configCases/errors/generator-generate-error/sync-wasm.wat b/test/configCases/errors/generator-generate-error/sync-wasm.wat new file mode 100644 index 00000000000..477902e7f3c --- /dev/null +++ b/test/configCases/errors/generator-generate-error/sync-wasm.wat @@ -0,0 +1,10 @@ +(module + (type $t0 (func (param i32 i32) (result i32))) + (type $t1 (func (result i32))) + (func $add (export "add") (type $t0) (param $p0 i32) (param $p1 i32) (result i32) + (i32.add + (get_local $p0) + (get_local $p1))) + (func $getNumber (export "getNumber") (type $t1) (result i32) + (i32.const 40))) + diff --git a/test/configCases/errors/generator-generate-error/test.config.js b/test/configCases/errors/generator-generate-error/test.config.js new file mode 100644 index 00000000000..13e7530a887 --- /dev/null +++ b/test/configCases/errors/generator-generate-error/test.config.js @@ -0,0 +1,9 @@ +const findOutputFiles = require("../../../helpers/findOutputFiles"); + +module.exports = { + findBundle(i, options) { + const files = findOutputFiles(options, new RegExp(/\.js$/)); + + return files.sort((a, b) => (a.startsWith("main") ? 1 : 0)); + } +}; diff --git a/test/configCases/errors/generator-generate-error/test.filter.js b/test/configCases/errors/generator-generate-error/test.filter.js new file mode 100644 index 00000000000..cb37e21905f --- /dev/null +++ b/test/configCases/errors/generator-generate-error/test.filter.js @@ -0,0 +1,5 @@ +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); + +module.exports = function (config) { + return supportsWebAssembly(); +}; diff --git a/test/configCases/errors/generator-generate-error/webpack.config.js b/test/configCases/errors/generator-generate-error/webpack.config.js new file mode 100644 index 00000000000..ac63555dccb --- /dev/null +++ b/test/configCases/errors/generator-generate-error/webpack.config.js @@ -0,0 +1,143 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + output: { + filename: "[name].[chunkhash:8].[contenthash:8].js", + chunkFilename: "[name].[chunkhash:8].[contenthash:8].js" + }, + optimization: { + chunkIds: "named", + emitOnErrors: true + }, + experiments: { + css: true, + asyncWebAssembly: true + }, + module: { + rules: [ + { + type: "asset/source", + test: /source\.txt$/, + use: { + loader: "./loader.js", + options: { + message: "asset/source error message" + } + } + }, + { + type: "asset/resource", + test: /file\.svg$/, + use: { + loader: "./loader.js", + options: { + message: "asset/resource error message" + } + } + }, + { + type: "asset/resource", + test: /other\.svg$/, + use: { + loader: "./loader.js", + options: { + message: "asset/resource other error message" + } + } + }, + { + type: "asset/inline", + test: /inline\.txt$/, + use: { + loader: "./loader.js", + options: { + message: "asset/inline error message" + } + } + }, + { + type: "css", + test: /style\.css$/, + use: { + loader: "./loader.js", + options: { + message: "css error message" + } + } + }, + { + type: "asset/resource", + test: /in-style\.png$/, + use: { + loader: "./loader.js", + options: { + message: "asset/resource in css error message" + } + } + }, + { + type: "asset/source", + test: /in-style-source\.png$/, + use: { + loader: "./loader.js", + options: { + message: "asset/source in css error message" + } + } + }, + { + type: "javascript/auto", + test: /module\.js$/, + use: { + loader: "./loader.js", + options: { + message: "javascript/auto error message" + } + } + }, + { + type: "json", + test: /file\.json$/, + use: { + loader: "./loader.js", + options: { + message: "json error message" + } + } + }, + { + type: "json", + test: /other\.json$/, + use: { + loader: "./loader.js", + options: { + message: "json other error message" + } + } + }, + { + type: "css/auto", + generator: { + exportsOnly: true + }, + test: /style\.modules\.css$/, + use: { + loader: "./loader.js", + options: { + message: "css/auto error message" + } + } + }, + { + type: "webassembly/async", + test: /async-wasm\.wat$/, + use: { + loader: "./loader.js", + options: { + message: "webassembly/async error message" + } + } + } + ] + } +}; diff --git a/test/configCases/errors/import-missing/errors.js b/test/configCases/errors/import-missing/errors.js index d4f7cb2e8cd..d85236a2c74 100644 --- a/test/configCases/errors/import-missing/errors.js +++ b/test/configCases/errors/import-missing/errors.js @@ -1,3 +1 @@ -module.exports = [ - [/Module not found/] -]; +module.exports = [[/Module not found/]]; diff --git a/test/configCases/errors/import-missing/index.js b/test/configCases/errors/import-missing/index.js index 729804c4e4a..fa67170139e 100644 --- a/test/configCases/errors/import-missing/index.js +++ b/test/configCases/errors/import-missing/index.js @@ -1,16 +1,20 @@ +var never = false; + it("should not crash on missing requires", function() { - require.include("./a"); - require.include("./b"); - require.include("./c"); - require.include("./d"); - require.include("./e"); - require.include("./f"); - require.include("./h"); - require.include("./i"); - require.include("./j"); - require.include("./k"); - require.include("./l"); - require.include("./m"); - require.include("./n"); - require.include("./o"); + if (never) { + require("./a"); + require("./b"); + require("./c"); + require("./d"); + require("./e"); + require("./f"); + require("./h"); + require("./i"); + require("./j"); + require("./k"); + require("./l"); + require("./m"); + require("./n"); + require("./o"); + } }); diff --git a/test/configCases/errors/import-missing/webpack.config.js b/test/configCases/errors/import-missing/webpack.config.js index 51f1a5d59f8..61694bc0914 100644 --- a/test/configCases/errors/import-missing/webpack.config.js +++ b/test/configCases/errors/import-missing/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { bail: true }; diff --git a/test/configCases/errors/multi-entry-missing-module/index.js b/test/configCases/errors/multi-entry-missing-module/index.js index e4dec7f2285..b7603e051c5 100644 --- a/test/configCases/errors/multi-entry-missing-module/index.js +++ b/test/configCases/errors/multi-entry-missing-module/index.js @@ -1,9 +1,8 @@ -it("Should use WebpackMissingModule when module is missing with multiple entry setup", function() { - var fs = require("fs"); - var path = require("path"); - var source = fs.readFileSync(path.join(__dirname, "b.js"), "utf-8"); - expect(source).toMatch("!(function webpackMissingModule() { var e = new Error(\"Cannot find module './intentionally-missing-module.js'\"); e.code = 'MODULE_NOT_FOUND'; throw e; }());"); +it("should ignore missing modules as entries", function() { + // a.js and b.js should be evaluated correctly +}); +it("should use WebpackMissingModule when evaluating missing modules", function() { expect(function() { require("./intentionally-missing-module"); }).toThrowError("Cannot find module './intentionally-missing-module'"); diff --git a/test/configCases/errors/multi-entry-missing-module/test.config.js b/test/configCases/errors/multi-entry-missing-module/test.config.js new file mode 100644 index 00000000000..700b7acb674 --- /dev/null +++ b/test/configCases/errors/multi-entry-missing-module/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./a.js", "./b.js", "./bundle0.js"]; + } +}; diff --git a/test/configCases/errors/multi-entry-missing-module/webpack.config.js b/test/configCases/errors/multi-entry-missing-module/webpack.config.js index 7060c77c58a..9799f5c71a8 100644 --- a/test/configCases/errors/multi-entry-missing-module/webpack.config.js +++ b/test/configCases/errors/multi-entry-missing-module/webpack.config.js @@ -1,6 +1,8 @@ -const IgnorePlugin = require("../../../../lib/IgnorePlugin"); +const IgnorePlugin = require("../../../../").IgnorePlugin; +/** @type {import("../../../../").Configuration} */ module.exports = { entry: { + a: "./intentionally-missing-module.js", b: ["./intentionally-missing-module.js"], bundle0: ["./index"] }, @@ -8,9 +10,8 @@ module.exports = { filename: "[name].js" }, plugins: [ - new IgnorePlugin(/intentionally-missing-module/) - ], - node: { - __dirname: false - } + new IgnorePlugin({ + resourceRegExp: new RegExp(/intentionally-missing-module/) + }) + ] }; diff --git a/test/configCases/errors/self-reexport/errors.js b/test/configCases/errors/self-reexport/errors.js deleted file mode 100644 index 3d8a2be43ec..00000000000 --- a/test/configCases/errors/self-reexport/errors.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = [ - [/Circular reexports "\.\/a.js"\.something -\(circular\)-> "\.\/a.js"\.something/], - [/Circular reexports "\.\/b.js"\.other --> "\.\/b.js"\.something -\(circular\)-> "\.\/b.js"\.other/], - [/Circular reexports "\.\/c2.js"\.something --> "\.\/c1.js"\.something -\(circular\)-> "\.\/c2.js"\.something/] -]; diff --git a/test/configCases/errors/self-reexport/webpack.config.js b/test/configCases/errors/self-reexport/webpack.config.js index b913c78abb1..dffc81bba10 100644 --- a/test/configCases/errors/self-reexport/webpack.config.js +++ b/test/configCases/errors/self-reexport/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { mode: "production" }; diff --git a/test/configCases/externals/async-externals/index.js b/test/configCases/externals/async-externals/index.js new file mode 100644 index 00000000000..38edcffba58 --- /dev/null +++ b/test/configCases/externals/async-externals/index.js @@ -0,0 +1,43 @@ +import value from "promise-external"; +import value2 from "module-promise-external"; +import value3 from "object-promise-external"; +import request from "import-external"; +import request2 from "module-import-external"; +import "./module.mjs"; + +it("should allow async externals", () => { + expect(value).toBe(42); + expect(value2).toBe(42); + expect(value3).toEqual({ default: 42, named: true }); + expect(request).toBe("/hello/world.js"); + expect(request2).toBe("/hello/world.js"); +}); + +it("should allow to catch errors of async externals", () => { + return expect(() => import("failing-promise-external")).rejects.toEqual( + expect.objectContaining({ + message: "external reject" + }) + ); +}); + +it("should allow dynamic import promise externals", () => { + return import("promise-external").then(module => { + expect(module).toMatchObject({ default: 42 }); + }); +}); + +it("should allow dynamic import promise externals that are modules", () => { + return import("module-promise-external").then(module => { + expect(module).toMatchObject({ default: 42, named: true }); + }); +}); + +it("should allow dynamic import promise externals that are objects", () => { + return import("object-promise-external").then(module => { + expect(module).toMatchObject({ + default: { default: 42, named: true }, + named: true + }); + }); +}); diff --git a/test/configCases/externals/async-externals/module.mjs b/test/configCases/externals/async-externals/module.mjs new file mode 100644 index 00000000000..bd66572ccad --- /dev/null +++ b/test/configCases/externals/async-externals/module.mjs @@ -0,0 +1,41 @@ +import value from "promise-external"; +import value2 from "module-promise-external"; +import value3 from "object-promise-external"; +import request from "import-external"; + +it("should allow async externals (in strict esm)", () => { + expect(value).toBe(42); + expect(value2).toEqual({ __esModule: true, default: 42, named: true }); + expect(value3).toEqual({ default: 42, named: true }); + expect(request).toBe("/hello/world.js"); +}); + +it("should allow to catch errors of async externals (in strict esm)", () => { + return expect(() => import("failing-promise-external")).rejects.toEqual( + expect.objectContaining({ + message: "external reject" + }) + ); +}); + +it("should allow dynamic import promise externals (in strict esm)", () => { + return import("promise-external").then(module => { + expect(module).toMatchObject({ default: 42 }); + }); +}); + +it("should allow dynamic import promise externals that are modules (in strict esm)", () => { + return import("module-promise-external").then(module => { + expect(module).toMatchObject({ + default: { __esModule: true, default: 42, named: true } + }); + }); +}); + +it("should allow dynamic import promise externals that are objects (in strict esm)", () => { + return import("object-promise-external").then(module => { + expect(module).toMatchObject({ + default: { default: 42, named: true } + }); + }); +}); diff --git a/test/configCases/externals/async-externals/webpack.config.js b/test/configCases/externals/async-externals/webpack.config.js new file mode 100644 index 00000000000..68ccc42a6e2 --- /dev/null +++ b/test/configCases/externals/async-externals/webpack.config.js @@ -0,0 +1,19 @@ +module.exports = { + target: ["web", "es2020"], + output: { + libraryTarget: "commonjs-module", + importFunctionName: "((name) => Promise.resolve({ request: name }))" + }, + externals: { + "promise-external": + "promise new Promise(resolve => setTimeout(() => resolve(42), 100))", + "module-promise-external": + "promise new Promise(resolve => setTimeout(() => resolve({ __esModule: true, default: 42, named: true }), 100))", + "object-promise-external": + "promise new Promise(resolve => setTimeout(() => resolve({ default: 42, named: true }), 100))", + "failing-promise-external": + "promise new Promise((resolve, reject) => setTimeout(() => reject(new Error('external reject')), 100))", + "import-external": ["import /hello/world.js", "request"], + "module-import-external": ["module-import /hello/world.js", "request"] + } +}; diff --git a/test/configCases/externals/concatenated-module/index.js b/test/configCases/externals/concatenated-module/index.js new file mode 100644 index 00000000000..57a7fcb129c --- /dev/null +++ b/test/configCases/externals/concatenated-module/index.js @@ -0,0 +1,15 @@ +import fs1 from "fs"; +import fs2 from "module-fs"; +import fsPromises1 from "fs-promises"; +import fsPromises2 from "module-fs-promises"; +import path1 from "path"; +import path2 from "module-path"; +import url1 from "url"; +import url2 from "module-import-url"; + +it("should be possible to import multiple module externals", () => { + expect(fs2).toBe(fs1); + expect(path2).toBe(path1); + expect(fsPromises2).toBe(fsPromises1); + expect(url1).toBe(url2); +}); diff --git a/test/configCases/externals/concatenated-module/test.filter.js b/test/configCases/externals/concatenated-module/test.filter.js new file mode 100644 index 00000000000..4afe691c9d7 --- /dev/null +++ b/test/configCases/externals/concatenated-module/test.filter.js @@ -0,0 +1,2 @@ +module.exports = () => + !process.version.startsWith("v10.") && !process.version.startsWith("v12."); diff --git a/test/configCases/externals/concatenated-module/webpack.config.js b/test/configCases/externals/concatenated-module/webpack.config.js new file mode 100644 index 00000000000..302e048f3d9 --- /dev/null +++ b/test/configCases/externals/concatenated-module/webpack.config.js @@ -0,0 +1,27 @@ +/** @type {(variant: boolean) => import("../../../../").Configuration} */ +const config = o => ({ + externals: { + "module-fs": o ? "module fs" : "module fs/promises", + fs: o ? "node-commonjs fs" : "node-commonjs fs/promises", + "module-fs-promises": o ? ["module fs", "promises"] : "module fs/promises", + "fs-promises": o + ? ["node-commonjs fs", "promises"] + : "node-commonjs fs/promises", + "module-path": "module path", + path: "node-commonjs path", + "module-import-url": "module-import url", + url: "node-commonjs url" + }, + optimization: { + concatenateModules: true, + usedExports: true, + providedExports: true, + mangleExports: true + }, + target: "node14", + experiments: { + outputModule: true + } +}); + +module.exports = [config(false), config(true)]; diff --git a/test/configCases/externals/concatenated/index.js b/test/configCases/externals/concatenated/index.js new file mode 100644 index 00000000000..11c916233dc --- /dev/null +++ b/test/configCases/externals/concatenated/index.js @@ -0,0 +1,25 @@ +import externalValue, { named as externalValueNamed } from "externalValue"; + +it("should harmony import a external value", function () { + expect(externalValue).toBe("abc"); + expect(externalValueNamed).toBe(undefined); +}); + +import externalObject, { named as externalObjectNamed } from "externalObject"; + +it("should harmony import a external value", function () { + expect(externalObject).toMatchObject({ + named: "named", + default: "default" + }); + expect(externalObjectNamed).toBe("named"); +}); + +import externalEsModule, { + named as externalEsModuleNamed +} from "externalEsModule"; + +it("should harmony import a external value", function () { + expect(externalEsModule).toBe("default"); + expect(externalEsModuleNamed).toBe("named"); +}); diff --git a/test/configCases/externals/concatenated/webpack.config.js b/test/configCases/externals/concatenated/webpack.config.js new file mode 100644 index 00000000000..281919c8caa --- /dev/null +++ b/test/configCases/externals/concatenated/webpack.config.js @@ -0,0 +1,15 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + externals: { + externalValue: "var 'abc'", + externalObject: "var { default: 'default', named: 'named' }", + externalEsModule: + "var { __esModule: true, default: 'default', named: 'named' }" + }, + optimization: { + concatenateModules: true, + usedExports: true, + providedExports: true, + mangleExports: true + } +}; diff --git a/test/configCases/externals/externals-array/webpack.config.js b/test/configCases/externals/externals-array/webpack.config.js index af6b62d059c..3c4de33bf9e 100644 --- a/test/configCases/externals/externals-array/webpack.config.js +++ b/test/configCases/externals/externals-array/webpack.config.js @@ -1,4 +1,5 @@ const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration[]} */ module.exports = [ { output: { diff --git a/test/configCases/externals/externals-in-chunk/webpack.config.js b/test/configCases/externals/externals-in-chunk/webpack.config.js index ee8d99ce3b5..f147c9f5b3a 100644 --- a/test/configCases/externals/externals-in-chunk/webpack.config.js +++ b/test/configCases/externals/externals-in-chunk/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { externals: { external: "1+2", diff --git a/test/configCases/externals/externals-in-commons-chunk/test.config.js b/test/configCases/externals/externals-in-commons-chunk/test.config.js index 51faf2424ad..07adc696f51 100644 --- a/test/configCases/externals/externals-in-commons-chunk/test.config.js +++ b/test/configCases/externals/externals-in-commons-chunk/test.config.js @@ -1,8 +1,5 @@ module.exports = { - findBundle: function(i, options) { - return [ - "./common.js", - "./main.js" - ] + findBundle(i, options) { + return ["./common.js", "./main.js"]; } }; diff --git a/test/configCases/externals/externals-in-commons-chunk/webpack.config.js b/test/configCases/externals/externals-in-commons-chunk/webpack.config.js index 6cb5b9d6a6b..85305d390af 100644 --- a/test/configCases/externals/externals-in-commons-chunk/webpack.config.js +++ b/test/configCases/externals/externals-in-commons-chunk/webpack.config.js @@ -1,10 +1,11 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { entry: { main: "./index", other: "./other" }, externals: { - fs: "commonjs fs", + fs: "node-commonjs fs", external: "1+2", external2: "3+4", external3: "5+6" diff --git a/test/configCases/externals/externals-system-custom/index.js b/test/configCases/externals/externals-system-custom/index.js new file mode 100644 index 00000000000..f9d4aa09a1c --- /dev/null +++ b/test/configCases/externals/externals-system-custom/index.js @@ -0,0 +1,7 @@ +// This test verifies that the System.register context is made available to webpack bundles + +it("should correctly handle externals of different type", function() { + expect(require("rootExt")).toEqual("works"); + expect(require("varExt")).toEqual("works"); + expect(require("windowExt")).toEqual("works"); +}); diff --git a/test/configCases/externals/externals-system-custom/test.config.js b/test/configCases/externals/externals-system-custom/test.config.js new file mode 100644 index 00000000000..bbe84a3313d --- /dev/null +++ b/test/configCases/externals/externals-system-custom/test.config.js @@ -0,0 +1,17 @@ +const System = require("../../../helpers/fakeSystem"); + +module.exports = { + target: "web", + beforeExecute: () => { + System.init(); + }, + moduleScope(scope) { + scope.window.windowExt = "works"; + scope.rootExt = "works"; + scope.varExt = "works"; + scope.System = System; + }, + afterExecute: () => { + System.execute("(anonym)"); + } +}; diff --git a/test/configCases/externals/externals-system-custom/webpack.config.js b/test/configCases/externals/externals-system-custom/webpack.config.js new file mode 100644 index 00000000000..16c4b3f9dad --- /dev/null +++ b/test/configCases/externals/externals-system-custom/webpack.config.js @@ -0,0 +1,16 @@ +/** @type {import("../../../../types").Configuration} */ +module.exports = { + output: { + libraryTarget: "system" + }, + target: "web", + node: { + __dirname: false, + __filename: false + }, + externals: { + rootExt: "root rootExt", + varExt: "var varExt", + windowExt: "window windowExt" + } +}; diff --git a/test/configCases/externals/externals-system/index.js b/test/configCases/externals/externals-system/index.js new file mode 100644 index 00000000000..cddcb2700e8 --- /dev/null +++ b/test/configCases/externals/externals-system/index.js @@ -0,0 +1,21 @@ +import external3Default, { namedThing } from "external3"; +import "external4"; + +/* This test verifies that webpack externals are properly indicated as dependencies to System. + * Also that when System provides the external variables to webpack that the variables get plumbed + * through correctly and are usable by the webpack bundle. + */ +it("should get an external from System", function () { + const external1 = require("external1"); + expect(external1.default).toBe("the external1 value"); + + const external2 = require("external2"); + expect(external2.default).toBe("the external2 value"); + + expect(external3Default).toBe("the external3 default export"); + expect(namedThing).toBe("the external3 named export"); + + const external5 = require("./reexport-external.js"); + expect(external5.default).toBe("the external5 default export"); + expect(external5.namedThing).toBe("the external5 named export"); +}); diff --git a/test/configCases/externals/externals-system/reexport-external.js b/test/configCases/externals/externals-system/reexport-external.js new file mode 100644 index 00000000000..07c36966c58 --- /dev/null +++ b/test/configCases/externals/externals-system/reexport-external.js @@ -0,0 +1,2 @@ +export * from "external5"; +export { default } from "external5"; diff --git a/test/configCases/externals/externals-system/test.config.js b/test/configCases/externals/externals-system/test.config.js new file mode 100644 index 00000000000..5520b1daefe --- /dev/null +++ b/test/configCases/externals/externals-system/test.config.js @@ -0,0 +1,32 @@ +const System = require("../../../helpers/fakeSystem"); + +module.exports = { + beforeExecute: () => { + System.init({ + external1: { + default: "the external1 value" + }, + external2: { + default: "the external2 value" + }, + external3: { + default: "the external3 default export", + namedThing: "the external3 named export" + }, + external4: { + default: "the external4 default export", + namedThing: "the external4 named export" + }, + external5: { + default: "the external5 default export", + namedThing: "the external5 named export" + } + }); + }, + moduleScope(scope) { + scope.System = System; + }, + afterExecute: () => { + System.execute("(anonym)"); + } +}; diff --git a/test/configCases/externals/externals-system/webpack.config.js b/test/configCases/externals/externals-system/webpack.config.js new file mode 100644 index 00000000000..7d3ab88f06e --- /dev/null +++ b/test/configCases/externals/externals-system/webpack.config.js @@ -0,0 +1,13 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + libraryTarget: "system" + }, + externals: { + external1: "external1", + external2: "external2", + external3: "external3", + external4: "external4", + external5: "external5" + } +}; diff --git a/test/configCases/externals/global/index.js b/test/configCases/externals/global/index.js index 821f2376eb2..b8a5d8b0009 100644 --- a/test/configCases/externals/global/index.js +++ b/test/configCases/externals/global/index.js @@ -5,7 +5,7 @@ afterEach(done => { it("should move externals in chunks into entry chunk", function() { global.EXTERNAL_TEST_GLOBAL = 42; - // eslint-disable-next-line node/no-missing-require + // eslint-disable-next-line n/no-missing-require const result = require("external"); expect(result).toBe(42); }); diff --git a/test/configCases/externals/global/webpack.config.js b/test/configCases/externals/global/webpack.config.js index 5e9889bf360..0396bdef95a 100644 --- a/test/configCases/externals/global/webpack.config.js +++ b/test/configCases/externals/global/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { externals: { external: "global EXTERNAL_TEST_GLOBAL" diff --git a/test/configCases/externals/harmony/webpack.config.js b/test/configCases/externals/harmony/webpack.config.js index 77dccfd43c8..471b2a5ce23 100644 --- a/test/configCases/externals/harmony/webpack.config.js +++ b/test/configCases/externals/harmony/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { externals: { external: "var 'abc'" diff --git a/test/configCases/externals/import-assertion/dynamic-package-str.json b/test/configCases/externals/import-assertion/dynamic-package-str.json new file mode 100644 index 00000000000..96c392e16d3 --- /dev/null +++ b/test/configCases/externals/import-assertion/dynamic-package-str.json @@ -0,0 +1,3 @@ +{ + "foo": "dynamic-str" +} diff --git a/test/configCases/externals/import-assertion/dynamic-package.json b/test/configCases/externals/import-assertion/dynamic-package.json new file mode 100644 index 00000000000..9c17f1e2263 --- /dev/null +++ b/test/configCases/externals/import-assertion/dynamic-package.json @@ -0,0 +1,3 @@ +{ + "foo": "dynamic" +} diff --git a/test/configCases/externals/import-assertion/eager.json b/test/configCases/externals/import-assertion/eager.json new file mode 100644 index 00000000000..c5c5865c41c --- /dev/null +++ b/test/configCases/externals/import-assertion/eager.json @@ -0,0 +1,3 @@ +{ + "foo": "eager" +} diff --git a/test/configCases/externals/import-assertion/index.js b/test/configCases/externals/import-assertion/index.js new file mode 100644 index 00000000000..623fb7a96f2 --- /dev/null +++ b/test/configCases/externals/import-assertion/index.js @@ -0,0 +1,55 @@ +import * as staticPkg from "./static-package.json" assert { type: "json" }; +import * as staticPkgStr from "./static-package-str.json" assert { "type": "json" }; +import * as staticPkgModuleImport from "./static-package-module-import.json" assert { type: "json" }; + +it("should allow async externals", async () => { + expect(staticPkg.default.foo).toBe("static"); + expect(staticPkgStr.default.foo).toBe("static-str"); + expect(staticPkgModuleImport.default.foo).toBe("static"); + + const dynamicPkg = await import("./dynamic-package.json", { + assert: { type: "json" } + }) + + expect(dynamicPkg.default.foo).toBe("dynamic"); + + const dynamicPkgStr = await import("./dynamic-package-str.json", { + "assert": { "type": "json" } + }) + + expect(dynamicPkgStr.default.foo).toBe("dynamic-str"); + + const eagerPkg = await import(/* webpackMode: "eager" */ "./eager.json", { + assert: { type: "json" } + }); + + expect(eagerPkg.default.foo).toBe("eager"); + + await import("./weak.json", { + assert: { type: "json" } + }); + const weakPkg = await import(/* webpackMode: "weak" */ "./weak.json", { + assert: { type: "json" } + }); + + expect(weakPkg.default.foo).toBe("weak"); + + const pkg = "pkg.json"; + const nested = await import(`./nested/${pkg}`, { + assert: { type: "json" } + }); + + expect(nested.default.foo).toBe("context-dependency"); + + const reExportPkg = await import("./re-export.js"); + + expect(reExportPkg.foo).toBe("re-export"); + + const dynamicPkgModuleImport = await import("./dynamic-package-module-import.json", { + assert: { type: "json" } + }) + + expect(dynamicPkgModuleImport.default.foo).toBe("dynamic"); +}); + +export * from "./re-export-directly.json" assert { type: "json" } diff --git a/test/configCases/externals/import-assertion/nested/pkg.json b/test/configCases/externals/import-assertion/nested/pkg.json new file mode 100644 index 00000000000..592f678a321 --- /dev/null +++ b/test/configCases/externals/import-assertion/nested/pkg.json @@ -0,0 +1,3 @@ +{ + "foo": "context-dependency" +} diff --git a/test/configCases/externals/import-assertion/re-export-directly.json b/test/configCases/externals/import-assertion/re-export-directly.json new file mode 100644 index 00000000000..726743c2781 --- /dev/null +++ b/test/configCases/externals/import-assertion/re-export-directly.json @@ -0,0 +1,3 @@ +{ + "foo": "re-export" +} diff --git a/test/configCases/externals/import-assertion/re-export.js b/test/configCases/externals/import-assertion/re-export.js new file mode 100644 index 00000000000..1983630d4d4 --- /dev/null +++ b/test/configCases/externals/import-assertion/re-export.js @@ -0,0 +1 @@ +export * from "./re-export.json" assert { type: "json" }; diff --git a/test/configCases/externals/import-assertion/re-export.json b/test/configCases/externals/import-assertion/re-export.json new file mode 100644 index 00000000000..726743c2781 --- /dev/null +++ b/test/configCases/externals/import-assertion/re-export.json @@ -0,0 +1,3 @@ +{ + "foo": "re-export" +} diff --git a/test/configCases/externals/import-assertion/static-package-str.json b/test/configCases/externals/import-assertion/static-package-str.json new file mode 100644 index 00000000000..2fdfedc73c1 --- /dev/null +++ b/test/configCases/externals/import-assertion/static-package-str.json @@ -0,0 +1,3 @@ +{ + "foo": "static-str" +} diff --git a/test/configCases/externals/import-assertion/static-package.json b/test/configCases/externals/import-assertion/static-package.json new file mode 100644 index 00000000000..5a8609f8f77 --- /dev/null +++ b/test/configCases/externals/import-assertion/static-package.json @@ -0,0 +1,3 @@ +{ + "foo": "static" +} diff --git a/test/configCases/externals/import-assertion/test.filter.js b/test/configCases/externals/import-assertion/test.filter.js new file mode 100644 index 00000000000..50efa4454ac --- /dev/null +++ b/test/configCases/externals/import-assertion/test.filter.js @@ -0,0 +1 @@ +module.exports = () => /^v(1[6-9]|21)/.test(process.version); diff --git a/test/configCases/externals/import-assertion/weak.json b/test/configCases/externals/import-assertion/weak.json new file mode 100644 index 00000000000..a2bf7635487 --- /dev/null +++ b/test/configCases/externals/import-assertion/weak.json @@ -0,0 +1,3 @@ +{ + "foo": "weak" +} diff --git a/test/configCases/externals/import-assertion/webpack.config.js b/test/configCases/externals/import-assertion/webpack.config.js new file mode 100644 index 00000000000..7ac26d2244e --- /dev/null +++ b/test/configCases/externals/import-assertion/webpack.config.js @@ -0,0 +1,69 @@ +const path = require("path"); +const fs = require("fs"); +const { + Compilation, + sources: { RawSource } +} = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + library: { + type: "module" + } + }, + target: ["web", "es2020"], + experiments: { + outputModule: true + }, + plugins: [ + { + apply(compiler) { + compiler.hooks.compilation.tap("html-plugin", compilation => { + compilation.hooks.processAssets.tap( + { + name: "copy-plugin", + stage: Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL + }, + () => { + for (const filename of [ + "static-package.json", + "static-package-str.json", + "dynamic-package.json", + "dynamic-package-str.json", + "eager.json", + "weak.json", + "./nested/pkg.json", + "re-export.json", + "re-export-directly.json" + ]) { + const resolvedFilename = path.resolve(__dirname, filename); + const content = fs.readFileSync(resolvedFilename); + compilation.emitAsset( + filename.replace(/\.\/nested\//, ""), + new RawSource(content) + ); + } + } + ); + }); + } + } + ], + externals: { + "./static-package.json": "module ./static-package.json", + "./static-package-str.json": "module ./static-package-str.json", + "./dynamic-package.json": "import ./dynamic-package.json", + "./dynamic-package-str.json": "import ./dynamic-package-str.json", + "./eager.json": "import ./eager.json", + "./weak.json": "import ./weak.json", + "./pkg.json": "import ./pkg.json", + "./pkg": "import ./pkg.json", + "./re-export.json": "module ./re-export.json", + "./re-export-directly.json": "module ./re-export-directly.json", + "./static-package-module-import.json": + "module-import ./static-package.json", + "./dynamic-package-module-import.json": + "module-import ./dynamic-package.json" + } +}; diff --git a/test/configCases/externals/import-attributes/dynamic-package-str.json b/test/configCases/externals/import-attributes/dynamic-package-str.json new file mode 100644 index 00000000000..96c392e16d3 --- /dev/null +++ b/test/configCases/externals/import-attributes/dynamic-package-str.json @@ -0,0 +1,3 @@ +{ + "foo": "dynamic-str" +} diff --git a/test/configCases/externals/import-attributes/dynamic-package.json b/test/configCases/externals/import-attributes/dynamic-package.json new file mode 100644 index 00000000000..9c17f1e2263 --- /dev/null +++ b/test/configCases/externals/import-attributes/dynamic-package.json @@ -0,0 +1,3 @@ +{ + "foo": "dynamic" +} diff --git a/test/configCases/externals/import-attributes/eager.json b/test/configCases/externals/import-attributes/eager.json new file mode 100644 index 00000000000..c5c5865c41c --- /dev/null +++ b/test/configCases/externals/import-attributes/eager.json @@ -0,0 +1,3 @@ +{ + "foo": "eager" +} diff --git a/test/configCases/externals/import-attributes/index.js b/test/configCases/externals/import-attributes/index.js new file mode 100644 index 00000000000..6b83a8b2a52 --- /dev/null +++ b/test/configCases/externals/import-attributes/index.js @@ -0,0 +1,55 @@ +import * as staticPkg from "./static-package.json" with { type: "json" }; +import * as staticPkgStr from "./static-package-str.json" with { "type": "json" }; +import * as staticPkgModuleImport from "./static-package-module-import.json" with { "type": "json" }; + +it("should allow async externals", async () => { + expect(staticPkg.default.foo).toBe("static"); + expect(staticPkgStr.default.foo).toBe("static-str"); + expect(staticPkgModuleImport.default.foo).toBe("static"); + + const dynamicPkg = await import("./dynamic-package.json", { + with: { type: "json" } + }) + + expect(dynamicPkg.default.foo).toBe("dynamic"); + + const dynamicPkgStr = await import("./dynamic-package-str.json", { + "with": { "type": "json" } + }) + + expect(dynamicPkgStr.default.foo).toBe("dynamic-str"); + + const eagerPkg = await import(/* webpackMode: "eager" */ "./eager.json", { + with: { type: "json" } + }); + + expect(eagerPkg.default.foo).toBe("eager"); + + await import("./weak.json", { + with: { type: "json" } + }); + const weakPkg = await import(/* webpackMode: "weak" */ "./weak.json", { + with: { type: "json" } + }); + + expect(weakPkg.default.foo).toBe("weak"); + + const pkg = "pkg.json"; + const nested = await import(`./nested/${pkg}`, { + with: { type: "json" } + }); + + expect(nested.default.foo).toBe("context-dependency"); + + const reExportPkg = await import("./re-export.js"); + + expect(reExportPkg.foo).toBe("re-export"); + + const dynamicPkgModuleImport = await import("./dynamic-package-module-import.json", { + with: { type: "json" } + }) + + expect(dynamicPkgModuleImport.default.foo).toBe("dynamic"); +}); + +export * from "./re-export-directly.json" with { type: "json" } diff --git a/test/configCases/externals/import-attributes/nested/pkg.json b/test/configCases/externals/import-attributes/nested/pkg.json new file mode 100644 index 00000000000..592f678a321 --- /dev/null +++ b/test/configCases/externals/import-attributes/nested/pkg.json @@ -0,0 +1,3 @@ +{ + "foo": "context-dependency" +} diff --git a/test/configCases/externals/import-attributes/re-export-directly.json b/test/configCases/externals/import-attributes/re-export-directly.json new file mode 100644 index 00000000000..726743c2781 --- /dev/null +++ b/test/configCases/externals/import-attributes/re-export-directly.json @@ -0,0 +1,3 @@ +{ + "foo": "re-export" +} diff --git a/test/configCases/externals/import-attributes/re-export.js b/test/configCases/externals/import-attributes/re-export.js new file mode 100644 index 00000000000..4d59479a185 --- /dev/null +++ b/test/configCases/externals/import-attributes/re-export.js @@ -0,0 +1 @@ +export * from "./re-export.json" with { type: "json" }; diff --git a/test/configCases/externals/import-attributes/re-export.json b/test/configCases/externals/import-attributes/re-export.json new file mode 100644 index 00000000000..726743c2781 --- /dev/null +++ b/test/configCases/externals/import-attributes/re-export.json @@ -0,0 +1,3 @@ +{ + "foo": "re-export" +} diff --git a/test/configCases/externals/import-attributes/static-package-str.json b/test/configCases/externals/import-attributes/static-package-str.json new file mode 100644 index 00000000000..2fdfedc73c1 --- /dev/null +++ b/test/configCases/externals/import-attributes/static-package-str.json @@ -0,0 +1,3 @@ +{ + "foo": "static-str" +} diff --git a/test/configCases/externals/import-attributes/static-package.json b/test/configCases/externals/import-attributes/static-package.json new file mode 100644 index 00000000000..5a8609f8f77 --- /dev/null +++ b/test/configCases/externals/import-attributes/static-package.json @@ -0,0 +1,3 @@ +{ + "foo": "static" +} diff --git a/test/configCases/externals/import-attributes/test.filter.js b/test/configCases/externals/import-attributes/test.filter.js new file mode 100644 index 00000000000..2ce4d1c330e --- /dev/null +++ b/test/configCases/externals/import-attributes/test.filter.js @@ -0,0 +1 @@ +module.exports = () => /^v(2[2-9])/.test(process.version); diff --git a/test/configCases/externals/import-attributes/weak.json b/test/configCases/externals/import-attributes/weak.json new file mode 100644 index 00000000000..a2bf7635487 --- /dev/null +++ b/test/configCases/externals/import-attributes/weak.json @@ -0,0 +1,3 @@ +{ + "foo": "weak" +} diff --git a/test/configCases/externals/import-attributes/webpack.config.js b/test/configCases/externals/import-attributes/webpack.config.js new file mode 100644 index 00000000000..7ac26d2244e --- /dev/null +++ b/test/configCases/externals/import-attributes/webpack.config.js @@ -0,0 +1,69 @@ +const path = require("path"); +const fs = require("fs"); +const { + Compilation, + sources: { RawSource } +} = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + library: { + type: "module" + } + }, + target: ["web", "es2020"], + experiments: { + outputModule: true + }, + plugins: [ + { + apply(compiler) { + compiler.hooks.compilation.tap("html-plugin", compilation => { + compilation.hooks.processAssets.tap( + { + name: "copy-plugin", + stage: Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL + }, + () => { + for (const filename of [ + "static-package.json", + "static-package-str.json", + "dynamic-package.json", + "dynamic-package-str.json", + "eager.json", + "weak.json", + "./nested/pkg.json", + "re-export.json", + "re-export-directly.json" + ]) { + const resolvedFilename = path.resolve(__dirname, filename); + const content = fs.readFileSync(resolvedFilename); + compilation.emitAsset( + filename.replace(/\.\/nested\//, ""), + new RawSource(content) + ); + } + } + ); + }); + } + } + ], + externals: { + "./static-package.json": "module ./static-package.json", + "./static-package-str.json": "module ./static-package-str.json", + "./dynamic-package.json": "import ./dynamic-package.json", + "./dynamic-package-str.json": "import ./dynamic-package-str.json", + "./eager.json": "import ./eager.json", + "./weak.json": "import ./weak.json", + "./pkg.json": "import ./pkg.json", + "./pkg": "import ./pkg.json", + "./re-export.json": "module ./re-export.json", + "./re-export-directly.json": "module ./re-export-directly.json", + "./static-package-module-import.json": + "module-import ./static-package.json", + "./dynamic-package-module-import.json": + "module-import ./dynamic-package.json" + } +}; diff --git a/test/configCases/externals/module-import/a.js b/test/configCases/externals/module-import/a.js new file mode 100644 index 00000000000..d923fc87a03 --- /dev/null +++ b/test/configCases/externals/module-import/a.js @@ -0,0 +1,7 @@ +import external0 from "external0"; // module +const external1 = require("external1"); // module +const external2 = require("external2"); // node-commonjs +import external3_1 from "external3"; // module +const external3_2 = import("external3"); // import + +console.log(external0, external1, external3_1, external3_2); diff --git a/test/configCases/externals/module-import/index.js b/test/configCases/externals/module-import/index.js new file mode 100644 index 00000000000..af64c4613b0 --- /dev/null +++ b/test/configCases/externals/module-import/index.js @@ -0,0 +1,11 @@ +const fs = require("fs"); +const path = require("path"); + +it("module-import should correctly get fallback type", function() { + const content = fs.readFileSync(path.resolve(__dirname, "a.js"), "utf-8"); + expect(content).toContain(`import * as __WEBPACK_EXTERNAL_MODULE_external0__ from "external0"`); // module + expect(content).toContain(`import * as __WEBPACK_EXTERNAL_MODULE_external1__ from "external1"`); // module + expect(content).toContain(`module.exports = __WEBPACK_EXTERNAL_createRequire(import.meta.url)("external2")`); // node-commonjs + expect(content).toContain(`import * as __WEBPACK_EXTERNAL_MODULE_external3__ from "external3"`); // module + expect(content).toContain(`const external3_2 = Promise.resolve(/*! import() */).then`); // import +}); diff --git a/test/configCases/externals/module-import/test.config.js b/test/configCases/externals/module-import/test.config.js new file mode 100644 index 00000000000..93fd44fb16b --- /dev/null +++ b/test/configCases/externals/module-import/test.config.js @@ -0,0 +1,3 @@ +module.exports = { + findBundle: (i, options) => ["main.js"] +}; diff --git a/test/configCases/externals/module-import/webpack.config.js b/test/configCases/externals/module-import/webpack.config.js new file mode 100644 index 00000000000..3758c82bf74 --- /dev/null +++ b/test/configCases/externals/module-import/webpack.config.js @@ -0,0 +1,41 @@ +/** @type {import("../../../../types").Configuration} */ +module.exports = { + target: ["web", "es2020"], + node: { + __dirname: false, + __filename: false + }, + output: { + module: true, + filename: "[name].js" + }, + entry: { + a: "./a", + main: "./index" + }, + optimization: { + concatenateModules: true + }, + experiments: { + outputModule: true + }, + externalsType: "module-import", + externals: [ + function ( + { context, request, contextInfo, getResolve, dependencyType }, + callback + ) { + if (request === "external2") { + return callback(null, "node-commonjs external2"); + } + callback(); + }, + { + external0: "external0", + external1: "external1", + external3: "external3", + fs: "commonjs fs", + path: "commonjs path" + } + ] +}; diff --git a/test/configCases/externals/non-amd-externals-amd/index.js b/test/configCases/externals/non-amd-externals-amd/index.js new file mode 100644 index 00000000000..dda9ae39696 --- /dev/null +++ b/test/configCases/externals/non-amd-externals-amd/index.js @@ -0,0 +1,33 @@ +var fs = require("fs"); +var path = require("path"); + +var dependencyArrayRegex = /define\((\[[^\]]*\]), (function)?\(/; +var source = fs.readFileSync(path.join(__dirname, "bundle0.js"), "utf-8"); +var [, deps] = dependencyArrayRegex.exec(source); + +it("should correctly import a AMD external", function() { + var external = require("external0"); + expect(external).toBe("module 0"); +}); + +it("should contain the AMD external in the dependency array", function() { + expect(deps).toContain("\"external0\""); +}); + +it("should correctly import a non-AMD external", function() { + var external = require("external1"); + expect(external).toBe("abc"); +}); + +it("should not contain the non-AMD external in the dependency array", function() { + expect(deps).not.toContain("\"external1\""); +}); + +it("should correctly import a asset external", function() { + var asset = new URL("#hash", import.meta.url); + expect(asset.href).toBe(__webpack_base_uri__ + "#hash"); +}); + +it("should not contain asset external in the dependency array", function() { + expect(deps).not.toContain("\"#hash\""); +}); diff --git a/test/configCases/externals/non-amd-externals-amd/test.config.js b/test/configCases/externals/non-amd-externals-amd/test.config.js new file mode 100644 index 00000000000..680a119a5a8 --- /dev/null +++ b/test/configCases/externals/non-amd-externals-amd/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + modules: { + external0: "module 0" + } +}; diff --git a/test/configCases/externals/non-amd-externals-amd/webpack.config.js b/test/configCases/externals/non-amd-externals-amd/webpack.config.js new file mode 100644 index 00000000000..119fba2ec7d --- /dev/null +++ b/test/configCases/externals/non-amd-externals-amd/webpack.config.js @@ -0,0 +1,26 @@ +const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + libraryTarget: "amd" + }, + externals: { + external0: "external0", + external1: "var 'abc'" + }, + node: { + __dirname: false, + __filename: false + }, + target: "web", + externalsPresets: { + node: true + }, + plugins: [ + new webpack.BannerPlugin({ + raw: true, + banner: + "function define(deps, fn) { fn(...deps.map(dep => require(dep))); }\n" + }) + ] +}; diff --git a/test/configCases/externals/non-umd-externals-umd/webpack.config.js b/test/configCases/externals/non-umd-externals-umd/webpack.config.js index acbfaa925e2..bbb4c9b030e 100644 --- a/test/configCases/externals/non-umd-externals-umd/webpack.config.js +++ b/test/configCases/externals/non-umd-externals-umd/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { output: { libraryTarget: "umd" diff --git a/test/configCases/externals/non-umd-externals-umd2/webpack.config.js b/test/configCases/externals/non-umd-externals-umd2/webpack.config.js index edca25ee983..423ba3992e4 100644 --- a/test/configCases/externals/non-umd-externals-umd2/webpack.config.js +++ b/test/configCases/externals/non-umd-externals-umd2/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { output: { libraryTarget: "umd2" diff --git a/test/configCases/externals/optional-externals-cjs/webpack.config.js b/test/configCases/externals/optional-externals-cjs/webpack.config.js index 6cffaf1c609..59b592cacb9 100644 --- a/test/configCases/externals/optional-externals-cjs/webpack.config.js +++ b/test/configCases/externals/optional-externals-cjs/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { output: { libraryTarget: "commonjs2" diff --git a/test/configCases/externals/optional-externals-root/webpack.config.js b/test/configCases/externals/optional-externals-root/webpack.config.js index 51175908da2..cb1a0c126d0 100644 --- a/test/configCases/externals/optional-externals-root/webpack.config.js +++ b/test/configCases/externals/optional-externals-root/webpack.config.js @@ -1,7 +1,6 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { - output: { - libraryTarget: "var" - }, + externalsType: "var", externals: { external: "external" } diff --git a/test/configCases/externals/optional-externals-umd/webpack.config.js b/test/configCases/externals/optional-externals-umd/webpack.config.js index fe8423e0593..ec8b3393897 100644 --- a/test/configCases/externals/optional-externals-umd/webpack.config.js +++ b/test/configCases/externals/optional-externals-umd/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { output: { libraryTarget: "umd" diff --git a/test/configCases/externals/optional-externals-umd2-mixed/webpack.config.js b/test/configCases/externals/optional-externals-umd2-mixed/webpack.config.js index 1c34a176bcd..f27ef3ea2a3 100644 --- a/test/configCases/externals/optional-externals-umd2-mixed/webpack.config.js +++ b/test/configCases/externals/optional-externals-umd2-mixed/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { output: { libraryTarget: "umd2" diff --git a/test/configCases/externals/optional-externals-umd2/webpack.config.js b/test/configCases/externals/optional-externals-umd2/webpack.config.js index a89a36f3c60..d8f15c43738 100644 --- a/test/configCases/externals/optional-externals-umd2/webpack.config.js +++ b/test/configCases/externals/optional-externals-umd2/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { output: { libraryTarget: "umd2" diff --git a/test/configCases/externals/prefer-provided-over-built-in/index.js b/test/configCases/externals/prefer-provided-over-built-in/index.js new file mode 100644 index 00000000000..79c9742c384 --- /dev/null +++ b/test/configCases/externals/prefer-provided-over-built-in/index.js @@ -0,0 +1,5 @@ +import http from "http"; + +it("prefer provided over built-in", () => { + expect(http).toBe(3); +}); diff --git a/test/configCases/externals/prefer-provided-over-built-in/webpack.config.js b/test/configCases/externals/prefer-provided-over-built-in/webpack.config.js new file mode 100644 index 00000000000..29caaf13836 --- /dev/null +++ b/test/configCases/externals/prefer-provided-over-built-in/webpack.config.js @@ -0,0 +1,6 @@ +module.exports = { + target: "node", + externals: { + http: "1+2" + } +}; diff --git a/test/configCases/externals/resolve-callback/index.js b/test/configCases/externals/resolve-callback/index.js new file mode 100644 index 00000000000..94596ebbd36 --- /dev/null +++ b/test/configCases/externals/resolve-callback/index.js @@ -0,0 +1,7 @@ +it("should allow functions as externals with promise and resolver", function () { + const result = require("external"); + expect(result).toMatch(/^[a-z]:\\|\//i); + expect(result).toMatch(/resolve-callback.node_modules.external\.js$/); + const result1 = require("external-false"); + expect(JSON.stringify(result1)).toBe('{}'); +}); diff --git a/test/configCases/externals/resolve-callback/node_modules/external-false.js b/test/configCases/externals/resolve-callback/node_modules/external-false.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/externals/resolve-callback/node_modules/external.js b/test/configCases/externals/resolve-callback/node_modules/external.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/externals/resolve-callback/webpack.config.js b/test/configCases/externals/resolve-callback/webpack.config.js new file mode 100644 index 00000000000..9769d7f9bad --- /dev/null +++ b/test/configCases/externals/resolve-callback/webpack.config.js @@ -0,0 +1,41 @@ +/** @typedef {import("enhanced-resolve").ResolveRequest} ResolveRequest */ +/** @typedef {import("../../../../").ExternalItemFunctionData} ExternalItemFunctionData */ + +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + concatenateModules: true + }, + externals: [ + ({ context: _context, request, getResolve }, callback) => { + if (request !== "external" && request !== "external-false") { + return callback(null, false); + } + + const context = /** @type {string} */ (_context); + + const resolve = + /** @type {ReturnType>} */ ( + /** @type {NonNullable} */ + (getResolve)({ + alias: { + "external-false": false + } + }) + ); + + if (request === "external-false") { + resolve(context, request, callback); + } else { + resolve(context, request, (err, resolved, resolveRequest) => { + if (err) callback(err); + else if ( + resolved !== /** @type {ResolveRequest} */ (resolveRequest).path + ) + callback(new Error("Error")); + else callback(null, `var ${JSON.stringify(resolved)}`); + }); + } + } + ] +}; diff --git a/test/configCases/externals/resolve/index.js b/test/configCases/externals/resolve/index.js new file mode 100644 index 00000000000..2b43aa03ea7 --- /dev/null +++ b/test/configCases/externals/resolve/index.js @@ -0,0 +1,8 @@ +it("should allow functions as externals with promise and resolver", function () { + const result = require("external"); + expect(result).toMatch(/^[a-z]:\\|\//i); + expect(result).toMatch(/resolve.node_modules.external\.js$/); + const result2 = require("external-promise"); + expect(result2).toMatch(/^[a-z]:\\|\//i); + expect(result2).toMatch(/resolve.node_modules.external-promise\.js$/); +}); diff --git a/test/configCases/externals/resolve/node_modules/external-promise.js b/test/configCases/externals/resolve/node_modules/external-promise.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/externals/resolve/node_modules/external.js b/test/configCases/externals/resolve/node_modules/external.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/externals/resolve/webpack.config.js b/test/configCases/externals/resolve/webpack.config.js new file mode 100644 index 00000000000..b712d132d91 --- /dev/null +++ b/test/configCases/externals/resolve/webpack.config.js @@ -0,0 +1,28 @@ +/** @typedef {import("../../../../").ExternalItemFunctionData} ExternalItemFunctionData */ +/** @typedef {import("../../../../").ExternalItemFunctionPromise} ExternalItemFunctionPromise */ +/** @typedef {import("../../../../").ExternalItemFunctionDataGetResolve} ExternalItemFunctionDataGetResolve */ +/** @typedef {import("../../../../").ExternalItemFunctionDataGetResolveResult} ExternalItemFunctionDataGetResolveResult */ + +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + concatenateModules: true + }, + externals: [ + /** @type {ExternalItemFunctionPromise} */ + async ({ context, request, getResolve }) => { + if (request !== "external" && request !== "external-promise") { + return false; + } + + const resolve = + /** @type {ExternalItemFunctionDataGetResolveResult} */ + ( + /** @type {ExternalItemFunctionDataGetResolve} */ + (getResolve)() + ); + const resolved = await resolve(/** @type {string} */ (context), request); + return `var ${JSON.stringify(resolved)}`; + } + ] +}; diff --git a/test/configCases/externals/this/index.js b/test/configCases/externals/this/index.js new file mode 100644 index 00000000000..f121aac4629 --- /dev/null +++ b/test/configCases/externals/this/index.js @@ -0,0 +1,11 @@ +afterEach(done => { + (function() { delete this.EXTERNAL_TEST_GLOBAL; })(); + done(); +}); + +it("should import an external value assigned to global this", function() { + (function() { this.EXTERNAL_TEST_GLOBAL = 42; })(); + // eslint-disable-next-line n/no-missing-require + const result = require("external"); + expect(result).toBe(42); +}); diff --git a/test/configCases/externals/this/webpack.config.js b/test/configCases/externals/this/webpack.config.js new file mode 100644 index 00000000000..3e9153e51eb --- /dev/null +++ b/test/configCases/externals/this/webpack.config.js @@ -0,0 +1,9 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + concatenateModules: true + }, + externals: { + external: "this EXTERNAL_TEST_GLOBAL" + } +}; diff --git a/test/configCases/filename-template/filename-function/a.js b/test/configCases/filename-template/filename-function/a.js new file mode 100644 index 00000000000..94d6da29137 --- /dev/null +++ b/test/configCases/filename-template/filename-function/a.js @@ -0,0 +1,5 @@ +it("should be able to load a chunk", async () => { + await expect( + import(/* webpackChunkName: "1" */ "./chunk1") + ).resolves.toMatchObject({ default: 1 }); +}); diff --git a/test/configCases/filename-template/filename-function/b.js b/test/configCases/filename-template/filename-function/b.js new file mode 100644 index 00000000000..7eecd6dfd82 --- /dev/null +++ b/test/configCases/filename-template/filename-function/b.js @@ -0,0 +1,5 @@ +it("should be able to load a chunk", async () => { + await expect( + import(/* webpackChunkName: "2" */ "./chunk2") + ).resolves.toMatchObject({ default: 2 }); +}); diff --git a/test/configCases/filename-template/filename-function/chunk1.js b/test/configCases/filename-template/filename-function/chunk1.js new file mode 100644 index 00000000000..aef22247d75 --- /dev/null +++ b/test/configCases/filename-template/filename-function/chunk1.js @@ -0,0 +1 @@ +export default 1; diff --git a/test/configCases/filename-template/filename-function/chunk2.js b/test/configCases/filename-template/filename-function/chunk2.js new file mode 100644 index 00000000000..842e368a0a2 --- /dev/null +++ b/test/configCases/filename-template/filename-function/chunk2.js @@ -0,0 +1 @@ +export default 2; diff --git a/test/configCases/filename-template/filename-function/test.config.js b/test/configCases/filename-template/filename-function/test.config.js new file mode 100644 index 00000000000..298cbe6d5d4 --- /dev/null +++ b/test/configCases/filename-template/filename-function/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["11.js", "22.js", "aa.js", "bbb.js"]; + } +}; diff --git a/test/configCases/filename-template/filename-function/webpack.config.js b/test/configCases/filename-template/filename-function/webpack.config.js new file mode 100644 index 00000000000..9ce08f8c224 --- /dev/null +++ b/test/configCases/filename-template/filename-function/webpack.config.js @@ -0,0 +1,31 @@ +/** @typedef {import("../../../../").Chunk & { name: string }} Chunk */ +/** @typedef {import("../../../../").PathData & { chunk: Chunk }} PathData */ + +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + entry: { + a: "./a", + b: { + import: "./b", + /** + * @param {PathData} data data + * @returns {string} filename + */ + filename: data => + `${data.chunk.name + data.chunk.name + data.chunk.name}.js` + } + }, + output: { + /** + * @param {PathData} data data + * @returns {string} filename + */ + filename: data => `${data.chunk.name + data.chunk.name}.js`, + /** + * @param {PathData} data data + * @returns {string} filename + */ + chunkFilename: data => `${data.chunk.name + data.chunk.name}.js` + } +}; diff --git a/test/configCases/filename-template/module-filename-template/index.js b/test/configCases/filename-template/module-filename-template/index.js index a8a8e6fa5e1..d3e9c745b17 100644 --- a/test/configCases/filename-template/module-filename-template/index.js +++ b/test/configCases/filename-template/module-filename-template/index.js @@ -5,5 +5,4 @@ it("should include test.js in SourceMap", function() { expect(map.sources).toContain("dummy:///./test.js"); }); -require.include("./test.js"); - +if (Math.random() < 0) require("./test.js"); diff --git a/test/configCases/filename-template/module-filename-template/webpack.config.js b/test/configCases/filename-template/module-filename-template/webpack.config.js index a5e99ca66fb..80a78521c0b 100644 --- a/test/configCases/filename-template/module-filename-template/webpack.config.js +++ b/test/configCases/filename-template/module-filename-template/webpack.config.js @@ -1,9 +1,9 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { mode: "development", output: { - devtoolLineToLine: true, - devtoolModuleFilenameTemplate: function(info) { - return "dummy:///" + info.resourcePath; + devtoolModuleFilenameTemplate(info) { + return `dummy:///${info.resourcePath}`; } }, node: { diff --git a/test/configCases/filename-template/script-src-filename/index.js b/test/configCases/filename-template/script-src-filename/index.js new file mode 100644 index 00000000000..8bd9e15c0b1 --- /dev/null +++ b/test/configCases/filename-template/script-src-filename/index.js @@ -0,0 +1,17 @@ +it("should allow to access __webpack_get_script_filename__ ", done => { + const oldFn = __webpack_get_script_filename__; + __webpack_get_script_filename__ = chunk => { + const filename = oldFn(chunk); + return filename + ".changed"; + }; + import("./test.js").then( + () => { + done.fail("Loading chunk should fail"); + }, + err => { + expect(err.code).toBe("ENOENT"); + expect(err.path).toMatch(/\.js\.changed$/); + done(); + } + ); +}); diff --git a/test/configCases/filename-template/script-src-filename/test.js b/test/configCases/filename-template/script-src-filename/test.js new file mode 100644 index 00000000000..8b1a393741c --- /dev/null +++ b/test/configCases/filename-template/script-src-filename/test.js @@ -0,0 +1 @@ +// empty diff --git a/test/configCases/filename-template/script-src-filename/webpack.config.js b/test/configCases/filename-template/script-src-filename/webpack.config.js new file mode 100644 index 00000000000..8152f6c7681 --- /dev/null +++ b/test/configCases/filename-template/script-src-filename/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development" +}; diff --git a/test/configCases/filename-template/split-chunks-filename/index.js b/test/configCases/filename-template/split-chunks-filename/index.js index 66eba381f47..8e2faec2707 100644 --- a/test/configCases/filename-template/split-chunks-filename/index.js +++ b/test/configCases/filename-template/split-chunks-filename/index.js @@ -5,5 +5,7 @@ it("should create a vendor file", function() { throw new Error("vendor.js file was not created"); }); -require.include("test"); +it("should be able to load the vendor module", function() { + require("test"); +}); diff --git a/test/configCases/filename-template/split-chunks-filename/webpack.config.js b/test/configCases/filename-template/split-chunks-filename/webpack.config.js index 580604fe096..b86d3f1b122 100644 --- a/test/configCases/filename-template/split-chunks-filename/webpack.config.js +++ b/test/configCases/filename-template/split-chunks-filename/webpack.config.js @@ -1,9 +1,13 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { mode: "development", node: { __dirname: false, __filename: false }, + output: { + libraryTarget: "commonjs2" + }, optimization: { splitChunks: { cacheGroups: { diff --git a/test/configCases/finish-modules/simple/index.js b/test/configCases/finish-modules/simple/index.js new file mode 100644 index 00000000000..7a0686e3052 --- /dev/null +++ b/test/configCases/finish-modules/simple/index.js @@ -0,0 +1,3 @@ +it("should compile", function(done) { + done(); +}); diff --git a/test/configCases/finish-modules/simple/webpack.config.js b/test/configCases/finish-modules/simple/webpack.config.js new file mode 100644 index 00000000000..2d9b3ad2b3b --- /dev/null +++ b/test/configCases/finish-modules/simple/webpack.config.js @@ -0,0 +1,18 @@ +/** + * @this {import("../../../../").Compiler} the compiler + */ +function testPlugin() { + this.hooks.compilation.tap("TestPlugin", compilation => { + compilation.hooks.finishModules.tapAsync( + "TestPlugin", + function (_modules, callback) { + callback(); + } + ); + }); +} + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [testPlugin] +}; diff --git a/test/configCases/graph/conditional-ensure/a.js b/test/configCases/graph/conditional-ensure/a.js new file mode 100644 index 00000000000..1ea9fcfdc8c --- /dev/null +++ b/test/configCases/graph/conditional-ensure/a.js @@ -0,0 +1,7 @@ +import c1 from "./c1"; + +it("should allow to import an conditionally unneeded chunk", async () => { + const c2 = await c1(); + const c1_ = await c2.default(); + expect(c1_.value).toBe(1); +}); diff --git a/test/configCases/graph/conditional-ensure/b.js b/test/configCases/graph/conditional-ensure/b.js new file mode 100644 index 00000000000..32f01332367 --- /dev/null +++ b/test/configCases/graph/conditional-ensure/b.js @@ -0,0 +1,7 @@ +import c2 from "./c2"; + +it("should allow to import an conditionally unneeded chunk", async () => { + const c1 = await c2(); + const c2_ = await c1.default(); + expect(c2_.value).toBe(2); +}); diff --git a/test/configCases/graph/conditional-ensure/c1.js b/test/configCases/graph/conditional-ensure/c1.js new file mode 100644 index 00000000000..bfd7d369c96 --- /dev/null +++ b/test/configCases/graph/conditional-ensure/c1.js @@ -0,0 +1,2 @@ +export default () => import("./c2"); +export const value = 1; diff --git a/test/configCases/graph/conditional-ensure/c2.js b/test/configCases/graph/conditional-ensure/c2.js new file mode 100644 index 00000000000..d04edb2a3dc --- /dev/null +++ b/test/configCases/graph/conditional-ensure/c2.js @@ -0,0 +1,2 @@ +export default () => import("./c1"); +export const value = 2; diff --git a/test/configCases/graph/conditional-ensure/webpack.config.js b/test/configCases/graph/conditional-ensure/webpack.config.js new file mode 100644 index 00000000000..c4cca61071b --- /dev/null +++ b/test/configCases/graph/conditional-ensure/webpack.config.js @@ -0,0 +1,15 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + bundle0: "./a", + bundle1: "./b" + }, + optimization: { + flagIncludedChunks: false, + chunkIds: "named" + }, + output: { + filename: "[name].js", + chunkFilename: "[id].[chunkhash].js" + } +}; diff --git a/test/configCases/graph/conditional-reexport/a.js b/test/configCases/graph/conditional-reexport/a.js new file mode 100644 index 00000000000..1733779a359 --- /dev/null +++ b/test/configCases/graph/conditional-reexport/a.js @@ -0,0 +1,5 @@ +import { utilA } from "./lib" + +it("should not emit error when running a.js (runtime a)", () => { + expect(utilA()).toBe("a"); +}) diff --git a/test/configCases/graph/conditional-reexport/b.js b/test/configCases/graph/conditional-reexport/b.js new file mode 100644 index 00000000000..dc027b6cedb --- /dev/null +++ b/test/configCases/graph/conditional-reexport/b.js @@ -0,0 +1,5 @@ +import { utilB } from "./lib" + +it("should not emit error when running b.js (runtime b)", () => { + expect(utilB()).toBe("[object Object] common"); +}) diff --git a/test/configCases/graph/conditional-reexport/lib/common/common.js b/test/configCases/graph/conditional-reexport/lib/common/common.js new file mode 100644 index 00000000000..074ca1b0a6a --- /dev/null +++ b/test/configCases/graph/conditional-reexport/lib/common/common.js @@ -0,0 +1 @@ +export const common = 'common' diff --git a/test/configCases/graph/conditional-reexport/lib/common/empty.js b/test/configCases/graph/conditional-reexport/lib/common/empty.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/graph/conditional-reexport/lib/common/index.js b/test/configCases/graph/conditional-reexport/lib/common/index.js new file mode 100644 index 00000000000..cbff10e4c2c --- /dev/null +++ b/test/configCases/graph/conditional-reexport/lib/common/index.js @@ -0,0 +1,2 @@ +export * from "./common" +export * from "./empty" \ No newline at end of file diff --git a/test/configCases/graph/conditional-reexport/lib/index.js b/test/configCases/graph/conditional-reexport/lib/index.js new file mode 100644 index 00000000000..076a9172f79 --- /dev/null +++ b/test/configCases/graph/conditional-reexport/lib/index.js @@ -0,0 +1,3 @@ +export * from "./util-a" +export * from "./common" +export * from "./util-b" diff --git a/test/configCases/graph/conditional-reexport/lib/util-a.js b/test/configCases/graph/conditional-reexport/lib/util-a.js new file mode 100644 index 00000000000..84de8612dba --- /dev/null +++ b/test/configCases/graph/conditional-reexport/lib/util-a.js @@ -0,0 +1,3 @@ +export function utilA() { + return 'a'; +} diff --git a/test/configCases/graph/conditional-reexport/lib/util-b.js b/test/configCases/graph/conditional-reexport/lib/util-b.js new file mode 100644 index 00000000000..dda8e9fcd46 --- /dev/null +++ b/test/configCases/graph/conditional-reexport/lib/util-b.js @@ -0,0 +1,5 @@ +import { common } from "./common" +var b = ({}).toString(); // side effect, this will keep lib/index.js exist in the output, bailout the optimization from SideEffectsFlagPlugin +export function utilB() { + return b + ' ' + common; +} diff --git a/test/configCases/graph/conditional-reexport/test.config.js b/test/configCases/graph/conditional-reexport/test.config.js new file mode 100644 index 00000000000..a7d5e357230 --- /dev/null +++ b/test/configCases/graph/conditional-reexport/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./lib.js", "./a.js", "./b.js"]; + } +}; diff --git a/test/configCases/graph/conditional-reexport/webpack.config.js b/test/configCases/graph/conditional-reexport/webpack.config.js new file mode 100644 index 00000000000..b8cd3217e35 --- /dev/null +++ b/test/configCases/graph/conditional-reexport/webpack.config.js @@ -0,0 +1,25 @@ +/** @type {import("webpack").Configuration} */ +module.exports = { + entry: { + a: "./a.js", + b: "./b.js" + }, + output: { + filename: "[name].js" + }, + target: "web", + mode: "production", + optimization: { + concatenateModules: false, + splitChunks: { + cacheGroups: { + lib: { + name: "lib", + test: /lib/, + chunks: "all", + minSize: 0 + } + } + } + } +}; diff --git a/test/configCases/graph/issue-11770/a.js b/test/configCases/graph/issue-11770/a.js new file mode 100644 index 00000000000..91e639dac9a --- /dev/null +++ b/test/configCases/graph/issue-11770/a.js @@ -0,0 +1,6 @@ +import { val, val2b } from "./shared"; + +it("should have the correct value", () => { + expect(val).toBe(84); + expect(val2b).toBe(42); +}); diff --git a/test/configCases/graph/issue-11770/ax.js b/test/configCases/graph/issue-11770/ax.js new file mode 100644 index 00000000000..3738eadfb67 --- /dev/null +++ b/test/configCases/graph/issue-11770/ax.js @@ -0,0 +1,6 @@ +import { val, val2b } from "./concatenated-shared"; + +it("should have the correct value", () => { + expect(val).toBe(84); + expect(val2b).toBe(42); +}); diff --git a/test/configCases/graph/issue-11770/b.js b/test/configCases/graph/issue-11770/b.js new file mode 100644 index 00000000000..def6b6eef2b --- /dev/null +++ b/test/configCases/graph/issue-11770/b.js @@ -0,0 +1,8 @@ +import { other, val2c, Test } from "./shared"; + +it("should have the correct value", () => { + expect(other).toBe("other"); + expect(val2c).toBe(42); + expect(Test).toBeTypeOf("function"); + expect(new Test()).toBeInstanceOf(Test); +}); diff --git a/test/configCases/graph/issue-11770/bx.js b/test/configCases/graph/issue-11770/bx.js new file mode 100644 index 00000000000..1d24b378858 --- /dev/null +++ b/test/configCases/graph/issue-11770/bx.js @@ -0,0 +1,8 @@ +import { other, val2c, Test } from "./concatenated-shared"; + +it("should have the correct value", () => { + expect(other).toBe("other"); + expect(val2c).toBe(42); + expect(Test).toBeTypeOf("function"); + expect(new Test()).toBeInstanceOf(Test); +}); diff --git a/test/configCases/graph/issue-11770/c.js b/test/configCases/graph/issue-11770/c.js new file mode 100644 index 00000000000..eb652f42cb3 --- /dev/null +++ b/test/configCases/graph/issue-11770/c.js @@ -0,0 +1,5 @@ +import { other } from "./shared"; + +it("should have the correct value", () => { + expect(other).toBe("other"); +}); diff --git a/test/configCases/graph/issue-11770/concatenated-shared.js b/test/configCases/graph/issue-11770/concatenated-shared.js new file mode 100644 index 00000000000..42feac2d697 --- /dev/null +++ b/test/configCases/graph/issue-11770/concatenated-shared.js @@ -0,0 +1 @@ +export * from "./shared?1"; diff --git a/test/configCases/graph/issue-11770/cx.js b/test/configCases/graph/issue-11770/cx.js new file mode 100644 index 00000000000..55048979a17 --- /dev/null +++ b/test/configCases/graph/issue-11770/cx.js @@ -0,0 +1,5 @@ +import { other } from "./concatenated-shared"; + +it("should have the correct value", () => { + expect(other).toBe("other"); +}); diff --git a/test/configCases/graph/issue-11770/d1.js b/test/configCases/graph/issue-11770/d1.js new file mode 100644 index 00000000000..1da3d9db3f8 --- /dev/null +++ b/test/configCases/graph/issue-11770/d1.js @@ -0,0 +1,6 @@ +import { value2, value3 } from "./shared2"; + +it("should have the correct value", () => { + expect(value2).toBe(42); + expect(value3).toBe(42); +}); diff --git a/test/configCases/graph/issue-11770/d2.js b/test/configCases/graph/issue-11770/d2.js new file mode 100644 index 00000000000..b32578cb79f --- /dev/null +++ b/test/configCases/graph/issue-11770/d2.js @@ -0,0 +1,6 @@ +import { other2, value3 } from "./shared2"; + +it("should have the correct value", () => { + expect(other2).toBe("other"); + expect(value3).toBe(42); +}); diff --git a/test/configCases/graph/issue-11770/dep-shared3.js b/test/configCases/graph/issue-11770/dep-shared3.js new file mode 100644 index 00000000000..272819e9b2b --- /dev/null +++ b/test/configCases/graph/issue-11770/dep-shared3.js @@ -0,0 +1,4 @@ +import { setOther2 } from "./shared2"; + +export default 42; +setOther2("wrong"); diff --git a/test/configCases/graph/issue-11770/dep-shared4.js b/test/configCases/graph/issue-11770/dep-shared4.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/configCases/graph/issue-11770/dep-shared4.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/configCases/graph/issue-11770/dep.js b/test/configCases/graph/issue-11770/dep.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/configCases/graph/issue-11770/dep.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/configCases/graph/issue-11770/dep2.js b/test/configCases/graph/issue-11770/dep2.js new file mode 100644 index 00000000000..888cae37af9 --- /dev/null +++ b/test/configCases/graph/issue-11770/dep2.js @@ -0,0 +1 @@ +module.exports = 42; diff --git a/test/configCases/graph/issue-11770/shared.js b/test/configCases/graph/issue-11770/shared.js new file mode 100644 index 00000000000..b621dff945c --- /dev/null +++ b/test/configCases/graph/issue-11770/shared.js @@ -0,0 +1,16 @@ +import value from "./dep"; +import value2 from "./dep2"; +import * as dep2 from "./dep2"; +import Super from "./super"; + +const derived = value; + +export const val = /*#__PURE__*/ (() => value + derived)(); + +export const val2a = value2; +export const val2b = value2; +export const val2c = value2; + +export const other = "other"; + +export class Test extends Super {} diff --git a/test/configCases/graph/issue-11770/shared2.js b/test/configCases/graph/issue-11770/shared2.js new file mode 100644 index 00000000000..dc98ce98132 --- /dev/null +++ b/test/configCases/graph/issue-11770/shared2.js @@ -0,0 +1,12 @@ +import value from "./dep-shared3"; +import value4 from "./dep-shared4"; + +export function setOther2(value) { + other2 = value; +} + +export const value2 = value; +export const value3 = value4; +export var other2; + +if (other2 === undefined) other2 = "other"; diff --git a/test/configCases/graph/issue-11770/super.js b/test/configCases/graph/issue-11770/super.js new file mode 100644 index 00000000000..d470a77c21a --- /dev/null +++ b/test/configCases/graph/issue-11770/super.js @@ -0,0 +1 @@ +export default class Super {} diff --git a/test/configCases/graph/issue-11770/test.config.js b/test/configCases/graph/issue-11770/test.config.js new file mode 100644 index 00000000000..d6424e6f060 --- /dev/null +++ b/test/configCases/graph/issue-11770/test.config.js @@ -0,0 +1,17 @@ +module.exports = { + findBundle(i, options) { + return [ + "shared.js", + "a.js", + "b.js", + "c1.js", + "c2.js", + "ax.js", + "bx.js", + "cx1.js", + "cx2.js", + "d1.js", + "d2.js" + ]; + } +}; diff --git a/test/configCases/graph/issue-11770/webpack.config.js b/test/configCases/graph/issue-11770/webpack.config.js new file mode 100644 index 00000000000..737dc91967d --- /dev/null +++ b/test/configCases/graph/issue-11770/webpack.config.js @@ -0,0 +1,45 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + a: "./a", + b: "./b", + c1: "./c", + c2: "./c", + ax: "./ax", + bx: "./bx", + cx1: "./cx", + cx2: "./cx", + d1: "./d1", + d2: "./d2" + }, + target: "web", + output: { + filename: "[name].js", + library: { type: "commonjs-module" } + }, + optimization: { + usedExports: true, + concatenateModules: true, + splitChunks: { + cacheGroups: { + forceMerge: { + test: /shared/, + enforce: true, + name: "shared", + chunks: "all" + } + } + } + }, + module: { + rules: [ + { + test: /dep/, + sideEffects: false + } + ] + }, + experiments: { + topLevelAwait: true + } +}; diff --git a/test/configCases/graph/issue-11856.2/a.js b/test/configCases/graph/issue-11856.2/a.js new file mode 100644 index 00000000000..244516d4db6 --- /dev/null +++ b/test/configCases/graph/issue-11856.2/a.js @@ -0,0 +1,5 @@ +import { value } from "./shared-c"; + +it("should have to correct value", () => { + expect(value).toBe(42); +}); diff --git a/test/configCases/graph/issue-11856.2/b.js b/test/configCases/graph/issue-11856.2/b.js new file mode 100644 index 00000000000..7666bd7a094 --- /dev/null +++ b/test/configCases/graph/issue-11856.2/b.js @@ -0,0 +1,5 @@ +import { value } from "./b2"; + +it("should have to correct value", () => { + expect(value).toBe(42); +}); diff --git a/test/configCases/graph/issue-11856.2/b2.js b/test/configCases/graph/issue-11856.2/b2.js new file mode 100644 index 00000000000..ff5c6ca1544 --- /dev/null +++ b/test/configCases/graph/issue-11856.2/b2.js @@ -0,0 +1 @@ +export * from "./shared-e"; diff --git a/test/configCases/graph/issue-11856.2/shared-c.js b/test/configCases/graph/issue-11856.2/shared-c.js new file mode 100644 index 00000000000..2e0539bdf29 --- /dev/null +++ b/test/configCases/graph/issue-11856.2/shared-c.js @@ -0,0 +1 @@ +export * from "./shared-d"; diff --git a/test/configCases/graph/issue-11856.2/shared-d.js b/test/configCases/graph/issue-11856.2/shared-d.js new file mode 100644 index 00000000000..ff5c6ca1544 --- /dev/null +++ b/test/configCases/graph/issue-11856.2/shared-d.js @@ -0,0 +1 @@ +export * from "./shared-e"; diff --git a/test/configCases/graph/issue-11856.2/shared-e.js b/test/configCases/graph/issue-11856.2/shared-e.js new file mode 100644 index 00000000000..46d3ca8c61f --- /dev/null +++ b/test/configCases/graph/issue-11856.2/shared-e.js @@ -0,0 +1 @@ +export const value = 42; diff --git a/test/configCases/graph/issue-11856.2/test.config.js b/test/configCases/graph/issue-11856.2/test.config.js new file mode 100644 index 00000000000..989a7739d98 --- /dev/null +++ b/test/configCases/graph/issue-11856.2/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle: function (i, options) { + return ["shared.js", "a.js", "b.js"]; + } +}; diff --git a/test/configCases/graph/issue-11856.2/webpack.config.js b/test/configCases/graph/issue-11856.2/webpack.config.js new file mode 100644 index 00000000000..aa924728c07 --- /dev/null +++ b/test/configCases/graph/issue-11856.2/webpack.config.js @@ -0,0 +1,26 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + a: "./a", + b: "./b" + }, + target: "web", + output: { + filename: "[name].js", + library: { type: "commonjs-module" } + }, + optimization: { + usedExports: true, + concatenateModules: true, + splitChunks: { + cacheGroups: { + forceMerge: { + test: /shared/, + enforce: true, + name: "shared", + chunks: "all" + } + } + } + } +}; diff --git a/test/configCases/graph/issue-11856/a.js b/test/configCases/graph/issue-11856/a.js new file mode 100644 index 00000000000..244516d4db6 --- /dev/null +++ b/test/configCases/graph/issue-11856/a.js @@ -0,0 +1,5 @@ +import { value } from "./shared-c"; + +it("should have to correct value", () => { + expect(value).toBe(42); +}); diff --git a/test/configCases/graph/issue-11856/b.js b/test/configCases/graph/issue-11856/b.js new file mode 100644 index 00000000000..69313beede6 --- /dev/null +++ b/test/configCases/graph/issue-11856/b.js @@ -0,0 +1,5 @@ +import { value } from "./shared-d"; + +it("should have to correct value", () => { + expect(value).toBe(42); +}); diff --git a/test/configCases/graph/issue-11856/shared-c.js b/test/configCases/graph/issue-11856/shared-c.js new file mode 100644 index 00000000000..2e0539bdf29 --- /dev/null +++ b/test/configCases/graph/issue-11856/shared-c.js @@ -0,0 +1 @@ +export * from "./shared-d"; diff --git a/test/configCases/graph/issue-11856/shared-d.js b/test/configCases/graph/issue-11856/shared-d.js new file mode 100644 index 00000000000..46d3ca8c61f --- /dev/null +++ b/test/configCases/graph/issue-11856/shared-d.js @@ -0,0 +1 @@ +export const value = 42; diff --git a/test/configCases/graph/issue-11856/test.config.js b/test/configCases/graph/issue-11856/test.config.js new file mode 100644 index 00000000000..4ff816dc9ab --- /dev/null +++ b/test/configCases/graph/issue-11856/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["shared.js", "a.js", "b.js"]; + } +}; diff --git a/test/configCases/graph/issue-11856/webpack.config.js b/test/configCases/graph/issue-11856/webpack.config.js new file mode 100644 index 00000000000..aa924728c07 --- /dev/null +++ b/test/configCases/graph/issue-11856/webpack.config.js @@ -0,0 +1,26 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + a: "./a", + b: "./b" + }, + target: "web", + output: { + filename: "[name].js", + library: { type: "commonjs-module" } + }, + optimization: { + usedExports: true, + concatenateModules: true, + splitChunks: { + cacheGroups: { + forceMerge: { + test: /shared/, + enforce: true, + name: "shared", + chunks: "all" + } + } + } + } +}; diff --git a/test/configCases/graph/issue-11863/a.js b/test/configCases/graph/issue-11863/a.js new file mode 100644 index 00000000000..f30aa092588 --- /dev/null +++ b/test/configCases/graph/issue-11863/a.js @@ -0,0 +1,5 @@ +import { value1 } from "./shared"; + +it("should have to correct value", () => { + expect(value1).toBe(42); +}); diff --git a/test/configCases/graph/issue-11863/b.js b/test/configCases/graph/issue-11863/b.js new file mode 100644 index 00000000000..04a21d85eb7 --- /dev/null +++ b/test/configCases/graph/issue-11863/b.js @@ -0,0 +1,5 @@ +import { value2 } from "./shared"; + +it("should have to correct value", () => { + expect(value2).toBe(42); +}); diff --git a/test/configCases/graph/issue-11863/c.js b/test/configCases/graph/issue-11863/c.js new file mode 100644 index 00000000000..90cfa268b77 --- /dev/null +++ b/test/configCases/graph/issue-11863/c.js @@ -0,0 +1,5 @@ +import { value3 } from "./shared"; + +it("should have to correct value", () => { + expect(value3).toBe(42); +}); diff --git a/test/configCases/graph/issue-11863/shared-x.js b/test/configCases/graph/issue-11863/shared-x.js new file mode 100644 index 00000000000..4bc1fc56323 --- /dev/null +++ b/test/configCases/graph/issue-11863/shared-x.js @@ -0,0 +1,3 @@ +export const value1 = 42; +export const value2 = 42; +export const value3 = 42; diff --git a/test/configCases/graph/issue-11863/shared-y.js b/test/configCases/graph/issue-11863/shared-y.js new file mode 100644 index 00000000000..5390ec68ae6 --- /dev/null +++ b/test/configCases/graph/issue-11863/shared-y.js @@ -0,0 +1 @@ +export { value3 } from "./shared-x"; diff --git a/test/configCases/graph/issue-11863/shared-z.js b/test/configCases/graph/issue-11863/shared-z.js new file mode 100644 index 00000000000..ed9f0588a47 --- /dev/null +++ b/test/configCases/graph/issue-11863/shared-z.js @@ -0,0 +1 @@ +export { value1 } from "./shared-x"; diff --git a/test/configCases/graph/issue-11863/shared.js b/test/configCases/graph/issue-11863/shared.js new file mode 100644 index 00000000000..3a13d552331 --- /dev/null +++ b/test/configCases/graph/issue-11863/shared.js @@ -0,0 +1,3 @@ +export { value1 } from "./shared-z"; +export { value2 } from "./shared-x"; +export * from "./shared-y"; diff --git a/test/configCases/graph/issue-11863/test.config.js b/test/configCases/graph/issue-11863/test.config.js new file mode 100644 index 00000000000..3a3565765c5 --- /dev/null +++ b/test/configCases/graph/issue-11863/test.config.js @@ -0,0 +1,14 @@ +module.exports = { + findBundle(i, options) { + return [ + "shared.js", + "a.js", + "b.js", + "c.js", + "ab.js", + "ac.js", + "bc.js", + "abc.js" + ]; + } +}; diff --git a/test/configCases/graph/issue-11863/webpack.config.js b/test/configCases/graph/issue-11863/webpack.config.js new file mode 100644 index 00000000000..e0616bcaaf7 --- /dev/null +++ b/test/configCases/graph/issue-11863/webpack.config.js @@ -0,0 +1,40 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + a: "./a", + b: "./b", + c: "./c", + ab: ["./a", "./b"], + ac: ["./a", "./c"], + bc: ["./b", "./c"], + abc: ["./a", "./b", "./c"] + }, + target: "web", + output: { + filename: "[name].js", + library: { type: "commonjs-module" } + }, + optimization: { + chunkIds: "named", + usedExports: true, + concatenateModules: true, + splitChunks: { + cacheGroups: { + forceMerge: { + test: /shared/, + enforce: true, + name: "shared", + chunks: "all" + } + } + } + }, + module: { + rules: [ + { + test: /shared/ + // sideEffects: false + } + ] + } +}; diff --git a/test/configCases/hash-length/deterministic-module-ids/files/file1.js b/test/configCases/hash-length/deterministic-module-ids/files/file1.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/hash-length/deterministic-module-ids/files/file1.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/hash-length/deterministic-module-ids/files/file10.js b/test/configCases/hash-length/deterministic-module-ids/files/file10.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/hash-length/deterministic-module-ids/files/file10.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/hash-length/deterministic-module-ids/files/file11.js b/test/configCases/hash-length/deterministic-module-ids/files/file11.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/hash-length/deterministic-module-ids/files/file11.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/hash-length/deterministic-module-ids/files/file12.js b/test/configCases/hash-length/deterministic-module-ids/files/file12.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/hash-length/deterministic-module-ids/files/file12.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/hash-length/deterministic-module-ids/files/file13.js b/test/configCases/hash-length/deterministic-module-ids/files/file13.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/hash-length/deterministic-module-ids/files/file13.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/hash-length/deterministic-module-ids/files/file14.js b/test/configCases/hash-length/deterministic-module-ids/files/file14.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/hash-length/deterministic-module-ids/files/file14.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/hash-length/deterministic-module-ids/files/file15.js b/test/configCases/hash-length/deterministic-module-ids/files/file15.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/hash-length/deterministic-module-ids/files/file15.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/hash-length/deterministic-module-ids/files/file2.js b/test/configCases/hash-length/deterministic-module-ids/files/file2.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/hash-length/deterministic-module-ids/files/file2.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/hash-length/deterministic-module-ids/files/file3.js b/test/configCases/hash-length/deterministic-module-ids/files/file3.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/hash-length/deterministic-module-ids/files/file3.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/hash-length/deterministic-module-ids/files/file4.js b/test/configCases/hash-length/deterministic-module-ids/files/file4.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/hash-length/deterministic-module-ids/files/file4.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/hash-length/deterministic-module-ids/files/file5.js b/test/configCases/hash-length/deterministic-module-ids/files/file5.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/hash-length/deterministic-module-ids/files/file5.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/hash-length/deterministic-module-ids/files/file6.js b/test/configCases/hash-length/deterministic-module-ids/files/file6.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/hash-length/deterministic-module-ids/files/file6.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/hash-length/deterministic-module-ids/files/file7.js b/test/configCases/hash-length/deterministic-module-ids/files/file7.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/hash-length/deterministic-module-ids/files/file7.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/hash-length/deterministic-module-ids/files/file8.js b/test/configCases/hash-length/deterministic-module-ids/files/file8.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/hash-length/deterministic-module-ids/files/file8.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/hash-length/deterministic-module-ids/files/file9.js b/test/configCases/hash-length/deterministic-module-ids/files/file9.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/hash-length/deterministic-module-ids/files/file9.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/hash-length/deterministic-module-ids/index.js b/test/configCases/hash-length/deterministic-module-ids/index.js new file mode 100644 index 00000000000..9a989c6c4c6 --- /dev/null +++ b/test/configCases/hash-length/deterministic-module-ids/index.js @@ -0,0 +1,8 @@ +it("should have unique ids", function () { + var ids = []; + for(var i = 1; i <= 15; i++) { + var id = require("./files/file" + i + ".js"); + expect(ids.indexOf(id)).toBe(-1); + ids.push(id); + } +}); diff --git a/test/configCases/hash-length/deterministic-module-ids/webpack.config.js b/test/configCases/hash-length/deterministic-module-ids/webpack.config.js new file mode 100644 index 00000000000..089540e1b62 --- /dev/null +++ b/test/configCases/hash-length/deterministic-module-ids/webpack.config.js @@ -0,0 +1,30 @@ +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + optimization: { + moduleIds: "deterministic" + } + }, + { + optimization: { + moduleIds: false + }, + plugins: [ + new webpack.ids.DeterministicModuleIdsPlugin({ + maxLength: 0 + }) + ] + }, + { + optimization: { + moduleIds: false + }, + plugins: [ + new webpack.ids.DeterministicModuleIdsPlugin({ + maxLength: 100 + }) + ] + } +]; diff --git a/test/configCases/hash-length/hashed-module-ids/webpack.config.js b/test/configCases/hash-length/hashed-module-ids/webpack.config.js index a0d8521291b..7898abf3813 100644 --- a/test/configCases/hash-length/hashed-module-ids/webpack.config.js +++ b/test/configCases/hash-length/hashed-module-ids/webpack.config.js @@ -1,23 +1,34 @@ -var webpack = require("../../../../"); +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration[]} */ module.exports = [ { + optimization: { + moduleIds: false + }, plugins: [ - new webpack.HashedModuleIdsPlugin({ + new webpack.ids.HashedModuleIdsPlugin({ hashDigestLength: 2 }) ] }, { + optimization: { + moduleIds: false + }, plugins: [ - new webpack.HashedModuleIdsPlugin({ + new webpack.ids.HashedModuleIdsPlugin({ hashDigest: "hex", hashDigestLength: 2 }) ] }, { + optimization: { + moduleIds: false + }, plugins: [ - new webpack.HashedModuleIdsPlugin({ + new webpack.ids.HashedModuleIdsPlugin({ hashFunction: "sha1", hashDigestLength: 3 }) diff --git a/test/configCases/hash-length/output-filename/test.config.js b/test/configCases/hash-length/output-filename/test.config.js index 224a52035b7..096bd9c3548 100644 --- a/test/configCases/hash-length/output-filename/test.config.js +++ b/test/configCases/hash-length/output-filename/test.config.js @@ -1,34 +1,34 @@ -var fs = require("fs"); +const fs = require("fs"); -var findFile = function(files, regex) { - return files.find(function(file) { +const findFile = (files, regex) => + files.find(function (file) { if (regex.test(file)) { return true; } + + return false; }); -}; -var verifyFilenameLength = function(filename, expectedNameLength) { - expect(filename).toMatch(new RegExp("^.{" + expectedNameLength + "}$")); +const verifyFilenameLength = (filename, expectedNameLength) => { + expect(filename).toMatch(new RegExp(`^.{${expectedNameLength}}$`)); }; module.exports = { - findBundle: function(i, options) { - var files = fs.readdirSync(options.output.path); - - var bundleDetects = [ + findBundle(i, options) { + const files = fs.readdirSync(options.output.path); + const bundleDetects = [ options.amd.expectedChunkFilenameLength && { - regex: new RegExp("^\\d+.bundle" + i, "i"), + regex: new RegExp(`^\\d+.bundle${i}`, "i"), expectedNameLength: options.amd.expectedChunkFilenameLength }, { - regex: new RegExp("^bundle" + i, "i"), + regex: new RegExp(`^bundle${i}`, "i"), expectedNameLength: options.amd.expectedFilenameLength } ].filter(Boolean); - var bundleDetect; - var filename; + let bundleDetect; + let filename; for (bundleDetect of bundleDetects) { filename = findFile(files, bundleDetect.regex); @@ -39,13 +39,15 @@ module.exports = { }, files: ${files.join(", ")})` ); } - verifyFilenameLength(filename, bundleDetect.expectedNameLength); + verifyFilenameLength( + filename.replace(/^\d+\./, "X."), + bundleDetect.expectedNameLength + ); } - return "./" + filename; + return `./${filename}`; }, afterExecute: () => { - delete global.webpackJsonp; delete global.webpackChunk; } }; diff --git a/test/configCases/hash-length/output-filename/webpack.config.js b/test/configCases/hash-length/output-filename/webpack.config.js index ca75582b24b..ae8679697bc 100644 --- a/test/configCases/hash-length/output-filename/webpack.config.js +++ b/test/configCases/hash-length/output-filename/webpack.config.js @@ -1,11 +1,13 @@ -var webpack = require("../../../../"); +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration[]} */ module.exports = [ { name: "hash with length in publicPath", output: { - publicPath: "/[hash:6]/", - filename: "bundle0.[hash:6].js", - chunkFilename: "[id].bundle0.[hash:6].js" + publicPath: "/[fullhash:6]/", + filename: "bundle0.[fullhash:6].js", + chunkFilename: "[id].bundle0.[fullhash:6].js" }, amd: { expectedFilenameLength: 17, @@ -15,9 +17,9 @@ module.exports = [ { name: "hash in publicPath", output: { - publicPath: "/[hash]/", - filename: "bundle1.[hash].js", - chunkFilename: "[id].bundle1.[hash].js" + publicPath: "/[fullhash]/", + filename: "bundle1.[fullhash].js", + chunkFilename: "[id].bundle1.[fullhash].js" }, amd: { expectedFilenameLength: 31, @@ -49,8 +51,8 @@ module.exports = [ { name: "hash with and without length", output: { - filename: "bundle4.[hash].js", - chunkFilename: "[id].bundle4.[hash:8].js" + filename: "bundle4.[fullhash].js", + chunkFilename: "[id].bundle4.[fullhash:8].js" }, amd: { expectedFilenameLength: 31, @@ -60,8 +62,8 @@ module.exports = [ { name: "hash with length", output: { - filename: "bundle5.[hash:6].js", - chunkFilename: "[id].bundle5.[hash:8].js" + filename: "bundle5.[fullhash:6].js", + chunkFilename: "[id].bundle5.[fullhash:8].js" }, amd: { expectedFilenameLength: 17, @@ -71,7 +73,7 @@ module.exports = [ { name: "chunkhash in chunkFilename ", output: { - filename: "bundle6.[hash].js", + filename: "bundle6.[fullhash].js", chunkFilename: "[id].bundle6.[chunkhash:7].js" }, amd: { @@ -83,7 +85,7 @@ module.exports = [ { name: "hash with length and chunkhash with length", output: { - filename: "bundle7.[hash:7].js", + filename: "bundle7.[fullhash:7].js", chunkFilename: "[id].bundle7.[chunkhash:7].js" }, target: "node", @@ -95,8 +97,8 @@ module.exports = [ { name: "hash with length in chunkFilename", output: { - filename: "bundle8.[hash].js", - chunkFilename: "[id].bundle8.[hash:7].js" + filename: "bundle8.[fullhash].js", + chunkFilename: "[id].bundle8.[fullhash:7].js" }, target: "node", amd: { @@ -107,7 +109,7 @@ module.exports = [ { name: "chunkhash with length in chunkFilename", output: { - filename: "bundle9.[hash].js", + filename: "bundle9.[fullhash].js", chunkFilename: "[id].bundle9.[chunkhash:7].js" }, target: "node", @@ -170,7 +172,7 @@ module.exports = [ output: { filename: "bundle14.[contenthash].js", chunkFilename: "[id].bundle14.[contenthash].js", - globalObject: "this" + globalObject: "window" }, target: "web", amd: { @@ -184,7 +186,7 @@ module.exports = [ output: { filename: "bundle15.[contenthash:7].js", chunkFilename: "[id].bundle15.[contenthash:7].js", - globalObject: "this" + globalObject: "window" }, target: "web", amd: { @@ -198,7 +200,7 @@ module.exports = [ output: { filename: "bundle16.[contenthash].js", chunkFilename: "[id].bundle16.[contenthash].js", - globalObject: "this" + globalObject: "self" }, target: "webworker", amd: { @@ -212,7 +214,7 @@ module.exports = [ output: { filename: "bundle17.[contenthash:7].js", chunkFilename: "[id].bundle17.[contenthash:7].js", - globalObject: "this" + globalObject: "self" }, target: "webworker", amd: { @@ -222,11 +224,11 @@ module.exports = [ } ]; -module.exports.forEach(function(options) { +for (const options of module.exports) { options.plugins = options.plugins || []; options.plugins.push( new webpack.DefinePlugin({ NAME: JSON.stringify(options.name) }) ); -}); +} diff --git a/test/configCases/ignore/checkContext/webpack.config.js b/test/configCases/ignore/checkContext/webpack.config.js index 77dce7ce93d..e7481af6cff 100644 --- a/test/configCases/ignore/checkContext/webpack.config.js +++ b/test/configCases/ignore/checkContext/webpack.config.js @@ -1,16 +1,14 @@ "use strict"; -const IgnorePlugin = require("../../../../lib/IgnorePlugin"); +const IgnorePlugin = require("../../../../").IgnorePlugin; +/** @type {import("../../../../").Configuration} */ module.exports = { entry: "./test.js", plugins: [ new IgnorePlugin({ - checkResource(resource) { - return /ignored-module/.test(resource); - }, - checkContext(context) { - return /folder-b/.test(context); + checkResource(resource, context) { + return /ignored-module/.test(resource) && /folder-b/.test(context); } }) ] diff --git a/test/configCases/ignore/checkResource-one-argument/webpack.config.js b/test/configCases/ignore/checkResource-one-argument/webpack.config.js index 1a59e01fd4e..557cdc49c5f 100644 --- a/test/configCases/ignore/checkResource-one-argument/webpack.config.js +++ b/test/configCases/ignore/checkResource-one-argument/webpack.config.js @@ -1,7 +1,8 @@ "use strict"; -const IgnorePlugin = require("../../../../lib/IgnorePlugin"); +const IgnorePlugin = require("../../../../").IgnorePlugin; +/** @type {import("../../../../").Configuration} */ module.exports = { entry: "./test.js", plugins: [ diff --git a/test/configCases/ignore/checkResource-two-arguments/webpack.config.js b/test/configCases/ignore/checkResource-two-arguments/webpack.config.js index 65ca0c931b5..e7481af6cff 100644 --- a/test/configCases/ignore/checkResource-two-arguments/webpack.config.js +++ b/test/configCases/ignore/checkResource-two-arguments/webpack.config.js @@ -1,7 +1,8 @@ "use strict"; -const IgnorePlugin = require("../../../../lib/IgnorePlugin"); +const IgnorePlugin = require("../../../../").IgnorePlugin; +/** @type {import("../../../../").Configuration} */ module.exports = { entry: "./test.js", plugins: [ diff --git a/test/configCases/ignore/compatibilityLayer/folder-a/normal-module.js b/test/configCases/ignore/compatibilityLayer/folder-a/normal-module.js deleted file mode 100644 index fbd72556b4f..00000000000 --- a/test/configCases/ignore/compatibilityLayer/folder-a/normal-module.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("./normal-module"); diff --git a/test/configCases/ignore/compatibilityLayer/folder-b/ignored-module.js b/test/configCases/ignore/compatibilityLayer/folder-b/ignored-module.js deleted file mode 100644 index 4e015a52c59..00000000000 --- a/test/configCases/ignore/compatibilityLayer/folder-b/ignored-module.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = "ignored"; diff --git a/test/configCases/ignore/compatibilityLayer/folder-b/normal-module.js b/test/configCases/ignore/compatibilityLayer/folder-b/normal-module.js deleted file mode 100644 index 83268eff2a0..00000000000 --- a/test/configCases/ignore/compatibilityLayer/folder-b/normal-module.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("./ignored-module"); diff --git a/test/configCases/ignore/compatibilityLayer/folder-b/only-context-match-require.js b/test/configCases/ignore/compatibilityLayer/folder-b/only-context-match-require.js deleted file mode 100644 index 29d7ef3b3dd..00000000000 --- a/test/configCases/ignore/compatibilityLayer/folder-b/only-context-match-require.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = "should be fine"; diff --git a/test/configCases/ignore/compatibilityLayer/folder-b/only-context-match.js b/test/configCases/ignore/compatibilityLayer/folder-b/only-context-match.js deleted file mode 100644 index 3625236da61..00000000000 --- a/test/configCases/ignore/compatibilityLayer/folder-b/only-context-match.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("./only-context-match-require"); diff --git a/test/configCases/ignore/compatibilityLayer/test.js b/test/configCases/ignore/compatibilityLayer/test.js deleted file mode 100644 index 97bfa83d013..00000000000 --- a/test/configCases/ignore/compatibilityLayer/test.js +++ /dev/null @@ -1,36 +0,0 @@ -/* globals it */ -"use strict"; - -// TODO: remove in webpack 5 -it("should ignore context modules that match resource regex and context (compat-layer)", function() { - const folderBContext = function(mod) { - require("./folder-b/" + mod); - }; - - expect(function() { - folderBContext("normal-module"); - }).toThrowError(); -}); - -it("should not ignore context modules that dont match the resource (compat-layer)", function() { - const folderBContext = function(mod) { - require("./folder-b/" + mod); - }; - - expect(function() { - folderBContext("only-context-match"); - }).not.toThrowError(); -}); - -it("should not ignore context modules that dont match the context (compat-layer)", function() { - const folderBContext = function(mod) { - require("./folder-a/" + mod); - }; - - expect(function() { - folderBContext("normal-module"); - }).not.toThrowError(); - expect(function() { - folderBContext("ignored-module"); - }).not.toThrowError(); -}); diff --git a/test/configCases/ignore/compatibilityLayer/webpack.config.js b/test/configCases/ignore/compatibilityLayer/webpack.config.js deleted file mode 100644 index 7151dfc88a2..00000000000 --- a/test/configCases/ignore/compatibilityLayer/webpack.config.js +++ /dev/null @@ -1,8 +0,0 @@ -"use strict"; - -const IgnorePlugin = require("../../../../lib/IgnorePlugin"); - -module.exports = { - entry: "./test.js", - plugins: [new IgnorePlugin(/ignored-module/, /folder-b/)] -}; diff --git a/test/configCases/ignore/compatibilityLayer/folder-a/ignored-module.js b/test/configCases/ignore/false-alias/ignored-module.js similarity index 100% rename from test/configCases/ignore/compatibilityLayer/folder-a/ignored-module.js rename to test/configCases/ignore/false-alias/ignored-module.js diff --git a/test/configCases/ignore/false-alias/normal-module.js b/test/configCases/ignore/false-alias/normal-module.js new file mode 100644 index 00000000000..f5f8a087f72 --- /dev/null +++ b/test/configCases/ignore/false-alias/normal-module.js @@ -0,0 +1 @@ +module.exports = "normal"; diff --git a/test/configCases/ignore/false-alias/test.js b/test/configCases/ignore/false-alias/test.js new file mode 100644 index 00000000000..9f4df4abad9 --- /dev/null +++ b/test/configCases/ignore/false-alias/test.js @@ -0,0 +1,14 @@ +/* globals it */ +"use strict"; + +it("should ignore ignored resources", function() { + expect(require("./ignored-module")).toEqual({}); +}); + +it("should ignore ignored resources", function() { + expect(require("ignored-module")).toEqual({}); +}); + +it("should not ignore resources that do not match", function() { + expect(require("./normal-module")).toBe("normal"); +}); diff --git a/test/configCases/ignore/false-alias/webpack.config.js b/test/configCases/ignore/false-alias/webpack.config.js new file mode 100644 index 00000000000..2ab026773a0 --- /dev/null +++ b/test/configCases/ignore/false-alias/webpack.config.js @@ -0,0 +1,12 @@ +"use strict"; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: "./test.js", + resolve: { + alias: { + "ignored-module": false, + "./ignored-module": false + } + } +}; diff --git a/test/configCases/ignore/multiple-with-externals/webpack.config.js b/test/configCases/ignore/multiple-with-externals/webpack.config.js index d1cc2d086a9..b8a3a734351 100644 --- a/test/configCases/ignore/multiple-with-externals/webpack.config.js +++ b/test/configCases/ignore/multiple-with-externals/webpack.config.js @@ -1,7 +1,8 @@ "use strict"; -const IgnorePlugin = require("../../../../lib/IgnorePlugin"); +const IgnorePlugin = require("../../../../").IgnorePlugin; +/** @type {import("../../../../").Configuration} */ module.exports = { entry: "./test.js", externals: { diff --git a/test/configCases/ignore/only-resource-context/webpack.config.js b/test/configCases/ignore/only-resource-context/webpack.config.js index 7f9ba4ea372..d0210ba1683 100644 --- a/test/configCases/ignore/only-resource-context/webpack.config.js +++ b/test/configCases/ignore/only-resource-context/webpack.config.js @@ -1,7 +1,8 @@ "use strict"; -const IgnorePlugin = require("../../../../lib/IgnorePlugin"); +const IgnorePlugin = require("../../../../").IgnorePlugin; +/** @type {import("../../../../").Configuration} */ module.exports = { entry: "./test.js", plugins: [ diff --git a/test/configCases/ignore/only-resource/webpack.config.js b/test/configCases/ignore/only-resource/webpack.config.js index 7f9ba4ea372..d0210ba1683 100644 --- a/test/configCases/ignore/only-resource/webpack.config.js +++ b/test/configCases/ignore/only-resource/webpack.config.js @@ -1,7 +1,8 @@ "use strict"; -const IgnorePlugin = require("../../../../lib/IgnorePlugin"); +const IgnorePlugin = require("../../../../").IgnorePlugin; +/** @type {import("../../../../").Configuration} */ module.exports = { entry: "./test.js", plugins: [ diff --git a/test/configCases/ignore/resource-and-context-contextmodule/test.js b/test/configCases/ignore/resource-and-context-contextmodule/test.js index 150d2d127e2..61d1a30584a 100644 --- a/test/configCases/ignore/resource-and-context-contextmodule/test.js +++ b/test/configCases/ignore/resource-and-context-contextmodule/test.js @@ -11,7 +11,7 @@ it("should ignore context modules that match resource regex and context", functi }).toThrowError(); }); -it("should not ignore context modules that dont match the resource", function() { +it("should not ignore context modules that do not match the resource", function() { const folderBContext = function(mod) { require("./folder-b/" + mod); }; @@ -21,7 +21,7 @@ it("should not ignore context modules that dont match the resource", function() }).not.toThrowError(); }); -it("should not ignore context modules that dont match the context", function() { +it("should not ignore context modules that do not match the context", function() { const folderBContext = function(mod) { require("./folder-a/" + mod); }; diff --git a/test/configCases/ignore/resource-and-context-contextmodule/webpack.config.js b/test/configCases/ignore/resource-and-context-contextmodule/webpack.config.js index 27fe5b63d87..5c9f6cbe2cc 100644 --- a/test/configCases/ignore/resource-and-context-contextmodule/webpack.config.js +++ b/test/configCases/ignore/resource-and-context-contextmodule/webpack.config.js @@ -1,7 +1,8 @@ "use strict"; -const IgnorePlugin = require("../../../../lib/IgnorePlugin"); +const IgnorePlugin = require("../../../../").IgnorePlugin; +/** @type {import("../../../../").Configuration} */ module.exports = { entry: "./test.js", plugins: [ diff --git a/test/configCases/ignore/resource-and-context/webpack.config.js b/test/configCases/ignore/resource-and-context/webpack.config.js index 27fe5b63d87..5c9f6cbe2cc 100644 --- a/test/configCases/ignore/resource-and-context/webpack.config.js +++ b/test/configCases/ignore/resource-and-context/webpack.config.js @@ -1,7 +1,8 @@ "use strict"; -const IgnorePlugin = require("../../../../lib/IgnorePlugin"); +const IgnorePlugin = require("../../../../").IgnorePlugin; +/** @type {import("../../../../").Configuration} */ module.exports = { entry: "./test.js", plugins: [ diff --git a/test/configCases/inner-graph/_helpers/createTestCases.js b/test/configCases/inner-graph/_helpers/createTestCases.js new file mode 100644 index 00000000000..25ba2ed7cc2 --- /dev/null +++ b/test/configCases/inner-graph/_helpers/createTestCases.js @@ -0,0 +1,39 @@ +/** @typedef {import("../../../../").Configuration} Configuration */ + +/** + * @param {Record }>} testCases + * @returns {Configuration[]} configurations + */ +module.exports = testCases => { + /** @type {Configuration[]} */ + const configs = []; + for (const name of Object.keys(testCases)) { + const testCase = testCases[name]; + testCase.name = name; + const entry = `../_helpers/entryLoader.js?${JSON.stringify(testCase)}!`; + /** @type {{ alias: Record }} */ + const resolve = { + alias: {} + }; + let i = 0; + for (const file of Object.keys(testCase.expect)) { + resolve.alias[file] = require.resolve("./inner-file") + "?" + i++; + } + configs.push({ + name: `${name} without module concatenation`, + mode: "production", + entry, + resolve, + optimization: { + concatenateModules: false + } + }); + configs.push({ + name: `${name} with module concatenation`, + mode: "production", + entry, + resolve + }); + } + return configs; +}; diff --git a/test/configCases/inner-graph/_helpers/entryLoader.js b/test/configCases/inner-graph/_helpers/entryLoader.js new file mode 100644 index 00000000000..7e129b81030 --- /dev/null +++ b/test/configCases/inner-graph/_helpers/entryLoader.js @@ -0,0 +1,25 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { + const { name, expect, usedExports } = JSON.parse(this.query.slice(1)); + return [ + `if (Math.random() < 0) require(${JSON.stringify( + `../_helpers/testModuleLoader?${JSON.stringify(usedExports)}!` + )});`, + "", + ...Object.keys(expect).map((source, i) => + [ + `import { __usedExports as usedExports_${i} } from ${JSON.stringify( + source + )};`, + `it("${name} should have the correct exports used for ${source}", () => {`, + `expect(usedExports_${i}).toEqual(${JSON.stringify( + Array.isArray(expect[source]) + ? expect[source].concat(["__usedExports"]).sort() + : expect[source] + )});`, + `});`, + "" + ].join("\n") + ) + ].join("\n"); +}; diff --git a/test/configCases/inner-graph/_helpers/inner-file.js b/test/configCases/inner-graph/_helpers/inner-file.js new file mode 100644 index 00000000000..717f4e7caee --- /dev/null +++ b/test/configCases/inner-graph/_helpers/inner-file.js @@ -0,0 +1,3 @@ +export { default } from "./unknown"; +export * from "./unknown"; +export const __usedExports = __webpack_exports_info__.usedExports; diff --git a/test/configCases/inner-graph/_helpers/loader.js b/test/configCases/inner-graph/_helpers/loader.js new file mode 100644 index 00000000000..ba5913610ff --- /dev/null +++ b/test/configCases/inner-graph/_helpers/loader.js @@ -0,0 +1,7 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = source => { + return [ + source, + `export const __usedExports = __webpack_exports_info__.usedExports;` + ].join("\n"); +}; diff --git a/test/configCases/inner-graph/_helpers/testModuleLoader.js b/test/configCases/inner-graph/_helpers/testModuleLoader.js new file mode 100644 index 00000000000..b6d54748dda --- /dev/null +++ b/test/configCases/inner-graph/_helpers/testModuleLoader.js @@ -0,0 +1,10 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { + const usedExports = JSON.parse(this.query.slice(1)); + return [ + `import { ${usedExports + .map(x => `${x} as export_${x}`) + .join(", ")} } from "./module";`, + `export default [${usedExports.map(x => `export_${x}`).join(", ")}];` + ].join("\n"); +}; diff --git a/test/configCases/inner-graph/_helpers/unknown.js b/test/configCases/inner-graph/_helpers/unknown.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/inner-graph/altaskitButton/module.js b/test/configCases/inner-graph/altaskitButton/module.js new file mode 100644 index 00000000000..567753011d2 --- /dev/null +++ b/test/configCases/inner-graph/altaskitButton/module.js @@ -0,0 +1,227 @@ +/** + * Copy from @atlaskit/button + */ + +import _extends from 'babel-runtime/helpers/extends'; +import _Object$getPrototypeOf from 'babel-runtime/core-js/object/get-prototype-of'; +import _classCallCheck from 'babel-runtime/helpers/classCallCheck'; +import _createClass from 'babel-runtime/helpers/createClass'; +import _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn'; +import _inherits from 'babel-runtime/helpers/inherits'; +import _taggedTemplateLiteral from 'babel-runtime/helpers/taggedTemplateLiteral'; + +var _templateObject = _taggedTemplateLiteral(['\n ', ';\n'], ['\n ', ';\n']), + _templateObject2 = _taggedTemplateLiteral(['\n a& {\n ', ';\n }\n'], ['\n a& {\n ', ';\n }\n']), + _templateObject3 = _taggedTemplateLiteral(['&,a&,&:hover,&:active,&:focus{', '}'], ['&,a&,&:hover,&:active,&:focus{', '}']); + +import React, { Component } from 'react'; +import styled from 'styled-components'; +import { withAnalyticsEvents, withAnalyticsContext } from '@atlaskit/analytics-next'; + +import { name, version } from '../../package.json'; +import withDeprecationWarnings from './withDeprecationWarnings'; +import getButtonProps from './getButtonProps'; +import CustomComponentProxy from './CustomComponentProxy'; +import getButtonStyles from '../styled/getButtonStyles'; +import ButtonContent from '../styled/ButtonContent'; +import ButtonWrapper from '../styled/ButtonWrapper'; +import IconWrapper from '../styled/IconWrapper'; +import LoadingSpinner from '../styled/LoadingSpinner'; + +var StyledButton = styled.button(_templateObject, getButtonStyles); +StyledButton.displayName = 'StyledButton'; + +// Target the
    here to override a:hover specificity. +var StyledLink = styled.a(_templateObject2, getButtonStyles); +StyledLink.displayName = 'StyledLink'; + +var StyledSpan = styled.span(_templateObject, getButtonStyles); +StyledSpan.displayName = 'StyledSpan'; + +var createStyledComponent = function createStyledComponent() { + // Override pseudo-state specificity. + // This is necessary because we don't know what DOM element the custom component will render. + var component = styled( + //CustomComponentProxy is absolutely valid here, so this seems a + // problem with styled-components flow definitions + // $FlowFixMe + CustomComponentProxy)(_templateObject3, getButtonStyles); + component.displayName = 'StyledCustomComponent'; + return component; +}; + +var Button = function (_Component) { + _inherits(Button, _Component); + + function Button() { + var _ref; + + var _temp, _this, _ret; + + _classCallCheck(this, Button); + + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Button.__proto__ || _Object$getPrototypeOf(Button)).call.apply(_ref, [this].concat(args))), _this), _this.state = { + isActive: false, + isFocus: false, + isHover: false + }, _this.customComponent = null, _this.onMouseEnter = function () { + return _this.setState({ isHover: true }); + }, _this.onMouseLeave = function () { + return _this.setState({ isHover: false, isActive: false }); + }, _this.onMouseDown = function (e) { + e.preventDefault(); + _this.setState({ isActive: true }); + }, _this.onMouseUp = function () { + return _this.setState({ isActive: false }); + }, _this.onFocus = function (event) { + _this.setState({ isFocus: true }); + if (_this.props.onFocus) { + _this.props.onFocus(event); + } + }, _this.onBlur = function (event) { + _this.setState({ isFocus: false }); + if (_this.props.onBlur) { + _this.props.onBlur(event); + } + }, _this.onInnerClick = function (e) { + if (_this.props.isDisabled) { + e.stopPropagation(); + } + return true; + }, _this.getInnerRef = function (ref) { + _this.button = ref; + + if (_this.props.innerRef) _this.props.innerRef(ref); + }, _temp), _possibleConstructorReturn(_this, _ret); + } + + _createClass(Button, [{ + key: 'componentWillReceiveProps', + value: function componentWillReceiveProps(nextProps) { + if (this.props.component !== nextProps.component) { + delete this.customComponent; + } + } + }, { + key: 'componentDidMount', + value: function componentDidMount() { + if (this.props.autoFocus && this.button) { + this.button.focus(); + } + } + + /* Swallow click events when the button is disabled to prevent inner child clicks bubbling up */ + + }, { + key: 'getStyledComponent', + value: function getStyledComponent() { + if (this.props.component) { + if (!this.customComponent) { + this.customComponent = createStyledComponent(); + } + return this.customComponent; + } + + if (this.props.href) { + return this.props.isDisabled ? StyledSpan : StyledLink; + } + + return StyledButton; + } + }, { + key: 'render', + value: function render() { + var _props = this.props, + children = _props.children, + iconBefore = _props.iconBefore, + iconAfter = _props.iconAfter, + isLoading = _props.isLoading, + shouldFitContainer = _props.shouldFitContainer, + spacing = _props.spacing, + appearance = _props.appearance, + isSelected = _props.isSelected, + isDisabled = _props.isDisabled; + + + var buttonProps = getButtonProps(this); + var StyledComponent = this.getStyledComponent(); + + var iconIsOnlyChild = !!(iconBefore && !iconAfter && !children || iconAfter && !iconBefore && !children); + + return React.createElement( + StyledComponent, + _extends({ innerRef: this.getInnerRef }, buttonProps), + React.createElement( + ButtonWrapper, + { onClick: this.onInnerClick, fit: !!shouldFitContainer }, + isLoading ? React.createElement(LoadingSpinner, { + spacing: spacing, + appearance: appearance, + isSelected: isSelected, + isDisabled: isDisabled + }) : null, + iconBefore ? React.createElement( + IconWrapper, + { + isLoading: isLoading, + spacing: buttonProps.spacing, + isOnlyChild: iconIsOnlyChild + }, + iconBefore + ) : null, + children ? React.createElement( + ButtonContent, + { + isLoading: isLoading, + followsIcon: !!iconBefore, + spacing: buttonProps.spacing + }, + children + ) : null, + iconAfter ? React.createElement( + IconWrapper, + { + isLoading: isLoading, + spacing: buttonProps.spacing, + isOnlyChild: iconIsOnlyChild + }, + iconAfter + ) : null + ) + ); + } + }]); + + return Button; +}(Component); + +Button.defaultProps = { + appearance: 'default', + isDisabled: false, + isSelected: false, + isLoading: false, + spacing: 'default', + type: 'button', + shouldFitContainer: false +}; + +export var ButtonBase = Button; + +export default withAnalyticsContext({ + component: 'button', + package: name, + version: version +})(withAnalyticsEvents({ + onClick: function onClick(createAnalyticsEvent) { + var consumerEvent = createAnalyticsEvent({ + action: 'click' + }); + consumerEvent.clone().fire('atlaskit'); + + return consumerEvent; + } +})(withDeprecationWarnings(Button))); \ No newline at end of file diff --git a/test/configCases/inner-graph/altaskitButton/webpack.config.js b/test/configCases/inner-graph/altaskitButton/webpack.config.js new file mode 100644 index 00000000000..080c4be2894 --- /dev/null +++ b/test/configCases/inner-graph/altaskitButton/webpack.config.js @@ -0,0 +1,57 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + "babel-runtime/helpers/extends": ["default"], + "babel-runtime/core-js/object/get-prototype-of": ["default"], + "babel-runtime/helpers/classCallCheck": ["default"], + "babel-runtime/helpers/createClass": ["default"], + "babel-runtime/helpers/possibleConstructorReturn": ["default"], + "babel-runtime/helpers/inherits": ["default"], + "babel-runtime/helpers/taggedTemplateLiteral": ["default"], + react: ["Component", "default"], + "styled-components": ["default"], + "@atlaskit/analytics-next": [ + "withAnalyticsContext", + "withAnalyticsEvents" + ], + "../../package.json": ["name", "version"], + "./withDeprecationWarnings": ["default"], + "./getButtonProps": ["default"], + "../styled/getButtonStyles": ["default"], + "../styled/ButtonContent": ["default"], + "../styled/ButtonWrapper": ["default"], + "../styled/IconWrapper": ["default"], + "../styled/LoadingSpinner": ["default"], + "./CustomComponentProxy": ["default"] + } + }, + all: { + usedExports: ["default", "ButtonBase"], + expect: { + "babel-runtime/helpers/extends": ["default"], + "babel-runtime/core-js/object/get-prototype-of": ["default"], + "babel-runtime/helpers/classCallCheck": ["default"], + "babel-runtime/helpers/createClass": ["default"], + "babel-runtime/helpers/possibleConstructorReturn": ["default"], + "babel-runtime/helpers/inherits": ["default"], + "babel-runtime/helpers/taggedTemplateLiteral": ["default"], + react: ["Component", "default"], + "styled-components": ["default"], + "@atlaskit/analytics-next": [ + "withAnalyticsContext", + "withAnalyticsEvents" + ], + "../../package.json": ["name", "version"], + "./withDeprecationWarnings": ["default"], + "./getButtonProps": ["default"], + "../styled/getButtonStyles": ["default"], + "../styled/ButtonContent": ["default"], + "../styled/ButtonWrapper": ["default"], + "../styled/IconWrapper": ["default"], + "../styled/LoadingSpinner": ["default"], + "./CustomComponentProxy": ["default"] + } + } +}); diff --git a/test/configCases/inner-graph/basic/module.js b/test/configCases/inner-graph/basic/module.js new file mode 100644 index 00000000000..98a351b171b --- /dev/null +++ b/test/configCases/inner-graph/basic/module.js @@ -0,0 +1,11 @@ +import { equal as eq, deepEqual } from "./assert"; + +export function myFunction() { + function it() { + eq(1, arguments[0]); + } + deepEqual(1, 1); + it(); +} + +const bb = eq(); diff --git a/test/configCases/inner-graph/basic/webpack.config.js b/test/configCases/inner-graph/basic/webpack.config.js new file mode 100644 index 00000000000..3c720109f98 --- /dev/null +++ b/test/configCases/inner-graph/basic/webpack.config.js @@ -0,0 +1,15 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + "./assert": ["equal"] + } + }, + myFunction: { + usedExports: ["myFunction"], + expect: { + "./assert": ["deepEqual", "equal"] + } + } +}); diff --git a/test/configCases/inner-graph/blockScopes/module.js b/test/configCases/inner-graph/blockScopes/module.js new file mode 100644 index 00000000000..613b551ca77 --- /dev/null +++ b/test/configCases/inner-graph/blockScopes/module.js @@ -0,0 +1,47 @@ +import { A, B, C1, C2, D1, D2, E1, E2, E3, F, G } from "./test"; + +export { a, b, c, d }; + +if (Math.random() > 0.5) { + var a = () => A; + let b = () => B; +} + +let b; + +var c = () => C1; +couldCallExportC(); +var c = () => C2; +couldCallExportC(); + +while (Math.random() > 0.5) { + let d = () => D1; +} + +while (Math.random() > 0.5) { + var d = () => D2; +} + +while (Math.random() > 0.5) { + let d = () => D1; +} + +if (false) { + E1(); +} + +export var e = true ? E2 : E3; + +export { f, g }; + +if (true) { + let inner = () => F; + + var f = () => inner(); +} + +if (true) { + const inner = () => G; + + var g = () => inner(); +} diff --git a/test/configCases/inner-graph/blockScopes/webpack.config.js b/test/configCases/inner-graph/blockScopes/webpack.config.js new file mode 100644 index 00000000000..6df8a488b0b --- /dev/null +++ b/test/configCases/inner-graph/blockScopes/webpack.config.js @@ -0,0 +1,51 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + "./test": [] + } + }, + a: { + usedExports: ["a"], + expect: { + "./test": ["A"] + } + }, + b: { + usedExports: ["b"], + expect: { + "./test": [] + } + }, + c: { + usedExports: ["c"], + expect: { + "./test": ["C1", "C2"] + } + }, + d: { + usedExports: ["d"], + expect: { + "./test": ["D2"] + } + }, + e: { + usedExports: ["e"], + expect: { + "./test": ["E2"] + } + }, + f: { + usedExports: ["f"], + expect: { + "./test": ["F"] + } + }, + g: { + usedExports: ["g"], + expect: { + "./test": ["G"] + } + } +}); diff --git a/test/configCases/inner-graph/class/module.js b/test/configCases/inner-graph/class/module.js new file mode 100644 index 00000000000..244e9ee77e2 --- /dev/null +++ b/test/configCases/inner-graph/class/module.js @@ -0,0 +1,66 @@ +import { + deepEqual, + equal, + strictEqual, + notEqual, + maybeEqual, + definiteEqual, + getNameA, + getNameB +} from "./assert"; + +function fun1() { + deepEqual(1, 1); +} + +function fun2() { + fun1(); +} + +function fun3() { + fun2(); +} + +function fun4() { + fun3(); +} + +export class ExportCls1 { + constructor() { + fun4(); + } +} + +export class ExportCls2 { + add() { + this.name = equal; + } +} + +export class ExportCls3 { + static add = () => { + strictEqual(); + }; +} + +export class ExportCls4 { + static name = notEqual; +} + +export class ExportCls5a { + static name = getNameA(); +} + +export class ExportCls5b { + static [getNameB()] = "name"; +} + +export class ExportCls6 { + add = () => { + maybeEqual(); + }; +} + +export class ExportCls7 { + add = definiteEqual(); +} diff --git a/test/configCases/inner-graph/class/test.filter.js b/test/configCases/inner-graph/class/test.filter.js new file mode 100644 index 00000000000..b9bdf244d0d --- /dev/null +++ b/test/configCases/inner-graph/class/test.filter.js @@ -0,0 +1,5 @@ +const supportsClassFields = require("../../../helpers/supportsClassFields"); + +module.exports = function (config) { + return supportsClassFields(); +}; diff --git a/test/configCases/inner-graph/class/webpack.config.js b/test/configCases/inner-graph/class/webpack.config.js new file mode 100644 index 00000000000..ae7268a990e --- /dev/null +++ b/test/configCases/inner-graph/class/webpack.config.js @@ -0,0 +1,76 @@ +const createTestCases = require("../_helpers/createTestCases"); +const base = ["getNameA", "getNameB"]; +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + "./assert": [...base] + } + }, + ExportCls1: { + usedExports: ["ExportCls1"], + expect: { + "./assert": [...base, "deepEqual"] + } + }, + ExportCls2: { + usedExports: ["ExportCls2"], + expect: { + "./assert": [...base, "equal"] + } + }, + ExportCls3: { + usedExports: ["ExportCls3"], + expect: { + "./assert": [...base, "strictEqual"] + } + }, + ExportCls4: { + usedExports: ["ExportCls4"], + expect: { + "./assert": [...base, "notEqual"] + } + }, + ExportCls6: { + usedExports: ["ExportCls6"], + expect: { + "./assert": [...base, "maybeEqual"] + } + }, + ExportCls7: { + usedExports: ["ExportCls7"], + expect: { + "./assert": [...base, "definiteEqual"] + } + }, + // eslint-disable-next-line camelcase + ExportCls1_2: { + usedExports: ["ExportCls1", "ExportCls2"], + expect: { + "./assert": [...base, "deepEqual", "equal"] + } + }, + all: { + usedExports: [ + "ExportCls1", + "ExportCls2", + "ExportCls3", + "ExportCls4", + "ExportCls5a", + "ExportCls5b", + "ExportCls6", + "ExportCls7" + ], + expect: { + "./assert": [ + ...base, + "deepEqual", + "equal", + "strictEqual", + "notEqual", + "maybeEqual", + "definiteEqual" + ] + } + } +}); diff --git a/test/configCases/inner-graph/const/module.js b/test/configCases/inner-graph/const/module.js new file mode 100644 index 00000000000..e3c28697549 --- /dev/null +++ b/test/configCases/inner-graph/const/module.js @@ -0,0 +1,21 @@ +import { im1, im2 } from "any"; + +const exp1 = function() { + console.log(im1); +}; + +const exp2 = () => { + console.log(im2); +}; + +export const exp4 = () => { + exp2(); +}; + +export const expCls = class { + constructor() { + exp1(); + } +}; + +export { exp1, exp2 }; diff --git a/test/configCases/inner-graph/const/webpack.config.js b/test/configCases/inner-graph/const/webpack.config.js new file mode 100644 index 00000000000..a8a883d5302 --- /dev/null +++ b/test/configCases/inner-graph/const/webpack.config.js @@ -0,0 +1,39 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + any: [] + } + }, + exp1: { + usedExports: ["exp1"], + expect: { + any: ["im1"] + } + }, + exp2: { + usedExports: ["exp2"], + expect: { + any: ["im2"] + } + }, + expCls: { + usedExports: ["expCls"], + expect: { + any: ["im1"] + } + }, + exp4: { + usedExports: ["exp4"], + expect: { + any: ["im2"] + } + }, + all: { + usedExports: ["exp1", "exp2", "exp4", "expCls"], + expect: { + any: ["im1", "im2"] + } + } +}); diff --git a/test/configCases/inner-graph/defaultArrow/module.js b/test/configCases/inner-graph/defaultArrow/module.js new file mode 100644 index 00000000000..53142481fe4 --- /dev/null +++ b/test/configCases/inner-graph/defaultArrow/module.js @@ -0,0 +1,5 @@ +import { fun1, fun2 } from "any"; + +export default () => { + fun1(); +}; diff --git a/test/configCases/inner-graph/defaultArrow/webpack.config.js b/test/configCases/inner-graph/defaultArrow/webpack.config.js new file mode 100644 index 00000000000..d72974a17c1 --- /dev/null +++ b/test/configCases/inner-graph/defaultArrow/webpack.config.js @@ -0,0 +1,15 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + any: [] + } + }, + exp1: { + usedExports: ["default"], + expect: { + any: ["fun1"] + } + } +}); diff --git a/test/configCases/inner-graph/defaultClass/module.js b/test/configCases/inner-graph/defaultClass/module.js new file mode 100644 index 00000000000..87f3755c4bd --- /dev/null +++ b/test/configCases/inner-graph/defaultClass/module.js @@ -0,0 +1,11 @@ +import { uniq } from "lodash-es"; + +export default class SomeClass { + message(...args) { + console.log(...args); + } + + unusedUniq(array) { + uniq(array); + } +} diff --git a/test/configCases/inner-graph/defaultClass/webpack.config.js b/test/configCases/inner-graph/defaultClass/webpack.config.js new file mode 100644 index 00000000000..1964d420598 --- /dev/null +++ b/test/configCases/inner-graph/defaultClass/webpack.config.js @@ -0,0 +1,15 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + "lodash-es": [] + } + }, + all: { + usedExports: ["default"], + expect: { + "lodash-es": ["uniq"] + } + } +}); diff --git a/test/configCases/inner-graph/defaultExpression/module.js b/test/configCases/inner-graph/defaultExpression/module.js new file mode 100644 index 00000000000..32a818afc75 --- /dev/null +++ b/test/configCases/inner-graph/defaultExpression/module.js @@ -0,0 +1,3 @@ +import { var1, fun2 } from "any"; + +export default var1 + fun2(); diff --git a/test/configCases/inner-graph/defaultExpression/webpack.config.js b/test/configCases/inner-graph/defaultExpression/webpack.config.js new file mode 100644 index 00000000000..55deb757e9e --- /dev/null +++ b/test/configCases/inner-graph/defaultExpression/webpack.config.js @@ -0,0 +1,15 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + any: ["fun2", "var1"] + } + }, + all: { + usedExports: ["default"], + expect: { + any: ["fun2", "var1"] + } + } +}); diff --git a/test/configCases/inner-graph/defaultFunction/module.js b/test/configCases/inner-graph/defaultFunction/module.js new file mode 100644 index 00000000000..71ce87520dc --- /dev/null +++ b/test/configCases/inner-graph/defaultFunction/module.js @@ -0,0 +1,5 @@ +import { fun1, fun2 } from "any"; + +export default function() { + fun1(); +} diff --git a/test/configCases/inner-graph/defaultFunction/webpack.config.js b/test/configCases/inner-graph/defaultFunction/webpack.config.js new file mode 100644 index 00000000000..d6b1ee12a9f --- /dev/null +++ b/test/configCases/inner-graph/defaultFunction/webpack.config.js @@ -0,0 +1,15 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + any: [] + } + }, + default: { + usedExports: ["default"], + expect: { + any: ["fun1"] + } + } +}); diff --git a/test/configCases/inner-graph/defaultFunctionExpression/module.js b/test/configCases/inner-graph/defaultFunctionExpression/module.js new file mode 100644 index 00000000000..cb4988d7cfa --- /dev/null +++ b/test/configCases/inner-graph/defaultFunctionExpression/module.js @@ -0,0 +1,5 @@ +import { fun1, fun2 } from "any"; + +export default (function() { + fun1(); +}); diff --git a/test/configCases/inner-graph/defaultFunctionExpression/webpack.config.js b/test/configCases/inner-graph/defaultFunctionExpression/webpack.config.js new file mode 100644 index 00000000000..d6b1ee12a9f --- /dev/null +++ b/test/configCases/inner-graph/defaultFunctionExpression/webpack.config.js @@ -0,0 +1,15 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + any: [] + } + }, + default: { + usedExports: ["default"], + expect: { + any: ["fun1"] + } + } +}); diff --git a/test/configCases/inner-graph/defaultId/module.js b/test/configCases/inner-graph/defaultId/module.js new file mode 100644 index 00000000000..59d70ff3a84 --- /dev/null +++ b/test/configCases/inner-graph/defaultId/module.js @@ -0,0 +1,7 @@ +import { fun1, fun2 } from "any"; + +function fun3() { + fun1(); +} + +export default fun3; diff --git a/test/configCases/inner-graph/defaultId/webpack.config.js b/test/configCases/inner-graph/defaultId/webpack.config.js new file mode 100644 index 00000000000..d6b1ee12a9f --- /dev/null +++ b/test/configCases/inner-graph/defaultId/webpack.config.js @@ -0,0 +1,15 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + any: [] + } + }, + default: { + usedExports: ["default"], + expect: { + any: ["fun1"] + } + } +}); diff --git a/test/configCases/inner-graph/defaultNamedFunction/module.js b/test/configCases/inner-graph/defaultNamedFunction/module.js new file mode 100644 index 00000000000..cf0401ee216 --- /dev/null +++ b/test/configCases/inner-graph/defaultNamedFunction/module.js @@ -0,0 +1,5 @@ +import { fun1, fun2 } from "any"; + +export default function withName() { + fun1(); +} diff --git a/test/configCases/inner-graph/defaultNamedFunction/webpack.config.js b/test/configCases/inner-graph/defaultNamedFunction/webpack.config.js new file mode 100644 index 00000000000..d6b1ee12a9f --- /dev/null +++ b/test/configCases/inner-graph/defaultNamedFunction/webpack.config.js @@ -0,0 +1,15 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + any: [] + } + }, + default: { + usedExports: ["default"], + expect: { + any: ["fun1"] + } + } +}); diff --git a/test/configCases/inner-graph/defaultNamedFunctionExpression/module.js b/test/configCases/inner-graph/defaultNamedFunctionExpression/module.js new file mode 100644 index 00000000000..59a0406ac66 --- /dev/null +++ b/test/configCases/inner-graph/defaultNamedFunctionExpression/module.js @@ -0,0 +1,5 @@ +import { fun1, fun2 } from "any"; + +export default (function withName() { + fun1(); +}); diff --git a/test/configCases/inner-graph/defaultNamedFunctionExpression/webpack.config.js b/test/configCases/inner-graph/defaultNamedFunctionExpression/webpack.config.js new file mode 100644 index 00000000000..d6b1ee12a9f --- /dev/null +++ b/test/configCases/inner-graph/defaultNamedFunctionExpression/webpack.config.js @@ -0,0 +1,15 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + any: [] + } + }, + default: { + usedExports: ["default"], + expect: { + any: ["fun1"] + } + } +}); diff --git a/test/configCases/inner-graph/eval-bailout/module.js b/test/configCases/inner-graph/eval-bailout/module.js new file mode 100644 index 00000000000..ce9787c2da5 --- /dev/null +++ b/test/configCases/inner-graph/eval-bailout/module.js @@ -0,0 +1,15 @@ +import { a, b, c } from "./test"; + +export function x() { + a(); +} + +export function y() { + b(); + eval("x()"); +} + +export function z() { + c(); + y(); +} diff --git a/test/configCases/inner-graph/eval-bailout/webpack.config.js b/test/configCases/inner-graph/eval-bailout/webpack.config.js new file mode 100644 index 00000000000..5953593079c --- /dev/null +++ b/test/configCases/inner-graph/eval-bailout/webpack.config.js @@ -0,0 +1,27 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + "./test": [] + } + }, + nonEval: { + usedExports: ["x"], + expect: { + "./test": ["a"] + } + }, + directEval: { + usedExports: ["y"], + expect: { + "./test": ["a", "b", "c"] + } + }, + indirectEval: { + usedExports: ["z"], + expect: { + "./test": ["a", "b", "c"] + } + } +}); diff --git a/test/configCases/inner-graph/export/module.js b/test/configCases/inner-graph/export/module.js new file mode 100644 index 00000000000..0de8b986b80 --- /dev/null +++ b/test/configCases/inner-graph/export/module.js @@ -0,0 +1,3 @@ +export { default } from "./components/Button"; +export { default as ButtonGroup } from "./components/ButtonGroup"; +export { themeNamespace } from "./theme"; diff --git a/test/configCases/inner-graph/export/webpack.config.js b/test/configCases/inner-graph/export/webpack.config.js new file mode 100644 index 00000000000..f4530e5b190 --- /dev/null +++ b/test/configCases/inner-graph/export/webpack.config.js @@ -0,0 +1,19 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + "./components/Button": [], + "./components/ButtonGroup": [], + "./theme": [] + } + }, + all: { + usedExports: ["default", "ButtonGroup", "themeNamespace"], + expect: { + "./components/Button": ["default"], + "./components/ButtonGroup": ["default"], + "./theme": ["themeNamespace"] + } + } +}); diff --git a/test/configCases/inner-graph/importAll/module.js b/test/configCases/inner-graph/importAll/module.js new file mode 100644 index 00000000000..81dad698c44 --- /dev/null +++ b/test/configCases/inner-graph/importAll/module.js @@ -0,0 +1,16 @@ +/** + * @fileoverview This file was generated by the Angular template compiler. Do not edit. + * + * @suppress {suspiciousCode,uselessCode,missingProperties,missingOverride,checkTypes} + * tslint:disable + */ +import * as i0 from "@angular/core"; +import * as i1 from "./app.component"; +var styles_AppComponent = []; +var RenderType_AppComponent = i0.ɵcrt({ encapsulation: 2, styles: styles_AppComponent, data: {} }); +export { RenderType_AppComponent as RenderType_AppComponent }; +export function View_AppComponent_0(_l) { return i0.ɵvid(0, [(_l()(), i0.ɵeld(0, 0, null, null, 1, "h1", [], null, null, null, null, null)), (_l()(), i0.ɵted(-1, null, ["Hello World"]))], null, null); } +export function View_AppComponent_Host_0(_l) { return i0.ɵvid(0, [(_l()(), i0.ɵeld(0, 0, null, null, 1, "app-root", [], null, null, null, View_AppComponent_0, RenderType_AppComponent)), i0.ɵdid(1, 49152, null, 0, i1.AppComponent, [], null, null)], null, null); } +var AppComponentNgFactory = i0.ɵccf("app-root", i1.AppComponent, View_AppComponent_Host_0, {}, {}, []); +export { AppComponentNgFactory as AppComponentNgFactory }; +//# sourceMappingURL=app.component.ngfactory.js.map \ No newline at end of file diff --git a/test/configCases/inner-graph/importAll/webpack.config.js b/test/configCases/inner-graph/importAll/webpack.config.js new file mode 100644 index 00000000000..ef8c4392478 --- /dev/null +++ b/test/configCases/inner-graph/importAll/webpack.config.js @@ -0,0 +1,17 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + "@angular/core": ["ɵccf", "ɵcrt", "ɵdid", "ɵeld", "ɵted", "ɵvid"], + "./app.component": ["AppComponent"] + } + }, + AppComponentNgFactory: { + usedExports: ["AppComponentNgFactory"], + expect: { + "@angular/core": ["ɵccf", "ɵcrt", "ɵdid", "ɵeld", "ɵted", "ɵvid"], + "./app.component": ["AppComponent"] + } + } +}); diff --git a/test/configCases/inner-graph/issue-11678/module.js b/test/configCases/inner-graph/issue-11678/module.js new file mode 100644 index 00000000000..aef4899802b --- /dev/null +++ b/test/configCases/inner-graph/issue-11678/module.js @@ -0,0 +1,3105 @@ +import { ResizeObserver as RO } from "resize-observer"; +import * as employeeData from "Source_Data/employee"; +import * as servicesData from "Source_Data/services"; +import * as SplitViewPage from "Source_Framework/splitview/page"; +import * as SplitViewMenu from "Source_Framework/splitview/menu"; +import { + TC as pageTC, + getDeleteDialogText +} from "Source_Framework/splitview/text"; +import * as UiListPicker from "Source_Framework/uilistpicker/UiListPicker"; +import { CookieStorage } from "Source_ODS/cookiestorage"; +import { removeTextEditor } from "Source_Framework/uirichtextedit"; +import { UiElementCheckbox, UiElementRadio } from "Source_Framework/uielement"; +import { switchButtonIcon } from "Source_ODS/UiButton/icon"; +import { setButtonText } from "Source_ODS/UiButton/text"; +import { replacePage } from "Source_Framework/pagelinks"; +import { getSession } from "Source_ODS/ods"; +import { UiButton, UiSelectButton } from "Source_ODS/UiButton"; +import { buttonClasses } from "Source_Framework/defaultButtons"; +import { UiForm } from "Source_Framework/uiform"; +import * as Breadcrumb from "Source_Framework/breadcrumb"; +import * as _ from "Source_ODS/lodash"; +import { DomElement } from "Source_ODS/DomElement"; +import { getUrlParameter, setUrlParameter } from "Source_ODS/url"; +import { addFixedTooltip } from "Source_ODS/tooltip"; +import { showLoadingWarning, showWarningDialog } from "Source_ODS/ui"; +import { checkIsNonemptyObject, isString, isUndefined } from "Source_ODS/types"; +import { UiDialog, confirmDialog } from "Source_ODS/UiDialog"; +import { ModuleNameEnum } from "Source_Framework/common/moduleDispatcher"; +import { showEmployeeAssignDialog } from "Source_Framework/common/employeeassignment"; +import { buttonPdfPreview } from "Source_Framework/common/pdf_preview"; +import { createTaskProgress } from "Source_Framework/common/taskprogress"; +import { CALLBACK_EVENTS } from "Source_Framework/uitable"; +import { + getFilterPara, + saveUniversalTableLayout, + loadDefaultLayout, + saveDefaultLayoutForAgency +} from "Source_Framework/backend/universalData"; +import { selectColumns } from "Source_Framework/common/columnsDialog"; +import { STATUS } from "Source_Framework/backend/jsonData"; +import { + buttonStatusChange, + HeaderDataEnum +} from "Source_Framework/common/statuschange"; +import { genericJobSelectionDialog } from "Source_Framework/common/las_mod_jobselection"; +import { TC } from "./text"; +import { BEC } from "./bec"; +import { POSITIONTYPES } from "./positionTypes"; +import { SETTINGS } from "./settings"; +import * as preferences from "./preferences"; +import * as privileges from "./privileges"; +import * as buttons from "./buttons"; +import * as form from "./form"; +import * as formHelper from "./formHelper"; +import { createTableWidget, createTableWidgetForManualSort } from "./table"; +import { setTechnicalTextButton } from "./techText"; +import { openDialogForNewPositionSi } from "./addPositionToSi"; +import { buttonInsertService, insertServiceDialog } from "./ciPosFromJob"; +import { shiftPosition } from "./shiftPosition"; +import { autoSumsDialog } from "./autoSums"; +import { defineLayoutDialog } from "./defineLayout"; +import { buttonInsertFromTemplate, setInsertData } from "./insertFromTemplate"; +import { buttonMove, movePosition } from "./movePosition"; +import { + buttonCopySelect, + duplicatePosition, + copyPosition, + buttonCopyFromOrderToJob, + copyFromOrderToJob +} from "./copy"; +import { convertData } from "./save"; +import { buttonCreateOrder, onCreateOrder } from "./createOrder"; +import { + buttonConnectOrderPos, + buttonCopyJobToOrderPos, + jobToOrderPos +} from "./orderPosFromJobPos"; +import { showNchInfoDialog } from "./nchInfoDialog"; +import { urlGotoSiFromJobService } from "Source_Modules/las_mod_siheader/url"; +import { TITLE as SITITLE } from "Source_Modules/las_mod_siheader/bec"; +import { TITLE as CETITLE } from "Source_Modules/las_mod_ceheader/bec"; +import { TITLE as ORDERTITLE } from "Source_Modules/las_mod_order/bec"; +import { TITLE as CITITLE } from "Source_Modules/las_mod_ciheader/bec"; + +const _positionSettings = { + parent: { + settings: {}, + headerStatus: "" + }, + settings: { + [SETTINGS.CREATABLE]: false, + [SETTINGS.DELETABLE]: false + } + }, + _tableOverlayClass = ".tableintableoverlay", + _tableOverlayOffsetLeft = 7, + _showTableInElement = ".tablecont", + _pluginObj = {}; +const resizeObserverInstance = new RO(entries => { + entries.forEach(entry => { + const parentWidth = entry.contentRect.width; + const parentheight = entry.contentRect.height; + const newWidth = parentWidth - _tableOverlayOffsetLeft + 6; + const newHeight = parentheight; + const overlayElement = $(_tableOverlayClass); + overlayElement.css({ width: newWidth, height: newHeight }); + overlayElement.find("#positiontable").css({ + width: newWidth - 2, + height: + parentheight - + overlayElement.find(".title").getHeight() - + _tableOverlayOffsetLeft + }); + }); +}); +let _options; +let _parentModuleSettings, + _parentTableSelection, + _parentTableDataId; +let _isFormInDialog = false, + _isFormInDialogSelector = null, + _isFormInDialogJobPK = null; +let _staticData, + _generalDataEmplLists, + _tableObject, + _tableData, + _tableSelectionPosNo = null, + _tableSelectionJobNo = null, + _tableContainerId = "", + _previousTableTitle = "", + _formIdName, + _formObject, + _formData, + _formEvent, + _isNewDataset = false, + progressbar, + addedBreadcrumbId; +let _tableLayoutInfo = { + moduleName: "", + privAllAgencies: false, + privSaveGlobally: false +}; +let _reloadTable; +let prevRows = null; +let triggerSelectionChangeEvent = true; +async function onReloadTable() { + await _updateTableContent(); +} +async function onExport() { + await _tableObject.toExcel(); +} +async function onConnectPosition() { + const hPk = getPKfromModule(); + const ok = await openDialogForNewPositionSi( + { siBookId: hPk.idSiBook, siHeaderId: hPk.siHeaderId }, + _staticData + ); + if (ok) { + await _updateTableContent(); + } +} +async function onSortPosition() { + await getSortDialog(); +} +async function onSortManual() { + const isManualSort = _tableObject.isSortColumnAvailable(); + const { canBeModified = true } = _positionSettings.parent.settings; + const configuration = _tableObject.getConfiguration(); + const { columns } = configuration; + if (isManualSort) { + _tableObject.clearFilter(); + } + await doCreateAndShowTableWidget( + columns, + _getModuleName(), + canBeModified, + !isManualSort + ); +} +function showSortManualButtonState() { + const isManualSort = _tableObject.isSortColumnAvailable(); + const className = "." + buttons.CLASSNAME.sortManual; + if (isManualSort) { + switchButtonIcon(className, "btn-img-sortManual", "btn-img-sortPrint"); + setButtonText(className, TC.printSort); + } else { + switchButtonIcon(className, "btn-img-sortPrint", "btn-img-sortManual"); + setButtonText(className, TC.manualSort); + } +} +function onGoToSi() { + const selection = _tableObject.getSelection(); + if (selection.length > 0) { + const hPk = getPKfromModule(); + replacePage( + urlGotoSiFromJobService({ + jobId: hPk.jobid, + posNos: _getListofSelectedRow() + }) + ); + } else { + showLoadingWarning(TC.selectionEmpty); + } +} +async function onShiftPosition(state) { + const pk = getPKFromSelection(); + if (pk !== null) { + const ok = await shiftPosition(state, pk); + if (ok) { + await _updateTableContent(); + } + } else { + showLoadingWarning(TC.selectionEmpty); + } +} +async function onInsertFromTemplateDialog() { + if (_parentTableSelection) { + await setInsertData(_getModuleName(), _parentTableSelection); + await _updateTableContent(); + } +} +async function onCopy(toTargetModule = null) { + if (_parentTableSelection) { + const refresh = await copyPosition( + _getModuleName(), + _parentTableSelection, + _staticData, + _getListofSelectedRow(), + toTargetModule + ); + if (refresh) { + await _updateTableContent(); + } + } +} +async function onCopyToJob() { + await onCopy(ModuleNameEnum.JOB); +} +async function onCopyToCe() { + await onCopy(ModuleNameEnum.CEHEADER); +} +async function onDuplicate() { + if (_parentTableSelection) { + const refresh = duplicatePosition( + _getModuleName(), + _parentTableSelection, + _getListofSelectedRow() + ); + if (refresh) { + await _updateTableContent(); + } + } +} +function onCopyList() { + return [ + ...(_getModuleName() === ModuleNameEnum.JOB + ? [ + { + rowId: "duplicateInJob", + rowText: TC.duplicateInJob, + rowListener: onDuplicate + } + ] + : []), + { + rowId: "copyToOtherJob", + rowText: TC.copyToOtherJob, + rowListener: onCopyToJob + }, + { rowId: "copyToCe", rowText: TC.copyToCe, rowListener: onCopyToCe } + ]; +} +async function onCopyFromOrderToJob() { + if (_parentTableSelection) { + const id = _parentTableSelection.orde_orderid; + await copyFromOrderToJob(id, _staticData, _getListofSelectedRow()); + await _updateTableContent(); + } +} +async function onMove() { + if (_parentTableSelection) { + const id = _parentTableSelection.job_jobid; + const ok = await movePosition( + _getModuleName(), + id, + 1, + 1, + _parentTableSelection, + _getListofSelectedRow(), + _staticData + ); + if (ok) { + await _updateTableContent(); + } + } +} +async function onDefineLayout() { + const pk = getPKFromSelection(); + if (pk !== null) { + const ok = await defineLayoutDialog(pk); + if (ok) { + await _updateTableContent(); + } + } +} +async function onJobToOrderPos(withMultipleSelection) { + const hPk = getPKfromModule(); + await jobToOrderPos( + hPk.orderId, + _tableObject.getSelection(), + withMultipleSelection + ); + await _updateTableContent(); +} +function onStatusChange() { + const selection = _tableObject.getSelection(); + const hPk = getPKfromModule(); + return { + idSiBook: hPk.idSiBook, + siHeaderId: hPk.siHeaderId, + theJobID: selection.map(obj => obj.jpos_jobid), + thePosNo: selection.map(obj => obj.jpos_posno), + theHeaderType: selection.map(obj => obj.jpos_headertype), + theSubPosNo: selection.map(obj => obj.jpos_subposno), + multiple: selection.length > 1 + }; +} +async function onAutoSums() { + if (_parentTableSelection) { + await autoSumsDialog( + _getModuleName(), + _parentTableSelection, + _staticData.lists.listPosTypesAutoSum + ); + await _updateTableContent(); + } +} +async function onInsertService() { + const hPk = getPKfromModule(); + const data = { + ciBookId: hPk.ciBookId, + ciHeaderId: hPk.ciHeaderId + }; + const ok = await insertServiceDialog(data); + if (ok) { + await _updateTableContent(); + } +} +function _buttonConnectPosition(callback) { + return new UiButton( + TC.connectSIPosButtonText, + buttons.CLASSNAME.siConnectPosition, + callback, + "btn-img-connectSIPos" + ); +} +function _buttonSortPosition(callback) { + return new UiButton( + TC.automaticSort, + buttons.CLASSNAME.sortPosition, + callback, + "btn-img-sortPos" + ); +} +function _buttonSortManual(callback) { + return new UiButton( + TC.manualSort, + buttons.CLASSNAME.sortManual, + callback, + "btn-img-sortManual" + ); +} +function gotoList() { + return [{ rowId: "gotoSi", rowText: SITITLE, rowListener: onGoToSi }]; +} +function _buttonShiftUpPosition(callback) { + return new UiButton( + TC.hierarchyUp, + buttons.CLASSNAME.shiftUpPosition, + callback, + "btn-img-shiftUpPos" + ); +} +function _buttonShiftDownPosition(callback) { + return new UiButton( + TC.hierarchyDown, + buttons.CLASSNAME.shiftDownPosition, + callback, + "btn-img-shiftDownPos" + ); +} +function _buttonDefineLayout(callback) { + return new UiButton( + TC.setLayout, + buttons.CLASSNAME.defineLayout, + callback, + "btn-img-defineLayoutPos" + ); +} +function _buttonAutoSums(callback) { + return new UiButton( + TC.generateTotals, + buttons.CLASSNAME.autoSums, + callback, + "btn-img-createsubtotals" + ); +} +async function markPositions(data) { + _tableObject.clearRowAttributes(); + if (data !== null && data.jpos_postype === POSITIONTYPES.SUBTOTAL) { + const para = { + theJobID: data.jpos_jobid, + theHeaderType: data.jpos_headertype, + thePosNo: data.jpos_posno, + theSubPosNo: data.jpos_subposno + }; + const subtotals = await servicesData.getPositionsInSubtotal(para); + if (subtotals !== null) { + const filter = subtotals.map(posno => ({ jpos_posno: posno })); + _tableObject.setRowAttributes(filter, { backgroundColor: "aquamarine" }); + } + } +} +function markPositionsTypeText(data) { + _tableObject.clearRowSelectionColor(); + if (data !== null && data.jpos_postype === POSITIONTYPES.TEXT) { + const filter = [ + { + jpos_posno: data.jpos_posno + } + ]; + _tableObject.setRowSelectionColor(filter, "lavender"); + } +} +async function _createToolbarTable(setEvent) { + const data = _getDataFromSelectedEntry(); + const toolbar = new SplitViewMenu.Toolbar("table"); + console.log("_createToolbarTable(", setEvent, ")"); + switch (setEvent) { + + case buttons.STATE.initialize: + switch (_getModuleName()) { + case ModuleNameEnum.JOB: + toolbar.add(_buttonSortPosition(onSortPosition)); + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.CREATEFROMTEMPL + ) + ) { + toolbar.add(buttonInsertFromTemplate(onInsertFromTemplateDialog)); + } + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY) && + getSelectionCount() > 0 + ) { + toolbar.add(_buttonDefineLayout(onDefineLayout)); + } + toolbar.add(_buttonSortManual(onSortManual), "right"); + break; + case ModuleNameEnum.SIHEADER: + + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.SICONNECTPOSITION + ) && + _positionSettings.settings[SETTINGS.CREATABLE] + ) { + toolbar.add(_buttonConnectPosition(onConnectPosition)); + } + toolbar.add(_buttonSortManual(onSortManual), "right"); + break; + case ModuleNameEnum.CEHEADER: + toolbar.add(_buttonSortPosition(onSortPosition)); + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY) && + getSelectionCount() > 0 + ) { + toolbar.add(_buttonDefineLayout(onDefineLayout)); + } + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.CREATEFROMTEMPL + ) + ) { + toolbar.add(buttonInsertFromTemplate(onInsertFromTemplateDialog)); + } + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.AUTOSUMS) + ) { + toolbar.add(_buttonAutoSums(onAutoSums)); + } + toolbar.addSpacer(); + toolbar.add( + buttonPdfPreview(ModuleNameEnum.CEHEADER, { + cehe_ceid: getPKfromModule().ceId + }) + ); + toolbar.add(_buttonSortManual(onSortManual), "right"); + break; + case ModuleNameEnum.ORDER: + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.COPYORDERPOS + ) && + _positionSettings.settings[SETTINGS.CREATABLE] + ) { + toolbar.add( + buttonCopyJobToOrderPos(onJobToOrderPos.bind(this, true)) + ); + } + toolbar.addSpacer(); + toolbar.add( + buttonPdfPreview(ModuleNameEnum.ORDER, { + orde_orderid: getPKfromModule().orderId + }) + ); + toolbar.add(_buttonSortManual(onSortManual), "right"); + break; + case ModuleNameEnum.CIHEADER: + { + const s = { + canBeCreated: + _positionSettings.settings[SETTINGS.CREATABLE] || false + }; + if (s.canBeCreated) { + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.MODIFY + ) + ) { + toolbar.add(_buttonSortPosition(onSortPosition)); + } + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.CREATE + ) + ) { + toolbar.add(buttonInsertService(onInsertService)); + } + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.MODIFY + ) + ) { + toolbar.add(_buttonAutoSums(onAutoSums)); + } + } + toolbar.addSpacer(); + toolbar.add( + buttonPdfPreview(ModuleNameEnum.CIHEADER, { + cihe_bookid: getPKfromModule().ciBookId, + cihe_ciheaderid: getPKfromModule().ciHeaderId + }) + ); + toolbar.add(_buttonSortManual(onSortManual), "right"); + } + break; + default: + break; + } + break; + + case buttons.STATE.jobPositionTableMenu: + toolbar.add(_buttonSortPosition(onSortPosition)); + toolbar.add(_buttonShiftUpPosition(onShiftPosition.bind(this, 0))); + toolbar.add(_buttonShiftDownPosition(onShiftPosition.bind(this, 1))); + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.CREATEFROMTEMPL + ) + ) { + toolbar.add(buttonInsertFromTemplate(onInsertFromTemplateDialog)); + } + if (privileges.getPrivilege(_staticData, privileges.PRIVILEGE.COPYPOS)) { + toolbar.add(buttonCopySelect(onCopyList())); + } + if (privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MOVEPOS)) { + toolbar.add(buttonMove(onMove)); + } + if (privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY)) { + toolbar.add(_buttonDefineLayout(onDefineLayout)); + } + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.CREATEORDER) + ) { + const selectedIds = _.map(_tableObject.getSelection(), "jpos_postype"); + + if ( + _.includes(selectedIds, POSITIONTYPES.EXTERNAL) || + _.includes(selectedIds, POSITIONTYPES.MEDIA) + ) { + const hPk = getPKfromModule(); + toolbar.add( + buttonCreateOrder( + onCreateOrder.bind(this, _getListofSelectedRow(), [hPk.jobid]) + ) + ); + } + } + + if (privileges.getPrivilege(_staticData, privileges.PRIVILEGE.SIMODULE)) { + + if (_tableObject.getOptions().multipleSelection) { + const selectedIds = _.map( + _tableObject.getSelection(), + "jpos_postype" + ); + + if ( + _.includes(selectedIds, POSITIONTYPES.EXTERNAL) || + _.includes(selectedIds, POSITIONTYPES.MEDIA) + ) { + toolbar.addDefaultGoto(gotoList()); + } + } else { + if ( + data !== null && + (data.jpos_postype === POSITIONTYPES.EXTERNAL || + data.jpos_postype === POSITIONTYPES.MEDIA) + ) { + toolbar.addDefaultGoto(gotoList()); + } + } + } + toolbar.add(_buttonSortManual(onSortManual), "right"); + await markPositions(data); + markPositionsTypeText(data); + break; + case buttons.STATE.jobPositionTableMenuMultiple: + toolbar.add(_buttonSortPosition(onSortPosition)); + toolbar.add(_buttonShiftUpPosition(onShiftPosition.bind(this, 0))); + toolbar.add(_buttonShiftDownPosition(onShiftPosition.bind(this, 1))); + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.CREATEFROMTEMPL + ) + ) { + toolbar.add(buttonInsertFromTemplate(onInsertFromTemplateDialog)); + } + if (privileges.getPrivilege(_staticData, privileges.PRIVILEGE.COPYPOS)) { + toolbar.add(buttonCopySelect(onCopyList())); + } + if (privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MOVEPOS)) { + toolbar.add(buttonMove(onMove)); + } + if (privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY)) { + toolbar.add(_buttonDefineLayout(onDefineLayout)); + } + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.CREATEORDER) + ) { + const selectedIds = _.map(_tableObject.getSelection(), "jpos_postype"); + if ( + _.includes(selectedIds, POSITIONTYPES.EXTERNAL) || + _.includes(selectedIds, POSITIONTYPES.MEDIA) + ) { + const hPk = getPKfromModule(); + toolbar.add( + buttonCreateOrder( + onCreateOrder.bind(this, _getListofSelectedRow(), [hPk.jobid]) + ) + ); + } + } + toolbar.add(_buttonSortManual(onSortManual), "right"); + break; + + case buttons.STATE.siPositionTableMenu: + toolbar.add( + buttonStatusChange(HeaderDataEnum.SIPOS, onStatusChange, onReloadTable) + ); + + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.SICONNECTPOSITION + ) && + _positionSettings.settings[SETTINGS.CREATABLE] + ) { + toolbar.add(_buttonConnectPosition(onConnectPosition)); + } + toolbar.add(_buttonSortManual(onSortManual), "right"); + break; + case buttons.STATE.siPositionTableMenuMultiple: + toolbar.add( + buttonStatusChange(HeaderDataEnum.SIPOS, onStatusChange, onReloadTable) + ); + toolbar.add(_buttonSortManual(onSortManual), "right"); + break; + + case buttons.STATE.cePositionTableMenu: + case buttons.STATE.cePositionTableMenuMultiple: + toolbar.add(_buttonSortPosition(onSortPosition)); + toolbar.add(_buttonShiftUpPosition(onShiftPosition.bind(this, 0))); + toolbar.add(_buttonShiftDownPosition(onShiftPosition.bind(this, 1))); + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.CREATEFROMTEMPL + ) + ) { + toolbar.add(buttonInsertFromTemplate(onInsertFromTemplateDialog)); + } + if (privileges.getPrivilege(_staticData, privileges.PRIVILEGE.COPYPOS)) { + + toolbar.add(buttonCopySelect(onCopyList())); + } + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY) && + getSelectionCount() > 0 + ) { + toolbar.add(_buttonDefineLayout(onDefineLayout)); + } + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.AUTOSUMS) && + getSelectionCount() > 0 + ) { + toolbar.add(_buttonAutoSums(onAutoSums)); + } + toolbar.addSpacer(); + toolbar.add( + buttonPdfPreview(ModuleNameEnum.CEHEADER, { + cehe_ceid: getPKfromModule().ceId + }) + ); + toolbar.add(_buttonSortManual(onSortManual), "right"); + await markPositions(data); + markPositionsTypeText(data); + break; + + case buttons.STATE.orderPositionTableMenu: + toolbar.add(_buttonShiftUpPosition(onShiftPosition.bind(this, 0))); + toolbar.add(_buttonShiftDownPosition(onShiftPosition.bind(this, 1))); + if (privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY)) { + toolbar.add(_buttonDefineLayout(onDefineLayout)); + } + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.ORDERCOPYTOJOB + ) + ) { + toolbar.add(buttonCopyFromOrderToJob(onCopyFromOrderToJob)); + } + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.CONNECTORDERPOS + ) + ) { + toolbar.add(buttonConnectOrderPos(onJobToOrderPos.bind(this, false))); + } + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.COPYORDERPOS + ) && + _positionSettings.settings[SETTINGS.CREATABLE] + ) { + toolbar.add(buttonCopyJobToOrderPos(onJobToOrderPos.bind(this, true))); + } + + + + + + toolbar.addSpacer(); + toolbar.add( + buttonPdfPreview(ModuleNameEnum.ORDER, { + orde_orderid: getPKfromModule().orderId + }) + ); + toolbar.add(_buttonSortManual(onSortManual), "right"); + break; + case buttons.STATE.orderPositionTableMenuMultiple: + if (privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY)) { + toolbar.add(_buttonDefineLayout(onDefineLayout)); + } + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.ORDERCOPYTOJOB + ) + ) { + toolbar.add(buttonCopyFromOrderToJob(onCopyFromOrderToJob)); + } + toolbar.addSpacer(); + toolbar.add( + buttonPdfPreview(ModuleNameEnum.ORDER, { + orde_orderid: getPKfromModule().orderId + }) + ); + toolbar.add(_buttonSortManual(onSortManual), "right"); + break; + + case buttons.STATE.ciPositionTableMenu: + { + const s = { + canBeCreated: _positionSettings.settings[SETTINGS.CREATABLE] || false + }; + if (s.canBeCreated) { + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY) + ) { + toolbar.add(_buttonSortPosition(onSortPosition)); + toolbar.add(_buttonShiftUpPosition(onShiftPosition.bind(this, 0))); + toolbar.add( + _buttonShiftDownPosition(onShiftPosition.bind(this, 1)) + ); + } + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.CREATE) + ) { + toolbar.add(buttonInsertService(onInsertService)); + } + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY) + ) { + toolbar.add(_buttonDefineLayout(onDefineLayout)); + toolbar.add(_buttonAutoSums(onAutoSums)); + } + } + toolbar.addSpacer(); + toolbar.add( + buttonPdfPreview(ModuleNameEnum.CIHEADER, { + cihe_bookid: getPKfromModule().ciBookId, + cihe_ciheaderid: getPKfromModule().ciHeaderId + }) + ); + toolbar.add(_buttonSortManual(onSortManual), "right"); + } + break; + case buttons.STATE.ciPositionTableMenuMultiple: + { + const s = { + canBeCreated: _positionSettings.settings[SETTINGS.CREATABLE] || false + }; + if (s.canBeCreated) { + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY) + ) { + toolbar.add(_buttonSortPosition(onSortPosition)); + toolbar.add(_buttonShiftUpPosition(onShiftPosition.bind(this, 0))); + toolbar.add( + _buttonShiftDownPosition(onShiftPosition.bind(this, 1)) + ); + } + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.CREATE) + ) { + toolbar.add(buttonInsertService(onInsertService)); + } + if ( + privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY) + ) { + toolbar.add(_buttonDefineLayout(onDefineLayout)); + toolbar.add(_buttonAutoSums(onAutoSums)); + } + } + toolbar.addSpacer(); + toolbar.add( + buttonPdfPreview(ModuleNameEnum.CIHEADER, { + cihe_bookid: getPKfromModule().ciBookId, + cihe_ciheaderid: getPKfromModule().ciHeaderId + }) + ); + toolbar.add(_buttonSortManual(onSortManual), "right"); + } + break; + default: + throw new Error('Invalid event "' + setEvent + '"'); + } + const multipleSelection = _tableObject.getOptions().multipleSelection; + const hasFilter = _tableObject.options.hasFilter; + toolbar.addDefaultTableOptions( + { + selectAll: multipleSelection + ? () => { + _tableObject.selectAll(); + if (_tableObject.eventHandler[CALLBACK_EVENTS.SELECTIONCHANGED]) { + _tableObject.eventHandler[CALLBACK_EVENTS.SELECTIONCHANGED]( + _tableObject.getSelection() + ); + } + } + : null, + clearAllFilters: hasFilter + ? () => { + _tableObject.clearFilter(); + } + : null, + selectColumns: async () => { + if (_tableLayoutInfo.moduleName !== "") { + const ok = await selectColumns( + _tableLayoutInfo.moduleName, + _tableObject + ); + if (ok) { + await onReloadTable(); + } + } + }, + adjustColumnSize: _tableObject.adjustColumnSize.bind(_tableObject), + loadDefaultLayout: async () => { + if (_tableLayoutInfo.moduleName !== "") { + const ok = await loadDefaultLayout(_tableLayoutInfo.moduleName); + if (ok) { + await onReloadTable(); + } + } + }, + saveDefaultLayout: _tableLayoutInfo.privSaveGlobally + ? async () => { + if (_tableLayoutInfo.moduleName !== "") { + await saveDefaultLayoutForAgency( + _tableLayoutInfo.moduleName, + _tableObject.getConfiguration() + ); + } + } + : null, + exportTable: onExport + }, + "right" + ); + toolbar.addDefaultReload(onReloadTable, "right"); + toolbar.render(); + showSortManualButtonState(); +} +export async function getDataAndShowTable( + name, + parentTableSelection, + parentSettings, + reloadTable, + serviceID +) { + let getListPK; + _reloadTable = reloadTable; + _parentTableSelection = parentTableSelection; + if (parentTableSelection === null) { + throw new Error("No row selected"); + } + setPKfromModule(parentTableSelection); + removeTextEditor(); + switch (name) { + case ModuleNameEnum.SIHEADER: + { + const hPk = getPKfromModule(); + getListPK = { + theSIBookID: hPk.idSiBook, + theSIHeaderID: hPk.siHeaderId + }; + } + break; + case ModuleNameEnum.CEHEADER: + { + const hPk = getPKfromModule(); + getListPK = { theCEID: hPk.ceId }; + } + break; + case ModuleNameEnum.JOB: + { + const hPk = getPKfromModule(); + getListPK = { theJobID: hPk.jobid }; + } + break; + case ModuleNameEnum.ORDER: + { + const hPk = getPKfromModule(); + getListPK = { theOrderID: hPk.orderId }; + } + break; + case ModuleNameEnum.CIHEADER: + { + const hPk = getPKfromModule(); + getListPK = { ciBookId: hPk.ciBookId, ciHeaderId: hPk.ciHeaderId }; + } + break; + default: + throw new Error(`Invalid name "${name}`); + } + let settingsData = { + canBeCreated: true, + canBeDeleted: true, + headerStatus: "", + showButtonDeleteAndMoveNCH: false + }; + switch (name) { + case ModuleNameEnum.SIHEADER: + case ModuleNameEnum.JOB: + case ModuleNameEnum.CEHEADER: + case ModuleNameEnum.ORDER: + settingsData = { + ...settingsData, + ...(await servicesData.getActionInfo( + getPKfromModule(), + _getModuleType() + )) + }; + break; + case ModuleNameEnum.CIHEADER: + settingsData = await servicesData.getActionInfo( + getPKfromModule(), + _getModuleType() + ); + break; + default: + break; + } + _positionSettings.settings[SETTINGS.CREATABLE] = settingsData.canBeCreated; + _positionSettings.settings[SETTINGS.DELETABLE] = settingsData.canBeDeleted; + _positionSettings.settings[SETTINGS.MULTIPLEDELETE] = + settingsData.showButtonDeleteAndMoveNCH; + const tableData = await servicesData.getListOfPos( + getListPK, + _getModuleType(), + 1, + 1 + ); + if (tableData === null) { + _showParentTable(false); + return; + } + _tableData = { + cols: tableData.cols, + rows: tableData.rows + }; + _tableLayoutInfo = tableData.info; + _positionSettings.parent.headerStatus = settingsData.headerStatus; + _positionSettings.parent.settings = parentSettings; + const { canBeModified = true } = parentSettings; + await doCreateAndShowTableWidget(tableData.head.columns, name, canBeModified); + if (_isShowFormOnly()) { + $(".overview").removeClass("notable"); + $(".menutableindetails").hide(); + } + if (name === ModuleNameEnum.JOB) { + + const hPk = getPKfromModule(); + const serviceIDForLink = serviceID ? String(serviceID) : ""; + addedBreadcrumbId = await Breadcrumb.add( + _staticData.settings.moduleTitle, + `LAS_MOD_JOB_DLG.page?jobID=${hPk.jobid}&serviceID=${serviceIDForLink}` + ); + if (serviceID) { + + _tableObject.setCurrentRow({ + jpos_posno: serviceID, + jpos_jobid: hPk.jobid + }); + + const selectionLength = getSelectionCount(); + if (selectionLength === 1) { + await _createToolbarTable(buttons.STATE.jobPositionTableMenu); + } else if (selectionLength > 1) { + await _createToolbarTable(buttons.STATE.jobPositionTableMenuMultiple); + } + + await _showForm(buttons.STATE.show, _getDataFromSelectedEntry()); + } + } +} +async function doCreateAndShowTableWidget( + columns, + name, + canBeModified, + isManualSort = false +) { + if (_tableObject) { + _tableObject.destructor(); + $(_tableOverlayClass) + .find(".positiontablecontent") + .html(`
    `); + } + if (isManualSort) { + _tableObject = createTableWidgetForManualSort( + columns, + _tableContainerId, + name + ); + } else { + _tableObject = createTableWidget( + columns, + _tableContainerId, + name, + canBeModified || true + ); + } + await _showTableInTable(); + await _removeDetails(); +} +function _addDOMElements() { + let buttonTitle = TC.closeOverlayTableDefault; + if (isString(_previousTableTitle)) { + buttonTitle = TC.closeOverlayTable + _previousTableTitle; + } + $(_showTableInElement).append(` +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    + `); +} +function _isShowFormOnly() { + return Number(getUrlParameter("theShowFormOnly")) === 1; +} +function _bindClickEvents() { + $(document).on( + "click", + _tableOverlayClass + " button.close", + async function () { + const parent = $(this).closest(_showTableInElement), + parentWidth = parent.width(); + + if (_isShowFormOnly()) { + $(".overview").addClass("notable"); + $(".menutableindetails").show(); + } + $(document) + .find(_tableOverlayClass) + .animate({ left: "-" + parentWidth }, 200, function () { + $(this).css({ visibility: "hidden" }); + $(this).removeAttr("style"); + }); + + if (!isUndefined(addedBreadcrumbId)) { + await Breadcrumb.remove(addedBreadcrumbId); + } + + removeTextEditor(); + + _showParentTable(); + } + ); + const positionTableContainer = new DomElement(_showTableInElement, false); + if (positionTableContainer.size() > 0) { + resizeObserverInstance.observe(positionTableContainer.getDomElement()); + } +} +function _getParentDescription(name) { + let text = ""; + if (_parentTableSelection) { + switch (name) { + case ModuleNameEnum.SIHEADER: + { + const hPk = getPKfromModule(); + text += + SITITLE + + " " + + hPk.idSiBook + + ' / ' + + hPk.siHeaderId + + ""; + } + break; + case ModuleNameEnum.JOB: + text += + _parentTableSelection.job_matchcode + + ' (' + + _parentTableSelection.job_intno + + ")"; + break; + case ModuleNameEnum.CEHEADER: + text += + CETITLE + + " " + + _parentTableSelection.cehe_bookid + + "/" + + _parentTableSelection.cehe_headerid + + " - Var. " + + _parentTableSelection.cehe_variantid; + break; + case ModuleNameEnum.ORDER: + text += + ORDERTITLE + + " " + + _parentTableSelection.orde_orderbookid + + "/" + + _parentTableSelection.orde_orderheaderid; + break; + case ModuleNameEnum.CIHEADER: + text += + CITITLE + + " " + + _parentTableSelection.cihe_bookid + + "/" + + _parentTableSelection.cihe_ciheaderid; + break; + default: + throw new Error('Invalid event "' + name + '"'); + } + } + return text; +} +async function onClickTable(selection, formState) { + const selectionLength = selection.length; + if (selectionLength === 0) { + await _removeDetails(); + } else if (selectionLength === 1) { + + switch (_getModuleName()) { + case ModuleNameEnum.SIHEADER: + await _createToolbarTable(buttons.STATE.siPositionTableMenu); + break; + case ModuleNameEnum.JOB: + await _createToolbarTable(buttons.STATE.jobPositionTableMenu); + break; + case ModuleNameEnum.CEHEADER: + await _createToolbarTable(buttons.STATE.cePositionTableMenu); + break; + case ModuleNameEnum.ORDER: + await _createToolbarTable(buttons.STATE.orderPositionTableMenu); + break; + case ModuleNameEnum.CIHEADER: + await _createToolbarTable(buttons.STATE.ciPositionTableMenu); + break; + default: + throw new Error('Invalid name "' + _getModuleName() + '"'); + } + await _showForm(formState, _getDataFromSelectedEntry()); + } else if (selectionLength > 1) { + switch (_getModuleName()) { + case ModuleNameEnum.SIHEADER: + await _removeDetails(); + _showFormButtons(buttons.STATE.multipleInitialize); + await _createToolbarTable(buttons.STATE.siPositionTableMenuMultiple); + break; + case ModuleNameEnum.JOB: + await _removeDetails(); + _showFormButtons(buttons.STATE.multipleInitialize); + await _createToolbarTable(buttons.STATE.jobPositionTableMenuMultiple); + break; + case ModuleNameEnum.CEHEADER: + await _removeDetails(); + _showFormButtons(buttons.STATE.multipleInitialize); + await _createToolbarTable(buttons.STATE.cePositionTableMenuMultiple); + break; + case ModuleNameEnum.ORDER: + await _removeDetails(); + _showFormButtons(buttons.STATE.multipleInitialize); + await _createToolbarTable(buttons.STATE.orderPositionTableMenuMultiple); + break; + case ModuleNameEnum.CIHEADER: + await _removeDetails(); + _showFormButtons(buttons.STATE.multipleInitialize); + await _createToolbarTable(buttons.STATE.ciPositionTableMenuMultiple); + break; + default: + throw new Error('Invalid name "' + _getModuleName() + '"'); + } + } +} +async function _showTableInTable() { + const tableOverlay = $(_tableOverlayClass); + $(".form_wrapper").addClass("serviceslist"); + const parentTableWidth = $(_showTableInElement).getWidth(); + const parentTableHeight = $(_showTableInElement).getHeight(); + tableOverlay.css({ width: parentTableWidth, height: parentTableHeight }); + tableOverlay + .find(".title span.label1") + .html(_getParentDescription(_getModuleName())); + if (_positionSettings.parent.headerStatus !== "") { + tableOverlay + .find(".title .headerstatus") + .html( + `
    ${TC.status}: ${_positionSettings.parent.headerStatus}
    ` + ); + } + tableOverlay.find(_tableContainerId).css({ + width: parentTableWidth - 2, + height: + parentTableHeight - + tableOverlay.find(".title").getHeight() - + _tableOverlayOffsetLeft + }); + tableOverlay.css({ visibility: "visible" }); + await _createToolbarTable(buttons.STATE.initialize); + _rerenderTable(); + _tableObject.on(CALLBACK_EVENTS.SELECTIONCHANGED, async currentRows => { + + console.log("currentRows", currentRows); + + const btnCancel = buttonClasses.cancel; + if ( + !triggerSelectionChangeEvent && + prevRows !== null && + currentRows[0].jpos_posno === prevRows[0].jpos_posno + ) { + return false; + } + + if (_isButtonPresent(btnCancel)) { + _getButtonSelectorObject(btnCancel).trigger("click"); + } else { + prevRows = currentRows; + await onClickTable(currentRows, buttons.STATE.show); + } + return false; + }); + _tableObject.on(CALLBACK_EVENTS.LAYOUTCHANGED, tableConfig => + saveUniversalTableLayout(_tableLayoutInfo.moduleName, tableConfig) + ); + _tableObject.on(CALLBACK_EVENTS.DRAG, (sourceRows, targetRows) => + moveTableRow(sourceRows, targetRows) + ); + _tableObject.on(CALLBACK_EVENTS.FILTERCHANGED, async tableConfig => { + + console.log("FILTERCHANGED", tableConfig, _tableObject.getFilter()); + + await onReloadTable(); + }); +} +async function moveTableRow(sourceRows, targetRows) { + const { canBeModified = true } = _positionSettings.parent.settings; + if (canBeModified) { + const para = { + jobIds: sourceRows.map(el => el.jpos_jobid), + posNos: sourceRows.map(el => el.jpos_posno), + headerTypes: sourceRows.map(el => el.jpos_headertype), + subPosNos: sourceRows.map(el => el.jpos_subposno), + insertAfterPosNo: targetRows[0].jpos_posno, + insertAfterJobId: targetRows[0].jpos_jobid, + insertAfterHeaderType: targetRows[0].jpos_headertype, + insertAfterSubPosNo: targetRows[0].jpos_subposno + }; + const data = await servicesData.setReorderPos(para); + if (data !== null) { + await onReloadTable(); + } + } +} +async function _updateTableContent() { + const moduleName = _getModuleName(); + const filter = _tableObject.getFilter(); + const para = { + ...getFilterPara(filter) + }; + switch (moduleName) { + case ModuleNameEnum.SIHEADER: + { + const hPk = getPKfromModule(); + para.theSIBookID = hPk.idSiBook; + para.theSIHeaderID = hPk.siHeaderId; + } + break; + case ModuleNameEnum.JOB: + { + const hPk = getPKfromModule(); + para.theJobID = hPk.jobid; + } + break; + case ModuleNameEnum.CEHEADER: + { + const hPk = getPKfromModule(); + para.theCEID = hPk.ceId; + } + break; + case ModuleNameEnum.ORDER: + { + const hPk = getPKfromModule(); + para.theOrderID = hPk.orderId; + } + break; + case ModuleNameEnum.CIHEADER: + { + const hPk = getPKfromModule(); + para.ciBookId = hPk.ciBookId; + para.ciHeaderId = hPk.ciHeaderId; + } + break; + default: + throw new Error(`Invalid moduleName "${moduleName}"`); + } + para.theType = _getModuleType(); + const data = await servicesData.getListOfPos(para, _getModuleType(), 1, 1); + if (data !== null) { + + _tableObject.setConfiguration({ + ..._tableObject.getConfiguration(), + columns: data.head.columns + }); + + _setTableData(data); + + _rerenderTable(); + + if (_tableSelectionPosNo) { + _tableObject.setSelection([{ jpos_posno: _tableSelectionPosNo }]); + _tableObject.makeVisible(); + } else { + await _removeDetails(); + } + } +} +function _setTableData(obj) { + _tableData.cols = obj.cols; + _tableData.rows = obj.rows; +} +function _rerenderTable() { + _tableObject.show(_tableData); + if (getSession().userPreferences.autoAdjustColWidth) { + _tableObject.adjustColumnSize(); + } + SplitViewPage.setTableRowCounter(_tableData.rows.length); +} +async function _createFormWidget(positionTypeId, headerPK, contentId = null) { + console.log( + 'Init form for module "' + + _getModuleName() + + '", positiontype ID: ' + + positionTypeId + ); + _formObject = new UiForm( + form.getFormConfig( + _getModuleName(), + positionTypeId, + _formIdName, + _formData, + _staticData, + _isNewDataset + ) + ); + const renderFormInContainer = contentId ? contentId : _getFormSelector(); + await form.initForm( + _getModuleName(), + positionTypeId, + _formEvent, + _formObject, + _formData, + _staticData, + _isNewDataset, + renderFormInContainer, + headerPK + ); +} +function _bindUiListPickerEmployees( + elementName, + defaultTabId, + availableList, + assignedList +) { + const element = _formObject.getElementByName(elementName); + const configuration = {}; + configuration.listOutputElement = "#" + element.getId(); + if (elementName === BEC.LISTEMPLS) { + configuration[BEC.LISTEMPLS] = true; + configuration.Id = "#" + defaultTabId + " dd"; + } + if (!configuration[elementName]) { + throw new Error( + 'function _bindUiListPickerEmployees() only works with elementId: "listEmpls"' + ); + } + if (isUndefined(assignedList)) { + assignedList = []; + } + const $selector = $(configuration.Id); + if ($selector.length === 1) { + UiListPicker.initialize({ + container: configuration.Id, + availableList: { + title: TC.available, + content: _.clone(availableList) + }, + assignedList: { + title: TC.assigned, + content: _.clone(assignedList) + }, + filter: { + lru: "", + onEvent: "keyup blur" + }, + outputElementId: configuration.listOutputElement, + searchParameterArray: ["name", "code"], + textParameterArray: ["name", "code"], + onChange: selection => { + element.__DEPRECATED__setValue(selection.join()); + } + }); + } else { + throw new Error("function _bindUiListPickerEmployees() selector not found"); + } + $selector.find("ul").sortable("disable"); + const taskElementValue = _formObject.__DEPRECATED__getValueStringOpt( + BEC.ISTASK + ); + const setAsNoTask = taskElementValue === BEC.ISTASK + "_false"; + if (taskElementValue === null) { + return; + } + if (!setAsNoTask) { + + if (_formEvent === buttons.STATE.edit || _formEvent === buttons.STATE.new) { + + $selector.find("ul").sortable("enable"); + } else { + + $selector.find("ul").sortable("disable"); + } + + + + if (elementName === BEC.LISTEMPLS && _formEvent === buttons.STATE.edit) { + _showEmployeesDialogButton(configuration.Id); + } + } +} +function _bindUiListPickerPositions( + elementName, + defaultTabId, + availableList, + assignedList +) { + const element = _formObject.getElementByName(elementName); + const configuration = { + listOutputElement: "#" + element.getId(), + id: defaultTabId + }; + const $selector = $("#" + configuration.id); + if ($selector.length === 1) { + UiListPicker.initialize({ + container: "#" + configuration.id, + availableList: { + title: TC.available, + content: _.clone(availableList) + }, + assignedList: { + title: TC.assigned, + content: _.clone(assignedList) + }, + filter: { + lru: "", + onEvent: "keyup blur" + }, + outputElementId: configuration.listOutputElement, + searchParameterArray: ["name"], + textParameterArray: ["name"], + onChange: selection => { + element.__DEPRECATED__setValue(selection.join()); + } + }); + } else { + throw new Error("function _bindUiListPickerPositions() selector not found"); + } + if (_formEvent === buttons.STATE.edit || _formEvent === buttons.STATE.new) { + + $selector.find("ul").sortable("enable"); + } else { + + $selector.find("ul").sortable("disable"); + } +} +function bindTaskProgress(data) { + const elem = _formObject.getElementByName(BEC.PERCCOMPLETED); + let obj; + if (data.basic.isTask) { + obj = { + element: $("#" + elem.getId()), + showpercent: Number(_staticData.settings.taskShowPerc), + prefreopen: Number(_staticData.settings.privTaskReopen), + taskid: data.task.taskID, + status: data.task.taskStatus, + percent: data.task.percCompleted, + decisionResult: false + }; + } else { + + obj = { + element: $("#" + elem.getId()), + showpercent: Number(_staticData.settings.taskShowPerc), + prefreopen: Number(_staticData.settings.privTaskReopen), + taskid: null, + status: 1, + percent: 0, + decisionResult: false + }; + } + _pluginObj[BEC.PERCCOMPLETED] = obj; + progressbar = createTaskProgress( + obj.element, + obj.taskid, + obj.showpercent, + obj.prefreopen, + obj.status, + obj.percent + ); + progressbar.on("change", function (values) { + + progressbar.setStatusOnSuccess(); + + + _pluginObj[BEC.PERCCOMPLETED] = values; + formHelper.setCompleteDate(values.status, _formObject, _staticData); + }); + if (_formEvent !== buttons.STATE.edit && _formEvent !== buttons.STATE.new) { + progressbar.setDisabled(); + } + if (!data.basic.isTask) { + progressbar.setDisabled(); + } +} +function _bindPluginsAfterFormRender(positionTypeId) { + switch (_getModuleName()) { + case ModuleNameEnum.JOB: + if ( + _.includes( + [ + POSITIONTYPES.EXTERNAL, + POSITIONTYPES.SERVICE, + POSITIONTYPES.MEDIA, + POSITIONTYPES.HOURS, + POSITIONTYPES.INTCOSTS, + POSITIONTYPES.ACONTOSPECIAL, + POSITIONTYPES.ACONTO + ], + positionTypeId + ) + ) { + if ( + preferences.isPreferenceTrue( + _staticData, + preferences.PREFERENCE.HASPROJECTTASKS + ) + ) { + + const elem = _formObject.getElementByName(BEC.LINKCOMM); + addFixedTooltip($("#" + elem.getId()).find("a")); + + _bindUiListPickerEmployees( + BEC.LISTEMPLS, + _formObject.getRowIdOfElementName(BEC.LISTEMPLS), + _generalDataEmplLists.listEmpls, + _formData.task.listEmpls + ); + + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.TASKDEPENDENCIES + ) + ) { + + _formObject.__DEPRECATED__setValue( + BEC.LISTTASKS, + formHelper.getDependentTasksList( + _formEvent, + _formObject, + _formData + ) + ); + } + + bindTaskProgress(_formData); + } + } else if (_.includes([POSITIONTYPES.TEXT], positionTypeId)) { + if ( + preferences.isPreferenceTrue( + _staticData, + preferences.PREFERENCE.HASPROJECTTASKS + ) + ) { + + const elem = _formObject.getElementByName(BEC.LINKCOMM); + addFixedTooltip($("#" + elem.getId()).find("a")); + + _bindUiListPickerEmployees( + BEC.LISTEMPLS, + _formObject.getRowIdOfElementName(BEC.LISTEMPLS), + _generalDataEmplLists.listEmpls, + _formData.task.listEmpls + ); + + if ( + privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.TASKDEPENDENCIES + ) + ) { + + _formObject.__DEPRECATED__setValue( + BEC.LISTTASKS, + formHelper.getDependentTasksList( + _formEvent, + _formObject, + _formData + ) + ); + } + + bindTaskProgress(_formData); + } + } else if (_.includes([POSITIONTYPES.SUBTOTAL], positionTypeId)) { + _bindUiListPickerPositions( + BEC.LISTPOS, + _formObject.getRowIdOfElementName(BEC.LISTPOS), + _formData.basic.listPos, + _formData.basic.listPosConnected + ); + } + break; + case ModuleNameEnum.CEHEADER: + if (_.includes([POSITIONTYPES.SUBTOTAL], positionTypeId)) { + _bindUiListPickerPositions( + BEC.LISTPOS, + _formObject.getRowIdOfElementName(BEC.LISTPOS), + _formData.basic.listPos, + _formData.basic.listPosConnected + ); + } + break; + case ModuleNameEnum.CIHEADER: + if (_.includes([POSITIONTYPES.SUBTOTAL], positionTypeId)) { + _bindUiListPickerPositions( + BEC.LISTPOS, + _formObject.getRowIdOfElementName(BEC.LISTPOS), + _formData.basic.listPos, + _formData.basic.listPosConnected + ); + } + break; + default: + break; + } +} +async function _resetDetails() { + setTableOverlayPanel(""); + const isAddTask = + typeof _options !== "undefined" && _options.hasOwnProperty("addTask") + ? _options.addTask === 1 + : false; + if (_tableObject.getCurrentRow() === null || isAddTask) { + + await _removeDetails(); + } else { + + await _showForm(buttons.STATE.show, _getDataFromSelectedEntry()); + } +} +async function _removeDetails() { + _hideTheForm(); + await _createToolbarTable(buttons.STATE.initialize); + _showFormButtons(buttons.STATE.initialize); +} +function urlParameterAvailable(name = "") { + return window.location.href.indexOf(name) !== -1; +} +function setIdToUrl(id) { + if (urlParameterAvailable("serviceID")) { + setUrlParameter("serviceID", id.toString()); + } +} +async function _showForm(setEvent, selection, contentId = null) { + _isNewDataset = false; + triggerSelectionChangeEvent = true; + _formEvent = setEvent; + if (selection) { + _tableSelectionPosNo = selection.jpos_posno; + _tableSelectionJobNo = selection.jpos_jobid; + + const para = { + theJobID: selection.jpos_jobid, + thePosNo: selection.jpos_posno, + theHeaderType: selection.jpos_headertype, + theSubPosNo: selection.jpos_subposno + }; + + const data = await servicesData.getPosData(para); + if (data !== null) { + + if ( + _.includes( + [ + POSITIONTYPES.EXTERNAL, + POSITIONTYPES.MEDIA, + POSITIONTYPES.SERVICE, + POSITIONTYPES.HOURS, + POSITIONTYPES.INTCOSTS, + POSITIONTYPES.TEXT, + POSITIONTYPES.ACONTOSPECIAL, + POSITIONTYPES.ACONTO, + POSITIONTYPES.SUBTOTAL + ], + data.basic.idPosType + ) + ) { + + _formData = data; + + await _createFormWidget( + data.basic.idPosType, + getPKfromModule(), + contentId + ); + + _setCalculationButton(data.basic.idPosType); + + _setEnhanceButton(data.basic.idPosType); + + if ( + preferences.isPreferenceTrue( + _staticData, + preferences.PREFERENCE.HASPROJECTTASKS + ) + ) { + reOpenTaskButton(data.basic.idPosType, setEvent); + } + + _setDefaultLayoutButton(data.basic.idPosType, setEvent); + + setTechnicalTextButton(_formObject, data.basic.idPosType); + + _setCostsButton(data.basic.idPosType, setEvent); + + _bindPluginsAfterFormRender(data.basic.idPosType); + + _showTheForm(); + if (!_isFormInDialog) { + setTableOverlayPanel(setEvent); + + _showFormButtons(setEvent); + + setIdToUrl(selection.jpos_posno); + } else { + _showFormButtons(setEvent); + + } + } else { + showLoadingWarning("form not defined"); + await _removeDetails(); + } + } else { + await _removeDetails(); + } + } else { + + await _removeDetails(); + } +} +async function _showFormNewPosition(setEvent, postypeID, serverData) { + _isNewDataset = true; + _formEvent = setEvent; + if (!_isFormInDialog) { + setTableOverlayPanel(setEvent); + + _tableSelectionPosNo = null; + + _tableObject.setCurrentRow(null); + } + switch (_getModuleName()) { + case ModuleNameEnum.JOB: + { + const hPk = getPKfromModule(); + const data = await servicesData.getDefaultsForNewPos( + { + theJobID: hPk.jobid, + thePostype: postypeID + }, + servicesData.ServiceHeaderType.JOB + ); + await _showFormNewPositionExtended(setEvent, data, getPKfromModule()); + } + break; + case ModuleNameEnum.SIHEADER: + if (!serverData) { + throw new Error(); + } + await _showFormNewPositionExtended( + setEvent, + serverData, + getPKfromModule() + ); + break; + case ModuleNameEnum.CEHEADER: + { + const hPk = getPKfromModule(); + const data = await servicesData.getDefaultsForNewPos( + { + theJobID: hPk.ceId, + thePostype: postypeID + }, + servicesData.ServiceHeaderType.CE + ); + await _showFormNewPositionExtended(setEvent, data, getPKfromModule()); + } + break; + case ModuleNameEnum.ORDER: + { + const hPk = getPKfromModule(); + const data = await servicesData.getDefaultsForNewPos( + { + theJobID: hPk.orderId, + thePostype: postypeID + }, + servicesData.ServiceHeaderType.ORDER + ); + await _showFormNewPositionExtended(setEvent, data, getPKfromModule()); + } + break; + case ModuleNameEnum.CIHEADER: + { + const hPk = getPKfromModule(); + const data = await servicesData.getDefaultsForNewCIPos({ + ciBookId: hPk.ciBookId, + ciHeaderId: hPk.ciHeaderId, + posType: postypeID + }); + await _showFormNewPositionExtended(setEvent, data, getPKfromModule()); + } + break; + default: + throw new Error('Invalid type "_getModuleName()"'); + } +} +async function _showFormNewPositionExtended(setEvent, data, headerPK) { + _formData = data; + await _createFormWidget( + data.basic.idPosType, + headerPK, + _isFormInDialogSelector + ); + _setCalculationButton(data.basic.idPosType); + _setEnhanceButton(data.basic.idPosType); + _setDefaultLayoutButton(data.basic.idPosType, setEvent); + setTechnicalTextButton(_formObject, data.basic.idPosType); + _setCostsButton(data.basic.idPosType, setEvent); + _bindPluginsAfterFormRender(data.basic.idPosType); + _showTheForm(); + _showFormButtons(setEvent); +} +function setTableOverlayPanel(setEvent) { + switch (setEvent) { + case buttons.STATE.edit: + case buttons.STATE.new: + SplitViewPage.disableOverviewPage(); + break; + default: + SplitViewPage.enableOverviewPage(); + break; + } +} +async function _saveForm(removeShowWarning, successWithInfoOptions) { + if (_formObject.validate()) { + const hPk = getPKfromModule(); + const saveData = convertData( + hPk, + _formObject.__DEPRECATED__getValues(), + _formData, + _getModuleName(), + _pluginObj, + _isNewDataset, + removeShowWarning, + successWithInfoOptions + ); + + const json = await servicesData.setSavedPos(saveData, _isNewDataset); + if (json.stat.status === STATUS.SUCCESS) { + + if (_isNewDataset) { + _tableSelectionPosNo = json.data.posNo; + } + await _saveCompleted(_tableSelectionPosNo); + return true; + } else if (json.stat.status === STATUS.INFO) { + + + if ( + _.includes(Object.keys(json.data), "askSplitPos") || + _.includes(Object.keys(json.data), "askHowToChange") + ) { + await showSISaveDialog(json.data); + return true; + } + } else if (json.stat.status === STATUS.VALIDATE) { + await showWarningDialog(json.stat.message); + } else if (json.stat.status === STATUS.WARNING) { + + await showSISaveConfirmDialog(json.data.warnings); + } + } else { + showLoadingWarning(pageTC.requiredInformation); + } + return false; +} +async function _saveCompleted(newPosNo) { + _formObject.setActive(false); + _formObject.memorizeCurrentValues(); + if (_isFormInDialog && _isFormInDialogJobPK !== null) { + _isFormInDialogJobPK.jpos_posno = newPosNo; + + await _showForm( + buttons.STATE.show, + _isFormInDialogJobPK, + _isFormInDialogSelector + ); + } else { + + await _updateTableContent(); + } +} +async function showSISaveConfirmDialog(message) { + const ok = await confirmDialog(message); + if (ok) { + await _saveForm(true); + } +} +async function showSISaveDialog(data) { + const defaultSetting = { + doSplitPos: true, + chargeType: 10 + }, + elements = { + chbox: new UiElementCheckbox({ + name: "splitPos", + value: defaultSetting.doSplitPos + }), + radio: new UiElementRadio({ + name: "howToCharge", + value: defaultSetting.chargeType, + selectOptions: _.map(_staticData.lists.listChargeTypes, function (obj) { + return { id: obj.id, name: obj.name }; + }) + }) + }; + let askSplitPosText, + asHowToChargeText, + html = ""; + html += ''; + if (data.askSplitPos) { + if (_formData.settings.ciExists) { + askSplitPosText = TC.askSplitPosCiExists; + } else { + askSplitPosText = TC.askSplitPos; + } + html += ""; + html += ""; + } + if (data.askHowToCharge) { + asHowToChargeText = TC.howToCharge; + html += '"; + html += + '"; + } + html += "
    " + elements.chbox.getHTML() + "" + askSplitPosText + "



    ' + asHowToChargeText + "
    ' + + elements.radio.getHTML() + + "
    "; + const dialog = new UiDialog({ + autoClose: true, + html, + title: pageTC.confirmation, + async onClose(ok) { + return ok ? _saveForm(true, defaultSetting) : true; + } + }); + elements.chbox.onChange(element => { + defaultSetting.doSplitPos = element.getValueBoolean(); + }); + elements.radio.onChange(element => { + defaultSetting.chargeType = element.getValueAsNumber(); + }); + if (data.askSplitPos) { + elements.chbox.bindEvents(); + } + if (data.askHowToCharge) { + elements.radio.bindEvents(); + } + await dialog.open(); +} +async function getSortDialog() { + let sortOrder = 1; + const NAME = "sortPosition"; + const elements = { + radio: new UiElementRadio({ + name: "sortOrder", + value: sortOrder, + selectOptions: [ + { + id: "1", + name: TC.sortByCategory + }, + { + id: "2", + name: TC.sortByGroup + } + ] + }) + }; + const html = `
    + + + + +
    ${elements.radio.getHTML()}
    +
    `; + if (_parentTableSelection === null) { + throw new Error("No row selected"); + } + const dialog = new UiDialog({ + autoClose: true, + html, + title: pageTC.confirmation, + onClose(ok) { + if (ok) { + return sendSortCommandToBE(_parentTableSelection, sortOrder); + } + return Promise.resolve(true); + } + }); + elements.radio.onChange(element => { + sortOrder = element.getValueAsNumber(); + }); + elements.radio.bindEvents(); + $("." + NAME + " table").attr("style", "width: 100%"); + $("." + NAME + " table td").attr("style", "text-align: center"); + const isClosed = await dialog.open(); + if (isClosed) { + await _updateTableContent(); + } +} +async function sendSortCommandToBE(currentRow, sortOrder) { + const moduleName = _getModuleName(); + switch (moduleName) { + case ModuleNameEnum.JOB: + return servicesData.setJobSortType(currentRow.job_jobid, sortOrder); + case ModuleNameEnum.CEHEADER: + return servicesData.setCeSortType(currentRow.cehe_ceid, sortOrder); + case ModuleNameEnum.CIHEADER: + return servicesData.setCiSortType( + { + ciBookId: currentRow.cihe_bookid, + ciHeaderId: currentRow.cihe_ciheaderid + }, + sortOrder + ); + default: + throw new Error('Invalid name "' + moduleName + '"'); + } +} +async function deleteEntryJob(para) { + const result = await servicesData.setDeletePosList(para); + if (result) { + if (_isFormInDialog && _isFormInDialogSelector !== null) { + $(_isFormInDialogSelector).html(""); + + _showFormButtons(buttons.STATE.initialize); + } else { + _tableSelectionPosNo = null; + await _updateTableContent(); + + + + + + + + + + + + + + + + + } + } +} +async function deleteEntrySiCheck() { + const selectedListPosNo = _tableObject + .getSelection() + .map(el => el.jpos_posno); + const hPk = getPKfromModule(); + const data = await servicesData.setSiCheckDeletePos({ + idSiBook: hPk.idSiBook, + siHeaderId: hPk.siHeaderId, + listPosNos: selectedListPosNo + }); + if (data.askSupplRemains) { + + const ok = await confirmDialog(TC.askJobservicesStayAssigned); + if (ok) { + await deleteEntrySi(true); + } else { + await deleteEntrySi(false); + } + } else { + + await deleteEntrySi(true); + } +} +async function deleteEntrySi(supplRemains) { + const selectedListPosNo = _tableObject + .getSelection() + .map(el => el.jpos_posno); + const hPk = getPKfromModule(); + const para = { + idSiBook: hPk.idSiBook, + siHeaderId: hPk.siHeaderId, + supplRemains: supplRemains, + lockTimestamp: _formData.settings.lockTimestamp, + listPosNos: selectedListPosNo + }; + await servicesData.setSiDeletePos(para); + _tableSelectionPosNo = null; + await _updateTableContent(); +} +async function setDeletePosList(para) { + const result = await servicesData.setDeletePosList(para); + if (result) { + + _tableSelectionPosNo = null; + await _updateTableContent(); + } +} +async function _deleteEntry(disableWarnings = false) { + let pk = null; + if (_isFormInDialog && _isFormInDialogJobPK !== null) { + pk = { + jobId: _isFormInDialogJobPK.jpos_jobid, + headerType: _isFormInDialogJobPK.jpos_headertype, + listPosNos: _isFormInDialogJobPK.jpos_posno + ? [_isFormInDialogJobPK.jpos_posno] + : [], + subPosNo: _isFormInDialogJobPK.jpos_subposno + }; + } else { + pk = getPKFromSelection(); + } + if (pk === null) { + return; + } + const data = { + jobID: pk.jobId, + headerType: pk.headerType, + listPosNos: pk.listPosNos, + subPosNo: pk.subPosNo, + lockTimestamp: _formData.settings.lockTimestamp, + showWarnings: !disableWarnings + }; + switch (_getModuleName()) { + case ModuleNameEnum.JOB: + await deleteEntryJob(data); + break; + case ModuleNameEnum.SIHEADER: + await deleteEntrySiCheck(); + break; + case ModuleNameEnum.CEHEADER: + await setDeletePosList(data); + break; + case ModuleNameEnum.ORDER: + await setDeletePosList(data); + break; + case ModuleNameEnum.CIHEADER: + await setDeletePosList(data); + break; + default: + throw new Error( + 'Invalid name "' + _getModuleName() + '" in _deleteEntry()' + ); + } +} +function showEnhanceEffect($selector, hiddenClassName, type = "slideandfade") { + switch (type) { + + case "show": + $selector.removeClass(hiddenClassName); + break; + case "fold": + + $selector.hide().removeClass(hiddenClassName).slideDown(500).show(); + break; + case "fade": + + $selector + .css({ opacity: 0 }) + .removeClass(hiddenClassName) + .animate({ opacity: 1 }, 600); + break; + case "slideandfade": + + $selector + .css({ opacity: 0 }) + .hide() + .removeClass(hiddenClassName) + .slideDown(300) + .animate({ opacity: 1 }, 250); + break; + default: + throw new Error('Invalid type "' + type + '" in showEnhanceEffect()'); + } +} +function _setCalculationButton(positionTypeId) { + let showButton = true, + showButtonInTab = 1; + switch (_getModuleName()) { + case ModuleNameEnum.JOB: + + showButtonInTab = 1; + break; + case ModuleNameEnum.SIHEADER: + + showButtonInTab = 1; + break; + case ModuleNameEnum.CEHEADER: + + showButtonInTab = 1; + break; + default: + break; + } + switch (positionTypeId) { + case POSITIONTYPES.TEXT: + showButton = false; + break; + case POSITIONTYPES.SUBTOTAL: + showButton = false; + break; + default: + + break; + } + if (showButton) { + + new UiButton( + TC.showCalculation, + "showCalcBtn", + async function () { + + await _showCalculationDialog(); + }, + "calculator" + ).appendHTML("#" + _formObject.getPageId(showButtonInTab)); + } +} +function _setEnhanceButton(positionTypeId) { + let showButton = true, + showButtonInTab = 1; + switch (_getModuleName()) { + + case ModuleNameEnum.JOB: + showButtonInTab = 1; + break; + case ModuleNameEnum.SIHEADER: + + showButtonInTab = 1; + break; + case ModuleNameEnum.CEHEADER: + + showButtonInTab = 1; + break; + default: + break; + } + switch (positionTypeId) { + case POSITIONTYPES.TEXT: + showButton = false; + break; + case POSITIONTYPES.SUBTOTAL: + showButton = false; + break; + default: + + break; + } + if (showButton) { + const COOKIE = new CookieStorage( + "services_price_enhanced_" + _getModuleName() + ); + + new UiButton( + TC.enhanced, + "enhancedBtn", + function (e) { + const btnIcon = e.currentTarget; + const $enhancedElements = $("#" + _formObject.getFormId()).find( + ".enhanced" + ); + + if (COOKIE.get() === "true") { + + $enhancedElements.addClass("enhanced_hidden"); + switchButtonIcon(btnIcon, "caret-1-n", "caret-1-s"); + COOKIE.set("false"); + } else { + + showEnhanceEffect($enhancedElements, "enhanced_hidden"); + switchButtonIcon(btnIcon, "caret-1-s", "caret-1-n"); + COOKIE.set("true"); + } + }, + "caret-1-s" + ).appendHTML("#" + _formObject.getPageId(showButtonInTab)); + + if (COOKIE.get() === "true") { + switchButtonIcon("#" + _formObject.getFormId(), "caret-1-s", "caret-1-n"); + $("#" + _formObject.getFormId()) + .find(".enhanced") + .removeClass("enhanced_hidden"); + } + } +} +function _setDefaultLayoutButton(positionTypeId, setEvent) { + const $selector = $(".showDefaultBtn"); + const showButtonInTab = _formObject.getPageIndexWithElementName( + BEC.POSITIONPRINT + ); + console.log(_formObject.getPageIdWithElementName(BEC.POSITIONPRINT)); + switch (setEvent) { + + case buttons.STATE.edit: + + if ( + _getModuleName() === ModuleNameEnum.SIHEADER && + _formData.settings[SETTINGS.CIEXISTS] + ) { + break; + } + + if ($selector.length === 0) { + + new UiButton( + TC.defaultSettings, + "showDefaultBtn", + async function () { + + if (_tableSelectionJobNo === null) { + throw new Error( + 'In edit mode the variable "_tableSelectionJobNo" must have a number' + ); + } + await formHelper.setLayoutElementsDefaultRoutine( + _formObject, + _formData, + _tableSelectionJobNo + ); + }, + "gear", + undefined, + false + ).appendHTML("#" + _formObject.getPageId(showButtonInTab)); + } + break; + + default: + + if ($selector.length === 1) { + $selector.remove(); + } + break; + } +} +function _showEmployeesDialogButton(appendTo) { + const className = "changeEmplSelectionInfoBtn"; + const button = new UiButton( + TC.enhancedSelection, + className, + async () => { + await showAssignResourcesDialog(appendTo); + }, + "btn-img-emplAssign" + ); + button.appendHTML(appendTo); + new DomElement(`.${className}`).setCssObject({ + float: "right", + marginTop: 10, + marginRight: 5 + }); +} +async function showAssignResourcesDialog(appendTo) { + const { taskID } = _formData.task; + const ok = await showEmployeeAssignDialog(taskID); + if (ok) { + const formDataPointerCopy = _formData; + const data = await servicesData.getTaskEmpl(taskID); + + formDataPointerCopy.task.listEmpls = data; + _formObject.__DEPRECATED__setValue(BEC.LISTEMPLS, data.join(",")); + + $(appendTo).html(_formObject.getElementByName(BEC.LISTEMPLS).getHTML()); + + _bindPluginsAfterFormRender(formDataPointerCopy.basic.idPosType); + } +} +function _setCostsButton(positionTypeId, event) { + switch (event) { + + case buttons.STATE.initialize: + break; + + case buttons.STATE.show: + break; + + case buttons.STATE.reset: + break; + + case buttons.STATE.edit: + case buttons.STATE.new: + switch (_getModuleName()) { + case ModuleNameEnum.SIHEADER: + if ( + _.includes( + [POSITIONTYPES.EXTERNAL, POSITIONTYPES.MEDIA], + positionTypeId + ) + ) { + formHelper.addButtonFormPageCosts( + _staticData, + _formObject, + BEC.NCHCOSTCENTRE + ); + } + break; + case ModuleNameEnum.CIHEADER: + if (_.includes([POSITIONTYPES.INTCOSTS], positionTypeId)) { + formHelper.addButtonFormPageCosts( + _staticData, + _formObject, + BEC.NCHCOSTCENTRE + ); + } + break; + case ModuleNameEnum.JOB: + case ModuleNameEnum.CEHEADER: + case ModuleNameEnum.ORDER: + break; + default: + throw new Error('Invalid type "_getModuleName()"'); + } + break; + default: + throw new Error('Invalid event _setCostsButton("' + event + '")'); + } +} +function reOpenTaskButton(positionTypeId, event) { + switch (_getModuleName()) { + + case ModuleNameEnum.JOB: + + if (positionTypeId !== POSITIONTYPES.SUBTOTAL) { + formHelper.addButtonReOpenTask( + _getModuleName(), + _staticData, + _formObject, + _formData.task.taskID, + event + ); + } + break; + default: + break; + } +} +function _buttonNewPositions() { + const serviceTypes = _staticData.lists.listPosTypes.filter(e => e.isUsed); + const btnArray = serviceTypes.map((obj, i) => { + return { + rowId: "addPosition" + i, + rowText: obj.name, + rowListener: async function () { + await _getNewPositionForm(obj.id); + } + }; + }); + return new UiSelectButton(TC.new, "newPosition", btnArray, "caret-1-s"); +} +export async function onEdit() { + if (_isFormInDialog) { + await _showForm( + buttons.STATE.edit, + _isFormInDialogJobPK, + _isFormInDialogSelector + ); + } else { + await _showForm(buttons.STATE.edit, _getDataFromSelectedEntry()); + } +} +async function onDelete() { + let selectionCount = 0; + if (_isFormInDialog) { + selectionCount = 1; + } else { + selectionCount = _tableObject.getSelectionCount(); + } + const ok = await confirmDialog(getDeleteDialogText(selectionCount)); + if (ok) { + await _deleteEntry(); + } +} +async function onDeleteAndMoveNCH() { + const pk = getPKFromSelection(); + if (pk === null) { + return; + } + const ok = await confirmDialog(TC.confirmationDeleteAndMoveNCH); + if (ok) { + const data = { + jobID: pk.jobId, + headerType: pk.headerType, + listPosNos: pk.listPosNos, + subPosNo: pk.subPosNo + }; + let setNchData = {}; + const infoForDelete = await servicesData.getInfoForDeleteCiPosList(data); + if (infoForDelete.doShowNCHInfo) { + const { nchAccount, nchCostCentre } = infoForDelete; + setNchData = await showNchInfoDialog( + { nchAccount, nchCostCentre }, + _staticData + ); + } + if (setNchData !== null) { + const setDeleteData = { + ...data, + ...setNchData, + lockTimestamp: _formData.settings.lockTimestamp, + showWarnings: true + }; + const result = await servicesData.setDeleteCiPosList(setDeleteData); + if (result) { + + _tableSelectionPosNo = null; + await _updateTableContent(); + } + } + } +} +function _buttonDeleteCiPositions() { + return new UiSelectButton( + TC.buttonDelete, + "deleteCiPosition", + [ + { rowId: "deleteCI", rowText: TC.buttonDelete, rowListener: onDelete }, + { + rowId: "deleteCIAndMoveNCH", + rowText: TC.buttonDeleteAndMoveNCH, + rowListener: onDeleteAndMoveNCH + } + ], + "trash" + ); +} +async function onCancel() { + triggerSelectionChangeEvent = true; + if ( + !_formObject.valuesAreEqualWithMemorizedValues() && + getSession().userPreferences.notifyCancelChanges + ) { + const ok = await confirmDialog(pageTC.dialogTextConfirmCancel); + if (ok) { + if (_isFormInDialog) { + await onCancelInDialog(); + } else { + await _resetDetails(); + } + } else { + if (prevRows !== null) { + triggerSelectionChangeEvent = false; + _tableObject.setSelection(prevRows); + } + } + } else { + if (_isFormInDialog) { + await onCancelInDialog(); + } else { + await _resetDetails(); + } + } +} +async function onCancelInDialog() { + if (_isNewDataset && _isFormInDialogSelector !== null) { + + $(_isFormInDialogSelector).html(""); + + _showFormButtons(buttons.STATE.initialize); + } else { + await _showForm( + buttons.STATE.show, + _isFormInDialogJobPK, + _isFormInDialogSelector + ); + } +} +async function onSave() { + await _saveForm(false); +} +function _showFormButtons(manualSetEvent) { + const p = { + create: privileges.getPrivilege(_staticData, privileges.PRIVILEGE.CREATE), + modify: privileges.getPrivilege(_staticData, privileges.PRIVILEGE.MODIFY), + delete: privileges.getPrivilege(_staticData, privileges.PRIVILEGE.DELETE) + }; + if (_getModuleName() === ModuleNameEnum.SIHEADER) { + p.create = privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.SIPOSNEW + ); + } + const s = { + canBeCreated: false, + editable: false, + canBeDeleted: false + }; + if (manualSetEvent) { + _formEvent = manualSetEvent; + } + s.canBeCreated = _positionSettings.settings[SETTINGS.CREATABLE]; + s.canBeDeleted = _positionSettings.settings[SETTINGS.DELETABLE]; + if ( + _formData && + _formEvent !== buttons.STATE.new && + _formEvent !== buttons.STATE.initialize && + _formEvent !== buttons.STATE.multipleInitialize && + _formEvent !== buttons.STATE.delete + ) { + s.editable = _formData.settings[SETTINGS.MODIFIABLE]; + + + if (!s.editable) { + + console.log( + "entry not editable: set _formEvent from", + _formEvent, + "to", + buttons.STATE.show + ); + + _formEvent = buttons.STATE.show; + } + } + console.log("_showFormButtons: ", _formEvent); + console.log("privileges", p); + console.log("settings", s); + let toolbar; + if (_isFormInDialog) { + toolbar = new SplitViewMenu.Toolbar("showFormOnly"); + } else { + toolbar = new SplitViewMenu.Toolbar("form"); + } + switch (_formEvent) { + + case buttons.STATE.initialize: + if (p.create && s.canBeCreated) { + toolbar.add(_buttonNewPositions()); + } + break; + + case buttons.STATE.multipleInitialize: + if (p.create && s.canBeCreated) { + toolbar.add(_buttonNewPositions()); + } + if (p.delete && s.canBeDeleted) { + if ( + _getModuleName() === ModuleNameEnum.CIHEADER && + _positionSettings.settings[SETTINGS.MULTIPLEDELETE] + ) { + toolbar.add(_buttonDeleteCiPositions(), "right"); + } else { + toolbar.addDefaultDelete(onDelete, "right"); + } + } + break; + + case buttons.STATE.edit: + case buttons.STATE.new: + toolbar.addDefaultCancel(onCancel); + toolbar.addDefaultSave(onSave); + break; + + case buttons.STATE.show: + if (p.create && s.canBeCreated) { + toolbar.add(_buttonNewPositions()); + } + if (p.modify && s.editable) { + toolbar.addDefaultEdit(onEdit); + } + if (p.delete && s.canBeDeleted) { + if ( + _getModuleName() === ModuleNameEnum.CIHEADER && + _positionSettings.settings[SETTINGS.MULTIPLEDELETE] + ) { + toolbar.add(_buttonDeleteCiPositions(), "right"); + } else { + toolbar.addDefaultDelete(onDelete, "right"); + } + } + break; + + case buttons.STATE.reset: + if (p.create && s.canBeCreated) { + + toolbar.add(_buttonNewPositions()); + } + break; + + case buttons.STATE.delete: + if (p.delete && s.canBeDeleted) { + if ( + _getModuleName() === ModuleNameEnum.CIHEADER && + _positionSettings.settings[SETTINGS.MULTIPLEDELETE] + ) { + toolbar.add(_buttonDeleteCiPositions(), "right"); + } else { + toolbar.addDefaultDelete(onDelete, "right"); + } + } + break; + default: + throw new Error('Invalid event "' + _formEvent + '"'); + } + toolbar.render(); +} +async function _showCalculationDialog() { + await form.showCalculationDialog( + _getModuleName(), + TC.calculation, + getPKfromModule() + ); +} +function setPKfromModule(parentTableSelection) { + switch (_getModuleName()) { + case ModuleNameEnum.JOB: + _parentTableDataId = { + jobid: parentTableSelection.job_jobid + }; + break; + case ModuleNameEnum.SIHEADER: + _parentTableDataId = { + siHeaderId: parentTableSelection.sihd_siheaderid, + idSiBook: parentTableSelection.sihd_bookid + }; + break; + case ModuleNameEnum.CEHEADER: + _parentTableDataId = { + ceId: parentTableSelection.cehe_ceid + }; + break; + case ModuleNameEnum.ORDER: + _parentTableDataId = { + orderId: parentTableSelection.orde_orderid + }; + break; + case ModuleNameEnum.CIHEADER: + _parentTableDataId = { + ciHeaderId: parentTableSelection.cihe_ciheaderid, + ciBookId: parentTableSelection.cihe_bookid + }; + break; + default: + throw new Error('Invalid type "_getModuleName()"'); + } +} +function getPKfromModule() { + switch (_getModuleName()) { + case ModuleNameEnum.JOB: + return _parentTableDataId; + case ModuleNameEnum.SIHEADER: + return _parentTableDataId; + case ModuleNameEnum.CEHEADER: + return _parentTableDataId; + case ModuleNameEnum.ORDER: + return _parentTableDataId; + case ModuleNameEnum.CIHEADER: + return _parentTableDataId; + default: + throw new Error('Invalid type "_getModuleName()"'); + } +} +function _getDataFromSelectedEntry() { + return _tableObject.getCurrentRow(); +} +async function _getNewPositionForm(postypeID) { + switch (_getModuleName()) { + case ModuleNameEnum.JOB: + await _showFormNewPosition(buttons.STATE.new, postypeID); + break; + case ModuleNameEnum.SIHEADER: + + await _showNewJobFromTemplateDialog(postypeID); + break; + case ModuleNameEnum.CEHEADER: + await _showFormNewPosition(buttons.STATE.new, postypeID); + break; + case ModuleNameEnum.ORDER: + await _showFormNewPosition(buttons.STATE.new, postypeID); + break; + case ModuleNameEnum.CIHEADER: + await _showFormNewPosition(buttons.STATE.new, postypeID); + break; + default: + throw new Error('Invalid type "_getModuleName()"'); + } +} +async function _showNewJobFromTemplateDialog(postypeID) { + const options = { + title: TC.selectJobFromTemplateDialogTitle, + showCheckbox: privileges.getPrivilege( + _staticData, + privileges.PRIVILEGE.SHOWALLJOBS + ), + includeJob: true + }; + const result = await genericJobSelectionDialog( + options, + ".newJobFromTemplate_div" + ); + if (result !== null && result.data.jobRequest.theJobID) { + const hPk = getPKfromModule(); + const para = { + theSIBookID: hPk.idSiBook, + theSIHeaderID: hPk.siHeaderId, + thePostype: postypeID ? postypeID : 1, + theJobID: result.data.jobRequest.theJobID + }; + const data = await servicesData.getDefaultsForNewSIPos(para); + await _showFormNewPosition(buttons.STATE.new, 0, data); + } +} +function _isButtonPresent(buttonName) { + return SplitViewMenu.isButtonPresent(buttonName); +} +function _getButtonSelectorObject(buttonName) { + return SplitViewMenu.getButtonSelectorObject(buttonName); +} +function _showTheForm() { + SplitViewPage.showForm(); +} +function _hideTheForm() { + SplitViewPage.hideForm(); +} +function _getFormSelector() { + return "." + SplitViewPage.getDetailsFormClass(); +} +function _getListofSelectedRow() { + const CURRENT_ROW = _tableObject.getCurrentRow(); + return CURRENT_ROW === null + ? [] + : _.compact(_.map(_tableObject.getSelection(), "jpos_posno")); +} +function getSelectionCount() { + const selection = _tableObject.getSelection(); + return selection.length; +} +function getPKFromSelection() { + const selection = _tableObject.getSelection(); + if (selection.length === 0) { + return null; + } + return { + jobId: Number(selection[0].jpos_jobid), + headerType: Number(selection[0].jpos_headertype), + listPosNos: selection.map(obj => Number(obj.jpos_posno)), + subPosNo: Number(selection[0].jpos_subposno) + }; +} +function _showParentTable(forceReload = true) { + $(".form_wrapper").removeClass("serviceslist"); + if (forceReload) { + switch (_getModuleName()) { + case ModuleNameEnum.JOB: + if (_reloadTable !== null) { + _reloadTable(); + } + break; + case ModuleNameEnum.SIHEADER: + if (_reloadTable !== null) { + _reloadTable(); + } + break; + case ModuleNameEnum.CEHEADER: + if (_reloadTable !== null) { + _reloadTable(); + } + break; + case ModuleNameEnum.ORDER: + if (_reloadTable !== null) { + _reloadTable(); + } + break; + case ModuleNameEnum.CIHEADER: + if (_reloadTable !== null) { + _reloadTable(); + } + break; + default: + break; + } + } +} +function _setParentModuleSettings(moduleName) { + switch (moduleName) { + case ModuleNameEnum.JOB: + _parentModuleSettings = { + type: "job", + moduleName: moduleName + }; + break; + case ModuleNameEnum.CEHEADER: + _parentModuleSettings = { + type: "ce", + moduleName: moduleName + }; + break; + case ModuleNameEnum.SIHEADER: + _parentModuleSettings = { + type: "si", + moduleName: moduleName + }; + break; + case ModuleNameEnum.ORDER: + _parentModuleSettings = { + type: "order", + moduleName: moduleName + }; + break; + case ModuleNameEnum.CIHEADER: + _parentModuleSettings = { + type: "ci", + moduleName: moduleName + }; + break; + default: + throw new TypeError("Invalid moduleName: " + moduleName); + } +} +function _getModuleType() { + return _parentModuleSettings.type; +} +function _getModuleName() { + return _parentModuleSettings.moduleName; +} +export async function initialize( + generalDataEmplLists, + newContainerId, + moduleName, + previousTableTitle +) { + _setParentModuleSettings(moduleName); + _tableContainerId = "#" + newContainerId; + _formIdName = moduleName + "_" + newContainerId + "-form"; + _previousTableTitle = previousTableTitle; + _addDOMElements(); + _bindClickEvents(); + _staticData = await servicesData.getGeneralData(_getModuleType()); + if (generalDataEmplLists !== null) { + _generalDataEmplLists = generalDataEmplLists; + } else { + _generalDataEmplLists = { + listEmpls: _staticData.lists.listEmpls + }; + } + return _staticData; +} +export async function renderFormInDialog(contentId, data, addTask = false) { + const moduleName = ModuleNameEnum.SERVICES; + const pkForJobService = { + jpos_jobid: data.jobId, + jpos_posno: data.posNo, + jpos_headertype: 1, + jpos_subposno: 1 + }; + _setParentModuleSettings(ModuleNameEnum.JOB); + _isFormInDialog = true; + _isFormInDialogSelector = contentId; + _isFormInDialogJobPK = pkForJobService; + _parentTableDataId = { + jobid: data.jobId + }; + _formIdName = moduleName + "_form"; + _staticData = await servicesData.getGeneralData("job"); + checkIsNonemptyObject(_staticData, "staticData in " + moduleName); + const settings = await servicesData.getActionInfo( + getPKfromModule(), + _getModuleType() + ); + _positionSettings.settings[SETTINGS.CREATABLE] = settings.canBeCreated; + _positionSettings.settings[SETTINGS.DELETABLE] = settings.canBeDeleted; + const emailOfCurrentUser = await employeeData.getEmplList(); + _generalDataEmplLists = { + listEmpls: emailOfCurrentUser + }; + if (addTask) { + + _showFormButtons(buttons.STATE.initialize); + $("#newPosition button").trigger("click"); + } else { + await _showForm(buttons.STATE.show, pkForJobService, contentId); + } +} diff --git a/test/configCases/inner-graph/issue-11678/webpack.config.js b/test/configCases/inner-graph/issue-11678/webpack.config.js new file mode 100644 index 00000000000..b66e005aac9 --- /dev/null +++ b/test/configCases/inner-graph/issue-11678/webpack.config.js @@ -0,0 +1,71 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + "resize-observer": ["ResizeObserver"], + "Source_Data/employee": [], + "Source_Data/services": [], + "Source_Framework/splitview/page": [], + "Source_Framework/splitview/menu": [], + "Source_Framework/splitview/text": [], + "Source_Framework/uilistpicker/UiListPicker": [], + "Source_ODS/cookiestorage": [], + "Source_Framework/uirichtextedit": [], + "Source_Framework/uielement": [], + "Source_ODS/UiButton/icon": [], + "Source_ODS/UiButton/text": [], + "Source_Framework/pagelinks": [], + "Source_ODS/ods": [], + "Source_ODS/UiButton": [], + "Source_Framework/defaultButtons": [], + "Source_Framework/uiform": [], + "Source_Framework/breadcrumb": [], + "Source_ODS/lodash": [], + "Source_ODS/DomElement": [], + "Source_ODS/url": [], + "Source_ODS/tooltip": [], + "Source_ODS/ui": [], + "Source_ODS/types": [], + "Source_ODS/UiDialog": [], + "Source_Framework/common/moduleDispatcher": [], + "Source_Framework/common/employeeassignment": [], + "Source_Framework/common/pdf_preview": [], + "Source_Framework/common/taskprogress": [], + "Source_Framework/uitable": [], + "Source_Framework/backend/universalData": [], + "Source_Framework/common/columnsDialog": [], + "Source_Framework/backend/jsonData": [], + "Source_Framework/common/statuschange": [], + "Source_Framework/common/las_mod_jobselection": [], + "./text": [], + "./bec": [], + "./positionTypes": [], + "./settings": ["SETTINGS"], + "./preferences": [], + "./privileges": [], + "./buttons": [], + "./form": [], + "./formHelper": [], + "./table": [], + "./techText": [], + "./addPositionToSi": [], + "./ciPosFromJob": [], + "./shiftPosition": [], + "./autoSums": [], + "./defineLayout": [], + "./insertFromTemplate": [], + "./movePosition": [], + "./copy": [], + "./save": [], + "./createOrder": [], + "./orderPosFromJobPos": [], + "./nchInfoDialog": [], + "Source_Modules/las_mod_siheader/url": [], + "Source_Modules/las_mod_siheader/bec": [], + "Source_Modules/las_mod_ceheader/bec": [], + "Source_Modules/las_mod_order/bec": [], + "Source_Modules/las_mod_ciheader/bec": [] + } + } +}); diff --git a/test/configCases/inner-graph/issue-12669-mini/module.js b/test/configCases/inner-graph/issue-12669-mini/module.js new file mode 100644 index 00000000000..e75a8b80e82 --- /dev/null +++ b/test/configCases/inner-graph/issue-12669-mini/module.js @@ -0,0 +1,5 @@ +import { x, y } from "./dependency"; + +export { a }; +const a = /*#__PURE__*/ x(); +// export const b = /*#__PURE__*/ y(); diff --git a/test/configCases/inner-graph/issue-12669-mini/webpack.config.js b/test/configCases/inner-graph/issue-12669-mini/webpack.config.js new file mode 100644 index 00000000000..f5364e386fa --- /dev/null +++ b/test/configCases/inner-graph/issue-12669-mini/webpack.config.js @@ -0,0 +1,21 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + // nothing: { + // usedExports: [], + // expect: { + // "./dependency": [] + // } + // }, + a: { + usedExports: ["a"], + expect: { + "./dependency": ["x"] + } + } + // b: { + // usedExports: ["b"], + // expect: { + // "./dependency": ["y"] + // } + // } +}); diff --git a/test/configCases/inner-graph/issue-12669/module.js b/test/configCases/inner-graph/issue-12669/module.js new file mode 100644 index 00000000000..6a05f296dac --- /dev/null +++ b/test/configCases/inner-graph/issue-12669/module.js @@ -0,0 +1,309 @@ +import * as tracing_1 from "@effect-ts/tracing-utils"; +const fileName_1 = "(@effect-ts/core): _src/Option/operations.ts"; +import * as O from "@effect-ts/system/Option"; +import { makeAssociative } from "../Associative"; +import { left, right } from "../Either"; +import { pipe } from "../Function"; +import { fold, fromAssociative, makeIdentity } from "../Identity"; +import { makeOrd } from "../Ord"; +import * as P from "../Prelude"; +export function getEqual(E) { + return { + equals: y => x => + x === y || + (O.isNone(x) + ? O.isNone(y) + : O.isNone(y) + ? false + : E.equals(y.value)(x.value)) + }; +} +export function getShow(S) { + return { + show: ma => (O.isNone(ma) ? "none" : `some(${S.show(ma.value)})`) + }; +} +export const AssociativeEither = /*#__PURE__*/ P.instance({ + orElseEither: fb => fa => + fa._tag === "Some" ? O.some(left(fa.value)) : O.map_(fb(), right) +}); +export const Covariant = /*#__PURE__*/ P.instance({ + map: O.map +}); +export const Any = /*#__PURE__*/ P.instance({ + any: () => O.some({}) +}); +export const AssociativeFlatten = /*#__PURE__*/ P.instance({ + flatten: O.flatten +}); +export const IdentityFlatten = /*#__PURE__*/ P.instance( + /*#__PURE__*/ Object.assign( + /*#__PURE__*/ Object.assign({}, Any), + AssociativeFlatten + ) +); +export const Monad = /*#__PURE__*/ P.instance( + /*#__PURE__*/ Object.assign( + /*#__PURE__*/ Object.assign({}, Covariant), + IdentityFlatten + ) +); +export const AssociativeBoth = /*#__PURE__*/ P.instance({ + both: O.zip +}); +export const IdentityBoth = /*#__PURE__*/ P.instance( + /*#__PURE__*/ Object.assign( + /*#__PURE__*/ Object.assign({}, Any), + AssociativeBoth + ) +); +export const Applicative = /*#__PURE__*/ P.instance( + /*#__PURE__*/ Object.assign( + /*#__PURE__*/ Object.assign({}, Covariant), + IdentityBoth + ) +); +export const Extend = /*#__PURE__*/ P.instance({ + extend: O.extend +}); +export const Foldable = /*#__PURE__*/ P.instance({ + reduce: (b, f) => fa => (O.isNone(fa) ? b : f(b, fa.value)), + reduceRight: (b, f) => fa => (O.isNone(fa) ? b : f(fa.value, b)), + foldMap: M => f => fa => (O.isNone(fa) ? M.identity : f(fa.value)) +}); +export const forEachF = /*#__PURE__*/ P.implementForEachF()( + () => G => f => fa => + O.isNone(fa) ? P.succeedF(G)(O.none) : G.map(O.some)(f(fa.value)) +); +export const ForEach = /*#__PURE__*/ P.instance( + /*#__PURE__*/ Object.assign(/*#__PURE__*/ Object.assign({}, Covariant), { + forEachF + }) +); +export const Fail = /*#__PURE__*/ P.instance({ + fail: () => O.none +}); +/** + * Returns `true` if `ma` contains `a` + */ + +export function elem(E) { + const el = elem_(E); + return a => ma => el(ma, a); +} +/** + * Returns `true` if `ma` contains `a` + */ + +export function elem_(E) { + return (ma, a) => (O.isNone(ma) ? false : E.equals(ma.value)(a)); +} +/** + * `Apply` Identity + * + * | x | y | combine(y)(x) | + * | ------- | ------- | ------------------ | + * | none | none | none | + * | some(a) | none | none | + * | none | some(a) | none | + * | some(a) | some(b) | some(concat(a, b)) | + */ + +export function getApplyIdentity(M) { + return fromAssociative(getApplyAssociative(M))(O.none); +} +/** + * `Apply` Associative + * + * | x | y | combine(y)(x) | + * | ------- | ------- | ------------------ | + * | none | none | none | + * | some(a) | none | none | + * | none | some(a) | none | + * | some(a) | some(b) | some(concat(a, b)) | + */ + +export function getApplyAssociative(S) { + return makeAssociative(y => x => + O.isSome(x) && O.isSome(y) ? O.some(S.combine(y.value)(x.value)) : O.none + ); +} +/** + * `Identity` returning the left-most non-`None` value + * + * | x | y | combine(y)(x) | + * | ------- | ------- | ------------- | + * | none | none | none | + * | some(a) | none | some(a) | + * | none | some(a) | some(a) | + * | some(a) | some(b) | some(a) | + */ + +export function getLastIdentity() { + return fromAssociative(getLastAssociative())(O.none); +} +/** + * `Associative` returning the left-most non-`None` value + * + * | x | y | combine(y)(x) | + * | ------- | ------- | ------------- | + * | none | none | none | + * | some(a) | none | some(a) | + * | none | some(a) | some(a) | + * | some(a) | some(b) | some(a) | + */ + +export function getLastAssociative() { + return makeAssociative(y => x => (O.isNone(x) ? x : y)); +} +/** + * `Associative` returning the left-most non-`None` value + * + * | x | y | combine(y)(x) | + * | ------- | ------- | ------------- | + * | none | none | none | + * | some(a) | none | some(a) | + * | none | some(a) | some(a) | + * | some(a) | some(b) | some(a) | + */ + +export function getFirstAssociative() { + return makeAssociative(y => x => (O.isNone(x) ? y : x)); +} +/** + * `Identity` returning the left-most non-`None` value + * + * | x | y | combine(y)(x) | + * | ------- | ------- | ------------- | + * | none | none | none | + * | some(a) | none | some(a) | + * | none | some(a) | some(a) | + * | some(a) | some(b) | some(a) | + */ + +export function getFirstIdentity() { + return fromAssociative(getFirstAssociative())(O.none); +} +export const getFirst = (...items) => fold(getFirstIdentity())(items); +export const getLast = (...items) => fold(getLastIdentity())(items); +/** + * The `Ord` instance allows `Option` values to be compared with + * `compare`, whenever there is an `Ord` instance for + * the type the `Option` contains. + * + * `None` is considered to be less than any `Some` value. + */ + +export function getOrd(_) { + return makeOrd(getEqual(_).equals, y => x => + x === y + ? 0 + : O.isSome(x) + ? O.isSome(y) + ? _.compare(y.value)(x.value) + : 1 + : -1 + ); +} +export const filter = predicate => fa => + O.isNone(fa) ? O.none : predicate(fa.value) ? fa : O.none; +export const filterMap = f => ma => (O.isNone(ma) ? O.none : f(ma.value)); +const defaultSeparate = { + left: O.none, + right: O.none +}; +export function separate(ma) { + const o = O.map_(ma, e => ({ + left: O.getLeft(e), + right: O.getRight(e) + })); + return O.isNone(o) ? defaultSeparate : o.value; +} +export const partition = predicate => fa => ({ + left: filter(a => !predicate(a))(fa), + right: filter(predicate)(fa) +}); +export const partitionMap = f => fa => separate(O.map_(fa, f)); +export const Filterable = /*#__PURE__*/ P.instance({ + filter, + filterMap, + partition, + partitionMap +}); +export const sequence = /*#__PURE__*/ P.sequenceF(ForEach); +export const separateF = /*#__PURE__*/ P.implementSeparateF()( + _ => F => f => fa => { + const o = O.map_(fa, a => + F.map(e => ({ + left: O.getLeft(e), + right: O.getRight(e) + }))(f(a)) + ); + return O.isNone(o) + ? P.succeedF(F)({ + left: O.none, + right: O.none + }) + : o.value; + } +); +export const compactF = /*#__PURE__*/ P.implementCompactF()( + _ => F => f => fa => { + return O.isNone(fa) ? P.succeedF(F)(O.none) : f(fa.value); + } +); +export const Wiltable = /*#__PURE__*/ P.instance({ + separateF +}); +export const Witherable = /*#__PURE__*/ P.instance({ + compactF +}); +export const Compactable = /*#__PURE__*/ P.instance({ + compact: O.flatten, + separate +}); +export function getIdentity(A) { + return makeIdentity(O.none, y => x => + O.isNone(x) ? y : O.isNone(y) ? x : O.some(A.combine(y.value)(x.value)) + ); +} +export const alt = /*#__PURE__*/ P.orElseF( + /*#__PURE__*/ Object.assign( + /*#__PURE__*/ Object.assign({}, Covariant), + AssociativeEither + ) +); +export const gen = /*#__PURE__*/ P.genF(Monad); +export const bind = /*#__PURE__*/ P.bindF(Monad); +const do_ = /*#__PURE__*/ P.doF(Monad); +export { do_ as do }; +export { branch as if, branch_ as if_ }; +export const struct = /*#__PURE__*/ P.structF( + /*#__PURE__*/ Object.assign( + /*#__PURE__*/ Object.assign({}, Monad), + Applicative + ) +); +export const tuple = /*#__PURE__*/ P.tupleF( + /*#__PURE__*/ Object.assign( + /*#__PURE__*/ Object.assign({}, Monad), + Applicative + ) +); +/** + * Matchers + */ + +export const { + match, + matchIn, + matchMorph, + matchTag, + matchTagIn +} = /*#__PURE__*/ P.matchers(Covariant); +/** + * Conditionals + */ + +const branch = /*#__PURE__*/ P.conditionalF(Covariant); +const branch_ = /*#__PURE__*/ P.conditionalF_(Covariant); diff --git a/test/configCases/inner-graph/issue-12669/webpack.config.js b/test/configCases/inner-graph/issue-12669/webpack.config.js new file mode 100644 index 00000000000..b9335c2ce7d --- /dev/null +++ b/test/configCases/inner-graph/issue-12669/webpack.config.js @@ -0,0 +1,72 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + "@effect-ts/tracing-utils": [], + "@effect-ts/system/Option": [ + "extend", + "flatten", + "getLeft", + "getRight", + "isNone", + "map", + "map_", + "none", + "some", + "zip" + ], + "../Associative": [], + "../Either": ["left", "right"], + "../Function": [], + "../Identity": [], + "../Ord": [], + "../Prelude": [ + "implementCompactF", + "implementForEachF", + "implementSeparateF", + "instance", + "matchers", + "orElseF", + "structF", + "succeedF", + "tupleF" + ] + } + }, + if: { + usedExports: ["if"], + expect: { + "@effect-ts/tracing-utils": [], + "@effect-ts/system/Option": [ + "extend", + "flatten", + "getLeft", + "getRight", + "isNone", + "map", + "map_", + "none", + "some", + "zip" + ], + "../Associative": [], + "../Either": ["left", "right"], + "../Function": [], + "../Identity": [], + "../Ord": [], + "../Prelude": [ + "implementCompactF", + "implementForEachF", + "implementSeparateF", + "instance", + "matchers", + "orElseF", + "structF", + "succeedF", + "tupleF", + "conditionalF" + ] + } + } +}); diff --git a/test/configCases/inner-graph/issue-17565/module.js b/test/configCases/inner-graph/issue-17565/module.js new file mode 100644 index 00000000000..c98eb025b40 --- /dev/null +++ b/test/configCases/inner-graph/issue-17565/module.js @@ -0,0 +1,60 @@ +import { A, B, C1, C2, C3, Err } from "./test"; + +var arr1 = A, + cls = class extends Error {}, + cls1 = class { + constructor(t) { + if (!arr1.includes(t.version)) throw "invalid parquet version"; + } + async *[Symbol.asyncIterator]() { + yield ""; + } + }; + +var arr2 = B; +var cls2 = class extends Error {}, + cls3 = class { + constructor(t) { + if (!arr2.includes(t.version)) throw "invalid parquet version"; + } + async *[Symbol.asyncIterator]() { + yield ""; + } + }; + +var arr3 = C1; +var cls4 = class { + constructor() {} + }, + cls5 = class { + constructor(t) { + if (!arr3.includes(t.version)) throw "invalid parquet version"; + } + async *[Symbol.asyncIterator]() { + yield ""; + } + }; + +var arr4 = C2; +var cls6 = class { + foo = [1, 2]; + }, + cls7 = class { + constructor(t) { + if (!arr4.includes(t.version)) throw "invalid parquet version"; + } + async *[Symbol.asyncIterator]() { + yield ""; + } + }; + +var arr5 = C3; +var cls8 = class extends Err {}, + cls9 = class { + constructor(t) {} + async *[Symbol.asyncIterator]() { + yield ""; + } + }; + +export { cls1, cls3, cls5, cls7, cls9 } diff --git a/test/configCases/inner-graph/issue-17565/test.filter.js b/test/configCases/inner-graph/issue-17565/test.filter.js new file mode 100644 index 00000000000..b9bdf244d0d --- /dev/null +++ b/test/configCases/inner-graph/issue-17565/test.filter.js @@ -0,0 +1,5 @@ +const supportsClassFields = require("../../../helpers/supportsClassFields"); + +module.exports = function (config) { + return supportsClassFields(); +}; diff --git a/test/configCases/inner-graph/issue-17565/webpack.config.js b/test/configCases/inner-graph/issue-17565/webpack.config.js new file mode 100644 index 00000000000..8f29d9f872a --- /dev/null +++ b/test/configCases/inner-graph/issue-17565/webpack.config.js @@ -0,0 +1,16 @@ +const createTestCases = require("../_helpers/createTestCases"); + +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + "./test": ["A", "B", "C1", "C2"] + } + }, + all: { + usedExports: ["cls1", "cls3", "cls5", "cls7", "cls9"], + expect: { + "./test": ["A", "B", "C1", "C2"] + } + } +}); diff --git a/test/configCases/inner-graph/localReference/module.js b/test/configCases/inner-graph/localReference/module.js new file mode 100644 index 00000000000..c46254fcf97 --- /dev/null +++ b/test/configCases/inner-graph/localReference/module.js @@ -0,0 +1,19 @@ +import { deepEqual, equal } from "./assert"; + +function fun1() { + deepEqual(1, 1); +} + +function fun2() { + fun1(); +} + +function fun3() { + fun2(); +} + +function notExport() { + fun3(); +} + +notExport(); diff --git a/test/configCases/inner-graph/localReference/webpack.config.js b/test/configCases/inner-graph/localReference/webpack.config.js new file mode 100644 index 00000000000..6701f76bd6a --- /dev/null +++ b/test/configCases/inner-graph/localReference/webpack.config.js @@ -0,0 +1,9 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + "./assert": ["deepEqual"] + } + } +}); diff --git a/test/configCases/inner-graph/nested/module.js b/test/configCases/inner-graph/nested/module.js new file mode 100644 index 00000000000..14b19291325 --- /dev/null +++ b/test/configCases/inner-graph/nested/module.js @@ -0,0 +1,25 @@ +import { deepEqual, equal } from "./assert"; + +function fun1() { + deepEqual(1, 1); +} + +function fun2() { + fun1(); +} + +function fun3() { + fun2(); +} + +function fun4() { + fun3(); +} + +export function fun5() { + fun4(); +} + +export function fun6() { + equal(1, 1); +} diff --git a/test/configCases/inner-graph/nested/webpack.config.js b/test/configCases/inner-graph/nested/webpack.config.js new file mode 100644 index 00000000000..97e70b336d1 --- /dev/null +++ b/test/configCases/inner-graph/nested/webpack.config.js @@ -0,0 +1,27 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + "./assert": [] + } + }, + fun5: { + usedExports: ["fun5"], + expect: { + "./assert": ["deepEqual"] + } + }, + fun6: { + usedExports: ["fun6"], + expect: { + "./assert": ["equal"] + } + }, + all: { + usedExports: ["fun5", "fun6"], + expect: { + "./assert": ["deepEqual", "equal"] + } + } +}); diff --git a/test/configCases/inner-graph/pr-18342/common/index.js b/test/configCases/inner-graph/pr-18342/common/index.js new file mode 100644 index 00000000000..f402294b264 --- /dev/null +++ b/test/configCases/inner-graph/pr-18342/common/index.js @@ -0,0 +1,5 @@ +import pure from './pure' + +export default () => { + pure() +} diff --git a/test/configCases/inner-graph/pr-18342/common/pure.js b/test/configCases/inner-graph/pr-18342/common/pure.js new file mode 100644 index 00000000000..d70ac6f068b --- /dev/null +++ b/test/configCases/inner-graph/pr-18342/common/pure.js @@ -0,0 +1,5 @@ +function pure() { + console.log('pureFn'); +} + +export default pure diff --git a/test/configCases/inner-graph/pr-18342/entry1/index.js b/test/configCases/inner-graph/pr-18342/entry1/index.js new file mode 100644 index 00000000000..d5fb94c7209 --- /dev/null +++ b/test/configCases/inner-graph/pr-18342/entry1/index.js @@ -0,0 +1,7 @@ +import common from "../common"; + +it("entry1 should compile and run", () => { + common() + console.log('entry1'); + expect(true).toBe(true) +}); diff --git a/test/configCases/inner-graph/pr-18342/entry2/index.js b/test/configCases/inner-graph/pr-18342/entry2/index.js new file mode 100644 index 00000000000..7e6ccae0d4c --- /dev/null +++ b/test/configCases/inner-graph/pr-18342/entry2/index.js @@ -0,0 +1,7 @@ +it("entry2 should compile and run", () => { + import(/* webpackChunkName: "chunk-reason-webpackChunkName" */'../common').then(common => { + common.default() + console.log('entry2'); + expect(true).toBe(true) + }) +}); diff --git a/test/configCases/inner-graph/pr-18342/entry3/a.js b/test/configCases/inner-graph/pr-18342/entry3/a.js new file mode 100644 index 00000000000..90bd54cd7f2 --- /dev/null +++ b/test/configCases/inner-graph/pr-18342/entry3/a.js @@ -0,0 +1 @@ +export default 'a' diff --git a/test/configCases/inner-graph/pr-18342/entry3/index.js b/test/configCases/inner-graph/pr-18342/entry3/index.js new file mode 100644 index 00000000000..1d863a1d7cb --- /dev/null +++ b/test/configCases/inner-graph/pr-18342/entry3/index.js @@ -0,0 +1,7 @@ +it("entry3 should compile and run", () => { + import(/* webpackChunkName: "chunk-reason-webpackChunkName" */'./a.js').then(a => { + console.log(a.default); + console.log('entry3'); + expect(true).toBe(true) + }) +}); diff --git a/test/configCases/inner-graph/pr-18342/test.config.js b/test/configCases/inner-graph/pr-18342/test.config.js new file mode 100644 index 00000000000..ce98c463c7f --- /dev/null +++ b/test/configCases/inner-graph/pr-18342/test.config.js @@ -0,0 +1,8 @@ +const findOutputFiles = require("../../../helpers/findOutputFiles"); + +module.exports = { + findBundle(_, options) { + const files = findOutputFiles(options, /^entry/); + return files; + } +}; diff --git a/test/configCases/inner-graph/pr-18342/webpack.config.js b/test/configCases/inner-graph/pr-18342/webpack.config.js new file mode 100644 index 00000000000..2d487f51dc2 --- /dev/null +++ b/test/configCases/inner-graph/pr-18342/webpack.config.js @@ -0,0 +1,26 @@ +module.exports = { + target: ["node"], + entry: { + entry1: ["./entry1/index.js"], + entry2: ["./entry2/index.js"], + entry3: ["./entry3/index.js"] + }, + output: { + filename: "[name].js", + chunkFilename: "[name].chunk.js" + }, + optimization: { + minimize: false, + runtimeChunk: true, + splitChunks: { + chunks: "initial", + cacheGroups: { + pureFn: { + test: /pure/, + enforce: true, + name: "chunk-reason-split-chunks" + } + } + } + } +}; diff --git a/test/configCases/inner-graph/pure/module.js b/test/configCases/inner-graph/pure/module.js new file mode 100644 index 00000000000..200b95c6b01 --- /dev/null +++ b/test/configCases/inner-graph/pure/module.js @@ -0,0 +1,46 @@ +// copy from rambda/es/allPass.js +import _curry1 from "./internal/_curry1"; +import curryN from "./curryN"; +import max from "./max"; +import pluck from "./pluck"; +import reduce from "./reduce"; + +/** + * Takes a list of predicates and returns a predicate that returns true for a + * given list of arguments if every one of the provided predicates is satisfied + * by those arguments. + * + * The function returned is a curried function whose arity matches that of the + * highest-arity predicate. + * + * @func + * @memberOf R + * @since v0.9.0 + * @category Logic + * @sig [(*... -> Boolean)] -> (*... -> Boolean) + * @param {Array} predicates An array of predicates to check + * @return {Function} The combined predicate + * @see R.anyPass + * @example + * + * var isQueen = R.propEq('rank', 'Q'); + * var isSpade = R.propEq('suit', '♠︎'); + * var isQueenOfSpades = R.allPass([isQueen, isSpade]); + * + * isQueenOfSpades({rank: 'Q', suit: '♣︎'}); //=> false + * isQueenOfSpades({rank: 'Q', suit: '♠︎'}); //=> true + */ +var allPass = /*#__PURE__*/ _curry1(function allPass(preds) { + return curryN(reduce(max, 0, pluck("length", preds)), function() { + var idx = 0; + var len = preds.length; + while (idx < len) { + if (!preds[idx].apply(this, arguments)) { + return false; + } + idx += 1; + } + return true; + }); +}); +export default allPass; diff --git a/test/configCases/inner-graph/pure/webpack.config.js b/test/configCases/inner-graph/pure/webpack.config.js new file mode 100644 index 00000000000..91ec83d9fa1 --- /dev/null +++ b/test/configCases/inner-graph/pure/webpack.config.js @@ -0,0 +1,23 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + "./internal/_curry1": [], + "./curryN": [], + "./reduce": [], + "./max": [], + "./pluck": [] + } + }, + all: { + usedExports: ["default"], + expect: { + "./internal/_curry1": ["default"], + "./curryN": ["default"], + "./reduce": ["default"], + "./max": ["default"], + "./pluck": ["default"] + } + } +}); diff --git a/test/configCases/inner-graph/ramdaIdentical/module.js b/test/configCases/inner-graph/ramdaIdentical/module.js new file mode 100644 index 00000000000..873aae2394c --- /dev/null +++ b/test/configCases/inner-graph/ramdaIdentical/module.js @@ -0,0 +1,40 @@ +// source code from library ramda +// https://github.com/Ramda/ramda/blob/master/source/identical.js + +import _curry2 from "./internal/_curry2"; + +/** + * Returns true if its arguments are identical, false otherwise. Values are + * identical if they reference the same memory. `NaN` is identical to `NaN`; + * `0` and `-0` are not identical. + * + * @func + * @memberOf R + * @since v0.15.0 + * @category Relation + * @sig a -> a -> Boolean + * @param {*} a + * @param {*} b + * @return {Boolean} + * @example + * + * var o = {}; + * R.identical(o, o); //=> true + * R.identical(1, 1); //=> true + * R.identical(1, '1'); //=> false + * R.identical([], []); //=> false + * R.identical(0, -0); //=> false + * R.identical(NaN, NaN); //=> true + */ +var identical = /*#__PURE__*/ _curry2(function identical(a, b) { + // SameValue algorithm + if (a === b) { + // Steps 1-5, 7-10 + // Steps 6.b-6.e: +0 != -0 + return a !== 0 || 1 / a === 1 / b; + } else { + // Step 6.a: NaN == NaN + return a !== a && b !== b; + } +}); +export default identical; diff --git a/test/configCases/inner-graph/ramdaIdentical/webpack.config.js b/test/configCases/inner-graph/ramdaIdentical/webpack.config.js new file mode 100644 index 00000000000..788a7716c0d --- /dev/null +++ b/test/configCases/inner-graph/ramdaIdentical/webpack.config.js @@ -0,0 +1,15 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + "./internal/_curry2": [] + } + }, + all: { + usedExports: ["default"], + expect: { + "./internal/_curry2": ["default"] + } + } +}); diff --git a/test/configCases/inner-graph/specifier/module.js b/test/configCases/inner-graph/specifier/module.js new file mode 100644 index 00000000000..42215ef22ef --- /dev/null +++ b/test/configCases/inner-graph/specifier/module.js @@ -0,0 +1,15 @@ +import { equal as eq, deepEqual } from "./assert"; + +function myFunction() { + function it() { + eq(1, arguments[0]); + } + deepEqual(1, 1); + it(); +} + +function fun2() { + deepEqual(1, 1); +} + +export { myFunction as fun1, fun2 }; diff --git a/test/configCases/inner-graph/specifier/webpack.config.js b/test/configCases/inner-graph/specifier/webpack.config.js new file mode 100644 index 00000000000..9fe4669e9b3 --- /dev/null +++ b/test/configCases/inner-graph/specifier/webpack.config.js @@ -0,0 +1,27 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + "./assert": [] + } + }, + fun1: { + usedExports: ["fun1"], + expect: { + "./assert": ["deepEqual", "equal"] + } + }, + fun2: { + usedExports: ["fun2"], + expect: { + "./assert": ["deepEqual"] + } + }, + all: { + usedExports: ["fun1", "fun2"], + expect: { + "./assert": ["deepEqual", "equal"] + } + } +}); diff --git a/test/configCases/inner-graph/varNotWritten/module.js b/test/configCases/inner-graph/varNotWritten/module.js new file mode 100644 index 00000000000..0a126886507 --- /dev/null +++ b/test/configCases/inner-graph/varNotWritten/module.js @@ -0,0 +1,25 @@ +import { im1, im2, im3 } from "any"; + +var exp1 = function() { + console.log(im1); +}; + +var exp2 = () => { + console.log(im2); +}; + +var exp3 = function() { + console.log(im3); +}; + +export var exp4 = () => { + exp2(); +}; + +export var expCls = class { + constructor() { + exp1(); + } +}; + +export { exp1, exp2, exp3 }; diff --git a/test/configCases/inner-graph/varNotWritten/webpack.config.js b/test/configCases/inner-graph/varNotWritten/webpack.config.js new file mode 100644 index 00000000000..38f2876301e --- /dev/null +++ b/test/configCases/inner-graph/varNotWritten/webpack.config.js @@ -0,0 +1,46 @@ +const createTestCases = require("../_helpers/createTestCases"); + +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + any: [] + } + }, + exp1: { + usedExports: ["exp1"], + expect: { + any: ["im1"] + } + }, + exp2: { + usedExports: ["exp2"], + expect: { + any: ["im2"] + } + }, + exp3: { + usedExports: ["exp3"], + expect: { + any: ["im3"] + } + }, + exp4: { + usedExports: ["exp4"], + expect: { + any: ["im2"] + } + }, + expCls: { + usedExports: ["expCls"], + expect: { + any: ["im1"] + } + }, + all: { + usedExports: ["exp1", "exp2", "exp3", "exp4", "expCls"], + expect: { + any: ["im1", "im2", "im3"] + } + } +}); diff --git a/test/configCases/inner-graph/varWritten/module.js b/test/configCases/inner-graph/varWritten/module.js new file mode 100644 index 00000000000..d4fb8bcf2a2 --- /dev/null +++ b/test/configCases/inner-graph/varWritten/module.js @@ -0,0 +1,26 @@ +import { im1, im2, im3 } from "any"; + +var exp1 = function() { + console.log(im1); +}; + +var exp2 = () => { + console.log(im2); + exp1 = 3; +}; + +var exp3 = function() { + console.log(im3); +}; + +export var exp4 = () => { + exp2(); +}; + +export var expCls = class { + constructor() { + exp1(); + } +}; + +export { exp1, exp2, exp3 }; diff --git a/test/configCases/inner-graph/varWritten/webpack.config.js b/test/configCases/inner-graph/varWritten/webpack.config.js new file mode 100644 index 00000000000..2ba36d9465b --- /dev/null +++ b/test/configCases/inner-graph/varWritten/webpack.config.js @@ -0,0 +1,45 @@ +const createTestCases = require("../_helpers/createTestCases"); +module.exports = createTestCases({ + nothing: { + usedExports: [], + expect: { + any: [] + } + }, + exp1: { + usedExports: ["exp1"], + expect: { + any: ["im1"] + } + }, + exp2: { + usedExports: ["exp2"], + expect: { + any: ["im2"] + } + }, + exp3: { + usedExports: ["exp3"], + expect: { + any: ["im3"] + } + }, + exp4: { + usedExports: ["exp4"], + expect: { + any: ["im2"] + } + }, + expCls: { + usedExports: ["expCls"], + expect: { + any: ["im1"] + } + }, + all: { + usedExports: ["exp1", "exp2", "exp3", "exp4", "expCls"], + expect: { + any: ["im1", "im2", "im3"] + } + } +}); diff --git a/test/configCases/issues/issue-11871-imports-order/a.js b/test/configCases/issues/issue-11871-imports-order/a.js new file mode 100644 index 00000000000..0f46328a84a --- /dev/null +++ b/test/configCases/issues/issue-11871-imports-order/a.js @@ -0,0 +1,4 @@ +export const W = "w"; +export const A = "a"; +export const a = "a"; +export const _12 = "12"; diff --git a/test/configCases/issues/issue-11871-imports-order/index.js b/test/configCases/issues/issue-11871-imports-order/index.js new file mode 100644 index 00000000000..9d47d73d9db --- /dev/null +++ b/test/configCases/issues/issue-11871-imports-order/index.js @@ -0,0 +1,5 @@ +import * as values from "./a.js"; + +it("imports should have correct order", () => { + expect(Object.keys(values)).toEqual(["A", "W", "_12", "a"]) +}); diff --git a/test/configCases/issues/issue-11871-imports-order/webpack.config.js b/test/configCases/issues/issue-11871-imports-order/webpack.config.js new file mode 100644 index 00000000000..1fc5ef0a294 --- /dev/null +++ b/test/configCases/issues/issue-11871-imports-order/webpack.config.js @@ -0,0 +1,23 @@ +"use strict"; + +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + mode: "development" + }, + { + mode: "production" + }, + { + mode: "production", + optimization: { + concatenateModules: false + } + }, + { + mode: "development", + optimization: { + concatenateModules: true + } + } +]; diff --git a/test/configCases/issues/issue-12924/index.js b/test/configCases/issues/issue-12924/index.js new file mode 100644 index 00000000000..9e0bf87e832 --- /dev/null +++ b/test/configCases/issues/issue-12924/index.js @@ -0,0 +1,3 @@ +it("should compile without error", function() { + return import(/* webpackChunkName: "one" */ "./one"); +}); diff --git a/test/configCases/issues/issue-12924/one.js b/test/configCases/issues/issue-12924/one.js new file mode 100644 index 00000000000..bd816eaba4c --- /dev/null +++ b/test/configCases/issues/issue-12924/one.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/test/configCases/issues/issue-12924/webpack.config.js b/test/configCases/issues/issue-12924/webpack.config.js new file mode 100644 index 00000000000..dab4dd4425a --- /dev/null +++ b/test/configCases/issues/issue-12924/webpack.config.js @@ -0,0 +1,20 @@ +"use strict"; + +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + output: { + globalObject: "null || new Function('return this')()" + } + }, + { + output: { + globalObject: "(new Function('return this'))()" + } + }, + { + output: { + globalObject: "1 > 2 ? null : new Function('return this')()" + } + } +]; diff --git a/test/configCases/issues/issue-12993/dynamic.js b/test/configCases/issues/issue-12993/dynamic.js new file mode 100644 index 00000000000..6c40343ed97 --- /dev/null +++ b/test/configCases/issues/issue-12993/dynamic.js @@ -0,0 +1 @@ +export default "dynamic"; diff --git a/test/configCases/issues/issue-12993/index.js b/test/configCases/issues/issue-12993/index.js new file mode 100644 index 00000000000..b490bb515af --- /dev/null +++ b/test/configCases/issues/issue-12993/index.js @@ -0,0 +1,6 @@ +export const main = "main"; + +it("library output should be accurate value", async () => { + expect(global.lib).toEqual(nsObj({ main: "main" })); + await import(/* webpackPrefetch: true */ "./dynamic.js"); +}); diff --git a/test/configCases/issues/issue-12993/test.config.js b/test/configCases/issues/issue-12993/test.config.js new file mode 100644 index 00000000000..7e3084c7bdf --- /dev/null +++ b/test/configCases/issues/issue-12993/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + afterExecute() { + delete global.lib; + } +}; diff --git a/test/configCases/issues/issue-12993/webpack.config.js b/test/configCases/issues/issue-12993/webpack.config.js new file mode 100644 index 00000000000..f462f7e496f --- /dev/null +++ b/test/configCases/issues/issue-12993/webpack.config.js @@ -0,0 +1,17 @@ +module.exports = [ + { + mode: "development", + output: { + library: "lib", + libraryTarget: "global" + } + }, + { + mode: "development", + devtool: false, + output: { + library: "lib", + libraryTarget: "global" + } + } +]; diff --git a/test/configCases/issues/issue-14974/defer.js b/test/configCases/issues/issue-14974/defer.js new file mode 100644 index 00000000000..7e8bc9f7808 --- /dev/null +++ b/test/configCases/issues/issue-14974/defer.js @@ -0,0 +1,2 @@ +import log from "./tla.js" +log(); diff --git a/test/configCases/issues/issue-14974/index.js b/test/configCases/issues/issue-14974/index.js new file mode 100644 index 00000000000..fa5f87c45a0 --- /dev/null +++ b/test/configCases/issues/issue-14974/index.js @@ -0,0 +1,6 @@ +import "./tla.js" +const a = import("./defer.js") +import.meta.webpackHot.accept(["./defer.js"], () => {}) +it("should compile", async () => { + expect(await a).toBeTruthy(); +}); diff --git a/test/configCases/issues/issue-14974/test.filter.js b/test/configCases/issues/issue-14974/test.filter.js new file mode 100644 index 00000000000..c223174f266 --- /dev/null +++ b/test/configCases/issues/issue-14974/test.filter.js @@ -0,0 +1,3 @@ +module.exports = function () { + return process.version.slice(0, 4) !== "v10."; +}; diff --git a/test/configCases/issues/issue-14974/tla.js b/test/configCases/issues/issue-14974/tla.js new file mode 100644 index 00000000000..e9a204b4331 --- /dev/null +++ b/test/configCases/issues/issue-14974/tla.js @@ -0,0 +1,4 @@ +await Promise.resolve(); +export default function log() { + return 1; +} diff --git a/test/configCases/issues/issue-14974/webpack.config.js b/test/configCases/issues/issue-14974/webpack.config.js new file mode 100644 index 00000000000..24a11572636 --- /dev/null +++ b/test/configCases/issues/issue-14974/webpack.config.js @@ -0,0 +1,9 @@ +const { HotModuleReplacementPlugin } = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + devtool: false, + experiments: { topLevelAwait: true }, + optimization: { usedExports: false, sideEffects: false }, + plugins: [new HotModuleReplacementPlugin()] +}; diff --git a/test/configCases/issues/issue-17459/bar.js b/test/configCases/issues/issue-17459/bar.js new file mode 100644 index 00000000000..801821e109c --- /dev/null +++ b/test/configCases/issues/issue-17459/bar.js @@ -0,0 +1 @@ +export default "bar"; diff --git a/test/configCases/issues/issue-17459/index.js b/test/configCases/issues/issue-17459/index.js new file mode 100644 index 00000000000..e570a856242 --- /dev/null +++ b/test/configCases/issues/issue-17459/index.js @@ -0,0 +1,21 @@ +import bar_string from './bar'; + +let other; + +function foo(value) { + other = value; +} + +var my_class = class { + constructor() { + this.bar = bar_string; + foo(bar_string); + } +}, my_instance = (new my_class()) + + +it("should mangle imports in class constructors", function() { + expect(bar_string).toBe("bar"); + expect(my_instance.bar).toBe(bar_string); + expect(other).toBe(bar_string); +}); diff --git a/test/configCases/issues/issue-17459/webpack.config.js b/test/configCases/issues/issue-17459/webpack.config.js new file mode 100644 index 00000000000..dffc81bba10 --- /dev/null +++ b/test/configCases/issues/issue-17459/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "production" +}; diff --git a/test/configCases/issues/issue-3596/webpack.config.js b/test/configCases/issues/issue-3596/webpack.config.js index 366a4736a77..61b66c9adb4 100644 --- a/test/configCases/issues/issue-3596/webpack.config.js +++ b/test/configCases/issues/issue-3596/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { entry: { bundle0: "./index", @@ -7,9 +8,11 @@ module.exports = { filename: "[name].js" }, plugins: [ - function() { - this.hooks.emit.tap("TestPlugin", function(compilation) { - delete compilation.assets["b.js"]; + function () { + this.hooks.compilation.tap("TestPlugin", function (compilation) { + compilation.hooks.processAssets.tap("TestPlugin", function (assets) { + delete compilation.assets["b.js"]; + }); }); } ] diff --git a/test/configCases/issues/issue-7470/index.js b/test/configCases/issues/issue-7470/index.js index 6267ef7b114..d47b80b19c5 100644 --- a/test/configCases/issues/issue-7470/index.js +++ b/test/configCases/issues/issue-7470/index.js @@ -1,3 +1,7 @@ it("should set NODE_ENV according to mode", () => { - expect(process.env.NODE_ENV).toBe(__MODE__); + if (__MODE__ === "none") { + expect(process.env.NODE_ENV).toBe("test"); + } else { + expect(process.env.NODE_ENV).toBe(__MODE__); + } }); diff --git a/test/configCases/issues/issue-7470/webpack.config.js b/test/configCases/issues/issue-7470/webpack.config.js index 4d4a87ba768..3c4f1fae80f 100644 --- a/test/configCases/issues/issue-7470/webpack.config.js +++ b/test/configCases/issues/issue-7470/webpack.config.js @@ -1,21 +1,22 @@ "use strict"; -const DefinePlugin = require("../../../../lib/DefinePlugin"); +const DefinePlugin = require("../../../../").DefinePlugin; +/** @type {import("../../../../").Configuration[]} */ module.exports = [ { name: "development", mode: "development", - plugins: [new DefinePlugin({ __MODE__: `"development"` })] + plugins: [new DefinePlugin({ __MODE__: '"development"' })] }, { name: "production", mode: "production", - plugins: [new DefinePlugin({ __MODE__: `"production"` })] + plugins: [new DefinePlugin({ __MODE__: '"production"' })] }, { name: "none", mode: "none", - plugins: [new DefinePlugin({ __MODE__: `"none"` })] + plugins: [new DefinePlugin({ __MODE__: '"none"' })] } ]; diff --git a/test/configCases/issues/issue-7563/test.config.js b/test/configCases/issues/issue-7563/test.config.js index dee26555271..9c85373c1d7 100644 --- a/test/configCases/issues/issue-7563/test.config.js +++ b/test/configCases/issues/issue-7563/test.config.js @@ -1,11 +1,11 @@ -var fs = require('fs'); +const fs = require("fs"); module.exports = { noTests: true, - findBundle: function(i, options) { - var regex = new RegExp("^bundle\." + options.name, "i"); - var files = fs.readdirSync(options.output.path); - var bundle = files.find(function (file) { + findBundle(i, options) { + const regex = new RegExp(`^bundle.${options.name}`, "i"); + const files = fs.readdirSync(options.output.path); + const bundle = files.find(function (file) { return regex.test(file); }); @@ -17,6 +17,6 @@ module.exports = { ); } - return "./" + bundle; + return `./${bundle}`; } }; diff --git a/test/configCases/issues/issue-7563/webpack.config.js b/test/configCases/issues/issue-7563/webpack.config.js index 09164011712..a58f54f7657 100644 --- a/test/configCases/issues/issue-7563/webpack.config.js +++ b/test/configCases/issues/issue-7563/webpack.config.js @@ -1,65 +1,65 @@ "use strict"; -// Have to test [hash] and [chunkhash] separately to avoid -// "Cannot use [chunkhash] or [contenthash] for chunk in 'bundle1.[hash].[hash:16].[chunkhash].[chunkhash:16].[name].[id].[query].js' (use [hash] instead)" -var testAllButHash = "[chunkhash].[chunkhash:16].[name].[id].[query]"; -var testHash = "[hash].[hash:16]"; +// [fullhash] and [chunkhash] must be used separately +const testAllButHash = "[chunkhash].[chunkhash:16].[name].[id].[query]"; +const testHash = "[fullhash].[fullhash:16]"; +/** @type {import("../../../../").Configuration[]} */ module.exports = [ { name: "webworker-all", target: "webworker", output: { - filename: "bundle.webworker-all." + testAllButHash + ".js" + filename: `bundle.webworker-all.${testAllButHash}.js` } }, { name: "webworker-hash", target: "webworker", output: { - filename: "bundle.webworker-hash." + testHash + ".js" + filename: `bundle.webworker-hash.${testHash}.js` } }, { name: "node-all", target: "node", output: { - filename: "bundle.node-all." + testAllButHash + ".js" + filename: `bundle.node-all.${testAllButHash}.js` } }, { name: "node", target: "node", output: { - filename: "bundle.node-hash." + testHash + ".js" + filename: `bundle.node-hash.${testHash}.js` } }, { name: "async-node-all", target: "async-node", output: { - filename: "bundle.async-node-all." + testAllButHash + ".js" + filename: `bundle.async-node-all.${testAllButHash}.js` } }, { name: "async-node-hash", target: "async-node", output: { - filename: "bundle.async-node-hash." + testHash + ".js" + filename: `bundle.async-node-hash.${testHash}.js` } }, { name: "web-all", target: "web", output: { - filename: "bundle.web-all." + testAllButHash + ".js" + filename: `bundle.web-all.${testAllButHash}.js` } }, { name: "web-hash", target: "web", output: { - filename: "bundle.web-hash." + testHash + ".js" + filename: `bundle.web-hash.${testHash}.js` } } ]; diff --git a/test/configCases/json/bailout-flag-dep-export-perf/data.json b/test/configCases/json/bailout-flag-dep-export-perf/data.json new file mode 100644 index 00000000000..bee9f9b8d88 --- /dev/null +++ b/test/configCases/json/bailout-flag-dep-export-perf/data.json @@ -0,0 +1,27 @@ +{ + "depth_1": { + "depth_2": { + "depth_3": { + "depth_4": { + "depth_5": { + "depth_6": "depth_6" + } + } + } + } + }, + "_depth_1": { + "_depth_2": { + "_depth_3": { + "_depth_4": { + "_depth_5": { + "_depth_6": "_depth_6" + } + } + } + } + }, + "__depth_1": [ + { "__depth_3": [{ "__depth_5": [{ "__depth_7": ["__depth_8"] }] }] } + ] +} diff --git a/test/configCases/json/bailout-flag-dep-export-perf/index.js b/test/configCases/json/bailout-flag-dep-export-perf/index.js new file mode 100644 index 00000000000..df6ffa8072b --- /dev/null +++ b/test/configCases/json/bailout-flag-dep-export-perf/index.js @@ -0,0 +1,11 @@ +export * from './data.json'; + +it("should compile and run", () => { + expect(__webpack_exports_info__.depth_1.provideInfo).toBe(true) + expect(__webpack_exports_info__._depth_1.provideInfo).toBe(true) + expect(__webpack_exports_info__.__depth_1.provideInfo).toBe(true) + + expect(__webpack_exports_info__.depth_1.depth_2.provideInfo).toBe(true) + expect(__webpack_exports_info__._depth_1._depth_2._depth_3._depth_4.provideInfo).toBe(true) + expect(__webpack_exports_info__.__depth_1[0].__depth_3[0].__depth_5.provideInfo).toBe(true) +}); diff --git a/test/configCases/json/bailout-flag-dep-export-perf/webpack.config.js b/test/configCases/json/bailout-flag-dep-export-perf/webpack.config.js new file mode 100644 index 00000000000..22f491d9943 --- /dev/null +++ b/test/configCases/json/bailout-flag-dep-export-perf/webpack.config.js @@ -0,0 +1,11 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + module: { + parser: { + json: { + exportsDepth: Infinity + } + } + } +}; diff --git a/test/configCases/json/flag-dep-export-perf/data.json b/test/configCases/json/flag-dep-export-perf/data.json new file mode 100644 index 00000000000..bee9f9b8d88 --- /dev/null +++ b/test/configCases/json/flag-dep-export-perf/data.json @@ -0,0 +1,27 @@ +{ + "depth_1": { + "depth_2": { + "depth_3": { + "depth_4": { + "depth_5": { + "depth_6": "depth_6" + } + } + } + } + }, + "_depth_1": { + "_depth_2": { + "_depth_3": { + "_depth_4": { + "_depth_5": { + "_depth_6": "_depth_6" + } + } + } + } + }, + "__depth_1": [ + { "__depth_3": [{ "__depth_5": [{ "__depth_7": ["__depth_8"] }] }] } + ] +} diff --git a/test/configCases/json/flag-dep-export-perf/index.js b/test/configCases/json/flag-dep-export-perf/index.js new file mode 100644 index 00000000000..6ecc00cfec0 --- /dev/null +++ b/test/configCases/json/flag-dep-export-perf/index.js @@ -0,0 +1,11 @@ +export * from './data.json'; + +it("should compile and run", () => { + expect(__webpack_exports_info__.depth_1.provideInfo).toBe(true) + expect(__webpack_exports_info__._depth_1.provideInfo).toBe(true) + expect(__webpack_exports_info__.__depth_1.provideInfo).toBe(true) + + expect(__webpack_exports_info__.depth_1.depth_2.provideInfo).toBe(undefined) + expect(__webpack_exports_info__._depth_1._depth_2._depth_3._depth_4.provideInfo).toBe(undefined) + expect(__webpack_exports_info__.__depth_1[0].__depth_3[0].__depth_5.provideInfo).toBe(undefined) +}); diff --git a/test/configCases/json/flag-dep-export-perf/webpack.config.js b/test/configCases/json/flag-dep-export-perf/webpack.config.js new file mode 100644 index 00000000000..8152f6c7681 --- /dev/null +++ b/test/configCases/json/flag-dep-export-perf/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development" +}; diff --git a/test/configCases/json/generator-json-parse-false/data.json b/test/configCases/json/generator-json-parse-false/data.json new file mode 100644 index 00000000000..843593ba1b7 --- /dev/null +++ b/test/configCases/json/generator-json-parse-false/data.json @@ -0,0 +1 @@ +{"this is a large JSON object": "that should be converted to JSON.parse by default"} diff --git a/test/configCases/json/generator-json-parse-false/data1.json b/test/configCases/json/generator-json-parse-false/data1.json new file mode 100644 index 00000000000..58fc637957a --- /dev/null +++ b/test/configCases/json/generator-json-parse-false/data1.json @@ -0,0 +1,5 @@ +[ + { + "this is a large JSON object": "that should be converted to JSON.parse by default" + } +] diff --git a/test/configCases/json/generator-json-parse-false/index.js b/test/configCases/json/generator-json-parse-false/index.js new file mode 100644 index 00000000000..56c8fbfa29a --- /dev/null +++ b/test/configCases/json/generator-json-parse-false/index.js @@ -0,0 +1,24 @@ +it("should avoid JSON.parse", () => { + const JSONParse = jest.spyOn(JSON, 'parse'); + JSONParse.mockClear(); + + const data = require('./data.json'); + const data2 = require('data:application/json,{"this is a large JSON object": "that should be converted to JSON.parse by default"}'); + const data3 = require('./data1.json'); + + expect(data).toMatchObject({["this is a large JSON object"]: "that should be converted to JSON.parse by default"}); + expect(data2).toMatchObject({["this is a large JSON object"]: "that should be converted to JSON.parse by default"}); + expect(data3).toMatchObject([{"this is a large JSON object": "that should be converted to JSON.parse by default"}]); + + expect(JSONParse).not.toHaveBeenCalled(); +}); + +it("should JSON.parse when resourceQuery is JSONParse=true", () => { + const JSONParse = jest.spyOn(JSON, 'parse'); + JSONParse.mockClear(); + + const data = require('./data.json?JSONParse=true'); + + expect(data).toMatchObject({["this is a large JSON object"]: "that should be converted to JSON.parse by default"}); + expect(JSONParse).toHaveBeenCalledTimes(1); +}); \ No newline at end of file diff --git a/test/configCases/json/generator-json-parse-false/webpack.config.js b/test/configCases/json/generator-json-parse-false/webpack.config.js new file mode 100644 index 00000000000..f687f8406cb --- /dev/null +++ b/test/configCases/json/generator-json-parse-false/webpack.config.js @@ -0,0 +1,16 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + devtool: false, + mode: "development", + module: { + rules: [ + { + test: /\.json$/, + resourceQuery: /JSONParse=true/, + type: "json", + generator: { JSONParse: true } + } + ], + generator: { json: { JSONParse: false } } + } +}; diff --git a/test/configCases/json/generator-json-parse-true/data.json b/test/configCases/json/generator-json-parse-true/data.json new file mode 100644 index 00000000000..914dc282694 --- /dev/null +++ b/test/configCases/json/generator-json-parse-true/data.json @@ -0,0 +1 @@ +{"123this is a large JSON object": "that should be converted to JSON.parse by default"} diff --git a/test/configCases/json/generator-json-parse-true/data1.json b/test/configCases/json/generator-json-parse-true/data1.json new file mode 100644 index 00000000000..58fc637957a --- /dev/null +++ b/test/configCases/json/generator-json-parse-true/data1.json @@ -0,0 +1,5 @@ +[ + { + "this is a large JSON object": "that should be converted to JSON.parse by default" + } +] diff --git a/test/configCases/json/generator-json-parse-true/index.js b/test/configCases/json/generator-json-parse-true/index.js new file mode 100644 index 00000000000..ab4efe631bb --- /dev/null +++ b/test/configCases/json/generator-json-parse-true/index.js @@ -0,0 +1,24 @@ +it("should use JSON.parse", () => { + const JSONParse = jest.spyOn(JSON, 'parse'); + JSONParse.mockClear(); + + const data = require('./data.json'); + const data2 = require('data:application/json,{"this is a large JSON object": "that should be converted to JSON.parse by default"}'); + const data3 = require('./data1.json'); + + expect(data).toMatchObject({["123this is a large JSON object"]: "that should be converted to JSON.parse by default"}); + expect(data2).toMatchObject({["this is a large JSON object"]: "that should be converted to JSON.parse by default"}); + expect(data3).toMatchObject([{"this is a large JSON object": "that should be converted to JSON.parse by default"}]); + + expect(JSONParse).toHaveBeenCalledTimes(3); +}); + +it("should not call JSON.parse when resourceQuery is JSONParse=false", () => { + const JSONParse = jest.spyOn(JSON, 'parse'); + JSONParse.mockClear(); + + const data = require('./data.json?JSONParse=false'); + + expect(data).toMatchObject({["123this is a large JSON object"]: "that should be converted to JSON.parse by default"}); + expect(JSONParse).not.toHaveBeenCalled(); +}); \ No newline at end of file diff --git a/test/configCases/json/generator-json-parse-true/webpack.config.js b/test/configCases/json/generator-json-parse-true/webpack.config.js new file mode 100644 index 00000000000..93230914b2f --- /dev/null +++ b/test/configCases/json/generator-json-parse-true/webpack.config.js @@ -0,0 +1,16 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + devtool: false, + mode: "development", + module: { + rules: [ + { + test: /\.json$/, + resourceQuery: /JSONParse=false/, + type: "json", + generator: { JSONParse: false } + } + ], + generator: { json: { JSONParse: true } } + } +}; diff --git a/test/configCases/json/only-null/data.json b/test/configCases/json/only-null/data.json new file mode 100644 index 00000000000..19765bd501b --- /dev/null +++ b/test/configCases/json/only-null/data.json @@ -0,0 +1 @@ +null diff --git a/test/configCases/json/only-null/index.js b/test/configCases/json/only-null/index.js new file mode 100644 index 00000000000..58c9a439415 --- /dev/null +++ b/test/configCases/json/only-null/index.js @@ -0,0 +1,5 @@ +it("should work", () => { + const data = require('./data.json'); + + expect(data).toBe(null); +}); diff --git a/test/configCases/json/only-null/webpack.config.js b/test/configCases/json/only-null/webpack.config.js new file mode 100644 index 00000000000..dffc81bba10 --- /dev/null +++ b/test/configCases/json/only-null/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "production" +}; diff --git a/test/configCases/json/only-string/data.json b/test/configCases/json/only-string/data.json new file mode 100644 index 00000000000..ace2d72d9d3 --- /dev/null +++ b/test/configCases/json/only-string/data.json @@ -0,0 +1 @@ +"string" diff --git a/test/configCases/json/only-string/index.js b/test/configCases/json/only-string/index.js new file mode 100644 index 00000000000..85962a8bf3a --- /dev/null +++ b/test/configCases/json/only-string/index.js @@ -0,0 +1,5 @@ +it("should work", () => { + const data = require('./data.json'); + + expect(data).toBe("string"); +}); diff --git a/test/configCases/json/only-string/webpack.config.js b/test/configCases/json/only-string/webpack.config.js new file mode 100644 index 00000000000..dffc81bba10 --- /dev/null +++ b/test/configCases/json/only-string/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "production" +}; diff --git a/test/configCases/json/proto/data.json b/test/configCases/json/proto/data.json new file mode 100644 index 00000000000..861e272dfe3 --- /dev/null +++ b/test/configCases/json/proto/data.json @@ -0,0 +1 @@ +{"__proto__":{}} diff --git a/test/configCases/json/proto/data1.json b/test/configCases/json/proto/data1.json new file mode 100644 index 00000000000..5b5c28795c2 --- /dev/null +++ b/test/configCases/json/proto/data1.json @@ -0,0 +1,5 @@ +{ + "__proto__": { + "fail": true + } +} diff --git a/test/configCases/json/proto/index.js b/test/configCases/json/proto/index.js new file mode 100644 index 00000000000..f3211ad6da9 --- /dev/null +++ b/test/configCases/json/proto/index.js @@ -0,0 +1,15 @@ +import data from './data.json'; +import data2 from 'data:application/json,{"__proto__":{}}'; +import data3 from './data1.json'; +import data4 from 'data:application/json,{"a":"__proto__"}'; + +it("should preserves `__proto__` properties", () => { + expect(Object.getPrototypeOf(data) === Object.getPrototypeOf({})).toBe(true); + expect(Object.getPrototypeOf(data2) === Object.getPrototypeOf({})).toBe(true); + expect(Object.getPrototypeOf(data3) === Object.getPrototypeOf({})).toBe(true); + expect(Object.getPrototypeOf(data4) === Object.getPrototypeOf({})).toBe(true); + expect(data).toMatchObject({["__proto__"]: {}}); + expect(data2).toMatchObject({["__proto__"]: {}}); + expect(data3.__proto__.fail).toBe(true); + expect(data4.a).toBe("__proto__"); +}); diff --git a/test/configCases/json/proto/webpack.config.js b/test/configCases/json/proto/webpack.config.js new file mode 100644 index 00000000000..dd53b28785a --- /dev/null +++ b/test/configCases/json/proto/webpack.config.js @@ -0,0 +1,5 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + devtool: false, + mode: "development" +}; diff --git a/test/configCases/json/top-level-json-parser/data.toml b/test/configCases/json/top-level-json-parser/data.toml new file mode 100644 index 00000000000..bf6c9dd3363 --- /dev/null +++ b/test/configCases/json/top-level-json-parser/data.toml @@ -0,0 +1,7 @@ +title = "TOML Example" + +[owner] +name = "Tom Preston-Werner" +organization = "GitHub" +bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." +dob = 1979-05-27T07:32:00Z diff --git a/test/configCases/json/top-level-json-parser/index.js b/test/configCases/json/top-level-json-parser/index.js new file mode 100644 index 00000000000..1cd82db4849 --- /dev/null +++ b/test/configCases/json/top-level-json-parser/index.js @@ -0,0 +1,13 @@ +import toml from "./data.toml"; + +it("should transform toml to json", () => { + expect(toml).toMatchObject({ + title: "TOML Example", + owner: { + name: 'Tom Preston-Werner', + organization: 'GitHub', + bio: 'GitHub Cofounder & CEO\nLikes tater tots and beer.', + dob: '1979-05-27T07:32:00.000Z' + } + }); +}); diff --git a/test/configCases/json/top-level-json-parser/webpack.config.js b/test/configCases/json/top-level-json-parser/webpack.config.js new file mode 100644 index 00000000000..f30bcbf867b --- /dev/null +++ b/test/configCases/json/top-level-json-parser/webpack.config.js @@ -0,0 +1,24 @@ +const toml = require("toml"); + +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + mode: "development", + module: { + parser: { + json: { + parse(input) { + expect(arguments.length).toBe(1); + return toml.parse(input); + } + } + }, + rules: [ + { + test: /\.toml$/, + type: "json" + } + ] + } + } +]; diff --git a/test/configCases/json/tree-shaking-default/data.json b/test/configCases/json/tree-shaking-default/data.json new file mode 100644 index 00000000000..3156019977c --- /dev/null +++ b/test/configCases/json/tree-shaking-default/data.json @@ -0,0 +1,85 @@ +{ + "UNUSEDKEY": "UNUSEDVALUE", + "nested": { + "UNUSEDKEY": "UNUSEDVALUE", + "key": "value", + "key2": "value2", + "array": [1, 2, 3], + "array2": [1, 2, 3], + "array3": ["UNUSEDVALUE", "ok", "UNUSEDVALUE"], + "array4": [ + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "ok" + ], + "array5": [ + "ok", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE" + ], + "array6": ["UNUSEDVALUE", "ok", "UNUSEDVALUE"], + "array7": [ + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "ok" + ], + "array8": [ + "ok", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE", + "UNUSEDVALUE" + ], + "object": { + "test": "TESTVALUE" + }, + "object2": {}, + "object3": {}, + "number": 42 + }, + "nestedArray": [ + "UNUSEDVALUE", + [ + "UNUSEDVALUE", + { + "UNUSEDKEY": "UNUSEDVALUE", + "deep": { + "UNUSEDKEY": "UNUSEDVALUE", + "deep": "ok" + } + }, + "UNUSEDVALUE" + ], + "UNUSEDVALUE" + ] +} diff --git a/test/configCases/json/tree-shaking-default/index.js b/test/configCases/json/tree-shaking-default/index.js new file mode 100644 index 00000000000..40bc62d227a --- /dev/null +++ b/test/configCases/json/tree-shaking-default/index.js @@ -0,0 +1,65 @@ +import data, { nestedArray } from "./data"; +import packageJson from "../../../../package.json"; + +it("should have to correct values", () => { + expect(data.nested.key).toBe("value"); +}); + +it("should be able to write properties", () => { + // known key + data.nested.key2 = "new value"; + expect(data.nested.key2).toBe("new value"); + // unknown key + data.nested.key3 = "value3"; + expect(data.nested.key3).toBe("value3"); + // array methods and prototype properties + data.nested.array.push(4); + expect(data.nested.array.length).toEqual(4); + // direct and nested access + const a = data.nested.array2; + data.nested.array2[1] = 42; + expect(a[1]).toEqual(42); + expect(a.length).toEqual(3); + // only nested access + expect(data.nested.array3[1]).toBe("ok"); + expect(data.nested.array4[10]).toBe("ok"); + expect(data.nested.array5[0]).toBe("ok"); + // nested access and length + expect(data.nested.array6[1]).toBe("ok"); + expect(data.nested.array6.length).toBe(3); + expect(data.nested.array7[10]).toBe("ok"); + expect(data.nested.array7.length).toBe(11); + expect(data.nested.array8[0]).toBe("ok"); + expect(data.nested.array8.length).toBe(11); + // object methods + expect(data.nested.object.hasOwnProperty("test")).toBe(true); + // unknown object property + data.nested.object2.unknownProperty = 42; + expect(data.nested.object2.unknownProperty).toBe(42); + data.nested.object3.unknownProperty = { deep: "deep" }; + expect(data.nested.object3.unknownProperty.deep).toBe("deep"); + // number methods + expect(data.nested.number.toFixed(1)).toBe("42.0"); + // nested in array + expect(nestedArray[1][1].deep.deep).toBe("ok"); +}); + +it("should not have unused keys in bundle", () => { + const fs = require("fs"); + const content = fs.readFileSync(__filename, "utf-8"); + expect(content).toMatch(/\\?"TESTVALUE\\?"/); + expect(content).not.toMatch(/\\?"UNUSEDKEY\\?"/); + expect(content).not.toMatch(/\\?"UNUSEDVALUE\\?"/); + expect(content).not.toMatch(/\\?"nested\\?"/); + expect(content).toMatch(/\.unknownProperty\s*=/); + expect(content).toMatch(/\.unknownProperty\.deep\)/); + expect(content).not.toMatch(/\\?"dependencies\\?"/); + expect(content).not.toMatch(/\\?"scripts\\?"/); +}); + +it("should tree-shake package.json too", () => { + expect(packageJson.name).toBe("webpack"); + expect(packageJson.repository.url).toBe( + "https://github.com/webpack/webpack.git" + ); +}); diff --git a/test/configCases/json/tree-shaking-default/warnings.js b/test/configCases/json/tree-shaking-default/warnings.js new file mode 100644 index 00000000000..6857cae537e --- /dev/null +++ b/test/configCases/json/tree-shaking-default/warnings.js @@ -0,0 +1 @@ +module.exports = [[/Should not import the named export/]]; diff --git a/test/configCases/json/tree-shaking-default/webpack.config.js b/test/configCases/json/tree-shaking-default/webpack.config.js new file mode 100644 index 00000000000..5e6a2dea4f0 --- /dev/null +++ b/test/configCases/json/tree-shaking-default/webpack.config.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "production", + node: { + __dirname: false, + __filename: false + } +}; diff --git a/test/configCases/layer/context-and-css/dark.js b/test/configCases/layer/context-and-css/dark.js new file mode 100644 index 00000000000..fa2ef56f2c3 --- /dev/null +++ b/test/configCases/layer/context-and-css/dark.js @@ -0,0 +1,9 @@ +require.context('./test1', true, /\.less$/); +require('./test2/shared.less'); + +it("should contain only black", function() { + const style = getComputedStyle(document.body); + + expect(style["color-dark"]).toBe(" black"); + expect(style["background-dark"]).toBe(" black"); +}); diff --git a/test/configCases/layer/context-and-css/light.js b/test/configCases/layer/context-and-css/light.js new file mode 100644 index 00000000000..2f10430cf7d --- /dev/null +++ b/test/configCases/layer/context-and-css/light.js @@ -0,0 +1,9 @@ +require.context('./test1', true, /\.less$/); +require('./test2/shared.less'); + +it("should contain only white", function() { + const style = getComputedStyle(document.body); + + expect(style["color-light"]).toBe(" white"); + expect(style["background-light"]).toBe(" white"); +}); diff --git a/test/configCases/layer/context-and-css/test.config.js b/test/configCases/layer/context-and-css/test.config.js new file mode 100644 index 00000000000..c4561c568b1 --- /dev/null +++ b/test/configCases/layer/context-and-css/test.config.js @@ -0,0 +1,15 @@ +module.exports = { + moduleScope(scope) { + const light = scope.window.document.createElement("link"); + light.rel = "stylesheet"; + light.href = "light.css"; + scope.window.document.head.appendChild(light); + const dark = scope.window.document.createElement("link"); + dark.rel = "stylesheet"; + dark.href = "dark.css"; + scope.window.document.head.appendChild(dark); + }, + findBundle() { + return ["./runtime.js", "./light.js", "./dark.js"]; + } +}; diff --git a/test/configCases/layer/context-and-css/test1/shared.less b/test/configCases/layer/context-and-css/test1/shared.less new file mode 100644 index 00000000000..c1e0175c929 --- /dev/null +++ b/test/configCases/layer/context-and-css/test1/shared.less @@ -0,0 +1,3 @@ +body { + @{property-color}: @color; +} diff --git a/test/configCases/layer/context-and-css/test2/shared.less b/test/configCases/layer/context-and-css/test2/shared.less new file mode 100644 index 00000000000..4c32372804b --- /dev/null +++ b/test/configCases/layer/context-and-css/test2/shared.less @@ -0,0 +1,3 @@ +body { + @{property-background}: @color; +} diff --git a/test/configCases/layer/context-and-css/webpack.config.js b/test/configCases/layer/context-and-css/webpack.config.js new file mode 100644 index 00000000000..838b847cc99 --- /dev/null +++ b/test/configCases/layer/context-and-css/webpack.config.js @@ -0,0 +1,52 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + entry: { + light: { import: "./light.js", layer: "light" }, + dark: { import: "./dark.js", layer: "dark" } + }, + experiments: { + layers: true, + css: true + }, + optimization: { + runtimeChunk: "single" + }, + output: { + filename: "[name].js" + }, + module: { + rules: [ + { + test: /\.less$/i, + type: "css/auto", + oneOf: [ + { + issuerLayer: "light", + use: [ + { + loader: "less-loader", + options: { + additionalData: + "@color: white; @property-color: color-light; @property-background: background-light;" + } + } + ] + }, + { + issuerLayer: "dark", + use: [ + { + loader: "less-loader", + options: { + additionalData: + "@color: black; @property-color: color-dark; @property-background: background-dark;" + } + } + ] + } + ] + } + ] + } +}; diff --git a/test/configCases/layer/context/dark.js b/test/configCases/layer/context/dark.js new file mode 100644 index 00000000000..f2975a25f24 --- /dev/null +++ b/test/configCases/layer/context/dark.js @@ -0,0 +1,12 @@ +require.context('./test1', true, /\.less$/); +require('./test2/shared.less'); + +it("should contain only black", function() { + const fs = require("fs"); + const path = require("path"); + + const source = fs.readFileSync(path.join(__dirname, "dark.css"), "utf-8"); + + expect(source.match(/black/g)).toHaveLength(2); + expect(source).not.toContain("white"); +}); diff --git a/test/configCases/layer/context/light.js b/test/configCases/layer/context/light.js new file mode 100644 index 00000000000..e3c9335a95b --- /dev/null +++ b/test/configCases/layer/context/light.js @@ -0,0 +1,12 @@ +require.context('./test1', true, /\.less$/); +require('./test2/shared.less'); + +it("should contain only white", function() { + const fs = require("fs"); + const path = require("path"); + + const source = fs.readFileSync(path.join(__dirname, "light.css"), "utf-8"); + + expect(source.match(/white/g)).toHaveLength(2); + expect(source).not.toContain("black"); +}); diff --git a/test/configCases/layer/context/test.config.js b/test/configCases/layer/context/test.config.js new file mode 100644 index 00000000000..c6cd71fd288 --- /dev/null +++ b/test/configCases/layer/context/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./light.js", "./dark.js"]; + } +}; diff --git a/test/configCases/layer/context/test1/shared.less b/test/configCases/layer/context/test1/shared.less new file mode 100644 index 00000000000..aeef901bc65 --- /dev/null +++ b/test/configCases/layer/context/test1/shared.less @@ -0,0 +1,3 @@ +.test1 { + color: @color; +} diff --git a/test/configCases/layer/context/test2/shared.less b/test/configCases/layer/context/test2/shared.less new file mode 100644 index 00000000000..2cbc230e5a1 --- /dev/null +++ b/test/configCases/layer/context/test2/shared.less @@ -0,0 +1,3 @@ +.test2 { + color: @color; +} diff --git a/test/configCases/layer/context/webpack.config.js b/test/configCases/layer/context/webpack.config.js new file mode 100644 index 00000000000..41ed5eb13ee --- /dev/null +++ b/test/configCases/layer/context/webpack.config.js @@ -0,0 +1,55 @@ +const MiniCssExtractPlugin = require("mini-css-extract-plugin"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + light: { import: "./light.js", layer: "light" }, + dark: { import: "./dark.js", layer: "dark" } + }, + experiments: { + layers: true + }, + output: { + filename: "[name].js" + }, + plugins: [ + new MiniCssExtractPlugin({ + filename: "[name].css" + }) + ], + module: { + rules: [ + { + test: /\.less$/i, + oneOf: [ + { + issuerLayer: "light", + use: [ + MiniCssExtractPlugin.loader, + "css-loader", + { + loader: "less-loader", + options: { + additionalData: "@color: white;" + } + } + ] + }, + { + issuerLayer: "dark", + use: [ + MiniCssExtractPlugin.loader, + "css-loader", + { + loader: "less-loader", + options: { + additionalData: "@color: black;" + } + } + ] + } + ] + } + ] + } +}; diff --git a/test/configCases/layer/define-multiple-entries/common.js b/test/configCases/layer/define-multiple-entries/common.js new file mode 100644 index 00000000000..8545652d443 --- /dev/null +++ b/test/configCases/layer/define-multiple-entries/common.js @@ -0,0 +1,14 @@ +import * as module from "./modules/common.js"; +import getGlobalThis from "./utils/get-global-this.js"; + +it("should contain a valid value", async function() { + expect(module.default).toBe("common"); + + const dyn = await import("./modules/common-dyn.js"); + + expect(dyn.default).toBe("common-dyn"); +}); + +getGlobalThis()._COMMON = true; + +export default "common"; diff --git a/test/configCases/layer/define-multiple-entries/free.js b/test/configCases/layer/define-multiple-entries/free.js new file mode 100644 index 00000000000..9ce70b3d4f1 --- /dev/null +++ b/test/configCases/layer/define-multiple-entries/free.js @@ -0,0 +1,15 @@ +import * as module from "./modules/module.js"; +import getGlobalThis from "./utils/get-global-this.js"; + +it("should contain a valid value", async function() { + expect(getGlobalThis()._COMMON).toBe(true); + expect(module.default).toBe("free"); + + const dyn = await import("./modules/dyn.js"); + + expect(dyn.default).toBe("dyn"); + + const dynDefine = await import("./modules/dyn-define.js"); + + expect(dynDefine.default).toBe("free"); +}); diff --git a/test/configCases/layer/define-multiple-entries/modules/common-dyn.js b/test/configCases/layer/define-multiple-entries/modules/common-dyn.js new file mode 100644 index 00000000000..0ef67d2733d --- /dev/null +++ b/test/configCases/layer/define-multiple-entries/modules/common-dyn.js @@ -0,0 +1 @@ +export default "common-dyn"; diff --git a/test/configCases/layer/define-multiple-entries/modules/common.js b/test/configCases/layer/define-multiple-entries/modules/common.js new file mode 100644 index 00000000000..c735fc8c892 --- /dev/null +++ b/test/configCases/layer/define-multiple-entries/modules/common.js @@ -0,0 +1 @@ +export default "common"; diff --git a/test/configCases/layer/define-multiple-entries/modules/dyn-define.js b/test/configCases/layer/define-multiple-entries/modules/dyn-define.js new file mode 100644 index 00000000000..3f8d4b1dc37 --- /dev/null +++ b/test/configCases/layer/define-multiple-entries/modules/dyn-define.js @@ -0,0 +1 @@ +export default FREE_VERSION ? "free" : "paid" diff --git a/test/configCases/layer/define-multiple-entries/modules/dyn.js b/test/configCases/layer/define-multiple-entries/modules/dyn.js new file mode 100644 index 00000000000..ca56363f0a2 --- /dev/null +++ b/test/configCases/layer/define-multiple-entries/modules/dyn.js @@ -0,0 +1 @@ +export default "dyn"; diff --git a/test/configCases/layer/define-multiple-entries/modules/extra-dyn.js b/test/configCases/layer/define-multiple-entries/modules/extra-dyn.js new file mode 100644 index 00000000000..0ef5556e1b0 --- /dev/null +++ b/test/configCases/layer/define-multiple-entries/modules/extra-dyn.js @@ -0,0 +1 @@ +export default "extra-dyn"; diff --git a/test/configCases/layer/define-multiple-entries/modules/module.js b/test/configCases/layer/define-multiple-entries/modules/module.js new file mode 100644 index 00000000000..ed0e36aa1f7 --- /dev/null +++ b/test/configCases/layer/define-multiple-entries/modules/module.js @@ -0,0 +1,3 @@ +const value = FREE_VERSION ? "free" : "paid"; + +export default value; diff --git a/test/configCases/layer/define-multiple-entries/paid.js b/test/configCases/layer/define-multiple-entries/paid.js new file mode 100644 index 00000000000..978fd03379a --- /dev/null +++ b/test/configCases/layer/define-multiple-entries/paid.js @@ -0,0 +1,19 @@ +import * as module from "./modules/module.js"; +import getGlobalThis from "./utils/get-global-this.js"; + +it("should contain a valid value", async function() { + expect(getGlobalThis()._COMMON).toBe(true); + expect(module.default).toBe("paid"); + + const dyn = await import("./modules/dyn.js"); + + expect(dyn.default).toBe("dyn"); + + const extraDyn = await import("./modules/extra-dyn.js"); + + expect(extraDyn.default).toBe("extra-dyn"); + + const dynDefine = await import("./modules/dyn-define.js"); + + expect(dynDefine.default).toBe("paid"); +}); diff --git a/test/configCases/layer/define-multiple-entries/test.config.js b/test/configCases/layer/define-multiple-entries/test.config.js new file mode 100644 index 00000000000..fc2fea5bf92 --- /dev/null +++ b/test/configCases/layer/define-multiple-entries/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./common.js", "./free.js", "./paid.js"]; + } +}; diff --git a/test/configCases/layer/define-multiple-entries/utils/get-global-this.js b/test/configCases/layer/define-multiple-entries/utils/get-global-this.js new file mode 100644 index 00000000000..a5a0036272c --- /dev/null +++ b/test/configCases/layer/define-multiple-entries/utils/get-global-this.js @@ -0,0 +1,8 @@ +export default function getGlobalThis() { + if (typeof globalThis === 'object') return globalThis; + try { + return this || new Function('return this')(); + } catch (e) { + if (typeof window === 'object') return window; + } +} diff --git a/test/configCases/layer/define-multiple-entries/webpack.config.js b/test/configCases/layer/define-multiple-entries/webpack.config.js new file mode 100644 index 00000000000..6a95dd7de89 --- /dev/null +++ b/test/configCases/layer/define-multiple-entries/webpack.config.js @@ -0,0 +1,37 @@ +const { DefinePlugin } = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + common: { import: "./common.js", filename: "common.js" }, + + paid: { dependOn: "common", import: "./paid.js", layer: "paid" }, + free: { dependOn: "common", import: "./free.js", layer: "free" } + }, + experiments: { + layers: true + }, + optimization: { + splitChunks: { + cacheGroups: { + layerPaidCommon: { + name: "layer-paid-common", + layer: "paid", + chunks: "async", + enforce: true, + reuseExistingChunk: true + } + } + } + }, + output: { + filename: "[name].js" + }, + plugins: [ + new DefinePlugin({ + FREE_VERSION: DefinePlugin.runtimeValue( + ctx => ctx.module.layer === "free" + ) + }) + ] +}; diff --git a/test/configCases/layer/define-single-entry/main.js b/test/configCases/layer/define-single-entry/main.js new file mode 100644 index 00000000000..9409e378ad4 --- /dev/null +++ b/test/configCases/layer/define-single-entry/main.js @@ -0,0 +1,13 @@ +import * as module from "./modules/module.js"; + +it("should contain a valid value", async function() { + expect(module.default).toBe(FREE_VERSION ? "free" : "paid"); + + const dyn = await import("./modules/dyn.js"); + + expect(dyn.default).toBe("dyn"); + + const dynDefine = await import("./modules/dyn-define.js"); + + expect(dynDefine.default).toBe(FREE_VERSION ? "free" : "paid"); +}); diff --git a/test/configCases/layer/define-single-entry/modules/dyn-define.js b/test/configCases/layer/define-single-entry/modules/dyn-define.js new file mode 100644 index 00000000000..3f8d4b1dc37 --- /dev/null +++ b/test/configCases/layer/define-single-entry/modules/dyn-define.js @@ -0,0 +1 @@ +export default FREE_VERSION ? "free" : "paid" diff --git a/test/configCases/layer/define-single-entry/modules/dyn.js b/test/configCases/layer/define-single-entry/modules/dyn.js new file mode 100644 index 00000000000..ca56363f0a2 --- /dev/null +++ b/test/configCases/layer/define-single-entry/modules/dyn.js @@ -0,0 +1 @@ +export default "dyn"; diff --git a/test/configCases/layer/define-single-entry/modules/module.js b/test/configCases/layer/define-single-entry/modules/module.js new file mode 100644 index 00000000000..ed0e36aa1f7 --- /dev/null +++ b/test/configCases/layer/define-single-entry/modules/module.js @@ -0,0 +1,3 @@ +const value = FREE_VERSION ? "free" : "paid"; + +export default value; diff --git a/test/configCases/layer/define-single-entry/test.config.js b/test/configCases/layer/define-single-entry/test.config.js new file mode 100644 index 00000000000..458bcba5fc6 --- /dev/null +++ b/test/configCases/layer/define-single-entry/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./free.js", "./paid.js"]; + } +}; diff --git a/test/configCases/layer/define-single-entry/webpack.config.js b/test/configCases/layer/define-single-entry/webpack.config.js new file mode 100644 index 00000000000..cbeb7c22222 --- /dev/null +++ b/test/configCases/layer/define-single-entry/webpack.config.js @@ -0,0 +1,35 @@ +const { DefinePlugin } = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + paid: { import: "./main.js", layer: "paid" }, + free: { import: "./main.js", layer: "free" } + }, + experiments: { + layers: true + }, + optimization: { + splitChunks: { + cacheGroups: { + layerPaidCommon: { + name: "layer-paid-common", + layer: "paid", + chunks: "async", + enforce: true, + reuseExistingChunk: true + } + } + } + }, + output: { + filename: "[name].js" + }, + plugins: [ + new DefinePlugin({ + FREE_VERSION: DefinePlugin.runtimeValue( + ctx => ctx.module.layer === "free" + ) + }) + ] +}; diff --git a/test/configCases/layer/rules/dynamic-module-layer.js b/test/configCases/layer/rules/dynamic-module-layer.js new file mode 100644 index 00000000000..4c082635268 --- /dev/null +++ b/test/configCases/layer/rules/dynamic-module-layer.js @@ -0,0 +1,13 @@ +async function main(name) { + const { object: dynamicModuleObject } = await import(`./dynamic/${name}`); + return dynamicModuleObject; +} + +export const object = { + name: 'module entry', + layer: __webpack_layer__, + modules: [ + main('module1'), + main('module2'), + ] +}; \ No newline at end of file diff --git a/test/configCases/layer/rules/dynamic/module1.js b/test/configCases/layer/rules/dynamic/module1.js new file mode 100644 index 00000000000..2ee153c0c42 --- /dev/null +++ b/test/configCases/layer/rules/dynamic/module1.js @@ -0,0 +1,4 @@ +export const object = { + name: 'module1', + layer: __webpack_layer__, +}; \ No newline at end of file diff --git a/test/configCases/layer/rules/dynamic/module2.js b/test/configCases/layer/rules/dynamic/module2.js new file mode 100644 index 00000000000..1a9d4536add --- /dev/null +++ b/test/configCases/layer/rules/dynamic/module2.js @@ -0,0 +1,4 @@ +export const object = { + name: 'module2', + layer: __webpack_layer__ +}; \ No newline at end of file diff --git a/test/configCases/layer/rules/index.js b/test/configCases/layer/rules/index.js new file mode 100644 index 00000000000..f41c8b5ab27 --- /dev/null +++ b/test/configCases/layer/rules/index.js @@ -0,0 +1,47 @@ +import { object as direct } from "./module"; +import { object as reexported } from "./reexport"; +import { __loaderValue as entryLayerValue } from "./module"; +import { external1 as entryLayerExternal1 } from "./module"; +import { external2 as entryLayerExternal2 } from "./module"; + +import { direct as layerDirect } from "./module-layer-change"; +import { reexported as layerReexported } from "./module-layer-change"; +import { __loaderValue as layerValue } from "./module-layer-change"; +import { external1 as layerExternal1 } from "./module-layer-change"; +import { external2 as layerExternal2 } from "./module-layer-change"; + +import { direct as otherLayerDirect } from "./module-other-layer-change"; +import { reexported as otherLayerReexported } from "./module-other-layer-change"; +import { __loaderValue as otherLayerValue } from "./module-other-layer-change"; + +import { object as dynamicModules } from "./dynamic-module-layer" + +it("should allow to duplicate modules with layers", () => { + expect(direct).toBe(reexported); + expect(layerDirect).toBe(layerReexported); + expect(otherLayerDirect).toBe(otherLayerReexported); + + expect(layerDirect).not.toBe(direct); + expect(otherLayerDirect).not.toBe(direct); + expect(otherLayerDirect).not.toBe(layerDirect); +}); + +it("apply rules based on layer", () => { + expect(layerValue).toBe("ok"); + expect(otherLayerValue).toBe("other"); + expect(entryLayerValue).toBe("entry"); +}); + +it("apply externals based on layer", () => { + expect(entryLayerExternal1).toBe(42); + expect(entryLayerExternal2).toBe(42); + expect(layerExternal1).toBe(43); + expect(layerExternal2).toBe(43); +}); + +it("apply layer for dynamic imports with dynamic resources", async () => { + const mods = await Promise.all(dynamicModules.modules) + expect(dynamicModules.layer).toBe('dynamic-layer') + expect(mods[0]).toMatchObject({ layer: 'dynamic-layer', name: 'module1' }) + expect(mods[1]).toMatchObject({ layer: 'dynamic-layer', name: 'module2' }) +}) diff --git a/test/configCases/layer/rules/loader.js b/test/configCases/layer/rules/loader.js new file mode 100644 index 00000000000..7e5acde631c --- /dev/null +++ b/test/configCases/layer/rules/loader.js @@ -0,0 +1,7 @@ +/** @type {import("../../../../").LoaderDefinition<{ value: any }>} */ +module.exports = function (source) { + const options = this.getOptions(); + return `${source} +; +export const __loaderValue = ${JSON.stringify(options.value)};`; +}; diff --git a/test/configCases/layer/rules/module-layer-change.js b/test/configCases/layer/rules/module-layer-change.js new file mode 100644 index 00000000000..601aa230bb8 --- /dev/null +++ b/test/configCases/layer/rules/module-layer-change.js @@ -0,0 +1,3 @@ +export { object as direct } from "./module"; +export { object as reexported } from "./reexport"; +export * from "./module"; diff --git a/test/configCases/layer/rules/module-other-layer-change.js b/test/configCases/layer/rules/module-other-layer-change.js new file mode 100644 index 00000000000..601aa230bb8 --- /dev/null +++ b/test/configCases/layer/rules/module-other-layer-change.js @@ -0,0 +1,3 @@ +export { object as direct } from "./module"; +export { object as reexported } from "./reexport"; +export * from "./module"; diff --git a/test/configCases/layer/rules/module.js b/test/configCases/layer/rules/module.js new file mode 100644 index 00000000000..21a2ceba24d --- /dev/null +++ b/test/configCases/layer/rules/module.js @@ -0,0 +1,5 @@ +export const object = { + layer: __webpack_layer__ +}; +export { default as external1 } from "external1"; +export { default as external2 } from "external2"; diff --git a/test/configCases/layer/rules/reexport.js b/test/configCases/layer/rules/reexport.js new file mode 100644 index 00000000000..b999044ad5c --- /dev/null +++ b/test/configCases/layer/rules/reexport.js @@ -0,0 +1 @@ +export * from "./module"; diff --git a/test/configCases/layer/rules/webpack.config.js b/test/configCases/layer/rules/webpack.config.js new file mode 100644 index 00000000000..a1dc2986b58 --- /dev/null +++ b/test/configCases/layer/rules/webpack.config.js @@ -0,0 +1,75 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + bundle0: { + import: "./index.js", + layer: "entry-layer" + } + }, + output: { + pathinfo: "verbose" + }, + module: { + rules: [ + { + test: /module-layer-change/, + layer: "layer" + }, + { + test: /module-other-layer-change/, + layer: "other-layer" + }, + { + test: /module\.js$/, + issuerLayer: "other-layer", + loader: "./loader.js", + options: { + value: "other" + } + }, + { + test: /module\.js$/, + issuerLayer: "layer", + loader: "./loader.js", + options: { + value: "ok" + } + }, + { + test: /module\.js$/, + issuerLayer: "entry-layer", + loader: "./loader.js", + options: { + value: "entry" + } + }, + { + test: /dynamic-module-layer/, + layer: "dynamic-layer" + } + ] + }, + experiments: { + layers: true + }, + externals: [ + { + external1: "var 42", + byLayer: { + layer: { + external1: "var 43" + } + } + }, + { + external2: "var 42", + byLayer: layer => { + if (layer === "layer") { + return { + external2: "var 43" + }; + } + } + } + ] +}; diff --git a/test/configCases/library/0-create-library/class-commonjs.js b/test/configCases/library/0-create-library/class-commonjs.js new file mode 100644 index 00000000000..fbc4f806ca1 --- /dev/null +++ b/test/configCases/library/0-create-library/class-commonjs.js @@ -0,0 +1,6 @@ +module.exports = class MyClass { + getNumber() { + return 1; + } +}; + diff --git a/test/configCases/library/0-create-library/class-esm.js b/test/configCases/library/0-create-library/class-esm.js new file mode 100644 index 00000000000..3d49b87ac43 --- /dev/null +++ b/test/configCases/library/0-create-library/class-esm.js @@ -0,0 +1,5 @@ +export default class MyClass { + getNumber() { + return 2; + } +} diff --git a/test/configCases/library/0-create-library/esm-with-commonjs.js b/test/configCases/library/0-create-library/esm-with-commonjs.js new file mode 100644 index 00000000000..cb247437f81 --- /dev/null +++ b/test/configCases/library/0-create-library/esm-with-commonjs.js @@ -0,0 +1,16 @@ +export * from "./a"; +export default "default-value"; +export var b = "b"; +export { default as external } from "external"; +export * from "external-named"; +export { default as MyClass1 } from './class-commonjs'; +export { default as MyClass2 } from './class-esm'; +export { default as func1 } from './function-commonjs'; +export { default as func2 } from './function-esm'; + +var module = "should not conflict", + define = "should not conflict", + require = "should not conflict", + exports = "should not conflict", + globalName = "should not conflict"; +console.log.bind(console, module, define, require, exports, globalName); diff --git a/test/configCases/library/0-create-library/foo.js b/test/configCases/library/0-create-library/foo.js new file mode 100644 index 00000000000..d407b060289 --- /dev/null +++ b/test/configCases/library/0-create-library/foo.js @@ -0,0 +1 @@ +export const foo = "bar"; diff --git a/test/configCases/library/0-create-library/function-commonjs.js b/test/configCases/library/0-create-library/function-commonjs.js new file mode 100644 index 00000000000..3c031ce201e --- /dev/null +++ b/test/configCases/library/0-create-library/function-commonjs.js @@ -0,0 +1,3 @@ +module.exports = function test() { + return 3; +} diff --git a/test/configCases/library/0-create-library/function-esm.js b/test/configCases/library/0-create-library/function-esm.js new file mode 100644 index 00000000000..dc9b015047d --- /dev/null +++ b/test/configCases/library/0-create-library/function-esm.js @@ -0,0 +1,3 @@ +export default function test() { + return 4; +} diff --git a/test/configCases/library/0-create-library/index-async.js b/test/configCases/library/0-create-library/index-async.js new file mode 100644 index 00000000000..a0e48d70ee1 --- /dev/null +++ b/test/configCases/library/0-create-library/index-async.js @@ -0,0 +1,14 @@ +export * from "./a"; +export default "default-value"; +export var b = "b"; +export { default as external } from "external"; +export * from "external-named"; + +const test = await 1; + +var module = "should not conflict", + define = "should not conflict", + require = "should not conflict", + exports = "should not conflict", + globalName = "should not conflict"; +console.log.bind(console, module, define, require, exports, globalName); diff --git a/test/configCases/library/0-create-library/index.js b/test/configCases/library/0-create-library/index.js index c4ad22e5ae0..8f7dba45735 100644 --- a/test/configCases/library/0-create-library/index.js +++ b/test/configCases/library/0-create-library/index.js @@ -2,3 +2,11 @@ export * from "./a"; export default "default-value"; export var b = "b"; export { default as external } from "external"; +export * from "external-named"; + +var module = "should not conflict", + define = "should not conflict", + require = "should not conflict", + exports = "should not conflict", + globalName = "should not conflict"; +console.log.bind(console, module, define, require, exports, globalName); diff --git a/test/configCases/library/0-create-library/nested.js b/test/configCases/library/0-create-library/nested.js new file mode 100644 index 00000000000..65e80f3309a --- /dev/null +++ b/test/configCases/library/0-create-library/nested.js @@ -0,0 +1,8 @@ +export * as NS from "./index.js"; + +var module = "should not conflict", + define = "should not conflict", + require = "should not conflict", + exports = "should not conflict", + globalName = "should not conflict"; +console.log.bind(console, module, define, require, exports, globalName); diff --git a/test/configCases/library/0-create-library/non-external-named.js b/test/configCases/library/0-create-library/non-external-named.js new file mode 100644 index 00000000000..7646000d958 --- /dev/null +++ b/test/configCases/library/0-create-library/non-external-named.js @@ -0,0 +1 @@ +export const nonExternalA = "non-external-a"; diff --git a/test/configCases/library/0-create-library/test.config.js b/test/configCases/library/0-create-library/test.config.js index 08ea6c319c8..04581a81040 100644 --- a/test/configCases/library/0-create-library/test.config.js +++ b/test/configCases/library/0-create-library/test.config.js @@ -1 +1 @@ -exports.noTests = true; +module.exports.noTests = true; diff --git a/test/configCases/library/0-create-library/webpack.config.js b/test/configCases/library/0-create-library/webpack.config.js index a2e2007698d..cef2e1a9389 100644 --- a/test/configCases/library/0-create-library/webpack.config.js +++ b/test/configCases/library/0-create-library/webpack.config.js @@ -1,65 +1,781 @@ -module.exports = [ +const path = require("path"); +const webpack = require("../../../../"); +const supportsAsync = require("../../../helpers/supportsAsync"); + +/** @type {(env: Env, options: TestOptions) => import("../../../../").Configuration[]} */ +module.exports = (env, { testPath }) => [ { output: { + uniqueName: "modern-module", + filename: "modern-module.js", + library: { + type: "modern-module" + } + }, + target: "node14", + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + }, + experiments: { + outputModule: true + } + }, + { + output: { + uniqueName: "esm", + filename: "esm.js", + library: { + type: "module" + } + }, + target: "node14", + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + }, + experiments: { + outputModule: true + } + }, + { + entry: "./esm-with-commonjs.js", + output: { + uniqueName: "esm-with-commonjs", + filename: "esm-with-commonjs.js", + library: { + type: "module" + } + }, + target: "node14", + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + }, + experiments: { + outputModule: true + } + }, + { + output: { + uniqueName: "esm-export", + filename: "esm-export.js", + library: { + type: "module", + export: ["a"] + } + }, + target: "node14", + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + }, + experiments: { + outputModule: true + } + }, + ...(supportsAsync() + ? [ + { + entry: "./index-async.js", + output: { + uniqueName: "esm-async", + filename: "esm-async.js", + library: { + type: "module" + } + }, + optimization: { + concatenateModules: true + }, + target: "node14", + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + }, + experiments: { + outputModule: true + } + }, + { + entry: "./index-async.js", + output: { + uniqueName: "esm-async-no-concatenate-modules", + filename: "esm-async-no-concatenate-modules.js", + library: { + type: "module" + } + }, + optimization: { + concatenateModules: false + }, + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + }, + experiments: { + outputModule: true + } + } + ] + : []), + { + output: { + uniqueName: "esm-export-no-concatenate-modules", + filename: "esm-export-no-concatenate-modules.js", + library: { + type: "module", + export: ["a"] + } + }, + target: "node14", + optimization: { + concatenateModules: false + }, + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + }, + experiments: { + outputModule: true + } + }, + { + output: { + uniqueName: "esm-runtimeChunk", + filename: "esm-runtimeChunk/[name].js", + library: { + type: "module" + } + }, + target: "node14", + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + }, + optimization: { + runtimeChunk: "single" + }, + experiments: { + outputModule: true + } + }, + { + output: { + uniqueName: "esm-runtimeChunk-concatenateModules", + filename: "esm-runtimeChunk-concatenateModules/[name].js", + library: { + type: "module" + } + }, + target: "node14", + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + }, + optimization: { + runtimeChunk: "single", + concatenateModules: true + }, + experiments: { + outputModule: true + } + }, + { + output: { + uniqueName: "esm-runtimeChunk-no-concatenateModules", + filename: "esm-runtimeChunk-no-concatenateModules/[name].js", + library: { + type: "module" + } + }, + target: "node14", + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + }, + optimization: { + runtimeChunk: "single", + concatenateModules: false + }, + experiments: { + outputModule: true + } + }, + { + output: { + uniqueName: "esm-runtimeChunk-concatenateModules-splitChunks", + filename: "esm-runtimeChunk-concatenateModules-splitChunks/[name].js", + library: { + type: "module" + } + }, + target: "node14", + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + }, + optimization: { + runtimeChunk: "single", + concatenateModules: true, + splitChunks: { + cacheGroups: { + module: { + test: /a\.js$/, + chunks: "all", + enforce: true, + reuseExistingChunk: true + } + } + } + }, + experiments: { + outputModule: true + } + }, + { + entry: ["./foo.js", "./index.js"], + output: { + uniqueName: "esm-multiple-entry-modules", + filename: "esm-multiple-entry-modules.js", + library: { + type: "module" + } + }, + target: "node14", + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + }, + experiments: { + outputModule: true + } + }, + { + output: { + uniqueName: "commonjs", filename: "commonjs.js", - libraryTarget: "commonjs-module" + library: { + type: "commonjs" + }, + iife: false + }, + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + } + }, + { + output: { + uniqueName: "commonjs-iife", + filename: "commonjs-iife.js", + library: { + type: "commonjs" + }, + iife: true + }, + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + } + }, + { + output: { + uniqueName: "amd", + filename: "amd.js", + library: { + type: "amd" + }, + iife: false + }, + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + } + }, + { + output: { + uniqueName: "amd-iife", + filename: "amd-iife.js", + library: { + type: "amd" + }, + iife: true + }, + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + } + }, + { + output: { + uniqueName: "amd-runtimeChunk", + filename: "amd-runtimeChunk/[name].js", + library: { + type: "amd" + }, + globalObject: "global", + iife: false + }, + target: "web", + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + }, + optimization: { + runtimeChunk: "single" + } + }, + { + output: { + uniqueName: "amd-iife-runtimeChunk", + filename: "amd-iife-runtimeChunk/[name].js", + library: { + type: "amd" + }, + globalObject: "global", + iife: true }, + target: "web", resolve: { alias: { - external: "./non-external" + external: "./non-external", + "external-named": "./non-external-named" } + }, + optimization: { + runtimeChunk: "single" } }, { output: { + uniqueName: "umd", filename: "umd.js", - libraryTarget: "umd" + library: { + type: "umd" + } + }, + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + } + }, + { + output: { + uniqueName: "true-iife-umd", + filename: "true-iife-umd.js", + library: { + type: "umd" + }, + iife: true }, resolve: { alias: { - external: "./non-external" + external: "./non-external", + "external-named": "./non-external-named" } } }, { output: { + uniqueName: "false-iife-umd", + filename: "false-iife-umd.js", + library: { + type: "umd" + }, + iife: false + }, + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + }, + ignoreWarnings: [error => error.name === "FalseIIFEUmdWarning"] + }, + { + output: { + uniqueName: "false-iife-umd2", + filename: "false-iife-umd2.js", + library: { + type: "umd2" + }, + iife: false + }, + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + }, + ignoreWarnings: [error => error.name === "FalseIIFEUmdWarning"] + }, + { + output: { + uniqueName: "umd-default", filename: "umd-default.js", - libraryTarget: "umd", - libraryExport: "default" + library: { + type: "umd", + export: "default" + } }, resolve: { alias: { - external: "./non-external" + external: "./non-external", + "external-named": "./non-external-named" } } }, { output: { + uniqueName: "this", filename: "this.js", - libraryTarget: "this" + library: { + type: "this" + }, + iife: false + }, + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + } + }, + { + output: { + uniqueName: "this-iife", + filename: "this-iife.js", + library: { + type: "this" + }, + iife: true + }, + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + } + }, + { + output: { + uniqueName: "var", + filename: "var.js", + library: ["globalName", "x", "y"], + iife: false + }, + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + }, + plugins: [ + new webpack.BannerPlugin({ + raw: true, + banner: "module.exports = () => globalName;\n" + }) + ] + }, + { + output: { + uniqueName: "var-iife", + filename: "var-iife.js", + library: ["globalName", "x", "y"], + iife: true + }, + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + }, + plugins: [ + new webpack.BannerPlugin({ + raw: true, + banner: "module.exports = () => globalName;\n" + }) + ] + }, + { + entry: "./nested.js", + output: { + uniqueName: "commonjs-nested", + filename: "commonjs-nested.js", + library: { + type: "commonjs", + export: "NS" + }, + iife: false }, resolve: { alias: { - external: "./non-external" + external: "./non-external", + "external-named": "./non-external-named" } } }, { + entry: "./nested.js", output: { - filename: "global.js", - library: "globalName" + uniqueName: "commonjs-nested-iife", + filename: "commonjs-nested-iife.js", + library: { + type: "commonjs", + export: "NS" + }, + iife: true }, resolve: { alias: { - external: "./non-external" + external: "./non-external", + "external-named": "./non-external-named" } } }, { output: { + uniqueName: "commonjs2-external", filename: "commonjs2-external.js", - libraryTarget: "commonjs2" + library: { + type: "commonjs2" + }, + iife: false + }, + externals: ["external", "external-named"] + }, + { + output: { + uniqueName: "commonjs2-external-no-concat", + filename: "commonjs2-external-no-concat.js", + library: { + type: "commonjs2" + }, + iife: false + }, + optimization: { + concatenateModules: false + }, + externals: ["external", "external-named"] + }, + { + output: { + uniqueName: "commonjs2-iife-external", + filename: "commonjs2-iife-external.js", + library: { + type: "commonjs2" + }, + iife: true }, - externals: ["external"] + externals: ["external", "external-named"] + }, + { + mode: "development", + output: { + uniqueName: "commonjs2-external-eval", + filename: "commonjs2-external-eval.js", + library: { + type: "commonjs2" + } + }, + externals: ["external", "external-named"] + }, + { + mode: "development", + output: { + uniqueName: "commonjs2-external-eval-source-map", + filename: "commonjs2-external-eval-source-map.js", + library: { + type: "commonjs2" + } + }, + devtool: "eval-source-map", + externals: ["external", "external-named"] + }, + { + output: { + uniqueName: "commonjs-static-external", + filename: "commonjs-static-external.js", + library: { + type: "commonjs-static" + }, + iife: false + }, + externals: ["external", "external-named"] + }, + { + output: { + uniqueName: "index", + filename: "index.js", + path: path.resolve(testPath, "commonjs2-split-chunks"), + library: { + type: "commonjs2" + } + }, + target: "node", + optimization: { + splitChunks: { + cacheGroups: { + test: { + enforce: true, + chunks: "all", + test: /a\.js$/, + filename: "part.js" + } + } + } + }, + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + } + }, + { + output: { + uniqueName: "commonjs2-runtimeChunk", + filename: "commonjs2-runtimeChunk/[name].js", + library: { + type: "commonjs2" + }, + iife: false + }, + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + }, + optimization: { + runtimeChunk: "single" + } + }, + { + output: { + uniqueName: "commonjs2-iife-runtimeChunk", + filename: "commonjs2-iife-runtimeChunk/[name].js", + library: { + type: "commonjs2" + }, + iife: true + }, + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + }, + optimization: { + runtimeChunk: "single" + } + }, + { + output: { + uniqueName: "global-runtimeChunk", + filename: "global-runtimeChunk/[name].js", + library: ["globalName", "x", "y"], + libraryTarget: "global", + iife: false + }, + target: "web", + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + }, + optimization: { + runtimeChunk: "single" + } + }, + { + output: { + uniqueName: "global-iife-runtimeChunk", + filename: "global-iife-runtimeChunk/[name].js", + library: ["globalName", "x", "y"], + libraryTarget: "global", + iife: true + }, + target: "web", + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + }, + optimization: { + runtimeChunk: "single" + } + }, + { + entry: { + entryA: { + import: "./index" + }, + entryB: { + import: "./index", + library: { + type: "umd", + name: "umd" + } + }, + entryC: { + import: "./index", + library: { + type: "amd" + } + } + }, + output: { + library: { + type: "commonjs-module" + }, + uniqueName: "commonjs-module", + filename: "[name].js" + }, + resolve: { + alias: { + external: "./non-external", + "external-named": "./non-external-named" + } + } } ]; diff --git a/test/configCases/library/1-use-library/default-test-modern-module.js b/test/configCases/library/1-use-library/default-test-modern-module.js new file mode 100644 index 00000000000..13f92f0fa20 --- /dev/null +++ b/test/configCases/library/1-use-library/default-test-modern-module.js @@ -0,0 +1,5 @@ +import d from "library"; + +it("should tree-shake other exports from library (" + NAME + ")", function() { + expect(d).toBe("default-value"); +}); diff --git a/test/configCases/library/1-use-library/esm-with-commonjs.js b/test/configCases/library/1-use-library/esm-with-commonjs.js new file mode 100644 index 00000000000..d53b8d23844 --- /dev/null +++ b/test/configCases/library/1-use-library/esm-with-commonjs.js @@ -0,0 +1,26 @@ +import d from "library"; +import { a, b, external, MyClass1, MyClass2, func1, func2 } from "library"; +import * as imoprtStar from "library"; + +it( + "should be able to import harmony exports from library (" + NAME + ")", + function () { + expect(d).toBe("default-value"); + expect(a).toBe("a"); + expect(b).toBe("b"); + expect(new MyClass1().getNumber()).toBe(1); + expect(new MyClass2().getNumber()).toBe(2); + expect(func1()).toBe(3); + expect(func2()).toBe(4); + if (typeof TEST_EXTERNAL !== "undefined" && TEST_EXTERNAL) { + expect(external).toEqual(["external"]); + expect(external).toBe(require("external")); + const { externalA } = imoprtStar + expect(externalA).toEqual(["external-a"]); + } else { + expect(external).toBe("non-external"); + const { nonExternalA } = imoprtStar; + expect(nonExternalA).toBe("non-external-a"); + } + } +); diff --git a/test/configCases/library/1-use-library/index.js b/test/configCases/library/1-use-library/index.js index 726072db8f0..f4975cce23e 100644 --- a/test/configCases/library/1-use-library/index.js +++ b/test/configCases/library/1-use-library/index.js @@ -1,14 +1,22 @@ import d from "library"; import { a, b, external } from "library"; +import * as imoprtStar from "library"; -it("should be able to import harmony exports from library (" + NAME + ")", function() { - expect(d).toBe("default-value"); - expect(a).toBe("a"); - expect(b).toBe("b"); - if(typeof TEST_EXTERNAL !== "undefined" && TEST_EXTERNAL) { - expect(external).toEqual(["external"]); - expect(external).toBe(require("external")); - } else { - expect(external).toBe("non-external"); +it( + "should be able to import harmony exports from library (" + NAME + ")", + function () { + expect(d).toBe("default-value"); + expect(a).toBe("a"); + expect(b).toBe("b"); + if (typeof TEST_EXTERNAL !== "undefined" && TEST_EXTERNAL) { + expect(external).toEqual(["external"]); + expect(external).toBe(require("external")); + const { externalA } = imoprtStar + expect(externalA).toEqual(["external-a"]); + } else { + expect(external).toBe("non-external"); + const { nonExternalA } = imoprtStar; + expect(nonExternalA).toBe("non-external-a"); + } } -}); +); diff --git a/test/configCases/library/1-use-library/module-export-test.js b/test/configCases/library/1-use-library/module-export-test.js new file mode 100644 index 00000000000..0f1e4cb4d27 --- /dev/null +++ b/test/configCases/library/1-use-library/module-export-test.js @@ -0,0 +1,5 @@ +import * as mod from "library"; + +it("should tree-shake other exports from library (" + NAME + ") and export only 'a'", function() { + expect(mod).toMatchObject({ a: "a" }); +}); diff --git a/test/configCases/library/1-use-library/node_modules/external-named.js b/test/configCases/library/1-use-library/node_modules/external-named.js new file mode 100644 index 00000000000..ca3fa757c31 --- /dev/null +++ b/test/configCases/library/1-use-library/node_modules/external-named.js @@ -0,0 +1 @@ +module.exports['externalA'] = ["external-a"]; diff --git a/test/configCases/library/1-use-library/test.config.js b/test/configCases/library/1-use-library/test.config.js new file mode 100644 index 00000000000..ac11abf4252 --- /dev/null +++ b/test/configCases/library/1-use-library/test.config.js @@ -0,0 +1,10 @@ +module.exports = { + moduleScope(scope) { + scope.define = factory => { + scope.module.exports = factory(); + }; + }, + afterExecute() { + delete global.webpackChunk; + } +}; diff --git a/test/configCases/library/1-use-library/global-test.js b/test/configCases/library/1-use-library/this-test.js similarity index 100% rename from test/configCases/library/1-use-library/global-test.js rename to test/configCases/library/1-use-library/this-test.js diff --git a/test/configCases/library/1-use-library/var-test.js b/test/configCases/library/1-use-library/var-test.js new file mode 100644 index 00000000000..5e990818fc4 --- /dev/null +++ b/test/configCases/library/1-use-library/var-test.js @@ -0,0 +1,11 @@ +var getData = require("library"); + +it("should be able get items from library (" + NAME + ")", function() { + const d = getData(); + expect(d).toHaveProperty("x"); + expect(d.x).toHaveProperty("y"); + const data = d.x.y; + expect(data).toHaveProperty("default", "default-value"); + expect(data).toHaveProperty("a", "a"); + expect(data).toHaveProperty("b", "b"); +}); diff --git a/test/configCases/library/1-use-library/webpack.config.js b/test/configCases/library/1-use-library/webpack.config.js index 05624691fa1..febe3417ec3 100644 --- a/test/configCases/library/1-use-library/webpack.config.js +++ b/test/configCases/library/1-use-library/webpack.config.js @@ -1,49 +1,471 @@ -var webpack = require("../../../../"); -var path = require("path"); -module.exports = [ +/** @typedef {import("../../../../").Compiler} Compiler */ +/** @typedef {import("../../../../").Compilation} Compilation */ + +const webpack = require("../../../../"); +const path = require("path"); +const supportsAsync = require("../../../helpers/supportsAsync"); + +/** @type {(env: Env, options: TestOptions) => import("../../../../").Configuration[]} */ +module.exports = (env, { testPath }) => [ { + entry: "./default-test-modern-module.js", + optimization: { + minimize: true + }, + resolve: { + alias: { + library: path.resolve(testPath, "../0-create-library/modern-module.js") + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("modern-module-tree-shakable") + }), + /** + * @this {Compiler} compiler + */ + function () { + /** + * @param {Compilation} compilation compilation + * @returns {void} + */ + const handler = compilation => { + compilation.hooks.afterProcessAssets.tap("testcase", assets => { + for (const asset of Object.keys(assets)) { + const source = assets[asset].source(); + expect(source).not.toContain('"a"'); + expect(source).not.toContain('"b"'); + expect(source).not.toContain('"non-external"'); + // expect pure ESM export without webpack runtime + expect(source).not.toContain('"__webpack_exports__"'); + expect(source).not.toContain(".exports="); + } + }); + }; + this.hooks.compilation.tap("testcase", handler); + } + ] + }, + { + resolve: { + alias: { + library: path.resolve(testPath, "../0-create-library/esm.js") + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("esm") + }) + ] + }, + { + entry: "./esm-with-commonjs", resolve: { alias: { library: path.resolve( - __dirname, - "../../../js/config/library/0-create-library/commonjs.js" + testPath, + "../0-create-library/esm-with-commonjs.js" + ) + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("esm-with-commonjs") + }) + ] + }, + { + entry: "./module-export-test.js", + resolve: { + alias: { + library: path.resolve(testPath, "../0-create-library/esm-export.js") + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("esm-export") + }) + ] + }, + { + entry: "./module-export-test.js", + resolve: { + alias: { + library: path.resolve( + testPath, + "../0-create-library/esm-export-no-concatenate-modules.js" + ) + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("esm-export-no-concatenate-modules.js") + }) + ] + }, + ...(supportsAsync() + ? [ + { + resolve: { + alias: { + library: path.resolve( + testPath, + "../0-create-library/esm-async.js" + ) + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("esm-async") + }) + ] + }, + { + resolve: { + alias: { + library: path.resolve( + testPath, + "../0-create-library/esm-async-no-concatenate-modules.js" + ) + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("esm-async-no-concatenate-modules") + }) + ] + } + ] + : []), + { + resolve: { + alias: { + library: path.resolve( + testPath, + "../0-create-library/esm-runtimeChunk/main.js" + ) + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("esm-runtimeChunk") + }) + ] + }, + { + resolve: { + alias: { + library: path.resolve( + testPath, + "../0-create-library/esm-runtimeChunk-concatenateModules/main.js" + ) + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("esm-runtimeChunk-concatenateModules") + }) + ] + }, + { + resolve: { + alias: { + library: path.resolve( + testPath, + "../0-create-library/esm-runtimeChunk-no-concatenateModules/main.js" + ) + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("esm-runtimeChunk-no-concatenateModules") + }) + ] + }, + { + resolve: { + alias: { + library: path.resolve( + testPath, + "../0-create-library/esm-runtimeChunk-concatenateModules-splitChunks/main.js" + ) + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("esm-runtimeChunk-concatenateModules-splitChunks") + }) + ] + }, + { + resolve: { + alias: { + library: path.resolve( + testPath, + "../0-create-library/esm-multiple-entry-modules.js" ) } }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("esm-multiple-entry-modules") + }) + ] + }, + { + resolve: { + alias: { + library: path.resolve(testPath, "../0-create-library/commonjs.js") + } + }, plugins: [ new webpack.DefinePlugin({ NAME: JSON.stringify("commonjs") }) ] }, + { + resolve: { + alias: { + library: path.resolve(testPath, "../0-create-library/commonjs-iife.js") + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("commonjs-iife") + }) + ] + }, + { + resolve: { + alias: { + library: path.resolve(testPath, "../0-create-library/amd.js") + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("amd") + }) + ] + }, + { + resolve: { + alias: { + library: path.resolve(testPath, "../0-create-library/amd-iife.js") + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("amd-iife") + }) + ] + }, + { + externals: { + library: `promise (require(${JSON.stringify( + "../0-create-library/amd-runtimeChunk/runtime.js" + )}), require(${JSON.stringify( + "../0-create-library/amd-runtimeChunk/main.js" + )}))` + }, + output: { + library: { type: "commonjs-module" } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("amd-runtimeChunk") + }) + ] + }, + { + externals: { + library: `promise (require(${JSON.stringify( + "../0-create-library/amd-iife-runtimeChunk/runtime.js" + )}), require(${JSON.stringify( + "../0-create-library/amd-iife-runtimeChunk/main.js" + )}))` + }, + output: { + library: { type: "commonjs-module" } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("amd-iife-runtimeChunk") + }) + ] + }, + { + resolve: { + alias: { + library: path.resolve(testPath, "../0-create-library/umd.js") + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("umd") + }) + ] + }, + { + resolve: { + alias: { + library: path.resolve(testPath, "../0-create-library/true-iife-umd.js") + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("true-iife-umd") + }) + ] + }, + { + resolve: { + alias: { + library: path.resolve(testPath, "../0-create-library/false-iife-umd.js") + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("false-iife-umd") + }) + ] + }, { resolve: { alias: { library: path.resolve( + testPath, + "../0-create-library/false-iife-umd2.js" + ) + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("false-iife-umd2") + }) + ] + }, + { + entry: "./this-test.js", + resolve: { + alias: { + library: path.resolve(testPath, "../0-create-library/this.js") + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("this") + }) + ] + }, + { + entry: "./this-test.js", + resolve: { + alias: { + library: path.resolve(testPath, "../0-create-library/this-iife.js") + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("this-iife") + }) + ] + }, + { + entry: "./var-test.js", + resolve: { + alias: { + library: path.resolve(testPath, "../0-create-library/var.js") + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("var") + }) + ] + }, + { + entry: "./var-test.js", + resolve: { + alias: { + library: path.resolve(testPath, "../0-create-library/var-iife.js") + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("var-iife") + }) + ] + }, + { + resolve: { + alias: { + library: path.resolve( + testPath, + "../0-create-library/commonjs-nested.js" + ) + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("commonjs-nested") + }) + ] + }, + { + resolve: { + alias: { + library: path.resolve( + testPath, + "../0-create-library/commonjs-nested-iife.js" + ) + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("commonjs-nested-iife") + }) + ] + }, + { + resolve: { + alias: { + library: path.resolve( + testPath, + "../0-create-library/commonjs2-external.js" + ), + external: path.resolve(__dirname, "node_modules/external.js"), + "external-named": path.resolve( __dirname, - "../../../js/config/library/0-create-library/umd.js" + "node_modules/external-named.js" ) } }, plugins: [ new webpack.DefinePlugin({ - NAME: JSON.stringify("umd") + NAME: JSON.stringify("commonjs2 with external"), + TEST_EXTERNAL: true }) ] }, { - entry: "./global-test.js", resolve: { alias: { library: path.resolve( + testPath, + "../0-create-library/commonjs2-iife-external.js" + ), + external: path.resolve(__dirname, "node_modules/external.js"), + "external-named": path.resolve( __dirname, - "../../../js/config/library/0-create-library/this.js" + "node_modules/external-named.js" ) } }, plugins: [ new webpack.DefinePlugin({ - NAME: JSON.stringify("this") + NAME: JSON.stringify("commonjs2-iife with external"), + TEST_EXTERNAL: true }) ] }, @@ -51,33 +473,201 @@ module.exports = [ resolve: { alias: { library: path.resolve( + testPath, + "../0-create-library/commonjs2-external-eval.js" + ), + external: path.resolve(__dirname, "node_modules/external.js"), + "external-named": path.resolve( __dirname, - "../../../js/config/library/0-create-library/commonjs2-external.js" + "node_modules/external-named.js" + ) + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("commonjs2 with external and eval devtool"), + TEST_EXTERNAL: true + }) + ] + }, + { + resolve: { + alias: { + library: path.resolve( + testPath, + "../0-create-library/commonjs2-external-eval-source-map.js" ), - external: path.resolve(__dirname, "node_modules/external.js") + external: path.resolve(__dirname, "node_modules/external.js"), + "external-named": path.resolve( + __dirname, + "node_modules/external-named.js" + ) } }, plugins: [ new webpack.DefinePlugin({ - NAME: JSON.stringify("commonjs2 with external"), + NAME: JSON.stringify( + "commonjs2 with external and eval-source-map devtool" + ), + TEST_EXTERNAL: true + }) + ] + }, + { + resolve: { + alias: { + library: path.resolve( + testPath, + "../0-create-library/commonjs-static-external.js" + ), + external: path.resolve(__dirname, "node_modules/external.js"), + "external-named": path.resolve( + __dirname, + "node_modules/external-named.js" + ) + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("commonjs-static with external"), TEST_EXTERNAL: true }) ] }, { - entry: "./default-test.js", resolve: { alias: { library: path.resolve( + testPath, + "../0-create-library/commonjs2-split-chunks/" + ), + external: path.resolve(__dirname, "node_modules/external.js"), + "external-named": path.resolve( __dirname, - "../../../js/config/library/0-create-library/umd-default.js" + "node_modules/external-named.js" ) } }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("commonjs2 with splitChunks") + }) + ] + }, + { + entry: "./default-test.js", + resolve: { + alias: { + library: path.resolve(testPath, "../0-create-library/umd-default.js") + } + }, plugins: [ new webpack.DefinePlugin({ NAME: JSON.stringify("default") }) ] + }, + { + externals: { + library: `promise require(${JSON.stringify( + path.resolve( + testPath, + "../0-create-library/commonjs2-runtimeChunk/main.js" + ) + )})` + }, + output: { + library: { type: "commonjs-module" } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("commonjs2-runtimeChunk") + }) + ] + }, + { + externals: { + library: `promise require(${JSON.stringify( + path.resolve( + testPath, + "../0-create-library/commonjs2-iife-runtimeChunk/main.js" + ) + )})` + }, + output: { + library: { type: "commonjs-module" } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("commonjs2-iife-runtimeChunk") + }) + ] + }, + { + externals: { + library: `var (require(${JSON.stringify( + "../0-create-library/global-runtimeChunk/runtime.js" + )}), require(${JSON.stringify( + "../0-create-library/global-runtimeChunk/main.js" + )}), globalName.x.y)` + }, + target: "web", + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("global-runtimeChunk") + }) + ] + }, + { + externals: { + library: `var (require(${JSON.stringify( + "../0-create-library/global-iife-runtimeChunk/runtime.js" + )}), require(${JSON.stringify( + "../0-create-library/global-iife-runtimeChunk/main.js" + )}), globalName.x.y)` + }, + target: "web", + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("global-iife-runtimeChunk") + }) + ] + }, + + { + resolve: { + alias: { + library: path.resolve(testPath, "../0-create-library/entryA.js") + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("entryA") + }) + ] + }, + { + resolve: { + alias: { + library: path.resolve(testPath, "../0-create-library/entryB.js") + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("entryB") + }) + ] + }, + { + resolve: { + alias: { + library: path.resolve(testPath, "../0-create-library/entryC.js") + } + }, + plugins: [ + new webpack.DefinePlugin({ + NAME: JSON.stringify("entryC") + }) + ] } ]; diff --git a/test/configCases/library/a/webpack.config.js b/test/configCases/library/a/webpack.config.js index bcd111fb14e..d6284c7acc7 100644 --- a/test/configCases/library/a/webpack.config.js +++ b/test/configCases/library/a/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { output: { libraryTarget: "this" diff --git a/test/configCases/library/array-global/webpack.config.js b/test/configCases/library/array-global/webpack.config.js index bc177f6b567..2e6d8a1e210 100644 --- a/test/configCases/library/array-global/webpack.config.js +++ b/test/configCases/library/array-global/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { output: { library: ["a", "b"] diff --git a/test/configCases/library/array-window/webpack.config.js b/test/configCases/library/array-window/webpack.config.js index 010ed97f19c..0a58ae241bb 100644 --- a/test/configCases/library/array-window/webpack.config.js +++ b/test/configCases/library/array-window/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { target: "web", output: { diff --git a/test/configCases/library/assign-properties/index.js b/test/configCases/library/assign-properties/index.js new file mode 100644 index 00000000000..0fd13844838 --- /dev/null +++ b/test/configCases/library/assign-properties/index.js @@ -0,0 +1,9 @@ +it("should define global object with property", function() { + expect(process.env["assign_properties_env"]).toEqual("1"); + + expect(Object.keys(process.env).length).toBeGreaterThan(1); +}); + +module.exports = { + assign_properties_env: "1" +} diff --git a/test/configCases/library/assign-properties/webpack.config.js b/test/configCases/library/assign-properties/webpack.config.js new file mode 100644 index 00000000000..4e398b45410 --- /dev/null +++ b/test/configCases/library/assign-properties/webpack.config.js @@ -0,0 +1,7 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + library: ["process", "env"], + libraryTarget: "assign-properties" + } +}; diff --git a/test/configCases/library/b/webpack.config.js b/test/configCases/library/b/webpack.config.js index 92f8b666bda..e2f1eaa2db8 100644 --- a/test/configCases/library/b/webpack.config.js +++ b/test/configCases/library/b/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { output: { libraryTarget: "global" diff --git a/test/configCases/library/cjs-static/index.js b/test/configCases/library/cjs-static/index.js new file mode 100644 index 00000000000..069aa76ae7b --- /dev/null +++ b/test/configCases/library/cjs-static/index.js @@ -0,0 +1,10 @@ +const fs = require("fs") +export const foo1 = () => {} +export const foo2 = () => {} +const bar = "bar"; +export default bar + +it("should success compile and work",()=>{ + const output = fs.readFileSync(__filename).toString(); + expect(output.match(/exports(\[|\.)/g).length).toBe(4) +}) diff --git a/test/configCases/library/cjs-static/webpack.config.js b/test/configCases/library/cjs-static/webpack.config.js new file mode 100644 index 00000000000..68425c7fa2d --- /dev/null +++ b/test/configCases/library/cjs-static/webpack.config.js @@ -0,0 +1,7 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "node", + output: { + library: { type: "commonjs-static" } + } +}; diff --git a/test/configCases/library/disable-provided-export/commonjs-static.js b/test/configCases/library/disable-provided-export/commonjs-static.js new file mode 100644 index 00000000000..72b15205e9a --- /dev/null +++ b/test/configCases/library/disable-provided-export/commonjs-static.js @@ -0,0 +1,2 @@ +export const lib3 = 'commonjs-static' + diff --git a/test/configCases/library/disable-provided-export/modern-module.js b/test/configCases/library/disable-provided-export/modern-module.js new file mode 100644 index 00000000000..8914545ca5f --- /dev/null +++ b/test/configCases/library/disable-provided-export/modern-module.js @@ -0,0 +1,8 @@ +export const lib2 = 'modern-module' + +export default "null" + +it("should compile and run", () => { + // avoid `No tests exported by test case` + expect(true).toBe(true) +}); \ No newline at end of file diff --git a/test/configCases/library/disable-provided-export/module.js b/test/configCases/library/disable-provided-export/module.js new file mode 100644 index 00000000000..731411836f8 --- /dev/null +++ b/test/configCases/library/disable-provided-export/module.js @@ -0,0 +1,11 @@ +import React from 'react'; + +const foo = "module" + +export default 'module' +export { React, foo } + +it("should compile and run", () => { + // avoid `No tests exported by test case` + expect(true).toBe(true) +}); diff --git a/test/configCases/library/disable-provided-export/run.js b/test/configCases/library/disable-provided-export/run.js new file mode 100644 index 00000000000..8a13eda7c0c --- /dev/null +++ b/test/configCases/library/disable-provided-export/run.js @@ -0,0 +1,11 @@ +it("should compile and run", () => { + expect(libModule.default).toBe("module"); + expect(libModule.foo).toBe("module"); + expect(Boolean(libModule.React.version)).toBe(true); + + expect(libModernModule.default).toBe("modern-module"); + + expect(libCommonjsStatic.default).toBe("commonjs-static"); +}); + + diff --git a/test/configCases/library/disable-provided-export/test.filter.js b/test/configCases/library/disable-provided-export/test.filter.js new file mode 100644 index 00000000000..0d61a0f0807 --- /dev/null +++ b/test/configCases/library/disable-provided-export/test.filter.js @@ -0,0 +1,3 @@ +const supportsRequireInModule = require("../../../helpers/supportsRequireInModule"); + +module.exports = () => supportsRequireInModule(); diff --git a/test/configCases/library/disable-provided-export/webpack.config.js b/test/configCases/library/disable-provided-export/webpack.config.js new file mode 100644 index 00000000000..dafe4231bf2 --- /dev/null +++ b/test/configCases/library/disable-provided-export/webpack.config.js @@ -0,0 +1,97 @@ +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + entry: "./module.js", + optimization: { + providedExports: false + }, + output: { + library: { + type: "module" + } + }, + experiments: { + outputModule: true + }, + externals: ["react"], + externalsType: "module" + }, + { + entry: "./modern-module.js", + optimization: { + providedExports: false + }, + output: { + library: { + type: "modern-module", + export: ["lib2"] + } + }, + experiments: { + outputModule: true + } + }, + { + entry: "./commonjs-static.js", + optimization: { + providedExports: false + }, + output: { + library: { + type: "commonjs-static" + } + } + }, + { + entry: "./run.js", + plugins: [ + new webpack.BannerPlugin({ + raw: true, + banner: ` + import lib1Default, { foo, React } from './bundle0.mjs'; + import { lib2 } from './bundle1.mjs'; + + import { createRequire } from 'module'; + const require = createRequire(import.meta.url); + + const { lib3 } = require("./bundle2.js"); + + let libModule = { default: lib1Default, foo, React }; + let libModernModule = { default: lib2}; + let libCommonjsStatic = { default: lib3 }; + ` + }), + { + apply(compiler) { + compiler.hooks.done.tap( + { + name: "disable-provided-export", + stage: 100 + }, + () => { + expect( + compiler.hooks.compilation.taps.filter( + tap => tap.name === "FlagDependencyExportsPlugin" + ).length + ).toBe(1); + } + ); + } + } + ], + output: { + enabledLibraryTypes: ["module", "modern-module"], + library: { + type: "module" + } + }, + optimization: { + providedExports: false + }, + experiments: { + outputModule: true + } + } +]; diff --git a/test/configCases/library/invalid-name/errors.js b/test/configCases/library/invalid-name/errors.js new file mode 100644 index 00000000000..465d98f6483 --- /dev/null +++ b/test/configCases/library/invalid-name/errors.js @@ -0,0 +1,6 @@ +module.exports = [ + [ + /Library name base \(123-hello world\) must be a valid identifier/, + /use a valid identifier \(e\. g\. _123_hello_world\)/ + ] +]; diff --git a/test/configCases/library/invalid-name/index.js b/test/configCases/library/invalid-name/index.js new file mode 100644 index 00000000000..bf37d884cd6 --- /dev/null +++ b/test/configCases/library/invalid-name/index.js @@ -0,0 +1,3 @@ +it("should error", function () { + throw new Error("should not be executed"); +}); diff --git a/test/configCases/library/invalid-name/webpack.config.js b/test/configCases/library/invalid-name/webpack.config.js new file mode 100644 index 00000000000..78ca5ab1c96 --- /dev/null +++ b/test/configCases/library/invalid-name/webpack.config.js @@ -0,0 +1,6 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + library: ["123-hello world", "hello world"] + } +}; diff --git a/test/configCases/library/issue-18932/index.js b/test/configCases/library/issue-18932/index.js new file mode 100644 index 00000000000..78b38524c93 --- /dev/null +++ b/test/configCases/library/issue-18932/index.js @@ -0,0 +1,7 @@ +it("should don't have variable name conflict", function() { + expect(true).toBe(true); +}); + +const i = 1; + +export default "test"; diff --git a/test/configCases/library/issue-18932/webpack.config.js b/test/configCases/library/issue-18932/webpack.config.js new file mode 100644 index 00000000000..74ee1964621 --- /dev/null +++ b/test/configCases/library/issue-18932/webpack.config.js @@ -0,0 +1,9 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "production", + output: { + library: { + type: "commonjs" + } + } +}; diff --git a/test/configCases/library/issue-18951/index.js b/test/configCases/library/issue-18951/index.js new file mode 100644 index 00000000000..47dcec3506b --- /dev/null +++ b/test/configCases/library/issue-18951/index.js @@ -0,0 +1,7 @@ +it("should don't have variable name conflict", function() { + expect(true).toBe(true); +}); + +export const id = "collision"; +export const ids = ["collision"]; +export const modules = { "collision": true }; diff --git a/test/configCases/library/issue-18951/test.config.js b/test/configCases/library/issue-18951/test.config.js new file mode 100644 index 00000000000..ab693054953 --- /dev/null +++ b/test/configCases/library/issue-18951/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["main.mjs"]; + } +}; diff --git a/test/configCases/library/issue-18951/webpack.config.js b/test/configCases/library/issue-18951/webpack.config.js new file mode 100644 index 00000000000..1739a67b61a --- /dev/null +++ b/test/configCases/library/issue-18951/webpack.config.js @@ -0,0 +1,11 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + experiments: { outputModule: true }, + output: { + filename: "[name].mjs", + library: { type: "module" } + }, + optimization: { + runtimeChunk: "single" // any value other than `false` + } +}; diff --git a/test/configCases/library/module-and-child-compilation/index.js b/test/configCases/library/module-and-child-compilation/index.js new file mode 100644 index 00000000000..5eb9146c960 --- /dev/null +++ b/test/configCases/library/module-and-child-compilation/index.js @@ -0,0 +1,5 @@ +import { myClass } from "./style.custom"; + +it("should work", function() { + expect(myClass).toBe("my-class"); +}); diff --git a/test/configCases/library/module-and-child-compilation/loader.js b/test/configCases/library/module-and-child-compilation/loader.js new file mode 100644 index 00000000000..7c8be71ef17 --- /dev/null +++ b/test/configCases/library/module-and-child-compilation/loader.js @@ -0,0 +1,97 @@ +/** @typedef {import("../../../../").Compiler} Compiler */ +/** @typedef {import("../../../../").Compilation} Compilation */ + +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = async function loader() { + const callback = this.async(); + const loader = this; + const compilerName = `extract:${loader.resourcePath}`; + const compiler = /** @type {Compiler} */ (loader._compiler); + const compilation = /** @type {Compilation} */ (loader._compilation); + const filename = "*"; + const childCompiler = compilation.createChildCompiler( + compilerName, + { + filename, + }, + [] + ); + + const NodeTemplatePlugin = compiler.webpack.node.NodeTemplatePlugin; + new NodeTemplatePlugin().apply(childCompiler); + + const NodeTargetPlugin = compiler.webpack.node.NodeTargetPlugin; + new NodeTargetPlugin().apply(childCompiler); + + const { + EntryOptionPlugin, + library: { + EnableLibraryPlugin + } + } = compiler.webpack; + + new EnableLibraryPlugin('commonjs2').apply(childCompiler); + + EntryOptionPlugin.applyEntryOption(childCompiler, loader.context, { + child: { + library: { + type: 'commonjs2' + }, + import: [`!!${loader.resourcePath}`] + } + }); + + const LimitChunkCountPlugin = compiler.webpack.optimize.LimitChunkCountPlugin; + + new LimitChunkCountPlugin({ + maxChunks: 1 + }).apply(childCompiler); + + let source; + + childCompiler.hooks.compilation.tap(compilerName, compilation => { + compilation.hooks.processAssets.tap(compilerName, () => { + source = compilation.assets[filename] && compilation.assets[filename].source(); + + // Remove all chunk assets + compilation.chunks.forEach(chunk => { + chunk.files.forEach(file => { + compilation.deleteAsset(file); + }); + }); + }); + }); + + try { + await new Promise( + /** + * @param {(value?: void) => void} resolve resolve + * @param {(reason?: Error) => void} reject + */ + (resolve, reject) => { + childCompiler.runAsChild((err, _entries, _compilation) => { + if (err) { + return reject(err); + } + + const compilation = /** @type {Compilation} */ (_compilation); + + if (compilation.errors.length > 0) { + return reject(compilation.errors[0]); + } + + resolve(); + }); + }) + } catch (e) { + callback(/** @type {Error} */ (e)); + return; + } + + if (!source) { + callback(new Error("Didn't get a result from child compiler")); + return; + } + + callback(null, source); +} diff --git a/test/configCases/library/module-and-child-compilation/style.custom b/test/configCases/library/module-and-child-compilation/style.custom new file mode 100644 index 00000000000..158ac9adb4a --- /dev/null +++ b/test/configCases/library/module-and-child-compilation/style.custom @@ -0,0 +1,2 @@ +import style from "./test.mjs"; +export const myClass = style("my-class"); diff --git a/test/configCases/library/module-and-child-compilation/test.mjs b/test/configCases/library/module-and-child-compilation/test.mjs new file mode 100644 index 00000000000..f322128552c --- /dev/null +++ b/test/configCases/library/module-and-child-compilation/test.mjs @@ -0,0 +1,3 @@ +export default function(name) { + return name; +} diff --git a/test/configCases/library/module-and-child-compilation/webpack.config.js b/test/configCases/library/module-and-child-compilation/webpack.config.js new file mode 100644 index 00000000000..663dc2b706e --- /dev/null +++ b/test/configCases/library/module-and-child-compilation/webpack.config.js @@ -0,0 +1,23 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "production", + target: "web", + output: { + module: true, + library: { + type: "module" + } + }, + module: { + strictExportPresence: true, + rules: [ + { + test: /\.custom$/i, + loader: require.resolve("./loader") + } + ] + }, + experiments: { + outputModule: true + } +}; diff --git a/test/configCases/library/module-reexport-external/index.js b/test/configCases/library/module-reexport-external/index.js new file mode 100644 index 00000000000..234539f635d --- /dev/null +++ b/test/configCases/library/module-reexport-external/index.js @@ -0,0 +1 @@ +it('should compile', () => {}) diff --git a/test/configCases/library/module-reexport-external/test.config.js b/test/configCases/library/module-reexport-external/test.config.js new file mode 100644 index 00000000000..78a59a58887 --- /dev/null +++ b/test/configCases/library/module-reexport-external/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["main.js"]; + } +}; diff --git a/test/configCases/library/module-reexport-external/test.js b/test/configCases/library/module-reexport-external/test.js new file mode 100644 index 00000000000..6a23056a3eb --- /dev/null +++ b/test/configCases/library/module-reexport-external/test.js @@ -0,0 +1 @@ +export { value } from 'external0' diff --git a/test/configCases/library/module-reexport-external/webpack.config.js b/test/configCases/library/module-reexport-external/webpack.config.js new file mode 100644 index 00000000000..1b960bf65e9 --- /dev/null +++ b/test/configCases/library/module-reexport-external/webpack.config.js @@ -0,0 +1,40 @@ +/** @typedef {import("../../../../").Compilation} Compilation */ + +/** @type {import("../../../../types").Configuration} */ +module.exports = { + mode: "none", + entry: { main: "./index.js", test: "./test" }, + output: { + module: true, + library: { + type: "module" + }, + filename: "[name].js", + chunkFormat: "module" + }, + experiments: { + outputModule: true + }, + resolve: { + extensions: [".js"] + }, + externalsType: "module", + externals: ["external0"], + optimization: { + concatenateModules: true + }, + plugins: [ + function () { + /** + * @param {Compilation} compilation compilation + */ + const handler = compilation => { + compilation.hooks.afterProcessAssets.tap("testcase", assets => { + const source = assets["test.js"].source(); + expect(source).toContain("export const value"); + }); + }; + this.hooks.compilation.tap("testcase", handler); + } + ] +}; diff --git a/test/configCases/library/module-reexport-type/export.ts b/test/configCases/library/module-reexport-type/export.ts new file mode 100644 index 00000000000..cf4f7c76069 --- /dev/null +++ b/test/configCases/library/module-reexport-type/export.ts @@ -0,0 +1,2 @@ +export type T = unknown +export const value = 1 diff --git a/test/configCases/library/module-reexport-type/file.png b/test/configCases/library/module-reexport-type/file.png new file mode 100644 index 00000000000..fb53b9dedd3 Binary files /dev/null and b/test/configCases/library/module-reexport-type/file.png differ diff --git a/test/configCases/library/module-reexport-type/global.d.ts b/test/configCases/library/module-reexport-type/global.d.ts new file mode 100644 index 00000000000..a6ec0b37e54 --- /dev/null +++ b/test/configCases/library/module-reexport-type/global.d.ts @@ -0,0 +1,4 @@ +declare module "*.png" { + const value: string; + export default value; +} diff --git a/test/configCases/library/module-reexport-type/index.ts b/test/configCases/library/module-reexport-type/index.ts new file mode 100644 index 00000000000..455367e0775 --- /dev/null +++ b/test/configCases/library/module-reexport-type/index.ts @@ -0,0 +1,15 @@ +import { value, T } from './re-export' +import logo from './file.png'; + +type MyType = string; + +export { logo, value, T, MyType } + +it("should not reexport type", function () { + expect(value).toBe(1) +}); + +type OtherMyType = string; + +export type { OtherMyType } +export default MyType; diff --git a/test/configCases/library/module-reexport-type/re-export.ts b/test/configCases/library/module-reexport-type/re-export.ts new file mode 100644 index 00000000000..dfbc7a6a69a --- /dev/null +++ b/test/configCases/library/module-reexport-type/re-export.ts @@ -0,0 +1 @@ +export * from './export' diff --git a/test/configCases/library/module-reexport-type/test.filter.js b/test/configCases/library/module-reexport-type/test.filter.js new file mode 100644 index 00000000000..846093ba9cf --- /dev/null +++ b/test/configCases/library/module-reexport-type/test.filter.js @@ -0,0 +1,5 @@ +const supportsOptionalChaining = require("../../../helpers/supportsOptionalChaining"); + +module.exports = function (config) { + return supportsOptionalChaining(); +}; diff --git a/test/configCases/library/module-reexport-type/tsconfig.json b/test/configCases/library/module-reexport-type/tsconfig.json new file mode 100644 index 00000000000..c2bf04fb9f3 --- /dev/null +++ b/test/configCases/library/module-reexport-type/tsconfig.json @@ -0,0 +1,6 @@ +// emit to esm module +{ + "compilerOptions": { + "target": "ES2015", + } +} diff --git a/test/configCases/library/module-reexport-type/webpack.config.js b/test/configCases/library/module-reexport-type/webpack.config.js new file mode 100644 index 00000000000..063b61b5338 --- /dev/null +++ b/test/configCases/library/module-reexport-type/webpack.config.js @@ -0,0 +1,63 @@ +/** @typedef {import("../../../../").Compilation} Compilation */ + +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "none", + entry: { main: "./index.ts" }, + ignoreWarnings: [ + warning => { + // when using swc-loader or `transpileOnly: true` with ts-loader, the warning is expected + expect(warning.message).toContain( + "export 'T' (reexported as 'T') was not found in './re-export' (possible exports: value)" + ); + return true; + } + ], + output: { + module: true, + library: { + type: "module" + }, + chunkFormat: "module" + }, + experiments: { + outputModule: true + }, + resolve: { + extensions: [".ts"] + }, + optimization: { + concatenateModules: true + }, + module: { + rules: [ + { + test: /\.ts$/, + loader: "ts-loader", + options: { + transpileOnly: true + } + }, + { + type: "asset/inline", + test: /\.png$/ + } + ] + }, + plugins: [ + function () { + /** + * @param {Compilation} compilation compilation + */ + const handler = compilation => { + compilation.hooks.afterProcessAssets.tap("testcase", assets => { + const source = assets["bundle0.mjs"].source(); + expect(source).toContain( + "export { file_namespaceObject as logo, value };" + ); + }); + }; + this.hooks.compilation.tap("testcase", handler); + } + ] +}; diff --git a/test/configCases/library/module-terminal-binding/async-module.js b/test/configCases/library/module-terminal-binding/async-module.js new file mode 100644 index 00000000000..e1f714cff9e --- /dev/null +++ b/test/configCases/library/module-terminal-binding/async-module.js @@ -0,0 +1,10 @@ +import { FluentProvider } from './module.js'; + +function test(value) { + return value; +} + +test(FluentProvider); + +export const value = "value"; +export { FluentProvider }; diff --git a/test/configCases/library/module-terminal-binding/index.js b/test/configCases/library/module-terminal-binding/index.js new file mode 100644 index 00000000000..2b4296e1600 --- /dev/null +++ b/test/configCases/library/module-terminal-binding/index.js @@ -0,0 +1,23 @@ +import { FluentProvider } from './module.js'; + +export { + FluentProvider, + myFunction, +} from './module.js'; + + +export async function component() { + const { value } = await import(/* webpackChunkName: "async-module" */ './async-module.js'); + + return value; +} + +const qT = "qT"; + +it("should work", async function() { + const value = await component(); + + expect(qT).toBe("qT"); + expect(value).toBe("value"); + expect(FluentProvider()).toBe("FluentProvider"); +}); diff --git a/test/configCases/library/module-terminal-binding/module.js b/test/configCases/library/module-terminal-binding/module.js new file mode 100644 index 00000000000..0c4804d4cc0 --- /dev/null +++ b/test/configCases/library/module-terminal-binding/module.js @@ -0,0 +1,3 @@ +export { FluentProvider } from './other.module2.js'; + +export const myFunction = function () {}; diff --git a/test/configCases/library/module-terminal-binding/node_modules/my-pkg/components/FluentProvider/index.js b/test/configCases/library/module-terminal-binding/node_modules/my-pkg/components/FluentProvider/index.js new file mode 100644 index 00000000000..ecee617e303 --- /dev/null +++ b/test/configCases/library/module-terminal-binding/node_modules/my-pkg/components/FluentProvider/index.js @@ -0,0 +1,5 @@ +export const FluentProvider = function FluentProvider() { + return "FluentProvider" +}; + +FluentProvider.displayName = 'FluentProvider'; diff --git a/test/configCases/library/module-terminal-binding/node_modules/my-pkg/index.js b/test/configCases/library/module-terminal-binding/node_modules/my-pkg/index.js new file mode 100644 index 00000000000..66431c1a1ec --- /dev/null +++ b/test/configCases/library/module-terminal-binding/node_modules/my-pkg/index.js @@ -0,0 +1 @@ +export { FluentProvider } from './components/FluentProvider/index.js'; diff --git a/test/configCases/library/module-terminal-binding/node_modules/my-pkg/package.json b/test/configCases/library/module-terminal-binding/node_modules/my-pkg/package.json new file mode 100644 index 00000000000..67a48be6457 --- /dev/null +++ b/test/configCases/library/module-terminal-binding/node_modules/my-pkg/package.json @@ -0,0 +1,16 @@ +{ + "name": "my-pkg", + "version": "1.0.0", + "description": "Description", + "main": "./index.js", + "module": "./index.js", + "sideEffects": false, + "license": "MIT", + "exports": { + ".": { + "import": "./index.js", + "default": "./index.js" + }, + "./package.json": "./package.json" + } +} diff --git a/test/configCases/library/module-terminal-binding/other.module2.js b/test/configCases/library/module-terminal-binding/other.module2.js new file mode 100644 index 00000000000..f26044b7132 --- /dev/null +++ b/test/configCases/library/module-terminal-binding/other.module2.js @@ -0,0 +1 @@ +export { FluentProvider } from 'my-pkg'; diff --git a/test/configCases/library/module-terminal-binding/webpack.config.js b/test/configCases/library/module-terminal-binding/webpack.config.js new file mode 100644 index 00000000000..68e94532f64 --- /dev/null +++ b/test/configCases/library/module-terminal-binding/webpack.config.js @@ -0,0 +1,16 @@ +module.exports = { + mode: "production", + target: "web", + optimization: { + minimize: false + }, + experiments: { + outputModule: true + }, + output: { + library: { + type: "module" + }, + module: true + } +}; diff --git a/test/configCases/library/type-assign-properties/index.js b/test/configCases/library/type-assign-properties/index.js new file mode 100644 index 00000000000..553264f2bbf --- /dev/null +++ b/test/configCases/library/type-assign-properties/index.js @@ -0,0 +1,4 @@ +it("should define global object with property", function () { + expect(MyLibraryProperties["answer"]).toEqual(42); +}); +export const answer = 42; diff --git a/test/configCases/library/type-assign-properties/test.config.js b/test/configCases/library/type-assign-properties/test.config.js new file mode 100644 index 00000000000..0c592459f39 --- /dev/null +++ b/test/configCases/library/type-assign-properties/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + afterExecute() { + delete global.MyLibraryProperties; + } +}; diff --git a/test/configCases/library/type-assign-properties/webpack.config.js b/test/configCases/library/type-assign-properties/webpack.config.js new file mode 100644 index 00000000000..efde945c998 --- /dev/null +++ b/test/configCases/library/type-assign-properties/webpack.config.js @@ -0,0 +1,9 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + library: { + name: "MyLibraryProperties", + type: "assign-properties" + } + } +}; diff --git a/test/configCases/library/type-assign-runtime-chunk/index.js b/test/configCases/library/type-assign-runtime-chunk/index.js new file mode 100644 index 00000000000..24e5189227d --- /dev/null +++ b/test/configCases/library/type-assign-runtime-chunk/index.js @@ -0,0 +1,5 @@ +it("should define global object with property", function () { + expect(MyLibraryRuntimeChunk["answer"]).toEqual(42); +}); + +export const answer = 42; diff --git a/test/configCases/library/type-assign-runtime-chunk/test.config.js b/test/configCases/library/type-assign-runtime-chunk/test.config.js new file mode 100644 index 00000000000..1a96fecb170 --- /dev/null +++ b/test/configCases/library/type-assign-runtime-chunk/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./runtime~main.js", "./main.js"]; + } +}; diff --git a/test/configCases/library/type-assign-runtime-chunk/webpack.config.js b/test/configCases/library/type-assign-runtime-chunk/webpack.config.js new file mode 100644 index 00000000000..1dac2342460 --- /dev/null +++ b/test/configCases/library/type-assign-runtime-chunk/webpack.config.js @@ -0,0 +1,14 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + filename: "[name].js", + library: { + name: "MyLibraryRuntimeChunk", + type: "assign" + } + }, + target: "web", + optimization: { + runtimeChunk: true + } +}; diff --git a/test/configCases/library/type-assign/index.js b/test/configCases/library/type-assign/index.js new file mode 100644 index 00000000000..b91b42407c8 --- /dev/null +++ b/test/configCases/library/type-assign/index.js @@ -0,0 +1,6 @@ +it("should define global object with property", function () { + require("./module"); + expect(MyLibrary["answer"]).toEqual(42); +}); + +export const answer = 42; diff --git a/test/configCases/library/type-assign/module.js b/test/configCases/library/type-assign/module.js new file mode 100644 index 00000000000..3918c74e446 --- /dev/null +++ b/test/configCases/library/type-assign/module.js @@ -0,0 +1 @@ +"use strict"; diff --git a/test/configCases/library/type-assign/test.config.js b/test/configCases/library/type-assign/test.config.js new file mode 100644 index 00000000000..79a079487a5 --- /dev/null +++ b/test/configCases/library/type-assign/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + afterExecute() { + delete global.MyLibrary; + } +}; diff --git a/test/configCases/library/type-assign/webpack.config.js b/test/configCases/library/type-assign/webpack.config.js new file mode 100644 index 00000000000..56889af0603 --- /dev/null +++ b/test/configCases/library/type-assign/webpack.config.js @@ -0,0 +1,9 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + library: { + name: "MyLibrary", + type: "assign" + } + } +}; diff --git a/test/configCases/library/umd-array/webpack.config.js b/test/configCases/library/umd-array/webpack.config.js index fba3d5e17a1..73b14934a5d 100644 --- a/test/configCases/library/umd-array/webpack.config.js +++ b/test/configCases/library/umd-array/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { output: { libraryTarget: "umd", diff --git a/test/configCases/library/umd/webpack.config.js b/test/configCases/library/umd/webpack.config.js index 4ce89d69c0a..815908500ca 100644 --- a/test/configCases/library/umd/webpack.config.js +++ b/test/configCases/library/umd/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { output: { libraryTarget: "umd", diff --git a/test/configCases/loader-import-module/css/colors.js b/test/configCases/loader-import-module/css/colors.js new file mode 100644 index 00000000000..d3da74ec7a1 --- /dev/null +++ b/test/configCases/loader-import-module/css/colors.js @@ -0,0 +1,2 @@ +export const red = "#f00"; +export const green = "#0f0"; diff --git a/test/configCases/loader-import-module/css/file.jpg b/test/configCases/loader-import-module/css/file.jpg new file mode 100644 index 00000000000..fe5c6eefa79 Binary files /dev/null and b/test/configCases/loader-import-module/css/file.jpg differ diff --git a/test/configCases/loader-import-module/css/file.png b/test/configCases/loader-import-module/css/file.png new file mode 100644 index 00000000000..fb53b9dedd3 Binary files /dev/null and b/test/configCases/loader-import-module/css/file.png differ diff --git a/test/configCases/loader-import-module/css/index.js b/test/configCases/loader-import-module/css/index.js new file mode 100644 index 00000000000..9d5739c3972 --- /dev/null +++ b/test/configCases/loader-import-module/css/index.js @@ -0,0 +1,15 @@ +import stylesheet from "./stylesheet"; +import stylesheet1 from "./stylesheet?1"; +import otherStylesheet from "./other-stylesheet"; + +it("should be able to use build-time code", () => { + expect(stylesheet).toBe( + 'body { background: url("/public/assets/file.png"); color: #f00; }' + ); + expect(stylesheet1).toBe( + 'body { background: url("/public/assets/file.png?1"); color: #f00; }' + ); + expect(otherStylesheet).toBe( + 'body { background: url("/other/assets/file.jpg"); color: #0f0; }' + ); +}); diff --git a/test/configCases/loader-import-module/css/loader.js b/test/configCases/loader-import-module/css/loader.js new file mode 100644 index 00000000000..2dae62a4065 --- /dev/null +++ b/test/configCases/loader-import-module/css/loader.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").PitchLoaderDefinitionFunction} */ +exports.pitch = async function (remaining) { + const result = await this.importModule( + this.resourcePath + ".webpack[javascript/auto]" + "!=!" + remaining, + this.getOptions() + ); + return result.default || result; +}; diff --git a/test/configCases/loader-import-module/css/other-stylesheet.js b/test/configCases/loader-import-module/css/other-stylesheet.js new file mode 100644 index 00000000000..d3be25b7f28 --- /dev/null +++ b/test/configCases/loader-import-module/css/other-stylesheet.js @@ -0,0 +1,3 @@ +import { green } from "./colors.js"; +import file from "./file.jpg"; +export default `body { background: url("${file}"); color: ${green}; }`; diff --git a/test/configCases/loader-import-module/css/stylesheet.js b/test/configCases/loader-import-module/css/stylesheet.js new file mode 100644 index 00000000000..7d542e93be0 --- /dev/null +++ b/test/configCases/loader-import-module/css/stylesheet.js @@ -0,0 +1,4 @@ +import { red } from "./colors.js"; +export default `body { background: url("${ + new URL("./file.png" + __resourceQuery, import.meta.url).href +}"); color: ${red}; }`; diff --git a/test/configCases/loader-import-module/css/webpack.config.js b/test/configCases/loader-import-module/css/webpack.config.js new file mode 100644 index 00000000000..3704a547e20 --- /dev/null +++ b/test/configCases/loader-import-module/css/webpack.config.js @@ -0,0 +1,73 @@ +/** @typedef {import("../../../../").Chunk} Chunk */ + +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + publicPath: "/public/" + }, + module: { + parser: { + javascript: { + url: "relative" + } + }, + rules: [ + { + dependency: "url", + issuer: /stylesheet\.js$/, + type: "asset/resource", + generator: { + filename: "assets/[name][ext][query]" + } + }, + { + oneOf: [ + { + test: /other-stylesheet\.js$/, + loader: "./loader", + options: { + publicPath: "/other/" + }, + type: "asset/source" + }, + { + test: /stylesheet\.js$/, + use: "./loader", + type: "asset/source" + } + ] + }, + { + test: /\.jpg$/, + loader: "file-loader", + options: { + name: "assets/[name].[ext]" + } + } + ] + }, + plugins: [ + compiler => + compiler.hooks.done.tap("test case", stats => { + try { + expect(stats.compilation.getAsset("assets/file.png")).toHaveProperty( + "info", + expect.objectContaining({ sourceFilename: "file.png" }) + ); + expect(stats.compilation.getAsset("assets/file.jpg")).toHaveProperty( + "info", + expect.objectContaining({ sourceFilename: "file.jpg" }) + ); + const { auxiliaryFiles } = + /** @type {Chunk} */ + (stats.compilation.namedChunks.get("main")); + expect(auxiliaryFiles).toContain("assets/file.png"); + expect(auxiliaryFiles).toContain("assets/file.png?1"); + expect(auxiliaryFiles).toContain("assets/file.jpg"); + } catch (err) { + console.log(stats.toString({ colors: true, orphanModules: true })); + throw err; + } + }) + ] +}; diff --git a/test/configCases/loaders-and-plugins-falsy/basic/bar.js b/test/configCases/loaders-and-plugins-falsy/basic/bar.js new file mode 100644 index 00000000000..58c57157d36 --- /dev/null +++ b/test/configCases/loaders-and-plugins-falsy/basic/bar.js @@ -0,0 +1 @@ +export default "test"; diff --git a/test/configCases/loaders-and-plugins-falsy/basic/baz.js b/test/configCases/loaders-and-plugins-falsy/basic/baz.js new file mode 100644 index 00000000000..58c57157d36 --- /dev/null +++ b/test/configCases/loaders-and-plugins-falsy/basic/baz.js @@ -0,0 +1 @@ +export default "test"; diff --git a/test/configCases/loaders-and-plugins-falsy/basic/foo.js b/test/configCases/loaders-and-plugins-falsy/basic/foo.js new file mode 100644 index 00000000000..58c57157d36 --- /dev/null +++ b/test/configCases/loaders-and-plugins-falsy/basic/foo.js @@ -0,0 +1 @@ +export default "test"; diff --git a/test/configCases/loaders-and-plugins-falsy/basic/index.js b/test/configCases/loaders-and-plugins-falsy/basic/index.js new file mode 100644 index 00000000000..d71e4dc1d29 --- /dev/null +++ b/test/configCases/loaders-and-plugins-falsy/basic/index.js @@ -0,0 +1,12 @@ +import foo from "./foo.js?external"; +import bar from "./bar.js"; +import baz from "./baz.js?custom-use"; +import other from "./other.js"; + +it("should work with falsy plugins and loaders", function() { + expect(ONE).toBe("ONE"); + expect(foo.endsWith("?external")).toBe(true); + expect(bar).toBe("test"); + expect(baz).toBe("test"); + expect(other).toBe("NEW"); +}); diff --git a/test/configCases/loaders-and-plugins-falsy/basic/loader.js b/test/configCases/loaders-and-plugins-falsy/basic/loader.js new file mode 100644 index 00000000000..6c5f48f747e --- /dev/null +++ b/test/configCases/loaders-and-plugins-falsy/basic/loader.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition<{ value: any }>} */ +module.exports = function loader(content) { + return content.replace(/test/, "NEW"); +}; diff --git a/test/configCases/loaders-and-plugins-falsy/basic/other.js b/test/configCases/loaders-and-plugins-falsy/basic/other.js new file mode 100644 index 00000000000..58c57157d36 --- /dev/null +++ b/test/configCases/loaders-and-plugins-falsy/basic/other.js @@ -0,0 +1 @@ +export default "test"; diff --git a/test/configCases/loaders-and-plugins-falsy/basic/webpack.config.js b/test/configCases/loaders-and-plugins-falsy/basic/webpack.config.js new file mode 100644 index 00000000000..30d47118b59 --- /dev/null +++ b/test/configCases/loaders-and-plugins-falsy/basic/webpack.config.js @@ -0,0 +1,120 @@ +const DefinePlugin = require("../../../../").DefinePlugin; + +const nullValue = null; +const undefinedValue = undefined; +const falseValue = false; +const zeroValue = 0; +const emptyStringValue = ""; + +class FailPlugin { + apply() { + throw new Error("FailedPlugin"); + } +} + +class TestChildCompilationPlugin { + constructor() {} + + /** + * @param {TODO} compiler compiler + */ + apply(compiler) { + compiler.hooks.make.tapAsync( + "TestChildCompilationFailurePlugin", + /** + * @param {TODO} compilation compilation + * @param {TODO} cb cb + */ + (compilation, cb) => { + const child = compilation.createChildCompiler( + "name", + compiler.outputOptions, + [ + undefinedValue && new FailPlugin(), + nullValue && new FailPlugin(), + falseValue && new FailPlugin(), + zeroValue && new FailPlugin(), + emptyStringValue && new FailPlugin() + ] + ); + + child.runAsChild(cb); + } + ); + } +} + +/** @type {import("../../../../").Configuration} */ +module.exports = { + // Will failed because we don't have unknown-loader + module: { + defaultRules: [ + nullValue && { + test: /\.js$/, + loader: "unknown-loader" + }, + "..." + ], + rules: [ + nullValue && { + test: /\.js$/, + loader: "unknown-loader" + }, + { + test: /foo\.js$/, + oneOf: [ + nullValue && { + resourceQuery: /inline/, + loader: "unknown-loader" + }, + { + resourceQuery: /external/, + type: "asset/resource" + } + ] + }, + { + test: /bar\.js$/, + use: [nullValue && "unknown-loader"] + }, + { + test: /baz\.js$/, + resourceQuery: /custom-use/, + use: () => [ + nullValue && { + loader: "unknown-loader" + } + ] + }, + { + test: /other\.js$/, + rules: [ + nullValue && { + loader: "unknown-loader" + }, + { + loader: "./loader.js" + } + ] + } + ] + }, + resolve: { + plugins: [undefinedValue && new FailPlugin()] + }, + plugins: [ + new DefinePlugin({ + ONE: JSON.stringify("ONE") + }), + new TestChildCompilationPlugin(), + undefinedValue && new FailPlugin(), + nullValue && new FailPlugin(), + falseValue && new FailPlugin(), + zeroValue && new FailPlugin(), + emptyStringValue && new FailPlugin() + ], + optimization: { + minimize: true, + minimizer: [nullValue && new FailPlugin()] + } +}; diff --git a/test/configCases/loaders/#-issue-14755-#/#.my b/test/configCases/loaders/#-issue-14755-#/#.my new file mode 100644 index 00000000000..19dd091730f --- /dev/null +++ b/test/configCases/loaders/#-issue-14755-#/#.my @@ -0,0 +1 @@ +[a-z] diff --git a/test/configCases/loaders/#-issue-14755-#/index.js b/test/configCases/loaders/#-issue-14755-#/index.js new file mode 100644 index 00000000000..092ef0aab48 --- /dev/null +++ b/test/configCases/loaders/#-issue-14755-#/index.js @@ -0,0 +1,6 @@ +import regexp from './#.my'; + +it("should load regexp correctly", () => { + expect(regexp.test("1")).toBe(false); + expect(regexp.test("a")).toBe(true); +}); diff --git a/test/configCases/loaders/#-issue-14755-#/node_modules/regexp-#-loader/index.js b/test/configCases/loaders/#-issue-14755-#/node_modules/regexp-#-loader/index.js new file mode 100644 index 00000000000..d7410984ab4 --- /dev/null +++ b/test/configCases/loaders/#-issue-14755-#/node_modules/regexp-#-loader/index.js @@ -0,0 +1,5 @@ +"use strict"; + +module.exports = function loader(data) { + return `export default new RegExp(${JSON.stringify(data.trim())})` +} diff --git a/test/configCases/loaders/#-issue-14755-#/node_modules/regexp-#-loader/package.json b/test/configCases/loaders/#-issue-14755-#/node_modules/regexp-#-loader/package.json new file mode 100644 index 00000000000..aa8a1ecf19e --- /dev/null +++ b/test/configCases/loaders/#-issue-14755-#/node_modules/regexp-#-loader/package.json @@ -0,0 +1,6 @@ +{ + "name": "regexp-#-loader", + "version": "1.0.0", + "dependencies": { + } +} diff --git a/test/configCases/loaders/#-issue-14755-#/webpack.config.js b/test/configCases/loaders/#-issue-14755-#/webpack.config.js new file mode 100644 index 00000000000..a8828552624 --- /dev/null +++ b/test/configCases/loaders/#-issue-14755-#/webpack.config.js @@ -0,0 +1,11 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + module: { + rules: [ + { + test: /\.my$/, + loader: "regexp-#-loader" + } + ] + } +}; diff --git a/test/configCases/loaders/async-loader/a.js b/test/configCases/loaders/async-loader/a.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/loaders/async-loader/b.js b/test/configCases/loaders/async-loader/b.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/loaders/async-loader/c.js b/test/configCases/loaders/async-loader/c.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/loaders/async-loader/index.js b/test/configCases/loaders/async-loader/index.js new file mode 100644 index 00000000000..72cb5d31185 --- /dev/null +++ b/test/configCases/loaders/async-loader/index.js @@ -0,0 +1,12 @@ +it("should work when loader is async", function() { + expect(require("./a")).toBe("a"); +}); + +it("should work when loader is async #2", function() { + expect(require("./b")).toBe("b"); +}); + +it("should work when loader is async #3", function() { + expect(require("./c")).toBe("c"); +}); + diff --git a/test/configCases/loaders/async-loader/loader-1.js b/test/configCases/loaders/async-loader/loader-1.js new file mode 100644 index 00000000000..dca800cec5b --- /dev/null +++ b/test/configCases/loaders/async-loader/loader-1.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = async function () { + return `module.exports = 'a';`; +}; diff --git a/test/configCases/loaders/async-loader/loader-2.js b/test/configCases/loaders/async-loader/loader-2.js new file mode 100644 index 00000000000..ce09f33359e --- /dev/null +++ b/test/configCases/loaders/async-loader/loader-2.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { + return Promise.resolve(`module.exports = 'b';`); +}; diff --git a/test/configCases/loaders/async-loader/loader-3.js b/test/configCases/loaders/async-loader/loader-3.js new file mode 100644 index 00000000000..02bdc4efd54 --- /dev/null +++ b/test/configCases/loaders/async-loader/loader-3.js @@ -0,0 +1,6 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { + const callback = this.async(); + + callback(null, `module.exports = 'c';`); +}; diff --git a/test/configCases/loaders/async-loader/webpack.config.js b/test/configCases/loaders/async-loader/webpack.config.js new file mode 100644 index 00000000000..9e819295974 --- /dev/null +++ b/test/configCases/loaders/async-loader/webpack.config.js @@ -0,0 +1,20 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + module: { + rules: [ + { + test: /a\.js$/, + use: "./loader-1" + }, + { + test: /b\.js$/, + use: "./loader-2" + }, + { + test: /c\.js$/, + use: "./loader-3" + } + ] + } +}; diff --git a/test/configCases/loaders/generate-ident/loader1.js b/test/configCases/loaders/generate-ident/loader1.js index 42fea46336a..0d2fcc8b593 100644 --- a/test/configCases/loaders/generate-ident/loader1.js +++ b/test/configCases/loaders/generate-ident/loader1.js @@ -1,3 +1,6 @@ -module.exports.pitch = function(remainingRequest) { - return "module.exports = require(" + JSON.stringify("!!" + remainingRequest) + ");"; +/** @type {import("../../../../").PitchLoaderDefinitionFunction} */ +module.exports.pitch = function (remainingRequest) { + return ( + "module.exports = require(" + JSON.stringify("!!" + remainingRequest) + ");" + ); }; diff --git a/test/configCases/loaders/generate-ident/loader2.js b/test/configCases/loaders/generate-ident/loader2.js index b5b133a9208..40788042801 100644 --- a/test/configCases/loaders/generate-ident/loader2.js +++ b/test/configCases/loaders/generate-ident/loader2.js @@ -1,3 +1,6 @@ -module.exports = function(source) { +/** @type {import("../../../../").LoaderDefinition<{ f(): any }>} */ +module.exports = function (source) { + if (typeof this.query === "string") + throw new Error("query must be an object"); return "module.exports = " + JSON.stringify(this.query.f()); }; diff --git a/test/configCases/loaders/generate-ident/webpack.config.js b/test/configCases/loaders/generate-ident/webpack.config.js index b52f63dabf3..fd5982717fb 100644 --- a/test/configCases/loaders/generate-ident/webpack.config.js +++ b/test/configCases/loaders/generate-ident/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { module: { rules: [ @@ -8,7 +9,7 @@ module.exports = { { loader: "./loader2", options: { - f: function() { + f() { return "ok"; } } @@ -24,7 +25,7 @@ module.exports = { use: { loader: "./loader2", options: { - f: function() { + f() { return "maybe"; } } @@ -35,7 +36,7 @@ module.exports = { use: { loader: "./loader2", options: { - f: function() { + f() { return "yes"; } } @@ -50,7 +51,7 @@ module.exports = { { loader: "./loader2", options: { - f: function() { + f() { return "ok"; } } diff --git a/test/configCases/loaders/hash-in-context/index.js b/test/configCases/loaders/hash-in-context/index.js new file mode 100644 index 00000000000..d8065991440 --- /dev/null +++ b/test/configCases/loaders/hash-in-context/index.js @@ -0,0 +1,10 @@ +it("should have hmr flag in loader context", function() { + expect(require("./loader!")).toMatchObject({ + digest: "a0fdc3d2f3863f64d95950fc06af72f7", + digestWithLength: "a0fdc3d2f3863f64d959", + hashFunction: "md4", + hashDigest: "hex", + hashDigestLength: 20, + hashSalt: "salt", + }); +}); diff --git a/test/configCases/loaders/hash-in-context/loader.js b/test/configCases/loaders/hash-in-context/loader.js new file mode 100644 index 00000000000..acb2e0e765d --- /dev/null +++ b/test/configCases/loaders/hash-in-context/loader.js @@ -0,0 +1,16 @@ +/** @type {import("../../../../").LoaderDefinition}} */ +module.exports = function () { + const hashValue = this.utils.createHash(this.hashFunction); + hashValue.update(this.hashSalt); + hashValue.update("test"); + const digest = hashValue.digest(this.hashDigest); + + return `module.exports = ${JSON.stringify({ + digest, + digestWithLength: digest.slice(0, this.hashDigestLength), + hashFunction: this.hashFunction, + hashDigest: this.hashDigest, + hashDigestLength: this.hashDigestLength, + hashSalt: this.hashSalt + })};`; +}; diff --git a/test/configCases/loaders/hash-in-context/webpack.config.js b/test/configCases/loaders/hash-in-context/webpack.config.js new file mode 100644 index 00000000000..140fdce3af9 --- /dev/null +++ b/test/configCases/loaders/hash-in-context/webpack.config.js @@ -0,0 +1,6 @@ +/** @type {import("../../../../").Configuration[]} */ +module.exports = { + output: { + hashSalt: "salt" + } +}; diff --git a/test/configCases/loaders/hot-in-context/loader.js b/test/configCases/loaders/hot-in-context/loader.js index b497b8bc45e..608faaddb21 100644 --- a/test/configCases/loaders/hot-in-context/loader.js +++ b/test/configCases/loaders/hot-in-context/loader.js @@ -1,3 +1,4 @@ -module.exports = function() { +/** @type {import("../../../../").LoaderDefinition}} */ +module.exports = function () { return `module.exports = ${JSON.stringify(!!this.hot)};`; -} +}; diff --git a/test/configCases/loaders/hot-in-context/webpack.config.js b/test/configCases/loaders/hot-in-context/webpack.config.js index 925a31824c0..d4d85f9d80f 100644 --- a/test/configCases/loaders/hot-in-context/webpack.config.js +++ b/test/configCases/loaders/hot-in-context/webpack.config.js @@ -1,4 +1,5 @@ const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration[]} */ module.exports = [ { // no hmr diff --git a/test/configCases/loaders/import-attributes-and-assertion/index.js b/test/configCases/loaders/import-attributes-and-assertion/index.js new file mode 100644 index 00000000000..606b31f5d46 --- /dev/null +++ b/test/configCases/loaders/import-attributes-and-assertion/index.js @@ -0,0 +1,12 @@ +import one from "./pkg-1.json" assert { type: "json" }; +import two from "./pkg-2.json" with { type: "json" }; +import three from "./pkg-3.json" assert { type: "json" }; +import four from "./pkg-4.json" with { type: "json" }; + +it("import attributes and assertion should work", function() { + expect(one.type).toEqual("assert"); + expect(two.type).toEqual("with"); + expect(three.type).toEqual("assert"); + expect(four.type).toEqual("with"); +}); + diff --git a/test/configCases/loaders/import-attributes-and-assertion/loader-assert.js b/test/configCases/loaders/import-attributes-and-assertion/loader-assert.js new file mode 100644 index 00000000000..0906f985e70 --- /dev/null +++ b/test/configCases/loaders/import-attributes-and-assertion/loader-assert.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { + return JSON.stringify({ type: "assert" }); +}; diff --git a/test/configCases/loaders/import-attributes-and-assertion/loader-with.js b/test/configCases/loaders/import-attributes-and-assertion/loader-with.js new file mode 100644 index 00000000000..7209f804dbd --- /dev/null +++ b/test/configCases/loaders/import-attributes-and-assertion/loader-with.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { + return JSON.stringify({ type: "with" }); +}; diff --git a/test/configCases/loaders/import-attributes-and-assertion/pkg-1.json b/test/configCases/loaders/import-attributes-and-assertion/pkg-1.json new file mode 100644 index 00000000000..90eae66140a --- /dev/null +++ b/test/configCases/loaders/import-attributes-and-assertion/pkg-1.json @@ -0,0 +1,3 @@ +{ + "type": "none" +} diff --git a/test/configCases/loaders/import-attributes-and-assertion/pkg-2.json b/test/configCases/loaders/import-attributes-and-assertion/pkg-2.json new file mode 100644 index 00000000000..90eae66140a --- /dev/null +++ b/test/configCases/loaders/import-attributes-and-assertion/pkg-2.json @@ -0,0 +1,3 @@ +{ + "type": "none" +} diff --git a/test/configCases/loaders/import-attributes-and-assertion/pkg-3.json b/test/configCases/loaders/import-attributes-and-assertion/pkg-3.json new file mode 100644 index 00000000000..186e2ba4afd --- /dev/null +++ b/test/configCases/loaders/import-attributes-and-assertion/pkg-3.json @@ -0,0 +1,3 @@ +{ + "type": "assert" +} diff --git a/test/configCases/loaders/import-attributes-and-assertion/pkg-4.json b/test/configCases/loaders/import-attributes-and-assertion/pkg-4.json new file mode 100644 index 00000000000..88301984e31 --- /dev/null +++ b/test/configCases/loaders/import-attributes-and-assertion/pkg-4.json @@ -0,0 +1,3 @@ +{ + "type": "with" +} diff --git a/test/configCases/loaders/import-attributes-and-assertion/webpack.config.js b/test/configCases/loaders/import-attributes-and-assertion/webpack.config.js new file mode 100644 index 00000000000..05fd19f2fc3 --- /dev/null +++ b/test/configCases/loaders/import-attributes-and-assertion/webpack.config.js @@ -0,0 +1,15 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + module: { + rules: [ + { + assert: { type: "json" }, + loader: require.resolve("./loader-assert.js") + }, + { + with: { type: "json" }, + loader: require.resolve("./loader-with.js") + } + ] + } +}; diff --git a/test/configCases/loaders/import-attributes-and-reexport/a.js b/test/configCases/loaders/import-attributes-and-reexport/a.js new file mode 100644 index 00000000000..5093d0f0b46 --- /dev/null +++ b/test/configCases/loaders/import-attributes-and-reexport/a.js @@ -0,0 +1 @@ +export {b} from "./b" with {type: "RANDOM"} \ No newline at end of file diff --git a/test/configCases/loaders/import-attributes-and-reexport/b.js b/test/configCases/loaders/import-attributes-and-reexport/b.js new file mode 100644 index 00000000000..25d07233690 --- /dev/null +++ b/test/configCases/loaders/import-attributes-and-reexport/b.js @@ -0,0 +1,5 @@ +import { c } from "./c.js"; + +export function b() { + return "b" + c(); +} diff --git a/test/configCases/loaders/import-attributes-and-reexport/c.js b/test/configCases/loaders/import-attributes-and-reexport/c.js new file mode 100644 index 00000000000..d511013e979 --- /dev/null +++ b/test/configCases/loaders/import-attributes-and-reexport/c.js @@ -0,0 +1,3 @@ +export function c() { + return "c"; +} diff --git a/test/configCases/loaders/import-attributes-and-reexport/index.js b/test/configCases/loaders/import-attributes-and-reexport/index.js new file mode 100644 index 00000000000..a0750e32c63 --- /dev/null +++ b/test/configCases/loaders/import-attributes-and-reexport/index.js @@ -0,0 +1,9 @@ +import { b } from "./a.js"; + +function foo() { + return "a" + b(); +} + +it("should not duplicate modules", function() { + expect(foo()).toEqual("ab"); +}); diff --git a/test/configCases/loaders/import-attributes-and-reexport/test-loader.js b/test/configCases/loaders/import-attributes-and-reexport/test-loader.js new file mode 100644 index 00000000000..28a43d4c099 --- /dev/null +++ b/test/configCases/loaders/import-attributes-and-reexport/test-loader.js @@ -0,0 +1,3 @@ +module.exports = function loader() { + return "export function b() { return 'b'; }"; +}; diff --git a/test/configCases/loaders/import-attributes-and-reexport/webpack.config.js b/test/configCases/loaders/import-attributes-and-reexport/webpack.config.js new file mode 100644 index 00000000000..c7e07d2b5ec --- /dev/null +++ b/test/configCases/loaders/import-attributes-and-reexport/webpack.config.js @@ -0,0 +1,11 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + module: { + rules: [ + { + with: { type: "RANDOM" }, + use: require.resolve("./test-loader") + } + ] + } +}; diff --git a/test/configCases/loaders/issue-3320/deprecations.js b/test/configCases/loaders/issue-3320/deprecations.js new file mode 100644 index 00000000000..f05114b9382 --- /dev/null +++ b/test/configCases/loaders/issue-3320/deprecations.js @@ -0,0 +1,12 @@ +module.exports = [ + { + code: /DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING/, + message: + /Using a string as loader options is deprecated \(ruleSet\[1\]\.rules\[2\]\.options\)/ + }, + { + code: /DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING/, + message: + /Using a string as loader options is deprecated \(ruleSet\[1\]\.rules\[3\]\.use\[0\]\.options\)/ + } +]; diff --git a/test/configCases/loaders/issue-3320/webpack.config.js b/test/configCases/loaders/issue-3320/webpack.config.js index 8617ad4176e..f943c051ed8 100644 --- a/test/configCases/loaders/issue-3320/webpack.config.js +++ b/test/configCases/loaders/issue-3320/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { resolveLoader: { alias: { @@ -27,11 +28,17 @@ module.exports = { }, { test: /b2\.js$/, - loader: "some-loader?foo=someOtherMessage" + loader: "some-loader", + options: "foo=someOtherMessage" }, { test: /b3\.js$/, - use: ["some-loader?foo=someOtherMessage"] + use: [ + { + loader: "some-loader", + options: "foo=someOtherMessage" + } + ] } ] } diff --git a/test/configCases/loaders/issue-9053/b.js b/test/configCases/loaders/issue-9053/b.js new file mode 100644 index 00000000000..af9f2fcd0e6 --- /dev/null +++ b/test/configCases/loaders/issue-9053/b.js @@ -0,0 +1 @@ +module.exports = ["b"]; diff --git a/test/configCases/loaders/issue-9053/c.js b/test/configCases/loaders/issue-9053/c.js new file mode 100644 index 00000000000..da8dc0c1aa3 --- /dev/null +++ b/test/configCases/loaders/issue-9053/c.js @@ -0,0 +1 @@ +module.exports = ["c"]; diff --git a/test/configCases/loaders/issue-9053/index.js b/test/configCases/loaders/issue-9053/index.js new file mode 100644 index 00000000000..0ab03f53784 --- /dev/null +++ b/test/configCases/loaders/issue-9053/index.js @@ -0,0 +1,17 @@ +it("should apply inline loaders before matchResource", function() { + var foo = require("c.js!=!loader1!./b.js"); + + expect(foo).toEqual(["b", "1", "2"]); +}); + +it("should apply config loaders before inline loaders", function() { + var foo = require("loader1!./c.js"); + + expect(foo).toEqual(["c", "2", "1"]); +}); + +it("should not apply config loaders when matchResource is used", function() { + var foo = require("d.js!=!loader1!./c.js"); + + expect(foo).toEqual(["c", "1", "3"]); +}); diff --git a/test/configCases/loaders/issue-9053/node_modules/loader1.js b/test/configCases/loaders/issue-9053/node_modules/loader1.js new file mode 100644 index 00000000000..ff626a75267 --- /dev/null +++ b/test/configCases/loaders/issue-9053/node_modules/loader1.js @@ -0,0 +1,3 @@ +module.exports = function(source) { + return source + '\nmodule.exports.push("1");'; +}; diff --git a/test/configCases/loaders/issue-9053/node_modules/loader2.js b/test/configCases/loaders/issue-9053/node_modules/loader2.js new file mode 100644 index 00000000000..4529e002f8b --- /dev/null +++ b/test/configCases/loaders/issue-9053/node_modules/loader2.js @@ -0,0 +1,3 @@ +module.exports = function(source) { + return source + '\nmodule.exports.push("2");'; +}; diff --git a/test/configCases/loaders/issue-9053/node_modules/loader3.js b/test/configCases/loaders/issue-9053/node_modules/loader3.js new file mode 100644 index 00000000000..824c6620d3f --- /dev/null +++ b/test/configCases/loaders/issue-9053/node_modules/loader3.js @@ -0,0 +1,3 @@ +module.exports = function(source) { + return source + '\nmodule.exports.push("3");'; +}; diff --git a/test/configCases/loaders/issue-9053/webpack.config.js b/test/configCases/loaders/issue-9053/webpack.config.js new file mode 100644 index 00000000000..fc77b7765ee --- /dev/null +++ b/test/configCases/loaders/issue-9053/webpack.config.js @@ -0,0 +1,15 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + module: { + rules: [ + { + test: /c\.js$/, + use: ["loader2"] + }, + { + test: /d\.js$/, + use: ["loader3"] + } + ] + } +}; diff --git a/test/configCases/loaders/mode-default/a.js b/test/configCases/loaders/mode-default/a.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/loaders/mode-default/index.js b/test/configCases/loaders/mode-default/index.js new file mode 100644 index 00000000000..d0a4e106af4 --- /dev/null +++ b/test/configCases/loaders/mode-default/index.js @@ -0,0 +1,3 @@ +it("provides mode to loaders when the option is omitted", function() { + expect(require("./a")).toBe("production"); +}); diff --git a/test/configCases/loaders/mode-default/loader.js b/test/configCases/loaders/mode-default/loader.js new file mode 100644 index 00000000000..b9c10626bc4 --- /dev/null +++ b/test/configCases/loaders/mode-default/loader.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { + return `module.exports = "${this.mode}";`; +}; diff --git a/test/configCases/loaders/mode-default/webpack.config.js b/test/configCases/loaders/mode-default/webpack.config.js new file mode 100644 index 00000000000..b991738c053 --- /dev/null +++ b/test/configCases/loaders/mode-default/webpack.config.js @@ -0,0 +1,11 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + module: { + rules: [ + { + test: /a\.js$/, + use: "./loader" + } + ] + } +}; diff --git a/test/configCases/loaders/mode-development/a.js b/test/configCases/loaders/mode-development/a.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/loaders/mode-development/index.js b/test/configCases/loaders/mode-development/index.js new file mode 100644 index 00000000000..6fd77efcc1c --- /dev/null +++ b/test/configCases/loaders/mode-development/index.js @@ -0,0 +1,3 @@ +it("provides mode to loaders when the option is 'development'", function() { + expect(require("./a")).toBe("development"); +}); diff --git a/test/configCases/loaders/mode-development/loader.js b/test/configCases/loaders/mode-development/loader.js new file mode 100644 index 00000000000..b9c10626bc4 --- /dev/null +++ b/test/configCases/loaders/mode-development/loader.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { + return `module.exports = "${this.mode}";`; +}; diff --git a/test/configCases/loaders/mode-development/webpack.config.js b/test/configCases/loaders/mode-development/webpack.config.js new file mode 100644 index 00000000000..7184f5d44d9 --- /dev/null +++ b/test/configCases/loaders/mode-development/webpack.config.js @@ -0,0 +1,12 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + module: { + rules: [ + { + test: /a\.js$/, + use: "./loader" + } + ] + } +}; diff --git a/test/configCases/loaders/mode-none/a.js b/test/configCases/loaders/mode-none/a.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/loaders/mode-none/index.js b/test/configCases/loaders/mode-none/index.js new file mode 100644 index 00000000000..ffecdce0b49 --- /dev/null +++ b/test/configCases/loaders/mode-none/index.js @@ -0,0 +1,3 @@ +it("provides mode to loaders when the option is 'none'", function() { + expect(require("./a")).toBe("none"); +}); diff --git a/test/configCases/loaders/mode-none/loader.js b/test/configCases/loaders/mode-none/loader.js new file mode 100644 index 00000000000..b9c10626bc4 --- /dev/null +++ b/test/configCases/loaders/mode-none/loader.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { + return `module.exports = "${this.mode}";`; +}; diff --git a/test/configCases/loaders/mode-none/webpack.config.js b/test/configCases/loaders/mode-none/webpack.config.js new file mode 100644 index 00000000000..a0b076d51a2 --- /dev/null +++ b/test/configCases/loaders/mode-none/webpack.config.js @@ -0,0 +1,12 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "none", + module: { + rules: [ + { + test: /a\.js$/, + use: "./loader" + } + ] + } +}; diff --git a/test/configCases/loaders/mode-production/a.js b/test/configCases/loaders/mode-production/a.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/loaders/mode-production/index.js b/test/configCases/loaders/mode-production/index.js new file mode 100644 index 00000000000..c6ccd5be92e --- /dev/null +++ b/test/configCases/loaders/mode-production/index.js @@ -0,0 +1,3 @@ +it("provides mode to loaders when the option is 'production'", function() { + expect(require("./a")).toBe("production"); +}); diff --git a/test/configCases/loaders/mode-production/loader.js b/test/configCases/loaders/mode-production/loader.js new file mode 100644 index 00000000000..b9c10626bc4 --- /dev/null +++ b/test/configCases/loaders/mode-production/loader.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { + return `module.exports = "${this.mode}";`; +}; diff --git a/test/configCases/loaders/mode-production/webpack.config.js b/test/configCases/loaders/mode-production/webpack.config.js new file mode 100644 index 00000000000..09b14d843c2 --- /dev/null +++ b/test/configCases/loaders/mode-production/webpack.config.js @@ -0,0 +1,12 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "production", + module: { + rules: [ + { + test: /a\.js$/, + use: "./loader" + } + ] + } +}; diff --git a/test/configCases/loaders/options/a.js b/test/configCases/loaders/options/a.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/loaders/options/b.js b/test/configCases/loaders/options/b.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/loaders/options/c.js b/test/configCases/loaders/options/c.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/loaders/options/d.js b/test/configCases/loaders/options/d.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/loaders/options/deprecations.js b/test/configCases/loaders/options/deprecations.js new file mode 100644 index 00000000000..6c3c0c2f1b2 --- /dev/null +++ b/test/configCases/loaders/options/deprecations.js @@ -0,0 +1,9 @@ +module.exports = [ + { code: /DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING/ }, + { code: /DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING/ }, + { code: /DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING/ }, + { code: /DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING/ }, + { code: /DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING/ }, + { code: /DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING/ }, + { code: /DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING/ } +]; diff --git a/test/configCases/loaders/options/e.js b/test/configCases/loaders/options/e.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/loaders/options/error1.js b/test/configCases/loaders/options/error1.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/loaders/options/error2.js b/test/configCases/loaders/options/error2.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/loaders/options/errors.js b/test/configCases/loaders/options/errors.js new file mode 100644 index 00000000000..3ea73741041 --- /dev/null +++ b/test/configCases/loaders/options/errors.js @@ -0,0 +1,12 @@ +module.exports = [ + [ + /\.\/loader-1\.js/, + /Loader has been/, + /options\.arg6\.bar\.baz should be a string/ + ], + [ + /\.\/loader-2\.js/, + /Custom Loader Name has been/, + /configuration\.arg should be true/ + ] +]; diff --git a/test/configCases/loaders/options/f.js b/test/configCases/loaders/options/f.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/loaders/options/g.js b/test/configCases/loaders/options/g.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/loaders/options/h.js b/test/configCases/loaders/options/h.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/loaders/options/i.js b/test/configCases/loaders/options/i.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/loaders/options/index.js b/test/configCases/loaders/options/index.js new file mode 100644 index 00000000000..56896b7c2ef --- /dev/null +++ b/test/configCases/loaders/options/index.js @@ -0,0 +1,51 @@ +it("should get options", function() { + expect(require("./a")).toStrictEqual({ + arg: true, + arg1: null, + arg3: 1234567890, + arg4: "string", + arg5: [1, 2, 3], + arg6: { foo: "value", bar: { baz: "other-value" } } + }); + expect(require("./b")).toStrictEqual({ + arg: true, + arg1: null, + arg3: 1234567890, + arg4: "string", + arg5: [1, 2, 3], + arg6: { foo: "value", bar: { baz: "other-value" } } + }); + expect(require("./c")).toStrictEqual({ + arg: true, + arg1: null, + arg3: 1234567890, + arg4: "string", + arg5: [1, 2, 3], + arg6: { foo: "value", bar: { baz: "other-value" } } + }); + expect(require("./d")).toStrictEqual({ + arg4: "text" + }); + expect(require("./e")).toStrictEqual({}); + expect(require("./f")).toStrictEqual({ + delicious: "", + name: "cheesecake", + slices: "8", + warm: "false" + }); + expect(require("./g")).toStrictEqual({ + "=": "=" + }); + expect(require("./h")).toStrictEqual({ + foo: "bar" + }); + expect(require("./i")).toStrictEqual({ + foo: "bar" + }); +}); + +const never = false; +if (never) { + require("./error1"); + require("./error2"); +} diff --git a/test/configCases/loaders/options/infrastructure-log.js b/test/configCases/loaders/options/infrastructure-log.js new file mode 100644 index 00000000000..8ef4be52eb7 --- /dev/null +++ b/test/configCases/loaders/options/infrastructure-log.js @@ -0,0 +1,4 @@ +module.exports = [ + // We use (1|2), because both contain the problems, but due asynchronous nature the first module can be `error1` or `error2` + /^Pack got invalid because of write to: Compilation\/modules.+loaders[/\\]options[/\\]error(1|2)\.js$/ +]; diff --git a/test/configCases/loaders/options/loader-1.js b/test/configCases/loaders/options/loader-1.js new file mode 100644 index 00000000000..18e183cbbb0 --- /dev/null +++ b/test/configCases/loaders/options/loader-1.js @@ -0,0 +1,12 @@ +const schema = require("./loader-1.options.json"); + +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { + const options = this.getOptions(schema); + + const json = JSON.stringify(options) + .replace(/\u2028/g, "\\u2028") + .replace(/\u2029/g, "\\u2029"); + + return `module.exports = ${json}`; +}; diff --git a/test/configCases/loaders/options/loader-1.options.json b/test/configCases/loaders/options/loader-1.options.json new file mode 100644 index 00000000000..3c86ba01025 --- /dev/null +++ b/test/configCases/loaders/options/loader-1.options.json @@ -0,0 +1,43 @@ +{ + "additionalProperties": false, + "properties": { + "arg": { + "type": "boolean" + }, + "arg1": { + "type": "null" + }, + "arg2": {}, + "arg3": { + "type": "number" + }, + "arg4": { + "type": "string" + }, + "arg5": { + "type": "array", + "items": { + "type": "number" + } + }, + "arg6": { + "type": "object", + "properties": { + "foo": { + "type": "string" + }, + "bar": { + "type": "object", + "properties": { + "baz": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "type": "object" +} diff --git a/test/configCases/loaders/options/loader-2.js b/test/configCases/loaders/options/loader-2.js new file mode 100644 index 00000000000..faea214da83 --- /dev/null +++ b/test/configCases/loaders/options/loader-2.js @@ -0,0 +1,12 @@ +const schema = require("./loader-2.options.json"); + +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { + const options = this.getOptions(schema); + + const json = JSON.stringify(options) + .replace(/\u2028/g, "\\u2028") + .replace(/\u2029/g, "\\u2029"); + + return `module.exports = ${json}`; +}; diff --git a/test/configCases/loaders/options/loader-2.options.json b/test/configCases/loaders/options/loader-2.options.json new file mode 100644 index 00000000000..d17814f5fcf --- /dev/null +++ b/test/configCases/loaders/options/loader-2.options.json @@ -0,0 +1,10 @@ +{ + "title": "Custom Loader Name configuration", + "additionalProperties": false, + "properties": { + "arg": { + "enum": [true] + } + }, + "type": "object" +} diff --git a/test/configCases/loaders/options/loader.js b/test/configCases/loaders/options/loader.js new file mode 100644 index 00000000000..d1bc02fcd3c --- /dev/null +++ b/test/configCases/loaders/options/loader.js @@ -0,0 +1,10 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { + const options = this.getOptions(); + + const json = JSON.stringify(options) + .replace(/\u2028/g, "\\u2028") + .replace(/\u2029/g, "\\u2029"); + + return `module.exports = ${json}`; +}; diff --git a/test/configCases/loaders/options/webpack.config.js b/test/configCases/loaders/options/webpack.config.js new file mode 100644 index 00000000000..6b5d5723311 --- /dev/null +++ b/test/configCases/loaders/options/webpack.config.js @@ -0,0 +1,93 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "none", + module: { + rules: [ + { + test: /a\.js$/, + loader: "./loader", + options: { + arg: true, + arg1: null, + arg2: undefined, + arg3: 1234567890, + arg4: "string", + arg5: [1, 2, 3], + arg6: { foo: "value", bar: { baz: "other-value" } } + } + }, + { + test: /b\.js$/, + loader: "./loader-1", + options: { + arg: true, + arg1: null, + arg2: undefined, + arg3: 1234567890, + arg4: "string", + arg5: [1, 2, 3], + arg6: { foo: "value", bar: { baz: "other-value" } } + } + }, + { + test: /c\.js$/, + loader: "./loader-1", + options: JSON.stringify({ + arg: true, + arg1: null, + arg2: undefined, + arg3: 1234567890, + arg4: "string", + arg5: [1, 2, 3], + arg6: { foo: "value", bar: { baz: "other-value" } } + }) + }, + { + test: /d\.js$/, + loader: "./loader-1", + options: "arg4=text" + }, + { + test: /d\.js$/, + loader: "./loader", + options: "" + }, + { + test: /f\.js$/, + loader: "./loader", + options: "name=cheesecake&slices=8&delicious&warm=false" + }, + { + test: /g\.js$/, + loader: "./loader", + options: "%3d=%3D" + }, + { + test: /h\.js$/, + loader: "./loader", + options: "foo=bar" + }, + { + test: /i\.js$/, + loader: "./loader", + options: `${JSON.stringify({ + foo: "bar" + })}` + }, + { + test: /error1\.js$/, + loader: "./loader-1", + options: { + arg6: { foo: "value", bar: { baz: 42 } } + } + }, + { + test: /error2\.js$/, + loader: "./loader-2", + options: { + arg: false + } + } + ] + } +}; diff --git a/test/configCases/loaders/pr-14384/PluginWithLoader.js b/test/configCases/loaders/pr-14384/PluginWithLoader.js new file mode 100644 index 00000000000..d62f193e4c7 --- /dev/null +++ b/test/configCases/loaders/pr-14384/PluginWithLoader.js @@ -0,0 +1,31 @@ +const { NormalModule } = require("webpack"); + +const PLUGIN_NAME = "PluginWithLoader"; +const loaderPath = require.resolve("./loader.js"); + +/** @typedef {import("../../../../").Compiler} Compiler */ + +class PluginWithLoader { + /** + * @param {Compiler} compiler compiler + */ + apply(compiler) { + compiler.hooks.compilation.tap(PLUGIN_NAME, compilation => { + NormalModule.getCompilationHooks(compilation).beforeLoaders.tap( + PLUGIN_NAME, + (loaders, normalModule) => { + if (normalModule.userRequest.indexOf("a.js") !== -1) { + loaders.push({ + loader: loaderPath, + options: {}, + ident: null, + type: null + }); + } + } + ); + }); + } +} + +module.exports = PluginWithLoader; diff --git a/test/configCases/loaders/pr-14384/a.js b/test/configCases/loaders/pr-14384/a.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/loaders/pr-14384/index.js b/test/configCases/loaders/pr-14384/index.js new file mode 100644 index 00000000000..7d6a89b89ad --- /dev/null +++ b/test/configCases/loaders/pr-14384/index.js @@ -0,0 +1,3 @@ +it("successfully loads a file that gets its only loader from a plugins beforeLoaders hook", function() { + expect(require("./a")).toBe("success"); +}); diff --git a/test/configCases/loaders/pr-14384/loader.js b/test/configCases/loaders/pr-14384/loader.js new file mode 100644 index 00000000000..27d54132d70 --- /dev/null +++ b/test/configCases/loaders/pr-14384/loader.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { + return `module.exports = "success";`; +}; diff --git a/test/configCases/loaders/pr-14384/webpack.config.js b/test/configCases/loaders/pr-14384/webpack.config.js new file mode 100644 index 00000000000..edf691513a7 --- /dev/null +++ b/test/configCases/loaders/pr-14384/webpack.config.js @@ -0,0 +1,6 @@ +const PluginWithLoader = require("./PluginWithLoader.js"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [new PluginWithLoader()] +}; diff --git a/test/configCases/loaders/pre-post-loader/loader1.js b/test/configCases/loaders/pre-post-loader/loader1.js index 71df71135dd..bf6d1335221 100644 --- a/test/configCases/loaders/pre-post-loader/loader1.js +++ b/test/configCases/loaders/pre-post-loader/loader1.js @@ -1,3 +1,4 @@ -module.exports = function(source) { - return source + "module.exports += \" loader1\";\n"; +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { + return source + 'module.exports += " loader1";\n'; }; diff --git a/test/configCases/loaders/pre-post-loader/loader2.js b/test/configCases/loaders/pre-post-loader/loader2.js index 91497b0978b..b611c84f62b 100644 --- a/test/configCases/loaders/pre-post-loader/loader2.js +++ b/test/configCases/loaders/pre-post-loader/loader2.js @@ -1,3 +1,4 @@ -module.exports = function(source) { - return source + "module.exports += \" loader2\";\n"; +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { + return source + 'module.exports += " loader2";\n'; }; diff --git a/test/configCases/loaders/pre-post-loader/loader3.js b/test/configCases/loaders/pre-post-loader/loader3.js index 32f164287a0..ec526cbac53 100644 --- a/test/configCases/loaders/pre-post-loader/loader3.js +++ b/test/configCases/loaders/pre-post-loader/loader3.js @@ -1,3 +1,4 @@ -module.exports = function(source) { - return source + "module.exports += \" loader3\";\n"; +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { + return source + 'module.exports += " loader3";\n'; }; diff --git a/test/configCases/loaders/pre-post-loader/webpack.config.js b/test/configCases/loaders/pre-post-loader/webpack.config.js index 5a229d44a8d..c460255cee6 100644 --- a/test/configCases/loaders/pre-post-loader/webpack.config.js +++ b/test/configCases/loaders/pre-post-loader/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { module: { rules: [ diff --git a/test/configCases/loaders/remaining-request/b.js b/test/configCases/loaders/remaining-request/b.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/loaders/remaining-request/c.js b/test/configCases/loaders/remaining-request/c.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/loaders/remaining-request/index.js b/test/configCases/loaders/remaining-request/index.js index 53247f52994..d3c3672be06 100644 --- a/test/configCases/loaders/remaining-request/index.js +++ b/test/configCases/loaders/remaining-request/index.js @@ -1,3 +1,11 @@ -it("should correctly pass complex query object with remaining request", function() { +it("should correctly pass complex query object with remaining request (with custom ident)", function() { expect(require("./a")).toBe("ok"); }); + +it("should correctly pass complex query object with remaining request (with default ident)", function() { + expect(require("./b")).toBe("ok"); +}); + +it("should correctly pass complex query object with remaining request (with shorthand syntax and default ident)", function() { + expect(require("./c")).toBe("ok"); +}); diff --git a/test/configCases/loaders/remaining-request/loader1.js b/test/configCases/loaders/remaining-request/loader1.js index 42fea46336a..0d2fcc8b593 100644 --- a/test/configCases/loaders/remaining-request/loader1.js +++ b/test/configCases/loaders/remaining-request/loader1.js @@ -1,3 +1,6 @@ -module.exports.pitch = function(remainingRequest) { - return "module.exports = require(" + JSON.stringify("!!" + remainingRequest) + ");"; +/** @type {import("../../../../").PitchLoaderDefinitionFunction} */ +module.exports.pitch = function (remainingRequest) { + return ( + "module.exports = require(" + JSON.stringify("!!" + remainingRequest) + ");" + ); }; diff --git a/test/configCases/loaders/remaining-request/loader2.js b/test/configCases/loaders/remaining-request/loader2.js index b5b133a9208..40788042801 100644 --- a/test/configCases/loaders/remaining-request/loader2.js +++ b/test/configCases/loaders/remaining-request/loader2.js @@ -1,3 +1,6 @@ -module.exports = function(source) { +/** @type {import("../../../../").LoaderDefinition<{ f(): any }>} */ +module.exports = function (source) { + if (typeof this.query === "string") + throw new Error("query must be an object"); return "module.exports = " + JSON.stringify(this.query.f()); }; diff --git a/test/configCases/loaders/remaining-request/webpack.config.js b/test/configCases/loaders/remaining-request/webpack.config.js index 9119ae9401f..a4a7d3e84fc 100644 --- a/test/configCases/loaders/remaining-request/webpack.config.js +++ b/test/configCases/loaders/remaining-request/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { module: { rules: [ @@ -9,12 +10,39 @@ module.exports = { loader: "./loader2", ident: "loader2", options: { - f: function() { + f() { return "ok"; } } } ] + }, + { + test: /b\.js$/, + use: [ + "./loader1", + { + loader: "./loader2", + options: { + f() { + return "ok"; + } + } + } + ] + }, + { + test: /c\.js$/, + use: "./loader1" + }, + { + test: /c\.js$/, + loader: "./loader2", + options: { + f() { + return "ok"; + } + } } ] } diff --git a/test/configCases/managedPaths/futureDefaults/index.js b/test/configCases/managedPaths/futureDefaults/index.js new file mode 100644 index 00000000000..f191f157474 --- /dev/null +++ b/test/configCases/managedPaths/futureDefaults/index.js @@ -0,0 +1,5 @@ +import value from "package"; + +it("should work", () => { + expect(value).toBe(42); +}); diff --git a/test/configCases/managedPaths/futureDefaults/node_modules/package/index.js b/test/configCases/managedPaths/futureDefaults/node_modules/package/index.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/configCases/managedPaths/futureDefaults/node_modules/package/index.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/configCases/managedPaths/futureDefaults/node_modules/package/package.json b/test/configCases/managedPaths/futureDefaults/node_modules/package/package.json new file mode 100644 index 00000000000..75b93e3b25a --- /dev/null +++ b/test/configCases/managedPaths/futureDefaults/node_modules/package/package.json @@ -0,0 +1,4 @@ +{ + "name": "package", + "version": "1.0.0" +} diff --git a/test/configCases/managedPaths/futureDefaults/webpack.config.js b/test/configCases/managedPaths/futureDefaults/webpack.config.js new file mode 100644 index 00000000000..bf94f1dd4e2 --- /dev/null +++ b/test/configCases/managedPaths/futureDefaults/webpack.config.js @@ -0,0 +1,6 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + experiments: { + futureDefaults: true + } +}; diff --git a/test/configCases/mangle/exports-info-can-mangle/a.js b/test/configCases/mangle/exports-info-can-mangle/a.js new file mode 100644 index 00000000000..25540f9cda1 --- /dev/null +++ b/test/configCases/mangle/exports-info-can-mangle/a.js @@ -0,0 +1,2 @@ +export const aaa = "aaa"; +export const aaaCanMangle = __webpack_exports_info__.aaa.canMangle; diff --git a/test/configCases/mangle/exports-info-can-mangle/b.js b/test/configCases/mangle/exports-info-can-mangle/b.js new file mode 100644 index 00000000000..126daf82d9a --- /dev/null +++ b/test/configCases/mangle/exports-info-can-mangle/b.js @@ -0,0 +1,2 @@ +export const bbb = "bbb"; +export const bbbCanMangle = __webpack_exports_info__.bbb.canMangle; diff --git a/test/configCases/mangle/exports-info-can-mangle/c.js b/test/configCases/mangle/exports-info-can-mangle/c.js new file mode 100644 index 00000000000..68bbacdbe2b --- /dev/null +++ b/test/configCases/mangle/exports-info-can-mangle/c.js @@ -0,0 +1,6 @@ +export * as ca from "./a"; +export * as cb from "./b"; +export const caCanMangle = __webpack_exports_info__.ca.canMangle; +export const cbCanMangle = __webpack_exports_info__.cb.canMangle; +export const ca_aaaCanMangle = __webpack_exports_info__.ca.aaa.canMangle; +export const cb_bbbCanMangle = __webpack_exports_info__.cb.bbb.canMangle; \ No newline at end of file diff --git a/test/configCases/mangle/exports-info-can-mangle/index.js b/test/configCases/mangle/exports-info-can-mangle/index.js new file mode 100644 index 00000000000..69f2d5099a7 --- /dev/null +++ b/test/configCases/mangle/exports-info-can-mangle/index.js @@ -0,0 +1,23 @@ +import { aaa, aaaCanMangle } from "./a"; +import * as b from "./b" +import { ca, cb, caCanMangle, cbCanMangle, ca_aaaCanMangle, cb_bbbCanMangle } from "./c"; + +it("__webpack_exports_info__.xxx.canMangle should be correct", () => { + expect(aaa).toBe("aaa"); + expect(aaaCanMangle).toBe(true); + + const { bbb, bbbCanMangle } = b; + expect(bbb).toBe("bbb"); + expect(bbbCanMangle).toBe(true); + + expect(caCanMangle).toBe(true); + expect(cbCanMangle).toBe(true); +}); + +it("__webpack_exports_info__.xxx.yyy.canMangle should be correct", () => { + expect(ca.aaa).toBe("aaa"); + expect(ca_aaaCanMangle).toBe(aaaCanMangle); + + expect(cb.bbb).toBe("bbb"); + expect(cb_bbbCanMangle).toBe(b.bbbCanMangle); +}); diff --git a/test/configCases/mangle/exports-info-can-mangle/webpack.config.js b/test/configCases/mangle/exports-info-can-mangle/webpack.config.js new file mode 100644 index 00000000000..3d405a2e2f2 --- /dev/null +++ b/test/configCases/mangle/exports-info-can-mangle/webpack.config.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + mangleExports: true, + usedExports: true, + providedExports: true + } +}; diff --git a/test/configCases/mangle/mangle-with-destructuring-assignment/data.json b/test/configCases/mangle/mangle-with-destructuring-assignment/data.json new file mode 100644 index 00000000000..3248ec2c36d --- /dev/null +++ b/test/configCases/mangle/mangle-with-destructuring-assignment/data.json @@ -0,0 +1,19 @@ +{ + "obj": { + "arr": [ + { + "prop1": 1, + "prop2": 2 + }, + { + "prop3": 3, + "prop4": 4 + }, + { + "prop5": 5, + "prop6": 6 + } + ] + }, + "foo": "foo" +} diff --git a/test/configCases/mangle/mangle-with-destructuring-assignment/index.js b/test/configCases/mangle/mangle-with-destructuring-assignment/index.js new file mode 100644 index 00000000000..1d460b29369 --- /dev/null +++ b/test/configCases/mangle/mangle-with-destructuring-assignment/index.js @@ -0,0 +1,94 @@ +import path from "path"; +import * as module from "./module"; +import { obj3, obj3CanMangle, obj4, obj4CanMangle } from "./reexport?side-effects" // enable side effects to ensure reexport is not skipped +import data from "./data.json"; +import data2 from "./data.json?2"; + +it("should mangle export when destructuring module", () => { + const { obj: { a, b }, objCanMangle } = module + expect(a).toBe("a"); + expect(b).toBe("b"); + expect(objCanMangle).toBe(true) +}); + +it("should mangle export when destructuring module's property", () => { + const { a, b } = module.obj2 + const { obj2CanMangle } = module + expect(a).toBe("a"); + expect(b).toBe("b"); + expect(obj2CanMangle).toBe(true) +}); + +it("should mangle export when using module dot property", () => { + expect(module.aaa).toBe("aaa"); + expect(module.aaaCanMangle).toBe(true) +}); + +it("should mangle export when destructuring module's property is a module", () => { + const { aaa, bbb } = obj3; + expect(aaa).toBe("a"); + expect(bbb).toBe("b"); + expect(obj3CanMangle).toBe(true) +}); + +it("should not mangle export when destructuring module's nested property is a module (used in unknown way)", () => { + const { nested: { obj5, obj5CanMangle } } = obj4; + expect(obj5.aaa).toBe("a"); + expect(obj5.bbb).toBe("b"); + expect(obj4CanMangle).toBe(true); + expect(obj5CanMangle).toBe(false); // obj5 is used in unknown way +}); + +it("should mangle default in namespace import", async () => { + const { default: foo, defaultCanMangle } = module; + expect(foo).toBe("default"); + expect(defaultCanMangle).toBe(true); +}); + +it("should mangle when destructuring json", async () => { + const { obj: { + "arr": [ + { prop1: p1 = 0 } + ] + } } = data; + expect(p1).toBe(1); + + const values = []; + ({ + foo: values[0], + obj: { + ["a" + "r" + "r"]: { + length: values[1], + } + } + } = data); + expect(values[0]).toBe("foo"); + expect(values[1]).toBe(3); + + const generatedJson = __non_webpack_require__(path.resolve(__dirname, "data.json.js")); + expect(generatedJson).toEqual({ + "W": { + "arr": [ + { "prop1": 1, "prop2": 2 }, + { "prop3": 3, "prop4": 4 }, + { "prop5": 5, "prop6": 6 } + ] + }, + "p": "foo" + }); +}); + +it("should mangle when destructuring json 2", async () => { + const { prop1, prop2 } = data2.obj.arr[0]; + expect(prop1).toBe(1); + expect(prop2).toBe(2); + + const generatedJson = __non_webpack_require__(path.resolve(__dirname, "data.json_2.js")); + expect(generatedJson).toEqual({ + "W": { + "Q": [ + { "X": 1, "Q": 2 }, + ], + } + }); +}); diff --git a/test/configCases/mangle/mangle-with-destructuring-assignment/module.js b/test/configCases/mangle/mangle-with-destructuring-assignment/module.js new file mode 100644 index 00000000000..d3b887767ad --- /dev/null +++ b/test/configCases/mangle/mangle-with-destructuring-assignment/module.js @@ -0,0 +1,11 @@ +export const aaa = "aaa"; +export const aaaCanMangle = __webpack_exports_info__.aaa.canMangle; + +export const obj = { a: "a", b: "b" } +export const objCanMangle = __webpack_exports_info__.obj.canMangle; + +export const obj2 = { a: "a", b: "b" } +export const obj2CanMangle = __webpack_exports_info__.obj2.canMangle; + +export default "default"; +export const defaultCanMangle = __webpack_exports_info__.default.canMangle; diff --git a/test/configCases/mangle/mangle-with-destructuring-assignment/module2.js b/test/configCases/mangle/mangle-with-destructuring-assignment/module2.js new file mode 100644 index 00000000000..e6951b14093 --- /dev/null +++ b/test/configCases/mangle/mangle-with-destructuring-assignment/module2.js @@ -0,0 +1,2 @@ +export const aaa = "a"; +export const bbb = "b"; diff --git a/test/configCases/mangle/mangle-with-destructuring-assignment/module3.js b/test/configCases/mangle/mangle-with-destructuring-assignment/module3.js new file mode 100644 index 00000000000..e6951b14093 --- /dev/null +++ b/test/configCases/mangle/mangle-with-destructuring-assignment/module3.js @@ -0,0 +1,2 @@ +export const aaa = "a"; +export const bbb = "b"; diff --git a/test/configCases/mangle/mangle-with-destructuring-assignment/reexport.js b/test/configCases/mangle/mangle-with-destructuring-assignment/reexport.js new file mode 100644 index 00000000000..a5ab8d9c607 --- /dev/null +++ b/test/configCases/mangle/mangle-with-destructuring-assignment/reexport.js @@ -0,0 +1,6 @@ +export * as obj3 from "./module2" +export const obj3CanMangle = __webpack_exports_info__.obj3.canMangle; + +import * as reexport2 from "./reexport2?side-effects" +export const obj4 = { nested: reexport2 } +export const obj4CanMangle = __webpack_exports_info__.reexport2.canMangle; diff --git a/test/configCases/mangle/mangle-with-destructuring-assignment/reexport2.js b/test/configCases/mangle/mangle-with-destructuring-assignment/reexport2.js new file mode 100644 index 00000000000..da9c4eb705a --- /dev/null +++ b/test/configCases/mangle/mangle-with-destructuring-assignment/reexport2.js @@ -0,0 +1,2 @@ +export * as obj5 from "./module3" +export const obj5CanMangle = __webpack_exports_info__.obj5.canMangle; diff --git a/test/configCases/mangle/mangle-with-destructuring-assignment/webpack.config.js b/test/configCases/mangle/mangle-with-destructuring-assignment/webpack.config.js new file mode 100644 index 00000000000..67e35d061e0 --- /dev/null +++ b/test/configCases/mangle/mangle-with-destructuring-assignment/webpack.config.js @@ -0,0 +1,50 @@ +/** @typedef {import("webpack-sources").Source} Source */ + +/** @type {import("../../../../").Configuration} */ +module.exports = { + module: { + rules: [ + { + resourceQuery: /side-effects/, + sideEffects: true + } + ] + }, + optimization: { + mangleExports: true, + usedExports: true, + providedExports: true, + concatenateModules: false + }, + plugins: [ + function getJsonCodeGeneratedSource(compiler) { + compiler.hooks.compilation.tap( + getJsonCodeGeneratedSource.name, + compilation => { + compilation.hooks.processAssets.tap( + getJsonCodeGeneratedSource.name, + () => { + for (const module of compilation.modules) { + if (module.type === "json") { + const { sources } = compilation.codeGenerationResults.get( + module, + "main" + ); + const source = + /** @type {Source} */ + (sources.get("javascript")); + const file = compilation.getAssetPath("[name].js", { + filename: `${module + .readableIdentifier(compilation.requestShortener) + .replace(/[?#]/g, "_")}.js` + }); + compilation.emitAsset(file, source); + } + } + } + ); + } + ); + } + ] +}; diff --git a/test/configCases/mangle/mangle-with-object-prop/commonjs.js b/test/configCases/mangle/mangle-with-object-prop/commonjs.js new file mode 100644 index 00000000000..fd733318b13 --- /dev/null +++ b/test/configCases/mangle/mangle-with-object-prop/commonjs.js @@ -0,0 +1,10 @@ +exports.abc = "abc"; +exports.def = "def"; +exports.setToString = () => { + exports.toString = () => "toString"; +}; +exports.moduleId = module.id; +exports.a = "single char"; +exports["="] = "single char non-identifier"; +exports.$1 = "double char"; +exports.__1 = "3 chars"; diff --git a/test/configCases/mangle/mangle-with-object-prop/index.js b/test/configCases/mangle/mangle-with-object-prop/index.js new file mode 100644 index 00000000000..a1b4cbf45b0 --- /dev/null +++ b/test/configCases/mangle/mangle-with-object-prop/index.js @@ -0,0 +1,49 @@ +import { moduleId, setToString, toString, abc, a, $1, __1 } from "./module"; +const moduleId2 = require("./commonjs").moduleId; +const toString2 = require("./commonjs").toString; +const setToString2 = require("./commonjs").setToString; +const abc2 = require("./commonjs").abc; +const a2 = require("./commonjs").a; +const equals2 = require("./commonjs")["="]; +const $12 = require("./commonjs").$1; +const __12 = require("./commonjs").__1; + +it("should mangle names and remove exports even with toString named export (ESM)", () => { + expect(abc).toBe("abc"); + expect(toString).toBe(undefined); + setToString(); + expect(toString()).toBe("toString"); + expect(a).toBe("single char"); + expect($1).toBe("double char"); + expect(__1).toBe("3 chars"); + expect( + Object.keys(require.cache[moduleId].exports) + .map(p => p.length) + .sort() + ).toEqual( + OPTIMIZATION === "deterministic" + ? [1, 2, 2, 2, 2, 2, 2] + : [1, 1, 1, 1, 1, 1, 1] + ); +}); + +it("should mangle names and remove exports even with toString named export (CJS)", () => { + expect(abc2).toBe("abc"); + expect(toString2).toBe(Object.prototype.toString); + setToString2(); + const toString3 = require("./commonjs").toString; + expect(toString3()).toBe("toString"); + expect(a2).toBe("single char"); + expect(equals2).toBe("single char non-identifier"); + expect($12).toBe("double char"); + expect(__12).toBe("3 chars"); + expect( + Object.keys(require.cache[moduleId2].exports) + .map(p => p.length) + .sort() + ).toEqual( + OPTIMIZATION === "deterministic" + ? [1, 2, 2, 2, 2, 2, 2, 8] + : [1, 1, 1, 1, 1, 1, 1, 8] + ); +}); diff --git a/test/configCases/mangle/mangle-with-object-prop/module.js b/test/configCases/mangle/mangle-with-object-prop/module.js new file mode 100644 index 00000000000..3c72b8d2c5c --- /dev/null +++ b/test/configCases/mangle/mangle-with-object-prop/module.js @@ -0,0 +1,10 @@ +export const abc = "abc"; +export const def = "def"; +export let toString; +export const setToString = () => { + toString = () => "toString"; +}; +export const moduleId = module.id; +export const a = "single char"; +export const $1 = "double char"; +export const __1 = "3 chars"; diff --git a/test/configCases/mangle/mangle-with-object-prop/test.config.js b/test/configCases/mangle/mangle-with-object-prop/test.config.js new file mode 100644 index 00000000000..e47827d568a --- /dev/null +++ b/test/configCases/mangle/mangle-with-object-prop/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./deterministic.js", "./size.js"]; + } +}; diff --git a/test/configCases/mangle/mangle-with-object-prop/webpack.config.js b/test/configCases/mangle/mangle-with-object-prop/webpack.config.js new file mode 100644 index 00000000000..8f2404a0cd6 --- /dev/null +++ b/test/configCases/mangle/mangle-with-object-prop/webpack.config.js @@ -0,0 +1,34 @@ +const { DefinePlugin } = require("../../../../"); +/** @type {import("../../../../").Configuration} */ +module.exports = [ + { + output: { + filename: "deterministic.js" + }, + optimization: { + mangleExports: true, + usedExports: true, + providedExports: true + }, + plugins: [ + new DefinePlugin({ + OPTIMIZATION: JSON.stringify("deterministic") + }) + ] + }, + { + output: { + filename: "size.js" + }, + optimization: { + mangleExports: "size", + usedExports: true, + providedExports: true + }, + plugins: [ + new DefinePlugin({ + OPTIMIZATION: JSON.stringify("size") + }) + ] + } +]; diff --git a/test/configCases/mangle/mangle-with-re-export-as-default/index.js b/test/configCases/mangle/mangle-with-re-export-as-default/index.js new file mode 100644 index 00000000000..3101663c81a --- /dev/null +++ b/test/configCases/mangle/mangle-with-re-export-as-default/index.js @@ -0,0 +1,6 @@ +import namespace from "./re-exports"; + +it("should mangle exports imported", () => { + const { foo } = namespace; + expect(foo).toBe('foo') +}); diff --git a/test/configCases/mangle/mangle-with-re-export-as-default/module.js b/test/configCases/mangle/mangle-with-re-export-as-default/module.js new file mode 100644 index 00000000000..3329a7d972f --- /dev/null +++ b/test/configCases/mangle/mangle-with-re-export-as-default/module.js @@ -0,0 +1 @@ +export const foo = 'foo'; diff --git a/test/configCases/mangle/mangle-with-re-export-as-default/re-exports.js b/test/configCases/mangle/mangle-with-re-export-as-default/re-exports.js new file mode 100644 index 00000000000..a29514f469b --- /dev/null +++ b/test/configCases/mangle/mangle-with-re-export-as-default/re-exports.js @@ -0,0 +1,3 @@ +import * as namespace from './module'; + +export { namespace as default }; diff --git a/test/configCases/mangle/mangle-with-re-export-as-default/webpack.config.js b/test/configCases/mangle/mangle-with-re-export-as-default/webpack.config.js new file mode 100644 index 00000000000..1826c4c6589 --- /dev/null +++ b/test/configCases/mangle/mangle-with-re-export-as-default/webpack.config.js @@ -0,0 +1,9 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + mangleExports: true, + usedExports: true, + providedExports: true, + sideEffects: false // disable reexports optimization + } +}; diff --git a/test/configCases/module-name/different-issuers-for-same-module/loader-a.js b/test/configCases/module-name/different-issuers-for-same-module/loader-a.js index bd8581ca4a4..4e8352ee90e 100644 --- a/test/configCases/module-name/different-issuers-for-same-module/loader-a.js +++ b/test/configCases/module-name/different-issuers-for-same-module/loader-a.js @@ -1,3 +1,4 @@ -module.exports = function(src) { +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (src) { return `module.exports = "loader-a" + module.id`; }; diff --git a/test/configCases/module-name/different-issuers-for-same-module/loader-b.js b/test/configCases/module-name/different-issuers-for-same-module/loader-b.js index 5365e2fd355..7fa193f020f 100644 --- a/test/configCases/module-name/different-issuers-for-same-module/loader-b.js +++ b/test/configCases/module-name/different-issuers-for-same-module/loader-b.js @@ -1,3 +1,4 @@ -module.exports = function(src) { +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (src) { return `module.exports = "loader-b" + module.id`; }; diff --git a/test/configCases/module-name/different-issuers-for-same-module/webpack.config.js b/test/configCases/module-name/different-issuers-for-same-module/webpack.config.js index 6527d721c87..e86db6268f9 100644 --- a/test/configCases/module-name/different-issuers-for-same-module/webpack.config.js +++ b/test/configCases/module-name/different-issuers-for-same-module/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { mode: "development", entry: ["./a", "./b", "./test"], diff --git a/test/configCases/module/externals/imported.js b/test/configCases/module/externals/imported.js new file mode 100644 index 00000000000..f0c663f58c6 --- /dev/null +++ b/test/configCases/module/externals/imported.js @@ -0,0 +1,3 @@ +import value from "./module"; + +export default value + 2; diff --git a/test/configCases/module/externals/index.js b/test/configCases/module/externals/index.js new file mode 100644 index 00000000000..ddf9dade569 --- /dev/null +++ b/test/configCases/module/externals/index.js @@ -0,0 +1,13 @@ +import imported from "./imported.mjs"; +import value from "./module"; +import { metaUrl } from "./meta"; +const localMetaUrl = import.meta.url; + +it("should allow to use externals in concatenated modules", () => { + expect(imported).toBe(42); + expect(value).toBe(40); +}); + +it("all bundled files should have same url, when parser.javascript.importMeta === false", () => { + expect(localMetaUrl).toBe(metaUrl) +}); diff --git a/test/configCases/module/externals/meta.js b/test/configCases/module/externals/meta.js new file mode 100644 index 00000000000..eb60388df50 --- /dev/null +++ b/test/configCases/module/externals/meta.js @@ -0,0 +1 @@ +export const metaUrl = import.meta.url; \ No newline at end of file diff --git a/test/configCases/module/externals/module.js b/test/configCases/module/externals/module.js new file mode 100644 index 00000000000..03c2e17df3f --- /dev/null +++ b/test/configCases/module/externals/module.js @@ -0,0 +1 @@ +export default 40; diff --git a/test/configCases/module/externals/test.config.js b/test/configCases/module/externals/test.config.js new file mode 100644 index 00000000000..1192a7afc60 --- /dev/null +++ b/test/configCases/module/externals/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return "./main.mjs"; + } +}; diff --git a/test/configCases/module/externals/webpack.config.js b/test/configCases/module/externals/webpack.config.js new file mode 100644 index 00000000000..78ad7d63d86 --- /dev/null +++ b/test/configCases/module/externals/webpack.config.js @@ -0,0 +1,30 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + module: { + parser: { + javascript: { + importMeta: false + } + } + }, + entry: { + main: "./index.js", + imported: { + import: "./imported.js", + library: { + type: "module" + } + } + }, + target: "node14", + output: { + filename: "[name].mjs" + }, + externals: "./imported.mjs", + experiments: { + outputModule: true + }, + optimization: { + concatenateModules: true + } +}; diff --git a/test/configCases/module/runtime-chunk/index.js b/test/configCases/module/runtime-chunk/index.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/module/runtime-chunk/index.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/module/runtime-chunk/test.config.js b/test/configCases/module/runtime-chunk/test.config.js new file mode 100644 index 00000000000..cb1a8be8b4a --- /dev/null +++ b/test/configCases/module/runtime-chunk/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./runtime.mjs", "./main.mjs"]; + } +}; diff --git a/test/configCases/module/runtime-chunk/webpack.config.js b/test/configCases/module/runtime-chunk/webpack.config.js new file mode 100644 index 00000000000..b1bdf750f81 --- /dev/null +++ b/test/configCases/module/runtime-chunk/webpack.config.js @@ -0,0 +1,14 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + filename: "[name].mjs" + }, + target: ["web", "es2020"], + experiments: { + outputModule: true + }, + optimization: { + minimize: true, + runtimeChunk: "single" + } +}; diff --git a/test/configCases/module/split-chunks/index.js b/test/configCases/module/split-chunks/index.js new file mode 100644 index 00000000000..d5753c14d6b --- /dev/null +++ b/test/configCases/module/split-chunks/index.js @@ -0,0 +1,16 @@ +import value from "./separate"; +import { test as t } from "external-self"; + +it("should compile", () => { + expect(value).toBe(42); +}); +it("should circular depend on itself external", () => { + expect(test()).toBe(42); + expect(t()).toBe(42); +}); + +function test() { + return 42; +} + +export { test }; diff --git a/test/configCases/module/split-chunks/separate.js b/test/configCases/module/split-chunks/separate.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/configCases/module/split-chunks/separate.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/configCases/module/split-chunks/test.config.js b/test/configCases/module/split-chunks/test.config.js new file mode 100644 index 00000000000..e2664c9b261 --- /dev/null +++ b/test/configCases/module/split-chunks/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./runtime.mjs", "./separate.mjs", "./main.mjs"]; + } +}; diff --git a/test/configCases/module/split-chunks/webpack.config.js b/test/configCases/module/split-chunks/webpack.config.js new file mode 100644 index 00000000000..e8a91725c45 --- /dev/null +++ b/test/configCases/module/split-chunks/webpack.config.js @@ -0,0 +1,30 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + filename: "[name].mjs", + library: { + type: "module" + } + }, + target: ["web", "es2020"], + experiments: { + outputModule: true + }, + optimization: { + minimize: true, + runtimeChunk: "single", + splitChunks: { + cacheGroups: { + separate: { + test: /separate/, + chunks: "all", + filename: "separate.mjs", + enforce: true + } + } + } + }, + externals: { + "external-self": "./main.mjs" + } +}; diff --git a/test/configCases/no-parse/module.exports/webpack.config.js b/test/configCases/no-parse/module.exports/webpack.config.js index 5588dd0a1f7..b63c4511aa9 100644 --- a/test/configCases/no-parse/module.exports/webpack.config.js +++ b/test/configCases/no-parse/module.exports/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { module: { noParse: /not-parsed/ diff --git a/test/configCases/no-parse/no-parse-function/webpack.config.js b/test/configCases/no-parse/no-parse-function/webpack.config.js index b31b5cc2959..c1e2ece23e0 100644 --- a/test/configCases/no-parse/no-parse-function/webpack.config.js +++ b/test/configCases/no-parse/no-parse-function/webpack.config.js @@ -1,6 +1,7 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { module: { - noParse: function(content) { + noParse(content) { return /not-parsed/.test(content); } } diff --git a/test/configCases/node/node-prefix/index.js b/test/configCases/node/node-prefix/index.js new file mode 100644 index 00000000000..84aa3bd98fd --- /dev/null +++ b/test/configCases/node/node-prefix/index.js @@ -0,0 +1,8 @@ +import vm1 from "vm"; +import vm2 from "node:vm"; + +it("should allow importing node builtin modules with the node: prefix", () => { + expect(require("node:fs")).toBe(require("fs")); + expect(require("node:path")).toBe(require("path")); + expect(vm2).toBe(vm1); +}); diff --git a/test/configCases/node/node-prefix/webpack.config.js b/test/configCases/node/node-prefix/webpack.config.js new file mode 100644 index 00000000000..029181fbeba --- /dev/null +++ b/test/configCases/node/node-prefix/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "node" +}; diff --git a/test/configCases/node/prefix-in-runtime/index.js b/test/configCases/node/prefix-in-runtime/index.js new file mode 100644 index 00000000000..592ce5991ca --- /dev/null +++ b/test/configCases/node/prefix-in-runtime/index.js @@ -0,0 +1,16 @@ +import fs from "fs"; + +it(`should have/have not 'node:' prefix ${__filename}`, () => { + const content = fs.readFileSync(__filename, "utf-8"); + + if (/bundle7\.js$/.test(__filename)) { + expect(content).toContain("require(\"fs\");"); + } else if (/(bundle1\.mjs|bundle3\.mjs|bundle6\.mjs)$/.test(__filename)) { + expect(content).toContain("from \"url\""); + expect(content).toContain("from \"module\""); + } else { + expect(content).toContain("from \"node:url\""); + expect(content).toContain("from \"node:module\""); + } +}); + diff --git a/test/configCases/node/prefix-in-runtime/test.filter.js b/test/configCases/node/prefix-in-runtime/test.filter.js new file mode 100644 index 00000000000..ce19d8618ed --- /dev/null +++ b/test/configCases/node/prefix-in-runtime/test.filter.js @@ -0,0 +1,3 @@ +module.exports = function () { + return !process.version.startsWith("v10."); +}; diff --git a/test/configCases/node/prefix-in-runtime/webpack.config.js b/test/configCases/node/prefix-in-runtime/webpack.config.js new file mode 100644 index 00000000000..c7da21b83c8 --- /dev/null +++ b/test/configCases/node/prefix-in-runtime/webpack.config.js @@ -0,0 +1,76 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = [ + { + target: "node", + experiments: { + outputModule: true + }, + output: { + module: true, + chunkFormat: "module" + } + }, + { + target: "node14.17", + experiments: { + outputModule: true + }, + output: { + module: true, + chunkFormat: "module" + } + }, + { + target: "node14.18", + experiments: { + outputModule: true + }, + output: { + module: true, + chunkFormat: "module" + } + }, + { + target: "node15", + experiments: { + outputModule: true + }, + output: { + module: true, + chunkFormat: "module" + } + }, + { + target: "node16", + experiments: { + outputModule: true + }, + output: { + module: true, + chunkFormat: "module" + } + }, + { + target: "browserslist:node 14.18.0, node 16.0.0", + experiments: { + outputModule: true + }, + output: { + module: true, + chunkFormat: "module" + } + }, + { + target: "browserslist:node 14.18.0, node 15.0.0, node 16.0.0", + experiments: { + outputModule: true + }, + output: { + module: true, + chunkFormat: "module" + } + }, + { + target: "node" + } +]; diff --git a/test/configCases/optimization/chunk/files/file1.js b/test/configCases/optimization/chunk/files/file1.js new file mode 100644 index 00000000000..80e295b9644 --- /dev/null +++ b/test/configCases/optimization/chunk/files/file1.js @@ -0,0 +1 @@ +module.exports = "hello"; diff --git a/test/configCases/optimization/chunk/index.js b/test/configCases/optimization/chunk/index.js new file mode 100644 index 00000000000..732bebffb7d --- /dev/null +++ b/test/configCases/optimization/chunk/index.js @@ -0,0 +1 @@ +it("should run with deterministic chunkIds", () => {}); diff --git a/test/configCases/optimization/chunk/webpack.config.js b/test/configCases/optimization/chunk/webpack.config.js new file mode 100644 index 00000000000..35b1f3a3245 --- /dev/null +++ b/test/configCases/optimization/chunk/webpack.config.js @@ -0,0 +1,8 @@ +const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + chunkIds: false + }, + plugins: [new webpack.ids.DeterministicChunkIdsPlugin()] +}; diff --git a/test/configCases/optimization/depend-on-runtimes/a-or-b.js b/test/configCases/optimization/depend-on-runtimes/a-or-b.js new file mode 100644 index 00000000000..b63c6d182a1 --- /dev/null +++ b/test/configCases/optimization/depend-on-runtimes/a-or-b.js @@ -0,0 +1,25 @@ +import { w, used } from "./module"; + +export default it => + it("should have the correct exports", () => { + expect(w).toBe("w"); + if (__webpack_runtime_id__ === "a") { + expect(used).toEqual({ + w: true, + v: false, + x: true, + y: false, + z: false + }); + } else if (__webpack_runtime_id__ === "b") { + expect(used).toEqual({ + w: true, + v: true, + x: false, + y: true, + z: false + }); + } else { + expect(__webpack_runtime_id__).toBe("a or b"); + } + }); diff --git a/test/configCases/optimization/depend-on-runtimes/a.js b/test/configCases/optimization/depend-on-runtimes/a.js new file mode 100644 index 00000000000..768f7cb16cc --- /dev/null +++ b/test/configCases/optimization/depend-on-runtimes/a.js @@ -0,0 +1,14 @@ +import { x, used } from "./module"; + +it("should have the correct exports", () => { + expect(x).toBe("x"); + expect(used).toEqual({ + w: true, + v: false, + x: true, + y: false, + z: false + }); + + return import("./a-or-b").then(m => m.default(it)); +}); diff --git a/test/configCases/optimization/depend-on-runtimes/b-or-c.js b/test/configCases/optimization/depend-on-runtimes/b-or-c.js new file mode 100644 index 00000000000..1364b1b53c5 --- /dev/null +++ b/test/configCases/optimization/depend-on-runtimes/b-or-c.js @@ -0,0 +1,6 @@ +import { v } from "./module"; + +export default it => + it("should have the correct exports", () => { + expect(v).toBe("v"); + }); diff --git a/test/configCases/optimization/depend-on-runtimes/b.js b/test/configCases/optimization/depend-on-runtimes/b.js new file mode 100644 index 00000000000..2d82241ca6e --- /dev/null +++ b/test/configCases/optimization/depend-on-runtimes/b.js @@ -0,0 +1,17 @@ +import { y, used } from "./module"; + +it("should have the correct exports", () => { + expect(y).toBe("y"); + expect(used).toEqual({ + w: true, + v: true, + x: false, + y: true, + z: false + }); + + return Promise.all([ + import("./a-or-b").then(m => m.default(it)), + import("./b-or-c").then(m => m.default(it)) + ]); +}); diff --git a/test/configCases/optimization/depend-on-runtimes/c.js b/test/configCases/optimization/depend-on-runtimes/c.js new file mode 100644 index 00000000000..0232e88655f --- /dev/null +++ b/test/configCases/optimization/depend-on-runtimes/c.js @@ -0,0 +1,14 @@ +import { z, used } from "./module"; + +it("should have the correct exports", () => { + expect(z).toBe("z"); + expect(used).toEqual({ + w: false, + v: true, + x: false, + y: false, + z: true + }); + + return import("./b-or-c").then(m => m.default(it)); +}); diff --git a/test/configCases/optimization/depend-on-runtimes/module.js b/test/configCases/optimization/depend-on-runtimes/module.js new file mode 100644 index 00000000000..90d6fb81bf4 --- /dev/null +++ b/test/configCases/optimization/depend-on-runtimes/module.js @@ -0,0 +1,12 @@ +export const v = "v"; +export const w = "w"; +export const x = "x"; +export const y = "y"; +export const z = "z"; +export const used = { + w: __webpack_exports_info__.w.used, + v: __webpack_exports_info__.v.used, + x: __webpack_exports_info__.x.used, + y: __webpack_exports_info__.y.used, + z: __webpack_exports_info__.z.used +}; diff --git a/test/configCases/optimization/depend-on-runtimes/test.config.js b/test/configCases/optimization/depend-on-runtimes/test.config.js new file mode 100644 index 00000000000..908653524a0 --- /dev/null +++ b/test/configCases/optimization/depend-on-runtimes/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./a.js", "./b.js", "./runtime-c.js", "./c.js"]; + } +}; diff --git a/test/configCases/optimization/depend-on-runtimes/webpack.config.js b/test/configCases/optimization/depend-on-runtimes/webpack.config.js new file mode 100644 index 00000000000..251e8fcccf9 --- /dev/null +++ b/test/configCases/optimization/depend-on-runtimes/webpack.config.js @@ -0,0 +1,17 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + filename: "[name].js" + }, + optimization: { + chunkIds: "named" + }, + entry: { + a: "./a", + b: "./b", + c: { + import: "./c", + runtime: "runtime-c" + } + } +}; diff --git a/test/configCases/optimization/hashed-module-ids/warnings.js b/test/configCases/optimization/hashed-module-ids/warnings.js new file mode 100644 index 00000000000..70fefa270fb --- /dev/null +++ b/test/configCases/optimization/hashed-module-ids/warnings.js @@ -0,0 +1 @@ +module.exports = [[/hashed/, /deprecated/]]; diff --git a/test/configCases/optimization/hashed-module-ids/webpack.config.js b/test/configCases/optimization/hashed-module-ids/webpack.config.js index 19d544d1dbe..e3f2e0b3bf3 100644 --- a/test/configCases/optimization/hashed-module-ids/webpack.config.js +++ b/test/configCases/optimization/hashed-module-ids/webpack.config.js @@ -1,5 +1,6 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { optimization: { - hashedModuleIds: true + moduleIds: "hashed" } }; diff --git a/test/configCases/optimization/issue-19184/files/file1.js b/test/configCases/optimization/issue-19184/files/file1.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/optimization/issue-19184/files/file1.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/optimization/issue-19184/files/file2.js b/test/configCases/optimization/issue-19184/files/file2.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/optimization/issue-19184/files/file2.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/optimization/issue-19184/files/file3.js b/test/configCases/optimization/issue-19184/files/file3.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/optimization/issue-19184/files/file3.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/optimization/issue-19184/files/file4.js b/test/configCases/optimization/issue-19184/files/file4.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/optimization/issue-19184/files/file4.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/optimization/issue-19184/files/file5.js b/test/configCases/optimization/issue-19184/files/file5.js new file mode 100644 index 00000000000..3cec1b77aad --- /dev/null +++ b/test/configCases/optimization/issue-19184/files/file5.js @@ -0,0 +1 @@ +module.exports = module.id; diff --git a/test/configCases/optimization/issue-19184/index.js b/test/configCases/optimization/issue-19184/index.js new file mode 100644 index 00000000000..51fbfa49c0d --- /dev/null +++ b/test/configCases/optimization/issue-19184/index.js @@ -0,0 +1,10 @@ +it("should have module ids defined in sorted order", function() { + for (var i = 1; i <= 5; i++) { + var unusedModuleId = require("./files/file" + i + ".js"); + } + + const moduleIds = Object.keys(__webpack_modules__); + + const sortedIds = moduleIds.slice().sort(); + expect(moduleIds).toEqual(sortedIds); +}); diff --git a/test/configCases/optimization/issue-19184/warnings.js b/test/configCases/optimization/issue-19184/warnings.js new file mode 100644 index 00000000000..70fefa270fb --- /dev/null +++ b/test/configCases/optimization/issue-19184/warnings.js @@ -0,0 +1 @@ +module.exports = [[/hashed/, /deprecated/]]; diff --git a/test/configCases/optimization/issue-19184/webpack.config.js b/test/configCases/optimization/issue-19184/webpack.config.js new file mode 100644 index 00000000000..f77b0884f56 --- /dev/null +++ b/test/configCases/optimization/issue-19184/webpack.config.js @@ -0,0 +1,6 @@ +/** @type {import("../../../../types").Configuration} */ +module.exports = { + optimization: { + moduleIds: "hashed" + } +}; diff --git a/test/configCases/optimization/minimizer/webpack.config.js b/test/configCases/optimization/minimizer/webpack.config.js index 0df441570c3..e15c2ba44ea 100644 --- a/test/configCases/optimization/minimizer/webpack.config.js +++ b/test/configCases/optimization/minimizer/webpack.config.js @@ -1,18 +1,26 @@ -const Compiler = require('../../../../lib/Compiler'); +const Compiler = require("../../../../").Compiler; +/** @type {import("../../../../").Configuration} */ module.exports = { optimization: { minimize: true, minimizer: [ { + /** + * @param {Compiler} compiler the compiler + */ apply(compiler) { expect(compiler).toBeInstanceOf(Compiler); - }, + } }, - function(compiler) { + /** + * @this {Compiler} the compiler + * @param {Compiler} compiler the compiler + */ + function (compiler) { expect(compiler).toBe(this); expect(compiler).toBeInstanceOf(Compiler); } - ], - }, + ] + } }; diff --git a/test/configCases/optimization/named-modules/webpack.config.js b/test/configCases/optimization/named-modules/webpack.config.js index 10572c1da34..15fb81f1bc4 100644 --- a/test/configCases/optimization/named-modules/webpack.config.js +++ b/test/configCases/optimization/named-modules/webpack.config.js @@ -1,5 +1,6 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { optimization: { - namedModules: true + moduleIds: "named" } }; diff --git a/test/configCases/optimization/runtime-specific-used-exports/a.js b/test/configCases/optimization/runtime-specific-used-exports/a.js new file mode 100644 index 00000000000..ea6b7912318 --- /dev/null +++ b/test/configCases/optimization/runtime-specific-used-exports/a.js @@ -0,0 +1,53 @@ +import { x, xUsed, yUsed } from "./module"; +import { x as xRe, xUsed as xUsedRe, yUsed as yUsedRe } from "./reexport"; +import importDx from "./dx-importer"; + +it("should use only one export", () => { + expect(x).toBe("x"); + expect(xUsed).toBe(true); + expect(yUsed).toBe(false); +}); + +it("should use only one export when reexported", () => { + expect(xRe).toBe("x"); + expect(xUsedRe).toBe(true); + expect(yUsedRe).toBe(false); +}); + +it("should optimize shared chunks correctly", async () => { + const dx = await importDx(); // this will contain module with all exports + const dy = await import("./dy"); // this will contain module only with w, x and y exports + const dw = await import("./dw"); // this will contain module only with w, x and y exports + // As dx was loaded first, we get the module will all exports + const identity = dx.identity; + expect(dx).toEqual( + nsObj({ + x: "x", + wUsed: true, + xUsed: true, + yUsed: true, + zUsed: true, + identity + }) + ); + expect(dy).toEqual( + nsObj({ + y: "y", + wUsed: true, + xUsed: true, + yUsed: true, + zUsed: true, + identity + }) + ); + expect(dw).toEqual( + nsObj({ + w: "w", + wUsed: true, + xUsed: true, + yUsed: true, + zUsed: true, + identity + }) + ); +}); diff --git a/test/configCases/optimization/runtime-specific-used-exports/b.js b/test/configCases/optimization/runtime-specific-used-exports/b.js new file mode 100644 index 00000000000..cb9804cc131 --- /dev/null +++ b/test/configCases/optimization/runtime-specific-used-exports/b.js @@ -0,0 +1,53 @@ +import { y, xUsed, yUsed } from "./module"; +import { y as yRe, xUsed as xUsedRe, yUsed as yUsedRe } from "./reexport"; +import importDx from "./dx-importer"; + +it("should use only one export", () => { + expect(y).toBe("y"); + expect(yUsed).toBe(true); + expect(xUsed).toBe(false); +}); + +it("should use only one export when reexported", () => { + expect(yRe).toBe("y"); + expect(yUsedRe).toBe(true); + expect(xUsedRe).toBe(false); +}); + +it("should optimize shared chunks correctly", async () => { + const dz = await import("./dz"); // this will contain module only with w, x and z exports + const dx = await importDx(); // this will contain module with all exports + const dw = await import("./dw"); // this will contain module only with w, x and z exports + // As dz was loaded first, we get the module will only w, x and z exports + const identity = dx.identity; + expect(dx).toEqual( + nsObj({ + x: "x", + wUsed: true, + xUsed: true, + yUsed: false, + zUsed: true, + identity + }) + ); + expect(dz).toEqual( + nsObj({ + z: "z", + wUsed: true, + xUsed: true, + yUsed: false, + zUsed: true, + identity + }) + ); + expect(dw).toEqual( + nsObj({ + w: "w", + wUsed: true, + xUsed: true, + yUsed: false, + zUsed: true, + identity + }) + ); +}); diff --git a/test/configCases/optimization/runtime-specific-used-exports/c.js b/test/configCases/optimization/runtime-specific-used-exports/c.js new file mode 100644 index 00000000000..c19b06964ee --- /dev/null +++ b/test/configCases/optimization/runtime-specific-used-exports/c.js @@ -0,0 +1 @@ +it("should also be here", () => {}); diff --git a/test/configCases/optimization/runtime-specific-used-exports/dw.js b/test/configCases/optimization/runtime-specific-used-exports/dw.js new file mode 100644 index 00000000000..cb05a0125ef --- /dev/null +++ b/test/configCases/optimization/runtime-specific-used-exports/dw.js @@ -0,0 +1 @@ +export { w, wUsed, xUsed, yUsed, zUsed, identity } from "./module?chunk"; diff --git a/test/configCases/optimization/runtime-specific-used-exports/dx-importer.js b/test/configCases/optimization/runtime-specific-used-exports/dx-importer.js new file mode 100644 index 00000000000..4efca616142 --- /dev/null +++ b/test/configCases/optimization/runtime-specific-used-exports/dx-importer.js @@ -0,0 +1,3 @@ +export default function importDx() { + return import("./dx"); +} diff --git a/test/configCases/optimization/runtime-specific-used-exports/dx.js b/test/configCases/optimization/runtime-specific-used-exports/dx.js new file mode 100644 index 00000000000..c3abdf0fd79 --- /dev/null +++ b/test/configCases/optimization/runtime-specific-used-exports/dx.js @@ -0,0 +1 @@ +export { x, wUsed, xUsed, yUsed, zUsed, identity } from "./module?chunk"; diff --git a/test/configCases/optimization/runtime-specific-used-exports/dy.js b/test/configCases/optimization/runtime-specific-used-exports/dy.js new file mode 100644 index 00000000000..096fea65553 --- /dev/null +++ b/test/configCases/optimization/runtime-specific-used-exports/dy.js @@ -0,0 +1 @@ +export { y, wUsed, xUsed, yUsed, zUsed, identity } from "./module?chunk"; diff --git a/test/configCases/optimization/runtime-specific-used-exports/dz.js b/test/configCases/optimization/runtime-specific-used-exports/dz.js new file mode 100644 index 00000000000..63e65be0f58 --- /dev/null +++ b/test/configCases/optimization/runtime-specific-used-exports/dz.js @@ -0,0 +1 @@ +export { z, wUsed, xUsed, yUsed, zUsed, identity } from "./module?chunk"; diff --git a/test/configCases/optimization/runtime-specific-used-exports/module.js b/test/configCases/optimization/runtime-specific-used-exports/module.js new file mode 100644 index 00000000000..d3c2767a853 --- /dev/null +++ b/test/configCases/optimization/runtime-specific-used-exports/module.js @@ -0,0 +1,9 @@ +export const w = "w"; +export const x = "x"; +export const y = "y"; +export const z = "z"; +export const wUsed = __webpack_exports_info__.w.used; +export const xUsed = __webpack_exports_info__.x.used; +export const yUsed = __webpack_exports_info__.y.used; +export const zUsed = __webpack_exports_info__.z.used; +export const identity = Symbol(); diff --git a/test/configCases/optimization/runtime-specific-used-exports/reexport.js b/test/configCases/optimization/runtime-specific-used-exports/reexport.js new file mode 100644 index 00000000000..c497efb280f --- /dev/null +++ b/test/configCases/optimization/runtime-specific-used-exports/reexport.js @@ -0,0 +1 @@ +export * from "./module?reexported"; diff --git a/test/configCases/optimization/runtime-specific-used-exports/test.config.js b/test/configCases/optimization/runtime-specific-used-exports/test.config.js new file mode 100644 index 00000000000..212b2e5fc13 --- /dev/null +++ b/test/configCases/optimization/runtime-specific-used-exports/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./a.js", "./b.js"]; + } +}; diff --git a/test/configCases/optimization/runtime-specific-used-exports/webpack.config.js b/test/configCases/optimization/runtime-specific-used-exports/webpack.config.js new file mode 100644 index 00000000000..6cf012a34b1 --- /dev/null +++ b/test/configCases/optimization/runtime-specific-used-exports/webpack.config.js @@ -0,0 +1,14 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + filename: "[name].js" + }, + optimization: { + chunkIds: "named" + }, + entry: { + a: "./a", + b: "./b", + c: "./c" + } +}; diff --git a/test/configCases/optimization/runtime-specific-used-exports2/1.js b/test/configCases/optimization/runtime-specific-used-exports2/1.js new file mode 100644 index 00000000000..49b9fffd894 --- /dev/null +++ b/test/configCases/optimization/runtime-specific-used-exports2/1.js @@ -0,0 +1,26 @@ +import { + e, + _1 +} from "./path1"; +import { + aUsed, + bUsed, + cUsed +} from "root1"; +import { + dUsed, + eUsed, + fUsed +} from "root2"; + +it("should use only current entrypoint exports", () => { + expect(e).toBe("e"); + expect(_1.a).toBe("a"); + expect(_1.c).toBe("c"); + expect(aUsed).toBe(true); + expect(bUsed).toBe(false); + expect(cUsed).toBe(true); + expect(dUsed).toBe(false); + expect(eUsed).toBe(true); + expect(fUsed).toBe(false); +}); diff --git a/test/configCases/optimization/runtime-specific-used-exports2/2.js b/test/configCases/optimization/runtime-specific-used-exports2/2.js new file mode 100644 index 00000000000..2c2d207303e --- /dev/null +++ b/test/configCases/optimization/runtime-specific-used-exports2/2.js @@ -0,0 +1,40 @@ +import { + b, + _2 +} from "./path2"; +import { + aUsed, + bUsed, + cUsed +} from "root1"; +import { + dUsed, + eUsed, + fUsed +} from "root2"; +import {addFiles, isSame} from "./helper"; + +// should be the same as 3.js and reuse defaultVendors +it("should use only current entrypoint exports", () => { + expect(b).toBe("b"); + expect(_2.f).toBe("f"); + expect(aUsed).toBe(false); + expect(bUsed).toBe(true); + expect(cUsed).toBe(false); + expect(dUsed).toBe(false); + expect(eUsed).toBe(false); + expect(fUsed).toBe(true); + + const files = new Set(); + + addFiles( + files, + __STATS__.chunks.filter(ch => isSame(ch.runtime, ["b"])) + ); + addFiles( + files, + __STATS__.chunks.filter(ch => isSame(ch.runtime, ["b", "c"])) + ); + + expect(files.size).toBe(2); +}); diff --git a/test/configCases/optimization/runtime-specific-used-exports2/3.js b/test/configCases/optimization/runtime-specific-used-exports2/3.js new file mode 100644 index 00000000000..04c6871b6fa --- /dev/null +++ b/test/configCases/optimization/runtime-specific-used-exports2/3.js @@ -0,0 +1,40 @@ +import { + b, + _2 +} from "./path2"; +import { + aUsed, + bUsed, + cUsed +} from "root1"; +import { + dUsed, + eUsed, + fUsed +} from "root2"; +import { addFiles, isSame } from "./helper"; + +// should be the same as 2.js and reuse defaultVendors +it("should use only current entrypoint exports", () => { + expect(b).toBe("b"); + expect(_2.f).toBe("f"); + expect(aUsed).toBe(false); + expect(bUsed).toBe(true); + expect(cUsed).toBe(false); + expect(dUsed).toBe(false); + expect(eUsed).toBe(false); + expect(fUsed).toBe(true); + + const files = new Set(); + + addFiles( + files, + __STATS__.chunks.filter(ch => isSame(ch.runtime, ["c"])) + ); + addFiles( + files, + __STATS__.chunks.filter(ch => isSame(ch.runtime, ["b", "c"])) + ); + + expect(files.size).toBe(2); +}); diff --git a/test/configCases/optimization/runtime-specific-used-exports2/helper.js b/test/configCases/optimization/runtime-specific-used-exports2/helper.js new file mode 100644 index 00000000000..0263269dfa5 --- /dev/null +++ b/test/configCases/optimization/runtime-specific-used-exports2/helper.js @@ -0,0 +1,18 @@ +/** + * @template T + * @param {T[]} arr arr + * @param {T[]} expected expected + * @returns {boolean} is same + */ +export function isSame(arr, expected) { + const set = new Set(arr); + return expected.every(i => set.has(i)); +} + +/** + * @param {Set} files + * @param {{files: string[]}[]} chunks + */ +export function addFiles(files, chunks) { + chunks.forEach(ch => ch.files.forEach(f => files.add(f))); +} diff --git a/test/configCases/optimization/runtime-specific-used-exports2/node_modules/root1/index.js b/test/configCases/optimization/runtime-specific-used-exports2/node_modules/root1/index.js new file mode 100644 index 00000000000..7d4533e46be --- /dev/null +++ b/test/configCases/optimization/runtime-specific-used-exports2/node_modules/root1/index.js @@ -0,0 +1,6 @@ +export const a = "a"; +export const b = "b"; +export const c = "c"; +export const aUsed = __webpack_exports_info__.a.used; +export const bUsed = __webpack_exports_info__.b.used; +export const cUsed = __webpack_exports_info__.c.used; diff --git a/test/configCases/optimization/runtime-specific-used-exports2/node_modules/root2/index.js b/test/configCases/optimization/runtime-specific-used-exports2/node_modules/root2/index.js new file mode 100644 index 00000000000..524350cd31b --- /dev/null +++ b/test/configCases/optimization/runtime-specific-used-exports2/node_modules/root2/index.js @@ -0,0 +1,6 @@ +export const d = "d"; +export const e = "e"; +export const f = "f"; +export const dUsed = __webpack_exports_info__.d.used; +export const eUsed = __webpack_exports_info__.e.used; +export const fUsed = __webpack_exports_info__.f.used; diff --git a/test/configCases/optimization/runtime-specific-used-exports2/path1.js b/test/configCases/optimization/runtime-specific-used-exports2/path1.js new file mode 100644 index 00000000000..9ba7bd7c36e --- /dev/null +++ b/test/configCases/optimization/runtime-specific-used-exports2/path1.js @@ -0,0 +1,4 @@ +import { _1, _2 } from "./reexport-all"; +import { e, d } from "root2"; + +export { _1, e }; diff --git a/test/configCases/optimization/runtime-specific-used-exports2/path2.js b/test/configCases/optimization/runtime-specific-used-exports2/path2.js new file mode 100644 index 00000000000..37dcfbbddf0 --- /dev/null +++ b/test/configCases/optimization/runtime-specific-used-exports2/path2.js @@ -0,0 +1,6 @@ +import { _1 } from "./path1"; +import { _2 } from "./reexport-all"; + +const b = _1.b; + +export { b, _2 } diff --git a/test/configCases/optimization/runtime-specific-used-exports2/reexport-all.js b/test/configCases/optimization/runtime-specific-used-exports2/reexport-all.js new file mode 100644 index 00000000000..4ef0128938e --- /dev/null +++ b/test/configCases/optimization/runtime-specific-used-exports2/reexport-all.js @@ -0,0 +1,2 @@ +export * as _1 from "root1"; +export * as _2 from "root2"; diff --git a/test/configCases/optimization/runtime-specific-used-exports2/test.config.js b/test/configCases/optimization/runtime-specific-used-exports2/test.config.js new file mode 100644 index 00000000000..322f05c6b70 --- /dev/null +++ b/test/configCases/optimization/runtime-specific-used-exports2/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./a.js", "./b.js", "./c.js"]; + } +}; diff --git a/test/configCases/optimization/runtime-specific-used-exports2/webpack.config.js b/test/configCases/optimization/runtime-specific-used-exports2/webpack.config.js new file mode 100644 index 00000000000..c15fc77a848 --- /dev/null +++ b/test/configCases/optimization/runtime-specific-used-exports2/webpack.config.js @@ -0,0 +1,24 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + filename: "[name].js" + }, + target: "node", + optimization: { + chunkIds: "named", + splitChunks: { + chunks: "all", + cacheGroups: { + defaultVendors: { + test: /[\\/]node_modules[\\/]/, + enforce: true + } + } + } + }, + entry: { + a: "./1", + b: "./2", + c: "./3" + } +}; diff --git a/test/configCases/output-module/check-defaults/errors.js b/test/configCases/output-module/check-defaults/errors.js new file mode 100644 index 00000000000..1d4e2ba0129 --- /dev/null +++ b/test/configCases/output-module/check-defaults/errors.js @@ -0,0 +1,3 @@ +module.exports = [ + [/For the selected environment is no default ESM chunk format available/] +]; diff --git a/test/configCases/output-module/check-defaults/index.js b/test/configCases/output-module/check-defaults/index.js new file mode 100644 index 00000000000..3cd08c4fc92 --- /dev/null +++ b/test/configCases/output-module/check-defaults/index.js @@ -0,0 +1,3 @@ +it("should compile and run", () => { + expect(import.meta.url).toBe(import.meta.url); +}); diff --git a/test/configCases/output-module/check-defaults/test.filter.js b/test/configCases/output-module/check-defaults/test.filter.js new file mode 100644 index 00000000000..d5852188b3e --- /dev/null +++ b/test/configCases/output-module/check-defaults/test.filter.js @@ -0,0 +1 @@ +module.exports = config => !config.cache; diff --git a/test/configCases/output-module/check-defaults/webpack.config.js b/test/configCases/output-module/check-defaults/webpack.config.js new file mode 100644 index 00000000000..d45f42ed855 --- /dev/null +++ b/test/configCases/output-module/check-defaults/webpack.config.js @@ -0,0 +1,17 @@ +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + experiments: { + outputModule: true + }, + devtool: false, + target: "web" + }, + { + experiments: { + outputModule: true + }, + devtool: false, + target: "node10" + } +]; diff --git a/test/configCases/output-module/chunk-format-fallback/dep.js b/test/configCases/output-module/chunk-format-fallback/dep.js new file mode 100644 index 00000000000..6120538c7f3 --- /dev/null +++ b/test/configCases/output-module/chunk-format-fallback/dep.js @@ -0,0 +1 @@ +export const main = 'MAIN'; diff --git a/test/configCases/output-module/chunk-format-fallback/index.js b/test/configCases/output-module/chunk-format-fallback/index.js new file mode 100644 index 00000000000..4017169c6ea --- /dev/null +++ b/test/configCases/output-module/chunk-format-fallback/index.js @@ -0,0 +1,5 @@ +import { main } from "./dep.js"; + +it("should work by default", () => { + expect(main).toBe("MAIN"); +}); diff --git a/test/configCases/output-module/chunk-format-fallback/test.config.js b/test/configCases/output-module/chunk-format-fallback/test.config.js new file mode 100644 index 00000000000..051597fef8f --- /dev/null +++ b/test/configCases/output-module/chunk-format-fallback/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["runtime.mjs", "./main.mjs"]; + } +}; diff --git a/test/configCases/output-module/chunk-format-fallback/webpack.config.js b/test/configCases/output-module/chunk-format-fallback/webpack.config.js new file mode 100644 index 00000000000..5d5fc00fa01 --- /dev/null +++ b/test/configCases/output-module/chunk-format-fallback/webpack.config.js @@ -0,0 +1,20 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + main: { + import: "./index.js", + library: { type: "module" } + } + }, + output: { + filename: "[name].mjs" + }, + optimization: { + runtimeChunk: "single" + }, + experiments: { + outputModule: true + }, + mode: "development", + devtool: false +}; diff --git a/test/configCases/output-module/iife-entry-module-with-others/index.js b/test/configCases/output-module/iife-entry-module-with-others/index.js new file mode 100644 index 00000000000..f046f5e3cbe --- /dev/null +++ b/test/configCases/output-module/iife-entry-module-with-others/index.js @@ -0,0 +1,25 @@ +import { value as value1 } from './module1' +const value2 = require('./module2') +const value3 = require('./module3') +const value4 = require('./module4') + +let value = 42 +let src_value = 43 +let src_src_value = 44 +let Symbol = 'Symbol' + +it('inlined module should not leak to non-inlined modules', () => { + // The two variables are in nested scope and could be the candidate names for inline module during renaming. + // The renaming logic should detect them and bypass to avoid the collisions. + const index_src_value = -1 + const index_src_value_0 = -1 + + expect(value1).toBe(undefined) + expect(value).toBe(42) + expect(src_value).toBe(43) + expect(src_src_value).toBe(44) + expect(Symbol).toBe('Symbol') + expect(value2).toBe("undefined") // Should not touch `value` variable in inline module. + expect(value3).toBe("undefined") // Should not touch src_value` in inline module. + expect(value4).toBe("function") // Module variables in inline module should not shadowling global variables. +}) diff --git a/test/configCases/output-module/iife-entry-module-with-others/module1.js b/test/configCases/output-module/iife-entry-module-with-others/module1.js new file mode 100644 index 00000000000..96539a70735 --- /dev/null +++ b/test/configCases/output-module/iife-entry-module-with-others/module1.js @@ -0,0 +1,3 @@ +let value + +export { value } diff --git a/test/configCases/output-module/iife-entry-module-with-others/module2.js b/test/configCases/output-module/iife-entry-module-with-others/module2.js new file mode 100644 index 00000000000..28cbf2cc962 --- /dev/null +++ b/test/configCases/output-module/iife-entry-module-with-others/module2.js @@ -0,0 +1 @@ +module.exports = typeof value diff --git a/test/configCases/output-module/iife-entry-module-with-others/module3.js b/test/configCases/output-module/iife-entry-module-with-others/module3.js new file mode 100644 index 00000000000..bb38a0e4ad7 --- /dev/null +++ b/test/configCases/output-module/iife-entry-module-with-others/module3.js @@ -0,0 +1 @@ +module.exports = typeof src_value diff --git a/test/configCases/output-module/iife-entry-module-with-others/module4.js b/test/configCases/output-module/iife-entry-module-with-others/module4.js new file mode 100644 index 00000000000..2d1c8a798ac --- /dev/null +++ b/test/configCases/output-module/iife-entry-module-with-others/module4.js @@ -0,0 +1 @@ +module.exports = typeof Symbol diff --git a/test/configCases/output-module/iife-entry-module-with-others/test.config.js b/test/configCases/output-module/iife-entry-module-with-others/test.config.js new file mode 100644 index 00000000000..b0ea3b44c52 --- /dev/null +++ b/test/configCases/output-module/iife-entry-module-with-others/test.config.js @@ -0,0 +1,9 @@ +module.exports = { + findBundle(i, options) { + return [ + "module-avoidEntryIife-false.mjs", + "module-avoidEntryIife-true.mjs", + "test.js" + ]; + } +}; diff --git a/test/configCases/output-module/iife-entry-module-with-others/test.js b/test/configCases/output-module/iife-entry-module-with-others/test.js new file mode 100644 index 00000000000..1bcf1bb48d2 --- /dev/null +++ b/test/configCases/output-module/iife-entry-module-with-others/test.js @@ -0,0 +1,9 @@ +const fs = require("fs"); +const path = require("path"); + +it("IIFE should present when `avoidEntryIife` is disabled, and avoided when true", () => { + const trueSource = fs.readFileSync(path.join(__dirname, "module-avoidEntryIife-true.mjs"), "utf-8"); + const falseSource = fs.readFileSync(path.join(__dirname, "module-avoidEntryIife-false.mjs"), "utf-8"); + expect(trueSource).not.toContain('This entry needs to be wrapped in an IIFE'); + expect(falseSource).toContain('This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk.'); +}); diff --git a/test/configCases/output-module/iife-entry-module-with-others/webpack.config.js b/test/configCases/output-module/iife-entry-module-with-others/webpack.config.js new file mode 100644 index 00000000000..5d6eccc0d55 --- /dev/null +++ b/test/configCases/output-module/iife-entry-module-with-others/webpack.config.js @@ -0,0 +1,46 @@ +/** @type {import("../../../../types").Configuration} */ +const base = { + output: { + module: true + }, + optimization: { + concatenateModules: true + }, + experiments: { + outputModule: true + }, + target: "es2020" +}; + +/** @type {import("../../../../types").Configuration[]} */ +module.exports = [ + { + ...base, + name: "module-avoidEntryIife-false", + output: { + filename: "module-avoidEntryIife-false.mjs" + }, + optimization: { + ...base.optimization, + avoidEntryIife: false + } + }, + { + ...base, + name: "module-avoidEntryIife-true", + output: { + filename: "module-avoidEntryIife-true.mjs" + }, + optimization: { + ...base.optimization, + avoidEntryIife: true + } + }, + { + name: "test-output", + entry: "./test.js", + output: { + filename: "test.js" + } + } +]; diff --git a/test/configCases/output-module/iife-innter-strict/foo.cjs b/test/configCases/output-module/iife-innter-strict/foo.cjs new file mode 100644 index 00000000000..888cae37af9 --- /dev/null +++ b/test/configCases/output-module/iife-innter-strict/foo.cjs @@ -0,0 +1 @@ +module.exports = 42; diff --git a/test/configCases/output-module/iife-innter-strict/index.mjs b/test/configCases/output-module/iife-innter-strict/index.mjs new file mode 100644 index 00000000000..f297ceac9b3 --- /dev/null +++ b/test/configCases/output-module/iife-innter-strict/index.mjs @@ -0,0 +1,14 @@ +import foo from './foo.cjs'; + +let answer + +try { + delete Object.prototype; // will throw error in strict mode + answer = 'no'; + } catch { + answer = 'yes'; +} + +it("multiple inlined modules should be wrapped in IIFE to isolate from other inlined modules and chunk modules", () => { + expect(answer).toBe("yes"); // the code should throw in strict mode +}); diff --git a/test/configCases/output-module/iife-innter-strict/test.config.js b/test/configCases/output-module/iife-innter-strict/test.config.js new file mode 100644 index 00000000000..32f4be1d473 --- /dev/null +++ b/test/configCases/output-module/iife-innter-strict/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["test.js"]; + } +}; diff --git a/test/configCases/output-module/iife-innter-strict/test.js b/test/configCases/output-module/iife-innter-strict/test.js new file mode 100644 index 00000000000..b438ba926ff --- /dev/null +++ b/test/configCases/output-module/iife-innter-strict/test.js @@ -0,0 +1,7 @@ +const fs = require("fs"); +const path = require("path"); + +it("IIFE should present for inner strict", () => { + const source = fs.readFileSync(path.join(__dirname, "bundle0.js"), "utf-8"); + expect(source).toContain(`This entry needs to be wrapped in an IIFE because it needs to be in strict mode.`); +}); diff --git a/test/configCases/output-module/iife-innter-strict/webpack.config.js b/test/configCases/output-module/iife-innter-strict/webpack.config.js new file mode 100644 index 00000000000..a5d002ed82f --- /dev/null +++ b/test/configCases/output-module/iife-innter-strict/webpack.config.js @@ -0,0 +1,16 @@ +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + entry: ["./index.mjs"], + output: { + module: false + } + }, + { + name: "test-output", + entry: "./test.js", + output: { + filename: "test.js" + } + } +]; diff --git a/test/configCases/output-module/iife-multiple-entry-modules/index1.js b/test/configCases/output-module/iife-multiple-entry-modules/index1.js new file mode 100644 index 00000000000..44439901e78 --- /dev/null +++ b/test/configCases/output-module/iife-multiple-entry-modules/index1.js @@ -0,0 +1,4 @@ + + it("multiple inlined modules should be wrapped in IIFE to isolate from other inlined modules and chunk modules", () => { + expect(typeof value).toBe("undefined"); // `value` in index2 should not leak to index1 +}); diff --git a/test/configCases/output-module/iife-multiple-entry-modules/index2.js b/test/configCases/output-module/iife-multiple-entry-modules/index2.js new file mode 100644 index 00000000000..e43b1bb2309 --- /dev/null +++ b/test/configCases/output-module/iife-multiple-entry-modules/index2.js @@ -0,0 +1 @@ +var value = 42 diff --git a/test/configCases/output-module/iife-multiple-entry-modules/test.config.js b/test/configCases/output-module/iife-multiple-entry-modules/test.config.js new file mode 100644 index 00000000000..5e7f742d6f5 --- /dev/null +++ b/test/configCases/output-module/iife-multiple-entry-modules/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["bundle0.mjs", "test.js"]; + } +}; diff --git a/test/configCases/output-module/iife-multiple-entry-modules/test.js b/test/configCases/output-module/iife-multiple-entry-modules/test.js new file mode 100644 index 00000000000..3e8c37be198 --- /dev/null +++ b/test/configCases/output-module/iife-multiple-entry-modules/test.js @@ -0,0 +1,7 @@ +const fs = require("fs"); +const path = require("path"); + +it("IIFE should present for multiple entires", () => { + const source = fs.readFileSync(path.join(__dirname, "bundle0.mjs"), "utf-8"); + expect(source).toContain(`This entry needs to be wrapped in an IIFE because it needs to be isolated against other entry modules.`); +}); diff --git a/test/configCases/output-module/iife-multiple-entry-modules/webpack.config.js b/test/configCases/output-module/iife-multiple-entry-modules/webpack.config.js new file mode 100644 index 00000000000..ee452f23242 --- /dev/null +++ b/test/configCases/output-module/iife-multiple-entry-modules/webpack.config.js @@ -0,0 +1,23 @@ +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + entry: ["./index1.js", "./index2.js"], + output: { + module: true + }, + optimization: { + concatenateModules: true + }, + experiments: { + outputModule: true + }, + target: "es2020" + }, + { + name: "test-output", + entry: "./test.js", + output: { + filename: "test.js" + } + } +]; diff --git a/test/configCases/output-module/issue-16040/bar.css b/test/configCases/output-module/issue-16040/bar.css new file mode 100644 index 00000000000..66d9575715c --- /dev/null +++ b/test/configCases/output-module/issue-16040/bar.css @@ -0,0 +1,3 @@ +.bar { + color: #fff; +} diff --git a/test/configCases/output-module/issue-16040/bar.js b/test/configCases/output-module/issue-16040/bar.js new file mode 100644 index 00000000000..cce1f49a437 --- /dev/null +++ b/test/configCases/output-module/issue-16040/bar.js @@ -0,0 +1,7 @@ +import { countBy } from "lodash-es"; + +import "./bar.css"; + +const result = countBy([6.1, 4.2, 6.3], Math.floor); + +export default result["6"]; diff --git a/test/configCases/output-module/issue-16040/foo.css b/test/configCases/output-module/issue-16040/foo.css new file mode 100644 index 00000000000..33a418a59a8 --- /dev/null +++ b/test/configCases/output-module/issue-16040/foo.css @@ -0,0 +1,3 @@ +.foo { + color: #fff; +} diff --git a/test/configCases/output-module/issue-16040/foo.js b/test/configCases/output-module/issue-16040/foo.js new file mode 100644 index 00000000000..dd96b964c76 --- /dev/null +++ b/test/configCases/output-module/issue-16040/foo.js @@ -0,0 +1,7 @@ +import { dropRight } from "lodash-es"; + +import "./foo.css"; + +const result = dropRight([10, 20, 30], 2); + +export default result[0]; diff --git a/test/configCases/output-module/issue-16040/index.js b/test/configCases/output-module/issue-16040/index.js new file mode 100644 index 00000000000..da656cdd0f0 --- /dev/null +++ b/test/configCases/output-module/issue-16040/index.js @@ -0,0 +1,14 @@ +import foo from "./foo.js"; +import bar from "./bar.js"; + +it("should not contain non javascript chunk in the main bundle", () => { + const fs = require("fs"); + const source = fs.readFileSync(__STATS__.outputPath + "/main.mjs", "utf-8"); + + expect(__STATS__.chunks.some(c => c.names.includes("style"))).toBe(true); + // Should not import "./style.mjs";` + expect(source).not.toMatch( + /import\s\*\sas+\s__webpack_chunk_[0-9]+__\sfrom\s"\.\/style\.mjs"/g + ); + expect(foo + bar).toBe(12); +}); diff --git a/test/configCases/output-module/issue-16040/test.config.js b/test/configCases/output-module/issue-16040/test.config.js new file mode 100644 index 00000000000..15fd839d728 --- /dev/null +++ b/test/configCases/output-module/issue-16040/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["main.mjs", "vendor.mjs", "runtime.mjs"]; + } +}; diff --git a/test/configCases/output-module/issue-16040/test.filter.js b/test/configCases/output-module/issue-16040/test.filter.js new file mode 100644 index 00000000000..0d61a0f0807 --- /dev/null +++ b/test/configCases/output-module/issue-16040/test.filter.js @@ -0,0 +1,3 @@ +const supportsRequireInModule = require("../../../helpers/supportsRequireInModule"); + +module.exports = () => supportsRequireInModule(); diff --git a/test/configCases/output-module/issue-16040/webpack.config.js b/test/configCases/output-module/issue-16040/webpack.config.js new file mode 100644 index 00000000000..275e36a5232 --- /dev/null +++ b/test/configCases/output-module/issue-16040/webpack.config.js @@ -0,0 +1,77 @@ +const MiniCssExtractPlugin = require("mini-css-extract-plugin"); + +module.exports = { + mode: "production", + devtool: false, + experiments: { + outputModule: true + }, + output: { + publicPath: "/", + filename: "[name].mjs", + chunkFilename: "[name].chunk.js", + assetModuleFilename: "[hash][ext][query]", + module: true, + libraryTarget: "module", + chunkFormat: "module", + chunkLoading: "import", + environment: { + dynamicImport: true, + module: true + } + }, + + module: { + rules: [ + { + test: /\.css$/i, + use: [MiniCssExtractPlugin.loader, "css-loader"] + } + ] + }, + + plugins: [ + new MiniCssExtractPlugin({ + filename: "style.css", + chunkFilename: "[id].css" + }) + ], + + optimization: { + splitChunks: { + chunks: "all", + + cacheGroups: { + style: { + name: "style", + type: "css/mini-extract", + chunks: "all", + enforce: true + }, + + defaultVendors: { + name: "vendor", + test: /[\\/]node_modules[\\/]/, + priority: -10, + chunks: "initial", + reuseExistingChunk: true + }, + + default: { + minChunks: 2, + priority: -20, + reuseExistingChunk: true + } + } + }, + + runtimeChunk: { + name: "runtime" + }, + + // currently Webpack has bugs when setting concatenateModules to true while produce ES Module output. + // concatenateModules: false, + + minimize: false + } +}; diff --git a/test/configCases/output-module/node-globals/cjs/file.js b/test/configCases/output-module/node-globals/cjs/file.js new file mode 100644 index 00000000000..be625d98678 --- /dev/null +++ b/test/configCases/output-module/node-globals/cjs/file.js @@ -0,0 +1,6 @@ +const fileURLToPath = ""; +const file = __filename; +const dir = __dirname; +const dir2 = `${__dirname}/`; + +module.exports = { file, dir, dir2 }; diff --git a/test/configCases/output-module/node-globals/cjs/package.json b/test/configCases/output-module/node-globals/cjs/package.json new file mode 100644 index 00000000000..ea5acf78f52 --- /dev/null +++ b/test/configCases/output-module/node-globals/cjs/package.json @@ -0,0 +1,4 @@ +{ + "name": "cjs", + "type": "commonjs" +} diff --git a/test/configCases/output-module/node-globals/index.js b/test/configCases/output-module/node-globals/index.js new file mode 100644 index 00000000000..350b3ba69bd --- /dev/null +++ b/test/configCases/output-module/node-globals/index.js @@ -0,0 +1,10 @@ +import { dir, dir2, file } from './cjs/file.js' + +it("should generate correct __dirname", () => { + expect(dir).toMatch(/[\\/]node-globals$/); + expect(dir2).toMatch(/[\\/]node-globals\/$/); +}); + +it("should generate correct __filename", () => { + expect(file).toMatch(/[\\/]main.mjs$/); +}); diff --git a/test/configCases/output-module/node-globals/test.config.js b/test/configCases/output-module/node-globals/test.config.js new file mode 100644 index 00000000000..1192a7afc60 --- /dev/null +++ b/test/configCases/output-module/node-globals/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return "./main.mjs"; + } +}; diff --git a/test/configCases/output-module/node-globals/webpack.config.js b/test/configCases/output-module/node-globals/webpack.config.js new file mode 100644 index 00000000000..aac123421e6 --- /dev/null +++ b/test/configCases/output-module/node-globals/webpack.config.js @@ -0,0 +1,14 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + main: "./index.js" + }, + output: { + filename: "[name].mjs", + module: true + }, + experiments: { + outputModule: true + }, + target: "node14" +}; diff --git a/test/configCases/output-module/non-webpack-require/baz.js b/test/configCases/output-module/non-webpack-require/baz.js new file mode 100644 index 00000000000..ab1913ce984 --- /dev/null +++ b/test/configCases/output-module/non-webpack-require/baz.js @@ -0,0 +1 @@ +export default "baz module text"; diff --git a/test/configCases/output-module/non-webpack-require/index.js b/test/configCases/output-module/non-webpack-require/index.js new file mode 100644 index 00000000000..79e36df4e9f --- /dev/null +++ b/test/configCases/output-module/non-webpack-require/index.js @@ -0,0 +1,16 @@ +import { createRequire as func_create_require, builtinModules as builtin } from "module"; +import external from "external-module"; +import externalOther from "external-other-module"; +import baz from "./baz.js"; + +it("should work with __non_webpack_require__ and ES modules", function () { + const foo = __non_webpack_require__("./mod.js"); + + expect(foo).toBe("module text"); + expect(external).toBe("external module text"); + expect(externalOther).toBe("external module text"); + expect(baz).toBe("baz module text"); + expect(typeof func_create_require).toBe("function"); + expect(func_create_require(import.meta.url)("./mod.js")).toBe("module text"); + expect(typeof builtin).toBe("object") +}); diff --git a/test/configCases/output-module/non-webpack-require/mod.js b/test/configCases/output-module/non-webpack-require/mod.js new file mode 100644 index 00000000000..af5c7eea34c --- /dev/null +++ b/test/configCases/output-module/non-webpack-require/mod.js @@ -0,0 +1 @@ +module.exports = "module text"; diff --git a/test/configCases/output-module/non-webpack-require/test.filter.js b/test/configCases/output-module/non-webpack-require/test.filter.js new file mode 100644 index 00000000000..0d61a0f0807 --- /dev/null +++ b/test/configCases/output-module/non-webpack-require/test.filter.js @@ -0,0 +1,3 @@ +const supportsRequireInModule = require("../../../helpers/supportsRequireInModule"); + +module.exports = () => supportsRequireInModule(); diff --git a/test/configCases/output-module/non-webpack-require/webpack.config.js b/test/configCases/output-module/non-webpack-require/webpack.config.js new file mode 100644 index 00000000000..22f06b6ee95 --- /dev/null +++ b/test/configCases/output-module/non-webpack-require/webpack.config.js @@ -0,0 +1,58 @@ +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: ["node", "es2020"], + experiments: { + outputModule: true + }, + output: { + module: true, + iife: true + }, + externals: { + "external-module": "node-commonjs external-module", + "external-other-module": ["node-commonjs external-module"] + }, + optimization: { + concatenateModules: false + }, + plugins: [ + { + apply(compiler) { + compiler.hooks.compilation.tap("Test", compilation => { + compilation.hooks.processAssets.tap( + { + name: "copy-webpack-plugin", + stage: + compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL + }, + () => { + compilation.emitAsset( + "mod.js", + new webpack.sources.RawSource( + "module.exports = 'module text';\n" + ) + ); + } + ); + compilation.hooks.processAssets.tap( + { + name: "copy-webpack-plugin", + stage: + compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL + }, + () => { + compilation.emitAsset( + "node_modules/external-module/index.js", + new webpack.sources.RawSource( + "module.exports = 'external module text';\n" + ) + ); + } + ); + }); + } + } + ] +}; diff --git a/test/configCases/output-module/public-path/chunk.js b/test/configCases/output-module/public-path/chunk.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/configCases/output-module/public-path/chunk.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/configCases/output-module/public-path/chunk1.js b/test/configCases/output-module/public-path/chunk1.js new file mode 100644 index 00000000000..8efc7299424 --- /dev/null +++ b/test/configCases/output-module/public-path/chunk1.js @@ -0,0 +1 @@ +export default 43; diff --git a/test/configCases/output-module/public-path/index.js b/test/configCases/output-module/public-path/index.js new file mode 100644 index 00000000000..8be83c5235e --- /dev/null +++ b/test/configCases/output-module/public-path/index.js @@ -0,0 +1,29 @@ +// This config need to be set on initial evaluation to be effective +__webpack_nonce__ = "nonce"; + +it("should be able to load a chunk", async () => { + const module = await import("./chunk"); + expect(module.default).toBe(42); + + if (typeof document !== "undefined") { + expect(document.head._children).toHaveLength(1); + + // Test prefetch from entry chunk + const link = document.head._children[0]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("prefetch"); + + switch (__STATS_I__) { + case 8: + case 9: + case 10: + case 11: { + expect(link.href.startsWith("https://example.com/public/path/")).toBe(true); + } + } + + } + + const module1 = await import(/* webpackPrefetch: true */ "./chunk1"); + expect(module1.default).toBe(43); +}); diff --git a/test/configCases/output-module/public-path/test.config.js b/test/configCases/output-module/public-path/test.config.js new file mode 100644 index 00000000000..3157eb15cff --- /dev/null +++ b/test/configCases/output-module/public-path/test.config.js @@ -0,0 +1,21 @@ +module.exports = { + findBundle(i, options) { + switch (i) { + case 2: + case 6: + case 10: { + return `./${options.output.filename}`; + } + case 3: + case 7: + case 11: + case 13: + case 12: { + return `./bundle${i}/${options.output.filename}`; + } + default: { + return `./${options.output.filename}`; + } + } + } +}; diff --git a/test/configCases/output-module/public-path/webpack.config.js b/test/configCases/output-module/public-path/webpack.config.js new file mode 100644 index 00000000000..c4efcbe9817 --- /dev/null +++ b/test/configCases/output-module/public-path/webpack.config.js @@ -0,0 +1,183 @@ +const path = require("path"); + +/** @type {(env: Env, options: TestOptions) => import("../../../../").Configuration[]} */ +module.exports = (env, { testPath }) => [ + { + devtool: false, + target: "web", + output: { + module: true, + publicPath: "auto" + }, + experiments: { + outputModule: true + } + }, + { + devtool: false, + target: "web", + output: { + module: true, + publicPath: "auto", + chunkFilename: "async/[id].bundle1.mjs" + }, + experiments: { + outputModule: true + } + }, + { + devtool: false, + target: "web", + output: { + module: true, + publicPath: "auto", + filename: "initial/bundle2.mjs", + chunkFilename: "async/[id].bundle2.mjs" + }, + experiments: { + outputModule: true + } + }, + { + devtool: false, + target: "web", + output: { + path: path.resolve(testPath, "./bundle3"), + module: true, + publicPath: "auto", + filename: "initial/bundle3.mjs", + chunkFilename: "async/[id].bundle3.mjs" + }, + experiments: { + outputModule: true + } + }, + { + devtool: false, + target: "web", + output: { + module: true, + publicPath: "" + }, + experiments: { + outputModule: true + } + }, + { + devtool: false, + target: "web", + output: { + module: true, + publicPath: "", + chunkFilename: "async/[id].bundle5.mjs" + }, + experiments: { + outputModule: true + } + }, + { + devtool: false, + target: "web", + output: { + module: true, + publicPath: "", + filename: "initial/bundle6.mjs", + chunkFilename: "async/[id].bundle6.mjs" + }, + experiments: { + outputModule: true + } + }, + { + devtool: false, + target: "web", + output: { + path: path.resolve(testPath, "./bundle7"), + module: true, + publicPath: "", + filename: "initial/bundle7.mjs", + chunkFilename: "async/[id].bundle7.mjs" + }, + experiments: { + outputModule: true + } + }, + { + devtool: false, + target: "web", + output: { + module: true, + publicPath: "https://example.com/public/path/" + }, + experiments: { + outputModule: true + } + }, + { + devtool: false, + target: "web", + output: { + module: true, + publicPath: "https://example.com/public/path/", + chunkFilename: "async/[id].bundle9.mjs" + }, + experiments: { + outputModule: true + } + }, + { + devtool: false, + target: "web", + output: { + module: true, + publicPath: "https://example.com/public/path/", + filename: "initial/bundle10.mjs", + chunkFilename: "async/[id].bundle10.mjs" + }, + experiments: { + outputModule: true + } + }, + { + devtool: false, + target: "web", + output: { + path: path.resolve(testPath, "./bundle11"), + module: true, + publicPath: "https://example.com/public/path/", + filename: "initial/bundle11.mjs", + chunkFilename: "async/[id].bundle11.mjs" + }, + experiments: { + outputModule: true + } + }, + { + devtool: false, + target: "node", + output: { + path: path.resolve(testPath, "./bundle12"), + module: true, + publicPath: "auto", + filename: "initial/bundle12.mjs", + chunkFilename: "async/[id].bundle12.mjs" + }, + experiments: { + outputModule: true + } + }, + { + devtool: false, + target: ["node", "web"], + output: { + path: path.resolve(testPath, "./bundle13"), + module: true, + publicPath: "auto", + filename: "initial/bundle13.mjs", + chunkFilename: "async/[id].bundle13.mjs" + }, + experiments: { + outputModule: true + } + } +]; diff --git a/test/configCases/output-module/reuse-webpack-esm-library/index.js b/test/configCases/output-module/reuse-webpack-esm-library/index.js new file mode 100644 index 00000000000..d62ae0367e2 --- /dev/null +++ b/test/configCases/output-module/reuse-webpack-esm-library/index.js @@ -0,0 +1,5 @@ +import { useCall } from "./lib"; + +it("should compile and run", () => { + expect(useCall()).toBe(1); +}); diff --git a/test/configCases/output-module/reuse-webpack-esm-library/lib.js b/test/configCases/output-module/reuse-webpack-esm-library/lib.js new file mode 100644 index 00000000000..b219515d77d --- /dev/null +++ b/test/configCases/output-module/reuse-webpack-esm-library/lib.js @@ -0,0 +1,95 @@ +import * as __WEBPACK_EXTERNAL_MODULE_react__ from "react"; +/******/ var __webpack_modules__ = ({ + + /***/ "react": + /*!************************!*\ + !*** external "react" ***! + \************************/ + /***/ ((module) => { + + var x = y => { var x = {}; __webpack_require__.d(x, y); return x; } + var y = x => () => x + module.exports = __WEBPACK_EXTERNAL_MODULE_react__; + + /***/ }) + + /******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { + /******/ // Check if module is in cache + /******/ var cachedModule = __webpack_module_cache__[moduleId]; + /******/ if (cachedModule !== undefined) { + /******/ return cachedModule.exports; + /******/ } + /******/ // Create a new module (and put it into the cache) + /******/ var module = __webpack_module_cache__[moduleId] = { + /******/ // no module.id needed + /******/ // no module.loaded needed + /******/ exports: {} + /******/ }; + /******/ + /******/ // Execute the module function + /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); + /******/ + /******/ // Return the exports of the module + /******/ return module.exports; + /******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/define property getters */ +/******/ (() => { + /******/ // define getter functions for harmony exports + /******/ __webpack_require__.d = (exports, definition) => { + /******/ for(var key in definition) { + /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { + /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); + /******/ } + /******/ } + /******/ }; + /******/ })(); +/******/ +/******/ /* webpack/runtime/hasOwnProperty shorthand */ +/******/ (() => { + /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) + /******/ })(); +/******/ +/******/ /* webpack/runtime/make namespace object */ +/******/ (() => { + /******/ // define __esModule on exports + /******/ __webpack_require__.r = (exports) => { + /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { + /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); + /******/ } + /******/ Object.defineProperty(exports, '__esModule', { value: true }); + /******/ }; + /******/ })(); +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { + /*!***************************!*\ + !*** ./src/store/call.ts ***! + \***************************/ + __webpack_require__.r(__webpack_exports__); + /* harmony export */ __webpack_require__.d(__webpack_exports__, { + /* harmony export */ useCall: () => (/* binding */ useCall), + /* harmony export */ withCallManager: () => (/* binding */ withCallManager) + /* harmony export */ }); + /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); + + function withCallManager() { + return react__WEBPACK_IMPORTED_MODULE_0__.createElement(1); + } + function useCall() { + return withCallManager(); + } +})(); + +var __webpack_exports__useCall = __webpack_exports__.useCall; +var __webpack_exports__withCallManager = __webpack_exports__.withCallManager; +export { __webpack_exports__useCall as useCall, __webpack_exports__withCallManager as withCallManager }; diff --git a/test/configCases/output-module/reuse-webpack-esm-library/react.js b/test/configCases/output-module/reuse-webpack-esm-library/react.js new file mode 100644 index 00000000000..10a7ad78896 --- /dev/null +++ b/test/configCases/output-module/reuse-webpack-esm-library/react.js @@ -0,0 +1 @@ +export function createElement(a) { return a; } diff --git a/test/configCases/output-module/reuse-webpack-esm-library/webpack.config.js b/test/configCases/output-module/reuse-webpack-esm-library/webpack.config.js new file mode 100644 index 00000000000..8d969d27bc5 --- /dev/null +++ b/test/configCases/output-module/reuse-webpack-esm-library/webpack.config.js @@ -0,0 +1,14 @@ +const path = require("path"); +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + devtool: "eval", + optimization: { + concatenateModules: false + }, + resolve: { + alias: { + react: path.resolve(__dirname, "react") + } + } +}; diff --git a/test/configCases/output-module/simple/chunk.js b/test/configCases/output-module/simple/chunk.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/configCases/output-module/simple/chunk.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/configCases/output-module/simple/index.js b/test/configCases/output-module/simple/index.js new file mode 100644 index 00000000000..bdf68397f44 --- /dev/null +++ b/test/configCases/output-module/simple/index.js @@ -0,0 +1,12 @@ +it("should execute as module", () => { + expect( + (function () { + return !this; + })() + ).toBe(true); +}); + +it("should be able to load a chunk", async () => { + const module = await import("./chunk"); + expect(module.default).toBe(42); +}); diff --git a/test/configCases/output-module/simple/webpack.config.js b/test/configCases/output-module/simple/webpack.config.js new file mode 100644 index 00000000000..b8e5da8c1f1 --- /dev/null +++ b/test/configCases/output-module/simple/webpack.config.js @@ -0,0 +1,7 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + experiments: { + outputModule: true + }, + target: "node14" +}; diff --git a/test/configCases/output/charset/chunk1.css b/test/configCases/output/charset/chunk1.css new file mode 100644 index 00000000000..195b6bcf6d2 --- /dev/null +++ b/test/configCases/output/charset/chunk1.css @@ -0,0 +1,3 @@ +a { + color: red; +} diff --git a/test/configCases/output/charset/chunk1.js b/test/configCases/output/charset/chunk1.js new file mode 100644 index 00000000000..ea9b101e1c2 --- /dev/null +++ b/test/configCases/output/charset/chunk1.js @@ -0,0 +1 @@ +export default function () {} diff --git a/test/configCases/output/charset/index.js b/test/configCases/output/charset/index.js new file mode 100644 index 00000000000..4f383a623ff --- /dev/null +++ b/test/configCases/output/charset/index.js @@ -0,0 +1,27 @@ +__webpack_public_path__ = "https://test.cases/path/"; + +const doJsImport = () => import(/* webpackChunkName: "chunk1" */ "./chunk1.js"); +const doCssImport = () => import( /* webpackChunkName: "chunk1" */ "./chunk1.css" ); + +it("should not add charset attribute", async () => { + const promise = doJsImport(); + expect(document.head._children).toHaveLength(3); + + const link = document.head._children[0]; + + expect(link._type).toBe("link"); + expect(link.href).toBe("https://test.cases/path/chunk1.css"); + expect(link.rel).toBe("stylesheet"); + expect(link.getAttribute("charset")).toBeUndefined(); + + const script = document.head._children[document.head._children.length - 1]; + + __non_webpack_require__("./chunk1.js"); + script.onload(); + + expect(script._type).toBe("script"); + expect(script.src).toBe("https://test.cases/path/chunk1.js"); + expect(script.getAttribute("charset")).toBeUndefined(); + + return promise.then(() => doCssImport); +}); diff --git a/test/configCases/output/charset/test.config.js b/test/configCases/output/charset/test.config.js new file mode 100644 index 00000000000..ea656968b0e --- /dev/null +++ b/test/configCases/output/charset/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + moduleScope(scope, options) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "chunk1.css"; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/configCases/output/charset/webpack.config.js b/test/configCases/output/charset/webpack.config.js new file mode 100644 index 00000000000..15df7b6faf5 --- /dev/null +++ b/test/configCases/output/charset/webpack.config.js @@ -0,0 +1,18 @@ +/** @type {import("../../../../types").Configuration} */ +module.exports = { + target: "web", + output: { + chunkFilename: "[name].js", + charset: false + }, + performance: { + hints: false + }, + experiments: { + css: true + }, + optimization: { + chunkIds: "named", + minimize: false + } +}; diff --git a/test/configCases/output/chunk-format-with-runtimeChunk/index.js b/test/configCases/output/chunk-format-with-runtimeChunk/index.js new file mode 100644 index 00000000000..0acee55e319 --- /dev/null +++ b/test/configCases/output/chunk-format-with-runtimeChunk/index.js @@ -0,0 +1,3 @@ +it("should compile and run", () => { + expect(true).toBe(true) +}); diff --git a/test/configCases/output/chunk-format-with-runtimeChunk/test.config.js b/test/configCases/output/chunk-format-with-runtimeChunk/test.config.js new file mode 100644 index 00000000000..8614239c759 --- /dev/null +++ b/test/configCases/output/chunk-format-with-runtimeChunk/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["runtime.mjs", "main.mjs"]; + } +}; diff --git a/test/configCases/output/chunk-format-with-runtimeChunk/webpack.config.js b/test/configCases/output/chunk-format-with-runtimeChunk/webpack.config.js new file mode 100644 index 00000000000..4779769a381 --- /dev/null +++ b/test/configCases/output/chunk-format-with-runtimeChunk/webpack.config.js @@ -0,0 +1,17 @@ +module.exports = { + mode: "production", + entry: { + main: "./index.js" + }, + optimization: { + runtimeChunk: "single" + }, + output: { + filename: "[name].mjs", + module: true, + chunkFormat: "module" + }, + experiments: { + outputModule: true + } +}; diff --git a/test/configCases/output/function/test.config.js b/test/configCases/output/function/test.config.js index 4754b6482e8..212b2e5fc13 100644 --- a/test/configCases/output/function/test.config.js +++ b/test/configCases/output/function/test.config.js @@ -1,8 +1,5 @@ module.exports = { - findBundle: function() { - return [ - "./a.js", - "./b.js" - ]; + findBundle() { + return ["./a.js", "./b.js"]; } }; diff --git a/test/configCases/output/function/webpack.config.js b/test/configCases/output/function/webpack.config.js index 2cfbedfe1a9..ca4e0c7aa73 100644 --- a/test/configCases/output/function/webpack.config.js +++ b/test/configCases/output/function/webpack.config.js @@ -1,3 +1,6 @@ +/** @typedef {import("../../../../").Chunk} Chunk */ + +/** @type {import("../../../../").Configuration} */ module.exports = { entry() { return { @@ -6,8 +9,10 @@ module.exports = { }; }, output: { - filename: data => { - return data.chunk.name === "a" ? `${data.chunk.name}.js` : "[name].js"; - } + filename: data => + /** @type {Chunk} */ + (data.chunk).name === "a" + ? `${/** @type {Chunk} */ (data.chunk).name}.js` + : "[name].js" } }; diff --git a/test/configCases/output/import-meta-name/a.js b/test/configCases/output/import-meta-name/a.js new file mode 100644 index 00000000000..bdeb009362b --- /dev/null +++ b/test/configCases/output/import-meta-name/a.js @@ -0,0 +1 @@ +export const url = import.meta.url; diff --git a/test/configCases/output/import-meta-name/index.js b/test/configCases/output/import-meta-name/index.js new file mode 100644 index 00000000000..347bb1f5575 --- /dev/null +++ b/test/configCases/output/import-meta-name/index.js @@ -0,0 +1,9 @@ +import { url } from "./a"; + +it("should evaluate import.meta to pseudoImport.meta", () => { + expect(url).toBe("http://test.co/path/index.js"); +}); + +it("should evaluate import.meta in runtime", () => { + expect(url).toBe(import.meta.url); +}); diff --git a/test/configCases/output/import-meta-name/test.config.js b/test/configCases/output/import-meta-name/test.config.js new file mode 100644 index 00000000000..3b7d7089653 --- /dev/null +++ b/test/configCases/output/import-meta-name/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + moduleScope(scope) { + scope.pseudoImport = { meta: { url: "http://test.co/path/index.js" } }; + } +}; diff --git a/test/configCases/output/import-meta-name/webpack.config.js b/test/configCases/output/import-meta-name/webpack.config.js new file mode 100644 index 00000000000..5d9667ad4f5 --- /dev/null +++ b/test/configCases/output/import-meta-name/webpack.config.js @@ -0,0 +1,13 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + importMetaName: "pseudoImport.meta" + }, + module: { + parser: { + javascript: { + importMeta: false + } + } + } +}; diff --git a/test/configCases/output/inner-dirs-entries/a.js b/test/configCases/output/inner-dirs-entries/a.js new file mode 100644 index 00000000000..e7c6897a7f0 --- /dev/null +++ b/test/configCases/output/inner-dirs-entries/a.js @@ -0,0 +1,8 @@ +import dummy from "dummy_module"; + +it("should load", () => { + expect(dummy()).toBe("this is just a dummy function"); + return import("./inner-dir/b").then(importedModule => { + expect(importedModule.dummy()).toBe("this is just a dummy function"); + }); +}); diff --git a/test/configCases/output/inner-dirs-entries/inner-dir/b.js b/test/configCases/output/inner-dirs-entries/inner-dir/b.js new file mode 100644 index 00000000000..af09a1f6e15 --- /dev/null +++ b/test/configCases/output/inner-dirs-entries/inner-dir/b.js @@ -0,0 +1,10 @@ +import dummy from "dummy_module"; + +it("should load", () => { + expect(dummy()).toBe("this is just a dummy function"); + return import("./some-module").then(importedModule => { + expect(importedModule.dummy()).toBe("this is just a dummy function"); + }); +}); + +export { dummy }; diff --git a/test/configCases/output/inner-dirs-entries/inner-dir/some-module.js b/test/configCases/output/inner-dirs-entries/inner-dir/some-module.js new file mode 100644 index 00000000000..69917283c40 --- /dev/null +++ b/test/configCases/output/inner-dirs-entries/inner-dir/some-module.js @@ -0,0 +1,2 @@ +import dummy from "dummy_module"; +export { dummy }; diff --git a/test/configCases/output/inner-dirs-entries/node_modules/dummy_module/index.js b/test/configCases/output/inner-dirs-entries/node_modules/dummy_module/index.js new file mode 100644 index 00000000000..bb16bd21190 --- /dev/null +++ b/test/configCases/output/inner-dirs-entries/node_modules/dummy_module/index.js @@ -0,0 +1,3 @@ +export default function someDummyFunction() { + return "this is just a dummy function"; +} diff --git a/test/configCases/output/inner-dirs-entries/test.config.js b/test/configCases/output/inner-dirs-entries/test.config.js new file mode 100644 index 00000000000..18b3e20b6fd --- /dev/null +++ b/test/configCases/output/inner-dirs-entries/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./a.js", "./inner-dir/b.js", "./inner-dir/deep/deep/c.js"]; + } +}; diff --git a/test/configCases/output/inner-dirs-entries/webpack.config.js b/test/configCases/output/inner-dirs-entries/webpack.config.js new file mode 100644 index 00000000000..74d71fbfccc --- /dev/null +++ b/test/configCases/output/inner-dirs-entries/webpack.config.js @@ -0,0 +1,24 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "none", + entry: { + a: "./a?1", + "inner-dir/b": "./inner-dir/b", + "inner-dir/deep/deep/c": "./a?2" + }, + target: "node", + output: { + libraryTarget: "commonjs2", + pathinfo: true, + filename: "[name].js", + chunkFilename: "[name].chunk.min.js" + }, + optimization: { + minimize: false, + concatenateModules: false, + splitChunks: { + chunks: "all", + minSize: 0 + } + } +}; diff --git a/test/configCases/output/publicPath-node/asset.jpg b/test/configCases/output/publicPath-node/asset.jpg new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/output/publicPath-node/index.js b/test/configCases/output/publicPath-node/index.js new file mode 100644 index 00000000000..9c6c55518f3 --- /dev/null +++ b/test/configCases/output/publicPath-node/index.js @@ -0,0 +1,5 @@ +import asset from "./asset.jpg"; + +it("should define public path", () => { + expect(asset).toBe("asset.jpg"); +}); diff --git a/test/configCases/output/publicPath-node/webpack.config.js b/test/configCases/output/publicPath-node/webpack.config.js new file mode 100644 index 00000000000..546fe977dbc --- /dev/null +++ b/test/configCases/output/publicPath-node/webpack.config.js @@ -0,0 +1,16 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "none", + target: "node", + output: { + assetModuleFilename: "[name][ext]" + }, + module: { + rules: [ + { + test: /\.jpg$/, + type: "asset/resource" + } + ] + } +}; diff --git a/test/configCases/output/publicPath-scriptType-module/asset.jpg b/test/configCases/output/publicPath-scriptType-module/asset.jpg new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/output/publicPath-scriptType-module/index.js b/test/configCases/output/publicPath-scriptType-module/index.js new file mode 100644 index 00000000000..b6ab6abf147 --- /dev/null +++ b/test/configCases/output/publicPath-scriptType-module/index.js @@ -0,0 +1,5 @@ +import asset from "./asset.jpg"; + +it("should define public path", () => { + expect(asset).toBe("http://test.co/path/asset.jpg"); +}); diff --git a/test/configCases/output/publicPath-scriptType-module/test.config.js b/test/configCases/output/publicPath-scriptType-module/test.config.js new file mode 100644 index 00000000000..dd5df860f7e --- /dev/null +++ b/test/configCases/output/publicPath-scriptType-module/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + findBundle() { + return ["./index.mjs"]; + }, + moduleScope(scope) { + scope.pseudoImport = { meta: { url: "http://test.co/path/index.js" } }; + } +}; diff --git a/test/configCases/output/publicPath-scriptType-module/webpack.config.js b/test/configCases/output/publicPath-scriptType-module/webpack.config.js new file mode 100644 index 00000000000..e5a0a0a5780 --- /dev/null +++ b/test/configCases/output/publicPath-scriptType-module/webpack.config.js @@ -0,0 +1,19 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "none", + target: "electron-renderer", + output: { + assetModuleFilename: "[name][ext]", + importMetaName: "pseudoImport.meta", + scriptType: "module", + filename: "index.mjs" + }, + module: { + rules: [ + { + test: /\.jpg$/, + type: "asset/resource" + } + ] + } +}; diff --git a/test/configCases/output/publicPath-web/a.js b/test/configCases/output/publicPath-web/a.js new file mode 100644 index 00000000000..c85a615db4e --- /dev/null +++ b/test/configCases/output/publicPath-web/a.js @@ -0,0 +1,5 @@ +import asset from "./asset.jpg"; + +it("should define public path", () => { + expect(asset).toBe("https://test.cases/path/inner1/inner2/../../asset.jpg"); +}); diff --git a/test/configCases/output/publicPath-web/asset.jpg b/test/configCases/output/publicPath-web/asset.jpg new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/output/publicPath-web/b.js b/test/configCases/output/publicPath-web/b.js new file mode 100644 index 00000000000..3ccabac4d92 --- /dev/null +++ b/test/configCases/output/publicPath-web/b.js @@ -0,0 +1,5 @@ +import asset from "./asset.jpg"; + +it("should define public path", () => { + expect(asset).toBe("https://test.cases/path/asset.jpg"); +}); diff --git a/test/configCases/output/publicPath-web/c.js b/test/configCases/output/publicPath-web/c.js new file mode 100644 index 00000000000..d5f008e717d --- /dev/null +++ b/test/configCases/output/publicPath-web/c.js @@ -0,0 +1,5 @@ +import asset from "./asset.jpg"; + +it("should define public path", () => { + expect(asset).toBe("/other/inner1/inner2/../../asset.jpg"); +}); diff --git a/test/configCases/output/publicPath-web/d.js b/test/configCases/output/publicPath-web/d.js new file mode 100644 index 00000000000..1dc151ff189 --- /dev/null +++ b/test/configCases/output/publicPath-web/d.js @@ -0,0 +1,5 @@ +import asset from "./asset.jpg"; + +it("should define public path", () => { + expect(asset).toBe("/other/asset.jpg"); +}); diff --git a/test/configCases/output/publicPath-web/test.config.js b/test/configCases/output/publicPath-web/test.config.js new file mode 100644 index 00000000000..b4e1084ee4d --- /dev/null +++ b/test/configCases/output/publicPath-web/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./inner1/inner2/a.js", "./b.js"]; + } +}; diff --git a/test/configCases/output/publicPath-web/webpack.config.js b/test/configCases/output/publicPath-web/webpack.config.js new file mode 100644 index 00000000000..c11ed1e2604 --- /dev/null +++ b/test/configCases/output/publicPath-web/webpack.config.js @@ -0,0 +1,41 @@ +/** @typedef {import("../../../../").Chunk} Chunk */ + +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "none", + target: "web", + entry() { + return { + a: "./a", + b: "./b", + c: { + import: "./c", + publicPath: "/other/" + }, + d: { + import: "./d", + publicPath: "/other/" + } + }; + }, + output: { + filename: data => + /^[ac]$/.test( + /** @type {string} */ ( + /** @type {Chunk} */ + (data.chunk).name + ) + ) + ? "inner1/inner2/[name].js" + : "[name].js", + assetModuleFilename: "[name][ext]" + }, + module: { + rules: [ + { + test: /\.jpg$/, + type: "asset/resource" + } + ] + } +}; diff --git a/test/configCases/output/string/test.config.js b/test/configCases/output/string/test.config.js index 9af369705a3..a214e6a940f 100644 --- a/test/configCases/output/string/test.config.js +++ b/test/configCases/output/string/test.config.js @@ -1,7 +1,5 @@ module.exports = { - findBundle: function() { - return [ - "./a.js" - ]; + findBundle() { + return ["./a.js"]; } }; diff --git a/test/configCases/output/string/webpack.config.js b/test/configCases/output/string/webpack.config.js index 113bc42824d..d96ec181efb 100644 --- a/test/configCases/output/string/webpack.config.js +++ b/test/configCases/output/string/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { entry() { return { diff --git a/test/configCases/output/worker-public-path/index.js b/test/configCases/output/worker-public-path/index.js new file mode 100644 index 00000000000..fa82f46bc29 --- /dev/null +++ b/test/configCases/output/worker-public-path/index.js @@ -0,0 +1,14 @@ +import { Worker } from "worker_threads"; + +it("should define public path", async () => { + const worker = new Worker(new URL("./worker.js", import.meta.url), { + type: "module" + }); + worker.postMessage("ok"); + + var fs = require("fs"), + path = require("path"); + var source = fs.readFileSync(path.join(__dirname, "main.js"), "utf-8"); + expect(source).toMatch("workerPublicPath2"); + await worker.terminate() +}); diff --git a/test/configCases/output/worker-public-path/test.config.js b/test/configCases/output/worker-public-path/test.config.js new file mode 100644 index 00000000000..0e721ca1433 --- /dev/null +++ b/test/configCases/output/worker-public-path/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./main.js"]; + } +}; diff --git a/test/configCases/output/worker-public-path/test.filter.js b/test/configCases/output/worker-public-path/test.filter.js new file mode 100644 index 00000000000..f74eb03f05a --- /dev/null +++ b/test/configCases/output/worker-public-path/test.filter.js @@ -0,0 +1,5 @@ +const supportsWorker = require("../../../helpers/supportsWorker"); + +module.exports = function (config) { + return supportsWorker(); +}; diff --git a/test/configCases/output/worker-public-path/webpack.config.js b/test/configCases/output/worker-public-path/webpack.config.js new file mode 100644 index 00000000000..a141441d354 --- /dev/null +++ b/test/configCases/output/worker-public-path/webpack.config.js @@ -0,0 +1,13 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "none", + target: "node", + node: { + __dirname: false, + __filename: false + }, + output: { + filename: "[name].js", + workerPublicPath: "/workerPublicPath2/" + } +}; diff --git a/test/configCases/output/worker-public-path/worker.js b/test/configCases/output/worker-public-path/worker.js new file mode 100644 index 00000000000..939319f6379 --- /dev/null +++ b/test/configCases/output/worker-public-path/worker.js @@ -0,0 +1,6 @@ +function upper(str) { + return str.toUpperCase(); +} +onmessage = async event => { + postMessage(`data: ${upper(event.data)}, thanks`); +}; diff --git a/test/configCases/parsing/bom/dir/module.js b/test/configCases/parsing/bom/dir/module.js new file mode 100644 index 00000000000..f29098a9643 --- /dev/null +++ b/test/configCases/parsing/bom/dir/module.js @@ -0,0 +1,3 @@ +export default function test() { + return 1; +} diff --git a/test/configCases/parsing/bom/index.js b/test/configCases/parsing/bom/index.js new file mode 100644 index 00000000000..2d258b33d56 --- /dev/null +++ b/test/configCases/parsing/bom/index.js @@ -0,0 +1,19 @@ +import * as mod from "./module.js"; +import * as style from "./style.css"; +import * as text1 from "./text-with-bom.txt"; +import * as text2 from "./test-without-bom.text"; + +it("should remove BOM", function() { + const url = new URL("./resource-with-bom.ext", import.meta.url); + + expect(mod).toBeDefined(); + expect(style).toBeDefined(); + expect(text1).toBeDefined(); + expect(text2).toBeDefined(); + expect(url).toBeDefined(); + + const module = "module.js" + const modules = import("./dir/" + module); + + expect(modules).toBeDefined(); +}); diff --git a/test/configCases/parsing/bom/loader.js b/test/configCases/parsing/bom/loader.js new file mode 100644 index 00000000000..cffe014d433 --- /dev/null +++ b/test/configCases/parsing/bom/loader.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function loader(content) { + return `module.exports = ${JSON.stringify(content)}`; +}; diff --git a/test/configCases/parsing/bom/module.js b/test/configCases/parsing/bom/module.js new file mode 100644 index 00000000000..f29098a9643 --- /dev/null +++ b/test/configCases/parsing/bom/module.js @@ -0,0 +1,3 @@ +export default function test() { + return 1; +} diff --git a/test/configCases/parsing/bom/resource-with-bom.ext b/test/configCases/parsing/bom/resource-with-bom.ext new file mode 100644 index 00000000000..dc58dad5b23 --- /dev/null +++ b/test/configCases/parsing/bom/resource-with-bom.ext @@ -0,0 +1 @@ +asset diff --git a/test/configCases/parsing/bom/style.css b/test/configCases/parsing/bom/style.css new file mode 100644 index 00000000000..8317012f260 --- /dev/null +++ b/test/configCases/parsing/bom/style.css @@ -0,0 +1,3 @@ +body { + color: red; +} diff --git a/test/configCases/parsing/bom/test-without-bom.text b/test/configCases/parsing/bom/test-without-bom.text new file mode 100644 index 00000000000..8e27be7d615 --- /dev/null +++ b/test/configCases/parsing/bom/test-without-bom.text @@ -0,0 +1 @@ +text diff --git a/test/configCases/parsing/bom/test.config.js b/test/configCases/parsing/bom/test.config.js new file mode 100644 index 00000000000..4fbd9f6b51e --- /dev/null +++ b/test/configCases/parsing/bom/test.config.js @@ -0,0 +1,28 @@ +const fs = require("fs"); +const path = require("path"); + +module.exports = { + afterExecute(options) { + const outputPath = options.output.path; + const files = fs.readdirSync(outputPath); + + for (const file of files) { + const filename = path.resolve(outputPath, file); + const source = fs.readFileSync(filename, "utf-8"); + + switch (file) { + case "resource-with-bom.ext": { + if (!/[\uFEFF]/.test(source)) { + throw new Error(`Not found BOM in ${filename}.`); + } + break; + } + default: { + if (/\uFEFF/.test(source)) { + throw new Error(`Found BOM in ${filename}.`); + } + } + } + } + } +}; diff --git a/test/configCases/parsing/bom/text-with-bom.txt b/test/configCases/parsing/bom/text-with-bom.txt new file mode 100644 index 00000000000..ac3d614ab58 --- /dev/null +++ b/test/configCases/parsing/bom/text-with-bom.txt @@ -0,0 +1 @@ +text1 diff --git a/test/configCases/parsing/bom/webpack.config.js b/test/configCases/parsing/bom/webpack.config.js new file mode 100644 index 00000000000..cb633c0010e --- /dev/null +++ b/test/configCases/parsing/bom/webpack.config.js @@ -0,0 +1,22 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + output: { + assetModuleFilename: "[name][ext]" + }, + module: { + rules: [ + { + test: /\.txt$/, + loader: require.resolve("./loader") + }, + { + test: /\.text$/, + type: "asset/source" + } + ] + }, + experiments: { + css: true + } +}; diff --git a/test/configCases/parsing/context/errors.js b/test/configCases/parsing/context/errors.js new file mode 100644 index 00000000000..ab18d4d5490 --- /dev/null +++ b/test/configCases/parsing/context/errors.js @@ -0,0 +1,7 @@ +module.exports = [ + [ + /Module parse failed/, + { moduleName: /dump-file\.txt/ }, + { moduleTrace: /templates\/ sync/ } + ] +]; diff --git a/test/configCases/parsing/context/infrastructure-log.js b/test/configCases/parsing/context/infrastructure-log.js new file mode 100644 index 00000000000..e458f85280b --- /dev/null +++ b/test/configCases/parsing/context/infrastructure-log.js @@ -0,0 +1,3 @@ +module.exports = [ + /^Pack got invalid because of write to: Compilation\/modules|.+dump-file\.txt/ +]; diff --git a/test/configCases/parsing/context/warnings.js b/test/configCases/parsing/context/warnings.js deleted file mode 100644 index b141a3bbcbe..00000000000 --- a/test/configCases/parsing/context/warnings.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = [ - [/Module parse failed/, /dump-file\.txt/, /templates sync \^\\\.\\\//] -]; diff --git a/test/configCases/parsing/context/webpack.config.js b/test/configCases/parsing/context/webpack.config.js index cac06dfd027..91e80ba3b53 100644 --- a/test/configCases/parsing/context/webpack.config.js +++ b/test/configCases/parsing/context/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { module: { unknownContextRegExp: /^\.\//, diff --git a/test/configCases/parsing/destructuring-computed-property/index.js b/test/configCases/parsing/destructuring-computed-property/index.js new file mode 100644 index 00000000000..8cebedbd130 --- /dev/null +++ b/test/configCases/parsing/destructuring-computed-property/index.js @@ -0,0 +1,18 @@ +import * as namespace from "../destructuring-namespace-import/module"; + +it("should work with destructuring", function() { + const key = "fo" + "o"; + const { + [key]: a = "foo", + ["fo" + "o"]: a1 = "foo", + [PROPERTY]: a2 = "foo", + ["unkn" + "own"]: unknown = "foo", + unknown1 = "foo", + } = namespace; + + expect(a).toBe("bar"); + expect(a1).toBe("bar"); + expect(a2).toBe("bar"); + expect(unknown).toBe("foo"); + expect(unknown1).toBe("foo"); +}); diff --git a/test/configCases/parsing/destructuring-computed-property/module.js b/test/configCases/parsing/destructuring-computed-property/module.js new file mode 100644 index 00000000000..c155820bf77 --- /dev/null +++ b/test/configCases/parsing/destructuring-computed-property/module.js @@ -0,0 +1 @@ +export const foo = 'bar'; diff --git a/test/configCases/parsing/destructuring-computed-property/webpack.config.js b/test/configCases/parsing/destructuring-computed-property/webpack.config.js new file mode 100644 index 00000000000..2f7f833fa6e --- /dev/null +++ b/test/configCases/parsing/destructuring-computed-property/webpack.config.js @@ -0,0 +1,13 @@ +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + concatenateModules: true + }, + plugins: [ + new webpack.DefinePlugin({ + PROPERTY: JSON.stringify("foo") + }) + ] +}; diff --git a/test/configCases/parsing/destructuring-namespace-import/index.js b/test/configCases/parsing/destructuring-namespace-import/index.js new file mode 100644 index 00000000000..159132b85bb --- /dev/null +++ b/test/configCases/parsing/destructuring-namespace-import/index.js @@ -0,0 +1,41 @@ +import * as namespace from "./module.js"; + +it("should work with destructuring", function() { + { + const { foo } = namespace; + expect(foo).toBe("bar"); + } + + { + let foo; + ({ foo } = namespace); + expect(foo).toBe("bar"); + } + + { + let foo; + ({ foo = 'foo' } = namespace); + expect(foo).toBe("bar"); + } + + { + const { foo = 'foo' } = namespace; + expect(foo).toBe("bar"); + } + + { + const strings = []; + ({ foo : strings[0] } = namespace); + expect(strings[0]).toBe("bar"); + } + + { + const { foo: otherFoo = 'foo' } = namespace; + expect(otherFoo).toBe("bar"); + } + + { + const { bar = 'foo' } = namespace; + expect(bar).toBe("foo"); + } +}); diff --git a/test/configCases/parsing/destructuring-namespace-import/module.js b/test/configCases/parsing/destructuring-namespace-import/module.js new file mode 100644 index 00000000000..c155820bf77 --- /dev/null +++ b/test/configCases/parsing/destructuring-namespace-import/module.js @@ -0,0 +1 @@ +export const foo = 'bar'; diff --git a/test/configCases/parsing/destructuring-namespace-import/webpack.config.js b/test/configCases/parsing/destructuring-namespace-import/webpack.config.js new file mode 100644 index 00000000000..c939ba33f61 --- /dev/null +++ b/test/configCases/parsing/destructuring-namespace-import/webpack.config.js @@ -0,0 +1,6 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + concatenateModules: true + } +}; diff --git a/test/configCases/parsing/destructuring-rest/index.js b/test/configCases/parsing/destructuring-rest/index.js new file mode 100644 index 00000000000..ba38e9dc45a --- /dev/null +++ b/test/configCases/parsing/destructuring-rest/index.js @@ -0,0 +1,8 @@ +import * as namespace from "../destructuring-namespace-import/module"; + +it("should work with destructuring", function() { + const key = "fo" + "o"; + const { ...rest } = namespace; + + expect(rest[key]).toBe("bar"); +}); diff --git a/test/configCases/parsing/destructuring-rest/module.js b/test/configCases/parsing/destructuring-rest/module.js new file mode 100644 index 00000000000..c155820bf77 --- /dev/null +++ b/test/configCases/parsing/destructuring-rest/module.js @@ -0,0 +1 @@ +export const foo = 'bar'; diff --git a/test/configCases/parsing/destructuring-rest/webpack.config.js b/test/configCases/parsing/destructuring-rest/webpack.config.js new file mode 100644 index 00000000000..c939ba33f61 --- /dev/null +++ b/test/configCases/parsing/destructuring-rest/webpack.config.js @@ -0,0 +1,6 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + concatenateModules: true + } +}; diff --git a/test/configCases/parsing/extended-api/chunk.js b/test/configCases/parsing/extended-api/chunk.js new file mode 100644 index 00000000000..c0d3c51a9e8 --- /dev/null +++ b/test/configCases/parsing/extended-api/chunk.js @@ -0,0 +1,2 @@ +export const hash = __webpack_hash__; +export const chunkName = __webpack_chunkname__; diff --git a/test/configCases/parsing/extended-api/index.js b/test/configCases/parsing/extended-api/index.js index 6b10bd1e430..561ef08b8fc 100644 --- a/test/configCases/parsing/extended-api/index.js +++ b/test/configCases/parsing/extended-api/index.js @@ -1,8 +1,14 @@ it("should have __webpack_hash__", function() { expect(__webpack_hash__).toBeTypeOf("string"); expect(__webpack_hash__).toMatch(/^[0-9a-f]{20}$/); + return import("./chunk").then(({ hash }) => { + expect(hash).toBe(__webpack_hash__); + }); }); it("should have __webpack_chunkname__", function() { expect(__webpack_chunkname__).toBeTypeOf("string"); expect(__webpack_chunkname__).toBe("other"); + return import("./chunk").then(({ chunkName }) => { + expect(chunkName).toBe(__webpack_chunkname__); + }); }); diff --git a/test/configCases/parsing/extended-api/webpack.config.js b/test/configCases/parsing/extended-api/webpack.config.js index 3eeca328d17..111b9e76b11 100644 --- a/test/configCases/parsing/extended-api/webpack.config.js +++ b/test/configCases/parsing/extended-api/webpack.config.js @@ -1,9 +1,8 @@ "use strict"; -const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { entry: { other: "./index" - }, - plugins: [new webpack.ExtendedAPIPlugin()] + } }; diff --git a/test/configCases/parsing/harmony-global/webpack.config.js b/test/configCases/parsing/harmony-global/webpack.config.js index a65179e2b46..7bb5f004c11 100644 --- a/test/configCases/parsing/harmony-global/webpack.config.js +++ b/test/configCases/parsing/harmony-global/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { target: "web", performance: { diff --git a/test/configCases/parsing/harmony-this-concat/abc.js b/test/configCases/parsing/harmony-this-concat/abc.js index f9d8733a270..567c19da69d 100644 --- a/test/configCases/parsing/harmony-this-concat/abc.js +++ b/test/configCases/parsing/harmony-this-concat/abc.js @@ -1,14 +1,63 @@ function returnThis() { - if(typeof this === "undefined") return "undefined"; + if (typeof this === "undefined") return "undefined"; return this; } var a = returnThis; var b = returnThis; -export { - a, - b +export { a, b }; + +export const that = this; +export const returnThisArrow = () => this; +export const returnThisMember = () => this.a; + +export class C { + constructor() { + this.x = "bar"; + } + foo() { + return this.x; + } + bar(x = this.x) { + return x; + } +} + +export const extendThisClass = () => { + return class extends this.Buffer {}; +}; + +export function D() { + this.prop = () => "ok"; +} + +// See https://github.com/webpack/webpack/issues/6379 +export const E = { + x: "bar", + foo(x = this.x) { + return x; + } +}; + +// See https://github.com/webpack/webpack/issues/6967 +export const F = function() { + return this; +}.call("ok"); + +export function f1(x = this.x) { + return x; +} + +export const f2 = function(x = this.x) { + return x; +}; + +export const f3 = (x = this) => x; + +export function G(x) { + this.x = x; + this.getX = (y = this.x) => y; } export default returnThis; diff --git a/test/configCases/parsing/harmony-this-concat/index.js b/test/configCases/parsing/harmony-this-concat/index.js index e2b94f2eb89..e4ecf860e0a 100644 --- a/test/configCases/parsing/harmony-this-concat/index.js +++ b/test/configCases/parsing/harmony-this-concat/index.js @@ -1,33 +1,73 @@ "use strict"; -import d, {a, b as B} from "./abc"; +import {extendThisClass, returnThisArrow, returnThisMember, that} from "./abc"; +import d, {a, b as B, C as _C, D as _D, E, F, f1, f2, f3, G} from "./abc"; +import {bindThis, callThis, applyThis} from "./issue-7213"; import * as abc from "./abc"; -function x() { throw new Error("should not be executed"); } -it("should have this = undefined on imported non-strict functions", function() { +it("should have this = undefined on harmony modules", () => { + expect((typeof that)).toBe("undefined"); + expect((typeof abc.that)).toBe("undefined"); + expect((typeof returnThisArrow())).toBe("undefined"); + expect((typeof abc.returnThisArrow())).toBe("undefined"); + expect(function() { + returnThisMember(); + }).toThrowError(); + expect(function() { + abc.returnThisMember(); + }).toThrowError(); + expect(function() { + extendThisClass(); + }).toThrowError(); +}); + +it("should not break classes and functions", () => { + expect((new _C).foo()).toBe("bar"); + expect((new _C).bar()).toBe("bar"); + expect((new _D).prop()).toBe("ok"); + expect(E.foo()).toBe("bar"); + expect(F).toBe("ok"); + expect(f1.call({x: "f1"})).toBe("f1"); + expect(f2.call({x: "f2"})).toBe("f2"); + expect(f3.call("f3")).toBe(undefined); + expect(f3()).toBe(undefined); + expect((new G("ok")).getX()).toBe("ok"); +}); + +function x() { + throw new Error("should not be executed"); +} + +it("should have this = undefined on imported non-strict functions", () => { + x + d x + d() expect(d()).toBe("undefined"); x - expect(a()).toBe("undefined"); + a x + a() + expect(a()).toBe("undefined"); expect(B()).toBe("undefined"); - x - expect(abc.a()).toMatchObject({}); - x + expect(abc.a()).toBeTypeOf("object"); var thing = abc.a(); - expect(Object.keys(thing)).toEqual(["a", "b", "default"]); + expect(Object.keys(thing)).toEqual(Object.keys(abc)); }); import C2, { C } from "./new"; import * as New from "./new"; -it("should be possible to use new correctly", function() { - x +it("should be possible to use new correctly", () => { expect(new C()).toEqual({ok: true}); - x expect(new C2()).toEqual({ok: true}); - x expect(new New.C()).toEqual({ok: true}); }); + +it("should not break Babel arrow function transform", () => { + expect(bindThis()).toBe(undefined); + expect(callThis).toBe(undefined); + expect(applyThis).toBe(undefined); +}); diff --git a/test/configCases/parsing/harmony-this-concat/issue-7213.js b/test/configCases/parsing/harmony-this-concat/issue-7213.js new file mode 100644 index 00000000000..0e3a36512b7 --- /dev/null +++ b/test/configCases/parsing/harmony-this-concat/issue-7213.js @@ -0,0 +1,20 @@ +// This helper is taken from Babel +function _newArrowCheck(innerThis, boundThis) { + if (innerThis !== boundThis) { + throw new TypeError("Cannot instantiate an arrow function"); + } +} + +let _this = this; +export let bindThis = function() { + _newArrowCheck(this, _this); + return this +}.bind(this); + +export let callThis = function() { + return this +}.call(this) + +export let applyThis = function() { + return this +}.apply(this) diff --git a/test/configCases/parsing/harmony-this-concat/webpack.config.js b/test/configCases/parsing/harmony-this-concat/webpack.config.js index 9cd2bdf568e..8c13599c69a 100644 --- a/test/configCases/parsing/harmony-this-concat/webpack.config.js +++ b/test/configCases/parsing/harmony-this-concat/webpack.config.js @@ -1,7 +1,6 @@ -var webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { module: { strictThisContextOnImports: true - }, - plugins: [new webpack.optimize.ModuleConcatenationPlugin()] + } }; diff --git a/test/configCases/parsing/harmony-this/index.js b/test/configCases/parsing/harmony-this/index.js index a8af2750006..531f7a7bef5 100644 --- a/test/configCases/parsing/harmony-this/index.js +++ b/test/configCases/parsing/harmony-this/index.js @@ -41,14 +41,25 @@ function x() { it("should have this = undefined on imported non-strict functions", () => { x + d + x + d() expect(d()).toBe("undefined"); x + a + x + a() expect(a()).toBe("undefined"); x + B + x + B() expect(B()).toBe("undefined"); x - expect(abc.a()).toBeTypeOf("object"); + abc.a x + abc.a() + expect(abc.a()).toBeTypeOf("object"); var thing = abc.a(); expect(Object.keys(thing)).toEqual(Object.keys(abc)); }); @@ -58,11 +69,8 @@ import C2, { C } from "./new"; import * as New from "./new"; it("should be possible to use new correctly", () => { - x expect(new C()).toEqual({ok: true}); - x expect(new C2()).toEqual({ok: true}); - x expect(new New.C()).toEqual({ok: true}); }); diff --git a/test/configCases/parsing/harmony-this/webpack.config.js b/test/configCases/parsing/harmony-this/webpack.config.js index dfb1984cf21..2423e135e4e 100644 --- a/test/configCases/parsing/harmony-this/webpack.config.js +++ b/test/configCases/parsing/harmony-this/webpack.config.js @@ -1,5 +1,9 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { module: { strictThisContextOnImports: true + }, + optimization: { + concatenateModules: false } }; diff --git a/test/configCases/parsing/import-ignore/webpack.config.js b/test/configCases/parsing/import-ignore/webpack.config.js index 4fcaf47ef7d..a824d92018a 100644 --- a/test/configCases/parsing/import-ignore/webpack.config.js +++ b/test/configCases/parsing/import-ignore/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { entry: { bundle0: "./index.js", diff --git a/test/configCases/parsing/issue-11619/index.js b/test/configCases/parsing/issue-11619/index.js new file mode 100644 index 00000000000..bac1af59036 --- /dev/null +++ b/test/configCases/parsing/issue-11619/index.js @@ -0,0 +1,4 @@ +it("should provide a module to a called free var", function () { + var x = xxx.yyy(xxx.yyy, xxx.yyy); + expect(x).toBe("ok"); +}); diff --git a/test/configCases/parsing/issue-11619/node_modules/aaa.js b/test/configCases/parsing/issue-11619/node_modules/aaa.js new file mode 100644 index 00000000000..61804145a72 --- /dev/null +++ b/test/configCases/parsing/issue-11619/node_modules/aaa.js @@ -0,0 +1,5 @@ +const fn = (a, b) => { + if(a === fn && b === fn) return "ok"; + return "fail"; +}; +module.exports = fn; diff --git a/test/configCases/parsing/issue-11619/webpack.config.js b/test/configCases/parsing/issue-11619/webpack.config.js new file mode 100644 index 00000000000..e7c39588cb5 --- /dev/null +++ b/test/configCases/parsing/issue-11619/webpack.config.js @@ -0,0 +1,10 @@ +const ProvidePlugin = require("../../../../").ProvidePlugin; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [ + new ProvidePlugin({ + "xxx.yyy": "aaa" + }) + ] +}; diff --git a/test/configCases/parsing/issue-14545/index.js b/test/configCases/parsing/issue-14545/index.js new file mode 100644 index 00000000000..afaf9c0ba3e --- /dev/null +++ b/test/configCases/parsing/issue-14545/index.js @@ -0,0 +1,4 @@ +it("should generate valid code when 'require' encounters object shorthand syntax", function() { + expect(require("./module").obj.require).toEqual(require("./module").obj.r); + expect(require("./module").obj.require).toBeTypeOf("function"); +}); diff --git a/test/configCases/parsing/issue-14545/module.js b/test/configCases/parsing/issue-14545/module.js new file mode 100644 index 00000000000..0b7649cbf29 --- /dev/null +++ b/test/configCases/parsing/issue-14545/module.js @@ -0,0 +1 @@ +export const obj = {require, r: require} diff --git a/test/configCases/parsing/issue-14545/webpack.config.js b/test/configCases/parsing/issue-14545/webpack.config.js new file mode 100644 index 00000000000..91e80ba3b53 --- /dev/null +++ b/test/configCases/parsing/issue-14545/webpack.config.js @@ -0,0 +1,9 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + module: { + unknownContextRegExp: /^\.\//, + unknownContextCritical: false, + exprContextRegExp: /^\.\//, + exprContextCritical: false + } +}; diff --git a/test/configCases/parsing/issue-14720/index.js b/test/configCases/parsing/issue-14720/index.js new file mode 100644 index 00000000000..0445694f69d --- /dev/null +++ b/test/configCases/parsing/issue-14720/index.js @@ -0,0 +1,7 @@ +it("should generate a chunk for a full require dependencies in require.ensure", done => { + require.ensure([], () => { + expect(require("./module").property).toBe(42); + expect(__STATS__.chunks.length).toBe(2); + done(); + }); +}); diff --git a/test/configCases/parsing/issue-14720/module.js b/test/configCases/parsing/issue-14720/module.js new file mode 100644 index 00000000000..5999374264e --- /dev/null +++ b/test/configCases/parsing/issue-14720/module.js @@ -0,0 +1 @@ +exports.property = 42; diff --git a/test/configCases/parsing/issue-14720/webpack.config.js b/test/configCases/parsing/issue-14720/webpack.config.js new file mode 100644 index 00000000000..dffc81bba10 --- /dev/null +++ b/test/configCases/parsing/issue-14720/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "production" +}; diff --git a/test/cases/parsing/issue-2942/index.js b/test/configCases/parsing/issue-2942/index.js similarity index 100% rename from test/cases/parsing/issue-2942/index.js rename to test/configCases/parsing/issue-2942/index.js diff --git a/test/configCases/parsing/issue-2942/warnings.js b/test/configCases/parsing/issue-2942/warnings.js new file mode 100644 index 00000000000..b9d04875279 --- /dev/null +++ b/test/configCases/parsing/issue-2942/warnings.js @@ -0,0 +1,5 @@ +module.exports = [ + [/System.register is not supported by webpack/], + [/System.get is not supported by webpack/], + [/System.set is not supported by webpack/] +]; diff --git a/test/configCases/parsing/issue-2942/webpack.config.js b/test/configCases/parsing/issue-2942/webpack.config.js new file mode 100644 index 00000000000..cb87a26bb00 --- /dev/null +++ b/test/configCases/parsing/issue-2942/webpack.config.js @@ -0,0 +1,13 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + module: { + rules: [ + { + test: /\.js$/, + parser: { + system: true + } + } + ] + } +}; diff --git a/test/configCases/parsing/issue-336/webpack.config.js b/test/configCases/parsing/issue-336/webpack.config.js index 6d8e76be95b..ea4f97ab1c7 100644 --- a/test/configCases/parsing/issue-336/webpack.config.js +++ b/test/configCases/parsing/issue-336/webpack.config.js @@ -1,4 +1,6 @@ -var ProvidePlugin = require("../../../../lib/ProvidePlugin"); +const ProvidePlugin = require("../../../../").ProvidePlugin; + +/** @type {import("../../../../").Configuration} */ module.exports = { plugins: [ new ProvidePlugin({ diff --git a/test/configCases/parsing/issue-4857/webpack.config.js b/test/configCases/parsing/issue-4857/webpack.config.js index 61e31872c6e..e30e85e9364 100644 --- a/test/configCases/parsing/issue-4857/webpack.config.js +++ b/test/configCases/parsing/issue-4857/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { optimization: { minimize: false diff --git a/test/configCases/parsing/issue-5624/webpack.config.js b/test/configCases/parsing/issue-5624/webpack.config.js index dfb1984cf21..8c13599c69a 100644 --- a/test/configCases/parsing/issue-5624/webpack.config.js +++ b/test/configCases/parsing/issue-5624/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { module: { strictThisContextOnImports: true diff --git a/test/configCases/parsing/issue-8293/webpack.config.js b/test/configCases/parsing/issue-8293/webpack.config.js index da6af6d2013..09541e8dc70 100644 --- a/test/configCases/parsing/issue-8293/webpack.config.js +++ b/test/configCases/parsing/issue-8293/webpack.config.js @@ -1,5 +1,6 @@ const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { entry: { bundle0: "./index.js", diff --git a/test/configCases/parsing/issue-9042/index.js b/test/configCases/parsing/issue-9042/index.js new file mode 100644 index 00000000000..e535e4ad1b8 --- /dev/null +++ b/test/configCases/parsing/issue-9042/index.js @@ -0,0 +1,9 @@ +it("should not evaluate __dirname or __filename when set to false", function(done) { + if (typeof __dirname !== "undefined") { + done.fail(); + } + if (typeof __filename !== "undefined") { + done.fail(); + } + done(); +}); diff --git a/test/configCases/parsing/issue-9042/test.config.js b/test/configCases/parsing/issue-9042/test.config.js new file mode 100644 index 00000000000..997667fd529 --- /dev/null +++ b/test/configCases/parsing/issue-9042/test.config.js @@ -0,0 +1,6 @@ +module.exports = { + moduleScope(scope) { + delete scope.__dirname; + delete scope.__filename; + } +}; diff --git a/test/configCases/parsing/issue-9042/webpack.config.js b/test/configCases/parsing/issue-9042/webpack.config.js new file mode 100644 index 00000000000..0a96337dc09 --- /dev/null +++ b/test/configCases/parsing/issue-9042/webpack.config.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + node: { + __filename: false, + __dirname: false + } +}; diff --git a/test/configCases/parsing/issue-9156/index.js b/test/configCases/parsing/issue-9156/index.js new file mode 100644 index 00000000000..16a3dd252db --- /dev/null +++ b/test/configCases/parsing/issue-9156/index.js @@ -0,0 +1,7 @@ +it("should allow to access module.id when node option is set to false", function() { + expect(module.id).toBeDefined(); +}); + +it("should allow to access module.loaded when node option is set to false", function() { + expect(module.loaded).toBeDefined(); +}); diff --git a/test/configCases/parsing/issue-9156/webpack.config.js b/test/configCases/parsing/issue-9156/webpack.config.js new file mode 100644 index 00000000000..0c8b672e367 --- /dev/null +++ b/test/configCases/parsing/issue-9156/webpack.config.js @@ -0,0 +1,5 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + node: false +}; diff --git a/test/configCases/parsing/node-source-plugin-off/index.js b/test/configCases/parsing/node-source-plugin-off/index.js index 322337ef345..84dd8b9d10e 100644 --- a/test/configCases/parsing/node-source-plugin-off/index.js +++ b/test/configCases/parsing/node-source-plugin-off/index.js @@ -1,3 +1,3 @@ -it("should not load node-libs-browser when node option is false", function() { - expect((typeof process)).toBe("undefined"); +it("should not load node bindings when node option is false", function() { + expect((typeof global)).toBe("undefined"); }); diff --git a/test/configCases/parsing/node-source-plugin-off/webpack.config.js b/test/configCases/parsing/node-source-plugin-off/webpack.config.js index 9f1a00b5596..0c8b672e367 100644 --- a/test/configCases/parsing/node-source-plugin-off/webpack.config.js +++ b/test/configCases/parsing/node-source-plugin-off/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { target: "web", node: false diff --git a/test/configCases/parsing/node-source-plugin/index.js b/test/configCases/parsing/node-source-plugin/index.js deleted file mode 100644 index c1671f16f0b..00000000000 --- a/test/configCases/parsing/node-source-plugin/index.js +++ /dev/null @@ -1,3 +0,0 @@ -it("should add node-libs-browser to target web by default", function() { - expect(process.browser).toBe(true); -}); diff --git a/test/configCases/parsing/node-source-plugin/webpack.config.js b/test/configCases/parsing/node-source-plugin/webpack.config.js deleted file mode 100644 index 3ff4222eaf0..00000000000 --- a/test/configCases/parsing/node-source-plugin/webpack.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - target: "web", - node: { - process: true - } -}; diff --git a/test/configCases/parsing/node-stuff-plugin-off/index.js b/test/configCases/parsing/node-stuff-plugin-off/index.js new file mode 100644 index 00000000000..97e3ca5792c --- /dev/null +++ b/test/configCases/parsing/node-stuff-plugin-off/index.js @@ -0,0 +1,9 @@ +it("should not evaluate __dirname or __filename when node option is false", function(done) { + if (typeof __dirname !== "undefined") { + done.fail(); + } + if (typeof __filename !== "undefined") { + done.fail(); + } + done(); +}); diff --git a/test/configCases/parsing/node-stuff-plugin-off/test.config.js b/test/configCases/parsing/node-stuff-plugin-off/test.config.js new file mode 100644 index 00000000000..997667fd529 --- /dev/null +++ b/test/configCases/parsing/node-stuff-plugin-off/test.config.js @@ -0,0 +1,6 @@ +module.exports = { + moduleScope(scope) { + delete scope.__dirname; + delete scope.__filename; + } +}; diff --git a/test/configCases/parsing/node-stuff-plugin-off/webpack.config.js b/test/configCases/parsing/node-stuff-plugin-off/webpack.config.js new file mode 100644 index 00000000000..0c8b672e367 --- /dev/null +++ b/test/configCases/parsing/node-stuff-plugin-off/webpack.config.js @@ -0,0 +1,5 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + node: false +}; diff --git a/test/configCases/parsing/optional-chaining/index.js b/test/configCases/parsing/optional-chaining/index.js new file mode 100644 index 00000000000..17d45b973be --- /dev/null +++ b/test/configCases/parsing/optional-chaining/index.js @@ -0,0 +1,28 @@ +it("should correctly render defined data #1", () => { + expect(_VALUE_?._DEFINED_).toBe(1); +}); + +it("should correctly render defined data #2", () => { + const val1 = _VALUE_?._PROP_?._DEFINED_; + const val2 = _VALUE_?._PROP_?._UNDEFINED_; + const val3 = typeof _VALUE_?._PROP_?._DEFINED_; + const val4 = typeof _VALUE_?._PROP_?._UNDEFINED_; + const val5 = _VALUE_?._PROP_; + const val6 = typeof _VALUE_?._PROP_; + expect(val1).toBe(2); + expect(val2).toBeUndefined(); + expect(val3).toBe("number"); + expect(val4).toBe("undefined"); + expect(val5).toEqual({ _DEFINED_: 2 }); + expect(val6).toBe("object"); + expect((() => typeof _VALUE_?._PROP_?._DEFINED_).toString()).toContain( + "number" + ); + expect((() => typeof _VALUE_?._PROP_).toString()).toContain("object"); + if (_VALUE_._PROP_._DEFINED_ !== 2) require("fail"); + if (_VALUE_?._PROP_?._DEFINED_ !== 2) require("fail"); + if (typeof _VALUE_._PROP_._DEFINED_ !== "number") require("fail"); + if (typeof _VALUE_?._PROP_?._DEFINED_ !== "number") require("fail"); + if (typeof _VALUE_._PROP_ !== "object") require("fail"); + if (typeof _VALUE_?._PROP_ !== "object") require("fail"); +}); diff --git a/test/configCases/parsing/optional-chaining/test.filter.js b/test/configCases/parsing/optional-chaining/test.filter.js new file mode 100644 index 00000000000..846093ba9cf --- /dev/null +++ b/test/configCases/parsing/optional-chaining/test.filter.js @@ -0,0 +1,5 @@ +const supportsOptionalChaining = require("../../../helpers/supportsOptionalChaining"); + +module.exports = function (config) { + return supportsOptionalChaining(); +}; diff --git a/test/configCases/parsing/optional-chaining/webpack.config.js b/test/configCases/parsing/optional-chaining/webpack.config.js new file mode 100644 index 00000000000..e805aa39e04 --- /dev/null +++ b/test/configCases/parsing/optional-chaining/webpack.config.js @@ -0,0 +1,18 @@ +const { DefinePlugin } = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + devtool: false, + target: "web", + plugins: [ + new DefinePlugin({ + _VALUE_: { + _DEFINED_: 1, + _PROP_: { + _DEFINED_: 2 + } + } + }) + ] +}; diff --git a/test/configCases/parsing/optional/index.js b/test/configCases/parsing/optional/index.js new file mode 100644 index 00000000000..cca013cc054 --- /dev/null +++ b/test/configCases/parsing/optional/index.js @@ -0,0 +1,11 @@ +it("should not fail for optional modules with bail", () => { + let error; + try { + require("./not-existing"); + } catch (e) { + error = e; + } + expect(() => { + throw error; + }).toThrowError(); +}); diff --git a/test/configCases/parsing/optional/warnings.js b/test/configCases/parsing/optional/warnings.js new file mode 100644 index 00000000000..e011edaca23 --- /dev/null +++ b/test/configCases/parsing/optional/warnings.js @@ -0,0 +1,7 @@ +module.exports = [ + [ + /Module not found/, + /Can't resolve '\.\/not-existing' /, + { details: /not-existing\.js/ } + ] +]; diff --git a/test/configCases/parsing/optional/webpack.config.js b/test/configCases/parsing/optional/webpack.config.js new file mode 100644 index 00000000000..61694bc0914 --- /dev/null +++ b/test/configCases/parsing/optional/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + bail: true +}; diff --git a/test/configCases/parsing/override-strict/non-strict.js b/test/configCases/parsing/override-strict/non-strict.js new file mode 100644 index 00000000000..f8d75f943c1 --- /dev/null +++ b/test/configCases/parsing/override-strict/non-strict.js @@ -0,0 +1,2 @@ +var a = 1; +a.toString(); diff --git a/test/configCases/parsing/override-strict/strict.js b/test/configCases/parsing/override-strict/strict.js new file mode 100644 index 00000000000..0efa8a04fbf --- /dev/null +++ b/test/configCases/parsing/override-strict/strict.js @@ -0,0 +1,8 @@ +import "./non-strict" +import fs from "fs"; + +it("should not have iife for entry module when modules strict is different", () => { + const code = fs.readFileSync(__filename, 'utf-8'); + const iifeComment = ["This entry needs to be wrapped in an IIFE", "because it needs to be in strict mode."].join(' '); + expect(code).not.toMatch(iifeComment); +}); diff --git a/test/configCases/parsing/override-strict/webpack.config.js b/test/configCases/parsing/override-strict/webpack.config.js new file mode 100644 index 00000000000..d92a10890a5 --- /dev/null +++ b/test/configCases/parsing/override-strict/webpack.config.js @@ -0,0 +1,25 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = [ + { + mode: "production", + entry: ["./strict"], + module: { + parser: { + javascript: { + overrideStrict: "strict" + } + } + } + }, + { + mode: "production", + entry: ["./strict"], + module: { + parser: { + javascript: { + overrideStrict: "non-strict" + } + } + } + } +]; diff --git a/test/configCases/parsing/relative-filedirname/webpack.config.js b/test/configCases/parsing/relative-filedirname/webpack.config.js index 3381b779e15..14316147f89 100644 --- a/test/configCases/parsing/relative-filedirname/webpack.config.js +++ b/test/configCases/parsing/relative-filedirname/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { node: { __filename: true, diff --git a/test/configCases/parsing/require-ignore/index.js b/test/configCases/parsing/require-ignore/index.js new file mode 100644 index 00000000000..f4a08cb8e5d --- /dev/null +++ b/test/configCases/parsing/require-ignore/index.js @@ -0,0 +1,8 @@ +const fs = require("fs"); +const path = require("path"); + +it("should be able to ignore require()", () => { + const source = fs.readFileSync(path.join(__dirname, "bundle1.js"), "utf-8"); + expect(source).toMatch(`require(/* webpackIgnore: true */ "./other2.js")`); + expect(source).not.toMatch(`require(/* webpackIgnore: false */ "./other3.js")`); +}); diff --git a/test/configCases/parsing/require-ignore/other.js b/test/configCases/parsing/require-ignore/other.js new file mode 100644 index 00000000000..5fcdcd5bc96 --- /dev/null +++ b/test/configCases/parsing/require-ignore/other.js @@ -0,0 +1,2 @@ +require(/* webpackIgnore: true */ "./other2.js"); +require(/* webpackIgnore: false */ "./other3.js"); diff --git a/test/configCases/parsing/require-ignore/other2.js b/test/configCases/parsing/require-ignore/other2.js new file mode 100644 index 00000000000..5d999f67246 --- /dev/null +++ b/test/configCases/parsing/require-ignore/other2.js @@ -0,0 +1 @@ +export default "other2"; diff --git a/test/configCases/parsing/require-ignore/other3.js b/test/configCases/parsing/require-ignore/other3.js new file mode 100644 index 00000000000..f5e8052628f --- /dev/null +++ b/test/configCases/parsing/require-ignore/other3.js @@ -0,0 +1 @@ +export default "other3"; diff --git a/test/configCases/parsing/require-ignore/webpack.config.js b/test/configCases/parsing/require-ignore/webpack.config.js new file mode 100644 index 00000000000..4323daf6d9d --- /dev/null +++ b/test/configCases/parsing/require-ignore/webpack.config.js @@ -0,0 +1,20 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + bundle0: "./index.js", + bundle1: "./other.js" + }, + module: { + parser: { + javascript: { + commonjsMagicComments: true + } + } + }, + output: { + filename: "[name].js" + }, + node: { + __dirname: false + } +}; diff --git a/test/configCases/parsing/require-resolve-ignore/index.js b/test/configCases/parsing/require-resolve-ignore/index.js new file mode 100644 index 00000000000..7511c4570ca --- /dev/null +++ b/test/configCases/parsing/require-resolve-ignore/index.js @@ -0,0 +1,9 @@ +const fs = require("fs"); +const path = require("path"); + +it("should be able to ignore require.resolve()", () => { + const source = fs.readFileSync(path.join(__dirname, "bundle1.js"), "utf-8"); + expect(source).toMatch(`require.resolve(/* webpackIgnore: true */ "./non-exists")`); + expect(source).toMatch(`createRequire(import.meta.url).resolve(/* webpackIgnore: true */ "./non-exists")`); + expect(source).toMatch(`require.resolve(/* webpackIgnore: true */ "./non-exists")`); +}); diff --git a/test/configCases/parsing/require-resolve-ignore/other.js b/test/configCases/parsing/require-resolve-ignore/other.js new file mode 100644 index 00000000000..a8c4d14ea19 --- /dev/null +++ b/test/configCases/parsing/require-resolve-ignore/other.js @@ -0,0 +1,8 @@ +import { createRequire } from 'node:module'; + +const resolve = require.resolve(/* webpackIgnore: true */ "./non-exists"); +const createRequireResolve1 = createRequire(import.meta.url).resolve(/* webpackIgnore: true */ "./non-exists"); +const require = createRequire(import.meta.url); +const createRequireResolve2 = require.resolve(/* webpackIgnore: true */ "./non-exists"); + +export { resolve, createRequireResolve1, createRequireResolve2 } diff --git a/test/configCases/parsing/require-resolve-ignore/webpack.config.js b/test/configCases/parsing/require-resolve-ignore/webpack.config.js new file mode 100644 index 00000000000..4323daf6d9d --- /dev/null +++ b/test/configCases/parsing/require-resolve-ignore/webpack.config.js @@ -0,0 +1,20 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + bundle0: "./index.js", + bundle1: "./other.js" + }, + module: { + parser: { + javascript: { + commonjsMagicComments: true + } + } + }, + output: { + filename: "[name].js" + }, + node: { + __dirname: false + } +}; diff --git a/test/configCases/parsing/require.main/webpack.config.js b/test/configCases/parsing/require.main/webpack.config.js index f053ebf7976..3583b70a321 100644 --- a/test/configCases/parsing/require.main/webpack.config.js +++ b/test/configCases/parsing/require.main/webpack.config.js @@ -1 +1,2 @@ +/** @type {import("../../../../").Configuration} */ module.exports = {}; diff --git a/test/configCases/parsing/requirejs/file.js b/test/configCases/parsing/requirejs/file.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/parsing/requirejs/index.js b/test/configCases/parsing/requirejs/index.js new file mode 100644 index 00000000000..6d38fad8e66 --- /dev/null +++ b/test/configCases/parsing/requirejs/index.js @@ -0,0 +1,20 @@ +it("should ignore require.config", function() { + require.config({ + + }); + requirejs.config({ + + }); +}); +it("should have a require.version", function() { + expect(require.version).toBeTypeOf("string"); +}); +it("should have a requirejs.onError function", function(done) { + function f(){} + expect(requirejs.onError).toBeTypeOf("undefined"); // has no default handler + var org = requirejs.onError; + requirejs.onError = f; + expect(requirejs.onError).toBe(f); + requirejs.onError = org; + require(["./file.js"], function() { done() }); +}); diff --git a/test/configCases/parsing/requirejs/webpack.config.js b/test/configCases/parsing/requirejs/webpack.config.js new file mode 100644 index 00000000000..8da4d0ff7c4 --- /dev/null +++ b/test/configCases/parsing/requirejs/webpack.config.js @@ -0,0 +1,13 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + module: { + rules: [ + { + test: /\.js$/, + parser: { + requireJs: true + } + } + ] + } +}; diff --git a/test/configCases/parsing/system.import/index.js b/test/configCases/parsing/system.import/index.js index 8310bbaf461..52b10dd9e4c 100644 --- a/test/configCases/parsing/system.import/index.js +++ b/test/configCases/parsing/system.import/index.js @@ -1,36 +1,38 @@ it("should answer typeof System correctly", () => { - if(__SYSTEM__ === false) { - expect((typeof System)).toBe("undefined"); - } else { + if(__SYSTEM__) { expect((typeof System)).toBe("object"); + } else { + expect((typeof System)).toBe("undefined"); } }); it("should answer typeof System.import correctly", () => { - if(__SYSTEM__ === false) { + if(__SYSTEM__) { + expect((typeof System.import)).toBe("function"); + } else { expect(() => { typeof System.import; }).toThrowError(); - } else { - expect((typeof System.import)).toBe("function"); } }); it("should be able to use System.import()", done => { try { System.import("./module").then(mod => { - if(__SYSTEM__ === false) { - done(new Error("System.import should not be parsed")); - } else { - expect(mod).toEqual(nsObj({ default: "ok" })); + if(__SYSTEM__) { + expect(mod).toEqual(nsObj({ + default: "ok" + })); done(); + } else { + done(new Error("System.import should not be parsed")); } }); } catch(e) { - if(__SYSTEM__ === false) { - done(); - } else { + if(__SYSTEM__) { done(e); + } else { + done(); } } }); diff --git a/test/configCases/parsing/system.import/warnings.js b/test/configCases/parsing/system.import/warnings.js index 3d4e4ec2714..87f7042472d 100644 --- a/test/configCases/parsing/system.import/warnings.js +++ b/test/configCases/parsing/system.import/warnings.js @@ -1,3 +1,3 @@ module.exports = [ - [/system_undef/, /System\.import\(\) is deprecated/] + [{compilerPath: /system_true/}, /System\.import\(\) is deprecated/] ]; diff --git a/test/configCases/parsing/system.import/webpack.config.js b/test/configCases/parsing/system.import/webpack.config.js index ae747d61108..ba03c038bdb 100644 --- a/test/configCases/parsing/system.import/webpack.config.js +++ b/test/configCases/parsing/system.import/webpack.config.js @@ -1,5 +1,9 @@ const webpack = require("../../../../"); +/** + * @param {boolean | undefined} system system + * @returns {import("../../../../").Configuration} configuration + */ function createConfig(system) { const systemString = "" + system; return { @@ -22,6 +26,7 @@ function createConfig(system) { }; } +/** @type {import("../../../../").Configuration[]} */ module.exports = [ createConfig(undefined), createConfig(true), diff --git a/test/configCases/parsing/url-ignore/file2.css b/test/configCases/parsing/url-ignore/file2.css new file mode 100644 index 00000000000..195b6bcf6d2 --- /dev/null +++ b/test/configCases/parsing/url-ignore/file2.css @@ -0,0 +1,3 @@ +a { + color: red; +} diff --git a/test/configCases/parsing/url-ignore/file4.css b/test/configCases/parsing/url-ignore/file4.css new file mode 100644 index 00000000000..195b6bcf6d2 --- /dev/null +++ b/test/configCases/parsing/url-ignore/file4.css @@ -0,0 +1,3 @@ +a { + color: red; +} diff --git a/test/configCases/parsing/url-ignore/index.js b/test/configCases/parsing/url-ignore/index.js new file mode 100644 index 00000000000..9c23e948bfc --- /dev/null +++ b/test/configCases/parsing/url-ignore/index.js @@ -0,0 +1,27 @@ +it("should ignore", function() { + const url = new URL(/* webpackIgnore: true */ "file1.css", import.meta.url); + expect(url.pathname.endsWith("file1.css")).toBe(true); + expect(url.pathname.includes("/public/")).toBe(false); + const url2 = new URL(/* webpackIgnore: false */ "file2.css", import.meta.url); + expect(/\/public\/.+\.css/.test(url2.pathname)).toBe(true); + const url3 = new URL(/* webpackIgnore: true */ "fil" + "e3.css", import.meta.url); + expect(url3.pathname.endsWith("file3.css")).toBe(true); + const url4 = new URL(/* webpackIgnore: false */ "fil" + "e4.css", import.meta.url); + expect(/\/public\/.+\.css/.test(url4.pathname)).toBe(true); + const url5 = new URL(/* webpackIgnore: "test" */ "file5.css", import.meta.url); + expect(url5.pathname.endsWith("file5.css")).toBe(true); + const value = "file5.css"; + const url6 = new URL(/* webpackIgnore: true */ "/dir/" + value, import.meta.url); + expect(url6.pathname.endsWith("file5.css")).toBe(true); + const args = ["file3.css", document.baseURI || self.location.href]; + const url7 = new URL(...args); + expect(url7.pathname.endsWith("file3.css")).toBe(true); + const url8 = new URL(document.baseURI || self.location.href); + expect(url8.toString()).toBe(document.baseURI || self.location.href); + const url9 = new URL(self.location.href); + expect(url9.toString()).toBe(self.location.href); + const url10 = new URL(/* webpackIgnore: true */ self.location.href); + expect(url10.toString()).toBe(self.location.href); + const url11 = new URL(/* webpackIgnore: true */ ...args); + expect(url11.pathname.endsWith("file3.css")).toBe(true); +}); diff --git a/test/configCases/parsing/url-ignore/warnings.js b/test/configCases/parsing/url-ignore/warnings.js new file mode 100644 index 00000000000..3e31c655be4 --- /dev/null +++ b/test/configCases/parsing/url-ignore/warnings.js @@ -0,0 +1 @@ +module.exports = [/`webpackIgnore` expected a boolean, but received: test./]; diff --git a/test/configCases/parsing/url-ignore/webpack.config.js b/test/configCases/parsing/url-ignore/webpack.config.js new file mode 100644 index 00000000000..9787b026dbc --- /dev/null +++ b/test/configCases/parsing/url-ignore/webpack.config.js @@ -0,0 +1,10 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + publicPath: "/public/" + }, + experiments: { + outputModule: true + }, + target: ["web", "es2020"] +}; diff --git a/test/configCases/performance/many-async-imports/reexport.loader.js b/test/configCases/performance/many-async-imports/reexport.loader.js index f44ceced67a..3105e517fef 100644 --- a/test/configCases/performance/many-async-imports/reexport.loader.js +++ b/test/configCases/performance/many-async-imports/reexport.loader.js @@ -1,7 +1,8 @@ -module.exports = function() { +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { var str = "export default Promise.all([\n"; - for(var i = 0; i < 6; i++) { - for(var j = 0; j < 2; j++) { + for (var i = 0; i < 6; i++) { + for (var j = 0; j < 2; j++) { str += `import("./reexport.loader.js!?${i}"),\n`; } } diff --git a/test/configCases/performance/many-async-imports/test.filter.js b/test/configCases/performance/many-async-imports/test.filter.js deleted file mode 100644 index 8b7e505b1bf..00000000000 --- a/test/configCases/performance/many-async-imports/test.filter.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = function(config) { - return !/^v(4|6)/.test(process.version); -}; diff --git a/test/configCases/performance/many-async-imports/webpack.config.js b/test/configCases/performance/many-async-imports/webpack.config.js index 61e31872c6e..e30e85e9364 100644 --- a/test/configCases/performance/many-async-imports/webpack.config.js +++ b/test/configCases/performance/many-async-imports/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { optimization: { minimize: false diff --git a/test/configCases/performance/many-exports/file.loader.js b/test/configCases/performance/many-exports/file.loader.js index 6ec2268c91d..1dd13c65f5c 100644 --- a/test/configCases/performance/many-exports/file.loader.js +++ b/test/configCases/performance/many-exports/file.loader.js @@ -1,7 +1,8 @@ -module.exports = function() { +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { var str = ""; - for(var i = 0; i < 1000; i++) { + for (var i = 0; i < 1000; i++) { str += `export var a${i} = ${i};\n`; } return str; -} +}; diff --git a/test/configCases/performance/many-exports/reexport.loader.js b/test/configCases/performance/many-exports/reexport.loader.js index af755e8686a..e4a2a31352a 100644 --- a/test/configCases/performance/many-exports/reexport.loader.js +++ b/test/configCases/performance/many-exports/reexport.loader.js @@ -1,9 +1,10 @@ -module.exports = function() { - var str = "import * as i from \"./file.loader.js!\";\n"; +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { + var str = 'import * as i from "./file.loader.js!";\n'; str += "var sum = 0;\n"; - for(var i = 0; i < 1000; i++) { + for (var i = 0; i < 1000; i++) { str += `sum += i.a${i};\n`; } str += "export default sum;\n"; return str; -} +}; diff --git a/test/configCases/performance/many-exports/test.filter.js b/test/configCases/performance/many-exports/test.filter.js deleted file mode 100644 index 8b7e505b1bf..00000000000 --- a/test/configCases/performance/many-exports/test.filter.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = function(config) { - return !/^v(4|6)/.test(process.version); -}; diff --git a/test/configCases/performance/many-exports/webpack.config.js b/test/configCases/performance/many-exports/webpack.config.js index 61e31872c6e..e30e85e9364 100644 --- a/test/configCases/performance/many-exports/webpack.config.js +++ b/test/configCases/performance/many-exports/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { optimization: { minimize: false diff --git a/test/configCases/plugins/banner-plugin-hashing/index.js b/test/configCases/plugins/banner-plugin-hashing/index.js index 166837a7aeb..1fc9696013f 100644 --- a/test/configCases/plugins/banner-plugin-hashing/index.js +++ b/test/configCases/plugins/banner-plugin-hashing/index.js @@ -1,6 +1,6 @@ -const parseBanner = (banner) => { +const parseBanner = banner => { return banner - .slice(4,-3) + .slice(4, -3) .split(", ") .map(n => n.split(":")) .reduce((acc, val) => { @@ -12,13 +12,13 @@ const parseBanner = (banner) => { var source = require("fs") .readFileSync(__filename, "utf-8") .split("\n") - .slice(0,1)[0]; + .slice(0, 1)[0]; -const banner = parseBanner(source) -const REGEXP_HASH = /^[A-Za-z0-9]{20}$/ +const banner = parseBanner(source); +const REGEXP_HASH = /^[A-Za-z0-9]{20}$/; it("should interpolate file hash in chunk banner", () => { - expect(REGEXP_HASH.test(banner["hash"])).toBe(true); + expect(REGEXP_HASH.test(banner["fullhash"])).toBe(true); }); it("should interpolate chunkHash in chunk banner", () => { @@ -34,19 +34,27 @@ it("should interpolate name in chunk banner", () => { }); it("should interpolate basename in chunk banner", () => { - expect(banner["filebase"]).toBe("banner.js"); + expect(banner["base"]).toBe("banner.js"); }); it("should interpolate query in chunk banner", () => { expect(banner["query"]).toBe("?value"); }); +it("should interpolate path in chunk banner", () => { + expect(banner["path"]).toBe("dist/"); +}); + +it("should interpolate ext in chunk banner", () => { + expect(banner["ext"]).toBe(".js"); +}); + it("should parse entry into file in chunk banner", () => { - expect(banner["file"]).not.toBe(banner["filebase"]); + expect(banner["file"]).not.toBe(banner["base"]); }); it("should parse entry into name in chunk banner", () => { - expect(banner["filebase"]).not.toBe(banner["name"]); + expect(banner["base"]).not.toBe(banner["name"]); }); -require.include("./test.js"); +if (Math.random() < 0) require("./test.js"); diff --git a/test/configCases/plugins/banner-plugin-hashing/test.config.js b/test/configCases/plugins/banner-plugin-hashing/test.config.js index 2d283508eea..5d626611bc5 100644 --- a/test/configCases/plugins/banner-plugin-hashing/test.config.js +++ b/test/configCases/plugins/banner-plugin-hashing/test.config.js @@ -1,7 +1,5 @@ -var fs = require("fs"); - module.exports = { - findBundle: function(i, options) { + findBundle(i, options) { return "./dist/banner.js"; } }; diff --git a/test/configCases/plugins/banner-plugin-hashing/webpack.config.js b/test/configCases/plugins/banner-plugin-hashing/webpack.config.js index 5c51d328b66..5d62b4121ff 100644 --- a/test/configCases/plugins/banner-plugin-hashing/webpack.config.js +++ b/test/configCases/plugins/banner-plugin-hashing/webpack.config.js @@ -2,6 +2,7 @@ const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { node: { __dirname: false, @@ -17,7 +18,7 @@ module.exports = { plugins: [ new webpack.BannerPlugin({ banner: - "hash:[hash], chunkhash:[chunkhash], name:[name], filebase:[filebase], query:[query], file:[file]" + "fullhash:[fullhash], chunkhash:[chunkhash], name:[name], base:[base], query:[query], file:[file], path:[path], ext:[ext]" }) ] }; diff --git a/test/configCases/plugins/banner-plugin/index.js b/test/configCases/plugins/banner-plugin/index.js index 02653b73aeb..e25486c1af1 100644 --- a/test/configCases/plugins/banner-plugin/index.js +++ b/test/configCases/plugins/banner-plugin/index.js @@ -7,11 +7,21 @@ it("should contain banner in bundle0 chunk", () => { expect(source).toMatch("banner is a string"); expect(source).toMatch("banner is a function"); expect(source).toMatch("/*!\n * multiline\n * banner\n * bundle0\n */"); + expect(source).toMatch( + "/*!\n * trim trailing whitespace\n *\n * trailing whitespace\n */" + ); + expect(source).toMatch( + "/*!\n * trim trailing whitespace\n *\n * no trailing whitespace\n */" + ); + expect(source).not.toMatch(new RegExp("^/*! A test value in single file */$")); + expect(source).not.toMatch(new RegExp("^/*! Match test file */$")); }); it("should not contain banner in vendors chunk", () => { const source = fs.readFileSync(path.join(__dirname, "vendors.js"), "utf-8"); - expect(source).not.toMatch("A test value"); + expect(source).not.toMatch("/*! A test value */"); + expect(source).toMatch("/*! A test value in single file */"); + expect(source).toMatch("/*! Match test file */"); }); -require.include("./test.js"); +if (Math.random() < 0) require("./test.js"); diff --git a/test/configCases/plugins/banner-plugin/webpack.config.js b/test/configCases/plugins/banner-plugin/webpack.config.js index ed4baebb4d1..5591821323c 100644 --- a/test/configCases/plugins/banner-plugin/webpack.config.js +++ b/test/configCases/plugins/banner-plugin/webpack.config.js @@ -1,4 +1,6 @@ -var webpack = require("../../../../"); +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ module.exports = { node: { __dirname: false, @@ -18,8 +20,22 @@ module.exports = { banner: "A test value", exclude: ["vendors.js"] }), + new webpack.BannerPlugin({ + banner: "A test value in single file", + include: ["vendors.js"] + }), + new webpack.BannerPlugin({ + banner: "Match test file", + test: /vendors\.js$/ + }), new webpack.BannerPlugin({ banner: ({ chunk }) => `multiline\nbanner\n${chunk.name}` - }) + }), + new webpack.BannerPlugin( + "trim trailing whitespace\t \n\ntrailing whitespace " + ), + new webpack.BannerPlugin( + "trim trailing whitespace\t \n\nno trailing whitespace" + ) ] }; diff --git a/test/configCases/plugins/define-plugin-bigint/index.js b/test/configCases/plugins/define-plugin-bigint/index.js new file mode 100644 index 00000000000..b7d9c09f888 --- /dev/null +++ b/test/configCases/plugins/define-plugin-bigint/index.js @@ -0,0 +1,13 @@ +it("should define BIGINT", function() { + expect(BIGINT).toBe(9007199254740993n); + expect(typeof BIGINT).toBe("bigint"); + if (BIGINT !== 9007199254740993n) require("fail"); + if (typeof BIGINT !== "bigint") require("fail"); +}); +it("should define ZERO_BIGINT", function() { + expect(ZERO_BIGINT).toBe(0n); + expect(typeof ZERO_BIGINT).toBe("bigint"); + if (ZERO_BIGINT) require("fail"); + if (ZERO_BIGINT !== 0n) require("fail"); + if (typeof ZERO_BIGINT !== "bigint") require("fail"); +}); diff --git a/test/configCases/plugins/define-plugin-bigint/webpack.config.js b/test/configCases/plugins/define-plugin-bigint/webpack.config.js new file mode 100644 index 00000000000..47d5f73792e --- /dev/null +++ b/test/configCases/plugins/define-plugin-bigint/webpack.config.js @@ -0,0 +1,16 @@ +const DefinePlugin = require("../../../../").DefinePlugin; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + environment: { + bigIntLiteral: true + } + }, + plugins: [ + new DefinePlugin({ + BIGINT: BigInt("9007199254740993"), + ZERO_BIGINT: BigInt(0) + }) + ] +}; diff --git a/test/configCases/plugins/define-plugin-sub-key/foo.js b/test/configCases/plugins/define-plugin-sub-key/foo.js new file mode 100644 index 00000000000..ccda36f048c --- /dev/null +++ b/test/configCases/plugins/define-plugin-sub-key/foo.js @@ -0,0 +1,4 @@ + +export default { + bar: "test" +} diff --git a/test/configCases/plugins/define-plugin-sub-key/index.js b/test/configCases/plugins/define-plugin-sub-key/index.js new file mode 100644 index 00000000000..5b131670c04 --- /dev/null +++ b/test/configCases/plugins/define-plugin-sub-key/index.js @@ -0,0 +1,22 @@ + +import foo from './foo.js'; + +function works1() { + return foo.bar; +} + +function works2() { + const v = foo.bar; + return v; +} + +function works3() { + const v = foo.bar.baz; + return v; +} + +it("should compile and run", () => { + expect(works1()).toBe("test"); + expect(works2()).toBe("test"); + expect(works3()).toBe("test"); +}); diff --git a/test/configCases/plugins/define-plugin-sub-key/webpack.config.js b/test/configCases/plugins/define-plugin-sub-key/webpack.config.js new file mode 100644 index 00000000000..8655194c02a --- /dev/null +++ b/test/configCases/plugins/define-plugin-sub-key/webpack.config.js @@ -0,0 +1,10 @@ +const DefinePlugin = require("../../../../").DefinePlugin; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [ + new DefinePlugin({ + "foo.bar.baz": '"test"' + }) + ] +}; diff --git a/test/configCases/plugins/define-plugin/index.js b/test/configCases/plugins/define-plugin/index.js index dfd714a5544..33282fba0f8 100644 --- a/test/configCases/plugins/define-plugin/index.js +++ b/test/configCases/plugins/define-plugin/index.js @@ -1,81 +1,197 @@ -/* globals it, should */ +function donotcallme() { + expect("asi unsafe call happened").toBe(false); +} + it("should define FALSE", function() { expect(FALSE).toBe(false); - expect((typeof TRUE)).toBe("boolean"); + expect(typeof FALSE).toBe("boolean"); var x = require(FALSE ? "fail" : "./dir/a"); var y = FALSE ? require("fail") : require("./dir/a"); }); - +it("should define TRUE", function() { + expect(TRUE).toBe(true); + expect(typeof TRUE).toBe("boolean"); + var x = require(TRUE ? "./dir/a" : "fail"); + var y = TRUE ? require("./dir/a") : require("fail"); +}); it("should define CODE", function() { expect(CODE).toBe(3); - expect((typeof CODE)).toBe("number"); - if(CODE !== 3) require("fail"); - if(typeof CODE !== "number") require("fail"); + expect(typeof CODE).toBe("number"); + if (CODE !== 3) require("fail"); + if (typeof CODE !== "number") require("fail"); }); it("should define FUNCTION", function() { - expect((FUNCTION(5))).toBe(6); - expect((typeof FUNCTION)).toBe("function"); - if(typeof FUNCTION !== "function") require("fail"); + expect(FUNCTION(5)).toBe(6); + expect(typeof FUNCTION).toBe("function"); + if (typeof FUNCTION !== "function") require("fail"); +}); +it("should define NULL", function() { + expect(NULL).toBeNull(); + if (NULL) require("fail"); + if (NULL !== null) require("fail"); + if (typeof NULL !== "object") require("fail"); }); it("should define UNDEFINED", function() { - expect((typeof UNDEFINED)).toBe("undefined"); - if(typeof UNDEFINED !== "undefined") require("fail"); + expect(typeof UNDEFINED).toBe("undefined"); + if (typeof UNDEFINED !== "undefined") require("fail"); +}); +it("should define NUMBER", function() { + expect(NUMBER).toBe(100.05); + expect(typeof NUMBER).toBe("number"); + if (NUMBER !== 100.05) require("fail"); + if (typeof NUMBER !== "number") require("fail"); +}); +it("should define ZERO", function() { + expect(ZERO).toBe(0); + expect(typeof ZERO).toBe("number"); + if (ZERO !== 0) require("fail"); + if (typeof ZERO !== "number") require("fail"); +}); +it("should define ONE", function() { + expect(ONE).toBe(1); + expect(typeof ONE).toBe("number"); + expect(42 / ONE).toBe(42); + if (ONE !== 1) require("fail"); + if (typeof ONE !== "number") require("fail"); +}); +it("should define BIGINT", function() { + expect(BIGINT).toBe(9007199254740993n); + expect(typeof BIGINT).toBe("bigint"); +}); +it("should define ZERO_BIGINT", function() { + expect(ZERO_BIGINT).toBe(0n); + expect(typeof BIGINT).toBe("bigint"); +}); +it("should define POSITIVE_ZERO", function() { + expect(POSITIVE_ZERO).toBe(+0); + expect(POSITIVE_ZERO).toBe(0); + expect(typeof POSITIVE_ZERO).toBe("number"); + expect(Object.is(POSITIVE_ZERO, 0)).toBe(true); + expect(Object.is(POSITIVE_ZERO, +0)).toBe(true); + expect(Object.is(POSITIVE_ZERO, -0)).toBe(false); + if (POSITIVE_ZERO) require("fail"); + if (typeof POSITIVE_ZERO !== "number") require("fail"); + if (POSITIVE_ZERO !== +0) require("fail"); + if (POSITIVE_ZERO != +0) require("fail"); + if (POSITIVE_ZERO !== 0) require("fail"); + if (POSITIVE_ZERO != 0) require("fail"); +}); +it("should define NEGATIVE_ZER0", function() { + expect(NEGATIVE_ZER0).toBe(-0); + expect(typeof NEGATIVE_ZER0).toBe("number"); + expect(Object.is(NEGATIVE_ZER0, 0)).toBe(false); + expect(Object.is(NEGATIVE_ZER0, +0)).toBe(false); + expect(Object.is(NEGATIVE_ZER0, -0)).toBe(true); + if (NEGATIVE_ZER0) require("fail"); + if (typeof NEGATIVE_ZER0 !== "number") require("fail"); + if (NEGATIVE_ZER0 !== +0) require("fail"); + if (NEGATIVE_ZER0 != +0) require("fail"); + if (NEGATIVE_ZER0 !== 0) require("fail"); + if (NEGATIVE_ZER0 != 0) require("fail"); +}); +it("should define NEGATIVE_NUMBER", function() { + expect(NEGATIVE_NUMBER).toBe(-100.25); + expect(typeof NEGATIVE_NUMBER).toBe("number"); + expect(100.25 / NEGATIVE_NUMBER).toBe(-1); + if (!NEGATIVE_NUMBER) require("fail"); + if (typeof NEGATIVE_NUMBER !== "number") require("fail"); +}); +it("should define POSITIVE_NUMBER", function() { + expect(POSITIVE_NUMBER).toBe(+100.25); + expect(typeof POSITIVE_NUMBER).toBe("number"); + expect(POSITIVE_NUMBER / 100.25).toBe(1); + if (!POSITIVE_NUMBER) require("fail"); + if (typeof POSITIVE_NUMBER !== "number") require("fail"); +}); +it("should define STRING", function() { + expect(STRING).toBe("string"); + expect(typeof STRING).toBe("string"); + if (!STRING) require("fail"); + if (typeof STRING !== "string") require("fail"); + if (STRING === "") require("fail"); + if (STRING == "") require("fail"); +}); +it("should define EMPTY_STRING", function() { + expect(EMPTY_STRING).toBe(""); + expect(typeof EMPTY_STRING).toBe("string"); + if (EMPTY_STRING) require("fail"); + if (typeof EMPTY_STRING !== "string") require("fail"); + if (EMPTY_STRING !== "") require("fail"); + if (EMPTY_STRING != "") require("fail"); }); it("should define REGEXP", function() { expect(REGEXP.toString()).toBe("/abc/i"); - expect((typeof REGEXP)).toBe("object"); - if(typeof REGEXP !== "object") require("fail"); + expect(typeof REGEXP).toBe("object"); + if (typeof REGEXP !== "object") require("fail"); }); it("should define OBJECT", function() { var o = OBJECT; expect(o.SUB.FUNCTION(10)).toBe(11); }); it("should define OBJECT.SUB.CODE", function() { - expect((typeof OBJECT.SUB.CODE)).toBe("number"); + (donotcallme) + OBJECT; + (donotcallme) + OBJECT.SUB; + expect(typeof OBJECT.SUB.CODE).toBe("number"); expect(OBJECT.SUB.CODE).toBe(3); - if(OBJECT.SUB.CODE !== 3) require("fail"); - if(typeof OBJECT.SUB.CODE !== "number") require("fail"); + if (OBJECT.SUB.CODE !== 3) require("fail"); + if (typeof OBJECT.SUB.CODE !== "number") require("fail"); (function(sub) { // should not crash expect(sub.CODE).toBe(3); - }(OBJECT.SUB)); + })(OBJECT.SUB); }); it("should define OBJECT.SUB.STRING", function() { - expect((typeof OBJECT.SUB.STRING)).toBe("string"); + expect(typeof OBJECT.SUB.STRING).toBe("string"); expect(OBJECT.SUB.STRING).toBe("string"); - if(OBJECT.SUB.STRING !== "string") require("fail"); - if(typeof OBJECT.SUB.STRING !== "string") require("fail"); + if (OBJECT.SUB.STRING !== "string") require("fail"); + if (typeof OBJECT.SUB.STRING !== "string") require("fail"); (function(sub) { // should not crash expect(sub.STRING).toBe("string"); - }(OBJECT.SUB)); + })(OBJECT.SUB); +}); +it("should define ARRAY", function() { + (donotcallme) + ARRAY; + expect(Array.isArray(ARRAY)).toBeTruthy(); + expect(ARRAY).toHaveLength(2); +}); +it("should define ARRAY[0]", function() { + expect(ARRAY[0]).toBe(2); +}); +it("should define ARRAY[1][0]", function() { + expect(Array.isArray(ARRAY[1])).toBeTruthy(); + expect(ARRAY[1]).toHaveLength(1); + expect(ARRAY[1][0]).toBe("six"); }); it("should define process.env.DEFINED_NESTED_KEY", function() { - expect((process.env.DEFINED_NESTED_KEY)).toBe(5); - expect((typeof process.env.DEFINED_NESTED_KEY)).toBe("number"); - if(process.env.DEFINED_NESTED_KEY !== 5) require("fail"); - if(typeof process.env.DEFINED_NESTED_KEY !== "number") require("fail"); + expect(process.env.DEFINED_NESTED_KEY).toBe(5); + expect(typeof process.env.DEFINED_NESTED_KEY).toBe("number"); + if (process.env.DEFINED_NESTED_KEY !== 5) require("fail"); + if (typeof process.env.DEFINED_NESTED_KEY !== "number") require("fail"); var x = process.env.DEFINED_NESTED_KEY; expect(x).toBe(5); var indirect = process.env; - expect((indirect.DEFINED_NESTED_KEY)).toBe(5); + expect(indirect.DEFINED_NESTED_KEY).toBe(5); (function(env) { - expect((env.DEFINED_NESTED_KEY)).toBe(5); - expect((typeof env.DEFINED_NESTED_KEY)).toBe("number"); - if(env.DEFINED_NESTED_KEY !== 5) require("fail"); - if(typeof env.DEFINED_NESTED_KEY !== "number") require("fail"); + expect(env.DEFINED_NESTED_KEY).toBe(5); + expect(typeof env.DEFINED_NESTED_KEY).toBe("number"); + if (env.DEFINED_NESTED_KEY !== 5) require("fail"); + if (typeof env.DEFINED_NESTED_KEY !== "number") require("fail"); var x = env.DEFINED_NESTED_KEY; expect(x).toBe(5); - }(process.env)); + })(process.env); }); it("should define process.env.DEFINED_NESTED_KEY_STRING", function() { - if(process.env.DEFINED_NESTED_KEY_STRING !== "string") require("fail"); + if (process.env.DEFINED_NESTED_KEY_STRING !== "string") require("fail"); }); it("should assign to process.env", function() { process.env.TEST = "test"; @@ -85,7 +201,7 @@ it("should not have brackets on start", function() { function f() { throw new Error("should not be called"); } - f // <- no semicolon here + f; // <- no semicolon here OBJECT; }); @@ -100,7 +216,7 @@ it("should not explode on recursive statements", function() { }); it("should evaluate composed expressions (issue 5100)", function() { - if(!module.hot && process.env.DEFINED_NESTED_KEY_STRING === "string") { + if (!module.hot && process.env.DEFINED_NESTED_KEY_STRING === "string") { // ok } else { require("fail"); @@ -121,14 +237,61 @@ it("should check that runtimeValue callback argument is a module", function() { it("should expand properly", function() { const a = require("./dir/a"); - var tmp = ''; - expect(require('./dir/' + A_DOT_J + tmp + 's')).toBe(a); - expect(require('./dir/' + tmp + A_DOT_J + 's')).toBe(a); - expect(require('./dir/' + tmp + A_DOT_J + tmp + 's')).toBe(a); - expect(require('./dir/' + tmp + A_DOT_J + (tmp + 's'))).toBe(a); - expect(require('./dir/' + tmp + (A_DOT_J + tmp + 's'))).toBe(a); - expect(require('./dir/' + tmp + (A_DOT_J + tmp) + 's')).toBe(a); - expect(require('./dir/' + (tmp + A_DOT_J + tmp + 's'))).toBe(a); - expect(require('./dir/' + (tmp + A_DOT_J + tmp) + 's')).toBe(a); - expect(require('./dir/' + (tmp + A_DOT_J) + tmp + 's')).toBe(a); + var tmp = ""; + expect(require("./dir/" + A_DOT_J + tmp + "s")).toBe(a); + expect(require("./dir/" + tmp + A_DOT_J + "s")).toBe(a); + expect(require("./dir/" + tmp + A_DOT_J + tmp + "s")).toBe(a); + expect(require("./dir/" + tmp + A_DOT_J + (tmp + "s"))).toBe(a); + expect(require("./dir/" + tmp + (A_DOT_J + tmp + "s"))).toBe(a); + expect(require("./dir/" + tmp + (A_DOT_J + tmp) + "s")).toBe(a); + expect(require("./dir/" + (tmp + A_DOT_J + tmp + "s"))).toBe(a); + expect(require("./dir/" + (tmp + A_DOT_J + tmp) + "s")).toBe(a); + expect(require("./dir/" + (tmp + A_DOT_J) + tmp + "s")).toBe(a); }); + +it("destructuring assignment", () => { + const {used} = OBJECT2; + const {['used']: used2, used: used3} = OBJECT2.sub; + expect(used).toBe(used2); + expect(used).toBe(used3); +}); + +it('should allow shorthand property (issue #16764)', () => { + const simple = { ONE, TRUE, NULL, STRING, BIGINT, NEGATIVE_NUMBER }; + expect(simple).toStrictEqual({ + ONE: 1, + TRUE: true, + NULL: null, + STRING: "string", + BIGINT: BigInt("9007199254740993"), + NEGATIVE_NUMBER: -100.25 + }) + + const func = { FUNCTION }; + expect(func.FUNCTION(3)).toBe(4); + expect(typeof func.FUNCTION).toBe("function"); + + const code = { CODE }; + expect(code.CODE).toBe(3); + expect(typeof code.CODE).toBe("number"); + + + const regex = { REGEXP }; + expect(regex.REGEXP.toString()).toBe("/abc/i"); + expect(typeof regex.REGEXP).toBe("object"); + + const nested = { OBJECT } + expect(nested.OBJECT.SUB.FUNCTION(7)).toBe(8); + expect(nested.OBJECT.SUB.CODE).toBe(3); + expect(nested.OBJECT.SUB.UNDEFINED).toBeUndefined(); + expect(nested.OBJECT.SUB.REGEXP.toString()).toBe("/abc/i"); + expect(nested.OBJECT.SUB.STRING).toBe("string"); + + + const array = { ARRAY } + expect(array).toStrictEqual({ ARRAY: [2, ['six']] }) +}) + +it("fails for unknown property", () => { + expect(() => ({ UNKNOWN })).toThrowError("UNKNOWN is not defined") +}) \ No newline at end of file diff --git a/test/configCases/plugins/define-plugin/webpack.config.js b/test/configCases/plugins/define-plugin/webpack.config.js index 60842944ec2..4927a4370ce 100644 --- a/test/configCases/plugins/define-plugin/webpack.config.js +++ b/test/configCases/plugins/define-plugin/webpack.config.js @@ -1,12 +1,31 @@ -var DefinePlugin = require("../../../../lib/DefinePlugin"); -const Module = require("../../../../lib/Module"); +const DefinePlugin = require("../../../../").DefinePlugin; +const Module = require("../../../../").Module; + +/** @type {import("../../../../").Configuration} */ module.exports = { plugins: [ new DefinePlugin({ TRUE: true, FALSE: false, + NULL: null, UNDEFINED: undefined, - FUNCTION: /* istanbul ignore next */ function(a) { + NUMBER: 100.05, + ZERO: 0, + ONE: 1, + STRING: '"string"', + EMPTY_STRING: '""', + BIGINT: BigInt("9007199254740993"), + ZERO_BIGINT: BigInt(0), + POSITIVE_ZERO: +0, + NEGATIVE_ZER0: -0, + NEGATIVE_NUMBER: -100.25, + POSITIVE_NUMBER: +100.25, + /** + * @param {number} a a + * @returns {number} result + */ + // eslint-disable-next-line object-shorthand + FUNCTION: /* istanbul ignore next */ function (a) { return a + 1; }, CODE: "(1+2)", @@ -14,7 +33,12 @@ module.exports = { OBJECT: { SUB: { UNDEFINED: undefined, - FUNCTION: /* istanbul ignore next */ function(a) { + /** + * @param {number} a a + * @returns {number} result + */ + // eslint-disable-next-line object-shorthand + FUNCTION: /* istanbul ignore next */ function (a) { return a + 1; }, CODE: "(1+2)", @@ -22,6 +46,7 @@ module.exports = { STRING: JSON.stringify("string") } }, + ARRAY: [2, [JSON.stringify("six")]], "process.env.DEFINED_NESTED_KEY": 5, "process.env.DEFINED_NESTED_KEY_STRING": '"string"', "typeof wurst": "typeof suppe", @@ -29,11 +54,19 @@ module.exports = { wurst: "suppe", suppe: "wurst", RUNTIMEVALUE_CALLBACK_ARGUMENT_IS_A_MODULE: DefinePlugin.runtimeValue( - function({ module }) { + function ({ module }) { return module instanceof Module; } ), - A_DOT_J: '"a.j"' + A_DOT_J: '"a.j"', + OBJECT2: { + used: 1, + unused: "(() => throw new Error('unused property was rendered'))()", + sub: { + used: 1, + unused: "(() => throw new Error('unused property was rendered'))()" + } + } }) ] }; diff --git a/test/configCases/plugins/environment-plugin/errors.js b/test/configCases/plugins/environment-plugin/errors.js index 3f39721426b..b393e2ba6ab 100644 --- a/test/configCases/plugins/environment-plugin/errors.js +++ b/test/configCases/plugins/environment-plugin/errors.js @@ -1,36 +1,60 @@ -const variables = ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff', 'ggg', 'hhh', 'iii']; -const modules = [{ - name: 'aaa', - variables: ['aaa'] -}, { - name: 'bbbccc', - variables: ['bbb', 'ccc'] -}, { - name: 'ddd', - variables: [] -}, { - name: 'eeefff', - variables: ['eee', 'fff'] -}, { - name: 'ggghhh', - variables: ['ggg', 'hhh'] -}, { - name: 'iii', - variables: ['iii'] -}]; +const variables = [ + "aaa", + "bbb", + "ccc", + "ddd", + "eee", + "fff", + "ggg", + "hhh", + "iii" +]; +const modules = [ + { + name: "aaa", + variables: ["aaa"] + }, + { + name: "bbbccc", + variables: ["bbb", "ccc"] + }, + { + name: "ddd", + variables: [], + allowedErrors: [ + [{ compilerPath: /ddd/ }, /DDD environment variable is undefined./] + ] + }, + { + name: "eeefff", + variables: ["eee", "fff"] + }, + { + name: "ggghhh", + variables: ["ggg", "hhh"] + }, + { + name: "iii", + variables: ["iii"] + } +]; // build an array of regular expressions of expected errors const regex = []; -modules.forEach(module => { - variables.forEach(variable => { - if (module.variables.indexOf(variable) === -1) { +for (const module of modules) { + for (const variable of variables) { + if (!module.variables.includes(variable)) { // the module doesn't include the env variable, an error is expected when requiring the variable regex.push([ - new RegExp(`(${module.name})`), - new RegExp(`Can't resolve '${variable}'`), + { compilerPath: new RegExp(`${module.name}`) }, + new RegExp(`Can't resolve '${variable}'`) ]); } - }); -}); + } + + if (module.allowedErrors) { + regex.push(...module.allowedErrors); + } +} module.exports = regex; diff --git a/test/configCases/plugins/environment-plugin/index.js b/test/configCases/plugins/environment-plugin/index.js index 9075e898316..e6627990895 100644 --- a/test/configCases/plugins/environment-plugin/index.js +++ b/test/configCases/plugins/environment-plugin/index.js @@ -1,35 +1,28 @@ +var never = false; + it("should import a single process.env var", () => { - if(process.env.AAA !== "aaa") - require.include("aaa"); + if (process.env.AAA !== "aaa") if (never) require("aaa"); }); it("should import multiple process.env vars", () => { - if(process.env.BBB !== "bbb") - require.include("bbb"); - if(process.env.CCC !== "ccc") - require.include("ccc"); + if (process.env.BBB !== "bbb") if (never) require("bbb"); + if (process.env.CCC !== "ccc") if (never) require("ccc"); }); -it("should warn when a process.env variable is undefined", () => { - if(process.env.DDD !== "ddd") - require.include("ddd"); +it("should error when a process.env variable is undefined", () => { + if (process.env.DDD !== "ddd") if (never) require("ddd"); }); it("should import an array of process.env vars", () => { - if(process.env.EEE !== "eee") - require.include("eee"); - if(process.env.FFF !== "fff") - require.include("fff"); + if (process.env.EEE !== "eee") if (never) require("eee"); + if (process.env.FFF !== "fff") if (never) require("fff"); }); it("should import multiple process.env var with default values", () => { - if(process.env.GGG !== "ggg") - require.include("ggg"); - if(process.env.HHH !== "hhh") - require.include("hhh"); + if (process.env.GGG !== "ggg") if (never) require("ggg"); + if (process.env.HHH !== "hhh") if (never) require("hhh"); }); it("should import process.env var with empty value", () => { - if(process.env.III !== "") - require.include("iii"); + if (process.env.III !== "") if (never) require("iii"); }); diff --git a/test/configCases/plugins/environment-plugin/warnings.js b/test/configCases/plugins/environment-plugin/warnings.js deleted file mode 100644 index 8f738709c57..00000000000 --- a/test/configCases/plugins/environment-plugin/warnings.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = [ - [/(ddd)/, /DDD environment variable is undefined./] -]; diff --git a/test/configCases/plugins/environment-plugin/webpack.config.js b/test/configCases/plugins/environment-plugin/webpack.config.js index aee27dae30e..132ce72aa8c 100644 --- a/test/configCases/plugins/environment-plugin/webpack.config.js +++ b/test/configCases/plugins/environment-plugin/webpack.config.js @@ -1,6 +1,6 @@ "use strict"; -const EnvironmentPlugin = require("../../../../lib/EnvironmentPlugin"); +const EnvironmentPlugin = require("../../../../").EnvironmentPlugin; process.env.AAA = "aaa"; process.env.BBB = "bbb"; @@ -10,6 +10,7 @@ process.env.FFF = "fff"; process.env.GGG = "ggg"; process.env.III = ""; +/** @type {import("../../../../").Configuration[]} */ module.exports = [ { name: "aaa", diff --git a/test/configCases/plugins/lib-manifest-plugin/webpack.config.js b/test/configCases/plugins/lib-manifest-plugin/webpack.config.js index 2b9b7fc2b52..e409f28528b 100644 --- a/test/configCases/plugins/lib-manifest-plugin/webpack.config.js +++ b/test/configCases/plugins/lib-manifest-plugin/webpack.config.js @@ -1,20 +1,18 @@ -var path = require("path"); -var LibManifestPlugin = require("../../../../lib/LibManifestPlugin"); +const path = require("path"); +const LibManifestPlugin = require("../../../../").LibManifestPlugin; -module.exports = { +/** @type {(env: Env, options: TestOptions) => import("../../../../").Configuration} */ +module.exports = (env, { testPath }) => ({ entry: { bundle0: ["./"] }, plugins: [ new LibManifestPlugin({ - path: path.resolve( - __dirname, - "../../../js/config/plugins/lib-manifest-plugin/[name]-manifest.json" - ), - name: "[name]_[hash]" + path: path.resolve(testPath, "[name]-manifest.json"), + name: "[name]_[fullhash]" }) ], node: { __dirname: false } -}; +}); diff --git a/test/configCases/plugins/limit-chunk-count-plugin/a.js b/test/configCases/plugins/limit-chunk-count-plugin/a.js new file mode 100644 index 00000000000..42ca9ffa910 --- /dev/null +++ b/test/configCases/plugins/limit-chunk-count-plugin/a.js @@ -0,0 +1,3 @@ +const value = (await import("./b")).default; + +export { value }; diff --git a/test/configCases/plugins/limit-chunk-count-plugin/b.js b/test/configCases/plugins/limit-chunk-count-plugin/b.js new file mode 100644 index 00000000000..d0cf1e996dd --- /dev/null +++ b/test/configCases/plugins/limit-chunk-count-plugin/b.js @@ -0,0 +1,3 @@ +const value = (await import("./c")).default; + +export default value; diff --git a/test/configCases/plugins/limit-chunk-count-plugin/c.js b/test/configCases/plugins/limit-chunk-count-plugin/c.js new file mode 100644 index 00000000000..bebcb58a8ea --- /dev/null +++ b/test/configCases/plugins/limit-chunk-count-plugin/c.js @@ -0,0 +1 @@ +export default "fine"; diff --git a/test/configCases/plugins/limit-chunk-count-plugin/index.js b/test/configCases/plugins/limit-chunk-count-plugin/index.js new file mode 100644 index 00000000000..35134a0b495 --- /dev/null +++ b/test/configCases/plugins/limit-chunk-count-plugin/index.js @@ -0,0 +1,5 @@ +it("should merge chunks", async () => { + const { value } = await import("./a"); + expect(value).toBe("fine") +}); + diff --git a/test/configCases/plugins/limit-chunk-count-plugin/test.config.js b/test/configCases/plugins/limit-chunk-count-plugin/test.config.js new file mode 100644 index 00000000000..0c4cdb95323 --- /dev/null +++ b/test/configCases/plugins/limit-chunk-count-plugin/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["main.js"]; + } +}; diff --git a/test/configCases/plugins/limit-chunk-count-plugin/test.js b/test/configCases/plugins/limit-chunk-count-plugin/test.js new file mode 100644 index 00000000000..c9d8865844b --- /dev/null +++ b/test/configCases/plugins/limit-chunk-count-plugin/test.js @@ -0,0 +1,3 @@ +var foo = {}; + +module.exports = foo; diff --git a/test/configCases/plugins/limit-chunk-count-plugin/vendors.js b/test/configCases/plugins/limit-chunk-count-plugin/vendors.js new file mode 100644 index 00000000000..39ad0d4e1e0 --- /dev/null +++ b/test/configCases/plugins/limit-chunk-count-plugin/vendors.js @@ -0,0 +1,3 @@ +var bar = {}; + +module.exports = bar; diff --git a/test/configCases/plugins/limit-chunk-count-plugin/webpack.config.js b/test/configCases/plugins/limit-chunk-count-plugin/webpack.config.js new file mode 100644 index 00000000000..d4d76bcc2a3 --- /dev/null +++ b/test/configCases/plugins/limit-chunk-count-plugin/webpack.config.js @@ -0,0 +1,14 @@ +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + node: { + __dirname: false, + __filename: false + }, + entry: "./index.js", + output: { + filename: "[name].js" + }, + plugins: [new webpack.optimize.LimitChunkCountPlugin({ maxChunks: 1 })] +}; diff --git a/test/configCases/plugins/loader-options-plugin/loader.js b/test/configCases/plugins/loader-options-plugin/loader.js index 7374ef2b557..8fcf0774460 100644 --- a/test/configCases/plugins/loader-options-plugin/loader.js +++ b/test/configCases/plugins/loader-options-plugin/loader.js @@ -1,6 +1,10 @@ -module.exports = function() { - return "module.exports = " + JSON.stringify({ - minimize: this.minimize, - jsfile: this.jsfile - }); +/** @type {import("../../../../").LoaderDefinition<{}, { minimize: boolean, jsfile: boolean }>} */ +module.exports = function () { + return ( + "module.exports = " + + JSON.stringify({ + minimize: this.minimize, + jsfile: this.jsfile + }) + ); }; diff --git a/test/configCases/plugins/loader-options-plugin/webpack.config.js b/test/configCases/plugins/loader-options-plugin/webpack.config.js index 57efbcfad56..be4a90d7fa7 100644 --- a/test/configCases/plugins/loader-options-plugin/webpack.config.js +++ b/test/configCases/plugins/loader-options-plugin/webpack.config.js @@ -1,5 +1,6 @@ -var webpack = require("../../../../"); +const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { plugins: [ new webpack.LoaderOptionsPlugin({ diff --git a/test/configCases/plugins/min-chunk-size/webpack.config.js b/test/configCases/plugins/min-chunk-size/webpack.config.js index 9ab2871e46a..f9dd2f4eda6 100644 --- a/test/configCases/plugins/min-chunk-size/webpack.config.js +++ b/test/configCases/plugins/min-chunk-size/webpack.config.js @@ -1,5 +1,6 @@ -var webpack = require("../../../../"); +const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { plugins: [ new webpack.optimize.MinChunkSizePlugin({ diff --git a/test/configCases/plugins/mini-css-extract-plugin/a.css b/test/configCases/plugins/mini-css-extract-plugin/a.css new file mode 100644 index 00000000000..8cbf1faa6cd --- /dev/null +++ b/test/configCases/plugins/mini-css-extract-plugin/a.css @@ -0,0 +1,5 @@ +@import "./dependency.css"; + +.a { + color: red; +} diff --git a/test/configCases/plugins/mini-css-extract-plugin/a.js b/test/configCases/plugins/mini-css-extract-plugin/a.js new file mode 100644 index 00000000000..db6c130531a --- /dev/null +++ b/test/configCases/plugins/mini-css-extract-plugin/a.js @@ -0,0 +1,63 @@ +import "./a.css"; + +const fs = __non_webpack_require__("fs"); +const path = __non_webpack_require__("path"); + +it("a should load a chunk with css", () => { + const linkStart = document.getElementsByTagName("link").length; + const scriptStart = document.getElementsByTagName("script").length; + const promise = import("./chunk"); + + const links = document.getElementsByTagName("link").slice(linkStart); + const scripts = document.getElementsByTagName("script").slice(scriptStart); + + expect(links.length).toBe(1); + expect(scripts.length).toBe(1); + links[0].onload({ type: "load" }); + __non_webpack_require__( + scripts[0].src.replace("https://test.cases/path", ".") + ); + + const css = fs + .readFileSync( + path.resolve( + __dirname, + links[0].href.replace("https://test.cases/path", ".") + ), + "utf-8" + ) + .trim(); + expect(css).toMatchInlineSnapshot(` + ".chunk { + color: red; + }" + `); + + return promise; +}); + +it("a should generate correct css", () => { + const css = fs.readFileSync(path.resolve(__dirname, "a.css"), "utf-8").trim(); + expect(css).toMatchInlineSnapshot(` + ".dependency { + color: red; + } + + .a { + color: red; + }" + `); +}); + +it("c should generate correct css", () => { + const css = fs.readFileSync(path.resolve(__dirname, "c.css"), "utf-8").trim(); + expect(css).toMatchInlineSnapshot(` + ".dependency { + color: red; + } + + .c { + color: red; + }" + `); +}); diff --git a/test/configCases/plugins/mini-css-extract-plugin/b.css b/test/configCases/plugins/mini-css-extract-plugin/b.css new file mode 100644 index 00000000000..869690c300d --- /dev/null +++ b/test/configCases/plugins/mini-css-extract-plugin/b.css @@ -0,0 +1,3 @@ +.b { + color: red; +} diff --git a/test/configCases/plugins/mini-css-extract-plugin/b.js b/test/configCases/plugins/mini-css-extract-plugin/b.js new file mode 100644 index 00000000000..2ab6e639d10 --- /dev/null +++ b/test/configCases/plugins/mini-css-extract-plugin/b.js @@ -0,0 +1,68 @@ +import "./b.css"; + +const fs = __non_webpack_require__("fs"); +const path = __non_webpack_require__("path"); + +it("b should load a chunk with css", () => { + const linkStart = document.getElementsByTagName("link").length; + const scriptStart = document.getElementsByTagName("script").length; + const promise = import("./chunk"); + + const links = document.getElementsByTagName("link").slice(linkStart); + const scripts = document.getElementsByTagName("script").slice(scriptStart); + + expect(links.length).toBe(1); + expect(scripts.length).toBe(1); + links[0].onload({ type: "load" }); + __non_webpack_require__( + scripts[0].src.replace("https://test.cases/path", ".") + ); + + return promise; +}); + +it("b should load a css chunk", () => { + const linkStart = document.getElementsByTagName("link").length; + const scriptStart = document.getElementsByTagName("script").length; + const promise = import("./d.css"); + + const links = document.getElementsByTagName("link").slice(linkStart); + const scripts = document.getElementsByTagName("script").slice(scriptStart); + + expect(links.length).toBe(1); + expect(scripts.length).toBe(1); + links[0].onload({ type: "load" }); + __non_webpack_require__( + scripts[0].src.replace("https://test.cases/path", ".") + ); + + const css = fs + .readFileSync( + path.resolve( + __dirname, + links[0].href.replace("https://test.cases/path", ".") + ), + "utf-8" + ) + .trim(); + expect(css).toMatchInlineSnapshot(` + ".dependency { + color: red; + } + + .d { + color: red; + }" + `); + + return promise; +}); + +it("b should generate correct css", () => { + const css = fs.readFileSync(path.resolve(__dirname, "b.css"), "utf-8").trim(); + expect(css).toMatchInlineSnapshot(` + ".b { + color: red; + }" + `); +}); diff --git a/test/configCases/plugins/mini-css-extract-plugin/c.css b/test/configCases/plugins/mini-css-extract-plugin/c.css new file mode 100644 index 00000000000..3ade9e17e23 --- /dev/null +++ b/test/configCases/plugins/mini-css-extract-plugin/c.css @@ -0,0 +1,5 @@ +@import "./dependency.css"; + +.c { + color: red; +} diff --git a/test/configCases/plugins/mini-css-extract-plugin/chunk.css b/test/configCases/plugins/mini-css-extract-plugin/chunk.css new file mode 100644 index 00000000000..aad283b7bca --- /dev/null +++ b/test/configCases/plugins/mini-css-extract-plugin/chunk.css @@ -0,0 +1,5 @@ +@import "./dependency.css"; + +.chunk { + color: red; +} diff --git a/test/configCases/plugins/mini-css-extract-plugin/chunk.js b/test/configCases/plugins/mini-css-extract-plugin/chunk.js new file mode 100644 index 00000000000..a39adf003eb --- /dev/null +++ b/test/configCases/plugins/mini-css-extract-plugin/chunk.js @@ -0,0 +1,3 @@ +import "./chunk.css"; + +export default 42; diff --git a/test/configCases/plugins/mini-css-extract-plugin/d.css b/test/configCases/plugins/mini-css-extract-plugin/d.css new file mode 100644 index 00000000000..67923eda268 --- /dev/null +++ b/test/configCases/plugins/mini-css-extract-plugin/d.css @@ -0,0 +1,5 @@ +@import "./dependency.css"; + +.d { + color: red; +} diff --git a/test/configCases/plugins/mini-css-extract-plugin/dependency.css b/test/configCases/plugins/mini-css-extract-plugin/dependency.css new file mode 100644 index 00000000000..9e006e4b0c5 --- /dev/null +++ b/test/configCases/plugins/mini-css-extract-plugin/dependency.css @@ -0,0 +1,3 @@ +.dependency { + color: red; +} diff --git a/test/configCases/plugins/mini-css-extract-plugin/test.config.js b/test/configCases/plugins/mini-css-extract-plugin/test.config.js new file mode 100644 index 00000000000..393afd969c7 --- /dev/null +++ b/test/configCases/plugins/mini-css-extract-plugin/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return [`${i}_a.js`, `${i}_b.js`, `${i}_c.js`]; + } +}; diff --git a/test/configCases/plugins/mini-css-extract-plugin/webpack.config.js b/test/configCases/plugins/mini-css-extract-plugin/webpack.config.js new file mode 100644 index 00000000000..4c30ac8871e --- /dev/null +++ b/test/configCases/plugins/mini-css-extract-plugin/webpack.config.js @@ -0,0 +1,67 @@ +const MCEP = require("mini-css-extract-plugin"); + +/** @typedef {import("../../../../").StatsCompilation} StatsCompilation */ + +/** @type {(i: number, options?: import("mini-css-extract-plugin").PluginOptions) => import("../../../../").Configuration} */ +const config = (i, options) => ({ + entry: { + a: "./a", + b: "./b", + c: "./c.css", + x: "./x" // also imports chunk but with different exports + }, + output: { + filename: `${i}_[name].js`, + pathinfo: false + }, + module: { + rules: [ + { + oneOf: [ + { + test: /\.css$/, + use: [MCEP.loader, "css-loader"] + }, + { test: /\.js$/ }, + { type: "asset" } + ] + } + ] + }, + optimization: { + chunkIds: "named" + }, + target: "web", + node: { + __dirname: false + }, + plugins: [ + new MCEP(options), + compiler => { + compiler.hooks.done.tap("Test", stats => { + const chunkIds = + /** @type {NonNullable} */ + (stats.toJson({ all: false, chunks: true, ids: true }).chunks) + .map(c => c.id) + .sort(); + expect(chunkIds).toEqual([ + "a", + "b", + "c", + "chunk_js-_43b60", + "chunk_js-_43b61", + "chunk_js-_43b62", + "d_css", + "x" + ]); + }); + } + ] +}); + +module.exports = [ + config(0), + config(1, { + experimentalUseImportModule: true + }) +]; diff --git a/test/configCases/plugins/mini-css-extract-plugin/x.js b/test/configCases/plugins/mini-css-extract-plugin/x.js new file mode 100644 index 00000000000..0c441475d80 --- /dev/null +++ b/test/configCases/plugins/mini-css-extract-plugin/x.js @@ -0,0 +1 @@ +import(/* webpackExports: [] */ "./chunk"); diff --git a/test/configCases/plugins/profiling-plugin/deprecations.js b/test/configCases/plugins/profiling-plugin/deprecations.js new file mode 100644 index 00000000000..dee16addc3f --- /dev/null +++ b/test/configCases/plugins/profiling-plugin/deprecations.js @@ -0,0 +1,3 @@ +module.exports = [ + { code: /DEP_WEBPACK_COMPILATION_NORMAL_MODULE_LOADER_HOOK/ } +]; diff --git a/test/configCases/plugins/profiling-plugin/index.js b/test/configCases/plugins/profiling-plugin/index.js index c7b9eae8332..1ffa3aa96c5 100644 --- a/test/configCases/plugins/profiling-plugin/index.js +++ b/test/configCases/plugins/profiling-plugin/index.js @@ -1,19 +1,20 @@ import "./test.json"; it("should generate a events.json file", () => { - var fs = require("fs"), - path = require("path"), - os = require("os"); + var fs = require("fs"); + var path = require("path"); - expect(fs.existsSync(path.join(__dirname, "events.json"))).toBe(true); + expect(fs.existsSync(path.join(__dirname, "in/directory/events.json"))).toBe( + true + ); }); it("should have proper setup record inside of the json stream", () => { - var fs = require("fs"), - path = require("path"), - os = require("os"); + var fs = require("fs"); + var path = require("path"); - // convert json stream to valid - var source = JSON.parse(fs.readFileSync(path.join(__dirname, "events.json"), "utf-8").toString() + "{}]"); + var source = JSON.parse( + fs.readFileSync(path.join(__dirname, "in/directory/events.json"), "utf-8") + ); expect(source[0].id).toEqual(1); }); diff --git a/test/configCases/plugins/profiling-plugin/test.config.js b/test/configCases/plugins/profiling-plugin/test.config.js new file mode 100644 index 00000000000..5ef314060c9 --- /dev/null +++ b/test/configCases/plugins/profiling-plugin/test.config.js @@ -0,0 +1,3 @@ +module.exports = { + timeout: 60000 +}; diff --git a/test/configCases/plugins/profiling-plugin/test.filter.js b/test/configCases/plugins/profiling-plugin/test.filter.js index b36fb8fa768..71a71e594ff 100644 --- a/test/configCases/plugins/profiling-plugin/test.filter.js +++ b/test/configCases/plugins/profiling-plugin/test.filter.js @@ -1,3 +1,3 @@ -module.exports = function(config) { +module.exports = function (config) { return !process.env.CI; }; diff --git a/test/configCases/plugins/profiling-plugin/webpack.config.js b/test/configCases/plugins/profiling-plugin/webpack.config.js index 1d0eb54fb95..b6c457e47e5 100644 --- a/test/configCases/plugins/profiling-plugin/webpack.config.js +++ b/test/configCases/plugins/profiling-plugin/webpack.config.js @@ -1,11 +1,12 @@ -var rootPath = "../../../../"; -var webpack = require(rootPath); -var path = require("path"); +const rootPath = "../../../../"; +const webpack = require(rootPath); +const path = require("path"); +/** @type {(env: Env, options: TestOptions) => import("../../../../").Configuration} */ module.exports = (env, { testPath }) => ({ plugins: [ new webpack.debug.ProfilingPlugin({ - outputPath: path.join(testPath, "events.json") + outputPath: path.join(testPath, "in/directory/events.json") }) ], node: { diff --git a/test/configCases/plugins/progress-plugin/data.js b/test/configCases/plugins/progress-plugin/data.js index e0a30c5dfa3..747c818b0b1 100644 --- a/test/configCases/plugins/progress-plugin/data.js +++ b/test/configCases/plugins/progress-plugin/data.js @@ -1 +1 @@ -module.exports = []; +module.exports = /** @type {string[]} */ ([]); diff --git a/test/configCases/plugins/progress-plugin/index.js b/test/configCases/plugins/progress-plugin/index.js index d91f53a9c13..0469c5f43d0 100644 --- a/test/configCases/plugins/progress-plugin/index.js +++ b/test/configCases/plugins/progress-plugin/index.js @@ -1,6 +1,8 @@ -it("should contain the custom progress messages", function() { - var data = require(__dirname + "/data"); - expect(data).toContain("optimizing"); - expect(data).toContain("optimizing|CustomPlugin"); - expect(data).toContain("optimizing|CustomPlugin|custom category|custom message"); +it("should contain the custom progress messages", function () { + var data = require("data"); + expect(data).toContain("sealing|optimizing"); + expect(data).toContain("sealing|optimizing|CustomPlugin"); + expect(data).toContain( + "sealing|optimizing|CustomPlugin|custom category|custom message" + ); }); diff --git a/test/configCases/plugins/progress-plugin/webpack.config.js b/test/configCases/plugins/progress-plugin/webpack.config.js index baeba197127..a02a4fa2a3c 100644 --- a/test/configCases/plugins/progress-plugin/webpack.config.js +++ b/test/configCases/plugins/progress-plugin/webpack.config.js @@ -1,8 +1,13 @@ -var webpack = require("../../../../"); -var data = require("./data"); +const path = require("path"); +const webpack = require("../../../../"); +const data = require("./data"); + +/** @typedef {import("../../../../").ProgressPlugin} ProgressPlugin */ + +/** @type {import("../../../../").Configuration} */ module.exports = { externals: { - [__dirname + "/data"]: "commonjs " + __dirname + "/data" + data: `commonjs ${path.resolve(__dirname, "data.js")}` }, plugins: [ new webpack.ProgressPlugin((value, ...messages) => { @@ -11,15 +16,12 @@ module.exports = { { apply: compiler => { compiler.hooks.compilation.tap("CustomPlugin", compilation => { - compilation.hooks.optimize.tap( - { - name: "CustomPlugin", - context: true - }, - context => { - context.reportProgress(0, "custom category", "custom message"); - } - ); + compilation.hooks.optimize.tap("CustomPlugin", () => { + const reportProgress = + /** @type {NonNullable>} */ + (webpack.ProgressPlugin.getReporter(compiler)); + reportProgress(0, "custom category", "custom message"); + }); }); } } diff --git a/test/configCases/plugins/provide-plugin/a.js b/test/configCases/plugins/provide-plugin/a.js new file mode 100644 index 00000000000..f8297ed707d --- /dev/null +++ b/test/configCases/plugins/provide-plugin/a.js @@ -0,0 +1,2 @@ +export * as c from "./b"; +export * as c2 from "./harmony2"; diff --git a/test/configCases/plugins/provide-plugin/b.js b/test/configCases/plugins/provide-plugin/b.js new file mode 100644 index 00000000000..64bcdcfb6b8 --- /dev/null +++ b/test/configCases/plugins/provide-plugin/b.js @@ -0,0 +1,7 @@ +export function square(x) { + return x * x; +} + +export function cube(x) { + return x * x * x; +} diff --git a/test/configCases/plugins/provide-plugin/esm.js b/test/configCases/plugins/provide-plugin/esm.js new file mode 100644 index 00000000000..bb68ba954de --- /dev/null +++ b/test/configCases/plugins/provide-plugin/esm.js @@ -0,0 +1 @@ +module.exports = "esm"; diff --git a/test/configCases/plugins/provide-plugin/foo.mjs b/test/configCases/plugins/provide-plugin/foo.mjs index b7beb9c20ab..9502478d5bb 100644 --- a/test/configCases/plugins/provide-plugin/foo.mjs +++ b/test/configCases/plugins/provide-plugin/foo.mjs @@ -1,3 +1,3 @@ export default function foo() { - return typeof esm; -} \ No newline at end of file + return esm; +} diff --git a/test/configCases/plugins/provide-plugin/harmony2.js b/test/configCases/plugins/provide-plugin/harmony2.js new file mode 100644 index 00000000000..cabd2fbbb5f --- /dev/null +++ b/test/configCases/plugins/provide-plugin/harmony2.js @@ -0,0 +1,2 @@ +export const a = 1; +export const aUsed = __webpack_exports_info__.a.used; diff --git a/test/configCases/plugins/provide-plugin/index.js b/test/configCases/plugins/provide-plugin/index.js index e9d4b96d874..989d9ff0692 100644 --- a/test/configCases/plugins/provide-plugin/index.js +++ b/test/configCases/plugins/provide-plugin/index.js @@ -48,6 +48,11 @@ it("should provide a module for a property request", function() { expect(x).toBe("fff"); }); +it("should tree-shake unused exports", function() { + expect(aa1(2)).toBe(8); + expect(es2015_aUsed).toBe(false); +}); + it("should provide ES2015 modules", function() { expect((es2015.default)).toBe("ECMAScript 2015"); expect((es2015.alias)).toBe("ECMAScript Harmony"); @@ -59,5 +64,5 @@ it("should provide ES2015 modules", function() { it("should not provide for mjs", function(){ var foo = require("./foo.mjs").default; - expect(foo()).toBe("undefined"); + expect(foo()).toBe("esm"); }); diff --git a/test/configCases/plugins/provide-plugin/webpack.config.js b/test/configCases/plugins/provide-plugin/webpack.config.js index 9af9653794f..83866bd78ee 100644 --- a/test/configCases/plugins/provide-plugin/webpack.config.js +++ b/test/configCases/plugins/provide-plugin/webpack.config.js @@ -1,17 +1,25 @@ -var ProvidePlugin = require("../../../../lib/ProvidePlugin"); +const ProvidePlugin = require("../../../../").ProvidePlugin; + +/** @type {import("../../../../").Configuration} */ module.exports = { plugins: [ new ProvidePlugin({ aaa: "./aaa", "bbb.ccc": "./bbbccc", dddeeefff: ["./ddd", "eee", "3-f"], + aa1: ["./a", "c", "cube"], + // eslint-disable-next-line camelcase + es2015_aUsed: ["./harmony2", "aUsed"], "process.env.NODE_ENV": "./env", es2015: "./harmony", + // eslint-disable-next-line camelcase es2015_name: ["./harmony", "default"], + // eslint-disable-next-line camelcase es2015_alias: ["./harmony", "alias"], + // eslint-disable-next-line camelcase es2015_year: ["./harmony", "year"], "this.aaa": "./aaa", - esm: "fail" + esm: "./esm.js" }) ] }; diff --git a/test/configCases/plugins/source-map-dev-tool-plugin-append-function/index.js b/test/configCases/plugins/source-map-dev-tool-plugin-append-function/index.js new file mode 100644 index 00000000000..464fe983765 --- /dev/null +++ b/test/configCases/plugins/source-map-dev-tool-plugin-append-function/index.js @@ -0,0 +1,6 @@ +it("should have [file] replaced with chunk filename in append", function() { + const fs = require("fs"), + path = require("path"); + const source = fs.readFileSync(path.join(__dirname, "some-test.js"), "utf-8"); + expect(source).toMatch("//# sourceMappingURL=http://localhost:50505/some-test.js.map"); +}); diff --git a/test/configCases/plugins/source-map-dev-tool-plugin-append-function/test.js b/test/configCases/plugins/source-map-dev-tool-plugin-append-function/test.js new file mode 100644 index 00000000000..a6b9cb13401 --- /dev/null +++ b/test/configCases/plugins/source-map-dev-tool-plugin-append-function/test.js @@ -0,0 +1,5 @@ +const testObject = { + a: 1 +}; + +module.exports = testObject; diff --git a/test/configCases/plugins/source-map-dev-tool-plugin-append-function/webpack.config.js b/test/configCases/plugins/source-map-dev-tool-plugin-append-function/webpack.config.js new file mode 100644 index 00000000000..3fa7647084c --- /dev/null +++ b/test/configCases/plugins/source-map-dev-tool-plugin-append-function/webpack.config.js @@ -0,0 +1,26 @@ +const webpack = require("../../../../"); +const TerserPlugin = require("terser-webpack-plugin"); + +/** @type {import("../../../../types").Configuration} */ +module.exports = { + node: { + __dirname: false, + __filename: false + }, + entry: { + bundle0: ["./index.js"], + "some-test": ["./test.js"] + }, + output: { + filename: "[name].js" + }, + optimization: { + minimizer: [new TerserPlugin()] + }, + plugins: [ + new webpack.SourceMapDevToolPlugin({ + filename: "sourcemaps/[file].map", + append: data => "\n//# sourceMappingURL=http://localhost:50505/[file].map" + }) + ] +}; diff --git a/test/configCases/plugins/source-map-dev-tool-plugin/index.js b/test/configCases/plugins/source-map-dev-tool-plugin/index.js index 53b37f635a1..30bc39f5040 100644 --- a/test/configCases/plugins/source-map-dev-tool-plugin/index.js +++ b/test/configCases/plugins/source-map-dev-tool-plugin/index.js @@ -5,7 +5,7 @@ it("should contain publicPath prefix in [url] and resolve relatively to fileCont expect(source).toMatch("//# sourceMappingURL=https://10.10.10.10/project/sourcemaps/test.js.map"); }); -it("should write sourcemap file relative fo fileContext", function() { +it("should write sourcemap file relative to fileContext", function() { var fs = require("fs"), path = require("path"); expect(fs.existsSync(path.join(__dirname, "sourcemaps/test.js.map"))).toBe(true); diff --git a/test/configCases/plugins/source-map-dev-tool-plugin/webpack.config.js b/test/configCases/plugins/source-map-dev-tool-plugin/webpack.config.js index 59bb25d2a16..ffc668c913c 100644 --- a/test/configCases/plugins/source-map-dev-tool-plugin/webpack.config.js +++ b/test/configCases/plugins/source-map-dev-tool-plugin/webpack.config.js @@ -1,5 +1,7 @@ -var webpack = require("../../../../"); -var TerserPlugin = require("terser-webpack-plugin"); +const webpack = require("../../../../"); +const TerserPlugin = require("terser-webpack-plugin"); + +/** @type {import("../../../../").Configuration} */ module.exports = { node: { __dirname: false, @@ -13,11 +15,7 @@ module.exports = { filename: "[name].js" }, optimization: { - minimizer: [ - new TerserPlugin({ - sourceMap: true - }) - ] + minimizer: [new TerserPlugin()] }, plugins: [ new webpack.SourceMapDevToolPlugin({ diff --git a/test/configCases/plugins/source-map-dev-tool-plugin~append/index.js b/test/configCases/plugins/source-map-dev-tool-plugin~append/index.js new file mode 100644 index 00000000000..845a13bc4d0 --- /dev/null +++ b/test/configCases/plugins/source-map-dev-tool-plugin~append/index.js @@ -0,0 +1,6 @@ +it("should have [file] replaced with chunk filename in append", function() { + var fs = require("fs"), + path = require("path"); + var source = fs.readFileSync(path.join(__dirname, "some-test.js"), "utf-8"); + expect(source).toMatch("//# sourceMappingURL=http://localhost:50505/some-test.js.map"); +}); diff --git a/test/configCases/plugins/source-map-dev-tool-plugin~append/test.js b/test/configCases/plugins/source-map-dev-tool-plugin~append/test.js new file mode 100644 index 00000000000..1739577368e --- /dev/null +++ b/test/configCases/plugins/source-map-dev-tool-plugin~append/test.js @@ -0,0 +1,5 @@ +var testObject = { + a: 1 +}; + +module.exports = testObject; diff --git a/test/configCases/plugins/source-map-dev-tool-plugin~append/webpack.config.js b/test/configCases/plugins/source-map-dev-tool-plugin~append/webpack.config.js new file mode 100644 index 00000000000..cb171e7af4d --- /dev/null +++ b/test/configCases/plugins/source-map-dev-tool-plugin~append/webpack.config.js @@ -0,0 +1,26 @@ +const webpack = require("../../../../"); +const TerserPlugin = require("terser-webpack-plugin"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + node: { + __dirname: false, + __filename: false + }, + entry: { + bundle0: ["./index.js"], + "some-test": ["./test.js"] + }, + output: { + filename: "[name].js" + }, + optimization: { + minimizer: [new TerserPlugin()] + }, + plugins: [ + new webpack.SourceMapDevToolPlugin({ + filename: "sourcemaps/[file].map", + append: "\n//# sourceMappingURL=http://localhost:50505/[file].map" + }) + ] +}; diff --git a/test/configCases/plugins/terser-plugin/index.js b/test/configCases/plugins/terser-plugin/index.js index 55279a25663..4f841ca4637 100644 --- a/test/configCases/plugins/terser-plugin/index.js +++ b/test/configCases/plugins/terser-plugin/index.js @@ -23,7 +23,10 @@ it("should extract comments to separate file", function() { const fs = require("fs"); const path = require("path"); - const source = fs.readFileSync(path.join(__dirname, "extract.js.LICENSE"), "utf-8"); + const source = fs.readFileSync( + path.join(__dirname, "extract.js.LICENSE.txt"), + "utf-8" + ); expect(source).toMatch("comment should be extracted extract-test.1"); expect(source).not.toMatch("comment should be stripped extract-test.2"); @@ -41,7 +44,9 @@ it("should remove extracted comments and insert a banner", function() { expect(source).not.toMatch("comment should be stripped extract-test.2"); expect(source).not.toMatch("comment should be extracted extract-test.3"); expect(source).not.toMatch("comment should be stripped extract-test.4"); - expect(source).toMatch("/*! For license information please see extract.js.LICENSE */"); + expect(source).toMatch( + "/*! For license information please see extract.js.LICENSE.txt */" + ); }); it("should pass mangle options", function() { @@ -50,7 +55,9 @@ it("should pass mangle options", function() { const source = fs.readFileSync(path.join(__dirname, "ie8.js"), "utf-8"); - expect(source).toMatch(".exports=function(e){return function(t){try{e()}catch(e){t(e)}}}"); + expect(source).toMatch( + /\.exports=function\((\w)\)\{return function\((\w)\)\{try\{\1\(\)\}catch\(\1\)\{\2\(\1\)\}\}\}/ + ); }); it("should pass compress options", function() { @@ -59,7 +66,9 @@ it("should pass compress options", function() { const source = fs.readFileSync(path.join(__dirname, "compress.js"), "utf-8"); - expect(source).toMatch(".exports=function(){console.log(4),console.log(6),console.log(4),console.log(7)}"); + expect(source).toMatch( + ".exports=function(){console.log(4),console.log(6),console.log(4),console.log(7)}" + ); }); -require.include("./test.js"); +if (Math.random() < 0) require("./test.js"); diff --git a/test/configCases/plugins/terser-plugin/webpack.config.js b/test/configCases/plugins/terser-plugin/webpack.config.js index 8a1d3397503..4b42cbf3117 100644 --- a/test/configCases/plugins/terser-plugin/webpack.config.js +++ b/test/configCases/plugins/terser-plugin/webpack.config.js @@ -1,4 +1,5 @@ const TerserPlugin = require("terser-webpack-plugin"); +/** @type {import("../../../../").Configuration} */ module.exports = { node: { __dirname: false, @@ -18,24 +19,22 @@ module.exports = { minimize: true, minimizer: [ new TerserPlugin({ - cache: false, parallel: false, - exclude: ["vendors.js", "extract.js"] + extractComments: false, + exclude: ["vendors.js", "compress.js", "extract.js"] }), new TerserPlugin({ - cache: false, parallel: false, - extractComments: true, include: ["extract.js"] }), new TerserPlugin({ - cache: false, parallel: false, terserOptions: { compress: { passes: 2 } }, + extractComments: false, include: ["compress.js"] }) ] diff --git a/test/configCases/process-assets/html-plugin/index.js b/test/configCases/process-assets/html-plugin/index.js new file mode 100644 index 00000000000..057cb6a0576 --- /dev/null +++ b/test/configCases/process-assets/html-plugin/index.js @@ -0,0 +1,28 @@ +const crypto = require("crypto"); +const fs = require("fs"); +const path = require("path"); + +it("should result in the correct HTML", () => { + const content = fs.readFileSync( + path.resolve(__dirname, "index.html"), + "utf-8" + ); + + // check minimized + expect(content).toMatch(/<\/script> `; + }; + compilation.emitAsset( + "index.html", + new OriginalSource( + ` + +${files.map(file => ` ${toScriptTag(file)}`).join("\n")} + +`, + "index.html" + ) + ); + } + ); + }); + } +} + +class HtmlInlinePlugin { + /** + * @param {RegExp} inline inline + */ + constructor(inline) { + this.inline = inline; + } + + /** + * @param {Compiler} compiler compiler + */ + apply(compiler) { + compiler.hooks.compilation.tap("html-inline-plugin", compilation => { + compilation.hooks.processAssets.tap( + { + name: "html-inline-plugin", + stage: Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_INLINE, + additionalAssets: true + }, + assets => { + const publicPath = + /** @type {string} */ + (compilation.outputOptions.publicPath); + for (const name of Object.keys(assets)) { + if (/\.html$/.test(name)) { + const asset = /** @type {Asset} */ (compilation.getAsset(name)); + const content = /** @type {string} */ (asset.source.source()); + /** @type {{ start: number, length: number, asset: Asset }[]} */ + const matches = []; + const regExp = + /<\/script>/g; + let match = regExp.exec(content); + while (match) { + let url = match[1]; + if (url.startsWith(publicPath)) + url = url.slice(publicPath.length); + if (this.inline.test(url)) { + const asset = /** @type {Asset} */ ( + compilation.getAsset(url) + ); + matches.push({ + start: match.index, + length: match[0].length, + asset + }); + } + match = regExp.exec(content); + } + if (matches.length > 0) { + const newSource = new ReplaceSource(asset.source, name); + for (const { start, length, asset } of matches) { + newSource.replace( + start, + start + length - 1, + `` + ); + } + compilation.updateAsset(name, newSource); + } + } + } + } + ); + }); + } +} + +class SriHashSupportPlugin { + /** + * @param {Compiler} compiler compiler + */ + apply(compiler) { + compiler.hooks.compilation.tap("sri-hash-support-plugin", compilation => { + RealContentHashPlugin.getCompilationHooks(compilation).updateHash.tap( + "sri-hash-support-plugin", + (input, oldHash) => { + if (/^sha512-.{88}$/.test(oldHash) && input.length === 1) { + const hash = createHash("sha512"); + hash.update(input[0]); + return `sha512-${hash.digest("base64")}`; + } + } + ); + }); + } +} + +class HtmlMinimizePlugin { + /** + * @param {Compiler} compiler compiler + */ + apply(compiler) { + compiler.hooks.compilation.tap("html-minimize-plugin", compilation => { + compilation.hooks.processAssets.tap( + { + name: "html-minimize-plugin", + stage: Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE, + additionalAssets: true + }, + assets => { + for (const name of Object.keys(assets)) { + if (/\.html$/.test(name)) { + compilation.updateAsset( + name, + source => + new RawSource( + /** @type {string} */ + (source.source()).replace(/\s+/g, " ") + ), + assetInfo => ({ + ...assetInfo, + minimized: true + }) + ); + } + } + } + ); + }); + } +} + +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "production", + entry: { + test: { import: "./index.js", filename: "test.js" }, + inline: "./inline.js", + normal: "./normal.js" + }, + output: { + filename: "[name]-[contenthash].js" + }, + optimization: { + minimize: true, + minimizer: ["...", new HtmlMinimizePlugin()] + }, + node: { + __dirname: false, + __filename: false + }, + plugins: [ + new VerifyAdditionalAssetsPlugin( + Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL - 1 + ), + // new VerifyAdditionalAssetsPlugin(Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE), + // new VerifyAdditionalAssetsPlugin(Compilation.PROCESS_ASSETS_STAGE_REPORT), + new HtmlPlugin(["inline", "normal"]), + new HtmlInlinePlugin(/inline/), + new SriHashSupportPlugin() + ] +}; diff --git a/test/configCases/process-assets/update-info/file.svg b/test/configCases/process-assets/update-info/file.svg new file mode 100644 index 00000000000..d7b7e40b4f8 --- /dev/null +++ b/test/configCases/process-assets/update-info/file.svg @@ -0,0 +1 @@ +icon-square-small diff --git a/test/configCases/process-assets/update-info/file1.svg b/test/configCases/process-assets/update-info/file1.svg new file mode 100644 index 00000000000..d7b7e40b4f8 --- /dev/null +++ b/test/configCases/process-assets/update-info/file1.svg @@ -0,0 +1 @@ +icon-square-small diff --git a/test/configCases/process-assets/update-info/index.js b/test/configCases/process-assets/update-info/index.js new file mode 100644 index 00000000000..61420f560f7 --- /dev/null +++ b/test/configCases/process-assets/update-info/index.js @@ -0,0 +1,13 @@ +it("should update info", () => { + const file = new URL("./file.svg", import.meta.url); + expect(/file\.svg$/.test(file)).toBe(true); + const { info } = __STATS__.assets.find(item => item.name === "images/file.svg"); + expect(info.custom).toBe(true); + expect(info.related).toEqual({"first": ["first"], "second": ["second"]}); + expect(info.customFn).toBe(true); + + const file1 = new URL("./file1.svg", import.meta.url); + expect(/file1\.svg$/.test(file1)).toBe(true); + const { info: info1 } = __STATS__.assets.find(item => item.name === "images/file1.svg"); + expect(info1.custom).toBeUndefined(); +}); diff --git a/test/configCases/process-assets/update-info/webpack.config.js b/test/configCases/process-assets/update-info/webpack.config.js new file mode 100644 index 00000000000..4bb9868523c --- /dev/null +++ b/test/configCases/process-assets/update-info/webpack.config.js @@ -0,0 +1,56 @@ +/** @typedef {import("../../../../").AssetInfo} AssetInfo */ + +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + assetModuleFilename: "images/[name][ext]" + }, + plugins: [ + { + apply: compiler => { + compiler.hooks.compilation.tap("TestPlugin", compilation => { + compilation.hooks.processAssets.tap( + { + name: "TestPlugin", + additionalAssets: true + }, + assets => { + for (const asset of Object.keys(assets)) { + switch (asset) { + case "images/file.svg": { + compilation.updateAsset(asset, assets[asset], { + custom: true, + related: { first: ["first"] } + }); + compilation.updateAsset(asset, assets[asset], info => ({ + ...info, + related: { + .../** @type {{ related: Record }} */ ( + info + ).related, + second: ["second"] + }, + customFn: true + })); + break; + } + case "images/file1.svg": { + compilation.updateAsset(asset, assets[asset], { + custom: true + }); + compilation.updateAsset( + asset, + assets[asset], + () => undefined + ); + break; + } + } + } + } + ); + }); + } + } + ] +}; diff --git a/test/configCases/race-conditions/import-module/index.js b/test/configCases/race-conditions/import-module/index.js new file mode 100644 index 00000000000..1fd2434a896 --- /dev/null +++ b/test/configCases/race-conditions/import-module/index.js @@ -0,0 +1,7 @@ +import * as styles from './style.module.css'; +import * as styles1 from './module.js'; + +it("should not deadlock when using importModule", () => { + expect(styles.someBottom).toBe("8px"); + expect(styles1.someBottom).toBe("8px"); +}); diff --git a/test/configCases/race-conditions/import-module/inner.module.css b/test/configCases/race-conditions/import-module/inner.module.css new file mode 100644 index 00000000000..42f213360c8 --- /dev/null +++ b/test/configCases/race-conditions/import-module/inner.module.css @@ -0,0 +1 @@ +@value someBottom from "./vars.module.css"; diff --git a/test/configCases/race-conditions/import-module/loader.js b/test/configCases/race-conditions/import-module/loader.js new file mode 100644 index 00000000000..0e77913406f --- /dev/null +++ b/test/configCases/race-conditions/import-module/loader.js @@ -0,0 +1,21 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports.pitch = function (request) { + const callback = this.async(); + let finished = false; + + this.importModule( + `${this.resourcePath}.webpack[javascript/auto]!=!!!${request}`, + {}, + (err, result) => { + if (err) return callback(err); + if (finished) return; + finished = true; + callback(null, `module.exports = ${JSON.stringify(result)};`); + } + ); + setTimeout(() => { + if (finished) return; + finished = true; + callback(new Error("importModule is hanging")); + }, 2000); +}; diff --git a/test/configCases/race-conditions/import-module/module.js b/test/configCases/race-conditions/import-module/module.js new file mode 100644 index 00000000000..88d79cafca0 --- /dev/null +++ b/test/configCases/race-conditions/import-module/module.js @@ -0,0 +1 @@ +export * from './style1.module.css' diff --git a/test/configCases/race-conditions/import-module/style.module.css b/test/configCases/race-conditions/import-module/style.module.css new file mode 100644 index 00000000000..4c8cab8aea2 --- /dev/null +++ b/test/configCases/race-conditions/import-module/style.module.css @@ -0,0 +1,5 @@ +@value someBottom from "./inner.module.css"; + +.cold { + bottom: someBottom; +} diff --git a/test/configCases/race-conditions/import-module/style1.module.css b/test/configCases/race-conditions/import-module/style1.module.css new file mode 100644 index 00000000000..4c8cab8aea2 --- /dev/null +++ b/test/configCases/race-conditions/import-module/style1.module.css @@ -0,0 +1,5 @@ +@value someBottom from "./inner.module.css"; + +.cold { + bottom: someBottom; +} diff --git a/test/configCases/race-conditions/import-module/test.filter.js b/test/configCases/race-conditions/import-module/test.filter.js new file mode 100644 index 00000000000..cfa30cb56d3 --- /dev/null +++ b/test/configCases/race-conditions/import-module/test.filter.js @@ -0,0 +1,5 @@ +module.exports = function (config) { + const [major] = process.versions.node.split(".").map(Number); + + return major >= 18; +}; diff --git a/test/configCases/race-conditions/import-module/vars.module.css b/test/configCases/race-conditions/import-module/vars.module.css new file mode 100644 index 00000000000..3d1538209d3 --- /dev/null +++ b/test/configCases/race-conditions/import-module/vars.module.css @@ -0,0 +1,2 @@ +@value someBottom: 8px; +@value someBottom1: 8px; diff --git a/test/configCases/race-conditions/import-module/webpack.config.js b/test/configCases/race-conditions/import-module/webpack.config.js new file mode 100644 index 00000000000..44c2cb40ef4 --- /dev/null +++ b/test/configCases/race-conditions/import-module/webpack.config.js @@ -0,0 +1,13 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + parallelism: 1, + mode: "development", + module: { + rules: [ + { + test: /\.css$/i, + use: [require.resolve("./loader"), "css-loader"] + } + ] + } +}; diff --git a/test/configCases/race-conditions/load-module/loader.js b/test/configCases/race-conditions/load-module/loader.js index 444c2c9dad3..b741c194e99 100644 --- a/test/configCases/race-conditions/load-module/loader.js +++ b/test/configCases/race-conditions/load-module/loader.js @@ -1,4 +1,5 @@ -module.exports = function() { +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { const callback = this.async(); let finished = false; this.loadModule("./module.js", (err, result) => { diff --git a/test/configCases/race-conditions/load-module/webpack.config.js b/test/configCases/race-conditions/load-module/webpack.config.js index e39f5010812..40427f8605e 100644 --- a/test/configCases/race-conditions/load-module/webpack.config.js +++ b/test/configCases/race-conditions/load-module/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { parallelism: 1 }; diff --git a/test/configCases/rebuild/finishModules/a.js b/test/configCases/rebuild/finishModules/a.js new file mode 100644 index 00000000000..9b7f372296c --- /dev/null +++ b/test/configCases/rebuild/finishModules/a.js @@ -0,0 +1,5 @@ +import { doThings, foo } from "./other-file"; + +export { doThings, foo }; + +export const valueFromA = "A"; diff --git a/test/configCases/rebuild/finishModules/chunk.js b/test/configCases/rebuild/finishModules/chunk.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/rebuild/finishModules/index.js b/test/configCases/rebuild/finishModules/index.js new file mode 100644 index 00000000000..2f119994f6d --- /dev/null +++ b/test/configCases/rebuild/finishModules/index.js @@ -0,0 +1,20 @@ +import { doThings, foo, valueFromA } from "./a"; +it("should compile", function (done) { + expect(doThings("ok")).toBe("ok"); + + // Should be replaced by the code in the config. + expect(foo.foo).toBe("bar"); + expect(valueFromA).toBe("A"); + + done(); +}); + +it("should not reference the chunk", () => { + expect(__STATS__.chunks.length).toEqual(1); + expect( + __STATS__.modules + .filter(m => m.moduleType !== "runtime") + .map(m => m.name) + .sort() + ).toEqual(["./a.js", "./index.js", "./other-file.js"]); +}); diff --git a/test/configCases/rebuild/finishModules/loader.js b/test/configCases/rebuild/finishModules/loader.js new file mode 100644 index 00000000000..2280da8573f --- /dev/null +++ b/test/configCases/rebuild/finishModules/loader.js @@ -0,0 +1,14 @@ +/** @typedef {import("../../../../").Module} Module */ + +/** @type {import("../../../../").LoaderDefinition<{}, { shouldReplace: boolean }>} */ +module.exports = function (source) { + if (this.shouldReplace) { + /** @type {NonNullable} */ + ( + /** @type {Module} */ + (this._module).buildInfo + )._isReplaced = true; + return "module.exports = { foo: { foo: 'bar' }, doThings: (v) => v}"; + } + return source; +}; diff --git a/test/configCases/rebuild/finishModules/module.js b/test/configCases/rebuild/finishModules/module.js new file mode 100644 index 00000000000..60c6c8d8b04 --- /dev/null +++ b/test/configCases/rebuild/finishModules/module.js @@ -0,0 +1 @@ +export default "foo"; diff --git a/test/configCases/rebuild/finishModules/other-file.js b/test/configCases/rebuild/finishModules/other-file.js new file mode 100644 index 00000000000..7d49a120b59 --- /dev/null +++ b/test/configCases/rebuild/finishModules/other-file.js @@ -0,0 +1,9 @@ +import foo from "./module"; + +export function doThings(stuff) { + return import("./chunk"); +} + +export const foo = { + foo +}; diff --git a/test/configCases/rebuild/finishModules/webpack.config.js b/test/configCases/rebuild/finishModules/webpack.config.js new file mode 100644 index 00000000000..36aba8d5c7f --- /dev/null +++ b/test/configCases/rebuild/finishModules/webpack.config.js @@ -0,0 +1,75 @@ +const { resolve, join } = require("path"); +const { NormalModule } = require("../../../../"); + +/** + * @typedef {import("../../../../").Module} Module + */ + +/** + * @param {import("../../../../").Compiler} compiler the compiler + */ +const testPlugin = compiler => { + compiler.hooks.compilation.tap("TestPlugin", compilation => { + let shouldReplace = false; + NormalModule.getCompilationHooks(compilation).loader.tap( + "TestPlugin", + loaderContext => { + /** @type {EXPECTED_ANY} */ + (loaderContext).shouldReplace = shouldReplace; + } + ); + compilation.hooks.finishModules.tapAsync( + "TestPlugin", + function (modules, callback) { + const src = resolve(join(__dirname, "other-file.js")); + + /** + * @param {Module} m test + * @returns {boolean | string} test + */ + function matcher(m) { + return ( + /** @type {NormalModule} */ (m).resource && + /** @type {NormalModule} */ (m).resource === src + ); + } + + const module = Array.from(modules).find(matcher); + + if (!module) { + throw new Error("something went wrong"); + } + + // Check if already build the updated version + // this will happen when using caching + if ( + /** @type {NonNullable} */ + (module.buildInfo)._isReplaced + ) + return callback(); + + shouldReplace = true; + compilation.rebuildModule(module, err => { + shouldReplace = false; + callback(err); + }); + } + ); + }); +}; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + module: { + rules: [ + { + test: /other-file/, + use: "./loader" + } + ] + }, + optimization: { + concatenateModules: false + }, + plugins: [testPlugin] +}; diff --git a/test/configCases/rebuild/rebuildWithNewDependencies/a.js b/test/configCases/rebuild/rebuildWithNewDependencies/a.js new file mode 100644 index 00000000000..b95d9adb367 --- /dev/null +++ b/test/configCases/rebuild/rebuildWithNewDependencies/a.js @@ -0,0 +1 @@ +export default "a.js"; diff --git a/test/configCases/rebuild/rebuildWithNewDependencies/index.js b/test/configCases/rebuild/rebuildWithNewDependencies/index.js new file mode 100644 index 00000000000..dc0e2858289 --- /dev/null +++ b/test/configCases/rebuild/rebuildWithNewDependencies/index.js @@ -0,0 +1,7 @@ +import A from "./a"; + +it("should compile", function (done) { + expect(A).toBe("other-file.js"); + + done(); +}); diff --git a/test/configCases/rebuild/rebuildWithNewDependencies/loader.js b/test/configCases/rebuild/rebuildWithNewDependencies/loader.js new file mode 100644 index 00000000000..28fe4edb3c6 --- /dev/null +++ b/test/configCases/rebuild/rebuildWithNewDependencies/loader.js @@ -0,0 +1,16 @@ +/** @typedef {import("../../../../").Module} Module */ + +/** @type {import("../../../../").LoaderDefinition<{}, { shouldReplace: boolean }>} */ +module.exports = function (source) { + if (this.shouldReplace) { + /** @type {NonNullable} */ + ( + /** @type {Module} */ + (this._module).buildInfo + )._isReplaced = true; + return `import otherFile from './other-file.js'; + export default otherFile; + `; + } + return source; +}; diff --git a/test/configCases/rebuild/rebuildWithNewDependencies/other-file.js b/test/configCases/rebuild/rebuildWithNewDependencies/other-file.js new file mode 100644 index 00000000000..bf03b45cceb --- /dev/null +++ b/test/configCases/rebuild/rebuildWithNewDependencies/other-file.js @@ -0,0 +1 @@ +export default "other-file.js"; diff --git a/test/configCases/rebuild/rebuildWithNewDependencies/webpack.config.js b/test/configCases/rebuild/rebuildWithNewDependencies/webpack.config.js new file mode 100644 index 00000000000..f881d5fb68c --- /dev/null +++ b/test/configCases/rebuild/rebuildWithNewDependencies/webpack.config.js @@ -0,0 +1,73 @@ +const { resolve, join } = require("path"); +const { NormalModule } = require("../../../../"); + +/** @typedef {import("../../../../").Module} Module */ + +/** + * @param {import("../../../../").Compiler} compiler the compiler + */ +const testPlugin = compiler => { + compiler.hooks.compilation.tap("TestPlugin", compilation => { + let shouldReplace = false; + NormalModule.getCompilationHooks(compilation).loader.tap( + "TestPlugin", + loaderContext => { + /** @type {EXPECTED_ANY} */ + (loaderContext).shouldReplace = shouldReplace; + } + ); + compilation.hooks.finishModules.tapAsync( + "TestPlugin", + function (modules, callback) { + const src = resolve(join(__dirname, "a.js")); + + /** + * @param {Module} m test + * @returns {boolean | string} test + */ + function matcher(m) { + return ( + /** @type {NormalModule} */ (m).resource && + /** @type {NormalModule} */ (m).resource === src + ); + } + + const module = Array.from(modules).find(matcher); + + if (!module) { + throw new Error("something went wrong"); + } + + // Check if already build the updated version + // this will happen when using caching + if ( + /** @type {NonNullable} */ + (module.buildInfo)._isReplaced + ) + return callback(); + + shouldReplace = true; + compilation.rebuildModule(module, err => { + shouldReplace = false; + callback(err); + }); + } + ); + }); +}; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + module: { + rules: [ + { + test: /a.js/, + use: "./loader" + } + ] + }, + optimization: { + concatenateModules: false + }, + plugins: [testPlugin] +}; diff --git a/test/configCases/records/issue-295/loader.js b/test/configCases/records/issue-295/loader.js index 6e64f4af6bb..c6d8a635121 100644 --- a/test/configCases/records/issue-295/loader.js +++ b/test/configCases/records/issue-295/loader.js @@ -1,3 +1,4 @@ -module.exports = function(source) { +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { return source; }; diff --git a/test/configCases/records/issue-295/webpack.config.js b/test/configCases/records/issue-295/webpack.config.js index 987f3640bb9..c7eedcfd8ed 100644 --- a/test/configCases/records/issue-295/webpack.config.js +++ b/test/configCases/records/issue-295/webpack.config.js @@ -1,13 +1,11 @@ -var path = require("path"); +const path = require("path"); -module.exports = { +/** @type {(env: Env, options: TestOptions) => import("../../../../").Configuration} */ +module.exports = (env, { testPath }) => ({ entry: "./test", - recordsPath: path.resolve( - __dirname, - "../../../js/config/records/issue-295/records.json" - ), + recordsPath: path.resolve(testPath, "records.json"), target: "node", node: { __dirname: false } -}; +}); diff --git a/test/configCases/records/issue-2991/test.js b/test/configCases/records/issue-2991/test.js index 81673a393b9..bef4f443a46 100644 --- a/test/configCases/records/issue-2991/test.js +++ b/test/configCases/records/issue-2991/test.js @@ -6,5 +6,25 @@ it("should write relative paths to records", function() { var fs = require("fs"); var path = require("path"); var content = fs.readFileSync(path.join(__dirname, "records.json"), "utf-8"); - expect(content).toMatchSnapshot(); + + expect(JSON.parse(content)).toMatchObject({ + chunks: { + byName: { + main: 792 + }, + bySource: { + "0 main": 792 + }, + usedIds: [792] + }, + modules: { + byIdentifier: { + "./test.js": 329, + 'external node-commonjs "fs"': 896, + 'external node-commonjs "path"': 928, + "ignored|./.|pkgs/somepackage/foo": 835 + }, + usedIds: [329, 835, 896, 928] + } + }); }); diff --git a/test/configCases/records/issue-2991/webpack.config.js b/test/configCases/records/issue-2991/webpack.config.js index 3d017931f12..664fd120e95 100644 --- a/test/configCases/records/issue-2991/webpack.config.js +++ b/test/configCases/records/issue-2991/webpack.config.js @@ -1,11 +1,9 @@ -var path = require("path"); +const path = require("path"); -module.exports = { +/** @type {(env: Env, options: TestOptions) => import("../../../../").Configuration} */ +module.exports = (env, { testPath }) => ({ entry: "./test", - recordsOutputPath: path.resolve( - __dirname, - "../../../js/config/records/issue-2991/records.json" - ), + recordsOutputPath: path.resolve(testPath, "records.json"), target: "node", node: { __dirname: false @@ -16,4 +14,4 @@ module.exports = { pkgs: path.resolve(__dirname, "pkgs") } } -}; +}); diff --git a/test/configCases/records/issue-7339/test.js b/test/configCases/records/issue-7339/test.js index 98081ef1c8a..2c238d398b2 100644 --- a/test/configCases/records/issue-7339/test.js +++ b/test/configCases/records/issue-7339/test.js @@ -6,5 +6,27 @@ it("should write relative dynamic-require paths to records", function() { var fs = require("fs"); var path = require("path"); var content = fs.readFileSync(path.join(__dirname, "records.json"), "utf-8"); - expect(content).toMatchSnapshot(); + + expect(JSON.parse(content)).toMatchObject({ + chunks: { + byName: { + main: 792 + }, + bySource: { + "0 main": 792 + }, + usedIds: [792] + }, + modules: { + byIdentifier: { + "./dependencies/bar.js": 666, + "./dependencies/foo.js": 147, + './dependencies|sync|/^\\.\\/.*$/': 239, + "./test.js": 329, + 'external node-commonjs "fs"': 896, + 'external node-commonjs "path"': 928 + }, + usedIds: [147, 239, 329, 666, 896, 928] + } + }); }); diff --git a/test/configCases/records/issue-7339/webpack.config.js b/test/configCases/records/issue-7339/webpack.config.js index 0d7b9410f4f..51047a992bb 100644 --- a/test/configCases/records/issue-7339/webpack.config.js +++ b/test/configCases/records/issue-7339/webpack.config.js @@ -1,13 +1,11 @@ -var path = require("path"); +const path = require("path"); -module.exports = { +/** @type {(env: Env, options: TestOptions) => import("../../../../").Configuration} */ +module.exports = (env, { testPath }) => ({ entry: "./test", - recordsOutputPath: path.resolve( - __dirname, - "../../../js/config/records/issue-7339/records.json" - ), + recordsOutputPath: path.resolve(testPath, "records.json"), target: "node", node: { __dirname: false } -}; +}); diff --git a/test/configCases/records/issue-7492/webpack.config.js b/test/configCases/records/issue-7492/webpack.config.js index 32bbc5f696e..14f0c37811b 100644 --- a/test/configCases/records/issue-7492/webpack.config.js +++ b/test/configCases/records/issue-7492/webpack.config.js @@ -1,5 +1,6 @@ -var path = require("path"); +const path = require("path"); +/** @type {import("../../../../").Configuration} */ module.exports = { entry: "./index", recordsInputPath: path.resolve(__dirname, "records.json"), diff --git a/test/configCases/records/stable-sort/webpack.config.js b/test/configCases/records/stable-sort/webpack.config.js index 56c58a64209..132be139b0a 100644 --- a/test/configCases/records/stable-sort/webpack.config.js +++ b/test/configCases/records/stable-sort/webpack.config.js @@ -1,17 +1,15 @@ -var path = require("path"); +const path = require("path"); -module.exports = { +/** @type {(env: Env, options: TestOptions) => import("../../../../").Configuration} */ +module.exports = (env, { testPath }) => ({ mode: "development", entry: "./test", - recordsOutputPath: path.resolve( - __dirname, - "../../../js/config/records/stable-sort/records.json" - ), + recordsOutputPath: path.resolve(testPath, "records.json"), optimization: { - namedChunks: false + chunkIds: "size" }, target: "node", node: { __dirname: false } -}; +}); diff --git a/test/configCases/records/with-readRecords-hook/ReadRecordsPlugin.js b/test/configCases/records/with-readRecords-hook/ReadRecordsPlugin.js new file mode 100644 index 00000000000..6ce7633e708 --- /dev/null +++ b/test/configCases/records/with-readRecords-hook/ReadRecordsPlugin.js @@ -0,0 +1,16 @@ +/** @typedef {import("../../../../").Compiler} Compiler */ + +class ReadRecordsPlugin { + /** + * @param {Compiler} compiler compiler + */ + apply(compiler) { + compiler.hooks.readRecords.tapAsync("ReadRecordsPlugin", callback => { + setTimeout(() => { + callback(); + }, 1000); + }); + } +} + +module.exports = ReadRecordsPlugin; diff --git a/test/configCases/records/with-readRecords-hook/async.js b/test/configCases/records/with-readRecords-hook/async.js new file mode 100644 index 00000000000..e08a1b185c2 --- /dev/null +++ b/test/configCases/records/with-readRecords-hook/async.js @@ -0,0 +1 @@ +import "vendor"; diff --git a/test/configCases/records/with-readRecords-hook/index.js b/test/configCases/records/with-readRecords-hook/index.js new file mode 100644 index 00000000000..15c49532184 --- /dev/null +++ b/test/configCases/records/with-readRecords-hook/index.js @@ -0,0 +1,3 @@ +it("should load fine", () => { + return import(/* webpackChunkName: "async" */"./async"); +}); diff --git a/test/configCases/records/with-readRecords-hook/node_modules/vendor.js b/test/configCases/records/with-readRecords-hook/node_modules/vendor.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/records/with-readRecords-hook/records.json b/test/configCases/records/with-readRecords-hook/records.json new file mode 100644 index 00000000000..dcca409b109 --- /dev/null +++ b/test/configCases/records/with-readRecords-hook/records.json @@ -0,0 +1,10 @@ +{ + "chunks": { + "byName": { + "vendors~async": 123 + }, + "bySource": { + "1 index.js ./async": 123 + } + } +} diff --git a/test/configCases/records/with-readRecords-hook/webpack.config.js b/test/configCases/records/with-readRecords-hook/webpack.config.js new file mode 100644 index 00000000000..503a8506c34 --- /dev/null +++ b/test/configCases/records/with-readRecords-hook/webpack.config.js @@ -0,0 +1,17 @@ +const path = require("path"); +const ReadRecordsPlugin = require("./ReadRecordsPlugin"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: "./index", + recordsInputPath: path.resolve(__dirname, "records.json"), + output: { + chunkFilename: "[name]-[chunkhash].js" + }, + plugins: [new ReadRecordsPlugin()], + optimization: { + splitChunks: { + minSize: 0 + } + } +}; diff --git a/test/configCases/require/module-require/a.js b/test/configCases/require/module-require/a.js new file mode 100644 index 00000000000..bd816eaba4c --- /dev/null +++ b/test/configCases/require/module-require/a.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/test/configCases/require/module-require/b.js b/test/configCases/require/module-require/b.js new file mode 100644 index 00000000000..4bbffde1044 --- /dev/null +++ b/test/configCases/require/module-require/b.js @@ -0,0 +1 @@ +module.exports = 2; diff --git a/test/configCases/require/module-require/c.js b/test/configCases/require/module-require/c.js new file mode 100644 index 00000000000..690aad34a46 --- /dev/null +++ b/test/configCases/require/module-require/c.js @@ -0,0 +1 @@ +module.exports = 3; diff --git a/test/configCases/require/module-require/d.js b/test/configCases/require/module-require/d.js new file mode 100644 index 00000000000..a9bbdd80578 --- /dev/null +++ b/test/configCases/require/module-require/d.js @@ -0,0 +1 @@ +module.exports = 4; diff --git a/test/configCases/require/module-require/foo/a.js b/test/configCases/require/module-require/foo/a.js new file mode 100644 index 00000000000..a9bbdd80578 --- /dev/null +++ b/test/configCases/require/module-require/foo/a.js @@ -0,0 +1 @@ +module.exports = 4; diff --git a/test/configCases/require/module-require/foo/c.js b/test/configCases/require/module-require/foo/c.js new file mode 100644 index 00000000000..f4e8d9d29a5 --- /dev/null +++ b/test/configCases/require/module-require/foo/c.js @@ -0,0 +1 @@ +module.exports = 5; diff --git a/test/configCases/require/module-require/index.js b/test/configCases/require/module-require/index.js new file mode 100644 index 00000000000..dfbe396ebdb --- /dev/null +++ b/test/configCases/require/module-require/index.js @@ -0,0 +1,75 @@ +import { createRequire as _createRequire } from "module"; +import { createRequire as __createRequire, builtinModules } from "module"; +import { createRequire as ___createRequire} from "node:module"; + +it("should evaluate require/createRequire", () => { + expect( + (function() { return typeof _createRequire; }).toString() + ).toBe('function() { return "function"; }'); + expect( + (function() { if (typeof _createRequire); }).toString() + ).toBe('function() { if (true); }'); + const require = __createRequire(import.meta.url); + expect( + (function() { return typeof require; }).toString() + ).toBe('function() { return "function"; }'); + expect( + (function() { if (typeof require); }).toString() + ).toBe('function() { if (true); }'); + expect( + (function() { return typeof ___createRequire; }).toString() + ).toBe('function() { return "function"; }'); + expect( + (function() { if (typeof ___createRequire); }).toString() + ).toBe('function() { if (true); }'); +}); + +it("should create require", () => { + const require = _createRequire(import.meta.url); + expect(require("./a")).toBe(1); + expect(_createRequire(import.meta.url)("./c")).toBe(3); + expect(__createRequire(import.meta.url)("./b")).toBe(2); + expect(___createRequire(import.meta.url)("./d")).toBe(4); + const requireNodePrefix = __createRequire(import.meta.url); + expect(requireNodePrefix("./a")).toBe(1); +}); + +it("should resolve using created require", () => { + const require = _createRequire(import.meta.url); + expect(require.resolve("./b")).toBe("./b.js"); + expect(_createRequire(import.meta.url).resolve("./b")).toBe("./b.js"); + expect(__createRequire(import.meta.url).resolve("./b")).toBe("./b.js"); + expect(___createRequire(import.meta.url).resolve("./b")).toBe("./b.js"); +}); + +it("should provide require.cache", () => { + const _require = _createRequire(import.meta.url); + expect(require.cache).toBe(_require.cache); + expect(require.cache).toBe(_createRequire(import.meta.url).cache); + expect(require.cache).toBe(__createRequire(import.meta.url).cache); + expect(require.cache).toBe(___createRequire(import.meta.url).cache); +}); + +it("should provide dependency context", () => { + const _require = _createRequire(new URL("./foo/c.js", import.meta.url)); + expect(_require("./a")).toBe(4); + const _require1 = _createRequire(new URL("./foo/", import.meta.url)); + expect(_require1("./c")).toBe(5); + const _require2 = ___createRequire(new URL("./foo/", import.meta.url)); + expect(_require2("./c")).toBe(5); +}); + +it("should add warning on using as expression", () => { + let _require = _createRequire(new URL("./foo/c.js", import.meta.url)); + const a = _require; + expect(typeof a).toBe("function"); +}); + +it("should add warning on using require.main", () => { + let _require = _createRequire(new URL("./foo/c.js", import.meta.url)); + expect(_require.main).toBe(undefined); +}); + +it("should import Node.js module", () => { + expect(Array.isArray(builtinModules)).toBe(true); +}); diff --git a/test/configCases/require/module-require/warnings.js b/test/configCases/require/module-require/warnings.js new file mode 100644 index 00000000000..c518f69bd24 --- /dev/null +++ b/test/configCases/require/module-require/warnings.js @@ -0,0 +1,4 @@ +module.exports = [ + /require function is used in a way in which dependencies cannot be statically extracted/, + /createRequire\(\)\.main is not supported by webpack/ +]; diff --git a/test/configCases/require/module-require/webpack.config.js b/test/configCases/require/module-require/webpack.config.js new file mode 100644 index 00000000000..fe99e3d1745 --- /dev/null +++ b/test/configCases/require/module-require/webpack.config.js @@ -0,0 +1,7 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "node", + optimization: { + moduleIds: "named" + } +}; diff --git a/test/configCases/resolve-merging/imports-fields/index.js b/test/configCases/resolve-merging/imports-fields/index.js new file mode 100644 index 00000000000..616dbc039b9 --- /dev/null +++ b/test/configCases/resolve-merging/imports-fields/index.js @@ -0,0 +1,8 @@ +import d1 from "./pkg.mjs"; +import d2 from "#internal"; +import { d3, d4 } from "lib"; + +it("imports field to resolve to the same", () => { + expect(d2).toBe(d1); + expect(d4).toBe(d3); +}); diff --git a/test/configCases/resolve-merging/imports-fields/node_modules/lib/index.js b/test/configCases/resolve-merging/imports-fields/node_modules/lib/index.js new file mode 100644 index 00000000000..1953c3537f5 --- /dev/null +++ b/test/configCases/resolve-merging/imports-fields/node_modules/lib/index.js @@ -0,0 +1,2 @@ +export { default as d3 } from "./lib.mjs"; +export { default as d4 } from "#internal"; diff --git a/test/configCases/resolve-merging/imports-fields/node_modules/lib/lib.mjs b/test/configCases/resolve-merging/imports-fields/node_modules/lib/lib.mjs new file mode 100644 index 00000000000..71c401bf2aa --- /dev/null +++ b/test/configCases/resolve-merging/imports-fields/node_modules/lib/lib.mjs @@ -0,0 +1 @@ +export default 'lib'; diff --git a/test/configCases/resolve-merging/imports-fields/node_modules/lib/package.json b/test/configCases/resolve-merging/imports-fields/node_modules/lib/package.json new file mode 100644 index 00000000000..a085977002b --- /dev/null +++ b/test/configCases/resolve-merging/imports-fields/node_modules/lib/package.json @@ -0,0 +1,6 @@ +{ + "name": "lib", + "hash-start": { + "#internal": "./lib.mjs" + } +} \ No newline at end of file diff --git a/test/configCases/resolve-merging/imports-fields/package.json b/test/configCases/resolve-merging/imports-fields/package.json new file mode 100644 index 00000000000..1843391bb5a --- /dev/null +++ b/test/configCases/resolve-merging/imports-fields/package.json @@ -0,0 +1,6 @@ +{ + "name": "pkg", + "imports": { + "#internal": "./pkg.mjs" + } +} \ No newline at end of file diff --git a/test/configCases/resolve-merging/imports-fields/pkg.mjs b/test/configCases/resolve-merging/imports-fields/pkg.mjs new file mode 100644 index 00000000000..3fa44fe7fa6 --- /dev/null +++ b/test/configCases/resolve-merging/imports-fields/pkg.mjs @@ -0,0 +1 @@ +export default 'pkg'; diff --git a/test/configCases/resolve-merging/imports-fields/webpack.config.js b/test/configCases/resolve-merging/imports-fields/webpack.config.js new file mode 100644 index 00000000000..a1150b90eed --- /dev/null +++ b/test/configCases/resolve-merging/imports-fields/webpack.config.js @@ -0,0 +1,6 @@ +module.exports = { + entry: "./index.js", + resolve: { + importsFields: ["hash-start", "..."] + } +}; diff --git a/test/configCases/resolve-merging/override/aaa.js b/test/configCases/resolve-merging/override/aaa.js new file mode 100644 index 00000000000..87f04f7b886 --- /dev/null +++ b/test/configCases/resolve-merging/override/aaa.js @@ -0,0 +1 @@ +export { default } from "./package"; diff --git a/test/configCases/resolve-merging/override/bbb.js b/test/configCases/resolve-merging/override/bbb.js new file mode 100644 index 00000000000..87f04f7b886 --- /dev/null +++ b/test/configCases/resolve-merging/override/bbb.js @@ -0,0 +1 @@ +export { default } from "./package"; diff --git a/test/configCases/resolve-merging/override/ccc.js b/test/configCases/resolve-merging/override/ccc.js new file mode 100644 index 00000000000..87f04f7b886 --- /dev/null +++ b/test/configCases/resolve-merging/override/ccc.js @@ -0,0 +1 @@ +export { default } from "./package"; diff --git a/test/configCases/resolve-merging/override/ddd.js b/test/configCases/resolve-merging/override/ddd.js new file mode 100644 index 00000000000..87f04f7b886 --- /dev/null +++ b/test/configCases/resolve-merging/override/ddd.js @@ -0,0 +1 @@ +export { default } from "./package"; diff --git a/test/configCases/resolve-merging/override/index.js b/test/configCases/resolve-merging/override/index.js new file mode 100644 index 00000000000..37d572dfaed --- /dev/null +++ b/test/configCases/resolve-merging/override/index.js @@ -0,0 +1,44 @@ +import value from "./package"; +import aaa from "./aaa"; +import bbb from "./bbb"; +import ccc from "./ccc"; +import ddd from "./ddd"; +import { a, b, c, d, e } from "./loader!./loader"; + +it("should use byDependency defaults", () => { + expect(value).toBe("module"); +}); + +it("should override byDependency defaults", () => { + expect(aaa).toBe("index"); +}); + +it("should merge in the correct order", () => { + expect(bbb).toBe("other"); +}); + +it("should keep byDependency intact", () => { + expect(ccc).toBe("module"); +}); + +it("should allow to change byDependency", () => { + expect(ddd).toBe("other"); +}); + +it("should use backward-compat resolve by default in loader", () => { + expect(a).toBe("require"); + expect(b).toBe("require"); +}); + +it("should allow to override in loader", () => { + expect(c).toBe("index"); +}); + +it("should allow to use custom dependencyType", () => { + expect(d).toBe("style"); + expect(e).toBe("default"); +}); + +it("should allow to alias 'byDependency'", () => { + expect(require("byDependency")).toBe("ok"); +}); diff --git a/test/configCases/resolve-merging/override/loader.js b/test/configCases/resolve-merging/override/loader.js new file mode 100644 index 00000000000..3bfe7dfee11 --- /dev/null +++ b/test/configCases/resolve-merging/override/loader.js @@ -0,0 +1,35 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = async function () { + const defaultResolve = this.getResolve({}); + const overrideResolve = this.getResolve({ + mainFields: [] + }); + const customKnownResolve = this.getResolve({ + dependencyType: "stylesheet" + }); + const customUnknownResolve = this.getResolve({ + dependencyType: "fizz" + }); + const resolved1 = await this.getResolve()(this.context, "package2"); + const resolved2 = await defaultResolve(this.context, "package2"); + const resolved3 = await overrideResolve(this.context, "./package"); + const resolved4 = await customKnownResolve(this.context, "package2"); + const resolved5 = await customUnknownResolve(this.context, "package2"); + // @ts-expect-error undefined should not be a valid type + expect(await defaultResolve(this.context, undefined).catch(e => "ok")).toBe( + "ok" + ); + // @ts-expect-error undefined should not be a valid type + expect(await defaultResolve(undefined, "package2").catch(e => "ok")).toBe( + "ok" + ); + // @ts-expect-error undefined should not be a valid type + expect(await defaultResolve(undefined).catch(e => "ok")).toBe("ok"); + return ` +export { default as a } from ${JSON.stringify(resolved1)}; +export { default as b } from ${JSON.stringify(resolved2)}; +export { default as c } from ${JSON.stringify(resolved3)}; +export { default as d } from ${JSON.stringify(resolved4)}; +export { default as e } from ${JSON.stringify(resolved5)}; +`; +}; diff --git a/test/configCases/resolve-merging/override/node_modules/byDependency.js b/test/configCases/resolve-merging/override/node_modules/byDependency.js new file mode 100644 index 00000000000..7748209324d --- /dev/null +++ b/test/configCases/resolve-merging/override/node_modules/byDependency.js @@ -0,0 +1 @@ +module.exports = "wrong"; diff --git a/test/configCases/resolve-merging/override/node_modules/ok.js b/test/configCases/resolve-merging/override/node_modules/ok.js new file mode 100644 index 00000000000..f74a2f2b564 --- /dev/null +++ b/test/configCases/resolve-merging/override/node_modules/ok.js @@ -0,0 +1 @@ +module.exports = "ok"; diff --git a/test/configCases/resolve-merging/override/node_modules/package2/default.js b/test/configCases/resolve-merging/override/node_modules/package2/default.js new file mode 100644 index 00000000000..17e060e96f9 --- /dev/null +++ b/test/configCases/resolve-merging/override/node_modules/package2/default.js @@ -0,0 +1 @@ +export default "default"; diff --git a/test/configCases/resolve-merging/override/node_modules/package2/import.js b/test/configCases/resolve-merging/override/node_modules/package2/import.js new file mode 100644 index 00000000000..7d3341883b8 --- /dev/null +++ b/test/configCases/resolve-merging/override/node_modules/package2/import.js @@ -0,0 +1 @@ +export default "import"; diff --git a/test/configCases/resolve-merging/override/node_modules/package2/index.js b/test/configCases/resolve-merging/override/node_modules/package2/index.js new file mode 100644 index 00000000000..95ec6bb65ed --- /dev/null +++ b/test/configCases/resolve-merging/override/node_modules/package2/index.js @@ -0,0 +1 @@ +export default "index"; diff --git a/test/configCases/resolve-merging/override/node_modules/package2/package.json b/test/configCases/resolve-merging/override/node_modules/package2/package.json new file mode 100644 index 00000000000..906c77fb620 --- /dev/null +++ b/test/configCases/resolve-merging/override/node_modules/package2/package.json @@ -0,0 +1,8 @@ +{ + "exports": { + "import": "./import.js", + "require": "./require.js", + "style": "./style.js", + "default": "./default.js" + } +} diff --git a/test/configCases/resolve-merging/override/node_modules/package2/require.js b/test/configCases/resolve-merging/override/node_modules/package2/require.js new file mode 100644 index 00000000000..c4159597fff --- /dev/null +++ b/test/configCases/resolve-merging/override/node_modules/package2/require.js @@ -0,0 +1 @@ +export default "require"; diff --git a/test/configCases/resolve-merging/override/node_modules/package2/style.js b/test/configCases/resolve-merging/override/node_modules/package2/style.js new file mode 100644 index 00000000000..21a648dd2ac --- /dev/null +++ b/test/configCases/resolve-merging/override/node_modules/package2/style.js @@ -0,0 +1 @@ +export default "style"; diff --git a/test/configCases/resolve-merging/override/package/index.js b/test/configCases/resolve-merging/override/package/index.js new file mode 100644 index 00000000000..95ec6bb65ed --- /dev/null +++ b/test/configCases/resolve-merging/override/package/index.js @@ -0,0 +1 @@ +export default "index"; diff --git a/test/configCases/resolve-merging/override/package/main.js b/test/configCases/resolve-merging/override/package/main.js new file mode 100644 index 00000000000..b515913d5d9 --- /dev/null +++ b/test/configCases/resolve-merging/override/package/main.js @@ -0,0 +1 @@ +export default "main"; diff --git a/test/configCases/resolve-merging/override/package/module.js b/test/configCases/resolve-merging/override/package/module.js new file mode 100644 index 00000000000..503bca78c72 --- /dev/null +++ b/test/configCases/resolve-merging/override/package/module.js @@ -0,0 +1 @@ +export default "module"; diff --git a/test/configCases/resolve-merging/override/package/other.js b/test/configCases/resolve-merging/override/package/other.js new file mode 100644 index 00000000000..6f1c564263f --- /dev/null +++ b/test/configCases/resolve-merging/override/package/other.js @@ -0,0 +1 @@ +export default "other"; diff --git a/test/configCases/resolve-merging/override/package/package.json b/test/configCases/resolve-merging/override/package/package.json new file mode 100644 index 00000000000..a7ac72171e3 --- /dev/null +++ b/test/configCases/resolve-merging/override/package/package.json @@ -0,0 +1,5 @@ +{ + "main": "./main", + "module": "./module", + "other": "./other" +} diff --git a/test/configCases/resolve-merging/override/webpack.config.js b/test/configCases/resolve-merging/override/webpack.config.js new file mode 100644 index 00000000000..4d790393546 --- /dev/null +++ b/test/configCases/resolve-merging/override/webpack.config.js @@ -0,0 +1,44 @@ +module.exports = { + resolve: { + alias: { + byDependency: "ok" + }, + byDependency: { + stylesheet: { + conditionNames: ["style", "..."] + } + } + }, + module: { + rules: [ + { + test: /aaa/, + resolve: { + mainFields: [] + } + }, + { + test: /bbb/, + resolve: { + mainFields: ["other", "..."] + } + }, + { + test: /ccc/, + resolve: { + mainFields: ["xyz", "..."] + } + }, + { + test: /ddd/, + resolve: { + byDependency: { + esm: { + mainFields: ["other", "..."] + } + } + } + } + ] + } +}; diff --git a/test/configCases/resolve/context-resolve-with-ignore/a/foo/a.js b/test/configCases/resolve/context-resolve-with-ignore/a/foo/a.js new file mode 100644 index 00000000000..e94fef18587 --- /dev/null +++ b/test/configCases/resolve/context-resolve-with-ignore/a/foo/a.js @@ -0,0 +1 @@ +export default "a"; diff --git a/test/configCases/resolve/context-resolve-with-ignore/a/foo/package.json b/test/configCases/resolve/context-resolve-with-ignore/a/foo/package.json new file mode 100644 index 00000000000..2f5d9e49074 --- /dev/null +++ b/test/configCases/resolve/context-resolve-with-ignore/a/foo/package.json @@ -0,0 +1,5 @@ +{ + "name": "foo", + "version": "1.0.0", + "module": "./a.js" +} diff --git a/test/configCases/resolve/context-resolve-with-ignore/b/foo/b.js b/test/configCases/resolve/context-resolve-with-ignore/b/foo/b.js new file mode 100644 index 00000000000..eff703ff465 --- /dev/null +++ b/test/configCases/resolve/context-resolve-with-ignore/b/foo/b.js @@ -0,0 +1 @@ +export default "b"; diff --git a/test/configCases/resolve/context-resolve-with-ignore/b/foo/package.json b/test/configCases/resolve/context-resolve-with-ignore/b/foo/package.json new file mode 100644 index 00000000000..3a389fbe8dc --- /dev/null +++ b/test/configCases/resolve/context-resolve-with-ignore/b/foo/package.json @@ -0,0 +1,5 @@ +{ + "name": "foo", + "version": "1.0.0", + "module": "./b.js" +} diff --git a/test/configCases/resolve/context-resolve-with-ignore/index.js b/test/configCases/resolve/context-resolve-with-ignore/index.js new file mode 100644 index 00000000000..11b5574fbdd --- /dev/null +++ b/test/configCases/resolve/context-resolve-with-ignore/index.js @@ -0,0 +1,7 @@ +const a = String.fromCharCode("a".charCodeAt(0)); +const b = String.fromCharCode("b".charCodeAt(0)); + +it("should compile correctly", async () => { + expect((await /* webpackMode: "lazy" */ import(`foo/${a}`)).default).toEqual({}); + expect((await /* webpackMode: "lazy" */ import(`foo/${b}`)).default).toBe("b"); +}); diff --git a/test/configCases/resolve/context-resolve-with-ignore/webpack.config.js b/test/configCases/resolve/context-resolve-with-ignore/webpack.config.js new file mode 100644 index 00000000000..24884ab1c2e --- /dev/null +++ b/test/configCases/resolve/context-resolve-with-ignore/webpack.config.js @@ -0,0 +1,11 @@ +const path = require("path"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + resolve: { + modules: [path.resolve(__dirname, "a"), path.resolve(__dirname, "b")], + alias: { + [path.resolve(__dirname, "a", "foo")]: false + } + } +}; diff --git a/test/configCases/resolve/empty-context-module/index.js b/test/configCases/resolve/empty-context-module/index.js new file mode 100644 index 00000000000..289942993cb --- /dev/null +++ b/test/configCases/resolve/empty-context-module/index.js @@ -0,0 +1,7 @@ +const id = () => Math.random(); + +it("should compile", async () => { + await expect(/* webpackMode: "lazy" */ import(`foo/${id()}`)).rejects.toBeTruthy(); + await expect(/* webpackMode: "lazy" */ import(`foo/${id()}`)).rejects.toBeTruthy(); + await expect(/* webpackMode: "lazy" */ import(`foo/${id()}`)).rejects.toBeTruthy(); +}); diff --git a/test/configCases/resolve/empty-context-module/webpack.config.js b/test/configCases/resolve/empty-context-module/webpack.config.js new file mode 100644 index 00000000000..bfefc9c737a --- /dev/null +++ b/test/configCases/resolve/empty-context-module/webpack.config.js @@ -0,0 +1,20 @@ +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + cache: true, + resolve: { + alias: { + foo: false + }, + unsafeCache: true + } + }, + { + resolve: { + alias: { + foo: false + }, + unsafeCache: true + } + } +]; diff --git a/test/configCases/resolve/fallback/#/a.js b/test/configCases/resolve/fallback/#/a.js new file mode 100644 index 00000000000..bd816eaba4c --- /dev/null +++ b/test/configCases/resolve/fallback/#/a.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/test/configCases/resolve/fallback/a/1.js b/test/configCases/resolve/fallback/a/1.js new file mode 100644 index 00000000000..bd816eaba4c --- /dev/null +++ b/test/configCases/resolve/fallback/a/1.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/test/configCases/resolve/fallback/a/2.js b/test/configCases/resolve/fallback/a/2.js new file mode 100644 index 00000000000..f7377f82003 --- /dev/null +++ b/test/configCases/resolve/fallback/a/2.js @@ -0,0 +1 @@ +module.exports = 'not 2'; diff --git a/test/configCases/resolve/fallback/b/2.js b/test/configCases/resolve/fallback/b/2.js new file mode 100644 index 00000000000..4bbffde1044 --- /dev/null +++ b/test/configCases/resolve/fallback/b/2.js @@ -0,0 +1 @@ +module.exports = 2; diff --git a/test/configCases/resolve/fallback/index.js b/test/configCases/resolve/fallback/index.js new file mode 100644 index 00000000000..846ed16deb8 --- /dev/null +++ b/test/configCases/resolve/fallback/index.js @@ -0,0 +1,14 @@ +it("ignores the fallback if an existing module is present", () => { + const two = require("./b/2"); + expect(two).toBe(2); +}); + +it("can fallback if the module does not exist", () => { + const one = require("./b/1"); + expect(one).toBe(1); +}); + +it("# alias should work", () => { + const one = require("#/a"); + expect(one).toBe(1); +}); diff --git a/test/configCases/resolve/fallback/webpack.config.js b/test/configCases/resolve/fallback/webpack.config.js new file mode 100644 index 00000000000..65417c326c0 --- /dev/null +++ b/test/configCases/resolve/fallback/webpack.config.js @@ -0,0 +1,12 @@ +const path = require("path"); +/** @type {import("../../../../").Configuration} */ +module.exports = { + resolve: { + alias: { + "#": path.resolve(__dirname, "#") + }, + fallback: { + "./b": path.resolve(__dirname, "a") + } + } +}; diff --git a/test/configCases/resolve/function-plugins/foo.js b/test/configCases/resolve/function-plugins/foo.js new file mode 100644 index 00000000000..aef22247d75 --- /dev/null +++ b/test/configCases/resolve/function-plugins/foo.js @@ -0,0 +1 @@ +export default 1; diff --git a/test/configCases/resolve/function-plugins/index.js b/test/configCases/resolve/function-plugins/index.js new file mode 100644 index 00000000000..d967c5d0575 --- /dev/null +++ b/test/configCases/resolve/function-plugins/index.js @@ -0,0 +1,3 @@ +it("should compile", async () => { + expect(1).toBe(1); +}); diff --git a/test/configCases/resolve/function-plugins/webpack.config.js b/test/configCases/resolve/function-plugins/webpack.config.js new file mode 100644 index 00000000000..56c493fca27 --- /dev/null +++ b/test/configCases/resolve/function-plugins/webpack.config.js @@ -0,0 +1,26 @@ +let pluginExecutionCounter = 0; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [ + { + apply(compiler) { + compiler.hooks.done.tap("TestPlugin", () => { + expect(pluginExecutionCounter).toBeGreaterThan(0); + }); + } + } + ], + resolve: { + plugins: [ + { + apply() { + pluginExecutionCounter += 1; + } + }, + () => { + pluginExecutionCounter += 1; + } + ] + } +}; diff --git a/test/configCases/resolve/issue-11335-context-module/index.js b/test/configCases/resolve/issue-11335-context-module/index.js new file mode 100644 index 00000000000..d4784570ea4 --- /dev/null +++ b/test/configCases/resolve/issue-11335-context-module/index.js @@ -0,0 +1,18 @@ +import a from "app/widgets/a"; +import b from "app/widgets/b"; +import c from "app/widgets/c"; + + +it("static imports order", () => { + expect(a).toBe("main/widgets/a"); + expect(b).toBe("main/widgets/b"); + expect(c).toBe("foo/widgets/c"); +}); + +const load = id => import(/* webpackMode: "eager" */ `app/widgets/${id}?query#hash`); + +it("dynamic imports order", async () => { + expect((await load("a")).default).toBe("main/widgets/a"); + expect((await load("b")).default).toBe("main/widgets/b"); + expect((await load("c")).default).toBe("foo/widgets/c"); +}); diff --git a/test/configCases/resolve/issue-11335-context-module/src/foo/widgets/b.js b/test/configCases/resolve/issue-11335-context-module/src/foo/widgets/b.js new file mode 100644 index 00000000000..9b6f2974934 --- /dev/null +++ b/test/configCases/resolve/issue-11335-context-module/src/foo/widgets/b.js @@ -0,0 +1 @@ +export default "foo/widgets/b"; diff --git a/test/configCases/resolve/issue-11335-context-module/src/foo/widgets/c.js b/test/configCases/resolve/issue-11335-context-module/src/foo/widgets/c.js new file mode 100644 index 00000000000..0de4d4fb702 --- /dev/null +++ b/test/configCases/resolve/issue-11335-context-module/src/foo/widgets/c.js @@ -0,0 +1 @@ +export default "foo/widgets/c"; diff --git a/test/configCases/resolve/issue-11335-context-module/src/main/widgets/a.js b/test/configCases/resolve/issue-11335-context-module/src/main/widgets/a.js new file mode 100644 index 00000000000..b6d0dbb4492 --- /dev/null +++ b/test/configCases/resolve/issue-11335-context-module/src/main/widgets/a.js @@ -0,0 +1 @@ +export default "main/widgets/a"; diff --git a/test/configCases/resolve/issue-11335-context-module/src/main/widgets/b.js b/test/configCases/resolve/issue-11335-context-module/src/main/widgets/b.js new file mode 100644 index 00000000000..0b8fa8212af --- /dev/null +++ b/test/configCases/resolve/issue-11335-context-module/src/main/widgets/b.js @@ -0,0 +1 @@ +export default "main/widgets/b"; diff --git a/test/configCases/resolve/issue-11335-context-module/webpack.config.js b/test/configCases/resolve/issue-11335-context-module/webpack.config.js new file mode 100644 index 00000000000..d1c50dcaac7 --- /dev/null +++ b/test/configCases/resolve/issue-11335-context-module/webpack.config.js @@ -0,0 +1,10 @@ +const path = require("path"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + resolve: { + alias: { + app: [path.join(__dirname, "src/main"), path.join(__dirname, "src/foo")] + } + } +}; diff --git a/test/configCases/resolve/issue-15580/index.js b/test/configCases/resolve/issue-15580/index.js new file mode 100644 index 00000000000..6b17761ce31 --- /dev/null +++ b/test/configCases/resolve/issue-15580/index.js @@ -0,0 +1,19 @@ +const locales = import.meta.webpackContext('./locales', { + recursive: false, + regExp: /(en|hu)\.json$/i, +}); +const vuetify = import.meta.webpackContext('vuetify/lib/locale', { + recursive: false, + regExp: /(en|hu)\.json$/i, +}); + +it('should resolve "./locales"', () => { + expect(locales("./en.json")).toEqual({}); + expect(() => locales("./hu.json")).toThrow(); +}); + +it('should resolve "vuetify"', () => { + expect(vuetify("./en.json")).toEqual({}); + expect(vuetify("./hu.json")).toEqual({}); + expect(() => vuetify("./ru.json")).toThrow(); +}); diff --git a/test/configCases/resolve/issue-15580/locales/en.json b/test/configCases/resolve/issue-15580/locales/en.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/test/configCases/resolve/issue-15580/locales/en.json @@ -0,0 +1 @@ +{} diff --git a/test/configCases/resolve/issue-15580/node_modules/vuetify/lib/locale/en.json b/test/configCases/resolve/issue-15580/node_modules/vuetify/lib/locale/en.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/test/configCases/resolve/issue-15580/node_modules/vuetify/lib/locale/en.json @@ -0,0 +1 @@ +{} diff --git a/test/configCases/resolve/issue-15580/node_modules/vuetify/lib/locale/hu.json b/test/configCases/resolve/issue-15580/node_modules/vuetify/lib/locale/hu.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/test/configCases/resolve/issue-15580/node_modules/vuetify/lib/locale/hu.json @@ -0,0 +1 @@ +{} diff --git a/test/configCases/resolve/issue-15580/node_modules/vuetify/lib/locale/ru.json b/test/configCases/resolve/issue-15580/node_modules/vuetify/lib/locale/ru.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/test/configCases/resolve/issue-15580/node_modules/vuetify/lib/locale/ru.json @@ -0,0 +1 @@ +{} diff --git a/test/configCases/resolve/issue-15580/node_modules/vuetify/package.json b/test/configCases/resolve/issue-15580/node_modules/vuetify/package.json new file mode 100644 index 00000000000..91189b88e1d --- /dev/null +++ b/test/configCases/resolve/issue-15580/node_modules/vuetify/package.json @@ -0,0 +1,4 @@ +{ + "name": "vuetify", + "version": "1.0.0" +} diff --git a/test/configCases/resolve/issue-15580/webpack.config.js b/test/configCases/resolve/issue-15580/webpack.config.js new file mode 100644 index 00000000000..c39ef077cad --- /dev/null +++ b/test/configCases/resolve/issue-15580/webpack.config.js @@ -0,0 +1,8 @@ +const path = require("path"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + resolve: { + modules: ["node_modules", path.resolve(__dirname, "./node_modules")] + } +}; diff --git a/test/configCases/resolve/multi-alias/a/1.js b/test/configCases/resolve/multi-alias/a/1.js new file mode 100644 index 00000000000..bd816eaba4c --- /dev/null +++ b/test/configCases/resolve/multi-alias/a/1.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/test/configCases/resolve/multi-alias/b/2.js b/test/configCases/resolve/multi-alias/b/2.js new file mode 100644 index 00000000000..4bbffde1044 --- /dev/null +++ b/test/configCases/resolve/multi-alias/b/2.js @@ -0,0 +1 @@ +module.exports = 2; diff --git a/test/configCases/resolve/multi-alias/index.js b/test/configCases/resolve/multi-alias/index.js new file mode 100644 index 00000000000..b64161dbec4 --- /dev/null +++ b/test/configCases/resolve/multi-alias/index.js @@ -0,0 +1,6 @@ +it("should resolve both alternatives", () => { + const one = require("_/1"); + const two = require("_/2"); + expect(one).toBe(1); + expect(two).toBe(2); +}); diff --git a/test/configCases/resolve/multi-alias/webpack.config.js b/test/configCases/resolve/multi-alias/webpack.config.js new file mode 100644 index 00000000000..5d07a13869c --- /dev/null +++ b/test/configCases/resolve/multi-alias/webpack.config.js @@ -0,0 +1,9 @@ +const path = require("path"); +/** @type {import("../../../../").Configuration} */ +module.exports = { + resolve: { + alias: { + _: [path.resolve(__dirname, "a"), path.resolve(__dirname, "b")] + } + } +}; diff --git a/test/configCases/resolve/only-module/a/1.js b/test/configCases/resolve/only-module/a/1.js new file mode 100644 index 00000000000..bd816eaba4c --- /dev/null +++ b/test/configCases/resolve/only-module/a/1.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/test/configCases/resolve/only-module/b/2.js b/test/configCases/resolve/only-module/b/2.js new file mode 100644 index 00000000000..4bbffde1044 --- /dev/null +++ b/test/configCases/resolve/only-module/b/2.js @@ -0,0 +1 @@ +module.exports = 2; diff --git a/test/configCases/resolve/only-module/index.js b/test/configCases/resolve/only-module/index.js new file mode 100644 index 00000000000..07a3d469126 --- /dev/null +++ b/test/configCases/resolve/only-module/index.js @@ -0,0 +1,6 @@ +it("should resolve both alternatives", () => { + const one = require("./b"); + const two = require("./b/2"); + expect(one).toBe(1); + expect(two).toBe(2); +}); diff --git a/test/configCases/resolve/only-module/webpack.config.js b/test/configCases/resolve/only-module/webpack.config.js new file mode 100644 index 00000000000..f5e18d67593 --- /dev/null +++ b/test/configCases/resolve/only-module/webpack.config.js @@ -0,0 +1,13 @@ +const path = require("path"); +/** @type {import("../../../../").Configuration} */ +module.exports = { + resolve: { + alias: [ + { + alias: path.resolve(__dirname, "a/1.js"), + name: "./b", + onlyModule: true + } + ] + } +}; diff --git a/test/configCases/resolve/unsafe-cache-proxy/a/1.js b/test/configCases/resolve/unsafe-cache-proxy/a/1.js new file mode 100644 index 00000000000..bd816eaba4c --- /dev/null +++ b/test/configCases/resolve/unsafe-cache-proxy/a/1.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/test/configCases/resolve/unsafe-cache-proxy/b/2.js b/test/configCases/resolve/unsafe-cache-proxy/b/2.js new file mode 100644 index 00000000000..4bbffde1044 --- /dev/null +++ b/test/configCases/resolve/unsafe-cache-proxy/b/2.js @@ -0,0 +1 @@ +module.exports = 2; diff --git a/test/configCases/resolve/unsafe-cache-proxy/index.js b/test/configCases/resolve/unsafe-cache-proxy/index.js new file mode 100644 index 00000000000..b64161dbec4 --- /dev/null +++ b/test/configCases/resolve/unsafe-cache-proxy/index.js @@ -0,0 +1,6 @@ +it("should resolve both alternatives", () => { + const one = require("_/1"); + const two = require("_/2"); + expect(one).toBe(1); + expect(two).toBe(2); +}); diff --git a/test/configCases/resolve/unsafe-cache-proxy/webpack.config.js b/test/configCases/resolve/unsafe-cache-proxy/webpack.config.js new file mode 100644 index 00000000000..b701fc1a36c --- /dev/null +++ b/test/configCases/resolve/unsafe-cache-proxy/webpack.config.js @@ -0,0 +1,43 @@ +const path = require("path"); + +let getCounter = 0; +let setConter = 0; + +const unsafeCache = new Proxy( + {}, + { + get(target, key, receiver) { + getCounter += 1; + + return Reflect.get(target, key, receiver); + }, + set(target, key, value, receiver) { + setConter += 1; + + return Reflect.set(target, key, value, receiver); + } + } +); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [ + { + apply(compiler) { + compiler.hooks.done.tap("TestPlugin", () => { + if (getCounter === 0 || setConter === 0) { + throw new Error( + "resolve.unsafeCache doesn't work with the `Proxy`" + ); + } + }); + } + } + ], + resolve: { + alias: { + _: [path.resolve(__dirname, "a"), path.resolve(__dirname, "b")] + }, + unsafeCache + } +}; diff --git a/test/configCases/resolving/extensions-order/a b/test/configCases/resolving/extensions-order/a new file mode 100644 index 00000000000..ba0e0f3e141 --- /dev/null +++ b/test/configCases/resolving/extensions-order/a @@ -0,0 +1 @@ +module.exports = "1"; diff --git a/test/configCases/resolving/extensions-order/a.js b/test/configCases/resolving/extensions-order/a.js new file mode 100644 index 00000000000..c202b851341 --- /dev/null +++ b/test/configCases/resolving/extensions-order/a.js @@ -0,0 +1 @@ +module.exports = "2"; diff --git a/test/configCases/resolving/extensions-order/b b/test/configCases/resolving/extensions-order/b new file mode 100644 index 00000000000..d7feebaefa8 --- /dev/null +++ b/test/configCases/resolving/extensions-order/b @@ -0,0 +1 @@ +module.exports = "1" diff --git a/test/configCases/resolving/extensions-order/b.json b/test/configCases/resolving/extensions-order/b.json new file mode 100644 index 00000000000..f549b14af74 --- /dev/null +++ b/test/configCases/resolving/extensions-order/b.json @@ -0,0 +1 @@ +{ "b": "2" } diff --git a/test/configCases/resolving/extensions-order/index.js b/test/configCases/resolving/extensions-order/index.js new file mode 100644 index 00000000000..d927e9f145c --- /dev/null +++ b/test/configCases/resolving/extensions-order/index.js @@ -0,0 +1,4 @@ +it("should resolve respecting resolve.extensions order when enforceExtension: true", () => { + expect(require("./a")).toBe("2"); + expect(require("./b")).toBe("1"); +}); diff --git a/test/configCases/resolving/extensions-order/webpack.config.js b/test/configCases/resolving/extensions-order/webpack.config.js new file mode 100644 index 00000000000..6d1fa7e19f4 --- /dev/null +++ b/test/configCases/resolving/extensions-order/webpack.config.js @@ -0,0 +1,5 @@ +module.exports = { + resolve: { + extensions: [".js", "", ".json"] + } +}; diff --git a/test/configCases/resolving/prefer-absolute/index.js b/test/configCases/resolving/prefer-absolute/index.js new file mode 100644 index 00000000000..d4596060154 --- /dev/null +++ b/test/configCases/resolving/prefer-absolute/index.js @@ -0,0 +1,3 @@ +it("should be possible to import an absolute path", () => { + require(__filename); +}); diff --git a/test/configCases/resolving/prefer-absolute/webpack.config.js b/test/configCases/resolving/prefer-absolute/webpack.config.js new file mode 100644 index 00000000000..4e6a640257b --- /dev/null +++ b/test/configCases/resolving/prefer-absolute/webpack.config.js @@ -0,0 +1,34 @@ +/** @typedef {import("enhanced-resolve").Resolver} Resolver */ +/** @typedef {import("enhanced-resolve").ResolveRequest} ResolveRequest */ +/** @typedef {import("enhanced-resolve").ResolveContext} ResolveContext */ + +/** + * @template T, R + * @typedef {import("tapable").SyncBailHook} SyncBailHook + */ + +/** @type {import("../../../../").Configuration} */ + +module.exports = { + resolve: { + preferAbsolute: true, + plugins: [ + { + /** + * @param {Resolver & { hooks: { file: SyncBailHook<[ResolveRequest, ResolveContext], void> } }} resolver resolver + */ + apply(resolver) { + resolver.hooks.file.tap("Test", (request, resolverContext) => { + if ( + /test.configCases.*test.configCases/.test( + /** @type {string} */ + (request.path) + ) + ) + throw new Error("Trying to resolve as root path"); + }); + } + } + ] + } +}; diff --git a/test/configCases/resolving/prefer-root/index.js b/test/configCases/resolving/prefer-root/index.js new file mode 100644 index 00000000000..6affd3f1444 --- /dev/null +++ b/test/configCases/resolving/prefer-root/index.js @@ -0,0 +1,3 @@ +it("should be possible to import an root path", () => { + require("/index.js"); +}); diff --git a/test/configCases/resolving/prefer-root/webpack.config.js b/test/configCases/resolving/prefer-root/webpack.config.js new file mode 100644 index 00000000000..a7ad545c248 --- /dev/null +++ b/test/configCases/resolving/prefer-root/webpack.config.js @@ -0,0 +1,27 @@ +/** @typedef {import("enhanced-resolve").Resolver} Resolver */ +/** @typedef {import("enhanced-resolve").ResolveRequest} ResolveRequest */ +/** @typedef {import("enhanced-resolve").ResolveContext} ResolveContext */ + +/** + * @template T, R + * @typedef {import("tapable").SyncBailHook} SyncBailHook + */ + +/** @type {import("../../../../").Configuration} */ +module.exports = { + resolve: { + plugins: [ + { + /** + * @param {Resolver & { hooks: { file: SyncBailHook<[ResolveRequest, ResolveContext], void> } }} resolver resolver + */ + apply(resolver) { + resolver.hooks.file.tap("Test", (request, resolverContext) => { + if (request.path === "/index.js") + throw new Error("Trying to resolve as absolute path"); + }); + } + } + ] + } +}; diff --git a/test/configCases/rule-set/chaining/deprecations.js b/test/configCases/rule-set/chaining/deprecations.js new file mode 100644 index 00000000000..6452ef04180 --- /dev/null +++ b/test/configCases/rule-set/chaining/deprecations.js @@ -0,0 +1,18 @@ +module.exports = [ + { + code: /DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING/, + message: /rules\[0\].use\[0\]/ + }, + { + code: /DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING/, + message: /rules\[0\].use\[1\]/ + }, + { + code: /DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING/, + message: /rules\[1\].use\[0\]/ + }, + { + code: /DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING/, + message: /rules\[1\].use\[1\]/ + } +]; diff --git a/test/configCases/rule-set/chaining/loader.js b/test/configCases/rule-set/chaining/loader.js index f78d43c0b78..84836e5dae5 100644 --- a/test/configCases/rule-set/chaining/loader.js +++ b/test/configCases/rule-set/chaining/loader.js @@ -1,8 +1,8 @@ -module.exports = function(source) { +/** @type {import("../../../../").LoaderDefinition<{ get(): string }>} */ +module.exports = function (source) { var query = this.query; - if(typeof query === "object" && typeof query.get === "function") { + if (typeof query === "object" && typeof query.get === "function") { query = query.get(); } return source + "\nmodule.exports.push(" + JSON.stringify(query) + ");"; }; - diff --git a/test/configCases/rule-set/chaining/webpack.config.js b/test/configCases/rule-set/chaining/webpack.config.js index 65b6f40e563..88c052b57b6 100644 --- a/test/configCases/rule-set/chaining/webpack.config.js +++ b/test/configCases/rule-set/chaining/webpack.config.js @@ -1,13 +1,32 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { module: { rules: [ { resource: /abc\.js$/, - loader: "./loader?a!./loader?b" + use: [ + { + loader: "./loader", + options: "a" + }, + { + loader: "./loader", + options: "b" + } + ] }, { resource: /def\.js$/, - loaders: "./loader?c!./loader?d" + use: [ + { + loader: "./loader", + options: "c" + }, + { + loader: "./loader", + options: "d" + } + ] } ] } diff --git a/test/configCases/rule-set/compiler/loader.js b/test/configCases/rule-set/compiler/loader.js index 196d1ef49db..b57f18e5dae 100644 --- a/test/configCases/rule-set/compiler/loader.js +++ b/test/configCases/rule-set/compiler/loader.js @@ -1,4 +1,4 @@ -module.exports = function(source) { +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { return "module.exports = " + JSON.stringify("loader matched"); }; - diff --git a/test/configCases/rule-set/compiler/webpack.config.js b/test/configCases/rule-set/compiler/webpack.config.js index 3b42db9b0b2..11c0be4e04e 100644 --- a/test/configCases/rule-set/compiler/webpack.config.js +++ b/test/configCases/rule-set/compiler/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { name: "compiler-name", module: { diff --git a/test/configCases/rule-set/custom/loader.js b/test/configCases/rule-set/custom/loader.js index f78d43c0b78..84836e5dae5 100644 --- a/test/configCases/rule-set/custom/loader.js +++ b/test/configCases/rule-set/custom/loader.js @@ -1,8 +1,8 @@ -module.exports = function(source) { +/** @type {import("../../../../").LoaderDefinition<{ get(): string }>} */ +module.exports = function (source) { var query = this.query; - if(typeof query === "object" && typeof query.get === "function") { + if (typeof query === "object" && typeof query.get === "function") { query = query.get(); } return source + "\nmodule.exports.push(" + JSON.stringify(query) + ");"; }; - diff --git a/test/configCases/rule-set/custom/webpack.config.js b/test/configCases/rule-set/custom/webpack.config.js index 91600897164..c1170eccbf4 100644 --- a/test/configCases/rule-set/custom/webpack.config.js +++ b/test/configCases/rule-set/custom/webpack.config.js @@ -1,17 +1,24 @@ +/** @typedef {import("../../../../").RuleSetUseFunction} RuleSetUseFunction */ +/** @typedef {import("../../../../").RuleSetUseItem} RuleSetUseItem */ + +/** @type {import("../../../../").Configuration} */ module.exports = { module: { rules: [ { test: /[ab]\.js$/, - use: function(data) { - return { + /** @type {RuleSetUseFunction} */ + use(data) { + return /** @type {RuleSetUseItem} */ ({ loader: "./loader", options: { - resource: data.resource.replace(/^.*[\\/]/g, ""), + resource: + /** @type {string} */ + (data.resource).replace(/^.*[\\/]/g, ""), resourceQuery: data.resourceQuery, issuer: data.issuer.replace(/^.*[\\/]/g, "") } - }; + }); } } ] diff --git a/test/configCases/rule-set/oneOf/css-loader.js b/test/configCases/rule-set/oneOf/css-loader.js new file mode 100644 index 00000000000..d315e602993 --- /dev/null +++ b/test/configCases/rule-set/oneOf/css-loader.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition<{ get(): string }>} */ +module.exports = function (source) { + return "module.exports='__css__'" +} \ No newline at end of file diff --git a/test/configCases/rule-set/oneOf/index.css b/test/configCases/rule-set/oneOf/index.css new file mode 100644 index 00000000000..3cf023e854b --- /dev/null +++ b/test/configCases/rule-set/oneOf/index.css @@ -0,0 +1,3 @@ +body { + color: red; +} \ No newline at end of file diff --git a/test/configCases/rule-set/oneOf/index.js b/test/configCases/rule-set/oneOf/index.js new file mode 100644 index 00000000000..8b362b5374e --- /dev/null +++ b/test/configCases/rule-set/oneOf/index.js @@ -0,0 +1,4 @@ +it("should return the content processed by css-loader instead of asset/resource", function () { + var a1 = require("./index.css"); + expect(a1).toEqual("__css__"); +}); diff --git a/test/configCases/rule-set/oneOf/style-loader.js b/test/configCases/rule-set/oneOf/style-loader.js new file mode 100644 index 00000000000..e27e1337cfb --- /dev/null +++ b/test/configCases/rule-set/oneOf/style-loader.js @@ -0,0 +1,26 @@ +/** @typedef {import("../../../../types").LoaderDefinition} LoaderDefinition */ +/** @typedef {import("../../../../types").LoaderContext<{}>} LoaderContext */ + +/** + * @type {LoaderDefinition} + */ +module.exports.pitch = function (request) { + return ` + var content = require(${stringifyRequest(this, `!!${request}`)}); + module.exports = content; + ` +}; + +/** + * @param {LoaderContext} loaderContext loaderContext + * @param {string} request request + * @returns {string} stringified request + */ +function stringifyRequest(loaderContext, request) { + return JSON.stringify( + loaderContext.utils.contextify( + loaderContext.context || loaderContext.rootContext, + request + ) + ) +} diff --git a/test/configCases/rule-set/oneOf/webpack.config.js b/test/configCases/rule-set/oneOf/webpack.config.js new file mode 100644 index 00000000000..1e19a358be6 --- /dev/null +++ b/test/configCases/rule-set/oneOf/webpack.config.js @@ -0,0 +1,24 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + output: { + assetModuleFilename: "[name][ext]" + }, + module: { + rules: [ + { + test: /\.css$/, + oneOf: [ + { + use: ["./style-loader", "./css-loader"], + issuer: /\.(js)$/ + }, + { + type: "asset/resource", + issuer: /\.(css|scss|sass)$/ + } + ] + } + ] + } +}; diff --git a/test/configCases/rule-set/query/index.js b/test/configCases/rule-set/query/index.js index 7114b977882..ea461d53b7f 100644 --- a/test/configCases/rule-set/query/index.js +++ b/test/configCases/rule-set/query/index.js @@ -1,15 +1,10 @@ -it("should match rule with resource query", function() { +it("should match rule with resource query", function () { var a1 = require("./a"); - expect(a1).toEqual([ - "a" - ]); + expect(a1).toEqual(["a"]); var a2 = require("./a?loader"); - expect(a2).toEqual([ - "a", - "?query" - ]); + expect(a2).toEqual(["a", "?query"]); var a3 = require("./a?other"); - expect(a3).toEqual([ - "a" - ]); + expect(a3).toEqual(["a"]); + var a4 = require('data:application/node,module.exports = ["a"];'); + expect(a4).toEqual(["a"]); }); diff --git a/test/configCases/rule-set/query/loader.js b/test/configCases/rule-set/query/loader.js index f78d43c0b78..84836e5dae5 100644 --- a/test/configCases/rule-set/query/loader.js +++ b/test/configCases/rule-set/query/loader.js @@ -1,8 +1,8 @@ -module.exports = function(source) { +/** @type {import("../../../../").LoaderDefinition<{ get(): string }>} */ +module.exports = function (source) { var query = this.query; - if(typeof query === "object" && typeof query.get === "function") { + if (typeof query === "object" && typeof query.get === "function") { query = query.get(); } return source + "\nmodule.exports.push(" + JSON.stringify(query) + ");"; }; - diff --git a/test/configCases/rule-set/query/webpack.config.js b/test/configCases/rule-set/query/webpack.config.js index cfa3e696e5f..589fd6fe6f8 100644 --- a/test/configCases/rule-set/query/webpack.config.js +++ b/test/configCases/rule-set/query/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { module: { rules: [ diff --git a/test/configCases/rule-set/resolve-options/a.js b/test/configCases/rule-set/resolve-options/a.js index f7293f306a0..79895f97110 100644 --- a/test/configCases/rule-set/resolve-options/a.js +++ b/test/configCases/rule-set/resolve-options/a.js @@ -1 +1 @@ -module.exports = require("./wrong"); +module.exports = require("./wrong") + require("./normal") + require("./wrong2"); diff --git a/test/configCases/rule-set/resolve-options/b.js b/test/configCases/rule-set/resolve-options/b.js index f7293f306a0..79895f97110 100644 --- a/test/configCases/rule-set/resolve-options/b.js +++ b/test/configCases/rule-set/resolve-options/b.js @@ -1 +1 @@ -module.exports = require("./wrong"); +module.exports = require("./wrong") + require("./normal") + require("./wrong2"); diff --git a/test/configCases/rule-set/resolve-options/c.js b/test/configCases/rule-set/resolve-options/c.js new file mode 100644 index 00000000000..79895f97110 --- /dev/null +++ b/test/configCases/rule-set/resolve-options/c.js @@ -0,0 +1 @@ +module.exports = require("./wrong") + require("./normal") + require("./wrong2"); diff --git a/test/configCases/rule-set/resolve-options/index.js b/test/configCases/rule-set/resolve-options/index.js index 5baf4c239f1..1e4104ab439 100644 --- a/test/configCases/rule-set/resolve-options/index.js +++ b/test/configCases/rule-set/resolve-options/index.js @@ -1,6 +1,8 @@ it("should allow to set custom resolving rules", function() { var a = require("./a"); - expect(a).toBe("ok"); + expect(a).toBe("ok-normal-ok2"); var b = require("./b"); - expect(b).toBe("wrong"); + expect(b).toBe("ok-normal-ok2-yes"); + var c = require("./c"); + expect(c).toBe("wrong-normal-ok2"); }); diff --git a/test/configCases/rule-set/resolve-options/normal.js b/test/configCases/rule-set/resolve-options/normal.js new file mode 100644 index 00000000000..f5f0f4cc525 --- /dev/null +++ b/test/configCases/rule-set/resolve-options/normal.js @@ -0,0 +1 @@ +module.exports = "-normal-"; diff --git a/test/configCases/rule-set/resolve-options/ok.ok.js b/test/configCases/rule-set/resolve-options/ok.ok.js new file mode 100644 index 00000000000..11132c14387 --- /dev/null +++ b/test/configCases/rule-set/resolve-options/ok.ok.js @@ -0,0 +1 @@ +module.exports = "ok-ok"; diff --git a/test/configCases/rule-set/resolve-options/ok2.js b/test/configCases/rule-set/resolve-options/ok2.js new file mode 100644 index 00000000000..c0c585d76a9 --- /dev/null +++ b/test/configCases/rule-set/resolve-options/ok2.js @@ -0,0 +1 @@ +module.exports = "ok2"; diff --git a/test/configCases/rule-set/resolve-options/ok2.yes.js b/test/configCases/rule-set/resolve-options/ok2.yes.js new file mode 100644 index 00000000000..46778e20f8b --- /dev/null +++ b/test/configCases/rule-set/resolve-options/ok2.yes.js @@ -0,0 +1 @@ +module.exports = "ok2-yes"; diff --git a/test/configCases/rule-set/resolve-options/webpack.config.js b/test/configCases/rule-set/resolve-options/webpack.config.js index 9ce4b7957e1..cf15580f0e4 100644 --- a/test/configCases/rule-set/resolve-options/webpack.config.js +++ b/test/configCases/rule-set/resolve-options/webpack.config.js @@ -1,4 +1,10 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { + resolve: { + alias: { + "./wrong2": "./ok2" + } + }, module: { rules: [ { @@ -6,7 +12,23 @@ module.exports = { resolve: { alias: { "./wrong": "./ok" - } + }, + extensions: [".js", ".ok.js"] + } + }, + { + test: require.resolve("./b"), + resolve: { + alias: { + "./wrong": "./ok" + }, + extensions: ["...", ".ok.js"] + } + }, + { + test: require.resolve("./b"), + resolve: { + extensions: [".yes.js", "..."] } } ] diff --git a/test/configCases/rule-set/resolve-options/wrong2.js b/test/configCases/rule-set/resolve-options/wrong2.js new file mode 100644 index 00000000000..62f3d2d8dc9 --- /dev/null +++ b/test/configCases/rule-set/resolve-options/wrong2.js @@ -0,0 +1 @@ +module.exports = "wrong2"; diff --git a/test/configCases/rule-set/resolve-options/wrong2.yes.js b/test/configCases/rule-set/resolve-options/wrong2.yes.js new file mode 100644 index 00000000000..cbe1bee99f8 --- /dev/null +++ b/test/configCases/rule-set/resolve-options/wrong2.yes.js @@ -0,0 +1 @@ +module.exports = "wrong2-yes"; diff --git a/test/configCases/rule-set/simple-use-array-fn/deprecations.js b/test/configCases/rule-set/simple-use-array-fn/deprecations.js new file mode 100644 index 00000000000..509a3520bac --- /dev/null +++ b/test/configCases/rule-set/simple-use-array-fn/deprecations.js @@ -0,0 +1,5 @@ +module.exports = [ + { code: /DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING/, message: /oneOf\[0\]/ }, + { code: /DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING/, message: /oneOf\[1\]/ }, + { code: /DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING/, message: /oneOf\[2\]/ } +]; diff --git a/test/configCases/rule-set/simple-use-array-fn/index.js b/test/configCases/rule-set/simple-use-array-fn/index.js index 64637f8ab82..d00943f9a2b 100644 --- a/test/configCases/rule-set/simple-use-array-fn/index.js +++ b/test/configCases/rule-set/simple-use-array-fn/index.js @@ -1,21 +1,10 @@ it("should match only one rule in a oneOf block", function() { var ab = require("./ab"); - expect(ab).toEqual([ - "ab", - "?first" - ]); + expect(ab).toEqual(["ab", "?first"]); }); it("should match with issuer and any option value", function() { var a = require("./a"); var b = require("./b"); - expect(a).toEqual([ - "a", - "?third", - ]); - expect(b).toEqual([[ - "a", - "second-3", - "?second-2", - "?second-1", - ]]); + expect(a).toEqual(["a", "?third"]); + expect(b).toEqual([["a", "second-3", "?second-2", ""]]); }); diff --git a/test/configCases/rule-set/simple-use-array-fn/loader.js b/test/configCases/rule-set/simple-use-array-fn/loader.js index f78d43c0b78..84836e5dae5 100644 --- a/test/configCases/rule-set/simple-use-array-fn/loader.js +++ b/test/configCases/rule-set/simple-use-array-fn/loader.js @@ -1,8 +1,8 @@ -module.exports = function(source) { +/** @type {import("../../../../").LoaderDefinition<{ get(): string }>} */ +module.exports = function (source) { var query = this.query; - if(typeof query === "object" && typeof query.get === "function") { + if (typeof query === "object" && typeof query.get === "function") { query = query.get(); } return source + "\nmodule.exports.push(" + JSON.stringify(query) + ");"; }; - diff --git a/test/configCases/rule-set/simple-use-array-fn/webpack.config.js b/test/configCases/rule-set/simple-use-array-fn/webpack.config.js index f16f3585dfb..2100be79f7d 100644 --- a/test/configCases/rule-set/simple-use-array-fn/webpack.config.js +++ b/test/configCases/rule-set/simple-use-array-fn/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { module: { rules: [ @@ -7,13 +8,14 @@ module.exports = { test: { and: [/a.\.js$/, /b\.js$/] }, - loader: "./loader?first" + loader: "./loader", + options: "first" }, { test: [require.resolve("./a"), require.resolve("./c")], issuer: require.resolve("./b"), - use: data => [ - "./loader?second-1", + use: () => [ + "./loader", { loader: "./loader", options: "second-2" @@ -21,7 +23,7 @@ module.exports = { { loader: "./loader", options: { - get: function() { + get() { return "second-3"; } } diff --git a/test/configCases/rule-set/simple-use-fn-array/deprecations.js b/test/configCases/rule-set/simple-use-fn-array/deprecations.js new file mode 100644 index 00000000000..509a3520bac --- /dev/null +++ b/test/configCases/rule-set/simple-use-fn-array/deprecations.js @@ -0,0 +1,5 @@ +module.exports = [ + { code: /DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING/, message: /oneOf\[0\]/ }, + { code: /DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING/, message: /oneOf\[1\]/ }, + { code: /DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING/, message: /oneOf\[2\]/ } +]; diff --git a/test/configCases/rule-set/simple-use-fn-array/index.js b/test/configCases/rule-set/simple-use-fn-array/index.js index 64637f8ab82..d00943f9a2b 100644 --- a/test/configCases/rule-set/simple-use-fn-array/index.js +++ b/test/configCases/rule-set/simple-use-fn-array/index.js @@ -1,21 +1,10 @@ it("should match only one rule in a oneOf block", function() { var ab = require("./ab"); - expect(ab).toEqual([ - "ab", - "?first" - ]); + expect(ab).toEqual(["ab", "?first"]); }); it("should match with issuer and any option value", function() { var a = require("./a"); var b = require("./b"); - expect(a).toEqual([ - "a", - "?third", - ]); - expect(b).toEqual([[ - "a", - "second-3", - "?second-2", - "?second-1", - ]]); + expect(a).toEqual(["a", "?third"]); + expect(b).toEqual([["a", "second-3", "?second-2", ""]]); }); diff --git a/test/configCases/rule-set/simple-use-fn-array/loader.js b/test/configCases/rule-set/simple-use-fn-array/loader.js index f78d43c0b78..84836e5dae5 100644 --- a/test/configCases/rule-set/simple-use-fn-array/loader.js +++ b/test/configCases/rule-set/simple-use-fn-array/loader.js @@ -1,8 +1,8 @@ -module.exports = function(source) { +/** @type {import("../../../../").LoaderDefinition<{ get(): string }>} */ +module.exports = function (source) { var query = this.query; - if(typeof query === "object" && typeof query.get === "function") { + if (typeof query === "object" && typeof query.get === "function") { query = query.get(); } return source + "\nmodule.exports.push(" + JSON.stringify(query) + ");"; }; - diff --git a/test/configCases/rule-set/simple-use-fn-array/webpack.config.js b/test/configCases/rule-set/simple-use-fn-array/webpack.config.js index 15d939bfb71..0107f584d06 100644 --- a/test/configCases/rule-set/simple-use-fn-array/webpack.config.js +++ b/test/configCases/rule-set/simple-use-fn-array/webpack.config.js @@ -1,13 +1,17 @@ +/** + * @param {EXPECTED_ANY[]} useArray use array + * @returns {EXPECTED_FUNCTION[]} functions + */ function createFunctionArrayFromUseArray(useArray) { - return useArray.map(function(useItem) { - return function(data) { + return useArray.map(function (useItem) { + return function () { return useItem; }; }); } -var useArray = createFunctionArrayFromUseArray([ - "./loader?second-1", +const useArray = createFunctionArrayFromUseArray([ + "./loader", { loader: "./loader", options: "second-2" @@ -15,13 +19,14 @@ var useArray = createFunctionArrayFromUseArray([ { loader: "./loader", options: { - get: function() { + get() { return "second-3"; } } } ]); +/** @type {import("../../../../").Configuration} */ module.exports = { module: { rules: [ @@ -31,7 +36,8 @@ module.exports = { test: { and: [/a.\.js$/, /b\.js$/] }, - loader: "./loader?first" + loader: "./loader", + options: "first" }, { test: [require.resolve("./a"), require.resolve("./c")], diff --git a/test/configCases/rule-set/simple/deprecations.js b/test/configCases/rule-set/simple/deprecations.js new file mode 100644 index 00000000000..509a3520bac --- /dev/null +++ b/test/configCases/rule-set/simple/deprecations.js @@ -0,0 +1,5 @@ +module.exports = [ + { code: /DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING/, message: /oneOf\[0\]/ }, + { code: /DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING/, message: /oneOf\[1\]/ }, + { code: /DEP_WEBPACK_RULE_LOADER_OPTIONS_STRING/, message: /oneOf\[2\]/ } +]; diff --git a/test/configCases/rule-set/simple/index.js b/test/configCases/rule-set/simple/index.js index 64637f8ab82..b28830fd24a 100644 --- a/test/configCases/rule-set/simple/index.js +++ b/test/configCases/rule-set/simple/index.js @@ -1,21 +1,21 @@ -it("should match only one rule in a oneOf block", function() { +it("should match only one rule in a oneOf block", function () { var ab = require("./ab"); - expect(ab).toEqual([ - "ab", - "?first" - ]); + expect(ab).toEqual(["ab", "?first"]); }); -it("should match with issuer and any option value", function() { + +it("should not match not condition (absolute)", function () { + var ab = require("./not-ab"); + expect(ab).toEqual(["not-ab"]); +}); + +it("should not match not condition (not absolute)", function () { + var ab = require("./ab?not"); + expect(ab).toEqual(["ab"]); +}); + +it("should match with issuer and any option value", function () { var a = require("./a"); var b = require("./b"); - expect(a).toEqual([ - "a", - "?third", - ]); - expect(b).toEqual([[ - "a", - "second-3", - "?second-2", - "?second-1", - ]]); + expect(a).toEqual(["a", "?third"]); + expect(b).toEqual([["a", "second-3", "?second-2", ""]]); }); diff --git a/test/configCases/rule-set/simple/loader.js b/test/configCases/rule-set/simple/loader.js index f78d43c0b78..84836e5dae5 100644 --- a/test/configCases/rule-set/simple/loader.js +++ b/test/configCases/rule-set/simple/loader.js @@ -1,8 +1,8 @@ -module.exports = function(source) { +/** @type {import("../../../../").LoaderDefinition<{ get(): string }>} */ +module.exports = function (source) { var query = this.query; - if(typeof query === "object" && typeof query.get === "function") { + if (typeof query === "object" && typeof query.get === "function") { query = query.get(); } return source + "\nmodule.exports.push(" + JSON.stringify(query) + ");"; }; - diff --git a/test/configCases/rule-set/simple/not-ab.js b/test/configCases/rule-set/simple/not-ab.js new file mode 100644 index 00000000000..a479ee362d0 --- /dev/null +++ b/test/configCases/rule-set/simple/not-ab.js @@ -0,0 +1 @@ +module.exports = ["not-ab"]; diff --git a/test/configCases/rule-set/simple/webpack.config.js b/test/configCases/rule-set/simple/webpack.config.js index b981f42a01a..5515487f932 100644 --- a/test/configCases/rule-set/simple/webpack.config.js +++ b/test/configCases/rule-set/simple/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { module: { rules: [ @@ -5,15 +6,17 @@ module.exports = { oneOf: [ { test: { - and: [/a.\.js$/, /b\.js$/] + and: [/a.\.js$/, /b\.js$/, { not: /not-/ }] }, - loader: "./loader?first" + resourceQuery: { not: /not/ }, + loader: "./loader", + options: "first" }, { test: [require.resolve("./a"), require.resolve("./c")], issuer: require.resolve("./b"), use: [ - "./loader?second-1", + "./loader", { loader: "./loader", options: "second-2" @@ -21,7 +24,7 @@ module.exports = { { loader: "./loader", options: { - get: function() { + get() { return "second-3"; } } diff --git a/test/configCases/rule-set/undefined-values/index.js b/test/configCases/rule-set/undefined-values/index.js new file mode 100644 index 00000000000..242376f4280 --- /dev/null +++ b/test/configCases/rule-set/undefined-values/index.js @@ -0,0 +1 @@ +it("compile fine", () => {}); diff --git a/test/configCases/rule-set/undefined-values/webpack.config.js b/test/configCases/rule-set/undefined-values/webpack.config.js new file mode 100644 index 00000000000..0b3933fba40 --- /dev/null +++ b/test/configCases/rule-set/undefined-values/webpack.config.js @@ -0,0 +1,14 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + module: { + rules: [ + { + test: undefined, + loader: undefined, + use: undefined, + options: undefined, + resource: undefined + } + ] + } +}; diff --git a/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/five.js b/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/five.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/five.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/four.js b/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/four.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/four.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/one.js b/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/one.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/one.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/six.js b/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/six.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/six.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/test.config.js b/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/test.config.js new file mode 100644 index 00000000000..3f1ee62addd --- /dev/null +++ b/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/test.config.js @@ -0,0 +1,18 @@ +module.exports = { + findBundle() { + return [ + "./dir5/dir6/runtime~one.js", + "./one.js", + "./dir5/dir6/runtime~two.js", + "./dir2/two.js", + "./dir5/dir6/runtime~three.js", + "./three.js", + "./dir5/dir6/runtime~four.js", + "./dir4/four.js", + "./dir5/dir6/runtime~five.js", + "./dir5/dir6/five.js", + "./dir5/dir6/runtime~six.js", + "./dir5/dir6/six.js" + ]; + } +}; diff --git a/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/three.js b/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/three.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/three.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/two.js b/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/two.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/two.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/webpack.config.js b/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/webpack.config.js new file mode 100644 index 00000000000..af731ef6aca --- /dev/null +++ b/test/configCases/runtime/dynamic-nested-with-deep-entries-commonjs/webpack.config.js @@ -0,0 +1,21 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + filename: "[name].js" + }, + target: ["es2022", "async-node"], + entry: { + one: "./one", + "dir2/two": "./two", + "/three": "./three", + "/dir4/four": "./four", + "/dir5/dir6/five": "./five", + "/dir5/dir6/six": "./six" + }, + optimization: { + runtimeChunk: { + name: entrypoint => + `dir5/dir6/runtime~${entrypoint.name.split("/").pop()}` + } + } +}; diff --git a/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/five.js b/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/five.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/five.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/four.js b/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/four.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/four.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/one.js b/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/one.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/one.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/six.js b/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/six.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/six.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/test.config.js b/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/test.config.js new file mode 100644 index 00000000000..73daff2cf36 --- /dev/null +++ b/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/test.config.js @@ -0,0 +1,18 @@ +module.exports = { + findBundle() { + return [ + "./dir5/dir6/runtime~one.mjs", + "./one.mjs", + "./dir5/dir6/runtime~two.mjs", + "./dir2/two.mjs", + "./dir5/dir6/runtime~three.mjs", + "./three.mjs", + "./dir5/dir6/runtime~four.mjs", + "./dir4/four.mjs", + "./dir5/dir6/runtime~five.mjs", + "./dir5/dir6/five.mjs", + "./dir5/dir6/runtime~six.mjs", + "./dir5/dir6/six.mjs" + ]; + } +}; diff --git a/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/three.js b/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/three.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/three.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/two.js b/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/two.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/two.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/webpack.config.js b/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/webpack.config.js new file mode 100644 index 00000000000..aef3552de43 --- /dev/null +++ b/test/configCases/runtime/dynamic-nested-with-deep-entries-esm/webpack.config.js @@ -0,0 +1,25 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + filename: "[name].mjs", + module: true + }, + target: ["es2022", "async-node"], + entry: { + one: "./one", + "dir2/two": "./two", + "/three": "./three", + "/dir4/four": "./four", + "/dir5/dir6/five": "./five", + "/dir5/dir6/six": "./six" + }, + optimization: { + runtimeChunk: { + name: entrypoint => + `dir5/dir6/runtime~${entrypoint.name.split("/").pop()}` + } + }, + experiments: { + outputModule: true + } +}; diff --git a/test/configCases/runtime/dynamic-with-deep-entries-commonjs/five.js b/test/configCases/runtime/dynamic-with-deep-entries-commonjs/five.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-with-deep-entries-commonjs/five.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-with-deep-entries-commonjs/four.js b/test/configCases/runtime/dynamic-with-deep-entries-commonjs/four.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-with-deep-entries-commonjs/four.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-with-deep-entries-commonjs/one.js b/test/configCases/runtime/dynamic-with-deep-entries-commonjs/one.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-with-deep-entries-commonjs/one.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-with-deep-entries-commonjs/six.js b/test/configCases/runtime/dynamic-with-deep-entries-commonjs/six.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-with-deep-entries-commonjs/six.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-with-deep-entries-commonjs/test.config.js b/test/configCases/runtime/dynamic-with-deep-entries-commonjs/test.config.js new file mode 100644 index 00000000000..41e056466f0 --- /dev/null +++ b/test/configCases/runtime/dynamic-with-deep-entries-commonjs/test.config.js @@ -0,0 +1,18 @@ +module.exports = { + findBundle() { + return [ + "./runtime/one.js", + "./one.js", + "./runtime/dir2/two.js", + "./dir2/two.js", + "./runtime/three.js", + "./three.js", + "./runtime/dir4/four.js", + "./dir4/four.js", + "./runtime/dir5/dir6/five.js", + "./dir5/dir6/five.js", + "./runtime/dir5/dir6/six.js", + "./dir5/dir6/six.js" + ]; + } +}; diff --git a/test/configCases/runtime/dynamic-with-deep-entries-commonjs/three.js b/test/configCases/runtime/dynamic-with-deep-entries-commonjs/three.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-with-deep-entries-commonjs/three.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-with-deep-entries-commonjs/two.js b/test/configCases/runtime/dynamic-with-deep-entries-commonjs/two.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-with-deep-entries-commonjs/two.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-with-deep-entries-commonjs/webpack.config.js b/test/configCases/runtime/dynamic-with-deep-entries-commonjs/webpack.config.js new file mode 100644 index 00000000000..4bdad1a91cd --- /dev/null +++ b/test/configCases/runtime/dynamic-with-deep-entries-commonjs/webpack.config.js @@ -0,0 +1,20 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + filename: "[name].js" + }, + target: ["es2022", "async-node"], + entry: { + one: "./one", + "dir2/two": "./two", + "/three": "./three", + "/dir4/four": "./four", + "/dir5/dir6/five": "./five", + "/dir5/dir6/six": "./six" + }, + optimization: { + runtimeChunk: { + name: entrypoint => `runtime/${entrypoint.name.replace(/^\/+/g, "")}` + } + } +}; diff --git a/test/configCases/runtime/dynamic-with-deep-entries-esm/five.js b/test/configCases/runtime/dynamic-with-deep-entries-esm/five.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-with-deep-entries-esm/five.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-with-deep-entries-esm/four.js b/test/configCases/runtime/dynamic-with-deep-entries-esm/four.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-with-deep-entries-esm/four.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-with-deep-entries-esm/one.js b/test/configCases/runtime/dynamic-with-deep-entries-esm/one.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-with-deep-entries-esm/one.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-with-deep-entries-esm/six.js b/test/configCases/runtime/dynamic-with-deep-entries-esm/six.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-with-deep-entries-esm/six.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-with-deep-entries-esm/test.config.js b/test/configCases/runtime/dynamic-with-deep-entries-esm/test.config.js new file mode 100644 index 00000000000..07fb94c9ba9 --- /dev/null +++ b/test/configCases/runtime/dynamic-with-deep-entries-esm/test.config.js @@ -0,0 +1,18 @@ +module.exports = { + findBundle() { + return [ + "./runtime/one.mjs", + "./one.mjs", + "./runtime/dir2/two.mjs", + "./dir2/two.mjs", + "./runtime/three.mjs", + "./three.mjs", + "./runtime/dir4/four.mjs", + "./dir4/four.mjs", + "./runtime/dir5/dir6/five.mjs", + "./dir5/dir6/five.mjs", + "./runtime/dir5/dir6/six.mjs", + "./dir5/dir6/six.mjs" + ]; + } +}; diff --git a/test/configCases/runtime/dynamic-with-deep-entries-esm/three.js b/test/configCases/runtime/dynamic-with-deep-entries-esm/three.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-with-deep-entries-esm/three.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-with-deep-entries-esm/two.js b/test/configCases/runtime/dynamic-with-deep-entries-esm/two.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/dynamic-with-deep-entries-esm/two.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/dynamic-with-deep-entries-esm/webpack.config.js b/test/configCases/runtime/dynamic-with-deep-entries-esm/webpack.config.js new file mode 100644 index 00000000000..2ffd63de8fc --- /dev/null +++ b/test/configCases/runtime/dynamic-with-deep-entries-esm/webpack.config.js @@ -0,0 +1,24 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + filename: "[name].mjs", + module: true + }, + target: ["es2022", "async-node"], + entry: { + one: "./one", + "dir2/two": "./two", + "/three": "./three", + "/dir4/four": "./four", + "/dir5/dir6/five": "./five", + "/dir5/dir6/six": "./six" + }, + optimization: { + runtimeChunk: { + name: entrypoint => `runtime/${entrypoint.name.replace(/^\/+/g, "")}` + } + }, + experiments: { + outputModule: true + } +}; diff --git a/test/configCases/runtime/entries-in-runtime/async.js b/test/configCases/runtime/entries-in-runtime/async.js new file mode 100644 index 00000000000..7461f8f346d --- /dev/null +++ b/test/configCases/runtime/entries-in-runtime/async.js @@ -0,0 +1 @@ +console.log("split"); diff --git a/test/configCases/runtime/entries-in-runtime/index.js b/test/configCases/runtime/entries-in-runtime/index.js new file mode 100644 index 00000000000..d595b906601 --- /dev/null +++ b/test/configCases/runtime/entries-in-runtime/index.js @@ -0,0 +1,11 @@ +import path from "path"; +import fs from "fs"; + +it("should not have references to chunks of unrelated entrypoints in runtime", () => { + const content = fs.readFileSync( + path.resolve(__dirname, "runtime.js"), + "utf-8" + ); + expect(content).not.toContain("other-entry"); + expect(content).not.toContain("split"); +}); diff --git a/test/configCases/runtime/entries-in-runtime/main.js b/test/configCases/runtime/entries-in-runtime/main.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/runtime/entries-in-runtime/other-entry.js b/test/configCases/runtime/entries-in-runtime/other-entry.js new file mode 100644 index 00000000000..0a829ac01ff --- /dev/null +++ b/test/configCases/runtime/entries-in-runtime/other-entry.js @@ -0,0 +1,2 @@ +import "./split"; +import("./async"); diff --git a/test/configCases/runtime/entries-in-runtime/split.js b/test/configCases/runtime/entries-in-runtime/split.js new file mode 100644 index 00000000000..7461f8f346d --- /dev/null +++ b/test/configCases/runtime/entries-in-runtime/split.js @@ -0,0 +1 @@ +console.log("split"); diff --git a/test/configCases/runtime/entries-in-runtime/test.config.js b/test/configCases/runtime/entries-in-runtime/test.config.js new file mode 100644 index 00000000000..b63304387c7 --- /dev/null +++ b/test/configCases/runtime/entries-in-runtime/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./runtime.js", "./main.js", "./first-entry.js"]; + } +}; diff --git a/test/configCases/runtime/entries-in-runtime/webpack.config.js b/test/configCases/runtime/entries-in-runtime/webpack.config.js new file mode 100644 index 00000000000..a45319b6213 --- /dev/null +++ b/test/configCases/runtime/entries-in-runtime/webpack.config.js @@ -0,0 +1,39 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "production", + entry: { + main: "./main", + "first-entry": { + dependOn: "main", + import: "./index" + }, + "other-entry": { + dependOn: "main", + import: "./other-entry" + } + }, + target: "web", + node: { + __dirname: false, + __filename: false + }, + externalsPresets: { + node: true + }, + output: { + filename: "[name].js" + }, + optimization: { + runtimeChunk: "single", + splitChunks: { + cacheGroups: { + split: { + chunks: "all", + name: "split", + test: /split\.js$/, + enforce: true + } + } + } + } +}; diff --git a/test/configCases/runtime/invalid-esm-export/esm-export.js b/test/configCases/runtime/invalid-esm-export/esm-export.js new file mode 100644 index 00000000000..61d366eb252 --- /dev/null +++ b/test/configCases/runtime/invalid-esm-export/esm-export.js @@ -0,0 +1 @@ +export const foo = "foo"; diff --git a/test/configCases/runtime/invalid-esm-export/esm-import-cjs-export.js b/test/configCases/runtime/invalid-esm-export/esm-import-cjs-export.js new file mode 100644 index 00000000000..23b45091543 --- /dev/null +++ b/test/configCases/runtime/invalid-esm-export/esm-import-cjs-export.js @@ -0,0 +1,2 @@ +import { foo } from "./esm-export"; +module.exports = foo + "bar"; diff --git a/test/configCases/runtime/invalid-esm-export/index.js b/test/configCases/runtime/invalid-esm-export/index.js new file mode 100644 index 00000000000..a25f46d5973 --- /dev/null +++ b/test/configCases/runtime/invalid-esm-export/index.js @@ -0,0 +1,7 @@ +it("should throw exception when module.exports is assigned in es module", function() { + expect(function() { + require("./esm-import-cjs-export"); + }).toThrowError( + 'ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ./esm-import-cjs-export.js' + ); +}); diff --git a/test/configCases/runtime/invalid-esm-export/webpack.config.js b/test/configCases/runtime/invalid-esm-export/webpack.config.js new file mode 100644 index 00000000000..8152f6c7681 --- /dev/null +++ b/test/configCases/runtime/invalid-esm-export/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development" +}; diff --git a/test/configCases/runtime/no-runtime-per-entry/index.js b/test/configCases/runtime/no-runtime-per-entry/index.js new file mode 100644 index 00000000000..82855ecd8e9 --- /dev/null +++ b/test/configCases/runtime/no-runtime-per-entry/index.js @@ -0,0 +1 @@ +it("should load without runtime", () => {}); diff --git a/test/configCases/runtime/no-runtime-per-entry/test.config.js b/test/configCases/runtime/no-runtime-per-entry/test.config.js new file mode 100644 index 00000000000..c0ec1472777 --- /dev/null +++ b/test/configCases/runtime/no-runtime-per-entry/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return "./main.js"; + } +}; diff --git a/test/configCases/runtime/no-runtime-per-entry/webpack.config.js b/test/configCases/runtime/no-runtime-per-entry/webpack.config.js new file mode 100644 index 00000000000..1931aed0574 --- /dev/null +++ b/test/configCases/runtime/no-runtime-per-entry/webpack.config.js @@ -0,0 +1,16 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + main: { + import: "./index", + runtime: false + } + }, + target: "web", + output: { + filename: "[name].js" + }, + optimization: { + runtimeChunk: "single" + } +}; diff --git a/test/configCases/runtime/opt-in-finally/webpack.config.js b/test/configCases/runtime/opt-in-finally/webpack.config.js index 15a47b1f6e4..b98edea7fa5 100644 --- a/test/configCases/runtime/opt-in-finally/webpack.config.js +++ b/test/configCases/runtime/opt-in-finally/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { output: { strictModuleExceptionHandling: true diff --git a/test/configCases/runtime/opt-in-finally2/exception.js b/test/configCases/runtime/opt-in-finally2/exception.js new file mode 100644 index 00000000000..74f5ab436d5 --- /dev/null +++ b/test/configCases/runtime/opt-in-finally2/exception.js @@ -0,0 +1 @@ +throw new Error("Exception"); diff --git a/test/configCases/runtime/opt-in-finally2/index.js b/test/configCases/runtime/opt-in-finally2/index.js new file mode 100644 index 00000000000..5d0bac929f9 --- /dev/null +++ b/test/configCases/runtime/opt-in-finally2/index.js @@ -0,0 +1,8 @@ +it("should throw exception on every try to load a module", function() { + expect(function() { + require("./exception"); + }).toThrowError(); + expect(function() { + require("./exception"); + }).toThrowError(); +}); diff --git a/test/configCases/runtime/opt-in-finally2/webpack.config.js b/test/configCases/runtime/opt-in-finally2/webpack.config.js new file mode 100644 index 00000000000..f8abbb88657 --- /dev/null +++ b/test/configCases/runtime/opt-in-finally2/webpack.config.js @@ -0,0 +1,6 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + strictModuleErrorHandling: true + } +}; diff --git a/test/configCases/runtime/single-with-deep-entries-commonjs/five.js b/test/configCases/runtime/single-with-deep-entries-commonjs/five.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/single-with-deep-entries-commonjs/five.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/single-with-deep-entries-commonjs/four.js b/test/configCases/runtime/single-with-deep-entries-commonjs/four.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/single-with-deep-entries-commonjs/four.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/single-with-deep-entries-commonjs/one.js b/test/configCases/runtime/single-with-deep-entries-commonjs/one.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/single-with-deep-entries-commonjs/one.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/single-with-deep-entries-commonjs/six.js b/test/configCases/runtime/single-with-deep-entries-commonjs/six.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/single-with-deep-entries-commonjs/six.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/single-with-deep-entries-commonjs/test.config.js b/test/configCases/runtime/single-with-deep-entries-commonjs/test.config.js new file mode 100644 index 00000000000..eae17321170 --- /dev/null +++ b/test/configCases/runtime/single-with-deep-entries-commonjs/test.config.js @@ -0,0 +1,13 @@ +module.exports = { + findBundle() { + return [ + "./runtime.js", + "./one.js", + "./dir2/two.js", + "./three.js", + "./dir4/four.js", + "./dir5/dir6/five.js", + "./dir5/dir6/six.js" + ]; + } +}; diff --git a/test/configCases/runtime/single-with-deep-entries-commonjs/three.js b/test/configCases/runtime/single-with-deep-entries-commonjs/three.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/single-with-deep-entries-commonjs/three.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/single-with-deep-entries-commonjs/two.js b/test/configCases/runtime/single-with-deep-entries-commonjs/two.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/single-with-deep-entries-commonjs/two.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/single-with-deep-entries-commonjs/webpack.config.js b/test/configCases/runtime/single-with-deep-entries-commonjs/webpack.config.js new file mode 100644 index 00000000000..d2da242a9cd --- /dev/null +++ b/test/configCases/runtime/single-with-deep-entries-commonjs/webpack.config.js @@ -0,0 +1,18 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + filename: "[name].js" + }, + target: ["es2022", "async-node"], + entry: { + one: "./one", + "dir2/two": "./two", + "/three": "./three", + "/dir4/four": "./four", + "/dir5/dir6/five": "./five", + "/dir5/dir6/six": "./six" + }, + optimization: { + runtimeChunk: "single" + } +}; diff --git a/test/configCases/runtime/single-with-deep-entries-esm/five.js b/test/configCases/runtime/single-with-deep-entries-esm/five.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/single-with-deep-entries-esm/five.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/single-with-deep-entries-esm/four.js b/test/configCases/runtime/single-with-deep-entries-esm/four.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/single-with-deep-entries-esm/four.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/single-with-deep-entries-esm/one.js b/test/configCases/runtime/single-with-deep-entries-esm/one.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/single-with-deep-entries-esm/one.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/single-with-deep-entries-esm/six.js b/test/configCases/runtime/single-with-deep-entries-esm/six.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/single-with-deep-entries-esm/six.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/single-with-deep-entries-esm/test.config.js b/test/configCases/runtime/single-with-deep-entries-esm/test.config.js new file mode 100644 index 00000000000..ac00794d426 --- /dev/null +++ b/test/configCases/runtime/single-with-deep-entries-esm/test.config.js @@ -0,0 +1,13 @@ +module.exports = { + findBundle() { + return [ + "./runtime.mjs", + "./one.mjs", + "./dir2/two.mjs", + "./three.mjs", + "./dir4/four.mjs", + "./dir5/dir6/five.mjs", + "./dir5/dir6/six.mjs" + ]; + } +}; diff --git a/test/configCases/runtime/single-with-deep-entries-esm/three.js b/test/configCases/runtime/single-with-deep-entries-esm/three.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/single-with-deep-entries-esm/three.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/single-with-deep-entries-esm/two.js b/test/configCases/runtime/single-with-deep-entries-esm/two.js new file mode 100644 index 00000000000..ba421732e06 --- /dev/null +++ b/test/configCases/runtime/single-with-deep-entries-esm/two.js @@ -0,0 +1 @@ +it("should compile", () => {}); diff --git a/test/configCases/runtime/single-with-deep-entries-esm/webpack.config.js b/test/configCases/runtime/single-with-deep-entries-esm/webpack.config.js new file mode 100644 index 00000000000..acb96965dd2 --- /dev/null +++ b/test/configCases/runtime/single-with-deep-entries-esm/webpack.config.js @@ -0,0 +1,22 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + filename: "[name].mjs", + module: true + }, + target: ["es2022", "async-node"], + entry: { + one: "./one", + "dir2/two": "./two", + "/three": "./three", + "/dir4/four": "./four", + "/dir5/dir6/five": "./five", + "/dir5/dir6/six": "./six" + }, + optimization: { + runtimeChunk: "single" + }, + experiments: { + outputModule: true + } +}; diff --git a/test/configCases/runtime/target-webworker-with-dynamic/async.js b/test/configCases/runtime/target-webworker-with-dynamic/async.js new file mode 100644 index 00000000000..f65ad42a678 --- /dev/null +++ b/test/configCases/runtime/target-webworker-with-dynamic/async.js @@ -0,0 +1 @@ +export default "async"; diff --git a/test/configCases/runtime/target-webworker-with-dynamic/index.js b/test/configCases/runtime/target-webworker-with-dynamic/index.js new file mode 100644 index 00000000000..92623852cde --- /dev/null +++ b/test/configCases/runtime/target-webworker-with-dynamic/index.js @@ -0,0 +1,7 @@ +it("should compile and run", done => { + expect(true).toBe(true); + import("./async").then(module => { + expect(module.default).toBe("async"); + done(); + }, done); +}); diff --git a/test/configCases/runtime/target-webworker-with-dynamic/test.config.js b/test/configCases/runtime/target-webworker-with-dynamic/test.config.js new file mode 100644 index 00000000000..8022cb75980 --- /dev/null +++ b/test/configCases/runtime/target-webworker-with-dynamic/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./runtime.js", "./main.js"]; + } +}; diff --git a/test/configCases/runtime/target-webworker-with-dynamic/webpack.config.js b/test/configCases/runtime/target-webworker-with-dynamic/webpack.config.js new file mode 100644 index 00000000000..151c8bdb96d --- /dev/null +++ b/test/configCases/runtime/target-webworker-with-dynamic/webpack.config.js @@ -0,0 +1,11 @@ +/** @type {import("../../../../types").Configuration} */ +module.exports = { + target: "webworker", + devtool: false, + output: { + filename: "[name].js" + }, + optimization: { + runtimeChunk: "single" + } +}; diff --git a/test/configCases/runtime/target-webworker/index.js b/test/configCases/runtime/target-webworker/index.js new file mode 100644 index 00000000000..0acee55e319 --- /dev/null +++ b/test/configCases/runtime/target-webworker/index.js @@ -0,0 +1,3 @@ +it("should compile and run", () => { + expect(true).toBe(true) +}); diff --git a/test/configCases/runtime/target-webworker/test.config.js b/test/configCases/runtime/target-webworker/test.config.js new file mode 100644 index 00000000000..8022cb75980 --- /dev/null +++ b/test/configCases/runtime/target-webworker/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./runtime.js", "./main.js"]; + } +}; diff --git a/test/configCases/runtime/target-webworker/webpack.config.js b/test/configCases/runtime/target-webworker/webpack.config.js new file mode 100644 index 00000000000..151c8bdb96d --- /dev/null +++ b/test/configCases/runtime/target-webworker/webpack.config.js @@ -0,0 +1,11 @@ +/** @type {import("../../../../types").Configuration} */ +module.exports = { + target: "webworker", + devtool: false, + output: { + filename: "[name].js" + }, + optimization: { + runtimeChunk: "single" + } +}; diff --git a/test/configCases/scope-hoisting/class-naming/webpack.config.js b/test/configCases/scope-hoisting/class-naming/webpack.config.js index 59e948b1212..c939ba33f61 100644 --- a/test/configCases/scope-hoisting/class-naming/webpack.config.js +++ b/test/configCases/scope-hoisting/class-naming/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { optimization: { concatenateModules: true diff --git a/test/configCases/scope-hoisting/create-dll-plugin/test.config.js b/test/configCases/scope-hoisting/create-dll-plugin/test.config.js index 08ea6c319c8..04581a81040 100644 --- a/test/configCases/scope-hoisting/create-dll-plugin/test.config.js +++ b/test/configCases/scope-hoisting/create-dll-plugin/test.config.js @@ -1 +1 @@ -exports.noTests = true; +module.exports.noTests = true; diff --git a/test/configCases/scope-hoisting/create-dll-plugin/webpack.config.js b/test/configCases/scope-hoisting/create-dll-plugin/webpack.config.js index f169ea12e25..bdff16d8622 100644 --- a/test/configCases/scope-hoisting/create-dll-plugin/webpack.config.js +++ b/test/configCases/scope-hoisting/create-dll-plugin/webpack.config.js @@ -1,5 +1,7 @@ const path = require("path"); -var webpack = require("../../../../"); +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ module.exports = { entry: ["./index.js"], plugins: [ diff --git a/test/configCases/scope-hoisting/dll-plugin/webpack.config.js b/test/configCases/scope-hoisting/dll-plugin/webpack.config.js index 14a6d08ccfe..29af2f143b3 100644 --- a/test/configCases/scope-hoisting/dll-plugin/webpack.config.js +++ b/test/configCases/scope-hoisting/dll-plugin/webpack.config.js @@ -1,4 +1,6 @@ -var webpack = require("../../../../"); +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ module.exports = { plugins: [ new webpack.DllReferencePlugin({ @@ -8,9 +10,9 @@ module.exports = { "./module": { id: 1, buildMeta: { - exportsType: "namespace", - providedExports: ["default"] - } + exportsType: "namespace" + }, + exports: ["default"] } } }), diff --git a/test/configCases/scope-hoisting/esModule/webpack.config.js b/test/configCases/scope-hoisting/esModule/webpack.config.js index b5fcc43ed62..363b516cae6 100644 --- a/test/configCases/scope-hoisting/esModule/webpack.config.js +++ b/test/configCases/scope-hoisting/esModule/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { mode: "development", devtool: false, diff --git a/test/configCases/scope-hoisting/export-global/module2.js b/test/configCases/scope-hoisting/export-global/module2.js index 78c685a2591..c62638de01a 100644 --- a/test/configCases/scope-hoisting/export-global/module2.js +++ b/test/configCases/scope-hoisting/export-global/module2.js @@ -1 +1,2 @@ -export { process }; +const p = process; +export { p as process }; diff --git a/test/configCases/scope-hoisting/export-global/webpack.config.js b/test/configCases/scope-hoisting/export-global/webpack.config.js index 59e948b1212..c939ba33f61 100644 --- a/test/configCases/scope-hoisting/export-global/webpack.config.js +++ b/test/configCases/scope-hoisting/export-global/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { optimization: { concatenateModules: true diff --git a/test/configCases/scope-hoisting/harmony-pure-default/webpack.config.js b/test/configCases/scope-hoisting/harmony-pure-default/webpack.config.js index e963f03420a..7d36a68c1cd 100644 --- a/test/configCases/scope-hoisting/harmony-pure-default/webpack.config.js +++ b/test/configCases/scope-hoisting/harmony-pure-default/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { mode: "production", optimization: { diff --git a/test/configCases/scope-hoisting/issue-11897/cjs.js b/test/configCases/scope-hoisting/issue-11897/cjs.js new file mode 100644 index 00000000000..4b1b961abd6 --- /dev/null +++ b/test/configCases/scope-hoisting/issue-11897/cjs.js @@ -0,0 +1 @@ +module.exports = { flag: true }; diff --git a/test/configCases/scope-hoisting/issue-11897/iife.js b/test/configCases/scope-hoisting/issue-11897/iife.js new file mode 100644 index 00000000000..6ea4603aa4e --- /dev/null +++ b/test/configCases/scope-hoisting/issue-11897/iife.js @@ -0,0 +1,4 @@ +(function () {})(); + +// prettier-ignore +export const value = true diff --git a/test/configCases/scope-hoisting/issue-11897/index.js b/test/configCases/scope-hoisting/issue-11897/index.js new file mode 100644 index 00000000000..0da1213e66a --- /dev/null +++ b/test/configCases/scope-hoisting/issue-11897/index.js @@ -0,0 +1,22 @@ +import obj from "./cjs"; +// prettier-ignore +obj.flag = true +import { value } from "./module"; +import { value as value2 } from "./iife"; +import { value as value3 } from "./module?2"; +import { value as value4 } from "./module2"; +import { value as value5 } from "./module3"; +import { value as value6 } from "./module4"; +import { value as value7 } from "./module5"; +obj.flag = true; + +it("should not break on ASI-code", () => { + expect(obj.flag).toBe(true); + expect(value).toBe(true); + expect(value2).toBe(true); + expect(value3).toBe(true); + expect(value4).toBe(true); + expect(value5).toBe(true); + expect(value6).toBe(true); + expect(value7).toBe(true); +}); diff --git a/test/configCases/scope-hoisting/issue-11897/module.js b/test/configCases/scope-hoisting/issue-11897/module.js new file mode 100644 index 00000000000..e76db3f11e7 --- /dev/null +++ b/test/configCases/scope-hoisting/issue-11897/module.js @@ -0,0 +1,4 @@ +obj.flag++; +import obj from "./cjs"; +// prettier-ignore +export const value = true diff --git a/test/configCases/scope-hoisting/issue-11897/module2.js b/test/configCases/scope-hoisting/issue-11897/module2.js new file mode 100644 index 00000000000..d948c4a4cc4 --- /dev/null +++ b/test/configCases/scope-hoisting/issue-11897/module2.js @@ -0,0 +1,3 @@ +[].forEach(()=> {}) + +export let value = true diff --git a/test/configCases/scope-hoisting/issue-11897/module3.js b/test/configCases/scope-hoisting/issue-11897/module3.js new file mode 100644 index 00000000000..12849315e6d --- /dev/null +++ b/test/configCases/scope-hoisting/issue-11897/module3.js @@ -0,0 +1,4 @@ + // comment +/d+/ + +export let value = true diff --git a/test/configCases/scope-hoisting/issue-11897/module4.js b/test/configCases/scope-hoisting/issue-11897/module4.js new file mode 100644 index 00000000000..40e3c641da9 --- /dev/null +++ b/test/configCases/scope-hoisting/issue-11897/module4.js @@ -0,0 +1,5 @@ + /** comment */ ++x; + +var x = 1; + +export let value = true diff --git a/test/configCases/scope-hoisting/issue-11897/module5.js b/test/configCases/scope-hoisting/issue-11897/module5.js new file mode 100644 index 00000000000..d97cbd83d56 --- /dev/null +++ b/test/configCases/scope-hoisting/issue-11897/module5.js @@ -0,0 +1,5 @@ +/** comment */--x; + +var x = 1; + +export let value = true diff --git a/test/configCases/scope-hoisting/issue-11897/webpack.config.js b/test/configCases/scope-hoisting/issue-11897/webpack.config.js new file mode 100644 index 00000000000..c939ba33f61 --- /dev/null +++ b/test/configCases/scope-hoisting/issue-11897/webpack.config.js @@ -0,0 +1,6 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + concatenateModules: true + } +}; diff --git a/test/configCases/scope-hoisting/named-modules/webpack.config.js b/test/configCases/scope-hoisting/named-modules/webpack.config.js index ef65c17d702..4a7373bf986 100644 --- a/test/configCases/scope-hoisting/named-modules/webpack.config.js +++ b/test/configCases/scope-hoisting/named-modules/webpack.config.js @@ -1,7 +1,9 @@ -var webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { - plugins: [ - new webpack.NamedModulesPlugin(), - new webpack.optimize.ModuleConcatenationPlugin() - ] + optimization: { + moduleIds: "named", + usedExports: true, + providedExports: true, + concatenateModules: true + } }; diff --git a/test/configCases/scope-hoisting/strictThisContextOnImports/webpack.config.js b/test/configCases/scope-hoisting/strictThisContextOnImports/webpack.config.js index 9cd2bdf568e..90dc09a7d31 100644 --- a/test/configCases/scope-hoisting/strictThisContextOnImports/webpack.config.js +++ b/test/configCases/scope-hoisting/strictThisContextOnImports/webpack.config.js @@ -1,4 +1,6 @@ -var webpack = require("../../../../"); +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ module.exports = { module: { strictThisContextOnImports: true diff --git a/test/configCases/sharing/consume-module-ignore-warnings/errors.js b/test/configCases/sharing/consume-module-ignore-warnings/errors.js new file mode 100644 index 00000000000..722d5d0a45f --- /dev/null +++ b/test/configCases/sharing/consume-module-ignore-warnings/errors.js @@ -0,0 +1 @@ +module.exports = [[/prefix\/deep\/c/]]; diff --git a/test/configCases/sharing/consume-module-ignore-warnings/index.js b/test/configCases/sharing/consume-module-ignore-warnings/index.js new file mode 100644 index 00000000000..43a7d1832d1 --- /dev/null +++ b/test/configCases/sharing/consume-module-ignore-warnings/index.js @@ -0,0 +1,262 @@ +let warnings = []; +let oldWarn; + +beforeEach(done => { + oldWarn = console.warn; + console.warn = m => warnings.push(m); + done(); +}); + +afterEach(done => { + expectWarning(); + console.warn = oldWarn; + done(); +}); + +const expectWarning = regexp => { + if (!regexp) { + expect(warnings).toEqual([]); + } else { + expect(warnings).toEqual( + expect.objectContaining({ + 0: expect.stringMatching(regexp), + length: 1 + }) + ); + } + warnings.length = 0; +}; + +it("should load the shared modules with ignored warnings", async () => { + __webpack_share_scopes__["test-scope"] = { + package: { + "0": { + get: () => () => "shared package" + } + }, + "@scoped/package": { + "0": { + get: () => Promise.resolve(() => "shared @scoped/package") + } + }, + "prefix/a": { + "0": { + get: () => () => "shared prefix/a" + } + }, + "prefix/deep/c": { + "0": { + get: () => () => "shared prefix/deep/c" + } + }, + "./relative1": { + "0": { + get: () => () => "shared relative1" + } + } + }; + __webpack_share_scopes__["other-scope"] = { + "advanced/123": { + "1.2.beta.1": { + get: () => () => "123" + } + }, + "advanced/error1": { + "1.2.3": { + get: () => { + throw new Error("error1"); + } + } + }, + "advanced/error2": { + "1.2.3": { + get: () => + Promise.resolve().then(() => { + throw new Error("error2"); + }) + } + }, + "advanced/error3": { + "1.2.3": { + get: () => + Promise.resolve().then(() => () => { + throw new Error("error3"); + }) + } + }, + "advanced/error4": { + "1.0.0": { + get: () => () => "wrong" + } + } + }; + { + const result = await import("package"); + expect(result.default).toBe("shared package"); + } + { + const result = await import("@scoped/package"); + expect(result.default).toBe("shared @scoped/package"); + } + { + const result = await import("prefix/a"); + expect(result.default).toBe("shared prefix/a"); + } + { + const result = await import("prefix/deep/b"); + expect(result.default).toBe("b"); + } + { + const result = await import("prefix/deep/c"); + expect(result.default).toBe("shared prefix/deep/c"); + } + { + const result = await import("./relative1"); + expect(result.default).toBe("shared relative1"); + } + { + const result = await import("./relative2"); + expect(result.default).toBe("relative2"); + } + { + const result = await import("advanced/123"); + expect(result.default).toBe("123"); + } + { + await expect(() => import("advanced/error0")).rejects.toEqual( + expect.objectContaining({ + message: expect.stringContaining("advanced/error0") + }) + ); + } + { + await expect(() => import("advanced/error1")).rejects.toEqual( + expect.objectContaining({ + message: expect.stringContaining("error1") + }) + ); + } + { + await expect(() => import("advanced/error2")).rejects.toEqual( + expect.objectContaining({ + message: expect.stringContaining("error2") + }) + ); + } + { + await expect(() => import("advanced/error3")).rejects.toEqual( + expect.objectContaining({ + message: expect.stringContaining("error3") + }) + ); + } + { + await expect(() => import("advanced/error4")).rejects.toEqual( + expect.objectContaining({ + message: expect.stringContaining("1.2.3") + }) + ); + } +}); + +it("should handle version matching correctly in strict and singleton mode", async () => { + __webpack_share_scopes__["default"] = { + strict0: { + "1.1.1": { + get: () => () => "shared strict0" + } + }, + strict1: { + "1.1.1": { + get: () => () => "shared strict1" + } + }, + strict2: { + "1.1.1": { + get: () => () => "shared strict2" + } + }, + strict3: { + "1.1.1": { + get: () => () => "shared strict3" + } + }, + strict4: { + "1.1.1": { + get: () => () => "shared strict4" + } + }, + strict5: { + "1.1.1": { + get: () => () => "shared strict5" + } + }, + singleton: { + "1.1.1": { + get: () => () => "shared singleton", + from: 'container-a' + } + }, + singletonWithoutVersion: { + "1.0.0": { + get: () => () => "shared singleton v1.0.0", + loaded: true + }, + "2.0.0": { + get: () => () => "shared singleton v2.0.0" + } + } + }; + { + const result = await import("strict0"); + expect(result.default).toBe("shared strict0"); + expectWarning(); + } + { + const result = await import("strict1"); + expect(result.default).toBe("strict"); + } + { + const result = await import("strict2"); + expect(result.default).toBe("strict"); + } + { + const result = await import("strict3"); + expect(result.default).toBe("strict"); + } + { + const result = await import("strict4"); + expect(result.default).toBe("strict"); + } + { + await expect(() => import("strict5")).rejects.toEqual( + expect.objectContaining({ + message: expect.stringContaining("strict5") + }) + ); + expectWarning(); + } + { + const result = await import("singleton"); + expect(result.default).toBe("shared singleton"); + expectWarning(); + } +}); + +it("should not instantiate multiple singletons even if a higher version exists", async () => { + __webpack_share_scopes__["default"] = { + singletonWithoutVersion: { + "1.0.0": { + get: () => () => "shared singleton v1.0.0", + loaded: true + }, + "2.0.0": { + get: () => () => "shared singleton v2.0.0" + } + } + }; + { + const result = await import("singletonWithoutVersion"); + expect(result.default).toBe("shared singleton v1.0.0"); + } +}); diff --git a/test/configCases/sharing/consume-module-ignore-warnings/node_modules/@scoped/package/index.js b/test/configCases/sharing/consume-module-ignore-warnings/node_modules/@scoped/package/index.js new file mode 100644 index 00000000000..8678386a6f2 --- /dev/null +++ b/test/configCases/sharing/consume-module-ignore-warnings/node_modules/@scoped/package/index.js @@ -0,0 +1 @@ +module.exports = "@scoped/package"; diff --git a/test/configCases/sharing/consume-module-ignore-warnings/node_modules/package.js b/test/configCases/sharing/consume-module-ignore-warnings/node_modules/package.js new file mode 100644 index 00000000000..7c1dac1c302 --- /dev/null +++ b/test/configCases/sharing/consume-module-ignore-warnings/node_modules/package.js @@ -0,0 +1 @@ +module.exports = "package"; diff --git a/test/configCases/commons-chunk-plugin/simple/a.js b/test/configCases/sharing/consume-module-ignore-warnings/node_modules/prefix/a.js similarity index 100% rename from test/configCases/commons-chunk-plugin/simple/a.js rename to test/configCases/sharing/consume-module-ignore-warnings/node_modules/prefix/a.js diff --git a/test/configCases/sharing/consume-module-ignore-warnings/node_modules/prefix/deep/b.js b/test/configCases/sharing/consume-module-ignore-warnings/node_modules/prefix/deep/b.js new file mode 100644 index 00000000000..dfbbeb621fa --- /dev/null +++ b/test/configCases/sharing/consume-module-ignore-warnings/node_modules/prefix/deep/b.js @@ -0,0 +1 @@ +module.exports = "b"; diff --git a/test/configCases/sharing/consume-module-ignore-warnings/node_modules/singleton.js b/test/configCases/sharing/consume-module-ignore-warnings/node_modules/singleton.js new file mode 100644 index 00000000000..ec0140e27d2 --- /dev/null +++ b/test/configCases/sharing/consume-module-ignore-warnings/node_modules/singleton.js @@ -0,0 +1 @@ +module.exports = "singleton"; diff --git a/test/configCases/sharing/consume-module-ignore-warnings/node_modules/singletonWithoutVersion.js b/test/configCases/sharing/consume-module-ignore-warnings/node_modules/singletonWithoutVersion.js new file mode 100644 index 00000000000..eb02ddc0628 --- /dev/null +++ b/test/configCases/sharing/consume-module-ignore-warnings/node_modules/singletonWithoutVersion.js @@ -0,0 +1 @@ +module.exports = "singleton without version"; diff --git a/test/configCases/sharing/consume-module-ignore-warnings/node_modules/strict0.js b/test/configCases/sharing/consume-module-ignore-warnings/node_modules/strict0.js new file mode 100644 index 00000000000..51df4cc6671 --- /dev/null +++ b/test/configCases/sharing/consume-module-ignore-warnings/node_modules/strict0.js @@ -0,0 +1 @@ +module.exports = "strict"; diff --git a/test/configCases/sharing/consume-module-ignore-warnings/node_modules/strict1.js b/test/configCases/sharing/consume-module-ignore-warnings/node_modules/strict1.js new file mode 100644 index 00000000000..51df4cc6671 --- /dev/null +++ b/test/configCases/sharing/consume-module-ignore-warnings/node_modules/strict1.js @@ -0,0 +1 @@ +module.exports = "strict"; diff --git a/test/configCases/sharing/consume-module-ignore-warnings/node_modules/strict2.js b/test/configCases/sharing/consume-module-ignore-warnings/node_modules/strict2.js new file mode 100644 index 00000000000..51df4cc6671 --- /dev/null +++ b/test/configCases/sharing/consume-module-ignore-warnings/node_modules/strict2.js @@ -0,0 +1 @@ +module.exports = "strict"; diff --git a/test/configCases/sharing/consume-module-ignore-warnings/node_modules/strict3.js b/test/configCases/sharing/consume-module-ignore-warnings/node_modules/strict3.js new file mode 100644 index 00000000000..51df4cc6671 --- /dev/null +++ b/test/configCases/sharing/consume-module-ignore-warnings/node_modules/strict3.js @@ -0,0 +1 @@ +module.exports = "strict"; diff --git a/test/configCases/sharing/consume-module-ignore-warnings/node_modules/strict4.js b/test/configCases/sharing/consume-module-ignore-warnings/node_modules/strict4.js new file mode 100644 index 00000000000..51df4cc6671 --- /dev/null +++ b/test/configCases/sharing/consume-module-ignore-warnings/node_modules/strict4.js @@ -0,0 +1 @@ +module.exports = "strict"; diff --git a/test/configCases/sharing/consume-module-ignore-warnings/package.json b/test/configCases/sharing/consume-module-ignore-warnings/package.json new file mode 100644 index 00000000000..e0c4fa8cb6d --- /dev/null +++ b/test/configCases/sharing/consume-module-ignore-warnings/package.json @@ -0,0 +1,7 @@ +{ + "dependencies": { + "package": "*", + "@scoped/package": "*", + "prefix": "*" + } +} diff --git a/test/configCases/sharing/consume-module-ignore-warnings/relative1.js b/test/configCases/sharing/consume-module-ignore-warnings/relative1.js new file mode 100644 index 00000000000..ce7c23d165c --- /dev/null +++ b/test/configCases/sharing/consume-module-ignore-warnings/relative1.js @@ -0,0 +1 @@ +module.exports = "relative1"; diff --git a/test/configCases/sharing/consume-module-ignore-warnings/relative2.js b/test/configCases/sharing/consume-module-ignore-warnings/relative2.js new file mode 100644 index 00000000000..7097875c2df --- /dev/null +++ b/test/configCases/sharing/consume-module-ignore-warnings/relative2.js @@ -0,0 +1 @@ +module.exports = "relative2"; diff --git a/test/configCases/sharing/consume-module-ignore-warnings/webpack.config.js b/test/configCases/sharing/consume-module-ignore-warnings/webpack.config.js new file mode 100644 index 00000000000..71ab80f7796 --- /dev/null +++ b/test/configCases/sharing/consume-module-ignore-warnings/webpack.config.js @@ -0,0 +1,68 @@ +// eslint-disable-next-line n/no-unpublished-require +const { ConsumeSharedPlugin } = require("../../../../").sharing; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + output: { + ignoreBrowserWarnings: true + }, + plugins: [ + new ConsumeSharedPlugin({ + shareScope: "test-scope", + consumes: [ + "package", + "@scoped/package", + "prefix/", + "./relative1", + "./relative2", + { + "advanced/": { + import: false, + requiredVersion: "^1.2.3", + shareScope: "other-scope", + strictVersion: true + } + } + ] + }), + new ConsumeSharedPlugin({ + consumes: { + strict0: { + requiredVersion: "^1.0.0", + strictVersion: true + }, + strict1: { + requiredVersion: ">=1.2.0", + strictVersion: true + }, + strict2: { + requiredVersion: "1.1.0", + strictVersion: true + }, + strict3: { + requiredVersion: "~1.0.0", + strictVersion: true + }, + strict4: { + requiredVersion: "^2.2.3", + strictVersion: true + }, + strict5: { + import: false, + requiredVersion: "alpha", + strictVersion: true + }, + singleton: { + requiredVersion: "1.1.0", + singleton: true, + strictVersion: false + }, + singletonWithoutVersion: { + requiredVersion: false, + singleton: true + } + } + }) + ] +}; diff --git a/test/configCases/sharing/consume-module/errors.js b/test/configCases/sharing/consume-module/errors.js new file mode 100644 index 00000000000..722d5d0a45f --- /dev/null +++ b/test/configCases/sharing/consume-module/errors.js @@ -0,0 +1 @@ +module.exports = [[/prefix\/deep\/c/]]; diff --git a/test/configCases/sharing/consume-module/index.js b/test/configCases/sharing/consume-module/index.js new file mode 100644 index 00000000000..442fdecde73 --- /dev/null +++ b/test/configCases/sharing/consume-module/index.js @@ -0,0 +1,264 @@ +let warnings = []; +let oldWarn; + +beforeEach(done => { + oldWarn = console.warn; + console.warn = m => warnings.push(m); + done(); +}); + +afterEach(done => { + expectWarning(); + console.warn = oldWarn; + done(); +}); + +const expectWarning = regexp => { + if (!regexp) { + expect(warnings).toEqual([]); + } else { + expect(warnings).toEqual( + expect.objectContaining({ + 0: expect.stringMatching(regexp), + length: 1 + }) + ); + } + warnings.length = 0; +}; + +it("should load the shared modules", async () => { + __webpack_share_scopes__["test-scope"] = { + package: { + "0": { + get: () => () => "shared package" + } + }, + "@scoped/package": { + "0": { + get: () => Promise.resolve(() => "shared @scoped/package") + } + }, + "prefix/a": { + "0": { + get: () => () => "shared prefix/a" + } + }, + "prefix/deep/c": { + "0": { + get: () => () => "shared prefix/deep/c" + } + }, + "./relative1": { + "0": { + get: () => () => "shared relative1" + } + } + }; + __webpack_share_scopes__["other-scope"] = { + "advanced/123": { + "1.2.beta.1": { + get: () => () => "123" + } + }, + "advanced/error1": { + "1.2.3": { + get: () => { + throw new Error("error1"); + } + } + }, + "advanced/error2": { + "1.2.3": { + get: () => + Promise.resolve().then(() => { + throw new Error("error2"); + }) + } + }, + "advanced/error3": { + "1.2.3": { + get: () => + Promise.resolve().then(() => () => { + throw new Error("error3"); + }) + } + }, + "advanced/error4": { + "1.0.0": { + get: () => () => "wrong" + } + } + }; + { + const result = await import("package"); + expect(result.default).toBe("shared package"); + } + { + const result = await import("@scoped/package"); + expect(result.default).toBe("shared @scoped/package"); + } + { + const result = await import("prefix/a"); + expect(result.default).toBe("shared prefix/a"); + } + { + const result = await import("prefix/deep/b"); + expect(result.default).toBe("b"); + } + { + const result = await import("prefix/deep/c"); + expect(result.default).toBe("shared prefix/deep/c"); + } + { + const result = await import("./relative1"); + expect(result.default).toBe("shared relative1"); + } + { + const result = await import("./relative2"); + expect(result.default).toBe("relative2"); + } + { + const result = await import("advanced/123"); + expect(result.default).toBe("123"); + } + { + await expect(() => import("advanced/error0")).rejects.toEqual( + expect.objectContaining({ + message: expect.stringContaining("advanced/error0") + }) + ); + } + { + await expect(() => import("advanced/error1")).rejects.toEqual( + expect.objectContaining({ + message: expect.stringContaining("error1") + }) + ); + } + { + await expect(() => import("advanced/error2")).rejects.toEqual( + expect.objectContaining({ + message: expect.stringContaining("error2") + }) + ); + } + { + await expect(() => import("advanced/error3")).rejects.toEqual( + expect.objectContaining({ + message: expect.stringContaining("error3") + }) + ); + } + { + await expect(() => import("advanced/error4")).rejects.toEqual( + expect.objectContaining({ + message: expect.stringContaining("1.2.3") + }) + ); + } +}); + +it("should handle version matching correctly in strict and singleton mode", async () => { + __webpack_share_scopes__["default"] = { + strict0: { + "1.1.1": { + get: () => () => "shared strict0" + } + }, + strict1: { + "1.1.1": { + get: () => () => "shared strict1" + } + }, + strict2: { + "1.1.1": { + get: () => () => "shared strict2" + } + }, + strict3: { + "1.1.1": { + get: () => () => "shared strict3" + } + }, + strict4: { + "1.1.1": { + get: () => () => "shared strict4" + } + }, + strict5: { + "1.1.1": { + get: () => () => "shared strict5" + } + }, + singleton: { + "1.1.1": { + get: () => () => "shared singleton", + from: 'container-a' + } + }, + singletonWithoutVersion: { + "1.0.0": { + get: () => () => "shared singleton v1.0.0", + loaded: true + }, + "2.0.0": { + get: () => () => "shared singleton v2.0.0" + } + } + }; + { + const result = await import("strict0"); + expect(result.default).toBe("shared strict0"); + expectWarning(); + } + { + const result = await import("strict1"); + expect(result.default).toBe("strict"); + } + { + const result = await import("strict2"); + expect(result.default).toBe("strict"); + } + { + const result = await import("strict3"); + expect(result.default).toBe("strict"); + } + { + const result = await import("strict4"); + expect(result.default).toBe("strict"); + } + { + await expect(() => import("strict5")).rejects.toEqual( + expect.objectContaining({ + message: expect.stringContaining("strict5") + }) + ); + expectWarning(); + } + { + const result = await import("singleton"); + expect(result.default).toBe("shared singleton"); + expectWarning( + /Unsatisfied version 1\.1\.1 from container-a of shared singleton module singleton \(required =1\.1\.0\)/ + ); + } +}); + +it("should not instantiate multiple singletons even if a higher version exists", async () => { + __webpack_share_scopes__["default"] = { + singletonWithoutVersion: { + "1.0.0": { + get: () => () => "shared singleton v1.0.0", + loaded: true + }, + "2.0.0": { + get: () => () => "shared singleton v2.0.0" + } + } + }; + { + const result = await import("singletonWithoutVersion"); + expect(result.default).toBe("shared singleton v1.0.0"); + } +}); diff --git a/test/configCases/sharing/consume-module/node_modules/@scoped/package/index.js b/test/configCases/sharing/consume-module/node_modules/@scoped/package/index.js new file mode 100644 index 00000000000..8678386a6f2 --- /dev/null +++ b/test/configCases/sharing/consume-module/node_modules/@scoped/package/index.js @@ -0,0 +1 @@ +module.exports = "@scoped/package"; diff --git a/test/configCases/sharing/consume-module/node_modules/package.js b/test/configCases/sharing/consume-module/node_modules/package.js new file mode 100644 index 00000000000..7c1dac1c302 --- /dev/null +++ b/test/configCases/sharing/consume-module/node_modules/package.js @@ -0,0 +1 @@ +module.exports = "package"; diff --git a/test/configCases/sharing/consume-module/node_modules/prefix/a.js b/test/configCases/sharing/consume-module/node_modules/prefix/a.js new file mode 100644 index 00000000000..6cd1d0075d4 --- /dev/null +++ b/test/configCases/sharing/consume-module/node_modules/prefix/a.js @@ -0,0 +1 @@ +module.exports = "a"; diff --git a/test/configCases/sharing/consume-module/node_modules/prefix/deep/b.js b/test/configCases/sharing/consume-module/node_modules/prefix/deep/b.js new file mode 100644 index 00000000000..dfbbeb621fa --- /dev/null +++ b/test/configCases/sharing/consume-module/node_modules/prefix/deep/b.js @@ -0,0 +1 @@ +module.exports = "b"; diff --git a/test/configCases/sharing/consume-module/node_modules/singleton.js b/test/configCases/sharing/consume-module/node_modules/singleton.js new file mode 100644 index 00000000000..ec0140e27d2 --- /dev/null +++ b/test/configCases/sharing/consume-module/node_modules/singleton.js @@ -0,0 +1 @@ +module.exports = "singleton"; diff --git a/test/configCases/sharing/consume-module/node_modules/singletonWithoutVersion.js b/test/configCases/sharing/consume-module/node_modules/singletonWithoutVersion.js new file mode 100644 index 00000000000..eb02ddc0628 --- /dev/null +++ b/test/configCases/sharing/consume-module/node_modules/singletonWithoutVersion.js @@ -0,0 +1 @@ +module.exports = "singleton without version"; diff --git a/test/configCases/sharing/consume-module/node_modules/strict0.js b/test/configCases/sharing/consume-module/node_modules/strict0.js new file mode 100644 index 00000000000..51df4cc6671 --- /dev/null +++ b/test/configCases/sharing/consume-module/node_modules/strict0.js @@ -0,0 +1 @@ +module.exports = "strict"; diff --git a/test/configCases/sharing/consume-module/node_modules/strict1.js b/test/configCases/sharing/consume-module/node_modules/strict1.js new file mode 100644 index 00000000000..51df4cc6671 --- /dev/null +++ b/test/configCases/sharing/consume-module/node_modules/strict1.js @@ -0,0 +1 @@ +module.exports = "strict"; diff --git a/test/configCases/sharing/consume-module/node_modules/strict2.js b/test/configCases/sharing/consume-module/node_modules/strict2.js new file mode 100644 index 00000000000..51df4cc6671 --- /dev/null +++ b/test/configCases/sharing/consume-module/node_modules/strict2.js @@ -0,0 +1 @@ +module.exports = "strict"; diff --git a/test/configCases/sharing/consume-module/node_modules/strict3.js b/test/configCases/sharing/consume-module/node_modules/strict3.js new file mode 100644 index 00000000000..51df4cc6671 --- /dev/null +++ b/test/configCases/sharing/consume-module/node_modules/strict3.js @@ -0,0 +1 @@ +module.exports = "strict"; diff --git a/test/configCases/sharing/consume-module/node_modules/strict4.js b/test/configCases/sharing/consume-module/node_modules/strict4.js new file mode 100644 index 00000000000..51df4cc6671 --- /dev/null +++ b/test/configCases/sharing/consume-module/node_modules/strict4.js @@ -0,0 +1 @@ +module.exports = "strict"; diff --git a/test/configCases/sharing/consume-module/package.json b/test/configCases/sharing/consume-module/package.json new file mode 100644 index 00000000000..e0c4fa8cb6d --- /dev/null +++ b/test/configCases/sharing/consume-module/package.json @@ -0,0 +1,7 @@ +{ + "dependencies": { + "package": "*", + "@scoped/package": "*", + "prefix": "*" + } +} diff --git a/test/configCases/sharing/consume-module/relative1.js b/test/configCases/sharing/consume-module/relative1.js new file mode 100644 index 00000000000..ce7c23d165c --- /dev/null +++ b/test/configCases/sharing/consume-module/relative1.js @@ -0,0 +1 @@ +module.exports = "relative1"; diff --git a/test/configCases/sharing/consume-module/relative2.js b/test/configCases/sharing/consume-module/relative2.js new file mode 100644 index 00000000000..7097875c2df --- /dev/null +++ b/test/configCases/sharing/consume-module/relative2.js @@ -0,0 +1 @@ +module.exports = "relative2"; diff --git a/test/configCases/sharing/consume-module/webpack.config.js b/test/configCases/sharing/consume-module/webpack.config.js new file mode 100644 index 00000000000..a7db1fca485 --- /dev/null +++ b/test/configCases/sharing/consume-module/webpack.config.js @@ -0,0 +1,65 @@ +// eslint-disable-next-line n/no-unpublished-require +const { ConsumeSharedPlugin } = require("../../../../").sharing; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + plugins: [ + new ConsumeSharedPlugin({ + shareScope: "test-scope", + consumes: [ + "package", + "@scoped/package", + "prefix/", + "./relative1", + "./relative2", + { + "advanced/": { + import: false, + requiredVersion: "^1.2.3", + shareScope: "other-scope", + strictVersion: true + } + } + ] + }), + new ConsumeSharedPlugin({ + consumes: { + strict0: { + requiredVersion: "^1.0.0", + strictVersion: true + }, + strict1: { + requiredVersion: ">=1.2.0", + strictVersion: true + }, + strict2: { + requiredVersion: "1.1.0", + strictVersion: true + }, + strict3: { + requiredVersion: "~1.0.0", + strictVersion: true + }, + strict4: { + requiredVersion: "^2.2.3", + strictVersion: true + }, + strict5: { + import: false, + requiredVersion: "alpha", + strictVersion: true + }, + singleton: { + requiredVersion: "1.1.0", + singleton: true, + strictVersion: false + }, + singletonWithoutVersion: { + requiredVersion: false, + singleton: true + } + } + }) + ] +}; diff --git a/test/configCases/sharing/consume-multiple-versions-ignore-warnings/index.js b/test/configCases/sharing/consume-multiple-versions-ignore-warnings/index.js new file mode 100644 index 00000000000..da18374d39d --- /dev/null +++ b/test/configCases/sharing/consume-multiple-versions-ignore-warnings/index.js @@ -0,0 +1,49 @@ +const expectWarning = require("../../../helpers/expectWarningFactory")(); + +it("should be able to consume different shared module version depending on context with ignored warnings", async () => { + __webpack_share_scopes__["default"] = { + shared: { + "9.9.9": { + get: () => () => "shared@9.9.9" + }, + "1.9.9": { + get: () => () => "shared@1.9.9" + }, + "1.2.9": { + get: () => () => "shared@1.2.9" + }, + "1.2.3": { + get: () => () => "shared@1.2.3", + from: "mfe1" + }, + "2.9.9": { + get: () => () => "shared@2.9.9" + }, + "2.3.9": { + get: () => () => "shared@2.3.9" + }, + "2.3.4": { + get: () => () => "shared@2.3.4" + }, + "3.0.0": { + get: () => () => "shared@3.0.0" + } + }, + shared2: { + "9.9.9": { + get: () => () => "shared2@9.9.9" + } + } + }; + expect(require("shared")).toBe("shared@1.9.9"); + expect(require("my-module")).toBe("shared@2.9.9"); + expect(require("my-module2")).toBe("shared@2.3.9"); + expect(() => require("my-module3")).toThrowError( + "No satisfying version (^3.4.5) of shared module shared found in shared scope default.\n" + + "Available versions: 9.9.9 from undefined, 1.9.9 from undefined, 1.2.9 from undefined, 1.2.3 from mfe1, 2.9.9 from undefined, 2.3.9 from undefined, 2.3.4 from undefined, 3.0.0 from undefined" + ); + expect(require("my-module4")).toBe("shared@9.9.9"); + expectWarning(); + expect(require("shared2")).toBe("shared2@9.9.9"); + expectWarning(); +}); diff --git a/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module/index.js b/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module/index.js new file mode 100644 index 00000000000..ae61e683bfb --- /dev/null +++ b/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module/index.js @@ -0,0 +1 @@ +module.exports = require("shared"); diff --git a/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module/package.json b/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module/package.json new file mode 100644 index 00000000000..ab866ffdfa3 --- /dev/null +++ b/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "shared": "^2.3.0" + } +} diff --git a/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module2/index.js b/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module2/index.js new file mode 100644 index 00000000000..ae61e683bfb --- /dev/null +++ b/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module2/index.js @@ -0,0 +1 @@ +module.exports = require("shared"); diff --git a/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module2/package.json b/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module2/package.json new file mode 100644 index 00000000000..b88141f46c5 --- /dev/null +++ b/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module2/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "shared": "~2.3.0" + } +} diff --git a/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module3/index.js b/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module3/index.js new file mode 100644 index 00000000000..ae61e683bfb --- /dev/null +++ b/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module3/index.js @@ -0,0 +1 @@ +module.exports = require("shared"); diff --git a/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module3/package.json b/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module3/package.json new file mode 100644 index 00000000000..6a3ed89c57b --- /dev/null +++ b/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module3/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "shared": "^3.4.5" + } +} diff --git a/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module4/index.js b/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module4/index.js new file mode 100644 index 00000000000..ae61e683bfb --- /dev/null +++ b/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module4/index.js @@ -0,0 +1 @@ +module.exports = require("shared"); diff --git a/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module4/package.json b/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module4/package.json new file mode 100644 index 00000000000..6faf4164846 --- /dev/null +++ b/test/configCases/sharing/consume-multiple-versions-ignore-warnings/node_modules/my-module4/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "shared": "*" + } +} diff --git a/test/configCases/sharing/consume-multiple-versions-ignore-warnings/package.json b/test/configCases/sharing/consume-multiple-versions-ignore-warnings/package.json new file mode 100644 index 00000000000..9260ff7df9d --- /dev/null +++ b/test/configCases/sharing/consume-multiple-versions-ignore-warnings/package.json @@ -0,0 +1,8 @@ +{ + "dependencies": { + "shared2": "1.2.3 3.2.1" + }, + "peerDependencies": { + "shared": "^1.0.0" + } +} diff --git a/test/configCases/sharing/consume-multiple-versions-ignore-warnings/webpack.config.js b/test/configCases/sharing/consume-multiple-versions-ignore-warnings/webpack.config.js new file mode 100644 index 00000000000..56d463786f4 --- /dev/null +++ b/test/configCases/sharing/consume-multiple-versions-ignore-warnings/webpack.config.js @@ -0,0 +1,22 @@ +// eslint-disable-next-line n/no-unpublished-require +const { ConsumeSharedPlugin } = require("../../../../").sharing; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + ignoreBrowserWarnings: true + }, + plugins: [ + new ConsumeSharedPlugin({ + consumes: { + shared: { + import: false, + strictVersion: true + }, + shared2: { + import: false + } + } + }) + ] +}; diff --git a/test/configCases/sharing/consume-multiple-versions/index.js b/test/configCases/sharing/consume-multiple-versions/index.js new file mode 100644 index 00000000000..2375def871d --- /dev/null +++ b/test/configCases/sharing/consume-multiple-versions/index.js @@ -0,0 +1,199 @@ +const expectWarning = require("../../../helpers/expectWarningFactory")(); + +it("should be able to consume different shared module version depending on context", async () => { + __webpack_share_scopes__["default"] = { + shared: { + "9.9.9": { + get: () => () => "shared@9.9.9" + }, + "1.9.9": { + get: () => () => "shared@1.9.9" + }, + "1.2.9": { + get: () => () => "shared@1.2.9" + }, + "1.2.3": { + get: () => () => "shared@1.2.3", + from: "mfe1" + }, + "2.9.9": { + get: () => () => "shared@2.9.9" + }, + "2.3.9": { + get: () => () => "shared@2.3.9" + }, + "2.3.4": { + get: () => () => "shared@2.3.4" + }, + "3.0.0": { + get: () => () => "shared@3.0.0" + } + }, + shared2: { + "9.9.9": { + get: () => () => "shared2@9.9.9" + } + }, + shared3: { + "1.1.1": { + get: () => () => "shared3@1.1.1" + }, + "1.0.0": { + get: () => () => "shared3@1.0.0" + } + }, + shared4: { + "1.1.1": { + get: () => () => "shared4@1.1.1" + } + }, + shared5: { + "1.0.0": { + get: () => () => "shared5@1.0.0" + } + }, + shared6: { + "1.0.0": { + get: () => () => "shared6@1.0.0" + } + }, + shared7: { + "1.0.0": { + get: () => () => "shared7@1.0.0" + } + }, + shared8: { + "1.0.0": { + get: () => () => "shared8@1.0.0" + } + }, + shared9: { + "1.0.0": { + get: () => () => "shared9@1.0.0" + } + }, + shared10: { + "1.0.0": { + get: () => () => "shared10@1.0.0" + } + }, + shared11: { + "1.0.0": { + get: () => () => "shared11@1.0.0" + } + }, + shared12: { + "1.0.0": { + get: () => () => "shared12@1.0.0" + } + }, + shared13: { + "1.0.0": { + get: () => () => "shared13@1.0.0" + } + }, + shared14: { + "1.0.0": { + get: () => () => "shared14@1.0.0" + } + }, + shared15: { + "1.1.1": { + get: () => () => "shared15@1.1.1" + } + }, + shared16: { + "1.0.0": { + get: () => () => "shared16@1.0.0" + } + }, + shared17: { + "1.0.0": { + get: () => () => "shared17@1.0.0" + } + }, + shared18: { + "1.0.0": { + get: () => () => "shared18@1.0.0" + } + }, + shared19: { + "1.0.0": { + get: () => () => "shared19@1.0.0" + } + }, + shared20: { + "1.0.0": { + get: () => () => "shared20@1.0.0" + } + }, + shared21: { + "1.0.0": { + get: () => () => "shared21@1.0.0" + } + }, + shared22: { + "1.0.0": { + get: () => () => "shared22@1.0.0" + } + }, + shared23: { + "1.0.0": { + get: () => () => "shared23@1.0.0" + } + }, + shared24: { + "1.0.0": { + get: () => () => "shared24@1.0.0" + } + }, + shared25: { + "1.0.0": { + get: () => () => "shared25@1.0.0" + } + }, + shared25: { + "1.0.0": { + get: () => () => "shared26@1.0.0" + } + } + }; + expect(require("shared")).toBe("shared@1.9.9"); + expect(require("my-module")).toBe("shared@2.9.9"); + expect(require("my-module2")).toBe("shared@2.3.9"); + expect(() => require("my-module3")).toThrowError( + "No satisfying version (^3.4.5) of shared module shared found in shared scope default.\n" + + "Available versions: 9.9.9 from undefined, 1.9.9 from undefined, 1.2.9 from undefined, 1.2.3 from mfe1, 2.9.9 from undefined, 2.3.9 from undefined, 2.3.4 from undefined, 3.0.0 from undefined" + ); + expect(require("my-module4")).toBe("shared@9.9.9"); + expectWarning(); + expect(require("shared2")).toBe("shared2@9.9.9"); + expectWarning( + /No satisfying version \(=1\.2\.3 =3\.2\.1\) of shared module shared2 found in shared scope default/ + ); + expect(require("shared3")).toBe("shared3@1.0.0"); + expect(require("shared4")).toBe("shared4@1.1.1"); + expect(require("shared5")).toBe("shared5@1.0.0"); + expect(require("shared6")).toBe("shared6@1.0.0"); + expect(require("shared7")).toBe("shared7@1.0.0"); + expect(require("shared8")).toBe("shared8@1.0.0"); + expect(require("shared9")).toBe("shared9@1.0.0"); + expect(require("shared10")).toBe("shared10@1.0.0"); + expect(require("shared11")).toBe("shared11@1.0.0"); + expect(require("shared12")).toBe("shared12@1.0.0"); + expect(require("shared13")).toBe("shared13@1.0.0"); + expect(require("shared14")).toBe("shared14@1.0.0"); + expect(require("shared15")).toBe("shared15@1.1.1"); + expect(require("shared16")).toBe("shared16@1.0.0"); + expect(require("shared17")).toBe("shared17@1.0.0"); + expect(require("shared18")).toBe("shared18@1.0.0"); + expect(require("shared19")).toBe("shared19@1.0.0"); + expectWarning( + /No satisfying version \(\^branch\) of shared module shared19 found in shared scope default/ + ); + expect(require("shared20")).toBe("shared20@1.0.0"); + expect(require("shared21")).toBe("shared21@1.0.0"); + expect(require("shared22")).toBe("shared22@1.0.0"); + expect(require("shared23")).toBe("shared23@1.0.0"); + expect(require("shared24")).toBe("shared24@1.0.0"); +}); diff --git a/test/configCases/sharing/consume-multiple-versions/node_modules/my-module/index.js b/test/configCases/sharing/consume-multiple-versions/node_modules/my-module/index.js new file mode 100644 index 00000000000..ae61e683bfb --- /dev/null +++ b/test/configCases/sharing/consume-multiple-versions/node_modules/my-module/index.js @@ -0,0 +1 @@ +module.exports = require("shared"); diff --git a/test/configCases/sharing/consume-multiple-versions/node_modules/my-module/package.json b/test/configCases/sharing/consume-multiple-versions/node_modules/my-module/package.json new file mode 100644 index 00000000000..ab866ffdfa3 --- /dev/null +++ b/test/configCases/sharing/consume-multiple-versions/node_modules/my-module/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "shared": "^2.3.0" + } +} diff --git a/test/configCases/sharing/consume-multiple-versions/node_modules/my-module2/index.js b/test/configCases/sharing/consume-multiple-versions/node_modules/my-module2/index.js new file mode 100644 index 00000000000..ae61e683bfb --- /dev/null +++ b/test/configCases/sharing/consume-multiple-versions/node_modules/my-module2/index.js @@ -0,0 +1 @@ +module.exports = require("shared"); diff --git a/test/configCases/sharing/consume-multiple-versions/node_modules/my-module2/package.json b/test/configCases/sharing/consume-multiple-versions/node_modules/my-module2/package.json new file mode 100644 index 00000000000..b88141f46c5 --- /dev/null +++ b/test/configCases/sharing/consume-multiple-versions/node_modules/my-module2/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "shared": "~2.3.0" + } +} diff --git a/test/configCases/sharing/consume-multiple-versions/node_modules/my-module3/index.js b/test/configCases/sharing/consume-multiple-versions/node_modules/my-module3/index.js new file mode 100644 index 00000000000..ae61e683bfb --- /dev/null +++ b/test/configCases/sharing/consume-multiple-versions/node_modules/my-module3/index.js @@ -0,0 +1 @@ +module.exports = require("shared"); diff --git a/test/configCases/sharing/consume-multiple-versions/node_modules/my-module3/package.json b/test/configCases/sharing/consume-multiple-versions/node_modules/my-module3/package.json new file mode 100644 index 00000000000..6a3ed89c57b --- /dev/null +++ b/test/configCases/sharing/consume-multiple-versions/node_modules/my-module3/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "shared": "^3.4.5" + } +} diff --git a/test/configCases/sharing/consume-multiple-versions/node_modules/my-module4/index.js b/test/configCases/sharing/consume-multiple-versions/node_modules/my-module4/index.js new file mode 100644 index 00000000000..ae61e683bfb --- /dev/null +++ b/test/configCases/sharing/consume-multiple-versions/node_modules/my-module4/index.js @@ -0,0 +1 @@ +module.exports = require("shared"); diff --git a/test/configCases/sharing/consume-multiple-versions/node_modules/my-module4/package.json b/test/configCases/sharing/consume-multiple-versions/node_modules/my-module4/package.json new file mode 100644 index 00000000000..6faf4164846 --- /dev/null +++ b/test/configCases/sharing/consume-multiple-versions/node_modules/my-module4/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "shared": "*" + } +} diff --git a/test/configCases/sharing/consume-multiple-versions/package.json b/test/configCases/sharing/consume-multiple-versions/package.json new file mode 100644 index 00000000000..7deacfb9478 --- /dev/null +++ b/test/configCases/sharing/consume-multiple-versions/package.json @@ -0,0 +1,32 @@ +{ + "dependencies": { + "shared2": "1.2.3 3.2.1", + "shared3": "git+ssh://git@github.com:foo/bar.git#v1.0.0", + "shared4": "git+ssh://git@gitlab.com:foo/bar.git#semver:^1.0.0", + "shared5": "foo/bar#v1.0.0", + "shared6": "github:foo/bar#v1.0.0", + "shared7": "git://user:password@github.com/foo/bar#v1.0.0", + "shared8": "user:password@github.com:foo/bar#v1.0.0", + "shared9": "https://user@github.com/foo/bar#v1.0.0", + "shared10": "git+ssh://bitbucket.org:foo/bar#v1.0.0", + "shared11": "git://gist.github.com/feed.git#v1.0.0", + "shared12": "https://github.com/foo/bar/test/branch", + "shared13": "https://gitlab.com/foo/bar/repository/archive.tar.gz", + "shared14": "https://bitbucket.org/foo/bar/get/archive.tar.gz", + "shared15": "git+ssh://:password@bitbucket.org:foo/bar.git#v1.1.1", + "shared16": "https://gist.github.com/foo/feed/raw/fix%2Fbug/", + "shared17": "git+ssh://git@other.com:foo/bar.git#v1.0.0", + "shared18": "github.com:foo/bar#v1.0.0", + "shared19": "https://github.com/foo/bar/tree/branch", + "shared20": "github:foo%0N/bar", + "shared21": "other:foo/bar", + "shared22": "https://foo/bar", + "shared23": "https://github.com//bar/tree/branch", + "shared24": "git+https://gitlab.com//bar", + "shared25": "git+https://GITLAB.com//bar", + "shared26": "https://GITHUB.com//bar/tree/branch" + }, + "peerDependencies": { + "shared": "^1.0.0" + } +} diff --git a/test/configCases/sharing/consume-multiple-versions/webpack.config.js b/test/configCases/sharing/consume-multiple-versions/webpack.config.js new file mode 100644 index 00000000000..2a435c43f35 --- /dev/null +++ b/test/configCases/sharing/consume-multiple-versions/webpack.config.js @@ -0,0 +1,95 @@ +// eslint-disable-next-line n/no-unpublished-require +const { ConsumeSharedPlugin } = require("../../../../").sharing; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [ + new ConsumeSharedPlugin({ + consumes: { + shared: { + import: false, + strictVersion: true + }, + shared2: { + import: false + }, + shared3: { + import: false, + strictVersion: true + }, + shared4: { + import: false + }, + shared5: { + import: false, + strictVersion: true + }, + shared6: { + import: false, + strictVersion: true + }, + shared7: { + import: false, + strictVersion: true + }, + shared8: { + import: false, + strictVersion: true + }, + shared9: { + import: false, + strictVersion: true + }, + shared10: { + import: false, + strictVersion: true + }, + shared11: { + import: false, + strictVersion: true + }, + shared12: { + import: false + }, + shared13: { + import: false + }, + shared14: { + import: false + }, + shared15: { + import: false, + strictVersion: true + }, + shared16: { + import: false + }, + shared17: { + import: false, + strictVersion: true + }, + shared18: { + import: false + }, + shared19: { + import: false + }, + shared20: { + import: false + }, + shared21: { + import: false + }, + shared22: { + import: false + }, + shared23: { + import: false + }, + shared24: { + import: false + } + } + }) + ] +}; diff --git a/test/configCases/sharing/consume-self-reference/index.js b/test/configCases/sharing/consume-self-reference/index.js new file mode 100644 index 00000000000..a26f2e2c332 --- /dev/null +++ b/test/configCases/sharing/consume-self-reference/index.js @@ -0,0 +1,4 @@ +it("should be able to consume package self referencing", async () => { + const result = await import("my-middleware"); + expect(result.m()).toBe("ABA"); +}); diff --git a/test/configCases/sharing/consume-self-reference/node_modules/my-middleware/index.js b/test/configCases/sharing/consume-self-reference/node_modules/my-middleware/index.js new file mode 100644 index 00000000000..9d3799c10a3 --- /dev/null +++ b/test/configCases/sharing/consume-self-reference/node_modules/my-middleware/index.js @@ -0,0 +1,6 @@ +import { a } from "my-module/a"; +import { b } from "my-module/b"; + +export function m() { + return a() + b(); +} diff --git a/test/configCases/sharing/consume-self-reference/node_modules/my-middleware/package.json b/test/configCases/sharing/consume-self-reference/node_modules/my-middleware/package.json new file mode 100644 index 00000000000..857375d8323 --- /dev/null +++ b/test/configCases/sharing/consume-self-reference/node_modules/my-middleware/package.json @@ -0,0 +1,8 @@ +{ + "name": "my-middleware", + "type": "module", + "version": "2.3.4", + "dependencies": { + "my-module": "*" + } +} diff --git a/test/configCases/sharing/consume-self-reference/node_modules/my-module/a.js b/test/configCases/sharing/consume-self-reference/node_modules/my-module/a.js new file mode 100644 index 00000000000..32864f0a77f --- /dev/null +++ b/test/configCases/sharing/consume-self-reference/node_modules/my-module/a.js @@ -0,0 +1,3 @@ +export function a() { + return "A"; +} diff --git a/test/configCases/sharing/consume-self-reference/node_modules/my-module/b.js b/test/configCases/sharing/consume-self-reference/node_modules/my-module/b.js new file mode 100644 index 00000000000..a528f0acf55 --- /dev/null +++ b/test/configCases/sharing/consume-self-reference/node_modules/my-module/b.js @@ -0,0 +1,5 @@ +import { a } from "my-module/a"; + +export function b() { + return "B" + a(); +} diff --git a/test/configCases/sharing/consume-self-reference/node_modules/my-module/package.json b/test/configCases/sharing/consume-self-reference/node_modules/my-module/package.json new file mode 100644 index 00000000000..487a24abd22 --- /dev/null +++ b/test/configCases/sharing/consume-self-reference/node_modules/my-module/package.json @@ -0,0 +1,9 @@ +{ + "name": "my-module", + "type": "module", + "version": "1.2.3", + "exports": { + "./a": "./a.js", + "./b": "./b.js" + } +} diff --git a/test/configCases/sharing/consume-self-reference/package.json b/test/configCases/sharing/consume-self-reference/package.json new file mode 100644 index 00000000000..dfee3b48973 --- /dev/null +++ b/test/configCases/sharing/consume-self-reference/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "my-middleware": "^2.3.0" + } +} diff --git a/test/configCases/sharing/consume-self-reference/webpack.config.js b/test/configCases/sharing/consume-self-reference/webpack.config.js new file mode 100644 index 00000000000..fc3d79631be --- /dev/null +++ b/test/configCases/sharing/consume-self-reference/webpack.config.js @@ -0,0 +1,26 @@ +// eslint-disable-next-line n/no-unpublished-require +const { SharePlugin } = require("../../../../").sharing; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [ + new SharePlugin({ + shared: { + "my-middleware": { + singleton: true + // import: false + }, + "my-module/a": { + singleton: true, + version: "1.2.3" + // import: false + }, + "my-module/b": { + singleton: true, + version: "1.2.3" + // import: false + } + } + }) + ] +}; diff --git a/test/configCases/sharing/no-override-loaded/index.js b/test/configCases/sharing/no-override-loaded/index.js new file mode 100644 index 00000000000..930da1445b0 --- /dev/null +++ b/test/configCases/sharing/no-override-loaded/index.js @@ -0,0 +1,13 @@ +it("should not override an already loaded shared module version", async () => { + __webpack_share_scopes__.default = { + package: { + "1.0.0": { + get: () => () => 42, + loaded: true, + from: "a" + } + } + }; + await __webpack_init_sharing__("default"); + expect(require("package")).toBe(42); +}); diff --git a/test/configCases/sharing/no-override-loaded/node_modules/package/index.js b/test/configCases/sharing/no-override-loaded/node_modules/package/index.js new file mode 100644 index 00000000000..7c1dac1c302 --- /dev/null +++ b/test/configCases/sharing/no-override-loaded/node_modules/package/index.js @@ -0,0 +1 @@ +module.exports = "package"; diff --git a/test/configCases/sharing/no-override-loaded/node_modules/package/package.json b/test/configCases/sharing/no-override-loaded/node_modules/package/package.json new file mode 100644 index 00000000000..1587a669681 --- /dev/null +++ b/test/configCases/sharing/no-override-loaded/node_modules/package/package.json @@ -0,0 +1,3 @@ +{ + "version": "1.0.0" +} diff --git a/test/configCases/sharing/no-override-loaded/package.json b/test/configCases/sharing/no-override-loaded/package.json new file mode 100644 index 00000000000..7a0670f6736 --- /dev/null +++ b/test/configCases/sharing/no-override-loaded/package.json @@ -0,0 +1,6 @@ +{ + "version": "0.0.0", + "dependencies": { + "package": "1" + } +} diff --git a/test/configCases/sharing/no-override-loaded/webpack.config.js b/test/configCases/sharing/no-override-loaded/webpack.config.js new file mode 100644 index 00000000000..1752fcbb876 --- /dev/null +++ b/test/configCases/sharing/no-override-loaded/webpack.config.js @@ -0,0 +1,14 @@ +// eslint-disable-next-line n/no-unpublished-require +const { SharePlugin } = require("../../../../").sharing; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + uniqueName: "b" + }, + plugins: [ + new SharePlugin({ + shared: ["package"] + }) + ] +}; diff --git a/test/configCases/sharing/provide-eager-module/index.js b/test/configCases/sharing/provide-eager-module/index.js new file mode 100644 index 00000000000..e03bd6d95d0 --- /dev/null +++ b/test/configCases/sharing/provide-eager-module/index.js @@ -0,0 +1,75 @@ +if (Math.random() < 0) { + require("common"); + require("uncommon"); +} + +it("should overwrite non-eager shared module with eager shared module", async () => { + __webpack_require__.S = { + eagerOverrideNonEager: { + common: { + "1.0.0": { + eager: undefined, // any falsy value + from: "dashboard" + } + } + } + }; + await __webpack_init_sharing__("eagerOverrideNonEager"); + expect( + Object.keys(__webpack_share_scopes__["eagerOverrideNonEager"]) + ).toContain("common"); + const commonModule = __webpack_share_scopes__.eagerOverrideNonEager.common; + expect(Object.keys(commonModule)).toContain("1.0.0"); + expect(commonModule["1.0.0"].eager).toBe(true); +}); +it("should not overwrite already shared eager module with non-eager module", async () => { + __webpack_require__.S = { + nonEagerDontOverrideEager: { + uncommon: { + "2.0.0": { + eager: 1, // any truthy value + from: "aaa" + } + } + } + }; + await __webpack_init_sharing__("nonEagerDontOverrideEager"); + expect( + Object.keys(__webpack_share_scopes__["nonEagerDontOverrideEager"]) + ).toContain("uncommon"); + const uncommonModule = + __webpack_share_scopes__.nonEagerDontOverrideEager.uncommon; + expect(Object.keys(uncommonModule)).toContain("2.0.0"); + expect(uncommonModule["2.0.0"].eager).toBe(1); +}); +it("should prefer shared non-eager module from newer container", async () => { + __webpack_require__.S = { + newerNonEager: { + uncommon: { + "2.0.0": { + from: "appshell-1.0" + } + } + } + }; + await __webpack_init_sharing__("newerNonEager"); + const uncommonModule = __webpack_share_scopes__.newerNonEager.uncommon; + expect(Object.keys(uncommonModule)).toContain("2.0.0"); + expect(uncommonModule["2.0.0"].from).toBe("appshell-2.0"); +}); +it("should prefer shared eager module from newer container", async () => { + __webpack_require__.S = { + newerEager: { + common: { + "1.0.0": { + from: "appshell-1.0", + eager: true + } + } + } + }; + await __webpack_init_sharing__("newerEager"); + const commonModule = __webpack_share_scopes__.newerEager.common; + expect(Object.keys(commonModule)).toContain("1.0.0"); + expect(commonModule["1.0.0"].from).toBe("appshell-2.0"); +}); diff --git a/test/configCases/sharing/provide-eager-module/node_modules/common/index.js b/test/configCases/sharing/provide-eager-module/node_modules/common/index.js new file mode 100644 index 00000000000..888cae37af9 --- /dev/null +++ b/test/configCases/sharing/provide-eager-module/node_modules/common/index.js @@ -0,0 +1 @@ +module.exports = 42; diff --git a/test/configCases/sharing/provide-eager-module/node_modules/common/package.json b/test/configCases/sharing/provide-eager-module/node_modules/common/package.json new file mode 100644 index 00000000000..1587a669681 --- /dev/null +++ b/test/configCases/sharing/provide-eager-module/node_modules/common/package.json @@ -0,0 +1,3 @@ +{ + "version": "1.0.0" +} diff --git a/test/configCases/sharing/provide-eager-module/node_modules/uncommon/index.js b/test/configCases/sharing/provide-eager-module/node_modules/uncommon/index.js new file mode 100644 index 00000000000..888cae37af9 --- /dev/null +++ b/test/configCases/sharing/provide-eager-module/node_modules/uncommon/index.js @@ -0,0 +1 @@ +module.exports = 42; diff --git a/test/configCases/sharing/provide-eager-module/node_modules/uncommon/package.json b/test/configCases/sharing/provide-eager-module/node_modules/uncommon/package.json new file mode 100644 index 00000000000..4928ba5355f --- /dev/null +++ b/test/configCases/sharing/provide-eager-module/node_modules/uncommon/package.json @@ -0,0 +1,3 @@ +{ + "version": "2.0.0" +} diff --git a/test/configCases/sharing/provide-eager-module/package.json b/test/configCases/sharing/provide-eager-module/package.json new file mode 100644 index 00000000000..b26ce864d33 --- /dev/null +++ b/test/configCases/sharing/provide-eager-module/package.json @@ -0,0 +1,7 @@ +{ + "dependencies": { + "common": "*", + "uncommon": "*" + }, + "name": "appshell-2.0" +} diff --git a/test/configCases/sharing/provide-eager-module/webpack.config.js b/test/configCases/sharing/provide-eager-module/webpack.config.js new file mode 100644 index 00000000000..fcdb7b81417 --- /dev/null +++ b/test/configCases/sharing/provide-eager-module/webpack.config.js @@ -0,0 +1,43 @@ +// eslint-disable-next-line n/no-unpublished-require +const { ProvideSharedPlugin } = require("../../../../").sharing; + +/** @type {import("../../../../types").Configuration} */ +module.exports = { + mode: "development", + plugins: [ + new ProvideSharedPlugin({ + shareScope: "eagerOverrideNonEager", + provides: { + common: { + shareKey: "common", + eager: true + } + } + }), + new ProvideSharedPlugin({ + shareScope: "nonEagerDontOverrideEager", + provides: { + uncommon: { + shareKey: "uncommon" + } + } + }), + new ProvideSharedPlugin({ + shareScope: "newerNonEager", + provides: { + uncommon: { + shareKey: "uncommon" + } + } + }), + new ProvideSharedPlugin({ + shareScope: "newerEager", + provides: { + common: { + shareKey: "common", + eager: true + } + } + }) + ] +}; diff --git a/test/configCases/sharing/provide-module/index.js b/test/configCases/sharing/provide-module/index.js new file mode 100644 index 00000000000..1a4c915fe9c --- /dev/null +++ b/test/configCases/sharing/provide-module/index.js @@ -0,0 +1,54 @@ +if (Math.random() < 0) { + require("package"); +} + +it("should add provided modules to the share scope on init", async () => { + expect(__webpack_share_scopes__).toEqual({}); + await __webpack_init_sharing__("default"); + expect(Object.keys(__webpack_share_scopes__)).toEqual(["default"]); + await __webpack_init_sharing__("test-scope"); + await __webpack_init_sharing__("other-scope"); + expect(__webpack_init_sharing__("other-scope")).toBe( + __webpack_init_sharing__("other-scope") + ); + expect(Object.keys(__webpack_share_scopes__).length).toBe(3); + expect(Object.keys(__webpack_share_scopes__)).toContain("default"); + expect(Object.keys(__webpack_share_scopes__)).toContain("test-scope"); + expect(Object.keys(__webpack_share_scopes__)).toContain("other-scope"); + expect(Object.keys(__webpack_share_scopes__.default)).toContain("package"); + expect(Object.keys(__webpack_share_scopes__["test-scope"])).toContain( + "package" + ); + expect( + Object.keys(__webpack_share_scopes__["test-scope"]["package"]) + ).toContain("1.0.0"); + expect(Object.keys(__webpack_share_scopes__["test-scope"])).toContain( + "./test1" + ); + expect( + Object.keys(__webpack_share_scopes__["test-scope"]["./test1"]) + ).toContain("0"); + expect(Object.keys(__webpack_share_scopes__["other-scope"])).toContain( + "test2" + ); + const test2Versions = Object.keys( + __webpack_share_scopes__["other-scope"]["test2"] + ); + expect(test2Versions).toContain("1.3.0"); + expect(test2Versions).toContain("1.1.9"); + expect(test2Versions).toContain("1.2.3"); + + { + const factory = await __webpack_share_scopes__["test-scope"]["./test1"][ + "0" + ].get(); + expect(factory()).toBe("test1"); + } + + { + const factory = await __webpack_share_scopes__["other-scope"]["test2"][ + "1.3.0" + ].get(); + expect(factory()).toBe("test2"); + } +}); diff --git a/test/configCases/sharing/provide-module/node_modules/package/index.js b/test/configCases/sharing/provide-module/node_modules/package/index.js new file mode 100644 index 00000000000..7c1dac1c302 --- /dev/null +++ b/test/configCases/sharing/provide-module/node_modules/package/index.js @@ -0,0 +1 @@ +module.exports = "package"; diff --git a/test/configCases/sharing/provide-module/node_modules/package/package.json b/test/configCases/sharing/provide-module/node_modules/package/package.json new file mode 100644 index 00000000000..1587a669681 --- /dev/null +++ b/test/configCases/sharing/provide-module/node_modules/package/package.json @@ -0,0 +1,3 @@ +{ + "version": "1.0.0" +} diff --git a/test/configCases/sharing/provide-module/package.json b/test/configCases/sharing/provide-module/package.json new file mode 100644 index 00000000000..1be1b18fe5a --- /dev/null +++ b/test/configCases/sharing/provide-module/package.json @@ -0,0 +1,3 @@ +{ + "version": "0.0.0" +} diff --git a/test/configCases/sharing/provide-module/test1.js b/test/configCases/sharing/provide-module/test1.js new file mode 100644 index 00000000000..e9500f323ba --- /dev/null +++ b/test/configCases/sharing/provide-module/test1.js @@ -0,0 +1 @@ +module.exports = "test1"; diff --git a/test/configCases/sharing/provide-module/test2-wrong.js b/test/configCases/sharing/provide-module/test2-wrong.js new file mode 100644 index 00000000000..c298d0e599f --- /dev/null +++ b/test/configCases/sharing/provide-module/test2-wrong.js @@ -0,0 +1 @@ +module.exports = "test2-wrong"; diff --git a/test/configCases/sharing/provide-module/test2.js b/test/configCases/sharing/provide-module/test2.js new file mode 100644 index 00000000000..cad935f3d81 --- /dev/null +++ b/test/configCases/sharing/provide-module/test2.js @@ -0,0 +1 @@ +module.exports = "test2"; diff --git a/test/configCases/sharing/provide-module/webpack.config.js b/test/configCases/sharing/provide-module/webpack.config.js new file mode 100644 index 00000000000..5d677e5f339 --- /dev/null +++ b/test/configCases/sharing/provide-module/webpack.config.js @@ -0,0 +1,43 @@ +// eslint-disable-next-line n/no-unpublished-require +const { ProvideSharedPlugin } = require("../../../../").sharing; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [ + new ProvideSharedPlugin({ + shareScope: "test-scope", + provides: [ + "./test1", + { + "./test2-wrong": { + shareKey: "test2", + shareScope: "other-scope", + version: "1.2.3" + } + }, + "package" + ] + }), + new ProvideSharedPlugin({ + provides: ["package"] + }), + new ProvideSharedPlugin({ + shareScope: "other-scope", + provides: { + "./test2": { + shareKey: "test2", + version: "1.3.0" + } + } + }), + new ProvideSharedPlugin({ + provides: { + "./test2-wrong": { + shareKey: "test2", + shareScope: "other-scope", + version: "1.1.9" + } + } + }) + ] +}; diff --git a/test/configCases/sharing/provide-multiple-versions/index.js b/test/configCases/sharing/provide-multiple-versions/index.js new file mode 100644 index 00000000000..95d3a1b246e --- /dev/null +++ b/test/configCases/sharing/provide-multiple-versions/index.js @@ -0,0 +1,27 @@ +import { version } from "shared"; +import { version as innerVersion } from "my-module"; + +it("should provide both shared versions, but not the unused one", async () => { + await __webpack_init_sharing__("default"); + expect(Object.keys(__webpack_share_scopes__.default)).toContain("shared"); + expect(Object.keys(__webpack_share_scopes__.default.shared)).toContain( + "1.0.0" + ); + expect(Object.keys(__webpack_share_scopes__.default.shared)).toContain( + "2.0.0" + ); + expect(Object.keys(__webpack_share_scopes__.default.shared)).not.toContain( + "3.0.0" + ); + expect(__webpack_share_scopes__.default.shared["1.0.0"].from).toEqual( + "package-name" + ); + expect(__webpack_share_scopes__.default.shared["2.0.0"].from).toEqual( + "package-name" + ); +}); + +it("should import the correct versions", () => { + expect(version).toBe("1.0.0"); + expect(innerVersion).toBe("2.0.0"); +}); diff --git a/test/configCases/sharing/provide-multiple-versions/node_modules/my-module/index.js b/test/configCases/sharing/provide-multiple-versions/node_modules/my-module/index.js new file mode 100644 index 00000000000..33dcca8255b --- /dev/null +++ b/test/configCases/sharing/provide-multiple-versions/node_modules/my-module/index.js @@ -0,0 +1 @@ +export * from "shared"; diff --git a/test/configCases/sharing/provide-multiple-versions/node_modules/my-module/node_modules/shared/index.js b/test/configCases/sharing/provide-multiple-versions/node_modules/my-module/node_modules/shared/index.js new file mode 100644 index 00000000000..fa434c11d85 --- /dev/null +++ b/test/configCases/sharing/provide-multiple-versions/node_modules/my-module/node_modules/shared/index.js @@ -0,0 +1 @@ +export * from "./package.json"; diff --git a/test/configCases/sharing/provide-multiple-versions/node_modules/my-module/node_modules/shared/package.json b/test/configCases/sharing/provide-multiple-versions/node_modules/my-module/node_modules/shared/package.json new file mode 100644 index 00000000000..8836d69c11f --- /dev/null +++ b/test/configCases/sharing/provide-multiple-versions/node_modules/my-module/node_modules/shared/package.json @@ -0,0 +1,4 @@ +{ + "name": "shared", + "version": "2.0.0" +} diff --git a/test/configCases/sharing/provide-multiple-versions/node_modules/shared/index.js b/test/configCases/sharing/provide-multiple-versions/node_modules/shared/index.js new file mode 100644 index 00000000000..fa434c11d85 --- /dev/null +++ b/test/configCases/sharing/provide-multiple-versions/node_modules/shared/index.js @@ -0,0 +1 @@ +export * from "./package.json"; diff --git a/test/configCases/sharing/provide-multiple-versions/node_modules/shared/package.json b/test/configCases/sharing/provide-multiple-versions/node_modules/shared/package.json new file mode 100644 index 00000000000..65b99b00928 --- /dev/null +++ b/test/configCases/sharing/provide-multiple-versions/node_modules/shared/package.json @@ -0,0 +1,4 @@ +{ + "name": "shared", + "version": "1.0.0" +} diff --git a/test/configCases/sharing/provide-multiple-versions/node_modules/unused-module/node_modules/shared/index.js b/test/configCases/sharing/provide-multiple-versions/node_modules/unused-module/node_modules/shared/index.js new file mode 100644 index 00000000000..fa434c11d85 --- /dev/null +++ b/test/configCases/sharing/provide-multiple-versions/node_modules/unused-module/node_modules/shared/index.js @@ -0,0 +1 @@ +export * from "./package.json"; diff --git a/test/configCases/sharing/provide-multiple-versions/node_modules/unused-module/node_modules/shared/package.json b/test/configCases/sharing/provide-multiple-versions/node_modules/unused-module/node_modules/shared/package.json new file mode 100644 index 00000000000..87cb039c937 --- /dev/null +++ b/test/configCases/sharing/provide-multiple-versions/node_modules/unused-module/node_modules/shared/package.json @@ -0,0 +1,4 @@ +{ + "name": "shared", + "version": "3.0.0" +} diff --git a/test/configCases/sharing/provide-multiple-versions/package.json b/test/configCases/sharing/provide-multiple-versions/package.json new file mode 100644 index 00000000000..a2508f84799 --- /dev/null +++ b/test/configCases/sharing/provide-multiple-versions/package.json @@ -0,0 +1,3 @@ +{ + "name": "package-name" +} diff --git a/test/configCases/sharing/provide-multiple-versions/webpack.config.js b/test/configCases/sharing/provide-multiple-versions/webpack.config.js new file mode 100644 index 00000000000..797c44ffba6 --- /dev/null +++ b/test/configCases/sharing/provide-multiple-versions/webpack.config.js @@ -0,0 +1,11 @@ +// eslint-disable-next-line n/no-unpublished-require +const { ProvideSharedPlugin } = require("../../../../").sharing; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [ + new ProvideSharedPlugin({ + provides: ["shared"] + }) + ] +}; diff --git a/test/configCases/sharing/provide-shared-with-runtime-chunk/index.js b/test/configCases/sharing/provide-shared-with-runtime-chunk/index.js new file mode 100644 index 00000000000..fb5d564378e --- /dev/null +++ b/test/configCases/sharing/provide-shared-with-runtime-chunk/index.js @@ -0,0 +1,5 @@ +import x from "x"; + +it("should work", () => { + expect(x).toBe(42); +}); diff --git a/test/configCases/sharing/provide-shared-with-runtime-chunk/node_modules/x/index.js b/test/configCases/sharing/provide-shared-with-runtime-chunk/node_modules/x/index.js new file mode 100644 index 00000000000..888cae37af9 --- /dev/null +++ b/test/configCases/sharing/provide-shared-with-runtime-chunk/node_modules/x/index.js @@ -0,0 +1 @@ +module.exports = 42; diff --git a/test/configCases/sharing/provide-shared-with-runtime-chunk/node_modules/x/package.json b/test/configCases/sharing/provide-shared-with-runtime-chunk/node_modules/x/package.json new file mode 100644 index 00000000000..1587a669681 --- /dev/null +++ b/test/configCases/sharing/provide-shared-with-runtime-chunk/node_modules/x/package.json @@ -0,0 +1,3 @@ +{ + "version": "1.0.0" +} diff --git a/test/configCases/sharing/provide-shared-with-runtime-chunk/test.config.js b/test/configCases/sharing/provide-shared-with-runtime-chunk/test.config.js new file mode 100644 index 00000000000..8022cb75980 --- /dev/null +++ b/test/configCases/sharing/provide-shared-with-runtime-chunk/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./runtime.js", "./main.js"]; + } +}; diff --git a/test/configCases/sharing/provide-shared-with-runtime-chunk/webpack.config.js b/test/configCases/sharing/provide-shared-with-runtime-chunk/webpack.config.js new file mode 100644 index 00000000000..2fbf17772ea --- /dev/null +++ b/test/configCases/sharing/provide-shared-with-runtime-chunk/webpack.config.js @@ -0,0 +1,15 @@ +const { ProvideSharedPlugin } = require("../../../../").sharing; +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + filename: "[name].js" + }, + optimization: { + runtimeChunk: "single" + }, + plugins: [ + new ProvideSharedPlugin({ + provides: ["x"] + }) + ] +}; diff --git a/test/configCases/sharing/share-multiple-versions/index.js b/test/configCases/sharing/share-multiple-versions/index.js new file mode 100644 index 00000000000..aec7523fe98 --- /dev/null +++ b/test/configCases/sharing/share-multiple-versions/index.js @@ -0,0 +1,7 @@ +it("should provide both shared versions, but not the unused one", async () => { + await __webpack_init_sharing__("default"); + const { version } = await import("shared"); + const { version: versionInner } = await import("my-module"); + expect(version).toBe("1.0.0"); + expect(versionInner).toBe("2.0.0"); +}); diff --git a/test/configCases/sharing/share-multiple-versions/node_modules/my-module/index.js b/test/configCases/sharing/share-multiple-versions/node_modules/my-module/index.js new file mode 100644 index 00000000000..33dcca8255b --- /dev/null +++ b/test/configCases/sharing/share-multiple-versions/node_modules/my-module/index.js @@ -0,0 +1 @@ +export * from "shared"; diff --git a/test/configCases/sharing/share-multiple-versions/node_modules/my-module/node_modules/shared/index.js b/test/configCases/sharing/share-multiple-versions/node_modules/my-module/node_modules/shared/index.js new file mode 100644 index 00000000000..fa434c11d85 --- /dev/null +++ b/test/configCases/sharing/share-multiple-versions/node_modules/my-module/node_modules/shared/index.js @@ -0,0 +1 @@ +export * from "./package.json"; diff --git a/test/configCases/sharing/share-multiple-versions/node_modules/my-module/node_modules/shared/package.json b/test/configCases/sharing/share-multiple-versions/node_modules/my-module/node_modules/shared/package.json new file mode 100644 index 00000000000..8836d69c11f --- /dev/null +++ b/test/configCases/sharing/share-multiple-versions/node_modules/my-module/node_modules/shared/package.json @@ -0,0 +1,4 @@ +{ + "name": "shared", + "version": "2.0.0" +} diff --git a/test/configCases/sharing/share-multiple-versions/node_modules/my-module/package.json b/test/configCases/sharing/share-multiple-versions/node_modules/my-module/package.json new file mode 100644 index 00000000000..1bcd4a5c107 --- /dev/null +++ b/test/configCases/sharing/share-multiple-versions/node_modules/my-module/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "shared": "^2.0.0" + } +} diff --git a/test/configCases/sharing/share-multiple-versions/node_modules/shared/index.js b/test/configCases/sharing/share-multiple-versions/node_modules/shared/index.js new file mode 100644 index 00000000000..fa434c11d85 --- /dev/null +++ b/test/configCases/sharing/share-multiple-versions/node_modules/shared/index.js @@ -0,0 +1 @@ +export * from "./package.json"; diff --git a/test/configCases/sharing/share-multiple-versions/node_modules/shared/package.json b/test/configCases/sharing/share-multiple-versions/node_modules/shared/package.json new file mode 100644 index 00000000000..65b99b00928 --- /dev/null +++ b/test/configCases/sharing/share-multiple-versions/node_modules/shared/package.json @@ -0,0 +1,4 @@ +{ + "name": "shared", + "version": "1.0.0" +} diff --git a/test/configCases/sharing/share-multiple-versions/node_modules/unused-module/node_modules/shared/index.js b/test/configCases/sharing/share-multiple-versions/node_modules/unused-module/node_modules/shared/index.js new file mode 100644 index 00000000000..fa434c11d85 --- /dev/null +++ b/test/configCases/sharing/share-multiple-versions/node_modules/unused-module/node_modules/shared/index.js @@ -0,0 +1 @@ +export * from "./package.json"; diff --git a/test/configCases/sharing/share-multiple-versions/node_modules/unused-module/node_modules/shared/package.json b/test/configCases/sharing/share-multiple-versions/node_modules/unused-module/node_modules/shared/package.json new file mode 100644 index 00000000000..87cb039c937 --- /dev/null +++ b/test/configCases/sharing/share-multiple-versions/node_modules/unused-module/node_modules/shared/package.json @@ -0,0 +1,4 @@ +{ + "name": "shared", + "version": "3.0.0" +} diff --git a/test/configCases/sharing/share-multiple-versions/package.json b/test/configCases/sharing/share-multiple-versions/package.json new file mode 100644 index 00000000000..f2f1c5e2ffc --- /dev/null +++ b/test/configCases/sharing/share-multiple-versions/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "shared": "^1.0.0" + } +} diff --git a/test/configCases/sharing/share-multiple-versions/webpack.config.js b/test/configCases/sharing/share-multiple-versions/webpack.config.js new file mode 100644 index 00000000000..5e2b9102f8c --- /dev/null +++ b/test/configCases/sharing/share-multiple-versions/webpack.config.js @@ -0,0 +1,11 @@ +// eslint-disable-next-line n/no-unpublished-require +const { SharePlugin } = require("../../../../").sharing; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [ + new SharePlugin({ + shared: ["shared"] + }) + ] +}; diff --git a/test/configCases/sharing/share-plugin-dual-mode/cjs/index.js b/test/configCases/sharing/share-plugin-dual-mode/cjs/index.js new file mode 100644 index 00000000000..94421504941 --- /dev/null +++ b/test/configCases/sharing/share-plugin-dual-mode/cjs/index.js @@ -0,0 +1,7 @@ +it('should provide own dependency', async () => { + expect(await import('lib')).toEqual( + expect.objectContaining({ + default: 'lib@1.1.1 with transitive_lib@1.1.1', + }), + ); +}); diff --git a/test/configCases/sharing/share-plugin-dual-mode/cjs/package.json b/test/configCases/sharing/share-plugin-dual-mode/cjs/package.json new file mode 100644 index 00000000000..5bbefffbabe --- /dev/null +++ b/test/configCases/sharing/share-plugin-dual-mode/cjs/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} diff --git a/test/configCases/sharing/share-plugin-dual-mode/node_modules/lib/index.js b/test/configCases/sharing/share-plugin-dual-mode/node_modules/lib/index.js new file mode 100644 index 00000000000..7b736bcce99 --- /dev/null +++ b/test/configCases/sharing/share-plugin-dual-mode/node_modules/lib/index.js @@ -0,0 +1,4 @@ +import cfg from './package.json' with { type: 'json' }; +import transitiveDept from 'transitive_lib'; + +export default `lib@${cfg.version} with ${transitiveDept}`; diff --git a/test/configCases/sharing/share-plugin-dual-mode/node_modules/lib/package.json b/test/configCases/sharing/share-plugin-dual-mode/node_modules/lib/package.json new file mode 100644 index 00000000000..7e0693158c6 --- /dev/null +++ b/test/configCases/sharing/share-plugin-dual-mode/node_modules/lib/package.json @@ -0,0 +1,6 @@ +{ + "version": "1.1.1", + "dependencies": { + "transitive_lib": "^1.0.0" + } +} diff --git a/test/configCases/sharing/share-plugin-dual-mode/node_modules/transitive_lib/index.js b/test/configCases/sharing/share-plugin-dual-mode/node_modules/transitive_lib/index.js new file mode 100644 index 00000000000..b2e98d48ce5 --- /dev/null +++ b/test/configCases/sharing/share-plugin-dual-mode/node_modules/transitive_lib/index.js @@ -0,0 +1,3 @@ +import cfg from './package.json' with { type: 'json' }; + +export default `transitive_lib@${cfg.version}`; diff --git a/test/configCases/sharing/share-plugin-dual-mode/node_modules/transitive_lib/package.json b/test/configCases/sharing/share-plugin-dual-mode/node_modules/transitive_lib/package.json new file mode 100644 index 00000000000..2a38ae1d1f4 --- /dev/null +++ b/test/configCases/sharing/share-plugin-dual-mode/node_modules/transitive_lib/package.json @@ -0,0 +1,3 @@ +{ + "version": "1.1.1" +} diff --git a/test/configCases/sharing/share-plugin-dual-mode/package.json b/test/configCases/sharing/share-plugin-dual-mode/package.json new file mode 100644 index 00000000000..7b0e66048b7 --- /dev/null +++ b/test/configCases/sharing/share-plugin-dual-mode/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "lib": "^1.0.0" + } +} diff --git a/test/configCases/sharing/share-plugin-dual-mode/webpack.config.js b/test/configCases/sharing/share-plugin-dual-mode/webpack.config.js new file mode 100644 index 00000000000..824b0358f57 --- /dev/null +++ b/test/configCases/sharing/share-plugin-dual-mode/webpack.config.js @@ -0,0 +1,16 @@ +// eslint-disable-next-line n/no-unpublished-require +const { SharePlugin } = require("../../../../").sharing; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + context: `${__dirname}/cjs`, + plugins: [ + new SharePlugin({ + shared: { + lib: {}, + // eslint-disable-next-line camelcase + transitive_lib: {} + } + }) + ] +}; diff --git a/test/configCases/sharing/share-plugin-monorepo/app1/index.js b/test/configCases/sharing/share-plugin-monorepo/app1/index.js new file mode 100644 index 00000000000..693cc2448f0 --- /dev/null +++ b/test/configCases/sharing/share-plugin-monorepo/app1/index.js @@ -0,0 +1,15 @@ +it('should provide library from own package.json', async () => { + expect(await import('lib1')).toEqual( + expect.objectContaining({ + default: 'lib1@1.1.1', + }), + ); +}); + +it('should provide library from parent package.json', async () => { + expect(await import('lib2')).toEqual( + expect.objectContaining({ + default: 'lib2@2.2.2', + }), + ); +}); diff --git a/test/configCases/sharing/share-plugin-monorepo/app1/node_modules/lib2/index.js b/test/configCases/sharing/share-plugin-monorepo/app1/node_modules/lib2/index.js new file mode 100644 index 00000000000..c5d50faf728 --- /dev/null +++ b/test/configCases/sharing/share-plugin-monorepo/app1/node_modules/lib2/index.js @@ -0,0 +1,3 @@ +import cfg from './package.json' with { type: 'json' }; + +export default `lib2@${cfg.version}`; diff --git a/test/configCases/sharing/share-plugin-monorepo/app1/node_modules/lib2/package.json b/test/configCases/sharing/share-plugin-monorepo/app1/node_modules/lib2/package.json new file mode 100644 index 00000000000..b72ccacc95a --- /dev/null +++ b/test/configCases/sharing/share-plugin-monorepo/app1/node_modules/lib2/package.json @@ -0,0 +1,3 @@ +{ + "version": "2.2.2" +} diff --git a/test/configCases/sharing/share-plugin-monorepo/app1/package.json b/test/configCases/sharing/share-plugin-monorepo/app1/package.json new file mode 100644 index 00000000000..6869b5be774 --- /dev/null +++ b/test/configCases/sharing/share-plugin-monorepo/app1/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "lib2": "^2.0.0" + } +} diff --git a/test/configCases/sharing/share-plugin-monorepo/node_modules/lib1/index.js b/test/configCases/sharing/share-plugin-monorepo/node_modules/lib1/index.js new file mode 100644 index 00000000000..a54163858e1 --- /dev/null +++ b/test/configCases/sharing/share-plugin-monorepo/node_modules/lib1/index.js @@ -0,0 +1,3 @@ +import cfg from './package.json' with { type: 'json' }; + +export default `lib1@${cfg.version}`; diff --git a/test/configCases/sharing/share-plugin-monorepo/node_modules/lib1/package.json b/test/configCases/sharing/share-plugin-monorepo/node_modules/lib1/package.json new file mode 100644 index 00000000000..2a38ae1d1f4 --- /dev/null +++ b/test/configCases/sharing/share-plugin-monorepo/node_modules/lib1/package.json @@ -0,0 +1,3 @@ +{ + "version": "1.1.1" +} diff --git a/test/configCases/sharing/share-plugin-monorepo/node_modules/lib2/index.js b/test/configCases/sharing/share-plugin-monorepo/node_modules/lib2/index.js new file mode 100644 index 00000000000..c5d50faf728 --- /dev/null +++ b/test/configCases/sharing/share-plugin-monorepo/node_modules/lib2/index.js @@ -0,0 +1,3 @@ +import cfg from './package.json' with { type: 'json' }; + +export default `lib2@${cfg.version}`; diff --git a/test/configCases/sharing/share-plugin-monorepo/node_modules/lib2/package.json b/test/configCases/sharing/share-plugin-monorepo/node_modules/lib2/package.json new file mode 100644 index 00000000000..2a38ae1d1f4 --- /dev/null +++ b/test/configCases/sharing/share-plugin-monorepo/node_modules/lib2/package.json @@ -0,0 +1,3 @@ +{ + "version": "1.1.1" +} diff --git a/test/configCases/sharing/share-plugin-monorepo/package.json b/test/configCases/sharing/share-plugin-monorepo/package.json new file mode 100644 index 00000000000..4ad87434de7 --- /dev/null +++ b/test/configCases/sharing/share-plugin-monorepo/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "lib1": "^1.0.0", + "lib2": "^1.0.0" + } +} diff --git a/test/configCases/sharing/share-plugin-monorepo/webpack.config.js b/test/configCases/sharing/share-plugin-monorepo/webpack.config.js new file mode 100644 index 00000000000..74c3e8ad25e --- /dev/null +++ b/test/configCases/sharing/share-plugin-monorepo/webpack.config.js @@ -0,0 +1,17 @@ +// eslint-disable-next-line n/no-unpublished-require +const { SharePlugin } = require("../../../../").sharing; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + context: `${__dirname}/app1`, + plugins: [ + new SharePlugin({ + shared: { + lib1: {}, + lib2: { + singleton: true + } + } + }) + ] +}; diff --git a/test/configCases/sharing/share-plugin/index.js b/test/configCases/sharing/share-plugin/index.js new file mode 100644 index 00000000000..6055bd4aebf --- /dev/null +++ b/test/configCases/sharing/share-plugin/index.js @@ -0,0 +1,44 @@ +it("should provide and consume a normal library async", async () => { + expect(await import("lib1")).toEqual( + expect.objectContaining({ + default: "lib1" + }) + ); +}); + +it("should provide and consume a renamed library sync", () => { + expect(require("lib-two")).toEqual( + expect.objectContaining({ + default: "lib2" + }) + ); +}); + +it("should provide and consume a normal library async in a separate shareScope", async () => { + expect(await import("lib3")).toEqual( + expect.objectContaining({ + default: "lib3" + }) + ); + expect( + __webpack_share_scopes__.default && __webpack_share_scopes__.default.lib3 + ).toBe(undefined); + expect(typeof __webpack_share_scopes__.other.lib3).toBe("object"); +}); + +it("should provide and consume a relative request async", async () => { + expect(await import("./relative1")).toEqual( + expect.objectContaining({ + default: "rel1" + }) + ); +}); + +it("should consume a remapped relative request async", async () => { + if (Math.random() < 0) require("store"); + expect(await import("./relative2")).toEqual( + expect.objectContaining({ + default: "store" + }) + ); +}); diff --git a/test/configCases/sharing/share-plugin/node_modules/lib1/index.js b/test/configCases/sharing/share-plugin/node_modules/lib1/index.js new file mode 100644 index 00000000000..461d2376f4c --- /dev/null +++ b/test/configCases/sharing/share-plugin/node_modules/lib1/index.js @@ -0,0 +1 @@ +export default "lib1"; diff --git a/test/configCases/sharing/share-plugin/node_modules/lib1/package.json b/test/configCases/sharing/share-plugin/node_modules/lib1/package.json new file mode 100644 index 00000000000..2a38ae1d1f4 --- /dev/null +++ b/test/configCases/sharing/share-plugin/node_modules/lib1/package.json @@ -0,0 +1,3 @@ +{ + "version": "1.1.1" +} diff --git a/test/configCases/sharing/share-plugin/node_modules/lib2/index.js b/test/configCases/sharing/share-plugin/node_modules/lib2/index.js new file mode 100644 index 00000000000..c2a6f9581ff --- /dev/null +++ b/test/configCases/sharing/share-plugin/node_modules/lib2/index.js @@ -0,0 +1 @@ +export default "lib2"; diff --git a/test/configCases/sharing/share-plugin/node_modules/lib3/index.js b/test/configCases/sharing/share-plugin/node_modules/lib3/index.js new file mode 100644 index 00000000000..62fde4a705d --- /dev/null +++ b/test/configCases/sharing/share-plugin/node_modules/lib3/index.js @@ -0,0 +1 @@ +export default "lib3"; diff --git a/test/configCases/sharing/share-plugin/node_modules/lib3/package.json b/test/configCases/sharing/share-plugin/node_modules/lib3/package.json new file mode 100644 index 00000000000..2a38ae1d1f4 --- /dev/null +++ b/test/configCases/sharing/share-plugin/node_modules/lib3/package.json @@ -0,0 +1,3 @@ +{ + "version": "1.1.1" +} diff --git a/test/configCases/sharing/share-plugin/node_modules/store/index.js b/test/configCases/sharing/share-plugin/node_modules/store/index.js new file mode 100644 index 00000000000..225383e5cc2 --- /dev/null +++ b/test/configCases/sharing/share-plugin/node_modules/store/index.js @@ -0,0 +1 @@ +export default "store"; diff --git a/test/configCases/sharing/share-plugin/node_modules/store/package.json b/test/configCases/sharing/share-plugin/node_modules/store/package.json new file mode 100644 index 00000000000..ce04135d2cd --- /dev/null +++ b/test/configCases/sharing/share-plugin/node_modules/store/package.json @@ -0,0 +1,3 @@ +{ + "version": "0" +} diff --git a/test/configCases/sharing/share-plugin/package.json b/test/configCases/sharing/share-plugin/package.json new file mode 100644 index 00000000000..759724dfd56 --- /dev/null +++ b/test/configCases/sharing/share-plugin/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "lib3": "^1.1.0" + } +} diff --git a/test/configCases/sharing/share-plugin/relative1.js b/test/configCases/sharing/share-plugin/relative1.js new file mode 100644 index 00000000000..e460ea840d6 --- /dev/null +++ b/test/configCases/sharing/share-plugin/relative1.js @@ -0,0 +1 @@ +export default "rel1"; diff --git a/test/configCases/sharing/share-plugin/relative2.js b/test/configCases/sharing/share-plugin/relative2.js new file mode 100644 index 00000000000..9f52f4c6be4 --- /dev/null +++ b/test/configCases/sharing/share-plugin/relative2.js @@ -0,0 +1 @@ +export default "rel2"; diff --git a/test/configCases/sharing/share-plugin/webpack.config.js b/test/configCases/sharing/share-plugin/webpack.config.js new file mode 100644 index 00000000000..562630b8e50 --- /dev/null +++ b/test/configCases/sharing/share-plugin/webpack.config.js @@ -0,0 +1,37 @@ +// eslint-disable-next-line n/no-unpublished-require +const { SharePlugin } = require("../../../../").sharing; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + devtool: false, + plugins: [ + new SharePlugin({ + shared: { + lib1: "^1.0.0", + "lib-two": { + import: "lib2", + requiredVersion: "^1.0.0", + version: "1.3.4", + strictVersion: true, + eager: true + }, + lib3: { + shareScope: "other" + }, + "./relative1": { + import: "./relative1", + version: false + }, + "./relative2": { + import: false, + shareKey: "store", + version: "0", + requiredVersion: "0", + strictVersion: true + }, + store: "0" + } + }) + ] +}; diff --git a/test/configCases/side-effects/issue-13063/another.js b/test/configCases/side-effects/issue-13063/another.js new file mode 100644 index 00000000000..acd0091daa3 --- /dev/null +++ b/test/configCases/side-effects/issue-13063/another.js @@ -0,0 +1 @@ +require("./vendors").UiSelectButton2(); diff --git a/test/configCases/side-effects/issue-13063/test.config.js b/test/configCases/side-effects/issue-13063/test.config.js new file mode 100644 index 00000000000..6f97c7a60c3 --- /dev/null +++ b/test/configCases/side-effects/issue-13063/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./vendors.js", "./tst_examples_uiform.js"]; + } +}; diff --git a/test/configCases/side-effects/issue-13063/tst_examples_uiform.js b/test/configCases/side-effects/issue-13063/tst_examples_uiform.js new file mode 100644 index 00000000000..2850741c760 --- /dev/null +++ b/test/configCases/side-effects/issue-13063/tst_examples_uiform.js @@ -0,0 +1,4 @@ +it("should not crash", () => { + require("./vendors").UiSelectButton(); + require("./vendors").UiSelectButton2(); +}); diff --git a/test/configCases/side-effects/issue-13063/tst_examples_uitable.js b/test/configCases/side-effects/issue-13063/tst_examples_uitable.js new file mode 100644 index 00000000000..4ab084f713c --- /dev/null +++ b/test/configCases/side-effects/issue-13063/tst_examples_uitable.js @@ -0,0 +1,5 @@ +import { UiButton } from "./vendors"; + +it("should not crash", () => { + UiButton(); +}); diff --git a/test/configCases/side-effects/issue-13063/vendors/index.js b/test/configCases/side-effects/issue-13063/vendors/index.js new file mode 100644 index 00000000000..c786bf6169a --- /dev/null +++ b/test/configCases/side-effects/issue-13063/vendors/index.js @@ -0,0 +1,9 @@ +import uuid from "./uuid"; +import { checkIsNonemptyString } from "./types"; +export { UiSelectButton } from "./select"; +export { UiSelectButton2 } from "./select2"; + +export function UiButton() { + checkIsNonemptyString(); + uuid(); +} diff --git a/test/configCases/side-effects/issue-13063/vendors/select.js b/test/configCases/side-effects/issue-13063/vendors/select.js new file mode 100644 index 00000000000..3260aa2ca4e --- /dev/null +++ b/test/configCases/side-effects/issue-13063/vendors/select.js @@ -0,0 +1,9 @@ +import uuid from "./uuid"; +import { checkIsNonemptyString } from "./types"; + +export function UiSelectButton() { + checkIsNonemptyString(); + uuid(); +} + +console.log.bind(console); diff --git a/test/configCases/side-effects/issue-13063/vendors/select2.js b/test/configCases/side-effects/issue-13063/vendors/select2.js new file mode 100644 index 00000000000..1939e1c2224 --- /dev/null +++ b/test/configCases/side-effects/issue-13063/vendors/select2.js @@ -0,0 +1,7 @@ +import uuid from "./uuid"; + +export function UiSelectButton2() { + uuid(); +} + +console.log.bind(console); diff --git a/test/configCases/side-effects/issue-13063/vendors/types.js b/test/configCases/side-effects/issue-13063/vendors/types.js new file mode 100644 index 00000000000..02a236bbb43 --- /dev/null +++ b/test/configCases/side-effects/issue-13063/vendors/types.js @@ -0,0 +1 @@ +export function checkIsNonemptyString() {} diff --git a/test/configCases/side-effects/issue-13063/vendors/uuid.js b/test/configCases/side-effects/issue-13063/vendors/uuid.js new file mode 100644 index 00000000000..394593f1e0f --- /dev/null +++ b/test/configCases/side-effects/issue-13063/vendors/uuid.js @@ -0,0 +1 @@ +export default function uuid() {} diff --git a/test/configCases/side-effects/issue-13063/webpack.config.js b/test/configCases/side-effects/issue-13063/webpack.config.js new file mode 100644 index 00000000000..3c7e013a497 --- /dev/null +++ b/test/configCases/side-effects/issue-13063/webpack.config.js @@ -0,0 +1,28 @@ +module.exports = { + entry: { + // eslint-disable-next-line camelcase + tst_examples_uiform: "./tst_examples_uiform", + // eslint-disable-next-line camelcase + tst_examples_uitable: "./tst_examples_uitable", + another: "./another" + }, + output: { + pathinfo: "verbose", + filename: "[name].js" + }, + target: "web", + optimization: { + sideEffects: true, + concatenateModules: true, + splitChunks: { + cacheGroups: { + vendors: { + chunks: "all", + test: /vendors/, + enforce: true, + name: "vendors" + } + } + } + } +}; diff --git a/test/configCases/side-effects/side-effects-override/webpack.config.js b/test/configCases/side-effects/side-effects-override/webpack.config.js index 789ad53cf39..8270d622097 100644 --- a/test/configCases/side-effects/side-effects-override/webpack.config.js +++ b/test/configCases/side-effects/side-effects-override/webpack.config.js @@ -1,4 +1,5 @@ const path = require("path"); +/** @type {import("../../../../").Configuration} */ module.exports = { mode: "production", module: { diff --git a/test/configCases/side-effects/side-effects-unsorted-modules/index.js b/test/configCases/side-effects/side-effects-unsorted-modules/index.js new file mode 100644 index 00000000000..b1a42ca2737 --- /dev/null +++ b/test/configCases/side-effects/side-effects-unsorted-modules/index.js @@ -0,0 +1,9 @@ +import { b } from "dep"; + +b.c(); + +import { modules } from "dep/trackModules.js"; + +it("should not contain side-effect-free modules", () => { + expect(modules).toEqual(["c"]); +}); diff --git a/test/configCases/side-effects/side-effects-unsorted-modules/node_modules/dep/a.js b/test/configCases/side-effects/side-effects-unsorted-modules/node_modules/dep/a.js new file mode 100644 index 00000000000..dbcb9480348 --- /dev/null +++ b/test/configCases/side-effects/side-effects-unsorted-modules/node_modules/dep/a.js @@ -0,0 +1,3 @@ +import { track } from "./trackModules.js"; +track("a"); +export * as b from "./b.js"; diff --git a/test/configCases/side-effects/side-effects-unsorted-modules/node_modules/dep/b.js b/test/configCases/side-effects/side-effects-unsorted-modules/node_modules/dep/b.js new file mode 100644 index 00000000000..4f79dddc406 --- /dev/null +++ b/test/configCases/side-effects/side-effects-unsorted-modules/node_modules/dep/b.js @@ -0,0 +1,3 @@ +import { track } from "./trackModules.js"; +track("b"); +export * from "./c.js"; diff --git a/test/configCases/side-effects/side-effects-unsorted-modules/node_modules/dep/c.js b/test/configCases/side-effects/side-effects-unsorted-modules/node_modules/dep/c.js new file mode 100644 index 00000000000..48e53b3520f --- /dev/null +++ b/test/configCases/side-effects/side-effects-unsorted-modules/node_modules/dep/c.js @@ -0,0 +1,3 @@ +import { track } from "./trackModules.js"; +track("c"); +export function c() {} diff --git a/test/configCases/side-effects/side-effects-unsorted-modules/node_modules/dep/index.js b/test/configCases/side-effects/side-effects-unsorted-modules/node_modules/dep/index.js new file mode 100644 index 00000000000..bec05fc5011 --- /dev/null +++ b/test/configCases/side-effects/side-effects-unsorted-modules/node_modules/dep/index.js @@ -0,0 +1,3 @@ +import { track } from "./trackModules.js"; +track("index"); +export * from "./a.js" diff --git a/test/configCases/side-effects/side-effects-unsorted-modules/node_modules/dep/package.json b/test/configCases/side-effects/side-effects-unsorted-modules/node_modules/dep/package.json new file mode 100644 index 00000000000..644d902d8e0 --- /dev/null +++ b/test/configCases/side-effects/side-effects-unsorted-modules/node_modules/dep/package.json @@ -0,0 +1,6 @@ +{ + "name": "dep", + "version": "1.0.0", + "type": "module", + "sideEffects": false +} diff --git a/test/configCases/side-effects/side-effects-unsorted-modules/node_modules/dep/trackModules.js b/test/configCases/side-effects/side-effects-unsorted-modules/node_modules/dep/trackModules.js new file mode 100644 index 00000000000..99f5f10b0ca --- /dev/null +++ b/test/configCases/side-effects/side-effects-unsorted-modules/node_modules/dep/trackModules.js @@ -0,0 +1,4 @@ +export const modules = []; +export function track(name) { + modules.push(name); +} diff --git a/test/configCases/side-effects/side-effects-unsorted-modules/webpack.config.js b/test/configCases/side-effects/side-effects-unsorted-modules/webpack.config.js new file mode 100644 index 00000000000..954cbe9dc67 --- /dev/null +++ b/test/configCases/side-effects/side-effects-unsorted-modules/webpack.config.js @@ -0,0 +1,28 @@ +/** @typedef {import("../../../../").Compiler} Compiler */ +/** @typedef {import("../../../../").NormalModule} NormalModule */ + +class ReorderModulesPlugin { + constructor() {} + + /** + * @param {Compiler} compiler compiler + */ + apply(compiler) { + compiler.hooks.compilation.tap("ReorderModulesPlugin", compilation => { + compilation.hooks.seal.tap("ReorderModulesPlugin", () => { + const sortedModules = Array.from(compilation.modules).sort((a, _b) => + /** @type {NormalModule} */ + (a).request.includes("b.js") ? -1 : 1 + ); + compilation.modules = new Set(sortedModules); + }); + }); + } +} + +module.exports = { + plugins: [new ReorderModulesPlugin()], + optimization: { + sideEffects: true + } +}; diff --git a/test/configCases/side-effects/side-effects-values/webpack.config.js b/test/configCases/side-effects/side-effects-values/webpack.config.js index c5fce2d1bf2..5e498c66907 100644 --- a/test/configCases/side-effects/side-effects-values/webpack.config.js +++ b/test/configCases/side-effects/side-effects-values/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { mode: "production", module: { diff --git a/test/configCases/side-effects/type-reexports/a.js b/test/configCases/side-effects/type-reexports/a.js new file mode 100644 index 00000000000..9233cce2f0e --- /dev/null +++ b/test/configCases/side-effects/type-reexports/a.js @@ -0,0 +1 @@ +export const a = "a"; diff --git a/test/configCases/side-effects/type-reexports/b.js b/test/configCases/side-effects/type-reexports/b.js new file mode 100644 index 00000000000..59d1689930e --- /dev/null +++ b/test/configCases/side-effects/type-reexports/b.js @@ -0,0 +1 @@ +export const b = "b"; diff --git a/test/configCases/side-effects/type-reexports/empty.js b/test/configCases/side-effects/type-reexports/empty.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/side-effects/type-reexports/index.js b/test/configCases/side-effects/type-reexports/index.js new file mode 100644 index 00000000000..a42effb0688 --- /dev/null +++ b/test/configCases/side-effects/type-reexports/index.js @@ -0,0 +1,14 @@ +import { a, b } from "./module"; +import * as empty from "./empty"; + +it("should skip over module", () => { + empty.a = "not a"; + empty.b = "not b"; + expect(a).toBe("a"); + expect(b).toBe("b"); + expect(__STATS__.children.length).toBe(2); + for (const stats of __STATS__.children) { + const module = stats.modules.find(m => m.name.endsWith("module.js")); + expect(module).toHaveProperty("orphan", true); + } +}); diff --git a/test/configCases/side-effects/type-reexports/module.js b/test/configCases/side-effects/type-reexports/module.js new file mode 100644 index 00000000000..c76908f40fc --- /dev/null +++ b/test/configCases/side-effects/type-reexports/module.js @@ -0,0 +1,3 @@ +export * from "./a"; +export * from "./empty"; +export * from "./b"; diff --git a/test/configCases/side-effects/type-reexports/webpack.config.js b/test/configCases/side-effects/type-reexports/webpack.config.js new file mode 100644 index 00000000000..8769da51a0d --- /dev/null +++ b/test/configCases/side-effects/type-reexports/webpack.config.js @@ -0,0 +1,22 @@ +module.exports = [ + { + output: { + pathinfo: "verbose" + }, + optimization: { + concatenateModules: true, + sideEffects: true, + usedExports: true + } + }, + { + output: { + pathinfo: "verbose" + }, + optimization: { + concatenateModules: false, + sideEffects: true, + usedExports: true + } + } +]; diff --git a/test/configCases/side-effects/url/file.png b/test/configCases/side-effects/url/file.png new file mode 100644 index 00000000000..fb53b9dedd3 Binary files /dev/null and b/test/configCases/side-effects/url/file.png differ diff --git a/test/configCases/side-effects/url/index.js b/test/configCases/side-effects/url/index.js new file mode 100644 index 00000000000..56c0b0522d3 --- /dev/null +++ b/test/configCases/side-effects/url/index.js @@ -0,0 +1,31 @@ +import { used } from "./module"; + +it("should not include unused assets", () => { + expect(used.href).toMatch(/png/); + expect(__STATS__.modules.find(m => m.name.includes("file.png?used"))).toEqual( + expect.objectContaining({ + orphan: false + }) + ); + expect( + __STATS__.modules.find(m => m.name.includes("file.png?default")) + ).toEqual( + expect.objectContaining({ + orphan: true + }) + ); + expect( + __STATS__.modules.find(m => m.name.includes("file.png?named")) + ).toEqual( + expect.objectContaining({ + orphan: true + }) + ); + expect( + __STATS__.modules.find(m => m.name.includes("file.png?indirect")) + ).toEqual( + expect.objectContaining({ + orphan: true + }) + ); +}); diff --git a/test/configCases/side-effects/url/module.js b/test/configCases/side-effects/url/module.js new file mode 100644 index 00000000000..c16525a2e3c --- /dev/null +++ b/test/configCases/side-effects/url/module.js @@ -0,0 +1,8 @@ +export default new URL("file.png?default", import.meta.url); +export const named = new URL("file.png?named", import.meta.url); +export const indirect = fn; +export const used = new URL("file.png?used", import.meta.url); + +function fn() { + return new URL("file.png?indirect", import.meta.url); +} diff --git a/test/configCases/side-effects/url/webpack.config.js b/test/configCases/side-effects/url/webpack.config.js new file mode 100644 index 00000000000..492d1b5903c --- /dev/null +++ b/test/configCases/side-effects/url/webpack.config.js @@ -0,0 +1,7 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + sideEffects: true, + innerGraph: true + } +}; diff --git a/test/configCases/simple/empty-config/webpack.config.js b/test/configCases/simple/empty-config/webpack.config.js index f053ebf7976..3583b70a321 100644 --- a/test/configCases/simple/empty-config/webpack.config.js +++ b/test/configCases/simple/empty-config/webpack.config.js @@ -1 +1,2 @@ +/** @type {import("../../../../").Configuration} */ module.exports = {}; diff --git a/test/configCases/simple/multi-compiler-functions-export/webpack.config.js b/test/configCases/simple/multi-compiler-functions-export/webpack.config.js index 5f250c4ac57..129f52d0423 100644 --- a/test/configCases/simple/multi-compiler-functions-export/webpack.config.js +++ b/test/configCases/simple/multi-compiler-functions-export/webpack.config.js @@ -1,5 +1,5 @@ -exports.default = [ - function() { +module.exports.default = [ + function () { return {}; } ]; diff --git a/test/configCases/simple/multi-compiler-functions/webpack.config.js b/test/configCases/simple/multi-compiler-functions/webpack.config.js index 6bd31ab78ca..4a405a8b227 100644 --- a/test/configCases/simple/multi-compiler-functions/webpack.config.js +++ b/test/configCases/simple/multi-compiler-functions/webpack.config.js @@ -1,5 +1,6 @@ +/** @type {import("../../../../").Configuration[]} */ module.exports = [ - function() { + function () { return {}; } ]; diff --git a/test/configCases/simple/multi-compiler/webpack.config.js b/test/configCases/simple/multi-compiler/webpack.config.js index c5578074bb3..a309ecd2e6e 100644 --- a/test/configCases/simple/multi-compiler/webpack.config.js +++ b/test/configCases/simple/multi-compiler/webpack.config.js @@ -1 +1,2 @@ +/** @type {import("../../../../").Configuration[]} */ module.exports = [{}]; diff --git a/test/configCases/source-map/array-as-output-library-in-object-output/webpack.config.js b/test/configCases/source-map/array-as-output-library-in-object-output/webpack.config.js index d9c8900e51f..5adb84b3236 100644 --- a/test/configCases/source-map/array-as-output-library-in-object-output/webpack.config.js +++ b/test/configCases/source-map/array-as-output-library-in-object-output/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { devtool: "source-map", output: { diff --git a/test/configCases/source-map/array-as-output-library/webpack.config.js b/test/configCases/source-map/array-as-output-library/webpack.config.js index ee3cbe39bbf..81087b112d1 100644 --- a/test/configCases/source-map/array-as-output-library/webpack.config.js +++ b/test/configCases/source-map/array-as-output-library/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { devtool: "source-map", output: { diff --git a/test/configCases/source-map/context-module-source-path/foo/a.js b/test/configCases/source-map/context-module-source-path/foo/a.js new file mode 100644 index 00000000000..6cd1d0075d4 --- /dev/null +++ b/test/configCases/source-map/context-module-source-path/foo/a.js @@ -0,0 +1 @@ +module.exports = "a"; diff --git a/test/configCases/source-map/context-module-source-path/foo/b.js b/test/configCases/source-map/context-module-source-path/foo/b.js new file mode 100644 index 00000000000..dfbbeb621fa --- /dev/null +++ b/test/configCases/source-map/context-module-source-path/foo/b.js @@ -0,0 +1 @@ +module.exports = "b"; diff --git a/test/configCases/source-map/context-module-source-path/index.js b/test/configCases/source-map/context-module-source-path/index.js new file mode 100644 index 00000000000..f97c91a9fcf --- /dev/null +++ b/test/configCases/source-map/context-module-source-path/index.js @@ -0,0 +1,9 @@ +const foo = Math.random() > 0.5 ? "a" : "b"; +require(`./foo/${foo}.js`); + +it("context module should use relative path in source map file", () => { + var fs = require("fs"); + var source = fs.readFileSync(__filename + ".map", "utf-8"); + var map = JSON.parse(source); + expect(map.sources).toContain("webpack:///./foo/ sync ^\\.\\/.*\\.js$"); +}); diff --git a/test/configCases/source-map/context-module-source-path/webpack.config.js b/test/configCases/source-map/context-module-source-path/webpack.config.js new file mode 100644 index 00000000000..9f32ea2927b --- /dev/null +++ b/test/configCases/source-map/context-module-source-path/webpack.config.js @@ -0,0 +1,7 @@ +module.exports = { + node: { + __dirname: false, + __filename: false + }, + devtool: "source-map" +}; diff --git a/test/configCases/source-map/default-filename-extensions-css/webpack.config.js b/test/configCases/source-map/default-filename-extensions-css/webpack.config.js index 1b969d38d1f..ae476c291fa 100644 --- a/test/configCases/source-map/default-filename-extensions-css/webpack.config.js +++ b/test/configCases/source-map/default-filename-extensions-css/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { mode: "development", output: { diff --git a/test/configCases/source-map/default-filename-extensions-js/webpack.config.js b/test/configCases/source-map/default-filename-extensions-js/webpack.config.js index 597a81501f0..63d1ba55ad0 100644 --- a/test/configCases/source-map/default-filename-extensions-js/webpack.config.js +++ b/test/configCases/source-map/default-filename-extensions-js/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { mode: "development", output: { diff --git a/test/configCases/source-map/default-filename-extensions-mjs/webpack.config.js b/test/configCases/source-map/default-filename-extensions-mjs/webpack.config.js index 9f5b271c0bd..a4ea707130a 100644 --- a/test/configCases/source-map/default-filename-extensions-mjs/webpack.config.js +++ b/test/configCases/source-map/default-filename-extensions-mjs/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { mode: "development", output: { diff --git a/test/configCases/source-map/devtool-namespace-with-eval-source-map/src/entry-a.js b/test/configCases/source-map/devtool-namespace-with-eval-source-map/src/entry-a.js new file mode 100644 index 00000000000..38fc7ef515a --- /dev/null +++ b/test/configCases/source-map/devtool-namespace-with-eval-source-map/src/entry-a.js @@ -0,0 +1,5 @@ +it("should include webpack://library-entry-a/./src/entry-a.js in SourceMap", function() { + const fs = require("fs"); + const source = fs.readFileSync(__filename, "utf-8"); + expect(source).toContain("sourceURL=webpack://library-entry-a/./src/entry-a.js"); +}); diff --git a/test/configCases/source-map/devtool-namespace-with-eval-source-map/src/entry-b.js b/test/configCases/source-map/devtool-namespace-with-eval-source-map/src/entry-b.js new file mode 100644 index 00000000000..a35a615aa0e --- /dev/null +++ b/test/configCases/source-map/devtool-namespace-with-eval-source-map/src/entry-b.js @@ -0,0 +1,5 @@ +it("should include webpack://library-entry-b/./src/entry-b.js in SourceMap", function() { + const fs = require("fs"); + const source = fs.readFileSync(__filename, "utf-8"); + expect(source).toContain("sourceURL=webpack://library-entry-b/./src/entry-b.js"); +}); diff --git a/test/configCases/source-map/devtool-namespace-with-eval-source-map/test.config.js b/test/configCases/source-map/devtool-namespace-with-eval-source-map/test.config.js new file mode 100644 index 00000000000..a773bb4ebed --- /dev/null +++ b/test/configCases/source-map/devtool-namespace-with-eval-source-map/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["entry-a-bundle.js", "entry-b-bundle.js"]; + } +}; diff --git a/test/configCases/source-map/devtool-namespace-with-eval-source-map/webpack.config.js b/test/configCases/source-map/devtool-namespace-with-eval-source-map/webpack.config.js new file mode 100644 index 00000000000..0b114a6251f --- /dev/null +++ b/test/configCases/source-map/devtool-namespace-with-eval-source-map/webpack.config.js @@ -0,0 +1,18 @@ +const path = require("path"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + entry: { + "entry-a": [path.join(__dirname, "./src/entry-a")], + "entry-b": [path.join(__dirname, "./src/entry-b")] + }, + + output: { + filename: "[name]-bundle.js", + library: "library-[name]", + libraryTarget: "commonjs", + devtoolNamespace: "library-[name]" + }, + devtool: "eval-source-map" +}; diff --git a/test/configCases/source-map/devtool-namespace-with-eval/src/entry-a.js b/test/configCases/source-map/devtool-namespace-with-eval/src/entry-a.js new file mode 100644 index 00000000000..38fc7ef515a --- /dev/null +++ b/test/configCases/source-map/devtool-namespace-with-eval/src/entry-a.js @@ -0,0 +1,5 @@ +it("should include webpack://library-entry-a/./src/entry-a.js in SourceMap", function() { + const fs = require("fs"); + const source = fs.readFileSync(__filename, "utf-8"); + expect(source).toContain("sourceURL=webpack://library-entry-a/./src/entry-a.js"); +}); diff --git a/test/configCases/source-map/devtool-namespace-with-eval/src/entry-b.js b/test/configCases/source-map/devtool-namespace-with-eval/src/entry-b.js new file mode 100644 index 00000000000..a35a615aa0e --- /dev/null +++ b/test/configCases/source-map/devtool-namespace-with-eval/src/entry-b.js @@ -0,0 +1,5 @@ +it("should include webpack://library-entry-b/./src/entry-b.js in SourceMap", function() { + const fs = require("fs"); + const source = fs.readFileSync(__filename, "utf-8"); + expect(source).toContain("sourceURL=webpack://library-entry-b/./src/entry-b.js"); +}); diff --git a/test/configCases/source-map/devtool-namespace-with-eval/test.config.js b/test/configCases/source-map/devtool-namespace-with-eval/test.config.js new file mode 100644 index 00000000000..a773bb4ebed --- /dev/null +++ b/test/configCases/source-map/devtool-namespace-with-eval/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["entry-a-bundle.js", "entry-b-bundle.js"]; + } +}; diff --git a/test/configCases/source-map/devtool-namespace-with-eval/webpack.config.js b/test/configCases/source-map/devtool-namespace-with-eval/webpack.config.js new file mode 100644 index 00000000000..3f7c69737eb --- /dev/null +++ b/test/configCases/source-map/devtool-namespace-with-eval/webpack.config.js @@ -0,0 +1,18 @@ +const path = require("path"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + entry: { + "entry-a": [path.join(__dirname, "./src/entry-a")], + "entry-b": [path.join(__dirname, "./src/entry-b")] + }, + + output: { + filename: "[name]-bundle.js", + library: "library-[name]", + libraryTarget: "commonjs", + devtoolNamespace: "library-[name]" + }, + devtool: "eval" +}; diff --git a/test/configCases/source-map/devtool-namespace-with-source-map/index.js b/test/configCases/source-map/devtool-namespace-with-source-map/index.js new file mode 100644 index 00000000000..2eb06b2d38d --- /dev/null +++ b/test/configCases/source-map/devtool-namespace-with-source-map/index.js @@ -0,0 +1,6 @@ +it("should include webpack://library-entry-a/./src/entry-a.js in SourceMap", function() { + var fs = require("fs"); + var source = fs.readFileSync(__filename + ".map", "utf-8"); + var map = JSON.parse(source); + expect(map.sources).toContain("sourceURL=webpack://library-entry-a/./src/entry-a.js"); +}); diff --git a/test/configCases/source-map/devtool-namespace-with-source-map/src/entry-a.js b/test/configCases/source-map/devtool-namespace-with-source-map/src/entry-a.js new file mode 100644 index 00000000000..37fd80b001d --- /dev/null +++ b/test/configCases/source-map/devtool-namespace-with-source-map/src/entry-a.js @@ -0,0 +1,6 @@ +it("should include webpack://library-entry-a/./src/entry-a.js in SourceMap", function() { + const fs = require("fs"); + const source = fs.readFileSync(__filename + ".map", "utf-8"); + const map = JSON.parse(source); + expect(map.sources).toContain("webpack://library-entry-a/./src/entry-a.js"); +}); diff --git a/test/configCases/source-map/devtool-namespace-with-source-map/src/entry-b.js b/test/configCases/source-map/devtool-namespace-with-source-map/src/entry-b.js new file mode 100644 index 00000000000..7c0d0b8b2ee --- /dev/null +++ b/test/configCases/source-map/devtool-namespace-with-source-map/src/entry-b.js @@ -0,0 +1,6 @@ +it("should include webpack://library-entry-b/./src/entry-b.js in SourceMap", function() { + const fs = require("fs"); + const source = fs.readFileSync(__filename + ".map", "utf-8"); + const map = JSON.parse(source); + expect(map.sources).toContain("webpack://library-entry-b/./src/entry-b.js"); +}); diff --git a/test/configCases/source-map/devtool-namespace-with-source-map/test.config.js b/test/configCases/source-map/devtool-namespace-with-source-map/test.config.js new file mode 100644 index 00000000000..a773bb4ebed --- /dev/null +++ b/test/configCases/source-map/devtool-namespace-with-source-map/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["entry-a-bundle.js", "entry-b-bundle.js"]; + } +}; diff --git a/test/configCases/source-map/devtool-namespace-with-source-map/webpack.config.js b/test/configCases/source-map/devtool-namespace-with-source-map/webpack.config.js new file mode 100644 index 00000000000..c237cc22379 --- /dev/null +++ b/test/configCases/source-map/devtool-namespace-with-source-map/webpack.config.js @@ -0,0 +1,18 @@ +const path = require("path"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + entry: { + "entry-a": [path.join(__dirname, "./src/entry-a")], + "entry-b": [path.join(__dirname, "./src/entry-b")] + }, + + output: { + filename: "[name]-bundle.js", + library: "library-[name]", + libraryTarget: "commonjs", + devtoolNamespace: "library-[name]" + }, + devtool: "source-map" +}; diff --git a/test/configCases/source-map/eval-nosources-source-map/index.js b/test/configCases/source-map/eval-nosources-source-map/index.js new file mode 100644 index 00000000000..288699bbbd7 --- /dev/null +++ b/test/configCases/source-map/eval-nosources-source-map/index.js @@ -0,0 +1,11 @@ +it("should not include sourcesContent if noSources option is used", function() { + var fs = require("fs"); + var source = fs.readFileSync(__filename, "utf-8"); + var match = /\/\/# sourceMappingURL\s*=\s*data:application\/json;charset=utf-8;base64,(.*)\\n\/\/#/.exec(source); + var mapString = Buffer.from(match[1], 'base64').toString('utf-8'); + var map = JSON.parse(mapString); + expect(map).not.toHaveProperty("sourcesContent"); + expect(/\.js(\?.+)?$/.test(map.file)).toBe(true); +}); + +if (Math.random() < 0) require("./test.js"); diff --git a/test/configCases/source-map/eval-nosources-source-map/index.ts b/test/configCases/source-map/eval-nosources-source-map/index.ts new file mode 100644 index 00000000000..5178739ea8d --- /dev/null +++ b/test/configCases/source-map/eval-nosources-source-map/index.ts @@ -0,0 +1,11 @@ +it("should not include sourcesContent if noSources option is used", function() { + var fs = require("fs"); + var source = fs.readFileSync(__filename, "utf-8"); + var match = /\/\/# sourceMappingURL\s*=\s*data:application\/json;charset=utf-8;base64,(.*)\\n\/\/#/.exec(source); + var mapString = Buffer.from(match[1], 'base64').toString('utf-8'); + var map = JSON.parse(mapString); + expect(map).not.toHaveProperty("sourcesContent"); + expect(/\.ts(\?.+)?$/.test(map.file)).toBe(true); +}); + +if (Math.random() < 0) require("./test.js"); diff --git a/test/configCases/source-map/eval-nosources-source-map/node_modules/pkg/index.js b/test/configCases/source-map/eval-nosources-source-map/node_modules/pkg/index.js new file mode 100644 index 00000000000..d171d00eb94 --- /dev/null +++ b/test/configCases/source-map/eval-nosources-source-map/node_modules/pkg/index.js @@ -0,0 +1 @@ +import "../../index.js"; diff --git a/test/configCases/source-map/eval-nosources-source-map/test.filter.js b/test/configCases/source-map/eval-nosources-source-map/test.filter.js new file mode 100644 index 00000000000..846093ba9cf --- /dev/null +++ b/test/configCases/source-map/eval-nosources-source-map/test.filter.js @@ -0,0 +1,5 @@ +const supportsOptionalChaining = require("../../../helpers/supportsOptionalChaining"); + +module.exports = function (config) { + return supportsOptionalChaining(); +}; diff --git a/test/configCases/source-map/eval-nosources-source-map/test.js b/test/configCases/source-map/eval-nosources-source-map/test.js new file mode 100644 index 00000000000..c9d8865844b --- /dev/null +++ b/test/configCases/source-map/eval-nosources-source-map/test.js @@ -0,0 +1,3 @@ +var foo = {}; + +module.exports = foo; diff --git a/test/configCases/source-map/eval-nosources-source-map/webpack.config.js b/test/configCases/source-map/eval-nosources-source-map/webpack.config.js new file mode 100644 index 00000000000..3319debc4f8 --- /dev/null +++ b/test/configCases/source-map/eval-nosources-source-map/webpack.config.js @@ -0,0 +1,83 @@ +const devtool = "eval-nosources-source-map"; + +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + devtool + }, + { + devtool, + optimization: { + moduleIds: "natural" + } + }, + { + devtool, + optimization: { + moduleIds: "named" + } + }, + { + devtool, + optimization: { + moduleIds: "deterministic" + } + }, + { + devtool, + optimization: { + moduleIds: "size" + } + }, + { + entry: "./index?foo=bar", + devtool, + optimization: { + moduleIds: "named" + } + }, + { + entry: "./index.js?foo=bar", + devtool, + optimization: { + moduleIds: "named" + } + }, + { + entry: "alias", + devtool, + optimization: { + moduleIds: "named" + }, + resolve: { + alias: { + alias: "./index?foo=bar" + } + } + }, + { + entry: "pkg", + devtool, + optimization: { + moduleIds: "named" + } + }, + { + entry: "./index.ts?foo=bar", + devtool, + optimization: { + moduleIds: "named" + }, + module: { + rules: [ + { + test: /\.ts$/, + loader: "ts-loader", + options: { + transpileOnly: true + } + } + ] + } + } +]; diff --git a/test/configCases/source-map/eval-source-map-debugids/index.js b/test/configCases/source-map/eval-source-map-debugids/index.js new file mode 100644 index 00000000000..20fddcd310b --- /dev/null +++ b/test/configCases/source-map/eval-source-map-debugids/index.js @@ -0,0 +1,16 @@ +const fs = require("fs"); + +it("should not include sourcesContent if noSources option is used", function() { + const source = fs.readFileSync(__filename, "utf-8"); + const match = /\/\/# sourceMappingURL\s*=\s*data:application\/json;charset=utf-8;base64,(.*)\\n\/\/#/.exec(source); + const mapString = Buffer.from(match[1], 'base64').toString('utf-8'); + const map = JSON.parse(mapString); + expect(map).toHaveProperty("sourcesContent"); + expect(map).toHaveProperty("debugId"); + expect( + /[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/i.test(map.debugId) + ).toBe(true); + expect(/\.js(\?.+)?$/.test(map.file)).toBe(true); +}); + +if (Math.random() < 0) require("./test.js"); diff --git a/test/configCases/source-map/eval-source-map-debugids/test.js b/test/configCases/source-map/eval-source-map-debugids/test.js new file mode 100644 index 00000000000..c9d8865844b --- /dev/null +++ b/test/configCases/source-map/eval-source-map-debugids/test.js @@ -0,0 +1,3 @@ +var foo = {}; + +module.exports = foo; diff --git a/test/configCases/source-map/eval-source-map-debugids/webpack.config.js b/test/configCases/source-map/eval-source-map-debugids/webpack.config.js new file mode 100644 index 00000000000..46e027864f2 --- /dev/null +++ b/test/configCases/source-map/eval-source-map-debugids/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + devtool: "eval-source-map-debugids" +}; diff --git a/test/configCases/source-map/eval-source-map/index.js b/test/configCases/source-map/eval-source-map/index.js new file mode 100644 index 00000000000..13b57720b66 --- /dev/null +++ b/test/configCases/source-map/eval-source-map/index.js @@ -0,0 +1,11 @@ +it("should not include sourcesContent if noSources option is used", function() { + var fs = require("fs"); + var source = fs.readFileSync(__filename, "utf-8"); + var match = /\/\/# sourceMappingURL\s*=\s*data:application\/json;charset=utf-8;base64,(.*)\\n\/\/#/.exec(source); + var mapString = Buffer.from(match[1], 'base64').toString('utf-8'); + var map = JSON.parse(mapString); + expect(map).toHaveProperty("sourcesContent"); + expect(/\.js(\?.+)?$/.test(map.file)).toBe(true); +}); + +if (Math.random() < 0) require("./test.js"); diff --git a/test/configCases/source-map/eval-source-map/index.ts b/test/configCases/source-map/eval-source-map/index.ts new file mode 100644 index 00000000000..bae246dd86c --- /dev/null +++ b/test/configCases/source-map/eval-source-map/index.ts @@ -0,0 +1,11 @@ +it("should not include sourcesContent if noSources option is used", function() { + var fs = require("fs"); + var source = fs.readFileSync(__filename, "utf-8"); + var match = /\/\/# sourceMappingURL\s*=\s*data:application\/json;charset=utf-8;base64,(.*)\\n\/\/#/.exec(source); + var mapString = Buffer.from(match[1], 'base64').toString('utf-8'); + var map = JSON.parse(mapString); + expect(map).toHaveProperty("sourcesContent"); + expect(/\.ts(\?.+)?$/.test(map.file)).toBe(true); +}); + +if (Math.random() < 0) require("./test.js"); diff --git a/test/configCases/source-map/eval-source-map/node_modules/pkg/index.js b/test/configCases/source-map/eval-source-map/node_modules/pkg/index.js new file mode 100644 index 00000000000..d171d00eb94 --- /dev/null +++ b/test/configCases/source-map/eval-source-map/node_modules/pkg/index.js @@ -0,0 +1 @@ +import "../../index.js"; diff --git a/test/configCases/source-map/eval-source-map/test.filter.js b/test/configCases/source-map/eval-source-map/test.filter.js new file mode 100644 index 00000000000..846093ba9cf --- /dev/null +++ b/test/configCases/source-map/eval-source-map/test.filter.js @@ -0,0 +1,5 @@ +const supportsOptionalChaining = require("../../../helpers/supportsOptionalChaining"); + +module.exports = function (config) { + return supportsOptionalChaining(); +}; diff --git a/test/configCases/source-map/eval-source-map/test.js b/test/configCases/source-map/eval-source-map/test.js new file mode 100644 index 00000000000..c9d8865844b --- /dev/null +++ b/test/configCases/source-map/eval-source-map/test.js @@ -0,0 +1,3 @@ +var foo = {}; + +module.exports = foo; diff --git a/test/configCases/source-map/eval-source-map/webpack.config.js b/test/configCases/source-map/eval-source-map/webpack.config.js new file mode 100644 index 00000000000..44225d67bb2 --- /dev/null +++ b/test/configCases/source-map/eval-source-map/webpack.config.js @@ -0,0 +1,83 @@ +const devtool = "eval-source-map"; + +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + devtool + }, + { + devtool, + optimization: { + moduleIds: "natural" + } + }, + { + devtool, + optimization: { + moduleIds: "named" + } + }, + { + devtool, + optimization: { + moduleIds: "deterministic" + } + }, + { + devtool, + optimization: { + moduleIds: "size" + } + }, + { + entry: "./index?foo=bar", + devtool, + optimization: { + moduleIds: "named" + } + }, + { + entry: "./index.js?foo=bar", + devtool, + optimization: { + moduleIds: "named" + } + }, + { + entry: "alias", + devtool, + optimization: { + moduleIds: "named" + }, + resolve: { + alias: { + alias: "./index?foo=bar" + } + } + }, + { + entry: "pkg", + devtool, + optimization: { + moduleIds: "named" + } + }, + { + entry: "./index.ts?foo=bar", + devtool, + optimization: { + moduleIds: "named" + }, + module: { + rules: [ + { + test: /\.ts$/, + loader: "ts-loader", + options: { + transpileOnly: true + } + } + ] + } + } +]; diff --git a/test/configCases/source-map/exclude-chunks-source-map/index.js b/test/configCases/source-map/exclude-chunks-source-map/index.js index 810a47f9fdb..f08b4dd69b9 100644 --- a/test/configCases/source-map/exclude-chunks-source-map/index.js +++ b/test/configCases/source-map/exclude-chunks-source-map/index.js @@ -7,9 +7,9 @@ it("should include test.js in SourceMap for bundle0 chunk", function() { it("should not produce a SourceMap for vendors chunk", function() { var fs = require("fs"), - path = require("path"), - assert = require("assert"); + path = require("path"), + assert = require("assert"); expect(fs.existsSync(path.join(__dirname, "vendors.js.map"))).toBe(false); }); -require.include("./test.js"); +if (Math.random() < 0) require("./test.js"); diff --git a/test/configCases/source-map/exclude-chunks-source-map/webpack.config.js b/test/configCases/source-map/exclude-chunks-source-map/webpack.config.js index 3e69a12fe1f..ac7fa12769c 100644 --- a/test/configCases/source-map/exclude-chunks-source-map/webpack.config.js +++ b/test/configCases/source-map/exclude-chunks-source-map/webpack.config.js @@ -1,4 +1,6 @@ -var webpack = require("../../../../"); +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ module.exports = { mode: "development", devtool: false, diff --git a/test/configCases/source-map/exclude-modules-source-map/webpack.config.js b/test/configCases/source-map/exclude-modules-source-map/webpack.config.js index 028743e5cf6..0dfd27f9f49 100644 --- a/test/configCases/source-map/exclude-modules-source-map/webpack.config.js +++ b/test/configCases/source-map/exclude-modules-source-map/webpack.config.js @@ -1,4 +1,6 @@ -var webpack = require("../../../../"); +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ module.exports = { node: { __dirname: false, diff --git a/test/configCases/devtools/harmony-eval-source-map/index.js b/test/configCases/source-map/harmony-eval-source-map/index.js similarity index 100% rename from test/configCases/devtools/harmony-eval-source-map/index.js rename to test/configCases/source-map/harmony-eval-source-map/index.js diff --git a/test/configCases/source-map/harmony-eval-source-map/webpack.config.js b/test/configCases/source-map/harmony-eval-source-map/webpack.config.js new file mode 100644 index 00000000000..568d999d5b6 --- /dev/null +++ b/test/configCases/source-map/harmony-eval-source-map/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + devtool: "eval-source-map" +}; diff --git a/test/configCases/devtools/harmony-eval/index.js b/test/configCases/source-map/harmony-eval/index.js similarity index 100% rename from test/configCases/devtools/harmony-eval/index.js rename to test/configCases/source-map/harmony-eval/index.js diff --git a/test/configCases/source-map/harmony-eval/webpack.config.js b/test/configCases/source-map/harmony-eval/webpack.config.js new file mode 100644 index 00000000000..4b28913b108 --- /dev/null +++ b/test/configCases/source-map/harmony-eval/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + devtool: "eval" +}; diff --git a/test/configCases/source-map/line-to-line/index.js b/test/configCases/source-map/line-to-line/index.js deleted file mode 100644 index 23a95f012f7..00000000000 --- a/test/configCases/source-map/line-to-line/index.js +++ /dev/null @@ -1,8 +0,0 @@ -it("should include test.js in SourceMap", function() { - var fs = require("fs"); - var source = fs.readFileSync(__filename + ".map", "utf-8"); - var map = JSON.parse(source); - expect(map.sources).toContain("webpack:///./test.js"); -}); - -require.include("./test.js"); diff --git a/test/configCases/source-map/line-to-line/webpack.config.js b/test/configCases/source-map/line-to-line/webpack.config.js deleted file mode 100644 index b8b90b9a9aa..00000000000 --- a/test/configCases/source-map/line-to-line/webpack.config.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = { - mode: "development", - output: { - devtoolLineToLine: true - }, - node: { - __dirname: false, - __filename: false - }, - devtool: "cheap-source-map" -}; diff --git a/test/configCases/source-map/module-names/index.js b/test/configCases/source-map/module-names/index.js index f1c338c721e..9bce8ae0465 100644 --- a/test/configCases/source-map/module-names/index.js +++ b/test/configCases/source-map/module-names/index.js @@ -5,17 +5,27 @@ function getSourceMap(filename) { return map; } -it("should include test.js in SourceMap", function() { +it("should include test.js in SourceMap", function () { + var allSources = new Set(); var map = getSourceMap("bundle0.js"); - expect(map.sources).toContain("module"); - expect(map.sources).toContain("fallback"); - expect(map.sources).toContain("fallback**"); + for (var source of map.sources) allSources.add(source); map = getSourceMap("chunk-a.js"); - expect(map.sources).toContain("fallback*"); + for (var source of map.sources) allSources.add(source); map = getSourceMap("chunk-b.js"); - expect(map.sources).toContain("fallback*"); - expect(map.sources).toContain("fallback***"); + for (var source of map.sources) allSources.add(source); + expect(allSources).toContain("module"); + allSources.delete("module"); + expect(allSources).toContain("fallback"); + for (const source of allSources) { + expect(source).toMatch(/^fallback\**$/); + } }); -require.ensure(["./test.js"], function(require) {}, "chunk-a"); -require.ensure(["./test.js", "./test.js?1"], function(require) {}, "chunk-b"); +if (Math.random() < 0) { + require.ensure(["./test.js"], function (require) {}, "chunk-a"); + require.ensure( + ["./test.js", "./test.js?1"], + function (require) {}, + "chunk-b" + ); +} diff --git a/test/configCases/source-map/module-names/webpack.config.js b/test/configCases/source-map/module-names/webpack.config.js index 961eb67d9f8..249cf04c40a 100644 --- a/test/configCases/source-map/module-names/webpack.config.js +++ b/test/configCases/source-map/module-names/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { mode: "development", output: { diff --git a/test/configCases/source-map/namespace-source-path-no-truncate/[id].js b/test/configCases/source-map/namespace-source-path-no-truncate/[id].js new file mode 100644 index 00000000000..c9d8865844b --- /dev/null +++ b/test/configCases/source-map/namespace-source-path-no-truncate/[id].js @@ -0,0 +1,3 @@ +var foo = {}; + +module.exports = foo; diff --git a/test/configCases/source-map/namespace-source-path-no-truncate/index.js b/test/configCases/source-map/namespace-source-path-no-truncate/index.js new file mode 100644 index 00000000000..d018b679ec1 --- /dev/null +++ b/test/configCases/source-map/namespace-source-path-no-truncate/index.js @@ -0,0 +1,8 @@ +it("should include [id].js in SourceMap", function () { + var fs = require("fs"); + var source = fs.readFileSync(__filename + ".map", "utf-8"); + var map = JSON.parse(source); + expect(map.sources).toContain("webpack:///./[id].js"); +}); + +if (Math.random() < 0) require("./[id].js"); diff --git a/test/configCases/source-map/namespace-source-path-no-truncate/webpack.config.js b/test/configCases/source-map/namespace-source-path-no-truncate/webpack.config.js new file mode 100644 index 00000000000..e741f449ed6 --- /dev/null +++ b/test/configCases/source-map/namespace-source-path-no-truncate/webpack.config.js @@ -0,0 +1,11 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + node: { + __dirname: false, + __filename: false + }, + devtool: "source-map", + optimization: { + minimize: true + } +}; diff --git a/test/configCases/source-map/namespace-source-path.library/index.js b/test/configCases/source-map/namespace-source-path.library/index.js index 3f99426355e..d8cf1be2f33 100644 --- a/test/configCases/source-map/namespace-source-path.library/index.js +++ b/test/configCases/source-map/namespace-source-path.library/index.js @@ -5,4 +5,4 @@ it("should include webpack://mylibrary/./test.js in SourceMap", function() { expect(map.sources).toContain("webpack://mylibrary/./test.js"); }); -require.include("./test.js"); +if (Math.random() < 0) require("./test.js"); diff --git a/test/configCases/source-map/namespace-source-path.library/webpack.config.js b/test/configCases/source-map/namespace-source-path.library/webpack.config.js index ae84e5f4bac..71e95006fc0 100644 --- a/test/configCases/source-map/namespace-source-path.library/webpack.config.js +++ b/test/configCases/source-map/namespace-source-path.library/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { mode: "development", output: { diff --git a/test/configCases/source-map/namespace-source-path/index.js b/test/configCases/source-map/namespace-source-path/index.js index cbe53a9c45a..71e8a5409ef 100644 --- a/test/configCases/source-map/namespace-source-path/index.js +++ b/test/configCases/source-map/namespace-source-path/index.js @@ -5,4 +5,4 @@ it("should include webpack://mynamespace/./test.js in SourceMap", function() { expect(map.sources).toContain("webpack://mynamespace/./test.js"); }); -require.include("./test.js"); +if (Math.random() < 0) require("./test.js"); diff --git a/test/configCases/source-map/namespace-source-path/webpack.config.js b/test/configCases/source-map/namespace-source-path/webpack.config.js index 37c0d264249..12407607a5f 100644 --- a/test/configCases/source-map/namespace-source-path/webpack.config.js +++ b/test/configCases/source-map/namespace-source-path/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { mode: "development", output: { diff --git a/test/configCases/source-map/no-source-map/chunk.js b/test/configCases/source-map/no-source-map/chunk.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/configCases/source-map/no-source-map/chunk.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/configCases/source-map/no-source-map/index.js b/test/configCases/source-map/no-source-map/index.js new file mode 100644 index 00000000000..537679c9cc5 --- /dev/null +++ b/test/configCases/source-map/no-source-map/index.js @@ -0,0 +1,6 @@ +import ok from "./loader!"; + +it("should handle chunks", () => import("./chunk")); +it("should handle loaders", () => { + expect(ok).toBe("ok"); +}); diff --git a/test/configCases/source-map/no-source-map/loader.js b/test/configCases/source-map/no-source-map/loader.js new file mode 100644 index 00000000000..84613ab8e99 --- /dev/null +++ b/test/configCases/source-map/no-source-map/loader.js @@ -0,0 +1,13 @@ +const path = require("path"); +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { + this.callback(null, "module.exports = 'ok';", { + version: 3, + file: "/should/be/removed", + sourceRoot: path.join(__dirname, "folder"), + sources: ["test1.txt"], + sourcesContent: ["Test"], + names: [], + mappings: "AAAA" + }); +}; diff --git a/test/configCases/source-map/no-source-map/webpack.config.js b/test/configCases/source-map/no-source-map/webpack.config.js new file mode 100644 index 00000000000..6ccf9011e2b --- /dev/null +++ b/test/configCases/source-map/no-source-map/webpack.config.js @@ -0,0 +1,41 @@ +/** @typedef {import("../../../../").WebpackPluginFunction} WebpackPluginFunction */ + +/** @type {WebpackPluginFunction[]} */ +const plugins = [ + compiler => { + compiler.hooks.emit.tap("Test", compilation => { + for (const asset of compilation.getAssets()) { + const result = asset.source.sourceAndMap(); + try { + expect(result.map).toBe(null); + } catch (_err) { + const err = /** @type {Error} */ (_err); + err.message += `\nfor asset ${asset.name}`; + throw err; + } + } + }); + } +]; + +/** @type {import("../../../../").Configuration} */ +module.exports = [ + { + mode: "development", + devtool: false, + plugins + }, + { + mode: "production", + devtool: false, + plugins + }, + { + mode: "production", + devtool: false, + optimization: { + minimize: true + }, + plugins + } +]; diff --git a/test/configCases/source-map/nosources/index.js b/test/configCases/source-map/nosources/index.js index 25bfc59c5a3..0fc5ed41c9e 100644 --- a/test/configCases/source-map/nosources/index.js +++ b/test/configCases/source-map/nosources/index.js @@ -2,7 +2,7 @@ it("should not include sourcesContent if noSources option is used", function() { var fs = require("fs"); var source = fs.readFileSync(__filename + ".map", "utf-8"); var map = JSON.parse(source); - expect(map).not.toHaveProperty('sourcesContent'); + expect(map).not.toHaveProperty("sourcesContent"); }); -require.include("./test.js"); +if (Math.random() < 0) require("./test.js"); diff --git a/test/configCases/source-map/nosources/webpack.config.js b/test/configCases/source-map/nosources/webpack.config.js index 07b6b616025..3cf6572108f 100644 --- a/test/configCases/source-map/nosources/webpack.config.js +++ b/test/configCases/source-map/nosources/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { mode: "development", node: { diff --git a/test/configCases/source-map/object-as-output-library/webpack.config.js b/test/configCases/source-map/object-as-output-library/webpack.config.js index 13662dafda8..5da44457e10 100644 --- a/test/configCases/source-map/object-as-output-library/webpack.config.js +++ b/test/configCases/source-map/object-as-output-library/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { devtool: "source-map", output: { diff --git a/test/configCases/source-map/relative-source-map-path/webpack.config.js b/test/configCases/source-map/relative-source-map-path/webpack.config.js index 07b079a42f1..ccfc9bff6f0 100644 --- a/test/configCases/source-map/relative-source-map-path/webpack.config.js +++ b/test/configCases/source-map/relative-source-map-path/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { mode: "development", output: { diff --git a/test/configCases/source-map/relative-source-maps-by-loader/index.js b/test/configCases/source-map/relative-source-maps-by-loader/index.js new file mode 100644 index 00000000000..ca4da99d19d --- /dev/null +++ b/test/configCases/source-map/relative-source-maps-by-loader/index.js @@ -0,0 +1,19 @@ +it("should run", () => { + require("./loader-source-root!"); + require("./loader-source-root-slash!"); + require("./loader-source-root-source-slash!"); + require("./loader-source-root-2-slash!"); + require("./loader-no-source-root!"); + require("./loader-pre-relative!"); +}); + +it("should generate the correct SourceMap", function() { + var fs = require("fs"); + var source = JSON.parse(fs.readFileSync(__filename + ".map", "utf-8")); + expect(source.sources).toContain("webpack:///./folder/test1.txt"); + expect(source.sources).toContain("webpack:///./folder/test2.txt"); + expect(source.sources).toContain("webpack:///./folder/test3.txt"); + expect(source.sources).toContain("webpack:///./folder/test4.txt"); + expect(source.sources).toContain("webpack:///./folder/test5.txt"); + expect(source.sources).toContain("webpack:///./folder/test6.txt"); +}); diff --git a/test/configCases/source-map/relative-source-maps-by-loader/loader-no-source-root.js b/test/configCases/source-map/relative-source-maps-by-loader/loader-no-source-root.js new file mode 100644 index 00000000000..f2ca2e44e87 --- /dev/null +++ b/test/configCases/source-map/relative-source-maps-by-loader/loader-no-source-root.js @@ -0,0 +1,12 @@ +const path = require("path"); +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { + this.callback(null, "module.exports = 'ok';", { + version: 3, + file: "/should/be/removed", + sources: [path.join(__dirname, "folder", "test5.txt")], + sourcesContent: ["Test"], + names: [], + mappings: "AAAA" + }); +}; diff --git a/test/configCases/source-map/relative-source-maps-by-loader/loader-pre-relative.js b/test/configCases/source-map/relative-source-maps-by-loader/loader-pre-relative.js new file mode 100644 index 00000000000..e70ef8ec6ca --- /dev/null +++ b/test/configCases/source-map/relative-source-maps-by-loader/loader-pre-relative.js @@ -0,0 +1,11 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { + this.callback(null, "module.exports = 'ok';", { + version: 3, + file: "/should/be/removed", + sources: ["webpack://./folder/test6.txt"], + sourcesContent: ["Test"], + names: [], + mappings: "AAAA" + }); +}; diff --git a/test/configCases/source-map/relative-source-maps-by-loader/loader-source-root-2-slash.js b/test/configCases/source-map/relative-source-maps-by-loader/loader-source-root-2-slash.js new file mode 100644 index 00000000000..eb49d6a3ce5 --- /dev/null +++ b/test/configCases/source-map/relative-source-maps-by-loader/loader-source-root-2-slash.js @@ -0,0 +1,13 @@ +const path = require("path"); +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { + this.callback(null, "module.exports = 'ok';", { + version: 3, + file: "/should/be/removed", + sourceRoot: path.join(__dirname, "folder") + "/", + sources: ["/test4.txt"], + sourcesContent: ["Test"], + names: [], + mappings: "AAAA" + }); +}; diff --git a/test/configCases/source-map/relative-source-maps-by-loader/loader-source-root-slash.js b/test/configCases/source-map/relative-source-maps-by-loader/loader-source-root-slash.js new file mode 100644 index 00000000000..2fb7f62e1f5 --- /dev/null +++ b/test/configCases/source-map/relative-source-maps-by-loader/loader-source-root-slash.js @@ -0,0 +1,13 @@ +const path = require("path"); +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { + this.callback(null, "module.exports = 'ok';", { + version: 3, + file: "/should/be/removed", + sourceRoot: path.join(__dirname, "folder") + "/", + sources: ["test3.txt"], + sourcesContent: ["Test"], + names: [], + mappings: "AAAA" + }); +}; diff --git a/test/configCases/source-map/relative-source-maps-by-loader/loader-source-root-source-slash.js b/test/configCases/source-map/relative-source-maps-by-loader/loader-source-root-source-slash.js new file mode 100644 index 00000000000..5e25c38b2b3 --- /dev/null +++ b/test/configCases/source-map/relative-source-maps-by-loader/loader-source-root-source-slash.js @@ -0,0 +1,13 @@ +const path = require("path"); +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { + this.callback(null, "module.exports = 'ok';", { + version: 3, + file: "/should/be/removed", + sourceRoot: path.join(__dirname, "folder"), + sources: ["/test2.txt"], + sourcesContent: ["Test"], + names: [], + mappings: "AAAA" + }); +}; diff --git a/test/configCases/source-map/relative-source-maps-by-loader/loader-source-root.js b/test/configCases/source-map/relative-source-maps-by-loader/loader-source-root.js new file mode 100644 index 00000000000..84613ab8e99 --- /dev/null +++ b/test/configCases/source-map/relative-source-maps-by-loader/loader-source-root.js @@ -0,0 +1,13 @@ +const path = require("path"); +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { + this.callback(null, "module.exports = 'ok';", { + version: 3, + file: "/should/be/removed", + sourceRoot: path.join(__dirname, "folder"), + sources: ["test1.txt"], + sourcesContent: ["Test"], + names: [], + mappings: "AAAA" + }); +}; diff --git a/test/configCases/source-map/relative-source-maps-by-loader/webpack.config.js b/test/configCases/source-map/relative-source-maps-by-loader/webpack.config.js new file mode 100644 index 00000000000..c0a285cd11b --- /dev/null +++ b/test/configCases/source-map/relative-source-maps-by-loader/webpack.config.js @@ -0,0 +1,9 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + node: { + __dirname: false, + __filename: false + }, + devtool: "source-map" +}; diff --git a/test/configCases/source-map/resource-path/index.js b/test/configCases/source-map/resource-path/index.js new file mode 100644 index 00000000000..9868bd90686 --- /dev/null +++ b/test/configCases/source-map/resource-path/index.js @@ -0,0 +1,14 @@ +it("should not include layer or type in absoluteResourcePath", function () { + var fs = require("fs"); + var path = require("path"); + var source = fs.readFileSync(__filename + ".map", "utf-8"); + var map = JSON.parse(source); + expect(map.sources).toContain( + path.resolve( + __dirname, + "../../../..//configCases/source-map/resource-path/test.js" + ) + ); +}); + +if (Math.random() < 0) require("./test.js"); diff --git a/test/configCases/source-map/line-to-line/test.js b/test/configCases/source-map/resource-path/test.js similarity index 100% rename from test/configCases/source-map/line-to-line/test.js rename to test/configCases/source-map/resource-path/test.js diff --git a/test/configCases/source-map/resource-path/webpack.config.js b/test/configCases/source-map/resource-path/webpack.config.js new file mode 100644 index 00000000000..e68ec19f72e --- /dev/null +++ b/test/configCases/source-map/resource-path/webpack.config.js @@ -0,0 +1,22 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + node: { + __dirname: false, + __filename: false + }, + experiments: { + layers: true + }, + devtool: "source-map", + entry: { + main: { + import: "./index", + layer: "something" + } + }, + output: { + devtoolModuleFilenameTemplate(info) { + return info.absoluteResourcePath; + } + } +}; diff --git a/test/configCases/source-map/source-map-debugids/index.js b/test/configCases/source-map/source-map-debugids/index.js new file mode 100644 index 00000000000..7945ce188e3 --- /dev/null +++ b/test/configCases/source-map/source-map-debugids/index.js @@ -0,0 +1,12 @@ +const fs = require("fs"); + +it("source should include debug id that matches debugId key in sourcemap", function() { + const source = fs.readFileSync(__filename, "utf-8"); + const sourceMap = fs.readFileSync(__filename + ".map", "utf-8"); + const map = JSON.parse(sourceMap); + expect(map.debugId).toBeDefined(); + expect( + /[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/i.test(map.debugId) + ).toBe(true); + expect(source).toContain(`//# debugId=${map.debugId}`); +}); diff --git a/test/configCases/source-map/source-map-debugids/webpack.config.js b/test/configCases/source-map/source-map-debugids/webpack.config.js new file mode 100644 index 00000000000..467ccfd15ea --- /dev/null +++ b/test/configCases/source-map/source-map-debugids/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + devtool: "source-map-debugids" +}; diff --git a/test/configCases/source-map/source-map-filename-contenthash/index.js b/test/configCases/source-map/source-map-filename-contenthash/index.js index dd9fc97ab3c..a76374e0757 100644 --- a/test/configCases/source-map/source-map-filename-contenthash/index.js +++ b/test/configCases/source-map/source-map-filename-contenthash/index.js @@ -1,6 +1,8 @@ -it("should contain contenthash as query parameter and path", function() { +it("should contain contenthash as query parameter and path", function () { var fs = require("fs"); var source = fs.readFileSync(__filename, "utf-8"); - var match = /sourceMappingURL\s*=.*-([A-Fa-f0-9]{32})\.map\?([A-Fa-f0-9]{32})-([A-Fa-f0-9]{32})/.exec(source); + var match = /sourceMappingURL\s*=.*-([A-Fa-f0-9]{32})\.map\?([A-Fa-f0-9]{32})-([A-Fa-f0-9]{6})/.exec( + source + ); expect(match.length).toBe(4); }); diff --git a/test/configCases/source-map/source-map-filename-contenthash/webpack.config.js b/test/configCases/source-map/source-map-filename-contenthash/webpack.config.js index 01478ecd959..09dd74b31a4 100644 --- a/test/configCases/source-map/source-map-filename-contenthash/webpack.config.js +++ b/test/configCases/source-map/source-map-filename-contenthash/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { mode: "development", node: { @@ -6,6 +7,8 @@ module.exports = { }, devtool: "source-map", output: { - sourceMapFilename: "[file]-[contenthash].map?[contenthash]-[contenthash]" + filename: "bundle0.js?[contenthash]", + sourceMapFilename: + "[file]-[contenthash].map?[contenthash]-[contenthash:6][query]" } }; diff --git a/test/configCases/source-map/source-map-with-profiling-plugin/deprecations.js b/test/configCases/source-map/source-map-with-profiling-plugin/deprecations.js new file mode 100644 index 00000000000..dee16addc3f --- /dev/null +++ b/test/configCases/source-map/source-map-with-profiling-plugin/deprecations.js @@ -0,0 +1,3 @@ +module.exports = [ + { code: /DEP_WEBPACK_COMPILATION_NORMAL_MODULE_LOADER_HOOK/ } +]; diff --git a/test/configCases/source-map/source-map-with-profiling-plugin/index.js b/test/configCases/source-map/source-map-with-profiling-plugin/index.js index dac5992eee5..dcdd828b61d 100644 --- a/test/configCases/source-map/source-map-with-profiling-plugin/index.js +++ b/test/configCases/source-map/source-map-with-profiling-plugin/index.js @@ -5,4 +5,4 @@ it("bundle0 should include sourcemapped test.js", function() { expect(map.sources).toContain("webpack:///./test.js"); }); -require.include("./test.js"); +if (Math.random() < 0) require("./test.js"); diff --git a/test/configCases/source-map/source-map-with-profiling-plugin/test.filter.js b/test/configCases/source-map/source-map-with-profiling-plugin/test.filter.js index b36fb8fa768..71a71e594ff 100644 --- a/test/configCases/source-map/source-map-with-profiling-plugin/test.filter.js +++ b/test/configCases/source-map/source-map-with-profiling-plugin/test.filter.js @@ -1,3 +1,3 @@ -module.exports = function(config) { +module.exports = function (config) { return !process.env.CI; }; diff --git a/test/configCases/source-map/source-map-with-profiling-plugin/webpack.config.js b/test/configCases/source-map/source-map-with-profiling-plugin/webpack.config.js index ecc013f8873..e4ce0a98d18 100644 --- a/test/configCases/source-map/source-map-with-profiling-plugin/webpack.config.js +++ b/test/configCases/source-map/source-map-with-profiling-plugin/webpack.config.js @@ -1,7 +1,8 @@ -var webpack = require("../../../../"); -var path = require("path"); -var os = require("os"); +const webpack = require("../../../../"); +const path = require("path"); +const os = require("os"); +/** @type {import("../../../../").Configuration} */ module.exports = { node: { __dirname: false, diff --git a/test/configCases/source-map/sources-array-production/index.js b/test/configCases/source-map/sources-array-production/index.js index 23a95f012f7..ca45aadcf69 100644 --- a/test/configCases/source-map/sources-array-production/index.js +++ b/test/configCases/source-map/sources-array-production/index.js @@ -5,4 +5,4 @@ it("should include test.js in SourceMap", function() { expect(map.sources).toContain("webpack:///./test.js"); }); -require.include("./test.js"); +if (Math.random() < 0) require("./test.js"); diff --git a/test/configCases/source-map/sources-array-production/webpack.config.js b/test/configCases/source-map/sources-array-production/webpack.config.js index acbb8608cb1..e741f449ed6 100644 --- a/test/configCases/source-map/sources-array-production/webpack.config.js +++ b/test/configCases/source-map/sources-array-production/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { node: { __dirname: false, diff --git a/test/configCases/split-chunks-common/correct-order/a.js b/test/configCases/split-chunks-common/correct-order/a.js new file mode 100644 index 00000000000..6cd1d0075d4 --- /dev/null +++ b/test/configCases/split-chunks-common/correct-order/a.js @@ -0,0 +1 @@ +module.exports = "a"; diff --git a/test/configCases/commons-chunk-plugin/correct-order/index.js b/test/configCases/split-chunks-common/correct-order/index.js similarity index 100% rename from test/configCases/commons-chunk-plugin/correct-order/index.js rename to test/configCases/split-chunks-common/correct-order/index.js diff --git a/test/configCases/split-chunks-common/correct-order/test.config.js b/test/configCases/split-chunks-common/correct-order/test.config.js new file mode 100644 index 00000000000..f8bc4b8473c --- /dev/null +++ b/test/configCases/split-chunks-common/correct-order/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["./vendor.js", "./main.js"]; + } +}; diff --git a/test/configCases/split-chunks-common/correct-order/webpack.config.js b/test/configCases/split-chunks-common/correct-order/webpack.config.js new file mode 100644 index 00000000000..65bafc0f652 --- /dev/null +++ b/test/configCases/split-chunks-common/correct-order/webpack.config.js @@ -0,0 +1,17 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + vendor: ["./a"], + main: "./index" + }, + target: "web", + output: { + filename: "[name].js" + }, + optimization: { + splitChunks: { + minSize: 1, + name: "vendor" + } + } +}; diff --git a/test/configCases/commons-chunk-plugin/extract-async-from-entry/index.js b/test/configCases/split-chunks-common/extract-async-from-entry/index.js similarity index 100% rename from test/configCases/commons-chunk-plugin/extract-async-from-entry/index.js rename to test/configCases/split-chunks-common/extract-async-from-entry/index.js diff --git a/test/configCases/split-chunks-common/extract-async-from-entry/test.config.js b/test/configCases/split-chunks-common/extract-async-from-entry/test.config.js new file mode 100644 index 00000000000..74e4d94cce7 --- /dev/null +++ b/test/configCases/split-chunks-common/extract-async-from-entry/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["./main.js"]; + } +}; diff --git a/test/configCases/split-chunks-common/extract-async-from-entry/webpack.config.js b/test/configCases/split-chunks-common/extract-async-from-entry/webpack.config.js new file mode 100644 index 00000000000..715e35bdb31 --- /dev/null +++ b/test/configCases/split-chunks-common/extract-async-from-entry/webpack.config.js @@ -0,0 +1,16 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + main: "./index", + second: "./index" + }, + target: "web", + output: { + filename: "[name].js" + }, + optimization: { + splitChunks: { + minSize: 1 + } + } +}; diff --git a/test/configCases/commons-chunk-plugin/hot-multi/common.js b/test/configCases/split-chunks-common/hot-multi/common.js similarity index 100% rename from test/configCases/commons-chunk-plugin/hot-multi/common.js rename to test/configCases/split-chunks-common/hot-multi/common.js diff --git a/test/configCases/split-chunks-common/hot-multi/first.js b/test/configCases/split-chunks-common/hot-multi/first.js new file mode 100644 index 00000000000..a5b1477a8e8 --- /dev/null +++ b/test/configCases/split-chunks-common/hot-multi/first.js @@ -0,0 +1,5 @@ +require("./common"); + +it("should have the correct main flag for multi first module", function() { + expect(module.hot._main).toBe(true); +}); diff --git a/test/configCases/split-chunks-common/hot-multi/second.js b/test/configCases/split-chunks-common/hot-multi/second.js new file mode 100644 index 00000000000..75f1494c39c --- /dev/null +++ b/test/configCases/split-chunks-common/hot-multi/second.js @@ -0,0 +1,5 @@ +require("./common"); + +it("should have the correct main flag for multi second module", function() { + expect(module.hot._main).toBe(true); +}); diff --git a/test/configCases/commons-chunk-plugin/hot-multi/shared.js b/test/configCases/split-chunks-common/hot-multi/shared.js similarity index 100% rename from test/configCases/commons-chunk-plugin/hot-multi/shared.js rename to test/configCases/split-chunks-common/hot-multi/shared.js diff --git a/test/configCases/split-chunks-common/hot-multi/test.config.js b/test/configCases/split-chunks-common/hot-multi/test.config.js new file mode 100644 index 00000000000..c5249179a7c --- /dev/null +++ b/test/configCases/split-chunks-common/hot-multi/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["./vendor.js", "./first.js", "./second.js"]; + } +}; diff --git a/test/configCases/split-chunks-common/hot-multi/webpack.config.js b/test/configCases/split-chunks-common/hot-multi/webpack.config.js new file mode 100644 index 00000000000..ac4cfdb6903 --- /dev/null +++ b/test/configCases/split-chunks-common/hot-multi/webpack.config.js @@ -0,0 +1,27 @@ +const HotModuleReplacementPlugin = + require("../../../../").HotModuleReplacementPlugin; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + first: ["./shared", "./first"], + second: ["./shared", "./second"] + }, + target: "web", + output: { + filename: "[name].js" + }, + optimization: { + splitChunks: { + cacheGroups: { + vendor: { + chunks: "all", + name: "vendor", + minChunks: 2, + enforce: true + } + } + } + }, + plugins: [new HotModuleReplacementPlugin()] +}; diff --git a/test/configCases/commons-chunk-plugin/hot/index.js b/test/configCases/split-chunks-common/hot/index.js similarity index 100% rename from test/configCases/commons-chunk-plugin/hot/index.js rename to test/configCases/split-chunks-common/hot/index.js diff --git a/test/configCases/split-chunks-common/hot/test.config.js b/test/configCases/split-chunks-common/hot/test.config.js new file mode 100644 index 00000000000..f8bc4b8473c --- /dev/null +++ b/test/configCases/split-chunks-common/hot/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["./vendor.js", "./main.js"]; + } +}; diff --git a/test/configCases/commons-chunk-plugin/hot/vendor.js b/test/configCases/split-chunks-common/hot/vendor.js similarity index 100% rename from test/configCases/commons-chunk-plugin/hot/vendor.js rename to test/configCases/split-chunks-common/hot/vendor.js diff --git a/test/configCases/split-chunks-common/hot/webpack.config.js b/test/configCases/split-chunks-common/hot/webpack.config.js new file mode 100644 index 00000000000..6f9b5cc31c1 --- /dev/null +++ b/test/configCases/split-chunks-common/hot/webpack.config.js @@ -0,0 +1,26 @@ +const HotModuleReplacementPlugin = + require("../../../../").HotModuleReplacementPlugin; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + main: "./index" + }, + target: "web", + output: { + filename: "[name].js" + }, + optimization: { + splitChunks: { + cacheGroups: { + vendor: { + chunks: "all", + name: "vendor", + test: /vendor/, + enforce: true + } + } + } + }, + plugins: [new HotModuleReplacementPlugin()] +}; diff --git a/test/configCases/split-chunks-common/inverted-order/a.js b/test/configCases/split-chunks-common/inverted-order/a.js new file mode 100644 index 00000000000..6cd1d0075d4 --- /dev/null +++ b/test/configCases/split-chunks-common/inverted-order/a.js @@ -0,0 +1 @@ +module.exports = "a"; diff --git a/test/configCases/commons-chunk-plugin/inverted-order/index.js b/test/configCases/split-chunks-common/inverted-order/index.js similarity index 100% rename from test/configCases/commons-chunk-plugin/inverted-order/index.js rename to test/configCases/split-chunks-common/inverted-order/index.js diff --git a/test/configCases/split-chunks-common/inverted-order/test.config.js b/test/configCases/split-chunks-common/inverted-order/test.config.js new file mode 100644 index 00000000000..fc22d3b5770 --- /dev/null +++ b/test/configCases/split-chunks-common/inverted-order/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["./main.js", "./vendor.js"]; + } +}; diff --git a/test/configCases/split-chunks-common/inverted-order/webpack.config.js b/test/configCases/split-chunks-common/inverted-order/webpack.config.js new file mode 100644 index 00000000000..65bafc0f652 --- /dev/null +++ b/test/configCases/split-chunks-common/inverted-order/webpack.config.js @@ -0,0 +1,17 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + vendor: ["./a"], + main: "./index" + }, + target: "web", + output: { + filename: "[name].js" + }, + optimization: { + splitChunks: { + minSize: 1, + name: "vendor" + } + } +}; diff --git a/test/configCases/split-chunks-common/issue-12128/a.js b/test/configCases/split-chunks-common/issue-12128/a.js new file mode 100644 index 00000000000..6cd1d0075d4 --- /dev/null +++ b/test/configCases/split-chunks-common/issue-12128/a.js @@ -0,0 +1 @@ +module.exports = "a"; diff --git a/test/configCases/split-chunks-common/issue-12128/b.js b/test/configCases/split-chunks-common/issue-12128/b.js new file mode 100644 index 00000000000..dfbbeb621fa --- /dev/null +++ b/test/configCases/split-chunks-common/issue-12128/b.js @@ -0,0 +1 @@ +module.exports = "b"; diff --git a/test/configCases/split-chunks-common/issue-12128/index.js b/test/configCases/split-chunks-common/issue-12128/index.js new file mode 100644 index 00000000000..3495230e5d0 --- /dev/null +++ b/test/configCases/split-chunks-common/issue-12128/index.js @@ -0,0 +1,6 @@ +it("should be main", function () { + require("./a"); + require("./b"); + + expect(window["webpackChunk"].length).toBe(1); +}); diff --git a/test/configCases/split-chunks-common/issue-12128/index2.js b/test/configCases/split-chunks-common/issue-12128/index2.js new file mode 100644 index 00000000000..7191b99dca9 --- /dev/null +++ b/test/configCases/split-chunks-common/issue-12128/index2.js @@ -0,0 +1,6 @@ +it("should run", function() { + var a = require("./a"); + var b = require("./b"); + expect(a).toBe("a"); + expect(b).toBe("b"); +}); diff --git a/test/configCases/split-chunks-common/issue-12128/test.config.js b/test/configCases/split-chunks-common/issue-12128/test.config.js new file mode 100644 index 00000000000..8e220227b7b --- /dev/null +++ b/test/configCases/split-chunks-common/issue-12128/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["./common.js", "./main.js", "./main2.js"]; + } +}; diff --git a/test/configCases/split-chunks-common/issue-12128/webpack.config.js b/test/configCases/split-chunks-common/issue-12128/webpack.config.js new file mode 100644 index 00000000000..ac66bb5a981 --- /dev/null +++ b/test/configCases/split-chunks-common/issue-12128/webpack.config.js @@ -0,0 +1,22 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + main: "./index", + main2: "./index2" + }, + target: "web", + output: { + filename: "[name].js" + }, + optimization: { + splitChunks: { + cacheGroups: { + common: { + chunks: "initial", + minSize: 0, + name: "common" + } + } + } + } +}; diff --git a/test/configCases/commons-chunk-plugin/library/a.js b/test/configCases/split-chunks-common/library/a.js similarity index 100% rename from test/configCases/commons-chunk-plugin/library/a.js rename to test/configCases/split-chunks-common/library/a.js diff --git a/test/configCases/split-chunks-common/library/index.js b/test/configCases/split-chunks-common/library/index.js new file mode 100644 index 00000000000..1467e4da1c9 --- /dev/null +++ b/test/configCases/split-chunks-common/library/index.js @@ -0,0 +1,11 @@ +if (Math.random() < 0) require("external1"); +require.ensure([], function() { + if (Math.random() < 0) require("external2"); +}); + +it("should have externals in main file", function() { + var a = require("./a"); + expect(a.vendor).toMatch('require("external0")'); + expect(a.main).toMatch('require("external1")'); + expect(a.main).toMatch('require("external2")'); +}); diff --git a/test/configCases/split-chunks-common/library/test.config.js b/test/configCases/split-chunks-common/library/test.config.js new file mode 100644 index 00000000000..8ede468fd67 --- /dev/null +++ b/test/configCases/split-chunks-common/library/test.config.js @@ -0,0 +1,10 @@ +module.exports = { + findBundle(i, options) { + return ["./vendor.js", "./main.js"]; + }, + modules: { + external0: "module 0", + external1: "module 1", + external2: "module 2" + } +}; diff --git a/test/configCases/split-chunks-common/library/webpack.config.js b/test/configCases/split-chunks-common/library/webpack.config.js new file mode 100644 index 00000000000..74eda62c39d --- /dev/null +++ b/test/configCases/split-chunks-common/library/webpack.config.js @@ -0,0 +1,28 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + vendor: ["external0", "./a"], + main: "./index" + }, + target: "web", + output: { + filename: "[name].js", + libraryTarget: "umd" + }, + externals: ["external0", "external1", "external2", "fs", "path"], + optimization: { + splitChunks: { + cacheGroups: { + vendor: { + test: "vendor", + name: "vendor", + enforce: true + } + } + } + }, + node: { + __filename: false, + __dirname: false + } +}; diff --git a/test/configCases/split-chunks-common/move-entry/a.js b/test/configCases/split-chunks-common/move-entry/a.js new file mode 100644 index 00000000000..6cd1d0075d4 --- /dev/null +++ b/test/configCases/split-chunks-common/move-entry/a.js @@ -0,0 +1 @@ +module.exports = "a"; diff --git a/test/configCases/commons-chunk-plugin/move-entry/index.js b/test/configCases/split-chunks-common/move-entry/index.js similarity index 100% rename from test/configCases/commons-chunk-plugin/move-entry/index.js rename to test/configCases/split-chunks-common/move-entry/index.js diff --git a/test/configCases/split-chunks-common/move-entry/test.config.js b/test/configCases/split-chunks-common/move-entry/test.config.js new file mode 100644 index 00000000000..1aceaa7c1ba --- /dev/null +++ b/test/configCases/split-chunks-common/move-entry/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["./commons.js", "./main.js"]; + } +}; diff --git a/test/configCases/split-chunks-common/move-entry/webpack.config.js b/test/configCases/split-chunks-common/move-entry/webpack.config.js new file mode 100644 index 00000000000..36226f7227b --- /dev/null +++ b/test/configCases/split-chunks-common/move-entry/webpack.config.js @@ -0,0 +1,22 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + main: "./index?0", + second: "./index?1" + }, + target: "web", + output: { + filename: "[name].js" + }, + optimization: { + splitChunks: { + cacheGroups: { + commons: { + chunks: "initial", + minSize: 0, + name: "commons" + } + } + } + } +}; diff --git a/test/configCases/split-chunks-common/move-to-grandparent/index.js b/test/configCases/split-chunks-common/move-to-grandparent/index.js new file mode 100644 index 00000000000..5f810b399ec --- /dev/null +++ b/test/configCases/split-chunks-common/move-to-grandparent/index.js @@ -0,0 +1,12 @@ +it("should correctly include indirect children in common chunk", function(done) { + Promise.all([ + import('./pageA'), + import('./pageB') + ]).then((imports) => { + expect(imports[0].default).toBe("reuse"); + expect(imports[1].default).toBe("reuse"); + done(); + }).catch(e => { + done(e); + }) +}); diff --git a/test/configCases/commons-chunk-plugin/move-to-grandparent/pageA.js b/test/configCases/split-chunks-common/move-to-grandparent/pageA.js similarity index 100% rename from test/configCases/commons-chunk-plugin/move-to-grandparent/pageA.js rename to test/configCases/split-chunks-common/move-to-grandparent/pageA.js diff --git a/test/configCases/commons-chunk-plugin/move-to-grandparent/pageB.js b/test/configCases/split-chunks-common/move-to-grandparent/pageB.js similarity index 100% rename from test/configCases/commons-chunk-plugin/move-to-grandparent/pageB.js rename to test/configCases/split-chunks-common/move-to-grandparent/pageB.js diff --git a/test/configCases/commons-chunk-plugin/move-to-grandparent/pageC.js b/test/configCases/split-chunks-common/move-to-grandparent/pageC.js similarity index 100% rename from test/configCases/commons-chunk-plugin/move-to-grandparent/pageC.js rename to test/configCases/split-chunks-common/move-to-grandparent/pageC.js diff --git a/test/configCases/commons-chunk-plugin/move-to-grandparent/reusableComponent.js b/test/configCases/split-chunks-common/move-to-grandparent/reusableComponent.js similarity index 100% rename from test/configCases/commons-chunk-plugin/move-to-grandparent/reusableComponent.js rename to test/configCases/split-chunks-common/move-to-grandparent/reusableComponent.js diff --git a/test/configCases/commons-chunk-plugin/move-to-grandparent/second.js b/test/configCases/split-chunks-common/move-to-grandparent/second.js similarity index 100% rename from test/configCases/commons-chunk-plugin/move-to-grandparent/second.js rename to test/configCases/split-chunks-common/move-to-grandparent/second.js diff --git a/test/configCases/split-chunks-common/move-to-grandparent/test.config.js b/test/configCases/split-chunks-common/move-to-grandparent/test.config.js new file mode 100644 index 00000000000..c29a7929db6 --- /dev/null +++ b/test/configCases/split-chunks-common/move-to-grandparent/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["./main.js", "./misc.js"]; + } +}; diff --git a/test/configCases/split-chunks-common/move-to-grandparent/webpack.config.js b/test/configCases/split-chunks-common/move-to-grandparent/webpack.config.js new file mode 100644 index 00000000000..183a1227e42 --- /dev/null +++ b/test/configCases/split-chunks-common/move-to-grandparent/webpack.config.js @@ -0,0 +1,15 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + main: "./index", + misc: "./second" + }, + output: { + filename: "[name].js" + }, + optimization: { + splitChunks: { + minSize: 0 + } + } +}; diff --git a/test/configCases/split-chunks-common/simple/a.js b/test/configCases/split-chunks-common/simple/a.js new file mode 100644 index 00000000000..6cd1d0075d4 --- /dev/null +++ b/test/configCases/split-chunks-common/simple/a.js @@ -0,0 +1 @@ +module.exports = "a"; diff --git a/test/configCases/commons-chunk-plugin/simple/index.js b/test/configCases/split-chunks-common/simple/index.js similarity index 100% rename from test/configCases/commons-chunk-plugin/simple/index.js rename to test/configCases/split-chunks-common/simple/index.js diff --git a/test/configCases/split-chunks-common/simple/test.config.js b/test/configCases/split-chunks-common/simple/test.config.js new file mode 100644 index 00000000000..f8bc4b8473c --- /dev/null +++ b/test/configCases/split-chunks-common/simple/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["./vendor.js", "./main.js"]; + } +}; diff --git a/test/configCases/split-chunks-common/simple/webpack.config.js b/test/configCases/split-chunks-common/simple/webpack.config.js new file mode 100644 index 00000000000..65bafc0f652 --- /dev/null +++ b/test/configCases/split-chunks-common/simple/webpack.config.js @@ -0,0 +1,17 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + vendor: ["./a"], + main: "./index" + }, + target: "web", + output: { + filename: "[name].js" + }, + optimization: { + splitChunks: { + minSize: 1, + name: "vendor" + } + } +}; diff --git a/test/configCases/split-chunks-common/target-node/index.js b/test/configCases/split-chunks-common/target-node/index.js new file mode 100644 index 00000000000..0792e6287dc --- /dev/null +++ b/test/configCases/split-chunks-common/target-node/index.js @@ -0,0 +1,14 @@ +it("should run", function() { + var a = require("a"); + expect(a).toBe("a"); + var b = require("b"); + expect(b).toBe("b"); + var c = require("c"); + expect(c).toBe("c"); + var d = require("d"); + expect(d).toBe("d"); +}); + +it("should be main", function() { + expect(require.main).toBe(module); +}); diff --git a/test/configCases/split-chunks-common/target-node/node_modules/a.js b/test/configCases/split-chunks-common/target-node/node_modules/a.js new file mode 100644 index 00000000000..6cd1d0075d4 --- /dev/null +++ b/test/configCases/split-chunks-common/target-node/node_modules/a.js @@ -0,0 +1 @@ +module.exports = "a"; diff --git a/test/configCases/split-chunks-common/target-node/node_modules/b.js b/test/configCases/split-chunks-common/target-node/node_modules/b.js new file mode 100644 index 00000000000..dfbbeb621fa --- /dev/null +++ b/test/configCases/split-chunks-common/target-node/node_modules/b.js @@ -0,0 +1 @@ +module.exports = "b"; diff --git a/test/configCases/split-chunks-common/target-node/node_modules/c.js b/test/configCases/split-chunks-common/target-node/node_modules/c.js new file mode 100644 index 00000000000..f55ffed587c --- /dev/null +++ b/test/configCases/split-chunks-common/target-node/node_modules/c.js @@ -0,0 +1 @@ +module.exports = "c"; diff --git a/test/configCases/split-chunks-common/target-node/node_modules/d.js b/test/configCases/split-chunks-common/target-node/node_modules/d.js new file mode 100644 index 00000000000..0a281018ca1 --- /dev/null +++ b/test/configCases/split-chunks-common/target-node/node_modules/d.js @@ -0,0 +1 @@ +module.exports = "d"; diff --git a/test/configCases/split-chunks-common/target-node/test.config.js b/test/configCases/split-chunks-common/target-node/test.config.js new file mode 100644 index 00000000000..9b06a7f2cc0 --- /dev/null +++ b/test/configCases/split-chunks-common/target-node/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return [`./${options.name}-main.js`]; + } +}; diff --git a/test/configCases/split-chunks-common/target-node/webpack.config.js b/test/configCases/split-chunks-common/target-node/webpack.config.js new file mode 100644 index 00000000000..33b27c09e06 --- /dev/null +++ b/test/configCases/split-chunks-common/target-node/webpack.config.js @@ -0,0 +1,47 @@ +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + name: "default", + entry: "./index", + target: "node", + output: { + filename: "default-[name].js", + libraryTarget: "commonjs2" + }, + optimization: { + splitChunks: { + minSize: 1, + chunks: "all" + } + } + }, + { + name: "many-vendors", + entry: "./index", + target: "node", + output: { + filename: "many-vendors-[name].js", + libraryTarget: "commonjs2" + }, + optimization: { + splitChunks: { + minSize: 1, + chunks: "all", + maxInitialRequests: Infinity, + cacheGroups: { + default: false, + defaultVendors: false, + vendors: { + test: /node_modules/, + name: m => { + const match = + /** @type {string} */ + (m.nameForCondition()).match(/([b-d]+)\.js$/); + if (match) return `vendors-${match[1]}`; + } + } + } + } + } + } +]; diff --git a/test/configCases/split-chunks/asnyc-entries/chunk.js b/test/configCases/split-chunks/asnyc-entries/chunk.js new file mode 100644 index 00000000000..3a0b527ffb8 --- /dev/null +++ b/test/configCases/split-chunks/asnyc-entries/chunk.js @@ -0,0 +1,3 @@ +export function upper(str) { + return str.toUpperCase(); +} diff --git a/test/configCases/split-chunks/asnyc-entries/index.js b/test/configCases/split-chunks/asnyc-entries/index.js new file mode 100644 index 00000000000..6d110da92e8 --- /dev/null +++ b/test/configCases/split-chunks/asnyc-entries/index.js @@ -0,0 +1,13 @@ +import { Worker } from "worker_threads"; + +it("should generate valid code when entrypoints are flagged side-effect-free", async () => { + const worker = new Worker(new URL("./worker.js", import.meta.url)); + worker.postMessage("ok"); + const result = await new Promise(resolve => { + worker.on("message", data => { + resolve(data); + }); + }); + expect(result).toBe("data: OK, value: 42, thanks"); + await worker.terminate(); +}); diff --git a/test/configCases/split-chunks/asnyc-entries/module.js b/test/configCases/split-chunks/asnyc-entries/module.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/configCases/split-chunks/asnyc-entries/module.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/configCases/split-chunks/asnyc-entries/package.json b/test/configCases/split-chunks/asnyc-entries/package.json new file mode 100644 index 00000000000..a43829151e1 --- /dev/null +++ b/test/configCases/split-chunks/asnyc-entries/package.json @@ -0,0 +1,3 @@ +{ + "sideEffects": false +} diff --git a/test/configCases/split-chunks/asnyc-entries/test.config.js b/test/configCases/split-chunks/asnyc-entries/test.config.js new file mode 100644 index 00000000000..0c4cdb95323 --- /dev/null +++ b/test/configCases/split-chunks/asnyc-entries/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["main.js"]; + } +}; diff --git a/test/configCases/split-chunks/asnyc-entries/test.filter.js b/test/configCases/split-chunks/asnyc-entries/test.filter.js new file mode 100644 index 00000000000..ebb72dc3601 --- /dev/null +++ b/test/configCases/split-chunks/asnyc-entries/test.filter.js @@ -0,0 +1,6 @@ +// eslint-disable-next-line n/no-unpublished-require +const supportsWorker = require("../../../helpers/supportsWorker"); + +module.exports = function (config) { + return supportsWorker(); +}; diff --git a/test/configCases/split-chunks/asnyc-entries/webpack.config.js b/test/configCases/split-chunks/asnyc-entries/webpack.config.js new file mode 100644 index 00000000000..aaf5279b801 --- /dev/null +++ b/test/configCases/split-chunks/asnyc-entries/webpack.config.js @@ -0,0 +1,5 @@ +module.exports = { + output: { + filename: "[name].js" + } +}; diff --git a/test/configCases/split-chunks/asnyc-entries/worker.js b/test/configCases/split-chunks/asnyc-entries/worker.js new file mode 100644 index 00000000000..c3ad8998acf --- /dev/null +++ b/test/configCases/split-chunks/asnyc-entries/worker.js @@ -0,0 +1,7 @@ +import { parentPort } from "worker_threads"; +import value from "./module"; + +parentPort.on("message", async data => { + const { upper } = await import("./chunk"); + parentPort.postMessage(`data: ${upper(data)}, value: ${value}, thanks`); +}); diff --git a/test/configCases/split-chunks/chunk-filename-delimiter-default/b.js b/test/configCases/split-chunks/chunk-filename-delimiter-default/b.js index a072377a0c4..e590c47c973 100644 --- a/test/configCases/split-chunks/chunk-filename-delimiter-default/b.js +++ b/test/configCases/split-chunks/chunk-filename-delimiter-default/b.js @@ -1,3 +1,4 @@ const c = require("./commons"); +require("./c"); module.exports = "b" + c; diff --git a/test/configCases/split-chunks/chunk-filename-delimiter-default/index.js b/test/configCases/split-chunks/chunk-filename-delimiter-default/index.js index 0b3d46fd340..653a17d44d5 100644 --- a/test/configCases/split-chunks/chunk-filename-delimiter-default/index.js +++ b/test/configCases/split-chunks/chunk-filename-delimiter-default/index.js @@ -1,14 +1,10 @@ -it("should run", function() { - Promise.all( - [ - import(/* webpackChunkName: "a" */ "./a"), - import(/* webpackChunkName: "b" */ "./b"), - import(/* webpackChunkName: "c" */ "./c") - ] - ); - +it("should run", function () { const files = require("fs").readdirSync(__dirname); - const hasFile = files.indexOf('a~b~c.bundle.js') !== -1; + expect(files).toContain("a.bundle.js"); + expect(files).toContain("b-b_js-c441f481.bundle.js"); - expect(hasFile).toBe(true); + return Promise.all([ + import(/* webpackChunkName: "a" */ "./a"), + import(/* webpackChunkName: "b" */ "./b") + ]); }); diff --git a/test/configCases/split-chunks/chunk-filename-delimiter-default/test.config.js b/test/configCases/split-chunks/chunk-filename-delimiter-default/test.config.js index 65ddf7b1d77..0c4cdb95323 100644 --- a/test/configCases/split-chunks/chunk-filename-delimiter-default/test.config.js +++ b/test/configCases/split-chunks/chunk-filename-delimiter-default/test.config.js @@ -1,5 +1,5 @@ module.exports = { - findBundle: function(i, options) { + findBundle(i, options) { return ["main.js"]; } }; diff --git a/test/configCases/split-chunks/chunk-filename-delimiter-default/webpack.config.js b/test/configCases/split-chunks/chunk-filename-delimiter-default/webpack.config.js index e5f361c51ef..5dbdb640985 100644 --- a/test/configCases/split-chunks/chunk-filename-delimiter-default/webpack.config.js +++ b/test/configCases/split-chunks/chunk-filename-delimiter-default/webpack.config.js @@ -1,4 +1,6 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { + mode: "development", entry: { main: "./index" }, @@ -9,11 +11,18 @@ module.exports = { output: { filename: "[name].js", chunkFilename: "[name].bundle.js", - jsonpFunction: "_load_chunk" + chunkLoadingGlobal: "_load_chunk" }, optimization: { splitChunks: { - minSize: 1 + cacheGroups: { + async: { + chunks: "async", + reuseExistingChunk: true, + minSize: 1, + maxSize: 1 + } + } } } }; diff --git a/test/configCases/split-chunks/chunk-filename-delimiter/b.js b/test/configCases/split-chunks/chunk-filename-delimiter/b.js index a072377a0c4..e590c47c973 100644 --- a/test/configCases/split-chunks/chunk-filename-delimiter/b.js +++ b/test/configCases/split-chunks/chunk-filename-delimiter/b.js @@ -1,3 +1,4 @@ const c = require("./commons"); +require("./c"); module.exports = "b" + c; diff --git a/test/configCases/split-chunks/chunk-filename-delimiter/index.js b/test/configCases/split-chunks/chunk-filename-delimiter/index.js index c0179cf77c7..524184c6340 100644 --- a/test/configCases/split-chunks/chunk-filename-delimiter/index.js +++ b/test/configCases/split-chunks/chunk-filename-delimiter/index.js @@ -1,14 +1,10 @@ -it("should run", function() { - Promise.all( - [ - import(/* webpackChunkName: "a" */ "./a"), - import(/* webpackChunkName: "b" */ "./b"), - import(/* webpackChunkName: "c" */ "./c") - ] - ); - +it("should run", function () { const files = require("fs").readdirSync(__dirname); - const hasFile = files.indexOf('a-b-c.bundle.js') !== -1; + expect(files).toContain("a.bundle.js"); + expect(files).toContain("b---b_js---c441f481.bundle.js"); - expect(hasFile).toBe(true); + return Promise.all([ + import(/* webpackChunkName: "a" */ "./a"), + import(/* webpackChunkName: "b" */ "./b") + ]); }); diff --git a/test/configCases/split-chunks/chunk-filename-delimiter/test.config.js b/test/configCases/split-chunks/chunk-filename-delimiter/test.config.js index 65ddf7b1d77..0c4cdb95323 100644 --- a/test/configCases/split-chunks/chunk-filename-delimiter/test.config.js +++ b/test/configCases/split-chunks/chunk-filename-delimiter/test.config.js @@ -1,5 +1,5 @@ module.exports = { - findBundle: function(i, options) { + findBundle(i, options) { return ["main.js"]; } }; diff --git a/test/configCases/split-chunks/chunk-filename-delimiter/webpack.config.js b/test/configCases/split-chunks/chunk-filename-delimiter/webpack.config.js index 2a3cd9423d4..e28f3cb635d 100644 --- a/test/configCases/split-chunks/chunk-filename-delimiter/webpack.config.js +++ b/test/configCases/split-chunks/chunk-filename-delimiter/webpack.config.js @@ -1,4 +1,6 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { + mode: "development", entry: { main: "./index" }, @@ -9,12 +11,19 @@ module.exports = { output: { filename: "[name].js", chunkFilename: "[name].bundle.js", - jsonpFunction: "_load_chunk" + chunkLoadingGlobal: "_load_chunk" }, optimization: { splitChunks: { - automaticNameDelimiter: "-", - minSize: 1 + cacheGroups: { + async: { + chunks: "async", + automaticNameDelimiter: "---", + reuseExistingChunk: true, + minSize: 1, + maxSize: 1 + } + } } } }; diff --git a/test/configCases/split-chunks/custom-filename-function/a.js b/test/configCases/split-chunks/custom-filename-function/a.js new file mode 100644 index 00000000000..b58e8365417 --- /dev/null +++ b/test/configCases/split-chunks/custom-filename-function/a.js @@ -0,0 +1,13 @@ +import "./shared1"; +import "./common1"; + +it("should be able to load the split chunk on demand (shared)", () => { + return import(/* webpackChunkName: "theName" */ "./shared2"); +}); + +it("should be able to load the split chunk on demand (common)", () => { + return Promise.all([ + import(/* webpackChunkName: "otherName1" */ "./common2"), + import(/* webpackChunkName: "otherName2" */ "./common3") + ]); +}); diff --git a/test/configCases/split-chunks/custom-filename-function/b.js b/test/configCases/split-chunks/custom-filename-function/b.js new file mode 100644 index 00000000000..f7422f1f99e --- /dev/null +++ b/test/configCases/split-chunks/custom-filename-function/b.js @@ -0,0 +1,5 @@ +import "./shared1"; +import "./shared2"; +import "./common1"; +import "./common2"; +import "./common3"; diff --git a/test/configCases/split-chunks/custom-filename-function/common1.js b/test/configCases/split-chunks/custom-filename-function/common1.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-function/common2.js b/test/configCases/split-chunks/custom-filename-function/common2.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-function/common3.js b/test/configCases/split-chunks/custom-filename-function/common3.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-function/shared1.js b/test/configCases/split-chunks/custom-filename-function/shared1.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-function/shared2.js b/test/configCases/split-chunks/custom-filename-function/shared2.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-function/test.config.js b/test/configCases/split-chunks/custom-filename-function/test.config.js new file mode 100644 index 00000000000..af4691d7848 --- /dev/null +++ b/test/configCases/split-chunks/custom-filename-function/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["a.js"]; + } +}; diff --git a/test/configCases/split-chunks/custom-filename-function/webpack.config.js b/test/configCases/split-chunks/custom-filename-function/webpack.config.js new file mode 100644 index 00000000000..e83ba6c8245 --- /dev/null +++ b/test/configCases/split-chunks/custom-filename-function/webpack.config.js @@ -0,0 +1,33 @@ +/** @typedef {import("../../../../").Chunk} Chunk */ + +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + a: "./a", + b: "./b" + }, + output: { + filename: data => + `${/** @type {Chunk} */ (data.chunk).name || /** @type {Chunk} */ (data.chunk).id}.js`, + libraryTarget: "commonjs2" + }, + optimization: { + chunkIds: "named", + splitChunks: { + cacheGroups: { + shared: { + chunks: "all", + test: /shared/, + filename: data => + `shared-${/** @type {Chunk} */ (data.chunk).name || /** @type {Chunk} */ (data.chunk).id}.js`, + enforce: true + }, + common: { + chunks: "all", + test: /common/, + enforce: true + } + } + } + } +}; diff --git a/test/configCases/split-chunks/custom-filename-many-custom/a.js b/test/configCases/split-chunks/custom-filename-many-custom/a.js new file mode 100644 index 00000000000..8096b604f53 --- /dev/null +++ b/test/configCases/split-chunks/custom-filename-many-custom/a.js @@ -0,0 +1,7 @@ +it("should be able to load the split chunk on demand (shared)", () => { + return import(`./shared/${Math.floor(Math.random() * 20)}.js`); +}); + +it("should be able to load the split chunk on demand (common)", () => { + return import(`./common/${Math.floor(Math.random() * 2)}.js`); +}); diff --git a/test/configCases/split-chunks/custom-filename-many-custom/b.js b/test/configCases/split-chunks/custom-filename-many-custom/b.js new file mode 100644 index 00000000000..dfd43e75797 --- /dev/null +++ b/test/configCases/split-chunks/custom-filename-many-custom/b.js @@ -0,0 +1,23 @@ +import "./shared/0"; +import "./shared/1"; +import "./shared/2"; +import "./shared/3"; +import "./shared/4"; +import "./shared/5"; +import "./shared/6"; +import "./shared/7"; +import "./shared/8"; +import "./shared/9"; +import "./shared/10"; +import "./shared/11"; +import "./shared/12"; +import "./shared/13"; +import "./shared/14"; +import "./shared/15"; +import "./shared/16"; +import "./shared/17"; +import "./shared/18"; +import "./shared/19"; + +import "./common/0"; +import "./common/1"; diff --git a/test/configCases/split-chunks/custom-filename-many-custom/common/0.js b/test/configCases/split-chunks/custom-filename-many-custom/common/0.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-many-custom/common/1.js b/test/configCases/split-chunks/custom-filename-many-custom/common/1.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-many-custom/shared/0.js b/test/configCases/split-chunks/custom-filename-many-custom/shared/0.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-many-custom/shared/1.js b/test/configCases/split-chunks/custom-filename-many-custom/shared/1.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-many-custom/shared/10.js b/test/configCases/split-chunks/custom-filename-many-custom/shared/10.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-many-custom/shared/11.js b/test/configCases/split-chunks/custom-filename-many-custom/shared/11.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-many-custom/shared/12.js b/test/configCases/split-chunks/custom-filename-many-custom/shared/12.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-many-custom/shared/13.js b/test/configCases/split-chunks/custom-filename-many-custom/shared/13.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-many-custom/shared/14.js b/test/configCases/split-chunks/custom-filename-many-custom/shared/14.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-many-custom/shared/15.js b/test/configCases/split-chunks/custom-filename-many-custom/shared/15.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-many-custom/shared/16.js b/test/configCases/split-chunks/custom-filename-many-custom/shared/16.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-many-custom/shared/17.js b/test/configCases/split-chunks/custom-filename-many-custom/shared/17.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-many-custom/shared/18.js b/test/configCases/split-chunks/custom-filename-many-custom/shared/18.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-many-custom/shared/19.js b/test/configCases/split-chunks/custom-filename-many-custom/shared/19.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-many-custom/shared/2.js b/test/configCases/split-chunks/custom-filename-many-custom/shared/2.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-many-custom/shared/3.js b/test/configCases/split-chunks/custom-filename-many-custom/shared/3.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-many-custom/shared/4.js b/test/configCases/split-chunks/custom-filename-many-custom/shared/4.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-many-custom/shared/5.js b/test/configCases/split-chunks/custom-filename-many-custom/shared/5.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-many-custom/shared/6.js b/test/configCases/split-chunks/custom-filename-many-custom/shared/6.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-many-custom/shared/7.js b/test/configCases/split-chunks/custom-filename-many-custom/shared/7.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-many-custom/shared/8.js b/test/configCases/split-chunks/custom-filename-many-custom/shared/8.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-many-custom/shared/9.js b/test/configCases/split-chunks/custom-filename-many-custom/shared/9.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename-many-custom/test.config.js b/test/configCases/split-chunks/custom-filename-many-custom/test.config.js new file mode 100644 index 00000000000..af4691d7848 --- /dev/null +++ b/test/configCases/split-chunks/custom-filename-many-custom/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["a.js"]; + } +}; diff --git a/test/configCases/split-chunks/custom-filename-many-custom/webpack.config.js b/test/configCases/split-chunks/custom-filename-many-custom/webpack.config.js new file mode 100644 index 00000000000..46accefd651 --- /dev/null +++ b/test/configCases/split-chunks/custom-filename-many-custom/webpack.config.js @@ -0,0 +1,29 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + a: "./a", + b: "./b" + }, + output: { + filename: "[name].js", + libraryTarget: "commonjs2" + }, + optimization: { + chunkIds: "named", + splitChunks: { + cacheGroups: { + shared: { + chunks: "all", + test: /shared/, + filename: "shared-[name].js", + enforce: true + }, + common: { + chunks: "all", + test: /common/, + enforce: true + } + } + } + } +}; diff --git a/test/configCases/split-chunks/custom-filename/a.js b/test/configCases/split-chunks/custom-filename/a.js new file mode 100644 index 00000000000..b58e8365417 --- /dev/null +++ b/test/configCases/split-chunks/custom-filename/a.js @@ -0,0 +1,13 @@ +import "./shared1"; +import "./common1"; + +it("should be able to load the split chunk on demand (shared)", () => { + return import(/* webpackChunkName: "theName" */ "./shared2"); +}); + +it("should be able to load the split chunk on demand (common)", () => { + return Promise.all([ + import(/* webpackChunkName: "otherName1" */ "./common2"), + import(/* webpackChunkName: "otherName2" */ "./common3") + ]); +}); diff --git a/test/configCases/split-chunks/custom-filename/b.js b/test/configCases/split-chunks/custom-filename/b.js new file mode 100644 index 00000000000..f7422f1f99e --- /dev/null +++ b/test/configCases/split-chunks/custom-filename/b.js @@ -0,0 +1,5 @@ +import "./shared1"; +import "./shared2"; +import "./common1"; +import "./common2"; +import "./common3"; diff --git a/test/configCases/split-chunks/custom-filename/common1.js b/test/configCases/split-chunks/custom-filename/common1.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename/common2.js b/test/configCases/split-chunks/custom-filename/common2.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename/common3.js b/test/configCases/split-chunks/custom-filename/common3.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename/shared1.js b/test/configCases/split-chunks/custom-filename/shared1.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename/shared2.js b/test/configCases/split-chunks/custom-filename/shared2.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/custom-filename/test.config.js b/test/configCases/split-chunks/custom-filename/test.config.js new file mode 100644 index 00000000000..af4691d7848 --- /dev/null +++ b/test/configCases/split-chunks/custom-filename/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["a.js"]; + } +}; diff --git a/test/configCases/split-chunks/custom-filename/webpack.config.js b/test/configCases/split-chunks/custom-filename/webpack.config.js new file mode 100644 index 00000000000..46accefd651 --- /dev/null +++ b/test/configCases/split-chunks/custom-filename/webpack.config.js @@ -0,0 +1,29 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + a: "./a", + b: "./b" + }, + output: { + filename: "[name].js", + libraryTarget: "commonjs2" + }, + optimization: { + chunkIds: "named", + splitChunks: { + cacheGroups: { + shared: { + chunks: "all", + test: /shared/, + filename: "shared-[name].js", + enforce: true + }, + common: { + chunks: "all", + test: /common/, + enforce: true + } + } + } + } +}; diff --git a/test/configCases/split-chunks/entry-point-error/errors.js b/test/configCases/split-chunks/entry-point-error/errors.js new file mode 100644 index 00000000000..f8d7dc2e33b --- /dev/null +++ b/test/configCases/split-chunks/entry-point-error/errors.js @@ -0,0 +1 @@ +module.exports = [[/SplitChunksPlugin/, /Both have the same name "vendors"/]]; diff --git a/test/configCases/split-chunks/entry-point-error/index.js b/test/configCases/split-chunks/entry-point-error/index.js new file mode 100644 index 00000000000..4f0781ba443 --- /dev/null +++ b/test/configCases/split-chunks/entry-point-error/index.js @@ -0,0 +1,5 @@ +import m from "./module"; + +it("should emit correct errors", () => { + console.log.bind(console, m); +}); diff --git a/test/configCases/split-chunks/entry-point-error/module.js b/test/configCases/split-chunks/entry-point-error/module.js new file mode 100644 index 00000000000..503bca78c72 --- /dev/null +++ b/test/configCases/split-chunks/entry-point-error/module.js @@ -0,0 +1 @@ +export default "module"; diff --git a/test/configCases/split-chunks/entry-point-error/test.config.js b/test/configCases/split-chunks/entry-point-error/test.config.js new file mode 100644 index 00000000000..024c0caeda3 --- /dev/null +++ b/test/configCases/split-chunks/entry-point-error/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["vendors.js", "main.js"]; + } +}; diff --git a/test/configCases/split-chunks/entry-point-error/webpack.config.js b/test/configCases/split-chunks/entry-point-error/webpack.config.js new file mode 100644 index 00000000000..d7a3de190bd --- /dev/null +++ b/test/configCases/split-chunks/entry-point-error/webpack.config.js @@ -0,0 +1,24 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + vendors: ["./module"], + main: "./index" + }, + target: "web", + output: { + filename: "[name].js" + }, + optimization: { + emitOnErrors: true, + splitChunks: { + cacheGroups: { + vendors: { + test: /module/, + chunks: "all", + name: "vendors", + enforce: true + } + } + } + } +}; diff --git a/test/configCases/split-chunks/incorrect-chunk-reuse/webpack.config.js b/test/configCases/split-chunks/incorrect-chunk-reuse/webpack.config.js index 9c635ed7c4f..5704fc5c569 100644 --- a/test/configCases/split-chunks/incorrect-chunk-reuse/webpack.config.js +++ b/test/configCases/split-chunks/incorrect-chunk-reuse/webpack.config.js @@ -1,5 +1,6 @@ const path = require("path"); +/** @type {import("../../../../").Configuration} */ module.exports = { entry: "./index", optimization: { diff --git a/test/configCases/split-chunks/issue-11337/a.js b/test/configCases/split-chunks/issue-11337/a.js new file mode 100644 index 00000000000..2f395069e29 --- /dev/null +++ b/test/configCases/split-chunks/issue-11337/a.js @@ -0,0 +1 @@ +import "./module1"; diff --git a/test/configCases/split-chunks/issue-11337/b.js b/test/configCases/split-chunks/issue-11337/b.js new file mode 100644 index 00000000000..09458b3061a --- /dev/null +++ b/test/configCases/split-chunks/issue-11337/b.js @@ -0,0 +1,2 @@ +import "./module1"; +import "./module2"; diff --git a/test/configCases/split-chunks/issue-11337/index.js b/test/configCases/split-chunks/issue-11337/index.js new file mode 100644 index 00000000000..38fdc8a741c --- /dev/null +++ b/test/configCases/split-chunks/issue-11337/index.js @@ -0,0 +1,2 @@ +it("should compile and evaluate fine", () => + Promise.all([import("./a"), import("./b")])); diff --git a/test/configCases/split-chunks/issue-11337/module1.js b/test/configCases/split-chunks/issue-11337/module1.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/issue-11337/module2.js b/test/configCases/split-chunks/issue-11337/module2.js new file mode 100644 index 00000000000..c0a83183716 --- /dev/null +++ b/test/configCases/split-chunks/issue-11337/module2.js @@ -0,0 +1 @@ +// 2 diff --git a/test/configCases/split-chunks/issue-11337/webpack.config.js b/test/configCases/split-chunks/issue-11337/webpack.config.js new file mode 100644 index 00000000000..c892fa337dc --- /dev/null +++ b/test/configCases/split-chunks/issue-11337/webpack.config.js @@ -0,0 +1,21 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + splitChunks: { + cacheGroups: { + first: { + test: /module1/, + name: "named", + enforce: true, + priority: 100 + }, + second: { + test: /module(1|2)/, + name: "named", + enforce: true, + priority: 50 + } + } + } + } +}; diff --git a/test/configCases/split-chunks/issue-11513/big-module.js b/test/configCases/split-chunks/issue-11513/big-module.js new file mode 100644 index 00000000000..4044b07f7ae --- /dev/null +++ b/test/configCases/split-chunks/issue-11513/big-module.js @@ -0,0 +1,5 @@ +export default "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; diff --git a/test/configCases/split-chunks/issue-11513/chunk1.js b/test/configCases/split-chunks/issue-11513/chunk1.js new file mode 100644 index 00000000000..263a8e156bd --- /dev/null +++ b/test/configCases/split-chunks/issue-11513/chunk1.js @@ -0,0 +1,4 @@ +import b from "./big-module"; +import { add } from "./wasm.wat"; + +export default b + add; diff --git a/test/configCases/split-chunks/issue-11513/chunk2.js b/test/configCases/split-chunks/issue-11513/chunk2.js new file mode 100644 index 00000000000..263a8e156bd --- /dev/null +++ b/test/configCases/split-chunks/issue-11513/chunk2.js @@ -0,0 +1,4 @@ +import b from "./big-module"; +import { add } from "./wasm.wat"; + +export default b + add; diff --git a/test/configCases/split-chunks/issue-11513/index.js b/test/configCases/split-chunks/issue-11513/index.js new file mode 100644 index 00000000000..1988e1d16a1 --- /dev/null +++ b/test/configCases/split-chunks/issue-11513/index.js @@ -0,0 +1,2 @@ +it("should handle mixed size types chunk in splitChunks", () => + Promise.all([import("./chunk1"), import("./chunk2")])); diff --git a/test/configCases/split-chunks/issue-11513/test.config.js b/test/configCases/split-chunks/issue-11513/test.config.js new file mode 100644 index 00000000000..24317dca740 --- /dev/null +++ b/test/configCases/split-chunks/issue-11513/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["test.js", "main.js"]; + } +}; diff --git a/test/configCases/split-chunks/issue-11513/wasm.wat b/test/configCases/split-chunks/issue-11513/wasm.wat new file mode 100644 index 00000000000..88f94a01efa --- /dev/null +++ b/test/configCases/split-chunks/issue-11513/wasm.wat @@ -0,0 +1,9 @@ +(module + (func $add (export "add") (param $p0 i32) (param $p1 i32) (result i32) + (i32.add + (get_local $p0) + (get_local $p1) + ) + ) +) + diff --git a/test/configCases/split-chunks/issue-11513/webpack.config.js b/test/configCases/split-chunks/issue-11513/webpack.config.js new file mode 100644 index 00000000000..3ed14c215ce --- /dev/null +++ b/test/configCases/split-chunks/issue-11513/webpack.config.js @@ -0,0 +1,33 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: "./index", + module: { + rules: [ + { + test: /\.wat$/, + loader: "wast-loader", + type: "webassembly/async" + } + ] + }, + output: { + filename: "[name].js" + }, + optimization: { + splitChunks: { + cacheGroups: { + test: { + name: "test", + minChunks: 2, + minSize: { + javascript: 100, + webassembly: 100 + } + } + } + } + }, + experiments: { + asyncWebAssembly: true + } +}; diff --git a/test/configCases/split-chunks/issue-12307/a-only-module.js b/test/configCases/split-chunks/issue-12307/a-only-module.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/issue-12307/a.js b/test/configCases/split-chunks/issue-12307/a.js new file mode 100644 index 00000000000..62ba2bbb47a --- /dev/null +++ b/test/configCases/split-chunks/issue-12307/a.js @@ -0,0 +1,2 @@ +import "./a-only-module"; +import "./shared-module"; diff --git a/test/configCases/split-chunks/issue-12307/b.js b/test/configCases/split-chunks/issue-12307/b.js new file mode 100644 index 00000000000..181dd93c0d0 --- /dev/null +++ b/test/configCases/split-chunks/issue-12307/b.js @@ -0,0 +1 @@ +import("./shared-module"); diff --git a/test/configCases/split-chunks/issue-12307/index.js b/test/configCases/split-chunks/issue-12307/index.js new file mode 100644 index 00000000000..4ca0b89ecb4 --- /dev/null +++ b/test/configCases/split-chunks/issue-12307/index.js @@ -0,0 +1,4 @@ +it("should not split the shared-modules into a separate chunk", () => { + const shared = __STATS__.modules.find(m => m.name.includes("shared-module")); + expect(shared.chunks).toEqual(["a", "shared-module_js"]); +}); diff --git a/test/configCases/split-chunks/issue-12307/shared-module.js b/test/configCases/split-chunks/issue-12307/shared-module.js new file mode 100644 index 00000000000..9cc8c7e2fa3 --- /dev/null +++ b/test/configCases/split-chunks/issue-12307/shared-module.js @@ -0,0 +1 @@ +// content content content content content content content content content diff --git a/test/configCases/split-chunks/issue-12307/webpack.config.js b/test/configCases/split-chunks/issue-12307/webpack.config.js new file mode 100644 index 00000000000..9b3b9ad5d81 --- /dev/null +++ b/test/configCases/split-chunks/issue-12307/webpack.config.js @@ -0,0 +1,29 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + bundle0: "./index", + a: "./a", + b: "./b" + }, + output: { + filename: "[name].js" + }, + optimization: { + chunkIds: "named", + sideEffects: false, + splitChunks: { + cacheGroups: { + default: false, + defaultVendors: false, + test: { + test: /shared/, + minChunks: 1, + usedExports: false, + chunks: "initial", + minSize: 100, + minRemainingSize: 0 + } + } + } + } +}; diff --git a/test/configCases/split-chunks/issue-17332/bar.js b/test/configCases/split-chunks/issue-17332/bar.js new file mode 100644 index 00000000000..599df63e085 --- /dev/null +++ b/test/configCases/split-chunks/issue-17332/bar.js @@ -0,0 +1 @@ +export default 'bar.js' diff --git a/test/configCases/split-chunks/issue-17332/foo.js b/test/configCases/split-chunks/issue-17332/foo.js new file mode 100644 index 00000000000..8fa319b1286 --- /dev/null +++ b/test/configCases/split-chunks/issue-17332/foo.js @@ -0,0 +1,3 @@ +import './bar' + +export default 'foo.js' diff --git a/test/configCases/split-chunks/issue-17332/index.js b/test/configCases/split-chunks/issue-17332/index.js new file mode 100644 index 00000000000..a1548d975c7 --- /dev/null +++ b/test/configCases/split-chunks/issue-17332/index.js @@ -0,0 +1,7 @@ +it('should run', async () => { + await import(/* webpackChunkName: "foo" */ "./foo"); + + const bar = __STATS__.modules.find(m => m.name.includes("bar.js")); + + expect(bar.chunks).toEqual(["split-foo"]); +}) diff --git a/test/configCases/split-chunks/issue-17332/test.config.js b/test/configCases/split-chunks/issue-17332/test.config.js new file mode 100644 index 00000000000..33308d294a8 --- /dev/null +++ b/test/configCases/split-chunks/issue-17332/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["split-foo.js", "foo.js", "main.js"]; + } +}; diff --git a/test/configCases/split-chunks/issue-17332/webpack.config.js b/test/configCases/split-chunks/issue-17332/webpack.config.js new file mode 100644 index 00000000000..7039d77ada1 --- /dev/null +++ b/test/configCases/split-chunks/issue-17332/webpack.config.js @@ -0,0 +1,24 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + entry: { + main: "./index" + }, + output: { + filename: "[name].js" + }, + optimization: { + splitChunks: { + cacheGroups: { + default: false, + defaultVendors: false, + bar: { + chunks: /foo/, + test: /bar\.js/, + name: "split-foo", + minSize: 1 + } + } + } + } +}; diff --git a/test/configCases/split-chunks/issue-8908/a.js b/test/configCases/split-chunks/issue-8908/a.js new file mode 100644 index 00000000000..0b4ae8567b0 --- /dev/null +++ b/test/configCases/split-chunks/issue-8908/a.js @@ -0,0 +1,3 @@ +require("./vendor/vendor-a"); + +it("should run", () => {}); \ No newline at end of file diff --git a/test/configCases/split-chunks/issue-8908/b.js b/test/configCases/split-chunks/issue-8908/b.js new file mode 100644 index 00000000000..c8ca89c4998 --- /dev/null +++ b/test/configCases/split-chunks/issue-8908/b.js @@ -0,0 +1 @@ +require("./vendor/vendor-b"); diff --git a/test/configCases/split-chunks/issue-8908/index.js b/test/configCases/split-chunks/issue-8908/index.js new file mode 100644 index 00000000000..dfc5a1f6d9f --- /dev/null +++ b/test/configCases/split-chunks/issue-8908/index.js @@ -0,0 +1,4 @@ +it("should run", function() { + var a = require("./a"); + expect(a).toBe("a"); +}); diff --git a/test/configCases/split-chunks/issue-8908/test.config.js b/test/configCases/split-chunks/issue-8908/test.config.js new file mode 100644 index 00000000000..51e90d128bf --- /dev/null +++ b/test/configCases/split-chunks/issue-8908/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["runtime.js", "vendor-a.js", "a.js"]; + } +}; diff --git a/test/configCases/split-chunks/issue-8908/vendor/vendor-a.js b/test/configCases/split-chunks/issue-8908/vendor/vendor-a.js new file mode 100644 index 00000000000..1d379a2fccd --- /dev/null +++ b/test/configCases/split-chunks/issue-8908/vendor/vendor-a.js @@ -0,0 +1 @@ +module.exports ="vendor-a"; diff --git a/test/configCases/split-chunks/issue-8908/vendor/vendor-b.js b/test/configCases/split-chunks/issue-8908/vendor/vendor-b.js new file mode 100644 index 00000000000..495da47789b --- /dev/null +++ b/test/configCases/split-chunks/issue-8908/vendor/vendor-b.js @@ -0,0 +1,3 @@ +require("./vendor-a"); + +module.exports = "vendor-b"; diff --git a/test/configCases/split-chunks/issue-8908/webpack.config.js b/test/configCases/split-chunks/issue-8908/webpack.config.js new file mode 100644 index 00000000000..c7307692cbf --- /dev/null +++ b/test/configCases/split-chunks/issue-8908/webpack.config.js @@ -0,0 +1,30 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + a: "./a", + b: "./b" + }, + target: "web", + output: { + filename: "[name].js" + }, + optimization: { + splitChunks: { + chunks: "initial", + cacheGroups: { + a: { + test: /vendor-a/, + name: "vendor-a", + enforce: true, + priority: 1 + }, + b: { + test: /vendor/, + name: "vendor-b", + enforce: true + } + } + }, + runtimeChunk: "single" + } +}; diff --git a/test/configCases/split-chunks/issue-9491/index.js b/test/configCases/split-chunks/issue-9491/index.js new file mode 100644 index 00000000000..6068c292057 --- /dev/null +++ b/test/configCases/split-chunks/issue-9491/index.js @@ -0,0 +1 @@ +it("should compile and evaluate fine", () => {}); diff --git a/test/configCases/split-chunks/issue-9491/test.config.js b/test/configCases/split-chunks/issue-9491/test.config.js new file mode 100644 index 00000000000..69c3d55b612 --- /dev/null +++ b/test/configCases/split-chunks/issue-9491/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["runtime.js", "constructor.js"]; + } +}; diff --git a/test/configCases/split-chunks/issue-9491/webpack.config.js b/test/configCases/split-chunks/issue-9491/webpack.config.js new file mode 100644 index 00000000000..bfced90ac73 --- /dev/null +++ b/test/configCases/split-chunks/issue-9491/webpack.config.js @@ -0,0 +1,14 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + constructor: "./index" + }, + target: "web", + output: { + filename: "[name].js" + }, + optimization: { + runtimeChunk: "single", + chunkIds: "named" + } +}; diff --git a/test/configCases/split-chunks/max-size-casing/chunk.js b/test/configCases/split-chunks/max-size-casing/chunk.js new file mode 100644 index 00000000000..e3866c0c138 --- /dev/null +++ b/test/configCases/split-chunks/max-size-casing/chunk.js @@ -0,0 +1,9 @@ +import a from "./file-a1"; +import b from "./file-b1"; +import A from "./file-A2"; +import B from "./file-B2"; +export default "ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" + + a + + b + + A + + B; diff --git a/test/configCases/split-chunks/max-size-casing/file-A2.js b/test/configCases/split-chunks/max-size-casing/file-A2.js new file mode 100644 index 00000000000..befaa887ea0 --- /dev/null +++ b/test/configCases/split-chunks/max-size-casing/file-A2.js @@ -0,0 +1 @@ +export default "A2222222222222222222222"; diff --git a/test/configCases/split-chunks/max-size-casing/file-B2.js b/test/configCases/split-chunks/max-size-casing/file-B2.js new file mode 100644 index 00000000000..8f0106edcda --- /dev/null +++ b/test/configCases/split-chunks/max-size-casing/file-B2.js @@ -0,0 +1 @@ +export default "B2222222222222222222222"; diff --git a/test/configCases/split-chunks/max-size-casing/file-a1.js b/test/configCases/split-chunks/max-size-casing/file-a1.js new file mode 100644 index 00000000000..c0f08593055 --- /dev/null +++ b/test/configCases/split-chunks/max-size-casing/file-a1.js @@ -0,0 +1 @@ +export default "a1111111111111111111111"; diff --git a/test/configCases/split-chunks/max-size-casing/file-b1.js b/test/configCases/split-chunks/max-size-casing/file-b1.js new file mode 100644 index 00000000000..6627122b69d --- /dev/null +++ b/test/configCases/split-chunks/max-size-casing/file-b1.js @@ -0,0 +1 @@ +export default "b1111111111111111111111"; diff --git a/test/configCases/split-chunks/max-size-casing/index.js b/test/configCases/split-chunks/max-size-casing/index.js new file mode 100644 index 00000000000..a0f7d3295ba --- /dev/null +++ b/test/configCases/split-chunks/max-size-casing/index.js @@ -0,0 +1,10 @@ +it("should ignore case insensitive chars when generating maxSize filenames", () => + import(/* webpackChunkName: "chunk" */ "./chunk").then( + ({ default: value }) => { + expect(value).toContain("a111"); + expect(value).toContain("b111"); + expect(value).toContain("A222"); + expect(value).toContain("B222"); + expect(value).toContain("cccc"); + } + )); diff --git a/test/configCases/split-chunks/max-size-casing/test.config.js b/test/configCases/split-chunks/max-size-casing/test.config.js new file mode 100644 index 00000000000..0c4cdb95323 --- /dev/null +++ b/test/configCases/split-chunks/max-size-casing/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["main.js"]; + } +}; diff --git a/test/configCases/split-chunks/max-size-casing/webpack.config.js b/test/configCases/split-chunks/max-size-casing/webpack.config.js new file mode 100644 index 00000000000..beebf157473 --- /dev/null +++ b/test/configCases/split-chunks/max-size-casing/webpack.config.js @@ -0,0 +1,14 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + filename: "[name].js" + }, + optimization: { + chunkIds: "named", + splitChunks: { + hidePathInfo: false, + minSize: 50, + maxSize: 100 + } + } +}; diff --git a/test/configCases/split-chunks/module-type-filter/data.json b/test/configCases/split-chunks/module-type-filter/data.json new file mode 100644 index 00000000000..d086709f676 --- /dev/null +++ b/test/configCases/split-chunks/module-type-filter/data.json @@ -0,0 +1,3 @@ +{ + "value": 42 +} diff --git a/test/configCases/split-chunks/module-type-filter/index.js b/test/configCases/split-chunks/module-type-filter/index.js new file mode 100644 index 00000000000..578210208aa --- /dev/null +++ b/test/configCases/split-chunks/module-type-filter/index.js @@ -0,0 +1,5 @@ +import data from "./data.json"; + +it("should move the json module into a separate chunk", () => { + expect(data.value).toBe(42); +}); diff --git a/test/configCases/split-chunks/module-type-filter/test.config.js b/test/configCases/split-chunks/module-type-filter/test.config.js new file mode 100644 index 00000000000..23e1b263675 --- /dev/null +++ b/test/configCases/split-chunks/module-type-filter/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["json.js", "main.js"]; + } +}; diff --git a/test/configCases/split-chunks/module-type-filter/webpack.config.js b/test/configCases/split-chunks/module-type-filter/webpack.config.js new file mode 100644 index 00000000000..3b2df399f7a --- /dev/null +++ b/test/configCases/split-chunks/module-type-filter/webpack.config.js @@ -0,0 +1,22 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + main: "./index" + }, + target: "web", + output: { + filename: "[name].js" + }, + optimization: { + splitChunks: { + cacheGroups: { + json: { + name: "json", + type: "json", + chunks: "all", + enforce: true + } + } + } + } +}; diff --git a/test/configCases/split-chunks/move-to-entrypoint/chunk.js b/test/configCases/split-chunks/move-to-entrypoint/chunk.js new file mode 100644 index 00000000000..a9d3a4b3562 --- /dev/null +++ b/test/configCases/split-chunks/move-to-entrypoint/chunk.js @@ -0,0 +1,3 @@ +export { default as moduleA } from "./moduleA"; +export { default as moduleB } from "./moduleB"; +export { default as moduleC } from "./moduleC"; diff --git a/test/configCases/split-chunks/move-to-entrypoint/entryA.js b/test/configCases/split-chunks/move-to-entrypoint/entryA.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/move-to-entrypoint/entryB.js b/test/configCases/split-chunks/move-to-entrypoint/entryB.js new file mode 100644 index 00000000000..3b6952f0683 --- /dev/null +++ b/test/configCases/split-chunks/move-to-entrypoint/entryB.js @@ -0,0 +1,15 @@ +import fs from "fs"; +import path from "path"; + +it("should place the module correctly", async () => { + const { moduleA, moduleB, moduleC } = await import("./chunk"); + expect(fs.readFileSync(path.resolve(__dirname, "a.js"), "utf-8")).toContain( + moduleA + ); + expect(fs.readFileSync(path.resolve(__dirname, "b.js"), "utf-8")).toContain( + moduleB + ); + expect( + fs.readFileSync(path.resolve(__dirname, "runtime.js"), "utf-8") + ).toContain(moduleC); +}); diff --git a/test/configCases/split-chunks/move-to-entrypoint/moduleA.js b/test/configCases/split-chunks/move-to-entrypoint/moduleA.js new file mode 100644 index 00000000000..fb9169778d7 --- /dev/null +++ b/test/configCases/split-chunks/move-to-entrypoint/moduleA.js @@ -0,0 +1 @@ +export default "This is module a"; diff --git a/test/configCases/split-chunks/move-to-entrypoint/moduleB.js b/test/configCases/split-chunks/move-to-entrypoint/moduleB.js new file mode 100644 index 00000000000..fa5d6266278 --- /dev/null +++ b/test/configCases/split-chunks/move-to-entrypoint/moduleB.js @@ -0,0 +1 @@ +export default "This is module b"; diff --git a/test/configCases/split-chunks/move-to-entrypoint/moduleC.js b/test/configCases/split-chunks/move-to-entrypoint/moduleC.js new file mode 100644 index 00000000000..37a01d6e26d --- /dev/null +++ b/test/configCases/split-chunks/move-to-entrypoint/moduleC.js @@ -0,0 +1 @@ +export default "This is module c"; diff --git a/test/configCases/split-chunks/move-to-entrypoint/test.config.js b/test/configCases/split-chunks/move-to-entrypoint/test.config.js new file mode 100644 index 00000000000..60ac768dc48 --- /dev/null +++ b/test/configCases/split-chunks/move-to-entrypoint/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["runtime.js", "a.js", "b.js"]; + } +}; diff --git a/test/configCases/split-chunks/move-to-entrypoint/webpack.config.js b/test/configCases/split-chunks/move-to-entrypoint/webpack.config.js new file mode 100644 index 00000000000..01a9cfcd60c --- /dev/null +++ b/test/configCases/split-chunks/move-to-entrypoint/webpack.config.js @@ -0,0 +1,38 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + a: { + import: "./entryA", + runtime: "runtime" + }, + b: { + import: "./entryB", + dependOn: "a" + } + }, + output: { + filename: "[name].js" + }, + optimization: { + chunkIds: "named", + splitChunks: { + cacheGroups: { + a: { + test: /moduleA/, + name: "a", + enforce: true + }, + b: { + test: /moduleB/, + name: "b", + enforce: true + }, + c: { + test: /moduleC/, + name: "runtime", + enforce: true + } + } + } + } +}; diff --git a/test/configCases/split-chunks/no-name/a.js b/test/configCases/split-chunks/no-name/a.js new file mode 100644 index 00000000000..6cd1d0075d4 --- /dev/null +++ b/test/configCases/split-chunks/no-name/a.js @@ -0,0 +1 @@ +module.exports = "a"; diff --git a/test/configCases/split-chunks/no-name/index.js b/test/configCases/split-chunks/no-name/index.js new file mode 100644 index 00000000000..ad948040000 --- /dev/null +++ b/test/configCases/split-chunks/no-name/index.js @@ -0,0 +1,4 @@ +it("should work", async function() { + const a = await import(/* webpackChunkName: "chunk" */ "./a"); + expect(a.default).toBe("a"); +}); diff --git a/test/configCases/split-chunks/no-name/test.config.js b/test/configCases/split-chunks/no-name/test.config.js new file mode 100644 index 00000000000..b29ba477372 --- /dev/null +++ b/test/configCases/split-chunks/no-name/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["common-a_js.js", "main.js"]; + } +}; diff --git a/test/configCases/split-chunks/no-name/webpack.config.js b/test/configCases/split-chunks/no-name/webpack.config.js new file mode 100644 index 00000000000..2318b4ee7df --- /dev/null +++ b/test/configCases/split-chunks/no-name/webpack.config.js @@ -0,0 +1,20 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + output: { + filename: "[name].js" + }, + optimization: { + chunkIds: "named", + splitChunks: { + cacheGroups: { + common: { + name: () => {}, + test: /a\.js/, + chunks: "all", + enforce: true + } + } + } + } +}; diff --git a/test/configCases/split-chunks/no-options/test.config.js b/test/configCases/split-chunks/no-options/test.config.js index 6f3aaf93f4f..39c2883c718 100644 --- a/test/configCases/split-chunks/no-options/test.config.js +++ b/test/configCases/split-chunks/no-options/test.config.js @@ -1,5 +1,5 @@ module.exports = { - findBundle: function(i, options) { + findBundle(i, options) { return ["vendor.js", "main.js"]; } }; diff --git a/test/configCases/split-chunks/no-options/webpack.config.js b/test/configCases/split-chunks/no-options/webpack.config.js index eb349acba83..2fec23d7fed 100644 --- a/test/configCases/split-chunks/no-options/webpack.config.js +++ b/test/configCases/split-chunks/no-options/webpack.config.js @@ -1,5 +1,6 @@ -const SplitChunksPlugin = require("../../../../lib/optimize/SplitChunksPlugin"); +const { SplitChunksPlugin } = require("../../../../").optimize; +/** @type {import("../../../../").Configuration} */ module.exports = { entry: { vendor: ["./a"], diff --git a/test/configCases/split-chunks/reuse-chunk-name/b.js b/test/configCases/split-chunks/reuse-chunk-name/b.js new file mode 100644 index 00000000000..fba3204fe66 --- /dev/null +++ b/test/configCases/split-chunks/reuse-chunk-name/b.js @@ -0,0 +1 @@ +module.exports = "b"; \ No newline at end of file diff --git a/test/configCases/split-chunks/reuse-chunk-name/c.js b/test/configCases/split-chunks/reuse-chunk-name/c.js new file mode 100644 index 00000000000..ebaf7584d34 --- /dev/null +++ b/test/configCases/split-chunks/reuse-chunk-name/c.js @@ -0,0 +1 @@ +module.exports = "c"; \ No newline at end of file diff --git a/test/configCases/split-chunks/reuse-chunk-name/index.js b/test/configCases/split-chunks/reuse-chunk-name/index.js new file mode 100644 index 00000000000..283f2a7abfc --- /dev/null +++ b/test/configCases/split-chunks/reuse-chunk-name/index.js @@ -0,0 +1,4 @@ +import "./b"; +import "./c"; + +it("should compile fine", () => {}); diff --git a/test/configCases/split-chunks/reuse-chunk-name/test.config.js b/test/configCases/split-chunks/reuse-chunk-name/test.config.js new file mode 100644 index 00000000000..ad7cd7e18d1 --- /dev/null +++ b/test/configCases/split-chunks/reuse-chunk-name/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["common.js", "main.js"]; + } +}; diff --git a/test/configCases/split-chunks/reuse-chunk-name/webpack.config.js b/test/configCases/split-chunks/reuse-chunk-name/webpack.config.js new file mode 100644 index 00000000000..a31736a3908 --- /dev/null +++ b/test/configCases/split-chunks/reuse-chunk-name/webpack.config.js @@ -0,0 +1,24 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + filename: "[name].js" + }, + target: "web", + optimization: { + splitChunks: { + chunks: "all", + cacheGroups: { + b: { + test: /b\.js/, + name: "common", + enforce: true + }, + c: { + test: /c\.js/, + name: "common", + enforce: true + } + } + } + } +}; diff --git a/test/configCases/split-chunks/runtime-chunk-async-node/a.js b/test/configCases/split-chunks/runtime-chunk-async-node/a.js new file mode 100644 index 00000000000..d911612e329 --- /dev/null +++ b/test/configCases/split-chunks/runtime-chunk-async-node/a.js @@ -0,0 +1,10 @@ +import { value } from "./shared?1"; + +it("should share the instance with the other entry point", () => { + expect(value).toBe(42); +}); + +it("should be able to load the shared instance on demand", () => + import(/* webpackChunkName: "shared" */ "./shared?2").then(({ value }) => { + expect(value).toBe(24); + })); diff --git a/test/configCases/split-chunks/runtime-chunk-async-node/b.js b/test/configCases/split-chunks/runtime-chunk-async-node/b.js new file mode 100644 index 00000000000..575d6630e9e --- /dev/null +++ b/test/configCases/split-chunks/runtime-chunk-async-node/b.js @@ -0,0 +1,5 @@ +import { setValue } from "./shared?1"; +import { setValue as setValue2 } from "./shared?2"; + +setValue(42); +setValue2(24); diff --git a/test/configCases/split-chunks/runtime-chunk-async-node/c.js b/test/configCases/split-chunks/runtime-chunk-async-node/c.js new file mode 100644 index 00000000000..219565be44f --- /dev/null +++ b/test/configCases/split-chunks/runtime-chunk-async-node/c.js @@ -0,0 +1,10 @@ +beforeEach(done => { + global.it = it; + done(); +}); +afterEach(done => { + delete global.it; + done(); +}); + +it("should be able to load the other entry on demand", () => import("./a")); diff --git a/test/configCases/split-chunks/runtime-chunk-async-node/shared.js b/test/configCases/split-chunks/runtime-chunk-async-node/shared.js new file mode 100644 index 00000000000..755ee30bd7f --- /dev/null +++ b/test/configCases/split-chunks/runtime-chunk-async-node/shared.js @@ -0,0 +1,4 @@ +export let value = 0; +export function setValue(v) { + value = v; +} diff --git a/test/configCases/split-chunks/runtime-chunk-async-node/test.config.js b/test/configCases/split-chunks/runtime-chunk-async-node/test.config.js new file mode 100644 index 00000000000..fafd4ba626a --- /dev/null +++ b/test/configCases/split-chunks/runtime-chunk-async-node/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["b.js", "deep/path/a.js", "somewhere/c.js"]; + } +}; diff --git a/test/configCases/split-chunks/runtime-chunk-async-node/webpack.config.js b/test/configCases/split-chunks/runtime-chunk-async-node/webpack.config.js new file mode 100644 index 00000000000..a023f1b45f2 --- /dev/null +++ b/test/configCases/split-chunks/runtime-chunk-async-node/webpack.config.js @@ -0,0 +1,33 @@ +const path = require("path"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + "deep/path/a": "./a", + b: ["./shared?1", "./shared?2", "./b"], + "somewhere/c": "./c" + }, + target: "async-node", + output: { + filename: "[name].js", + library: { + type: "commonjs-module" + } + }, + optimization: { + chunkIds: "named", + runtimeChunk: { + name: "deep/other/path/runtime" + }, + splitChunks: { + cacheGroups: { + dep: { + chunks: "initial", + minChunks: 2, + test: path.resolve(__dirname, "shared.js"), + enforce: true + } + } + } + } +}; diff --git a/test/configCases/split-chunks/runtime-chunk-no-async/test.config.js b/test/configCases/split-chunks/runtime-chunk-no-async/test.config.js index 7eafe4ed79c..c19bed73651 100644 --- a/test/configCases/split-chunks/runtime-chunk-no-async/test.config.js +++ b/test/configCases/split-chunks/runtime-chunk-no-async/test.config.js @@ -1,7 +1,8 @@ const fs = require("fs"); + module.exports = { - findBundle: function(i, options) { - var files = fs.readdirSync(options.output.path); - return ["runtime.js", files.filter(f => /^main/.test(f))[0]]; + findBundle(i, options) { + const files = fs.readdirSync(options.output.path); + return ["runtime.js", files.find(f => f.startsWith("main"))]; } }; diff --git a/test/configCases/split-chunks/runtime-chunk-no-async/webpack.config.js b/test/configCases/split-chunks/runtime-chunk-no-async/webpack.config.js index 5f4da7943f0..b8fb043d721 100644 --- a/test/configCases/split-chunks/runtime-chunk-no-async/webpack.config.js +++ b/test/configCases/split-chunks/runtime-chunk-no-async/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { entry: { main: "./index" diff --git a/test/configCases/split-chunks/runtime-chunk-node-13130/a.js b/test/configCases/split-chunks/runtime-chunk-node-13130/a.js new file mode 100644 index 00000000000..a2faf567a26 --- /dev/null +++ b/test/configCases/split-chunks/runtime-chunk-node-13130/a.js @@ -0,0 +1,5 @@ +import { value } from "./shared?1"; + +it("should share the instance with the other entry point", () => { + expect(value).toBe(42); +}); diff --git a/test/configCases/split-chunks/runtime-chunk-node-13130/b.js b/test/configCases/split-chunks/runtime-chunk-node-13130/b.js new file mode 100644 index 00000000000..575d6630e9e --- /dev/null +++ b/test/configCases/split-chunks/runtime-chunk-node-13130/b.js @@ -0,0 +1,5 @@ +import { setValue } from "./shared?1"; +import { setValue as setValue2 } from "./shared?2"; + +setValue(42); +setValue2(24); diff --git a/test/configCases/split-chunks/runtime-chunk-node-13130/c.js b/test/configCases/split-chunks/runtime-chunk-node-13130/c.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/split-chunks/runtime-chunk-node-13130/shared.js b/test/configCases/split-chunks/runtime-chunk-node-13130/shared.js new file mode 100644 index 00000000000..755ee30bd7f --- /dev/null +++ b/test/configCases/split-chunks/runtime-chunk-node-13130/shared.js @@ -0,0 +1,4 @@ +export let value = 0; +export function setValue(v) { + value = v; +} diff --git a/test/configCases/split-chunks/runtime-chunk-node-13130/test.config.js b/test/configCases/split-chunks/runtime-chunk-node-13130/test.config.js new file mode 100644 index 00000000000..fafd4ba626a --- /dev/null +++ b/test/configCases/split-chunks/runtime-chunk-node-13130/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["b.js", "deep/path/a.js", "somewhere/c.js"]; + } +}; diff --git a/test/configCases/split-chunks/runtime-chunk-node-13130/webpack.config.js b/test/configCases/split-chunks/runtime-chunk-node-13130/webpack.config.js new file mode 100644 index 00000000000..d3650f3f156 --- /dev/null +++ b/test/configCases/split-chunks/runtime-chunk-node-13130/webpack.config.js @@ -0,0 +1,28 @@ +const path = require("path"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + "deep/path/a": "./a", + b: ["./shared?1", "./shared?2", "./b"], + "somewhere/c": "./c" + }, + target: "node", + output: { + filename: "[name].js" + }, + optimization: { + chunkIds: "named", + runtimeChunk: "single", + splitChunks: { + cacheGroups: { + dep: { + chunks: "initial", + minChunks: 2, + test: path.resolve(__dirname, "shared.js"), + enforce: true + } + } + } + } +}; diff --git a/test/configCases/split-chunks/runtime-chunk-node/a.js b/test/configCases/split-chunks/runtime-chunk-node/a.js new file mode 100644 index 00000000000..d911612e329 --- /dev/null +++ b/test/configCases/split-chunks/runtime-chunk-node/a.js @@ -0,0 +1,10 @@ +import { value } from "./shared?1"; + +it("should share the instance with the other entry point", () => { + expect(value).toBe(42); +}); + +it("should be able to load the shared instance on demand", () => + import(/* webpackChunkName: "shared" */ "./shared?2").then(({ value }) => { + expect(value).toBe(24); + })); diff --git a/test/configCases/split-chunks/runtime-chunk-node/b.js b/test/configCases/split-chunks/runtime-chunk-node/b.js new file mode 100644 index 00000000000..575d6630e9e --- /dev/null +++ b/test/configCases/split-chunks/runtime-chunk-node/b.js @@ -0,0 +1,5 @@ +import { setValue } from "./shared?1"; +import { setValue as setValue2 } from "./shared?2"; + +setValue(42); +setValue2(24); diff --git a/test/configCases/split-chunks/runtime-chunk-node/c.js b/test/configCases/split-chunks/runtime-chunk-node/c.js new file mode 100644 index 00000000000..fbf02a64c7d --- /dev/null +++ b/test/configCases/split-chunks/runtime-chunk-node/c.js @@ -0,0 +1 @@ +it("should be able to load the other entry on demand", () => import("./a")); diff --git a/test/configCases/split-chunks/runtime-chunk-node/shared.js b/test/configCases/split-chunks/runtime-chunk-node/shared.js new file mode 100644 index 00000000000..755ee30bd7f --- /dev/null +++ b/test/configCases/split-chunks/runtime-chunk-node/shared.js @@ -0,0 +1,4 @@ +export let value = 0; +export function setValue(v) { + value = v; +} diff --git a/test/configCases/split-chunks/runtime-chunk-node/test.config.js b/test/configCases/split-chunks/runtime-chunk-node/test.config.js new file mode 100644 index 00000000000..fafd4ba626a --- /dev/null +++ b/test/configCases/split-chunks/runtime-chunk-node/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["b.js", "deep/path/a.js", "somewhere/c.js"]; + } +}; diff --git a/test/configCases/split-chunks/runtime-chunk-node/webpack.config.js b/test/configCases/split-chunks/runtime-chunk-node/webpack.config.js new file mode 100644 index 00000000000..93007b2e541 --- /dev/null +++ b/test/configCases/split-chunks/runtime-chunk-node/webpack.config.js @@ -0,0 +1,30 @@ +const path = require("path"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + "deep/path/a": "./a", + b: ["./shared?1", "./shared?2", "./b"], + "somewhere/c": "./c" + }, + target: "node", + output: { + filename: "[name].js" + }, + optimization: { + chunkIds: "named", + runtimeChunk: { + name: "deep/other/path/runtime" + }, + splitChunks: { + cacheGroups: { + dep: { + chunks: "initial", + minChunks: 2, + test: path.resolve(__dirname, "shared.js"), + enforce: true + } + } + } + } +}; diff --git a/test/configCases/split-chunks/runtime-chunk/a.js b/test/configCases/split-chunks/runtime-chunk/a.js index fcae9162325..37036311828 100644 --- a/test/configCases/split-chunks/runtime-chunk/a.js +++ b/test/configCases/split-chunks/runtime-chunk/a.js @@ -2,9 +2,9 @@ it("should be able to load the split chunk on demand", () => { const promise = import(/* webpackChunkName: "shared" */ "./shared"); const script = document.head._children[0]; - expect(script.src).toBe("https://test.cases/path/dep~b~shared.js"); + expect(script.src).toBe("https://test.cases/path/dep-shared_js.js"); - __non_webpack_require__("./dep~b~shared.js"); + __non_webpack_require__("./dep-shared_js.js"); return promise; }); diff --git a/test/configCases/split-chunks/runtime-chunk/test.config.js b/test/configCases/split-chunks/runtime-chunk/test.config.js index dad54da8f4a..b00df088b2b 100644 --- a/test/configCases/split-chunks/runtime-chunk/test.config.js +++ b/test/configCases/split-chunks/runtime-chunk/test.config.js @@ -1,5 +1,5 @@ module.exports = { - findBundle: function(i, options) { + findBundle(i, options) { return ["runtime.js", "a.js"]; } }; diff --git a/test/configCases/split-chunks/runtime-chunk/webpack.config.js b/test/configCases/split-chunks/runtime-chunk/webpack.config.js index 1958da90461..180a47ff5f1 100644 --- a/test/configCases/split-chunks/runtime-chunk/webpack.config.js +++ b/test/configCases/split-chunks/runtime-chunk/webpack.config.js @@ -1,5 +1,6 @@ const path = require("path"); +/** @type {import("../../../../").Configuration} */ module.exports = { entry: { a: "./a", @@ -10,6 +11,7 @@ module.exports = { filename: "[name].js" }, optimization: { + chunkIds: "named", runtimeChunk: "single", splitChunks: { cacheGroups: { diff --git a/test/configCases/split-chunks/vendor-only-entrypoint/node_modules/vendor.js b/test/configCases/split-chunks/vendor-only-entrypoint/node_modules/vendor.js new file mode 100644 index 00000000000..2c919ad5ce7 --- /dev/null +++ b/test/configCases/split-chunks/vendor-only-entrypoint/node_modules/vendor.js @@ -0,0 +1,3 @@ +it("should create only a single chunk", () => { + expect(__STATS__.chunks.length).toBe(2); +}) diff --git a/test/configCases/split-chunks/vendor-only-entrypoint/test.config.js b/test/configCases/split-chunks/vendor-only-entrypoint/test.config.js new file mode 100644 index 00000000000..d0803add753 --- /dev/null +++ b/test/configCases/split-chunks/vendor-only-entrypoint/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["runtime~vendor.js", "vendor.js"]; + } +}; diff --git a/test/configCases/split-chunks/vendor-only-entrypoint/webpack.config.js b/test/configCases/split-chunks/vendor-only-entrypoint/webpack.config.js new file mode 100644 index 00000000000..8a122bd6db7 --- /dev/null +++ b/test/configCases/split-chunks/vendor-only-entrypoint/webpack.config.js @@ -0,0 +1,19 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + vendor: "vendor" + }, + output: { + filename: "[name].js" + }, + target: "web", + optimization: { + chunkIds: "named", + runtimeChunk: true, + splitChunks: { + chunks: "all", + minSize: 10, + enforceSizeThreshold: 20 + } + } +}; diff --git a/test/configCases/target/amd-container-named/index.js b/test/configCases/target/amd-container-named/index.js new file mode 100644 index 00000000000..9e2f3c5f328 --- /dev/null +++ b/test/configCases/target/amd-container-named/index.js @@ -0,0 +1,8 @@ +it("should run", function() {}); + +it("should name define", function() { + var fs = require("fs"); + var source = fs.readFileSync(__filename, "utf-8"); + + expect(source).toMatch("window['clientContainer'].define(\"clientContainer\","); +}); diff --git a/test/configCases/target/amd-container-named/webpack.config.js b/test/configCases/target/amd-container-named/webpack.config.js new file mode 100644 index 00000000000..d44fc56132b --- /dev/null +++ b/test/configCases/target/amd-container-named/webpack.config.js @@ -0,0 +1,22 @@ +const webpack = require("../../../../"); +/** @type {import("../../../../types").Configuration} */ +module.exports = { + output: { + library: { + type: "amd", + name: "clientContainer", + amdContainer: "window['clientContainer']" + } + }, + node: { + __dirname: false, + __filename: false + }, + plugins: [ + new webpack.BannerPlugin({ + raw: true, + banner: + "function define(name, deps, fn) { fn(); }\nconst window = {};\nwindow['clientContainer'] = { define };\n" + }) + ] +}; diff --git a/test/configCases/target/amd-container-require/index.js b/test/configCases/target/amd-container-require/index.js new file mode 100644 index 00000000000..4e06f3acc4f --- /dev/null +++ b/test/configCases/target/amd-container-require/index.js @@ -0,0 +1,8 @@ +it("should run", function() {}); + +it("should name require", function() { + var fs = nodeRequire("fs"); + var source = fs.readFileSync(__filename, "utf-8"); + + expect(source).toMatch(/window\['clientContainer'\]\.require\(\[[^\]]*\], (function)?\(/); +}); diff --git a/test/configCases/target/amd-container-require/webpack.config.js b/test/configCases/target/amd-container-require/webpack.config.js new file mode 100644 index 00000000000..1d219007109 --- /dev/null +++ b/test/configCases/target/amd-container-require/webpack.config.js @@ -0,0 +1,21 @@ +const webpack = require("../../../../"); +/** @type {import("../../../../types").Configuration} */ +module.exports = { + output: { + library: { + type: "amd-require", + amdContainer: "window['clientContainer']" + } + }, + node: { + __dirname: false, + __filename: false + }, + plugins: [ + new webpack.BannerPlugin({ + raw: true, + banner: + "var nodeRequire = require;\nvar require = function(deps, fn) { fn(); }\nconst window = {};\nwindow['clientContainer'] = { require };\n" + }) + ] +}; diff --git a/test/configCases/target/amd-container-unnamed/index.js b/test/configCases/target/amd-container-unnamed/index.js new file mode 100644 index 00000000000..7e32e39b66a --- /dev/null +++ b/test/configCases/target/amd-container-unnamed/index.js @@ -0,0 +1,8 @@ +it("should run", function() {}); + +it("should name define", function() { + var fs = require("fs"); + var source = fs.readFileSync(__filename, "utf-8"); + + expect(source).toMatch(/window\['clientContainer'\]\.define\((function)?\(/); +}); diff --git a/test/configCases/target/amd-container-unnamed/webpack.config.js b/test/configCases/target/amd-container-unnamed/webpack.config.js new file mode 100644 index 00000000000..6f82e5e8f4d --- /dev/null +++ b/test/configCases/target/amd-container-unnamed/webpack.config.js @@ -0,0 +1,21 @@ +const webpack = require("../../../../"); +/** @type {import("../../../../types").Configuration} */ +module.exports = { + output: { + library: { + type: "amd", + amdContainer: "window['clientContainer']" + } + }, + node: { + __dirname: false, + __filename: false + }, + plugins: [ + new webpack.BannerPlugin({ + raw: true, + banner: + "function define(fn) { fn(); }\nconst window = {};\nwindow['clientContainer'] = { define };\n" + }) + ] +}; diff --git a/test/configCases/target/amd-named/webpack.config.js b/test/configCases/target/amd-named/webpack.config.js index f80f8f3a0d2..42614650312 100644 --- a/test/configCases/target/amd-named/webpack.config.js +++ b/test/configCases/target/amd-named/webpack.config.js @@ -1,4 +1,5 @@ const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { output: { library: "NamedLibrary", diff --git a/test/configCases/target/amd-require/index.js b/test/configCases/target/amd-require/index.js index 16e30876019..ce47dda11eb 100644 --- a/test/configCases/target/amd-require/index.js +++ b/test/configCases/target/amd-require/index.js @@ -1,10 +1,8 @@ -it("should run", function() { - -}); +it("should run", function() {}); it("should name require", function() { var fs = nodeRequire("fs"); var source = fs.readFileSync(__filename, "utf-8"); - expect(source).toMatch(/require\(\[[^\]]*\], function\(/); + expect(source).toMatch(/require\(\[[^\]]*\], (function)?\(/); }); diff --git a/test/configCases/target/amd-require/webpack.config.js b/test/configCases/target/amd-require/webpack.config.js index 1bb3b0ac283..a280fb2a029 100644 --- a/test/configCases/target/amd-require/webpack.config.js +++ b/test/configCases/target/amd-require/webpack.config.js @@ -1,4 +1,5 @@ const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { output: { libraryTarget: "amd-require" diff --git a/test/configCases/target/amd-unnamed/index.js b/test/configCases/target/amd-unnamed/index.js index 1341eea61b2..b0bcb91d39f 100644 --- a/test/configCases/target/amd-unnamed/index.js +++ b/test/configCases/target/amd-unnamed/index.js @@ -1,10 +1,8 @@ -it("should run", function() { - -}); +it("should run", function() {}); it("should name define", function() { var fs = require("fs"); var source = fs.readFileSync(__filename, "utf-8"); - expect(source).toMatch(/define\(\[[^\]]*\], function\(/); + expect(source).toMatch(/define\((function)?\(/); }); diff --git a/test/configCases/target/amd-unnamed/webpack.config.js b/test/configCases/target/amd-unnamed/webpack.config.js index 494051b75af..25015e61039 100644 --- a/test/configCases/target/amd-unnamed/webpack.config.js +++ b/test/configCases/target/amd-unnamed/webpack.config.js @@ -1,4 +1,5 @@ const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { output: { libraryTarget: "amd" @@ -10,7 +11,7 @@ module.exports = { plugins: [ new webpack.BannerPlugin({ raw: true, - banner: "function define(deps, fn) { fn(); }\n" + banner: "function define(fn) { fn(); }\n" }) ] }; diff --git a/test/configCases/target/buffer-default/index.js b/test/configCases/target/buffer-default/index.js deleted file mode 100644 index 9f0b5f8ba42..00000000000 --- a/test/configCases/target/buffer-default/index.js +++ /dev/null @@ -1,8 +0,0 @@ -it("should provide a global Buffer shim", function () { - expect(Buffer).toBeInstanceOf(Function); -}); - -it("should provide the buffer module", function () { - var buffer = require("buffer"); - expect((typeof buffer)).toBe("object"); -}); diff --git a/test/configCases/target/buffer-default/webpack.config.js b/test/configCases/target/buffer-default/webpack.config.js deleted file mode 100644 index 7105dc09e87..00000000000 --- a/test/configCases/target/buffer-default/webpack.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - target: "web" -}; diff --git a/test/configCases/target/buffer/index.js b/test/configCases/target/buffer/index.js deleted file mode 100644 index 570c0e3433e..00000000000 --- a/test/configCases/target/buffer/index.js +++ /dev/null @@ -1,3 +0,0 @@ -it("should provide a global Buffer shim", function () { - expect(Buffer).toBeInstanceOf(Function); -}); diff --git a/test/configCases/target/buffer/webpack.config.js b/test/configCases/target/buffer/webpack.config.js deleted file mode 100644 index b68432b7513..00000000000 --- a/test/configCases/target/buffer/webpack.config.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - target: "web", - node: { - Buffer: true, - buffer: false - } -}; diff --git a/test/configCases/target/chunk-loading-per-entry/chunk.js b/test/configCases/target/chunk-loading-per-entry/chunk.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/configCases/target/chunk-loading-per-entry/chunk.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/configCases/target/chunk-loading-per-entry/test.config.js b/test/configCases/target/chunk-loading-per-entry/test.config.js new file mode 100644 index 00000000000..cb1a34c3347 --- /dev/null +++ b/test/configCases/target/chunk-loading-per-entry/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return i === 0 ? "./web-0.js" : "./webworker-1.js"; + } +}; diff --git a/test/configCases/target/chunk-loading-per-entry/web.js b/test/configCases/target/chunk-loading-per-entry/web.js new file mode 100644 index 00000000000..dad9d69f7b2 --- /dev/null +++ b/test/configCases/target/chunk-loading-per-entry/web.js @@ -0,0 +1,13 @@ +it("should allow to load a shared chunk in web", async () => { + const promise = import(/* webpackChunkName: "chunk" */ "./chunk"); + expect(document.head._children).toHaveLength(1); + const script = document.head._children[0]; + __non_webpack_require__("./chunk-0.js"); + script.onload(); + + expect(await promise).toEqual( + nsObj({ + default: 42 + }) + ); +}); diff --git a/test/configCases/target/chunk-loading-per-entry/webpack.config.js b/test/configCases/target/chunk-loading-per-entry/webpack.config.js new file mode 100644 index 00000000000..f60246ed5da --- /dev/null +++ b/test/configCases/target/chunk-loading-per-entry/webpack.config.js @@ -0,0 +1,17 @@ +/** @type {import("../../../../").Configuration} */ +const base = { + entry: { + web: "./web", + webworker: { + import: "./webworker", + chunkLoading: "import-scripts" + } + }, + target: "web" +}; + +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { ...base, output: { ...base.output, filename: "[name]-0.js" } }, + { ...base, output: { ...base.output, filename: "[name]-1.js" } } +]; diff --git a/test/configCases/target/chunk-loading-per-entry/webworker.js b/test/configCases/target/chunk-loading-per-entry/webworker.js new file mode 100644 index 00000000000..d6caaa9ff87 --- /dev/null +++ b/test/configCases/target/chunk-loading-per-entry/webworker.js @@ -0,0 +1,7 @@ +it("should allow to load a shared chunk in a WebWorker", async () => { + expect(await import(/* webpackChunkName: "chunk" */ "./chunk")).toEqual( + nsObj({ + default: 42 + }) + ); +}); diff --git a/test/configCases/target/electron-renderer/webpack.config.js b/test/configCases/target/electron-renderer/webpack.config.js index 55a90182fe8..e7d1ecf5c87 100644 --- a/test/configCases/target/electron-renderer/webpack.config.js +++ b/test/configCases/target/electron-renderer/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { target: "electron-renderer", optimization: { diff --git a/test/configCases/target/node-dynamic-import/test.filter.js b/test/configCases/target/node-dynamic-import/test.filter.js index 863e9be6558..05c852cb49c 100644 --- a/test/configCases/target/node-dynamic-import/test.filter.js +++ b/test/configCases/target/node-dynamic-import/test.filter.js @@ -1,5 +1,5 @@ -var supportsArrowFn = require("../../../helpers/supportsArrowFunctionExpression"); +const supportsArrowFn = require("../../../helpers/supportsArrowFunctionExpression"); -module.exports = function(config) { +module.exports = function (config) { return supportsArrowFn(); }; diff --git a/test/configCases/target/node-dynamic-import/webpack.config.js b/test/configCases/target/node-dynamic-import/webpack.config.js index 85beb01b771..411eb1af1e7 100644 --- a/test/configCases/target/node-dynamic-import/webpack.config.js +++ b/test/configCases/target/node-dynamic-import/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { target: "node", performance: { diff --git a/test/configCases/target/strict-mode-global/webpack.config.js b/test/configCases/target/strict-mode-global/webpack.config.js index 7105dc09e87..03c779ee0af 100644 --- a/test/configCases/target/strict-mode-global/webpack.config.js +++ b/test/configCases/target/strict-mode-global/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { target: "web" }; diff --git a/test/configCases/target/system-context/index.js b/test/configCases/target/system-context/index.js new file mode 100644 index 00000000000..d4f382d7ed0 --- /dev/null +++ b/test/configCases/target/system-context/index.js @@ -0,0 +1,8 @@ +// This test verifies that the System.register context is made available to webpack bundles + +it("should be able to use the System.register context", function() { + expect(__system_context__).toBeTruthy(); + expect(__system_context__.meta).toBeTruthy(); + expect(typeof __system_context__.import).toBe("function"); + expect(typeof __system_context__.meta.url).toBe("string"); +}); diff --git a/test/configCases/target/system-context/test.config.js b/test/configCases/target/system-context/test.config.js new file mode 100644 index 00000000000..97ebf538dbe --- /dev/null +++ b/test/configCases/target/system-context/test.config.js @@ -0,0 +1,13 @@ +const System = require("../../../helpers/fakeSystem"); + +module.exports = { + beforeExecute: () => { + System.init(); + }, + moduleScope(scope) { + scope.System = System; + }, + afterExecute: () => { + System.execute("(anonym)"); + } +}; diff --git a/test/configCases/target/system-context/webpack.config.js b/test/configCases/target/system-context/webpack.config.js new file mode 100644 index 00000000000..9c9c85fe0a3 --- /dev/null +++ b/test/configCases/target/system-context/webpack.config.js @@ -0,0 +1,12 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + library: { + type: "system" + } + }, + node: { + __dirname: false, + __filename: false + } +}; diff --git a/test/configCases/target/system-export/index.js b/test/configCases/target/system-export/index.js new file mode 100644 index 00000000000..bfe3bb7e747 --- /dev/null +++ b/test/configCases/target/system-export/index.js @@ -0,0 +1,13 @@ +// This test verifies that values exported by a webpack bundle are consumable by systemjs. + +export const namedThing = { + hello: "there" +}; + +export default "the default export"; + +it("should successfully export values to System", function() { + const exports = eval("System").registry["(anonym)"].exports; + expect(exports["default"]).toBe("the default export"); + expect(exports.namedThing).toBe(namedThing); +}); diff --git a/test/configCases/target/system-export/test.config.js b/test/configCases/target/system-export/test.config.js new file mode 100644 index 00000000000..97ebf538dbe --- /dev/null +++ b/test/configCases/target/system-export/test.config.js @@ -0,0 +1,13 @@ +const System = require("../../../helpers/fakeSystem"); + +module.exports = { + beforeExecute: () => { + System.init(); + }, + moduleScope(scope) { + scope.System = System; + }, + afterExecute: () => { + System.execute("(anonym)"); + } +}; diff --git a/test/configCases/target/system-export/webpack.config.js b/test/configCases/target/system-export/webpack.config.js new file mode 100644 index 00000000000..2d1a8001fb8 --- /dev/null +++ b/test/configCases/target/system-export/webpack.config.js @@ -0,0 +1,10 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + libraryTarget: "system" + }, + node: { + __dirname: false, + __filename: false + } +}; diff --git a/test/configCases/target/system-named-assets-path/index.js b/test/configCases/target/system-named-assets-path/index.js new file mode 100644 index 00000000000..ecbcb1d8796 --- /dev/null +++ b/test/configCases/target/system-named-assets-path/index.js @@ -0,0 +1,5 @@ +/* This test verifies that when output.library is specified that the compiled bundle provides + * the library name to System during the System.register + */ + +it("should call System.register with a name assets path", function() {}); diff --git a/test/configCases/target/system-named-assets-path/test.config.js b/test/configCases/target/system-named-assets-path/test.config.js new file mode 100644 index 00000000000..58f6db92ea2 --- /dev/null +++ b/test/configCases/target/system-named-assets-path/test.config.js @@ -0,0 +1,12 @@ +const System = require("../../../helpers/fakeSystem"); +module.exports = { + beforeExecute: () => { + System.init(); + }, + moduleScope(scope) { + scope.System = System; + }, + afterExecute: () => { + System.execute("named-system-module-main"); + } +}; diff --git a/test/configCases/target/system-named-assets-path/webpack.config.js b/test/configCases/target/system-named-assets-path/webpack.config.js new file mode 100644 index 00000000000..4dc791678d0 --- /dev/null +++ b/test/configCases/target/system-named-assets-path/webpack.config.js @@ -0,0 +1,11 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + library: "named-system-module-[name]", + libraryTarget: "system" + }, + node: { + __dirname: false, + __filename: false + } +}; diff --git a/test/configCases/target/system-named/index.js b/test/configCases/target/system-named/index.js new file mode 100644 index 00000000000..5f355e1d11f --- /dev/null +++ b/test/configCases/target/system-named/index.js @@ -0,0 +1,5 @@ +/* This test verifies that when output.library is specified that the compiled bundle provides + * the library name to System during the System.register + */ + +it("should call System.register with a name", function() {}); diff --git a/test/configCases/target/system-named/test.config.js b/test/configCases/target/system-named/test.config.js new file mode 100644 index 00000000000..8b3f83a51f9 --- /dev/null +++ b/test/configCases/target/system-named/test.config.js @@ -0,0 +1,13 @@ +const System = require("../../../helpers/fakeSystem"); + +module.exports = { + beforeExecute: () => { + System.init(); + }, + moduleScope(scope) { + scope.System = System; + }, + afterExecute: () => { + System.execute("named-system-module"); + } +}; diff --git a/test/configCases/target/system-named/webpack.config.js b/test/configCases/target/system-named/webpack.config.js new file mode 100644 index 00000000000..fef28f250bc --- /dev/null +++ b/test/configCases/target/system-named/webpack.config.js @@ -0,0 +1,11 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + library: "named-system-module", + libraryTarget: "system" + }, + node: { + __dirname: false, + __filename: false + } +}; diff --git a/test/configCases/target/system-unnamed/index.js b/test/configCases/target/system-unnamed/index.js new file mode 100644 index 00000000000..7f2b1a91ee9 --- /dev/null +++ b/test/configCases/target/system-unnamed/index.js @@ -0,0 +1,5 @@ +/* This test verifies that when there is no output.library specified that the call to + * System.register does not include a name argument. + */ + +it("should call System.register without a name", function() {}); diff --git a/test/configCases/target/system-unnamed/test.config.js b/test/configCases/target/system-unnamed/test.config.js new file mode 100644 index 00000000000..97ebf538dbe --- /dev/null +++ b/test/configCases/target/system-unnamed/test.config.js @@ -0,0 +1,13 @@ +const System = require("../../../helpers/fakeSystem"); + +module.exports = { + beforeExecute: () => { + System.init(); + }, + moduleScope(scope) { + scope.System = System; + }, + afterExecute: () => { + System.execute("(anonym)"); + } +}; diff --git a/test/configCases/target/system-unnamed/webpack.config.js b/test/configCases/target/system-unnamed/webpack.config.js new file mode 100644 index 00000000000..2d1a8001fb8 --- /dev/null +++ b/test/configCases/target/system-unnamed/webpack.config.js @@ -0,0 +1,10 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + libraryTarget: "system" + }, + node: { + __dirname: false, + __filename: false + } +}; diff --git a/test/configCases/target/umd-auxiliary-comments-object/webpack.config.js b/test/configCases/target/umd-auxiliary-comments-object/webpack.config.js index 19473283852..43147101b8b 100644 --- a/test/configCases/target/umd-auxiliary-comments-object/webpack.config.js +++ b/test/configCases/target/umd-auxiliary-comments-object/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { output: { library: "NamedLibrary", diff --git a/test/configCases/target/umd-auxiliary-comments-string/webpack.config.js b/test/configCases/target/umd-auxiliary-comments-string/webpack.config.js index 82e0dfe1e85..739c67f4f10 100644 --- a/test/configCases/target/umd-auxiliary-comments-string/webpack.config.js +++ b/test/configCases/target/umd-auxiliary-comments-string/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { output: { library: "NamedLibrary", diff --git a/test/configCases/target/umd-named-define/webpack.config.js b/test/configCases/target/umd-named-define/webpack.config.js index be904c79d80..bfe025995ba 100644 --- a/test/configCases/target/umd-named-define/webpack.config.js +++ b/test/configCases/target/umd-named-define/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { output: { library: "NamedLibrary", diff --git a/test/configCases/target/universal/file.png b/test/configCases/target/universal/file.png new file mode 100644 index 00000000000..fb53b9dedd3 Binary files /dev/null and b/test/configCases/target/universal/file.png differ diff --git a/test/configCases/target/universal/index.js b/test/configCases/target/universal/index.js new file mode 100644 index 00000000000..0d68af7dffa --- /dev/null +++ b/test/configCases/target/universal/index.js @@ -0,0 +1,22 @@ +import value from "./separate"; +import { test as t } from "external-self"; + +it("should compile", () => { + expect(value).toBe(42); +}); + +it("should circular depend on itself external", () => { + expect(test()).toBe(42); + expect(t()).toBe(42); +}); + +it("work with URL", () => { + const url = new URL("./file.png", import.meta.url); + expect(/[a-f0-9]{20}\.png/.test(url)).toBe(true); +}); + +function test() { + return 42; +} + +export { test }; diff --git a/test/configCases/target/universal/separate.js b/test/configCases/target/universal/separate.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/configCases/target/universal/separate.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/configCases/target/universal/test.config.js b/test/configCases/target/universal/test.config.js new file mode 100644 index 00000000000..e2664c9b261 --- /dev/null +++ b/test/configCases/target/universal/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle() { + return ["./runtime.mjs", "./separate.mjs", "./main.mjs"]; + } +}; diff --git a/test/configCases/target/universal/webpack.config.js b/test/configCases/target/universal/webpack.config.js new file mode 100644 index 00000000000..386112ee018 --- /dev/null +++ b/test/configCases/target/universal/webpack.config.js @@ -0,0 +1,30 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + filename: "[name].mjs", + library: { + type: "module" + } + }, + target: ["web", "node"], + experiments: { + outputModule: true + }, + optimization: { + minimize: true, + runtimeChunk: "single", + splitChunks: { + cacheGroups: { + separate: { + test: /separate/, + chunks: "all", + filename: "separate.mjs", + enforce: true + } + } + } + }, + externals: { + "external-self": "./main.mjs" + } +}; diff --git a/test/configCases/target/web/index.js b/test/configCases/target/web/index.js deleted file mode 100644 index 9e30bd08e1f..00000000000 --- a/test/configCases/target/web/index.js +++ /dev/null @@ -1,90 +0,0 @@ -global.XMLHttpRequest = function() {}; -global.XMLHttpRequest.prototype.open = function() {}; - -it("should provide a global Buffer constructor", function() { - expect(Buffer).toBeInstanceOf(Function); -}); - -it("should provide a global process shim", function () { - expect(process).toBeInstanceOf(Object); -}); - -it("should provide a global setImmediate shim", function () { - expect(setImmediate).toBeInstanceOf(Function); -}); - -it("should provide a global clearImmediate shim", function () { - expect(clearImmediate).toBeInstanceOf(Function); -}); - -it("should provide an assert shim", function () { - expect(require("assert")).toBeInstanceOf(Function); -}); - -it("should provide a util shim", function () { - expect(require("util")).toBeInstanceOf(Object); -}); - -it("should provide a buffer shim", function () { - expect(require("buffer")).toBeInstanceOf(Object); -}); - -it("should provide a crypto shim", function () { - expect(require("crypto")).toBeInstanceOf(Object); -}); - -it("should provide a domain shim", function () { - expect(require("domain")).toBeInstanceOf(Object); -}); - -it("should provide an events shim", function () { - expect(require("events")).toBeInstanceOf(Function); -}); - -it("should provide an http shim", function () { - expect(require("http")).toBeInstanceOf(Object); -}); - -it("should provide an https shim", function () { - expect(require("https")).toBeInstanceOf(Object); -}); - -it("should provide an os shim", function () { - expect(require("os")).toBeInstanceOf(Object); -}); - -it("should provide a path shim", function () { - expect(require("path")).toBeInstanceOf(Object); -}); - -it("should provide a punycode shim", function () { - expect(require("punycode")).toBeInstanceOf(Object); -}); - -it("should provide a stream shim", function () { - expect(require("stream")).toBeInstanceOf(Function); -}); - -it("should provide a tty shim", function () { - expect(require("tty")).toBeInstanceOf(Object); -}); - -it("should provide a url shim", function () { - expect(require("url")).toBeInstanceOf(Object); -}); - -it("should provide a util shim", function () { - expect(require("util")).toBeInstanceOf(Object); -}); - -it("should provide a vm shim", function () { - expect(require("vm")).toBeInstanceOf(Object); -}); - -it("should provide a zlib shim", function () { - expect(require("zlib")).toBeInstanceOf(Object); -}); - -it("should provide a shim for a path in a build-in module", function () { - expect(require("process/in.js")).toBe("in process"); -}); diff --git a/test/configCases/target/web/node_modules/process/in.js b/test/configCases/target/web/node_modules/process/in.js deleted file mode 100644 index a3123d7f88d..00000000000 --- a/test/configCases/target/web/node_modules/process/in.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = "in process"; diff --git a/test/configCases/target/web/node_modules/process/index.js b/test/configCases/target/web/node_modules/process/index.js deleted file mode 100644 index e34d354b846..00000000000 --- a/test/configCases/target/web/node_modules/process/index.js +++ /dev/null @@ -1 +0,0 @@ -throw new Error("Should not be loaded"); diff --git a/test/configCases/target/web/webpack.config.js b/test/configCases/target/web/webpack.config.js deleted file mode 100644 index ac971f9ae0d..00000000000 --- a/test/configCases/target/web/webpack.config.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - target: "web", - performance: { - hints: false - }, - optimization: { - minimize: false - } -}; diff --git a/test/configCases/target/webworker/index.js b/test/configCases/target/webworker/index.js deleted file mode 100644 index 40d1f61278f..00000000000 --- a/test/configCases/target/webworker/index.js +++ /dev/null @@ -1,95 +0,0 @@ -global.XMLHttpRequest = function() {}; -global.XMLHttpRequest.prototype.open = function() {}; - -it("should provide a global Buffer constructor", function() { - expect(Buffer).toBeInstanceOf(Function); -}); - -it("should provide a global console shim", function () { - expect(console).toBeTypeOf("object"); - expect(console.time).toBeTypeOf("function"); -}); - -it("should provide a global process shim", function () { - expect(process).toBeInstanceOf(Object); -}); - -it("should provide a global setImmediate shim", function () { - expect(setImmediate).toBeInstanceOf(Function); -}); - -it("should provide a global clearImmediate shim", function () { - expect(clearImmediate).toBeInstanceOf(Function); -}); - -it("should provide an assert shim", function () { - expect(require("assert")).toBeInstanceOf(Function); -}); - -it("should provide a util shim", function () { - expect(require("util")).toBeInstanceOf(Object); -}); - -it("should provide a buffer shim", function () { - expect(require("buffer")).toBeInstanceOf(Object); -}); - -it("should provide a crypto shim", function () { - expect(require("crypto")).toBeInstanceOf(Object); -}); - -it("should provide a domain shim", function () { - expect(require("domain")).toBeInstanceOf(Object); -}); - -it("should provide an events shim", function () { - expect(require("events")).toBeInstanceOf(Function); -}); - -it("should provide an http shim", function () { - expect(require("http")).toBeInstanceOf(Object); -}); - -it("should provide an https shim", function () { - expect(require("https")).toBeInstanceOf(Object); -}); - -it("should provide an os shim", function () { - expect(require("os")).toBeInstanceOf(Object); -}); - -it("should provide a path shim", function () { - expect(require("path")).toBeInstanceOf(Object); -}); - -it("should provide a punycode shim", function () { - expect(require("punycode")).toBeInstanceOf(Object); -}); - -it("should provide a stream shim", function () { - expect(require("stream")).toBeInstanceOf(Function); -}); - -it("should provide a tty shim", function () { - expect(require("tty")).toBeInstanceOf(Object); -}); - -it("should provide a url shim", function () { - expect(require("url")).toBeInstanceOf(Object); -}); - -it("should provide a util shim", function () { - expect(require("util")).toBeInstanceOf(Object); -}); - -it("should provide a vm shim", function () { - expect(require("vm")).toBeInstanceOf(Object); -}); - -it("should provide a zlib shim", function () { - expect(require("zlib")).toBeInstanceOf(Object); -}); - -it("should provide a shim for a path in a build-in module", function () { - expect(require("process/in.js")).toBe("in process"); -}); diff --git a/test/configCases/target/webworker/node_modules/process/in.js b/test/configCases/target/webworker/node_modules/process/in.js deleted file mode 100644 index a3123d7f88d..00000000000 --- a/test/configCases/target/webworker/node_modules/process/in.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = "in process"; diff --git a/test/configCases/target/webworker/node_modules/process/index.js b/test/configCases/target/webworker/node_modules/process/index.js deleted file mode 100644 index e34d354b846..00000000000 --- a/test/configCases/target/webworker/node_modules/process/index.js +++ /dev/null @@ -1 +0,0 @@ -throw new Error("Should not be loaded"); diff --git a/test/configCases/target/webworker/webpack.config.js b/test/configCases/target/webworker/webpack.config.js deleted file mode 100644 index 05fba0af4aa..00000000000 --- a/test/configCases/target/webworker/webpack.config.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = { - target: "webworker", - performance: { - hints: false - }, - node: { - __dirname: false, - __filename: false - }, - optimization: { - minimize: false - } -}; diff --git a/test/configCases/trusted-types/continue-on-policy-creation-failure/empty.js b/test/configCases/trusted-types/continue-on-policy-creation-failure/empty.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/trusted-types/continue-on-policy-creation-failure/index.js b/test/configCases/trusted-types/continue-on-policy-creation-failure/index.js new file mode 100644 index 00000000000..80709e0c23d --- /dev/null +++ b/test/configCases/trusted-types/continue-on-policy-creation-failure/index.js @@ -0,0 +1,36 @@ +it("can continue on policy creation failure", function () { + // emulate trusted types in a window object + window.trustedTypes = { + createPolicy: () => { + throw new Error("Rejecting createPolicy call"); + } + }; + + const createPolicySpy = jest.spyOn(window.trustedTypes, "createPolicy"); + const consoleWarn = jest.spyOn(console, "warn").mockImplementation(() => {}); + + const promise = import( + "./empty?b" /* webpackChunkName: "continue-on-policy-creation-failure" */ + ); + var script = document.head._children.pop(); + expect(script.src).toBe( + "https://test.cases/path/continue-on-policy-creation-failure.web.js" + ); + __non_webpack_require__("./continue-on-policy-creation-failure.web.js"); + + expect(createPolicySpy).toHaveBeenCalledWith( + "CustomPolicyName", + expect.objectContaining({ + createScriptURL: expect.anything() + }) + ); + expect(createPolicySpy).toThrow(); + expect(consoleWarn).toHaveBeenCalledWith( + `Could not create trusted-types policy "CustomPolicyName"` + ); + + createPolicySpy.mockReset(); + consoleWarn.mockReset(); + + return promise; +}); diff --git a/test/configCases/trusted-types/continue-on-policy-creation-failure/webpack.config.js b/test/configCases/trusted-types/continue-on-policy-creation-failure/webpack.config.js new file mode 100644 index 00000000000..df698de6663 --- /dev/null +++ b/test/configCases/trusted-types/continue-on-policy-creation-failure/webpack.config.js @@ -0,0 +1,17 @@ +module.exports = { + target: "web", + output: { + chunkFilename: "[name].web.js", + crossOriginLoading: "anonymous", + trustedTypes: { + policyName: "CustomPolicyName", + onPolicyCreationFailure: "continue" + } + }, + performance: { + hints: false + }, + optimization: { + minimize: false + } +}; diff --git a/test/configCases/trusted-types/custom-policy-name/empty.js b/test/configCases/trusted-types/custom-policy-name/empty.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/trusted-types/custom-policy-name/index.js b/test/configCases/trusted-types/custom-policy-name/index.js new file mode 100644 index 00000000000..a9a539c1a8f --- /dev/null +++ b/test/configCases/trusted-types/custom-policy-name/index.js @@ -0,0 +1,28 @@ +it("should load chunk using trusted types with custom policy name", function () { + // emulate trusted types in a window object + const noop = i => i; + const rules = { + createScriptURL: noop + }; + window.trustedTypes = { + createPolicy: () => rules + }; + const createScriptURLSpy = jest.spyOn(rules, "createScriptURL"); + const createPolicySpy = jest.spyOn(window.trustedTypes, "createPolicy"); + + const promise = import("./empty?b" /* webpackChunkName: "trusted-types" */); + var script = document.head._children.pop(); + __non_webpack_require__("./trusted-types.web.js"); + expect(script.src).toBe("https://test.cases/path/trusted-types.web.js"); + expect(createScriptURLSpy).toHaveBeenCalledWith( + "https://test.cases/path/trusted-types.web.js" + ); + expect(createPolicySpy).toHaveBeenCalledWith( + "customPolicyName", + expect.objectContaining({ + createScriptURL: expect.anything() + }) + ); + + return promise; +}); diff --git a/test/configCases/trusted-types/custom-policy-name/webpack.config.js b/test/configCases/trusted-types/custom-policy-name/webpack.config.js new file mode 100644 index 00000000000..bd52bcc388c --- /dev/null +++ b/test/configCases/trusted-types/custom-policy-name/webpack.config.js @@ -0,0 +1,14 @@ +module.exports = { + target: "web", + output: { + chunkFilename: "[name].web.js", + crossOriginLoading: "anonymous", + trustedTypes: "customPolicyName" + }, + performance: { + hints: false + }, + optimization: { + minimize: false + } +}; diff --git a/test/configCases/trusted-types/default-policy-name/empty.js b/test/configCases/trusted-types/default-policy-name/empty.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/trusted-types/default-policy-name/index.js b/test/configCases/trusted-types/default-policy-name/index.js new file mode 100644 index 00000000000..80c68af13f2 --- /dev/null +++ b/test/configCases/trusted-types/default-policy-name/index.js @@ -0,0 +1,30 @@ +it("should use default trusted types policy name", function () { + // emulate trusted types in a window object + const noop = i => i; + const rules = { + createScriptURL: noop + }; + window.trustedTypes = { + createPolicy: () => rules + }; + const createScriptURLSpy = jest.spyOn(rules, "createScriptURL"); + const createPolicySpy = jest.spyOn(window.trustedTypes, "createPolicy"); + + const promise = import( + "./empty?b" /* webpackChunkName: "default-policy-name" */ + ); + var script = document.head._children.pop(); + expect(script.src).toBe("https://test.cases/path/default-policy-name.web.js"); + __non_webpack_require__("./default-policy-name.web.js"); + expect(createScriptURLSpy).toHaveBeenCalledWith( + "https://test.cases/path/default-policy-name.web.js" + ); + expect(createPolicySpy).toHaveBeenCalledWith( + "webpack", + expect.objectContaining({ + createScriptURL: expect.anything() + }) + ); + + return promise; +}); diff --git a/test/configCases/trusted-types/default-policy-name/webpack.config.js b/test/configCases/trusted-types/default-policy-name/webpack.config.js new file mode 100644 index 00000000000..21395fcf3b4 --- /dev/null +++ b/test/configCases/trusted-types/default-policy-name/webpack.config.js @@ -0,0 +1,14 @@ +module.exports = { + target: "web", + output: { + chunkFilename: "[name].web.js", + crossOriginLoading: "anonymous", + trustedTypes: true + }, + performance: { + hints: false + }, + optimization: { + minimize: false + } +}; diff --git a/test/configCases/trusted-types/devtool-eval/index.js b/test/configCases/trusted-types/devtool-eval/index.js new file mode 100644 index 00000000000..5499320847f --- /dev/null +++ b/test/configCases/trusted-types/devtool-eval/index.js @@ -0,0 +1,45 @@ +it("should pass TrustedScript to eval", function () { + var policy = __webpack_require__.tt(); + policy.createScript = jest.fn(script => { + expect(typeof script).toEqual("string"); + return new TrustedScript(script); + }); + + require("./test.js"); + expect(window.module.exports).toBeInstanceOf(Object); + expect(window.module.exports.foo).toEqual("bar"); + + const testPattern = + "var test = {\\s*foo: 'bar'\\s*};\\s*module.exports = test;"; + expect(policy.createScript).toBeCalledWith( + expect.stringMatching(testPattern) + ); + expect(window.eval).toBeCalledWith( + expect.objectContaining({ + _script: expect.stringMatching(testPattern) + }) + ); +}); + +class TrustedScript { + constructor(script) { + this._script = script; + } +} + +let globalEval; +beforeEach(done => { + globalEval = eval; + window.module = {}; + window.eval = jest.fn(x => { + expect(x).toBeInstanceOf(TrustedScript); + return globalEval(x._script); + }); + done(); +}); + +afterEach(done => { + delete window.module; + window.eval = globalEval; + done(); +}); diff --git a/test/configCases/trusted-types/devtool-eval/test.js b/test/configCases/trusted-types/devtool-eval/test.js new file mode 100644 index 00000000000..0c72e78b18d --- /dev/null +++ b/test/configCases/trusted-types/devtool-eval/test.js @@ -0,0 +1,5 @@ +var test = { + foo: 'bar' +}; + +module.exports = test; diff --git a/test/configCases/trusted-types/devtool-eval/webpack.config.js b/test/configCases/trusted-types/devtool-eval/webpack.config.js new file mode 100644 index 00000000000..1356571fd81 --- /dev/null +++ b/test/configCases/trusted-types/devtool-eval/webpack.config.js @@ -0,0 +1,19 @@ +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + target: "web", + output: { + filename: "bundle0.js", + trustedTypes: true + }, + devtool: "eval-source-map" + }, + { + target: "web", + output: { + filename: "bundle1.js", + trustedTypes: true + }, + devtool: "eval" + } +]; diff --git a/test/configCases/trusted-types/no-policy-name/empty.js b/test/configCases/trusted-types/no-policy-name/empty.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/trusted-types/no-policy-name/index.js b/test/configCases/trusted-types/no-policy-name/index.js new file mode 100644 index 00000000000..36e17e288da --- /dev/null +++ b/test/configCases/trusted-types/no-policy-name/index.js @@ -0,0 +1,25 @@ +it("should skip trusted types logic when policy name is empty", function () { + // emulate trusted types in a window object + const noop = i => i; + const rules = { + createScriptURL: noop + }; + window.trustedTypes = { + createPolicy: () => rules + }; + const createScriptURLSpy = jest.spyOn(rules, "createScriptURL"); + const createPolicySpy = jest.spyOn(window.trustedTypes, "createPolicy"); + + const promise = import( + "./empty?b" /* webpackChunkName: "no-trusted-types-policy-name" */ + ); + var script = document.head._children.pop(); + __non_webpack_require__("./no-trusted-types-policy-name.web.js"); + expect(script.src).toBe( + "https://test.cases/path/no-trusted-types-policy-name.web.js" + ); + expect(createScriptURLSpy).not.toHaveBeenCalled(); + expect(createPolicySpy).not.toHaveBeenCalled(); + + return promise; +}); diff --git a/test/configCases/trusted-types/no-policy-name/webpack.config.js b/test/configCases/trusted-types/no-policy-name/webpack.config.js new file mode 100644 index 00000000000..68eeb96a523 --- /dev/null +++ b/test/configCases/trusted-types/no-policy-name/webpack.config.js @@ -0,0 +1,13 @@ +module.exports = { + target: "web", + output: { + chunkFilename: "[name].web.js", + crossOriginLoading: "anonymous" + }, + performance: { + hints: false + }, + optimization: { + minimize: false + } +}; diff --git a/test/configCases/trusted-types/no-trusted-types/empty.js b/test/configCases/trusted-types/no-trusted-types/empty.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/trusted-types/no-trusted-types/index.js b/test/configCases/trusted-types/no-trusted-types/index.js new file mode 100644 index 00000000000..5ccd1e4561a --- /dev/null +++ b/test/configCases/trusted-types/no-trusted-types/index.js @@ -0,0 +1,11 @@ +it("should load chunk when there are no trusted types", function () { + const promise = import( + "./empty?a" /* webpackChunkName: "no-trusted-types" */ + ); + + var script = document.head._children.pop(); + __non_webpack_require__("./no-trusted-types.web.js"); + expect(script.src).toBe("https://test.cases/path/no-trusted-types.web.js"); + + return promise; +}); diff --git a/test/configCases/trusted-types/no-trusted-types/webpack.config.js b/test/configCases/trusted-types/no-trusted-types/webpack.config.js new file mode 100644 index 00000000000..21395fcf3b4 --- /dev/null +++ b/test/configCases/trusted-types/no-trusted-types/webpack.config.js @@ -0,0 +1,14 @@ +module.exports = { + target: "web", + output: { + chunkFilename: "[name].web.js", + crossOriginLoading: "anonymous", + trustedTypes: true + }, + performance: { + hints: false + }, + optimization: { + minimize: false + } +}; diff --git a/test/configCases/trusted-types/stop-on-policy-creation-failure/empty.js b/test/configCases/trusted-types/stop-on-policy-creation-failure/empty.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/trusted-types/stop-on-policy-creation-failure/index.js b/test/configCases/trusted-types/stop-on-policy-creation-failure/index.js new file mode 100644 index 00000000000..725dbdc6f9b --- /dev/null +++ b/test/configCases/trusted-types/stop-on-policy-creation-failure/index.js @@ -0,0 +1,38 @@ +it("should stop if policy fails to be created", function () { + // emulate trusted types in a window object + window.trustedTypes = { + createPolicy: () => { + throw new Error("Rejecting createPolicy call"); + } + }; + + const createPolicySpy = jest.spyOn(window.trustedTypes, "createPolicy"); + const consoleWarn = jest.spyOn(console, "warn").mockImplementation(() => {}); + + let promise; + try { + promise = import( + "./empty?test=stop-on-policy-creation-failure" /* webpackChunkName: "stop-on-policy-creation-failure" */ + ); + } catch (e) { + expect(e.message).toBe("Rejecting createPolicy call"); + } + + // Unlike in the other test cases, we expect the failure above to prevent any scripts from being added to the document head + expect(document.head._children.length).toBe(0); + expect(createPolicySpy).toHaveBeenCalledWith( + "webpack", + expect.objectContaining({ + createScriptURL: expect.anything() + }) + ); + + // Unlike in the "continue-on-policy-creation-failure" case, we expect an outright thrown error, + // rather than a console warning. The console should not have been called: + expect(consoleWarn).toHaveBeenCalledTimes(0); + + createPolicySpy.mockReset(); + consoleWarn.mockReset(); + + return promise; +}); diff --git a/test/configCases/trusted-types/stop-on-policy-creation-failure/webpack.config.js b/test/configCases/trusted-types/stop-on-policy-creation-failure/webpack.config.js new file mode 100644 index 00000000000..21395fcf3b4 --- /dev/null +++ b/test/configCases/trusted-types/stop-on-policy-creation-failure/webpack.config.js @@ -0,0 +1,14 @@ +module.exports = { + target: "web", + output: { + chunkFilename: "[name].web.js", + crossOriginLoading: "anonymous", + trustedTypes: true + }, + performance: { + hints: false + }, + optimization: { + minimize: false + } +}; diff --git a/test/configCases/trusted-types/web-worker/importingWorker.js b/test/configCases/trusted-types/web-worker/importingWorker.js new file mode 100644 index 00000000000..d105abed604 --- /dev/null +++ b/test/configCases/trusted-types/web-worker/importingWorker.js @@ -0,0 +1,25 @@ +// Mock Trusted Types to test if the import (rewritten as importScripts) goes through TT as well. + +let policyName = "none"; +let scriptURL = "none"; + +self.trustedTypes = { + createPolicy: (name, rules) => { + policyName = name; + const createScriptURL = rules.createScriptURL; + rules.createScriptURL = url => { + scriptURL = url; + return createScriptURL(url); + }; + return rules; + } +}; + +onmessage = async event => { + const { upper } = await import("./module"); + postMessage({ + data: upper(event.data), + policyName, + scriptURL + }); +}; diff --git a/test/configCases/trusted-types/web-worker/index.js b/test/configCases/trusted-types/web-worker/index.js new file mode 100644 index 00000000000..02a689a08ab --- /dev/null +++ b/test/configCases/trusted-types/web-worker/index.js @@ -0,0 +1,45 @@ +it("should load a WebWorker using a TrustedScriptURL", async () => { + const noop = i => i; + const rules = { + createScriptURL: noop + }; + window.trustedTypes = { + createPolicy: () => rules + }; + const createScriptURLSpy = jest.spyOn(rules, "createScriptURL"); + const createPolicySpy = jest.spyOn(window.trustedTypes, "createPolicy"); + + const worker = new Worker(new URL("./worker.js", import.meta.url), { + type: "module" + }); + expect(createScriptURLSpy.mock.calls[0][0].toString()).toContain("chunk"); + expect(createPolicySpy).toHaveBeenCalledWith("webpack", expect.anything()); + + worker.postMessage("ok"); + const result = await new Promise(resolve => { + worker.onmessage = event => { + resolve(event.data); + }; + }); + expect(result).toEqual("data: ok, thanks"); + await worker.terminate(); +}); + +it("should use Trusted Types for loading modules inside worker", async () => { + const worker = new Worker(new URL("./importingWorker.js", import.meta.url), { + type: "module" + }); + + worker.postMessage("ok"); + const result = await new Promise(resolve => { + worker.onmessage = event => { + resolve(event.data); + }; + }); + expect(result).toEqual({ + data: "OK", + policyName: "webpack", + scriptURL: expect.stringContaining("chunk") + }); + await worker.terminate(); +}); diff --git a/test/configCases/trusted-types/web-worker/module.js b/test/configCases/trusted-types/web-worker/module.js new file mode 100644 index 00000000000..7918e626336 --- /dev/null +++ b/test/configCases/trusted-types/web-worker/module.js @@ -0,0 +1,3 @@ +export function upper(s) { + return s.toUpperCase(); +} diff --git a/test/configCases/trusted-types/web-worker/test.config.js b/test/configCases/trusted-types/web-worker/test.config.js new file mode 100644 index 00000000000..0c4cdb95323 --- /dev/null +++ b/test/configCases/trusted-types/web-worker/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["main.js"]; + } +}; diff --git a/test/configCases/trusted-types/web-worker/test.filter.js b/test/configCases/trusted-types/web-worker/test.filter.js new file mode 100644 index 00000000000..f74eb03f05a --- /dev/null +++ b/test/configCases/trusted-types/web-worker/test.filter.js @@ -0,0 +1,5 @@ +const supportsWorker = require("../../../helpers/supportsWorker"); + +module.exports = function (config) { + return supportsWorker(); +}; diff --git a/test/configCases/trusted-types/web-worker/webpack.config.js b/test/configCases/trusted-types/web-worker/webpack.config.js new file mode 100644 index 00000000000..1b611149a76 --- /dev/null +++ b/test/configCases/trusted-types/web-worker/webpack.config.js @@ -0,0 +1,8 @@ +module.exports = { + output: { + filename: "[name].js", + chunkFilename: "chunk.[name].js", + trustedTypes: true + }, + target: "web" +}; diff --git a/test/configCases/trusted-types/web-worker/worker.js b/test/configCases/trusted-types/web-worker/worker.js new file mode 100644 index 00000000000..f15e2620cf3 --- /dev/null +++ b/test/configCases/trusted-types/web-worker/worker.js @@ -0,0 +1,4 @@ +//importScripts("./imported.js"); +onmessage = async event => { + postMessage(`data: ${event.data}, thanks`); +}; diff --git a/test/configCases/types/filesystems/test.filter.js b/test/configCases/types/filesystems/test.filter.js new file mode 100644 index 00000000000..0ba64710234 --- /dev/null +++ b/test/configCases/types/filesystems/test.filter.js @@ -0,0 +1 @@ +module.exports = () => false; diff --git a/test/configCases/types/filesystems/webpack.config.js b/test/configCases/types/filesystems/webpack.config.js new file mode 100644 index 00000000000..36c632723c4 --- /dev/null +++ b/test/configCases/types/filesystems/webpack.config.js @@ -0,0 +1,23 @@ +const memfs = require("memfs"); +const fs = require("fs"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [ + compiler => { + // eslint-disable-next-line no-warning-comments + // @ts-ignore + compiler.outputFileSystem = memfs.fs; + // eslint-disable-next-line no-warning-comments + // @ts-ignore + compiler.inputFileSystem = memfs.fs; + // eslint-disable-next-line no-warning-comments + // @ts-ignore + compiler.intermediateFileSystem = memfs.fs; + + compiler.outputFileSystem = fs; + compiler.inputFileSystem = fs; + compiler.intermediateFileSystem = fs; + } + ] +}; diff --git a/test/configCases/umd/issue-15545/index.js b/test/configCases/umd/issue-15545/index.js new file mode 100644 index 00000000000..7813dbcc099 --- /dev/null +++ b/test/configCases/umd/issue-15545/index.js @@ -0,0 +1,5 @@ +it("should compile and run", () => { + expect(hello()).toBe("hello"); +}); + +export function hello() { return "hello"; } diff --git a/test/configCases/umd/issue-15545/test.config.js b/test/configCases/umd/issue-15545/test.config.js new file mode 100644 index 00000000000..edc0b991968 --- /dev/null +++ b/test/configCases/umd/issue-15545/test.config.js @@ -0,0 +1,9 @@ +const CONTEXT = {}; +module.exports = { + nonEsmThis(module) { + return CONTEXT; + }, + findBundle() { + return ["./runtime.js", "./main.js"]; + } +}; diff --git a/test/configCases/umd/issue-15545/webpack.config.js b/test/configCases/umd/issue-15545/webpack.config.js new file mode 100644 index 00000000000..73b1025f8b4 --- /dev/null +++ b/test/configCases/umd/issue-15545/webpack.config.js @@ -0,0 +1,19 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "production", + entry: { + main: "./index.js" + }, + output: { + filename: "[name].js", + library: "MyLibrary", + libraryTarget: "umd", + chunkLoading: "jsonp", + chunkFormat: "array-push", + globalObject: "this" + }, + optimization: { + minimize: false, + runtimeChunk: "single" + } +}; diff --git a/test/configCases/utils/lazy-set/index.js b/test/configCases/utils/lazy-set/index.js new file mode 100644 index 00000000000..8797cd2b635 --- /dev/null +++ b/test/configCases/utils/lazy-set/index.js @@ -0,0 +1 @@ +it("should behave like a Set", () => {}); diff --git a/test/configCases/utils/lazy-set/webpack.config.js b/test/configCases/utils/lazy-set/webpack.config.js new file mode 100644 index 00000000000..5a23d98af40 --- /dev/null +++ b/test/configCases/utils/lazy-set/webpack.config.js @@ -0,0 +1,24 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [ + compiler => { + compiler.hooks.done.tap("Test", ({ compilation }) => { + const items1 = Array.from(compilation.fileDependencies); + const items2 = new Set(compilation.fileDependencies.keys()); + const items3 = new Set(compilation.fileDependencies.values()); + const items4 = new Set(compilation.fileDependencies.entries()); + expect(compilation.fileDependencies.has(items1[0])).toBe(true); + compilation.fileDependencies.delete(items1[0]); + expect(compilation.fileDependencies.has(items1[0])).toBe(false); + compilation.fileDependencies.add(items1[0]); + expect(compilation.fileDependencies.has(items1[0])).toBe(true); + compilation.fileDependencies.add(items1[0]); + expect(compilation.fileDependencies.size).toBe(items1.length); + const items1Set = new Set(items1); + expect(items2).toEqual(items1Set); + expect(items3).toEqual(items1Set); + expect(items4).toEqual(new Set(items1.map(x => [x, x]))); + }); + } + ] +}; diff --git a/test/configCases/wasm/async-node/index.js b/test/configCases/wasm/async-node/index.js new file mode 100644 index 00000000000..05e4840967b --- /dev/null +++ b/test/configCases/wasm/async-node/index.js @@ -0,0 +1,6 @@ +it("should work", function() { + return import("./module").then(function(module) { + const result = module.run(); + expect(result).toEqual(84); + }); +}); diff --git a/test/configCases/wasm/async-node/module.js b/test/configCases/wasm/async-node/module.js new file mode 100644 index 00000000000..a10de684530 --- /dev/null +++ b/test/configCases/wasm/async-node/module.js @@ -0,0 +1,6 @@ +import { getNumber } from "./wasm.wat?1"; +import { getNumber as getNumber2 } from "./wasm.wat?2"; + +export function run() { + return getNumber() + getNumber2(); +} diff --git a/test/configCases/wasm/async-node/test.filter.js b/test/configCases/wasm/async-node/test.filter.js new file mode 100644 index 00000000000..cb37e21905f --- /dev/null +++ b/test/configCases/wasm/async-node/test.filter.js @@ -0,0 +1,5 @@ +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); + +module.exports = function (config) { + return supportsWebAssembly(); +}; diff --git a/test/configCases/wasm/async-node/wasm.wat b/test/configCases/wasm/async-node/wasm.wat new file mode 100644 index 00000000000..3a135271020 --- /dev/null +++ b/test/configCases/wasm/async-node/wasm.wat @@ -0,0 +1,10 @@ +(module + (type $t0 (func (param i32 i32) (result i32))) + (type $t1 (func (result i32))) + (func $add (export "add") (type $t0) (param $p0 i32) (param $p1 i32) (result i32) + (i32.add + (get_local $p0) + (get_local $p1))) + (func $getNumber (export "getNumber") (type $t1) (result i32) + (i32.const 42))) + diff --git a/test/configCases/wasm/async-node/webpack.config.js b/test/configCases/wasm/async-node/webpack.config.js new file mode 100644 index 00000000000..f90f325e1f4 --- /dev/null +++ b/test/configCases/wasm/async-node/webpack.config.js @@ -0,0 +1,80 @@ +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + target: "node", + module: { + rules: [ + { + test: /\.wat$/, + loader: "wast-loader", + type: "webassembly/async" + } + ] + }, + output: { + module: true, + webassemblyModuleFilename: "[id].[hash].wasm" + }, + experiments: { + outputModule: true, + asyncWebAssembly: true + } + }, + { + target: "node", + module: { + rules: [ + { + test: /\.wat$/, + loader: "wast-loader", + type: "webassembly/async" + } + ] + }, + output: { + webassemblyModuleFilename: "[id].[hash].wasm" + }, + experiments: { + asyncWebAssembly: true + } + }, + { + target: "node", + module: { + rules: [ + { + test: /\.wat$/, + loader: "wast-loader", + type: "webassembly/sync" + } + ] + }, + output: { + module: true, + webassemblyModuleFilename: "[id].[hash].wasm" + }, + experiments: { + outputModule: true, + syncWebAssembly: true + } + }, + { + target: "node", + module: { + rules: [ + { + test: /\.wat$/, + loader: "wast-loader", + type: "webassembly/sync" + } + ] + }, + output: { + module: false, + webassemblyModuleFilename: "[id].[hash].wasm" + }, + experiments: { + syncWebAssembly: true + } + } +]; diff --git a/test/configCases/wasm/bigints/index.js b/test/configCases/wasm/bigints/index.js new file mode 100644 index 00000000000..35b576ddeda --- /dev/null +++ b/test/configCases/wasm/bigints/index.js @@ -0,0 +1,9 @@ +it("should allow converting i64s to JS bigints", async () => { + const { getI64 } = await import("./wasm.wat"); + expect(getI64()).toEqual(42n); +}); + +it("should allow converting JS bigints to i64s", async () => { + const { takeI64 } = await import("./wasm.wat"); + takeI64(42n); +}) diff --git a/test/configCases/wasm/bigints/test.filter.js b/test/configCases/wasm/bigints/test.filter.js new file mode 100644 index 00000000000..5877dc27294 --- /dev/null +++ b/test/configCases/wasm/bigints/test.filter.js @@ -0,0 +1,6 @@ +const supports = require("webassembly-feature"); + +module.exports = function (config) { + // eslint-disable-next-line new-cap + return supports["JS-BigInt-integration"](); +}; diff --git a/test/configCases/wasm/bigints/wasm.wat b/test/configCases/wasm/bigints/wasm.wat new file mode 100644 index 00000000000..94789d52d4b --- /dev/null +++ b/test/configCases/wasm/bigints/wasm.wat @@ -0,0 +1,4 @@ +(module + (func (export "getI64") (result i64) + i64.const 42) + (func (export "takeI64") (param i64))) diff --git a/test/configCases/wasm/bigints/webpack.config.js b/test/configCases/wasm/bigints/webpack.config.js new file mode 100644 index 00000000000..63567a47504 --- /dev/null +++ b/test/configCases/wasm/bigints/webpack.config.js @@ -0,0 +1,16 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: "./index", + module: { + rules: [ + { + test: /\.wat$/, + loader: "wast-loader", + type: "webassembly/sync" + } + ] + }, + experiments: { + syncWebAssembly: true + } +}; diff --git a/test/configCases/wasm/export-imported-global/env.js b/test/configCases/wasm/export-imported-global/env.js new file mode 100644 index 00000000000..baa33171481 --- /dev/null +++ b/test/configCases/wasm/export-imported-global/env.js @@ -0,0 +1,2 @@ +export const n = 1; +export const m = 1.25 diff --git a/test/configCases/wasm/export-imported-global/index.js b/test/configCases/wasm/export-imported-global/index.js new file mode 100644 index 00000000000..48b56ba4279 --- /dev/null +++ b/test/configCases/wasm/export-imported-global/index.js @@ -0,0 +1,18 @@ +it("should export imported global", function() { + return import("./module").then(function({ v, w, x, test }) { + if (WebAssembly.Global) { + expect(v.constructor).toBe(WebAssembly.Global); + expect(w.constructor).toBe(WebAssembly.Global); + expect(x.constructor).toBe(WebAssembly.Global); + + expect(+v).toBe(1); + expect(+w).toBe(1); + expect(+x).toBe(1.25); + } else { + expect(v).toBe(1); + expect(w).toBe(1); + expect(x).toBe(1.25); + } + expect(test()).toBe(2); + }); +}); diff --git a/test/configCases/wasm/export-imported-global/module.js b/test/configCases/wasm/export-imported-global/module.js new file mode 100644 index 00000000000..bd82c8f8b1c --- /dev/null +++ b/test/configCases/wasm/export-imported-global/module.js @@ -0,0 +1 @@ +export * from "./module.wat"; diff --git a/test/configCases/wasm/export-imported-global/module.wat b/test/configCases/wasm/export-imported-global/module.wat new file mode 100644 index 00000000000..c20daa39864 --- /dev/null +++ b/test/configCases/wasm/export-imported-global/module.wat @@ -0,0 +1,17 @@ +(module + (import "./env.js" "n" (global i32)) + (import "./env.js" "m" (global $g2 f64)) + (export "v" (global 0)) + (global $g i32 (get_global 0)) + (export "w" (global $g)) + (export "x" (global $g2)) + (func (export "test") (result i32) + get_global $g2 + get_global $g2 + f64.add + drop + get_global 0 + get_global $g + i32.add + ) +) diff --git a/test/configCases/wasm/export-imported-global/test.filter.js b/test/configCases/wasm/export-imported-global/test.filter.js new file mode 100644 index 00000000000..cb37e21905f --- /dev/null +++ b/test/configCases/wasm/export-imported-global/test.filter.js @@ -0,0 +1,5 @@ +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); + +module.exports = function (config) { + return supportsWebAssembly(); +}; diff --git a/test/configCases/wasm/export-imported-global/webpack.config.js b/test/configCases/wasm/export-imported-global/webpack.config.js new file mode 100644 index 00000000000..63567a47504 --- /dev/null +++ b/test/configCases/wasm/export-imported-global/webpack.config.js @@ -0,0 +1,16 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: "./index", + module: { + rules: [ + { + test: /\.wat$/, + loader: "wast-loader", + type: "webassembly/sync" + } + ] + }, + experiments: { + syncWebAssembly: true + } +}; diff --git a/test/configCases/wasm/externref/index.js b/test/configCases/wasm/externref/index.js new file mode 100644 index 00000000000..6bb55bb3072 --- /dev/null +++ b/test/configCases/wasm/externref/index.js @@ -0,0 +1,5 @@ +it("should work", function() { + return import("./pkg/wasm_lib.js").then(function(module) { + expect(module.test("my-str")).toBe("my-str"); + }); +}); diff --git a/test/configCases/wasm/externref/pkg/wasm_lib.js b/test/configCases/wasm/externref/pkg/wasm_lib.js new file mode 100644 index 00000000000..7341f72bbfb --- /dev/null +++ b/test/configCases/wasm/externref/pkg/wasm_lib.js @@ -0,0 +1,5 @@ +import * as wasm from "./wasm_lib_bg.wasm"; +export * from "./wasm_lib_bg.js"; +import { __wbg_set_wasm } from "./wasm_lib_bg.js"; +__wbg_set_wasm(wasm); +wasm.__wbindgen_start(); diff --git a/test/configCases/wasm/externref/pkg/wasm_lib_bg.js b/test/configCases/wasm/externref/pkg/wasm_lib_bg.js new file mode 100644 index 00000000000..0e41af62de0 --- /dev/null +++ b/test/configCases/wasm/externref/pkg/wasm_lib_bg.js @@ -0,0 +1,49 @@ +let wasm; +export function __wbg_set_wasm(val) { + wasm = val; +} + + +const lTextDecoder = typeof TextDecoder === 'undefined' ? (0, module.require)('util').TextDecoder : TextDecoder; + +let cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true }); + +cachedTextDecoder.decode(); + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} +/** + * @param {string} string + * @returns {string} + */ +export function test(string) { + const ret = wasm.test(string); + return ret; +} + +export function __wbindgen_init_externref_table() { + const table = wasm.__wbindgen_export_0; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); + ; +}; + +export function __wbindgen_throw(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); +}; + diff --git a/test/configCases/wasm/externref/pkg/wasm_lib_bg.wasm b/test/configCases/wasm/externref/pkg/wasm_lib_bg.wasm new file mode 100644 index 00000000000..464543ca75d Binary files /dev/null and b/test/configCases/wasm/externref/pkg/wasm_lib_bg.wasm differ diff --git a/test/configCases/wasm/externref/test.filter.js b/test/configCases/wasm/externref/test.filter.js new file mode 100644 index 00000000000..268b2fc7e60 --- /dev/null +++ b/test/configCases/wasm/externref/test.filter.js @@ -0,0 +1,7 @@ +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); + +module.exports = function (config) { + const [major] = process.versions.node.split(".").map(Number); + + return major >= 18 && supportsWebAssembly(); +}; diff --git a/test/configCases/wasm/externref/webpack.config.js b/test/configCases/wasm/externref/webpack.config.js new file mode 100644 index 00000000000..2a575598785 --- /dev/null +++ b/test/configCases/wasm/externref/webpack.config.js @@ -0,0 +1,11 @@ +/** @typedef {import("../../../../").Compiler} Compiler */ + +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + webassemblyModuleFilename: "[id].[hash].wasm" + }, + experiments: { + asyncWebAssembly: true + } +}; diff --git a/test/configCases/wasm/fetch/index.js b/test/configCases/wasm/fetch/index.js new file mode 100644 index 00000000000..05e4840967b --- /dev/null +++ b/test/configCases/wasm/fetch/index.js @@ -0,0 +1,6 @@ +it("should work", function() { + return import("./module").then(function(module) { + const result = module.run(); + expect(result).toEqual(84); + }); +}); diff --git a/test/configCases/wasm/fetch/module.js b/test/configCases/wasm/fetch/module.js new file mode 100644 index 00000000000..a10de684530 --- /dev/null +++ b/test/configCases/wasm/fetch/module.js @@ -0,0 +1,6 @@ +import { getNumber } from "./wasm.wat?1"; +import { getNumber as getNumber2 } from "./wasm.wat?2"; + +export function run() { + return getNumber() + getNumber2(); +} diff --git a/test/configCases/wasm/fetch/test.config.js b/test/configCases/wasm/fetch/test.config.js new file mode 100644 index 00000000000..9deeb4af110 --- /dev/null +++ b/test/configCases/wasm/fetch/test.config.js @@ -0,0 +1,39 @@ +const fs = require("fs"); +const url = require("url"); +const path = require("path"); + +module.exports = { + findBundle(i, options) { + switch (i) { + case 0: + return ["bundle0.mjs"]; + case 1: + return ["chunks/93.async.js", "bundle1.js"]; + case 2: + return ["bundle2.mjs"]; + case 3: + return ["chunks/93.sync.js", "bundle3.js"]; + } + }, + moduleScope(scope, options) { + scope.fetch = resource => + new Promise((resolve, reject) => { + const file = /^file:/i.test(resource) + ? url.fileURLToPath(resource) + : path.join(options.output.path, path.basename(resource)); + + fs.readFile(file, (err, data) => { + if (err) { + reject(err); + return; + } + + return resolve( + new Response(data, { + headers: { "Content-Type": "application/wasm" } + }) + ); + }); + }); + } +}; diff --git a/test/configCases/wasm/fetch/test.filter.js b/test/configCases/wasm/fetch/test.filter.js new file mode 100644 index 00000000000..b9b823dda69 --- /dev/null +++ b/test/configCases/wasm/fetch/test.filter.js @@ -0,0 +1,6 @@ +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsResponse = require("../../../helpers/supportsResponse"); + +module.exports = function (config) { + return supportsWebAssembly() && supportsResponse(); +}; diff --git a/test/configCases/wasm/fetch/wasm.wat b/test/configCases/wasm/fetch/wasm.wat new file mode 100644 index 00000000000..3a135271020 --- /dev/null +++ b/test/configCases/wasm/fetch/wasm.wat @@ -0,0 +1,10 @@ +(module + (type $t0 (func (param i32 i32) (result i32))) + (type $t1 (func (result i32))) + (func $add (export "add") (type $t0) (param $p0 i32) (param $p1 i32) (result i32) + (i32.add + (get_local $p0) + (get_local $p1))) + (func $getNumber (export "getNumber") (type $t1) (result i32) + (i32.const 42))) + diff --git a/test/configCases/wasm/fetch/webpack.config.js b/test/configCases/wasm/fetch/webpack.config.js new file mode 100644 index 00000000000..43ae72b2a69 --- /dev/null +++ b/test/configCases/wasm/fetch/webpack.config.js @@ -0,0 +1,82 @@ +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + target: "web", + module: { + rules: [ + { + test: /\.wat$/, + loader: "wast-loader", + type: "webassembly/async" + } + ] + }, + output: { + module: true, + chunkFilename: "chunks/[name].async.mjs", + webassemblyModuleFilename: "[id].[hash].module.async.wasm" + }, + experiments: { + outputModule: true, + asyncWebAssembly: true + } + }, + { + target: "web", + module: { + rules: [ + { + test: /\.wat$/, + loader: "wast-loader", + type: "webassembly/async" + } + ] + }, + output: { + chunkFilename: "chunks/[name].async.js", + webassemblyModuleFilename: "[id].[hash].async.wasm" + }, + experiments: { + asyncWebAssembly: true + } + }, + { + target: "web", + module: { + rules: [ + { + test: /\.wat$/, + loader: "wast-loader", + type: "webassembly/sync" + } + ] + }, + output: { + chunkFilename: "chunks/[name].sync.mjs", + webassemblyModuleFilename: "[id].[hash].module.sync.wasm" + }, + experiments: { + outputModule: true, + syncWebAssembly: true + } + }, + { + target: "web", + module: { + rules: [ + { + test: /\.wat$/, + loader: "wast-loader", + type: "webassembly/sync" + } + ] + }, + output: { + chunkFilename: "chunks/[name].sync.js", + webassemblyModuleFilename: "[id].[hash].sync.wasm" + }, + experiments: { + syncWebAssembly: true + } + } +]; diff --git a/test/configCases/wasm/identical/module.js b/test/configCases/wasm/identical/module.js index 14eb8ae2f07..a10de684530 100644 --- a/test/configCases/wasm/identical/module.js +++ b/test/configCases/wasm/identical/module.js @@ -3,4 +3,4 @@ import { getNumber as getNumber2 } from "./wasm.wat?2"; export function run() { return getNumber() + getNumber2(); -}; +} diff --git a/test/configCases/wasm/identical/test.filter.js b/test/configCases/wasm/identical/test.filter.js index 23177349638..cb37e21905f 100644 --- a/test/configCases/wasm/identical/test.filter.js +++ b/test/configCases/wasm/identical/test.filter.js @@ -1,5 +1,5 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); -module.exports = function(config) { +module.exports = function (config) { return supportsWebAssembly(); }; diff --git a/test/configCases/wasm/identical/webpack.config.js b/test/configCases/wasm/identical/webpack.config.js index 2081ec1207c..676ea5c8ef3 100644 --- a/test/configCases/wasm/identical/webpack.config.js +++ b/test/configCases/wasm/identical/webpack.config.js @@ -1,35 +1,40 @@ const { CachedSource } = require("webpack-sources"); +const { AsyncWebAssemblyModulesPlugin } = require("../../../../").wasm; -/** @typedef {import("../../../lib/Compilation")} Compilation */ +/** @typedef {import("../../../../").Compiler} Compiler */ +/** @type {import("../../../../").Configuration} */ module.exports = { module: { rules: [ { test: /\.wat$/, loader: "wast-loader", - type: "webassembly/experimental" + type: "webassembly/async" } ] }, + output: { + webassemblyModuleFilename: "[id].[hash].wasm" + }, + experiments: { + asyncWebAssembly: true + }, plugins: [ - function() { - this.hooks.compilation.tap( - "Test", - /** - * @param {Compilation} compilation Compilation - * @returns {void} - */ - compilation => { - compilation.moduleTemplates.webassembly.hooks.package.tap( - "Test", - source => { - // this is important to make each returned value a new instance - return new CachedSource(source); - } - ); - } - ); + /** + * @this {Compiler} compiler + */ + function () { + this.hooks.compilation.tap("Test", compilation => { + AsyncWebAssemblyModulesPlugin.getCompilationHooks( + compilation + ).renderModuleContent.tap( + "Test", + source => + // this is important to make each returned value a new instance + new CachedSource(source) + ); + }); } ] }; diff --git a/test/configCases/wasm/import-wasm-wasm/index.js b/test/configCases/wasm/import-wasm-wasm/index.js new file mode 100644 index 00000000000..39971c03010 --- /dev/null +++ b/test/configCases/wasm/import-wasm-wasm/index.js @@ -0,0 +1,6 @@ +it("should allow to run a WebAssembly module with imports", function() { + return import("./wasm.wat").then(function(wasm) { + const result = wasm.addNumber(20); + expect(result).toEqual(42); + }); +}); diff --git a/test/configCases/wasm/import-wasm-wasm/test.filter.js b/test/configCases/wasm/import-wasm-wasm/test.filter.js new file mode 100644 index 00000000000..cb37e21905f --- /dev/null +++ b/test/configCases/wasm/import-wasm-wasm/test.filter.js @@ -0,0 +1,5 @@ +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); + +module.exports = function (config) { + return supportsWebAssembly(); +}; diff --git a/test/configCases/wasm/import-wasm-wasm/wasm.wat b/test/configCases/wasm/import-wasm-wasm/wasm.wat new file mode 100644 index 00000000000..3c9f7ca0f83 --- /dev/null +++ b/test/configCases/wasm/import-wasm-wasm/wasm.wat @@ -0,0 +1,9 @@ +(module + (type $t0 (func (result i32))) + (type $t1 (func (param i32) (result i32))) + (import "./wasm2.wat" "getNumber" (func $./wasm2.wasm.getNumber (type $t0))) + (func $addNumber (export "addNumber") (type $t1) (param $p0 i32) (result i32) + (i32.add + (get_local $p0) + (call $./wasm2.wasm.getNumber)))) + diff --git a/test/configCases/wasm/import-wasm-wasm/wasm2.wat b/test/configCases/wasm/import-wasm-wasm/wasm2.wat new file mode 100644 index 00000000000..0331fb4fc15 --- /dev/null +++ b/test/configCases/wasm/import-wasm-wasm/wasm2.wat @@ -0,0 +1,5 @@ +(module + (type $t0 (func (result i32))) + (func $getNumber (export "getNumber") (type $t0) (result i32) + (i32.const 22))) + diff --git a/test/configCases/wasm/import-wasm-wasm/webpack.config.js b/test/configCases/wasm/import-wasm-wasm/webpack.config.js new file mode 100644 index 00000000000..63567a47504 --- /dev/null +++ b/test/configCases/wasm/import-wasm-wasm/webpack.config.js @@ -0,0 +1,16 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: "./index", + module: { + rules: [ + { + test: /\.wat$/, + loader: "wast-loader", + type: "webassembly/sync" + } + ] + }, + experiments: { + syncWebAssembly: true + } +}; diff --git a/test/configCases/wasm/missing-wasm-experiment/errors.js b/test/configCases/wasm/missing-wasm-experiment/errors.js new file mode 100644 index 00000000000..42b03522a5b --- /dev/null +++ b/test/configCases/wasm/missing-wasm-experiment/errors.js @@ -0,0 +1 @@ +module.exports = [[/BREAKING CHANGE/, /experiments\.asyncWebAssembly/]]; diff --git a/test/configCases/wasm/missing-wasm-experiment/index.js b/test/configCases/wasm/missing-wasm-experiment/index.js new file mode 100644 index 00000000000..b8a5b16e792 --- /dev/null +++ b/test/configCases/wasm/missing-wasm-experiment/index.js @@ -0,0 +1,3 @@ +it("should not compile the module", function () { + expect(() => require("./wasm.wasm")); +}); diff --git a/test/configCases/wasm/missing-wasm-experiment/infrastructure-log.js b/test/configCases/wasm/missing-wasm-experiment/infrastructure-log.js new file mode 100644 index 00000000000..e729fa65151 --- /dev/null +++ b/test/configCases/wasm/missing-wasm-experiment/infrastructure-log.js @@ -0,0 +1,3 @@ +module.exports = [ + /^Pack got invalid because of write to: Compilation\/modules.+wasm.wasm$/ +]; diff --git a/test/configCases/wasm/missing-wasm-experiment/wasm.wasm b/test/configCases/wasm/missing-wasm-experiment/wasm.wasm new file mode 100644 index 00000000000..8374df1439f Binary files /dev/null and b/test/configCases/wasm/missing-wasm-experiment/wasm.wasm differ diff --git a/test/configCases/wasm/missing-wasm-experiment/webpack.config.js b/test/configCases/wasm/missing-wasm-experiment/webpack.config.js new file mode 100644 index 00000000000..3583b70a321 --- /dev/null +++ b/test/configCases/wasm/missing-wasm-experiment/webpack.config.js @@ -0,0 +1,2 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = {}; diff --git a/test/configCases/wasm/reference-types/index.js b/test/configCases/wasm/reference-types/index.js new file mode 100644 index 00000000000..43ffb723b03 --- /dev/null +++ b/test/configCases/wasm/reference-types/index.js @@ -0,0 +1,6 @@ +it("should work", function() { + return import("./pkg/wasm_lib.js").then(function(module) { + const cls = new module.Stuff(); + expect(cls.refThing("my-str")).toBe("my-str"); + }); +}); diff --git a/test/configCases/wasm/reference-types/pkg/wasm_lib.js b/test/configCases/wasm/reference-types/pkg/wasm_lib.js new file mode 100644 index 00000000000..7341f72bbfb --- /dev/null +++ b/test/configCases/wasm/reference-types/pkg/wasm_lib.js @@ -0,0 +1,5 @@ +import * as wasm from "./wasm_lib_bg.wasm"; +export * from "./wasm_lib_bg.js"; +import { __wbg_set_wasm } from "./wasm_lib_bg.js"; +__wbg_set_wasm(wasm); +wasm.__wbindgen_start(); diff --git a/test/configCases/wasm/reference-types/pkg/wasm_lib_bg.js b/test/configCases/wasm/reference-types/pkg/wasm_lib_bg.js new file mode 100644 index 00000000000..84bdb2a8948 --- /dev/null +++ b/test/configCases/wasm/reference-types/pkg/wasm_lib_bg.js @@ -0,0 +1,279 @@ +let wasm; +export function __wbg_set_wasm(val) { + wasm = val; +} + + +let WASM_VECTOR_LEN = 0; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +const lTextEncoder = typeof TextEncoder === 'undefined' ? (0, module.require)('util').TextEncoder : TextEncoder; + +let cachedTextEncoder = new lTextEncoder('utf-8'); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (typeof(arg) !== 'string') throw new Error(`expected a string argument, found ${typeof(arg)}`); + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + if (ret.read !== arg.length) throw new Error('failed to pass whole string'); + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +let cachedDataViewMemory0 = null; + +function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); + } + return cachedDataViewMemory0; +} + +const lTextDecoder = typeof TextDecoder === 'undefined' ? (0, module.require)('util').TextDecoder : TextDecoder; + +let cachedTextDecoder = new lTextDecoder('utf-8', { ignoreBOM: true, fatal: true }); + +cachedTextDecoder.decode(); + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +export function start() { + wasm.start(); +} + +function _assertNum(n) { + if (typeof(n) !== 'number') throw new Error(`expected a number argument, found ${typeof(n)}`); +} + +function logError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + let error = (function () { + try { + return e instanceof Error ? `${e.message}\n\nStack:\n${e.stack}` : e.toString(); + } catch(_) { + return ""; + } + }()); + console.error("wasm-bindgen: imported JS function that was not marked as `catch` threw an error:", error); + throw e; + } +} + +function addToExternrefTable0(obj) { + const idx = wasm.__wbindgen_export_5(); + wasm.__wbindgen_export_2.set(idx, obj); + return idx; +} + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + const idx = addToExternrefTable0(e); + wasm.__wbindgen_export_4(idx); + } +} + +const StuffFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_stuff_free(ptr >>> 0, 1)); + +export class Stuff { + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + StuffFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_stuff_free(ptr, 0); + } + constructor() { + const ret = wasm.stuff_new(); + this.__wbg_ptr = ret >>> 0; + StuffFinalization.register(this, this.__wbg_ptr, this); + return this; + } + /** + * @param {any} value + * @returns {string} + */ + refThing(value) { + let deferred1_0; + let deferred1_1; + try { + if (this.__wbg_ptr == 0) throw new Error('Attempt to use a moved value'); + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + _assertNum(this.__wbg_ptr); + wasm.stuff_refThing(retptr, this.__wbg_ptr, value); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + deferred1_0 = r0; + deferred1_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_export_3(deferred1_0, deferred1_1, 1); + } + } +} + +export function __wbindgen_string_get(arg0, arg1) { + const obj = arg1; + const ret = typeof(obj) === 'string' ? obj : undefined; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_export_0, wasm.__wbindgen_export_1); + var len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); +}; + +export function __wbg_new_abda76e883ba8a5f() { return logError(function () { + const ret = new Error(); + return ret; +}, arguments) }; + +export function __wbg_stack_658279fe44541cf6() { return logError(function (arg0, arg1) { + const ret = arg1.stack; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_export_0, wasm.__wbindgen_export_1); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); +}, arguments) }; + +export function __wbg_error_f851667af71bcfc6() { return logError(function (arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.error(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_export_3(deferred0_0, deferred0_1, 1); + } +}, arguments) }; + +export function __wbg_log_c9486ca5d8e2cbe8() { return logError(function (arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.log(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_export_3(deferred0_0, deferred0_1, 1); + } +}, arguments) }; + +export function __wbg_log_aba5996d9bde071f() { return logError(function (arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.log(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3), getStringFromWasm0(arg4, arg5), getStringFromWasm0(arg6, arg7)); + } finally { + wasm.__wbindgen_export_3(deferred0_0, deferred0_1, 1); + } +}, arguments) }; + +export function __wbg_mark_40e050a77cc39fea() { return logError(function (arg0, arg1) { + performance.mark(getStringFromWasm0(arg0, arg1)); +}, arguments) }; + +export function __wbg_measure_aa7a73f17813f708() { return handleError(function (arg0, arg1, arg2, arg3) { + let deferred0_0; + let deferred0_1; + let deferred1_0; + let deferred1_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + deferred1_0 = arg2; + deferred1_1 = arg3; + performance.measure(getStringFromWasm0(arg0, arg1), getStringFromWasm0(arg2, arg3)); + } finally { + wasm.__wbindgen_export_3(deferred0_0, deferred0_1, 1); + wasm.__wbindgen_export_3(deferred1_0, deferred1_1, 1); + } +}, arguments) }; + +export function __wbindgen_throw(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); +}; + +export function __wbindgen_init_externref_table() { + const table = wasm.__wbindgen_export_2; + const offset = table.grow(4); + table.set(0, undefined); + table.set(offset + 0, undefined); + table.set(offset + 1, null); + table.set(offset + 2, true); + table.set(offset + 3, false); + ; +}; + diff --git a/test/configCases/wasm/reference-types/pkg/wasm_lib_bg.wasm b/test/configCases/wasm/reference-types/pkg/wasm_lib_bg.wasm new file mode 100644 index 00000000000..7a08e86a182 Binary files /dev/null and b/test/configCases/wasm/reference-types/pkg/wasm_lib_bg.wasm differ diff --git a/test/configCases/wasm/reference-types/test.filter.js b/test/configCases/wasm/reference-types/test.filter.js new file mode 100644 index 00000000000..268b2fc7e60 --- /dev/null +++ b/test/configCases/wasm/reference-types/test.filter.js @@ -0,0 +1,7 @@ +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); + +module.exports = function (config) { + const [major] = process.versions.node.split(".").map(Number); + + return major >= 18 && supportsWebAssembly(); +}; diff --git a/test/configCases/wasm/reference-types/webpack.config.js b/test/configCases/wasm/reference-types/webpack.config.js new file mode 100644 index 00000000000..2a575598785 --- /dev/null +++ b/test/configCases/wasm/reference-types/webpack.config.js @@ -0,0 +1,11 @@ +/** @typedef {import("../../../../").Compiler} Compiler */ + +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + webassemblyModuleFilename: "[id].[hash].wasm" + }, + experiments: { + asyncWebAssembly: true + } +}; diff --git a/test/configCases/wasm/universal/index.js b/test/configCases/wasm/universal/index.js new file mode 100644 index 00000000000..1f57a507ec2 --- /dev/null +++ b/test/configCases/wasm/universal/index.js @@ -0,0 +1,27 @@ +it("should allow to run a WebAssembly module (indirect)", function() { + return import("./module").then(function(module) { + const result = module.run(); + expect(result).toEqual(42); + }); +}); + +it("should allow to run a WebAssembly module (direct)", function() { + return import("./wasm.wat?2").then(function(wasm) { + const result = wasm.add(wasm.getNumber(), 2); + expect(result).toEqual(42); + }); +}); + +it("should allow to run a WebAssembly module (in Worker)", async function() { + const worker = new Worker(new URL("./worker.js", import.meta.url), { + type: "module" + }); + worker.postMessage("ok"); + const result = await new Promise(resolve => { + worker.onmessage = event => { + resolve(event.data); + }; + }); + expect(result).toBe("data: 42, thanks"); + await worker.terminate(); +}); diff --git a/test/configCases/wasm/universal/module.js b/test/configCases/wasm/universal/module.js new file mode 100644 index 00000000000..75232dccede --- /dev/null +++ b/test/configCases/wasm/universal/module.js @@ -0,0 +1,5 @@ +import { add, getNumber } from "./wasm.wat?1"; + +export function run() { + return add(getNumber(), 2); +} diff --git a/test/configCases/wasm/universal/test.config.js b/test/configCases/wasm/universal/test.config.js new file mode 100644 index 00000000000..c8746aca86d --- /dev/null +++ b/test/configCases/wasm/universal/test.config.js @@ -0,0 +1,28 @@ +const fs = require("fs"); +const url = require("url"); + +module.exports = { + moduleScope(scope, options) { + if (options.name.includes("node")) { + delete scope.window; + delete scope.document; + delete scope.self; + } else { + scope.fetch = resource => + new Promise((resolve, reject) => { + fs.readFile(url.fileURLToPath(resource), (err, data) => { + if (err) { + reject(err); + return; + } + + return resolve( + new Response(data, { + headers: { "Content-Type": "application/wasm" } + }) + ); + }); + }); + } + } +}; diff --git a/test/configCases/wasm/universal/test.filter.js b/test/configCases/wasm/universal/test.filter.js new file mode 100644 index 00000000000..b9b823dda69 --- /dev/null +++ b/test/configCases/wasm/universal/test.filter.js @@ -0,0 +1,6 @@ +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsResponse = require("../../../helpers/supportsResponse"); + +module.exports = function (config) { + return supportsWebAssembly() && supportsResponse(); +}; diff --git a/test/configCases/wasm/universal/wasm.wat b/test/configCases/wasm/universal/wasm.wat new file mode 100644 index 00000000000..477902e7f3c --- /dev/null +++ b/test/configCases/wasm/universal/wasm.wat @@ -0,0 +1,10 @@ +(module + (type $t0 (func (param i32 i32) (result i32))) + (type $t1 (func (result i32))) + (func $add (export "add") (type $t0) (param $p0 i32) (param $p1 i32) (result i32) + (i32.add + (get_local $p0) + (get_local $p1))) + (func $getNumber (export "getNumber") (type $t1) (result i32) + (i32.const 40))) + diff --git a/test/configCases/wasm/universal/webpack.config.js b/test/configCases/wasm/universal/webpack.config.js new file mode 100644 index 00000000000..5cea60cf511 --- /dev/null +++ b/test/configCases/wasm/universal/webpack.config.js @@ -0,0 +1,43 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = [ + { + name: "node", + target: ["web", "node"], + module: { + rules: [ + { + test: /\.wat$/, + loader: "wast-loader", + type: "webassembly/async" + } + ] + }, + output: { + webassemblyModuleFilename: "[id].[hash].wasm" + }, + experiments: { + outputModule: true, + asyncWebAssembly: true + } + }, + { + name: "web", + target: ["web", "node"], + module: { + rules: [ + { + test: /\.wat$/, + loader: "wast-loader", + type: "webassembly/async" + } + ] + }, + output: { + webassemblyModuleFilename: "[id].[hash].wasm" + }, + experiments: { + outputModule: true, + asyncWebAssembly: true + } + } +]; diff --git a/test/configCases/wasm/universal/worker.js b/test/configCases/wasm/universal/worker.js new file mode 100644 index 00000000000..18cefef9663 --- /dev/null +++ b/test/configCases/wasm/universal/worker.js @@ -0,0 +1,4 @@ +self.onmessage = async event => { + const { run } = await import("./module"); + postMessage(`data: ${run()}, thanks`); +}; diff --git a/test/configCases/wasm/wasm-in-initial-chunk-error/test.filter.js b/test/configCases/wasm/wasm-in-initial-chunk-error/test.filter.js index 0e71c44cb38..3ff8627200e 100644 --- a/test/configCases/wasm/wasm-in-initial-chunk-error/test.filter.js +++ b/test/configCases/wasm/wasm-in-initial-chunk-error/test.filter.js @@ -1,5 +1,5 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); -module.exports = function() { +module.exports = function () { return supportsWebAssembly(); }; diff --git a/test/configCases/wasm/wasm-in-initial-chunk-error/webpack.config.js b/test/configCases/wasm/wasm-in-initial-chunk-error/webpack.config.js index c673c27b334..47355aa66a7 100644 --- a/test/configCases/wasm/wasm-in-initial-chunk-error/webpack.config.js +++ b/test/configCases/wasm/wasm-in-initial-chunk-error/webpack.config.js @@ -1,12 +1,19 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { entry: "./index", + output: { + webassemblyModuleFilename: "[id].[hash:3].wasm" + }, module: { rules: [ { test: /\.wat$/, loader: "wast-loader", - type: "webassembly/experimental" + type: "webassembly/sync" } ] + }, + experiments: { + syncWebAssembly: true } }; diff --git a/test/configCases/web/attach-existing/chunk.js b/test/configCases/web/attach-existing/chunk.js new file mode 100644 index 00000000000..5c6b89abfc8 --- /dev/null +++ b/test/configCases/web/attach-existing/chunk.js @@ -0,0 +1 @@ +export default "ok"; diff --git a/test/configCases/web/attach-existing/index.js b/test/configCases/web/attach-existing/index.js new file mode 100644 index 00000000000..5c28a767558 --- /dev/null +++ b/test/configCases/web/attach-existing/index.js @@ -0,0 +1,27 @@ +const doImport = () => import(/* webpackChunkName: "the-chunk" */ "./chunk"); + +it("should be able to attach to an existing script tag", () => { + const script = document.createElement("script"); + script.setAttribute("data-webpack", 'my "app":chunk-the-chunk'); + script.src = "/somewhere/else.js"; + document.head.appendChild(script); + + const promise = doImport(); + + expect(document.head._children).toHaveLength(1); + + __non_webpack_require__("./the-chunk.js"); + script.onload(); + + return promise.then(module => { + expect(module).toEqual(nsObj({ default: "ok" })); + + const promise = doImport(); + + expect(document.head._children).toHaveLength(0); + + return promise.then(module2 => { + expect(module2).toBe(module); + }); + }); +}); diff --git a/test/configCases/web/attach-existing/webpack.config.js b/test/configCases/web/attach-existing/webpack.config.js new file mode 100644 index 00000000000..102ef6e7f42 --- /dev/null +++ b/test/configCases/web/attach-existing/webpack.config.js @@ -0,0 +1,15 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + output: { + chunkFilename: "[name].js", + uniqueName: 'my "app"' + }, + performance: { + hints: false + }, + optimization: { + chunkIds: "named", + minimize: false + } +}; diff --git a/test/configCases/web/fetch-priority-2/a.js b/test/configCases/web/fetch-priority-2/a.js new file mode 100644 index 00000000000..bbe151f3f4e --- /dev/null +++ b/test/configCases/web/fetch-priority-2/a.js @@ -0,0 +1,6 @@ +export default function() { + import(/* webpackPrefetch: true */ "./a"); + import(/* webpackPreload: true */ "./b"); + import(/* webpackPrefetch: 10, webpackFetchPriority: "low" */ "./c"); +} + diff --git a/test/configCases/web/fetch-priority-2/b.js b/test/configCases/web/fetch-priority-2/b.js new file mode 100644 index 00000000000..eff703ff465 --- /dev/null +++ b/test/configCases/web/fetch-priority-2/b.js @@ -0,0 +1 @@ +export default "b"; diff --git a/test/configCases/web/fetch-priority-2/c.js b/test/configCases/web/fetch-priority-2/c.js new file mode 100644 index 00000000000..5d50db5bc15 --- /dev/null +++ b/test/configCases/web/fetch-priority-2/c.js @@ -0,0 +1 @@ +export default "c"; diff --git a/test/configCases/web/fetch-priority-2/d.js b/test/configCases/web/fetch-priority-2/d.js new file mode 100644 index 00000000000..ff3b76bafe5 --- /dev/null +++ b/test/configCases/web/fetch-priority-2/d.js @@ -0,0 +1,3 @@ +export default function test() { + import("./d1"); +} diff --git a/test/configCases/web/fetch-priority-2/d1.js b/test/configCases/web/fetch-priority-2/d1.js new file mode 100644 index 00000000000..7334701be82 --- /dev/null +++ b/test/configCases/web/fetch-priority-2/d1.js @@ -0,0 +1,3 @@ +export default function test() { + import("./d2"); +} diff --git a/test/configCases/web/fetch-priority-2/d2.js b/test/configCases/web/fetch-priority-2/d2.js new file mode 100644 index 00000000000..e64231db397 --- /dev/null +++ b/test/configCases/web/fetch-priority-2/d2.js @@ -0,0 +1,3 @@ +export default function test() { + import(/* webpackFetchPriority: "high" */ "./d3"); +} diff --git a/test/configCases/web/fetch-priority-2/d3.js b/test/configCases/web/fetch-priority-2/d3.js new file mode 100644 index 00000000000..a665afd6b13 --- /dev/null +++ b/test/configCases/web/fetch-priority-2/d3.js @@ -0,0 +1 @@ +export default "d3"; diff --git a/test/configCases/web/fetch-priority-2/e.js b/test/configCases/web/fetch-priority-2/e.js new file mode 100644 index 00000000000..d97e38b22f5 --- /dev/null +++ b/test/configCases/web/fetch-priority-2/e.js @@ -0,0 +1 @@ +export default "e"; diff --git a/test/configCases/web/fetch-priority-2/index.js b/test/configCases/web/fetch-priority-2/index.js new file mode 100644 index 00000000000..39b1c05d025 --- /dev/null +++ b/test/configCases/web/fetch-priority-2/index.js @@ -0,0 +1,42 @@ +it("should set fetchPriority", () => { + import(/* webpackFetchPriority: "high" */ "./a"); + expect(document.head._children).toHaveLength(4); + const script1 = document.head._children[2]; + expect(script1._attributes.fetchpriority).toBe("high"); + + import(/* webpackFetchPriority: "low" */ "./b"); + expect(document.head._children).toHaveLength(5); + const script2 = document.head._children[4]; + expect(script2._attributes.fetchpriority).toBe("low"); + + import(/* webpackFetchPriority: "low" */ "./c"); + expect(document.head._children).toHaveLength(6); + const script3 = document.head._children[5]; + expect(script3._attributes.fetchpriority).toBe("low"); + + import(/* webpackPrefetch: 20, webpackFetchPriority: "auto" */ "./c"); + + import("./d") + expect(document.head._children).toHaveLength(7); + const script4 = document.head._children[6]; + expect(script4._attributes.fetchpriority).toBeUndefined(); + + import(/* webpackPrefetch: -20 */ "./d3"); + expect(document.head._children).toHaveLength(8); + const script5 = document.head._children[7]; + expect(script5._attributes.fetchpriority).toBeUndefined(); + + const condition = true; + + if (!condition) { + import(/* webpackFetchPriority: "high", webpackChunkName: "one" */ "./e"); + expect(document.head._children).toHaveLength(9); + const script6 = document.head._children[8]; + expect(script6._attributes.fetchpriority).toBe("high"); + } else { + import(/* webpackFetchPriority: "low", webpackChunkName: "two" */ "./e"); + expect(document.head._children).toHaveLength(9); + const script6 = document.head._children[8]; + expect(script6._attributes.fetchpriority).toBe("low"); + } +}); diff --git a/test/configCases/web/fetch-priority-2/webpack.config.js b/test/configCases/web/fetch-priority-2/webpack.config.js new file mode 100644 index 00000000000..df77841026e --- /dev/null +++ b/test/configCases/web/fetch-priority-2/webpack.config.js @@ -0,0 +1,26 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + output: { + chunkFilename: "[name].js", + crossOriginLoading: "anonymous" + }, + optimization: { + minimize: false, + splitChunks: { + minSize: 1 + } + }, + module: { + rules: [ + { + test: /d\.js$/, + parser: { + javascript: { + dynamicImportFetchPriority: "low" + } + } + } + ] + } +}; diff --git a/test/configCases/web/fetch-priority/a.js b/test/configCases/web/fetch-priority/a.js new file mode 100644 index 00000000000..75d7f01387d --- /dev/null +++ b/test/configCases/web/fetch-priority/a.js @@ -0,0 +1 @@ +export default "a"; \ No newline at end of file diff --git a/test/configCases/web/fetch-priority/b.js b/test/configCases/web/fetch-priority/b.js new file mode 100644 index 00000000000..abc75f1764c --- /dev/null +++ b/test/configCases/web/fetch-priority/b.js @@ -0,0 +1,3 @@ +import * as shared from './shared'; +console.log(shared); +export default "b"; \ No newline at end of file diff --git a/test/configCases/web/fetch-priority/b2.js b/test/configCases/web/fetch-priority/b2.js new file mode 100644 index 00000000000..abc75f1764c --- /dev/null +++ b/test/configCases/web/fetch-priority/b2.js @@ -0,0 +1,3 @@ +import * as shared from './shared'; +console.log(shared); +export default "b"; \ No newline at end of file diff --git a/test/configCases/web/fetch-priority/c.js b/test/configCases/web/fetch-priority/c.js new file mode 100644 index 00000000000..5d50db5bc15 --- /dev/null +++ b/test/configCases/web/fetch-priority/c.js @@ -0,0 +1 @@ +export default "c"; diff --git a/test/configCases/web/fetch-priority/d.js b/test/configCases/web/fetch-priority/d.js new file mode 100644 index 00000000000..2911b30a88e --- /dev/null +++ b/test/configCases/web/fetch-priority/d.js @@ -0,0 +1 @@ +export default "d"; \ No newline at end of file diff --git a/test/configCases/web/fetch-priority/dir/a.js b/test/configCases/web/fetch-priority/dir/a.js new file mode 100644 index 00000000000..e94fef18587 --- /dev/null +++ b/test/configCases/web/fetch-priority/dir/a.js @@ -0,0 +1 @@ +export default "a"; diff --git a/test/configCases/web/fetch-priority/dir/b.js b/test/configCases/web/fetch-priority/dir/b.js new file mode 100644 index 00000000000..eff703ff465 --- /dev/null +++ b/test/configCases/web/fetch-priority/dir/b.js @@ -0,0 +1 @@ +export default "b"; diff --git a/test/configCases/web/fetch-priority/e.js b/test/configCases/web/fetch-priority/e.js new file mode 100644 index 00000000000..d97e38b22f5 --- /dev/null +++ b/test/configCases/web/fetch-priority/e.js @@ -0,0 +1 @@ +export default "e"; diff --git a/test/statsCases/runtime-chunk-integration/f.js b/test/configCases/web/fetch-priority/f.js similarity index 100% rename from test/statsCases/runtime-chunk-integration/f.js rename to test/configCases/web/fetch-priority/f.js diff --git a/test/configCases/web/fetch-priority/g.js b/test/configCases/web/fetch-priority/g.js new file mode 100644 index 00000000000..43e665d61e0 --- /dev/null +++ b/test/configCases/web/fetch-priority/g.js @@ -0,0 +1 @@ +export default 'g'; diff --git a/test/configCases/web/fetch-priority/h.js b/test/configCases/web/fetch-priority/h.js new file mode 100644 index 00000000000..26382a66366 --- /dev/null +++ b/test/configCases/web/fetch-priority/h.js @@ -0,0 +1 @@ +export default 'h'; diff --git a/test/configCases/web/fetch-priority/i.js b/test/configCases/web/fetch-priority/i.js new file mode 100644 index 00000000000..4e08810c666 --- /dev/null +++ b/test/configCases/web/fetch-priority/i.js @@ -0,0 +1 @@ +export default 'i'; diff --git a/test/configCases/web/fetch-priority/index.js b/test/configCases/web/fetch-priority/index.js new file mode 100644 index 00000000000..d3e9ba94c20 --- /dev/null +++ b/test/configCases/web/fetch-priority/index.js @@ -0,0 +1,93 @@ +it("should set fetchPriority", () => { + // Single Chunk + import(/* webpackFetchPriority: "high" */ "./a"); + expect(document.head._children).toHaveLength(1); + const script1 = document.head._children[0]; + expect(script1._attributes.fetchpriority).toBe("high"); + + // Multiple Chunks + import(/* webpackFetchPriority: "high" */ "./b"); + import(/* webpackFetchPriority: "high" */ "./b2"); + expect(document.head._children).toHaveLength(4); + const script2 = document.head._children[1]; + const script3 = document.head._children[2]; + const script4 = document.head._children[3]; + expect(script2._attributes.fetchpriority).toBe("high"); + expect(script3._attributes.fetchpriority).toBe("high"); + expect(script4._attributes.fetchpriority).toBe("high"); + + // Single Chunk, low + import(/* webpackFetchPriority: "low" */ "./c"); + expect(document.head._children).toHaveLength(5); + const script5 = document.head._children[4]; + expect(script5._attributes.fetchpriority).toBe("low"); + + // Single Chunk, auto + import(/* webpackFetchPriority: "auto" */ "./d"); + expect(document.head._children).toHaveLength(6); + const script6 = document.head._children[5]; + expect(script6._attributes.fetchpriority).toBe("auto"); + + // No fetch priority + import("./e"); + expect(document.head._children).toHaveLength(7); + const script7 = document.head._children[6]; + expect(script7._attributes.fetchpriority).toBeUndefined(); + + // Webpack context + const loader = import.meta.webpackContext("./dir", { + mode: "lazy", + fetchPriority: "high" + }); + loader("./a"); + expect(document.head._children).toHaveLength(8); + const script8 = document.head._children[7]; + expect(script8._attributes.fetchpriority).toBeUndefined(); + + import(/* webpackFetchPriority: "auto" */ "./g"); + expect(document.head._children).toHaveLength(9); + const script9 = document.head._children[8]; + expect(script9._attributes.fetchpriority).toBe("auto"); + + import(/* webpackFetchPriority: "unknown" */ "./h.js"); + expect(document.head._children).toHaveLength(10); + const script10 = document.head._children[9]; + expect(script10._attributes.fetchpriority).toBeUndefined(); + + import(/* webpackFetchPriority: "high" */ "./i"); + import(/* webpackFetchPriority: "low" */ "./i"); + expect(document.head._children).toHaveLength(11); + const script11 = document.head._children[10]; + expect(script11._attributes.fetchpriority).toBe("high"); + + import(/* webpackFetchPriority: "low" */ "./j"); + import(/* webpackFetchPriority: "high" */ "./j"); + expect(document.head._children).toHaveLength(12); + const script12 = document.head._children[11]; + + expect(script12._attributes.fetchpriority).toBe("low"); + import(/* webpackFetchPriority: "low" */ "./k"); + import("./e"); + import(/* webpackFetchPriority: "high" */ "./k"); + expect(document.head._children).toHaveLength(13); + const script13 = document.head._children[12]; + expect(script13._attributes.fetchpriority).toBe("low"); + + __non_webpack_require__("./125.js"); + import(/* webpackFetchPriority: "high" */ "./style.css"); + expect(document.head._children).toHaveLength(14); + const link1 = document.head._children[13]; + expect(link1._attributes.fetchpriority).toBe("high"); + + __non_webpack_require__("./499.js"); + import("./style-1.css"); + expect(document.head._children).toHaveLength(15); + const link2 = document.head._children[14]; + expect(link2._attributes.fetchpriority).toBeUndefined(); + + __non_webpack_require__("./616.js"); + import(/* webpackFetchPriority: "low" */ "./style-2.css"); + expect(document.head._children).toHaveLength(16); + const link3 = document.head._children[15]; + expect(link3._attributes.fetchpriority).toBe("low"); +}); diff --git a/test/configCases/web/fetch-priority/j.js b/test/configCases/web/fetch-priority/j.js new file mode 100644 index 00000000000..28428765f93 --- /dev/null +++ b/test/configCases/web/fetch-priority/j.js @@ -0,0 +1 @@ +export default 'j'; diff --git a/test/configCases/web/fetch-priority/k.js b/test/configCases/web/fetch-priority/k.js new file mode 100644 index 00000000000..e06d76f3e4b --- /dev/null +++ b/test/configCases/web/fetch-priority/k.js @@ -0,0 +1 @@ +export default 'k'; diff --git a/test/configCases/web/fetch-priority/shared.js b/test/configCases/web/fetch-priority/shared.js new file mode 100644 index 00000000000..689b35f5965 --- /dev/null +++ b/test/configCases/web/fetch-priority/shared.js @@ -0,0 +1 @@ +export default "shared"; \ No newline at end of file diff --git a/test/configCases/web/fetch-priority/style-1.css b/test/configCases/web/fetch-priority/style-1.css new file mode 100644 index 00000000000..195b6bcf6d2 --- /dev/null +++ b/test/configCases/web/fetch-priority/style-1.css @@ -0,0 +1,3 @@ +a { + color: red; +} diff --git a/test/configCases/web/fetch-priority/style-2.css b/test/configCases/web/fetch-priority/style-2.css new file mode 100644 index 00000000000..195b6bcf6d2 --- /dev/null +++ b/test/configCases/web/fetch-priority/style-2.css @@ -0,0 +1,3 @@ +a { + color: red; +} diff --git a/test/configCases/web/fetch-priority/style.css b/test/configCases/web/fetch-priority/style.css new file mode 100644 index 00000000000..195b6bcf6d2 --- /dev/null +++ b/test/configCases/web/fetch-priority/style.css @@ -0,0 +1,3 @@ +a { + color: red; +} diff --git a/test/configCases/web/fetch-priority/warnings.js b/test/configCases/web/fetch-priority/warnings.js new file mode 100644 index 00000000000..9a0ecd96954 --- /dev/null +++ b/test/configCases/web/fetch-priority/warnings.js @@ -0,0 +1,3 @@ +module.exports = [ + [/`webpackFetchPriority` expected true or "low", "high" or "auto"/] +]; diff --git a/test/configCases/web/fetch-priority/webpack.config.js b/test/configCases/web/fetch-priority/webpack.config.js new file mode 100644 index 00000000000..c5f0efbe3cf --- /dev/null +++ b/test/configCases/web/fetch-priority/webpack.config.js @@ -0,0 +1,17 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + output: { + chunkFilename: "[name].js", + crossOriginLoading: "anonymous" + }, + experiments: { + css: true + }, + optimization: { + minimize: false, + splitChunks: { + minSize: 1 + } + } +}; diff --git a/test/configCases/web/node-source-future-defaults/index.js b/test/configCases/web/node-source-future-defaults/index.js new file mode 100644 index 00000000000..30e17bbb97d --- /dev/null +++ b/test/configCases/web/node-source-future-defaults/index.js @@ -0,0 +1,13 @@ +import "./no-warn" + +it("global", () => { + expect(typeof global).toBe("object"); +}); + +it("__filename", () => { + expect(typeof __filename).toBe("string"); +}); + +it("__dirname", () => { + expect(typeof __dirname).toBe("string"); +}); diff --git a/test/configCases/web/node-source-future-defaults/no-warn.js b/test/configCases/web/node-source-future-defaults/no-warn.js new file mode 100644 index 00000000000..4347c9dff05 --- /dev/null +++ b/test/configCases/web/node-source-future-defaults/no-warn.js @@ -0,0 +1,3 @@ +// top level global as identifier should not warn +let global = 1; +global = 2; diff --git a/test/configCases/web/node-source-future-defaults/warnings.js b/test/configCases/web/node-source-future-defaults/warnings.js new file mode 100644 index 00000000000..9c0b7c899f6 --- /dev/null +++ b/test/configCases/web/node-source-future-defaults/warnings.js @@ -0,0 +1,10 @@ +module.exports = [ + [/"global" has been used, it will be undefined in next major version/], + [/"__filename" has been used, it will be undefined in next major version/], + [/"__dirname" has been used, it will be undefined in next major version/], + + [/"global" has been used, it will be undefined in next major version/], + + [/"__filename" has been used, it will be undefined in next major version/], + [/"__dirname" has been used, it will be undefined in next major version/] +]; diff --git a/test/configCases/web/node-source-future-defaults/webpack.config.js b/test/configCases/web/node-source-future-defaults/webpack.config.js new file mode 100644 index 00000000000..f3f037144f2 --- /dev/null +++ b/test/configCases/web/node-source-future-defaults/webpack.config.js @@ -0,0 +1,27 @@ +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + target: "web", + optimization: false, + experiments: { + futureDefaults: true + } + }, + { + target: "web", + optimization: false, + node: { + __filename: "mock", + __dirname: "mock", + global: "warn" + } + }, + { + target: "web", + node: { + __filename: "warn-mock", + __dirname: "warn-mock", + global: true + } + } +]; diff --git a/test/configCases/web/node-source-global/index.js b/test/configCases/web/node-source-global/index.js new file mode 100644 index 00000000000..31fa335c81b --- /dev/null +++ b/test/configCases/web/node-source-global/index.js @@ -0,0 +1,9 @@ +it("should disallow rename global", () => { + var shouldBeGlobal = global; + // prevent optimizations + var method = shouldBeGlobal[String.fromCharCode(40, 40, 40)]; + method && method(); + eval("expect(shouldBeGlobal.value1).toBe('value1')"); + expect(shouldBeGlobal.test).toBe("test"); + expect(global.test).toBe("test"); +}); diff --git a/test/configCases/web/node-source-global/test.config.js b/test/configCases/web/node-source-global/test.config.js new file mode 100644 index 00000000000..b5337739a37 --- /dev/null +++ b/test/configCases/web/node-source-global/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + moduleScope(scope) { + scope.global = scope.global || {}; + scope.global.value1 = "error"; + scope.globalThis = scope.globalThis || {}; + scope.globalThis.value1 = "value1"; + } +}; diff --git a/test/configCases/web/node-source-global/webpack.config.js b/test/configCases/web/node-source-global/webpack.config.js new file mode 100644 index 00000000000..4cae9c33bd4 --- /dev/null +++ b/test/configCases/web/node-source-global/webpack.config.js @@ -0,0 +1,13 @@ +const { DefinePlugin } = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + node: { + global: true + }, + plugins: [ + new DefinePlugin({ + "global.test": "'test'" + }) + ] +}; diff --git a/test/configCases/web/node-source/index.mjs b/test/configCases/web/node-source/index.mjs index 259f3b65bae..b827c1aae1d 100644 --- a/test/configCases/web/node-source/index.mjs +++ b/test/configCases/web/node-source/index.mjs @@ -1,4 +1,4 @@ -// Block `require`, but keep Webpack from trying to work around it. +// Block `require`, but keep webpack from trying to work around it. eval("require = undefined") it("should compile fine", () => { diff --git a/test/configCases/web/node-source/webpack.config.js b/test/configCases/web/node-source/webpack.config.js index 721e519b077..6524ff2c4f2 100644 --- a/test/configCases/web/node-source/webpack.config.js +++ b/test/configCases/web/node-source/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { target: "web", entry: "./index.mjs", diff --git a/test/configCases/web/non-js-chunks-entrypoint-runtime-chunk/index.js b/test/configCases/web/non-js-chunks-entrypoint-runtime-chunk/index.js new file mode 100644 index 00000000000..734f9bbd4b2 --- /dev/null +++ b/test/configCases/web/non-js-chunks-entrypoint-runtime-chunk/index.js @@ -0,0 +1,6 @@ +import p from "package"; +import o from "other-package"; + +it("should run", () => { + console.log.bind(console, p, o); +}); diff --git a/test/configCases/web/non-js-chunks-entrypoint-runtime-chunk/node_modules/other-package/index.js b/test/configCases/web/non-js-chunks-entrypoint-runtime-chunk/node_modules/other-package/index.js new file mode 100644 index 00000000000..cb405526419 --- /dev/null +++ b/test/configCases/web/non-js-chunks-entrypoint-runtime-chunk/node_modules/other-package/index.js @@ -0,0 +1 @@ +export default "other-package"; diff --git a/test/configCases/web/non-js-chunks-entrypoint-runtime-chunk/node_modules/other-package/package.json b/test/configCases/web/non-js-chunks-entrypoint-runtime-chunk/node_modules/other-package/package.json new file mode 100644 index 00000000000..a510e8069cc --- /dev/null +++ b/test/configCases/web/non-js-chunks-entrypoint-runtime-chunk/node_modules/other-package/package.json @@ -0,0 +1,3 @@ +{ + "version": "1.2.3" +} diff --git a/test/configCases/web/non-js-chunks-entrypoint-runtime-chunk/node_modules/package/index.js b/test/configCases/web/non-js-chunks-entrypoint-runtime-chunk/node_modules/package/index.js new file mode 100644 index 00000000000..7f3e455325f --- /dev/null +++ b/test/configCases/web/non-js-chunks-entrypoint-runtime-chunk/node_modules/package/index.js @@ -0,0 +1 @@ +export default "package"; diff --git a/test/configCases/web/non-js-chunks-entrypoint-runtime-chunk/node_modules/package/package.json b/test/configCases/web/non-js-chunks-entrypoint-runtime-chunk/node_modules/package/package.json new file mode 100644 index 00000000000..a510e8069cc --- /dev/null +++ b/test/configCases/web/non-js-chunks-entrypoint-runtime-chunk/node_modules/package/package.json @@ -0,0 +1,3 @@ +{ + "version": "1.2.3" +} diff --git a/test/configCases/web/non-js-chunks-entrypoint-runtime-chunk/test.config.js b/test/configCases/web/non-js-chunks-entrypoint-runtime-chunk/test.config.js new file mode 100644 index 00000000000..7de30aabdd2 --- /dev/null +++ b/test/configCases/web/non-js-chunks-entrypoint-runtime-chunk/test.config.js @@ -0,0 +1,9 @@ +module.exports = { + findBundle(i, options) { + return [ + "runtime.js", + "main.js", + "vendors-node_modules_other-package_index_js-node_modules_package_index_js.js" + ]; + } +}; diff --git a/test/configCases/web/non-js-chunks-entrypoint-runtime-chunk/webpack.config.js b/test/configCases/web/non-js-chunks-entrypoint-runtime-chunk/webpack.config.js new file mode 100644 index 00000000000..ab7c49b156f --- /dev/null +++ b/test/configCases/web/non-js-chunks-entrypoint-runtime-chunk/webpack.config.js @@ -0,0 +1,29 @@ +const { ProvideSharedPlugin } = require("../../../../").sharing; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + filename: "[name].js" + }, + target: "web", + optimization: { + chunkIds: "named", + runtimeChunk: "single", + splitChunks: { + chunks: "all", + minSize: 1, + cacheGroups: { + share: { + type: "provide-module", + name: "provide-module", + enforce: true + } + } + } + }, + plugins: [ + new ProvideSharedPlugin({ + provides: ["package"] + }) + ] +}; diff --git a/test/configCases/web/non-js-chunks-entrypoint/index.js b/test/configCases/web/non-js-chunks-entrypoint/index.js new file mode 100644 index 00000000000..734f9bbd4b2 --- /dev/null +++ b/test/configCases/web/non-js-chunks-entrypoint/index.js @@ -0,0 +1,6 @@ +import p from "package"; +import o from "other-package"; + +it("should run", () => { + console.log.bind(console, p, o); +}); diff --git a/test/configCases/web/non-js-chunks-entrypoint/node_modules/other-package/index.js b/test/configCases/web/non-js-chunks-entrypoint/node_modules/other-package/index.js new file mode 100644 index 00000000000..cb405526419 --- /dev/null +++ b/test/configCases/web/non-js-chunks-entrypoint/node_modules/other-package/index.js @@ -0,0 +1 @@ +export default "other-package"; diff --git a/test/configCases/web/non-js-chunks-entrypoint/node_modules/other-package/package.json b/test/configCases/web/non-js-chunks-entrypoint/node_modules/other-package/package.json new file mode 100644 index 00000000000..a510e8069cc --- /dev/null +++ b/test/configCases/web/non-js-chunks-entrypoint/node_modules/other-package/package.json @@ -0,0 +1,3 @@ +{ + "version": "1.2.3" +} diff --git a/test/configCases/web/non-js-chunks-entrypoint/node_modules/package/index.js b/test/configCases/web/non-js-chunks-entrypoint/node_modules/package/index.js new file mode 100644 index 00000000000..7f3e455325f --- /dev/null +++ b/test/configCases/web/non-js-chunks-entrypoint/node_modules/package/index.js @@ -0,0 +1 @@ +export default "package"; diff --git a/test/configCases/web/non-js-chunks-entrypoint/node_modules/package/package.json b/test/configCases/web/non-js-chunks-entrypoint/node_modules/package/package.json new file mode 100644 index 00000000000..a510e8069cc --- /dev/null +++ b/test/configCases/web/non-js-chunks-entrypoint/node_modules/package/package.json @@ -0,0 +1,3 @@ +{ + "version": "1.2.3" +} diff --git a/test/configCases/web/non-js-chunks-entrypoint/test.config.js b/test/configCases/web/non-js-chunks-entrypoint/test.config.js new file mode 100644 index 00000000000..096ce4cd918 --- /dev/null +++ b/test/configCases/web/non-js-chunks-entrypoint/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + findBundle(i, options) { + return [ + "main.js", + "vendors-node_modules_other-package_index_js-node_modules_package_index_js.js" + ]; + } +}; diff --git a/test/configCases/web/non-js-chunks-entrypoint/webpack.config.js b/test/configCases/web/non-js-chunks-entrypoint/webpack.config.js new file mode 100644 index 00000000000..0f03aba307f --- /dev/null +++ b/test/configCases/web/non-js-chunks-entrypoint/webpack.config.js @@ -0,0 +1,28 @@ +const { ProvideSharedPlugin } = require("../../../../").sharing; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + filename: "[name].js" + }, + target: "web", + optimization: { + chunkIds: "named", + splitChunks: { + chunks: "all", + minSize: 1, + cacheGroups: { + share: { + type: "provide-module", + name: "provide-module", + enforce: true + } + } + } + }, + plugins: [ + new ProvideSharedPlugin({ + provides: ["package"] + }) + ] +}; diff --git a/test/configCases/web/nonce/chunk.css b/test/configCases/web/nonce/chunk.css new file mode 100644 index 00000000000..626e93720d0 --- /dev/null +++ b/test/configCases/web/nonce/chunk.css @@ -0,0 +1,3 @@ +.class { + color: red; +} diff --git a/test/configCases/web/nonce/chunk.js b/test/configCases/web/nonce/chunk.js new file mode 100644 index 00000000000..2ea721b3510 --- /dev/null +++ b/test/configCases/web/nonce/chunk.js @@ -0,0 +1 @@ +function test() {} diff --git a/test/configCases/web/nonce/index.js b/test/configCases/web/nonce/index.js new file mode 100644 index 00000000000..d6118bf4a80 --- /dev/null +++ b/test/configCases/web/nonce/index.js @@ -0,0 +1,28 @@ +import "./nonce"; + +it("should set nonce", () => { + expect(__webpack_nonce__).toBe("nonce"); +}); + +it("should set nonce attributes", () => { + import(/* webpackChunkName: "chunk-js" */ "./chunk.js"); + + expect(document.head._children).toHaveLength(1); + + const script = document.head._children[0]; + + expect(script._type).toBe("script"); + expect(script.getAttribute("nonce")).toBe("nonce"); + expect(script.src).toBe("https://example.com/chunk-js.js"); + + __non_webpack_require__('./chunk-css.js'); + import(/* webpackChunkName: "chunk-css" */ "./chunk.css"); + + expect(document.head._children).toHaveLength(2); + + const link = document.head._children[1]; + + expect(link._type).toBe("link"); + expect(link.getAttribute("nonce")).toBe("nonce"); + expect(link.href).toBe("https://example.com/chunk-css.css"); +}); diff --git a/test/configCases/web/nonce/nonce.js b/test/configCases/web/nonce/nonce.js new file mode 100644 index 00000000000..fb92c24d909 --- /dev/null +++ b/test/configCases/web/nonce/nonce.js @@ -0,0 +1,2 @@ +__webpack_nonce__ = "nonce"; +__webpack_public_path__ = "https://example.com/"; diff --git a/test/configCases/web/nonce/webpack.config.js b/test/configCases/web/nonce/webpack.config.js new file mode 100644 index 00000000000..eea796e3042 --- /dev/null +++ b/test/configCases/web/nonce/webpack.config.js @@ -0,0 +1,15 @@ +const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + output: { + publicPath: "", + filename: "bundle0.mjs", + chunkFilename: "[name].js" + }, + experiments: { + css: true + }, + // plugin that intercepts __webpack_require__ + plugins: [new webpack.HotModuleReplacementPlugin()] +}; diff --git a/test/configCases/web/preexecuted-chunk/chunk.js b/test/configCases/web/preexecuted-chunk/chunk.js new file mode 100644 index 00000000000..5c6b89abfc8 --- /dev/null +++ b/test/configCases/web/preexecuted-chunk/chunk.js @@ -0,0 +1 @@ +export default "ok"; diff --git a/test/configCases/web/preexecuted-chunk/index.js b/test/configCases/web/preexecuted-chunk/index.js new file mode 100644 index 00000000000..da11fdc97c2 --- /dev/null +++ b/test/configCases/web/preexecuted-chunk/index.js @@ -0,0 +1,4 @@ +it("should be able load the chunk", async () => { + const module = await import(/* webpackChunkName: "the-chunk" */ "./chunk"); + expect(module.default).toBe("ok"); +}); diff --git a/test/configCases/web/preexecuted-chunk/test.config.js b/test/configCases/web/preexecuted-chunk/test.config.js new file mode 100644 index 00000000000..6ad8df89ee3 --- /dev/null +++ b/test/configCases/web/preexecuted-chunk/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["the-chunk.js", "bundle0.js"]; + } +}; diff --git a/test/configCases/web/preexecuted-chunk/webpack.config.js b/test/configCases/web/preexecuted-chunk/webpack.config.js new file mode 100644 index 00000000000..e41f49d5157 --- /dev/null +++ b/test/configCases/web/preexecuted-chunk/webpack.config.js @@ -0,0 +1,14 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + output: { + chunkFilename: "[name].js" + }, + performance: { + hints: false + }, + optimization: { + chunkIds: "named", + minimize: false + } +}; diff --git a/test/configCases/web/prefetch-preload-module-jsonp/chunk1-a.css b/test/configCases/web/prefetch-preload-module-jsonp/chunk1-a.css new file mode 100644 index 00000000000..195b6bcf6d2 --- /dev/null +++ b/test/configCases/web/prefetch-preload-module-jsonp/chunk1-a.css @@ -0,0 +1,3 @@ +a { + color: red; +} diff --git a/test/configCases/web/prefetch-preload-module-jsonp/chunk1-a.js b/test/configCases/web/prefetch-preload-module-jsonp/chunk1-a.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/web/prefetch-preload-module-jsonp/chunk1-b.js b/test/configCases/web/prefetch-preload-module-jsonp/chunk1-b.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/web/prefetch-preload-module-jsonp/chunk1-c.js b/test/configCases/web/prefetch-preload-module-jsonp/chunk1-c.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/web/prefetch-preload-module-jsonp/chunk1.css b/test/configCases/web/prefetch-preload-module-jsonp/chunk1.css new file mode 100644 index 00000000000..195b6bcf6d2 --- /dev/null +++ b/test/configCases/web/prefetch-preload-module-jsonp/chunk1.css @@ -0,0 +1,3 @@ +a { + color: red; +} diff --git a/test/configCases/web/prefetch-preload-module-jsonp/chunk1.js b/test/configCases/web/prefetch-preload-module-jsonp/chunk1.js new file mode 100644 index 00000000000..7b433689c1a --- /dev/null +++ b/test/configCases/web/prefetch-preload-module-jsonp/chunk1.js @@ -0,0 +1,6 @@ +export default function() { + import(/* webpackPrefetch: true, webpackChunkName: "chunk1-a" */ "./chunk1-a"); + import(/* webpackPreload: true, webpackChunkName: "chunk1-b" */ "./chunk1-b"); + import(/* webpackPreload: true, webpackChunkName: "chunk1-a-css" */ "./chunk1-a.css"); + import(/* webpackPrefetch: 10, webpackChunkName: "chunk1-c" */ "./chunk1-c"); +} diff --git a/test/configCases/web/prefetch-preload-module-jsonp/chunk2.css b/test/configCases/web/prefetch-preload-module-jsonp/chunk2.css new file mode 100644 index 00000000000..3b4cc03b68a --- /dev/null +++ b/test/configCases/web/prefetch-preload-module-jsonp/chunk2.css @@ -0,0 +1,3 @@ +a { + color: blue; +} diff --git a/test/configCases/web/prefetch-preload-module-jsonp/chunk2.js b/test/configCases/web/prefetch-preload-module-jsonp/chunk2.js new file mode 100644 index 00000000000..a225cae317f --- /dev/null +++ b/test/configCases/web/prefetch-preload-module-jsonp/chunk2.js @@ -0,0 +1,4 @@ +export default function() { + import(/* webpackPrefetch: true, webpackChunkName: "chunk1-a" */ "./chunk1-a"); + import(/* webpackPreload: true, webpackChunkName: "chunk1-b" */ "./chunk1-b"); +} diff --git a/test/configCases/web/prefetch-preload-module-jsonp/index.mjs b/test/configCases/web/prefetch-preload-module-jsonp/index.mjs new file mode 100644 index 00000000000..8e7e56ba90b --- /dev/null +++ b/test/configCases/web/prefetch-preload-module-jsonp/index.mjs @@ -0,0 +1,139 @@ +// This config need to be set on initial evaluation to be effective +__webpack_nonce__ = "nonce"; +__webpack_public_path__ = "https://example.com/public/path/"; + +it("should prefetch and preload child chunks on chunk load", () => { + let link, script; + + expect(document.head._children).toHaveLength(3); + + // Test prefetch from entry chunk + link = document.head._children[0]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("prefetch"); + expect(link.as).toBe("script"); + expect(link.href).toBe("https://example.com/public/path/chunk1.js"); + + link = document.head._children[1]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("prefetch"); + expect(link.as).toBe("style"); + expect(link.href).toBe("https://example.com/public/path/chunk2-css.css"); + + link = document.head._children[2]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("prefetch"); + expect(link.as).toBe("script"); + expect(link.href).toBe("https://example.com/public/path/chunk2-css.js"); + + const promise = import( + /* webpackChunkName: "chunk1", webpackPrefetch: true */ "./chunk1.js" + ); + + expect(document.head._children).toHaveLength(7); + + // Test normal script loading + script = document.head._children[3]; + expect(script._type).toBe("script"); + expect(script.src).toBe("https://example.com/public/path/chunk1.js"); + expect(script.getAttribute("nonce")).toBe("nonce"); + expect(script.crossOrigin).toBe("anonymous"); + expect(script.onload).toBeTypeOf("function"); + + // Test preload of chunk1-b + link = document.head._children[4]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("modulepreload"); + expect(link.href).toBe("https://example.com/public/path/chunk1-b.js"); + expect(link.charset).toBe("utf-8"); + expect(link.getAttribute("nonce")).toBe("nonce"); + expect(link.crossOrigin).toBe("anonymous"); + + // Test preload of chunk1-a-css + link = document.head._children[5]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("preload"); + expect(link.as).toBe("style"); + expect(link.href).toBe("https://example.com/public/path/chunk1-a-css.css"); + + link = document.head._children[6]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("modulepreload"); + expect(link.href).toBe("https://example.com/public/path/chunk1-a-css.js"); + expect(link.charset).toBe("utf-8"); + expect(link.getAttribute("nonce")).toBe("nonce"); + expect(link.crossOrigin).toBe("anonymous"); + + // Run the script + import(/* webpackIgnore: true */ "./chunk1.js"); + + script.onload(); + + return promise.then(() => { + expect(document.head._children).toHaveLength(8); + + // Test prefetching for chunk1-c and chunk1-a in this order + link = document.head._children[6]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("prefetch"); + expect(link.as).toBe("script"); + expect(link.href).toBe("https://example.com/public/path/chunk1-c.js"); + expect(link.crossOrigin).toBe("anonymous"); + + link = document.head._children[7]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("prefetch"); + expect(link.as).toBe("script"); + expect(link.href).toBe("https://example.com/public/path/chunk1-a.js"); + expect(link.crossOrigin).toBe("anonymous"); + + const promise2 = import( + /* webpackChunkName: "chunk1", webpackPrefetch: true */ "./chunk1.js" + ); + + // Loading chunk1 again should not trigger prefetch/preload + expect(document.head._children).toHaveLength(8); + + const promise3 = import(/* webpackChunkName: "chunk2" */ "./chunk2.js"); + + expect(document.head._children).toHaveLength(9); + + // Test normal script loading + script = document.head._children[8]; + expect(script._type).toBe("script"); + expect(script.src).toBe("https://example.com/public/path/chunk2.js"); + expect(script.getAttribute("nonce")).toBe("nonce"); + expect(script.crossOrigin).toBe("anonymous"); + expect(script.onload).toBeTypeOf("function"); + + // Run the script + import(/* webpackIgnore: true */ "./chunk2.js"); + + script.onload(); + + return promise3.then(() => { + // Loading chunk2 again should not trigger prefetch/preload as it's already prefetch/preloaded + expect(document.head._children).toHaveLength(8); + + const promise4 = import(/* webpackChunkName: "chunk1-css" */ "./chunk1.css"); + + expect(document.head._children).toHaveLength(10); + + link = document.head._children[8]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("stylesheet"); + expect(link.href).toBe("https://example.com/public/path/chunk1-css.css"); + expect(link.crossOrigin).toBe("anonymous"); + + const promise5 = import(/* webpackChunkName: "chunk2-css", webpackPrefetch: true */ "./chunk2.css"); + + expect(document.head._children).toHaveLength(12); + + link = document.head._children[10]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("stylesheet"); + expect(link.href).toBe("https://example.com/public/path/chunk2-css.css"); + expect(link.crossOrigin).toBe("anonymous"); + }); + }); +}); diff --git a/test/configCases/web/prefetch-preload-module-jsonp/webpack.config.js b/test/configCases/web/prefetch-preload-module-jsonp/webpack.config.js new file mode 100644 index 00000000000..9cd0da7b9ab --- /dev/null +++ b/test/configCases/web/prefetch-preload-module-jsonp/webpack.config.js @@ -0,0 +1,24 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: "./index.mjs", + experiments: { + outputModule: true, + css: true + }, + name: "esm", + target: "web", + output: { + publicPath: "", + module: true, + filename: "bundle0.mjs", + chunkFilename: "[name].js", + crossOriginLoading: "anonymous", + chunkFormat: "array-push" + }, + performance: { + hints: false + }, + optimization: { + minimize: false + } +}; diff --git a/test/configCases/web/prefetch-preload-module-only-js/chunk1-a.css b/test/configCases/web/prefetch-preload-module-only-js/chunk1-a.css new file mode 100644 index 00000000000..195b6bcf6d2 --- /dev/null +++ b/test/configCases/web/prefetch-preload-module-only-js/chunk1-a.css @@ -0,0 +1,3 @@ +a { + color: red; +} diff --git a/test/configCases/web/prefetch-preload-module-only-js/chunk1-a.mjs b/test/configCases/web/prefetch-preload-module-only-js/chunk1-a.mjs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/web/prefetch-preload-module-only-js/chunk1-b.mjs b/test/configCases/web/prefetch-preload-module-only-js/chunk1-b.mjs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/web/prefetch-preload-module-only-js/chunk1-c.mjs b/test/configCases/web/prefetch-preload-module-only-js/chunk1-c.mjs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/web/prefetch-preload-module-only-js/chunk1.css b/test/configCases/web/prefetch-preload-module-only-js/chunk1.css new file mode 100644 index 00000000000..195b6bcf6d2 --- /dev/null +++ b/test/configCases/web/prefetch-preload-module-only-js/chunk1.css @@ -0,0 +1,3 @@ +a { + color: red; +} diff --git a/test/configCases/web/prefetch-preload-module-only-js/chunk1.mjs b/test/configCases/web/prefetch-preload-module-only-js/chunk1.mjs new file mode 100644 index 00000000000..f5c31e9044d --- /dev/null +++ b/test/configCases/web/prefetch-preload-module-only-js/chunk1.mjs @@ -0,0 +1,6 @@ +export default function() { + import(/* webpackPrefetch: true, webpackChunkName: "chunk1-a" */ "./chunk1-a.mjs"); + import(/* webpackPreload: true, webpackChunkName: "chunk1-b" */ "./chunk1-b.mjs"); + import(/* webpackChunkName: "chunk1-a-css" */ "./chunk1-a.css"); + import(/* webpackPrefetch: 10, webpackChunkName: "chunk1-c" */ "./chunk1-c.mjs"); +} diff --git a/test/configCases/web/prefetch-preload-module-only-js/chunk2.css b/test/configCases/web/prefetch-preload-module-only-js/chunk2.css new file mode 100644 index 00000000000..3b4cc03b68a --- /dev/null +++ b/test/configCases/web/prefetch-preload-module-only-js/chunk2.css @@ -0,0 +1,3 @@ +a { + color: blue; +} diff --git a/test/configCases/web/prefetch-preload-module-only-js/chunk2.mjs b/test/configCases/web/prefetch-preload-module-only-js/chunk2.mjs new file mode 100644 index 00000000000..1c565540ef9 --- /dev/null +++ b/test/configCases/web/prefetch-preload-module-only-js/chunk2.mjs @@ -0,0 +1,4 @@ +export default function() { + import(/* webpackPrefetch: true, webpackChunkName: "chunk1-a" */ "./chunk1-a.mjs"); + import(/* webpackPreload: true, webpackChunkName: "chunk1-b" */ "./chunk1-b.mjs"); +} diff --git a/test/configCases/web/prefetch-preload-module-only-js/index.mjs b/test/configCases/web/prefetch-preload-module-only-js/index.mjs new file mode 100644 index 00000000000..a1c31cacb47 --- /dev/null +++ b/test/configCases/web/prefetch-preload-module-only-js/index.mjs @@ -0,0 +1,85 @@ +// This config need to be set on initial evaluation to be effective +__webpack_nonce__ = "nonce"; +__webpack_public_path__ = "https://example.com/public/path/"; + +it("should prefetch and preload child chunks on chunk load", () => { + let link; + + expect(document.head._children).toHaveLength(1); + + // Test prefetch from entry chunk + link = document.head._children[0]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("prefetch"); + expect(link.as).toBe("script"); + expect(link.href).toBe("https://example.com/public/path/chunk1.mjs"); + + const promise = import( + /* webpackChunkName: "chunk1", webpackPrefetch: true */ "./chunk1.mjs" + ); + + expect(document.head._children).toHaveLength(2); + + // Test preload of chunk1-b + link = document.head._children[1]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("modulepreload"); + expect(link.href).toBe("https://example.com/public/path/chunk1-b.mjs"); + expect(link.charset).toBe("utf-8"); + expect(link.getAttribute("nonce")).toBe("nonce"); + expect(link.crossOrigin).toBe("anonymous"); + + return promise.then(() => { + expect(document.head._children).toHaveLength(4); + + // Test prefetching for chunk1-c and chunk1-a in this order + link = document.head._children[2]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("prefetch"); + expect(link.as).toBe("script"); + expect(link.href).toBe("https://example.com/public/path/chunk1-c.mjs"); + expect(link.crossOrigin).toBe("anonymous"); + + link = document.head._children[3]; + expect(link._type).toBe("link"); + expect(link.href).toBe("https://example.com/public/path/chunk1-a.mjs"); + expect(link.getAttribute("nonce")).toBe("nonce"); + expect(link.crossOrigin).toBe("anonymous"); + + const promise2 = import( + /* webpackChunkName: "chunk1", webpackPrefetch: true */ "./chunk1.mjs" + ); + + // Loading chunk1 again should not trigger prefetch/preload + expect(document.head._children).toHaveLength(4); + + const promise3 = import(/* webpackChunkName: "chunk2" */ "./chunk2.mjs"); + + expect(document.head._children).toHaveLength(4); + + return promise3.then(() => { + // Loading chunk2 again should not trigger prefetch/preload as it's already prefetch/preloaded + expect(document.head._children).toHaveLength(4); + + const promise4 = import(/* webpackChunkName: "chunk1-css" */ "./chunk1.css"); + + expect(document.head._children).toHaveLength(5); + + link = document.head._children[4]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("stylesheet"); + expect(link.href).toBe("https://example.com/public/path/chunk1-css.css"); + expect(link.crossOrigin).toBe("anonymous"); + + const promise5 = import(/* webpackChunkName: "chunk2-css" */ "./chunk2.css"); + + expect(document.head._children).toHaveLength(6); + + link = document.head._children[5]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("stylesheet"); + expect(link.href).toBe("https://example.com/public/path/chunk2-css.css"); + expect(link.crossOrigin).toBe("anonymous"); + }); + }); +}); diff --git a/test/configCases/web/prefetch-preload-module-only-js/webpack.config.js b/test/configCases/web/prefetch-preload-module-only-js/webpack.config.js new file mode 100644 index 00000000000..9b7f2978e2d --- /dev/null +++ b/test/configCases/web/prefetch-preload-module-only-js/webpack.config.js @@ -0,0 +1,62 @@ +const RuntimeGlobals = require("../../../../lib/RuntimeGlobals"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: "./index.mjs", + experiments: { + outputModule: true, + css: true + }, + name: "esm", + target: "web", + output: { + publicPath: "", + module: true, + filename: "bundle0.mjs", + chunkFilename: "[name].mjs", + chunkFormat: "module", + crossOriginLoading: "anonymous" + }, + plugins: [ + { + apply(compiler) { + compiler.hooks.compilation.tap("Test", compilation => { + compilation.hooks.processAssets.tap( + { + name: "Test", + stage: + compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE + }, + assets => { + if ( + assets["bundle0.mjs"] + .source() + .includes(`${RuntimeGlobals.preloadChunkHandlers}.s`) + ) { + throw new Error( + "Unexpected appearance of the 'modulepreload' preload runtime." + ); + } + + if ( + assets["bundle0.mjs"] + .source() + .includes(`${RuntimeGlobals.prefetchChunkHandlers}.s`) + ) { + throw new Error( + "Unexpected appearance of the 'script' prefetch runtime." + ); + } + } + ); + }); + } + } + ], + performance: { + hints: false + }, + optimization: { + minimize: false + } +}; diff --git a/test/configCases/web/prefetch-preload-module/chunk1-a.css b/test/configCases/web/prefetch-preload-module/chunk1-a.css new file mode 100644 index 00000000000..195b6bcf6d2 --- /dev/null +++ b/test/configCases/web/prefetch-preload-module/chunk1-a.css @@ -0,0 +1,3 @@ +a { + color: red; +} diff --git a/test/configCases/web/prefetch-preload-module/chunk1-a.mjs b/test/configCases/web/prefetch-preload-module/chunk1-a.mjs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/web/prefetch-preload-module/chunk1-b.mjs b/test/configCases/web/prefetch-preload-module/chunk1-b.mjs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/web/prefetch-preload-module/chunk1-c.mjs b/test/configCases/web/prefetch-preload-module/chunk1-c.mjs new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/web/prefetch-preload-module/chunk1.css b/test/configCases/web/prefetch-preload-module/chunk1.css new file mode 100644 index 00000000000..195b6bcf6d2 --- /dev/null +++ b/test/configCases/web/prefetch-preload-module/chunk1.css @@ -0,0 +1,3 @@ +a { + color: red; +} diff --git a/test/configCases/web/prefetch-preload-module/chunk1.mjs b/test/configCases/web/prefetch-preload-module/chunk1.mjs new file mode 100644 index 00000000000..eedf378375d --- /dev/null +++ b/test/configCases/web/prefetch-preload-module/chunk1.mjs @@ -0,0 +1,6 @@ +export default function() { + import(/* webpackPrefetch: true, webpackChunkName: "chunk1-a" */ "./chunk1-a.mjs"); + import(/* webpackPreload: true, webpackChunkName: "chunk1-b" */ "./chunk1-b.mjs"); + import(/* webpackPreload: true, webpackChunkName: "chunk1-a-css" */ "./chunk1-a.css"); + import(/* webpackPrefetch: 10, webpackChunkName: "chunk1-c" */ "./chunk1-c.mjs"); +} diff --git a/test/configCases/web/prefetch-preload-module/chunk2.css b/test/configCases/web/prefetch-preload-module/chunk2.css new file mode 100644 index 00000000000..3b4cc03b68a --- /dev/null +++ b/test/configCases/web/prefetch-preload-module/chunk2.css @@ -0,0 +1,3 @@ +a { + color: blue; +} diff --git a/test/configCases/web/prefetch-preload-module/chunk2.mjs b/test/configCases/web/prefetch-preload-module/chunk2.mjs new file mode 100644 index 00000000000..1c565540ef9 --- /dev/null +++ b/test/configCases/web/prefetch-preload-module/chunk2.mjs @@ -0,0 +1,4 @@ +export default function() { + import(/* webpackPrefetch: true, webpackChunkName: "chunk1-a" */ "./chunk1-a.mjs"); + import(/* webpackPreload: true, webpackChunkName: "chunk1-b" */ "./chunk1-b.mjs"); +} diff --git a/test/configCases/web/prefetch-preload-module/index.mjs b/test/configCases/web/prefetch-preload-module/index.mjs new file mode 100644 index 00000000000..7b92f910731 --- /dev/null +++ b/test/configCases/web/prefetch-preload-module/index.mjs @@ -0,0 +1,117 @@ +// This config need to be set on initial evaluation to be effective +__webpack_nonce__ = "nonce"; +__webpack_public_path__ = "https://example.com/public/path/"; + +it("should prefetch and preload child chunks on chunk load", () => { + let link; + + expect(document.head._children).toHaveLength(3); + + // Test prefetch from entry chunk + link = document.head._children[0]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("prefetch"); + expect(link.as).toBe("script"); + expect(link.href).toBe("https://example.com/public/path/chunk1.mjs"); + expect(link.charset).toBe("utf-8"); + + link = document.head._children[1]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("prefetch"); + expect(link.as).toBe("style"); + expect(link.href).toBe("https://example.com/public/path/chunk2-css.css"); + expect(link.charset).toBe("utf-8"); + + link = document.head._children[2]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("prefetch"); + expect(link.as).toBe("script"); + expect(link.href).toBe("https://example.com/public/path/chunk2-css.mjs"); + + const promise = import( + /* webpackChunkName: "chunk1", webpackPrefetch: true */ "./chunk1.mjs" + ); + + expect(document.head._children).toHaveLength(6); + + // Test normal script loading + link = document.head._children[3]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("preload"); + expect(link.as).toBe("style"); + expect(link.href).toBe("https://example.com/public/path/chunk1-a-css.css"); + expect(link.charset).toBe("utf-8"); + expect(link.getAttribute("nonce")).toBe("nonce"); + expect(link.crossOrigin).toBe("anonymous"); + + link = document.head._children[4]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("modulepreload"); + expect(link.href).toBe("https://example.com/public/path/chunk1-a-css.mjs"); + expect(link.charset).toBe("utf-8"); + expect(link.getAttribute("nonce")).toBe("nonce"); + expect(link.crossOrigin).toBe("anonymous"); + + // Test preload of chunk1-b + link = document.head._children[5]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("modulepreload"); + expect(link.href).toBe("https://example.com/public/path/chunk1-b.mjs"); + expect(link.charset).toBe("utf-8"); + expect(link.getAttribute("nonce")).toBe("nonce"); + expect(link.crossOrigin).toBe("anonymous"); + + return promise.then(() => { + expect(document.head._children).toHaveLength(8); + + // Test prefetching for chunk1-c and chunk1-a in this order + link = document.head._children[6]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("prefetch"); + expect(link.as).toBe("script"); + expect(link.href).toBe("https://example.com/public/path/chunk1-c.mjs"); + expect(link.crossOrigin).toBe("anonymous"); + + link = document.head._children[7]; + expect(link._type).toBe("link"); + expect(link.href).toBe("https://example.com/public/path/chunk1-a.mjs"); + expect(link.getAttribute("nonce")).toBe("nonce"); + expect(link.crossOrigin).toBe("anonymous"); + + const promise2 = import( + /* webpackChunkName: "chunk1", webpackPrefetch: true */ "./chunk1.mjs" + ); + + // Loading chunk1 again should not trigger prefetch/preload + expect(document.head._children).toHaveLength(8); + + const promise3 = import(/* webpackChunkName: "chunk2" */ "./chunk2.mjs"); + + expect(document.head._children).toHaveLength(8); + + return promise3.then(() => { + // Loading chunk2 again should not trigger prefetch/preload as it's already prefetch/preloaded + expect(document.head._children).toHaveLength(8); + + const promise4 = import(/* webpackChunkName: "chunk1-css" */ "./chunk1.css"); + + expect(document.head._children).toHaveLength(9); + + link = document.head._children[8]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("stylesheet"); + expect(link.href).toBe("https://example.com/public/path/chunk1-css.css"); + expect(link.crossOrigin).toBe("anonymous"); + + const promise5 = import(/* webpackChunkName: "chunk2-css", webpackPrefetch: true */ "./chunk2.css"); + + expect(document.head._children).toHaveLength(10); + + link = document.head._children[9]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("stylesheet"); + expect(link.href).toBe("https://example.com/public/path/chunk2-css.css"); + expect(link.crossOrigin).toBe("anonymous"); + }); + }); +}); diff --git a/test/configCases/web/prefetch-preload-module/webpack.config.js b/test/configCases/web/prefetch-preload-module/webpack.config.js new file mode 100644 index 00000000000..e99ad08edb5 --- /dev/null +++ b/test/configCases/web/prefetch-preload-module/webpack.config.js @@ -0,0 +1,24 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: "./index.mjs", + experiments: { + outputModule: true, + css: true + }, + name: "esm", + target: "web", + output: { + publicPath: "", + module: true, + filename: "bundle0.mjs", + chunkFilename: "[name].mjs", + chunkFormat: "module", + crossOriginLoading: "anonymous" + }, + performance: { + hints: false + }, + optimization: { + minimize: false + } +}; diff --git a/test/configCases/web/prefetch-preload/chunk1-a.css b/test/configCases/web/prefetch-preload/chunk1-a.css new file mode 100644 index 00000000000..195b6bcf6d2 --- /dev/null +++ b/test/configCases/web/prefetch-preload/chunk1-a.css @@ -0,0 +1,3 @@ +a { + color: red; +} diff --git a/test/configCases/web/prefetch-preload/chunk1.css b/test/configCases/web/prefetch-preload/chunk1.css new file mode 100644 index 00000000000..195b6bcf6d2 --- /dev/null +++ b/test/configCases/web/prefetch-preload/chunk1.css @@ -0,0 +1,3 @@ +a { + color: red; +} diff --git a/test/configCases/web/prefetch-preload/chunk1.js b/test/configCases/web/prefetch-preload/chunk1.js index 60d6f1685b7..7b433689c1a 100644 --- a/test/configCases/web/prefetch-preload/chunk1.js +++ b/test/configCases/web/prefetch-preload/chunk1.js @@ -1,5 +1,6 @@ export default function() { import(/* webpackPrefetch: true, webpackChunkName: "chunk1-a" */ "./chunk1-a"); import(/* webpackPreload: true, webpackChunkName: "chunk1-b" */ "./chunk1-b"); + import(/* webpackPreload: true, webpackChunkName: "chunk1-a-css" */ "./chunk1-a.css"); import(/* webpackPrefetch: 10, webpackChunkName: "chunk1-c" */ "./chunk1-c"); } diff --git a/test/configCases/web/prefetch-preload/chunk2.css b/test/configCases/web/prefetch-preload/chunk2.css new file mode 100644 index 00000000000..3b4cc03b68a --- /dev/null +++ b/test/configCases/web/prefetch-preload/chunk2.css @@ -0,0 +1,3 @@ +a { + color: blue; +} diff --git a/test/configCases/web/prefetch-preload/index.js b/test/configCases/web/prefetch-preload/index.js index dba5b0575ad..f35faee42f9 100644 --- a/test/configCases/web/prefetch-preload/index.js +++ b/test/configCases/web/prefetch-preload/index.js @@ -1,51 +1,68 @@ - -let oldNonce; -let oldPublicPath; - -beforeEach(done => { - oldNonce = __webpack_nonce__; - oldPublicPath = __webpack_public_path__; - done(); -}); - -afterEach(done => { - __webpack_nonce__ = oldNonce; - __webpack_public_path__ = oldPublicPath; - done(); -}); +// This config need to be set on initial evaluation to be effective +__webpack_nonce__ = "nonce"; +__webpack_public_path__ = "https://example.com/public/path/"; it("should prefetch and preload child chunks on chunk load", () => { - __webpack_nonce__ = "nonce"; - __webpack_public_path__ = "https://example.com/public/path/"; - let link, script; - expect(document.head._children).toHaveLength(1); + expect(document.head._children).toHaveLength(3); // Test prefetch from entry chunk link = document.head._children[0]; expect(link._type).toBe("link"); expect(link.rel).toBe("prefetch"); - expect(link.href).toMatch(/chunk1\.js$/); + expect(link.as).toBe("script"); + expect(link.charset).toBe("utf-8"); + expect(link.href).toBe("https://example.com/public/path/chunk1.js"); + + link = document.head._children[1]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("prefetch"); + expect(link.as).toBe("style"); + expect(link.href).toBe("https://example.com/public/path/chunk2-css.css"); - const promise = import(/* webpackChunkName: "chunk1", webpackPrefetch: true */ "./chunk1"); + link = document.head._children[2]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("prefetch"); + expect(link.as).toBe("script"); + expect(link.href).toBe("https://example.com/public/path/chunk2-css.js"); - expect(document.head._children).toHaveLength(3); + const promise = import( + /* webpackChunkName: "chunk1", webpackPrefetch: true */ "./chunk1" + ); + + expect(document.head._children).toHaveLength(7); // Test normal script loading - script = document.head._children[1]; + script = document.head._children[3]; expect(script._type).toBe("script"); - expect(script.src).toMatch(/chunk1\.js$/); - expect(script.getAttribute("nonce")).toBe("nonce") + expect(script.src).toBe("https://example.com/public/path/chunk1.js"); + expect(script.getAttribute("nonce")).toBe("nonce"); expect(script.crossOrigin).toBe("anonymous"); expect(script.onload).toBeTypeOf("function"); // Test preload of chunk1-b - link = document.head._children[2]; + link = document.head._children[4]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("preload"); + expect(link.as).toBe("script"); + expect(link.href).toBe("https://example.com/public/path/chunk1-b.js"); + expect(link.charset).toBe("utf-8"); + expect(link.getAttribute("nonce")).toBe("nonce"); + expect(link.crossOrigin).toBe("anonymous"); + + // Test preload of chunk1-a-css + link = document.head._children[5]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("preload"); + expect(link.as).toBe("style"); + expect(link.href).toBe("https://example.com/public/path/chunk1-a-css.css"); + + link = document.head._children[6]; expect(link._type).toBe("link"); expect(link.rel).toBe("preload"); expect(link.as).toBe("script"); - expect(link.href).toMatch(/chunk1-b\.js$/); + expect(link.href).toBe("https://example.com/public/path/chunk1-a-css.js"); expect(link.charset).toBe("utf-8"); expect(link.getAttribute("nonce")).toBe("nonce"); expect(link.crossOrigin).toBe("anonymous"); @@ -56,35 +73,40 @@ it("should prefetch and preload child chunks on chunk load", () => { script.onload(); return promise.then(() => { - expect(document.head._children).toHaveLength(5); + expect(document.head._children).toHaveLength(8); // Test prefetching for chunk1-c and chunk1-a in this order - link = document.head._children[3]; + link = document.head._children[6]; expect(link._type).toBe("link"); expect(link.rel).toBe("prefetch"); - expect(link.href).toMatch(/chunk1-c\.js$/); + expect(link.as).toBe("script"); + expect(link.href).toBe("https://example.com/public/path/chunk1-c.js"); + expect(link.charset).toBe("utf-8"); expect(link.crossOrigin).toBe("anonymous"); - link = document.head._children[4]; + link = document.head._children[7]; expect(link._type).toBe("link"); expect(link.rel).toBe("prefetch"); - expect(link.href).toMatch(/chunk1-a\.js$/); + expect(link.as).toBe("script"); + expect(link.href).toBe("https://example.com/public/path/chunk1-a.js"); expect(link.crossOrigin).toBe("anonymous"); - const promise2 = import(/* webpackChunkName: "chunk1", webpackPrefetch: true */ "./chunk1"); + const promise2 = import( + /* webpackChunkName: "chunk1", webpackPrefetch: true */ "./chunk1" + ); // Loading chunk1 again should not trigger prefetch/preload - expect(document.head._children).toHaveLength(5); + expect(document.head._children).toHaveLength(8); const promise3 = import(/* webpackChunkName: "chunk2" */ "./chunk2"); - expect(document.head._children).toHaveLength(6); + expect(document.head._children).toHaveLength(9); // Test normal script loading - script = document.head._children[5]; + script = document.head._children[8]; expect(script._type).toBe("script"); - expect(script.src).toMatch(/chunk2\.js$/); - expect(script.getAttribute("nonce")).toBe("nonce") + expect(script.src).toBe("https://example.com/public/path/chunk2.js"); + expect(script.getAttribute("nonce")).toBe("nonce"); expect(script.crossOrigin).toBe("anonymous"); expect(script.onload).toBeTypeOf("function"); @@ -95,7 +117,27 @@ it("should prefetch and preload child chunks on chunk load", () => { return promise3.then(() => { // Loading chunk2 again should not trigger prefetch/preload as it's already prefetch/preloaded - expect(document.head._children).toHaveLength(6); + expect(document.head._children).toHaveLength(8); + + const promise4 = import(/* webpackChunkName: "chunk1-css" */ "./chunk1.css"); + + expect(document.head._children).toHaveLength(10); + + link = document.head._children[8]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("stylesheet"); + expect(link.href).toBe("https://example.com/public/path/chunk1-css.css"); + expect(link.crossOrigin).toBe("anonymous"); + + const promise5 = import(/* webpackChunkName: "chunk2-css", webpackPrefetch: true */ "./chunk2.css"); + + expect(document.head._children).toHaveLength(12); + + link = document.head._children[10]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("stylesheet"); + expect(link.href).toBe("https://example.com/public/path/chunk2-css.css"); + expect(link.crossOrigin).toBe("anonymous"); }); }); -}) +}); diff --git a/test/configCases/web/prefetch-preload/webpack.config.js b/test/configCases/web/prefetch-preload/webpack.config.js index 34460c414c7..7271fe2ac59 100644 --- a/test/configCases/web/prefetch-preload/webpack.config.js +++ b/test/configCases/web/prefetch-preload/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { target: "web", output: { @@ -7,6 +8,9 @@ module.exports = { performance: { hints: false }, + experiments: { + css: true + }, optimization: { minimize: false } diff --git a/test/configCases/web/prefetch-split-chunks/chunk1.js b/test/configCases/web/prefetch-split-chunks/chunk1.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/web/prefetch-split-chunks/index.js b/test/configCases/web/prefetch-split-chunks/index.js new file mode 100644 index 00000000000..6b9b6dd8e85 --- /dev/null +++ b/test/configCases/web/prefetch-split-chunks/index.js @@ -0,0 +1,15 @@ +import "./public-path"; + +it("should prefetch correctly", () => { + expect(document.head._children).toHaveLength(1); + + // Test prefetch from entry chunk + const link = document.head._children[0]; + expect(link._type).toBe("link"); + expect(link.rel).toBe("prefetch"); + expect(link.href).toBe("https://example.com/public/path/chunk1.js"); + + if (Math.random() < -1) { + import(/* webpackChunkName: "chunk1", webpackPrefetch: true */ "./chunk1"); + } +}); diff --git a/test/configCases/web/prefetch-split-chunks/public-path.js b/test/configCases/web/prefetch-split-chunks/public-path.js new file mode 100644 index 00000000000..beedca3b6e8 --- /dev/null +++ b/test/configCases/web/prefetch-split-chunks/public-path.js @@ -0,0 +1 @@ +__webpack_public_path__ = "https://example.com/public/path/"; diff --git a/test/configCases/web/prefetch-split-chunks/test.config.js b/test/configCases/web/prefetch-split-chunks/test.config.js new file mode 100644 index 00000000000..b9ed0f575c1 --- /dev/null +++ b/test/configCases/web/prefetch-split-chunks/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["main.js", "runtime~main.js", "separate-public-path_js.js"]; + } +}; diff --git a/test/configCases/web/prefetch-split-chunks/webpack.config.js b/test/configCases/web/prefetch-split-chunks/webpack.config.js new file mode 100644 index 00000000000..392e266446f --- /dev/null +++ b/test/configCases/web/prefetch-split-chunks/webpack.config.js @@ -0,0 +1,26 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + output: { + filename: "[name].js", + chunkFilename: "[name].js", + crossOriginLoading: "anonymous" + }, + performance: { + hints: false + }, + optimization: { + minimize: false, + chunkIds: "named", + splitChunks: { + cacheGroups: { + separate: { + enforce: true, + chunks: "all", + test: /public-path/ + } + } + }, + runtimeChunk: true + } +}; diff --git a/test/configCases/web/retry-failed-import/chunk.js b/test/configCases/web/retry-failed-import/chunk.js new file mode 100644 index 00000000000..5c6b89abfc8 --- /dev/null +++ b/test/configCases/web/retry-failed-import/chunk.js @@ -0,0 +1 @@ +export default "ok"; diff --git a/test/configCases/web/retry-failed-import/index.js b/test/configCases/web/retry-failed-import/index.js new file mode 100644 index 00000000000..b672e7b1115 --- /dev/null +++ b/test/configCases/web/retry-failed-import/index.js @@ -0,0 +1,60 @@ +const doImport = () => import(/* webpackChunkName: "the-chunk" */ "./chunk"); + +it("should be able to retry a failed import()", () => { + const promise = doImport(); + + expect(document.head._children).toHaveLength(1); + + const script = document.head._children[0]; + expect(script.onerror).toBeTypeOf("function"); + + script.onerror({ type: "load", target: script }); + + return promise.catch(err => { + expect(err).toBeInstanceOf(Error); + expect(err.name).toBe("ChunkLoadError"); + expect(err.type).toBe("missing"); + expect(err.request).toBe("https://test.cases/path/the-chunk.js"); + expect(err.message).toMatch( + /^Loading chunk .+ failed\.\n\(missing: https:\/\/test\.cases\/path\/the-chunk\.js\)$/ + ); + + const promise = doImport(); + + expect(document.head._children).toHaveLength(1); + + const script = document.head._children[0]; + expect(script.onload).toBeTypeOf("function"); + + script.onload(); + + return promise.catch(err => { + expect(err).toBeInstanceOf(Error); + expect(err.name).toBe("ChunkLoadError"); + expect(err.type).toBe(undefined); + expect(err.request).toBe(undefined); + expect(err.message).toMatch( + /^Loading chunk .+ failed\.\n\(undefined: undefined\)$/ + ); + + const promise = doImport(); + + expect(document.head._children).toHaveLength(1); + + __non_webpack_require__("./the-chunk.js"); + document.head._children[0].onload(); + + return promise.then(module => { + expect(module).toEqual(nsObj({ default: "ok" })); + + const promise = doImport(); + + expect(document.head._children).toHaveLength(0); + + return promise.then(module2 => { + expect(module2).toBe(module); + }); + }); + }); + }); +}); diff --git a/test/configCases/web/retry-failed-import/webpack.config.js b/test/configCases/web/retry-failed-import/webpack.config.js new file mode 100644 index 00000000000..f7950dc539a --- /dev/null +++ b/test/configCases/web/retry-failed-import/webpack.config.js @@ -0,0 +1,13 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + output: { + chunkFilename: "[name].js" + }, + performance: { + hints: false + }, + optimization: { + minimize: false + } +}; diff --git a/test/configCases/web/unique-jsonp/index.js b/test/configCases/web/unique-jsonp/index.js new file mode 100644 index 00000000000..5ff87e45da2 --- /dev/null +++ b/test/configCases/web/unique-jsonp/index.js @@ -0,0 +1,7 @@ +it("should do something", () => { + const fs = require("fs"); + const source = fs.readFileSync(__dirname + "/module.js", "utf-8"); + expect(source).toMatch(/^\(self\[\"webpackChunksomething\"\]/); +}); + +if (Math.random() < 0) import(/* webpackChunkName: "module" */ "./module"); diff --git a/test/configCases/web/unique-jsonp/module.js b/test/configCases/web/unique-jsonp/module.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/configCases/web/unique-jsonp/package.json b/test/configCases/web/unique-jsonp/package.json new file mode 100644 index 00000000000..01c0c6dceb8 --- /dev/null +++ b/test/configCases/web/unique-jsonp/package.json @@ -0,0 +1,3 @@ +{ + "name": "something" +} diff --git a/test/configCases/web/unique-jsonp/test.config.js b/test/configCases/web/unique-jsonp/test.config.js new file mode 100644 index 00000000000..0c4cdb95323 --- /dev/null +++ b/test/configCases/web/unique-jsonp/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["main.js"]; + } +}; diff --git a/test/configCases/web/unique-jsonp/webpack.config.js b/test/configCases/web/unique-jsonp/webpack.config.js new file mode 100644 index 00000000000..681dcca656d --- /dev/null +++ b/test/configCases/web/unique-jsonp/webpack.config.js @@ -0,0 +1,14 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web", + output: { + filename: "[name].js" + }, + externals: { + fs: "commonjs2 fs" + }, + node: { + __filename: false, + __dirname: false + } +}; diff --git a/test/configCases/worker/blob/index.js b/test/configCases/worker/blob/index.js new file mode 100644 index 00000000000..c004e7b6561 --- /dev/null +++ b/test/configCases/worker/blob/index.js @@ -0,0 +1,14 @@ +import { default as Worker } from './worker-wrapper'; + +it("should allow to load chunk in blob", async () => { + const worker = new Worker(new URL('./worker.js', import.meta.url)).getWorker(); + worker.postMessage("ok"); + const result = await new Promise(resolve => { + worker.worker.on("message", data => { + resolve(data); + }); + }); + expect(result).toBe("data: 3, protocol: blob:, thanks"); + await worker.terminate(); +}); + diff --git a/test/configCases/worker/blob/module.js b/test/configCases/worker/blob/module.js new file mode 100644 index 00000000000..c17afd446da --- /dev/null +++ b/test/configCases/worker/blob/module.js @@ -0,0 +1,3 @@ +export function sum(a, b) { + return a + b; +} diff --git a/test/configCases/worker/blob/test.filter.js b/test/configCases/worker/blob/test.filter.js new file mode 100644 index 00000000000..77b40315781 --- /dev/null +++ b/test/configCases/worker/blob/test.filter.js @@ -0,0 +1,6 @@ +const supportsWorker = require("../../../helpers/supportsWorker"); +const supportsBlob = require("../../../helpers/supportsBlob"); + +module.exports = function (config) { + return supportsWorker() && supportsBlob(); +}; diff --git a/test/configCases/worker/blob/webpack.config.js b/test/configCases/worker/blob/webpack.config.js new file mode 100644 index 00000000000..03c779ee0af --- /dev/null +++ b/test/configCases/worker/blob/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + target: "web" +}; diff --git a/test/configCases/worker/blob/worker-wrapper.js b/test/configCases/worker/blob/worker-wrapper.js new file mode 100644 index 00000000000..cb16fed0544 --- /dev/null +++ b/test/configCases/worker/blob/worker-wrapper.js @@ -0,0 +1,17 @@ +export default class MyWorker { + _worker; + + constructor(url) { + const objectURL = URL.createObjectURL( + new Blob([`importScripts(${JSON.stringify(url.toString())});`], { + type: 'application/javascript' + }) + ); + this._worker = new Worker(objectURL, { originalURL: url }); + URL.revokeObjectURL(objectURL); + } + + getWorker() { + return this._worker; + } +} diff --git a/test/configCases/worker/blob/worker.js b/test/configCases/worker/blob/worker.js new file mode 100644 index 00000000000..4657c5748ac --- /dev/null +++ b/test/configCases/worker/blob/worker.js @@ -0,0 +1,6 @@ +onmessage = async event => { + const { sum } = await import("./module"); + const protocol = self.location.protocol; + parentPort.postMessage(`data: ${sum(1, 2)}, protocol: ${protocol}, thanks`); +}; + diff --git a/test/configCases/worker/custom-worker/index.js b/test/configCases/worker/custom-worker/index.js new file mode 100644 index 00000000000..b4b096203c8 --- /dev/null +++ b/test/configCases/worker/custom-worker/index.js @@ -0,0 +1,26 @@ +import Worker from "web-worker"; + +it("should allow to create a WebWorker", async () => { + const worker = new Worker(new URL("./worker.js", import.meta.url), { + type: "module" + }); + worker.postMessage("ok"); + const result = await new Promise(resolve => { + worker.onmessage = event => { + resolve(event.data); + }; + }); + expect(result).toBe("data: OK, thanks"); + await worker.terminate(); +}); + +it("should allow to share chunks", async () => { + const promise = import("./module"); + const script = document.head._children[0]; + const src = script.src; + const file = src.slice(src.lastIndexOf("/")); + __non_webpack_require__(`./${file}`); + script.onload(); + const { upper } = await promise; + expect(upper("ok")).toBe("OK"); +}); diff --git a/test/configCases/worker/custom-worker/module.js b/test/configCases/worker/custom-worker/module.js new file mode 100644 index 00000000000..3a0b527ffb8 --- /dev/null +++ b/test/configCases/worker/custom-worker/module.js @@ -0,0 +1,3 @@ +export function upper(str) { + return str.toUpperCase(); +} diff --git a/test/configCases/worker/custom-worker/node_modules/web-worker.js b/test/configCases/worker/custom-worker/node_modules/web-worker.js new file mode 100644 index 00000000000..b10d2db26a8 --- /dev/null +++ b/test/configCases/worker/custom-worker/node_modules/web-worker.js @@ -0,0 +1 @@ +export default Worker; diff --git a/test/configCases/worker/custom-worker/test.config.js b/test/configCases/worker/custom-worker/test.config.js new file mode 100644 index 00000000000..0c4cdb95323 --- /dev/null +++ b/test/configCases/worker/custom-worker/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["main.js"]; + } +}; diff --git a/test/configCases/worker/custom-worker/test.filter.js b/test/configCases/worker/custom-worker/test.filter.js new file mode 100644 index 00000000000..f74eb03f05a --- /dev/null +++ b/test/configCases/worker/custom-worker/test.filter.js @@ -0,0 +1,5 @@ +const supportsWorker = require("../../../helpers/supportsWorker"); + +module.exports = function (config) { + return supportsWorker(); +}; diff --git a/test/configCases/worker/custom-worker/webpack.config.js b/test/configCases/worker/custom-worker/webpack.config.js new file mode 100644 index 00000000000..339c124a88a --- /dev/null +++ b/test/configCases/worker/custom-worker/webpack.config.js @@ -0,0 +1,17 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + filename: "[name].js" + }, + target: "web", + module: { + rules: [ + { + test: /\.[cm]?js$/, + parser: { + worker: ["default from web-worker", "..."] + } + } + ] + } +}; diff --git a/test/configCases/worker/custom-worker/worker.js b/test/configCases/worker/custom-worker/worker.js new file mode 100644 index 00000000000..fc12b94a652 --- /dev/null +++ b/test/configCases/worker/custom-worker/worker.js @@ -0,0 +1,4 @@ +onmessage = async event => { + const { upper } = await import("./module"); + postMessage(`data: ${upper(event.data)}, thanks`); +}; diff --git a/test/configCases/worker/issue-17489/index.js b/test/configCases/worker/issue-17489/index.js new file mode 100644 index 00000000000..46c056f4148 --- /dev/null +++ b/test/configCases/worker/issue-17489/index.js @@ -0,0 +1,24 @@ +let audioContext = null; + +it("should allow to create a paintWorklet worklet", async () => { + if (audioContext === null) { + audioContext = new AudioContext(); + } + + let pseudoWorklet = await audioContext.audioWorklet.addModule(new URL("./worklet.js", import.meta.url)); + + pseudoWorklet = new pseudoWorklet(); + + expect(pseudoWorklet.url).not.toContain("asset-"); + + pseudoWorklet.postMessage("ok"); + + const result = await new Promise(resolve => { + pseudoWorklet.onmessage = event => { + resolve(event.data); + }; + }); + expect(result).toBe("data: OK, thanks"); + + await pseudoWorklet.terminate(); +}) diff --git a/test/configCases/worker/issue-17489/module.js b/test/configCases/worker/issue-17489/module.js new file mode 100644 index 00000000000..3a0b527ffb8 --- /dev/null +++ b/test/configCases/worker/issue-17489/module.js @@ -0,0 +1,3 @@ +export function upper(str) { + return str.toUpperCase(); +} diff --git a/test/configCases/worker/issue-17489/test.config.js b/test/configCases/worker/issue-17489/test.config.js new file mode 100644 index 00000000000..e5f36d141e8 --- /dev/null +++ b/test/configCases/worker/issue-17489/test.config.js @@ -0,0 +1,22 @@ +let outputDirectory; + +module.exports = { + moduleScope(scope) { + const FakeWorker = require("../../../helpers/createFakeWorker")({ + outputDirectory + }); + + // Pseudo code + scope.AudioContext = class AudioContext { + constructor() { + this.audioWorklet = { + addModule: url => Promise.resolve(FakeWorker.bind(null, url)) + }; + } + }; + }, + findBundle(i, options) { + outputDirectory = options.output.path; + return ["main.js"]; + } +}; diff --git a/test/configCases/worker/issue-17489/test.filter.js b/test/configCases/worker/issue-17489/test.filter.js new file mode 100644 index 00000000000..f74eb03f05a --- /dev/null +++ b/test/configCases/worker/issue-17489/test.filter.js @@ -0,0 +1,5 @@ +const supportsWorker = require("../../../helpers/supportsWorker"); + +module.exports = function (config) { + return supportsWorker(); +}; diff --git a/test/configCases/worker/issue-17489/webpack.config.js b/test/configCases/worker/issue-17489/webpack.config.js new file mode 100644 index 00000000000..8c1ae09ea78 --- /dev/null +++ b/test/configCases/worker/issue-17489/webpack.config.js @@ -0,0 +1,20 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + filename: "[name].js" + }, + optimization: { + innerGraph: true + }, + target: "web", + module: { + rules: [ + { + test: /\.[cm]?js$/, + parser: { + worker: ["*audioContext.audioWorklet.addModule()", "..."] + } + } + ] + } +}; diff --git a/test/configCases/worker/issue-17489/worklet.js b/test/configCases/worker/issue-17489/worklet.js new file mode 100644 index 00000000000..fc12b94a652 --- /dev/null +++ b/test/configCases/worker/issue-17489/worklet.js @@ -0,0 +1,4 @@ +onmessage = async event => { + const { upper } = await import("./module"); + postMessage(`data: ${upper(event.data)}, thanks`); +}; diff --git a/test/configCases/worker/node-worker-hmr/index.js b/test/configCases/worker/node-worker-hmr/index.js new file mode 100644 index 00000000000..334dd2a589a --- /dev/null +++ b/test/configCases/worker/node-worker-hmr/index.js @@ -0,0 +1,20 @@ +import { Worker } from "worker_threads"; + +it("should allow to create a WebWorker", async () => { + const worker = new Worker( + new URL("./worker.js" + __resourceQuery, import.meta.url) + ); + worker.postMessage("ok"); + const result = await new Promise(resolve => { + worker.on("message", data => { + resolve(data); + }); + }); + expect(result).toBe("data: OK, thanks"); + await worker.terminate(); +}); + +it("should allow to share chunks", async () => { + const { upper } = await import("./module"); + expect(upper("ok")).toBe("OK"); +}); diff --git a/test/configCases/worker/node-worker-hmr/module.js b/test/configCases/worker/node-worker-hmr/module.js new file mode 100644 index 00000000000..3a0b527ffb8 --- /dev/null +++ b/test/configCases/worker/node-worker-hmr/module.js @@ -0,0 +1,3 @@ +export function upper(str) { + return str.toUpperCase(); +} diff --git a/test/configCases/worker/node-worker-hmr/test.config.js b/test/configCases/worker/node-worker-hmr/test.config.js new file mode 100644 index 00000000000..28532b86979 --- /dev/null +++ b/test/configCases/worker/node-worker-hmr/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["a.js", "b.js", "c.js", "d.js"]; + } +}; diff --git a/test/configCases/worker/node-worker-hmr/test.filter.js b/test/configCases/worker/node-worker-hmr/test.filter.js new file mode 100644 index 00000000000..f74eb03f05a --- /dev/null +++ b/test/configCases/worker/node-worker-hmr/test.filter.js @@ -0,0 +1,5 @@ +const supportsWorker = require("../../../helpers/supportsWorker"); + +module.exports = function (config) { + return supportsWorker(); +}; diff --git a/test/configCases/worker/node-worker-hmr/webpack.config.js b/test/configCases/worker/node-worker-hmr/webpack.config.js new file mode 100644 index 00000000000..8ebca110d29 --- /dev/null +++ b/test/configCases/worker/node-worker-hmr/webpack.config.js @@ -0,0 +1,15 @@ +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + a: { import: "./index.js?a", filename: "[name].js" }, + b: { import: "./index.js?b", filename: "[name].js" }, + c: { import: "./index.js?c", filename: "[name].js" }, + d: { import: "./index.js?d", filename: "[name].js" } + }, + output: { + filename: "[name].[contenthash].js" + }, + plugins: [new webpack.HotModuleReplacementPlugin()] +}; diff --git a/test/configCases/worker/node-worker-hmr/worker.js b/test/configCases/worker/node-worker-hmr/worker.js new file mode 100644 index 00000000000..39ccf49c94c --- /dev/null +++ b/test/configCases/worker/node-worker-hmr/worker.js @@ -0,0 +1,6 @@ +import { parentPort } from "worker_threads"; + +parentPort.on("message", async data => { + const { upper } = await import("./module"); + parentPort.postMessage(`data: ${upper(data)}, thanks`); +}); diff --git a/test/configCases/worker/node-worker-named/index.js b/test/configCases/worker/node-worker-named/index.js new file mode 100644 index 00000000000..e5ba7d54ef9 --- /dev/null +++ b/test/configCases/worker/node-worker-named/index.js @@ -0,0 +1,34 @@ +import { Worker } from "worker_threads"; + +it("should allow to create a WebWorker", async () => { + const worker = new Worker(new URL("./worker.js", import.meta.url), { + name: "MyWorker" + }); + worker.postMessage("ok"); + const result = await new Promise(resolve => { + worker.on("message", data => { + resolve(data); + }); + }); + expect(result).toBe("data: OK, thanks"); + await worker.terminate(); +}); + +it("should allow to create another WebWorker", async () => { + const worker = new Worker(new URL("./worker.js", import.meta.url), { + name: "MyWorker" + }); + worker.postMessage("ok"); + const result = await new Promise(resolve => { + worker.on("message", data => { + resolve(data); + }); + }); + expect(result).toBe("data: OK, thanks"); + await worker.terminate(); +}); + +it("should allow to share chunks", async () => { + const { upper } = await import("./module"); + expect(upper("ok")).toBe("OK"); +}); diff --git a/test/configCases/worker/node-worker-named/module.js b/test/configCases/worker/node-worker-named/module.js new file mode 100644 index 00000000000..3a0b527ffb8 --- /dev/null +++ b/test/configCases/worker/node-worker-named/module.js @@ -0,0 +1,3 @@ +export function upper(str) { + return str.toUpperCase(); +} diff --git a/test/configCases/worker/node-worker-named/test.config.js b/test/configCases/worker/node-worker-named/test.config.js new file mode 100644 index 00000000000..0c4cdb95323 --- /dev/null +++ b/test/configCases/worker/node-worker-named/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["main.js"]; + } +}; diff --git a/test/configCases/worker/node-worker-named/test.filter.js b/test/configCases/worker/node-worker-named/test.filter.js new file mode 100644 index 00000000000..f74eb03f05a --- /dev/null +++ b/test/configCases/worker/node-worker-named/test.filter.js @@ -0,0 +1,5 @@ +const supportsWorker = require("../../../helpers/supportsWorker"); + +module.exports = function (config) { + return supportsWorker(); +}; diff --git a/test/configCases/worker/node-worker-named/webpack.config.js b/test/configCases/worker/node-worker-named/webpack.config.js new file mode 100644 index 00000000000..0c85320bdd3 --- /dev/null +++ b/test/configCases/worker/node-worker-named/webpack.config.js @@ -0,0 +1,6 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + filename: "[name].js" + } +}; diff --git a/test/configCases/worker/node-worker-named/worker.js b/test/configCases/worker/node-worker-named/worker.js new file mode 100644 index 00000000000..39ccf49c94c --- /dev/null +++ b/test/configCases/worker/node-worker-named/worker.js @@ -0,0 +1,6 @@ +import { parentPort } from "worker_threads"; + +parentPort.on("message", async data => { + const { upper } = await import("./module"); + parentPort.postMessage(`data: ${upper(data)}, thanks`); +}); diff --git a/test/configCases/worker/node-worker/index.js b/test/configCases/worker/node-worker/index.js new file mode 100644 index 00000000000..334dd2a589a --- /dev/null +++ b/test/configCases/worker/node-worker/index.js @@ -0,0 +1,20 @@ +import { Worker } from "worker_threads"; + +it("should allow to create a WebWorker", async () => { + const worker = new Worker( + new URL("./worker.js" + __resourceQuery, import.meta.url) + ); + worker.postMessage("ok"); + const result = await new Promise(resolve => { + worker.on("message", data => { + resolve(data); + }); + }); + expect(result).toBe("data: OK, thanks"); + await worker.terminate(); +}); + +it("should allow to share chunks", async () => { + const { upper } = await import("./module"); + expect(upper("ok")).toBe("OK"); +}); diff --git a/test/configCases/worker/node-worker/module.js b/test/configCases/worker/node-worker/module.js new file mode 100644 index 00000000000..3a0b527ffb8 --- /dev/null +++ b/test/configCases/worker/node-worker/module.js @@ -0,0 +1,3 @@ +export function upper(str) { + return str.toUpperCase(); +} diff --git a/test/configCases/worker/node-worker/test.config.js b/test/configCases/worker/node-worker/test.config.js new file mode 100644 index 00000000000..28532b86979 --- /dev/null +++ b/test/configCases/worker/node-worker/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["a.js", "b.js", "c.js", "d.js"]; + } +}; diff --git a/test/configCases/worker/node-worker/test.filter.js b/test/configCases/worker/node-worker/test.filter.js new file mode 100644 index 00000000000..f74eb03f05a --- /dev/null +++ b/test/configCases/worker/node-worker/test.filter.js @@ -0,0 +1,5 @@ +const supportsWorker = require("../../../helpers/supportsWorker"); + +module.exports = function (config) { + return supportsWorker(); +}; diff --git a/test/configCases/worker/node-worker/webpack.config.js b/test/configCases/worker/node-worker/webpack.config.js new file mode 100644 index 00000000000..abfa199650d --- /dev/null +++ b/test/configCases/worker/node-worker/webpack.config.js @@ -0,0 +1,12 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + a: { import: "./index.js?a", filename: "[name].js" }, + b: { import: "./index.js?b", filename: "[name].js" }, + c: { import: "./index.js?c", filename: "[name].js" }, + d: { import: "./index.js?d", filename: "[name].js" } + }, + output: { + filename: "[name].[contenthash].js" + } +}; diff --git a/test/configCases/worker/node-worker/worker.js b/test/configCases/worker/node-worker/worker.js new file mode 100644 index 00000000000..39ccf49c94c --- /dev/null +++ b/test/configCases/worker/node-worker/worker.js @@ -0,0 +1,6 @@ +import { parentPort } from "worker_threads"; + +parentPort.on("message", async data => { + const { upper } = await import("./module"); + parentPort.postMessage(`data: ${upper(data)}, thanks`); +}); diff --git a/test/configCases/worker/self-import/index.js b/test/configCases/worker/self-import/index.js new file mode 100644 index 00000000000..d2dec5ce40b --- /dev/null +++ b/test/configCases/worker/self-import/index.js @@ -0,0 +1,32 @@ +const isMain = typeof window !== "undefined"; + +if (isMain) { + it("should allow to import itself", async () => { + const worker = new Worker(import.meta.url); + worker.postMessage("ok"); + const result = await new Promise(resolve => { + worker.onmessage = event => { + resolve(event.data); + }; + }); + expect(result).toBe("data: OK, thanks"); + await worker.terminate(); + }); + + it("should allow to import itself", async () => { + const worker = new Worker(new URL(import.meta.url)); + worker.postMessage("ok"); + const result = await new Promise(resolve => { + worker.onmessage = event => { + resolve(event.data); + }; + }); + expect(result).toBe("data: OK, thanks"); + await worker.terminate(); + }); +} + +self.onmessage = async event => { + const { upper } = await import("./module"); + postMessage(`data: ${upper(event.data)}, thanks`); +}; diff --git a/test/configCases/worker/self-import/module.js b/test/configCases/worker/self-import/module.js new file mode 100644 index 00000000000..3a0b527ffb8 --- /dev/null +++ b/test/configCases/worker/self-import/module.js @@ -0,0 +1,3 @@ +export function upper(str) { + return str.toUpperCase(); +} diff --git a/test/configCases/worker/self-import/test.config.js b/test/configCases/worker/self-import/test.config.js new file mode 100644 index 00000000000..86bc794f174 --- /dev/null +++ b/test/configCases/worker/self-import/test.config.js @@ -0,0 +1,14 @@ +module.exports = { + findBundle(i, options) { + switch (i) { + case 0: + return [`bundle${i}.js`]; + case 1: + return [`runtime.bundle${i}.js`, `main.bundle${i}.js`]; + case 2: + return [`bundle${i}.mjs`]; + case 3: + return [`runtime.bundle${i}.mjs`, `main.bundle${i}.mjs`]; + } + } +}; diff --git a/test/configCases/worker/self-import/test.filter.js b/test/configCases/worker/self-import/test.filter.js new file mode 100644 index 00000000000..f74eb03f05a --- /dev/null +++ b/test/configCases/worker/self-import/test.filter.js @@ -0,0 +1,5 @@ +const supportsWorker = require("../../../helpers/supportsWorker"); + +module.exports = function (config) { + return supportsWorker(); +}; diff --git a/test/configCases/worker/self-import/warnings.js b/test/configCases/worker/self-import/warnings.js new file mode 100644 index 00000000000..67303cafa97 --- /dev/null +++ b/test/configCases/worker/self-import/warnings.js @@ -0,0 +1,6 @@ +module.exports = [ + /This prevents using hashes of each other and should be avoided/, + /This prevents using hashes of each other and should be avoided/, + /This prevents using hashes of each other and should be avoided/, + /This prevents using hashes of each other and should be avoided/ +]; diff --git a/test/configCases/worker/self-import/webpack.config.js b/test/configCases/worker/self-import/webpack.config.js new file mode 100644 index 00000000000..5788102325a --- /dev/null +++ b/test/configCases/worker/self-import/webpack.config.js @@ -0,0 +1,33 @@ +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + target: "web" + }, + { + output: { + filename: "[name].bundle1.js" + }, + target: "web", + optimization: { + runtimeChunk: "single" + } + }, + { + target: "web", + experiments: { + outputModule: true + } + }, + { + target: "web", + output: { + filename: "[name].bundle3.mjs" + }, + optimization: { + runtimeChunk: "single" + }, + experiments: { + outputModule: true + } + } +]; diff --git a/test/configCases/worker/universal/index.js b/test/configCases/worker/universal/index.js new file mode 100644 index 00000000000..d88ba1b50b6 --- /dev/null +++ b/test/configCases/worker/universal/index.js @@ -0,0 +1,18 @@ +it("should allow to create a WebWorker", async () => { + const worker = new Worker(new URL("./worker.js", import.meta.url), { + type: "module" + }); + worker.postMessage("ok"); + const result = await new Promise(resolve => { + worker.onmessage = event => { + resolve(event.data); + }; + }); + expect(result).toBe("data: OK, thanks"); + await worker.terminate(); +}); + +it("should allow to share chunks", async () => { + const { upper } = await import("./module"); + expect(upper("ok")).toBe("OK"); +}); diff --git a/test/configCases/worker/universal/module.js b/test/configCases/worker/universal/module.js new file mode 100644 index 00000000000..3a0b527ffb8 --- /dev/null +++ b/test/configCases/worker/universal/module.js @@ -0,0 +1,3 @@ +export function upper(str) { + return str.toUpperCase(); +} diff --git a/test/configCases/worker/universal/test.config.js b/test/configCases/worker/universal/test.config.js new file mode 100644 index 00000000000..4b0564c5df1 --- /dev/null +++ b/test/configCases/worker/universal/test.config.js @@ -0,0 +1,10 @@ +module.exports = { + moduleScope(scope, options) { + if (options.name.includes("node")) { + delete scope.Worker; + } + }, + findBundle(i, options) { + return ["web-main.mjs"]; + } +}; diff --git a/test/configCases/worker/universal/test.filter.js b/test/configCases/worker/universal/test.filter.js new file mode 100644 index 00000000000..f74eb03f05a --- /dev/null +++ b/test/configCases/worker/universal/test.filter.js @@ -0,0 +1,5 @@ +const supportsWorker = require("../../../helpers/supportsWorker"); + +module.exports = function (config) { + return supportsWorker(); +}; diff --git a/test/configCases/worker/universal/webpack.config.js b/test/configCases/worker/universal/webpack.config.js new file mode 100644 index 00000000000..583e26debb0 --- /dev/null +++ b/test/configCases/worker/universal/webpack.config.js @@ -0,0 +1,13 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = [ + { + name: "web", + target: ["web", "node"], + output: { + filename: "web-[name].mjs" + }, + experiments: { + outputModule: true + } + } +]; diff --git a/test/configCases/worker/universal/worker.js b/test/configCases/worker/universal/worker.js new file mode 100644 index 00000000000..4f730feb860 --- /dev/null +++ b/test/configCases/worker/universal/worker.js @@ -0,0 +1,4 @@ +self.onmessage = async event => { + const { upper } = await import("./module"); + postMessage(`data: ${upper(event.data)}, thanks`); +}; diff --git a/test/configCases/worker/web-worker/index.js b/test/configCases/worker/web-worker/index.js new file mode 100644 index 00000000000..048a5153813 --- /dev/null +++ b/test/configCases/worker/web-worker/index.js @@ -0,0 +1,66 @@ +it("should allow to create a WebWorker", async () => { + const worker = new Worker(new URL("./worker.js", import.meta.url), { + type: "module" + }); + worker.postMessage("ok"); + const result = await new Promise(resolve => { + worker.onmessage = event => { + resolve(event.data); + }; + }); + expect(result).toBe("data: OK, thanks"); + await worker.terminate(); +}); + +it("should allow to create a WebWorker (multiple options)", async () => { + const worker = new Worker(new URL("./worker.js", import.meta.url), { + type: "module", + name: "worker1" + }); + worker.postMessage("ok"); + const result = await new Promise(resolve => { + worker.onmessage = event => { + resolve(event.data); + }; + }); + expect(result).toBe("data: OK, thanks"); + await worker.terminate(); +}); + +it("should allow to create a WebWorker (spread type)", async () => { + const worker = new Worker(new URL("./worker.js", import.meta.url), { + ...{ type: "module" } + }); + worker.postMessage("ok"); + const result = await new Promise(resolve => { + worker.onmessage = event => { + resolve(event.data); + }; + }); + expect(result).toBe("data: OK, thanks"); + await worker.terminate(); +}); + +it("should allow to create a WebWorker (expression)", async () => { + const options = { type: "module" }; + const worker = new Worker(new URL("./worker.js", import.meta.url), options); + worker.postMessage("ok"); + const result = await new Promise(resolve => { + worker.onmessage = event => { + resolve(event.data); + }; + }); + expect(result).toBe("data: OK, thanks"); + await worker.terminate(); +}); + +it("should allow to share chunks", async () => { + const promise = import("./module"); + const script = document.head._children[0]; + const src = script.src; + const file = src.slice(src.lastIndexOf("/")); + __non_webpack_require__(`./${file}`); + script.onload(); + const { upper } = await promise; + expect(upper("ok")).toBe("OK"); +}); diff --git a/test/configCases/worker/web-worker/module.js b/test/configCases/worker/web-worker/module.js new file mode 100644 index 00000000000..3a0b527ffb8 --- /dev/null +++ b/test/configCases/worker/web-worker/module.js @@ -0,0 +1,3 @@ +export function upper(str) { + return str.toUpperCase(); +} diff --git a/test/configCases/worker/web-worker/test.config.js b/test/configCases/worker/web-worker/test.config.js new file mode 100644 index 00000000000..0c4cdb95323 --- /dev/null +++ b/test/configCases/worker/web-worker/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["main.js"]; + } +}; diff --git a/test/configCases/worker/web-worker/test.filter.js b/test/configCases/worker/web-worker/test.filter.js new file mode 100644 index 00000000000..f74eb03f05a --- /dev/null +++ b/test/configCases/worker/web-worker/test.filter.js @@ -0,0 +1,5 @@ +const supportsWorker = require("../../../helpers/supportsWorker"); + +module.exports = function (config) { + return supportsWorker(); +}; diff --git a/test/configCases/worker/web-worker/webpack.config.js b/test/configCases/worker/web-worker/webpack.config.js new file mode 100644 index 00000000000..64e7c138734 --- /dev/null +++ b/test/configCases/worker/web-worker/webpack.config.js @@ -0,0 +1,7 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + filename: "[name].js" + }, + target: "web" +}; diff --git a/test/configCases/worker/web-worker/worker.js b/test/configCases/worker/web-worker/worker.js new file mode 100644 index 00000000000..fc12b94a652 --- /dev/null +++ b/test/configCases/worker/web-worker/worker.js @@ -0,0 +1,4 @@ +onmessage = async event => { + const { upper } = await import("./module"); + postMessage(`data: ${upper(event.data)}, thanks`); +}; diff --git a/test/configCases/worker/worker-contenthash/index.js b/test/configCases/worker/worker-contenthash/index.js new file mode 100644 index 00000000000..3523798c7f9 --- /dev/null +++ b/test/configCases/worker/worker-contenthash/index.js @@ -0,0 +1,18 @@ +import { Worker } from "worker_threads"; + +it("should allow to create a WebWorker", async () => { + const worker = new Worker(new URL("./worker.js", import.meta.url)); + worker.postMessage("ok"); + const result = await new Promise(resolve => { + worker.on("message", data => { + resolve(data); + }); + }); + expect(result).toBe("data: OK, thanks"); + await worker.terminate(); +}); + +it("should allow to share chunks", async () => { + const { upper } = await import("./module"); + expect(upper("ok")).toBe("OK"); +}); diff --git a/test/configCases/worker/worker-contenthash/module.js b/test/configCases/worker/worker-contenthash/module.js new file mode 100644 index 00000000000..3a0b527ffb8 --- /dev/null +++ b/test/configCases/worker/worker-contenthash/module.js @@ -0,0 +1,3 @@ +export function upper(str) { + return str.toUpperCase(); +} diff --git a/test/configCases/worker/worker-contenthash/test.config.js b/test/configCases/worker/worker-contenthash/test.config.js new file mode 100644 index 00000000000..0c4cdb95323 --- /dev/null +++ b/test/configCases/worker/worker-contenthash/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle(i, options) { + return ["main.js"]; + } +}; diff --git a/test/configCases/worker/worker-contenthash/test.filter.js b/test/configCases/worker/worker-contenthash/test.filter.js new file mode 100644 index 00000000000..f74eb03f05a --- /dev/null +++ b/test/configCases/worker/worker-contenthash/test.filter.js @@ -0,0 +1,5 @@ +const supportsWorker = require("../../../helpers/supportsWorker"); + +module.exports = function (config) { + return supportsWorker(); +}; diff --git a/test/configCases/worker/worker-contenthash/webpack.config.js b/test/configCases/worker/worker-contenthash/webpack.config.js new file mode 100644 index 00000000000..9b0fd61b3fd --- /dev/null +++ b/test/configCases/worker/worker-contenthash/webpack.config.js @@ -0,0 +1,12 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + main: { + import: "./index.js", + filename: "[name].js" + } + }, + output: { + filename: "[name]-[contenthash].js" + } +}; diff --git a/test/configCases/worker/worker-contenthash/worker.js b/test/configCases/worker/worker-contenthash/worker.js new file mode 100644 index 00000000000..39ccf49c94c --- /dev/null +++ b/test/configCases/worker/worker-contenthash/worker.js @@ -0,0 +1,6 @@ +import { parentPort } from "worker_threads"; + +parentPort.on("message", async data => { + const { upper } = await import("./module"); + parentPort.postMessage(`data: ${upper(data)}, thanks`); +}); diff --git a/test/configCases/worker/worklet/index.js b/test/configCases/worker/worklet/index.js new file mode 100644 index 00000000000..629fdff08e7 --- /dev/null +++ b/test/configCases/worker/worklet/index.js @@ -0,0 +1,202 @@ +// This is a pseudo-worklet, it is not a real worklet, but it is used to test the worker logic. +// Real worklets do not have this API. + +it("should allow to create a paintWorklet worklet", async () => { + let pseudoWorklet = await CSS.paintWorklet.addModule(new URL("./worklet.js", import.meta.url)); + + pseudoWorklet = new pseudoWorklet(); + + expect(pseudoWorklet.url).not.toContain("asset-"); + + pseudoWorklet.postMessage("ok"); + + const result = await new Promise(resolve => { + pseudoWorklet.onmessage = event => { + resolve(event.data); + }; + }); + expect(result).toBe("data: OK, thanks"); + + await pseudoWorklet.terminate(); +}); + +it("should allow to create a layoutWorklet worklet", async () => { + let pseudoWorklet = await CSS.layoutWorklet.addModule(new URL("./worklet.js", import.meta.url)); + + pseudoWorklet = new pseudoWorklet(); + + expect(pseudoWorklet.url).not.toContain("asset-"); + + pseudoWorklet.postMessage("ok"); + + const result = await new Promise(resolve => { + pseudoWorklet.onmessage = event => { + resolve(event.data); + }; + }); + expect(result).toBe("data: OK, thanks"); + + await pseudoWorklet.terminate(); +}); + +it("should allow to create a animationWorklet worklet", async () => { + let pseudoWorklet = await CSS.animationWorklet.addModule(new URL("./worklet.js", import.meta.url)); + + pseudoWorklet = new pseudoWorklet(); + + expect(pseudoWorklet.url).not.toContain("asset-"); + + pseudoWorklet.postMessage("ok"); + + const result = await new Promise(resolve => { + pseudoWorklet.onmessage = event => { + resolve(event.data); + }; + }); + expect(result).toBe("data: OK, thanks"); + + await pseudoWorklet.terminate(); +}); + +it("should allow to create a audioWorklet worklet", async () => { + let context = new AudioContext(); + let pseudoWorklet = await context.audioWorklet.addModule(new URL("./worklet.js", import.meta.url)); + + pseudoWorklet = new pseudoWorklet(); + + expect(pseudoWorklet.url).not.toContain("asset-"); + + pseudoWorklet.postMessage("ok"); + + const result = await new Promise(resolve => { + pseudoWorklet.onmessage = event => { + resolve(event.data); + }; + }); + expect(result).toBe("data: OK, thanks"); + + await pseudoWorklet.terminate(); +}); + +it("should allow to create a paintWorklet worklet using '?.'", async () => { + let pseudoWorklet = await CSS?.paintWorklet?.addModule(new URL("./worklet.js", import.meta.url)); + + pseudoWorklet = new pseudoWorklet(); + + expect(pseudoWorklet.url).not.toContain("asset-"); + + pseudoWorklet.postMessage("ok"); + + const result = await new Promise(resolve => { + pseudoWorklet.onmessage = event => { + resolve(event.data); + }; + }); + expect(result).toBe("data: OK, thanks"); + + await pseudoWorklet.terminate(); +}); + +it("should allow to create a audioWorklet worklet #2", async () => { + let audioWorklet = (new AudioContext()).audioWorklet; + let pseudoWorklet = await audioWorklet.addModule(new URL("./worklet.js", import.meta.url)); + + pseudoWorklet = new pseudoWorklet(); + + expect(pseudoWorklet.url).not.toContain("asset-"); + + pseudoWorklet.postMessage("ok"); + + const result = await new Promise(resolve => { + pseudoWorklet.onmessage = event => { + resolve(event.data); + }; + }); + expect(result).toBe("data: OK, thanks"); + + await pseudoWorklet.terminate(); +}); + +it("should allow to create a audioWorklet worklet #3", async () => { + let context = { + foo: { + bar: new AudioContext() + } + }; + let pseudoWorklet = await context.foo.bar.audioWorklet.addModule(new URL("./worklet.js", import.meta.url)); + + pseudoWorklet = new pseudoWorklet(); + + expect(pseudoWorklet.url).not.toContain("asset-"); + + pseudoWorklet.postMessage("ok"); + + const result = await new Promise(resolve => { + pseudoWorklet.onmessage = event => { + resolve(event.data); + }; + }); + expect(result).toBe("data: OK, thanks"); + + await pseudoWorklet.terminate(); +}); + +it("should allow to create a audioWorklet worklet using '?.'", async () => { + let context = new AudioContext(); + let pseudoWorklet = await context?.audioWorklet?.addModule(new URL("./worklet.js", import.meta.url)); + + pseudoWorklet = new pseudoWorklet(); + + expect(pseudoWorklet.url).not.toContain("asset-"); + + pseudoWorklet.postMessage("ok"); + + const result = await new Promise(resolve => { + pseudoWorklet.onmessage = event => { + resolve(event.data); + }; + }); + expect(result).toBe("data: OK, thanks"); + + await pseudoWorklet.terminate(); +}); + +it("should not create a audioWorklet worklet", async () => { + let workletURL; + + const barContext = new class Foo { + constructor() { + this.audioWorklet = { + addModule(url) { + workletURL = url.toString(); + + return undefined; + } + } + } + } + + await barContext.audioWorklet.addModule(new URL("./worklet-asset-1.js", import.meta.url)); + + expect(workletURL).toContain("asset-"); +}); + +it("should not create a audioWorklet worklet", async () => { + let workletURL; + + const barContext = new class Foo { + constructor() { + this.unknownWorklet = { + addModule(url) { + workletURL = url.toString(); + + return undefined; + } + } + } + } + + await barContext.unknownWorklet.addModule(new URL("./worklet-asset-2.js", import.meta.url)); + + expect(workletURL).toContain("asset-"); +}); diff --git a/test/configCases/worker/worklet/module.js b/test/configCases/worker/worklet/module.js new file mode 100644 index 00000000000..3a0b527ffb8 --- /dev/null +++ b/test/configCases/worker/worklet/module.js @@ -0,0 +1,3 @@ +export function upper(str) { + return str.toUpperCase(); +} diff --git a/test/configCases/worker/worklet/test.config.js b/test/configCases/worker/worklet/test.config.js new file mode 100644 index 00000000000..081778fc932 --- /dev/null +++ b/test/configCases/worker/worklet/test.config.js @@ -0,0 +1,33 @@ +let outputDirectory; + +module.exports = { + moduleScope(scope) { + const FakeWorker = require("../../../helpers/createFakeWorker")({ + outputDirectory + }); + + // Pseudo code + scope.AudioContext = class AudioContext { + constructor() { + this.audioWorklet = { + addModule: url => Promise.resolve(FakeWorker.bind(null, url)) + }; + } + }; + scope.CSS = { + paintWorklet: { + addModule: url => Promise.resolve(FakeWorker.bind(null, url)) + }, + layoutWorklet: { + addModule: url => Promise.resolve(FakeWorker.bind(null, url)) + }, + animationWorklet: { + addModule: url => Promise.resolve(FakeWorker.bind(null, url)) + } + }; + }, + findBundle(i, options) { + outputDirectory = options.output.path; + return ["main.js"]; + } +}; diff --git a/test/configCases/worker/worklet/test.filter.js b/test/configCases/worker/worklet/test.filter.js new file mode 100644 index 00000000000..903374717a3 --- /dev/null +++ b/test/configCases/worker/worklet/test.filter.js @@ -0,0 +1,6 @@ +const supportsWorker = require("../../../helpers/supportsWorker"); +const supportsOptionalChaining = require("../../../helpers/supportsOptionalChaining"); + +module.exports = function (config) { + return supportsWorker() && supportsOptionalChaining(); +}; diff --git a/test/configCases/worker/worklet/webpack.config.js b/test/configCases/worker/worklet/webpack.config.js new file mode 100644 index 00000000000..e0dc1ca5069 --- /dev/null +++ b/test/configCases/worker/worklet/webpack.config.js @@ -0,0 +1,27 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + assetModuleFilename: "asset-[name][ext]", + filename: "[name].js" + }, + target: "web", + module: { + rules: [ + { + test: /\.[cm]?js$/, + parser: { + worker: [ + "CSS.paintWorklet.addModule()", + "CSS.layoutWorklet.addModule()", + "CSS.animationWorklet.addModule()", + "*context.audioWorklet.addModule()", + "*context.foo.bar.audioWorklet.addModule()", + "*audioWorklet.addModule()", + // *addModule() is not valid syntax + "..." + ] + } + } + ] + } +}; diff --git a/test/configCases/worker/worklet/worklet-asset-1.js b/test/configCases/worker/worklet/worklet-asset-1.js new file mode 100644 index 00000000000..9b445eabad0 --- /dev/null +++ b/test/configCases/worker/worklet/worklet-asset-1.js @@ -0,0 +1 @@ +function test1() {} diff --git a/test/configCases/worker/worklet/worklet-asset-2.js b/test/configCases/worker/worklet/worklet-asset-2.js new file mode 100644 index 00000000000..39493e93bc2 --- /dev/null +++ b/test/configCases/worker/worklet/worklet-asset-2.js @@ -0,0 +1 @@ +function test2() {} diff --git a/test/configCases/worker/worklet/worklet.js b/test/configCases/worker/worklet/worklet.js new file mode 100644 index 00000000000..fc12b94a652 --- /dev/null +++ b/test/configCases/worker/worklet/worklet.js @@ -0,0 +1,4 @@ +onmessage = async event => { + const { upper } = await import("./module"); + postMessage(`data: ${upper(event.data)}, thanks`); +}; diff --git a/test/deterministicGrouping.unittest.js b/test/deterministicGrouping.unittest.js new file mode 100644 index 00000000000..ffe68c73559 --- /dev/null +++ b/test/deterministicGrouping.unittest.js @@ -0,0 +1,185 @@ +const deterministicGrouping = require("../lib/util/deterministicGrouping"); + +describe("deterministicGrouping", () => { + const group = (items, minSize, maxSize) => + deterministicGrouping({ + items: items.map((item, i) => [i, item]), + minSize, + maxSize, + getKey: ([key]) => `${100000 + key}`, + getSize: ([, size]) => size + }).map(group => ({ items: group.items.map(([i]) => i), size: group.size })); + it("should split large chunks with different size types", () => { + expect( + group( + [{ a: 3, b: 3 }, { b: 1 }, { a: 3 }], + { + a: 3, + b: 3 + }, + { + a: 5, + b: 5 + } + ) + ).toMatchInlineSnapshot(` + Array [ + Object { + "items": Array [ + 0, + 1, + ], + "size": Object { + "a": 3, + "b": 4, + }, + }, + Object { + "items": Array [ + 2, + ], + "size": Object { + "a": 3, + }, + }, + ] + `); + }); + it("should separate items with different size types when unsplittable", () => { + expect( + group( + [ + { a: 1 }, + { b: 1 }, + { a: 1 }, + { a: 1 }, + { b: 1 }, + { a: 1 }, + { a: 1 }, + { b: 1 }, + { a: 1 }, + { a: 1 } + ], + { + a: 3, + b: 3 + }, + { + a: 5, + b: 5 + } + ) + ).toMatchInlineSnapshot(` + Array [ + Object { + "items": Array [ + 0, + 2, + 3, + ], + "size": Object { + "a": 3, + }, + }, + Object { + "items": Array [ + 1, + 4, + 7, + ], + "size": Object { + "b": 3, + }, + }, + Object { + "items": Array [ + 5, + 6, + 8, + 9, + ], + "size": Object { + "a": 4, + }, + }, + ] + `); + }); + it("should handle entangled size types (case 1)", () => { + expect( + group( + [ + { c: 2, b: 2 }, + { a: 2, c: 2 }, + { a: 2, b: 2 } + ], + { + a: 3, + b: 3, + c: 3 + }, + { + a: 3, + b: 3, + c: 3 + } + ) + ).toMatchInlineSnapshot(` + Array [ + Object { + "items": Array [ + 0, + 1, + 2, + ], + "size": Object { + "a": 4, + "b": 4, + "c": 4, + }, + }, + ] + `); + }); + it("should handle entangled size types (case 2)", () => { + expect( + group( + [ + { c: 2, b: 2 }, + { a: 2, c: 2 }, + { a: 2, b: 2 } + ], + { + a: 3, + b: 3 + }, + { + c: 3 + } + ) + ).toMatchInlineSnapshot(` + Array [ + Object { + "items": Array [ + 0, + 2, + ], + "size": Object { + "a": 2, + "b": 4, + "c": 2, + }, + }, + Object { + "items": Array [ + 1, + ], + "size": Object { + "a": 2, + "c": 2, + }, + }, + ] + `); + }); +}); diff --git a/test/extractUrlAndGlobal.unittest.js b/test/extractUrlAndGlobal.unittest.js new file mode 100644 index 00000000000..c57b6289dc2 --- /dev/null +++ b/test/extractUrlAndGlobal.unittest.js @@ -0,0 +1,35 @@ +"use strict"; + +const extractUrlAndGlobal = require("../lib/util/extractUrlAndGlobal"); + +describe("extractUrlAndGlobal", () => { + it("should return jQuery", () => { + const result = extractUrlAndGlobal( + "jQuery@https://code.jquery.com/jquery-3.5.1.min.js" + ); + expect(result).toEqual([ + "https://code.jquery.com/jquery-3.5.1.min.js", + "jQuery" + ]); + }); + it("should return _", () => { + const result = extractUrlAndGlobal( + "_@https://cdn.jsdelivr.net/npm/lodash@4.17.19/lodash.min.js" + ); + expect(result).toEqual([ + "https://cdn.jsdelivr.net/npm/lodash@4.17.19/lodash.min.js", + "_" + ]); + }); + it("should throw error if starts with @", () => { + expect(() => extractUrlAndGlobal("@something")).toThrow(); + }); + + it("should throw error if ends with @", () => { + expect(() => extractUrlAndGlobal("something@")).toThrow(); + }); + + it("should throw error if do not have @", () => { + expect(() => extractUrlAndGlobal("something")).toThrow(); + }); +}); diff --git a/test/fixtures/asmjs.js b/test/fixtures/asmjs.js new file mode 100644 index 00000000000..59d2101f7ed --- /dev/null +++ b/test/fixtures/asmjs.js @@ -0,0 +1,22 @@ +module.exports = function a() { + function b() { + "use asm"; + if (0 == 0) { + return 1 == 1 ? 101 : 102; + } else { + return 0 == 1 ? 103 : 104; + } + } + function c() { + if (0 == 0) { + return 1 == 1 ? 105 : 106; + } else { + return 0 == 1 ? 107 : 108; + } + } + var d = (function() { + "use asm"; + return 1 == 1 ? 109 : 110; + })(); + return b() + c() + d; +}; diff --git a/test/fixtures/b.js b/test/fixtures/b.js index 0900b0b4558..7e6505aa822 100644 --- a/test/fixtures/b.js +++ b/test/fixtures/b.js @@ -1,3 +1,6 @@ module.exports = function b() { return "This is b"; -}; \ No newline at end of file +}; + +// Test CJS top-level return +return; diff --git a/test/fixtures/browserslist/package.json b/test/fixtures/browserslist/package.json new file mode 100644 index 00000000000..6c8665a9624 --- /dev/null +++ b/test/fixtures/browserslist/package.json @@ -0,0 +1,6 @@ +{ + "name": "browserslist-test", + "browserslist": [ + "ie >= 9" + ] +} diff --git a/test/fixtures/buildDependencies/definedValue.js b/test/fixtures/buildDependencies/definedValue.js new file mode 100644 index 00000000000..c639052e2fb --- /dev/null +++ b/test/fixtures/buildDependencies/definedValue.js @@ -0,0 +1 @@ +module.exports = DEFINED_VALUE; diff --git a/test/fixtures/buildDependencies/esm-cjs-dep.js b/test/fixtures/buildDependencies/esm-cjs-dep.js new file mode 100644 index 00000000000..52d586a0e0e --- /dev/null +++ b/test/fixtures/buildDependencies/esm-cjs-dep.js @@ -0,0 +1 @@ +module.exports = require("../../js/buildDepsInput/esm-dependency"); diff --git a/test/fixtures/buildDependencies/esm-dep.mjs b/test/fixtures/buildDependencies/esm-dep.mjs new file mode 100644 index 00000000000..03e99c08cf8 --- /dev/null +++ b/test/fixtures/buildDependencies/esm-dep.mjs @@ -0,0 +1 @@ +export { default } from "./esm-cjs-dep.js"; diff --git a/test/fixtures/buildDependencies/esm.mjs b/test/fixtures/buildDependencies/esm.mjs new file mode 100644 index 00000000000..6b8775cc057 --- /dev/null +++ b/test/fixtures/buildDependencies/esm.mjs @@ -0,0 +1,9 @@ +export { default } from "./esm-dep.mjs"; +// prettier-ignore +import './esm-dep.mjs'; + +export const asyncDep = ( + await import("../../js/buildDepsInput/esm-async-dependency.mjs") +).default; +// prettier-ignore +await import('../../js/buildDepsInput/esm-async-dependency.mjs') diff --git a/test/fixtures/buildDependencies/index.js b/test/fixtures/buildDependencies/index.js new file mode 100644 index 00000000000..f9c10c5fef8 --- /dev/null +++ b/test/fixtures/buildDependencies/index.js @@ -0,0 +1,11 @@ +/* global VALUE */ + +require("dep#with#hash/#.js"); +module.exports = { + loader: require("./loader!"), + config: VALUE, + esmConfig: VALUE2, + esmAsyncConfig: VALUE3, + uncached: require("./module"), + definedValue: require("./definedValue") +}; diff --git a/test/fixtures/buildDependencies/loader.js b/test/fixtures/buildDependencies/loader.js new file mode 100644 index 00000000000..950cff932da --- /dev/null +++ b/test/fixtures/buildDependencies/loader.js @@ -0,0 +1,6 @@ +// eslint-disable-next-line n/no-missing-require +const value = require("../../js/buildDepsInput/loader-dependency"); + +module.exports = () => { + return `module.exports = ${value};`; +}; diff --git a/test/fixtures/buildDependencies/module.js b/test/fixtures/buildDependencies/module.js new file mode 100644 index 00000000000..4cebe33cd98 --- /dev/null +++ b/test/fixtures/buildDependencies/module.js @@ -0,0 +1 @@ +module.exports = VALUE_UNCACHEABLE; diff --git a/test/fixtures/buildDependencies/node_modules/dep#with#hash/#.js b/test/fixtures/buildDependencies/node_modules/dep#with#hash/#.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/fixtures/buildDependencies/node_modules/dep#with#hash/package.json b/test/fixtures/buildDependencies/node_modules/dep#with#hash/package.json new file mode 100644 index 00000000000..1d3f4c6bb8a --- /dev/null +++ b/test/fixtures/buildDependencies/node_modules/dep#with#hash/package.json @@ -0,0 +1,3 @@ +{ + "name": "dep#with#hash" +} diff --git a/test/fixtures/buildDependencies/node_modules/dep-with-exports/main-entry.js b/test/fixtures/buildDependencies/node_modules/dep-with-exports/main-entry.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/fixtures/buildDependencies/node_modules/dep-with-exports/package.json b/test/fixtures/buildDependencies/node_modules/dep-with-exports/package.json new file mode 100644 index 00000000000..1047aa8eff8 --- /dev/null +++ b/test/fixtures/buildDependencies/node_modules/dep-with-exports/package.json @@ -0,0 +1,9 @@ +{ + "name": "dep-with-exports", + "exports": { + ".": "./main-entry.js", + "./sub": { + "require": "./sub-entry.js" + } + } +} diff --git a/test/fixtures/buildDependencies/node_modules/dep-with-exports/sub-entry.js b/test/fixtures/buildDependencies/node_modules/dep-with-exports/sub-entry.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/fixtures/buildDependencies/node_modules/dep-without-package.json/main-entry.js b/test/fixtures/buildDependencies/node_modules/dep-without-package.json/main-entry.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/fixtures/buildDependencies/node_modules/dep-without-package.json/sub-entry.js b/test/fixtures/buildDependencies/node_modules/dep-without-package.json/sub-entry.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/fixtures/buildDependencies/node_modules/dependency-with-exports/main.js b/test/fixtures/buildDependencies/node_modules/dependency-with-exports/main.js new file mode 100644 index 00000000000..af238348fdb --- /dev/null +++ b/test/fixtures/buildDependencies/node_modules/dependency-with-exports/main.js @@ -0,0 +1,4 @@ +require("dep-with-exports"); +require("dep-with-exports/sub"); +require("dep-without-package.json/main-entry"); +require("dep-without-package.json/sub-entry"); diff --git a/test/fixtures/buildDependencies/node_modules/dependency-with-exports/package.json b/test/fixtures/buildDependencies/node_modules/dependency-with-exports/package.json new file mode 100644 index 00000000000..6410db72437 --- /dev/null +++ b/test/fixtures/buildDependencies/node_modules/dependency-with-exports/package.json @@ -0,0 +1,4 @@ +{ + "name": "dependency-with-exports", + "exports": "./main.js" +} diff --git a/test/fixtures/buildDependencies/node_modules/dependency-with-optional/package.json b/test/fixtures/buildDependencies/node_modules/dependency-with-optional/package.json new file mode 100644 index 00000000000..a4c0286897e --- /dev/null +++ b/test/fixtures/buildDependencies/node_modules/dependency-with-optional/package.json @@ -0,0 +1,9 @@ +{ + "name": "dependency-with-optional", + "dependencies": { + "dep": "*" + }, + "optionalDependencies": { + "dep": "*" + } +} diff --git a/test/fixtures/buildDependencies/node_modules/require-dependency-with-exports/index.js b/test/fixtures/buildDependencies/node_modules/require-dependency-with-exports/index.js new file mode 100644 index 00000000000..055d4f99e85 --- /dev/null +++ b/test/fixtures/buildDependencies/node_modules/require-dependency-with-exports/index.js @@ -0,0 +1 @@ +require("dependency-with-exports"); diff --git a/test/fixtures/buildDependencies/node_modules/require-dependency-with-exports/package.json b/test/fixtures/buildDependencies/node_modules/require-dependency-with-exports/package.json new file mode 100644 index 00000000000..f9399034c5e --- /dev/null +++ b/test/fixtures/buildDependencies/node_modules/require-dependency-with-exports/package.json @@ -0,0 +1,3 @@ +{ + "name": "require-dependency-with-exports" +} diff --git a/test/fixtures/buildDependencies/run.js b/test/fixtures/buildDependencies/run.js new file mode 100644 index 00000000000..5d3ad5ad66b --- /dev/null +++ b/test/fixtures/buildDependencies/run.js @@ -0,0 +1,106 @@ +const path = require("path"); +const webpack = require("../../.."); +// eslint-disable-next-line n/no-missing-require +const value = require("../../js/buildDepsInput/config-dependency"); + +require("dep#with#hash/#.js"); + +process.exitCode = 1; + +const options = JSON.parse(process.argv[3]); + +const esm = +process.versions.modules >= 83; + +if (esm) { + require("require-dependency-with-exports"); + import("./esm.mjs").then(module => { + run(module); + }); +} else { + run({ default: 1, asyncDep: 1 }); +} + +function run({ default: value2, asyncDep: value3 }) { + const compiler = webpack( + { + mode: "development", + context: path.resolve(__dirname, "../../js/buildDepsInput"), + entry: path.resolve(__dirname, "./index"), + output: { + path: path.resolve(__dirname, "../../js/buildDeps/" + process.argv[2]), + libraryTarget: "commonjs2" + }, + plugins: [ + new webpack.DefinePlugin({ + VALUE: webpack.DefinePlugin.runtimeValue( + () => JSON.stringify(value), + { version: "no" } + ), + VALUE2: webpack.DefinePlugin.runtimeValue( + () => JSON.stringify(value2), + { version: "no" } + ), + VALUE3: webpack.DefinePlugin.runtimeValue( + () => JSON.stringify(value3), + { version: "no" } + ), + VALUE_UNCACHEABLE: webpack.DefinePlugin.runtimeValue( + () => JSON.stringify(value), + true + ), + DEFINED_VALUE: JSON.stringify(options.definedValue || "value") + }) + ], + infrastructureLogging: { + level: "verbose", + debug: /PackFile/ + }, + snapshot: { + // TODO remove webpack 6 + managedPaths: [/^(.+?[\\/]node_modules[\\/])/] + }, + cache: { + type: "filesystem", + cacheDirectory: path.resolve(__dirname, "../../js/buildDepsCache"), + buildDependencies: { + defaultWebpack: [], + config: [ + __filename, + path.resolve(__dirname, "../../../node_modules/.yarn-integrity") + ].concat(esm ? ["../../fixtures/buildDependencies/esm.mjs"] : []), + invalid: options.invalidBuildDependencies + ? ["should-fail-resolving"] + : [], + optionalDepsTest: [ + path.resolve(__dirname, "node_modules/dependency-with-optional") + + "/" + ] + } + } + }, + (err, stats) => { + if (err) { + return console.log(err); + } + if (stats.hasErrors()) { + return console.log(stats.toString({ all: false, errors: true })); + } + if (options.buildTwice) { + compiler.run((err, stats) => { + if (err) { + return console.log(err); + } + if (stats.hasErrors()) { + return console.log(stats.toString({ all: false, errors: true })); + } + process.exitCode = 0; + console.log("OK"); + }); + } else { + console.log(stats.toString()); + process.exitCode = 0; + console.log("OK"); + } + } + ); +} diff --git a/test/fixtures/chunk-b.js b/test/fixtures/chunk-b.js new file mode 100644 index 00000000000..92ac13a5e30 --- /dev/null +++ b/test/fixtures/chunk-b.js @@ -0,0 +1,3 @@ +module.exports = () => { + return import(/* webpackChunkName: "chunkB" */ "./b"); +}; diff --git a/test/fixtures/count-loader.js b/test/fixtures/count-loader.js index ced2018eef9..9da5ce227be 100644 --- a/test/fixtures/count-loader.js +++ b/test/fixtures/count-loader.js @@ -1,5 +1,6 @@ let counter = 0; -module.exports = function() { +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () { return `module.exports = ${counter++};`; }; diff --git a/test/fixtures/delay-loader.js b/test/fixtures/delay-loader.js index 3c6573548fe..01e71f3fb6d 100644 --- a/test/fixtures/delay-loader.js +++ b/test/fixtures/delay-loader.js @@ -1,6 +1,7 @@ -module.exports = function(source) { +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { var cb = this.async(); - setTimeout(function() { + setTimeout(function () { cb(null, source); }, 500); -}; \ No newline at end of file +}; diff --git a/test/fixtures/empty-svg-loader.js b/test/fixtures/empty-svg-loader.js new file mode 100644 index 00000000000..0a599e7d5d6 --- /dev/null +++ b/test/fixtures/empty-svg-loader.js @@ -0,0 +1 @@ +module.exports = () => ""; diff --git a/test/fixtures/errors/abc.html b/test/fixtures/errors/abc.html new file mode 100644 index 00000000000..32a090d9528 --- /dev/null +++ b/test/fixtures/errors/abc.html @@ -0,0 +1,6 @@ + + + +

    I love webpack :)

    + + diff --git a/test/fixtures/errors/add-comment-loader.js b/test/fixtures/errors/add-comment-loader.js new file mode 100644 index 00000000000..586bfbce576 --- /dev/null +++ b/test/fixtures/errors/add-comment-loader.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { + return source + "// some comment"; +}; diff --git a/test/fixtures/errors/async-error-loader.js b/test/fixtures/errors/async-error-loader.js index a0eba8a9d54..9826e36c3b7 100644 --- a/test/fixtures/errors/async-error-loader.js +++ b/test/fixtures/errors/async-error-loader.js @@ -1,4 +1,5 @@ -module.exports = function(source) { +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { const callback = this.async(); const error = new Error("this is a callback error"); callback(error, source); diff --git a/test/fixtures/errors/emit-error-loader.js b/test/fixtures/errors/emit-error-loader.js index 57164e2206c..1cd648e665d 100644 --- a/test/fixtures/errors/emit-error-loader.js +++ b/test/fixtures/errors/emit-error-loader.js @@ -1,4 +1,5 @@ -module.exports = function(source) { +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { this.emitWarning(new Error("this is a warning")); this.emitError(new Error("this is an error")); return source; diff --git a/test/fixtures/errors/false-iife-umd.js b/test/fixtures/errors/false-iife-umd.js new file mode 100644 index 00000000000..7814b2b1c19 --- /dev/null +++ b/test/fixtures/errors/false-iife-umd.js @@ -0,0 +1 @@ +export const answer = 42; \ No newline at end of file diff --git a/test/fixtures/errors/has-syntax-error.js b/test/fixtures/errors/has-syntax-error.js new file mode 100644 index 00000000000..d425f6b8365 --- /dev/null +++ b/test/fixtures/errors/has-syntax-error.js @@ -0,0 +1,3 @@ +window.foo = { + bar: true,; +}; diff --git a/test/fixtures/errors/identity-loader.js b/test/fixtures/errors/identity-loader.js new file mode 100644 index 00000000000..c6d8a635121 --- /dev/null +++ b/test/fixtures/errors/identity-loader.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { + return source; +}; diff --git a/test/fixtures/errors/irregular-error-loader.js b/test/fixtures/errors/irregular-error-loader.js index 8b38ff7eff0..6ed0ba935ef 100644 --- a/test/fixtures/errors/irregular-error-loader.js +++ b/test/fixtures/errors/irregular-error-loader.js @@ -1,4 +1,5 @@ -module.exports = function(source) { +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { const empty = null; const emptyError = new Error(); this.emitWarning(empty); diff --git a/test/fixtures/errors/module-exports-object-loader.js b/test/fixtures/errors/module-exports-object-loader.js new file mode 100644 index 00000000000..f053ebf7976 --- /dev/null +++ b/test/fixtures/errors/module-exports-object-loader.js @@ -0,0 +1 @@ +module.exports = {}; diff --git a/test/fixtures/errors/module-exports-string-loader.js b/test/fixtures/errors/module-exports-string-loader.js new file mode 100644 index 00000000000..38b08af1d77 --- /dev/null +++ b/test/fixtures/errors/module-exports-string-loader.js @@ -0,0 +1 @@ +module.exports = ""; diff --git a/test/fixtures/errors/module-level-throw-error-loader.js b/test/fixtures/errors/module-level-throw-error-loader.js new file mode 100644 index 00000000000..e0c4ef30082 --- /dev/null +++ b/test/fixtures/errors/module-level-throw-error-loader.js @@ -0,0 +1 @@ +throw new Error("this is a thrown error from module level"); diff --git a/test/fixtures/errors/no-return-loader.js b/test/fixtures/errors/no-return-loader.js index 0a4b3bfaa71..63c5d351ef1 100644 --- a/test/fixtures/errors/no-return-loader.js +++ b/test/fixtures/errors/no-return-loader.js @@ -1,2 +1,2 @@ -module.exports = function(){ -} +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function () {}; diff --git a/test/fixtures/errors/return-undefined-loader.js b/test/fixtures/errors/return-undefined-loader.js new file mode 100644 index 00000000000..cc40a4649c9 --- /dev/null +++ b/test/fixtures/errors/return-undefined-loader.js @@ -0,0 +1 @@ +module.exports = () => {}; diff --git a/test/fixtures/errors/throw-error-loader.js b/test/fixtures/errors/throw-error-loader.js index 3142eedc09d..59014e2a1b3 100644 --- a/test/fixtures/errors/throw-error-loader.js +++ b/test/fixtures/errors/throw-error-loader.js @@ -1,3 +1,4 @@ -module.exports = function(source) { +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { throw new Error("this is a thrown error"); }; diff --git a/test/fixtures/errors/throw-error-plugin.js b/test/fixtures/errors/throw-error-plugin.js new file mode 100644 index 00000000000..220dfe835c5 --- /dev/null +++ b/test/fixtures/errors/throw-error-plugin.js @@ -0,0 +1,7 @@ +module.exports = { + apply(compiler) { + compiler.hooks.compilation.tap("Errors.test-unhandled-throws", compilation => { + throw new Error('foo'); + }); + } +}; diff --git a/test/fixtures/file.svg b/test/fixtures/file.svg new file mode 100644 index 00000000000..d7b7e40b4f8 --- /dev/null +++ b/test/fixtures/file.svg @@ -0,0 +1 @@ +icon-square-small diff --git a/test/fixtures/font.ttf b/test/fixtures/font.ttf new file mode 100644 index 00000000000..37af10e09df Binary files /dev/null and b/test/fixtures/font.ttf differ diff --git a/test/fixtures/ignoreWarnings/index.js b/test/fixtures/ignoreWarnings/index.js new file mode 100644 index 00000000000..36a87736e09 --- /dev/null +++ b/test/fixtures/ignoreWarnings/index.js @@ -0,0 +1,3 @@ +module.exports = function ignoreWarnings() { + return "This is ignoreWarnings"; +}; \ No newline at end of file diff --git a/test/fixtures/ignoreWarnings/loader.js b/test/fixtures/ignoreWarnings/loader.js new file mode 100644 index 00000000000..7bb13495966 --- /dev/null +++ b/test/fixtures/ignoreWarnings/loader.js @@ -0,0 +1,4 @@ +module.exports = function wraningLoader(content) { + this.emitWarning('__mocked__warning__'); + return content; +}; \ No newline at end of file diff --git a/test/fixtures/missing-file.js b/test/fixtures/missing-file.js new file mode 100644 index 00000000000..83cca93441b --- /dev/null +++ b/test/fixtures/missing-file.js @@ -0,0 +1,5 @@ +module.exports = function b() { + /* eslint-disable node/no-missing-require */ + require("./nonexistentfile"); + return "This is a missing file"; +}; diff --git a/test/fixtures/temp-watch-1569996664301/bundle.js b/test/fixtures/temp-watch-1569996664301/bundle.js new file mode 100644 index 00000000000..69d176dd3b8 --- /dev/null +++ b/test/fixtures/temp-watch-1569996664301/bundle.js @@ -0,0 +1,24 @@ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "./test/fixtures/temp-watch-1569996664301/file.js": +/*!****************************************************************!*\ + !*** (webpack)/test/fixtures/temp-watch-1569996664301/file.js ***! + \****************************************************************/ +/*! exports [maybe provided (runtime-defined)] [no usage info] */ +/*! runtime requirements: */ +/***/ (() => { + +eval("'bar'\n\n//# sourceURL=webpack:///(webpack)/test/fixtures/temp-watch-1569996664301/file.js?"); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ +/************************************************************************/ +/******/ // startup +/******/ // Load entry module +/******/ __webpack_modules__["./test/fixtures/temp-watch-1569996664301/file.js"](); +/******/ })() +; \ No newline at end of file diff --git a/test/fixtures/uses-asset.js b/test/fixtures/uses-asset.js new file mode 100644 index 00000000000..b3532c8b7fc --- /dev/null +++ b/test/fixtures/uses-asset.js @@ -0,0 +1 @@ +import SVG from './file.svg'; diff --git a/test/fixtures/watch/node_modules/inline-loader/index.js b/test/fixtures/watch/node_modules/inline-loader/index.js new file mode 100644 index 00000000000..d444337558e --- /dev/null +++ b/test/fixtures/watch/node_modules/inline-loader/index.js @@ -0,0 +1,3 @@ +module.exports = function(x) { + return x; +} diff --git a/test/fixtures/watch/node_modules/inline-loader/package.json b/test/fixtures/watch/node_modules/inline-loader/package.json new file mode 100644 index 00000000000..4f747245710 --- /dev/null +++ b/test/fixtures/watch/node_modules/inline-loader/package.json @@ -0,0 +1,4 @@ +{ + "name": "inline-loader", + "version": "1.0.0" +} diff --git a/test/fixtures/watch/node_modules/nested-package1/index.js b/test/fixtures/watch/node_modules/nested-package1/index.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/fixtures/watch/node_modules/nested-package1/package.json b/test/fixtures/watch/node_modules/nested-package1/package.json new file mode 100644 index 00000000000..77e1c5ddfea --- /dev/null +++ b/test/fixtures/watch/node_modules/nested-package1/package.json @@ -0,0 +1,4 @@ +{ + "name": "nested-package1", + "version": "1.0.0" +} diff --git a/test/fixtures/watch/node_modules/package/index.js b/test/fixtures/watch/node_modules/package/index.js new file mode 100644 index 00000000000..e1e724de532 --- /dev/null +++ b/test/fixtures/watch/node_modules/package/index.js @@ -0,0 +1,4 @@ +import "nested-package1"; +import "nested-package2"; +import "inline-loader!nested-package1"; +import "inline-loader!nested-package2"; diff --git a/test/fixtures/watch/node_modules/package/node_modules/nested-package2/index.js b/test/fixtures/watch/node_modules/package/node_modules/nested-package2/index.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/fixtures/watch/node_modules/package/node_modules/nested-package2/package.json b/test/fixtures/watch/node_modules/package/node_modules/nested-package2/package.json new file mode 100644 index 00000000000..99b7bef613e --- /dev/null +++ b/test/fixtures/watch/node_modules/package/node_modules/nested-package2/package.json @@ -0,0 +1,4 @@ +{ + "name": "nested-package2", + "version": "1.0.0" +} diff --git a/test/fixtures/watch/node_modules/package/package.json b/test/fixtures/watch/node_modules/package/package.json new file mode 100644 index 00000000000..75b93e3b25a --- /dev/null +++ b/test/fixtures/watch/node_modules/package/package.json @@ -0,0 +1,4 @@ +{ + "name": "package", + "version": "1.0.0" +} diff --git a/test/fixtures/watch/node_modules/some-loader/index.js b/test/fixtures/watch/node_modules/some-loader/index.js new file mode 100644 index 00000000000..d444337558e --- /dev/null +++ b/test/fixtures/watch/node_modules/some-loader/index.js @@ -0,0 +1,3 @@ +module.exports = function(x) { + return x; +} diff --git a/test/fixtures/watch/node_modules/some-loader/package.json b/test/fixtures/watch/node_modules/some-loader/package.json new file mode 100644 index 00000000000..f05476029b9 --- /dev/null +++ b/test/fixtures/watch/node_modules/some-loader/package.json @@ -0,0 +1,4 @@ +{ + "name": "some-loader", + "version": "1.0.0" +} diff --git a/test/fixtures/watch/src/index.js b/test/fixtures/watch/src/index.js new file mode 100644 index 00000000000..b79b14a3a0e --- /dev/null +++ b/test/fixtures/watch/src/index.js @@ -0,0 +1,5 @@ +import "package"; +import "inline-loader!package"; + +import "./local"; +import "inline-loader!./local"; diff --git a/test/fixtures/watch/src/local.js b/test/fixtures/watch/src/local.js new file mode 100644 index 00000000000..67d46e2b228 --- /dev/null +++ b/test/fixtures/watch/src/local.js @@ -0,0 +1,2 @@ +import "package"; +import "inline-loader!package"; diff --git a/test/formatLocation.unittest.js b/test/formatLocation.unittest.js index 1d4f64b615c..c1be188d71d 100644 --- a/test/formatLocation.unittest.js +++ b/test/formatLocation.unittest.js @@ -14,16 +14,6 @@ describe("formatLocation", () => { loc: null, result: "" }, - { - name: "string", - loc: "str", - result: "str" - }, - { - name: "number", - loc: 12, - result: "12" - }, { name: "line-column", loc: { @@ -62,22 +52,6 @@ describe("formatLocation", () => { }, result: "5:6" }, - { - name: "start-end string", - loc: { - start: "start", - end: "end" - }, - result: "start-end" - }, - { - name: "start-end number", - loc: { - start: 9, - end: 7 - }, - result: "9-7" - }, { name: "line", loc: { @@ -85,10 +59,10 @@ describe("formatLocation", () => { line: 10 }, end: { - index: 20 + line: 20 } }, - result: "10:?-+20" + result: "10-20" }, { name: "line", @@ -99,9 +73,9 @@ describe("formatLocation", () => { result: "" } ]; - testCases.forEach(testCase => { + for (const testCase of testCases) { it(`should format location correctly for ${testCase.name}`, () => { expect(formatLocation(testCase.loc)).toEqual(testCase.result); }); - }); + } }); diff --git a/test/helpers/CurrentScript.js b/test/helpers/CurrentScript.js new file mode 100644 index 00000000000..8feb610b6bd --- /dev/null +++ b/test/helpers/CurrentScript.js @@ -0,0 +1,9 @@ +class CurrentScript { + constructor(path = "", type = "text/javascript") { + this.src = `https://test.cases/path/${path}index.js`; + this.type = type; + this.tagName = "script"; + } +} + +module.exports = CurrentScript; diff --git a/test/helpers/EventSourceForNode.js b/test/helpers/EventSourceForNode.js new file mode 100644 index 00000000000..ae9437871f6 --- /dev/null +++ b/test/helpers/EventSourceForNode.js @@ -0,0 +1,43 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +module.exports = class EventSource { + constructor(url) { + this.response = undefined; + const request = ( + url.startsWith("https:") ? require("https") : require("http") + ).request( + url, + { + agent: false, + headers: { accept: "text/event-stream" } + }, + res => { + this.response = res; + res.on("error", err => { + if (this.onerror) this.onerror(err); + }); + } + ); + request.on("error", err => { + if (this.onerror) this.onerror({ message: err }); + }); + request.end(); + } + + close() { + this.response.destroy(); + } + + set onopen(value) { + throw new Error("not implemented"); + } + + set onmessage(value) { + throw new Error("not implemented"); + } +}; diff --git a/test/helpers/FakeDocument.js b/test/helpers/FakeDocument.js index 680c5157640..700be0d13b5 100644 --- a/test/helpers/FakeDocument.js +++ b/test/helpers/FakeDocument.js @@ -1,38 +1,115 @@ -module.exports = class FakeDocument { - constructor() { +const fs = require("fs"); +const path = require("path"); + +/** + * @this {FakeDocument} + * @param {string} property property + * @returns {EXPECTED_ANY} value + */ +function getPropertyValue(property) { + return this[property]; +} + +class FakeDocument { + constructor(basePath) { this.head = this.createElement("head"); + this.body = this.createElement("body"); + this.baseURI = "https://test.cases/path/index.html"; + this._elementsByTagName = new Map([ + ["head", [this.head]], + ["body", [this.body]] + ]); + this._basePath = basePath; } createElement(type) { - return new FakeElement(type); + return new FakeElement(this, type, this._basePath); + } + + _onElementAttached(element) { + const type = element._type; + let list = this._elementsByTagName.get(type); + if (list === undefined) { + list = []; + this._elementsByTagName.set(type, list); + } + list.push(element); + } + + _onElementRemoved(element) { + const type = element._type; + const list = this._elementsByTagName.get(type); + const idx = list.indexOf(element); + list.splice(idx, 1); } getElementsByTagName(name) { - if (name === "head") return [this.head]; - throw new Error( - `FakeDocument.getElementsByTagName(${name}): not implemented` - ); + return this._elementsByTagName.get(name) || []; } -}; + + getComputedStyle(element) { + const style = { getPropertyValue }; + const links = this.getElementsByTagName("link"); + for (const link of links) { + for (const rule of link.sheet.cssRules) { + if (rule.selectorText === element._type) { + Object.assign(style, rule.style); + } + } + } + return style; + } +} class FakeElement { - constructor(type) { + constructor(document, type, basePath) { + this._document = document; this._type = type; this._children = []; this._attributes = Object.create(null); this._src = undefined; this._href = undefined; + this.parentNode = undefined; + this.sheet = type === "link" ? new FakeSheet(this, basePath) : undefined; } appendChild(node) { + this._document._onElementAttached(node); this._children.push(node); + node.parentNode = this; + if (node._type === "link") { + setTimeout(() => { + if (node.onload) node.onload({ type: "load", target: node }); + }, 100); + } + } + + removeChild(node) { + const idx = this._children.indexOf(node); + if (idx >= 0) { + this._children.splice(idx, 1); + this._document._onElementRemoved(node); + node.parentNode = undefined; + } } setAttribute(name, value) { - this._attributes[name] = value; + if (this._type === "link" && name === "href") { + this.href(value); + } else { + this._attributes[name] = value; + } + } + + removeAttribute(name) { + delete this._attributes[name]; } getAttribute(name) { + if (this._type === "link" && name === "href") { + return this.href; + } + return this._attributes[name]; } @@ -40,16 +117,16 @@ class FakeElement { if (/^\//.test(value)) { return `https://test.cases${value}`; } else if (/^\.\.\//.test(value)) { - return `https://test.cases${value.substr(2)}`; + return `https://test.cases${value.slice(2)}`; } else if (/^\.\//.test(value)) { - return `https://test.cases/path${value.substr(1)}`; + return `https://test.cases/path${value.slice(1)}`; } else if (/^\w+:\/\//.test(value)) { return value; } else if (/^\/\//.test(value)) { return `https:${value}`; - } else { - return `https://test.cases/path/${value}`; } + + return `https://test.cases/path/${value}`; } set src(value) { @@ -72,3 +149,117 @@ class FakeElement { return this._href; } } + +class FakeSheet { + constructor(element, basePath) { + this._element = element; + this._basePath = basePath; + } + + get css() { + let css = fs.readFileSync( + path.resolve( + this._basePath, + this._element.href + .replace(/^https:\/\/test\.cases\/path\//, "") + .replace(/^https:\/\/example\.com\//, "") + ), + "utf-8" + ); + + css = css.replace(/@import url\("([^"]+)"\);/g, (match, url) => { + if (!/^https:\/\/test\.cases\/path\//.test(url)) { + return `@import url("${url}");`; + } + + if (url.startsWith("#")) { + return url; + } + + return fs.readFileSync( + path.resolve( + this._basePath, + url.replace(/^https:\/\/test\.cases\/path\//, "") + ), + "utf-8" + ); + }); + + return css; + } + + get cssRules() { + const walkCssTokens = require("../../lib/css/walkCssTokens"); + const rules = []; + let currentRule = { getPropertyValue }; + let selector; + let last = 0; + const processDeclaration = str => { + const colon = str.indexOf(":"); + if (colon > 0) { + const property = str.slice(0, colon).trim(); + const value = str.slice(colon + 1); + currentRule[property] = value; + } + }; + const filepath = /file:\/\//.test(this._element.href) + ? new URL(this._element.href) + : path.resolve( + this._basePath, + this._element.href + .replace(/^https:\/\/test\.cases\/path\//, "") + .replace(/^https:\/\/example\.com\/public\/path\//, "") + .replace(/^https:\/\/example\.com\//, "") + ); + let css = fs.readFileSync(filepath, "utf-8"); + css = css + // Remove comments + // @ts-expect-error we use es2018 for such tests + .replace(/\/\*.*?\*\//gms, "") + .replace(/@import url\("([^"]+)"\);/g, (match, url) => { + if (!/^https:\/\/test\.cases\/path\//.test(url)) { + return url; + } + + if (url.startsWith("#")) { + return url; + } + + return fs.readFileSync( + path.resolve( + this._basePath, + url.replace(/^https:\/\/test\.cases\/path\//, "") + ), + "utf-8" + ); + }); + walkCssTokens(css, 0, { + leftCurlyBracket(source, start, end) { + if (selector === undefined) { + selector = source.slice(last, start).trim(); + last = end; + } + return end; + }, + rightCurlyBracket(source, start, end) { + processDeclaration(source.slice(last, start)); + last = end; + rules.push({ selectorText: selector, style: currentRule }); + selector = undefined; + currentRule = { getPropertyValue }; + return end; + }, + semicolon(source, start, end) { + processDeclaration(source.slice(last, start)); + last = end; + return end; + } + }); + return rules; + } +} + +FakeDocument.FakeSheet = FakeSheet; +FakeDocument.FakeElement = FakeDocument; + +module.exports = FakeDocument; diff --git a/test/helpers/LogTestPlugin.js b/test/helpers/LogTestPlugin.js new file mode 100644 index 00000000000..1af54c1d6e3 --- /dev/null +++ b/test/helpers/LogTestPlugin.js @@ -0,0 +1,47 @@ +/** @typedef {import("../../").Compiler} Compiler */ +/** @typedef {import("../../").Compilation} Compilation */ + +module.exports = class LogTestPlugin { + /** + * @param {boolean=} noTraced noTraced + */ + constructor(noTraced) { + this.noTraced = noTraced; + } + + /** + * @param {Compiler} compiler compiler + */ + apply(compiler) { + /** + * @param {ReturnType} logger logger + */ + const logSome = logger => { + logger.group("Group"); + if (!this.noTraced) { + logger.error("Error"); + logger.warn("Warning"); + } + logger.info("Info"); + logger.log("Log"); + logger.debug("Debug"); + logger.groupCollapsed("Collapsed group"); + logger.log("Log inside collapsed group"); + logger.group("Inner group"); + logger.log("Inner inner message"); + logger.groupEnd(); + logger.groupEnd(); + logger.log("Log"); + logger.groupEnd(); + logger.log("End"); + }; + logSome(compiler.getInfrastructureLogger("LogTestPlugin")); + compiler.hooks.compilation.tap("LogTestPlugin", compilation => { + const logger = compilation.getLogger("LogTestPlugin"); + logSome(logger); + + const otherLogger = compilation.getLogger("LogOtherTestPlugin"); + otherLogger.debug("debug message only"); + }); + } +}; diff --git a/test/helpers/PluginEnvironment.js b/test/helpers/PluginEnvironment.js index 1b7ad46d728..a109386fc4e 100644 --- a/test/helpers/PluginEnvironment.js +++ b/test/helpers/PluginEnvironment.js @@ -1,6 +1,13 @@ module.exports = function PluginEnvironment() { + /** + * @type {{ name: string, handler: EXPECTED_FUNCTION }[]} + */ const events = []; + /** + * @param {string} name the name + * @param {EXPECTED_FUNCTION} handler the handler + */ function addEvent(name, handler) { events.push({ name, @@ -8,13 +15,17 @@ module.exports = function PluginEnvironment() { }); } + /** + * @param {string} hookName a hook name + * @returns {string} an event name + */ function getEventName(hookName) { // Convert a hook name to an event name. // e.g. `buildModule` -> `build-module` - return hookName.replace(/[A-Z]/g, c => "-" + c.toLowerCase()); + return hookName.replace(/[A-Z]/g, c => `-${c.toLowerCase()}`); } - this.getEnvironmentStub = function() { + this.getEnvironmentStub = function () { const hooks = new Map(); return { plugin: addEvent, @@ -22,31 +33,34 @@ module.exports = function PluginEnvironment() { // In the meanwhile, `hooks` is a `Proxy` which creates fake hooks // on demand. Instead of creating a dummy object with a few `Hook` // method, a custom `Hook` class could be used. - hooks: new Proxy({}, { - get(target, hookName) { - let hook = hooks.get(hookName); - if (hook === undefined) { - const eventName = getEventName(hookName); - hook = { - tap(_, handler) { - addEvent(eventName, handler); - }, - tapAsync(_, handler) { - addEvent(eventName, handler); - }, - tapPromise(_, handler) { - addEvent(eventName, handler); - } - }; - hooks.set(hookName, hook); + hooks: new Proxy( + {}, + { + get(target, hookName) { + let hook = hooks.get(hookName); + if (hook === undefined) { + const eventName = getEventName(hookName); + hook = { + tap(_, handler) { + addEvent(eventName, handler); + }, + tapAsync(_, handler) { + addEvent(eventName, handler); + }, + tapPromise(_, handler) { + addEvent(eventName, handler); + } + }; + hooks.set(hookName, hook); + } + return hook; } - return hook; } - }) + ) }; }; - this.getEventBindings = function() { + this.getEventBindings = function () { return events; }; }; diff --git a/test/helpers/TemplatePluginEnvironment.js b/test/helpers/TemplatePluginEnvironment.js deleted file mode 100644 index b852c0c2151..00000000000 --- a/test/helpers/TemplatePluginEnvironment.js +++ /dev/null @@ -1,26 +0,0 @@ -var PluginEnvironment = require('./PluginEnvironment'); - -module.exports = function TemplatePluginEnvironment() { - var events = []; - var mainTemplatePluginEnvironment = new PluginEnvironment(); - - this.getEnvironmentStub = function() { - return { - mainTemplate: mainTemplatePluginEnvironment.getEnvironmentStub(), - templatesPlugin: function(name, handler) { - events.push({ - name, - handler - }); - } - }; - }; - - this.getEventBindings = function() { - return events; - }; - - this.getMainTemplateBindings = function() { - return mainTemplatePluginEnvironment.getEventBindings(); - }; -}; diff --git a/test/helpers/applyPluginWithOptions.js b/test/helpers/applyPluginWithOptions.js index 47a82cb1567..423935afbc4 100644 --- a/test/helpers/applyPluginWithOptions.js +++ b/test/helpers/applyPluginWithOptions.js @@ -1,11 +1,12 @@ -var PluginEnvironment = require('./PluginEnvironment'); +const PluginEnvironment = require("./PluginEnvironment"); module.exports = function applyPluginWithOptions(Plugin) { - var plugin = new (Function.prototype.bind.apply(Plugin, arguments)); - var pluginEnvironment = new PluginEnvironment(); + // eslint-disable-next-line prefer-rest-params + const plugin = new (Function.prototype.bind.apply(Plugin, arguments))(); + const pluginEnvironment = new PluginEnvironment(); plugin.apply(pluginEnvironment.getEnvironmentStub()); - var env = (this === global) ? {} : this; + const env = this === global ? {} : this; env.plugin = plugin; env.pluginEnvironment = pluginEnvironment; diff --git a/test/helpers/asModule.js b/test/helpers/asModule.js new file mode 100644 index 00000000000..1598ce06d13 --- /dev/null +++ b/test/helpers/asModule.js @@ -0,0 +1,30 @@ +const vm = require("vm"); + +const SYNTHETIC_MODULES_STORE = "__SYNTHETIC_MODULES_STORE"; + +module.exports = async (something, context, unlinked) => { + if ( + something instanceof (vm.Module || /* node.js 10 */ vm.SourceTextModule) + ) { + return something; + } + context[SYNTHETIC_MODULES_STORE] = context[SYNTHETIC_MODULES_STORE] || []; + const i = context[SYNTHETIC_MODULES_STORE].length; + context[SYNTHETIC_MODULES_STORE].push(something); + const code = [...new Set(["default", ...Object.keys(something)])] + .map( + name => + `const _${name} = ${SYNTHETIC_MODULES_STORE}[${i}]${ + name === "default" ? "" : `[${JSON.stringify(name)}]` + }; export { _${name} as ${name}};` + ) + .join("\n"); + const m = new vm.SourceTextModule(code, { + context + }); + if (unlinked) return m; + await m.link(() => {}); + if (m.instantiate) m.instantiate(); + await m.evaluate(); + return m; +}; diff --git a/test/helpers/captureStdio.js b/test/helpers/captureStdio.js new file mode 100644 index 00000000000..3d1945a6ee9 --- /dev/null +++ b/test/helpers/captureStdio.js @@ -0,0 +1,44 @@ +const stripVTControlCharacters = require("strip-ansi"); + +module.exports = (stdio, tty) => { + let logs = []; + + const write = stdio.write; + const isTTY = stdio.isTTY; + + stdio.write = function (str) { + logs.push(str); + }; + if (tty !== undefined) stdio.isTTY = tty; + + return { + data: logs, + + reset: () => (logs = []), + + toString: () => + stripVTControlCharacters(logs.join("")) + .replace( + /\([^)]+\) (\[[^\]]+\]\s*)?(Deprecation|Experimental)Warning.+(\n\(Use .node.+\))?(\n(\s|BREAKING CHANGE).*)*(\n\s+at .*)*\n?/g, + "" + ) + // Ignore deprecated `import * as pkg from "file.json" assert { type: "json" };` + .replace( + /\([^)]+\) (\[[^\]]+\]\s*)?(V8:).* 'assert' is deprecated in import statements and support will be removed in a future version; use 'with' instead\n/g, + "" + ), + + toStringRaw: () => logs.join(""), + + restore() { + stdio.write = write; + stdio.isTTY = isTTY; + + delete require.cache[require.resolve("../../")]; + delete require.cache[ + require.resolve("../../lib/node/NodeEnvironmentPlugin") + ]; + delete require.cache[require.resolve("../../lib/node/nodeConsole")]; + } + }; +}; diff --git a/test/helpers/createFakeWorker.js b/test/helpers/createFakeWorker.js new file mode 100644 index 00000000000..bb7f81cf346 --- /dev/null +++ b/test/helpers/createFakeWorker.js @@ -0,0 +1,119 @@ +const path = require("path"); + +module.exports = ({ outputDirectory }) => + class Worker { + constructor(resource, options = {}) { + const isFileURL = /^file:/i.test(resource); + const isBlobURL = /^blob:/i.test(resource); + + if (!isFileURL && !isBlobURL) { + expect(resource.origin).toBe("https://test.cases"); + expect(resource.pathname.startsWith("/path/")).toBe(true); + } + + this.url = resource; + const file = isFileURL + ? resource + : path.resolve( + outputDirectory, + isBlobURL + ? options.originalURL.pathname.slice(6) + : resource.pathname.slice(6) + ); + + const workerBootstrap = ` +const { parentPort } = require("worker_threads"); +const { URL, fileURLToPath } = require("url"); +const path = require("path"); +const fs = require("fs"); +global.self = global; +self.URL = URL; +self.location = new URL(${JSON.stringify( + isBlobURL + ? resource.toString().replace("nodedata:", "https://test.cases/path/") + : resource.toString() + )}); +const urlToPath = url => { + if (/^file:/i.test(url)) return fileURLToPath(url); + if (url.startsWith("https://test.cases/path/")) url = url.slice(24); + return path.resolve(${JSON.stringify(outputDirectory)}, \`./\${url}\`); +}; +self.importScripts = url => { + ${ + options.type === "module" + ? 'throw new Error("importScripts is not supported in module workers")' + : "require(urlToPath(url))" + }; +}; +self.fetch = async url => { + try { + const buffer = await new Promise((resolve, reject) => + fs.readFile(urlToPath(url), (err, b) => + err ? reject(err) : resolve(b) + ) + ); + return { + headers: { get(name) { } }, + status: 200, + ok: true, + arrayBuffer() { return buffer; }, + json: async () => JSON.parse(buffer.toString("utf-8")) + }; + } catch(err) { + if(err.code === "ENOENT") { + return { + status: 404, + ok: false + }; + } + throw err; + } +}; + +self.postMessage = data => { + parentPort.postMessage(data); +}; +if (${options.type === "module"}) { + import(${JSON.stringify(file)}).then(() => { + parentPort.on("message", data => { + if(self.onmessage) self.onmessage({ + data + }); + }); + }); +} else { + parentPort.on("message", data => { + if(self.onmessage) self.onmessage({ + data + }); + }); + require(${JSON.stringify(file)}); +} +`; + this.worker = new (require("worker_threads").Worker)(workerBootstrap, { + eval: true + }); + + this._onmessage = undefined; + } + + set onmessage(value) { + if (this._onmessage) this.worker.off("message", this._onmessage); + this.worker.on( + "message", + (this._onmessage = data => { + value({ + data + }); + }) + ); + } + + postMessage(data) { + this.worker.postMessage(data); + } + + terminate() { + return this.worker.terminate(); + } + }; diff --git a/test/helpers/createLazyTestEnv.js b/test/helpers/createLazyTestEnv.js index 813e232bbae..5702584a2e6 100644 --- a/test/helpers/createLazyTestEnv.js +++ b/test/helpers/createLazyTestEnv.js @@ -1,117 +1,127 @@ -// this function allows to release memory in fn context -// after the function has been called. -const createOnceFn = fn => { - if (!fn) return null; - if (fn.length >= 1) { - return done => { - fn(done); - fn = null; - }; - } - return () => { - const r = fn(); - fn = null; - return r; - }; -}; +// eslint-disable-next-line jest/no-export +module.exports = (globalTimeout = 2000, nameSuffix = "") => { + const state = global.JEST_STATE_SYMBOL; + let currentDescribeBlock; + let currentlyRunningTest; + let runTests = -1; + const disposables = []; -// this function allows to release memory in fn context -// manually, usually after the suite has been run. -const createDisposableFn = fn => { - if (!fn) return null; - let rfn; - if (fn.length >= 1) { - rfn = done => { - fn(done); - }; - } else { - rfn = () => { - return fn(); - }; - } - rfn.dispose = () => { - fn = null; + // this function allows to release memory in fn context + // manually, usually after the suite has been run. + const createDisposableFn = (fn, isTest) => { + if (!fn) return null; + const rfn = + fn.length >= 1 + ? done => { + fn((...args) => { + if (isTest) runTests++; + done(...args); + }); + } + : () => { + const r = fn(); + if (isTest) runTests++; + return r; + }; + disposables.push(() => { + fn = null; + }); + return rfn; }; - return rfn; -}; -module.exports = (env, globalTimeout = 2000, nameSuffix = "") => { - const suite = env.describe( + describe( nameSuffix ? `exported tests ${nameSuffix}` : "exported tests", () => { // this must have a child to be handled correctly - env.it("should run the exported tests", () => {}); + it("should run the exported tests", () => { + runTests++; + }); + afterAll(done => { + for (const dispose of disposables) { + dispose(); + } + done(); + }); + currentDescribeBlock = state.currentDescribeBlock; + currentlyRunningTest = state.currentlyRunningTest; } ); let numberOfTests = 0; - const beforeAndAfterFns = () => { - let currentSuite = suite; - let afters = []; - let befores = []; - - while (currentSuite) { - befores = befores.concat(currentSuite.beforeFns); - afters = afters.concat(currentSuite.afterFns); - - currentSuite = currentSuite.parentSuite; + const inSuite = fn => { + const { + currentDescribeBlock: oldCurrentDescribeBlock, + currentlyRunningTest: oldCurrentlyRunningTest, + hasStarted: oldHasStarted + } = state; + state.currentDescribeBlock = currentDescribeBlock; + state.currentlyRunningTest = currentlyRunningTest; + state.hasStarted = false; + try { + fn(); + } catch (err) { + // avoid leaking memory + /** @type {EXPECTED_ANY} */ + (err).stack; + throw err; } - - return { - befores: befores.reverse(), - afters: afters + state.currentDescribeBlock = oldCurrentDescribeBlock; + state.currentlyRunningTest = oldCurrentlyRunningTest; + state.hasStarted = oldHasStarted; + }; + const fixAsyncError = block => { + // By default jest leaks memory as it stores asyncError + // for each "it" call to track the origin test suite + // We want to evaluate this early here to avoid leaking memory + block.asyncError = { + stack: block.asyncError.stack }; }; return { + /** + * @param {number} time time + */ setDefaultTimeout(time) { globalTimeout = time; }, getNumberOfTests() { return numberOfTests; }, - it(title, fn, timeout = globalTimeout) { - fn = createOnceFn(fn); + it(...args) { numberOfTests++; - let spec; - if(fn) { - spec = env.fit(title, fn, timeout); - } else { - spec = env.fit(title, () => {}); - spec.pend("Skipped"); - } - suite.addChild(spec); - spec.disabled = false; - spec.getSpecName = () => { - return `${suite.getFullName()} ${spec.description}`; - }; - spec.beforeAndAfterFns = beforeAndAfterFns; - spec.result.fullName = spec.getFullName(); - }, - beforeEach(fn, timeout = globalTimeout) { - fn = createDisposableFn(fn); - suite.beforeEach({ - fn, - timeout: () => timeout - }); - suite.afterAll({ - fn: done => { - fn.dispose(); - done(); - }, - timeout: () => 1000 + if (runTests >= numberOfTests) throw new Error("it called too late"); + args[1] = createDisposableFn(args[1], true); + args[2] = args[2] || globalTimeout; + inSuite(() => { + // @ts-expect-error expected + // eslint-disable-next-line jest/no-disabled-tests + it(...args); + fixAsyncError( + currentDescribeBlock.tests[currentDescribeBlock.tests.length - 1] + ); }); }, - afterEach(fn, timeout = globalTimeout) { - fn = createDisposableFn(fn); - suite.afterEach({ - fn, - timeout: () => timeout + beforeEach(...args) { + if (runTests >= numberOfTests) + throw new Error("beforeEach called too late"); + args[0] = createDisposableFn(args[0]); + inSuite(() => { + // @ts-expect-error expected + beforeEach(...args); + fixAsyncError( + currentDescribeBlock.hooks[currentDescribeBlock.hooks.length - 1] + ); }); - suite.afterAll({ - fn: done => { - fn.dispose(); - done(); - }, - timeout: () => 1000 + }, + afterEach(...args) { + if (runTests >= numberOfTests) + throw new Error("afterEach called too late"); + args[0] = createDisposableFn(args[0]); + inSuite(() => { + // @ts-expect-error expected + afterEach(...args); + fixAsyncError( + currentDescribeBlock.hooks[currentDescribeBlock.hooks.length - 1] + ); }); } }; diff --git a/test/helpers/currentWatchStep.js b/test/helpers/currentWatchStep.js index 1b18fbcfaf1..b3aa4dfc86b 100644 --- a/test/helpers/currentWatchStep.js +++ b/test/helpers/currentWatchStep.js @@ -1 +1 @@ -exports.step = undefined; +module.exports.step = undefined; diff --git a/test/helpers/deprecationTracking.js b/test/helpers/deprecationTracking.js new file mode 100644 index 00000000000..e2ab1020014 --- /dev/null +++ b/test/helpers/deprecationTracking.js @@ -0,0 +1,60 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + +"use strict"; + +const util = require("util"); + +/** @type {undefined | Map} */ +let interception; + +const originalDeprecate = util.deprecate; + +/** + * @template {EXPECTED_FUNCTION} T + * @param {T} fn fn + * @param {string} message message + * @param {string=} _code code + * @returns {T} result + */ +util.deprecate = (fn, message, _code) => { + const original = originalDeprecate(fn, message, _code); + + // @ts-expect-error expected + return function (...args) { + if (interception) { + interception.set(`${_code}: ${message}`, { + code: /** @type {string} */ (_code), + message, + stack: /** @type {string} */ (new Error(message).stack) + }); + // @ts-expect-error expected + return fn.apply(this, args); + } + + // @ts-expect-error expected + return original.apply(this, args); + }; +}; + +/** + * @param {EXPECTED_ANY} handler handler + * @returns {() => EXPECTED_ANY} result + */ +module.exports.start = handler => { + interception = new Map(); + + return () => { + const map = interception; + interception = undefined; + return Array.from(map || []) + .sort(([a], [b]) => { + if (a < b) return -1; + if (a > b) return 1; + return 0; + }) + .map(([key, data]) => data); + }; +}; diff --git a/test/helpers/expectSource.js b/test/helpers/expectSource.js new file mode 100644 index 00000000000..9c116a228aa --- /dev/null +++ b/test/helpers/expectSource.js @@ -0,0 +1,26 @@ +const regexEscape = require("./regexEscape.js"); + +// These expect* methods are necessary because 'source' contains the code for this test file, which will always contain the string +// being tested for, so we have to use the "DO NOT MATCH BELOW..." technique to exclude the actual testing code from the test. +// Place your jest 'expect' calls below a line containing the DO NOT MATCH BELOW... string constructed below. See other tests for examples. + +// Break up the match string so we don't match it in these expect* functions either. +const doNotMatch = ["DO", "NOT", "MATCH", "BELOW", "THIS", "LINE"].join(" "); + +/** + * @param {string} source value + * @param {string} str string for searching + */ +function expectSourceToContain(source, str) { + expect(source).toMatch(new RegExp(`${regexEscape(str)}.*${doNotMatch}`, "s")); +} + +/** + * @param {string} source value + * @param {RegExp} regexStr regexp + */ +function expectSourceToMatch(source, regexStr) { + expect(source).toMatch(new RegExp(`${regexStr}.*${doNotMatch}`, "s")); +} + +module.exports = { expectSourceToContain, expectSourceToMatch }; diff --git a/test/helpers/expectWarningFactory.js b/test/helpers/expectWarningFactory.js new file mode 100644 index 00000000000..7f0fda512f8 --- /dev/null +++ b/test/helpers/expectWarningFactory.js @@ -0,0 +1,23 @@ +module.exports = () => { + const warnings = []; + let oldWarn; + + beforeEach(done => { + oldWarn = console.warn; + console.warn = m => warnings.push(m); + done(); + }); + + afterEach(done => { + expectWarning(); + console.warn = oldWarn; + done(); + }); + + const expectWarning = (...regexp) => { + expect(warnings).toEqual(regexp.map(r => expect.stringMatching(r))); + warnings.length = 0; + }; + + return expectWarning; +}; diff --git a/test/helpers/fakeSystem.js b/test/helpers/fakeSystem.js new file mode 100644 index 00000000000..4f745627d52 --- /dev/null +++ b/test/helpers/fakeSystem.js @@ -0,0 +1,121 @@ +const System = { + register: (name, deps, fn) => { + if (!System.registry) { + throw new Error("System is no initialized"); + } + if (typeof name !== "string") { + fn = deps; + deps = name; + name = System._nextName; + } + if (!Array.isArray(deps)) { + fn = deps; + deps = []; + } + const dynamicExport = result => { + if (System.registry[name] !== entry) { + throw new Error(`Module ${name} calls dynamicExport too late`); + } + entry.exports = result; + for (const mod of Object.keys(System.registry)) { + const m = System.registry[mod]; + if (!m.deps) continue; + for (let i = 0; i < m.deps.length; i++) { + const dep = m.deps[i]; + if (dep !== name) continue; + const setters = m.mod.setters[i]; + setters(result); + } + } + }; + const systemContext = { + meta: { + url: `/${name}.js` + }, + import() { + return Promise.resolve(); + } + }; + if (name in System.registry) { + throw new Error(`Module ${name} is already registered`); + } + const mod = fn(dynamicExport, systemContext); + if (deps.length > 0) { + if (!Array.isArray(mod.setters)) { + throw new Error( + `Module ${name} must have setters, because it has dependencies` + ); + } + if (mod.setters.length !== deps.length) { + throw new Error( + `Module ${name} has incorrect number of setters for the dependencies` + ); + } + } + const entry = { + name, + deps, + fn, + mod, + executed: false, + exports: undefined + }; + System.registry[name] = entry; + }, + set: (name, exports) => { + System.registry[name] = { + name, + executed: true, + exports + }; + }, + registry: undefined, + _require: undefined, + _nextName: "(anonym)", + setRequire: req => { + System._require = req; + }, + init: modules => { + System.registry = {}; + if (modules) { + for (const name of Object.keys(modules)) { + System.registry[name] = { + executed: true, + exports: modules[name] + }; + } + } + }, + execute: name => { + const m = System.registry[name]; + if (!m) throw new Error(`Module ${name} not registered`); + if (m.executed) throw new Error(`Module ${name} was already executed`); + return System.ensureExecuted(name); + }, + ensureExecuted: name => { + let m = System.registry[name]; + if (!m && System._require) { + const oldName = System._nextName; + System._nextName = name; + System._require(name); + System._nextName = oldName; + m = System.registry[name]; + } + if (!m) { + throw new Error(`Module ${name} not registered`); + } + if (!m.executed) { + m.executed = true; + for (let i = 0; i < m.deps.length; i++) { + const dep = m.deps[i]; + const setters = m.mod.setters[i]; + System.ensureExecuted(dep); + const { exports } = System.registry[dep]; + if (exports !== undefined) setters(exports); + } + m.mod.execute(); + } + return m.exports; + } +}; +module.exports = System; diff --git a/test/helpers/findOutputFiles.js b/test/helpers/findOutputFiles.js new file mode 100644 index 00000000000..4bbe2b01bce --- /dev/null +++ b/test/helpers/findOutputFiles.js @@ -0,0 +1,18 @@ +"use strict"; + +const fs = require("fs"); +const path = require("path"); + +/** + * @param {{output: {path: string}}} options options + * @param {RegExp} regexp regexp + * @param {string=} subpath path in output directory + * @returns {string[]} files + */ +module.exports = function findOutputFiles(options, regexp, subpath) { + const files = fs.readdirSync( + subpath ? path.join(options.output.path, subpath) : options.output.path + ); + + return files.filter(file => regexp.test(file)); +}; diff --git a/test/helpers/infrastructureLogErrors.js b/test/helpers/infrastructureLogErrors.js new file mode 100644 index 00000000000..d19cb7e33c5 --- /dev/null +++ b/test/helpers/infrastructureLogErrors.js @@ -0,0 +1,29 @@ +"use strict"; + +const PERSISTENCE_CACHE_INVALIDATE_ERROR = (log, config) => { + if (config.run < 2) return; + const match = + /^\[webpack\.cache\.PackFileCacheStrategy\] Pack got invalid because of write to:(.+)$/.exec( + log + ); + if (match) { + return `Pack got invalid because of write to: ${match[1].trim()}`; + } +}; +const errorsFilter = [PERSISTENCE_CACHE_INVALIDATE_ERROR]; + +/** + * @param {string[]} logs logs + * @param {TODO} config config + * @returns {string[]} errors + */ +module.exports = function filterInfraStructureErrors(logs, config) { + const results = []; + for (const log of logs) { + for (const filter of errorsFilter) { + const result = filter(log, config); + if (result) results.push({ message: result }); + } + } + return results; +}; diff --git a/test/helpers/pkg.json b/test/helpers/pkg.json new file mode 100644 index 00000000000..c8c4105eb57 --- /dev/null +++ b/test/helpers/pkg.json @@ -0,0 +1,3 @@ +{ + "foo": "bar" +} diff --git a/test/helpers/prepareOptions.js b/test/helpers/prepareOptions.js index 8f1d1b17a66..637f69d9c30 100644 --- a/test/helpers/prepareOptions.js +++ b/test/helpers/prepareOptions.js @@ -21,10 +21,8 @@ module.exports = (options, argv) => { options = handleExport(options); - if (Array.isArray(options)) { - options = options.map(_options => handleFunction(_options, argv)); - } else { - options = handleFunction(options, argv); - } + options = Array.isArray(options) + ? options.map(_options => handleFunction(_options, argv)) + : handleFunction(options, argv); return options; }; diff --git a/test/helpers/regexEscape.js b/test/helpers/regexEscape.js new file mode 100644 index 00000000000..11f4b6f003a --- /dev/null +++ b/test/helpers/regexEscape.js @@ -0,0 +1,3 @@ +module.exports = function regexEscape(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string +}; diff --git a/test/helpers/remove.js b/test/helpers/remove.js index 747e9302dae..54825e28ec3 100644 --- a/test/helpers/remove.js +++ b/test/helpers/remove.js @@ -1,7 +1,13 @@ +const fs = require("fs"); +const path = require("path"); + +/** + * @param {string} src src + */ module.exports.remove = function remove(src) { if (!fs.existsSync(src)) return; const files = fs.readdirSync(src); - files.forEach(filename => { + for (const filename of files) { const srcFile = path.join(src, filename); const directory = fs.statSync(srcFile).isDirectory(); if (directory) { @@ -9,5 +15,5 @@ module.exports.remove = function remove(src) { } else { fs.unlinkSync(srcFile); } - }); -} + } +}; diff --git a/test/helpers/supportDefaultAssignment.js b/test/helpers/supportDefaultAssignment.js index 598c2cef9fc..abfabbe1e9b 100644 --- a/test/helpers/supportDefaultAssignment.js +++ b/test/helpers/supportDefaultAssignment.js @@ -1,9 +1,10 @@ module.exports = function supportDefaultAssignment() { try { - var E = eval("class E { toString() { return 'default' } }") - var f1 = eval("(function f1({a, b = E}) {return new b().toString();})") - return f1({a: "test"}) === "default" ; - } catch(e) { + // eslint-disable-next-line no-unused-vars + const E = eval("(class E { toString() { return 'default' } })"); + const f1 = eval("(function f1({a, b = E}) {return new b().toString();})"); + return f1({ a: "test" }) === "default"; + } catch (_err) { return false; } }; diff --git a/test/helpers/supportsAggregateError.js b/test/helpers/supportsAggregateError.js new file mode 100644 index 00000000000..b1a1952ea5b --- /dev/null +++ b/test/helpers/supportsAggregateError.js @@ -0,0 +1,3 @@ +module.exports = function supportsAggregateError() { + return typeof AggregateError !== "undefined"; +}; diff --git a/test/helpers/supportsArrowFunctionExpression.js b/test/helpers/supportsArrowFunctionExpression.js index a3d9932c729..c60dc2ee95e 100644 --- a/test/helpers/supportsArrowFunctionExpression.js +++ b/test/helpers/supportsArrowFunctionExpression.js @@ -1,8 +1,10 @@ module.exports = function supportArrowFunctionExpression() { try { - eval("var foo = function(fn) {return fn.toString()}; foo(() => {return 'a'})"); + eval( + "var foo = function(fn) {return fn.toString()}; foo(() => {return 'a'})" + ); return true; - } catch(e) { + } catch (_err) { return false; } }; diff --git a/test/helpers/supportsAsync.js b/test/helpers/supportsAsync.js new file mode 100644 index 00000000000..ea517ad37b9 --- /dev/null +++ b/test/helpers/supportsAsync.js @@ -0,0 +1,15 @@ +module.exports = function supportsAsync() { + // Node.js@10 has a bug with nested async/await + if (process.version.startsWith("v10.")) { + return false; + } + + try { + eval("async () => {}"); + return true; + } catch (_err) { + // Ignore + } + + return false; +}; diff --git a/test/helpers/supportsBlob.js b/test/helpers/supportsBlob.js new file mode 100644 index 00000000000..8f6c80fb0ff --- /dev/null +++ b/test/helpers/supportsBlob.js @@ -0,0 +1,7 @@ +module.exports = function supportsBlob() { + try { + return typeof Blob !== "undefined"; + } catch (_err) { + return false; + } +}; diff --git a/test/helpers/supportsBlockScoping.js b/test/helpers/supportsBlockScoping.js index e6d0fb44883..3e2b0d260c4 100644 --- a/test/helpers/supportsBlockScoping.js +++ b/test/helpers/supportsBlockScoping.js @@ -1,8 +1,10 @@ module.exports = function supportsBlockScoping() { try { - var f = eval("(function f() { const x = 1; if (true) { const x = 2; } return x; })"); + const f = eval( + "(function f() { const x = 1; if (true) { const x = 2; } return x; })" + ); return f() === 1; - } catch(e) { + } catch (_err) { return false; } }; diff --git a/test/helpers/supportsClassFields.js b/test/helpers/supportsClassFields.js new file mode 100644 index 00000000000..ebb848a4688 --- /dev/null +++ b/test/helpers/supportsClassFields.js @@ -0,0 +1,8 @@ +module.exports = function supportsES6() { + try { + eval("class A { #field = 1 }"); + return true; + } catch (_err) { + return false; + } +}; diff --git a/test/helpers/supportsClassStaticBlock.js b/test/helpers/supportsClassStaticBlock.js new file mode 100644 index 00000000000..75c891caf33 --- /dev/null +++ b/test/helpers/supportsClassStaticBlock.js @@ -0,0 +1,8 @@ +module.exports = function supportsClassStaticBLock() { + try { + eval("(function f({x, y}) { class Foo { static {} } })"); + return true; + } catch (_err) { + return false; + } +}; diff --git a/test/helpers/supportsDefaultArgs.js b/test/helpers/supportsDefaultArgs.js index b20a6e1b685..d637725dc4f 100644 --- a/test/helpers/supportsDefaultArgs.js +++ b/test/helpers/supportsDefaultArgs.js @@ -1,8 +1,8 @@ module.exports = function supportsDefaultArgs() { try { - var f = eval("(function f(a = 123) { return a; })"); + const f = eval("(function f(a = 123) { return a; })"); return f() === 123; - } catch(e) { + } catch (_err) { return false; } }; diff --git a/test/helpers/supportsES6.js b/test/helpers/supportsES6.js index d7631f1ab4e..fc00740a40b 100644 --- a/test/helpers/supportsES6.js +++ b/test/helpers/supportsES6.js @@ -2,7 +2,7 @@ module.exports = function supportsES6() { try { eval("class A {}"); return true; - } catch(e) { + } catch (_err) { return false; } }; diff --git a/test/helpers/supportsErrorCause.js b/test/helpers/supportsErrorCause.js new file mode 100644 index 00000000000..84384a28793 --- /dev/null +++ b/test/helpers/supportsErrorCause.js @@ -0,0 +1,6 @@ +module.exports = function supportsErrorCause() { + return ( + typeof new Error("test", { cause: new Error("cause") }).cause !== + "undefined" + ); +}; diff --git a/test/helpers/supportsForOf.js b/test/helpers/supportsForOf.js index 332fddffe65..01d04046331 100644 --- a/test/helpers/supportsForOf.js +++ b/test/helpers/supportsForOf.js @@ -1,8 +1,8 @@ module.exports = function supportDefaultAssignment() { try { - var f = eval("(function f() { for(var x of ['ok', 'fail']) return x; })"); - return f() === "ok" ; - } catch(e) { + const f = eval("(function f() { for(var x of ['ok', 'fail']) return x; })"); + return f() === "ok"; + } catch (_err) { return false; } }; diff --git a/test/helpers/supportsIteratorDestructuring.js b/test/helpers/supportsIteratorDestructuring.js index 8a604f15820..88b9985a6e8 100644 --- a/test/helpers/supportsIteratorDestructuring.js +++ b/test/helpers/supportsIteratorDestructuring.js @@ -1,8 +1,8 @@ module.exports = function supportsIteratorDestructuring() { try { - var f = eval("(function f([, x, ...y]) { return x; })"); + const f = eval("(function f([, x, ...y]) { return x; })"); return f([1, 2]) === 2; - } catch(e) { + } catch (_err) { return false; } }; diff --git a/test/helpers/supportsLogicalAssignment.js b/test/helpers/supportsLogicalAssignment.js new file mode 100644 index 00000000000..2b85e0d38cc --- /dev/null +++ b/test/helpers/supportsLogicalAssignment.js @@ -0,0 +1,10 @@ +module.exports = function supportsLogicalAssignment() { + try { + const f = eval( + "(function f() { var x = null; x ??= true; x &&= true; return x ||= false; })" + ); + return f(); + } catch (_err) { + return false; + } +}; diff --git a/test/helpers/supportsNullishCoalescing.js b/test/helpers/supportsNullishCoalescing.js new file mode 100644 index 00000000000..370414f14ad --- /dev/null +++ b/test/helpers/supportsNullishCoalescing.js @@ -0,0 +1,8 @@ +module.exports = function supportsNullishCoalescing() { + try { + const f = eval("(function f() { return null ?? true; })"); + return f(); + } catch (_err) { + return false; + } +}; diff --git a/test/helpers/supportsObjectDestructuring.js b/test/helpers/supportsObjectDestructuring.js index c3be9e86d21..809f56edb29 100644 --- a/test/helpers/supportsObjectDestructuring.js +++ b/test/helpers/supportsObjectDestructuring.js @@ -1,8 +1,8 @@ module.exports = function supportsObjectDestructuring() { try { - var f = eval("(function f({x, y}) { return x + y; })"); + const f = eval("(function f({x, y}) { return x + y; })"); return f({ x: 1, y: 2 }) === 3; - } catch(e) { + } catch (_err) { return false; } }; diff --git a/test/helpers/supportsOptionalCatchBinding.js b/test/helpers/supportsOptionalCatchBinding.js index 8e3edbfb254..673ee569932 100644 --- a/test/helpers/supportsOptionalCatchBinding.js +++ b/test/helpers/supportsOptionalCatchBinding.js @@ -2,7 +2,7 @@ module.exports = function supportsOptionalCatchBinding() { try { eval("try {} catch {}"); return true; - } catch(e) { + } catch (_err) { return false; } }; diff --git a/test/helpers/supportsOptionalChaining.js b/test/helpers/supportsOptionalChaining.js new file mode 100644 index 00000000000..f0531bca89d --- /dev/null +++ b/test/helpers/supportsOptionalChaining.js @@ -0,0 +1,8 @@ +module.exports = function supportsOptionalChaining() { + try { + const f = eval("(function f() { return ({a: true}) ?.a })"); + return f(); + } catch (_err) { + return false; + } +}; diff --git a/test/helpers/supportsRequireInModule.js b/test/helpers/supportsRequireInModule.js new file mode 100644 index 00000000000..74fe986b21f --- /dev/null +++ b/test/helpers/supportsRequireInModule.js @@ -0,0 +1,3 @@ +module.exports = function supportsRequireInModule() { + return Boolean(require("module").createRequire); +}; diff --git a/test/helpers/supportsResponse.js b/test/helpers/supportsResponse.js new file mode 100644 index 00000000000..ddb479d7a56 --- /dev/null +++ b/test/helpers/supportsResponse.js @@ -0,0 +1,7 @@ +module.exports = function supportsResponse() { + try { + return typeof Response !== "undefined"; + } catch (_err) { + return false; + } +}; diff --git a/test/helpers/supportsSpread.js b/test/helpers/supportsSpread.js index 3ea317b61e6..5d50ecd8b63 100644 --- a/test/helpers/supportsSpread.js +++ b/test/helpers/supportsSpread.js @@ -1,9 +1,10 @@ module.exports = function supportsSpread() { try { - var x = { a: true }, y; // eslint-disable-line no-unused-vars + const x = { a: true }; + let y; eval("y = { ...x }"); return y !== x && y.a; - } catch(e) { + } catch (_err) { return false; } }; diff --git a/test/helpers/supportsTemplateStrings.js b/test/helpers/supportsTemplateStrings.js index 7c310eab89a..f5ab91b2c56 100644 --- a/test/helpers/supportsTemplateStrings.js +++ b/test/helpers/supportsTemplateStrings.js @@ -1,8 +1,8 @@ module.exports = function supportsTemplateStrings() { try { - var f = eval("(function f() { return String.raw`a\\b`; })"); + const f = eval("(function f() { return String.raw`a\\b`; })"); return f() === "a\\b"; - } catch(e) { + } catch (_err) { return false; } }; diff --git a/test/helpers/supportsWebAssembly.js b/test/helpers/supportsWebAssembly.js index 51cbdbb573a..0cdc04da30e 100644 --- a/test/helpers/supportsWebAssembly.js +++ b/test/helpers/supportsWebAssembly.js @@ -1,7 +1,7 @@ module.exports = function supportsWebAssembly() { try { return typeof WebAssembly !== "undefined"; - } catch(e) { + } catch (_err) { return false; } }; diff --git a/test/helpers/supportsWorker.js b/test/helpers/supportsWorker.js new file mode 100644 index 00000000000..590dc1b7f7d --- /dev/null +++ b/test/helpers/supportsWorker.js @@ -0,0 +1,14 @@ +const nodeVersion = process.versions.node.split(".").map(Number); + +module.exports = function supportsWorker() { + // Verify that in the current node version new Worker() accepts URL as the first parameter: + // https://nodejs.org/api/worker_threads.html#worker_threads_new_worker_filename_options + if (nodeVersion[0] >= 14) { + return true; + } else if (nodeVersion[0] === 13 && nodeVersion[1] >= 12) { + return true; + } else if (nodeVersion[0] === 12 && nodeVersion[1] >= 17) { + return true; + } + return false; +}; diff --git a/test/helpers/warmup-webpack.js b/test/helpers/warmup-webpack.js new file mode 100644 index 00000000000..4a261e5d8cc --- /dev/null +++ b/test/helpers/warmup-webpack.js @@ -0,0 +1,27 @@ +describe("warmup", () => { + it("should warmup webpack", done => { + /** @type {typeof import("../../") | undefined} */ + let webpack = require("../../"); + const END = new Error("end warmup"); + webpack( + { + entry: "data:text/javascript,import 'data:text/javascript,'", + plugins: [ + c => + c.hooks.emit.tap("Warmup", () => { + throw END; + }) + ] + }, + err => { + webpack = undefined; + try { + expect(err).toBe(END); + done(); + } catch (doneErr) { + done(doneErr); + } + } + ); + }, 300000); +}); diff --git a/test/hotCases/asset-modules-source/source/file.text b/test/hotCases/asset-modules-source/source/file.text new file mode 100644 index 00000000000..75f6c1cbfa6 --- /dev/null +++ b/test/hotCases/asset-modules-source/source/file.text @@ -0,0 +1,3 @@ +A +--- +B diff --git a/test/hotCases/asset-modules-source/source/index.js b/test/hotCases/asset-modules-source/source/index.js new file mode 100644 index 00000000000..194bedd64be --- /dev/null +++ b/test/hotCases/asset-modules-source/source/index.js @@ -0,0 +1,10 @@ +it("should regenerate contenthash", function(done) { + const value = new URL("./file.text", import.meta.url); + expect(/file\.7eff7665bf7fc2696232\.text/.test(value.toString())).toBe(true); + module.hot.accept("./file.text", function() { + const value = new URL("./file.text", import.meta.url); + expect(/file\.402033be7494a9255415\.text/.test(value.toString())).toBe(true); + done(); + }); + NEXT(require("../../update")(done)); +}); diff --git a/test/hotCases/asset-modules-source/source/webpack.config.js b/test/hotCases/asset-modules-source/source/webpack.config.js new file mode 100644 index 00000000000..25951fef2c8 --- /dev/null +++ b/test/hotCases/asset-modules-source/source/webpack.config.js @@ -0,0 +1,21 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + devtool: false, + optimization: { + realContentHash: true + }, + module: { + generator: { + asset: { + filename: "assets/[name].[contenthash][ext]" + } + }, + rules: [ + { + test: /file\.text$/, + type: "asset/resource" + } + ] + } +}; diff --git a/test/hotCases/child-compiler/issue-9706/file.js b/test/hotCases/child-compiler/issue-9706/file.js new file mode 100644 index 00000000000..4fd27070716 --- /dev/null +++ b/test/hotCases/child-compiler/issue-9706/file.js @@ -0,0 +1,3 @@ +export default 1; +--- +export default 2; diff --git a/test/hotCases/child-compiler/issue-9706/index.js b/test/hotCases/child-compiler/issue-9706/index.js new file mode 100644 index 00000000000..4c4092071bb --- /dev/null +++ b/test/hotCases/child-compiler/issue-9706/index.js @@ -0,0 +1,12 @@ +import value, { assets } from "./report-child-assets-loader!./file"; + +it("should not emit hot updates from child compilers", done => { + expect(value).toBe(1); + expect(assets).toEqual(["test.js"]); + module.hot.accept("./report-child-assets-loader!./file", () => { + expect(value).toBe(2); + expect(assets).toEqual(["test.js"]); + done(); + }); + NEXT(require("../../update")(done)); +}); diff --git a/test/hotCases/child-compiler/issue-9706/report-child-assets-loader.js b/test/hotCases/child-compiler/issue-9706/report-child-assets-loader.js new file mode 100644 index 00000000000..44602281554 --- /dev/null +++ b/test/hotCases/child-compiler/issue-9706/report-child-assets-loader.js @@ -0,0 +1,43 @@ +/** @typedef {import("../../../../").Compiler} Compiler */ +/** @typedef {import("../../../../").Compilation} Compilation */ + +const { + SingleEntryPlugin, + node: { NodeTemplatePlugin } +} = require("../../../.."); + +/** @type {WeakMap} */ +const compilerCache = new WeakMap(); + +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { + const compiler = /** @type {Compiler} */ (this._compiler); + const compilation = /** @type {Compilation} */ (this._compilation); + + let childCompiler = compilerCache.get(compiler); + if (childCompiler === undefined) { + childCompiler = compilation.createChildCompiler( + "my-compiler|" + this.request, + { + filename: "test.js" + }, + [ + new NodeTemplatePlugin(), + new SingleEntryPlugin(this.context, this.resource) + ] + ); + compilerCache.set(compiler, childCompiler); + } + const callback = this.async(); + childCompiler.parentCompilation = this._compilation; + childCompiler.runAsChild((err, entries, compilation) => { + if (err) return callback(err); + + const result = `export const assets = ${JSON.stringify( + /** @type {Compilation} */ + (compilation).getAssets().map(a => a.name) + )};\n${source}`; + + callback(null, result); + }); +}; diff --git a/test/hotCases/chunks/accept-system-import-webpackhot/chunk.js b/test/hotCases/chunks/accept-system-import-webpackhot/chunk.js new file mode 100644 index 00000000000..628afead378 --- /dev/null +++ b/test/hotCases/chunks/accept-system-import-webpackhot/chunk.js @@ -0,0 +1 @@ +export { value } from "./file"; diff --git a/test/hotCases/chunks/accept-system-import-webpackhot/chunk2.js b/test/hotCases/chunks/accept-system-import-webpackhot/chunk2.js new file mode 100644 index 00000000000..628afead378 --- /dev/null +++ b/test/hotCases/chunks/accept-system-import-webpackhot/chunk2.js @@ -0,0 +1 @@ +export { value } from "./file"; diff --git a/test/hotCases/chunks/accept-system-import-webpackhot/file.js b/test/hotCases/chunks/accept-system-import-webpackhot/file.js new file mode 100644 index 00000000000..5b2c52ba4bd --- /dev/null +++ b/test/hotCases/chunks/accept-system-import-webpackhot/file.js @@ -0,0 +1,3 @@ +export var value = 1; +--- +export var value = 2; diff --git a/test/hotCases/chunks/accept-system-import-webpackhot/index.js b/test/hotCases/chunks/accept-system-import-webpackhot/index.js new file mode 100644 index 00000000000..87a73c39507 --- /dev/null +++ b/test/hotCases/chunks/accept-system-import-webpackhot/index.js @@ -0,0 +1,18 @@ +it("should import a changed chunk", (done) => { + import("./chunk").then((chunk) => { + expect(chunk.value).toBe(1); + import("./chunk2").then((chunk2) => { + expect(chunk2.value).toBe(1); + NEXT(require("../../update")(done)); + import.meta.webpackHot.accept(["./chunk", "./chunk2"], () => { + import("./chunk").then((chunk) => { + expect(chunk.value).toBe(2); + import("./chunk2").then((chunk2) => { + expect(chunk2.value).toBe(2); + done(); + }).catch(done); + }).catch(done); + }); + }).catch(done); + }).catch(done); +}); diff --git a/test/hotCases/chunks/initial-chunks-hmr/index.js b/test/hotCases/chunks/initial-chunks-hmr/index.js new file mode 100644 index 00000000000..b3d55d5d5da --- /dev/null +++ b/test/hotCases/chunks/initial-chunks-hmr/index.js @@ -0,0 +1,20 @@ +import 'lib-js/a' +import.meta.webpackHot.accept(); + +it("should work if there are new initial chunks", function (done) { + import('./initial').then(({value}) => { + expect(value).toBe('a') + }).catch(done) + NEXT(require("../../update")(done, true, () => { + done() + })) +}); +--- +import 'lib-js/a' + +it("should work if there are new initial chunks", function (done) { + import('./initial').then(({value}) => { + expect(value).toBe('b') + done() + }).catch(done) +}); \ No newline at end of file diff --git a/test/hotCases/chunks/initial-chunks-hmr/initial.js b/test/hotCases/chunks/initial-chunks-hmr/initial.js new file mode 100644 index 00000000000..63ea924fc0a --- /dev/null +++ b/test/hotCases/chunks/initial-chunks-hmr/initial.js @@ -0,0 +1,6 @@ +require('lib-js/a') +export var value = "a"; +--- +require('lib-js/b') +export var value = "b"; + diff --git a/test/hotCases/chunks/initial-chunks-hmr/node_modules/lib-js/a.js b/test/hotCases/chunks/initial-chunks-hmr/node_modules/lib-js/a.js new file mode 100644 index 00000000000..c7e14ef9a19 --- /dev/null +++ b/test/hotCases/chunks/initial-chunks-hmr/node_modules/lib-js/a.js @@ -0,0 +1 @@ +export const a = 'a' \ No newline at end of file diff --git a/test/hotCases/chunks/initial-chunks-hmr/node_modules/lib-js/b.js b/test/hotCases/chunks/initial-chunks-hmr/node_modules/lib-js/b.js new file mode 100644 index 00000000000..f30d1dcace4 --- /dev/null +++ b/test/hotCases/chunks/initial-chunks-hmr/node_modules/lib-js/b.js @@ -0,0 +1 @@ +export const b = 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb' \ No newline at end of file diff --git a/test/hotCases/chunks/initial-chunks-hmr/webpack.config.js b/test/hotCases/chunks/initial-chunks-hmr/webpack.config.js new file mode 100644 index 00000000000..a9292dcc395 --- /dev/null +++ b/test/hotCases/chunks/initial-chunks-hmr/webpack.config.js @@ -0,0 +1,25 @@ +module.exports = { + optimization: { + chunkIds: "named", + moduleIds: "named", + minimize: false, + concatenateModules: false, + splitChunks: { + minSize: 1000, + chunks: "all", + cacheGroups: { + lib: { + test: /lib-js/, + name: "lib" + }, + default: false, + defaultVendors: false + } + }, + mangleExports: false + }, + output: { + filename: "[name].js", + chunkFilename: "async/[name].js" + } +}; diff --git a/test/hotCases/chunks/split-chunks-webpackhot/index.js b/test/hotCases/chunks/split-chunks-webpackhot/index.js new file mode 100644 index 00000000000..02623b7048f --- /dev/null +++ b/test/hotCases/chunks/split-chunks-webpackhot/index.js @@ -0,0 +1,11 @@ +import vendor from "vendor"; +import.meta.webpackHot.accept("vendor"); +it("should hot update a splitted initial chunk", function (done) { + expect(vendor).toBe("1"); + NEXT( + require("../../update")(done, true, () => { + expect(vendor).toBe("2"); + done(); + }) + ); +}); diff --git a/test/hotCases/chunks/split-chunks-webpackhot/node_modules/vendor.js b/test/hotCases/chunks/split-chunks-webpackhot/node_modules/vendor.js new file mode 100644 index 00000000000..866bdccb5d1 --- /dev/null +++ b/test/hotCases/chunks/split-chunks-webpackhot/node_modules/vendor.js @@ -0,0 +1,3 @@ +module.exports = "1"; +--- +module.exports = "2"; diff --git a/test/hotCases/chunks/split-chunks-webpackhot/webpack.config.js b/test/hotCases/chunks/split-chunks-webpackhot/webpack.config.js new file mode 100644 index 00000000000..f6b8531395b --- /dev/null +++ b/test/hotCases/chunks/split-chunks-webpackhot/webpack.config.js @@ -0,0 +1,12 @@ +module.exports = { + output: { + filename: "[name].js" + }, + optimization: { + chunkIds: "total-size", + splitChunks: { + chunks: "all", + minSize: 0 + } + } +}; diff --git a/test/hotCases/chunks/split-chunks/index.js b/test/hotCases/chunks/split-chunks/index.js new file mode 100644 index 00000000000..4965d6890ae --- /dev/null +++ b/test/hotCases/chunks/split-chunks/index.js @@ -0,0 +1,11 @@ +import vendor from "vendor"; +module.hot.accept("vendor"); +it("should hot update a splitted initial chunk", function (done) { + expect(vendor).toBe("1"); + NEXT( + require("../../update")(done, true, () => { + expect(vendor).toBe("2"); + done(); + }) + ); +}); diff --git a/test/hotCases/chunks/split-chunks/node_modules/vendor.js b/test/hotCases/chunks/split-chunks/node_modules/vendor.js new file mode 100644 index 00000000000..866bdccb5d1 --- /dev/null +++ b/test/hotCases/chunks/split-chunks/node_modules/vendor.js @@ -0,0 +1,3 @@ +module.exports = "1"; +--- +module.exports = "2"; diff --git a/test/hotCases/chunks/split-chunks/webpack.config.js b/test/hotCases/chunks/split-chunks/webpack.config.js new file mode 100644 index 00000000000..f6b8531395b --- /dev/null +++ b/test/hotCases/chunks/split-chunks/webpack.config.js @@ -0,0 +1,12 @@ +module.exports = { + output: { + filename: "[name].js" + }, + optimization: { + chunkIds: "total-size", + splitChunks: { + chunks: "all", + minSize: 0 + } + } +}; diff --git a/test/hotCases/chunks/update-chunk-loading-runtime/chunk.js b/test/hotCases/chunks/update-chunk-loading-runtime/chunk.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/hotCases/chunks/update-chunk-loading-runtime/chunk.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/hotCases/chunks/update-chunk-loading-runtime/index.js b/test/hotCases/chunks/update-chunk-loading-runtime/index.js new file mode 100644 index 00000000000..e912411250c --- /dev/null +++ b/test/hotCases/chunks/update-chunk-loading-runtime/index.js @@ -0,0 +1,30 @@ +import value from "vendor"; +// if (import.meta.webpackHot.data) throw new Error("Should not be executed again"); +it("should correctly self-accept an entrypoint when chunk loading runtime module is updated", done => { + const hash = __webpack_hash__; + expect(value).toBe(1); + let hmrData; + import.meta.webpackHot.dispose(data => { + hmrData = data; + }); + NEXT( + require("../../update")(done, true, () => { + expect(hmrData).toHaveProperty("ok", true); + hmrData.test(); + expect(hmrData.hash).not.toBe(hash); + hmrData.loadChunk().then(m => { + expect(m.default).toBe(42); + done(); + }, done); + }) + ); +}); +import.meta.webpackHot.accept(); +--- +import value from "vendor"; +import.meta.webpackHot.data.ok = true; +import.meta.webpackHot.data.loadChunk = () => import("./chunk"); +import.meta.webpackHot.data.test = () => { + expect(value).toBe(2); +}; +import.meta.webpackHot.data.hash = __webpack_hash__; diff --git a/test/hotCases/chunks/update-chunk-loading-runtime/node_modules/vendor.js b/test/hotCases/chunks/update-chunk-loading-runtime/node_modules/vendor.js new file mode 100644 index 00000000000..4fd27070716 --- /dev/null +++ b/test/hotCases/chunks/update-chunk-loading-runtime/node_modules/vendor.js @@ -0,0 +1,3 @@ +export default 1; +--- +export default 2; diff --git a/test/hotCases/chunks/update-chunk-loading-runtime/webpack.config.js b/test/hotCases/chunks/update-chunk-loading-runtime/webpack.config.js new file mode 100644 index 00000000000..fd272520e15 --- /dev/null +++ b/test/hotCases/chunks/update-chunk-loading-runtime/webpack.config.js @@ -0,0 +1,16 @@ +/** + * @param {{ config: import("../../../../").Configuration }} config configuration + * @returns {import("../../../../").Configuration} configuration + */ +module.exports = ({ config }) => ({ + output: { + filename: "[name].js" + }, + optimization: { + runtimeChunk: config.target !== "webworker", + splitChunks: { + chunks: "all", + minSize: 0 + } + } +}); diff --git a/test/hotCases/code-generation/this-in-accept-webpackhot/index.js b/test/hotCases/code-generation/this-in-accept-webpackhot/index.js new file mode 100644 index 00000000000..55be5b27a88 --- /dev/null +++ b/test/hotCases/code-generation/this-in-accept-webpackhot/index.js @@ -0,0 +1,15 @@ +import x from "./module"; + +it("should have correct this context", (done) => { + expect(x).toEqual("ok1"); + + (function() { + import.meta.webpackHot.accept("./module", () => { + expect(x).toEqual("ok2"); + expect(this).toEqual({ ok: true }); + done(); + }); + }).call({ ok: true }); + + NEXT(require("../../update")(done)); +}); diff --git a/test/hotCases/code-generation/this-in-accept-webpackhot/module.js b/test/hotCases/code-generation/this-in-accept-webpackhot/module.js new file mode 100644 index 00000000000..93b538defe7 --- /dev/null +++ b/test/hotCases/code-generation/this-in-accept-webpackhot/module.js @@ -0,0 +1,3 @@ +export default "ok1"; +--- +export default "ok2"; diff --git a/test/hotCases/code-generation/this-in-accept/index.js b/test/hotCases/code-generation/this-in-accept/index.js new file mode 100644 index 00000000000..955eaa0641f --- /dev/null +++ b/test/hotCases/code-generation/this-in-accept/index.js @@ -0,0 +1,15 @@ +import x from "./module"; + +it("should have correct this context in accept handler", (done) => { + expect(x).toEqual("ok1"); + + (function() { + module.hot.accept("./module", () => { + expect(x).toEqual("ok2"); + expect(this).toEqual({ ok: true }); + done(); + }); + }).call({ ok: true }); + + NEXT(require("../../update")(done)); +}); diff --git a/test/hotCases/code-generation/this-in-accept/module.js b/test/hotCases/code-generation/this-in-accept/module.js new file mode 100644 index 00000000000..93b538defe7 --- /dev/null +++ b/test/hotCases/code-generation/this-in-accept/module.js @@ -0,0 +1,3 @@ +export default "ok1"; +--- +export default "ok2"; diff --git a/test/hotCases/concat/reload-compat-flag/webpack.config.js b/test/hotCases/concat/reload-compat-flag/webpack.config.js index 33dbfb8b1cb..af38831a638 100644 --- a/test/hotCases/concat/reload-compat-flag/webpack.config.js +++ b/test/hotCases/concat/reload-compat-flag/webpack.config.js @@ -1,5 +1,9 @@ "use strict"; +/** @type {import("../../../../").Configuration} */ module.exports = { - mode: "production" + mode: "production", + optimization: { + minimize: false + } }; diff --git a/test/hotCases/concat/reload-external/webpack.config.js b/test/hotCases/concat/reload-external/webpack.config.js index af45fdab52f..af38831a638 100644 --- a/test/hotCases/concat/reload-external/webpack.config.js +++ b/test/hotCases/concat/reload-external/webpack.config.js @@ -1,7 +1,9 @@ "use strict"; -const webpack = require("../../../../"); - +/** @type {import("../../../../").Configuration} */ module.exports = { - plugins: [new webpack.optimize.ModuleConcatenationPlugin()] + mode: "production", + optimization: { + minimize: false + } }; diff --git a/test/hotCases/conditional-runtime/accept-conditional/dep1.js b/test/hotCases/conditional-runtime/accept-conditional/dep1.js new file mode 100644 index 00000000000..74f8df37564 --- /dev/null +++ b/test/hotCases/conditional-runtime/accept-conditional/dep1.js @@ -0,0 +1,3 @@ +export default 42; +--- +export default 43; diff --git a/test/hotCases/conditional-runtime/accept-conditional/dep2.js b/test/hotCases/conditional-runtime/accept-conditional/dep2.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/hotCases/conditional-runtime/accept-conditional/dep2.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/hotCases/conditional-runtime/accept-conditional/index.js b/test/hotCases/conditional-runtime/accept-conditional/index.js new file mode 100644 index 00000000000..e71ada1d94b --- /dev/null +++ b/test/hotCases/conditional-runtime/accept-conditional/index.js @@ -0,0 +1,10 @@ +it("should create a conditional import when accepted", done => { + if (Math.random() < 0) new Worker(new URL("worker.js", import.meta.url)); + import("./module") + .then(module => + module.test(callback => { + NEXT(require("../../update")(done, undefined, callback)); + }, done) + ) + .catch(done); +}); diff --git a/test/hotCases/conditional-runtime/accept-conditional/module.js b/test/hotCases/conditional-runtime/accept-conditional/module.js new file mode 100644 index 00000000000..61fe0ef6548 --- /dev/null +++ b/test/hotCases/conditional-runtime/accept-conditional/module.js @@ -0,0 +1,9 @@ +import { f } from "./shared"; + +export function test(next, done) { + expect(f()).toBe(42); + next(() => { + expect(f()).toBe(43); + done(); + }); +} diff --git a/test/hotCases/conditional-runtime/accept-conditional/shared.js b/test/hotCases/conditional-runtime/accept-conditional/shared.js new file mode 100644 index 00000000000..bb34093d93e --- /dev/null +++ b/test/hotCases/conditional-runtime/accept-conditional/shared.js @@ -0,0 +1,12 @@ +import x from "./dep1"; +import y from "./dep2"; + +export function f() { + return x; +} + +export function g() { + return y; +} + +module.hot.accept(["./dep1", "./dep2"]); diff --git a/test/hotCases/conditional-runtime/accept-conditional/webpack.config.js b/test/hotCases/conditional-runtime/accept-conditional/webpack.config.js new file mode 100644 index 00000000000..b1b3c38e83e --- /dev/null +++ b/test/hotCases/conditional-runtime/accept-conditional/webpack.config.js @@ -0,0 +1,28 @@ +"use strict"; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + optimization: { + sideEffects: true, + usedExports: true, + innerGraph: true, + splitChunks: { + cacheGroups: { + forceMerge: { + test: /shared/, + enforce: true, + name: "shared", + chunks: "all" + } + } + } + }, + module: { + rules: [ + { + test: /dep/, + sideEffects: false + } + ] + } +}; diff --git a/test/hotCases/conditional-runtime/accept-conditional/worker.js b/test/hotCases/conditional-runtime/accept-conditional/worker.js new file mode 100644 index 00000000000..cad6c6170f1 --- /dev/null +++ b/test/hotCases/conditional-runtime/accept-conditional/worker.js @@ -0,0 +1,3 @@ +import { g } from "./shared"; + +expect(g()).toBe(42); diff --git a/test/hotCases/css/css-modules/index.js b/test/hotCases/css/css-modules/index.js new file mode 100644 index 00000000000..04419adbc04 --- /dev/null +++ b/test/hotCases/css/css-modules/index.js @@ -0,0 +1,28 @@ +import * as styles from "./style.module.css"; + +it("should work", async function (done) { + expect(styles).toMatchObject({ class: "_style_module_css-class" }); + + const styles2 = await import("./style2.module.css"); + + expect(styles2).toMatchObject({ + foo: "_style2_module_css-foo" + }); + + module.hot.accept(["./style.module.css", "./style2.module.css"], () => { + expect(styles).toMatchObject({ + "class-other": "_style_module_css-class-other" + }); + import("./style2.module.css").then(styles2 => { + expect(styles2).toMatchObject({ + "bar": "_style2_module_css-bar" + }); + + done(); + }); + }); + + NEXT(require("../../update")(done)); +}); + +module.hot.accept(); diff --git a/test/hotCases/css/css-modules/style.module.css b/test/hotCases/css/css-modules/style.module.css new file mode 100644 index 00000000000..98c6b2bb5d0 --- /dev/null +++ b/test/hotCases/css/css-modules/style.module.css @@ -0,0 +1,7 @@ +.class { + color: red; +} +--- +.class-other { + color: blue; +} diff --git a/test/hotCases/css/css-modules/style2.module.css b/test/hotCases/css/css-modules/style2.module.css new file mode 100644 index 00000000000..681b83a2612 --- /dev/null +++ b/test/hotCases/css/css-modules/style2.module.css @@ -0,0 +1,7 @@ +.foo { + color: red; +} +--- +.bar { + color: blue; +} diff --git a/test/hotCases/css/css-modules/test.config.js b/test/hotCases/css/css-modules/test.config.js new file mode 100644 index 00000000000..429d7576747 --- /dev/null +++ b/test/hotCases/css/css-modules/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "https://test.cases/path/bundle.css"; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/hotCases/css/css-modules/webpack.config.js b/test/hotCases/css/css-modules/webpack.config.js new file mode 100644 index 00000000000..14df4b56566 --- /dev/null +++ b/test/hotCases/css/css-modules/webpack.config.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + devtool: false, + experiments: { + css: true + } +}; diff --git a/test/hotCases/css/fetch-priority/index.js b/test/hotCases/css/fetch-priority/index.js new file mode 100644 index 00000000000..90fd9b974c0 --- /dev/null +++ b/test/hotCases/css/fetch-priority/index.js @@ -0,0 +1,26 @@ +it("should work", async function (done) { + const styles = await import(/* webpackFetchPriority: "high" */ "./style.module.css"); + + expect(styles).toMatchObject({ + class: "_style_module_css-class" + }); + + module.hot.accept("./style.module.css", () => { + import("./style.module.css").then(styles => { + expect(styles).toMatchObject({ + "class-other": "_style_module_css-class-other" + }); + + const links = window.document.getElementsByTagName('link'); + + if (links.length > 0) { + expect(links[0].getAttribute('fetchpriority')).toBe('high'); + } + done(); + }); + }); + + NEXT(require("../../update")(done)); +}); + +module.hot.accept(); diff --git a/test/hotCases/css/fetch-priority/style.module.css b/test/hotCases/css/fetch-priority/style.module.css new file mode 100644 index 00000000000..98c6b2bb5d0 --- /dev/null +++ b/test/hotCases/css/fetch-priority/style.module.css @@ -0,0 +1,7 @@ +.class { + color: red; +} +--- +.class-other { + color: blue; +} diff --git a/test/hotCases/css/fetch-priority/webpack.config.js b/test/hotCases/css/fetch-priority/webpack.config.js new file mode 100644 index 00000000000..14df4b56566 --- /dev/null +++ b/test/hotCases/css/fetch-priority/webpack.config.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + devtool: false, + experiments: { + css: true + } +}; diff --git a/test/hotCases/css/imported-css/a.css b/test/hotCases/css/imported-css/a.css new file mode 100644 index 00000000000..84a857d54cc --- /dev/null +++ b/test/hotCases/css/imported-css/a.css @@ -0,0 +1,4 @@ + +.html { + color: green; +} diff --git a/test/hotCases/css/imported-css/index.css b/test/hotCases/css/imported-css/index.css new file mode 100644 index 00000000000..78a24438d63 --- /dev/null +++ b/test/hotCases/css/imported-css/index.css @@ -0,0 +1,9 @@ +@import url("./a.css"); +--- +html { + color: blue; +} +--- +html { + color: yellow; +} diff --git a/test/hotCases/css/imported-css/index.js b/test/hotCases/css/imported-css/index.js new file mode 100644 index 00000000000..0103a114914 --- /dev/null +++ b/test/hotCases/css/imported-css/index.js @@ -0,0 +1,21 @@ +import "./index.css" + +it("should work", done => { + const links = window.document.getElementsByTagName("link"); + expect(links[0].sheet.css).toContain("color: green;"); + + NEXT( + require("../../update")(done, true, () => { + const links = window.document.getElementsByTagName("link"); + expect(links[0].sheet.css).toContain("color: blue;"); + + NEXT( + require("../../update")(done, true, () => { + const links = window.document.getElementsByTagName("link"); + expect(links[0].sheet.css).toContain("color: yellow;"); + done(); + }) + ); + }) + ); +}); diff --git a/test/hotCases/css/imported-css/test.filter.js b/test/hotCases/css/imported-css/test.filter.js new file mode 100644 index 00000000000..2be506ab037 --- /dev/null +++ b/test/hotCases/css/imported-css/test.filter.js @@ -0,0 +1,3 @@ +module.exports = function (config) { + return config.target === "web"; +}; diff --git a/test/hotCases/css/imported-css/webpack.config.js b/test/hotCases/css/imported-css/webpack.config.js new file mode 100644 index 00000000000..14df4b56566 --- /dev/null +++ b/test/hotCases/css/imported-css/webpack.config.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + devtool: false, + experiments: { + css: true + } +}; diff --git a/test/hotCases/css/single-css-entry/index.css b/test/hotCases/css/single-css-entry/index.css new file mode 100644 index 00000000000..39fb52cc4cf --- /dev/null +++ b/test/hotCases/css/single-css-entry/index.css @@ -0,0 +1,11 @@ +.html { + color: red; +} +--- +html { + color: blue; +} +--- +html { + color: yellow; +} diff --git a/test/hotCases/css/single-css-entry/index.js b/test/hotCases/css/single-css-entry/index.js new file mode 100644 index 00000000000..9864cf854a0 --- /dev/null +++ b/test/hotCases/css/single-css-entry/index.js @@ -0,0 +1,19 @@ +it("should work", done => { + const links = window.document.getElementsByTagName("link"); + expect(links[0].sheet.css).toContain("color: red;"); + + NEXT( + require("../../update")(done, true, () => { + const links = window.document.getElementsByTagName("link"); + expect(links[0].sheet.css).toContain("color: blue;"); + + NEXT( + require("../../update")(done, true, () => { + const links = window.document.getElementsByTagName("link"); + expect(links[0].sheet.css).toContain("color: yellow;"); + done(); + }) + ); + }) + ); +}); diff --git a/test/hotCases/css/single-css-entry/test.filter.js b/test/hotCases/css/single-css-entry/test.filter.js new file mode 100644 index 00000000000..2be506ab037 --- /dev/null +++ b/test/hotCases/css/single-css-entry/test.filter.js @@ -0,0 +1,3 @@ +module.exports = function (config) { + return config.target === "web"; +}; diff --git a/test/hotCases/css/single-css-entry/webpack.config.js b/test/hotCases/css/single-css-entry/webpack.config.js new file mode 100644 index 00000000000..26f2eae1e82 --- /dev/null +++ b/test/hotCases/css/single-css-entry/webpack.config.js @@ -0,0 +1,29 @@ +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + devtool: false, + entry: ["./index.js", "./index.css"], + experiments: { + css: true + }, + plugins: [ + { + apply(compiler) { + compiler.hooks.compilation.tap("Test", compilation => { + compilation.hooks.additionalTreeRuntimeRequirements.tap( + "Test", + (module, set, context) => { + // To prevent the runtime error `ReferenceError: __webpack_exports__ is not defined`, + // which occurs because the default `output.library` setting is `commonjs2`, + // resulting in adding `module.exports = __webpack_exports__;`. + set.add(webpack.RuntimeGlobals.startup); + set.add(webpack.RuntimeGlobals.exports); + } + ); + }); + } + } + ] +}; diff --git a/test/hotCases/css/vanilla/index.js b/test/hotCases/css/vanilla/index.js new file mode 100644 index 00000000000..4e070f4fb4f --- /dev/null +++ b/test/hotCases/css/vanilla/index.js @@ -0,0 +1,38 @@ +import "./style.css"; + +const getFile = name => + __non_webpack_require__("fs").readFileSync( + __non_webpack_require__("path").join(__dirname, name), + "utf-8" + ); + +it("should work", async function (done) { + try { + const style = getFile("bundle.css"); + expect(style).toContain("color: red;"); + } catch (e) {} + + + await import("./style2.css"); + + try { + const style2 = getFile("style2_css.css"); + expect(style2).toContain("color: red;"); + } catch (e) {} + + NEXT(require("../../update")(done, true, () => { + try { + const style = getFile("bundle.css"); + expect(style).toContain("color: blue;"); + } catch (e) {} + + try { + const style2 = getFile("style2_css.css"); + expect(style2).toContain("color: blue;"); + } catch (e) {} + + done(); + })); +}); + +module.hot.accept(); diff --git a/test/hotCases/css/vanilla/style.css b/test/hotCases/css/vanilla/style.css new file mode 100644 index 00000000000..98c6b2bb5d0 --- /dev/null +++ b/test/hotCases/css/vanilla/style.css @@ -0,0 +1,7 @@ +.class { + color: red; +} +--- +.class-other { + color: blue; +} diff --git a/test/hotCases/css/vanilla/style2.css b/test/hotCases/css/vanilla/style2.css new file mode 100644 index 00000000000..681b83a2612 --- /dev/null +++ b/test/hotCases/css/vanilla/style2.css @@ -0,0 +1,7 @@ +.foo { + color: red; +} +--- +.bar { + color: blue; +} diff --git a/test/hotCases/css/vanilla/test.config.js b/test/hotCases/css/vanilla/test.config.js new file mode 100644 index 00000000000..429d7576747 --- /dev/null +++ b/test/hotCases/css/vanilla/test.config.js @@ -0,0 +1,8 @@ +module.exports = { + moduleScope(scope) { + const link = scope.window.document.createElement("link"); + link.rel = "stylesheet"; + link.href = "https://test.cases/path/bundle.css"; + scope.window.document.head.appendChild(link); + } +}; diff --git a/test/hotCases/css/vanilla/webpack.config.js b/test/hotCases/css/vanilla/webpack.config.js new file mode 100644 index 00000000000..1629277c043 --- /dev/null +++ b/test/hotCases/css/vanilla/webpack.config.js @@ -0,0 +1,14 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + devtool: false, + output: { + cssChunkFilename: "[name].css" + }, + node: { + __dirname: false + }, + experiments: { + css: true + } +}; diff --git a/test/hotCases/css/with-lazy-compilation/index.js b/test/hotCases/css/with-lazy-compilation/index.js new file mode 100644 index 00000000000..58d336fd598 --- /dev/null +++ b/test/hotCases/css/with-lazy-compilation/index.js @@ -0,0 +1,39 @@ +const getFile = name => + __non_webpack_require__("fs").readFileSync( + __non_webpack_require__("path").join(__dirname, name), + "utf-8" + ); + +it("should work", async function (done) { + let promise = import("./style.css"); + + NEXT( + require("../../update")(done, true, () => { + promise.then(res => { + const links = window.document.getElementsByTagName("link"); + let href = links[0].href; + expect(href).toBe("https://test.cases/path/style_css.css"); + href = href + .replace(/^https:\/\/test\.cases\/path\//, "") + .replace(/^https:\/\/example\.com\//, ""); + let sheet = getFile(href); + expect(sheet).toContain("color: red;"); + + module.hot.accept("./style.css", () => { + const links = window.document.getElementsByTagName("link"); + let href = links[0].href; + expect(href).toContain("https://test.cases/path/style_css.css?hmr"); + href = href + .replace(/^https:\/\/test\.cases\/path\//, "") + .replace(/^https:\/\/example\.com\//, "") + .split("?")[0]; + let sheet = getFile(href); + expect(sheet).toContain("color: blue;"); + done(); + }); + + NEXT(require("../../update")(done)); + }); + }) + ); +}); diff --git a/test/hotCases/css/with-lazy-compilation/style.css b/test/hotCases/css/with-lazy-compilation/style.css new file mode 100644 index 00000000000..22c54999940 --- /dev/null +++ b/test/hotCases/css/with-lazy-compilation/style.css @@ -0,0 +1,11 @@ +html { + color: red; +} +--- +html { + color: red; +} +--- +html { + color: blue; +} diff --git a/test/hotCases/css/with-lazy-compilation/test.filter.js b/test/hotCases/css/with-lazy-compilation/test.filter.js new file mode 100644 index 00000000000..2be506ab037 --- /dev/null +++ b/test/hotCases/css/with-lazy-compilation/test.filter.js @@ -0,0 +1,3 @@ +module.exports = function (config) { + return config.target === "web"; +}; diff --git a/test/hotCases/css/with-lazy-compilation/webpack.config.js b/test/hotCases/css/with-lazy-compilation/webpack.config.js new file mode 100644 index 00000000000..01b5b906611 --- /dev/null +++ b/test/hotCases/css/with-lazy-compilation/webpack.config.js @@ -0,0 +1,19 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + devtool: false, + output: { + cssFilename: "[name].css", + cssChunkFilename: "[name].css" + }, + experiments: { + css: true, + lazyCompilation: { + entries: false, + imports: true + } + }, + node: { + __dirname: false + } +}; diff --git a/test/hotCases/define/issue-6962/a.js b/test/hotCases/define/issue-6962/a.js index 4fd27070716..4c6534584ec 100644 --- a/test/hotCases/define/issue-6962/a.js +++ b/test/hotCases/define/issue-6962/a.js @@ -1,3 +1,12 @@ export default 1; + +module.hot.dispose(data => { + data.crash = true; +}) +module.hot.accept(() => { + expect(DEFINE_PATH).toBe("./a"); + module.hot.invalidate(); +}); --- +if (module.hot.data && module.hot.data.crash) throw new Error(); export default 2; diff --git a/test/hotCases/define/issue-6962/module.js b/test/hotCases/define/issue-6962/module.js index 542fc4de460..0d825ce5f7a 100644 --- a/test/hotCases/define/issue-6962/module.js +++ b/test/hotCases/define/issue-6962/module.js @@ -1,19 +1,22 @@ import value1 from "./a"; -it("should have the expected static path defined", function() { - expect(DEFINE_PATH).toBe('./a'); +it("should have the expected static path defined", function () { + expect(DEFINE_PATH).toBe("./a"); }); -it("should hot.accept the module located at the static file path without breaking the compiler", function() { +it("should hot.accept the module located at the static file path without breaking the compiler", function () { module.hot.accept("./a"); expect(value1).toBe(1); }); -it("should hot.accept the module located at the defined file path without breaking the compiler, when one argument is passed to hot.accept", function() { +it("should hot.accept the module located at the defined file path without breaking the compiler, when one argument is passed to hot.accept", function () { module.hot.accept(DEFINE_PATH); }); -it("should hot.accept the module located at the defined file path without breaking the compiler, when multiple arguments are passed to hot.accept", function(done) { - module.hot.accept(DEFINE_PATH, () => done()); +it("should hot.accept the module located at the defined file path without breaking the compiler, when multiple arguments are passed to hot.accept", function (done) { + module.hot.accept(DEFINE_PATH, () => { + expect(DEFINE_PATH).toBe("./a"); + done(); + }); NEXT(require("../../update")(done)); }); diff --git a/test/hotCases/define/issue-6962/webpack.config.js b/test/hotCases/define/issue-6962/webpack.config.js index 3d212ee5e1c..933fa42c915 100644 --- a/test/hotCases/define/issue-6962/webpack.config.js +++ b/test/hotCases/define/issue-6962/webpack.config.js @@ -2,6 +2,7 @@ const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { plugins: [ new webpack.DefinePlugin({ diff --git a/test/hotCases/determinism/issue-10174/deps/a.js b/test/hotCases/determinism/issue-10174/deps/a.js new file mode 100644 index 00000000000..35dccc1ad44 --- /dev/null +++ b/test/hotCases/determinism/issue-10174/deps/a.js @@ -0,0 +1 @@ +export * from './b' diff --git a/test/hotCases/determinism/issue-10174/deps/b.js b/test/hotCases/determinism/issue-10174/deps/b.js new file mode 100644 index 00000000000..064f1ffa07e --- /dev/null +++ b/test/hotCases/determinism/issue-10174/deps/b.js @@ -0,0 +1,5 @@ +export * from './c' + +export function b() { + // this extra export is needed for the issue to reproduce +} diff --git a/test/hotCases/determinism/issue-10174/deps/c.js b/test/hotCases/determinism/issue-10174/deps/c.js new file mode 100644 index 00000000000..585b8413425 --- /dev/null +++ b/test/hotCases/determinism/issue-10174/deps/c.js @@ -0,0 +1,3 @@ +export function c() { + return 42; +} diff --git a/test/hotCases/determinism/issue-10174/hot.js b/test/hotCases/determinism/issue-10174/hot.js new file mode 100644 index 00000000000..4fd27070716 --- /dev/null +++ b/test/hotCases/determinism/issue-10174/hot.js @@ -0,0 +1,3 @@ +export default 1; +--- +export default 2; diff --git a/test/hotCases/determinism/issue-10174/index.js b/test/hotCases/determinism/issue-10174/index.js new file mode 100644 index 00000000000..71a1e60a4c2 --- /dev/null +++ b/test/hotCases/determinism/issue-10174/index.js @@ -0,0 +1,14 @@ +import { c } from "./deps/a"; +import hot from "./hot"; + +it("should only register changes for the changed module", done => { + expect(hot).toBe(1); + expect(c()).toBe(42); + module.hot.accept("./hot", () => { + expect(hot).toBe(2); + expect(c()).toBe(42); + done(); + }); + + NEXT(require("../../update")(done)); +}); diff --git a/test/hotCases/disposing/remove-chunk-with-shared-in-other-runtime/chunk1.js b/test/hotCases/disposing/remove-chunk-with-shared-in-other-runtime/chunk1.js new file mode 100644 index 00000000000..1b3aa494da5 --- /dev/null +++ b/test/hotCases/disposing/remove-chunk-with-shared-in-other-runtime/chunk1.js @@ -0,0 +1,2 @@ +export * from "./shared"; +import.meta.webpackHot.accept("./shared"); diff --git a/test/hotCases/disposing/remove-chunk-with-shared-in-other-runtime/chunk2.js b/test/hotCases/disposing/remove-chunk-with-shared-in-other-runtime/chunk2.js new file mode 100644 index 00000000000..1b3aa494da5 --- /dev/null +++ b/test/hotCases/disposing/remove-chunk-with-shared-in-other-runtime/chunk2.js @@ -0,0 +1,2 @@ +export * from "./shared"; +import.meta.webpackHot.accept("./shared"); diff --git a/test/hotCases/disposing/remove-chunk-with-shared-in-other-runtime/index.js b/test/hotCases/disposing/remove-chunk-with-shared-in-other-runtime/index.js new file mode 100644 index 00000000000..e47f781b883 --- /dev/null +++ b/test/hotCases/disposing/remove-chunk-with-shared-in-other-runtime/index.js @@ -0,0 +1,14 @@ +import module from "./module"; + +it("should not dispose shared modules when a chunk from a different runtime is removed", done => { + import("./chunk1").then(chunk1 => { + import.meta.webpackHot.accept("./module", async () => { + expect(module).toBe(42); + expect(chunk1).toMatchObject({ + active: true + }); + done(); + }); + NEXT(require("../../update")(done)); + }, done); +}); diff --git a/test/hotCases/disposing/remove-chunk-with-shared-in-other-runtime/module.js b/test/hotCases/disposing/remove-chunk-with-shared-in-other-runtime/module.js new file mode 100644 index 00000000000..4c6a7f35a5b --- /dev/null +++ b/test/hotCases/disposing/remove-chunk-with-shared-in-other-runtime/module.js @@ -0,0 +1,3 @@ +export default () => new Worker(new URL("./chunk2", import.meta.url)); +--- +export default 42; diff --git a/test/hotCases/disposing/remove-chunk-with-shared-in-other-runtime/shared.js b/test/hotCases/disposing/remove-chunk-with-shared-in-other-runtime/shared.js new file mode 100644 index 00000000000..28eccb6c1d3 --- /dev/null +++ b/test/hotCases/disposing/remove-chunk-with-shared-in-other-runtime/shared.js @@ -0,0 +1,5 @@ +export let active = true; + +import.meta.webpackHot.dispose(() => { + active = false; +}); diff --git a/test/hotCases/disposing/remove-chunk-with-shared/chunk1.js b/test/hotCases/disposing/remove-chunk-with-shared/chunk1.js new file mode 100644 index 00000000000..1b3aa494da5 --- /dev/null +++ b/test/hotCases/disposing/remove-chunk-with-shared/chunk1.js @@ -0,0 +1,2 @@ +export * from "./shared"; +import.meta.webpackHot.accept("./shared"); diff --git a/test/hotCases/disposing/remove-chunk-with-shared/chunk2.js b/test/hotCases/disposing/remove-chunk-with-shared/chunk2.js new file mode 100644 index 00000000000..1b3aa494da5 --- /dev/null +++ b/test/hotCases/disposing/remove-chunk-with-shared/chunk2.js @@ -0,0 +1,2 @@ +export * from "./shared"; +import.meta.webpackHot.accept("./shared"); diff --git a/test/hotCases/disposing/remove-chunk-with-shared/index.js b/test/hotCases/disposing/remove-chunk-with-shared/index.js new file mode 100644 index 00000000000..7c8a73e0070 --- /dev/null +++ b/test/hotCases/disposing/remove-chunk-with-shared/index.js @@ -0,0 +1,14 @@ +import module from "./module"; + +it("should not dispose shared modules when a chunk is removed", done => { + import("./chunk1").then(chunk1 => { + import.meta.webpackHot.accept("./module", async () => { + expect(module).toBe(42); + expect(chunk1).toMatchObject({ + active: true + }); + done(); + }); + NEXT(require("../../update")(done)); + }, done); +}); diff --git a/test/hotCases/disposing/remove-chunk-with-shared/module.js b/test/hotCases/disposing/remove-chunk-with-shared/module.js new file mode 100644 index 00000000000..391a1a12e1d --- /dev/null +++ b/test/hotCases/disposing/remove-chunk-with-shared/module.js @@ -0,0 +1,3 @@ +export default import("./chunk2"); +--- +export default 42; diff --git a/test/hotCases/disposing/remove-chunk-with-shared/shared.js b/test/hotCases/disposing/remove-chunk-with-shared/shared.js new file mode 100644 index 00000000000..28eccb6c1d3 --- /dev/null +++ b/test/hotCases/disposing/remove-chunk-with-shared/shared.js @@ -0,0 +1,5 @@ +export let active = true; + +import.meta.webpackHot.dispose(() => { + active = false; +}); diff --git a/test/hotCases/disposing/runtime-independent-filename/chunk1.js b/test/hotCases/disposing/runtime-independent-filename/chunk1.js new file mode 100644 index 00000000000..1b3aa494da5 --- /dev/null +++ b/test/hotCases/disposing/runtime-independent-filename/chunk1.js @@ -0,0 +1,2 @@ +export * from "./shared"; +import.meta.webpackHot.accept("./shared"); diff --git a/test/hotCases/disposing/runtime-independent-filename/chunk2.js b/test/hotCases/disposing/runtime-independent-filename/chunk2.js new file mode 100644 index 00000000000..1b3aa494da5 --- /dev/null +++ b/test/hotCases/disposing/runtime-independent-filename/chunk2.js @@ -0,0 +1,2 @@ +export * from "./shared"; +import.meta.webpackHot.accept("./shared"); diff --git a/test/hotCases/disposing/runtime-independent-filename/index.js b/test/hotCases/disposing/runtime-independent-filename/index.js new file mode 100644 index 00000000000..46b4e9386ac --- /dev/null +++ b/test/hotCases/disposing/runtime-independent-filename/index.js @@ -0,0 +1,14 @@ +import module from "./module"; + +it("should not dispose shared modules when a chunk from a different runtime is removed", done => { + import("./chunk1").then(chunk1 => { + import.meta.webpackHot.accept("./module", async () => { + expect(module).toBe(42); + expect(chunk1).toMatchObject({ + active: false // This get incorrectly disposed, due to the runtime-independent filename + }); + done(); + }); + NEXT(require("../../update")(done)); + }, done); +}); diff --git a/test/hotCases/disposing/runtime-independent-filename/module.js b/test/hotCases/disposing/runtime-independent-filename/module.js new file mode 100644 index 00000000000..4c6a7f35a5b --- /dev/null +++ b/test/hotCases/disposing/runtime-independent-filename/module.js @@ -0,0 +1,3 @@ +export default () => new Worker(new URL("./chunk2", import.meta.url)); +--- +export default 42; diff --git a/test/hotCases/disposing/runtime-independent-filename/shared.js b/test/hotCases/disposing/runtime-independent-filename/shared.js new file mode 100644 index 00000000000..28eccb6c1d3 --- /dev/null +++ b/test/hotCases/disposing/runtime-independent-filename/shared.js @@ -0,0 +1,5 @@ +export let active = true; + +import.meta.webpackHot.dispose(() => { + active = false; +}); diff --git a/test/hotCases/disposing/runtime-independent-filename/warnings1.js b/test/hotCases/disposing/runtime-independent-filename/warnings1.js new file mode 100644 index 00000000000..8eadd0b7dce --- /dev/null +++ b/test/hotCases/disposing/runtime-independent-filename/warnings1.js @@ -0,0 +1,5 @@ +module.exports = [ + [ + /The configured output\.hotUpdateMainFilename doesn't lead to unique filenames per runtime/ + ] +]; diff --git a/test/hotCases/disposing/runtime-independent-filename/webpack.config.js b/test/hotCases/disposing/runtime-independent-filename/webpack.config.js new file mode 100644 index 00000000000..270d65696c7 --- /dev/null +++ b/test/hotCases/disposing/runtime-independent-filename/webpack.config.js @@ -0,0 +1,6 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + output: { + hotUpdateMainFilename: "[hash].main-filename.json" + } +}; diff --git a/test/hotCases/errors/decline-webpackhot/a.js b/test/hotCases/errors/decline-webpackhot/a.js new file mode 100644 index 00000000000..329853db7d0 --- /dev/null +++ b/test/hotCases/errors/decline-webpackhot/a.js @@ -0,0 +1,8 @@ +import b from "./b"; + +export default b; + +if(import.meta.webpackHot) { + import.meta.webpackHot.decline("./b"); + import.meta.webpackHot.accept(); +} diff --git a/test/hotCases/errors/decline-webpackhot/b.js b/test/hotCases/errors/decline-webpackhot/b.js new file mode 100644 index 00000000000..cb7873fad36 --- /dev/null +++ b/test/hotCases/errors/decline-webpackhot/b.js @@ -0,0 +1 @@ +export { default } from "./c" diff --git a/test/hotCases/errors/decline-webpackhot/c.js b/test/hotCases/errors/decline-webpackhot/c.js new file mode 100644 index 00000000000..4fd27070716 --- /dev/null +++ b/test/hotCases/errors/decline-webpackhot/c.js @@ -0,0 +1,3 @@ +export default 1; +--- +export default 2; diff --git a/test/hotCases/errors/decline-webpackhot/index.js b/test/hotCases/errors/decline-webpackhot/index.js new file mode 100644 index 00000000000..01e094ed440 --- /dev/null +++ b/test/hotCases/errors/decline-webpackhot/index.js @@ -0,0 +1,14 @@ +import a from "./a"; + +it("should abort when module is declined by parent", (done) => { + expect(a).toBe(1); + NEXT(require("../../update")((err) => { + try { + expect(err.message).toMatch(/Aborted because of declined dependency: \.\/b\.js in \.\/a\.js/); + expect(err.message).toMatch(/Update propagation: \.\/c\.js -> \.\/b\.js -> \.\/a\.js/); + done(); + } catch(e) { + done(e); + } + })); +}); diff --git a/test/hotCases/errors/decline/index.js b/test/hotCases/errors/decline/index.js index e7b844a0a5d..01e094ed440 100644 --- a/test/hotCases/errors/decline/index.js +++ b/test/hotCases/errors/decline/index.js @@ -4,8 +4,8 @@ it("should abort when module is declined by parent", (done) => { expect(a).toBe(1); NEXT(require("../../update")((err) => { try { - expect(/Aborted because of declined dependency: \.\/b\.js in \.\/a\.js/.test(err.message)).toBe(true); - expect(/Update propagation: \.\/c\.js -> \.\/b\.js -> \.\/a\.js/.test(err.message)).toBe(true); + expect(err.message).toMatch(/Aborted because of declined dependency: \.\/b\.js in \.\/a\.js/); + expect(err.message).toMatch(/Update propagation: \.\/c\.js -> \.\/b\.js -> \.\/a\.js/); done(); } catch(e) { done(e); diff --git a/test/hotCases/errors/events/b.js b/test/hotCases/errors/events/b.js index ee9d11c36ee..f7d12ecece8 100644 --- a/test/hotCases/errors/events/b.js +++ b/test/hotCases/errors/events/b.js @@ -1,5 +1,6 @@ -import c from "./c" +import c from "./c"; +export default c; -if(module.hot) { +if (module.hot) { module.hot.accept("./c"); } diff --git a/test/hotCases/errors/events/d.js b/test/hotCases/errors/events/d.js index b230cc30084..f427371c1a4 100644 --- a/test/hotCases/errors/events/d.js +++ b/test/hotCases/errors/events/d.js @@ -1,5 +1,6 @@ import e from "./e"; +export default e; -if(module.hot) { +if (module.hot) { module.hot.decline(); } diff --git a/test/hotCases/errors/events/f.js b/test/hotCases/errors/events/f.js index 4561bb2214c..ba9528baf31 100644 --- a/test/hotCases/errors/events/f.js +++ b/test/hotCases/errors/events/f.js @@ -1,5 +1,6 @@ import g from "./g"; +export default g; -if(module.hot) { +if (module.hot) { module.hot.decline("./g"); -} \ No newline at end of file +} diff --git a/test/hotCases/errors/events/h.js b/test/hotCases/errors/events/h.js index 8552b4f64c4..d1742025e29 100644 --- a/test/hotCases/errors/events/h.js +++ b/test/hotCases/errors/events/h.js @@ -1,5 +1,6 @@ import i from "./i"; +export default i; -if(module.hot) { +if (module.hot) { module.hot.accept("./i"); } diff --git a/test/hotCases/errors/events/i.js b/test/hotCases/errors/events/i.js index c8c747f4391..1bdc753c4eb 100644 --- a/test/hotCases/errors/events/i.js +++ b/test/hotCases/errors/events/i.js @@ -1,4 +1,4 @@ export default 1; --- export default 2; -throw new Error("Error while loading module h"); +throw new Error("Error while loading module i"); diff --git a/test/hotCases/errors/events/index.js b/test/hotCases/errors/events/index.js index d28545594ed..01009fbd634 100644 --- a/test/hotCases/errors/events/index.js +++ b/test/hotCases/errors/events/index.js @@ -4,76 +4,122 @@ import d from "./d"; import f from "./f"; import h from "./h"; import j from "./j"; +import k from "./k"; +import l from "./l"; -it("should fire the correct events", (done) => { +it("should import modules correctly", () => { + expect(a).toBe(1); + expect(b).toBe(1); + expect(d).toBe(1); + expect(f).toBe(1); + expect(h).toBe(1); + expect(j).toBe(1); + expect(k).toBe(1); + expect(l).toBe(1); +}); + +it("should fire the correct events", done => { var events = []; var options = { ignoreUnaccepted: true, ignoreDeclined: true, ignoreErrored: true, - onDeclined(data) { events.push(data); }, - onUnaccepted(data) { events.push(data); }, - onAccepted(data) { events.push(data); }, - onErrored(data) { events.push(data); } + onDeclined(data) { + events.push(data); + }, + onUnaccepted(data) { + events.push(data); + }, + onAccepted(data) { + events.push(data); + }, + onErrored(data) { + events.push(data); + } }; function waitForUpdate(fn) { - NEXT(require("../../update")(done, options, () => { - try { - fn(); - } catch(e) { - done(e); - } - })); + NEXT( + require("../../update")(done, options, () => { + try { + fn(); + } catch (e) { + done(e); + } + }) + ); } waitForUpdate(() => { + const error = msg => + expect.objectContaining({ + message: msg + }); expect(events).toEqual([ { type: "unaccepted", moduleId: "./index.js", - chain: [ "./a.js", "./index.js" ], + chain: ["./a.js", "./index.js"] }, { type: "accepted", moduleId: "./c.js", - outdatedDependencies: { "./b.js": [ "./c.js" ] }, - outdatedModules: [ "./c.js" ], + outdatedDependencies: { "./b.js": ["./c.js"] }, + outdatedModules: ["./c.js"] }, { type: "self-declined", moduleId: "./d.js", - chain: [ "./e.js", "./d.js" ], + chain: ["./e.js", "./d.js"] }, { type: "declined", moduleId: "./g.js", parentId: "./f.js", - chain: [ "./g.js", "./f.js" ], + chain: ["./g.js", "./f.js"] }, { type: "accepted", moduleId: "./i.js", - outdatedDependencies: { "./h.js": [ "./i.js" ] }, - outdatedModules: [ "./i.js" ], + outdatedDependencies: { "./h.js": ["./i.js"], "./k.js": ["./i.js"] }, + outdatedModules: ["./i.js"] }, { type: "accepted", moduleId: "./j.js", outdatedDependencies: {}, - outdatedModules: [ "./j.js" ], + outdatedModules: ["./j.js"] + }, + { + type: "accepted", + moduleId: "./l.js", + outdatedDependencies: {}, + outdatedModules: ["./l.js"] }, { type: "accept-errored", moduleId: "./h.js", dependencyId: "./i.js", - error: new Error("Error while loading module h") + error: error("Error while loading module i") + }, + { + type: "accept-error-handler-errored", + moduleId: "./k.js", + dependencyId: "./i.js", + error: error("Error in accept error handler: ./k.js -> ./i.js"), + originalError: error("Error while loading module i") }, { type: "self-accept-errored", moduleId: "./j.js", - error: new Error("Error while loading module j") + error: error("Error while loading module j") }, + { + type: "self-accept-error-handler-errored", + moduleId: "./l.js", + error: error("Error in accept error handler: ./l.js"), + originalError: error("Error while loading module l") + } ]); done(); }); diff --git a/test/hotCases/errors/events/k.js b/test/hotCases/errors/events/k.js new file mode 100644 index 00000000000..111ee1357ac --- /dev/null +++ b/test/hotCases/errors/events/k.js @@ -0,0 +1,14 @@ +import i from "./i"; +export default i; + +if (module.hot) { + module.hot.accept( + "./i", + () => {}, + (err, { moduleId, dependencyId }) => { + throw new Error( + `Error in accept error handler: ${moduleId} -> ${dependencyId}` + ); + } + ); +} diff --git a/test/hotCases/errors/events/l.js b/test/hotCases/errors/events/l.js new file mode 100644 index 00000000000..9d55205734a --- /dev/null +++ b/test/hotCases/errors/events/l.js @@ -0,0 +1,7 @@ +export default 1; +module.hot.accept((err, { moduleId }) => { + throw new Error(`Error in accept error handler: ${moduleId}`) +}); +--- +export default 2; +throw new Error("Error while loading module l"); diff --git a/test/hotCases/errors/self-decline/index.js b/test/hotCases/errors/self-decline/index.js index b5814ee0867..ff7f3774982 100644 --- a/test/hotCases/errors/self-decline/index.js +++ b/test/hotCases/errors/self-decline/index.js @@ -4,8 +4,8 @@ it("should abort when module is declined by itself", (done) => { expect(a).toBe(1); NEXT(require("../../update")((err) => { try { - expect(/Aborted because of self decline: \.\/a\.js/.test(err.message)).toBe(true); - expect(/Update propagation: \.\/c\.js -> \.\/b\.js -> \.\/a\.js/.test(err.message)).toBe(true); + expect(err.message).toMatch(/Aborted because of self decline: \.\/a\.js/); + expect(err.message).toMatch(/Update propagation: \.\/c\.js -> \.\/b\.js -> \.\/a\.js/); done(); } catch(e) { done(e); diff --git a/test/hotCases/errors/unaccepted/index.js b/test/hotCases/errors/unaccepted/index.js index 5409a58f740..864a5538040 100644 --- a/test/hotCases/errors/unaccepted/index.js +++ b/test/hotCases/errors/unaccepted/index.js @@ -6,8 +6,8 @@ it("should abort when module is not accepted", (done) => { expect(b).toBe(1); NEXT(require("../../update")((err) => { try { - expect(/Aborted because \.\/c\.js is not accepted/.test(err.message)).toBe(true); - expect(/Update propagation: \.\/c\.js -> \.\/b\.js -> \.\/index\.js/.test(err.message)).toBe(true); + expect(err.message).toMatch(/Aborted because \.\/c\.js is not accepted/); + expect(err.message).toMatch(/Update propagation: \.\/c\.js -> \.\/b\.js -> \.\/index\.js/); done(); } catch(e) { done(e); } })); diff --git a/test/hotCases/esm-dependency-import/import-meta-webpack-hot/index.js b/test/hotCases/esm-dependency-import/import-meta-webpack-hot/index.js new file mode 100644 index 00000000000..7d0f634e096 --- /dev/null +++ b/test/hotCases/esm-dependency-import/import-meta-webpack-hot/index.js @@ -0,0 +1,7 @@ +import {val} from "./module"; + +it("should accept changes", (done) => { + expect(val).toBe(1); + NEXT(require("../../update")(done)); + done(); +}); diff --git a/test/hotCases/esm-dependency-import/import-meta-webpack-hot/module.js b/test/hotCases/esm-dependency-import/import-meta-webpack-hot/module.js new file mode 100644 index 00000000000..4989d996f1a --- /dev/null +++ b/test/hotCases/esm-dependency-import/import-meta-webpack-hot/module.js @@ -0,0 +1,5 @@ +import {value} from "dep1"; + +export const val = value; + +import.meta.webpackHot.accept("dep1"); diff --git a/test/hotCases/esm-dependency-import/import-meta-webpack-hot/node_modules/dep1/exports.js b/test/hotCases/esm-dependency-import/import-meta-webpack-hot/node_modules/dep1/exports.js new file mode 100644 index 00000000000..5309d4e57ca --- /dev/null +++ b/test/hotCases/esm-dependency-import/import-meta-webpack-hot/node_modules/dep1/exports.js @@ -0,0 +1 @@ +export {value} from "./file"; diff --git a/test/hotCases/esm-dependency-import/import-meta-webpack-hot/node_modules/dep1/file.js b/test/hotCases/esm-dependency-import/import-meta-webpack-hot/node_modules/dep1/file.js new file mode 100644 index 00000000000..5b2c52ba4bd --- /dev/null +++ b/test/hotCases/esm-dependency-import/import-meta-webpack-hot/node_modules/dep1/file.js @@ -0,0 +1,3 @@ +export var value = 1; +--- +export var value = 2; diff --git a/test/hotCases/esm-dependency-import/import-meta-webpack-hot/node_modules/dep1/main.js b/test/hotCases/esm-dependency-import/import-meta-webpack-hot/node_modules/dep1/main.js new file mode 100644 index 00000000000..d4321ac5bf5 --- /dev/null +++ b/test/hotCases/esm-dependency-import/import-meta-webpack-hot/node_modules/dep1/main.js @@ -0,0 +1,5 @@ +(() => { + throw new Error("should not resolve"); +})(); + +export default 1; diff --git a/test/hotCases/esm-dependency-import/import-meta-webpack-hot/node_modules/dep1/package.json b/test/hotCases/esm-dependency-import/import-meta-webpack-hot/node_modules/dep1/package.json new file mode 100644 index 00000000000..0f01e7fa4f2 --- /dev/null +++ b/test/hotCases/esm-dependency-import/import-meta-webpack-hot/node_modules/dep1/package.json @@ -0,0 +1,6 @@ +{ + "exports": { + "import": "./exports.js", + "default": "./main.js" + } +} diff --git a/test/hotCases/esm-dependency-import/module-hot/index.js b/test/hotCases/esm-dependency-import/module-hot/index.js new file mode 100644 index 00000000000..472d82759b8 --- /dev/null +++ b/test/hotCases/esm-dependency-import/module-hot/index.js @@ -0,0 +1,14 @@ +import {val} from "./module"; + +it("should fail accept changes", (done) => { + expect(val).toBe(1); + NEXT(require("../../update")((err) => { + try { + expect(err.message).toMatch(/Aborted because \.\/node_modules\/dep1\/file.js is not accepted/); + expect(err.message).toMatch(/Update propagation: \.\/node_modules\/dep1\/file.js -> \.\/node_modules\/dep1\/exports\.js -> \.\/module\.js -> \.\/index.js/); + done(); + } catch(e) { + done(e); + } + })); +}); diff --git a/test/hotCases/esm-dependency-import/module-hot/module.js b/test/hotCases/esm-dependency-import/module-hot/module.js new file mode 100644 index 00000000000..b3e599b87f3 --- /dev/null +++ b/test/hotCases/esm-dependency-import/module-hot/module.js @@ -0,0 +1,5 @@ +import {value} from "dep1"; + +export const val = value; + +module.hot.accept("dep1"); diff --git a/test/hotCases/esm-dependency-import/module-hot/node_modules/dep1/exports.js b/test/hotCases/esm-dependency-import/module-hot/node_modules/dep1/exports.js new file mode 100644 index 00000000000..5309d4e57ca --- /dev/null +++ b/test/hotCases/esm-dependency-import/module-hot/node_modules/dep1/exports.js @@ -0,0 +1 @@ +export {value} from "./file"; diff --git a/test/hotCases/esm-dependency-import/module-hot/node_modules/dep1/file.js b/test/hotCases/esm-dependency-import/module-hot/node_modules/dep1/file.js new file mode 100644 index 00000000000..5b2c52ba4bd --- /dev/null +++ b/test/hotCases/esm-dependency-import/module-hot/node_modules/dep1/file.js @@ -0,0 +1,3 @@ +export var value = 1; +--- +export var value = 2; diff --git a/test/hotCases/esm-dependency-import/module-hot/node_modules/dep1/main.js b/test/hotCases/esm-dependency-import/module-hot/node_modules/dep1/main.js new file mode 100644 index 00000000000..d4321ac5bf5 --- /dev/null +++ b/test/hotCases/esm-dependency-import/module-hot/node_modules/dep1/main.js @@ -0,0 +1,5 @@ +(() => { + throw new Error("should not resolve"); +})(); + +export default 1; diff --git a/test/hotCases/esm-dependency-import/module-hot/node_modules/dep1/package.json b/test/hotCases/esm-dependency-import/module-hot/node_modules/dep1/package.json new file mode 100644 index 00000000000..0f01e7fa4f2 --- /dev/null +++ b/test/hotCases/esm-dependency-import/module-hot/node_modules/dep1/package.json @@ -0,0 +1,6 @@ +{ + "exports": { + "import": "./exports.js", + "default": "./main.js" + } +} diff --git a/test/hotCases/fake-update-loader.js b/test/hotCases/fake-update-loader.js index e2b1884bd74..705d8feedad 100644 --- a/test/hotCases/fake-update-loader.js +++ b/test/hotCases/fake-update-loader.js @@ -1,4 +1,5 @@ -module.exports = function(source) { +/** @type {import("../../").LoaderDefinition<{}, { updateIndex: number }>} */ +module.exports = function (source) { var idx = this.updateIndex; var items = source.split(/---+\r?\n/g); if (items.length > 1) { diff --git a/test/hotCases/harmony/auto-import-default/index.js b/test/hotCases/harmony/auto-import-default/index.js index 976b95a7fbc..85bfe269ea5 100644 --- a/test/hotCases/harmony/auto-import-default/index.js +++ b/test/hotCases/harmony/auto-import-default/index.js @@ -1,6 +1,6 @@ import value from "./file"; -it("should auto-import a ES6 imported default value from non-harmony module on accept", (done) => { +it("should auto-import an ES6 imported default value from non-harmony module on accept", (done) => { expect(value).toBe(1); module.hot.accept("./file", () => { expect(value).toBe(2); diff --git a/test/hotCases/harmony/auto-import/index.js b/test/hotCases/harmony/auto-import/index.js index cd36482c2d1..ef6ff5ab2c9 100644 --- a/test/hotCases/harmony/auto-import/index.js +++ b/test/hotCases/harmony/auto-import/index.js @@ -1,6 +1,6 @@ import { value } from "./file"; -it("should auto-import a ES6 imported value on accept", function(done) { +it("should auto-import an ES6 imported value on accept", function(done) { expect(value).toBe(1); module.hot.accept("./file", function() { expect(value).toBe(2); diff --git a/test/hotCases/harmony/auto-reexport/file.js b/test/hotCases/harmony/auto-reexport/file.js new file mode 100644 index 00000000000..baf9d1eb5fc --- /dev/null +++ b/test/hotCases/harmony/auto-reexport/file.js @@ -0,0 +1,3 @@ +export const value = 1; +--- +export const value = 2; diff --git a/test/hotCases/harmony/auto-reexport/index.js b/test/hotCases/harmony/auto-reexport/index.js new file mode 100644 index 00000000000..ec813b54059 --- /dev/null +++ b/test/hotCases/harmony/auto-reexport/index.js @@ -0,0 +1,11 @@ +import { value } from "./reexport"; + +it("should auto-reexport an ES6 imported value on accept", function (done) { + expect(value).toBe(1); + NEXT( + require("../../update")(done, true, () => { + expect(value).toBe(2); + done(); + }) + ); +}); diff --git a/test/hotCases/harmony/auto-reexport/reexport.js b/test/hotCases/harmony/auto-reexport/reexport.js new file mode 100644 index 00000000000..f39d973d04f --- /dev/null +++ b/test/hotCases/harmony/auto-reexport/reexport.js @@ -0,0 +1,2 @@ +export { value } from "./file"; +module.hot.accept("./file"); diff --git a/test/hotCases/hashing/exports-info-influence/index.js b/test/hotCases/hashing/exports-info-influence/index.js new file mode 100644 index 00000000000..9cb6dc97323 --- /dev/null +++ b/test/hotCases/hashing/exports-info-influence/index.js @@ -0,0 +1,14 @@ +const moduleValue = require("./module"); +const external = require("external"); +import referencer from "./referencer"; + +it("should keep the module hash when usage changes", done => { + expect(moduleValue).toBe("module"); + expect(external).toBe("external"); + expect(referencer).toBe(42); + module.hot.accept("./referencer", () => { + expect(referencer).toBe("undefined undefined"); + done(); + }); + NEXT(require("../../update")(done)); +}); diff --git a/test/hotCases/hashing/exports-info-influence/module.js b/test/hotCases/hashing/exports-info-influence/module.js new file mode 100644 index 00000000000..d6df8480e22 --- /dev/null +++ b/test/hotCases/hashing/exports-info-influence/module.js @@ -0,0 +1 @@ +module.exports = "module"; diff --git a/test/hotCases/hashing/exports-info-influence/referencer.js b/test/hotCases/hashing/exports-info-influence/referencer.js new file mode 100644 index 00000000000..dde7e5c8259 --- /dev/null +++ b/test/hotCases/hashing/exports-info-influence/referencer.js @@ -0,0 +1,5 @@ +export default 42; +--- +import { test as value1 } from "./module"; +import { test as value2 } from "external"; +export default `${value1} ${value2}`; diff --git a/test/hotCases/hashing/exports-info-influence/webpack.config.js b/test/hotCases/hashing/exports-info-influence/webpack.config.js new file mode 100644 index 00000000000..02eaae9dc55 --- /dev/null +++ b/test/hotCases/hashing/exports-info-influence/webpack.config.js @@ -0,0 +1,5 @@ +module.exports = { + externals: { + external: "var 'external'" + } +}; diff --git a/test/hotCases/hashing/full-hash-main/index.js b/test/hotCases/hashing/full-hash-main/index.js new file mode 100644 index 00000000000..78ccb564770 --- /dev/null +++ b/test/hotCases/hashing/full-hash-main/index.js @@ -0,0 +1,22 @@ +import "./module"; + +const getFile = name => + __non_webpack_require__("fs").readFileSync( + __non_webpack_require__("path").join(__dirname, name), + "utf-8" + ); + +it("should generate the main file and change full hash on update", done => { + const hash1 = __webpack_hash__; + expect(getFile("bundle.js")).toContain(hash1); + module.hot.accept("./module", () => { + const hash2 = __webpack_hash__; + expect(hash1).toBeTypeOf("string"); + expect(hash2).toBeTypeOf("string"); + expect(hash2).not.toBe(hash1); + expect(getFile("bundle.js")).toContain(hash2); + expect(getFile("bundle.js")).not.toContain(hash1); + done(); + }); + NEXT(require("../../update")(done)); +}); diff --git a/test/hotCases/hashing/full-hash-main/module.js b/test/hotCases/hashing/full-hash-main/module.js new file mode 100644 index 00000000000..feb462eb331 --- /dev/null +++ b/test/hotCases/hashing/full-hash-main/module.js @@ -0,0 +1 @@ +import("./thing"); diff --git a/test/hotCases/hashing/full-hash-main/thing.js b/test/hotCases/hashing/full-hash-main/thing.js new file mode 100644 index 00000000000..4fd27070716 --- /dev/null +++ b/test/hotCases/hashing/full-hash-main/thing.js @@ -0,0 +1,3 @@ +export default 1; +--- +export default 2; diff --git a/test/hotCases/hashing/full-hash-main/webpack.config.js b/test/hotCases/hashing/full-hash-main/webpack.config.js new file mode 100644 index 00000000000..81b44793745 --- /dev/null +++ b/test/hotCases/hashing/full-hash-main/webpack.config.js @@ -0,0 +1,5 @@ +module.exports = { + node: { + __dirname: false + } +}; diff --git a/test/hotCases/hashing/full-hash-syntax-error/errors1.js b/test/hotCases/hashing/full-hash-syntax-error/errors1.js new file mode 100644 index 00000000000..86caa7354d2 --- /dev/null +++ b/test/hotCases/hashing/full-hash-syntax-error/errors1.js @@ -0,0 +1,3 @@ +module.exports = [ + [/Module parse failed/] +] \ No newline at end of file diff --git a/test/hotCases/hashing/full-hash-syntax-error/index.js b/test/hotCases/hashing/full-hash-syntax-error/index.js new file mode 100644 index 00000000000..db82c3d8936 --- /dev/null +++ b/test/hotCases/hashing/full-hash-syntax-error/index.js @@ -0,0 +1,29 @@ +import "./module"; + +const getFile = name => + __non_webpack_require__("fs").readFileSync( + __non_webpack_require__("path").join(__dirname, name), + "utf-8" + ); + +it("should generate the main file and change full hash on update", done => { + const hash1 = __webpack_hash__; + expect(getFile("bundle.js")).toContain(hash1); + import.meta.webpackHot.accept("./module", () => { + const hash2 = __webpack_hash__; + expect(hash1).toBeTypeOf("string"); + expect(hash2).toBeTypeOf("string"); + expect(hash2).not.toBe(hash1); + expect(getFile("bundle.js")).toContain(hash2); + expect(getFile("bundle.js")).not.toContain(hash1); + done(); + }); + NEXT(err => { + if (err) return done(err); + NEXT((err, stats) => { + if (err) return done(err); + expect(stats.hash).toBe(hash1); + NEXT(require("../../update")(done)); + }); + }); +}); diff --git a/test/hotCases/hashing/full-hash-syntax-error/module.js b/test/hotCases/hashing/full-hash-syntax-error/module.js new file mode 100644 index 00000000000..feb462eb331 --- /dev/null +++ b/test/hotCases/hashing/full-hash-syntax-error/module.js @@ -0,0 +1 @@ +import("./thing"); diff --git a/test/hotCases/hashing/full-hash-syntax-error/thing.js b/test/hotCases/hashing/full-hash-syntax-error/thing.js new file mode 100644 index 00000000000..97935e006fe --- /dev/null +++ b/test/hotCases/hashing/full-hash-syntax-error/thing.js @@ -0,0 +1,7 @@ +export default 1; +--- +export default <<<<<<; +--- +export default 1; +--- +export default 2; diff --git a/test/hotCases/hashing/full-hash-syntax-error/webpack.config.js b/test/hotCases/hashing/full-hash-syntax-error/webpack.config.js new file mode 100644 index 00000000000..43a1a24fd92 --- /dev/null +++ b/test/hotCases/hashing/full-hash-syntax-error/webpack.config.js @@ -0,0 +1,8 @@ +module.exports = { + node: { + __dirname: false + }, + optimization: { + emitOnErrors: false + } +}; diff --git a/test/hotCases/invalidate/conditional-accept/data.json b/test/hotCases/invalidate/conditional-accept/data.json new file mode 100644 index 00000000000..a99a38c6966 --- /dev/null +++ b/test/hotCases/invalidate/conditional-accept/data.json @@ -0,0 +1,7 @@ +{ "a": 1, "b": 1 } +--- +{ "a": 2, "b": 1 } +--- +{ "a": 2, "b": 2 } +--- +{ "a": 3, "b": 3 } diff --git a/test/hotCases/invalidate/conditional-accept/index.js b/test/hotCases/invalidate/conditional-accept/index.js new file mode 100644 index 00000000000..e7925928189 --- /dev/null +++ b/test/hotCases/invalidate/conditional-accept/index.js @@ -0,0 +1,48 @@ +import "./data.json"; +import mod1 from "./module1"; +import mod2 from "./module2"; +import { value1, value2 } from "./store"; + +it("should invalidate a self-accepted module", function(done) { + expect(mod1).toBe(1); + expect(mod2).toBe(1); + expect(value1).toBe(1); + expect(value2).toBe(1); + let step = 0; + module.hot.accept("./module1"); + module.hot.accept("./module2"); + module.hot.accept("./data.json", () => + setTimeout(() => { + switch (step) { + case 0: + step++; + expect(mod1).toBe(1); + expect(mod2).toBe(1); + expect(value1).toBe(2); + expect(value2).toBe(2); + NEXT(require("../../update")(done)); + break; + case 1: + step++; + expect(mod1).toBe(2); + expect(mod2).toBe(2); + expect(value1).toBe(2); + expect(value2).toBe(2); + NEXT(require("../../update")(done)); + break; + case 2: + step++; + expect(mod1).toBe(3); + expect(mod2).toBe(3); + expect(value1).toBe(3); + expect(value2).toBe(3); + done(); + break; + default: + done(new Error("should not happen")); + break; + } + }, 100) + ); + NEXT(require("../../update")(done)); +}); diff --git a/test/hotCases/invalidate/conditional-accept/module1.js b/test/hotCases/invalidate/conditional-accept/module1.js new file mode 100644 index 00000000000..e478012e71e --- /dev/null +++ b/test/hotCases/invalidate/conditional-accept/module1.js @@ -0,0 +1,16 @@ +import data from "./data.json"; +import { setValue1 } from "./store"; + +setValue1(data.a); + +export default data.b; + +if (module.hot.data && module.hot.data.ok && module.hot.data.b !== data.b) { + module.hot.invalidate(); +} else { + module.hot.dispose(d => { + d.ok = true; + d.b = data.b; + }); + module.hot.accept(); +} diff --git a/test/hotCases/invalidate/conditional-accept/module2.js b/test/hotCases/invalidate/conditional-accept/module2.js new file mode 100644 index 00000000000..0538d7e44c1 --- /dev/null +++ b/test/hotCases/invalidate/conditional-accept/module2.js @@ -0,0 +1,16 @@ +import data from "./data.json"; +import { setValue2 } from "./store"; + +setValue2(data.a); + +export default data.b; + +const b = data.b; + +module.hot.accept(["./data.json"], () => { + if (data.b !== b) { + module.hot.invalidate(); + return; + } + setValue2(data.a); +}); diff --git a/test/hotCases/invalidate/conditional-accept/store.js b/test/hotCases/invalidate/conditional-accept/store.js new file mode 100644 index 00000000000..bc8c9c68f6a --- /dev/null +++ b/test/hotCases/invalidate/conditional-accept/store.js @@ -0,0 +1,9 @@ +export let value1 = 0; +export function setValue1(v) { + value1 = v; +} + +export let value2 = 0; +export function setValue2(v) { + value2 = v; +} diff --git a/test/hotCases/invalidate/during-idle/a.js b/test/hotCases/invalidate/during-idle/a.js new file mode 100644 index 00000000000..df594c6c21b --- /dev/null +++ b/test/hotCases/invalidate/during-idle/a.js @@ -0,0 +1,5 @@ +export function invalidate() { + module.hot.invalidate(); +} + +export const value = {}; diff --git a/test/hotCases/invalidate/during-idle/b.js b/test/hotCases/invalidate/during-idle/b.js new file mode 100644 index 00000000000..70b8f861b4e --- /dev/null +++ b/test/hotCases/invalidate/during-idle/b.js @@ -0,0 +1,7 @@ +export function invalidate() { + module.hot.invalidate(); +} + +export const value = {}; + +module.hot.accept(); diff --git a/test/hotCases/invalidate/during-idle/c.js b/test/hotCases/invalidate/during-idle/c.js new file mode 100644 index 00000000000..424b691d927 --- /dev/null +++ b/test/hotCases/invalidate/during-idle/c.js @@ -0,0 +1,11 @@ +export function invalidate() { + module.hot.invalidate(); +} + +export const value = module.hot.data ? module.hot.data.value : {}; + +module.hot.dispose(data => { + data.value = value; +}); + +module.hot.accept(); diff --git a/test/hotCases/invalidate/during-idle/index.js b/test/hotCases/invalidate/during-idle/index.js new file mode 100644 index 00000000000..89a1da3b35d --- /dev/null +++ b/test/hotCases/invalidate/during-idle/index.js @@ -0,0 +1,20 @@ +import { a, b, c } from "./module"; + +it("should allow to invalidate and reload a file", () => { + const oldA = a.value; + const oldB = b.value; + const oldC = c.value; + expect(module.hot.status()).toBe("idle"); + a.invalidate(); + expect(module.hot.status()).toBe("ready"); + b.invalidate(); + expect(module.hot.status()).toBe("ready"); + c.invalidate(); + expect(module.hot.status()).toBe("ready"); + module.hot.apply().then(function () { + expect(module.hot.status()).toBe("idle"); + expect(a.value).not.toBe(oldA); + expect(b.value).not.toBe(oldB); + expect(c.value).toBe(oldC); + }); +}); diff --git a/test/hotCases/invalidate/during-idle/module.js b/test/hotCases/invalidate/during-idle/module.js new file mode 100644 index 00000000000..62a44c6d05d --- /dev/null +++ b/test/hotCases/invalidate/during-idle/module.js @@ -0,0 +1,7 @@ +import * as a from "./a"; +import * as b from "./b"; +import * as c from "./c"; + +export { a, b, c }; + +module.hot.accept(["./a", "./b", "./c"]); diff --git a/test/hotCases/lazy-compilation/context/context-import.js b/test/hotCases/lazy-compilation/context/context-import.js new file mode 100644 index 00000000000..7ebae34d636 --- /dev/null +++ b/test/hotCases/lazy-compilation/context/context-import.js @@ -0,0 +1 @@ +export default key => import(`./modules/${key}`); diff --git a/test/hotCases/lazy-compilation/context/generation.js b/test/hotCases/lazy-compilation/context/generation.js new file mode 100644 index 00000000000..1e5de9836a0 --- /dev/null +++ b/test/hotCases/lazy-compilation/context/generation.js @@ -0,0 +1,7 @@ +export default 1; +--- +export default 2; +--- +export default 3; +--- +export default 4; diff --git a/test/hotCases/lazy-compilation/context/index.js b/test/hotCases/lazy-compilation/context/index.js new file mode 100644 index 00000000000..18b5ea4b2dd --- /dev/null +++ b/test/hotCases/lazy-compilation/context/index.js @@ -0,0 +1,32 @@ +import contextImport from "./context-import.js"; +import generation from "./generation.js"; + +import.meta.webpackHot.accept("./generation.js"); + +for (const name of ["demo", "module"]) { + it("should compile to lazy imported context element " + name, done => { + let resolved; + const promise = contextImport(name) + .then(r => (resolved = r)) + .catch(done); + const start = generation; + expect(resolved).toBe(undefined); + setTimeout(() => { + expect(resolved).toBe(undefined); + expect(generation).toBe(start); + NEXT( + require("../../update")(done, true, () => { + promise.then(result => { + try { + expect(result).toHaveProperty("default", name); + expect(generation).toBe(start + 1); + done(); + } catch (e) { + done(e); + } + }, done); + }) + ); + }, 1000); + }); +} diff --git a/test/hotCases/lazy-compilation/context/modules/demo.js b/test/hotCases/lazy-compilation/context/modules/demo.js new file mode 100644 index 00000000000..5e4b4ecd149 --- /dev/null +++ b/test/hotCases/lazy-compilation/context/modules/demo.js @@ -0,0 +1 @@ +export default "demo"; diff --git a/test/hotCases/lazy-compilation/context/modules/module.js b/test/hotCases/lazy-compilation/context/modules/module.js new file mode 100644 index 00000000000..503bca78c72 --- /dev/null +++ b/test/hotCases/lazy-compilation/context/modules/module.js @@ -0,0 +1 @@ +export default "module"; diff --git a/test/hotCases/lazy-compilation/context/webpack.config.js b/test/hotCases/lazy-compilation/context/webpack.config.js new file mode 100644 index 00000000000..04e52dd5203 --- /dev/null +++ b/test/hotCases/lazy-compilation/context/webpack.config.js @@ -0,0 +1,16 @@ +"use strict"; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + experiments: { + lazyCompilation: { + entries: false, + imports: true, + backend: { + listen: { + host: "127.0.0.1" + } + } + } + } +}; diff --git a/test/hotCases/lazy-compilation/https/cert.pem b/test/hotCases/lazy-compilation/https/cert.pem new file mode 100644 index 00000000000..d733eaf4f9c --- /dev/null +++ b/test/hotCases/lazy-compilation/https/cert.pem @@ -0,0 +1,30 @@ +-----BEGIN CERTIFICATE----- +MIIFLzCCAxegAwIBAgIUMiqUWfKzylbMlsLgBHwuNRlTIw0wDQYJKoZIhvcNAQEL +BQAwJjEQMA4GA1UECgwHd2VicGFjazESMBAGA1UEAwwJbG9jYWxob3N0MCAXDTIx +MTAyNTEwMDkzMVoYDzIyOTUwODA5MTAwOTMxWjAmMRAwDgYDVQQKDAd3ZWJwYWNr +MRIwEAYDVQQDDAlsb2NhbGhvc3QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQDcb/zeGyPgXWUQnxpaawe9VfgxCgYDPrJ6hk3t6pALZk5P28szQfBYTIv4 +MC7eicagYwNFEAJOHx7M1j7ZGdlE+E+qW03nt+wxAG38Nyp5nVjssqEKifSFekIJ +RHpUS1CKhVkZdjHuJWu2NhZEpstMNhJFsqixSXNA1h0Qrg2eFmeQU/Cxzi+SPBU6 +ByTf/83mcGcTEXQOCEmIdH6UzUVfY4MuRSab+X3eL5DHByZ0/sMqV7SZdTy3DRoO +Cnk/swHKINSFMdSO7OdpoyRLPuOiGRuuyekg7ygTRHwhtgwusVyGl1FY0zqY5hkX +TOjVRrLEKYypY+6soWc+gwfREfXLeLoUBIkS8PbfXPTtslYLl93KSFrVuZfVhqSM +8GNPpKcA0ZMleMhL8Yy8SknYa5vRp3rdlhmoO4OnlrecmapfJx+OSslje1LKvAbt +pXpaeS0u8prabWoDeLYzLOWyHdCZv+tg0Qysks2A44Sivk/hDLunibLqGaN/3/Wt +v6F4yW+ImYMhY8PwWl6WL7dEnlsun8B7W4cevaxN9/p8r9VX3Tn6cDky1ExriiAR +ZH46PfPgFJpB/qmYvDsZDhlM9qyj9nOEn8n4iDI1bLx+xcNCnLgpgITazUZ1bWDs +JICnJ/7/pWus7b08SHLcqss85Sf1JP60K3bbtQE4dHQEeyrHvwIDAQABo1MwUTAd +BgNVHQ4EFgQUiX//tMNp8PHMF90BqT4hmASz6D8wHwYDVR0jBBgwFoAUiX//tMNp +8PHMF90BqT4hmASz6D8wDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOC +AgEA0vtA2k9VPphfPU7svcjyEkOqt4zDyvQNjpuZesGpAjmM0cPG+/4jvL2rOTek +ClOKtwjYrm+WxmAcwOGz9bI6zeAjD1RPVr1pmQ5l+AXVCDNSKHNwGgfC69u4Pr4a +xOElBjNSh+nahZa1CYvHgfqddn/REiO6b+GUdk540d+DIR9g3WHaSofjQ541skqV +44iveDCLFzEQsJ8wh5ESHNvdp6VHKQEaTyXZep3heStjvUk9LKm7/wK8R6K4riVb +OLsgd/Edx6AEJEUHs5iHcqnn6PSWDsAbqCSSYUxTv8gPERAofMg/Gy1W20T3+Xsf +fLJm4nGhjy3IIIf8L+A95onSkArdyrejHIzNvpmxrWVGVXoc5GEqFd9jPhnAIy6o +mm9clKFbRSTI/NdqpSnVvWzDucqukACU8Tjl+cnWNEhEx/qTMITMJ0Pdih+/2I3S +3z4WmUlPoBb2Xj9TFZ63SFTk/W7o2vtR7k7YkROAiYudnsyyofmJNNqx7m6fbEEi +gzbOSvMrwT1F66HitmO6vm1WwH9ig0sMpGXRq+S2/5tf2OPEuvJiChJ126Ocqr5X +BbeSicG0avgXcIMYv6YaG1MIkV2XJ8vIIaLX1ZrevFaVW0/Jq9/HDeNxuVZaKAFm +s/OsWVidX2wVDFzxBflyCG2ITbx87IsBpE/7juG+PSARjqg= +-----END CERTIFICATE----- diff --git a/test/hotCases/lazy-compilation/https/index.js b/test/hotCases/lazy-compilation/https/index.js new file mode 100644 index 00000000000..01bc8f68a73 --- /dev/null +++ b/test/hotCases/lazy-compilation/https/index.js @@ -0,0 +1,36 @@ +// Avoid errors because of self-signed certificate +process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0; + +it("should compile to lazy imported module", done => { + let resolved; + const promise = import("./module").then(r => (resolved = r)); + let generation = 0; + import.meta.webpackHot.accept("./module", () => { + generation++; + }); + expect(resolved).toBe(undefined); + setTimeout(() => { + expect(resolved).toBe(undefined); + expect(generation).toBe(0); + NEXT( + require("../../update")(done, true, () => { + promise.then(result => { + expect(result).toHaveProperty("default", 42); + expect(generation).toBe(0); + NEXT( + require("../../update")(done, true, () => { + expect(result).toHaveProperty("default", 42); + expect(generation).toBe(1); + import("./module").then(result => { + expect(result).toHaveProperty("default", 43); + setTimeout(() => { + done(); + }, 1000); + }, done); + }) + ); + }, done); + }) + ); + }, 1000); +}); diff --git a/test/hotCases/lazy-compilation/https/key.pem b/test/hotCases/lazy-compilation/https/key.pem new file mode 100644 index 00000000000..4a0e60e2d1a --- /dev/null +++ b/test/hotCases/lazy-compilation/https/key.pem @@ -0,0 +1,52 @@ +-----BEGIN PRIVATE KEY----- +MIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQDcb/zeGyPgXWUQ +nxpaawe9VfgxCgYDPrJ6hk3t6pALZk5P28szQfBYTIv4MC7eicagYwNFEAJOHx7M +1j7ZGdlE+E+qW03nt+wxAG38Nyp5nVjssqEKifSFekIJRHpUS1CKhVkZdjHuJWu2 +NhZEpstMNhJFsqixSXNA1h0Qrg2eFmeQU/Cxzi+SPBU6ByTf/83mcGcTEXQOCEmI +dH6UzUVfY4MuRSab+X3eL5DHByZ0/sMqV7SZdTy3DRoOCnk/swHKINSFMdSO7Odp +oyRLPuOiGRuuyekg7ygTRHwhtgwusVyGl1FY0zqY5hkXTOjVRrLEKYypY+6soWc+ +gwfREfXLeLoUBIkS8PbfXPTtslYLl93KSFrVuZfVhqSM8GNPpKcA0ZMleMhL8Yy8 +SknYa5vRp3rdlhmoO4OnlrecmapfJx+OSslje1LKvAbtpXpaeS0u8prabWoDeLYz +LOWyHdCZv+tg0Qysks2A44Sivk/hDLunibLqGaN/3/Wtv6F4yW+ImYMhY8PwWl6W +L7dEnlsun8B7W4cevaxN9/p8r9VX3Tn6cDky1ExriiARZH46PfPgFJpB/qmYvDsZ +DhlM9qyj9nOEn8n4iDI1bLx+xcNCnLgpgITazUZ1bWDsJICnJ/7/pWus7b08SHLc +qss85Sf1JP60K3bbtQE4dHQEeyrHvwIDAQABAoICAEkjHtLSTmTyl8WcBDJbsIWx +MFeU68nH04+zX8fAO2qM1w7H7fNjvUqOmyINWn+bVruAHmWbmigxSxbLPq7pVJz9 +hfEPuhlXfJYFfnhgFUekXQyrd6L3gpmGpsJMZgnxsxdChv1bqdVJtSMPbvP4Ixt2 +FTnqvO2VYRfx8lLGbN42sMXCE+nqbv4l0SUfmax4QuhiAtDgyZCeT0dm31ifgpTT +f4KqjtTRQmGlhnOCe8/1dutljhYcP7i8MBjYgMIRslZN7jUDA3MoRt9VsYUFqKDv +k6+6bg7vSmyaHFVTAVe8oOZG7kZ6TsbMEScZ7WZVvpo27uSEs3uzUX38G2vSeaoa +pGkmduf9+CP3iVfnHMicgZm3dDS09QDB4nw06qHJTDjhi/8TDFEu+vPQCkgZdJE0 +CuJ9x1sInA8mDvJloqJkH2xEPGd8g985LAyoOwSg9kH6qqIapjVC1NF6xlvDDnbk +cCB9RwBGFQ51LRWNfU8TtRCWZo6U/Bhr4Z9o7o9NqNgHPDqANWS3BwmB+PEl1aCX +WopWyJIQG7U6/BqKTOHRjxwPksxLowMrTXeNNGMvNJoAyOuaosjLPg20McZfS1JD +u7QghPPsy0VOk7IbimzkWUuZjKXLK8RIQV1+BFzl4ylgcVItudPAOgDdiv3SqzxJ +i0sE16C4SkfuUSxWRZoBAoIBAQD/r3zdsIDUwnfmeEGVeCcROgi6s0xxfQkzOK5G +hZxjHrQTO8THF2+pioE8/sFW9cWUcKpx4oBUGTLi/pWlRaVe8/lQrwYlPwaeGJte +ZiExkILwxuLiohJTvRojnHndr/vcGue84HYR2O3C44S2hLM9nOO2Hs6Q4bmotMuW +a6DGmbpTbUUN/WUOPvRWnR16Rf0dcNAx/SS8R8oryVN5O83bKEdUr8GQ7CppjtCa +eU2sDasKFyACFiOD1/pbSxSipN/KYN5M9aq4Emw5+/W34HIRMicgvqJOeks+zq8M +h1KtCketBiWwBps47+9sh0q71VnmWpIy13Pb3ohcIaLkQhBRAoIBAQDctWaclDWP +rSEDzIymItc6+0bQvW7NK688NpUcURgtlpctbKgZWcguPzscYrq7xoKmBHi83uSn +qXhBlzVt1dgH0bkaBkJLNMgbialBhpqHJ3gBTYGO08+B6TlAw5XzJocP/+KZQ8nY +rMA3eZ7xJ7X9ycH/Aj9gsit3jx0vo5GakYwnVJGXtSfgzO4IiyPz97s+7kJpLNDW +eDsx5e9On80WZw+dVwHDqq0V0pXO9vrYEi2hjblltSLslI6Q54at3V0kj9NjrRHj +uXlmcurUSNBe/pGxbnI76AzvxrouXlu0yTaD2wrs8rP3zYKI6QQVoApUNwKzFOKr +OyyCROGYlOMPAoIBAGbjMxfyYqU67Ayt75Y6F15zP/gBFo3EhuM5t8dhFKE+RbBH +qNOEtsY+mer1iM95btxgyfWx83nj+fomAAnVkMo42uaAx7RNPFh6BmtiJZFQWaCS +J9KS7VUND2utF80BeBQGL6JtoJVl+acm7syTcZ0leOxcUTsz2gXtWs9Y2AWS7suL +ePI8OWIWKzR/XNFLQKOMNfsnppStPsmH5jMuwZOjDbEiWH38ysRXV9IRZhQKG/2f +eJ3eUsRHMNNzzwXz2qoReOL3KI+RukNLBIHNq5kH2X7vt1hlFcpcWUxtV/OR423Y +v2mp/uRWiL3fY09adyae453Z3SFo1u5cCrRXcUECggEANyHtTwHK22ghDiTjoYCk +iSxJxUz8x6246W6tEtTDGGg8vXEeEK8XzU2oQ2/6O3vcGQKW8n8vWR6BVskh5Jz9 +iP5/oZucpdK6hf5+VEr+gPKADLtCuN36QPZ0gdQZuhKOvJVsEmMXodONdI4iARWt +ZYcnub7i/BGlwAj0/nh6n8Tp4M1ETURIgORQNbwkMAZbNN4posI6LMj96HoKrHZI +sebuxJv+adVRxVjEaV3SzXTFB00y2dBEuBpn/pSHVRkt8jsnUAfkpyEmzUu5k2vY ++VHYLR1s1cAisybOTVTuzZtRzeBCu2vpPuaMTA0BIzHGQsE3IGsAMEvo02XHgOj4 +SwKCAQBE8paK0mGRf6X9u/B9xmJPfVLpT0MYIjuT+sc09IECECSNk4eWEjFUuqcb +4FKPdlsYP+NUnHHTwaLyPkCI3YYEX/tQpymnjoM75IwDa/zycNJu7/49SYS9kTQS +pSOwzmM64pTxlBEbaKbsLzTk6Kh7Rx029cMe2wKYMKSpZ4psm+q287qBP4TcTYWR +Ol7T8PYSoHaHUNvzYtXhyiwx/wMWjTweLl56ItCS3QQ6KHEAcHRFJF1qiWMmOJBA +00mSIlsCHoG0u3dn3UU4CuibO8z/y8tX8/WlgwcWTvnc+eR+mtkDTxAV6o8LvKxR +j23uAFMMHV6/+WMYg9tmoSEnn0Mp +-----END PRIVATE KEY----- diff --git a/test/hotCases/lazy-compilation/https/module.js b/test/hotCases/lazy-compilation/https/module.js new file mode 100644 index 00000000000..48e48492637 --- /dev/null +++ b/test/hotCases/lazy-compilation/https/module.js @@ -0,0 +1,5 @@ +export default 42; +--- +export default 42; +--- +export default 43; diff --git a/test/hotCases/lazy-compilation/https/webpack.config.js b/test/hotCases/lazy-compilation/https/webpack.config.js new file mode 100644 index 00000000000..5b7ea4e224c --- /dev/null +++ b/test/hotCases/lazy-compilation/https/webpack.config.js @@ -0,0 +1,19 @@ +"use strict"; + +const fs = require("fs"); +const path = require("path"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + experiments: { + lazyCompilation: { + entries: false, + backend: { + server: { + key: fs.readFileSync(path.join(__dirname, "key.pem")), + cert: fs.readFileSync(path.join(__dirname, "cert.pem")) + } + } + } + } +}; diff --git a/test/hotCases/lazy-compilation/module-test/index.js b/test/hotCases/lazy-compilation/module-test/index.js new file mode 100644 index 00000000000..83db2fe15af --- /dev/null +++ b/test/hotCases/lazy-compilation/module-test/index.js @@ -0,0 +1,22 @@ +it("should not lazily compile configured imports", done => { + let resolvedA; + let resolvedB; + const promiseA = import("./moduleA").then(r => (resolvedA = r)); + const promiseB = import("./moduleB").then(r => (resolvedB = r)); + expect(resolvedA).toBe(undefined); + expect(resolvedB).toBe(undefined); + setTimeout(() => { + expect(resolvedA).toBe(undefined); + expect(resolvedB).toHaveProperty("default", "B"); + NEXT( + require("../../update")(done, true, () => { + promiseA.then(result => { + expect(result).toHaveProperty("default", "A"); + setTimeout(() => { + done(); + }, 1000); + }, done); + }) + ); + }, 1000); +}); diff --git a/test/hotCases/lazy-compilation/module-test/moduleA.js b/test/hotCases/lazy-compilation/module-test/moduleA.js new file mode 100644 index 00000000000..06d75ecaf19 --- /dev/null +++ b/test/hotCases/lazy-compilation/module-test/moduleA.js @@ -0,0 +1 @@ +export default "A"; diff --git a/test/hotCases/lazy-compilation/module-test/moduleB.js b/test/hotCases/lazy-compilation/module-test/moduleB.js new file mode 100644 index 00000000000..0ff2171d4c7 --- /dev/null +++ b/test/hotCases/lazy-compilation/module-test/moduleB.js @@ -0,0 +1 @@ +export default "B"; diff --git a/test/hotCases/lazy-compilation/module-test/webpack.config.js b/test/hotCases/lazy-compilation/module-test/webpack.config.js new file mode 100644 index 00000000000..cae5d069215 --- /dev/null +++ b/test/hotCases/lazy-compilation/module-test/webpack.config.js @@ -0,0 +1,12 @@ +"use strict"; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + experiments: { + lazyCompilation: { + entries: false, + test: module => + !/moduleB/.test(/** @type {string} */ (module.nameForCondition())) + } + } +}; diff --git a/test/hotCases/lazy-compilation/only-entries/index.js b/test/hotCases/lazy-compilation/only-entries/index.js new file mode 100644 index 00000000000..7bc4e6cf0dd --- /dev/null +++ b/test/hotCases/lazy-compilation/only-entries/index.js @@ -0,0 +1,9 @@ +it("should not lazily compile to import() when not configured", done => { + let resolved; + const promise = import("./module").then(r => (resolved = r)); + expect(resolved).toBe(undefined); + setTimeout(() => { + expect(resolved).toHaveProperty("default", 42); + done(); + }, 1000); +}); diff --git a/test/hotCases/lazy-compilation/only-entries/module.js b/test/hotCases/lazy-compilation/only-entries/module.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/hotCases/lazy-compilation/only-entries/module.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/hotCases/lazy-compilation/only-entries/webpack.config.js b/test/hotCases/lazy-compilation/only-entries/webpack.config.js new file mode 100644 index 00000000000..2af63b309c8 --- /dev/null +++ b/test/hotCases/lazy-compilation/only-entries/webpack.config.js @@ -0,0 +1,11 @@ +"use strict"; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + experiments: { + lazyCompilation: { + entries: false, + imports: false + } + } +}; diff --git a/test/hotCases/lazy-compilation/simple/index.js b/test/hotCases/lazy-compilation/simple/index.js new file mode 100644 index 00000000000..187b2bb4181 --- /dev/null +++ b/test/hotCases/lazy-compilation/simple/index.js @@ -0,0 +1,45 @@ +it("should compile to lazy imported module", done => { + let resolved; + const promise = import("./module").then(r => (resolved = r)); + let generation = 0; + import.meta.webpackHot.accept("./module", () => { + generation++; + }); + expect(resolved).toBe(undefined); + setTimeout(() => { + expect(resolved).toBe(undefined); + expect(generation).toBe(0); + NEXT( + require("../../update")(done, true, () => { + promise.then(result => { + expect(result).toHaveProperty("default", 42); + expect(generation).toBe(0); + NEXT( + require("../../update")(done, true, () => { + expect(result).toHaveProperty("default", 42); + expect(generation).toBe(1); + import("./module").then(result => { + expect(result).toHaveProperty("default", 43); + expect(generation).toBe(1); + module.hot.accept("./module", () => { + generation += 10; + }); + NEXT( + require("../../update")(done, true, () => { + import("./module").then(result => { + expect(result).toHaveProperty("default", 44); + expect(generation).toBe(11); + setTimeout(() => { + done(); + }, 1000); + }, done); + }) + ); + }, done); + }) + ); + }, done); + }) + ); + }, 1000); +}); diff --git a/test/hotCases/lazy-compilation/simple/module.js b/test/hotCases/lazy-compilation/simple/module.js new file mode 100644 index 00000000000..84c81da2983 --- /dev/null +++ b/test/hotCases/lazy-compilation/simple/module.js @@ -0,0 +1,7 @@ +export default 42; +--- +export default 42; +--- +export default 43; +--- +export default 44; diff --git a/test/hotCases/lazy-compilation/simple/webpack.config.js b/test/hotCases/lazy-compilation/simple/webpack.config.js new file mode 100644 index 00000000000..aef58ef1aaf --- /dev/null +++ b/test/hotCases/lazy-compilation/simple/webpack.config.js @@ -0,0 +1,10 @@ +"use strict"; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + experiments: { + lazyCompilation: { + entries: false + } + } +}; diff --git a/test/hotCases/lazy-compilation/unrelated/index.js b/test/hotCases/lazy-compilation/unrelated/index.js new file mode 100644 index 00000000000..9481047251f --- /dev/null +++ b/test/hotCases/lazy-compilation/unrelated/index.js @@ -0,0 +1,25 @@ +import value from "./module"; + +const neverCalled = () => import("./lazy"); + +it("should compile to lazy imported module", done => { + let generation = 0; + module.hot.accept("./module", () => { + generation++; + }); + expect(value).toBe(42); + expect(generation).toBe(0); + NEXT( + require("../../update")(done, true, () => { + expect(value).toBe(43); + expect(generation).toBe(1); + NEXT( + require("../../update")(done, true, () => { + expect(value).toBe(44); + expect(generation).toBe(2); + done(); + }) + ); + }) + ); +}); diff --git a/test/hotCases/lazy-compilation/unrelated/lazy.js b/test/hotCases/lazy-compilation/unrelated/lazy.js new file mode 100644 index 00000000000..05e08712040 --- /dev/null +++ b/test/hotCases/lazy-compilation/unrelated/lazy.js @@ -0,0 +1 @@ +export default 123; diff --git a/test/hotCases/lazy-compilation/unrelated/module.js b/test/hotCases/lazy-compilation/unrelated/module.js new file mode 100644 index 00000000000..d099aaa344e --- /dev/null +++ b/test/hotCases/lazy-compilation/unrelated/module.js @@ -0,0 +1,5 @@ +export default 42; +--- +export default 43; +--- +export default 44; diff --git a/test/hotCases/lazy-compilation/unrelated/webpack.config.js b/test/hotCases/lazy-compilation/unrelated/webpack.config.js new file mode 100644 index 00000000000..aef58ef1aaf --- /dev/null +++ b/test/hotCases/lazy-compilation/unrelated/webpack.config.js @@ -0,0 +1,10 @@ +"use strict"; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + experiments: { + lazyCompilation: { + entries: false + } + } +}; diff --git a/test/hotCases/loader-import-module/css/colors.js b/test/hotCases/loader-import-module/css/colors.js new file mode 100644 index 00000000000..61cfd6f0cbb --- /dev/null +++ b/test/hotCases/loader-import-module/css/colors.js @@ -0,0 +1,5 @@ +export const color = "#f00"; +--- +export const color = "#0f0"; +--- +export const color = "#0f0"; diff --git a/test/hotCases/loader-import-module/css/file.jpg b/test/hotCases/loader-import-module/css/file.jpg new file mode 100644 index 00000000000..fe5c6eefa79 Binary files /dev/null and b/test/hotCases/loader-import-module/css/file.jpg differ diff --git a/test/hotCases/loader-import-module/css/file.png b/test/hotCases/loader-import-module/css/file.png new file mode 100644 index 00000000000..fb53b9dedd3 Binary files /dev/null and b/test/hotCases/loader-import-module/css/file.png differ diff --git a/test/hotCases/loader-import-module/css/index.js b/test/hotCases/loader-import-module/css/index.js new file mode 100644 index 00000000000..1383ac03598 --- /dev/null +++ b/test/hotCases/loader-import-module/css/index.js @@ -0,0 +1,26 @@ +import stylesheet from "./stylesheet.css.js"; + +it("should be able to use build-time code with HMR", done => { + expect(stylesheet).toBe( + 'body { background: url("https://test.cases/path/assets/file.png"); color: #f00; }' + ); + NEXT( + require("../../update")(done, true, stats => { + expect(stylesheet).toBe( + 'body { background: url("https://test.cases/path/assets/file.png"); color: #0f0; }' + ); + NEXT( + require("../../update")(done, true, stats => { + expect(stylesheet).toBe( + 'body { background: url("https://test.cases/path/assets/file.jpg"); color: #0f0; }' + ); + done(); + }) + ); + }) + ); +}); + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept("./stylesheet.css.js"); +} diff --git a/test/hotCases/loader-import-module/css/loader.js b/test/hotCases/loader-import-module/css/loader.js new file mode 100644 index 00000000000..c4bf30e37f1 --- /dev/null +++ b/test/hotCases/loader-import-module/css/loader.js @@ -0,0 +1,7 @@ +/** @type {import("../../../../").PitchLoaderDefinitionFunction} */ +exports.pitch = async function (remaining) { + const result = await this.importModule( + this.resourcePath + ".webpack[javascript/auto]" + "!=!" + remaining + ); + return (result.default || result)(); +}; diff --git a/test/hotCases/loader-import-module/css/stylesheet.css.js b/test/hotCases/loader-import-module/css/stylesheet.css.js new file mode 100644 index 00000000000..dec22b62b3c --- /dev/null +++ b/test/hotCases/loader-import-module/css/stylesheet.css.js @@ -0,0 +1,29 @@ +import { color } from "./colors.js"; +export default () => + `body { background: url("${ + new URL("./file.png", import.meta.url).href + }"); color: ${color}; }`; + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept("./colors.js"); +} +--- +import { color } from "./colors.js"; +export default () => + `body { background: url("${ + new URL("./file.png", import.meta.url).href + }"); color: ${color}; }`; + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept("./colors.js"); +} +--- +import { color } from "./colors.js"; +export default () => + `body { background: url("${ + new URL("./file.jpg", import.meta.url).href + }"); color: ${color}; }`; + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept("./colors.js"); +} diff --git a/test/hotCases/loader-import-module/css/webpack.config.js b/test/hotCases/loader-import-module/css/webpack.config.js new file mode 100644 index 00000000000..fbf07de8af2 --- /dev/null +++ b/test/hotCases/loader-import-module/css/webpack.config.js @@ -0,0 +1,42 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + module: { + generator: { + asset: { + filename: "assets/[name][ext]" + } + }, + rules: [ + { + oneOf: [ + { + test: /\.css\.js$/, + use: "./loader", + type: "asset/source" + }, + { test: /\.(js|jpg|png)$/ }, + { type: "asset/resource" } + ] + } + ] + }, + plugins: [ + compiler => + compiler.hooks.done.tap("test case", stats => { + const png = stats.compilation.getAsset("assets/file.png"); + const jpg = stats.compilation.getAsset("assets/file.jpg"); + if (png) { + expect(jpg).toBe(undefined); + expect(png).toHaveProperty( + "info", + expect.objectContaining({ sourceFilename: "file.png" }) + ); + } else { + expect(jpg).toHaveProperty( + "info", + expect.objectContaining({ sourceFilename: "file.jpg" }) + ); + } + }) + ] +}; diff --git a/test/hotCases/numeric-ids/add-remove-chunks/chunk.js b/test/hotCases/numeric-ids/add-remove-chunks/chunk.js new file mode 100644 index 00000000000..628afead378 --- /dev/null +++ b/test/hotCases/numeric-ids/add-remove-chunks/chunk.js @@ -0,0 +1 @@ +export { value } from "./file"; diff --git a/test/hotCases/numeric-ids/add-remove-chunks/chunk2.js b/test/hotCases/numeric-ids/add-remove-chunks/chunk2.js new file mode 100644 index 00000000000..b4567329a5a --- /dev/null +++ b/test/hotCases/numeric-ids/add-remove-chunks/chunk2.js @@ -0,0 +1,3 @@ +import { value as v } from "./file"; + +export const value = v + 0.5; diff --git a/test/hotCases/numeric-ids/add-remove-chunks/file.js b/test/hotCases/numeric-ids/add-remove-chunks/file.js new file mode 100644 index 00000000000..62336cdc2fd --- /dev/null +++ b/test/hotCases/numeric-ids/add-remove-chunks/file.js @@ -0,0 +1,5 @@ +export var value = 1; +--- +export var value = 1.5; +--- +export var value = 3; diff --git a/test/hotCases/numeric-ids/add-remove-chunks/index.js b/test/hotCases/numeric-ids/add-remove-chunks/index.js new file mode 100644 index 00000000000..48a48286cce --- /dev/null +++ b/test/hotCases/numeric-ids/add-remove-chunks/index.js @@ -0,0 +1,28 @@ +import m from "./module"; + +it("should add and remove chunks", done => { + return m() + .then(chunk => { + expect(chunk.value).toBe(1); + let update = 0; + module.hot.accept("./module", () => { + m() + .then(chunk => { + switch (update) { + case 0: + expect(chunk.value).toBe(2); + break; + case 1: + expect(chunk.value).toBe(3); + done(); + return; + } + update++; + NEXT(require("../../update")(done)); + }) + .catch(done); + }); + NEXT(require("../../update")(done)); + }) + .catch(done); +}); diff --git a/test/hotCases/numeric-ids/add-remove-chunks/module.js b/test/hotCases/numeric-ids/add-remove-chunks/module.js new file mode 100644 index 00000000000..286db103579 --- /dev/null +++ b/test/hotCases/numeric-ids/add-remove-chunks/module.js @@ -0,0 +1,5 @@ +export default () => import(/* webpackChunkName: "1e1" */ "./chunk"); +--- +export default () => import(/* webpackChunkName: "10" */ "./chunk2"); +--- +export default () => import(/* webpackChunkName: "1e1" */ "./chunk"); diff --git a/test/hotCases/numeric-ids/production/file.js b/test/hotCases/numeric-ids/production/file.js new file mode 100644 index 00000000000..5b2c52ba4bd --- /dev/null +++ b/test/hotCases/numeric-ids/production/file.js @@ -0,0 +1,3 @@ +export var value = 1; +--- +export var value = 2; diff --git a/test/hotCases/numeric-ids/production/index.js b/test/hotCases/numeric-ids/production/index.js new file mode 100644 index 00000000000..ef6ff5ab2c9 --- /dev/null +++ b/test/hotCases/numeric-ids/production/index.js @@ -0,0 +1,15 @@ +import { value } from "./file"; + +it("should auto-import an ES6 imported value on accept", function(done) { + expect(value).toBe(1); + module.hot.accept("./file", function() { + expect(value).toBe(2); + outside(); + done(); + }); + NEXT(require("../../update")(done)); +}); + +function outside() { + expect(value).toBe(2); +} diff --git a/test/hotCases/numeric-ids/production/webpack.config.js b/test/hotCases/numeric-ids/production/webpack.config.js new file mode 100644 index 00000000000..af38831a638 --- /dev/null +++ b/test/hotCases/numeric-ids/production/webpack.config.js @@ -0,0 +1,9 @@ +"use strict"; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "production", + optimization: { + minimize: false + } +}; diff --git a/test/hotCases/parsing/hot-api-optional-chaining/a.js b/test/hotCases/parsing/hot-api-optional-chaining/a.js new file mode 100644 index 00000000000..4fd27070716 --- /dev/null +++ b/test/hotCases/parsing/hot-api-optional-chaining/a.js @@ -0,0 +1,3 @@ +export default 1; +--- +export default 2; diff --git a/test/hotCases/parsing/hot-api-optional-chaining/index.js b/test/hotCases/parsing/hot-api-optional-chaining/index.js new file mode 100644 index 00000000000..6e2ac273a9d --- /dev/null +++ b/test/hotCases/parsing/hot-api-optional-chaining/index.js @@ -0,0 +1,12 @@ +import value from "./a"; + +it("should run module.hot.accept(…)", function (done) { + expect(value).toBe(1); + module?.hot?.accept("./a", function () {}); + NEXT( + require("../../update")(done, true, () => { + expect(value).toBe(2); + done(); + }) + ); +}); diff --git a/test/hotCases/recover/recover-after-css-loader-error/errors1.js b/test/hotCases/recover/recover-after-css-loader-error/errors1.js new file mode 100644 index 00000000000..b57c892ca77 --- /dev/null +++ b/test/hotCases/recover/recover-after-css-loader-error/errors1.js @@ -0,0 +1,3 @@ +module.exports = [ + /Error in loader/, +]; diff --git a/test/hotCases/recover/recover-after-css-loader-error/index.js b/test/hotCases/recover/recover-after-css-loader-error/index.js new file mode 100644 index 00000000000..b8b73c46611 --- /dev/null +++ b/test/hotCases/recover/recover-after-css-loader-error/index.js @@ -0,0 +1,25 @@ +import "./loader!./style.css"; + +it("should work", async function (done) { + const links = window.document.getElementsByTagName("link"); + expect(links[0].sheet.css).toContain("color: red;"); + + NEXT(require("../../update")(done, { + ignoreErrored: true + }, () => { + expect(links[0].sheet.css).toContain("Error in loader"); + + NEXT(require("../../update")(done, { + ignoreErrored: true + }, () => { + expect(links[0].sheet.css).toContain("color: blue;"); + + done(); + })); + })); +}); + +if (import.meta.webpackHot) { + import.meta.webpackHot.accept("./loader!./style.css"); +} + diff --git a/test/hotCases/recover/recover-after-css-loader-error/loader.js b/test/hotCases/recover/recover-after-css-loader-error/loader.js new file mode 100644 index 00000000000..fc55a137395 --- /dev/null +++ b/test/hotCases/recover/recover-after-css-loader-error/loader.js @@ -0,0 +1,11 @@ +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function(content) { + const callback = this.async(); + + if (content.includes("Failed")) { + callback(new Error("Error in loader")); + return; + } + + callback(null, content); +}; diff --git a/test/hotCases/recover/recover-after-css-loader-error/style.css b/test/hotCases/recover/recover-after-css-loader-error/style.css new file mode 100644 index 00000000000..43985cda010 --- /dev/null +++ b/test/hotCases/recover/recover-after-css-loader-error/style.css @@ -0,0 +1,11 @@ +.class { + color: red; +} +--- +.class { + color: green; +}Failed +--- +.class { + color: blue; +} diff --git a/test/hotCases/recover/recover-after-css-loader-error/test.filter.js b/test/hotCases/recover/recover-after-css-loader-error/test.filter.js new file mode 100644 index 00000000000..2be506ab037 --- /dev/null +++ b/test/hotCases/recover/recover-after-css-loader-error/test.filter.js @@ -0,0 +1,3 @@ +module.exports = function (config) { + return config.target === "web"; +}; diff --git a/test/hotCases/recover/recover-after-css-loader-error/webpack.config.js b/test/hotCases/recover/recover-after-css-loader-error/webpack.config.js new file mode 100644 index 00000000000..527c1c2c19d --- /dev/null +++ b/test/hotCases/recover/recover-after-css-loader-error/webpack.config.js @@ -0,0 +1,6 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + experiments: { + css: true + } +}; diff --git a/test/hotCases/recover/recover-after-loader-error/loader.js b/test/hotCases/recover/recover-after-loader-error/loader.js index c6713cb9fcb..4f935bbc6ad 100644 --- a/test/hotCases/recover/recover-after-loader-error/loader.js +++ b/test/hotCases/recover/recover-after-loader-error/loader.js @@ -1,5 +1,5 @@ -module.exports = function(source) { - if(source.indexOf("error") >= 0) - throw new Error(source.trim()); +/** @type {import("../../../../").LoaderDefinition} */ +module.exports = function (source) { + if (source.indexOf("error") >= 0) throw new Error(source.trim()); return source; }; diff --git a/test/hotCases/recover/recover-after-removal-self-accepted/index.js b/test/hotCases/recover/recover-after-removal-self-accepted/index.js new file mode 100644 index 00000000000..9a7ca9e5680 --- /dev/null +++ b/test/hotCases/recover/recover-after-removal-self-accepted/index.js @@ -0,0 +1,20 @@ +import ok from "./module"; + +it("should abort when module is not accepted", done => { + expect(ok).toBe("ok1-inner"); + NEXT( + require("../../update")(done, true, () => { + expect(ok).toBe("ok2"); + NEXT( + require("../../update")(done, true, () => { + expect(ok).toBe("ok3-inner"); + done(); + }) + ); + }) + ); +}); + +if (module.hot) { + module.hot.accept("./module"); +} diff --git a/test/hotCases/recover/recover-after-removal-self-accepted/inner.js b/test/hotCases/recover/recover-after-removal-self-accepted/inner.js new file mode 100644 index 00000000000..8902ee1b3d4 --- /dev/null +++ b/test/hotCases/recover/recover-after-removal-self-accepted/inner.js @@ -0,0 +1,3 @@ +module.hot.accept(); + +export default "-inner"; diff --git a/test/hotCases/recover/recover-after-removal-self-accepted/module.js b/test/hotCases/recover/recover-after-removal-self-accepted/module.js new file mode 100644 index 00000000000..de7faaf2a9e --- /dev/null +++ b/test/hotCases/recover/recover-after-removal-self-accepted/module.js @@ -0,0 +1,9 @@ +import inner from "./inner"; + +export default "ok1" + inner; +--- +export default "ok2"; +--- +import inner from "./inner"; + +export default "ok3" + inner; diff --git a/test/hotCases/recover/recover-after-self-error/a.js b/test/hotCases/recover/recover-after-self-error/a.js new file mode 100644 index 00000000000..76866548839 --- /dev/null +++ b/test/hotCases/recover/recover-after-self-error/a.js @@ -0,0 +1,29 @@ +const store = { value: 1, error: false }; +export default () => store.value; +export const getError = () => store.error; +export const id = module.id; +import.meta.webpackHot.dispose(data => { + data.store = store; +}) +import.meta.webpackHot.accept(function errorHandler(err, { module, moduleId }) { + import.meta.webpackHot.data.store.error = true; + module.hot.accept(errorHandler); + module.hot.dispose(data => { + data.store = store; + }) +}); +--- +import.meta.webpackHot.data.store.error = false; +import.meta.webpackHot.data.store.value = 2; +export default () => { throw new Error("should not happen") }; +export const getError = () => { throw new Error("should not happen") }; +export const id = module.id; +throw new Error("Failed"); +--- +))) +--- +import.meta.webpackHot.data.store.error = false; +import.meta.webpackHot.data.store.value = 4; +export default () => { throw new Error("should not happen") }; +export const getError = () => { throw new Error("should not happen") }; +export const id = module.id; diff --git a/test/hotCases/recover/recover-after-self-error/errors2.js b/test/hotCases/recover/recover-after-self-error/errors2.js new file mode 100644 index 00000000000..534e9facc4c --- /dev/null +++ b/test/hotCases/recover/recover-after-self-error/errors2.js @@ -0,0 +1 @@ +module.exports = [[/Module parse failed/]]; diff --git a/test/hotCases/recover/recover-after-self-error/index.js b/test/hotCases/recover/recover-after-self-error/index.js new file mode 100644 index 00000000000..68b728ded4e --- /dev/null +++ b/test/hotCases/recover/recover-after-self-error/index.js @@ -0,0 +1,31 @@ +import getValue, { getError, id } from "./a"; + +const moduleId = id; + +it("should abort when module is not accepted", done => { + expect(getValue()).toBe(1); + expect(getError()).toBe(false); + NEXT( + require("../../update")(done, true, () => { + expect(getValue()).toBe(2); + expect(getError()).toBe(true); + NEXT( + require("../../update")(done, true, () => { + expect(getValue()).toBe(2); + expect(getError()).toBe(true); + NEXT( + require("../../update")(done, true, () => { + expect(getValue()).toBe(4); + expect(getError()).toBe(false); + done(); + }) + ); + }) + ); + }) + ); +}); + +if (module.hot) { + module.hot.accept("./a"); +} diff --git a/test/hotCases/runtime/add-runtime/index.js b/test/hotCases/runtime/add-runtime/index.js new file mode 100644 index 00000000000..f076bcf3762 --- /dev/null +++ b/test/hotCases/runtime/add-runtime/index.js @@ -0,0 +1,13 @@ +let value = require("./module.js"); +import {a} from "./lib/a.js"; + +it("should compile", (done) => { + expect(value).toBe(1); + expect(a).toBe(1); + module.hot.accept("./module.js", () => { + value = require("./module"); + expect(value).toBe(2); + done(); + }); + NEXT(require("../../update")(done)); +}); diff --git a/test/hotCases/runtime/add-runtime/lib/a.js b/test/hotCases/runtime/add-runtime/lib/a.js new file mode 100644 index 00000000000..41715495f45 --- /dev/null +++ b/test/hotCases/runtime/add-runtime/lib/a.js @@ -0,0 +1 @@ +export const a = 1 diff --git a/test/hotCases/runtime/add-runtime/lib/b.js b/test/hotCases/runtime/add-runtime/lib/b.js new file mode 100644 index 00000000000..9439af42307 --- /dev/null +++ b/test/hotCases/runtime/add-runtime/lib/b.js @@ -0,0 +1 @@ +export const b = 1 diff --git a/test/hotCases/runtime/add-runtime/lib/package.json b/test/hotCases/runtime/add-runtime/lib/package.json new file mode 100644 index 00000000000..3802144dedb --- /dev/null +++ b/test/hotCases/runtime/add-runtime/lib/package.json @@ -0,0 +1,3 @@ +{ + "sideEffects": true +} diff --git a/test/hotCases/runtime/add-runtime/module.js b/test/hotCases/runtime/add-runtime/module.js new file mode 100644 index 00000000000..25f40da1330 --- /dev/null +++ b/test/hotCases/runtime/add-runtime/module.js @@ -0,0 +1,4 @@ +module.exports = 1; +--- +new Worker(new URL('./worker.js', import.meta.url)) +module.exports = 2; diff --git a/test/hotCases/runtime/add-runtime/test.filter.js b/test/hotCases/runtime/add-runtime/test.filter.js new file mode 100644 index 00000000000..3af8ed89885 --- /dev/null +++ b/test/hotCases/runtime/add-runtime/test.filter.js @@ -0,0 +1,8 @@ +const supportsWorker = require("../../../helpers/supportsWorker"); + +module.exports = function (config) { + if (config.target !== "web") { + return false; + } + return supportsWorker(); +}; diff --git a/test/hotCases/runtime/add-runtime/webpack.config.js b/test/hotCases/runtime/add-runtime/webpack.config.js new file mode 100644 index 00000000000..d0d0854b6da --- /dev/null +++ b/test/hotCases/runtime/add-runtime/webpack.config.js @@ -0,0 +1,17 @@ +module.exports = { + optimization: { + usedExports: true, + // make 'lib' chunk runtime to be worker + entry + splitChunks: { + minSize: 0, + chunks: "all", + cacheGroups: { + lib: { + test: /[/\\]lib[/\\](a|b|index).js$/, + name: "lib", + filename: "bundle-lib.js" + } + } + } + } +}; diff --git a/test/hotCases/runtime/add-runtime/worker.js b/test/hotCases/runtime/add-runtime/worker.js new file mode 100644 index 00000000000..087c8371c2e --- /dev/null +++ b/test/hotCases/runtime/add-runtime/worker.js @@ -0,0 +1,2 @@ +import {b} from "./lib/b.js"; +b; diff --git a/test/hotCases/runtime/dispose-removed-chunk/a.js b/test/hotCases/runtime/dispose-removed-chunk/a.js index ff9f2cdc40c..98290c901ba 100644 --- a/test/hotCases/runtime/dispose-removed-chunk/a.js +++ b/test/hotCases/runtime/dispose-removed-chunk/a.js @@ -1 +1,8 @@ -export default Date.now(); \ No newline at end of file +export default "version a1"; +--- +export default "version a1"; +--- +export default "version a2"; +--- +export default "version a2"; +--- diff --git a/test/hotCases/runtime/dispose-removed-chunk/b.js b/test/hotCases/runtime/dispose-removed-chunk/b.js index e69de29bb2d..72503367c77 100644 --- a/test/hotCases/runtime/dispose-removed-chunk/b.js +++ b/test/hotCases/runtime/dispose-removed-chunk/b.js @@ -0,0 +1,7 @@ +export default "version b1"; +--- +export default "version b1"; +--- +export default "version b2"; +--- +export default "version b2"; diff --git a/test/hotCases/runtime/dispose-removed-chunk/index.js b/test/hotCases/runtime/dispose-removed-chunk/index.js index c73676af413..834b09a67c4 100644 --- a/test/hotCases/runtime/dispose-removed-chunk/index.js +++ b/test/hotCases/runtime/dispose-removed-chunk/index.js @@ -1,14 +1,23 @@ it("should dispose a chunk which is removed from bundle", (done) => { var m1 = require("./module"); m1.default.then((x1) => { + expect(x1.default).toEqual("version a1"); NEXT(require("../../update")(done, true, () => { var m2 = require("./module"); m2.default.then((x2) => { + expect(x2.default).toEqual("version b1"); NEXT(require("../../update")(done, true, () => { var m3 = require("./module"); m3.default.then((x3) => { - expect(x1).not.toEqual(x2); - done(); + expect(x3.default).toEqual("version b2"); + NEXT(require("../../update")(done, true, () => { + var m4 = require("./module"); + m4.default.then((x4) => { + expect(x4.default).toEqual("version a2"); + expect(x4).not.toEqual(x1); + done(); + }).catch(done); + })); }).catch(done); })); }).catch(done); diff --git a/test/hotCases/runtime/dispose-removed-chunk/module.js b/test/hotCases/runtime/dispose-removed-chunk/module.js index a218da36c0b..76995bfe4aa 100644 --- a/test/hotCases/runtime/dispose-removed-chunk/module.js +++ b/test/hotCases/runtime/dispose-removed-chunk/module.js @@ -2,4 +2,6 @@ export default import("./a"); --- export default import("./b"); --- +export default import("./b"); +--- export default import("./a"); diff --git a/test/hotCases/runtime/import-after-download/chunk.js b/test/hotCases/runtime/import-after-download/chunk.js new file mode 100644 index 00000000000..fd999d5150b --- /dev/null +++ b/test/hotCases/runtime/import-after-download/chunk.js @@ -0,0 +1,5 @@ +import value from "./inner"; + +module.hot.accept("./inner"); + +export { value as default }; diff --git a/test/hotCases/runtime/import-after-download/file.js b/test/hotCases/runtime/import-after-download/file.js new file mode 100644 index 00000000000..4fd27070716 --- /dev/null +++ b/test/hotCases/runtime/import-after-download/file.js @@ -0,0 +1,3 @@ +export default 1; +--- +export default 2; diff --git a/test/hotCases/runtime/import-after-download/index.js b/test/hotCases/runtime/import-after-download/index.js new file mode 100644 index 00000000000..29019fbf773 --- /dev/null +++ b/test/hotCases/runtime/import-after-download/index.js @@ -0,0 +1,33 @@ +import value from "./file"; + +module.hot.accept("./file"); + +const asyncNext = () => { + return new Promise((resolve, reject) => { + NEXT((err, stats) => { + if (err) return reject(err); + resolve(stats); + }); + }); +}; + +it("should download the missing update chunk on import", () => { + expect(value).toBe(1); + return asyncNext().then(() => { + return module.hot.check().then(() => { + return Promise.all([ + import("./chunk"), + import("./unaffected-chunk") + ]).then(([chunk, unaffectedChunk]) => { + expect(value).toBe(1); + expect(chunk.default).toBe(10); + expect(unaffectedChunk.default).toBe(10); + return module.hot.apply().then(() => { + expect(value).toBe(2); + expect(chunk.default).toBe(20); + expect(unaffectedChunk.default).toBe(10); + }); + }); + }); + }); +}); diff --git a/test/hotCases/runtime/import-after-download/inner.js b/test/hotCases/runtime/import-after-download/inner.js new file mode 100644 index 00000000000..93d8f37db12 --- /dev/null +++ b/test/hotCases/runtime/import-after-download/inner.js @@ -0,0 +1,3 @@ +export default 10; +--- +export default 20; diff --git a/test/hotCases/runtime/import-after-download/unaffected-chunk.js b/test/hotCases/runtime/import-after-download/unaffected-chunk.js new file mode 100644 index 00000000000..0f62e4ae9b9 --- /dev/null +++ b/test/hotCases/runtime/import-after-download/unaffected-chunk.js @@ -0,0 +1,5 @@ +import value from "./unaffected-inner"; + +module.hot.accept("./unaffected-inner"); + +export { value as default }; diff --git a/test/hotCases/runtime/import-after-download/unaffected-inner.js b/test/hotCases/runtime/import-after-download/unaffected-inner.js new file mode 100644 index 00000000000..92d7092abd3 --- /dev/null +++ b/test/hotCases/runtime/import-after-download/unaffected-inner.js @@ -0,0 +1 @@ +export default 10; diff --git a/test/hotCases/runtime/replace-runtime-module/a.js b/test/hotCases/runtime/replace-runtime-module/a.js new file mode 100644 index 00000000000..e94fef18587 --- /dev/null +++ b/test/hotCases/runtime/replace-runtime-module/a.js @@ -0,0 +1 @@ +export default "a"; diff --git a/test/hotCases/runtime/replace-runtime-module/b.js b/test/hotCases/runtime/replace-runtime-module/b.js new file mode 100644 index 00000000000..eff703ff465 --- /dev/null +++ b/test/hotCases/runtime/replace-runtime-module/b.js @@ -0,0 +1 @@ +export default "b"; diff --git a/test/hotCases/runtime/replace-runtime-module/index.js b/test/hotCases/runtime/replace-runtime-module/index.js new file mode 100644 index 00000000000..aa2df6dcb52 --- /dev/null +++ b/test/hotCases/runtime/replace-runtime-module/index.js @@ -0,0 +1,17 @@ +import m from "./module"; + +it("should dispose a chunk which is removed from bundle", (done) => { + m.then(a => { + expect(a.default).toEqual("a"); + NEXT(require("../../update")(done, true, () => { + m.then(b => { + expect(b.default).toEqual("b"); + done(); + }).catch(done); + })); + }).catch(done); +}); + +if(module.hot) { + module.hot.accept("./module"); +} diff --git a/test/hotCases/runtime/replace-runtime-module/module.js b/test/hotCases/runtime/replace-runtime-module/module.js new file mode 100644 index 00000000000..c8f589c43da --- /dev/null +++ b/test/hotCases/runtime/replace-runtime-module/module.js @@ -0,0 +1,3 @@ +export default import(/* webpackChunkName: "a" */ "./a"); +--- +export default import(/* webpackChunkName: "b" */ "./b"); diff --git a/test/hotCases/runtime/require-disposed-module-warning/a.js b/test/hotCases/runtime/require-disposed-module-warning/a.js new file mode 100644 index 00000000000..21a74ac98cf --- /dev/null +++ b/test/hotCases/runtime/require-disposed-module-warning/a.js @@ -0,0 +1 @@ +export default module; diff --git a/test/hotCases/runtime/require-disposed-module-warning/b.js b/test/hotCases/runtime/require-disposed-module-warning/b.js new file mode 100644 index 00000000000..eff703ff465 --- /dev/null +++ b/test/hotCases/runtime/require-disposed-module-warning/b.js @@ -0,0 +1 @@ +export default "b"; diff --git a/test/hotCases/runtime/require-disposed-module-warning/index.js b/test/hotCases/runtime/require-disposed-module-warning/index.js new file mode 100644 index 00000000000..d3fddcdc1b3 --- /dev/null +++ b/test/hotCases/runtime/require-disposed-module-warning/index.js @@ -0,0 +1,22 @@ +const expectWarning = require("../../../helpers/expectWarningFactory")(); +const getInner = require("./module"); + +it("should print correct warning messages when a disposed module is required", done => { + NEXT( + require("../../update")(done, true, () => { + getInner(); + expectWarning( + /^\[HMR] unexpected require\(\.\/a.js\) from disposed module \.\/module\.js$/, + /^\[HMR] unexpected require\(\.\/a.js\) to disposed module$/ + ); + const getInnerUpdated = require("./module"); + getInnerUpdated(); + expectWarning(); + done(); + }) + ); +}); + +if (module.hot) { + module.hot.accept("./module"); +} diff --git a/test/hotCases/runtime/require-disposed-module-warning/module.js b/test/hotCases/runtime/require-disposed-module-warning/module.js new file mode 100644 index 00000000000..a56bd87d1b1 --- /dev/null +++ b/test/hotCases/runtime/require-disposed-module-warning/module.js @@ -0,0 +1,3 @@ +module.exports = () => require("./a"); +--- +module.exports = () => require("./b"); diff --git a/test/hotCases/runtime/root-error/errors1.js b/test/hotCases/runtime/root-error/errors1.js new file mode 100644 index 00000000000..bed0201a4c6 --- /dev/null +++ b/test/hotCases/runtime/root-error/errors1.js @@ -0,0 +1 @@ +module.exports = [[/Unexpected token/]]; diff --git a/test/hotCases/runtime/root-error/index.js b/test/hotCases/runtime/root-error/index.js new file mode 100644 index 00000000000..3c6824d007d --- /dev/null +++ b/test/hotCases/runtime/root-error/index.js @@ -0,0 +1,42 @@ +const next = () => new Promise((resolve, reject) => { + NEXT((err, stats) => { + if (err) return reject(err); + resolve(module.hot.check(true).then(() => stats).catch(e => { + e.stats = stats; + throw e; + })); + }); +}) + +it("should re-execute the entrypoint on update", async () => { + let stats = await new Promise((resolve, reject) => { + NEXT((err, stats) => { + if(err) return reject(err); + resolve(stats); + }); + }); + expect(stats.errors.length).toBe(1); + stats = await next(); + expect(stats.errors.length).toBe(0); + expect(global.STATE).toBe(1); + delete global.STATE; + try { + await next(); + throw new Error("should not be reached"); + } catch(e) { + expect(e.message).toBe("Aborted because ./index.js is not accepted\nUpdate propagation: ./index.js"); + expect(e.stats.errors.length).toBe(0); + return; + } +}); + +// ignore errors +module.hot.accept(() => {}); +--- +))) +--- +global.STATE = 1; +throw new Error("root-error"); +--- +// will never happen +// but should lead to apply failing because of unaccepted module diff --git a/test/hotCases/runtime/root-error/webpack.config.js b/test/hotCases/runtime/root-error/webpack.config.js new file mode 100644 index 00000000000..e9fe7588df6 --- /dev/null +++ b/test/hotCases/runtime/root-error/webpack.config.js @@ -0,0 +1,5 @@ +module.exports = { + optimization: { + emitOnErrors: false + } +}; diff --git a/test/hotCases/runtime/self-accept-factory/a.js b/test/hotCases/runtime/self-accept-factory/a.js new file mode 100644 index 00000000000..8987d16ab3b --- /dev/null +++ b/test/hotCases/runtime/self-accept-factory/a.js @@ -0,0 +1,13 @@ +require("./hot")(module); + +let callback; + +module.exports = cb => (callback = cb); +module.hot.dispose(data => (data.callback = callback)); + +--- + +require("./hot")(module); +require("./b"); + +module.hot.data.callback(); diff --git a/test/hotCases/runtime/self-accept-factory/b.js b/test/hotCases/runtime/self-accept-factory/b.js new file mode 100644 index 00000000000..bd816eaba4c --- /dev/null +++ b/test/hotCases/runtime/self-accept-factory/b.js @@ -0,0 +1 @@ +module.exports = 1; diff --git a/test/hotCases/runtime/self-accept-factory/hot.js b/test/hotCases/runtime/self-accept-factory/hot.js new file mode 100644 index 00000000000..de70b63a27a --- /dev/null +++ b/test/hotCases/runtime/self-accept-factory/hot.js @@ -0,0 +1,4 @@ +module.exports = (m) => { + m.hot && m.hot.accept(); + return self => self; +}; diff --git a/test/hotCases/runtime/self-accept-factory/index.js b/test/hotCases/runtime/self-accept-factory/index.js new file mode 100644 index 00000000000..88a99659c08 --- /dev/null +++ b/test/hotCases/runtime/self-accept-factory/index.js @@ -0,0 +1,4 @@ +it("should able to accept for another module", (done) => { + require("./a")(done); + NEXT(require("../../update")(done)); +}); diff --git a/test/hotCases/sharing/share-plugin/common.js b/test/hotCases/sharing/share-plugin/common.js new file mode 100644 index 00000000000..f2e2b422b22 --- /dev/null +++ b/test/hotCases/sharing/share-plugin/common.js @@ -0,0 +1 @@ +export default 'common-lib' \ No newline at end of file diff --git a/test/hotCases/sharing/share-plugin/index.js b/test/hotCases/sharing/share-plugin/index.js new file mode 100644 index 00000000000..f62a618f2da --- /dev/null +++ b/test/hotCases/sharing/share-plugin/index.js @@ -0,0 +1,14 @@ +import value, { getValue } from "./module"; + +it("should accept a shared dependency", async () => { + expect(value).toBe("module"); + await expect(getValue()).resolves.toHaveProperty("default", "module"); + module.hot.accept("./module"); + + await new Promise((resolve, reject) => + NEXT(require("../../update")(reject, true, resolve)) + ); + + expect(value).toBe("common-lib"); + await expect(getValue()).resolves.toHaveProperty("default", "common-lib"); +}); diff --git a/test/hotCases/sharing/share-plugin/module.js b/test/hotCases/sharing/share-plugin/module.js new file mode 100644 index 00000000000..78462eb39b9 --- /dev/null +++ b/test/hotCases/sharing/share-plugin/module.js @@ -0,0 +1,7 @@ +export default "module" + +export const getValue = () => Promise.resolve({ default: "module" }); +--- +export { default } from "common" + +export const getValue = () => import("common2"); diff --git a/test/hotCases/sharing/share-plugin/webpack.config.js b/test/hotCases/sharing/share-plugin/webpack.config.js new file mode 100644 index 00000000000..7cd5ca03ad6 --- /dev/null +++ b/test/hotCases/sharing/share-plugin/webpack.config.js @@ -0,0 +1,22 @@ +const { SharePlugin } = require("../../../../").sharing; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + devtool: false, + plugins: [ + new SharePlugin({ + shared: { + common: { + eager: true, + import: "./common?1", + requiredVersion: "1.1.1" + }, + common2: { + import: "./common?2", + requiredVersion: "1.1.1" + } + } + }) + ] +}; diff --git a/test/hotCases/status/accept/file.js b/test/hotCases/status/accept/file.js new file mode 100644 index 00000000000..77e3c4ea564 --- /dev/null +++ b/test/hotCases/status/accept/file.js @@ -0,0 +1,3 @@ +module.exports = 1; +--- +module.exports = 2; diff --git a/test/hotCases/status/accept/index.js b/test/hotCases/status/accept/index.js new file mode 100644 index 00000000000..597a2bd0ec3 --- /dev/null +++ b/test/hotCases/status/accept/index.js @@ -0,0 +1,27 @@ +var value = require("./file"); + +it("should wait until promises returned by status handlers are fulfilled", (done) => { + var handler = jest.fn(status => { + var test = jest.fn(() => { + expect(module.hot.status()).toBe(status == "dispose" ? "apply" : status); + }); + + var promise = Promise.resolve().then(test); + promise.test = test; + + return promise; + }); + module.hot.addStatusHandler(handler); + module.hot.accept("./file", () => { + value = require("./file"); + }); + NEXT(require("../../update")(done, undefined, () => { + expect(handler.mock.calls).toStrictEqual([['check'], ['prepare'], ['dispose'], ['apply'], ['idle']]); + for (let result of handler.mock.results) + expect(result.value.test).toHaveBeenCalledTimes(1); + + expect(module.hot.status()).toBe("idle"); + + done(); + })); +}); diff --git a/test/hotCases/status/check/file.js b/test/hotCases/status/check/file.js new file mode 100644 index 00000000000..5b2c52ba4bd --- /dev/null +++ b/test/hotCases/status/check/file.js @@ -0,0 +1,3 @@ +export var value = 1; +--- +export var value = 2; diff --git a/test/hotCases/status/check/index.js b/test/hotCases/status/check/index.js new file mode 100644 index 00000000000..e16a13f054e --- /dev/null +++ b/test/hotCases/status/check/index.js @@ -0,0 +1,6 @@ +import { value } from "./file"; + +it("call module.check api with false should return updatedModules correctly", function (done) { + expect(value).toBe(1); + NEXT(require("./update")(done)); +}); diff --git a/test/hotCases/status/check/update.js b/test/hotCases/status/check/update.js new file mode 100644 index 00000000000..c1e1b7a9b07 --- /dev/null +++ b/test/hotCases/status/check/update.js @@ -0,0 +1,15 @@ +module.exports = function (done) { + return function (err, stats) { + if (err) return done(err); + module.hot + .check(false) + .then(updatedModules => { + if (!updatedModules) return done(new Error("No update available")); + expect(updatedModules).toContain("./file.js"); + done(); + }) + .catch(err => { + done(err); + }); + }; +}; diff --git a/test/hotCases/unexpected-invalidation/used-exports/index.js b/test/hotCases/unexpected-invalidation/used-exports/index.js new file mode 100644 index 00000000000..c01ff06658f --- /dev/null +++ b/test/hotCases/unexpected-invalidation/used-exports/index.js @@ -0,0 +1,13 @@ +import { ghi } from "./subject"; +import value from "./module"; + +it("should not invalidate subject in unrelated locations", done => { + expect(ghi).toBe(42); + expect(value).toBe(40); + import.meta.webpackHot.accept("./module", () => { + expect(ghi).toBe(42); + expect(value).toBe(41); + done(); + }); + NEXT(require("../../update")(done)); +}); diff --git a/test/hotCases/unexpected-invalidation/used-exports/module.js b/test/hotCases/unexpected-invalidation/used-exports/module.js new file mode 100644 index 00000000000..4ef19b5f295 --- /dev/null +++ b/test/hotCases/unexpected-invalidation/used-exports/module.js @@ -0,0 +1,3 @@ +export { abc as default } from "./subject"; +--- +export { def as default } from "./subject"; diff --git a/test/hotCases/unexpected-invalidation/used-exports/subject.js b/test/hotCases/unexpected-invalidation/used-exports/subject.js new file mode 100644 index 00000000000..c497990ba4d --- /dev/null +++ b/test/hotCases/unexpected-invalidation/used-exports/subject.js @@ -0,0 +1,3 @@ +export const abc = 40; +export const def = 41; +export const ghi = 42; diff --git a/test/hotCases/update.js b/test/hotCases/update.js index d6993d2cc3f..8e21026f2dd 100644 --- a/test/hotCases/update.js +++ b/test/hotCases/update.js @@ -1,11 +1,14 @@ -module.exports = function(done, options, callback) { - return function(err, stats) { +module.exports = function (done, options, callback) { + return function (err, stats) { if (err) return done(err); - module.hot.check(options || true).then(() => { - if (callback) - callback(stats); - }).catch((err) => { - done(err); - }); - } + module.hot + .check(options || true) + .then(updatedModules => { + if (!updatedModules) return done(new Error("No update available")); + if (callback) callback(stats); + }) + .catch(err => { + done(err); + }); + }; }; diff --git a/test/hotCases/worker/move-between-runtime/chunk.js b/test/hotCases/worker/move-between-runtime/chunk.js new file mode 100644 index 00000000000..db9884ad3b4 --- /dev/null +++ b/test/hotCases/worker/move-between-runtime/chunk.js @@ -0,0 +1 @@ +export default "chunk"; diff --git a/test/hotCases/worker/move-between-runtime/chunkS.js b/test/hotCases/worker/move-between-runtime/chunkS.js new file mode 100644 index 00000000000..367117feb80 --- /dev/null +++ b/test/hotCases/worker/move-between-runtime/chunkS.js @@ -0,0 +1 @@ +export default "chunkS"; diff --git a/test/hotCases/worker/move-between-runtime/index.js b/test/hotCases/worker/move-between-runtime/index.js new file mode 100644 index 00000000000..28201f1048b --- /dev/null +++ b/test/hotCases/worker/move-between-runtime/index.js @@ -0,0 +1,33 @@ +const update = () => + new Promise((resolve, reject) => { + NEXT(err => { + if (err) reject(err); + else resolve(); + }); + }); + +const expectMessage = (w, msg) => + new Promise((resolve, reject) => { + w.onmessage = ({ data }) => { + if (data === msg) resolve(); + else reject(new Error(data)); + }; + }); + +const next = w => { + const p = expectMessage(w, "next"); + w.postMessage("next"); + return p; +}; + +it("should support hot module replacement in WebWorkers", async () => { + const a = new Worker(new URL("workerA.js", import.meta.url)); + const b = new Worker(new URL("workerB.js", import.meta.url)); + for (let i = 0; i < 7; i++) { + await update(); + await next(a); + await next(b); + } + await a.terminate(); + await b.terminate(); +}); diff --git a/test/hotCases/worker/move-between-runtime/module.js b/test/hotCases/worker/move-between-runtime/module.js new file mode 100644 index 00000000000..503bca78c72 --- /dev/null +++ b/test/hotCases/worker/move-between-runtime/module.js @@ -0,0 +1 @@ +export default "module"; diff --git a/test/hotCases/worker/move-between-runtime/moduleA.js b/test/hotCases/worker/move-between-runtime/moduleA.js new file mode 100644 index 00000000000..45e7c086296 --- /dev/null +++ b/test/hotCases/worker/move-between-runtime/moduleA.js @@ -0,0 +1,19 @@ +export default 0; +--- +export default 1; +import "./module"; +--- +export default 2; +import "./module"; +--- +export default 3; +--- +export default 4; +if (Math.random() < 0) import("./chunk"); +--- +export default 5; +if (Math.random() < 0) import("./chunk"); +--- +export default 6; +--- +export default 7; diff --git a/test/hotCases/worker/move-between-runtime/moduleAs.js b/test/hotCases/worker/move-between-runtime/moduleAs.js new file mode 100644 index 00000000000..362c501807f --- /dev/null +++ b/test/hotCases/worker/move-between-runtime/moduleAs.js @@ -0,0 +1,19 @@ +export default 0; +--- +export default 1; +import "./moduleS"; +--- +export default 2; +import "./moduleS"; +--- +export default 3; +--- +export default 4; +if (Math.random() < 0) import("./chunkS"); +--- +export default 5; +if (Math.random() < 0) import("./chunkS"); +--- +export default 6; +--- +export default 7; diff --git a/test/hotCases/worker/move-between-runtime/moduleB.js b/test/hotCases/worker/move-between-runtime/moduleB.js new file mode 100644 index 00000000000..15b10c30756 --- /dev/null +++ b/test/hotCases/worker/move-between-runtime/moduleB.js @@ -0,0 +1,19 @@ +export default 0; +--- +export default 1; +--- +export default 2; +import "./module"; +--- +export default 3; +import "./module"; +--- +export default 4; +--- +export default 5; +if (Math.random() < 0) import("./chunk"); +--- +export default 6; +if (Math.random() < 0) import("./chunk"); +--- +export default 7; diff --git a/test/hotCases/worker/move-between-runtime/moduleBs.js b/test/hotCases/worker/move-between-runtime/moduleBs.js new file mode 100644 index 00000000000..bbe0fbf7433 --- /dev/null +++ b/test/hotCases/worker/move-between-runtime/moduleBs.js @@ -0,0 +1,19 @@ +export default 0; +--- +export default 1; +--- +export default 2; +import "./moduleS"; +--- +export default 3; +import "./moduleS"; +--- +export default 4; +--- +export default 5; +if (Math.random() < 0) import("./chunkS"); +--- +export default 6; +if (Math.random() < 0) import("./chunkS"); +--- +export default 7; diff --git a/test/hotCases/worker/move-between-runtime/moduleS.js b/test/hotCases/worker/move-between-runtime/moduleS.js new file mode 100644 index 00000000000..a02e06c2f72 --- /dev/null +++ b/test/hotCases/worker/move-between-runtime/moduleS.js @@ -0,0 +1 @@ +export default "moduleS"; diff --git a/test/hotCases/worker/move-between-runtime/test.filter.js b/test/hotCases/worker/move-between-runtime/test.filter.js new file mode 100644 index 00000000000..f74eb03f05a --- /dev/null +++ b/test/hotCases/worker/move-between-runtime/test.filter.js @@ -0,0 +1,5 @@ +const supportsWorker = require("../../../helpers/supportsWorker"); + +module.exports = function (config) { + return supportsWorker(); +}; diff --git a/test/hotCases/worker/move-between-runtime/worker.js b/test/hotCases/worker/move-between-runtime/worker.js new file mode 100644 index 00000000000..abc9496a74f --- /dev/null +++ b/test/hotCases/worker/move-between-runtime/worker.js @@ -0,0 +1,18 @@ +export default fn => { + self.onmessage = async ({ data: msg }) => { + try { + switch (msg) { + case "next": + if (!(await import.meta.webpackHot.check(true))) + throw new Error("No update found"); + await fn(); + self.postMessage("next"); + break; + default: + throw new Error("Unexpected message"); + } + } catch (e) { + self.postMessage("error: " + e.stack); + } + }; +}; diff --git a/test/hotCases/worker/move-between-runtime/workerA.js b/test/hotCases/worker/move-between-runtime/workerA.js new file mode 100644 index 00000000000..a20355e750d --- /dev/null +++ b/test/hotCases/worker/move-between-runtime/workerA.js @@ -0,0 +1,5 @@ +import worker from "./worker"; +import "./moduleA"; +worker(() => import(/* webpackChunkName: "shared" */ "./moduleAs")); +import.meta.webpackHot.accept("./moduleA"); +import.meta.webpackHot.accept("./moduleAs"); diff --git a/test/hotCases/worker/move-between-runtime/workerB.js b/test/hotCases/worker/move-between-runtime/workerB.js new file mode 100644 index 00000000000..e35f2802de4 --- /dev/null +++ b/test/hotCases/worker/move-between-runtime/workerB.js @@ -0,0 +1,5 @@ +import worker from "./worker"; +import "./moduleB"; +worker(() => import(/* webpackChunkName: "shared" */ "./moduleBs")); +import.meta.webpackHot.accept("./moduleB"); +import.meta.webpackHot.accept("./moduleBs"); diff --git a/test/hotCases/worker/remove-add-worker/compute.js b/test/hotCases/worker/remove-add-worker/compute.js new file mode 100644 index 00000000000..aaa08452ea8 --- /dev/null +++ b/test/hotCases/worker/remove-add-worker/compute.js @@ -0,0 +1,70 @@ +export default () => Promise.resolve(42); +--- +export default async () => { + const worker = new Worker(new URL("worker.js", import.meta.url)); + const result = await new Promise((resolve, reject) => { + worker.onmessage = ({ data }) => { + if(typeof data === "string") { + reject(new Error(data)); + } else { + resolve(data); + } + }; + worker.postMessage("compute"); + }); + await worker.terminate(); + return result; +} +--- +export default () => Promise.resolve(42); +--- +export default async () => { + const worker = new Worker(new URL("worker.js", import.meta.url)); + const result = await new Promise((resolve, reject) => { + worker.onmessage = ({ data }) => { + if(typeof data === "string") { + reject(new Error(data)); + } else { + resolve(data); + } + }; + worker.postMessage("compute"); + }); + await worker.terminate(); + return result; +} +--- +if(Math.random() < 0) { + new Worker(new URL("worker.js?1", import.meta.url)); +} +export default async () => { + const worker = new Worker(new URL("worker.js", import.meta.url)); + const result = await new Promise((resolve, reject) => { + worker.onmessage = ({ data }) => { + if(typeof data === "string") { + reject(new Error(data)); + } else { + resolve(data); + } + }; + worker.postMessage("compute"); + }); + await worker.terminate(); + return result; +} +--- +export default async () => { + const worker = new Worker(new URL("worker.js", import.meta.url)); + const result = await new Promise((resolve, reject) => { + worker.onmessage = ({ data }) => { + if(typeof data === "string") { + reject(new Error(data)); + } else { + resolve(data); + } + }; + worker.postMessage("compute"); + }); + await worker.terminate(); + return result; +} diff --git a/test/hotCases/worker/remove-add-worker/index.js b/test/hotCases/worker/remove-add-worker/index.js new file mode 100644 index 00000000000..0499b18fe10 --- /dev/null +++ b/test/hotCases/worker/remove-add-worker/index.js @@ -0,0 +1,22 @@ +import compute from "./compute"; + +const update = () => + new Promise((resolve, reject) => { + NEXT(require("../../update")(reject, true, resolve)); + }); + +it("should support adding and removing runtimes", async () => { + expect(await compute()).toBe(42); + await update(); + expect(await compute()).toBe(42); + await update(); + expect(await compute()).toBe(42); + await update(); + expect(await compute()).toBe(42); + await update(); + expect(await compute()).toBe(42); + await update(); + expect(await compute()).toBe(42); +}); + +import.meta.webpackHot.accept("./compute"); diff --git a/test/hotCases/worker/remove-add-worker/test.filter.js b/test/hotCases/worker/remove-add-worker/test.filter.js new file mode 100644 index 00000000000..b3c3b4c2e2b --- /dev/null +++ b/test/hotCases/worker/remove-add-worker/test.filter.js @@ -0,0 +1,5 @@ +const supportsWorker = require("../../../helpers/supportsWorker"); + +module.exports = function (config) { + return supportsWorker() && config.target !== "async-node"; +}; diff --git a/test/hotCases/worker/remove-add-worker/worker.js b/test/hotCases/worker/remove-add-worker/worker.js new file mode 100644 index 00000000000..57ed69dc1fa --- /dev/null +++ b/test/hotCases/worker/remove-add-worker/worker.js @@ -0,0 +1,8 @@ +self.onmessage = async ({ data }) => { + try { + if (data !== "compute") throw new Error("expected compute message"); + self.postMessage(42); + } catch (e) { + self.postMessage("error: " + e.stack); + } +}; diff --git a/test/hotCases/worker/update-in-worker/index.js b/test/hotCases/worker/update-in-worker/index.js new file mode 100644 index 00000000000..af333e73e64 --- /dev/null +++ b/test/hotCases/worker/update-in-worker/index.js @@ -0,0 +1,18 @@ +it("should support hot module replacement in WebWorkers", done => { + const worker = new Worker(new URL("worker.js", import.meta.url)); + worker.onmessage = ({ data: msg }) => { + switch (msg) { + case "next": + NEXT(() => { + worker.postMessage("next"); + }); + break; + case "done": + Promise.resolve(worker.terminate()).then(() => done(), done); + break; + default: + throw new Error(`Unexpected message: ${msg}`); + } + }; + worker.postMessage("test"); +}); diff --git a/test/hotCases/worker/update-in-worker/module.js b/test/hotCases/worker/update-in-worker/module.js new file mode 100644 index 00000000000..05b3ed818e2 --- /dev/null +++ b/test/hotCases/worker/update-in-worker/module.js @@ -0,0 +1,7 @@ +export default 1; +--- +export default 2; +--- +export default 3; +--- +export default 42; diff --git a/test/hotCases/worker/update-in-worker/test.filter.js b/test/hotCases/worker/update-in-worker/test.filter.js new file mode 100644 index 00000000000..f74eb03f05a --- /dev/null +++ b/test/hotCases/worker/update-in-worker/test.filter.js @@ -0,0 +1,5 @@ +const supportsWorker = require("../../../helpers/supportsWorker"); + +module.exports = function (config) { + return supportsWorker(); +}; diff --git a/test/hotCases/worker/update-in-worker/worker.js b/test/hotCases/worker/update-in-worker/worker.js new file mode 100644 index 00000000000..3af3bbacb3f --- /dev/null +++ b/test/hotCases/worker/update-in-worker/worker.js @@ -0,0 +1,28 @@ +import module from "./module"; + +let counter = 1; + +self.onmessage = async ({ data: msg }) => { + try { + switch (msg) { + case "next": + await import.meta.webpackHot.check(true); + case "test": + if (module === 42 && counter === 4) { + self.postMessage("done"); + break; + } + if (module !== counter) + throw new Error(`module (${module}) should be ${counter}`); + counter++; + self.postMessage("next"); + break; + default: + throw new Error("Unexpected message"); + } + } catch (e) { + self.postMessage("error: " + e.stack); + } +}; + +import.meta.webpackHot.accept("./module"); diff --git a/test/hotPlayground/webpack.config.js b/test/hotPlayground/webpack.config.js index 0b5093d463e..40eb89955ba 100644 --- a/test/hotPlayground/webpack.config.js +++ b/test/hotPlayground/webpack.config.js @@ -1,11 +1,13 @@ -var webpack = require("../../"); +const webpack = require("../../"); + +/** @type {import("../../").Configuration} */ module.exports = { entry: ["../../hot/dev-server", "./index.js"], output: { filename: "bundle.js", - hotUpdateChunkFilename: "[id].[hash].bundle-update.js", + hotUpdateChunkFilename: "[id].[fullhash].bundle-update.js", hashDigestLength: 4 }, plugins: [new webpack.HotModuleReplacementPlugin()], - recordsPath: __dirname + "/records.json" // this is not required for the webpack-dev-server, but when compiled. + recordsPath: `${__dirname}/records.json` // this is not required for the webpack-dev-server, but when compiled. }; diff --git a/test/identifier.unittest.js b/test/identifier.unittest.js index 19a2990d9a2..6b087483783 100644 --- a/test/identifier.unittest.js +++ b/test/identifier.unittest.js @@ -1,4 +1,3 @@ -/* globals describe, beforeEach, it */ "use strict"; const identifierUtil = require("../lib/util/identifier"); @@ -6,18 +5,118 @@ const identifierUtil = require("../lib/util/identifier"); describe("util/identifier", () => { describe("makePathsRelative", () => { describe("given a context and a pathConstruct", () => { - let context, pathConstruct, expected; - beforeEach(() => { - context = "/some/dir/"; - pathConstruct = "/some/dir/to/somewhere|some/other/dir!../more/dir"; - expected = "to/somewhere|some/other/dir!../more/dir"; - }); - it("computes the correct relative results for the path construct", () => { - expect(identifierUtil.makePathsRelative(context, pathConstruct)).toBe( - expected - ); + for (const [context, pathConstruct, expected] of [ + [ + "/some/dir/", + "/some/dir/to/somewhere|some/other/dir!../more/dir", + "./to/somewhere|some/other/dir!../more/dir" + ], + [ + "/dir/", + "/dir/to/somewhere|some/other/dir!../more/dir", + "./to/somewhere|some/other/dir!../more/dir" + ], + [ + "/", + "/dir/to/somewhere|some/other/dir!../more/dir", + "./dir/to/somewhere|some/other/dir!../more/dir" + ], + [ + "c:\\some\\dir\\", + "c:\\some\\dir\\to\\somewhere|some/other/dir!../more/dir", + "./to/somewhere|some/other/dir!../more/dir" + ], + [ + "c:\\some\\dir\\", + "C:\\some\\dir\\to\\somewhere|some/other/dir!../more/dir", + "./to/somewhere|some/other/dir!../more/dir" + ], + [ + "C:\\some\\dir", + "C:\\some\\dir\\to\\somewhere|some/other/dir!../more/dir", + "./to/somewhere|some/other/dir!../more/dir" + ], + [ + "C:\\\\some\\dir", + "c:\\some\\\\dir\\to\\\\somewhere|some/other/dir!../more/dir", + "./to/somewhere|some/other/dir!../more/dir" + ], + ["/dir", "/dir/to/somewhere??ref-123", "./to/somewhere??ref-123"] + ]) { + expect(identifierUtil.makePathsRelative(context, pathConstruct)).toBe( + expected + ); + } }); }); }); + + describe("getUndoPath", () => { + const cases = [ + ["file.js", ""], + ["file.js", "./", true], + ["dir/file.js", "../"], + ["dir/file.js", "../", true], + ["./file.js", ""], + [".dir/file.js", "../"], + ["./dir/file.js", "../"], + ["./dir/././file.js", "../"], + ["./dir/../file.js", ""], + ["./dir/../file.js", "./", true], + ["../file.js", "d/"], + ["../file.js", "./d/", true], + ["../dir/file.js", "../d/"], + [".././../dir/file.js", "../c/d/"], + ["./.././../dir/file.js", "../c/d/"], + ["../dir/../file.js", "d/"], + ["../dir/../file.js", "./d/", true] + ]; + for (const [filename, expected, enforceRelative] of cases) { + it(`should handle ${filename} correctly${ + enforceRelative ? " (enforced relative path)" : "" + }`, () => { + for (const outputPath of [ + "/a/b/c/d", + "C:\\a\\b\\c\\d", + "/a/b/c/d/", + "C:\\a\\b\\c\\d\\" + ]) { + expect( + identifierUtil.getUndoPath(filename, outputPath, enforceRelative) + ).toBe(expected); + } + }); + } + }); + + describe("parseResourceWithoutFragment", () => { + // [input, expectedPath, expectedQuery] + /** @type {[string, string, string][]} */ + const cases = [ + ["path#hash?query", "path#hash", "?query"], + ["path?query#hash", "path", "?query#hash"], + ["\0#path\0??\0#query#hash", "#path?", "?#query#hash"], + [ + './loader.js?{"items":["a\0^","b\0!","c#","d"]}', + "./loader.js", + '?{"items":["a^","b!","c#","d"]}' + ], + [ + "C:\\Users\\\0#\\repo\\loader.js?", + "C:\\Users\\#\\repo\\loader.js", + "?" + ], + ["/Users/\0#/repo/loader-\0#.js", "/Users/#/repo/loader-#.js", ""] + ]; + for (const case_ of cases) { + it(case_[0], () => { + const { resource, path, query } = + identifierUtil.parseResourceWithoutFragment(case_[0]); + expect(case_[0]).toBe(resource); + expect(case_[1]).toBe(path); + expect(case_[2]).toBe(query); + }); + } + }); }); diff --git a/test/memoryLimitCases/json/index.js b/test/memoryLimitCases/json/index.js new file mode 100644 index 00000000000..e26e551f1bb --- /dev/null +++ b/test/memoryLimitCases/json/index.js @@ -0,0 +1 @@ +const ctx = require.context("./src", false, /\.json$/); diff --git a/test/memoryLimitCases/json/src/1.json b/test/memoryLimitCases/json/src/1.json new file mode 100644 index 00000000000..f70778b2e2d --- /dev/null +++ b/test/memoryLimitCases/json/src/1.json @@ -0,0 +1 @@ +{"type":"Topology","box":[-73.9958013,45.3984821,-73.4742952,45.7047897],"transform":{"scale":[0.0005225512024048059,0.00030692144288576825],"translate":[-73.9958013,45.3984821]},"objects":{"boundary":{"type":"Polygon","arcs":[[0]],"id":"relation/8508277","properties":{"admin_level":"6","alt_name:1":"Montréal","boundary":"administrative","name":"Agglomération de Montréal","name:en":"Urban agglomeration of Montreal","name:fr":"Agglomération de Montréal","type":"boundary","wikidata":"Q2826806","wikipedia":"fr:Agglomération de Montréal","id":"relation/8508277"}}},"arcs":[[[992,804],[-2,23],[-15,31],[-3,32],[4,45],[12,24],[2,14],[5,9],[3,8],[-4,7],[-23,-3],[-4,4],[-8,-1],[-5,-2],[-22,-7],[-18,-7],[-10,-1],[-8,-25],[-5,-18],[-6,-11],[-11,-9],[-18,-14],[-29,-31],[-25,-20],[-6,-5],[-53,-44],[-17,-21],[-14,-17],[-17,-22],[-3,-9],[-6,-16],[-5,-24],[-2,-6],[-6,-22],[-13,-25],[-11,-21],[-5,-11],[-2,-3],[-12,-28],[-1,-3],[-1,-25],[-11,-22],[-2,-3],[-1,-4],[-3,-8],[0,-2],[-4,-6],[-6,-6],[-23,-7],[-7,-3],[-6,-3],[-14,-11],[-6,-11],[-11,-7],[-7,-3],[-3,-1],[-16,-17],[-11,-8],[-8,-5],[-3,-5],[-9,-22],[-11,-3],[-11,-8],[-5,-10],[-5,-5],[-4,-1],[-10,-3],[-27,3],[-20,4],[-11,9],[-8,0],[-10,7],[-15,-5],[-5,0],[-21,8],[-20,0],[-2,-2],[-3,-1],[-3,-4],[-7,-12],[-3,-3],[-1,-1],[-2,-1],[-2,1],[-6,12],[-8,4],[-3,5],[-1,5],[-7,1],[-14,1],[-7,0],[-8,3],[-11,6],[-7,5],[-7,6],[-11,-4],[-11,-9],[-6,-7],[-7,-12],[-8,-11],[-7,-9],[-21,-21],[-19,-13],[-14,-19],[-10,-19],[-5,-16],[-7,-13],[-11,-26],[-14,-17],[-15,-20],[-10,-6],[-12,-4],[-4,0],[5,-17],[0,-3],[1,-2],[1,-6],[3,-10],[2,-12],[2,-9],[2,-9],[2,-5],[2,-19],[0,-25],[10,-13],[17,-16],[14,-14],[5,-6],[6,-7],[2,-2],[1,0],[1,-1],[1,0],[11,-5],[6,-3],[2,-1],[6,0],[16,1],[21,2],[12,5],[13,3],[3,2],[6,3],[2,2],[8,7],[12,5],[5,2],[3,0],[4,0],[6,-2],[18,-9],[13,-5],[25,-6],[36,-6],[29,-3],[9,-2],[22,-5],[7,11],[4,7],[5,7],[5,4],[1,1],[3,4],[7,5],[7,5],[8,4],[9,6],[8,5],[12,8],[49,5],[14,1],[5,1],[13,2],[45,1],[12,1],[12,0],[4,0],[8,-1],[11,-2],[8,-3],[9,-3],[12,-5],[3,-2],[6,-3],[18,-10],[10,-6],[9,-3],[5,-1],[1,0],[7,-1],[2,0],[12,1],[13,1],[16,1],[6,1],[7,1],[36,4],[24,4],[15,4],[20,7],[13,8],[7,5],[4,3],[14,14],[9,15],[7,21],[2,7],[3,26],[1,14],[-1,23],[0,5],[0,5],[0,21],[-2,7],[-2,7],[-5,16],[-2,23],[-1,6],[-4,10],[7,5],[2,1],[1,3],[1,1],[2,2],[3,4],[-1,5],[2,2],[-2,10],[-3,16],[-8,45],[-2,7],[0,3],[-2,9],[0,3],[-4,29],[-2,10],[19,25],[14,32],[10,25],[14,35],[1,4],[0,17],[3,18],[-4,33],[-2,25],[3,20],[4,12],[17,40],[9,21],[4,11],[10,33]]]} diff --git a/test/memoryLimitCases/json/src/2.json b/test/memoryLimitCases/json/src/2.json new file mode 100644 index 00000000000..33726beae05 --- /dev/null +++ b/test/memoryLimitCases/json/src/2.json @@ -0,0 +1 @@ +{"type":"Topology","objects":{"da_polygons":{"type":"GeometryCollection","geometries":[{"type":"Polygon","arcs":[[0,1,2,3]],"properties":{"id":"24661006","dp":8931,"de":1335}},{"type":"Polygon","arcs":[[4,5,-3,6]],"properties":{"id":"24661007","dp":10647,"de":1878}},{"type":"Polygon","arcs":[[7,-5,8,9]],"properties":{"id":"24661008","dp":16943,"de":0}},{"type":"Polygon","arcs":[[10,11,12,13,-10,14]],"properties":{"id":"24661009","dp":12530,"de":0}},{"type":"Polygon","arcs":[[15,-12,16,17]],"properties":{"id":"24661010","dp":9438,"de":702}},{"type":"Polygon","arcs":[[-16,18,19,20,21]],"properties":{"id":"24661011","dp":8010,"de":0}},{"type":"Polygon","arcs":[[-13,-22,22,23,24]],"properties":{"id":"24661012","dp":11850,"de":2286}},{"type":"Polygon","arcs":[[-14,-25,25,26,27,-8]],"properties":{"id":"24661013","dp":14048,"de":0}},{"type":"Polygon","arcs":[[-28,28,29,30,-6]],"properties":{"id":"24661014","dp":13125,"de":937}},{"type":"Polygon","arcs":[[-4,-31,31,32]],"properties":{"id":"24661015","dp":9751,"de":0}},{"type":"Polygon","arcs":[[-33,33,34,35,36]],"properties":{"id":"24661016","dp":11366,"de":3096}},{"type":"Polygon","arcs":[[37,38,39,40,41,-36,42]],"properties":{"id":"24661017","dp":12016,"de":2796}},{"type":"Polygon","arcs":[[43,44,-39,45,46]],"properties":{"id":"24661018","dp":11687,"de":0}},{"type":"Polygon","arcs":[[-46,-38,47,48,49]],"properties":{"id":"24661019","dp":12350,"de":0}},{"type":"Polygon","arcs":[[50,-47,-50,51,52]],"properties":{"id":"24661020","dp":9967,"de":0}},{"type":"Polygon","arcs":[[-52,-49,53,54,55,56]],"properties":{"id":"24661021","dp":7994,"de":1432}},{"type":"Polygon","arcs":[[-56,57,58,59,60,61]],"properties":{"id":"24661022","dp":5211,"de":1785}},{"type":"Polygon","arcs":[[62,63,-57,-62,64]],"properties":{"id":"24661023","dp":6243,"de":582}},{"type":"Polygon","arcs":[[-65,-61,65,66,67,68]],"properties":{"id":"24661024","dp":5485,"de":0}},{"type":"Polygon","arcs":[[69,70,71,-66]],"properties":{"id":"24661025","dp":7364,"de":0}},{"type":"Polygon","arcs":[[-70,-60,72,73,74]],"properties":{"id":"24661026","dp":10337,"de":1466}},{"type":"Polygon","arcs":[[75,76,77,78,-71,-75]],"properties":{"id":"24661027","dp":12164,"de":1903}},{"type":"Polygon","arcs":[[79,80,-76,-74,81]],"properties":{"id":"24661028","dp":11862,"de":0}},{"type":"Polygon","arcs":[[82,83,-77,-81,84]],"properties":{"id":"24661029","dp":13911,"de":0}},{"type":"Polygon","arcs":[[85,86,87,-85,-80,88]],"properties":{"id":"24661030","dp":19910,"de":0}},{"type":"Polygon","arcs":[[-87,89,90]],"properties":{"id":"24661031","dp":19144,"de":0}},{"type":"Polygon","arcs":[[-83,-88,-91,91,92,93,94,95]],"properties":{"id":"24661032","dp":7816,"de":7672}},{"type":"Polygon","arcs":[[96,-92,-90,-86,97]],"properties":{"id":"24661033","dp":15840,"de":0}},{"type":"Polygon","arcs":[[98,-98,99,100]],"properties":{"id":"24661034","dp":14082,"de":0}},{"type":"Polygon","arcs":[[101,-93,-97,-99,102]],"properties":{"id":"24661035","dp":13138,"de":1666}},{"type":"Polygon","arcs":[[103,104,105,106]],"properties":{"id":"24660626","dp":11270,"de":0}},{"type":"Polygon","arcs":[[107,108,-104,109]],"properties":{"id":"24660627","dp":9435,"de":0}},{"type":"Polygon","arcs":[[110,-110,-107,111,112,113,114,115]],"properties":{"id":"24660628","dp":3679,"de":3326}},{"type":"Polygon","arcs":[[116,117,118,-111]],"properties":{"id":"24660629","dp":48819,"de":4658}},{"type":"Polygon","arcs":[[119,120,121,-118,122]],"properties":{"id":"24660630","dp":4054,"de":851}},{"type":"Polygon","arcs":[[123,124,125,-123,126,127]],"properties":{"id":"24660631","dp":6140,"de":1321}},{"type":"Polygon","arcs":[[128,129,-120,-126,130]],"properties":{"id":"24660632","dp":4964,"de":0}},{"type":"Polygon","arcs":[[131,-131,-125,132,133,134]],"properties":{"id":"24660633","dp":4795,"de":6787}},{"type":"Polygon","arcs":[[135,136,137,-132,138,139]],"properties":{"id":"24660634","dp":4116,"de":1223}},{"type":"Polygon","arcs":[[140,141,142,143,-136]],"properties":{"id":"24660635","dp":8631,"de":1131}},{"type":"Polygon","arcs":[[144,145,-141,146]],"properties":{"id":"24660636","dp":9930,"de":2797}},{"type":"Polygon","arcs":[[-147,-140,147,148]],"properties":{"id":"24660637","dp":12431,"de":0}},{"type":"Polygon","arcs":[[-148,-139,-135,149,150]],"properties":{"id":"24660638","dp":8941,"de":1274}},{"type":"Polygon","arcs":[[-150,-134,151,152]],"properties":{"id":"24660639","dp":10337,"de":1054}},{"type":"Polygon","arcs":[[153,-153,154,155]],"properties":{"id":"24660640","dp":7798,"de":3731}},{"type":"Polygon","arcs":[[-155,156,157,158]],"properties":{"id":"24660641","dp":11155,"de":3361}},{"type":"Polygon","arcs":[[-158,159,160,161,162]],"properties":{"id":"24660642","dp":10407,"de":4184}},{"type":"Polygon","arcs":[[-162,163,164,165,166]],"properties":{"id":"24660643","dp":12951,"de":8280}},{"type":"Polygon","arcs":[[167,168,-166,169,170]],"properties":{"id":"24660644","dp":9054,"de":2215}},{"type":"Polygon","arcs":[[-165,171,172,173,174,175,-170]],"properties":{"id":"24660645","dp":11651,"de":2816}},{"type":"Polygon","arcs":[[176,-171,-176,177,178,179,180,181,182]],"properties":{"id":"24660646","dp":6723,"de":3837}},{"type":"Polygon","arcs":[[183,184,185,186,-181,187,188]],"properties":{"id":"24660649","dp":9487,"de":1370}},{"type":"Polygon","arcs":[[-189,189,-179,190,191,192]],"properties":{"id":"24660650","dp":4420,"de":2155}},{"type":"Polygon","arcs":[[-192,193,194,195,196,197]],"properties":{"id":"24660652","dp":9408,"de":869}},{"type":"Polygon","arcs":[[198,199,-195,200]],"properties":{"id":"24660654","dp":3356,"de":0}},{"type":"Polygon","arcs":[[201,202,203,204,205,-199]],"properties":{"id":"24660655","dp":6279,"de":3761}},{"type":"Polygon","arcs":[[206,207,-196,-200,-206]],"properties":{"id":"24660656","dp":16096,"de":1470}},{"type":"Polygon","arcs":[[-205,208,209,210,211,-207]],"properties":{"id":"24660657","dp":14502,"de":974}},{"type":"Polygon","arcs":[[212,213,214,215,216]],"properties":{"id":"24661144","dp":17838,"de":1781}},{"type":"Polygon","arcs":[[-216,217,218]],"properties":{"id":"24661145","dp":14407,"de":0}},{"type":"Polygon","arcs":[[219,-219,220,221,222,223]],"properties":{"id":"24661146","dp":10811,"de":7711}},{"type":"Polygon","arcs":[[224,225,226,227]],"properties":{"id":"24663242","dp":135547,"de":31021}},{"type":"Polygon","arcs":[[-226,228,229,230]],"properties":{"id":"24663243","dp":74527,"de":15540}},{"type":"Polygon","arcs":[[231,-201,-194,-191]],"properties":{"id":"24663244","dp":15460,"de":1381}},{"type":"Polygon","arcs":[[232,233,234,235,236]],"properties":{"id":"24663245","dp":28870,"de":2258}},{"type":"Polygon","arcs":[[237,238,239,240,241,242,243]],"properties":{"id":"24663215","dp":11166,"de":5263}},{"type":"Polygon","arcs":[[244,245,246,247,248,249,250,251,252,253,254]],"properties":{"id":"24663216","dp":1357,"de":364}},{"type":"Polygon","arcs":[[255,256,257,258,-249,259]],"properties":{"id":"24663217","dp":5669,"de":873}},{"type":"Polygon","arcs":[[260,-260,-248,261]],"properties":{"id":"24663218","dp":4290,"de":1018}},{"type":"Polygon","arcs":[[-259,262,263,-250]],"properties":{"id":"24663219","dp":9313,"de":0}},{"type":"Polygon","arcs":[[-258,264,265,266,267,268,269,270,-263]],"properties":{"id":"24663220","dp":3197,"de":1020}},{"type":"Polygon","arcs":[[-264,-271,271,272,-251]],"properties":{"id":"24663221","dp":11214,"de":0}},{"type":"Polygon","arcs":[[-270,273,274,275,-272]],"properties":{"id":"24663222","dp":9621,"de":0}},{"type":"Polygon","arcs":[[-273,-276,276,277,278,-252]],"properties":{"id":"24663223","dp":11269,"de":0}},{"type":"Polygon","arcs":[[279,280,281,282,283,284,285,286]],"properties":{"id":"24663227","dp":3208,"de":243}},{"type":"Polygon","arcs":[[287,288,-284]],"properties":{"id":"24663228","dp":9806,"de":1320}},{"type":"Polygon","arcs":[[-285,-289,289,290,291,292,293]],"properties":{"id":"24663229","dp":2759,"de":1023}},{"type":"Polygon","arcs":[[294,295,296,-292]],"properties":{"id":"24663230","dp":8375,"de":1160}},{"type":"Polygon","arcs":[[297,298,299,300,-296]],"properties":{"id":"24663231","dp":10815,"de":998}},{"type":"Polygon","arcs":[[301,302,303,304,-298,305]],"properties":{"id":"24663232","dp":7492,"de":3592}},{"type":"Polygon","arcs":[[306,307,308,309,-300]],"properties":{"id":"24663233","dp":7652,"de":0}},{"type":"Polygon","arcs":[[-309,310,311,312,313]],"properties":{"id":"24663234","dp":9826,"de":1391}},{"type":"Polygon","arcs":[[-297,-301,-310,-314,314,315,316,317,318]],"properties":{"id":"24663235","dp":8550,"de":1062}},{"type":"Polygon","arcs":[[-286,319,320,321,-293,-319,322,323,324,325,326]],"properties":{"id":"24663236","dp":1908,"de":0}},{"type":"Polygon","arcs":[[327,-324]],"properties":{"id":"24663237","dp":12585,"de":0}},{"type":"Polygon","arcs":[[-321,328]],"properties":{"id":"24663238","dp":12077,"de":0}},{"type":"Polygon","arcs":[[-294,-322,-329,-320]],"properties":{"id":"24663239","dp":9419,"de":0}},{"type":"Polygon","arcs":[[329,330,331,332,333,334,335,336,337,338,339]],"properties":{"id":"24663241","dp":9132,"de":3526}},{"type":"Polygon","arcs":[[340,341,342,343,344]],"properties":{"id":"24663315","dp":6316,"de":663}},{"type":"Polygon","arcs":[[-345,345]],"properties":{"id":"24663316","dp":17073,"de":0}},{"type":"Polygon","arcs":[[346,347,348,-342,349]],"properties":{"id":"24663317","dp":6559,"de":940}},{"type":"Polygon","arcs":[[350,351,-347,352]],"properties":{"id":"24663318","dp":13324,"de":0}},{"type":"Polygon","arcs":[[-352,353,354,355,-348]],"properties":{"id":"24663319","dp":5197,"de":591}},{"type":"Polygon","arcs":[[356,-247,357,-356]],"properties":{"id":"24663320","dp":8801,"de":4778}},{"type":"Polygon","arcs":[[-349,-358,-246,358,-343]],"properties":{"id":"24663321","dp":4576,"de":2380}},{"type":"Polygon","arcs":[[359,360,361,362,363,364]],"properties":{"id":"24663322","dp":5794,"de":2158}},{"type":"Polygon","arcs":[[365,-361,366]],"properties":{"id":"24663323","dp":14574,"de":0}},{"type":"Polygon","arcs":[[367,368,369,-362,-366,370]],"properties":{"id":"24663324","dp":14421,"de":0}},{"type":"Polygon","arcs":[[371,372,-369,373]],"properties":{"id":"24663325","dp":15522,"de":0}},{"type":"Polygon","arcs":[[374,375,376,-374,-368,377]],"properties":{"id":"24663326","dp":10725,"de":1170}},{"type":"Polygon","arcs":[[-377,378,379,380,-372]],"properties":{"id":"24663327","dp":17213,"de":0}},{"type":"Polygon","arcs":[[-381,381,-363,-370,-373]],"properties":{"id":"24663328","dp":15796,"de":1851}},{"type":"Polygon","arcs":[[382,383,384,385,386,387,388,389,390,391,392,393,394,395,396]],"properties":{"id":"24663329","dp":0,"de":296}},{"type":"Polygon","arcs":[[397,398,399,400,401,402,403,404]],"properties":{"id":"24663330","dp":4436,"de":5953}},{"type":"Polygon","arcs":[[405,406,407,-399,408]],"properties":{"id":"24663331","dp":11992,"de":1562}},{"type":"Polygon","arcs":[[409,410,-406,411,412]],"properties":{"id":"24663332","dp":14081,"de":2551}},{"type":"Polygon","arcs":[[413,414,415,-410,416]],"properties":{"id":"24663333","dp":8329,"de":1540}},{"type":"Polygon","arcs":[[417,418,419,420,421,422,423,424,425]],"properties":{"id":"24660037","dp":6132,"de":0}},{"type":"Polygon","arcs":[[426,427,428,429,-419,430]],"properties":{"id":"24660038","dp":9844,"de":0}},{"type":"Polygon","arcs":[[431,-427,432]],"properties":{"id":"24660039","dp":11381,"de":0}},{"type":"Polygon","arcs":[[433,434,435,-428,-432]],"properties":{"id":"24660040","dp":4262,"de":404}},{"type":"Polygon","arcs":[[436,-434,-433,-431,-418,437,438]],"properties":{"id":"24660041","dp":3909,"de":348}},{"type":"Polygon","arcs":[[439,-438,-426,440]],"properties":{"id":"24660042","dp":9275,"de":0}},{"type":"Polygon","arcs":[[-425,441,-441]],"properties":{"id":"24660043","dp":10046,"de":0}},{"type":"Polygon","arcs":[[442,-440,-442,-424,443,444,445,446]],"properties":{"id":"24660044","dp":3139,"de":1321}},{"type":"Polygon","arcs":[[447,-446,448,449,450]],"properties":{"id":"24660045","dp":2288,"de":0}},{"type":"Polygon","arcs":[[-439,-443,451,452]],"properties":{"id":"24660046","dp":4770,"de":478}},{"type":"Polygon","arcs":[[453,454,455,456,457,-435,-437,-453,458]],"properties":{"id":"24660047","dp":2550,"de":2172}},{"type":"Polygon","arcs":[[459,460,461,-455,462]],"properties":{"id":"24660048","dp":6159,"de":1346}},{"type":"Polygon","arcs":[[463,464,465,-456,-462,466]],"properties":{"id":"24660049","dp":5493,"de":681}},{"type":"Polygon","arcs":[[467,-464,468]],"properties":{"id":"24660050","dp":9764,"de":0}},{"type":"Polygon","arcs":[[469,470,-469,-467,-461,471,472]],"properties":{"id":"24660051","dp":4193,"de":0}},{"type":"Polygon","arcs":[[473,474,-472,-460,475]],"properties":{"id":"24660052","dp":7412,"de":1105}},{"type":"Polygon","arcs":[[476,-473,-475,477]],"properties":{"id":"24660053","dp":6310,"de":0}},{"type":"Polygon","arcs":[[478,479,-478,-474,480,481,482]],"properties":{"id":"24660054","dp":4320,"de":724}},{"type":"Polygon","arcs":[[483,484,485,-479]],"properties":{"id":"24660055","dp":9536,"de":0}},{"type":"Polygon","arcs":[[486,-485,487]],"properties":{"id":"24660056","dp":4995,"de":0}},{"type":"Polygon","arcs":[[488,489,490,491,492,493,494,495,496,-488,-484,-483,497]],"properties":{"id":"24660057","dp":338,"de":536}},{"type":"Polygon","arcs":[[498,499,500,501]],"properties":{"id":"24660489","dp":8249,"de":6849}},{"type":"Polygon","arcs":[[502,503,504,-502]],"properties":{"id":"24660490","dp":8603,"de":3262}},{"type":"Polygon","arcs":[[-253,-279,505,506,507,508]],"properties":{"id":"24660141","dp":1836,"de":234}},{"type":"Polygon","arcs":[[509,510,-503,-501,511,512,513,514,515,516,517]],"properties":{"id":"24660491","dp":1351,"de":5936}},{"type":"Polygon","arcs":[[-517,518,519,520]],"properties":{"id":"24660492","dp":13313,"de":0}},{"type":"Polygon","arcs":[[-516,521,522,-519]],"properties":{"id":"24660493","dp":13219,"de":1570}},{"type":"Polygon","arcs":[[-523,523,524,525]],"properties":{"id":"24660494","dp":11926,"de":1361}},{"type":"Polygon","arcs":[[-525,526,527,528]],"properties":{"id":"24660495","dp":9387,"de":1348}},{"type":"Polygon","arcs":[[529,530,531,-527,-524]],"properties":{"id":"24660496","dp":11422,"de":1845}},{"type":"Polygon","arcs":[[-515,-530,-522]],"properties":{"id":"24660497","dp":14505,"de":1692}},{"type":"Polygon","arcs":[[-514,532,533,534,-531]],"properties":{"id":"24660498","dp":10225,"de":1503}},{"type":"Polygon","arcs":[[535,536,537,-534]],"properties":{"id":"24660499","dp":9676,"de":0}},{"type":"Polygon","arcs":[[-533,-513,538,539,540,541,542,543,-536]],"properties":{"id":"24660500","dp":3362,"de":7441}},{"type":"Polygon","arcs":[[-544,544,545,546,547,-537]],"properties":{"id":"24660501","dp":7888,"de":837}},{"type":"Polygon","arcs":[[548,549,-545,-543]],"properties":{"id":"24660502","dp":13405,"de":1811}},{"type":"Polygon","arcs":[[550,551,552,-549,-542]],"properties":{"id":"24660503","dp":7376,"de":874}},{"type":"Polygon","arcs":[[553,554,-551,-541]],"properties":{"id":"24660504","dp":5407,"de":1005}},{"type":"Polygon","arcs":[[555,556,557,-554,-540]],"properties":{"id":"24660505","dp":9900,"de":2490}},{"type":"Polygon","arcs":[[558,559,560,-557,561,562]],"properties":{"id":"24660506","dp":8935,"de":2987}},{"type":"Polygon","arcs":[[563,-563,564]],"properties":{"id":"24660507","dp":10570,"de":1027}},{"type":"Polygon","arcs":[[565,566,567,-559,-564,568]],"properties":{"id":"24660508","dp":6919,"de":1668}},{"type":"Polygon","arcs":[[569,570,-566,571]],"properties":{"id":"24660509","dp":8828,"de":0}},{"type":"Polygon","arcs":[[572,573,-572,-569,-565,-562,-556,-539,574,575]],"properties":{"id":"24660510","dp":1306,"de":8518}},{"type":"Polygon","arcs":[[576,577,578,579,-570,-574]],"properties":{"id":"24660511","dp":4287,"de":468}},{"type":"Polygon","arcs":[[-573,580,581,-577]],"properties":{"id":"24660512","dp":13997,"de":0}},{"type":"Polygon","arcs":[[582,583,584,585,586,587,-581]],"properties":{"id":"24660513","dp":10449,"de":1063}},{"type":"Polygon","arcs":[[588,589,-587]],"properties":{"id":"24660514","dp":9284,"de":0}},{"type":"Polygon","arcs":[[-586,590,591,-589]],"properties":{"id":"24660515","dp":39141,"de":3862}},{"type":"Polygon","arcs":[[-585,592,593,-591]],"properties":{"id":"24660516","dp":26174,"de":1912}},{"type":"Polygon","arcs":[[594,595,596,597,598,-593]],"properties":{"id":"24660517","dp":8932,"de":485}},{"type":"Polygon","arcs":[[599,600,601,602]],"properties":{"id":"24661004","dp":10054,"de":0}},{"type":"Polygon","arcs":[[-1,-37,-42,-601]],"properties":{"id":"24661005","dp":8535,"de":5063}},{"type":"Polygon","arcs":[[603,604,-254,-509,605,606,607,608]],"properties":{"id":"24660142","dp":3728,"de":2421}},{"type":"Polygon","arcs":[[609,610,-609]],"properties":{"id":"24660143","dp":10342,"de":0}},{"type":"Polygon","arcs":[[611,-610,-608,612,613,614]],"properties":{"id":"24660144","dp":15266,"de":722}},{"type":"Polygon","arcs":[[615,-604,-611,616]],"properties":{"id":"24660145","dp":12741,"de":0}},{"type":"Polygon","arcs":[[617,618,-617,-612,619,620,621,622]],"properties":{"id":"24660146","dp":7606,"de":1504}},{"type":"Polygon","arcs":[[-618,623]],"properties":{"id":"24660147","dp":20632,"de":1656}},{"type":"Polygon","arcs":[[624,-255,-605,-616,-619,-624,-623,625]],"properties":{"id":"24660148","dp":1454,"de":5705}},{"type":"Polygon","arcs":[[626,-626,627,628,629,630]],"properties":{"id":"24660149","dp":5561,"de":963}},{"type":"Polygon","arcs":[[631,632,-631,633,634]],"properties":{"id":"24660150","dp":3943,"de":1446}},{"type":"Polygon","arcs":[[635,-635,636,637,638]],"properties":{"id":"24660151","dp":4713,"de":0}},{"type":"Polygon","arcs":[[639,640,-637,-634,-630,641,642,643]],"properties":{"id":"24660152","dp":3337,"de":3856}},{"type":"Polygon","arcs":[[644,-640,645]],"properties":{"id":"24660153","dp":10086,"de":867}},{"type":"Polygon","arcs":[[646,-646,647,648]],"properties":{"id":"24660154","dp":6043,"de":699}},{"type":"Polygon","arcs":[[-649,649,650,651,652]],"properties":{"id":"24660155","dp":8086,"de":942}},{"type":"Polygon","arcs":[[653,-652,654,655,656]],"properties":{"id":"24660156","dp":11496,"de":2733}},{"type":"Polygon","arcs":[[657,-655,-651,658,659,660,661,662,663,664]],"properties":{"id":"24660157","dp":2446,"de":187}},{"type":"Polygon","arcs":[[-665,665,666,667]],"properties":{"id":"24660158","dp":9450,"de":1247}},{"type":"Polygon","arcs":[[668,669,-666,-664]],"properties":{"id":"24660159","dp":16040,"de":0}},{"type":"Polygon","arcs":[[-669,-663,670,671]],"properties":{"id":"24660160","dp":6754,"de":0}},{"type":"Polygon","arcs":[[-662,672,673,-671]],"properties":{"id":"24660161","dp":7033,"de":0}},{"type":"Polygon","arcs":[[-674,674,675]],"properties":{"id":"24660162","dp":9412,"de":0}},{"type":"Polygon","arcs":[[-675,-673,-661,676,677,678,679,680,681,682,683]],"properties":{"id":"24660163","dp":8293,"de":697}},{"type":"Polygon","arcs":[[684,685,-679,686]],"properties":{"id":"24660164","dp":9226,"de":3080}},{"type":"Polygon","arcs":[[687,688,689,690,-685]],"properties":{"id":"24660165","dp":9571,"de":0}},{"type":"Polygon","arcs":[[691,692,693,694]],"properties":{"id":"24660624","dp":17755,"de":2448}},{"type":"Polygon","arcs":[[-112,-106,695,-692]],"properties":{"id":"24660625","dp":16190,"de":1636}},{"type":"Polygon","arcs":[[696,697,698,699,700,701,702]],"properties":{"id":"24660877","dp":8154,"de":0}},{"type":"Polygon","arcs":[[703,704,-698,705]],"properties":{"id":"24660878","dp":13204,"de":0}},{"type":"Polygon","arcs":[[706,707,708,-699,-705]],"properties":{"id":"24660879","dp":14016,"de":0}},{"type":"Polygon","arcs":[[709,710,711,712,713,-707,-704,714]],"properties":{"id":"24660880","dp":5343,"de":1738}},{"type":"Polygon","arcs":[[715,716,-708,-714]],"properties":{"id":"24660881","dp":15212,"de":0}},{"type":"Polygon","arcs":[[-709,-717,717,718,719,-700]],"properties":{"id":"24660882","dp":13107,"de":0}},{"type":"Polygon","arcs":[[-718,-716,-713,720,721,722,723,724]],"properties":{"id":"24660883","dp":6469,"de":524}},{"type":"Polygon","arcs":[[725,726,727,-723]],"properties":{"id":"24660884","dp":8508,"de":732}},{"type":"Polygon","arcs":[[-728,728,729,730,731,-724]],"properties":{"id":"24660885","dp":6490,"de":3685}},{"type":"Polygon","arcs":[[-731,732,733,734,735,736,737]],"properties":{"id":"24660886","dp":11863,"de":2534}},{"type":"Polygon","arcs":[[-737,738,739,740,741]],"properties":{"id":"24660887","dp":15000,"de":0}},{"type":"Polygon","arcs":[[742,743,744,-739,-736]],"properties":{"id":"24660888","dp":15464,"de":0}},{"type":"Polygon","arcs":[[745,746,-743,-735]],"properties":{"id":"24660889","dp":15095,"de":0}},{"type":"Polygon","arcs":[[747,748,749,-744,-747]],"properties":{"id":"24660890","dp":15628,"de":0}},{"type":"Polygon","arcs":[[750,751,752,-748,-746,-734]],"properties":{"id":"24660891","dp":16444,"de":0}},{"type":"Polygon","arcs":[[753,-752]],"properties":{"id":"24660892","dp":12290,"de":0}},{"type":"Polygon","arcs":[[-751,-733,-730,754,755,756,757,758,759,760,761,762,763,-749,-753,-754]],"properties":{"id":"24660893","dp":480,"de":3413}},{"type":"Polygon","arcs":[[-745,-750,-764,764,-740]],"properties":{"id":"24660894","dp":15893,"de":957}},{"type":"Polygon","arcs":[[-741,-765,-763,765,766,767]],"properties":{"id":"24660895","dp":6906,"de":2126}},{"type":"Polygon","arcs":[[-766,-762,768,769]],"properties":{"id":"24660896","dp":13624,"de":0}},{"type":"Polygon","arcs":[[770,771,-767,-770,772]],"properties":{"id":"24660897","dp":17031,"de":0}},{"type":"Polygon","arcs":[[773,774,-771]],"properties":{"id":"24660898","dp":13979,"de":0}},{"type":"Polygon","arcs":[[775,-738,-742,-768,-772,-775,776]],"properties":{"id":"24660899","dp":5594,"de":4325}},{"type":"Polygon","arcs":[[777,-719,-725,-732,-776,778]],"properties":{"id":"24660900","dp":7907,"de":2759}},{"type":"Polygon","arcs":[[779,780,781,782,783,784,785]],"properties":{"id":"24661213","dp":5261,"de":5231}},{"type":"Polygon","arcs":[[-786,786,787,788,789,790,791,792,793]],"properties":{"id":"24661214","dp":6711,"de":933}},{"type":"Polygon","arcs":[[794,795,796,-788]],"properties":{"id":"24661215","dp":18148,"de":1851}},{"type":"Polygon","arcs":[[-797,797,798,-789]],"properties":{"id":"24661216","dp":19680,"de":3723}},{"type":"Polygon","arcs":[[-790,-799,799,800]],"properties":{"id":"24661217","dp":17804,"de":0}},{"type":"Polygon","arcs":[[-791,-801,801,802]],"properties":{"id":"24661218","dp":21421,"de":2696}},{"type":"Polygon","arcs":[[-792,-803,803,804]],"properties":{"id":"24661219","dp":11752,"de":2061}},{"type":"Polygon","arcs":[[-805,805,806,807]],"properties":{"id":"24661220","dp":11693,"de":3674}},{"type":"Polygon","arcs":[[-807,808,809]],"properties":{"id":"24661221","dp":13514,"de":2236}},{"type":"Polygon","arcs":[[-793,-808,-810,810,811,812,813,814]],"properties":{"id":"24661222","dp":8084,"de":3112}},{"type":"Polygon","arcs":[[815,-814,816,817,818,819,820]],"properties":{"id":"24661223","dp":2721,"de":1293}},{"type":"Polygon","arcs":[[821,822,823,824]],"properties":{"id":"24660715","dp":7667,"de":3137}},{"type":"Polygon","arcs":[[825,826,-822,827]],"properties":{"id":"24660716","dp":6704,"de":1787}},{"type":"Polygon","arcs":[[828,829,830,-826,831]],"properties":{"id":"24660717","dp":8223,"de":2919}},{"type":"Polygon","arcs":[[832,833,-830,834]],"properties":{"id":"24660718","dp":7019,"de":3425}},{"type":"Polygon","arcs":[[835,836,-185,-833,837]],"properties":{"id":"24660719","dp":6743,"de":3362}},{"type":"Polygon","arcs":[[838,-187,839,840]],"properties":{"id":"24660722","dp":14111,"de":2439}},{"type":"Polygon","arcs":[[841,842,-182,-839]],"properties":{"id":"24660723","dp":14735,"de":8730}},{"type":"Polygon","arcs":[[843,-183,-843,844]],"properties":{"id":"24660724","dp":13245,"de":1324}},{"type":"Polygon","arcs":[[-844,845,846,847,848,-168,-177]],"properties":{"id":"24660725","dp":6444,"de":2017}},{"type":"Polygon","arcs":[[849,850,-847,851,852,853]],"properties":{"id":"24660726","dp":4920,"de":3063}},{"type":"Polygon","arcs":[[854,855,856,857,858]],"properties":{"id":"24660749","dp":19316,"de":2278}},{"type":"Polygon","arcs":[[-859,859,860,861,862]],"properties":{"id":"24660750","dp":8036,"de":1740}},{"type":"Polygon","arcs":[[-143,863,-861,864]],"properties":{"id":"24660751","dp":11931,"de":956}},{"type":"Polygon","arcs":[[865,866,867,868]],"properties":{"id":"24662884","dp":4529,"de":0}},{"type":"MultiPolygon","arcs":[[[869,870,871,872,-866,873,874]],[[875]]],"properties":{"id":"24662885","dp":1894,"de":308}},{"type":"Polygon","arcs":[[876,877,-870,878]],"properties":{"id":"24662886","dp":7047,"de":0}},{"type":"Polygon","arcs":[[879,880,881,882,-877,883]],"properties":{"id":"24662887","dp":9032,"de":0}},{"type":"Polygon","arcs":[[884,885,886,887,888,889,890]],"properties":{"id":"24662888","dp":3292,"de":263}},{"type":"Polygon","arcs":[[891,892,-886,893]],"properties":{"id":"24662889","dp":6524,"de":0}},{"type":"Polygon","arcs":[[894,895,-894,-885]],"properties":{"id":"24662890","dp":6933,"de":0}},{"type":"Polygon","arcs":[[896,897,-892,-896,898,899]],"properties":{"id":"24662891","dp":7590,"de":0}},{"type":"Polygon","arcs":[[-900,900,901,902]],"properties":{"id":"24662892","dp":5797,"de":0}},{"type":"Polygon","arcs":[[903,-901,904,905,906]],"properties":{"id":"24662893","dp":4546,"de":0}},{"type":"Polygon","arcs":[[-899,-895,-891,907,-905]],"properties":{"id":"24662894","dp":4164,"de":0}},{"type":"Polygon","arcs":[[-908,908,909,910]],"properties":{"id":"24662895","dp":5343,"de":0}},{"type":"Polygon","arcs":[[-906,-911,911,912]],"properties":{"id":"24662896","dp":5953,"de":684}},{"type":"Polygon","arcs":[[913,914,915,916,917,918]],"properties":{"id":"24661583","dp":2600,"de":306}},{"type":"Polygon","arcs":[[919,920,-915,921]],"properties":{"id":"24661584","dp":2784,"de":451}},{"type":"Polygon","arcs":[[922,923,924,-922,-914]],"properties":{"id":"24661585","dp":4379,"de":948}},{"type":"Polygon","arcs":[[-920,-925,925,926,927]],"properties":{"id":"24661586","dp":2973,"de":0}},{"type":"Polygon","arcs":[[-924,928,929,930,931,932,-926]],"properties":{"id":"24661587","dp":3944,"de":657}},{"type":"Polygon","arcs":[[-927,-933,933,934,935]],"properties":{"id":"24661589","dp":2770,"de":840}},{"type":"Polygon","arcs":[[936,-928,-936,937,938,939]],"properties":{"id":"24661590","dp":2453,"de":284}},{"type":"Polygon","arcs":[[-938,-935,940,941,942,943,944,945]],"properties":{"id":"24661591","dp":3828,"de":3190}},{"type":"Polygon","arcs":[[946,947,948]],"properties":{"id":"24662549","dp":6190,"de":0}},{"type":"Polygon","arcs":[[949,950,951,952,-848,-851]],"properties":{"id":"24660727","dp":7519,"de":983}},{"type":"Polygon","arcs":[[953,954,955,956,957,-950,-850]],"properties":{"id":"24660728","dp":8488,"de":2785}},{"type":"Polygon","arcs":[[958,-954,959,960]],"properties":{"id":"24660729","dp":14304,"de":0}},{"type":"Polygon","arcs":[[961,-955,-959,962]],"properties":{"id":"24660730","dp":11732,"de":4385}},{"type":"Polygon","arcs":[[963,-956,-962,964]],"properties":{"id":"24660731","dp":14750,"de":3333}},{"type":"Polygon","arcs":[[965,966,-964,967]],"properties":{"id":"24660732","dp":11921,"de":2156}},{"type":"Polygon","arcs":[[968,969,-966,970]],"properties":{"id":"24660733","dp":8852,"de":2550}},{"type":"Polygon","arcs":[[971,972,973,-957,-967,-970]],"properties":{"id":"24660734","dp":12379,"de":3291}},{"type":"Polygon","arcs":[[974,975,976,-972,977,978]],"properties":{"id":"24660735","dp":9475,"de":846}},{"type":"Polygon","arcs":[[979,980,-978,-969]],"properties":{"id":"24660736","dp":22776,"de":0}},{"type":"Polygon","arcs":[[981,-979,-981]],"properties":{"id":"24660737","dp":21798,"de":1419}},{"type":"Polygon","arcs":[[982,983,984,-982,-980,-971,-968,-965,-963,-961,985,986,987]],"properties":{"id":"24660738","dp":8438,"de":1526}},{"type":"Polygon","arcs":[[988,989,990,991,992,-983,993]],"properties":{"id":"24660741","dp":26512,"de":3914}},{"type":"Polygon","arcs":[[994,995,-991]],"properties":{"id":"24660742","dp":14478,"de":0}},{"type":"Polygon","arcs":[[996,997,998,999,1000,-995,-990]],"properties":{"id":"24660743","dp":5183,"de":0}},{"type":"Polygon","arcs":[[1001,1002,1003]],"properties":{"id":"24661234","dp":9777,"de":0}},{"type":"Polygon","arcs":[[1004,1005,1006]],"properties":{"id":"24661237","dp":5723,"de":0}},{"type":"Polygon","arcs":[[1007,1008,1009,1010,1011,1012,1013]],"properties":{"id":"24661240","dp":3181,"de":8764}},{"type":"Polygon","arcs":[[-1013,1014]],"properties":{"id":"24661241","dp":7276,"de":0}},{"type":"Polygon","arcs":[[1015,-862,-864,-142,-146,1016]],"properties":{"id":"24660752","dp":4836,"de":653}},{"type":"Polygon","arcs":[[1017,1018,-1017,1019,1020]],"properties":{"id":"24660753","dp":4845,"de":1452}},{"type":"Polygon","arcs":[[1021,-1020,-145,1022,1023,-976]],"properties":{"id":"24660754","dp":6224,"de":1491}},{"type":"Polygon","arcs":[[1024,1025,-1021,-1022,-975,-985]],"properties":{"id":"24660755","dp":11419,"de":4481}},{"type":"Polygon","arcs":[[-977,-1024,1026,1027,-973]],"properties":{"id":"24660756","dp":7419,"de":1093}},{"type":"Polygon","arcs":[[-1023,-149,1028,-1027]],"properties":{"id":"24660757","dp":12898,"de":1759}},{"type":"Polygon","arcs":[[-1029,-151,-154,1029]],"properties":{"id":"24660758","dp":7137,"de":1982}},{"type":"Polygon","arcs":[[-974,-1028,-1030,-156,1030,-958]],"properties":{"id":"24660759","dp":5183,"de":3210}},{"type":"Polygon","arcs":[[-1031,-159,1031,-951]],"properties":{"id":"24660760","dp":7373,"de":3006}},{"type":"Polygon","arcs":[[-1032,-163,1032,-952]],"properties":{"id":"24660761","dp":8741,"de":2532}},{"type":"Polygon","arcs":[[-1033,-167,-169,-849,-953]],"properties":{"id":"24660762","dp":10111,"de":4306}},{"type":"Polygon","arcs":[[1033,1034,1035,-865]],"properties":{"id":"24660763","dp":10505,"de":0}},{"type":"Polygon","arcs":[[-1036,1036,1037,1038,-137,-144]],"properties":{"id":"24660764","dp":6917,"de":1820}},{"type":"Polygon","arcs":[[1039,1040,1041,1042,1043,-1037,-1035,1044]],"properties":{"id":"24660765","dp":12311,"de":6182}},{"type":"Polygon","arcs":[[-1044,1045,1046,-1038]],"properties":{"id":"24660766","dp":10347,"de":1544}},{"type":"Polygon","arcs":[[-1043,1047,1048,1049,1050,-1046]],"properties":{"id":"24660767","dp":4532,"de":0}},{"type":"Polygon","arcs":[[-1039,-1047,-1051,1051,1052,1053]],"properties":{"id":"24660768","dp":3583,"de":487}},{"type":"Polygon","arcs":[[-129,-138,-1054,1054,1055,1056]],"properties":{"id":"24660769","dp":4103,"de":612}},{"type":"Polygon","arcs":[[-130,-1057,1057,-121]],"properties":{"id":"24660770","dp":2805,"de":741}},{"type":"Polygon","arcs":[[-1058,-1056,1058,1059,1060,-108,-119,-122]],"properties":{"id":"24660771","dp":2493,"de":396}},{"type":"Polygon","arcs":[[-1061,1061,1062,-109]],"properties":{"id":"24660772","dp":9883,"de":773}},{"type":"Polygon","arcs":[[1063,1064,1065,-1062]],"properties":{"id":"24660773","dp":9652,"de":0}},{"type":"Polygon","arcs":[[-1066,1066,1067,1068]],"properties":{"id":"24660774","dp":15219,"de":1732}},{"type":"Polygon","arcs":[[1069,-1068,1070,1071,1072,1073,1074]],"properties":{"id":"24660775","dp":8818,"de":2140}},{"type":"Polygon","arcs":[[-1075,1075,1076,1077,1078]],"properties":{"id":"24660776","dp":9580,"de":1881}},{"type":"Polygon","arcs":[[-1074,1079,1080,-1076]],"properties":{"id":"24660777","dp":8269,"de":2884}},{"type":"Polygon","arcs":[[1081,-1079,1082,-693]],"properties":{"id":"24660778","dp":11621,"de":4223}},{"type":"Polygon","arcs":[[1083,1084,1085,1086,1087,1088,1089,1090,1091,1092]],"properties":{"id":"24661262","dp":10544,"de":11245}},{"type":"Polygon","arcs":[[-1093,1093,1094]],"properties":{"id":"24661263","dp":10688,"de":0}},{"type":"Polygon","arcs":[[-1092,1095,-1094]],"properties":{"id":"24661264","dp":14722,"de":599}},{"type":"Polygon","arcs":[[1096,1097,1098,1099,1100,-949,1101,1102,1103,1104,1105,1106]],"properties":{"id":"24662550","dp":5727,"de":546}},{"type":"Polygon","arcs":[[-1101,1107,1108,1109,-947]],"properties":{"id":"24662551","dp":8291,"de":0}},{"type":"Polygon","arcs":[[-1100,1110,1111,-1108]],"properties":{"id":"24662552","dp":10076,"de":0}},{"type":"Polygon","arcs":[[-1109,-1112,1112,1113,1114]],"properties":{"id":"24662553","dp":4893,"de":0}},{"type":"Polygon","arcs":[[1115,1116,-1113,-1111,-1099]],"properties":{"id":"24662554","dp":10898,"de":0}},{"type":"Polygon","arcs":[[-1114,-1117,1117,1118,1119]],"properties":{"id":"24662555","dp":9113,"de":0}},{"type":"Polygon","arcs":[[1120,1121,1122,1123,1124,1125,1126,1127,1128,1129]],"properties":{"id":"24662948","dp":453,"de":63}},{"type":"Polygon","arcs":[[1130,1131,1132,-1123,1133,1134]],"properties":{"id":"24662949","dp":1624,"de":1021}},{"type":"MultiPolygon","arcs":[[[1135,1136,1137,-1129,1138,1139,1140]],[[1141]]],"properties":{"id":"24662951","dp":1327,"de":0}},{"type":"Polygon","arcs":[[1142,1143,1144,1145,1146,1147]],"properties":{"id":"24662952","dp":4083,"de":0}},{"type":"Polygon","arcs":[[1148,1149,-1148,1150,1151,-430]],"properties":{"id":"24662953","dp":1585,"de":954}},{"type":"Polygon","arcs":[[-436,1152,1153,-1149,-429]],"properties":{"id":"24662954","dp":4192,"de":0}},{"type":"Polygon","arcs":[[1154,1155,-1154,1156]],"properties":{"id":"24662955","dp":6779,"de":0}},{"type":"Polygon","arcs":[[-1157,-1153,-458,1157]],"properties":{"id":"24662956","dp":4753,"de":0}},{"type":"Polygon","arcs":[[1158,1159,-1155,-1158,-457,-466]],"properties":{"id":"24662957","dp":4014,"de":0}},{"type":"Polygon","arcs":[[-1010,1160,1161,1162,1163,1164,1165,1166]],"properties":{"id":"24661224","dp":3673,"de":543}},{"type":"Polygon","arcs":[[-1163,1167]],"properties":{"id":"24661225","dp":8734,"de":4430}},{"type":"Polygon","arcs":[[1168,1169,-1164,-1168,-1162,1170]],"properties":{"id":"24661226","dp":6306,"de":1749}},{"type":"Polygon","arcs":[[1171,-1171,-1161,-1009]],"properties":{"id":"24661227","dp":7016,"de":665}},{"type":"Polygon","arcs":[[1172,1173,1174,-1169,-1172]],"properties":{"id":"24661228","dp":5756,"de":1204}},{"type":"Polygon","arcs":[[-1006,1175,-1003,1176,-1173,-1008]],"properties":{"id":"24661229","dp":12388,"de":530}},{"type":"Polygon","arcs":[[-1177,1177,1178,1179,1180,-1174]],"properties":{"id":"24661230","dp":5897,"de":482}},{"type":"Polygon","arcs":[[-1165,-1170,-1175,-1181]],"properties":{"id":"24661231","dp":5275,"de":0}},{"type":"Polygon","arcs":[[1181,1182,-1179,1183]],"properties":{"id":"24661232","dp":9961,"de":1413}},{"type":"Polygon","arcs":[[-1184,-1178,-1002,1184]],"properties":{"id":"24661233","dp":8900,"de":955}},{"type":"MultiPolygon","arcs":[[[1185,-821,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200]],[[1201,1202]]],"properties":{"id":"24661242","dp":258,"de":753}},{"type":"Polygon","arcs":[[1203,1204,-1193]],"properties":{"id":"24661243","dp":11314,"de":11896}},{"type":"Polygon","arcs":[[1205,1206,1207,-1194,-1205]],"properties":{"id":"24661244","dp":15228,"de":1428}},{"type":"Polygon","arcs":[[1208,-1084,-1095,-1096,-1091,1209,1210,1211]],"properties":{"id":"24661265","dp":4266,"de":28208}},{"type":"Polygon","arcs":[[1212,1213,1214,1215,1216,1217,1218]],"properties":{"id":"24660302","dp":1865,"de":2736}},{"type":"Polygon","arcs":[[1219,1220,1221,1222,-1213,1223]],"properties":{"id":"24660303","dp":3634,"de":3670}},{"type":"Polygon","arcs":[[1224,-1195,-1208]],"properties":{"id":"24661245","dp":9284,"de":994}},{"type":"Polygon","arcs":[[1225,-1196,-1225,-1207,1226]],"properties":{"id":"24661246","dp":11670,"de":1002}},{"type":"Polygon","arcs":[[1227,-1227,-1206,-1204,1228]],"properties":{"id":"24661247","dp":12923,"de":2769}},{"type":"Polygon","arcs":[[1229,-1229,-1192]],"properties":{"id":"24661248","dp":9450,"de":2094}},{"type":"Polygon","arcs":[[-1191,1230,1231,1232,-1228,-1230]],"properties":{"id":"24661249","dp":10381,"de":2359}},{"type":"Polygon","arcs":[[1233,1234,1235,1236,-1197,-1226,-1233]],"properties":{"id":"24661250","dp":9612,"de":862}},{"type":"Polygon","arcs":[[1237,1238,-1198,-1237]],"properties":{"id":"24661251","dp":12371,"de":1482}},{"type":"Polygon","arcs":[[-1239,1239,1240,1241,1242,1243,-1199]],"properties":{"id":"24661252","dp":4372,"de":11270}},{"type":"Polygon","arcs":[[1244,1245,1246]],"properties":{"id":"24661255","dp":8291,"de":32020}},{"type":"Polygon","arcs":[[-1247,1247,1248,1249,1250,1251,1252]],"properties":{"id":"24661256","dp":4213,"de":74639}},{"type":"Polygon","arcs":[[1253,-1252,1254,1255,1256]],"properties":{"id":"24661257","dp":4213,"de":39480}},{"type":"Polygon","arcs":[[1257,1258,1259,-1255]],"properties":{"id":"24661258","dp":5163,"de":5655}},{"type":"Polygon","arcs":[[-1260,1260,1261,1262,-1256]],"properties":{"id":"24661259","dp":3602,"de":49947}},{"type":"Polygon","arcs":[[1263,-1085,1264,-1261,-1259]],"properties":{"id":"24661260","dp":15390,"de":21335}},{"type":"Polygon","arcs":[[-1265,-1209,1265,-1262]],"properties":{"id":"24661261","dp":13935,"de":18783}},{"type":"Polygon","arcs":[[1266,1267,1268,1269,1270]],"properties":{"id":"24661269","dp":10143,"de":15503}},{"type":"Polygon","arcs":[[1271,1272,1273,-1268,1274]],"properties":{"id":"24661270","dp":25177,"de":24703}},{"type":"Polygon","arcs":[[1275,-1275,-1267,1276]],"properties":{"id":"24661271","dp":23439,"de":12698}},{"type":"Polygon","arcs":[[1277,1278,1279,-1272,-1276,1280]],"properties":{"id":"24661272","dp":23659,"de":14245}},{"type":"Polygon","arcs":[[1281,1282,-1279]],"properties":{"id":"24661273","dp":34525,"de":28212}},{"type":"Polygon","arcs":[[1283,1284,1285,1286,1287]],"properties":{"id":"24661276","dp":32985,"de":4228}},{"type":"Polygon","arcs":[[1288,1289,1290,-1285,1291,1292,1293]],"properties":{"id":"24661277","dp":19180,"de":1803}},{"type":"Polygon","arcs":[[1294,1295,1296,-1290,1297,1298]],"properties":{"id":"24661278","dp":19310,"de":3918}},{"type":"Polygon","arcs":[[-1298,-1289,1299]],"properties":{"id":"24661279","dp":23975,"de":0}},{"type":"Polygon","arcs":[[1300,-1300,1301,1302]],"properties":{"id":"24661280","dp":30720,"de":11261}},{"type":"Polygon","arcs":[[1303,-1302,-1294,1304]],"properties":{"id":"24661281","dp":39278,"de":6443}},{"type":"Polygon","arcs":[[1305,-1305,-1293,1306,-1278]],"properties":{"id":"24661282","dp":20572,"de":14583}},{"type":"Polygon","arcs":[[-1250,1307,1308,1309,1310,1311,-1303,-1304,-1306,1312,1313]],"properties":{"id":"24661283","dp":3006,"de":135078}},{"type":"Polygon","arcs":[[1314,1315,-1299,-1301,-1312]],"properties":{"id":"24661284","dp":5856,"de":10763}},{"type":"Polygon","arcs":[[-1316,1316,1317,-1295]],"properties":{"id":"24661285","dp":31428,"de":2747}},{"type":"Polygon","arcs":[[1318,1319,-1296,-1318]],"properties":{"id":"24661286","dp":19859,"de":4205}},{"type":"Polygon","arcs":[[1320,1321,1322,1323,1324,1325,1326,1327,1328,1329]],"properties":{"id":"24661299","dp":1509,"de":12065}},{"type":"Polygon","arcs":[[1330,1331,1332,-1327]],"properties":{"id":"24661300","dp":12480,"de":0}},{"type":"Polygon","arcs":[[1333,1334,1335,1336,-1331,-1326]],"properties":{"id":"24661301","dp":9872,"de":3200}},{"type":"Polygon","arcs":[[-1337,1337,1338,1339,-1332]],"properties":{"id":"24661302","dp":7579,"de":1460}},{"type":"Polygon","arcs":[[-1338,-1336,1340,1341,1342]],"properties":{"id":"24661303","dp":7226,"de":2176}},{"type":"Polygon","arcs":[[1343,1344,1345,-1342]],"properties":{"id":"24661304","dp":6115,"de":1652}},{"type":"Polygon","arcs":[[1346,-1345,1347,1348]],"properties":{"id":"24661305","dp":11550,"de":7219}},{"type":"Polygon","arcs":[[-1349,1349,1350,1351]],"properties":{"id":"24661306","dp":33834,"de":0}},{"type":"Polygon","arcs":[[1352,1353,-1351]],"properties":{"id":"24661308","dp":20664,"de":0}},{"type":"Polygon","arcs":[[-1350,-1348,1354,1355,1356,1357,-1353]],"properties":{"id":"24661309","dp":4461,"de":8568}},{"type":"Polygon","arcs":[[1358,1359,-1358]],"properties":{"id":"24661310","dp":20965,"de":0}},{"type":"Polygon","arcs":[[1360,1361,1362,1363,1364,1365]],"properties":{"id":"24660395","dp":10242,"de":0}},{"type":"Polygon","arcs":[[1366,1367,1368,1369,1370,-1363]],"properties":{"id":"24660396","dp":10130,"de":0}},{"type":"Polygon","arcs":[[-1366,1371,1372]],"properties":{"id":"24660397","dp":11880,"de":0}},{"type":"Polygon","arcs":[[1373,1374,-1361,-1373,1375,1376,1377,1378,1379,1380,1381]],"properties":{"id":"24660398","dp":3646,"de":2889}},{"type":"Polygon","arcs":[[1382,1383,1384,1385,1386]],"properties":{"id":"24660335","dp":6886,"de":2422}},{"type":"Polygon","arcs":[[1387,1388,1389,1390,1391,1392,-391]],"properties":{"id":"24662081","dp":10320,"de":2533}},{"type":"Polygon","arcs":[[1393,1394,1395,1396,1397]],"properties":{"id":"24660194","dp":6417,"de":1819}},{"type":"Polygon","arcs":[[1398,1399,1400]],"properties":{"id":"24660195","dp":6399,"de":2060}},{"type":"Polygon","arcs":[[1401,1402,1403,1404,-1395,1405,1406]],"properties":{"id":"24660196","dp":6960,"de":1062}},{"type":"Polygon","arcs":[[1407,1408,1409,-1403,1410]],"properties":{"id":"24660197","dp":8815,"de":877}},{"type":"Polygon","arcs":[[1411,1412,1413,-1408,1414,1415,1416]],"properties":{"id":"24660198","dp":5286,"de":423}},{"type":"Polygon","arcs":[[1417,1418,1419,1420,1421,1422,-1409,-1414,1423]],"properties":{"id":"24660199","dp":2222,"de":4573}},{"type":"Polygon","arcs":[[1424,1425,1426,1427,1428,-1214,-1223]],"properties":{"id":"24660304","dp":7336,"de":2680}},{"type":"Polygon","arcs":[[1429,1430,1431,-1425,-1222]],"properties":{"id":"24660305","dp":14721,"de":0}},{"type":"Polygon","arcs":[[1432,1433,-1426,-1432]],"properties":{"id":"24660306","dp":14441,"de":0}},{"type":"Polygon","arcs":[[1434,1435,-1427,-1434]],"properties":{"id":"24660307","dp":13449,"de":0}},{"type":"Polygon","arcs":[[-392,-1393,1436,1437]],"properties":{"id":"24662082","dp":32198,"de":0}},{"type":"Polygon","arcs":[[-393,-1438,1438]],"properties":{"id":"24662083","dp":16061,"de":0}},{"type":"Polygon","arcs":[[-1439,-1437,-1392,1439,1440,1441,1442,1443,-394]],"properties":{"id":"24662084","dp":3544,"de":786}},{"type":"Polygon","arcs":[[-1444,1444,1445,-395]],"properties":{"id":"24662085","dp":9063,"de":550}},{"type":"Polygon","arcs":[[1446,-1446,1447,1448,1449]],"properties":{"id":"24662086","dp":9446,"de":2551}},{"type":"Polygon","arcs":[[1450,1451,1452,1453,1454]],"properties":{"id":"24662087","dp":21285,"de":2428}},{"type":"Polygon","arcs":[[1455,1456,-1452,1457]],"properties":{"id":"24662088","dp":19668,"de":0}},{"type":"Polygon","arcs":[[1458,1459,1460,1461,1462,1463,1464,1465,1466,-1453,-1457,1467,1468,1469]],"properties":{"id":"24662089","dp":3893,"de":3973}},{"type":"Polygon","arcs":[[1470,1471,1472,1473,-1461]],"properties":{"id":"24662090","dp":7603,"de":1143}},{"type":"Polygon","arcs":[[1474,1475,-1471,-1460,1476,1477,1478]],"properties":{"id":"24662091","dp":4567,"de":2314}},{"type":"Polygon","arcs":[[1479,-1479,1480,1481,1482]],"properties":{"id":"24662092","dp":16334,"de":0}},{"type":"Polygon","arcs":[[1483,-1483,1484,1485]],"properties":{"id":"24662093","dp":17883,"de":0}},{"type":"Polygon","arcs":[[1486,1487,1488,1489,-1480,-1484]],"properties":{"id":"24662094","dp":16941,"de":0}},{"type":"Polygon","arcs":[[1490,1491,1492,1493]],"properties":{"id":"24662095","dp":10494,"de":3268}},{"type":"Polygon","arcs":[[1494,1495,1496,-1491,1497]],"properties":{"id":"24662096","dp":11922,"de":2375}},{"type":"Polygon","arcs":[[1498,1499,1500,-1496,1501]],"properties":{"id":"24662097","dp":14433,"de":1889}},{"type":"Polygon","arcs":[[1502,1503,1504]],"properties":{"id":"24662425","dp":2648,"de":227}},{"type":"Polygon","arcs":[[1505,1506,1507,1508,1509,-1505,1510,1511,1512]],"properties":{"id":"24662426","dp":2375,"de":642}},{"type":"Polygon","arcs":[[1513,1514,-1507,1515,1516]],"properties":{"id":"24662427","dp":2989,"de":0}},{"type":"Polygon","arcs":[[1517,-1516,-1506,1518]],"properties":{"id":"24662428","dp":3507,"de":0}},{"type":"Polygon","arcs":[[1519,1520,-1517,-1518]],"properties":{"id":"24662429","dp":2811,"de":0}},{"type":"Polygon","arcs":[[1521,1522,-1514,-1521,1523,1524]],"properties":{"id":"24662430","dp":3947,"de":3220}},{"type":"Polygon","arcs":[[1525,1526,-1525]],"properties":{"id":"24662431","dp":3490,"de":0}},{"type":"Polygon","arcs":[[1527,1528,1529,-1522,-1527,1530,1531,1532]],"properties":{"id":"24662432","dp":60,"de":3143}},{"type":"Polygon","arcs":[[1533,1534,1535,1536]],"properties":{"id":"24661691","dp":10052,"de":0}},{"type":"Polygon","arcs":[[1537,1538,1539,-1535]],"properties":{"id":"24661692","dp":12677,"de":1036}},{"type":"Polygon","arcs":[[1540,1541,1542,1543,1544,1545]],"properties":{"id":"24660275","dp":14750,"de":4621}},{"type":"Polygon","arcs":[[1546,1547,1548,1549,1550,1551]],"properties":{"id":"24660276","dp":4398,"de":1077}},{"type":"Polygon","arcs":[[1552,1553,-1549]],"properties":{"id":"24660277","dp":7535,"de":991}},{"type":"Polygon","arcs":[[-1548,1554,1555,1556,1557,-1553]],"properties":{"id":"24660278","dp":3608,"de":0}},{"type":"Polygon","arcs":[[1558,1559,-1557,1560,1561]],"properties":{"id":"24660279","dp":4084,"de":0}},{"type":"Polygon","arcs":[[-1561,-1556,1562,1563,1564,1565,1566,1567]],"properties":{"id":"24660280","dp":3697,"de":0}},{"type":"Polygon","arcs":[[1568,-1562,-1568,1569,1570]],"properties":{"id":"24660281","dp":6639,"de":3983}},{"type":"Polygon","arcs":[[-1571,-1430,-1221,1571,1572]],"properties":{"id":"24660282","dp":15441,"de":0}},{"type":"Polygon","arcs":[[-1559,-1569,-1573,1573,1574,1575]],"properties":{"id":"24660283","dp":8896,"de":2252}},{"type":"Polygon","arcs":[[-1574,-1572,-1220,1576,1577]],"properties":{"id":"24660284","dp":12043,"de":0}},{"type":"Polygon","arcs":[[-1575,-1578,1578,1579,1580]],"properties":{"id":"24660285","dp":12352,"de":1069}},{"type":"Polygon","arcs":[[1581,1582,-1580,1583]],"properties":{"id":"24660286","dp":11359,"de":0}},{"type":"Polygon","arcs":[[1584,1585,-1582,1586]],"properties":{"id":"24660287","dp":11125,"de":0}},{"type":"Polygon","arcs":[[-1550,-1554,-1558,-1560,-1576,-1581,-1583,-1586,1587]],"properties":{"id":"24660288","dp":2997,"de":572}},{"type":"Polygon","arcs":[[-1551,-1588,-1585,1588,1589]],"properties":{"id":"24660289","dp":4436,"de":3209}},{"type":"Polygon","arcs":[[-1589,-1587,-1584,-1579,-1577,-1224,-1219,1590,1591,1592,1593,1594]],"properties":{"id":"24660290","dp":881,"de":5260}},{"type":"Polygon","arcs":[[1595,1596,1597,-1593]],"properties":{"id":"24660291","dp":13029,"de":0}},{"type":"Polygon","arcs":[[-1597,1598,1599,1600,1601]],"properties":{"id":"24660292","dp":14340,"de":3085}},{"type":"Polygon","arcs":[[-1599,-1596,-1592,1602,1603]],"properties":{"id":"24660293","dp":9424,"de":0}},{"type":"Polygon","arcs":[[-1604,1604,1605,1606,1607,-1600]],"properties":{"id":"24660294","dp":7266,"de":0}},{"type":"Polygon","arcs":[[-1601,-1608,1608,1609,1610]],"properties":{"id":"24660295","dp":10255,"de":0}},{"type":"Polygon","arcs":[[-1607,1611,1612,1613,1614,-1609]],"properties":{"id":"24660296","dp":10027,"de":1426}},{"type":"Polygon","arcs":[[-1614,1615,1616]],"properties":{"id":"24660297","dp":8167,"de":0}},{"type":"Polygon","arcs":[[-1613,1617,1618,-1616]],"properties":{"id":"24660298","dp":6766,"de":0}},{"type":"Polygon","arcs":[[1619,1620,1621,-1618,-1612,-1606]],"properties":{"id":"24660299","dp":8714,"de":2254}},{"type":"Polygon","arcs":[[-1603,-1591,-1218,1622,-1620,-1605]],"properties":{"id":"24660300","dp":4604,"de":0}},{"type":"Polygon","arcs":[[-1217,1623,1624,1625,1626,-1621,-1623]],"properties":{"id":"24660301","dp":1470,"de":1672}},{"type":"Polygon","arcs":[[1627,1628,1629,-1428,-1436,1630]],"properties":{"id":"24660308","dp":11556,"de":0}},{"type":"Polygon","arcs":[[1631,1632,-1628,1633]],"properties":{"id":"24660309","dp":7460,"de":0}},{"type":"Polygon","arcs":[[1634,1635,1636,-1632]],"properties":{"id":"24660310","dp":14345,"de":0}},{"type":"Polygon","arcs":[[1637,1638,1639,1640,-1636,1641]],"properties":{"id":"24660311","dp":13577,"de":0}},{"type":"Polygon","arcs":[[1642,-1639]],"properties":{"id":"24660312","dp":11893,"de":0}},{"type":"Polygon","arcs":[[1643,1644,1645,1646,-1640,-1643,-1638]],"properties":{"id":"24660313","dp":4276,"de":3872}},{"type":"Polygon","arcs":[[1647,1648,1649,1650,1651,-1646,1652]],"properties":{"id":"24660314","dp":1610,"de":1587}},{"type":"Polygon","arcs":[[1653,1654,-1649,1655]],"properties":{"id":"24660315","dp":4853,"de":0}},{"type":"Polygon","arcs":[[1656,-1654,1657]],"properties":{"id":"24660316","dp":10881,"de":0}},{"type":"Polygon","arcs":[[1658,1659,1660]],"properties":{"id":"24660319","dp":15719,"de":0}},{"type":"Polygon","arcs":[[1661,1662,1663,-1659,1664]],"properties":{"id":"24660320","dp":17446,"de":0}},{"type":"Polygon","arcs":[[1665,-1665,1666,1667]],"properties":{"id":"24660321","dp":14506,"de":0}},{"type":"Polygon","arcs":[[1668,-1662,-1666,1669]],"properties":{"id":"24660322","dp":15473,"de":0}},{"type":"Polygon","arcs":[[1670,1671,1672,1673,-1663,-1669]],"properties":{"id":"24660323","dp":9120,"de":0}},{"type":"Polygon","arcs":[[1674,1675,1676,-1672]],"properties":{"id":"24660324","dp":14019,"de":1331}},{"type":"Polygon","arcs":[[-1673,-1677,1677,1678,1679]],"properties":{"id":"24660325","dp":18655,"de":0}},{"type":"Polygon","arcs":[[1680,-1679,1681,1682]],"properties":{"id":"24660326","dp":13955,"de":0}},{"type":"Polygon","arcs":[[1683,-1683,1684]],"properties":{"id":"24660327","dp":14862,"de":0}},{"type":"Polygon","arcs":[[1685,1686,1687,1688,-1685,-1682,1689]],"properties":{"id":"24660328","dp":15552,"de":1036}},{"type":"Polygon","arcs":[[1690,1691,1692,1693,-1688]],"properties":{"id":"24660329","dp":20916,"de":0}},{"type":"Polygon","arcs":[[1694,1695,1696,-1692,1697,1698]],"properties":{"id":"24660330","dp":15639,"de":1044}},{"type":"Polygon","arcs":[[1699,1700,-1696]],"properties":{"id":"24660331","dp":23619,"de":2941}},{"type":"Polygon","arcs":[[-1701,1701,1702,1703]],"properties":{"id":"24660332","dp":12557,"de":0}},{"type":"Polygon","arcs":[[-1703,1704,1705,1706]],"properties":{"id":"24660333","dp":26931,"de":0}},{"type":"Polygon","arcs":[[-1704,-1707,-1384,1707,-1693,-1697]],"properties":{"id":"24660334","dp":17231,"de":1612}},{"type":"Polygon","arcs":[[1708,1709,1710,1711,1712]],"properties":{"id":"24660840","dp":7241,"de":1239}},{"type":"Polygon","arcs":[[1713,-1712,1714,1715,1716]],"properties":{"id":"24660841","dp":11728,"de":793}},{"type":"Polygon","arcs":[[-1715,-1711,1717,1718,1719,1720]],"properties":{"id":"24660842","dp":15317,"de":2705}},{"type":"Polygon","arcs":[[1721,1722,1723,1724,1725]],"properties":{"id":"24660216","dp":12738,"de":0}},{"type":"Polygon","arcs":[[1726,1727,1728,-1723,1729]],"properties":{"id":"24660217","dp":20416,"de":3472}},{"type":"Polygon","arcs":[[1730,-1543,1731,-1728]],"properties":{"id":"24660218","dp":6618,"de":948}},{"type":"Polygon","arcs":[[-1544,-1731,-1727,1732,1733]],"properties":{"id":"24660219","dp":9982,"de":1158}},{"type":"Polygon","arcs":[[-1540,1734,1735]],"properties":{"id":"24661693","dp":10767,"de":0}},{"type":"Polygon","arcs":[[-1735,1736,1737,1738,1739,1740,1741]],"properties":{"id":"24661694","dp":4665,"de":18681}},{"type":"Polygon","arcs":[[-1740,1742,1743,1744]],"properties":{"id":"24661695","dp":10363,"de":0}},{"type":"Polygon","arcs":[[1745,-1741,-1745,1746,1747,1748,1749]],"properties":{"id":"24661696","dp":10017,"de":853}},{"type":"Polygon","arcs":[[1750,1751,-1747,-1744,1752,1753]],"properties":{"id":"24661697","dp":18777,"de":783}},{"type":"Polygon","arcs":[[-1748,-1752,1754,1755,1756]],"properties":{"id":"24661698","dp":9695,"de":0}},{"type":"Polygon","arcs":[[-1755,-1751,1757,1758,1759]],"properties":{"id":"24661699","dp":10851,"de":0}},{"type":"Polygon","arcs":[[-1754,1760,1761,1762,1763,1764,1765,-1758]],"properties":{"id":"24661700","dp":5499,"de":550}},{"type":"Polygon","arcs":[[1766,-1756,-1760,1767,1768,1769]],"properties":{"id":"24661701","dp":6071,"de":0}},{"type":"Polygon","arcs":[[1770,-1768]],"properties":{"id":"24661702","dp":12620,"de":0}},{"type":"MultiPolygon","arcs":[[[1771,1772,1773,1774,1775,1776,1777,1778,1779]],[[1780,1781]],[[1782,1783]],[[1784,1785]]],"properties":{"id":"24662193","dp":2677,"de":1628}},{"type":"Polygon","arcs":[[1786,1787,1788,1789,1790,-1776]],"properties":{"id":"24662194","dp":11546,"de":1251}},{"type":"Polygon","arcs":[[-1777,-1791,1791]],"properties":{"id":"24662195","dp":9233,"de":0}},{"type":"Polygon","arcs":[[1792,1793,-1789]],"properties":{"id":"24662196","dp":9212,"de":0}},{"type":"Polygon","arcs":[[1794,1795,1796,1797,-1790,-1794]],"properties":{"id":"24662197","dp":5282,"de":1479}},{"type":"Polygon","arcs":[[-1795,1798,1799,1800]],"properties":{"id":"24662198","dp":9160,"de":839}},{"type":"Polygon","arcs":[[1801,1802,1803,1804,1805,-1801]],"properties":{"id":"24662199","dp":11124,"de":1282}},{"type":"Polygon","arcs":[[1806,1807,1808,-1802]],"properties":{"id":"24662200","dp":26084,"de":0}},{"type":"Polygon","arcs":[[-1809,1809,1810,-1803]],"properties":{"id":"24662201","dp":18007,"de":0}},{"type":"Polygon","arcs":[[1811,1812,-1804,-1811]],"properties":{"id":"24662202","dp":14267,"de":0}},{"type":"Polygon","arcs":[[-1812,-1810,-1808,1813,1814,1815,1816]],"properties":{"id":"24662203","dp":16359,"de":963}},{"type":"Polygon","arcs":[[-1800,1817,-1814,-1807]],"properties":{"id":"24662204","dp":48198,"de":0}},{"type":"Polygon","arcs":[[1818,-1805,-1813,-1817,1819,1820],[1821]],"properties":{"id":"24662205","dp":7167,"de":0}},{"type":"Polygon","arcs":[[-1822]],"properties":{"id":"24662206","dp":8176,"de":828}},{"type":"Polygon","arcs":[[1822,-1385,-1706]],"properties":{"id":"24660336","dp":24911,"de":0}},{"type":"Polygon","arcs":[[1823,1824,1825,1826,1827,1828,1829,-1386,-1823,-1705,1830]],"properties":{"id":"24660337","dp":1429,"de":714}},{"type":"Polygon","arcs":[[1831,1832,-1824,1833]],"properties":{"id":"24660338","dp":26878,"de":0}},{"type":"Polygon","arcs":[[-1825,-1833,1834]],"properties":{"id":"24660339","dp":24393,"de":0}},{"type":"Polygon","arcs":[[-1826,-1835,-1832,1835,1836]],"properties":{"id":"24660340","dp":5519,"de":0}},{"type":"Polygon","arcs":[[-1836,1837,1838]],"properties":{"id":"24660341","dp":20785,"de":0}},{"type":"Polygon","arcs":[[1839,-1837,-1839,1840]],"properties":{"id":"24660342","dp":15495,"de":0}},{"type":"Polygon","arcs":[[-1840,1841,1842,1843,1844,1845,-1827]],"properties":{"id":"24660343","dp":7521,"de":2920}},{"type":"Polygon","arcs":[[-1841,1846,1847,1848,-1842]],"properties":{"id":"24660344","dp":21048,"de":0}},{"type":"Polygon","arcs":[[1849,-1843,-1849,1850,1851,1852,1853]],"properties":{"id":"24660345","dp":17427,"de":2624}},{"type":"Polygon","arcs":[[1854,1855,-1844,-1850,1856]],"properties":{"id":"24660346","dp":17276,"de":0}},{"type":"Polygon","arcs":[[1857,1858,-1855,1859]],"properties":{"id":"24660347","dp":14938,"de":2006}},{"type":"Polygon","arcs":[[-1860,-1857,1860,1861]],"properties":{"id":"24660348","dp":4517,"de":3622}},{"type":"Polygon","arcs":[[1862,1863,-1861,-1854,1864,1865,1866]],"properties":{"id":"24660349","dp":10616,"de":2312}},{"type":"Polygon","arcs":[[-1853,1867,1868,-1865]],"properties":{"id":"24660350","dp":29850,"de":2500}},{"type":"Polygon","arcs":[[-1852,1869,1870,-1868]],"properties":{"id":"24660351","dp":26300,"de":0}},{"type":"Polygon","arcs":[[-1870,1871]],"properties":{"id":"24660352","dp":26515,"de":0}},{"type":"Polygon","arcs":[[1872,1873,1874,-1871,-1872,-1851,-1848,1875,1876,1877,1878,1879,1880,1881]],"properties":{"id":"24660353","dp":504,"de":4974}},{"type":"Polygon","arcs":[[-1875,1882,-1866,-1869]],"properties":{"id":"24660354","dp":21788,"de":0}},{"type":"Polygon","arcs":[[1883,1884,1885,1886,-1867,-1883,-1874]],"properties":{"id":"24660355","dp":5610,"de":5052}},{"type":"Polygon","arcs":[[1887,1888,-1863,-1887,1889]],"properties":{"id":"24660356","dp":10344,"de":0}},{"type":"Polygon","arcs":[[1890,-1890,-1886,1891]],"properties":{"id":"24660357","dp":10936,"de":2224}},{"type":"Polygon","arcs":[[1892,1893,-1888,-1891,1894]],"properties":{"id":"24660358","dp":4829,"de":3930}},{"type":"Polygon","arcs":[[1895,1896,1897,1898,-1895,-1892,1899]],"properties":{"id":"24660359","dp":5068,"de":5425}},{"type":"Polygon","arcs":[[-1900,-1885,1900,1901]],"properties":{"id":"24660360","dp":9188,"de":4752}},{"type":"Polygon","arcs":[[1902,1903,-1896,-1902,1904,1905]],"properties":{"id":"24660361","dp":8870,"de":2419}},{"type":"Polygon","arcs":[[-1905,-1901,-1884,-1873,1906,1907,1908]],"properties":{"id":"24660362","dp":5838,"de":1838}},{"type":"Polygon","arcs":[[1909,1910,-1908]],"properties":{"id":"24660363","dp":21333,"de":0}},{"type":"Polygon","arcs":[[1911,1912,1913,1914,1915,-997,-989]],"properties":{"id":"24660870","dp":2283,"de":3942}},{"type":"Polygon","arcs":[[-1413,1916,1917,1918,1919,-1424]],"properties":{"id":"24660200","dp":5940,"de":1495}},{"type":"Polygon","arcs":[[1920,-1418,-1920]],"properties":{"id":"24660201","dp":15261,"de":0}},{"type":"Polygon","arcs":[[-1919,1921,1922,-1419,-1921]],"properties":{"id":"24660202","dp":14923,"de":0}},{"type":"Polygon","arcs":[[-621,1923,-614,1924,1925,1926,1927,1928,1929,1930,1931,-1422,1932]],"properties":{"id":"24660203","dp":1500,"de":6992}},{"type":"Polygon","arcs":[[-615,-1924,-620]],"properties":{"id":"24660204","dp":12657,"de":4931}},{"type":"Polygon","arcs":[[1933,1934,1935,1936,1937,1938,1939,1940,1941,1942]],"properties":{"id":"24660812","dp":1273,"de":772}},{"type":"Polygon","arcs":[[1943,1944,-1926]],"properties":{"id":"24660205","dp":20945,"de":1879}},{"type":"Polygon","arcs":[[-607,-1944,-1925,-613]],"properties":{"id":"24660206","dp":15395,"de":0}},{"type":"Polygon","arcs":[[1945,1946,1947,1948,1949,-1928],[1950]],"properties":{"id":"24660207","dp":3459,"de":1886}},{"type":"Polygon","arcs":[[-1951]],"properties":{"id":"24660208","dp":10092,"de":15797}},{"type":"Polygon","arcs":[[1951,1952,-1769,-1771,-1759,-1766,1953,1954,1955,-1595,-1929,-1950]],"properties":{"id":"24660209","dp":919,"de":4717}},{"type":"Polygon","arcs":[[-1765,1956,1957,-1954]],"properties":{"id":"24660210","dp":12107,"de":924}},{"type":"Polygon","arcs":[[1958,1959,-1957,-1764]],"properties":{"id":"24660211","dp":11984,"de":0}},{"type":"Polygon","arcs":[[-1960,1960,-1726,1961]],"properties":{"id":"24660212","dp":17538,"de":0}},{"type":"Polygon","arcs":[[-1962,1962,1963,-1955,-1958]],"properties":{"id":"24660213","dp":10966,"de":5098}},{"type":"Polygon","arcs":[[-1725,1964,-1963]],"properties":{"id":"24660214","dp":16655,"de":0}},{"type":"Polygon","arcs":[[-1965,-1724,-1729,-1732,-1542,-1552,-1590,-1956,-1964]],"properties":{"id":"24660215","dp":2931,"de":6869}},{"type":"Polygon","arcs":[[1965,1966,1967,1968,1969,1970,1971,1972]],"properties":{"id":"24660710","dp":1058,"de":289}},{"type":"Polygon","arcs":[[1973,1974,1975,1976,-1966,1977,1978]],"properties":{"id":"24660711","dp":2449,"de":1123}},{"type":"Polygon","arcs":[[1979,1980,-1974,1981,1982]],"properties":{"id":"24660712","dp":3549,"de":827}},{"type":"Polygon","arcs":[[1983,-1975,-1981,1984]],"properties":{"id":"24660713","dp":5000,"de":1076}},{"type":"Polygon","arcs":[[-1980,1985,1986,-823,-827,1987,1988,-1985]],"properties":{"id":"24660714","dp":2684,"de":481}},{"type":"Polygon","arcs":[[1989,1990,-1716,-1721]],"properties":{"id":"24660843","dp":9278,"de":2295}},{"type":"Polygon","arcs":[[-857,-1990,1991,1992]],"properties":{"id":"24660844","dp":19828,"de":0}},{"type":"Polygon","arcs":[[-858,-1993,1993,1994]],"properties":{"id":"24660845","dp":19557,"de":0}},{"type":"Polygon","arcs":[[-1995,1995,-1045,-1034,-860]],"properties":{"id":"24660846","dp":9328,"de":629}},{"type":"Polygon","arcs":[[-1994,1996,1997,-1040,-1996]],"properties":{"id":"24660847","dp":15994,"de":1771}},{"type":"Polygon","arcs":[[-1992,-1720,1998,1999,-1997]],"properties":{"id":"24660848","dp":20817,"de":0}},{"type":"Polygon","arcs":[[-2000,2000,2001,2002,-1041,-1998]],"properties":{"id":"24660849","dp":12334,"de":0}},{"type":"Polygon","arcs":[[2003,2004,-2001,-1999,-1719]],"properties":{"id":"24660850","dp":8991,"de":0}},{"type":"Polygon","arcs":[[2005,-2002,-2005,2006,2007,-1049]],"properties":{"id":"24660851","dp":3291,"de":663}},{"type":"Polygon","arcs":[[-2003,-2006,-1048,-1042]],"properties":{"id":"24660852","dp":15593,"de":0}},{"type":"Polygon","arcs":[[2008,2009,2010,2011,-1733,-1730,2012]],"properties":{"id":"24660220","dp":15119,"de":3030}},{"type":"Polygon","arcs":[[2013,2014,-2010]],"properties":{"id":"24660221","dp":9971,"de":0}},{"type":"Polygon","arcs":[[-1959,-1763,2015,-2013,-1722,-1961]],"properties":{"id":"24660222","dp":7621,"de":4405}},{"type":"Polygon","arcs":[[-2014,-2009,-2016,-1762,2016]],"properties":{"id":"24660223","dp":12115,"de":0}},{"type":"Polygon","arcs":[[2017,-2011,-2015,-2017,-1761,-1753]],"properties":{"id":"24660224","dp":7843,"de":2973}},{"type":"Polygon","arcs":[[-1739,2018,2019,2020,-2012,-2018,-1743]],"properties":{"id":"24660225","dp":10223,"de":1807}},{"type":"Polygon","arcs":[[2021,2022,2023,-2019,-1738]],"properties":{"id":"24660226","dp":10194,"de":0}},{"type":"Polygon","arcs":[[2024,2025,2026,-1939,2027,2028,2029,2030,2031,-1821,2032,2033,-1533,2034]],"properties":{"id":"24662433","dp":75,"de":1528}},{"type":"Polygon","arcs":[[2035,-2025,2036,2037,2038,2039,2040,2041,2042]],"properties":{"id":"24662434","dp":383,"de":566}},{"type":"Polygon","arcs":[[2043,2044,2045,2046,2047,2048,2049,2050,-2038,2051,2052]],"properties":{"id":"24662435","dp":1157,"de":196}},{"type":"Polygon","arcs":[[-2049,2053,2054]],"properties":{"id":"24662436","dp":4584,"de":978}},{"type":"Polygon","arcs":[[2055,2056,-2046,2057]],"properties":{"id":"24662439","dp":12768,"de":2066}},{"type":"Polygon","arcs":[[2058,-2047,-2057]],"properties":{"id":"24662440","dp":8561,"de":499}},{"type":"Polygon","arcs":[[2059,2060]],"properties":{"id":"24662442","dp":12774,"de":0}},{"type":"Polygon","arcs":[[2061,2062,2063,2064,2065]],"properties":{"id":"24662871","dp":4619,"de":469}},{"type":"Polygon","arcs":[[-2064,2066,2067,2068,-867,2069]],"properties":{"id":"24662872","dp":2712,"de":0}},{"type":"Polygon","arcs":[[2070,2071,-2068,2072,2073]],"properties":{"id":"24662873","dp":8395,"de":0}},{"type":"Polygon","arcs":[[2074,2075,-2073,-2067,-2063,2076,2077,2078]],"properties":{"id":"24662874","dp":5198,"de":676}},{"type":"Polygon","arcs":[[-2076,2079,2080,-2074]],"properties":{"id":"24662875","dp":8431,"de":1984}},{"type":"Polygon","arcs":[[2081,2082,-2071,-2081]],"properties":{"id":"24662876","dp":8885,"de":0}},{"type":"Polygon","arcs":[[2083,2084,-2080,-2075,2085]],"properties":{"id":"24662877","dp":4231,"de":614}},{"type":"Polygon","arcs":[[2086,-2086,-2079,2087,2088]],"properties":{"id":"24662878","dp":5278,"de":946}},{"type":"Polygon","arcs":[[2089,-2089,2090,2091]],"properties":{"id":"24662879","dp":5059,"de":0}},{"type":"Polygon","arcs":[[2092,-2092,2093,2094]],"properties":{"id":"24662880","dp":6737,"de":652}},{"type":"Polygon","arcs":[[-2094,-2091,-2088,-2078,2095,2096,2097,2098]],"properties":{"id":"24662881","dp":2813,"de":530}},{"type":"Polygon","arcs":[[2099,2100,2101,-2097]],"properties":{"id":"24662882","dp":8525,"de":0}},{"type":"Polygon","arcs":[[-2077,-2062,-2100,-2096]],"properties":{"id":"24662883","dp":6157,"de":0}},{"type":"Polygon","arcs":[[2102,-1935,2103,2104,2105]],"properties":{"id":"24660813","dp":12857,"de":0}},{"type":"Polygon","arcs":[[2106,-2104,-1934,2107]],"properties":{"id":"24660814","dp":6033,"de":791}},{"type":"Polygon","arcs":[[2108,2109,-2105,-2107,2110]],"properties":{"id":"24660815","dp":9108,"de":713}},{"type":"Polygon","arcs":[[-2111,-2108,-1943,2111,2112]],"properties":{"id":"24660816","dp":7492,"de":1253}},{"type":"Polygon","arcs":[[2113,-2109,-2113,2114,2115,2116]],"properties":{"id":"24660818","dp":1261,"de":1526}},{"type":"Polygon","arcs":[[-1942,2117,2118,2119,-2112]],"properties":{"id":"24660820","dp":2735,"de":1490}},{"type":"Polygon","arcs":[[-2120,2120,2121,-2115]],"properties":{"id":"24660821","dp":2075,"de":785}},{"type":"Polygon","arcs":[[2122,2123,2124,-2121,2125,2126]],"properties":{"id":"24660822","dp":3376,"de":2525}},{"type":"Polygon","arcs":[[-2119,2127,2128,2129,-2126]],"properties":{"id":"24660823","dp":13409,"de":0}},{"type":"Polygon","arcs":[[-2129,2130,2131,2132,2133,-1913]],"properties":{"id":"24660824","dp":28392,"de":2572}},{"type":"Polygon","arcs":[[2134,2135,2136,-2133]],"properties":{"id":"24660825","dp":5644,"de":613}},{"type":"Polygon","arcs":[[2137,2138,-1914,-2134,-2137,2139]],"properties":{"id":"24660826","dp":2385,"de":6142}},{"type":"Polygon","arcs":[[2140,2141,2142,2143,2144,-2140,-2136]],"properties":{"id":"24660827","dp":4237,"de":437}},{"type":"Polygon","arcs":[[2145,2146,-2141,-2135,-2132]],"properties":{"id":"24660828","dp":4457,"de":344}},{"type":"Polygon","arcs":[[-2146,2147,2148,2149,2150,2151]],"properties":{"id":"24660829","dp":5890,"de":650}},{"type":"Polygon","arcs":[[2152,-2150,2153]],"properties":{"id":"24660830","dp":6060,"de":1155}},{"type":"Polygon","arcs":[[-2154,-2149,2154]],"properties":{"id":"24660832","dp":4675,"de":3640}},{"type":"Polygon","arcs":[[-2152,2155,2156,2157]],"properties":{"id":"24660833","dp":6296,"de":1171}},{"type":"Polygon","arcs":[[-2158,2158,2159,2160,-2142,-2147]],"properties":{"id":"24660834","dp":6118,"de":0}},{"type":"Polygon","arcs":[[2161,2162,2163,2164,-2159]],"properties":{"id":"24660835","dp":8983,"de":2354}},{"type":"Polygon","arcs":[[-2160,-2165,2165,2166,2167]],"properties":{"id":"24660836","dp":6957,"de":582}},{"type":"Polygon","arcs":[[-2161,-2168,2168,-2143]],"properties":{"id":"24660837","dp":6714,"de":513}},{"type":"Polygon","arcs":[[-2144,-2169,-2167,2169,-1709,2170]],"properties":{"id":"24660838","dp":5546,"de":0}},{"type":"Polygon","arcs":[[-2171,-1713,-1714,2171]],"properties":{"id":"24660839","dp":9049,"de":0}},{"type":"Polygon","arcs":[[-2004,-1718,-1710,-2170,-2166,2172,2173,2174,2175,2176,-2007]],"properties":{"id":"24660853","dp":2741,"de":2439}},{"type":"Polygon","arcs":[[-2175,2177,2178,2179,2180,2181,2182,-2176]],"properties":{"id":"24660854","dp":3216,"de":1037}},{"type":"Polygon","arcs":[[-2181,2183]],"properties":{"id":"24660855","dp":5005,"de":728}},{"type":"Polygon","arcs":[[-2174,2184,2185,2186,2187,2188,2189,2190,-2178,2174,-2175]],"properties":{"id":"24660856","dp":7421,"de":1732}},{"type":"Polygon","arcs":[[2191,2192,-2179,-2191]],"properties":{"id":"24660857","dp":4775,"de":374}},{"type":"Polygon","arcs":[[-2190,2193,2194,2195,-2192]],"properties":{"id":"24660858","dp":3480,"de":1312}},{"type":"Polygon","arcs":[[-2173,-2164,2196,2197,-2185]],"properties":{"id":"24660859","dp":11472,"de":0}},{"type":"Polygon","arcs":[[2198,2199,-2186,-2198]],"properties":{"id":"24660860","dp":40687,"de":3439}},{"type":"Polygon","arcs":[[-2187,-2200,2200,2201]],"properties":{"id":"24660861","dp":51902,"de":2989}},{"type":"Polygon","arcs":[[2202,-2188,-2202,2203,2204]],"properties":{"id":"24660862","dp":19757,"de":3238}},{"type":"Polygon","arcs":[[-2205,2205,2206,2207]],"properties":{"id":"24660863","dp":23466,"de":0}},{"type":"Polygon","arcs":[[-2206,-2204,-2201,-2199,-2197,-2163,2208]],"properties":{"id":"24660864","dp":16176,"de":3008}},{"type":"Polygon","arcs":[[2209,2210,2211,-1717,-1991,-856]],"properties":{"id":"24660865","dp":10490,"de":481}},{"type":"Polygon","arcs":[[-2145,-2172,-2212,2212]],"properties":{"id":"24660866","dp":12103,"de":887}},{"type":"Polygon","arcs":[[2213,-1915,-2139,2214,2215,-999]],"properties":{"id":"24660868","dp":7760,"de":836}},{"type":"Polygon","arcs":[[-1916,-2214,-998]],"properties":{"id":"24660869","dp":13318,"de":2586}},{"type":"Polygon","arcs":[[2216,2217,-2020,-2024]],"properties":{"id":"24660227","dp":10606,"de":1590}},{"type":"Polygon","arcs":[[2218,-2217,-2023,2219]],"properties":{"id":"24660228","dp":10064,"de":0}},{"type":"Polygon","arcs":[[2220,2221,2222,-2220,-2022]],"properties":{"id":"24660229","dp":9885,"de":821}},{"type":"Polygon","arcs":[[2223,2224,2225,-2222,2226]],"properties":{"id":"24660230","dp":9353,"de":0}},{"type":"Polygon","arcs":[[2227,2228,-2224,2229,2230]],"properties":{"id":"24660231","dp":13943,"de":1132}},{"type":"Polygon","arcs":[[2231,2232,2233,-2228,2234]],"properties":{"id":"24660232","dp":12870,"de":4582}},{"type":"Polygon","arcs":[[2235,2236,2237,2238,2239,-2233]],"properties":{"id":"24660233","dp":12546,"de":936}},{"type":"Polygon","arcs":[[2240,2241,-2236,-2232,2242,2243]],"properties":{"id":"24660234","dp":10162,"de":1711}},{"type":"Polygon","arcs":[[2244,2245,2246,2247,-2237,-2242,2248]],"properties":{"id":"24660235","dp":5817,"de":2967}},{"type":"Polygon","arcs":[[2249,2250,-2246,2251]],"properties":{"id":"24660236","dp":15345,"de":1257}},{"type":"Polygon","arcs":[[2252,2253,2254]],"properties":{"id":"24660238","dp":20508,"de":0}},{"type":"Polygon","arcs":[[2255,2256,2257,-2254,2258]],"properties":{"id":"24660239","dp":17380,"de":0}},{"type":"Polygon","arcs":[[2259,2260,2261,-2238,-2248,2262]],"properties":{"id":"24660241","dp":6161,"de":4545}},{"type":"Polygon","arcs":[[2263,2264,2265,2266,2267,2268,-2260,2269]],"properties":{"id":"24660242","dp":5450,"de":702}},{"type":"Polygon","arcs":[[2270,2271,2272,-2265,2273,2274]],"properties":{"id":"24660243","dp":8307,"de":2451}},{"type":"Polygon","arcs":[[2275,2276,-2273,2277]],"properties":{"id":"24660244","dp":14548,"de":1315}},{"type":"Polygon","arcs":[[2278,2279,-2278,-2272,2280]],"properties":{"id":"24660245","dp":17713,"de":0}},{"type":"Polygon","arcs":[[2281,2282,-2276,-2280,2283]],"properties":{"id":"24660246","dp":16062,"de":2106}},{"type":"Polygon","arcs":[[2284,2285,-2284,-2279,2286,2287]],"properties":{"id":"24660247","dp":21906,"de":0}},{"type":"Polygon","arcs":[[2288,2289,2290,-2282,-2286]],"properties":{"id":"24660248","dp":18379,"de":0}},{"type":"Polygon","arcs":[[2291,2292,2293,2294,-2289,-2285]],"properties":{"id":"24660249","dp":13646,"de":1918}},{"type":"Polygon","arcs":[[-1001,2295,2296,-1018,-1026,-992,-996]],"properties":{"id":"24660744","dp":16730,"de":1026}},{"type":"Polygon","arcs":[[-2216,2297,2298,-2296,-1000]],"properties":{"id":"24660745","dp":6708,"de":1012}},{"type":"Polygon","arcs":[[-2299,2299,2300,2301,-1019,-2297]],"properties":{"id":"24660746","dp":5153,"de":2351}},{"type":"Polygon","arcs":[[2302,-855,-863,-1016,-2302]],"properties":{"id":"24660748","dp":9417,"de":2579}},{"type":"Polygon","arcs":[[-2124,2303,-2127,-2130,-1912,-994,-988,2304,2305,2306,2307,2308,2309,2310]],"properties":{"id":"24660871","dp":622,"de":2045}},{"type":"Polygon","arcs":[[-2304,-2123]],"properties":{"id":"24660872","dp":23146,"de":0}},{"type":"Polygon","arcs":[[2311,2312,2313,2314,-777,-774,-773,-769,-761,2315,2316]],"properties":{"id":"24660874","dp":228,"de":2471}},{"type":"Polygon","arcs":[[2317,-779,-2315,2318,2319,-702]],"properties":{"id":"24660876","dp":3867,"de":2463}},{"type":"Polygon","arcs":[[2320,2321,2322,2323,2324,2325,2326]],"properties":{"id":"24662209","dp":5617,"de":1367}},{"type":"Polygon","arcs":[[2327,2328,2329,-2324]],"properties":{"id":"24662210","dp":9661,"de":0}},{"type":"Polygon","arcs":[[2330,2331,-2328,2332,2333]],"properties":{"id":"24662211","dp":5038,"de":0}},{"type":"Polygon","arcs":[[2334,-2333,-2323,2335,2336]],"properties":{"id":"24662212","dp":5151,"de":1397}},{"type":"Polygon","arcs":[[-2336,-2322,2337,2338,2339]],"properties":{"id":"24662213","dp":4664,"de":559}},{"type":"Polygon","arcs":[[-2321,2340,-2338]],"properties":{"id":"24662214","dp":25404,"de":0}},{"type":"Polygon","arcs":[[2341,-2339,-2341,-2327,2342]],"properties":{"id":"24662215","dp":26156,"de":0}},{"type":"Polygon","arcs":[[-1787,-1775,2343,-2337,-2340,-2342,2344]],"properties":{"id":"24662216","dp":8094,"de":2005}},{"type":"Polygon","arcs":[[-1799,-1793,-1788,-2345,-2343,-2326,-1815,-1818]],"properties":{"id":"24662217","dp":4662,"de":4977}},{"type":"Polygon","arcs":[[2345,2346,2347,2348,2349,2350,2351,2352]],"properties":{"id":"24662528","dp":6375,"de":1910}},{"type":"Polygon","arcs":[[2353,2354,-2353,2355,2356,-546,-550,-553]],"properties":{"id":"24662529","dp":3087,"de":738}},{"type":"Polygon","arcs":[[2357,2358,2359,-2355,2360]],"properties":{"id":"24662530","dp":5897,"de":4387}},{"type":"Polygon","arcs":[[2361,2362,-2361,-2354,-552,-555,-558]],"properties":{"id":"24662531","dp":5424,"de":2358}},{"type":"Polygon","arcs":[[2363,2364,2365,-2358,-2363]],"properties":{"id":"24662532","dp":8260,"de":1482}},{"type":"Polygon","arcs":[[-2365,2366,2367,2368]],"properties":{"id":"24662533","dp":19497,"de":2261}},{"type":"Polygon","arcs":[[2369,2370,-2367,-2364,-2362,-561]],"properties":{"id":"24662534","dp":9025,"de":2481}},{"type":"Polygon","arcs":[[2371,2372,2373,2374,-2368,-2371,2375]],"properties":{"id":"24662535","dp":5193,"de":1570}},{"type":"Polygon","arcs":[[2376,-2376,-2370,-560,-568]],"properties":{"id":"24662536","dp":6181,"de":2325}},{"type":"Polygon","arcs":[[-580,2377,2378,-2377,-567,-571]],"properties":{"id":"24662537","dp":8931,"de":0}},{"type":"Polygon","arcs":[[2379,2380,2381,-2378,-579]],"properties":{"id":"24662538","dp":7771,"de":0}},{"type":"Polygon","arcs":[[2382,-2380,-578]],"properties":{"id":"24662539","dp":9813,"de":0}},{"type":"Polygon","arcs":[[-2381,-2383,-582,2383,2384,2385,2386]],"properties":{"id":"24662540","dp":7382,"de":0}},{"type":"Polygon","arcs":[[-2387,2387,2388,-2372,-2379,-2382]],"properties":{"id":"24662541","dp":6209,"de":3255}},{"type":"Polygon","arcs":[[-592,-594,2389,2390,2391,-2384,-588,-590]],"properties":{"id":"24662542","dp":6060,"de":5127}},{"type":"Polygon","arcs":[[2392,2393,2394,2395,2396,-2385,-2392]],"properties":{"id":"24662543","dp":2786,"de":4994}},{"type":"Polygon","arcs":[[2397,2398,-2393]],"properties":{"id":"24662544","dp":12186,"de":3422}},{"type":"Polygon","arcs":[[-2399,2399,-1103,2400,2401,2402,-2394]],"properties":{"id":"24662545","dp":2981,"de":193}},{"type":"Polygon","arcs":[[2403,-1104,-2400,-2398,-2391,2404,-598]],"properties":{"id":"24662546","dp":6713,"de":2941}},{"type":"Polygon","arcs":[[-2405,-2390,-599]],"properties":{"id":"24662547","dp":30883,"de":0}},{"type":"Polygon","arcs":[[-1110,-1115,2405,-2401,-1102,-948]],"properties":{"id":"24662548","dp":3129,"de":1403}},{"type":"MultiPolygon","arcs":[[[2406]],[[2407,2408,2409,2410,2411,2412,2413,2414,2415,2416]],[[2417]]],"properties":{"id":"24660981","dp":1087,"de":199}},{"type":"Polygon","arcs":[[2418,2419,-2411,2420]],"properties":{"id":"24660982","dp":16381,"de":0}},{"type":"Polygon","arcs":[[2421,2422,-2419,2423]],"properties":{"id":"24660983","dp":12144,"de":0}},{"type":"MultiPolygon","arcs":[[[2424,2425,2426,2427,2428,-2424,-2421,-2410]],[[2429]],[[-2408,2430]]],"properties":{"id":"24660984","dp":1590,"de":0}},{"type":"Polygon","arcs":[[2431,2432,2433,-2427]],"properties":{"id":"24660985","dp":2890,"de":0}},{"type":"Polygon","arcs":[[2434,2435,2436,-2433]],"properties":{"id":"24660986","dp":10024,"de":0}},{"type":"Polygon","arcs":[[2437,2438,2439,2440,-2436]],"properties":{"id":"24660987","dp":8861,"de":0}},{"type":"Polygon","arcs":[[-2415,2441,2442,2443]],"properties":{"id":"24660988","dp":9694,"de":0}},{"type":"Polygon","arcs":[[-2414,2444,2445,-2442]],"properties":{"id":"24660989","dp":8756,"de":1813}},{"type":"Polygon","arcs":[[2446,2447,-2446,2448,2449,2450]],"properties":{"id":"24660990","dp":6031,"de":694}},{"type":"Polygon","arcs":[[2451,2452,2453,2454,-2450,2455]],"properties":{"id":"24660991","dp":7671,"de":0}},{"type":"Polygon","arcs":[[2456,-2456,-2449,-2445,2457]],"properties":{"id":"24660992","dp":9300,"de":686}},{"type":"Polygon","arcs":[[2458,2459,2460,2461]],"properties":{"id":"24660929","dp":5500,"de":1386}},{"type":"Polygon","arcs":[[2462,2463,2464,2465,-2459,2466,2467]],"properties":{"id":"24660930","dp":3388,"de":0}},{"type":"Polygon","arcs":[[2468,2469,2470,2471,2472,2473,2474]],"properties":{"id":"24660931","dp":2322,"de":601}},{"type":"Polygon","arcs":[[2475,2476,2477,-2463,-2472,2478]],"properties":{"id":"24660932","dp":3414,"de":1386}},{"type":"Polygon","arcs":[[2479,2480,-2479,-2471,2481]],"properties":{"id":"24660933","dp":2989,"de":0}},{"type":"Polygon","arcs":[[-2476,-2481,2482]],"properties":{"id":"24660934","dp":7191,"de":1136}},{"type":"Polygon","arcs":[[2483,2484,2485]],"properties":{"id":"24660953","dp":9161,"de":0}},{"type":"Polygon","arcs":[[2486,2487,2488,-2485,2489,2490,2491]],"properties":{"id":"24660954","dp":3154,"de":632}},{"type":"Polygon","arcs":[[2492,2493,2494,2495,2496,2497]],"properties":{"id":"24660955","dp":2302,"de":4021}},{"type":"Polygon","arcs":[[2498,-2495,2499]],"properties":{"id":"24660956","dp":9854,"de":0}},{"type":"Polygon","arcs":[[-2500,-2494,2500,2501]],"properties":{"id":"24660957","dp":7941,"de":0}},{"type":"Polygon","arcs":[[-2501,-2493,2502,2503,2504]],"properties":{"id":"24660958","dp":5311,"de":1425}},{"type":"Polygon","arcs":[[-2504,2505,2506]],"properties":{"id":"24660959","dp":9409,"de":3935}},{"type":"Polygon","arcs":[[2507,2508,2509,-2506,2510,2511]],"properties":{"id":"24660960","dp":7666,"de":0}},{"type":"Polygon","arcs":[[-2508,2512,2513,2514]],"properties":{"id":"24660961","dp":7663,"de":0}},{"type":"Polygon","arcs":[[-2515,2515,2516,-2509]],"properties":{"id":"24660962","dp":10592,"de":0}},{"type":"Polygon","arcs":[[-2514,2517,2518,-2516]],"properties":{"id":"24660963","dp":17674,"de":0}},{"type":"Polygon","arcs":[[2519,-2510,-2517,-2519,2520,-2432,-2426,2521]],"properties":{"id":"24660964","dp":4929,"de":486}},{"type":"MultiPolygon","arcs":[[[-2502,-2505,-2507,-2520,2522,-2496,-2499]],[[2523,2524,2525]]],"properties":{"id":"24660965","dp":2729,"de":1049}},{"type":"Polygon","arcs":[[2526,2527,2528,2529,2530,2531,2532,2533,2534]],"properties":{"id":"24660993","dp":2196,"de":3472}},{"type":"Polygon","arcs":[[2535,2536,-2532]],"properties":{"id":"24660994","dp":13724,"de":0}},{"type":"Polygon","arcs":[[2537,2538,-2536,-2531]],"properties":{"id":"24660995","dp":10984,"de":0}},{"type":"Polygon","arcs":[[2539,-19,-18,2540,2541]],"properties":{"id":"24660997","dp":12708,"de":0}},{"type":"Polygon","arcs":[[-2541,-17,-11,2542,2543,2544]],"properties":{"id":"24660998","dp":11929,"de":0}},{"type":"Polygon","arcs":[[-2543,-15,-9,2545,2546]],"properties":{"id":"24660999","dp":11446,"de":0}},{"type":"Polygon","arcs":[[-2546,-7,-2,-600,2547,2548]],"properties":{"id":"24661000","dp":5922,"de":1085}},{"type":"Polygon","arcs":[[-2544,-2547,-2549,2549,2550]],"properties":{"id":"24661001","dp":13156,"de":0}},{"type":"Polygon","arcs":[[-2550,-2548,-603,2551,2552,2553,2554]],"properties":{"id":"24661002","dp":10699,"de":0}},{"type":"Polygon","arcs":[[2555,-2552,-602,-41,2556]],"properties":{"id":"24661003","dp":10741,"de":1235}},{"type":"Polygon","arcs":[[2557,2558,2559,2560]],"properties":{"id":"24661114","dp":11867,"de":1264}},{"type":"Polygon","arcs":[[2561,2562,-2558,2563]],"properties":{"id":"24661116","dp":17239,"de":0}},{"type":"Polygon","arcs":[[2564,-2564,2565,2566]],"properties":{"id":"24661117","dp":12894,"de":3728}},{"type":"Polygon","arcs":[[2567,2568,2569,2570,-2567,2571]],"properties":{"id":"24661118","dp":9790,"de":7714}},{"type":"Polygon","arcs":[[2572,2573,-2569,2574,2575]],"properties":{"id":"24661119","dp":9914,"de":5109}},{"type":"Polygon","arcs":[[-2575,-2568,2576,2577,2578]],"properties":{"id":"24661120","dp":9918,"de":1103}},{"type":"Polygon","arcs":[[-2572,2579,2580,2581,-2577]],"properties":{"id":"24661121","dp":8755,"de":5661}},{"type":"Polygon","arcs":[[-2566,-2561,2582,2583,-2580]],"properties":{"id":"24661122","dp":15967,"de":2188}},{"type":"Polygon","arcs":[[-2581,-2584,2584,2585]],"properties":{"id":"24661123","dp":17083,"de":0}},{"type":"Polygon","arcs":[[2586,-2578,-2582,-2586,2587,2588,2589]],"properties":{"id":"24661124","dp":4092,"de":4851}},{"type":"Polygon","arcs":[[2590,2591,2592,-1242,2593,2594]],"properties":{"id":"24661125","dp":5881,"de":3774}},{"type":"Polygon","arcs":[[-2594,-1241,2595]],"properties":{"id":"24661126","dp":9908,"de":1987}},{"type":"Polygon","arcs":[[2596,2597,-2596,-1240,-1238,-1236]],"properties":{"id":"24661127","dp":8756,"de":4166}},{"type":"Polygon","arcs":[[-2595,-2598,2598]],"properties":{"id":"24661128","dp":12551,"de":3497}},{"type":"Polygon","arcs":[[2599,2600,2601,-2599,-2597]],"properties":{"id":"24661129","dp":8860,"de":980}},{"type":"Polygon","arcs":[[2602,2603,-2600,-1235]],"properties":{"id":"24661130","dp":13182,"de":1629}},{"type":"Polygon","arcs":[[2604,2605,2606,-2603,-1234,-1232]],"properties":{"id":"24661131","dp":14178,"de":0}},{"type":"Polygon","arcs":[[2607,-2605,-1231,-1190]],"properties":{"id":"24661132","dp":11372,"de":1395}},{"type":"Polygon","arcs":[[-1189,2608,-2606,-2608]],"properties":{"id":"24661133","dp":10964,"de":1169}},{"type":"Polygon","arcs":[[-1188,2609,2610,2611,2612,-2604,-2607,-2609]],"properties":{"id":"24661134","dp":3930,"de":1008}},{"type":"Polygon","arcs":[[2613,2614,-2477,-2483,2615]],"properties":{"id":"24660935","dp":11908,"de":0}},{"type":"Polygon","arcs":[[-2616,2616,2617,2618,2619]],"properties":{"id":"24660936","dp":10886,"de":0}},{"type":"Polygon","arcs":[[-2618,2620,2621,2622,2623]],"properties":{"id":"24660937","dp":10815,"de":0}},{"type":"Polygon","arcs":[[-2622,2624,2625]],"properties":{"id":"24660938","dp":10205,"de":0}},{"type":"Polygon","arcs":[[-2621,-2617,-2480,2626,-2625]],"properties":{"id":"24660939","dp":7011,"de":1597}},{"type":"Polygon","arcs":[[2627,2628,-2623,-2626,-2627,-2482,-2470,2629,2630,2631]],"properties":{"id":"24660940","dp":1940,"de":3894}},{"type":"Polygon","arcs":[[-2629,2632,2633]],"properties":{"id":"24660941","dp":12602,"de":0}},{"type":"Polygon","arcs":[[2634,2635,2636,2637,-2633,-2628,2638]],"properties":{"id":"24660942","dp":11469,"de":0}},{"type":"Polygon","arcs":[[-2637,2639]],"properties":{"id":"24660943","dp":12692,"de":0}},{"type":"Polygon","arcs":[[-2636,2640,2641,2642,-2619,-2624,-2634,-2638,-2640]],"properties":{"id":"24660944","dp":2821,"de":1634}},{"type":"Polygon","arcs":[[2643,2644,-2642,2645]],"properties":{"id":"24660945","dp":6650,"de":0}},{"type":"Polygon","arcs":[[2646,-2614,-2620,-2643,-2645,2647,-2525]],"properties":{"id":"24660946","dp":5511,"de":0}},{"type":"Polygon","arcs":[[-2648,-2644,2648,2649]],"properties":{"id":"24660947","dp":9716,"de":0}},{"type":"Polygon","arcs":[[-2649,-2646,-2641,-2635,2650,2651]],"properties":{"id":"24660948","dp":9356,"de":737}},{"type":"Polygon","arcs":[[-2526,-2650,-2652,2652,-2487,2653]],"properties":{"id":"24660949","dp":10876,"de":493}},{"type":"Polygon","arcs":[[-2488,-2653,-2651,2654,2655]],"properties":{"id":"24660950","dp":9711,"de":679}},{"type":"Polygon","arcs":[[-2489,-2656,2656,-2486]],"properties":{"id":"24660951","dp":14016,"de":0}},{"type":"Polygon","arcs":[[2657,-103,2658,2659,-34]],"properties":{"id":"24661036","dp":9081,"de":3603}},{"type":"Polygon","arcs":[[2660,2661,2662,-2659,-101]],"properties":{"id":"24661037","dp":12683,"de":0}},{"type":"Polygon","arcs":[[2663,2664,-2660,-2663]],"properties":{"id":"24661038","dp":11284,"de":3142}},{"type":"Polygon","arcs":[[-54,-48,-43,-35,-2665,2665]],"properties":{"id":"24661039","dp":6049,"de":2821}},{"type":"Polygon","arcs":[[2666,-58,-55,-2666,-2664,-2662,2667]],"properties":{"id":"24661040","dp":7503,"de":2654}},{"type":"Polygon","arcs":[[2668,-82,-73,-59,-2667]],"properties":{"id":"24661041","dp":12472,"de":976}},{"type":"Polygon","arcs":[[-2661,-100,-89,-2669,-2668]],"properties":{"id":"24661042","dp":14666,"de":1466}},{"type":"Polygon","arcs":[[-30,2669,2670,-2658,-32]],"properties":{"id":"24661043","dp":13705,"de":797}},{"type":"Polygon","arcs":[[-27,2671,2672,-2670,-29]],"properties":{"id":"24661044","dp":13519,"de":0}},{"type":"Polygon","arcs":[[2673,-2672,-26,-24]],"properties":{"id":"24661045","dp":11781,"de":1224}},{"type":"Polygon","arcs":[[-23,-21,-2317,2674,-94,-102,-2671,-2673,-2674]],"properties":{"id":"24661046","dp":766,"de":510}},{"type":"Polygon","arcs":[[-2521,-2518,-2513,-2512,2675,2676,-2438,-2435]],"properties":{"id":"24660966","dp":2365,"de":909}},{"type":"MultiPolygon","arcs":[[[-2503,-2498,2677,2678,-2676,-2511]],[[2679,2680]]],"properties":{"id":"24660967","dp":3800,"de":740}},{"type":"Polygon","arcs":[[-2677,-2679,2681,2682,2683,-2439]],"properties":{"id":"24660968","dp":8178,"de":3130}},{"type":"Polygon","arcs":[[-2684,2684,2685,-2440]],"properties":{"id":"24660969","dp":14061,"de":2207}},{"type":"Polygon","arcs":[[2686,2687,-2685,2688,2689]],"properties":{"id":"24660970","dp":12500,"de":1190}},{"type":"Polygon","arcs":[[-2437,-2441,-2686,-2688,2690,-2434]],"properties":{"id":"24660971","dp":8921,"de":0}},{"type":"Polygon","arcs":[[-2691,-2687,2691,2692,-2428]],"properties":{"id":"24660972","dp":11556,"de":0}},{"type":"Polygon","arcs":[[-2692,-2690,2693,2694]],"properties":{"id":"24660973","dp":12628,"de":0}},{"type":"Polygon","arcs":[[-2695,2695,2696]],"properties":{"id":"24660974","dp":9657,"de":0}},{"type":"Polygon","arcs":[[-2693,-2697,2697,2698,-2422,-2429]],"properties":{"id":"24660975","dp":12725,"de":0}},{"type":"Polygon","arcs":[[-2699,2699,2700,2701,-2420,-2423]],"properties":{"id":"24660976","dp":5042,"de":2127}},{"type":"Polygon","arcs":[[-2701,2702,2703,2704]],"properties":{"id":"24660977","dp":9210,"de":771}},{"type":"Polygon","arcs":[[2705,-2703,2706,2707,-2452,-2457]],"properties":{"id":"24660978","dp":6021,"de":712}},{"type":"Polygon","arcs":[[2708,2709,2710,2711,2712]],"properties":{"id":"24661071","dp":6304,"de":980}},{"type":"Polygon","arcs":[[2713,-2712,2714,-1982,-1979,2715,2716]],"properties":{"id":"24661072","dp":3038,"de":1041}},{"type":"Polygon","arcs":[[2717,-2713,-2714,2718]],"properties":{"id":"24661073","dp":9224,"de":7613}},{"type":"Polygon","arcs":[[2719,2720,2721,2722]],"properties":{"id":"24661080","dp":106320,"de":7200}},{"type":"Polygon","arcs":[[2723,-2723,2724,2725]],"properties":{"id":"24661081","dp":36742,"de":6285}},{"type":"Polygon","arcs":[[2726,-2726,2727,2728]],"properties":{"id":"24661082","dp":65076,"de":19230}},{"type":"Polygon","arcs":[[2729,-2729,2730,2731,2732]],"properties":{"id":"24661083","dp":10943,"de":4716}},{"type":"Polygon","arcs":[[-2732,2733,2734]],"properties":{"id":"24661084","dp":34946,"de":8776}},{"type":"Polygon","arcs":[[2735,-2734,-2731,-2728,2736,2737]],"properties":{"id":"24661086","dp":1993,"de":14953}},{"type":"Polygon","arcs":[[-2725,2738,-228,2739,-2737]],"properties":{"id":"24661087","dp":14900,"de":24502}},{"type":"Polygon","arcs":[[2740,2741,-229,2742,-2721]],"properties":{"id":"24661093","dp":17007,"de":28346}},{"type":"Polygon","arcs":[[-2722,-2743,-225,-2739]],"properties":{"id":"24661094","dp":71875,"de":25390}},{"type":"Polygon","arcs":[[2743,2744,2745]],"properties":{"id":"24661099","dp":13087,"de":2631}},{"type":"Polygon","arcs":[[-2746,2746,2747,2748,2749,2750,2751,2752]],"properties":{"id":"24661100","dp":6033,"de":9406}},{"type":"Polygon","arcs":[[2753,2754,-2753,2755,2756]],"properties":{"id":"24661102","dp":12857,"de":5869}},{"type":"Polygon","arcs":[[2757,2758,-2754,2759]],"properties":{"id":"24661103","dp":19795,"de":6326}},{"type":"Polygon","arcs":[[2760,2761,2762,-2611]],"properties":{"id":"24661135","dp":9961,"de":701}},{"type":"Polygon","arcs":[[2763,2764,2765,-2762]],"properties":{"id":"24661136","dp":10724,"de":0}},{"type":"Polygon","arcs":[[2766,2767,-2764,-2761,-2610,-1187,-820]],"properties":{"id":"24661137","dp":15317,"de":941}},{"type":"Polygon","arcs":[[2768,-2765,-2768,2769]],"properties":{"id":"24661138","dp":14517,"de":0}},{"type":"Polygon","arcs":[[-215,2770,2771,-2770,-2767,-819,2772,-221,-218]],"properties":{"id":"24661139","dp":11507,"de":4767}},{"type":"Polygon","arcs":[[-2772,2773,2774,-2766,-2769]],"properties":{"id":"24661140","dp":12708,"de":925}},{"type":"Polygon","arcs":[[2775,2776,-2774,2777]],"properties":{"id":"24661141","dp":17060,"de":2027}},{"type":"Polygon","arcs":[[-2777,2778,-2763,-2775]],"properties":{"id":"24661142","dp":6130,"de":0}},{"type":"Polygon","arcs":[[2779,2780,-2778,-2771,-214]],"properties":{"id":"24661143","dp":17058,"de":0}},{"type":"Polygon","arcs":[[2781,2782,2783]],"properties":{"id":"24661318","dp":14343,"de":8838}},{"type":"Polygon","arcs":[[2784,-2783,2785,2786]],"properties":{"id":"24661319","dp":21226,"de":1915}},{"type":"Polygon","arcs":[[2787,2788,2789,-2785,2790,2791,2792]],"properties":{"id":"24661320","dp":6695,"de":9399}},{"type":"Polygon","arcs":[[2793,2794,-2789]],"properties":{"id":"24661321","dp":26318,"de":7692}},{"type":"Polygon","arcs":[[-1356,2795,2796,2797]],"properties":{"id":"24661322","dp":15896,"de":0}},{"type":"Polygon","arcs":[[2798,2799,2800,2801,-2796]],"properties":{"id":"24661323","dp":20628,"de":0}},{"type":"Polygon","arcs":[[2802,-2800,2803,2804]],"properties":{"id":"24661324","dp":10893,"de":0}},{"type":"Polygon","arcs":[[-2801,-2803,2805,2806,2807]],"properties":{"id":"24661325","dp":22913,"de":0}},{"type":"Polygon","arcs":[[2808,-2807,2809]],"properties":{"id":"24661326","dp":22238,"de":0}},{"type":"Polygon","arcs":[[-2810,2810,2811]],"properties":{"id":"24661327","dp":28231,"de":0}},{"type":"Polygon","arcs":[[2812,2813,2814,2815,-2812,2816]],"properties":{"id":"24661328","dp":28682,"de":5574}},{"type":"Polygon","arcs":[[-2816,2817,2818,2819,-2808,-2809]],"properties":{"id":"24661329","dp":20798,"de":6230}},{"type":"Polygon","arcs":[[2820,2821,-2802,-2820]],"properties":{"id":"24661330","dp":19015,"de":4166}},{"type":"Polygon","arcs":[[2822,-2797,-2822,2823,2824]],"properties":{"id":"24661331","dp":15550,"de":0}},{"type":"Polygon","arcs":[[2825,2826,2827,2828,-2824,-2821]],"properties":{"id":"24661332","dp":10467,"de":5632}},{"type":"Polygon","arcs":[[2829,-2826,-2819,2830]],"properties":{"id":"24661333","dp":19484,"de":5357}},{"type":"Polygon","arcs":[[2831,2832,2833,-2831,-2818,-2815]],"properties":{"id":"24661334","dp":1442,"de":44407}},{"type":"Polygon","arcs":[[-2817,-2811,-2806,-2805,2834,2835,2836]],"properties":{"id":"24661335","dp":5345,"de":44384}},{"type":"Polygon","arcs":[[2837,2838,-2837,2839,-1334]],"properties":{"id":"24661336","dp":4168,"de":10743}},{"type":"Polygon","arcs":[[2840,2841,2842,-1324]],"properties":{"id":"24661337","dp":6426,"de":2200}},{"type":"Polygon","arcs":[[-2840,-2836,2843,-1341,-1335]],"properties":{"id":"24661338","dp":11828,"de":0}},{"type":"Polygon","arcs":[[-2799,-1355,-1344,-2844,-2835,-2804]],"properties":{"id":"24661339","dp":14736,"de":827}},{"type":"Polygon","arcs":[[2844,2845,2846,2847]],"properties":{"id":"24661340","dp":10679,"de":2341}},{"type":"Polygon","arcs":[[-2845,2848,2849]],"properties":{"id":"24661341","dp":18819,"de":0}},{"type":"Polygon","arcs":[[-2850,2850,2851]],"properties":{"id":"24661342","dp":25999,"de":0}},{"type":"Polygon","arcs":[[-1360,-2851,2852,2853]],"properties":{"id":"24661343","dp":28256,"de":1153}},{"type":"Polygon","arcs":[[2854,2855,2856,-235,-2853]],"properties":{"id":"24661344","dp":11419,"de":0}},{"type":"Polygon","arcs":[[2857,-2855,-2849]],"properties":{"id":"24661345","dp":10982,"de":0}},{"type":"Polygon","arcs":[[2858,-2856,-2858,-2848,2859,2860,2861]],"properties":{"id":"24661346","dp":10621,"de":2118}},{"type":"Polygon","arcs":[[2862,-236,-2857,-2859,2863]],"properties":{"id":"24661347","dp":12509,"de":1636}},{"type":"Polygon","arcs":[[-2612,-2779,-2776,-2781,2864,2865,2866,2867,2868,-78,-84,-96,2869,2870,2871]],"properties":{"id":"24661047","dp":662,"de":1474}},{"type":"Polygon","arcs":[[2872,2873,2874,2875,2876,2877,2878]],"properties":{"id":"24661048","dp":10641,"de":1368}},{"type":"Polygon","arcs":[[2879,-2877,2880,2881]],"properties":{"id":"24661049","dp":15948,"de":0}},{"type":"Polygon","arcs":[[-2876,2882,2883,2884,-2881]],"properties":{"id":"24661050","dp":7888,"de":4583}},{"type":"Polygon","arcs":[[2885,2886,-2884,2887,2888,2889,2890,2891]],"properties":{"id":"24661051","dp":7705,"de":4329}},{"type":"Polygon","arcs":[[-2882,-2885,-2887,2892,2893]],"properties":{"id":"24661052","dp":10079,"de":1888}},{"type":"Polygon","arcs":[[-2893,-2886,2894,2895]],"properties":{"id":"24661053","dp":15918,"de":4373}},{"type":"Polygon","arcs":[[-2878,-2880,-2894,-2896,2896,2897]],"properties":{"id":"24661054","dp":4683,"de":3448}},{"type":"Polygon","arcs":[[-2897,2898,2899,2900,2901,2902,2903,-2573,2904]],"properties":{"id":"24661055","dp":5696,"de":7172}},{"type":"Polygon","arcs":[[2905,2906,2907,2908,2909,-2900,2910]],"properties":{"id":"24661058","dp":8016,"de":4474}},{"type":"Polygon","arcs":[[2911,-2908]],"properties":{"id":"24661059","dp":21576,"de":2717}},{"type":"Polygon","arcs":[[-2909,-2912,-2907,2912,2913,2914]],"properties":{"id":"24661060","dp":8331,"de":9517}},{"type":"Polygon","arcs":[[2915,2916,2917,2918]],"properties":{"id":"24660668","dp":18577,"de":0}},{"type":"Polygon","arcs":[[-2918,2919,2920,2921,2922]],"properties":{"id":"24660669","dp":10729,"de":5208}},{"type":"Polygon","arcs":[[2923,2924,-2921,2925]],"properties":{"id":"24660670","dp":32008,"de":0}},{"type":"Polygon","arcs":[[2926,2927,-2924,2928]],"properties":{"id":"24660671","dp":33656,"de":0}},{"type":"Polygon","arcs":[[2929,2930,-2927,2931]],"properties":{"id":"24660672","dp":20829,"de":2183}},{"type":"Polygon","arcs":[[2932,2933,-2930,2934]],"properties":{"id":"24660673","dp":19867,"de":0}},{"type":"Polygon","arcs":[[-2793,2935,2936,2937,2938,-929,-923,-919,2939,2940]],"properties":{"id":"24660676","dp":2074,"de":4783}},{"type":"Polygon","arcs":[[2941,-2934,2942,-2936,-2792]],"properties":{"id":"24660677","dp":7771,"de":3762}},{"type":"Polygon","arcs":[[-2942,-2791,2943,-2931]],"properties":{"id":"24660678","dp":41397,"de":0}},{"type":"Polygon","arcs":[[-2944,-2787,2944,-2928]],"properties":{"id":"24660679","dp":25133,"de":0}},{"type":"Polygon","arcs":[[-2925,-2945,2945]],"properties":{"id":"24660680","dp":17854,"de":0}},{"type":"Polygon","arcs":[[2946,-2922,-2946,-2786,2947,-2825,-2829]],"properties":{"id":"24660681","dp":12996,"de":1167}},{"type":"Polygon","arcs":[[-2923,-2947,-2828,2948]],"properties":{"id":"24660682","dp":8995,"de":0}},{"type":"Polygon","arcs":[[2949,-2919,-2949,-2827]],"properties":{"id":"24660683","dp":17903,"de":0}},{"type":"Polygon","arcs":[[2950,-2950,-2830,2951]],"properties":{"id":"24660684","dp":25898,"de":0}},{"type":"Polygon","arcs":[[2952,2953,-2952,-2834]],"properties":{"id":"24660685","dp":26000,"de":0}},{"type":"Polygon","arcs":[[2954,-231,-2760,-2757,2955,2956,2957,-1310,2958]],"properties":{"id":"24661104","dp":6626,"de":56553}},{"type":"Polygon","arcs":[[2959,-2740,-227,-2955]],"properties":{"id":"24661105","dp":14474,"de":80365}},{"type":"Polygon","arcs":[[2960,2961,-2738,-2960,-2959,-1309,2962,2963]],"properties":{"id":"24661106","dp":3120,"de":61103}},{"type":"Polygon","arcs":[[2964,2965,2966,2967]],"properties":{"id":"24661108","dp":11387,"de":1438}},{"type":"Polygon","arcs":[[-2589,2968,2969,-2965]],"properties":{"id":"24661109","dp":19050,"de":0}},{"type":"Polygon","arcs":[[-2583,2970,2971,-2969,-2588,-2585]],"properties":{"id":"24661110","dp":11532,"de":4125}},{"type":"Polygon","arcs":[[-2972,2972,2973]],"properties":{"id":"24661111","dp":18640,"de":3236}},{"type":"Polygon","arcs":[[2974,-242,2975,-175]],"properties":{"id":"24663212","dp":18537,"de":1679}},{"type":"Polygon","arcs":[[-178,-2976,2976,-202,-232]],"properties":{"id":"24663213","dp":8255,"de":0}},{"type":"Polygon","arcs":[[-241,2977,2978,-203,-2977]],"properties":{"id":"24663214","dp":12494,"de":4880}},{"type":"MultiPolygon","arcs":[[[2979,2980,2981,2982]],[[2983]],[[2984,2985,2986,2987,2988]]],"properties":{"id":"24663067","dp":259,"de":112}},{"type":"Polygon","arcs":[[-2953,-2833,2989,2990]],"properties":{"id":"24660686","dp":8668,"de":1815}},{"type":"Polygon","arcs":[[2991,2992,-2991,2993]],"properties":{"id":"24660687","dp":22923,"de":10073}},{"type":"Polygon","arcs":[[2994,2995,2996,-2990]],"properties":{"id":"24660688","dp":20687,"de":0}},{"type":"Polygon","arcs":[[2997,-2996,2998,2999]],"properties":{"id":"24660689","dp":29575,"de":0}},{"type":"Polygon","arcs":[[3000,-3000,3001,3002]],"properties":{"id":"24660690","dp":12919,"de":0}},{"type":"Polygon","arcs":[[-3003,3003,3004,3005,3006]],"properties":{"id":"24660691","dp":5439,"de":20443}},{"type":"Polygon","arcs":[[-3004,-3002,-2999,3007,3008]],"properties":{"id":"24660692","dp":11088,"de":3901}},{"type":"Polygon","arcs":[[-3008,-2995,-2832,3009]],"properties":{"id":"24660693","dp":22857,"de":14285}},{"type":"Polygon","arcs":[[3010,-3009,-3010,-2814,3011]],"properties":{"id":"24660694","dp":22350,"de":14035}},{"type":"Polygon","arcs":[[3012,-3012,-2813,-2839]],"properties":{"id":"24660695","dp":20388,"de":1124}},{"type":"Polygon","arcs":[[3013,-3005,-3011,-3013,3014,3015]],"properties":{"id":"24660696","dp":24400,"de":5555}},{"type":"Polygon","arcs":[[-3015,-2838,-1325,-2843]],"properties":{"id":"24660697","dp":15011,"de":4231}},{"type":"Polygon","arcs":[[3016,-3016,-2842]],"properties":{"id":"24660698","dp":21565,"de":10869}},{"type":"Polygon","arcs":[[3017,-3006,-3014,-3017,-2841,-1323,3018]],"properties":{"id":"24660699","dp":6191,"de":8508}},{"type":"Polygon","arcs":[[3019,-3019,-1322,3020,3021,3022]],"properties":{"id":"24660700","dp":15954,"de":22330}},{"type":"Polygon","arcs":[[-3022,3023,3024]],"properties":{"id":"24660701","dp":33450,"de":0}},{"type":"MultiPolygon","arcs":[[[3025,3026,3027,3028,3029,3030,-2866]],[[3031,-2868,3032]]],"properties":{"id":"24661184","dp":4169,"de":2953}},{"type":"Polygon","arcs":[[-3029,3033,3034]],"properties":{"id":"24661185","dp":12280,"de":1253}},{"type":"Polygon","arcs":[[-79,-2869,3035,-67,-72]],"properties":{"id":"24661187","dp":9794,"de":940}},{"type":"MultiPolygon","arcs":[[[3036,3037,3038,3039,3040,3041,3042]],[[3043,-69,3044,3045]]],"properties":{"id":"24661189","dp":6727,"de":727}},{"type":"MultiPolygon","arcs":[[[3046,3047,3048,3049,3050,-3037]],[[3051,-63,-3044,3052]]],"properties":{"id":"24661190","dp":8156,"de":1633}},{"type":"Polygon","arcs":[[3053,3054,3055,3056,3057]],"properties":{"id":"24663180","dp":2415,"de":686}},{"type":"Polygon","arcs":[[-3056,3058,3059,3060,3061,3062]],"properties":{"id":"24663181","dp":3183,"de":1018}},{"type":"Polygon","arcs":[[3063,3064,-1509,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074]],"properties":{"id":"24663182","dp":1077,"de":1517}},{"type":"Polygon","arcs":[[3075,-3075]],"properties":{"id":"24663183","dp":5428,"de":877}},{"type":"Polygon","arcs":[[3076,3077,3078,3079,3080,3081,3082]],"properties":{"id":"24663057","dp":593,"de":78}},{"type":"Polygon","arcs":[[3083,3084,3085,-3078]],"properties":{"id":"24663058","dp":2857,"de":312}},{"type":"Polygon","arcs":[[3086,3087,3088,3089,-3080,3090]],"properties":{"id":"24663059","dp":2379,"de":437}},{"type":"Polygon","arcs":[[3091,3092,-3088,3093]],"properties":{"id":"24663060","dp":2919,"de":0}},{"type":"Polygon","arcs":[[3094,-3089,-3093,3095]],"properties":{"id":"24663061","dp":3187,"de":250}},{"type":"Polygon","arcs":[[3096,3097,3098,-3090,-3095]],"properties":{"id":"24663062","dp":2804,"de":0}},{"type":"Polygon","arcs":[[3099,3100,-2986,3101,-2983,3102,3103]],"properties":{"id":"24663068","dp":126,"de":44}},{"type":"Polygon","arcs":[[-2538,-2530,3104,-703,-2320,3105,3106,-2312,-20,-2540,3107]],"properties":{"id":"24663306","dp":8248,"de":513}},{"type":"Polygon","arcs":[[3108,-1073,3109,3110,3111,3112,3113,-2053,3114,3115,3116,3117,3118,-930,-2939]],"properties":{"id":"24663311","dp":1255,"de":2169}},{"type":"Polygon","arcs":[[3119,-346,-344,-359,-245,-625,3120]],"properties":{"id":"24663314","dp":3789,"de":3877}},{"type":"Polygon","arcs":[[3121,3122,3123,3124,3125,3126,3127,3128]],"properties":{"id":"24663263","dp":4368,"de":4448}},{"type":"Polygon","arcs":[[3129,3130,3131,3132,3133]],"properties":{"id":"24663264","dp":14594,"de":900}},{"type":"Polygon","arcs":[[3134,3135,3136,3137]],"properties":{"id":"24663266","dp":11922,"de":0}},{"type":"Polygon","arcs":[[3138,3139,3140,3141,3142,-3098]],"properties":{"id":"24663063","dp":2789,"de":699}},{"type":"Polygon","arcs":[[3143,3144,-2987,-3101,3145,3146,-3141]],"properties":{"id":"24663064","dp":2965,"de":860}},{"type":"Polygon","arcs":[[-3144,-3140,3147]],"properties":{"id":"24663065","dp":5767,"de":0}},{"type":"Polygon","arcs":[[-2988,-3145,-3148,-3139,3148,3149]],"properties":{"id":"24663066","dp":1821,"de":738}},{"type":"Polygon","arcs":[[3150,-2980,-3102,-2985]],"properties":{"id":"24663069","dp":492,"de":40}},{"type":"Polygon","arcs":[[-3146,-3100,3151,3152,3153]],"properties":{"id":"24663070","dp":2795,"de":0}},{"type":"Polygon","arcs":[[-3154,3154,3155,-3142,-3147]],"properties":{"id":"24663071","dp":2994,"de":0}},{"type":"Polygon","arcs":[[-3153,3156,3157,-3155]],"properties":{"id":"24663072","dp":3381,"de":344}},{"type":"Polygon","arcs":[[-3143,-3156,-3158,3158,-3081,-3099]],"properties":{"id":"24663073","dp":2370,"de":1312}},{"type":"Polygon","arcs":[[-3082,-3159,-3157,-3152,-3104,3159,3160,3161]],"properties":{"id":"24663074","dp":338,"de":51}},{"type":"Polygon","arcs":[[3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,3177]],"properties":{"id":"24663334","dp":0,"de":983}},{"type":"Polygon","arcs":[[3178,3179,3180,3181]],"properties":{"id":"24660010","dp":3254,"de":395}},{"type":"Polygon","arcs":[[-2290,-2295,3182,3183,3184]],"properties":{"id":"24660250","dp":15885,"de":0}},{"type":"Polygon","arcs":[[-3185,3185,3186,-2291]],"properties":{"id":"24660251","dp":18471,"de":2159}},{"type":"Polygon","arcs":[[-3187,3187,3188,-2283]],"properties":{"id":"24660252","dp":12673,"de":1157}},{"type":"Polygon","arcs":[[-3188,-3186,-3184,3189,-1906,-1909,-1911,3190,3191]],"properties":{"id":"24660253","dp":4949,"de":2626}},{"type":"Polygon","arcs":[[-3192,3192,3193,3194]],"properties":{"id":"24660254","dp":12413,"de":2337}},{"type":"Polygon","arcs":[[-3189,-3195,-2266,-2277]],"properties":{"id":"24660255","dp":13650,"de":0}},{"type":"Polygon","arcs":[[3195,3196,-222,-2773,-818]],"properties":{"id":"24661147","dp":16692,"de":3359}},{"type":"Polygon","arcs":[[-813,3197,-3196,-817]],"properties":{"id":"24661148","dp":7286,"de":28963}},{"type":"Polygon","arcs":[[-223,-3197,-3198,3198]],"properties":{"id":"24661149","dp":12032,"de":5954}},{"type":"Polygon","arcs":[[3199,3200,3201,-224,-3199,-812]],"properties":{"id":"24661150","dp":8940,"de":10433}},{"type":"Polygon","arcs":[[3202,3203,-3200,-811]],"properties":{"id":"24661151","dp":10386,"de":2976}},{"type":"Polygon","arcs":[[3204,3205,-3203,-809]],"properties":{"id":"24661152","dp":16071,"de":1488}},{"type":"Polygon","arcs":[[3206,3207,-3205,-806]],"properties":{"id":"24661153","dp":15435,"de":4054}},{"type":"Polygon","arcs":[[3208,3209,3210,3211,-306,-295,-291,3212]],"properties":{"id":"24660082","dp":7922,"de":1243}},{"type":"Polygon","arcs":[[3213,-3213,-290,-288,-283]],"properties":{"id":"24660083","dp":7790,"de":843}},{"type":"Polygon","arcs":[[3214,3215,-3209,-3214,-282,3216]],"properties":{"id":"24660084","dp":8822,"de":0}},{"type":"Polygon","arcs":[[3217,3218,3219,3220,-3217,-281,3221]],"properties":{"id":"24660085","dp":9453,"de":1045}},{"type":"Polygon","arcs":[[3222,3223,3224,-3220]],"properties":{"id":"24660086","dp":12280,"de":0}},{"type":"Polygon","arcs":[[3225,-3223,-3219,3226]],"properties":{"id":"24660087","dp":20078,"de":0}},{"type":"Polygon","arcs":[[3227,-3224,-3226,3228,3229]],"properties":{"id":"24660088","dp":19234,"de":0}},{"type":"MultiPolygon","arcs":[[[3230,3231,3232,3233,3234,3235,3236,-3050,3237]],[[3238,3239,3240,3241,-3052,3242]]],"properties":{"id":"24661191","dp":5217,"de":395}},{"type":"Polygon","arcs":[[3243,-3231,3244,3245]],"properties":{"id":"24661192","dp":10329,"de":3047}},{"type":"Polygon","arcs":[[3246,-3232,-3244,3247]],"properties":{"id":"24661193","dp":14310,"de":2155}},{"type":"Polygon","arcs":[[3248,-3233,-3247,3249,3250]],"properties":{"id":"24661194","dp":10312,"de":780}},{"type":"Polygon","arcs":[[3251,-3234,-3249,3252,3253]],"properties":{"id":"24661195","dp":7338,"de":1778}},{"type":"Polygon","arcs":[[3254,3255,3256,-3235,-3252,3257]],"properties":{"id":"24661196","dp":6634,"de":437}},{"type":"Polygon","arcs":[[3258,3259,3260,3261,3262,-3256]],"properties":{"id":"24661197","dp":10199,"de":1268}},{"type":"Polygon","arcs":[[3263,3264,-3262,3265]],"properties":{"id":"24661198","dp":11922,"de":915}},{"type":"Polygon","arcs":[[3266,3267,-3266,-3261]],"properties":{"id":"24661199","dp":13511,"de":1272}},{"type":"Polygon","arcs":[[3268,3269,3270,3271,-3268,3272]],"properties":{"id":"24661200","dp":7638,"de":0}},{"type":"Polygon","arcs":[[3273,3274,-3271,3275]],"properties":{"id":"24661201","dp":12803,"de":0}},{"type":"Polygon","arcs":[[3276,-3264,-3272,-3275]],"properties":{"id":"24661202","dp":10665,"de":0}},{"type":"Polygon","arcs":[[3277,3278,-354,3279]],"properties":{"id":"24660108","dp":12724,"de":0}},{"type":"Polygon","arcs":[[-1988,-831,-834,-184,-193,3280,3281]],"properties":{"id":"24663184","dp":2621,"de":2323}},{"type":"Polygon","arcs":[[-3282,3282,-1976,-1984,-1989]],"properties":{"id":"24663185","dp":4750,"de":1246}},{"type":"Polygon","arcs":[[-3283,-3281,-198,3283,3284,3285,-1977]],"properties":{"id":"24663186","dp":4383,"de":757}},{"type":"Polygon","arcs":[[3286,3287,-1967,-3286]],"properties":{"id":"24663187","dp":2962,"de":1234}},{"type":"Polygon","arcs":[[3288,-3287,-3285,3289,3290]],"properties":{"id":"24663188","dp":4195,"de":394}},{"type":"Polygon","arcs":[[-3290,3291,3292]],"properties":{"id":"24663189","dp":14500,"de":0}},{"type":"Polygon","arcs":[[-3284,-197,-208,3293,-3292]],"properties":{"id":"24663190","dp":11452,"de":1085}},{"type":"Polygon","arcs":[[3294,3295,-3291]],"properties":{"id":"24663191","dp":16375,"de":0}},{"type":"Polygon","arcs":[[3296,3297,3298,3299,3300,3301,3302]],"properties":{"id":"24663194","dp":6012,"de":1831}},{"type":"Polygon","arcs":[[-3298,3303,3304,3305]],"properties":{"id":"24663195","dp":20000,"de":0}},{"type":"Polygon","arcs":[[3306,3307,3308,-3299,-3306,3309,3310]],"properties":{"id":"24663196","dp":6317,"de":5079}},{"type":"Polygon","arcs":[[3311,-3310,-3305,3312,-210]],"properties":{"id":"24663197","dp":8346,"de":0}},{"type":"Polygon","arcs":[[-204,-2979,3313,-3311,-3312,-209]],"properties":{"id":"24663198","dp":10715,"de":6769}},{"type":"Polygon","arcs":[[-3314,-2978,3314,-114,3315,-3307]],"properties":{"id":"24663199","dp":7392,"de":12541}},{"type":"Polygon","arcs":[[-113,-695,-3308,-3316]],"properties":{"id":"24663200","dp":12563,"de":2689}},{"type":"Polygon","arcs":[[3316,-115,-3315,-240]],"properties":{"id":"24663201","dp":6288,"de":8951}},{"type":"Polygon","arcs":[[3317,3318,-116,-3317,-239]],"properties":{"id":"24663202","dp":11703,"de":3548}},{"type":"Polygon","arcs":[[3319,-127,-117,-3319,3320]],"properties":{"id":"24663203","dp":34809,"de":4761}},{"type":"Polygon","arcs":[[-128,-3320,3321,3322,3323,3324]],"properties":{"id":"24663204","dp":9533,"de":0}},{"type":"Polygon","arcs":[[-3322,-3321,-3318,-238,3325,3326]],"properties":{"id":"24663205","dp":17491,"de":2920}},{"type":"Polygon","arcs":[[-3323,-3327,3327,3328]],"properties":{"id":"24663206","dp":26118,"de":7805}},{"type":"Polygon","arcs":[[3329,-3328,-3326,-244,3330,-173]],"properties":{"id":"24663207","dp":17308,"de":0}},{"type":"Polygon","arcs":[[-161,3331,3332,-3324,-3329,-3330,-172,-164]],"properties":{"id":"24663208","dp":11967,"de":1083}},{"type":"Polygon","arcs":[[-804,3333,3334,-3207]],"properties":{"id":"24661154","dp":13961,"de":2759}},{"type":"Polygon","arcs":[[-802,3335,3336,-3334]],"properties":{"id":"24661155","dp":21612,"de":2764}},{"type":"Polygon","arcs":[[-800,3337,3338,-3336]],"properties":{"id":"24661156","dp":22321,"de":4241}},{"type":"Polygon","arcs":[[3339,3340,-3338,-798]],"properties":{"id":"24661157","dp":19493,"de":0}},{"type":"Polygon","arcs":[[3341,3342,-3340,-796]],"properties":{"id":"24661158","dp":18669,"de":4935}},{"type":"Polygon","arcs":[[3343,3344,-3342,-795]],"properties":{"id":"24661159","dp":14922,"de":2519}},{"type":"Polygon","arcs":[[3345,3346,-3344,-787]],"properties":{"id":"24661160","dp":15663,"de":3763}},{"type":"Polygon","arcs":[[3347,3348,-3346,-785]],"properties":{"id":"24661161","dp":9785,"de":2412}},{"type":"Polygon","arcs":[[3349,3350,3351,-3348,-784]],"properties":{"id":"24661162","dp":13058,"de":1106}},{"type":"Polygon","arcs":[[3352,3353,3354,-3350,-783]],"properties":{"id":"24661163","dp":16531,"de":0}},{"type":"Polygon","arcs":[[3355,3356,-3353,-782,3357]],"properties":{"id":"24661164","dp":16909,"de":0}},{"type":"Polygon","arcs":[[3358,3359,-3356,3360]],"properties":{"id":"24661165","dp":10887,"de":1380}},{"type":"Polygon","arcs":[[3361,-3255,3362,-3361,-3358,-781,3363,3364]],"properties":{"id":"24661166","dp":5202,"de":1692}},{"type":"Polygon","arcs":[[-3258,3365,-3363]],"properties":{"id":"24661167","dp":15246,"de":0}},{"type":"Polygon","arcs":[[-3366,-3254,3366,-3359]],"properties":{"id":"24661168","dp":13460,"de":0}},{"type":"Polygon","arcs":[[-3367,-3253,-3251,3367,-3357,-3360]],"properties":{"id":"24661169","dp":15337,"de":1533}},{"type":"Polygon","arcs":[[-3368,-3250,3368,-3354]],"properties":{"id":"24661170","dp":23842,"de":0}},{"type":"Polygon","arcs":[[-3369,-3248,-3246,3369,-3351,-3355]],"properties":{"id":"24661171","dp":14472,"de":3140}},{"type":"Polygon","arcs":[[-3370,-3245,-3238,-3049,3370,-3349,-3352]],"properties":{"id":"24661172","dp":9834,"de":1731}},{"type":"Polygon","arcs":[[-3371,-3048,3371,-3347]],"properties":{"id":"24661173","dp":13832,"de":3310}},{"type":"Polygon","arcs":[[-3372,-3047,3372,-3345]],"properties":{"id":"24661174","dp":21274,"de":3861}},{"type":"Polygon","arcs":[[-3373,-3043,3373,-3343]],"properties":{"id":"24661175","dp":19230,"de":0}},{"type":"Polygon","arcs":[[-3374,-3042,3374,-3341]],"properties":{"id":"24661176","dp":21751,"de":0}},{"type":"Polygon","arcs":[[-3339,-3375,-3041,3375]],"properties":{"id":"24661177","dp":21036,"de":0}},{"type":"Polygon","arcs":[[-3376,-3040,3376,-3335,-3337]],"properties":{"id":"24661178","dp":6833,"de":3742}},{"type":"Polygon","arcs":[[-3377,3377,3378,-3206,-3208]],"properties":{"id":"24661179","dp":14724,"de":1862}},{"type":"Polygon","arcs":[[-3379,3379,3380,-3204]],"properties":{"id":"24661180","dp":23074,"de":0}},{"type":"Polygon","arcs":[[3381,3382,3383,3384,-3201,-3381]],"properties":{"id":"24661181","dp":18403,"de":2409}},{"type":"Polygon","arcs":[[3385,-3027,3386,-3384]],"properties":{"id":"24661182","dp":11259,"de":1358}},{"type":"Polygon","arcs":[[3387,-3034,-3028,-3386,-3383]],"properties":{"id":"24661183","dp":18908,"de":1649}},{"type":"Polygon","arcs":[[-2744,-2755,-2759,3388]],"properties":{"id":"24663246","dp":31756,"de":5620}},{"type":"Polygon","arcs":[[-1307,-1292,-1284,-1282]],"properties":{"id":"24663249","dp":47225,"de":5161}},{"type":"Polygon","arcs":[[3389,3390,3391,3392,3393]],"properties":{"id":"24663250","dp":12063,"de":3798}},{"type":"Polygon","arcs":[[3394,3395,3396,3397,3398]],"properties":{"id":"24663251","dp":11937,"de":0}},{"type":"Polygon","arcs":[[3399,-1105,-2404,-597,3400]],"properties":{"id":"24663252","dp":26443,"de":1408}},{"type":"Polygon","arcs":[[3401,3402,3403,3404,3405,3406,3407,3408,3409,3410]],"properties":{"id":"24663253","dp":13664,"de":1865}},{"type":"MultiPolygon","arcs":[[[-3274,3411,3412,3413,-3277]],[[3414,-2553,-2556,3415,3416]]],"properties":{"id":"24661203","dp":9063,"de":0}},{"type":"MultiPolygon","arcs":[[[3417,-3236,-3257,-3263,-3265,-3414]],[[3418,-3416,-3239]]],"properties":{"id":"24661204","dp":3052,"de":1081}},{"type":"Polygon","arcs":[[3419,-3240,-2557,-40,-45]],"properties":{"id":"24661205","dp":5939,"de":0}},{"type":"Polygon","arcs":[[-3420,-44,-51,3420,-3241]],"properties":{"id":"24661206","dp":6356,"de":550}},{"type":"Polygon","arcs":[[-53,-64,-3242,-3421]],"properties":{"id":"24661207","dp":10224,"de":0}},{"type":"MultiPolygon","arcs":[[[3421,3422,3423,3424,3425,-3412,-3276,-3270,3426]],[[3427,-2554,-3415,3428]]],"properties":{"id":"24661208","dp":295,"de":1732}},{"type":"Polygon","arcs":[[-3273,-3267,3429,3430,-3365,3431]],"properties":{"id":"24661209","dp":5475,"de":356}},{"type":"Polygon","arcs":[[-3260,3432,-3430]],"properties":{"id":"24661210","dp":15641,"de":0}},{"type":"Polygon","arcs":[[-3431,-3433,-3259,-3362]],"properties":{"id":"24661211","dp":12188,"de":4716}},{"type":"Polygon","arcs":[[3433,3434,-1166,-1180,-1183]],"properties":{"id":"24661212","dp":4038,"de":622}},{"type":"Polygon","arcs":[[3435,3436,3437,3438,3439,3440]],"properties":{"id":"24663269","dp":1061,"de":3255}},{"type":"Polygon","arcs":[[3441,3442,3443,3444,3445,3446,3447,3448,3449]],"properties":{"id":"24663270","dp":7341,"de":307}},{"type":"Polygon","arcs":[[-3408,3450,3451,3452,3453,3454,3455,3456,3457,3458]],"properties":{"id":"24663271","dp":2233,"de":11596}},{"type":"Polygon","arcs":[[-2933,3459,-2937,-2943]],"properties":{"id":"24663273","dp":19587,"de":976}},{"type":"Polygon","arcs":[[-1352,-1354,-2854,3460]],"properties":{"id":"24663274","dp":27500,"de":1973}},{"type":"Polygon","arcs":[[-3020,3461,-3295,-3293,-3294,-212,3462,3463,-3007,-3018]],"properties":{"id":"24663275","dp":4884,"de":10149}},{"type":"Polygon","arcs":[[3464,3465,3466]],"properties":{"id":"24663276","dp":12939,"de":0}},{"type":"Polygon","arcs":[[-152,3467,-3332,-160,-157]],"properties":{"id":"24663209","dp":9659,"de":810}},{"type":"Polygon","arcs":[[-133,-124,-3325,-3333,-3468]],"properties":{"id":"24663210","dp":10178,"de":1002}},{"type":"Polygon","arcs":[[-3331,-243,-2975,-174]],"properties":{"id":"24663211","dp":9648,"de":3079}},{"type":"Polygon","arcs":[[-2184,-2180,3468,3469,3470,3471]],"properties":{"id":"24663288","dp":4980,"de":1679}},{"type":"Polygon","arcs":[[-2895,-2892,3472,-2911,-2899]],"properties":{"id":"24663289","dp":8868,"de":2340}},{"type":"MultiPolygon","arcs":[[[3473,-3030,-3035,-3388,-3382,-3380,-3378,-3039]],[[-3045,-68,-3036,-3032,3474]]],"properties":{"id":"24663290","dp":6596,"de":3206}},{"type":"Polygon","arcs":[[3475,3476]],"properties":{"id":"24663291","dp":16843,"de":0}},{"type":"Polygon","arcs":[[3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488]],"properties":{"id":"24663292","dp":424,"de":759}},{"type":"Polygon","arcs":[[3489,3490,3491,3492,3493,3494,3495]],"properties":{"id":"24663293","dp":3039,"de":13093}},{"type":"Polygon","arcs":[[3496,3497,3498,3499,3500,3501]],"properties":{"id":"24663294","dp":3803,"de":0}},{"type":"Polygon","arcs":[[3502,3503,3504,3505]],"properties":{"id":"24663295","dp":3273,"de":1243}},{"type":"Polygon","arcs":[[3506,3507,3508,3509,3510,3511,3512]],"properties":{"id":"24663296","dp":10980,"de":0}},{"type":"Polygon","arcs":[[3513,3514,3515,3516,3517,3518,3519]],"properties":{"id":"24663297","dp":4062,"de":3647}},{"type":"Polygon","arcs":[[3520,-1611,3521,3522]],"properties":{"id":"24663298","dp":10290,"de":431}},{"type":"Polygon","arcs":[[-3134,3523,3524,3525]],"properties":{"id":"24663299","dp":20633,"de":2816}},{"type":"Polygon","arcs":[[3526,-1007,-1014,-1015,-1012,3527]],"properties":{"id":"24663254","dp":8178,"de":1468}},{"type":"Polygon","arcs":[[3528,-3434,-1182,-1185,-1004,-1176,-1005,-3527]],"properties":{"id":"24663255","dp":13213,"de":1348}},{"type":"Polygon","arcs":[[-2151,-2153,-2155,-2148,-2131,-2128,-2118,-1941,3529,3530,3531,-2156]],"properties":{"id":"24663256","dp":2761,"de":842}},{"type":"Polygon","arcs":[[-2914,3532,3533,3534,3535,3536,3537,3538,3539]],"properties":{"id":"24663257","dp":2943,"de":5095}},{"type":"Polygon","arcs":[[3540,3541,3542,3543,3544,-3537]],"properties":{"id":"24663258","dp":19200,"de":5619}},{"type":"Polygon","arcs":[[3545,-2054,-2048,-2059,-2056]],"properties":{"id":"24663259","dp":19775,"de":1810}},{"type":"Polygon","arcs":[[-1816,-2325,3546,3547,-2033,-1820]],"properties":{"id":"24663260","dp":5799,"de":302}},{"type":"Polygon","arcs":[[3548,-943,3549,3550,3551,3552,3553]],"properties":{"id":"24663261","dp":10430,"de":2822}},{"type":"Polygon","arcs":[[3554,3555,3556,3557,3558]],"properties":{"id":"24663262","dp":21363,"de":1420}},{"type":"Polygon","arcs":[[3559,3560,3561,3562]],"properties":{"id":"24663277","dp":11305,"de":1820}},{"type":"Polygon","arcs":[[-993,-1025,-984]],"properties":{"id":"24663278","dp":41141,"de":6974}},{"type":"Polygon","arcs":[[-3472,3563,3564,-2182]],"properties":{"id":"24663279","dp":24677,"de":2263}},{"type":"Polygon","arcs":[[3565,-3470,3566,-2039,-2051]],"properties":{"id":"24663280","dp":5196,"de":4803}},{"type":"Polygon","arcs":[[3567,3568,3569,3570,3571,3572,3573,3574]],"properties":{"id":"24663281","dp":12352,"de":5560}},{"type":"Polygon","arcs":[[3575,-1626,3576,3577,3578,3579,3580,3581,3582,3583]],"properties":{"id":"24663282","dp":403,"de":1720}},{"type":"Polygon","arcs":[[3584,-2255,-2258,-2270,-2263,-2247,-2251]],"properties":{"id":"24663283","dp":14097,"de":2115}},{"type":"Polygon","arcs":[[-1664,3585,3586,3587,-1650,-1655,-1657,3588,-1660]],"properties":{"id":"24663284","dp":5898,"de":454}},{"type":"Polygon","arcs":[[3589,3590,3591,3592,3593,3594,3595]],"properties":{"id":"24663285","dp":4915,"de":722}},{"type":"Polygon","arcs":[[-180,-190,-188]],"properties":{"id":"24663286","dp":14516,"de":3151}},{"type":"Polygon","arcs":[[-840,-186,-837,3596]],"properties":{"id":"24663287","dp":9080,"de":3738}},{"type":"Polygon","arcs":[[3597,-3526,3598,3599]],"properties":{"id":"24663300","dp":4306,"de":7142}},{"type":"Polygon","arcs":[[3600,3601,3602,3603,3604,3605,3606]],"properties":{"id":"24663301","dp":5000,"de":874}},{"type":"Polygon","arcs":[[-3598,3607,3608,-3603,3609,3610,3611,3612,-3130]],"properties":{"id":"24663302","dp":2740,"de":3662}},{"type":"Polygon","arcs":[[-2319,-2314,3613,-3106]],"properties":{"id":"24663304","dp":4222,"de":1674}},{"type":"Polygon","arcs":[[-3614,-2313,-3107]],"properties":{"id":"24663305","dp":11317,"de":0}},{"type":"Polygon","arcs":[[-3182,3614,3615,3616]],"properties":{"id":"24660011","dp":3302,"de":512}},{"type":"Polygon","arcs":[[3617,3618,3619,3620,3621,3622,-1126,3623,-1124,-1133,-3616]],"properties":{"id":"24660012","dp":1821,"de":144}},{"type":"Polygon","arcs":[[3624,-3618,3625]],"properties":{"id":"24660013","dp":5428,"de":0}},{"type":"Polygon","arcs":[[3626,-3621,3627,-3619,-3625]],"properties":{"id":"24660014","dp":4686,"de":0}},{"type":"Polygon","arcs":[[-3620,-3628]],"properties":{"id":"24660015","dp":16000,"de":0}},{"type":"Polygon","arcs":[[-1125,-3624]],"properties":{"id":"24660016","dp":7637,"de":0}},{"type":"Polygon","arcs":[[-3466,3628,-3622,-3627,3629,3630]],"properties":{"id":"24660017","dp":4391,"de":0}},{"type":"Polygon","arcs":[[3631,-3467,3632,3633,3634]],"properties":{"id":"24660020","dp":2240,"de":701}},{"type":"Polygon","arcs":[[3635,-3634,3636,3637]],"properties":{"id":"24660021","dp":11277,"de":0}},{"type":"Polygon","arcs":[[3638,3639,3640,-3638,3641,3642]],"properties":{"id":"24660022","dp":2906,"de":441}},{"type":"Polygon","arcs":[[-3637,-3633,-3631,3643,3644,-3642]],"properties":{"id":"24660023","dp":7629,"de":0}},{"type":"Polygon","arcs":[[-3643,-3645,3645,3646,3647]],"properties":{"id":"24660024","dp":6532,"de":636}},{"type":"Polygon","arcs":[[-3644,-3630,-3626,3648,-3646]],"properties":{"id":"24660025","dp":6474,"de":798}},{"type":"Polygon","arcs":[[-451,3649,-3647,-3649,-3615,-3181,3650]],"properties":{"id":"24660026","dp":3172,"de":5079}},{"type":"Polygon","arcs":[[3651,3652,-3639,-3648,-3650]],"properties":{"id":"24660027","dp":4713,"de":0}},{"type":"Polygon","arcs":[[3653,-3640,-3653,3654,3655]],"properties":{"id":"24660028","dp":5487,"de":0}},{"type":"Polygon","arcs":[[3656,-3656,3657]],"properties":{"id":"24660029","dp":7930,"de":0}},{"type":"MultiPolygon","arcs":[[[3658],[3659],[3660],[3661],[3662]],[[3663]],[[3664]],[[3665]],[[3666]],[[-1202,3667]]],"properties":{"id":"24663335","dp":0,"de":1576}},{"type":"Polygon","arcs":[[3668,3669,3670,3671,3672,3673,3674,3675,3676,3677]],"properties":{"id":"24663336","dp":1743,"de":12924}},{"type":"Polygon","arcs":[[3678,3679,-3675]],"properties":{"id":"24663337","dp":16604,"de":10074}},{"type":"Polygon","arcs":[[3680,3681,3682,3683,3684,3685,3686,-3394]],"properties":{"id":"24663340","dp":0,"de":454}},{"type":"Polygon","arcs":[[3687,3688,3689,3690,3691]],"properties":{"id":"24663341","dp":12943,"de":6012}},{"type":"Polygon","arcs":[[3692,3693,3694,3695,3696,3697,-3692,3698]],"properties":{"id":"24663342","dp":7561,"de":11140}},{"type":"Polygon","arcs":[[-3698,3699,-3688]],"properties":{"id":"24663343","dp":15903,"de":4819}},{"type":"Polygon","arcs":[[3700,3701,-3694,3702,3703]],"properties":{"id":"24663344","dp":13444,"de":19335}},{"type":"Polygon","arcs":[[-3703,-3693,3704,3705]],"properties":{"id":"24663345","dp":33611,"de":9444}},{"type":"Polygon","arcs":[[3706,3707,3708,3709,3710]],"properties":{"id":"24663346","dp":13606,"de":4566}},{"type":"Polygon","arcs":[[-1087,-1270,3711,3712,-3708,3713,3714]],"properties":{"id":"24663347","dp":8468,"de":33829}},{"type":"Polygon","arcs":[[-1089,3715,-3714,-3707,3716]],"properties":{"id":"24663348","dp":36692,"de":3846}},{"type":"Polygon","arcs":[[-3715,-3716,-1088]],"properties":{"id":"24663349","dp":45769,"de":3076}},{"type":"Polygon","arcs":[[-1090,-3717,-3711,3717,-1210]],"properties":{"id":"24663350","dp":15335,"de":17449}},{"type":"Polygon","arcs":[[-3179,3718,3719,3720,3721,3722,3723,3724,3725,3726,-1141,3727]],"properties":{"id":"24660001","dp":2047,"de":233}},{"type":"Polygon","arcs":[[3728,3729,3730,-3725]],"properties":{"id":"24660002","dp":5004,"de":0}},{"type":"Polygon","arcs":[[-3731,3731,-3726]],"properties":{"id":"24660003","dp":5058,"de":0}},{"type":"Polygon","arcs":[[-3724,3732,3733,-3729]],"properties":{"id":"24660004","dp":3438,"de":911}},{"type":"Polygon","arcs":[[3734,3735,-3733,-3723]],"properties":{"id":"24660005","dp":3742,"de":0}},{"type":"Polygon","arcs":[[3736,3737,-3735,-3722]],"properties":{"id":"24660006","dp":5415,"de":0}},{"type":"Polygon","arcs":[[-3730,-3734,-3736,-3738,3738,-1131,3739,-1136,-3727,-3732]],"properties":{"id":"24660007","dp":3336,"de":320}},{"type":"Polygon","arcs":[[-3719,-3617,-1132,-3739,-3737,-3721,3740]],"properties":{"id":"24660008","dp":4464,"de":418}},{"type":"Polygon","arcs":[[-3720,-3741]],"properties":{"id":"24660009","dp":4909,"de":0}},{"type":"Polygon","arcs":[[3741,3742,3743,-3230]],"properties":{"id":"24660089","dp":8651,"de":0}},{"type":"Polygon","arcs":[[3744,-3742,-3229,3745,3746]],"properties":{"id":"24660090","dp":15840,"de":0}},{"type":"Polygon","arcs":[[3747,-3746,-3227,-3218]],"properties":{"id":"24660091","dp":10712,"de":4502}},{"type":"Polygon","arcs":[[3748,3749,3750,-3747,-3748,-3222,-280]],"properties":{"id":"24660092","dp":1236,"de":585}},{"type":"Polygon","arcs":[[3751,3752,-3751,3753]],"properties":{"id":"24660093","dp":7496,"de":915}},{"type":"Polygon","arcs":[[3754,3755,-3745,-3753]],"properties":{"id":"24660094","dp":6199,"de":0}},{"type":"Polygon","arcs":[[-3755,-3752,3756,3757,3758,3759,3760,3761]],"properties":{"id":"24660095","dp":3070,"de":445}},{"type":"Polygon","arcs":[[-3762,3762,-3743,-3756]],"properties":{"id":"24660096","dp":6771,"de":0}},{"type":"Polygon","arcs":[[-3761,3763,3764,-3763]],"properties":{"id":"24660097","dp":8248,"de":0}},{"type":"Polygon","arcs":[[-3228,-3744,-3765,3765,-3215,-3221,-3225]],"properties":{"id":"24660098","dp":4304,"de":432}},{"type":"Polygon","arcs":[[-3766,-3764,3766,3767,3768,3769,3770,-3210,-3216]],"properties":{"id":"24660099","dp":9366,"de":477}},{"type":"Polygon","arcs":[[3771,3772,-3769]],"properties":{"id":"24660100","dp":22663,"de":0}},{"type":"Polygon","arcs":[[3773,3774,3775,3776,3777,3778,-3658,-3655,-3652,-450]],"properties":{"id":"24660030","dp":3590,"de":131}},{"type":"Polygon","arcs":[[-3775,3779]],"properties":{"id":"24660031","dp":6939,"de":0}},{"type":"Polygon","arcs":[[-445,3780,-3776,-3780,-3774,-449]],"properties":{"id":"24660032","dp":5086,"de":0}},{"type":"Polygon","arcs":[[3781,3782,-3777,-3781,-444,-423,3783,3784,3785]],"properties":{"id":"24660033","dp":4427,"de":0}},{"type":"Polygon","arcs":[[-3784,-422,3786]],"properties":{"id":"24660034","dp":4525,"de":0}},{"type":"Polygon","arcs":[[-3785,-3787,-421,3787]],"properties":{"id":"24660035","dp":4877,"de":0}},{"type":"Polygon","arcs":[[3788,-3786,-3788,-420,-1152]],"properties":{"id":"24660036","dp":7800,"de":0}},{"type":"Polygon","arcs":[[3789,3790,3791,3792,3793,3794,3795]],"properties":{"id":"24660458","dp":4152,"de":4725}},{"type":"Polygon","arcs":[[3796,3797,-3278,3798]],"properties":{"id":"24660109","dp":17802,"de":0}},{"type":"Polygon","arcs":[[3799,3800,3801,3802,3803,-3797]],"properties":{"id":"24660110","dp":22450,"de":0}},{"type":"Polygon","arcs":[[-339,3804,3805,-3802,3806]],"properties":{"id":"24660111","dp":18067,"de":0}},{"type":"Polygon","arcs":[[3807,-340,-3807,-3801]],"properties":{"id":"24660112","dp":18508,"de":0}},{"type":"Polygon","arcs":[[-338,3808,-3805]],"properties":{"id":"24660114","dp":23632,"de":0}},{"type":"Polygon","arcs":[[-3809,-337,3809,-3803,-3806]],"properties":{"id":"24660115","dp":16015,"de":0}},{"type":"Polygon","arcs":[[-3810,-336,3810,-262,-357,-355,-3279,-3798,-3804]],"properties":{"id":"24660117","dp":4462,"de":5461}},{"type":"Polygon","arcs":[[-335,3811,3812,-256,-261,-3811]],"properties":{"id":"24660118","dp":9364,"de":2931}},{"type":"Polygon","arcs":[[-334,3813,3814,-3812]],"properties":{"id":"24660119","dp":6607,"de":2031}},{"type":"Polygon","arcs":[[-3815,3815,3816,-265,-257,-3813]],"properties":{"id":"24660120","dp":6476,"de":0}},{"type":"Polygon","arcs":[[3817,3818,3819,-3816,3820,3821]],"properties":{"id":"24660121","dp":8339,"de":1797}},{"type":"Polygon","arcs":[[-3820,3822,3823,-266,-3817]],"properties":{"id":"24660122","dp":11481,"de":0}},{"type":"Polygon","arcs":[[-3819,3824,-3493,3825,3826,-3823]],"properties":{"id":"24660123","dp":3694,"de":0}},{"type":"Polygon","arcs":[[-3827,3827,3828,-267,-3824]],"properties":{"id":"24660124","dp":11609,"de":0}},{"type":"Polygon","arcs":[[-268,-3829,3829,3830,3831]],"properties":{"id":"24660125","dp":13209,"de":1131}},{"type":"Polygon","arcs":[[3832,3833,3834,-3830,-3828,-3826]],"properties":{"id":"24660126","dp":4189,"de":0}},{"type":"Polygon","arcs":[[-3835,3835,3836,3837,-3831]],"properties":{"id":"24660127","dp":6483,"de":773}},{"type":"Polygon","arcs":[[-3832,-3838,3838,-274,-269]],"properties":{"id":"24660128","dp":12889,"de":0}},{"type":"Polygon","arcs":[[-275,-3839,-3837,3839,3840,3841,-277]],"properties":{"id":"24660129","dp":10520,"de":1145}},{"type":"Polygon","arcs":[[-278,-3842,3842,-506]],"properties":{"id":"24660130","dp":9644,"de":3074}},{"type":"Polygon","arcs":[[-3841,3843,3844,3845,3846,-3843]],"properties":{"id":"24660131","dp":12089,"de":2665}},{"type":"Polygon","arcs":[[-3194,3847,3848,3849,3850,-2267]],"properties":{"id":"24660256","dp":4794,"de":1063}},{"type":"Polygon","arcs":[[-3851,3851,3852,-2268]],"properties":{"id":"24660257","dp":8399,"de":0}},{"type":"Polygon","arcs":[[-2269,-3853,3853,3854,3855,-2261]],"properties":{"id":"24660258","dp":4598,"de":2641}},{"type":"Polygon","arcs":[[-3855,3856]],"properties":{"id":"24660259","dp":15089,"de":0}},{"type":"Polygon","arcs":[[3857,3858,-2239,-2262,-3856,-3857,-3854,3859,-1382,3860]],"properties":{"id":"24660260","dp":2424,"de":2400}},{"type":"Polygon","arcs":[[3861,-3858]],"properties":{"id":"24660261","dp":11855,"de":1385}},{"type":"Polygon","arcs":[[3862,-2240,-3859,-3862,-3861,-1381,3863]],"properties":{"id":"24660262","dp":5335,"de":617}},{"type":"Polygon","arcs":[[-1380,3864,3865,-3864]],"properties":{"id":"24660263","dp":9710,"de":826}},{"type":"Polygon","arcs":[[-2229,-2234,-3863,-3866,3866,3867,3868,-2225]],"properties":{"id":"24660264","dp":7393,"de":4612}},{"type":"Polygon","arcs":[[3869,3870,3871,-3868]],"properties":{"id":"24660265","dp":10184,"de":0}},{"type":"Polygon","arcs":[[-2226,-3869,-3872,3872,3873,-1545,-1734,-2021,-2218,-2219,-2223]],"properties":{"id":"24660266","dp":4161,"de":2015}},{"type":"Polygon","arcs":[[3874,-3873,-3871]],"properties":{"id":"24660267","dp":9696,"de":0}},{"type":"Polygon","arcs":[[-3875,-3870,-3867,-3865,3875,-1546,-3874]],"properties":{"id":"24660268","dp":5985,"de":3475}},{"type":"Polygon","arcs":[[-1379,3876,3877,3878,-3876]],"properties":{"id":"24660269","dp":4919,"de":3068}},{"type":"Polygon","arcs":[[-1378,3879,3880,3881,3882,-3877]],"properties":{"id":"24660270","dp":9120,"de":1282}},{"type":"Polygon","arcs":[[3883,3884,-3881,3885]],"properties":{"id":"24660271","dp":9671,"de":0}},{"type":"Polygon","arcs":[[-3882,-3885,3886,3887,3888]],"properties":{"id":"24660272","dp":12573,"de":0}},{"type":"Polygon","arcs":[[-3878,-3883,-3889,3889,3890]],"properties":{"id":"24660273","dp":11016,"de":0}},{"type":"Polygon","arcs":[[-1541,-3879,-3891,3891,-1563,-1555,-1547]],"properties":{"id":"24660274","dp":2558,"de":1977}},{"type":"Polygon","arcs":[[-696,-105,-1063,-1069,-1070,-1082]],"properties":{"id":"24660779","dp":9027,"de":2188}},{"type":"Polygon","arcs":[[3892,3893,-1071,-1067,-1065]],"properties":{"id":"24660780","dp":7729,"de":0}},{"type":"Polygon","arcs":[[3894,3895,-3893,3896]],"properties":{"id":"24660781","dp":4710,"de":550}},{"type":"Polygon","arcs":[[3897,3898,3899,3900,-1052,3901,-3112,3902,-3895]],"properties":{"id":"24660783","dp":4526,"de":1025}},{"type":"Polygon","arcs":[[-326,3903,-489,3904,-481,3905,3906]],"properties":{"id":"24660058","dp":474,"de":381}},{"type":"Polygon","arcs":[[-3906,-476,-463,-454,3907]],"properties":{"id":"24660059","dp":4875,"de":1197}},{"type":"Polygon","arcs":[[-498,-482,-3905]],"properties":{"id":"24660060","dp":2995,"de":2623}},{"type":"Polygon","arcs":[[-328,-323,3908,-490,-3904,-325]],"properties":{"id":"24660061","dp":9766,"de":833}},{"type":"Polygon","arcs":[[3909,-491,-3909,-318]],"properties":{"id":"24660062","dp":7499,"de":0}},{"type":"Polygon","arcs":[[3910,-492,-3910,-317]],"properties":{"id":"24660063","dp":10650,"de":0}},{"type":"Polygon","arcs":[[3911,3912,-493,-3911,-316,3913]],"properties":{"id":"24660064","dp":8991,"de":0}},{"type":"Polygon","arcs":[[-313,3914,-3914,-315]],"properties":{"id":"24660065","dp":13836,"de":0}},{"type":"Polygon","arcs":[[3915,3916,3917,-3912,-3915,3918]],"properties":{"id":"24660066","dp":6968,"de":834}},{"type":"Polygon","arcs":[[3919,-494,-3913,-3918]],"properties":{"id":"24660067","dp":7838,"de":0}},{"type":"Polygon","arcs":[[3920,-495,-3920,-3917,3921]],"properties":{"id":"24660068","dp":8108,"de":844}},{"type":"Polygon","arcs":[[3922,3923,3924,-3922,-3916]],"properties":{"id":"24660069","dp":10914,"de":4850}},{"type":"Polygon","arcs":[[-312,3925,3926,3927,-3923,-3919]],"properties":{"id":"24660070","dp":11619,"de":1190}},{"type":"Polygon","arcs":[[-308,3928,3929,-3926,-311]],"properties":{"id":"24660071","dp":10212,"de":0}},{"type":"Polygon","arcs":[[-657,3930,-3927,-3930,3931]],"properties":{"id":"24660072","dp":10846,"de":1476}},{"type":"Polygon","arcs":[[-299,-305,3932,-654,-3932,-3929,-307]],"properties":{"id":"24660073","dp":4275,"de":574}},{"type":"Polygon","arcs":[[3933,3934,-653,-3933,-304]],"properties":{"id":"24660074","dp":8286,"de":1582}},{"type":"Polygon","arcs":[[3935,3936,3937,-3934,-303]],"properties":{"id":"24660075","dp":5793,"de":672}},{"type":"Polygon","arcs":[[3938,3939,-647,-3935,-3938]],"properties":{"id":"24660076","dp":6507,"de":902}},{"type":"Polygon","arcs":[[3940,-638,-641,-645,-3940,3941]],"properties":{"id":"24660077","dp":6005,"de":0}},{"type":"Polygon","arcs":[[3942,3943,-3942,-3939,-3937,3944]],"properties":{"id":"24660078","dp":6475,"de":0}},{"type":"Polygon","arcs":[[-3773,3945,-639,-3941,-3944,3946,-3770]],"properties":{"id":"24660079","dp":3312,"de":756}},{"type":"Polygon","arcs":[[-3947,-3943,3947,-3211,-3771]],"properties":{"id":"24660080","dp":9645,"de":0}},{"type":"Polygon","arcs":[[-3948,-3945,-3936,-302,-3212]],"properties":{"id":"24660081","dp":6897,"de":1705}},{"type":"Polygon","arcs":[[-3772,-3768,3948,3949,-632,-636,-3946]],"properties":{"id":"24660101","dp":3859,"de":1078}},{"type":"Polygon","arcs":[[-3121,-627,-633,-3950,3950]],"properties":{"id":"24660102","dp":3071,"de":604}},{"type":"Polygon","arcs":[[-3951,-3949,-3767,-3760,3951]],"properties":{"id":"24660103","dp":4091,"de":0}},{"type":"Polygon","arcs":[[-3759,3952,-3484,3953,3954,3955,3956,3957,3958,-353,-350,-341,-3120,-3952]],"properties":{"id":"24660104","dp":968,"de":1344}},{"type":"Polygon","arcs":[[3959,-3280,-351,-3959]],"properties":{"id":"24660107","dp":14011,"de":0}},{"type":"Polygon","arcs":[[3960,3961,3962,3963]],"properties":{"id":"24660564","dp":5572,"de":412}},{"type":"Polygon","arcs":[[3964,3965,-3964,3966,3967,3968,3969,3970]],"properties":{"id":"24660565","dp":5712,"de":0}},{"type":"Polygon","arcs":[[3971,3972,3973,3974,-3967,3975]],"properties":{"id":"24660566","dp":3902,"de":1012}},{"type":"Polygon","arcs":[[3976,-3968,-3975]],"properties":{"id":"24660567","dp":10783,"de":1546}},{"type":"Polygon","arcs":[[-3974,3977,3978,-3969,-3977]],"properties":{"id":"24660568","dp":10551,"de":0}},{"type":"Polygon","arcs":[[-3973,3979,3980,3981,-3978]],"properties":{"id":"24660569","dp":8966,"de":0}},{"type":"Polygon","arcs":[[-3845,3982,-1770,-1953,3983,3984]],"properties":{"id":"24660132","dp":12459,"de":0}},{"type":"Polygon","arcs":[[-3985,3985,-3846]],"properties":{"id":"24660133","dp":12254,"de":0}},{"type":"Polygon","arcs":[[-507,-3847,-3986,-3984,-1952,-1949,3986,3987]],"properties":{"id":"24660134","dp":2753,"de":849}},{"type":"Polygon","arcs":[[-3987,-1948,3988,3989]],"properties":{"id":"24660135","dp":10378,"de":0}},{"type":"Polygon","arcs":[[3990,-3989,-1947,3991]],"properties":{"id":"24660136","dp":13547,"de":0}},{"type":"Polygon","arcs":[[-3992,-1946,3992,3993]],"properties":{"id":"24660137","dp":12757,"de":0}},{"type":"Polygon","arcs":[[-3993,-1927,3994]],"properties":{"id":"24660138","dp":23147,"de":758}},{"type":"Polygon","arcs":[[3995,-3995,-1945,-606]],"properties":{"id":"24660139","dp":6485,"de":3954}},{"type":"Polygon","arcs":[[-508,-3988,-3990,-3991,-3994,-3996]],"properties":{"id":"24660140","dp":12885,"de":1179}},{"type":"Polygon","arcs":[[3996,3997,3998,3999,4000,4001]],"properties":{"id":"24660598","dp":4539,"de":2885}},{"type":"Polygon","arcs":[[-3191,-1910,-1907,-1882,4002,-3848,-3193]],"properties":{"id":"24660364","dp":5171,"de":4040}},{"type":"Polygon","arcs":[[-3849,-4003,-1881,4003]],"properties":{"id":"24660365","dp":12324,"de":3944}},{"type":"Polygon","arcs":[[-3850,-4004,-1880,4004,4005,-1374,-3860,-3852]],"properties":{"id":"24660366","dp":5486,"de":2006}},{"type":"Polygon","arcs":[[-1879,4006,4007,4008,4009,-4005]],"properties":{"id":"24660367","dp":12082,"de":879}},{"type":"Polygon","arcs":[[-4006,-4010,4010,4011,-1362,-1375]],"properties":{"id":"24660368","dp":13387,"de":1254}},{"type":"Polygon","arcs":[[4012,4013,-4011,-4009]],"properties":{"id":"24660369","dp":19425,"de":0}},{"type":"Polygon","arcs":[[4014,4015,-1367,-4012,-4014]],"properties":{"id":"24660370","dp":26294,"de":6696}},{"type":"Polygon","arcs":[[-4013,-4008,4016,4017,-4015]],"properties":{"id":"24660371","dp":15693,"de":0}},{"type":"Polygon","arcs":[[-4007,-1878,4018,4019,-4017]],"properties":{"id":"24660372","dp":12250,"de":833}},{"type":"Polygon","arcs":[[-4018,-4020,4020,4021,4022,-4016]],"properties":{"id":"24660373","dp":13591,"de":892}},{"type":"Polygon","arcs":[[-1368,-4023,4023,4024]],"properties":{"id":"24660374","dp":15451,"de":0}},{"type":"Polygon","arcs":[[4025,4026,4027,4028,-4024,-4022]],"properties":{"id":"24660375","dp":17118,"de":0}},{"type":"Polygon","arcs":[[-4025,-4029,4029,-1369]],"properties":{"id":"24660376","dp":10732,"de":0}},{"type":"Polygon","arcs":[[4030,4031,4032,-1370,-4030,4033]],"properties":{"id":"24660377","dp":16050,"de":0}},{"type":"Polygon","arcs":[[4034,4035,-4032,4036]],"properties":{"id":"24660378","dp":16162,"de":0}},{"type":"Polygon","arcs":[[-4035,4037,4038,4039]],"properties":{"id":"24660379","dp":13517,"de":0}},{"type":"Polygon","arcs":[[-4031,4040,4041,4042,-4038,-4037]],"properties":{"id":"24660380","dp":14898,"de":0}},{"type":"Polygon","arcs":[[-4039,-4043,4043,4044,4045]],"properties":{"id":"24660381","dp":14686,"de":1174}},{"type":"Polygon","arcs":[[-4042,4046,4047,4048,-4044]],"properties":{"id":"24660382","dp":10102,"de":0}},{"type":"Polygon","arcs":[[4049,4050,-4049,4051,4052]],"properties":{"id":"24660383","dp":9879,"de":1982}},{"type":"Polygon","arcs":[[-4053,4053,4054,4055]],"properties":{"id":"24660384","dp":10290,"de":0}},{"type":"Polygon","arcs":[[-4052,4056,-1668,4057,4058,4059,4060,-4054]],"properties":{"id":"24660385","dp":4564,"de":788}},{"type":"Polygon","arcs":[[4061,-4055,-4061,4062]],"properties":{"id":"24660386","dp":6116,"de":0}},{"type":"Polygon","arcs":[[-1565,4063,-4063,-4060,4064,4065]],"properties":{"id":"24660387","dp":3554,"de":0}},{"type":"Polygon","arcs":[[-4050,-4056,-4062,-4064,-1564,4066]],"properties":{"id":"24660388","dp":7447,"de":2180}},{"type":"Polygon","arcs":[[4067,4068,-4045,-4051,-4067,-3892,-3890,-3888,4069]],"properties":{"id":"24660389","dp":3721,"de":3940}},{"type":"Polygon","arcs":[[4070,4071,-4070,-3887,-3884]],"properties":{"id":"24660390","dp":9086,"de":0}},{"type":"Polygon","arcs":[[4072,-4068,-4072,4073]],"properties":{"id":"24660391","dp":9632,"de":0}},{"type":"Polygon","arcs":[[-3880,-1377,4074,4075,-4074,-4071,-3886]],"properties":{"id":"24660392","dp":5027,"de":3240}},{"type":"Polygon","arcs":[[-1372,-1365,4076,-4075,-1376]],"properties":{"id":"24660393","dp":9076,"de":1988}},{"type":"Polygon","arcs":[[-4076,-4077,-1364,-1371,-4033,-4036,-4040,-4046,-4069,-4073]],"properties":{"id":"24660394","dp":4090,"de":1463}},{"type":"Polygon","arcs":[[4077,4078,-689,4079,4080,4081]],"properties":{"id":"24660166","dp":5356,"de":515}},{"type":"Polygon","arcs":[[4082,4083,-4081,4084,4085]],"properties":{"id":"24660167","dp":16198,"de":1033}},{"type":"Polygon","arcs":[[4086,-4086,4087,4088]],"properties":{"id":"24660168","dp":4927,"de":671}},{"type":"Polygon","arcs":[[4089,4090,4091,-4088,4092,4093]],"properties":{"id":"24660169","dp":3152,"de":935}},{"type":"Polygon","arcs":[[-4085,-4080,-688,4094,4095,-4093]],"properties":{"id":"24660170","dp":7031,"de":0}},{"type":"Polygon","arcs":[[-1566,-4066,4096,-1653,-1645,4097]],"properties":{"id":"24660399","dp":3414,"de":0}},{"type":"Polygon","arcs":[[-1567,-4098,-1644,-1642,-1635,-1634,-1631,-1435,-1433,-1431,-1570]],"properties":{"id":"24660400","dp":2100,"de":575}},{"type":"Polygon","arcs":[[4098,4099,4100]],"properties":{"id":"24660423","dp":23730,"de":0}},{"type":"Polygon","arcs":[[4101,4102,4103,-4099,4104]],"properties":{"id":"24660424","dp":15945,"de":1718}},{"type":"Polygon","arcs":[[4105,4106,-4102,4107]],"properties":{"id":"24660425","dp":18770,"de":1495}},{"type":"Polygon","arcs":[[4108,4109,-4106,4110]],"properties":{"id":"24660426","dp":17269,"de":0}},{"type":"Polygon","arcs":[[4111,4112,4113,-4109]],"properties":{"id":"24660427","dp":17706,"de":0}},{"type":"Polygon","arcs":[[4114,4115,4116,-4113]],"properties":{"id":"24660428","dp":27773,"de":0}},{"type":"Polygon","arcs":[[4117,-4116,4118,4119]],"properties":{"id":"24660429","dp":23579,"de":0}},{"type":"Polygon","arcs":[[4120,-4120,4121,4122]],"properties":{"id":"24660430","dp":16882,"de":0}},{"type":"Polygon","arcs":[[-4123,4123,4124]],"properties":{"id":"24660431","dp":14984,"de":0}},{"type":"Polygon","arcs":[[4125,4126,4127,4128,-4124]],"properties":{"id":"24660432","dp":10350,"de":0}},{"type":"Polygon","arcs":[[4129,4130,-4128,4131]],"properties":{"id":"24660433","dp":17389,"de":1174}},{"type":"Polygon","arcs":[[4132,4133,-4130,4134]],"properties":{"id":"24660434","dp":16356,"de":0}},{"type":"Polygon","arcs":[[4135,4136,4137,-4133]],"properties":{"id":"24660435","dp":15329,"de":3708}},{"type":"Polygon","arcs":[[4138,4139,4140,4141,-4137,4142]],"properties":{"id":"24660436","dp":10709,"de":4233}},{"type":"Polygon","arcs":[[4143,4144,-4140,4145]],"properties":{"id":"24660437","dp":22179,"de":0}},{"type":"Polygon","arcs":[[4146,4147,-4144,4148]],"properties":{"id":"24660438","dp":25625,"de":3750}},{"type":"Polygon","arcs":[[4149,4150,-4147,4151]],"properties":{"id":"24660439","dp":20000,"de":6140}},{"type":"Polygon","arcs":[[4152,4153,-3792,4154,4155]],"properties":{"id":"24660459","dp":17007,"de":2068}},{"type":"Polygon","arcs":[[4156,4157,4158,-4153,4159]],"properties":{"id":"24660460","dp":18172,"de":0}},{"type":"Polygon","arcs":[[4160,4161,-4154,-4159]],"properties":{"id":"24660461","dp":15100,"de":1507}},{"type":"Polygon","arcs":[[4162,4163,4164,-4161,-4158,4165]],"properties":{"id":"24660462","dp":15151,"de":1377}},{"type":"Polygon","arcs":[[4166,4167,-4163,4168]],"properties":{"id":"24660463","dp":19042,"de":2816}},{"type":"Polygon","arcs":[[4169,4170,-4167,4171]],"properties":{"id":"24660464","dp":15386,"de":2743}},{"type":"Polygon","arcs":[[4172,4173,4174,-4170,4175]],"properties":{"id":"24660465","dp":13896,"de":1558}},{"type":"Polygon","arcs":[[4176,4177,-4173,4178]],"properties":{"id":"24660466","dp":14131,"de":3443}},{"type":"Polygon","arcs":[[4179,-4179,4180,4181]],"properties":{"id":"24660467","dp":11898,"de":7365}},{"type":"Polygon","arcs":[[-4181,-4176,4182,4183]],"properties":{"id":"24660468","dp":16944,"de":2146}},{"type":"Polygon","arcs":[[-4183,-4172,4184,4185]],"properties":{"id":"24660469","dp":12219,"de":2682}},{"type":"Polygon","arcs":[[-4185,-4169,4186,4187]],"properties":{"id":"24660470","dp":17717,"de":6929}},{"type":"Polygon","arcs":[[-4187,-4166,-4157,4188,4189]],"properties":{"id":"24660471","dp":14788,"de":2380}},{"type":"Polygon","arcs":[[4190,-4190,4191,4192,4193]],"properties":{"id":"24660472","dp":17818,"de":3541}},{"type":"Polygon","arcs":[[4194,-4188,-4191,4195,4196]],"properties":{"id":"24660473","dp":17999,"de":3150}},{"type":"Polygon","arcs":[[4197,-4186,-4195,4198,4199]],"properties":{"id":"24660474","dp":15870,"de":3233}},{"type":"Polygon","arcs":[[4200,-4184,-4198,4201]],"properties":{"id":"24660475","dp":12894,"de":3617}},{"type":"Polygon","arcs":[[-3683,-4182,-4201,4202]],"properties":{"id":"24660476","dp":17076,"de":7748}},{"type":"Polygon","arcs":[[4203,-4180,-3682]],"properties":{"id":"24660478","dp":4474,"de":4523}},{"type":"Polygon","arcs":[[-4177,-4204,-3681,4204,4205,4206,4207,4208,4209]],"properties":{"id":"24660479","dp":1370,"de":9509}},{"type":"Polygon","arcs":[[-4209,4210,4211,-504,-511,4212]],"properties":{"id":"24660480","dp":5733,"de":3267}},{"type":"Polygon","arcs":[[4213,4214,-4212]],"properties":{"id":"24660481","dp":12109,"de":1734}},{"type":"Polygon","arcs":[[4215,-4214,4216]],"properties":{"id":"24660482","dp":16749,"de":4489}},{"type":"Polygon","arcs":[[4217,4218,4219,-505,-4215,-4216,4220]],"properties":{"id":"24660483","dp":5110,"de":940}},{"type":"Polygon","arcs":[[-3898,-3897,-1064,-1060,4221]],"properties":{"id":"24660784","dp":3202,"de":407}},{"type":"Polygon","arcs":[[-1055,-1053,-3901,4222,-3899,-4222,-1059]],"properties":{"id":"24660785","dp":3121,"de":559}},{"type":"Polygon","arcs":[[-3900,-4223]],"properties":{"id":"24660786","dp":3672,"de":491}},{"type":"Polygon","arcs":[[-1050,-2008,-2177,4223,-3902]],"properties":{"id":"24660787","dp":3514,"de":355}},{"type":"Polygon","arcs":[[-4065,-4059,4224,-1656,-1648,-4097]],"properties":{"id":"24660401","dp":3324,"de":913}},{"type":"Polygon","arcs":[[-4225,-4058,-1667,-1661,-3589,-1658]],"properties":{"id":"24660402","dp":12199,"de":0}},{"type":"Polygon","arcs":[[-1675,-1671,-1670,-4057,-4048,4225]],"properties":{"id":"24660403","dp":3108,"de":1372}},{"type":"Polygon","arcs":[[-4028,4226,4227,-4226,-4047,-4041,-4034]],"properties":{"id":"24660404","dp":5442,"de":0}},{"type":"Polygon","arcs":[[4228,-1690,-1678,-1676,-4228,4229]],"properties":{"id":"24660405","dp":15799,"de":0}},{"type":"Polygon","arcs":[[4230,-4230,-4227,-4027]],"properties":{"id":"24660406","dp":10615,"de":1538}},{"type":"Polygon","arcs":[[-4026,4231,4232,-1686,-4229,-4231]],"properties":{"id":"24660407","dp":13564,"de":0}},{"type":"Polygon","arcs":[[4233,4234,4235,-1698,-1691,-1687,-4233]],"properties":{"id":"24660408","dp":18621,"de":0}},{"type":"Polygon","arcs":[[4236,4237,-4235,4238]],"properties":{"id":"24660409","dp":22556,"de":0}},{"type":"Polygon","arcs":[[-1877,-4239,-4234,-4232,-4021,-4019]],"properties":{"id":"24660410","dp":6211,"de":1941}},{"type":"Polygon","arcs":[[4239,-1699,-4236,-4238]],"properties":{"id":"24660411","dp":21674,"de":3167}},{"type":"Polygon","arcs":[[-1847,-1838,-1834,-1831,-1702,-1700,-1695,-4240,-4237,-1876]],"properties":{"id":"24660412","dp":1516,"de":947}},{"type":"Polygon","arcs":[[4240,4241,4242,4243,-1897,-1904,4244]],"properties":{"id":"24660413","dp":7629,"de":3237}},{"type":"Polygon","arcs":[[4245,4246,-1898,-4244]],"properties":{"id":"24660414","dp":13892,"de":0}},{"type":"Polygon","arcs":[[4247,4248,-1893,-1899,-4247,4249]],"properties":{"id":"24660415","dp":7452,"de":1071}},{"type":"Polygon","arcs":[[4250,4251,4252,4253,4254,-4248]],"properties":{"id":"24660416","dp":8088,"de":0}},{"type":"Polygon","arcs":[[4255,4256,4257,-4252,4258]],"properties":{"id":"24660417","dp":8397,"de":1217}},{"type":"Polygon","arcs":[[4259,4260,-4253,-4258]],"properties":{"id":"24660418","dp":7408,"de":0}},{"type":"Polygon","arcs":[[4261,4262,4263,4264,-4260,-4257]],"properties":{"id":"24660419","dp":4079,"de":789}},{"type":"Polygon","arcs":[[4265,4266,-4264,4267]],"properties":{"id":"24660420","dp":17323,"de":0}},{"type":"Polygon","arcs":[[4268,-4268,-4263,4269,4270]],"properties":{"id":"24660421","dp":16531,"de":1219}},{"type":"Polygon","arcs":[[4271,-4100,-4104,4272,-4269]],"properties":{"id":"24660422","dp":15726,"de":0}},{"type":"MultiPolygon","arcs":[[[4273,4274,-2460,-2466,4275,4276,4277,4278,4279,4280]],[[4281,4282]]],"properties":{"id":"24660926","dp":6773,"de":0}},{"type":"Polygon","arcs":[[4283,4284,-2461,-4275]],"properties":{"id":"24660927","dp":7585,"de":0}},{"type":"Polygon","arcs":[[4285,-2467,-2462,-4285]],"properties":{"id":"24660928","dp":8019,"de":0}},{"type":"Polygon","arcs":[[4286,-3401,-596,4287,-3477,4288,4289]],"properties":{"id":"24660518","dp":15000,"de":563}},{"type":"Polygon","arcs":[[4290,4291,4292,4293,4294,4295]],"properties":{"id":"24660525","dp":12410,"de":0}},{"type":"Polygon","arcs":[[4296,4297,-4150,4298]],"properties":{"id":"24660440","dp":14646,"de":0}},{"type":"Polygon","arcs":[[4299,4300,-4297,4301]],"properties":{"id":"24660441","dp":18742,"de":3459}},{"type":"Polygon","arcs":[[4302,4303,-4300,4304]],"properties":{"id":"24660442","dp":16552,"de":1709}},{"type":"Polygon","arcs":[[-3685,4305,-4303,4306]],"properties":{"id":"24660443","dp":15920,"de":4447}},{"type":"Polygon","arcs":[[-3684,-4203,4307,-4306]],"properties":{"id":"24660444","dp":14444,"de":7834}},{"type":"Polygon","arcs":[[-4308,-4202,4308,-4304]],"properties":{"id":"24660445","dp":16717,"de":2671}},{"type":"Polygon","arcs":[[-4309,-4200,4309,-4301]],"properties":{"id":"24660446","dp":17611,"de":0}},{"type":"Polygon","arcs":[[-4310,-4199,4310,-4298]],"properties":{"id":"24660447","dp":17577,"de":2863}},{"type":"Polygon","arcs":[[-4311,-4197,4311,-4151]],"properties":{"id":"24660448","dp":22538,"de":6735}},{"type":"Polygon","arcs":[[-4312,-4196,4312,-4148]],"properties":{"id":"24660449","dp":20333,"de":2500}},{"type":"Polygon","arcs":[[-4313,-4194,4313,-4141,-4145]],"properties":{"id":"24660450","dp":15549,"de":1126}},{"type":"Polygon","arcs":[[-4142,-4314,-4193,4314,4315]],"properties":{"id":"24660451","dp":14132,"de":2739}},{"type":"Polygon","arcs":[[-4316,4316,-4138]],"properties":{"id":"24660452","dp":13869,"de":1636}},{"type":"Polygon","arcs":[[-4134,-4317,4317,4318,4319]],"properties":{"id":"24660453","dp":8690,"de":1719}},{"type":"Polygon","arcs":[[-4192,4320,-4318,-4315]],"properties":{"id":"24660454","dp":13194,"de":4027}},{"type":"Polygon","arcs":[[-4189,-4160,4321,-4321]],"properties":{"id":"24660455","dp":11069,"de":3323}},{"type":"Polygon","arcs":[[-4322,-4156,4322,-3790,-4319]],"properties":{"id":"24660456","dp":15204,"de":1656}},{"type":"Polygon","arcs":[[-4155,-3791,-4323]],"properties":{"id":"24660457","dp":13793,"de":2387}},{"type":"Polygon","arcs":[[-2655,-2639,-2632,4323,4324,4325,-2490,-2484,-2657]],"properties":{"id":"24660952","dp":2107,"de":2644}},{"type":"Polygon","arcs":[[4326,4327,4328,-3982]],"properties":{"id":"24660570","dp":22280,"de":3947}},{"type":"Polygon","arcs":[[4329,4330,4331,-4327]],"properties":{"id":"24660571","dp":32237,"de":0}},{"type":"Polygon","arcs":[[4332,4333,4334,4335,4336,-4331,4337]],"properties":{"id":"24660572","dp":13214,"de":0}},{"type":"Polygon","arcs":[[4338,4339,4340,4341,4342]],"properties":{"id":"24660576","dp":15705,"de":0}},{"type":"Polygon","arcs":[[-4340,4343,4344]],"properties":{"id":"24660577","dp":7985,"de":0}},{"type":"Polygon","arcs":[[4345,4346,4347,-4342,4348,4349]],"properties":{"id":"24660578","dp":4970,"de":3345}},{"type":"Polygon","arcs":[[4350,4351,-4349]],"properties":{"id":"24660579","dp":14097,"de":4768}},{"type":"Polygon","arcs":[[4352,-4350,-4352,4353,4354]],"properties":{"id":"24660580","dp":4554,"de":1508}},{"type":"Polygon","arcs":[[4355,4356,4357,4358,4359,4360]],"properties":{"id":"24660581","dp":5580,"de":2961}},{"type":"Polygon","arcs":[[4361,4362,4363,-4356,4364]],"properties":{"id":"24660582","dp":11443,"de":1012}},{"type":"Polygon","arcs":[[4365,-4365,-4361,4366,4367]],"properties":{"id":"24660583","dp":10212,"de":5418}},{"type":"Polygon","arcs":[[4368,4369,4370,-4362,-4366,4371]],"properties":{"id":"24660584","dp":5052,"de":862}},{"type":"Polygon","arcs":[[4372,-4372,-4368,4373,4374,4375,4376]],"properties":{"id":"24660585","dp":4741,"de":2181}},{"type":"Polygon","arcs":[[4377,-4221,-4217,-4211,-4208]],"properties":{"id":"24660484","dp":10803,"de":2362}},{"type":"Polygon","arcs":[[-4207,4378,4379,-4218,-4378]],"properties":{"id":"24660485","dp":5224,"de":6205}},{"type":"Polygon","arcs":[[-575,-512,-500,4380,4381,-4380,4382]],"properties":{"id":"24660486","dp":1819,"de":13159}},{"type":"Polygon","arcs":[[-4382,4383,-4219]],"properties":{"id":"24660487","dp":15706,"de":2077}},{"type":"Polygon","arcs":[[-4384,-4381,-499,-4220]],"properties":{"id":"24660488","dp":12904,"de":919}},{"type":"Polygon","arcs":[[4384,-2704,-2706,-2458,-2413]],"properties":{"id":"24660979","dp":9222,"de":2208}},{"type":"Polygon","arcs":[[-2702,-2705,-4385,-2412]],"properties":{"id":"24660980","dp":10359,"de":0}},{"type":"Polygon","arcs":[[4385,4386,4387,-3999]],"properties":{"id":"24660599","dp":6274,"de":0}},{"type":"Polygon","arcs":[[-4388,4388,4389,4390,-4000]],"properties":{"id":"24660600","dp":5620,"de":5057}},{"type":"Polygon","arcs":[[-4390,4391,4392,-3123,4393]],"properties":{"id":"24660601","dp":7892,"de":2229}},{"type":"Polygon","arcs":[[4394,-4392,-4389,4395,4396,4397]],"properties":{"id":"24660602","dp":4270,"de":5729}},{"type":"Polygon","arcs":[[4398,4399,-4396,-4387,4400]],"properties":{"id":"24660603","dp":4420,"de":1462}},{"type":"Polygon","arcs":[[-4400,4401,4402,-4397]],"properties":{"id":"24660604","dp":6686,"de":0}},{"type":"Polygon","arcs":[[-4374,-4367,-4360,-4355,4403,4404,-4402,-4399,4405]],"properties":{"id":"24660605","dp":2946,"de":5468}},{"type":"Polygon","arcs":[[-4375,-4406,-4401,-4386,4406]],"properties":{"id":"24660606","dp":3811,"de":1411}},{"type":"Polygon","arcs":[[4407,-4001,-4391,-4394,-3122,4408,4409,4410]],"properties":{"id":"24660607","dp":2848,"de":7381}},{"type":"Polygon","arcs":[[4411,4412,-3116,4413,4414,-4411,-941,-934,-932]],"properties":{"id":"24660608","dp":463,"de":5260}},{"type":"Polygon","arcs":[[4415,4416,-4412,-931,-3119]],"properties":{"id":"24660609","dp":2641,"de":2531}},{"type":"Polygon","arcs":[[-3117,-4413,-4417,4417]],"properties":{"id":"24660610","dp":2666,"de":14393}},{"type":"Polygon","arcs":[[-4418,-4416,-3118]],"properties":{"id":"24660611","dp":16222,"de":7040}},{"type":"Polygon","arcs":[[4418,-1080,-3109,-2938,4419]],"properties":{"id":"24660613","dp":3786,"de":4147}},{"type":"Polygon","arcs":[[4420,-4419,4421]],"properties":{"id":"24660614","dp":12644,"de":8510}},{"type":"Polygon","arcs":[[-3460,4422,-4422,-4420]],"properties":{"id":"24660615","dp":27462,"de":0}},{"type":"Polygon","arcs":[[-4224,-2183,-3565,4423,-2061,4424,4425,-3113]],"properties":{"id":"24660788","dp":7484,"de":1600}},{"type":"Polygon","arcs":[[-2050,-2055,-3546,4426,-3564,-3471,-3566]],"properties":{"id":"24660794","dp":4439,"de":2791}},{"type":"Polygon","arcs":[[4427,-2040,-3567,4428]],"properties":{"id":"24660797","dp":5200,"de":1235}},{"type":"Polygon","arcs":[[4429,-4429,-3469,-2193]],"properties":{"id":"24660798","dp":6746,"de":0}},{"type":"Polygon","arcs":[[4430,4431,-4430,-2196]],"properties":{"id":"24660799","dp":7162,"de":0}},{"type":"Polygon","arcs":[[4432,-2041,-4428,-4432]],"properties":{"id":"24660800","dp":6923,"de":729}},{"type":"Polygon","arcs":[[4433,-2042,-4433,4434]],"properties":{"id":"24660801","dp":4749,"de":426}},{"type":"Polygon","arcs":[[4435,4436,-4435,-4431,-2195,4437]],"properties":{"id":"24660802","dp":4322,"de":481}},{"type":"Polygon","arcs":[[4438,-2043,-4434,-4437]],"properties":{"id":"24660803","dp":4712,"de":517}},{"type":"Polygon","arcs":[[4439,4440,-2026,-2036,-4439,-4436,4441]],"properties":{"id":"24660804","dp":745,"de":55}},{"type":"Polygon","arcs":[[4442,-4440,4443]],"properties":{"id":"24660805","dp":8888,"de":0}},{"type":"Polygon","arcs":[[-4444,-4442,-4438,-2194,4444]],"properties":{"id":"24660806","dp":4068,"de":648}},{"type":"Polygon","arcs":[[4445,4446,4447,-3530,-1940,-2027,-4441,-4443,-4445,-2189,-2203,-2208,4448]],"properties":{"id":"24660807","dp":3586,"de":559}},{"type":"Polygon","arcs":[[4449,-4446]],"properties":{"id":"24660808","dp":3833,"de":0}},{"type":"Polygon","arcs":[[-3532,4450,-4447,-4450,-4449,-2207,-2209,-2162,-2157]],"properties":{"id":"24660809","dp":5176,"de":880}},{"type":"Polygon","arcs":[[-4448,-4451,-3531]],"properties":{"id":"24660810","dp":4575,"de":0}},{"type":"Polygon","arcs":[[4451,4452,-1359]],"properties":{"id":"24661311","dp":32867,"de":0}},{"type":"Polygon","arcs":[[4453,4454,4455,-2852,-4453]],"properties":{"id":"24661312","dp":10645,"de":1794}},{"type":"Polygon","arcs":[[-2788,-2941,4456,4457,-2846,-4456,4458]],"properties":{"id":"24661313","dp":2863,"de":2616}},{"type":"Polygon","arcs":[[-4459,-4455,4459,-2794]],"properties":{"id":"24661314","dp":37951,"de":0}},{"type":"Polygon","arcs":[[4460,4461,-4460,-4454,-4452]],"properties":{"id":"24661315","dp":34814,"de":0}},{"type":"Polygon","arcs":[[-2784,-2790,-2795,-4462,4462]],"properties":{"id":"24661316","dp":22947,"de":4736}},{"type":"Polygon","arcs":[[-2948,-2782,-4463,-4461,-1357,-2798,-2823]],"properties":{"id":"24661317","dp":3828,"de":0}},{"type":"Polygon","arcs":[[-701,-720,-778,-2318]],"properties":{"id":"24660901","dp":10963,"de":0}},{"type":"Polygon","arcs":[[4463,4464,4465,4466,-755,-729,-727,4467]],"properties":{"id":"24660902","dp":5807,"de":6610}},{"type":"Polygon","arcs":[[4468,4469,-4464,4470]],"properties":{"id":"24660903","dp":12154,"de":0}},{"type":"Polygon","arcs":[[4471,4472,4473,-4465,-4470]],"properties":{"id":"24660904","dp":11378,"de":3372}},{"type":"Polygon","arcs":[[-4295,4474,4475,4476,4477]],"properties":{"id":"24660526","dp":10221,"de":968}},{"type":"Polygon","arcs":[[4478,4479,-4477,4480,4481]],"properties":{"id":"24660530","dp":11022,"de":936}},{"type":"Polygon","arcs":[[4482,4483,4484,-4479,4485,4486]],"properties":{"id":"24660533","dp":17837,"de":7939}},{"type":"Polygon","arcs":[[-3558,4487,4488,-4483,4489,4490,4491]],"properties":{"id":"24660536","dp":16698,"de":2226}},{"type":"Polygon","arcs":[[-4489,4492,4493,4494,-4484]],"properties":{"id":"24660537","dp":30743,"de":0}},{"type":"Polygon","arcs":[[4495,-4291,4496,-4494]],"properties":{"id":"24660538","dp":28089,"de":0}},{"type":"Polygon","arcs":[[-4497,-4296,-4478,-4480,-4485,-4495]],"properties":{"id":"24660539","dp":8857,"de":2124}},{"type":"Polygon","arcs":[[-4496,-4493,-4488,4497,4498,-4292]],"properties":{"id":"24660540","dp":9237,"de":5053}},{"type":"Polygon","arcs":[[-3557,4499,4500,4501,4502,4503,4504,-3965,-4498]],"properties":{"id":"24660541","dp":5923,"de":1763}},{"type":"Polygon","arcs":[[4505,-4503]],"properties":{"id":"24660542","dp":5433,"de":680}},{"type":"Polygon","arcs":[[4506,4507,4508,-4504,-4506,-4502]],"properties":{"id":"24660543","dp":6713,"de":0}},{"type":"Polygon","arcs":[[4509,4510,4511,-4508,4512]],"properties":{"id":"24660544","dp":6430,"de":0}},{"type":"Polygon","arcs":[[-4501,-3126,4513,4514,-4513,-4507]],"properties":{"id":"24660545","dp":7629,"de":1708}},{"type":"Polygon","arcs":[[4515,-3595,4516,-4515]],"properties":{"id":"24660546","dp":9042,"de":5953}},{"type":"Polygon","arcs":[[4517,-4516,-4514,-3125]],"properties":{"id":"24660547","dp":5863,"de":7096}},{"type":"Polygon","arcs":[[-4393,-4395,-3596,-4518,-3124]],"properties":{"id":"24660548","dp":9006,"de":1319}},{"type":"Polygon","arcs":[[-4403,-4405,-3138,4518,4519,-3590,-4398]],"properties":{"id":"24660550","dp":4107,"de":4395}},{"type":"Polygon","arcs":[[-3591,-4520,4520,4521]],"properties":{"id":"24660551","dp":19581,"de":0}},{"type":"Polygon","arcs":[[-4521,-4519,-3137,4522]],"properties":{"id":"24660552","dp":27578,"de":4882}},{"type":"Polygon","arcs":[[-4404,-4354,-4351,-4341,4523,-3135]],"properties":{"id":"24660555","dp":12644,"de":0}},{"type":"Polygon","arcs":[[-4524,-4345,4524,4525,4526,4527,-3136]],"properties":{"id":"24660556","dp":10140,"de":1358}},{"type":"Polygon","arcs":[[-4523,-4528,4528]],"properties":{"id":"24660557","dp":22720,"de":0}},{"type":"Polygon","arcs":[[-3592,-4522,-4529,-4527,4529,4530]],"properties":{"id":"24660558","dp":8979,"de":2312}},{"type":"Polygon","arcs":[[-4531,-3976,-3963,4531,-3593]],"properties":{"id":"24660560","dp":3900,"de":1036}},{"type":"Polygon","arcs":[[-3594,-4532,4532,-4510,-4517]],"properties":{"id":"24660561","dp":5533,"de":917}},{"type":"Polygon","arcs":[[-4533,-3962,4533,-4511]],"properties":{"id":"24660562","dp":12880,"de":0}},{"type":"Polygon","arcs":[[-4534,-3961,-3966,-4505,-4509,-4512]],"properties":{"id":"24660563","dp":4956,"de":1557}},{"type":"Polygon","arcs":[[4534,-4094,-4096,4535,4536]],"properties":{"id":"24660171","dp":10209,"de":0}},{"type":"Polygon","arcs":[[4537,-4536,-4095,-687,-678,4538]],"properties":{"id":"24660172","dp":12507,"de":0}},{"type":"Polygon","arcs":[[4539,-4539,-677,-660,4540]],"properties":{"id":"24660173","dp":10934,"de":0}},{"type":"Polygon","arcs":[[4541,4542,-4369,-4373,4543]],"properties":{"id":"24660586","dp":7473,"de":0}},{"type":"Polygon","arcs":[[4544,-4544,-4377,4545,4546,4547]],"properties":{"id":"24660587","dp":4432,"de":714}},{"type":"Polygon","arcs":[[4548,-3612,4549,4550,-4542,-4545,-3132]],"properties":{"id":"24660588","dp":3861,"de":0}},{"type":"Polygon","arcs":[[-3613,-4549,-3131]],"properties":{"id":"24660590","dp":4636,"de":0}},{"type":"Polygon","arcs":[[-3524,-3133,-4548,4551]],"properties":{"id":"24660594","dp":6326,"de":0}},{"type":"Polygon","arcs":[[-3599,-3525,-4552,-4547,4552,4553,-4002,-4408,-4415,4554]],"properties":{"id":"24660595","dp":3087,"de":2310}},{"type":"Polygon","arcs":[[-4546,-4376,-4407,-3998,4555,-4553]],"properties":{"id":"24660596","dp":9901,"de":0}},{"type":"Polygon","arcs":[[-4554,-4556,-3997]],"properties":{"id":"24660597","dp":12168,"de":1084}},{"type":"Polygon","arcs":[[4556,4557,4558,-3541,-3536]],"properties":{"id":"24661062","dp":17500,"de":6793}},{"type":"Polygon","arcs":[[4559,-3542,-4559]],"properties":{"id":"24661063","dp":31257,"de":0}},{"type":"Polygon","arcs":[[-3544,4560,4561,-2710,4562,4563]],"properties":{"id":"24661066","dp":7992,"de":2200}},{"type":"Polygon","arcs":[[4564,4565,-4561,-3543]],"properties":{"id":"24661067","dp":6868,"de":1124}},{"type":"Polygon","arcs":[[-4558,4566,4567,-4565,-4560]],"properties":{"id":"24661068","dp":7535,"de":2392}},{"type":"Polygon","arcs":[[-824,-1987,4568,-4562,-4566,-4568,4569]],"properties":{"id":"24661069","dp":6727,"de":4444}},{"type":"Polygon","arcs":[[-1986,-1983,-2715,-2711,-4569]],"properties":{"id":"24661070","dp":5254,"de":3708}},{"type":"Polygon","arcs":[[-1081,-4421,-4423,-2935,-2932,4570,4571]],"properties":{"id":"24660616","dp":10046,"de":1113}},{"type":"Polygon","arcs":[[-2929,4572,-4571]],"properties":{"id":"24660617","dp":18432,"de":0}},{"type":"Polygon","arcs":[[4573,4574,-4573,-2926,-2920]],"properties":{"id":"24660618","dp":10665,"de":6569}},{"type":"Polygon","arcs":[[-1077,-4572,-4575,4575]],"properties":{"id":"24660619","dp":10755,"de":2485}},{"type":"Polygon","arcs":[[4576,-1083,-1078,-4576,-4574,-2917,4577,4578,4579]],"properties":{"id":"24660620","dp":4651,"de":2549}},{"type":"Polygon","arcs":[[4580,-4580,4581]],"properties":{"id":"24660621","dp":22919,"de":0}},{"type":"Polygon","arcs":[[4582,-4581,4583,-3300]],"properties":{"id":"24660622","dp":17689,"de":0}},{"type":"Polygon","arcs":[[-4583,-3309,-694,-4577]],"properties":{"id":"24660623","dp":20567,"de":28723}},{"type":"Polygon","arcs":[[-2970,-2974,4584,4585]],"properties":{"id":"24661113","dp":17609,"de":3902}},{"type":"Polygon","arcs":[[4586,4587,4588,-4472,-4469,4589,4590,4591]],"properties":{"id":"24660905","dp":12702,"de":1621}},{"type":"Polygon","arcs":[[4592,4593,-4473,-4589,4594]],"properties":{"id":"24660906","dp":10153,"de":1282}},{"type":"Polygon","arcs":[[-4595,-4588,4595]],"properties":{"id":"24660907","dp":9488,"de":2555}},{"type":"Polygon","arcs":[[4596,4597,4598,-4593,-4596,-4587,4599,-4325,4600,4601,4602,-4467,4603]],"properties":{"id":"24660908","dp":6482,"de":1924}},{"type":"Polygon","arcs":[[-4599,4604,4605,-4604,-4466,-4474,-4594]],"properties":{"id":"24660909","dp":10358,"de":1793}},{"type":"Polygon","arcs":[[4606,-4605,-4598]],"properties":{"id":"24660910","dp":13546,"de":0}},{"type":"Polygon","arcs":[[-4607,-4597,-4606]],"properties":{"id":"24660911","dp":13955,"de":0}},{"type":"Polygon","arcs":[[-4324,4607,-4601]],"properties":{"id":"24660912","dp":12570,"de":2712}},{"type":"Polygon","arcs":[[-2631,4608,4609,4610,-4602,-4608]],"properties":{"id":"24660913","dp":6696,"de":10600}},{"type":"Polygon","arcs":[[-4611,4611,-756,-4603]],"properties":{"id":"24660914","dp":6847,"de":4130}},{"type":"Polygon","arcs":[[-4610,4612,4613,4614,4615,4616,-757,-4612]],"properties":{"id":"24660915","dp":6709,"de":1865}},{"type":"Polygon","arcs":[[4617,-758,-4617]],"properties":{"id":"24660916","dp":6732,"de":911}},{"type":"Polygon","arcs":[[-4616,4618,4619,4620,4621,4622,4623,4624,-759,-4618]],"properties":{"id":"24660917","dp":937,"de":2228}},{"type":"Polygon","arcs":[[-4615,4625,-4619]],"properties":{"id":"24660918","dp":7993,"de":1445}},{"type":"Polygon","arcs":[[4626,-4620,-4626,-4614]],"properties":{"id":"24660919","dp":3671,"de":2519}},{"type":"Polygon","arcs":[[-4613,-4609,-2630,-2469,4627,-4621,-4627]],"properties":{"id":"24660920","dp":2294,"de":2096}},{"type":"Polygon","arcs":[[-4628,-2475,4628,4629,4630,-4622]],"properties":{"id":"24660921","dp":4868,"de":0}},{"type":"Polygon","arcs":[[4631,-4630]],"properties":{"id":"24660922","dp":7716,"de":0}},{"type":"Polygon","arcs":[[-4631,-4632,-4629,-2474,4632,-4279,4633,4634,-4623]],"properties":{"id":"24660923","dp":3032,"de":1617}},{"type":"Polygon","arcs":[[-2473,-2468,-4286,-4284,-4274,4635,-4280,-4633]],"properties":{"id":"24660924","dp":2561,"de":291}},{"type":"Polygon","arcs":[[-4281,-4636]],"properties":{"id":"24660925","dp":19018,"de":1380}},{"type":"Polygon","arcs":[[-643,4636,-4537,-4538,-4540,4637]],"properties":{"id":"24660174","dp":9953,"de":0}},{"type":"Polygon","arcs":[[-648,-644,-4638,-4541,-659,-650]],"properties":{"id":"24660175","dp":7087,"de":0}},{"type":"Polygon","arcs":[[-4535,-4637,-642,-629,4638,-4090]],"properties":{"id":"24660176","dp":2965,"de":1467}},{"type":"Polygon","arcs":[[-4639,-628,-622,4639,-4091]],"properties":{"id":"24660177","dp":2979,"de":0}},{"type":"Polygon","arcs":[[-1933,-1421,4640,-4089,-4092,-4640]],"properties":{"id":"24660178","dp":2868,"de":1465}},{"type":"Polygon","arcs":[[4641,4642,4643,-4083,-4087,-4641]],"properties":{"id":"24660179","dp":3765,"de":321}},{"type":"Polygon","arcs":[[-4642,-1420,-1923,4644]],"properties":{"id":"24660180","dp":4749,"de":1354}},{"type":"Polygon","arcs":[[-4643,-4645,-1922,-1918,4645,4646,4647]],"properties":{"id":"24660181","dp":12371,"de":2291}},{"type":"Polygon","arcs":[[-1917,-1412,4648,-4646]],"properties":{"id":"24660182","dp":22071,"de":0}},{"type":"Polygon","arcs":[[4649,-4647,-4649,-1417,4650,4651,-4078]],"properties":{"id":"24660183","dp":7839,"de":1737}},{"type":"Polygon","arcs":[[-4648,-4650,-4082,-4084,-4644]],"properties":{"id":"24660184","dp":8692,"de":5130}},{"type":"Polygon","arcs":[[-4651,-1416,4652,4653]],"properties":{"id":"24660185","dp":10135,"de":0}},{"type":"Polygon","arcs":[[-4079,-4652,-4654,4654,4655,4656,-690]],"properties":{"id":"24660186","dp":12608,"de":1440}},{"type":"Polygon","arcs":[[-1415,-1411,-1402,-4655,-4653]],"properties":{"id":"24660187","dp":9391,"de":0}},{"type":"Polygon","arcs":[[-4656,-1407,4657,4658]],"properties":{"id":"24660188","dp":12819,"de":1101}},{"type":"Polygon","arcs":[[4659,-4658,-1406,4660]],"properties":{"id":"24660189","dp":23013,"de":0}},{"type":"Polygon","arcs":[[-691,-4657,-4659,-4660,-680,-686]],"properties":{"id":"24660190","dp":11042,"de":2055}},{"type":"Polygon","arcs":[[-681,-4661,-1394,4661]],"properties":{"id":"24660191","dp":20078,"de":0}},{"type":"Polygon","arcs":[[-4662,-1398,4662,-682]],"properties":{"id":"24660192","dp":16729,"de":0}},{"type":"Polygon","arcs":[[4663,-4663,-1397,4664,-1399,4665]],"properties":{"id":"24660193","dp":13200,"de":0}},{"type":"Polygon","arcs":[[-211,-3313,-3304,-3297,4666,-3463]],"properties":{"id":"24660659","dp":11496,"de":852}},{"type":"Polygon","arcs":[[-4667,-3303,4667,-3001,-3464]],"properties":{"id":"24660660","dp":12273,"de":1986}},{"type":"Polygon","arcs":[[4668,-2998,-4668,4669]],"properties":{"id":"24660661","dp":28965,"de":2681}},{"type":"Polygon","arcs":[[4670,-2994,-2997,-4669]],"properties":{"id":"24660662","dp":8566,"de":0}},{"type":"Polygon","arcs":[[4671,-4671,-4670,-3302]],"properties":{"id":"24660663","dp":30346,"de":2475}},{"type":"Polygon","arcs":[[-3301,-4584,4672,-2992,-4672]],"properties":{"id":"24660664","dp":30088,"de":0}},{"type":"Polygon","arcs":[[-4673,-4582,-4579,4673]],"properties":{"id":"24660665","dp":26808,"de":0}},{"type":"Polygon","arcs":[[4674,-2954,-2993,-4674]],"properties":{"id":"24660666","dp":34933,"de":2202}},{"type":"Polygon","arcs":[[-4578,-2916,-2951,-4675]],"properties":{"id":"24660667","dp":23824,"de":2534}},{"type":"Polygon","arcs":[[4675,4676,4677,4678]],"properties":{"id":"24663101","dp":2883,"de":305}},{"type":"Polygon","arcs":[[-3449,4679,-3447,4680,4681,4682,4683,4684,4685]],"properties":{"id":"24662988","dp":1403,"de":926}},{"type":"Polygon","arcs":[[4686,4687,4688,4689,4690,4691]],"properties":{"id":"24661358","dp":14773,"de":10933}},{"type":"Polygon","arcs":[[4692,4693,4694,4695,4696,4697,4698]],"properties":{"id":"24662589","dp":2389,"de":1641}},{"type":"Polygon","arcs":[[4699,-4698,4700,4701,4702]],"properties":{"id":"24662590","dp":7384,"de":736}},{"type":"Polygon","arcs":[[4703,4704,4705,-4699,-4700]],"properties":{"id":"24662591","dp":4921,"de":0}},{"type":"Polygon","arcs":[[4706,-4704,-4703,4707,4708]],"properties":{"id":"24662592","dp":7996,"de":0}},{"type":"Polygon","arcs":[[4709,-4692,4710,4711,4712,4713]],"properties":{"id":"24661359","dp":22229,"de":8188}},{"type":"Polygon","arcs":[[4714,-4712,4715,4716]],"properties":{"id":"24661360","dp":20497,"de":3167}},{"type":"Polygon","arcs":[[-4711,-4691,4717,-4716]],"properties":{"id":"24661361","dp":16989,"de":5510}},{"type":"Polygon","arcs":[[-4717,-4718,-4690,4718,4719,4720,4721]],"properties":{"id":"24661362","dp":6549,"de":2243}},{"type":"Polygon","arcs":[[4722,4723,-4719,4724]],"properties":{"id":"24661363","dp":10041,"de":5463}},{"type":"Polygon","arcs":[[4725,-4715,-4722,4726,4727,4728,4729,4730]],"properties":{"id":"24661364","dp":5086,"de":5761}},{"type":"Polygon","arcs":[[4731,4732,-4731]],"properties":{"id":"24661365","dp":28461,"de":0}},{"type":"Polygon","arcs":[[-4730,4733,4734,-4732]],"properties":{"id":"24661366","dp":31026,"de":2901}},{"type":"Polygon","arcs":[[4735,4736,-4734,-4729,4737,4738,4739]],"properties":{"id":"24661367","dp":18933,"de":3523}},{"type":"Polygon","arcs":[[-4740,4740,4741,4742]],"properties":{"id":"24661368","dp":19522,"de":4020}},{"type":"Polygon","arcs":[[4743,-4742,4744,4745]],"properties":{"id":"24661369","dp":17923,"de":4824}},{"type":"Polygon","arcs":[[4746,4747,-4746]],"properties":{"id":"24661370","dp":19392,"de":4153}},{"type":"Polygon","arcs":[[4748,-4747,-4745,-4741,-4739,4749,4750,4751,4752]],"properties":{"id":"24661371","dp":5503,"de":3788}},{"type":"Polygon","arcs":[[4753,-4749,4754,4755]],"properties":{"id":"24661372","dp":16048,"de":3024}},{"type":"Polygon","arcs":[[-4753,4756,4757,-4755]],"properties":{"id":"24661373","dp":16679,"de":1778}},{"type":"Polygon","arcs":[[-4752,4758,4759,-4757]],"properties":{"id":"24661374","dp":11866,"de":6888}},{"type":"Polygon","arcs":[[4760,4761,-4759,-4751,4762,4763,4764,4765]],"properties":{"id":"24661375","dp":4338,"de":21860}},{"type":"Polygon","arcs":[[4766,-4762,4767,4768]],"properties":{"id":"24661376","dp":11936,"de":55212}},{"type":"Polygon","arcs":[[-4760,-4767,4769,4770,4771]],"properties":{"id":"24661377","dp":13010,"de":13210}},{"type":"Polygon","arcs":[[-4758,-4772,4772,4773]],"properties":{"id":"24661378","dp":16306,"de":2552}},{"type":"Polygon","arcs":[[4774,-4756,-4774,4775]],"properties":{"id":"24661379","dp":15426,"de":3963}},{"type":"Polygon","arcs":[[4776,4777,4778,-4775,4779]],"properties":{"id":"24661380","dp":14057,"de":4472}},{"type":"Polygon","arcs":[[4780,4781,-4778,4782]],"properties":{"id":"24661381","dp":23529,"de":3287}},{"type":"Polygon","arcs":[[4783,-4781,4784,4785]],"properties":{"id":"24661382","dp":18792,"de":12640}},{"type":"Polygon","arcs":[[-1212,-3704,-3706,4786,4787,4788,4789,4790,4791]],"properties":{"id":"24661858","dp":4735,"de":20919}},{"type":"Polygon","arcs":[[4792,-4791,4793,4794,4795,4796,4797,4798]],"properties":{"id":"24661859","dp":8760,"de":65700}},{"type":"Polygon","arcs":[[4799,4800,-4795]],"properties":{"id":"24661860","dp":41379,"de":12068}},{"type":"Polygon","arcs":[[-3674,-4798,4801,4802,4803,-3679]],"properties":{"id":"24661861","dp":13040,"de":9684}},{"type":"Polygon","arcs":[[4804,4805,4806,-4803]],"properties":{"id":"24661862","dp":17269,"de":3212}},{"type":"Polygon","arcs":[[-4807,4807,4808,4809,4810]],"properties":{"id":"24661863","dp":17048,"de":2108}},{"type":"Polygon","arcs":[[-4804,-4811,4811,4812]],"properties":{"id":"24661864","dp":15515,"de":8520}},{"type":"Polygon","arcs":[[4813,-4812,-4810,4814,4815,4816,4817]],"properties":{"id":"24661865","dp":7883,"de":25525}},{"type":"Polygon","arcs":[[-3680,-4813,-4814,4818,-3676]],"properties":{"id":"24661866","dp":10557,"de":5268}},{"type":"Polygon","arcs":[[4819,4820,-4705,-4707,4821]],"properties":{"id":"24662593","dp":6048,"de":0}},{"type":"Polygon","arcs":[[4822,4823,4824,-4822]],"properties":{"id":"24662594","dp":6442,"de":0}},{"type":"Polygon","arcs":[[-4823,-4709,4825,-3397]],"properties":{"id":"24662595","dp":7840,"de":4466}},{"type":"Polygon","arcs":[[-3399,4826,4827]],"properties":{"id":"24662598","dp":8152,"de":0}},{"type":"Polygon","arcs":[[4828,4829,-3395,-4828,4830,4831]],"properties":{"id":"24662599","dp":9471,"de":0}},{"type":"Polygon","arcs":[[4832,-4829,4833]],"properties":{"id":"24662600","dp":12691,"de":0}},{"type":"Polygon","arcs":[[4834,-3794,4835,4836,4837,-4834,-4832,4838]],"properties":{"id":"24662601","dp":2907,"de":6314}},{"type":"Polygon","arcs":[[4839,-4824,-3396,-4830,-4833,-4838]],"properties":{"id":"24662602","dp":4897,"de":0}},{"type":"Polygon","arcs":[[4840,4841,-4840,-4837]],"properties":{"id":"24662603","dp":4293,"de":3968}},{"type":"Polygon","arcs":[[-4836,4842,4843,4844,4845,4846,4847,-4841]],"properties":{"id":"24662604","dp":4586,"de":0}},{"type":"Polygon","arcs":[[-4165,4848,-4843,-3793,-4162]],"properties":{"id":"24662605","dp":13399,"de":2272}},{"type":"Polygon","arcs":[[4849,-4844,-4849,-4164]],"properties":{"id":"24662606","dp":17614,"de":0}},{"type":"Polygon","arcs":[[4850,4851,4852,-4850,-4168]],"properties":{"id":"24662607","dp":10490,"de":5313}},{"type":"Polygon","arcs":[[4853,4854,-4851,-4171]],"properties":{"id":"24662608","dp":13543,"de":6526}},{"type":"Polygon","arcs":[[-4854,-4175,4855]],"properties":{"id":"24662609","dp":14225,"de":0}},{"type":"Polygon","arcs":[[-4210,-4213,-510,-4852,-4855,-4856,-4174,-4178]],"properties":{"id":"24662610","dp":9243,"de":6914}},{"type":"Polygon","arcs":[[-521,4856,-4845,-4853,-518]],"properties":{"id":"24662611","dp":10550,"de":13188}},{"type":"Polygon","arcs":[[-4857,4857,-4846]],"properties":{"id":"24662612","dp":11108,"de":10277}},{"type":"Polygon","arcs":[[-520,-526,4858,-4847,-4858]],"properties":{"id":"24662613","dp":9747,"de":2135}},{"type":"Polygon","arcs":[[4859,4860,4861,4862,4863,4864]],"properties":{"id":"24663010","dp":2137,"de":1450}},{"type":"Polygon","arcs":[[-4862,4865]],"properties":{"id":"24663011","dp":4900,"de":330}},{"type":"Polygon","arcs":[[4866,-4713,-4726,-4733,4867,4868]],"properties":{"id":"24661394","dp":27470,"de":7312}},{"type":"Polygon","arcs":[[4869,-4687,-4710,4870,4871]],"properties":{"id":"24661395","dp":8754,"de":3679}},{"type":"Polygon","arcs":[[4872,4873,-4870,4874]],"properties":{"id":"24661396","dp":9097,"de":1299}},{"type":"Polygon","arcs":[[-4873,4875,4876,4877,4878,4879]],"properties":{"id":"24661397","dp":3270,"de":1639}},{"type":"Polygon","arcs":[[4880,4881,4882,-4880]],"properties":{"id":"24661398","dp":8016,"de":901}},{"type":"Polygon","arcs":[[4883,4884]],"properties":{"id":"24662616","dp":9001,"de":0}},{"type":"Polygon","arcs":[[-4885,4885,4886,-4820,4887]],"properties":{"id":"24662617","dp":10181,"de":726}},{"type":"Polygon","arcs":[[-4887,-4693,-4706,-4821]],"properties":{"id":"24662618","dp":4851,"de":652}},{"type":"Polygon","arcs":[[4888,4889,4890,4891,4892,-3795,-4835,4893]],"properties":{"id":"24662619","dp":5920,"de":3944}},{"type":"Polygon","arcs":[[4894,-4890]],"properties":{"id":"24662620","dp":19502,"de":0}},{"type":"Polygon","arcs":[[4895,-4891,-4895,4896,-4110,-4114]],"properties":{"id":"24662621","dp":10958,"de":798}},{"type":"Polygon","arcs":[[-4897,-4889,4897,4898,-4107]],"properties":{"id":"24662622","dp":17121,"de":2424}},{"type":"Polygon","arcs":[[-4898,4899,4900,4901]],"properties":{"id":"24662623","dp":13792,"de":1458}},{"type":"Polygon","arcs":[[-4899,-4902,-4266,-4273,-4103]],"properties":{"id":"24662624","dp":13073,"de":2015}},{"type":"Polygon","arcs":[[-4901,4902,-4267]],"properties":{"id":"24662625","dp":16887,"de":0}},{"type":"Polygon","arcs":[[-4265,-4903,4903,4904,-4254,-4261]],"properties":{"id":"24662626","dp":11488,"de":0}},{"type":"Polygon","arcs":[[-4894,4905,-4904,-4900]],"properties":{"id":"24662627","dp":11148,"de":2153}},{"type":"Polygon","arcs":[[-1894,-4249,-4255,-4905,-4906,-4839,-4831,-4827,-3398,4906,4907,-1858,-1862,-1864,-1889]],"properties":{"id":"24662628","dp":472,"de":1388}},{"type":"Polygon","arcs":[[4908,4909,-4907,-4826,-4708,-4702,4910]],"properties":{"id":"24662629","dp":1060,"de":115}},{"type":"Polygon","arcs":[[-4910,4911,4912,4913,-4908]],"properties":{"id":"24662630","dp":11777,"de":1204}},{"type":"Polygon","arcs":[[-4914,4914,4915,4916,-1859]],"properties":{"id":"24662631","dp":15867,"de":1589}},{"type":"Polygon","arcs":[[-4917,4917,-1845,-1856]],"properties":{"id":"24662632","dp":15483,"de":2995}},{"type":"Polygon","arcs":[[4918,4919,-1846,-4918]],"properties":{"id":"24662633","dp":17894,"de":1372}},{"type":"Polygon","arcs":[[-4919,-4916,4920,4921]],"properties":{"id":"24662634","dp":20934,"de":0}},{"type":"Polygon","arcs":[[4922,4923,-4921,-4915,-4913]],"properties":{"id":"24662635","dp":11686,"de":2710}},{"type":"Polygon","arcs":[[4924,-4923,-4912,4925]],"properties":{"id":"24662636","dp":24550,"de":0}},{"type":"Polygon","arcs":[[4926,-4926,-4909]],"properties":{"id":"24662637","dp":23988,"de":0}},{"type":"Polygon","arcs":[[4927,4928,4929,4930,4931]],"properties":{"id":"24662638","dp":10316,"de":1399}},{"type":"Polygon","arcs":[[4932,4933,4934,-4929,4935]],"properties":{"id":"24662639","dp":9787,"de":1415}},{"type":"Polygon","arcs":[[4936,-4933,4937]],"properties":{"id":"24662640","dp":12450,"de":1214}},{"type":"Polygon","arcs":[[4938,4939,-4934,-4937]],"properties":{"id":"24662641","dp":9096,"de":0}},{"type":"Polygon","arcs":[[4940,4941,4942,4943,4944,4945,4946,4947]],"properties":{"id":"24663030","dp":2966,"de":382}},{"type":"Polygon","arcs":[[4948,4949,-4946,4950,4951,4952]],"properties":{"id":"24663031","dp":3616,"de":0}},{"type":"Polygon","arcs":[[4953,-3083,-3162,4954]],"properties":{"id":"24663075","dp":674,"de":79}},{"type":"Polygon","arcs":[[-3103,-2982,4955,-3160]],"properties":{"id":"24663076","dp":1076,"de":101}},{"type":"MultiPolygon","arcs":[[[4956,4957,4958,4959,4960,4961,4962]],[[4963,4964,4965,4966]]],"properties":{"id":"24663077","dp":282,"de":62}},{"type":"Polygon","arcs":[[4967,4968,4969]],"properties":{"id":"24663079","dp":7864,"de":0}},{"type":"Polygon","arcs":[[4970,4971,-4970,4972,4973,4974]],"properties":{"id":"24663080","dp":5606,"de":0}},{"type":"Polygon","arcs":[[4975,-4975,4976]],"properties":{"id":"24663081","dp":5152,"de":0}},{"type":"Polygon","arcs":[[4977,-4977,-4974,4978,4979,4980]],"properties":{"id":"24663082","dp":4933,"de":0}},{"type":"Polygon","arcs":[[4981,4982,4983,-4881,-4879,4984,4985,4986]],"properties":{"id":"24661399","dp":2976,"de":541}},{"type":"Polygon","arcs":[[4987,4988,4989,4990,-4984]],"properties":{"id":"24661400","dp":3899,"de":708}},{"type":"Polygon","arcs":[[-1343,-1346,4991,-4982,4992,-1339]],"properties":{"id":"24661401","dp":5107,"de":3163}},{"type":"Polygon","arcs":[[4993,-233,4994,-4988,-4983,-4992]],"properties":{"id":"24661402","dp":12976,"de":5402}},{"type":"Polygon","arcs":[[-4994,-1347,-3461,-234]],"properties":{"id":"24661405","dp":31666,"de":1570}},{"type":"Polygon","arcs":[[-1333,-1340,-4993,-4987,4995,4996,4997]],"properties":{"id":"24661407","dp":9731,"de":1788}},{"type":"Polygon","arcs":[[-4986,4998,-4996]],"properties":{"id":"24661408","dp":22746,"de":2331}},{"type":"Polygon","arcs":[[-1329,4999,-4997,-4999,-4985,-4878,5000,5001]],"properties":{"id":"24661409","dp":2728,"de":4005}},{"type":"Polygon","arcs":[[-4998,-5000,-1328]],"properties":{"id":"24661410","dp":24615,"de":5384}},{"type":"Polygon","arcs":[[5002,-5001,-4877,5003,5004]],"properties":{"id":"24661411","dp":3817,"de":566}},{"type":"Polygon","arcs":[[5005,-1330,-5002,-5003,5006,5007]],"properties":{"id":"24661412","dp":254,"de":260}},{"type":"Polygon","arcs":[[-5007,-5005,5008,5009,5010,5011,5012,5013]],"properties":{"id":"24661413","dp":3642,"de":721}},{"type":"Polygon","arcs":[[5014,-5011,5015,5016]],"properties":{"id":"24661414","dp":21659,"de":3526}},{"type":"Polygon","arcs":[[-5012,-5015,5017,5018,5019]],"properties":{"id":"24661415","dp":16468,"de":1984}},{"type":"Polygon","arcs":[[-5019,5020,5021,5022,5023,5024]],"properties":{"id":"24661416","dp":16285,"de":3650}},{"type":"Polygon","arcs":[[5025,5026,5027,-3173]],"properties":{"id":"24661893","dp":17329,"de":3125}},{"type":"Polygon","arcs":[[-5026,5028,5029,5030,5031,5032,5033]],"properties":{"id":"24661894","dp":5661,"de":8260}},{"type":"Polygon","arcs":[[-3172,5034,5035,5036,5037,-5029]],"properties":{"id":"24661895","dp":16720,"de":5600}},{"type":"Polygon","arcs":[[5038,-5035,-3171]],"properties":{"id":"24661896","dp":20169,"de":0}},{"type":"Polygon","arcs":[[-3170,5039,5040,-5036,-5039]],"properties":{"id":"24661897","dp":16994,"de":1554}},{"type":"Polygon","arcs":[[5041,5042,-5040,-3169]],"properties":{"id":"24661898","dp":14101,"de":6568}},{"type":"Polygon","arcs":[[5043,5044,-5042,-3168]],"properties":{"id":"24661899","dp":23580,"de":5626}},{"type":"Polygon","arcs":[[5045,5046,5047,5048,-5045]],"properties":{"id":"24661900","dp":15261,"de":8126}},{"type":"Polygon","arcs":[[-5049,5049,5050,-5043]],"properties":{"id":"24661901","dp":13506,"de":6944}},{"type":"Polygon","arcs":[[5051,5052,5053,5054,5055]],"properties":{"id":"24663084","dp":3793,"de":0}},{"type":"Polygon","arcs":[[-5054,5056,-4963,5057,-4965,5058]],"properties":{"id":"24663085","dp":3675,"de":0}},{"type":"Polygon","arcs":[[5059,-4980,5060,5061,5062,-4957,-5057]],"properties":{"id":"24663086","dp":5384,"de":0}},{"type":"Polygon","arcs":[[5063,5064,5065,5066]],"properties":{"id":"24661426","dp":21391,"de":2173}},{"type":"Polygon","arcs":[[5067,5068,5069,5070,-5065]],"properties":{"id":"24661427","dp":12930,"de":8255}},{"type":"Polygon","arcs":[[5071,5072,-5070,5073]],"properties":{"id":"24661428","dp":16936,"de":8274}},{"type":"Polygon","arcs":[[5074,-4773,-4771,5075,-5073]],"properties":{"id":"24661429","dp":10381,"de":14088}},{"type":"Polygon","arcs":[[5076,5077,-4780,-4776,-5075]],"properties":{"id":"24661430","dp":12173,"de":6956}},{"type":"Polygon","arcs":[[5078,5079,-5022,5080,-4785,-4783,-4777,-5078]],"properties":{"id":"24661431","dp":11167,"de":10583}},{"type":"Polygon","arcs":[[5081,5082,-5079,-5077,-5072,5083]],"properties":{"id":"24661432","dp":17155,"de":2245}},{"type":"Polygon","arcs":[[-5076,-4770,-4769,5084,5085,-5071]],"properties":{"id":"24661433","dp":10080,"de":7329}},{"type":"Polygon","arcs":[[-5085,-4768,-4761,5086,5087,5088]],"properties":{"id":"24661434","dp":12990,"de":11934}},{"type":"Polygon","arcs":[[-5086,-5089,5089,5090,5091,-5066]],"properties":{"id":"24661435","dp":14108,"de":11512}},{"type":"Polygon","arcs":[[-5088,5092,5093,-5090]],"properties":{"id":"24661436","dp":20194,"de":3721}},{"type":"Polygon","arcs":[[-5094,5094,5095,5096]],"properties":{"id":"24661437","dp":16964,"de":8333}},{"type":"Polygon","arcs":[[-5091,-5097,5097,5098,5099]],"properties":{"id":"24661438","dp":15305,"de":6845}},{"type":"Polygon","arcs":[[5100,-5098,5101,5102,5103]],"properties":{"id":"24661439","dp":14174,"de":7119}},{"type":"Polygon","arcs":[[-5096,5104,-5102]],"properties":{"id":"24661440","dp":17272,"de":3409}},{"type":"Polygon","arcs":[[5105,-5103,-5105,5106,5107,5108,5109]],"properties":{"id":"24661441","dp":8472,"de":1280}},{"type":"Polygon","arcs":[[5110,-4765,5111,-5107,-5095]],"properties":{"id":"24661442","dp":9494,"de":2853}},{"type":"Polygon","arcs":[[-5087,-4766,-5111,-5093]],"properties":{"id":"24661443","dp":19421,"de":2210}},{"type":"Polygon","arcs":[[5112,5113,-5112,5114,5115,5116,5117]],"properties":{"id":"24661444","dp":15638,"de":2543}},{"type":"Polygon","arcs":[[-5113,5118,5119]],"properties":{"id":"24661445","dp":13980,"de":3618}},{"type":"Polygon","arcs":[[-5118,5120,5121,-5119]],"properties":{"id":"24661446","dp":14249,"de":2544}},{"type":"Polygon","arcs":[[-5122,5122,5123,5124,5125]],"properties":{"id":"24661447","dp":14377,"de":3228}},{"type":"Polygon","arcs":[[5126,-1257,5127,5128,-3671]],"properties":{"id":"24661925","dp":10527,"de":8822}},{"type":"Polygon","arcs":[[5129,5130,5131,-3672,-5129]],"properties":{"id":"24661926","dp":8836,"de":5325}},{"type":"Polygon","arcs":[[-1263,5132,-5130,-5128]],"properties":{"id":"24661927","dp":9599,"de":8166}},{"type":"Polygon","arcs":[[-5131,-5133,-1266,-4792,-4793,5133]],"properties":{"id":"24661928","dp":7821,"de":17913}},{"type":"Polygon","arcs":[[-5134,-4799,-3673,-5132]],"properties":{"id":"24661929","dp":15569,"de":24683}},{"type":"Polygon","arcs":[[5134,-3695,-3702,5135]],"properties":{"id":"24661936","dp":14148,"de":8703}},{"type":"Polygon","arcs":[[-3718,-3710,5136,-5136,-3701,-1211]],"properties":{"id":"24661937","dp":11421,"de":7106}},{"type":"Polygon","arcs":[[5137,5138,5139,5140,5141,5142]],"properties":{"id":"24663123","dp":3014,"de":274}},{"type":"Polygon","arcs":[[-5143,5143,5144,5145]],"properties":{"id":"24663124","dp":426,"de":1169}},{"type":"Polygon","arcs":[[5146,5147,-5144,-5142,5148,-4961]],"properties":{"id":"24663125","dp":72,"de":62}},{"type":"Polygon","arcs":[[5149,5150]],"properties":{"id":"24663126","dp":3847,"de":308}},{"type":"Polygon","arcs":[[-5150,5151]],"properties":{"id":"24663127","dp":3074,"de":0}},{"type":"Polygon","arcs":[[-4680,-3448]],"properties":{"id":"24662989","dp":4683,"de":496}},{"type":"Polygon","arcs":[[5152,5153,5154,-3443]],"properties":{"id":"24662992","dp":8168,"de":0}},{"type":"Polygon","arcs":[[5155,-4681,-3446,5156]],"properties":{"id":"24662993","dp":7857,"de":2639}},{"type":"Polygon","arcs":[[-3445,5157,5158,5159,5160,5161,5162,-5157]],"properties":{"id":"24662994","dp":3402,"de":728}},{"type":"Polygon","arcs":[[5163,5164,5165,5166,5167]],"properties":{"id":"24663088","dp":3617,"de":225}},{"type":"Polygon","arcs":[[-5166,5168]],"properties":{"id":"24663089","dp":4119,"de":0}},{"type":"Polygon","arcs":[[5169,5170,5171,5172,5173,5174]],"properties":{"id":"24663090","dp":2782,"de":211}},{"type":"Polygon","arcs":[[-5175,5175,5176]],"properties":{"id":"24663091","dp":2875,"de":0}},{"type":"Polygon","arcs":[[-5170,-5177,5177]],"properties":{"id":"24663092","dp":3252,"de":0}},{"type":"Polygon","arcs":[[5178,5179]],"properties":{"id":"24663094","dp":3788,"de":0}},{"type":"Polygon","arcs":[[5180,5181,-5180,5182,5183,5184,5185]],"properties":{"id":"24663095","dp":2894,"de":362}},{"type":"Polygon","arcs":[[5186,5187,5188,5189,5190,5191,5192]],"properties":{"id":"24663096","dp":1854,"de":332}},{"type":"Polygon","arcs":[[5193,5194,5195,-5193,5196,5197]],"properties":{"id":"24663097","dp":2731,"de":255}},{"type":"Polygon","arcs":[[5198,-5187,-5196]],"properties":{"id":"24663098","dp":2882,"de":0}},{"type":"Polygon","arcs":[[-5195,5199,5200,5201,5202,5203,-5188,-5199]],"properties":{"id":"24663099","dp":804,"de":140}},{"type":"Polygon","arcs":[[5204,-5200,-5194,5205,-4677]],"properties":{"id":"24663100","dp":3489,"de":0}},{"type":"Polygon","arcs":[[5206,5207,5208,5209,5210,5211]],"properties":{"id":"24663369","dp":10290,"de":38854}},{"type":"Polygon","arcs":[[-4678,-5206,-5198,5212,5213,5214]],"properties":{"id":"24663102","dp":2151,"de":413}},{"type":"Polygon","arcs":[[5215,5216,5217,5218,5219,5220,5221]],"properties":{"id":"24663103","dp":1368,"de":279}},{"type":"Polygon","arcs":[[5222,-5220,5223]],"properties":{"id":"24663104","dp":2245,"de":0}},{"type":"Polygon","arcs":[[5224,-5221,-5223,5225]],"properties":{"id":"24663105","dp":2219,"de":179}},{"type":"MultiPolygon","arcs":[[[5226,-5225,5227,5228,5229,5230]],[[5231,5232,5233,5234,5235,5236,5237]]],"properties":{"id":"24663106","dp":1239,"de":485}},{"type":"Polygon","arcs":[[5238,5239,5240,5241,-5222,-5227,5242]],"properties":{"id":"24663107","dp":1383,"de":479}},{"type":"Polygon","arcs":[[5243,5244,-5216,-5242]],"properties":{"id":"24663108","dp":1929,"de":0}},{"type":"Polygon","arcs":[[-5244,-5241,5245,5246,5247]],"properties":{"id":"24663109","dp":1943,"de":163}},{"type":"Polygon","arcs":[[-5245,-5248,5248,-5202,-5217]],"properties":{"id":"24663110","dp":1462,"de":139}},{"type":"Polygon","arcs":[[-5247,5249,5250,5251,5252,5253,5254,-5203,-5249]],"properties":{"id":"24663111","dp":206,"de":1307}},{"type":"Polygon","arcs":[[5255,5256,5257,-5251]],"properties":{"id":"24663112","dp":1319,"de":168}},{"type":"Polygon","arcs":[[5258,-3498,5259]],"properties":{"id":"24663139","dp":8410,"de":0}},{"type":"Polygon","arcs":[[-5156,-5163,5260,-4682]],"properties":{"id":"24662995","dp":2103,"de":574}},{"type":"Polygon","arcs":[[5261,5262,5263,-5261]],"properties":{"id":"24662996","dp":2752,"de":0}},{"type":"Polygon","arcs":[[5264,-5262,-5162,5265,5266]],"properties":{"id":"24662997","dp":11611,"de":828}},{"type":"Polygon","arcs":[[-5266,-5161,5267,5268,5269,5270,5271,5272]],"properties":{"id":"24662998","dp":262,"de":0}},{"type":"Polygon","arcs":[[-5269,5273,5274]],"properties":{"id":"24662999","dp":6982,"de":0}},{"type":"Polygon","arcs":[[5275,5276,5277,5278,-5271]],"properties":{"id":"24663000","dp":3577,"de":0}},{"type":"Polygon","arcs":[[5279,5280,5281,5282,-5277]],"properties":{"id":"24663001","dp":2883,"de":0}},{"type":"Polygon","arcs":[[5283,5284,5285,5286,5287,-5272,-5279]],"properties":{"id":"24663002","dp":3145,"de":589}},{"type":"Polygon","arcs":[[-5267,-5273,-5288,5288,5289,5290,5291,5292,-4865,5293]],"properties":{"id":"24663003","dp":2185,"de":331}},{"type":"Polygon","arcs":[[5294,5295,5296,-5291]],"properties":{"id":"24663004","dp":2748,"de":0}},{"type":"Polygon","arcs":[[5297,5298,5299,-5296]],"properties":{"id":"24663005","dp":2154,"de":436}},{"type":"Polygon","arcs":[[-5295,-5290,5300,5301,5302,-5298]],"properties":{"id":"24663006","dp":2700,"de":513}},{"type":"Polygon","arcs":[[-5299,-5303,5303,5304,5305]],"properties":{"id":"24663007","dp":2390,"de":442}},{"type":"Polygon","arcs":[[-5292,-5297,-5300,-5306,5306,5307]],"properties":{"id":"24663008","dp":2340,"de":0}},{"type":"Polygon","arcs":[[-5293,-5308,5308,5309,5310,-4860]],"properties":{"id":"24663009","dp":3982,"de":369}},{"type":"Polygon","arcs":[[5311,5312,5313,5314,5315,5316,-3478,5317]],"properties":{"id":"24661728","dp":2231,"de":181}},{"type":"Polygon","arcs":[[-5316,5318,-360,5319]],"properties":{"id":"24661729","dp":8286,"de":7159}},{"type":"Polygon","arcs":[[-4819,-4818,5320,5321,-3677]],"properties":{"id":"24661867","dp":7988,"de":18450}},{"type":"Polygon","arcs":[[-5321,-4817,5322,5323]],"properties":{"id":"24661868","dp":21743,"de":4816}},{"type":"Polygon","arcs":[[-5323,-4816,5324,5325,5326,5327]],"properties":{"id":"24661869","dp":6918,"de":5238}},{"type":"Polygon","arcs":[[5328,5329,-3678,-5322,-5324,-5328,5330]],"properties":{"id":"24661870","dp":4383,"de":5790}},{"type":"Polygon","arcs":[[5331,-5237,5332,5333,5334,5335,5336]],"properties":{"id":"24663128","dp":1312,"de":1785}},{"type":"Polygon","arcs":[[5337,5338,5339,5340,-5333]],"properties":{"id":"24663129","dp":1128,"de":536}},{"type":"Polygon","arcs":[[-5341,5341,5342,-5334]],"properties":{"id":"24663130","dp":2422,"de":866}},{"type":"Polygon","arcs":[[5343,-5342,-5340,5344,5345]],"properties":{"id":"24663131","dp":3284,"de":945}},{"type":"Polygon","arcs":[[-5343,-5344,5346,5347,5348,-5335]],"properties":{"id":"24663132","dp":1831,"de":453}},{"type":"Polygon","arcs":[[-5347,-5346,5349]],"properties":{"id":"24663133","dp":2086,"de":0}},{"type":"Polygon","arcs":[[-5348,-5350,-5345,-5339,5350,5351,5352,-3067,5353,5354,5355]],"properties":{"id":"24663134","dp":1348,"de":312}},{"type":"Polygon","arcs":[[-5355,5356,5357]],"properties":{"id":"24663135","dp":1995,"de":0}},{"type":"Polygon","arcs":[[5358,5359,-5337,5360,-5358,5361,5362]],"properties":{"id":"24663136","dp":1330,"de":200}},{"type":"Polygon","arcs":[[-5349,-5356,-5361,-5336]],"properties":{"id":"24663137","dp":2671,"de":273}},{"type":"Polygon","arcs":[[-5259,5363,5364,5365,5366,5367,5368,-3499]],"properties":{"id":"24663138","dp":7577,"de":924}},{"type":"Polygon","arcs":[[-4683,-5264,5369,5370,5371]],"properties":{"id":"24663140","dp":2380,"de":0}},{"type":"Polygon","arcs":[[-5263,-5265,-5294,-4864,-5370]],"properties":{"id":"24663141","dp":3953,"de":467}},{"type":"Polygon","arcs":[[5372,-2031,5373]],"properties":{"id":"24663142","dp":25457,"de":0}},{"type":"Polygon","arcs":[[5374,-5374,-2030,5375,5376,5377,-1797]],"properties":{"id":"24663143","dp":4089,"de":1331}},{"type":"Polygon","arcs":[[-5375,-1796,-1806,-1819,-2032,-5373]],"properties":{"id":"24663144","dp":4815,"de":1012}},{"type":"Polygon","arcs":[[-5377,5378,5379,5380,5381]],"properties":{"id":"24663145","dp":7448,"de":576}},{"type":"Polygon","arcs":[[-5380,5382,5383,5384]],"properties":{"id":"24663146","dp":6888,"de":576}},{"type":"Polygon","arcs":[[-5381,-5385,5385,5386]],"properties":{"id":"24663147","dp":8625,"de":2031}},{"type":"Polygon","arcs":[[5387,5388,-5383]],"properties":{"id":"24663149","dp":5396,"de":1353}},{"type":"Polygon","arcs":[[-5376,-2029,5389,5390,-5388,-5379]],"properties":{"id":"24663150","dp":5796,"de":0}},{"type":"Polygon","arcs":[[5391,5392,5393,5394,5395,5396,5397,-3437,5398,-3441,5399,5400,5401,5402]],"properties":{"id":"24663151","dp":284,"de":2721}},{"type":"Polygon","arcs":[[5403,5404,5405,5406,5407,5408,5409,-5401]],"properties":{"id":"24663152","dp":718,"de":2931}},{"type":"Polygon","arcs":[[-5409,5410,5411,5412]],"properties":{"id":"24663153","dp":1498,"de":3607}},{"type":"Polygon","arcs":[[5413,5414,-5405,5415]],"properties":{"id":"24663154","dp":2620,"de":0}},{"type":"Polygon","arcs":[[5416,5417,5418,-5406,-5415]],"properties":{"id":"24663155","dp":3962,"de":0}},{"type":"Polygon","arcs":[[5419,5420,5421,5422,5423,-5418]],"properties":{"id":"24663156","dp":4107,"de":274}},{"type":"Polygon","arcs":[[-5417,5424,5425,5426,-5420]],"properties":{"id":"24663157","dp":4373,"de":0}},{"type":"Polygon","arcs":[[5427,-5425,-5414,5428]],"properties":{"id":"24663158","dp":2091,"de":0}},{"type":"Polygon","arcs":[[-5400,5429,5430,-5429,-5416,-5404]],"properties":{"id":"24663159","dp":2908,"de":392}},{"type":"Polygon","arcs":[[-5430,-3440,5431,5432,5433],[5434,5435]],"properties":{"id":"24663160","dp":1418,"de":512}},{"type":"Polygon","arcs":[[5436,5437,5438,5439,-4943]],"properties":{"id":"24663032","dp":4308,"de":297}},{"type":"Polygon","arcs":[[5440,5441,5442,5443,5444]],"properties":{"id":"24663169","dp":5649,"de":654}},{"type":"Polygon","arcs":[[5445,-5442,5446,5447,5448,5449]],"properties":{"id":"24663170","dp":2125,"de":1054}},{"type":"Polygon","arcs":[[5450,-5444,5451]],"properties":{"id":"24663171","dp":15617,"de":8707}},{"type":"Polygon","arcs":[[-3439,5452,5453,5454,5455,5456,-5432]],"properties":{"id":"24663172","dp":1321,"de":715}},{"type":"Polygon","arcs":[[5457,5458,-5456]],"properties":{"id":"24663173","dp":2771,"de":200}},{"type":"Polygon","arcs":[[-5455,5459,5460,5461,5462,-5458]],"properties":{"id":"24663174","dp":1629,"de":1407}},{"type":"Polygon","arcs":[[5463,-3054,5464,5465,-5463]],"properties":{"id":"24663175","dp":2280,"de":724}},{"type":"Polygon","arcs":[[5466,5467,5468,5469,-5464,-5462]],"properties":{"id":"24663176","dp":2022,"de":1603}},{"type":"Polygon","arcs":[[5470,5471,5472,-5468,5473]],"properties":{"id":"24663177","dp":3514,"de":0}},{"type":"Polygon","arcs":[[5474,5475,-5474,-5467,-5461,5476,5477]],"properties":{"id":"24663178","dp":1104,"de":1497}},{"type":"Polygon","arcs":[[5478,5479,-5471,-5476]],"properties":{"id":"24663179","dp":3160,"de":0}},{"type":"Polygon","arcs":[[-5067,-5092,5480,5481]],"properties":{"id":"24661834","dp":19267,"de":5860}},{"type":"Polygon","arcs":[[5482,5483,5484,5485,5486,5487]],"properties":{"id":"24661835","dp":13910,"de":10337}},{"type":"Polygon","arcs":[[5488,-5488,5489,5490]],"properties":{"id":"24661836","dp":11541,"de":9589}},{"type":"Polygon","arcs":[[-5490,-5487,5491,5492,5493,5494]],"properties":{"id":"24661837","dp":10114,"de":10665}},{"type":"Polygon","arcs":[[5495,-5491,-5495,5496,5497]],"properties":{"id":"24661838","dp":14367,"de":7806}},{"type":"Polygon","arcs":[[-5497,-5494,5498,5499,5500]],"properties":{"id":"24661839","dp":14441,"de":6472}},{"type":"Polygon","arcs":[[-5500,5501,-5044,5502]],"properties":{"id":"24661840","dp":10863,"de":7142}},{"type":"Polygon","arcs":[[5503,-5503,-3167,5504]],"properties":{"id":"24661841","dp":15344,"de":5603}},{"type":"Polygon","arcs":[[5505,-5501,-5504,5506,5507]],"properties":{"id":"24661842","dp":18575,"de":3166}},{"type":"Polygon","arcs":[[-5331,-5327,5508,5509,5510]],"properties":{"id":"24661871","dp":6399,"de":9697}},{"type":"Polygon","arcs":[[-5510,5511,5512]],"properties":{"id":"24661872","dp":13771,"de":13840}},{"type":"Polygon","arcs":[[5513,5514,-5512]],"properties":{"id":"24661873","dp":15744,"de":1566}},{"type":"Polygon","arcs":[[-5515,5515,-412,-409,-398,5516]],"properties":{"id":"24661874","dp":11193,"de":5645}},{"type":"Polygon","arcs":[[5517,5518,5519,5520,5521,-407,-411,-416]],"properties":{"id":"24661877","dp":4971,"de":5242}},{"type":"Polygon","arcs":[[5522,5523,5524,5525,5526,-5518,-415]],"properties":{"id":"24661879","dp":7276,"de":7811}},{"type":"Polygon","arcs":[[5527,5528,-5523,5529]],"properties":{"id":"24661880","dp":14052,"de":2236}},{"type":"Polygon","arcs":[[5530,5531,5532,5533,-5524,-5529]],"properties":{"id":"24661881","dp":19101,"de":3651}},{"type":"Polygon","arcs":[[5534,5535,5536,-5531,-5528,5537]],"properties":{"id":"24661882","dp":14992,"de":2623}},{"type":"Polygon","arcs":[[5538,5539,-3175,-5535,5540]],"properties":{"id":"24661883","dp":5861,"de":38564}},{"type":"Polygon","arcs":[[5541,-5541,5542,5543]],"properties":{"id":"24661884","dp":12598,"de":8352}},{"type":"Polygon","arcs":[[5544,-5543,-5538,-5530,-414,5545,-5325]],"properties":{"id":"24661885","dp":6272,"de":887}},{"type":"Polygon","arcs":[[-5326,-5546,-417,-413,-5516,-5514,-5509]],"properties":{"id":"24661886","dp":5636,"de":22045}},{"type":"Polygon","arcs":[[-4809,5546,-5544,-5545,-4815]],"properties":{"id":"24661887","dp":14227,"de":1328}},{"type":"Polygon","arcs":[[-5536,-3174,-5028,5547]],"properties":{"id":"24661889","dp":45392,"de":10535}},{"type":"Polygon","arcs":[[-5548,5548,5549,-5537]],"properties":{"id":"24661890","dp":22307,"de":4142}},{"type":"Polygon","arcs":[[-5550,5550,5551,-5532]],"properties":{"id":"24661891","dp":19068,"de":3105}},{"type":"Polygon","arcs":[[-5549,-5027,-5034,5552,-5551]],"properties":{"id":"24661892","dp":20722,"de":2208}},{"type":"Polygon","arcs":[[5553,5554,5555,-5235]],"properties":{"id":"24662308","dp":1893,"de":261}},{"type":"Polygon","arcs":[[-5554,-5234,5556,5557,5558,5559]],"properties":{"id":"24662309","dp":1331,"de":1818}},{"type":"Polygon","arcs":[[-5233,5560,5561,-5557]],"properties":{"id":"24662310","dp":2185,"de":325}},{"type":"Polygon","arcs":[[5562,5563,5564,5565,5566,5567,-4290,5568,-583,-576,-4383,-4379,5569]],"properties":{"id":"24663351","dp":0,"de":5176}},{"type":"Polygon","arcs":[[-4491,5570,5571,-5567,5572]],"properties":{"id":"24663352","dp":17255,"de":1583}},{"type":"Polygon","arcs":[[-4490,5573,-5571]],"properties":{"id":"24663353","dp":38342,"de":4285}},{"type":"Polygon","arcs":[[-5371,-4863,-4866,-4861,-5311,5574,5575]],"properties":{"id":"24663012","dp":3553,"de":0}},{"type":"Polygon","arcs":[[-5310,5576,5577,-5575]],"properties":{"id":"24663013","dp":4801,"de":1237}},{"type":"Polygon","arcs":[[-5577,-5309,-5307,-5305,5578,5579,5580,5581,5582,5583]],"properties":{"id":"24663014","dp":2146,"de":461}},{"type":"Polygon","arcs":[[-5581,5584,5585,5586,5587]],"properties":{"id":"24663015","dp":6630,"de":867}},{"type":"Polygon","arcs":[[5588,5589,5590,-5586]],"properties":{"id":"24663016","dp":6259,"de":797}},{"type":"Polygon","arcs":[[5591,5592,5593,5594,-5587,-5591,5595]],"properties":{"id":"24663017","dp":4788,"de":1934}},{"type":"Polygon","arcs":[[5596,-5594,5597]],"properties":{"id":"24663018","dp":12425,"de":1063}},{"type":"Polygon","arcs":[[-5582,-5588,-5595,-5597,5598,5599,5600]],"properties":{"id":"24663019","dp":8546,"de":0}},{"type":"Polygon","arcs":[[-5583,-5601,5601,5602,5603,5604]],"properties":{"id":"24663020","dp":3414,"de":88}},{"type":"Polygon","arcs":[[5605,5606,5607,5608,5609,-5604,5610,5611]],"properties":{"id":"24663021","dp":1716,"de":0}},{"type":"Polygon","arcs":[[5612,5613,5614,5615,-5607]],"properties":{"id":"24663022","dp":2784,"de":0}},{"type":"Polygon","arcs":[[5616,5617,5618,5619,-5608,-5616,5620]],"properties":{"id":"24663023","dp":2460,"de":0}},{"type":"Polygon","arcs":[[5621,-5621,-5615,5622,5623]],"properties":{"id":"24663024","dp":3356,"de":0}},{"type":"Polygon","arcs":[[5624,5625,-5624,5626,5627,5628]],"properties":{"id":"24663025","dp":2667,"de":277}},{"type":"Polygon","arcs":[[5629,5630,5631,-5617,-5622,-5626,5632]],"properties":{"id":"24663026","dp":8355,"de":0}},{"type":"Polygon","arcs":[[5633,-5633,-5625,5634,5635,5636]],"properties":{"id":"24663027","dp":2987,"de":288}},{"type":"Polygon","arcs":[[5637,-4944,-5440,5638,-5630,-5634]],"properties":{"id":"24663028","dp":4176,"de":0}},{"type":"Polygon","arcs":[[-4945,-5638,-5637,5639,-4951]],"properties":{"id":"24663029","dp":3170,"de":0}},{"type":"Polygon","arcs":[[5640,5641,5642,5643]],"properties":{"id":"24661758","dp":16156,"de":2135}},{"type":"Polygon","arcs":[[-5644,5644,5645,5646]],"properties":{"id":"24661759","dp":16996,"de":0}},{"type":"Polygon","arcs":[[-5646,5647,5648,5649]],"properties":{"id":"24661760","dp":16938,"de":2857}},{"type":"Polygon","arcs":[[5650,5651,-5368,5652,-5437,-4942,5653]],"properties":{"id":"24663033","dp":3425,"de":276}},{"type":"Polygon","arcs":[[-5367,5654,5655,-5438,-5653]],"properties":{"id":"24663034","dp":4851,"de":2227}},{"type":"Polygon","arcs":[[5656,5657,-5655,5658]],"properties":{"id":"24663035","dp":2814,"de":1185}},{"type":"Polygon","arcs":[[5659,5660,5661,5662,5663,-5658,5664]],"properties":{"id":"24663036","dp":4236,"de":1253}},{"type":"Polygon","arcs":[[5665,5666,5667,-5660]],"properties":{"id":"24663037","dp":2719,"de":477}},{"type":"Polygon","arcs":[[5668,5669,5670,5671,-5661,-5668]],"properties":{"id":"24663038","dp":3770,"de":0}},{"type":"Polygon","arcs":[[5672,5673,5674,5675,-5669,-5667]],"properties":{"id":"24663039","dp":3710,"de":0}},{"type":"Polygon","arcs":[[5676,-5673,-5666,-5665,-5657]],"properties":{"id":"24663040","dp":2819,"de":336}},{"type":"Polygon","arcs":[[-5676,5677,5678,-5670]],"properties":{"id":"24663041","dp":2945,"de":0}},{"type":"Polygon","arcs":[[-5675,5679,5680,5681,5682,5683,5684,-5678]],"properties":{"id":"24663042","dp":3268,"de":0}},{"type":"Polygon","arcs":[[5685,5686,5687,5688,-5684]],"properties":{"id":"24663043","dp":2853,"de":340}},{"type":"Polygon","arcs":[[-5671,-5679,-5685,-5689,5689,5690]],"properties":{"id":"24663044","dp":3365,"de":635}},{"type":"Polygon","arcs":[[-5691,5691,5692,5693,5694,-5662,-5672]],"properties":{"id":"24663045","dp":3039,"de":3211}},{"type":"Polygon","arcs":[[5695,5696,5697,-5693,5698]],"properties":{"id":"24663046","dp":3451,"de":1261}},{"type":"Polygon","arcs":[[5699,5700,5701,5702]],"properties":{"id":"24661791","dp":18706,"de":2097}},{"type":"Polygon","arcs":[[5703,-5703,5704,-5520]],"properties":{"id":"24661792","dp":17711,"de":0}},{"type":"Polygon","arcs":[[-5519,-5527,5705,5706,-5700,-5704]],"properties":{"id":"24661793","dp":13902,"de":5226}},{"type":"Polygon","arcs":[[5707,5708,5709,-5706,-5526]],"properties":{"id":"24661794","dp":18778,"de":0}},{"type":"Polygon","arcs":[[-5534,5710,-5708,-5525]],"properties":{"id":"24661795","dp":17990,"de":7191}},{"type":"Polygon","arcs":[[5711,5712,5713,-5711]],"properties":{"id":"24661796","dp":15874,"de":3321}},{"type":"Polygon","arcs":[[-5552,-5553,5714,5715,-5712,-5533]],"properties":{"id":"24661797","dp":11063,"de":7183}},{"type":"Polygon","arcs":[[5716,-5507,-5505,-3166,5717]],"properties":{"id":"24661843","dp":21604,"de":2389}},{"type":"Polygon","arcs":[[-3690,-5508,-5717,5718,5719]],"properties":{"id":"24661844","dp":17615,"de":3145}},{"type":"Polygon","arcs":[[-5719,-5718,-3165,5720]],"properties":{"id":"24661845","dp":17066,"de":2666}},{"type":"Polygon","arcs":[[5721,-5721,-3164,5722]],"properties":{"id":"24661846","dp":15626,"de":2924}},{"type":"Polygon","arcs":[[5723,-4787,-3705,-3699,-3691,-5720,-5722]],"properties":{"id":"24661847","dp":13139,"de":6744}},{"type":"Polygon","arcs":[[-4788,-5724,-5723,-3163,5724]],"properties":{"id":"24661848","dp":31371,"de":18805}},{"type":"Polygon","arcs":[[-4789,-5725,5725,5726]],"properties":{"id":"24661849","dp":17768,"de":4347}},{"type":"Polygon","arcs":[[-5726,-3178,5727,5728]],"properties":{"id":"24661850","dp":20327,"de":4754}},{"type":"Polygon","arcs":[[-5728,-3177,5729,5730]],"properties":{"id":"24661851","dp":17157,"de":4987}},{"type":"Polygon","arcs":[[-5730,-3176,-5540,5731]],"properties":{"id":"24661852","dp":12081,"de":5338}},{"type":"Polygon","arcs":[[-4806,5732,-5732,-5539,-5542,-5547,-4808]],"properties":{"id":"24661853","dp":11568,"de":4222}},{"type":"Polygon","arcs":[[5733,-5731,-5733,-4805]],"properties":{"id":"24661854","dp":16275,"de":3691}},{"type":"Polygon","arcs":[[-4797,5734,-5729,-5734,-4802]],"properties":{"id":"24661855","dp":14986,"de":4289}},{"type":"Polygon","arcs":[[5735,-5727,-5735,-4796,-4801]],"properties":{"id":"24661856","dp":12903,"de":2867}},{"type":"Polygon","arcs":[[-4790,-5736,-4800,-4794]],"properties":{"id":"24661857","dp":15374,"de":3524}},{"type":"Polygon","arcs":[[5736,5737,5738,-5477,5739,5740]],"properties":{"id":"24662291","dp":2363,"de":2620}},{"type":"Polygon","arcs":[[5741,5742,5743,-5738,5744]],"properties":{"id":"24662292","dp":3110,"de":249}},{"type":"Polygon","arcs":[[5745,5746,-5478,-5739,-5744,5747]],"properties":{"id":"24662293","dp":1729,"de":569}},{"type":"Polygon","arcs":[[5748,-5748,-5743,5749]],"properties":{"id":"24662294","dp":3013,"de":0}},{"type":"Polygon","arcs":[[5750,5751,-5750,-5742]],"properties":{"id":"24662295","dp":3863,"de":0}},{"type":"Polygon","arcs":[[5752,5753,5754,5755,5756,5757]],"properties":{"id":"24661972","dp":7154,"de":5237}},{"type":"Polygon","arcs":[[-1498,-1494,5758,-5754]],"properties":{"id":"24661973","dp":14735,"de":0}},{"type":"Polygon","arcs":[[-5759,-1493,5759,5760,-5755]],"properties":{"id":"24661974","dp":11199,"de":2828}},{"type":"Polygon","arcs":[[-5761,5761,5762,-5756]],"properties":{"id":"24661975","dp":12568,"de":1477}},{"type":"Polygon","arcs":[[-5763,5763,5764,5765,5766]],"properties":{"id":"24661976","dp":12302,"de":3386}},{"type":"Polygon","arcs":[[-5766,5767,5768,5769,5770]],"properties":{"id":"24661977","dp":12413,"de":3605}},{"type":"Polygon","arcs":[[-5765,5771,5772,5773,-5768]],"properties":{"id":"24661978","dp":9698,"de":3723}},{"type":"Polygon","arcs":[[-5774,5774,5775,5776]],"properties":{"id":"24661979","dp":10805,"de":1761}},{"type":"Polygon","arcs":[[5777,-5769,-5777,-1475,-1490,5778]],"properties":{"id":"24661980","dp":12658,"de":0}},{"type":"Polygon","arcs":[[-5572,-5574,-4487,5779,5780,5781,-4293,-4499,-3971,5782,-1106,-3400,-4287,-5568]],"properties":{"id":"24663354","dp":3628,"de":402}},{"type":"Polygon","arcs":[[-4294,-5782,-4475]],"properties":{"id":"24663355","dp":111302,"de":4166}},{"type":"Polygon","arcs":[[-5781,5783,-4481,-4476]],"properties":{"id":"24663356","dp":44790,"de":2958}},{"type":"Polygon","arcs":[[-4486,-4482,-5784,-5780]],"properties":{"id":"24663357","dp":30050,"de":1518}},{"type":"Polygon","arcs":[[-2958,5784,-2749,5785,-1319,-1317,-1315,-1311]],"properties":{"id":"24663358","dp":4498,"de":23309}},{"type":"Polygon","arcs":[[-2957,5786,5787,-2750,-5785]],"properties":{"id":"24663359","dp":24693,"de":8844}},{"type":"Polygon","arcs":[[-2751,-5788,5788]],"properties":{"id":"24663360","dp":43966,"de":6404}},{"type":"Polygon","arcs":[[-2956,-2756,-2752,-5789,-5787]],"properties":{"id":"24663361","dp":11578,"de":26430}},{"type":"Polygon","arcs":[[-1320,-5786,-2748,5789,5790,-1972,5791,-5008,-5014,5792,5793,5794,5795,-1286,-1291,-1297]],"properties":{"id":"24663362","dp":377,"de":1046}},{"type":"Polygon","arcs":[[5796,-5209,-2719,-2717,5797,-5790,-2747,-2745]],"properties":{"id":"24663363","dp":3285,"de":10361}},{"type":"Polygon","arcs":[[-1978,-1973,-5791,-5798,-2716]],"properties":{"id":"24663364","dp":3918,"de":1604}},{"type":"Polygon","arcs":[[-5797,-3389,-2758,-230,-2742,5798,5799,-5210]],"properties":{"id":"24663365","dp":5087,"de":3867}},{"type":"Polygon","arcs":[[5800,-5799,-2741,-2720,5801]],"properties":{"id":"24663366","dp":27344,"de":2074}},{"type":"Polygon","arcs":[[5802,5803,-5802,-2724]],"properties":{"id":"24663367","dp":45965,"de":30965}},{"type":"Polygon","arcs":[[-5211,-5800,-5801,-5804,5804]],"properties":{"id":"24663368","dp":39370,"de":14173}},{"type":"Polygon","arcs":[[5805,5806,5807,5808,-5050]],"properties":{"id":"24661902","dp":15724,"de":3621}},{"type":"Polygon","arcs":[[-5048,5809,5810,-5806]],"properties":{"id":"24661903","dp":17957,"de":4042}},{"type":"Polygon","arcs":[[-5047,5811,5812,-5810]],"properties":{"id":"24661904","dp":14102,"de":5769}},{"type":"Polygon","arcs":[[5813,5814,5815,-5812]],"properties":{"id":"24661905","dp":18581,"de":4181}},{"type":"Polygon","arcs":[[5816,5817,-5815,5818]],"properties":{"id":"24661906","dp":17101,"de":5253}},{"type":"Polygon","arcs":[[-5493,-5819,-5814,-5046,-5502,-5499]],"properties":{"id":"24661907","dp":14172,"de":6843}},{"type":"Polygon","arcs":[[-5808,5819,5820]],"properties":{"id":"24661908","dp":18148,"de":3086}},{"type":"Polygon","arcs":[[-5809,-5821,5821,5822,5823,5824]],"properties":{"id":"24661909","dp":12063,"de":9047}},{"type":"Polygon","arcs":[[5825,5826,5827,5828,-5822,-5820]],"properties":{"id":"24661910","dp":10776,"de":4223}},{"type":"Polygon","arcs":[[5829,5830,5831,5832,-5827]],"properties":{"id":"24661911","dp":17397,"de":3253}},{"type":"Polygon","arcs":[[5833,-5824,5834,-5030,-5038]],"properties":{"id":"24661912","dp":13715,"de":8823}},{"type":"Polygon","arcs":[[-5051,-5825,-5834,-5037,-5041]],"properties":{"id":"24661913","dp":15152,"de":9418}},{"type":"Polygon","arcs":[[-5329,-5511,-5513,-5517,-405,5835,5836]],"properties":{"id":"24661916","dp":2651,"de":334}},{"type":"Polygon","arcs":[[5837,-5836,-404,5838,5839,5840,5841]],"properties":{"id":"24661917","dp":2234,"de":4686}},{"type":"Polygon","arcs":[[5842,-5842,5843,5844,5845]],"properties":{"id":"24661918","dp":5145,"de":970}},{"type":"Polygon","arcs":[[5846,-5846,5847,5848,5849,5850,5851]],"properties":{"id":"24661919","dp":2671,"de":1380}},{"type":"Polygon","arcs":[[5852,-5852,5853,5854,5855]],"properties":{"id":"24661920","dp":2496,"de":1621}},{"type":"Polygon","arcs":[[5856,-5856,5857,5858,5859]],"properties":{"id":"24661921","dp":2077,"de":837}},{"type":"Polygon","arcs":[[-5312,5860,-5860,5861,5862,5863,5864,5865]],"properties":{"id":"24661922","dp":3886,"de":1209}},{"type":"Polygon","arcs":[[5866,5867,-5186,5868,-5469,-5473]],"properties":{"id":"24662322","dp":2640,"de":0}},{"type":"Polygon","arcs":[[-5185,5869,5870,5871,5872,5873,5874,-5869]],"properties":{"id":"24662323","dp":4678,"de":0}},{"type":"Polygon","arcs":[[-5872,5875,5876]],"properties":{"id":"24662324","dp":4533,"de":0}},{"type":"Polygon","arcs":[[-5871,5877,-5164,5878,-4971,-4976,5879,-5876]],"properties":{"id":"24662325","dp":3143,"de":348}},{"type":"Polygon","arcs":[[-5873,-5877,-5880,-4978,5880,5881]],"properties":{"id":"24662326","dp":3614,"de":0}},{"type":"Polygon","arcs":[[5882,-5874,-5882,5883,-5052,5884]],"properties":{"id":"24662327","dp":2698,"de":177}},{"type":"Polygon","arcs":[[5885,5886,-5779,-1489]],"properties":{"id":"24661981","dp":16081,"de":1520}},{"type":"Polygon","arcs":[[5887,-5770,-5778,-5887,5888]],"properties":{"id":"24661982","dp":15856,"de":1401}},{"type":"Polygon","arcs":[[5889,-5757,-5767,-5771,-5888,5890]],"properties":{"id":"24661983","dp":8888,"de":2923}},{"type":"Polygon","arcs":[[5891,-5891,-5889,5892,5893,5894,5895,5896,5897]],"properties":{"id":"24661984","dp":10451,"de":0}},{"type":"Polygon","arcs":[[5898,-5897]],"properties":{"id":"24661985","dp":29836,"de":0}},{"type":"Polygon","arcs":[[5899,-5898,-5899,-5896,5900,5901]],"properties":{"id":"24661986","dp":10344,"de":2323}},{"type":"Polygon","arcs":[[-5901,-5895,5902,5903]],"properties":{"id":"24661987","dp":21005,"de":2234}},{"type":"Polygon","arcs":[[-5903,-5894,5904,5905]],"properties":{"id":"24661988","dp":17865,"de":3370}},{"type":"Polygon","arcs":[[5906,-5905,-5893,-5886,-1488,5907]],"properties":{"id":"24661989","dp":16571,"de":2380}},{"type":"Polygon","arcs":[[5908,-5908,-1487,5909,5910]],"properties":{"id":"24661990","dp":12929,"de":3521}},{"type":"Polygon","arcs":[[5911,-5910,-1486,5912,5913]],"properties":{"id":"24661991","dp":16134,"de":3781}},{"type":"Polygon","arcs":[[5914,-5913,-1485,-1482,5915,5916]],"properties":{"id":"24661992","dp":16920,"de":3492}},{"type":"Polygon","arcs":[[5917,-5917,5918,5919,5920]],"properties":{"id":"24661993","dp":15101,"de":4949}},{"type":"Polygon","arcs":[[-5916,5921,-5919]],"properties":{"id":"24661994","dp":15261,"de":0}},{"type":"Polygon","arcs":[[5922,-5922,-1481,-1478,5923]],"properties":{"id":"24661995","dp":14195,"de":2545}},{"type":"Polygon","arcs":[[-5924,-1477,-1459,5924,5925]],"properties":{"id":"24661996","dp":9977,"de":0}},{"type":"Polygon","arcs":[[5926,5927,5928,5929,5930]],"properties":{"id":"24662366","dp":4026,"de":0}},{"type":"Polygon","arcs":[[-5929,5931,-4948,5932,5933,5934,5935,5936]],"properties":{"id":"24662367","dp":3485,"de":744}},{"type":"Polygon","arcs":[[-4947,-4950,5937,-5933]],"properties":{"id":"24662368","dp":3632,"de":284}},{"type":"Polygon","arcs":[[-5938,-4949,5938,5939,5940,-5934]],"properties":{"id":"24662369","dp":2238,"de":438}},{"type":"Polygon","arcs":[[5941,5942,5943,-5940]],"properties":{"id":"24662370","dp":3178,"de":317}},{"type":"Polygon","arcs":[[5944,-5062]],"properties":{"id":"24663408","dp":7381,"de":0}},{"type":"Polygon","arcs":[[-4979,-4973,5945,5946,-4958,-5063,-5945,-5061]],"properties":{"id":"24663409","dp":4978,"de":712}},{"type":"Polygon","arcs":[[-4969,5947,5948,-5946]],"properties":{"id":"24663410","dp":6406,"de":0}},{"type":"Polygon","arcs":[[-5949,5949,-4959,-5947]],"properties":{"id":"24663411","dp":4462,"de":0}},{"type":"Polygon","arcs":[[5950,-2044,-3114,-4426]],"properties":{"id":"24663412","dp":4522,"de":895}},{"type":"Polygon","arcs":[[-4425,-2060,-4424,-4427,-2058,-2045,-5951]],"properties":{"id":"24663413","dp":9115,"de":3651}},{"type":"Polygon","arcs":[[5951,5952,5953,-3511,5954,5955,-3608,-3600,-4555,-4414,-3115,-2052,-2037,-2035,-1532,5956,5957,5958,5959,5960,5961]],"properties":{"id":"24663419","dp":33,"de":2588}},{"type":"Polygon","arcs":[[5962,5963,5964,5965,5966,5967]],"properties":{"id":"24663420","dp":4244,"de":312}},{"type":"Polygon","arcs":[[-5964,5968]],"properties":{"id":"24663421","dp":4817,"de":400}},{"type":"Polygon","arcs":[[-5963,5969,5970]],"properties":{"id":"24663422","dp":4695,"de":428}},{"type":"Polygon","arcs":[[-5969,-5971,5971,-5958,5972,5973,5974,-5153,-3442,5975,5976,5977,5978,-5965]],"properties":{"id":"24663423","dp":110,"de":3086}},{"type":"Polygon","arcs":[[-5972,5979,5980,-5959]],"properties":{"id":"24663424","dp":4548,"de":989}},{"type":"Polygon","arcs":[[5981,-5960,-5981,5982,5983]],"properties":{"id":"24663425","dp":9652,"de":1159}},{"type":"Polygon","arcs":[[5984,-2210,-2303,-2301]],"properties":{"id":"24663426","dp":17381,"de":0}},{"type":"Polygon","arcs":[[-2138,-2213,-2211,-5985,-2300,-2298,-2215]],"properties":{"id":"24663428","dp":4996,"de":1087}},{"type":"Polygon","arcs":[[-5006,-5792,-1971,5985,5986,-3024,-3021,-1321]],"properties":{"id":"24663370","dp":3,"de":174}},{"type":"Polygon","arcs":[[5987,5988,-5986,-1970]],"properties":{"id":"24663371","dp":48581,"de":4391}},{"type":"Polygon","arcs":[[-1969,5989,-5988]],"properties":{"id":"24663372","dp":40918,"de":0}},{"type":"Polygon","arcs":[[-3288,-3289,-3296,-3462,-3023,-3025,-5987,-5989,-5990,-1968]],"properties":{"id":"24663373","dp":11791,"de":1515}},{"type":"Polygon","arcs":[[-4338,-4330,-3981,5990,5991]],"properties":{"id":"24663374","dp":10415,"de":1298}},{"type":"Polygon","arcs":[[5992,5993,5994,5995,5996,-4333,-5992,5997]],"properties":{"id":"24663375","dp":9598,"de":802}},{"type":"Polygon","arcs":[[5998,5999,-4347,6000,6001,-5994]],"properties":{"id":"24663376","dp":3970,"de":5338}},{"type":"Polygon","arcs":[[6002,-4343,-4348,-6000]],"properties":{"id":"24663377","dp":9555,"de":1420}},{"type":"Polygon","arcs":[[6003,-4525,-4344,-4339,-6003,-5999,-5993,6004]],"properties":{"id":"24663378","dp":4187,"de":1067}},{"type":"Polygon","arcs":[[-3972,-4530,-4526,-6004,6005]],"properties":{"id":"24663379","dp":14021,"de":0}},{"type":"Polygon","arcs":[[-6005,-5998,-5991,-3980,-6006]],"properties":{"id":"24663380","dp":5446,"de":0}},{"type":"Polygon","arcs":[[6006,6007,-2873,6008,-2116,-2122,-2125,-2311,6009]],"properties":{"id":"24663381","dp":2,"de":638}},{"type":"Polygon","arcs":[[-3108,-2542,-2545,-2551,-2555,-3428,6010,-2533,-2537,-2539]],"properties":{"id":"24663382","dp":5,"de":0}},{"type":"Polygon","arcs":[[6011,6012,6013,6014,6015,6016,-5390,-2028,-1938]],"properties":{"id":"24663383","dp":617,"de":1335}},{"type":"Polygon","arcs":[[6017,-6016,6018]],"properties":{"id":"24663384","dp":4514,"de":4583}},{"type":"Polygon","arcs":[[6019,6020,-6019,-6015,6021]],"properties":{"id":"24663385","dp":9437,"de":974}},{"type":"Polygon","arcs":[[-6021,6022,-5386,-5384,6023]],"properties":{"id":"24663386","dp":7647,"de":880}},{"type":"Polygon","arcs":[[-6024,-5389,-5391,-6017,-6018]],"properties":{"id":"24663387","dp":8240,"de":0}},{"type":"Polygon","arcs":[[6024,6025,-6023,-6020,6026]],"properties":{"id":"24663388","dp":9557,"de":766}},{"type":"Polygon","arcs":[[-6027,-6022,-6014,6027]],"properties":{"id":"24663389","dp":7300,"de":933}},{"type":"Polygon","arcs":[[6028,6029,6030,-5983,-5980,-5970,-5968,6031,6032,6033,-5995,-6002,6034]],"properties":{"id":"24663414","dp":3210,"de":1098}},{"type":"Polygon","arcs":[[-6029,6035]],"properties":{"id":"24663415","dp":8810,"de":0}},{"type":"Polygon","arcs":[[-4353,-4359,6036,-5962,6037,6038,-6030,-6036,-6035,-6001,-4346]],"properties":{"id":"24663416","dp":2317,"de":5462}},{"type":"Polygon","arcs":[[-5984,-6031,-6039,6039]],"properties":{"id":"24663417","dp":9046,"de":2798}},{"type":"Polygon","arcs":[[-5961,-5982,-6040,-6038]],"properties":{"id":"24663418","dp":10895,"de":0}},{"type":"Polygon","arcs":[[6040,-367,-5319,-5315]],"properties":{"id":"24661730","dp":16880,"de":0}},{"type":"Polygon","arcs":[[6041,-378,-371,-6041,-5314]],"properties":{"id":"24661731","dp":12441,"de":2597}},{"type":"Polygon","arcs":[[-5866,6042,-375,-6042,-5313]],"properties":{"id":"24661732","dp":16168,"de":3448}},{"type":"Polygon","arcs":[[-5865,6043,6044,-376,-6043]],"properties":{"id":"24661733","dp":17262,"de":0}},{"type":"Polygon","arcs":[[-5864,6045,6046,6047,-6044]],"properties":{"id":"24661734","dp":18052,"de":0}},{"type":"Polygon","arcs":[[6048,-6046,-5863,6049]],"properties":{"id":"24661735","dp":15244,"de":1152}},{"type":"Polygon","arcs":[[-5859,6050,6051,6052,-6050,-5862]],"properties":{"id":"24661736","dp":9780,"de":5118}},{"type":"Polygon","arcs":[[6053,-6051,-5858,-5855]],"properties":{"id":"24661737","dp":14640,"de":2877}},{"type":"Polygon","arcs":[[6054,6055,6056,6057,-6052,-6054,-5854]],"properties":{"id":"24661738","dp":10280,"de":2730}},{"type":"Polygon","arcs":[[6058,6059,-6055,-5851]],"properties":{"id":"24661739","dp":15628,"de":2428}},{"type":"Polygon","arcs":[[6060,6061,-6056,-6060]],"properties":{"id":"24661740","dp":12657,"de":1571}},{"type":"Polygon","arcs":[[6062,6063,-6061,6064]],"properties":{"id":"24661741","dp":17597,"de":0}},{"type":"Polygon","arcs":[[6065,-6065,-6059,-5850]],"properties":{"id":"24661742","dp":14510,"de":3115}},{"type":"Polygon","arcs":[[6066,6067,-6066,-5849]],"properties":{"id":"24661743","dp":15205,"de":74531}},{"type":"Polygon","arcs":[[6068,6069,-6067,-5848]],"properties":{"id":"24661744","dp":16950,"de":3571}},{"type":"Polygon","arcs":[[6070,6071,-6069,-5845]],"properties":{"id":"24661745","dp":16925,"de":1766}},{"type":"Polygon","arcs":[[6072,6073,6074,-6072]],"properties":{"id":"24661746","dp":20318,"de":1724}},{"type":"Polygon","arcs":[[-5841,6075,6076,-6073,-6071,-5844]],"properties":{"id":"24661747","dp":16655,"de":1535}},{"type":"Polygon","arcs":[[6077,6078,6079,6080,6081,6082,-6074,-6077,6083]],"properties":{"id":"24661748","dp":11237,"de":3669}},{"type":"Polygon","arcs":[[6084,6085,-6084,-6076,-5840]],"properties":{"id":"24661749","dp":17024,"de":0}},{"type":"Polygon","arcs":[[6086,6087,6088,-6078,-6086]],"properties":{"id":"24661750","dp":13285,"de":0}},{"type":"Polygon","arcs":[[-6085,-5839,-403,6089,-6087]],"properties":{"id":"24661751","dp":2890,"de":2701}},{"type":"Polygon","arcs":[[6090,6091,6092,-6088,-6090]],"properties":{"id":"24661752","dp":8127,"de":3802}},{"type":"Polygon","arcs":[[-6093,6093,6094,-6089]],"properties":{"id":"24661753","dp":21478,"de":0}},{"type":"Polygon","arcs":[[-6095,6095,6096,-6079]],"properties":{"id":"24661754","dp":17242,"de":2263}},{"type":"Polygon","arcs":[[-6080,-6097,6097,6098]],"properties":{"id":"24661755","dp":20180,"de":4279}},{"type":"Polygon","arcs":[[-6099,6099,6100,-6081]],"properties":{"id":"24661756","dp":18355,"de":2444}},{"type":"Polygon","arcs":[[-6101,6101,6102,-5642,-6082]],"properties":{"id":"24661757","dp":17674,"de":3386}},{"type":"MultiPolygon","arcs":[[[6103,6104,6105,6106,6107]],[[6108,6109,6110,6111]]],"properties":{"id":"24662238","dp":2261,"de":793}},{"type":"Polygon","arcs":[[-5189,-5204,6112,-5171,-5178,-5176,-5174,6113,6114]],"properties":{"id":"24663429","dp":2041,"de":2799}},{"type":"Polygon","arcs":[[-5179,-5182,6115,-5190,-6115,6116,-5183]],"properties":{"id":"24663430","dp":900,"de":1705}},{"type":"Polygon","arcs":[[-3896,6117,-3110,-1072,-3894]],"properties":{"id":"24663431","dp":5080,"de":6645}},{"type":"Polygon","arcs":[[-3111,-6118,-3903]],"properties":{"id":"24663432","dp":5280,"de":570}},{"type":"Polygon","arcs":[[-2560,6118,6119,-2961,-4585,-2973,-2971]],"properties":{"id":"24663434","dp":8464,"de":616}},{"type":"Polygon","arcs":[[6120,6121,6122,-6119,-2559,-2563]],"properties":{"id":"24663436","dp":10303,"de":1757}},{"type":"Polygon","arcs":[[6123,-2733,-2735,-2736,-2962,-6120]],"properties":{"id":"24663437","dp":9503,"de":20644}},{"type":"Polygon","arcs":[[-6124,-6123,6124,-5212,6125,6126]],"properties":{"id":"24663438","dp":6438,"de":2319}},{"type":"Polygon","arcs":[[-1201,6127,6128,-1245,-1253,-1254,-5127,-3670,6129]],"properties":{"id":"24663439","dp":625,"de":1190}},{"type":"Polygon","arcs":[[-1200,-1244,6130,6131,6132,-6128]],"properties":{"id":"24663441","dp":0,"de":2041}},{"type":"Polygon","arcs":[[-6129,6133,6134,-1248,-1246]],"properties":{"id":"24663442","dp":7644,"de":47537}},{"type":"Polygon","arcs":[[6135,6136,-6134,-6133]],"properties":{"id":"24663443","dp":9341,"de":8797}},{"type":"Polygon","arcs":[[-2967,6137,6138,6139]],"properties":{"id":"24663444","dp":23480,"de":0}},{"type":"Polygon","arcs":[[-6132,6140,-2590,-2968,-6140,-6136]],"properties":{"id":"24663445","dp":5663,"de":8789}},{"type":"Polygon","arcs":[[6141,6142,6143,-5751,6144]],"properties":{"id":"24662296","dp":2301,"de":0}},{"type":"Polygon","arcs":[[6145,6146,6147,-6142,6148]],"properties":{"id":"24662297","dp":1810,"de":391}},{"type":"Polygon","arcs":[[-6149,-6145,-5745,6149,6150]],"properties":{"id":"24662298","dp":1947,"de":0}},{"type":"Polygon","arcs":[[-6146,-6151,6151,6152,6153]],"properties":{"id":"24662299","dp":2278,"de":0}},{"type":"Polygon","arcs":[[6154,6155,-6147,-6154,6156,6157,6158,6159,6160]],"properties":{"id":"24662300","dp":1832,"de":1214}},{"type":"Polygon","arcs":[[6161,6162,-6157,-6153,6163,6164]],"properties":{"id":"24662301","dp":2556,"de":1063}},{"type":"Polygon","arcs":[[-6150,-5737,6165,-6164,-6152]],"properties":{"id":"24662302","dp":2085,"de":0}},{"type":"Polygon","arcs":[[6166,-6159,6167,6168,-6165,-6166,6169]],"properties":{"id":"24662303","dp":1580,"de":0}},{"type":"Polygon","arcs":[[-6162,-6169,6170]],"properties":{"id":"24662304","dp":2816,"de":348}},{"type":"Polygon","arcs":[[-6158,-6163,-6171,-6168]],"properties":{"id":"24662305","dp":2878,"de":384}},{"type":"Polygon","arcs":[[-5232,6171,-5230,6172,6173,-5561]],"properties":{"id":"24662311","dp":1553,"de":149}},{"type":"Polygon","arcs":[[-5229,6174,-6173]],"properties":{"id":"24662312","dp":1454,"de":1075}},{"type":"Polygon","arcs":[[-6174,-6175,-5228,-5226,-5224,-5219,6175,-6155,6176,-5558,-5562]],"properties":{"id":"24662313","dp":840,"de":142}},{"type":"Polygon","arcs":[[-5218,-5201,-5205,-4676,6177,6178,-6156,-6176]],"properties":{"id":"24662314","dp":3498,"de":0}},{"type":"Polygon","arcs":[[-6148,-6179,6179,6180]],"properties":{"id":"24662315","dp":2455,"de":527}},{"type":"Polygon","arcs":[[-6178,-4679,-5215,6181,-6180]],"properties":{"id":"24662316","dp":2888,"de":306}},{"type":"Polygon","arcs":[[-6181,-6182,-5214,6182,-6143]],"properties":{"id":"24662317","dp":2817,"de":0}},{"type":"Polygon","arcs":[[-5213,-5197,6183,-6144,-6183]],"properties":{"id":"24662318","dp":2925,"de":0}},{"type":"Polygon","arcs":[[-5752,-6184,-5192,6184,-5746,-5749]],"properties":{"id":"24662319","dp":1692,"de":360}},{"type":"Polygon","arcs":[[-6185,-5191,-6116,-5181,-5868,6185,-5479,-5475,-5747]],"properties":{"id":"24662320","dp":2385,"de":812}},{"type":"Polygon","arcs":[[-6186,-5867,-5472,-5480]],"properties":{"id":"24662321","dp":3259,"de":0}},{"type":"Polygon","arcs":[[6186,6187,6188]],"properties":{"id":"24662705","dp":41953,"de":0}},{"type":"Polygon","arcs":[[-6189,6189,6190,6191,6192]],"properties":{"id":"24662706","dp":13309,"de":1079}},{"type":"MultiPolygon","arcs":[[[6193,6194,6195,6196,6197,6198]],[[6199]],[[6200,6201,6202]],[[6203]]],"properties":{"id":"24662707","dp":1614,"de":0}},{"type":"Polygon","arcs":[[-5649,6204,6205,6206,6207]],"properties":{"id":"24661761","dp":15096,"de":5038}},{"type":"Polygon","arcs":[[6208,-5650,-6208,6209,6210,-6064]],"properties":{"id":"24661762","dp":12626,"de":4966}},{"type":"Polygon","arcs":[[-6068,-6070,-6075,-6083,-5641,-5647,-6209,-6063]],"properties":{"id":"24661763","dp":12583,"de":3149}},{"type":"Polygon","arcs":[[-6211,6211,6212,-6062]],"properties":{"id":"24661764","dp":13913,"de":7681}},{"type":"Polygon","arcs":[[-6210,-6207,6213,6214,6215,-6212]],"properties":{"id":"24661765","dp":12851,"de":21205}},{"type":"Polygon","arcs":[[-6213,-6216,6216,6217,6218,-6057]],"properties":{"id":"24661766","dp":11159,"de":8956}},{"type":"Polygon","arcs":[[-6215,6219,6220,6221,6222,-6217]],"properties":{"id":"24661767","dp":11887,"de":8657}},{"type":"Polygon","arcs":[[6223,6224,6225,-6220,-6214]],"properties":{"id":"24661768","dp":7238,"de":1791}},{"type":"Polygon","arcs":[[6226,6227,-6224,-6206]],"properties":{"id":"24661769","dp":16767,"de":0}},{"type":"Polygon","arcs":[[6228,6229,-6227,-6205,-5648,-5645]],"properties":{"id":"24661770","dp":7574,"de":2425}},{"type":"Polygon","arcs":[[-6103,6230,6231,6232,-6229,-5643]],"properties":{"id":"24661771","dp":16973,"de":2600}},{"type":"Polygon","arcs":[[-6102,6233,6234,-6231]],"properties":{"id":"24661772","dp":16303,"de":0}},{"type":"Polygon","arcs":[[6235,6236,6237,-6234,-6100,-6098,-6096]],"properties":{"id":"24661773","dp":10762,"de":1326}},{"type":"Polygon","arcs":[[6238,6239,6240,-6238]],"properties":{"id":"24661774","dp":19375,"de":0}},{"type":"Polygon","arcs":[[6241,6242,-6239,-6237]],"properties":{"id":"24661775","dp":11594,"de":1293}},{"type":"Polygon","arcs":[[6243,6244,6245,-6242,6246]],"properties":{"id":"24661776","dp":8608,"de":2355}},{"type":"Polygon","arcs":[[-6246,6247,6248,6249,6250,-6240,-6243]],"properties":{"id":"24661777","dp":6741,"de":1690}},{"type":"Polygon","arcs":[[6251,6252,-6248,-6245,6253]],"properties":{"id":"24661778","dp":8116,"de":4743}},{"type":"Polygon","arcs":[[-6254,-6244,6254,6255]],"properties":{"id":"24661779","dp":6321,"de":2008}},{"type":"Polygon","arcs":[[6256,6257,-6256,6258]],"properties":{"id":"24661780","dp":9661,"de":1224}},{"type":"Polygon","arcs":[[6259,-6259,6260,6261,6262]],"properties":{"id":"24661781","dp":9341,"de":1508}},{"type":"Polygon","arcs":[[-6261,-6255,-6247,-6236,-6094,-6092]],"properties":{"id":"24661782","dp":5055,"de":2746}},{"type":"Polygon","arcs":[[6263,-6262,-6091,-402]],"properties":{"id":"24661783","dp":14177,"de":1407}},{"type":"Polygon","arcs":[[-401,6264,6265,-6263,-6264]],"properties":{"id":"24661784","dp":14551,"de":1345}},{"type":"Polygon","arcs":[[6266,-6266,6267]],"properties":{"id":"24661785","dp":11036,"de":0}},{"type":"Polygon","arcs":[[-408,-5522,6268,-6268,-6265,-400]],"properties":{"id":"24661786","dp":8508,"de":2130}},{"type":"Polygon","arcs":[[-5521,-5705,6269,6270,-6269]],"properties":{"id":"24661787","dp":11700,"de":0}},{"type":"Polygon","arcs":[[-6271,6271,-6260,-6267]],"properties":{"id":"24661788","dp":14873,"de":0}},{"type":"Polygon","arcs":[[6272,6273,-6257,-6272]],"properties":{"id":"24661789","dp":15202,"de":0}},{"type":"Polygon","arcs":[[-5702,6274,-6273,-6270]],"properties":{"id":"24661790","dp":16011,"de":1123}},{"type":"Polygon","arcs":[[6275,6276,6277]],"properties":{"id":"24662255","dp":3737,"de":0}},{"type":"Polygon","arcs":[[6278,6279,6280,6281,-6278,6282]],"properties":{"id":"24662256","dp":2588,"de":430}},{"type":"Polygon","arcs":[[-5236,-5556,6283,-5559,-6177,-6161,-5351,-5338]],"properties":{"id":"24662306","dp":1249,"de":139}},{"type":"Polygon","arcs":[[-5555,-5560,-6284]],"properties":{"id":"24662307","dp":1959,"de":424}},{"type":"Polygon","arcs":[[6284,6285,6286,6287,-6194,6288,-6203,6289,6290]],"properties":{"id":"24662671","dp":2857,"de":348}},{"type":"Polygon","arcs":[[-6192,6291,6292,6293,-6291]],"properties":{"id":"24662672","dp":6882,"de":887}},{"type":"Polygon","arcs":[[6294,6295,-6292,-6191,6296]],"properties":{"id":"24662673","dp":7914,"de":1071}},{"type":"Polygon","arcs":[[6297,-6296,6298,6299]],"properties":{"id":"24662674","dp":13984,"de":957}},{"type":"Polygon","arcs":[[6300,-6293,-6298,6301,6302]],"properties":{"id":"24662675","dp":9869,"de":913}},{"type":"Polygon","arcs":[[6303,6304,6305,-6302,6306]],"properties":{"id":"24662676","dp":6731,"de":2977}},{"type":"Polygon","arcs":[[-6307,-6300,6307,6308,6309]],"properties":{"id":"24662677","dp":11051,"de":1860}},{"type":"Polygon","arcs":[[-6309,6310,6311]],"properties":{"id":"24662678","dp":11729,"de":947}},{"type":"Polygon","arcs":[[-5875,-5883,6312,-3059,-3055,-5470]],"properties":{"id":"24662328","dp":3185,"de":1033}},{"type":"Polygon","arcs":[[6313,-6313,-5885,-5056,6314]],"properties":{"id":"24662329","dp":3261,"de":438}},{"type":"Polygon","arcs":[[-3060,-6314,6315,6316]],"properties":{"id":"24662330","dp":3657,"de":1406}},{"type":"Polygon","arcs":[[-3061,-6317,6317,6318,6319,6320]],"properties":{"id":"24662331","dp":1606,"de":110}},{"type":"Polygon","arcs":[[-6316,6321,6322,6323,6324,-6318]],"properties":{"id":"24662332","dp":6775,"de":602}},{"type":"Polygon","arcs":[[-6315,-5055,6325,6326,-6322]],"properties":{"id":"24662333","dp":3983,"de":1212}},{"type":"Polygon","arcs":[[-5059,-4964,6327,-6326]],"properties":{"id":"24662334","dp":4472,"de":365}},{"type":"Polygon","arcs":[[-6327,-6328,-4967,6328,6329,6330,6331]],"properties":{"id":"24662335","dp":3950,"de":1421}},{"type":"Polygon","arcs":[[-6332,6332,6333,-6323]],"properties":{"id":"24662336","dp":9900,"de":931}},{"type":"Polygon","arcs":[[-6331,6334,-5696,6335,-6333]],"properties":{"id":"24662337","dp":7324,"de":0}},{"type":"Polygon","arcs":[[-5688,6336,6337,6338,-6324,-6334,-6336,-5699,-5692,-5690]],"properties":{"id":"24662338","dp":2305,"de":1478}},{"type":"Polygon","arcs":[[6339,6340,-6338]],"properties":{"id":"24662339","dp":4017,"de":0}},{"type":"Polygon","arcs":[[6341,-6320,6342,-6340,-6337,-5687,6343]],"properties":{"id":"24662340","dp":3325,"de":764}},{"type":"Polygon","arcs":[[-6343,-6319,-6325,-6339,-6341]],"properties":{"id":"24662341","dp":3875,"de":230}},{"type":"Polygon","arcs":[[6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,-1830]],"properties":{"id":"24662730","dp":1834,"de":2895}},{"type":"Polygon","arcs":[[-1674,6354,6355,-1387,-6354,6356,6357,-3586]],"properties":{"id":"24662731","dp":614,"de":2821}},{"type":"Polygon","arcs":[[-1680,-1681,6358,-6355]],"properties":{"id":"24662732","dp":7581,"de":0}},{"type":"Polygon","arcs":[[-1684,-1689,-1694,-1708,-1383,-6356,-6359]],"properties":{"id":"24662733","dp":9120,"de":685}},{"type":"Polygon","arcs":[[-6358,6359,6360,6361,6362,6363,-3587]],"properties":{"id":"24662734","dp":3022,"de":2329}},{"type":"Polygon","arcs":[[6364,6365,-6361]],"properties":{"id":"24662735","dp":9518,"de":0}},{"type":"Polygon","arcs":[[6366,6367,-6107,6368,6369,6370]],"properties":{"id":"24662239","dp":3567,"de":602}},{"type":"Polygon","arcs":[[6371,6372,-6369,-6106]],"properties":{"id":"24662240","dp":7881,"de":3268}},{"type":"Polygon","arcs":[[-6373,6373,6374,-6370]],"properties":{"id":"24662241","dp":3505,"de":1525}},{"type":"Polygon","arcs":[[6375,-6371,-6375,6376,6377]],"properties":{"id":"24662242","dp":3234,"de":1782}},{"type":"Polygon","arcs":[[6378,6379,6380,6381,6382,6383,-1529,6384,-6377]],"properties":{"id":"24662243","dp":1208,"de":2566}},{"type":"Polygon","arcs":[[-6374,6385,6386,6387,6388,-6379]],"properties":{"id":"24662244","dp":2557,"de":909}},{"type":"Polygon","arcs":[[-6389,6389,6390,6391,6392,-6380]],"properties":{"id":"24662245","dp":2398,"de":0}},{"type":"Polygon","arcs":[[6393,-6390,-6388,6394,-6386,-6372]],"properties":{"id":"24662246","dp":10977,"de":448}},{"type":"Polygon","arcs":[[-6387,-6395]],"properties":{"id":"24662247","dp":0,"de":0}},{"type":"Polygon","arcs":[[6395,6396,6397,-6391,-6394,-6105]],"properties":{"id":"24662248","dp":1504,"de":225}},{"type":"Polygon","arcs":[[-6279,6398,6399,6400,-6392,-6398]],"properties":{"id":"24662250","dp":1143,"de":762}},{"type":"Polygon","arcs":[[-6393,-6401,6401,6402,-6381]],"properties":{"id":"24662251","dp":2939,"de":744}},{"type":"Polygon","arcs":[[-6400,6403,6404,-6402]],"properties":{"id":"24662252","dp":3252,"de":0}},{"type":"Polygon","arcs":[[6405,-6382,-6403,-6405]],"properties":{"id":"24662253","dp":10107,"de":0}},{"type":"Polygon","arcs":[[-6283,-6277,-6383,-6406,-6404,-6399]],"properties":{"id":"24662254","dp":3446,"de":461}},{"type":"Polygon","arcs":[[6406,-4695,6407,6408,6409,6410,6411,6412]],"properties":{"id":"24662585","dp":4198,"de":409}},{"type":"Polygon","arcs":[[-6413,6413,6414,6415,6416,6417]],"properties":{"id":"24662586","dp":4531,"de":1060}},{"type":"Polygon","arcs":[[-6417,6418,6419,6420]],"properties":{"id":"24662587","dp":13375,"de":1380}},{"type":"Polygon","arcs":[[-6407,-6418,-6421,6421,6422,-4696]],"properties":{"id":"24662588","dp":8159,"de":0}},{"type":"Polygon","arcs":[[6423,-6281,6424]],"properties":{"id":"24662257","dp":3152,"de":0}},{"type":"Polygon","arcs":[[6425,-6304,-6310,-6312,6426,6427,6428,-6346]],"properties":{"id":"24662679","dp":5501,"de":2354}},{"type":"Polygon","arcs":[[-6429,6429,-6347]],"properties":{"id":"24662680","dp":9791,"de":2083}},{"type":"Polygon","arcs":[[-6428,6430,6431,-6348,-6430]],"properties":{"id":"24662681","dp":9580,"de":1904}},{"type":"Polygon","arcs":[[-6432,6432,6433,-6349]],"properties":{"id":"24662682","dp":9391,"de":2186}},{"type":"Polygon","arcs":[[6434,6435,6436,-6433]],"properties":{"id":"24662683","dp":14871,"de":0}},{"type":"Polygon","arcs":[[-6434,-6437,6437,6438,-6350]],"properties":{"id":"24662684","dp":11510,"de":0}},{"type":"Polygon","arcs":[[-6438,6439,6440,6441,6442]],"properties":{"id":"24662685","dp":10287,"de":1053}},{"type":"Polygon","arcs":[[-6440,-6436,6443,6444,6445]],"properties":{"id":"24662686","dp":12788,"de":0}},{"type":"Polygon","arcs":[[6446,6447,6448,-6446]],"properties":{"id":"24662687","dp":10598,"de":1028}},{"type":"Polygon","arcs":[[-6449,6449,6450,6451,-6441]],"properties":{"id":"24662688","dp":13352,"de":0}},{"type":"Polygon","arcs":[[-6442,-6452,6452,6453,6454,6455,6456]],"properties":{"id":"24662689","dp":5850,"de":1264}},{"type":"Polygon","arcs":[[-6451,6457,6458,6459,6460,-6453]],"properties":{"id":"24662690","dp":12312,"de":0}},{"type":"Polygon","arcs":[[-6461,6461,6462,6463,-6454]],"properties":{"id":"24662691","dp":6297,"de":749}},{"type":"Polygon","arcs":[[-6460,6464,-3571,6465,-6462]],"properties":{"id":"24662692","dp":5813,"de":1182}},{"type":"Polygon","arcs":[[6466,-3572,-6465,-6459,6467]],"properties":{"id":"24662693","dp":7787,"de":0}},{"type":"Polygon","arcs":[[6468,6469,-3573,-6467,6470]],"properties":{"id":"24662694","dp":7267,"de":910}},{"type":"Polygon","arcs":[[6471,-6471,-6468,-6458,-6450,-6448]],"properties":{"id":"24662695","dp":12815,"de":1958}},{"type":"Polygon","arcs":[[6472,6473,-6469,-6472,-6447,6474]],"properties":{"id":"24662696","dp":8731,"de":755}},{"type":"Polygon","arcs":[[6475,6476,6477,-6473,6478]],"properties":{"id":"24662697","dp":9029,"de":0}},{"type":"Polygon","arcs":[[6479,-3574,-6470,-6474,-6478]],"properties":{"id":"24662698","dp":5712,"de":6724}},{"type":"Polygon","arcs":[[6480,-3575,-6480,6481]],"properties":{"id":"24662699","dp":9426,"de":1946}},{"type":"Polygon","arcs":[[-6193,-6290,-6202,6482,-3568,6483,-6187]],"properties":{"id":"24662703","dp":7760,"de":673}},{"type":"Polygon","arcs":[[6484,-6190,-6188,-6484,-6481]],"properties":{"id":"24662704","dp":18992,"de":1162}},{"type":"Polygon","arcs":[[6485,-4995,-237,-2863]],"properties":{"id":"24661348","dp":9008,"de":969}},{"type":"Polygon","arcs":[[-4989,-6486,-2864,6486,6487]],"properties":{"id":"24661349","dp":6533,"de":0}},{"type":"Polygon","arcs":[[-4990,-6488,6488,6489]],"properties":{"id":"24661350","dp":7350,"de":964}},{"type":"Polygon","arcs":[[-6489,-6487,-2862,6490,6491]],"properties":{"id":"24661351","dp":13397,"de":3406}},{"type":"Polygon","arcs":[[6492,6493,-6195,-6288,6494]],"properties":{"id":"24662708","dp":12607,"de":1745}},{"type":"Polygon","arcs":[[-6297,-6485,-6482,-6477,6495]],"properties":{"id":"24662709","dp":6141,"de":964}},{"type":"Polygon","arcs":[[-6295,-6496,-6476,6496,6497]],"properties":{"id":"24662710","dp":8015,"de":591}},{"type":"Polygon","arcs":[[6498,-6497,-6479,-6475,-6445,6499]],"properties":{"id":"24662711","dp":6504,"de":0}},{"type":"Polygon","arcs":[[-6299,-6498,-6499,6500,-6311,-6308]],"properties":{"id":"24662712","dp":6907,"de":488}},{"type":"Polygon","arcs":[[-6427,-6501,-6500,-6444,-6435,-6431]],"properties":{"id":"24662713","dp":7611,"de":830}},{"type":"Polygon","arcs":[[6501,6502,6503,-3570,6504,6505,6506]],"properties":{"id":"24662714","dp":4649,"de":584}},{"type":"Polygon","arcs":[[-6466,-6504,6507,6508,6509]],"properties":{"id":"24662715","dp":5495,"de":0}},{"type":"Polygon","arcs":[[6510,-6508,-6503,6511,6512]],"properties":{"id":"24662716","dp":9445,"de":2103}},{"type":"Polygon","arcs":[[6513,6514,6515,6516,-6511,6517,6518]],"properties":{"id":"24662717","dp":7157,"de":2793}},{"type":"Polygon","arcs":[[-6517,6519,6520,-6509]],"properties":{"id":"24662718","dp":23720,"de":0}},{"type":"Polygon","arcs":[[-6463,-6510,-6521,6521]],"properties":{"id":"24662719","dp":18764,"de":0}},{"type":"Polygon","arcs":[[-6464,-6522,-6520,-6516,6522]],"properties":{"id":"24662720","dp":7496,"de":2034}},{"type":"Polygon","arcs":[[-6455,-6523,6523,6524]],"properties":{"id":"24662721","dp":6829,"de":2325}},{"type":"Polygon","arcs":[[6525,-6456,-6525,6526,6527,6528]],"properties":{"id":"24662722","dp":8355,"de":2088}},{"type":"Polygon","arcs":[[6529,-6527,6530,6531,6532]],"properties":{"id":"24662723","dp":10122,"de":1573}},{"type":"Polygon","arcs":[[6533,6534,-6528,-6530,6535]],"properties":{"id":"24662724","dp":8763,"de":0}},{"type":"Polygon","arcs":[[-6353,6536,6537,-6536,-6533,6538,6539,-6360,-6357]],"properties":{"id":"24662725","dp":2056,"de":2765}},{"type":"Polygon","arcs":[[6540,-6534,-6538]],"properties":{"id":"24662726","dp":8689,"de":3564}},{"type":"Polygon","arcs":[[-6535,-6541,-6537,-6352,6541,6542,-6529]],"properties":{"id":"24662727","dp":5662,"de":3899}},{"type":"Polygon","arcs":[[-6439,6543,-6542,-6351]],"properties":{"id":"24662728","dp":11821,"de":5000}},{"type":"Polygon","arcs":[[-6443,-6457,-6526,-6543,-6544]],"properties":{"id":"24662729","dp":9927,"de":1989}},{"type":"Polygon","arcs":[[-5081,-5021,6544,6545,6546,-4786]],"properties":{"id":"24661383","dp":15167,"de":14087}},{"type":"Polygon","arcs":[[6547,-6546,6548,6549]],"properties":{"id":"24661384","dp":19614,"de":4958}},{"type":"Polygon","arcs":[[6550,6551,6552,-6550,6553,6554]],"properties":{"id":"24661385","dp":9100,"de":2507}},{"type":"Polygon","arcs":[[6555,-4871,-4714,-4867,6556,-6552]],"properties":{"id":"24661386","dp":5555,"de":3917}},{"type":"Polygon","arcs":[[-4869,6557,-6553,-6557]],"properties":{"id":"24661387","dp":18056,"de":0}},{"type":"Polygon","arcs":[[6558,6559,-6548,-6558]],"properties":{"id":"24661388","dp":17000,"de":3269}},{"type":"Polygon","arcs":[[6560,-6547,-6560,-4736]],"properties":{"id":"24661389","dp":14501,"de":9965}},{"type":"Polygon","arcs":[[-4743,6561,-4784,-6561]],"properties":{"id":"24661390","dp":15266,"de":12099}},{"type":"Polygon","arcs":[[-4744,6562,-4782,-6562]],"properties":{"id":"24661391","dp":21659,"de":4148}},{"type":"Polygon","arcs":[[-4748,-4754,-4779,-6563]],"properties":{"id":"24661392","dp":19071,"de":5696}},{"type":"Polygon","arcs":[[-4735,-4737,-6559,-4868]],"properties":{"id":"24661393","dp":24794,"de":3082}},{"type":"Polygon","arcs":[[-6280,-6397,6563,-5359,6564,6565,-6425]],"properties":{"id":"24662258","dp":1732,"de":233}},{"type":"Polygon","arcs":[[-6282,-6424,-6566,6566,6567,6568,-1515,-1523,-1530,-6384,-6276]],"properties":{"id":"24662259","dp":1941,"de":140}},{"type":"Polygon","arcs":[[-6565,6569,-6567]],"properties":{"id":"24662260","dp":3077,"de":1065}},{"type":"Polygon","arcs":[[-6570,-5363,6570,-6568]],"properties":{"id":"24662261","dp":6716,"de":1198}},{"type":"Polygon","arcs":[[-5362,-5357,-5354,-3066,-1508,-6569,-6571]],"properties":{"id":"24662262","dp":1256,"de":114}},{"type":"Polygon","arcs":[[-1503,-1510,-3065,6571,6572,6573]],"properties":{"id":"24662263","dp":1981,"de":926}},{"type":"Polygon","arcs":[[-3076,6574,6575,-6572,-3064]],"properties":{"id":"24662264","dp":2928,"de":0}},{"type":"Polygon","arcs":[[-6575,-3074,6576,6577]],"properties":{"id":"24662265","dp":2289,"de":357}},{"type":"Polygon","arcs":[[6578,6579,-6573,-6576,-6578,6580,6581]],"properties":{"id":"24662266","dp":1534,"de":696}},{"type":"Polygon","arcs":[[-6581,-6577,-3073,6582,6583,6584,6585,6586]],"properties":{"id":"24662267","dp":1532,"de":188}},{"type":"Polygon","arcs":[[-6579,6587,6588,6589]],"properties":{"id":"24662268","dp":2975,"de":0}},{"type":"Polygon","arcs":[[6590,-6586,6591,6592,-5393]],"properties":{"id":"24662269","dp":5171,"de":199}},{"type":"Polygon","arcs":[[-6593,6593,6594,-5394]],"properties":{"id":"24662270","dp":4907,"de":0}},{"type":"Polygon","arcs":[[-4859,-529,6595,-4848]],"properties":{"id":"24662614","dp":9881,"de":0}},{"type":"Polygon","arcs":[[-4888,-4825,-4842,-6596,-528,-532,-535,6596,-6408,-4694,-4886,-4884]],"properties":{"id":"24662615","dp":1551,"de":3919}},{"type":"Polygon","arcs":[[6597,6598,-6365,-6540]],"properties":{"id":"24662736","dp":13797,"de":0}},{"type":"Polygon","arcs":[[6599,6600,6601,-6599]],"properties":{"id":"24662737","dp":9680,"de":1600}},{"type":"Polygon","arcs":[[-6602,6602,6603,-6362,-6366]],"properties":{"id":"24662738","dp":8241,"de":0}},{"type":"Polygon","arcs":[[-6492,6604,6605,6606,-4720,-4724,6607,6608]],"properties":{"id":"24661352","dp":3119,"de":1795}},{"type":"Polygon","arcs":[[-6490,-6609,6609,6610]],"properties":{"id":"24661353","dp":18231,"de":3231}},{"type":"Polygon","arcs":[[-6610,-6608,-4723,6611]],"properties":{"id":"24661354","dp":19464,"de":5351}},{"type":"Polygon","arcs":[[-4991,-6611,-6612,6612,-4882]],"properties":{"id":"24661355","dp":6644,"de":6469}},{"type":"Polygon","arcs":[[-6613,-4725,-4689,6613]],"properties":{"id":"24661356","dp":9520,"de":2309}},{"type":"Polygon","arcs":[[-4883,-6614,-4688,-4874]],"properties":{"id":"24661357","dp":13662,"de":1298}},{"type":"Polygon","arcs":[[-5884,-5881,-4981,-5060,-5053]],"properties":{"id":"24663083","dp":3712,"de":0}},{"type":"Polygon","arcs":[[6614,6615,6616,6617,-6603]],"properties":{"id":"24662739","dp":6662,"de":1395}},{"type":"Polygon","arcs":[[-6618,6618,6619,6620,6621]],"properties":{"id":"24662740","dp":10030,"de":1739}},{"type":"Polygon","arcs":[[6622,6623,6624,6625,-6619,-6617]],"properties":{"id":"24662741","dp":10694,"de":0}},{"type":"Polygon","arcs":[[-6626,6626,6627,6628,-6620]],"properties":{"id":"24662742","dp":11025,"de":870}},{"type":"Polygon","arcs":[[-6628,6629,6630,6631,6632]],"properties":{"id":"24662743","dp":15439,"de":0}},{"type":"Polygon","arcs":[[6633,-6621,-6629,-6633,6634,6635]],"properties":{"id":"24662744","dp":9313,"de":1991}},{"type":"Polygon","arcs":[[6636,-6636,6637]],"properties":{"id":"24662745","dp":13688,"de":825}},{"type":"Polygon","arcs":[[6638,-6638,-6635,-6632,6639,6640]],"properties":{"id":"24662746","dp":7690,"de":3548}},{"type":"Polygon","arcs":[[-6631,6641,6642,6643,-6640]],"properties":{"id":"24662747","dp":22567,"de":1234}},{"type":"Polygon","arcs":[[6644,6645,6646,6647,-6643]],"properties":{"id":"24662748","dp":11504,"de":0}},{"type":"Polygon","arcs":[[6648,6649,6650,-6644,-6648,6651,6652,6653]],"properties":{"id":"24662749","dp":10243,"de":6707}},{"type":"Polygon","arcs":[[-6654,6654,6655,6656,6657]],"properties":{"id":"24662750","dp":12246,"de":0}},{"type":"Polygon","arcs":[[-6649,-6658,6658,6659,6660]],"properties":{"id":"24662751","dp":13468,"de":0}},{"type":"Polygon","arcs":[[-6657,6661,6662,-6659]],"properties":{"id":"24662752","dp":12830,"de":0}},{"type":"Polygon","arcs":[[6663,6664,6665,-6660,-6663,6666,6667,6668]],"properties":{"id":"24662753","dp":4003,"de":2306}},{"type":"Polygon","arcs":[[-6669,6669,6670,6671,6672,6673,6674]],"properties":{"id":"24662754","dp":12857,"de":0}},{"type":"Polygon","arcs":[[6675,-6672,6676,6677]],"properties":{"id":"24662755","dp":12687,"de":0}},{"type":"Polygon","arcs":[[-6673,-6676,6678,6679,6680]],"properties":{"id":"24662756","dp":18873,"de":0}},{"type":"Polygon","arcs":[[6681,-6674,-6681,6682,6683]],"properties":{"id":"24662757","dp":15235,"de":0}},{"type":"Polygon","arcs":[[6684,-6664,-6675,-6682,6685]],"properties":{"id":"24662758","dp":13365,"de":1282}},{"type":"Polygon","arcs":[[6686,-6686,6687]],"properties":{"id":"24662759","dp":10279,"de":0}},{"type":"Polygon","arcs":[[-6688,-6684,6688,6689,6690]],"properties":{"id":"24662760","dp":17013,"de":767}},{"type":"Polygon","arcs":[[-6689,6691]],"properties":{"id":"24662761","dp":22232,"de":0}},{"type":"Polygon","arcs":[[6692,6693,-5023,-5080,-5083,6694]],"properties":{"id":"24661417","dp":13624,"de":7969}},{"type":"Polygon","arcs":[[-5794,6695,-5024,-6694]],"properties":{"id":"24661418","dp":14488,"de":4444}},{"type":"Polygon","arcs":[[-5020,-5025,-6696,-5793,-5013]],"properties":{"id":"24661419","dp":30000,"de":0}},{"type":"Polygon","arcs":[[-5082,6696,6697,-6695]],"properties":{"id":"24661420","dp":16448,"de":3877}},{"type":"Polygon","arcs":[[-5084,6698,6699,-6697]],"properties":{"id":"24661421","dp":17083,"de":3030}},{"type":"Polygon","arcs":[[-6699,-5074,6700,6701]],"properties":{"id":"24661422","dp":12876,"de":24315}},{"type":"Polygon","arcs":[[6702,-6701,-5069,6703,6704]],"properties":{"id":"24661423","dp":19588,"de":9264}},{"type":"Polygon","arcs":[[-6704,-5068,6705]],"properties":{"id":"24661424","dp":16603,"de":1904}},{"type":"Polygon","arcs":[[-6705,-6706,-5064,-5482,6706,-5483,6707,6708,6709]],"properties":{"id":"24661425","dp":10108,"de":8276}},{"type":"Polygon","arcs":[[6710,6711,6712,6713,6714]],"properties":{"id":"24662858","dp":6699,"de":1150}},{"type":"Polygon","arcs":[[-6714,6715,6716,6717]],"properties":{"id":"24662859","dp":6916,"de":967}},{"type":"Polygon","arcs":[[-6713,6718,6719,6720,6721,-6716]],"properties":{"id":"24662860","dp":8429,"de":0}},{"type":"Polygon","arcs":[[6722,-2095,-2099,6723,-6719]],"properties":{"id":"24662861","dp":5689,"de":438}},{"type":"Polygon","arcs":[[-2098,6724,6725,-6720,-6724]],"properties":{"id":"24662862","dp":4585,"de":308}},{"type":"Polygon","arcs":[[-2102,6726,6727,6728,-6725]],"properties":{"id":"24662863","dp":13131,"de":0}},{"type":"Polygon","arcs":[[-6726,-6729,6729,6730,-6721]],"properties":{"id":"24662864","dp":7819,"de":0}},{"type":"Polygon","arcs":[[6731,6732,6733,6734,-6730]],"properties":{"id":"24662865","dp":5207,"de":0}},{"type":"Polygon","arcs":[[6735,6736,-6733]],"properties":{"id":"24662866","dp":4979,"de":0}},{"type":"Polygon","arcs":[[-6728,6737,6738,6739,-6736,-6732]],"properties":{"id":"24662867","dp":4831,"de":0}},{"type":"Polygon","arcs":[[6740,-6739,6741]],"properties":{"id":"24662868","dp":3710,"de":0}},{"type":"Polygon","arcs":[[6742,6743,-5257,6744]],"properties":{"id":"24663113","dp":1103,"de":305}},{"type":"Polygon","arcs":[[-2072,-2083,6745,6746,6747,-868,-2069]],"properties":{"id":"24662830","dp":4737,"de":0}},{"type":"Polygon","arcs":[[6748,-6747,6749,6750]],"properties":{"id":"24662831","dp":5663,"de":0}},{"type":"Polygon","arcs":[[6751,-6751,6752,6753]],"properties":{"id":"24662832","dp":5790,"de":0}},{"type":"Polygon","arcs":[[6754,-6753,-6750,-6746,6755,6756]],"properties":{"id":"24662833","dp":8438,"de":0}},{"type":"Polygon","arcs":[[-2082,-2085,6757,6758,-6756]],"properties":{"id":"24662834","dp":13589,"de":0}},{"type":"Polygon","arcs":[[6759,-6757,-6759,6760,6761,6762]],"properties":{"id":"24662835","dp":6318,"de":803}},{"type":"Polygon","arcs":[[-6727,-2101,-2066,6763,-6742,-6738]],"properties":{"id":"24662869","dp":2880,"de":2304}},{"type":"Polygon","arcs":[[-2065,-2070,-873,6764,-888,-6734,-6737,-6740,-6741,-6764]],"properties":{"id":"24662870","dp":2654,"de":333}},{"type":"Polygon","arcs":[[6765,6766,6767,6768]],"properties":{"id":"24661557","dp":13272,"de":0}},{"type":"Polygon","arcs":[[6769,6770,6771,-6767]],"properties":{"id":"24661558","dp":24042,"de":2836}},{"type":"Polygon","arcs":[[6772,6773,-6771,6774]],"properties":{"id":"24661559","dp":24840,"de":0}},{"type":"Polygon","arcs":[[-6772,6775,6776,6777,6778,-6768]],"properties":{"id":"24661560","dp":18750,"de":2138}},{"type":"Polygon","arcs":[[6779,6780,-6777]],"properties":{"id":"24661561","dp":25255,"de":0}},{"type":"Polygon","arcs":[[6781,-6778,-6781,6782]],"properties":{"id":"24661562","dp":29653,"de":0}},{"type":"Polygon","arcs":[[6783,-6782,6784,6785,-5563,6786,6787,6788]],"properties":{"id":"24661563","dp":18218,"de":0}},{"type":"Polygon","arcs":[[6789,6790,-6785,-6783,-6780]],"properties":{"id":"24661564","dp":32313,"de":2313}},{"type":"Polygon","arcs":[[-6774,6791,-6790,-6776]],"properties":{"id":"24661566","dp":48333,"de":0}},{"type":"Polygon","arcs":[[6792,6793,6794,6795,6796,6797,6798,-3551,-5564,-6786,-6791,-6792,-6773]],"properties":{"id":"24661567","dp":1490,"de":5112}},{"type":"Polygon","arcs":[[6799,-6798,6800,6801]],"properties":{"id":"24661568","dp":2638,"de":303}},{"type":"Polygon","arcs":[[6802,-6801,-6797,6803]],"properties":{"id":"24661569","dp":2676,"de":254}},{"type":"Polygon","arcs":[[6804,6805,6806,6807,6808,6809,6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820]],"properties":{"id":"24662942","dp":540,"de":977}},{"type":"Polygon","arcs":[[6821,6822,6823,-6811]],"properties":{"id":"24662943","dp":5099,"de":0}},{"type":"Polygon","arcs":[[6824,6825,-6812,-6824]],"properties":{"id":"24662944","dp":5075,"de":0}},{"type":"Polygon","arcs":[[-6826,-6813]],"properties":{"id":"24662945","dp":7296,"de":0}},{"type":"Polygon","arcs":[[-6823,6826,6827,6828,-6814,-6825]],"properties":{"id":"24662946","dp":5824,"de":0}},{"type":"Polygon","arcs":[[-909,-890,6829,6830,-6828,6831]],"properties":{"id":"24662947","dp":2837,"de":439}},{"type":"Polygon","arcs":[[6832,6833,6834,-1466]],"properties":{"id":"24661672","dp":11859,"de":2743}},{"type":"Polygon","arcs":[[6835,-5436]],"properties":{"id":"24663161","dp":3638,"de":0}},{"type":"Polygon","arcs":[[-6836,-5435]],"properties":{"id":"24663162","dp":3481,"de":0}},{"type":"Polygon","arcs":[[-5656,-5664,6836,6837,6838,-5631,-5639,-5439]],"properties":{"id":"24663050","dp":1456,"de":2365}},{"type":"Polygon","arcs":[[-6839,6839,6840,-5618,-5632]],"properties":{"id":"24663051","dp":4317,"de":469}},{"type":"Polygon","arcs":[[-6841,6841,-5619]],"properties":{"id":"24663052","dp":2500,"de":0}},{"type":"MultiPolygon","arcs":[[[-6840,-6838,6842,6843,-5609,-5620,-6842]],[[6844]]],"properties":{"id":"24663053","dp":4247,"de":273}},{"type":"Polygon","arcs":[[6845,6846,-6623,-6616]],"properties":{"id":"24662802","dp":9247,"de":0}},{"type":"Polygon","arcs":[[6847,6848,6849,-6624,-6847]],"properties":{"id":"24662803","dp":9469,"de":0}},{"type":"Polygon","arcs":[[6850,-6514,6851,6852,-6615,-6601]],"properties":{"id":"24662804","dp":8281,"de":1615}},{"type":"Polygon","arcs":[[-6524,-6515,-6851,-6600,6853,-6531]],"properties":{"id":"24662805","dp":6032,"de":2526}},{"type":"Polygon","arcs":[[-6532,-6854,-6598,-6539]],"properties":{"id":"24662806","dp":14884,"de":1156}},{"type":"Polygon","arcs":[[6854,6855,6856,6857,6858,6859]],"properties":{"id":"24662807","dp":4530,"de":729}},{"type":"Polygon","arcs":[[6860,6861,6862,6863,-6860]],"properties":{"id":"24662808","dp":6016,"de":0}},{"type":"Polygon","arcs":[[6864,-6861,-6859,6865,6866]],"properties":{"id":"24662809","dp":3980,"de":717}},{"type":"Polygon","arcs":[[6867,-6866,6868,6869,6870]],"properties":{"id":"24662810","dp":3325,"de":1836}},{"type":"Polygon","arcs":[[-6870,6871,6872,6873]],"properties":{"id":"24662811","dp":6633,"de":685}},{"type":"Polygon","arcs":[[-6873,6874,6875,6876]],"properties":{"id":"24662812","dp":5492,"de":2710}},{"type":"Polygon","arcs":[[-6876,6877,-3560,6878,6879]],"properties":{"id":"24662813","dp":12181,"de":3454}},{"type":"Polygon","arcs":[[6880,-6877,-6880,6881,6882]],"properties":{"id":"24662814","dp":19191,"de":0}},{"type":"Polygon","arcs":[[6883,-6883,6884,6885,6886,6887,6888]],"properties":{"id":"24662815","dp":23152,"de":0}},{"type":"Polygon","arcs":[[6889,6890,6891,-6885,6892]],"properties":{"id":"24662816","dp":18819,"de":0}},{"type":"Polygon","arcs":[[6893,-6893,-6882,-6879,-3563,-3580]],"properties":{"id":"24662817","dp":3026,"de":2098}},{"type":"Polygon","arcs":[[-6858,6894,6895,-3561,-6878,-6875,-6872,-6869]],"properties":{"id":"24662819","dp":8716,"de":591}},{"type":"MultiPolygon","arcs":[[[-883,6896,6897,6898,-6896,6899,-871,-878]],[[6900]],[[6901]]],"properties":{"id":"24662821","dp":5191,"de":857}},{"type":"Polygon","arcs":[[6902,6903,-4241,6904,6905]],"properties":{"id":"24661485","dp":7704,"de":1130}},{"type":"Polygon","arcs":[[-3183,-2294,-6905,-4245,-1903,-3190]],"properties":{"id":"24661486","dp":12156,"de":3317}},{"type":"Polygon","arcs":[[6906,6907,-4242,-6904]],"properties":{"id":"24661487","dp":18454,"de":0}},{"type":"Polygon","arcs":[[6908,-6907,6909]],"properties":{"id":"24661488","dp":9503,"de":793}},{"type":"Polygon","arcs":[[6910,6911,-4259,-4251,-4250,-4246,-4243,-6908,-6909]],"properties":{"id":"24661489","dp":7408,"de":0}},{"type":"Polygon","arcs":[[6912,-4256,-6912,6913,6914]],"properties":{"id":"24661490","dp":11955,"de":0}},{"type":"Polygon","arcs":[[6915,-4262,-6913,6916]],"properties":{"id":"24661491","dp":5716,"de":1286}},{"type":"Polygon","arcs":[[6917,6918,-4270,-6916]],"properties":{"id":"24661492","dp":14933,"de":3833}},{"type":"Polygon","arcs":[[6919,-6762,6920,6921]],"properties":{"id":"24662836","dp":7163,"de":1242}},{"type":"Polygon","arcs":[[6922,-6763,-6920,6923]],"properties":{"id":"24662837","dp":6030,"de":0}},{"type":"Polygon","arcs":[[6924,6925,-6924]],"properties":{"id":"24662838","dp":3175,"de":0}},{"type":"Polygon","arcs":[[-3576,6926,6927,-6925,-6922,6928,6929]],"properties":{"id":"24662839","dp":1409,"de":1983}},{"type":"Polygon","arcs":[[6930,6931,6932,-6927]],"properties":{"id":"24662840","dp":9553,"de":0}},{"type":"Polygon","arcs":[[6933,6934,-6928,-6933,6935,6936,6937]],"properties":{"id":"24662841","dp":4500,"de":1416}},{"type":"Polygon","arcs":[[-6934,6938,6939]],"properties":{"id":"24662842","dp":9608,"de":0}},{"type":"Polygon","arcs":[[-6754,-6755,-6760,-6923,-6926,-6935,-6940,6940]],"properties":{"id":"24662843","dp":3677,"de":1180}},{"type":"Polygon","arcs":[[-6936,-6932,6941,6942,6943]],"properties":{"id":"24662844","dp":3318,"de":0}},{"type":"Polygon","arcs":[[6944,-6942,-6931,-3584]],"properties":{"id":"24662845","dp":5077,"de":0}},{"type":"Polygon","arcs":[[-3562,-6899,6945,-3581]],"properties":{"id":"24662848","dp":7466,"de":0}},{"type":"Polygon","arcs":[[6946,6947,6948,6949]],"properties":{"id":"24661519","dp":14224,"de":4176}},{"type":"Polygon","arcs":[[6950,6951,6952,6953,6954,-6947]],"properties":{"id":"24661520","dp":8110,"de":5381}},{"type":"Polygon","arcs":[[-3686,-4307,6955,6956,6957,-6948,-6955,6958]],"properties":{"id":"24661521","dp":7769,"de":14124}},{"type":"Polygon","arcs":[[6959,6960,-3390,-3687,-6959,6961]],"properties":{"id":"24661522","dp":9824,"de":6955}},{"type":"Polygon","arcs":[[6962,6963,6964,-6960,6965]],"properties":{"id":"24661523","dp":20044,"de":13053}},{"type":"Polygon","arcs":[[6966,6967,6968,6969,-6964,6970]],"properties":{"id":"24661524","dp":14770,"de":5045}},{"type":"Polygon","arcs":[[6971,6972,6973,6974,6975,-6968,6976,6977]],"properties":{"id":"24661525","dp":16561,"de":4731}},{"type":"Polygon","arcs":[[6978,6979,-6977,6980]],"properties":{"id":"24661526","dp":19583,"de":2604}},{"type":"Polygon","arcs":[[6981,6982,-6978,-6980]],"properties":{"id":"24661527","dp":21813,"de":0}},{"type":"Polygon","arcs":[[6983,6984,-6972,-6983]],"properties":{"id":"24661528","dp":27283,"de":2890}},{"type":"Polygon","arcs":[[6985,6986,-6985]],"properties":{"id":"24661529","dp":24125,"de":5312}},{"type":"Polygon","arcs":[[-6607,6987,6988,-6986,-6984,-6982,-6979,6989,-4721]],"properties":{"id":"24661530","dp":6718,"de":3696}},{"type":"Polygon","arcs":[[6990,6991,6992,-6973,-6987,-6989]],"properties":{"id":"24661531","dp":20208,"de":5555}},{"type":"Polygon","arcs":[[6993,6994,-3783,6995]],"properties":{"id":"24662928","dp":4422,"de":402}},{"type":"Polygon","arcs":[[6996,6997,-6994,6998,6999,7000]],"properties":{"id":"24662929","dp":3719,"de":5212}},{"type":"Polygon","arcs":[[-6995,-6998,7001,7002,-3778]],"properties":{"id":"24662930","dp":4861,"de":0}},{"type":"Polygon","arcs":[[-3779,-7003,7003,7004]],"properties":{"id":"24662931","dp":3678,"de":0}},{"type":"Polygon","arcs":[[-3657,-7005,7005,-3636,-3641,-3654]],"properties":{"id":"24662932","dp":6625,"de":0}},{"type":"Polygon","arcs":[[-6835,7006,-2256,7007,7008,7009]],"properties":{"id":"24661673","dp":15104,"de":2022}},{"type":"Polygon","arcs":[[7010,-7008,-2259,-2253,7011,-1390]],"properties":{"id":"24661674","dp":12972,"de":1380}},{"type":"Polygon","arcs":[[-1391,-7012,-3585,7012]],"properties":{"id":"24661675","dp":11932,"de":0}},{"type":"Polygon","arcs":[[-1440,-7013,-2250,7013]],"properties":{"id":"24661676","dp":18614,"de":2164}},{"type":"Polygon","arcs":[[-1441,-7014,-2252,7014]],"properties":{"id":"24661677","dp":17160,"de":0}},{"type":"Polygon","arcs":[[-1442,-7015,-2245,7015]],"properties":{"id":"24661678","dp":7049,"de":0}},{"type":"Polygon","arcs":[[-1443,-7016,-2249,-2241,7016]],"properties":{"id":"24661679","dp":3646,"de":0}},{"type":"Polygon","arcs":[[-7017,-2244,7017,-1445]],"properties":{"id":"24661680","dp":13592,"de":1219}},{"type":"Polygon","arcs":[[-7018,7018,7019,-1448]],"properties":{"id":"24661681","dp":11264,"de":1340}},{"type":"Polygon","arcs":[[-7020,7020,-1534,7021,7022]],"properties":{"id":"24661682","dp":5823,"de":608}},{"type":"Polygon","arcs":[[-1449,-7023,7023,7024]],"properties":{"id":"24661683","dp":10484,"de":2222}},{"type":"Polygon","arcs":[[-7024,-7022,7025,7026]],"properties":{"id":"24661684","dp":12403,"de":0}},{"type":"Polygon","arcs":[[-7026,-1537,7027,7028]],"properties":{"id":"24661685","dp":14946,"de":0}},{"type":"Polygon","arcs":[[-1450,-7025,-7027,-7029,7029,7030]],"properties":{"id":"24661686","dp":6037,"de":1596}},{"type":"Polygon","arcs":[[-7030,-7028,7031,7032,7033,-3491]],"properties":{"id":"24661687","dp":8422,"de":0}},{"type":"Polygon","arcs":[[-7034,7034,-1750,-3833,-3492]],"properties":{"id":"24661688","dp":3666,"de":1681}},{"type":"Polygon","arcs":[[-7033,7035,-7035]],"properties":{"id":"24661689","dp":11156,"de":0}},{"type":"Polygon","arcs":[[-1536,-1736,-1742,-1746,-7036,-7032]],"properties":{"id":"24661690","dp":4255,"de":2097}},{"type":"Polygon","arcs":[[7036,-3149,-3097,-3096,-3092,7037,-3084,-3077,-4954]],"properties":{"id":"24663054","dp":1808,"de":386}},{"type":"Polygon","arcs":[[-7038,-3094,-3087,7038,-3085]],"properties":{"id":"24663055","dp":2806,"de":0}},{"type":"Polygon","arcs":[[-3091,-3079,-3086,-7039]],"properties":{"id":"24663056","dp":3577,"de":0}},{"type":"Polygon","arcs":[[7039,7040,7041,7042,-5830]],"properties":{"id":"24661826","dp":17040,"de":3582}},{"type":"Polygon","arcs":[[-5109,7043,7044,-7042,7045]],"properties":{"id":"24661827","dp":5877,"de":1779}},{"type":"Polygon","arcs":[[-5110,-7046,-7041,7046]],"properties":{"id":"24661828","dp":14654,"de":4608}},{"type":"Polygon","arcs":[[7047,-7047,-7040,-5826,-5807,-5811,-5813]],"properties":{"id":"24661829","dp":11941,"de":5036}},{"type":"Polygon","arcs":[[7048,-5104,-5106,-7048,-5816,-5818]],"properties":{"id":"24661830","dp":13383,"de":6565}},{"type":"Polygon","arcs":[[-5492,-5486,7049,-5101,-7049,-5817]],"properties":{"id":"24661831","dp":14793,"de":3793}},{"type":"Polygon","arcs":[[7050,-5099,-7050,-5485]],"properties":{"id":"24661832","dp":19090,"de":3846}},{"type":"Polygon","arcs":[[-5484,-6707,-5481,-5100,-7051]],"properties":{"id":"24661833","dp":12399,"de":12526}},{"type":"Polygon","arcs":[[7051,7052,7053,7054,7055]],"properties":{"id":"24661457","dp":18027,"de":2916}},{"type":"Polygon","arcs":[[7056,7057,-7052]],"properties":{"id":"24661458","dp":18820,"de":3589}},{"type":"Polygon","arcs":[[7058,7059,-7058,7060]],"properties":{"id":"24661459","dp":16330,"de":4357}},{"type":"Polygon","arcs":[[7061,7062,-7053,-7060]],"properties":{"id":"24661460","dp":13878,"de":2803}},{"type":"Polygon","arcs":[[-7054,-7063,7063,7064,7065,7066]],"properties":{"id":"24661461","dp":17252,"de":2266}},{"type":"Polygon","arcs":[[7067,7068,-7066,7069]],"properties":{"id":"24661462","dp":14907,"de":2314}},{"type":"Polygon","arcs":[[-7068,7070,7071,7072,7073,7074]],"properties":{"id":"24661463","dp":11728,"de":6558}},{"type":"Polygon","arcs":[[-7074,7075,7076,7077,7078]],"properties":{"id":"24661464","dp":10497,"de":5231}},{"type":"Polygon","arcs":[[7079,7080,-7076,-7073]],"properties":{"id":"24661465","dp":12769,"de":1798}},{"type":"Polygon","arcs":[[-7081,7081,7082,7083,7084,-7077]],"properties":{"id":"24661466","dp":8604,"de":9660}},{"type":"Polygon","arcs":[[-7085,7085,7086,7087]],"properties":{"id":"24661467","dp":10199,"de":8890}},{"type":"Polygon","arcs":[[7088,7089,7090,-480,-486,-487,-497,7091,7092,7093,7094,7095,-6806,7096]],"properties":{"id":"24662905","dp":72,"de":354}},{"type":"Polygon","arcs":[[7097,7098,7099,-1400,-4665,-1396,-1405,7100,-7093]],"properties":{"id":"24662906","dp":853,"de":110}},{"type":"Polygon","arcs":[[7101,-4666,-1401,-7100]],"properties":{"id":"24662907","dp":5283,"de":0}},{"type":"Polygon","arcs":[[-683,-4664,-7102,-7099,7102]],"properties":{"id":"24662908","dp":18464,"de":0}},{"type":"Polygon","arcs":[[-3925,7103,-667,-670,-672,-676,-684,-7103,-7098,-7092,-496,-3921]],"properties":{"id":"24662909","dp":5218,"de":1097}},{"type":"Polygon","arcs":[[-656,-658,-668,-7104,-3924,-3928,-3931]],"properties":{"id":"24662910","dp":11536,"de":1696}},{"type":"Polygon","arcs":[[7104,-7089,7105,7106,7107]],"properties":{"id":"24662911","dp":1531,"de":846}},{"type":"Polygon","arcs":[[-7090,-7105,7108,7109,7110]],"properties":{"id":"24662912","dp":6269,"de":0}},{"type":"Polygon","arcs":[[-7109,7111,7112]],"properties":{"id":"24662913","dp":5594,"de":0}},{"type":"Polygon","arcs":[[7113,-7110,-7113,7114,-1159,-465,-468,-471]],"properties":{"id":"24662914","dp":4598,"de":655}},{"type":"Polygon","arcs":[[-7091,-7111,-7114,-470,-477]],"properties":{"id":"24662915","dp":6083,"de":979}},{"type":"Polygon","arcs":[[7115,7116,7117,-7115,-7112,-7108]],"properties":{"id":"24662916","dp":3201,"de":2302}},{"type":"Polygon","arcs":[[-1160,-7118,7118,7119,-1143,-1150,-1156]],"properties":{"id":"24662917","dp":3547,"de":1924}},{"type":"Polygon","arcs":[[7120,-7119,-7117,7121]],"properties":{"id":"24662918","dp":8833,"de":0}},{"type":"Polygon","arcs":[[7122,7123,7124,-4409,-3129,7125,-3559,-4492,-5573,-5566]],"properties":{"id":"24661603","dp":307,"de":4543}},{"type":"Polygon","arcs":[[-7126,-3128,7126,-3555]],"properties":{"id":"24661606","dp":27500,"de":0}},{"type":"Polygon","arcs":[[-7127,-3127,-4500,-3556]],"properties":{"id":"24661609","dp":18665,"de":0}},{"type":"Polygon","arcs":[[-4289,-3476,-4288,-595,-584,-5569]],"properties":{"id":"24661611","dp":7078,"de":5486}},{"type":"Polygon","arcs":[[7127,7128,7129,7130,-6787,-5570,-4206]],"properties":{"id":"24661614","dp":11031,"de":0}},{"type":"Polygon","arcs":[[7131,7132,-6788,-7131]],"properties":{"id":"24661615","dp":32801,"de":0}},{"type":"Polygon","arcs":[[7133,-6789,-7133]],"properties":{"id":"24661616","dp":27903,"de":3493}},{"type":"Polygon","arcs":[[7134,7135,-7130,7136]],"properties":{"id":"24661617","dp":18058,"de":0}},{"type":"Polygon","arcs":[[7137,-7137,-7129,7138]],"properties":{"id":"24661618","dp":27520,"de":1377}},{"type":"Polygon","arcs":[[-2940,-918,7139,7140,-4457]],"properties":{"id":"24661619","dp":4711,"de":1334}},{"type":"Polygon","arcs":[[-7004,-7002,7141,7142,-3635,-7006]],"properties":{"id":"24662933","dp":1588,"de":2410}},{"type":"Polygon","arcs":[[7143,7144,7145,-7143]],"properties":{"id":"24662934","dp":2106,"de":0}},{"type":"Polygon","arcs":[[7146,-1127,-3623,-3629,-3465,-3632,-7146]],"properties":{"id":"24662935","dp":982,"de":375}},{"type":"Polygon","arcs":[[7147,7148,7149,7150]],"properties":{"id":"24661636","dp":10835,"de":1284}},{"type":"Polygon","arcs":[[7151,7152,7153,-7148]],"properties":{"id":"24661637","dp":10254,"de":5090}},{"type":"Polygon","arcs":[[7154,7155,-7153,7156]],"properties":{"id":"24661638","dp":14758,"de":0}},{"type":"Polygon","arcs":[[7157,7158,7159,-7155,7160,7161]],"properties":{"id":"24661639","dp":10641,"de":2540}},{"type":"Polygon","arcs":[[7162,7163,7164,-7158,7165]],"properties":{"id":"24661640","dp":16422,"de":4743}},{"type":"Polygon","arcs":[[7166,7167,7168,-7163,7169,7170]],"properties":{"id":"24661641","dp":13275,"de":3658}},{"type":"Polygon","arcs":[[7171,7172,-7167,7173]],"properties":{"id":"24661642","dp":14177,"de":1973}},{"type":"Polygon","arcs":[[7174,7175,7176,-7172]],"properties":{"id":"24661643","dp":14590,"de":1803}},{"type":"Polygon","arcs":[[7177,7178,7179,-7176]],"properties":{"id":"24661644","dp":15390,"de":1950}},{"type":"Polygon","arcs":[[-7087,7180,-7179,7181]],"properties":{"id":"24661645","dp":19844,"de":3115}},{"type":"Polygon","arcs":[[7182,-7182,7183,7184]],"properties":{"id":"24661646","dp":11585,"de":2743}},{"type":"Polygon","arcs":[[-7078,-7088,-7183,7185]],"properties":{"id":"24661647","dp":12103,"de":5469}},{"type":"Polygon","arcs":[[7186,-7184,-7178,7187]],"properties":{"id":"24661648","dp":15555,"de":2083}},{"type":"Polygon","arcs":[[7188,-7188,-7175,7189]],"properties":{"id":"24661649","dp":13627,"de":6372}},{"type":"Polygon","arcs":[[-7190,-7174,7190,7191]],"properties":{"id":"24661650","dp":14983,"de":2786}},{"type":"Polygon","arcs":[[-7191,-7171,7192,7193]],"properties":{"id":"24661651","dp":16678,"de":1384}},{"type":"Polygon","arcs":[[-7193,-7170,7194,7195]],"properties":{"id":"24661652","dp":13893,"de":2666}},{"type":"Polygon","arcs":[[-7195,-7166,7196,7197,7198]],"properties":{"id":"24661653","dp":11914,"de":3710}},{"type":"Polygon","arcs":[[-7197,-7162,7199,7200,7201]],"properties":{"id":"24661654","dp":15430,"de":2049}},{"type":"Polygon","arcs":[[-7200,-7161,7202,7203]],"properties":{"id":"24661655","dp":15183,"de":0}},{"type":"Polygon","arcs":[[-1501,-7203,-7157,7204]],"properties":{"id":"24661656","dp":13046,"de":1562}},{"type":"Polygon","arcs":[[-7205,-7152,7205,-1497]],"properties":{"id":"24661657","dp":14362,"de":2684}},{"type":"Polygon","arcs":[[-7206,-7151,7206,-1492]],"properties":{"id":"24661658","dp":11503,"de":2534}},{"type":"Polygon","arcs":[[-7207,7207,7208,7209,-5762,-5760]],"properties":{"id":"24661659","dp":9249,"de":1657}},{"type":"Polygon","arcs":[[-7084,7210,7211,7212,-7086]],"properties":{"id":"24661468","dp":8863,"de":7410}},{"type":"Polygon","arcs":[[7213,7214,-7181,-7213]],"properties":{"id":"24661469","dp":14171,"de":4294}},{"type":"Polygon","arcs":[[-7180,-7215,7215,7216]],"properties":{"id":"24661470","dp":13006,"de":2972}},{"type":"Polygon","arcs":[[-7177,-7217,7217,7218]],"properties":{"id":"24661471","dp":12579,"de":3184}},{"type":"Polygon","arcs":[[-7219,7219,7220,-7173]],"properties":{"id":"24661472","dp":12709,"de":2580}},{"type":"Polygon","arcs":[[-7221,7221,7222,-7168]],"properties":{"id":"24661473","dp":9940,"de":6804}},{"type":"Polygon","arcs":[[-7169,-7223,7223,7224]],"properties":{"id":"24661474","dp":14274,"de":2745}},{"type":"Polygon","arcs":[[-7164,-7225,7225,7226]],"properties":{"id":"24661475","dp":13307,"de":3149}},{"type":"Polygon","arcs":[[-7165,-7227,7227,7228]],"properties":{"id":"24661476","dp":13065,"de":0}},{"type":"Polygon","arcs":[[-7229,7229,7230,7231,-7159]],"properties":{"id":"24661477","dp":14345,"de":2182}},{"type":"Polygon","arcs":[[-7232,7232,7233,-7160]],"properties":{"id":"24661478","dp":16908,"de":4389}},{"type":"Polygon","arcs":[[-7234,7234,-6918,7235,-7154,-7156]],"properties":{"id":"24661479","dp":14762,"de":1939}},{"type":"Polygon","arcs":[[-7149,-7236,-6917,7236,7237]],"properties":{"id":"24661480","dp":8243,"de":3399}},{"type":"Polygon","arcs":[[7238,-7237,-6915,7239,7240]],"properties":{"id":"24661481","dp":12135,"de":1941}},{"type":"Polygon","arcs":[[7241,-7240,-6914,-6911,7242,7243]],"properties":{"id":"24661482","dp":12693,"de":2552}},{"type":"Polygon","arcs":[[-7244,7244,7245,7246,7247]],"properties":{"id":"24661483","dp":8645,"de":1181}},{"type":"Polygon","arcs":[[-7243,-6910,-6903,-7245]],"properties":{"id":"24661484","dp":11379,"de":1819}},{"type":"Polygon","arcs":[[-5114,-5120,-5126,7248,7249,7250,-7044,-5108]],"properties":{"id":"24661966","dp":7873,"de":3232}},{"type":"Polygon","arcs":[[7251,7252,7253,7254,7255,-7251,7256,7257,7258,-7198,7259]],"properties":{"id":"24661967","dp":3177,"de":3564}},{"type":"Polygon","arcs":[[-7252,7260,7261,7262,7263]],"properties":{"id":"24661968","dp":13015,"de":2763}},{"type":"Polygon","arcs":[[7264,-7263,7265,7266,7267]],"properties":{"id":"24661969","dp":18865,"de":2835}},{"type":"Polygon","arcs":[[-7254,7268,-7268,7269,7270,7271,7272]],"properties":{"id":"24661970","dp":11617,"de":5024}},{"type":"Polygon","arcs":[[7273,-7270,-7267,-1502,-1495,-5753]],"properties":{"id":"24661971","dp":13829,"de":4255}},{"type":"Polygon","arcs":[[-6745,-5256,-5250,-5246,-5240,7274]],"properties":{"id":"24663114","dp":1217,"de":108}},{"type":"Polygon","arcs":[[7275,-5254,7276,7277,-6743,-7275,-5239,7278]],"properties":{"id":"24663115","dp":693,"de":123}},{"type":"Polygon","arcs":[[7279,7280,7281,-6414,-6412]],"properties":{"id":"24662579","dp":7222,"de":3378}},{"type":"Polygon","arcs":[[7282,7283,7284,-7280,-6411,7285]],"properties":{"id":"24662580","dp":8328,"de":3391}},{"type":"Polygon","arcs":[[-547,7286,-7283,7287]],"properties":{"id":"24662581","dp":11340,"de":1250}},{"type":"Polygon","arcs":[[-2357,7288,7289,7290,-7284,-7287]],"properties":{"id":"24662582","dp":10340,"de":2086}},{"type":"Polygon","arcs":[[-548,-7288,-7286,-6410,7291]],"properties":{"id":"24662583","dp":6255,"de":755}},{"type":"Polygon","arcs":[[-538,-7292,-6409,-6597]],"properties":{"id":"24662584","dp":9332,"de":1824}},{"type":"Polygon","arcs":[[-6364,7292,-6637,-6639,7293,7294,-1651,-3588]],"properties":{"id":"24662967","dp":1778,"de":3217}},{"type":"Polygon","arcs":[[-6363,-6604,-6622,-6634,-7293]],"properties":{"id":"24662968","dp":7128,"de":0}},{"type":"Polygon","arcs":[[-1216,7295,-1629,-1633,-1637,-1641,-1647,-1652,7296,-1624]],"properties":{"id":"24662969","dp":657,"de":2500}},{"type":"Polygon","arcs":[[-1630,-7296,-1215,-1429]],"properties":{"id":"24662970","dp":11054,"de":1318}},{"type":"Polygon","arcs":[[7297,7298,-6305,-6426,-6345,7299]],"properties":{"id":"24662971","dp":9022,"de":0}},{"type":"Polygon","arcs":[[-1828,-4920,-4922,-4924,-4925,-4927,7300,-4932,7301]],"properties":{"id":"24662972","dp":4122,"de":3140}},{"type":"Polygon","arcs":[[-7302,-4931,-7300,-1829]],"properties":{"id":"24662973","dp":6364,"de":1612}},{"type":"Polygon","arcs":[[7302,7303,7304,-7298,-4930]],"properties":{"id":"24662974","dp":9606,"de":0}},{"type":"Polygon","arcs":[[7305,7306,7307,-7304]],"properties":{"id":"24662975","dp":11605,"de":0}},{"type":"Polygon","arcs":[[-7308,7308,7309,7310,-6303,-6306,-7299,-7305]],"properties":{"id":"24662976","dp":2804,"de":0}},{"type":"Polygon","arcs":[[-7307,7311,7312,-7309]],"properties":{"id":"24662977","dp":8587,"de":0}},{"type":"Polygon","arcs":[[7313,7314,-7312,7315]],"properties":{"id":"24662978","dp":8765,"de":2839}},{"type":"Polygon","arcs":[[7316,7317,-7316,-7306,-7303,-4935,-4940]],"properties":{"id":"24662979","dp":5790,"de":604}},{"type":"Polygon","arcs":[[7318,7319,-4892,-4896,-4117,-4118]],"properties":{"id":"24662980","dp":13309,"de":0}},{"type":"Polygon","arcs":[[-4320,-3796,-4893,-7320,7320,-4129,-4131]],"properties":{"id":"24662981","dp":3753,"de":531}},{"type":"Polygon","arcs":[[-7321,-7319,-4121,-4125]],"properties":{"id":"24662982","dp":21013,"de":1843}},{"type":"Polygon","arcs":[[7321,7322,7323,7324]],"properties":{"id":"24662983","dp":4104,"de":0}},{"type":"Polygon","arcs":[[7325,7326,-7322,7327,7328,-5978]],"properties":{"id":"24662984","dp":694,"de":59}},{"type":"Polygon","arcs":[[7329,7330,7331,-6804,-6796]],"properties":{"id":"24661570","dp":1675,"de":646}},{"type":"Polygon","arcs":[[7332,7333,7334,7335,-7330,-6795]],"properties":{"id":"24661571","dp":3139,"de":419}},{"type":"Polygon","arcs":[[7336,-7335,7337,7338]],"properties":{"id":"24661572","dp":8257,"de":891}},{"type":"Polygon","arcs":[[-6605,-6491,-2861,7339,7340,-7339,7341]],"properties":{"id":"24661573","dp":4632,"de":2777}},{"type":"Polygon","arcs":[[7342,7343,7344,-7331,-7336,-7337,-7341]],"properties":{"id":"24661574","dp":3764,"de":329}},{"type":"Polygon","arcs":[[7345,-7332,-7345,7346]],"properties":{"id":"24661575","dp":6144,"de":652}},{"type":"Polygon","arcs":[[7347,7348,7349,-7347,-7344]],"properties":{"id":"24661576","dp":5741,"de":1770}},{"type":"Polygon","arcs":[[-7350,7350,7351,7352,-6803,-7346]],"properties":{"id":"24661577","dp":4896,"de":1349}},{"type":"Polygon","arcs":[[7353,7354,7355,7356,-7352]],"properties":{"id":"24661578","dp":3561,"de":2340}},{"type":"Polygon","arcs":[[7357,7358,7359,-7355,7360]],"properties":{"id":"24661579","dp":13350,"de":2094}},{"type":"Polygon","arcs":[[7361,7362,-7361,-7354,-7351,7363]],"properties":{"id":"24661580","dp":5877,"de":1084}},{"type":"Polygon","arcs":[[-917,7364,-7364,-7349,7365,-7140]],"properties":{"id":"24661581","dp":2279,"de":1302}},{"type":"Polygon","arcs":[[-921,-937,7366,-7362,-7365,-916]],"properties":{"id":"24661582","dp":3033,"de":380}},{"type":"Polygon","arcs":[[7367,7368,7369,7370,7371,7372,7373,7374,7375,-397,7376]],"properties":{"id":"24662067","dp":0,"de":4307}},{"type":"Polygon","arcs":[[7377,7378,-384,7379]],"properties":{"id":"24662069","dp":13885,"de":0}},{"type":"Polygon","arcs":[[7380,7381,7382,-7378,7383,7384]],"properties":{"id":"24662070","dp":13016,"de":0}},{"type":"Polygon","arcs":[[7385,7386,7387,-7381]],"properties":{"id":"24662071","dp":23709,"de":0}},{"type":"Polygon","arcs":[[-7278,7388,-5252,-5258,-6744]],"properties":{"id":"24663116","dp":1197,"de":230}},{"type":"Polygon","arcs":[[-7277,-5253,-7389]],"properties":{"id":"24663117","dp":1178,"de":0}},{"type":"Polygon","arcs":[[-6113,-5255,-7276,7389,7390,7391,7392,7393,-5145,-5148,7394,-5172],[-5151,-5152]],"properties":{"id":"24663118","dp":122,"de":297}},{"type":"Polygon","arcs":[[-5138,-5146,-7394,7395]],"properties":{"id":"24663119","dp":1488,"de":3982}},{"type":"Polygon","arcs":[[7396,-5139,-7396,-7393,7397]],"properties":{"id":"24663120","dp":3795,"de":596}},{"type":"Polygon","arcs":[[-7398,-7392,7398]],"properties":{"id":"24663121","dp":3712,"de":1164}},{"type":"Polygon","arcs":[[-7399,-7391,7399,-5140,-7397]],"properties":{"id":"24663122","dp":3883,"de":2478}},{"type":"Polygon","arcs":[[-6114,7400,-5167,-5169,-5165,-5878,-5870,-5184,-6117]],"properties":{"id":"24663407","dp":1668,"de":0}},{"type":"Polygon","arcs":[[-5399,-3436]],"properties":{"id":"24663164","dp":2687,"de":1734}},{"type":"Polygon","arcs":[[-5448,7401,-5445,-5451,7402,7403,-5453,-3438,-5398,7404,7405,7406]],"properties":{"id":"24663166","dp":1449,"de":3685}},{"type":"Polygon","arcs":[[7407,-7405,-5397,7408,7409]],"properties":{"id":"24663167","dp":2844,"de":0}},{"type":"Polygon","arcs":[[-5441,-7402,-5447]],"properties":{"id":"24663168","dp":3333,"de":542}},{"type":"Polygon","arcs":[[7410,-4272,-4271,-6919,-7235,-7233]],"properties":{"id":"24661493","dp":14917,"de":1543}},{"type":"Polygon","arcs":[[7411,-4101,-7411,-7231]],"properties":{"id":"24661494","dp":31176,"de":0}},{"type":"Polygon","arcs":[[7412,-4105,-7412,-7230]],"properties":{"id":"24661495","dp":16679,"de":3754}},{"type":"Polygon","arcs":[[7413,-4108,-7413,-7228]],"properties":{"id":"24661496","dp":13100,"de":2131}},{"type":"Polygon","arcs":[[7414,7415,7416,-7387]],"properties":{"id":"24662072","dp":24268,"de":0}},{"type":"Polygon","arcs":[[7417,7418,7419,7420,-7416,7421,7422,7423,7424]],"properties":{"id":"24662073","dp":10919,"de":4245}},{"type":"Polygon","arcs":[[7425,7426,7427,7428,-7417,-7421]],"properties":{"id":"24662074","dp":13825,"de":1663}},{"type":"Polygon","arcs":[[-7429,7429,7430,-7388]],"properties":{"id":"24662075","dp":20565,"de":0}},{"type":"Polygon","arcs":[[-7431,7431,7432,-7382]],"properties":{"id":"24662076","dp":15990,"de":0}},{"type":"Polygon","arcs":[[-7383,-7433,7433,-385,-7379]],"properties":{"id":"24662077","dp":12444,"de":0}},{"type":"Polygon","arcs":[[7434,7435,-1388,-390]],"properties":{"id":"24662078","dp":14730,"de":0}},{"type":"Polygon","arcs":[[-1454,-1467,-7010,7436,-7435,-389]],"properties":{"id":"24662079","dp":10897,"de":1201}},{"type":"Polygon","arcs":[[-7437,-7009,-7011,-1389,-7436]],"properties":{"id":"24662080","dp":11847,"de":2653}},{"type":"Polygon","arcs":[[-5713,-5716,7437,7438]],"properties":{"id":"24661798","dp":15497,"de":6544}},{"type":"Polygon","arcs":[[-5714,-7439,7439,7440,-5709]],"properties":{"id":"24661799","dp":23933,"de":3080}},{"type":"Polygon","arcs":[[-5710,-7441,7441,7442]],"properties":{"id":"24661800","dp":25858,"de":0}},{"type":"Polygon","arcs":[[-5707,-7443,7443,7444,-5701]],"properties":{"id":"24661801","dp":7223,"de":3251}},{"type":"Polygon","arcs":[[7445,7446,7447,7448,-7444]],"properties":{"id":"24661802","dp":8200,"de":2197}},{"type":"Polygon","arcs":[[-7446,-7442,7449,7450]],"properties":{"id":"24661803","dp":24945,"de":2472}},{"type":"Polygon","arcs":[[-7440,7451,7452,7453,-7450]],"properties":{"id":"24661804","dp":20105,"de":4577}},{"type":"Polygon","arcs":[[-7438,7454,7455,-7452]],"properties":{"id":"24661805","dp":17472,"de":2361}},{"type":"Polygon","arcs":[[-5715,-5033,7456,7457,-7455]],"properties":{"id":"24661806","dp":18461,"de":3974}},{"type":"Polygon","arcs":[[-7453,-7456,-7458,7458,7459,7460]],"properties":{"id":"24661807","dp":19787,"de":4416}},{"type":"Polygon","arcs":[[-7454,-7461,7461,7462,7463,7464]],"properties":{"id":"24661808","dp":18647,"de":4713}},{"type":"Polygon","arcs":[[-7451,-7465,7465,-7447]],"properties":{"id":"24661809","dp":10440,"de":2422}},{"type":"Polygon","arcs":[[-7464,7466,7467,7468,7469,-7448,-7466]],"properties":{"id":"24661810","dp":9196,"de":6551}},{"type":"Polygon","arcs":[[-7467,-7463,7470,7471]],"properties":{"id":"24661811","dp":18634,"de":3614}},{"type":"Polygon","arcs":[[-7471,-7462,-7460,7472,7473]],"properties":{"id":"24661812","dp":19173,"de":3512}},{"type":"Polygon","arcs":[[-7473,-7459,7474,7475]],"properties":{"id":"24661813","dp":15366,"de":8494}},{"type":"Polygon","arcs":[[-7475,-7457,7476,7477,7478,7479]],"properties":{"id":"24661814","dp":12566,"de":3318}},{"type":"Polygon","arcs":[[-5032,7480,-7477]],"properties":{"id":"24661815","dp":15734,"de":7109}},{"type":"Polygon","arcs":[[7481,7482,-7481,-5031]],"properties":{"id":"24661816","dp":11709,"de":7952}},{"type":"Polygon","arcs":[[-5835,-5823,-5829,7483,7484,-7482]],"properties":{"id":"24661817","dp":12057,"de":5199}},{"type":"Polygon","arcs":[[-7485,7485,-7478,-7483]],"properties":{"id":"24661818","dp":20765,"de":0}},{"type":"Polygon","arcs":[[7486,7487,7488,7489,-7486]],"properties":{"id":"24661819","dp":17472,"de":3296}},{"type":"Polygon","arcs":[[-5828,-5833,7490,7491,7492,-7487,-7484]],"properties":{"id":"24661820","dp":12617,"de":5679}},{"type":"Polygon","arcs":[[-7493,7493,-7273,7494,-7488]],"properties":{"id":"24661821","dp":11378,"de":4407}},{"type":"Polygon","arcs":[[7495,7496,-939,-946,7497,7498]],"properties":{"id":"24661592","dp":3003,"de":0}},{"type":"Polygon","arcs":[[-945,7499,-7498]],"properties":{"id":"24661593","dp":9223,"de":0}},{"type":"Polygon","arcs":[[-7360,7500,-7499,-7500,-944,-3549,7501]],"properties":{"id":"24661594","dp":5594,"de":471}},{"type":"Polygon","arcs":[[-7356,-7502,-3554,7502]],"properties":{"id":"24661595","dp":3869,"de":455}},{"type":"Polygon","arcs":[[-7353,-7357,-7503,-3553,7503,-6802]],"properties":{"id":"24661597","dp":3066,"de":400}},{"type":"Polygon","arcs":[[-7504,-3552,-6799,-6800]],"properties":{"id":"24661598","dp":3017,"de":361}},{"type":"Polygon","arcs":[[7504,-4111,-7414,-7226]],"properties":{"id":"24661497","dp":13043,"de":1976}},{"type":"Polygon","arcs":[[7505,-4119,-4115,-4112,-7505,-7224,-7222]],"properties":{"id":"24661498","dp":5474,"de":23734}},{"type":"Polygon","arcs":[[-7506,-7220,-7218,-7216,7506,-4126,-4122]],"properties":{"id":"24661499","dp":10355,"de":1601}},{"type":"Polygon","arcs":[[7507,-4135,-4132,-4127,-7507,-7214,-7212]],"properties":{"id":"24661500","dp":8146,"de":4517}},{"type":"Polygon","arcs":[[-7508,-7211,7508,7509,-4136]],"properties":{"id":"24661501","dp":12047,"de":6428}},{"type":"Polygon","arcs":[[7510,7511,-4143,-7510,7512]],"properties":{"id":"24661502","dp":13410,"de":1589}},{"type":"Polygon","arcs":[[7513,-7513,-7509,-7083,7514]],"properties":{"id":"24661503","dp":14649,"de":3184}},{"type":"Polygon","arcs":[[7515,-4149,7516,-7511,-7514,7517]],"properties":{"id":"24661504","dp":15988,"de":8720}},{"type":"Polygon","arcs":[[-7517,-4146,-4139,-7512]],"properties":{"id":"24661505","dp":18595,"de":0}},{"type":"Polygon","arcs":[[7518,7519,-4152,-7516,7520]],"properties":{"id":"24661506","dp":19589,"de":5479}},{"type":"Polygon","arcs":[[7521,-4302,-4299,-7520,7522]],"properties":{"id":"24661507","dp":14609,"de":4687}},{"type":"Polygon","arcs":[[-6956,-4305,-7522,7523]],"properties":{"id":"24661508","dp":12172,"de":1114}},{"type":"Polygon","arcs":[[-6957,-7524,7524,7525,7526]],"properties":{"id":"24661509","dp":12715,"de":5387}},{"type":"Polygon","arcs":[[-7525,-7523,-7519,7527]],"properties":{"id":"24661510","dp":15028,"de":3693}},{"type":"Polygon","arcs":[[7528,-7521,-7518,-7515,-7082,-7080,-7072]],"properties":{"id":"24661513","dp":11255,"de":36595}},{"type":"Polygon","arcs":[[-7065,7529,7530,7531,-7071,-7070]],"properties":{"id":"24661514","dp":11062,"de":6941}},{"type":"Polygon","arcs":[[-7062,-7059,7532,7533,7534,-7530,-7064]],"properties":{"id":"24661515","dp":11259,"de":3827}},{"type":"Polygon","arcs":[[7535,7536,7537,-7533,7538]],"properties":{"id":"24661516","dp":13723,"de":7040}},{"type":"Polygon","arcs":[[-6951,-6950,7539,-7537,7540]],"properties":{"id":"24661517","dp":13107,"de":6265}},{"type":"Polygon","arcs":[[-7534,-7538,-7540,-6949,-6958,-7527,7541]],"properties":{"id":"24661518","dp":10919,"de":11069}},{"type":"Polygon","arcs":[[-5925,-1470,7542,7543]],"properties":{"id":"24661997","dp":11583,"de":1583}},{"type":"Polygon","arcs":[[-7543,-1469,7544,7545]],"properties":{"id":"24661998","dp":14210,"de":0}},{"type":"Polygon","arcs":[[7546,-7545,-1468,-1456,7547,7548]],"properties":{"id":"24661999","dp":13684,"de":1258}},{"type":"Polygon","arcs":[[7549,-7548,-1458,-1451,7550,7551]],"properties":{"id":"24662000","dp":13549,"de":1267}},{"type":"Polygon","arcs":[[7552,-7551,-1455,-388,7553]],"properties":{"id":"24662001","dp":15687,"de":0}},{"type":"Polygon","arcs":[[7554,7555,-7552,-7553,7556,7557]],"properties":{"id":"24662002","dp":16578,"de":2359}},{"type":"Polygon","arcs":[[-7557,-7554,-387,7558]],"properties":{"id":"24662003","dp":13910,"de":0}},{"type":"Polygon","arcs":[[7559,-7558,-7559,-386,-7434]],"properties":{"id":"24662004","dp":13737,"de":2706}},{"type":"Polygon","arcs":[[7560,7561,-7555,-7560,-7432]],"properties":{"id":"24662005","dp":16012,"de":1446}},{"type":"Polygon","arcs":[[-7428,7562,7563,7564,-7561,-7430]],"properties":{"id":"24662006","dp":17889,"de":1623}},{"type":"Polygon","arcs":[[-4458,-7141,-7366,-7348,-7343,-7340,-2860,-2847]],"properties":{"id":"24661620","dp":4479,"de":445}},{"type":"Polygon","arcs":[[-6990,7565,7566,7567,-6966,-6962,-6954,7568,-4727]],"properties":{"id":"24661621","dp":7933,"de":23795}},{"type":"Polygon","arcs":[[-6606,-7342,-7338,-7334,-6991,-6988]],"properties":{"id":"24661532","dp":2209,"de":4562}},{"type":"Polygon","arcs":[[-7333,7569,7570,7571,-6992]],"properties":{"id":"24661533","dp":22113,"de":2303}},{"type":"Polygon","arcs":[[-6993,-7572,7572,7573]],"properties":{"id":"24661534","dp":20646,"de":2985}},{"type":"Polygon","arcs":[[-6974,-7574,7574,7575]],"properties":{"id":"24661535","dp":23657,"de":2777}},{"type":"Polygon","arcs":[[-6975,-7576,7576,7577]],"properties":{"id":"24661536","dp":23127,"de":2132}},{"type":"Polygon","arcs":[[-6976,-7578,7578,7579]],"properties":{"id":"24661537","dp":24251,"de":3140}},{"type":"Polygon","arcs":[[-6969,-7580,7580,7581]],"properties":{"id":"24661538","dp":20189,"de":2606}},{"type":"Polygon","arcs":[[-6970,-7582,7582,7583]],"properties":{"id":"24661539","dp":24692,"de":2192}},{"type":"Polygon","arcs":[[-6965,-7584,7584,-6961]],"properties":{"id":"24661540","dp":25922,"de":0}},{"type":"Polygon","arcs":[[-7585,7585,-3391]],"properties":{"id":"24661541","dp":26096,"de":2673}},{"type":"Polygon","arcs":[[7586,7587,-7586,-7583]],"properties":{"id":"24661542","dp":18052,"de":0}},{"type":"Polygon","arcs":[[-7581,7588,7589,-7587]],"properties":{"id":"24661543","dp":21771,"de":0}},{"type":"Polygon","arcs":[[-7579,7590,7591,-7589]],"properties":{"id":"24661544","dp":21511,"de":2616}},{"type":"Polygon","arcs":[[-7575,7592,7593,-7591,-7577]],"properties":{"id":"24661545","dp":17464,"de":1424}},{"type":"Polygon","arcs":[[-7571,7594,7595,7596,-7593,-7573]],"properties":{"id":"24661546","dp":15792,"de":0}},{"type":"Polygon","arcs":[[-7570,-6794,7597,-7595]],"properties":{"id":"24661547","dp":37974,"de":0}},{"type":"Polygon","arcs":[[-7598,-6793,-6775,-6770,7598,-7596]],"properties":{"id":"24661548","dp":18980,"de":0}},{"type":"Polygon","arcs":[[-7597,-7599,-6766,7599,7600,-7594]],"properties":{"id":"24661549","dp":11074,"de":2399}},{"type":"Polygon","arcs":[[-7601,7601,7602,-7592]],"properties":{"id":"24661550","dp":20568,"de":0}},{"type":"Polygon","arcs":[[-7590,-7603,7603,-3392,-7588]],"properties":{"id":"24661551","dp":13873,"de":2747}},{"type":"Polygon","arcs":[[7604,-7139,-7128,-4205,-3393]],"properties":{"id":"24661554","dp":9649,"de":2192}},{"type":"Polygon","arcs":[[7605,-7135,-7138,-7605,-7604]],"properties":{"id":"24661555","dp":19215,"de":1260}},{"type":"Polygon","arcs":[[-7600,-6769,-6779,-6784,-7134,-7132,-7136,-7606,-7602]],"properties":{"id":"24661556","dp":6867,"de":1040}},{"type":"Polygon","arcs":[[7606,7607,7608]],"properties":{"id":"24662030","dp":21111,"de":2263}},{"type":"Polygon","arcs":[[-7489,7609,-7608,7610]],"properties":{"id":"24662031","dp":15163,"de":3485}},{"type":"Polygon","arcs":[[-7271,-7274,-5758,-5890,-5892,-5900,7611,7612]],"properties":{"id":"24662032","dp":2764,"de":6921}},{"type":"Polygon","arcs":[[-7253,-7264,-7265,-7269]],"properties":{"id":"24662033","dp":14688,"de":2564}},{"type":"Polygon","arcs":[[7613,-7418,7614]],"properties":{"id":"24662034","dp":16629,"de":0}},{"type":"Polygon","arcs":[[7615,7616,-7615,-7425,7617,7618]],"properties":{"id":"24662035","dp":17830,"de":0}},{"type":"Polygon","arcs":[[-7618,-7424,7619,7620]],"properties":{"id":"24662036","dp":11662,"de":0}},{"type":"Polygon","arcs":[[-6250,7621,-7619,-7621,7622,7623]],"properties":{"id":"24662037","dp":13612,"de":1076}},{"type":"Polygon","arcs":[[7624,-7623,-7620,-7423,7625,7626]],"properties":{"id":"24662038","dp":12873,"de":0}},{"type":"Polygon","arcs":[[-7626,-7422,-7415,7627]],"properties":{"id":"24662039","dp":8935,"de":0}},{"type":"Polygon","arcs":[[-7627,-7628,-7386,7628,7629]],"properties":{"id":"24662040","dp":14587,"de":899}},{"type":"Polygon","arcs":[[7630,-7629,-7385,7631,7632]],"properties":{"id":"24662041","dp":12411,"de":1996}},{"type":"Polygon","arcs":[[-7632,-7384,-7380,-383,7633,7634]],"properties":{"id":"24662042","dp":8479,"de":1305}},{"type":"Polygon","arcs":[[7635,-7634,-7376,7636]],"properties":{"id":"24662043","dp":11617,"de":0}},{"type":"Polygon","arcs":[[-7492,7637,7638,-7255,-7494]],"properties":{"id":"24661822","dp":11670,"de":1354}},{"type":"Polygon","arcs":[[-7491,7639,-7638]],"properties":{"id":"24661823","dp":18630,"de":1712}},{"type":"Polygon","arcs":[[-5832,7640,-7045,-7256,-7639,-7640]],"properties":{"id":"24661824","dp":16313,"de":2120}},{"type":"Polygon","arcs":[[-7043,-7641,-5831]],"properties":{"id":"24661825","dp":16491,"de":3333}},{"type":"Polygon","arcs":[[-6594,-6592,-6585,7641,7642,7643]],"properties":{"id":"24662271","dp":3162,"de":370}},{"type":"Polygon","arcs":[[-6595,-7644,7644,-5395]],"properties":{"id":"24662272","dp":4295,"de":939}},{"type":"Polygon","arcs":[[7645,-7409,-5396,-7645,-7643,7646]],"properties":{"id":"24662273","dp":2869,"de":0}},{"type":"Polygon","arcs":[[7647,7648,-7647,-7642,-6584]],"properties":{"id":"24662274","dp":3347,"de":277}},{"type":"Polygon","arcs":[[-3072,7649,7650,-7648,-6583]],"properties":{"id":"24662275","dp":2304,"de":0}},{"type":"Polygon","arcs":[[7651,7652,-3712,-1269]],"properties":{"id":"24661940","dp":17157,"de":11710}},{"type":"Polygon","arcs":[[7653,7654,7655,-7653]],"properties":{"id":"24661941","dp":19380,"de":3925}},{"type":"Polygon","arcs":[[7656,7657,-1287,-5796,7658,7659,-7654]],"properties":{"id":"24661942","dp":2428,"de":18450}},{"type":"Polygon","arcs":[[7660,-7657,-7652,-1274]],"properties":{"id":"24661943","dp":16448,"de":13620}},{"type":"Polygon","arcs":[[-1280,-1283,-1288,-7658,-7661,-1273]],"properties":{"id":"24661944","dp":13028,"de":35981}},{"type":"Polygon","arcs":[[-7660,7661,7662,-7655]],"properties":{"id":"24661945","dp":16238,"de":4867}},{"type":"Polygon","arcs":[[-3713,-7656,-7663,7663,7664,7665]],"properties":{"id":"24661946","dp":10887,"de":15614}},{"type":"Polygon","arcs":[[-7665,7666,7667,7668,7669]],"properties":{"id":"24661947","dp":18826,"de":2826}},{"type":"Polygon","arcs":[[-7666,-7670,7670,7671,-3709]],"properties":{"id":"24661948","dp":14350,"de":6638}},{"type":"Polygon","arcs":[[-7671,-7669,7672,7673]],"properties":{"id":"24661949","dp":16658,"de":3367}},{"type":"Polygon","arcs":[[-7672,-7674,7674,-3696,-5135,-5137]],"properties":{"id":"24661950","dp":10156,"de":7702}},{"type":"Polygon","arcs":[[7675,-5498,-5506,-3689,-3700,-3697]],"properties":{"id":"24661953","dp":12183,"de":10204}},{"type":"Polygon","arcs":[[7676,7677,7678,-7676,-7675,-7673]],"properties":{"id":"24661954","dp":16651,"de":7683}},{"type":"Polygon","arcs":[[7679,7680,-7677,-7668]],"properties":{"id":"24661955","dp":18132,"de":2918}},{"type":"Polygon","arcs":[[7681,7682,7683,-7678,-7681]],"properties":{"id":"24661956","dp":9977,"de":3611}},{"type":"Polygon","arcs":[[7684,7685,7686,-7682,7687]],"properties":{"id":"24661957","dp":13908,"de":5456}},{"type":"Polygon","arcs":[[7688,-7688,-7680,-7667,-7664]],"properties":{"id":"24661958","dp":18788,"de":10695}},{"type":"Polygon","arcs":[[7689,7690,7691,-7689,-7662]],"properties":{"id":"24661959","dp":13929,"de":9824}},{"type":"Polygon","arcs":[[7692,7693,-7691]],"properties":{"id":"24661960","dp":16458,"de":4249}},{"type":"Polygon","arcs":[[-7690,-7659,-5795,-6693,-6698,-6700,7694,-7693]],"properties":{"id":"24661961","dp":3152,"de":1246}},{"type":"Polygon","arcs":[[-7692,-7694,-7695,-6702,7695,-7685]],"properties":{"id":"24661962","dp":8834,"de":37730}},{"type":"Polygon","arcs":[[-7696,-6703,-6710,7696,-7686]],"properties":{"id":"24661963","dp":18341,"de":4899}},{"type":"Polygon","arcs":[[7697,-7496,-7501,-7359]],"properties":{"id":"24661599","dp":4056,"de":0}},{"type":"Polygon","arcs":[[-7367,-940,-7497,-7698,-7358,-7363]],"properties":{"id":"24661600","dp":3124,"de":766}},{"type":"Polygon","arcs":[[-3550,-942,-4410,-7125,7698,-7123,-5565]],"properties":{"id":"24661601","dp":2188,"de":2150}},{"type":"Polygon","arcs":[[-7124,-7699]],"properties":{"id":"24661602","dp":4102,"de":0}},{"type":"Polygon","arcs":[[-7204,-1500,7699]],"properties":{"id":"24662098","dp":14023,"de":0}},{"type":"Polygon","arcs":[[-1499,-7266,-7262,7700,-7201,-7700]],"properties":{"id":"24662099","dp":10173,"de":1906}},{"type":"Polygon","arcs":[[-7260,-7202,-7701,-7261]],"properties":{"id":"24662100","dp":13190,"de":4605}},{"type":"Polygon","arcs":[[-7259,7701,-7194,-7196,-7199]],"properties":{"id":"24662101","dp":6017,"de":1857}},{"type":"Polygon","arcs":[[7702,-7192,-7702,-7258]],"properties":{"id":"24662102","dp":10739,"de":4225}},{"type":"Polygon","arcs":[[7703,7704,-333,7705]],"properties":{"id":"24662103","dp":6944,"de":1889}},{"type":"Polygon","arcs":[[7706,-3821,-3814,-7705]],"properties":{"id":"24662104","dp":8165,"de":2206}},{"type":"Polygon","arcs":[[-3495,7707,-3822,-7707,7708]],"properties":{"id":"24662105","dp":9480,"de":3003}},{"type":"Polygon","arcs":[[-3494,-3825,-3818,-7708]],"properties":{"id":"24662106","dp":9200,"de":0}},{"type":"Polygon","arcs":[[7709,-2264,-2257,-7007]],"properties":{"id":"24662108","dp":15333,"de":1770}},{"type":"Polygon","arcs":[[7710,-2274,-7710,-6834]],"properties":{"id":"24662109","dp":18228,"de":1351}},{"type":"Polygon","arcs":[[7711,-2275,-7711,7712]],"properties":{"id":"24662110","dp":15255,"de":0}},{"type":"Polygon","arcs":[[-5018,-5017,7713,-6554,-6549,-6545]],"properties":{"id":"24662111","dp":11775,"de":13054}},{"type":"Polygon","arcs":[[-5010,7714,-6555,-7714,-5016]],"properties":{"id":"24662112","dp":17245,"de":4918}},{"type":"Polygon","arcs":[[-6551,-7715,-5009,-5004,-4876,-4875,-4872,-6556]],"properties":{"id":"24662113","dp":3453,"de":442}},{"type":"Polygon","arcs":[[7715,-3523,7716,-1931]],"properties":{"id":"24662958","dp":3548,"de":461}},{"type":"Polygon","arcs":[[-1594,-1598,-1602,-3521,-7716,-1930]],"properties":{"id":"24662961","dp":7521,"de":1569}},{"type":"Polygon","arcs":[[-6653,7717,7718,7719,7720,-6655]],"properties":{"id":"24662962","dp":10448,"de":0}},{"type":"Polygon","arcs":[[-6656,-7721,7721,7722,-6667,-6662]],"properties":{"id":"24662963","dp":13293,"de":0}},{"type":"Polygon","arcs":[[-7295,7723,-6641,-6651,7724,-6665,-6685,-6687,-6691,7725,-1625,-7297]],"properties":{"id":"24662964","dp":941,"de":3834}},{"type":"Polygon","arcs":[[-6650,-6661,-6666,-7725]],"properties":{"id":"24662965","dp":13662,"de":4714}},{"type":"Polygon","arcs":[[-7294,-7724]],"properties":{"id":"24662966","dp":29845,"de":0}},{"type":"Polygon","arcs":[[-7566,-6981,-6967,7726]],"properties":{"id":"24661622","dp":19846,"de":2307}},{"type":"Polygon","arcs":[[-7567,-7727,-6971,7727]],"properties":{"id":"24661623","dp":23600,"de":2444}},{"type":"Polygon","arcs":[[-7728,-6963,-7568]],"properties":{"id":"24661624","dp":17574,"de":5106}},{"type":"Polygon","arcs":[[-4738,-4728,-7569,-6953,7728,-4750]],"properties":{"id":"24661625","dp":2091,"de":6686}},{"type":"Polygon","arcs":[[-4763,-7729,-6952,-7541,-7536,7729,7730]],"properties":{"id":"24661626","dp":6212,"de":10221}},{"type":"Polygon","arcs":[[-7730,-7539,-7061,7731]],"properties":{"id":"24661627","dp":17538,"de":5135}},{"type":"Polygon","arcs":[[-5115,-4764,-7731,-7732,-7057,-7056,7732,7733]],"properties":{"id":"24661628","dp":2730,"de":12672}},{"type":"Polygon","arcs":[[-7734,7734,7735,-5116]],"properties":{"id":"24661629","dp":10100,"de":8193}},{"type":"Polygon","arcs":[[-7246,-6906,-2293,7736]],"properties":{"id":"24661630","dp":6753,"de":2217}},{"type":"Polygon","arcs":[[7737,7738,-7737,7739,7740]],"properties":{"id":"24661631","dp":7161,"de":2380}},{"type":"Polygon","arcs":[[7741,-7247,-7739,7742,7743,7744]],"properties":{"id":"24661632","dp":11209,"de":756}},{"type":"Polygon","arcs":[[7745,-7242,-7248,-7742,7746]],"properties":{"id":"24661633","dp":11463,"de":958}},{"type":"Polygon","arcs":[[-7209,7747,-7241,-7746]],"properties":{"id":"24661634","dp":11827,"de":1724}},{"type":"Polygon","arcs":[[-7208,-7150,-7238,-7239,-7748]],"properties":{"id":"24661635","dp":12547,"de":2857}},{"type":"Polygon","arcs":[[7748,7749,-2903]],"properties":{"id":"24662131","dp":17239,"de":0}},{"type":"Polygon","arcs":[[7750,7751,-7749,-2902]],"properties":{"id":"24662132","dp":16117,"de":3324}},{"type":"Polygon","arcs":[[-7751,-2901,7752,7753,7754]],"properties":{"id":"24662133","dp":7219,"de":8005}},{"type":"Polygon","arcs":[[-7754,7755,7756,-2565,-2571,7757]],"properties":{"id":"24662134","dp":6560,"de":1864}},{"type":"Polygon","arcs":[[7758,-3540,7759,7760,-7756]],"properties":{"id":"24662135","dp":7688,"de":15667}},{"type":"Polygon","arcs":[[-2910,-2915,-7759,-7753]],"properties":{"id":"24662136","dp":21841,"de":2966}},{"type":"Polygon","arcs":[[-7761,7761,-6121,-2562,-7757]],"properties":{"id":"24662137","dp":10441,"de":8201}},{"type":"Polygon","arcs":[[-3539,7762,7763,-6125,-6122,-7762,-7760]],"properties":{"id":"24662138","dp":3353,"de":13807}},{"type":"Polygon","arcs":[[-5805,-5803,-2727,7764,-6126]],"properties":{"id":"24662140","dp":32804,"de":28048}},{"type":"Polygon","arcs":[[-6127,-7765,-2730]],"properties":{"id":"24662141","dp":31500,"de":2500}},{"type":"Polygon","arcs":[[7765,7766,-5207,-7764]],"properties":{"id":"24662142","dp":26520,"de":40878}},{"type":"Polygon","arcs":[[-4563,-2709,-2718,-5208,-7767,7767]],"properties":{"id":"24662143","dp":3505,"de":12207}},{"type":"Polygon","arcs":[[-3545,-4564,-7768,-7766,-7763,-3538]],"properties":{"id":"24662144","dp":13223,"de":28371}},{"type":"Polygon","arcs":[[-7210,-7747,7768,-5772,-5764]],"properties":{"id":"24661660","dp":10017,"de":1475}},{"type":"Polygon","arcs":[[-7769,-7745,7769,-5773]],"properties":{"id":"24661661","dp":14436,"de":0}},{"type":"Polygon","arcs":[[-7770,-7744,7770,-5775]],"properties":{"id":"24661662","dp":11105,"de":1442}},{"type":"Polygon","arcs":[[-1476,-5776,-7771,-7743,-7738,7771,-1472]],"properties":{"id":"24661663","dp":4123,"de":1231}},{"type":"Polygon","arcs":[[-7772,-7741,7772,7773,-1473]],"properties":{"id":"24661664","dp":8072,"de":2409}},{"type":"Polygon","arcs":[[-7774,7774,7775,-1462,-1474]],"properties":{"id":"24661665","dp":11469,"de":0}},{"type":"Polygon","arcs":[[-7776,7776,7777,7778,-1463]],"properties":{"id":"24661666","dp":8374,"de":643}},{"type":"Polygon","arcs":[[7779,-2288,7780,-7777]],"properties":{"id":"24661667","dp":7920,"de":1804}},{"type":"Polygon","arcs":[[-7773,-7740,-2292,-7780,-7775]],"properties":{"id":"24661668","dp":10695,"de":2139}},{"type":"Polygon","arcs":[[-7778,-7781,-2287,-2281,-2271,-7712,7781]],"properties":{"id":"24661669","dp":3545,"de":1232}},{"type":"Polygon","arcs":[[-7779,-7782,7782,-1464]],"properties":{"id":"24661670","dp":6715,"de":1863}},{"type":"Polygon","arcs":[[-7783,-7713,-6833,-1465]],"properties":{"id":"24661671","dp":15000,"de":1724}},{"type":"Polygon","arcs":[[-6010,-2310,7783,7784,7785,7786,7787,7788]],"properties":{"id":"24662162","dp":1682,"de":24676}},{"type":"Polygon","arcs":[[-6007,-7789,7789,7790,-2890,7791]],"properties":{"id":"24662163","dp":6950,"de":2593}},{"type":"Polygon","arcs":[[-2889,7792,-2874,-6008,-7792]],"properties":{"id":"24662164","dp":3200,"de":3169}},{"type":"Polygon","arcs":[[-7793,-2888,-2883,-2875]],"properties":{"id":"24662165","dp":13571,"de":0}},{"type":"Polygon","arcs":[[-3473,-2891,-7791,-3533,-2913,7793]],"properties":{"id":"24662167","dp":4663,"de":6351}},{"type":"Polygon","arcs":[[-2906,-7794]],"properties":{"id":"24662168","dp":23446,"de":0}},{"type":"Polygon","arcs":[[7794,-2528,7795]],"properties":{"id":"24662169","dp":10740,"de":0}},{"type":"Polygon","arcs":[[7796,7797,7798,7799,-7796,-2527,7800]],"properties":{"id":"24662170","dp":5975,"de":0}},{"type":"Polygon","arcs":[[7801,7802,-7799]],"properties":{"id":"24662171","dp":6305,"de":0}},{"type":"Polygon","arcs":[[-2529,-7795,-7800,7803]],"properties":{"id":"24662172","dp":8530,"de":884}},{"type":"Polygon","arcs":[[-7803,7804,-715,-706,-697,-3105,-7804]],"properties":{"id":"24662173","dp":3917,"de":770}},{"type":"Polygon","arcs":[[-2680,-2491,7805,7806,7807,-710,-7805,7808,-7797,7809]],"properties":{"id":"24662174","dp":2149,"de":185}},{"type":"Polygon","arcs":[[-7802,-7798,-7809]],"properties":{"id":"24662175","dp":10682,"de":741}},{"type":"Polygon","arcs":[[-7687,-7697,-6709,7810,-7683]],"properties":{"id":"24661964","dp":18611,"de":3213}},{"type":"Polygon","arcs":[[-7679,-7684,-7811,-6708,-5489,-5496]],"properties":{"id":"24661965","dp":12250,"de":13588}},{"type":"Polygon","arcs":[[-6344,-5686,7811]],"properties":{"id":"24662342","dp":4292,"de":0}},{"type":"Polygon","arcs":[[-3062,-6321,-6342,-7812,-5683,7812]],"properties":{"id":"24662343","dp":3632,"de":317}},{"type":"Polygon","arcs":[[-3057,-3063,-7813,-5682,7813]],"properties":{"id":"24662344","dp":3089,"de":0}},{"type":"Polygon","arcs":[[7814,7815,-5465,-3058,-7814,-5681,7816]],"properties":{"id":"24662345","dp":3383,"de":0}},{"type":"MultiPolygon","arcs":[[[7817,7818,7819,-6025,-6028,-6013,7820,7821]],[[7822,7823,-4282,7824]],[[7825,-4277,7826]]],"properties":{"id":"24663390","dp":694,"de":1243}},{"type":"Polygon","arcs":[[7827,7828,7829,-7819]],"properties":{"id":"24663391","dp":8240,"de":2423}},{"type":"Polygon","arcs":[[7830,-7828,7831,7832]],"properties":{"id":"24663392","dp":6712,"de":1909}},{"type":"Polygon","arcs":[[-7831,7833,-1778,7834,-7829]],"properties":{"id":"24663393","dp":8991,"de":2242}},{"type":"MultiPolygon","arcs":[[[-7833,7835,7836,-1772,7837,-1779,-7834]],[[-1781,7838,7839,7840]],[[-1786,7841,7842,7843]],[[-1783,7844,7845,7846]]],"properties":{"id":"24663394","dp":2124,"de":3179}},{"type":"MultiPolygon","arcs":[[[-7827,-4276,-2465,7847,-7840,7848]],[[7849,-7836,-7832,-7818]],[[7850,-7843,7851,-7823]],[[7852]],[[-7846,7853]]],"properties":{"id":"24663395","dp":3547,"de":470}},{"type":"Polygon","arcs":[[7854]],"properties":{"id":"24663396","dp":26,"de":0}},{"type":"Polygon","arcs":[[7855,7856,7857,7858,7859,-7419,-7614]],"properties":{"id":"24663397","dp":15008,"de":900}},{"type":"Polygon","arcs":[[7860,7861,7862,-7857]],"properties":{"id":"24663398","dp":10852,"de":0}},{"type":"Polygon","arcs":[[-7861,-7856,-7617,7863]],"properties":{"id":"24663399","dp":9401,"de":664}},{"type":"Polygon","arcs":[[7864,-7864,-7616,-7622,-6249]],"properties":{"id":"24663400","dp":12946,"de":4872}},{"type":"Polygon","arcs":[[7865,7866,7867,-7862,-7865,-6253]],"properties":{"id":"24663401","dp":2525,"de":7200}},{"type":"Polygon","arcs":[[7868,-1130,-1138,7869]],"properties":{"id":"24663402","dp":10158,"de":0}},{"type":"Polygon","arcs":[[-1749,-1757,-1767,-3983,-3844,-3840,-3836,-3834]],"properties":{"id":"24661703","dp":7376,"de":1388}},{"type":"Polygon","arcs":[[7870,-2230,-2227,-2221,-1737,-1539]],"properties":{"id":"24661704","dp":12107,"de":1789}},{"type":"Polygon","arcs":[[-7021,-7019,-2243,-2235,-2231,-7871,-1538]],"properties":{"id":"24661705","dp":4225,"de":15312}},{"type":"Polygon","arcs":[[7871,-7377,-396,-1447,-7031,-3490]],"properties":{"id":"24661708","dp":4721,"de":1518}},{"type":"Polygon","arcs":[[7872,7873,-7368,-7872,-3496,7874,7875]],"properties":{"id":"24661709","dp":2164,"de":5433}},{"type":"Polygon","arcs":[[-7709,-7704,7876,-7875]],"properties":{"id":"24661710","dp":8519,"de":3107}},{"type":"Polygon","arcs":[[7877,-7876,-7877,7878,7879,7880]],"properties":{"id":"24661711","dp":8349,"de":1225}},{"type":"Polygon","arcs":[[-7879,-7706,-332,7881]],"properties":{"id":"24661712","dp":8303,"de":0}},{"type":"Polygon","arcs":[[7882,-7880,-7882,-331,7883]],"properties":{"id":"24661713","dp":9049,"de":1311}},{"type":"Polygon","arcs":[[7884,-7884,7885,-3957]],"properties":{"id":"24661714","dp":11540,"de":0}},{"type":"Polygon","arcs":[[-3958,-7886,-330,-3808,-3800,-3799,-3960]],"properties":{"id":"24661715","dp":4304,"de":1828}},{"type":"Polygon","arcs":[[7886,-7881,-7883,-7885,7887]],"properties":{"id":"24661716","dp":9462,"de":833}},{"type":"Polygon","arcs":[[7888,-7888,-3956]],"properties":{"id":"24661717","dp":10787,"de":0}},{"type":"Polygon","arcs":[[7889,7890,-7874,7891,-7889,-3955]],"properties":{"id":"24661718","dp":1532,"de":1834}},{"type":"Polygon","arcs":[[-7873,-7878,-7887,-7892]],"properties":{"id":"24661719","dp":4314,"de":2983}},{"type":"Polygon","arcs":[[-3481,7892,-3479,-5317,-5320,-365,-7890,-3954,-3483,7893]],"properties":{"id":"24661720","dp":699,"de":878}},{"type":"Polygon","arcs":[[-3482,-7894]],"properties":{"id":"24661721","dp":12230,"de":0}},{"type":"MultiPolygon","arcs":[[[7894,-4685,7895,7896,-7327]],[[7897]]],"properties":{"id":"24662985","dp":777,"de":413}},{"type":"Polygon","arcs":[[-5977,7898,-7895,-7326]],"properties":{"id":"24662986","dp":1242,"de":153}},{"type":"Polygon","arcs":[[-3450,-4686,-7899,-5976]],"properties":{"id":"24662987","dp":974,"de":291}},{"type":"Polygon","arcs":[[-7869,7899,7900,-1121]],"properties":{"id":"24663403","dp":5476,"de":0}},{"type":"Polygon","arcs":[[-1135,7901,-7900,-7870,-1137,-3740]],"properties":{"id":"24663404","dp":7196,"de":0}},{"type":"Polygon","arcs":[[-7902,-1134,-1122,-7901]],"properties":{"id":"24663405","dp":6421,"de":0}},{"type":"Polygon","arcs":[[-5879,-5168,-7401,-5173,-7395,-5147,-4960,-5950,-5948,-4968,-4972]],"properties":{"id":"24663406","dp":686,"de":73}},{"type":"Polygon","arcs":[[7902,-7528,-7529,-7532]],"properties":{"id":"24663450","dp":14109,"de":2729}},{"type":"Polygon","arcs":[[-7531,-7535,-7542,-7526,-7903]],"properties":{"id":"24663451","dp":6708,"de":12304}},{"type":"Polygon","arcs":[[-6139,7903,-2963,-1308,-1249,-6135,-6137]],"properties":{"id":"24663452","dp":5953,"de":25994}},{"type":"Polygon","arcs":[[-4586,-2964,-7904,-6138,-2966]],"properties":{"id":"24663453","dp":12181,"de":2674}},{"type":"Polygon","arcs":[[7904,7905,7906,-7563,-7427]],"properties":{"id":"24662007","dp":19251,"de":0}},{"type":"Polygon","arcs":[[7907,-7546,-7547,7908,-7564,-7907]],"properties":{"id":"24662008","dp":8516,"de":1180}},{"type":"Polygon","arcs":[[-7565,-7909,-7549,-7550,-7556,-7562]],"properties":{"id":"24662009","dp":13447,"de":3561}},{"type":"Polygon","arcs":[[7909,-7544,-7908,7910]],"properties":{"id":"24662010","dp":15041,"de":2054}},{"type":"Polygon","arcs":[[7911,-5920,-5923,-5926,-7910,7912]],"properties":{"id":"24662011","dp":13357,"de":2828}},{"type":"Polygon","arcs":[[7913,-7913,-7911,-7906,7914]],"properties":{"id":"24662012","dp":12888,"de":3486}},{"type":"Polygon","arcs":[[7915,-5921,-7912,-7914,7916]],"properties":{"id":"24662013","dp":15308,"de":3089}},{"type":"Polygon","arcs":[[-7860,7917,-7917,-7915,-7905,-7426,-7420]],"properties":{"id":"24662014","dp":5970,"de":1146}},{"type":"Polygon","arcs":[[7918,7919,-5918,-7916,-7918,-7859]],"properties":{"id":"24662015","dp":7562,"de":3541}},{"type":"Polygon","arcs":[[7920,-5914,-5915,-7920]],"properties":{"id":"24662016","dp":15907,"de":4336}},{"type":"Polygon","arcs":[[7921,-5912,-7921,7922]],"properties":{"id":"24662017","dp":20319,"de":6914}},{"type":"Polygon","arcs":[[7923,-7633,-7635,-7636,7924,7925]],"properties":{"id":"24662044","dp":14034,"de":1136}},{"type":"Polygon","arcs":[[7926,-7925,-7637,7927,-6226]],"properties":{"id":"24662045","dp":13248,"de":2760}},{"type":"Polygon","arcs":[[7928,-7926,-7927,-6225,-6228]],"properties":{"id":"24662046","dp":17621,"de":1732}},{"type":"Polygon","arcs":[[7929,7930,-7924,-7929,-6230]],"properties":{"id":"24662047","dp":3978,"de":8507}},{"type":"Polygon","arcs":[[-6233,7931,7932,-7930]],"properties":{"id":"24662048","dp":15337,"de":1993}},{"type":"Polygon","arcs":[[-6235,-6241,7933,-7932,-6232]],"properties":{"id":"24662049","dp":14679,"de":1388}},{"type":"Polygon","arcs":[[7934,-7410,-7646,-7649,-7651]],"properties":{"id":"24662276","dp":2954,"de":0}},{"type":"Polygon","arcs":[[7935,7936,-7406,-7408,-7935,-7650,-3071]],"properties":{"id":"24662277","dp":2330,"de":1011}},{"type":"Polygon","arcs":[[7937,7938,-5449,-7407,-7937]],"properties":{"id":"24662278","dp":6876,"de":720}},{"type":"Polygon","arcs":[[-7936,-3070,7939,7940,-7938]],"properties":{"id":"24662279","dp":13111,"de":0}},{"type":"Polygon","arcs":[[7941,7942,-5450,-7939,-7941,7943]],"properties":{"id":"24662280","dp":2508,"de":224}},{"type":"Polygon","arcs":[[7944,-7944,-7940,-3069,7945]],"properties":{"id":"24662281","dp":1717,"de":148}},{"type":"Polygon","arcs":[[-3068,-5353,7946,7947,-7946]],"properties":{"id":"24662282","dp":4097,"de":0}},{"type":"Polygon","arcs":[[-7948,7948,-7942,-7945]],"properties":{"id":"24662283","dp":3343,"de":0}},{"type":"Polygon","arcs":[[-7943,-7949,-7947,-5352,-6160,-6167,7949,7950,-7403,-5452,-5443,-5446]],"properties":{"id":"24662284","dp":901,"de":2187}},{"type":"Polygon","arcs":[[7951,7952,7953,7954,-7951]],"properties":{"id":"24662285","dp":3759,"de":1181}},{"type":"Polygon","arcs":[[-7953,7955,7956,7957]],"properties":{"id":"24662286","dp":2763,"de":0}},{"type":"Polygon","arcs":[[-7958,7958,7959,-7954]],"properties":{"id":"24662287","dp":3685,"de":332}},{"type":"Polygon","arcs":[[7960,7961,-7959,-7957]],"properties":{"id":"24662288","dp":2965,"de":0}},{"type":"Polygon","arcs":[[-7955,-7960,-7962,7962,-5740,-5460,-5454,-7404]],"properties":{"id":"24662289","dp":856,"de":1771}},{"type":"Polygon","arcs":[[-1313,-1281,-1277,-1271,-1086,7963]],"properties":{"id":"24662114","dp":3221,"de":18847}},{"type":"Polygon","arcs":[[7964,-5911,-7922,7965]],"properties":{"id":"24662018","dp":21736,"de":6052}},{"type":"Polygon","arcs":[[7966,-5909,-7965,7967]],"properties":{"id":"24662019","dp":21354,"de":2343}},{"type":"Polygon","arcs":[[7968,-5907,-7967,7969,7970]],"properties":{"id":"24662020","dp":15658,"de":3202}},{"type":"Polygon","arcs":[[-7970,-7968,-7966,-7923,-7919,7971]],"properties":{"id":"24662021","dp":15519,"de":0}},{"type":"Polygon","arcs":[[7972,-7971,-7972,-7858,-7863,-7868]],"properties":{"id":"24662022","dp":14750,"de":0}},{"type":"Polygon","arcs":[[-7973,-7867,7973,7974,-7612,-5902,7975,-5906,-7969]],"properties":{"id":"24662024","dp":6894,"de":1088}},{"type":"Polygon","arcs":[[-5904,-7976]],"properties":{"id":"24662025","dp":28600,"de":4938}},{"type":"Polygon","arcs":[[-7445,-7449,-7470,-7974,-7866,-6252,-6258,-6274,-6275]],"properties":{"id":"24662026","dp":2804,"de":5234}},{"type":"Polygon","arcs":[[-7975,-7469,7976,7977,-7609,-7610,-7495,-7272,-7613]],"properties":{"id":"24662027","dp":3320,"de":6302}},{"type":"Polygon","arcs":[[-7480,7978,-7977,-7468,-7472,-7474,-7476]],"properties":{"id":"24662028","dp":13774,"de":2903}},{"type":"Polygon","arcs":[[-7490,-7611,-7607,-7978,-7979,-7479]],"properties":{"id":"24662029","dp":17312,"de":5000}},{"type":"Polygon","arcs":[[7979,7980,7981,7982,-5599,-5598,-5593]],"properties":{"id":"24662384","dp":1848,"de":652}},{"type":"Polygon","arcs":[[7983,7984,7985,7986,-7981,7987]],"properties":{"id":"24662385","dp":3341,"de":499}},{"type":"Polygon","arcs":[[7988,-7988,-7980,-5592,7989,7990]],"properties":{"id":"24662386","dp":4512,"de":406}},{"type":"Polygon","arcs":[[7991,7992,7993,-7990,-5596,-5590]],"properties":{"id":"24662387","dp":11225,"de":1092}},{"type":"Polygon","arcs":[[7994,-5943,7995,7996,-7993,7997]],"properties":{"id":"24662388","dp":3059,"de":0}},{"type":"Polygon","arcs":[[-5589,-5585,-5580,7998,7999,-7998,-7992]],"properties":{"id":"24662389","dp":2794,"de":1017}},{"type":"Polygon","arcs":[[8000,8001,-825,-4570,-4567,-4557,-3535]],"properties":{"id":"24662145","dp":2786,"de":2629}},{"type":"Polygon","arcs":[[8002,-8001,8003]],"properties":{"id":"24662147","dp":15989,"de":6951}},{"type":"Polygon","arcs":[[-7790,-7788,8004,8005,-8004,-3534]],"properties":{"id":"24662148","dp":5279,"de":5182}},{"type":"Polygon","arcs":[[8006,-835,-829,8007,-8006]],"properties":{"id":"24662149","dp":9821,"de":10425}},{"type":"Polygon","arcs":[[-8008,-832,-828,-8002,-8003]],"properties":{"id":"24662150","dp":7965,"de":2836}},{"type":"Polygon","arcs":[[-838,-8007,8008]],"properties":{"id":"24662151","dp":14970,"de":22058}},{"type":"Polygon","arcs":[[-7787,8009,-841,-3597,-836,-8009,-8005]],"properties":{"id":"24662152","dp":7012,"de":9674}},{"type":"Polygon","arcs":[[8010,-845,-842,-8010,-7786]],"properties":{"id":"24662153","dp":11924,"de":2405}},{"type":"Polygon","arcs":[[-6251,-7624,8011,-7934]],"properties":{"id":"24662050","dp":12577,"de":2333}},{"type":"Polygon","arcs":[[-8012,-7625,-7630,-7631,-7931,-7933]],"properties":{"id":"24662051","dp":8170,"de":24634}},{"type":"Polygon","arcs":[[-6221,-7928,-7375,8012]],"properties":{"id":"24662052","dp":12256,"de":2850}},{"type":"Polygon","arcs":[[-6222,-8013,-7374,8013]],"properties":{"id":"24662053","dp":16512,"de":1226}},{"type":"Polygon","arcs":[[8014,-8014,-7373,8015]],"properties":{"id":"24662054","dp":8411,"de":9371}},{"type":"Polygon","arcs":[[-8016,-7372,8016,8017]],"properties":{"id":"24662055","dp":18455,"de":2205}},{"type":"Polygon","arcs":[[-8017,-7371,8018,8019]],"properties":{"id":"24662056","dp":17165,"de":2330}},{"type":"Polygon","arcs":[[-8019,-7370,8020]],"properties":{"id":"24662057","dp":11772,"de":0}},{"type":"Polygon","arcs":[[8021,-8020,-8021,-7369,-7891,-364,-382]],"properties":{"id":"24662058","dp":3397,"de":3757}},{"type":"Polygon","arcs":[[-6045,-6048,8022,8023,-379]],"properties":{"id":"24662064","dp":14070,"de":2922}},{"type":"Polygon","arcs":[[-6058,-6219,8024,-8023,-6047,-6049,-6053]],"properties":{"id":"24662065","dp":5720,"de":3625}},{"type":"Polygon","arcs":[[-380,-8024,-8025,-6218,-6223,-8015,-8018,-8022]],"properties":{"id":"24662066","dp":5004,"de":3910}},{"type":"Polygon","arcs":[[-3504,8025,-5402,-5410,-5413,8026,8027,8028]],"properties":{"id":"24662405","dp":4160,"de":2203}},{"type":"Polygon","arcs":[[8029,-3506,8030,8031]],"properties":{"id":"24662408","dp":3040,"de":582}},{"type":"Polygon","arcs":[[-8031,-3505,-8029,8032,8033,8034,8035]],"properties":{"id":"24662409","dp":2358,"de":420}},{"type":"Polygon","arcs":[[-8035,8036,8037]],"properties":{"id":"24662410","dp":3768,"de":0}},{"type":"Polygon","arcs":[[-8037,-8034,8038,8039,8040]],"properties":{"id":"24662411","dp":9136,"de":0}},{"type":"Polygon","arcs":[[-5281,8041,8042,8043,-8040]],"properties":{"id":"24662412","dp":11314,"de":0}},{"type":"Polygon","arcs":[[8044,-8042,-5280,-5276,-5270]],"properties":{"id":"24662413","dp":6083,"de":0}},{"type":"Polygon","arcs":[[8045,8046,-8043,-8045,-5275]],"properties":{"id":"24662414","dp":10353,"de":0}},{"type":"Polygon","arcs":[[8047,-8044,-8047,8048]],"properties":{"id":"24662415","dp":9958,"de":0}},{"type":"Polygon","arcs":[[8049,-8049,-8046,-5274,-5268,-5160,8050]],"properties":{"id":"24662416","dp":8268,"de":0}},{"type":"Polygon","arcs":[[-2700,-2698,-2696,-2694,-2689,-2683,8051,-2707]],"properties":{"id":"24662176","dp":3281,"de":2157}},{"type":"Polygon","arcs":[[8052,-711,-7808]],"properties":{"id":"24662177","dp":10225,"de":0}},{"type":"Polygon","arcs":[[-7807,8053,-4591,8054,-721,-712,-8053]],"properties":{"id":"24662178","dp":10562,"de":672}},{"type":"Polygon","arcs":[[-8055,-4590,-4471,-4468,-726,-722]],"properties":{"id":"24662179","dp":8499,"de":1661}},{"type":"Polygon","arcs":[[-4326,-4600,-4592,-8054,-7806]],"properties":{"id":"24662180","dp":11991,"de":0}},{"type":"Polygon","arcs":[[-7961,-7956,-7952,-7950,-6170,-5741,-7963]],"properties":{"id":"24662290","dp":3018,"de":2519}},{"type":"Polygon","arcs":[[-4701,-4697,8055,-4939,-4938,-4936,-4928,-7301,-4911]],"properties":{"id":"24662642","dp":1972,"de":531}},{"type":"Polygon","arcs":[[-6423,8056,8057,-7317,-8056]],"properties":{"id":"24662643","dp":9678,"de":2506}},{"type":"Polygon","arcs":[[8058,8059,8060,8061,-8057]],"properties":{"id":"24662644","dp":7315,"de":1908}},{"type":"Polygon","arcs":[[-8058,-8062,8062,8063,-7318]],"properties":{"id":"24662645","dp":8890,"de":1239}},{"type":"Polygon","arcs":[[8064,8065,8066,-8063,-8061]],"properties":{"id":"24662646","dp":9131,"de":1595}},{"type":"Polygon","arcs":[[-8067,8067,8068,-7314,-8064]],"properties":{"id":"24662647","dp":5640,"de":15548}},{"type":"Polygon","arcs":[[8069,8070,8071,8072,-8068,-8066,8073]],"properties":{"id":"24662648","dp":5610,"de":2964}},{"type":"Polygon","arcs":[[-5459,-5466,-7816,8074,-5457]],"properties":{"id":"24662346","dp":2142,"de":0}},{"type":"Polygon","arcs":[[-8075,8075,8076,8077,8078,-5433]],"properties":{"id":"24662347","dp":2461,"de":0}},{"type":"Polygon","arcs":[[-7815,8079,8080,8081,-8076]],"properties":{"id":"24662348","dp":3249,"de":0}},{"type":"Polygon","arcs":[[-8080,-7817,-5680,8082,8083]],"properties":{"id":"24662349","dp":3082,"de":0}},{"type":"Polygon","arcs":[[-5674,8084,8085,8086,-8083]],"properties":{"id":"24662350","dp":3205,"de":0}},{"type":"Polygon","arcs":[[-8087,8087]],"properties":{"id":"24662351","dp":3520,"de":0}},{"type":"Polygon","arcs":[[-8081,-8084,-8088,-8086,8088,8089,8090]],"properties":{"id":"24662352","dp":2555,"de":0}},{"type":"Polygon","arcs":[[8091,-8089,-8085,-5677,-5659,-5366,8092]],"properties":{"id":"24662353","dp":4427,"de":724}},{"type":"Polygon","arcs":[[8093,-8090,-8092,8094]],"properties":{"id":"24662354","dp":3846,"de":0}},{"type":"Polygon","arcs":[[8095,-8095,-8093,8096,-8078]],"properties":{"id":"24662355","dp":4972,"de":2426}},{"type":"Polygon","arcs":[[-8077,-8082,-8091,-8094,-8096]],"properties":{"id":"24662356","dp":3809,"de":751}},{"type":"Polygon","arcs":[[-5431,-5434,-8079,-8097,-5365,8097,-5426,-5428]],"properties":{"id":"24662357","dp":3637,"de":1810}},{"type":"Polygon","arcs":[[-5364,-5260,-3497,8098,-8098]],"properties":{"id":"24662358","dp":8724,"de":358}},{"type":"Polygon","arcs":[[-8099,-3502,8099,-5421,-5427]],"properties":{"id":"24662359","dp":6330,"de":0}},{"type":"Polygon","arcs":[[-5369,-5652,8100,-3500]],"properties":{"id":"24662362","dp":3626,"de":0}},{"type":"Polygon","arcs":[[-5422,-8100,-3501,-8101,-5651,8101]],"properties":{"id":"24662363","dp":2313,"de":287}},{"type":"Polygon","arcs":[[-1251,-1314,-7964,-1264,-1258],[8102]],"properties":{"id":"24662115","dp":3939,"de":68855}},{"type":"Polygon","arcs":[[-8103]],"properties":{"id":"24662116","dp":16738,"de":73538}},{"type":"Polygon","arcs":[[8103,8104,8105,-3422,8106,8107]],"properties":{"id":"24662117","dp":2580,"de":0}},{"type":"Polygon","arcs":[[8108,-3423,-8106]],"properties":{"id":"24662118","dp":5803,"de":765}},{"type":"Polygon","arcs":[[-8105,8109,8110,-3424,-8109]],"properties":{"id":"24662119","dp":5864,"de":2286}},{"type":"Polygon","arcs":[[8111,-8110,-8104,8112]],"properties":{"id":"24662120","dp":5859,"de":0}},{"type":"Polygon","arcs":[[-2451,-2455,8113,-8112,8114]],"properties":{"id":"24662121","dp":7174,"de":0}},{"type":"MultiPolygon","arcs":[[[-8114,-2454,8115,-3425,-8111]],[[-2534,-6011,8116]]],"properties":{"id":"24662122","dp":2888,"de":196}},{"type":"Polygon","arcs":[[-2416,-2444,8117,-2447,-8115,-8113,-8108,8118]],"properties":{"id":"24662123","dp":3304,"de":512}},{"type":"Polygon","arcs":[[-2443,-2448,-8118]],"properties":{"id":"24662124","dp":10395,"de":0}},{"type":"Polygon","arcs":[[-3385,-3387,-3026,-2865,-2780,-213,8119]],"properties":{"id":"24662125","dp":15865,"de":2524}},{"type":"Polygon","arcs":[[-8120,-217,-220,-3202]],"properties":{"id":"24662126","dp":13625,"de":5500}},{"type":"Polygon","arcs":[[-2613,-2872,8120,-2601]],"properties":{"id":"24662127","dp":7707,"de":1115}},{"type":"Polygon","arcs":[[-2871,8121,-2592,8122,-8121]],"properties":{"id":"24662128","dp":8406,"de":2363}},{"type":"Polygon","arcs":[[-2602,-8123,-2591]],"properties":{"id":"24662129","dp":13488,"de":3685}},{"type":"Polygon","arcs":[[-7750,-7752,-7755,-7758,-2570,-2574,-2904]],"properties":{"id":"24662130","dp":5549,"de":9287}},{"type":"Polygon","arcs":[[-3609,-5956,8123,8124,-3604]],"properties":{"id":"24662444","dp":7695,"de":1810}},{"type":"Polygon","arcs":[[8125,-8124,-5955,-3510]],"properties":{"id":"24662445","dp":17926,"de":1295}},{"type":"Polygon","arcs":[[-3508,8126,8127]],"properties":{"id":"24662447","dp":12965,"de":0}},{"type":"Polygon","arcs":[[8128,-8126,-3509,-8128,8129,8130,8131]],"properties":{"id":"24662448","dp":22293,"de":0}},{"type":"Polygon","arcs":[[-8127,-3507,8132,-8130]],"properties":{"id":"24662449","dp":12234,"de":0}},{"type":"Polygon","arcs":[[-8131,-8133,-3513,8133,8134]],"properties":{"id":"24662450","dp":17622,"de":0}},{"type":"Polygon","arcs":[[-3512,-5954,8135,-8134]],"properties":{"id":"24662452","dp":27269,"de":0}},{"type":"Polygon","arcs":[[8136,-8136,-5953,8137]],"properties":{"id":"24662453","dp":24170,"de":2849}},{"type":"Polygon","arcs":[[8138,8139,-8138,-5952,-6037,-4358,8140]],"properties":{"id":"24662454","dp":12348,"de":910}},{"type":"Polygon","arcs":[[-8139,8141,8142]],"properties":{"id":"24662455","dp":11007,"de":0}},{"type":"Polygon","arcs":[[-3606,-8132,-8135,-8137,-8140,-8143,8143,-4363,8144]],"properties":{"id":"24662456","dp":7475,"de":1288}},{"type":"Polygon","arcs":[[-8142,-8141,-4357,-4364,-8144]],"properties":{"id":"24662457","dp":9683,"de":0}},{"type":"Polygon","arcs":[[8145,-3607,-8145,-4371,8146]],"properties":{"id":"24662458","dp":2625,"de":905}},{"type":"Polygon","arcs":[[8147,-8147,-4370,-4543,-4551]],"properties":{"id":"24662459","dp":3126,"de":0}},{"type":"Polygon","arcs":[[-7893,-3480]],"properties":{"id":"24661723","dp":14498,"de":1781}},{"type":"Polygon","arcs":[[8148,-852,-846,-8011,-7785,8149]],"properties":{"id":"24662154","dp":8850,"de":2331}},{"type":"Polygon","arcs":[[-2309,8150,8151,8152,8153,-8150,-7784]],"properties":{"id":"24662155","dp":13151,"de":2675}},{"type":"Polygon","arcs":[[8154,-8151,-2308]],"properties":{"id":"24662156","dp":5806,"de":1663}},{"type":"Polygon","arcs":[[8155,8156,-8152,-8155,-2307]],"properties":{"id":"24662157","dp":13811,"de":1647}},{"type":"Polygon","arcs":[[8157,-8156,-2306]],"properties":{"id":"24662158","dp":8404,"de":1033}},{"type":"Polygon","arcs":[[-2305,-987,-8153,-8157,-8158]],"properties":{"id":"24662159","dp":10089,"de":1485}},{"type":"Polygon","arcs":[[-986,8158,-853,-8149,-8154]],"properties":{"id":"24662160","dp":14163,"de":1951}},{"type":"Polygon","arcs":[[-960,-854,-8159]],"properties":{"id":"24662161","dp":14819,"de":2972}},{"type":"Polygon","arcs":[[8159,-7323,-7897,8160,8161,8162,8163,8164]],"properties":{"id":"24662475","dp":2046,"de":813}},{"type":"Polygon","arcs":[[8165,8166,-8163,8167]],"properties":{"id":"24662476","dp":11038,"de":5576}},{"type":"Polygon","arcs":[[8168,-8168,-8162,8169,8170,8171]],"properties":{"id":"24662477","dp":5435,"de":1136}},{"type":"Polygon","arcs":[[-8166,-8169,8172,-3452,8173]],"properties":{"id":"24662478","dp":17293,"de":2125}},{"type":"Polygon","arcs":[[-3453,-8173,-8172,8174]],"properties":{"id":"24662479","dp":3720,"de":3116}},{"type":"Polygon","arcs":[[-8175,-8171,8175,8176,8177,8178,-3454]],"properties":{"id":"24662480","dp":2279,"de":0}},{"type":"Polygon","arcs":[[-3407,8179,8180,8181,-8167,-8174,-3451]],"properties":{"id":"24662483","dp":10054,"de":1432}},{"type":"MultiPolygon","arcs":[[[-2114,8182,-7821,-6012,-1937,8183,-2106,-2110]],[[-4635,8184,-4624]]],"properties":{"id":"24662182","dp":2991,"de":455}},{"type":"Polygon","arcs":[[-1936,-2103,-8184]],"properties":{"id":"24662183","dp":9398,"de":0}},{"type":"Polygon","arcs":[[-5387,-6026,-7820,-7830,-7835,-1792,-1798,-5378,-5382]],"properties":{"id":"24662187","dp":2556,"de":5216}},{"type":"Polygon","arcs":[[-1780,-7838]],"properties":{"id":"24662192","dp":7263,"de":3092}},{"type":"Polygon","arcs":[[8185,8186,-3409,-3459,8187,8188]],"properties":{"id":"24662502","dp":13262,"de":658}},{"type":"Polygon","arcs":[[-3458,8189,-8188]],"properties":{"id":"24662503","dp":24772,"de":1893}},{"type":"Polygon","arcs":[[-8189,-8190,-3457,8190,8191,8192]],"properties":{"id":"24662504","dp":6754,"de":883}},{"type":"Polygon","arcs":[[-8192,8193,8194,8195,8196,8197]],"properties":{"id":"24662505","dp":4035,"de":1491}},{"type":"Polygon","arcs":[[-8191,-3456,8198,-8194]],"properties":{"id":"24662506","dp":4217,"de":1139}},{"type":"Polygon","arcs":[[8199,-8195,-8199,-3455,-8179,8200]],"properties":{"id":"24662507","dp":2845,"de":553}},{"type":"Polygon","arcs":[[8201,-8201,-8178,8202]],"properties":{"id":"24662508","dp":4187,"de":397}},{"type":"Polygon","arcs":[[8203,8204,-8203,8205,8206]],"properties":{"id":"24662509","dp":3635,"de":506}},{"type":"Polygon","arcs":[[8207,8208,-8207,8209]],"properties":{"id":"24662510","dp":5852,"de":0}},{"type":"Polygon","arcs":[[-8208,8210,8211]],"properties":{"id":"24662511","dp":10196,"de":0}},{"type":"Polygon","arcs":[[-3518,8212,8213,-8211,-8210,-8206,-8177,8214]],"properties":{"id":"24662512","dp":3717,"de":471}},{"type":"Polygon","arcs":[[8215,8216,-8213,-3517,8217]],"properties":{"id":"24662513","dp":6741,"de":561}},{"type":"Polygon","arcs":[[8218,8219,8220,-8218,-3516,8221]],"properties":{"id":"24662515","dp":5264,"de":1064}},{"type":"Polygon","arcs":[[8222,-8222,-3515,8223]],"properties":{"id":"24662516","dp":12660,"de":0}},{"type":"Polygon","arcs":[[8224,-5423,-8102,8225,-5927]],"properties":{"id":"24662364","dp":3878,"de":0}},{"type":"Polygon","arcs":[[-5928,-8226,-5654,-4941,-5932]],"properties":{"id":"24662365","dp":3614,"de":533}},{"type":"Polygon","arcs":[[-6690,-6692,-6683,8226,-3577,-7726]],"properties":{"id":"24662762","dp":1961,"de":5063}},{"type":"Polygon","arcs":[[-6680,8227,8228,-3578,-8227]],"properties":{"id":"24662763","dp":3052,"de":2800}},{"type":"Polygon","arcs":[[-6678,8229,8230,8231,-8228,-6679]],"properties":{"id":"24662764","dp":13112,"de":0}},{"type":"Polygon","arcs":[[8232,8233,8234,-6894,-3579,-8229,-8232]],"properties":{"id":"24662765","dp":3211,"de":601}},{"type":"Polygon","arcs":[[-8235,8235,8236,-6890]],"properties":{"id":"24662766","dp":21261,"de":0}},{"type":"Polygon","arcs":[[8237,8238,-8236,-8234]],"properties":{"id":"24662767","dp":21181,"de":0}},{"type":"Polygon","arcs":[[8239,8240,8241,-8238,-8233,-8231]],"properties":{"id":"24662768","dp":20216,"de":0}},{"type":"Polygon","arcs":[[8242,-3488,-3757,-3754,-3750]],"properties":{"id":"24661725","dp":2004,"de":984}},{"type":"Polygon","arcs":[[-3486,8243]],"properties":{"id":"24661726","dp":5105,"de":645}},{"type":"Polygon","arcs":[[-3487,-8244,-3485,-3953,-3758]],"properties":{"id":"24661727","dp":374,"de":2802}},{"type":"Polygon","arcs":[[-2344,-1774,8244,-6109,8245,8246,8247,8248,8249,8250,8251,-2334,-2335]],"properties":{"id":"24662218","dp":2745,"de":251}},{"type":"Polygon","arcs":[[8252,8253,-2331,-8252]],"properties":{"id":"24662219","dp":3553,"de":1027}},{"type":"Polygon","arcs":[[-8251,8254,8255,-8253]],"properties":{"id":"24662220","dp":7736,"de":2389}},{"type":"Polygon","arcs":[[8256,-8255,-8250,8257,8258]],"properties":{"id":"24662221","dp":3659,"de":615}},{"type":"Polygon","arcs":[[-8258,-8249,8259]],"properties":{"id":"24662222","dp":3714,"de":314}},{"type":"Polygon","arcs":[[-8259,-8260,-8248,8260,8261]],"properties":{"id":"24662223","dp":3242,"de":340}},{"type":"Polygon","arcs":[[-8261,-8247,8262,8263,8264]],"properties":{"id":"24662224","dp":3237,"de":0}},{"type":"Polygon","arcs":[[8265,-8262,-8265,8266,8267,8268]],"properties":{"id":"24662225","dp":3984,"de":580}},{"type":"Polygon","arcs":[[8269,-8269,8270]],"properties":{"id":"24662226","dp":2941,"de":514}},{"type":"Polygon","arcs":[[8271,8272,-8270,8273]],"properties":{"id":"24662227","dp":3996,"de":375}},{"type":"Polygon","arcs":[[-3548,8274,8275,-8274,-8271,-8268,8276,8277,-2034]],"properties":{"id":"24662228","dp":2285,"de":420}},{"type":"Polygon","arcs":[[-2332,-8254,8278,-8272,-8276,8279,-2329]],"properties":{"id":"24662229","dp":2847,"de":0}},{"type":"Polygon","arcs":[[-8256,-8257,-8266,-8273,-8279]],"properties":{"id":"24662230","dp":4047,"de":288}},{"type":"Polygon","arcs":[[-8280,-8275,-3547,-2330]],"properties":{"id":"24662231","dp":4144,"de":0}},{"type":"Polygon","arcs":[[8280,-8277,-8267,-8264]],"properties":{"id":"24662232","dp":8497,"de":0}},{"type":"Polygon","arcs":[[8281,8282,8283,8284,8285,-6378,-6385,-1528,-8278,-8281]],"properties":{"id":"24662233","dp":3857,"de":2193}},{"type":"Polygon","arcs":[[-5939,-4953,8286,-7996,-5942]],"properties":{"id":"24662371","dp":3734,"de":345}},{"type":"Polygon","arcs":[[8287,-8074,-8065,-8060]],"properties":{"id":"24662649","dp":14951,"de":4206}},{"type":"Polygon","arcs":[[8288,8289,-8288,8290]],"properties":{"id":"24662650","dp":6849,"de":940}},{"type":"Polygon","arcs":[[-6420,8291,-8291,-8059,-6422]],"properties":{"id":"24662651","dp":12148,"de":5177}},{"type":"Polygon","arcs":[[-6419,-6416,8292,8293,-8289,-8292]],"properties":{"id":"24662652","dp":6103,"de":878}},{"type":"Polygon","arcs":[[-8294,8294,8295,8296]],"properties":{"id":"24662653","dp":13477,"de":2954}},{"type":"Polygon","arcs":[[8297,8298,8299,-8295,-8293,-6415]],"properties":{"id":"24662654","dp":6030,"de":2576}},{"type":"Polygon","arcs":[[-8300,8300,8301,8302,-8296]],"properties":{"id":"24662655","dp":13144,"de":1417}},{"type":"Polygon","arcs":[[8303,8304,-8301,-8299]],"properties":{"id":"24662656","dp":12317,"de":0}},{"type":"Polygon","arcs":[[8305,8306,8307,-8302,-8305]],"properties":{"id":"24662657","dp":8948,"de":1091}},{"type":"Polygon","arcs":[[8308,8309,-6198,8310,8311,8312,-8307]],"properties":{"id":"24662658","dp":5459,"de":5550}},{"type":"Polygon","arcs":[[-8312,8313,8314]],"properties":{"id":"24662659","dp":18298,"de":1030}},{"type":"Polygon","arcs":[[-8297,-8303,-8308,-8313,-8315,8315,-8070,-8290]],"properties":{"id":"24662660","dp":3396,"de":3403}},{"type":"Polygon","arcs":[[-8316,8316,8317,8318,-8071]],"properties":{"id":"24662661","dp":6433,"de":1689}},{"type":"Polygon","arcs":[[-7997,-8287,-4952,-5640,-5636,8319,-7991,-7994]],"properties":{"id":"24662372","dp":3937,"de":493}},{"type":"Polygon","arcs":[[-5635,8320,-8320]],"properties":{"id":"24662373","dp":5025,"de":0}},{"type":"Polygon","arcs":[[-5629,8321,-7989,-8321]],"properties":{"id":"24662374","dp":3065,"de":963}},{"type":"Polygon","arcs":[[-5628,8322,8323,8324,-7984,-8322]],"properties":{"id":"24662375","dp":4733,"de":658}},{"type":"Polygon","arcs":[[-5623,-5614,8325,-8323,-5627]],"properties":{"id":"24662376","dp":2997,"de":581}},{"type":"Polygon","arcs":[[8326,-8324,-8326,-5613,-5606,8327]],"properties":{"id":"24662377","dp":3448,"de":446}},{"type":"Polygon","arcs":[[-7985,-8325,-8327,8328,8329]],"properties":{"id":"24662378","dp":3647,"de":0}},{"type":"Polygon","arcs":[[8330,-8329,-8328,-5612,8331]],"properties":{"id":"24662379","dp":3241,"de":0}},{"type":"Polygon","arcs":[[-7986,-8330,-8331,8332,8333]],"properties":{"id":"24662380","dp":3099,"de":0}},{"type":"Polygon","arcs":[[8334,8335,-8333,-8332,-5611,-5603]],"properties":{"id":"24662381","dp":4255,"de":0}},{"type":"Polygon","arcs":[[-7987,-8334,-8336,8336,-7982]],"properties":{"id":"24662382","dp":3573,"de":0}},{"type":"Polygon","arcs":[[-8335,-5602,-5600,-7983,-8337]],"properties":{"id":"24662383","dp":3995,"de":490}},{"type":"Polygon","arcs":[[8337,8338,8339,8340]],"properties":{"id":"24662795","dp":6055,"de":628}},{"type":"Polygon","arcs":[[8341,8342,-8341,8343,-6849]],"properties":{"id":"24662796","dp":5903,"de":2245}},{"type":"Polygon","arcs":[[8344,-8342,8345]],"properties":{"id":"24662797","dp":12400,"de":1473}},{"type":"Polygon","arcs":[[-6513,8346,-6507,-8338,-8343,-8345,8347,-6518]],"properties":{"id":"24662798","dp":7111,"de":1268}},{"type":"Polygon","arcs":[[-6512,-6502,-8347]],"properties":{"id":"24662799","dp":7366,"de":0}},{"type":"Polygon","arcs":[[-6519,-8348,-8346,-6848,8348,-6852]],"properties":{"id":"24662800","dp":6167,"de":623}},{"type":"Polygon","arcs":[[-8349,-6846,-6853]],"properties":{"id":"24662801","dp":10099,"de":2871}},{"type":"Polygon","arcs":[[-3611,8349,-3601,-8146,-8148,-4550]],"properties":{"id":"24662460","dp":3895,"de":1150}},{"type":"Polygon","arcs":[[-5935,-5941,-5944,-7995,-8000,8350,8351]],"properties":{"id":"24662390","dp":2804,"de":400}},{"type":"Polygon","arcs":[[-5304,-5302,8352,8353,-8351,-7999,-5579]],"properties":{"id":"24662391","dp":4464,"de":876}},{"type":"Polygon","arcs":[[-5287,8354,8355,8356,-8353,-5301,-5289]],"properties":{"id":"24662392","dp":5260,"de":660}},{"type":"Polygon","arcs":[[8357,8358,8359,-8356]],"properties":{"id":"24662393","dp":3702,"de":0}},{"type":"Polygon","arcs":[[8360,8361,-8358,-8355,-5286,8362]],"properties":{"id":"24662394","dp":4310,"de":282}},{"type":"Polygon","arcs":[[-5930,-5937,8363,-8359,-8362,8364]],"properties":{"id":"24662395","dp":3556,"de":466}},{"type":"Polygon","arcs":[[-5936,-8352,-8354,-8357,-8360,-8364]],"properties":{"id":"24662396","dp":3551,"de":0}},{"type":"Polygon","arcs":[[-5407,-5419,-5424,-8225,-5931,-8365,-8361,8365]],"properties":{"id":"24662397","dp":1083,"de":645}},{"type":"Polygon","arcs":[[-8366,-8363,8366,8367,-5408]],"properties":{"id":"24662398","dp":3300,"de":828}},{"type":"Polygon","arcs":[[-8367,-5285,8368,8369]],"properties":{"id":"24662399","dp":5645,"de":931}},{"type":"Polygon","arcs":[[-8368,-8370,8370,8371,8372,8373,-5411]],"properties":{"id":"24662400","dp":5122,"de":1226}},{"type":"Polygon","arcs":[[-8371,-8369,-5284,-5278,-5283,8374,8375]],"properties":{"id":"24662401","dp":3008,"de":531}},{"type":"Polygon","arcs":[[-8372,-8376,8376]],"properties":{"id":"24662402","dp":9081,"de":0}},{"type":"Polygon","arcs":[[-8028,8377,-8373,-8377,-8375,-5282,-8039,-8033]],"properties":{"id":"24662403","dp":6617,"de":0}},{"type":"Polygon","arcs":[[-5412,-8374,-8378,-8027]],"properties":{"id":"24662404","dp":9221,"de":0}},{"type":"Polygon","arcs":[[-3582,-6946,-6898,8378]],"properties":{"id":"24662822","dp":3355,"de":0}},{"type":"Polygon","arcs":[[-8379,-6897,-882,8379]],"properties":{"id":"24662823","dp":4159,"de":0}},{"type":"Polygon","arcs":[[-3583,-8380,-881,8380,-6943,-6945]],"properties":{"id":"24662824","dp":5738,"de":0}},{"type":"Polygon","arcs":[[-6937,-6944,-8381,-880,8381]],"properties":{"id":"24662825","dp":4732,"de":0}},{"type":"Polygon","arcs":[[-6938,-8382,-884,8382]],"properties":{"id":"24662826","dp":9033,"de":0}},{"type":"Polygon","arcs":[[-8383,-879,8383,-6939]],"properties":{"id":"24662827","dp":8535,"de":656}},{"type":"Polygon","arcs":[[-8384,-875,8384,-6941]],"properties":{"id":"24662828","dp":4735,"de":0}},{"type":"Polygon","arcs":[[-8385,-874,-869,-6748,-6749,-6752]],"properties":{"id":"24662829","dp":6797,"de":0}},{"type":"Polygon","arcs":[[8385,8386,-8051,-5159]],"properties":{"id":"24662417","dp":9238,"de":538}},{"type":"Polygon","arcs":[[-5155,8387,-5158,-3444]],"properties":{"id":"24662418","dp":8750,"de":0}},{"type":"Polygon","arcs":[[8388,-8386,-8388,-5154,-5975]],"properties":{"id":"24662419","dp":6129,"de":0}},{"type":"Polygon","arcs":[[-8032,-8036,-8038,-8041,-8048,-8050,-8387,-8389,-5974,8389]],"properties":{"id":"24662420","dp":539,"de":159}},{"type":"Polygon","arcs":[[-5957,-1531,-1526,-1524,-1520,-1519,-1513,8390,-5403,-8026,-3503,-8030,-8390,-5973]],"properties":{"id":"24662421","dp":93,"de":1414}},{"type":"Polygon","arcs":[[-1512,8391,8392,-6588,-6582,-6587,-6591,-5392,-8391]],"properties":{"id":"24662422","dp":1808,"de":351}},{"type":"Polygon","arcs":[[8393,-6589,-8393]],"properties":{"id":"24662423","dp":2362,"de":0}},{"type":"Polygon","arcs":[[-6574,-6580,-6590,-8394,-8392,-1511,-1504]],"properties":{"id":"24662424","dp":2937,"de":0}},{"type":"Polygon","arcs":[[-1932,-7717,-3522,-1610,-1615,-1617,-1619,-1622,-1627,-6930,8394,8395,-7094,-7101,-1404,-1410,-1423]],"properties":{"id":"24662849","dp":137,"de":2719}},{"type":"Polygon","arcs":[[8396,-8395,-6929,-6921,-6761,-6758,8397]],"properties":{"id":"24662850","dp":1660,"de":2564}},{"type":"Polygon","arcs":[[8398,-8398,-2084,8399,8400,8401]],"properties":{"id":"24662851","dp":6271,"de":2103}},{"type":"Polygon","arcs":[[-8400,-2087,-2090,8402,8403]],"properties":{"id":"24662852","dp":7329,"de":1475}},{"type":"Polygon","arcs":[[-8404,8404,8405,-8401]],"properties":{"id":"24662853","dp":8669,"de":0}},{"type":"Polygon","arcs":[[8406,-8405,-8403,-2093,8407,8408]],"properties":{"id":"24662854","dp":7892,"de":0}},{"type":"Polygon","arcs":[[-8402,-8406,-8407,8409,8410]],"properties":{"id":"24662855","dp":8326,"de":0}},{"type":"Polygon","arcs":[[8411,-8410,-8409,8412,-6711]],"properties":{"id":"24662856","dp":5615,"de":0}},{"type":"Polygon","arcs":[[-8408,-6723,-6712,-8413]],"properties":{"id":"24662857","dp":6407,"de":1388}},{"type":"Polygon","arcs":[[-8314,-8311,-6197,8413,-8317]],"properties":{"id":"24662662","dp":7637,"de":1026}},{"type":"Polygon","arcs":[[-8318,-8414,-6196,-6494,8414]],"properties":{"id":"24662663","dp":11495,"de":0}},{"type":"Polygon","arcs":[[-8319,-8415,-6493,8415,8416,-8072]],"properties":{"id":"24662664","dp":9173,"de":0}},{"type":"Polygon","arcs":[[-8416,-6495,8417,8418]],"properties":{"id":"24662665","dp":10692,"de":1207}},{"type":"Polygon","arcs":[[-8073,-8417,-8419,8419,-7315,-8069]],"properties":{"id":"24662666","dp":6614,"de":1566}},{"type":"Polygon","arcs":[[-8420,8420,8421,-7310,-7313]],"properties":{"id":"24662667","dp":7802,"de":1121}},{"type":"Polygon","arcs":[[-8418,-6287,8422,8423,-8421]],"properties":{"id":"24662668","dp":8275,"de":1793}},{"type":"Polygon","arcs":[[-7311,-8422,-8424,8424,-6285,-6294,-6301]],"properties":{"id":"24662669","dp":8402,"de":1341}},{"type":"Polygon","arcs":[[-6286,-8425,-8423]],"properties":{"id":"24662670","dp":7604,"de":0}},{"type":"Polygon","arcs":[[-6335,-6330,8425,8426,-5697]],"properties":{"id":"24663047","dp":2602,"de":2169}},{"type":"Polygon","arcs":[[-5694,-5698,-8427,8427,8428]],"properties":{"id":"24663048","dp":3553,"de":419}},{"type":"Polygon","arcs":[[-6843,-6837,-5663,-5695,-8429,8429]],"properties":{"id":"24663049","dp":4050,"de":746}},{"type":"Polygon","arcs":[[8430,8431,8432,-8241]],"properties":{"id":"24662769","dp":25506,"de":0}},{"type":"Polygon","arcs":[[8433,-8432,8434,8435]],"properties":{"id":"24662770","dp":21375,"de":0}},{"type":"Polygon","arcs":[[8436,-8436,8437,8438]],"properties":{"id":"24662771","dp":20604,"de":0}},{"type":"Polygon","arcs":[[-6671,-8438,-8435,-8431,-8240,-8230,-6677]],"properties":{"id":"24662772","dp":16165,"de":0}},{"type":"Polygon","arcs":[[-8437,8439,8440,-8237,-8239,-8242,-8433,-8434]],"properties":{"id":"24662773","dp":23203,"de":0}},{"type":"Polygon","arcs":[[8441,8442,8443,8444,8445,-6891,-8441]],"properties":{"id":"24662774","dp":23203,"de":0}},{"type":"Polygon","arcs":[[8446,-6886,-6892,-8446]],"properties":{"id":"24662775","dp":10721,"de":0}},{"type":"Polygon","arcs":[[-8445,8447,-6887,-8447]],"properties":{"id":"24662776","dp":19648,"de":0}},{"type":"Polygon","arcs":[[-8444,8448,-6888,-8448]],"properties":{"id":"24662777","dp":17637,"de":0}},{"type":"Polygon","arcs":[[8449,-6889,-8449,-8443]],"properties":{"id":"24662778","dp":17371,"de":1359}},{"type":"Polygon","arcs":[[-8450,-8442,8450,8451,8452,-6884]],"properties":{"id":"24662779","dp":16058,"de":0}},{"type":"Polygon","arcs":[[8453,8454,-8452]],"properties":{"id":"24662780","dp":11947,"de":0}},{"type":"Polygon","arcs":[[-8453,-8455,8455,-6871,-6874,-6881]],"properties":{"id":"24662781","dp":16317,"de":0}},{"type":"Polygon","arcs":[[-8454,-8451,-8440,-8439,-6670,-6668,-7723,8456,8457,-8456]],"properties":{"id":"24662782","dp":4226,"de":2476}},{"type":"Polygon","arcs":[[8458,-6867,-6868,-8458]],"properties":{"id":"24662783","dp":6920,"de":1739}},{"type":"Polygon","arcs":[[-7722,-7720,8459,8460,-8459,-8457]],"properties":{"id":"24662784","dp":6180,"de":431}},{"type":"Polygon","arcs":[[-8461,8461,8462,-6862,-6865]],"properties":{"id":"24662785","dp":6323,"de":0}},{"type":"Polygon","arcs":[[-7719,8463,8464,8465,-8462,-8460]],"properties":{"id":"24662786","dp":3458,"de":468}},{"type":"Polygon","arcs":[[-3610,-3602,-8350]],"properties":{"id":"24662461","dp":4240,"de":0}},{"type":"Polygon","arcs":[[-8125,-8129,-3605]],"properties":{"id":"24662463","dp":11983,"de":0}},{"type":"Polygon","arcs":[[-5967,8466,8467,-6032]],"properties":{"id":"24662465","dp":5102,"de":759}},{"type":"Polygon","arcs":[[-5966,-5979,-7329,8468,8469,-8467]],"properties":{"id":"24662466","dp":4620,"de":338}},{"type":"Polygon","arcs":[[8470,8471,-8469,-7328,-7325,8472]],"properties":{"id":"24662467","dp":2391,"de":0}},{"type":"Polygon","arcs":[[8473,-8471,8474,8475,8476,8477,8478]],"properties":{"id":"24662468","dp":4822,"de":559}},{"type":"Polygon","arcs":[[-8473,8479,-8475]],"properties":{"id":"24662469","dp":3556,"de":564}},{"type":"Polygon","arcs":[[8480,-8480,-7324,-8160,8481,8482]],"properties":{"id":"24662470","dp":3623,"de":279}},{"type":"Polygon","arcs":[[8483,-8476,-8481,8484]],"properties":{"id":"24662471","dp":7373,"de":0}},{"type":"Polygon","arcs":[[8485,-8485,-8483,8486]],"properties":{"id":"24662472","dp":5387,"de":0}},{"type":"Polygon","arcs":[[8487,-8484,-8486,8488]],"properties":{"id":"24662473","dp":12297,"de":0}},{"type":"Polygon","arcs":[[8489,-8489,-8487,-8482,-8165,8490]],"properties":{"id":"24662474","dp":4198,"de":270}},{"type":"Polygon","arcs":[[-6810,8491,-912,-910,-6832,-6827,-6822]],"properties":{"id":"24662897","dp":3813,"de":123}},{"type":"Polygon","arcs":[[8492,-913,-8492,-6809]],"properties":{"id":"24662898","dp":4568,"de":568}},{"type":"Polygon","arcs":[[8493,-907,-8493,-6808,8494]],"properties":{"id":"24662899","dp":2107,"de":1585}},{"type":"Polygon","arcs":[[8495,8496,-902,-904,-8494]],"properties":{"id":"24662900","dp":4924,"de":665}},{"type":"Polygon","arcs":[[-8497,8497,-6731,8498,-897,-903]],"properties":{"id":"24662901","dp":2928,"de":1075}},{"type":"Polygon","arcs":[[-898,-8499,-6735,-887,-893]],"properties":{"id":"24662902","dp":2286,"de":710}},{"type":"Polygon","arcs":[[-7096,8499,-6717,-6722,-8498,-8496,-8495,-6807]],"properties":{"id":"24662903","dp":521,"de":1841}},{"type":"Polygon","arcs":[[-8396,-8397,-8399,-8411,-8412,-6715,-6718,-8500,-7095]],"properties":{"id":"24662904","dp":812,"de":707}},{"type":"Polygon","arcs":[[8500,-8284]],"properties":{"id":"24662234","dp":14190,"de":0}},{"type":"Polygon","arcs":[[8501,-8285,-8501,-8283]],"properties":{"id":"24662235","dp":16380,"de":3095}},{"type":"Polygon","arcs":[[8502,-8181,8503]],"properties":{"id":"24662484","dp":19962,"de":1492}},{"type":"Polygon","arcs":[[8504,8505,-8491,-8164,-8182,-8503,8506,-3405]],"properties":{"id":"24662485","dp":5838,"de":1651}},{"type":"Polygon","arcs":[[-8507,-8504,-8180,-3406]],"properties":{"id":"24662486","dp":14878,"de":0}},{"type":"Polygon","arcs":[[-8187,8507,-3410]],"properties":{"id":"24662489","dp":9876,"de":2160}},{"type":"Polygon","arcs":[[8508,-8508,8509,-4335]],"properties":{"id":"24662490","dp":19199,"de":0}},{"type":"Polygon","arcs":[[-8509,8510,-3411]],"properties":{"id":"24662491","dp":34928,"de":0}},{"type":"Polygon","arcs":[[-3402,-8511,-4334,-5997,8511]],"properties":{"id":"24662492","dp":12140,"de":0}},{"type":"Polygon","arcs":[[8512,-8470,-8472,-8474,8513,8514,8515,8516,-3403,-8512,-5996,-6034]],"properties":{"id":"24662493","dp":1490,"de":1459}},{"type":"Polygon","arcs":[[-8468,-8513,-6033]],"properties":{"id":"24662494","dp":4528,"de":1570}},{"type":"Polygon","arcs":[[-8514,-8479,8517,8518]],"properties":{"id":"24662495","dp":9017,"de":0}},{"type":"Polygon","arcs":[[-8478,8519,8520,-8518]],"properties":{"id":"24662496","dp":8538,"de":0}},{"type":"Polygon","arcs":[[-8515,-8519,-8521,8521,8522]],"properties":{"id":"24662497","dp":7138,"de":0}},{"type":"Polygon","arcs":[[-8522,-8520,-8477,-8488,8523]],"properties":{"id":"24662498","dp":6698,"de":0}},{"type":"Polygon","arcs":[[8524,-8516,-8523,-8524,-8490,-8506]],"properties":{"id":"24662499","dp":2859,"de":0}},{"type":"Polygon","arcs":[[-8517,-8525,-8505,-3404]],"properties":{"id":"24662500","dp":5176,"de":1158}},{"type":"Polygon","arcs":[[-8510,-8186,8525,-4336]],"properties":{"id":"24662501","dp":7973,"de":460}},{"type":"Polygon","arcs":[[8526,8527,8528,8529,-1144,-7120,-7121]],"properties":{"id":"24662919","dp":3474,"de":1285}},{"type":"Polygon","arcs":[[8530,-8527,-7122,-7116,-7107]],"properties":{"id":"24662920","dp":5565,"de":1180}},{"type":"Polygon","arcs":[[-6997,8531,-8528,-8531,-7106,-7097,-6805,8532,-7144,-7142]],"properties":{"id":"24662921","dp":173,"de":1649}},{"type":"Polygon","arcs":[[-8529,-8532,-7001,8533,8534,8535]],"properties":{"id":"24662922","dp":6053,"de":1490}},{"type":"Polygon","arcs":[[-8530,-8536,8536,-1145]],"properties":{"id":"24662923","dp":3874,"de":0}},{"type":"Polygon","arcs":[[-8537,-8535,8537,-1146]],"properties":{"id":"24662924","dp":10460,"de":0}},{"type":"Polygon","arcs":[[-8534,8538,-1151,-1147,-8538]],"properties":{"id":"24662925","dp":8115,"de":687}},{"type":"Polygon","arcs":[[-8539,-7000,8539,-3789]],"properties":{"id":"24662926","dp":10821,"de":0}},{"type":"Polygon","arcs":[[-6999,-6996,-3782,-8540]],"properties":{"id":"24662927","dp":7975,"de":0}},{"type":"Polygon","arcs":[[8540,8541,8542,-3520,8543,-2349,8544,8545,8546,8547]],"properties":{"id":"24662518","dp":3065,"de":950}},{"type":"Polygon","arcs":[[-2386,-2397,8548,-3514,-8543,8549,8550,-2388]],"properties":{"id":"24662519","dp":1466,"de":1851}},{"type":"Polygon","arcs":[[-8550,-8542,8551]],"properties":{"id":"24662520","dp":6465,"de":0}},{"type":"Polygon","arcs":[[-8551,-8552,-8541,8552,-2373,-2389]],"properties":{"id":"24662521","dp":6449,"de":464}},{"type":"Polygon","arcs":[[-8553,-8548,8553,-2374]],"properties":{"id":"24662522","dp":7862,"de":703}},{"type":"Polygon","arcs":[[-8554,-8547,8554,-2375]],"properties":{"id":"24662523","dp":9225,"de":1320}},{"type":"Polygon","arcs":[[-8555,-8546,8555,-2369]],"properties":{"id":"24662524","dp":9885,"de":1575}},{"type":"Polygon","arcs":[[-8556,-8545,-2348,8556,-2366]],"properties":{"id":"24662525","dp":5619,"de":1733}},{"type":"Polygon","arcs":[[-8557,-2347,8557,-2359]],"properties":{"id":"24662526","dp":7254,"de":751}},{"type":"Polygon","arcs":[[-8558,-2346,-2360]],"properties":{"id":"24662527","dp":8389,"de":4424}},{"type":"Polygon","arcs":[[-7147,-7145,-8533,-6821,8558,8559,8560,-6815,-6829,-6831,8561,-1139,-1128]],"properties":{"id":"24662936","dp":292,"de":277}},{"type":"Polygon","arcs":[[-6820,8562,-8559]],"properties":{"id":"24662937","dp":3045,"de":0}},{"type":"Polygon","arcs":[[8563,8564,-8560,-8563,-6819]],"properties":{"id":"24662938","dp":626,"de":553}},{"type":"Polygon","arcs":[[-6818,8565,-6816,8566,-8564]],"properties":{"id":"24662939","dp":4716,"de":212}},{"type":"Polygon","arcs":[[-8561,-8565,-8567]],"properties":{"id":"24662940","dp":7082,"de":0}},{"type":"Polygon","arcs":[[-6817,-8566]],"properties":{"id":"24662941","dp":8629,"de":0}},{"type":"Polygon","arcs":[[-6647,8567,-8464,-7718,-6652]],"properties":{"id":"24662787","dp":10380,"de":0}},{"type":"Polygon","arcs":[[8568,-8465,-8568,-6646]],"properties":{"id":"24662788","dp":7279,"de":0}},{"type":"Polygon","arcs":[[-8569,-6645,-6642,-6630,8569,8570,8571,-6863,-8463,-8466]],"properties":{"id":"24662789","dp":3669,"de":1229}},{"type":"Polygon","arcs":[[-6625,-6850,-8344,8572,-8570,-6627]],"properties":{"id":"24662790","dp":4535,"de":608}},{"type":"Polygon","arcs":[[-8340,8573,8574,-8571,-8573]],"properties":{"id":"24662791","dp":7766,"de":431}},{"type":"Polygon","arcs":[[-8575,8575,8576,-8572]],"properties":{"id":"24662792","dp":7101,"de":0}},{"type":"Polygon","arcs":[[8577,-6855,-6864,-8577]],"properties":{"id":"24662793","dp":8053,"de":0}},{"type":"Polygon","arcs":[[-8574,-8339,-6506,8578,-6856,-8578,-8576]],"properties":{"id":"24662794","dp":4649,"de":521}},{"type":"Polygon","arcs":[[-7249,-5125,8579,8580]],"properties":{"id":"24661448","dp":19959,"de":1829}},{"type":"Polygon","arcs":[[-7250,-8581,8581,-7257]],"properties":{"id":"24661449","dp":16301,"de":2397}},{"type":"Polygon","arcs":[[-8582,8582,-7189,-7703]],"properties":{"id":"24661450","dp":14756,"de":2951}},{"type":"Polygon","arcs":[[-8580,8583,-7187,-8583]],"properties":{"id":"24661451","dp":16106,"de":2663}},{"type":"Polygon","arcs":[[8584,-7185,-8584,-5124]],"properties":{"id":"24661452","dp":12818,"de":5369}},{"type":"Polygon","arcs":[[8585,-7186,-8585,-5123,-5121]],"properties":{"id":"24661453","dp":11920,"de":6989}},{"type":"Polygon","arcs":[[8586,-7079,-8586,-5117,-7736]],"properties":{"id":"24661454","dp":11504,"de":7619}},{"type":"Polygon","arcs":[[-7075,-8587,-7735,8587]],"properties":{"id":"24661455","dp":12901,"de":4948}},{"type":"Polygon","arcs":[[-7055,-7067,-7069,-8588,-7733]],"properties":{"id":"24661456","dp":13718,"de":5895}},{"type":"Polygon","arcs":[[-8246,-6112,8588,-6367,-6376,-8286,-8502,-8282,-8263]],"properties":{"id":"24662236","dp":1511,"de":4086}},{"type":"Polygon","arcs":[[-6111,8589,-6108,-6368,-8589]],"properties":{"id":"24662237","dp":3294,"de":422}},{"type":"Polygon","arcs":[[-1098,8590,-1118,-1116]],"properties":{"id":"24662556","dp":11476,"de":0}},{"type":"Polygon","arcs":[[8591,8592,-8205,8593,8594,-1119,-8591,-1097]],"properties":{"id":"24662557","dp":4123,"de":3292}},{"type":"Polygon","arcs":[[8595,-8595,8596,8597]],"properties":{"id":"24662558","dp":8326,"de":0}},{"type":"Polygon","arcs":[[-8598,8598,8599,8600]],"properties":{"id":"24662559","dp":5288,"de":613}},{"type":"Polygon","arcs":[[8601,-8214,-8217,-8599]],"properties":{"id":"24662560","dp":12432,"de":720}},{"type":"Polygon","arcs":[[-8204,-8209,-8212,-8602,-8597,-8594]],"properties":{"id":"24662561","dp":9287,"de":2833}},{"type":"Polygon","arcs":[[-8600,-8216,-8221,8602]],"properties":{"id":"24662562","dp":8028,"de":976}},{"type":"Polygon","arcs":[[-2402,8603,-8603,-8220,8604]],"properties":{"id":"24662563","dp":8239,"de":4731}},{"type":"Polygon","arcs":[[-1120,-8596,-8601,-8604,-2406]],"properties":{"id":"24662564","dp":4582,"de":474}},{"type":"Polygon","arcs":[[-2395,-2403,-8605,-8219,-8223,8605]],"properties":{"id":"24662565","dp":3355,"de":610}},{"type":"Polygon","arcs":[[-2396,-8606,-8224,-8549]],"properties":{"id":"24662566","dp":3272,"de":0}},{"type":"Polygon","arcs":[[-8196,-8200,-8202,-8593,8606]],"properties":{"id":"24662567","dp":3434,"de":622}},{"type":"Polygon","arcs":[[8607,-8197,-8607,-8592,8608]],"properties":{"id":"24662568","dp":3493,"de":565}},{"type":"Polygon","arcs":[[-4328,8609,-8198,-8608,8610]],"properties":{"id":"24662569","dp":6037,"de":1204}},{"type":"Polygon","arcs":[[-3970,-3979,-4329,-8611,-8609,-1107,-5783]],"properties":{"id":"24662570","dp":2161,"de":753}},{"type":"Polygon","arcs":[[-4337,-8526,-8193,-8610,-4332]],"properties":{"id":"24662571","dp":8681,"de":0}},{"type":"Polygon","arcs":[[-2356,8611,-7289]],"properties":{"id":"24662572","dp":9447,"de":1142}},{"type":"Polygon","arcs":[[-8612,-2352,8612,8613,-7290]],"properties":{"id":"24662573","dp":9425,"de":2156}},{"type":"Polygon","arcs":[[-8614,8614,8615,8616]],"properties":{"id":"24662574","dp":7817,"de":7025}},{"type":"Polygon","arcs":[[8617,8618,-8615,-8613,-2351,8619,-8309,-8306,-8304]],"properties":{"id":"24662575","dp":2838,"de":1164}},{"type":"Polygon","arcs":[[-8616,-8619,8620,8621]],"properties":{"id":"24662576","dp":10968,"de":0}},{"type":"Polygon","arcs":[[-7282,8622,-8621,-8618,-8298]],"properties":{"id":"24662577","dp":9951,"de":1539}},{"type":"Polygon","arcs":[[-7291,-8617,-8622,-8623,-7281,-7285]],"properties":{"id":"24662578","dp":8510,"de":5229}}]}},"arcs":[[[7594,1708],[19,-83],[3,-12]],[[7616,1613],[-16,-5],[-10,-3]],[[7590,1605],[-3,12],[-2,11],[-6,28],[-7,33],[-3,12]],[[7569,1701],[25,7]],[[7554,1595],[-2,11],[-16,73],[-3,11]],[[7533,1690],[17,5],[19,6]],[[7590,1605],[-19,-6],[-17,-4]],[[7517,1685],[16,5]],[[7554,1595],[-18,-6]],[[7536,1589],[-2,12],[-15,73],[-2,11]],[[7518,1584],[-18,-5]],[[7500,1579],[-3,10],[-6,33],[-12,52]],[[7479,1674],[20,6]],[[7499,1680],[18,5]],[[7536,1589],[-18,-5]],[[7443,1562],[-2,10],[-7,31],[-2,12],[19,5],[-10,43],[19,6],[19,5]],[[7500,1579],[-19,-6]],[[7481,1573],[-19,-5],[-19,-6]],[[7443,1562],[-18,-5]],[[7425,1557],[-2,10],[-6,31],[-2,12],[-4,19],[-3,10],[-2,7],[-2,1]],[[7404,1647],[1,1],[10,20],[14,29],[2,3]],[[7431,1700],[16,-11],[24,7],[3,1],[5,-23]],[[7431,1700],[29,59],[-3,11]],[[7457,1770],[11,3],[11,3]],[[7479,1776],[3,-12],[15,-72],[2,-12]],[[7479,1776],[18,5]],[[7497,1781],[16,5]],[[7513,1786],[2,-12],[16,-72],[2,-12]],[[7513,1786],[17,5]],[[7530,1791],[19,5]],[[7549,1796],[2,-11],[16,-72],[2,-12]],[[7549,1796],[24,7]],[[7573,1803],[21,-95]],[[7573,1803],[22,7],[19,6]],[[7614,1816],[2,-11],[4,-17],[2,-10]],[[7622,1778],[6,-23],[2,-11],[3,-13],[2,-10]],[[7635,1721],[-18,-6],[-23,-7]],[[7662,1777],[4,-15],[2,-10],[2,-11],[2,-8]],[[7672,1733],[-9,-3],[-9,-3],[2,-11],[13,-56],[7,2],[2,0],[10,0]],[[7688,1662],[3,-12],[3,-12],[-9,-4],[-10,-3]],[[7675,1631],[-18,-5]],[[7657,1626],[-2,10],[-8,34],[-9,40],[-3,11]],[[7622,1778],[19,6],[2,-9],[7,2],[2,0],[10,0]],[[7735,1704],[-1,-22],[-1,-23]],[[7733,1659],[-11,1],[-34,2]],[[7672,1733],[1,-3],[63,-4]],[[7736,1726],[-1,-11],[0,-11]],[[7662,1777],[14,-1],[32,-2],[10,-1],[21,-1],[11,-1]],[[7750,1771],[1,-4]],[[7751,1767],[-1,-10],[-10,-6],[-3,-3],[-1,-11],[0,-11]],[[7808,1698],[-73,6]],[[7751,1767],[65,-4]],[[7816,1763],[-1,-20],[-5,0],[0,-11],[-1,-11],[-1,-11],[0,-12]],[[7750,1771],[1,17],[1,10]],[[7752,1798],[0,10]],[[7752,1808],[66,-4]],[[7818,1804],[-1,-21],[-1,-20]],[[7752,1808],[1,15],[0,6],[1,21],[1,6]],[[7755,1856],[1,17],[0,4],[1,20]],[[7757,1897],[4,-1],[36,-3],[15,-1],[11,-1]],[[7823,1891],[-2,-23],[-1,-23]],[[7820,1845],[-1,-21],[-1,-20]],[[7902,1819],[-8,-30],[-11,-32]],[[7883,1757],[-3,2],[-64,4]],[[7820,1845],[11,0],[38,-3],[9,-1],[-1,-20],[22,-2],[3,0]],[[7823,1891],[10,-1],[37,-2],[1,0],[10,-1],[1,27],[1,30],[1,15],[1,14]],[[7885,1973],[9,0],[10,-1],[3,0]],[[7907,1972],[4,-40],[1,-20]],[[7912,1912],[0,-8],[-2,-28],[-3,-28],[-5,-29]],[[7823,1891],[1,27],[2,30],[-11,0],[-6,1],[2,29]],[[7811,1978],[5,0],[10,-1]],[[7826,1977],[11,0],[5,-1],[9,0],[34,-3]],[[7757,1897],[1,21],[1,5],[0,16]],[[7759,1939],[1,14],[0,6],[2,24]],[[7762,1983],[9,-1],[1,0],[30,-3],[9,-1]],[[7762,1983],[1,29]],[[7763,2012],[2,29]],[[7765,2041],[11,-1],[5,0],[49,-4]],[[7830,2036],[-2,-29],[-2,-30]],[[7717,1942],[1,20],[1,23],[2,30]],[[7721,2015],[9,-1],[24,-1],[9,-1]],[[7759,1939],[-9,0],[-24,2],[-9,1]],[[7674,2018],[1,12],[0,17]],[[7675,2047],[48,-3],[38,-3],[4,0]],[[7721,2015],[-9,0],[-22,2],[-7,0],[-9,1]],[[7671,1945],[1,21]],[[7672,1966],[1,21]],[[7673,1987],[1,21],[0,10]],[[7717,1942],[-9,0],[-28,3],[-9,0]],[[7672,1966],[-9,0],[-70,6]],[[7593,1972],[-3,10],[-2,10],[75,-4],[1,0],[9,-1]],[[7593,1972],[-14,-5]],[[7579,1967],[-7,34]],[[7572,2001],[-3,11],[0,9],[-4,10]],[[7565,2031],[7,6],[23,22],[1,3],[-1,2],[2,7],[3,4],[7,8]],[[7607,2083],[6,-7],[4,-3],[23,-17],[9,-7],[26,-2]],[[7583,1952],[-4,15]],[[7671,1945],[-9,1],[-19,2],[-45,3],[-15,1]],[[7592,1912],[-2,10],[-7,30]],[[7671,1945],[-1,-20],[-2,-21]],[[7668,1904],[-8,1],[-50,3],[-3,8],[-15,-4]],[[7551,1899],[-2,5],[-7,35],[11,3],[11,4],[-11,49],[9,3],[10,3]],[[7592,1912],[-19,-6],[-11,-4],[-11,-3]],[[6769,2744],[-8,6],[-44,32],[-9,7]],[[6708,2789],[10,19],[6,11]],[[6724,2819],[20,-16],[21,-15],[6,11],[7,13]],[[6778,2812],[20,-16],[-12,-23],[-6,-11],[-7,-13],[-4,-5]],[[6744,2698],[-14,11],[-47,35]],[[6683,2744],[12,22],[13,23]],[[6769,2744],[-12,-24],[-6,-11],[-7,-11]],[[6818,2644],[-31,22],[-4,4],[-39,28]],[[6778,2812],[-7,7],[1,2],[1,2],[2,4]],[[6775,2827],[61,-45]],[[6836,2782],[40,-30]],[[6876,2752],[-1,-4],[-2,-3],[-8,-14],[-6,-13],[-13,-23]],[[6846,2695],[-16,-29],[-12,-22]],[[6818,2644],[-7,-13]],[[6811,2631],[-73,56]],[[6738,2687],[6,11]],[[6787,2558],[-23,-1],[-16,3]],[[6748,2560],[6,11],[3,15],[-23,5],[-23,6],[-22,15],[-20,14]],[[6669,2626],[9,13],[9,7],[18,6],[14,-1],[13,24],[6,12]],[[6811,2631],[-6,-11],[-12,-21],[-7,-15],[0,-14],[1,-12]],[[6872,2507],[-3,-1],[-24,-14]],[[6845,2492],[-20,-11],[-11,-3],[-8,-2],[-15,-1]],[[6791,2475],[-1,26],[0,3],[-2,26],[18,2],[5,2],[6,3],[7,6],[-18,13],[-5,2],[-5,1],[-9,-1]],[[6811,2631],[27,-20],[36,-27],[3,-2]],[[6877,2582],[-6,-10],[-12,-22],[-13,-24],[16,-12],[10,-7]],[[6736,2472],[-8,5],[-26,6],[-25,11]],[[6677,2494],[19,20],[2,2],[24,20],[16,11],[10,13]],[[6791,2475],[-28,-2],[-27,-1]],[[6864,2373],[-89,66],[-36,26],[-3,7]],[[6845,2492],[59,-43]],[[6904,2449],[-12,-23],[-13,-24]],[[6879,2402],[-13,-25],[-2,-4]],[[6831,2309],[-90,66]],[[6741,2375],[-59,44]],[[6682,2419],[17,18],[16,18],[16,16],[5,1]],[[6864,2373],[-11,-20]],[[6853,2353],[-12,-21],[-4,-10],[-6,-13]],[[6831,2309],[-11,-22],[-30,22],[-18,-17],[37,-26]],[[6809,2266],[-6,-10],[-11,-14]],[[6792,2242],[-15,11],[-5,-1],[-14,9],[-7,0],[-38,24]],[[6713,2285],[10,20],[2,13],[0,25],[4,10],[12,22]],[[6888,2268],[-11,-22],[-12,-21]],[[6865,2225],[-56,41]],[[6831,2309],[57,-41]],[[6853,2353],[45,-34],[11,-8]],[[6909,2311],[-11,-20],[-10,-23]],[[6879,2402],[56,-41]],[[6935,2361],[-13,-25],[-13,-25]],[[6904,2449],[56,-42]],[[6960,2407],[-12,-23],[-13,-23]],[[6999,2314],[-64,47]],[[6960,2407],[64,-48]],[[7024,2359],[-12,-22],[-13,-23]],[[6960,2407],[6,10],[5,11],[11,19]],[[6982,2447],[64,-48]],[[7046,2399],[-10,-20],[-6,-10],[-6,-10]],[[6982,2447],[11,19]],[[6993,2466],[11,20]],[[7004,2486],[64,-48]],[[7068,2438],[-11,-20],[-11,-19]],[[7004,2486],[10,20],[11,20]],[[7025,2526],[11,-7]],[[7036,2519],[53,-41]],[[7089,2478],[-10,-20],[-11,-20]],[[7167,2476],[-2,-2],[-2,2],[-1,0],[-1,0],[-2,-2],[-1,-4],[-17,-31]],[[7141,2439],[-18,13],[-16,13],[-18,13]],[[7036,2519],[9,19],[55,-41],[11,20],[5,10],[2,2],[2,5],[2,3],[2,4]],[[7124,2541],[5,-8],[10,-20],[5,-9],[1,0],[5,-8],[7,-9],[5,-5],[5,-6]],[[7025,2526],[-9,7],[-13,11],[-1,3]],[[7002,2547],[5,0],[14,4],[7,3],[5,2]],[[7033,2556],[5,4],[6,5],[4,3],[5,8]],[[7053,2576],[11,20],[3,4],[2,4],[1,3]],[[7070,2607],[5,-3],[6,-5],[7,-7],[5,-5],[9,-10],[5,-7],[4,-6],[2,-3],[7,-12],[4,-8]],[[7234,2415],[-4,3],[-11,9],[-8,8],[-10,8],[-6,7],[-7,7],[-18,16],[-3,3]],[[7070,2607],[2,4]],[[7072,2611],[8,-6],[11,-8],[14,-13],[26,-31],[12,-8]],[[7143,2545],[5,-4],[17,-13],[51,-38]],[[7216,2490],[41,-31]],[[7257,2459],[-9,-18],[-3,-6]],[[7245,2435],[-1,-1],[-6,-12],[-3,-5],[-1,-2]],[[7272,2574],[42,-32]],[[7314,2542],[-7,-9],[-16,-20]],[[7291,2513],[-13,-19],[-11,-18]],[[7267,2476],[-10,-17]],[[7216,2490],[9,17],[10,18]],[[7235,2525],[7,9],[7,10],[-34,26],[10,17],[2,5],[37,-27],[6,7],[2,2]],[[7235,2525],[-73,55],[-10,-18],[-5,-10],[-4,-7]],[[7072,2611],[2,4],[1,4],[4,6],[5,8],[29,35],[19,20],[14,8],[1,0],[14,2],[15,-2],[11,-2],[6,1],[9,2]],[[7202,2697],[16,10],[4,3]],[[7222,2710],[43,-31],[9,-8],[-15,-39],[-8,-16],[-5,-9],[-5,-10],[5,-4],[8,-6],[7,-5],[11,-8]],[[7202,2697],[-13,10],[-4,3],[-25,19],[-5,3],[-5,6],[0,6],[-11,-1],[-11,-15]],[[7128,2728],[2,10],[-1,7],[-3,7],[-4,11],[-8,8],[-24,17]],[[7090,2788],[-6,22],[2,13]],[[7086,2823],[94,-70],[4,-2]],[[7184,2751],[-6,-11],[27,-17],[17,-13]],[[7060,2684],[-2,7],[-14,56],[-8,36],[-7,15],[-9,8]],[[7020,2806],[6,9],[9,5],[13,0],[10,-8],[32,-24]],[[7128,2728],[-14,-20],[-4,-6],[-20,-26],[-15,-2],[-15,10]],[[7060,2684],[-32,25],[-5,4]],[[7023,2713],[-36,28],[-7,6],[-1,1],[-13,7]],[[6966,2755],[31,58]],[[6997,2813],[4,7]],[[7001,2820],[19,-14]],[[7001,2820],[26,47]],[[7027,2867],[59,-44]],[[6997,2813],[-18,13],[-17,13]],[[6962,2839],[-16,12]],[[6946,2851],[30,54]],[[6976,2905],[16,-12],[17,-12],[18,-14]],[[8099,2087],[4,74]],[[8103,2161],[21,-1]],[[8124,2160],[22,-2]],[[8146,2158],[-4,-74]],[[8142,2084],[-21,2],[-22,1]],[[8146,2158],[21,-1]],[[8167,2157],[-3,-75],[-22,2]],[[8138,2014],[4,70]],[[8167,2157],[10,-1],[1,0],[2,0],[9,-1]],[[8189,2155],[-4,-74]],[[8185,2081],[-4,-71]],[[8181,2010],[-21,3],[-22,1]],[[7911,3064],[-4,5],[-6,5],[-4,4],[-3,3]],[[7894,3081],[22,34]],[[7916,3115],[13,-9],[1,0],[7,-5]],[[7937,3101],[-11,-17],[-6,-8],[-2,-2],[-2,-3],[-5,-7]],[[7894,3081],[-11,11],[-11,11]],[[7872,3103],[15,28]],[[7887,3131],[29,-16]],[[7072,2611],[-2,1],[-16,13],[-15,11],[20,37],[1,11]],[[7078,3651],[-13,-25]],[[7065,3626],[-6,5],[-5,2],[-13,8],[-13,5],[-6,4],[-1,-1],[0,-2],[-4,5],[-31,-1]],[[6986,3651],[16,28]],[[7002,3679],[3,-2],[5,-1],[5,-1],[6,0],[6,0]],[[7027,3675],[4,1],[6,-1],[7,-2],[7,-2],[8,-6],[19,-14]],[[6939,2583],[-44,33]],[[6895,2616],[11,20],[6,10]],[[6912,2646],[13,23],[14,27],[2,3],[1,4]],[[6942,2703],[45,-33]],[[6987,2670],[-2,-4],[-2,-3],[-7,-13],[-7,-13]],[[6969,2637],[-13,-22]],[[6956,2615],[-6,-12],[-11,-20]],[[8730,6185],[-9,-28]],[[8721,6157],[-8,-21],[-7,-21],[-8,-21],[-7,-22],[-7,-19],[-5,-13]],[[8679,6040],[-18,-52]],[[8661,5988],[-3,2],[-3,1],[-9,5],[-9,4],[8,22],[-40,22],[-9,5],[-40,22],[-9,-21]],[[8547,6050],[-16,8]],[[8531,6058],[8,22],[-53,29]],[[8486,6109],[-47,25]],[[8439,6134],[-2,2]],[[8437,6136],[48,122]],[[8485,6258],[58,-28],[2,23]],[[8545,6253],[100,-39],[3,9],[45,-26],[8,0],[3,0],[6,-1],[17,-10],[3,-1]],[[8565,5953],[-7,-19]],[[8558,5934],[-45,25],[-18,10]],[[8495,5969],[7,18],[-16,9],[-15,9]],[[8471,6005],[8,23],[12,27],[16,-9],[7,18],[1,3],[16,-9]],[[8547,6050],[16,-9],[-1,-3],[-7,-18],[-21,-50],[31,-17]],[[8634,5915],[-2,2],[-12,6],[-9,5],[-16,8],[-30,17]],[[8661,5988],[-2,-3],[-17,-48],[-8,-22]],[[8471,6005],[-33,17],[10,23],[18,45],[1,3]],[[8467,6093],[10,-5],[9,21]],[[8495,5969],[-6,-14],[-4,-8],[-1,-3],[-11,-16],[-8,-9],[-5,-11],[-7,-17]],[[8453,5891],[-40,22]],[[8413,5913],[-53,29]],[[8360,5942],[17,40]],[[8377,5982],[8,20],[9,22]],[[8394,6024],[8,19]],[[8402,6043],[20,-11],[27,65],[1,2],[1,3],[10,-6],[6,-3]],[[8402,6043],[28,67],[1,3]],[[8431,6113],[8,21]],[[8394,6024],[-2,1],[-20,11]],[[8372,6036],[8,19]],[[8380,6055],[27,68],[1,3],[21,-12],[2,-1]],[[8380,6055],[-16,8],[-16,8]],[[8348,6071],[28,69],[1,3],[-15,8]],[[8362,6151],[8,20],[54,-29],[13,-6]],[[9365,6386],[-13,5],[-12,4],[-9,3],[-34,16],[-9,4]],[[9288,6418],[-5,30],[-5,3],[-9,4],[-6,4],[-10,5],[-10,4],[-19,10],[-10,4]],[[9214,6482],[-10,6],[-5,2]],[[9199,6490],[4,12],[5,14]],[[9208,6516],[9,-4],[55,-28],[8,-3],[-4,29],[-2,26],[-2,27]],[[9272,6563],[9,-4],[7,-4],[10,-5],[10,-4],[-1,32],[0,4],[0,4],[1,2],[0,17],[0,24]],[[9308,6629],[9,-5],[12,-4],[4,-2]],[[9333,6618],[0,-25],[-2,-5],[-1,-4],[4,-11],[1,-8],[0,-11],[3,-21],[1,-26],[2,-9],[1,-8],[1,-10],[2,-7],[1,-10],[2,-11],[1,-8],[1,-6],[14,-35],[0,-9],[1,-8]],[[9208,6516],[9,23],[7,22]],[[9224,6561],[8,22],[9,-5],[21,-10],[10,-5]],[[9224,6561],[-9,4],[-32,16],[-1,0],[-9,4],[-5,4]],[[9168,6589],[7,21]],[[9175,6610],[4,14],[16,57]],[[9195,6681],[9,-3]],[[9204,6678],[4,-1],[6,-3],[40,-19],[4,-2],[8,-4],[2,-1],[37,-19],[3,0]],[[9175,6610],[-4,2],[-9,5],[-2,0],[-19,10],[-8,4]],[[9133,6631],[8,21],[7,22],[2,8],[6,17],[4,9],[5,14],[1,3]],[[9166,6725],[2,-1],[7,-3],[16,-8],[9,-4],[-8,-27],[3,-1]],[[9133,6631],[-11,5],[-22,11],[-9,4]],[[9091,6651],[7,22]],[[9098,6673],[9,22],[8,24],[10,26]],[[9125,6745],[8,-4],[23,-11],[10,-5]],[[9117,6588],[-10,5],[-3,2],[-20,9],[-9,5],[-9,4],[-23,11],[-9,5]],[[9034,6629],[8,21],[-9,5],[-23,11],[-9,4]],[[9001,6670],[7,21]],[[9008,6691],[9,-4],[9,-4],[14,-7],[9,-4],[10,-5],[22,-11],[10,-5]],[[9133,6631],[-8,-22],[-8,-21]],[[9098,6673],[-9,4],[-23,12],[-9,4],[8,22],[3,7],[6,18]],[[9074,6740],[9,25],[7,21]],[[9090,6786],[41,-19]],[[9131,6767],[-6,-22]],[[9090,6786],[-32,15],[-9,4]],[[9049,6805],[3,11],[3,9],[11,38]],[[9066,6863],[11,-3],[8,-4],[-4,-17],[10,-5],[14,-6],[8,-4],[22,-9],[9,-4]],[[9144,6811],[-6,-22],[-7,-22]],[[9144,6811],[7,23],[5,18]],[[9156,6852],[6,18]],[[9162,6870],[9,-2],[23,-8],[9,-2]],[[9203,6858],[2,-1],[6,-2],[2,0],[18,-5],[10,-3],[5,16],[5,17],[7,21],[3,-1]],[[9261,6900],[-10,-32],[-1,-4],[-32,-109],[-2,-7],[-21,-67]],[[9308,6629],[1,2],[1,24],[1,16],[2,13],[3,24],[-1,2],[-2,1],[-9,5],[-18,8],[-3,1],[-10,5]],[[9273,6730],[-13,5],[-26,12],[-11,5],[-4,-12],[-2,-12],[-2,-11],[-4,-13]],[[9211,6704],[-7,-26]],[[9261,6900],[6,-2],[-6,-21]],[[9261,6877],[-6,-17],[-5,-16],[-4,-15],[-4,-14],[9,-2],[23,-8],[7,-3],[3,0],[3,14],[2,7],[2,9],[3,17],[4,16]],[[9298,6865],[10,-3],[12,-3],[2,-1],[9,-2],[5,22],[-9,3],[-3,1],[3,11],[3,15],[3,12],[1,6],[0,1]],[[9334,6927],[14,-5],[12,-5],[13,-1]],[[9373,6916],[1,-2],[5,1],[2,0],[-1,-2],[-3,-1],[-1,-2],[3,-7],[0,-4],[-5,-21],[-2,-13],[-6,-26],[-7,-24],[-5,-12],[-1,-6],[-1,-7],[-2,-16],[-5,-18],[-4,-22],[0,-12],[-3,-16],[0,-12],[-2,-17],[-1,-3],[-2,-2],[-1,-2],[2,-3],[1,-8],[-2,-7],[0,-12],[0,-22]],[[9261,6877],[7,-3],[2,0],[17,-5],[1,-1],[10,-3]],[[9273,6730],[-3,-27],[-1,-27],[-9,4],[-4,2],[-34,17],[-2,0],[-9,5]],[[8763,5769],[-15,-41]],[[8748,5728],[-9,5],[-37,20],[-9,5]],[[8693,5758],[-9,5],[-22,13],[-9,5]],[[8653,5781],[-9,5],[-38,21],[-9,5]],[[8597,5812],[15,40]],[[8612,5852],[15,44]],[[8627,5896],[21,-12]],[[8648,5884],[-8,-21]],[[8640,5863],[-9,-21],[9,-5],[53,-29],[8,-5],[8,-4]],[[8709,5799],[9,-5],[9,-5]],[[8727,5789],[9,-5],[9,-5],[8,-5],[10,-5]],[[8920,5998],[-8,-21]],[[8912,5977],[-10,6],[-37,20],[-9,4],[-70,39],[-11,6]],[[8775,6052],[9,21],[8,20],[8,21]],[[8800,6114],[80,-44]],[[8880,6070],[-8,-21],[-8,-20],[10,-6],[36,-20],[10,-5]],[[8880,6070],[10,-6],[37,-20],[9,-5],[-4,-11],[-4,-8],[0,-3],[-6,-15],[-2,-4]],[[8892,5924],[-11,6],[-36,20],[-9,5]],[[8836,5955],[12,31],[-10,6],[-61,33],[-10,5]],[[8767,6030],[8,22]],[[8912,5977],[-8,-21],[-8,-19],[-4,-13]],[[8881,5881],[-51,27],[-10,6]],[[8820,5914],[7,19],[9,22]],[[8892,5924],[-6,-23],[-4,-17],[-1,-3]],[[8820,5914],[-10,6],[-59,32],[-10,5]],[[8741,5957],[-9,6],[-22,12],[-3,1]],[[8707,5976],[8,17],[1,1],[1,0],[22,-12],[10,-5],[6,22],[4,12],[8,19]],[[8707,5976],[-2,1],[-12,6],[-20,2],[-10,3],[-2,0]],[[8679,6040],[19,-10],[13,31],[19,-10],[27,-15],[10,-6]],[[8721,6157],[10,-6],[69,-37]],[[8927,5255],[-1,-2],[-1,-2],[0,-2],[-1,-1],[0,-2],[-10,-24],[-5,-12]],[[8909,5210],[-9,5],[-20,11],[-9,5],[-9,-23],[-5,-11],[-4,-12]],[[8853,5185],[-10,5],[-21,12],[-10,5]],[[8812,5207],[-51,27],[0,1]],[[8761,5235],[1,4],[18,56],[9,29],[1,2]],[[8790,5326],[2,-1],[29,-16],[26,-15],[3,-1],[1,-1],[23,-12],[15,-7],[34,-17],[4,-1]],[[8891,5163],[-29,17],[-9,5]],[[8909,5210],[-9,-23],[-5,-12],[-4,-12]],[[8882,5140],[-28,16],[-10,5]],[[8844,5161],[-10,5],[-21,12],[-10,5]],[[8803,5183],[9,24]],[[8891,5163],[-7,-18],[-2,-5]],[[8826,5114],[-10,5],[-21,12],[-10,6]],[[8785,5137],[9,23],[9,23]],[[8844,5161],[-9,-23],[-9,-24]],[[8864,5093],[-9,-23]],[[8855,5070],[-10,5],[-18,10],[-11,6]],[[8816,5091],[10,23]],[[8882,5140],[-8,-20],[-1,-3],[-9,-24]],[[8816,5091],[-9,5],[-22,12],[-10,5],[-10,6],[-31,17],[-3,1]],[[8731,5137],[7,25]],[[8738,5162],[1,0],[35,-20],[11,-5]],[[8738,5162],[8,24],[7,24],[8,25]],[[8432,5056],[-4,2],[-4,2],[-40,21],[-40,21]],[[8344,5102],[-76,40]],[[8268,5142],[-58,31]],[[8210,5173],[-57,30]],[[8153,5203],[-54,29]],[[8099,5232],[-37,20],[-15,8]],[[8047,5260],[7,12],[4,8]],[[8058,5280],[10,18],[10,18],[10,19]],[[8088,5335],[10,19],[10,18]],[[8108,5372],[10,19]],[[8118,5391],[10,19],[10,19]],[[8138,5429],[22,41],[19,35]],[[8179,5505],[8,15],[10,17],[2,3]],[[8199,5540],[72,-39],[20,-11],[64,-35],[31,-16],[21,-12],[25,-13],[3,-2]],[[8435,5412],[-1,-4],[-2,-14],[-1,-5],[0,-11],[2,-53],[1,-55],[2,-58],[1,-36],[1,-44],[-1,-19],[-2,-36],[-3,-21]],[[8592,4282],[-59,38]],[[8533,4320],[-26,16],[-28,18],[-2,2]],[[8477,4356],[8,19],[8,20],[8,19]],[[8501,4414],[7,20],[8,19],[8,20]],[[8524,4473],[7,19],[3,5],[1,2],[9,23],[1,3]],[[8545,4525],[8,-5],[10,-10],[10,-15],[7,-14],[20,-41]],[[8600,4440],[33,-61],[4,-10],[1,-2],[1,-2],[2,-5],[2,-5],[25,-9]],[[8668,4346],[-7,-30],[-4,-19],[-4,-19],[-4,-18],[-27,2],[-30,20]],[[8499,4267],[-49,37]],[[8450,4304],[9,16]],[[8459,4320],[10,19],[7,14],[1,3]],[[8533,4320],[-10,-19],[-10,-19],[-4,2],[-5,-8],[-5,-9]],[[8470,4214],[-13,10],[-11,9],[-11,8],[12,18],[0,7],[1,2],[5,8],[-14,11]],[[8439,4287],[5,8],[6,9]],[[8499,4267],[-4,-9],[-5,-9]],[[8490,4249],[-5,-8],[-10,-17],[-5,-10]],[[8408,4151],[-23,18],[-8,6],[-3,0]],[[8374,4175],[12,21],[14,24],[19,33]],[[8419,4253],[17,28],[3,6]],[[8470,4214],[-6,-16],[-11,-19],[-22,-38],[-13,10],[-10,0]],[[9675,8212],[-4,2],[-4,1],[-2,1]],[[9665,8216],[-2,1],[-40,14],[-3,1]],[[9620,8232],[6,27],[5,28]],[[9631,8287],[4,22],[11,-3],[6,1],[2,5],[-1,15]],[[9653,8327],[-5,47]],[[9648,8374],[-1,14]],[[9647,8388],[10,-3],[51,-13],[6,-14],[5,-22],[4,-19],[1,-5]],[[9724,8312],[-7,-3],[-34,9],[-4,0],[-1,-2],[1,-7],[-13,-2],[4,-43]],[[9670,8264],[4,-34],[1,-11],[0,-7]],[[9669,8164],[-17,5],[-7,18],[-1,2],[-2,2],[-7,1],[-3,0],[-2,-2],[-7,-9],[-7,-12],[-4,-10],[-3,-11]],[[9609,8148],[-11,2],[-6,-1],[-14,-10],[-5,-6],[-1,-8],[1,-7],[-2,-13]],[[9571,8105],[-21,5],[5,27],[2,5],[6,11]],[[9563,8153],[7,5],[30,23],[7,8],[5,8],[3,8],[4,22],[1,5]],[[9665,8216],[0,-5],[4,-47]],[[9677,8082],[-11,-1],[-13,3],[3,16],[-4,34],[0,3],[-3,1],[-40,10]],[[9669,8164],[2,-23],[6,-59]],[[9677,8082],[2,-27],[0,-22],[1,-22]],[[9680,8011],[-61,15]],[[9619,8026],[5,21],[4,21],[-41,11],[4,21],[-20,5]],[[9690,8008],[-7,2],[-3,1]],[[9675,8212],[13,-4],[17,-5],[18,-4],[39,-10]],[[9762,8189],[0,-5],[-1,-10],[-2,-13],[-7,-26],[-19,-70],[-46,12],[1,-25],[1,-22],[1,-22]],[[9743,8257],[12,-29],[4,-20],[2,-8],[1,-11]],[[9670,8264],[13,2],[2,1],[1,1],[20,-5],[2,-1],[3,-2],[26,-6],[6,3]],[[9724,8312],[3,-13],[5,-12],[1,-5],[3,-6],[7,-19]],[[9775,8184],[-13,5]],[[9647,8388],[-1,10],[-2,22]],[[9644,8420],[5,-1],[16,-4],[18,-5],[10,-2]],[[9693,8408],[3,1],[35,-9],[3,0],[13,-1],[3,-1],[7,-1]],[[9757,8397],[2,-12],[7,-16],[3,-23],[3,-4],[3,-5],[2,-1],[1,0],[0,-1],[0,-2],[0,-1],[-3,-1],[-3,-3],[1,-9],[2,-8],[1,-8],[3,-23],[0,-2],[0,-11],[3,-12],[1,-28],[2,-5],[-1,-19],[2,-11],[-4,-4],[-7,-1],[0,-3]],[[9698,8655],[5,-5],[-1,-3],[2,-16],[2,-4],[5,-10],[0,-8],[3,-21],[5,-22],[2,-9],[3,-12],[3,-6],[1,-7],[2,-6],[3,-4],[3,-2],[7,-1],[0,-3],[-2,-4],[-3,-9],[-2,-2],[-2,-19],[1,-4],[6,-6],[2,-2],[3,-3],[1,-7],[-2,-10],[5,-20],[3,-21],[3,-10],[1,-2]],[[9693,8408],[-9,24],[-3,8],[-6,29],[-1,5],[-4,17],[-2,8]],[[9668,8499],[-3,23],[-2,10],[-6,40],[-5,39],[-4,29],[-4,28]],[[9644,8668],[31,-9],[3,1],[2,1],[1,1],[13,-6],[4,-1]],[[9775,8184],[0,-18],[-2,-30],[-2,-12],[-2,-7],[-1,-10],[-1,-8],[-4,-19],[-3,-8],[-2,-11],[-1,-7],[-6,-21],[-1,-9],[0,-24],[-1,-6]],[[9749,7994],[-24,5],[-9,2],[-26,7]],[[9774,7870],[-3,0],[-13,1],[1,2],[-21,5]],[[9738,7878],[-5,3],[-14,4],[-3,1],[-3,1],[-20,5],[-17,5]],[[9676,7897],[-5,1],[-3,1]],[[9668,7899],[4,25],[2,10],[1,10],[2,10],[1,11],[0,11],[1,13],[-64,16]],[[9615,8005],[4,21]],[[9749,7994],[0,-16],[-1,-2],[0,-8],[1,-9],[1,-2],[1,-3],[1,-21],[1,-4],[2,-4],[6,-6],[0,-4],[4,-9],[2,-8],[3,-10],[4,-8],[0,-10]],[[9679,7765],[-41,11]],[[9638,7776],[9,20],[10,21],[7,20]],[[9664,7837],[5,22],[1,3],[3,17],[2,15],[1,3]],[[9738,7878],[-3,-18],[-2,-16],[-5,-24],[-25,7],[-3,1],[-7,-21],[-7,-21],[-7,-21]],[[9652,7840],[-95,26]],[[9557,7866],[4,21],[8,36],[0,3]],[[9569,7926],[63,-17],[11,-3],[25,-7]],[[9664,7837],[-4,1],[-2,1],[-3,0],[-3,1]],[[9548,7822],[5,22],[4,22]],[[9652,7840],[-7,-20],[-4,-11],[-4,-10],[-89,23]],[[9534,7757],[2,8],[1,6],[2,8]],[[9539,7779],[4,22],[5,21]],[[9638,7776],[-11,-20],[-11,-21]],[[9616,7735],[-6,2],[-3,1],[-73,19]],[[9641,7660],[-58,16]],[[9583,7676],[7,12],[15,26],[11,21]],[[9679,7765],[-6,-21],[-6,-22],[-7,-24],[-4,-8],[-2,-5],[-6,-13],[-7,-12]],[[9521,7693],[3,14],[5,26],[5,24]],[[9583,7676],[-8,3],[-54,14]],[[9522,7584],[-22,6],[4,24],[5,23]],[[9509,7637],[5,23],[4,19],[3,14]],[[9641,7660],[-6,-9],[-13,-20],[-14,-21]],[[9608,7610],[-53,15],[-11,-22],[-12,-22]],[[9532,7581],[-6,1],[-4,2]],[[9522,7584],[-11,-20]],[[9511,7564],[-76,22]],[[9435,7586],[4,21],[5,23],[5,24],[60,-17]],[[9382,7601],[53,-15]],[[9511,7564],[-10,-18],[-10,-19],[-4,-8],[-6,-3],[-6,-2],[-4,0],[-6,0],[-7,1],[-39,10],[-53,16],[6,20],[5,19],[5,21]],[[9492,7435],[-13,-20],[-28,-40],[-12,-20],[-9,-16],[-8,-22],[-17,-49],[-12,-34],[-32,-95],[-11,-40],[-8,-28],[-4,-20],[-4,-15],[-16,-73],[-5,-24],[-1,-6]],[[9312,6933],[-32,9],[-5,2]],[[9275,6944],[-4,1],[-38,11],[-1,0]],[[9232,6956],[-42,12]],[[9190,6968],[-42,12]],[[9148,6980],[-43,10],[-42,12]],[[9063,7002],[-41,13]],[[9022,7015],[-3,1]],[[9019,7016],[0,1],[4,6],[37,117],[45,140],[15,71],[21,101],[5,13],[27,85],[13,42],[12,38],[2,8],[1,11],[6,20],[66,-17],[19,-5],[42,-12],[32,-9],[21,-5],[-5,-20]],[[9532,7581],[-11,-19],[-10,-18],[-34,-61],[-13,-23],[-8,-15],[36,-10]],[[6540,4618],[-62,30]],[[6478,4648],[7,19],[3,9],[4,11],[5,14],[6,17]],[[6503,4718],[61,-30]],[[6564,4688],[-6,-16],[-5,-14],[-3,-11],[-4,-9],[-6,-20]],[[6564,4688],[50,-24],[10,-3],[3,-1]],[[6627,4660],[-1,-3],[-6,-15],[-5,-14],[-3,-11],[-4,-9],[-3,-9],[-3,-10]],[[6602,4589],[-18,9],[-44,20]],[[8362,6151],[-1,-3],[-8,-20],[-27,14],[8,21],[1,3],[-22,12]],[[8313,6178],[8,21],[15,41],[31,82]],[[8367,6322],[4,11]],[[8371,6333],[114,-75]],[[6747,4747],[-10,-21],[-7,-12],[-2,-4],[-3,-8],[-7,-12],[0,-1],[-3,-7],[-5,-11],[-1,-3],[-1,-2],[-6,-17]],[[6702,4649],[0,1],[-1,0],[-2,1],[0,1],[-3,1],[-5,-2],[-7,-4],[-4,-3],[-4,-3],[-3,-1],[-2,0],[-4,1],[-18,9],[-22,10]],[[6503,4718],[-3,1],[-59,28],[-13,6],[-32,15]],[[6396,4768],[36,102],[6,17],[2,5],[1,3],[0,1],[5,14],[8,23]],[[6454,4933],[8,-4],[28,-13],[9,-4]],[[6499,4912],[-8,-23],[-3,-10],[-3,-9],[61,-29]],[[6546,4841],[61,-29]],[[6607,4812],[19,-9],[20,-9],[-4,-9],[-4,-13],[-4,-12],[22,-11]],[[6656,4749],[22,-10],[13,-6],[10,-5],[23,-11],[7,14],[5,9],[5,9],[1,-1],[2,0],[2,-1],[1,0]],[[6607,4812],[4,9],[3,10],[4,10],[3,9],[1,2]],[[6622,4852],[9,-4],[23,-11],[21,-10],[8,-4]],[[6683,4823],[-1,-2],[-3,-9],[-3,-10],[-4,-10],[-3,-9],[-4,-9],[-2,-7],[-2,-6],[-5,-12]],[[6546,4841],[3,9],[4,10],[3,10],[5,12]],[[6561,4882],[61,-30]],[[6561,4882],[5,17],[7,19],[6,18]],[[6579,4936],[62,-29]],[[6641,4907],[-7,-19],[-6,-19],[-1,-2],[-4,-13],[-1,-2]],[[6579,4936],[7,20],[4,11],[4,12]],[[6594,4979],[62,-28]],[[6656,4951],[-4,-13],[-4,-11],[-7,-20]],[[6561,4882],[-9,4],[-45,21],[-8,5]],[[6499,4912],[6,17],[6,19],[7,18],[6,19],[4,11],[5,13]],[[6533,5009],[61,-30]],[[6454,4933],[6,18]],[[6460,4951],[7,20],[4,11],[17,48]],[[6488,5030],[45,-21]],[[6460,4951],[-3,1],[-7,4],[-16,7],[-20,9],[2,6],[5,14],[3,9],[1,3]],[[6425,5004],[8,24],[5,12],[4,12]],[[6442,5052],[46,-22]],[[6396,4768],[-16,8],[-54,26]],[[6326,4802],[3,2],[2,3],[8,22],[1,3]],[[6340,4832],[10,25],[19,24],[3,4]],[[6372,4885],[15,18],[-2,4],[-57,28],[5,14],[4,12]],[[6337,4961],[5,12],[4,12],[4,12],[4,11],[8,23],[2,3]],[[6364,5034],[61,-30]],[[6364,5034],[-60,29],[-2,1]],[[6302,5064],[8,23],[9,25]],[[6319,5112],[11,-6],[50,-25]],[[6380,5081],[62,-29]],[[6337,4961],[-61,30]],[[6276,4991],[4,12],[5,12],[8,22],[7,22],[2,5]],[[6372,4885],[-3,1],[-22,11],[-22,11],[-13,6],[-54,27]],[[6258,4941],[9,23]],[[6267,4964],[5,14],[4,13]],[[6340,4832],[-3,2],[-50,25],[-34,17],[-16,8]],[[6237,4884],[9,25],[10,28],[2,4]],[[6326,4802],[-54,27]],[[6272,4829],[-19,10],[-27,13]],[[6226,4852],[6,17],[4,12],[1,3]],[[6253,4728],[-61,31]],[[6192,4759],[7,21],[8,22]],[[6207,4802],[8,21],[5,13],[6,16]],[[6272,4829],[-6,-16],[-5,-13]],[[6261,4800],[-8,-22],[5,-3],[10,-5],[-8,-21],[-7,-21]],[[6291,4708],[-7,3],[-1,1],[-30,16]],[[6261,4800],[54,-28],[-5,-13],[-4,-11],[-6,-16],[-1,-3],[-4,-11],[-4,-10]],[[6268,4661],[-14,7],[-20,10],[-61,30]],[[6173,4708],[2,7]],[[6175,4715],[8,22],[9,22]],[[6291,4708],[-1,-5],[-2,-7],[-8,-19],[-2,-3],[-10,-13]],[[6254,4623],[-1,0],[-95,46]],[[6158,4669],[3,8],[5,11],[2,8],[5,12]],[[6268,4661],[-7,-19],[-7,-19]],[[6225,4516],[3,22],[3,15],[3,12],[1,1],[3,10]],[[6238,4576],[5,14],[2,9],[8,20],[1,4]],[[6396,4768],[-3,-9],[-27,-75],[-16,-46],[-32,-93],[-2,-6],[-13,-38],[-2,-6]],[[6301,4495],[-2,0],[-18,5],[-28,8],[-8,2],[-20,6]],[[6238,4576],[-1,1],[-2,0],[-3,-10],[-8,4],[-5,3],[-43,21],[-16,7],[-5,-12],[-21,-25],[-14,4]],[[6120,4569],[12,32]],[[6132,4601],[5,11],[3,8],[6,19],[4,8],[4,11]],[[6154,4658],[4,11]],[[6225,4516],[-3,0],[-101,27],[-8,2]],[[6113,4545],[7,24]],[[6225,4516],[-3,-24],[-5,-38],[-4,-26]],[[6213,4428],[-4,1],[-17,0],[-13,-2],[-15,-5],[-14,-4]],[[6150,4418],[-2,13],[1,18]],[[6149,4449],[4,30]],[[6153,4479],[20,-5],[7,38],[-17,6],[-18,4],[-18,5],[-19,5]],[[6108,4532],[5,13]],[[6153,4479],[-20,9],[-17,8],[-17,9]],[[6099,4505],[-27,13],[-10,5],[-3,2],[0,2],[7,17],[42,-12]],[[6149,4449],[-55,27],[-5,2]],[[6089,4478],[10,27]],[[6150,4418],[-36,25],[-5,7],[-10,4],[-4,1],[-32,-5],[-26,-1],[-16,-7],[-5,10],[-12,24]],[[6004,4476],[14,-7],[2,0],[4,1],[3,1],[14,28],[1,1],[2,0],[31,-15],[14,-7]],[[6150,4418],[-50,-17],[1,-5]],[[6101,4396],[-18,-6],[-21,-7]],[[6062,4383],[-33,-10]],[[6029,4373],[-4,3],[-8,-3],[-1,2],[-5,16],[-7,13],[-24,17]],[[5980,4421],[13,26],[11,29]],[[7637,1518],[-21,95]],[[7616,1613],[22,7],[19,6]],[[7657,1626],[2,-11],[17,-74],[3,-11]],[[7679,1530],[-19,-6],[-11,-3],[-12,-3]],[[8505,6314],[9,-15],[1,-5],[-9,-21],[2,-4],[14,-8],[15,36],[1,2],[8,-12],[4,-5],[3,-2],[2,-1],[2,-3],[3,-1]],[[8560,6275],[-15,-22]],[[8371,6333],[10,28],[4,11],[10,24],[1,3]],[[8396,6399],[19,-10]],[[8415,6389],[49,-28]],[[8464,6361],[-1,-2],[-20,-51],[1,-3],[14,-8],[30,-18],[3,2],[6,16],[8,17]],[[8464,6361],[15,-8],[19,-10]],[[8498,6343],[-3,-3],[-6,-17],[16,-9]],[[8543,6376],[-4,-4],[-5,-6],[-4,-4],[-4,-3],[-3,-3],[-7,-4],[-14,-7],[-4,-2]],[[8415,6389],[17,34],[7,14],[2,3]],[[8441,6440],[52,-28],[5,-5],[4,4],[7,11]],[[8509,6422],[11,-8],[18,-10],[-8,-13],[0,-5],[13,-10]],[[8567,6293],[-7,-18]],[[8498,6343],[19,-11],[1,-1],[1,-1],[1,-2],[15,10],[23,-37],[3,-4],[3,-2],[3,-2]],[[8609,6408],[-14,-6],[-21,9],[-12,-31],[22,-13],[-4,-11],[7,-4]],[[8587,6352],[-13,-42],[-2,-4],[-5,-13]],[[8543,6376],[3,4],[7,12],[10,17],[13,22],[-45,31]],[[8531,6462],[2,2],[2,4],[2,4]],[[8537,6472],[0,-1],[4,-3],[3,-2],[6,-4],[4,-2],[5,-4],[4,-3],[41,-29],[9,-7],[1,0]],[[8614,6417],[-2,-4],[-2,-1],[-1,-4]],[[8609,6408],[14,-10],[-10,-26],[-2,-6],[1,-6],[3,-14],[1,-7],[-28,13],[-1,0]],[[8784,6337],[-1,-4],[-2,-6],[-5,-13],[-15,-43],[-6,-15],[-11,-33],[-12,-33],[-2,-5]],[[8614,6417],[7,-5],[7,-5],[3,-2],[9,-6],[6,-5],[10,-7],[10,-6],[7,-5],[8,-4],[7,-3],[7,-3],[7,-3],[13,-5],[7,-2],[3,-1],[2,0],[29,-9],[25,-8],[1,-1],[1,0],[1,0]],[[8786,6342],[-2,-5]],[[8614,6417],[1,7]],[[8615,6424],[2,-1],[24,-17],[8,-6],[7,-4],[9,-5],[18,44],[7,26],[2,10],[12,31]],[[8704,6502],[17,-9],[51,-26],[7,-3],[5,-2],[24,-13],[11,-5],[3,-1]],[[8822,6443],[-14,-39],[-6,-16],[-7,-21],[-1,-4],[-5,-12],[-3,-9]],[[8911,6419],[-6,-18]],[[8905,6401],[-17,8],[-19,-55],[16,-9],[-7,-20],[45,-23],[12,-7],[-10,3],[-8,4],[-16,7],[-19,5],[-44,13],[-8,3],[-37,10],[-7,2]],[[8822,6443],[7,18],[1,4],[21,57]],[[8851,6522],[9,-4],[10,-5],[-16,-43],[-2,-3],[-5,-15],[64,-33]],[[8918,6437],[-7,-18]],[[8851,6522],[8,22]],[[8859,6544],[9,-5],[32,-15],[41,-21]],[[8941,6503],[-8,-22],[-15,-44]],[[8802,6657],[-9,-25],[-8,-23],[36,-18],[5,-3],[8,24],[28,-14],[11,-5],[3,-2]],[[8876,6591],[-9,-23],[-8,-24]],[[8704,6502],[44,121],[4,12],[3,5],[5,11],[0,2]],[[8760,6653],[16,-11],[2,3],[4,-3],[7,17],[-1,4]],[[8788,6663],[5,-2],[9,-4]],[[8885,6616],[-9,-25]],[[8802,6657],[9,-5],[23,-11],[10,-5],[9,-4],[22,-11],[7,-3],[3,-2]],[[8911,6689],[-8,-23],[-9,-26],[-9,-24]],[[8802,6657],[8,24],[10,25]],[[8820,6706],[9,-4],[23,-11],[10,-5],[8,23],[9,-4],[19,-10],[3,-1],[7,-4],[3,-1]],[[8820,6706],[8,23],[8,22]],[[8836,6751],[8,21]],[[8844,6772],[9,-4],[23,-11],[9,-5],[9,-4],[23,-11],[7,-4],[3,-1]],[[8927,6732],[-8,-22],[-8,-21]],[[8934,6753],[-7,-21]],[[8844,6772],[8,22],[22,-11],[8,23],[8,22],[11,-5],[8,-4]],[[8909,6819],[8,-4],[11,-5],[11,-6],[9,-4],[2,-1]],[[8950,6799],[-8,-24],[-8,-22]],[[8921,6854],[-7,-19],[-5,-16]],[[8836,6751],[-30,14],[-10,5],[-23,12],[-16,13]],[[8757,6795],[-40,29],[-26,19]],[[8691,6843],[2,15],[4,17]],[[8697,6875],[5,20],[22,-8]],[[8724,6887],[37,-15]],[[8761,6872],[63,-24],[3,7],[1,2],[5,14]],[[8833,6871],[40,-18],[6,18],[32,-14],[10,-3]],[[8833,6871],[6,17]],[[8839,6888],[6,17],[6,20],[31,-10],[10,-3],[10,-3],[32,-12]],[[8934,6897],[-6,-24],[-7,-19]],[[8761,6872],[8,24],[5,19]],[[8774,6915],[10,-4],[45,-19],[10,-4]],[[8724,6887],[7,25],[7,24],[-60,23]],[[8678,6959],[7,24],[21,-9],[14,-6],[25,-8],[37,-13],[-1,-7],[-1,-8],[-4,-12],[-2,-5]],[[8697,6875],[-20,8]],[[8677,6883],[6,20],[-19,7],[7,25],[7,24]],[[8677,6883],[-19,9],[-11,4],[-34,22],[6,9],[8,24],[-6,9],[3,8],[-10,4],[-6,-1]],[[8608,6971],[3,15],[5,-3],[62,-24]],[[8691,6843],[4,-15],[10,-7],[-5,-8]],[[8700,6813],[-15,10],[-37,27]],[[8648,6850],[1,3],[4,13],[0,6],[-68,48]],[[8585,6920],[-71,51]],[[8514,6971],[10,20]],[[8524,6991],[8,15],[7,14]],[[8539,7020],[52,-37]],[[8591,6983],[0,-5],[13,-8],[4,1]],[[8631,6817],[-3,2],[-1,-3],[-35,26],[-36,25]],[[8556,6867],[2,3],[9,18],[8,14],[10,18]],[[8648,6850],[-1,-2],[-7,-13],[-9,-18]],[[8631,6817],[-2,-3],[-8,-17],[-7,-16],[-1,-3]],[[8613,6778],[-3,2],[-17,8],[-24,13],[-18,9],[-17,8],[-19,10],[-18,8],[-2,1],[-15,8]],[[8480,6845],[10,24],[10,22],[6,12]],[[8506,6903],[24,-17],[26,-19]],[[6775,2827],[-12,9],[-13,9],[-9,7]],[[6741,2852],[2,4],[8,18],[10,17]],[[6761,2891],[35,-26]],[[6796,2865],[-10,-17],[-9,-17],[-1,-2],[-1,-2]],[[6724,2819],[-21,15],[6,11],[3,5],[5,10],[20,-15],[2,4],[2,3]],[[7230,1149],[-6,-29],[-4,-21]],[[7220,1099],[-59,16],[-4,-23]],[[7157,1092],[-16,4]],[[7141,1096],[-2,1]],[[7139,1097],[4,21]],[[7143,1118],[9,20],[13,33]],[[7165,1171],[10,-7],[18,-6],[18,-5],[19,-4]],[[7210,1077],[-33,10]],[[7177,1087],[-18,4],[-2,1]],[[7220,1099],[-4,-12],[-6,-10]],[[7177,1087],[-7,-34],[25,-1],[-12,-21]],[[7183,1031],[-35,0],[-20,0]],[[7128,1031],[13,65]],[[7188,963],[-1,0],[-2,1],[-23,-1],[-8,0]],[[7154,963],[-10,1]],[[7144,964],[-49,1]],[[7095,965],[0,24],[11,0],[1,21]],[[7107,1010],[63,0],[13,21]],[[7210,1077],[37,-9],[-1,-5],[-58,-100]],[[7107,1010],[3,21]],[[7110,1031],[18,0]],[[7110,1031],[5,28],[4,20],[-51,11],[7,24]],[[7075,1114],[10,-3]],[[7085,1111],[39,-10],[15,-4]],[[7095,965],[-51,0]],[[7044,965],[-5,0],[-7,1],[-7,1]],[[7025,967],[6,23],[20,-1],[16,57],[-19,2],[-2,-8],[-11,3]],[[7035,1043],[2,7],[21,70]],[[7058,1120],[10,-4],[7,-2]],[[7025,967],[-17,6],[-24,10]],[[6984,983],[-17,7]],[[6967,990],[15,53],[3,5],[5,4],[8,3],[7,0],[13,-5],[17,-7]],[[6967,990],[-32,12],[-7,2],[-3,0]],[[6925,1004],[7,7],[6,7],[3,4],[7,12]],[[6948,1034],[67,103]],[[7015,1137],[2,-1],[24,-10],[9,-3],[8,-3]],[[6948,1034],[-2,2],[-24,20]],[[6922,1056],[-14,11]],[[6908,1067],[10,17],[11,18]],[[6929,1102],[11,16],[11,17]],[[6951,1135],[11,17],[14,-11],[12,17]],[[6988,1158],[24,-19],[3,-2]],[[6951,1135],[-44,33]],[[6907,1168],[9,17]],[[6916,1185],[19,-13],[10,17]],[[6945,1189],[43,-31]],[[6929,1102],[-41,30]],[[6888,1132],[9,18]],[[6897,1150],[10,18]],[[6908,1067],[-39,29]],[[6869,1096],[9,19],[10,17]],[[6869,1096],[-32,23]],[[6837,1119],[6,21],[5,20],[7,22]],[[6855,1182],[42,-32]],[[6922,1056],[-10,-16]],[[6912,1040],[-81,59]],[[6831,1099],[6,20]],[[6912,1040],[-14,-22],[-20,15],[-7,-12],[-52,39],[4,13],[8,26]],[[6925,1004],[-9,-8],[-10,-7],[-33,-20],[-23,-14],[-21,-12]],[[6829,943],[-2,2],[-8,13],[-12,16],[-8,12],[-4,3],[-10,17]],[[6785,1006],[-9,13],[-4,7]],[[6772,1026],[-4,4],[-7,12],[-5,8],[-8,12],[-3,5],[-5,7],[-38,57]],[[6702,1131],[-1,4],[-9,15],[-9,13],[-9,14],[-4,6],[-11,17],[-4,6],[-1,1],[-7,10],[-4,5],[-18,24],[-5,8],[-10,19],[-3,8],[-1,1]],[[6606,1282],[4,3],[6,2],[48,32],[23,17],[40,25],[54,36],[48,30]],[[6829,1427],[3,-5],[4,-3],[11,-9],[53,-41],[43,-31],[-12,-17]],[[6931,1321],[-11,-15],[-12,-16]],[[6908,1290],[-12,-15],[-12,-16],[-12,-15]],[[6872,1244],[-12,-16],[-13,-16],[13,-10],[-5,-20]],[[6872,1244],[38,-28],[-10,-19],[16,-12]],[[6908,1290],[51,-37]],[[6959,1253],[-10,-16],[-11,-17],[16,-12]],[[6954,1208],[-9,-19]],[[6931,1321],[48,-36]],[[6979,1285],[-10,-15],[-10,-17]],[[7009,1262],[-40,-64]],[[6969,1198],[-15,10]],[[6979,1285],[17,-12],[13,-11]],[[7009,1262],[16,-11]],[[7025,1251],[-41,-65],[-15,12]],[[7079,1236],[-29,-45],[-35,-54]],[[7025,1251],[16,-13],[10,19],[25,-19],[3,-2]],[[7111,1185],[-24,19],[-11,-18],[27,-20],[-15,-34],[-3,-21]],[[7079,1236],[9,-6],[32,-26],[-9,-19]],[[8252,1733],[-17,-43],[-3,-12],[-6,-11],[-4,-12],[-9,-19],[-4,-10]],[[8209,1626],[-34,1]],[[8175,1627],[-11,0],[-4,1]],[[8160,1628],[0,9],[1,11],[1,17]],[[8162,1665],[1,19],[2,25]],[[8165,1709],[1,29],[0,3]],[[8166,1741],[35,-2],[4,-3],[47,-3]],[[8166,1741],[2,25]],[[8168,1766],[56,-5],[12,22],[5,10],[3,11]],[[8244,1804],[5,18]],[[8249,1822],[4,20]],[[8253,1842],[1,19]],[[8254,1861],[2,27]],[[8256,1888],[54,-14],[1,1]],[[8311,1875],[-12,-28],[-7,-14],[-10,-26],[-5,-11],[-12,-29],[-3,-10],[-7,-13],[-3,-11]],[[8168,1766],[1,23]],[[8169,1789],[2,20]],[[8171,1809],[73,-5]],[[8171,1809],[0,19]],[[8171,1828],[78,-6]],[[8171,1828],[2,19]],[[8173,1847],[80,-5]],[[8173,1847],[0,20]],[[8173,1867],[81,-6]],[[8173,1867],[2,27]],[[8175,1894],[12,-1],[69,-5]],[[8175,1894],[1,29]],[[8176,1923],[12,-1],[70,-5]],[[8258,1917],[-2,-29]],[[8176,1923],[2,29]],[[8178,1952],[83,-7],[-3,-28]],[[8178,1952],[2,30]],[[8180,1982],[82,-6],[-10,30]],[[8252,2006],[7,0]],[[8259,2006],[1,-1],[7,-1],[1,-2],[2,-4],[51,1]],[[8321,1999],[0,-18],[-2,-39],[0,-31],[-4,-15],[-4,-21]],[[8380,2225],[-1,0],[-10,-3],[-12,-8],[-9,-5],[-4,-1],[-5,-8],[-7,-12],[-1,-39],[-2,-26],[-2,-26],[0,-16],[-4,-38],[-2,-15],[0,-29]],[[8259,2006],[1,2],[11,3],[1,4],[-1,7],[-1,4],[-1,6],[-4,29],[0,6],[0,9],[1,5],[1,6],[2,7],[3,12],[1,4],[1,5],[1,9],[-2,1],[-15,3],[-5,-9],[-4,0]],[[8249,2119],[1,11],[-3,6],[-3,5],[-3,5],[-34,15],[-3,1],[-3,0],[-4,-1],[-4,10],[-2,3]],[[8191,2174],[8,15],[2,1],[2,5]],[[8203,2195],[2,5],[6,14],[32,72],[6,12],[6,15],[5,8]],[[8260,2321],[1,-4],[37,-21],[10,-6],[3,-1],[68,-63],[1,-1]],[[7497,2612],[-92,70]],[[7405,2682],[1,2],[24,13],[27,12]],[[7457,2709],[72,-53]],[[7529,2656],[-15,-21],[-8,-11],[-9,-12]],[[7468,2570],[-91,68]],[[7377,2638],[12,22],[12,18],[4,4]],[[7497,2612],[-15,-22],[-14,-20]],[[7453,2548],[-17,-24]],[[7436,2524],[-28,22],[-27,20],[-17,12],[-13,11]],[[7351,2589],[14,25],[6,12],[6,12]],[[7468,2570],[-15,-22]],[[7403,2476],[-29,22],[-26,19],[-1,1],[-13,10],[-20,14]],[[7314,2542],[13,15],[12,16],[12,16]],[[7436,2524],[-21,-32],[-12,-16]],[[7395,2464],[-13,-20]],[[7382,2444],[-91,69]],[[7403,2476],[-8,-12]],[[7346,2393],[-89,66]],[[7267,2476],[90,-67]],[[7357,2409],[-11,-16]],[[7346,2393],[-9,-12],[-9,-8]],[[7328,2373],[-14,11],[-59,43],[-10,8]],[[7310,2357],[-3,3],[-16,12],[-14,10],[-16,12],[-10,8],[-9,6],[-8,7]],[[7328,2373],[-6,-6],[-2,-2],[-2,-2],[-2,-1],[-2,-1],[-4,-3],[0,-1]],[[7310,2357],[-3,-2],[-1,0],[0,-1],[-6,-5],[-17,-15]],[[7283,2334],[-11,7],[-47,35],[-9,7]],[[7216,2383],[-10,7],[-22,17],[-10,7]],[[7174,2414],[-33,25]],[[7179,2245],[-3,1],[-11,9],[-14,9]],[[7151,2264],[6,10],[6,11],[10,19],[11,20],[5,9],[5,10],[11,20],[11,20]],[[7283,2334],[-18,-15],[-18,-15]],[[7247,2304],[-8,-8],[-9,-7],[-17,-14]],[[7213,2275],[-17,-15],[-17,-15]],[[6740,2142],[-10,-22]],[[6730,2120],[-11,-5],[-56,36],[-17,-7]],[[6646,2144],[11,23]],[[6657,2167],[10,22]],[[6667,2189],[73,-47]],[[6667,2189],[9,19],[9,19],[9,19]],[[6694,2246],[74,-47]],[[6768,2199],[-10,-19]],[[6758,2180],[-9,-19],[-9,-19]],[[6792,2242],[-10,-12],[-5,-11],[-9,-20]],[[6694,2246],[10,20],[9,19]],[[7502,7769],[-14,21],[-21,35],[3,2],[14,13],[-22,33],[7,8],[9,10],[15,14],[11,12],[15,21],[9,12],[9,14]],[[7537,7964],[13,-10],[4,-5],[3,-4],[2,-5],[1,-6],[0,-10],[-2,-9],[11,-8],[5,-9],[-11,-21],[-1,-5],[1,-3],[6,-9]],[[7569,7860],[-3,-2],[-17,-15],[-22,-19],[-10,-8],[9,-14],[6,-8]],[[7532,7794],[-14,-12],[-16,-13]],[[7452,7720],[-2,3],[-50,77]],[[7400,7800],[-10,11]],[[7390,7811],[6,6],[24,27],[6,5],[21,27],[14,15],[10,8],[10,10],[5,6],[19,25],[11,18],[8,14],[4,5],[4,6],[3,6],[4,14],[1,2]],[[7540,8005],[-3,-41]],[[7502,7769],[3,-4],[-17,-14]],[[7488,7751],[-16,-14],[-18,-15],[-2,-2]],[[7427,7998],[5,-4],[4,0],[1,1],[3,4],[11,15],[11,12],[12,9],[10,3],[12,0],[7,5],[9,3],[-1,-8],[-10,-14],[-17,-18],[-10,-14],[-13,-9],[-9,-9],[-9,-12],[-23,-6],[-8,-9],[-8,-4],[-10,0],[-10,-2],[-9,-12],[0,-9],[7,-5],[14,3],[11,9],[11,7],[10,5],[4,0],[-1,-4],[3,1],[-2,-4],[-5,-7],[-5,-5],[-15,-13],[-22,-12],[-3,-5],[-5,-3],[-14,-1],[-15,3],[-12,7],[-2,4],[-3,5],[0,8],[3,7],[13,17],[12,8],[12,14],[5,10],[5,17],[7,2],[9,8],[5,13],[22,27],[25,22],[4,9],[7,10],[10,8],[5,6],[3,0],[2,-8],[-4,-6],[-16,-17],[-12,-16],[-18,-32],[-3,-14]],[[7413,7680],[-3,2],[-3,2],[-18,12],[-5,6],[-17,26]],[[7367,7728],[-11,19],[12,12],[6,7],[4,5],[11,14],[11,15]],[[7452,7720],[-2,-2],[-11,-10],[-11,-11],[-15,-17]],[[7382,7644],[-3,4],[-29,-34]],[[7350,7614],[-14,22]],[[7336,7636],[7,9],[7,8],[15,17],[-23,35],[3,3],[5,5]],[[7350,7713],[17,15]],[[7413,7680],[-3,-3],[-28,-33]],[[8063,8419],[-14,-13],[-26,41],[-2,4],[-2,6],[-9,15],[-18,-17]],[[7992,8455],[-50,-44],[-12,-9]],[[7930,8402],[-13,-10],[-22,-18],[-4,-5],[-14,-23],[-15,-24]],[[7862,8322],[-14,13]],[[7848,8335],[4,5],[8,10],[6,10],[12,10],[3,8],[2,3],[15,14],[16,5],[13,15],[12,5],[25,18],[9,10],[8,7],[3,7],[3,1],[6,1],[3,6],[7,10],[8,5],[8,11],[17,14],[5,8],[7,13],[2,7],[5,24],[5,7],[8,5],[18,2],[5,1],[3,1]],[[8094,8578],[1,-3],[4,-4],[4,-6],[14,-24],[-9,-6],[17,-26],[15,-25]],[[8140,8484],[-13,-11],[-22,-18],[-15,-13],[-14,-12],[-13,-11]],[[8030,8317],[-13,-18]],[[8017,8299],[-2,3],[-32,48],[-12,-13],[-1,2],[-16,24],[-2,10],[-10,14],[-7,7],[-5,8]],[[7992,8455],[40,-63],[-16,-14],[-17,-14],[29,-44],[2,-3]],[[8063,8419],[26,-40],[2,-3]],[[8091,8376],[-15,-13],[-16,-13],[-9,-8],[-8,-8],[-4,-5],[-5,-6],[-4,-6]],[[8076,8241],[-14,-14]],[[8062,8227],[-45,72]],[[8091,8376],[26,-41]],[[8117,8335],[-15,-13],[-17,-13],[-16,-15],[-17,-14],[24,-39]],[[8117,8335],[50,-79]],[[8167,8256],[-15,-13],[-17,-13],[-7,-7]],[[8128,8223],[-22,-20],[-3,0],[-2,1],[-10,15],[-14,21],[-1,1]],[[8180,8268],[-13,-12]],[[8117,8335],[13,11],[13,11],[16,14],[21,18],[12,11]],[[8192,8400],[49,-78]],[[8241,8322],[-12,-11],[-21,-18],[-15,-14],[-13,-11]],[[8140,8484],[24,-40],[3,-4],[25,-40]],[[8140,8484],[14,13],[15,12],[18,16],[13,11],[12,10],[24,-41],[2,-3]],[[8238,8502],[24,-41],[-8,-8]],[[8254,8453],[-14,-12],[-17,-15],[-16,-13],[-15,-13]],[[8254,8453],[47,-79]],[[8301,8374],[-12,-10],[-18,-16],[-15,-14],[-15,-12]],[[6673,3425],[-3,-2],[-12,6],[-23,11],[-19,9],[-21,10]],[[6595,3459],[13,37],[3,9]],[[6611,3505],[7,19],[13,37],[19,54]],[[6650,3615],[12,1],[3,0],[13,1],[45,-21],[-2,-5],[-2,-6],[-8,-14],[-6,-12],[13,-6]],[[6718,3553],[-20,-11],[-2,-17],[-2,-9],[-5,-15],[-3,-10],[-3,-4],[-3,-2],[-6,-1],[19,-10],[-18,-32],[1,-14],[0,-2]],[[6676,3426],[-3,-1]],[[6489,3426],[17,50],[0,6],[0,3],[7,6],[18,53]],[[6531,3544],[18,-9],[19,-10],[20,-9],[23,-11]],[[6595,3459],[-25,-70],[-2,0],[-20,11],[-20,9],[-19,8],[-20,9]],[[6673,3425],[2,-3],[3,-2],[-4,-6],[-4,-10],[-5,-9],[-13,-24],[-21,-38]],[[6631,3333],[-3,2],[-1,0],[-22,11],[-32,15],[-91,42]],[[6482,3403],[7,23]],[[6482,3403],[-22,10],[-20,9],[-25,11],[-25,12]],[[6390,3445],[35,98]],[[6425,3543],[24,-12],[5,-2],[4,-2],[4,-2],[4,-5],[5,-8],[19,52],[19,-10],[22,-10]],[[6631,3333],[-15,-27],[-6,-10]],[[6610,3296],[-89,76],[-34,17],[-5,-3]],[[6482,3386],[-88,-16],[-67,32],[-4,-14]],[[6323,3388],[-9,4],[6,22],[12,33],[16,-7],[1,11],[2,12]],[[6351,3463],[18,-9],[21,-9]],[[6351,3463],[-28,13],[-15,7]],[[6308,3483],[8,23],[8,24],[0,4],[0,5],[-1,3],[-2,2],[-3,6],[0,3],[0,2],[15,36],[4,9],[5,12],[4,0],[6,2],[3,1],[5,-3],[1,-4],[2,-3],[11,-24],[1,-3],[6,-13],[20,-10]],[[6401,3555],[24,-12]],[[6551,3599],[-20,-55]],[[6401,3555],[12,32],[-6,11],[-2,3],[-7,18],[0,2],[0,2],[1,2],[1,3],[-2,1],[-2,0],[-3,1],[-2,2],[-7,16]],[[6384,3648],[24,16],[20,12],[7,4],[4,4],[8,7]],[[6447,3691],[0,-5],[2,-6],[1,-3],[3,-4],[2,-3],[4,-3],[13,-7],[6,-12],[1,-3],[7,-14],[23,-12],[21,-10],[21,-10]],[[6308,3483],[-3,1],[-25,12],[-8,5],[-2,1],[-2,2]],[[6268,3504],[2,6],[4,12],[2,3],[1,4],[4,11],[2,4],[6,16],[1,2],[1,3],[7,17],[6,16],[8,22],[7,18],[24,62],[5,13],[1,3],[1,5],[1,2],[1,3],[2,4],[8,22],[13,31],[2,4],[6,15],[0,1],[14,33],[2,7],[13,31],[4,10],[5,12]],[[6421,3896],[1,-1]],[[6422,3895],[3,-1],[-9,-22],[-13,-31]],[[6403,3841],[-12,-27],[-12,-33]],[[6379,3781],[-13,-31],[-12,-33],[18,-9],[-25,-61],[-2,-7],[0,-8],[5,-1],[2,-3],[32,20]],[[5790,4258],[-10,12],[7,5],[18,10],[-11,19],[-12,19]],[[5782,4323],[19,15],[18,21],[-15,13],[12,16]],[[5816,4388],[62,-54],[-10,-18],[-8,-13],[-9,0],[-36,-35],[-1,-6],[-24,-4]],[[7151,2264],[-41,31]],[[7110,2295],[5,11],[6,10],[11,19]],[[7132,2335],[10,20],[11,19]],[[7153,2374],[11,20],[10,20]],[[7179,2245],[-16,-13]],[[7163,2232],[-4,-4],[-13,-10],[-11,-9],[-5,-5]],[[7130,2204],[-18,-14]],[[7112,2190],[-14,11],[-20,15],[-8,6]],[[7070,2222],[6,10],[8,15],[7,13],[7,13],[6,12],[6,10]],[[7230,2182],[-54,40],[-5,4],[-6,4],[-2,2]],[[7179,2245],[3,-1],[5,-4],[59,-44]],[[7246,2196],[-8,-7],[-8,-7]],[[7197,2154],[-4,4],[-51,37],[-5,3],[-7,6]],[[7230,2182],[-9,-7],[-8,-7],[-16,-14]],[[7180,2140],[-59,44],[-9,6]],[[7197,2154],[-7,-7],[-10,-7]],[[7160,2125],[-50,37],[-7,6],[-8,6]],[[7095,2174],[17,16]],[[7180,2140],[-7,-4],[-4,-3],[-9,-8]],[[7120,2091],[-65,48]],[[7055,2139],[22,19],[18,16]],[[7160,2125],[-10,-8],[-8,-7],[-22,-19]],[[7055,2139],[-21,16]],[[7034,2155],[13,25],[11,21]],[[7058,2201],[12,21]],[[7005,2096],[-46,33]],[[6959,2129],[11,21],[11,21],[12,21]],[[6993,2192],[5,-7],[3,-6],[33,-24]],[[7055,2139],[-15,-13],[-12,-11]],[[7028,2115],[-7,-6],[-7,-5],[-4,-3],[-5,-5]],[[7120,2091],[-27,-24]],[[7093,2067],[-65,48]],[[7093,2067],[-21,-21],[-67,50]],[[7016,1990],[-5,4]],[[7011,1994],[2,2],[42,36],[-23,16],[-9,-8],[-7,-6],[-18,14],[16,14],[-10,8],[-16,11]],[[6988,2081],[17,15]],[[7246,2196],[5,-3]],[[7251,2193],[-17,-14],[-33,-28],[-17,-15],[-15,-13],[-3,-2],[-17,-15],[-21,-18],[-2,-1]],[[7126,2087],[-27,-24],[-23,-20],[-17,-15],[-41,-36],[-2,-2]],[[6950,1933],[-6,3]],[[6944,1936],[16,15]],[[6960,1951],[18,14],[-68,44],[-4,0]],[[6906,2009],[37,33]],[[6943,2042],[7,-3],[10,-8],[14,-10],[4,-3],[2,-1],[11,-8],[20,-15]],[[7016,1990],[-3,-2],[-25,-22],[-38,-33]],[[6960,1951],[-69,45]],[[6891,1996],[15,13]],[[6944,1936],[-38,-33]],[[6906,1903],[-70,45]],[[6836,1948],[8,7]],[[6844,1955],[21,18],[9,8],[11,10]],[[6885,1991],[6,5]],[[8658,1867],[-4,5],[-21,28]],[[8633,1900],[10,11],[7,9]],[[8650,1920],[11,-9],[8,-4],[7,16],[6,15],[8,-3],[7,-4],[6,-6],[4,-2],[5,-2],[-4,-23],[-1,-8],[-6,-15],[-30,7],[-11,-12],[-2,-3]],[[8688,1948],[-25,10]],[[8663,1958],[12,57]],[[8675,2015],[10,-5],[8,-7],[-8,-44],[6,-2],[-3,-9]],[[8675,2015],[-31,9],[-1,3],[-3,1],[-3,-2],[-7,5],[-15,7]],[[8615,2038],[5,12],[4,11],[3,9],[2,7],[1,10],[-1,14],[1,4],[-1,0],[0,-1],[-1,0],[-1,0],[-1,0],[-1,0],[-1,1],[-1,1],[-1,2],[0,1],[0,2],[1,2],[0,1],[1,1],[-2,4],[-11,23],[-10,20],[-5,11],[-1,0],[-1,1],[-2,1],[-1,2],[-1,3]],[[8590,2180],[1,2],[0,1],[1,2],[2,1],[-2,12],[-1,3],[1,3],[0,3],[2,7],[3,10],[3,10],[3,7],[2,5],[4,7],[7,13],[2,3],[2,5],[1,0],[3,-1],[2,5],[17,33],[11,21],[4,9],[2,0],[12,27],[6,14],[3,8],[2,4]],[[8683,2394],[4,0],[7,2],[30,17],[8,1],[18,2],[3,3],[1,-4],[3,-8],[10,-7],[2,-2],[2,-8],[5,-12],[5,-8],[5,-12],[5,-12],[1,-6],[7,-8],[9,-12],[4,-12],[6,-11],[5,-14],[3,-11],[5,-7],[4,-3],[1,-5],[0,-6],[3,-6],[4,-2]],[[8843,2243],[-17,2],[0,-4],[1,-4],[-1,-8],[-1,-5],[-1,-5],[-3,-9],[-2,-6],[-4,-8],[-3,-4],[-5,-7],[-6,-5],[-5,-5]],[[8796,2175],[-10,-7],[-9,-4],[-12,-5],[-9,-4],[5,-14],[1,-8],[-1,-6],[0,-3],[-1,-3]],[[8760,2121],[-1,-4],[0,-2],[-2,-3],[-1,-4],[-8,-10],[-6,-6],[-10,15],[-6,18],[-24,-10],[3,-10],[15,-18],[6,-9],[-7,-6],[-5,-4],[-6,-6],[-14,-11],[-8,-11],[-7,-12],[-4,-13]],[[8796,2175],[4,-5],[11,-14],[15,-15],[0,-3],[-2,-4],[-8,-10],[-5,-4],[-2,-2],[-2,-2],[-2,-4],[-10,-15],[-3,-1],[-3,2],[-13,9],[-11,10],[-2,0],[-3,4]],[[6818,2142],[-60,38]],[[6865,2225],[-23,-40],[-14,-25],[-10,-18]],[[6878,2090],[-15,-27]],[[6863,2063],[-16,10],[16,29],[-14,15],[-14,14],[-17,11]],[[6865,2225],[62,-44],[-11,-21]],[[6916,2160],[-11,-20],[-27,-50]],[[6959,2129],[-43,31]],[[6888,2268],[62,-45]],[[6950,2223],[43,-31]],[[6988,2081],[-45,-39]],[[6943,2042],[-17,13],[-48,35]],[[6950,2223],[11,21],[11,20]],[[6972,2264],[86,-63]],[[6909,2311],[10,-7],[43,-32],[10,-8]],[[6999,2314],[-1,-3],[-12,-22],[-2,-3],[-12,-22]],[[7024,2359],[86,-64]],[[7046,2399],[86,-64]],[[7068,2438],[85,-64]],[[6694,2246],[-72,47]],[[6622,2293],[6,15],[3,5],[9,20]],[[6640,2333],[73,-48]],[[6640,2333],[-33,22]],[[6607,2355],[20,15],[3,4],[8,6]],[[6638,2380],[9,6],[4,4],[10,8],[3,3],[15,16],[3,2]],[[6603,2255],[-48,31],[-1,1]],[[6554,2287],[4,5]],[[6558,2292],[9,12],[13,17]],[[6580,2321],[19,24]],[[6599,2345],[8,10]],[[6622,2293],[-10,-19],[-9,-19]],[[6599,2345],[-2,3],[-58,43],[11,19],[8,16],[3,5]],[[6561,2431],[77,-51]],[[6580,2321],[1,5],[-54,41]],[[6527,2367],[-70,50]],[[6457,2417],[12,24],[11,19],[8,15],[4,8]],[[6492,2483],[69,-52]],[[6492,2483],[17,30]],[[6509,2513],[14,26]],[[6523,2539],[13,-10],[22,-17],[-3,-12],[-2,-11],[24,-3],[12,-3],[9,-4],[8,-6],[22,-18],[11,-5],[10,-8],[33,-23]],[[6523,2539],[37,68]],[[6560,2607],[34,-26]],[[6594,2581],[35,-25],[-2,-5],[-5,-8],[-5,-11],[21,-17],[24,-14],[15,-7]],[[6594,2581],[13,23],[13,24],[13,24],[36,-26]],[[6560,2607],[6,10],[4,8],[1,10],[-2,30],[0,2],[0,18]],[[6569,2685],[1,6],[2,5],[1,5],[2,3],[9,17],[13,24],[10,18],[1,2],[0,2],[13,23]],[[6621,2790],[62,-46]],[[6621,2790],[12,22],[13,24]],[[6646,2836],[23,-18],[30,-22],[9,-7]],[[6621,2790],[-62,47]],[[6559,2837],[12,22],[13,23]],[[6584,2882],[53,-40],[9,-6]],[[6584,2882],[10,19],[6,10]],[[6600,2911],[20,-15],[21,-16],[6,11],[3,6],[5,9],[21,-15]],[[6676,2891],[-5,-10],[-3,-5],[-6,-11],[-6,-10],[-10,-19]],[[6679,2898],[-2,-3],[-1,-4]],[[6600,2911],[-18,14],[-18,12],[-17,14]],[[6547,2951],[9,16],[4,7]],[[6560,2974],[2,2],[2,1],[3,3]],[[6567,2980],[6,-4],[18,-13],[10,-7],[1,-1],[5,-4],[9,-6]],[[6616,2945],[32,-23],[11,-9],[20,-15]],[[6616,2945],[2,4],[8,18],[10,18],[5,8],[11,9]],[[6652,3002],[24,-17],[19,-14],[18,-14]],[[6713,2957],[-9,-10],[-6,-9]],[[6698,2938],[-9,-18],[-9,-18],[-1,-4]],[[6567,2980],[1,1],[2,2],[10,18],[10,18],[12,21]],[[6602,3040],[40,-30],[10,-8]],[[6741,2852],[-1,1],[-61,45]],[[6698,2938],[63,-47]],[[8269,3639],[9,-6]],[[8278,3633],[-10,-19],[-3,-5],[-3,-6],[-8,-16],[-9,-15]],[[8245,3572],[-30,24],[-29,22],[-26,20],[-27,21]],[[8133,3659],[4,18]],[[8137,3677],[5,16]],[[8142,3693],[4,14]],[[8146,3707],[6,20]],[[8152,3727],[18,-14],[30,-22]],[[8200,3691],[-4,-22],[-6,-32],[34,-26]],[[8224,3611],[14,-11],[2,-2],[9,16],[1,1],[9,7],[2,2],[8,15]],[[8224,3611],[1,2],[23,42],[19,35]],[[8267,3690],[13,-11],[-10,-19],[-5,-17],[1,-1],[2,-1],[1,-2]],[[8200,3691],[9,42],[2,-1],[27,-21],[16,-12],[13,-9]],[[5608,4321],[12,16],[2,0],[1,1],[-1,1],[4,5]],[[5626,4344],[4,5]],[[5630,4349],[5,-5],[-11,-17],[33,-32],[8,18],[7,13]],[[5672,4326],[43,-45],[2,-2],[10,20]],[[5727,4299],[12,-13],[-3,-5],[-1,-4],[-2,-4],[-2,-3],[-1,-4],[-2,-4],[0,-3],[2,-1],[12,-2],[2,0],[2,5],[2,3],[1,3],[3,5],[16,-16],[22,2]],[[5816,4388],[11,17],[12,24],[2,4]],[[5841,4433],[51,-38],[13,-10],[3,-3]],[[5908,4382],[-1,-4]],[[5907,4378],[-7,-18],[-5,-12],[-29,-75]],[[5866,4273],[-4,-1],[-10,-4],[-19,-8],[-5,-1],[-3,-2],[-4,-1],[-4,-1]],[[5817,4255],[-5,-1],[-3,-1],[-4,-1],[-4,-1],[-5,-1],[-4,-1],[-3,0],[-4,-1],[-4,0],[-5,0],[-3,-1],[-6,0],[-5,0],[-7,0],[-7,1],[-6,0],[-6,1],[-4,1],[-4,0],[-4,1],[-5,1],[-5,2],[-4,1],[-4,1],[-10,3],[-4,2],[-4,1],[-6,3],[-5,2],[-4,3],[-4,2],[-4,2],[-3,2],[-8,4],[-4,4],[-4,2],[-3,2],[-3,3],[-3,2],[-3,3],[-3,3],[-3,2],[-10,10],[-10,10]],[[5727,4299],[3,8],[7,9],[5,4],[11,6]],[[5753,4326],[20,14]],[[5773,4340],[9,-17]],[[5672,4326],[9,20],[10,18]],[[5691,4364],[12,16],[29,-30],[18,-19],[2,-2],[1,-3]],[[5691,4364],[-13,14],[-15,14]],[[5663,4392],[47,61]],[[5710,4453],[13,-11],[15,-12],[31,-28],[-11,-17],[-12,-18],[23,-23],[2,-1],[2,-3]],[[5630,4349],[10,12],[12,16]],[[5652,4377],[11,15]],[[5652,4377],[-54,56]],[[5598,4433],[12,15]],[[5610,4448],[27,-28],[12,16],[19,27],[14,-12],[12,17],[16,-15]],[[9686,9775],[-1,-1],[-1,-1],[-36,-32],[-3,-2],[-2,-2],[-6,-6],[-7,-7],[-4,-5],[-5,-6],[-7,-10],[-6,-8],[-6,-11],[-2,-5]],[[9600,9679],[-4,-9],[-4,-10],[-4,-12],[-5,-26],[-1,-3],[-1,-6],[-7,-33]],[[9574,9580],[-6,-27],[-7,-25],[-4,-16],[-6,-28],[-16,-74],[-14,-65],[-10,-51]],[[9511,9294],[-10,-47],[-14,-67]],[[9487,9180],[-14,-68]],[[9473,9112],[-11,-50]],[[9462,9062],[-4,-1],[-8,-3],[-183,-67],[-130,-40]],[[9137,8951],[0,6],[1,6],[0,5],[1,6],[1,5],[0,5],[1,4],[1,9],[2,7],[2,12],[2,6],[1,6],[4,13],[6,23],[116,418],[29,103],[2,7],[22,78],[2,9],[1,4],[3,13],[2,7],[1,4],[1,9],[2,9],[0,4],[1,6],[1,4],[1,10],[0,6],[0,4],[1,3],[0,7],[0,41],[-3,0],[0,1],[0,12],[0,5],[0,6],[0,4]],[[9341,9838],[4,1],[6,2],[19,6],[6,2],[11,5],[8,3],[28,4],[5,-1],[4,-2],[2,-2],[3,-3],[2,-5],[2,-5],[3,-13],[5,-12],[2,-10],[1,-3],[1,-8],[5,-9],[10,-10],[14,-9],[11,-4],[9,0],[13,3],[13,-22],[2,-3],[9,-15],[3,-3],[2,0],[2,0],[32,13],[4,1],[-13,20],[11,9],[2,4],[-1,4],[-5,13],[14,3],[9,2],[9,3],[9,2],[5,0],[3,-1],[10,-2],[45,-12],[14,8],[1,0],[1,-1],[1,-1],[3,-4]],[[9700,9786],[-2,-2],[-10,-8],[-2,-1]],[[9673,9553],[-5,-24]],[[9668,9529],[-1,-3],[-1,-5],[-1,-11],[-2,-10],[-2,-17],[-2,-12],[-2,-12],[0,-9],[-7,-140]],[[9650,9310],[-30,-15],[-41,-6],[-36,1],[-32,4]],[[9574,9580],[37,-11],[1,9],[4,16],[5,23],[34,-9],[20,-6]],[[9675,9602],[-6,-33],[-3,-14],[7,-2]],[[9853,9901],[0,-3],[-1,-13],[-3,-13],[-6,-23],[-2,-5],[-1,-5],[-1,-6],[0,-3],[0,-2],[0,-1],[0,-1],[0,-1],[-1,-1],[-1,-1],[-1,-2],[-1,0],[-1,-1],[-1,0],[-1,1],[-1,0],[-1,1],[-1,2],[-1,1],[-1,0],[-2,0],[-2,1],[-2,0],[-2,-1],[-10,-2]],[[9809,9823],[-43,-11]],[[9766,9812],[-3,-1],[-11,-2],[-20,-6],[-14,-6],[-11,-6],[-5,-4],[-2,-1]],[[9341,9838],[0,1],[1,5],[0,5]],[[9342,9849],[3,0],[6,-1],[14,2],[12,4],[8,6],[9,3],[25,1],[8,2],[4,-1],[12,1],[15,-6],[8,2],[3,-1],[4,-4],[0,-5],[9,1],[4,-2],[4,-2],[3,-5],[2,-6],[6,-32],[2,-6],[1,-1],[4,-4],[8,-1],[3,0],[3,0],[4,0],[8,-4],[1,-4],[-4,-3],[-4,-1],[-4,0],[-4,-2],[-1,-1],[1,-1],[3,0],[2,0],[6,1],[11,5],[23,14],[8,2],[11,3],[5,4],[6,5],[4,1],[12,-1],[7,4],[14,13],[9,1],[8,4],[5,3],[8,8],[3,1],[6,2],[5,5],[7,2],[8,6],[5,1],[13,8],[16,10],[21,8],[9,10],[5,5],[3,0],[10,-2],[8,2],[8,4],[7,1],[8,4],[2,2],[6,6],[2,0],[8,-4],[5,1],[3,2],[5,6],[3,2],[8,1],[5,3]],[[9850,9931],[1,-16],[1,-5],[1,-9]],[[9667,9996],[2,-4],[4,0],[4,-1],[2,-3],[-3,-7],[1,-14],[-2,-9],[-4,-1],[-5,0],[-6,-3],[-15,-10],[-7,-7],[-6,-3],[-6,-10],[-12,-9],[-4,-4],[-4,-7],[-3,-5],[-6,0],[-1,2],[0,7],[-1,4],[-3,-1],[-1,-9],[-5,-19],[-3,-8],[-14,-13],[-6,-4],[-6,-1],[-14,3],[-22,9],[-2,4],[-1,4],[-1,4],[1,6],[1,4],[0,5],[1,5],[-2,7],[-2,5],[-1,7],[1,7],[5,2],[11,6],[5,6],[-1,5],[3,5],[7,1],[9,0],[9,2],[8,4],[6,4],[18,4],[19,8],[10,2],[6,5],[1,1],[13,12],[15,5],[4,0],[3,-3]],[[9455,8069],[-41,10]],[[9414,8079],[-42,11]],[[9372,8090],[5,21],[4,21],[4,21],[-24,6],[0,9],[-1,9],[8,1],[23,-6],[2,0],[1,2],[6,26]],[[9400,8200],[4,-1],[14,-7],[4,8],[7,12],[5,7],[6,6],[6,10],[1,3]],[[9447,8238],[20,-5]],[[9467,8233],[-4,-9],[-8,-12],[-9,-9],[-2,-3],[-4,-7],[15,-8],[1,-3],[-3,-5],[-3,-8],[-5,-28],[0,-3],[2,-1],[7,-2],[13,-1],[-1,-9],[-3,-15],[-4,-21],[-4,-20]],[[9563,8153],[-7,8],[-15,4],[-9,-47],[-1,-2],[-4,0],[-18,5],[-5,-21],[-4,-21],[-4,-21]],[[9496,8058],[-41,11]],[[9467,8233],[3,11],[1,8],[3,12],[1,5]],[[9475,8269],[22,-6],[15,-4],[18,-4],[15,-4],[49,-12],[24,-6],[2,-1]],[[9619,8026],[-41,11],[-41,11]],[[9537,8048],[-41,10]],[[9562,7952],[-42,11]],[[9520,7963],[-41,10],[4,20],[4,21],[5,23],[4,21]],[[9537,8048],[-4,-21],[-5,-24],[42,-10],[-4,-21],[-4,-20]],[[9615,8005],[-4,-23],[-4,-21],[-4,-19],[-41,10]],[[9569,7926],[-56,15]],[[9513,7941],[7,22]],[[8590,2180],[-19,-7],[-12,-5],[-11,-4],[-6,-4],[-4,-5],[-3,-3],[-3,-4]],[[8532,2148],[-14,-17],[-5,-4],[-10,-5],[-7,-2],[-6,0],[-15,2]],[[8475,2122],[-9,1],[-8,-2],[-11,-4],[-8,-8],[-4,-8],[-3,-10],[-1,-8],[1,-29],[0,-9],[0,-4],[0,-6]],[[8432,2035],[-2,-6],[-4,-16],[-8,-24],[0,-5],[-1,-9],[0,-5],[0,-3],[2,-1],[3,-2],[7,-4],[7,-1],[11,-1]],[[8447,1958],[0,-10],[-4,-7],[-6,-3],[-4,-4],[-2,-3],[-3,-4],[-2,-5],[-1,-4],[-2,-9],[1,-9],[-1,-10],[-3,-6],[-5,-6],[-1,-3],[-1,-3],[-1,-2],[-1,-3],[0,-3],[0,-8],[4,-8]],[[8415,1848],[-48,25]],[[8367,1873],[9,30],[4,12],[7,32],[3,60],[5,36],[1,42],[1,35],[5,12],[8,16],[4,6],[21,15],[3,0],[27,6],[9,2],[19,0],[2,2],[5,7],[13,16],[7,6],[27,24],[8,11],[3,4],[4,5],[0,8],[2,6],[4,2],[3,6],[2,5],[1,4],[7,7],[6,3],[6,8],[12,6],[21,11],[7,9],[3,11],[8,12],[3,7],[5,4],[8,8],[4,7],[1,4],[6,12],[4,5],[4,-2],[1,-1],[3,0]],[[8475,2122],[-3,-41],[-18,1],[-2,-25],[0,-17],[-1,-3],[-3,-3],[-4,0],[-12,1]],[[8489,1978],[2,-2],[1,-3],[-1,-17]],[[8491,1956],[-4,0],[-40,2]],[[8532,2148],[4,-7],[-2,-3],[-7,-7],[-3,-6],[2,-8],[2,-9],[3,-16],[2,-9],[13,-9],[-5,-8],[-3,0],[0,-1],[1,-2],[0,-1],[-1,-3],[-2,-1],[-2,-1],[-2,-2],[-3,-1],[-6,-2],[-12,-2],[-11,-2],[-2,-1],[-2,-1],[-5,-7],[0,-14],[-1,-18],[-12,0],[0,-6],[11,0],[0,-23]],[[8615,2038],[-12,-6],[-1,3],[-16,12],[-4,0],[-11,-19],[-7,-12],[-1,-4],[2,-13],[0,-4],[-3,-3],[-2,-2],[-16,-4],[-17,-5],[-10,-2],[-9,-1],[-19,0]],[[8615,2038],[-20,-48],[-2,-7],[0,-8],[0,-10],[5,-13],[6,-10],[3,-7],[1,-2]],[[8608,1933],[-7,8],[-4,3],[-4,3],[-9,3],[-4,2],[-5,1],[-4,2],[-6,1],[-5,0],[0,-3],[0,-8],[0,-9],[0,-1],[-3,-7],[-3,-5],[-3,-4],[-5,6],[-7,9],[-3,1],[-2,0],[-2,1],[-2,0],[-12,1],[-7,0],[-23,1]],[[8488,1938],[2,2],[1,16]],[[8663,1958],[-1,-5],[0,-5],[-5,-13],[-7,-15]],[[8633,1900],[-16,20],[-9,13]],[[8633,1900],[-4,-3],[-26,-30],[-9,-10]],[[8594,1857],[-5,7],[-27,-13],[-8,8],[-39,-31],[0,-6]],[[8515,1822],[-100,26]],[[8415,1848],[27,20],[12,8],[5,4],[5,4],[5,5],[11,-16],[2,-1],[2,0],[2,2],[7,9],[2,2],[-1,3],[-2,4],[-11,16],[2,6],[3,8],[1,8],[1,8]],[[8633,1765],[-26,-29],[-10,-17],[-11,-16]],[[8586,1703],[-3,3],[-18,21],[-10,12],[-25,31],[13,16],[-24,28],[-5,5],[1,3]],[[8594,1857],[5,-6],[-1,-33],[5,-17],[27,-33],[3,-3]],[[8658,1867],[3,-7],[3,-8],[2,-9],[1,-12],[0,-11],[-3,-11],[-3,-7],[-6,-11],[-9,-11],[-13,-15]],[[8741,2856],[7,-18],[4,-4],[6,-10],[10,-20],[6,-18],[3,-18],[0,-32],[-44,-209],[-13,-38],[-6,-1],[-2,0],[-4,-1],[-3,-1],[-5,-3],[-18,-18],[-14,-16],[-12,-14],[-7,-8],[-13,-9],[-34,-29],[-59,-44],[-61,-48],[0,-5],[-1,0],[-5,-4],[-13,-11],[-27,-15],[-31,-10],[-6,-2],[-6,0],[-9,1],[-47,39],[-3,0],[0,-3],[26,-22],[13,-12],[1,-2],[12,-7],[9,-1],[-2,-5],[-7,-8],[-6,-5]],[[8260,2321],[2,5]],[[8262,2326],[1,2],[1,3],[7,14]],[[8271,2345],[9,20]],[[8280,2365],[10,23],[12,25],[11,23]],[[8313,2436],[10,27]],[[8323,2463],[4,-3],[17,-9],[19,-11],[12,31],[15,39]],[[8390,2510],[1,-2],[18,0],[85,-4],[23,17],[5,6],[1,8],[1,19],[-36,0],[-29,1]],[[8459,2555],[0,23]],[[8459,2578],[0,22],[0,11],[0,12],[0,17],[0,1],[-1,1],[-59,1],[0,-18],[1,-1]],[[8400,2624],[-42,0],[-5,0]],[[8353,2624],[0,7],[1,13]],[[8354,2644],[1,15],[1,5],[2,7],[4,40],[1,5],[2,19]],[[8365,2735],[4,31],[5,49],[1,3],[0,3],[0,3]],[[8375,2824],[42,-6],[58,-10],[41,-6],[28,-4],[18,2],[12,2],[27,11],[4,1],[5,2],[5,1],[3,1],[2,1],[15,3],[16,4],[12,2],[12,3],[12,3],[6,2],[7,2],[8,5],[6,3],[3,2],[3,1],[1,1],[2,1]],[[8723,2851],[2,1],[3,-3],[13,7]],[[9137,3084],[1,1]],[[9138,3085],[2,-5],[-1,-2],[-1,1],[-1,5]],[[8390,2510],[5,12],[4,12]],[[8399,2534],[42,-1],[17,0],[1,22]],[[8399,2534],[0,11],[0,11]],[[8399,2556],[0,11],[0,12]],[[8399,2579],[32,-1],[28,0]],[[8312,3700],[-8,-17],[-8,-15],[-10,-20],[-8,-15]],[[8152,3727],[4,19]],[[8156,3746],[7,23],[5,21],[4,15]],[[8172,3805],[11,-8],[21,-16],[13,-9],[37,-28],[1,-1],[28,-21],[9,-7],[3,-2],[9,-7],[8,-6]],[[7761,6574],[-73,54],[-19,-32],[-22,-41],[-14,11]],[[7633,6566],[-16,12],[-22,17],[-21,18],[-2,2]],[[7572,6615],[-3,2],[-11,11],[-8,9],[-13,12],[-9,9],[-17,17]],[[7511,6675],[25,23],[10,9],[28,24],[24,17],[42,29],[13,11]],[[7653,6788],[5,-4],[17,-12],[67,-46]],[[7742,6726],[52,-35],[23,-16]],[[7817,6675],[-1,-3],[-10,-16],[-22,-42],[-23,-40]],[[7720,6501],[-1,-3],[-10,-18],[-14,11],[-4,-1],[-21,-40],[-17,13],[-11,-19]],[[7642,6444],[-8,-9]],[[7634,6435],[-14,16],[7,9],[10,14],[22,40],[-1,4],[-14,10]],[[7644,6528],[-18,14],[-2,1],[-1,2],[0,2],[1,3],[8,14],[1,2]],[[7761,6574],[-19,-33],[-22,-40]],[[8399,2579],[1,22],[0,23]],[[8345,2556],[3,23],[3,23],[2,22]],[[8399,2556],[-26,0],[-28,0]],[[8340,2511],[3,23],[2,22]],[[8390,2510],[-8,0],[-16,0],[-14,1],[-12,0]],[[8323,2463],[10,27],[7,21]],[[8313,2436],[-14,28],[-9,18]],[[8290,2482],[-8,16]],[[8282,2498],[14,17],[2,2],[9,40],[9,0],[10,0],[10,-1],[9,0]],[[8282,2498],[-10,19]],[[8272,2517],[-9,18],[-1,3],[-2,4]],[[8260,2542],[31,39],[18,21],[16,19]],[[8325,2621],[13,10],[16,13]],[[8325,2621],[2,6],[-15,13],[-14,13]],[[8298,2653],[25,37],[13,21],[4,6],[18,27],[7,-9]],[[8298,2653],[-11,16],[-7,9]],[[8280,2678],[-7,10],[-7,9],[-13,18],[-16,22],[-14,-14]],[[8223,2723],[-18,26],[-2,3]],[[8203,2752],[19,20],[11,11],[6,4],[26,24],[3,1],[26,25],[31,30],[47,41],[4,3]],[[8376,2911],[4,-26],[0,-6],[1,-6],[-3,-25],[-3,-24]],[[8446,3301],[8,-49],[2,-4],[4,-7],[1,-2],[1,-3],[2,-32]],[[8464,3204],[-4,0],[-24,14],[-12,7],[-27,15],[-8,5],[-11,6]],[[8378,3251],[19,34],[4,7],[7,21],[11,-5],[5,-3],[22,-4]],[[8378,3251],[-15,8],[-8,5],[-14,8],[-11,6]],[[8330,3278],[-15,9],[-26,15]],[[8289,3302],[8,16],[6,12],[5,9],[5,11]],[[8313,3350],[17,32],[5,10],[3,7],[8,14],[10,22],[14,24],[6,13]],[[8376,3472],[10,-6],[8,-6],[15,-10],[23,-14],[-4,-13],[-10,-28],[13,-6],[12,-5],[5,-2]],[[8448,3382],[-3,-15],[-1,-13],[1,-32],[1,-21]],[[8505,3564],[-7,-24],[-9,-26],[-6,-19],[-3,-6],[-1,-6],[-6,-16],[-9,-23],[-4,-12],[-2,-10],[-4,-13],[-6,-27]],[[8376,3472],[21,51],[4,5],[4,8]],[[8405,3536],[15,36],[3,8],[7,21],[3,8]],[[8433,3609],[12,-9],[10,-8],[16,-12],[3,-1],[19,-7],[0,-4],[9,-4],[3,0]],[[8376,3472],[-13,10],[-3,2],[-1,1],[-4,3],[-3,2],[-4,4],[-26,19]],[[8322,3513],[7,17],[13,28],[8,20]],[[8350,3578],[25,-18],[11,-9],[4,-3],[4,-3],[11,-9]],[[8350,3578],[-16,13],[-11,8]],[[8323,3599],[9,15],[10,18],[17,32]],[[8359,3664],[23,-17],[24,-18],[11,-8],[1,-1],[4,-3],[11,-8]],[[8322,3513],[-30,23],[-4,3],[-9,7],[-9,7],[-25,19]],[[8278,3633],[23,-18],[18,-13],[4,-3]],[[8312,3700],[26,-20],[18,-13],[3,-3]],[[8121,3613],[-15,11],[-8,5],[-5,3]],[[8093,3632],[-44,32]],[[8049,3664],[6,11],[1,2],[6,10],[4,8],[5,9]],[[8071,3704],[41,-29],[21,-16]],[[8133,3659],[-4,-17],[-8,-29]],[[8074,3602],[-2,1]],[[8072,3603],[-5,4],[-35,26]],[[8032,3633],[7,13],[10,18]],[[8093,3632],[-11,-19],[-4,-7],[-4,-4]],[[8111,3574],[-9,6],[-3,3],[-25,19]],[[8121,3613],[-6,-22],[-4,-17]],[[8096,3522],[-48,37]],[[8048,3559],[8,14],[6,10]],[[8062,3583],[5,10],[5,10]],[[8111,3574],[-5,-20],[-10,-32]],[[8048,3559],[-40,31]],[[8008,3590],[13,24],[41,-31]],[[8008,3590],[-11,-20]],[[7997,3570],[-18,13],[-22,17]],[[7957,3600],[-7,8],[-3,4]],[[7947,3612],[5,5],[6,11],[2,4]],[[7960,3632],[8,-7],[11,-10],[5,-6],[7,-5],[17,-14]],[[8027,3517],[-6,5],[-21,16],[-15,12]],[[7985,3550],[-18,14],[-20,15]],[[7947,3579],[1,3],[1,3],[3,2],[1,2],[1,3],[2,3],[1,5]],[[7997,3570],[10,-8],[26,-20],[4,-3]],[[8037,3539],[2,-2]],[[8039,3537],[-5,-9],[-7,-11]],[[8006,3479],[-10,8],[-7,6],[-17,13],[-9,7]],[[7963,3513],[7,12],[-20,15],[-8,6],[-9,7]],[[7933,3553],[12,22],[2,4]],[[7985,3550],[-6,-10],[-6,-10],[8,-6],[1,-1],[12,-10],[21,-17]],[[8015,3496],[-5,-9],[-4,-8]],[[8027,3517],[-12,-21]],[[8071,3451],[-12,9],[-9,8],[-14,11],[-14,11],[-7,6]],[[8027,3517],[20,-16],[18,-14],[4,-3],[11,-8]],[[8080,3476],[-4,-11],[-5,-14]],[[8088,3499],[-8,-23]],[[8039,3537],[37,-29],[12,-9]],[[8096,3522],[-8,-23]],[[8037,3539],[5,9],[6,11]],[[8289,3302],[-6,-12],[-3,-6],[-14,-28],[-2,-3],[-6,-12],[-2,-4],[-2,-2],[-1,-2],[-2,-2],[-1,-2],[-1,-1],[0,-1],[-30,-42],[-8,-10],[-10,-13],[-15,-20]],[[8186,3142],[-2,3],[-21,16],[-12,11],[-4,3],[-22,18],[-5,6],[-4,2],[-2,3],[-2,3],[-23,18],[-7,6],[-9,7],[-10,7]],[[8063,3245],[-9,7],[-1,2],[-25,20],[-24,20],[-3,1],[-7,6],[-4,5]],[[7990,3306],[14,22],[3,5],[9,16],[11,18],[13,22],[12,20]],[[8052,3409],[11,20],[7,18],[1,4]],[[8096,3522],[9,-7],[3,-2],[11,-9],[13,-11],[13,-10],[15,-11],[23,-19]],[[8183,3453],[10,-7],[33,-27],[3,-2],[7,-6],[13,-10],[19,-15],[18,-15],[3,1],[3,-2],[2,-2],[1,0],[1,-3],[1,-1],[16,-14]],[[8052,3409],[-59,48]],[[7993,3457],[13,22]],[[7993,3457],[-21,16],[-7,6],[-15,12]],[[7950,3491],[8,13],[5,9]],[[7950,3491],[-30,26]],[[7920,3517],[5,19],[2,1],[6,16]],[[7387,3495],[-118,-167],[-6,-12],[-20,-36],[-13,-29],[-12,-21],[-2,-3],[-6,-4],[-7,-5],[-5,-13],[-1,-10],[-1,-8],[-4,-9],[-5,-7],[-7,-6],[-6,-12],[-3,-7],[-1,-4],[0,-3],[-1,-4]],[[7169,3135],[-17,14]],[[7152,3149],[-27,23]],[[7125,3172],[39,74],[6,13],[2,31],[-3,10],[-9,32]],[[7160,3332],[-2,8],[-4,5],[-4,3],[-2,2],[-3,3]],[[7145,3353],[8,13],[0,1],[10,18],[4,7],[15,28],[-10,7]],[[7172,3427],[37,66]],[[7209,3493],[9,-7],[39,72],[2,5],[3,6],[3,3],[4,3],[3,2],[2,2],[5,3]],[[7279,3582],[10,-8]],[[7289,3574],[34,-25],[64,-54]],[[7172,3427],[-13,-25],[-10,7],[-6,4],[2,5]],[[7145,3418],[12,21],[11,22],[13,22],[12,21]],[[7193,3504],[5,-3],[10,-7],[1,-1]],[[7145,3353],[-17,13],[-5,-9],[-35,26],[-4,18]],[[7084,3401],[13,25]],[[7097,3426],[10,19]],[[7107,3445],[38,-27]],[[7107,3445],[12,21],[13,24],[11,21]],[[7143,3511],[12,22],[10,16]],[[7165,3549],[37,-27],[-9,-18]],[[7097,3426],[-42,31],[-5,11]],[[7050,3468],[33,62],[-15,21]],[[7068,3551],[12,-8],[21,2],[34,-26],[6,-4],[2,-4]],[[7050,3468],[-7,13],[-11,8],[-20,16]],[[7012,3505],[23,43],[6,23]],[[7041,3571],[27,-20]],[[7016,3593],[8,-9],[2,-2],[15,-11]],[[7012,3505],[-12,7],[-14,3],[-12,2]],[[6974,3517],[42,76]],[[6974,3517],[-19,8]],[[6955,3525],[13,4],[26,49],[10,15]],[[7004,3593],[12,0]],[[6955,3525],[-9,5],[-16,17]],[[6930,3547],[14,3],[18,34],[25,49],[2,-11],[15,-29]],[[7012,3505],[-11,-19],[-8,-8],[-4,-4],[-19,-17],[-6,-9],[-7,-21]],[[6957,3427],[-18,13]],[[6939,3440],[-36,25],[-4,3],[-13,10]],[[6886,3478],[7,12],[17,20],[20,37]],[[6886,3478],[0,20],[29,53],[-2,20]],[[6913,3571],[17,-24]],[[7481,5741],[-15,-10]],[[7466,5731],[-60,40]],[[7406,5771],[6,7],[12,5],[9,7]],[[7433,5790],[38,32]],[[7471,5822],[5,-8],[9,-8]],[[7485,5806],[14,-10],[-15,-28],[-12,-8],[9,-19]],[[7406,5771],[-56,40]],[[7350,5811],[5,8]],[[7355,5819],[9,14],[9,8],[19,15]],[[7392,5856],[11,-18]],[[7403,5838],[30,-48]],[[7485,5806],[17,15],[14,11],[4,0],[25,-19],[-10,-18],[-10,-18],[5,-5]],[[7530,5772],[-29,-55],[-4,-1],[-3,3],[-13,22]],[[7549,5614],[-2,2],[-4,2],[-52,38]],[[7491,5656],[14,26],[6,10],[3,5],[-48,34]],[[7530,5772],[16,-11],[29,55],[2,3],[10,17]],[[7587,5836],[13,26],[10,17],[11,18]],[[7621,5897],[15,-11]],[[7636,5886],[16,-13],[20,-14],[2,-2],[2,-1],[3,-3]],[[7679,5853],[-9,-18],[-10,-18]],[[7660,5817],[-1,-2],[-1,-2],[-3,-4],[-18,-34]],[[7637,5775],[-2,-3],[-1,-3],[-13,-23],[-14,-25],[-17,-32],[-23,-43],[-14,-25],[-4,-7]],[[7066,6051],[-10,-19]],[[7056,6032],[-11,13],[-8,-14],[-4,-8],[11,-8],[2,-1],[-4,-8],[-1,-1],[-4,-7]],[[7037,5998],[-7,5],[-7,5],[-7,5],[-6,4],[-20,-36],[-5,-9]],[[6985,5972],[-12,9],[-14,10],[-13,10]],[[6946,6001],[6,11],[2,5],[1,1],[1,3],[2,6],[8,15],[18,34],[1,4],[3,8],[2,11],[3,6],[4,-3],[69,-51]],[[8088,5335],[-3,1],[-7,4],[-2,1],[-22,12],[-3,1],[-8,4]],[[8043,5358],[-8,5],[-2,1],[-44,22],[-10,5],[-11,6]],[[7968,5397],[10,18]],[[7978,5415],[10,19]],[[7988,5434],[12,-6],[52,-27],[11,-5]],[[8063,5396],[11,-5],[24,-13],[8,-4],[2,-2]],[[8453,7042],[-11,-20]],[[8442,7022],[-59,43]],[[8383,7065],[11,20],[8,15],[7,14]],[[8409,7114],[59,-43]],[[8468,7071],[-7,-14],[-8,-15]],[[8475,7085],[-59,43]],[[8416,7128],[7,14],[41,77],[25,-19],[-3,-8],[33,-25]],[[8519,7167],[-10,-18],[-26,-50],[-8,-14]],[[8417,6967],[-5,3],[-11,8]],[[8401,6978],[-30,22],[-15,11],[-2,1],[-3,3]],[[8351,7015],[2,3],[6,12],[10,20],[10,18]],[[8379,7068],[4,-3]],[[8442,7022],[-9,-17]],[[8433,7005],[-8,-15],[-8,-15],[0,-4],[0,-4]],[[8360,6900],[-16,13],[-18,12]],[[8326,6925],[-13,10],[-6,-3]],[[8307,6932],[17,32],[4,8],[11,20],[1,2],[9,16],[2,5]],[[8401,6978],[-2,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-3],[-11,-21],[-15,-27],[-9,-23]],[[8384,6768],[-19,-1],[-15,0]],[[8350,6767],[1,2],[2,15],[1,3],[2,11],[0,3],[-3,0],[-15,4],[-2,2],[0,2],[1,7]],[[8337,6816],[6,22],[5,21],[7,21],[-23,17],[-15,11],[9,17]],[[8360,6900],[17,-12],[3,-2],[30,-20]],[[8410,6866],[1,-1],[16,-12]],[[8427,6853],[-6,-10],[-13,-54],[-17,-1],[-8,0],[1,-20]],[[8272,6779],[-7,-14],[-2,-10],[0,-13],[4,-14],[11,-16],[19,-27]],[[8297,6685],[9,-8],[13,-6],[17,-5],[3,-1]],[[8339,6665],[-1,-3],[-1,-4],[-1,-3],[-1,-3],[-4,-10],[-3,-9],[27,-19],[62,-45]],[[8417,6569],[-2,-4],[-2,-2]],[[8413,6563],[-24,18],[-18,13],[-13,9],[-4,3],[-4,3],[-4,2],[-3,3],[-4,3],[-19,14],[-3,3],[-10,8],[-7,6],[-14,11],[-4,4],[-3,3],[-3,3],[-4,4],[-2,2],[-3,3],[-9,9],[-5,5],[-3,3],[-1,1],[-5,4],[-5,6],[-23,23]],[[8216,6729],[0,2],[0,2],[0,1],[-1,2],[0,2],[1,2],[1,2],[1,1],[1,3],[1,1],[1,4],[2,4],[2,6],[2,7],[1,3],[2,4],[1,3],[2,5],[1,4],[1,4],[2,5],[2,5],[2,4],[1,3],[3,5],[3,6],[6,11],[4,9],[6,11],[5,9],[6,12],[5,8],[10,20],[17,33]],[[8337,6816],[-25,7],[-2,-5],[-12,8],[-5,-9],[-18,11],[-10,-19],[17,-12],[-10,-18]],[[7644,6528],[-13,-22]],[[7631,6506],[-32,24]],[[7599,6530],[-32,25],[-17,13]],[[7550,6568],[7,22],[3,10]],[[7560,6600],[10,12],[2,3]],[[7634,6435],[-15,-16]],[[7619,6419],[-5,8],[-9,11],[-12,12]],[[7593,6450],[5,9],[6,6],[8,8],[9,13],[10,20]],[[7593,6450],[-49,38]],[[7544,6488],[5,9],[3,8],[8,-3],[16,-12],[12,21],[11,19]],[[7544,6488],[-5,3],[-10,2]],[[7529,6493],[1,11],[16,51],[4,13]],[[8063,5396],[10,18]],[[8073,5414],[9,-4],[1,-1],[23,-11],[2,-1],[8,-4],[2,-2]],[[8073,5414],[10,19],[10,19],[8,-4],[7,-4],[5,11],[12,22],[13,-9],[-6,-13],[-10,-18],[3,-2],[11,-5],[2,-1]],[[7988,5434],[10,18]],[[7998,5452],[2,3],[8,16]],[[8008,5471],[10,19],[20,39]],[[8038,5529],[20,38]],[[8058,5567],[75,-39],[29,-15],[6,-3],[9,-4],[2,-1]],[[8058,5567],[8,15],[10,21]],[[8076,5603],[76,-39],[29,-15],[9,-4],[6,-3],[3,-2]],[[8209,5561],[-10,-21]],[[8076,5603],[7,11],[5,10],[11,20]],[[8099,5644],[11,-6],[55,-27],[9,-5]],[[8174,5606],[-11,-20],[12,-6],[32,-17],[2,-2]],[[8026,5219],[-4,-7]],[[8022,5212],[-3,1],[-9,5],[-5,2],[-18,9],[-9,5]],[[7978,5234],[12,23],[6,11],[6,11],[2,4]],[[8004,5283],[41,-22],[2,-1]],[[8047,5260],[-2,-3],[-10,-20],[-9,-18]],[[8006,5182],[-10,-20]],[[7996,5162],[-3,1],[-24,12],[-17,9],[14,26],[12,24]],[[8022,5212],[-6,-11],[-10,-19]],[[7942,5060],[-3,-6]],[[7939,5054],[-3,1],[-33,16],[-8,4]],[[7895,5075],[-31,15]],[[7864,5090],[-36,19],[-8,4]],[[7820,5113],[11,23],[12,22],[12,23]],[[7855,5181],[24,45],[12,23],[12,23]],[[7903,5272],[12,23]],[[7915,5295],[12,23],[2,3]],[[7929,5321],[75,-38]],[[7996,5162],[-12,-21]],[[7984,5141],[-11,-22],[-11,-22]],[[7962,5097],[-10,-19],[-10,-18]],[[7895,5075],[-11,-20],[-12,-23],[-12,-24],[-10,-18]],[[7850,4990],[-63,31],[-3,1],[-10,5]],[[7774,5027],[10,18],[12,25],[12,23]],[[7808,5093],[9,-5],[3,-1],[37,-18],[4,11],[3,10]],[[7866,4917],[-9,5],[-34,17]],[[7823,4939],[17,32],[10,19]],[[7939,5054],[-6,-12],[-5,-9],[-4,-8]],[[7924,5025],[-6,-11],[-3,-3],[-2,-4],[-11,-21],[-9,-18]],[[7893,4968],[-10,-18],[-8,-15],[-9,-18]],[[7913,4893],[-9,5],[-26,13],[-12,6]],[[7893,4968],[9,-4],[3,-1],[19,-10],[10,-4]],[[7934,4949],[-7,-19]],[[7927,4930],[-7,-17],[-7,-20]],[[7961,4869],[-9,5],[-30,15],[-9,4]],[[7927,4930],[9,-4],[30,-15],[9,-5]],[[7975,4906],[-7,-18],[-7,-19]],[[7961,4869],[-6,-18],[-7,-18]],[[7948,4833],[-9,5],[-30,14],[-9,5]],[[7900,4857],[6,18],[-9,5],[-26,13],[-5,3],[-3,1],[-7,2]],[[7856,4899],[6,10],[2,5],[2,3]],[[7711,4725],[-68,52]],[[7643,4777],[6,12],[6,11],[6,11],[6,12]],[[7667,4823],[68,-52]],[[7735,4771],[-6,-12],[-6,-11],[-6,-11],[-6,-12]],[[7749,4696],[-12,-25]],[[7737,4671],[-10,9],[-29,21],[-67,53]],[[7631,4754],[6,11],[6,12]],[[7711,4725],[29,-22],[9,-7]],[[7726,4651],[-38,30]],[[7688,4681],[-67,52]],[[7621,4733],[5,10],[5,11]],[[7737,4671],[-5,-10],[-6,-10]],[[3815,1681],[-46,-14],[-2,0],[-1,2],[-5,22],[-11,-3],[-4,-2],[-6,-6],[-18,-23],[-18,79]],[[3704,1736],[18,22],[6,7],[14,4],[50,16],[-3,12],[8,3],[11,4],[8,5],[7,3],[12,5],[20,5]],[[3855,1822],[6,-26],[1,-7],[3,-37],[2,-21],[-31,-10],[-8,-3],[-9,-2],[-8,-1],[0,-12],[1,-10],[3,-12]],[[3914,1792],[7,-27],[3,-16]],[[3924,1749],[-20,-6],[-23,-8],[3,-20],[2,-11],[1,-11],[3,-25],[2,-12],[4,-31],[1,-4],[3,-8],[4,-8],[10,-14],[2,-3],[2,-3],[0,-1]],[[3918,1584],[-37,1],[-3,0],[-5,1],[-10,0],[-66,1],[-49,-3],[-3,0],[-36,-5],[-16,-2]],[[3693,1577],[-2,8]],[[3691,1585],[25,5],[11,3],[9,6],[22,1],[16,2],[6,-1],[-1,12],[0,3],[0,6],[-2,8],[-2,10],[0,2],[2,2],[44,13],[-6,24]],[[3855,1822],[9,3]],[[3864,1825],[3,-2],[6,-1],[4,-1],[4,0],[13,-1],[13,3]],[[3907,1823],[3,-12],[4,-19]],[[4066,1586],[3,-5]],[[4069,1581],[-143,3],[-1,0],[-6,0],[-1,0]],[[3924,1749],[19,7],[3,0],[8,-33]],[[3954,1723],[19,-86],[3,-2],[3,0],[7,-3],[6,-3],[15,-11],[4,-30],[26,-1],[29,-1]],[[4037,1733],[-26,-7],[-2,-2],[-1,-4],[-17,-20],[-3,-4],[-5,8],[-6,7],[-8,6],[-10,4],[-3,0],[-2,2]],[[3914,1792],[61,48],[12,-22],[6,-10],[3,-13],[25,20],[16,-82]],[[4037,1733],[12,-59],[23,6]],[[4072,1680],[10,-46],[4,-25],[4,-23],[-24,0]],[[4204,1662],[15,-81],[-19,1],[3,-6]],[[4203,1576],[-95,4],[-39,1]],[[4072,1680],[26,9],[10,2]],[[4108,1691],[6,-34],[1,-2],[3,-1],[23,0],[29,-1],[16,4],[18,5]],[[4108,1691],[-6,30],[1,4],[21,17],[16,12],[26,7],[18,5],[22,6]],[[4206,1772],[3,-18],[3,-17],[3,-17],[4,-17],[3,-18],[4,-17],[-22,-6]],[[5108,1550],[-230,8],[-32,1],[-64,-2],[-93,2]],[[4689,1559],[-2,0],[-182,7],[-261,8]],[[4244,1574],[-6,0],[-35,2]],[[4206,1772],[17,5],[23,6],[-1,4],[-4,23],[-6,33],[-17,91],[147,186]],[[4365,2120],[155,-161],[188,239],[184,246],[127,167],[24,34],[10,4],[3,3],[1,-1],[-2,-4],[14,-10],[10,-8],[12,-9],[17,-12],[10,-7],[146,-147],[5,-6],[38,-39],[47,-50],[3,-3]],[[5357,2356],[-1,0],[-5,-7],[-26,-33],[-22,-26],[-1,-2],[-3,-3],[-26,-33],[-46,-57],[-32,-41],[-18,-22],[-12,-14],[-9,-12],[-6,-7],[-12,-15],[-5,-6],[-7,-8],[-22,-27],[-10,-13],[-37,-43],[-31,-37],[2,-3],[1,-2],[4,-9],[3,-9],[1,-3],[3,-14],[6,-32],[19,-101],[22,-114],[19,-105],[2,-8]],[[8142,5727],[-9,5],[-66,37]],[[8067,5769],[12,23],[12,22]],[[8091,5814],[63,-35],[12,-7]],[[8166,5772],[-12,-22],[-12,-23]],[[8067,5769],[-22,13],[-18,10],[-17,10]],[[8010,5802],[-7,3],[-2,1],[-9,5],[12,23],[12,23]],[[8016,5857],[75,-43]],[[7745,5975],[28,51],[2,4],[4,6],[15,29]],[[7794,6065],[3,-3]],[[7797,6062],[21,-16],[16,-11]],[[7834,6035],[31,-22],[15,-12],[3,-8]],[[7883,5993],[-4,-2],[-36,-21],[-11,-6],[-6,-3],[-8,-3],[-8,-2],[-5,0]],[[7805,5956],[-4,0],[-4,0],[-6,0],[-6,1],[-8,2],[-4,1],[-7,4],[-10,5],[-7,4],[-4,2]],[[7794,6065],[-4,1],[-6,-2],[-21,15],[-16,12],[-15,13]],[[7732,6104],[9,17]],[[7741,6121],[24,-17],[9,19],[6,-4],[7,5],[5,10],[-31,24],[11,21],[10,19]],[[7782,6198],[2,2],[12,22]],[[7796,6222],[53,-40],[3,-2],[3,-2]],[[7855,6178],[-6,-11],[-14,-27],[-7,-13],[-5,-9],[-16,-30],[-13,-23]],[[7741,6121],[-21,17],[-17,12],[31,57],[8,14]],[[7742,6221],[4,3],[36,-26]],[[7732,6104],[-56,42],[-16,12],[-28,21],[-16,12]],[[7616,6191],[15,29]],[[7631,6220],[12,22],[7,12],[3,8],[11,18]],[[7664,6280],[41,-31],[4,-4],[16,-11],[17,-13]],[[7660,6327],[4,-8],[9,-22]],[[7673,6297],[-9,-17]],[[7631,6220],[-17,12],[-8,6],[-11,25],[-18,14],[-14,11]],[[7563,6288],[23,14],[25,44],[15,9],[8,-19],[9,-19],[17,10]],[[7616,6191],[-21,-37],[-2,-3],[-4,-3],[-6,-4]],[[7583,6144],[-2,4],[-16,36]],[[7565,6184],[-10,23],[-10,19],[-19,34]],[[7526,6260],[-31,55]],[[7495,6315],[16,12],[16,9],[10,-17]],[[7537,6319],[10,-17],[10,-18],[6,4]],[[7645,6361],[15,-34]],[[7537,6319],[22,14],[19,35],[4,7],[1,9],[-2,9],[16,11],[22,15]],[[7619,6419],[8,-15],[18,-43]],[[7642,6444],[16,-12],[21,-52]],[[7679,6380],[-17,-9],[-17,-10]],[[7679,6380],[17,9]],[[7696,6389],[6,-6],[17,-12]],[[7719,6371],[-19,-33],[-12,-22],[-15,-19]],[[7720,6501],[17,-13]],[[7737,6488],[-1,-3],[-33,-60],[-4,-6],[-5,-5],[-7,-3],[9,-22]],[[7737,6488],[17,-13],[16,-12]],[[7770,6463],[-2,-2],[-23,-43],[-10,-18]],[[7735,6400],[-9,-18],[-7,-11]],[[7785,6364],[-17,11]],[[7768,6375],[-33,25]],[[7770,6463],[17,-12],[2,-2],[3,-2],[8,-5],[3,-2],[2,-2],[7,-3],[6,-2],[3,-2],[-1,-3],[-35,-64]],[[7862,6383],[-20,-35],[-15,-16],[-10,-18]],[[7817,6314],[-28,20],[-31,25],[10,16]],[[7785,6364],[15,-12],[10,18],[13,-11],[5,2],[17,33],[17,-11]],[[7817,6314],[-15,-28],[20,-15],[-5,-10],[-21,-39]],[[7862,6383],[10,18],[1,3],[17,-13],[17,-13],[32,-21],[6,-4],[1,-1],[6,-4],[4,-2],[3,-3]],[[7959,6343],[-3,-3],[-13,-14],[-4,-5],[-3,-4],[-4,-4],[-4,-6],[-3,-5],[-5,-6],[-1,-3],[-5,-7],[-1,-2],[-3,-5],[-2,-4],[-3,-5],[-19,-35],[-2,-4],[-3,-5],[-4,-8],[-5,-9],[-5,-10],[-3,-4],[-4,-7],[-4,-8],[-1,-2]],[[7817,6675],[38,-27]],[[7855,6648],[38,-28],[33,-23],[52,-41]],[[7978,6556],[53,-39]],[[8031,6517],[17,-14],[17,-15],[3,-3],[3,-2]],[[8071,6483],[-4,-8],[-5,-9],[-6,-8],[-4,-6],[-9,-12],[-6,-8],[-8,-9],[-17,-19],[-12,-13],[-23,-27],[-3,-3],[-3,-3],[-2,-3],[-2,-3],[-8,-9]],[[7978,6556],[3,8]],[[7981,6564],[13,24]],[[7994,6588],[54,-40],[-17,-31]],[[7981,6564],[-20,14],[-14,10],[-18,14],[11,24],[10,18]],[[7950,6644],[34,-24],[9,17],[1,2]],[[7994,6639],[20,-13]],[[8014,6626],[-2,-3],[-18,-35]],[[7855,6648],[21,22],[0,5],[-4,1],[9,17]],[[7881,6693],[42,-31],[27,-18]],[[7881,6693],[4,8],[3,11],[1,3]],[[7889,6715],[4,10],[4,7]],[[7897,6732],[17,-11],[16,-12],[16,-11],[16,-11]],[[7962,6687],[-9,-18],[41,-30]],[[7962,6687],[13,23],[6,12]],[[7981,6722],[44,-31],[17,-12]],[[8042,6679],[-19,-36],[-9,-17]],[[7897,6732],[12,24],[8,15]],[[7917,6771],[13,26]],[[7930,6797],[16,-12],[15,-11],[15,-10],[16,-12]],[[7992,6752],[-11,-30]],[[7930,6797],[10,18],[-37,28]],[[7903,6843],[10,18],[38,-27],[15,-12],[29,-20],[-10,-19],[17,-11],[-10,-20]],[[7917,6771],[-17,12],[-45,31],[-2,1],[-2,1],[-1,1],[1,1],[1,1],[2,0],[9,17]],[[7863,6836],[27,-19],[13,26]],[[7889,6715],[-25,18],[-24,18],[-11,8],[-6,4],[-29,20]],[[7794,6783],[50,49],[8,11]],[[7852,6843],[11,-7]],[[7742,6726],[6,10],[1,3],[11,12],[31,29],[3,3]],[[7653,6788],[-162,125],[-8,5],[-7,6],[-4,4],[-18,7]],[[7454,6935],[34,20],[-13,22],[-4,7]],[[7471,6984],[16,3],[12,3],[6,3],[10,4],[7,4],[7,5],[11,8],[3,2],[7,6],[3,2],[5,4],[17,15],[14,13],[13,14],[9,9],[3,4],[5,5],[7,8],[19,22]],[[7645,7118],[2,-2],[24,-17],[9,-12],[4,-13],[2,-10],[5,-8],[6,-7],[11,-8],[18,-11],[37,-20],[57,-32],[9,-6],[19,-12],[1,-1],[5,-5],[2,-3],[4,-9],[1,-5],[2,-7],[-27,-52],[25,-18],[-9,-17]],[[7509,6479],[3,29],[11,40]],[[7523,6548],[7,19],[7,24]],[[7537,6591],[6,22],[17,-13]],[[7529,6493],[-2,-17],[-18,3]],[[7490,6478],[3,19],[-56,43],[-1,4],[10,13],[12,16],[12,15]],[[7470,6588],[53,-40]],[[7509,6479],[-10,-1],[-9,0]],[[7490,6478],[-14,-5]],[[7476,6473],[-6,18],[-59,43],[0,4],[9,17],[35,44]],[[7455,6599],[15,-11]],[[7428,6417],[-17,12]],[[7411,6429],[11,17],[12,19],[8,11],[1,1],[1,7],[-44,33]],[[7400,6517],[-19,14],[9,15],[14,18]],[[7404,6564],[17,24],[19,23],[15,-12]],[[7476,6473],[-11,-6],[-7,-7],[-9,-10],[-14,-22],[-7,-11]],[[7411,6429],[-38,27],[7,21],[9,21],[11,19]],[[7428,6417],[-12,-18]],[[7416,6399],[-67,50]],[[7349,6449],[-12,9],[-9,8],[-3,2],[-2,3],[-6,7],[-4,5],[-5,6],[-6,9],[-5,8],[-5,11],[-7,16]],[[7285,6533],[9,15],[43,68],[34,-26],[33,-26]],[[7335,6358],[-16,12]],[[7319,6370],[1,2],[-16,12],[-43,31],[-16,12],[-6,-13]],[[7239,6414],[-57,41],[-23,16]],[[7159,6471],[55,111],[2,4],[13,27],[2,4]],[[7231,6617],[1,-2],[9,-13],[12,-15],[6,-7],[5,-8],[5,-7],[7,-12],[3,-8],[2,-4],[4,-8]],[[7349,6449],[-1,-4],[-8,-21],[35,-26],[0,-6],[-9,-1],[-8,-4],[-7,-4],[-6,-8],[-10,-17]],[[7294,6308],[-17,12],[-39,30],[-17,13]],[[7221,6363],[18,51]],[[7319,6370],[-7,-21],[-9,-24],[-9,-17]],[[7276,6266],[-72,53],[17,44]],[[7294,6308],[-6,-10],[-4,-11],[-3,-11],[-5,-10]],[[7300,6230],[-27,-49],[-15,12],[-16,11]],[[7242,6204],[1,3],[11,18],[10,19],[5,9]],[[7269,6253],[16,-12],[15,-11]],[[7294,6142],[-44,32]],[[7250,6174],[-17,13]],[[7233,6187],[9,17]],[[7300,6230],[14,-11],[-25,-48],[15,-12],[-10,-17]],[[7309,6130],[-15,12]],[[7300,6230],[12,23],[1,3],[2,0],[10,-8],[-1,-5],[3,-2],[21,-15],[4,-3],[5,-10]],[[7357,6213],[-6,-7],[-6,-9],[-27,-50],[-9,-17]],[[7293,6088],[-57,43],[-1,2],[-1,2],[0,2],[6,16],[4,10],[3,6],[1,3],[2,2]],[[7309,6130],[-1,-3],[-8,-18],[-7,-21]],[[7293,6088],[-5,-19],[-3,-16]],[[7285,6053],[-6,2],[-12,8],[-12,9],[-15,12],[-15,10],[-2,-2],[-15,-28]],[[7208,6064],[-23,17]],[[7185,6081],[7,11],[4,7],[9,18],[1,1],[7,17],[12,39],[6,10],[2,3]],[[7285,6053],[-2,-27],[-1,-25]],[[7282,6001],[-18,0]],[[7264,6001],[0,22],[-25,18],[-15,11],[-16,12]],[[7264,6001],[-18,-1]],[[7246,6000],[-1,11],[-72,54]],[[7173,6065],[12,16]],[[7159,6046],[7,12],[7,7]],[[7246,6000],[-18,1]],[[7228,6001],[-16,6],[-7,6],[-46,33]],[[7186,5977],[-47,34],[10,18],[10,17]],[[7228,6001],[0,-12],[0,-5],[-5,-9],[-27,19],[-10,-17]],[[7228,5945],[-8,-19],[-14,8],[-6,-12]],[[7200,5922],[-15,11]],[[7185,5933],[-16,12]],[[7169,5945],[6,12],[11,20]],[[7246,6000],[0,-14],[-1,-9],[-17,-32]],[[7185,5933],[-7,-15],[-14,10]],[[7164,5928],[-10,7],[-8,6],[-16,12],[-16,12]],[[7114,5965],[-14,10],[-13,9],[8,15]],[[7095,5999],[13,-9],[14,-11],[17,-12],[15,-11],[15,-11]],[[7134,5863],[-14,10],[-13,10]],[[7107,5883],[25,45],[-14,10],[-13,10]],[[7105,5948],[4,8],[5,9]],[[7164,5928],[1,-6],[-7,-14]],[[7158,5908],[-5,-8],[-19,-37]],[[7107,5883],[-13,9],[-13,10]],[[7081,5902],[24,46]],[[7081,5902],[-14,10],[-15,11],[-12,9],[-13,10]],[[7027,5942],[4,8],[8,13],[13,-9],[13,24]],[[7065,5978],[13,-10],[14,-10],[13,-10]],[[7027,5942],[-15,10]],[[7012,5952],[5,9],[20,37]],[[7037,5998],[8,-6],[6,-5],[7,-4],[7,-5]],[[7056,6032],[39,-33]],[[6510,2056],[-62,41]],[[6448,2097],[8,19],[4,10],[5,10],[13,28],[4,7],[10,10]],[[6492,2181],[59,-38]],[[6551,2143],[-11,-23]],[[6540,2120],[-11,-23],[-10,-22],[-9,-19]],[[6613,2074],[-73,46]],[[6551,2143],[11,23]],[[6562,2166],[63,-41],[10,-6]],[[6635,2119],[-11,-23],[-11,-22]],[[6492,2181],[7,7]],[[6499,2188],[11,11],[6,6],[3,5],[5,12]],[[6524,2222],[49,-31]],[[6573,2191],[-11,-25]],[[7962,6172],[-19,-42]],[[7943,6130],[-8,4],[-6,2],[-6,1],[-21,-2]],[[7902,6135],[-1,21],[1,5],[3,7],[10,-7],[10,0],[17,31],[8,15]],[[7950,6207],[19,-15]],[[7969,6192],[-7,-20]],[[7911,6055],[-14,11]],[[7897,6066],[16,40],[-15,11],[-15,11],[5,9]],[[7888,6137],[6,-2],[8,0]],[[7943,6130],[-15,-36],[-17,-39]],[[7897,6066],[-19,12],[-14,11],[-10,-17],[-8,-15],[-12,-22]],[[7797,6062],[2,2],[54,100],[27,-21],[8,-6]],[[7911,6055],[-4,-15],[-1,-14],[2,-24]],[[7908,6002],[-4,-1],[-8,-3],[-10,-3],[-3,-2]],[[8016,5857],[7,19],[8,19],[10,-6],[61,-34],[4,-3]],[[8106,5852],[-7,-19],[-8,-19]],[[8016,5857],[-29,17]],[[7987,5874],[12,16],[12,16],[31,54]],[[8042,5960],[13,-7]],[[8055,5953],[21,-11],[17,-10],[10,-5],[7,-4]],[[8110,5923],[17,-10]],[[8127,5913],[-6,-18],[-6,-19],[-2,-4],[-7,-20]],[[8055,5953],[14,35],[2,3]],[[8071,5991],[21,-12],[17,-9],[15,-9]],[[8124,5961],[-1,-3],[-6,-16],[-7,-19]],[[8203,5870],[-46,26],[-30,17]],[[8124,5961],[17,-8]],[[8141,5953],[13,-7],[15,-9]],[[8169,5937],[48,-26]],[[8217,5911],[0,-2],[-1,-2],[-13,-37]],[[8110,6073],[5,-3],[17,-6],[7,-3],[5,-5],[2,-8],[0,-8],[-3,-8],[-23,-42],[31,-18]],[[8151,5972],[-9,-16],[-1,-3]],[[8071,5991],[10,20],[16,29]],[[8097,6040],[13,33]],[[8151,5972],[10,19],[-11,8],[-1,5],[13,24],[4,2],[11,-8],[6,9],[7,13]],[[8190,6044],[13,11],[7,-19]],[[8210,6036],[12,-20],[-56,-71],[3,-8]],[[8110,6073],[9,19],[6,10],[8,13],[5,11],[6,16]],[[8144,6142],[14,-21]],[[8158,6121],[-3,-7],[-6,-17],[4,-3],[9,-14],[10,-15],[13,-19],[5,-2]],[[8097,6040],[-20,12]],[[8077,6052],[-17,10],[-34,20]],[[8026,6082],[10,18],[2,4],[17,31]],[[8055,6135],[10,17],[10,15],[15,17]],[[8090,6184],[15,15],[21,-30]],[[8126,6169],[18,-27]],[[8239,6072],[-29,-36]],[[8158,6121],[14,-20],[17,10],[17,9],[22,10],[-2,13],[-9,6],[-8,7],[-14,12],[-4,7]],[[8191,6175],[-9,25],[-19,8],[6,29]],[[8169,6237],[3,-1],[23,-61],[39,-33],[1,-45],[2,-14],[0,-6],[2,-5]],[[8158,6121],[8,22],[11,36],[14,-4]],[[5974,986],[0,-2]],[[5974,984],[-3,1],[-30,17],[-33,16],[-19,4],[-18,3],[-1,0],[-9,2],[-12,-10],[-11,-20],[-9,5],[-1,2],[1,5],[1,3],[7,10],[0,1],[-1,2],[-4,7],[-4,0],[-5,1],[-1,1],[-1,0],[-3,0],[-2,0],[-4,-15],[-3,2],[-7,4],[3,12],[-5,1],[-1,8],[-6,1],[0,2],[-4,1],[0,-4],[-1,0],[-1,0],[0,-7],[-3,0],[-1,7],[-5,0],[0,-4],[-3,-1],[0,-2],[-1,0],[-6,-1],[0,-3],[-3,0],[0,-2],[-31,-12],[-14,0],[-10,0],[0,-3],[0,-5],[0,-10],[8,-2],[0,-3],[-10,2],[-2,2],[0,8],[0,11],[-3,0],[-2,-2],[-11,-1]],[[5690,1018],[6,1],[2,19],[1,3]],[[5699,1041],[8,15],[5,18],[1,2],[7,10],[13,5],[21,7],[6,1],[8,0],[8,1],[18,2]],[[5794,1102],[15,3],[4,-1],[1,2],[46,2],[31,1],[13,1],[18,4]],[[5922,1114],[14,4],[21,7],[14,4],[1,0],[3,-4]],[[5975,1125],[-1,-36]],[[5974,1089],[0,-11]],[[5974,1078],[-10,0],[-9,1],[-18,3],[-19,3],[-17,2],[-3,-31],[-5,-32],[16,-4],[18,-7],[17,-10],[12,-8],[9,-5],[9,-4]],[[5977,881],[0,-10],[0,-16],[-2,-6]],[[5975,849],[-25,5],[-43,6],[-1,1],[-56,5],[-52,3],[-16,3],[-7,3],[-9,4],[-4,2],[-3,5],[-2,4],[0,6],[-1,2],[-67,27],[1,1],[1,3],[1,-1],[69,-28],[12,-5],[24,-4],[15,1],[14,3],[25,3],[13,3],[25,2],[20,-2],[30,-8],[16,-6],[22,-6]],[[5975,979],[1,-4],[0,-7]],[[5976,968],[-17,7],[-15,8],[-21,9],[-13,5],[-37,8],[-5,0],[-18,-4],[-1,5],[6,6],[8,6],[15,2],[6,0],[23,-8],[11,-4],[24,-12],[14,-10],[19,-7]],[[5978,906],[-2,1],[-6,8],[-15,14],[-7,2],[-27,6],[-22,2],[-4,0],[-11,-3],[-11,-1],[-11,0],[-4,1],[-2,2],[0,5],[0,7],[17,0],[4,2],[2,3],[1,0],[1,-3],[0,-3],[7,-2],[52,-7],[14,-3],[24,-8]],[[5978,929],[0,-6],[0,-17]],[[5794,1102],[-1,15]],[[5793,1117],[14,43],[4,12],[4,13]],[[5815,1185],[18,0],[27,1],[16,1],[-1,65]],[[5875,1252],[4,1],[12,0],[6,0],[22,1],[22,0]],[[5941,1254],[1,-66],[-21,-1],[1,-65],[0,-8]],[[5941,1254],[22,2],[2,-67],[0,-57],[10,3],[0,-5],[0,-5]],[[5815,1185],[-2,66]],[[5813,1251],[19,1],[43,0]],[[5813,1251],[-1,66]],[[5812,1317],[62,2],[22,0],[15,1],[7,0]],[[5918,1320],[8,0],[15,1]],[[5941,1321],[0,-67]],[[5813,1251],[-18,0],[-17,0],[0,-26],[-16,-2],[-3,27],[0,21],[-7,2],[0,24],[-11,0],[-43,1],[1,20]],[[5699,1318],[42,0],[32,-1]],[[5773,1317],[21,0],[18,0]],[[5773,1317],[0,26]],[[5773,1343],[-1,34]],[[5772,1377],[0,19],[0,19]],[[5772,1415],[20,0],[19,0]],[[5811,1415],[1,-98]],[[5773,1317],[-6,9],[-59,1],[-15,17]],[[5693,1344],[19,0]],[[5712,1344],[61,-1]],[[5712,1344],[-3,34]],[[5709,1378],[21,0],[7,2],[11,-1],[7,-2],[17,0]],[[5709,1378],[-2,19],[-1,20]],[[5706,1417],[17,0],[6,-1],[43,-1]],[[5693,1344],[-2,-4],[2,-22]],[[5693,1318],[-21,0]],[[5672,1318],[-5,64],[-1,18],[-1,11],[-1,6]],[[5664,1417],[1,5],[1,-3],[3,-1],[2,-1],[35,0]],[[5699,1318],[-6,0]],[[5810,1463],[1,-48]],[[5664,1417],[-1,20],[0,6],[0,8],[0,4],[0,27],[1,25],[0,3],[0,5],[0,4]],[[5664,1519],[11,0],[30,-2],[6,-1],[10,-1],[14,-1],[43,-5],[16,-2],[6,-1],[11,0],[0,-4],[0,-1],[-1,-5],[0,-33]],[[5683,1460],[-3,-20],[37,-1],[6,-1],[6,0],[5,0],[39,0],[0,19],[0,7],[0,20],[-87,2],[-2,-20],[-1,-6]],[[7012,5952],[-13,11],[-14,9]],[[6972,5772],[-49,36]],[[6923,5808],[-8,5],[-8,6],[-46,-86],[7,-6],[8,-5]],[[6876,5722],[49,-36]],[[6925,5686],[-4,-9],[-6,-11]],[[6915,5666],[-50,36]],[[6865,5702],[-6,5],[-5,3],[-4,5],[-4,4],[-7,10],[-3,4],[-5,5],[-4,3],[-4,4],[-11,7],[-15,10]],[[6797,5762],[33,60],[17,34],[1,3],[8,15],[8,16],[5,-3],[1,-3],[4,8],[11,24],[14,20],[9,14],[3,4],[2,4],[31,40],[2,3]],[[7027,5942],[-2,-4],[2,-5],[22,-17],[-20,-35],[-1,-2],[0,-1],[-56,-106]],[[6953,5737],[-49,36]],[[6904,5773],[9,17],[10,18]],[[6972,5772],[-9,-17],[-5,-9],[-5,-9]],[[6904,5773],[-10,-18],[-9,-16],[-9,-17]],[[6953,5737],[-5,-9],[-4,-8]],[[6944,5720],[-5,-9],[-4,-9],[-10,-16]],[[6953,5737],[60,-44],[-4,-9],[-5,-9]],[[7004,5675],[-60,45]],[[6995,5659],[-9,-17],[-61,44]],[[7004,5675],[-9,-16]],[[6995,5659],[36,-27],[2,-1],[8,-6],[19,-13],[1,-1],[6,-4]],[[7067,5607],[-3,-6],[-5,-8],[-2,-4],[-2,-3],[-9,-16]],[[7046,5570],[-12,9]],[[7034,5579],[-59,43]],[[6975,5622],[-60,44]],[[7004,5675],[36,-25],[30,-21],[7,-5]],[[7077,5624],[-1,-1],[-4,-8]],[[7072,5615],[-4,-7],[-1,-1]],[[7092,5536],[-46,34]],[[7072,5615],[45,-32]],[[7117,5583],[-4,-8],[-5,-7]],[[7108,5568],[-4,-7],[-4,-8]],[[7100,5553],[-7,-15],[-1,-2]],[[7072,5495],[-60,44]],[[7012,5539],[5,9],[5,9],[5,9],[5,10],[2,3]],[[7092,5536],[-1,-3],[0,-3],[-4,-8],[-5,-9],[-5,-9],[-5,-9]],[[7059,5470],[-20,15],[-4,-8],[-40,30]],[[6995,5507],[4,7],[4,8],[4,8],[5,9]],[[7072,5495],[-5,-9],[-8,-16]],[[7092,5536],[61,-44]],[[7153,5492],[-2,-3],[-5,-10],[-5,-10],[-5,-8],[-5,-9],[-13,-25],[-59,43]],[[7246,5424],[-33,24]],[[7213,5448],[-49,36],[-11,8]],[[7100,5553],[73,-53]],[[7173,5500],[63,-46],[18,-13]],[[7254,5441],[-4,-8],[-4,-9]],[[7108,5568],[73,-53]],[[7181,5515],[-4,-8],[-4,-7]],[[7117,5583],[73,-53]],[[7190,5530],[-5,-8],[-4,-7]],[[7117,5583],[4,7],[4,8],[72,-53],[-4,-8],[-3,-7]],[[7394,5476],[-9,-18],[-9,-17],[-12,-22]],[[7364,5419],[-18,13],[-6,5],[-5,3],[-2,0],[-3,4],[-8,9],[-6,5],[-5,5],[-32,23],[-7,-13],[-1,-2]],[[7271,5471],[-26,20],[-4,-8],[-4,-8],[-56,40]],[[7077,5624],[3,6],[2,4],[81,145],[2,3],[20,39],[2,3]],[[7187,5824],[55,-39]],[[7242,5785],[22,-17],[45,-33],[54,-39]],[[7363,5696],[54,-40],[28,-21],[26,-18]],[[7471,5617],[-2,-3],[-8,-14],[-2,-4]],[[7459,5596],[-9,-17],[-9,-17],[-9,-17]],[[7432,5545],[-9,-17],[-9,-17],[-12,-21],[-8,-14]],[[7271,5471],[-4,-8],[-5,-8],[-4,-7],[-4,-7]],[[7364,5419],[-7,-12]],[[7357,5407],[-10,-18],[-8,-16],[-7,-12]],[[7332,5361],[-25,18],[-5,5],[-30,21]],[[7272,5405],[-26,19]],[[7250,5365],[-59,43]],[[7191,5408],[5,9],[5,9],[5,9],[5,10],[2,3]],[[7272,5405],[-2,-3],[-10,-19],[-5,-9],[-5,-9]],[[7312,5324],[-8,5],[-54,36]],[[7332,5361],[-1,-3],[-11,-19],[-2,-3],[-6,-12]],[[7287,5277],[-12,-21]],[[7275,5256],[-86,63],[18,33],[-33,25],[3,7],[5,7],[4,8],[5,9]],[[7312,5324],[-2,-5],[-3,-5],[-9,-16],[-11,-21]],[[7400,5318],[6,-9],[2,-3],[2,-3],[3,-2],[10,-7],[5,-4],[20,-14]],[[7448,5276],[-2,-3],[-13,-22],[-8,7],[-42,30],[-1,4],[-5,-10],[-5,-9]],[[7372,5273],[-12,-20],[-14,-20]],[[7346,5233],[-3,2],[-2,2],[-3,2],[-2,1],[-1,1],[-48,36]],[[7332,5361],[28,-21],[4,-2],[4,-3],[4,-1],[9,-1],[3,-2],[5,-2],[2,-2],[2,-2],[1,0],[4,-4],[2,-3]],[[7357,5407],[52,-38],[1,-1],[3,-2],[2,-2],[2,-1],[3,-2]],[[7420,5361],[-10,-17],[-2,-5],[-5,-11],[0,-3],[-3,-7]],[[7491,5278],[-13,-24]],[[7478,5254],[-15,11],[-15,11]],[[7420,5361],[55,-40]],[[7475,5321],[-1,-14],[6,-11],[11,-18]],[[7394,5476],[28,-22],[24,-16],[3,-3],[3,-2],[4,-3]],[[7456,5430],[-9,-18],[-9,-17],[56,-41]],[[7494,5354],[-15,-13],[-4,-20]],[[7456,5430],[30,-22],[8,0],[6,-29]],[[7500,5379],[3,-17],[-9,-8]],[[6950,1933],[-103,-90],[-127,-106]],[[6720,1737],[-8,5],[29,47],[-22,15]],[[6719,1804],[5,11],[19,27],[35,50]],[[6778,1892],[2,3],[9,10],[4,5],[10,9],[12,11],[4,3]],[[6819,1933],[70,-44],[17,14]],[[8350,6767],[0,-4],[-2,-21],[-1,-5]],[[8347,6737],[0,-5],[-2,-22]],[[8345,6710],[-3,0],[-17,1],[2,28]],[[8327,6739],[1,20],[-16,1],[-11,2],[-13,5],[-16,12]],[[8327,6739],[-32,3],[-6,0],[-5,-2],[3,-7],[5,-8],[3,-3],[12,-3],[-2,-21],[-2,-7],[-6,-6]],[[8345,6710],[0,-4],[-1,-8],[-1,-7],[-1,-8],[-1,-9]],[[8341,6674],[-1,-2],[-1,-7]],[[8531,6462],[-10,-17],[-2,-5],[-10,-18]],[[8441,6440],[22,43],[-17,11],[-24,-45]],[[8422,6449],[-3,1],[-12,9],[-3,3],[-3,4],[0,3],[-1,5],[0,4],[2,6],[1,7],[0,6],[-1,7],[-2,3],[-3,2],[-34,25],[-16,-31],[-3,-6],[-2,-4],[-4,-8],[-1,-10],[0,-9],[1,-15],[-2,-8],[-4,-9]],[[8332,6434],[-7,3],[-40,17],[-26,14],[-2,-3],[-15,-39],[-1,-1],[-3,-5],[-4,-7]],[[8234,6413],[-5,-1],[-99,53],[-5,-14]],[[8125,6451],[-18,9],[-24,15],[-4,2],[-4,4],[-4,2]],[[8071,6483],[4,6],[34,65],[1,3]],[[8110,6557],[2,3],[13,26],[12,23],[3,6],[2,3],[4,8],[4,6],[8,12],[6,7],[9,12],[10,10],[6,8],[7,11]],[[8196,6692],[1,0],[4,8],[6,9],[4,8],[4,9],[1,3]],[[8413,6563],[4,-3],[4,-2],[3,-3],[4,-3],[18,-13],[34,-26],[42,-31],[4,-3],[8,-6],[3,-1]],[[6526,1502],[-10,-3],[-62,2],[-43,2],[-3,-3],[-3,-1],[4,-9],[2,-3],[0,-4]],[[6411,1483],[0,-23],[0,-28]],[[6411,1432],[0,-15],[0,-20],[50,-33]],[[6461,1364],[-4,-10]],[[6457,1354],[-35,21],[-6,2],[-12,6],[-1,52],[-3,1],[-3,2],[-2,1],[-3,1],[-101,53],[-2,1],[-6,4],[-5,4],[-27,18],[-15,9],[-42,44],[0,58],[0,7],[-60,19],[-23,7]],[[6111,1664],[-8,3],[-6,1],[-4,1],[-1,1],[-6,2]],[[6086,1672],[0,1],[1,2],[0,2],[2,6],[0,1],[4,7],[27,56],[1,8],[2,4],[4,5],[0,1],[5,7],[4,5],[7,7],[9,8],[6,14]],[[6158,1806],[191,-124],[41,-24],[11,-6],[2,-2],[3,-2],[23,-14],[6,-3],[25,-17],[13,-7],[1,-1],[82,-50]],[[6556,1556],[88,-41]],[[6644,1515],[-22,-5],[-4,-1],[-30,-7],[-4,-1],[-11,-1],[-7,0],[-5,1],[-2,1],[-14,9],[-11,7],[-8,-16]],[[8422,6449],[-26,-50]],[[8396,6399],[-3,2],[-4,2],[-5,2],[-5,3],[-28,16],[-5,2],[-4,3],[-5,3],[-5,2]],[[8234,6413],[-2,-3],[-3,-6],[-2,-6],[-9,-20]],[[8218,6378],[-7,-20]],[[8211,6358],[-9,-21],[-7,-20]],[[8195,6317],[-21,-51],[-4,-24]],[[8170,6242],[-24,97],[-9,51],[-12,61]],[[8182,6349],[3,-2],[17,39],[9,24],[-17,9],[-34,19],[-3,-10],[0,-2],[-1,-6],[2,-5],[13,-37],[8,-23],[3,-6]],[[8170,6242],[-1,-2]],[[8169,6240],[0,-3]],[[8126,6169],[7,7],[4,13],[-2,5],[-39,56],[-2,3],[0,3],[1,10],[1,3],[-33,12],[-3,1]],[[8060,6282],[-3,1],[-34,13],[-2,1]],[[8021,6297],[-14,10],[-4,3],[-15,12],[-18,13],[-9,7],[-2,1]],[[8090,6184],[-13,17],[-12,17],[-13,19]],[[8052,6237],[16,16],[-8,15],[-1,3],[0,2],[0,6],[1,3]],[[8055,6135],[-19,8],[-19,8],[-19,6]],[[7998,6157],[1,6],[8,13],[10,16],[10,15],[10,13],[15,17]],[[7998,6157],[-6,2],[-10,3],[-10,5],[-10,5]],[[7969,6192],[16,-8],[4,-1],[2,2],[7,15],[10,13],[15,21],[9,12],[8,8],[12,-17]],[[7969,6192],[22,50],[9,16]],[[8000,6258],[20,36],[1,3]],[[7950,6207],[15,25],[-18,12],[20,38],[17,-13],[16,-11]],[[7514,3024],[-1,0],[-7,-1],[-1,-4],[-7,-10],[3,-5],[1,-4],[-4,-9],[-3,-4],[-14,-14],[-13,-10],[-13,-12],[-26,-22],[-4,-4],[-56,-28],[-21,-16],[-29,-19],[-14,-5],[-14,-6],[-12,-2],[-16,0]],[[7263,2849],[-25,19],[-3,16],[4,12],[12,20],[-30,23],[10,20],[2,5],[-20,16]],[[7213,2980],[8,23],[5,10],[18,-12],[50,-33],[18,39],[14,23],[12,17]],[[7338,3047],[7,-7],[2,-1],[3,-2]],[[7350,3037],[10,-6],[19,23],[1,5],[6,31],[2,3]],[[7388,3093],[4,-2]],[[7392,3091],[5,-2],[6,-1],[15,-1],[2,0],[25,-2],[8,0],[6,0],[5,2]],[[7464,3087],[1,-7],[12,-14],[0,-1],[27,-11],[-3,-13],[7,-12],[6,-5]],[[7513,2895],[-9,5],[-6,-8],[-17,-3],[-20,-1],[-8,-3],[-37,-17],[-30,-15]],[[7386,2853],[-21,-14],[-20,-15],[-14,-8],[-11,-9],[-16,-18]],[[7304,2789],[-15,-15],[-17,-14]],[[7272,2760],[8,27],[4,16],[4,10],[7,11],[-25,21],[-7,4]],[[7514,3024],[9,-6],[10,-7],[20,-13],[2,-2],[24,-17]],[[7579,2979],[-12,-22],[-29,-51],[-4,-4],[-6,-3],[-15,-4]],[[7492,2773],[-5,7],[-5,4],[-5,1],[-5,4],[-4,7],[-8,5],[-4,0],[-7,2],[-8,11]],[[7441,2814],[-55,39]],[[7513,2895],[15,-11],[21,-16]],[[7549,2868],[-20,-37],[-17,-31],[-6,-14],[-14,-13]],[[7373,2736],[-69,53]],[[7441,2814],[-19,-17],[-18,-17],[-18,-24],[-13,-20]],[[7492,2773],[-5,-5],[37,-29]],[[7524,2739],[-28,-13],[-9,-4],[-30,-13]],[[7377,2638],[-41,31]],[[7336,2669],[12,22],[13,23],[12,22]],[[6573,2191],[63,-41],[10,-6]],[[6646,2144],[-11,-25]],[[6573,2191],[11,23]],[[6584,2214],[73,-47]],[[6584,2214],[10,22]],[[6594,2236],[73,-47]],[[6594,2236],[9,19]],[[6584,2214],[-54,34]],[[6530,2248],[3,6],[3,7],[0,1],[2,2],[4,6],[12,17]],[[6524,2222],[3,14]],[[6527,2236],[3,12]],[[6527,2236],[-2,1],[-2,1],[-28,19],[6,14],[-16,11]],[[6485,2282],[14,30],[9,18]],[[6508,2330],[29,-21],[19,-15],[2,-2]],[[6499,2188],[-2,1],[-43,28],[8,17]],[[6462,2234],[9,19],[14,29]],[[6527,2367],[-11,-21],[-2,-3],[-6,-13]],[[6462,2234],[-46,29],[0,24],[0,38],[0,24],[2,0],[1,1],[4,8],[1,2],[13,22],[2,-1],[-2,3],[0,3],[0,2],[1,2],[2,1],[1,1],[1,0],[7,-2],[-4,3],[2,3]],[[6447,2397],[0,2],[3,6],[2,3],[5,9]],[[7999,6097],[-8,-18]],[[7991,6079],[-19,10],[-18,10],[-22,-47],[-3,-11],[-2,-10],[22,2],[29,-2]],[[7978,6031],[-1,-24]],[[7977,6007],[-3,0],[-26,0],[-21,-1],[-15,-3],[-4,-1]],[[7943,6130],[21,-12],[16,-10],[19,-11]],[[7991,6079],[-8,-13]],[[7983,6066],[-4,-11],[-1,-24]],[[8026,6082],[-10,5],[-17,10]],[[8077,6052],[-18,-32],[-23,5],[-20,15],[-33,26]],[[8071,5991],[-14,6],[-9,4],[-9,2],[-14,2],[-45,2],[-3,0]],[[8042,5960],[-2,3],[-2,1],[-3,3],[-10,7],[-7,6],[-19,1],[-39,2]],[[7960,5983],[-17,0],[-13,-2],[-19,-3]],[[7911,5978],[-3,20],[0,4]],[[7987,5874],[-9,6]],[[7978,5880],[-14,13]],[[7964,5893],[13,16],[12,16],[7,8],[4,9],[-40,29],[0,12]],[[5871,2067],[-21,-122],[-1,-3]],[[5849,1942],[-3,-9],[-7,-22],[-8,-23],[-8,-22],[-20,-45],[0,-1],[-3,-8],[-19,-57],[14,-8],[2,-1],[1,0],[13,-6],[30,-14],[26,-12],[3,-2],[6,-2],[4,-2],[2,-1],[81,-39],[60,4]],[[6023,1672],[3,0],[22,0],[2,0],[10,0],[5,0],[8,0],[3,0],[3,0],[5,0],[2,0]],[[6111,1664],[0,-31],[0,-5],[0,-7],[-2,-98],[0,-14],[0,-2],[0,-1]],[[6109,1506],[-121,5],[-1,-8],[0,-4],[-1,-4],[-1,-13],[0,-30]],[[5985,1452],[-24,1]],[[5961,1453],[0,26],[-90,2],[0,-26]],[[5871,1455],[-13,1],[-10,-1],[-11,-1],[-9,4],[-6,6],[-12,-1]],[[5664,1519],[-4,0],[-2,0],[-71,3],[-2,0],[-2,0],[-72,2]],[[5511,1524],[0,2],[0,3],[0,9],[0,3],[-6,11],[-61,-7],[-7,0],[-5,1],[-22,-1],[-14,-2],[-27,-1],[-136,5],[-52,0],[-47,2],[-26,1]],[[5357,2356],[2,-2],[2,-2],[46,-49],[15,-12],[7,-5],[12,-9],[8,-7],[33,-35],[57,-64],[51,-59],[2,-3],[8,-9],[13,-14],[31,-37],[6,-6],[1,3],[2,17],[4,40],[7,50],[1,8],[0,7],[1,8],[6,49],[1,9],[1,7],[1,6],[1,5],[0,7],[1,3],[0,-1],[2,-1],[4,-4],[1,-2],[6,-5],[1,-1],[1,-1],[1,-1],[2,-1],[2,-3],[1,0],[2,-2],[2,-2],[1,-1],[2,-2],[2,-1],[2,-2],[0,-1],[1,-1],[1,0],[1,-2],[1,-1],[1,0],[3,-4],[6,-7],[2,-1],[0,-1],[1,0],[1,-1],[1,-1],[1,-1],[1,-1],[2,-1],[1,-1],[1,-2],[2,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-2],[2,-1],[1,-2],[1,-1],[1,-1],[2,-1],[1,-1],[1,-1],[1,-1],[1,-2],[1,-1],[2,-2],[1,-1],[1,-1],[1,-1],[1,-2],[1,-1],[7,-6],[3,-4],[2,-1],[1,-2],[2,-1],[1,-2],[1,-1],[2,-2],[1,-1],[1,-1],[2,-1],[0,-1],[7,-6],[9,-8],[24,-25],[1,-1],[3,-3],[16,-16],[0,-1],[4,-4],[2,-2],[1,-1],[3,-3],[1,-1],[1,-2],[2,-1],[3,-4],[7,-7],[1,-1]],[[5981,1916],[-16,-34],[-6,-7],[-24,15],[-13,10],[-2,2],[-1,1],[-2,1],[-2,2],[-1,1],[-1,1],[-1,0],[-1,1],[-3,2],[-1,1],[-1,1],[-1,0],[-1,1],[-1,1],[-1,1],[-2,1],[0,1],[-1,1],[-1,1],[-1,1],[-1,0],[-3,2],[-2,1],[-1,1],[-2,2],[-2,0],[-1,1],[-2,1],[0,1],[-2,1],[-1,0],[-1,2],[-1,1],[-2,1],[-1,1],[-1,0],[0,1],[-4,2],[-18,10],[-3,-7]],[[5871,2067],[13,73],[1,23],[2,9],[5,26],[2,9],[0,2],[40,237]],[[5934,2446],[10,-4],[12,-6],[17,-7],[11,-7],[8,-4],[4,-2],[16,-9],[7,-3],[13,-8],[4,-4],[108,-49]],[[6144,2343],[-20,-43],[-18,-36],[-6,-13],[-1,-5],[-5,-34]],[[6094,2212],[-6,-35],[0,-9]],[[6088,2168],[2,-34],[-1,-7],[-2,-4],[-24,-29],[-4,-10]],[[6059,2084],[-8,-18],[-8,-18],[-9,-18],[-8,-18],[-9,-19]],[[6017,1993],[-10,-20],[-9,-21],[-9,-18],[-33,21],[-4,-20],[29,-19]],[[6235,2626],[-9,-16],[-9,-21]],[[6217,2589],[-16,12],[-16,11],[-17,-33]],[[6168,2579],[-16,12],[17,32],[-17,13]],[[6152,2636],[8,17],[1,3],[-1,1],[-35,25],[-16,-21],[-6,-8],[-8,-5],[-6,-6],[-10,-18],[-3,-5],[-1,-8],[-9,-50],[51,-31]],[[6117,2530],[-10,-24]],[[6107,2506],[-4,-10],[-2,-11],[-15,-34],[17,-11],[18,-11],[18,-11],[26,-17]],[[6165,2401],[-4,-18],[-6,-17]],[[6155,2366],[-11,-23]],[[5934,2446],[25,152],[6,37]],[[5965,2635],[5,5],[39,44],[17,-20],[0,-1],[1,-1],[1,-1],[2,-2],[5,-7],[0,-1],[3,1],[21,10],[4,2],[0,1],[1,0],[1,1],[2,0],[0,1],[62,35],[66,-48],[40,-28]],[[6107,2506],[62,-41]],[[6169,2465],[-3,-22],[1,-27],[-2,-15]],[[6192,2521],[-41,29],[-9,7],[-5,4]],[[6137,2561],[-7,10],[-8,9],[30,56]],[[6168,2579],[16,-11],[23,-17],[-15,-30]],[[6137,2561],[-1,-5],[-4,1],[-1,0],[-1,0],[-2,-3],[-2,-4],[-9,-20]],[[6309,2476],[11,22],[-11,8],[-23,16],[-7,5],[-4,4],[2,4],[14,24],[36,-26],[7,-9]],[[6334,2524],[38,-27],[0,-52],[0,-2],[-16,0],[-3,1],[-3,2],[-4,3],[-37,27]],[[7738,7965],[-53,-45]],[[7685,7920],[-13,-12]],[[7672,7908],[-3,4],[-22,35],[-14,-12],[-49,77]],[[7584,8012],[13,13],[12,13],[51,-79],[18,15],[18,16],[17,15]],[[7713,8005],[23,-37],[2,-3]],[[7672,7908],[-15,-12],[-12,-10]],[[7645,7886],[-59,-52]],[[7586,7834],[-2,4],[-15,22]],[[7537,7964],[6,8],[5,5],[5,5],[2,1],[11,9],[3,3],[4,4],[11,13]],[[7640,7788],[-16,-14]],[[7624,7774],[-38,60]],[[7645,7886],[14,-22],[-14,-12],[11,-17]],[[7656,7835],[-30,-26],[14,-21]],[[7733,7779],[-11,-14]],[[7722,7765],[-26,41],[-14,-11],[-26,40]],[[7685,7920],[13,-21],[12,-18],[25,-40]],[[7735,7841],[24,-38]],[[7759,7803],[-13,-11],[-10,-9],[-3,-4]],[[7722,7765],[-4,-6],[-8,-7],[-15,-12],[-15,-14]],[[7680,7726],[-20,32],[12,11],[1,2],[-1,2],[-16,25],[-1,2],[-2,-1],[-13,-11]],[[7680,7726],[-16,-13]],[[7664,7713],[-40,61]],[[7805,7698],[-12,-15],[-10,-14],[-18,-22]],[[7765,7647],[-13,20],[-14,-18],[-4,-1],[-5,1],[-8,13],[-11,17],[-30,47]],[[7733,7779],[4,-7],[6,-11],[-8,-14],[10,-16],[2,-2],[1,-3],[11,-16],[10,9],[1,0],[1,-1],[10,-15],[12,15],[12,-20]],[[7831,7730],[-26,-32]],[[7759,7803],[17,14]],[[7776,7817],[42,-67],[13,-20]],[[7861,7768],[-30,-38]],[[7776,7817],[16,17],[11,11],[6,0],[5,-4],[34,-54]],[[7848,7787],[13,-19]],[[7917,7839],[-56,-71]],[[7848,7787],[20,26],[-29,44],[43,37]],[[7882,7894],[12,-18],[11,-17],[12,-20]],[[7735,7841],[9,9],[7,9],[14,21],[2,1],[15,13]],[[7782,7894],[8,-11],[3,-2],[4,0],[2,1],[11,9],[16,14],[-42,66],[16,14],[16,13]],[[7816,7998],[42,-65],[12,-20]],[[7870,7913],[12,-19]],[[7782,7894],[-30,49],[-14,22]],[[7738,7965],[65,55]],[[7803,8020],[13,-22]],[[6474,1392],[-63,40]],[[6411,1483],[20,-13],[12,-8],[12,-8],[38,-24]],[[6493,1430],[-5,-9]],[[6488,1421],[-4,-8],[-5,-11],[-5,-10]],[[6545,1440],[-10,-22],[-37,24],[-5,-12]],[[6526,1502],[10,-7],[11,-7],[16,-10],[-8,-18],[-10,-20]],[[6591,1409],[-16,-16],[-16,-17]],[[6559,1376],[-16,-16],[-39,26],[9,20],[-25,15]],[[6545,1440],[46,-31]],[[6644,1515],[8,0],[3,0],[4,1]],[[6659,1516],[0,-5],[-1,-11],[0,-8],[-2,-8],[-1,-4],[-3,-8],[-2,-2],[-24,-26],[-4,-3],[-14,-15],[-17,-17]],[[6601,1293],[-5,10],[-12,30],[-3,11],[-1,2],[-2,4],[-1,4],[-3,5],[-1,3],[-6,8],[-5,6],[-1,0],[-2,0]],[[6659,1516],[41,-1],[24,-16],[-1,-8],[2,-1],[1,0],[1,-1],[3,-1],[3,-2],[37,34],[14,13],[3,1],[3,2],[7,5],[1,0],[2,1],[5,2],[1,1],[7,4],[5,2],[4,2],[3,1],[2,2],[1,0],[2,1],[1,0],[4,2],[2,1],[1,1],[2,1],[1,0],[0,1],[2,0],[1,1],[7,5],[7,3],[5,2],[1,0],[1,1],[3,1],[3,2]],[[6871,1578],[2,-1],[7,-5],[20,-14],[35,-24],[3,-2]],[[6938,1532],[-14,-18],[-25,-20],[-27,-24],[-27,-18],[-54,-35],[-75,-47],[-110,-74],[-5,-3]],[[6556,1556],[3,8],[14,31],[9,19],[10,5],[9,6],[14,10],[15,13],[14,13],[2,2],[15,15],[16,14],[5,4],[3,1]],[[6685,1697],[46,-29]],[[6731,1668],[-8,-7],[-17,-14],[-3,-4],[-12,-10],[-27,-80],[-3,-9],[0,-6],[-1,-7],[-1,-9],[0,-6]],[[6731,1668],[85,-55],[1,0],[1,-1],[3,-2]],[[6821,1610],[2,-1],[31,-20],[1,-1],[16,-10]],[[6749,1741],[49,-32],[7,4],[7,3]],[[6812,1716],[35,-22],[11,8],[3,-2],[-31,-70]],[[6830,1630],[-9,-20]],[[6731,1668],[9,9],[9,7],[11,7],[18,8],[-15,10],[-8,5],[-21,14]],[[6734,1728],[8,7],[7,6]],[[6685,1697],[-5,5]],[[6680,1702],[40,35]],[[6720,1737],[5,-3],[4,-3],[5,-3]],[[6680,1702],[-9,4]],[[6671,1706],[6,12],[11,22]],[[6688,1740],[6,13],[2,5],[2,4],[10,21]],[[6708,1783],[11,21]],[[6688,1740],[-73,47],[-32,20],[10,22]],[[6593,1829],[10,21],[10,21]],[[6613,1871],[58,-37],[-10,-21],[36,-23],[11,-7]],[[6656,1963],[58,-38],[3,6]],[[6717,1931],[61,-39]],[[6613,1871],[9,20],[8,17],[9,18],[8,18],[9,19]],[[6593,1829],[-73,47]],[[6520,1876],[7,6],[6,12]],[[6533,1894],[10,22],[9,19],[8,18]],[[6560,1953],[17,36],[9,19]],[[6586,2008],[70,-45]],[[6671,1706],[-178,114]],[[6493,1820],[6,12],[11,23],[10,21]],[[6671,1706],[-5,-8]],[[6666,1698],[-73,47],[-8,-18]],[[6585,1727],[-59,37],[-8,-19],[-9,-19]],[[6509,1726],[-58,37]],[[6451,1763],[10,20],[8,18],[8,18],[13,-7],[3,8]],[[6532,1632],[-22,13],[-25,16],[-6,4],[10,23],[5,9],[4,5],[2,6],[9,18]],[[6585,1727],[-8,-19],[-9,-20],[-9,-18],[-7,5],[-9,-21],[-11,-22]],[[6666,1698],[-16,-14],[-15,-14],[-18,11],[-8,-20],[-1,-3],[-12,-9],[-3,-1],[-3,2],[-4,2],[-8,-16],[-2,-3],[-15,-6],[-17,-3],[-12,8]],[[6451,1763],[-9,-18],[-20,13],[-2,4],[0,21],[0,25],[-3,3]],[[6417,1811],[0,22],[0,24],[0,12]],[[6417,1869],[9,-4],[67,-45]],[[6417,1869],[6,12],[3,-2],[11,22],[10,22]],[[6447,1923],[10,20]],[[6457,1943],[70,-45],[6,-4]],[[6417,1869],[-16,8],[-10,7],[-1,1],[-28,16]],[[6362,1901],[10,5],[3,18],[2,14],[-6,29],[-2,6]],[[6369,1973],[5,6],[11,10],[19,18],[2,3],[1,3]],[[6407,2013],[1,-11],[8,-6],[0,-27],[1,-27],[30,-19]],[[6407,2013],[1,0],[5,12],[8,17]],[[6421,2042],[2,-2],[61,-38]],[[6484,2002],[-8,-18],[-9,-19],[-10,-22]],[[6484,2002],[9,17],[70,-45],[-9,-17],[6,-4]],[[6421,2042],[10,23],[8,13],[3,7],[6,12]],[[6510,2056],[70,-44],[6,-4]],[[6613,2074],[-10,-23],[-7,-14],[-1,-7],[0,-3],[-1,-3],[-8,-16]],[[6407,2013],[0,6],[-2,-6],[-3,-3],[0,-1]],[[6402,2009],[-1,26],[0,240]],[[6401,2275],[0,7]],[[6401,2282],[0,35],[1,44],[0,41],[0,4]],[[6402,2406],[4,0],[5,0],[9,0],[8,-1],[5,-1],[5,-2],[5,-2],[4,-3]],[[6401,2275],[-2,-23],[-2,-25],[-6,-29],[0,-1],[-7,-25],[-17,-42],[-13,-21]],[[6354,2109],[-14,8],[-38,25],[-31,20],[-15,9]],[[6256,2171],[13,60],[1,8],[3,9],[4,9],[4,-3]],[[6281,2254],[15,-9],[2,0],[2,2],[6,14],[17,-11],[-8,-16],[0,-1],[1,-2],[1,-1],[57,-37],[3,0],[1,2],[1,4],[1,12],[-1,8],[0,24],[0,19],[0,22],[0,2],[-2,1],[-29,18],[-17,12],[-3,3]],[[6328,2320],[0,17],[1,8],[4,11],[11,24],[6,13],[2,4],[2,8],[0,3],[-6,5],[-9,6],[2,3]],[[6341,2422],[9,-7],[7,-4],[7,-4],[4,-1],[6,0],[6,0],[7,0],[5,0],[9,0],[1,0]],[[6281,2254],[27,58],[3,7],[7,7],[6,-5],[4,-1]],[[6402,2009],[-3,1],[-19,-17],[-10,7],[-5,3],[12,24],[5,13],[-1,5],[-4,6],[-8,5],[-7,5],[-9,2],[-12,-1],[-6,-8],[-14,-22],[-21,-31]],[[6300,2001],[-15,-23]],[[6285,1978],[-25,-35]],[[6260,1943],[-15,-22]],[[6245,1921],[-11,7],[-4,3]],[[6230,1931],[71,99]],[[6301,2030],[24,35],[29,44]],[[6301,2030],[-12,12],[-57,35],[-17,10]],[[6215,2087],[8,17],[8,16],[6,10],[9,23],[10,18]],[[6230,1931],[-12,8],[10,15],[-57,37]],[[6171,1991],[8,18]],[[6179,2009],[8,18],[8,16],[9,20],[11,24]],[[6369,1973],[-3,2],[-11,7],[-8,5]],[[6347,1987],[-13,8],[-2,1],[-2,1],[-4,-1],[-9,-3],[-3,0],[-3,0],[-2,1],[-9,7]],[[6347,1987],[-31,-30]],[[6316,1957],[-17,12],[-14,9]],[[6316,1957],[-14,-14]],[[6302,1943],[-5,-4],[-3,-2],[-8,-6],[-3,0],[-4,0],[-3,2],[-16,10]],[[6281,1897],[-3,2],[-14,9],[-3,4],[-16,9]],[[6302,1943],[18,-13],[1,-3]],[[6321,1927],[-6,-4],[-18,-14],[-16,-12]],[[6321,1927],[21,-13],[-18,-15],[22,-15]],[[6346,1884],[-3,-4],[-11,-12],[-1,-3]],[[6331,1865],[-50,32]],[[6362,1901],[-5,-5],[-11,-12]],[[6730,2120],[-11,-23]],[[6719,2097],[-11,-24],[-11,-24],[-11,-22]],[[6686,2027],[-73,47]],[[6686,2027],[-11,-24],[-10,-21],[-9,-19]],[[6836,1948],[-12,-11],[-5,-4]],[[6717,1931],[6,14],[10,21],[11,23]],[[6744,1989],[61,-40],[12,24],[27,-18]],[[7964,5893],[-41,31],[-17,13]],[[7906,5937],[4,14],[1,10],[0,17]],[[7891,5897],[6,17],[9,23]],[[7978,5880],[-6,-9],[-14,-25],[-32,24],[-35,27]],[[7987,5874],[-27,-45],[8,-3],[9,-6],[-5,-10],[-5,-10],[-4,-7]],[[7963,5793],[-56,42],[-30,22]],[[7877,5857],[7,19],[7,21]],[[7944,5758],[-60,44],[-10,7],[-11,6]],[[7863,5815],[7,22]],[[7870,5837],[7,20]],[[7963,5793],[-5,-10],[-4,-8],[-7,-12],[-3,-5]],[[7925,5721],[-21,15],[-55,39]],[[7849,5775],[14,40]],[[7944,5758],[-3,-8]],[[7941,5750],[-5,-8],[-1,-3],[-9,-17],[-1,-1]],[[7908,5689],[-11,-22]],[[7897,5667],[-48,36],[-2,1],[-1,0],[-1,0],[-1,-1],[-8,-14],[-15,10]],[[7821,5699],[6,16],[4,12],[2,3],[4,13],[12,32]],[[7925,5721],[-7,-13],[-3,-6],[-7,-13]],[[7897,5667],[-7,-13]],[[7890,5654],[-9,-13],[-10,-5],[-24,-45],[2,-14],[-10,-19]],[[7839,5558],[-13,12],[-16,12],[-34,24]],[[7776,5606],[22,48]],[[7798,5654],[23,45]],[[7982,5606],[-18,9]],[[7964,5615],[-59,30],[-15,9]],[[7908,5689],[16,-8],[7,-3],[70,-36]],[[8001,5642],[-11,-21],[-8,-15]],[[7942,5529],[-10,-18]],[[7932,5511],[-9,4],[-3,2],[-54,27],[-2,1],[-9,5],[-10,-19],[-9,-19]],[[7836,5512],[-8,5],[-3,1],[-6,3]],[[7819,5521],[1,5],[7,15],[7,14],[5,3]],[[7964,5615],[-9,-19],[-9,-18],[-2,-3],[-10,-18],[-9,-18],[5,-3],[12,-7]],[[7922,5492],[-10,-19]],[[7912,5473],[-9,5],[-2,1],[-55,28],[-2,1],[-8,4]],[[7932,5511],[-10,-19]],[[7902,5454],[-9,-18]],[[7893,5436],[-10,5],[-2,1],[-25,13],[-29,15],[-2,1],[-9,5]],[[7816,5476],[10,18],[8,-4],[3,-2],[54,-28],[2,-1],[9,-5]],[[7883,5417],[-10,-19]],[[7873,5398],[-9,5],[-3,1],[-54,28],[-2,1],[-9,4]],[[7796,5437],[10,18],[0,1],[10,20]],[[7893,5436],[-10,-19]],[[7779,5446],[-62,45]],[[7717,5491],[3,6],[16,29],[1,2],[18,38],[10,21],[5,9]],[[7770,5596],[6,10]],[[7819,5521],[-10,-19],[-10,-18],[-10,-19],[-10,-19]],[[7796,5437],[-9,-17],[-11,-20]],[[7776,5400],[-23,11],[-2,1],[-2,2],[-11,7],[-42,31],[-2,-3],[-10,-18],[-9,-17],[-10,-16],[-9,-17]],[[7656,5381],[-49,36]],[[7607,5417],[9,17],[9,17],[2,4],[7,13]],[[7634,5468],[9,18],[2,3],[9,17],[8,15],[4,7]],[[7666,5528],[51,-37]],[[7779,5446],[6,-3],[3,-1],[8,-5]],[[7751,5351],[-13,-25]],[[7738,5326],[-10,5],[-1,1],[-14,8]],[[7713,5340],[-57,41]],[[7776,5400],[-1,-4],[-12,-23]],[[7763,5373],[-12,-22]],[[7685,5288],[-57,42]],[[7628,5330],[10,17],[9,17],[9,17]],[[7713,5340],[-10,-18],[-9,-17],[-5,-9],[-4,-8]],[[7702,5259],[-26,12]],[[7676,5271],[9,17]],[[7738,5326],[-12,-22],[-12,-24],[-12,-21]],[[7656,5236],[-56,41]],[[7600,5277],[9,18],[10,17],[9,18]],[[7676,5271],[-10,-18],[-10,-17]],[[7666,5190],[-8,4],[-4,3],[-14,7]],[[7640,5204],[7,14],[5,9],[4,9]],[[7702,5259],[-12,-23]],[[7690,5236],[-12,-23],[-12,-23]],[[7640,5204],[-2,-3]],[[7638,5201],[-57,42]],[[7581,5243],[9,17],[10,17]],[[7666,5190],[-10,-20],[-13,-22]],[[7643,5148],[-26,13],[-3,2],[-37,19],[-21,14]],[[7556,5196],[7,12],[9,17]],[[7572,5225],[42,-30],[14,-12],[10,18]],[[6885,1991],[-44,28]],[[6841,2019],[11,23],[7,13],[4,8]],[[6744,1989],[11,23],[11,24]],[[6766,2036],[63,-40],[12,23]],[[6766,2036],[11,24]],[[6777,2060],[11,24]],[[6788,2084],[11,20],[10,19],[9,19]],[[6788,2084],[-58,36]],[[6812,1716],[6,4],[10,4],[10,5],[-58,38],[-8,-8],[-7,-5],[-8,-7],[-8,-6]],[[7126,2087],[1,-1],[5,-4],[22,19]],[[7154,2101],[22,-16],[32,-24],[16,16],[7,7],[18,7],[19,5],[18,9],[4,5],[17,15]],[[7307,2125],[17,13],[22,10],[23,11]],[[7369,2159],[17,14],[29,34]],[[7415,2207],[19,13]],[[7434,2220],[5,5],[13,10],[4,5],[3,-3],[2,-1],[6,-7],[5,-6],[1,-1]],[[7473,2222],[-2,-3],[-3,-4],[-24,-26],[-71,-63],[-49,-40],[-52,-38],[-25,-18],[-1,0],[-49,-32],[-50,-31],[-48,-38],[-139,-160],[-7,-11],[-10,-15],[-37,-56],[-8,-10],[-10,-10],[-45,-39],[-4,-1],[-2,0],[-2,1],[-2,0],[-3,2]],[[7404,1647],[-9,-17],[-28,-56],[-10,-21],[-4,-10],[-5,-9],[-10,-13],[-6,-8],[-3,-3],[-8,-10],[-36,-48]],[[7285,1452],[-2,-2],[-39,-51],[-5,-7]],[[7239,1392],[-16,-18],[-38,-37],[-32,-30],[-8,-7]],[[7145,1300],[-24,-23],[-1,0],[-24,-23],[-9,-9],[-8,-9]],[[6829,1427],[24,16],[23,15],[21,17],[19,16],[26,25],[19,27],[16,28],[16,29],[31,37],[3,4],[3,4],[10,11],[25,29],[31,35],[25,20],[37,28],[91,67],[2,1]],[[7251,1836],[1,0],[2,-1],[4,-2],[119,-93],[5,-5],[4,-9],[16,-77],[2,-2]],[[7143,1118],[-18,4],[15,36],[-15,12],[-15,12],[1,3]],[[7145,1300],[10,-7],[49,-35]],[[7204,1258],[-25,-53],[-7,-18],[-7,-16]],[[5655,1209],[-29,15],[-2,21],[-22,-1],[3,-37]],[[5605,1207],[-24,13]],[[5581,1220],[-25,15]],[[5556,1235],[-1,6],[6,1],[11,1],[-6,77]],[[5566,1320],[19,0],[20,0],[4,0],[37,-1],[23,-1],[3,0]],[[5672,1318],[2,-20],[4,-44],[0,-7]],[[5678,1247],[-3,0],[-24,-1],[4,-37]],[[5556,1235],[-5,2],[-2,4],[-26,12]],[[5523,1253],[-1,10],[0,18],[4,19],[1,19]],[[5527,1319],[20,1],[19,0]],[[5487,1147],[-10,125]],[[5477,1272],[24,-9],[22,-10]],[[5556,1235],[1,-15],[4,-35],[-2,-14],[1,-14],[-34,-4]],[[5526,1153],[-14,-2],[-25,-4]],[[5584,1066],[-25,15],[-8,5],[-11,6],[-9,4],[-2,26],[0,6],[-3,25]],[[5581,1220],[5,-60],[5,-58]],[[5591,1102],[1,-16],[-8,-20]],[[5605,1207],[26,-15],[21,-11]],[[5652,1181],[3,-3]],[[5655,1178],[4,-58],[-22,-2],[4,-47],[-26,16],[-24,15]],[[5655,1209],[1,-18],[-4,-10]],[[5685,1161],[-3,1],[-7,3],[-8,6],[-12,7]],[[5678,1247],[2,-28],[4,-46],[1,-12]],[[5699,1041],[-16,3],[-5,-2],[-12,-9],[-7,-3],[-6,0],[-8,1],[-10,5],[-14,7],[-13,8],[-24,15]],[[5685,1161],[48,-25],[20,-8],[25,-8],[15,-3]],[[6161,5074],[-4,2],[-53,24],[-13,-21],[-35,17],[1,-5],[0,-4],[0,-2],[-1,-6],[-2,-9]],[[6054,5070],[-4,-14],[-14,-24]],[[6036,5032],[-25,-47],[-6,0],[-7,-18]],[[5998,4967],[-12,5],[-2,2]],[[5984,4974],[9,16],[8,18],[4,5],[4,4],[8,14],[2,7],[2,1],[7,11],[6,13],[8,16],[2,7],[1,8],[1,9],[0,25],[0,4],[2,16],[13,44],[7,15],[11,19]],[[6079,5226],[4,0],[7,-3],[70,-34]],[[6160,5189],[10,-5],[8,-4],[5,-2]],[[6183,5178],[-3,-5],[0,-3],[-1,-3],[0,-18],[0,-14],[-1,-11],[-2,-5],[-15,-45]],[[6267,4964],[-14,7],[-48,23]],[[6205,4994],[10,26],[4,13],[4,12],[-62,29]],[[6183,5178],[11,-6],[64,-31]],[[6258,5141],[61,-29]],[[6185,4939],[-58,30]],[[6127,4969],[9,30],[8,25]],[[6144,5024],[4,13],[4,13],[5,13],[4,11]],[[6205,4994],[-8,-23],[-2,-4],[-10,-28]],[[6226,4852],[-15,7],[-47,24]],[[6164,4883],[7,17],[4,11],[1,3],[4,12],[5,13]],[[6164,4883],[-14,7]],[[6150,4890],[-43,22]],[[6107,4912],[6,17],[4,11],[1,4],[4,11],[5,14]],[[6150,4890],[-11,-29]],[[6139,4861],[-43,21]],[[6096,4882],[5,14],[6,16]],[[6207,4802],[-61,30]],[[6146,4832],[8,22],[-15,7]],[[6115,4746],[-58,30]],[[6057,4776],[8,21]],[[6065,4797],[8,22],[8,21]],[[6081,4840],[7,21],[8,21]],[[6146,4832],[-8,-21],[-7,-21],[-8,-23],[-8,-21]],[[6175,4715],[-60,31]],[[6154,4658],[-61,31]],[[6093,4689],[7,19],[8,19],[7,19]],[[6132,4601],[-16,8],[-38,20],[-6,3]],[[6072,4632],[7,19]],[[6079,4651],[7,19],[7,19]],[[6120,4569],[-75,21],[17,47],[10,-5]],[[6113,4545],[0,1],[-130,33]],[[5983,4579],[2,5]],[[5985,4584],[11,29],[3,8],[5,16],[16,44]],[[6020,4681],[59,-30]],[[6020,4681],[8,19],[7,19]],[[6035,4719],[8,18],[7,20],[7,19]],[[6004,4476],[-21,10]],[[5983,4486],[-25,13],[-4,3]],[[5954,4502],[27,73],[2,4]],[[5954,4502],[-4,1],[-6,3]],[[5944,4506],[7,17],[-69,35],[-48,25]],[[5834,4583],[5,13],[5,13],[-1,7]],[[5843,4616],[1,0],[31,-8]],[[5875,4608],[104,-27],[2,4],[4,-1]],[[5954,4502],[-21,-54]],[[5933,4448],[-4,2],[-4,4],[-3,2],[-18,10],[0,3],[-16,7],[-15,8],[-15,9],[11,30],[7,18],[68,-35]],[[5933,4448],[-19,-48],[-6,-18]],[[5841,4433],[-3,2],[-64,48],[-26,20]],[[5748,4503],[6,9],[14,36],[7,20],[8,20],[6,18]],[[5789,4606],[45,-23]],[[6029,4373],[-4,-2],[-26,-9],[-9,-2],[-15,-2],[-9,1],[-7,0],[-6,0],[-11,2],[-9,4],[-13,5],[-13,8]],[[5983,4486],[-11,-29],[-11,-24],[19,-12]],[[5710,4453],[35,46],[3,4]],[[7848,608],[-11,0],[-8,4],[-5,6],[-17,28],[-10,13],[-6,19],[-1,22],[5,9],[5,6],[7,5],[10,9],[5,4],[8,7],[13,2],[11,-1],[15,-4],[5,-1],[17,1],[18,2],[20,5],[25,8],[16,7],[7,3],[12,4],[23,13],[11,5],[9,4],[9,3],[18,7],[10,-3],[4,0],[31,-10],[8,-1],[2,-12],[0,-8],[-4,-12],[0,-5],[-4,-17],[-4,-7],[-10,-9],[-10,-10],[-10,-12],[-7,-9],[-8,-11],[-12,-12],[-4,-2],[-9,-2],[-15,-8],[-28,-13],[-23,-3],[-25,-8],[-11,-2],[-14,-1],[-10,-4],[-19,-1],[-10,-1],[-29,-7]],[[7669,768],[-1,7]],[[7668,775],[4,5],[8,6],[3,7],[1,9],[-1,7],[-4,5],[-5,4],[-5,7],[-5,4],[-3,3],[-3,5],[-14,9],[-3,1],[-3,-2],[-1,-4],[-1,-2]],[[7636,839],[-12,10],[-6,1],[-4,1],[-2,1]],[[7612,852],[-65,17]],[[7547,869],[4,22],[4,21]],[[7555,912],[4,22],[4,20],[5,20]],[[7568,974],[65,-17]],[[7633,957],[51,-13]],[[7684,944],[38,12],[15,15]],[[7737,971],[-27,-27],[-9,-8],[-10,-10],[-7,-10],[-2,-7],[-1,-13],[1,-5],[4,-2],[4,0],[13,-4],[10,-6],[4,-6],[6,-13],[3,-3],[5,0],[8,4],[3,5],[11,13],[5,6],[2,0],[-1,-2],[-18,-25],[-10,-14],[0,-11],[-8,-4],[-4,-4],[-13,-20],[-3,-7],[-6,-9],[-6,-2],[-13,-11],[-9,-8]],[[7915,744],[-7,0],[-7,3],[-11,2],[-23,7],[-12,2],[-16,1],[-1,2],[4,3],[8,3],[21,11],[9,8],[32,20],[11,4],[6,2],[42,21],[13,6],[8,1],[12,-1],[18,-3],[27,-9],[13,-3],[27,-14],[6,-5],[0,-3],[-7,0],[-9,2],[-12,1],[-8,0],[-12,-2],[-12,-3],[-11,-5],[-18,-5],[-14,-5],[-13,-3],[-11,-4],[-18,-8],[-21,-6],[-9,-5],[-7,-1],[-2,-2],[2,-2],[5,-2],[2,-5],[-1,-2],[-4,-1]],[[7608,830],[-2,0],[-7,1],[-50,3],[-11,1]],[[7538,835],[4,14],[5,20]],[[7612,852],[-1,-7],[0,-4],[2,2],[-1,-4],[-4,-9]],[[7522,803],[4,8]],[[7526,811],[9,20],[1,2],[2,2]],[[7608,830],[-1,-3],[-9,-24],[-2,-4],[-3,-10],[-4,-11],[-9,-17],[-13,-13],[-14,-11],[-6,-5],[-11,20],[18,15],[11,11],[3,8],[-12,6],[-12,4],[-22,7]],[[7636,839],[-4,-4],[-3,-5],[-13,-27],[-34,-61],[-2,-3],[-7,-9],[-7,-12],[-13,-14],[-25,-35],[-11,-20],[-21,-30],[-15,-22],[-15,-18],[-9,-9],[-13,-11],[-19,-14],[-3,-2],[-14,-6],[-12,-4],[-12,-7],[-3,-2]],[[7381,524],[-1,6]],[[7380,530],[31,10],[49,37],[51,77],[5,9],[-22,13],[-25,15]],[[7469,691],[10,19],[15,32],[10,23]],[[7504,765],[8,17],[10,21]],[[7715,417],[-8,-8],[-9,-8],[-6,-7],[-18,-14],[-10,-4],[-19,1],[-8,2],[-11,10],[-10,12],[-4,9],[8,14],[9,6],[7,3],[3,2],[5,-1],[6,-2],[7,-4],[3,-1],[20,-3],[18,-2],[18,-2],[-1,-3]],[[7669,768],[-5,-5],[-8,-14],[-28,-30],[-11,-14],[-8,-12],[-6,-7],[-1,-1],[-1,0],[0,4],[6,11],[10,14],[22,26],[5,8],[15,15],[6,8],[3,4]],[[7380,530],[-9,14],[-9,19],[-16,35]],[[7346,598],[19,7],[18,8],[5,1],[14,6],[17,9],[2,1],[11,8],[2,2],[9,9],[4,4]],[[7447,653],[7,8],[7,12],[8,18]],[[7346,598],[-10,25]],[[7336,623],[67,28],[11,23]],[[7414,674],[16,-9],[17,-12]],[[7336,623],[-9,20],[-9,21]],[[7318,664],[17,6],[17,8]],[[7352,678],[25,9],[4,9]],[[7381,696],[17,-11],[16,-11]],[[7633,957],[4,21],[5,21]],[[7642,999],[74,-20]],[[7716,979],[-17,-17],[-15,-18]],[[7568,974],[3,22],[4,21]],[[7575,1017],[67,-18]],[[7630,1111],[-4,-21],[32,-7],[-8,-42]],[[7650,1041],[-4,-21],[-4,-21]],[[7575,1017],[5,21]],[[7580,1038],[3,20],[0,9],[-5,15],[-12,24],[-7,15],[0,9]],[[7559,1130],[71,-19]],[[7451,1007],[-13,5]],[[7438,1012],[39,41],[24,26],[10,12],[14,22],[28,52],[1,1]],[[7554,1166],[12,-2]],[[7566,1164],[-6,-11],[-3,-8],[2,-15]],[[7580,1038],[-66,18],[-5,-21],[-25,7],[-17,-18],[-16,-17]],[[7501,993],[-50,14]],[[7568,974],[-67,19]],[[6314,834],[-39,-1],[-2,-11],[-18,7],[-10,7],[-22,32],[-9,9]],[[6214,877],[0,47],[0,4],[17,0],[0,-34],[8,-8],[10,-13],[-1,55],[18,1],[0,9]],[[6266,938],[46,1]],[[6312,939],[1,-27],[1,-78]],[[6375,732],[-5,-17]],[[6370,715],[-11,11],[-5,9],[-14,17],[-2,4],[-17,17],[-3,3],[-35,24],[-8,11],[-1,1],[-10,4],[-5,0],[-8,5],[-3,4],[-11,14],[-2,3],[-7,7],[-17,18]],[[6211,867],[0,12]],[[6211,879],[3,-2]],[[6314,834],[20,0],[19,1]],[[6353,835],[20,0],[1,-80],[-5,-16],[3,-4],[3,-3]],[[6533,876],[-2,-8],[24,-6]],[[6555,862],[-22,-78],[-1,-6],[-4,-13]],[[6528,765],[-9,2],[-4,1],[-9,3],[-2,0],[-6,2],[-21,6]],[[6477,779],[-22,8],[-10,6],[-18,7],[-14,-46],[-14,-47],[-10,12],[-3,4],[-3,3],[-8,6]],[[6375,732],[1,6],[13,54],[1,3],[6,24],[3,17],[3,23],[1,5]],[[6403,864],[2,3],[1,2],[2,2],[2,4],[2,3],[1,2],[7,6],[12,5],[11,0],[17,-5],[5,-1],[19,-6],[45,-11],[2,8]],[[6531,876],[2,0]],[[6488,656],[-1,-2],[0,-4],[-1,-3],[-2,-6],[-2,-7],[-2,-5]],[[6480,629],[-3,-9]],[[6477,620],[-7,4],[-7,6],[-3,2],[-13,11],[-21,20],[-5,6],[-4,5],[-11,12],[-18,15],[-8,4],[-10,10]],[[6477,779],[-16,-53],[-5,-19],[-1,-7],[-5,-20],[17,-10],[7,-5],[1,-1],[13,-8]],[[6606,724],[-21,8],[-20,-74]],[[6565,658],[-51,33],[-6,4],[-1,-7],[-5,-16],[-6,-22],[-8,6]],[[6528,765],[6,-2],[11,-6],[13,-7],[32,-16],[3,-1],[14,-5],[-1,-4]],[[6565,658],[-7,-22],[-6,-22],[-7,-24],[-19,14],[-16,9],[-21,12],[-9,4]],[[6903,754],[18,-4],[17,-5],[19,-3]],[[6957,742],[-18,-64]],[[6939,678],[-9,-4],[-11,3],[-16,7],[-18,7],[18,63]],[[6940,607],[-2,4],[-2,-2],[-1,-1],[-3,-2],[-3,-1],[-4,0],[-3,1],[-4,1]],[[6918,607],[1,3],[6,21],[6,20]],[[6931,651],[6,20],[2,7]],[[6957,742],[18,-5],[20,-4],[20,1],[15,6],[7,4],[7,7],[7,11],[2,2]],[[7053,764],[4,-5],[4,-5],[3,-5],[14,-38],[1,-7],[1,-4],[3,-7]],[[7083,693],[-15,-8],[-37,-15],[-33,-16],[-18,-13],[-24,-20],[-16,-14]],[[7098,603],[-7,-20],[-14,-7],[-13,-4],[-7,-4]],[[7057,568],[-7,-2]],[[7050,566],[-16,44],[-8,19],[-30,-15],[-6,-3],[-15,-17],[1,-48]],[[6976,546],[-1,-59],[-1,-44],[-15,5],[-12,3],[-3,1],[-2,0],[-22,2],[-13,-2],[-5,0]],[[6902,452],[11,50],[12,46],[15,34],[18,25],[25,20],[29,21],[38,15],[33,14],[5,2]],[[7088,679],[3,-6],[2,-7],[2,-4],[2,-3],[3,-3],[2,-2],[14,-11],[-7,-13],[-7,-16],[-4,-11]],[[6993,546],[-17,0]],[[7050,566],[-20,-7],[-18,-7],[-19,-6]],[[7057,568],[-4,-31],[-1,-22],[-1,-4],[0,-23]],[[7051,488],[-22,0],[-21,0],[-15,58]],[[7098,603],[18,-8],[6,-14],[17,-45],[9,-20]],[[7148,516],[-15,-7],[-33,-13],[-9,-4]],[[7091,492],[-14,-3],[-26,-1]],[[7148,516],[15,-35],[8,-23]],[[7171,458],[-20,-8],[-37,-11],[-13,-3],[-8,22],[-2,34]],[[7194,535],[18,-43],[18,2]],[[7230,494],[19,1],[20,-1]],[[7269,494],[-4,-23],[-19,1],[-24,-4],[-29,-2],[-22,-8]],[[7148,516],[19,8],[9,4]],[[7176,528],[18,7]],[[7194,535],[17,8],[-19,44],[0,7],[2,8],[17,19],[13,10],[12,-14],[8,-15],[9,-20],[7,-19]],[[7260,563],[-16,-7],[8,-18]],[[7252,538],[-17,-7],[-17,-7],[12,-30]],[[7252,538],[16,6],[16,7],[21,-49]],[[7305,502],[-7,-7],[-9,-3],[-8,-1],[-12,3]],[[7260,563],[33,13]],[[7293,576],[26,-62],[-14,-12]],[[7175,450],[-4,8]],[[7293,576],[53,22]],[[7381,524],[-20,-14],[-8,-7],[-12,-8],[-18,-15],[-10,-6],[-12,-11],[-6,-4],[-4,-1],[-3,0],[-3,2],[-12,0],[-26,-4],[-16,-4],[-18,0],[-22,1],[-3,0],[-13,-3]],[[7175,450],[-16,-4],[-18,-6],[-10,-4],[-10,-7],[-8,-5],[-22,-3],[-11,1],[-5,3],[-8,3],[-21,2],[-35,0],[-26,-1],[-26,0],[-13,-2],[-8,1],[-1,-5],[-2,-2],[-7,-6],[-3,0],[-16,4],[-11,-2],[-4,1],[8,34]],[[6886,453],[-7,-32],[-23,4]],[[6856,425],[16,35]],[[6872,460],[3,-4],[4,-2],[3,-1],[4,0]],[[7464,1065],[-2,2],[-3,4],[-2,4],[-3,2],[-5,5],[-4,2],[-9,5]],[[7436,1089],[-9,3],[-16,5],[-78,21]],[[7333,1118],[-56,17]],[[7277,1135],[13,65]],[[7290,1200],[56,-15],[4,22]],[[7350,1207],[2,-1],[2,-1],[70,-17],[2,-2],[-1,-3],[-3,-17],[10,-3],[7,-3],[5,-2],[9,-4],[37,-9],[11,21],[2,3]],[[7503,1169],[17,1],[11,4],[4,-1]],[[7535,1173],[2,-1]],[[7537,1172],[-2,-3],[-24,-46],[-16,-23],[-10,-11],[-20,-24],[-1,0]],[[7350,1207],[4,12]],[[7354,1219],[95,-32],[54,-18]],[[7290,1200],[5,22],[2,12]],[[7297,1234],[57,-15]],[[7399,1492],[20,35],[6,30]],[[7481,1573],[2,-10],[7,-32],[0,-2],[8,-40],[-2,-11]],[[7496,1478],[-21,5],[-21,6],[-21,5],[-10,0],[-6,0],[-8,-1],[-10,-1]],[[7518,1584],[3,-10],[0,-2],[7,-35],[8,-37],[3,-11]],[[7539,1489],[2,-10],[-2,-12]],[[7539,1467],[-21,5],[-22,6]],[[7554,1595],[3,-12],[15,-72],[3,-12]],[[7575,1499],[-18,-5],[-18,-5]],[[7637,1518],[-27,-8]],[[7610,1510],[-19,-6],[-16,-5]],[[7610,1510],[3,-12],[9,-41],[-2,-11]],[[7620,1446],[-21,6],[-19,5],[-20,5],[-21,5]],[[7679,1530],[2,-10],[11,-48],[2,-2]],[[7694,1470],[-9,-16],[-5,-9]],[[7680,1445],[-2,-3],[-5,-9]],[[7673,1433],[-3,1],[-20,4],[-30,8]],[[7740,1546],[-18,-29],[-18,-30],[-10,-17]],[[7675,1631],[3,-10],[17,-75],[2,-10],[9,3],[9,3],[23,6],[2,-2]],[[7983,2761],[-12,16],[-9,10],[-7,7]],[[7955,2794],[26,32],[-7,8],[25,25]],[[7999,2859],[7,-8],[5,-5],[3,-3],[10,-12],[13,-17]],[[8037,2814],[-28,-27],[0,-1],[-26,-25]],[[7932,2709],[-8,21],[-4,11]],[[7920,2741],[8,11],[3,6],[24,36]],[[7983,2761],[-26,-27],[-10,-10],[-15,-15]],[[7949,2664],[-8,20],[-9,25]],[[7983,2761],[15,-20],[12,-15]],[[8010,2726],[-28,-29],[-33,-33]],[[8041,2683],[-25,-24]],[[8016,2659],[-7,10],[-23,-23],[-22,-22]],[[7964,2624],[-8,21]],[[7956,2645],[-7,19]],[[8010,2726],[10,-15],[2,-1],[11,-16],[8,-11]],[[8022,2541],[-5,7],[-6,8]],[[8011,2556],[-8,11],[-19,25],[-5,6],[-3,4],[0,4],[-12,18]],[[8016,2659],[7,-9],[11,-14],[4,-5],[12,-16],[12,-16],[1,-1]],[[8063,2598],[-13,-17],[-27,-38],[-1,-2]],[[8041,2683],[6,-9],[26,26],[13,11],[16,16]],[[8102,2727],[11,-16],[1,-3],[19,-15]],[[8133,2693],[-5,-7],[-19,-25],[-14,-20],[-7,-8],[-22,-32],[-3,-3]],[[8010,2726],[26,25],[27,28]],[[8063,2779],[11,-15],[12,-16]],[[8086,2748],[16,-21]],[[8037,2814],[9,-11],[6,-9]],[[8052,2794],[11,-15]],[[8052,2794],[17,18],[7,11]],[[8076,2823],[14,-12],[15,-12],[16,-12],[-8,-12],[-27,-27]],[[8285,2852],[-5,-5],[-3,5],[-10,-4],[6,-8],[-17,-17],[-6,9],[-7,-8],[3,-5],[-11,-6],[-9,-3],[-14,-3],[-11,-3],[-6,0],[-1,-3],[27,6],[6,0],[17,4],[-1,-3],[-10,-10],[-37,-37],[-2,-2],[-7,-3],[-9,-8],[-19,-22],[-6,-8],[-7,-9],[-5,-4],[0,-3],[-8,-9]],[[8076,2823],[13,22],[13,23],[27,48]],[[8129,2916],[23,-18],[12,-11],[14,29]],[[8178,2916],[16,-12],[24,-20],[36,-17],[31,-15]],[[8179,2575],[-13,18],[-1,1],[-14,19],[-50,-51]],[[8101,2562],[-13,12],[-8,7],[-12,12]],[[8068,2593],[5,7],[6,6],[6,7],[16,17],[5,2],[6,8],[15,20],[3,6],[5,4],[8,10],[9,11],[15,19],[33,35],[1,5],[2,2]],[[8223,2723],[-35,-36],[16,-20],[14,-19],[14,-19]],[[8232,2629],[-27,-27],[-26,-27]],[[8280,2678],[-18,-18],[-14,-14],[-16,-17]],[[8260,2542],[-5,11],[-10,19]],[[8245,2572],[14,21],[-12,16],[-15,20]],[[8245,2572],[-9,-11],[-27,-26],[-15,20],[-15,20]],[[8260,2542],[-31,-36],[-19,-19],[-13,-13]],[[8197,2474],[-3,3],[-3,1],[-10,10],[-15,14],[-13,12],[-19,17]],[[8134,2531],[45,44]],[[8272,2517],[-41,-74]],[[8231,2443],[-13,12],[-16,14],[-1,2],[-4,3]],[[8290,2482],[-33,-64]],[[8257,2418],[-14,13]],[[8243,2431],[-12,12]],[[8280,2365],[-21,12],[8,17],[5,11],[-15,13]],[[8271,2345],[-20,14],[-18,12],[-9,5],[-8,6],[6,11],[3,6],[13,22],[5,10]],[[8262,2326],[-20,13]],[[8242,2339],[-17,10],[-20,11],[-15,9],[-15,8],[-33,19],[-1,0],[-9,1],[-12,3]],[[8120,2400],[1,10],[0,4],[0,2],[0,5],[0,10],[0,6]],[[8121,2437],[22,6],[16,8],[16,9],[14,8],[7,5],[1,1]],[[6637,501],[-2,-12]],[[6635,489],[-23,26],[-11,12],[-16,12],[-16,19],[-5,7],[-31,25],[-18,9],[-10,3],[-15,10],[-13,8]],[[6565,658],[3,-67],[44,-43],[2,-22],[23,-25]],[[6565,658],[17,-7],[-6,-21]],[[6576,630],[-3,-14],[1,-7],[34,-36],[4,-5],[6,-4],[6,-3],[27,-10]],[[6651,551],[-8,-28]],[[6643,523],[-6,-22]],[[6576,630],[10,-6],[30,-30]],[[6616,594],[10,-11],[12,-5],[10,37]],[[6648,615],[19,-7]],[[6667,608],[-9,-31],[-7,-26]],[[6616,594],[10,13],[1,5],[-17,16],[-2,4],[0,3],[3,14],[5,21],[-16,7],[5,20]],[[6605,697],[60,-22],[-6,-20],[-11,-40]],[[6606,724],[5,-2],[-6,-25]],[[6691,692],[-9,-33]],[[6682,659],[-15,-51]],[[6555,862],[95,-24]],[[6650,838],[78,-17]],[[6728,821],[-27,-94],[-9,-31],[-1,-4]],[[6682,659],[18,-8],[17,-6]],[[6717,645],[-13,-48],[-3,-2],[-16,5],[-18,8]],[[6822,642],[-10,-33]],[[6812,609],[-42,16]],[[6770,625],[-17,6],[-17,7]],[[6736,638],[-16,6],[-3,1]],[[6691,692],[23,-9],[27,-10],[33,-13],[48,-18]],[[6770,625],[-13,-47],[-2,-3],[-4,0],[-13,5],[-16,6],[0,6],[14,46]],[[6812,609],[-15,-52]],[[6797,557],[-10,-33],[-11,-37]],[[6776,487],[-20,2],[-5,1],[-20,3],[-18,4],[-16,5],[-36,14],[-18,7]],[[6834,517],[2,-23],[-18,-3],[4,-33]],[[6822,458],[-26,-6],[-8,0],[-9,-1],[-13,2],[10,34]],[[6797,557],[20,-8],[9,-3],[4,0],[4,-29]],[[6856,425],[-81,14],[-9,-1],[-14,1],[-15,4],[-11,2],[-13,2],[-3,2],[-16,5],[-16,7],[-9,2],[-21,12],[-6,6],[-7,8]],[[6822,458],[31,5],[10,0],[5,-2],[4,-1]],[[6834,517],[11,2],[5,4],[2,4],[6,21]],[[6858,548],[19,-7],[-13,-45],[5,-1],[4,-1],[5,-1],[4,-2],[-10,-31]],[[6822,642],[52,-19]],[[6874,623],[-6,-24],[-2,-24],[-8,-27]],[[6874,623],[29,-11],[15,-5]],[[6940,607],[-4,-4],[-11,-19],[-17,-46],[-12,-43],[-10,-42]],[[6822,642],[1,4],[9,31],[28,-10],[3,11]],[[6863,678],[9,-4],[8,-3],[51,-20]],[[6863,678],[22,80],[18,-4]],[[7573,1803],[-22,96]],[[7592,1912],[3,-11],[4,-18],[1,-5]],[[7600,1878],[2,-11],[9,-40],[3,-11]],[[7668,1904],[-1,-20]],[[7667,1884],[-1,-21]],[[7666,1863],[-9,1],[-13,1],[-12,1],[-3,-1],[-6,-1],[-3,10],[-2,9],[-18,-5]],[[7666,1863],[-1,-20],[-1,-10],[0,-10]],[[7664,1823],[-22,1],[-10,-2],[-18,-6]],[[7664,1823],[17,-1],[29,-2],[-1,-20],[10,0],[23,-2],[10,0]],[[7714,1880],[-1,-21],[8,0],[25,-2],[9,-1]],[[7667,1884],[9,-1],[29,-2],[9,-1]],[[7714,1880],[1,21],[1,20],[1,21]],[[7530,1791],[-3,12],[-15,72],[-3,11]],[[7509,1886],[19,6],[23,7]],[[7497,1781],[-3,12],[-13,61],[-1,7],[0,2],[1,2]],[[7481,1865],[1,2],[1,11],[9,3],[17,5]],[[7457,1770],[-5,24],[-5,24],[-7,35],[11,3],[10,3],[20,6]],[[7251,1836],[25,14],[30,16],[35,19],[72,37],[123,85],[22,18],[3,3],[3,2],[1,1]],[[7176,528],[-9,21],[-1,5],[-8,17],[-1,5],[-8,18],[-3,8],[2,5],[15,17],[12,15],[17,17],[12,9],[15,9],[16,9],[-16,43],[14,16],[15,14]],[[7248,756],[34,-22],[5,-6],[7,-11],[24,-53]],[[7088,679],[20,8],[29,17],[38,29],[1,0],[47,51],[2,2]],[[7225,786],[0,-1],[5,-7],[5,-5],[13,-17]],[[7083,693],[36,18],[24,16]],[[7143,727],[-15,-12],[-45,-22]],[[7225,786],[37,40]],[[7262,826],[1,-1],[12,-9],[8,-6],[7,-4],[65,-42]],[[7355,764],[-6,-10],[-5,-8],[-2,-1],[-6,-6],[-8,-4],[12,-27],[12,-30]],[[7355,764],[33,-21],[11,-7]],[[7399,736],[-9,-20],[-9,-20]],[[7445,731],[-9,-19]],[[7436,712],[-37,24]],[[7355,764],[9,19],[17,-11],[15,-10],[10,19]],[[7406,781],[48,-30],[-9,-20]],[[7436,712],[13,-7],[20,-14]],[[7445,731],[18,-11],[25,55]],[[7488,775],[16,-10]],[[7406,781],[7,18]],[[7413,799],[49,-30],[9,17],[17,-11]],[[7413,799],[10,20]],[[7423,819],[23,-4],[36,-3],[23,-1],[-17,-36]],[[7423,819],[-17,9],[-17,11],[4,8],[5,9]],[[7398,856],[8,-4],[11,-6],[19,-7],[16,-4],[41,-2],[25,-1],[5,-2],[3,-3],[1,-2],[0,-2],[1,-2],[0,-3],[-1,-2],[-1,-5]],[[7398,856],[0,2],[1,1],[5,11],[7,16],[4,18]],[[7415,904],[66,-17]],[[7481,887],[66,-18]],[[7415,904],[4,21],[4,22],[5,21],[66,-18]],[[7494,950],[-4,-20]],[[7490,930],[-5,-22],[-4,-21]],[[7501,993],[-4,-21],[-3,-22]],[[7415,904],[-48,12],[-12,6],[-2,1]],[[7353,923],[14,13],[71,76]],[[7684,2843],[-14,-11],[-9,-7]],[[7661,2825],[-6,-2],[-11,-6],[-11,-9]],[[7633,2808],[-29,21],[-31,22],[-11,7],[-9,8]],[[7553,2866],[12,18],[19,-12],[4,-3],[21,3],[3,2],[2,4],[2,4],[4,5],[6,-1],[8,-6]],[[7634,2880],[50,-37]],[[7727,2937],[-5,-7],[-8,5],[-9,-1],[-11,-6],[-7,-9],[-6,-12],[-13,9],[-11,7],[-11,-22],[-12,-21]],[[7553,2866],[-4,2]],[[7579,2979],[13,-8],[9,14],[8,14]],[[7609,2999],[15,-8],[16,-8],[14,-7],[18,-10],[25,-13],[30,-16]],[[7745,2927],[-15,-22],[-16,-23],[-14,-20],[-16,-19]],[[7727,2937],[18,-10]],[[7866,3000],[-19,18]],[[7847,3018],[15,20],[8,11]],[[7870,3049],[12,-12],[3,-3],[3,-2]],[[7888,3032],[-8,-11],[-3,-5],[-4,-6],[-7,-10]],[[7891,2976],[-7,6],[-2,3],[-7,7],[-2,1],[-7,7]],[[7888,3032],[8,-9],[8,-7],[9,-10]],[[7913,3006],[-11,-15],[-11,-15]],[[7911,2957],[-20,19]],[[7913,3006],[10,-9],[2,-1],[7,-7]],[[7932,2989],[-1,-2],[-6,-10],[-8,-10],[-1,-1],[-4,-6],[-1,-3]],[[7952,2919],[-3,3],[-6,7],[-9,9],[-8,6],[-3,1],[-12,12]],[[7932,2989],[0,3],[7,8],[9,13],[6,10],[14,-14]],[[7968,3009],[-5,-7],[-2,-2],[-9,-13],[-6,-8],[-2,0],[-2,0],[4,-2],[24,-24],[1,-1],[1,-2]],[[7972,2950],[-1,-2],[-9,-15],[-10,-14]],[[7968,3009],[12,-11],[8,-7],[2,-2],[1,-1],[1,-2]],[[7992,2986],[-8,-16],[-12,-20]],[[8023,3038],[-16,-27],[-15,-25]],[[7913,3006],[24,34],[14,20],[14,20]],[[7965,3080],[11,-8],[5,-3],[23,-17],[4,-5],[7,-5],[5,-1],[3,-3]],[[7888,3032],[5,7],[10,13],[2,3],[0,1],[6,8]],[[7937,3101],[18,-14],[10,-7]],[[7847,3018],[-13,13]],[[7834,3031],[18,35],[20,37]],[[7894,3081],[-7,-9],[-17,-23]],[[7830,3205],[-10,-19],[-5,-11],[-4,-6],[-22,-45]],[[7789,3124],[-7,3],[-4,0],[-7,-2],[-5,-2],[-8,-6],[7,10],[4,6],[2,5],[33,70]],[[7804,3208],[3,-2],[6,11],[17,-12]],[[7804,3208],[4,17],[5,24],[2,7]],[[7815,3256],[32,71],[9,19],[12,23],[15,26]],[[7883,3395],[49,-39],[-2,-4],[-18,-22]],[[7912,3330],[-13,-21]],[[7899,3309],[-17,-24]],[[7882,3285],[-19,-27]],[[7863,3258],[-17,-27],[-16,-26]],[[7900,3152],[-29,22],[-6,5]],[[7865,3179],[-35,26]],[[7863,3258],[39,-30],[8,-7],[21,-16]],[[7931,3205],[-9,-16],[-8,-12],[-7,-12],[-7,-13]],[[7887,3131],[-25,-3],[-12,-2],[-13,-1]],[[7837,3125],[18,41],[2,0],[8,13]],[[7900,3152],[-13,-21]],[[8242,2339],[-19,-40]],[[8223,2299],[-17,10],[-11,7],[-36,24],[-2,0],[-4,-2],[-4,-1],[-7,-3],[-9,-5],[-2,-1]],[[8131,2328],[-10,27],[-3,8],[-1,3],[0,4],[2,21],[1,9]],[[8223,2299],[-11,-29]],[[8212,2270],[-4,1],[-31,2],[-9,-5],[-10,-4],[0,-2]],[[8158,2262],[-6,13],[0,1],[-14,34],[-4,10],[-2,5],[-1,3]],[[8203,2195],[-14,8],[-10,4]],[[8179,2207],[3,1],[17,29],[13,33]],[[8149,2209],[2,53],[7,0]],[[8179,2207],[-9,0],[-21,2]],[[8124,2160],[3,51]],[[8127,2211],[22,-2]],[[8191,2174],[-1,-4],[-1,-6],[0,-9]],[[8127,2211],[3,52],[-21,2]],[[8109,2265],[2,60],[0,2],[10,-1],[6,0],[2,1],[2,1]],[[8084,2214],[3,53]],[[8087,2267],[22,-2]],[[8127,2211],[-22,1],[-21,2]],[[8087,2267],[3,57],[0,5],[-7,9],[1,2],[-6,13],[-4,18],[-1,5],[-4,14],[3,3],[9,5],[9,0],[9,1],[21,1]],[[8103,2161],[-22,2]],[[8081,2163],[3,51]],[[6842,3392],[17,-12],[-33,-63],[-1,-4]],[[6825,3313],[-17,13]],[[6808,3326],[34,66]],[[6766,3248],[42,78]],[[6825,3313],[0,-4],[-41,-75]],[[6784,3234],[-18,14]],[[6752,3369],[17,-12]],[[6769,3357],[3,-3],[1,-2],[13,-10]],[[6786,3342],[2,-2],[2,-2],[1,0],[11,-8],[2,-2],[2,-2],[2,0]],[[6766,3248],[-19,13]],[[6747,3261],[-38,29],[-15,11]],[[6694,3301],[39,74],[16,-11],[2,3],[1,2]],[[6769,3357],[15,8],[39,73],[15,2]],[[6838,3440],[-52,-98]],[[6957,3427],[-9,-23],[-34,-65]],[[6914,3339],[-10,6],[-9,7]],[[6895,3352],[38,72],[6,16]],[[6957,3427],[21,-15],[4,0]],[[6982,3412],[-12,-22],[-12,-22],[-12,-22]],[[6946,3346],[-12,-23]],[[6934,3323],[-2,2],[-18,14]],[[6984,3317],[-38,29]],[[6982,3412],[21,1]],[[7003,3413],[-5,-16],[-11,-20],[21,-16],[-12,-22],[-12,-22]],[[6984,3317],[-11,-21]],[[6973,3296],[-17,13]],[[6956,3309],[-18,13],[-4,1]],[[6950,3253],[-15,11],[0,5],[19,37],[2,3]],[[6973,3296],[-1,-3],[-22,-40]],[[6973,3296],[21,-16]],[[6994,3280],[-1,-3],[-22,-40],[-21,16]],[[7010,3266],[-23,-42]],[[6987,3224],[-14,-24]],[[6973,3200],[-35,30]],[[6938,3230],[12,23]],[[6994,3280],[13,-9],[3,-5]],[[6938,3230],[-16,11]],[[6922,3241],[-18,13]],[[6904,3254],[5,13],[13,34],[12,22]],[[6904,3254],[-2,2],[-8,6],[-15,11]],[[6879,3273],[6,11],[29,55]],[[6861,3286],[1,3],[33,63]],[[6879,3273],[-15,11]],[[6864,3284],[-3,2]],[[6904,3254],[-41,-78]],[[6863,3176],[-3,2],[-8,6],[-10,7]],[[6842,3191],[-20,15]],[[6822,3206],[42,78]],[[6880,3163],[-17,13]],[[6922,3241],[-42,-78]],[[6973,3200],[-41,-76]],[[6932,3124],[-33,26]],[[6899,3150],[-19,13]],[[7003,3413],[17,1]],[[7020,3414],[20,-15],[4,-3],[26,-19]],[[7070,3377],[-25,-45],[-35,-66]],[[7145,3353],[-36,-67],[-37,-66]],[[7072,3220],[-13,10],[-49,36]],[[7070,3377],[14,24]],[[7125,3172],[-5,4],[-12,12],[-3,2]],[[7105,3190],[-15,15]],[[7090,3205],[38,68],[32,59]],[[7020,3414],[14,24],[16,30]],[[6939,3671],[-44,-81]],[[6895,3590],[-11,8],[-8,6],[-17,13],[-9,7],[-3,3]],[[6847,3627],[9,17],[21,39],[5,13],[2,2]],[[6884,3698],[2,-2],[9,-7],[2,-1],[2,-2],[6,-6],[11,-2],[23,-7]],[[6939,3671],[25,-7]],[[6964,3664],[-18,-6],[-9,-15],[-29,-51],[-13,-2]],[[6964,3664],[-7,-12],[-20,-37],[-24,-44]],[[6913,3571],[-7,11],[-11,8]],[[6964,3664],[10,-4],[12,-9]],[[6986,3651],[-7,-12],[-49,-92]],[[6964,3664],[9,17],[19,27],[15,27]],[[7007,3735],[12,21],[11,-7]],[[7030,3749],[6,-6],[-34,-64]],[[6939,3671],[17,30],[9,15],[10,13],[6,6],[4,5],[3,3],[4,1],[3,-1],[4,-2],[8,-6]],[[7035,3759],[-5,-10]],[[6884,3698],[19,32]],[[6903,3730],[13,-6],[20,-9],[7,-4],[14,24],[7,17],[19,31],[5,10]],[[6988,3793],[2,-2],[38,-26],[3,-2],[4,-4]],[[7070,3733],[-6,-11],[-2,2],[-5,-1],[-4,-3],[-4,-2],[-3,-4],[-3,-5],[-5,-9],[-3,-5],[-5,-8],[-3,-8],[0,-4]],[[7035,3759],[35,-26]],[[8081,2163],[-2,-35]],[[8079,2128],[-22,0],[-21,1],[-22,2],[3,44],[-41,3],[-4,-4],[-6,-7],[-20,2],[-4,-35],[-15,1]],[[7927,2135],[44,128],[29,53],[24,40],[-5,4],[-25,-41],[-28,-53],[-47,-130]],[[7919,2136],[-2,0],[0,-1],[-10,-38],[0,-1],[0,-2],[-1,-2],[0,-2],[0,-17],[0,-3],[0,-2],[-1,-3],[0,-4],[-1,-8],[-2,-19],[0,-2]],[[7902,2032],[-2,0],[-2,0],[-2,0],[-4,0],[-3,0],[-28,2],[-31,2]],[[7607,2083],[3,3],[4,3],[2,1],[2,2],[2,1],[4,3],[21,15],[20,14],[52,18],[5,1],[5,2],[44,32],[2,2],[2,0],[3,1],[4,3],[7,1],[7,3],[4,3],[5,4],[5,4],[9,7],[8,7],[6,6],[1,3],[-1,2],[1,3],[0,3],[5,4],[1,4],[3,2],[3,3],[2,3],[2,2],[13,18],[11,13],[2,3],[1,3],[2,1],[2,-2],[-1,-3],[2,-1],[2,1],[2,0],[16,25],[2,11],[5,10],[54,97],[5,8],[3,5],[0,3],[1,5],[3,5],[2,4],[2,3],[2,3],[1,2],[3,3],[3,1],[2,3],[19,27],[2,2],[20,28]],[[8031,2526],[7,-14],[3,-12],[9,-41],[6,-8]],[[8056,2451],[1,-11],[0,-2],[3,-13],[31,5],[30,7]],[[7613,2099],[-2,1],[-3,4]],[[7608,2104],[1,2],[27,24],[3,4],[1,2],[1,1],[1,5],[3,16],[2,10],[1,14],[1,4],[2,17],[2,10],[3,15]],[[7656,2228],[27,17],[15,10],[2,3],[6,10]],[[7706,2268],[17,-13]],[[7723,2255],[6,-5],[10,-8]],[[7739,2242],[11,-6],[1,-1],[1,-1],[1,-3],[13,-23],[6,-13]],[[7772,2195],[-3,-1],[-49,-33],[-3,-3],[-5,-4],[-27,-11],[-7,0],[-9,-3],[-18,-10],[-18,-12],[-17,-16],[-3,-3]],[[7790,2307],[-13,-23],[-8,7],[-23,-39],[-3,-6],[-3,-3],[-1,-1]],[[7723,2255],[6,10],[17,31],[18,31]],[[7764,2327],[9,-6],[9,-7],[8,-7]],[[7706,2268],[-4,2],[-6,5],[-2,2],[-6,5],[-9,7],[-9,6]],[[7670,2295],[24,41],[18,32],[17,-13],[9,-7],[9,-7]],[[7747,2341],[9,-7],[8,-7]],[[7794,2428],[-10,-18],[-5,-9],[-1,-1],[-4,-9]],[[7774,2391],[-10,-18],[-1,-3],[-4,-6],[-4,-8],[-8,-15]],[[7670,2295],[-7,4],[-5,3],[-11,8]],[[7647,2310],[-3,1],[-2,2]],[[7642,2313],[1,1],[45,42],[18,17]],[[7706,2373],[26,23],[5,4],[16,19],[18,21]],[[7771,2440],[5,-4],[10,-7],[8,-1]],[[7774,2391],[50,-38]],[[7824,2353],[13,-10],[-11,-18],[-13,10],[-5,-9],[-5,-8],[-8,-14],[-5,3]],[[7794,2428],[21,-17],[5,-3],[25,-19]],[[7845,2389],[-10,-18],[-6,-9],[-5,-9]],[[7845,2389],[20,-15],[8,-8],[20,-20],[6,-4]],[[7899,2342],[-2,-2],[-7,-11],[-1,-3],[-3,1],[-17,-31],[-19,-28],[-11,-12],[-32,-33],[-35,-27],[0,-1]],[[7845,2389],[11,18],[9,16],[-54,41],[4,8],[0,3],[5,9],[2,2],[4,9],[-17,12]],[[7809,2507],[12,19]],[[7821,2526],[18,-15],[9,8],[14,13],[4,3]],[[7866,2535],[9,-9],[-7,-11],[13,-18],[12,-12],[8,-2],[9,15]],[[7910,2498],[33,-26],[12,15],[11,16],[13,16]],[[7979,2519],[5,5],[3,4],[1,2],[8,10],[4,4],[11,12]],[[8022,2541],[-17,-23],[-4,-6],[-2,-2],[-8,-10],[-7,-10],[-8,-11],[-10,-19],[-2,-3],[-14,-24],[-32,-56],[-18,-32],[-1,-3]],[[7742,2464],[-14,13],[-14,14],[-9,9],[-20,19]],[[7685,2519],[6,8],[5,7]],[[7696,2534],[28,-27],[11,15],[11,15]],[[7746,2537],[17,24],[5,7]],[[7768,2568],[7,-6],[11,-8],[35,-28]],[[7809,2507],[-16,-13],[-13,-6],[-18,-11],[-20,-13]],[[7696,2534],[5,7],[3,5],[7,8],[6,7],[20,-16],[9,-8]],[[7685,2519],[-11,10]],[[7674,2529],[32,39],[43,49],[3,3],[2,2],[2,3],[7,8],[2,2],[2,2],[1,1],[25,27],[7,7],[11,-8],[5,-5],[4,-3]],[[7820,2656],[-11,-18],[-10,-18],[-5,-8],[-5,-9],[-10,-18],[-11,-17]],[[6826,3110],[-35,-67]],[[6791,3043],[-2,1],[-19,14]],[[6770,3058],[36,66]],[[6806,3124],[18,-13],[2,-1]],[[6770,3058],[-20,15],[-19,14]],[[6731,3087],[36,66]],[[6767,3153],[19,-14]],[[6786,3139],[20,-15]],[[6712,3101],[36,67]],[[6748,3168],[19,-15]],[[6731,3087],[-19,14]],[[6694,3114],[36,67]],[[6730,3181],[18,-13]],[[6712,3101],[-18,13]],[[6675,3128],[36,67]],[[6711,3195],[19,-14]],[[6694,3114],[-19,14]],[[6657,3142],[36,67]],[[6693,3209],[18,-14]],[[6675,3128],[-18,14]],[[6694,3301],[-8,-13],[-9,-8],[-23,-43]],[[6654,3237],[-34,-62],[19,-14],[-3,-4]],[[6636,3157],[-3,4],[-15,11],[-12,9],[-40,29],[-4,3]],[[6562,3213],[3,4],[0,1],[7,11],[5,5],[14,26],[19,36]],[[6676,3426],[1,-1],[2,-2],[3,-2],[11,-8],[9,-6],[18,-14]],[[6720,3393],[3,-2],[26,-20],[3,-2]],[[6747,3261],[-36,-66]],[[6693,3209],[-20,14],[-19,14]],[[6766,3248],[-36,-67]],[[6784,3234],[-36,-66]],[[6784,3234],[19,-14],[-36,-67]],[[6822,3206],[-36,-67]],[[6825,3313],[20,-15],[16,-12]],[[6842,3191],[-36,-67]],[[6863,3176],[-37,-66]],[[6844,3096],[-18,14]],[[6880,3163],[-36,-67]],[[6899,3150],[-36,-68]],[[6863,3082],[-19,14]],[[7981,3106],[-13,11],[-22,17],[-1,0],[-29,-19]],[[7931,3205],[3,5],[13,24],[15,25]],[[7962,3259],[14,23]],[[7976,3282],[14,24]],[[8063,3245],[-13,-23],[-14,-23],[-15,-25],[-13,-23],[-13,-21],[-14,-24]],[[7981,3106],[-16,-26]],[[8076,2997],[-2,2],[-3,2]],[[8071,3001],[-4,3],[-2,2],[-1,0],[-3,3],[-4,2],[-34,27]],[[8186,3142],[-4,-3],[-13,-17],[-1,-4],[-18,-22],[-11,-15]],[[8139,3081],[-19,-26],[-12,-16],[-2,-1],[-6,-10],[-6,-8],[-3,-4],[-15,-19]],[[8178,2916],[-11,10],[-45,34]],[[8122,2960],[15,26],[11,18],[11,19]],[[8159,3023],[21,-15],[17,-13],[-13,-24],[16,-12]],[[8200,2959],[-8,-16],[-14,-27]],[[8129,2916],[-23,16]],[[8106,2932],[16,28]],[[8037,2814],[17,25],[13,24],[13,22]],[[8080,2885],[8,16],[4,7],[14,24]],[[8080,2885],[-18,14],[-7,5],[-16,13],[-14,12],[15,20]],[[8040,2949],[13,-10],[4,-3],[18,-14],[5,10],[3,6],[5,9],[3,-3],[15,-12]],[[7053,2576],[-3,1],[-2,1],[-72,54],[-7,5]],[[6987,2670],[78,-58],[3,-3],[2,-2]],[[6987,2670],[1,2],[4,-1],[18,34],[13,8]],[[6942,2703],[2,3],[9,18],[6,13],[1,5]],[[6960,2742],[6,13]],[[1046,2541],[-5,-4],[-22,-21],[-5,-5],[-14,-15],[-2,-2],[-2,-2],[-2,-3],[-6,-6],[2,-10]],[[990,2473],[-17,21],[-4,1],[-2,0],[-13,-4],[-10,-5],[-3,-12],[-4,-2],[-7,10],[-1,13],[-8,10],[-4,6],[-2,1],[-2,0],[-3,1],[-9,-3],[-7,-1],[-10,-7],[0,-8],[-2,0],[-7,0],[-4,-7],[-1,-5],[-2,-7],[-5,-8],[-5,-11],[-9,2],[-7,4],[-9,3],[-7,5],[-9,0],[-18,-4],[-5,-2],[-3,-5],[-13,-5],[-4,-1],[-7,1],[-6,3],[-3,0],[-5,-2],[-4,1],[-13,-4],[-17,0],[-13,-6],[-3,-3],[-20,-6],[1,-4],[0,-2],[-12,2],[-7,-3],[-22,10],[-3,4],[-1,7],[1,5],[0,10],[15,41],[10,21],[5,7],[5,10],[7,9],[6,4],[9,5],[9,3],[2,-2],[4,-8],[3,1],[5,-2],[6,-5],[1,0],[4,4],[9,3],[5,5],[8,5],[3,5],[2,10],[3,20],[0,5],[-1,10],[-1,6],[-2,3],[-7,10],[-9,4],[-12,-5],[-9,-5],[0,-3],[-6,-1],[-5,1],[-4,8],[5,5],[4,8],[3,9],[0,10],[-5,16],[-1,4],[-10,11],[-10,1],[-5,-1],[-2,-1],[-3,-6],[-4,-17],[-2,-2],[-15,-6],[-5,1],[-3,4],[0,7],[3,5],[-1,8],[0,4],[2,5],[2,2],[6,3],[18,-3],[5,-1],[9,2],[6,1],[2,27],[2,10],[0,12],[-3,15],[1,11],[4,19],[9,21],[2,8],[3,4],[2,11],[0,25],[0,5],[5,18],[3,0],[12,20],[7,9],[7,5],[10,12],[6,5],[2,7],[4,7],[9,16],[3,1],[1,1],[1,-1],[1,-7],[2,-3],[5,1],[16,27],[3,8],[3,8],[2,12],[4,3],[2,2],[4,1],[3,0],[17,1],[4,1],[6,4],[4,4],[2,4],[3,3],[3,0],[1,-6],[2,-6],[3,-4],[5,-2],[14,0],[7,2],[2,2],[3,1],[15,5],[13,9],[5,2],[19,-4],[14,0],[8,2],[5,7],[9,16],[10,15],[16,36],[7,18],[6,16],[7,19],[10,17],[1,1],[7,15],[5,16],[7,15],[4,7],[3,3],[11,4],[14,5],[10,9],[12,6],[27,8],[10,11],[7,7],[4,0],[8,0],[6,-4],[12,-2],[5,0],[5,-6],[3,-1],[6,-1],[6,2],[16,12],[5,8],[9,21],[4,15],[3,19],[4,15],[1,7]],[[1274,3378],[9,-11],[23,-32],[4,-5]],[[1310,3330],[-15,-33],[-2,-4],[-7,-11],[-3,-6],[-6,-10],[-6,-10],[-3,-4],[-3,-3],[-3,-2],[-2,-2],[-3,-3],[-5,-2],[-7,-5],[-20,-12],[-9,-6],[-3,-2],[-3,-1],[-3,-1],[-1,-1],[-4,-1],[-8,-2],[-10,-3],[-2,3],[-5,7],[-18,28],[-1,2],[-1,1],[-1,0],[-2,0],[-1,1],[-1,0],[-7,-2],[-8,-1],[-1,-1],[-1,-1],[0,-1],[0,-1],[0,-1],[0,-1],[1,-2],[14,-21],[9,-14],[2,-3],[-2,-1],[-2,-1],[-2,-2],[-3,-2],[-3,-3],[-6,-5],[-5,-5],[-5,-5],[-14,-15],[-7,-7],[-4,-4],[-5,-8],[-3,-3],[-10,-12],[-10,-11],[-12,-12],[-7,-8],[-7,-9],[-6,-10],[-6,-9],[-13,-18],[-11,-14],[-13,-19],[-3,-4],[-6,-6],[-5,-5],[-7,-6],[-5,-4],[-7,-4],[-9,-5],[-17,-10],[-9,-4],[-11,-5],[-7,-3],[-10,-5],[-10,-5],[-13,-6],[-7,-3],[-21,-10],[-18,-8],[-5,-4],[-4,-3],[-7,-6],[-9,-10],[-4,-4],[-2,-2],[-2,-4],[-1,-3],[5,-8],[7,-13],[10,-15],[6,-9],[14,-20],[9,-14],[10,-14],[12,-18],[16,-24],[20,-29],[11,-17],[35,-46],[13,-17],[11,-13],[7,-11],[18,-26],[28,-40],[8,-12]],[[2002,2744],[4,-14],[4,3],[8,3],[8,-2],[7,-7],[0,-13],[-3,-10],[-12,-21],[0,-5],[1,-4],[3,-1],[2,3],[3,-1],[1,-5],[-8,-16],[-4,-1],[-4,1],[-10,-2],[-10,0],[-9,-8],[-2,4],[-6,12],[1,40],[1,10],[2,8],[4,10],[7,10],[5,7],[7,-1]],[[1961,2688],[-5,15],[1,6],[-4,1],[-2,2],[-2,1],[-1,1],[-1,2],[-4,4],[-2,4],[-2,2],[-2,3],[-3,5],[-3,4],[-1,2],[-2,2],[-2,2],[-3,3],[-2,2],[-7,8]],[[1914,2757],[7,7],[2,3],[8,8],[16,19]],[[1947,2794],[6,6]],[[1953,2800],[11,-16],[6,-9],[8,-8]],[[1978,2767],[-3,-10],[-3,-12],[0,-8],[0,-7],[-3,-6],[-8,-10],[-2,-9],[3,-10],[-1,-7]],[[6932,3124],[-36,-67]],[[6896,3057],[-4,3],[-29,22]],[[6860,2991],[-4,3],[-29,22]],[[6827,3016],[36,66]],[[6896,3057],[-5,-9],[-4,-8],[-5,-9],[-4,-7],[-5,-9],[-4,-8],[-4,-7],[-5,-9]],[[6932,3124],[24,-17]],[[6956,3107],[-36,-67]],[[6920,3040],[-24,17]],[[6941,3024],[-21,16]],[[6956,3107],[21,-15]],[[6977,3092],[-36,-68]],[[6978,2997],[-19,14],[-18,13]],[[6977,3092],[19,-15]],[[6996,3077],[19,-13],[-37,-67]],[[6996,3077],[40,76]],[[7036,3153],[19,-14]],[[7055,3139],[33,-24]],[[7088,3115],[-40,-75],[-26,-48],[-16,12],[-11,-19],[-17,12]],[[6956,3107],[40,76]],[[6996,3183],[22,-16],[18,-14]],[[6973,3200],[23,-17]],[[7050,3177],[-14,-24]],[[6987,3224],[63,-47]],[[7072,3220],[-22,-43]],[[7068,3164],[-13,-25]],[[7072,3220],[18,-15]],[[7090,3205],[-22,-41]],[[7105,3190],[-21,-38],[-16,12]],[[7119,3092],[-31,23]],[[7152,3149],[-8,-15],[-11,-18],[-14,-24]],[[7145,3082],[-3,1],[-3,1],[-7,2],[-13,6]],[[7169,3135],[3,-2],[9,-7]],[[7181,3126],[-18,-32],[12,-10]],[[7175,3084],[-10,-3],[-11,-1],[-2,0],[-7,2]],[[7181,3126],[18,-16],[19,-16]],[[7218,3094],[-12,0],[-15,-3],[-16,-7]],[[8079,2128],[-2,-39]],[[8077,2089],[-22,1],[-22,2]],[[8033,2092],[-21,2],[-22,1]],[[7990,2095],[-21,1],[-21,2],[-5,-70]],[[7943,2028],[-21,2],[-6,0]],[[7916,2030],[0,5],[4,65],[5,29],[2,6]],[[7908,2031],[-6,1]],[[7919,2136],[-2,-6],[-5,-25],[-2,-28],[-3,-38],[1,-4],[0,-4]],[[7990,2095],[-3,-70]],[[7987,2025],[-23,1],[-21,2]],[[7902,2032],[0,-18],[0,-12],[5,-30]],[[7997,1801],[-66,6],[-4,4],[0,8],[-11,0]],[[7916,1819],[5,34],[3,47],[-2,10],[0,1]],[[7922,1911],[17,0],[63,-5]],[[8002,1906],[-1,-27],[-1,-19]],[[8000,1860],[-1,-19]],[[7999,1841],[-2,-19]],[[7997,1822],[0,-21]],[[7906,1819],[-4,0]],[[7912,1912],[1,0]],[[7913,1912],[0,-3],[0,-2],[-3,-57],[-4,-31]],[[7997,1801],[-2,-23]],[[7995,1778],[0,-9],[-1,-18]],[[7994,1751],[-1,-9]],[[7993,1742],[-86,6],[-12,4]],[[7895,1752],[2,5],[5,12],[13,48],[1,2]],[[7886,1756],[-3,1]],[[7906,1819],[-1,-2],[-13,-47],[-6,-14]],[[2358,2080],[-34,-33],[-17,-16],[-30,-30],[2,-10],[0,-1],[-18,-17],[-20,-19],[-7,-7],[-18,-17],[-8,-8]],[[2208,1922],[-3,6],[-3,4],[-7,14],[-2,2],[-3,6],[-8,10]],[[2182,1964],[29,30],[56,50],[38,47],[14,25],[59,80]],[[2378,2196],[13,17]],[[2391,2213],[3,-3],[4,-4],[9,-9],[2,-1],[29,-40],[-15,-14],[-45,-44],[-1,0],[-1,0],[-1,0],[-1,0],[0,1],[-3,4],[-9,-5],[-10,-10],[6,-8]],[[2182,1964],[-4,4],[-2,3],[-5,6],[-9,9],[-12,10]],[[2150,1996],[5,5],[25,27]],[[2180,2028],[23,20],[14,14],[13,15],[7,10],[12,18],[4,8],[5,14],[9,27]],[[2267,2154],[17,-12]],[[2284,2142],[19,-15],[5,-5],[15,19],[13,17],[35,45],[7,-7]],[[3488,1518],[22,10],[19,8],[19,7],[20,7],[20,8],[13,6],[20,5]],[[3621,1569],[34,8],[36,8]],[[3693,1577],[-11,-2],[-2,-2],[-27,-5],[-34,-8],[-39,-12],[-36,-13],[-49,-20],[-4,-2],[-33,-16],[-4,-2],[-29,-15],[-30,-15],[-37,-20],[-1,-1],[-35,-15],[-17,-10],[-31,-15],[-26,-13],[-29,-15],[-4,-1]],[[3215,1375],[-3,-2]],[[3212,1373],[-2,7],[-17,67]],[[3193,1447],[-13,53],[-17,66]],[[3163,1566],[4,1]],[[3167,1567],[7,2],[3,0],[7,2],[6,3],[14,12],[41,34],[9,8],[0,14],[0,10]],[[3254,1652],[88,75]],[[3342,1727],[28,23],[26,22],[26,21]],[[3422,1793],[1,-5],[24,-100],[22,-89]],[[3469,1599],[-11,-4],[-2,-1],[-2,-2],[-1,-2],[-1,-3],[-4,-6],[-22,-13],[-2,-4],[-6,-4],[-28,-14],[-6,-3],[-6,-5],[-9,-8],[-2,-3],[5,-15],[4,-19],[1,-1],[2,-1],[1,0],[32,17],[9,-23],[3,2],[41,21],[9,4],[14,6]],[[3469,1599],[19,-81]],[[2331,3626],[5,-20],[-14,-7],[-13,-13],[-12,-8],[-9,-3],[-1,-4],[15,-24],[-4,-13]],[[2298,3534],[-7,11],[-6,9],[-1,0],[-1,0],[-1,-1],[-11,-10],[-12,-11],[-2,-2],[-8,-6],[-11,-9],[-6,-2],[-10,15],[-17,27],[2,11],[-1,12],[-1,10],[-5,4],[-2,1],[-12,3],[-11,-5],[-17,-20],[-1,-4],[-17,-11],[-19,-9],[-21,-7],[-8,-4],[-8,-5],[-5,-6],[-1,-5],[0,-6],[1,-11],[1,-8],[0,-1],[0,-2],[1,-3],[0,-2],[1,-4],[2,-3],[2,-4],[3,-4],[5,-3],[6,-3],[3,-1],[4,0],[7,0],[8,1],[10,0],[6,1],[17,-1],[4,0]],[[2159,3466],[-1,-8],[-1,-8],[-1,-10],[-1,-4],[-3,-5],[-2,-2],[-10,-10],[-19,-18],[-13,-12],[-10,-9],[-7,-6],[-1,-1],[-1,-2],[0,-1],[0,-1],[0,-1],[1,0],[14,-20]],[[2104,3348],[-28,0],[-19,-2],[-6,-23],[4,-6],[15,-9],[0,-20],[27,-42],[-17,-41],[-12,-35],[8,-27]],[[2076,3143],[-30,18],[1,1],[5,14],[3,6],[-25,14],[-6,3],[-4,2],[-3,1],[-3,1],[-2,0],[-2,0],[-3,0],[-19,-2]],[[1988,3201],[0,2],[-1,4],[0,13],[0,15],[-1,19],[-2,0],[-1,0],[0,1],[-1,1],[0,1],[0,1],[0,1],[1,0],[3,38],[6,14],[4,11],[-45,71],[-204,386]],[[1747,3779],[3,2],[3,1],[3,2],[17,12],[17,12],[14,9],[2,1],[3,3],[3,1],[2,2],[3,3],[2,2],[6,5],[22,21],[7,7],[3,2],[2,3],[4,2],[3,3],[7,6],[6,4],[10,6],[9,5],[2,1],[4,2],[3,2],[3,0],[4,1],[9,-1],[5,0],[8,0],[5,1],[23,-1],[0,-8],[1,-12],[0,-3],[1,-2],[1,-3],[18,-27],[11,-16],[6,-9],[4,-6],[19,-28],[1,-2],[1,0],[1,0],[1,-1],[2,0],[1,1],[1,1],[12,12],[16,14],[11,9],[6,6],[9,9],[6,6],[-2,3],[-6,9],[-3,4],[-3,4],[-5,7],[-2,5],[-1,1],[0,1],[-1,2],[-1,3],[-2,8],[-1,5],[6,-2],[8,-2],[10,-3],[5,-2],[5,-1],[2,-4],[5,-9],[4,-7],[6,-8],[5,-7],[4,-6],[14,-21],[4,-6],[6,-10],[5,-6],[12,12],[13,13],[8,7],[13,-20],[7,-11],[7,-9],[13,-18],[12,-17],[2,-2],[14,-17],[12,-19],[26,-37],[9,-12],[14,-20],[14,-21]],[[2298,3534],[5,-6],[9,-14],[5,-6],[3,-4],[3,-2],[6,-6],[-2,-3],[-2,-7],[-2,-4],[-3,-6],[-2,-5],[-2,-6],[-7,-15],[-1,-3],[-1,-3],[-1,-2],[-1,-3],[-2,-7],[0,-3],[-1,-1],[-1,-7],[0,-8],[-1,-4],[-1,-17],[-1,-6],[-1,-3],[-1,-3],[-1,-2],[-1,-2],[-2,-4],[-3,-3],[-5,-4],[-18,-10],[-1,-1],[-1,-1],[-2,-1],[-2,-2],[-2,-2],[-2,-2],[-1,-2],[-1,-2],[0,-2],[-1,-1],[0,-2],[-1,-3],[-1,-8],[0,-6]],[[2251,3320],[-7,0],[-2,0],[-1,0],[-2,1],[-1,1],[-1,1],[-11,16],[-2,3],[-2,1],[-3,3],[-4,3]],[[2215,3349],[2,5],[4,8],[4,6],[1,2],[1,1],[1,3],[10,10],[8,9],[-37,54],[-6,7],[-2,2],[-2,2],[-2,1],[-2,1],[-1,0],[-3,1],[-6,1],[-24,3],[-2,1]],[[2164,3320],[0,-1],[13,-20],[-8,-9],[-6,-6],[-9,-9],[-6,-6],[2,-10],[-8,-12],[-10,-14],[-2,-3],[8,-11],[11,4],[12,-6]],[[2161,3217],[-4,-10],[-1,-2],[0,-2],[-2,-5],[0,-1],[-1,-3],[0,-2],[-1,-7],[0,-4],[-1,-5],[-4,-9],[-3,-5],[-3,-5]],[[2141,3157],[-4,3],[-1,0],[-1,1],[-1,0],[-2,1],[-1,0],[-2,0],[-2,0],[-3,0],[-3,-1],[-2,0],[-2,-1],[-3,-2],[-1,-1],[-1,-1],[-1,-1],[0,-1],[-1,-1],[-1,-3],[-2,-3],[-4,-10],[-3,-7]],[[2100,3130],[-24,13]],[[2104,3348],[15,14],[7,-11],[1,-1],[2,-1],[24,-3],[-1,-6],[-2,-18],[14,-2]],[[2259,3137],[-6,-14],[-4,-8],[-9,-13],[-9,-12],[-8,-14],[-3,-3],[-3,-5],[-1,-3],[-4,-5],[-4,-6],[-9,-12],[-7,-7],[-6,-9],[-3,-2],[-5,-7]],[[2178,3017],[-10,14],[-12,18],[-14,20],[4,3],[5,6],[10,10],[5,7],[6,6],[4,4],[-9,13],[-4,5],[-5,9],[-7,9],[-5,7],[-1,1],[-4,8]],[[2161,3217],[10,-4],[3,-4],[2,-2],[0,-1],[0,-1],[-5,-14],[0,-1],[11,-16],[7,-10],[2,-2],[7,-4],[2,3],[1,2],[2,2],[1,2],[3,2],[1,1],[2,1],[2,1],[2,0],[3,1],[3,-1],[2,0],[2,0],[3,-1],[1,-1],[2,-1],[2,-2],[1,0],[1,-1],[1,-1],[1,-1],[2,-5],[1,-2],[5,-8],[2,-3],[4,-3],[9,-6]],[[2139,2977],[-3,5],[-12,16],[-7,-7],[-1,-1],[-3,-5],[-2,-3],[-1,-2],[-2,0],[-1,-1],[0,-1],[-1,0],[-1,0],[-1,0],[-1,0],[-1,0],[-2,0],[-1,0],[-2,0],[0,1],[-2,1],[-6,8],[-3,5],[-4,9],[-2,2],[-2,2],[-1,1],[0,1],[-1,0],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[1,0],[0,1],[4,3],[10,8],[-3,7],[0,2],[-1,4],[-1,7],[-2,21],[-1,6],[0,4],[1,6],[0,4],[1,3],[1,5],[1,4],[1,3],[4,8],[4,11],[4,9]],[[2178,3017],[-7,-7],[-5,-6],[-10,-9],[-10,-11],[-7,-7]],[[2139,2977],[-10,-11],[-6,-6],[-8,-8],[-12,-13],[-7,-7]],[[2096,2932],[-6,8],[-8,11],[-18,26],[-12,-10],[-7,-5],[-8,-7],[-7,-8],[-24,35],[-14,20],[-1,1],[-1,0],[-1,0],[-1,-1],[-13,-12],[-13,19]],[[1962,3009],[12,11],[2,2],[12,11],[2,2],[1,1],[2,2],[3,3],[7,6],[8,8],[6,5],[4,4],[8,8],[8,7],[10,12],[1,2],[2,2],[1,2],[2,3],[9,14],[2,3],[2,4],[5,11],[4,9],[1,2]],[[1767,3047],[13,-17],[14,-21],[6,-9],[7,-9],[6,-8],[15,-22],[27,-39],[7,-9]],[[1862,2913],[29,-40],[11,-15],[45,-64]],[[1914,2757],[-3,-4],[-9,-9],[-5,-7],[-3,-2],[-7,-7],[-6,-4],[-17,-15],[23,-33],[13,-19],[3,-3],[31,-45],[1,-1],[0,-1],[0,-2],[-1,-1],[-13,-12],[-18,26],[-5,6],[-18,26],[-15,21],[-16,23],[-10,-11],[-3,-3],[-4,-6],[-4,-6],[-4,-7],[-5,-8],[-6,-11],[-4,-8],[-2,-3],[6,-7],[47,-67],[0,-2],[0,-1],[-17,-15],[-53,77],[-18,-15],[38,-53],[-15,-14],[-39,56],[-21,-15],[-10,-7],[-8,-6],[-13,-7],[-16,-8],[-14,-6],[-12,-5],[-15,-7],[-24,-10],[-14,-6],[-36,-17],[-55,-26],[-13,-5],[-9,-3],[-12,-3],[-23,-6],[-30,-7],[-10,-2],[-5,-2],[-9,-3],[-9,-3],[-6,-2],[-4,-2],[-8,-4],[-7,-3],[-5,-3],[-4,-3],[-6,-4],[-6,-4],[-12,-8],[-10,-8],[-7,-4],[-6,-3],[-10,-3],[-5,-2],[-11,-3],[-8,-2],[-7,-2],[-7,0],[-25,0],[-8,-1],[-6,0],[-6,-2],[-5,-2],[-5,-3],[-6,-3],[-7,-5],[-4,-3],[-5,-1],[-4,0],[-4,0],[-6,2],[-5,3],[-4,3],[-11,15],[-21,31],[-39,56],[-16,23],[-31,45],[-5,7]],[[1310,3330],[17,-21],[-20,-25],[12,-29],[162,112],[15,56]],[[1496,3423],[20,-29],[13,-20],[25,-35],[17,-25],[12,-16],[18,-24],[20,-24],[16,-19],[8,-10],[1,-2],[7,-8],[7,-10],[8,-11],[5,-8],[10,-13],[17,-25],[7,-11],[24,-34],[12,-17],[20,-28],[4,-7]],[[7277,1135],[-14,4],[-14,4],[-19,6]],[[7204,1258],[16,18],[0,2],[-1,2],[-11,14],[0,3],[1,3],[11,11],[12,13],[1,1],[8,8],[32,34]],[[7273,1367],[27,-22],[2,-1],[2,0],[1,2],[2,6],[2,10],[6,13],[7,13],[5,9],[4,7],[1,2],[0,1],[-2,4],[-12,12],[-7,6],[-7,6],[-5,5],[-7,5],[-7,7]],[[7399,1492],[-3,-4],[-26,-40],[-50,-76],[-6,-15],[-12,-33],[-14,-54],[-5,-31],[14,-5]],[[6562,3213],[-1,-3],[-3,-5],[-4,-10],[-3,-7],[-19,-35],[-6,-8],[-3,-4],[-28,-37],[-20,-26],[-2,-5],[-6,-7],[-4,-6],[2,-3],[9,-9],[8,-7],[9,-8],[7,-5],[13,-10],[5,-3],[4,-3],[13,-9],[18,-13],[16,-10]],[[6560,2974],[-45,30],[-1,1],[-3,1],[-38,-72]],[[6473,2934],[-43,-74],[-14,-32],[-9,-29],[-5,-23],[-1,-13],[-1,-7],[-1,-26],[0,-3]],[[6399,2727],[2,-134],[0,-2],[0,-4],[0,-4],[0,-2],[0,-2],[0,-3],[0,-3],[0,-2],[0,-2],[0,-4],[0,-11]],[[6401,2554],[-4,3],[-3,2],[-31,22]],[[6363,2581],[-56,44],[-21,-35],[-30,22],[-21,14]],[[5965,2635],[6,39],[1,7],[5,29]],[[5977,2710],[42,255],[57,-64],[58,-57],[23,-33],[12,-14],[1,-2],[2,-2],[1,-1],[2,-2],[1,-1],[2,-2],[1,-2],[2,-2],[2,2],[1,2],[2,2],[1,2],[2,1],[1,1],[1,2],[7,8],[31,36],[5,5],[28,37],[8,10],[2,2],[11,14],[6,8],[9,11],[38,49],[35,45],[28,37],[-16,17]],[[6383,3074],[2,3],[22,28],[2,3],[3,4],[3,4],[14,19],[17,22]],[[6446,3157],[7,8],[33,43],[3,4],[3,4],[2,3],[2,1],[8,6],[13,5],[9,3],[4,1],[3,1],[3,-1],[2,-1],[-5,33],[-1,3],[-20,-5]],[[6512,3265],[-4,19],[-3,21],[-4,20],[-4,21],[-3,20],[-2,9],[-6,4],[-4,7]],[[9002,6235],[-3,-11],[-1,-5],[-2,-3],[-1,-4],[-1,-13],[1,-44],[-1,-29],[-1,-12],[-4,-16],[-5,-16],[-5,-12],[-5,-9],[-6,-9],[-8,-9],[-9,-9],[-13,-13],[-6,-4],[-12,-19]],[[8784,6337],[12,-4],[11,-3],[3,-1],[8,-3],[13,-4],[6,-2],[46,-14],[8,-3],[14,-4],[2,-1],[3,-1],[3,-1],[6,-2],[9,-3],[7,-3],[3,-2],[3,-1],[3,-2],[3,-2],[3,-1],[2,-2],[1,0],[12,-9],[6,-4],[5,-4],[3,-2],[4,-4],[12,-11],[7,-8],[0,-1]],[[6122,3588],[-8,6]],[[6114,3594],[-25,21],[-13,12],[-66,68]],[[6010,3695],[-21,22],[-4,4],[-15,15],[-3,3]],[[5967,3739],[6,8],[6,8],[9,-9],[9,-10],[9,8],[-9,12],[2,3],[30,36],[4,7],[3,15],[2,12],[0,12],[-1,12],[-4,11],[-15,19],[-9,10]],[[6009,3893],[27,33],[10,14],[2,3]],[[6048,3943],[9,-9],[5,-5],[10,-8],[8,-4],[7,-3]],[[6087,3914],[25,-1],[41,0]],[[6153,3913],[0,-4],[0,-15],[1,-36],[-1,-52],[-1,-27],[-2,-13],[-3,-28],[-5,-34],[-17,-99],[0,-6],[-1,-4],[-2,-7]],[[5910,3161],[-16,-2],[-30,-41],[-9,9],[15,19],[-14,15]],[[5856,3161],[29,37],[-1,4],[-11,12],[-3,0],[-14,-19],[-14,15]],[[5842,3210],[21,28],[8,10],[2,3]],[[5873,3251],[30,-32],[14,-14]],[[5917,3205],[-2,-3],[-13,-15],[10,-11],[-2,-15]],[[5778,3715],[-40,42],[-15,17]],[[5723,3774],[27,36],[15,17]],[[5765,3827],[55,-58]],[[5820,3769],[-13,-18],[-14,-18],[-15,-18]],[[2096,2932],[-6,-8],[-9,-9],[-2,-1],[-8,-8],[-7,-5],[-2,0],[-9,-4],[-12,-6]],[[2041,2891],[-9,-5],[-7,-5],[-8,-6],[-6,-7]],[[2011,2868],[-20,25],[-44,64],[-1,0],[-1,1],[-1,0],[-1,0],[-13,-12],[-13,19]],[[1917,2965],[20,21],[9,7]],[[1946,2993],[16,16]],[[2011,2868],[-7,-9],[-5,-6],[-2,-2]],[[1997,2851],[-9,-11],[-7,-7],[-18,-21],[-10,-12]],[[1862,2913],[8,8],[1,1],[23,22]],[[1894,2944],[8,8],[15,13]],[[2041,2891],[25,-34],[12,-18],[9,-11],[10,-8],[-7,-12],[-2,-3],[-4,-6],[-1,-4],[-1,-2],[-1,-2],[-1,-2],[-3,-4],[-3,-3],[-1,-1],[-1,0],[-1,1],[-1,1],[-6,5],[-10,1],[-12,2],[-1,0],[-1,1],[-1,1],[-30,42],[-9,12],[-3,4]],[[2096,2932],[8,-10],[45,-67],[2,-2]],[[2151,2853],[-3,-2],[-2,0],[-2,0],[-2,-1],[-10,-7],[-7,-8],[-8,-8],[-7,-7],[-1,-6],[-2,-4],[-4,-4],[-4,-11],[-13,-18],[-2,-7],[-6,-4],[-7,-4],[-9,13],[-21,6],[-7,-1],[-7,2],[-6,6],[-6,1],[-9,-3],[-4,8],[-3,1],[-4,-3],[-5,-11],[-3,-4],[-6,-5],[-3,-4],[0,-1]],[[1961,2688],[1,-8],[0,-21],[-3,-22],[-6,-8],[-6,-16],[-7,-4],[-1,-5],[-4,-11],[-5,-2],[-6,-6],[-5,0],[-9,-8],[-8,-8],[-6,-9],[-6,-10],[-4,-5],[-15,-2],[-9,-8],[-8,-10],[-6,-6],[-4,-5],[-17,-20],[-11,-14],[-13,-12],[-4,-3],[-6,-7],[-5,-7],[-3,-7],[-8,-11],[-2,-7],[-3,-5],[-6,-6],[-3,-4],[-1,-1],[-7,-15],[-2,-8],[-8,-24],[0,-9],[-4,-4],[-12,-10],[-5,-7],[-3,-2],[-6,-1],[-2,-1],[-2,-6],[-1,-3],[0,-3],[-2,-3],[-8,-7],[-6,-1],[-1,-1],[-3,-3],[-5,-2],[-12,2],[-12,3],[-8,4],[-6,4],[-10,1],[-13,4],[-5,-3],[-8,0],[-7,4],[-6,-3],[-7,-1],[-7,2],[-6,-5],[-17,0],[-6,2],[-2,-1],[-10,6],[-5,-1],[-5,-4],[-9,-11],[-10,-7],[-6,-2],[-4,-2],[-3,-4],[-1,-5],[-5,-13],[0,-2],[0,-2],[1,-2],[3,0],[1,2],[3,1],[2,-1],[4,-9],[10,-1],[7,-1],[7,5],[5,-13],[3,-4],[0,-2],[1,-2],[4,-2],[3,-4],[0,-5],[-3,-3],[-4,0],[-4,-2],[-4,-6],[-4,-7],[-5,-6],[-9,-9],[-7,-11],[-4,-3],[-5,-2],[-4,-4],[-7,-1],[-6,4],[-5,11],[0,5],[-2,5],[-5,6],[-10,8],[-5,8],[-8,9],[-8,5],[-5,0],[-6,-1],[-8,-2],[-19,0],[-6,-1],[-6,-3],[-14,-1],[-17,1],[-4,-4],[-8,-2],[-6,-4],[-8,0],[-7,-4],[-16,-14],[-4,-1],[-2,3],[-5,-1],[-2,-3],[-3,-3],[-5,0],[-3,-3],[-2,-3],[-5,-4],[-15,0],[-13,-4],[-6,0],[8,9],[7,4],[6,5],[4,6],[5,8],[3,7],[-2,10],[-9,1],[-10,-1],[-6,1],[-4,3],[-2,6],[-4,5],[-18,8],[-7,5],[-2,1],[-4,6],[-2,4],[-4,4],[-6,1],[-15,0],[-1,5],[-4,-5],[-4,1],[-4,-2],[-1,0],[-1,15],[-4,10],[-6,7],[-8,20],[-2,9],[-3,13],[-2,4],[-1,3],[-1,1],[-6,17],[-4,5],[-4,1],[-5,-3],[-3,3],[-7,3],[-15,-2],[-5,4],[-9,12],[-1,3],[-1,12],[-14,27],[-5,10],[-6,9],[-12,22],[-1,1],[-2,1],[-5,7],[-8,9],[-6,0],[-9,-3],[-6,-7],[-7,-5],[-6,-9],[-4,1]],[[1767,3047],[14,14],[2,1],[1,0],[1,0],[1,-1],[12,-16],[16,14],[-16,21],[-1,3],[0,3],[3,4],[2,4],[2,3],[3,7],[9,22]],[[1816,3126],[17,-22],[27,-38]],[[1860,3066],[6,-8],[1,-2],[2,-2],[1,-5],[3,-13],[1,-5],[1,-5],[0,-9],[-3,-22],[0,-10],[1,-4],[1,-4],[1,-4],[3,-6],[13,-19],[3,-4]],[[1860,3066],[5,4],[5,5],[3,5],[1,3],[0,3],[1,2],[26,26],[7,8],[1,1]],[[1909,3123],[1,-1],[29,-42],[15,-21],[1,-2],[0,-1],[1,-1],[-1,-1],[-7,-7],[-7,-6],[5,-6],[0,-1],[0,-1],[1,-1],[-1,-1],[-16,-16],[1,0],[11,-17],[4,-5]],[[1816,3126],[5,12],[3,7],[0,5],[1,4],[5,12],[3,8],[3,5],[2,4],[3,3],[4,2],[16,8],[4,2],[3,2],[2,0],[3,1],[4,0],[4,0],[13,0],[7,0],[5,0],[8,0],[20,0],[20,-1],[-1,-14],[1,-9],[0,-1],[0,-2]],[[1954,3174],[1,-7],[0,-9],[1,-3],[-15,-2],[-1,0],[-1,0],[-11,-11],[-19,-19]],[[1954,3174],[34,4],[0,16],[0,7]],[[1496,3423],[-14,19],[-11,16],[-12,17],[-1,3],[-3,6],[3,1],[4,2],[3,2],[5,5],[9,9],[5,5],[8,9],[2,2],[9,10],[5,5],[7,8],[5,5],[-51,82]],[[1469,3629],[0,5],[11,28],[3,28],[1,26],[-1,11],[-7,18],[-3,15],[2,3],[7,1],[11,0],[5,2],[5,18],[0,5],[-13,8],[-5,5],[-5,7],[1,7],[5,4],[3,2],[18,0],[17,-7],[10,-7],[5,-5],[4,-5],[10,-10],[7,-5],[15,0],[8,4],[6,6],[0,4],[-4,4],[6,7],[2,4],[5,6],[2,2],[14,8],[6,-5],[3,-1],[3,2],[2,3],[0,4],[3,1],[2,-2],[4,0],[3,5],[7,2],[4,-2],[7,4],[9,3],[11,12],[13,10],[2,1]],[[1693,3865],[4,-9],[51,-66],[-1,-11]],[[8210,3953],[-7,6],[-11,12],[-1,2]],[[8191,3973],[-3,3],[-43,32]],[[8145,4008],[-42,31]],[[8103,4039],[-28,22]],[[8075,4061],[-30,22],[-3,3],[0,2],[0,1],[-1,2],[-6,4]],[[8035,4095],[5,3],[12,22]],[[8052,4120],[11,18],[10,17],[9,15]],[[8082,4170],[11,19]],[[8093,4189],[13,22],[12,22]],[[8118,4233],[14,24]],[[8132,4257],[28,-21],[14,-11]],[[8174,4225],[12,-10],[7,-5],[18,-14],[32,-25]],[[8243,4171],[-6,-31],[-10,-55]],[[8227,4085],[-5,-24],[-5,-27]],[[8217,4034],[-4,-25],[-2,-16]],[[8211,3993],[0,-19],[-1,-21]],[[9697,9303],[30,-11]],[[9727,9292],[0,-2],[0,-2],[-2,-2],[0,-12],[-3,-8],[0,-10],[0,-4],[0,-7],[-1,-6],[-1,-19],[-1,-24],[-1,-4],[3,-11],[1,-2],[-2,-14],[-2,-9],[-2,-6],[0,-8],[-2,-10],[-2,-8],[-7,-33],[0,-25],[1,-4],[1,-8],[-1,-9],[-3,-5],[-2,-19],[0,-4],[-1,-2],[-2,-7],[-2,-35],[-2,-4],[-1,-7],[0,-1],[3,-11],[-2,-16],[0,-5],[1,-9],[-3,-13],[0,-6],[2,-2],[1,-8],[0,-1]],[[9695,8890],[-13,7]],[[9682,8897],[1,26],[-38,11],[4,25],[4,24],[3,21],[4,28],[1,11],[1,6],[1,11],[2,22],[-2,2],[-11,1],[-1,1],[-1,2],[1,5],[1,2],[2,1],[13,-3],[3,22],[1,8],[2,22],[2,20],[1,10],[2,14],[19,114]],[[7572,5225],[-40,29],[-8,1],[-3,18]],[[7521,5273],[10,7]],[[7531,5280],[50,-37]],[[7531,5280],[14,13],[4,21]],[[7549,5314],[51,-37]],[[7549,5314],[1,13],[16,5],[1,8],[13,25]],[[7580,5365],[30,-22],[18,-13]],[[7521,5273],[-11,1],[-19,4]],[[7500,5379],[6,6],[14,24]],[[7520,5409],[15,-10],[-20,-39],[18,-4],[17,31],[15,-11],[15,-11]],[[7520,5409],[9,17],[9,18],[5,11],[4,6]],[[7547,5461],[9,-6],[51,-38]],[[7607,5417],[-9,-17],[-9,-18],[-9,-17]],[[8249,2119],[-34,10],[-10,-3],[2,-12],[14,-36]],[[8221,2078],[-14,1],[-22,2]],[[8252,2006],[-22,49],[-9,23]],[[8252,2006],[-32,2],[-17,2],[-22,0]],[[8180,1982],[-87,6]],[[8093,1988],[2,29]],[[8095,2017],[22,-2],[21,-1]],[[8178,1952],[-86,6]],[[8092,1958],[1,30]],[[8176,1923],[-86,6]],[[8090,1929],[2,29]],[[8175,1894],[-87,6]],[[8088,1900],[2,29]],[[9146,6516],[-7,-25]],[[9139,6491],[-5,2]],[[9134,6493],[-10,5],[-25,12],[-8,4]],[[9091,6514],[9,25],[9,26],[8,23]],[[9168,6589],[-6,-22],[-16,-51]],[[9199,6490],[-38,19],[-9,5],[-6,2]],[[9196,6434],[-10,5],[-17,9],[-24,11],[-9,5],[-4,3]],[[9132,6467],[7,24]],[[9214,6482],[-9,-24],[-9,-24]],[[9293,6387],[-13,6],[-5,2],[-3,2],[-8,4]],[[9264,6401],[-9,4],[-10,5],[-3,1],[-7,4],[-9,5]],[[9226,6420],[-20,9],[-2,1]],[[9204,6430],[-8,4]],[[9288,6418],[2,-15],[3,-16]],[[9226,6420],[-14,-38],[-7,-19],[-3,-9]],[[9202,6354],[-32,16],[-3,2]],[[9167,6372],[-5,2],[4,11],[5,15],[1,2],[5,16],[19,-10],[4,11],[4,11]],[[9240,6335],[-4,2],[-18,9],[-16,8]],[[9264,6401],[-21,-57],[-1,-2],[-1,-4],[-1,-3]],[[9161,6350],[6,22]],[[9240,6335],[-7,-21]],[[9233,6314],[-54,27],[-18,9]],[[7992,1720],[-98,7],[-5,-11],[-4,-14],[-5,-19]],[[7880,1683],[-4,-15]],[[7876,1668],[-5,-21],[-4,-20]],[[7867,1627],[-4,-22]],[[7863,1605],[-47,3],[-18,-23],[-13,-21]],[[7785,1564],[-21,-9]],[[7764,1555],[3,6],[14,24],[21,29],[17,18],[27,31],[15,24],[2,3],[18,31],[14,31]],[[7993,1742],[-1,-22]],[[7746,1548],[-6,-2]],[[7740,1546],[38,61],[17,21]],[[7795,1628],[20,23],[19,22],[16,22]],[[7850,1695],[12,20],[12,21],[9,21]],[[7886,1756],[-1,-3],[-8,-16],[-24,-43],[-1,-2],[-16,-21],[-22,-26],[-10,-11],[-19,-24],[-28,-43],[-11,-19]],[[7989,1676],[-109,7]],[[7992,1720],[-2,-25]],[[7990,1695],[-1,-19]],[[7989,1660],[-113,8]],[[7989,1676],[0,-16]],[[7987,1618],[-120,9]],[[7989,1660],[-1,-20]],[[7988,1640],[-1,-22]],[[7984,1571],[-126,9],[5,25]],[[7987,1618],[-2,-21]],[[7985,1597],[-1,-26]],[[7983,1547],[-2,-20]],[[7981,1527],[-97,15],[-11,2],[1,5],[-21,3]],[[7853,1552],[-35,6],[-33,6]],[[7984,1571],[-1,-24]],[[7981,1527],[-1,-23]],[[7980,1504],[-1,-19]],[[7979,1485],[-39,8],[-7,2],[-8,7],[-5,5],[-4,5]],[[7916,1512],[-68,12]],[[7848,1524],[4,24],[1,4]],[[7906,1461],[-67,19]],[[7839,1480],[5,22],[4,22]],[[7916,1512],[-5,-28],[-5,-23]],[[7979,1485],[-1,-21],[-1,-24]],[[7977,1440],[-71,21]],[[8056,1383],[-3,-5],[-9,-9]],[[8044,1369],[-1,-2],[-55,13],[-17,-19],[3,32]],[[7974,1393],[1,24],[-74,21]],[[7901,1438],[5,23]],[[7977,1440],[46,-13],[8,-9],[14,-34],[11,-1]],[[7828,1424],[3,10]],[[7831,1434],[65,-19],[5,23]],[[7974,1393],[-9,-9],[-137,40]],[[7831,1434],[4,23],[4,23]],[[8807,5880],[-19,10],[-7,-16],[-17,9],[-18,11],[-13,8],[-12,6]],[[8721,5908],[11,26],[8,20],[1,3]],[[8820,5914],[-2,-3],[-11,-31]],[[7222,2710],[8,8]],[[7230,2718],[91,-70],[3,-3],[12,24]],[[7230,2718],[18,18],[19,18],[5,6]],[[7184,2751],[12,21]],[[7196,2772],[14,24]],[[7210,2796],[12,-9],[13,22],[12,21],[6,13],[5,4],[5,2]],[[7210,2796],[6,11],[-62,47],[0,9],[4,16],[5,15]],[[7163,2894],[11,21],[21,39],[15,21],[3,5]],[[7106,2931],[16,-12],[2,2],[39,-27]],[[7196,2772],[0,9],[-144,113],[-3,13]],[[7049,2907],[15,-11],[22,-18],[14,42],[6,11]],[[7196,2772],[-7,3],[-151,113]],[[7038,2888],[11,19]],[[7027,2867],[11,21]],[[7049,2907],[23,42],[3,6]],[[7075,2955],[15,-12],[16,-12]],[[6924,2944],[-30,-55]],[[6894,2889],[-26,-48]],[[6868,2841],[-18,14],[-43,32]],[[6807,2887],[7,19],[17,30]],[[6831,2936],[16,31]],[[6847,2967],[45,-34],[13,25]],[[6905,2958],[19,-14]],[[6894,2889],[19,-14]],[[6913,2875],[-26,-48]],[[6887,2827],[-19,14]],[[6896,2789],[-10,-16],[-20,16],[-19,13]],[[6847,2802],[-33,25],[9,17],[-27,21]],[[6796,2865],[11,22]],[[6887,2827],[16,-12],[-2,-13]],[[6901,2802],[-5,-13]],[[6962,2839],[-31,-59],[-16,12],[-14,10]],[[6913,2875],[16,-12],[17,-12]],[[6960,2742],[-64,47]],[[6942,2703],[-2,2],[-7,5],[-57,42]],[[6836,2782],[2,3],[9,17]],[[6912,2646],[-3,2],[-63,47]],[[6895,2616],[-12,-23]],[[6883,2593],[-2,2],[-63,49]],[[6908,2558],[-31,24]],[[6883,2593],[31,-23],[-1,-4],[-5,-8]],[[6908,2558],[-6,-10],[21,-15]],[[6923,2533],[10,-7]],[[6933,2526],[-14,-4]],[[6919,2522],[-25,-8],[-22,-7]],[[6939,2583],[6,-4]],[[6945,2579],[-4,-8],[-10,-19],[1,-3],[-9,-16]],[[6945,2579],[15,-11],[32,-23]],[[6992,2545],[-20,-7],[-24,-9],[-15,-3]],[[7002,2547],[-10,-2]],[[6956,2615],[8,-6],[66,-50],[2,-1],[1,-2]],[[6993,2466],[-9,7],[-47,36]],[[6937,2509],[-18,13]],[[8173,1867],[-86,6]],[[8087,1873],[1,27]],[[8173,1847],[-87,7]],[[8086,1854],[1,19]],[[8171,1828],[-86,6]],[[8085,1834],[1,20]],[[8171,1809],[-87,6]],[[8084,1815],[1,19]],[[8169,1789],[-86,6]],[[8083,1795],[1,20]],[[8168,1766],[-86,6]],[[8082,1772],[1,23]],[[8166,1741],[-41,3],[-45,4]],[[8080,1748],[2,24]],[[8165,1709],[-86,5]],[[8079,1714],[1,29],[0,5]],[[8162,1665],[-86,6]],[[8076,1671],[1,17]],[[8077,1688],[2,26]],[[8160,1628],[-86,6]],[[8074,1634],[1,20]],[[8075,1654],[1,17]],[[8159,1606],[-86,6]],[[8073,1612],[1,22]],[[8175,1627],[-1,-21],[-15,0]],[[8071,1565],[1,25]],[[8072,1590],[1,22]],[[8159,1606],[-5,-21],[-6,-26],[-77,6]],[[8067,1512],[-86,15]],[[7983,1547],[86,-7],[2,25]],[[8209,1626],[-10,-23],[-17,-32],[-15,-19],[-23,-37],[-2,-12],[2,-3],[-6,-5]],[[8138,1495],[-15,5],[-31,9],[-25,3]],[[7984,1571],[87,-6]],[[7985,1597],[87,-7]],[[7988,1640],[86,-6]],[[7989,1660],[86,-6]],[[7990,1695],[87,-7]],[[7994,1751],[4,1],[38,-2],[44,-2]],[[7995,1778],[87,-6]],[[7997,1801],[86,-6]],[[7997,1822],[87,-7]],[[7999,1841],[86,-7]],[[8000,1860],[86,-6]],[[8002,1906],[86,-6]],[[8002,1906],[2,30],[1,29]],[[8005,1965],[76,-6],[11,-1]],[[8005,1965],[2,29]],[[8007,1994],[42,-2],[44,-4]],[[8007,1994],[0,18],[0,11]],[[8007,2023],[23,-1]],[[8030,2022],[21,-2],[22,-1]],[[8073,2019],[22,-2]],[[8030,2022],[3,70]],[[8077,2089],[-4,-70]],[[8007,2023],[-20,2]],[[7837,3125],[-26,-3],[-11,-1],[-11,3]],[[6962,4312],[1,-7],[-1,-4],[-1,-3],[-5,-12],[-8,-22]],[[6948,4264],[-62,30],[-7,-19]],[[6879,4275],[-58,28],[-5,2]],[[6816,4305],[0,5],[13,35],[1,3]],[[6830,4348],[3,0],[4,-2],[83,-21],[4,-2],[6,-2],[20,-6],[12,-3]],[[6923,5101],[-10,-19]],[[6913,5082],[-54,39],[-18,13],[-28,20]],[[6813,5154],[4,7],[25,46],[2,5],[5,9],[1,2],[1,2]],[[6851,5225],[46,-33]],[[6897,5192],[-2,-3],[-6,-9],[-2,-1],[-18,-34],[0,-2],[0,-2],[14,-10],[24,-17],[16,-13]],[[6136,4314],[-12,5],[-4,2],[-5,1],[-5,2],[-4,1],[-5,1],[-5,1],[-4,1],[-6,1],[-6,1],[-3,0],[-4,1],[-5,0],[-7,1],[-5,0],[-4,0],[-5,0],[-3,0],[-3,-1],[-5,-2],[-11,-1],[-5,-1],[-4,0],[-5,-1],[-6,-1],[-6,-2],[-3,-1],[-4,-1],[-4,-1],[-4,-2],[-5,-1],[-5,-2],[-14,-6],[-28,-10],[-3,-1],[-40,-16],[-11,-4],[-7,-3],[-5,-2]],[[6062,4383],[5,-21],[-16,-22],[5,-2],[5,-1],[19,-2],[8,-1],[9,-2],[12,-4],[27,-14]],[[5312,4075],[-13,-17]],[[5299,4058],[-15,16],[-3,-5]],[[5281,4069],[-18,11]],[[5263,4080],[-5,4],[-2,3],[-19,11],[-8,5]],[[5229,4103],[9,14],[0,5],[-31,32],[-30,33]],[[5177,4187],[14,18],[14,18]],[[5205,4223],[10,-11],[15,-15],[8,-8],[28,-29]],[[5266,4160],[18,-20]],[[5284,4140],[43,-45]],[[5327,4095],[-15,-20]],[[7828,1424],[-94,22],[-7,22],[-25,-18]],[[7702,1450],[3,5],[8,17],[4,5],[17,27],[1,2]],[[7735,1506],[1,0],[9,1],[5,-1],[89,-26]],[[7685,1444],[-5,1]],[[7740,1546],[3,-2]],[[7743,1544],[-3,-6],[-9,-14],[-9,-17],[-15,-23],[-4,-6],[-11,-23],[-7,-11]],[[7735,1506],[29,49]],[[7746,1548],[-3,-4]],[[7733,1659],[-2,-23],[11,-1],[27,-2],[18,-1],[6,-1],[2,-3]],[[7808,1698],[39,-2],[3,-1]],[[7934,1216],[-39,5]],[[7895,1221],[-51,11],[-47,12]],[[7797,1244],[-63,18],[-88,26],[-20,-8]],[[7626,1280],[-21,0]],[[7605,1280],[6,13],[2,5],[10,15],[12,24],[15,26],[7,15],[25,38],[20,34]],[[8044,1369],[-3,-5],[-7,-9],[-16,-23],[-11,-21],[-11,-17],[-10,-5],[-11,-13],[-6,-12],[-11,-12],[-6,-12],[-18,-24]],[[7590,1280],[10,22],[46,84],[24,42],[3,5]],[[7685,1444],[-5,-9],[-29,-51],[-3,-5],[-11,-16],[-35,-62],[-12,-20],[0,-1]],[[7979,1485],[86,-19],[0,5],[1,17]],[[8066,1488],[1,24]],[[8138,1495],[-3,-2],[-6,-7],[-20,-30],[-4,-8],[-22,-32],[-13,-18],[-9,-9],[-5,-6]],[[7980,1504],[86,-16]],[[8586,1703],[2,-3],[4,-4],[3,-2],[11,-4],[4,-14],[3,-9],[4,-4]],[[8617,1663],[-2,-2],[-9,-9],[-7,-9],[-3,-5],[-2,-8],[0,-8],[-2,-11],[-1,-20],[-4,-11],[-9,-17],[-15,-20],[-5,-2],[-8,1],[-8,-1],[-13,0],[-4,0],[-9,-1],[-8,-4],[-5,-4],[-20,-11],[-7,-3],[-8,-2],[-4,-2],[-5,-3],[-7,-9],[-6,-5],[-5,-8],[0,-11],[-3,-8],[-4,-8],[-10,-7],[-6,-1],[-3,-5],[-1,-4],[-4,-1],[-3,2],[-2,3],[-1,0],[-1,-2],[-12,-1],[-5,-1],[-12,2],[-3,-1],[-1,-6],[-2,-3],[-2,-2],[-5,-1],[-5,2],[-3,7],[-3,-1],[-3,-3],[0,-5],[-1,-3],[-4,-2],[-3,-1],[-3,1],[-5,5],[-3,5],[-4,1],[-6,3],[-6,8],[-3,5],[-7,15],[-1,6],[-1,1],[-1,7],[-7,20],[-7,27],[-4,25],[11,41],[6,13],[3,8],[5,17],[4,18],[8,23],[4,16],[5,28],[3,22],[0,22],[8,16],[5,19],[5,13],[2,15],[4,16],[9,18],[4,11]],[[2899,2234],[-37,-32],[-7,10],[-1,0],[-3,0],[-19,-17],[1,-3],[5,-7],[2,-2],[1,-3],[10,-17],[-35,-32],[-18,30],[-2,0],[-2,0],[-6,-5],[-1,-2],[0,-3],[19,-28],[-17,-15],[-18,29],[-2,1],[-2,0],[-7,-5],[-1,-2],[1,-3],[19,-29],[-14,-11],[-8,6],[-4,5],[-8,13],[-2,2],[-3,0],[-24,-20],[-1,-4],[1,-3],[9,-15],[2,-3],[-2,-3],[-13,-12],[-15,23],[-2,0],[-12,-10],[-2,-2],[1,-4],[13,-20],[-16,-14],[-12,20],[-2,2],[-2,1],[-12,-10],[-1,-2],[1,-3],[6,-11],[1,-9],[14,0],[2,0],[2,1],[2,2],[10,-14],[-42,-36],[-1,-1],[0,-1],[1,-2],[8,-13],[2,-2],[2,0],[2,1],[40,34],[6,-9],[2,-3],[2,-3],[26,22],[27,23],[9,7],[5,6],[48,41],[33,29],[22,19],[6,5],[5,4],[49,42]],[[2940,2167],[24,-39],[15,-25],[11,-17],[2,3],[7,-12],[10,-16],[4,-6],[3,-5]],[[3016,2050],[-3,-3],[-42,-35],[-19,-16],[-35,-29],[-26,-22],[-25,-21],[-24,-20],[-22,-19],[-24,-20],[-8,-6],[-3,-3],[-5,-4],[-7,-5],[-10,-7],[-10,-7],[-10,-6],[-10,-5],[-7,-4],[-7,-3],[-1,-1],[-2,-1]],[[2716,1813],[-3,6],[-4,6],[-5,9],[-59,86],[-3,4],[-15,31],[-7,12],[-22,36]],[[2598,2003],[3,4],[3,5],[10,8],[272,237],[3,3]],[[2889,2260],[13,-23],[-3,-3]],[[4158,3361],[-66,-13],[-2,-2],[-18,-16],[7,-7],[15,-14]],[[4094,3309],[-7,-8],[-7,-5],[-6,-3],[-8,-3],[-18,-6],[-7,-4],[-4,-5]],[[4037,3275],[-5,6],[-2,4],[-5,13]],[[4025,3298],[-2,5],[-1,4],[-4,8],[-15,15],[-1,0],[-13,14]],[[3989,3344],[8,8],[3,3],[5,2],[8,6],[3,4],[0,2],[1,3],[0,2],[-1,3],[-2,2],[-32,34]],[[3982,3413],[11,8],[3,3]],[[3996,3424],[28,-30],[30,-32],[6,0],[16,4],[6,1],[4,2],[5,5],[4,5],[12,-13],[3,0],[10,15],[-3,5],[-5,4],[-7,8],[-11,12],[-22,23],[-5,5],[-22,23]],[[4045,3461],[17,13]],[[4062,3474],[80,-86],[7,-7],[-2,-3],[11,-17]],[[5205,4223],[-37,40]],[[5168,4263],[-4,4],[-3,3],[0,1],[-4,4],[-12,13]],[[5145,4288],[24,30],[-15,15],[6,5],[12,10],[16,15],[11,10],[11,12],[3,4],[4,7]],[[5217,4396],[7,17],[2,5],[2,4]],[[5228,4422],[69,-72]],[[5297,4350],[62,-65]],[[5359,4285],[-11,-15]],[[5348,4270],[-44,-60]],[[5304,4210],[-10,-12],[-28,-38]],[[6657,3142],[-21,15]],[[6986,3651],[11,-15],[9,-21],[10,-22]],[[7145,3082],[-3,-7],[-1,-2],[-7,-9],[-16,-28],[-12,-24],[-31,-57]],[[6976,2905],[-17,13],[-1,1],[-1,0],[-6,5],[-9,6]],[[6942,2930],[4,7],[32,60]],[[9331,8884],[7,32],[8,37],[88,-25]],[[9434,8928],[-5,-24],[-1,-8],[-3,-23],[-2,-13]],[[9423,8860],[-6,2],[-12,3],[-10,3],[-18,5],[-43,12],[-3,-1]],[[6904,2449],[12,21],[10,19],[5,10],[6,10]],[[6256,2171],[-18,12],[-43,27]],[[6195,2210],[10,20],[6,14],[20,42],[3,4],[6,11],[3,9],[1,10],[1,5]],[[6245,2325],[1,11],[2,7],[4,10],[7,15],[1,3]],[[6260,2371],[19,-12],[16,33],[17,-11],[-6,-13],[-9,-20],[12,-8],[5,-5],[5,-6],[6,-5],[3,-4]],[[7771,2440],[-24,17],[-5,7]],[[7922,1911],[1,26],[-6,61],[0,3],[-1,5],[0,24]],[[7908,2031],[0,-3],[-2,-4],[1,-19],[0,-3],[0,-4],[4,-27],[2,-34],[0,-25]],[[6126,4375],[6,2],[2,0],[12,1],[0,27],[1,1],[1,1],[13,4],[2,0],[1,-2],[1,-50],[-5,-14],[1,-2],[15,-7]],[[6176,4336],[-6,-18],[-2,-1],[-2,1],[-31,14],[-14,8],[-1,1],[-1,3],[9,23],[-2,8]],[[9040,5199],[-22,11],[-1,1],[-1,1],[-13,6]],[[9003,5218],[4,8],[5,10],[3,6],[4,10],[6,21],[1,9],[6,26],[4,18],[10,54],[5,18],[3,14],[8,35],[6,29],[1,4],[1,5],[3,12]],[[9073,5497],[2,5],[4,15],[1,3],[2,5],[6,15],[-2,1],[-9,6],[-51,28],[-9,4],[-7,-19]],[[9010,5560],[-9,5],[-39,21],[-9,5]],[[8953,5591],[-8,4],[-53,30]],[[8892,5625],[-6,3]],[[8886,5628],[2,7],[4,13],[32,95],[15,45],[14,42],[14,52]],[[8967,5882],[15,-8],[19,-10],[9,-5],[1,0],[34,-20],[16,-8],[50,-29],[52,-27],[30,-16],[2,-2],[1,3],[6,11],[5,9],[12,24],[2,4]],[[9221,5808],[11,20],[10,19]],[[9242,5847],[7,14],[3,5],[7,13],[7,13],[2,3],[16,31],[2,4],[20,36],[2,4],[1,2],[2,5],[5,10],[4,7],[2,4],[19,34],[6,11],[2,4],[4,9],[2,4],[2,8],[1,4],[2,6]],[[9360,6078],[47,-16],[4,-2]],[[9411,6060],[-1,-6],[-1,-4],[-1,-4],[1,-4],[1,-3],[2,-1],[16,-9],[-27,-111],[3,-1],[-65,-160],[-2,-2],[-36,-56],[-62,-104],[-99,-87],[-1,-6],[1,-2],[2,-2],[5,-2],[9,2],[26,3],[9,0],[3,-1],[6,-7],[5,-9],[4,2],[3,-4],[-22,-18],[-30,-25],[-65,-131],[-37,-75],[-18,-34]],[[8504,5582],[-1,1],[-2,1],[-12,7],[-35,18],[-9,5],[-34,18],[-41,22],[-1,-3],[-9,-23],[-9,-23],[-15,-36],[-6,1],[-9,18],[11,27],[-22,12],[-3,2],[-1,2],[0,2],[0,2],[4,4],[3,4],[3,5],[1,3],[1,8],[0,6],[1,3],[2,5],[1,4],[1,3],[-26,15],[-15,9],[-4,3],[-3,3],[-5,2]],[[8270,5712],[1,4],[6,16],[7,19]],[[8284,5751],[4,9],[8,20],[6,17],[6,16],[4,9],[8,21],[2,5],[1,2],[1,2]],[[8324,5852],[23,-13],[4,-2],[5,-5],[5,-6],[6,-9],[17,-27],[16,-26]],[[8400,5764],[2,-3],[5,-4],[3,-2],[29,-16],[41,-22]],[[8480,5717],[53,-30],[6,-3],[2,-1],[3,-2]],[[8544,5681],[-1,-3],[-1,-3],[-22,-53],[-2,-5],[-14,-35]],[[2883,2571],[-21,-11],[-5,-3]],[[2857,2557],[-4,5],[-24,23],[-12,13],[-5,5],[-4,7],[-6,4],[-21,11]],[[2781,2625],[3,9],[10,8],[18,-8],[5,17],[2,5]],[[2819,2656],[4,2],[44,37]],[[2867,2695],[11,-18],[11,-18],[20,-31],[14,-17]],[[2923,2611],[-9,-12],[-14,-16],[-17,-12]],[[3891,2848],[-153,-124],[-5,-3]],[[3733,2721],[-26,44],[43,35],[-1,5],[3,26],[-19,3],[-15,-6],[-6,-4],[-26,-21],[-3,1],[-10,17],[-10,18],[1,3],[38,30],[5,3],[-11,18],[1,2],[34,11],[3,0],[1,-3],[2,-18],[10,2],[10,-1]],[[3757,2886],[20,0],[0,5],[-2,22],[0,4],[1,3],[37,29],[3,0],[4,0]],[[3820,2949],[2,-20],[-28,-21],[0,-3],[1,-8],[1,-8],[6,1],[29,21],[8,-15],[0,-2],[-1,-2],[-34,-27],[-4,-1],[-6,1],[-2,-23],[6,-1],[4,1],[5,1],[4,3],[19,15],[19,15],[17,14],[25,-42]],[[5490,3360],[-15,-21],[13,-14]],[[5488,3325],[-11,-16],[14,-16],[14,-15],[8,10]],[[5513,3288],[2,-2],[14,-14]],[[5529,3272],[-38,-9],[-4,4],[0,1],[-13,13],[-4,4],[-13,13],[-25,25],[-30,-2]],[[5402,3321],[34,49]],[[5436,3370],[20,-20],[20,23]],[[5476,3373],[14,-13]],[[5741,4799],[-17,-9],[-4,-2],[-24,-13],[-3,-2],[-9,-4],[-3,-1],[-2,2],[-1,-4],[-2,-6],[-2,-3],[-7,-17]],[[5667,4740],[-40,20]],[[5627,4760],[-32,18],[-10,-2],[-13,-4],[-2,-1],[-10,-7],[-8,-7],[-12,-8],[50,-26],[-6,-14],[-6,-16],[-7,-18]],[[5571,4675],[-76,42],[-16,-16],[-16,-15]],[[5463,4686],[-5,12],[-15,10],[-4,1],[-4,2]],[[5435,4711],[0,1],[5,3],[10,11],[3,3],[7,3],[10,-6],[2,0],[2,2],[2,3],[1,2],[0,3],[-5,3],[-2,5],[1,5],[4,5],[3,7],[8,8],[9,1],[6,6],[9,12],[2,2],[3,1],[7,-3],[4,-1],[6,1],[2,2],[17,8],[7,3],[3,1],[6,-1],[2,0],[13,4],[17,6],[8,0],[19,5],[5,0],[16,-1],[10,1],[5,-2],[3,-2],[13,-2],[7,3],[10,-1],[17,5],[8,2],[5,3],[9,3],[2,0]],[[5736,4825],[0,-7],[5,-19]],[[8104,6561],[-34,25],[-16,11],[-40,29]],[[8042,6679],[14,26],[1,2]],[[8057,6707],[39,-28],[16,-11],[-1,-3],[-32,-62],[34,-24],[-5,-10],[-4,-8]],[[5917,3205],[27,37]],[[5944,3242],[14,-14],[9,-10]],[[5967,3218],[-25,-33],[-3,-2],[-1,-1],[-3,-1],[-8,-3],[-8,-7],[-9,-10]],[[8731,1930],[-11,5],[-32,13]],[[8843,2243],[4,-3],[2,-2],[4,-5],[3,-6],[5,-16],[10,-36],[4,-11],[3,-4],[3,-4],[1,-4],[0,-3],[-1,-1],[-2,-3],[-4,-2],[-16,1],[-5,-1],[-5,-7],[-15,-15],[-15,-13],[-8,-12],[-4,-5],[-7,-7],[-2,-2],[-8,-8],[-33,-37],[-17,-18],[0,-17],[-2,-14],[-1,-20],[-6,-38]],[[8731,1930],[-4,-25],[-4,-16],[-5,-14],[-13,-28],[-4,-11],[-8,-18],[-3,-10],[-7,-11],[-2,-5],[-11,-29],[-1,-3],[-9,-18],[-5,-10],[-11,-17],[-5,-9],[-6,-11],[-5,-12],[-5,-11],[-4,-6],[-2,-3]],[[6158,1806],[5,7]],[[6163,1813],[11,-6],[9,-6],[46,-30],[3,0],[7,16],[3,-2],[5,-2],[3,-3],[3,-4],[0,-17],[1,-3],[55,-34],[11,-8],[6,-2],[32,-20],[14,-9],[3,3],[0,78],[-8,7]],[[6367,1771],[8,12],[0,6],[0,22],[0,25],[27,-16],[15,-9]],[[7674,2529],[-28,-35],[-19,-59]],[[7627,2435],[-8,7],[-2,2],[-1,1],[-1,1],[-2,1],[-3,3],[-2,1],[-19,20],[-7,10],[-6,12],[-2,9],[2,14]],[[7576,2516],[1,1],[2,1],[3,0],[2,2],[2,1],[5,5],[6,7],[10,17],[3,4],[13,19]],[[7623,2573],[20,-20],[17,15],[2,1],[14,12],[-8,7],[29,36],[25,29],[2,3],[-26,24]],[[7698,2680],[6,8],[30,40],[4,5]],[[7738,2733],[13,28],[14,25]],[[7765,2786],[15,-11],[2,-1],[22,-20],[19,-17],[2,-2],[7,-6],[1,-1],[3,-3],[1,0],[2,-2],[17,-17]],[[7856,2706],[-14,-16],[-5,-7],[-7,-10],[-10,-17]],[[7698,2680],[-10,-14]],[[7688,2666],[-38,28]],[[7650,2694],[15,22],[17,24]],[[7682,2740],[15,21]],[[7697,2761],[41,-28]],[[6192,2521],[-1,-3],[-8,-17],[-9,-19],[-5,-17]],[[5566,1320],[-9,99],[-8,90],[-18,1],[-1,-4],[-6,-3],[-3,0],[-9,-1]],[[5512,1502],[-1,15],[0,2],[0,5]],[[6426,3903],[-4,-8]],[[6421,3896],[4,13],[22,56],[10,26],[8,24],[2,5],[2,5],[6,16],[3,10],[2,6],[2,5],[1,4],[2,3],[1,3],[1,4],[1,2],[2,6],[0,1],[2,7],[11,47],[2,9]],[[6505,4148],[6,-3],[2,0],[2,-1],[19,-9]],[[6534,4135],[-1,-3],[-8,-24],[-9,-23],[-7,-21],[-8,-23],[-7,-21],[33,-16]],[[6527,4004],[-1,-11],[0,-8],[0,-6],[-1,-7],[-2,-7]],[[6523,3965],[-3,0],[-3,-1],[-2,-1],[-2,-3],[-35,17],[-28,-80],[-20,9],[-3,2],[-1,-5]],[[6153,3930],[-19,-2],[0,3],[-2,1],[-9,1],[-24,11]],[[6099,3944],[3,9],[2,5],[1,4],[3,8],[5,14],[1,5],[0,5],[-2,8],[-4,10],[-2,5],[-3,4],[-4,2],[-16,8]],[[6083,4031],[11,29]],[[6094,4060],[12,-6],[28,-19],[18,-10]],[[6152,4025],[1,-48],[0,-11],[0,-13],[0,-14],[0,-1],[0,-8]],[[7062,7388],[-18,28]],[[7044,7416],[14,15],[6,7],[3,3],[3,4],[5,6],[6,7],[3,4],[6,7],[17,23],[4,5],[6,8],[1,1],[3,5],[7,8]],[[7128,7519],[58,-72],[8,-11],[3,-3]],[[7197,7433],[-8,-8],[-5,-5],[-14,-13],[-27,-23],[-6,-5],[-30,-25],[-1,2],[-30,46],[-14,-14]],[[6260,2371],[33,69],[0,1],[2,7],[1,3]],[[6296,2451],[45,-29]],[[6155,2366],[61,-39],[6,-2],[20,1],[3,-1]],[[6195,2210],[-6,4],[-11,7],[-38,-3],[-5,-1],[-4,-2],[-8,-1],[-29,-2]],[[6489,6147],[-16,25],[-1,-8]],[[6472,6164],[1,10],[2,13],[1,34],[1,9],[12,23],[11,17],[2,4],[8,13],[7,10],[4,11],[7,19],[1,6],[3,13],[3,5],[2,9],[2,9],[3,4],[3,4],[6,4],[5,10],[3,6],[3,3],[5,3],[6,11],[5,6],[14,21],[10,10],[4,7],[2,5],[3,7],[2,0],[0,15],[4,10],[1,3]],[[6618,6498],[1,-1],[3,-3],[3,-3],[3,-3],[3,-3],[2,-4],[2,-1]],[[6635,6480],[-2,-3],[-7,-20],[-8,-17],[-13,-17],[-13,-16]],[[6592,6407],[-11,-14],[-13,-14],[-4,-5],[-1,-3],[-2,-3],[-1,-11]],[[6560,6357],[-3,-26],[-3,-10],[-5,-14],[-9,-21]],[[6540,6286],[-14,-20],[-8,-14],[-7,-14],[-3,-5],[-2,-8],[-3,-10],[-2,-7]],[[6501,6208],[-6,-28],[-6,-33]],[[7493,7356],[12,-20],[49,-78],[50,-79],[4,-3],[2,-5],[30,-47],[3,-3],[1,-1],[1,-2]],[[7471,6984],[-2,2],[-5,11],[-45,101],[-10,16],[-14,22]],[[7395,7136],[-23,37],[-32,51]],[[7340,7224],[-2,3],[-71,102]],[[7267,7329],[-70,104]],[[7197,7433],[4,4],[22,26]],[[7223,7463],[28,31],[29,34],[17,20],[2,2],[15,17]],[[7314,7567],[13,-21],[50,-77]],[[7377,7469],[50,-78],[36,-56],[2,-3],[15,13],[13,11]],[[7912,5473],[-10,-19]],[[7233,6187],[-39,28],[-5,4],[-22,17],[-5,2],[-26,17],[-33,42],[-30,9]],[[7073,6306],[15,29],[24,46],[6,12]],[[7118,6393],[16,29],[13,25],[12,24]],[[7276,6266],[-7,-13]],[[5894,3747],[-3,3],[-2,12],[-4,5],[-8,9],[-29,29]],[[5848,3805],[-54,58]],[[5794,3863],[-56,59]],[[5738,3922],[12,14],[12,17],[14,17],[14,17]],[[5790,3987],[26,-28],[2,-2],[-6,-8],[-6,-7],[-2,-1],[28,-30],[23,-24]],[[5855,3887],[-13,-17],[15,-17],[17,-17],[9,-9],[3,-4],[36,-37],[3,-3]],[[5925,3783],[-11,-14],[-10,-11],[-10,-11]],[[7382,2444],[-13,-18],[-12,-17]],[[5710,3061],[-3,7],[22,5],[13,3],[13,1],[24,2],[23,1],[60,4],[15,0],[-3,4],[-3,4],[0,9],[0,2],[2,10],[37,48]],[[5967,3218],[16,-16],[50,-52],[2,-2],[3,-3]],[[6038,3145],[-7,-8],[-10,-10],[-10,-10],[-8,-6],[-9,-7],[-8,-5],[-10,-5],[-8,-3],[-9,-4],[-10,-3],[-5,-2],[-6,-1],[-10,-2],[-11,-1],[-16,-1],[-1,0],[-1,0],[-7,0],[-18,-1],[-20,-1],[-22,-1],[-13,0],[-12,-1],[-21,-1],[-17,-1],[-14,-2],[-7,0],[-4,-1],[-5,-1],[-6,-1],[-7,-1],[-5,-1],[-5,-2],[-6,-1]],[[5641,3296],[17,-17],[-14,-18]],[[5644,3261],[-5,-7],[-5,-8],[-3,-10],[-1,-9],[1,-9],[3,-7]],[[5634,3211],[-13,1],[-12,-18],[9,-12],[-17,-9]],[[5601,3173],[1,4],[-5,11],[-3,3],[11,15],[3,4],[3,6],[1,4],[0,7],[-1,7],[0,9]],[[5611,3243],[7,16],[9,12],[1,3],[-1,3],[-19,21],[-8,2],[-14,4],[-2,1],[-5,4],[-10,11]],[[5569,3320],[22,29]],[[5591,3349],[35,-37],[15,-16]],[[5710,3061],[-6,-1],[-5,-2],[-6,-2],[-6,-2],[-4,-1],[-4,-2],[-4,-1],[-7,-3],[-5,-2],[-2,-1],[-4,-2],[-11,-5],[-6,-3],[-4,-2],[-10,-6],[-11,-5],[-10,-5],[-2,-2],[-3,-1],[-2,2],[-3,4],[-2,2],[-10,10],[-14,15],[-13,15],[-6,10],[-2,6],[-3,7],[-3,9],[-3,13],[-2,12],[-6,25]],[[5531,3143],[42,16],[5,2],[20,8],[1,1],[1,1],[1,2]],[[5634,3211],[-8,-10],[-3,-4],[0,-2],[0,-2],[1,-3],[47,-48],[1,-1],[2,0],[2,0],[8,12],[1,3],[-1,13],[6,1],[6,2],[5,3],[5,5],[21,28]],[[5727,3208],[15,-15],[15,-16]],[[5757,3177],[17,-18]],[[5774,3159],[15,-16],[23,29],[14,-16],[-23,-31],[12,-13],[5,0],[36,49]],[[7239,1392],[7,-5],[27,-20]],[[9682,8897],[-40,12],[-2,-14],[-34,10],[-6,1]],[[9600,8906],[5,8],[1,9],[9,48],[1,5],[5,17],[0,8],[5,23],[9,46],[1,5],[10,96],[0,8],[-2,0],[-2,0],[-1,1],[3,10],[3,16],[1,61],[2,43]],[[9650,9310],[2,-1],[40,-11],[5,5]],[[9600,8906],[4,24],[4,21],[4,21],[5,20],[2,10],[-1,11],[-2,22],[-43,11]],[[9573,9046],[-65,18],[-2,-3]],[[9506,9061],[-7,-4],[-15,-5],[-2,-10],[-6,-8],[-12,-63],[20,-6],[2,-2]],[[9486,8963],[-5,-23]],[[9481,8940],[-36,9],[-6,2]],[[9439,8951],[23,111]],[[9473,9112],[6,-2],[18,-5],[-1,-7],[0,-3],[1,-3],[3,2],[20,7],[22,8],[20,7],[13,6],[10,6],[6,5],[7,6],[5,6],[2,7],[-39,11],[-18,5],[-18,5],[-18,5],[-19,1],[-6,1]],[[9547,8921],[5,24],[4,21],[4,21],[4,20],[5,19],[4,20]],[[9600,8906],[-20,6],[-5,1],[-28,8]],[[9547,8921],[-66,19]],[[9486,8963],[5,21],[4,21],[4,21],[4,19],[2,9],[1,7]],[[9434,8928],[5,23]],[[9547,8921],[-5,-23],[-5,-24],[-4,-22]],[[9533,8852],[-66,18],[-4,-21],[-27,7],[-13,4]],[[9302,8735],[5,25],[5,22],[8,53],[6,25],[5,24]],[[9423,8860],[0,-4],[-2,-17],[-1,-6],[-5,-24]],[[9415,8809],[-3,-16],[-12,-59],[-4,-11],[-4,-11],[0,-1]],[[9392,8711],[-5,1],[-19,5],[-30,9],[-15,3],[-21,6]],[[9432,8700],[-38,10],[-2,1]],[[9415,8809],[38,-10]],[[9453,8799],[-6,-29],[-1,-5],[-11,3],[-3,-14],[11,-3],[0,-3],[-5,-24],[-3,-17],[-3,-7]],[[9514,8759],[-10,-52]],[[9504,8707],[-5,-25]],[[9499,8682],[-67,18]],[[9453,8799],[4,24],[66,-19]],[[9523,8804],[-5,-24],[-4,-21]],[[9533,8852],[-4,-22]],[[9529,8830],[-1,-3],[-3,-15],[-2,-8]],[[9529,8830],[76,-21],[2,-1]],[[9607,8808],[0,-3],[3,-24]],[[9610,8781],[2,-26],[4,-45],[-25,7],[4,17],[-2,3],[-56,16],[-23,6]],[[9600,8906],[0,-24],[2,-25],[3,-25],[2,-24]],[[9644,8668],[-3,24],[-5,32],[0,7],[-3,20],[0,11],[0,13],[-23,6]],[[9695,8890],[-2,-4],[0,-6],[0,-16],[1,-5],[-2,-10],[0,-20],[2,-19],[-3,-6],[0,-9],[2,-10],[1,-7],[0,-1],[-2,-10],[-4,-10],[1,-25],[2,-7],[-1,-11],[4,-10],[0,-13],[-1,-9],[2,-7],[2,-10],[-1,-7],[2,-3]],[[9644,8668],[-19,5],[-5,2],[3,-27],[-59,16]],[[9564,8664],[5,25],[-42,11],[-23,7]],[[9490,8638],[4,20],[5,24]],[[9564,8664],[-5,-24],[-3,-19]],[[9556,8621],[-49,13],[-17,4]],[[9486,8616],[4,22]],[[9556,8621],[16,-5],[4,18],[3,1],[33,-9],[2,-1],[0,-2],[2,-19],[2,-18],[-1,-2],[-2,-1],[-64,17],[-65,16]],[[8996,3934],[12,-63],[1,-4],[53,-282],[38,-209],[4,1],[24,-132],[23,-100],[-27,-16],[0,-27],[2,-1],[-13,4],[-47,24],[-17,11],[-21,18],[-30,31],[-13,17],[-10,15],[-8,13],[-13,22],[-8,16],[-3,12],[-9,22],[-11,45],[-3,22],[-3,24],[-1,22],[1,23],[0,18],[4,20],[3,22],[1,4],[0,3],[0,1],[1,5],[5,9],[4,13],[6,19],[11,40],[6,44],[0,34],[0,6],[-3,66],[-8,103],[-7,97],[0,8],[0,5],[0,4],[3,6],[4,1],[10,-4],[4,0],[5,4],[12,7],[1,1],[-19,106],[1,9],[1,1],[5,-1],[25,-127],[5,-3],[2,-9],[1,-7],[-1,-1],[-3,-3],[0,-9]],[[9038,3405],[-1,6],[-11,1],[-11,1],[-1,-3],[-27,3],[-3,1],[-3,0],[0,32],[1,3],[0,3],[1,10],[2,7],[2,18],[2,7],[1,5],[2,3],[0,6],[2,4],[0,4],[0,6],[0,1],[10,33],[6,32],[-11,33],[-21,2],[-4,-31],[-4,-19],[-10,-37],[-1,-5],[-6,-29],[-2,-10],[-3,-21],[-1,-15],[-2,-26],[-1,-5],[0,-21],[0,-2],[0,-17],[12,0],[17,-1],[0,-31],[0,-2],[5,0],[0,-30],[-1,-1],[-3,-9],[-7,0],[-3,-1],[-2,-3],[0,-26],[1,-6],[2,-3],[2,-2],[2,0],[1,2],[0,6],[2,4],[2,3],[11,0],[1,0],[2,4],[2,13],[1,2],[2,1],[3,-2],[2,-4],[1,-4],[2,-8],[3,-22],[-2,-1],[0,-7],[-3,-3],[-5,-1],[-6,3],[-3,-1],[-2,-3],[3,-4],[1,-1],[1,-2],[5,-7],[3,-5],[2,-4],[0,8],[-1,8],[1,4],[3,4],[3,0],[3,-2],[3,-2],[0,-3],[2,-2],[-2,-7],[-2,-9],[3,-7],[3,-6],[4,-1],[2,-6],[0,-6],[4,-9],[2,-4],[4,-2],[1,-4],[2,-1],[4,-1],[6,1],[1,0],[5,6],[1,5],[-2,21],[1,9],[-2,7],[-5,12],[0,8],[4,10],[0,9],[-2,5],[0,9],[2,11],[0,11],[-4,20],[-3,37],[0,37],[-1,6]],[[8980,3810],[102,-565],[12,-65],[27,7],[-10,58],[-105,572],[-26,-7]],[[8960,3872],[1,-1],[1,1],[3,2],[3,4],[10,0],[5,-4],[3,0],[-1,15],[-1,3],[2,3],[-2,10],[-6,8],[-4,3],[-6,0],[-1,-1],[-9,-12],[1,-10],[1,-3],[-1,-3],[1,-15]],[[8953,3313],[0,1],[-2,0],[-1,3],[-4,4],[-4,0],[-1,-2],[0,-6],[1,-3],[3,-3],[3,0],[4,3],[1,1],[0,2]],[[8794,4165],[1,-13],[4,-1],[5,1],[3,-1],[8,-2],[8,-2],[9,-2],[4,-1],[3,-4],[3,-3],[1,-5],[1,-16],[1,-6],[3,0],[6,-1],[5,-3],[4,-3],[5,-3],[3,-3],[3,-3],[2,-1],[3,-3],[1,1],[0,3],[3,2],[1,0],[1,-4],[7,-139],[2,-13],[4,-44],[2,-14],[11,-37],[1,-19],[12,-90],[-1,-15],[-2,-6],[-3,-10],[0,-6],[-4,-8],[-1,-4],[-1,-12],[-3,-29],[-6,-40],[-14,-54],[-5,-21],[-3,-13],[-9,-37],[-2,-6],[-1,-5],[-1,-3],[-8,-9],[-3,-2],[-2,0],[-7,-1],[-6,0],[-4,1],[-5,2],[-7,8],[-14,25],[-2,6],[-26,51],[-6,25],[-19,90],[-9,37],[1,57],[6,62],[1,36],[0,3],[-1,2],[1,7],[-4,27],[-3,8],[-5,18],[-2,16],[-3,15],[0,1],[-2,20],[-1,3],[-4,9],[-1,11],[1,22],[4,17],[5,39],[6,20],[7,21],[19,47],[34,73],[3,4],[3,2],[6,12],[0,6],[5,8],[1,5],[5,7],[5,6],[3,3],[20,0],[8,-5],[3,-5],[3,-7],[2,-13],[3,-49],[-3,-6],[-6,-7],[-57,7],[-17,-31],[-2,-6]],[[8983,3495],[-1,-13],[-4,-21],[-1,-8],[0,-3],[1,-3],[-1,-14],[-2,-17],[-18,1],[-8,0],[0,12],[1,12],[2,15],[4,31],[10,-2],[1,9],[-9,2],[0,5],[1,5],[2,5],[-1,6],[3,3],[1,4],[0,6],[-1,3],[11,36],[7,30],[2,17],[15,-4],[8,-20],[-3,-14],[-13,-54],[-5,-10],[2,-5],[1,-3],[-2,-2],[-2,-6],[-1,-3]],[[8988,3410],[-1,-32],[17,-1],[-3,-27],[-1,-7],[-1,-2],[-5,-4],[-12,-1],[0,20],[-5,0],[1,38],[-12,1],[-1,-6],[-8,1],[-9,1],[0,11],[0,10],[9,0],[27,-1],[4,-1]],[[8879,4108],[-1,1],[-1,2],[-1,25],[-2,37],[2,8],[1,3],[3,-1],[3,-4],[1,-5],[-1,-16],[-2,-6],[2,-39],[-4,-5]],[[9137,3084],[-6,17],[2,-3],[5,-13]],[[8620,3881],[-23,-113],[1,-1],[-3,-12]],[[8595,3755],[-15,5],[-6,2]],[[8574,3762],[-40,11],[0,4],[0,1],[2,7],[2,2],[-8,1],[-2,0],[-6,-2],[-5,-3],[-7,-6],[-6,-6],[-2,-1],[-3,-4],[-3,-5],[-5,-8],[-3,-11]],[[8488,3742],[-5,3],[-1,1],[-4,3],[-4,4],[-22,16],[-25,19]],[[8427,3788],[-4,3],[-43,32]],[[8380,3823],[8,15],[8,15]],[[8396,3853],[46,-35],[11,13],[9,14]],[[8462,3845],[13,22],[10,20],[6,10]],[[8491,3897],[7,12],[12,22],[14,24]],[[8524,3955],[2,-3],[12,-15],[8,-5],[15,-9],[3,-1],[3,-2],[7,-5],[5,-1],[23,-18],[9,-4],[9,-11]],[[8396,3853],[8,15],[8,15]],[[8412,3883],[10,-7],[14,-11],[26,-20]],[[6830,4348],[17,49],[3,4],[12,35]],[[6862,4436],[29,85],[2,2],[3,10],[2,3]],[[6898,4536],[43,-21],[8,-4],[9,-4]],[[6958,4507],[62,-31]],[[7020,4476],[44,-20],[13,-7]],[[7077,4449],[-1,-3],[-4,-13],[-2,-5],[-36,-102],[-10,-27],[-1,-5]],[[7023,4294],[-61,18]],[[8089,3915],[6,13],[-66,50]],[[8029,3978],[7,12]],[[8036,3990],[43,-32],[23,-18]],[[8102,3940],[9,-7],[29,-22]],[[8140,3911],[-7,-12],[-6,-11],[-33,25],[-5,2]],[[8152,3903],[-14,-25]],[[8138,3878],[-2,-2],[-4,-4],[-17,-23]],[[8115,3849],[-29,22]],[[8086,3871],[-16,12],[-66,49]],[[8004,3932],[6,11],[4,8]],[[8014,3951],[59,-44],[3,-3],[5,-3],[8,14]],[[8140,3911],[12,-8]],[[8014,3951],[4,7],[5,8],[6,12]],[[8172,3805],[-10,8],[-14,11],[-3,2],[-10,8],[-6,5]],[[8129,3839],[-9,7],[-5,3]],[[8138,3878],[5,-1],[36,-27],[5,-3]],[[8184,3847],[-1,-4],[-1,-3],[-1,-4],[-9,-31]],[[8152,3903],[10,-8],[18,-14],[11,-8]],[[8191,3873],[-7,-26]],[[8094,3750],[-8,-15]],[[8086,3735],[-50,39]],[[8036,3774],[3,6],[4,9],[8,15],[3,7],[5,9]],[[8059,3820],[41,-32],[11,-8]],[[8111,3780],[-6,-10],[-3,-5],[-8,-15]],[[8071,3704],[-1,2],[-33,24],[-7,5],[-10,8]],[[8020,3743],[1,3],[7,13],[8,15]],[[8086,3735],[8,-6]],[[8094,3729],[-8,-14],[51,-38]],[[8142,3693],[-4,3],[-40,30],[-4,3]],[[8094,3750],[12,-11],[14,-11],[22,-19],[4,-2]],[[8111,3780],[6,-4],[10,-7],[19,-15],[10,-8]],[[9697,9303],[3,20],[1,5],[2,8],[1,6],[5,32]],[[9709,9374],[5,33],[2,7],[6,40],[1,7]],[[9723,9461],[4,24]],[[9727,9485],[41,-10],[20,21],[17,23],[11,15],[15,25]],[[9831,9559],[25,42],[7,11],[2,12]],[[9865,9624],[4,20],[-8,13],[-1,5],[2,12]],[[9862,9674],[4,22],[5,23],[7,38],[-14,3],[2,15],[14,-2],[4,23]],[[9884,9796],[1,6],[1,7],[8,33],[4,14],[12,48],[3,5],[5,12],[-15,-5],[-17,-5],[-25,-8]],[[9861,9903],[-8,-2]],[[9850,9931],[2,2],[2,-1],[2,-1],[2,-2],[10,0],[16,4],[8,3],[20,11],[3,1],[7,5],[6,3],[1,0],[7,-1],[6,-3],[6,2],[6,10],[6,5],[17,3],[4,4],[3,-1],[2,0],[4,4],[5,0],[4,-2],[0,-5],[-4,-7],[-2,-5],[-6,-14],[-11,-14],[-3,-6],[-4,-7],[-3,-1],[-6,-20],[-6,-3],[-3,-3],[-2,-12],[0,-10],[-3,-12],[-4,-5],[0,-13],[-1,-7],[-3,-4],[0,-2],[0,-1],[-6,-7],[-1,-8],[-3,-4],[-3,-8],[0,-3],[0,-5],[0,-11],[-3,-3],[-4,-9],[0,-11],[-2,-9],[-5,-22],[-2,-22],[-2,-8],[-6,-14],[-4,-19],[-5,-9],[-10,-27],[-4,-7],[-6,-4],[-2,-2],[-6,-10],[-5,-7],[-1,-6],[1,-6],[-8,-5],[-5,-10],[-6,-9],[-6,-6],[-7,-13],[-4,-5],[-5,-13],[-7,-6],[-2,-9],[4,-6],[1,-1],[-2,-3],[-5,-4],[0,-6],[-4,-2],[-9,1],[-6,0],[-10,-16],[-2,-11],[-6,-10],[-2,-4],[-1,-3],[-4,-6],[-6,-4],[-1,0],[-1,0],[-7,-14],[0,-7],[-1,-7],[0,-5],[-1,-3],[-3,-5],[-3,-12],[-1,-3],[-1,-10],[0,-4],[-1,-6],[-7,-13],[-1,-11],[0,-14],[-1,-6],[-1,-22]],[[9862,9674],[-28,6],[-13,4],[-9,2],[-9,8],[-8,8],[-19,20]],[[9776,9722],[10,6],[2,2],[5,6],[30,45],[15,23]],[[9838,9804],[46,-8]],[[9838,9804],[11,16],[5,10],[5,14],[4,15],[1,11],[0,10],[-3,23]],[[9865,9624],[-83,23],[-5,-25]],[[9777,9622],[-26,7],[4,26],[3,13],[1,5],[0,5],[3,16],[4,10],[4,8],[6,10]],[[9831,9559],[-22,6],[-25,6]],[[9784,9571],[4,24],[5,23],[-16,4]],[[9727,9485],[5,26]],[[9732,9511],[4,26],[4,24],[40,-10],[4,20]],[[9732,9511],[-4,3],[-60,15]],[[9673,9553],[0,4],[9,27],[9,23],[12,24],[4,7],[12,18],[17,21],[14,18],[13,18],[19,31],[7,15],[11,28],[9,36]],[[9723,9461],[-43,12],[-3,0],[-1,-3],[-3,-17],[-1,-17],[0,-8],[1,-6],[1,-10],[3,-13],[8,-24],[9,2],[15,-3]],[[9233,6314],[-7,-25],[-22,11],[-7,-23]],[[9197,6277],[-10,5],[-31,16],[-10,5]],[[9146,6303],[7,24],[8,23]],[[9274,6238],[-9,5],[-58,29],[-10,5]],[[9240,6335],[17,-9],[18,-8],[17,-9],[2,-1]],[[9294,6308],[-5,-18],[-5,-20],[-10,-32]],[[9293,6387],[21,-89],[-20,10]],[[9365,6386],[2,-11],[0,-11],[3,-6],[1,-12],[4,-11],[2,-19],[1,0],[6,-21],[2,-3],[9,2],[3,1],[4,0],[4,-3],[1,-1],[-1,5],[4,1],[27,-135]],[[9437,6162],[-43,20],[-3,2],[-5,1],[-4,2],[-35,17],[-8,1]],[[9339,6205],[-8,4],[-36,18],[-5,2],[-6,3],[-10,6]],[[9298,6153],[-45,23]],[[9253,6176],[3,7],[4,11],[8,21],[6,23]],[[9339,6205],[8,-30],[8,-30],[3,-12],[2,-12],[-26,13],[-36,19]],[[9253,6176],[-8,-15],[-72,36]],[[9173,6197],[5,16],[2,8],[4,12],[6,22],[7,22]],[[9298,6153],[-6,-16],[-4,-10],[-4,-10],[18,-10],[19,-4],[3,7],[4,9],[33,-18],[1,-2],[-1,-8],[-1,-11],[0,-2]],[[9360,6078],[-3,1],[-14,5],[-8,3],[-9,3],[-10,4],[-10,3],[-7,3],[-31,11],[-9,3],[-6,2],[-4,2],[-6,2],[-9,5],[-7,3],[-5,2],[-5,3],[-4,2],[-2,1],[-2,1],[-5,3],[-3,2],[-2,1],[-3,2],[-3,1],[-20,11],[-5,2],[11,-11],[-8,5],[-6,3],[-2,1],[-3,2],[-2,1],[-3,1],[-8,3],[-4,1],[-5,1],[-5,2],[-7,1],[-5,1],[-6,1],[-11,1],[-6,0],[-2,1],[-3,0],[-3,0],[-4,1],[-4,0],[-3,0],[-4,1],[-4,1],[-4,0],[-3,1],[-4,1],[-3,1],[-4,2],[-3,1],[-3,1],[-1,1]],[[9046,6184],[2,7]],[[9048,6191],[7,23],[2,7],[1,4],[3,10],[9,26],[14,48]],[[9084,6309],[5,-2],[-6,-23],[-6,-20],[-5,-16],[10,-6],[41,-20]],[[9123,6222],[-2,-11],[-3,-8],[14,-7],[12,-6],[24,-12],[5,19]],[[9123,6222],[2,17],[3,9],[4,11],[7,22],[7,22]],[[9084,6309],[7,23]],[[9091,6332],[5,-3],[10,-5],[31,-16],[9,-5]],[[9091,6332],[21,70],[20,65]],[[9084,6309],[-6,3],[-3,2],[-14,7],[-29,15]],[[9032,6336],[2,2],[7,22],[4,16]],[[9045,6376],[11,-6],[9,-4],[5,15],[8,27],[4,11],[4,12],[-13,7],[-7,4]],[[9066,6442],[2,5],[0,2],[1,1],[4,12],[2,4]],[[9075,6466],[7,-4],[28,-14],[10,-5],[7,24],[7,26]],[[9045,6376],[13,43]],[[9058,6419],[1,3],[3,9],[3,7],[1,4]],[[9668,8499],[-23,7],[-9,2]],[[9636,8508],[-96,24],[-1,0],[-1,-2],[-8,-38]],[[9530,8492],[-8,-40]],[[9522,8452],[-66,16]],[[9456,8468],[4,22],[12,59]],[[9472,8549],[14,67]],[[9636,8508],[2,-23],[-20,5],[4,-37],[-1,-4],[-4,0],[-70,18],[-2,1],[0,2],[3,17],[-18,5]],[[9644,8420],[-56,15],[-66,17]],[[9469,8308],[-16,25],[-12,20],[-4,16],[1,13]],[[9438,8382],[5,21],[5,23],[4,21],[4,21]],[[9648,8374],[-20,5],[-44,11],[-55,15],[-3,-1],[-2,-3],[-3,-18],[-5,-21]],[[9516,8362],[-11,2],[-3,-21],[-7,-34]],[[9495,8309],[-13,4],[-4,0],[-4,-2],[-5,-3]],[[9653,8327],[-77,19],[-60,16]],[[9631,8287],[-76,19],[-2,-12],[-19,5],[-20,5],[-19,5]],[[9475,8269],[2,12],[0,8],[-2,8],[-6,11]],[[7032,4840],[-4,3],[-4,3],[-21,15],[-21,16]],[[6982,4877],[-41,30],[-3,3],[-1,1],[-3,-2],[-7,-7],[-12,-11],[-7,-5],[-1,-3],[-8,-7]],[[6899,4876],[-8,-6],[-7,-7],[-7,-5],[-10,-7]],[[6867,4851],[-30,14],[-10,5],[-3,1],[0,1]],[[6824,4872],[5,4],[5,4],[4,3],[7,4],[4,3],[4,2],[9,3],[4,2],[4,2],[6,2],[6,1],[8,2],[10,3],[7,2],[7,3],[7,2],[6,3],[3,1],[2,1],[1,1],[3,1],[3,2],[4,3],[9,6],[3,2],[7,5],[10,9],[2,2],[11,10],[6,6]],[[6991,4966],[2,-4],[89,-65]],[[7082,4897],[-15,-19],[-18,-19],[-2,-3],[-5,-5],[-8,-10],[-2,-1]],[[8792,5843],[-9,5],[-62,34],[-8,4]],[[8713,5886],[3,10],[5,12]],[[8807,5880],[-15,-37]],[[8792,5843],[-8,-21]],[[8784,5822],[-9,5],[-9,5]],[[8766,5832],[-27,15],[-9,4],[-4,-9]],[[8726,5842],[-8,5],[-9,4],[-9,5]],[[8700,5856],[8,20],[5,10]],[[8709,5799],[9,22]],[[8718,5821],[4,10],[4,11]],[[8766,5832],[-4,-10],[-4,-10],[-9,5],[-9,5],[-13,-33]],[[8784,5822],[-21,-53]],[[8640,5863],[8,-5],[61,-33],[9,-4]],[[8648,5884],[9,-4],[35,-19],[8,-5]],[[8627,5896],[7,19]],[[8612,5852],[-3,2],[-11,6],[-31,17],[-14,8],[10,24],[-4,2],[1,3]],[[8560,5914],[6,15],[-8,5]],[[8597,5812],[-3,1],[-43,24],[-9,5],[-9,5]],[[8533,5847],[7,17],[-18,11],[20,49],[18,-10]],[[8533,5847],[-9,5],[-31,17]],[[8493,5869],[-21,12],[-19,10]],[[8496,5756],[-40,22]],[[8456,5778],[4,10],[4,11],[13,31],[8,20]],[[8485,5850],[8,19]],[[8533,5847],[-8,-20],[-8,-19],[-8,-21],[-5,-11]],[[8504,5776],[-4,-10],[-4,-10]],[[8485,5850],[-39,21],[-9,-19],[-40,21]],[[8397,5873],[8,20],[8,20]],[[8456,5778],[-41,23],[-8,-20],[-7,-17]],[[8324,5852],[11,26],[1,5]],[[8336,5883],[5,-2],[16,-9],[16,-9],[16,-9],[8,19]],[[8336,5883],[8,19]],[[8344,5902],[8,20],[8,20]],[[8344,5902],[-3,2],[-34,19],[-13,8],[8,19]],[[8302,5950],[8,20],[14,-8],[4,8],[2,2],[4,9]],[[8334,5981],[17,-9],[4,9],[2,2],[4,8],[14,-8],[2,-1]],[[8324,5852],[-3,1],[-31,17],[-73,41]],[[8217,5911],[7,18],[24,67],[18,48]],[[8266,6044],[17,-10],[-16,-40],[-8,-19],[43,-25]],[[8266,6044],[7,21]],[[8273,6065],[11,-7],[51,-28]],[[8335,6030],[-8,-20],[14,-8],[-4,-8],[1,-4],[-4,-9]],[[8335,6030],[9,22],[28,-16]],[[8273,6065],[3,7],[5,13]],[[8281,6085],[6,20]],[[8287,6105],[20,-12],[26,-14],[15,-8]],[[8287,6105],[5,14],[7,20],[13,36],[1,3]],[[8281,6085],[-3,2]],[[8278,6087],[-3,1],[-7,4],[-9,5],[-12,6],[0,10]],[[8247,6113],[7,20],[15,42],[15,-7],[7,18],[1,3]],[[8292,6189],[3,-1],[16,-9],[2,-1]],[[7547,5461],[-53,39],[-3,2],[-2,1],[-3,2],[-2,2],[-2,2]],[[7482,5509],[9,16],[9,17],[11,16],[3,3]],[[7514,5561],[3,7],[5,10],[2,3],[3,-2],[2,-2],[3,-2],[23,-16],[9,-9],[2,-3],[4,-3],[15,-11]],[[7585,5533],[-1,-3],[-10,-18],[60,-44]],[[7585,5533],[9,16],[8,16],[4,7]],[[7606,5572],[60,-44]],[[7606,5572],[5,8]],[[7611,5580],[9,-6],[19,36],[6,4],[6,-1],[8,-6],[15,-11],[21,-14],[10,18]],[[7705,5600],[50,5],[8,-4],[7,-5]],[[7611,5580],[-6,5],[12,22],[-2,9],[6,4],[10,11],[16,4],[10,0],[48,-35]],[[7729,5708],[1,-10],[-1,-5],[-18,-33],[23,-18],[12,13],[12,6],[12,4],[12,-3]],[[7782,5662],[10,-3],[6,-5]],[[7606,5572],[-53,39],[-4,3]],[[7637,5775],[3,-2],[7,-5],[36,-26],[3,-2],[2,-2],[2,-1],[8,-4],[3,-1],[3,0],[8,-1],[10,-1],[3,1],[2,0],[0,-3],[0,-3],[2,-17]],[[7729,5708],[13,1],[4,0],[42,-30],[-5,-10],[-1,-7]],[[7777,5747],[-2,-4],[-3,-5],[0,-2],[1,-1],[1,-1],[47,-35]],[[7660,5817],[3,-2],[3,-2],[49,-36],[39,-29],[2,-1],[1,-2],[1,-3],[2,1],[5,2],[3,1],[4,0],[5,1]],[[7679,5853],[3,-1],[2,-2],[27,-19]],[[7711,5831],[23,-18],[58,-41],[-10,-18],[-5,-7]],[[7711,5831],[1,4],[8,13],[9,16],[2,1],[3,-1],[30,-22],[7,5]],[[7771,5847],[6,-3],[4,-7],[16,-13],[11,8],[29,-21],[7,20],[4,11],[5,8]],[[7853,5850],[17,-13]],[[7771,5847],[1,17]],[[7772,5864],[7,0],[11,5],[5,6],[6,13]],[[7801,5888],[12,-9],[27,-20],[13,-9]],[[7801,5888],[-17,13],[-2,1],[10,18]],[[7792,5920],[9,18],[3,5],[2,4],[0,2],[0,3],[-1,4]],[[7772,5864],[-8,2],[-5,4],[-47,33],[5,9],[7,11],[7,8],[2,2],[3,2],[7,4],[24,7],[-1,-8],[26,-18]],[[7679,5853],[13,24],[16,29],[0,1],[19,34],[17,31],[1,3]],[[7636,5886],[22,41],[26,47],[-15,11]],[[7669,5985],[16,32],[2,3]],[[7687,6020],[10,-8],[1,-1],[29,-25],[4,-3],[3,-2],[5,-2],[3,-2],[3,-2]],[[7621,5897],[10,22],[-11,8],[-8,0]],[[7612,5927],[1,22],[3,10],[4,11],[3,9],[0,13]],[[7623,5992],[8,2],[7,-1]],[[7638,5993],[25,-18],[6,10]],[[7562,5946],[11,19],[9,16],[-1,5],[-14,10],[11,19],[9,19]],[[7587,6034],[21,-16],[9,-9],[1,-3],[5,-14]],[[7612,5927],[-17,0],[-7,1],[-4,1],[-22,17]],[[7587,6034],[-15,10]],[[7572,6044],[12,21],[13,13]],[[7597,6078],[9,-14],[1,-5],[-6,-5],[1,-5],[13,-10],[3,1],[3,4],[2,1],[13,-12],[14,-13],[1,-5],[-13,-22]],[[7597,6078],[14,13],[2,3]],[[7613,6094],[2,-3],[9,-12],[9,-10],[10,-11],[13,-13],[15,-13],[16,-12]],[[7613,6094],[-2,4],[-11,16],[-5,9],[-10,17],[-2,4]],[[6559,2837],[-53,39]],[[6506,2876],[11,22],[14,24],[10,18],[6,11]],[[6489,2725],[-19,5],[-10,7],[-6,9],[-2,10],[0,6],[3,7],[19,35],[12,22],[-11,8]],[[6475,2834],[13,20],[3,0],[0,5],[11,20],[4,-3]],[[6559,2837],[-12,-23],[-13,-23],[-15,-22],[-11,-18],[-15,-15],[-4,-11]],[[6489,2725],[-2,-8],[-2,-22]],[[6485,2695],[-18,-3],[-9,-6],[-10,-9],[-10,-16],[-4,-18],[0,-14]],[[6434,2629],[-9,0],[-11,-1],[1,-75],[4,-4],[5,-3],[58,-43],[4,0],[10,19]],[[6496,2522],[11,-8],[2,-1]],[[6492,2483],[-1,1],[-68,50],[-4,0],[-13,16],[-5,4]],[[6399,2727],[12,-4],[14,-9],[19,37],[-8,6],[39,77]],[[9334,6927],[-22,6]],[[9492,7435],[10,15],[12,18],[2,3],[10,16],[2,3],[20,30],[31,-10],[2,11],[5,13],[7,30],[-13,4],[14,20],[14,22]],[[9641,7660],[15,-3],[17,-6],[10,-3]],[[9683,7648],[-3,-6],[-3,-13],[1,-2],[0,-2],[-4,-4],[-1,-3],[1,-2],[11,-10],[21,35],[5,-2],[-36,-57],[-5,-7],[-3,3],[1,1],[-1,3],[-2,0],[-13,-10],[-5,-4],[-4,-5],[-12,-10],[-5,-2],[-5,-3],[0,-3],[-2,-7],[0,-2],[8,-4],[0,-1],[-4,-2],[-4,1],[-2,3],[-2,0],[-1,-1],[-3,-4],[-2,-2],[-1,-2],[1,-6],[2,-3],[8,-4],[1,-2],[1,-1],[-1,-1],[-2,0],[-2,0],[-5,4],[-2,0],[-1,-1],[-3,-3],[-1,-4],[0,-15],[-3,-3],[-5,-14],[2,-3],[7,-1],[4,4],[1,9],[3,-1],[0,-3],[2,-1],[2,-5],[5,9],[3,-2],[-36,-56],[-2,2],[-1,0],[-16,-9],[0,-3],[-1,-1],[-7,2],[0,1],[-1,0],[-31,-27],[-4,-9],[1,-8],[46,16],[1,-5],[-50,-17],[-2,-5],[-1,-6],[-2,-1],[-3,-2],[-10,-10],[-4,-18],[0,-1],[9,-5],[5,-7],[4,-4],[2,-5],[3,0],[14,22],[4,-3],[-19,-28],[-6,-9],[-30,-46],[-4,-10],[-34,-81],[-11,-26],[-3,-9],[-22,-92],[-22,-94],[-4,1],[1,2],[-4,0],[-3,-1],[0,-4],[-6,-1],[-2,0],[-1,-3],[0,-1]],[[9774,7870],[0,-4],[-1,-1],[0,-1],[-2,-10],[8,-8],[-4,0],[-4,3],[-4,2],[-2,0],[-2,-1],[-2,-1],[-8,-14],[-3,-5],[-3,-9],[-3,-5],[-9,-9],[-5,-7],[-8,-18],[-2,-8],[0,-4],[-6,-16],[0,-1],[-2,-12],[-5,-7],[-10,-8],[-4,-6],[-7,-14],[0,-4],[0,-7],[11,-8],[2,-5],[-1,-3],[-2,-2],[-6,-15],[-3,-3],[-4,-10],[0,-1]],[[9261,6900],[14,44]],[[9203,6858],[5,16],[5,17],[6,22],[7,25],[5,16],[1,2]],[[9162,6870],[4,16],[6,16],[6,22],[7,25],[5,19]],[[9116,6865],[5,17],[5,16],[5,16],[6,22]],[[9137,6936],[6,25],[5,19]],[[9156,6852],[-7,3],[-24,7],[-9,3]],[[9066,6863],[5,16],[9,-2],[36,-12]],[[9047,6869],[-11,4],[-11,4],[3,8],[3,7],[4,14]],[[9035,6906],[5,16]],[[9040,6922],[33,-9],[8,-2],[6,16],[6,22],[9,-3],[25,-7],[10,-3]],[[9066,6863],[-9,3],[-10,3]],[[9040,6922],[2,9],[2,8],[7,22],[7,23],[5,18]],[[8990,6920],[6,15],[4,13],[1,4],[1,2],[6,19],[8,24],[6,18]],[[9035,6906],[-9,3],[-28,8],[-8,3]],[[9047,6869],[-8,-25],[-11,4],[-11,5],[-8,-20],[-41,17]],[[8968,6850],[2,7],[7,23]],[[8977,6880],[7,19],[6,21]],[[9049,6805],[-3,-8],[-9,4],[-33,14]],[[9004,6815],[-41,18],[0,1]],[[8963,6834],[5,16]],[[9074,6740],[-32,15],[-9,5],[-8,4],[-33,16]],[[8992,6780],[6,17],[6,18]],[[8950,6799],[7,17],[6,18]],[[8992,6780],[-9,-25],[-8,-22],[-9,5],[-23,11],[-9,4]],[[9008,6691],[-9,5],[-23,11],[-9,5],[-9,4],[-23,11],[-8,5]],[[9001,6670],[-8,-21],[-9,5],[-23,11],[-9,4]],[[8952,6669],[-9,5],[-23,10],[-9,5]],[[9034,6629],[-8,-23],[-9,-26],[-9,-25]],[[9008,6555],[-10,5],[-22,11],[-9,5]],[[8967,6576],[9,24],[9,26],[-9,4],[-23,12],[-9,4],[8,23]],[[8967,6576],[-9,4],[-23,11],[-10,5]],[[8925,6596],[-9,4],[-23,12],[-8,4]],[[8990,6507],[-8,-24],[-9,5],[-23,11],[-9,4]],[[8925,6596],[-8,-25],[-8,-24],[31,-15],[10,-5],[8,-4],[23,-11],[9,-5]],[[9049,6535],[-9,-25]],[[9040,6510],[-9,5],[-23,11],[-9,5],[-9,-24]],[[9008,6555],[9,-4],[13,-6],[10,-5],[9,-5]],[[9058,6419],[-2,1],[-13,7],[-8,4],[-19,9],[-16,-45],[-35,18],[-47,24]],[[9040,6510],[-8,-23],[8,-5],[23,-11],[10,-4],[2,-1]],[[9049,6535],[9,-5],[23,-11],[10,-5]],[[9032,6336],[-7,-23]],[[9025,6313],[-45,24],[-37,18],[7,18],[1,4],[-46,24]],[[9025,6313],[-10,-34],[-6,-23],[-1,-4],[-3,-10],[-3,-7]],[[9048,6191],[-1,0],[-3,-2],[-2,-1],[-2,-1],[-1,0],[0,1],[-3,1],[-2,2],[-3,1],[-3,3],[-3,2],[-3,2],[-2,3],[-1,0],[-1,1],[0,2],[-3,8],[-2,6],[-5,8],[-6,8]],[[9046,6184],[-15,-53],[-32,-108],[-9,-33],[-10,-50],[-7,-29],[-6,-29]],[[8886,5628],[-7,-20],[-28,-87],[-6,-18]],[[8845,5503],[-7,3],[2,6],[4,9],[2,6],[0,1],[4,10],[2,5],[4,13],[4,13],[3,9],[-3,2],[-1,1],[-6,3],[-15,8]],[[8838,5592],[6,9],[5,8],[6,13],[-9,5],[-8,4],[-10,5],[-9,5],[-9,5],[-13,7]],[[8797,5653],[8,20],[8,19]],[[8813,5692],[4,11],[25,69],[0,1],[16,46],[14,38]],[[8872,5857],[7,19],[1,1],[0,2],[1,2]],[[8872,5857],[-14,8],[-10,6],[-11,-27],[-19,10],[6,17],[-17,9]],[[5886,4124],[-6,3],[-16,8],[-18,8],[-12,-35],[0,-1],[0,-1],[26,-28],[-12,-16],[-13,-16]],[[5835,4046],[-18,-23]],[[5817,4023],[-14,14],[-13,15],[-14,14],[-3,3],[-12,12]],[[5761,4081],[31,41],[5,7],[13,27],[1,4],[6,16],[73,-34],[1,-1],[0,-3],[-5,-14]],[[5913,4145],[-1,-5],[-8,-24]],[[5904,4116],[-18,8]],[[5761,4081],[-13,14],[-30,31],[-3,3],[-16,18]],[[5699,4147],[-27,27],[-3,8]],[[5669,4182],[-1,14]],[[5668,4196],[22,5],[28,2],[23,1],[26,-2],[11,-1],[10,-2]],[[5788,4199],[5,-2],[15,-5],[3,-1],[5,-2],[36,-14],[1,-1],[8,-4],[52,-24],[0,-1]],[[5682,3982],[-61,63]],[[5621,4045],[11,15],[13,17]],[[5645,4077],[11,13],[10,14],[6,7]],[[5672,4111],[5,7],[9,12],[2,2],[11,15]],[[5761,4081],[-14,-17],[-14,-18],[-13,-18],[-26,-33],[-6,-7],[-6,-6]],[[5672,4111],[-15,15],[-11,-15],[-2,-1],[-2,1],[-27,29],[-4,16],[18,9],[19,8],[21,9]],[[5645,4077],[-2,2],[-58,62],[-4,-2],[-13,-12],[-11,11],[-3,4]],[[5554,4142],[61,35],[23,10],[26,8],[4,1]],[[5621,4045],[-66,69]],[[5555,4114],[-13,15],[-6,2]],[[5536,4131],[18,11]],[[8278,6087],[-9,-6],[-5,1],[-25,-10]],[[8169,6240],[2,-1],[15,-5]],[[8186,6234],[-1,-3],[0,-5],[10,-28],[9,4],[33,-13],[-11,-30],[14,-12],[5,-4],[1,-2],[1,-3],[0,-5],[0,-20]],[[8186,6234],[72,-29],[3,-1],[2,-1],[16,-6],[11,-6],[2,-2]],[[8195,6317],[72,-40],[9,21]],[[8276,6298],[45,-25],[8,21],[7,20],[7,21],[10,-5],[11,-6],[3,-2]],[[8211,6358],[73,-40]],[[8284,6318],[-8,-20]],[[8292,6339],[-8,-21]],[[8218,6378],[74,-39]],[[8234,6413],[70,-43]],[[8304,6370],[-4,-11],[-8,-20]],[[8332,6434],[-1,-3],[-6,-14],[-8,-20],[35,-19],[-9,-18],[-34,18],[-5,-8]],[[8371,6333],[-3,2],[-64,35]],[[6019,3434],[-11,10],[-6,20],[-12,-13],[-13,13]],[[5977,3464],[-4,5],[-5,2],[-6,7]],[[5962,3478],[12,16],[13,17]],[[5987,3511],[18,24],[16,21],[2,2]],[[6023,3558],[7,-6],[5,-8],[17,-18],[5,-4],[8,-7],[4,-2],[5,-4]],[[6074,3509],[-2,-2],[-15,-26],[-31,-39],[-7,-8]],[[7432,5545],[50,-36]],[[7459,5596],[12,-8],[30,-22],[5,-5],[3,0],[5,0]],[[7471,5617],[9,17],[8,14],[1,4]],[[7489,5652],[2,4]],[[7363,5696],[10,17]],[[7373,5713],[9,17]],[[7382,5730],[54,-39]],[[7436,5691],[53,-39]],[[7436,5691],[10,20],[6,10],[-54,39]],[[7398,5760],[8,11]],[[7382,5730],[10,20]],[[7392,5750],[4,7],[2,3]],[[7392,5750],[-9,6],[-1,0],[-17,12],[-16,12],[-8,6],[-2,3]],[[7339,5789],[3,7],[8,15]],[[7373,5713],[-54,39],[9,17]],[[7328,5769],[11,20]],[[7242,5785],[9,17],[9,17]],[[7260,5819],[68,-50]],[[7260,5819],[12,22],[10,18]],[[7282,5859],[16,-11]],[[7298,5848],[52,-37]],[[7298,5848],[18,32],[9,18],[25,-18]],[[7350,5880],[-2,-6],[-1,-18],[-2,-14],[-6,-12],[16,-11]],[[7282,5859],[5,9]],[[7287,5868],[13,26],[18,33]],[[7318,5927],[26,-17],[16,-12]],[[7360,5898],[-10,-18]],[[7360,5898],[8,-8],[13,-16],[11,-18]],[[7366,5916],[8,-5],[6,-4]],[[7380,5907],[15,-18],[22,-38]],[[7417,5851],[-14,-13]],[[7360,5898],[4,9],[2,9]],[[7392,5923],[13,-15],[10,-16],[16,-27]],[[7431,5865],[-5,-7],[-9,-7]],[[7380,5907],[3,7],[1,10],[8,-1]],[[7392,5923],[19,34]],[[7411,5957],[22,-17],[16,-11]],[[7449,5929],[-4,-10],[-3,-12],[-1,-15],[-4,-16],[-6,-11]],[[7366,5916],[0,7],[-2,8],[0,6],[0,7],[2,6],[3,7]],[[7369,5957],[12,22]],[[7381,5979],[15,-11],[15,-11]],[[7381,5979],[22,42],[10,14],[9,7],[2,2]],[[7424,6044],[3,-2],[12,-10],[6,-6],[5,-7],[4,-6],[3,-8],[3,-10],[2,-16]],[[7462,5979],[3,-28],[1,-7],[2,-10],[1,-3],[-3,-1],[-6,-3],[-5,-1],[-6,3]],[[7369,5957],[-17,13],[10,19],[-1,5],[-18,14]],[[7343,6008],[14,9],[10,18],[9,17],[10,17],[1,2]],[[7387,6071],[16,-12],[18,-13],[3,-2]],[[7490,6111],[9,-20]],[[7499,6091],[-54,-34],[-21,-13]],[[7387,6071],[13,24]],[[7400,6095],[16,-13],[11,22],[5,8],[9,16],[4,1],[22,-16],[5,-13],[18,11]],[[7400,6095],[11,20],[-15,11],[14,26],[-1,5],[-13,9],[7,20]],[[7403,6186],[33,-25],[16,-12],[18,-13]],[[7470,6136],[12,-9],[8,-16]],[[7387,6071],[-78,59]],[[7357,6213],[11,8],[13,7],[12,6],[8,8]],[[7401,6242],[15,17],[15,16]],[[7431,6275],[6,-7],[2,-9],[-2,-12],[-24,-43]],[[7413,6204],[-10,-18]],[[7546,6172],[-48,-29],[-18,13],[-10,-20]],[[7413,6204],[17,-12],[16,-13],[29,53],[16,-12],[16,-13],[10,-7],[10,9],[10,-19],[9,-18]],[[7565,6184],[-3,-2],[-16,-10]],[[7431,6275],[29,32]],[[7460,6307],[7,7],[9,-11],[3,-7],[9,-16],[8,-12],[15,-20],[12,9],[3,3]],[[7583,6144],[-3,-2],[-16,-10],[-65,-41]],[[7520,5979],[-8,5],[-8,3],[-22,-5]],[[7482,5982],[-20,-3]],[[7572,6044],[-4,-5],[-7,-4],[-4,-3],[-9,-7],[-8,-9],[-9,-14],[-11,-23]],[[7562,5946],[-11,9]],[[7551,5955],[-17,12],[-14,12]],[[7534,5912],[-46,35],[-2,12],[-4,23]],[[7551,5955],[-11,-20],[-6,-23]],[[7587,5836],[-65,48]],[[7522,5884],[8,16],[4,12]],[[7471,5822],[31,25],[9,17],[1,2],[10,18]],[[8458,6764],[4,22],[6,20],[5,19]],[[8473,6825],[7,20]],[[8613,6778],[-1,-2],[-3,-9],[-1,-2],[0,-2],[-6,-22],[-1,-3]],[[8601,6738],[-2,1],[-36,9],[-35,7]],[[8528,6755],[-25,5],[-45,4]],[[8521,6693],[-17,2]],[[8504,6695],[2,33],[0,3],[2,0],[12,-1],[3,-1],[5,26]],[[8601,6738],[0,-2],[-4,-23]],[[8597,6713],[-3,0],[-32,8],[-3,1],[0,-3],[-2,-27],[-15,4],[-17,1],[-4,-4]],[[8513,6626],[5,25],[2,26],[1,16]],[[8597,6713],[0,-4],[-3,-35],[-1,-17],[-2,-14],[0,-3],[-1,-3],[-2,-13],[-4,-19]],[[8584,6605],[-2,0],[-17,5],[-17,5],[-18,6],[-17,5]],[[8736,6670],[-8,-11],[-50,38],[-16,-44],[55,-26],[0,-3],[0,-3],[2,-11],[-11,-24],[-38,15],[-38,20],[-12,-53],[3,-10]],[[8623,6558],[-3,1],[-7,3],[-2,1],[-6,3],[-9,2],[-2,0],[-17,6]],[[8577,6574],[4,16],[3,15]],[[8597,6713],[14,-4],[3,-1],[2,-1],[15,-4],[3,-2],[15,-5],[1,15],[3,17]],[[8653,6728],[16,-10],[18,-12],[18,-13],[17,-12],[14,-11]],[[8631,6817],[14,-10],[14,-11],[8,-6],[8,-5]],[[8675,6785],[-2,-3],[-7,-15],[-6,-14],[-3,-10],[-4,-15]],[[7460,6307],[-13,15],[-17,-18],[-13,10],[4,10],[8,8],[-46,34],[-5,3],[-7,0],[-6,-2],[-4,-4],[-4,-5],[-6,-11],[-16,11]],[[7416,6399],[17,-12],[15,-12],[2,-1],[10,-8],[5,-5],[5,-6],[4,-6],[6,-8],[2,-4],[2,-3],[11,-19]],[[7322,4905],[-56,41]],[[7266,4946],[5,9],[6,10],[56,-42]],[[7333,4923],[-6,-9],[-5,-9]],[[7312,4885],[-56,41],[-25,18]],[[7231,4944],[7,10],[5,9]],[[7243,4963],[23,-17]],[[7322,4905],[-4,-10],[-6,-10]],[[7301,4864],[-56,42],[-25,18]],[[7220,4924],[5,9],[6,11]],[[7312,4885],[-6,-11],[-5,-10]],[[7290,4844],[-56,42],[-25,18]],[[7209,4904],[6,10],[5,10]],[[7301,4864],[-5,-9],[-6,-11]],[[7290,4844],[-10,-18]],[[7280,4826],[-10,7],[-47,34],[-15,12],[-9,6]],[[7199,4885],[5,10],[5,9]],[[7280,4826],[-10,-19]],[[7270,4807],[-10,7],[-72,54]],[[7188,4868],[11,17]],[[7178,4851],[5,8],[5,9]],[[7270,4807],[-5,-8],[-4,-9]],[[7261,4790],[-83,61]],[[7169,4833],[5,10],[4,8]],[[7261,4790],[-5,-8],[-4,-9]],[[7252,4773],[-83,60]],[[7252,4773],[-6,-11],[-6,-11],[-51,37],[-32,23]],[[7157,4811],[6,12],[6,10]],[[7252,4773],[31,-24],[2,0],[-6,-12],[-7,-11],[-6,-11],[-5,-11]],[[7261,4704],[-33,25]],[[7228,4729],[-82,60]],[[7146,4789],[6,12],[5,10]],[[7214,4704],[-82,60]],[[7132,4764],[7,14],[7,11]],[[7228,4729],[-7,-12],[-7,-13]],[[7200,4678],[-63,46],[-19,14]],[[7118,4738],[14,26]],[[7214,4704],[-8,-14],[-6,-12]],[[7200,4678],[-9,-17],[-23,16],[-6,-10]],[[7162,4667],[-58,44]],[[7104,4711],[5,11],[9,16]],[[7151,4646],[-18,14],[-2,-4],[-2,-9],[-5,-13]],[[7124,4634],[-16,8],[-27,12],[-2,3]],[[7079,4657],[2,1],[5,17],[0,2]],[[7086,4677],[6,14],[6,11],[6,9]],[[7162,4667],[-5,-10],[-6,-11]],[[7133,4610],[-57,26]],[[7076,4636],[2,9],[1,8],[0,4]],[[7124,4634],[9,-4],[7,-4],[-4,-9],[-3,-7]],[[7125,4591],[-55,26]],[[7070,4617],[3,10],[3,9]],[[7133,4610],[-2,-3],[-3,-6],[-3,-10]],[[7118,4571],[-10,4],[-45,22]],[[7063,4597],[4,12],[3,8]],[[7125,4591],[-3,-9],[-4,-11]],[[6952,4806],[-42,23]],[[6910,4829],[-36,18],[-7,4]],[[6899,4876],[24,-13],[14,-7],[14,-8],[14,-7]],[[6965,4841],[-3,-9],[-3,-8],[-3,-9],[-4,-9]],[[6933,4749],[-21,10],[-9,4]],[[6903,4763],[-10,4],[-4,3]],[[6889,4770],[4,10],[3,9],[3,8],[3,9],[4,11],[4,12]],[[6952,4806],[-3,-9],[-4,-11],[-3,-8],[-3,-9],[-3,-9],[-3,-11]],[[6889,4770],[-38,18],[-5,2]],[[6846,4790],[4,10],[3,9],[3,9],[3,9],[4,11],[4,13]],[[6889,4724],[-9,5],[-43,20],[-9,5]],[[6828,4754],[7,19],[6,19]],[[6841,4792],[5,-2]],[[6903,4763],[-7,-19],[-7,-20]],[[6876,4687],[-61,29]],[[6815,4716],[4,11],[2,9],[7,18]],[[6889,4724],[-3,-10],[-3,-8],[-3,-8],[-4,-11]],[[6861,4644],[-61,29]],[[6800,4673],[3,10],[4,9],[3,11],[5,13]],[[6876,4687],[-4,-13],[-4,-12],[-4,-9],[-3,-9]],[[6846,4603],[-61,29]],[[6785,4632],[4,11],[4,10]],[[6793,4653],[3,10],[4,10]],[[6861,4644],[-4,-10],[-3,-10],[-4,-10],[-4,-11]],[[6834,4567],[-61,29]],[[6773,4596],[6,18],[3,9],[3,9]],[[6846,4603],[-3,-9],[-3,-9],[-6,-18]],[[6898,4536],[-2,1],[-62,30]],[[6846,4603],[64,-30]],[[6910,4573],[-4,-10],[-3,-8],[-2,-5],[1,-3],[-4,-11]],[[6861,4644],[32,-15],[31,-15]],[[6924,4614],[-4,-10],[-3,-10],[-3,-10],[-4,-11]],[[6876,4687],[63,-31]],[[6939,4656],[-5,-12],[-3,-11],[-4,-10],[-3,-9]],[[6889,4724],[10,-4],[45,-21],[9,-4]],[[6953,4695],[-4,-10],[-3,-8],[-3,-9],[-4,-12]],[[6933,4749],[26,-12],[10,-5]],[[6969,4732],[-9,-18],[-7,-19]],[[7014,4666],[-10,5],[-39,18],[-2,1],[-10,5]],[[6969,4732],[10,-5],[1,0],[18,-8],[19,-9]],[[7017,4710],[10,-5]],[[7027,4705],[-6,-20],[-7,-19]],[[7000,4627],[-61,29]],[[7014,4666],[-3,-10],[-4,-9]],[[7007,4647],[-3,-9],[-4,-11]],[[6985,4584],[-61,30]],[[7000,4627],[-4,-12],[-4,-12]],[[6992,4603],[-3,-9],[-4,-10]],[[6971,4543],[-23,11],[-16,8],[-22,11]],[[6985,4584],[-3,-9],[-4,-10],[-3,-10],[-4,-12]],[[6971,4543],[-3,-9],[-3,-8],[-7,-19]],[[6862,4436],[-64,30],[-4,3],[-17,9],[-38,18],[6,18],[6,18],[6,18],[6,18],[61,-30],[3,10],[6,15],[1,4]],[[6830,4348],[-66,18]],[[6764,4366],[-10,3],[-51,15],[-39,10],[-49,13],[-4,1],[-2,1]],[[6609,4409],[2,4]],[[6611,4413],[23,62],[13,32],[2,4],[3,8]],[[6652,4519],[15,41],[7,17],[10,27],[2,3],[0,1],[2,5],[12,31]],[[6700,4644],[1,-1],[2,-2],[1,-1],[2,-3],[3,-9],[1,-1],[1,-2],[2,-1],[2,-1],[1,-1],[3,0],[14,-7],[22,-10],[18,-9]],[[6652,4519],[-3,1],[-3,2]],[[6646,4522],[1,3],[6,18],[7,18],[-9,4],[-11,5],[-38,19]],[[6702,4649],[-1,-3],[-1,-2]],[[6646,4522],[-8,4],[-46,22],[-4,2]],[[6588,4550],[4,11],[3,9],[4,10],[3,9]],[[6575,4513],[3,9],[3,9],[4,10],[3,9]],[[6646,4522],[-8,-18],[-7,-18],[-7,3],[-2,1],[-43,20],[-4,3]],[[6568,4493],[-62,30]],[[6506,4523],[7,19],[6,19]],[[6519,4561],[7,18],[7,21],[7,18]],[[6575,4513],[-4,-10],[-3,-10]],[[6569,2685],[-2,0],[-35,5],[-47,5]],[[6496,2522],[-17,12],[17,31],[8,18],[2,15],[-1,18],[-20,-3],[-4,24],[-6,0],[-20,-3],[-21,-5]],[[6402,2406],[-1,148]],[[7401,6242],[-17,-2],[-90,68]],[[7343,6008],[-10,-4],[-15,-3],[-36,0]],[[7318,5927],[-12,10],[-10,12],[-5,7],[-4,10]],[[7287,5966],[-2,8],[-1,5],[-2,22]],[[7259,5922],[-15,11],[-16,12]],[[7287,5966],[-5,-1],[-23,-43]],[[7287,5868],[-23,17],[-1,6],[6,11],[6,8],[-16,12]],[[7282,5859],[-41,32],[-13,10]],[[7228,5901],[-14,11],[-14,10]],[[7228,5901],[-3,-7],[-4,-7],[-2,-3],[-2,-4],[-1,-4],[-4,-6]],[[7212,5870],[-14,9],[-13,10]],[[7185,5889],[-13,10],[-7,4],[-7,5]],[[7187,5824],[-13,10],[-13,10]],[[7161,5844],[4,8],[20,37]],[[7212,5870],[-6,-12],[-9,-17],[-10,-17]],[[7161,5844],[-13,9],[-14,10]],[[7532,5214],[1,-5],[-14,0],[-6,-11],[-12,-18],[-5,-10]],[[7496,5170],[-58,40],[-5,-8],[-4,-7],[-4,-8],[-4,-8]],[[7421,5179],[-20,14]],[[7401,5193],[13,21],[11,20],[-9,7],[-41,30],[-3,2]],[[7478,5254],[15,-11],[15,-11],[24,-18]],[[7401,5193],[-8,6],[-7,5]],[[7386,5204],[-33,25],[-7,4]],[[7354,5145],[-46,33],[10,20],[-5,3],[-4,3],[-2,2],[-1,1],[-3,2],[-38,28]],[[7265,5237],[10,19]],[[7386,5204],[-11,-21],[-11,-19],[-10,-19]],[[7354,5145],[-11,-21]],[[7343,5124],[-46,34]],[[7297,5158],[-9,6],[-5,5],[-4,4],[-1,2]],[[7278,5175],[-3,4]],[[7275,5179],[-1,3],[-2,2],[-1,2],[-2,2],[-3,3],[-6,5],[-8,6],[-5,1],[7,14],[11,20]],[[7389,5090],[-11,-19]],[[7378,5071],[-8,6],[-38,28],[-10,-20],[-46,34]],[[7276,5119],[11,19],[10,20]],[[7343,5124],[37,-28],[9,-6]],[[7276,5119],[-11,-20]],[[7265,5099],[-37,28],[-3,2],[-1,0],[-1,0],[4,7],[14,12],[17,12],[15,10],[0,3],[5,2]],[[7378,5071],[-10,-20],[-11,-19],[-9,-17],[-9,-18]],[[7339,4997],[-9,6],[-29,22],[-8,6]],[[7293,5031],[-9,6],[-29,21],[-8,6]],[[7247,5064],[9,18],[9,17]],[[7274,4996],[-43,31]],[[7231,5027],[5,9],[5,9],[-3,2],[9,17]],[[7293,5031],[-10,-18],[-4,-8],[-5,-9]],[[7344,4944],[-57,42],[-13,10]],[[7339,4997],[-10,-17],[9,-7],[15,-12]],[[7353,4961],[-4,-8],[-5,-9]],[[7344,4944],[-6,-10],[-5,-11]],[[7243,4963],[8,8],[7,7],[9,9],[7,9]],[[6352,1008],[-1,-19]],[[6351,989],[-19,0],[1,46],[-2,5],[-24,-16],[-20,-13],[-18,-14],[6,-9],[-1,-23],[-7,-1],[-1,-26]],[[6211,879],[-2,78]],[[6209,957],[2,8]],[[6211,965],[5,3],[15,11],[22,15],[19,14],[18,15],[22,15],[16,11],[19,18],[28,30],[30,23]],[[6405,1120],[0,-13]],[[6405,1107],[-5,-2],[-15,-23]],[[6385,1082],[-4,-4],[-29,-22],[0,-11],[0,-25],[0,-12]],[[6211,966],[4,23]],[[6215,989],[4,3],[2,-1],[1,-2],[1,-4],[0,-3],[-1,-3],[-2,-3],[-2,-3],[-3,-4],[-4,-3]],[[6351,989],[2,-77]],[[6353,912],[-20,0],[-1,41],[-16,0],[-2,-1],[-1,-1],[-1,-3],[0,-9]],[[6353,912],[0,-77]],[[6180,4293],[-2,1],[-1,1],[-41,19]],[[6101,4396],[7,-28],[18,7]],[[6176,4336],[7,17],[1,3],[-1,12],[18,-3],[3,0]],[[6204,4365],[-1,-8],[-3,-9],[-15,-42],[-5,-13]],[[6024,4170],[-8,-3]],[[6016,4167],[-36,-4],[-35,16],[-12,-3],[-7,4],[-2,1]],[[5924,4181],[3,8]],[[5927,4189],[8,23]],[[5935,4212],[3,-1],[17,-8],[17,-8],[1,1],[1,1],[4,9],[4,5],[5,6],[9,5],[12,5],[9,3],[8,-14]],[[6025,4216],[-5,-5],[-4,-6],[-4,-9],[-5,-16],[0,-2],[1,0],[16,-8]],[[7110,4547],[-9,4],[-47,22]],[[7054,4573],[5,12],[4,12]],[[7118,4571],[-5,-13],[-3,-11]],[[7103,4528],[-55,26]],[[7048,4554],[3,10],[3,9]],[[7110,4547],[-4,-10],[-3,-9]],[[7091,4486],[-18,8],[-40,20]],[[7033,4514],[4,11],[4,10],[4,10],[3,9]],[[7103,4528],[-3,-10],[-3,-10],[-3,-11],[-3,-11]],[[7020,4476],[4,11],[3,9],[3,9],[3,9]],[[7091,4486],[-7,-18],[-7,-19]],[[6971,4543],[62,-29]],[[6985,4584],[63,-30]],[[6992,4603],[62,-30]],[[7000,4627],[63,-30]],[[7007,4647],[63,-30]],[[7014,4666],[9,-5],[38,-17],[8,-4],[7,-4]],[[7027,4705],[9,-5],[38,-17],[12,-6]],[[7017,4710],[3,8],[4,9],[5,9],[5,8],[4,8]],[[7038,4752],[23,-16],[3,-1],[2,-2],[3,0],[8,-2],[2,-1],[10,-7],[15,-12]],[[7038,4752],[5,9],[4,8],[4,8],[4,7],[39,-28],[2,-1],[7,-5],[15,-12]],[[7038,4752],[-42,31]],[[6996,4783],[4,9],[5,8],[4,7],[4,9],[1,0],[2,3],[0,2],[1,3],[4,4],[6,6],[2,3],[3,3]],[[7032,4840],[2,-2],[3,-2],[75,-55],[5,-6],[15,-11]],[[6969,4732],[5,10],[4,8],[4,8],[5,9],[4,8],[5,8]],[[6952,4806],[44,-23]],[[6965,4841],[4,8],[3,9],[8,15],[2,4]],[[6728,821],[50,-10]],[[6778,811],[25,-6],[50,-12],[41,-9],[99,-23],[15,0],[7,2],[13,3],[7,3],[4,3],[1,2]],[[7040,774],[13,-10]],[[5536,4131],[-20,6],[-20,21],[-2,14]],[[5494,4172],[14,17]],[[5508,4189],[46,-47]],[[5536,4131],[-40,-24]],[[5496,4107],[-2,1],[-15,12],[-8,9],[14,9],[-3,17]],[[5482,4155],[12,17]],[[5382,4039],[-2,-1]],[[5380,4038],[-7,7],[-3,5],[-11,12]],[[5359,4062],[3,2],[4,-1],[8,-7],[3,-1],[9,6],[18,11]],[[5404,4072],[14,8],[15,12],[14,18]],[[5447,4110],[35,45]],[[5496,4107],[-2,-1],[-12,-7],[-13,-8],[-87,-52]],[[5585,3901],[8,8]],[[5593,3909],[20,-21],[40,-41],[16,-17]],[[5669,3830],[-15,-19]],[[5654,3811],[-77,81]],[[5577,3892],[8,9]],[[5593,3909],[9,7],[27,21]],[[5629,3937],[39,-40],[1,-3],[9,-47],[-1,-4],[-2,-5],[-6,-8]],[[5668,3680],[-3,3],[-43,45],[-23,24],[-20,20],[-53,54]],[[5526,3826],[4,3],[11,13],[13,17],[1,4]],[[5555,3863],[15,20],[7,9]],[[5654,3811],[-23,-30],[54,-58]],[[5685,3723],[7,-7],[1,-2],[-25,-34]],[[5654,3811],[54,-56]],[[5708,3755],[-23,-32]],[[5692,3654],[-24,26]],[[5708,3755],[56,-58]],[[5764,3697],[-13,-18],[-1,-2],[-3,-3],[-7,-8],[-48,-12]],[[5724,3527],[-15,16],[-3,5],[-26,26],[-12,-16],[-13,-16],[-13,-19],[-13,-18]],[[5629,3505],[-15,15]],[[5614,3520],[-13,14]],[[5601,3534],[89,117],[2,3]],[[5692,3654],[64,-66],[7,-7],[2,-3]],[[5765,3578],[-2,-2],[-14,-18],[-3,-1],[-10,-15],[-12,-15]],[[5689,3476],[-14,-18]],[[5675,3458],[-4,2],[-14,15]],[[5657,3475],[-28,30]],[[5724,3527],[0,-3],[-35,-48]],[[5756,3465],[-8,8],[-20,22],[-6,-19],[-13,-17],[-3,-1],[-17,18]],[[5765,3578],[12,-12],[7,-7],[25,-26]],[[5809,3533],[-2,-3],[-16,-20],[-11,-15],[-11,-15],[-13,-15]],[[5812,3408],[-11,-15],[-15,-18],[-14,-18]],[[5772,3357],[-14,15],[-15,15],[-33,35]],[[5710,3422],[-35,36]],[[5756,3465],[7,-7],[5,-5],[14,-14],[16,-15],[14,-16]],[[5866,3352],[-17,18],[-16,16],[-3,3],[-2,3],[-16,16]],[[5809,3533],[40,-42]],[[5849,3491],[33,-34],[15,-16],[11,-10],[10,-7],[2,-2]],[[5920,3422],[-2,-2],[-18,-23]],[[5900,3397],[-11,-14],[-12,-15],[-11,-16]],[[6611,4413],[-2,1],[-1,0],[-3,1],[-3,0],[0,1],[-1,2],[0,1],[0,2],[2,2],[2,3],[-52,26],[4,13],[4,9],[3,10],[4,9]],[[6609,4409],[-3,0],[-3,1],[-5,2],[-35,10],[-39,11],[-45,10]],[[6479,4443],[1,4],[3,10],[9,25],[4,12],[4,10],[3,10],[3,9]],[[6478,4648],[-3,-9],[-4,-9],[-7,-22],[-6,-17]],[[6458,4591],[-7,-18],[-6,-20],[61,-30]],[[6479,4443],[-40,7],[-29,7],[-3,1],[-63,22],[-34,12],[-9,3]],[[6458,4591],[61,-30]],[[7555,912],[-65,18]],[[5962,3478],[-36,37],[-33,33]],[[5893,3548],[13,17],[12,17],[20,23]],[[5938,3605],[31,-33],[-18,-24],[36,-37]],[[5938,3605],[16,21],[2,2],[14,17],[10,12]],[[5980,3657],[67,-69]],[[6047,3588],[-10,-12],[-14,-18]],[[5980,3657],[9,12]],[[5989,3669],[7,9],[14,17]],[[6114,3594],[-8,0],[-12,-17],[-15,-22],[-6,5],[-26,28]],[[5894,3747],[43,-46],[9,12],[43,-44]],[[5938,3605],[-42,43]],[[5896,3648],[-20,22],[-1,1],[-2,0],[-1,1],[-5,6]],[[5867,3678],[12,13],[2,5],[2,2],[3,2],[-16,17],[14,17],[10,13]],[[5865,3512],[-40,41],[14,19]],[[5839,3572],[14,18],[12,17],[13,17],[18,24]],[[5893,3548],[-15,-18],[-13,-18]],[[5839,3572],[-22,23],[14,18],[-3,2],[-5,6],[-14,15],[6,8],[7,9],[7,9]],[[5829,3662],[5,7],[18,24],[15,-15]],[[5764,3697],[14,18]],[[5778,3715],[49,-50],[2,-3]],[[5865,3512],[-12,-16],[-4,-5]],[[5962,3478],[-15,-19],[-14,-19],[-13,-18]],[[6222,3365],[-1,2],[-1,1],[-1,2],[-2,2],[-1,1],[-1,2],[-2,1],[-2,2],[-2,1],[0,1],[-3,2],[-1,1],[-1,0],[-2,1],[-1,1],[-2,1],[-2,1],[-2,0],[-5,4],[0,1],[-2,1],[-1,1],[-1,1],[-2,1],[-1,1],[-2,3],[-1,2],[-2,3],[-3,3],[-4,4],[-5,7],[-35,37],[-22,21],[-3,4],[-32,28]],[[6122,3588],[14,-12],[12,-9],[14,-7],[15,-8]],[[6177,3552],[34,-19],[13,-6],[16,-9],[19,-10],[3,-1],[2,-2],[4,-1]],[[6268,3504],[-3,-6],[-3,-10],[-8,-22],[-6,-18],[-12,-31],[0,-1],[-2,-4],[-1,-4],[-1,-1],[-1,-3],[-1,-3],[0,-1],[-2,-7],[-1,-2],[-1,-3],[-1,-6],[0,-1],[-1,-4],[0,-3],[-1,-5],[-1,-4]],[[6323,3388],[-4,-40],[-11,-24],[-22,-4],[-6,-11],[-1,-49],[5,-6]],[[6284,3254],[1,-6],[-1,-6],[1,-6],[2,-8],[-25,-25],[26,-26],[49,-54],[46,-49]],[[5977,2710],[-9,13],[-10,9],[-14,15],[-89,100],[-52,48],[-3,2],[3,2],[4,2],[5,3],[2,1],[5,3],[7,4],[3,2],[5,3],[20,10],[8,5],[3,2],[7,4],[3,2],[3,2],[1,1],[5,4],[1,1],[2,1],[7,6],[20,24],[8,11],[11,16],[8,10],[7,8],[13,17],[4,6],[8,9],[2,3],[11,14],[8,12],[21,26],[11,12],[10,10],[6,8],[2,2],[1,1],[0,2],[1,2],[0,3]],[[6046,3151],[15,20],[1,1],[11,14],[2,3],[34,44],[14,19],[12,15],[4,7],[4,6],[4,5],[1,1],[4,5],[5,6],[3,5],[4,5],[2,3],[2,1],[0,1],[3,4],[4,3],[4,3],[3,2],[2,1],[4,2],[2,1],[5,1],[4,1],[6,0],[1,0],[2,3],[2,3],[2,4],[1,0],[1,3],[2,3],[2,6],[2,4],[1,3],[1,4],[0,2]],[[6512,3265],[-25,-6],[-45,-11],[-14,-4],[-54,-13]],[[6374,3231],[-6,-2],[-19,-4],[-19,-6],[-10,-2],[-10,10],[-17,17],[-9,10]],[[6374,3231],[3,-3],[4,-3],[5,-6],[13,-15],[9,-9],[9,-8],[29,-30]],[[6607,3102],[-19,14],[-25,-46],[19,-14],[20,-16]],[[6636,3157],[-2,-4],[-27,-51]],[[6627,3087],[-25,-47]],[[6607,3102],[20,-15]],[[6657,3142],[-30,-55]],[[6296,2451],[13,25]],[[6334,2524],[13,24]],[[6347,2548],[0,1],[0,1],[0,1],[4,7],[4,7],[2,1],[1,-1],[1,-1],[-1,-2],[-3,-6],[7,2],[3,6],[-6,7],[4,10]],[[6192,2521],[6,-4],[52,-35],[16,-10],[4,-3],[26,-18]],[[6155,2125],[-67,43]],[[6195,2210],[-16,-36],[-8,-15],[-9,-17],[-7,-17]],[[6215,2087],[-60,38]],[[6179,2009],[-60,38]],[[6119,2047],[8,18],[8,18],[9,18],[11,24]],[[6119,2047],[-45,29],[-15,8]],[[6076,1955],[-59,38]],[[6119,2047],[-8,-18],[-9,-19],[-8,-18],[-9,-18],[-9,-19]],[[6117,1876],[-59,38]],[[6058,1914],[9,20],[9,21]],[[6171,1991],[-10,-20],[-8,-17],[-8,-18],[-9,-20],[-9,-19],[-10,-21]],[[6058,1914],[-9,-18],[-8,-18],[-60,38]],[[6108,1858],[-8,-19],[-9,-20],[-10,-22],[39,-26],[2,-3]],[[6122,1768],[-10,-14],[-14,-21],[-19,-21],[-18,-17],[-20,-14],[-17,-8],[-1,-1]],[[6117,1876],[-9,-18]],[[6170,1839],[-48,-71]],[[6108,1858],[43,-25],[11,15],[1,-3],[7,-6]],[[6230,1931],[-2,-3],[-1,-2],[-57,-87]],[[6301,1836],[-26,18],[-32,19],[-12,-8],[-14,-6],[-31,-14],[4,-4],[26,-17],[14,-9],[13,-9],[43,-28],[13,-8],[6,-3],[8,17],[8,16],[4,9],[1,1]],[[6326,1810],[27,-18],[9,-5],[-6,-9]],[[6356,1778],[-17,-30],[-5,-10],[-159,101],[-3,-10],[-9,-16]],[[6331,1865],[-1,-3],[-3,-6],[-3,-2],[-5,-3],[-4,0],[-14,-15]],[[6301,1836],[-4,-5],[-2,-2],[31,-19]],[[6367,1771],[-11,7]],[[6886,3478],[-19,13]],[[6867,3491],[20,33],[26,47]],[[6867,3491],[-18,-32]],[[6849,3459],[-19,14]],[[6830,3473],[65,117]],[[6720,3393],[56,101],[8,17]],[[6784,3511],[63,116]],[[6830,3473],[-10,-20],[-51,-96]],[[6849,3459],[-11,-19]],[[6886,3478],[-28,-53]],[[6858,3425],[-20,15]],[[6858,3425],[-16,-33]],[[6975,953],[-17,7],[-18,6]],[[6940,966],[-5,3],[-7,1],[-4,-3],[-4,-5],[-14,-49],[-13,-22]],[[6893,891],[-10,9],[-13,9],[-11,9],[-8,7]],[[6851,925],[-4,3],[-18,15]],[[6984,983],[-1,-4],[-8,-26]],[[6959,897],[-7,-21]],[[6952,876],[-15,12],[-16,13],[19,65]],[[6975,953],[-16,-56]],[[6952,876],[-13,-22]],[[6939,854],[-10,8],[-10,8]],[[6919,870],[-8,7],[-18,14]],[[5935,4212],[2,8],[2,4],[3,4],[4,7],[4,6],[2,3],[4,4],[6,6],[13,10]],[[5975,4264],[30,11],[19,4],[10,1],[12,1]],[[6046,4281],[0,-3],[0,-10],[3,-10],[6,-15]],[[6055,4243],[-16,-13],[-14,-14]],[[6124,4232],[-13,-36]],[[6111,4196],[-3,1],[-9,5],[-7,4],[-6,3],[-8,6],[-5,4],[-8,9],[-5,6],[-5,9]],[[6046,4281],[14,0],[4,0],[9,-1],[14,-3]],[[6087,4277],[12,-4],[13,-6],[7,-3],[3,-1],[2,-2],[2,-2],[1,-3],[1,-3],[1,-2],[-1,-5],[-4,-14]],[[6146,4200],[-1,-4],[-3,-9],[-5,-14],[-8,-21]],[[6129,4152],[-3,1],[-26,14]],[[6100,4167],[11,29]],[[6124,4232],[18,-8]],[[6142,4224],[1,-4],[7,3],[5,17],[4,2],[-15,-41],[2,-1]],[[6094,4060],[0,1],[11,29],[2,4]],[[6107,4094],[22,58]],[[6146,4200],[11,-6],[11,-5]],[[6168,4189],[22,-10]],[[6190,4179],[-1,-4],[-2,-6],[-9,-24],[-10,-31],[-8,-22],[-8,-27],[0,-40]],[[6107,4094],[-3,2],[-39,18]],[[6065,4114],[4,8],[3,5],[3,6],[7,8]],[[6082,4141],[15,20],[3,6]],[[6065,4114],[-2,1],[-47,52]],[[6024,4170],[36,-17],[16,-8],[3,-2],[3,-2]],[[6094,4060],[-2,1],[-8,3],[-117,55],[-37,18],[-17,8]],[[5913,4145],[6,23],[4,9],[1,4]],[[6083,4031],[-7,-19],[-14,-33],[0,-1],[-7,-18],[-7,-17]],[[6048,3943],[-4,1],[-42,44]],[[6002,3988],[11,15]],[[6013,4003],[11,15],[18,-18],[15,44],[5,16],[-2,2],[-79,37],[-35,16],[-1,0],[-1,-2],[-5,-14]],[[5939,4099],[-18,8]],[[5921,4107],[-17,9]],[[6013,4003],[-47,49],[-1,2],[0,2],[10,26],[-18,9],[-18,8]],[[6002,3988],[-12,-15]],[[5990,3973],[-57,60]],[[5933,4033],[-15,15],[-5,6],[-10,9],[5,6],[13,38]],[[5932,3902],[-15,16],[-6,7],[-8,7]],[[5903,3932],[19,25],[-14,15],[-13,14]],[[5895,3986],[7,7],[4,5],[2,2],[12,15],[13,18]],[[5990,3973],[-14,-16],[-14,-15],[-11,-14],[-19,-26]],[[6009,3893],[-14,-18],[-3,-5],[-13,-17]],[[5979,3853],[-3,3],[-30,32],[-14,14]],[[5979,3853],[-42,-54],[-12,-16]],[[5855,3887],[14,18],[15,-15],[15,-17],[9,13],[5,4],[4,2],[5,2],[5,2],[5,6]],[[5967,3739],[-23,24],[-9,9],[-10,11]],[[5820,3769],[15,20]],[[5835,3789],[13,16]],[[5835,3789],[-54,58]],[[5781,3847],[13,16]],[[5765,3827],[16,20]],[[5669,3830],[54,-56]],[[5629,3937],[10,9]],[[5639,3946],[8,6]],[[5647,3952],[63,-66]],[[5710,3886],[55,-59]],[[5710,3886],[15,19],[56,-58]],[[5647,3952],[20,18],[15,12]],[[5682,3982],[56,-60]],[[5817,4023],[-14,-18],[-13,-18]],[[5817,4023],[56,-59],[23,-24],[7,-8]],[[5835,4046],[29,-30],[28,-29],[3,-1]],[[8740,6667],[-4,3]],[[8675,6785],[15,-11]],[[8690,6774],[24,-16],[-2,-3],[-10,-19],[18,-14],[21,-15],[4,-5],[3,-7],[0,-4],[0,-5],[0,-4],[-2,-6],[-6,-9]],[[8696,6785],[-6,-11]],[[8700,6813],[-8,-16],[-4,-8],[8,-4]],[[8737,6756],[-41,29]],[[8757,6795],[-9,-17],[-7,-15],[-4,-7]],[[5826,3300],[-17,18],[-15,16]],[[5794,3334],[-2,2],[-20,21]],[[5866,3352],[-1,-3],[-1,-3],[-33,-43],[-2,-2],[-3,-1]],[[5873,3251],[-32,34],[-15,15]],[[5900,3397],[16,-16],[15,-16],[16,-16]],[[5947,3349],[-12,-15]],[[5935,3334],[-11,-15],[-13,-15],[-24,-34],[-14,-19]],[[5842,3210],[-16,16],[-9,-3],[-6,-2],[-8,1],[-8,2],[2,-6],[2,-15],[-1,-7],[-1,-8],[-8,-10],[-15,-19]],[[5757,3177],[17,21],[1,4],[1,4],[-1,4],[-12,11],[-14,16],[15,19],[-16,18]],[[5748,3274],[36,47],[8,9],[2,4]],[[5935,3334],[43,-45],[-12,-17],[-1,-2],[-10,-12],[-11,-16]],[[5947,3349],[30,38],[2,3]],[[5979,3390],[3,0],[1,3],[4,4],[3,1],[5,3],[3,6],[4,5],[17,22]],[[6046,3151],[-4,-5],[-2,-3],[-2,2]],[[5977,3464],[-23,-31],[5,-3],[8,-5],[-11,-23],[23,-12]],[[7623,2573],[4,6],[2,3],[7,10],[12,16],[5,8]],[[7653,2616],[19,26]],[[7672,2642],[5,8],[3,4],[2,3],[6,9]],[[7672,2642],[-20,15],[-18,14],[16,23]],[[7682,2740],[-64,46]],[[7618,2786],[15,22]],[[7661,2825],[2,-1],[52,-37]],[[7715,2787],[-18,-26]],[[7650,2694],[-64,46]],[[7586,2740],[10,14],[6,9],[8,10],[8,13]],[[7653,2616],[-39,27],[-45,35],[-16,12]],[[7553,2690],[17,27],[16,23]],[[7524,2739],[11,6],[11,9],[12,9],[10,9],[13,6],[16,5],[7,3],[7,6],[9,7],[13,9]],[[7553,2690],[-10,-11],[-14,-23]],[[6694,3114],[-30,-55],[19,-14]],[[6683,3045],[-16,-29],[-15,-14]],[[6712,3101],[-29,-56]],[[6770,3058],[-30,-56]],[[6740,3002],[-20,16],[-19,14],[-18,13]],[[6740,3002],[-18,-34],[-9,-11]],[[6772,2913],[-11,-22]],[[6791,3043],[17,-14]],[[6808,3029],[-29,-55]],[[6779,2974],[-26,-47],[19,-14]],[[6797,2960],[-25,-47]],[[6779,2974],[18,-14]],[[6807,2887],[-1,4],[-2,2],[-2,-2],[-30,22]],[[6797,2960],[29,-21],[5,-3]],[[8040,2949],[13,17],[8,11],[15,20]],[[8076,2997],[11,-9],[35,-28]],[[7006,800],[-13,11],[-8,7]],[[6985,818],[-7,5],[-8,7],[-8,6],[-8,6]],[[6954,842],[-8,7],[-7,5]],[[6959,897],[53,-42],[16,-13]],[[7028,842],[10,-8]],[[7038,834],[-15,-15],[-17,-19]],[[6915,794],[-18,4],[-18,5]],[[6879,803],[20,51],[7,-6],[12,20],[1,2]],[[6954,842],[-1,-2],[-9,-24],[-15,13],[-14,-35]],[[6985,818],[-1,-2],[-14,-35],[-18,4],[-18,5],[-19,4]],[[6839,901],[-11,-24],[-20,13],[-6,-20],[17,-11],[-3,-6],[-3,-12],[-16,9],[-7,-27],[17,-4],[18,-4]],[[6825,815],[18,-3],[18,-5]],[[6861,807],[18,-4]],[[7006,800],[9,-6],[9,-8],[16,-12]],[[6778,811],[27,95],[-15,-9]],[[6790,897],[-34,2]],[[6756,899],[42,25],[16,9],[12,8],[3,2]],[[6851,925],[-1,-2],[-11,-22]],[[6861,807],[7,26],[15,32],[-14,12],[-15,12]],[[6854,889],[-15,12]],[[6825,815],[10,35],[19,39]],[[6728,821],[0,1],[14,46],[19,-8],[4,14],[23,11],[2,12]],[[6650,838],[14,8],[10,7],[35,21],[11,6],[11,7],[2,2]],[[6733,889],[4,3],[6,3],[3,2]],[[6746,897],[1,-3],[9,5]],[[6746,897],[-3,5],[2,0],[13,10],[23,80],[4,14]],[[6733,889],[-11,4],[-2,-1],[-7,3],[-21,8],[-22,8]],[[6670,911],[24,83],[-4,1],[6,22]],[[6696,1017],[6,22]],[[6702,1039],[24,-10]],[[6726,1029],[-12,-43],[22,-8],[21,-8],[12,44],[3,12]],[[6726,1029],[-5,7],[3,17],[-1,5],[-5,10],[-28,43],[12,20]],[[6702,1039],[2,8],[-1,8],[-3,6],[-5,5],[-77,30],[-6,-24],[-6,-24]],[[6606,1048],[-4,-14],[-2,-8],[-22,-81]],[[6578,945],[-51,19],[-3,1]],[[6524,965],[-3,7],[-3,9],[-1,4],[-1,3],[0,3],[-1,3],[0,4],[0,5],[-1,5],[1,4],[0,4],[0,8],[1,5],[0,8],[1,5],[1,12]],[[6518,1054],[0,6],[1,21],[2,25],[2,16],[0,7],[1,13],[1,10],[0,3],[0,5],[0,3],[0,5],[0,7],[-1,5],[0,6],[-1,8],[0,5],[-1,5]],[[6522,1204],[0,1],[1,7],[-1,2]],[[6522,1214],[2,2],[3,0],[19,18],[41,35],[9,7],[3,1],[2,2],[5,3]],[[6696,1017],[-90,31]],[[6670,911],[-21,7],[-31,12],[-1,2],[-4,0],[-3,2],[-32,11]],[[6533,876],[1,6],[2,7],[1,7],[1,7],[0,4],[0,9],[-1,5],[0,5],[-2,7],[-2,6],[-1,4],[-3,8],[-5,14]],[[6531,876],[-20,5],[-26,5],[-25,6],[6,26],[-26,9],[-4,7],[-4,56],[2,9]],[[6434,999],[50,-19],[9,34],[5,16],[4,18],[3,11]],[[6505,1059],[10,-4],[3,-1]],[[6434,999],[-13,6],[6,38],[1,7],[4,9],[6,7],[16,17],[19,-11],[32,-13]],[[6403,864],[1,23],[0,8],[2,114],[-1,82],[0,16]],[[6405,1120],[7,6],[52,37],[20,13],[11,10],[19,18],[4,4],[1,2],[2,2]],[[6521,1212],[0,-1],[1,-7]],[[6352,1008],[21,1],[3,-1],[3,-1],[7,0],[5,1],[2,1],[0,3],[-1,3],[-2,4],[0,9],[0,6],[2,7],[1,1],[0,25],[-5,11],[-3,4]],[[8760,6653],[-2,1],[-18,13]],[[8737,6756],[31,-22],[-4,-18],[12,-3],[5,-18],[0,-16],[11,-4],[-4,-12]],[[8615,6424],[4,1],[24,77],[-6,3],[-7,3],[-9,38],[2,12]],[[8537,6472],[3,5],[12,27],[8,18],[1,2],[1,3],[8,24],[7,23]],[[8417,6569],[26,-21],[20,-15],[6,12],[2,9],[3,9],[3,6],[5,5],[-4,8],[-3,10],[7,3],[7,-2],[4,10],[2,7],[4,19],[14,-3]],[[8417,6569],[9,17],[9,23],[4,16],[5,21]],[[8444,6646],[6,34],[1,21]],[[8451,6701],[36,-3],[17,-3]],[[8341,6674],[31,-8],[3,21],[1,19],[4,4],[33,-1],[18,0],[-1,-27],[-4,-31],[18,-5]],[[8347,6737],[5,2],[19,1],[33,0],[30,-1]],[[8434,6739],[20,-1]],[[8454,6738],[0,-4],[-3,-33]],[[8384,6768],[50,-1],[0,-28]],[[8458,6764],[-4,-26]],[[8427,6853],[16,-12],[12,-8]],[[8455,6833],[6,-3],[12,-5]],[[8410,6866],[10,19],[10,19]],[[8430,6904],[41,-30],[-8,-20],[-8,-21]],[[8430,6904],[10,19],[-32,22],[8,16],[1,6]],[[8417,6967],[35,-25],[33,-24]],[[8485,6918],[21,-15]],[[8433,7005],[71,-52]],[[8504,6953],[-8,-15],[-9,-17],[-2,-3]],[[8514,6971],[-10,-18]],[[8442,7022],[72,-51]],[[8453,7042],[71,-51]],[[8468,7071],[71,-51]],[[8546,7034],[-7,-14]],[[8409,7114],[7,14]],[[8475,7085],[71,-51]],[[6924,2944],[18,-14]],[[6905,2958],[36,66]],[[6884,2974],[4,8],[5,8],[4,8],[4,8],[5,9],[4,7],[5,9],[5,9]],[[6905,2958],[-21,16]],[[6884,2974],[-24,17]],[[6847,2967],[13,24]],[[6797,2960],[30,56]],[[6808,3029],[19,-13]],[[6808,3029],[36,67]],[[2104,990],[-13,-3],[-18,-4],[-6,-3],[-6,-4],[-5,-4],[-16,-14]],[[2040,958],[-23,38],[-3,5],[-4,4],[-4,3],[-1,1]],[[2005,1009],[6,14],[-28,17],[-7,4],[-3,4],[-1,6],[-4,16],[3,2],[5,2],[7,4],[14,-19],[2,-1],[3,0],[1,2],[4,8],[6,8],[8,9],[9,8],[9,6],[4,2],[19,5],[4,-23],[8,2],[6,2],[4,1],[3,3],[6,5]],[[2093,1096],[13,-10],[-10,-24],[-1,4],[-3,-1],[-2,-2],[-1,-2],[0,-4],[2,-7],[8,-37],[5,-23]],[[4045,3461],[-16,-12],[-33,-25]],[[3982,3413],[-19,-15]],[[3963,3398],[-31,31],[-35,37],[-17,19],[-4,4],[-9,9],[-12,13],[-28,29],[-7,8],[-2,2],[-3,1],[-4,1],[-3,1],[-3,0],[-6,1],[-5,1],[-6,0],[-13,-6],[-7,-3],[-12,-2],[-5,-1],[-9,-1]],[[3742,3542],[0,6]],[[3742,3548],[16,1],[10,0],[14,7],[5,2],[5,1],[11,-1],[10,0],[5,-3],[7,-1],[8,5],[11,2],[11,1],[2,1],[6,0],[21,-5],[2,-1],[6,-4],[9,-5],[14,-7],[23,-5],[33,-6],[6,-1],[5,-1],[16,-2],[2,1],[17,0],[4,0],[14,2],[10,2],[28,5],[11,0],[26,16],[16,8],[20,0],[18,-2],[18,1],[46,7],[14,4],[7,1],[3,1],[6,4],[2,0],[3,1],[1,1],[11,5],[17,5]],[[4292,3588],[64,-59]],[[4356,3529],[-8,-5],[-9,-6],[-6,-7],[-10,-6],[-10,-4],[-2,-1],[-4,-1],[-3,-2],[-2,0],[-8,-3],[-10,0],[-11,1],[-22,-2],[-31,-2],[-18,-1],[-22,3],[-32,5],[-8,0],[-14,0],[-17,-3],[-24,-9],[-4,-2],[-19,-10]],[[7345,3904],[-13,-22]],[[7332,3882],[-19,15],[-18,13]],[[7295,3910],[-19,13],[-19,15],[-19,13]],[[7238,3951],[12,22]],[[7250,3973],[57,-42]],[[7307,3931],[38,-27]],[[6618,5223],[-22,-57]],[[6596,5166],[-4,2],[-43,21],[-4,2]],[[6545,5191],[11,30]],[[6556,5221],[52,149],[7,20],[1,3]],[[6616,5393],[10,-7],[8,-5],[38,-27],[3,-2]],[[6675,5352],[0,-2],[-1,-2],[-3,-6],[-28,-54]],[[6643,5288],[-10,-24],[-15,-41]],[[6732,5273],[-17,12],[-20,13],[-19,13],[-17,-34],[-16,11]],[[6675,5352],[36,-26],[17,-13]],[[6728,5313],[36,-25]],[[6764,5288],[-2,-4],[-3,-4],[-10,-21],[-17,14]],[[6732,5273],[-12,-22],[9,-17],[9,-17],[8,-8],[-9,-17]],[[6737,5192],[-11,9],[-13,23],[-16,-11]],[[6697,5213],[-9,16],[-20,15],[-17,13],[-17,-43],[-16,9]],[[6754,5179],[-17,13]],[[6764,5288],[33,-24]],[[6797,5264],[-2,-4],[-1,-6],[-40,-75]],[[7356,3926],[-11,-22]],[[7307,3931],[12,21]],[[7319,3952],[11,21]],[[7330,3973],[38,-26]],[[7368,3947],[-12,-21]],[[7273,4015],[57,-42]],[[7319,3952],[-58,42]],[[7261,3994],[12,21]],[[7250,3973],[-37,28],[11,21],[37,-28]],[[7238,3951],[-16,12],[-21,15],[-20,15]],[[7181,3993],[-61,47]],[[7120,4040],[31,59]],[[7151,4099],[80,-52],[5,-3],[37,-29]],[[7209,3897],[-36,28]],[[7173,3925],[11,22],[-20,15],[17,31]],[[7238,3951],[-15,-31],[-14,-23]],[[7339,3991],[-9,-18]],[[7151,4099],[8,15],[18,33],[5,15]],[[7182,4162],[8,-3],[37,-28],[26,-19],[19,-14],[4,-3]],[[7276,4095],[4,-2],[26,-19]],[[7306,4074],[-12,-22]],[[7294,4052],[-11,-20],[56,-41]],[[7294,4052],[57,-41]],[[7351,4011],[-12,-20]],[[7306,4074],[56,-41]],[[7362,4033],[-11,-22]],[[7412,4029],[-13,-24]],[[7399,4005],[-37,28]],[[7276,4095],[19,19],[2,2]],[[7297,4116],[4,-4],[1,-1],[16,-13]],[[7318,4098],[94,-69]],[[7318,4098],[7,12],[6,11]],[[7331,4121],[85,-62],[8,-6]],[[7424,4053],[-12,-24]],[[7435,4072],[-11,-19]],[[7331,4121],[5,9],[5,6],[5,4]],[[7346,4140],[89,-68]],[[7346,4140],[8,7],[9,8],[60,-47],[23,-17]],[[7446,4091],[-6,-10],[-5,-9]],[[7457,4112],[-6,-11],[-5,-10]],[[7297,4116],[26,23],[31,27],[13,8],[5,3],[15,5],[6,3],[22,0],[16,-1]],[[7431,4184],[12,-9],[4,-1],[5,-4],[3,-2],[1,-1],[8,-6],[12,-8],[3,-3]],[[7479,4150],[-5,-9],[-6,-9]],[[7468,4132],[-5,-10],[-6,-10]],[[7511,4041],[-65,50]],[[7457,4112],[66,-51]],[[7523,4061],[-6,-10],[-6,-10]],[[7468,4132],[35,-27],[12,-9],[17,-12],[2,-2]],[[7534,4082],[-5,-10],[-6,-11]],[[7479,4150],[6,-5],[40,-30],[8,-6],[11,-9]],[[7544,4100],[-5,-9],[-5,-9]],[[7654,4145],[-17,-31],[2,-2],[5,-4],[16,-12],[-9,-18],[-10,7],[-6,5],[-8,6]],[[7627,4096],[-15,11],[-35,27],[-11,9],[-10,-18],[-12,-21],[0,-4]],[[7431,4184],[4,1]],[[7435,4185],[12,-1],[16,0],[9,1],[6,1],[7,2],[5,1],[16,3],[16,5],[22,8],[16,9],[4,2],[19,14],[9,8],[2,3],[2,1]],[[7596,4242],[10,-7],[7,-5],[3,-3],[8,-6],[1,-2],[19,-15]],[[7644,4204],[-6,-12],[-5,-9],[-8,-15],[29,-23]],[[7604,4055],[-52,40],[-8,5]],[[7627,4096],[-10,-18]],[[7617,4078],[-6,-11],[-7,-12]],[[7604,4055],[25,-18],[3,-2]],[[7632,4035],[-5,-9],[-6,-10]],[[7621,4016],[-87,66]],[[7621,4016],[-5,-9],[-6,-11]],[[7610,3996],[-42,32],[-45,33]],[[7599,3976],[-18,13],[-25,18],[-45,34]],[[7610,3996],[-6,-10],[-4,-8],[-1,-2]],[[7594,3967],[-6,-10]],[[7588,3957],[-20,15],[-23,16],[-45,34]],[[7500,4022],[6,10],[5,9]],[[7599,3976],[-5,-9]],[[7578,3939],[-27,20],[-15,11],[-45,34]],[[7491,4004],[5,9],[4,9]],[[7588,3957],[-6,-12],[-4,-6]],[[7478,3981],[7,12],[6,11]],[[7578,3939],[-2,-5],[-7,-12]],[[7569,3922],[-10,5],[-8,2],[-8,4],[-19,14],[-46,34]],[[8191,3873],[8,29]],[[8199,3902],[1,5]],[[8200,3907],[34,-26],[14,-10]],[[8248,3871],[-6,-16]],[[8242,3855],[-6,-17],[39,-30],[26,-19],[14,-11],[28,-21]],[[8343,3757],[-8,-15],[-7,-12],[-3,-5],[-13,-25]],[[8360,3787],[-8,-15],[-9,-15]],[[8242,3855],[10,-8],[24,-18],[1,-1],[8,-6],[18,-13],[13,-10],[7,-5],[8,15],[-7,5],[-15,11]],[[8309,3825],[5,8],[21,-16],[8,13],[-45,34]],[[8298,3864],[8,15]],[[8306,3879],[45,-34]],[[8351,3845],[21,-16],[8,-6]],[[8380,3823],[-8,-15],[-12,-21]],[[8309,3825],[-16,12],[-7,6]],[[8286,3843],[7,14],[5,7]],[[8351,3845],[4,9],[4,7],[-7,5],[-37,29],[7,13]],[[8322,3908],[2,0],[43,-32],[9,15],[8,14]],[[8384,3905],[13,-10],[15,-12]],[[8322,3908],[7,12],[3,4],[8,15]],[[8340,3939],[16,-12]],[[8356,3927],[28,-22]],[[8356,3927],[7,13],[5,9],[11,19]],[[8379,3968],[12,22]],[[8391,3990],[29,-21],[-13,-22]],[[8407,3947],[-11,-20],[-7,-11],[-5,-11]],[[8407,3947],[18,-14],[11,-8]],[[8436,3925],[-11,-20],[-13,-22]],[[8442,3935],[-6,-10]],[[8391,3990],[12,22],[15,25]],[[8418,4037],[28,-21]],[[8446,4016],[19,-15],[9,-7]],[[8474,3994],[-13,-25],[-13,-23],[-6,-11]],[[8442,3935],[24,-18],[16,-13],[9,-7]],[[6717,5109],[-56,27]],[[6661,5136],[8,22],[6,20],[9,20],[13,15]],[[6754,5179],[-20,-37],[-16,-31],[-1,-2]],[[6754,5179],[21,-15],[32,-6],[6,-4]],[[6813,5154],[-36,-69],[-2,-3]],[[6775,5082],[-58,27]],[[6797,5264],[54,-39]],[[6897,5192],[54,-39],[17,-12]],[[6968,5141],[-2,-4],[-4,-9],[-10,-18],[-18,12],[-11,-21]],[[6972,5040],[-49,35]],[[6923,5075],[-10,7]],[[6968,5141],[31,-22]],[[6999,5119],[-1,-2],[-1,-3],[-1,-3],[10,-6],[-3,-6],[-10,-20],[-10,-19],[-11,-20]],[[6900,5033],[5,8],[6,13],[12,21]],[[6972,5040],[17,-13],[-19,-16],[-19,-17],[-11,10],[-9,7],[-13,9],[-18,13]],[[7103,5060],[-13,-9],[-3,-2],[-7,-5],[-5,-4],[-2,-2],[-4,-3],[-5,-4],[-6,-5],[-5,-5],[-6,-4],[-34,-32],[-13,-11],[-9,-8]],[[6824,4872],[-2,1],[-1,0],[-2,1],[-3,2]],[[6816,4876],[24,19],[9,5],[13,6],[13,5],[22,4],[9,2],[9,3],[12,6],[3,1],[-15,38],[-6,12],[-5,9],[-8,12],[-10,13]],[[6886,5011],[5,6],[6,11],[3,5]],[[6999,5119],[33,-24],[16,-11],[16,-12],[3,-1],[3,-1],[13,0],[4,-1],[5,-1],[3,-1],[3,-2],[3,-2],[1,-3],[1,0]],[[6886,5011],[-7,8],[-1,2],[-8,8],[-11,8],[-12,9],[-10,6],[-11,6],[-51,24]],[[6816,4876],[-5,2],[-2,3],[-5,2],[-4,1],[-17,8],[-13,5],[-20,10],[-31,14]],[[6719,4921],[8,22],[46,136],[2,3]],[[6824,4872],[-2,-2],[-2,-1],[-2,-2],[-4,-5],[-7,-7],[-2,-3],[-5,-7],[-3,-5],[-4,-7],[-5,-9],[-4,-6]],[[6784,4818],[-2,-6],[-8,-13],[-5,-10],[-3,-7]],[[6766,4782],[-1,1],[-2,1],[-4,2]],[[6759,4786],[9,16],[9,18],[-34,16],[-8,4],[-31,15],[-8,4]],[[6696,4859],[7,18]],[[6703,4877],[7,21],[4,11],[5,12]],[[6841,4792],[-9,5],[-36,16],[-7,4],[-5,1]],[[6828,4754],[-9,4],[-50,23],[-3,1]],[[6815,4716],[-52,24],[-2,1],[-10,5]],[[6751,4746],[-4,1]],[[6747,4747],[3,4],[7,15],[9,16]],[[6800,4673],[-57,28],[-3,1],[-7,3],[0,4]],[[6733,4709],[7,15],[11,22]],[[6793,4653],[-43,20],[-14,7],[-3,2],[-11,5],[11,22]],[[6683,4823],[9,-4],[31,-15],[8,-4],[14,-7],[14,-7]],[[6683,4823],[2,2],[5,15],[2,7],[4,12]],[[6641,4907],[62,-30]],[[3400,3543],[-4,3],[-54,21],[-23,24],[-5,5],[-3,2],[-3,5]],[[3308,3603],[7,1],[19,1],[7,0]],[[3341,3605],[8,0],[16,1],[9,0],[9,1],[2,0],[6,0],[13,-3]],[[3404,3604],[21,-7],[6,-3],[11,-6]],[[3442,3588],[3,-2],[20,-14],[63,-41]],[[3528,3531],[-12,-24],[-2,-5],[-44,16],[-70,25]],[[3341,3605],[-5,5],[-126,131],[4,4],[7,2],[13,3],[3,-1],[14,-15],[26,9],[127,-133],[0,-6]],[[7377,3964],[-9,-17]],[[7351,4011],[37,-28]],[[7388,3983],[-11,-19]],[[7399,3832],[-30,22],[-18,13],[-15,12],[-4,3]],[[7356,3926],[66,-51]],[[7422,3875],[-11,-21],[-12,-22]],[[7381,3799],[-12,-20],[-65,47]],[[7304,3826],[10,18],[2,4],[0,2],[16,32]],[[7399,3832],[-18,-33]],[[7381,3799],[22,-19],[4,-3],[2,-3],[8,-16]],[[7417,3758],[-7,-3],[-8,-3],[-7,-1],[-4,-1],[-7,-2],[-9,-3],[-23,-10],[-9,-4],[-6,-3]],[[7337,3728],[-7,-3],[-21,-9],[-5,-3],[-4,-2],[-3,-2],[-3,-2]],[[7294,3707],[0,2],[-1,2],[-1,1],[-36,27]],[[7256,3739],[12,22],[11,22],[2,2],[3,4],[8,13],[2,4],[10,20]],[[7256,3739],[-37,27]],[[7219,3766],[12,23],[11,22],[11,21],[2,3],[11,19]],[[7266,3854],[36,-26],[2,-2]],[[6677,5055],[-16,7],[-9,-22],[-5,2],[-1,0],[-3,0],[-5,3],[-33,16],[-2,1],[-2,2],[-4,2],[8,23]],[[6605,5089],[17,-8],[11,33],[1,3],[1,2],[1,0],[2,1],[1,-1],[1,0],[13,-6],[28,-13],[3,-3],[4,-6],[0,-4],[-1,-5],[-3,-6],[-7,-21]],[[6605,5089],[-33,16],[22,57],[2,4]],[[6596,5166],[65,-30]],[[6717,5109],[-1,-3],[-2,-2],[-19,-57],[-18,8]],[[7142,5009],[-6,-10],[-5,-10]],[[7131,4989],[-7,5],[-46,33],[-3,2],[-6,1],[-5,-5],[-9,-7],[59,-44],[6,-5]],[[7120,4969],[-9,-19]],[[7111,4950],[-10,-19],[-10,-16]],[[7091,4915],[-9,-18]],[[7103,5060],[1,-4],[1,-5],[-1,-7],[1,-4],[0,-2],[2,-2],[1,-1],[2,-2],[3,-1],[6,-3],[20,-16],[3,-4]],[[7131,4989],[-5,-10],[-6,-10]],[[7199,4885],[-32,24],[-56,41]],[[7131,4989],[57,-42],[32,-23]],[[7142,5009],[57,-41]],[[7199,4968],[32,-24]],[[7142,5009],[6,11],[5,9],[5,9],[5,10],[6,11],[5,9]],[[7174,5068],[57,-41]],[[7231,5027],[-5,-10],[-6,-11],[-5,-9],[-5,-10],[-5,-9],[-6,-10]],[[7174,5068],[5,10],[5,8],[5,2],[9,12],[40,-29],[9,-7]],[[7174,5068],[-24,19],[-2,4]],[[7148,5091],[1,0],[12,9],[4,3],[18,12],[15,10],[1,1],[2,1],[5,4],[20,14],[1,1],[24,16],[21,14],[3,3]],[[7103,5060],[11,8],[18,12],[4,3],[12,8]],[[6851,5225],[120,236],[4,8],[4,8]],[[6979,5477],[4,7],[4,8],[4,6],[4,9]],[[6851,5547],[60,-43],[4,8],[4,8]],[[6919,5520],[60,-43]],[[6728,5313],[114,216],[5,11],[4,7]],[[6919,5520],[4,8],[4,7]],[[6927,5535],[4,8],[5,8]],[[6936,5551],[51,-38],[8,-6]],[[6936,5551],[4,7],[4,8]],[[6944,5566],[4,7],[5,9]],[[6953,5582],[33,-24],[26,-19]],[[6953,5582],[5,9],[5,9],[4,9],[6,10],[2,3]],[[6953,5582],[-60,44]],[[6893,5626],[5,9],[5,9],[5,9],[5,10],[2,3]],[[6944,5566],[-60,43]],[[6884,5609],[4,8],[5,9]],[[6927,5535],[-59,44]],[[6868,5579],[4,7],[4,8],[8,15]],[[6860,5563],[4,8],[4,8]],[[6919,5520],[-59,43]],[[6851,5547],[5,9],[4,7]],[[6793,5590],[-9,-18]],[[6784,5572],[-38,26],[-9,6],[-10,-20],[-13,9]],[[6714,5593],[10,20],[11,21],[27,54],[8,16]],[[6770,5704],[7,-4],[6,-5],[-11,-23],[8,-6],[9,-6],[31,-21]],[[6820,5639],[-14,-26],[-5,-8],[-4,-7],[-2,-4],[-2,-4]],[[6784,5518],[-59,41],[-8,5],[-10,-19]],[[6707,5545],[-9,6],[-4,2]],[[6694,5553],[20,40]],[[6784,5572],[19,-13],[1,-2],[-1,-2],[-3,-7],[-6,-10],[-5,-10],[-5,-10]],[[6763,5479],[-65,48],[4,9],[5,9]],[[6784,5518],[-6,-10],[-6,-11],[-5,-9],[-4,-9]],[[6763,5479],[-9,-15],[-39,29],[-11,-19],[-5,-9],[-6,-12],[-3,-7],[-10,7],[-15,10],[10,19],[-13,8]],[[6662,5490],[9,18],[6,12],[17,33]],[[2967,2895],[-40,-34],[-3,-2],[-2,1],[-23,33],[-10,-8],[-4,-6],[-2,-3],[-5,4],[-5,3],[-26,14]],[[2847,2897],[-33,17],[-3,1],[-2,-4],[-6,-18],[-12,-29],[-3,-3],[-7,-7],[-17,-14],[-6,9],[-2,4],[-2,4],[-3,19]],[[2751,2876],[-1,5],[-9,15],[-21,36],[-12,19],[-8,13]],[[2700,2964],[17,14],[31,26]],[[2748,3004],[9,7],[7,5],[13,10],[3,3],[6,5],[16,13],[6,5],[2,3],[4,5],[3,3],[3,3],[3,2]],[[2823,3068],[6,5],[33,28]],[[2862,3101],[46,-78],[5,-10],[6,-27],[3,-9],[6,-14],[21,-35]],[[2949,2928],[18,-33]],[[2901,3123],[-20,-9]],[[2881,3114],[-19,-13]],[[2823,3068],[-40,64],[-4,28],[-10,12],[40,30]],[[2809,3202],[18,1],[29,20],[3,0]],[[2859,3223],[5,-11],[-25,-20],[11,-19],[22,-35],[2,-2],[3,0],[23,10],[1,-23]],[[2386,3567],[-23,7],[1,-3],[0,-3],[0,-2],[0,-3],[-1,-2],[0,-2],[0,-2],[-1,-2],[-1,-2],[-1,-1],[-1,-2],[-1,-1],[-2,-3],[-1,-2],[-8,9],[-16,24],[12,10],[5,6],[4,3],[2,-2],[3,2],[6,6],[1,0],[13,12],[1,1],[0,1],[6,4],[11,15],[-1,2],[0,1],[-1,2],[-1,4],[-1,4],[-2,9],[0,3],[-1,2],[-1,2],[-1,1],[-1,1],[-1,1],[-1,0],[-1,0],[-1,1],[-1,0],[-1,-1],[-2,0],[-1,-1],[-2,-1],[-2,-2],[-4,-3],[-3,-4],[-8,-7],[-15,-14],[-1,-1],[-6,-5],[-4,-3]],[[1693,3865],[4,2],[6,2],[11,0],[3,-2],[6,-4],[4,-6],[4,-4],[7,-5],[3,2],[7,6],[2,0],[5,-5],[1,-1],[5,-3],[6,-1],[3,2],[2,1],[2,7],[5,17],[3,8],[9,18],[6,8],[4,6],[10,9],[4,4],[11,5],[12,3],[10,1],[8,3],[10,1],[7,0],[3,-1],[10,-2],[17,-8],[11,-7],[26,-12],[11,-4],[6,0],[4,-1],[3,-1],[15,-1],[29,0],[44,-5],[8,-1],[30,-5],[10,0],[10,-2],[15,4],[15,-2],[3,-1],[7,-5],[4,-8],[4,-5],[6,-3],[7,-1],[7,2],[12,1],[6,2],[4,-1],[5,3],[18,8],[10,1],[13,1],[4,-1],[2,-1],[0,-5],[-2,-10],[-2,-4],[-8,-17],[2,-9],[0,-3],[1,-2],[11,-4],[17,-17],[17,-24],[21,-18],[40,-21],[10,-6],[9,-9],[7,-4],[5,-3],[0,-7],[5,-23],[-1,-3],[2,-3],[4,-5],[6,-9],[3,-10],[7,-20],[3,-4],[4,-4],[6,-1],[5,-6],[0,-1],[1,-5],[-1,-10],[-2,-9],[-2,-6],[-5,-7],[-11,-10],[-18,-17]],[[1274,3378],[2,27],[1,14],[-1,11],[1,8],[13,33],[6,10],[4,5],[7,4],[7,3],[8,4],[10,8],[4,14],[8,3],[21,-2],[5,3],[3,2],[2,0],[7,-7],[4,0],[13,3],[10,6],[12,10],[9,13],[9,12],[7,10],[12,11],[7,10],[3,13],[1,23]],[[1806,2151],[-14,-10],[-7,-4],[-17,-9]],[[1768,2128],[-12,-5],[-9,-3],[-10,-4],[-7,-6],[-10,-7],[-4,-3],[-22,-14],[-16,-11],[-12,-12]],[[1666,2063],[-10,-7],[-9,-4],[-17,-6],[-16,-6]],[[1614,2040],[-9,-3],[-8,-5],[-5,-3],[-34,-25],[-2,-2],[-5,-3],[-39,-29],[-16,-12],[-11,-9],[-15,-14],[-7,-4],[-5,-2],[-5,-1],[-9,2],[-11,1],[-11,2],[-15,3],[-13,1],[-18,-1],[-12,-1],[-1,8],[-2,4],[-7,13],[-1,1],[-1,1],[-1,0],[-2,0],[-4,-1],[-7,-1],[-2,-1],[-1,0],[-1,-1],[1,-13],[-1,0],[0,-1],[0,-1],[0,-2],[0,-2],[0,-2],[0,-2],[-16,-1],[-8,-1],[-11,-4],[-8,-2],[-10,-3],[-6,0],[-3,1],[-4,1],[-4,2],[-27,19],[-7,5],[-29,21],[-11,6],[-4,2],[-5,2],[-5,2],[-1,0],[-2,-1],[-2,0],[-2,-1],[-13,-8],[-25,-17],[-10,-6],[-3,-2],[-7,-4],[-27,-18],[-66,-43],[-59,-38],[-38,-24],[-55,-35],[-15,-9],[-19,-12],[-19,-11],[-7,-5],[-2,-6],[0,-5],[0,-5],[7,-18],[6,-18],[1,-6],[0,-5],[-1,-10],[-2,-4],[-10,-18],[-4,-7],[-3,-7],[-1,-5],[-2,-7],[-3,-16],[-2,-11]],[[790,1603],[-10,5]],[[780,1608],[5,4],[2,9],[0,11],[-1,5],[-4,5],[0,3],[4,7],[6,2],[11,14],[2,10],[0,9],[-2,5],[0,9],[-1,1],[-2,4],[-36,0],[-7,2],[-8,7],[4,8],[6,1],[0,9],[-3,9],[-7,5],[-7,3],[-5,8],[-8,9],[-7,12],[-5,3],[-5,2],[-25,0],[-3,2],[-9,9],[-7,-2],[-5,-3],[-7,2],[-7,11],[-8,17],[-7,16],[-1,11],[-3,7],[-4,2],[-3,-2],[-1,-2],[-1,-9],[-2,-6],[-6,-4],[-13,0],[-8,1],[-11,15],[-5,10],[-2,11],[0,10],[0,10],[2,7],[8,12],[1,0],[2,-5],[-6,-9],[-1,-5],[1,-3],[4,-1],[4,4],[3,0],[4,-2],[2,-6],[5,-2],[4,0],[9,9],[3,8],[12,12],[5,2],[4,-9],[7,-1],[7,2],[3,5],[6,-1],[2,2],[0,9],[3,8],[8,12],[5,7],[5,10],[4,9],[-1,10],[-1,7],[-3,7],[-3,6],[-5,6],[-6,0],[-3,1],[-5,3],[-5,2],[-10,-3],[-15,-8],[-9,-3],[-9,1],[-7,6],[0,4],[-2,7],[6,8],[5,9],[0,7],[-1,9],[-4,15],[-1,6],[4,9],[6,2],[6,1],[6,-1],[3,-4],[2,-9],[6,-5],[5,0],[8,1],[8,6],[10,10],[0,11],[1,10],[5,8],[5,12],[0,3],[-1,1],[0,5],[3,2],[3,0],[3,-6],[2,-1],[5,0],[2,4],[14,11],[11,0],[7,1],[3,1],[3,4],[-1,2],[-5,3],[-5,7],[-3,11],[-4,8],[0,5],[3,5],[6,2],[3,3],[3,7],[2,10],[-2,9],[-4,3],[-5,-6],[-6,-3],[-5,-2],[0,4],[1,1],[5,6],[3,18],[5,4],[1,9],[3,9],[5,3],[5,8],[10,12],[3,6],[3,12],[4,5],[5,4],[8,0],[6,5],[5,7],[9,8],[8,-1],[1,0],[3,1],[7,6],[9,17],[13,11],[2,-5],[6,-8],[6,-4],[7,1],[6,-7],[1,0],[5,4],[9,4],[1,2],[5,1],[12,15],[6,1],[12,0],[18,14],[10,0],[4,2],[9,0],[4,-4],[6,-1],[9,2],[5,5],[8,5],[8,2],[13,1],[1,-16],[7,-16],[2,-9],[2,-8],[2,-7],[8,-13],[2,-3],[4,-7],[8,-9],[8,-7],[5,-3],[4,-2],[18,-20],[-4,-11],[-4,-5],[-5,-7],[-3,-12],[9,-12],[4,-7],[6,-2],[7,3],[3,4],[6,-4],[2,-5],[0,-18],[-2,-8],[-7,-15],[-1,-4],[0,-1],[0,-8],[2,-13],[7,-14],[1,-4],[9,-15],[2,-24],[14,-30],[2,-7],[12,-23],[3,-10],[3,-1],[3,1],[2,0],[6,-11],[0,-6],[3,-4],[6,-3],[8,3],[8,-4],[7,-6],[13,-2],[7,1],[5,2],[7,-2],[10,-5],[4,-5],[1,-7],[5,-6],[12,-14],[5,-7],[5,-1],[3,-3],[1,-2],[2,-3],[10,0],[5,2],[6,4],[6,3],[7,1],[2,4],[3,2],[5,3],[6,24],[4,3],[6,-1],[16,0],[11,4],[4,3],[4,5],[2,2],[0,-3],[-3,-4],[-2,-2],[-1,-2],[1,-4],[2,-9],[4,-9],[9,-6],[13,-2],[27,1],[5,-12],[2,1],[8,0],[7,1],[6,-2],[10,5],[20,22],[7,10],[-3,12],[-1,12],[6,10],[7,5],[6,-3],[5,-7],[5,-5],[3,1],[6,1],[7,5],[9,12],[14,29],[3,5],[5,13],[11,20],[4,12],[4,6],[9,2],[11,3],[4,3],[-1,6],[-1,5],[1,3],[12,6],[3,-1],[6,4],[3,-2],[4,1],[2,-1],[2,-1],[5,4],[20,13],[2,0],[3,-3],[4,-4],[12,-4],[9,-1],[4,1],[5,8],[4,15],[2,8],[-1,17],[3,3],[7,0],[12,13],[7,3],[23,1],[8,3],[6,0],[3,-2],[4,-1],[6,4],[-2,5],[0,3],[11,10]],[[1787,2228],[-10,-8],[4,-16],[25,-53]],[[1955,2280],[-10,-6],[-6,-3],[-14,-10],[-11,22],[-6,-4],[-33,-21],[-1,-3],[0,-3],[11,-21],[3,-2]],[[1888,2229],[-15,-24],[-2,-2],[-19,41],[-2,1],[-13,-9],[-12,-7],[-2,0],[-6,11],[-3,11]],[[1814,2251],[4,6],[3,0],[3,-1],[1,-10],[4,-4],[5,-1],[4,7],[8,22],[2,3],[14,20],[0,6],[4,9],[4,4],[1,0],[5,-6],[17,16],[8,0],[8,-4],[5,-5],[7,-6],[2,2],[5,6],[1,10],[-1,3],[2,1],[2,2]],[[1932,2331],[0,-1],[23,-50]],[[1685,1876],[-5,9],[-9,19]],[[1671,1904],[86,54]],[[1757,1958],[21,-45],[-17,-12],[-33,-21],[-6,-8],[-12,11],[-4,10],[-11,-7],[-10,-10]],[[1808,1847],[-32,-20],[-19,-11],[-18,-12]],[[1739,1804],[-14,31],[-6,8],[-9,10],[-10,9],[-8,7],[-7,7]],[[1757,1958],[33,21]],[[1790,1979],[11,-24]],[[1801,1955],[-15,-9],[0,-3],[8,-17],[21,-47],[0,-2],[-2,-2],[-14,-9],[9,-19]],[[1892,1898],[-50,-31],[-34,-20]],[[1801,1955],[11,8],[5,3],[14,8],[2,0],[1,-1],[10,-22],[16,10],[22,-47],[10,-16]],[[1926,1919],[-34,-21]],[[1790,1979],[25,17],[2,1],[4,3],[5,3],[10,8]],[[1836,2011],[22,19],[26,29]],[[1884,2059],[12,-25],[-9,-7],[-8,-8],[37,-79],[10,-21]],[[7184,3585],[-31,26],[-4,10]],[[7149,3621],[14,27],[7,10],[-7,5]],[[7163,3663],[7,12],[12,24],[12,24],[13,22],[12,21]],[[7294,3707],[-14,-13],[-9,-8],[-11,-11],[-22,-18],[-17,-15],[-8,-8]],[[7213,3634],[-5,-4],[-3,-5],[-1,-3],[-7,-13]],[[7197,3609],[-10,-16],[-1,-4],[-2,-4]],[[7163,3663],[-56,42]],[[7107,3705],[6,11],[12,25],[13,24]],[[7138,3765],[11,22],[13,22]],[[7162,3809],[57,-43]],[[7041,3571],[73,17],[4,8],[31,25]],[[7184,3585],[-8,-15],[-3,-6],[-8,-15]],[[7041,3571],[3,15],[5,12],[15,26],[1,2]],[[7078,3651],[12,20],[12,23],[5,11]],[[7197,3609],[41,-30],[14,23],[1,1]],[[7253,3603],[4,-4],[1,-1],[3,-3]],[[7261,3595],[-8,-18],[-44,-84]],[[7213,3634],[34,-27],[1,-1],[5,-3]],[[7279,3582],[-18,13]],[[7337,3728],[1,-7],[1,-2],[1,-2],[3,-2],[39,-31],[23,-15]],[[7405,3669],[-15,-27],[-26,-16],[-24,-13],[-21,-10],[-18,-13],[-12,-16]],[[7467,3693],[-7,1],[-10,1],[-11,-4],[-4,-1],[-3,-2],[-6,-1],[-8,-2],[-6,-3],[-7,-13]],[[7417,3758],[11,3],[53,8],[19,2],[8,0]],[[7508,3771],[0,-7],[-13,-9],[1,-24],[5,-1],[11,-7],[-36,-26],[-9,-4]],[[7621,3366],[-86,59],[-6,-8],[-57,37],[-6,-12],[-79,53]],[[7467,3693],[3,-5],[27,-23],[4,-5],[21,-12],[16,28]],[[7538,3676],[34,8],[12,-13],[-3,-36],[17,-23],[23,-5],[29,-10],[-9,-13],[-2,-16],[50,-51],[-68,-151]],[[7508,3771],[35,5],[14,2]],[[7557,3778],[27,1]],[[7584,3779],[49,-8]],[[7633,3771],[4,0],[4,-1],[2,-1],[11,-3],[7,1],[23,11],[9,2]],[[7693,3780],[2,0],[2,0],[3,-1],[9,-6],[8,-5]],[[7717,3768],[-3,-8],[-1,-3],[-5,-9],[-2,-3],[-2,-2],[-8,-8],[-1,-1],[-2,-2],[-3,-2],[-3,-1],[-4,-1],[-9,1],[-53,3],[-33,-1],[-3,0],[-4,-1],[-3,-1],[-3,-2],[-4,-3],[-7,-7],[-3,-4],[-11,-18],[-12,-19]],[[7583,3811],[12,-9],[5,9],[39,-29],[-6,-11]],[[7584,3779],[2,7],[-13,9],[-3,1],[-12,9],[9,18]],[[7567,3823],[16,-12]],[[7583,3811],[20,41]],[[7603,3852],[14,-10],[39,-29]],[[7656,3813],[18,-12],[19,-21]],[[7603,3852],[13,22],[5,10]],[[7621,3884],[3,-2],[9,-7],[2,-2]],[[7635,3873],[10,-7],[20,-14],[9,-6]],[[7674,3846],[-6,-12],[-6,-11]],[[7662,3823],[-5,-9],[-1,-1]],[[8132,4257],[13,22]],[[8145,4279],[8,-6],[26,-20],[8,-6]],[[8187,4247],[-5,-8],[-8,-14]],[[8132,4257],[-11,9],[-36,27],[-9,7],[-7,6],[-2,2]],[[8067,4308],[-27,20],[-2,2],[-8,6]],[[8030,4336],[13,22],[9,16]],[[8052,4374],[10,16]],[[8062,4390],[8,-6],[27,-22],[2,-1],[8,-7],[56,-43]],[[8163,4311],[-9,-16],[-9,-16]],[[8118,4233],[-11,8],[-35,28],[-7,-11],[-6,-11]],[[8059,4247],[-9,7]],[[8050,4254],[-9,7]],[[8041,4261],[6,11],[6,11],[7,12],[7,13]],[[8093,4189],[-10,8],[6,11],[6,12],[-36,27]],[[8082,4170],[-10,8],[-28,21],[-8,6],[-9,7]],[[8027,4212],[11,20],[12,22]],[[8052,4120],[-9,7],[5,9],[5,9],[-45,34]],[[8008,4179],[5,10],[5,8],[9,15]],[[8035,4095],[-5,9],[-6,5],[-30,22],[-9,7]],[[7985,4138],[8,15],[5,9],[1,2],[4,7],[5,8]],[[7985,4138],[-10,7],[-28,21],[-9,7]],[[7938,4173],[13,24]],[[7951,4197],[11,18]],[[7962,4215],[7,-6],[39,-30]],[[7962,4215],[9,18],[9,15]],[[7980,4248],[10,-7],[1,-2],[22,-16],[5,-4],[9,-7]],[[2022,1996],[-6,1],[-32,-19],[-9,-7]],[[1975,1971],[-1,6],[-16,34],[-10,21],[-17,36],[-3,6],[-3,0],[-15,-20],[-9,19],[-1,5]],[[1900,2078],[18,23],[46,53]],[[1964,2154],[17,-20],[2,-2]],[[1983,2132],[13,-28],[11,-24],[-17,-14],[10,-23],[11,-24],[11,-23]],[[1900,2078],[-48,103],[-4,-3],[-13,-9],[-2,-1],[-12,-8],[-15,-9]],[[1787,2228],[5,4],[11,5],[5,6],[6,8]],[[1888,2229],[9,13],[11,-23],[-14,-19],[-1,-3],[31,-66],[33,34],[7,-11]],[[1900,2078],[-16,-19]],[[1836,2011],[-13,27]],[[1823,2038],[12,8],[7,7],[26,31],[2,2],[0,2],[0,3],[-3,7],[-6,11],[-25,-19],[-5,-4],[-2,-3],[-3,-4],[-13,12],[-4,4],[-3,3],[-8,14],[-2,2],[-18,-9]],[[1778,2105],[-10,23]],[[7785,4046],[-12,-22]],[[7773,4024],[-10,7],[-10,7],[-8,-15],[-1,-2],[-10,7],[-10,8]],[[7724,4036],[9,18],[12,22]],[[7745,4076],[30,-23],[10,-7]],[[7773,4024],[-8,-15],[-2,-3],[-8,-15],[-1,-2]],[[7754,3989],[-9,-16],[-10,-17]],[[7735,3956],[-39,29]],[[7696,3985],[10,17],[9,17],[9,17]],[[7713,3916],[-10,8],[-19,14],[-9,8]],[[7675,3946],[6,11],[6,11],[9,17]],[[7735,3956],[-10,-18],[-5,-10],[-7,-12]],[[7675,3946],[-3,2],[-8,7],[-9,6],[-1,1],[-9,7],[-9,8],[-9,7],[-17,12]],[[7632,4035],[24,-19],[11,-7],[27,-22],[2,-2]],[[7675,3946],[-14,-26]],[[7661,3920],[-3,1],[-2,0],[-8,6],[-9,7],[-9,7],[-19,13],[-17,13]],[[7661,3920],[-12,-22]],[[7649,3898],[-14,-25]],[[7621,3884],[-6,5],[-9,6],[-17,13],[-17,12],[-3,2]],[[7700,3892],[-12,-22]],[[7688,3870],[-10,7],[-1,1],[-18,13],[-9,7],[-1,0]],[[7713,3916],[-13,-24]],[[7617,4078],[14,-10],[9,-8],[-3,-6],[38,-29],[13,24],[5,11]],[[7693,4060],[10,-8],[9,-6],[9,-8],[3,-2]],[[7654,4145],[14,-11]],[[7668,4134],[36,-26],[10,-8]],[[7714,4100],[-4,-8],[-8,-15],[-4,-9],[-5,-8]],[[7714,4100],[8,15],[8,17],[2,6]],[[7732,4138],[23,-17],[8,-6],[2,-2]],[[7765,4113],[-7,-13],[-4,-9],[-9,-15]],[[7668,4134],[8,16],[5,10],[6,12]],[[7687,4172],[45,-34]],[[7687,4172],[9,19],[10,-7],[11,21],[-10,7],[7,13],[6,13]],[[7720,4238],[37,-28],[2,-1],[5,-2],[1,-1],[1,-1]],[[7766,4205],[-7,-15],[-6,-12],[-11,-22],[-10,-18]],[[7766,4205],[3,-2],[5,-4],[17,-12],[8,-6],[3,-2]],[[7802,4179],[-8,-14],[-8,-13]],[[7786,4152],[-11,-22],[-10,-17]],[[7810,4195],[-8,-16]],[[7766,4205],[9,16],[5,10],[5,10]],[[7785,4241],[7,12],[8,-7],[17,-13],[8,-6],[3,-2]],[[7828,4225],[-6,-11],[-12,-19]],[[7720,4238],[5,9],[5,8],[5,10],[6,10],[44,-34]],[[7840,4247],[-12,-22]],[[7720,4238],[-36,26],[-3,5],[-8,9],[-4,5],[-5,3],[-20,16]],[[7644,4302],[37,53],[1,1]],[[7682,4356],[8,-7],[8,-9],[19,-15],[86,-50]],[[7803,4275],[9,-7],[16,-13],[9,-7],[3,-1]],[[7687,4172],[-29,22],[-14,10]],[[7596,4242],[9,8],[6,8],[18,25],[13,17],[2,2]],[[7591,4344],[20,-15],[3,-1],[28,-21]],[[7642,4307],[-2,-3],[4,-2]],[[7596,4242],[-4,3],[-19,15],[-16,11],[-5,2]],[[7552,4273],[8,14],[6,11],[6,11],[6,11],[-67,52]],[[7511,4372],[6,12],[6,11]],[[7523,4395],[68,-51]],[[7591,4344],[6,10],[5,10],[6,12]],[[7608,4376],[33,-24],[22,-16],[-9,-12],[-6,-9],[-6,-8]],[[7523,4395],[6,10],[5,10],[7,11]],[[7541,4426],[39,-29],[28,-21]],[[7541,4426],[6,12],[8,13]],[[7555,4451],[7,14],[6,12]],[[7568,4477],[37,-27],[31,-23]],[[7636,4427],[-6,-12],[-8,-14],[-7,-13],[-7,-12]],[[8574,3762],[-30,-96],[-18,-58],[-9,-42],[-3,0],[-5,0],[-4,-2]],[[8433,3609],[13,36],[10,31],[8,18],[8,17]],[[8472,3711],[7,14],[7,14],[2,3]],[[8472,3711],[-6,5],[-4,3],[-5,4],[-2,2],[-12,10],[-8,5],[-16,-28],[-5,-9],[-24,18]],[[8390,3721],[20,38]],[[8410,3759],[8,14],[9,15]],[[8359,3664],[5,10],[7,12],[4,8],[7,12],[8,15]],[[8360,3787],[24,-18],[20,-15],[6,5]],[[8068,3836],[8,15],[4,8],[6,12]],[[8129,3839],[-11,-20],[-9,-15],[-8,7],[-25,19],[-8,6]],[[8059,3820],[5,8],[4,8]],[[533,371],[-1,-3],[-1,-6],[-3,-6],[-2,-4],[-5,-11],[-5,-9],[-2,-3],[-2,-5],[-2,-7],[-1,-3],[-1,-6],[-1,-5],[-1,-7],[0,-5],[0,-7],[0,-5],[0,-6],[1,-8],[2,-10],[1,-5],[2,-15],[0,-4],[0,-3],[0,-2],[-1,-4],[-1,-6],[-1,-3],[-3,-7],[-2,-6],[-1,-4],[0,-4],[-1,-5],[0,-7]],[[502,180],[0,-3],[3,-10],[1,-3]],[[506,164],[-2,-2],[-5,-3],[-10,-8],[-7,-6],[-7,-7],[-7,-8],[-10,-11],[-8,-10],[-6,-11],[-4,-6],[-8,-16],[-9,-18]],[[423,58],[-1,1],[-5,3],[-5,-4],[0,-4],[-3,2],[-18,14],[-23,19],[-30,17],[-6,1],[-1,3],[3,0],[33,-17],[26,-22],[2,5],[-15,16],[3,1],[23,-16],[16,-13],[2,5],[-15,9],[-17,14],[-19,30],[0,3],[4,4],[1,7],[-1,6],[3,10],[0,9],[6,14],[2,3],[1,7],[0,2],[-1,5],[-14,19]],[[374,211],[19,37]],[[393,248],[7,-11],[11,-16],[5,-8],[4,-6],[13,-19],[5,11],[21,39],[17,35],[18,33],[3,5],[14,25],[7,14],[9,17],[-1,6],[5,-4],[2,2]],[[393,248],[-2,3],[-4,6],[-6,14],[4,7],[9,16],[15,30],[18,34],[-24,17],[-24,18],[-21,16],[-3,2],[-70,53],[-1,0],[-1,0],[-2,-1],[-3,0],[-3,4],[-13,22],[-8,15],[-10,15],[-4,8],[-30,33],[-19,19],[-10,11],[-4,5],[-3,3],[-2,3],[-4,11],[-3,8],[-1,11],[0,2],[-1,3],[0,7],[5,1],[8,1],[21,3],[18,2],[10,1],[10,0],[10,0],[10,-1],[42,-5],[12,-2],[41,-5],[4,-1],[50,-6],[59,-8]],[[463,623],[4,-6],[64,-126],[1,-5]],[[532,486],[0,-2],[0,-6],[-1,-8],[0,-17],[1,-11],[3,-25],[1,-13],[1,-4],[0,-7],[-1,-8],[0,-3],[-1,-2],[-1,-5],[-1,-4]],[[790,1603],[48,-45],[181,-263]],[[1019,1295],[-32,-16],[-7,15],[-18,-11],[-70,-42],[8,-20],[-77,-58],[-12,20],[-35,-27],[-72,50],[-19,-33],[-37,-19],[-9,30],[-42,-26],[-5,-68],[-25,-15],[-4,-64],[-45,38],[-148,-241],[27,-17],[3,-8],[62,-154],[1,-6]],[[374,211],[-1,2],[-3,1],[-3,6],[-3,2],[-4,2],[-4,7],[-2,3],[-8,10],[-5,13],[-5,8],[-3,2],[-13,16],[-4,7],[-6,20],[-8,13],[-6,9],[-2,6],[-1,8],[-6,12],[-4,6],[-5,4],[-10,6],[-4,-2],[-8,-8],[-3,0],[-3,5],[-7,1],[-1,8],[-7,11],[-3,8],[-4,3],[-5,7],[-4,0],[-3,-5],[-3,-1],[0,3],[2,5],[2,14],[0,9],[2,5],[2,1],[0,2],[1,3],[2,-3],[8,1],[5,5],[5,7],[5,14],[0,12],[0,5],[-3,12],[-4,9],[-4,6],[-2,7],[-4,3],[-4,1],[-7,-3],[-11,-1],[-7,4],[-5,6],[-4,10],[-2,8],[-9,13],[-2,-1],[-2,-2],[-8,-11],[-3,-7],[-4,-10],[-1,-8],[-2,0],[-2,4],[3,10],[-2,9],[0,6],[-1,3],[-5,5],[-3,1],[-1,6],[2,4],[0,3],[-17,29],[-6,13],[-6,9],[-3,2],[-6,0],[-7,0],[-1,-1],[-3,-1],[-14,-3],[-3,-11],[0,-4],[-4,-4],[-9,1],[-5,-4],[-8,-4],[-3,4],[0,7],[0,5],[-1,4],[-2,2],[-3,1],[-4,-2],[-5,-4],[-6,-5],[-5,-4],[-3,-1],[-3,-2],[-1,1],[0,-3],[-3,1],[-1,2],[-9,2],[-2,-1],[0,-3],[-2,-2],[-3,0],[-2,12],[1,4],[19,3],[0,3],[0,2],[-2,2],[-5,-1],[-6,-1],[-4,-1],[0,3],[-1,4],[-2,6],[0,3],[5,2],[2,-1],[2,1],[2,6],[5,14],[2,8],[5,8],[3,4],[4,3],[4,5],[4,4],[11,0],[14,-7],[4,-4],[2,-11],[2,-7],[5,-8],[7,-4],[4,-1],[3,-3],[3,1],[6,0],[9,1],[4,1],[3,0],[0,2],[-3,5],[1,7],[4,7],[2,10],[4,10],[-3,6],[-3,2],[0,4],[2,4],[3,11],[0,8],[-3,12],[-10,10],[-8,9],[-5,3],[-11,3],[-3,3],[-1,3],[-3,0],[-5,1],[-6,7],[-15,1],[-4,-7],[-4,-1],[-5,2],[-5,9],[-3,10],[-2,9],[-6,14],[2,35],[0,13],[-1,3],[0,4],[-2,8],[5,13],[4,9],[4,12],[-5,5],[-2,3],[0,3],[2,1],[7,-3],[7,2],[3,15],[-1,5],[-10,12],[0,5],[3,8],[5,18],[2,11],[5,8],[3,9],[3,13],[1,15],[2,12],[2,15],[3,9],[1,18],[6,22],[1,6],[3,28],[0,1],[2,3],[1,2],[6,-6],[1,0],[2,-2],[-3,-6],[1,-1],[2,-1],[3,5],[2,-1],[5,12],[2,-1],[-3,-7],[2,-1],[6,12],[9,40],[13,15],[9,3],[6,6],[18,-7],[6,-3],[7,2],[5,8],[4,8],[2,10],[-1,7],[-4,7],[-4,13],[-9,36],[-2,11],[0,4],[1,10],[2,4],[1,1],[3,2],[3,2],[0,3],[2,2],[7,2],[1,3],[2,0],[1,-10],[-1,-10],[13,-7],[3,-14],[1,-4],[5,1],[7,5],[6,6],[2,3],[1,3],[1,3],[4,3],[6,2],[5,0],[6,-8],[0,-5],[4,-3],[3,-1],[4,4],[3,9],[3,3],[2,1],[3,0],[7,10],[2,1],[2,-1],[1,-1],[3,1],[3,1],[1,3],[-5,8],[2,2],[5,-8],[2,0],[2,2],[4,0],[3,-4],[3,2],[2,4],[2,2],[2,0],[1,4],[13,8],[4,0],[8,-4],[5,-1],[3,1],[8,4],[5,1],[7,5],[4,7],[3,10],[1,11],[-1,9],[-4,9],[-5,7],[-7,1],[-3,-1],[-5,0],[-24,14],[-6,8],[-2,7],[2,6],[6,5],[4,1],[27,-1],[8,1],[10,7],[11,3],[8,0],[7,-1],[5,-7],[4,-9],[6,-7],[9,-13],[8,-1],[9,3],[22,0],[12,-1],[5,1],[8,3],[8,5],[5,4],[-1,7],[-13,10],[-1,5],[22,-1],[-1,2],[-3,5],[-5,3],[-3,4],[5,0],[9,-4],[7,4],[12,4],[4,5],[3,11],[0,9],[-4,5],[-3,2],[-13,7],[-3,2],[-3,1],[-5,0],[-13,7],[1,7],[6,13],[6,5],[7,0],[4,0],[3,-4],[5,-1],[3,0],[4,5],[5,11],[2,4],[4,5],[5,7],[8,7],[11,10],[3,1],[3,-9],[1,-2],[12,1],[4,-4],[4,-6],[3,-2],[5,-1],[1,1],[1,5],[1,1],[2,0],[0,-7],[0,-4],[3,0],[2,3],[2,-3],[1,-2],[5,-1],[8,1],[-1,3],[4,6],[7,2],[2,-6],[6,-1],[9,-6],[6,-14],[21,-4],[11,-6],[9,-2],[7,-1],[6,7],[6,0],[9,-2],[6,4],[7,12],[15,12],[2,9],[7,3],[7,14],[6,-12],[9,-1],[1,2],[-6,4],[-1,3],[1,6]],[[919,1105],[19,9],[-8,23],[1,1],[18,10],[49,25],[5,2],[4,2],[11,2],[5,1]],[[1023,1180],[28,-74],[-18,-11],[-19,-12],[-15,-9],[-1,-1],[-1,-1],[0,-1],[-1,-1],[-1,-1],[0,-2],[-3,-9],[-13,-49],[-1,-2],[-1,-4],[0,-1],[-1,-2],[-1,-2],[-2,-1],[-2,-1],[-5,-3],[-4,-2],[-5,16],[-1,2],[0,2],[1,1],[0,2],[2,11],[-8,3],[-2,2],[-1,1],[-1,1],[-1,3],[-3,7],[-6,16],[-18,47]],[[919,1105],[-9,24],[-8,20],[-14,34],[0,3],[1,1],[17,9],[19,11],[-8,20],[-7,17],[0,2],[1,0],[0,1],[0,1],[58,30],[2,0],[2,0],[1,-1],[4,-8],[1,-3],[1,-4],[1,-1],[0,-1],[-1,-1],[-8,-4],[7,-21],[18,9],[26,-63]],[[4094,3309],[23,-28],[-33,-36],[6,-6]],[[4090,3239],[-20,-5],[-13,-16],[-5,-4],[-5,1],[-5,2],[-4,5],[-9,20],[-3,9],[-5,8]],[[4021,3259],[16,16]],[[3947,3388],[8,4],[8,6]],[[3989,3344],[-5,5],[-37,39]],[[4025,3298],[-17,-13],[-2,0],[-12,10],[-12,15],[-4,2],[-5,1],[-4,-2],[-5,-3],[-6,-1],[-10,-14],[-1,-2],[-1,-9]],[[3946,3282],[-24,2],[-7,2],[-22,25],[-9,7],[-36,13],[-6,1],[-2,0],[-4,-2],[-11,-7],[1,3]],[[3826,3326],[10,7],[3,12],[3,13],[-48,15]],[[3794,3373],[-3,1]],[[3791,3374],[3,9],[7,26]],[[3801,3409],[2,-1],[72,-25],[14,-3],[15,-1],[5,0],[6,1],[16,2],[10,3],[6,3]],[[1702,1781],[9,-20],[16,10],[3,0],[21,-47],[32,-68]],[[1783,1656],[8,-18],[-1,-3],[-15,-20],[-7,-8],[-11,-18]],[[1757,1589],[-8,7],[-4,1],[-19,-2],[-25,-10],[-10,-4],[-4,-3],[-5,-5],[-9,22]],[[1673,1595],[15,12],[33,13],[-3,26]],[[1718,1646],[0,4],[-2,9],[-5,12],[-7,-3],[-31,-17],[-12,-7],[-9,-5],[-3,-1],[-2,2],[-6,19],[-8,23],[-7,23],[-3,6],[-5,11],[-2,5],[2,2],[31,20],[12,8],[41,24]],[[1757,1589],[-6,-11],[-4,-4],[-29,-21],[-37,-28],[-4,-2],[-2,-2],[-8,-3],[-6,-1],[-2,26],[0,8],[-2,27],[1,4],[12,11],[3,2]],[[1515,1277],[-13,1],[-3,0],[-4,-2],[-17,39],[-2,5],[-30,-19],[-1,0],[0,-1],[3,-19],[0,-1],[1,-1],[1,0],[1,0],[13,7],[1,0],[1,0],[1,0],[1,-1],[1,-1],[8,-17],[2,-5],[1,-5],[4,-27],[1,-1],[5,2],[3,0],[4,0],[8,-1],[1,-5],[2,-14],[1,-9],[-2,-26]],[[1507,1176],[-9,1],[-11,1]],[[1487,1178],[-3,4],[2,34],[-10,5],[-11,51],[-11,-7],[-9,2],[-8,15],[-5,32],[-14,99],[26,13],[-9,52]],[[1435,1478],[45,25],[17,-37],[24,11],[-3,16],[42,12]],[[1560,1505],[5,-19]],[[1565,1486],[-4,-2],[-14,-6],[-9,-6],[-12,-6],[-42,-22],[6,-23],[7,-20],[6,-17],[4,-11],[3,-5],[5,-11],[5,-9],[4,-6],[1,-6],[1,-5],[-1,-6],[-2,-9],[-3,-15],[-5,-24]],[[1565,1486],[11,-56],[3,-18],[1,-9],[1,-5],[2,-13],[4,-22],[8,-45],[0,-20],[0,-10]],[[1595,1288],[-52,-11],[-11,-2],[-4,-1],[-13,3]],[[1595,1288],[2,-9],[6,-19],[8,-21],[-36,-19],[-4,-4],[-5,-3],[-7,-7],[-10,-12],[-3,-4],[-12,-23],[-4,3],[-9,3],[-5,2],[-3,1],[-6,0]],[[1832,1366],[-6,-5],[-12,-10],[-11,-8],[-4,-2],[-7,-3],[-2,-1],[-6,0],[-3,0],[-6,1],[-8,6],[-5,3],[-15,10],[-4,3],[-3,2],[-11,8],[3,4],[2,5],[1,4],[1,5],[2,5],[1,4],[0,6],[0,12],[4,0],[5,1],[2,1],[5,3],[4,2],[5,1],[3,1],[1,0],[2,2],[1,3],[5,-4],[2,0],[1,0],[1,0],[14,4],[1,0],[0,1],[0,1],[0,1],[-4,22],[-2,14],[-1,1],[0,1],[-1,1],[-14,2],[0,8],[1,16]],[[1774,1497],[8,-1],[2,0],[2,0],[1,1],[2,0],[2,1],[2,1],[2,2],[6,3],[18,11],[4,3],[2,-6],[2,-7],[1,-5],[0,-3],[0,-2],[-1,-1],[-1,-2],[4,-9],[1,-4],[14,-69],[1,-3],[0,-1],[-18,-13],[-2,-4],[0,-2],[0,-3],[2,-8],[0,-2],[4,-8]],[[1934,1567],[23,-37],[26,-44]],[[1983,1486],[-93,-74],[-2,-2],[-6,-6],[-3,-2],[-6,-5],[-15,-10],[-26,-21]],[[1774,1497],[-1,9],[-8,45],[1,6],[2,6],[13,19],[7,-6],[2,-2],[1,-2],[4,-7],[1,0],[1,0],[14,9],[1,1],[1,1],[0,1],[0,1],[0,1],[-8,18],[-2,3],[-6,6],[13,15],[3,1],[5,1],[-17,8]],[[1801,1631],[12,15]],[[1813,1646],[20,24],[22,2]],[[1855,1672],[1,-13],[5,0],[14,1],[13,1],[1,-1],[1,0],[0,-1],[1,0],[13,-29],[21,-45],[9,-18]],[[1861,1129],[-7,35],[-2,10],[-45,-6],[2,-12],[-15,-4]],[[1794,1152],[-162,-19],[-4,13]],[[1628,1146],[27,10],[6,2],[22,9],[19,9],[10,4],[16,8],[6,3],[-2,6],[-1,3],[-1,5]],[[1730,1205],[43,23],[5,3],[4,3],[6,-5],[16,9],[15,10],[12,9],[19,13],[23,17],[22,19],[23,18],[67,55],[21,17],[7,6],[14,11]],[[2027,1413],[3,-5]],[[2030,1408],[-22,-19],[1,-7],[14,-64]],[[2023,1318],[-11,-5],[-23,-8],[19,-95],[-31,-17],[-14,4],[-19,-2],[-14,51],[-19,-10],[-9,-9],[1,-3],[-14,-6],[16,-73],[-44,-16]],[[1956,1014],[-20,-6],[-16,-5],[-20,-6]],[[1900,997],[-2,11],[-1,5],[2,5],[3,5],[-9,11],[-1,3],[-1,4],[-3,14],[-9,42],[-5,23]],[[1874,1120],[-13,9]],[[2023,1318],[1,-3],[5,-25],[5,-23],[-19,-5],[3,-15],[0,-5],[-4,-10],[-1,-5],[2,-6],[3,-3],[6,-8],[2,-5],[2,-8]],[[2028,1197],[-15,-4],[-6,-2],[-4,-1],[-10,-7],[-6,-6],[-7,-5],[-10,-11],[-3,-3],[-4,-4],[-2,-1],[-5,-2],[-14,-6],[-6,-4],[-2,-2],[-2,-2],[-2,-3],[-3,-6],[-1,-3],[-2,-8],[-1,-7],[0,-11],[0,-13],[14,1],[3,-2],[1,-4],[1,-3],[14,-64]],[[1874,1120],[-22,-9],[6,-25],[5,-22],[2,-11],[1,-5],[0,-5],[-1,-9],[-1,-1],[-1,-1],[-1,-1],[-1,0],[-24,6],[-22,5],[1,10],[0,9],[0,9],[-5,21],[-6,27],[-6,27],[-2,0],[-1,1],[0,1],[0,1],[0,1],[1,0],[-3,3]],[[1900,997],[14,-65],[72,-11],[9,-12],[5,-4],[-2,-2]],[[1998,903],[-54,-16],[-40,-10],[-47,-12],[-45,-12],[1,-6]],[[1813,847],[-136,-37],[-38,-8],[-32,-9],[-54,-17]],[[1553,776],[-46,314],[-1,2]],[[1506,1092],[0,1],[7,3],[12,6],[16,8],[19,9],[19,8],[9,4],[16,6],[24,9]],[[2040,958],[4,-7],[4,-5],[10,-8],[3,-2],[3,-5],[3,-11],[-69,-17]],[[1956,1014],[8,2],[2,0],[1,0],[3,-2],[28,-22],[7,17]],[[7827,2883],[-1,2],[-31,15]],[[7795,2900],[-50,27]],[[7745,2927],[13,22],[3,1],[2,4],[3,3]],[[7766,2957],[2,4],[1,2],[7,10],[8,9]],[[7784,2982],[21,-21],[20,-19],[7,-7],[9,-9],[9,-9]],[[7850,2917],[-3,-5],[-14,-20],[-2,-3],[-4,-6]],[[2028,1197],[20,4],[21,4]],[[2069,1205],[13,3],[4,-1],[3,-2],[2,-5],[4,-35],[1,-24]],[[2096,1141],[3,-24],[0,-6],[0,-3],[-1,-4],[-1,-3],[-4,-5]],[[1830,564],[-15,90]],[[1815,654],[-23,137],[-2,10],[1,4],[2,1],[28,7],[-1,5],[-1,4],[-1,3],[-1,5],[-2,7],[-2,10]],[[1813,847],[66,16]],[[1879,863],[3,-17],[1,-4],[0,-3],[1,-4],[0,-3],[3,-2],[2,-7],[-1,-3]],[[1888,820],[3,-9],[5,-15],[5,-18],[21,-101]],[[1922,677],[18,-86]],[[1940,591],[-36,-9],[-42,-9],[-19,-4],[-13,-5]],[[2004,847],[5,-26],[12,-61],[0,-3],[0,-2],[-1,-1],[-1,-1],[-4,-3],[-5,-3],[-10,-3],[6,-29],[-19,-11],[-23,-12],[-9,-5],[-12,-4],[-21,-6]],[[1888,820],[25,7],[22,5],[34,9],[4,0],[5,-2],[6,-2],[5,1],[4,2],[6,4],[5,3]],[[2077,670],[-5,-3],[-30,-27],[-12,-10],[-11,-8],[-12,-8],[-17,-9],[-10,-4],[-18,-5],[-22,-5]],[[2004,847],[21,5],[43,11],[5,-23],[5,-22],[5,-24],[6,-29],[-17,-11],[-3,-1],[0,-3],[5,-21],[-18,-10],[-2,-3],[0,-4],[4,-20],[3,-1],[9,5],[7,-26]],[[1962,486],[-1,4],[0,17],[-4,9],[-4,10],[-13,65]],[[2077,670],[15,8],[14,5],[26,9],[4,1],[30,10],[16,5],[5,3],[4,2],[3,1],[5,3],[6,4],[5,4],[5,4]],[[2215,729],[4,5],[9,10]],[[2228,744],[35,-8],[37,-30]],[[2300,706],[-2,0],[-10,-1],[0,-2],[-15,-8],[7,-17],[-5,-2],[-8,12],[-2,-1],[-2,-1],[-1,-3],[-3,-5],[-4,-5],[-6,-10],[-8,-9],[-7,-3],[-7,-3],[-5,-3],[-16,-5],[-4,9],[-4,1],[-2,-2],[-2,-6],[-8,0],[0,-4],[-3,-2],[-5,1],[-1,3],[-2,0],[0,-5],[0,-2],[-2,-1],[-5,-1],[-2,4],[-1,1],[-4,0],[-17,-5],[-3,-1],[-5,-4],[-4,-2],[-8,-7],[-6,-5],[-2,-3],[1,-6],[0,-2],[-3,-2],[-2,0],[-3,1],[-14,0],[-2,0],[-1,-2],[0,-4],[-1,-2],[-1,-1],[-1,1],[-3,4],[-7,0],[-5,3],[-6,0],[-2,-3],[-13,-8],[-5,-11],[-6,-4],[-4,-5],[-3,-2],[-8,-6],[-6,-3],[-5,-5],[-4,-8],[-2,-10],[-3,-8],[-5,-8],[-4,-5],[-2,-4],[-2,-8],[-2,-3],[-16,-1],[-3,-2],[-7,-5],[-4,-4]],[[2537,873],[-28,28]],[[2509,901],[31,18]],[[2540,919],[68,41],[7,-27],[2,-12],[2,-3],[2,-1],[14,-3],[14,-4],[10,-3],[16,-8],[16,-10]],[[2691,889],[9,-5],[6,-4],[4,-4],[4,-2],[13,-10],[6,-6],[6,-2],[51,-24],[28,-13],[6,2],[5,3],[5,4],[4,7],[3,7],[1,8],[1,5],[0,1],[-1,4],[0,3],[3,1],[4,2],[5,3],[8,3]],[[2862,872],[11,3],[11,3],[5,2]],[[2889,880],[9,-7]],[[2898,873],[-4,-1],[-5,-5],[-12,-3],[-18,-8],[-2,-4],[0,-8],[-1,-5],[-1,0],[-3,1],[-4,-3],[-3,-2],[3,-3],[-2,-5],[5,-7],[-5,-6],[-4,3],[-7,-7],[-2,2],[-1,-2],[1,-2],[-4,-14],[-8,-7],[-10,-1],[-3,-4],[-4,-5],[-9,0],[-2,0],[1,20],[-3,13],[-1,1],[-3,-1],[-3,-3],[-2,1],[-7,5],[-1,1],[-7,1],[-3,1],[-2,2],[-7,4],[-7,2],[-9,4],[-4,4],[-3,0],[-2,2],[-2,2],[-3,9],[-1,11],[-2,5],[-6,3],[-6,5],[-5,-2],[-6,3],[-3,3],[-14,8],[-9,7],[0,1],[-1,1],[-7,1],[-5,1],[-14,8],[-6,2],[-4,3],[-11,4],[-10,5],[-3,0],[-7,-1],[-5,-3],[-9,-6],[-2,-2],[-9,-4],[-20,-9],[-8,-6],[-7,-2],[-6,-7],[-2,-1]],[[1618,401],[-2,10]],[[1616,411],[-4,21]],[[1612,432],[15,23],[11,13],[9,8],[12,8],[6,4]],[[1665,488],[6,-35],[6,-30],[10,3],[24,6],[18,5],[6,2],[6,2],[10,1],[-14,83],[28,12],[43,18],[22,9]],[[1962,486],[-10,-12],[0,-4],[2,-4],[2,-3],[4,-13],[0,-4],[-1,-7],[1,-11],[-3,-8],[-11,-13],[-4,-2],[-20,-2],[-2,-1],[-8,0],[-3,1],[-4,6],[-7,14],[-3,4],[-1,4],[-5,2],[-4,10],[-2,4],[-3,4],[-3,0],[-9,-4],[-2,0],[-8,-2],[-6,-2],[-8,-5],[-9,-2],[-5,-7],[-10,-11],[-7,-10],[-4,-4],[-18,0],[-7,5],[-4,4],[-10,4],[-8,4],[-5,1],[-7,1],[-8,-1],[-9,-2],[-14,-6],[-7,-5],[-10,-2],[-12,-5],[-17,-3],[-13,3],[-13,2],[-23,0],[-6,-3]],[[1665,488],[22,14],[12,8],[9,4],[1,3],[-4,22],[-3,15],[-1,9],[-12,74]],[[1689,637],[6,1],[5,0],[4,1],[14,4],[15,3],[12,2],[14,1],[33,3],[23,2]],[[1612,432],[-14,74],[-20,109]],[[1578,615],[-16,112]],[[1562,727],[9,3],[22,7],[21,6],[11,-65],[4,-25],[13,3],[1,-5],[4,-21],[19,4],[12,3],[11,0]],[[1562,727],[-4,21],[-1,5],[-4,23]],[[1578,615],[-12,-7],[-24,-14],[-4,-2],[-6,-3],[-11,-3],[-11,-2],[-16,-9],[-16,-9]],[[1478,566],[-5,34],[-8,47],[-26,-14],[-7,33],[-5,-2],[-8,-4],[-13,-4],[-6,-1],[-3,-1],[-15,-3],[-7,-4],[-19,-11],[-26,-16],[-43,-26],[-13,-8]],[[1274,586],[-31,-18],[-16,-9],[-12,-7],[-2,-3],[-1,-1],[-1,-3],[0,-1],[0,-4],[1,-12],[-1,-4],[-1,-3],[-3,-3],[-4,-2],[-3,0],[-3,0],[-3,0],[1,-12],[-34,-20],[-28,-17],[-7,-4],[-9,-5],[-11,-8],[-13,-9],[-3,-3],[-6,-4],[-2,-1],[-4,-2],[-48,-29],[0,-1]],[[1030,401],[-9,19],[-26,-16],[-40,-24],[-1,-1],[-1,-1],[0,-1],[-12,-118],[-28,3],[-12,-128],[0,-3],[0,-5],[2,-8],[5,-14]],[[908,104],[-9,-3],[-7,-2],[-7,-1],[-8,0],[-23,-1]],[[854,97],[4,44],[9,91],[3,33],[5,93],[-1,4],[21,226],[4,2],[7,3],[3,1],[4,2],[4,1],[1,1],[1,1],[5,2],[2,1],[2,2],[6,3],[2,1],[1,1],[1,0],[8,7],[4,2],[5,4],[8,7],[9,7],[1,1],[2,2],[4,4],[7,6],[1,1],[21,18],[19,17],[2,2],[3,3],[11,10],[24,21],[24,21],[1,1],[2,2],[19,17],[57,51],[14,12],[13,12],[4,3],[1,1],[1,1],[12,11],[12,11],[7,6],[8,7],[41,36],[35,31],[3,3],[5,4],[19,18],[24,21],[20,18],[9,8],[17,15],[7,6],[13,10],[16,12],[6,4],[5,4],[8,5],[5,3],[4,2],[5,3],[4,3],[6,3],[4,2],[8,4]],[[1478,566],[-24,-14],[-7,-5],[-14,-9],[-12,-5],[-25,-12],[-20,-8]],[[1376,513],[-12,-4],[-22,-15],[-24,-16],[-10,-7],[-11,-8],[-22,-10]],[[1275,453],[-2,3],[-1,15],[-1,14],[0,10],[0,8],[3,16],[2,11],[0,10],[0,10],[0,11],[-2,25]],[[2801,2509],[-8,14],[-43,35],[-3,3],[-21,35],[9,8],[3,6],[12,31],[20,-11],[11,-5]],[[2857,2557],[-5,-3],[-19,-17],[-32,-28]],[[3801,3409],[3,11],[2,-2],[8,-9],[3,0],[10,15],[10,-3],[4,-1],[2,0],[1,-1],[2,0],[2,7],[-2,5],[-26,26],[-59,63],[-13,-1],[-3,0],[-2,14],[-1,9]],[[3801,3409],[-36,12]],[[3765,3421],[-3,4],[-9,9],[-47,48],[-56,57],[-2,9]],[[3648,3548],[12,-2],[10,-3],[30,-6],[16,-2],[6,2],[10,4],[10,1]],[[3626,3472],[24,-11],[34,-12],[19,-6],[49,-18],[13,-4]],[[3791,3374],[-69,29]],[[3722,3403],[-59,23],[-37,46]],[[3794,3373],[-12,-48]],[[3782,3325],[-1,0],[-1,1],[-15,16],[6,8],[4,15],[-1,3],[-34,12],[-5,-7],[-6,-8],[-17,-14],[-2,-3],[0,-2],[10,-16],[17,-23],[12,-16]],[[3749,3291],[-16,-15],[-5,-6],[-6,-10],[-6,-16],[-3,-14]],[[3713,3230],[-18,5],[4,21],[4,16],[0,5],[-1,4],[-16,23]],[[3686,3304],[-6,9],[-7,10],[-71,-56],[-7,11]],[[3595,3278],[49,40],[61,74],[5,9],[12,2]],[[3782,3325],[-5,-20],[-3,-7]],[[3774,3298],[-7,-1],[-10,-1],[-8,-5]],[[3713,3230],[-1,-24]],[[3712,3206],[-35,11],[-10,2],[-11,-1],[-10,-2],[-2,-2],[0,-3],[1,-3],[17,-20],[2,-3],[-16,-10],[-19,23],[-3,9],[-3,1],[-16,-6],[-2,-3],[0,-3],[2,-3],[27,-31],[-16,-13]],[[3618,3149],[-15,17],[-14,17],[-7,14],[-5,12]],[[3577,3209],[16,10],[6,3],[17,7],[-5,15],[27,22],[16,12],[32,26]],[[3712,3206],[-1,-60]],[[3711,3146],[5,-45]],[[3716,3101],[-39,-6],[-11,-5],[-13,-9]],[[3653,3081],[-7,21],[-6,17],[-3,7],[-6,8],[-13,15]],[[3577,3209],[-16,-12],[-3,-4],[-10,-12],[-3,-7],[-4,-15],[-1,-10],[-2,-17],[-2,-10],[-6,-12],[-6,-9],[1,-1],[8,-15],[13,-24],[-1,-2],[-13,-10],[-10,18],[-13,24],[-10,-8],[-7,-6],[-5,-9]],[[3487,3068],[-10,5],[-11,3],[-13,0],[-9,-2],[-7,-3],[-9,-6],[-9,-7],[-16,-13],[-18,-14]],[[3385,3031],[-39,66]],[[3346,3097],[-25,44]],[[3321,3141],[18,14],[5,-10],[151,119],[27,-41],[73,55]],[[3321,3141],[-29,48]],[[3292,3189],[18,14],[20,16],[13,10]],[[3343,3229],[28,-47],[20,17],[20,16],[131,103],[1,2],[-1,4],[-12,20],[-14,23]],[[3516,3367],[22,16],[32,26],[26,21],[-94,34],[-79,30],[-12,21]],[[3411,3515],[-4,7],[-7,21]],[[3528,3531],[15,-10],[56,-35],[17,-9],[10,-5]],[[3343,3229],[11,9],[10,8],[20,16],[10,8]],[[3394,3270],[68,54],[21,16],[20,16]],[[3503,3356],[13,11]],[[3394,3270],[-14,23],[12,10],[-12,20],[-3,7],[-3,4],[-12,19],[-12,-9]],[[3350,3344],[-13,24],[68,54]],[[3405,3422],[20,18],[20,17],[23,-41],[12,-20],[12,-20],[11,-20]],[[3292,3189],[-25,42]],[[3267,3231],[-10,18]],[[3257,3249],[18,14],[-3,10],[-1,9],[1,9],[3,8],[11,18],[20,-16],[7,11],[6,6],[4,4],[27,22]],[[3257,3249],[-20,36],[13,10],[-6,11],[-13,-11],[-8,14],[-2,3]],[[3221,3312],[22,17],[-3,6],[-2,6],[0,21],[33,30],[5,5],[10,9],[15,14],[16,14],[22,-32],[17,13],[10,8],[16,12]],[[3382,3435],[11,8],[12,-21]],[[3382,3435],[-23,32],[-10,-9],[-18,20]],[[3331,3478],[-11,11],[13,18],[14,-15],[1,0],[2,0],[17,17],[10,11],[3,4],[3,0],[20,-7],[8,-2]],[[3331,3478],[-17,-16],[-48,49],[-54,56],[-25,25],[8,3],[7,4],[9,3],[13,2]],[[3224,3604],[17,-19],[29,-11],[68,-26],[-46,55]],[[3292,3603],[9,0],[7,0]],[[9039,4992],[-6,1],[-27,7],[-17,5],[-13,4],[-7,4],[-39,21],[-14,3],[-17,9]],[[8899,5046],[5,12],[4,11],[17,-9],[4,12],[5,12],[-17,9],[-9,5]],[[8908,5098],[8,24],[9,23]],[[8925,5145],[5,12],[4,12],[6,14],[0,3],[2,7]],[[8942,5193],[7,3],[6,1],[4,-1],[6,1],[5,0],[6,-1],[3,-1],[13,9],[1,0],[4,10],[3,5]],[[9000,5219],[3,-1]],[[9040,5199],[-24,-47],[4,-4],[-3,-9],[6,-5],[-2,-4],[19,-12],[5,12],[4,-2],[36,72],[-2,2],[25,45],[5,-3],[-18,-41],[4,-6],[1,-4],[-3,-10],[-3,-3],[-3,-6],[-3,-6],[-2,-5],[3,-5],[7,-11],[0,-3],[0,-3],[0,-3],[3,-3],[2,5],[38,59],[11,-9],[-75,-125],[-13,-25],[-23,-48]],[[8942,5193],[-9,4],[-15,8],[-9,5]],[[8927,5255],[60,-30],[3,-2],[10,-4]],[[8474,3994],[10,-7],[14,-12]],[[8498,3975],[26,-20]],[[8446,4016],[12,22],[8,-6],[13,-10],[8,-6]],[[8487,4016],[24,-19],[-13,-22]],[[8418,4037],[9,16],[3,6],[7,13],[9,14],[13,24]],[[8459,4110],[27,-21]],[[8486,4089],[10,-7],[18,-15]],[[8514,4067],[-6,-11],[-15,-28],[-6,-12]],[[8597,4005],[2,-1],[1,-1],[1,-1],[3,-3],[-2,-7],[5,-1],[3,-1],[12,-4],[12,-3]],[[8634,3983],[-13,-66],[6,-2],[-7,-34]],[[8514,4067],[17,-13],[16,-12],[10,-9],[4,-1],[5,-4],[19,-14],[6,-4],[6,-5]],[[3440,1055],[-2,1],[-17,26],[-5,3],[-5,3],[-6,-1],[-7,-3],[-8,-10],[-4,-8],[-3,-9],[-57,-8],[-6,-8],[-3,-2],[-2,-3],[-9,-6],[-1,-3],[-2,-1],[-4,-5],[-3,0],[-6,6],[-3,1],[-7,0],[-1,4],[-2,0],[-7,0],[-4,-2],[-12,-3],[-5,-1],[-10,0],[-5,-1],[-2,-3],[-3,-3],[-11,2],[-1,1],[-4,4],[-2,1],[-4,-1],[-10,-4],[-6,-5],[-3,-3],[-8,-5],[-6,-1],[1,-3],[-3,-4],[-7,-4],[-5,0],[-1,-1],[0,-2],[-1,-2],[0,-1],[2,-4],[0,-1],[-6,-14],[-1,-4],[1,-3],[17,-12],[-7,-7],[0,-5],[-4,-5],[-14,-6],[-6,-2],[-34,-20],[-5,-5],[-2,-3],[-10,-9],[-4,-7],[8,-11],[5,-7],[0,-4],[7,-4],[-1,-2],[7,-7],[2,2],[3,-2],[-6,-10],[-2,1],[-1,0],[2,-2],[1,-4],[-1,-2],[-14,-22],[-6,0],[-5,2],[-8,0],[-4,4],[-2,4],[-2,2],[-7,2],[-5,-2],[-9,-7],[-4,-1],[-12,-10],[-8,-9],[-3,-2],[1,-10],[3,-9],[1,-9],[0,-6],[-2,-4],[-4,-1],[-4,0],[-4,2],[-7,5],[-5,8],[-1,3],[0,4],[1,7],[6,11],[0,7],[-2,5],[-1,7],[-1,5],[1,7],[2,3],[-1,6],[-5,8],[-5,8],[-2,5],[-2,0],[-1,0],[-1,1],[-2,5],[-1,0],[-8,0],[-7,2],[-6,0],[-3,4],[-2,0],[-8,-2],[-4,0],[-4,5],[-9,4],[-4,-2],[-1,0],[-3,0],[-3,4],[-5,3],[-4,-3],[-6,-1],[-6,0],[-3,-1],[0,-1]],[[2889,880],[5,1],[12,4],[-5,22],[22,7],[8,-30],[10,-4],[5,-1],[7,-1],[-5,45],[5,1],[13,4],[20,7],[14,5],[21,7]],[[3021,947],[11,-49],[13,4],[4,3],[4,4],[4,4],[3,3],[15,8],[8,3],[26,7],[16,3],[6,2],[3,1],[3,3],[2,5],[5,10],[2,8],[1,11],[1,7],[4,9]],[[3152,993],[7,10],[6,6],[8,6],[9,6],[6,4],[8,3],[7,3],[6,1],[7,-1],[8,-1],[6,1],[3,0],[19,4],[5,1],[10,0],[14,-1],[8,-1],[8,2],[8,5],[15,18]],[[3320,1059],[22,26],[11,12],[19,21],[11,13],[6,7],[10,9],[8,6],[13,6]],[[3420,1159],[5,4],[20,-86],[-5,-22]],[[2889,880],[3,18],[-16,73],[-53,204],[-1,4]],[[2822,1179],[2,1],[9,4],[1,0],[34,16],[34,16],[20,9],[17,7],[14,6],[27,11],[1,-4],[1,-6],[2,-16]],[[2984,1223],[3,-19],[5,-32],[6,-23],[3,-13],[2,-9],[7,-22],[14,-55]],[[3024,1050],[16,-66],[8,-27],[-27,-10]],[[3024,1050],[19,8],[3,2],[23,7],[20,7],[20,7]],[[3109,1081],[4,-14],[9,-23],[4,-18],[3,-1],[3,-3],[20,-29]],[[3120,1129],[-6,-1],[-5,-2],[-2,-1],[-2,-3],[-1,-4],[0,-6],[5,-31]],[[2984,1223],[8,1],[4,-1],[14,-3],[9,-1],[13,-1]],[[3032,1218],[0,-2],[2,-10],[4,-17],[0,-2],[1,-2],[1,-1],[1,0],[20,-3],[7,0],[19,6],[4,1],[2,-3],[13,-17],[4,-6],[4,-6],[2,-6],[2,-7],[1,-9],[1,-5]],[[3120,1129],[2,2],[10,3],[32,10],[34,11]],[[3198,1155],[24,10],[11,8],[25,17],[17,11],[7,5],[17,11]],[[3299,1217],[1,-3],[2,-8],[0,-2],[1,-5],[0,-5],[-18,-12],[-1,-2],[0,-3],[0,-2],[16,-64],[5,-24],[4,-15],[2,-4],[9,-9]],[[3032,1218],[6,1],[14,4],[9,1],[8,0],[8,0],[3,1],[2,-1],[0,7],[3,10],[2,7],[4,5],[3,4],[22,16],[4,3],[5,10],[2,7],[33,10],[1,-1],[0,-1],[4,-15],[5,-20],[6,-22],[8,-33],[3,-12],[11,-44]],[[2822,1179],[0,1],[-5,18]],[[2817,1198],[114,52],[45,19],[45,20],[49,23],[20,8]],[[3090,1320],[27,11],[95,42]],[[3215,1375],[2,-11],[3,-13],[0,-1],[3,-13],[1,-3]],[[3224,1334],[1,-4],[23,7],[-2,-7],[0,-5],[1,-2],[10,-40],[6,-24],[6,-23],[23,8],[26,10],[7,4],[-5,21],[-6,23],[-11,48],[24,12],[39,22],[25,-104]],[[3391,1280],[-31,-21],[-61,-42]],[[3224,1334],[1,0],[3,1],[29,9],[5,2],[7,2],[14,5],[10,4],[10,4],[16,8],[9,5],[11,6],[8,4],[8,5],[12,8],[4,3],[12,7],[9,7],[11,8],[5,3],[13,8],[14,10],[7,5],[18,12],[13,9],[1,-4],[1,-3],[0,-2],[20,-81]],[[3495,1379],[-20,-19],[-4,-7],[-4,-7],[-3,-8],[-1,-8],[-2,-12],[-1,-18],[-15,1],[-12,-4],[-22,-7],[-9,-3],[-11,-7]],[[3948,1440],[2,-9]],[[3950,1431],[-5,0],[-2,1],[-3,5],[-3,8],[-9,5],[-2,3],[-10,9],[-6,4],[-4,4],[-3,2],[-15,5],[-3,3],[-4,0],[-14,0],[-8,6],[-3,2],[-7,4],[-24,15],[-5,2],[-11,3],[-8,1],[-2,-1],[-12,-8],[-13,1],[-3,7],[-4,3],[-10,3],[-2,3],[-3,1],[-13,4],[-36,-1],[-5,2],[-24,2],[-4,-5],[-1,-6],[-5,-1],[-4,3],[-8,0],[-11,-3],[-5,-7],[-5,0],[-2,1],[-7,0],[-10,-7],[0,-12],[-11,-10],[-16,-11],[-21,-20],[-2,-7],[2,-5],[2,-8],[-2,-3],[-2,-11],[-3,-8],[-5,-6],[-13,-12],[-5,-2],[-7,6],[-3,-2],[0,-3],[-13,-8],[-3,1],[-3,-2],[-19,-15],[-11,-12],[-8,-9],[-3,-8],[0,-6],[6,-2],[2,-8],[2,-12],[-4,-15],[-7,-22],[-4,-3],[-9,-20],[0,-4],[6,-20],[1,-7],[0,-9],[-2,-16],[-2,-5],[-2,-1],[-1,-1],[0,-3],[-4,-13],[-1,-9],[-1,-1],[3,-12],[0,-11],[0,-7],[6,-7],[5,-8],[12,-9],[1,-6],[1,-10],[-3,-1],[-4,0],[-3,-5],[0,-4],[-1,-6],[-6,-10],[-2,-6],[-4,0],[-4,-2],[-2,-4],[-5,3]],[[3420,1159],[-29,121]],[[3495,1379],[8,6],[9,5],[7,3],[4,2],[6,3],[6,6],[4,6],[5,10],[2,7],[2,8],[1,7],[1,7],[-1,6],[-1,5],[0,5],[1,6],[5,6],[4,3],[23,13],[5,3],[7,2],[4,3],[9,7],[5,3],[15,4],[5,3],[15,12],[5,2],[4,1],[3,-1],[5,0],[4,-1],[24,-1],[7,0],[6,1],[9,1],[2,0],[3,-1],[5,-1],[3,-1],[3,0]],[[3729,1529],[5,0],[4,-1],[9,-3],[12,-4],[3,-1],[6,-2],[6,-1],[3,1],[11,5],[5,1],[1,0],[4,-1],[1,0],[29,-12],[6,-3],[8,-7],[12,-7],[16,-7],[6,-2],[10,-2],[3,-1],[5,-2],[6,-2],[10,-6],[6,-5],[26,-21],[6,-6]],[[2801,2509],[-22,-21]],[[2779,2488],[-19,-15]],[[2760,2473],[-71,115]],[[2689,2588],[20,16],[7,8],[15,39]],[[2731,2651],[13,36],[4,7],[6,7],[5,5],[16,13]],[[2775,2719],[12,-20],[13,-24],[8,-13],[11,-6]],[[3648,3548],[-13,2],[-9,1],[-11,0],[-18,-2],[-16,1],[-16,2],[-4,11],[-4,3],[-14,4],[-2,2],[-5,19],[-14,-10],[-2,0],[-43,17],[2,8],[-2,3],[-35,35],[-17,-22],[6,-6],[17,-7],[-6,-21]],[[3442,3588],[-3,4],[-14,12],[-100,116],[-46,48]],[[3279,3768],[8,4],[15,4],[9,4],[10,1],[0,2],[1,1],[11,0],[6,0],[11,-1],[6,-2],[17,-7],[16,-8],[4,-4],[5,-7],[3,-8],[4,-7],[5,-3],[8,-2],[21,0],[2,2],[3,3],[1,1],[27,1],[33,-1],[8,-2],[8,-5],[3,-3],[1,-14],[4,-9],[4,-12],[0,-33],[3,-21],[3,-12],[3,-30],[2,-7],[5,-5],[7,-4],[5,-1],[6,-3],[2,-2],[11,-18],[3,-2],[3,-4],[3,0],[2,1],[3,1],[24,-2],[10,-1],[23,-2],[29,-6],[12,-1],[7,-2],[15,-2],[6,1],[8,4],[7,2],[7,1]],[[5918,1454],[-47,1]],[[5961,1453],[-43,1]],[[5918,1320],[0,8],[0,6],[0,120]],[[5985,1452],[0,-32]],[[5985,1420],[1,-99]],[[5986,1321],[-23,0],[-22,0]],[[5985,1420],[20,0],[20,0],[20,0]],[[6045,1420],[1,-99]],[[6046,1321],[-20,0]],[[6026,1321],[-21,0],[-19,0]],[[6045,1420],[20,0],[20,0],[20,1]],[[6105,1421],[0,-70],[0,-30]],[[6105,1321],[-19,0],[-21,0],[-19,0]],[[6105,1321],[1,-64]],[[6106,1257],[-14,4],[-6,0],[-20,-1],[-20,-1],[-20,-2],[0,64]],[[6045,1420],[-1,67],[21,0],[20,-2],[9,-2],[9,-2],[3,-1]],[[6106,1480],[-1,-59]],[[6109,1506],[-1,-16]],[[6108,1490],[-1,-4],[-1,-6]],[[3833,2087],[-15,-12],[-3,-3],[-13,-10],[-3,-1],[-7,-4],[-15,-3],[-9,-4],[-6,-4],[-59,-48]],[[3703,1998],[-11,19],[-32,53],[-3,1],[-8,-6],[-6,-3],[-16,-4],[-5,11],[-12,19],[-11,17],[-21,35],[-15,-13]],[[3563,2127],[-11,18],[-11,20],[-30,-24],[-11,18],[-5,9],[-33,-26]],[[3462,2142],[-31,83],[-17,-14],[-8,-8],[-6,-13],[-15,-42],[-5,-9],[-6,-7],[-15,-13],[-32,-27],[-7,-5]],[[3320,2087],[-26,-23],[-45,-36]],[[3249,2028],[-31,-27],[-23,-21],[-2,-2],[-1,-3],[-12,-9],[-16,-14],[-17,-14],[-15,-12],[-25,-21],[-4,-2],[-12,-5],[-2,0],[-5,-2]],[[3084,1896],[-6,22],[-7,26],[-5,15],[-2,8],[-3,6],[-7,14],[-11,18],[-7,12],[-17,27],[0,1],[-3,5]],[[2940,2167],[-2,3],[-39,64]],[[2889,2260],[325,267]],[[3214,2527],[9,-22],[13,-27],[24,-39],[2,-3],[3,-5],[215,154],[36,31],[51,35],[37,22],[4,6]],[[3608,2679],[1,1],[11,-17],[4,-7],[8,-14]],[[3632,2642],[14,-25],[14,-23],[4,-6],[3,-5],[2,-5],[1,-1],[15,-25],[15,-25],[10,-17],[8,-12],[12,-22],[5,-10],[2,-4],[15,-26],[7,-12],[8,-14],[9,-14],[14,-24],[13,-20],[35,-61],[54,-93],[6,-9],[5,-8],[16,-24],[-36,-29],[-50,-41]],[[3214,2527],[-2,3],[-6,10]],[[3206,2540],[-13,18],[-12,19],[-3,5],[-9,16],[-17,29]],[[3152,2627],[-15,28]],[[3137,2655],[18,14],[4,3],[18,14],[5,3],[17,15],[4,3],[5,2],[1,1],[5,0],[16,0],[10,0],[12,0],[1,-24],[-1,-14],[31,-4],[0,-7],[1,0],[4,0],[14,-2],[5,0],[4,0],[4,1],[11,3],[11,4],[9,4],[4,3],[54,42]],[[3404,2716],[49,38],[48,37],[26,26],[3,3]],[[3530,2820],[75,-130],[2,-3]],[[3607,2687],[-3,-2],[1,-2],[3,-4]],[[3530,2820],[14,15],[-2,3],[9,10],[-14,23],[15,12]],[[3552,2883],[5,-3],[12,-21],[12,-19],[0,-6]],[[3581,2834],[10,2],[34,26],[43,-73],[-29,-23],[-3,-3],[-3,-8],[-1,-5],[9,-4],[2,-2],[10,-17],[2,-3],[-18,-14],[-8,-6],[-22,-17]],[[3054,2513],[4,4],[5,7],[2,4],[-12,17],[-6,6]],[[3047,2551],[55,47],[11,7],[39,22]],[[3206,2540],[-55,-46],[-5,-4],[-6,-2],[-6,-2],[-10,0],[0,-9],[-1,-5],[-3,-5],[-23,-19],[-3,0],[-11,18],[-29,47]],[[3047,2551],[-3,2],[-27,45]],[[3017,2598],[55,47],[-11,19],[19,16],[18,15],[2,7]],[[3100,2702],[12,-5],[3,-3],[11,-21],[11,-18]],[[3017,2598],[-12,19],[-14,-12],[-13,-11],[-3,1],[-20,20]],[[2955,2615],[-16,17]],[[2939,2632],[41,53],[7,11],[8,25]],[[2995,2721],[7,23]],[[3002,2744],[98,-42]],[[3047,2551],[-113,-95]],[[2934,2456],[-11,23],[-11,19],[-9,17]],[[2903,2515],[11,0],[6,-10],[15,13],[23,19],[-11,18],[16,13],[-7,10],[-15,16],[0,3],[14,18]],[[2913,2339],[14,12],[4,4],[3,6],[2,5],[0,12],[1,22],[1,24],[1,24],[-5,8]],[[3054,2513],[-16,-14],[-15,-13],[-16,-13],[38,-62],[1,-3],[-1,-3],[-13,-11],[-49,-40],[-10,2],[-2,-12],[-1,-2],[-13,-11],[-9,-8],[-14,-12],[-3,0],[-18,28]],[[2889,2260],[-10,16],[-13,21]],[[2866,2297],[10,8],[7,9],[15,13],[15,12]],[[2598,2003],[-63,103],[-3,4]],[[2532,2110],[11,11],[17,12],[12,7],[21,19],[46,39],[54,48],[23,20],[69,59],[5,4],[19,17],[15,12],[4,3]],[[2828,2361],[37,-61],[1,-3]],[[2730,2218],[-21,11],[-4,-10],[-2,-3],[-4,-3],[-22,-20],[0,-2],[12,-19],[0,-3],[-1,-2],[-14,-12],[-24,-21],[-27,1],[-21,1],[-1,-19],[0,-32],[5,5],[46,-2],[7,2],[9,4],[7,5],[38,33],[24,20],[5,6],[7,9],[5,13],[8,22]],[[2762,2202],[9,-3],[8,0],[9,1],[8,4],[8,6],[53,46],[-12,19],[-25,38],[-2,1],[-1,0],[-74,-63],[-1,-3],[-4,-9],[-2,-4],[-6,-17]],[[2751,2876],[-47,-38]],[[2704,2838],[-12,16],[-34,-28],[-15,-12],[-22,36],[-13,21],[-5,8],[-2,4]],[[2601,2883],[70,57]],[[2671,2940],[29,24]],[[2931,1675],[-1,-5],[0,-5],[2,-4],[3,-2],[16,-9],[3,-3],[9,-16]],[[2963,1631],[-3,-4],[-4,-5],[-3,-7],[-3,-8],[-7,1],[-6,-2],[-5,-2],[-4,-3],[-39,-32],[-4,-4]],[[2885,1565],[-4,6],[-8,15]],[[2873,1586],[44,37],[-94,31]],[[2823,1654],[49,41],[5,3],[4,1],[4,-1],[4,-3],[13,-11],[4,-2],[16,-5],[9,-2]],[[2988,1522],[-13,22],[-14,-13],[-3,0],[-26,43],[-17,-14],[26,-43],[0,-2],[-1,-2],[-14,-10],[-2,0],[-1,1],[-25,41],[-13,20]],[[2963,1631],[15,12],[51,42]],[[3029,1685],[14,12]],[[3043,1697],[11,-20],[16,-23],[10,-15],[16,-23],[-1,-2]],[[3095,1614],[-17,-15],[-18,-15],[-18,-15],[-18,-15],[-36,-32]],[[2845,1617],[-22,37]],[[2873,1586],[-9,6],[-8,5],[-5,8],[-6,12]],[[2716,1813],[2,-2]],[[2718,1811],[-13,-4],[-22,-7],[-25,-9],[-2,-1],[-13,-4],[-14,-5],[-58,-21],[-45,-16],[-29,-10]],[[2497,1734],[-1,7],[-2,6],[-3,9],[-3,9],[-3,8],[-9,15],[-4,7],[-4,6],[-2,5],[-7,20]],[[2459,1826],[42,21],[32,16],[-1,5],[-11,17],[-5,9],[-2,3],[-25,41],[-3,9],[-1,8],[-1,9],[0,5],[0,5],[2,11],[3,17],[4,16],[3,12],[0,4],[8,24]],[[2504,2058],[1,-4],[2,-2],[6,-10],[5,-9],[0,-7],[7,5],[10,8],[17,14],[0,1],[0,1],[0,1],[-11,18],[-17,27],[4,4],[4,5]],[[2459,1826],[-2,4],[-7,20],[0,1],[0,2],[0,2],[1,3],[2,10],[-1,5],[-1,4],[-3,5],[-11,22],[-10,22],[-5,6],[0,3],[-3,6],[-1,1],[-1,1],[-1,-1],[-3,-2],[-5,-5],[-3,2],[-2,1],[-2,1],[-2,2],[-2,3],[-1,1],[-6,9]],[[2390,1954],[17,12],[-2,4],[-2,4],[-3,2],[-5,4],[-4,3],[-1,0],[0,1],[0,1],[0,1],[1,1],[13,12],[1,0],[1,0],[5,-3],[1,0],[2,0],[31,27],[0,1],[2,0],[1,0],[10,-4],[8,29],[3,3],[3,4],[14,12],[18,-10]],[[2497,1734],[-12,-4],[-19,-7],[-33,-11],[-11,-4],[-11,-5],[-8,-3],[-6,-3],[-5,-3],[-4,-2],[-9,-5],[-5,-3],[-5,-3],[-6,-4],[-6,-4],[-5,-4]],[[2352,1669],[-3,6],[-3,4],[-7,11],[-10,18],[-23,41],[-25,39]],[[2281,1788],[-13,24],[-19,33],[-2,3]],[[2247,1848],[13,9],[4,3],[1,1],[4,2],[2,1],[2,1],[4,0],[5,0],[2,1],[1,0],[1,1],[2,1],[-7,13],[19,16],[16,14],[1,0],[1,0],[1,0],[10,-5],[1,0],[1,0],[1,0],[10,9],[48,39]],[[2247,1848],[-19,37],[-1,2],[-4,8],[-8,15],[-7,12]],[[2358,2080],[3,-5],[9,-14]],[[2370,2061],[-13,-13],[-20,-19],[0,-1],[0,-1],[0,-1],[11,-16],[20,-33],[2,-4],[2,-2],[4,-6],[3,-3],[2,-2],[5,-2],[2,-2],[2,-2]],[[2281,1788],[-3,-2],[-17,-14]],[[2261,1772],[-11,18],[-5,9],[-5,9],[-1,0],[-11,-9],[-17,-14],[-17,-13],[-12,20],[-17,-14],[-40,-31],[-17,-14]],[[2108,1733],[-7,12],[-2,4],[-1,2],[-2,6],[-3,13],[-1,7],[-2,9],[-2,2],[-9,17],[-5,9]],[[2074,1814],[131,103],[3,5]],[[2188,1714],[-30,-24],[-17,-13]],[[2141,1677],[-21,36]],[[2120,1713],[-12,20]],[[2261,1772],[-12,-10],[-61,-48]],[[2143,1500],[-3,5],[-1,2],[-3,4],[-24,42],[-5,9]],[[2107,1562],[71,56],[3,2],[1,1],[1,2],[0,1],[1,2],[4,11],[2,6],[5,16],[0,1],[1,2],[1,1],[14,11],[-11,20],[-12,20]],[[2352,1669],[-2,-1],[-1,-1],[-7,-5],[-19,-16],[-44,-36],[-11,-9]],[[2268,1601],[-38,-31],[-35,-28],[-26,-21],[-8,-7],[-18,-14]],[[2107,1562],[-12,19],[-12,20],[-11,21]],[[2072,1622],[52,41],[17,14]],[[7765,4113],[9,-6],[28,-21],[3,-3]],[[7805,4083],[-7,-13],[-5,-9],[-8,-15]],[[7864,4039],[-37,27]],[[7827,4066],[6,11],[5,7],[3,8],[4,7],[5,9]],[[7850,4108],[5,10],[8,13],[0,2]],[[7863,4133],[8,-6],[20,-15],[9,-6]],[[7900,4106],[-5,-9],[-2,-3],[-1,-2],[-6,-11],[-4,-8]],[[7882,4073],[-8,-16],[-4,-7],[-6,-11]],[[7910,4004],[-39,29],[-7,6]],[[7882,4073],[16,-12],[2,-2],[29,-22]],[[7929,4037],[-4,-8],[-4,-7],[-5,-7],[-6,-11]],[[7900,4106],[9,15]],[[7909,4121],[8,-6],[30,-23],[9,-6]],[[7956,4086],[0,-3],[-5,-8],[-8,-15]],[[7943,4060],[-7,-12],[-6,-10],[-1,-1]],[[7958,3968],[-48,36]],[[7943,4060],[47,-36]],[[7990,4024],[-7,-12],[-6,-12],[-4,-7],[-5,-7],[-4,-8],[-6,-10]],[[7956,4086],[5,10],[5,9]],[[7966,4105],[10,-7],[30,-22],[9,-7]],[[8015,4069],[-6,-10],[-5,-10],[-6,-9],[-8,-16]],[[7966,4105],[7,11],[12,22]],[[8035,4095],[-7,-3],[-7,-12],[-6,-11]],[[8061,4034],[-17,12],[-20,16],[-9,7]],[[8075,4061],[-2,-4],[-6,-12],[-6,-11]],[[8036,3990],[-7,5],[-30,23],[-9,6]],[[8061,4034],[-6,-10],[-5,-10]],[[8050,4014],[-6,-9],[-8,-15]],[[8486,4089],[18,31],[8,14],[13,24],[1,2],[4,7]],[[8530,4167],[19,-14],[10,-8],[21,37]],[[8580,4182],[14,26],[10,-8],[6,-5],[7,-5],[6,14],[3,-2],[3,-1],[6,-3],[-9,-46],[-3,-10],[-3,-13],[-3,-17],[0,-2],[-1,-9],[-3,-52],[-2,-19],[-14,-25]],[[8530,4167],[21,37],[10,18],[10,19]],[[8571,4241],[8,-5],[5,-4],[-6,-13],[-4,-7],[-9,-18],[15,-12]],[[8530,4167],[-14,11],[-14,11],[6,10],[9,17],[5,9]],[[8522,4225],[10,18],[10,18],[7,-5],[1,-1],[13,-9],[8,-5]],[[8522,4225],[-6,5],[-9,6],[-17,13]],[[8592,4282],[-11,-22],[-10,-19]],[[8419,4253],[-10,8],[-9,8],[-20,14],[-31,24]],[[8349,4307],[12,22]],[[8361,4329],[6,10],[0,1],[5,9],[8,14],[5,9]],[[8385,4372],[2,-1],[5,-4],[2,-1]],[[8394,4366],[57,-40],[8,-6]],[[8374,4175],[-20,15],[-18,16],[-17,13]],[[8319,4219],[-14,10]],[[8305,4229],[6,11],[6,10],[13,25],[-27,21]],[[8303,4296],[8,14],[5,9],[5,9]],[[8321,4328],[10,-7],[18,-14]],[[8354,4139],[-38,30],[-18,14]],[[8298,4183],[4,8],[6,9],[4,8],[7,11]],[[8374,4175],[-10,-18],[-10,-18]],[[8298,4183],[-35,27],[-11,8]],[[8252,4218],[4,21]],[[8256,4239],[5,25]],[[8261,4264],[10,-7],[1,-1],[33,-27]],[[8333,4102],[-50,39],[-29,22],[-11,8]],[[8243,4171],[6,29]],[[8249,4200],[3,18]],[[8354,4139],[-8,-14],[-7,-13],[-6,-10]],[[8313,4051],[-9,-24]],[[8304,4027],[-67,50],[-10,8]],[[8333,4102],[-10,-28],[-10,-23]],[[8359,4015],[-46,36]],[[8333,4102],[11,-8],[15,-11],[12,-10],[2,-3],[12,-9]],[[8385,4061],[-14,-24],[-12,-22]],[[8418,4037],[-17,13],[-6,3],[-8,6],[-2,2]],[[8408,4151],[18,-14],[30,-23],[3,-4]],[[8379,3968],[-32,26],[12,21]],[[8187,4247],[7,-6],[43,-32],[12,-9]],[[8187,4247],[9,16]],[[8196,4263],[7,-6],[36,-28],[6,-6],[7,-5]],[[8196,4263],[9,15]],[[8205,4278],[7,-6],[16,-12],[17,-14],[9,-6],[2,-1]],[[8163,4311],[33,-26],[9,-7]],[[2691,889],[2,4],[0,5],[-3,4],[-6,5],[-13,49],[16,6],[7,0],[7,-2],[20,7]],[[2721,967],[23,7]],[[2744,974],[16,5],[6,1],[5,0],[6,0],[5,-1],[11,-3],[22,-7],[26,-6],[21,-91]],[[2540,919],[-7,23],[-3,10],[-1,6],[-2,8],[-3,11],[-2,8],[-1,13],[-2,8],[-2,8],[-3,11]],[[2514,1025],[11,5],[38,14],[17,7],[6,3],[2,1]],[[2588,1055],[7,3],[18,8],[8,4],[9,7],[4,2],[5,3],[24,10],[1,0],[1,0],[1,-1],[3,-12]],[[2669,1079],[21,-85],[1,-1],[0,-1],[1,-1],[2,0],[19,7],[8,-31]],[[2509,901],[4,-14],[1,-4],[-1,-1],[-1,-2],[-24,-22],[-14,-13],[-2,-1],[-2,-1],[-1,0],[-1,0],[-1,1],[-6,9],[-10,13],[-1,2],[12,8],[13,7],[-7,22],[-7,23],[-10,-4],[-9,-5],[-19,-13],[-5,-3],[-11,-4],[-5,-1],[-4,6],[-2,4],[-2,3],[-9,10],[-4,4],[-4,3],[-9,7]],[[2368,935],[23,33],[3,4],[4,2],[32,14],[34,15],[30,14],[20,8]],[[6592,4365],[-3,-7],[-4,-10],[-2,-5],[-6,-12],[-5,-14],[-8,-19],[-3,-9],[-1,-3],[-1,-2],[-1,-2],[-1,-4],[-3,-7],[-2,-5],[-3,-7],[-3,-7],[-1,-4],[-2,-4]],[[6543,4244],[-1,-2],[-2,-4],[-2,-4],[-6,-11],[-2,-4],[-5,-9],[-1,-1],[-1,-2],[-1,-2],[-1,-3],[-1,-2],[-1,-3],[-1,-2],[-1,-2],[-1,-2],[0,-2],[-1,-3],[-1,-2],[-2,-9],[-2,-8],[0,-1],[-2,-7],[-3,-11]],[[6505,4148],[-2,-2],[-3,-2],[-2,-1],[-2,-1],[-2,-1],[-2,0],[-2,-1],[-3,0],[-1,0],[-1,1],[-1,2],[-1,2],[-1,1],[-1,2],[-1,1],[-1,2],[-1,1],[-2,1],[-1,2],[-2,1],[-1,1],[-1,1],[-1,1],[-2,1],[-2,1],[-3,1],[-3,2],[-2,0],[-4,1]],[[6454,4165],[-4,1],[-4,-13],[-6,2],[-10,5],[-12,6],[-16,8],[-18,9],[-20,9],[-11,5],[-33,16],[-21,10],[-6,3],[-8,4],[-8,3],[-14,7],[-11,6],[-6,3],[-7,3],[-7,3],[-13,7]],[[6219,4262],[-42,20]],[[6177,4282],[2,7],[1,4]],[[6204,4365],[6,30],[1,14],[2,14],[0,5]],[[6609,4409],[-2,-6],[-4,-11],[-5,-12],[-4,-9],[-2,-6]],[[6168,4189],[11,19],[8,14],[2,7],[0,2],[-1,1],[-13,6],[-13,6]],[[6162,4244],[13,34],[2,4]],[[6219,4262],[-26,-76],[-3,-7]],[[6146,4200],[3,8],[13,36]],[[3292,3603],[-60,72],[-12,11],[-19,18],[-12,20]],[[3189,3724],[0,4],[1,12],[2,4],[8,8],[9,7],[11,3],[8,1],[5,-1],[4,-2],[3,-1],[10,0],[8,4],[6,2],[1,-1],[4,0],[6,2],[4,2]],[[3224,3604],[-65,68]],[[3159,3672],[4,4],[7,17],[3,9],[5,10],[7,5],[4,4],[0,3]],[[3221,3312],[0,5],[11,9],[-3,4],[-10,-9],[-3,5],[-4,1]],[[3212,3327],[-2,4]],[[3210,3331],[9,6],[-8,14],[6,9],[58,44],[-110,173]],[[3165,3577],[-32,48]],[[3133,3625],[-1,2],[-11,13],[-23,35]],[[3098,3675],[2,-2],[9,-5],[9,-5],[21,0],[12,3],[7,5],[1,1]],[[3210,3331],[-8,14],[-34,58]],[[3168,3403],[4,3],[9,7],[4,2],[5,1],[14,3],[4,2],[6,3],[11,8],[14,13],[-30,45],[-14,21],[-3,2],[-2,1],[-14,1],[-22,1]],[[3154,3516],[-1,15],[-4,17],[-8,13]],[[3141,3561],[9,5],[15,11]],[[3168,3403],[-22,37]],[[3146,3440],[-4,8],[-13,22]],[[3129,3470],[15,12],[4,5],[3,5],[2,5],[1,6],[0,13]],[[2978,3381],[-26,55],[-8,20]],[[2944,3456],[40,13],[17,6],[13,5],[6,3],[7,4],[16,9],[14,8],[21,15],[13,8],[3,3]],[[3094,3530],[32,21]],[[3126,3551],[15,10]],[[3129,3470],[-3,-2],[-13,-8],[-21,-17],[-7,-6],[-8,-5],[-5,-3],[-1,-1],[-6,-4],[-7,-4],[-20,-10],[-25,-12],[-22,49],[-3,2],[-5,-1],[-6,-4],[-3,-4],[0,-5],[22,-45],[-18,-9]],[[3049,3625],[7,5],[50,-17],[-1,-16],[1,-4],[10,-23],[10,-19]],[[3094,3530],[-19,40],[-26,55]],[[3049,3625],[-8,15]],[[3041,3640],[-8,18]],[[3033,3658],[6,-2],[54,-16],[40,-15]],[[3033,3658],[-4,1],[-9,3],[-12,3],[-60,12],[-156,27]],[[2792,3704],[-113,19],[-42,8]],[[2637,3731],[22,72]],[[2659,3803],[17,3],[8,4],[8,1],[8,0],[8,-2],[25,-2],[4,-2],[27,-1],[18,-5],[3,-2],[6,0],[12,-2],[6,-3],[17,-2],[8,-1],[19,0],[12,0],[10,-2],[2,-3],[2,0],[4,0],[2,3],[5,3],[4,4],[1,5],[3,2],[16,6],[9,1],[1,-1],[6,0],[11,-3],[17,-7],[15,-11],[4,-3],[11,-15],[6,-2],[5,0],[5,-4],[23,-3],[4,-13],[4,-5],[4,-3],[4,-6],[6,-7],[8,-5],[4,-5],[8,-5],[10,-2],[12,-5],[3,-2],[0,-3],[-4,-5],[-1,-4],[3,-6],[5,-7],[1,-1]],[[2591,3556],[0,-13],[2,-12],[2,-9]],[[2595,3522],[-12,-5],[-5,-3],[-3,9],[-2,9],[-1,5],[1,20],[0,20],[1,16],[-1,7],[-3,7],[-8,18],[-13,-8],[-11,-5],[-19,-7],[-5,-3],[-24,-25],[-1,-4],[25,-55],[-10,-6]],[[2504,3512],[-8,-2],[-11,-3],[-7,-4],[-13,-9],[-22,-13]],[[2443,3481],[-13,25],[-1,2]],[[2429,3508],[4,2],[4,4],[3,10],[7,12],[5,10],[5,8],[6,9],[6,7],[7,8],[3,6],[3,4],[4,0],[4,6],[10,17],[2,3],[1,1],[22,12],[10,8],[5,6],[5,4],[4,4],[0,3],[2,6],[-2,22],[1,6],[1,5],[1,4],[1,6],[12,23],[4,11],[14,32],[11,15],[8,8],[14,2],[11,3],[13,4],[19,4]],[[2637,3731],[-2,-28],[-2,-17]],[[2633,3686],[-4,0],[-4,1],[-4,-1],[-3,-2],[-2,-3],[-2,-3],[-7,-34],[-7,-29],[-5,-29],[-4,-30]],[[2595,3522],[5,-14],[8,-17]],[[2608,3491],[-18,-9],[-18,-4]],[[2572,3478],[-4,-1],[-3,-1],[-4,-3],[-6,-6],[-21,-15],[-3,-4],[-4,-6]],[[2527,3442],[-15,12],[10,17],[-9,20],[-9,21]],[[2577,3262],[-4,-7],[-3,-8]],[[2570,3247],[-4,2],[-3,3],[-4,8],[-2,3],[-2,1],[-2,0],[-2,-1],[-3,-2]],[[2548,3261],[-14,29],[-18,38],[-10,23],[-3,-2],[-4,-2],[-3,0],[-4,2],[-35,25],[-5,11],[-33,69]],[[2419,3454],[2,6],[2,5],[5,5],[15,11]],[[2527,3442],[9,-8],[-12,-21],[10,-22],[-17,-11],[19,-40],[25,-54],[6,-11],[10,-13]],[[2582,3267],[-5,-5]],[[2572,3478],[8,-19],[-16,-11],[25,-54],[1,-4],[1,-3],[-1,-4],[-2,-5],[-5,-8],[-5,-4],[-6,-5],[-3,-2],[12,-27],[20,-46]],[[2601,3286],[-19,-19]],[[2757,3266],[-8,-5],[-1,-3],[-13,-10],[-6,-5],[-10,-8],[-5,-4],[-26,-25],[-10,13],[-21,-20],[-13,-14],[-16,-17]],[[2628,3168],[-31,68],[-9,20],[-6,11]],[[2601,3286],[11,10],[10,5],[6,3],[20,8],[18,8]],[[2666,3320],[27,11]],[[2693,3331],[21,-49],[9,-20],[28,16],[6,-12]],[[2634,3148],[-38,-46]],[[2596,3102],[-12,27],[-21,43],[-12,7]],[[2551,3179],[3,11],[8,28],[6,24],[2,5]],[[2628,3168],[11,-15],[-5,-5]],[[2678,3129],[-20,-9],[-2,0],[-5,5],[-6,10],[-11,13]],[[2757,3266],[2,-3],[7,-17]],[[2766,3246],[5,-7],[21,-16],[8,-8]],[[2800,3215],[-2,0],[-14,-18],[-19,-21],[-7,-7],[-7,-6],[-16,-10],[-23,-10],[-25,-10],[-9,-4]],[[2678,3129],[7,-21],[5,2],[10,4],[2,-2],[8,-26],[-1,-2],[-40,-17],[7,-23],[28,-45],[3,0],[29,24],[12,-19]],[[2671,2940],[-10,22],[-9,20],[-10,21],[-6,12],[-10,22],[-4,9],[-5,12],[-9,20],[-12,24]],[[2800,3215],[9,-13]],[[8632,4758],[-10,-26]],[[8622,4732],[-11,6],[-47,23],[-11,6]],[[8553,4767],[10,26]],[[8563,4793],[11,-5],[47,-24],[11,-6]],[[8563,4793],[5,13],[4,13]],[[8572,4819],[11,-5],[48,-24],[11,-5]],[[8642,4785],[-10,-27]],[[8572,4819],[9,23]],[[8581,4842],[11,-6],[39,-19],[9,-5],[10,-5]],[[8650,4807],[-8,-22]],[[2920,2824],[-68,-57]],[[2852,2767],[-16,-14],[-7,-3],[-6,-3],[-16,-5],[-8,-3],[-7,-6],[-17,-14]],[[2731,2651],[-19,10],[-11,6],[-12,9],[-13,12],[-13,15],[-10,13],[-7,12],[-8,13],[-11,18],[6,6],[3,4],[6,13],[3,5],[4,6],[5,4],[29,24],[21,17]],[[2847,2897],[-8,-22],[-8,-22],[-4,-9],[-1,-17],[0,-3],[6,-3],[6,-1],[7,-4],[6,-5],[6,-10],[17,15],[17,14],[16,13],[13,-19]],[[2689,2588],[-18,29],[-45,75],[-3,5],[-11,17],[-14,23],[-44,76],[-9,19],[-1,4]],[[2544,2836],[57,47]],[[2582,2544],[16,13],[-1,3],[0,3],[5,4],[6,5],[-10,20],[-8,19],[-14,19],[-6,25],[-6,23],[-10,22]],[[2554,2700],[-17,42],[-14,36],[0,4],[1,2],[-10,19],[27,30],[3,3]],[[2689,2588],[-3,-2],[-20,-17],[-14,-5],[-16,-7],[-12,-10],[-20,-17],[-10,-5],[-12,19]],[[2506,2663],[-5,10],[-12,30],[-18,-10],[-6,-4],[-9,-5],[-4,-1],[-8,-2],[0,6],[-1,3],[-2,9],[-5,14],[-11,-8],[-3,-1],[-2,0],[-2,2],[-7,11],[-5,6],[-3,1],[-2,-1],[-8,-12]],[[2393,2711],[-16,16],[-32,-45]],[[2345,2682],[-12,31],[10,11],[7,10],[5,7],[5,7],[7,11],[5,9],[2,4]],[[2374,2772],[2,3],[2,6],[4,10],[3,6],[5,16],[9,28],[6,20],[6,17],[11,19],[12,19],[30,33],[11,12],[12,14],[2,2]],[[2489,2977],[14,-34],[24,-63],[17,-44]],[[2554,2700],[-17,-13],[-25,-19],[-6,-5]],[[2506,2663],[22,-55],[4,-12],[3,-8],[1,-11],[-1,-9],[-4,-10],[-8,2],[-3,-1],[-17,-8],[-6,-3],[-6,0],[-7,2]],[[2484,2550],[-5,3],[-4,0],[-4,-1],[-3,-1],[-9,23],[-11,29]],[[2448,2603],[-2,6],[-1,16],[0,22],[-14,0],[-2,2],[-6,13],[-6,10],[-6,8],[-9,9],[-14,15],[5,7]],[[2448,2603],[-73,-26]],[[2375,2577],[-5,12],[-14,-8],[-6,-5]],[[2350,2576],[-14,-13],[-8,22],[-12,29]],[[2316,2614],[1,3],[10,6],[4,4],[9,12],[13,17],[7,11],[-15,15]],[[2484,2550],[-1,-9],[-2,-5],[-7,-3],[16,-41],[5,-3],[6,0],[8,5],[7,7],[17,10],[3,-7]],[[2536,2504],[-147,-124]],[[2389,2380],[-6,11]],[[2383,2391],[38,27],[19,18],[33,29],[2,4],[0,5],[-6,15],[-17,-8],[-7,19],[-17,-8],[-27,71],[-19,-6],[-7,20]],[[2582,2544],[-46,-40]],[[2383,2391],[-38,92],[-9,23]],[[2336,2506],[4,1],[6,2],[9,5],[14,15],[0,2],[0,2],[-4,10],[-3,9],[-4,9],[-5,11],[-3,4]],[[2389,2380],[-9,-10],[54,-98]],[[2434,2272],[-6,-12]],[[2428,2260],[-6,11],[-36,62]],[[2386,2333],[-6,8],[-3,4],[-14,7],[-17,8],[-7,4],[-24,10]],[[2315,2374],[9,24],[7,22],[13,-6],[3,0],[3,1],[-12,30],[-3,8],[-1,3],[3,8],[-1,3],[-20,9],[-1,1],[-2,3],[-6,18],[-9,23],[8,4],[6,5],[4,4],[8,4]],[[2324,2538],[12,-32]],[[2315,2374],[-16,8]],[[2299,2382],[-23,11]],[[2276,2393],[8,24],[-6,3],[-6,5],[-3,4],[-3,4],[-2,5],[-20,55],[-8,21]],[[2236,2514],[19,10],[42,21],[2,2],[3,3],[5,5],[5,3],[4,2],[8,-22]],[[2236,2514],[-12,34],[-2,6],[16,17],[-9,21]],[[2229,2592],[14,15],[38,44],[2,2],[4,-14],[0,-2],[4,-10],[8,-22],[17,9]],[[2229,2592],[-2,3],[-15,39]],[[2212,2634],[10,14],[4,5],[13,17],[15,18],[7,7],[2,3]],[[2263,2698],[4,6],[39,54],[5,3],[3,1],[13,28],[19,27]],[[2346,2817],[14,-10],[-9,-18],[23,-17]],[[2095,2473],[-3,7],[-2,6],[-11,23],[-5,8],[-12,18]],[[2062,2535],[3,10],[3,7],[2,6],[2,5],[5,4],[5,4],[11,7],[5,2],[17,10],[1,1],[1,2],[1,1],[2,2],[4,11],[1,3],[4,11],[2,9],[3,16],[3,3],[29,27],[11,15],[1,2],[16,25],[6,6],[14,12],[13,11],[2,2]],[[2229,2749],[23,-33],[11,-17],[0,-1]],[[2212,2634],[-93,-136],[-24,-25]],[[8316,4362],[-21,16],[-11,8]],[[8284,4386],[6,26],[5,23]],[[8295,4435],[8,-6],[5,-3],[23,-16],[8,-6]],[[8339,4404],[-6,-10],[-6,-11],[-5,-10],[-6,-11]],[[8361,4329],[-18,13],[-27,20]],[[8339,4404],[35,-24],[11,-8]],[[8321,4328],[-17,13],[-14,11],[-11,8]],[[8279,4360],[5,26]],[[8303,4296],[-31,24]],[[8272,4320],[4,20]],[[8276,4340],[3,20]],[[8261,4264],[5,26],[4,19],[2,11]],[[8261,4264],[-11,9],[-34,25]],[[8216,4298],[7,12],[5,9],[6,-5],[14,25]],[[8248,4339],[9,-7],[7,-6],[8,-6]],[[8163,4311],[11,20]],[[8174,4331],[9,-7],[33,-26]],[[8093,3982],[-43,32]],[[8103,4039],[-2,-2],[-6,-13],[-6,-11],[15,-11],[-6,-10],[-5,-10]],[[8093,3982],[22,-17],[4,-3]],[[8119,3962],[-10,-6],[-6,-12],[-1,-4]],[[8145,4008],[-2,-3],[-7,-12],[-6,-11],[-5,-10],[-6,-10]],[[8176,3947],[-9,8],[-6,-11],[-6,-9],[-36,27]],[[8191,3973],[-3,-4],[-12,-22]],[[8176,3947],[-11,-19],[11,-9],[8,-6],[2,-1],[8,-6],[5,-4]],[[8210,3953],[0,-10],[-3,-10],[-7,-26]],[[8210,3953],[31,-23],[22,-17]],[[8263,3913],[-6,-17],[-4,-9],[-5,-16]],[[8211,3993],[63,-48]],[[8274,3945],[-5,-15],[-3,-8],[-3,-9]],[[8217,4034],[11,-8],[28,-22],[16,-12],[15,-12]],[[8287,3980],[-8,-21],[-5,-14]],[[8304,4027],[-8,-22],[-9,-25]],[[8340,3939],[-17,13],[-9,7],[-9,7],[-8,7],[-10,7]],[[8322,3908],[-48,37]],[[8306,3879],[-43,34]],[[8286,3843],[-38,28]],[[2488,1435],[-4,0],[-63,-53]],[[2421,1382],[-3,12],[2,2],[5,6],[1,3],[2,3],[1,3],[0,2],[0,4],[1,5],[0,7],[-1,3],[-1,7],[-1,7],[-2,5],[-1,4],[-1,4],[-3,5],[-6,10],[-6,11],[-5,6],[-5,6],[-5,4],[-3,2],[-5,1],[-7,0],[-6,-1],[-6,-3],[-6,-3],[-6,-5],[-6,-5],[-6,-8]],[[2342,1479],[-9,9],[-28,47],[-4,5],[-4,9],[-4,10],[-5,9],[-8,13],[-9,15],[-3,5]],[[2352,1669],[3,-4],[12,-20],[3,-5],[19,-33],[22,-36]],[[2411,1571],[33,-54],[2,-2],[20,-35],[8,-14],[7,-15],[7,-16]],[[2323,1305],[-2,8],[-1,5],[-3,20]],[[2317,1338],[17,3],[4,2],[-3,23],[-6,30],[-2,21],[-1,6]],[[2326,1423],[1,4],[0,5],[1,9],[2,11],[3,10],[4,8],[5,9]],[[2421,1382],[-92,-76],[-6,-1]],[[2202,1373],[-30,53],[-3,13],[-1,7],[-5,9],[-10,17],[-11,18],[-3,6]],[[2139,1496],[4,4]],[[2326,1423],[-19,-4],[-38,-7],[-18,-4],[-3,-1],[-17,-13],[-29,-21]],[[2194,1305],[-2,4],[-4,8],[-3,7],[-1,12],[1,11],[3,8],[5,9],[9,9]],[[2317,1338],[-7,-2],[-5,-2],[-7,-5],[-14,-17],[-9,16],[-8,15],[-1,0],[-1,0],[-1,0],[-1,0],[-35,-27],[-2,-2],[-3,-17],[-5,-23],[-6,5],[-1,1],[-3,3],[-9,15],[-5,7]],[[2323,1305],[-90,-81],[-47,74]],[[2186,1298],[8,7]],[[7804,4647],[-29,23],[-9,7],[3,3],[-9,7],[-1,1],[-10,8]],[[7749,4696],[6,11],[6,11],[6,11],[6,12]],[[7773,4741],[3,6],[3,5],[6,12]],[[7785,4764],[6,11],[6,11]],[[7797,4786],[10,-7],[8,-6],[3,-2],[8,-6],[8,-6],[24,-17]],[[7858,4742],[-10,-18],[-11,-18],[-28,-49],[-5,-10]],[[7735,4771],[38,-30]],[[7667,4823],[6,11],[6,11]],[[7679,4845],[68,-52],[38,-29]],[[7679,4845],[6,12],[6,11]],[[7691,4868],[67,-53],[39,-29]],[[7691,4868],[6,11],[6,12]],[[7703,4891],[10,-8],[57,-45]],[[7770,4838],[39,-29]],[[7809,4809],[-6,-12],[-6,-11]],[[7770,4838],[6,11],[6,12],[6,11],[6,11]],[[7794,4883],[29,-22],[1,-1],[9,-7]],[[7833,4853],[-3,-5],[-9,-17]],[[7821,4831],[-3,-5],[-3,-6],[-6,-11]],[[7703,4891],[5,11],[7,12]],[[7715,4914],[5,11],[6,11]],[[7726,4936],[39,-30],[29,-23]],[[7726,4936],[6,11],[6,11],[6,12],[4,7]],[[7748,4977],[28,-15],[47,-23]],[[7823,4939],[-5,-11],[-6,-11],[-6,-11],[-6,-11],[-6,-12]],[[7839,4866],[-6,-13]],[[7856,4899],[-8,-16],[-4,-7],[-5,-10]],[[6142,4224],[1,-1],[2,0],[1,1],[1,1],[9,30],[1,6],[-1,5],[-2,8],[-4,7],[-6,7],[-7,5],[-15,6],[-10,4],[-9,4],[-11,2]],[[6092,4309],[-23,4],[-4,0],[-10,1],[-8,0],[-11,0],[-21,-4],[-18,-4],[-18,-6],[-14,-6],[4,-14],[6,-16]],[[5975,4264],[-18,7],[-15,-12],[-9,-10],[-13,-29],[-6,-19],[13,-12]],[[5788,4199],[24,46],[2,3],[3,7]],[[6092,4309],[-5,-32]],[[7976,3282],[-12,10],[-32,25],[-9,4],[-11,9]],[[7883,3395],[16,26],[11,52],[1,8],[2,7],[5,22],[2,7]],[[7962,3259],[-6,5],[-7,5]],[[7949,3269],[-17,14],[-4,3],[-5,4],[-4,3],[-20,16]],[[7949,3269],[-7,-13],[-4,-7],[-19,7],[-37,29]],[[7815,3256],[-6,-5],[-32,-22],[-12,-12],[-11,-14],[-4,-5],[0,-1],[-14,-20],[-24,-52],[-20,-36],[-2,-4],[-1,-4]],[[7689,3081],[-27,1],[-12,2],[-10,3],[-18,4],[-22,0],[-21,2],[-10,1],[-3,1],[-10,1],[-9,1],[-33,1],[-17,0],[-7,-2],[-6,-2],[-20,-7]],[[7392,3091],[6,1],[21,5],[6,2],[3,2],[4,3],[50,79],[9,13],[21,31],[37,54],[23,23],[23,15],[9,5],[7,19],[2,3],[8,20]],[[7717,3768],[3,4],[6,11]],[[7726,3783],[10,17]],[[7736,3800],[4,0],[14,-10],[26,-20],[1,-2],[32,-25],[14,-10],[24,-18],[23,-17]],[[7874,3698],[7,-6],[54,-41],[1,-6],[0,-7],[1,0],[0,-3],[1,-3],[1,-6],[4,-7],[4,-7]],[[7789,3124],[-7,-8],[-9,-10],[-8,-8],[-10,-7],[-3,-2],[-1,-4],[0,-2],[1,-6],[1,-7],[2,-7],[-3,-8],[-9,-10],[-9,-12],[-6,-16],[0,-10],[1,-8],[6,-16],[12,-13],[3,-1],[3,-2],[4,-5],[6,-4],[3,-1]],[[7609,2999],[11,21],[-11,14],[3,7],[4,5],[3,2],[4,2],[34,8],[8,3],[7,4],[2,1],[5,2],[4,4],[3,4],[3,5]],[[7834,3031],[-27,-27]],[[7807,3004],[-23,-22]],[[7844,2969],[-20,18],[-17,17]],[[7866,3000],[-8,-10],[-7,-11],[-7,-10]],[[7891,2976],[-22,-32]],[[7869,2944],[-9,9],[-7,7],[-9,9]],[[7869,2944],[-1,-2],[-18,-25]],[[7962,4215],[-8,6],[-61,47]],[[7893,4268],[5,9],[5,8],[8,16]],[[7911,4301],[9,-7],[46,-35],[6,-4]],[[7972,4255],[8,-7]],[[7951,4197],[-7,6],[-61,46]],[[7883,4249],[5,10],[5,9]],[[7938,4173],[-9,7],[-51,38],[-9,7]],[[7869,4225],[8,15],[6,9]],[[7938,4173],[-12,-21]],[[7926,4152],[-9,7],[-51,38],[-9,7]],[[7857,4204],[12,21]],[[7909,4121],[-9,7],[-20,15],[-8,5]],[[7872,4148],[6,10],[5,10],[-23,17],[-10,7],[7,12]],[[7926,4152],[-7,-12],[-10,-19]],[[7911,4301],[12,-2],[8,14],[13,23]],[[7944,4336],[51,-40],[-12,-22],[-6,-10],[-5,-9]],[[7944,4336],[6,11],[6,11]],[[7956,4358],[51,-40],[9,-7]],[[8016,4311],[-12,-22]],[[8004,4289],[-13,-22],[-11,-19]],[[7911,4301],[-28,22]],[[7883,4323],[11,19],[12,22]],[[7906,4364],[13,22]],[[7919,4386],[8,-6],[11,-8],[9,-7],[9,-7]],[[7883,4323],[-2,2],[-10,8],[-2,1],[-14,11],[-10,7]],[[7845,4352],[11,19]],[[7856,4371],[13,22]],[[7869,4393],[9,-7],[18,-13],[8,-7],[2,-2]],[[8041,4261],[-26,20],[-2,1],[-9,7]],[[8016,4311],[14,25]],[[8668,4346],[15,-7],[14,-6]],[[8697,4333],[0,-1],[6,-2],[-22,-87],[0,-2],[6,-3],[-14,-42],[5,-2],[-14,-43],[6,-3],[-6,-19],[-8,-23],[6,-3],[-14,-41],[-9,-55],[-5,-24]],[[8790,4543],[-73,-117],[-20,-93]],[[8600,4440],[6,8],[3,7],[0,2],[1,2],[1,2],[1,2],[1,2],[0,1],[1,2],[1,1],[0,2],[1,1],[6,15],[12,31],[9,24]],[[8643,4542],[9,-5],[22,-11],[9,25],[8,21],[4,10],[1,2],[4,11]],[[8700,4595],[6,-3],[9,-4]],[[8715,4588],[9,-5],[10,-5],[4,-2],[13,-6],[20,-13],[4,-2],[11,-9],[4,-3]],[[8846,4618],[-16,-6],[0,-3],[-40,-66]],[[8715,4588],[8,21],[7,20]],[[8730,4629],[8,22],[7,19]],[[8745,4670],[11,-5],[19,-10],[16,-5],[17,-9],[1,-1],[1,0],[1,-1],[2,-1],[3,-2],[4,-3],[21,-13],[5,-2]],[[8944,4779],[-48,-16],[-20,-40],[0,-3],[65,21],[-7,-29],[-60,-20],[5,-12],[4,0],[1,-7],[-36,-12],[3,-15],[43,14],[0,-1],[0,-24],[-48,-17]],[[8745,4670],[10,27],[10,26]],[[8765,4723],[10,-5],[19,-10],[5,11],[4,12],[-19,10],[-11,5]],[[8773,4746],[10,25],[9,24]],[[8792,4795],[5,13],[5,16],[9,25],[1,4]],[[8812,4853],[9,-5],[28,-15],[3,-4],[2,-2],[7,-4],[28,-15],[3,1],[2,-1],[7,-4],[43,-25]],[[8978,4870],[-35,-70],[23,7],[6,-19],[-28,-9]],[[8812,4853],[5,13],[4,13],[-25,13],[-9,4],[9,24]],[[8796,4920],[11,-6],[13,-6],[9,-5],[24,-13],[7,-4],[5,12],[4,11]],[[8869,4909],[11,-6],[2,-1],[39,-21],[13,-7],[40,-4],[4,0]],[[9015,4945],[-37,-75]],[[8869,4909],[-31,17],[-22,11]],[[8816,4937],[5,12],[22,-11],[7,16],[11,28],[9,23]],[[8870,5005],[10,-5],[17,-9],[14,-7],[45,-21],[6,-3],[3,-1],[20,-6],[26,-8],[4,0]],[[9039,4992],[-24,-47]],[[8870,5005],[-11,6],[-12,6]],[[8847,5017],[-10,6]],[[8837,5023],[9,24]],[[8846,5047],[10,-5],[13,-7],[12,-6],[8,22]],[[8889,5051],[10,-5]],[[2120,1713],[-52,-40],[-10,18],[-1,2],[-1,1],[-1,0],[-1,0],[-10,0],[-18,-2],[-1,-1],[-1,-1],[-1,-1],[1,-22],[-42,-33],[-10,-8],[0,-1],[-1,0],[0,-1],[0,-1],[0,-1],[11,-17],[-18,-14],[-11,-10]],[[1953,1581],[-19,-14]],[[1855,1672],[44,3],[18,15],[157,124]],[[1813,1646],[-1,3],[-5,8],[-5,10]],[[1802,1667],[-19,41],[11,7],[8,4],[-10,20],[18,8],[20,5],[8,1],[11,4]],[[1849,1757],[18,-40],[13,-30],[7,1],[6,2],[7,4],[12,8],[6,6]],[[1918,1708],[94,73],[17,14]],[[2029,1795],[19,16],[19,15]],[[2067,1826],[7,-12]],[[1849,1757],[-1,1],[-13,30],[0,3],[43,26],[9,-20],[41,25],[-10,19]],[[1918,1841],[16,10],[3,-1],[33,-73],[-35,-29],[-27,-18],[10,-22]],[[1802,1667],[-19,-11]],[[1702,1781],[17,11],[20,12]],[[1892,1898],[9,-19],[8,-19],[9,-19]],[[1926,1919],[18,11],[18,12]],[[1962,1942],[17,-37],[20,-44],[10,-22],[20,-44]],[[2102,1961],[-11,-7],[-14,-9],[-6,-3],[-4,-1],[-10,-1],[-1,-20],[8,-15],[30,22],[10,-19],[-25,-19],[-15,-12],[0,-3],[10,-17],[11,-19],[-18,-12]],[[1962,1942],[9,6],[3,5],[1,7],[0,11]],[[2022,1996],[7,-3],[31,28],[7,-20],[4,-9],[11,8],[1,-1],[9,-17],[10,-21]],[[7900,4857],[-7,-19]],[[7893,4838],[-9,5],[-33,17],[-2,1],[-10,5]],[[7879,4801],[-8,5],[-37,19],[-2,1],[-11,5]],[[7893,4838],[-7,-18],[-7,-19]],[[7882,4725],[-24,17]],[[7879,4801],[-4,-12],[-3,-8],[26,-13],[-6,-17],[-10,-26]],[[7902,4711],[-20,14]],[[7893,4838],[9,-4],[30,-15],[9,-4]],[[7941,4815],[-7,-19]],[[7934,4796],[-6,-19]],[[7928,4777],[-8,-20]],[[7920,4757],[-7,-19]],[[7913,4738],[-5,-11],[-6,-16]],[[7920,4757],[11,-6],[9,-5],[7,-3],[7,-4],[1,-4],[-3,-9],[-4,-9],[-4,-1],[-6,4],[-7,4],[-7,6],[-7,5],[-4,3]],[[7959,4671],[-3,2],[-2,2],[-4,2],[-40,29],[-8,5]],[[7928,4777],[9,-4],[44,-22],[10,-4]],[[7991,4747],[-15,-40],[-5,-10],[0,-6],[-2,-5],[-10,-15]],[[7934,4796],[10,-4],[44,-23],[9,-4]],[[7997,4765],[-6,-18]],[[7941,4815],[9,-5],[44,-22],[9,-5]],[[8003,4783],[-6,-18]],[[8010,4802],[-7,-19]],[[7948,4833],[9,-5],[44,-22],[9,-4]],[[8017,4820],[-7,-18]],[[7961,4869],[9,-4],[45,-22],[9,-4]],[[8024,4839],[-7,-19]],[[8031,4857],[-7,-18]],[[7975,4906],[9,-4],[44,-22],[9,-5]],[[8037,4875],[-6,-18]],[[8044,4894],[-7,-19]],[[7934,4949],[9,-5],[26,-13],[3,-2],[10,-4]],[[7982,4925],[9,-5],[44,-22],[9,-4]],[[8051,4912],[-7,-18]],[[7982,4925],[6,18],[9,22]],[[7997,4965],[10,-4],[42,-21],[10,-5]],[[8059,4935],[-8,-23]],[[7934,4949],[6,18],[4,11],[4,12],[39,-20],[10,-5]],[[8004,4985],[-7,-20]],[[7924,5025],[10,-5],[61,-30],[9,-5]],[[7942,5060],[8,-4],[3,-1],[26,-13],[13,-6],[16,-8],[9,-5]],[[8017,5023],[-6,-19],[-7,-19]],[[3044,2793],[-31,52],[-16,-13],[-17,-15],[-21,-17],[-12,18],[-11,19]],[[2936,2837],[44,37]],[[2980,2874],[78,63]],[[3058,2937],[11,-18]],[[3069,2919],[10,-18],[22,-37],[-38,-29],[-14,-11],[13,-23],[-18,-8]],[[2980,2874],[-13,21]],[[2949,2928],[63,51],[14,11],[-15,25],[14,16],[37,-60],[3,0],[14,11],[-11,19],[-17,28],[0,3],[1,2],[14,17],[7,7],[13,12],[-8,21]],[[3078,3091],[20,15]],[[3098,3106],[10,-25]],[[3108,3081],[27,-80],[5,-15],[3,-8]],[[3143,2978],[-21,-16],[-10,-6],[-9,-2],[-7,0],[-12,-2],[-6,-2],[-7,-3],[-13,-10]],[[2881,3114],[4,-11],[8,-14],[40,-65],[2,0],[14,11],[18,15],[17,13],[43,35],[3,2],[3,-1],[9,-12],[11,-17],[25,21]],[[2901,3123],[19,6]],[[2920,3129],[12,2],[20,5],[16,5],[15,9],[11,8],[9,8],[8,7],[18,23]],[[3029,3196],[44,-52],[16,-21],[9,-17]],[[2920,3129],[0,25],[-1,40],[5,17],[7,18],[9,12],[12,12],[12,8],[20,11],[-7,24]],[[2977,3296],[19,8],[8,-22],[5,-18],[5,-11],[6,-10],[9,-11],[14,-18]],[[3043,3214],[-14,-18]],[[1823,2038],[-7,16],[-4,7],[-18,15],[-6,7],[-10,22]],[[1757,1958],[-2,3],[-10,21],[-10,21],[-11,24]],[[1724,2027],[-9,19],[-2,6],[-3,1],[-29,-22],[-15,32]],[[1671,1904],[-17,36]],[[1654,1940],[19,12],[10,-21],[2,0],[7,4],[7,6],[0,3],[-3,8],[-6,12],[-3,5],[-10,22],[18,13],[29,23]],[[1654,1940],[-9,21],[-19,41],[-4,16],[-5,18],[-3,4]],[[6347,2548],[-57,41],[-14,-20],[-11,-7],[-18,12],[-15,12],[-15,3]],[[5577,3559],[-3,-3],[-24,-38]],[[5550,3518],[-20,-25],[-22,-30],[-15,-20],[-4,-4]],[[5489,3439],[-18,-24],[-35,-45]],[[5402,3321],[42,-43],[3,-4],[16,-17],[4,-3],[21,-23],[6,-6],[3,-3]],[[5497,3222],[6,-5],[4,-5],[6,-9],[5,-9],[6,-15],[4,-19],[3,-17]],[[4365,2120],[-83,83],[-2,3],[-88,154],[-32,58],[41,62],[-121,125]],[[4080,2605],[22,17],[8,5],[8,3],[44,10],[3,-17],[2,-6],[3,-6],[6,-11],[3,-4],[4,-5],[21,-22],[36,-40],[5,-14],[72,16],[5,1],[77,19],[156,37],[10,0],[11,14],[17,22],[70,92],[38,51],[16,10],[27,-27],[28,36],[0,4],[-18,21],[32,38],[5,5],[6,4],[7,1],[7,0],[6,-1],[7,-4],[12,-7],[12,-5],[12,-7],[10,-6],[5,-2],[5,0],[2,0],[3,0],[2,0],[-9,12],[-12,16],[-2,3],[-3,4],[-3,3],[-3,4],[-4,4],[-4,5],[-2,3],[-5,5],[-6,7],[-6,6],[-7,8],[-4,3],[-5,5],[-2,2],[14,-1],[12,-1],[42,-4],[30,-3],[11,-1],[36,-4],[37,-3],[20,-2],[18,-2],[-2,6],[-3,9],[6,69],[2,3],[5,63],[2,12],[2,12],[2,4],[8,19],[2,3],[8,12],[11,14],[54,69],[41,52],[43,55],[66,86],[4,10],[3,2],[2,4],[2,5],[3,4],[7,10],[2,2]],[[5300,3421],[5,8],[14,18],[6,8],[5,8],[6,15],[4,13],[3,19],[0,12],[4,2],[3,9],[8,17],[3,6],[2,5],[1,5],[-1,26]],[[5363,3592],[15,2],[15,-15],[22,28]],[[5415,3607],[7,9],[14,19],[3,3],[2,-2],[38,-40],[11,14]],[[5490,3610],[6,8],[1,0],[1,0],[1,0],[1,-1],[11,-11],[5,0],[19,1],[-1,-1],[-1,-1],[-1,-1],[0,-2],[1,-23],[6,1],[8,0],[5,0],[4,-1],[3,-2],[14,-14],[4,-4]],[[5031,3567],[1,-25],[-34,-3],[-22,0],[-9,-1],[-13,-1],[2,-21],[6,-20],[-11,-3],[-8,-7],[-5,-7],[42,-44],[-1,-2],[-23,-33],[-17,-27]],[[4939,3373],[-17,18],[-13,14],[-6,6],[-14,14],[-15,16],[-8,4],[-6,2],[-6,2],[-5,3],[-8,8],[-1,3],[-1,5],[1,8],[2,4],[7,7],[6,4],[5,3],[3,3],[5,5],[10,12],[-17,18],[-1,3],[-15,16],[-10,12],[-3,0],[-4,3]],[[4828,3566],[41,50],[7,7],[4,4],[6,3],[5,2],[5,2],[16,3],[7,1]],[[4919,3638],[34,2],[21,2]],[[4974,3642],[19,0]],[[4993,3642],[0,-3],[1,-20],[1,-23],[1,-31],[35,2]],[[4939,3373],[-15,-17],[-26,-27],[-10,-10],[-67,68],[-71,76],[-4,4],[82,99]],[[5031,3567],[23,1],[6,0],[8,-2],[33,1],[16,1],[36,4],[6,0],[6,-10],[6,-7],[40,-42]],[[5211,3513],[-2,-3],[-63,-81],[-28,-37],[-4,-4],[-3,-2],[-11,-5],[-8,21],[-2,3],[-22,-10],[-26,-12],[-3,-1],[-1,0],[-3,2],[-35,36],[-12,-20],[-13,-17],[-13,-16],[-5,-7],[-3,-3],[-15,16]],[[5211,3513],[31,-33],[28,-27],[27,-29],[3,-3]],[[4080,2605],[-28,43],[1,0],[12,10],[97,81],[7,5],[12,36],[1,2],[1,0],[2,2],[11,4],[1,3],[8,4],[0,7],[1,4],[4,1],[-1,5],[3,2],[2,3],[-2,3],[0,3],[-4,1],[-4,0],[-4,-1],[-4,-1],[-3,1],[3,8],[-1,5],[-6,34],[4,4],[5,4],[-1,6],[0,1],[-2,8],[4,7],[8,6],[12,8],[16,14],[-7,17],[-9,19],[-26,49],[-27,50]],[[4166,3063],[-48,44],[-61,58],[10,4]],[[4067,3169],[42,48],[-19,22]],[[4158,3361],[36,-47],[23,30],[20,-20],[11,12],[65,-62],[31,40],[20,-24],[37,44],[5,0],[4,2],[1,5],[14,11],[23,-1],[33,29],[-26,28],[-1,1],[-42,47]],[[4412,3456],[31,18],[15,11],[0,1],[32,19],[8,5],[45,28],[3,1]],[[4546,3539],[7,5],[36,22],[69,39],[28,16],[125,75],[36,22]],[[4847,3718],[20,-11],[51,-58],[1,-11]],[[5211,3513],[15,21],[30,39],[24,32]],[[5280,3605],[15,-20],[5,6],[2,0],[3,-2],[3,-5],[-6,-9],[16,-17],[25,32],[6,1],[14,1]],[[5374,3648],[16,-17],[7,9],[8,-8],[0,-1],[-6,-8],[16,-16]],[[5280,3605],[18,24],[6,8],[12,16]],[[5316,3653],[8,-3],[12,-11],[21,28],[17,-19]],[[6777,2060],[-58,37]],[[7388,3093],[-11,5]],[[7377,3098],[-28,13],[-10,1],[-8,-1],[-7,-1],[-8,-3],[-38,-10],[-18,-3],[-26,0],[-16,0]],[[7350,3037],[3,8],[4,0],[2,7],[-4,6],[21,38]],[[7376,3096],[1,2]],[[7338,3047],[12,27],[5,9],[4,7],[17,6]],[[5555,4114],[-40,-28]],[[5515,4086],[-46,-34],[-46,-34],[-2,-4],[-11,-8],[-2,3],[-16,18],[-3,4],[-2,3],[-2,2],[-3,3]],[[5524,4010],[-20,-25]],[[5504,3985],[-13,14],[-4,4],[-14,14],[-14,-19],[-16,-20],[-29,-36]],[[5414,3942],[-16,14],[-10,10],[-4,4],[-9,10]],[[5375,3980],[-3,3],[-7,7],[-21,22],[-3,2]],[[5341,4014],[39,24]],[[5515,4086],[11,-22],[-11,-6],[-10,-7],[-8,-6],[7,-11],[8,-11],[6,-7],[6,-6]],[[5504,3985],[35,-37]],[[5539,3948],[-14,-19],[-36,38],[-14,-19],[36,-38],[44,-47]],[[5526,3826],[-34,36]],[[5492,3862],[-11,11],[-67,69]],[[5539,3948],[46,-47]],[[5610,4014],[8,0],[3,-1],[2,-4],[-2,-4],[-3,-2],[-5,-2],[0,-3],[0,-8],[-1,-8],[11,-3],[9,-5],[-5,-12],[0,-3],[2,-2],[3,-5],[7,-6]],[[5524,4010],[5,-5],[11,-8],[11,20],[11,18],[11,-8],[7,-6],[9,-6],[9,-5],[9,-3],[5,0],[-2,7]],[[5610,4014],[-1,3],[-3,7],[-3,7],[11,6],[2,2],[5,6]],[[7592,2355],[0,-1],[-1,-4],[-1,-3],[0,-2],[-4,-17],[-2,-7],[-1,-4],[-4,-17],[-3,-14],[-2,-9],[-1,-3],[-1,-3],[-11,-43],[-1,-4]],[[7560,2224],[-3,-11],[0,-1],[0,-1],[0,-1],[-1,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-2],[0,-1],[0,-1],[0,-2],[0,-2],[1,-5],[0,-2],[0,-1],[1,-1],[0,-2],[0,-1],[1,-1],[0,-2],[1,-1],[0,-1],[0,-1],[1,-3],[1,-1],[1,-2],[0,-1],[1,-1],[0,-2],[1,-1],[1,-1],[1,-2],[0,-1],[1,-2],[1,-1],[2,-2],[6,-9],[6,-7],[13,-18],[6,-9],[2,-2],[2,-2],[2,-2]],[[7613,2099],[-2,-2],[-2,-2],[-1,-1],[-5,-6],[-2,-2],[-40,-40],[-4,-4],[-2,-2],[-3,-3],[-34,-26],[-130,-88],[-4,-3],[-72,-34],[-42,-22],[-24,-13],[-96,-72],[-58,-45],[-38,-41],[-22,-27],[-8,-10],[-4,-4],[-4,-4],[-20,-25],[-18,-25],[-31,-53],[-9,-13]],[[7473,2222],[2,2],[12,16],[4,5],[3,4],[5,8],[27,40],[8,10],[9,7],[5,5],[41,36],[1,1],[2,-1]],[[7590,1280],[-53,-103],[-2,-4]],[[6457,1354],[28,-19],[5,-11],[2,-2],[3,-2],[1,-2],[2,-1],[0,-1],[3,-3],[2,-2],[3,-4],[1,-4],[2,-3],[1,-2]],[[6510,1298],[-12,-4],[-3,-1],[-91,-29],[-6,-2],[-38,-10],[-21,-6],[-75,-24],[-4,-2],[-6,-2]],[[6254,1218],[0,5],[-1,35],[-22,0],[-23,-1]],[[6208,1257],[0,65]],[[6208,1322],[22,0],[0,32],[15,36],[3,8],[1,4],[1,3],[-6,4],[-11,6],[-10,6],[-54,37],[-9,6],[-7,4]],[[6153,1468],[-1,1],[-7,4],[-4,3],[-6,3],[-7,3],[-7,3],[-6,3],[-7,2]],[[6153,1321],[-1,100],[0,37],[0,6],[1,4]],[[6208,1322],[-19,0],[-18,-1],[-18,0]],[[6172,1257],[-19,0]],[[6153,1257],[0,64]],[[6208,1257],[-19,0],[-17,0]],[[6153,1257],[-17,-1],[-18,0],[-12,1]],[[6105,1421],[12,0],[17,0],[1,-100],[18,0]],[[6137,1181],[-19,-6]],[[6118,1175],[0,5],[-8,12],[-5,57],[1,8]],[[6172,1257],[0,-60],[-18,-5],[-18,-6],[1,-5]],[[6254,1218],[-22,-7],[-95,-30]],[[5468,3830],[-27,27],[-2,1],[-2,-1],[-40,-52],[-39,-52],[15,-16],[13,-13]],[[5386,3724],[-13,-18]],[[5373,3706],[-13,13],[-16,16],[-3,-2],[-4,-6],[-18,-22],[-18,-24],[1,-12],[14,-16]],[[4993,3642],[21,2],[21,1],[22,1],[10,2],[8,2],[8,5],[8,8],[7,8],[10,17],[9,15],[1,3]],[[5118,3706],[12,19],[13,22],[13,20]],[[5156,3767],[13,19],[16,19],[14,17],[26,30],[11,9],[16,10],[7,5],[14,11],[42,41],[19,18],[6,4],[22,19],[10,9],[3,2]],[[5492,3862],[-3,-3],[-13,-17],[-8,-12]],[[5468,3830],[11,-12],[-14,-20],[-14,-18],[-3,2],[-10,9],[-13,-15],[-10,-15],[9,-13],[-1,-5],[-25,-32],[-12,13]],[[5601,3534],[-24,25]],[[5490,3610],[-26,28],[7,10],[-13,14],[-11,11],[-3,1],[-6,-6],[-2,-1],[-1,1],[-9,10],[-3,3],[-12,12],[-11,-15]],[[5400,3678],[-4,4],[-23,24]],[[5400,3678],[-4,-2],[-22,-28]],[[8925,5145],[-10,6],[-8,4],[-5,2],[-1,1],[-10,5]],[[8908,5098],[-10,-24],[-10,6],[-14,8],[-10,5]],[[8889,5051],[-10,5],[-14,8],[-10,6]],[[8846,5047],[-11,6],[-18,9],[-10,6]],[[8807,5068],[9,23]],[[8837,5023],[-11,6],[-19,10],[-10,5]],[[8797,5044],[-11,6],[-19,10],[-10,5]],[[8757,5065],[9,25],[10,-6],[20,-11],[11,-5]],[[8776,4996],[11,25],[10,23]],[[8847,5017],[-5,-11],[-4,-12],[-11,6],[-10,-26],[-41,22]],[[8816,4937],[-11,6],[-12,6]],[[8793,4949],[-29,16]],[[8764,4965],[5,12],[6,15],[1,4]],[[8796,4920],[-12,6],[5,12],[4,11]],[[8812,4853],[-10,5],[-16,8],[-9,6]],[[8777,4872],[-41,21]],[[8736,4893],[10,25],[4,12],[5,12],[-23,12],[1,2],[3,8],[5,13]],[[8741,4977],[23,-12]],[[8792,4795],[-11,5],[-31,17]],[[8750,4817],[6,11],[8,17],[11,23],[2,4]],[[8750,4817],[-38,21]],[[8712,4838],[5,11],[8,16],[6,14],[4,11],[1,3]],[[8728,4768],[-10,6],[-18,9],[-11,5]],[[8689,4788],[6,16],[6,11],[5,11],[6,12]],[[8750,4817],[-5,-11],[-6,-11],[-4,-10],[-1,-2],[-6,-15]],[[8773,4746],[-10,5],[-24,12],[-11,5]],[[8765,4723],[-11,5],[-24,12],[-10,5]],[[8720,4745],[8,23]],[[8745,4670],[-11,6],[-23,12],[-10,5]],[[8701,4693],[9,26],[10,26]],[[8730,4629],[-9,5],[-25,13],[-11,5]],[[8685,4652],[8,21],[8,20]],[[8685,4652],[-7,-21]],[[8678,4631],[-11,5],[-18,9],[-11,5],[8,19],[0,2],[9,22],[7,19]],[[8662,4712],[10,-5],[13,-6],[5,-3],[11,-5]],[[8700,4595],[-20,10],[-10,5]],[[8670,4610],[8,21]],[[8661,4587],[-36,19],[-4,1],[-39,19]],[[8582,4626],[5,11],[4,12]],[[8591,4649],[8,21]],[[8599,4670],[7,19],[1,2]],[[8607,4691],[8,22],[7,19]],[[8622,4732],[11,-5],[10,-5],[8,-4],[11,-6]],[[8670,4610],[-5,-11],[-4,-12]],[[8643,4542],[9,24]],[[8652,4566],[4,11],[5,10]],[[8652,4566],[-35,17],[-4,2],[-10,-24],[-2,1],[-7,4],[-20,10],[-10,5]],[[8564,4581],[10,24]],[[8574,4605],[8,21]],[[8545,4525],[10,29],[0,3],[9,24]],[[8545,4525],[-2,1],[-9,5],[-11,5],[-17,4],[-36,5]],[[8470,4545],[12,30],[6,15],[9,24],[5,14],[4,11]],[[8506,4639],[36,-19],[22,-10],[2,-1],[8,-4]],[[8506,4639],[4,10],[4,11]],[[8514,4660],[10,-5],[26,-13],[20,-10],[2,-1],[10,-5]],[[8514,4660],[4,12],[4,11]],[[8522,4683],[10,-5],[49,-24],[10,-5]],[[8522,4683],[8,21]],[[8530,4704],[9,-5],[2,0],[47,-24],[11,-5]],[[8530,4704],[8,21]],[[8538,4725],[11,-5],[47,-24],[11,-5]],[[8538,4725],[8,22]],[[8546,4747],[7,20]],[[5016,1222],[4,-1],[16,-1],[4,-5],[1,-11],[-2,-4],[-2,-2],[-4,-2],[-13,-4],[-8,-2],[-4,0],[-8,4],[-5,0],[-2,-1],[-4,-2],[-4,-6],[-2,-9],[-4,-6],[-8,-6],[-6,-4],[-3,-8],[-3,-3],[-15,-6],[-7,-4],[-12,-3],[-11,0],[-13,4],[-16,12],[-13,12],[-3,2],[-1,3],[-8,3],[-5,1],[-3,1],[-3,1],[-2,0],[-2,0],[-9,-3],[-9,-10],[-7,-1],[-6,-2],[-4,2],[-4,2],[-9,5],[-6,6],[-2,0],[-5,4],[-3,0],[-5,1],[-4,0],[-3,1],[-5,3],[-2,1],[-4,-1],[-2,-10],[-3,-4],[-9,2],[-2,2],[-1,0]],[[4741,1173],[-2,3],[1,20],[-2,4],[-5,2],[-2,20]],[[4731,1222],[11,-2],[3,0],[16,1],[4,0],[4,1],[11,4],[8,8],[2,0],[0,1],[1,2],[2,2],[2,2],[3,3],[4,4],[5,3],[13,8],[13,5]],[[4833,1264],[26,5],[11,2],[15,2],[20,6]],[[4905,1279],[4,1],[17,2],[19,0],[6,-30],[3,-25],[4,-24],[38,9],[8,1],[6,-3],[5,0],[1,9],[0,3]],[[5122,1221],[0,-4],[3,-15]],[[5125,1202],[-8,2],[-10,1],[-20,1],[-5,0],[-4,-1],[-18,-2],[-2,2],[-6,6],[-8,10],[-4,2],[-11,2],[-9,0],[-4,2]],[[5016,1227],[1,8],[17,0],[0,33],[-18,1],[0,12]],[[5016,1281],[11,0],[26,-1],[11,-2],[11,-7],[9,-8],[10,-12],[5,-9],[10,-10],[7,-7],[6,-4]],[[1506,1092],[-3,7],[-2,7],[-3,45],[-11,27]],[[1560,1505],[64,-17]],[[1624,1488],[14,-49],[22,-78],[23,-80],[29,-62],[4,-7],[2,-5],[3,-3],[4,0],[5,1]],[[1983,1486],[7,-12],[33,-54],[4,-7]],[[1624,1488],[2,-1],[26,11],[10,4],[2,4],[9,4],[5,-7],[6,8],[8,7],[7,7],[34,24],[3,3],[16,12],[9,11],[15,23],[12,16],[13,17]],[[6475,2834],[-8,6],[11,20],[0,17],[-12,8],[2,12],[4,14],[10,16],[-5,4],[-2,1],[-2,2]],[[7999,2859],[-7,9],[-7,7],[-5,4],[-2,3]],[[7978,2882],[3,3],[32,42],[2,2],[4,6],[8,10],[12,16],[0,1],[20,25],[5,7],[4,5],[3,2]],[[7920,2741],[-10,27]],[[7910,2768],[-8,17],[-1,2],[-1,4]],[[7900,2791],[15,15],[8,9],[15,17],[7,8],[11,14],[14,17],[8,11]],[[7978,2882],[-2,4],[-1,2],[-1,3],[-4,6],[-2,3],[-8,10],[-8,9]],[[7900,2791],[-1,1],[-1,3],[-3,5],[-2,6],[-2,3],[-2,5],[-4,5],[-8,11],[-15,19],[-2,3],[14,7],[-26,13],[-8,4],[-13,7]],[[7850,2917],[3,0],[2,-2],[1,-3],[4,-4],[8,-9],[8,10],[4,6],[2,3],[14,18]],[[7896,2936],[7,-6],[2,-1],[15,-12],[13,-10],[15,14],[3,-3],[1,1]],[[8723,2851],[-10,7],[-12,6],[-16,5],[-40,13],[-5,1],[-2,1],[-32,10],[-33,10],[-2,-1],[-4,1],[-21,7],[-4,2],[-3,2],[-7,2],[-10,4],[-13,7],[-13,10],[-7,7],[-4,3],[-10,12],[-7,10],[-6,9],[-5,11],[-3,9],[-1,2],[-3,11],[-2,6]],[[8448,3018],[7,2],[1,2],[1,6],[6,35],[3,22],[2,20],[0,2],[0,2],[-1,0],[-6,4],[-1,1],[2,5],[0,5],[0,9],[0,3],[2,23],[1,24],[-1,21]],[[8595,3755],[-7,-33],[-50,-139],[0,-2],[26,1],[27,75],[3,0],[3,15],[13,-16],[-22,-123],[8,-1],[-10,-57],[-89,-6],[-17,-47],[0,-1],[98,9],[-7,-30],[-97,-10],[-4,-25],[54,6],[0,-5],[-54,-6],[-4,-19],[97,13],[-6,-32],[-90,-12],[6,-49],[1,-11],[4,-26],[6,0],[0,-5],[4,-1],[5,20],[11,1],[-3,-27],[3,0],[2,8],[2,0],[4,15],[22,-3],[0,-13],[2,0],[-7,-113],[1,0],[0,-3],[-9,-131],[2,-5],[3,1],[0,-6],[6,0],[1,-2],[4,-1],[0,8],[6,-1],[7,103],[13,173],[1,2],[8,-1],[30,0],[-11,-169],[22,-2],[12,159],[3,41],[3,50],[0,7],[5,49],[3,18],[10,75],[3,27],[2,8],[3,2],[2,1],[3,-2],[5,-4],[-1,-102],[-1,-17],[1,-81],[1,-12],[-2,-19],[-1,-22],[0,-16],[0,-20],[0,-18],[8,-43],[0,-13],[1,-2],[7,-55],[14,-111],[3,-10],[6,-18],[7,-21],[16,-33],[13,-30],[2,-4]],[[8376,2911],[3,3],[31,28],[3,1],[8,-1],[7,0],[9,-1],[9,2],[7,1],[4,2],[6,-1],[5,0],[7,0],[0,3],[-6,6],[-2,3],[-3,6],[-4,5],[-3,5],[-4,6],[-3,5],[-1,4],[-2,4],[-3,6],[-8,-7],[-2,1],[2,21],[-7,0],[-4,-33],[-11,-10],[4,41],[-7,-1],[-6,-50],[-21,-20],[-5,-4]],[[8379,2936],[2,3],[7,29]],[[8388,2968],[4,21],[3,23],[14,2],[30,2],[2,0],[3,1],[4,1]],[[8448,3018],[-6,26],[-6,19],[-3,11],[-1,3],[-6,12],[-7,11],[-8,8],[-3,3],[-6,4],[-28,19],[-10,6],[-4,3],[-16,10],[-11,7],[-7,4],[-32,26]],[[8294,3190],[1,3],[1,2],[1,4],[20,46],[5,12],[4,9],[4,12]],[[8388,2968],[-29,17],[-2,2],[-40,25],[-8,-19],[-6,-12],[-31,5],[-11,2],[-11,3],[-9,6],[-6,4],[-3,4],[-6,6]],[[8226,3011],[12,23],[9,22],[15,37],[6,16],[1,4],[3,9],[2,6],[2,6],[5,15],[10,29],[1,5],[0,1],[1,2],[1,3],[0,1]],[[8159,3023],[17,28]],[[8176,3051],[50,-40]],[[8226,3011],[-12,-25],[-14,-27]],[[8379,2936],[-3,-4],[-3,-2],[-15,-12],[-32,-27],[-30,-28],[-8,-9],[-3,-2]],[[2357,1179],[-39,-11],[-36,-9],[-22,-6],[-35,-9]],[[2225,1144],[-10,35],[-1,4],[-25,84],[-4,7],[-10,19]],[[2175,1293],[10,5],[1,0]],[[2323,1305],[6,-15],[-1,-3],[1,-5],[2,-8],[6,-19],[1,-6],[3,-12],[3,-11],[6,-24],[7,-23]],[[2439,1152],[8,-30],[-9,-3],[-11,-4],[-9,-3],[-10,-4],[-10,-3],[-18,-7],[-2,0],[2,-9]],[[2380,1089],[-36,-13],[-48,-17],[0,-1],[0,-2],[0,-1],[18,-70],[-39,-11]],[[2275,974],[-2,7],[-2,6],[-9,32],[-7,26],[-30,99]],[[2357,1179],[3,-15],[3,-8],[50,12],[20,6],[3,-9],[3,-13]],[[2421,1382],[2,-8],[3,-10],[0,-3],[3,-10],[6,-24],[12,-48],[6,-24],[-11,-4],[3,-11],[3,-12],[4,-19],[2,-4]],[[2454,1205],[-1,-2],[11,-42],[-25,-9]],[[2454,1205],[58,20],[25,9],[4,2]],[[2541,1236],[10,-39]],[[2551,1197],[-3,-2],[8,-25],[-1,-5],[-1,-2],[-1,-2],[-2,-3],[-7,-2],[4,-18],[4,-16],[-6,-1],[-1,0],[-3,2],[-1,0],[-22,-7],[0,-1],[-1,-1],[0,-1],[10,-34],[-20,-9],[-32,-17],[-37,-17],[-40,-17],[-2,9],[-4,11],[-4,16],[-2,10],[-7,24]],[[2582,1092],[-3,-1],[-7,-3],[-1,-1],[-26,-12],[-56,-24],[-90,-41],[-55,-22],[-22,-7],[-38,-10],[-6,-2]],[[2278,969],[-3,5]],[[2551,1197],[13,-40],[5,-8],[3,-2],[2,0],[3,-1],[9,3],[15,6],[42,15],[-4,16]],[[2639,1186],[4,2],[45,15],[1,0],[1,-1],[5,-19],[0,-2],[0,-1],[-49,-22],[7,-28],[69,31],[48,22]],[[2770,1183],[46,21]],[[2816,1204],[1,-6]],[[2817,1198],[-2,-1],[-153,-69],[-74,-33],[-6,-3]],[[2607,1311],[3,-11],[1,-1],[13,0],[5,0],[9,2],[2,-11],[4,-13]],[[2644,1277],[-6,-2],[-3,0],[-13,0],[-1,-14],[0,-6],[3,-11],[11,-44],[4,-14]],[[2541,1236],[-30,118],[-5,16]],[[2506,1370],[13,4],[7,-24],[10,4],[3,0],[35,-7],[1,-1],[1,-2],[4,-17],[6,-20],[1,-3],[20,7]],[[2488,1435],[4,-9],[2,-9],[12,-47]],[[2757,1440],[59,-236]],[[2770,1183],[-5,22],[-1,1],[-2,1],[-7,-3],[-15,55],[-5,22],[-9,25],[-1,1],[-1,1],[-1,0],[-1,0],[-11,-4],[-7,-4]],[[2704,1300],[-5,17],[-2,8],[21,7],[1,1],[-4,17],[0,13],[-7,29],[-8,31],[-1,1],[-1,0],[-60,0],[-7,1],[-1,-1],[0,-1],[0,-4],[7,-25],[-20,-7],[-27,-9],[6,-24],[11,-43]],[[2488,1435],[22,3],[247,2]],[[2704,1300],[-13,-6],[-6,-3],[-20,-7],[-21,-7]],[[2537,873],[-2,-1],[-2,-2],[-12,-7],[-2,-3],[-13,-9],[-12,-13],[6,-11],[2,2],[1,-1],[-2,-3],[-4,-3],[-10,11],[-4,-3],[-11,-11],[-14,-16],[-3,-2],[-3,-1],[-4,-4],[-4,-6],[-5,-3],[-5,-6],[0,-2],[0,-2],[-15,-18],[-2,-3],[-1,-1],[-3,0],[-3,-1],[-2,-4],[-8,-4],[-13,-1],[-3,1],[-13,1],[-12,2],[-13,0],[-16,-4],[-2,-2],[-5,-5],[-3,-1],[-2,-1],[-1,-1],[-11,-5],[-6,-4],[7,-19],[-4,-3],[-4,10],[-1,0],[2,-8]],[[2228,744],[9,10],[9,8],[10,5],[16,7],[43,17],[23,9],[21,8],[-11,38],[-13,45],[0,2],[1,0],[1,1],[1,0],[4,-1],[6,-2],[6,-3],[5,-4],[22,7],[-2,3],[-4,5],[-4,5],[-6,4],[-7,4],[-9,4],[-10,2],[-11,0],[-1,1],[-7,23]],[[2320,942],[10,1],[13,-1],[8,-2],[5,-1],[12,-4]],[[2215,729],[-2,5],[-6,23],[-6,19],[2,4],[6,7],[1,3],[-1,2],[-1,3],[-7,8],[-29,101],[17,6],[5,1],[8,3],[22,6],[73,19],[10,2],[13,1]],[[1879,863],[27,8],[14,3],[32,8],[56,16],[46,12],[17,4],[70,20],[124,31],[13,4]],[[2582,1092],[3,-15],[1,-6],[0,-4],[2,-8],[0,-4]],[[2104,990],[13,2],[5,1],[5,3],[3,3],[4,5]],[[2134,1004],[4,-5],[4,-3],[11,-19],[1,-1],[1,0],[38,10],[20,6],[4,-10],[2,-9],[4,-12],[52,13]],[[2134,1004],[2,3],[2,7],[1,6],[0,8],[-1,7],[-5,23],[17,5],[0,2],[0,3],[-2,7],[-3,5],[-3,5],[-5,6],[-5,5],[-2,5],[-2,5],[-5,18],[20,5],[5,-18],[2,-5],[4,-3],[5,-2],[4,1],[20,7],[22,10],[-5,19]],[[2200,1138],[25,6]],[[2096,1141],[41,12],[-3,9],[1,4],[2,7],[2,6],[25,-1],[16,-1],[3,0],[4,1],[6,-20],[-4,-10],[6,-5],[5,-5]],[[2069,1205],[-4,19],[0,3],[1,2],[37,8],[-8,26],[-6,23],[16,6],[3,3],[7,-23],[41,14],[12,4],[7,3]],[[2023,1318],[25,12],[16,9],[5,2],[1,1],[26,-42],[12,11],[22,21],[30,18],[24,-49],[2,-3]],[[2030,1408],[6,4],[50,41],[36,29],[17,14]],[[1953,1581],[11,-19],[9,-15],[1,-3],[77,61],[21,17]],[[6461,6069],[4,24],[18,-5],[8,-1]],[[6491,6087],[1,-12],[-2,-13],[-1,-5]],[[6489,6057],[-1,-4],[-2,-9],[-25,25]],[[6489,6057],[26,-26],[4,-4]],[[6519,6027],[-1,-5],[-4,-13],[-2,-10],[-6,-28],[-2,-8]],[[6504,5963],[-4,3],[-4,1],[-24,19]],[[6472,5986],[2,6],[2,11],[5,22],[-25,19],[5,25]],[[6326,5854],[4,-2],[25,-26],[2,1],[2,0],[2,-3],[1,-3],[33,-23]],[[6395,5798],[-2,-6],[-3,-5],[-3,-2],[-5,-3],[-6,-5],[-3,-1],[-3,-4],[-12,-26],[-3,-6]],[[6355,5740],[-10,-23],[-5,-11]],[[6340,5706],[-16,8],[-4,-11],[-2,-14],[-11,-39],[-5,1],[-1,-10],[-5,-14],[-7,-3]],[[6289,5624],[-4,-1],[-5,-2]],[[6280,5621],[-14,15],[-18,23],[-3,6],[0,1],[-16,-8],[-5,4],[-6,6],[-5,7],[-5,9],[-4,9],[0,7],[5,15],[5,9],[2,4],[9,13],[3,9],[11,25],[5,10],[3,8],[5,8],[22,24],[5,5],[2,2],[1,3],[0,13],[12,16],[3,6],[0,10],[13,31],[5,7],[1,1],[5,4],[8,4],[8,8],[1,-2],[-5,-5],[5,0],[4,2],[9,9],[25,29],[0,2],[3,-1],[3,5],[4,10],[2,1],[0,-5],[-1,-10],[-4,-10],[-8,-14],[-7,-9],[-8,-6],[-7,-3],[-14,-13],[-10,-10],[-1,-1],[-5,-11],[-6,-13],[-4,-13],[-1,-5],[1,-1],[0,-3],[-4,-7],[-1,-5],[-3,-6],[0,-4],[-9,-12],[0,-23],[-2,-13],[-5,-15],[0,-4],[-1,-5],[-2,-7],[-1,-13],[2,-1],[2,3],[2,-1],[-3,-12],[7,-2],[2,3],[3,6],[5,13],[1,6],[2,9],[1,8],[-1,26],[1,16],[5,5],[6,6],[-1,4],[1,5],[3,12],[3,4]],[[6407,6036],[-3,-8],[-3,9],[-3,0],[-2,2],[0,10],[1,8],[5,23],[0,6],[3,9],[6,11],[1,1],[6,-3],[1,-9],[-2,-14],[-4,-19],[-4,-8],[-2,-6],[0,-12]],[[6428,5995],[1,7],[3,10],[4,5]],[[6436,6017],[3,-9]],[[6439,6008],[-11,-13]],[[6395,6005],[-1,0],[-3,3],[0,2],[2,0],[3,0],[0,-2],[0,-1],[-1,-2]],[[8581,4842],[7,19],[4,9]],[[8592,4870],[5,10],[4,10]],[[8601,4890],[44,-24],[16,-8],[10,-6]],[[8671,4852],[-9,-16],[-1,-2],[-5,-11],[-2,-4],[-4,-12]],[[8689,4788],[-8,-23],[-11,5],[-7,4],[-6,3],[-15,8]],[[8671,4852],[3,6]],[[8674,4858],[10,-6],[28,-14]],[[8674,4858],[6,12],[7,16],[9,24],[1,4]],[[8697,4914],[11,-6],[28,-15]],[[8601,4890],[7,18],[7,16],[5,12],[5,12],[1,3]],[[8626,4951],[34,-18]],[[8660,4933],[4,-2],[33,-17]],[[8660,4933],[10,25],[9,24]],[[8679,4982],[9,23]],[[8688,5005],[29,-15],[8,-5],[16,-8]],[[8626,4951],[-8,5],[-61,32]],[[8557,4988],[4,5],[7,19],[10,24]],[[8578,5036],[9,23]],[[8587,5059],[10,-5],[46,-24],[11,-7],[-9,-23],[34,-18]],[[8601,4890],[-42,22],[-23,12]],[[8536,4924],[3,10],[3,10]],[[8542,4944],[4,17],[10,24],[1,3]],[[8592,4870],[-62,34]],[[8530,4904],[3,10],[3,10]],[[8563,4793],[-11,5],[-40,20],[-9,5]],[[8503,4823],[9,26],[9,23],[6,21],[3,11]],[[8546,4747],[-11,6],[-39,20],[-10,4]],[[8486,4777],[7,20]],[[8493,4797],[10,26]],[[8538,4725],[-11,5],[-40,20],[-9,5]],[[8478,4755],[8,22]],[[8514,4660],[-12,6],[-38,19],[-10,5]],[[8454,4690],[8,23],[8,21]],[[8470,4734],[8,21]],[[8470,4734],[-11,5],[-45,23],[-13,6]],[[8401,4768],[7,21]],[[8408,4789],[13,-6],[45,-23],[12,-5]],[[8454,4690],[-12,6],[-5,2],[-37,18],[-13,7]],[[8387,4723],[7,24],[7,21]],[[8436,4644],[-10,5],[-42,21],[-12,6]],[[8372,4676],[7,25]],[[8379,4701],[8,22]],[[8454,4690],[-9,-22],[-9,-24]],[[8379,4701],[-74,37]],[[8305,4738],[8,22],[16,43]],[[8329,4803],[8,21]],[[8337,4824],[10,-4],[48,-24],[13,-7]],[[8337,4567],[-45,9]],[[8292,4576],[-1,13],[-2,30],[-2,38],[1,2],[0,6],[0,7],[-2,1],[0,5],[1,8],[1,5],[3,10],[5,12],[9,25]],[[8372,4676],[-3,-9],[-2,-6],[-3,-10],[-5,-15],[-9,-29],[-1,-3],[-8,-26],[-4,-11]],[[8436,4644],[-9,-24],[-5,-16],[-14,-38],[0,-2],[-3,-9]],[[8405,4555],[-3,1],[-65,11]],[[8378,4487],[-9,5],[-36,21],[-2,1],[-10,6]],[[8321,4520],[7,20],[7,20],[2,7]],[[8405,4555],[-3,-7],[-2,-2],[-8,-20],[-6,-17],[0,-3],[-8,-19]],[[8434,4454],[-9,5],[-6,4],[-34,19],[-7,5]],[[8405,4555],[65,-10]],[[8470,4545],[-5,-13],[-8,-20],[-8,-19]],[[8449,4493],[-8,-20],[-7,-19]],[[8524,4473],[-9,5],[0,-3],[-3,-7],[-4,-10],[-51,30],[-8,5]],[[8501,4414],[-12,7]],[[8489,4421],[-35,21],[-1,0],[-11,7],[-8,5]],[[8418,4414],[7,20],[9,20]],[[8489,4421],[-4,-10],[-4,-9],[0,-4],[-3,-7],[-4,-9],[-47,27],[-9,5]],[[8394,4366],[10,18],[7,14],[7,16]],[[8339,4404],[5,9],[6,10],[6,11],[5,14]],[[8361,4448],[8,-5],[14,-8],[18,-10],[8,-5],[9,-6]],[[8361,4448],[8,19],[9,20]],[[8361,4448],[-9,6],[-32,18],[-2,1],[-10,6]],[[8308,4479],[7,20],[6,21]],[[8295,4435],[6,21],[7,23]],[[4188,1444],[-4,25],[-6,25],[-4,24],[-5,31],[14,-2],[26,0],[17,-1],[24,-1]],[[4250,1545],[6,-30],[4,-19],[4,-18],[3,-17],[4,-17],[4,-17]],[[4275,1427],[-25,-1],[-17,0],[-21,-1],[-19,-5],[-5,24]],[[4296,1317],[4,-22],[6,-30]],[[4306,1265],[-4,2],[-4,2],[-5,2],[-12,4],[-9,2],[-4,0],[-6,1],[-8,36],[-19,-1],[-52,-3]],[[4183,1310],[-4,23],[-5,23],[-11,56]],[[4163,1412],[-5,24],[30,8]],[[4275,1427],[3,-18],[3,-17],[4,-19],[4,-19],[3,-17],[4,-20]],[[2744,974],[-8,32],[25,9],[9,3],[1,1],[2,1],[1,2],[4,8],[16,26],[16,30],[17,27],[-11,46],[0,1],[-1,1],[-1,0],[-20,-9],[-22,-10],[-25,-11],[-1,-1],[0,-1],[0,-1],[2,-10],[0,-1],[0,-1],[-11,-5],[-26,-12],[-21,-10],[-21,-10]],[[6481,5902],[-5,-12]],[[6476,5890],[-44,30],[-8,-14],[-4,-8],[-3,-9],[0,-1],[-1,-4],[-1,-3],[-5,-20],[36,-25],[4,-3]],[[6450,5833],[-10,-23],[-9,-19]],[[6431,5791],[-1,2],[-3,2],[-10,6],[-17,12],[-5,-15]],[[6326,5854],[2,3],[3,2],[2,1],[7,7],[2,7],[0,4],[6,8],[2,4],[3,3],[0,-4],[2,-5],[2,0],[1,2],[0,7],[1,6],[15,21],[8,11],[6,4],[7,3],[8,7],[6,5],[5,7],[6,11],[5,17],[3,10]],[[6439,6008],[33,-22]],[[6472,5986],[-6,-15],[28,-20],[3,-1],[-2,-7],[-5,-16],[-4,-11],[-5,-14]],[[6504,5963],[14,-11],[9,-7],[12,-4],[19,-13],[19,-15]],[[6577,5913],[-6,-12],[-11,-22],[-11,-23]],[[6549,5856],[-64,43],[-4,3]],[[6552,6028],[60,-67]],[[6612,5961],[-14,-17],[-2,-3],[-12,-18],[-7,-10]],[[6519,6027],[22,-23],[11,24]],[[6636,5872],[-22,15],[-37,26]],[[6612,5961],[58,-61]],[[6670,5900],[-6,-6],[-2,-2],[-3,-2],[-4,-3],[-2,-1],[-3,-1],[-9,-6],[-3,-3],[-2,-4]],[[6596,5793],[-9,6],[-16,12],[4,9],[-33,23],[7,13]],[[6636,5872],[-6,-12],[-11,-22]],[[6619,5838],[-12,-22],[-11,-23]],[[6714,5822],[4,-5],[6,-4],[7,-5],[11,-8],[11,-8]],[[6753,5792],[-1,-3],[-9,-16],[-8,-17]],[[6735,5756],[-9,5],[-46,32],[-3,3],[0,2],[-58,40]],[[6636,5872],[6,-6],[53,-34],[17,-13],[2,3]],[[6670,5900],[11,15],[7,7]],[[6688,5922],[38,-61],[5,-6],[5,-7]],[[6736,5848],[-9,-10],[-13,-16]],[[6688,5922],[13,11],[14,13]],[[6715,5946],[49,-74],[-15,-13],[-13,-11]],[[2102,1961],[17,11],[13,9],[12,10],[3,2],[1,1],[2,2]],[[2063,2107],[15,-34],[6,-11],[7,-11],[4,-5],[8,-10],[6,-7],[1,-2],[10,-9],[19,-14],[11,-8]],[[1983,2132],[10,12],[3,2],[3,0],[2,-1],[12,-27],[3,-6],[3,-4],[4,-4],[2,-5],[6,-14],[28,16],[1,3],[3,3]],[[2063,2107],[1,2],[10,4],[-9,19],[7,5],[7,3],[4,2]],[[2083,2142],[19,0],[9,-1],[0,-22],[7,0],[8,1],[7,3],[9,-19],[8,-18],[9,-19],[8,-20],[13,-19]],[[2083,2142],[0,20],[-9,0],[-11,25],[0,3],[7,18],[-14,8],[4,6],[7,15],[7,15],[6,12],[8,11],[7,9]],[[2095,2284],[10,-8],[2,-4],[3,-8],[13,-27],[17,10],[18,11],[18,11],[16,11],[17,11]],[[2209,2291],[11,-29]],[[2220,2262],[18,-51],[2,-5],[4,-4],[5,-4],[28,-16],[-2,-5],[-8,-23]],[[2063,2107],[-16,36],[-31,70],[-12,25],[-19,42]],[[1985,2280],[87,59],[28,17],[-14,41]],[[2086,2397],[5,19]],[[2091,2416],[6,-2],[3,-4],[23,-50],[-15,-9],[-9,-7],[-2,-2],[-1,-4],[-6,-22],[-3,-13],[0,-5],[1,-3],[7,-11]],[[1964,2154],[22,25],[-32,71],[3,1],[4,2],[4,0],[4,3],[19,11],[-5,11]],[[1983,2278],[2,2]],[[1955,2280],[7,-14],[21,12]],[[1932,2331],[2,1],[2,-5],[3,-3],[3,-1],[5,3],[2,1],[4,6],[1,2],[10,6],[6,1],[5,1],[5,7],[5,12],[-3,11],[3,12],[1,0],[3,2],[7,0],[4,1],[3,3],[1,2],[1,7],[-2,4],[1,6],[0,2],[0,21],[6,15],[5,9],[2,10],[0,18],[4,10],[3,19],[6,17],[5,22],[3,8]],[[2038,2561],[-2,-10],[21,-22],[2,-2]],[[2059,2527],[-5,-14],[-2,-5],[-9,-25],[-2,-6],[0,-2],[0,-6],[0,-6],[-1,-64]],[[2040,2399],[-2,-21],[-1,-7],[0,-5],[-2,-7],[-18,-20],[-11,-9],[-13,-10],[-6,-7],[-7,-13],[-2,-4],[6,-14],[1,-2]],[[2040,2399],[25,15],[9,6],[1,2]],[[2075,2422],[11,-25]],[[2059,2527],[3,8]],[[2095,2473],[-17,-24],[-8,-18],[5,-9]],[[2276,2393],[-37,17]],[[2239,2410],[1,8],[0,6],[0,5],[-2,6],[-2,6],[-7,17],[-2,1],[-2,-1],[-12,-6],[-7,19],[16,8],[-14,38],[-7,9],[-13,-14],[-12,-14],[-20,-22],[-15,19],[-15,-17],[-11,-16],[-9,-13]],[[2106,2449],[-9,-19],[-6,-14]],[[2239,2410],[-6,1],[-5,0],[-7,-1],[-5,-2],[-41,-21]],[[2175,2387],[-8,20],[-8,17],[-16,35],[-13,-18],[-12,-18],[-12,26]],[[2238,2271],[-18,-9]],[[2209,2291],[-15,32],[-4,5],[-6,4],[-7,4],[7,19],[4,11],[-6,5],[-3,6],[-4,10]],[[2299,2382],[-7,-19],[7,-18],[-10,-5],[-2,0],[-2,0],[-6,3],[-17,8],[-10,-29],[-26,-13],[-1,-3],[13,-35]],[[6797,5762],[-3,2]],[[6794,5764],[0,6],[1,5],[2,11],[1,6],[7,14],[10,17]],[[6815,5823],[10,19],[16,26],[-16,8],[-38,59]],[[6787,5935],[15,13]],[[6802,5948],[13,12],[14,12],[13,11],[-40,64]],[[6802,6047],[13,12],[15,12]],[[6830,6071],[41,35],[2,2]],[[6873,6108],[6,-9],[11,-16],[9,-14],[15,-24],[11,-17]],[[6925,6028],[2,-3],[2,-3]],[[6929,6022],[2,-3],[5,-7],[5,-5],[0,-1],[5,-5]],[[7185,6081],[-18,13],[-11,-15],[-4,0],[-32,23],[-11,-19],[-6,4]],[[7103,6087],[-16,11],[-5,-8],[-2,-2],[-8,-19],[-6,-18]],[[6929,6022],[120,237],[5,10],[7,13]],[[7061,6282],[12,24]],[[7159,6046],[-18,13],[-9,-18],[-9,-15],[-4,-1],[-30,23],[-1,1],[0,2],[0,2],[5,16],[10,18]],[[7061,6282],[-4,5],[-18,26],[-36,57]],[[7003,6370],[15,13],[17,13],[-36,57]],[[6999,6453],[16,13],[10,9],[14,13]],[[7039,6488],[14,11]],[[7053,6499],[36,-56],[26,-41],[3,-9]],[[7003,6370],[-35,56]],[[6968,6426],[15,13],[16,14]],[[4901,1424],[11,-63]],[[4912,1361],[-19,-5],[7,-49],[5,-28]],[[4833,1264],[-5,30]],[[4828,1294],[-3,22],[-3,17],[-2,4],[-2,2],[2,0],[2,1],[2,2],[4,10],[5,7],[7,5],[3,2],[1,2],[0,1],[-1,3],[0,1],[-1,2],[-4,0],[-3,2],[-4,3],[-2,5],[-3,8],[-3,13]],[[4823,1406],[-2,17],[0,8],[2,5],[2,4],[4,3],[4,-1],[3,-2],[3,-3],[2,-6],[5,-20],[19,5],[17,4],[19,4]],[[4731,1222],[-6,45],[0,3],[-1,2],[1,5],[-3,22]],[[4722,1299],[31,-3],[20,-2],[4,0],[24,-2],[14,0],[13,2]],[[4722,1299],[-2,19],[-10,64]],[[4710,1382],[31,6],[25,6],[39,8],[18,4]],[[4892,1481],[9,-57]],[[4710,1382],[-4,27],[-3,26],[-3,20],[0,5],[1,7],[1,1],[2,4],[6,7]],[[4710,1479],[3,3],[2,1],[2,2],[1,0],[8,5],[6,3],[13,6],[20,8],[12,3],[14,1],[7,0],[8,0],[4,-1],[4,0],[4,-2],[25,-9],[5,-1],[24,-9],[20,-8]],[[4710,1382],[-3,-1],[-60,-10],[-10,3],[-20,8],[-19,7],[-4,22],[-4,21],[-4,23],[-34,10],[4,-23],[4,-21],[3,-21]],[[4563,1400],[-33,10]],[[4530,1410],[-7,46],[-5,24],[-8,49],[-2,1],[-4,0],[-20,4],[-36,5],[-51,2]],[[4397,1541],[-96,3]],[[4301,1544],[-16,0],[-35,1]],[[4250,1545],[-1,6],[-1,5],[-1,5],[-3,13]],[[4689,1559],[-1,-3],[0,-4],[-1,-5],[0,-3],[0,-2],[0,-4],[0,-2],[1,-4],[0,-3],[1,-3],[1,-2],[1,-2],[1,-1],[1,-2],[1,-2],[1,-1],[3,-2],[3,-1],[4,-3],[4,-2],[3,-2],[1,-1],[1,-1],[1,-2],[0,-1],[1,-2],[0,-1],[1,-1],[0,-1],[0,-1],[0,-1],[0,-2],[0,-1],[-1,-2],[0,-1],[-1,-3],[-1,-1],[-2,-2],[-2,-3]],[[4722,1299],[-3,0],[-26,2]],[[4693,1301],[-26,2]],[[4667,1303],[-20,2],[-14,2],[-24,2]],[[4609,1309],[-31,2],[0,4],[-3,18],[-3,23],[-4,20],[-5,24]],[[4609,1309],[-1,-3],[13,-78],[1,-3],[0,-5]],[[4622,1220],[-16,9],[-3,2],[-5,2],[-5,2],[-17,7],[-4,1],[-7,3],[-5,1],[-3,1],[-3,1],[-5,0],[-5,0],[-25,-5]],[[4519,1244],[-4,25],[-1,1],[-2,1],[1,5],[-8,41],[-8,49],[-8,48]],[[4489,1414],[17,4],[4,-2],[17,-5],[3,-1]],[[4731,1222],[-13,-1],[-12,-3],[-11,-2],[-12,-1],[-11,-2],[-6,0],[-6,0],[-10,1],[-6,0],[-7,1],[-6,1],[-4,2],[-5,2]],[[4667,1303],[9,-44],[1,-2],[2,-1],[19,3],[2,4],[-7,38]],[[4741,1173],[-2,1],[-3,1],[-1,2],[1,5],[2,12],[-1,2],[-1,2],[-3,-1],[0,-7],[-11,-1],[-7,-1],[-12,-2],[-6,-2],[-9,0],[-16,2],[-14,6],[-18,-2],[-7,-3],[-2,0],[-5,-1],[-7,-6],[-7,-9],[-7,-7],[-7,-3],[-16,-4],[-4,-3],[-3,-8],[-7,-11],[-3,-9],[-5,-4],[-8,-5],[-6,-6],[-4,1],[-2,1],[-2,6],[0,14],[-1,6],[-3,6],[-5,8],[-4,7],[-10,9],[-12,8],[-10,4],[-4,2],[-7,1],[-6,-1],[-4,0],[-5,0],[-5,5],[-3,-3],[-4,-5],[-5,-7],[-7,-15],[-1,-1],[-2,-6],[-2,-1],[-9,-19],[12,-21],[44,-7],[0,-3],[-1,-3],[-38,5],[-1,0],[-6,2],[-13,24],[-11,14],[-9,18],[-9,13],[-6,10],[-9,12],[-7,6],[-4,12],[-3,6],[-3,1],[-10,2],[-16,8],[-27,9]],[[4312,1239],[-6,26]],[[4306,1265],[18,-14],[7,-4],[13,-9],[8,-6],[7,-5],[5,-3],[4,-2],[5,-1],[5,-1],[7,0],[21,5],[6,1],[9,0],[8,0],[7,-1],[5,0],[6,0],[7,0],[5,-1],[4,1],[7,1],[8,2],[4,1],[12,5],[18,8],[3,1],[4,1]],[[4296,1317],[19,1],[17,1],[-2,2],[0,2],[-6,22],[-3,18],[-4,19],[-4,18],[-4,18],[-3,16],[13,2],[6,0]],[[4325,1436],[30,-8],[46,-11]],[[4401,1417],[48,-12],[12,2],[2,0],[24,6],[2,1]],[[4401,1417],[0,6],[-1,6],[-1,5],[3,2],[5,2],[6,1],[5,-2],[7,-1],[8,1],[-4,28],[-5,32],[-2,1],[-1,0],[-1,0],[-3,-1],[-3,0],[-18,8],[1,5]],[[4397,1510],[2,8],[-2,23]],[[4325,1436],[2,8],[-13,63],[-1,6]],[[4313,1513],[84,-3]],[[4313,1513],[-4,4],[-3,2],[-2,7],[-3,18]],[[6550,5222],[6,-1]],[[6545,5191],[-1,-4],[-7,-22]],[[6537,5165],[-5,3],[-42,20],[-4,-12],[-4,-11],[-4,-11],[-4,-11]],[[6474,5143],[-61,30]],[[6413,5173],[4,11],[4,11]],[[6421,5195],[4,11],[4,11],[8,24],[9,25]],[[6446,5266],[61,-31],[9,-4],[16,-8],[18,-1]],[[6446,5266],[-52,25],[-10,4]],[[6384,5295],[8,23],[8,21],[8,23]],[[6408,5362],[9,-5],[13,-6],[19,-9],[20,-9],[42,-21]],[[6511,5312],[-8,-22],[20,-10],[21,-10]],[[6544,5270],[18,-9],[-7,-22],[-5,-17]],[[6511,5312],[19,57]],[[6530,5369],[10,-7],[9,-6]],[[6549,5356],[10,-8],[10,-5],[-4,-13],[-9,-22],[-5,-15],[-7,-23]],[[6549,5356],[14,41],[8,24],[1,4]],[[6572,5425],[44,-32]],[[4088,1402],[18,2],[19,2],[18,2],[9,2],[11,2]],[[4183,1310],[1,-6],[4,-17],[4,-24],[-9,0],[-4,0],[-3,1],[-7,4],[-25,18],[-3,1],[-3,1],[-3,1],[-3,0],[-10,-2],[-18,-4],[-7,-1],[-5,-2],[-6,30],[-3,0],[-12,6],[-12,8],[-3,4],[-6,31],[-2,6],[1,4],[3,8],[7,10],[5,6],[3,3],[1,4],[4,-1],[9,2],[7,1]],[[6794,5764],[-10,7],[-16,11],[-15,10]],[[6715,5946],[13,12]],[[6728,5958],[31,-47]],[[6759,5911],[18,-28],[38,-60]],[[6759,5911],[13,12],[15,12]],[[6728,5958],[3,15],[1,6],[0,6],[14,14],[15,12]],[[6761,6011],[41,-63]],[[6761,6011],[13,12],[14,12]],[[6788,6035],[14,12]],[[6761,6011],[-41,64]],[[6720,6075],[14,11],[13,12]],[[6747,6098],[41,-63]],[[6747,6098],[15,12],[13,12],[14,14]],[[6789,6136],[10,-17],[10,-14],[9,-15],[12,-19]],[[6747,6098],[-17,28],[13,12],[-5,8],[-13,-11],[-18,27]],[[6707,6162],[14,12],[13,11]],[[6734,6185],[15,13]],[[6749,6198],[40,-62]],[[6720,6075],[-14,-13]],[[6706,6062],[-41,63]],[[6665,6125],[15,13],[13,12],[14,12]],[[6665,6125],[-40,64]],[[6625,6189],[15,12],[13,12],[13,12]],[[6666,6225],[41,-63]],[[6666,6225],[14,12]],[[6680,6237],[14,12]],[[6694,6249],[40,-64]],[[6694,6249],[14,12]],[[6708,6261],[16,15],[-13,21],[24,21],[3,2]],[[6738,6320],[14,-21],[24,-38]],[[6776,6261],[16,-26]],[[6792,6235],[-2,-2],[-25,-21],[-16,-14]],[[6680,6237],[-54,86]],[[6626,6323],[9,18]],[[6635,6341],[9,20]],[[6644,6361],[36,-56],[28,-44]],[[6644,6361],[4,7],[9,17],[10,23],[5,9],[2,5]],[[6674,6422],[26,-42]],[[6700,6380],[38,-60]],[[6635,6341],[-3,5],[-40,61]],[[6635,6480],[1,-2],[2,-3],[2,-3],[3,-3],[2,-3],[2,-4],[2,-3],[2,-3],[2,-3],[2,-3],[2,-3],[2,-4],[1,-2],[4,-6],[5,-4],[3,-5],[2,-4]],[[6607,6285],[-3,5],[-44,67]],[[6626,6323],[-10,-19],[-9,-19]],[[6587,6247],[-9,-20]],[[6578,6227],[-3,5],[-35,54]],[[6607,6285],[-9,-18],[-11,-20]],[[6625,6189],[-34,52],[-4,6]],[[6635,6101],[-66,106]],[[6569,6207],[9,20]],[[6665,6125],[-14,-13],[-7,-4],[-9,-7]],[[6608,6078],[-13,-12]],[[6595,6066],[-43,68],[-5,7]],[[6547,6141],[7,22],[8,23],[7,21]],[[6635,6101],[-12,-11],[-15,-12]],[[6547,6141],[-3,5],[-40,60],[-3,2]],[[6532,6080],[-3,5],[-40,62]],[[6547,6141],[-7,-31],[-8,-30]],[[6436,6017],[3,3],[0,21],[3,8],[3,12],[5,15],[0,3],[-16,42],[-11,-5],[-6,-1],[-2,0],[0,3],[0,3],[4,2],[3,1],[0,3],[1,1],[5,2],[0,3],[-2,1],[-1,0],[8,2],[3,-5],[6,-19],[5,-7],[4,-5],[3,-3],[2,3],[5,20],[1,1],[5,8],[1,5],[1,13],[3,17]],[[6489,6147],[-3,-14],[-1,-8],[0,-5],[1,-5],[1,-5],[2,-11],[2,-12]],[[6532,6080],[-13,-53]],[[7070,3733],[37,-28]],[[7035,3759],[6,11],[13,26]],[[7054,3796],[34,-27],[13,23],[37,-27]],[[7054,3796],[13,22],[3,6],[7,6],[8,4],[27,-21],[13,23]],[[7125,3836],[37,-27]],[[6988,3793],[6,13],[4,10],[16,40],[18,34],[1,2]],[[7033,3892],[2,-1],[3,-1],[2,0],[7,-2],[17,-9],[14,-7],[9,-7],[3,-3],[3,-2],[32,-24]],[[6403,5730],[-8,-18]],[[6395,5712],[-10,8],[-9,6],[-11,7],[-10,7]],[[6431,5791],[-10,-23],[-9,-20],[-9,-18]],[[6595,6066],[-17,-15],[-17,-15],[-9,-8]],[[6608,6078],[45,-70]],[[6653,6008],[-13,-12],[-14,-17],[-14,-18]],[[6667,6020],[-14,-12]],[[6706,6062],[-15,-13],[-8,-6],[-6,-5],[4,-6],[-14,-12]],[[6667,6020],[48,-74]],[[6733,6691],[-3,3],[-34,53],[-3,3],[-1,-26],[-1,-9],[-3,-13],[-6,-16],[1,-3],[0,-2],[-4,-11],[-3,-11],[-2,-2],[9,-14],[19,-30]],[[6702,6613],[-5,-8],[-17,-25]],[[6680,6580],[-4,-5],[-6,-8],[-3,-6],[-1,-3],[-2,-3],[-5,-10],[-3,-7],[-7,-18],[-6,-18],[-8,-21],[0,-1]],[[6618,6498],[1,2],[2,5],[4,11],[8,30],[9,23],[7,16],[3,9],[0,13],[2,8],[0,2],[2,8],[1,16],[3,9],[7,20],[4,15],[2,5],[4,7],[2,6],[4,9],[2,9],[2,15],[2,8],[1,10],[1,7],[4,10],[1,7],[7,20],[4,8],[7,24],[1,4]],[[6715,6834],[4,-9],[2,-4],[29,-45]],[[6750,6776],[-4,-31],[-1,-8],[-2,-14],[-2,-12],[-2,-7],[-6,-13]],[[6680,6580],[36,-55],[2,-5],[2,-8]],[[6720,6512],[-2,-3],[-11,-21]],[[6707,6488],[-8,-16],[-8,-16],[-8,-16],[-9,-18]],[[6733,6538],[-13,-26]],[[6702,6613],[8,14]],[[6710,6627],[9,-6],[2,-3],[25,-37],[4,-5],[-6,-14],[-11,-24]],[[6836,6486],[37,-55]],[[6873,6431],[-15,-14],[-23,-18],[-29,-21]],[[6806,6378],[-11,18],[-10,15],[-16,25]],[[6769,6436],[-45,71],[-4,5]],[[6733,6538],[16,20],[6,8],[4,4]],[[6759,6570],[26,-40],[17,-26],[20,-30],[14,12]],[[6769,6436],[-14,-8],[-5,-5]],[[6750,6423],[-43,65]],[[6750,6423],[-13,-10],[-11,-11],[-12,-10],[-14,-12]],[[6806,6378],[-19,-15],[-23,-20],[-12,-10],[-14,-13]],[[6806,6378],[38,-58]],[[6844,6320],[-19,-16],[-12,-11],[-12,-10],[-12,-9],[-13,-13]],[[6804,6217],[-12,18]],[[6844,6320],[38,-58]],[[6882,6262],[-19,-17]],[[6863,6245],[-12,-11],[-12,-10],[-10,16],[-11,-11],[-14,-12]],[[6908,6285],[-26,-23]],[[6844,6320],[27,22],[24,19]],[[6895,6361],[35,-56]],[[6930,6305],[-22,-20]],[[6919,6203],[-18,-18]],[[6901,6185],[-38,60]],[[6908,6285],[27,-43],[10,-15],[-26,-24]],[[6925,6028],[18,34],[-19,28],[-9,15]],[[6915,6105],[12,11],[11,10],[20,17],[-39,60]],[[6930,6305],[15,14],[16,13]],[[6961,6332],[14,11],[14,14],[14,13]],[[6915,6105],[-10,16],[-19,29],[-9,15],[12,10],[12,10]],[[6873,6108],[-12,20],[-10,15],[-18,29]],[[6833,6172],[-9,14],[-10,15],[-10,16]],[[6789,6136],[17,13],[24,20],[3,3]],[[7603,3852],[-6,4],[-6,5],[-1,4],[-9,7],[-9,6],[-8,6],[-9,7]],[[7555,3891],[-90,65]],[[7465,3956],[6,12],[7,13]],[[7454,3935],[11,21]],[[7555,3891],[-11,-23]],[[7544,3868],[-90,67]],[[7513,3814],[-20,15],[-11,2],[-22,17]],[[7460,3848],[10,21],[10,18],[-38,27]],[[7442,3914],[12,21]],[[7544,3868],[-12,-19]],[[7532,3849],[-10,-18],[-9,-17]],[[7460,3848],[-38,27]],[[7377,3964],[65,-50]],[[7388,3983],[66,-48]],[[7388,3983],[11,22]],[[7399,4005],[66,-49]],[[7412,4029],[66,-48]],[[7424,4053],[6,-5],[48,-35],[13,-9]],[[7435,4072],[65,-50]],[[4312,1239],[-1,0],[-57,11],[-13,1],[-5,-6],[-13,-39],[-2,-7],[-1,-2],[-3,4],[-3,14],[-2,5],[-10,14],[-6,5],[-23,18],[-7,8],[-5,3],[-6,8],[-8,4],[-5,0],[-4,4],[-3,0],[-3,-2],[-3,-2],[-8,0],[-2,-1],[-7,-1],[-5,-2],[-5,-4],[-4,0],[-7,0],[-6,-2],[-5,-3],[-2,-3],[2,-7],[0,-2],[-3,-3],[-11,-5],[-10,-8],[-3,-5],[-7,1],[-8,-1],[-2,0],[-4,3],[0,6],[0,27],[-3,13],[-2,21],[-1,5],[-4,23],[-3,9],[-5,14],[-1,0],[-14,19],[-1,1],[-23,27],[-9,7],[-7,10],[-7,12],[-2,0]],[[3948,1440],[2,-3],[4,-4],[21,-20],[8,-7],[6,-7],[7,-9],[14,-15],[2,2],[2,3],[2,3],[1,2],[2,5],[2,6],[-1,3],[2,4],[3,5],[3,5],[4,4],[5,4],[2,2],[-1,5],[-3,10],[0,9],[2,11],[3,8],[4,5],[6,8],[1,1],[1,3]],[[4052,1483],[2,1],[17,6],[17,-88]],[[4052,1483],[-4,3],[-6,1],[-9,5],[-8,6],[-5,3],[-8,45],[1,4],[-2,2],[-18,1],[-6,2],[-10,0],[-24,1],[-7,-2],[-1,0],[-1,0],[-21,-4]],[[3923,1550],[-2,6],[-5,-1],[0,1],[3,4],[0,1],[1,2],[1,2]],[[3921,1565],[0,2],[0,3],[0,4],[0,2],[-1,3],[-1,3],[-1,2]],[[3948,1440],[-25,110]],[[3729,1529],[-4,21],[-26,1],[0,4],[0,4],[19,3],[2,0],[14,2],[7,1],[14,2],[16,1],[11,0],[10,1],[15,0],[11,0],[25,-1],[19,-1],[22,0],[21,-1],[16,-1]],[[3621,1569],[-26,106]],[[3595,1675],[17,7],[6,2],[35,32],[11,3],[19,6]],[[3683,1725],[14,6],[7,5]],[[3469,1599],[23,8],[8,2],[9,8],[18,16],[18,16],[18,16]],[[3563,1665],[5,2],[27,8]],[[3422,1793],[20,17]],[[3442,1810],[6,-24],[16,6],[21,18],[12,10],[3,1],[2,-1],[2,-1],[7,-29],[17,6],[3,3],[32,-134]],[[3627,1871],[19,-76],[19,6]],[[3665,1801],[18,-76]],[[3442,1810],[21,18],[32,27],[24,20],[24,20]],[[3543,1895],[15,-61],[37,13],[4,3],[9,14],[19,7]],[[3342,1727],[-17,28],[-17,29],[29,25],[-14,26],[-12,19]],[[3311,1854],[17,14],[10,-18],[3,0],[16,12],[46,38],[14,12],[1,4],[-11,18],[17,14]],[[3424,1948],[11,-18],[2,0],[16,13],[16,14],[17,14],[7,6],[10,9],[17,14],[17,13]],[[3537,2013],[16,-26],[37,-59]],[[3590,1928],[-26,-22],[-6,-3],[-9,-4],[-6,-4]],[[3627,1871],[-7,29],[0,3],[2,2],[5,1],[13,3],[9,4],[2,2],[3,3],[1,4],[5,1],[0,3],[0,5],[1,4],[3,4],[5,3],[10,2],[2,-7]],[[3681,1937],[23,-101]],[[3704,1836],[-18,-23],[-6,-6],[-15,-6]],[[3703,1998],[-22,-18],[-5,-2],[-16,-5],[-14,-4],[-10,-3],[-12,-5],[-2,-2],[-6,-5],[-6,-5],[-5,-6],[-4,-6],[-11,-9]],[[3537,2013],[-33,54],[-5,8]],[[3499,2075],[3,2],[14,12],[20,-33],[2,0],[14,12],[13,10],[1,2],[0,3],[-19,31],[16,13]],[[3499,2075],[-23,38]],[[3476,2113],[-8,15],[-6,14]],[[6656,4951],[63,-30]],[[6488,5030],[9,25],[21,60],[3,7],[16,43]],[[6961,6332],[-36,56]],[[6925,6388],[14,12],[15,13],[14,13]],[[6925,6388],[-37,56]],[[6888,6444],[15,13],[14,12],[15,13]],[[6932,6482],[36,-56]],[[6932,6482],[15,13],[17,14],[16,14],[9,9],[14,12]],[[7003,6544],[36,-56]],[[7033,3892],[1,3]],[[7034,3895],[1,1],[76,130]],[[7111,4026],[9,14]],[[7173,3925],[-12,-22],[-13,-23]],[[7148,3880],[-11,-22],[-12,-22]],[[7148,3880],[37,-27]],[[7185,3853],[-11,-21],[-12,-23]],[[7209,3897],[-12,-22],[-12,-22]],[[7209,3897],[57,-43]],[[7295,3910],[-17,-32],[-12,-24]],[[6932,6482],[-36,56]],[[6896,6538],[16,14],[16,14],[15,13]],[[6943,6579],[11,9],[6,7],[7,6]],[[6967,6601],[36,-57]],[[6967,6601],[14,12]],[[6981,6613],[15,13],[14,12],[14,13]],[[7024,6651],[37,-57]],[[7061,6594],[-15,-13],[-14,-12],[-14,-13],[-15,-12]],[[6943,6579],[-35,57]],[[6908,6636],[10,9],[13,12],[-7,11]],[[6924,6668],[17,9]],[[6941,6677],[40,-64]],[[6941,6677],[15,9],[17,9],[17,9]],[[6990,6704],[12,-18],[10,-16]],[[7012,6670],[12,-19]],[[6990,6704],[27,16],[21,11],[2,1]],[[7040,6732],[12,7]],[[7052,6739],[13,-22]],[[7065,6717],[-29,-26],[-24,-21]],[[7114,6640],[-28,-25],[-25,-21]],[[7065,6717],[13,-20]],[[7078,6697],[-14,-13],[20,-33],[3,-1],[13,12],[14,-22]],[[7162,6681],[-48,-41]],[[7078,6697],[20,15],[16,11],[18,-30],[4,-1],[12,11],[14,-22]],[[7180,6696],[-2,-2],[-5,-4],[-11,-9]],[[7052,6739],[44,25],[27,15],[3,1]],[[7126,6780],[7,-11],[14,-22],[33,-51]],[[7040,6732],[-1,4],[-9,20],[-2,4],[38,32]],[[7066,6792],[4,-6],[1,-1],[9,0],[2,1],[8,7],[15,13],[2,2]],[[7107,6808],[16,-24],[3,-4]],[[7066,6792],[-12,19]],[[7054,6811],[-11,18],[15,13],[-6,9]],[[7052,6851],[16,14],[2,2]],[[7070,6867],[37,-59]],[[7133,6876],[11,-18],[14,-21]],[[7158,6837],[16,-26],[2,-3]],[[7176,6808],[-23,-13],[-16,-9],[-11,-6]],[[7070,6867],[-16,25]],[[7054,6892],[15,13]],[[7069,6905],[12,-18],[12,-18],[11,-18],[29,25]],[[7069,6905],[-11,18],[28,25]],[[7086,6948],[9,-14],[3,-4]],[[7098,6930],[11,-18],[12,-18]],[[7121,6894],[12,-18]],[[7121,6894],[15,13],[13,11]],[[7149,6918],[41,-63]],[[7190,6855],[-16,-9],[-16,-9]],[[7098,6930],[15,12],[14,13]],[[7127,6955],[14,12],[23,-36],[-15,-13]],[[7220,6935],[11,-17]],[[7231,6918],[11,-17],[10,-15]],[[7252,6886],[-44,-22],[-18,-9]],[[7127,6955],[-37,56]],[[7090,7011],[14,13],[25,20]],[[7129,7044],[55,-86],[22,-34],[14,11]],[[7129,7044],[13,11]],[[7142,7055],[12,-18],[11,-17]],[[7165,7020],[10,-16],[11,-17]],[[7186,6987],[11,-17]],[[7197,6970],[12,-18]],[[7209,6952],[11,-17]],[[7247,7038],[-61,-51]],[[7165,7020],[34,30],[13,12]],[[7212,7062],[12,11],[12,-18],[11,-17]],[[7247,7038],[22,20],[2,2]],[[7271,7060],[11,-17]],[[7282,7043],[-2,-2],[-83,-71]],[[7287,6993],[-9,16],[-1,0],[-1,1],[-1,0],[-1,-1],[-65,-57]],[[7282,7043],[22,-34]],[[7304,7009],[-2,-3],[-15,-13]],[[7254,6938],[-23,-20]],[[7287,6993],[-14,-11],[-15,-13],[-15,-13],[11,-18]],[[7278,6900],[-2,3],[-11,17],[-11,18]],[[7287,6993],[41,-62],[-1,-4],[-15,-7],[-17,-9],[-17,-11]],[[7304,7009],[47,-72]],[[7351,6937],[13,-21],[3,-4]],[[7367,6912],[-4,-1],[-4,-2],[-29,-16],[-37,-20],[-2,4],[-12,21],[-1,2]],[[7304,7009],[16,13],[46,-72],[-15,-13]],[[7749,3826],[-13,-26]],[[7736,3800],[-12,9],[-19,14],[-22,15],[-9,8]],[[7688,3870],[9,-7],[41,-29],[11,-8]],[[7726,3783],[-8,7],[-17,12],[-8,-1],[-31,22]],[[7700,3892],[9,-7],[41,-29],[11,-9]],[[7761,3847],[-12,-21]],[[7713,3916],[9,-7],[41,-30],[10,-8]],[[7773,3871],[-10,-18],[-2,-6]],[[7735,3956],[19,-15],[31,-23],[9,-7]],[[7794,3911],[-1,-3],[-8,-15],[-12,-22]],[[7804,3927],[-10,-16]],[[7754,3989],[49,-37]],[[7803,3952],[-9,-17],[10,-8]],[[7773,4024],[30,-23],[19,-15],[-9,-17],[-5,-8],[-5,-9]],[[7805,4083],[22,-17]],[[7864,4039],[-6,-12],[-5,-8],[-8,-16]],[[7845,4003],[-8,-15],[-5,-9],[-3,-6],[-7,-11],[-2,-4]],[[7820,3958],[-7,-14],[-1,-2],[-4,-7],[-4,-8]],[[7989,7819],[7,9],[8,7],[-25,39]],[[7979,7874],[12,16],[13,18],[-12,20],[-2,2]],[[7990,7930],[34,44]],[[8024,7974],[2,-3],[13,-19],[-5,-8],[9,-15],[0,-5],[-2,-5],[-8,-8],[-1,-2],[1,-4],[20,-29]],[[8053,7876],[-18,-15],[7,-11],[-16,-14],[22,-35],[0,-2],[0,-1],[-11,-15],[-13,-15],[-9,14],[-20,-24],[-2,-1],[-2,2],[-9,14],[0,2],[1,3],[19,24],[-6,10],[-7,7]],[[8024,7974],[33,41],[2,3]],[[8059,8018],[2,-3],[9,-14],[4,-6],[5,-8],[10,-19],[9,-19],[2,-3]],[[8100,7946],[-3,-3],[2,-3],[9,-15],[-18,-15],[-16,-15],[-21,-19]],[[7990,7930],[-13,20],[-24,38]],[[7953,7988],[-20,32]],[[7933,8020],[15,12],[12,11],[13,11],[14,12],[23,20],[3,3]],[[8013,8089],[2,-3],[10,-16],[8,-12],[12,-19],[9,-14],[5,-7]],[[7990,7930],[-73,-91]],[[7870,7913],[19,16],[11,15],[6,5],[17,13],[14,13],[16,13]],[[7816,7998],[20,16],[24,22],[9,11],[12,17],[13,18]],[[7894,8082],[39,-62]],[[7803,8020],[17,15],[17,15],[7,7],[7,7],[5,7],[11,15]],[[7867,8086],[12,18]],[[7879,8104],[15,-22]],[[7879,8104],[22,31],[10,14],[12,17],[17,24],[2,3],[2,3]],[[7944,8196],[19,-29],[3,-6],[11,-17],[10,-15],[4,-7],[13,-20],[9,-13]],[[7879,8104],[-2,4],[-3,5],[-13,20]],[[7861,8133],[11,10],[4,5],[5,6],[1,4],[-10,15],[-2,3],[-1,2],[-11,17],[5,3],[11,10],[13,12],[-47,75]],[[7840,8295],[22,27]],[[7862,8322],[11,-18],[3,-4],[10,-16],[3,-4],[11,-16],[2,-5],[11,-17],[8,-9],[19,-30],[2,-4],[2,-3]],[[7861,8133],[-29,45],[-12,20],[-1,1],[-16,26],[-14,20]],[[7789,8245],[24,24],[14,11],[13,15]],[[7867,8086],[-3,3],[-8,12],[-14,-12],[-15,-12],[-14,22],[-11,18],[-13,21]],[[7789,8138],[5,8],[7,7],[15,12],[-22,34],[-20,31]],[[7774,8230],[15,15]],[[7719,8067],[-12,19],[-18,28],[14,14],[-14,20],[9,10],[11,10],[25,19],[7,7],[5,5],[15,16],[13,15]],[[7789,8138],[-11,-15],[-6,-9],[-7,-8],[-15,-12],[-15,-13],[-16,-14]],[[1401,355],[2,-11],[4,-16],[-6,-3],[-5,-3],[-5,-2],[-8,-4],[-15,-7],[-6,-2],[-9,-4],[-11,-7],[-4,-3],[-7,-4],[-4,-2],[-8,-5],[-10,-5],[-6,-4],[-7,-6],[-4,-2],[-6,-5],[-4,-4],[-6,-3],[-10,-5],[-13,-7],[-2,-2],[-35,-25],[-2,2],[1,10],[-2,22],[-2,34]],[[1211,282],[-7,103],[-3,32],[36,4],[9,2],[3,1],[3,2],[2,1],[2,3],[4,8],[3,7],[3,3],[9,5]],[[1376,513],[6,-34],[1,-20],[1,-10],[1,-7],[1,-8],[2,-7],[3,-12],[7,3],[3,2],[-2,-18],[-2,-16],[0,-6],[3,-18],[1,-7]],[[7664,7713],[-3,-3],[-17,-14]],[[7644,7696],[-35,54],[-8,13],[-2,2],[-2,-1],[-26,-23],[-13,-11],[-1,-4],[0,-3],[7,-11],[-16,-14]],[[7548,7698],[-22,34],[21,18],[1,2],[2,1],[18,16],[2,3],[-1,3],[-18,29],[-3,4],[-16,-14]],[[7577,7652],[-29,46]],[[7644,7696],[-15,-14]],[[7629,7682],[-13,-11],[-6,-3],[-14,-7],[-19,-9]],[[7560,7638],[13,11],[4,3]],[[7629,7682],[12,-18],[13,-22],[10,-14],[1,-4],[-2,-2],[-26,-25]],[[7637,7597],[-16,-14],[-16,-14],[-45,69]],[[7650,7576],[-13,21]],[[7664,7713],[35,-54]],[[7699,7659],[-4,-3],[-16,-14],[12,-19],[-22,-26],[-19,-21]],[[7765,7647],[-32,-41]],[[7733,7606],[-34,53]],[[7679,7533],[-2,2],[-14,22],[-13,19]],[[7733,7606],[1,-3]],[[7734,7603],[-2,-3],[-16,-20],[-9,-11]],[[7707,7569],[-26,-33],[-2,-3]],[[7713,8005],[-20,31],[0,6],[4,5],[22,20]],[[7540,8005],[7,8],[2,2],[11,13],[10,10],[22,24],[2,2],[2,3],[4,5],[13,13],[1,10],[5,8],[11,4],[5,0],[6,6],[2,5],[8,9],[15,21],[3,3],[2,6],[7,9],[9,1],[15,20],[19,27],[3,2],[2,2],[4,5],[4,9],[5,3],[6,3],[21,22],[7,8],[28,24],[15,11],[8,7],[10,8],[4,4],[6,7],[4,6]],[[6790,4231],[-7,-19],[-6,-17]],[[6777,4195],[-8,4],[-44,22],[-9,4]],[[6716,4225],[6,17]],[[6722,4242],[6,16],[27,-12],[8,-1],[19,-10],[8,-4]],[[6777,4195],[-5,-15]],[[6772,4180],[-53,25],[-8,5]],[[6711,4210],[5,15]],[[6766,4164],[-7,3],[-45,22],[-9,4]],[[6705,4193],[6,17]],[[6772,4180],[-6,-16]],[[6711,4210],[-62,29]],[[6649,4239],[5,15]],[[6654,4254],[7,17]],[[6661,4271],[61,-29]],[[6649,4239],[-58,28],[5,16]],[[6596,4283],[58,-29]],[[6594,4303],[58,-28],[9,-4]],[[6596,4283],[-8,4],[4,12],[2,4]],[[6666,4288],[-5,-17]],[[6594,4303],[-9,5],[-3,1],[-5,3],[-2,-3],[-2,-6],[-2,-6],[-1,-3],[-1,-5],[1,-4],[1,-5],[6,-18],[0,-4]],[[6577,4258],[-2,-3],[-2,-5],[-4,-1],[-4,-1],[-4,-3],[-5,-1],[-4,-2],[-1,0],[-1,0],[-3,0],[-3,1],[-1,1]],[[6592,4365],[2,-1],[3,-1]],[[6597,4363],[-3,-8]],[[6594,4355],[-2,-3],[-3,-5],[-7,-18],[6,-3],[78,-38]],[[6649,4239],[-6,-16]],[[6643,4223],[-56,26],[-4,3],[-4,3],[-2,3]],[[6705,4193],[-14,7],[-48,23]],[[6766,4164],[10,-5],[53,-26]],[[6829,4133],[62,-30]],[[6891,4103],[-1,-4],[-43,21],[-1,-4]],[[6846,4116],[-20,10],[-20,9]],[[6806,4135],[-19,9],[-20,10],[-20,9]],[[6747,4163],[-20,10],[-19,10],[-20,9],[-18,-50],[-7,-23],[-14,-39]],[[6649,4080],[-19,9],[-19,9],[-18,9],[-19,8],[-40,20]],[[6626,4014],[5,17],[17,46],[1,3]],[[6747,4163],[-17,-50],[-5,-13],[-17,-48],[-1,-3],[-18,-51],[-5,-13]],[[6684,3985],[-7,2],[-15,4],[-10,4],[-10,6],[-5,2],[-2,2],[-3,3],[-4,3],[-1,2],[-1,1]],[[6744,3958],[-11,5],[-8,5],[-3,2],[-13,10],[-2,2],[-1,2],[-22,1]],[[6806,4135],[-16,-46],[-15,-40],[-9,-25],[-1,-3],[-17,-51],[-4,-12]],[[8952,8419],[-76,-62],[-71,-58],[-6,-5],[-3,-1],[-10,-8],[-17,-14],[-32,-26],[-17,-15],[-15,-12],[-54,-36],[-25,-19],[-11,-9]],[[8615,8154],[-28,-23],[-9,-8],[-8,-9],[-11,-11],[-6,-7],[-7,-6],[-69,-57],[-3,-2],[-3,-3],[-18,-17],[-8,-7],[-2,-2]],[[8443,8002],[-1,2],[-1,1],[-8,13],[-34,54],[-31,51],[-18,27]],[[8350,8150],[-26,40],[-6,10],[-23,37],[-3,4]],[[8292,8241],[2,1],[4,3],[6,2],[4,2],[2,2],[15,12],[18,16],[13,11]],[[8356,8290],[14,17],[18,16],[21,16],[22,14]],[[8431,8353],[23,11],[8,6],[10,6],[35,23],[51,26],[22,15],[-7,14],[-2,5],[-3,5],[-6,9],[-1,1],[-4,7],[-5,5],[-8,7],[-3,2],[-8,4],[-10,5],[-2,1],[-1,0],[-8,3],[-12,4],[-2,1],[-11,4],[-6,2]],[[8481,8519],[-12,6],[-9,8],[-9,12],[-6,10],[-5,13]],[[8440,8568],[19,10],[18,10],[15,9],[15,8],[1,2],[0,3],[-24,57],[-1,1],[-3,0],[-14,-8],[-34,-19],[-18,-11]],[[8414,8630],[-12,29]],[[8402,8659],[3,3],[29,40],[20,26],[11,15],[3,3]],[[8468,8746],[20,-18],[-11,-16],[0,-2],[1,-2],[8,-7],[11,-15],[4,-5],[4,-9]],[[8505,8672],[22,-54],[16,-39],[2,-4],[4,-7],[6,-6]],[[8555,8562],[-12,-15],[-9,-12],[16,-13],[11,-2],[24,-2],[1,-9],[22,-53],[35,29],[41,38],[2,2]],[[8686,8525],[69,70],[7,7],[1,4],[5,7],[27,27]],[[8795,8640],[16,16],[20,20],[2,2]],[[8833,8678],[2,-3],[13,-29],[32,-70],[0,-4],[67,-144],[3,-6],[2,-3]],[[8431,8353],[0,5],[-2,6],[-40,93],[-36,88]],[[8353,8545],[20,11]],[[8373,8556],[37,-87],[19,11],[-7,18],[-1,3],[2,2],[19,11],[4,1],[2,-1],[7,-6],[5,-11],[16,10],[2,2],[3,10]],[[8373,8556],[20,11],[-11,27],[-1,2],[2,3],[13,15],[11,12],[7,4]],[[8414,8630],[26,-62]],[[8353,8545],[-6,13],[-8,20],[-3,7]],[[8336,8585],[-2,3],[-12,28],[-1,5],[1,3],[1,4],[2,4],[13,8],[-5,12],[-3,5],[-11,24],[-4,8]],[[8315,8689],[29,24],[26,25],[17,18],[21,21],[11,-26],[7,-15],[-15,-20],[-20,-28],[0,-1],[10,-24],[1,-4]],[[8094,8578],[17,5],[10,1],[25,3],[10,0],[20,7],[11,2],[1,1],[6,3],[7,7],[8,10],[3,1],[8,5],[10,3],[19,16],[1,4],[5,3],[4,6],[3,3],[5,3],[6,3],[5,3],[6,8],[8,12],[5,1],[8,6]],[[8305,8694],[4,5],[6,-10]],[[8336,8585],[-3,-2],[-7,-6],[-75,-65],[-13,-10]],[[7915,5295],[-11,6],[-53,27],[-2,1],[-10,5]],[[7839,5334],[12,23],[2,3]],[[7853,5360],[76,-39]],[[2762,2202],[-32,16]],[[2489,2977],[-10,27],[-10,32]],[[2469,3036],[9,14],[12,20],[7,16],[4,7]],[[2501,3093],[11,22],[8,15],[3,5],[3,5],[13,19],[3,4],[5,8],[4,8]],[[2501,3093],[-2,4],[-14,36],[-21,59],[-28,54]],[[2436,3246],[25,12],[8,5],[5,5],[5,9],[3,0],[2,-1],[13,-26],[12,17],[12,-26],[27,20]],[[2436,3246],[-25,51],[-1,4],[2,35],[1,23],[3,64],[0,23],[3,8]],[[2469,3036],[-3,-3],[-17,45]],[[2449,3078],[1,3],[6,11],[3,10],[2,10],[-2,10],[-1,1],[-1,5],[-3,6],[-2,3],[-1,7],[-2,4],[-4,8],[-3,4],[-2,2],[-4,4],[-1,3],[-1,0],[-1,11],[-2,16],[0,5],[-2,0],[-1,3],[-1,9],[0,3],[-3,4],[-4,4],[-3,5],[-6,7],[-3,0],[-2,1],[-14,-1],[-12,-2],[-7,-2],[-2,-2],[-4,0],[-5,0],[-7,9],[-4,9],[0,3],[-4,6],[-4,12],[-1,10],[1,9],[2,2],[6,7],[7,11],[2,3],[3,3],[1,0],[-2,7],[0,6],[0,8],[0,2],[8,13],[3,9],[5,11],[6,14],[0,8],[-1,12],[-2,12],[-1,8],[4,6],[6,4],[2,5],[2,5],[6,16],[6,19],[1,10],[1,7],[8,5],[13,7]],[[2385,3434],[-2,-1],[-1,1],[-1,3],[0,2],[0,3],[-4,5],[-3,2],[-7,8],[0,3],[-5,6],[-3,6],[-1,6],[3,2],[12,11],[16,13],[8,5],[5,3],[3,1],[3,-1],[1,-2],[0,-3],[-1,-3],[-2,-5],[-1,-6],[-1,-8],[1,-3],[-2,-8],[-2,-2],[-3,-7],[-3,-7],[-2,-7],[0,-3],[-5,-12],[-3,-2]],[[6896,6538],[-37,56]],[[6859,6594],[16,14],[16,13],[17,15]],[[6859,6594],[-18,27]],[[6841,6621],[19,11],[19,10],[18,10]],[[6897,6652],[11,7],[16,9]],[[6888,6444],[-15,-13]],[[6836,6486],[16,14]],[[6852,6500],[15,13],[14,13],[15,12]],[[6925,6388],[-16,-14],[-14,-13]],[[6842,6934],[-29,47],[-15,24],[-3,-9],[-4,-15]],[[6791,6981],[-10,9]],[[6781,6990],[28,110],[36,85],[1,13],[7,11]],[[6853,7209],[8,-17]],[[6861,7192],[-3,-5],[-5,-9],[-22,-52],[-1,-5],[-3,-7],[-1,-4],[7,-4],[19,-29],[11,-18]],[[6863,7059],[-6,-5],[-4,-16],[-7,-24],[-9,-33],[16,-25],[-5,-16],[-6,-6]],[[6863,7059],[17,-26],[5,0],[16,-21],[3,-3]],[[6904,7009],[-20,-57]],[[6884,6952],[-1,-2],[-17,-51]],[[6866,6899],[-3,3],[-5,9],[-16,23]],[[6960,7041],[-3,-3],[-15,-13],[-21,33],[-17,-49]],[[6861,7192],[7,-12],[12,-20],[39,-59],[9,-14],[2,-3]],[[6930,7084],[5,-6],[25,-37]],[[6983,7161],[-14,-29],[-11,16],[-3,4],[-15,-40],[-10,-28]],[[6861,7192],[18,32],[3,6],[4,6],[15,24],[1,2],[2,3],[17,21]],[[6921,7286],[6,-10],[2,-2],[7,-5],[27,-42],[-10,-20],[13,-20],[2,-4]],[[6968,7183],[15,-22]],[[6921,7286],[7,9],[8,11],[3,4],[3,3],[3,3],[6,6],[10,7]],[[6961,7329],[11,-17],[7,-2],[4,-7],[15,-24],[13,-20],[2,-3]],[[7013,7256],[-2,-3],[-7,-9],[-9,-14],[-13,-22],[-14,-25]],[[6961,7329],[10,8],[11,8],[4,3],[5,5],[4,3],[9,11],[11,12],[13,18]],[[7028,7397],[23,-35],[-36,-32],[23,-37],[2,-3]],[[7040,7290],[-13,-15],[-12,-15],[-2,-4]],[[7028,7397],[14,16],[2,3]],[[7062,7388],[28,-45],[2,-3]],[[7092,7340],[-2,-2],[-18,-15],[-10,-9],[-10,-11],[-12,-13]],[[7028,7233],[-15,23]],[[7092,7340],[14,-22]],[[7106,7318],[-2,-2],[-21,-18],[-15,-15],[-17,-21],[-23,-29]],[[7039,7215],[-11,18]],[[7106,7318],[12,-18]],[[7118,7300],[-2,-2],[-23,-19]],[[7093,7279],[-15,-16]],[[7078,7263],[-13,-15]],[[7065,7248],[-11,-14],[-15,-19]],[[7184,7234],[-15,-13]],[[7169,7221],[-12,17]],[[7157,7238],[-39,62]],[[7106,7318],[16,14],[62,-98]],[[7267,7329],[-58,-61],[-25,-34]],[[6853,7209],[6,10],[38,53],[5,10],[7,9],[4,6],[9,13],[22,28],[23,24],[4,6],[12,13],[17,24],[13,14],[18,24],[14,13],[5,6],[25,33],[20,29],[14,27]],[[7109,7551],[2,-5],[17,-27]],[[7350,7713],[-11,18],[-14,-13],[-6,-7],[-2,-2],[-7,-9],[-13,-18],[-8,-8],[-13,-12],[-15,-14],[-9,-8]],[[7252,7640],[-14,-13],[-1,0],[-3,-3],[-5,-4],[-4,-3],[-8,-7],[-14,-9],[-9,-9],[-30,-33]],[[7164,7559],[-32,-36],[-4,-4]],[[7109,7551],[1,3],[8,11],[1,4],[0,5],[3,4],[6,5],[4,3],[2,4],[6,12],[3,3],[17,7],[5,3],[10,-2],[14,3],[35,24],[3,3],[7,4],[3,6],[4,3],[11,8],[10,8],[8,7],[10,4],[6,7],[11,12],[8,13],[0,5],[-5,7],[0,3],[2,3],[3,0],[7,-6],[13,11],[3,7],[3,4],[9,11],[18,18],[16,20],[5,4],[6,4],[5,5]],[[7300,7735],[-4,-4],[-4,2],[-7,-9],[-4,-3],[-4,-1],[-18,-4],[-8,-1],[-5,1],[-3,3],[-2,3],[-2,7],[-1,7],[1,5],[12,16],[12,15],[8,9],[30,22],[5,3],[11,4],[2,2],[7,3],[22,8],[3,-1],[2,-4],[-1,-4],[-7,-12],[-10,-13],[-10,-11],[-11,-17],[-6,-6],[-5,-5],[-3,-5],[-1,-4],[1,-6]],[[7204,7708],[-2,0],[-3,3],[-4,14],[1,12],[-6,5],[-1,11],[11,23],[9,8],[18,9],[25,30],[14,13],[10,5],[3,-3],[1,-8],[-3,-10],[-6,-8],[-16,-21],[-9,-10],[-6,-8],[-6,-6],[-5,-7],[0,-6],[-6,-16],[-4,-11],[-2,-11],[-9,-8],[-4,0]],[[7526,5104],[-47,35]],[[7479,5139],[4,8],[1,1],[3,7],[3,5],[2,3],[4,7]],[[7532,5214],[24,-18]],[[7556,5196],[-2,-3],[-9,-18],[-4,-15],[1,-9],[-6,-24],[-6,-13],[-4,-10]],[[7479,5139],[-47,32]],[[7432,5171],[-11,8]],[[7446,5078],[-8,5],[-30,23],[-8,5],[10,19],[11,20],[11,21]],[[7479,5139],[-12,-22],[-11,-20],[-10,-19]],[[7446,5078],[-11,-22]],[[7435,5056],[-9,6],[-29,22],[-8,6]],[[7461,4983],[-10,7],[-28,21],[-9,6],[11,20],[-9,6],[-29,21],[-9,7]],[[7435,5056],[8,-6],[30,-21],[9,-7]],[[7482,5022],[-11,-20],[-10,-19]],[[7432,4928],[-9,7],[-31,22],[-8,6],[-8,7],[-29,21],[-8,6]],[[7461,4983],[-11,-20],[-9,-17],[-9,-18]],[[7432,4928],[-10,-17]],[[7422,4911],[-8,6],[-31,23],[-8,6],[-9,6],[-13,9]],[[7743,7476],[-36,56],[13,17],[-13,20]],[[7734,7603],[26,-40],[10,-14],[15,-20],[2,-2]],[[7787,7527],[-3,-3],[-2,-3],[-13,-14],[-13,-16],[-13,-15]],[[7658,7506],[2,3],[17,21],[2,3]],[[7743,7476],[-12,-15],[-13,-15],[-13,-15],[-20,33],[-15,23],[-12,19]],[[7743,7476],[14,-22],[-14,-12],[13,-21],[-12,-15],[-13,-16],[-13,-17],[-17,-16],[-26,42],[-16,-13],[-24,36],[-24,36]],[[7611,7458],[16,13],[7,8],[2,2],[2,2],[10,11],[8,10],[2,2]],[[7493,7356],[25,22],[27,22]],[[7545,7400],[30,27],[36,31]],[[7787,7527],[2,-2],[41,-49],[2,-2],[12,-15],[24,-29],[23,-28],[1,-1],[1,-2]],[[7893,7399],[-3,-3],[-50,-58],[-51,-57],[-31,-36],[-38,-43],[-39,-44],[-36,-40]],[[7493,7356],[-2,2],[-36,57]],[[7455,7415],[7,6],[18,14],[16,12]],[[7496,7447],[16,15],[5,-9],[4,-13],[4,-9],[18,-28],[2,-3]],[[7489,7566],[52,-81],[43,36]],[[7584,7521],[3,-6],[4,-9],[1,-9],[0,-4],[1,-5],[3,-5],[13,-22],[2,-3]],[[7496,7447],[-55,85]],[[7441,7532],[17,15]],[[7458,7547],[8,7],[7,4],[8,4],[5,2],[2,1],[1,1]],[[7489,7566],[6,6],[7,14],[5,7],[20,17]],[[7527,7610],[13,-21],[31,-48],[13,-20]],[[7527,7610],[17,14],[16,14]],[[7455,7415],[-50,78]],[[7405,7493],[-50,77]],[[7355,7570],[6,6],[8,9],[21,-34],[23,19],[2,1],[2,-1],[10,-16],[3,-4],[11,-18]],[[7377,7469],[16,13],[12,11]],[[7164,7559],[14,-23],[18,-29],[3,-3],[11,-18],[11,-19],[2,-4]],[[7204,4330],[-10,-18],[-8,6],[-44,32],[-7,6]],[[7135,4356],[10,18],[6,10],[5,9],[1,1],[1,2]],[[7158,4396],[4,-4],[4,-6],[6,-4],[13,-10],[13,-9],[10,-8],[7,-5]],[[7215,4350],[-5,-10],[-6,-10]],[[7204,4330],[7,-6],[1,-1],[7,-5],[-5,-11],[-5,-10],[25,-18],[9,-6]],[[7243,4273],[-10,-18],[-5,-9],[-3,-5]],[[7225,4241],[-91,23]],[[7134,4264],[-2,1],[-39,11]],[[7093,4276],[11,21],[1,4],[10,18],[10,19],[10,18]],[[7091,4486],[9,-4],[9,-5],[9,-4],[10,-5],[8,-4],[8,-4],[2,-2]],[[7146,4458],[-1,-3],[-8,-15],[9,-8],[22,-16],[7,-5]],[[7175,4411],[-9,-8],[-8,-5],[0,-2]],[[7093,4276],[-2,0],[-68,18]],[[7069,4228],[-38,18],[-6,-19]],[[7025,4227],[-67,33],[-10,4]],[[7093,4276],[-7,-11],[-10,-22],[-1,-3],[0,-2],[-3,-2],[-3,-8]],[[7062,4209],[-7,-20]],[[7055,4189],[-30,15],[-8,3]],[[7017,4207],[8,20]],[[7069,4228],[-5,-13],[1,-2],[-1,-3],[-2,-1]],[[7049,4170],[-7,-18]],[[7042,4152],[-16,7],[-8,4],[-5,2],[-9,5]],[[7004,4170],[6,18]],[[7010,4188],[7,19]],[[7055,4189],[-6,-19]],[[7029,4115],[-6,-17]],[[7023,4098],[-10,4],[-19,9],[-9,5]],[[6985,4116],[7,18]],[[6992,4134],[6,18]],[[6998,4152],[6,18]],[[7042,4152],[-6,-19]],[[7036,4133],[-7,-18]],[[7112,4117],[-9,-16]],[[7103,4101],[-9,4],[-50,24],[-8,4]],[[7042,4152],[8,-4],[52,-26],[2,0],[8,-5]],[[7103,4101],[-10,-17]],[[7093,4084],[-9,5],[-47,22],[-8,4]],[[7093,4084],[-9,-16]],[[7084,4068],[-9,4],[-44,22],[-8,4]],[[7084,4068],[-8,-16],[-51,24],[-8,4]],[[7017,4080],[6,18]],[[7111,4026],[-30,17],[-13,-24],[-9,4],[-12,6],[-5,2],[-11,5],[-18,8],[-3,2],[-4,2]],[[7006,4048],[5,17],[6,15]],[[7112,4117],[39,-18]],[[7006,4048],[-8,4],[-31,15]],[[6967,4067],[6,16],[6,15]],[[6979,4098],[6,18]],[[9369,8355],[0,8],[-4,16],[1,11],[7,31],[4,18],[2,4],[5,11],[2,10],[4,21]],[[9390,8485],[66,-17]],[[9438,8382],[-18,4],[-1,-18],[3,-20],[-6,-3],[-3,-1],[-5,1],[-39,10]],[[9308,8311],[7,34],[5,27],[6,28],[5,24],[5,21],[6,30],[4,21]],[[9346,8496],[44,-11]],[[9369,8355],[-6,-27]],[[9363,8328],[-5,-30]],[[9358,8298],[-21,6],[-6,1],[-23,6]],[[9346,8496],[7,31],[8,39]],[[9361,8566],[19,-5],[11,-2],[8,0],[1,-11],[0,-11],[-6,-31],[18,-4],[5,24],[2,12],[0,19],[0,4],[4,1],[31,-8],[18,-5]],[[9361,8566],[7,35],[8,41],[6,25]],[[9382,8667],[27,-7],[-5,-22],[82,-22]],[[9382,8667],[6,27],[1,8],[3,9]],[[7853,5360],[11,20],[9,18]],[[7883,5417],[8,-4],[3,-2],[38,-20],[16,-8],[11,-5]],[[7959,5378],[-11,-19]],[[7948,5359],[-9,-17],[-10,-21]],[[7968,5397],[-9,-19]],[[7902,5454],[9,-4],[2,-1],[55,-28],[2,-1],[8,-5]],[[7912,5473],[9,-4],[2,-1],[25,-13],[30,-15],[2,-2],[8,-4]],[[7922,5492],[9,-5],[2,-1],[54,-28],[3,-2],[2,-1],[6,-3]],[[7932,5511],[9,-5],[2,-1],[54,-28],[2,-1],[9,-5]],[[7942,5529],[8,-4],[9,-4],[10,18],[9,18],[2,4],[42,-22],[14,-7],[2,-3]],[[7982,5606],[17,-9],[50,-25],[9,-5]],[[8001,5642],[9,-5],[1,0],[65,-34]],[[8001,5642],[11,21],[3,6],[8,14]],[[8023,5683],[11,-6],[57,-29],[8,-4]],[[8023,5683],[10,20],[10,20],[11,20],[13,26]],[[8142,5727],[-12,-23],[-10,-20]],[[8120,5684],[-11,-20],[-10,-20]],[[8120,5684],[8,-4],[1,-1],[57,-29],[9,-5]],[[8195,5645],[-11,-19],[-10,-20]],[[8142,5727],[8,-4],[66,-37]],[[8216,5686],[-11,-21],[-10,-20]],[[8166,5772],[73,-42]],[[8239,5730],[-12,-22],[-11,-22]],[[8239,5730],[28,-16],[3,-2]],[[8270,5712],[-1,-6],[-2,-10],[-1,-8],[0,-3],[-1,-9],[-1,-3],[-1,-2],[-1,-7],[-1,-4],[-1,-2],[-1,-2],[-2,-6],[-1,-2],[-1,-2],[-3,-5],[-10,-20],[-4,-8],[-7,-11],[-6,-12],[-4,-8],[-8,-14],[-4,-7]],[[8166,5772],[7,19],[8,19]],[[8181,5810],[17,-9],[18,-11]],[[8216,5790],[39,-22],[27,-15],[2,-2]],[[8216,5790],[7,19],[3,5],[7,18],[2,5],[8,18],[2,5],[2,6],[-19,10],[-2,-3],[1,-3],[-5,-12],[-19,12]],[[8181,5810],[20,54],[2,6]],[[2386,3567],[-7,-7],[-9,-11],[-10,-9],[-8,-9],[-9,-13],[-2,-7],[-4,-8],[-3,-12],[-3,-10],[0,-11],[0,-23],[-1,-13],[2,-19],[0,-9],[-1,-8],[-2,-4],[-4,-12],[-8,-11],[-36,-14],[-9,-5],[-9,-9],[-5,-6],[-2,-7],[0,-12],[0,-9],[0,-3],[2,-4],[1,-29],[2,-11],[0,-15],[2,-19],[2,-7],[4,-8],[3,-4],[10,-12],[12,-7],[3,-7],[2,-6],[1,-3],[4,-3],[1,-3],[1,-7],[0,-20],[-3,-13],[-2,-3],[-5,-16],[-2,-4],[-3,-3],[-4,-1],[-10,-6],[-3,-3],[-2,-3],[-11,-15],[-3,-10],[-1,-9],[-4,-14],[-6,-5],[-5,-3],[-1,-2],[0,-4],[0,-9],[1,-18],[1,-3],[4,-6],[6,-3],[1,-1],[0,-2],[-1,-5],[-3,-5],[-1,-5],[-2,-4],[-4,-12],[-2,-5],[-1,-1],[-5,-4],[-7,-4],[-6,-5],[-4,0],[-8,1],[-5,-3],[-6,-9],[-10,-11],[-3,-6],[-5,-3],[-2,-7],[-2,-10],[-4,-6],[-6,-3],[-2,-2],[-5,-6],[-1,-3],[-3,-5],[0,-4],[-3,-4],[-2,-1]],[[2259,3137],[3,6],[2,5],[1,3],[1,8],[2,9],[1,2],[0,5],[1,5],[0,4],[1,6],[-1,2],[0,2],[-2,6],[-1,3],[0,2],[-1,2],[-1,2],[-2,3],[-8,12],[-4,8],[-2,4],[-1,4],[0,7],[1,3],[0,3],[1,3],[2,9],[1,7],[0,2],[1,3],[-1,3],[0,5],[0,6],[-1,8],[0,5],[-1,16]],[[2164,3320],[7,6],[1,0],[13,-19],[5,6],[4,5],[4,6],[2,2],[2,3],[1,2],[6,8],[6,10]],[[7883,4323],[-8,-15]],[[7875,4308],[-3,2],[-8,6],[-1,1],[-26,20]],[[7837,4337],[-79,61],[8,14]],[[7766,4412],[71,-53],[8,-7]],[[7682,4356],[4,6],[55,78]],[[7741,4440],[1,-1],[0,-1],[2,-2],[1,-7],[21,-17]],[[7837,4337],[-5,-9],[-5,-9],[-10,-18],[-14,-26]],[[7875,4308],[-11,-18],[-10,-19],[-14,-24]],[[7869,4225],[-10,7],[-11,8],[-8,7]],[[7872,4148],[-7,6],[-31,23],[-8,6],[-7,6],[-9,6]],[[7863,4133],[-7,5],[-32,24],[-7,5],[-7,6],[-8,6]],[[7850,4108],[-47,35],[-2,-3],[-13,11],[-2,1]],[[7447,4255],[-10,7],[-44,34],[-9,6]],[[7384,4302],[9,17]],[[7393,4319],[8,14]],[[7401,4333],[63,-47]],[[7464,4286],[-9,-14],[-8,-17]],[[7447,4255],[-10,-17],[-9,7],[-44,34],[-9,7]],[[7375,4286],[9,16]],[[7305,4338],[9,17]],[[7314,4355],[10,-7],[20,-15],[31,-24],[9,-7]],[[7375,4286],[-10,7],[-51,38],[-9,7]],[[7314,4355],[9,17]],[[7323,4372],[10,-7],[6,-5],[45,-34],[9,-7]],[[7323,4372],[9,14]],[[7332,4386],[7,13]],[[7339,4399],[50,-38],[19,-15]],[[7408,4346],[-7,-13]],[[7353,4424],[69,-53]],[[7422,4371],[-7,-13],[-7,-12]],[[7339,4399],[6,11],[8,14]],[[7353,4424],[-69,52]],[[7284,4476],[7,14],[7,11]],[[7298,4501],[68,-52]],[[7366,4449],[46,-34],[6,-5],[18,-14]],[[7436,4396],[-6,-11],[-8,-14]],[[7366,4449],[7,11],[6,11]],[[7379,4471],[6,12],[7,11]],[[7392,4494],[69,-52]],[[7461,4442],[-6,-11],[-6,-12],[-7,-12],[-6,-11]],[[7298,4501],[6,11],[6,11]],[[7310,4523],[69,-52]],[[7310,4523],[-37,27],[-18,14],[-2,2],[-1,1],[-1,2]],[[7251,4569],[1,4],[2,8],[5,12]],[[7259,4593],[64,-47]],[[7323,4546],[69,-52]],[[7323,4546],[7,11],[9,18],[7,12],[7,14]],[[7353,4601],[69,-52]],[[7422,4549],[-7,-13],[-7,-12],[-9,-18],[-7,-12]],[[9197,7781],[97,-26],[62,-16],[52,-15]],[[9408,7724],[52,-14]],[[9460,7710],[61,-17]],[[9019,7016],[-207,59],[-36,11]],[[8776,7086],[18,116],[4,22],[-218,166],[-2,2],[-17,11],[-3,3]],[[8558,7406],[-3,2],[-4,2],[-28,22],[-2,1],[-351,274]],[[8170,7707],[44,47],[3,4],[3,2]],[[8220,7760],[2,3],[18,20],[11,12],[38,41],[6,7],[30,32],[43,47],[5,5],[39,43],[21,23],[8,8],[2,1]],[[8615,8154],[3,-3],[3,-1],[10,8],[37,-30],[39,-29],[129,-99],[20,-14],[5,-4],[3,-2],[4,-3],[23,-18],[46,-34],[19,-13],[91,-68],[54,-41],[62,-17],[7,-2],[24,-2],[3,-1]],[[8776,7086],[-14,-61],[-68,22],[-4,-7],[-51,20],[-33,-49]],[[8606,7011],[-22,16],[-4,3],[-9,7]],[[8571,7037],[12,22],[1,11],[1,26],[4,7],[-12,9],[-5,3],[-3,2],[-5,3],[-6,4],[-4,20],[-35,23]],[[8379,7068],[1,2],[18,33],[10,19],[16,32],[9,16],[27,50],[22,43],[9,17],[11,19],[5,11],[4,7],[4,8],[40,75],[0,1],[1,0],[0,1],[2,4]],[[8571,7037],[-17,12],[-8,-15]],[[8606,7011],[-8,-14],[-7,-14]],[[8977,6880],[-2,1],[-41,16]],[[9430,7831],[-4,-22],[-5,-21],[-5,-24],[-5,-27],[-3,-13]],[[9197,7781],[14,62],[8,43],[5,23],[2,8],[2,13],[5,22]],[[9233,7952],[31,-8],[66,-18]],[[9330,7926],[-5,-21],[-4,-22],[-5,-22],[61,-16],[53,-14]],[[9430,7831],[53,-14]],[[9483,7817],[-5,-22]],[[9478,7795],[-4,-22],[-5,-24],[-6,-26],[-3,-13]],[[9430,7831],[5,22],[1,6],[3,15],[4,22],[5,22],[53,-14]],[[9501,7904],[-5,-22],[-4,-22],[-5,-21],[-4,-22]],[[9539,7779],[-61,16]],[[9501,7904],[2,10],[8,24],[2,3]],[[9330,7926],[4,22],[8,36],[0,3]],[[9342,7987],[51,-14]],[[9393,7973],[43,-11],[44,-12],[33,-9]],[[9393,7973],[4,21],[4,20]],[[9401,8014],[4,21],[4,23],[5,21]],[[9268,8006],[4,20],[4,20],[41,-11],[43,-10],[41,-11]],[[9342,7987],[-45,12],[-20,5],[-9,2]],[[6454,4165],[-1,-3],[-4,-11],[-1,-3],[-1,-2],[0,-1],[-1,-6],[0,-6],[3,-8],[12,-29],[2,-9],[2,-8],[1,-15],[-2,-20],[-5,-19],[-3,-13],[-3,-8],[-4,-13],[-8,-16],[-9,-24],[-2,-6],[-12,-32],[2,-1],[-1,-2],[-4,-11],[-1,-3],[-8,-20],[0,-2],[-20,-46],[-4,-10],[-5,-11],[-15,7],[-36,16],[-12,5],[-33,16],[-1,-4],[-12,-34],[2,-2],[23,-11],[1,-1],[0,-1],[0,-1],[-7,-18],[-1,-1],[-2,-1],[-2,1],[-19,9],[-4,0],[-9,-26]],[[6250,3761],[-23,-65],[-24,-69]],[[6203,3627],[-26,-75]],[[6153,3913],[0,7],[0,10]],[[6087,3914],[12,30]],[[6764,4366],[-2,-12]],[[6762,4354],[-9,4],[-24,12],[-30,9],[-6,-16],[-4,-11],[-3,-9]],[[6686,4343],[-6,-18]],[[6680,4325],[-78,35],[-5,3]],[[6680,4325],[-7,-18]],[[6673,4307],[-81,36],[-1,3],[3,9]],[[6673,4307],[-7,-19]],[[6748,4315],[-7,-18]],[[6741,4297],[-8,4],[-29,13],[-24,11]],[[6686,4343],[24,-11],[28,-13],[10,-4]],[[6755,4335],[-7,-20]],[[6762,4354],[-7,-19]],[[6718,3553],[33,50],[12,34]],[[6763,3637],[21,-11],[-10,-24],[24,-11],[-13,-24],[-11,-20],[-10,-20],[10,-9],[4,-3],[6,-4]],[[9346,8496],[-3,1],[-19,5],[3,18],[0,2],[-2,2],[-9,2],[7,32],[-1,3],[-2,1],[-15,4],[-18,5],[-6,-36],[-18,5],[-18,5],[7,35],[-18,4],[3,14],[-6,2],[-4,2],[-2,3],[-1,3],[0,4]],[[9224,8612],[27,34],[20,22],[6,5],[18,18],[-14,4],[19,16],[-2,3],[4,21]],[[9224,8612],[-7,-10],[-18,-21],[-20,-14],[-10,-6],[-9,-4],[-5,-2],[-6,-3],[-6,-3],[5,20],[3,17]],[[9151,8586],[1,13],[1,26],[1,21],[-2,30],[-2,14],[-6,42],[-3,26]],[[9141,8758],[7,-4],[6,-4],[7,-4],[1,1],[2,0],[2,0],[66,-18],[5,24],[65,-18]],[[9141,8758],[1,1],[0,2],[0,2],[0,3],[0,4],[-1,14],[0,5],[-1,9],[-1,17],[0,6],[-1,15],[-4,40],[-2,13],[0,9],[-1,9],[-1,16],[0,6],[6,3],[0,6],[1,9],[0,4]],[[7575,4830],[-48,37],[-3,-6],[-14,10],[-7,5]],[[7503,4876],[9,18]],[[7512,4894],[7,-6],[12,-9],[4,10],[1,4],[4,0],[5,2],[2,5],[1,4],[3,8],[48,-36]],[[7599,4876],[-6,-12],[-6,-11],[-6,-11],[-6,-12]],[[7575,4830],[-6,-12],[-7,-12]],[[7562,4806],[-46,36],[-15,11],[-7,5]],[[7494,4858],[9,18]],[[7553,4786],[-69,53]],[[7484,4839],[5,10],[5,9]],[[7562,4806],[-4,-10],[-5,-10]],[[7521,4729],[-54,40],[-5,4],[-11,8]],[[7451,4781],[6,11],[6,9],[5,9],[5,10]],[[7473,4820],[6,9],[5,10]],[[7553,4786],[-5,-10],[-6,-10]],[[7542,4766],[-5,-9],[-5,-9],[-5,-9],[-6,-10]],[[7498,4689],[-17,13],[-8,8],[-34,25],[-10,7]],[[7429,4742],[11,19]],[[7440,4761],[6,10],[5,10]],[[7521,4729],[-7,-11],[-5,-10],[-5,-10],[-6,-9]],[[7475,4645],[-10,7],[-51,37],[-9,7]],[[7405,4696],[14,26]],[[7419,4722],[10,20]],[[7498,4689],[-5,-10],[-5,-10]],[[7488,4669],[-7,-13],[-6,-11]],[[7461,4621],[-9,7],[-51,37],[-9,7]],[[7392,4672],[13,24]],[[7475,4645],[-14,-24]],[[7461,4621],[-13,-23]],[[7448,4598],[-9,6],[-51,37],[-9,7]],[[7379,4648],[13,24]],[[7448,4598],[-6,-13],[-6,-10]],[[7436,4575],[-63,46],[-6,5]],[[7367,4626],[6,10],[6,12]],[[7353,4601],[8,13],[6,12]],[[7436,4575],[-6,-12],[-8,-14]],[[7491,4498],[-69,51]],[[7436,4575],[60,-44],[9,-7]],[[7505,4524],[-6,-12],[-8,-14]],[[7491,4498],[-7,-13],[-7,-12],[-5,-11],[-4,-7],[-2,-3],[-5,-10]],[[7518,4547],[-6,-12],[-7,-11]],[[7448,4598],[11,-8],[50,-37],[9,-6]],[[7531,4571],[-13,-24]],[[7461,4621],[11,-7],[23,-17],[14,-10],[13,-10],[9,-6]],[[7475,4645],[10,-7],[50,-37],[9,-7]],[[7544,4594],[-13,-23]],[[7488,4669],[9,-8],[50,-38],[9,-7]],[[7556,4616],[-12,-22]],[[7498,4689],[69,-53]],[[7567,4636],[34,-27],[-5,-9],[-5,-10],[-23,17],[-12,9]],[[7521,4729],[68,-54]],[[7589,4675],[-6,-10],[-5,-10]],[[7578,4655],[-6,-10],[-5,-9]],[[7542,4766],[69,-53]],[[7611,4713],[-6,-9],[-5,-9]],[[7600,4695],[-5,-9],[-6,-11]],[[7553,4786],[68,-53]],[[7621,4733],[-5,-10],[-5,-10]],[[7562,4806],[69,-52]],[[7575,4830],[68,-53]],[[7599,4876],[68,-53]],[[7599,4876],[5,11],[6,12]],[[7610,4899],[6,11],[6,12]],[[7622,4922],[34,-27],[35,-27]],[[7259,4593],[4,13],[4,14],[2,6]],[[7269,4626],[3,7],[4,8],[2,5],[4,7]],[[7282,4653],[71,-52]],[[7282,4653],[8,13],[6,12]],[[7296,4678],[71,-52]],[[7296,4678],[6,10],[6,12]],[[7308,4700],[10,-8],[51,-37],[10,-7]],[[7308,4700],[13,24]],[[7321,4724],[10,-7],[51,-38],[10,-7]],[[7321,4724],[13,24]],[[7334,4748],[10,-7],[51,-38],[10,-7]],[[7334,4748],[9,16],[6,10]],[[7349,4774],[9,-7],[52,-38],[9,-7]],[[7349,4774],[10,20]],[[7359,4794],[61,-45],[9,-7]],[[7359,4794],[6,9],[5,11]],[[7370,4814],[7,-6],[63,-47]],[[7370,4814],[5,9],[6,11]],[[7381,4834],[70,-53]],[[7381,4834],[6,10],[5,10]],[[7392,4854],[5,9],[5,10]],[[7402,4873],[71,-53]],[[7402,4873],[6,10],[6,10]],[[7414,4893],[70,-54]],[[7414,4893],[4,9],[4,9]],[[7432,4928],[7,-5],[16,-12],[18,-13],[21,-16],[9,-6]],[[7461,4983],[8,-6],[53,-39],[9,-7]],[[7531,4931],[-10,-20],[-9,-17]],[[7541,4951],[-10,-20]],[[7482,5022],[8,-6],[30,-22],[16,-7],[17,-12]],[[7553,4975],[-12,-24]],[[7565,4997],[-6,-11],[-6,-11]],[[7446,5078],[8,-6],[31,-23],[8,-6],[10,20]],[[7503,5063],[8,-6],[18,-13],[-1,-3],[-4,-7],[-2,-4],[43,-33]],[[7503,5063],[11,19],[6,11],[6,11]],[[7526,5104],[39,-29],[12,-8],[18,-13]],[[7595,5054],[-6,-11],[-6,-12],[-6,-11]],[[7577,5020],[-6,-12],[-6,-11]],[[7636,4427],[6,11],[5,8]],[[7647,4446],[13,24]],[[7660,4470],[9,18],[2,6],[2,0],[9,-7],[29,-22],[30,-25]],[[7696,4593],[11,-9],[20,-15],[3,-1],[30,-23]],[[7760,4545],[33,-25]],[[7793,4520],[4,-3]],[[7797,4517],[-2,-2],[-19,-25]],[[7776,4490],[-11,-15],[-24,-35]],[[7660,4470],[-13,9],[-45,35],[-8,6]],[[7594,4520],[13,23]],[[7607,4543],[42,65],[-34,25],[-14,5],[-23,17]],[[7589,4675],[33,-25],[4,-3],[31,-24],[39,-30]],[[7696,4593],[4,8],[4,7]],[[7704,4608],[5,11],[6,12]],[[7715,4631],[36,-28],[8,-7],[7,-3]],[[7766,4593],[1,-22],[-2,-9],[-3,-13],[-2,-4]],[[7814,4558],[-8,6],[-27,21],[-7,5],[-6,3]],[[7715,4631],[4,7],[2,4],[1,1],[4,8]],[[7726,4651],[24,-17],[8,-7],[4,-3]],[[7762,4624],[1,-4],[6,-4],[8,-6],[38,-29],[8,-7],[-9,-16]],[[7793,4520],[2,3],[10,19],[9,16]],[[7762,4624],[-3,29],[20,-16],[12,-7],[2,-2]],[[7793,4628],[27,-20],[15,-12],[20,-15]],[[7855,4581],[-3,-2],[-19,-16],[-11,-11]],[[7822,4552],[-4,-5],[-21,-30]],[[7804,4647],[-6,-9],[-5,-10]],[[1616,411],[-3,-1],[-36,-16],[-25,-12],[-8,-4],[-33,-14],[-12,-6],[-12,-4],[-28,-10],[-6,27],[-25,-7],[-27,-9]],[[848,76],[6,21]],[[908,104],[10,4],[6,2],[3,1],[8,1],[4,-1],[19,-5],[0,4],[1,11],[1,20],[1,7],[-1,7],[0,6],[1,3],[2,2],[3,8],[1,19],[9,2],[7,2],[10,3],[10,4],[49,35],[29,21],[4,2],[5,0],[8,-1],[12,0]],[[1110,261],[5,-1],[4,0],[4,0],[9,2],[43,13],[10,2],[26,5]],[[1618,401],[-3,-2],[-4,-7],[-5,-9],[-9,-13],[-11,-22],[-9,-1],[-24,-23],[-8,-4],[-6,-4],[-1,-2],[-2,-5],[-8,-4],[-9,-2],[-15,1],[-3,1],[-16,4],[-31,0],[-21,2],[-8,1],[-4,2],[-13,0],[-6,-3],[-2,0],[-18,-8],[-1,3],[-11,-8],[-17,-5],[-4,-4],[-11,-7],[-7,-6],[-3,-1],[-9,-6],[-4,2],[-23,-14],[-15,-14],[-2,-4],[-8,-4],[-10,-9],[-13,-5],[-4,0],[-3,-5],[-2,-2],[-5,-7],[-2,-6],[-5,-6],[-4,-5],[-6,-2],[-13,-8],[-7,-2],[0,-13],[-1,0],[-1,13],[-2,0],[-4,4],[-6,2],[-11,1],[-6,-1],[-12,-8],[-5,-8],[-5,-14],[-3,-7],[-6,-13],[-2,-4],[-1,-11],[1,-32],[-8,-14],[-6,-6],[-2,-2],[0,-3],[-2,-4],[-4,-7],[-5,-3],[-2,0],[-2,2],[-7,5],[-9,3],[-5,-2],[-3,-3],[-1,-21],[-1,-3],[-2,-1],[-3,2],[-1,4],[5,0],[0,31],[-12,2],[-3,-31],[5,-1],[0,-4],[-10,1],[-1,1],[-1,2],[0,7],[-1,0],[-4,6],[-12,0],[-7,-1],[-3,6],[-2,3],[-3,0],[-5,-1],[-15,-5],[-4,-3],[-5,-10],[-2,-2],[-5,-2],[-11,0],[-1,2],[-1,13],[-3,2],[-3,-6],[-3,-2],[-6,0],[-13,1],[-9,3],[-4,3],[-4,4],[-3,5],[-9,6],[-4,13],[-1,4],[-3,3],[-8,0],[-3,-1],[-23,-1],[-10,-1],[-7,-2],[-3,-2],[-1,-1]],[[6421,5195],[-62,30]],[[6359,5225],[4,11],[4,11]],[[6367,5247],[4,11],[4,13],[9,24]],[[6397,5128],[-61,30]],[[6336,5158],[4,11],[3,11]],[[6343,5180],[5,12],[4,11],[3,11],[4,11]],[[6413,5173],[-4,-11],[-4,-11],[-4,-12],[-4,-11]],[[6319,5112],[4,12],[5,11],[4,12],[4,11]],[[6397,5128],[-4,-11],[-4,-11],[-4,-12],[-5,-13]],[[6258,5141],[4,13],[4,11],[4,11],[4,12]],[[6274,5188],[4,11],[4,11]],[[6282,5210],[61,-30]],[[6474,5143],[-4,-11],[-4,-11],[-4,-11],[-4,-12],[-4,-11],[-4,-11],[-4,-12],[-4,-12]],[[7053,6499],[15,13],[14,12],[14,13],[13,19],[-19,29],[14,13],[9,7],[14,13],[-13,22]],[[7180,6696],[19,-30]],[[7199,6666],[30,-46],[2,-3]],[[7511,6675],[-2,-1],[-21,-19],[-2,-2],[-14,-13],[65,-49]],[[7231,6617],[33,65],[3,6],[60,120],[13,26],[23,35],[25,33],[16,20],[28,-36],[14,13],[-5,21],[13,15]],[[6770,5704],[-4,3],[-33,22],[-8,6]],[[6725,5735],[10,21]],[[6797,5762],[-1,-2],[-8,-18],[-8,-17],[-10,-21]],[[6851,5547],[-58,43]],[[6820,5639],[6,11],[6,11],[6,11],[5,9],[5,9],[4,8],[3,7],[9,-6],[1,3]],[[6714,5593],[-5,3]],[[6709,5596],[11,21],[11,21],[-32,23],[-9,6]],[[6690,5667],[11,22],[12,24],[12,22]],[[6709,5596],[-32,23],[-9,6],[-8,6],[-42,28],[-8,6]],[[6610,5665],[10,20]],[[6620,5685],[9,-6],[41,-28],[8,-6],[12,22]],[[6620,5685],[11,23],[-50,34],[-8,6]],[[6573,5748],[11,22]],[[6584,5770],[12,23]],[[6610,5665],[-9,6],[-41,29],[-9,6]],[[6551,5706],[11,20],[11,22]],[[6590,5626],[-59,41]],[[6531,5667],[10,19],[10,20]],[[6610,5665],[-10,-20],[-10,-19]],[[6662,5490],[-4,4],[-42,28]],[[6616,5522],[9,18],[13,25],[1,3],[9,18],[-58,40]],[[7178,4851],[-30,22]],[[7148,4873],[-57,42]],[[7148,4873],[-9,-17],[-12,-22],[30,-23]],[[4805,3933],[-5,6],[-47,49]],[[4753,3988],[7,8],[-13,14],[-11,11],[-1,1],[0,1],[-1,1],[1,1],[5,7],[-13,14],[28,37],[6,-6],[7,-8],[4,-3]],[[4772,4066],[9,-11],[16,-16],[4,-2],[14,-15],[15,-15],[15,-15],[6,-7]],[[4851,3985],[-2,-3],[-44,-49]],[[4546,3539],[-4,6],[20,11],[11,8],[8,6],[3,6],[-2,-1],[-1,0],[-1,0],[-3,3],[-43,47],[17,19],[16,-18],[16,-16],[26,15],[1,1],[-1,2],[-39,41],[4,5],[0,2],[-1,2],[-13,13]],[[4560,3691],[13,20],[16,24],[9,15],[2,4],[7,14],[6,13],[3,8],[10,23],[7,15],[13,18],[12,17],[13,18],[14,18],[14,18],[8,10],[10,13],[11,11],[7,9],[18,29]],[[4805,3933],[133,-148],[2,-3],[4,-4],[2,-1]],[[4946,3777],[-89,-54],[-10,-5]],[[6846,4116],[-16,-46],[1,0],[12,-1],[11,-2],[10,-3],[3,-2],[8,-5],[7,-6],[4,-4],[3,-2],[6,-3],[-25,-68],[0,-3],[-6,-5],[-3,-4],[-3,-5],[-4,-9],[-1,-8],[0,-7],[-1,-8],[-2,-9],[-3,-8]],[[6847,3908],[-20,10],[-24,11]],[[6803,3929],[-20,9],[-20,10],[-19,10]],[[6891,4103],[76,-36]],[[6967,4067],[-1,-4],[-18,8],[-1,-4],[-18,-49],[-21,-62]],[[6908,3956],[-1,-3],[-13,-35],[0,-3],[0,-3],[1,-3],[2,-8],[-26,-12]],[[6871,3889],[-4,10],[-3,2],[-17,7]],[[6878,3872],[-5,12],[-2,5]],[[6908,3956],[18,-9],[18,-9],[14,-6],[4,-2],[2,-1]],[[6964,3929],[-1,-3],[0,-2],[-4,-10],[-3,-5],[-23,-64],[-19,9],[-18,9],[-18,9]],[[6903,3730],[-7,4],[-3,1],[-18,8],[-19,9],[-19,8]],[[6837,3760],[15,39],[26,73]],[[6964,3929],[33,-17],[36,-17],[1,0]],[[6837,3760],[-9,4],[-11,-27],[-3,-4]],[[6814,3733],[-6,3],[-20,10],[-2,2],[19,54],[-5,2],[-7,12],[-9,25],[-1,4]],[[6783,3845],[-5,13],[25,71]],[[6699,3803],[-6,13],[25,71],[26,71]],[[6783,3845],[-28,-14],[-28,-14],[-28,-14]],[[6814,3733],[-4,-13],[-16,7]],[[6794,3727],[-39,19],[-80,38]],[[6675,3784],[2,6],[1,4],[2,0],[1,0],[2,1],[16,8]],[[6675,3784],[-13,6]],[[6662,3790],[2,7],[1,3],[-5,3],[-6,3],[-1,0],[-2,0],[-8,22],[11,7],[3,2],[1,4],[22,64],[-20,10]],[[6660,3915],[24,70]],[[6662,3790],[-12,6]],[[6650,3796],[-65,31]],[[6585,3827],[1,5],[-20,9],[-19,9],[29,81]],[[6576,3931],[18,-9],[11,6],[3,1],[11,5],[20,-9],[21,-10]],[[6577,3711],[-4,9],[0,2],[0,3],[0,3],[9,27]],[[6582,3755],[19,55],[-19,9]],[[6582,3819],[3,8]],[[6650,3796],[1,-4],[-4,-14],[-3,-1],[-4,-2],[-2,-3],[-1,-2],[-9,-22],[-1,-3],[-4,-4],[-5,-4],[-9,-6],[-25,-15],[-4,-3],[-3,-2]],[[6630,3633],[-20,11],[-20,8],[-18,9]],[[6572,3661],[13,34],[-6,14],[-2,2]],[[6675,3784],[-3,-11],[-4,-18],[-7,-21],[-2,-9],[1,-27],[2,-19],[-4,0],[-14,-2],[0,-4],[-14,-40]],[[6650,3615],[-2,7],[-2,3],[-2,2],[-14,6]],[[6794,3727],[-3,-8],[-4,-14],[-24,-68]],[[6551,3599],[21,62]],[[8469,5496],[75,-40],[14,4],[4,0],[9,-4],[7,-4],[16,-8],[9,-6],[17,-11],[82,-46],[2,-1]],[[8704,5380],[-7,-23],[-4,-15],[-2,-4],[-2,-8],[-8,-24],[-7,-24]],[[8674,5282],[-3,2],[-14,8],[-6,3],[-14,8],[-32,17],[-3,-3],[-1,-8],[-14,-36]],[[8587,5273],[-9,-24],[-9,-24]],[[8569,5225],[-10,-26],[-10,-23]],[[8549,5176],[-31,-80]],[[8518,5096],[-10,-23],[-9,-23]],[[8499,5050],[-8,-21],[-3,-4]],[[8488,5025],[-6,4],[-50,27]],[[8435,5412],[6,14],[6,15],[2,5],[6,16],[14,34]],[[8334,5073],[-67,36],[-9,5]],[[8258,5114],[8,19],[1,6],[1,3]],[[8344,5102],[-1,-4],[-9,-25]],[[8313,5019],[-76,40]],[[8237,5059],[4,10],[4,10],[7,19]],[[8252,5098],[6,16]],[[8334,5073],[-6,-15]],[[8328,5058],[-8,-19],[-3,-10],[-4,-10]],[[8313,5019],[-4,-10],[-5,-13]],[[8304,4996],[-9,7],[-3,2],[-8,4],[-5,3],[-41,21],[-9,5]],[[8229,5038],[4,11],[4,10]],[[1110,261],[2,35],[2,34],[-43,5],[-32,3],[4,34],[-13,29]],[[848,76],[-2,-3],[-5,-3],[-5,-1],[-6,1],[-8,5],[-14,0],[-7,-2],[-19,-9],[-5,-5],[-5,-4],[-11,-4],[-6,-11],[-7,-7],[-4,-3],[-12,-3],[-11,-1],[-6,-2],[-26,-5],[-22,-7],[-5,-3]],[[662,9],[-5,19]],[[657,28],[-10,68],[-1,8],[-1,3],[4,-1],[-3,14],[-2,1],[-3,16],[-10,73]],[[631,210],[0,3],[-3,2],[-2,1],[-5,2],[-7,4],[-8,4]],[[606,226],[-2,2],[-13,118],[-23,37],[-36,103]],[[1019,1295],[22,13],[-2,11],[37,25],[-4,14],[132,53],[6,8],[195,119],[30,-60]],[[606,226],[-36,-15],[-36,-15],[-32,-16]],[[570,85],[-2,-2],[-15,-2],[-23,-4],[-1,21],[-13,-2],[-7,50],[0,3],[-1,8],[-1,3],[-1,4]],[[631,210],[-4,-1],[-4,-2],[-2,0],[-2,-1],[-2,-1],[-1,-1],[-31,-14],[4,-36],[1,-5],[2,-20],[2,-20],[2,-20],[-26,-4]],[[657,28],[-5,-3],[-15,-6],[-3,0],[-10,-1],[-5,0],[-8,1],[-15,1],[-17,-1],[-3,0],[-6,66]],[[662,9],[-4,-2],[-5,-1],[-4,-2],[-33,1],[-17,-1],[-1,6],[-1,0],[-1,-1],[-1,-5],[-14,-2],[-2,0],[0,2],[-1,2],[-1,-3],[-3,-3],[-4,1],[-2,0],[0,4],[-2,2],[-37,10],[-11,7],[-13,1],[-71,41],[-3,-7],[62,-37],[0,-3],[0,-2],[-7,4],[-45,26],[0,1],[-12,7],[-3,1],[-3,2]],[[1560,1505],[-9,19],[-9,44],[124,49],[25,17],[11,7],[10,4],[6,1]],[[3029,1685],[-25,40],[-28,46],[-17,-14],[-17,-14],[-15,-12],[-1,-2],[0,-2],[27,-44],[-9,-7],[-3,-2],[-2,-1],[-4,0],[-4,2]],[[2845,1617],[-8,-6]],[[2837,1611],[-43,71],[-33,59],[-15,25],[-26,42],[-2,3]],[[3084,1896],[5,-22],[10,-40]],[[3099,1834],[19,-75]],[[3118,1759],[-1,-1],[-2,-1],[-3,-3],[-53,-43],[-16,-14]],[[3127,1864],[-4,-4],[-1,-1],[-2,-3],[-2,-6],[-2,-3],[-2,-2],[-15,-11]],[[3249,2028],[10,-19],[1,-7],[-1,-39],[1,-4],[11,-20],[-20,-18]],[[3251,1921],[-39,-31],[-33,-28],[-12,19],[-7,11],[-17,-15],[-11,-9],[-5,-4]],[[7402,4873],[-69,50]],[[7392,4854],[-70,51]],[[7381,4834],[-69,51]],[[7370,4814],[-69,50]],[[8304,4996],[-13,-20]],[[8291,4976],[-10,8],[-7,6],[-5,2],[-4,2],[-35,19],[-9,4]],[[8221,5017],[8,21]],[[8233,4878],[-44,22],[-1,0],[-2,-1],[0,-1],[-1,-1],[-7,-18],[-1,-3]],[[8177,4876],[-15,6],[-4,3]],[[8158,4885],[8,20],[6,18],[4,11],[4,7],[5,11],[6,9],[11,17],[4,7],[5,11]],[[8211,4996],[5,10],[5,11]],[[8291,4976],[-12,-20]],[[8279,4956],[-13,-21]],[[8266,4935],[-12,-20],[-13,-20]],[[8241,4895],[-4,-7],[-4,-10]],[[8211,4996],[-2,1],[-10,6],[-48,24],[-9,5]],[[8142,5032],[8,22]],[[8150,5054],[8,22]],[[8158,5076],[9,-5],[52,-28],[8,-3],[2,-2]],[[8158,5076],[6,11],[5,8]],[[8169,5095],[66,-35],[2,-1]],[[8169,5095],[5,10],[5,9],[5,8],[6,9]],[[8190,5131],[60,-31],[2,-2]],[[8190,5131],[5,9],[3,6],[3,5],[3,6],[1,2],[4,10],[1,4]],[[8058,5280],[-2,1],[-7,4],[-25,13],[-10,5],[10,18]],[[8024,5321],[10,18],[9,19]],[[7948,5359],[8,-4],[3,-1],[54,-28],[3,-1],[8,-4]],[[8174,4331],[12,20],[14,24]],[[8200,4375],[9,-6],[30,-24],[9,-6]],[[8200,4375],[9,17]],[[8209,4392],[67,-52]],[[8209,4392],[10,17]],[[8219,4409],[60,-49]],[[8219,4409],[10,18],[12,19],[11,20]],[[8252,4466],[8,-6],[22,-15],[2,-2],[11,-8]],[[8219,4409],[-8,6],[-9,8],[-30,23],[-9,7]],[[8163,4453],[21,35],[-8,7],[-19,13],[-10,8],[-9,7]],[[8138,4523],[9,16]],[[8147,4539],[38,-27],[9,-6],[8,-6],[20,-14],[20,-14],[10,-6]],[[8209,4392],[-7,6],[-20,15],[-20,16],[-9,6]],[[8153,4435],[10,18]],[[8200,4375],[-16,12],[-8,-14],[-31,25],[-9,7]],[[8136,4405],[8,14]],[[8144,4419],[9,16]],[[8174,4331],[-56,44]],[[8118,4375],[6,10],[6,10],[6,10]],[[8062,4390],[11,20]],[[8073,4410],[9,-7],[36,-28]],[[8073,4410],[11,20]],[[8084,4430],[6,10]],[[8090,4440],[8,-7],[1,0],[28,-21],[8,14],[1,-2],[8,-5]],[[8090,4440],[5,9]],[[8095,4449],[3,5],[8,14]],[[8106,4468],[2,3]],[[8108,4471],[8,-6],[30,-24],[7,-6]],[[8108,4471],[10,17],[10,18],[10,17]],[[8106,4468],[-9,7],[-51,40],[-9,6]],[[8037,4521],[-18,15],[-9,7]],[[8010,4543],[11,19],[28,46]],[[8049,4608],[71,-50],[27,-19]],[[8095,4449],[-69,53]],[[8026,4502],[6,10],[5,9]],[[8084,4430],[-8,7],[-23,17],[-10,8],[-19,15],[-8,6]],[[8016,4483],[4,9],[1,1],[5,9]],[[8073,4410],[-69,54]],[[8004,4464],[6,10],[6,9]],[[8062,4390],[-9,7],[-40,31],[-20,16],[-9,-16]],[[7984,4428],[-9,6],[-12,9],[-8,7]],[[7955,4450],[9,16],[11,20]],[[7975,4486],[29,-22]],[[8052,4374],[-8,6],[-53,42],[-7,6]],[[8030,4336],[-7,6],[-2,1],[-51,39],[-9,7]],[[7961,4389],[9,15],[5,8],[9,16]],[[7919,4386],[13,25]],[[7932,4411],[9,-7],[11,-8],[9,-7]],[[7932,4411],[14,23],[9,16]],[[7932,4411],[-2,2],[-7,5],[-13,10]],[[7910,4428],[6,11],[2,2],[5,10],[-7,5],[-1,1],[-50,39],[-8,6],[9,16]],[[7866,4518],[8,-6],[26,-20],[24,-19],[8,-6]],[[7932,4467],[8,-6],[5,-4],[7,-6],[3,-1]],[[7869,4393],[-8,10],[11,19]],[[7872,4422],[14,24]],[[7886,4446],[9,-7],[9,-7],[6,-4]],[[7886,4446],[-42,33],[-17,12],[-11,10],[-7,5],[-4,5],[-8,6]],[[7822,4552],[3,-3],[32,-25],[9,-6]],[[6501,3793],[-7,-19],[-17,-41]],[[6477,3733],[-5,-9],[-3,-6],[-4,-5],[-6,-9],[-5,-6],[-7,-7]],[[6379,3781],[20,-10],[20,-10],[13,28],[14,17]],[[6446,3806],[2,-2],[3,-1],[4,0],[4,2],[2,3],[2,2],[19,-9],[10,-5],[9,-3]],[[6403,3841],[21,-11],[19,-10],[0,-4],[0,-2],[0,-3],[1,-2],[2,-3]],[[6582,3819],[-21,11],[-19,8],[-19,9],[-9,-22],[-13,-32]],[[6426,3903],[3,-1],[20,-10],[19,-9],[4,-2],[8,-4],[10,-5],[36,-17],[39,-18],[20,-10]],[[6523,3965],[1,-2],[2,-3],[1,-2],[0,-4],[12,-6],[18,-8],[19,-9]],[[6527,4004],[4,12],[4,9],[18,-9],[2,-1],[8,8],[7,5],[4,2],[4,1],[4,1],[7,0],[6,-2],[14,-6],[16,-8],[1,-2]],[[7359,4794],[-69,50]],[[7334,4748],[-36,26],[-4,-8],[-33,24]],[[7296,4678],[-35,26]],[[7269,4626],[-69,52]],[[7259,4593],[-40,31]],[[7219,4624],[-34,26],[-23,17]],[[7190,4582],[-8,4],[-15,8]],[[7167,4594],[2,8],[4,9],[7,13],[-29,22]],[[7219,4624],[-5,-10],[-6,-10],[-7,-13],[-11,-9]],[[7247,4555],[-6,3],[-44,21],[-7,3]],[[7251,4569],[-2,-6],[-2,-8]],[[7241,4535],[-7,4],[-7,3],[-5,2],[-39,19],[-23,11],[-35,17]],[[7133,4610],[34,-16]],[[7247,4555],[-3,-14],[-3,-6]],[[7234,4514],[-10,6],[-48,22]],[[7176,4542],[-58,29]],[[7241,4535],[-2,-6],[-3,-9],[-2,-6]],[[7162,4500],[-38,18],[-21,10]],[[7176,4542],[-4,-12],[-4,-11],[-3,-10],[-3,-9]],[[7162,4500],[-4,-10],[-4,-10],[-4,-11],[0,-2],[-4,-9]],[[7162,4500],[40,-20],[3,-1],[7,-4]],[[7212,4475],[-11,-19],[-16,-28]],[[7185,4428],[-7,-14],[-2,-1],[-1,-2]],[[7234,4514],[-12,-19],[0,-2],[-3,-4],[-7,-14]],[[7284,4476],[-50,38]],[[7332,4386],[-39,29]],[[7293,4415],[-9,7],[-9,6],[7,13],[-6,5],[-10,7]],[[7266,4453],[10,9],[8,14]],[[7305,4338],[-9,7],[-21,16],[-9,7],[-8,6],[-10,7]],[[7248,4381],[10,17]],[[7258,4398],[9,-7],[8,-6],[9,16],[9,14]],[[7283,4299],[-6,4]],[[7277,4303],[-3,3],[-21,15],[-9,7],[-8,6],[-10,8]],[[7226,4342],[6,11],[6,10],[7,11],[3,7]],[[7305,4338],[-10,-18],[-12,-21]],[[7215,4350],[11,-8]],[[7277,4303],[-6,-10],[-5,-9],[-5,-9],[-1,-2],[-5,-9],[-12,9]],[[7185,4428],[9,-6],[13,-10],[13,-10],[10,-7],[10,17],[9,-7],[9,-7]],[[7962,5097],[10,-5],[51,-26],[9,-4]],[[8032,5062],[-8,-20],[-7,-19]],[[7984,5141],[9,-5],[1,-1],[46,-24],[9,-5]],[[8049,5106],[-8,-22],[-9,-22]],[[8058,5129],[-9,-23]],[[8006,5182],[9,-4],[43,-23],[8,-5]],[[8066,5150],[-2,-4],[-6,-17]],[[8074,5170],[-8,-20]],[[8026,5219],[1,-1],[7,-3],[39,-21],[8,-5]],[[8081,5189],[-7,-19]],[[8089,5209],[-8,-20]],[[8099,5232],[-2,-3],[-8,-20]],[[8136,5160],[-8,-19]],[[8128,5141],[-9,4],[-37,20],[-8,5]],[[8089,5209],[9,-5],[8,-4],[21,-11],[8,-4],[9,-5]],[[8144,5180],[-8,-20]],[[8153,5203],[-1,-3],[-8,-20]],[[8190,5131],[-46,24],[-8,5]],[[8169,5095],[-40,22],[-8,4]],[[8121,5121],[7,20]],[[8150,5054],[-10,5],[-25,14],[-9,4]],[[8106,5077],[7,23]],[[8113,5100],[8,21]],[[7112,4117],[9,17]],[[7121,4134],[10,18]],[[7131,4152],[10,18],[-8,5],[-11,5],[-51,25],[-9,4]],[[7134,4264],[11,-4],[11,-7],[10,-10],[8,-11],[3,-7],[4,-10],[2,-15],[0,-4],[1,-17],[-2,-17]],[[6891,4103],[6,17]],[[6897,4120],[6,15]],[[6903,4135],[8,-5],[58,-27],[10,-5]],[[6903,4135],[6,17]],[[6909,4152],[9,-4],[57,-28],[10,-4]],[[6909,4152],[6,19]],[[6915,4171],[9,-5],[58,-28],[10,-4]],[[6915,4171],[7,18]],[[6922,4189],[66,-33],[10,-4]],[[6922,4189],[6,17]],[[6928,4206],[76,-36]],[[6928,4206],[7,18]],[[6935,4224],[9,-4],[57,-28],[9,-4]],[[6935,4224],[3,10],[4,10]],[[6942,4244],[75,-37]],[[6942,4244],[6,20]],[[6942,4244],[-63,31]],[[6935,4224],[-10,5],[-44,22],[-9,4]],[[6872,4255],[3,9],[4,11]],[[6928,4206],[-9,5],[-44,21],[-9,5]],[[6866,4237],[6,18]],[[6922,4189],[-9,4],[-18,9],[-27,12],[-9,4]],[[6859,4218],[7,19]],[[6909,4152],[-9,4],[-8,4],[-37,18],[-9,4]],[[6846,4182],[7,19],[6,17]],[[6897,4120],[-62,30]],[[6835,4150],[5,15]],[[6840,4165],[6,17]],[[6829,4133],[6,17]],[[6777,4195],[10,-5],[44,-21],[9,-4]],[[6790,4231],[7,18]],[[6797,4249],[9,-5],[44,-21],[9,-5]],[[6797,4249],[6,18]],[[6803,4267],[10,-5],[53,-25]],[[6803,4267],[2,7],[5,11],[6,20]],[[6816,4305],[-5,2],[-56,28]],[[6803,4267],[-8,4],[-45,22],[-9,4]],[[7965,4523],[-12,-19]],[[7953,4504],[-8,6],[-50,38],[-8,6]],[[7887,4554],[4,5],[3,4],[3,3],[5,6],[5,-3],[49,-39],[9,-7]],[[7866,4518],[9,17],[12,19]],[[7953,4504],[-11,-21],[-10,-16]],[[7959,4671],[3,-2],[7,-5],[4,-2],[27,-19],[26,-19],[2,-3],[6,-4]],[[8034,4617],[-32,6],[-33,1],[-21,-2],[-19,-5],[-5,-1],[-28,-10],[-17,-9],[-24,-16]],[[8225,4853],[-38,19],[-10,4]],[[8233,4878],[-7,-21],[-1,-4]],[[8284,4828],[-1,-4]],[[8283,4824],[-58,29]],[[8241,4895],[14,-12],[39,-32]],[[8294,4851],[-6,-11],[-4,-12]],[[8266,4935],[53,-44]],[[8319,4891],[-13,-20],[-12,-20]],[[8329,4803],[-4,5],[-41,20]],[[8319,4891],[15,-13],[4,-3],[14,-8]],[[8352,4867],[-7,-20],[-8,-23]],[[8362,4893],[-10,-26]],[[8279,4956],[18,-16],[35,-29]],[[8332,4911],[4,-4],[7,-4],[19,-10]],[[8304,4996],[18,-15],[17,-15],[-10,-17],[-1,-2],[1,-3],[15,-12],[-12,-21]],[[8313,5019],[79,-42]],[[8392,4977],[-3,-10],[-9,-25],[-18,-49]],[[8425,4960],[-11,5],[-6,4],[-16,8]],[[8328,5058],[9,-5],[69,-36],[8,-5],[1,0],[12,-7]],[[8427,5005],[-1,-22],[-1,-23]],[[8432,5056],[0,-5],[-2,-29]],[[8430,5022],[-1,-10],[-2,-7]],[[8479,4997],[-10,5],[-23,12],[-16,8]],[[8488,5025],[-1,-3],[-3,-11],[-5,-14]],[[7872,4422],[-15,12],[-55,42],[-2,-5]],[[7800,4471],[-16,12],[-8,7]],[[7869,4393],[-10,7],[-69,54],[6,11],[4,6]],[[7856,4371],[-9,7],[-70,54],[-5,-10],[-6,-10]],[[3424,1948],[-33,54],[-3,5]],[[3388,2007],[-3,4]],[[3385,2011],[17,14],[-10,16],[15,14],[1,1],[0,2],[-31,49],[17,14],[18,14],[13,12],[4,-1],[28,-46],[3,0],[16,13]],[[3385,2011],[-9,15],[-8,13],[-30,19],[-6,10],[-12,19]],[[3275,1912],[-24,9]],[[3388,2007],[-56,-48],[-57,-47]],[[3311,1854],[-24,38]],[[3287,1892],[-12,20]],[[3254,1652],[-17,29],[-5,8],[-12,21],[-4,5],[-13,19]],[[3203,1734],[4,4],[48,40],[-35,58],[17,14],[17,14],[17,14],[16,14]],[[8049,3664],[-24,19],[-6,4],[-11,8],[-9,7]],[[7999,3702],[4,9],[4,7],[5,10],[4,8],[4,7]],[[7999,3702],[-18,14],[4,8],[4,8],[-4,2],[-20,15],[4,8]],[[7969,3757],[4,9],[5,8]],[[7978,3774],[26,-18],[14,-11],[2,-2]],[[7999,3702],[-10,-18],[-7,-13]],[[7982,3671],[-11,-19],[-11,-20]],[[7874,3698],[28,51],[10,18]],[[7912,3767],[21,-15],[6,11],[6,11],[24,-17]],[[8032,3633],[-36,27],[-2,2],[-12,9]],[[7912,3767],[7,12],[5,10],[5,9],[5,9]],[[7934,3807],[20,-15],[8,-6],[16,-12]],[[7934,3807],[9,16],[8,15]],[[7951,3838],[28,-22],[8,15]],[[7987,3831],[39,-29],[0,-3],[-3,-6],[-3,-7],[16,-12]],[[7951,3838],[8,14]],[[7959,3852],[10,15],[3,7],[4,8]],[[7976,3882],[28,-21]],[[8004,3861],[-5,-8],[-3,-7],[-4,-6],[-5,-9]],[[8004,3861],[39,-29]],[[8043,3832],[7,-6],[9,-6]],[[7976,3882],[5,9],[4,7],[5,8],[4,8]],[[7994,3914],[66,-50],[-4,-8],[-5,-7],[-4,-8],[-4,-9]],[[7994,3914],[4,7],[6,11]],[[8004,3932],[-46,36]],[[7976,3882],[-46,35]],[[7930,3917],[5,9],[4,7],[8,15]],[[7947,3948],[5,8],[6,12]],[[7959,3852],[-13,10],[-33,25]],[[7913,3887],[9,15],[4,7],[4,8]],[[7913,3887],[-10,7],[8,15],[-37,29]],[[7874,3938],[4,7],[4,8],[5,9],[4,7]],[[7891,3969],[5,8],[4,7],[28,-21],[19,-15]],[[7888,3842],[-10,7],[-28,21],[-9,6]],[[7841,3876],[9,17],[4,8],[4,7],[3,6],[5,9]],[[7866,3923],[8,15]],[[7913,3887],[-8,-15],[-8,-14],[-9,-16]],[[7934,3807],[-46,35]],[[7912,3767],[-10,8],[-36,27]],[[7866,3802],[12,22]],[[7878,3824],[10,18]],[[7866,3802],[-11,-18],[-46,35],[10,18]],[[7819,3837],[6,11],[6,11],[47,-35]],[[7773,3871],[14,-10],[32,-24]],[[7794,3911],[47,-35]],[[7820,3958],[46,-35]],[[6582,3755],[-20,8],[-22,-59],[-21,9],[-21,10],[-21,10]],[[6203,3627],[19,-9],[50,-23],[7,23],[8,23],[8,23],[8,22],[7,21],[8,21],[-49,24],[-19,9]],[[7688,4681],[-5,-10],[-6,-11],[-48,37],[-9,10],[-9,6]],[[7704,4608],[-39,30],[-46,35],[-3,6],[-4,6],[-12,10]],[[7607,4543],[-11,9],[-9,8],[-32,26],[-11,8]],[[7594,4520],[-12,9],[-41,33],[-10,9]],[[8624,5710],[-47,26],[-9,5]],[[8568,5741],[13,31],[8,20],[8,20]],[[8653,5781],[-8,-20],[-8,-20],[-8,-20],[-5,-11]],[[8568,5741],[-2,2],[-9,4],[-53,29]],[[8480,5717],[8,19],[8,20]],[[8568,5741],[-8,-20],[-8,-20],[-7,-17],[-1,-3]],[[7853,5360],[-77,40]],[[7839,5334],[-9,5],[-2,1],[-65,33]],[[7827,5311],[-76,40]],[[7839,5334],[-12,-23]],[[7567,3823],[-35,26]],[[7557,3778],[-8,9],[-8,6],[-28,21]],[[8110,6557],[-3,2],[-3,2]],[[8057,6707],[10,19],[19,35],[2,3],[7,15],[6,11],[3,5],[1,2],[2,-2],[7,-7],[7,-8],[3,-4],[2,-2],[2,-2],[1,-2],[2,-2],[1,-1],[1,-2],[1,-2],[2,-2],[1,-2],[1,-1],[1,-2],[2,-3],[1,-2],[2,-2],[2,-4],[3,-3],[7,-12],[1,-2],[5,-6],[3,-4],[2,-2],[2,-3],[2,-2],[3,-3],[6,-6],[5,-3],[1,-1],[4,-3],[3,-2],[3,-1]],[[7054,6892],[-24,37]],[[7030,6929],[-12,20]],[[7018,6949],[44,38]],[[7062,6987],[13,-22],[11,-17]],[[7062,6987],[14,12]],[[7076,6999],[14,12]],[[7199,6666],[3,2],[2,0],[1,0],[15,-25],[3,-2],[2,2],[8,15],[-35,54],[-18,-16]],[[7176,6808],[23,13],[22,12],[48,27],[-2,3],[-15,23]],[[7367,6912],[5,3],[9,4],[9,6],[7,5],[6,5],[5,6],[7,7],[9,8],[6,6],[5,5],[6,4],[3,1],[6,3],[8,4],[13,5]],[[7049,4170],[8,-4],[55,-28],[2,-1],[7,-3]],[[7055,4189],[76,-37]],[[7225,4241],[86,-23],[13,-4],[1,0],[4,-3],[6,-3],[23,-15],[9,-4],[10,-1],[5,0],[28,0],[13,-2],[8,-2]],[[7283,4299],[17,-13],[34,-27],[9,-6],[9,-7]],[[7352,4246],[34,-25],[22,-17],[7,-4],[20,-15]],[[7375,4286],[-5,-9],[-5,-9],[-6,-10],[-7,-12]],[[7464,4286],[6,13],[7,12],[8,13]],[[7485,4324],[58,-44],[9,-7]],[[7485,4324],[7,14],[6,12]],[[7498,4350],[6,11],[7,11]],[[7643,5148],[-1,-3],[-12,-24],[-10,-18],[-9,-18],[-16,-31]],[[7698,5065],[-9,-19],[-24,12],[-13,-33]],[[7652,5025],[-17,9],[-2,1],[-15,7],[-10,5],[-13,7]],[[7643,5148],[10,-6],[6,-4],[51,-25],[10,-6]],[[7720,5107],[-12,-24],[-10,-18]],[[7646,4967],[-69,53]],[[7652,5025],[20,-10]],[[7672,5015],[-8,-15],[-6,-11]],[[7658,4989],[-6,-11],[-6,-11]],[[7622,4922],[-69,53]],[[7646,4967],[-6,-12],[-6,-11],[-6,-11],[-6,-11]],[[7610,4899],[-59,45],[-10,7]],[[7910,2498],[10,17],[11,17]],[[7931,2532],[10,18],[38,-31]],[[7866,2535],[14,13],[14,13]],[[7894,2561],[37,-29]],[[7821,2526],[8,19],[9,19],[8,19],[8,20],[9,19]],[[7863,2622],[13,-11],[9,-7],[15,-12],[33,30]],[[7933,2622],[12,-16],[-13,-11],[-17,-15],[-5,-6],[-16,-13]],[[7863,2622],[10,18],[11,18],[10,13],[14,14]],[[7908,2685],[15,15],[7,7],[2,2]],[[7956,2645],[-2,-3],[-21,-20]],[[7863,2622],[-43,34]],[[7856,2706],[4,4],[14,16]],[[7874,2726],[7,-8],[6,-7],[13,-16],[8,-10]],[[7874,2726],[14,16],[5,6],[15,17],[1,2],[1,1]],[[7765,2786],[20,35],[5,8]],[[7790,2829],[34,50],[3,4]],[[7911,2957],[-1,-3],[-8,-10],[-6,-8]],[[7790,2829],[-5,4],[-24,16]],[[7761,2849],[3,4],[31,47]],[[7761,2849],[-17,-18],[-13,-21],[-16,-23]],[[7646,4967],[69,-53]],[[7658,4989],[60,-46],[8,-7]],[[7672,5015],[21,-12],[55,-26]],[[7698,5065],[66,-33],[10,-5]],[[7720,5107],[12,24]],[[7732,5131],[10,-5],[2,-1],[53,-26],[3,-2],[8,-4]],[[7732,5131],[11,21]],[[7743,5152],[10,-5],[55,-28],[3,-1],[9,-5]],[[7743,5152],[13,22],[12,23]],[[7768,5197],[11,23]],[[7779,5220],[9,-5],[55,-28],[12,-6]],[[7743,5152],[-11,5],[-19,10],[-16,8],[-19,9],[-3,2],[-9,4]],[[7690,5236],[3,-1],[4,-3],[1,0],[17,-9],[3,-1],[13,-7],[27,-14],[10,-4]],[[7827,5311],[-12,-24],[-12,-23],[-24,-44]],[[7827,5311],[9,-5],[2,-1],[55,-27],[10,-6]],[[7434,2220],[-9,7],[-5,4],[-36,27],[-2,2],[-10,6],[-14,10],[-6,5]],[[7352,2281],[2,1],[21,18],[3,2],[2,2]],[[7380,2304],[1,1],[3,2],[0,1],[2,1],[15,14],[3,3],[3,2],[9,9],[2,1],[1,1]],[[7419,2339],[49,43],[24,22],[16,15]],[[7508,2419],[65,-42],[2,-1],[27,30],[5,5]],[[7607,2411],[-1,-4],[-2,-8],[-10,-39],[-2,-5]],[[7607,2411],[4,5],[16,19]],[[7627,2435],[14,-12],[4,-3],[7,-5],[16,-13],[5,-4],[30,-23],[3,-2]],[[7642,2313],[-55,-51],[-17,-26],[-7,-10],[-3,-2]],[[7647,2310],[-1,-5],[-17,-30],[-7,-14],[11,-8],[6,-5],[4,-3],[16,8],[-1,-11],[-2,-14]],[[7685,2519],[-5,-7],[-5,-7],[17,-17],[11,-12],[-13,-19],[19,-16],[14,10],[4,2],[15,11]],[[7328,1095],[5,23]],[[7436,1089],[-8,-8],[-10,-11],[-6,1],[-84,24]],[[7333,922],[-3,3],[-3,3]],[[7327,928],[-2,3],[-2,1]],[[7323,932],[14,16],[24,27],[21,23],[14,16],[7,10],[-13,3],[-42,12],[-4,2],[-5,2],[-5,1],[-5,0],[-11,3]],[[7318,1047],[5,23],[5,25]],[[7464,1065],[-39,-46],[-2,-2],[-43,-46],[-44,-46],[-3,-3]],[[7323,932],[-4,2],[-5,2],[-6,0],[-9,0],[-8,2],[-25,7],[-13,3]],[[7253,948],[10,12],[11,12],[-1,2],[-1,3],[-32,25],[10,18],[24,-20],[14,15],[30,32]],[[7318,1047],[-23,6],[-23,6],[-11,4],[6,23],[5,25],[5,24]],[[7253,948],[-36,9],[-12,4],[-10,2],[-7,0]],[[7053,764],[61,74],[-10,9],[-30,25]],[[7074,872],[21,21],[18,22]],[[7113,915],[3,4],[14,-19],[12,19],[19,32],[1,2],[1,3],[-1,3],[-8,4]],[[7253,948],[-4,-3],[-9,-10],[-5,-6],[-39,25],[-9,-17],[34,-23],[-2,-8],[50,-32],[13,14],[27,28],[1,1],[0,2],[1,3],[0,3],[1,-2],[0,-2],[0,-3],[-1,-4],[-1,-3],[-2,-3],[17,17],[2,3]],[[7333,922],[-3,-3],[-1,-2],[-101,-104],[-15,-17],[-47,-50],[-1,-1],[-12,-10],[-10,-8]],[[7845,4003],[9,-6],[1,-1],[36,-27]],[[2315,2374],[-2,-8],[0,-3],[15,-39],[1,-3],[2,-1],[3,0],[-20,-64],[-4,-11],[-8,-15],[-4,4],[-4,4],[-3,5],[-1,6],[1,6],[5,11],[-3,1],[-3,1],[-3,0],[-2,-1],[-19,-10],[-1,-2],[10,-27],[0,-3],[-1,-3],[-2,-3],[-3,-6],[-13,7],[-18,51]],[[2386,2333],[-17,-14],[-11,-9],[-4,-4],[-4,-5],[-3,-7],[-18,-56],[-7,-13],[-11,-21],[-12,-21],[-3,-8],[-12,-33]],[[2428,2260],[-37,-47]],[[2464,2222],[39,-63]],[[2503,2159],[-4,-4],[-5,-4],[-15,-15],[-27,-26],[-16,-15],[-3,-2],[-1,0],[-3,-1],[-1,0],[-8,0],[-3,1],[-3,0],[-3,0],[-3,0],[-3,-1],[-3,-2],[-2,-1],[-1,-1],[-2,-1],[-27,-26]],[[2434,2272],[30,-50]],[[6193,991],[0,1],[-6,3],[-7,0],[-7,-2],[-5,-4],[-4,-5],[-7,-4],[-10,-3],[-10,-1],[0,65],[-19,1],[-11,0],[0,45],[-18,0]],[[6089,1087],[1,75],[0,4]],[[6090,1166],[28,9]],[[6510,1298],[0,-1],[1,-4],[1,-1],[1,-3],[1,-4],[0,-2],[1,-3],[0,-3],[1,-13],[-1,-8],[-2,-4],[-3,-11],[-3,-9],[-3,-10],[-4,-14]],[[6500,1208],[-10,-10],[-31,-28],[-28,-21],[-21,-16],[-24,-15],[-25,-13],[-28,-18],[-20,-15],[-33,-25],[-17,-14],[-28,-17],[-15,-9],[-17,-11],[-10,-5]],[[6204,963],[0,9],[-2,7],[-4,7]],[[6198,986],[3,2],[7,2],[4,-2],[3,1]],[[6211,966],[-2,-1],[-5,-2]],[[6203,961],[8,4]],[[6209,957],[-3,-2],[-1,0],[-2,-1],[0,7]],[[6089,1087],[-18,0],[-18,1],[-22,0]],[[6031,1088],[1,55],[-19,-6],[-19,-6]],[[5994,1131],[-1,5],[78,24],[3,1],[16,5]],[[6031,1043],[0,45]],[[6089,1087],[1,-44],[-9,0],[0,-63]],[[6081,980],[-11,3],[-17,1],[-22,0],[0,59]],[[6031,1043],[-19,0],[1,45],[-19,0],[-20,1]],[[5975,1125],[19,6]],[[6081,980],[0,-10]],[[6081,970],[-21,1],[-6,1],[-23,4],[-14,3],[-43,5]],[[5974,986],[0,56],[0,5],[0,31]],[[5977,881],[27,-8],[22,-1],[25,4],[22,9],[7,3]],[[6080,888],[-2,-21]],[[6078,867],[-12,-6],[-21,-2],[-6,0],[-9,-3],[-7,0],[-4,-2],[-4,0],[-7,-6],[-11,-2],[-14,1],[-8,2]],[[5978,929],[3,-2],[77,-24],[22,12]],[[6080,915],[0,-4],[0,-2]],[[6080,909],[-14,-7],[-12,-5],[-12,1],[2,-3],[-1,0],[-11,1],[-21,0],[-12,1],[-12,4],[-5,2],[-4,3]],[[5975,979],[12,-4],[12,-1],[10,2],[7,0],[16,-3],[31,-7],[17,0]],[[6080,966],[0,-3],[0,-3]],[[6080,960],[-4,0],[-13,-3],[-17,-2],[-12,0],[-18,3],[-5,2],[-27,6],[-7,1],[-1,1]],[[6211,867],[-12,8],[-10,11],[-28,6],[-6,2],[-16,0],[-12,-4],[-11,-4],[-6,-4],[-1,-1],[-22,-11],[-9,-3]],[[6080,888],[5,2],[18,11],[27,16],[6,3],[6,4],[5,7],[-1,3],[3,1],[30,16],[19,6],[5,4]],[[6193,991],[-10,-5],[-26,-10],[-20,-5],[-18,0],[-22,-1],[-16,0]],[[6204,963],[-7,-1],[-8,3],[-15,-11],[-26,-15],[-3,-1],[0,1],[-10,1],[-55,-31]],[[6080,915],[59,32],[0,1],[7,4],[0,3],[16,9],[10,4],[15,10],[4,3],[3,4],[4,1]],[[6096,939],[-2,0],[-2,0],[0,3],[0,10],[6,5],[4,1],[2,3],[2,3],[4,2],[7,0],[2,1],[8,0],[5,0],[2,-8],[-3,-3],[-35,-17]],[[6080,966],[23,0],[-2,-4],[-4,0],[-17,-2]],[[4784,1039],[0,-13],[-2,-7],[-2,-9],[-8,-13],[-11,-10],[-7,-9],[-3,-17],[-3,-3],[-5,-3],[-11,-10],[-4,-2],[-8,0],[-5,-1],[-14,6],[-20,5],[-17,8],[-18,2],[-20,5],[-20,15],[-9,15],[1,8],[3,6],[4,8],[12,10],[9,13],[8,7],[4,1],[6,0],[14,-4],[15,-3],[29,3],[14,4],[17,1],[12,-4],[6,-3],[8,-3],[20,0],[5,-3]],[[8225,4853],[-8,-19]],[[8217,4834],[-17,8],[-9,-24],[-7,-19],[-14,6],[-5,-15]],[[8165,4790],[-10,5],[-26,13]],[[8129,4808],[14,37],[7,19]],[[8150,4864],[8,21]],[[8217,4834],[-16,-43],[66,-33]],[[8267,4758],[-13,-34],[-17,9],[-8,4],[-15,7],[-9,5],[-16,8],[-31,15]],[[8158,4772],[7,18]],[[8283,4824],[-7,-19],[-1,-6],[0,-17],[-8,-24]],[[8305,4738],[-22,12],[-16,8]],[[8292,4576],[-60,12],[-19,2],[-61,10],[-36,6],[-32,4],[-31,5]],[[8053,4615],[4,6],[6,11],[5,10],[6,16],[11,28],[12,33]],[[8097,4719],[1,-1],[5,-2],[4,7],[4,7],[4,9],[5,8],[4,7],[14,-7],[9,-5],[5,12],[6,18]],[[9689,9681],[2,4],[1,4],[0,3],[3,4],[5,5],[6,6],[7,7],[5,7],[1,7],[1,9],[-2,2],[-8,2],[-6,1],[-18,33]],[[9766,9812],[7,-15],[1,-6],[2,-6],[0,-3],[0,-11],[-1,-10],[-26,7],[-2,-3],[-5,-33],[-2,-9],[0,-6],[-1,-4],[-3,-6],[-6,-9],[-12,-15],[-4,-4],[-1,-2],[-2,-1],[-22,5]],[[8010,5802],[-12,-30],[-9,4],[-12,6],[-21,-39],[-15,7]],[[8504,5582],[-1,-3],[-3,-5],[-11,-28],[-12,-29],[-8,-21]],[[8703,5618],[-9,-21],[-3,-11],[-29,-91],[66,-36]],[[8728,5459],[-1,-3],[-19,-59],[0,-5],[-4,-12]],[[8544,5681],[6,-3],[1,-2],[49,-27],[4,11],[4,10]],[[8608,5670],[40,-22],[31,-17],[9,-5],[15,-8]],[[8624,5710],[-4,-10],[-4,-10],[-4,-10],[-4,-10]],[[8711,5638],[-8,-20]],[[8624,5710],[41,-22]],[[8665,5688],[31,-17],[9,-5],[14,-8]],[[8719,5658],[-8,-20]],[[8693,5758],[-8,-19],[-8,-20],[-8,-20],[-4,-11]],[[8732,5690],[-13,-32]],[[8748,5728],[-8,-19],[-8,-19]],[[8797,5653],[-9,5],[-1,1],[-21,12],[-8,4],[-17,9],[-9,6]],[[8748,5728],[9,-5],[47,-26],[9,-5]],[[8776,5602],[-40,21],[-16,10],[-9,5]],[[8797,5653],[-9,-21],[-4,-10],[-4,-10],[-4,-10]],[[8838,5592],[-13,7],[-5,-10],[-4,-10],[-40,23]],[[8845,5503],[-1,-3],[-33,-104],[-4,-12],[-4,-14],[-5,-16],[-7,-25],[-1,-3]],[[8790,5326],[-1,1],[-25,18],[-22,14],[-7,4],[-31,17]],[[8728,5459],[32,102],[4,11],[4,10],[4,10],[4,10]],[[9010,5560],[-8,-20],[8,-5],[52,-29],[10,-5],[1,-4]],[[8892,5625],[-4,-10],[-3,-10],[-4,-9],[-3,-10],[62,-35],[5,10],[3,9],[-3,1],[8,20]],[[4560,3691],[-5,-8],[-8,-8],[-11,-8],[-15,-10],[-9,-9],[-21,-19],[-8,-9],[-6,-7],[-9,-10],[-7,-8],[-10,-9],[-28,-19],[-45,-22],[-22,-16]],[[4292,3588],[10,4],[8,3],[7,3],[10,7],[6,6],[3,5],[4,8],[1,10],[3,1],[8,6],[3,4],[23,17],[6,3],[4,0],[15,-1],[14,-3],[7,-2],[0,-23],[-2,-5],[0,-1],[11,5],[8,5],[7,6],[5,3],[1,0],[3,0],[9,-4],[-1,14],[5,6],[5,0],[7,2],[7,10],[4,4],[13,14],[3,15],[2,22],[0,15],[7,20],[8,14],[8,11],[15,24],[4,5],[3,2],[11,-2],[2,2],[2,5],[9,2],[3,0],[1,-12],[2,-4],[6,4],[15,22],[18,28],[3,-3],[5,3],[8,10],[24,36],[7,20],[1,20],[6,9],[3,15],[6,15],[0,8],[2,14],[12,5],[13,6],[1,3]],[[4716,4029],[1,-5],[36,-36]],[[4404,3716],[-6,-1],[-4,5],[-5,9],[-1,9],[-4,20],[0,17],[4,7],[14,12],[6,9],[7,8],[29,19],[14,6],[8,5],[8,0],[6,-2],[5,-5],[0,-8],[0,-10],[-8,-26],[-1,-13],[-5,-29],[-4,-9],[-4,-6],[-6,-5],[-7,-10],[-5,-4],[-17,-1],[-24,3]],[[4412,3456],[-56,73]],[[9689,9681],[-1,-9],[-4,-19]],[[9684,9653],[-52,14],[-17,4],[-6,3],[-9,5]],[[9675,9602],[9,51]],[[7266,4453],[-9,-11],[-11,8],[-24,18],[-10,7]],[[8176,3051],[-3,4],[-10,8],[-2,1],[-2,2],[-3,1],[-1,1],[-4,3],[-12,10]],[[8142,5032],[-8,-21]],[[8134,5011],[-33,17],[-9,4]],[[8092,5032],[6,23],[8,22]],[[8092,5032],[-10,5],[-2,1],[-17,9],[-22,10],[-9,5]],[[8058,5129],[9,-5],[14,-7],[23,-12],[9,-5]],[[8079,4993],[-10,5],[-42,21],[-10,4]],[[8092,5032],[-7,-20],[-6,-19]],[[8066,4954],[-7,-19]],[[8079,4993],[-7,-20],[-6,-19]],[[8113,4932],[-9,4],[-28,14],[-10,4]],[[8134,5011],[-14,-39],[-7,-19],[0,-21]],[[8113,4882],[-14,6],[-39,20],[-9,4]],[[8113,4932],[0,-24],[0,-26]],[[8150,4864],[-2,1],[-28,13],[-7,4]],[[8129,4808],[-2,1],[-21,11],[-9,4]],[[8097,4824],[1,6],[1,4],[2,9],[4,10],[3,9],[-55,27],[-9,5]],[[8097,4824],[-9,5],[-48,23],[-9,5]],[[8090,4806],[-9,4],[-48,24],[-9,5]],[[8097,4824],[-7,-18]],[[8457,4942],[-32,18]],[[8479,4997],[-7,-16]],[[8472,4981],[-3,-9],[-4,-10],[-4,-10],[-4,-10]],[[8542,4944],[-10,5],[-60,32]],[[8488,5025],[10,-5],[59,-32]],[[8530,4904],[-49,26],[-24,12]],[[8503,4823],[-12,6],[-48,24],[-11,5],[-13,7]],[[8419,4865],[2,30],[1,26],[1,14],[2,25]],[[8493,4797],[-11,5],[-41,21],[-24,11]],[[8417,4834],[1,11],[0,6],[1,14]],[[8408,4789],[3,11],[2,6],[2,7],[1,4],[1,17]],[[3203,1734],[-34,59],[-4,7],[-12,21],[-26,43]],[[3167,1567],[-16,63]],[[3151,1630],[-33,129]],[[3151,1630],[-4,-1],[-9,5],[0,-3],[0,-2],[-2,-1],[-20,-8]],[[3116,1620],[-4,2],[-5,1],[-3,-2],[-9,-7]],[[3163,1566],[-8,-2],[-20,-18]],[[3135,1546],[-19,74]],[[3008,1441],[-17,-14]],[[2991,1427],[-7,28],[-7,26],[-24,-19],[-2,-2],[-2,0],[-2,1],[-8,14],[-2,3],[0,2],[2,3],[49,39]],[[3135,1546],[-19,-15],[-17,-15],[-18,-15],[-18,-14],[-17,-14],[-19,-17],[-19,-15]],[[3082,1349],[-18,-8],[-20,-9],[-16,68],[-6,12],[-4,7],[-6,9],[-4,13]],[[3193,1447],[-14,-5],[-30,-11],[-6,-4],[-4,12],[-16,-5],[-2,-2],[-1,-2],[9,-34],[-22,-10],[-10,-5],[-1,-2],[5,-22],[-19,-8]],[[3090,1320],[-3,6]],[[3087,1326],[-5,23]],[[3087,1326],[-55,-26],[-30,-12],[-9,34],[-23,-7],[-20,86],[-2,6],[4,7],[11,-7],[8,2],[20,18]],[[2757,1440],[60,-6]],[[2817,1434],[65,2],[-63,131],[30,23],[-12,21]],[[2817,1434],[-4,19]],[[2813,1453],[-6,23],[-5,16],[-1,8],[-1,9],[-2,15],[-1,9]],[[2797,1533],[-3,9],[-6,12],[-7,10],[13,11],[6,5],[7,5],[11,10],[3,3]],[[2821,1598],[3,2],[10,8],[3,3]],[[2813,1453],[-13,-4],[-35,0],[-21,0],[-37,0]],[[2707,1449],[-5,24],[-6,34],[-2,8],[-9,22],[-10,23]],[[2675,1560],[6,2],[9,3],[10,7],[25,21],[5,-7],[9,-11],[-33,-28],[-1,-2],[0,-2],[10,-19],[22,19],[1,1],[1,-1],[7,-6],[7,-10],[6,5],[7,1],[8,0],[23,0]],[[2675,1560],[-12,29]],[[2663,1589],[19,7],[14,6],[9,5],[11,9],[14,10],[12,-19],[19,17],[16,12],[11,10],[1,1],[1,0],[2,0],[1,-1],[0,-1],[28,-47]],[[2707,1449],[-20,0],[-1,1],[-1,1],[-6,32],[-1,2],[-2,0],[-18,1],[-1,-1],[-6,-9],[9,-9],[1,-3],[2,-10],[1,-4],[-1,-1],[-1,0],[-13,0],[-4,1],[-12,10],[-13,11],[-1,1],[-2,0],[-20,1],[-2,0],[-1,1],[0,1],[-1,2],[0,2],[1,17]],[[2594,1496],[0,22],[0,24],[0,17],[1,25],[21,0],[22,1],[11,1],[14,3]],[[2594,1496],[-74,0],[-20,1],[-1,26],[-17,0],[-1,0],[-1,1],[-1,3],[2,20],[-1,20],[1,3],[2,0],[15,0],[2,-2],[0,-2],[0,-23],[17,0],[3,0],[1,42],[-59,0],[-25,0],[-8,-1],[-4,-3],[-14,-10]],[[8245,3572],[-7,-14],[-13,-24],[-27,-52],[-6,-12],[-9,-17]],[[8083,4787],[-9,5],[-48,24],[-9,4]],[[8090,4806],[-7,-19]],[[8077,4769],[-10,4],[-48,24],[-9,5]],[[8083,4787],[-6,-18]],[[8102,4734],[-2,1],[-21,11],[-9,4],[-9,5],[-48,24],[-10,4]],[[8077,4769],[9,-5],[20,-10],[3,-2]],[[8109,4752],[-3,-9],[-4,-9]],[[8129,4808],[-3,-9],[-3,-10],[-4,-9],[-3,-9],[-7,-19]],[[8097,4719],[3,7],[2,8]],[[8053,4615],[-4,-7]],[[8049,4608],[-2,2],[-4,1],[-9,6]],[[7991,4747],[11,-11],[53,-27],[9,25],[-9,5],[-48,23],[-10,3]],[[8010,4543],[-12,-19]],[[7998,4524],[-2,2],[-8,6],[-5,4],[-8,6],[-10,-19]],[[7975,4486],[12,20],[11,18]],[[2944,3456],[-7,-2]],[[2937,3454],[-10,24],[-2,4],[-14,29]],[[2911,3511],[11,6],[4,1],[7,2],[7,1],[8,5],[10,6],[-6,12],[-3,6],[-8,19],[9,6],[4,3],[4,5],[5,8],[3,10],[1,7],[-1,10],[-2,7],[-13,29]],[[2951,3654],[32,-6],[34,-6],[18,-3],[3,1],[3,0]],[[2791,3388],[-15,24]],[[2776,3412],[20,11],[1,3],[-5,10],[-3,6],[-1,6],[0,6],[1,7],[1,5],[4,17],[0,9],[0,6],[-1,6],[-1,4],[-7,18],[-2,4]],[[2783,3530],[31,15],[8,5],[13,6],[11,4],[11,2],[10,1],[7,0]],[[2874,3563],[21,-5],[-1,-9],[0,-3],[8,-16],[9,-19]],[[2937,3454],[-15,-5],[-42,-10],[-31,-8],[-10,-3],[-21,-15],[-7,-6],[-20,-19]],[[2832,3313],[-14,29],[-11,22],[-16,24]],[[2978,3381],[-31,-14]],[[2947,3367],[-39,-18],[-47,-22],[-29,-14]],[[3146,3440],[-3,-3],[-5,9],[-31,-26],[-30,-22]],[[3077,3398],[-38,-27],[-27,-25],[-8,-5]],[[3004,3341],[-3,13],[-41,-17],[-12,27],[-1,3]],[[3114,3269],[-25,-12],[-11,-6],[-11,-10],[-10,-9],[-14,-18]],[[2977,3296],[-4,11],[-2,5]],[[2971,3312],[17,13],[16,16]],[[3077,3398],[6,-5],[8,-6],[-5,-10],[-3,-9],[-3,-15],[-5,-23],[8,-3],[7,-4],[5,-6],[6,-7],[4,-10],[2,-8],[7,-23]],[[3212,3327],[-3,-3],[-18,-13],[-12,-7],[-14,-11],[-13,-7],[-16,-7]],[[3136,3279],[-22,-10]],[[7576,2516],[0,11],[1,15],[-1,3],[0,4],[-2,3],[-1,3],[-3,2],[-9,8]],[[7561,2565],[-64,47]],[[7516,2500],[15,23],[14,19],[16,23]],[[7576,2516],[-3,-6],[-10,-13],[-15,-20],[-2,1],[-10,8],[-20,14]],[[7508,2419],[-10,11],[-4,1],[-2,2],[-11,8],[-3,4]],[[7478,2445],[22,32],[13,18],[3,5]],[[7478,2445],[-16,11],[-15,11],[-16,12],[-7,6],[-11,-12],[-10,3]],[[7453,2548],[33,-25],[30,-23]],[[7478,2445],[-12,-17],[-8,-12],[-61,45],[-2,3]],[[7419,2339],[-2,1],[-4,2],[-5,4],[-6,5],[-56,42]],[[7380,2304],[-5,4],[-16,12],[-8,6],[-13,9],[-22,17],[-1,1],[-4,3],[-1,1]],[[8352,4867],[10,-5],[41,-20],[3,-2],[11,-6]],[[8499,5050],[12,-7],[3,-1],[4,12],[33,-17],[4,11],[11,-6],[9,-5],[3,-1]],[[8518,5096],[11,-6],[46,-24],[9,-5],[3,-2]],[[8618,5139],[-31,-80]],[[8549,5176],[67,-36],[2,-1]],[[8569,5225],[10,-5],[48,-26],[8,-5],[3,-1]],[[8638,5188],[-10,-25],[-10,-24]],[[8587,5273],[10,-6],[48,-26],[8,-5],[3,-1]],[[8656,5235],[-9,-24],[-9,-23]],[[8674,5282],[-9,-24],[-9,-23]],[[8738,5162],[-24,13],[-9,-24],[-10,6],[-2,1],[-46,25],[-9,5]],[[8757,5065],[-41,22],[-1,0]],[[8715,5087],[8,25],[8,25]],[[8688,5005],[18,50],[9,32]],[[3733,2721],[-98,-76],[-2,-2],[-1,-1]],[[3581,2834],[10,10],[43,30],[17,11],[14,10],[-11,79]],[[3654,2974],[12,-19],[3,-15],[19,6],[-6,23],[-11,19],[17,13],[21,17]],[[3709,3018],[6,-10],[4,-26],[6,-25],[19,7],[9,-42],[3,-20],[1,-16]],[[4001,2937],[-43,-35],[-67,-54]],[[3820,2949],[18,0],[1,10],[4,10],[5,6],[27,21],[10,-17],[12,-19],[19,15],[42,34]],[[3958,3009],[32,-54],[11,-18]],[[3709,3018],[14,10],[13,2]],[[3736,3030],[21,2]],[[3757,3032],[5,1],[6,2],[8,5],[32,24],[10,-17],[10,-17],[9,-17],[3,-1],[21,17],[15,15],[14,18],[12,18]],[[3902,3080],[21,-19],[13,-15],[22,-37]],[[3757,3032],[-3,21],[77,61],[12,-16],[15,17]],[[3858,3115],[13,-13],[13,-10],[18,-12]],[[3736,3030],[-1,8],[-12,21],[-3,11],[-4,31]],[[3716,3101],[19,6],[11,6],[70,55]],[[3816,3168],[13,-12],[8,-11],[2,-4],[11,-16],[8,-10]],[[3711,3146],[6,2],[5,2],[6,4],[3,3]],[[3731,3157],[42,32],[18,13]],[[3791,3202],[7,-13],[8,-11],[10,-10]],[[3749,3291],[2,-2],[2,-4],[5,-51],[0,-3],[-2,-2],[-24,-19],[-1,-42],[0,-11]],[[3774,3298],[3,-35]],[[3777,3263],[3,-22],[3,-18],[8,-21]],[[3855,3198],[-39,-30]],[[3777,3263],[14,2],[64,-67]],[[3915,3234],[-44,-23],[-16,-13]],[[3826,3326],[-2,-2],[-16,-11],[-3,-2],[-5,0],[-1,-15],[17,-20],[50,-55],[35,24],[1,1],[0,-1],[7,-8],[6,-3]],[[7262,826],[76,80],[2,2],[2,2],[3,3],[3,4],[5,6]],[[7113,915],[-45,0],[5,21],[54,0],[9,14],[6,10],[2,4]],[[7074,872],[-36,-38]],[[7028,842],[27,93],[-19,1],[7,24],[1,5]],[[6616,5393],[12,28],[8,17],[17,33],[9,19]],[[6572,5425],[9,27],[2,4],[5,12],[9,18],[9,18]],[[6606,5504],[10,18]],[[6572,5425],[-4,3],[-35,24],[-16,11],[-3,2]],[[6514,5465],[7,23],[4,10],[5,10]],[[6530,5508],[9,18],[9,18]],[[6548,5544],[58,-40]],[[6548,5544],[10,19]],[[6558,5563],[9,17],[12,26],[2,3],[9,17]],[[6530,5508],[-58,40]],[[6472,5548],[9,18],[9,19],[9,18]],[[6499,5603],[59,-40]],[[6499,5603],[6,12],[3,6]],[[6508,5621],[2,4],[11,21],[2,3],[8,18]],[[6455,5505],[-46,32]],[[6409,5537],[10,22],[5,11],[4,8],[6,12],[12,25]],[[6446,5615],[12,23],[6,13]],[[6464,5651],[44,-30]],[[6472,5548],[-6,-9],[-3,-10],[-8,-24]],[[2503,2159],[29,-49]],[[2503,2159],[10,10],[0,3],[10,-18],[16,13],[65,56],[-12,19],[15,13]],[[2607,2255],[16,14],[17,14],[16,14],[18,-29],[11,-18],[62,54]],[[2747,2304],[51,44],[4,-4],[5,5],[15,13],[3,3]],[[2825,2365],[3,-4]],[[2464,2222],[11,13],[30,25],[10,-18],[6,5],[8,8],[10,14],[21,41]],[[2560,2310],[8,-5],[9,-7],[7,-8]],[[2584,2290],[12,-17],[11,-18]],[[2389,2380],[2,-3],[2,-4],[2,-3],[11,-18],[22,-37],[52,43],[16,14]],[[2496,2372],[17,-28],[5,-6],[8,-6],[17,-11],[17,-11]],[[2536,2504],[3,-5],[3,-6]],[[2542,2493],[-31,-26]],[[2511,2467],[-48,-40],[6,-11],[27,-44]],[[2511,2467],[10,-19],[11,-18],[11,-18],[-15,-13],[18,-30],[1,-2],[-10,-14],[-2,0],[-3,1],[-4,5],[-16,26],[-16,-13]],[[2542,2493],[12,9],[7,4],[9,-22],[17,-28],[5,-6],[20,-14],[4,-3],[4,-4],[6,-4],[7,-12],[13,-21],[6,-5],[4,-2]],[[2656,2385],[-6,-12],[-2,-8]],[[2648,2365],[-4,-19],[-2,-6],[-3,-3],[-55,-47]],[[2734,2450],[-13,-7],[-4,-3],[-33,-28],[-19,-15],[-6,-7],[-3,-5]],[[2760,2473],[-3,-3],[-23,-20]],[[2714,2357],[-32,-28],[-20,7],[3,13],[1,6],[1,5],[-19,5]],[[2734,2450],[19,-32],[12,-18],[-36,-30],[-15,-13]],[[2747,2304],[-11,18],[-11,17],[-11,18]],[[2760,2473],[65,-108]],[[2779,2488],[43,-69],[3,-4],[4,0],[18,15],[3,5],[8,20],[14,13],[-8,14],[21,17],[18,16]],[[2883,2571],[3,-6],[9,-15],[2,-12],[2,-12],[4,-11]],[[2923,2611],[16,21]],[[2852,2767],[8,-13],[7,-4],[27,-18],[-3,-7],[-9,-14],[-15,-16]],[[2920,2824],[11,-19],[-46,-40],[18,-12],[22,18],[3,-1],[13,-18],[8,-8],[8,-6],[18,-8],[20,-9]],[[8244,3448],[38,-30],[6,11],[-2,10],[8,14],[10,21],[-1,2],[-6,4],[-25,19],[-28,-51]],[[7803,1101],[-31,8]],[[7772,1109],[2,12],[4,23],[5,22],[3,23]],[[7786,1189],[73,-20],[14,20],[13,20],[9,12]],[[7934,1216],[-32,-44],[-37,-53],[-20,-28]],[[7845,1091],[-42,10]],[[7786,1189],[5,22],[4,23],[2,10]],[[7772,1109],[-64,17]],[[7708,1126],[2,12],[5,23],[4,22],[4,23],[4,22],[-38,10],[4,23],[-58,15],[-9,4]],[[7701,1092],[4,23],[3,11]],[[7803,1101],[-7,-10],[-10,-21],[-9,-17],[-6,-14],[-5,-7],[-42,11],[-31,8],[4,21],[4,20]],[[7566,1164],[142,-38]],[[7701,1092],[-71,19]],[[7554,1166],[3,8],[28,59],[15,39],[1,1],[4,7]],[[7590,1280],[-53,-106],[0,-2]],[[7716,979],[17,18],[16,18],[-99,26]],[[7845,1091],[-8,-11],[-20,-25],[-26,-29],[-16,-10],[-15,-19],[-10,-8],[-8,-6],[-5,-12]],[[8099,2087],[-4,-70]],[[8056,2451],[35,35],[43,45]],[[8031,2526],[9,13],[2,6],[1,8],[2,8],[7,8],[7,10],[7,12],[2,2]],[[8101,2562],[16,-15],[17,-16]],[[5497,3222],[4,6],[31,42]],[[5532,3270],[7,-9],[4,-5],[4,-11],[14,7],[2,3],[14,18],[2,0],[3,-1],[14,-14],[15,-15]],[[5529,3272],[3,-2]],[[5488,3325],[29,35],[13,-14],[-18,-25],[13,-15]],[[5525,3306],[-12,-18]],[[5569,3320],[-37,-50]],[[5525,3306],[26,32]],[[5551,3338],[16,-16]],[[5567,3322],[2,-2]],[[5490,3360],[23,30],[3,0],[39,-41],[1,-3],[-5,-8]],[[5476,3373],[33,45]],[[5509,3418],[61,-67],[-3,-29]],[[5489,3439],[20,-21]],[[5532,3446],[-23,-28]],[[5550,3518],[20,-22],[-38,-50]],[[5584,3482],[-38,-50]],[[5546,3432],[-14,14]],[[5614,3520],[-2,-3],[-17,-21],[-11,-14]],[[5584,3482],[14,-15],[-24,-33],[14,-14],[25,32],[14,-16]],[[5627,3436],[-15,-19],[-24,-30],[-42,45]],[[5627,3436],[28,37],[2,2]],[[5675,3458],[-3,-4],[-43,-56],[-38,-49]],[[5663,3327],[-22,-31]],[[5710,3422],[-3,-4],[-7,-9],[-23,-28],[-13,-18],[-3,-4],[-12,-17],[14,-15]],[[5748,3274],[-2,2],[-16,16],[-36,36],[-6,3],[-8,2],[-8,-3],[-9,-3]],[[7316,2249],[-2,5],[-53,39],[-3,2],[-11,9]],[[7352,2281],[-2,-2],[-15,-13],[-2,-2],[-17,-15]],[[7415,2207],[-10,7],[-35,27],[-2,1],[-9,7],[-8,-9],[-20,-25],[-14,-17]],[[7317,2198],[-14,-17],[-14,-17]],[[7289,2164],[-35,27],[-3,2]],[[7251,2193],[8,7],[8,7],[17,14],[17,15],[15,13]],[[7369,2159],[-8,6],[-11,8],[-23,17],[-10,8]],[[7307,2125],[-7,5],[-5,3],[-20,15]],[[7275,2148],[7,8],[7,8]],[[7154,2101],[18,15],[18,16],[32,-24],[4,-2],[9,-7],[13,18],[5,7],[8,9],[7,7],[7,8]],[[7246,2196],[17,15],[16,14],[-66,50]],[[4915,4124],[-9,-12],[-14,-10],[-17,-7],[-23,-10],[-18,-11],[-17,17],[-13,13],[-17,-21],[-15,-17]],[[4716,4029],[2,3],[2,7],[3,14],[1,14],[3,13],[4,8],[5,6],[7,8],[8,6],[7,0],[2,-1],[11,-11],[6,-1],[16,17],[26,27],[6,6],[6,15],[9,20],[9,16],[5,9],[16,19],[5,5],[13,-6],[8,0],[8,3],[8,7],[18,11],[7,5],[13,10],[9,10],[0,2],[-3,2],[-2,2],[-2,3],[-1,3],[4,7],[3,7],[5,1],[8,15],[4,1],[6,1]],[[4981,4313],[12,-15],[3,-4],[4,-3],[5,-4],[6,-3]],[[5011,4284],[2,-2],[13,-12],[2,-3],[13,-14],[11,-13],[4,-6],[3,-5]],[[5059,4229],[-10,-9],[-7,-8]],[[5042,4212],[-18,-9],[-13,-7],[-23,-12],[-29,-16],[-12,-6],[-2,-1],[-2,-1],[-4,-3],[-9,-10],[-15,-23]],[[5110,4308],[-9,-9],[-13,-19],[14,-14]],[[5102,4266],[-19,-30],[-12,13],[-12,-20]],[[5011,4284],[2,10],[-4,1],[5,28],[1,2],[2,2],[4,0],[4,-3],[4,-4],[4,-3],[14,-3],[2,1],[1,1],[8,11],[17,-17],[15,20],[20,-22]],[[5120,4314],[-10,-6]],[[4981,4313],[5,1],[5,1],[3,8],[1,10],[1,6],[3,17],[2,4],[6,6],[15,18],[13,17],[11,13]],[[5046,4414],[2,-4],[8,-9]],[[5056,4401],[50,-52],[28,-30],[-14,-5]],[[5120,4314],[25,-26]],[[5168,4263],[-15,-19],[-13,-18],[-38,40]],[[5056,4401],[16,20],[49,-52],[14,19],[-5,6],[12,18],[14,19],[48,-49],[5,6],[3,5],[3,5],[2,-2]],[[5046,4414],[17,20],[1,0],[34,25],[12,5],[10,6],[16,2],[8,1],[2,1],[5,2],[17,2],[13,0],[14,0],[1,-3],[-2,-8],[0,-7],[5,-17],[1,-5],[0,-3],[-3,-3],[-7,-6],[-3,-7],[-1,-2],[1,-8],[8,-4],[7,-1],[4,-1],[-3,10],[0,10],[0,9],[3,13],[0,10],[1,10],[1,5],[3,3],[2,4],[3,2],[0,2],[5,4],[6,0],[6,2],[6,4],[8,2],[5,4],[3,8],[8,6],[9,3],[5,3],[3,5],[6,6],[19,24],[3,4]],[[5308,4556],[8,-8],[7,-8],[3,-3]],[[5326,4537],[-3,-4],[-8,-13],[-16,-17],[-17,-17],[-14,-15]],[[5268,4471],[-15,-17],[-14,-15],[-5,-6],[-3,-5],[-2,-4],[-1,-2]],[[5177,4187],[-20,21],[-2,2],[-16,-21]],[[5139,4189],[-41,36],[-16,-22]],[[5082,4203],[-5,6],[-4,4],[-4,4],[-3,4],[-7,8]],[[6601,1293],[-5,-3],[-3,-2],[-7,-5],[-29,-23],[-33,-30],[0,-5],[-2,-1],[-2,-2],[-2,-1],[-2,-2],[-4,-3],[-8,-5],[-4,-3]],[[6461,1364],[7,14],[6,14]],[[6521,1212],[1,2]],[[5409,4205],[-44,-59],[-1,-2],[-12,-16]],[[5352,4128],[-40,41],[-3,0],[-3,-1],[-22,-28]],[[5304,4210],[11,-11],[8,-9],[44,59]],[[5367,4249],[42,-44]],[[5348,4270],[11,-12],[8,-9]],[[5359,4285],[12,16]],[[5371,4301],[62,-64]],[[5433,4237],[-13,-17],[-11,-15]],[[5371,4301],[14,17],[13,18],[13,16]],[[5411,4352],[13,18]],[[5424,4370],[62,-64]],[[5486,4306],[-14,-18]],[[5472,4288],[-12,-16],[-13,-18],[-14,-17]],[[5297,4350],[12,16],[13,18],[13,16],[9,3],[16,2],[32,-33],[19,-20]],[[5447,4399],[-10,-12],[-13,-17]],[[5268,4471],[40,-41],[12,16],[15,19],[32,-34],[16,19],[6,9],[7,8],[22,-6],[28,-28],[-14,-19],[15,-15]],[[5488,4445],[-4,-4],[-2,-2],[-13,-16],[-17,-19],[-5,-5]],[[5326,4537],[2,-2],[1,-1],[9,-9],[3,-3],[4,-3],[3,-2],[2,-2],[3,-2],[3,-2],[5,-4],[7,-4],[2,-1],[2,-1],[6,-3],[7,-3],[9,-3],[5,-2],[4,-2],[5,-1],[4,-1],[3,-1],[3,-1],[4,-1],[4,-2],[3,-1],[3,-1],[3,-1],[3,-1],[3,-1],[3,-2],[4,-1],[3,-2],[2,-2],[3,-1],[4,-2],[3,-2],[3,-2],[3,-2],[3,-2],[2,-1],[2,-2],[3,-3],[4,-3],[2,-2],[3,-2]],[[5482,4531],[22,-22],[19,-20],[1,-2]],[[5524,4487],[-19,-22],[-8,-10],[-9,-10]],[[5326,4537],[15,23]],[[5341,4560],[20,-21],[13,-12],[6,-6],[27,30],[14,13],[22,-21],[9,18],[15,-15],[15,-15]],[[5432,4607],[60,-62]],[[5492,4545],[-10,-14]],[[5341,4560],[12,18],[17,26],[23,19],[29,-29],[10,13]],[[5432,4607],[3,4],[4,5],[4,5],[9,12],[3,0],[3,0],[4,2],[1,2],[1,2],[56,-54]],[[5520,4585],[-2,-4],[-15,-21],[-11,-15]],[[5463,4686],[11,-10],[26,-15],[51,-30]],[[5551,4631],[-1,-3],[-11,-15],[-19,-28]],[[5308,4556],[1,2],[12,19],[9,15],[9,12],[3,11],[9,15],[14,15],[3,-3],[2,2],[-3,3],[2,3],[2,5],[2,7],[3,9],[4,16],[2,3],[4,5],[5,2],[5,0],[7,1],[7,9],[2,1],[14,0],[6,1],[3,2]],[[5620,4619],[-10,-22]],[[5610,4597],[-26,15],[-33,19]],[[5571,4675],[-10,-22],[59,-34]],[[5659,4720],[-8,-23],[0,-3],[-8,-21],[-2,-3],[-3,-7]],[[5638,4663],[-8,-21]],[[5630,4642],[-10,-23]],[[5627,4760],[-9,-23],[18,-10],[-8,-20],[12,-10],[4,-2],[2,3],[6,17],[3,4],[4,1]],[[5742,4702],[-9,-25],[-51,27],[-7,-18],[-4,-3],[-4,-1],[-10,6],[-2,3],[0,3],[6,17],[1,5],[-3,4]],[[5667,4740],[75,-38]],[[3044,2793],[-25,-21],[-8,-9],[-6,-12],[-3,-7]],[[2920,2824],[16,13]],[[7282,7043],[16,13],[31,26],[19,17],[14,7],[8,7],[11,10],[14,13]],[[7271,7060],[-32,51],[-11,16]],[[7228,7127],[26,22],[20,18],[30,26],[7,7],[6,5],[8,6],[15,13]],[[7212,7062],[-23,35]],[[7189,7097],[13,11]],[[7202,7108],[14,11],[2,0],[8,6],[2,2]],[[7202,7108],[-14,22]],[[7188,7130],[23,19],[2,2]],[[7213,7151],[15,13],[-44,70]],[[7213,7151],[-33,51]],[[7180,7202],[-11,19]],[[7188,7130],[-32,52]],[[7156,7182],[22,18],[2,2]],[[7189,7097],[-2,-3]],[[7187,7094],[-47,74]],[[7140,7168],[16,14]],[[9437,6162],[2,-8],[3,-1],[-21,-80],[-3,2],[-3,0],[-1,-4],[-2,-7],[-1,-4]],[[9221,5808],[-2,1],[-8,5],[-26,14],[-52,28],[-9,6],[-41,22],[-17,9],[8,21],[47,-26],[11,-6],[8,21],[89,-49],[11,-5],[2,-2]],[[5690,1018],[1,-12],[3,-1],[0,-4],[-1,-2],[-5,0],[-1,1],[-1,4],[0,8],[-1,6],[-13,1],[-6,-6],[-1,-2],[6,-2],[0,-2],[-12,2],[-1,-5],[-10,2],[-23,-10],[-1,3],[15,8],[-18,28],[-6,6],[-7,3],[-8,2],[-7,1],[-6,2],[-12,8],[-14,9],[-5,2],[-12,6],[-12,3],[-7,1],[-4,1],[-4,0],[-14,1],[-3,2],[-1,4],[-4,2],[-6,1],[-6,3],[-7,-3],[-9,5],[-3,0],[-8,4],[-5,-1],[-11,-6],[-2,0],[-11,1],[-6,-5],[-23,13],[-22,15],[-20,11],[-6,3],[-3,-1],[-10,0],[-3,-1],[-9,-3],[-10,1],[-6,1],[-8,3],[-10,4],[-12,0],[-3,2],[-3,1],[-16,7],[-5,6],[-9,15],[-6,5],[-6,0],[-14,4],[-3,2],[-4,2],[-25,7],[-46,16],[-14,2]],[[5122,1221],[2,1],[1,-1],[1,-1]],[[5126,1220],[9,-2],[17,1],[11,1],[11,-5],[10,-3],[12,-2]],[[5196,1210],[9,-2],[10,-4]],[[5215,1204],[13,-7],[6,-7],[8,-12],[9,-18],[6,-11],[8,-4],[25,-8],[12,-2],[20,-2]],[[5322,1133],[20,5],[9,3],[12,6],[11,5],[11,0]],[[5385,1152],[11,-3],[12,-6]],[[5408,1143],[2,-3],[0,-1],[3,-5],[2,-2],[3,-3],[2,-3],[4,-4],[5,-4],[17,-10],[-4,33],[21,3],[13,1],[11,2]],[[5408,1143],[-2,37],[26,3],[-8,108]],[[5424,1291],[26,-10],[27,-9]],[[5385,1152],[-13,159]],[[5372,1311],[23,-9],[29,-11]],[[5326,1327],[22,-8],[14,-4],[1,-1],[9,-3]],[[5322,1133],[-9,92],[-20,-2],[-6,85]],[[5287,1308],[20,0],[21,-1],[-2,20]],[[5215,1204],[1,3],[0,17],[-1,6],[-2,3],[3,2],[9,15],[3,9],[-1,12],[-4,24],[22,5],[19,6],[23,2]],[[5196,1210],[-13,64],[-18,99],[23,-9],[-3,16]],[[5185,1380],[23,-9],[26,-9],[12,-5],[18,-7],[19,-7],[21,-8],[22,-8]],[[5126,1220],[-1,8],[11,2],[-29,168],[0,4]],[[5107,1402],[10,-1],[3,3],[17,-6]],[[5137,1398],[25,-10],[23,-8]],[[5318,1421],[8,-94]],[[5137,1398],[2,2],[-3,14]],[[5136,1414],[20,4]],[[5156,1418],[11,3],[11,-1],[20,1],[23,-1],[13,1],[22,0],[21,-1],[20,1],[21,0]],[[5310,1509],[8,-88]],[[5156,1418],[-20,106],[12,0],[12,-10],[21,0],[21,0],[68,-3],[21,-1],[19,-1]],[[5438,1423],[-26,-2]],[[5412,1421],[-2,1],[-24,0],[-22,-1],[-24,1],[-22,-1]],[[5310,1509],[22,-1],[22,-2],[18,-1],[19,0],[20,-1],[20,-1],[3,-24],[4,-56]],[[5512,1502],[7,-83]],[[5519,1419],[-21,-2],[-19,2],[-20,5],[-21,-1]],[[5136,1414],[-18,88],[-1,3],[-4,22],[-1,6],[-1,4],[-1,4],[-2,4]],[[5108,1545],[0,5]],[[5424,1291],[-3,29],[-9,101]],[[5519,1419],[8,-100]],[[5107,1402],[-24,112],[1,15],[-1,5],[-2,4],[-1,3],[-2,6],[30,-2]],[[5107,1402],[-14,5]],[[5093,1407],[-4,15],[-8,40]],[[5081,1462],[-11,63],[0,1],[-1,1],[-1,1],[-36,1],[14,-76]],[[5046,1453],[6,-31]],[[5052,1422],[-43,16],[-5,2],[-18,6],[-18,7],[-5,2],[-71,26]],[[2859,3223],[3,4],[16,13],[9,5],[2,2],[48,38],[16,11],[18,16]],[[6514,5465],[-59,40]],[[6491,5396],[-20,14],[-18,12],[-20,15]],[[6433,5437],[6,16],[1,4],[7,20],[7,23],[1,5]],[[6514,5465],[-2,-4],[-7,-23],[-7,-21],[-7,-21]],[[6530,5369],[-20,13],[-19,14]],[[6408,5362],[9,25]],[[6417,5387],[16,50]],[[6417,5387],[-21,14],[-21,14],[-16,12]],[[6359,5427],[12,25],[9,21]],[[6380,5473],[15,-11],[13,-9],[5,-3],[20,-13]],[[6384,5295],[-9,5],[-43,20],[-9,5]],[[6323,5325],[8,23],[8,22],[7,22]],[[6346,5392],[13,35]],[[6346,5392],[-20,10],[-18,9]],[[6308,5411],[12,43]],[[6320,5454],[20,-13],[6,11],[17,33],[17,-12]],[[6323,5325],[-36,17]],[[6287,5342],[7,24],[7,22],[3,11],[4,12]],[[6287,5342],[-5,2],[-22,12],[-6,8],[-10,10]],[[6244,5374],[9,8],[3,2],[7,5],[6,5],[6,7],[6,22],[10,29],[0,1],[1,2],[1,2],[1,3],[1,4],[2,6]],[[6297,5470],[18,-13],[5,-3]],[[6244,5374],[-4,6],[-4,1]],[[6236,5381],[13,20],[4,8],[2,13],[4,29],[-4,11],[-2,22],[-2,12],[1,2],[5,7],[5,6],[5,6],[2,8],[3,13],[0,5],[0,6],[2,20],[0,1],[-1,4],[0,7],[-6,10],[5,4],[5,4],[4,6],[3,10],[-1,3],[-3,3]],[[6289,5624],[4,-4],[7,-5],[4,-4],[4,-3],[3,-3],[3,-2],[5,-3]],[[6319,5600],[-1,-5],[-1,-5],[-1,-9],[2,-15],[0,-8],[-2,-11],[0,-6],[-2,-23],[-6,-18]],[[6308,5500],[-5,-13],[-6,-17]],[[6319,5600],[4,-3],[13,-9],[16,-11],[2,-2],[3,-1]],[[6357,5574],[-1,-4],[-4,-13],[-9,-27],[-13,-43],[-5,3],[-17,10]],[[6357,5574],[12,-10],[21,-15],[19,-12]],[[6357,5574],[10,34],[7,24],[-4,2]],[[6370,5634],[8,28]],[[6378,5662],[5,-4],[63,-43]],[[2766,3246],[18,13],[3,-4],[14,-10],[30,24],[5,-8],[6,-10],[16,9],[14,5],[6,2],[6,0],[6,0],[5,1],[4,2],[43,33],[-4,9],[-2,4],[-3,7],[-1,1],[-1,0],[-1,0],[-7,-4],[-4,-2],[-4,10],[-1,2],[-2,0],[-23,-10],[-49,-24],[-7,13],[-1,4]],[[2757,3266],[11,7],[7,5],[15,10],[13,8],[12,8],[11,5],[6,4]],[[2693,3331],[20,8],[17,8],[16,9],[13,8],[10,6],[9,7],[7,5],[6,6]],[[2666,3320],[-9,19],[-6,16],[-2,7],[-2,9],[1,10],[1,8]],[[2649,3389],[6,13],[6,8],[6,6],[5,4],[6,3],[28,9],[4,1],[10,0],[4,1],[6,3],[7,2],[6,2],[7,0],[16,0]],[[2766,3441],[0,-6],[2,-6],[8,-17]],[[2608,3491],[18,-40],[2,-7],[2,-6],[0,-8],[1,-11],[1,-4],[2,-8],[4,-7],[4,-5],[7,-6]],[[2705,3480],[9,-19],[20,2],[10,2],[4,1],[10,7],[7,3],[4,0],[2,-4],[-4,-22],[-1,-9]],[[2591,3556],[20,0],[25,0],[4,-18],[8,3],[6,4],[11,-25],[8,-17],[8,-18],[7,-16],[17,11]],[[2705,3480],[-7,15],[-15,34],[-1,4],[0,5],[0,5],[1,5],[3,10],[1,3],[2,2],[3,1],[5,0],[19,0],[2,7],[2,6],[3,4],[4,4],[7,4]],[[2734,3589],[5,-11],[27,-59],[17,11]],[[2709,3645],[15,-33],[10,-23]],[[2633,3686],[0,-4],[0,-3],[2,-6],[2,-4],[5,-2],[4,-1],[4,0],[19,2],[5,0],[4,0],[2,0],[2,0],[2,-1],[4,-1],[7,-4],[6,-5],[4,-6],[4,-6]],[[2709,3645],[17,11],[9,-20],[15,7],[15,6],[14,3],[13,2],[16,1]],[[2808,3655],[17,-35],[9,-21],[16,9],[3,1],[21,-46]],[[2792,3704],[-5,-26],[9,1],[6,0],[7,-1]],[[2809,3678],[-2,-12],[-1,-5],[2,-6]],[[2809,3678],[20,-3],[-1,-13],[9,-19],[6,5],[2,1],[38,-7],[2,-2],[1,-2],[-3,-19],[0,-8],[0,-5],[1,-6],[3,-5],[3,-5],[5,-3],[6,-3],[6,-1],[7,1],[5,1],[19,12],[3,2],[3,5],[1,5],[0,3],[-8,18],[-2,2],[-2,1],[-24,4],[-2,1],[-2,3],[3,20],[43,-7]],[[6797,6703],[-2,3],[-5,7],[-5,8],[-35,55]],[[6750,6776],[2,15],[1,11],[0,3],[2,33],[0,6],[2,7],[5,16],[55,-88],[2,-3]],[[6819,6776],[11,-17]],[[6830,6759],[-17,-14],[-6,-5],[-4,-16],[-6,-21]],[[6841,6621],[-2,4],[-12,20],[-7,10],[-25,40]],[[6795,6695],[2,8]],[[6830,6759],[39,-63],[26,-40],[2,-4]],[[6791,6593],[-2,4],[-18,29],[4,13],[4,11],[8,22],[2,6],[6,17]],[[6841,6621],[-16,-9],[-16,-9],[-18,-10]],[[6710,6627],[2,3],[2,5],[4,13],[2,6],[1,5],[2,7],[3,9],[6,12],[1,4]],[[6791,6593],[-10,-6],[-7,-4],[-1,-1],[-8,-7],[-6,-5]],[[6859,6594],[-14,-12],[-15,-13],[-13,-12],[-1,-2],[1,-2],[15,-22],[20,-31]],[[5727,3208],[-18,18],[-16,18],[-13,-17],[-2,-2],[-20,20],[-14,16]],[[3136,3279],[9,-25],[4,-14],[2,-11],[4,-23],[6,-11],[-17,-13],[10,-17],[-41,-33],[0,-3],[9,-15],[12,-19]],[[3134,3095],[-7,-6],[-19,-8]],[[3267,3231],[-3,-2],[-32,-25],[-10,-9],[-5,-6],[-6,-9]],[[3211,3180],[-18,-29],[-5,-7],[-10,-12],[-9,-9],[-35,-28]],[[3346,3097],[-3,-2],[-23,-19]],[[3320,3076],[-12,21],[-17,28],[-10,18],[-44,-34],[-30,24]],[[3207,3133],[20,33],[-16,14]],[[3320,3076],[-37,-30],[-26,-20],[-4,-2],[-9,0]],[[3244,3024],[-4,1],[-23,2]],[[3217,3027],[1,13],[-10,18],[15,12],[15,12],[-17,14],[-23,18],[-1,3],[10,16]],[[3305,2980],[-6,3],[-5,0],[-5,-1],[-18,-14],[-8,-6],[-76,-61],[-12,21]],[[3175,2922],[-10,17],[56,46],[1,18],[19,-2],[3,23]],[[3385,3031],[-4,-2],[-26,-12],[-5,0],[-34,-27],[-11,-10]],[[3143,2978],[38,30],[21,18],[5,1],[10,0]],[[3175,2922],[-15,-13],[-40,-33],[-2,1],[-31,53],[-7,-3],[-9,-6],[-2,-2]],[[3305,2980],[42,-70],[29,-52],[8,-15],[7,-19],[2,-11],[1,-11],[-3,-44],[1,-11],[2,-8],[4,-11],[4,-9],[2,-3]],[[3385,3031],[19,-32],[15,-23],[10,-13],[21,-20],[18,-21]],[[3468,2922],[29,-47],[30,-51],[3,-4]],[[3487,3068],[-4,-9],[-1,-9],[-1,-8],[2,-9],[2,-9],[12,-30],[8,-22],[9,-23]],[[3514,2949],[-6,-1],[-9,-4],[-12,-7],[-19,-15]],[[3514,2949],[10,1],[7,-1],[6,2],[7,3],[19,16],[20,15],[7,8],[15,21]],[[3605,3014],[21,-35],[4,-6]],[[3630,2973],[2,-3],[4,-9]],[[3636,2961],[-2,-7],[-2,-6],[-2,-4],[-6,-4],[-8,-6],[-21,-17],[-16,-13],[-22,-16],[-5,-5]],[[3653,3081],[-7,-7],[-5,-7]],[[3641,3067],[-15,-22],[-21,-31]],[[3641,3067],[22,-21],[5,-6],[0,-3],[2,-1],[2,0],[5,-16],[-19,-20],[-18,-18],[-10,-9]],[[3654,2974],[-8,-7],[-10,-6]],[[7252,7640],[11,-18],[2,-1],[1,0],[6,5],[2,1],[2,-1],[36,-56],[2,-3]],[[7336,7636],[-6,-9],[-7,-6],[-12,-11],[15,-24],[2,-3],[-14,-16]],[[7350,7614],[-13,-15],[2,-3],[16,-26]],[[7382,7644],[12,-19],[10,-15],[3,-5],[4,-8],[6,5],[7,-4],[2,-1],[1,-2],[19,-29],[12,-19]],[[7413,7680],[11,-17],[65,-97]],[[7452,7720],[15,-18],[11,-18],[34,-51],[15,-23]],[[7488,7751],[2,-3],[17,-26],[53,-84]],[[3946,3282],[-1,-13],[-1,-6],[0,-3],[-1,-1]],[[3943,3259],[-2,-4],[-6,-6],[-19,-14],[-1,-1]],[[4021,3259],[-17,-18],[-3,-1],[-2,-2],[-4,2],[-10,15],[1,1],[1,2],[0,3],[-1,1],[-3,1],[-4,-1],[-1,2],[-13,12],[-2,2],[-3,1],[-3,2],[-4,0],[-7,1]],[[4067,3169],[-94,77],[-30,13]],[[4166,3063],[-35,-28],[-6,-5],[-3,-2],[-120,-88],[-1,-3]],[[3907,1823],[-3,14],[-13,51],[-5,6],[-2,33],[-3,8],[0,7],[-2,13],[-3,11],[-2,5],[0,6],[-6,13],[2,4],[-11,48],[-2,3],[-7,13],[-17,29]],[[3864,1825],[1,18],[0,24],[0,24],[-20,1],[-5,0],[-21,-7]],[[3819,1885],[-3,12],[-11,15],[-1,3],[-11,49],[-19,-6],[-20,-7],[-4,19],[16,15],[1,2],[-1,3],[-6,17],[-2,1],[-2,1],[-18,-14],[-8,-7],[-7,-5],[-21,-17],[-3,-28],[-10,2],[-8,-3]],[[3819,1885],[-19,-6],[-10,-3],[-9,-2],[-6,-2],[1,-12],[0,-9],[4,-14],[-46,-15],[-3,1],[-1,2],[-5,22],[-11,-3],[-5,-3],[-5,-5]],[[7893,7399],[48,53]],[[7941,7452],[37,43],[3,4],[51,58],[19,20],[19,21],[54,59],[33,35],[13,15]],[[7878,7584],[-12,-15],[15,-23],[3,-6],[5,-8],[8,-12],[17,-26],[24,-38],[3,-4]],[[7765,7647],[2,-3],[12,-20],[20,24],[10,-16],[2,-1],[2,1],[19,24],[12,-18],[18,-29],[16,-25]],[[7967,7659],[-44,-55],[-2,0],[-1,1],[-11,16],[-31,-37]],[[7805,7698],[2,-3],[13,-20],[12,15],[42,-66],[13,17]],[[7887,7641],[15,18],[15,19]],[[7917,7678],[16,-26],[21,26],[13,-19]],[[7861,7768],[2,-3],[12,-20],[13,-20]],[[7888,7725],[-16,-20],[-14,-18],[29,-46]],[[7888,7725],[13,16],[29,-46]],[[7930,7695],[-13,-17]],[[7958,7730],[-14,-18],[-14,-17]],[[7917,7839],[2,-3],[13,-20]],[[7932,7816],[-16,-20],[42,-66]],[[7958,7730],[16,19]],[[7974,7749],[16,-26],[11,-16],[0,-4],[-34,-44]],[[7989,7819],[-33,-42],[18,-28]],[[7932,7816],[12,-19],[32,40],[1,2],[-1,2],[-11,17],[14,16]],[[6340,5706],[-4,-13],[15,-9],[9,-8],[-9,-28],[2,-2],[17,-12]],[[6395,5712],[-3,-7],[-2,-5],[-4,-12],[-8,-26]],[[6403,5730],[5,-3],[8,-5],[2,-2],[45,-31]],[[6463,5689],[5,-2],[2,-1],[-1,-3],[-3,-20],[-2,-12]],[[6431,5791],[4,-4],[2,-2],[7,-5],[49,-34]],[[6493,5746],[-10,-20],[-3,-5],[-7,-14],[-2,-4],[-8,-14]],[[6493,5746],[8,-6],[42,-28],[8,-6]],[[6493,5746],[10,20],[11,23],[12,22]],[[6526,5811],[51,-36],[7,-5]],[[6450,5833],[5,9],[6,13]],[[6461,5855],[4,-3],[61,-41]],[[6461,5855],[9,20],[6,15]],[[2038,2561],[8,17],[8,12],[7,6],[9,12],[8,6],[5,2],[12,15],[4,1],[7,-7],[6,0],[1,4],[-3,8],[-1,23],[1,10],[3,14],[2,7],[8,9],[10,13],[2,2],[-2,8],[-5,6],[0,2],[-2,14],[1,7],[10,14],[5,-3],[1,-4],[1,-2],[-5,-17],[-3,-2],[-1,-4],[1,-4],[3,2],[9,9],[1,5],[1,5],[-2,8],[-2,4],[0,1],[-1,10],[7,12],[4,5],[6,4],[5,7],[5,3],[3,2],[3,1],[3,2]],[[2181,2810],[2,-3],[30,-39],[3,-1],[9,-12],[4,-6]],[[2181,2810],[3,3],[1,5],[7,5],[3,2],[3,6],[3,2],[5,3],[2,1],[3,-1],[9,-7],[10,-4],[5,0],[7,2],[14,13],[4,0],[4,0],[4,2],[6,0],[4,4],[5,7],[1,2],[19,11],[3,1],[9,0],[4,2],[3,2],[7,8]],[[2329,2879],[0,-1],[6,-13],[9,-23],[9,-15],[-7,-10]],[[2329,2879],[1,1],[9,2],[13,10],[9,11],[1,2],[3,5],[4,5],[0,4],[1,2],[3,0],[1,2],[9,27],[14,19],[8,14],[4,6],[3,7],[4,5],[4,9],[7,12],[5,9],[5,12],[1,5],[3,14],[5,9],[3,7]],[[7187,7094],[-15,-13]],[[7172,7081],[-47,74]],[[7125,7155],[15,13]],[[7109,7141],[16,14]],[[7172,7081],[-16,-14]],[[7156,7067],[-47,74]],[[7094,7129],[15,12]],[[7156,7067],[-14,-12]],[[7142,7055],[-48,74]],[[7094,7129],[-11,18]],[[7083,7147],[51,43],[32,28],[3,3]],[[7083,7147],[-11,17]],[[7072,7164],[16,15],[14,11]],[[7102,7190],[15,13]],[[7117,7203],[16,14]],[[7133,7217],[22,19],[2,2]],[[7133,7217],[-40,62]],[[7117,7203],[-39,60]],[[7102,7190],[-37,58]],[[7072,7164],[-33,51]],[[7083,7147],[-13,-11]],[[7070,7136],[-40,64],[-13,-20],[-12,19]],[[7005,7199],[23,34]],[[7070,7136],[-16,-13],[-15,-13],[-45,70]],[[6994,7180],[11,19]],[[6994,7180],[-11,-19]],[[7076,6999],[-47,75],[-14,-13],[-12,19]],[[7003,7080],[20,17],[-11,19],[-12,17],[-17,28]],[[7003,7080],[-29,-26],[-14,-13]],[[7018,6949],[-12,19]],[[7006,6968],[-24,37],[-22,36]],[[7006,6968],[-3,-2],[-16,-14],[-11,18],[-36,-31],[-11,17],[-19,9],[-7,-21]],[[6903,6944],[-19,8]],[[7030,6929],[-2,-2],[-15,-13],[-38,-32]],[[6975,6882],[-15,-13],[7,-12],[11,-18]],[[6978,6839],[-2,-2],[-19,-17],[-20,5],[-3,3],[-46,73],[8,24],[1,2],[2,2],[9,9],[3,2],[-2,1],[-6,3]],[[4974,3642],[-2,37],[-11,0],[-5,0],[-5,1],[-5,3],[-6,6],[-5,13],[-4,8],[-4,8],[1,4],[16,10],[12,-30],[2,-2],[18,2],[9,1],[5,1],[6,2],[6,4],[7,8],[41,54],[2,3]],[[5052,3775],[29,-29],[12,-13],[25,-27]],[[4946,3777],[62,39],[-11,11],[3,3]],[[5000,3830],[12,-13],[11,-11],[29,-31]],[[4954,3878],[14,-14],[13,-14],[2,-3]],[[4983,3847],[17,-17]],[[4851,3985],[7,-8],[-2,-2],[-22,-27],[-12,-14],[-1,-1],[1,-2],[27,-28],[15,-16],[22,29],[12,15],[2,3],[11,-12],[20,-20],[2,-2],[21,-22]],[[5034,3892],[-4,-2],[-5,-3],[-9,-5],[-7,-6],[-6,-4],[-3,-4],[-5,-5],[-12,-16]],[[4954,3878],[12,16],[-14,15],[-14,13],[-1,2],[1,1],[3,5],[11,13],[1,3],[0,2],[-40,41],[-23,25],[-8,7]],[[4882,4021],[7,9],[75,-80],[9,14],[34,52],[12,16]],[[5019,4032],[7,-9]],[[5026,4023],[-26,-35]],[[5000,3988],[-12,-17],[39,-41],[-13,-16],[7,-8],[11,-11],[2,-3]],[[4851,3985],[18,21],[13,15]],[[4955,4047],[-26,-42],[-38,39],[-15,-17],[6,-6]],[[4915,4124],[11,-13],[1,-6],[11,-11]],[[4938,4094],[-15,-14],[15,-15],[17,-18]],[[5012,4039],[7,-7]],[[4955,4047],[11,14],[5,-7],[7,-9],[22,-23],[12,17]],[[5030,4106],[-22,-14],[-21,-26],[25,-27]],[[4938,4094],[26,23],[9,10],[2,2],[2,0],[1,0],[1,0],[6,-5],[15,13],[14,-14],[16,-17]],[[5069,4101],[-50,-69]],[[5030,4106],[17,-16],[14,19],[8,-8]],[[5082,4120],[-13,-19]],[[5042,4212],[6,-12],[48,-51],[-18,-24],[4,-5]],[[8356,8290],[-53,86],[-2,-2]],[[8292,8241],[-1,3],[-50,78]],[[8217,8176],[13,12],[-2,2],[-5,10],[-43,68]],[[8350,8150],[-12,-11],[-17,-15],[-5,-4],[-28,-24],[-13,-11],[-45,71],[-13,20]],[[8217,8176],[-36,-31],[-2,-1],[-2,3],[-13,19],[-40,-35],[-23,36]],[[8101,8167],[15,13],[23,20],[2,1],[-13,22]],[[8101,8167],[-16,-14],[-16,-15],[-27,-22],[-13,-12],[-14,-12],[-2,-3]],[[7944,8196],[4,5],[15,20],[16,23],[21,-20],[-12,-17],[-1,-4],[1,-3],[10,-15],[15,13],[2,1],[2,-1],[4,-6],[41,35]],[[8220,7760],[-3,4],[-17,27],[-28,42],[-4,7],[-23,35],[-26,41],[-8,13],[-9,14],[-2,3]],[[5081,1462],[-35,-9]],[[5093,1407],[-7,3],[-34,12]],[[5148,4153],[-16,11],[-22,14],[-28,25]],[[5139,4189],[17,-17],[-8,-19]],[[5263,4080],[-30,-44],[-37,38],[-14,15],[-18,-11]],[[5164,4078],[-7,-10],[-63,62],[-12,-10]],[[5148,4153],[40,-24],[29,-19],[12,-7]],[[5352,4128],[-13,-17],[-12,-16]],[[5359,4062],[-32,33]],[[5352,4128],[52,-56]],[[5359,4062],[-3,-4],[-12,-11],[-3,-1],[-2,1],[-27,28]],[[5341,4014],[-42,44]],[[5156,3767],[-20,20],[-37,40],[-7,-1],[-11,-14],[-15,-19],[-14,-18]],[[5034,3892],[9,1],[12,0],[10,1],[6,2],[7,2],[7,4],[26,16]],[[5111,3918],[55,33],[4,1]],[[5170,3952],[9,4],[3,1],[3,2],[9,5]],[[5194,3964],[25,15],[2,1],[16,22],[2,3],[7,14],[3,6],[32,44]],[[5000,3988],[15,-14],[26,-27],[5,-5],[5,-2],[5,0],[6,1],[4,3],[3,3],[4,3],[10,12]],[[5083,3962],[8,-8],[6,-7],[5,-7],[7,-18],[2,-4]],[[5026,4023],[8,-10],[20,-20]],[[5054,3993],[14,-15],[15,-16]],[[5054,3993],[12,17],[24,34],[3,1],[2,-1],[11,-12]],[[5106,4032],[-26,-37],[25,-25],[1,-1],[1,0],[3,1],[17,10],[5,4],[3,2],[3,4],[2,1],[2,-3],[1,-1],[10,-11],[12,-12],[4,-8],[1,-4]],[[5069,4101],[6,-7],[15,-15],[28,-30],[-12,-17]],[[5164,4078],[8,-9],[-17,-22],[5,-7],[25,-26],[4,-3],[3,-3],[-6,-8],[-11,-13],[-1,-2],[0,-1],[1,-1],[1,-1],[7,-6],[8,-9],[3,-3]],[[5409,4205],[46,-49],[-22,-31],[14,-15]],[[9268,8006],[-23,6]],[[9245,8012],[5,22],[3,16],[5,22],[3,17],[3,13],[4,15]],[[9268,8117],[21,-5]],[[9289,8112],[41,-11],[42,-11]],[[9233,7952],[6,26],[6,31],[0,3]],[[9308,8311],[-1,-4],[-11,-55],[-4,-18],[-5,-23],[-5,-23],[-3,-18],[-11,-53]],[[8952,8419],[33,26],[26,21],[33,26],[20,15],[-1,1],[0,2],[0,2],[5,4],[24,22],[21,17],[16,13],[22,18]],[[9358,8298],[-1,-4],[-6,-31],[-5,-26],[-1,-3]],[[9345,8234],[-3,-19]],[[9342,8215],[-5,-6],[-9,-6],[-5,-4],[-10,-6],[-4,-3],[-4,-4],[-2,-5],[-2,-7],[-4,-21],[-4,-21],[-4,-20]],[[9342,8215],[56,-15],[2,0]],[[9345,8234],[39,-10],[3,14],[3,3],[2,11],[36,-9],[19,-5]],[[9358,8298],[117,-29]],[[9363,8328],[45,-11],[23,-7],[15,-4],[11,-3],[4,1],[8,4]],[[5950,4855],[-23,-11]],[[5927,4844],[-20,-12],[-21,-13]],[[5886,4819],[-13,-3],[-16,1],[-7,1],[-12,1],[-19,-3],[-5,-2],[-9,-2],[-5,-1],[-2,-1],[-25,-7],[-32,-4]],[[5736,4825],[6,1],[6,0],[5,3],[18,30],[8,9],[3,1],[4,3],[19,7],[7,1],[10,-2],[7,-4],[6,-3],[7,-6],[3,-1],[6,-2],[5,2],[3,1],[5,2],[3,1],[48,13],[6,2],[4,-1],[2,-1],[-2,-12],[11,-9],[5,-1],[0,4],[0,2],[0,8],[-1,6],[-1,3],[0,21],[7,12],[6,6],[7,9],[1,4],[8,14],[5,6],[11,20]],[[5998,4967],[13,-7],[25,-12]],[[6036,4948],[-11,-14],[-9,-11]],[[6016,4923],[-14,-17],[-7,-8],[-10,-9]],[[5985,4889],[-16,-17],[-8,-9],[-11,-8]],[[5875,4608],[6,4],[4,12],[6,20],[-84,49],[-113,59],[-27,-12]],[[5886,4819],[4,-3],[27,-14],[-8,-19],[62,-31]],[[5971,4752],[61,-31],[3,-2]],[[5927,4844],[5,-4],[61,-31],[-7,-19],[-7,-19],[-8,-19]],[[5950,4855],[111,-57],[4,-1]],[[5985,4889],[83,-42],[9,-5],[4,-2]],[[6016,4923],[62,-32],[14,-7],[4,-2]],[[6036,4948],[53,-27],[14,-7],[4,-2]],[[6036,5032],[21,-10],[-5,-16],[11,-6],[60,-30],[4,-1]],[[6054,5070],[23,-11],[3,-3],[61,-31],[3,-1]],[[8833,8678],[16,16],[-21,48],[-20,-12],[-8,19],[-37,80],[20,12],[-15,33],[-23,53],[-2,5],[-20,-13],[-23,-15]],[[8700,8904],[-7,14],[-3,5],[-9,22],[-8,-5],[-11,-5],[-7,-3],[-13,-7],[-42,-17],[-13,-4],[-25,-4],[-11,-1],[-5,0],[-3,0],[-6,1],[-12,2],[-8,0],[-6,-2]],[[8511,8900],[-4,-2],[-7,-3],[-3,-2],[-5,-4],[-8,-6],[-3,-3],[-5,-4],[-6,-7],[-12,-20],[17,-41],[-32,-18],[-1,-1],[0,-2],[7,-17],[4,-10],[12,-11],[3,-3]],[[8305,8694],[13,17],[9,6],[7,6],[1,2],[4,5],[6,5],[8,1],[6,6],[10,9],[8,9],[11,7],[18,16],[7,9],[6,11],[13,20],[7,7],[4,4],[4,3],[6,13],[9,12],[7,15],[22,19],[20,9],[21,1],[17,-1],[20,1],[12,2],[15,6],[13,7],[9,3],[3,3],[0,7],[1,1],[3,-2],[3,0],[7,6],[13,13],[10,8],[9,12],[9,8],[24,23],[6,9],[9,7],[10,10],[13,11],[24,24],[24,22],[9,10],[11,29],[5,9],[6,13],[4,13],[12,27],[4,13],[3,13],[12,20],[10,22],[9,14],[12,17],[9,10],[6,9],[20,28],[10,9],[6,7],[2,5],[8,6],[6,7],[4,8],[3,11],[12,23],[6,16],[0,7],[2,19],[4,8],[9,17],[24,48],[8,14],[9,10],[2,7],[8,14],[4,15],[4,9],[2,6],[9,13],[4,8],[4,13],[1,13],[4,13],[10,21],[6,6],[12,17],[2,0],[13,23],[12,4],[6,7],[12,10],[8,4],[6,4],[7,8],[1,1],[18,9],[8,2],[7,3],[7,5],[20,8],[5,0],[12,8],[14,10],[10,6],[16,4],[10,4],[11,4],[14,8],[16,10],[4,4],[2,0]],[[8795,8640],[-8,18],[-64,142],[-2,4],[-22,50],[0,4],[2,4],[14,8],[-14,31],[-1,2],[0,1]],[[8686,8525],[-2,4],[-2,2],[-3,6],[-3,5],[-2,2],[-11,23],[-20,47],[-13,31],[-16,35],[-30,69],[-33,78]],[[8551,8827],[-1,4],[-7,15],[-5,8],[-9,13],[-6,8],[-4,7],[-8,18]],[[8555,8562],[17,19],[14,17],[-9,11],[-4,9],[-22,51],[-2,2],[-17,-10],[-9,21],[-18,-10]],[[8468,8746],[6,8],[7,9],[9,9],[10,11],[11,10],[19,17],[18,15],[3,2]],[[7052,6851],[-5,9],[-12,18],[-37,-32],[-11,18],[-12,18]],[[7054,6811],[-37,-33],[-12,18],[-15,24],[-12,19]],[[6990,6704],[-3,4],[-44,68],[-7,12]],[[6936,6788],[-9,15],[-30,47]],[[6897,6850],[-31,49]],[[6830,6759],[10,8],[25,-40],[14,13],[14,12],[14,12],[14,12],[15,12]],[[6819,6776],[10,27]],[[6829,6803],[5,-7],[6,5],[13,11],[15,13],[14,12],[15,13]],[[6829,6803],[-2,3],[-9,13],[-7,11],[-16,26],[18,17],[16,14]],[[6829,6887],[18,-29],[2,-3],[8,21],[2,6],[7,17]],[[6829,6887],[-44,68],[1,5],[5,21]],[[6715,6834],[2,7],[8,19],[7,14],[5,12],[5,5],[35,82],[4,17]],[[7568,4477],[7,11],[5,9]],[[7580,4497],[9,-7],[45,-34],[13,-10]],[[7580,4497],[14,23]],[[7580,4497],[-11,8],[-42,33],[-9,9]],[[7568,4477],[-63,47]],[[7555,4451],[-19,14],[-37,27],[-8,6]],[[7523,4395],[-62,47]],[[7498,4350],[-62,46]],[[7485,4324],[-63,47]],[[5016,1281],[-46,1],[-3,21],[0,14],[1,6],[-4,20],[-18,-3],[-3,0],[-2,1],[-2,3],[-4,22],[-23,-5]],[[5016,1227],[-10,3],[-8,7],[-3,5],[-2,12],[1,19],[-3,-4],[-3,-9],[-1,-8],[2,-7],[2,-6],[4,-8],[6,-4],[9,-3],[6,-2]],[[5626,4344],[-6,6],[-47,50],[13,16],[12,17]],[[5608,4321],[-1,0],[-14,15],[-40,42],[-7,7]],[[5546,4385],[-26,27],[-19,20],[-3,3],[-3,3],[-4,4],[-2,2],[-1,1]],[[5524,4487],[5,5],[0,2],[17,20]],[[5546,4514],[31,-30],[33,-36]],[[5639,4489],[-17,-24],[-12,-17]],[[5546,4514],[19,22],[3,3]],[[5568,4539],[14,-12],[3,-3],[3,-2],[4,-1],[5,0],[5,1],[21,-19],[16,-14]],[[5568,4539],[21,26],[13,20],[6,9],[2,3]],[[5610,4597],[73,-44]],[[5683,4553],[-3,-4],[-2,-4],[-14,-19],[-14,-19],[-11,-18]],[[5568,4539],[-19,19],[-14,13],[-15,14]],[[5630,4642],[74,-41],[-11,-25],[-10,-23]],[[5748,4503],[-22,16],[-43,34]],[[5638,4663],[4,-2],[7,16],[20,-12],[26,-13],[2,-1],[13,-4],[79,-41]],[[5742,4702],[54,-28],[-9,-24],[30,-15],[29,-7],[0,-1],[-3,-11]],[[5546,4385],[-3,-5],[-5,-5],[-9,-12],[0,-3],[-2,-3],[-5,-6],[-4,-2],[-5,-7],[-14,-19],[-13,-17]],[[5534,4223],[-62,65]],[[5608,4321],[-3,-5],[-12,-16],[-2,0],[0,-1],[0,-1],[-8,-11],[-9,-11],[-13,-17],[-13,-18],[-14,-18]],[[5494,4172],[-61,65]],[[5534,4223],[-13,-16],[-13,-18]],[[6183,5178],[9,23],[10,22],[11,-6],[39,-19],[22,-10]],[[6160,5189],[10,23],[10,22],[7,22]],[[6187,5256],[19,-9],[5,-2],[9,-5],[32,-16],[30,-14]],[[6187,5256],[17,49]],[[6204,5305],[20,-10],[3,-2],[3,-4],[2,-2],[6,-3],[14,-7],[46,-22]],[[6298,5255],[-4,-12],[-4,-11],[-4,-11],[-4,-11]],[[6323,5325],[-9,-24],[-10,4],[-28,14]],[[6276,5319],[-5,3],[-31,14],[-24,2],[-6,-16],[-6,-17]],[[6079,5226],[9,15],[21,27],[12,18],[27,28],[13,16],[20,23],[3,2],[3,2],[15,0],[9,1],[6,3],[18,19],[1,1]],[[6276,5319],[-23,-15],[3,-2],[50,-25]],[[6306,5277],[-4,-11],[-4,-11]],[[6367,5247],[-44,21],[-17,9]]],"box":[-73.97639960366291,45.40212922961762,-73.47606597759493,45.70374747616739],"transform":{"scale":[0.000050038366443442794,0.000030164841139091116],"translate":[-73.97639960366291,45.40212922961762]}} diff --git a/test/memoryLimitCases/json/src/3.json b/test/memoryLimitCases/json/src/3.json new file mode 100644 index 00000000000..33726beae05 --- /dev/null +++ b/test/memoryLimitCases/json/src/3.json @@ -0,0 +1 @@ +{"type":"Topology","objects":{"da_polygons":{"type":"GeometryCollection","geometries":[{"type":"Polygon","arcs":[[0,1,2,3]],"properties":{"id":"24661006","dp":8931,"de":1335}},{"type":"Polygon","arcs":[[4,5,-3,6]],"properties":{"id":"24661007","dp":10647,"de":1878}},{"type":"Polygon","arcs":[[7,-5,8,9]],"properties":{"id":"24661008","dp":16943,"de":0}},{"type":"Polygon","arcs":[[10,11,12,13,-10,14]],"properties":{"id":"24661009","dp":12530,"de":0}},{"type":"Polygon","arcs":[[15,-12,16,17]],"properties":{"id":"24661010","dp":9438,"de":702}},{"type":"Polygon","arcs":[[-16,18,19,20,21]],"properties":{"id":"24661011","dp":8010,"de":0}},{"type":"Polygon","arcs":[[-13,-22,22,23,24]],"properties":{"id":"24661012","dp":11850,"de":2286}},{"type":"Polygon","arcs":[[-14,-25,25,26,27,-8]],"properties":{"id":"24661013","dp":14048,"de":0}},{"type":"Polygon","arcs":[[-28,28,29,30,-6]],"properties":{"id":"24661014","dp":13125,"de":937}},{"type":"Polygon","arcs":[[-4,-31,31,32]],"properties":{"id":"24661015","dp":9751,"de":0}},{"type":"Polygon","arcs":[[-33,33,34,35,36]],"properties":{"id":"24661016","dp":11366,"de":3096}},{"type":"Polygon","arcs":[[37,38,39,40,41,-36,42]],"properties":{"id":"24661017","dp":12016,"de":2796}},{"type":"Polygon","arcs":[[43,44,-39,45,46]],"properties":{"id":"24661018","dp":11687,"de":0}},{"type":"Polygon","arcs":[[-46,-38,47,48,49]],"properties":{"id":"24661019","dp":12350,"de":0}},{"type":"Polygon","arcs":[[50,-47,-50,51,52]],"properties":{"id":"24661020","dp":9967,"de":0}},{"type":"Polygon","arcs":[[-52,-49,53,54,55,56]],"properties":{"id":"24661021","dp":7994,"de":1432}},{"type":"Polygon","arcs":[[-56,57,58,59,60,61]],"properties":{"id":"24661022","dp":5211,"de":1785}},{"type":"Polygon","arcs":[[62,63,-57,-62,64]],"properties":{"id":"24661023","dp":6243,"de":582}},{"type":"Polygon","arcs":[[-65,-61,65,66,67,68]],"properties":{"id":"24661024","dp":5485,"de":0}},{"type":"Polygon","arcs":[[69,70,71,-66]],"properties":{"id":"24661025","dp":7364,"de":0}},{"type":"Polygon","arcs":[[-70,-60,72,73,74]],"properties":{"id":"24661026","dp":10337,"de":1466}},{"type":"Polygon","arcs":[[75,76,77,78,-71,-75]],"properties":{"id":"24661027","dp":12164,"de":1903}},{"type":"Polygon","arcs":[[79,80,-76,-74,81]],"properties":{"id":"24661028","dp":11862,"de":0}},{"type":"Polygon","arcs":[[82,83,-77,-81,84]],"properties":{"id":"24661029","dp":13911,"de":0}},{"type":"Polygon","arcs":[[85,86,87,-85,-80,88]],"properties":{"id":"24661030","dp":19910,"de":0}},{"type":"Polygon","arcs":[[-87,89,90]],"properties":{"id":"24661031","dp":19144,"de":0}},{"type":"Polygon","arcs":[[-83,-88,-91,91,92,93,94,95]],"properties":{"id":"24661032","dp":7816,"de":7672}},{"type":"Polygon","arcs":[[96,-92,-90,-86,97]],"properties":{"id":"24661033","dp":15840,"de":0}},{"type":"Polygon","arcs":[[98,-98,99,100]],"properties":{"id":"24661034","dp":14082,"de":0}},{"type":"Polygon","arcs":[[101,-93,-97,-99,102]],"properties":{"id":"24661035","dp":13138,"de":1666}},{"type":"Polygon","arcs":[[103,104,105,106]],"properties":{"id":"24660626","dp":11270,"de":0}},{"type":"Polygon","arcs":[[107,108,-104,109]],"properties":{"id":"24660627","dp":9435,"de":0}},{"type":"Polygon","arcs":[[110,-110,-107,111,112,113,114,115]],"properties":{"id":"24660628","dp":3679,"de":3326}},{"type":"Polygon","arcs":[[116,117,118,-111]],"properties":{"id":"24660629","dp":48819,"de":4658}},{"type":"Polygon","arcs":[[119,120,121,-118,122]],"properties":{"id":"24660630","dp":4054,"de":851}},{"type":"Polygon","arcs":[[123,124,125,-123,126,127]],"properties":{"id":"24660631","dp":6140,"de":1321}},{"type":"Polygon","arcs":[[128,129,-120,-126,130]],"properties":{"id":"24660632","dp":4964,"de":0}},{"type":"Polygon","arcs":[[131,-131,-125,132,133,134]],"properties":{"id":"24660633","dp":4795,"de":6787}},{"type":"Polygon","arcs":[[135,136,137,-132,138,139]],"properties":{"id":"24660634","dp":4116,"de":1223}},{"type":"Polygon","arcs":[[140,141,142,143,-136]],"properties":{"id":"24660635","dp":8631,"de":1131}},{"type":"Polygon","arcs":[[144,145,-141,146]],"properties":{"id":"24660636","dp":9930,"de":2797}},{"type":"Polygon","arcs":[[-147,-140,147,148]],"properties":{"id":"24660637","dp":12431,"de":0}},{"type":"Polygon","arcs":[[-148,-139,-135,149,150]],"properties":{"id":"24660638","dp":8941,"de":1274}},{"type":"Polygon","arcs":[[-150,-134,151,152]],"properties":{"id":"24660639","dp":10337,"de":1054}},{"type":"Polygon","arcs":[[153,-153,154,155]],"properties":{"id":"24660640","dp":7798,"de":3731}},{"type":"Polygon","arcs":[[-155,156,157,158]],"properties":{"id":"24660641","dp":11155,"de":3361}},{"type":"Polygon","arcs":[[-158,159,160,161,162]],"properties":{"id":"24660642","dp":10407,"de":4184}},{"type":"Polygon","arcs":[[-162,163,164,165,166]],"properties":{"id":"24660643","dp":12951,"de":8280}},{"type":"Polygon","arcs":[[167,168,-166,169,170]],"properties":{"id":"24660644","dp":9054,"de":2215}},{"type":"Polygon","arcs":[[-165,171,172,173,174,175,-170]],"properties":{"id":"24660645","dp":11651,"de":2816}},{"type":"Polygon","arcs":[[176,-171,-176,177,178,179,180,181,182]],"properties":{"id":"24660646","dp":6723,"de":3837}},{"type":"Polygon","arcs":[[183,184,185,186,-181,187,188]],"properties":{"id":"24660649","dp":9487,"de":1370}},{"type":"Polygon","arcs":[[-189,189,-179,190,191,192]],"properties":{"id":"24660650","dp":4420,"de":2155}},{"type":"Polygon","arcs":[[-192,193,194,195,196,197]],"properties":{"id":"24660652","dp":9408,"de":869}},{"type":"Polygon","arcs":[[198,199,-195,200]],"properties":{"id":"24660654","dp":3356,"de":0}},{"type":"Polygon","arcs":[[201,202,203,204,205,-199]],"properties":{"id":"24660655","dp":6279,"de":3761}},{"type":"Polygon","arcs":[[206,207,-196,-200,-206]],"properties":{"id":"24660656","dp":16096,"de":1470}},{"type":"Polygon","arcs":[[-205,208,209,210,211,-207]],"properties":{"id":"24660657","dp":14502,"de":974}},{"type":"Polygon","arcs":[[212,213,214,215,216]],"properties":{"id":"24661144","dp":17838,"de":1781}},{"type":"Polygon","arcs":[[-216,217,218]],"properties":{"id":"24661145","dp":14407,"de":0}},{"type":"Polygon","arcs":[[219,-219,220,221,222,223]],"properties":{"id":"24661146","dp":10811,"de":7711}},{"type":"Polygon","arcs":[[224,225,226,227]],"properties":{"id":"24663242","dp":135547,"de":31021}},{"type":"Polygon","arcs":[[-226,228,229,230]],"properties":{"id":"24663243","dp":74527,"de":15540}},{"type":"Polygon","arcs":[[231,-201,-194,-191]],"properties":{"id":"24663244","dp":15460,"de":1381}},{"type":"Polygon","arcs":[[232,233,234,235,236]],"properties":{"id":"24663245","dp":28870,"de":2258}},{"type":"Polygon","arcs":[[237,238,239,240,241,242,243]],"properties":{"id":"24663215","dp":11166,"de":5263}},{"type":"Polygon","arcs":[[244,245,246,247,248,249,250,251,252,253,254]],"properties":{"id":"24663216","dp":1357,"de":364}},{"type":"Polygon","arcs":[[255,256,257,258,-249,259]],"properties":{"id":"24663217","dp":5669,"de":873}},{"type":"Polygon","arcs":[[260,-260,-248,261]],"properties":{"id":"24663218","dp":4290,"de":1018}},{"type":"Polygon","arcs":[[-259,262,263,-250]],"properties":{"id":"24663219","dp":9313,"de":0}},{"type":"Polygon","arcs":[[-258,264,265,266,267,268,269,270,-263]],"properties":{"id":"24663220","dp":3197,"de":1020}},{"type":"Polygon","arcs":[[-264,-271,271,272,-251]],"properties":{"id":"24663221","dp":11214,"de":0}},{"type":"Polygon","arcs":[[-270,273,274,275,-272]],"properties":{"id":"24663222","dp":9621,"de":0}},{"type":"Polygon","arcs":[[-273,-276,276,277,278,-252]],"properties":{"id":"24663223","dp":11269,"de":0}},{"type":"Polygon","arcs":[[279,280,281,282,283,284,285,286]],"properties":{"id":"24663227","dp":3208,"de":243}},{"type":"Polygon","arcs":[[287,288,-284]],"properties":{"id":"24663228","dp":9806,"de":1320}},{"type":"Polygon","arcs":[[-285,-289,289,290,291,292,293]],"properties":{"id":"24663229","dp":2759,"de":1023}},{"type":"Polygon","arcs":[[294,295,296,-292]],"properties":{"id":"24663230","dp":8375,"de":1160}},{"type":"Polygon","arcs":[[297,298,299,300,-296]],"properties":{"id":"24663231","dp":10815,"de":998}},{"type":"Polygon","arcs":[[301,302,303,304,-298,305]],"properties":{"id":"24663232","dp":7492,"de":3592}},{"type":"Polygon","arcs":[[306,307,308,309,-300]],"properties":{"id":"24663233","dp":7652,"de":0}},{"type":"Polygon","arcs":[[-309,310,311,312,313]],"properties":{"id":"24663234","dp":9826,"de":1391}},{"type":"Polygon","arcs":[[-297,-301,-310,-314,314,315,316,317,318]],"properties":{"id":"24663235","dp":8550,"de":1062}},{"type":"Polygon","arcs":[[-286,319,320,321,-293,-319,322,323,324,325,326]],"properties":{"id":"24663236","dp":1908,"de":0}},{"type":"Polygon","arcs":[[327,-324]],"properties":{"id":"24663237","dp":12585,"de":0}},{"type":"Polygon","arcs":[[-321,328]],"properties":{"id":"24663238","dp":12077,"de":0}},{"type":"Polygon","arcs":[[-294,-322,-329,-320]],"properties":{"id":"24663239","dp":9419,"de":0}},{"type":"Polygon","arcs":[[329,330,331,332,333,334,335,336,337,338,339]],"properties":{"id":"24663241","dp":9132,"de":3526}},{"type":"Polygon","arcs":[[340,341,342,343,344]],"properties":{"id":"24663315","dp":6316,"de":663}},{"type":"Polygon","arcs":[[-345,345]],"properties":{"id":"24663316","dp":17073,"de":0}},{"type":"Polygon","arcs":[[346,347,348,-342,349]],"properties":{"id":"24663317","dp":6559,"de":940}},{"type":"Polygon","arcs":[[350,351,-347,352]],"properties":{"id":"24663318","dp":13324,"de":0}},{"type":"Polygon","arcs":[[-352,353,354,355,-348]],"properties":{"id":"24663319","dp":5197,"de":591}},{"type":"Polygon","arcs":[[356,-247,357,-356]],"properties":{"id":"24663320","dp":8801,"de":4778}},{"type":"Polygon","arcs":[[-349,-358,-246,358,-343]],"properties":{"id":"24663321","dp":4576,"de":2380}},{"type":"Polygon","arcs":[[359,360,361,362,363,364]],"properties":{"id":"24663322","dp":5794,"de":2158}},{"type":"Polygon","arcs":[[365,-361,366]],"properties":{"id":"24663323","dp":14574,"de":0}},{"type":"Polygon","arcs":[[367,368,369,-362,-366,370]],"properties":{"id":"24663324","dp":14421,"de":0}},{"type":"Polygon","arcs":[[371,372,-369,373]],"properties":{"id":"24663325","dp":15522,"de":0}},{"type":"Polygon","arcs":[[374,375,376,-374,-368,377]],"properties":{"id":"24663326","dp":10725,"de":1170}},{"type":"Polygon","arcs":[[-377,378,379,380,-372]],"properties":{"id":"24663327","dp":17213,"de":0}},{"type":"Polygon","arcs":[[-381,381,-363,-370,-373]],"properties":{"id":"24663328","dp":15796,"de":1851}},{"type":"Polygon","arcs":[[382,383,384,385,386,387,388,389,390,391,392,393,394,395,396]],"properties":{"id":"24663329","dp":0,"de":296}},{"type":"Polygon","arcs":[[397,398,399,400,401,402,403,404]],"properties":{"id":"24663330","dp":4436,"de":5953}},{"type":"Polygon","arcs":[[405,406,407,-399,408]],"properties":{"id":"24663331","dp":11992,"de":1562}},{"type":"Polygon","arcs":[[409,410,-406,411,412]],"properties":{"id":"24663332","dp":14081,"de":2551}},{"type":"Polygon","arcs":[[413,414,415,-410,416]],"properties":{"id":"24663333","dp":8329,"de":1540}},{"type":"Polygon","arcs":[[417,418,419,420,421,422,423,424,425]],"properties":{"id":"24660037","dp":6132,"de":0}},{"type":"Polygon","arcs":[[426,427,428,429,-419,430]],"properties":{"id":"24660038","dp":9844,"de":0}},{"type":"Polygon","arcs":[[431,-427,432]],"properties":{"id":"24660039","dp":11381,"de":0}},{"type":"Polygon","arcs":[[433,434,435,-428,-432]],"properties":{"id":"24660040","dp":4262,"de":404}},{"type":"Polygon","arcs":[[436,-434,-433,-431,-418,437,438]],"properties":{"id":"24660041","dp":3909,"de":348}},{"type":"Polygon","arcs":[[439,-438,-426,440]],"properties":{"id":"24660042","dp":9275,"de":0}},{"type":"Polygon","arcs":[[-425,441,-441]],"properties":{"id":"24660043","dp":10046,"de":0}},{"type":"Polygon","arcs":[[442,-440,-442,-424,443,444,445,446]],"properties":{"id":"24660044","dp":3139,"de":1321}},{"type":"Polygon","arcs":[[447,-446,448,449,450]],"properties":{"id":"24660045","dp":2288,"de":0}},{"type":"Polygon","arcs":[[-439,-443,451,452]],"properties":{"id":"24660046","dp":4770,"de":478}},{"type":"Polygon","arcs":[[453,454,455,456,457,-435,-437,-453,458]],"properties":{"id":"24660047","dp":2550,"de":2172}},{"type":"Polygon","arcs":[[459,460,461,-455,462]],"properties":{"id":"24660048","dp":6159,"de":1346}},{"type":"Polygon","arcs":[[463,464,465,-456,-462,466]],"properties":{"id":"24660049","dp":5493,"de":681}},{"type":"Polygon","arcs":[[467,-464,468]],"properties":{"id":"24660050","dp":9764,"de":0}},{"type":"Polygon","arcs":[[469,470,-469,-467,-461,471,472]],"properties":{"id":"24660051","dp":4193,"de":0}},{"type":"Polygon","arcs":[[473,474,-472,-460,475]],"properties":{"id":"24660052","dp":7412,"de":1105}},{"type":"Polygon","arcs":[[476,-473,-475,477]],"properties":{"id":"24660053","dp":6310,"de":0}},{"type":"Polygon","arcs":[[478,479,-478,-474,480,481,482]],"properties":{"id":"24660054","dp":4320,"de":724}},{"type":"Polygon","arcs":[[483,484,485,-479]],"properties":{"id":"24660055","dp":9536,"de":0}},{"type":"Polygon","arcs":[[486,-485,487]],"properties":{"id":"24660056","dp":4995,"de":0}},{"type":"Polygon","arcs":[[488,489,490,491,492,493,494,495,496,-488,-484,-483,497]],"properties":{"id":"24660057","dp":338,"de":536}},{"type":"Polygon","arcs":[[498,499,500,501]],"properties":{"id":"24660489","dp":8249,"de":6849}},{"type":"Polygon","arcs":[[502,503,504,-502]],"properties":{"id":"24660490","dp":8603,"de":3262}},{"type":"Polygon","arcs":[[-253,-279,505,506,507,508]],"properties":{"id":"24660141","dp":1836,"de":234}},{"type":"Polygon","arcs":[[509,510,-503,-501,511,512,513,514,515,516,517]],"properties":{"id":"24660491","dp":1351,"de":5936}},{"type":"Polygon","arcs":[[-517,518,519,520]],"properties":{"id":"24660492","dp":13313,"de":0}},{"type":"Polygon","arcs":[[-516,521,522,-519]],"properties":{"id":"24660493","dp":13219,"de":1570}},{"type":"Polygon","arcs":[[-523,523,524,525]],"properties":{"id":"24660494","dp":11926,"de":1361}},{"type":"Polygon","arcs":[[-525,526,527,528]],"properties":{"id":"24660495","dp":9387,"de":1348}},{"type":"Polygon","arcs":[[529,530,531,-527,-524]],"properties":{"id":"24660496","dp":11422,"de":1845}},{"type":"Polygon","arcs":[[-515,-530,-522]],"properties":{"id":"24660497","dp":14505,"de":1692}},{"type":"Polygon","arcs":[[-514,532,533,534,-531]],"properties":{"id":"24660498","dp":10225,"de":1503}},{"type":"Polygon","arcs":[[535,536,537,-534]],"properties":{"id":"24660499","dp":9676,"de":0}},{"type":"Polygon","arcs":[[-533,-513,538,539,540,541,542,543,-536]],"properties":{"id":"24660500","dp":3362,"de":7441}},{"type":"Polygon","arcs":[[-544,544,545,546,547,-537]],"properties":{"id":"24660501","dp":7888,"de":837}},{"type":"Polygon","arcs":[[548,549,-545,-543]],"properties":{"id":"24660502","dp":13405,"de":1811}},{"type":"Polygon","arcs":[[550,551,552,-549,-542]],"properties":{"id":"24660503","dp":7376,"de":874}},{"type":"Polygon","arcs":[[553,554,-551,-541]],"properties":{"id":"24660504","dp":5407,"de":1005}},{"type":"Polygon","arcs":[[555,556,557,-554,-540]],"properties":{"id":"24660505","dp":9900,"de":2490}},{"type":"Polygon","arcs":[[558,559,560,-557,561,562]],"properties":{"id":"24660506","dp":8935,"de":2987}},{"type":"Polygon","arcs":[[563,-563,564]],"properties":{"id":"24660507","dp":10570,"de":1027}},{"type":"Polygon","arcs":[[565,566,567,-559,-564,568]],"properties":{"id":"24660508","dp":6919,"de":1668}},{"type":"Polygon","arcs":[[569,570,-566,571]],"properties":{"id":"24660509","dp":8828,"de":0}},{"type":"Polygon","arcs":[[572,573,-572,-569,-565,-562,-556,-539,574,575]],"properties":{"id":"24660510","dp":1306,"de":8518}},{"type":"Polygon","arcs":[[576,577,578,579,-570,-574]],"properties":{"id":"24660511","dp":4287,"de":468}},{"type":"Polygon","arcs":[[-573,580,581,-577]],"properties":{"id":"24660512","dp":13997,"de":0}},{"type":"Polygon","arcs":[[582,583,584,585,586,587,-581]],"properties":{"id":"24660513","dp":10449,"de":1063}},{"type":"Polygon","arcs":[[588,589,-587]],"properties":{"id":"24660514","dp":9284,"de":0}},{"type":"Polygon","arcs":[[-586,590,591,-589]],"properties":{"id":"24660515","dp":39141,"de":3862}},{"type":"Polygon","arcs":[[-585,592,593,-591]],"properties":{"id":"24660516","dp":26174,"de":1912}},{"type":"Polygon","arcs":[[594,595,596,597,598,-593]],"properties":{"id":"24660517","dp":8932,"de":485}},{"type":"Polygon","arcs":[[599,600,601,602]],"properties":{"id":"24661004","dp":10054,"de":0}},{"type":"Polygon","arcs":[[-1,-37,-42,-601]],"properties":{"id":"24661005","dp":8535,"de":5063}},{"type":"Polygon","arcs":[[603,604,-254,-509,605,606,607,608]],"properties":{"id":"24660142","dp":3728,"de":2421}},{"type":"Polygon","arcs":[[609,610,-609]],"properties":{"id":"24660143","dp":10342,"de":0}},{"type":"Polygon","arcs":[[611,-610,-608,612,613,614]],"properties":{"id":"24660144","dp":15266,"de":722}},{"type":"Polygon","arcs":[[615,-604,-611,616]],"properties":{"id":"24660145","dp":12741,"de":0}},{"type":"Polygon","arcs":[[617,618,-617,-612,619,620,621,622]],"properties":{"id":"24660146","dp":7606,"de":1504}},{"type":"Polygon","arcs":[[-618,623]],"properties":{"id":"24660147","dp":20632,"de":1656}},{"type":"Polygon","arcs":[[624,-255,-605,-616,-619,-624,-623,625]],"properties":{"id":"24660148","dp":1454,"de":5705}},{"type":"Polygon","arcs":[[626,-626,627,628,629,630]],"properties":{"id":"24660149","dp":5561,"de":963}},{"type":"Polygon","arcs":[[631,632,-631,633,634]],"properties":{"id":"24660150","dp":3943,"de":1446}},{"type":"Polygon","arcs":[[635,-635,636,637,638]],"properties":{"id":"24660151","dp":4713,"de":0}},{"type":"Polygon","arcs":[[639,640,-637,-634,-630,641,642,643]],"properties":{"id":"24660152","dp":3337,"de":3856}},{"type":"Polygon","arcs":[[644,-640,645]],"properties":{"id":"24660153","dp":10086,"de":867}},{"type":"Polygon","arcs":[[646,-646,647,648]],"properties":{"id":"24660154","dp":6043,"de":699}},{"type":"Polygon","arcs":[[-649,649,650,651,652]],"properties":{"id":"24660155","dp":8086,"de":942}},{"type":"Polygon","arcs":[[653,-652,654,655,656]],"properties":{"id":"24660156","dp":11496,"de":2733}},{"type":"Polygon","arcs":[[657,-655,-651,658,659,660,661,662,663,664]],"properties":{"id":"24660157","dp":2446,"de":187}},{"type":"Polygon","arcs":[[-665,665,666,667]],"properties":{"id":"24660158","dp":9450,"de":1247}},{"type":"Polygon","arcs":[[668,669,-666,-664]],"properties":{"id":"24660159","dp":16040,"de":0}},{"type":"Polygon","arcs":[[-669,-663,670,671]],"properties":{"id":"24660160","dp":6754,"de":0}},{"type":"Polygon","arcs":[[-662,672,673,-671]],"properties":{"id":"24660161","dp":7033,"de":0}},{"type":"Polygon","arcs":[[-674,674,675]],"properties":{"id":"24660162","dp":9412,"de":0}},{"type":"Polygon","arcs":[[-675,-673,-661,676,677,678,679,680,681,682,683]],"properties":{"id":"24660163","dp":8293,"de":697}},{"type":"Polygon","arcs":[[684,685,-679,686]],"properties":{"id":"24660164","dp":9226,"de":3080}},{"type":"Polygon","arcs":[[687,688,689,690,-685]],"properties":{"id":"24660165","dp":9571,"de":0}},{"type":"Polygon","arcs":[[691,692,693,694]],"properties":{"id":"24660624","dp":17755,"de":2448}},{"type":"Polygon","arcs":[[-112,-106,695,-692]],"properties":{"id":"24660625","dp":16190,"de":1636}},{"type":"Polygon","arcs":[[696,697,698,699,700,701,702]],"properties":{"id":"24660877","dp":8154,"de":0}},{"type":"Polygon","arcs":[[703,704,-698,705]],"properties":{"id":"24660878","dp":13204,"de":0}},{"type":"Polygon","arcs":[[706,707,708,-699,-705]],"properties":{"id":"24660879","dp":14016,"de":0}},{"type":"Polygon","arcs":[[709,710,711,712,713,-707,-704,714]],"properties":{"id":"24660880","dp":5343,"de":1738}},{"type":"Polygon","arcs":[[715,716,-708,-714]],"properties":{"id":"24660881","dp":15212,"de":0}},{"type":"Polygon","arcs":[[-709,-717,717,718,719,-700]],"properties":{"id":"24660882","dp":13107,"de":0}},{"type":"Polygon","arcs":[[-718,-716,-713,720,721,722,723,724]],"properties":{"id":"24660883","dp":6469,"de":524}},{"type":"Polygon","arcs":[[725,726,727,-723]],"properties":{"id":"24660884","dp":8508,"de":732}},{"type":"Polygon","arcs":[[-728,728,729,730,731,-724]],"properties":{"id":"24660885","dp":6490,"de":3685}},{"type":"Polygon","arcs":[[-731,732,733,734,735,736,737]],"properties":{"id":"24660886","dp":11863,"de":2534}},{"type":"Polygon","arcs":[[-737,738,739,740,741]],"properties":{"id":"24660887","dp":15000,"de":0}},{"type":"Polygon","arcs":[[742,743,744,-739,-736]],"properties":{"id":"24660888","dp":15464,"de":0}},{"type":"Polygon","arcs":[[745,746,-743,-735]],"properties":{"id":"24660889","dp":15095,"de":0}},{"type":"Polygon","arcs":[[747,748,749,-744,-747]],"properties":{"id":"24660890","dp":15628,"de":0}},{"type":"Polygon","arcs":[[750,751,752,-748,-746,-734]],"properties":{"id":"24660891","dp":16444,"de":0}},{"type":"Polygon","arcs":[[753,-752]],"properties":{"id":"24660892","dp":12290,"de":0}},{"type":"Polygon","arcs":[[-751,-733,-730,754,755,756,757,758,759,760,761,762,763,-749,-753,-754]],"properties":{"id":"24660893","dp":480,"de":3413}},{"type":"Polygon","arcs":[[-745,-750,-764,764,-740]],"properties":{"id":"24660894","dp":15893,"de":957}},{"type":"Polygon","arcs":[[-741,-765,-763,765,766,767]],"properties":{"id":"24660895","dp":6906,"de":2126}},{"type":"Polygon","arcs":[[-766,-762,768,769]],"properties":{"id":"24660896","dp":13624,"de":0}},{"type":"Polygon","arcs":[[770,771,-767,-770,772]],"properties":{"id":"24660897","dp":17031,"de":0}},{"type":"Polygon","arcs":[[773,774,-771]],"properties":{"id":"24660898","dp":13979,"de":0}},{"type":"Polygon","arcs":[[775,-738,-742,-768,-772,-775,776]],"properties":{"id":"24660899","dp":5594,"de":4325}},{"type":"Polygon","arcs":[[777,-719,-725,-732,-776,778]],"properties":{"id":"24660900","dp":7907,"de":2759}},{"type":"Polygon","arcs":[[779,780,781,782,783,784,785]],"properties":{"id":"24661213","dp":5261,"de":5231}},{"type":"Polygon","arcs":[[-786,786,787,788,789,790,791,792,793]],"properties":{"id":"24661214","dp":6711,"de":933}},{"type":"Polygon","arcs":[[794,795,796,-788]],"properties":{"id":"24661215","dp":18148,"de":1851}},{"type":"Polygon","arcs":[[-797,797,798,-789]],"properties":{"id":"24661216","dp":19680,"de":3723}},{"type":"Polygon","arcs":[[-790,-799,799,800]],"properties":{"id":"24661217","dp":17804,"de":0}},{"type":"Polygon","arcs":[[-791,-801,801,802]],"properties":{"id":"24661218","dp":21421,"de":2696}},{"type":"Polygon","arcs":[[-792,-803,803,804]],"properties":{"id":"24661219","dp":11752,"de":2061}},{"type":"Polygon","arcs":[[-805,805,806,807]],"properties":{"id":"24661220","dp":11693,"de":3674}},{"type":"Polygon","arcs":[[-807,808,809]],"properties":{"id":"24661221","dp":13514,"de":2236}},{"type":"Polygon","arcs":[[-793,-808,-810,810,811,812,813,814]],"properties":{"id":"24661222","dp":8084,"de":3112}},{"type":"Polygon","arcs":[[815,-814,816,817,818,819,820]],"properties":{"id":"24661223","dp":2721,"de":1293}},{"type":"Polygon","arcs":[[821,822,823,824]],"properties":{"id":"24660715","dp":7667,"de":3137}},{"type":"Polygon","arcs":[[825,826,-822,827]],"properties":{"id":"24660716","dp":6704,"de":1787}},{"type":"Polygon","arcs":[[828,829,830,-826,831]],"properties":{"id":"24660717","dp":8223,"de":2919}},{"type":"Polygon","arcs":[[832,833,-830,834]],"properties":{"id":"24660718","dp":7019,"de":3425}},{"type":"Polygon","arcs":[[835,836,-185,-833,837]],"properties":{"id":"24660719","dp":6743,"de":3362}},{"type":"Polygon","arcs":[[838,-187,839,840]],"properties":{"id":"24660722","dp":14111,"de":2439}},{"type":"Polygon","arcs":[[841,842,-182,-839]],"properties":{"id":"24660723","dp":14735,"de":8730}},{"type":"Polygon","arcs":[[843,-183,-843,844]],"properties":{"id":"24660724","dp":13245,"de":1324}},{"type":"Polygon","arcs":[[-844,845,846,847,848,-168,-177]],"properties":{"id":"24660725","dp":6444,"de":2017}},{"type":"Polygon","arcs":[[849,850,-847,851,852,853]],"properties":{"id":"24660726","dp":4920,"de":3063}},{"type":"Polygon","arcs":[[854,855,856,857,858]],"properties":{"id":"24660749","dp":19316,"de":2278}},{"type":"Polygon","arcs":[[-859,859,860,861,862]],"properties":{"id":"24660750","dp":8036,"de":1740}},{"type":"Polygon","arcs":[[-143,863,-861,864]],"properties":{"id":"24660751","dp":11931,"de":956}},{"type":"Polygon","arcs":[[865,866,867,868]],"properties":{"id":"24662884","dp":4529,"de":0}},{"type":"MultiPolygon","arcs":[[[869,870,871,872,-866,873,874]],[[875]]],"properties":{"id":"24662885","dp":1894,"de":308}},{"type":"Polygon","arcs":[[876,877,-870,878]],"properties":{"id":"24662886","dp":7047,"de":0}},{"type":"Polygon","arcs":[[879,880,881,882,-877,883]],"properties":{"id":"24662887","dp":9032,"de":0}},{"type":"Polygon","arcs":[[884,885,886,887,888,889,890]],"properties":{"id":"24662888","dp":3292,"de":263}},{"type":"Polygon","arcs":[[891,892,-886,893]],"properties":{"id":"24662889","dp":6524,"de":0}},{"type":"Polygon","arcs":[[894,895,-894,-885]],"properties":{"id":"24662890","dp":6933,"de":0}},{"type":"Polygon","arcs":[[896,897,-892,-896,898,899]],"properties":{"id":"24662891","dp":7590,"de":0}},{"type":"Polygon","arcs":[[-900,900,901,902]],"properties":{"id":"24662892","dp":5797,"de":0}},{"type":"Polygon","arcs":[[903,-901,904,905,906]],"properties":{"id":"24662893","dp":4546,"de":0}},{"type":"Polygon","arcs":[[-899,-895,-891,907,-905]],"properties":{"id":"24662894","dp":4164,"de":0}},{"type":"Polygon","arcs":[[-908,908,909,910]],"properties":{"id":"24662895","dp":5343,"de":0}},{"type":"Polygon","arcs":[[-906,-911,911,912]],"properties":{"id":"24662896","dp":5953,"de":684}},{"type":"Polygon","arcs":[[913,914,915,916,917,918]],"properties":{"id":"24661583","dp":2600,"de":306}},{"type":"Polygon","arcs":[[919,920,-915,921]],"properties":{"id":"24661584","dp":2784,"de":451}},{"type":"Polygon","arcs":[[922,923,924,-922,-914]],"properties":{"id":"24661585","dp":4379,"de":948}},{"type":"Polygon","arcs":[[-920,-925,925,926,927]],"properties":{"id":"24661586","dp":2973,"de":0}},{"type":"Polygon","arcs":[[-924,928,929,930,931,932,-926]],"properties":{"id":"24661587","dp":3944,"de":657}},{"type":"Polygon","arcs":[[-927,-933,933,934,935]],"properties":{"id":"24661589","dp":2770,"de":840}},{"type":"Polygon","arcs":[[936,-928,-936,937,938,939]],"properties":{"id":"24661590","dp":2453,"de":284}},{"type":"Polygon","arcs":[[-938,-935,940,941,942,943,944,945]],"properties":{"id":"24661591","dp":3828,"de":3190}},{"type":"Polygon","arcs":[[946,947,948]],"properties":{"id":"24662549","dp":6190,"de":0}},{"type":"Polygon","arcs":[[949,950,951,952,-848,-851]],"properties":{"id":"24660727","dp":7519,"de":983}},{"type":"Polygon","arcs":[[953,954,955,956,957,-950,-850]],"properties":{"id":"24660728","dp":8488,"de":2785}},{"type":"Polygon","arcs":[[958,-954,959,960]],"properties":{"id":"24660729","dp":14304,"de":0}},{"type":"Polygon","arcs":[[961,-955,-959,962]],"properties":{"id":"24660730","dp":11732,"de":4385}},{"type":"Polygon","arcs":[[963,-956,-962,964]],"properties":{"id":"24660731","dp":14750,"de":3333}},{"type":"Polygon","arcs":[[965,966,-964,967]],"properties":{"id":"24660732","dp":11921,"de":2156}},{"type":"Polygon","arcs":[[968,969,-966,970]],"properties":{"id":"24660733","dp":8852,"de":2550}},{"type":"Polygon","arcs":[[971,972,973,-957,-967,-970]],"properties":{"id":"24660734","dp":12379,"de":3291}},{"type":"Polygon","arcs":[[974,975,976,-972,977,978]],"properties":{"id":"24660735","dp":9475,"de":846}},{"type":"Polygon","arcs":[[979,980,-978,-969]],"properties":{"id":"24660736","dp":22776,"de":0}},{"type":"Polygon","arcs":[[981,-979,-981]],"properties":{"id":"24660737","dp":21798,"de":1419}},{"type":"Polygon","arcs":[[982,983,984,-982,-980,-971,-968,-965,-963,-961,985,986,987]],"properties":{"id":"24660738","dp":8438,"de":1526}},{"type":"Polygon","arcs":[[988,989,990,991,992,-983,993]],"properties":{"id":"24660741","dp":26512,"de":3914}},{"type":"Polygon","arcs":[[994,995,-991]],"properties":{"id":"24660742","dp":14478,"de":0}},{"type":"Polygon","arcs":[[996,997,998,999,1000,-995,-990]],"properties":{"id":"24660743","dp":5183,"de":0}},{"type":"Polygon","arcs":[[1001,1002,1003]],"properties":{"id":"24661234","dp":9777,"de":0}},{"type":"Polygon","arcs":[[1004,1005,1006]],"properties":{"id":"24661237","dp":5723,"de":0}},{"type":"Polygon","arcs":[[1007,1008,1009,1010,1011,1012,1013]],"properties":{"id":"24661240","dp":3181,"de":8764}},{"type":"Polygon","arcs":[[-1013,1014]],"properties":{"id":"24661241","dp":7276,"de":0}},{"type":"Polygon","arcs":[[1015,-862,-864,-142,-146,1016]],"properties":{"id":"24660752","dp":4836,"de":653}},{"type":"Polygon","arcs":[[1017,1018,-1017,1019,1020]],"properties":{"id":"24660753","dp":4845,"de":1452}},{"type":"Polygon","arcs":[[1021,-1020,-145,1022,1023,-976]],"properties":{"id":"24660754","dp":6224,"de":1491}},{"type":"Polygon","arcs":[[1024,1025,-1021,-1022,-975,-985]],"properties":{"id":"24660755","dp":11419,"de":4481}},{"type":"Polygon","arcs":[[-977,-1024,1026,1027,-973]],"properties":{"id":"24660756","dp":7419,"de":1093}},{"type":"Polygon","arcs":[[-1023,-149,1028,-1027]],"properties":{"id":"24660757","dp":12898,"de":1759}},{"type":"Polygon","arcs":[[-1029,-151,-154,1029]],"properties":{"id":"24660758","dp":7137,"de":1982}},{"type":"Polygon","arcs":[[-974,-1028,-1030,-156,1030,-958]],"properties":{"id":"24660759","dp":5183,"de":3210}},{"type":"Polygon","arcs":[[-1031,-159,1031,-951]],"properties":{"id":"24660760","dp":7373,"de":3006}},{"type":"Polygon","arcs":[[-1032,-163,1032,-952]],"properties":{"id":"24660761","dp":8741,"de":2532}},{"type":"Polygon","arcs":[[-1033,-167,-169,-849,-953]],"properties":{"id":"24660762","dp":10111,"de":4306}},{"type":"Polygon","arcs":[[1033,1034,1035,-865]],"properties":{"id":"24660763","dp":10505,"de":0}},{"type":"Polygon","arcs":[[-1036,1036,1037,1038,-137,-144]],"properties":{"id":"24660764","dp":6917,"de":1820}},{"type":"Polygon","arcs":[[1039,1040,1041,1042,1043,-1037,-1035,1044]],"properties":{"id":"24660765","dp":12311,"de":6182}},{"type":"Polygon","arcs":[[-1044,1045,1046,-1038]],"properties":{"id":"24660766","dp":10347,"de":1544}},{"type":"Polygon","arcs":[[-1043,1047,1048,1049,1050,-1046]],"properties":{"id":"24660767","dp":4532,"de":0}},{"type":"Polygon","arcs":[[-1039,-1047,-1051,1051,1052,1053]],"properties":{"id":"24660768","dp":3583,"de":487}},{"type":"Polygon","arcs":[[-129,-138,-1054,1054,1055,1056]],"properties":{"id":"24660769","dp":4103,"de":612}},{"type":"Polygon","arcs":[[-130,-1057,1057,-121]],"properties":{"id":"24660770","dp":2805,"de":741}},{"type":"Polygon","arcs":[[-1058,-1056,1058,1059,1060,-108,-119,-122]],"properties":{"id":"24660771","dp":2493,"de":396}},{"type":"Polygon","arcs":[[-1061,1061,1062,-109]],"properties":{"id":"24660772","dp":9883,"de":773}},{"type":"Polygon","arcs":[[1063,1064,1065,-1062]],"properties":{"id":"24660773","dp":9652,"de":0}},{"type":"Polygon","arcs":[[-1066,1066,1067,1068]],"properties":{"id":"24660774","dp":15219,"de":1732}},{"type":"Polygon","arcs":[[1069,-1068,1070,1071,1072,1073,1074]],"properties":{"id":"24660775","dp":8818,"de":2140}},{"type":"Polygon","arcs":[[-1075,1075,1076,1077,1078]],"properties":{"id":"24660776","dp":9580,"de":1881}},{"type":"Polygon","arcs":[[-1074,1079,1080,-1076]],"properties":{"id":"24660777","dp":8269,"de":2884}},{"type":"Polygon","arcs":[[1081,-1079,1082,-693]],"properties":{"id":"24660778","dp":11621,"de":4223}},{"type":"Polygon","arcs":[[1083,1084,1085,1086,1087,1088,1089,1090,1091,1092]],"properties":{"id":"24661262","dp":10544,"de":11245}},{"type":"Polygon","arcs":[[-1093,1093,1094]],"properties":{"id":"24661263","dp":10688,"de":0}},{"type":"Polygon","arcs":[[-1092,1095,-1094]],"properties":{"id":"24661264","dp":14722,"de":599}},{"type":"Polygon","arcs":[[1096,1097,1098,1099,1100,-949,1101,1102,1103,1104,1105,1106]],"properties":{"id":"24662550","dp":5727,"de":546}},{"type":"Polygon","arcs":[[-1101,1107,1108,1109,-947]],"properties":{"id":"24662551","dp":8291,"de":0}},{"type":"Polygon","arcs":[[-1100,1110,1111,-1108]],"properties":{"id":"24662552","dp":10076,"de":0}},{"type":"Polygon","arcs":[[-1109,-1112,1112,1113,1114]],"properties":{"id":"24662553","dp":4893,"de":0}},{"type":"Polygon","arcs":[[1115,1116,-1113,-1111,-1099]],"properties":{"id":"24662554","dp":10898,"de":0}},{"type":"Polygon","arcs":[[-1114,-1117,1117,1118,1119]],"properties":{"id":"24662555","dp":9113,"de":0}},{"type":"Polygon","arcs":[[1120,1121,1122,1123,1124,1125,1126,1127,1128,1129]],"properties":{"id":"24662948","dp":453,"de":63}},{"type":"Polygon","arcs":[[1130,1131,1132,-1123,1133,1134]],"properties":{"id":"24662949","dp":1624,"de":1021}},{"type":"MultiPolygon","arcs":[[[1135,1136,1137,-1129,1138,1139,1140]],[[1141]]],"properties":{"id":"24662951","dp":1327,"de":0}},{"type":"Polygon","arcs":[[1142,1143,1144,1145,1146,1147]],"properties":{"id":"24662952","dp":4083,"de":0}},{"type":"Polygon","arcs":[[1148,1149,-1148,1150,1151,-430]],"properties":{"id":"24662953","dp":1585,"de":954}},{"type":"Polygon","arcs":[[-436,1152,1153,-1149,-429]],"properties":{"id":"24662954","dp":4192,"de":0}},{"type":"Polygon","arcs":[[1154,1155,-1154,1156]],"properties":{"id":"24662955","dp":6779,"de":0}},{"type":"Polygon","arcs":[[-1157,-1153,-458,1157]],"properties":{"id":"24662956","dp":4753,"de":0}},{"type":"Polygon","arcs":[[1158,1159,-1155,-1158,-457,-466]],"properties":{"id":"24662957","dp":4014,"de":0}},{"type":"Polygon","arcs":[[-1010,1160,1161,1162,1163,1164,1165,1166]],"properties":{"id":"24661224","dp":3673,"de":543}},{"type":"Polygon","arcs":[[-1163,1167]],"properties":{"id":"24661225","dp":8734,"de":4430}},{"type":"Polygon","arcs":[[1168,1169,-1164,-1168,-1162,1170]],"properties":{"id":"24661226","dp":6306,"de":1749}},{"type":"Polygon","arcs":[[1171,-1171,-1161,-1009]],"properties":{"id":"24661227","dp":7016,"de":665}},{"type":"Polygon","arcs":[[1172,1173,1174,-1169,-1172]],"properties":{"id":"24661228","dp":5756,"de":1204}},{"type":"Polygon","arcs":[[-1006,1175,-1003,1176,-1173,-1008]],"properties":{"id":"24661229","dp":12388,"de":530}},{"type":"Polygon","arcs":[[-1177,1177,1178,1179,1180,-1174]],"properties":{"id":"24661230","dp":5897,"de":482}},{"type":"Polygon","arcs":[[-1165,-1170,-1175,-1181]],"properties":{"id":"24661231","dp":5275,"de":0}},{"type":"Polygon","arcs":[[1181,1182,-1179,1183]],"properties":{"id":"24661232","dp":9961,"de":1413}},{"type":"Polygon","arcs":[[-1184,-1178,-1002,1184]],"properties":{"id":"24661233","dp":8900,"de":955}},{"type":"MultiPolygon","arcs":[[[1185,-821,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200]],[[1201,1202]]],"properties":{"id":"24661242","dp":258,"de":753}},{"type":"Polygon","arcs":[[1203,1204,-1193]],"properties":{"id":"24661243","dp":11314,"de":11896}},{"type":"Polygon","arcs":[[1205,1206,1207,-1194,-1205]],"properties":{"id":"24661244","dp":15228,"de":1428}},{"type":"Polygon","arcs":[[1208,-1084,-1095,-1096,-1091,1209,1210,1211]],"properties":{"id":"24661265","dp":4266,"de":28208}},{"type":"Polygon","arcs":[[1212,1213,1214,1215,1216,1217,1218]],"properties":{"id":"24660302","dp":1865,"de":2736}},{"type":"Polygon","arcs":[[1219,1220,1221,1222,-1213,1223]],"properties":{"id":"24660303","dp":3634,"de":3670}},{"type":"Polygon","arcs":[[1224,-1195,-1208]],"properties":{"id":"24661245","dp":9284,"de":994}},{"type":"Polygon","arcs":[[1225,-1196,-1225,-1207,1226]],"properties":{"id":"24661246","dp":11670,"de":1002}},{"type":"Polygon","arcs":[[1227,-1227,-1206,-1204,1228]],"properties":{"id":"24661247","dp":12923,"de":2769}},{"type":"Polygon","arcs":[[1229,-1229,-1192]],"properties":{"id":"24661248","dp":9450,"de":2094}},{"type":"Polygon","arcs":[[-1191,1230,1231,1232,-1228,-1230]],"properties":{"id":"24661249","dp":10381,"de":2359}},{"type":"Polygon","arcs":[[1233,1234,1235,1236,-1197,-1226,-1233]],"properties":{"id":"24661250","dp":9612,"de":862}},{"type":"Polygon","arcs":[[1237,1238,-1198,-1237]],"properties":{"id":"24661251","dp":12371,"de":1482}},{"type":"Polygon","arcs":[[-1239,1239,1240,1241,1242,1243,-1199]],"properties":{"id":"24661252","dp":4372,"de":11270}},{"type":"Polygon","arcs":[[1244,1245,1246]],"properties":{"id":"24661255","dp":8291,"de":32020}},{"type":"Polygon","arcs":[[-1247,1247,1248,1249,1250,1251,1252]],"properties":{"id":"24661256","dp":4213,"de":74639}},{"type":"Polygon","arcs":[[1253,-1252,1254,1255,1256]],"properties":{"id":"24661257","dp":4213,"de":39480}},{"type":"Polygon","arcs":[[1257,1258,1259,-1255]],"properties":{"id":"24661258","dp":5163,"de":5655}},{"type":"Polygon","arcs":[[-1260,1260,1261,1262,-1256]],"properties":{"id":"24661259","dp":3602,"de":49947}},{"type":"Polygon","arcs":[[1263,-1085,1264,-1261,-1259]],"properties":{"id":"24661260","dp":15390,"de":21335}},{"type":"Polygon","arcs":[[-1265,-1209,1265,-1262]],"properties":{"id":"24661261","dp":13935,"de":18783}},{"type":"Polygon","arcs":[[1266,1267,1268,1269,1270]],"properties":{"id":"24661269","dp":10143,"de":15503}},{"type":"Polygon","arcs":[[1271,1272,1273,-1268,1274]],"properties":{"id":"24661270","dp":25177,"de":24703}},{"type":"Polygon","arcs":[[1275,-1275,-1267,1276]],"properties":{"id":"24661271","dp":23439,"de":12698}},{"type":"Polygon","arcs":[[1277,1278,1279,-1272,-1276,1280]],"properties":{"id":"24661272","dp":23659,"de":14245}},{"type":"Polygon","arcs":[[1281,1282,-1279]],"properties":{"id":"24661273","dp":34525,"de":28212}},{"type":"Polygon","arcs":[[1283,1284,1285,1286,1287]],"properties":{"id":"24661276","dp":32985,"de":4228}},{"type":"Polygon","arcs":[[1288,1289,1290,-1285,1291,1292,1293]],"properties":{"id":"24661277","dp":19180,"de":1803}},{"type":"Polygon","arcs":[[1294,1295,1296,-1290,1297,1298]],"properties":{"id":"24661278","dp":19310,"de":3918}},{"type":"Polygon","arcs":[[-1298,-1289,1299]],"properties":{"id":"24661279","dp":23975,"de":0}},{"type":"Polygon","arcs":[[1300,-1300,1301,1302]],"properties":{"id":"24661280","dp":30720,"de":11261}},{"type":"Polygon","arcs":[[1303,-1302,-1294,1304]],"properties":{"id":"24661281","dp":39278,"de":6443}},{"type":"Polygon","arcs":[[1305,-1305,-1293,1306,-1278]],"properties":{"id":"24661282","dp":20572,"de":14583}},{"type":"Polygon","arcs":[[-1250,1307,1308,1309,1310,1311,-1303,-1304,-1306,1312,1313]],"properties":{"id":"24661283","dp":3006,"de":135078}},{"type":"Polygon","arcs":[[1314,1315,-1299,-1301,-1312]],"properties":{"id":"24661284","dp":5856,"de":10763}},{"type":"Polygon","arcs":[[-1316,1316,1317,-1295]],"properties":{"id":"24661285","dp":31428,"de":2747}},{"type":"Polygon","arcs":[[1318,1319,-1296,-1318]],"properties":{"id":"24661286","dp":19859,"de":4205}},{"type":"Polygon","arcs":[[1320,1321,1322,1323,1324,1325,1326,1327,1328,1329]],"properties":{"id":"24661299","dp":1509,"de":12065}},{"type":"Polygon","arcs":[[1330,1331,1332,-1327]],"properties":{"id":"24661300","dp":12480,"de":0}},{"type":"Polygon","arcs":[[1333,1334,1335,1336,-1331,-1326]],"properties":{"id":"24661301","dp":9872,"de":3200}},{"type":"Polygon","arcs":[[-1337,1337,1338,1339,-1332]],"properties":{"id":"24661302","dp":7579,"de":1460}},{"type":"Polygon","arcs":[[-1338,-1336,1340,1341,1342]],"properties":{"id":"24661303","dp":7226,"de":2176}},{"type":"Polygon","arcs":[[1343,1344,1345,-1342]],"properties":{"id":"24661304","dp":6115,"de":1652}},{"type":"Polygon","arcs":[[1346,-1345,1347,1348]],"properties":{"id":"24661305","dp":11550,"de":7219}},{"type":"Polygon","arcs":[[-1349,1349,1350,1351]],"properties":{"id":"24661306","dp":33834,"de":0}},{"type":"Polygon","arcs":[[1352,1353,-1351]],"properties":{"id":"24661308","dp":20664,"de":0}},{"type":"Polygon","arcs":[[-1350,-1348,1354,1355,1356,1357,-1353]],"properties":{"id":"24661309","dp":4461,"de":8568}},{"type":"Polygon","arcs":[[1358,1359,-1358]],"properties":{"id":"24661310","dp":20965,"de":0}},{"type":"Polygon","arcs":[[1360,1361,1362,1363,1364,1365]],"properties":{"id":"24660395","dp":10242,"de":0}},{"type":"Polygon","arcs":[[1366,1367,1368,1369,1370,-1363]],"properties":{"id":"24660396","dp":10130,"de":0}},{"type":"Polygon","arcs":[[-1366,1371,1372]],"properties":{"id":"24660397","dp":11880,"de":0}},{"type":"Polygon","arcs":[[1373,1374,-1361,-1373,1375,1376,1377,1378,1379,1380,1381]],"properties":{"id":"24660398","dp":3646,"de":2889}},{"type":"Polygon","arcs":[[1382,1383,1384,1385,1386]],"properties":{"id":"24660335","dp":6886,"de":2422}},{"type":"Polygon","arcs":[[1387,1388,1389,1390,1391,1392,-391]],"properties":{"id":"24662081","dp":10320,"de":2533}},{"type":"Polygon","arcs":[[1393,1394,1395,1396,1397]],"properties":{"id":"24660194","dp":6417,"de":1819}},{"type":"Polygon","arcs":[[1398,1399,1400]],"properties":{"id":"24660195","dp":6399,"de":2060}},{"type":"Polygon","arcs":[[1401,1402,1403,1404,-1395,1405,1406]],"properties":{"id":"24660196","dp":6960,"de":1062}},{"type":"Polygon","arcs":[[1407,1408,1409,-1403,1410]],"properties":{"id":"24660197","dp":8815,"de":877}},{"type":"Polygon","arcs":[[1411,1412,1413,-1408,1414,1415,1416]],"properties":{"id":"24660198","dp":5286,"de":423}},{"type":"Polygon","arcs":[[1417,1418,1419,1420,1421,1422,-1409,-1414,1423]],"properties":{"id":"24660199","dp":2222,"de":4573}},{"type":"Polygon","arcs":[[1424,1425,1426,1427,1428,-1214,-1223]],"properties":{"id":"24660304","dp":7336,"de":2680}},{"type":"Polygon","arcs":[[1429,1430,1431,-1425,-1222]],"properties":{"id":"24660305","dp":14721,"de":0}},{"type":"Polygon","arcs":[[1432,1433,-1426,-1432]],"properties":{"id":"24660306","dp":14441,"de":0}},{"type":"Polygon","arcs":[[1434,1435,-1427,-1434]],"properties":{"id":"24660307","dp":13449,"de":0}},{"type":"Polygon","arcs":[[-392,-1393,1436,1437]],"properties":{"id":"24662082","dp":32198,"de":0}},{"type":"Polygon","arcs":[[-393,-1438,1438]],"properties":{"id":"24662083","dp":16061,"de":0}},{"type":"Polygon","arcs":[[-1439,-1437,-1392,1439,1440,1441,1442,1443,-394]],"properties":{"id":"24662084","dp":3544,"de":786}},{"type":"Polygon","arcs":[[-1444,1444,1445,-395]],"properties":{"id":"24662085","dp":9063,"de":550}},{"type":"Polygon","arcs":[[1446,-1446,1447,1448,1449]],"properties":{"id":"24662086","dp":9446,"de":2551}},{"type":"Polygon","arcs":[[1450,1451,1452,1453,1454]],"properties":{"id":"24662087","dp":21285,"de":2428}},{"type":"Polygon","arcs":[[1455,1456,-1452,1457]],"properties":{"id":"24662088","dp":19668,"de":0}},{"type":"Polygon","arcs":[[1458,1459,1460,1461,1462,1463,1464,1465,1466,-1453,-1457,1467,1468,1469]],"properties":{"id":"24662089","dp":3893,"de":3973}},{"type":"Polygon","arcs":[[1470,1471,1472,1473,-1461]],"properties":{"id":"24662090","dp":7603,"de":1143}},{"type":"Polygon","arcs":[[1474,1475,-1471,-1460,1476,1477,1478]],"properties":{"id":"24662091","dp":4567,"de":2314}},{"type":"Polygon","arcs":[[1479,-1479,1480,1481,1482]],"properties":{"id":"24662092","dp":16334,"de":0}},{"type":"Polygon","arcs":[[1483,-1483,1484,1485]],"properties":{"id":"24662093","dp":17883,"de":0}},{"type":"Polygon","arcs":[[1486,1487,1488,1489,-1480,-1484]],"properties":{"id":"24662094","dp":16941,"de":0}},{"type":"Polygon","arcs":[[1490,1491,1492,1493]],"properties":{"id":"24662095","dp":10494,"de":3268}},{"type":"Polygon","arcs":[[1494,1495,1496,-1491,1497]],"properties":{"id":"24662096","dp":11922,"de":2375}},{"type":"Polygon","arcs":[[1498,1499,1500,-1496,1501]],"properties":{"id":"24662097","dp":14433,"de":1889}},{"type":"Polygon","arcs":[[1502,1503,1504]],"properties":{"id":"24662425","dp":2648,"de":227}},{"type":"Polygon","arcs":[[1505,1506,1507,1508,1509,-1505,1510,1511,1512]],"properties":{"id":"24662426","dp":2375,"de":642}},{"type":"Polygon","arcs":[[1513,1514,-1507,1515,1516]],"properties":{"id":"24662427","dp":2989,"de":0}},{"type":"Polygon","arcs":[[1517,-1516,-1506,1518]],"properties":{"id":"24662428","dp":3507,"de":0}},{"type":"Polygon","arcs":[[1519,1520,-1517,-1518]],"properties":{"id":"24662429","dp":2811,"de":0}},{"type":"Polygon","arcs":[[1521,1522,-1514,-1521,1523,1524]],"properties":{"id":"24662430","dp":3947,"de":3220}},{"type":"Polygon","arcs":[[1525,1526,-1525]],"properties":{"id":"24662431","dp":3490,"de":0}},{"type":"Polygon","arcs":[[1527,1528,1529,-1522,-1527,1530,1531,1532]],"properties":{"id":"24662432","dp":60,"de":3143}},{"type":"Polygon","arcs":[[1533,1534,1535,1536]],"properties":{"id":"24661691","dp":10052,"de":0}},{"type":"Polygon","arcs":[[1537,1538,1539,-1535]],"properties":{"id":"24661692","dp":12677,"de":1036}},{"type":"Polygon","arcs":[[1540,1541,1542,1543,1544,1545]],"properties":{"id":"24660275","dp":14750,"de":4621}},{"type":"Polygon","arcs":[[1546,1547,1548,1549,1550,1551]],"properties":{"id":"24660276","dp":4398,"de":1077}},{"type":"Polygon","arcs":[[1552,1553,-1549]],"properties":{"id":"24660277","dp":7535,"de":991}},{"type":"Polygon","arcs":[[-1548,1554,1555,1556,1557,-1553]],"properties":{"id":"24660278","dp":3608,"de":0}},{"type":"Polygon","arcs":[[1558,1559,-1557,1560,1561]],"properties":{"id":"24660279","dp":4084,"de":0}},{"type":"Polygon","arcs":[[-1561,-1556,1562,1563,1564,1565,1566,1567]],"properties":{"id":"24660280","dp":3697,"de":0}},{"type":"Polygon","arcs":[[1568,-1562,-1568,1569,1570]],"properties":{"id":"24660281","dp":6639,"de":3983}},{"type":"Polygon","arcs":[[-1571,-1430,-1221,1571,1572]],"properties":{"id":"24660282","dp":15441,"de":0}},{"type":"Polygon","arcs":[[-1559,-1569,-1573,1573,1574,1575]],"properties":{"id":"24660283","dp":8896,"de":2252}},{"type":"Polygon","arcs":[[-1574,-1572,-1220,1576,1577]],"properties":{"id":"24660284","dp":12043,"de":0}},{"type":"Polygon","arcs":[[-1575,-1578,1578,1579,1580]],"properties":{"id":"24660285","dp":12352,"de":1069}},{"type":"Polygon","arcs":[[1581,1582,-1580,1583]],"properties":{"id":"24660286","dp":11359,"de":0}},{"type":"Polygon","arcs":[[1584,1585,-1582,1586]],"properties":{"id":"24660287","dp":11125,"de":0}},{"type":"Polygon","arcs":[[-1550,-1554,-1558,-1560,-1576,-1581,-1583,-1586,1587]],"properties":{"id":"24660288","dp":2997,"de":572}},{"type":"Polygon","arcs":[[-1551,-1588,-1585,1588,1589]],"properties":{"id":"24660289","dp":4436,"de":3209}},{"type":"Polygon","arcs":[[-1589,-1587,-1584,-1579,-1577,-1224,-1219,1590,1591,1592,1593,1594]],"properties":{"id":"24660290","dp":881,"de":5260}},{"type":"Polygon","arcs":[[1595,1596,1597,-1593]],"properties":{"id":"24660291","dp":13029,"de":0}},{"type":"Polygon","arcs":[[-1597,1598,1599,1600,1601]],"properties":{"id":"24660292","dp":14340,"de":3085}},{"type":"Polygon","arcs":[[-1599,-1596,-1592,1602,1603]],"properties":{"id":"24660293","dp":9424,"de":0}},{"type":"Polygon","arcs":[[-1604,1604,1605,1606,1607,-1600]],"properties":{"id":"24660294","dp":7266,"de":0}},{"type":"Polygon","arcs":[[-1601,-1608,1608,1609,1610]],"properties":{"id":"24660295","dp":10255,"de":0}},{"type":"Polygon","arcs":[[-1607,1611,1612,1613,1614,-1609]],"properties":{"id":"24660296","dp":10027,"de":1426}},{"type":"Polygon","arcs":[[-1614,1615,1616]],"properties":{"id":"24660297","dp":8167,"de":0}},{"type":"Polygon","arcs":[[-1613,1617,1618,-1616]],"properties":{"id":"24660298","dp":6766,"de":0}},{"type":"Polygon","arcs":[[1619,1620,1621,-1618,-1612,-1606]],"properties":{"id":"24660299","dp":8714,"de":2254}},{"type":"Polygon","arcs":[[-1603,-1591,-1218,1622,-1620,-1605]],"properties":{"id":"24660300","dp":4604,"de":0}},{"type":"Polygon","arcs":[[-1217,1623,1624,1625,1626,-1621,-1623]],"properties":{"id":"24660301","dp":1470,"de":1672}},{"type":"Polygon","arcs":[[1627,1628,1629,-1428,-1436,1630]],"properties":{"id":"24660308","dp":11556,"de":0}},{"type":"Polygon","arcs":[[1631,1632,-1628,1633]],"properties":{"id":"24660309","dp":7460,"de":0}},{"type":"Polygon","arcs":[[1634,1635,1636,-1632]],"properties":{"id":"24660310","dp":14345,"de":0}},{"type":"Polygon","arcs":[[1637,1638,1639,1640,-1636,1641]],"properties":{"id":"24660311","dp":13577,"de":0}},{"type":"Polygon","arcs":[[1642,-1639]],"properties":{"id":"24660312","dp":11893,"de":0}},{"type":"Polygon","arcs":[[1643,1644,1645,1646,-1640,-1643,-1638]],"properties":{"id":"24660313","dp":4276,"de":3872}},{"type":"Polygon","arcs":[[1647,1648,1649,1650,1651,-1646,1652]],"properties":{"id":"24660314","dp":1610,"de":1587}},{"type":"Polygon","arcs":[[1653,1654,-1649,1655]],"properties":{"id":"24660315","dp":4853,"de":0}},{"type":"Polygon","arcs":[[1656,-1654,1657]],"properties":{"id":"24660316","dp":10881,"de":0}},{"type":"Polygon","arcs":[[1658,1659,1660]],"properties":{"id":"24660319","dp":15719,"de":0}},{"type":"Polygon","arcs":[[1661,1662,1663,-1659,1664]],"properties":{"id":"24660320","dp":17446,"de":0}},{"type":"Polygon","arcs":[[1665,-1665,1666,1667]],"properties":{"id":"24660321","dp":14506,"de":0}},{"type":"Polygon","arcs":[[1668,-1662,-1666,1669]],"properties":{"id":"24660322","dp":15473,"de":0}},{"type":"Polygon","arcs":[[1670,1671,1672,1673,-1663,-1669]],"properties":{"id":"24660323","dp":9120,"de":0}},{"type":"Polygon","arcs":[[1674,1675,1676,-1672]],"properties":{"id":"24660324","dp":14019,"de":1331}},{"type":"Polygon","arcs":[[-1673,-1677,1677,1678,1679]],"properties":{"id":"24660325","dp":18655,"de":0}},{"type":"Polygon","arcs":[[1680,-1679,1681,1682]],"properties":{"id":"24660326","dp":13955,"de":0}},{"type":"Polygon","arcs":[[1683,-1683,1684]],"properties":{"id":"24660327","dp":14862,"de":0}},{"type":"Polygon","arcs":[[1685,1686,1687,1688,-1685,-1682,1689]],"properties":{"id":"24660328","dp":15552,"de":1036}},{"type":"Polygon","arcs":[[1690,1691,1692,1693,-1688]],"properties":{"id":"24660329","dp":20916,"de":0}},{"type":"Polygon","arcs":[[1694,1695,1696,-1692,1697,1698]],"properties":{"id":"24660330","dp":15639,"de":1044}},{"type":"Polygon","arcs":[[1699,1700,-1696]],"properties":{"id":"24660331","dp":23619,"de":2941}},{"type":"Polygon","arcs":[[-1701,1701,1702,1703]],"properties":{"id":"24660332","dp":12557,"de":0}},{"type":"Polygon","arcs":[[-1703,1704,1705,1706]],"properties":{"id":"24660333","dp":26931,"de":0}},{"type":"Polygon","arcs":[[-1704,-1707,-1384,1707,-1693,-1697]],"properties":{"id":"24660334","dp":17231,"de":1612}},{"type":"Polygon","arcs":[[1708,1709,1710,1711,1712]],"properties":{"id":"24660840","dp":7241,"de":1239}},{"type":"Polygon","arcs":[[1713,-1712,1714,1715,1716]],"properties":{"id":"24660841","dp":11728,"de":793}},{"type":"Polygon","arcs":[[-1715,-1711,1717,1718,1719,1720]],"properties":{"id":"24660842","dp":15317,"de":2705}},{"type":"Polygon","arcs":[[1721,1722,1723,1724,1725]],"properties":{"id":"24660216","dp":12738,"de":0}},{"type":"Polygon","arcs":[[1726,1727,1728,-1723,1729]],"properties":{"id":"24660217","dp":20416,"de":3472}},{"type":"Polygon","arcs":[[1730,-1543,1731,-1728]],"properties":{"id":"24660218","dp":6618,"de":948}},{"type":"Polygon","arcs":[[-1544,-1731,-1727,1732,1733]],"properties":{"id":"24660219","dp":9982,"de":1158}},{"type":"Polygon","arcs":[[-1540,1734,1735]],"properties":{"id":"24661693","dp":10767,"de":0}},{"type":"Polygon","arcs":[[-1735,1736,1737,1738,1739,1740,1741]],"properties":{"id":"24661694","dp":4665,"de":18681}},{"type":"Polygon","arcs":[[-1740,1742,1743,1744]],"properties":{"id":"24661695","dp":10363,"de":0}},{"type":"Polygon","arcs":[[1745,-1741,-1745,1746,1747,1748,1749]],"properties":{"id":"24661696","dp":10017,"de":853}},{"type":"Polygon","arcs":[[1750,1751,-1747,-1744,1752,1753]],"properties":{"id":"24661697","dp":18777,"de":783}},{"type":"Polygon","arcs":[[-1748,-1752,1754,1755,1756]],"properties":{"id":"24661698","dp":9695,"de":0}},{"type":"Polygon","arcs":[[-1755,-1751,1757,1758,1759]],"properties":{"id":"24661699","dp":10851,"de":0}},{"type":"Polygon","arcs":[[-1754,1760,1761,1762,1763,1764,1765,-1758]],"properties":{"id":"24661700","dp":5499,"de":550}},{"type":"Polygon","arcs":[[1766,-1756,-1760,1767,1768,1769]],"properties":{"id":"24661701","dp":6071,"de":0}},{"type":"Polygon","arcs":[[1770,-1768]],"properties":{"id":"24661702","dp":12620,"de":0}},{"type":"MultiPolygon","arcs":[[[1771,1772,1773,1774,1775,1776,1777,1778,1779]],[[1780,1781]],[[1782,1783]],[[1784,1785]]],"properties":{"id":"24662193","dp":2677,"de":1628}},{"type":"Polygon","arcs":[[1786,1787,1788,1789,1790,-1776]],"properties":{"id":"24662194","dp":11546,"de":1251}},{"type":"Polygon","arcs":[[-1777,-1791,1791]],"properties":{"id":"24662195","dp":9233,"de":0}},{"type":"Polygon","arcs":[[1792,1793,-1789]],"properties":{"id":"24662196","dp":9212,"de":0}},{"type":"Polygon","arcs":[[1794,1795,1796,1797,-1790,-1794]],"properties":{"id":"24662197","dp":5282,"de":1479}},{"type":"Polygon","arcs":[[-1795,1798,1799,1800]],"properties":{"id":"24662198","dp":9160,"de":839}},{"type":"Polygon","arcs":[[1801,1802,1803,1804,1805,-1801]],"properties":{"id":"24662199","dp":11124,"de":1282}},{"type":"Polygon","arcs":[[1806,1807,1808,-1802]],"properties":{"id":"24662200","dp":26084,"de":0}},{"type":"Polygon","arcs":[[-1809,1809,1810,-1803]],"properties":{"id":"24662201","dp":18007,"de":0}},{"type":"Polygon","arcs":[[1811,1812,-1804,-1811]],"properties":{"id":"24662202","dp":14267,"de":0}},{"type":"Polygon","arcs":[[-1812,-1810,-1808,1813,1814,1815,1816]],"properties":{"id":"24662203","dp":16359,"de":963}},{"type":"Polygon","arcs":[[-1800,1817,-1814,-1807]],"properties":{"id":"24662204","dp":48198,"de":0}},{"type":"Polygon","arcs":[[1818,-1805,-1813,-1817,1819,1820],[1821]],"properties":{"id":"24662205","dp":7167,"de":0}},{"type":"Polygon","arcs":[[-1822]],"properties":{"id":"24662206","dp":8176,"de":828}},{"type":"Polygon","arcs":[[1822,-1385,-1706]],"properties":{"id":"24660336","dp":24911,"de":0}},{"type":"Polygon","arcs":[[1823,1824,1825,1826,1827,1828,1829,-1386,-1823,-1705,1830]],"properties":{"id":"24660337","dp":1429,"de":714}},{"type":"Polygon","arcs":[[1831,1832,-1824,1833]],"properties":{"id":"24660338","dp":26878,"de":0}},{"type":"Polygon","arcs":[[-1825,-1833,1834]],"properties":{"id":"24660339","dp":24393,"de":0}},{"type":"Polygon","arcs":[[-1826,-1835,-1832,1835,1836]],"properties":{"id":"24660340","dp":5519,"de":0}},{"type":"Polygon","arcs":[[-1836,1837,1838]],"properties":{"id":"24660341","dp":20785,"de":0}},{"type":"Polygon","arcs":[[1839,-1837,-1839,1840]],"properties":{"id":"24660342","dp":15495,"de":0}},{"type":"Polygon","arcs":[[-1840,1841,1842,1843,1844,1845,-1827]],"properties":{"id":"24660343","dp":7521,"de":2920}},{"type":"Polygon","arcs":[[-1841,1846,1847,1848,-1842]],"properties":{"id":"24660344","dp":21048,"de":0}},{"type":"Polygon","arcs":[[1849,-1843,-1849,1850,1851,1852,1853]],"properties":{"id":"24660345","dp":17427,"de":2624}},{"type":"Polygon","arcs":[[1854,1855,-1844,-1850,1856]],"properties":{"id":"24660346","dp":17276,"de":0}},{"type":"Polygon","arcs":[[1857,1858,-1855,1859]],"properties":{"id":"24660347","dp":14938,"de":2006}},{"type":"Polygon","arcs":[[-1860,-1857,1860,1861]],"properties":{"id":"24660348","dp":4517,"de":3622}},{"type":"Polygon","arcs":[[1862,1863,-1861,-1854,1864,1865,1866]],"properties":{"id":"24660349","dp":10616,"de":2312}},{"type":"Polygon","arcs":[[-1853,1867,1868,-1865]],"properties":{"id":"24660350","dp":29850,"de":2500}},{"type":"Polygon","arcs":[[-1852,1869,1870,-1868]],"properties":{"id":"24660351","dp":26300,"de":0}},{"type":"Polygon","arcs":[[-1870,1871]],"properties":{"id":"24660352","dp":26515,"de":0}},{"type":"Polygon","arcs":[[1872,1873,1874,-1871,-1872,-1851,-1848,1875,1876,1877,1878,1879,1880,1881]],"properties":{"id":"24660353","dp":504,"de":4974}},{"type":"Polygon","arcs":[[-1875,1882,-1866,-1869]],"properties":{"id":"24660354","dp":21788,"de":0}},{"type":"Polygon","arcs":[[1883,1884,1885,1886,-1867,-1883,-1874]],"properties":{"id":"24660355","dp":5610,"de":5052}},{"type":"Polygon","arcs":[[1887,1888,-1863,-1887,1889]],"properties":{"id":"24660356","dp":10344,"de":0}},{"type":"Polygon","arcs":[[1890,-1890,-1886,1891]],"properties":{"id":"24660357","dp":10936,"de":2224}},{"type":"Polygon","arcs":[[1892,1893,-1888,-1891,1894]],"properties":{"id":"24660358","dp":4829,"de":3930}},{"type":"Polygon","arcs":[[1895,1896,1897,1898,-1895,-1892,1899]],"properties":{"id":"24660359","dp":5068,"de":5425}},{"type":"Polygon","arcs":[[-1900,-1885,1900,1901]],"properties":{"id":"24660360","dp":9188,"de":4752}},{"type":"Polygon","arcs":[[1902,1903,-1896,-1902,1904,1905]],"properties":{"id":"24660361","dp":8870,"de":2419}},{"type":"Polygon","arcs":[[-1905,-1901,-1884,-1873,1906,1907,1908]],"properties":{"id":"24660362","dp":5838,"de":1838}},{"type":"Polygon","arcs":[[1909,1910,-1908]],"properties":{"id":"24660363","dp":21333,"de":0}},{"type":"Polygon","arcs":[[1911,1912,1913,1914,1915,-997,-989]],"properties":{"id":"24660870","dp":2283,"de":3942}},{"type":"Polygon","arcs":[[-1413,1916,1917,1918,1919,-1424]],"properties":{"id":"24660200","dp":5940,"de":1495}},{"type":"Polygon","arcs":[[1920,-1418,-1920]],"properties":{"id":"24660201","dp":15261,"de":0}},{"type":"Polygon","arcs":[[-1919,1921,1922,-1419,-1921]],"properties":{"id":"24660202","dp":14923,"de":0}},{"type":"Polygon","arcs":[[-621,1923,-614,1924,1925,1926,1927,1928,1929,1930,1931,-1422,1932]],"properties":{"id":"24660203","dp":1500,"de":6992}},{"type":"Polygon","arcs":[[-615,-1924,-620]],"properties":{"id":"24660204","dp":12657,"de":4931}},{"type":"Polygon","arcs":[[1933,1934,1935,1936,1937,1938,1939,1940,1941,1942]],"properties":{"id":"24660812","dp":1273,"de":772}},{"type":"Polygon","arcs":[[1943,1944,-1926]],"properties":{"id":"24660205","dp":20945,"de":1879}},{"type":"Polygon","arcs":[[-607,-1944,-1925,-613]],"properties":{"id":"24660206","dp":15395,"de":0}},{"type":"Polygon","arcs":[[1945,1946,1947,1948,1949,-1928],[1950]],"properties":{"id":"24660207","dp":3459,"de":1886}},{"type":"Polygon","arcs":[[-1951]],"properties":{"id":"24660208","dp":10092,"de":15797}},{"type":"Polygon","arcs":[[1951,1952,-1769,-1771,-1759,-1766,1953,1954,1955,-1595,-1929,-1950]],"properties":{"id":"24660209","dp":919,"de":4717}},{"type":"Polygon","arcs":[[-1765,1956,1957,-1954]],"properties":{"id":"24660210","dp":12107,"de":924}},{"type":"Polygon","arcs":[[1958,1959,-1957,-1764]],"properties":{"id":"24660211","dp":11984,"de":0}},{"type":"Polygon","arcs":[[-1960,1960,-1726,1961]],"properties":{"id":"24660212","dp":17538,"de":0}},{"type":"Polygon","arcs":[[-1962,1962,1963,-1955,-1958]],"properties":{"id":"24660213","dp":10966,"de":5098}},{"type":"Polygon","arcs":[[-1725,1964,-1963]],"properties":{"id":"24660214","dp":16655,"de":0}},{"type":"Polygon","arcs":[[-1965,-1724,-1729,-1732,-1542,-1552,-1590,-1956,-1964]],"properties":{"id":"24660215","dp":2931,"de":6869}},{"type":"Polygon","arcs":[[1965,1966,1967,1968,1969,1970,1971,1972]],"properties":{"id":"24660710","dp":1058,"de":289}},{"type":"Polygon","arcs":[[1973,1974,1975,1976,-1966,1977,1978]],"properties":{"id":"24660711","dp":2449,"de":1123}},{"type":"Polygon","arcs":[[1979,1980,-1974,1981,1982]],"properties":{"id":"24660712","dp":3549,"de":827}},{"type":"Polygon","arcs":[[1983,-1975,-1981,1984]],"properties":{"id":"24660713","dp":5000,"de":1076}},{"type":"Polygon","arcs":[[-1980,1985,1986,-823,-827,1987,1988,-1985]],"properties":{"id":"24660714","dp":2684,"de":481}},{"type":"Polygon","arcs":[[1989,1990,-1716,-1721]],"properties":{"id":"24660843","dp":9278,"de":2295}},{"type":"Polygon","arcs":[[-857,-1990,1991,1992]],"properties":{"id":"24660844","dp":19828,"de":0}},{"type":"Polygon","arcs":[[-858,-1993,1993,1994]],"properties":{"id":"24660845","dp":19557,"de":0}},{"type":"Polygon","arcs":[[-1995,1995,-1045,-1034,-860]],"properties":{"id":"24660846","dp":9328,"de":629}},{"type":"Polygon","arcs":[[-1994,1996,1997,-1040,-1996]],"properties":{"id":"24660847","dp":15994,"de":1771}},{"type":"Polygon","arcs":[[-1992,-1720,1998,1999,-1997]],"properties":{"id":"24660848","dp":20817,"de":0}},{"type":"Polygon","arcs":[[-2000,2000,2001,2002,-1041,-1998]],"properties":{"id":"24660849","dp":12334,"de":0}},{"type":"Polygon","arcs":[[2003,2004,-2001,-1999,-1719]],"properties":{"id":"24660850","dp":8991,"de":0}},{"type":"Polygon","arcs":[[2005,-2002,-2005,2006,2007,-1049]],"properties":{"id":"24660851","dp":3291,"de":663}},{"type":"Polygon","arcs":[[-2003,-2006,-1048,-1042]],"properties":{"id":"24660852","dp":15593,"de":0}},{"type":"Polygon","arcs":[[2008,2009,2010,2011,-1733,-1730,2012]],"properties":{"id":"24660220","dp":15119,"de":3030}},{"type":"Polygon","arcs":[[2013,2014,-2010]],"properties":{"id":"24660221","dp":9971,"de":0}},{"type":"Polygon","arcs":[[-1959,-1763,2015,-2013,-1722,-1961]],"properties":{"id":"24660222","dp":7621,"de":4405}},{"type":"Polygon","arcs":[[-2014,-2009,-2016,-1762,2016]],"properties":{"id":"24660223","dp":12115,"de":0}},{"type":"Polygon","arcs":[[2017,-2011,-2015,-2017,-1761,-1753]],"properties":{"id":"24660224","dp":7843,"de":2973}},{"type":"Polygon","arcs":[[-1739,2018,2019,2020,-2012,-2018,-1743]],"properties":{"id":"24660225","dp":10223,"de":1807}},{"type":"Polygon","arcs":[[2021,2022,2023,-2019,-1738]],"properties":{"id":"24660226","dp":10194,"de":0}},{"type":"Polygon","arcs":[[2024,2025,2026,-1939,2027,2028,2029,2030,2031,-1821,2032,2033,-1533,2034]],"properties":{"id":"24662433","dp":75,"de":1528}},{"type":"Polygon","arcs":[[2035,-2025,2036,2037,2038,2039,2040,2041,2042]],"properties":{"id":"24662434","dp":383,"de":566}},{"type":"Polygon","arcs":[[2043,2044,2045,2046,2047,2048,2049,2050,-2038,2051,2052]],"properties":{"id":"24662435","dp":1157,"de":196}},{"type":"Polygon","arcs":[[-2049,2053,2054]],"properties":{"id":"24662436","dp":4584,"de":978}},{"type":"Polygon","arcs":[[2055,2056,-2046,2057]],"properties":{"id":"24662439","dp":12768,"de":2066}},{"type":"Polygon","arcs":[[2058,-2047,-2057]],"properties":{"id":"24662440","dp":8561,"de":499}},{"type":"Polygon","arcs":[[2059,2060]],"properties":{"id":"24662442","dp":12774,"de":0}},{"type":"Polygon","arcs":[[2061,2062,2063,2064,2065]],"properties":{"id":"24662871","dp":4619,"de":469}},{"type":"Polygon","arcs":[[-2064,2066,2067,2068,-867,2069]],"properties":{"id":"24662872","dp":2712,"de":0}},{"type":"Polygon","arcs":[[2070,2071,-2068,2072,2073]],"properties":{"id":"24662873","dp":8395,"de":0}},{"type":"Polygon","arcs":[[2074,2075,-2073,-2067,-2063,2076,2077,2078]],"properties":{"id":"24662874","dp":5198,"de":676}},{"type":"Polygon","arcs":[[-2076,2079,2080,-2074]],"properties":{"id":"24662875","dp":8431,"de":1984}},{"type":"Polygon","arcs":[[2081,2082,-2071,-2081]],"properties":{"id":"24662876","dp":8885,"de":0}},{"type":"Polygon","arcs":[[2083,2084,-2080,-2075,2085]],"properties":{"id":"24662877","dp":4231,"de":614}},{"type":"Polygon","arcs":[[2086,-2086,-2079,2087,2088]],"properties":{"id":"24662878","dp":5278,"de":946}},{"type":"Polygon","arcs":[[2089,-2089,2090,2091]],"properties":{"id":"24662879","dp":5059,"de":0}},{"type":"Polygon","arcs":[[2092,-2092,2093,2094]],"properties":{"id":"24662880","dp":6737,"de":652}},{"type":"Polygon","arcs":[[-2094,-2091,-2088,-2078,2095,2096,2097,2098]],"properties":{"id":"24662881","dp":2813,"de":530}},{"type":"Polygon","arcs":[[2099,2100,2101,-2097]],"properties":{"id":"24662882","dp":8525,"de":0}},{"type":"Polygon","arcs":[[-2077,-2062,-2100,-2096]],"properties":{"id":"24662883","dp":6157,"de":0}},{"type":"Polygon","arcs":[[2102,-1935,2103,2104,2105]],"properties":{"id":"24660813","dp":12857,"de":0}},{"type":"Polygon","arcs":[[2106,-2104,-1934,2107]],"properties":{"id":"24660814","dp":6033,"de":791}},{"type":"Polygon","arcs":[[2108,2109,-2105,-2107,2110]],"properties":{"id":"24660815","dp":9108,"de":713}},{"type":"Polygon","arcs":[[-2111,-2108,-1943,2111,2112]],"properties":{"id":"24660816","dp":7492,"de":1253}},{"type":"Polygon","arcs":[[2113,-2109,-2113,2114,2115,2116]],"properties":{"id":"24660818","dp":1261,"de":1526}},{"type":"Polygon","arcs":[[-1942,2117,2118,2119,-2112]],"properties":{"id":"24660820","dp":2735,"de":1490}},{"type":"Polygon","arcs":[[-2120,2120,2121,-2115]],"properties":{"id":"24660821","dp":2075,"de":785}},{"type":"Polygon","arcs":[[2122,2123,2124,-2121,2125,2126]],"properties":{"id":"24660822","dp":3376,"de":2525}},{"type":"Polygon","arcs":[[-2119,2127,2128,2129,-2126]],"properties":{"id":"24660823","dp":13409,"de":0}},{"type":"Polygon","arcs":[[-2129,2130,2131,2132,2133,-1913]],"properties":{"id":"24660824","dp":28392,"de":2572}},{"type":"Polygon","arcs":[[2134,2135,2136,-2133]],"properties":{"id":"24660825","dp":5644,"de":613}},{"type":"Polygon","arcs":[[2137,2138,-1914,-2134,-2137,2139]],"properties":{"id":"24660826","dp":2385,"de":6142}},{"type":"Polygon","arcs":[[2140,2141,2142,2143,2144,-2140,-2136]],"properties":{"id":"24660827","dp":4237,"de":437}},{"type":"Polygon","arcs":[[2145,2146,-2141,-2135,-2132]],"properties":{"id":"24660828","dp":4457,"de":344}},{"type":"Polygon","arcs":[[-2146,2147,2148,2149,2150,2151]],"properties":{"id":"24660829","dp":5890,"de":650}},{"type":"Polygon","arcs":[[2152,-2150,2153]],"properties":{"id":"24660830","dp":6060,"de":1155}},{"type":"Polygon","arcs":[[-2154,-2149,2154]],"properties":{"id":"24660832","dp":4675,"de":3640}},{"type":"Polygon","arcs":[[-2152,2155,2156,2157]],"properties":{"id":"24660833","dp":6296,"de":1171}},{"type":"Polygon","arcs":[[-2158,2158,2159,2160,-2142,-2147]],"properties":{"id":"24660834","dp":6118,"de":0}},{"type":"Polygon","arcs":[[2161,2162,2163,2164,-2159]],"properties":{"id":"24660835","dp":8983,"de":2354}},{"type":"Polygon","arcs":[[-2160,-2165,2165,2166,2167]],"properties":{"id":"24660836","dp":6957,"de":582}},{"type":"Polygon","arcs":[[-2161,-2168,2168,-2143]],"properties":{"id":"24660837","dp":6714,"de":513}},{"type":"Polygon","arcs":[[-2144,-2169,-2167,2169,-1709,2170]],"properties":{"id":"24660838","dp":5546,"de":0}},{"type":"Polygon","arcs":[[-2171,-1713,-1714,2171]],"properties":{"id":"24660839","dp":9049,"de":0}},{"type":"Polygon","arcs":[[-2004,-1718,-1710,-2170,-2166,2172,2173,2174,2175,2176,-2007]],"properties":{"id":"24660853","dp":2741,"de":2439}},{"type":"Polygon","arcs":[[-2175,2177,2178,2179,2180,2181,2182,-2176]],"properties":{"id":"24660854","dp":3216,"de":1037}},{"type":"Polygon","arcs":[[-2181,2183]],"properties":{"id":"24660855","dp":5005,"de":728}},{"type":"Polygon","arcs":[[-2174,2184,2185,2186,2187,2188,2189,2190,-2178,2174,-2175]],"properties":{"id":"24660856","dp":7421,"de":1732}},{"type":"Polygon","arcs":[[2191,2192,-2179,-2191]],"properties":{"id":"24660857","dp":4775,"de":374}},{"type":"Polygon","arcs":[[-2190,2193,2194,2195,-2192]],"properties":{"id":"24660858","dp":3480,"de":1312}},{"type":"Polygon","arcs":[[-2173,-2164,2196,2197,-2185]],"properties":{"id":"24660859","dp":11472,"de":0}},{"type":"Polygon","arcs":[[2198,2199,-2186,-2198]],"properties":{"id":"24660860","dp":40687,"de":3439}},{"type":"Polygon","arcs":[[-2187,-2200,2200,2201]],"properties":{"id":"24660861","dp":51902,"de":2989}},{"type":"Polygon","arcs":[[2202,-2188,-2202,2203,2204]],"properties":{"id":"24660862","dp":19757,"de":3238}},{"type":"Polygon","arcs":[[-2205,2205,2206,2207]],"properties":{"id":"24660863","dp":23466,"de":0}},{"type":"Polygon","arcs":[[-2206,-2204,-2201,-2199,-2197,-2163,2208]],"properties":{"id":"24660864","dp":16176,"de":3008}},{"type":"Polygon","arcs":[[2209,2210,2211,-1717,-1991,-856]],"properties":{"id":"24660865","dp":10490,"de":481}},{"type":"Polygon","arcs":[[-2145,-2172,-2212,2212]],"properties":{"id":"24660866","dp":12103,"de":887}},{"type":"Polygon","arcs":[[2213,-1915,-2139,2214,2215,-999]],"properties":{"id":"24660868","dp":7760,"de":836}},{"type":"Polygon","arcs":[[-1916,-2214,-998]],"properties":{"id":"24660869","dp":13318,"de":2586}},{"type":"Polygon","arcs":[[2216,2217,-2020,-2024]],"properties":{"id":"24660227","dp":10606,"de":1590}},{"type":"Polygon","arcs":[[2218,-2217,-2023,2219]],"properties":{"id":"24660228","dp":10064,"de":0}},{"type":"Polygon","arcs":[[2220,2221,2222,-2220,-2022]],"properties":{"id":"24660229","dp":9885,"de":821}},{"type":"Polygon","arcs":[[2223,2224,2225,-2222,2226]],"properties":{"id":"24660230","dp":9353,"de":0}},{"type":"Polygon","arcs":[[2227,2228,-2224,2229,2230]],"properties":{"id":"24660231","dp":13943,"de":1132}},{"type":"Polygon","arcs":[[2231,2232,2233,-2228,2234]],"properties":{"id":"24660232","dp":12870,"de":4582}},{"type":"Polygon","arcs":[[2235,2236,2237,2238,2239,-2233]],"properties":{"id":"24660233","dp":12546,"de":936}},{"type":"Polygon","arcs":[[2240,2241,-2236,-2232,2242,2243]],"properties":{"id":"24660234","dp":10162,"de":1711}},{"type":"Polygon","arcs":[[2244,2245,2246,2247,-2237,-2242,2248]],"properties":{"id":"24660235","dp":5817,"de":2967}},{"type":"Polygon","arcs":[[2249,2250,-2246,2251]],"properties":{"id":"24660236","dp":15345,"de":1257}},{"type":"Polygon","arcs":[[2252,2253,2254]],"properties":{"id":"24660238","dp":20508,"de":0}},{"type":"Polygon","arcs":[[2255,2256,2257,-2254,2258]],"properties":{"id":"24660239","dp":17380,"de":0}},{"type":"Polygon","arcs":[[2259,2260,2261,-2238,-2248,2262]],"properties":{"id":"24660241","dp":6161,"de":4545}},{"type":"Polygon","arcs":[[2263,2264,2265,2266,2267,2268,-2260,2269]],"properties":{"id":"24660242","dp":5450,"de":702}},{"type":"Polygon","arcs":[[2270,2271,2272,-2265,2273,2274]],"properties":{"id":"24660243","dp":8307,"de":2451}},{"type":"Polygon","arcs":[[2275,2276,-2273,2277]],"properties":{"id":"24660244","dp":14548,"de":1315}},{"type":"Polygon","arcs":[[2278,2279,-2278,-2272,2280]],"properties":{"id":"24660245","dp":17713,"de":0}},{"type":"Polygon","arcs":[[2281,2282,-2276,-2280,2283]],"properties":{"id":"24660246","dp":16062,"de":2106}},{"type":"Polygon","arcs":[[2284,2285,-2284,-2279,2286,2287]],"properties":{"id":"24660247","dp":21906,"de":0}},{"type":"Polygon","arcs":[[2288,2289,2290,-2282,-2286]],"properties":{"id":"24660248","dp":18379,"de":0}},{"type":"Polygon","arcs":[[2291,2292,2293,2294,-2289,-2285]],"properties":{"id":"24660249","dp":13646,"de":1918}},{"type":"Polygon","arcs":[[-1001,2295,2296,-1018,-1026,-992,-996]],"properties":{"id":"24660744","dp":16730,"de":1026}},{"type":"Polygon","arcs":[[-2216,2297,2298,-2296,-1000]],"properties":{"id":"24660745","dp":6708,"de":1012}},{"type":"Polygon","arcs":[[-2299,2299,2300,2301,-1019,-2297]],"properties":{"id":"24660746","dp":5153,"de":2351}},{"type":"Polygon","arcs":[[2302,-855,-863,-1016,-2302]],"properties":{"id":"24660748","dp":9417,"de":2579}},{"type":"Polygon","arcs":[[-2124,2303,-2127,-2130,-1912,-994,-988,2304,2305,2306,2307,2308,2309,2310]],"properties":{"id":"24660871","dp":622,"de":2045}},{"type":"Polygon","arcs":[[-2304,-2123]],"properties":{"id":"24660872","dp":23146,"de":0}},{"type":"Polygon","arcs":[[2311,2312,2313,2314,-777,-774,-773,-769,-761,2315,2316]],"properties":{"id":"24660874","dp":228,"de":2471}},{"type":"Polygon","arcs":[[2317,-779,-2315,2318,2319,-702]],"properties":{"id":"24660876","dp":3867,"de":2463}},{"type":"Polygon","arcs":[[2320,2321,2322,2323,2324,2325,2326]],"properties":{"id":"24662209","dp":5617,"de":1367}},{"type":"Polygon","arcs":[[2327,2328,2329,-2324]],"properties":{"id":"24662210","dp":9661,"de":0}},{"type":"Polygon","arcs":[[2330,2331,-2328,2332,2333]],"properties":{"id":"24662211","dp":5038,"de":0}},{"type":"Polygon","arcs":[[2334,-2333,-2323,2335,2336]],"properties":{"id":"24662212","dp":5151,"de":1397}},{"type":"Polygon","arcs":[[-2336,-2322,2337,2338,2339]],"properties":{"id":"24662213","dp":4664,"de":559}},{"type":"Polygon","arcs":[[-2321,2340,-2338]],"properties":{"id":"24662214","dp":25404,"de":0}},{"type":"Polygon","arcs":[[2341,-2339,-2341,-2327,2342]],"properties":{"id":"24662215","dp":26156,"de":0}},{"type":"Polygon","arcs":[[-1787,-1775,2343,-2337,-2340,-2342,2344]],"properties":{"id":"24662216","dp":8094,"de":2005}},{"type":"Polygon","arcs":[[-1799,-1793,-1788,-2345,-2343,-2326,-1815,-1818]],"properties":{"id":"24662217","dp":4662,"de":4977}},{"type":"Polygon","arcs":[[2345,2346,2347,2348,2349,2350,2351,2352]],"properties":{"id":"24662528","dp":6375,"de":1910}},{"type":"Polygon","arcs":[[2353,2354,-2353,2355,2356,-546,-550,-553]],"properties":{"id":"24662529","dp":3087,"de":738}},{"type":"Polygon","arcs":[[2357,2358,2359,-2355,2360]],"properties":{"id":"24662530","dp":5897,"de":4387}},{"type":"Polygon","arcs":[[2361,2362,-2361,-2354,-552,-555,-558]],"properties":{"id":"24662531","dp":5424,"de":2358}},{"type":"Polygon","arcs":[[2363,2364,2365,-2358,-2363]],"properties":{"id":"24662532","dp":8260,"de":1482}},{"type":"Polygon","arcs":[[-2365,2366,2367,2368]],"properties":{"id":"24662533","dp":19497,"de":2261}},{"type":"Polygon","arcs":[[2369,2370,-2367,-2364,-2362,-561]],"properties":{"id":"24662534","dp":9025,"de":2481}},{"type":"Polygon","arcs":[[2371,2372,2373,2374,-2368,-2371,2375]],"properties":{"id":"24662535","dp":5193,"de":1570}},{"type":"Polygon","arcs":[[2376,-2376,-2370,-560,-568]],"properties":{"id":"24662536","dp":6181,"de":2325}},{"type":"Polygon","arcs":[[-580,2377,2378,-2377,-567,-571]],"properties":{"id":"24662537","dp":8931,"de":0}},{"type":"Polygon","arcs":[[2379,2380,2381,-2378,-579]],"properties":{"id":"24662538","dp":7771,"de":0}},{"type":"Polygon","arcs":[[2382,-2380,-578]],"properties":{"id":"24662539","dp":9813,"de":0}},{"type":"Polygon","arcs":[[-2381,-2383,-582,2383,2384,2385,2386]],"properties":{"id":"24662540","dp":7382,"de":0}},{"type":"Polygon","arcs":[[-2387,2387,2388,-2372,-2379,-2382]],"properties":{"id":"24662541","dp":6209,"de":3255}},{"type":"Polygon","arcs":[[-592,-594,2389,2390,2391,-2384,-588,-590]],"properties":{"id":"24662542","dp":6060,"de":5127}},{"type":"Polygon","arcs":[[2392,2393,2394,2395,2396,-2385,-2392]],"properties":{"id":"24662543","dp":2786,"de":4994}},{"type":"Polygon","arcs":[[2397,2398,-2393]],"properties":{"id":"24662544","dp":12186,"de":3422}},{"type":"Polygon","arcs":[[-2399,2399,-1103,2400,2401,2402,-2394]],"properties":{"id":"24662545","dp":2981,"de":193}},{"type":"Polygon","arcs":[[2403,-1104,-2400,-2398,-2391,2404,-598]],"properties":{"id":"24662546","dp":6713,"de":2941}},{"type":"Polygon","arcs":[[-2405,-2390,-599]],"properties":{"id":"24662547","dp":30883,"de":0}},{"type":"Polygon","arcs":[[-1110,-1115,2405,-2401,-1102,-948]],"properties":{"id":"24662548","dp":3129,"de":1403}},{"type":"MultiPolygon","arcs":[[[2406]],[[2407,2408,2409,2410,2411,2412,2413,2414,2415,2416]],[[2417]]],"properties":{"id":"24660981","dp":1087,"de":199}},{"type":"Polygon","arcs":[[2418,2419,-2411,2420]],"properties":{"id":"24660982","dp":16381,"de":0}},{"type":"Polygon","arcs":[[2421,2422,-2419,2423]],"properties":{"id":"24660983","dp":12144,"de":0}},{"type":"MultiPolygon","arcs":[[[2424,2425,2426,2427,2428,-2424,-2421,-2410]],[[2429]],[[-2408,2430]]],"properties":{"id":"24660984","dp":1590,"de":0}},{"type":"Polygon","arcs":[[2431,2432,2433,-2427]],"properties":{"id":"24660985","dp":2890,"de":0}},{"type":"Polygon","arcs":[[2434,2435,2436,-2433]],"properties":{"id":"24660986","dp":10024,"de":0}},{"type":"Polygon","arcs":[[2437,2438,2439,2440,-2436]],"properties":{"id":"24660987","dp":8861,"de":0}},{"type":"Polygon","arcs":[[-2415,2441,2442,2443]],"properties":{"id":"24660988","dp":9694,"de":0}},{"type":"Polygon","arcs":[[-2414,2444,2445,-2442]],"properties":{"id":"24660989","dp":8756,"de":1813}},{"type":"Polygon","arcs":[[2446,2447,-2446,2448,2449,2450]],"properties":{"id":"24660990","dp":6031,"de":694}},{"type":"Polygon","arcs":[[2451,2452,2453,2454,-2450,2455]],"properties":{"id":"24660991","dp":7671,"de":0}},{"type":"Polygon","arcs":[[2456,-2456,-2449,-2445,2457]],"properties":{"id":"24660992","dp":9300,"de":686}},{"type":"Polygon","arcs":[[2458,2459,2460,2461]],"properties":{"id":"24660929","dp":5500,"de":1386}},{"type":"Polygon","arcs":[[2462,2463,2464,2465,-2459,2466,2467]],"properties":{"id":"24660930","dp":3388,"de":0}},{"type":"Polygon","arcs":[[2468,2469,2470,2471,2472,2473,2474]],"properties":{"id":"24660931","dp":2322,"de":601}},{"type":"Polygon","arcs":[[2475,2476,2477,-2463,-2472,2478]],"properties":{"id":"24660932","dp":3414,"de":1386}},{"type":"Polygon","arcs":[[2479,2480,-2479,-2471,2481]],"properties":{"id":"24660933","dp":2989,"de":0}},{"type":"Polygon","arcs":[[-2476,-2481,2482]],"properties":{"id":"24660934","dp":7191,"de":1136}},{"type":"Polygon","arcs":[[2483,2484,2485]],"properties":{"id":"24660953","dp":9161,"de":0}},{"type":"Polygon","arcs":[[2486,2487,2488,-2485,2489,2490,2491]],"properties":{"id":"24660954","dp":3154,"de":632}},{"type":"Polygon","arcs":[[2492,2493,2494,2495,2496,2497]],"properties":{"id":"24660955","dp":2302,"de":4021}},{"type":"Polygon","arcs":[[2498,-2495,2499]],"properties":{"id":"24660956","dp":9854,"de":0}},{"type":"Polygon","arcs":[[-2500,-2494,2500,2501]],"properties":{"id":"24660957","dp":7941,"de":0}},{"type":"Polygon","arcs":[[-2501,-2493,2502,2503,2504]],"properties":{"id":"24660958","dp":5311,"de":1425}},{"type":"Polygon","arcs":[[-2504,2505,2506]],"properties":{"id":"24660959","dp":9409,"de":3935}},{"type":"Polygon","arcs":[[2507,2508,2509,-2506,2510,2511]],"properties":{"id":"24660960","dp":7666,"de":0}},{"type":"Polygon","arcs":[[-2508,2512,2513,2514]],"properties":{"id":"24660961","dp":7663,"de":0}},{"type":"Polygon","arcs":[[-2515,2515,2516,-2509]],"properties":{"id":"24660962","dp":10592,"de":0}},{"type":"Polygon","arcs":[[-2514,2517,2518,-2516]],"properties":{"id":"24660963","dp":17674,"de":0}},{"type":"Polygon","arcs":[[2519,-2510,-2517,-2519,2520,-2432,-2426,2521]],"properties":{"id":"24660964","dp":4929,"de":486}},{"type":"MultiPolygon","arcs":[[[-2502,-2505,-2507,-2520,2522,-2496,-2499]],[[2523,2524,2525]]],"properties":{"id":"24660965","dp":2729,"de":1049}},{"type":"Polygon","arcs":[[2526,2527,2528,2529,2530,2531,2532,2533,2534]],"properties":{"id":"24660993","dp":2196,"de":3472}},{"type":"Polygon","arcs":[[2535,2536,-2532]],"properties":{"id":"24660994","dp":13724,"de":0}},{"type":"Polygon","arcs":[[2537,2538,-2536,-2531]],"properties":{"id":"24660995","dp":10984,"de":0}},{"type":"Polygon","arcs":[[2539,-19,-18,2540,2541]],"properties":{"id":"24660997","dp":12708,"de":0}},{"type":"Polygon","arcs":[[-2541,-17,-11,2542,2543,2544]],"properties":{"id":"24660998","dp":11929,"de":0}},{"type":"Polygon","arcs":[[-2543,-15,-9,2545,2546]],"properties":{"id":"24660999","dp":11446,"de":0}},{"type":"Polygon","arcs":[[-2546,-7,-2,-600,2547,2548]],"properties":{"id":"24661000","dp":5922,"de":1085}},{"type":"Polygon","arcs":[[-2544,-2547,-2549,2549,2550]],"properties":{"id":"24661001","dp":13156,"de":0}},{"type":"Polygon","arcs":[[-2550,-2548,-603,2551,2552,2553,2554]],"properties":{"id":"24661002","dp":10699,"de":0}},{"type":"Polygon","arcs":[[2555,-2552,-602,-41,2556]],"properties":{"id":"24661003","dp":10741,"de":1235}},{"type":"Polygon","arcs":[[2557,2558,2559,2560]],"properties":{"id":"24661114","dp":11867,"de":1264}},{"type":"Polygon","arcs":[[2561,2562,-2558,2563]],"properties":{"id":"24661116","dp":17239,"de":0}},{"type":"Polygon","arcs":[[2564,-2564,2565,2566]],"properties":{"id":"24661117","dp":12894,"de":3728}},{"type":"Polygon","arcs":[[2567,2568,2569,2570,-2567,2571]],"properties":{"id":"24661118","dp":9790,"de":7714}},{"type":"Polygon","arcs":[[2572,2573,-2569,2574,2575]],"properties":{"id":"24661119","dp":9914,"de":5109}},{"type":"Polygon","arcs":[[-2575,-2568,2576,2577,2578]],"properties":{"id":"24661120","dp":9918,"de":1103}},{"type":"Polygon","arcs":[[-2572,2579,2580,2581,-2577]],"properties":{"id":"24661121","dp":8755,"de":5661}},{"type":"Polygon","arcs":[[-2566,-2561,2582,2583,-2580]],"properties":{"id":"24661122","dp":15967,"de":2188}},{"type":"Polygon","arcs":[[-2581,-2584,2584,2585]],"properties":{"id":"24661123","dp":17083,"de":0}},{"type":"Polygon","arcs":[[2586,-2578,-2582,-2586,2587,2588,2589]],"properties":{"id":"24661124","dp":4092,"de":4851}},{"type":"Polygon","arcs":[[2590,2591,2592,-1242,2593,2594]],"properties":{"id":"24661125","dp":5881,"de":3774}},{"type":"Polygon","arcs":[[-2594,-1241,2595]],"properties":{"id":"24661126","dp":9908,"de":1987}},{"type":"Polygon","arcs":[[2596,2597,-2596,-1240,-1238,-1236]],"properties":{"id":"24661127","dp":8756,"de":4166}},{"type":"Polygon","arcs":[[-2595,-2598,2598]],"properties":{"id":"24661128","dp":12551,"de":3497}},{"type":"Polygon","arcs":[[2599,2600,2601,-2599,-2597]],"properties":{"id":"24661129","dp":8860,"de":980}},{"type":"Polygon","arcs":[[2602,2603,-2600,-1235]],"properties":{"id":"24661130","dp":13182,"de":1629}},{"type":"Polygon","arcs":[[2604,2605,2606,-2603,-1234,-1232]],"properties":{"id":"24661131","dp":14178,"de":0}},{"type":"Polygon","arcs":[[2607,-2605,-1231,-1190]],"properties":{"id":"24661132","dp":11372,"de":1395}},{"type":"Polygon","arcs":[[-1189,2608,-2606,-2608]],"properties":{"id":"24661133","dp":10964,"de":1169}},{"type":"Polygon","arcs":[[-1188,2609,2610,2611,2612,-2604,-2607,-2609]],"properties":{"id":"24661134","dp":3930,"de":1008}},{"type":"Polygon","arcs":[[2613,2614,-2477,-2483,2615]],"properties":{"id":"24660935","dp":11908,"de":0}},{"type":"Polygon","arcs":[[-2616,2616,2617,2618,2619]],"properties":{"id":"24660936","dp":10886,"de":0}},{"type":"Polygon","arcs":[[-2618,2620,2621,2622,2623]],"properties":{"id":"24660937","dp":10815,"de":0}},{"type":"Polygon","arcs":[[-2622,2624,2625]],"properties":{"id":"24660938","dp":10205,"de":0}},{"type":"Polygon","arcs":[[-2621,-2617,-2480,2626,-2625]],"properties":{"id":"24660939","dp":7011,"de":1597}},{"type":"Polygon","arcs":[[2627,2628,-2623,-2626,-2627,-2482,-2470,2629,2630,2631]],"properties":{"id":"24660940","dp":1940,"de":3894}},{"type":"Polygon","arcs":[[-2629,2632,2633]],"properties":{"id":"24660941","dp":12602,"de":0}},{"type":"Polygon","arcs":[[2634,2635,2636,2637,-2633,-2628,2638]],"properties":{"id":"24660942","dp":11469,"de":0}},{"type":"Polygon","arcs":[[-2637,2639]],"properties":{"id":"24660943","dp":12692,"de":0}},{"type":"Polygon","arcs":[[-2636,2640,2641,2642,-2619,-2624,-2634,-2638,-2640]],"properties":{"id":"24660944","dp":2821,"de":1634}},{"type":"Polygon","arcs":[[2643,2644,-2642,2645]],"properties":{"id":"24660945","dp":6650,"de":0}},{"type":"Polygon","arcs":[[2646,-2614,-2620,-2643,-2645,2647,-2525]],"properties":{"id":"24660946","dp":5511,"de":0}},{"type":"Polygon","arcs":[[-2648,-2644,2648,2649]],"properties":{"id":"24660947","dp":9716,"de":0}},{"type":"Polygon","arcs":[[-2649,-2646,-2641,-2635,2650,2651]],"properties":{"id":"24660948","dp":9356,"de":737}},{"type":"Polygon","arcs":[[-2526,-2650,-2652,2652,-2487,2653]],"properties":{"id":"24660949","dp":10876,"de":493}},{"type":"Polygon","arcs":[[-2488,-2653,-2651,2654,2655]],"properties":{"id":"24660950","dp":9711,"de":679}},{"type":"Polygon","arcs":[[-2489,-2656,2656,-2486]],"properties":{"id":"24660951","dp":14016,"de":0}},{"type":"Polygon","arcs":[[2657,-103,2658,2659,-34]],"properties":{"id":"24661036","dp":9081,"de":3603}},{"type":"Polygon","arcs":[[2660,2661,2662,-2659,-101]],"properties":{"id":"24661037","dp":12683,"de":0}},{"type":"Polygon","arcs":[[2663,2664,-2660,-2663]],"properties":{"id":"24661038","dp":11284,"de":3142}},{"type":"Polygon","arcs":[[-54,-48,-43,-35,-2665,2665]],"properties":{"id":"24661039","dp":6049,"de":2821}},{"type":"Polygon","arcs":[[2666,-58,-55,-2666,-2664,-2662,2667]],"properties":{"id":"24661040","dp":7503,"de":2654}},{"type":"Polygon","arcs":[[2668,-82,-73,-59,-2667]],"properties":{"id":"24661041","dp":12472,"de":976}},{"type":"Polygon","arcs":[[-2661,-100,-89,-2669,-2668]],"properties":{"id":"24661042","dp":14666,"de":1466}},{"type":"Polygon","arcs":[[-30,2669,2670,-2658,-32]],"properties":{"id":"24661043","dp":13705,"de":797}},{"type":"Polygon","arcs":[[-27,2671,2672,-2670,-29]],"properties":{"id":"24661044","dp":13519,"de":0}},{"type":"Polygon","arcs":[[2673,-2672,-26,-24]],"properties":{"id":"24661045","dp":11781,"de":1224}},{"type":"Polygon","arcs":[[-23,-21,-2317,2674,-94,-102,-2671,-2673,-2674]],"properties":{"id":"24661046","dp":766,"de":510}},{"type":"Polygon","arcs":[[-2521,-2518,-2513,-2512,2675,2676,-2438,-2435]],"properties":{"id":"24660966","dp":2365,"de":909}},{"type":"MultiPolygon","arcs":[[[-2503,-2498,2677,2678,-2676,-2511]],[[2679,2680]]],"properties":{"id":"24660967","dp":3800,"de":740}},{"type":"Polygon","arcs":[[-2677,-2679,2681,2682,2683,-2439]],"properties":{"id":"24660968","dp":8178,"de":3130}},{"type":"Polygon","arcs":[[-2684,2684,2685,-2440]],"properties":{"id":"24660969","dp":14061,"de":2207}},{"type":"Polygon","arcs":[[2686,2687,-2685,2688,2689]],"properties":{"id":"24660970","dp":12500,"de":1190}},{"type":"Polygon","arcs":[[-2437,-2441,-2686,-2688,2690,-2434]],"properties":{"id":"24660971","dp":8921,"de":0}},{"type":"Polygon","arcs":[[-2691,-2687,2691,2692,-2428]],"properties":{"id":"24660972","dp":11556,"de":0}},{"type":"Polygon","arcs":[[-2692,-2690,2693,2694]],"properties":{"id":"24660973","dp":12628,"de":0}},{"type":"Polygon","arcs":[[-2695,2695,2696]],"properties":{"id":"24660974","dp":9657,"de":0}},{"type":"Polygon","arcs":[[-2693,-2697,2697,2698,-2422,-2429]],"properties":{"id":"24660975","dp":12725,"de":0}},{"type":"Polygon","arcs":[[-2699,2699,2700,2701,-2420,-2423]],"properties":{"id":"24660976","dp":5042,"de":2127}},{"type":"Polygon","arcs":[[-2701,2702,2703,2704]],"properties":{"id":"24660977","dp":9210,"de":771}},{"type":"Polygon","arcs":[[2705,-2703,2706,2707,-2452,-2457]],"properties":{"id":"24660978","dp":6021,"de":712}},{"type":"Polygon","arcs":[[2708,2709,2710,2711,2712]],"properties":{"id":"24661071","dp":6304,"de":980}},{"type":"Polygon","arcs":[[2713,-2712,2714,-1982,-1979,2715,2716]],"properties":{"id":"24661072","dp":3038,"de":1041}},{"type":"Polygon","arcs":[[2717,-2713,-2714,2718]],"properties":{"id":"24661073","dp":9224,"de":7613}},{"type":"Polygon","arcs":[[2719,2720,2721,2722]],"properties":{"id":"24661080","dp":106320,"de":7200}},{"type":"Polygon","arcs":[[2723,-2723,2724,2725]],"properties":{"id":"24661081","dp":36742,"de":6285}},{"type":"Polygon","arcs":[[2726,-2726,2727,2728]],"properties":{"id":"24661082","dp":65076,"de":19230}},{"type":"Polygon","arcs":[[2729,-2729,2730,2731,2732]],"properties":{"id":"24661083","dp":10943,"de":4716}},{"type":"Polygon","arcs":[[-2732,2733,2734]],"properties":{"id":"24661084","dp":34946,"de":8776}},{"type":"Polygon","arcs":[[2735,-2734,-2731,-2728,2736,2737]],"properties":{"id":"24661086","dp":1993,"de":14953}},{"type":"Polygon","arcs":[[-2725,2738,-228,2739,-2737]],"properties":{"id":"24661087","dp":14900,"de":24502}},{"type":"Polygon","arcs":[[2740,2741,-229,2742,-2721]],"properties":{"id":"24661093","dp":17007,"de":28346}},{"type":"Polygon","arcs":[[-2722,-2743,-225,-2739]],"properties":{"id":"24661094","dp":71875,"de":25390}},{"type":"Polygon","arcs":[[2743,2744,2745]],"properties":{"id":"24661099","dp":13087,"de":2631}},{"type":"Polygon","arcs":[[-2746,2746,2747,2748,2749,2750,2751,2752]],"properties":{"id":"24661100","dp":6033,"de":9406}},{"type":"Polygon","arcs":[[2753,2754,-2753,2755,2756]],"properties":{"id":"24661102","dp":12857,"de":5869}},{"type":"Polygon","arcs":[[2757,2758,-2754,2759]],"properties":{"id":"24661103","dp":19795,"de":6326}},{"type":"Polygon","arcs":[[2760,2761,2762,-2611]],"properties":{"id":"24661135","dp":9961,"de":701}},{"type":"Polygon","arcs":[[2763,2764,2765,-2762]],"properties":{"id":"24661136","dp":10724,"de":0}},{"type":"Polygon","arcs":[[2766,2767,-2764,-2761,-2610,-1187,-820]],"properties":{"id":"24661137","dp":15317,"de":941}},{"type":"Polygon","arcs":[[2768,-2765,-2768,2769]],"properties":{"id":"24661138","dp":14517,"de":0}},{"type":"Polygon","arcs":[[-215,2770,2771,-2770,-2767,-819,2772,-221,-218]],"properties":{"id":"24661139","dp":11507,"de":4767}},{"type":"Polygon","arcs":[[-2772,2773,2774,-2766,-2769]],"properties":{"id":"24661140","dp":12708,"de":925}},{"type":"Polygon","arcs":[[2775,2776,-2774,2777]],"properties":{"id":"24661141","dp":17060,"de":2027}},{"type":"Polygon","arcs":[[-2777,2778,-2763,-2775]],"properties":{"id":"24661142","dp":6130,"de":0}},{"type":"Polygon","arcs":[[2779,2780,-2778,-2771,-214]],"properties":{"id":"24661143","dp":17058,"de":0}},{"type":"Polygon","arcs":[[2781,2782,2783]],"properties":{"id":"24661318","dp":14343,"de":8838}},{"type":"Polygon","arcs":[[2784,-2783,2785,2786]],"properties":{"id":"24661319","dp":21226,"de":1915}},{"type":"Polygon","arcs":[[2787,2788,2789,-2785,2790,2791,2792]],"properties":{"id":"24661320","dp":6695,"de":9399}},{"type":"Polygon","arcs":[[2793,2794,-2789]],"properties":{"id":"24661321","dp":26318,"de":7692}},{"type":"Polygon","arcs":[[-1356,2795,2796,2797]],"properties":{"id":"24661322","dp":15896,"de":0}},{"type":"Polygon","arcs":[[2798,2799,2800,2801,-2796]],"properties":{"id":"24661323","dp":20628,"de":0}},{"type":"Polygon","arcs":[[2802,-2800,2803,2804]],"properties":{"id":"24661324","dp":10893,"de":0}},{"type":"Polygon","arcs":[[-2801,-2803,2805,2806,2807]],"properties":{"id":"24661325","dp":22913,"de":0}},{"type":"Polygon","arcs":[[2808,-2807,2809]],"properties":{"id":"24661326","dp":22238,"de":0}},{"type":"Polygon","arcs":[[-2810,2810,2811]],"properties":{"id":"24661327","dp":28231,"de":0}},{"type":"Polygon","arcs":[[2812,2813,2814,2815,-2812,2816]],"properties":{"id":"24661328","dp":28682,"de":5574}},{"type":"Polygon","arcs":[[-2816,2817,2818,2819,-2808,-2809]],"properties":{"id":"24661329","dp":20798,"de":6230}},{"type":"Polygon","arcs":[[2820,2821,-2802,-2820]],"properties":{"id":"24661330","dp":19015,"de":4166}},{"type":"Polygon","arcs":[[2822,-2797,-2822,2823,2824]],"properties":{"id":"24661331","dp":15550,"de":0}},{"type":"Polygon","arcs":[[2825,2826,2827,2828,-2824,-2821]],"properties":{"id":"24661332","dp":10467,"de":5632}},{"type":"Polygon","arcs":[[2829,-2826,-2819,2830]],"properties":{"id":"24661333","dp":19484,"de":5357}},{"type":"Polygon","arcs":[[2831,2832,2833,-2831,-2818,-2815]],"properties":{"id":"24661334","dp":1442,"de":44407}},{"type":"Polygon","arcs":[[-2817,-2811,-2806,-2805,2834,2835,2836]],"properties":{"id":"24661335","dp":5345,"de":44384}},{"type":"Polygon","arcs":[[2837,2838,-2837,2839,-1334]],"properties":{"id":"24661336","dp":4168,"de":10743}},{"type":"Polygon","arcs":[[2840,2841,2842,-1324]],"properties":{"id":"24661337","dp":6426,"de":2200}},{"type":"Polygon","arcs":[[-2840,-2836,2843,-1341,-1335]],"properties":{"id":"24661338","dp":11828,"de":0}},{"type":"Polygon","arcs":[[-2799,-1355,-1344,-2844,-2835,-2804]],"properties":{"id":"24661339","dp":14736,"de":827}},{"type":"Polygon","arcs":[[2844,2845,2846,2847]],"properties":{"id":"24661340","dp":10679,"de":2341}},{"type":"Polygon","arcs":[[-2845,2848,2849]],"properties":{"id":"24661341","dp":18819,"de":0}},{"type":"Polygon","arcs":[[-2850,2850,2851]],"properties":{"id":"24661342","dp":25999,"de":0}},{"type":"Polygon","arcs":[[-1360,-2851,2852,2853]],"properties":{"id":"24661343","dp":28256,"de":1153}},{"type":"Polygon","arcs":[[2854,2855,2856,-235,-2853]],"properties":{"id":"24661344","dp":11419,"de":0}},{"type":"Polygon","arcs":[[2857,-2855,-2849]],"properties":{"id":"24661345","dp":10982,"de":0}},{"type":"Polygon","arcs":[[2858,-2856,-2858,-2848,2859,2860,2861]],"properties":{"id":"24661346","dp":10621,"de":2118}},{"type":"Polygon","arcs":[[2862,-236,-2857,-2859,2863]],"properties":{"id":"24661347","dp":12509,"de":1636}},{"type":"Polygon","arcs":[[-2612,-2779,-2776,-2781,2864,2865,2866,2867,2868,-78,-84,-96,2869,2870,2871]],"properties":{"id":"24661047","dp":662,"de":1474}},{"type":"Polygon","arcs":[[2872,2873,2874,2875,2876,2877,2878]],"properties":{"id":"24661048","dp":10641,"de":1368}},{"type":"Polygon","arcs":[[2879,-2877,2880,2881]],"properties":{"id":"24661049","dp":15948,"de":0}},{"type":"Polygon","arcs":[[-2876,2882,2883,2884,-2881]],"properties":{"id":"24661050","dp":7888,"de":4583}},{"type":"Polygon","arcs":[[2885,2886,-2884,2887,2888,2889,2890,2891]],"properties":{"id":"24661051","dp":7705,"de":4329}},{"type":"Polygon","arcs":[[-2882,-2885,-2887,2892,2893]],"properties":{"id":"24661052","dp":10079,"de":1888}},{"type":"Polygon","arcs":[[-2893,-2886,2894,2895]],"properties":{"id":"24661053","dp":15918,"de":4373}},{"type":"Polygon","arcs":[[-2878,-2880,-2894,-2896,2896,2897]],"properties":{"id":"24661054","dp":4683,"de":3448}},{"type":"Polygon","arcs":[[-2897,2898,2899,2900,2901,2902,2903,-2573,2904]],"properties":{"id":"24661055","dp":5696,"de":7172}},{"type":"Polygon","arcs":[[2905,2906,2907,2908,2909,-2900,2910]],"properties":{"id":"24661058","dp":8016,"de":4474}},{"type":"Polygon","arcs":[[2911,-2908]],"properties":{"id":"24661059","dp":21576,"de":2717}},{"type":"Polygon","arcs":[[-2909,-2912,-2907,2912,2913,2914]],"properties":{"id":"24661060","dp":8331,"de":9517}},{"type":"Polygon","arcs":[[2915,2916,2917,2918]],"properties":{"id":"24660668","dp":18577,"de":0}},{"type":"Polygon","arcs":[[-2918,2919,2920,2921,2922]],"properties":{"id":"24660669","dp":10729,"de":5208}},{"type":"Polygon","arcs":[[2923,2924,-2921,2925]],"properties":{"id":"24660670","dp":32008,"de":0}},{"type":"Polygon","arcs":[[2926,2927,-2924,2928]],"properties":{"id":"24660671","dp":33656,"de":0}},{"type":"Polygon","arcs":[[2929,2930,-2927,2931]],"properties":{"id":"24660672","dp":20829,"de":2183}},{"type":"Polygon","arcs":[[2932,2933,-2930,2934]],"properties":{"id":"24660673","dp":19867,"de":0}},{"type":"Polygon","arcs":[[-2793,2935,2936,2937,2938,-929,-923,-919,2939,2940]],"properties":{"id":"24660676","dp":2074,"de":4783}},{"type":"Polygon","arcs":[[2941,-2934,2942,-2936,-2792]],"properties":{"id":"24660677","dp":7771,"de":3762}},{"type":"Polygon","arcs":[[-2942,-2791,2943,-2931]],"properties":{"id":"24660678","dp":41397,"de":0}},{"type":"Polygon","arcs":[[-2944,-2787,2944,-2928]],"properties":{"id":"24660679","dp":25133,"de":0}},{"type":"Polygon","arcs":[[-2925,-2945,2945]],"properties":{"id":"24660680","dp":17854,"de":0}},{"type":"Polygon","arcs":[[2946,-2922,-2946,-2786,2947,-2825,-2829]],"properties":{"id":"24660681","dp":12996,"de":1167}},{"type":"Polygon","arcs":[[-2923,-2947,-2828,2948]],"properties":{"id":"24660682","dp":8995,"de":0}},{"type":"Polygon","arcs":[[2949,-2919,-2949,-2827]],"properties":{"id":"24660683","dp":17903,"de":0}},{"type":"Polygon","arcs":[[2950,-2950,-2830,2951]],"properties":{"id":"24660684","dp":25898,"de":0}},{"type":"Polygon","arcs":[[2952,2953,-2952,-2834]],"properties":{"id":"24660685","dp":26000,"de":0}},{"type":"Polygon","arcs":[[2954,-231,-2760,-2757,2955,2956,2957,-1310,2958]],"properties":{"id":"24661104","dp":6626,"de":56553}},{"type":"Polygon","arcs":[[2959,-2740,-227,-2955]],"properties":{"id":"24661105","dp":14474,"de":80365}},{"type":"Polygon","arcs":[[2960,2961,-2738,-2960,-2959,-1309,2962,2963]],"properties":{"id":"24661106","dp":3120,"de":61103}},{"type":"Polygon","arcs":[[2964,2965,2966,2967]],"properties":{"id":"24661108","dp":11387,"de":1438}},{"type":"Polygon","arcs":[[-2589,2968,2969,-2965]],"properties":{"id":"24661109","dp":19050,"de":0}},{"type":"Polygon","arcs":[[-2583,2970,2971,-2969,-2588,-2585]],"properties":{"id":"24661110","dp":11532,"de":4125}},{"type":"Polygon","arcs":[[-2972,2972,2973]],"properties":{"id":"24661111","dp":18640,"de":3236}},{"type":"Polygon","arcs":[[2974,-242,2975,-175]],"properties":{"id":"24663212","dp":18537,"de":1679}},{"type":"Polygon","arcs":[[-178,-2976,2976,-202,-232]],"properties":{"id":"24663213","dp":8255,"de":0}},{"type":"Polygon","arcs":[[-241,2977,2978,-203,-2977]],"properties":{"id":"24663214","dp":12494,"de":4880}},{"type":"MultiPolygon","arcs":[[[2979,2980,2981,2982]],[[2983]],[[2984,2985,2986,2987,2988]]],"properties":{"id":"24663067","dp":259,"de":112}},{"type":"Polygon","arcs":[[-2953,-2833,2989,2990]],"properties":{"id":"24660686","dp":8668,"de":1815}},{"type":"Polygon","arcs":[[2991,2992,-2991,2993]],"properties":{"id":"24660687","dp":22923,"de":10073}},{"type":"Polygon","arcs":[[2994,2995,2996,-2990]],"properties":{"id":"24660688","dp":20687,"de":0}},{"type":"Polygon","arcs":[[2997,-2996,2998,2999]],"properties":{"id":"24660689","dp":29575,"de":0}},{"type":"Polygon","arcs":[[3000,-3000,3001,3002]],"properties":{"id":"24660690","dp":12919,"de":0}},{"type":"Polygon","arcs":[[-3003,3003,3004,3005,3006]],"properties":{"id":"24660691","dp":5439,"de":20443}},{"type":"Polygon","arcs":[[-3004,-3002,-2999,3007,3008]],"properties":{"id":"24660692","dp":11088,"de":3901}},{"type":"Polygon","arcs":[[-3008,-2995,-2832,3009]],"properties":{"id":"24660693","dp":22857,"de":14285}},{"type":"Polygon","arcs":[[3010,-3009,-3010,-2814,3011]],"properties":{"id":"24660694","dp":22350,"de":14035}},{"type":"Polygon","arcs":[[3012,-3012,-2813,-2839]],"properties":{"id":"24660695","dp":20388,"de":1124}},{"type":"Polygon","arcs":[[3013,-3005,-3011,-3013,3014,3015]],"properties":{"id":"24660696","dp":24400,"de":5555}},{"type":"Polygon","arcs":[[-3015,-2838,-1325,-2843]],"properties":{"id":"24660697","dp":15011,"de":4231}},{"type":"Polygon","arcs":[[3016,-3016,-2842]],"properties":{"id":"24660698","dp":21565,"de":10869}},{"type":"Polygon","arcs":[[3017,-3006,-3014,-3017,-2841,-1323,3018]],"properties":{"id":"24660699","dp":6191,"de":8508}},{"type":"Polygon","arcs":[[3019,-3019,-1322,3020,3021,3022]],"properties":{"id":"24660700","dp":15954,"de":22330}},{"type":"Polygon","arcs":[[-3022,3023,3024]],"properties":{"id":"24660701","dp":33450,"de":0}},{"type":"MultiPolygon","arcs":[[[3025,3026,3027,3028,3029,3030,-2866]],[[3031,-2868,3032]]],"properties":{"id":"24661184","dp":4169,"de":2953}},{"type":"Polygon","arcs":[[-3029,3033,3034]],"properties":{"id":"24661185","dp":12280,"de":1253}},{"type":"Polygon","arcs":[[-79,-2869,3035,-67,-72]],"properties":{"id":"24661187","dp":9794,"de":940}},{"type":"MultiPolygon","arcs":[[[3036,3037,3038,3039,3040,3041,3042]],[[3043,-69,3044,3045]]],"properties":{"id":"24661189","dp":6727,"de":727}},{"type":"MultiPolygon","arcs":[[[3046,3047,3048,3049,3050,-3037]],[[3051,-63,-3044,3052]]],"properties":{"id":"24661190","dp":8156,"de":1633}},{"type":"Polygon","arcs":[[3053,3054,3055,3056,3057]],"properties":{"id":"24663180","dp":2415,"de":686}},{"type":"Polygon","arcs":[[-3056,3058,3059,3060,3061,3062]],"properties":{"id":"24663181","dp":3183,"de":1018}},{"type":"Polygon","arcs":[[3063,3064,-1509,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074]],"properties":{"id":"24663182","dp":1077,"de":1517}},{"type":"Polygon","arcs":[[3075,-3075]],"properties":{"id":"24663183","dp":5428,"de":877}},{"type":"Polygon","arcs":[[3076,3077,3078,3079,3080,3081,3082]],"properties":{"id":"24663057","dp":593,"de":78}},{"type":"Polygon","arcs":[[3083,3084,3085,-3078]],"properties":{"id":"24663058","dp":2857,"de":312}},{"type":"Polygon","arcs":[[3086,3087,3088,3089,-3080,3090]],"properties":{"id":"24663059","dp":2379,"de":437}},{"type":"Polygon","arcs":[[3091,3092,-3088,3093]],"properties":{"id":"24663060","dp":2919,"de":0}},{"type":"Polygon","arcs":[[3094,-3089,-3093,3095]],"properties":{"id":"24663061","dp":3187,"de":250}},{"type":"Polygon","arcs":[[3096,3097,3098,-3090,-3095]],"properties":{"id":"24663062","dp":2804,"de":0}},{"type":"Polygon","arcs":[[3099,3100,-2986,3101,-2983,3102,3103]],"properties":{"id":"24663068","dp":126,"de":44}},{"type":"Polygon","arcs":[[-2538,-2530,3104,-703,-2320,3105,3106,-2312,-20,-2540,3107]],"properties":{"id":"24663306","dp":8248,"de":513}},{"type":"Polygon","arcs":[[3108,-1073,3109,3110,3111,3112,3113,-2053,3114,3115,3116,3117,3118,-930,-2939]],"properties":{"id":"24663311","dp":1255,"de":2169}},{"type":"Polygon","arcs":[[3119,-346,-344,-359,-245,-625,3120]],"properties":{"id":"24663314","dp":3789,"de":3877}},{"type":"Polygon","arcs":[[3121,3122,3123,3124,3125,3126,3127,3128]],"properties":{"id":"24663263","dp":4368,"de":4448}},{"type":"Polygon","arcs":[[3129,3130,3131,3132,3133]],"properties":{"id":"24663264","dp":14594,"de":900}},{"type":"Polygon","arcs":[[3134,3135,3136,3137]],"properties":{"id":"24663266","dp":11922,"de":0}},{"type":"Polygon","arcs":[[3138,3139,3140,3141,3142,-3098]],"properties":{"id":"24663063","dp":2789,"de":699}},{"type":"Polygon","arcs":[[3143,3144,-2987,-3101,3145,3146,-3141]],"properties":{"id":"24663064","dp":2965,"de":860}},{"type":"Polygon","arcs":[[-3144,-3140,3147]],"properties":{"id":"24663065","dp":5767,"de":0}},{"type":"Polygon","arcs":[[-2988,-3145,-3148,-3139,3148,3149]],"properties":{"id":"24663066","dp":1821,"de":738}},{"type":"Polygon","arcs":[[3150,-2980,-3102,-2985]],"properties":{"id":"24663069","dp":492,"de":40}},{"type":"Polygon","arcs":[[-3146,-3100,3151,3152,3153]],"properties":{"id":"24663070","dp":2795,"de":0}},{"type":"Polygon","arcs":[[-3154,3154,3155,-3142,-3147]],"properties":{"id":"24663071","dp":2994,"de":0}},{"type":"Polygon","arcs":[[-3153,3156,3157,-3155]],"properties":{"id":"24663072","dp":3381,"de":344}},{"type":"Polygon","arcs":[[-3143,-3156,-3158,3158,-3081,-3099]],"properties":{"id":"24663073","dp":2370,"de":1312}},{"type":"Polygon","arcs":[[-3082,-3159,-3157,-3152,-3104,3159,3160,3161]],"properties":{"id":"24663074","dp":338,"de":51}},{"type":"Polygon","arcs":[[3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,3177]],"properties":{"id":"24663334","dp":0,"de":983}},{"type":"Polygon","arcs":[[3178,3179,3180,3181]],"properties":{"id":"24660010","dp":3254,"de":395}},{"type":"Polygon","arcs":[[-2290,-2295,3182,3183,3184]],"properties":{"id":"24660250","dp":15885,"de":0}},{"type":"Polygon","arcs":[[-3185,3185,3186,-2291]],"properties":{"id":"24660251","dp":18471,"de":2159}},{"type":"Polygon","arcs":[[-3187,3187,3188,-2283]],"properties":{"id":"24660252","dp":12673,"de":1157}},{"type":"Polygon","arcs":[[-3188,-3186,-3184,3189,-1906,-1909,-1911,3190,3191]],"properties":{"id":"24660253","dp":4949,"de":2626}},{"type":"Polygon","arcs":[[-3192,3192,3193,3194]],"properties":{"id":"24660254","dp":12413,"de":2337}},{"type":"Polygon","arcs":[[-3189,-3195,-2266,-2277]],"properties":{"id":"24660255","dp":13650,"de":0}},{"type":"Polygon","arcs":[[3195,3196,-222,-2773,-818]],"properties":{"id":"24661147","dp":16692,"de":3359}},{"type":"Polygon","arcs":[[-813,3197,-3196,-817]],"properties":{"id":"24661148","dp":7286,"de":28963}},{"type":"Polygon","arcs":[[-223,-3197,-3198,3198]],"properties":{"id":"24661149","dp":12032,"de":5954}},{"type":"Polygon","arcs":[[3199,3200,3201,-224,-3199,-812]],"properties":{"id":"24661150","dp":8940,"de":10433}},{"type":"Polygon","arcs":[[3202,3203,-3200,-811]],"properties":{"id":"24661151","dp":10386,"de":2976}},{"type":"Polygon","arcs":[[3204,3205,-3203,-809]],"properties":{"id":"24661152","dp":16071,"de":1488}},{"type":"Polygon","arcs":[[3206,3207,-3205,-806]],"properties":{"id":"24661153","dp":15435,"de":4054}},{"type":"Polygon","arcs":[[3208,3209,3210,3211,-306,-295,-291,3212]],"properties":{"id":"24660082","dp":7922,"de":1243}},{"type":"Polygon","arcs":[[3213,-3213,-290,-288,-283]],"properties":{"id":"24660083","dp":7790,"de":843}},{"type":"Polygon","arcs":[[3214,3215,-3209,-3214,-282,3216]],"properties":{"id":"24660084","dp":8822,"de":0}},{"type":"Polygon","arcs":[[3217,3218,3219,3220,-3217,-281,3221]],"properties":{"id":"24660085","dp":9453,"de":1045}},{"type":"Polygon","arcs":[[3222,3223,3224,-3220]],"properties":{"id":"24660086","dp":12280,"de":0}},{"type":"Polygon","arcs":[[3225,-3223,-3219,3226]],"properties":{"id":"24660087","dp":20078,"de":0}},{"type":"Polygon","arcs":[[3227,-3224,-3226,3228,3229]],"properties":{"id":"24660088","dp":19234,"de":0}},{"type":"MultiPolygon","arcs":[[[3230,3231,3232,3233,3234,3235,3236,-3050,3237]],[[3238,3239,3240,3241,-3052,3242]]],"properties":{"id":"24661191","dp":5217,"de":395}},{"type":"Polygon","arcs":[[3243,-3231,3244,3245]],"properties":{"id":"24661192","dp":10329,"de":3047}},{"type":"Polygon","arcs":[[3246,-3232,-3244,3247]],"properties":{"id":"24661193","dp":14310,"de":2155}},{"type":"Polygon","arcs":[[3248,-3233,-3247,3249,3250]],"properties":{"id":"24661194","dp":10312,"de":780}},{"type":"Polygon","arcs":[[3251,-3234,-3249,3252,3253]],"properties":{"id":"24661195","dp":7338,"de":1778}},{"type":"Polygon","arcs":[[3254,3255,3256,-3235,-3252,3257]],"properties":{"id":"24661196","dp":6634,"de":437}},{"type":"Polygon","arcs":[[3258,3259,3260,3261,3262,-3256]],"properties":{"id":"24661197","dp":10199,"de":1268}},{"type":"Polygon","arcs":[[3263,3264,-3262,3265]],"properties":{"id":"24661198","dp":11922,"de":915}},{"type":"Polygon","arcs":[[3266,3267,-3266,-3261]],"properties":{"id":"24661199","dp":13511,"de":1272}},{"type":"Polygon","arcs":[[3268,3269,3270,3271,-3268,3272]],"properties":{"id":"24661200","dp":7638,"de":0}},{"type":"Polygon","arcs":[[3273,3274,-3271,3275]],"properties":{"id":"24661201","dp":12803,"de":0}},{"type":"Polygon","arcs":[[3276,-3264,-3272,-3275]],"properties":{"id":"24661202","dp":10665,"de":0}},{"type":"Polygon","arcs":[[3277,3278,-354,3279]],"properties":{"id":"24660108","dp":12724,"de":0}},{"type":"Polygon","arcs":[[-1988,-831,-834,-184,-193,3280,3281]],"properties":{"id":"24663184","dp":2621,"de":2323}},{"type":"Polygon","arcs":[[-3282,3282,-1976,-1984,-1989]],"properties":{"id":"24663185","dp":4750,"de":1246}},{"type":"Polygon","arcs":[[-3283,-3281,-198,3283,3284,3285,-1977]],"properties":{"id":"24663186","dp":4383,"de":757}},{"type":"Polygon","arcs":[[3286,3287,-1967,-3286]],"properties":{"id":"24663187","dp":2962,"de":1234}},{"type":"Polygon","arcs":[[3288,-3287,-3285,3289,3290]],"properties":{"id":"24663188","dp":4195,"de":394}},{"type":"Polygon","arcs":[[-3290,3291,3292]],"properties":{"id":"24663189","dp":14500,"de":0}},{"type":"Polygon","arcs":[[-3284,-197,-208,3293,-3292]],"properties":{"id":"24663190","dp":11452,"de":1085}},{"type":"Polygon","arcs":[[3294,3295,-3291]],"properties":{"id":"24663191","dp":16375,"de":0}},{"type":"Polygon","arcs":[[3296,3297,3298,3299,3300,3301,3302]],"properties":{"id":"24663194","dp":6012,"de":1831}},{"type":"Polygon","arcs":[[-3298,3303,3304,3305]],"properties":{"id":"24663195","dp":20000,"de":0}},{"type":"Polygon","arcs":[[3306,3307,3308,-3299,-3306,3309,3310]],"properties":{"id":"24663196","dp":6317,"de":5079}},{"type":"Polygon","arcs":[[3311,-3310,-3305,3312,-210]],"properties":{"id":"24663197","dp":8346,"de":0}},{"type":"Polygon","arcs":[[-204,-2979,3313,-3311,-3312,-209]],"properties":{"id":"24663198","dp":10715,"de":6769}},{"type":"Polygon","arcs":[[-3314,-2978,3314,-114,3315,-3307]],"properties":{"id":"24663199","dp":7392,"de":12541}},{"type":"Polygon","arcs":[[-113,-695,-3308,-3316]],"properties":{"id":"24663200","dp":12563,"de":2689}},{"type":"Polygon","arcs":[[3316,-115,-3315,-240]],"properties":{"id":"24663201","dp":6288,"de":8951}},{"type":"Polygon","arcs":[[3317,3318,-116,-3317,-239]],"properties":{"id":"24663202","dp":11703,"de":3548}},{"type":"Polygon","arcs":[[3319,-127,-117,-3319,3320]],"properties":{"id":"24663203","dp":34809,"de":4761}},{"type":"Polygon","arcs":[[-128,-3320,3321,3322,3323,3324]],"properties":{"id":"24663204","dp":9533,"de":0}},{"type":"Polygon","arcs":[[-3322,-3321,-3318,-238,3325,3326]],"properties":{"id":"24663205","dp":17491,"de":2920}},{"type":"Polygon","arcs":[[-3323,-3327,3327,3328]],"properties":{"id":"24663206","dp":26118,"de":7805}},{"type":"Polygon","arcs":[[3329,-3328,-3326,-244,3330,-173]],"properties":{"id":"24663207","dp":17308,"de":0}},{"type":"Polygon","arcs":[[-161,3331,3332,-3324,-3329,-3330,-172,-164]],"properties":{"id":"24663208","dp":11967,"de":1083}},{"type":"Polygon","arcs":[[-804,3333,3334,-3207]],"properties":{"id":"24661154","dp":13961,"de":2759}},{"type":"Polygon","arcs":[[-802,3335,3336,-3334]],"properties":{"id":"24661155","dp":21612,"de":2764}},{"type":"Polygon","arcs":[[-800,3337,3338,-3336]],"properties":{"id":"24661156","dp":22321,"de":4241}},{"type":"Polygon","arcs":[[3339,3340,-3338,-798]],"properties":{"id":"24661157","dp":19493,"de":0}},{"type":"Polygon","arcs":[[3341,3342,-3340,-796]],"properties":{"id":"24661158","dp":18669,"de":4935}},{"type":"Polygon","arcs":[[3343,3344,-3342,-795]],"properties":{"id":"24661159","dp":14922,"de":2519}},{"type":"Polygon","arcs":[[3345,3346,-3344,-787]],"properties":{"id":"24661160","dp":15663,"de":3763}},{"type":"Polygon","arcs":[[3347,3348,-3346,-785]],"properties":{"id":"24661161","dp":9785,"de":2412}},{"type":"Polygon","arcs":[[3349,3350,3351,-3348,-784]],"properties":{"id":"24661162","dp":13058,"de":1106}},{"type":"Polygon","arcs":[[3352,3353,3354,-3350,-783]],"properties":{"id":"24661163","dp":16531,"de":0}},{"type":"Polygon","arcs":[[3355,3356,-3353,-782,3357]],"properties":{"id":"24661164","dp":16909,"de":0}},{"type":"Polygon","arcs":[[3358,3359,-3356,3360]],"properties":{"id":"24661165","dp":10887,"de":1380}},{"type":"Polygon","arcs":[[3361,-3255,3362,-3361,-3358,-781,3363,3364]],"properties":{"id":"24661166","dp":5202,"de":1692}},{"type":"Polygon","arcs":[[-3258,3365,-3363]],"properties":{"id":"24661167","dp":15246,"de":0}},{"type":"Polygon","arcs":[[-3366,-3254,3366,-3359]],"properties":{"id":"24661168","dp":13460,"de":0}},{"type":"Polygon","arcs":[[-3367,-3253,-3251,3367,-3357,-3360]],"properties":{"id":"24661169","dp":15337,"de":1533}},{"type":"Polygon","arcs":[[-3368,-3250,3368,-3354]],"properties":{"id":"24661170","dp":23842,"de":0}},{"type":"Polygon","arcs":[[-3369,-3248,-3246,3369,-3351,-3355]],"properties":{"id":"24661171","dp":14472,"de":3140}},{"type":"Polygon","arcs":[[-3370,-3245,-3238,-3049,3370,-3349,-3352]],"properties":{"id":"24661172","dp":9834,"de":1731}},{"type":"Polygon","arcs":[[-3371,-3048,3371,-3347]],"properties":{"id":"24661173","dp":13832,"de":3310}},{"type":"Polygon","arcs":[[-3372,-3047,3372,-3345]],"properties":{"id":"24661174","dp":21274,"de":3861}},{"type":"Polygon","arcs":[[-3373,-3043,3373,-3343]],"properties":{"id":"24661175","dp":19230,"de":0}},{"type":"Polygon","arcs":[[-3374,-3042,3374,-3341]],"properties":{"id":"24661176","dp":21751,"de":0}},{"type":"Polygon","arcs":[[-3339,-3375,-3041,3375]],"properties":{"id":"24661177","dp":21036,"de":0}},{"type":"Polygon","arcs":[[-3376,-3040,3376,-3335,-3337]],"properties":{"id":"24661178","dp":6833,"de":3742}},{"type":"Polygon","arcs":[[-3377,3377,3378,-3206,-3208]],"properties":{"id":"24661179","dp":14724,"de":1862}},{"type":"Polygon","arcs":[[-3379,3379,3380,-3204]],"properties":{"id":"24661180","dp":23074,"de":0}},{"type":"Polygon","arcs":[[3381,3382,3383,3384,-3201,-3381]],"properties":{"id":"24661181","dp":18403,"de":2409}},{"type":"Polygon","arcs":[[3385,-3027,3386,-3384]],"properties":{"id":"24661182","dp":11259,"de":1358}},{"type":"Polygon","arcs":[[3387,-3034,-3028,-3386,-3383]],"properties":{"id":"24661183","dp":18908,"de":1649}},{"type":"Polygon","arcs":[[-2744,-2755,-2759,3388]],"properties":{"id":"24663246","dp":31756,"de":5620}},{"type":"Polygon","arcs":[[-1307,-1292,-1284,-1282]],"properties":{"id":"24663249","dp":47225,"de":5161}},{"type":"Polygon","arcs":[[3389,3390,3391,3392,3393]],"properties":{"id":"24663250","dp":12063,"de":3798}},{"type":"Polygon","arcs":[[3394,3395,3396,3397,3398]],"properties":{"id":"24663251","dp":11937,"de":0}},{"type":"Polygon","arcs":[[3399,-1105,-2404,-597,3400]],"properties":{"id":"24663252","dp":26443,"de":1408}},{"type":"Polygon","arcs":[[3401,3402,3403,3404,3405,3406,3407,3408,3409,3410]],"properties":{"id":"24663253","dp":13664,"de":1865}},{"type":"MultiPolygon","arcs":[[[-3274,3411,3412,3413,-3277]],[[3414,-2553,-2556,3415,3416]]],"properties":{"id":"24661203","dp":9063,"de":0}},{"type":"MultiPolygon","arcs":[[[3417,-3236,-3257,-3263,-3265,-3414]],[[3418,-3416,-3239]]],"properties":{"id":"24661204","dp":3052,"de":1081}},{"type":"Polygon","arcs":[[3419,-3240,-2557,-40,-45]],"properties":{"id":"24661205","dp":5939,"de":0}},{"type":"Polygon","arcs":[[-3420,-44,-51,3420,-3241]],"properties":{"id":"24661206","dp":6356,"de":550}},{"type":"Polygon","arcs":[[-53,-64,-3242,-3421]],"properties":{"id":"24661207","dp":10224,"de":0}},{"type":"MultiPolygon","arcs":[[[3421,3422,3423,3424,3425,-3412,-3276,-3270,3426]],[[3427,-2554,-3415,3428]]],"properties":{"id":"24661208","dp":295,"de":1732}},{"type":"Polygon","arcs":[[-3273,-3267,3429,3430,-3365,3431]],"properties":{"id":"24661209","dp":5475,"de":356}},{"type":"Polygon","arcs":[[-3260,3432,-3430]],"properties":{"id":"24661210","dp":15641,"de":0}},{"type":"Polygon","arcs":[[-3431,-3433,-3259,-3362]],"properties":{"id":"24661211","dp":12188,"de":4716}},{"type":"Polygon","arcs":[[3433,3434,-1166,-1180,-1183]],"properties":{"id":"24661212","dp":4038,"de":622}},{"type":"Polygon","arcs":[[3435,3436,3437,3438,3439,3440]],"properties":{"id":"24663269","dp":1061,"de":3255}},{"type":"Polygon","arcs":[[3441,3442,3443,3444,3445,3446,3447,3448,3449]],"properties":{"id":"24663270","dp":7341,"de":307}},{"type":"Polygon","arcs":[[-3408,3450,3451,3452,3453,3454,3455,3456,3457,3458]],"properties":{"id":"24663271","dp":2233,"de":11596}},{"type":"Polygon","arcs":[[-2933,3459,-2937,-2943]],"properties":{"id":"24663273","dp":19587,"de":976}},{"type":"Polygon","arcs":[[-1352,-1354,-2854,3460]],"properties":{"id":"24663274","dp":27500,"de":1973}},{"type":"Polygon","arcs":[[-3020,3461,-3295,-3293,-3294,-212,3462,3463,-3007,-3018]],"properties":{"id":"24663275","dp":4884,"de":10149}},{"type":"Polygon","arcs":[[3464,3465,3466]],"properties":{"id":"24663276","dp":12939,"de":0}},{"type":"Polygon","arcs":[[-152,3467,-3332,-160,-157]],"properties":{"id":"24663209","dp":9659,"de":810}},{"type":"Polygon","arcs":[[-133,-124,-3325,-3333,-3468]],"properties":{"id":"24663210","dp":10178,"de":1002}},{"type":"Polygon","arcs":[[-3331,-243,-2975,-174]],"properties":{"id":"24663211","dp":9648,"de":3079}},{"type":"Polygon","arcs":[[-2184,-2180,3468,3469,3470,3471]],"properties":{"id":"24663288","dp":4980,"de":1679}},{"type":"Polygon","arcs":[[-2895,-2892,3472,-2911,-2899]],"properties":{"id":"24663289","dp":8868,"de":2340}},{"type":"MultiPolygon","arcs":[[[3473,-3030,-3035,-3388,-3382,-3380,-3378,-3039]],[[-3045,-68,-3036,-3032,3474]]],"properties":{"id":"24663290","dp":6596,"de":3206}},{"type":"Polygon","arcs":[[3475,3476]],"properties":{"id":"24663291","dp":16843,"de":0}},{"type":"Polygon","arcs":[[3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488]],"properties":{"id":"24663292","dp":424,"de":759}},{"type":"Polygon","arcs":[[3489,3490,3491,3492,3493,3494,3495]],"properties":{"id":"24663293","dp":3039,"de":13093}},{"type":"Polygon","arcs":[[3496,3497,3498,3499,3500,3501]],"properties":{"id":"24663294","dp":3803,"de":0}},{"type":"Polygon","arcs":[[3502,3503,3504,3505]],"properties":{"id":"24663295","dp":3273,"de":1243}},{"type":"Polygon","arcs":[[3506,3507,3508,3509,3510,3511,3512]],"properties":{"id":"24663296","dp":10980,"de":0}},{"type":"Polygon","arcs":[[3513,3514,3515,3516,3517,3518,3519]],"properties":{"id":"24663297","dp":4062,"de":3647}},{"type":"Polygon","arcs":[[3520,-1611,3521,3522]],"properties":{"id":"24663298","dp":10290,"de":431}},{"type":"Polygon","arcs":[[-3134,3523,3524,3525]],"properties":{"id":"24663299","dp":20633,"de":2816}},{"type":"Polygon","arcs":[[3526,-1007,-1014,-1015,-1012,3527]],"properties":{"id":"24663254","dp":8178,"de":1468}},{"type":"Polygon","arcs":[[3528,-3434,-1182,-1185,-1004,-1176,-1005,-3527]],"properties":{"id":"24663255","dp":13213,"de":1348}},{"type":"Polygon","arcs":[[-2151,-2153,-2155,-2148,-2131,-2128,-2118,-1941,3529,3530,3531,-2156]],"properties":{"id":"24663256","dp":2761,"de":842}},{"type":"Polygon","arcs":[[-2914,3532,3533,3534,3535,3536,3537,3538,3539]],"properties":{"id":"24663257","dp":2943,"de":5095}},{"type":"Polygon","arcs":[[3540,3541,3542,3543,3544,-3537]],"properties":{"id":"24663258","dp":19200,"de":5619}},{"type":"Polygon","arcs":[[3545,-2054,-2048,-2059,-2056]],"properties":{"id":"24663259","dp":19775,"de":1810}},{"type":"Polygon","arcs":[[-1816,-2325,3546,3547,-2033,-1820]],"properties":{"id":"24663260","dp":5799,"de":302}},{"type":"Polygon","arcs":[[3548,-943,3549,3550,3551,3552,3553]],"properties":{"id":"24663261","dp":10430,"de":2822}},{"type":"Polygon","arcs":[[3554,3555,3556,3557,3558]],"properties":{"id":"24663262","dp":21363,"de":1420}},{"type":"Polygon","arcs":[[3559,3560,3561,3562]],"properties":{"id":"24663277","dp":11305,"de":1820}},{"type":"Polygon","arcs":[[-993,-1025,-984]],"properties":{"id":"24663278","dp":41141,"de":6974}},{"type":"Polygon","arcs":[[-3472,3563,3564,-2182]],"properties":{"id":"24663279","dp":24677,"de":2263}},{"type":"Polygon","arcs":[[3565,-3470,3566,-2039,-2051]],"properties":{"id":"24663280","dp":5196,"de":4803}},{"type":"Polygon","arcs":[[3567,3568,3569,3570,3571,3572,3573,3574]],"properties":{"id":"24663281","dp":12352,"de":5560}},{"type":"Polygon","arcs":[[3575,-1626,3576,3577,3578,3579,3580,3581,3582,3583]],"properties":{"id":"24663282","dp":403,"de":1720}},{"type":"Polygon","arcs":[[3584,-2255,-2258,-2270,-2263,-2247,-2251]],"properties":{"id":"24663283","dp":14097,"de":2115}},{"type":"Polygon","arcs":[[-1664,3585,3586,3587,-1650,-1655,-1657,3588,-1660]],"properties":{"id":"24663284","dp":5898,"de":454}},{"type":"Polygon","arcs":[[3589,3590,3591,3592,3593,3594,3595]],"properties":{"id":"24663285","dp":4915,"de":722}},{"type":"Polygon","arcs":[[-180,-190,-188]],"properties":{"id":"24663286","dp":14516,"de":3151}},{"type":"Polygon","arcs":[[-840,-186,-837,3596]],"properties":{"id":"24663287","dp":9080,"de":3738}},{"type":"Polygon","arcs":[[3597,-3526,3598,3599]],"properties":{"id":"24663300","dp":4306,"de":7142}},{"type":"Polygon","arcs":[[3600,3601,3602,3603,3604,3605,3606]],"properties":{"id":"24663301","dp":5000,"de":874}},{"type":"Polygon","arcs":[[-3598,3607,3608,-3603,3609,3610,3611,3612,-3130]],"properties":{"id":"24663302","dp":2740,"de":3662}},{"type":"Polygon","arcs":[[-2319,-2314,3613,-3106]],"properties":{"id":"24663304","dp":4222,"de":1674}},{"type":"Polygon","arcs":[[-3614,-2313,-3107]],"properties":{"id":"24663305","dp":11317,"de":0}},{"type":"Polygon","arcs":[[-3182,3614,3615,3616]],"properties":{"id":"24660011","dp":3302,"de":512}},{"type":"Polygon","arcs":[[3617,3618,3619,3620,3621,3622,-1126,3623,-1124,-1133,-3616]],"properties":{"id":"24660012","dp":1821,"de":144}},{"type":"Polygon","arcs":[[3624,-3618,3625]],"properties":{"id":"24660013","dp":5428,"de":0}},{"type":"Polygon","arcs":[[3626,-3621,3627,-3619,-3625]],"properties":{"id":"24660014","dp":4686,"de":0}},{"type":"Polygon","arcs":[[-3620,-3628]],"properties":{"id":"24660015","dp":16000,"de":0}},{"type":"Polygon","arcs":[[-1125,-3624]],"properties":{"id":"24660016","dp":7637,"de":0}},{"type":"Polygon","arcs":[[-3466,3628,-3622,-3627,3629,3630]],"properties":{"id":"24660017","dp":4391,"de":0}},{"type":"Polygon","arcs":[[3631,-3467,3632,3633,3634]],"properties":{"id":"24660020","dp":2240,"de":701}},{"type":"Polygon","arcs":[[3635,-3634,3636,3637]],"properties":{"id":"24660021","dp":11277,"de":0}},{"type":"Polygon","arcs":[[3638,3639,3640,-3638,3641,3642]],"properties":{"id":"24660022","dp":2906,"de":441}},{"type":"Polygon","arcs":[[-3637,-3633,-3631,3643,3644,-3642]],"properties":{"id":"24660023","dp":7629,"de":0}},{"type":"Polygon","arcs":[[-3643,-3645,3645,3646,3647]],"properties":{"id":"24660024","dp":6532,"de":636}},{"type":"Polygon","arcs":[[-3644,-3630,-3626,3648,-3646]],"properties":{"id":"24660025","dp":6474,"de":798}},{"type":"Polygon","arcs":[[-451,3649,-3647,-3649,-3615,-3181,3650]],"properties":{"id":"24660026","dp":3172,"de":5079}},{"type":"Polygon","arcs":[[3651,3652,-3639,-3648,-3650]],"properties":{"id":"24660027","dp":4713,"de":0}},{"type":"Polygon","arcs":[[3653,-3640,-3653,3654,3655]],"properties":{"id":"24660028","dp":5487,"de":0}},{"type":"Polygon","arcs":[[3656,-3656,3657]],"properties":{"id":"24660029","dp":7930,"de":0}},{"type":"MultiPolygon","arcs":[[[3658],[3659],[3660],[3661],[3662]],[[3663]],[[3664]],[[3665]],[[3666]],[[-1202,3667]]],"properties":{"id":"24663335","dp":0,"de":1576}},{"type":"Polygon","arcs":[[3668,3669,3670,3671,3672,3673,3674,3675,3676,3677]],"properties":{"id":"24663336","dp":1743,"de":12924}},{"type":"Polygon","arcs":[[3678,3679,-3675]],"properties":{"id":"24663337","dp":16604,"de":10074}},{"type":"Polygon","arcs":[[3680,3681,3682,3683,3684,3685,3686,-3394]],"properties":{"id":"24663340","dp":0,"de":454}},{"type":"Polygon","arcs":[[3687,3688,3689,3690,3691]],"properties":{"id":"24663341","dp":12943,"de":6012}},{"type":"Polygon","arcs":[[3692,3693,3694,3695,3696,3697,-3692,3698]],"properties":{"id":"24663342","dp":7561,"de":11140}},{"type":"Polygon","arcs":[[-3698,3699,-3688]],"properties":{"id":"24663343","dp":15903,"de":4819}},{"type":"Polygon","arcs":[[3700,3701,-3694,3702,3703]],"properties":{"id":"24663344","dp":13444,"de":19335}},{"type":"Polygon","arcs":[[-3703,-3693,3704,3705]],"properties":{"id":"24663345","dp":33611,"de":9444}},{"type":"Polygon","arcs":[[3706,3707,3708,3709,3710]],"properties":{"id":"24663346","dp":13606,"de":4566}},{"type":"Polygon","arcs":[[-1087,-1270,3711,3712,-3708,3713,3714]],"properties":{"id":"24663347","dp":8468,"de":33829}},{"type":"Polygon","arcs":[[-1089,3715,-3714,-3707,3716]],"properties":{"id":"24663348","dp":36692,"de":3846}},{"type":"Polygon","arcs":[[-3715,-3716,-1088]],"properties":{"id":"24663349","dp":45769,"de":3076}},{"type":"Polygon","arcs":[[-1090,-3717,-3711,3717,-1210]],"properties":{"id":"24663350","dp":15335,"de":17449}},{"type":"Polygon","arcs":[[-3179,3718,3719,3720,3721,3722,3723,3724,3725,3726,-1141,3727]],"properties":{"id":"24660001","dp":2047,"de":233}},{"type":"Polygon","arcs":[[3728,3729,3730,-3725]],"properties":{"id":"24660002","dp":5004,"de":0}},{"type":"Polygon","arcs":[[-3731,3731,-3726]],"properties":{"id":"24660003","dp":5058,"de":0}},{"type":"Polygon","arcs":[[-3724,3732,3733,-3729]],"properties":{"id":"24660004","dp":3438,"de":911}},{"type":"Polygon","arcs":[[3734,3735,-3733,-3723]],"properties":{"id":"24660005","dp":3742,"de":0}},{"type":"Polygon","arcs":[[3736,3737,-3735,-3722]],"properties":{"id":"24660006","dp":5415,"de":0}},{"type":"Polygon","arcs":[[-3730,-3734,-3736,-3738,3738,-1131,3739,-1136,-3727,-3732]],"properties":{"id":"24660007","dp":3336,"de":320}},{"type":"Polygon","arcs":[[-3719,-3617,-1132,-3739,-3737,-3721,3740]],"properties":{"id":"24660008","dp":4464,"de":418}},{"type":"Polygon","arcs":[[-3720,-3741]],"properties":{"id":"24660009","dp":4909,"de":0}},{"type":"Polygon","arcs":[[3741,3742,3743,-3230]],"properties":{"id":"24660089","dp":8651,"de":0}},{"type":"Polygon","arcs":[[3744,-3742,-3229,3745,3746]],"properties":{"id":"24660090","dp":15840,"de":0}},{"type":"Polygon","arcs":[[3747,-3746,-3227,-3218]],"properties":{"id":"24660091","dp":10712,"de":4502}},{"type":"Polygon","arcs":[[3748,3749,3750,-3747,-3748,-3222,-280]],"properties":{"id":"24660092","dp":1236,"de":585}},{"type":"Polygon","arcs":[[3751,3752,-3751,3753]],"properties":{"id":"24660093","dp":7496,"de":915}},{"type":"Polygon","arcs":[[3754,3755,-3745,-3753]],"properties":{"id":"24660094","dp":6199,"de":0}},{"type":"Polygon","arcs":[[-3755,-3752,3756,3757,3758,3759,3760,3761]],"properties":{"id":"24660095","dp":3070,"de":445}},{"type":"Polygon","arcs":[[-3762,3762,-3743,-3756]],"properties":{"id":"24660096","dp":6771,"de":0}},{"type":"Polygon","arcs":[[-3761,3763,3764,-3763]],"properties":{"id":"24660097","dp":8248,"de":0}},{"type":"Polygon","arcs":[[-3228,-3744,-3765,3765,-3215,-3221,-3225]],"properties":{"id":"24660098","dp":4304,"de":432}},{"type":"Polygon","arcs":[[-3766,-3764,3766,3767,3768,3769,3770,-3210,-3216]],"properties":{"id":"24660099","dp":9366,"de":477}},{"type":"Polygon","arcs":[[3771,3772,-3769]],"properties":{"id":"24660100","dp":22663,"de":0}},{"type":"Polygon","arcs":[[3773,3774,3775,3776,3777,3778,-3658,-3655,-3652,-450]],"properties":{"id":"24660030","dp":3590,"de":131}},{"type":"Polygon","arcs":[[-3775,3779]],"properties":{"id":"24660031","dp":6939,"de":0}},{"type":"Polygon","arcs":[[-445,3780,-3776,-3780,-3774,-449]],"properties":{"id":"24660032","dp":5086,"de":0}},{"type":"Polygon","arcs":[[3781,3782,-3777,-3781,-444,-423,3783,3784,3785]],"properties":{"id":"24660033","dp":4427,"de":0}},{"type":"Polygon","arcs":[[-3784,-422,3786]],"properties":{"id":"24660034","dp":4525,"de":0}},{"type":"Polygon","arcs":[[-3785,-3787,-421,3787]],"properties":{"id":"24660035","dp":4877,"de":0}},{"type":"Polygon","arcs":[[3788,-3786,-3788,-420,-1152]],"properties":{"id":"24660036","dp":7800,"de":0}},{"type":"Polygon","arcs":[[3789,3790,3791,3792,3793,3794,3795]],"properties":{"id":"24660458","dp":4152,"de":4725}},{"type":"Polygon","arcs":[[3796,3797,-3278,3798]],"properties":{"id":"24660109","dp":17802,"de":0}},{"type":"Polygon","arcs":[[3799,3800,3801,3802,3803,-3797]],"properties":{"id":"24660110","dp":22450,"de":0}},{"type":"Polygon","arcs":[[-339,3804,3805,-3802,3806]],"properties":{"id":"24660111","dp":18067,"de":0}},{"type":"Polygon","arcs":[[3807,-340,-3807,-3801]],"properties":{"id":"24660112","dp":18508,"de":0}},{"type":"Polygon","arcs":[[-338,3808,-3805]],"properties":{"id":"24660114","dp":23632,"de":0}},{"type":"Polygon","arcs":[[-3809,-337,3809,-3803,-3806]],"properties":{"id":"24660115","dp":16015,"de":0}},{"type":"Polygon","arcs":[[-3810,-336,3810,-262,-357,-355,-3279,-3798,-3804]],"properties":{"id":"24660117","dp":4462,"de":5461}},{"type":"Polygon","arcs":[[-335,3811,3812,-256,-261,-3811]],"properties":{"id":"24660118","dp":9364,"de":2931}},{"type":"Polygon","arcs":[[-334,3813,3814,-3812]],"properties":{"id":"24660119","dp":6607,"de":2031}},{"type":"Polygon","arcs":[[-3815,3815,3816,-265,-257,-3813]],"properties":{"id":"24660120","dp":6476,"de":0}},{"type":"Polygon","arcs":[[3817,3818,3819,-3816,3820,3821]],"properties":{"id":"24660121","dp":8339,"de":1797}},{"type":"Polygon","arcs":[[-3820,3822,3823,-266,-3817]],"properties":{"id":"24660122","dp":11481,"de":0}},{"type":"Polygon","arcs":[[-3819,3824,-3493,3825,3826,-3823]],"properties":{"id":"24660123","dp":3694,"de":0}},{"type":"Polygon","arcs":[[-3827,3827,3828,-267,-3824]],"properties":{"id":"24660124","dp":11609,"de":0}},{"type":"Polygon","arcs":[[-268,-3829,3829,3830,3831]],"properties":{"id":"24660125","dp":13209,"de":1131}},{"type":"Polygon","arcs":[[3832,3833,3834,-3830,-3828,-3826]],"properties":{"id":"24660126","dp":4189,"de":0}},{"type":"Polygon","arcs":[[-3835,3835,3836,3837,-3831]],"properties":{"id":"24660127","dp":6483,"de":773}},{"type":"Polygon","arcs":[[-3832,-3838,3838,-274,-269]],"properties":{"id":"24660128","dp":12889,"de":0}},{"type":"Polygon","arcs":[[-275,-3839,-3837,3839,3840,3841,-277]],"properties":{"id":"24660129","dp":10520,"de":1145}},{"type":"Polygon","arcs":[[-278,-3842,3842,-506]],"properties":{"id":"24660130","dp":9644,"de":3074}},{"type":"Polygon","arcs":[[-3841,3843,3844,3845,3846,-3843]],"properties":{"id":"24660131","dp":12089,"de":2665}},{"type":"Polygon","arcs":[[-3194,3847,3848,3849,3850,-2267]],"properties":{"id":"24660256","dp":4794,"de":1063}},{"type":"Polygon","arcs":[[-3851,3851,3852,-2268]],"properties":{"id":"24660257","dp":8399,"de":0}},{"type":"Polygon","arcs":[[-2269,-3853,3853,3854,3855,-2261]],"properties":{"id":"24660258","dp":4598,"de":2641}},{"type":"Polygon","arcs":[[-3855,3856]],"properties":{"id":"24660259","dp":15089,"de":0}},{"type":"Polygon","arcs":[[3857,3858,-2239,-2262,-3856,-3857,-3854,3859,-1382,3860]],"properties":{"id":"24660260","dp":2424,"de":2400}},{"type":"Polygon","arcs":[[3861,-3858]],"properties":{"id":"24660261","dp":11855,"de":1385}},{"type":"Polygon","arcs":[[3862,-2240,-3859,-3862,-3861,-1381,3863]],"properties":{"id":"24660262","dp":5335,"de":617}},{"type":"Polygon","arcs":[[-1380,3864,3865,-3864]],"properties":{"id":"24660263","dp":9710,"de":826}},{"type":"Polygon","arcs":[[-2229,-2234,-3863,-3866,3866,3867,3868,-2225]],"properties":{"id":"24660264","dp":7393,"de":4612}},{"type":"Polygon","arcs":[[3869,3870,3871,-3868]],"properties":{"id":"24660265","dp":10184,"de":0}},{"type":"Polygon","arcs":[[-2226,-3869,-3872,3872,3873,-1545,-1734,-2021,-2218,-2219,-2223]],"properties":{"id":"24660266","dp":4161,"de":2015}},{"type":"Polygon","arcs":[[3874,-3873,-3871]],"properties":{"id":"24660267","dp":9696,"de":0}},{"type":"Polygon","arcs":[[-3875,-3870,-3867,-3865,3875,-1546,-3874]],"properties":{"id":"24660268","dp":5985,"de":3475}},{"type":"Polygon","arcs":[[-1379,3876,3877,3878,-3876]],"properties":{"id":"24660269","dp":4919,"de":3068}},{"type":"Polygon","arcs":[[-1378,3879,3880,3881,3882,-3877]],"properties":{"id":"24660270","dp":9120,"de":1282}},{"type":"Polygon","arcs":[[3883,3884,-3881,3885]],"properties":{"id":"24660271","dp":9671,"de":0}},{"type":"Polygon","arcs":[[-3882,-3885,3886,3887,3888]],"properties":{"id":"24660272","dp":12573,"de":0}},{"type":"Polygon","arcs":[[-3878,-3883,-3889,3889,3890]],"properties":{"id":"24660273","dp":11016,"de":0}},{"type":"Polygon","arcs":[[-1541,-3879,-3891,3891,-1563,-1555,-1547]],"properties":{"id":"24660274","dp":2558,"de":1977}},{"type":"Polygon","arcs":[[-696,-105,-1063,-1069,-1070,-1082]],"properties":{"id":"24660779","dp":9027,"de":2188}},{"type":"Polygon","arcs":[[3892,3893,-1071,-1067,-1065]],"properties":{"id":"24660780","dp":7729,"de":0}},{"type":"Polygon","arcs":[[3894,3895,-3893,3896]],"properties":{"id":"24660781","dp":4710,"de":550}},{"type":"Polygon","arcs":[[3897,3898,3899,3900,-1052,3901,-3112,3902,-3895]],"properties":{"id":"24660783","dp":4526,"de":1025}},{"type":"Polygon","arcs":[[-326,3903,-489,3904,-481,3905,3906]],"properties":{"id":"24660058","dp":474,"de":381}},{"type":"Polygon","arcs":[[-3906,-476,-463,-454,3907]],"properties":{"id":"24660059","dp":4875,"de":1197}},{"type":"Polygon","arcs":[[-498,-482,-3905]],"properties":{"id":"24660060","dp":2995,"de":2623}},{"type":"Polygon","arcs":[[-328,-323,3908,-490,-3904,-325]],"properties":{"id":"24660061","dp":9766,"de":833}},{"type":"Polygon","arcs":[[3909,-491,-3909,-318]],"properties":{"id":"24660062","dp":7499,"de":0}},{"type":"Polygon","arcs":[[3910,-492,-3910,-317]],"properties":{"id":"24660063","dp":10650,"de":0}},{"type":"Polygon","arcs":[[3911,3912,-493,-3911,-316,3913]],"properties":{"id":"24660064","dp":8991,"de":0}},{"type":"Polygon","arcs":[[-313,3914,-3914,-315]],"properties":{"id":"24660065","dp":13836,"de":0}},{"type":"Polygon","arcs":[[3915,3916,3917,-3912,-3915,3918]],"properties":{"id":"24660066","dp":6968,"de":834}},{"type":"Polygon","arcs":[[3919,-494,-3913,-3918]],"properties":{"id":"24660067","dp":7838,"de":0}},{"type":"Polygon","arcs":[[3920,-495,-3920,-3917,3921]],"properties":{"id":"24660068","dp":8108,"de":844}},{"type":"Polygon","arcs":[[3922,3923,3924,-3922,-3916]],"properties":{"id":"24660069","dp":10914,"de":4850}},{"type":"Polygon","arcs":[[-312,3925,3926,3927,-3923,-3919]],"properties":{"id":"24660070","dp":11619,"de":1190}},{"type":"Polygon","arcs":[[-308,3928,3929,-3926,-311]],"properties":{"id":"24660071","dp":10212,"de":0}},{"type":"Polygon","arcs":[[-657,3930,-3927,-3930,3931]],"properties":{"id":"24660072","dp":10846,"de":1476}},{"type":"Polygon","arcs":[[-299,-305,3932,-654,-3932,-3929,-307]],"properties":{"id":"24660073","dp":4275,"de":574}},{"type":"Polygon","arcs":[[3933,3934,-653,-3933,-304]],"properties":{"id":"24660074","dp":8286,"de":1582}},{"type":"Polygon","arcs":[[3935,3936,3937,-3934,-303]],"properties":{"id":"24660075","dp":5793,"de":672}},{"type":"Polygon","arcs":[[3938,3939,-647,-3935,-3938]],"properties":{"id":"24660076","dp":6507,"de":902}},{"type":"Polygon","arcs":[[3940,-638,-641,-645,-3940,3941]],"properties":{"id":"24660077","dp":6005,"de":0}},{"type":"Polygon","arcs":[[3942,3943,-3942,-3939,-3937,3944]],"properties":{"id":"24660078","dp":6475,"de":0}},{"type":"Polygon","arcs":[[-3773,3945,-639,-3941,-3944,3946,-3770]],"properties":{"id":"24660079","dp":3312,"de":756}},{"type":"Polygon","arcs":[[-3947,-3943,3947,-3211,-3771]],"properties":{"id":"24660080","dp":9645,"de":0}},{"type":"Polygon","arcs":[[-3948,-3945,-3936,-302,-3212]],"properties":{"id":"24660081","dp":6897,"de":1705}},{"type":"Polygon","arcs":[[-3772,-3768,3948,3949,-632,-636,-3946]],"properties":{"id":"24660101","dp":3859,"de":1078}},{"type":"Polygon","arcs":[[-3121,-627,-633,-3950,3950]],"properties":{"id":"24660102","dp":3071,"de":604}},{"type":"Polygon","arcs":[[-3951,-3949,-3767,-3760,3951]],"properties":{"id":"24660103","dp":4091,"de":0}},{"type":"Polygon","arcs":[[-3759,3952,-3484,3953,3954,3955,3956,3957,3958,-353,-350,-341,-3120,-3952]],"properties":{"id":"24660104","dp":968,"de":1344}},{"type":"Polygon","arcs":[[3959,-3280,-351,-3959]],"properties":{"id":"24660107","dp":14011,"de":0}},{"type":"Polygon","arcs":[[3960,3961,3962,3963]],"properties":{"id":"24660564","dp":5572,"de":412}},{"type":"Polygon","arcs":[[3964,3965,-3964,3966,3967,3968,3969,3970]],"properties":{"id":"24660565","dp":5712,"de":0}},{"type":"Polygon","arcs":[[3971,3972,3973,3974,-3967,3975]],"properties":{"id":"24660566","dp":3902,"de":1012}},{"type":"Polygon","arcs":[[3976,-3968,-3975]],"properties":{"id":"24660567","dp":10783,"de":1546}},{"type":"Polygon","arcs":[[-3974,3977,3978,-3969,-3977]],"properties":{"id":"24660568","dp":10551,"de":0}},{"type":"Polygon","arcs":[[-3973,3979,3980,3981,-3978]],"properties":{"id":"24660569","dp":8966,"de":0}},{"type":"Polygon","arcs":[[-3845,3982,-1770,-1953,3983,3984]],"properties":{"id":"24660132","dp":12459,"de":0}},{"type":"Polygon","arcs":[[-3985,3985,-3846]],"properties":{"id":"24660133","dp":12254,"de":0}},{"type":"Polygon","arcs":[[-507,-3847,-3986,-3984,-1952,-1949,3986,3987]],"properties":{"id":"24660134","dp":2753,"de":849}},{"type":"Polygon","arcs":[[-3987,-1948,3988,3989]],"properties":{"id":"24660135","dp":10378,"de":0}},{"type":"Polygon","arcs":[[3990,-3989,-1947,3991]],"properties":{"id":"24660136","dp":13547,"de":0}},{"type":"Polygon","arcs":[[-3992,-1946,3992,3993]],"properties":{"id":"24660137","dp":12757,"de":0}},{"type":"Polygon","arcs":[[-3993,-1927,3994]],"properties":{"id":"24660138","dp":23147,"de":758}},{"type":"Polygon","arcs":[[3995,-3995,-1945,-606]],"properties":{"id":"24660139","dp":6485,"de":3954}},{"type":"Polygon","arcs":[[-508,-3988,-3990,-3991,-3994,-3996]],"properties":{"id":"24660140","dp":12885,"de":1179}},{"type":"Polygon","arcs":[[3996,3997,3998,3999,4000,4001]],"properties":{"id":"24660598","dp":4539,"de":2885}},{"type":"Polygon","arcs":[[-3191,-1910,-1907,-1882,4002,-3848,-3193]],"properties":{"id":"24660364","dp":5171,"de":4040}},{"type":"Polygon","arcs":[[-3849,-4003,-1881,4003]],"properties":{"id":"24660365","dp":12324,"de":3944}},{"type":"Polygon","arcs":[[-3850,-4004,-1880,4004,4005,-1374,-3860,-3852]],"properties":{"id":"24660366","dp":5486,"de":2006}},{"type":"Polygon","arcs":[[-1879,4006,4007,4008,4009,-4005]],"properties":{"id":"24660367","dp":12082,"de":879}},{"type":"Polygon","arcs":[[-4006,-4010,4010,4011,-1362,-1375]],"properties":{"id":"24660368","dp":13387,"de":1254}},{"type":"Polygon","arcs":[[4012,4013,-4011,-4009]],"properties":{"id":"24660369","dp":19425,"de":0}},{"type":"Polygon","arcs":[[4014,4015,-1367,-4012,-4014]],"properties":{"id":"24660370","dp":26294,"de":6696}},{"type":"Polygon","arcs":[[-4013,-4008,4016,4017,-4015]],"properties":{"id":"24660371","dp":15693,"de":0}},{"type":"Polygon","arcs":[[-4007,-1878,4018,4019,-4017]],"properties":{"id":"24660372","dp":12250,"de":833}},{"type":"Polygon","arcs":[[-4018,-4020,4020,4021,4022,-4016]],"properties":{"id":"24660373","dp":13591,"de":892}},{"type":"Polygon","arcs":[[-1368,-4023,4023,4024]],"properties":{"id":"24660374","dp":15451,"de":0}},{"type":"Polygon","arcs":[[4025,4026,4027,4028,-4024,-4022]],"properties":{"id":"24660375","dp":17118,"de":0}},{"type":"Polygon","arcs":[[-4025,-4029,4029,-1369]],"properties":{"id":"24660376","dp":10732,"de":0}},{"type":"Polygon","arcs":[[4030,4031,4032,-1370,-4030,4033]],"properties":{"id":"24660377","dp":16050,"de":0}},{"type":"Polygon","arcs":[[4034,4035,-4032,4036]],"properties":{"id":"24660378","dp":16162,"de":0}},{"type":"Polygon","arcs":[[-4035,4037,4038,4039]],"properties":{"id":"24660379","dp":13517,"de":0}},{"type":"Polygon","arcs":[[-4031,4040,4041,4042,-4038,-4037]],"properties":{"id":"24660380","dp":14898,"de":0}},{"type":"Polygon","arcs":[[-4039,-4043,4043,4044,4045]],"properties":{"id":"24660381","dp":14686,"de":1174}},{"type":"Polygon","arcs":[[-4042,4046,4047,4048,-4044]],"properties":{"id":"24660382","dp":10102,"de":0}},{"type":"Polygon","arcs":[[4049,4050,-4049,4051,4052]],"properties":{"id":"24660383","dp":9879,"de":1982}},{"type":"Polygon","arcs":[[-4053,4053,4054,4055]],"properties":{"id":"24660384","dp":10290,"de":0}},{"type":"Polygon","arcs":[[-4052,4056,-1668,4057,4058,4059,4060,-4054]],"properties":{"id":"24660385","dp":4564,"de":788}},{"type":"Polygon","arcs":[[4061,-4055,-4061,4062]],"properties":{"id":"24660386","dp":6116,"de":0}},{"type":"Polygon","arcs":[[-1565,4063,-4063,-4060,4064,4065]],"properties":{"id":"24660387","dp":3554,"de":0}},{"type":"Polygon","arcs":[[-4050,-4056,-4062,-4064,-1564,4066]],"properties":{"id":"24660388","dp":7447,"de":2180}},{"type":"Polygon","arcs":[[4067,4068,-4045,-4051,-4067,-3892,-3890,-3888,4069]],"properties":{"id":"24660389","dp":3721,"de":3940}},{"type":"Polygon","arcs":[[4070,4071,-4070,-3887,-3884]],"properties":{"id":"24660390","dp":9086,"de":0}},{"type":"Polygon","arcs":[[4072,-4068,-4072,4073]],"properties":{"id":"24660391","dp":9632,"de":0}},{"type":"Polygon","arcs":[[-3880,-1377,4074,4075,-4074,-4071,-3886]],"properties":{"id":"24660392","dp":5027,"de":3240}},{"type":"Polygon","arcs":[[-1372,-1365,4076,-4075,-1376]],"properties":{"id":"24660393","dp":9076,"de":1988}},{"type":"Polygon","arcs":[[-4076,-4077,-1364,-1371,-4033,-4036,-4040,-4046,-4069,-4073]],"properties":{"id":"24660394","dp":4090,"de":1463}},{"type":"Polygon","arcs":[[4077,4078,-689,4079,4080,4081]],"properties":{"id":"24660166","dp":5356,"de":515}},{"type":"Polygon","arcs":[[4082,4083,-4081,4084,4085]],"properties":{"id":"24660167","dp":16198,"de":1033}},{"type":"Polygon","arcs":[[4086,-4086,4087,4088]],"properties":{"id":"24660168","dp":4927,"de":671}},{"type":"Polygon","arcs":[[4089,4090,4091,-4088,4092,4093]],"properties":{"id":"24660169","dp":3152,"de":935}},{"type":"Polygon","arcs":[[-4085,-4080,-688,4094,4095,-4093]],"properties":{"id":"24660170","dp":7031,"de":0}},{"type":"Polygon","arcs":[[-1566,-4066,4096,-1653,-1645,4097]],"properties":{"id":"24660399","dp":3414,"de":0}},{"type":"Polygon","arcs":[[-1567,-4098,-1644,-1642,-1635,-1634,-1631,-1435,-1433,-1431,-1570]],"properties":{"id":"24660400","dp":2100,"de":575}},{"type":"Polygon","arcs":[[4098,4099,4100]],"properties":{"id":"24660423","dp":23730,"de":0}},{"type":"Polygon","arcs":[[4101,4102,4103,-4099,4104]],"properties":{"id":"24660424","dp":15945,"de":1718}},{"type":"Polygon","arcs":[[4105,4106,-4102,4107]],"properties":{"id":"24660425","dp":18770,"de":1495}},{"type":"Polygon","arcs":[[4108,4109,-4106,4110]],"properties":{"id":"24660426","dp":17269,"de":0}},{"type":"Polygon","arcs":[[4111,4112,4113,-4109]],"properties":{"id":"24660427","dp":17706,"de":0}},{"type":"Polygon","arcs":[[4114,4115,4116,-4113]],"properties":{"id":"24660428","dp":27773,"de":0}},{"type":"Polygon","arcs":[[4117,-4116,4118,4119]],"properties":{"id":"24660429","dp":23579,"de":0}},{"type":"Polygon","arcs":[[4120,-4120,4121,4122]],"properties":{"id":"24660430","dp":16882,"de":0}},{"type":"Polygon","arcs":[[-4123,4123,4124]],"properties":{"id":"24660431","dp":14984,"de":0}},{"type":"Polygon","arcs":[[4125,4126,4127,4128,-4124]],"properties":{"id":"24660432","dp":10350,"de":0}},{"type":"Polygon","arcs":[[4129,4130,-4128,4131]],"properties":{"id":"24660433","dp":17389,"de":1174}},{"type":"Polygon","arcs":[[4132,4133,-4130,4134]],"properties":{"id":"24660434","dp":16356,"de":0}},{"type":"Polygon","arcs":[[4135,4136,4137,-4133]],"properties":{"id":"24660435","dp":15329,"de":3708}},{"type":"Polygon","arcs":[[4138,4139,4140,4141,-4137,4142]],"properties":{"id":"24660436","dp":10709,"de":4233}},{"type":"Polygon","arcs":[[4143,4144,-4140,4145]],"properties":{"id":"24660437","dp":22179,"de":0}},{"type":"Polygon","arcs":[[4146,4147,-4144,4148]],"properties":{"id":"24660438","dp":25625,"de":3750}},{"type":"Polygon","arcs":[[4149,4150,-4147,4151]],"properties":{"id":"24660439","dp":20000,"de":6140}},{"type":"Polygon","arcs":[[4152,4153,-3792,4154,4155]],"properties":{"id":"24660459","dp":17007,"de":2068}},{"type":"Polygon","arcs":[[4156,4157,4158,-4153,4159]],"properties":{"id":"24660460","dp":18172,"de":0}},{"type":"Polygon","arcs":[[4160,4161,-4154,-4159]],"properties":{"id":"24660461","dp":15100,"de":1507}},{"type":"Polygon","arcs":[[4162,4163,4164,-4161,-4158,4165]],"properties":{"id":"24660462","dp":15151,"de":1377}},{"type":"Polygon","arcs":[[4166,4167,-4163,4168]],"properties":{"id":"24660463","dp":19042,"de":2816}},{"type":"Polygon","arcs":[[4169,4170,-4167,4171]],"properties":{"id":"24660464","dp":15386,"de":2743}},{"type":"Polygon","arcs":[[4172,4173,4174,-4170,4175]],"properties":{"id":"24660465","dp":13896,"de":1558}},{"type":"Polygon","arcs":[[4176,4177,-4173,4178]],"properties":{"id":"24660466","dp":14131,"de":3443}},{"type":"Polygon","arcs":[[4179,-4179,4180,4181]],"properties":{"id":"24660467","dp":11898,"de":7365}},{"type":"Polygon","arcs":[[-4181,-4176,4182,4183]],"properties":{"id":"24660468","dp":16944,"de":2146}},{"type":"Polygon","arcs":[[-4183,-4172,4184,4185]],"properties":{"id":"24660469","dp":12219,"de":2682}},{"type":"Polygon","arcs":[[-4185,-4169,4186,4187]],"properties":{"id":"24660470","dp":17717,"de":6929}},{"type":"Polygon","arcs":[[-4187,-4166,-4157,4188,4189]],"properties":{"id":"24660471","dp":14788,"de":2380}},{"type":"Polygon","arcs":[[4190,-4190,4191,4192,4193]],"properties":{"id":"24660472","dp":17818,"de":3541}},{"type":"Polygon","arcs":[[4194,-4188,-4191,4195,4196]],"properties":{"id":"24660473","dp":17999,"de":3150}},{"type":"Polygon","arcs":[[4197,-4186,-4195,4198,4199]],"properties":{"id":"24660474","dp":15870,"de":3233}},{"type":"Polygon","arcs":[[4200,-4184,-4198,4201]],"properties":{"id":"24660475","dp":12894,"de":3617}},{"type":"Polygon","arcs":[[-3683,-4182,-4201,4202]],"properties":{"id":"24660476","dp":17076,"de":7748}},{"type":"Polygon","arcs":[[4203,-4180,-3682]],"properties":{"id":"24660478","dp":4474,"de":4523}},{"type":"Polygon","arcs":[[-4177,-4204,-3681,4204,4205,4206,4207,4208,4209]],"properties":{"id":"24660479","dp":1370,"de":9509}},{"type":"Polygon","arcs":[[-4209,4210,4211,-504,-511,4212]],"properties":{"id":"24660480","dp":5733,"de":3267}},{"type":"Polygon","arcs":[[4213,4214,-4212]],"properties":{"id":"24660481","dp":12109,"de":1734}},{"type":"Polygon","arcs":[[4215,-4214,4216]],"properties":{"id":"24660482","dp":16749,"de":4489}},{"type":"Polygon","arcs":[[4217,4218,4219,-505,-4215,-4216,4220]],"properties":{"id":"24660483","dp":5110,"de":940}},{"type":"Polygon","arcs":[[-3898,-3897,-1064,-1060,4221]],"properties":{"id":"24660784","dp":3202,"de":407}},{"type":"Polygon","arcs":[[-1055,-1053,-3901,4222,-3899,-4222,-1059]],"properties":{"id":"24660785","dp":3121,"de":559}},{"type":"Polygon","arcs":[[-3900,-4223]],"properties":{"id":"24660786","dp":3672,"de":491}},{"type":"Polygon","arcs":[[-1050,-2008,-2177,4223,-3902]],"properties":{"id":"24660787","dp":3514,"de":355}},{"type":"Polygon","arcs":[[-4065,-4059,4224,-1656,-1648,-4097]],"properties":{"id":"24660401","dp":3324,"de":913}},{"type":"Polygon","arcs":[[-4225,-4058,-1667,-1661,-3589,-1658]],"properties":{"id":"24660402","dp":12199,"de":0}},{"type":"Polygon","arcs":[[-1675,-1671,-1670,-4057,-4048,4225]],"properties":{"id":"24660403","dp":3108,"de":1372}},{"type":"Polygon","arcs":[[-4028,4226,4227,-4226,-4047,-4041,-4034]],"properties":{"id":"24660404","dp":5442,"de":0}},{"type":"Polygon","arcs":[[4228,-1690,-1678,-1676,-4228,4229]],"properties":{"id":"24660405","dp":15799,"de":0}},{"type":"Polygon","arcs":[[4230,-4230,-4227,-4027]],"properties":{"id":"24660406","dp":10615,"de":1538}},{"type":"Polygon","arcs":[[-4026,4231,4232,-1686,-4229,-4231]],"properties":{"id":"24660407","dp":13564,"de":0}},{"type":"Polygon","arcs":[[4233,4234,4235,-1698,-1691,-1687,-4233]],"properties":{"id":"24660408","dp":18621,"de":0}},{"type":"Polygon","arcs":[[4236,4237,-4235,4238]],"properties":{"id":"24660409","dp":22556,"de":0}},{"type":"Polygon","arcs":[[-1877,-4239,-4234,-4232,-4021,-4019]],"properties":{"id":"24660410","dp":6211,"de":1941}},{"type":"Polygon","arcs":[[4239,-1699,-4236,-4238]],"properties":{"id":"24660411","dp":21674,"de":3167}},{"type":"Polygon","arcs":[[-1847,-1838,-1834,-1831,-1702,-1700,-1695,-4240,-4237,-1876]],"properties":{"id":"24660412","dp":1516,"de":947}},{"type":"Polygon","arcs":[[4240,4241,4242,4243,-1897,-1904,4244]],"properties":{"id":"24660413","dp":7629,"de":3237}},{"type":"Polygon","arcs":[[4245,4246,-1898,-4244]],"properties":{"id":"24660414","dp":13892,"de":0}},{"type":"Polygon","arcs":[[4247,4248,-1893,-1899,-4247,4249]],"properties":{"id":"24660415","dp":7452,"de":1071}},{"type":"Polygon","arcs":[[4250,4251,4252,4253,4254,-4248]],"properties":{"id":"24660416","dp":8088,"de":0}},{"type":"Polygon","arcs":[[4255,4256,4257,-4252,4258]],"properties":{"id":"24660417","dp":8397,"de":1217}},{"type":"Polygon","arcs":[[4259,4260,-4253,-4258]],"properties":{"id":"24660418","dp":7408,"de":0}},{"type":"Polygon","arcs":[[4261,4262,4263,4264,-4260,-4257]],"properties":{"id":"24660419","dp":4079,"de":789}},{"type":"Polygon","arcs":[[4265,4266,-4264,4267]],"properties":{"id":"24660420","dp":17323,"de":0}},{"type":"Polygon","arcs":[[4268,-4268,-4263,4269,4270]],"properties":{"id":"24660421","dp":16531,"de":1219}},{"type":"Polygon","arcs":[[4271,-4100,-4104,4272,-4269]],"properties":{"id":"24660422","dp":15726,"de":0}},{"type":"MultiPolygon","arcs":[[[4273,4274,-2460,-2466,4275,4276,4277,4278,4279,4280]],[[4281,4282]]],"properties":{"id":"24660926","dp":6773,"de":0}},{"type":"Polygon","arcs":[[4283,4284,-2461,-4275]],"properties":{"id":"24660927","dp":7585,"de":0}},{"type":"Polygon","arcs":[[4285,-2467,-2462,-4285]],"properties":{"id":"24660928","dp":8019,"de":0}},{"type":"Polygon","arcs":[[4286,-3401,-596,4287,-3477,4288,4289]],"properties":{"id":"24660518","dp":15000,"de":563}},{"type":"Polygon","arcs":[[4290,4291,4292,4293,4294,4295]],"properties":{"id":"24660525","dp":12410,"de":0}},{"type":"Polygon","arcs":[[4296,4297,-4150,4298]],"properties":{"id":"24660440","dp":14646,"de":0}},{"type":"Polygon","arcs":[[4299,4300,-4297,4301]],"properties":{"id":"24660441","dp":18742,"de":3459}},{"type":"Polygon","arcs":[[4302,4303,-4300,4304]],"properties":{"id":"24660442","dp":16552,"de":1709}},{"type":"Polygon","arcs":[[-3685,4305,-4303,4306]],"properties":{"id":"24660443","dp":15920,"de":4447}},{"type":"Polygon","arcs":[[-3684,-4203,4307,-4306]],"properties":{"id":"24660444","dp":14444,"de":7834}},{"type":"Polygon","arcs":[[-4308,-4202,4308,-4304]],"properties":{"id":"24660445","dp":16717,"de":2671}},{"type":"Polygon","arcs":[[-4309,-4200,4309,-4301]],"properties":{"id":"24660446","dp":17611,"de":0}},{"type":"Polygon","arcs":[[-4310,-4199,4310,-4298]],"properties":{"id":"24660447","dp":17577,"de":2863}},{"type":"Polygon","arcs":[[-4311,-4197,4311,-4151]],"properties":{"id":"24660448","dp":22538,"de":6735}},{"type":"Polygon","arcs":[[-4312,-4196,4312,-4148]],"properties":{"id":"24660449","dp":20333,"de":2500}},{"type":"Polygon","arcs":[[-4313,-4194,4313,-4141,-4145]],"properties":{"id":"24660450","dp":15549,"de":1126}},{"type":"Polygon","arcs":[[-4142,-4314,-4193,4314,4315]],"properties":{"id":"24660451","dp":14132,"de":2739}},{"type":"Polygon","arcs":[[-4316,4316,-4138]],"properties":{"id":"24660452","dp":13869,"de":1636}},{"type":"Polygon","arcs":[[-4134,-4317,4317,4318,4319]],"properties":{"id":"24660453","dp":8690,"de":1719}},{"type":"Polygon","arcs":[[-4192,4320,-4318,-4315]],"properties":{"id":"24660454","dp":13194,"de":4027}},{"type":"Polygon","arcs":[[-4189,-4160,4321,-4321]],"properties":{"id":"24660455","dp":11069,"de":3323}},{"type":"Polygon","arcs":[[-4322,-4156,4322,-3790,-4319]],"properties":{"id":"24660456","dp":15204,"de":1656}},{"type":"Polygon","arcs":[[-4155,-3791,-4323]],"properties":{"id":"24660457","dp":13793,"de":2387}},{"type":"Polygon","arcs":[[-2655,-2639,-2632,4323,4324,4325,-2490,-2484,-2657]],"properties":{"id":"24660952","dp":2107,"de":2644}},{"type":"Polygon","arcs":[[4326,4327,4328,-3982]],"properties":{"id":"24660570","dp":22280,"de":3947}},{"type":"Polygon","arcs":[[4329,4330,4331,-4327]],"properties":{"id":"24660571","dp":32237,"de":0}},{"type":"Polygon","arcs":[[4332,4333,4334,4335,4336,-4331,4337]],"properties":{"id":"24660572","dp":13214,"de":0}},{"type":"Polygon","arcs":[[4338,4339,4340,4341,4342]],"properties":{"id":"24660576","dp":15705,"de":0}},{"type":"Polygon","arcs":[[-4340,4343,4344]],"properties":{"id":"24660577","dp":7985,"de":0}},{"type":"Polygon","arcs":[[4345,4346,4347,-4342,4348,4349]],"properties":{"id":"24660578","dp":4970,"de":3345}},{"type":"Polygon","arcs":[[4350,4351,-4349]],"properties":{"id":"24660579","dp":14097,"de":4768}},{"type":"Polygon","arcs":[[4352,-4350,-4352,4353,4354]],"properties":{"id":"24660580","dp":4554,"de":1508}},{"type":"Polygon","arcs":[[4355,4356,4357,4358,4359,4360]],"properties":{"id":"24660581","dp":5580,"de":2961}},{"type":"Polygon","arcs":[[4361,4362,4363,-4356,4364]],"properties":{"id":"24660582","dp":11443,"de":1012}},{"type":"Polygon","arcs":[[4365,-4365,-4361,4366,4367]],"properties":{"id":"24660583","dp":10212,"de":5418}},{"type":"Polygon","arcs":[[4368,4369,4370,-4362,-4366,4371]],"properties":{"id":"24660584","dp":5052,"de":862}},{"type":"Polygon","arcs":[[4372,-4372,-4368,4373,4374,4375,4376]],"properties":{"id":"24660585","dp":4741,"de":2181}},{"type":"Polygon","arcs":[[4377,-4221,-4217,-4211,-4208]],"properties":{"id":"24660484","dp":10803,"de":2362}},{"type":"Polygon","arcs":[[-4207,4378,4379,-4218,-4378]],"properties":{"id":"24660485","dp":5224,"de":6205}},{"type":"Polygon","arcs":[[-575,-512,-500,4380,4381,-4380,4382]],"properties":{"id":"24660486","dp":1819,"de":13159}},{"type":"Polygon","arcs":[[-4382,4383,-4219]],"properties":{"id":"24660487","dp":15706,"de":2077}},{"type":"Polygon","arcs":[[-4384,-4381,-499,-4220]],"properties":{"id":"24660488","dp":12904,"de":919}},{"type":"Polygon","arcs":[[4384,-2704,-2706,-2458,-2413]],"properties":{"id":"24660979","dp":9222,"de":2208}},{"type":"Polygon","arcs":[[-2702,-2705,-4385,-2412]],"properties":{"id":"24660980","dp":10359,"de":0}},{"type":"Polygon","arcs":[[4385,4386,4387,-3999]],"properties":{"id":"24660599","dp":6274,"de":0}},{"type":"Polygon","arcs":[[-4388,4388,4389,4390,-4000]],"properties":{"id":"24660600","dp":5620,"de":5057}},{"type":"Polygon","arcs":[[-4390,4391,4392,-3123,4393]],"properties":{"id":"24660601","dp":7892,"de":2229}},{"type":"Polygon","arcs":[[4394,-4392,-4389,4395,4396,4397]],"properties":{"id":"24660602","dp":4270,"de":5729}},{"type":"Polygon","arcs":[[4398,4399,-4396,-4387,4400]],"properties":{"id":"24660603","dp":4420,"de":1462}},{"type":"Polygon","arcs":[[-4400,4401,4402,-4397]],"properties":{"id":"24660604","dp":6686,"de":0}},{"type":"Polygon","arcs":[[-4374,-4367,-4360,-4355,4403,4404,-4402,-4399,4405]],"properties":{"id":"24660605","dp":2946,"de":5468}},{"type":"Polygon","arcs":[[-4375,-4406,-4401,-4386,4406]],"properties":{"id":"24660606","dp":3811,"de":1411}},{"type":"Polygon","arcs":[[4407,-4001,-4391,-4394,-3122,4408,4409,4410]],"properties":{"id":"24660607","dp":2848,"de":7381}},{"type":"Polygon","arcs":[[4411,4412,-3116,4413,4414,-4411,-941,-934,-932]],"properties":{"id":"24660608","dp":463,"de":5260}},{"type":"Polygon","arcs":[[4415,4416,-4412,-931,-3119]],"properties":{"id":"24660609","dp":2641,"de":2531}},{"type":"Polygon","arcs":[[-3117,-4413,-4417,4417]],"properties":{"id":"24660610","dp":2666,"de":14393}},{"type":"Polygon","arcs":[[-4418,-4416,-3118]],"properties":{"id":"24660611","dp":16222,"de":7040}},{"type":"Polygon","arcs":[[4418,-1080,-3109,-2938,4419]],"properties":{"id":"24660613","dp":3786,"de":4147}},{"type":"Polygon","arcs":[[4420,-4419,4421]],"properties":{"id":"24660614","dp":12644,"de":8510}},{"type":"Polygon","arcs":[[-3460,4422,-4422,-4420]],"properties":{"id":"24660615","dp":27462,"de":0}},{"type":"Polygon","arcs":[[-4224,-2183,-3565,4423,-2061,4424,4425,-3113]],"properties":{"id":"24660788","dp":7484,"de":1600}},{"type":"Polygon","arcs":[[-2050,-2055,-3546,4426,-3564,-3471,-3566]],"properties":{"id":"24660794","dp":4439,"de":2791}},{"type":"Polygon","arcs":[[4427,-2040,-3567,4428]],"properties":{"id":"24660797","dp":5200,"de":1235}},{"type":"Polygon","arcs":[[4429,-4429,-3469,-2193]],"properties":{"id":"24660798","dp":6746,"de":0}},{"type":"Polygon","arcs":[[4430,4431,-4430,-2196]],"properties":{"id":"24660799","dp":7162,"de":0}},{"type":"Polygon","arcs":[[4432,-2041,-4428,-4432]],"properties":{"id":"24660800","dp":6923,"de":729}},{"type":"Polygon","arcs":[[4433,-2042,-4433,4434]],"properties":{"id":"24660801","dp":4749,"de":426}},{"type":"Polygon","arcs":[[4435,4436,-4435,-4431,-2195,4437]],"properties":{"id":"24660802","dp":4322,"de":481}},{"type":"Polygon","arcs":[[4438,-2043,-4434,-4437]],"properties":{"id":"24660803","dp":4712,"de":517}},{"type":"Polygon","arcs":[[4439,4440,-2026,-2036,-4439,-4436,4441]],"properties":{"id":"24660804","dp":745,"de":55}},{"type":"Polygon","arcs":[[4442,-4440,4443]],"properties":{"id":"24660805","dp":8888,"de":0}},{"type":"Polygon","arcs":[[-4444,-4442,-4438,-2194,4444]],"properties":{"id":"24660806","dp":4068,"de":648}},{"type":"Polygon","arcs":[[4445,4446,4447,-3530,-1940,-2027,-4441,-4443,-4445,-2189,-2203,-2208,4448]],"properties":{"id":"24660807","dp":3586,"de":559}},{"type":"Polygon","arcs":[[4449,-4446]],"properties":{"id":"24660808","dp":3833,"de":0}},{"type":"Polygon","arcs":[[-3532,4450,-4447,-4450,-4449,-2207,-2209,-2162,-2157]],"properties":{"id":"24660809","dp":5176,"de":880}},{"type":"Polygon","arcs":[[-4448,-4451,-3531]],"properties":{"id":"24660810","dp":4575,"de":0}},{"type":"Polygon","arcs":[[4451,4452,-1359]],"properties":{"id":"24661311","dp":32867,"de":0}},{"type":"Polygon","arcs":[[4453,4454,4455,-2852,-4453]],"properties":{"id":"24661312","dp":10645,"de":1794}},{"type":"Polygon","arcs":[[-2788,-2941,4456,4457,-2846,-4456,4458]],"properties":{"id":"24661313","dp":2863,"de":2616}},{"type":"Polygon","arcs":[[-4459,-4455,4459,-2794]],"properties":{"id":"24661314","dp":37951,"de":0}},{"type":"Polygon","arcs":[[4460,4461,-4460,-4454,-4452]],"properties":{"id":"24661315","dp":34814,"de":0}},{"type":"Polygon","arcs":[[-2784,-2790,-2795,-4462,4462]],"properties":{"id":"24661316","dp":22947,"de":4736}},{"type":"Polygon","arcs":[[-2948,-2782,-4463,-4461,-1357,-2798,-2823]],"properties":{"id":"24661317","dp":3828,"de":0}},{"type":"Polygon","arcs":[[-701,-720,-778,-2318]],"properties":{"id":"24660901","dp":10963,"de":0}},{"type":"Polygon","arcs":[[4463,4464,4465,4466,-755,-729,-727,4467]],"properties":{"id":"24660902","dp":5807,"de":6610}},{"type":"Polygon","arcs":[[4468,4469,-4464,4470]],"properties":{"id":"24660903","dp":12154,"de":0}},{"type":"Polygon","arcs":[[4471,4472,4473,-4465,-4470]],"properties":{"id":"24660904","dp":11378,"de":3372}},{"type":"Polygon","arcs":[[-4295,4474,4475,4476,4477]],"properties":{"id":"24660526","dp":10221,"de":968}},{"type":"Polygon","arcs":[[4478,4479,-4477,4480,4481]],"properties":{"id":"24660530","dp":11022,"de":936}},{"type":"Polygon","arcs":[[4482,4483,4484,-4479,4485,4486]],"properties":{"id":"24660533","dp":17837,"de":7939}},{"type":"Polygon","arcs":[[-3558,4487,4488,-4483,4489,4490,4491]],"properties":{"id":"24660536","dp":16698,"de":2226}},{"type":"Polygon","arcs":[[-4489,4492,4493,4494,-4484]],"properties":{"id":"24660537","dp":30743,"de":0}},{"type":"Polygon","arcs":[[4495,-4291,4496,-4494]],"properties":{"id":"24660538","dp":28089,"de":0}},{"type":"Polygon","arcs":[[-4497,-4296,-4478,-4480,-4485,-4495]],"properties":{"id":"24660539","dp":8857,"de":2124}},{"type":"Polygon","arcs":[[-4496,-4493,-4488,4497,4498,-4292]],"properties":{"id":"24660540","dp":9237,"de":5053}},{"type":"Polygon","arcs":[[-3557,4499,4500,4501,4502,4503,4504,-3965,-4498]],"properties":{"id":"24660541","dp":5923,"de":1763}},{"type":"Polygon","arcs":[[4505,-4503]],"properties":{"id":"24660542","dp":5433,"de":680}},{"type":"Polygon","arcs":[[4506,4507,4508,-4504,-4506,-4502]],"properties":{"id":"24660543","dp":6713,"de":0}},{"type":"Polygon","arcs":[[4509,4510,4511,-4508,4512]],"properties":{"id":"24660544","dp":6430,"de":0}},{"type":"Polygon","arcs":[[-4501,-3126,4513,4514,-4513,-4507]],"properties":{"id":"24660545","dp":7629,"de":1708}},{"type":"Polygon","arcs":[[4515,-3595,4516,-4515]],"properties":{"id":"24660546","dp":9042,"de":5953}},{"type":"Polygon","arcs":[[4517,-4516,-4514,-3125]],"properties":{"id":"24660547","dp":5863,"de":7096}},{"type":"Polygon","arcs":[[-4393,-4395,-3596,-4518,-3124]],"properties":{"id":"24660548","dp":9006,"de":1319}},{"type":"Polygon","arcs":[[-4403,-4405,-3138,4518,4519,-3590,-4398]],"properties":{"id":"24660550","dp":4107,"de":4395}},{"type":"Polygon","arcs":[[-3591,-4520,4520,4521]],"properties":{"id":"24660551","dp":19581,"de":0}},{"type":"Polygon","arcs":[[-4521,-4519,-3137,4522]],"properties":{"id":"24660552","dp":27578,"de":4882}},{"type":"Polygon","arcs":[[-4404,-4354,-4351,-4341,4523,-3135]],"properties":{"id":"24660555","dp":12644,"de":0}},{"type":"Polygon","arcs":[[-4524,-4345,4524,4525,4526,4527,-3136]],"properties":{"id":"24660556","dp":10140,"de":1358}},{"type":"Polygon","arcs":[[-4523,-4528,4528]],"properties":{"id":"24660557","dp":22720,"de":0}},{"type":"Polygon","arcs":[[-3592,-4522,-4529,-4527,4529,4530]],"properties":{"id":"24660558","dp":8979,"de":2312}},{"type":"Polygon","arcs":[[-4531,-3976,-3963,4531,-3593]],"properties":{"id":"24660560","dp":3900,"de":1036}},{"type":"Polygon","arcs":[[-3594,-4532,4532,-4510,-4517]],"properties":{"id":"24660561","dp":5533,"de":917}},{"type":"Polygon","arcs":[[-4533,-3962,4533,-4511]],"properties":{"id":"24660562","dp":12880,"de":0}},{"type":"Polygon","arcs":[[-4534,-3961,-3966,-4505,-4509,-4512]],"properties":{"id":"24660563","dp":4956,"de":1557}},{"type":"Polygon","arcs":[[4534,-4094,-4096,4535,4536]],"properties":{"id":"24660171","dp":10209,"de":0}},{"type":"Polygon","arcs":[[4537,-4536,-4095,-687,-678,4538]],"properties":{"id":"24660172","dp":12507,"de":0}},{"type":"Polygon","arcs":[[4539,-4539,-677,-660,4540]],"properties":{"id":"24660173","dp":10934,"de":0}},{"type":"Polygon","arcs":[[4541,4542,-4369,-4373,4543]],"properties":{"id":"24660586","dp":7473,"de":0}},{"type":"Polygon","arcs":[[4544,-4544,-4377,4545,4546,4547]],"properties":{"id":"24660587","dp":4432,"de":714}},{"type":"Polygon","arcs":[[4548,-3612,4549,4550,-4542,-4545,-3132]],"properties":{"id":"24660588","dp":3861,"de":0}},{"type":"Polygon","arcs":[[-3613,-4549,-3131]],"properties":{"id":"24660590","dp":4636,"de":0}},{"type":"Polygon","arcs":[[-3524,-3133,-4548,4551]],"properties":{"id":"24660594","dp":6326,"de":0}},{"type":"Polygon","arcs":[[-3599,-3525,-4552,-4547,4552,4553,-4002,-4408,-4415,4554]],"properties":{"id":"24660595","dp":3087,"de":2310}},{"type":"Polygon","arcs":[[-4546,-4376,-4407,-3998,4555,-4553]],"properties":{"id":"24660596","dp":9901,"de":0}},{"type":"Polygon","arcs":[[-4554,-4556,-3997]],"properties":{"id":"24660597","dp":12168,"de":1084}},{"type":"Polygon","arcs":[[4556,4557,4558,-3541,-3536]],"properties":{"id":"24661062","dp":17500,"de":6793}},{"type":"Polygon","arcs":[[4559,-3542,-4559]],"properties":{"id":"24661063","dp":31257,"de":0}},{"type":"Polygon","arcs":[[-3544,4560,4561,-2710,4562,4563]],"properties":{"id":"24661066","dp":7992,"de":2200}},{"type":"Polygon","arcs":[[4564,4565,-4561,-3543]],"properties":{"id":"24661067","dp":6868,"de":1124}},{"type":"Polygon","arcs":[[-4558,4566,4567,-4565,-4560]],"properties":{"id":"24661068","dp":7535,"de":2392}},{"type":"Polygon","arcs":[[-824,-1987,4568,-4562,-4566,-4568,4569]],"properties":{"id":"24661069","dp":6727,"de":4444}},{"type":"Polygon","arcs":[[-1986,-1983,-2715,-2711,-4569]],"properties":{"id":"24661070","dp":5254,"de":3708}},{"type":"Polygon","arcs":[[-1081,-4421,-4423,-2935,-2932,4570,4571]],"properties":{"id":"24660616","dp":10046,"de":1113}},{"type":"Polygon","arcs":[[-2929,4572,-4571]],"properties":{"id":"24660617","dp":18432,"de":0}},{"type":"Polygon","arcs":[[4573,4574,-4573,-2926,-2920]],"properties":{"id":"24660618","dp":10665,"de":6569}},{"type":"Polygon","arcs":[[-1077,-4572,-4575,4575]],"properties":{"id":"24660619","dp":10755,"de":2485}},{"type":"Polygon","arcs":[[4576,-1083,-1078,-4576,-4574,-2917,4577,4578,4579]],"properties":{"id":"24660620","dp":4651,"de":2549}},{"type":"Polygon","arcs":[[4580,-4580,4581]],"properties":{"id":"24660621","dp":22919,"de":0}},{"type":"Polygon","arcs":[[4582,-4581,4583,-3300]],"properties":{"id":"24660622","dp":17689,"de":0}},{"type":"Polygon","arcs":[[-4583,-3309,-694,-4577]],"properties":{"id":"24660623","dp":20567,"de":28723}},{"type":"Polygon","arcs":[[-2970,-2974,4584,4585]],"properties":{"id":"24661113","dp":17609,"de":3902}},{"type":"Polygon","arcs":[[4586,4587,4588,-4472,-4469,4589,4590,4591]],"properties":{"id":"24660905","dp":12702,"de":1621}},{"type":"Polygon","arcs":[[4592,4593,-4473,-4589,4594]],"properties":{"id":"24660906","dp":10153,"de":1282}},{"type":"Polygon","arcs":[[-4595,-4588,4595]],"properties":{"id":"24660907","dp":9488,"de":2555}},{"type":"Polygon","arcs":[[4596,4597,4598,-4593,-4596,-4587,4599,-4325,4600,4601,4602,-4467,4603]],"properties":{"id":"24660908","dp":6482,"de":1924}},{"type":"Polygon","arcs":[[-4599,4604,4605,-4604,-4466,-4474,-4594]],"properties":{"id":"24660909","dp":10358,"de":1793}},{"type":"Polygon","arcs":[[4606,-4605,-4598]],"properties":{"id":"24660910","dp":13546,"de":0}},{"type":"Polygon","arcs":[[-4607,-4597,-4606]],"properties":{"id":"24660911","dp":13955,"de":0}},{"type":"Polygon","arcs":[[-4324,4607,-4601]],"properties":{"id":"24660912","dp":12570,"de":2712}},{"type":"Polygon","arcs":[[-2631,4608,4609,4610,-4602,-4608]],"properties":{"id":"24660913","dp":6696,"de":10600}},{"type":"Polygon","arcs":[[-4611,4611,-756,-4603]],"properties":{"id":"24660914","dp":6847,"de":4130}},{"type":"Polygon","arcs":[[-4610,4612,4613,4614,4615,4616,-757,-4612]],"properties":{"id":"24660915","dp":6709,"de":1865}},{"type":"Polygon","arcs":[[4617,-758,-4617]],"properties":{"id":"24660916","dp":6732,"de":911}},{"type":"Polygon","arcs":[[-4616,4618,4619,4620,4621,4622,4623,4624,-759,-4618]],"properties":{"id":"24660917","dp":937,"de":2228}},{"type":"Polygon","arcs":[[-4615,4625,-4619]],"properties":{"id":"24660918","dp":7993,"de":1445}},{"type":"Polygon","arcs":[[4626,-4620,-4626,-4614]],"properties":{"id":"24660919","dp":3671,"de":2519}},{"type":"Polygon","arcs":[[-4613,-4609,-2630,-2469,4627,-4621,-4627]],"properties":{"id":"24660920","dp":2294,"de":2096}},{"type":"Polygon","arcs":[[-4628,-2475,4628,4629,4630,-4622]],"properties":{"id":"24660921","dp":4868,"de":0}},{"type":"Polygon","arcs":[[4631,-4630]],"properties":{"id":"24660922","dp":7716,"de":0}},{"type":"Polygon","arcs":[[-4631,-4632,-4629,-2474,4632,-4279,4633,4634,-4623]],"properties":{"id":"24660923","dp":3032,"de":1617}},{"type":"Polygon","arcs":[[-2473,-2468,-4286,-4284,-4274,4635,-4280,-4633]],"properties":{"id":"24660924","dp":2561,"de":291}},{"type":"Polygon","arcs":[[-4281,-4636]],"properties":{"id":"24660925","dp":19018,"de":1380}},{"type":"Polygon","arcs":[[-643,4636,-4537,-4538,-4540,4637]],"properties":{"id":"24660174","dp":9953,"de":0}},{"type":"Polygon","arcs":[[-648,-644,-4638,-4541,-659,-650]],"properties":{"id":"24660175","dp":7087,"de":0}},{"type":"Polygon","arcs":[[-4535,-4637,-642,-629,4638,-4090]],"properties":{"id":"24660176","dp":2965,"de":1467}},{"type":"Polygon","arcs":[[-4639,-628,-622,4639,-4091]],"properties":{"id":"24660177","dp":2979,"de":0}},{"type":"Polygon","arcs":[[-1933,-1421,4640,-4089,-4092,-4640]],"properties":{"id":"24660178","dp":2868,"de":1465}},{"type":"Polygon","arcs":[[4641,4642,4643,-4083,-4087,-4641]],"properties":{"id":"24660179","dp":3765,"de":321}},{"type":"Polygon","arcs":[[-4642,-1420,-1923,4644]],"properties":{"id":"24660180","dp":4749,"de":1354}},{"type":"Polygon","arcs":[[-4643,-4645,-1922,-1918,4645,4646,4647]],"properties":{"id":"24660181","dp":12371,"de":2291}},{"type":"Polygon","arcs":[[-1917,-1412,4648,-4646]],"properties":{"id":"24660182","dp":22071,"de":0}},{"type":"Polygon","arcs":[[4649,-4647,-4649,-1417,4650,4651,-4078]],"properties":{"id":"24660183","dp":7839,"de":1737}},{"type":"Polygon","arcs":[[-4648,-4650,-4082,-4084,-4644]],"properties":{"id":"24660184","dp":8692,"de":5130}},{"type":"Polygon","arcs":[[-4651,-1416,4652,4653]],"properties":{"id":"24660185","dp":10135,"de":0}},{"type":"Polygon","arcs":[[-4079,-4652,-4654,4654,4655,4656,-690]],"properties":{"id":"24660186","dp":12608,"de":1440}},{"type":"Polygon","arcs":[[-1415,-1411,-1402,-4655,-4653]],"properties":{"id":"24660187","dp":9391,"de":0}},{"type":"Polygon","arcs":[[-4656,-1407,4657,4658]],"properties":{"id":"24660188","dp":12819,"de":1101}},{"type":"Polygon","arcs":[[4659,-4658,-1406,4660]],"properties":{"id":"24660189","dp":23013,"de":0}},{"type":"Polygon","arcs":[[-691,-4657,-4659,-4660,-680,-686]],"properties":{"id":"24660190","dp":11042,"de":2055}},{"type":"Polygon","arcs":[[-681,-4661,-1394,4661]],"properties":{"id":"24660191","dp":20078,"de":0}},{"type":"Polygon","arcs":[[-4662,-1398,4662,-682]],"properties":{"id":"24660192","dp":16729,"de":0}},{"type":"Polygon","arcs":[[4663,-4663,-1397,4664,-1399,4665]],"properties":{"id":"24660193","dp":13200,"de":0}},{"type":"Polygon","arcs":[[-211,-3313,-3304,-3297,4666,-3463]],"properties":{"id":"24660659","dp":11496,"de":852}},{"type":"Polygon","arcs":[[-4667,-3303,4667,-3001,-3464]],"properties":{"id":"24660660","dp":12273,"de":1986}},{"type":"Polygon","arcs":[[4668,-2998,-4668,4669]],"properties":{"id":"24660661","dp":28965,"de":2681}},{"type":"Polygon","arcs":[[4670,-2994,-2997,-4669]],"properties":{"id":"24660662","dp":8566,"de":0}},{"type":"Polygon","arcs":[[4671,-4671,-4670,-3302]],"properties":{"id":"24660663","dp":30346,"de":2475}},{"type":"Polygon","arcs":[[-3301,-4584,4672,-2992,-4672]],"properties":{"id":"24660664","dp":30088,"de":0}},{"type":"Polygon","arcs":[[-4673,-4582,-4579,4673]],"properties":{"id":"24660665","dp":26808,"de":0}},{"type":"Polygon","arcs":[[4674,-2954,-2993,-4674]],"properties":{"id":"24660666","dp":34933,"de":2202}},{"type":"Polygon","arcs":[[-4578,-2916,-2951,-4675]],"properties":{"id":"24660667","dp":23824,"de":2534}},{"type":"Polygon","arcs":[[4675,4676,4677,4678]],"properties":{"id":"24663101","dp":2883,"de":305}},{"type":"Polygon","arcs":[[-3449,4679,-3447,4680,4681,4682,4683,4684,4685]],"properties":{"id":"24662988","dp":1403,"de":926}},{"type":"Polygon","arcs":[[4686,4687,4688,4689,4690,4691]],"properties":{"id":"24661358","dp":14773,"de":10933}},{"type":"Polygon","arcs":[[4692,4693,4694,4695,4696,4697,4698]],"properties":{"id":"24662589","dp":2389,"de":1641}},{"type":"Polygon","arcs":[[4699,-4698,4700,4701,4702]],"properties":{"id":"24662590","dp":7384,"de":736}},{"type":"Polygon","arcs":[[4703,4704,4705,-4699,-4700]],"properties":{"id":"24662591","dp":4921,"de":0}},{"type":"Polygon","arcs":[[4706,-4704,-4703,4707,4708]],"properties":{"id":"24662592","dp":7996,"de":0}},{"type":"Polygon","arcs":[[4709,-4692,4710,4711,4712,4713]],"properties":{"id":"24661359","dp":22229,"de":8188}},{"type":"Polygon","arcs":[[4714,-4712,4715,4716]],"properties":{"id":"24661360","dp":20497,"de":3167}},{"type":"Polygon","arcs":[[-4711,-4691,4717,-4716]],"properties":{"id":"24661361","dp":16989,"de":5510}},{"type":"Polygon","arcs":[[-4717,-4718,-4690,4718,4719,4720,4721]],"properties":{"id":"24661362","dp":6549,"de":2243}},{"type":"Polygon","arcs":[[4722,4723,-4719,4724]],"properties":{"id":"24661363","dp":10041,"de":5463}},{"type":"Polygon","arcs":[[4725,-4715,-4722,4726,4727,4728,4729,4730]],"properties":{"id":"24661364","dp":5086,"de":5761}},{"type":"Polygon","arcs":[[4731,4732,-4731]],"properties":{"id":"24661365","dp":28461,"de":0}},{"type":"Polygon","arcs":[[-4730,4733,4734,-4732]],"properties":{"id":"24661366","dp":31026,"de":2901}},{"type":"Polygon","arcs":[[4735,4736,-4734,-4729,4737,4738,4739]],"properties":{"id":"24661367","dp":18933,"de":3523}},{"type":"Polygon","arcs":[[-4740,4740,4741,4742]],"properties":{"id":"24661368","dp":19522,"de":4020}},{"type":"Polygon","arcs":[[4743,-4742,4744,4745]],"properties":{"id":"24661369","dp":17923,"de":4824}},{"type":"Polygon","arcs":[[4746,4747,-4746]],"properties":{"id":"24661370","dp":19392,"de":4153}},{"type":"Polygon","arcs":[[4748,-4747,-4745,-4741,-4739,4749,4750,4751,4752]],"properties":{"id":"24661371","dp":5503,"de":3788}},{"type":"Polygon","arcs":[[4753,-4749,4754,4755]],"properties":{"id":"24661372","dp":16048,"de":3024}},{"type":"Polygon","arcs":[[-4753,4756,4757,-4755]],"properties":{"id":"24661373","dp":16679,"de":1778}},{"type":"Polygon","arcs":[[-4752,4758,4759,-4757]],"properties":{"id":"24661374","dp":11866,"de":6888}},{"type":"Polygon","arcs":[[4760,4761,-4759,-4751,4762,4763,4764,4765]],"properties":{"id":"24661375","dp":4338,"de":21860}},{"type":"Polygon","arcs":[[4766,-4762,4767,4768]],"properties":{"id":"24661376","dp":11936,"de":55212}},{"type":"Polygon","arcs":[[-4760,-4767,4769,4770,4771]],"properties":{"id":"24661377","dp":13010,"de":13210}},{"type":"Polygon","arcs":[[-4758,-4772,4772,4773]],"properties":{"id":"24661378","dp":16306,"de":2552}},{"type":"Polygon","arcs":[[4774,-4756,-4774,4775]],"properties":{"id":"24661379","dp":15426,"de":3963}},{"type":"Polygon","arcs":[[4776,4777,4778,-4775,4779]],"properties":{"id":"24661380","dp":14057,"de":4472}},{"type":"Polygon","arcs":[[4780,4781,-4778,4782]],"properties":{"id":"24661381","dp":23529,"de":3287}},{"type":"Polygon","arcs":[[4783,-4781,4784,4785]],"properties":{"id":"24661382","dp":18792,"de":12640}},{"type":"Polygon","arcs":[[-1212,-3704,-3706,4786,4787,4788,4789,4790,4791]],"properties":{"id":"24661858","dp":4735,"de":20919}},{"type":"Polygon","arcs":[[4792,-4791,4793,4794,4795,4796,4797,4798]],"properties":{"id":"24661859","dp":8760,"de":65700}},{"type":"Polygon","arcs":[[4799,4800,-4795]],"properties":{"id":"24661860","dp":41379,"de":12068}},{"type":"Polygon","arcs":[[-3674,-4798,4801,4802,4803,-3679]],"properties":{"id":"24661861","dp":13040,"de":9684}},{"type":"Polygon","arcs":[[4804,4805,4806,-4803]],"properties":{"id":"24661862","dp":17269,"de":3212}},{"type":"Polygon","arcs":[[-4807,4807,4808,4809,4810]],"properties":{"id":"24661863","dp":17048,"de":2108}},{"type":"Polygon","arcs":[[-4804,-4811,4811,4812]],"properties":{"id":"24661864","dp":15515,"de":8520}},{"type":"Polygon","arcs":[[4813,-4812,-4810,4814,4815,4816,4817]],"properties":{"id":"24661865","dp":7883,"de":25525}},{"type":"Polygon","arcs":[[-3680,-4813,-4814,4818,-3676]],"properties":{"id":"24661866","dp":10557,"de":5268}},{"type":"Polygon","arcs":[[4819,4820,-4705,-4707,4821]],"properties":{"id":"24662593","dp":6048,"de":0}},{"type":"Polygon","arcs":[[4822,4823,4824,-4822]],"properties":{"id":"24662594","dp":6442,"de":0}},{"type":"Polygon","arcs":[[-4823,-4709,4825,-3397]],"properties":{"id":"24662595","dp":7840,"de":4466}},{"type":"Polygon","arcs":[[-3399,4826,4827]],"properties":{"id":"24662598","dp":8152,"de":0}},{"type":"Polygon","arcs":[[4828,4829,-3395,-4828,4830,4831]],"properties":{"id":"24662599","dp":9471,"de":0}},{"type":"Polygon","arcs":[[4832,-4829,4833]],"properties":{"id":"24662600","dp":12691,"de":0}},{"type":"Polygon","arcs":[[4834,-3794,4835,4836,4837,-4834,-4832,4838]],"properties":{"id":"24662601","dp":2907,"de":6314}},{"type":"Polygon","arcs":[[4839,-4824,-3396,-4830,-4833,-4838]],"properties":{"id":"24662602","dp":4897,"de":0}},{"type":"Polygon","arcs":[[4840,4841,-4840,-4837]],"properties":{"id":"24662603","dp":4293,"de":3968}},{"type":"Polygon","arcs":[[-4836,4842,4843,4844,4845,4846,4847,-4841]],"properties":{"id":"24662604","dp":4586,"de":0}},{"type":"Polygon","arcs":[[-4165,4848,-4843,-3793,-4162]],"properties":{"id":"24662605","dp":13399,"de":2272}},{"type":"Polygon","arcs":[[4849,-4844,-4849,-4164]],"properties":{"id":"24662606","dp":17614,"de":0}},{"type":"Polygon","arcs":[[4850,4851,4852,-4850,-4168]],"properties":{"id":"24662607","dp":10490,"de":5313}},{"type":"Polygon","arcs":[[4853,4854,-4851,-4171]],"properties":{"id":"24662608","dp":13543,"de":6526}},{"type":"Polygon","arcs":[[-4854,-4175,4855]],"properties":{"id":"24662609","dp":14225,"de":0}},{"type":"Polygon","arcs":[[-4210,-4213,-510,-4852,-4855,-4856,-4174,-4178]],"properties":{"id":"24662610","dp":9243,"de":6914}},{"type":"Polygon","arcs":[[-521,4856,-4845,-4853,-518]],"properties":{"id":"24662611","dp":10550,"de":13188}},{"type":"Polygon","arcs":[[-4857,4857,-4846]],"properties":{"id":"24662612","dp":11108,"de":10277}},{"type":"Polygon","arcs":[[-520,-526,4858,-4847,-4858]],"properties":{"id":"24662613","dp":9747,"de":2135}},{"type":"Polygon","arcs":[[4859,4860,4861,4862,4863,4864]],"properties":{"id":"24663010","dp":2137,"de":1450}},{"type":"Polygon","arcs":[[-4862,4865]],"properties":{"id":"24663011","dp":4900,"de":330}},{"type":"Polygon","arcs":[[4866,-4713,-4726,-4733,4867,4868]],"properties":{"id":"24661394","dp":27470,"de":7312}},{"type":"Polygon","arcs":[[4869,-4687,-4710,4870,4871]],"properties":{"id":"24661395","dp":8754,"de":3679}},{"type":"Polygon","arcs":[[4872,4873,-4870,4874]],"properties":{"id":"24661396","dp":9097,"de":1299}},{"type":"Polygon","arcs":[[-4873,4875,4876,4877,4878,4879]],"properties":{"id":"24661397","dp":3270,"de":1639}},{"type":"Polygon","arcs":[[4880,4881,4882,-4880]],"properties":{"id":"24661398","dp":8016,"de":901}},{"type":"Polygon","arcs":[[4883,4884]],"properties":{"id":"24662616","dp":9001,"de":0}},{"type":"Polygon","arcs":[[-4885,4885,4886,-4820,4887]],"properties":{"id":"24662617","dp":10181,"de":726}},{"type":"Polygon","arcs":[[-4887,-4693,-4706,-4821]],"properties":{"id":"24662618","dp":4851,"de":652}},{"type":"Polygon","arcs":[[4888,4889,4890,4891,4892,-3795,-4835,4893]],"properties":{"id":"24662619","dp":5920,"de":3944}},{"type":"Polygon","arcs":[[4894,-4890]],"properties":{"id":"24662620","dp":19502,"de":0}},{"type":"Polygon","arcs":[[4895,-4891,-4895,4896,-4110,-4114]],"properties":{"id":"24662621","dp":10958,"de":798}},{"type":"Polygon","arcs":[[-4897,-4889,4897,4898,-4107]],"properties":{"id":"24662622","dp":17121,"de":2424}},{"type":"Polygon","arcs":[[-4898,4899,4900,4901]],"properties":{"id":"24662623","dp":13792,"de":1458}},{"type":"Polygon","arcs":[[-4899,-4902,-4266,-4273,-4103]],"properties":{"id":"24662624","dp":13073,"de":2015}},{"type":"Polygon","arcs":[[-4901,4902,-4267]],"properties":{"id":"24662625","dp":16887,"de":0}},{"type":"Polygon","arcs":[[-4265,-4903,4903,4904,-4254,-4261]],"properties":{"id":"24662626","dp":11488,"de":0}},{"type":"Polygon","arcs":[[-4894,4905,-4904,-4900]],"properties":{"id":"24662627","dp":11148,"de":2153}},{"type":"Polygon","arcs":[[-1894,-4249,-4255,-4905,-4906,-4839,-4831,-4827,-3398,4906,4907,-1858,-1862,-1864,-1889]],"properties":{"id":"24662628","dp":472,"de":1388}},{"type":"Polygon","arcs":[[4908,4909,-4907,-4826,-4708,-4702,4910]],"properties":{"id":"24662629","dp":1060,"de":115}},{"type":"Polygon","arcs":[[-4910,4911,4912,4913,-4908]],"properties":{"id":"24662630","dp":11777,"de":1204}},{"type":"Polygon","arcs":[[-4914,4914,4915,4916,-1859]],"properties":{"id":"24662631","dp":15867,"de":1589}},{"type":"Polygon","arcs":[[-4917,4917,-1845,-1856]],"properties":{"id":"24662632","dp":15483,"de":2995}},{"type":"Polygon","arcs":[[4918,4919,-1846,-4918]],"properties":{"id":"24662633","dp":17894,"de":1372}},{"type":"Polygon","arcs":[[-4919,-4916,4920,4921]],"properties":{"id":"24662634","dp":20934,"de":0}},{"type":"Polygon","arcs":[[4922,4923,-4921,-4915,-4913]],"properties":{"id":"24662635","dp":11686,"de":2710}},{"type":"Polygon","arcs":[[4924,-4923,-4912,4925]],"properties":{"id":"24662636","dp":24550,"de":0}},{"type":"Polygon","arcs":[[4926,-4926,-4909]],"properties":{"id":"24662637","dp":23988,"de":0}},{"type":"Polygon","arcs":[[4927,4928,4929,4930,4931]],"properties":{"id":"24662638","dp":10316,"de":1399}},{"type":"Polygon","arcs":[[4932,4933,4934,-4929,4935]],"properties":{"id":"24662639","dp":9787,"de":1415}},{"type":"Polygon","arcs":[[4936,-4933,4937]],"properties":{"id":"24662640","dp":12450,"de":1214}},{"type":"Polygon","arcs":[[4938,4939,-4934,-4937]],"properties":{"id":"24662641","dp":9096,"de":0}},{"type":"Polygon","arcs":[[4940,4941,4942,4943,4944,4945,4946,4947]],"properties":{"id":"24663030","dp":2966,"de":382}},{"type":"Polygon","arcs":[[4948,4949,-4946,4950,4951,4952]],"properties":{"id":"24663031","dp":3616,"de":0}},{"type":"Polygon","arcs":[[4953,-3083,-3162,4954]],"properties":{"id":"24663075","dp":674,"de":79}},{"type":"Polygon","arcs":[[-3103,-2982,4955,-3160]],"properties":{"id":"24663076","dp":1076,"de":101}},{"type":"MultiPolygon","arcs":[[[4956,4957,4958,4959,4960,4961,4962]],[[4963,4964,4965,4966]]],"properties":{"id":"24663077","dp":282,"de":62}},{"type":"Polygon","arcs":[[4967,4968,4969]],"properties":{"id":"24663079","dp":7864,"de":0}},{"type":"Polygon","arcs":[[4970,4971,-4970,4972,4973,4974]],"properties":{"id":"24663080","dp":5606,"de":0}},{"type":"Polygon","arcs":[[4975,-4975,4976]],"properties":{"id":"24663081","dp":5152,"de":0}},{"type":"Polygon","arcs":[[4977,-4977,-4974,4978,4979,4980]],"properties":{"id":"24663082","dp":4933,"de":0}},{"type":"Polygon","arcs":[[4981,4982,4983,-4881,-4879,4984,4985,4986]],"properties":{"id":"24661399","dp":2976,"de":541}},{"type":"Polygon","arcs":[[4987,4988,4989,4990,-4984]],"properties":{"id":"24661400","dp":3899,"de":708}},{"type":"Polygon","arcs":[[-1343,-1346,4991,-4982,4992,-1339]],"properties":{"id":"24661401","dp":5107,"de":3163}},{"type":"Polygon","arcs":[[4993,-233,4994,-4988,-4983,-4992]],"properties":{"id":"24661402","dp":12976,"de":5402}},{"type":"Polygon","arcs":[[-4994,-1347,-3461,-234]],"properties":{"id":"24661405","dp":31666,"de":1570}},{"type":"Polygon","arcs":[[-1333,-1340,-4993,-4987,4995,4996,4997]],"properties":{"id":"24661407","dp":9731,"de":1788}},{"type":"Polygon","arcs":[[-4986,4998,-4996]],"properties":{"id":"24661408","dp":22746,"de":2331}},{"type":"Polygon","arcs":[[-1329,4999,-4997,-4999,-4985,-4878,5000,5001]],"properties":{"id":"24661409","dp":2728,"de":4005}},{"type":"Polygon","arcs":[[-4998,-5000,-1328]],"properties":{"id":"24661410","dp":24615,"de":5384}},{"type":"Polygon","arcs":[[5002,-5001,-4877,5003,5004]],"properties":{"id":"24661411","dp":3817,"de":566}},{"type":"Polygon","arcs":[[5005,-1330,-5002,-5003,5006,5007]],"properties":{"id":"24661412","dp":254,"de":260}},{"type":"Polygon","arcs":[[-5007,-5005,5008,5009,5010,5011,5012,5013]],"properties":{"id":"24661413","dp":3642,"de":721}},{"type":"Polygon","arcs":[[5014,-5011,5015,5016]],"properties":{"id":"24661414","dp":21659,"de":3526}},{"type":"Polygon","arcs":[[-5012,-5015,5017,5018,5019]],"properties":{"id":"24661415","dp":16468,"de":1984}},{"type":"Polygon","arcs":[[-5019,5020,5021,5022,5023,5024]],"properties":{"id":"24661416","dp":16285,"de":3650}},{"type":"Polygon","arcs":[[5025,5026,5027,-3173]],"properties":{"id":"24661893","dp":17329,"de":3125}},{"type":"Polygon","arcs":[[-5026,5028,5029,5030,5031,5032,5033]],"properties":{"id":"24661894","dp":5661,"de":8260}},{"type":"Polygon","arcs":[[-3172,5034,5035,5036,5037,-5029]],"properties":{"id":"24661895","dp":16720,"de":5600}},{"type":"Polygon","arcs":[[5038,-5035,-3171]],"properties":{"id":"24661896","dp":20169,"de":0}},{"type":"Polygon","arcs":[[-3170,5039,5040,-5036,-5039]],"properties":{"id":"24661897","dp":16994,"de":1554}},{"type":"Polygon","arcs":[[5041,5042,-5040,-3169]],"properties":{"id":"24661898","dp":14101,"de":6568}},{"type":"Polygon","arcs":[[5043,5044,-5042,-3168]],"properties":{"id":"24661899","dp":23580,"de":5626}},{"type":"Polygon","arcs":[[5045,5046,5047,5048,-5045]],"properties":{"id":"24661900","dp":15261,"de":8126}},{"type":"Polygon","arcs":[[-5049,5049,5050,-5043]],"properties":{"id":"24661901","dp":13506,"de":6944}},{"type":"Polygon","arcs":[[5051,5052,5053,5054,5055]],"properties":{"id":"24663084","dp":3793,"de":0}},{"type":"Polygon","arcs":[[-5054,5056,-4963,5057,-4965,5058]],"properties":{"id":"24663085","dp":3675,"de":0}},{"type":"Polygon","arcs":[[5059,-4980,5060,5061,5062,-4957,-5057]],"properties":{"id":"24663086","dp":5384,"de":0}},{"type":"Polygon","arcs":[[5063,5064,5065,5066]],"properties":{"id":"24661426","dp":21391,"de":2173}},{"type":"Polygon","arcs":[[5067,5068,5069,5070,-5065]],"properties":{"id":"24661427","dp":12930,"de":8255}},{"type":"Polygon","arcs":[[5071,5072,-5070,5073]],"properties":{"id":"24661428","dp":16936,"de":8274}},{"type":"Polygon","arcs":[[5074,-4773,-4771,5075,-5073]],"properties":{"id":"24661429","dp":10381,"de":14088}},{"type":"Polygon","arcs":[[5076,5077,-4780,-4776,-5075]],"properties":{"id":"24661430","dp":12173,"de":6956}},{"type":"Polygon","arcs":[[5078,5079,-5022,5080,-4785,-4783,-4777,-5078]],"properties":{"id":"24661431","dp":11167,"de":10583}},{"type":"Polygon","arcs":[[5081,5082,-5079,-5077,-5072,5083]],"properties":{"id":"24661432","dp":17155,"de":2245}},{"type":"Polygon","arcs":[[-5076,-4770,-4769,5084,5085,-5071]],"properties":{"id":"24661433","dp":10080,"de":7329}},{"type":"Polygon","arcs":[[-5085,-4768,-4761,5086,5087,5088]],"properties":{"id":"24661434","dp":12990,"de":11934}},{"type":"Polygon","arcs":[[-5086,-5089,5089,5090,5091,-5066]],"properties":{"id":"24661435","dp":14108,"de":11512}},{"type":"Polygon","arcs":[[-5088,5092,5093,-5090]],"properties":{"id":"24661436","dp":20194,"de":3721}},{"type":"Polygon","arcs":[[-5094,5094,5095,5096]],"properties":{"id":"24661437","dp":16964,"de":8333}},{"type":"Polygon","arcs":[[-5091,-5097,5097,5098,5099]],"properties":{"id":"24661438","dp":15305,"de":6845}},{"type":"Polygon","arcs":[[5100,-5098,5101,5102,5103]],"properties":{"id":"24661439","dp":14174,"de":7119}},{"type":"Polygon","arcs":[[-5096,5104,-5102]],"properties":{"id":"24661440","dp":17272,"de":3409}},{"type":"Polygon","arcs":[[5105,-5103,-5105,5106,5107,5108,5109]],"properties":{"id":"24661441","dp":8472,"de":1280}},{"type":"Polygon","arcs":[[5110,-4765,5111,-5107,-5095]],"properties":{"id":"24661442","dp":9494,"de":2853}},{"type":"Polygon","arcs":[[-5087,-4766,-5111,-5093]],"properties":{"id":"24661443","dp":19421,"de":2210}},{"type":"Polygon","arcs":[[5112,5113,-5112,5114,5115,5116,5117]],"properties":{"id":"24661444","dp":15638,"de":2543}},{"type":"Polygon","arcs":[[-5113,5118,5119]],"properties":{"id":"24661445","dp":13980,"de":3618}},{"type":"Polygon","arcs":[[-5118,5120,5121,-5119]],"properties":{"id":"24661446","dp":14249,"de":2544}},{"type":"Polygon","arcs":[[-5122,5122,5123,5124,5125]],"properties":{"id":"24661447","dp":14377,"de":3228}},{"type":"Polygon","arcs":[[5126,-1257,5127,5128,-3671]],"properties":{"id":"24661925","dp":10527,"de":8822}},{"type":"Polygon","arcs":[[5129,5130,5131,-3672,-5129]],"properties":{"id":"24661926","dp":8836,"de":5325}},{"type":"Polygon","arcs":[[-1263,5132,-5130,-5128]],"properties":{"id":"24661927","dp":9599,"de":8166}},{"type":"Polygon","arcs":[[-5131,-5133,-1266,-4792,-4793,5133]],"properties":{"id":"24661928","dp":7821,"de":17913}},{"type":"Polygon","arcs":[[-5134,-4799,-3673,-5132]],"properties":{"id":"24661929","dp":15569,"de":24683}},{"type":"Polygon","arcs":[[5134,-3695,-3702,5135]],"properties":{"id":"24661936","dp":14148,"de":8703}},{"type":"Polygon","arcs":[[-3718,-3710,5136,-5136,-3701,-1211]],"properties":{"id":"24661937","dp":11421,"de":7106}},{"type":"Polygon","arcs":[[5137,5138,5139,5140,5141,5142]],"properties":{"id":"24663123","dp":3014,"de":274}},{"type":"Polygon","arcs":[[-5143,5143,5144,5145]],"properties":{"id":"24663124","dp":426,"de":1169}},{"type":"Polygon","arcs":[[5146,5147,-5144,-5142,5148,-4961]],"properties":{"id":"24663125","dp":72,"de":62}},{"type":"Polygon","arcs":[[5149,5150]],"properties":{"id":"24663126","dp":3847,"de":308}},{"type":"Polygon","arcs":[[-5150,5151]],"properties":{"id":"24663127","dp":3074,"de":0}},{"type":"Polygon","arcs":[[-4680,-3448]],"properties":{"id":"24662989","dp":4683,"de":496}},{"type":"Polygon","arcs":[[5152,5153,5154,-3443]],"properties":{"id":"24662992","dp":8168,"de":0}},{"type":"Polygon","arcs":[[5155,-4681,-3446,5156]],"properties":{"id":"24662993","dp":7857,"de":2639}},{"type":"Polygon","arcs":[[-3445,5157,5158,5159,5160,5161,5162,-5157]],"properties":{"id":"24662994","dp":3402,"de":728}},{"type":"Polygon","arcs":[[5163,5164,5165,5166,5167]],"properties":{"id":"24663088","dp":3617,"de":225}},{"type":"Polygon","arcs":[[-5166,5168]],"properties":{"id":"24663089","dp":4119,"de":0}},{"type":"Polygon","arcs":[[5169,5170,5171,5172,5173,5174]],"properties":{"id":"24663090","dp":2782,"de":211}},{"type":"Polygon","arcs":[[-5175,5175,5176]],"properties":{"id":"24663091","dp":2875,"de":0}},{"type":"Polygon","arcs":[[-5170,-5177,5177]],"properties":{"id":"24663092","dp":3252,"de":0}},{"type":"Polygon","arcs":[[5178,5179]],"properties":{"id":"24663094","dp":3788,"de":0}},{"type":"Polygon","arcs":[[5180,5181,-5180,5182,5183,5184,5185]],"properties":{"id":"24663095","dp":2894,"de":362}},{"type":"Polygon","arcs":[[5186,5187,5188,5189,5190,5191,5192]],"properties":{"id":"24663096","dp":1854,"de":332}},{"type":"Polygon","arcs":[[5193,5194,5195,-5193,5196,5197]],"properties":{"id":"24663097","dp":2731,"de":255}},{"type":"Polygon","arcs":[[5198,-5187,-5196]],"properties":{"id":"24663098","dp":2882,"de":0}},{"type":"Polygon","arcs":[[-5195,5199,5200,5201,5202,5203,-5188,-5199]],"properties":{"id":"24663099","dp":804,"de":140}},{"type":"Polygon","arcs":[[5204,-5200,-5194,5205,-4677]],"properties":{"id":"24663100","dp":3489,"de":0}},{"type":"Polygon","arcs":[[5206,5207,5208,5209,5210,5211]],"properties":{"id":"24663369","dp":10290,"de":38854}},{"type":"Polygon","arcs":[[-4678,-5206,-5198,5212,5213,5214]],"properties":{"id":"24663102","dp":2151,"de":413}},{"type":"Polygon","arcs":[[5215,5216,5217,5218,5219,5220,5221]],"properties":{"id":"24663103","dp":1368,"de":279}},{"type":"Polygon","arcs":[[5222,-5220,5223]],"properties":{"id":"24663104","dp":2245,"de":0}},{"type":"Polygon","arcs":[[5224,-5221,-5223,5225]],"properties":{"id":"24663105","dp":2219,"de":179}},{"type":"MultiPolygon","arcs":[[[5226,-5225,5227,5228,5229,5230]],[[5231,5232,5233,5234,5235,5236,5237]]],"properties":{"id":"24663106","dp":1239,"de":485}},{"type":"Polygon","arcs":[[5238,5239,5240,5241,-5222,-5227,5242]],"properties":{"id":"24663107","dp":1383,"de":479}},{"type":"Polygon","arcs":[[5243,5244,-5216,-5242]],"properties":{"id":"24663108","dp":1929,"de":0}},{"type":"Polygon","arcs":[[-5244,-5241,5245,5246,5247]],"properties":{"id":"24663109","dp":1943,"de":163}},{"type":"Polygon","arcs":[[-5245,-5248,5248,-5202,-5217]],"properties":{"id":"24663110","dp":1462,"de":139}},{"type":"Polygon","arcs":[[-5247,5249,5250,5251,5252,5253,5254,-5203,-5249]],"properties":{"id":"24663111","dp":206,"de":1307}},{"type":"Polygon","arcs":[[5255,5256,5257,-5251]],"properties":{"id":"24663112","dp":1319,"de":168}},{"type":"Polygon","arcs":[[5258,-3498,5259]],"properties":{"id":"24663139","dp":8410,"de":0}},{"type":"Polygon","arcs":[[-5156,-5163,5260,-4682]],"properties":{"id":"24662995","dp":2103,"de":574}},{"type":"Polygon","arcs":[[5261,5262,5263,-5261]],"properties":{"id":"24662996","dp":2752,"de":0}},{"type":"Polygon","arcs":[[5264,-5262,-5162,5265,5266]],"properties":{"id":"24662997","dp":11611,"de":828}},{"type":"Polygon","arcs":[[-5266,-5161,5267,5268,5269,5270,5271,5272]],"properties":{"id":"24662998","dp":262,"de":0}},{"type":"Polygon","arcs":[[-5269,5273,5274]],"properties":{"id":"24662999","dp":6982,"de":0}},{"type":"Polygon","arcs":[[5275,5276,5277,5278,-5271]],"properties":{"id":"24663000","dp":3577,"de":0}},{"type":"Polygon","arcs":[[5279,5280,5281,5282,-5277]],"properties":{"id":"24663001","dp":2883,"de":0}},{"type":"Polygon","arcs":[[5283,5284,5285,5286,5287,-5272,-5279]],"properties":{"id":"24663002","dp":3145,"de":589}},{"type":"Polygon","arcs":[[-5267,-5273,-5288,5288,5289,5290,5291,5292,-4865,5293]],"properties":{"id":"24663003","dp":2185,"de":331}},{"type":"Polygon","arcs":[[5294,5295,5296,-5291]],"properties":{"id":"24663004","dp":2748,"de":0}},{"type":"Polygon","arcs":[[5297,5298,5299,-5296]],"properties":{"id":"24663005","dp":2154,"de":436}},{"type":"Polygon","arcs":[[-5295,-5290,5300,5301,5302,-5298]],"properties":{"id":"24663006","dp":2700,"de":513}},{"type":"Polygon","arcs":[[-5299,-5303,5303,5304,5305]],"properties":{"id":"24663007","dp":2390,"de":442}},{"type":"Polygon","arcs":[[-5292,-5297,-5300,-5306,5306,5307]],"properties":{"id":"24663008","dp":2340,"de":0}},{"type":"Polygon","arcs":[[-5293,-5308,5308,5309,5310,-4860]],"properties":{"id":"24663009","dp":3982,"de":369}},{"type":"Polygon","arcs":[[5311,5312,5313,5314,5315,5316,-3478,5317]],"properties":{"id":"24661728","dp":2231,"de":181}},{"type":"Polygon","arcs":[[-5316,5318,-360,5319]],"properties":{"id":"24661729","dp":8286,"de":7159}},{"type":"Polygon","arcs":[[-4819,-4818,5320,5321,-3677]],"properties":{"id":"24661867","dp":7988,"de":18450}},{"type":"Polygon","arcs":[[-5321,-4817,5322,5323]],"properties":{"id":"24661868","dp":21743,"de":4816}},{"type":"Polygon","arcs":[[-5323,-4816,5324,5325,5326,5327]],"properties":{"id":"24661869","dp":6918,"de":5238}},{"type":"Polygon","arcs":[[5328,5329,-3678,-5322,-5324,-5328,5330]],"properties":{"id":"24661870","dp":4383,"de":5790}},{"type":"Polygon","arcs":[[5331,-5237,5332,5333,5334,5335,5336]],"properties":{"id":"24663128","dp":1312,"de":1785}},{"type":"Polygon","arcs":[[5337,5338,5339,5340,-5333]],"properties":{"id":"24663129","dp":1128,"de":536}},{"type":"Polygon","arcs":[[-5341,5341,5342,-5334]],"properties":{"id":"24663130","dp":2422,"de":866}},{"type":"Polygon","arcs":[[5343,-5342,-5340,5344,5345]],"properties":{"id":"24663131","dp":3284,"de":945}},{"type":"Polygon","arcs":[[-5343,-5344,5346,5347,5348,-5335]],"properties":{"id":"24663132","dp":1831,"de":453}},{"type":"Polygon","arcs":[[-5347,-5346,5349]],"properties":{"id":"24663133","dp":2086,"de":0}},{"type":"Polygon","arcs":[[-5348,-5350,-5345,-5339,5350,5351,5352,-3067,5353,5354,5355]],"properties":{"id":"24663134","dp":1348,"de":312}},{"type":"Polygon","arcs":[[-5355,5356,5357]],"properties":{"id":"24663135","dp":1995,"de":0}},{"type":"Polygon","arcs":[[5358,5359,-5337,5360,-5358,5361,5362]],"properties":{"id":"24663136","dp":1330,"de":200}},{"type":"Polygon","arcs":[[-5349,-5356,-5361,-5336]],"properties":{"id":"24663137","dp":2671,"de":273}},{"type":"Polygon","arcs":[[-5259,5363,5364,5365,5366,5367,5368,-3499]],"properties":{"id":"24663138","dp":7577,"de":924}},{"type":"Polygon","arcs":[[-4683,-5264,5369,5370,5371]],"properties":{"id":"24663140","dp":2380,"de":0}},{"type":"Polygon","arcs":[[-5263,-5265,-5294,-4864,-5370]],"properties":{"id":"24663141","dp":3953,"de":467}},{"type":"Polygon","arcs":[[5372,-2031,5373]],"properties":{"id":"24663142","dp":25457,"de":0}},{"type":"Polygon","arcs":[[5374,-5374,-2030,5375,5376,5377,-1797]],"properties":{"id":"24663143","dp":4089,"de":1331}},{"type":"Polygon","arcs":[[-5375,-1796,-1806,-1819,-2032,-5373]],"properties":{"id":"24663144","dp":4815,"de":1012}},{"type":"Polygon","arcs":[[-5377,5378,5379,5380,5381]],"properties":{"id":"24663145","dp":7448,"de":576}},{"type":"Polygon","arcs":[[-5380,5382,5383,5384]],"properties":{"id":"24663146","dp":6888,"de":576}},{"type":"Polygon","arcs":[[-5381,-5385,5385,5386]],"properties":{"id":"24663147","dp":8625,"de":2031}},{"type":"Polygon","arcs":[[5387,5388,-5383]],"properties":{"id":"24663149","dp":5396,"de":1353}},{"type":"Polygon","arcs":[[-5376,-2029,5389,5390,-5388,-5379]],"properties":{"id":"24663150","dp":5796,"de":0}},{"type":"Polygon","arcs":[[5391,5392,5393,5394,5395,5396,5397,-3437,5398,-3441,5399,5400,5401,5402]],"properties":{"id":"24663151","dp":284,"de":2721}},{"type":"Polygon","arcs":[[5403,5404,5405,5406,5407,5408,5409,-5401]],"properties":{"id":"24663152","dp":718,"de":2931}},{"type":"Polygon","arcs":[[-5409,5410,5411,5412]],"properties":{"id":"24663153","dp":1498,"de":3607}},{"type":"Polygon","arcs":[[5413,5414,-5405,5415]],"properties":{"id":"24663154","dp":2620,"de":0}},{"type":"Polygon","arcs":[[5416,5417,5418,-5406,-5415]],"properties":{"id":"24663155","dp":3962,"de":0}},{"type":"Polygon","arcs":[[5419,5420,5421,5422,5423,-5418]],"properties":{"id":"24663156","dp":4107,"de":274}},{"type":"Polygon","arcs":[[-5417,5424,5425,5426,-5420]],"properties":{"id":"24663157","dp":4373,"de":0}},{"type":"Polygon","arcs":[[5427,-5425,-5414,5428]],"properties":{"id":"24663158","dp":2091,"de":0}},{"type":"Polygon","arcs":[[-5400,5429,5430,-5429,-5416,-5404]],"properties":{"id":"24663159","dp":2908,"de":392}},{"type":"Polygon","arcs":[[-5430,-3440,5431,5432,5433],[5434,5435]],"properties":{"id":"24663160","dp":1418,"de":512}},{"type":"Polygon","arcs":[[5436,5437,5438,5439,-4943]],"properties":{"id":"24663032","dp":4308,"de":297}},{"type":"Polygon","arcs":[[5440,5441,5442,5443,5444]],"properties":{"id":"24663169","dp":5649,"de":654}},{"type":"Polygon","arcs":[[5445,-5442,5446,5447,5448,5449]],"properties":{"id":"24663170","dp":2125,"de":1054}},{"type":"Polygon","arcs":[[5450,-5444,5451]],"properties":{"id":"24663171","dp":15617,"de":8707}},{"type":"Polygon","arcs":[[-3439,5452,5453,5454,5455,5456,-5432]],"properties":{"id":"24663172","dp":1321,"de":715}},{"type":"Polygon","arcs":[[5457,5458,-5456]],"properties":{"id":"24663173","dp":2771,"de":200}},{"type":"Polygon","arcs":[[-5455,5459,5460,5461,5462,-5458]],"properties":{"id":"24663174","dp":1629,"de":1407}},{"type":"Polygon","arcs":[[5463,-3054,5464,5465,-5463]],"properties":{"id":"24663175","dp":2280,"de":724}},{"type":"Polygon","arcs":[[5466,5467,5468,5469,-5464,-5462]],"properties":{"id":"24663176","dp":2022,"de":1603}},{"type":"Polygon","arcs":[[5470,5471,5472,-5468,5473]],"properties":{"id":"24663177","dp":3514,"de":0}},{"type":"Polygon","arcs":[[5474,5475,-5474,-5467,-5461,5476,5477]],"properties":{"id":"24663178","dp":1104,"de":1497}},{"type":"Polygon","arcs":[[5478,5479,-5471,-5476]],"properties":{"id":"24663179","dp":3160,"de":0}},{"type":"Polygon","arcs":[[-5067,-5092,5480,5481]],"properties":{"id":"24661834","dp":19267,"de":5860}},{"type":"Polygon","arcs":[[5482,5483,5484,5485,5486,5487]],"properties":{"id":"24661835","dp":13910,"de":10337}},{"type":"Polygon","arcs":[[5488,-5488,5489,5490]],"properties":{"id":"24661836","dp":11541,"de":9589}},{"type":"Polygon","arcs":[[-5490,-5487,5491,5492,5493,5494]],"properties":{"id":"24661837","dp":10114,"de":10665}},{"type":"Polygon","arcs":[[5495,-5491,-5495,5496,5497]],"properties":{"id":"24661838","dp":14367,"de":7806}},{"type":"Polygon","arcs":[[-5497,-5494,5498,5499,5500]],"properties":{"id":"24661839","dp":14441,"de":6472}},{"type":"Polygon","arcs":[[-5500,5501,-5044,5502]],"properties":{"id":"24661840","dp":10863,"de":7142}},{"type":"Polygon","arcs":[[5503,-5503,-3167,5504]],"properties":{"id":"24661841","dp":15344,"de":5603}},{"type":"Polygon","arcs":[[5505,-5501,-5504,5506,5507]],"properties":{"id":"24661842","dp":18575,"de":3166}},{"type":"Polygon","arcs":[[-5331,-5327,5508,5509,5510]],"properties":{"id":"24661871","dp":6399,"de":9697}},{"type":"Polygon","arcs":[[-5510,5511,5512]],"properties":{"id":"24661872","dp":13771,"de":13840}},{"type":"Polygon","arcs":[[5513,5514,-5512]],"properties":{"id":"24661873","dp":15744,"de":1566}},{"type":"Polygon","arcs":[[-5515,5515,-412,-409,-398,5516]],"properties":{"id":"24661874","dp":11193,"de":5645}},{"type":"Polygon","arcs":[[5517,5518,5519,5520,5521,-407,-411,-416]],"properties":{"id":"24661877","dp":4971,"de":5242}},{"type":"Polygon","arcs":[[5522,5523,5524,5525,5526,-5518,-415]],"properties":{"id":"24661879","dp":7276,"de":7811}},{"type":"Polygon","arcs":[[5527,5528,-5523,5529]],"properties":{"id":"24661880","dp":14052,"de":2236}},{"type":"Polygon","arcs":[[5530,5531,5532,5533,-5524,-5529]],"properties":{"id":"24661881","dp":19101,"de":3651}},{"type":"Polygon","arcs":[[5534,5535,5536,-5531,-5528,5537]],"properties":{"id":"24661882","dp":14992,"de":2623}},{"type":"Polygon","arcs":[[5538,5539,-3175,-5535,5540]],"properties":{"id":"24661883","dp":5861,"de":38564}},{"type":"Polygon","arcs":[[5541,-5541,5542,5543]],"properties":{"id":"24661884","dp":12598,"de":8352}},{"type":"Polygon","arcs":[[5544,-5543,-5538,-5530,-414,5545,-5325]],"properties":{"id":"24661885","dp":6272,"de":887}},{"type":"Polygon","arcs":[[-5326,-5546,-417,-413,-5516,-5514,-5509]],"properties":{"id":"24661886","dp":5636,"de":22045}},{"type":"Polygon","arcs":[[-4809,5546,-5544,-5545,-4815]],"properties":{"id":"24661887","dp":14227,"de":1328}},{"type":"Polygon","arcs":[[-5536,-3174,-5028,5547]],"properties":{"id":"24661889","dp":45392,"de":10535}},{"type":"Polygon","arcs":[[-5548,5548,5549,-5537]],"properties":{"id":"24661890","dp":22307,"de":4142}},{"type":"Polygon","arcs":[[-5550,5550,5551,-5532]],"properties":{"id":"24661891","dp":19068,"de":3105}},{"type":"Polygon","arcs":[[-5549,-5027,-5034,5552,-5551]],"properties":{"id":"24661892","dp":20722,"de":2208}},{"type":"Polygon","arcs":[[5553,5554,5555,-5235]],"properties":{"id":"24662308","dp":1893,"de":261}},{"type":"Polygon","arcs":[[-5554,-5234,5556,5557,5558,5559]],"properties":{"id":"24662309","dp":1331,"de":1818}},{"type":"Polygon","arcs":[[-5233,5560,5561,-5557]],"properties":{"id":"24662310","dp":2185,"de":325}},{"type":"Polygon","arcs":[[5562,5563,5564,5565,5566,5567,-4290,5568,-583,-576,-4383,-4379,5569]],"properties":{"id":"24663351","dp":0,"de":5176}},{"type":"Polygon","arcs":[[-4491,5570,5571,-5567,5572]],"properties":{"id":"24663352","dp":17255,"de":1583}},{"type":"Polygon","arcs":[[-4490,5573,-5571]],"properties":{"id":"24663353","dp":38342,"de":4285}},{"type":"Polygon","arcs":[[-5371,-4863,-4866,-4861,-5311,5574,5575]],"properties":{"id":"24663012","dp":3553,"de":0}},{"type":"Polygon","arcs":[[-5310,5576,5577,-5575]],"properties":{"id":"24663013","dp":4801,"de":1237}},{"type":"Polygon","arcs":[[-5577,-5309,-5307,-5305,5578,5579,5580,5581,5582,5583]],"properties":{"id":"24663014","dp":2146,"de":461}},{"type":"Polygon","arcs":[[-5581,5584,5585,5586,5587]],"properties":{"id":"24663015","dp":6630,"de":867}},{"type":"Polygon","arcs":[[5588,5589,5590,-5586]],"properties":{"id":"24663016","dp":6259,"de":797}},{"type":"Polygon","arcs":[[5591,5592,5593,5594,-5587,-5591,5595]],"properties":{"id":"24663017","dp":4788,"de":1934}},{"type":"Polygon","arcs":[[5596,-5594,5597]],"properties":{"id":"24663018","dp":12425,"de":1063}},{"type":"Polygon","arcs":[[-5582,-5588,-5595,-5597,5598,5599,5600]],"properties":{"id":"24663019","dp":8546,"de":0}},{"type":"Polygon","arcs":[[-5583,-5601,5601,5602,5603,5604]],"properties":{"id":"24663020","dp":3414,"de":88}},{"type":"Polygon","arcs":[[5605,5606,5607,5608,5609,-5604,5610,5611]],"properties":{"id":"24663021","dp":1716,"de":0}},{"type":"Polygon","arcs":[[5612,5613,5614,5615,-5607]],"properties":{"id":"24663022","dp":2784,"de":0}},{"type":"Polygon","arcs":[[5616,5617,5618,5619,-5608,-5616,5620]],"properties":{"id":"24663023","dp":2460,"de":0}},{"type":"Polygon","arcs":[[5621,-5621,-5615,5622,5623]],"properties":{"id":"24663024","dp":3356,"de":0}},{"type":"Polygon","arcs":[[5624,5625,-5624,5626,5627,5628]],"properties":{"id":"24663025","dp":2667,"de":277}},{"type":"Polygon","arcs":[[5629,5630,5631,-5617,-5622,-5626,5632]],"properties":{"id":"24663026","dp":8355,"de":0}},{"type":"Polygon","arcs":[[5633,-5633,-5625,5634,5635,5636]],"properties":{"id":"24663027","dp":2987,"de":288}},{"type":"Polygon","arcs":[[5637,-4944,-5440,5638,-5630,-5634]],"properties":{"id":"24663028","dp":4176,"de":0}},{"type":"Polygon","arcs":[[-4945,-5638,-5637,5639,-4951]],"properties":{"id":"24663029","dp":3170,"de":0}},{"type":"Polygon","arcs":[[5640,5641,5642,5643]],"properties":{"id":"24661758","dp":16156,"de":2135}},{"type":"Polygon","arcs":[[-5644,5644,5645,5646]],"properties":{"id":"24661759","dp":16996,"de":0}},{"type":"Polygon","arcs":[[-5646,5647,5648,5649]],"properties":{"id":"24661760","dp":16938,"de":2857}},{"type":"Polygon","arcs":[[5650,5651,-5368,5652,-5437,-4942,5653]],"properties":{"id":"24663033","dp":3425,"de":276}},{"type":"Polygon","arcs":[[-5367,5654,5655,-5438,-5653]],"properties":{"id":"24663034","dp":4851,"de":2227}},{"type":"Polygon","arcs":[[5656,5657,-5655,5658]],"properties":{"id":"24663035","dp":2814,"de":1185}},{"type":"Polygon","arcs":[[5659,5660,5661,5662,5663,-5658,5664]],"properties":{"id":"24663036","dp":4236,"de":1253}},{"type":"Polygon","arcs":[[5665,5666,5667,-5660]],"properties":{"id":"24663037","dp":2719,"de":477}},{"type":"Polygon","arcs":[[5668,5669,5670,5671,-5661,-5668]],"properties":{"id":"24663038","dp":3770,"de":0}},{"type":"Polygon","arcs":[[5672,5673,5674,5675,-5669,-5667]],"properties":{"id":"24663039","dp":3710,"de":0}},{"type":"Polygon","arcs":[[5676,-5673,-5666,-5665,-5657]],"properties":{"id":"24663040","dp":2819,"de":336}},{"type":"Polygon","arcs":[[-5676,5677,5678,-5670]],"properties":{"id":"24663041","dp":2945,"de":0}},{"type":"Polygon","arcs":[[-5675,5679,5680,5681,5682,5683,5684,-5678]],"properties":{"id":"24663042","dp":3268,"de":0}},{"type":"Polygon","arcs":[[5685,5686,5687,5688,-5684]],"properties":{"id":"24663043","dp":2853,"de":340}},{"type":"Polygon","arcs":[[-5671,-5679,-5685,-5689,5689,5690]],"properties":{"id":"24663044","dp":3365,"de":635}},{"type":"Polygon","arcs":[[-5691,5691,5692,5693,5694,-5662,-5672]],"properties":{"id":"24663045","dp":3039,"de":3211}},{"type":"Polygon","arcs":[[5695,5696,5697,-5693,5698]],"properties":{"id":"24663046","dp":3451,"de":1261}},{"type":"Polygon","arcs":[[5699,5700,5701,5702]],"properties":{"id":"24661791","dp":18706,"de":2097}},{"type":"Polygon","arcs":[[5703,-5703,5704,-5520]],"properties":{"id":"24661792","dp":17711,"de":0}},{"type":"Polygon","arcs":[[-5519,-5527,5705,5706,-5700,-5704]],"properties":{"id":"24661793","dp":13902,"de":5226}},{"type":"Polygon","arcs":[[5707,5708,5709,-5706,-5526]],"properties":{"id":"24661794","dp":18778,"de":0}},{"type":"Polygon","arcs":[[-5534,5710,-5708,-5525]],"properties":{"id":"24661795","dp":17990,"de":7191}},{"type":"Polygon","arcs":[[5711,5712,5713,-5711]],"properties":{"id":"24661796","dp":15874,"de":3321}},{"type":"Polygon","arcs":[[-5552,-5553,5714,5715,-5712,-5533]],"properties":{"id":"24661797","dp":11063,"de":7183}},{"type":"Polygon","arcs":[[5716,-5507,-5505,-3166,5717]],"properties":{"id":"24661843","dp":21604,"de":2389}},{"type":"Polygon","arcs":[[-3690,-5508,-5717,5718,5719]],"properties":{"id":"24661844","dp":17615,"de":3145}},{"type":"Polygon","arcs":[[-5719,-5718,-3165,5720]],"properties":{"id":"24661845","dp":17066,"de":2666}},{"type":"Polygon","arcs":[[5721,-5721,-3164,5722]],"properties":{"id":"24661846","dp":15626,"de":2924}},{"type":"Polygon","arcs":[[5723,-4787,-3705,-3699,-3691,-5720,-5722]],"properties":{"id":"24661847","dp":13139,"de":6744}},{"type":"Polygon","arcs":[[-4788,-5724,-5723,-3163,5724]],"properties":{"id":"24661848","dp":31371,"de":18805}},{"type":"Polygon","arcs":[[-4789,-5725,5725,5726]],"properties":{"id":"24661849","dp":17768,"de":4347}},{"type":"Polygon","arcs":[[-5726,-3178,5727,5728]],"properties":{"id":"24661850","dp":20327,"de":4754}},{"type":"Polygon","arcs":[[-5728,-3177,5729,5730]],"properties":{"id":"24661851","dp":17157,"de":4987}},{"type":"Polygon","arcs":[[-5730,-3176,-5540,5731]],"properties":{"id":"24661852","dp":12081,"de":5338}},{"type":"Polygon","arcs":[[-4806,5732,-5732,-5539,-5542,-5547,-4808]],"properties":{"id":"24661853","dp":11568,"de":4222}},{"type":"Polygon","arcs":[[5733,-5731,-5733,-4805]],"properties":{"id":"24661854","dp":16275,"de":3691}},{"type":"Polygon","arcs":[[-4797,5734,-5729,-5734,-4802]],"properties":{"id":"24661855","dp":14986,"de":4289}},{"type":"Polygon","arcs":[[5735,-5727,-5735,-4796,-4801]],"properties":{"id":"24661856","dp":12903,"de":2867}},{"type":"Polygon","arcs":[[-4790,-5736,-4800,-4794]],"properties":{"id":"24661857","dp":15374,"de":3524}},{"type":"Polygon","arcs":[[5736,5737,5738,-5477,5739,5740]],"properties":{"id":"24662291","dp":2363,"de":2620}},{"type":"Polygon","arcs":[[5741,5742,5743,-5738,5744]],"properties":{"id":"24662292","dp":3110,"de":249}},{"type":"Polygon","arcs":[[5745,5746,-5478,-5739,-5744,5747]],"properties":{"id":"24662293","dp":1729,"de":569}},{"type":"Polygon","arcs":[[5748,-5748,-5743,5749]],"properties":{"id":"24662294","dp":3013,"de":0}},{"type":"Polygon","arcs":[[5750,5751,-5750,-5742]],"properties":{"id":"24662295","dp":3863,"de":0}},{"type":"Polygon","arcs":[[5752,5753,5754,5755,5756,5757]],"properties":{"id":"24661972","dp":7154,"de":5237}},{"type":"Polygon","arcs":[[-1498,-1494,5758,-5754]],"properties":{"id":"24661973","dp":14735,"de":0}},{"type":"Polygon","arcs":[[-5759,-1493,5759,5760,-5755]],"properties":{"id":"24661974","dp":11199,"de":2828}},{"type":"Polygon","arcs":[[-5761,5761,5762,-5756]],"properties":{"id":"24661975","dp":12568,"de":1477}},{"type":"Polygon","arcs":[[-5763,5763,5764,5765,5766]],"properties":{"id":"24661976","dp":12302,"de":3386}},{"type":"Polygon","arcs":[[-5766,5767,5768,5769,5770]],"properties":{"id":"24661977","dp":12413,"de":3605}},{"type":"Polygon","arcs":[[-5765,5771,5772,5773,-5768]],"properties":{"id":"24661978","dp":9698,"de":3723}},{"type":"Polygon","arcs":[[-5774,5774,5775,5776]],"properties":{"id":"24661979","dp":10805,"de":1761}},{"type":"Polygon","arcs":[[5777,-5769,-5777,-1475,-1490,5778]],"properties":{"id":"24661980","dp":12658,"de":0}},{"type":"Polygon","arcs":[[-5572,-5574,-4487,5779,5780,5781,-4293,-4499,-3971,5782,-1106,-3400,-4287,-5568]],"properties":{"id":"24663354","dp":3628,"de":402}},{"type":"Polygon","arcs":[[-4294,-5782,-4475]],"properties":{"id":"24663355","dp":111302,"de":4166}},{"type":"Polygon","arcs":[[-5781,5783,-4481,-4476]],"properties":{"id":"24663356","dp":44790,"de":2958}},{"type":"Polygon","arcs":[[-4486,-4482,-5784,-5780]],"properties":{"id":"24663357","dp":30050,"de":1518}},{"type":"Polygon","arcs":[[-2958,5784,-2749,5785,-1319,-1317,-1315,-1311]],"properties":{"id":"24663358","dp":4498,"de":23309}},{"type":"Polygon","arcs":[[-2957,5786,5787,-2750,-5785]],"properties":{"id":"24663359","dp":24693,"de":8844}},{"type":"Polygon","arcs":[[-2751,-5788,5788]],"properties":{"id":"24663360","dp":43966,"de":6404}},{"type":"Polygon","arcs":[[-2956,-2756,-2752,-5789,-5787]],"properties":{"id":"24663361","dp":11578,"de":26430}},{"type":"Polygon","arcs":[[-1320,-5786,-2748,5789,5790,-1972,5791,-5008,-5014,5792,5793,5794,5795,-1286,-1291,-1297]],"properties":{"id":"24663362","dp":377,"de":1046}},{"type":"Polygon","arcs":[[5796,-5209,-2719,-2717,5797,-5790,-2747,-2745]],"properties":{"id":"24663363","dp":3285,"de":10361}},{"type":"Polygon","arcs":[[-1978,-1973,-5791,-5798,-2716]],"properties":{"id":"24663364","dp":3918,"de":1604}},{"type":"Polygon","arcs":[[-5797,-3389,-2758,-230,-2742,5798,5799,-5210]],"properties":{"id":"24663365","dp":5087,"de":3867}},{"type":"Polygon","arcs":[[5800,-5799,-2741,-2720,5801]],"properties":{"id":"24663366","dp":27344,"de":2074}},{"type":"Polygon","arcs":[[5802,5803,-5802,-2724]],"properties":{"id":"24663367","dp":45965,"de":30965}},{"type":"Polygon","arcs":[[-5211,-5800,-5801,-5804,5804]],"properties":{"id":"24663368","dp":39370,"de":14173}},{"type":"Polygon","arcs":[[5805,5806,5807,5808,-5050]],"properties":{"id":"24661902","dp":15724,"de":3621}},{"type":"Polygon","arcs":[[-5048,5809,5810,-5806]],"properties":{"id":"24661903","dp":17957,"de":4042}},{"type":"Polygon","arcs":[[-5047,5811,5812,-5810]],"properties":{"id":"24661904","dp":14102,"de":5769}},{"type":"Polygon","arcs":[[5813,5814,5815,-5812]],"properties":{"id":"24661905","dp":18581,"de":4181}},{"type":"Polygon","arcs":[[5816,5817,-5815,5818]],"properties":{"id":"24661906","dp":17101,"de":5253}},{"type":"Polygon","arcs":[[-5493,-5819,-5814,-5046,-5502,-5499]],"properties":{"id":"24661907","dp":14172,"de":6843}},{"type":"Polygon","arcs":[[-5808,5819,5820]],"properties":{"id":"24661908","dp":18148,"de":3086}},{"type":"Polygon","arcs":[[-5809,-5821,5821,5822,5823,5824]],"properties":{"id":"24661909","dp":12063,"de":9047}},{"type":"Polygon","arcs":[[5825,5826,5827,5828,-5822,-5820]],"properties":{"id":"24661910","dp":10776,"de":4223}},{"type":"Polygon","arcs":[[5829,5830,5831,5832,-5827]],"properties":{"id":"24661911","dp":17397,"de":3253}},{"type":"Polygon","arcs":[[5833,-5824,5834,-5030,-5038]],"properties":{"id":"24661912","dp":13715,"de":8823}},{"type":"Polygon","arcs":[[-5051,-5825,-5834,-5037,-5041]],"properties":{"id":"24661913","dp":15152,"de":9418}},{"type":"Polygon","arcs":[[-5329,-5511,-5513,-5517,-405,5835,5836]],"properties":{"id":"24661916","dp":2651,"de":334}},{"type":"Polygon","arcs":[[5837,-5836,-404,5838,5839,5840,5841]],"properties":{"id":"24661917","dp":2234,"de":4686}},{"type":"Polygon","arcs":[[5842,-5842,5843,5844,5845]],"properties":{"id":"24661918","dp":5145,"de":970}},{"type":"Polygon","arcs":[[5846,-5846,5847,5848,5849,5850,5851]],"properties":{"id":"24661919","dp":2671,"de":1380}},{"type":"Polygon","arcs":[[5852,-5852,5853,5854,5855]],"properties":{"id":"24661920","dp":2496,"de":1621}},{"type":"Polygon","arcs":[[5856,-5856,5857,5858,5859]],"properties":{"id":"24661921","dp":2077,"de":837}},{"type":"Polygon","arcs":[[-5312,5860,-5860,5861,5862,5863,5864,5865]],"properties":{"id":"24661922","dp":3886,"de":1209}},{"type":"Polygon","arcs":[[5866,5867,-5186,5868,-5469,-5473]],"properties":{"id":"24662322","dp":2640,"de":0}},{"type":"Polygon","arcs":[[-5185,5869,5870,5871,5872,5873,5874,-5869]],"properties":{"id":"24662323","dp":4678,"de":0}},{"type":"Polygon","arcs":[[-5872,5875,5876]],"properties":{"id":"24662324","dp":4533,"de":0}},{"type":"Polygon","arcs":[[-5871,5877,-5164,5878,-4971,-4976,5879,-5876]],"properties":{"id":"24662325","dp":3143,"de":348}},{"type":"Polygon","arcs":[[-5873,-5877,-5880,-4978,5880,5881]],"properties":{"id":"24662326","dp":3614,"de":0}},{"type":"Polygon","arcs":[[5882,-5874,-5882,5883,-5052,5884]],"properties":{"id":"24662327","dp":2698,"de":177}},{"type":"Polygon","arcs":[[5885,5886,-5779,-1489]],"properties":{"id":"24661981","dp":16081,"de":1520}},{"type":"Polygon","arcs":[[5887,-5770,-5778,-5887,5888]],"properties":{"id":"24661982","dp":15856,"de":1401}},{"type":"Polygon","arcs":[[5889,-5757,-5767,-5771,-5888,5890]],"properties":{"id":"24661983","dp":8888,"de":2923}},{"type":"Polygon","arcs":[[5891,-5891,-5889,5892,5893,5894,5895,5896,5897]],"properties":{"id":"24661984","dp":10451,"de":0}},{"type":"Polygon","arcs":[[5898,-5897]],"properties":{"id":"24661985","dp":29836,"de":0}},{"type":"Polygon","arcs":[[5899,-5898,-5899,-5896,5900,5901]],"properties":{"id":"24661986","dp":10344,"de":2323}},{"type":"Polygon","arcs":[[-5901,-5895,5902,5903]],"properties":{"id":"24661987","dp":21005,"de":2234}},{"type":"Polygon","arcs":[[-5903,-5894,5904,5905]],"properties":{"id":"24661988","dp":17865,"de":3370}},{"type":"Polygon","arcs":[[5906,-5905,-5893,-5886,-1488,5907]],"properties":{"id":"24661989","dp":16571,"de":2380}},{"type":"Polygon","arcs":[[5908,-5908,-1487,5909,5910]],"properties":{"id":"24661990","dp":12929,"de":3521}},{"type":"Polygon","arcs":[[5911,-5910,-1486,5912,5913]],"properties":{"id":"24661991","dp":16134,"de":3781}},{"type":"Polygon","arcs":[[5914,-5913,-1485,-1482,5915,5916]],"properties":{"id":"24661992","dp":16920,"de":3492}},{"type":"Polygon","arcs":[[5917,-5917,5918,5919,5920]],"properties":{"id":"24661993","dp":15101,"de":4949}},{"type":"Polygon","arcs":[[-5916,5921,-5919]],"properties":{"id":"24661994","dp":15261,"de":0}},{"type":"Polygon","arcs":[[5922,-5922,-1481,-1478,5923]],"properties":{"id":"24661995","dp":14195,"de":2545}},{"type":"Polygon","arcs":[[-5924,-1477,-1459,5924,5925]],"properties":{"id":"24661996","dp":9977,"de":0}},{"type":"Polygon","arcs":[[5926,5927,5928,5929,5930]],"properties":{"id":"24662366","dp":4026,"de":0}},{"type":"Polygon","arcs":[[-5929,5931,-4948,5932,5933,5934,5935,5936]],"properties":{"id":"24662367","dp":3485,"de":744}},{"type":"Polygon","arcs":[[-4947,-4950,5937,-5933]],"properties":{"id":"24662368","dp":3632,"de":284}},{"type":"Polygon","arcs":[[-5938,-4949,5938,5939,5940,-5934]],"properties":{"id":"24662369","dp":2238,"de":438}},{"type":"Polygon","arcs":[[5941,5942,5943,-5940]],"properties":{"id":"24662370","dp":3178,"de":317}},{"type":"Polygon","arcs":[[5944,-5062]],"properties":{"id":"24663408","dp":7381,"de":0}},{"type":"Polygon","arcs":[[-4979,-4973,5945,5946,-4958,-5063,-5945,-5061]],"properties":{"id":"24663409","dp":4978,"de":712}},{"type":"Polygon","arcs":[[-4969,5947,5948,-5946]],"properties":{"id":"24663410","dp":6406,"de":0}},{"type":"Polygon","arcs":[[-5949,5949,-4959,-5947]],"properties":{"id":"24663411","dp":4462,"de":0}},{"type":"Polygon","arcs":[[5950,-2044,-3114,-4426]],"properties":{"id":"24663412","dp":4522,"de":895}},{"type":"Polygon","arcs":[[-4425,-2060,-4424,-4427,-2058,-2045,-5951]],"properties":{"id":"24663413","dp":9115,"de":3651}},{"type":"Polygon","arcs":[[5951,5952,5953,-3511,5954,5955,-3608,-3600,-4555,-4414,-3115,-2052,-2037,-2035,-1532,5956,5957,5958,5959,5960,5961]],"properties":{"id":"24663419","dp":33,"de":2588}},{"type":"Polygon","arcs":[[5962,5963,5964,5965,5966,5967]],"properties":{"id":"24663420","dp":4244,"de":312}},{"type":"Polygon","arcs":[[-5964,5968]],"properties":{"id":"24663421","dp":4817,"de":400}},{"type":"Polygon","arcs":[[-5963,5969,5970]],"properties":{"id":"24663422","dp":4695,"de":428}},{"type":"Polygon","arcs":[[-5969,-5971,5971,-5958,5972,5973,5974,-5153,-3442,5975,5976,5977,5978,-5965]],"properties":{"id":"24663423","dp":110,"de":3086}},{"type":"Polygon","arcs":[[-5972,5979,5980,-5959]],"properties":{"id":"24663424","dp":4548,"de":989}},{"type":"Polygon","arcs":[[5981,-5960,-5981,5982,5983]],"properties":{"id":"24663425","dp":9652,"de":1159}},{"type":"Polygon","arcs":[[5984,-2210,-2303,-2301]],"properties":{"id":"24663426","dp":17381,"de":0}},{"type":"Polygon","arcs":[[-2138,-2213,-2211,-5985,-2300,-2298,-2215]],"properties":{"id":"24663428","dp":4996,"de":1087}},{"type":"Polygon","arcs":[[-5006,-5792,-1971,5985,5986,-3024,-3021,-1321]],"properties":{"id":"24663370","dp":3,"de":174}},{"type":"Polygon","arcs":[[5987,5988,-5986,-1970]],"properties":{"id":"24663371","dp":48581,"de":4391}},{"type":"Polygon","arcs":[[-1969,5989,-5988]],"properties":{"id":"24663372","dp":40918,"de":0}},{"type":"Polygon","arcs":[[-3288,-3289,-3296,-3462,-3023,-3025,-5987,-5989,-5990,-1968]],"properties":{"id":"24663373","dp":11791,"de":1515}},{"type":"Polygon","arcs":[[-4338,-4330,-3981,5990,5991]],"properties":{"id":"24663374","dp":10415,"de":1298}},{"type":"Polygon","arcs":[[5992,5993,5994,5995,5996,-4333,-5992,5997]],"properties":{"id":"24663375","dp":9598,"de":802}},{"type":"Polygon","arcs":[[5998,5999,-4347,6000,6001,-5994]],"properties":{"id":"24663376","dp":3970,"de":5338}},{"type":"Polygon","arcs":[[6002,-4343,-4348,-6000]],"properties":{"id":"24663377","dp":9555,"de":1420}},{"type":"Polygon","arcs":[[6003,-4525,-4344,-4339,-6003,-5999,-5993,6004]],"properties":{"id":"24663378","dp":4187,"de":1067}},{"type":"Polygon","arcs":[[-3972,-4530,-4526,-6004,6005]],"properties":{"id":"24663379","dp":14021,"de":0}},{"type":"Polygon","arcs":[[-6005,-5998,-5991,-3980,-6006]],"properties":{"id":"24663380","dp":5446,"de":0}},{"type":"Polygon","arcs":[[6006,6007,-2873,6008,-2116,-2122,-2125,-2311,6009]],"properties":{"id":"24663381","dp":2,"de":638}},{"type":"Polygon","arcs":[[-3108,-2542,-2545,-2551,-2555,-3428,6010,-2533,-2537,-2539]],"properties":{"id":"24663382","dp":5,"de":0}},{"type":"Polygon","arcs":[[6011,6012,6013,6014,6015,6016,-5390,-2028,-1938]],"properties":{"id":"24663383","dp":617,"de":1335}},{"type":"Polygon","arcs":[[6017,-6016,6018]],"properties":{"id":"24663384","dp":4514,"de":4583}},{"type":"Polygon","arcs":[[6019,6020,-6019,-6015,6021]],"properties":{"id":"24663385","dp":9437,"de":974}},{"type":"Polygon","arcs":[[-6021,6022,-5386,-5384,6023]],"properties":{"id":"24663386","dp":7647,"de":880}},{"type":"Polygon","arcs":[[-6024,-5389,-5391,-6017,-6018]],"properties":{"id":"24663387","dp":8240,"de":0}},{"type":"Polygon","arcs":[[6024,6025,-6023,-6020,6026]],"properties":{"id":"24663388","dp":9557,"de":766}},{"type":"Polygon","arcs":[[-6027,-6022,-6014,6027]],"properties":{"id":"24663389","dp":7300,"de":933}},{"type":"Polygon","arcs":[[6028,6029,6030,-5983,-5980,-5970,-5968,6031,6032,6033,-5995,-6002,6034]],"properties":{"id":"24663414","dp":3210,"de":1098}},{"type":"Polygon","arcs":[[-6029,6035]],"properties":{"id":"24663415","dp":8810,"de":0}},{"type":"Polygon","arcs":[[-4353,-4359,6036,-5962,6037,6038,-6030,-6036,-6035,-6001,-4346]],"properties":{"id":"24663416","dp":2317,"de":5462}},{"type":"Polygon","arcs":[[-5984,-6031,-6039,6039]],"properties":{"id":"24663417","dp":9046,"de":2798}},{"type":"Polygon","arcs":[[-5961,-5982,-6040,-6038]],"properties":{"id":"24663418","dp":10895,"de":0}},{"type":"Polygon","arcs":[[6040,-367,-5319,-5315]],"properties":{"id":"24661730","dp":16880,"de":0}},{"type":"Polygon","arcs":[[6041,-378,-371,-6041,-5314]],"properties":{"id":"24661731","dp":12441,"de":2597}},{"type":"Polygon","arcs":[[-5866,6042,-375,-6042,-5313]],"properties":{"id":"24661732","dp":16168,"de":3448}},{"type":"Polygon","arcs":[[-5865,6043,6044,-376,-6043]],"properties":{"id":"24661733","dp":17262,"de":0}},{"type":"Polygon","arcs":[[-5864,6045,6046,6047,-6044]],"properties":{"id":"24661734","dp":18052,"de":0}},{"type":"Polygon","arcs":[[6048,-6046,-5863,6049]],"properties":{"id":"24661735","dp":15244,"de":1152}},{"type":"Polygon","arcs":[[-5859,6050,6051,6052,-6050,-5862]],"properties":{"id":"24661736","dp":9780,"de":5118}},{"type":"Polygon","arcs":[[6053,-6051,-5858,-5855]],"properties":{"id":"24661737","dp":14640,"de":2877}},{"type":"Polygon","arcs":[[6054,6055,6056,6057,-6052,-6054,-5854]],"properties":{"id":"24661738","dp":10280,"de":2730}},{"type":"Polygon","arcs":[[6058,6059,-6055,-5851]],"properties":{"id":"24661739","dp":15628,"de":2428}},{"type":"Polygon","arcs":[[6060,6061,-6056,-6060]],"properties":{"id":"24661740","dp":12657,"de":1571}},{"type":"Polygon","arcs":[[6062,6063,-6061,6064]],"properties":{"id":"24661741","dp":17597,"de":0}},{"type":"Polygon","arcs":[[6065,-6065,-6059,-5850]],"properties":{"id":"24661742","dp":14510,"de":3115}},{"type":"Polygon","arcs":[[6066,6067,-6066,-5849]],"properties":{"id":"24661743","dp":15205,"de":74531}},{"type":"Polygon","arcs":[[6068,6069,-6067,-5848]],"properties":{"id":"24661744","dp":16950,"de":3571}},{"type":"Polygon","arcs":[[6070,6071,-6069,-5845]],"properties":{"id":"24661745","dp":16925,"de":1766}},{"type":"Polygon","arcs":[[6072,6073,6074,-6072]],"properties":{"id":"24661746","dp":20318,"de":1724}},{"type":"Polygon","arcs":[[-5841,6075,6076,-6073,-6071,-5844]],"properties":{"id":"24661747","dp":16655,"de":1535}},{"type":"Polygon","arcs":[[6077,6078,6079,6080,6081,6082,-6074,-6077,6083]],"properties":{"id":"24661748","dp":11237,"de":3669}},{"type":"Polygon","arcs":[[6084,6085,-6084,-6076,-5840]],"properties":{"id":"24661749","dp":17024,"de":0}},{"type":"Polygon","arcs":[[6086,6087,6088,-6078,-6086]],"properties":{"id":"24661750","dp":13285,"de":0}},{"type":"Polygon","arcs":[[-6085,-5839,-403,6089,-6087]],"properties":{"id":"24661751","dp":2890,"de":2701}},{"type":"Polygon","arcs":[[6090,6091,6092,-6088,-6090]],"properties":{"id":"24661752","dp":8127,"de":3802}},{"type":"Polygon","arcs":[[-6093,6093,6094,-6089]],"properties":{"id":"24661753","dp":21478,"de":0}},{"type":"Polygon","arcs":[[-6095,6095,6096,-6079]],"properties":{"id":"24661754","dp":17242,"de":2263}},{"type":"Polygon","arcs":[[-6080,-6097,6097,6098]],"properties":{"id":"24661755","dp":20180,"de":4279}},{"type":"Polygon","arcs":[[-6099,6099,6100,-6081]],"properties":{"id":"24661756","dp":18355,"de":2444}},{"type":"Polygon","arcs":[[-6101,6101,6102,-5642,-6082]],"properties":{"id":"24661757","dp":17674,"de":3386}},{"type":"MultiPolygon","arcs":[[[6103,6104,6105,6106,6107]],[[6108,6109,6110,6111]]],"properties":{"id":"24662238","dp":2261,"de":793}},{"type":"Polygon","arcs":[[-5189,-5204,6112,-5171,-5178,-5176,-5174,6113,6114]],"properties":{"id":"24663429","dp":2041,"de":2799}},{"type":"Polygon","arcs":[[-5179,-5182,6115,-5190,-6115,6116,-5183]],"properties":{"id":"24663430","dp":900,"de":1705}},{"type":"Polygon","arcs":[[-3896,6117,-3110,-1072,-3894]],"properties":{"id":"24663431","dp":5080,"de":6645}},{"type":"Polygon","arcs":[[-3111,-6118,-3903]],"properties":{"id":"24663432","dp":5280,"de":570}},{"type":"Polygon","arcs":[[-2560,6118,6119,-2961,-4585,-2973,-2971]],"properties":{"id":"24663434","dp":8464,"de":616}},{"type":"Polygon","arcs":[[6120,6121,6122,-6119,-2559,-2563]],"properties":{"id":"24663436","dp":10303,"de":1757}},{"type":"Polygon","arcs":[[6123,-2733,-2735,-2736,-2962,-6120]],"properties":{"id":"24663437","dp":9503,"de":20644}},{"type":"Polygon","arcs":[[-6124,-6123,6124,-5212,6125,6126]],"properties":{"id":"24663438","dp":6438,"de":2319}},{"type":"Polygon","arcs":[[-1201,6127,6128,-1245,-1253,-1254,-5127,-3670,6129]],"properties":{"id":"24663439","dp":625,"de":1190}},{"type":"Polygon","arcs":[[-1200,-1244,6130,6131,6132,-6128]],"properties":{"id":"24663441","dp":0,"de":2041}},{"type":"Polygon","arcs":[[-6129,6133,6134,-1248,-1246]],"properties":{"id":"24663442","dp":7644,"de":47537}},{"type":"Polygon","arcs":[[6135,6136,-6134,-6133]],"properties":{"id":"24663443","dp":9341,"de":8797}},{"type":"Polygon","arcs":[[-2967,6137,6138,6139]],"properties":{"id":"24663444","dp":23480,"de":0}},{"type":"Polygon","arcs":[[-6132,6140,-2590,-2968,-6140,-6136]],"properties":{"id":"24663445","dp":5663,"de":8789}},{"type":"Polygon","arcs":[[6141,6142,6143,-5751,6144]],"properties":{"id":"24662296","dp":2301,"de":0}},{"type":"Polygon","arcs":[[6145,6146,6147,-6142,6148]],"properties":{"id":"24662297","dp":1810,"de":391}},{"type":"Polygon","arcs":[[-6149,-6145,-5745,6149,6150]],"properties":{"id":"24662298","dp":1947,"de":0}},{"type":"Polygon","arcs":[[-6146,-6151,6151,6152,6153]],"properties":{"id":"24662299","dp":2278,"de":0}},{"type":"Polygon","arcs":[[6154,6155,-6147,-6154,6156,6157,6158,6159,6160]],"properties":{"id":"24662300","dp":1832,"de":1214}},{"type":"Polygon","arcs":[[6161,6162,-6157,-6153,6163,6164]],"properties":{"id":"24662301","dp":2556,"de":1063}},{"type":"Polygon","arcs":[[-6150,-5737,6165,-6164,-6152]],"properties":{"id":"24662302","dp":2085,"de":0}},{"type":"Polygon","arcs":[[6166,-6159,6167,6168,-6165,-6166,6169]],"properties":{"id":"24662303","dp":1580,"de":0}},{"type":"Polygon","arcs":[[-6162,-6169,6170]],"properties":{"id":"24662304","dp":2816,"de":348}},{"type":"Polygon","arcs":[[-6158,-6163,-6171,-6168]],"properties":{"id":"24662305","dp":2878,"de":384}},{"type":"Polygon","arcs":[[-5232,6171,-5230,6172,6173,-5561]],"properties":{"id":"24662311","dp":1553,"de":149}},{"type":"Polygon","arcs":[[-5229,6174,-6173]],"properties":{"id":"24662312","dp":1454,"de":1075}},{"type":"Polygon","arcs":[[-6174,-6175,-5228,-5226,-5224,-5219,6175,-6155,6176,-5558,-5562]],"properties":{"id":"24662313","dp":840,"de":142}},{"type":"Polygon","arcs":[[-5218,-5201,-5205,-4676,6177,6178,-6156,-6176]],"properties":{"id":"24662314","dp":3498,"de":0}},{"type":"Polygon","arcs":[[-6148,-6179,6179,6180]],"properties":{"id":"24662315","dp":2455,"de":527}},{"type":"Polygon","arcs":[[-6178,-4679,-5215,6181,-6180]],"properties":{"id":"24662316","dp":2888,"de":306}},{"type":"Polygon","arcs":[[-6181,-6182,-5214,6182,-6143]],"properties":{"id":"24662317","dp":2817,"de":0}},{"type":"Polygon","arcs":[[-5213,-5197,6183,-6144,-6183]],"properties":{"id":"24662318","dp":2925,"de":0}},{"type":"Polygon","arcs":[[-5752,-6184,-5192,6184,-5746,-5749]],"properties":{"id":"24662319","dp":1692,"de":360}},{"type":"Polygon","arcs":[[-6185,-5191,-6116,-5181,-5868,6185,-5479,-5475,-5747]],"properties":{"id":"24662320","dp":2385,"de":812}},{"type":"Polygon","arcs":[[-6186,-5867,-5472,-5480]],"properties":{"id":"24662321","dp":3259,"de":0}},{"type":"Polygon","arcs":[[6186,6187,6188]],"properties":{"id":"24662705","dp":41953,"de":0}},{"type":"Polygon","arcs":[[-6189,6189,6190,6191,6192]],"properties":{"id":"24662706","dp":13309,"de":1079}},{"type":"MultiPolygon","arcs":[[[6193,6194,6195,6196,6197,6198]],[[6199]],[[6200,6201,6202]],[[6203]]],"properties":{"id":"24662707","dp":1614,"de":0}},{"type":"Polygon","arcs":[[-5649,6204,6205,6206,6207]],"properties":{"id":"24661761","dp":15096,"de":5038}},{"type":"Polygon","arcs":[[6208,-5650,-6208,6209,6210,-6064]],"properties":{"id":"24661762","dp":12626,"de":4966}},{"type":"Polygon","arcs":[[-6068,-6070,-6075,-6083,-5641,-5647,-6209,-6063]],"properties":{"id":"24661763","dp":12583,"de":3149}},{"type":"Polygon","arcs":[[-6211,6211,6212,-6062]],"properties":{"id":"24661764","dp":13913,"de":7681}},{"type":"Polygon","arcs":[[-6210,-6207,6213,6214,6215,-6212]],"properties":{"id":"24661765","dp":12851,"de":21205}},{"type":"Polygon","arcs":[[-6213,-6216,6216,6217,6218,-6057]],"properties":{"id":"24661766","dp":11159,"de":8956}},{"type":"Polygon","arcs":[[-6215,6219,6220,6221,6222,-6217]],"properties":{"id":"24661767","dp":11887,"de":8657}},{"type":"Polygon","arcs":[[6223,6224,6225,-6220,-6214]],"properties":{"id":"24661768","dp":7238,"de":1791}},{"type":"Polygon","arcs":[[6226,6227,-6224,-6206]],"properties":{"id":"24661769","dp":16767,"de":0}},{"type":"Polygon","arcs":[[6228,6229,-6227,-6205,-5648,-5645]],"properties":{"id":"24661770","dp":7574,"de":2425}},{"type":"Polygon","arcs":[[-6103,6230,6231,6232,-6229,-5643]],"properties":{"id":"24661771","dp":16973,"de":2600}},{"type":"Polygon","arcs":[[-6102,6233,6234,-6231]],"properties":{"id":"24661772","dp":16303,"de":0}},{"type":"Polygon","arcs":[[6235,6236,6237,-6234,-6100,-6098,-6096]],"properties":{"id":"24661773","dp":10762,"de":1326}},{"type":"Polygon","arcs":[[6238,6239,6240,-6238]],"properties":{"id":"24661774","dp":19375,"de":0}},{"type":"Polygon","arcs":[[6241,6242,-6239,-6237]],"properties":{"id":"24661775","dp":11594,"de":1293}},{"type":"Polygon","arcs":[[6243,6244,6245,-6242,6246]],"properties":{"id":"24661776","dp":8608,"de":2355}},{"type":"Polygon","arcs":[[-6246,6247,6248,6249,6250,-6240,-6243]],"properties":{"id":"24661777","dp":6741,"de":1690}},{"type":"Polygon","arcs":[[6251,6252,-6248,-6245,6253]],"properties":{"id":"24661778","dp":8116,"de":4743}},{"type":"Polygon","arcs":[[-6254,-6244,6254,6255]],"properties":{"id":"24661779","dp":6321,"de":2008}},{"type":"Polygon","arcs":[[6256,6257,-6256,6258]],"properties":{"id":"24661780","dp":9661,"de":1224}},{"type":"Polygon","arcs":[[6259,-6259,6260,6261,6262]],"properties":{"id":"24661781","dp":9341,"de":1508}},{"type":"Polygon","arcs":[[-6261,-6255,-6247,-6236,-6094,-6092]],"properties":{"id":"24661782","dp":5055,"de":2746}},{"type":"Polygon","arcs":[[6263,-6262,-6091,-402]],"properties":{"id":"24661783","dp":14177,"de":1407}},{"type":"Polygon","arcs":[[-401,6264,6265,-6263,-6264]],"properties":{"id":"24661784","dp":14551,"de":1345}},{"type":"Polygon","arcs":[[6266,-6266,6267]],"properties":{"id":"24661785","dp":11036,"de":0}},{"type":"Polygon","arcs":[[-408,-5522,6268,-6268,-6265,-400]],"properties":{"id":"24661786","dp":8508,"de":2130}},{"type":"Polygon","arcs":[[-5521,-5705,6269,6270,-6269]],"properties":{"id":"24661787","dp":11700,"de":0}},{"type":"Polygon","arcs":[[-6271,6271,-6260,-6267]],"properties":{"id":"24661788","dp":14873,"de":0}},{"type":"Polygon","arcs":[[6272,6273,-6257,-6272]],"properties":{"id":"24661789","dp":15202,"de":0}},{"type":"Polygon","arcs":[[-5702,6274,-6273,-6270]],"properties":{"id":"24661790","dp":16011,"de":1123}},{"type":"Polygon","arcs":[[6275,6276,6277]],"properties":{"id":"24662255","dp":3737,"de":0}},{"type":"Polygon","arcs":[[6278,6279,6280,6281,-6278,6282]],"properties":{"id":"24662256","dp":2588,"de":430}},{"type":"Polygon","arcs":[[-5236,-5556,6283,-5559,-6177,-6161,-5351,-5338]],"properties":{"id":"24662306","dp":1249,"de":139}},{"type":"Polygon","arcs":[[-5555,-5560,-6284]],"properties":{"id":"24662307","dp":1959,"de":424}},{"type":"Polygon","arcs":[[6284,6285,6286,6287,-6194,6288,-6203,6289,6290]],"properties":{"id":"24662671","dp":2857,"de":348}},{"type":"Polygon","arcs":[[-6192,6291,6292,6293,-6291]],"properties":{"id":"24662672","dp":6882,"de":887}},{"type":"Polygon","arcs":[[6294,6295,-6292,-6191,6296]],"properties":{"id":"24662673","dp":7914,"de":1071}},{"type":"Polygon","arcs":[[6297,-6296,6298,6299]],"properties":{"id":"24662674","dp":13984,"de":957}},{"type":"Polygon","arcs":[[6300,-6293,-6298,6301,6302]],"properties":{"id":"24662675","dp":9869,"de":913}},{"type":"Polygon","arcs":[[6303,6304,6305,-6302,6306]],"properties":{"id":"24662676","dp":6731,"de":2977}},{"type":"Polygon","arcs":[[-6307,-6300,6307,6308,6309]],"properties":{"id":"24662677","dp":11051,"de":1860}},{"type":"Polygon","arcs":[[-6309,6310,6311]],"properties":{"id":"24662678","dp":11729,"de":947}},{"type":"Polygon","arcs":[[-5875,-5883,6312,-3059,-3055,-5470]],"properties":{"id":"24662328","dp":3185,"de":1033}},{"type":"Polygon","arcs":[[6313,-6313,-5885,-5056,6314]],"properties":{"id":"24662329","dp":3261,"de":438}},{"type":"Polygon","arcs":[[-3060,-6314,6315,6316]],"properties":{"id":"24662330","dp":3657,"de":1406}},{"type":"Polygon","arcs":[[-3061,-6317,6317,6318,6319,6320]],"properties":{"id":"24662331","dp":1606,"de":110}},{"type":"Polygon","arcs":[[-6316,6321,6322,6323,6324,-6318]],"properties":{"id":"24662332","dp":6775,"de":602}},{"type":"Polygon","arcs":[[-6315,-5055,6325,6326,-6322]],"properties":{"id":"24662333","dp":3983,"de":1212}},{"type":"Polygon","arcs":[[-5059,-4964,6327,-6326]],"properties":{"id":"24662334","dp":4472,"de":365}},{"type":"Polygon","arcs":[[-6327,-6328,-4967,6328,6329,6330,6331]],"properties":{"id":"24662335","dp":3950,"de":1421}},{"type":"Polygon","arcs":[[-6332,6332,6333,-6323]],"properties":{"id":"24662336","dp":9900,"de":931}},{"type":"Polygon","arcs":[[-6331,6334,-5696,6335,-6333]],"properties":{"id":"24662337","dp":7324,"de":0}},{"type":"Polygon","arcs":[[-5688,6336,6337,6338,-6324,-6334,-6336,-5699,-5692,-5690]],"properties":{"id":"24662338","dp":2305,"de":1478}},{"type":"Polygon","arcs":[[6339,6340,-6338]],"properties":{"id":"24662339","dp":4017,"de":0}},{"type":"Polygon","arcs":[[6341,-6320,6342,-6340,-6337,-5687,6343]],"properties":{"id":"24662340","dp":3325,"de":764}},{"type":"Polygon","arcs":[[-6343,-6319,-6325,-6339,-6341]],"properties":{"id":"24662341","dp":3875,"de":230}},{"type":"Polygon","arcs":[[6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,-1830]],"properties":{"id":"24662730","dp":1834,"de":2895}},{"type":"Polygon","arcs":[[-1674,6354,6355,-1387,-6354,6356,6357,-3586]],"properties":{"id":"24662731","dp":614,"de":2821}},{"type":"Polygon","arcs":[[-1680,-1681,6358,-6355]],"properties":{"id":"24662732","dp":7581,"de":0}},{"type":"Polygon","arcs":[[-1684,-1689,-1694,-1708,-1383,-6356,-6359]],"properties":{"id":"24662733","dp":9120,"de":685}},{"type":"Polygon","arcs":[[-6358,6359,6360,6361,6362,6363,-3587]],"properties":{"id":"24662734","dp":3022,"de":2329}},{"type":"Polygon","arcs":[[6364,6365,-6361]],"properties":{"id":"24662735","dp":9518,"de":0}},{"type":"Polygon","arcs":[[6366,6367,-6107,6368,6369,6370]],"properties":{"id":"24662239","dp":3567,"de":602}},{"type":"Polygon","arcs":[[6371,6372,-6369,-6106]],"properties":{"id":"24662240","dp":7881,"de":3268}},{"type":"Polygon","arcs":[[-6373,6373,6374,-6370]],"properties":{"id":"24662241","dp":3505,"de":1525}},{"type":"Polygon","arcs":[[6375,-6371,-6375,6376,6377]],"properties":{"id":"24662242","dp":3234,"de":1782}},{"type":"Polygon","arcs":[[6378,6379,6380,6381,6382,6383,-1529,6384,-6377]],"properties":{"id":"24662243","dp":1208,"de":2566}},{"type":"Polygon","arcs":[[-6374,6385,6386,6387,6388,-6379]],"properties":{"id":"24662244","dp":2557,"de":909}},{"type":"Polygon","arcs":[[-6389,6389,6390,6391,6392,-6380]],"properties":{"id":"24662245","dp":2398,"de":0}},{"type":"Polygon","arcs":[[6393,-6390,-6388,6394,-6386,-6372]],"properties":{"id":"24662246","dp":10977,"de":448}},{"type":"Polygon","arcs":[[-6387,-6395]],"properties":{"id":"24662247","dp":0,"de":0}},{"type":"Polygon","arcs":[[6395,6396,6397,-6391,-6394,-6105]],"properties":{"id":"24662248","dp":1504,"de":225}},{"type":"Polygon","arcs":[[-6279,6398,6399,6400,-6392,-6398]],"properties":{"id":"24662250","dp":1143,"de":762}},{"type":"Polygon","arcs":[[-6393,-6401,6401,6402,-6381]],"properties":{"id":"24662251","dp":2939,"de":744}},{"type":"Polygon","arcs":[[-6400,6403,6404,-6402]],"properties":{"id":"24662252","dp":3252,"de":0}},{"type":"Polygon","arcs":[[6405,-6382,-6403,-6405]],"properties":{"id":"24662253","dp":10107,"de":0}},{"type":"Polygon","arcs":[[-6283,-6277,-6383,-6406,-6404,-6399]],"properties":{"id":"24662254","dp":3446,"de":461}},{"type":"Polygon","arcs":[[6406,-4695,6407,6408,6409,6410,6411,6412]],"properties":{"id":"24662585","dp":4198,"de":409}},{"type":"Polygon","arcs":[[-6413,6413,6414,6415,6416,6417]],"properties":{"id":"24662586","dp":4531,"de":1060}},{"type":"Polygon","arcs":[[-6417,6418,6419,6420]],"properties":{"id":"24662587","dp":13375,"de":1380}},{"type":"Polygon","arcs":[[-6407,-6418,-6421,6421,6422,-4696]],"properties":{"id":"24662588","dp":8159,"de":0}},{"type":"Polygon","arcs":[[6423,-6281,6424]],"properties":{"id":"24662257","dp":3152,"de":0}},{"type":"Polygon","arcs":[[6425,-6304,-6310,-6312,6426,6427,6428,-6346]],"properties":{"id":"24662679","dp":5501,"de":2354}},{"type":"Polygon","arcs":[[-6429,6429,-6347]],"properties":{"id":"24662680","dp":9791,"de":2083}},{"type":"Polygon","arcs":[[-6428,6430,6431,-6348,-6430]],"properties":{"id":"24662681","dp":9580,"de":1904}},{"type":"Polygon","arcs":[[-6432,6432,6433,-6349]],"properties":{"id":"24662682","dp":9391,"de":2186}},{"type":"Polygon","arcs":[[6434,6435,6436,-6433]],"properties":{"id":"24662683","dp":14871,"de":0}},{"type":"Polygon","arcs":[[-6434,-6437,6437,6438,-6350]],"properties":{"id":"24662684","dp":11510,"de":0}},{"type":"Polygon","arcs":[[-6438,6439,6440,6441,6442]],"properties":{"id":"24662685","dp":10287,"de":1053}},{"type":"Polygon","arcs":[[-6440,-6436,6443,6444,6445]],"properties":{"id":"24662686","dp":12788,"de":0}},{"type":"Polygon","arcs":[[6446,6447,6448,-6446]],"properties":{"id":"24662687","dp":10598,"de":1028}},{"type":"Polygon","arcs":[[-6449,6449,6450,6451,-6441]],"properties":{"id":"24662688","dp":13352,"de":0}},{"type":"Polygon","arcs":[[-6442,-6452,6452,6453,6454,6455,6456]],"properties":{"id":"24662689","dp":5850,"de":1264}},{"type":"Polygon","arcs":[[-6451,6457,6458,6459,6460,-6453]],"properties":{"id":"24662690","dp":12312,"de":0}},{"type":"Polygon","arcs":[[-6461,6461,6462,6463,-6454]],"properties":{"id":"24662691","dp":6297,"de":749}},{"type":"Polygon","arcs":[[-6460,6464,-3571,6465,-6462]],"properties":{"id":"24662692","dp":5813,"de":1182}},{"type":"Polygon","arcs":[[6466,-3572,-6465,-6459,6467]],"properties":{"id":"24662693","dp":7787,"de":0}},{"type":"Polygon","arcs":[[6468,6469,-3573,-6467,6470]],"properties":{"id":"24662694","dp":7267,"de":910}},{"type":"Polygon","arcs":[[6471,-6471,-6468,-6458,-6450,-6448]],"properties":{"id":"24662695","dp":12815,"de":1958}},{"type":"Polygon","arcs":[[6472,6473,-6469,-6472,-6447,6474]],"properties":{"id":"24662696","dp":8731,"de":755}},{"type":"Polygon","arcs":[[6475,6476,6477,-6473,6478]],"properties":{"id":"24662697","dp":9029,"de":0}},{"type":"Polygon","arcs":[[6479,-3574,-6470,-6474,-6478]],"properties":{"id":"24662698","dp":5712,"de":6724}},{"type":"Polygon","arcs":[[6480,-3575,-6480,6481]],"properties":{"id":"24662699","dp":9426,"de":1946}},{"type":"Polygon","arcs":[[-6193,-6290,-6202,6482,-3568,6483,-6187]],"properties":{"id":"24662703","dp":7760,"de":673}},{"type":"Polygon","arcs":[[6484,-6190,-6188,-6484,-6481]],"properties":{"id":"24662704","dp":18992,"de":1162}},{"type":"Polygon","arcs":[[6485,-4995,-237,-2863]],"properties":{"id":"24661348","dp":9008,"de":969}},{"type":"Polygon","arcs":[[-4989,-6486,-2864,6486,6487]],"properties":{"id":"24661349","dp":6533,"de":0}},{"type":"Polygon","arcs":[[-4990,-6488,6488,6489]],"properties":{"id":"24661350","dp":7350,"de":964}},{"type":"Polygon","arcs":[[-6489,-6487,-2862,6490,6491]],"properties":{"id":"24661351","dp":13397,"de":3406}},{"type":"Polygon","arcs":[[6492,6493,-6195,-6288,6494]],"properties":{"id":"24662708","dp":12607,"de":1745}},{"type":"Polygon","arcs":[[-6297,-6485,-6482,-6477,6495]],"properties":{"id":"24662709","dp":6141,"de":964}},{"type":"Polygon","arcs":[[-6295,-6496,-6476,6496,6497]],"properties":{"id":"24662710","dp":8015,"de":591}},{"type":"Polygon","arcs":[[6498,-6497,-6479,-6475,-6445,6499]],"properties":{"id":"24662711","dp":6504,"de":0}},{"type":"Polygon","arcs":[[-6299,-6498,-6499,6500,-6311,-6308]],"properties":{"id":"24662712","dp":6907,"de":488}},{"type":"Polygon","arcs":[[-6427,-6501,-6500,-6444,-6435,-6431]],"properties":{"id":"24662713","dp":7611,"de":830}},{"type":"Polygon","arcs":[[6501,6502,6503,-3570,6504,6505,6506]],"properties":{"id":"24662714","dp":4649,"de":584}},{"type":"Polygon","arcs":[[-6466,-6504,6507,6508,6509]],"properties":{"id":"24662715","dp":5495,"de":0}},{"type":"Polygon","arcs":[[6510,-6508,-6503,6511,6512]],"properties":{"id":"24662716","dp":9445,"de":2103}},{"type":"Polygon","arcs":[[6513,6514,6515,6516,-6511,6517,6518]],"properties":{"id":"24662717","dp":7157,"de":2793}},{"type":"Polygon","arcs":[[-6517,6519,6520,-6509]],"properties":{"id":"24662718","dp":23720,"de":0}},{"type":"Polygon","arcs":[[-6463,-6510,-6521,6521]],"properties":{"id":"24662719","dp":18764,"de":0}},{"type":"Polygon","arcs":[[-6464,-6522,-6520,-6516,6522]],"properties":{"id":"24662720","dp":7496,"de":2034}},{"type":"Polygon","arcs":[[-6455,-6523,6523,6524]],"properties":{"id":"24662721","dp":6829,"de":2325}},{"type":"Polygon","arcs":[[6525,-6456,-6525,6526,6527,6528]],"properties":{"id":"24662722","dp":8355,"de":2088}},{"type":"Polygon","arcs":[[6529,-6527,6530,6531,6532]],"properties":{"id":"24662723","dp":10122,"de":1573}},{"type":"Polygon","arcs":[[6533,6534,-6528,-6530,6535]],"properties":{"id":"24662724","dp":8763,"de":0}},{"type":"Polygon","arcs":[[-6353,6536,6537,-6536,-6533,6538,6539,-6360,-6357]],"properties":{"id":"24662725","dp":2056,"de":2765}},{"type":"Polygon","arcs":[[6540,-6534,-6538]],"properties":{"id":"24662726","dp":8689,"de":3564}},{"type":"Polygon","arcs":[[-6535,-6541,-6537,-6352,6541,6542,-6529]],"properties":{"id":"24662727","dp":5662,"de":3899}},{"type":"Polygon","arcs":[[-6439,6543,-6542,-6351]],"properties":{"id":"24662728","dp":11821,"de":5000}},{"type":"Polygon","arcs":[[-6443,-6457,-6526,-6543,-6544]],"properties":{"id":"24662729","dp":9927,"de":1989}},{"type":"Polygon","arcs":[[-5081,-5021,6544,6545,6546,-4786]],"properties":{"id":"24661383","dp":15167,"de":14087}},{"type":"Polygon","arcs":[[6547,-6546,6548,6549]],"properties":{"id":"24661384","dp":19614,"de":4958}},{"type":"Polygon","arcs":[[6550,6551,6552,-6550,6553,6554]],"properties":{"id":"24661385","dp":9100,"de":2507}},{"type":"Polygon","arcs":[[6555,-4871,-4714,-4867,6556,-6552]],"properties":{"id":"24661386","dp":5555,"de":3917}},{"type":"Polygon","arcs":[[-4869,6557,-6553,-6557]],"properties":{"id":"24661387","dp":18056,"de":0}},{"type":"Polygon","arcs":[[6558,6559,-6548,-6558]],"properties":{"id":"24661388","dp":17000,"de":3269}},{"type":"Polygon","arcs":[[6560,-6547,-6560,-4736]],"properties":{"id":"24661389","dp":14501,"de":9965}},{"type":"Polygon","arcs":[[-4743,6561,-4784,-6561]],"properties":{"id":"24661390","dp":15266,"de":12099}},{"type":"Polygon","arcs":[[-4744,6562,-4782,-6562]],"properties":{"id":"24661391","dp":21659,"de":4148}},{"type":"Polygon","arcs":[[-4748,-4754,-4779,-6563]],"properties":{"id":"24661392","dp":19071,"de":5696}},{"type":"Polygon","arcs":[[-4735,-4737,-6559,-4868]],"properties":{"id":"24661393","dp":24794,"de":3082}},{"type":"Polygon","arcs":[[-6280,-6397,6563,-5359,6564,6565,-6425]],"properties":{"id":"24662258","dp":1732,"de":233}},{"type":"Polygon","arcs":[[-6282,-6424,-6566,6566,6567,6568,-1515,-1523,-1530,-6384,-6276]],"properties":{"id":"24662259","dp":1941,"de":140}},{"type":"Polygon","arcs":[[-6565,6569,-6567]],"properties":{"id":"24662260","dp":3077,"de":1065}},{"type":"Polygon","arcs":[[-6570,-5363,6570,-6568]],"properties":{"id":"24662261","dp":6716,"de":1198}},{"type":"Polygon","arcs":[[-5362,-5357,-5354,-3066,-1508,-6569,-6571]],"properties":{"id":"24662262","dp":1256,"de":114}},{"type":"Polygon","arcs":[[-1503,-1510,-3065,6571,6572,6573]],"properties":{"id":"24662263","dp":1981,"de":926}},{"type":"Polygon","arcs":[[-3076,6574,6575,-6572,-3064]],"properties":{"id":"24662264","dp":2928,"de":0}},{"type":"Polygon","arcs":[[-6575,-3074,6576,6577]],"properties":{"id":"24662265","dp":2289,"de":357}},{"type":"Polygon","arcs":[[6578,6579,-6573,-6576,-6578,6580,6581]],"properties":{"id":"24662266","dp":1534,"de":696}},{"type":"Polygon","arcs":[[-6581,-6577,-3073,6582,6583,6584,6585,6586]],"properties":{"id":"24662267","dp":1532,"de":188}},{"type":"Polygon","arcs":[[-6579,6587,6588,6589]],"properties":{"id":"24662268","dp":2975,"de":0}},{"type":"Polygon","arcs":[[6590,-6586,6591,6592,-5393]],"properties":{"id":"24662269","dp":5171,"de":199}},{"type":"Polygon","arcs":[[-6593,6593,6594,-5394]],"properties":{"id":"24662270","dp":4907,"de":0}},{"type":"Polygon","arcs":[[-4859,-529,6595,-4848]],"properties":{"id":"24662614","dp":9881,"de":0}},{"type":"Polygon","arcs":[[-4888,-4825,-4842,-6596,-528,-532,-535,6596,-6408,-4694,-4886,-4884]],"properties":{"id":"24662615","dp":1551,"de":3919}},{"type":"Polygon","arcs":[[6597,6598,-6365,-6540]],"properties":{"id":"24662736","dp":13797,"de":0}},{"type":"Polygon","arcs":[[6599,6600,6601,-6599]],"properties":{"id":"24662737","dp":9680,"de":1600}},{"type":"Polygon","arcs":[[-6602,6602,6603,-6362,-6366]],"properties":{"id":"24662738","dp":8241,"de":0}},{"type":"Polygon","arcs":[[-6492,6604,6605,6606,-4720,-4724,6607,6608]],"properties":{"id":"24661352","dp":3119,"de":1795}},{"type":"Polygon","arcs":[[-6490,-6609,6609,6610]],"properties":{"id":"24661353","dp":18231,"de":3231}},{"type":"Polygon","arcs":[[-6610,-6608,-4723,6611]],"properties":{"id":"24661354","dp":19464,"de":5351}},{"type":"Polygon","arcs":[[-4991,-6611,-6612,6612,-4882]],"properties":{"id":"24661355","dp":6644,"de":6469}},{"type":"Polygon","arcs":[[-6613,-4725,-4689,6613]],"properties":{"id":"24661356","dp":9520,"de":2309}},{"type":"Polygon","arcs":[[-4883,-6614,-4688,-4874]],"properties":{"id":"24661357","dp":13662,"de":1298}},{"type":"Polygon","arcs":[[-5884,-5881,-4981,-5060,-5053]],"properties":{"id":"24663083","dp":3712,"de":0}},{"type":"Polygon","arcs":[[6614,6615,6616,6617,-6603]],"properties":{"id":"24662739","dp":6662,"de":1395}},{"type":"Polygon","arcs":[[-6618,6618,6619,6620,6621]],"properties":{"id":"24662740","dp":10030,"de":1739}},{"type":"Polygon","arcs":[[6622,6623,6624,6625,-6619,-6617]],"properties":{"id":"24662741","dp":10694,"de":0}},{"type":"Polygon","arcs":[[-6626,6626,6627,6628,-6620]],"properties":{"id":"24662742","dp":11025,"de":870}},{"type":"Polygon","arcs":[[-6628,6629,6630,6631,6632]],"properties":{"id":"24662743","dp":15439,"de":0}},{"type":"Polygon","arcs":[[6633,-6621,-6629,-6633,6634,6635]],"properties":{"id":"24662744","dp":9313,"de":1991}},{"type":"Polygon","arcs":[[6636,-6636,6637]],"properties":{"id":"24662745","dp":13688,"de":825}},{"type":"Polygon","arcs":[[6638,-6638,-6635,-6632,6639,6640]],"properties":{"id":"24662746","dp":7690,"de":3548}},{"type":"Polygon","arcs":[[-6631,6641,6642,6643,-6640]],"properties":{"id":"24662747","dp":22567,"de":1234}},{"type":"Polygon","arcs":[[6644,6645,6646,6647,-6643]],"properties":{"id":"24662748","dp":11504,"de":0}},{"type":"Polygon","arcs":[[6648,6649,6650,-6644,-6648,6651,6652,6653]],"properties":{"id":"24662749","dp":10243,"de":6707}},{"type":"Polygon","arcs":[[-6654,6654,6655,6656,6657]],"properties":{"id":"24662750","dp":12246,"de":0}},{"type":"Polygon","arcs":[[-6649,-6658,6658,6659,6660]],"properties":{"id":"24662751","dp":13468,"de":0}},{"type":"Polygon","arcs":[[-6657,6661,6662,-6659]],"properties":{"id":"24662752","dp":12830,"de":0}},{"type":"Polygon","arcs":[[6663,6664,6665,-6660,-6663,6666,6667,6668]],"properties":{"id":"24662753","dp":4003,"de":2306}},{"type":"Polygon","arcs":[[-6669,6669,6670,6671,6672,6673,6674]],"properties":{"id":"24662754","dp":12857,"de":0}},{"type":"Polygon","arcs":[[6675,-6672,6676,6677]],"properties":{"id":"24662755","dp":12687,"de":0}},{"type":"Polygon","arcs":[[-6673,-6676,6678,6679,6680]],"properties":{"id":"24662756","dp":18873,"de":0}},{"type":"Polygon","arcs":[[6681,-6674,-6681,6682,6683]],"properties":{"id":"24662757","dp":15235,"de":0}},{"type":"Polygon","arcs":[[6684,-6664,-6675,-6682,6685]],"properties":{"id":"24662758","dp":13365,"de":1282}},{"type":"Polygon","arcs":[[6686,-6686,6687]],"properties":{"id":"24662759","dp":10279,"de":0}},{"type":"Polygon","arcs":[[-6688,-6684,6688,6689,6690]],"properties":{"id":"24662760","dp":17013,"de":767}},{"type":"Polygon","arcs":[[-6689,6691]],"properties":{"id":"24662761","dp":22232,"de":0}},{"type":"Polygon","arcs":[[6692,6693,-5023,-5080,-5083,6694]],"properties":{"id":"24661417","dp":13624,"de":7969}},{"type":"Polygon","arcs":[[-5794,6695,-5024,-6694]],"properties":{"id":"24661418","dp":14488,"de":4444}},{"type":"Polygon","arcs":[[-5020,-5025,-6696,-5793,-5013]],"properties":{"id":"24661419","dp":30000,"de":0}},{"type":"Polygon","arcs":[[-5082,6696,6697,-6695]],"properties":{"id":"24661420","dp":16448,"de":3877}},{"type":"Polygon","arcs":[[-5084,6698,6699,-6697]],"properties":{"id":"24661421","dp":17083,"de":3030}},{"type":"Polygon","arcs":[[-6699,-5074,6700,6701]],"properties":{"id":"24661422","dp":12876,"de":24315}},{"type":"Polygon","arcs":[[6702,-6701,-5069,6703,6704]],"properties":{"id":"24661423","dp":19588,"de":9264}},{"type":"Polygon","arcs":[[-6704,-5068,6705]],"properties":{"id":"24661424","dp":16603,"de":1904}},{"type":"Polygon","arcs":[[-6705,-6706,-5064,-5482,6706,-5483,6707,6708,6709]],"properties":{"id":"24661425","dp":10108,"de":8276}},{"type":"Polygon","arcs":[[6710,6711,6712,6713,6714]],"properties":{"id":"24662858","dp":6699,"de":1150}},{"type":"Polygon","arcs":[[-6714,6715,6716,6717]],"properties":{"id":"24662859","dp":6916,"de":967}},{"type":"Polygon","arcs":[[-6713,6718,6719,6720,6721,-6716]],"properties":{"id":"24662860","dp":8429,"de":0}},{"type":"Polygon","arcs":[[6722,-2095,-2099,6723,-6719]],"properties":{"id":"24662861","dp":5689,"de":438}},{"type":"Polygon","arcs":[[-2098,6724,6725,-6720,-6724]],"properties":{"id":"24662862","dp":4585,"de":308}},{"type":"Polygon","arcs":[[-2102,6726,6727,6728,-6725]],"properties":{"id":"24662863","dp":13131,"de":0}},{"type":"Polygon","arcs":[[-6726,-6729,6729,6730,-6721]],"properties":{"id":"24662864","dp":7819,"de":0}},{"type":"Polygon","arcs":[[6731,6732,6733,6734,-6730]],"properties":{"id":"24662865","dp":5207,"de":0}},{"type":"Polygon","arcs":[[6735,6736,-6733]],"properties":{"id":"24662866","dp":4979,"de":0}},{"type":"Polygon","arcs":[[-6728,6737,6738,6739,-6736,-6732]],"properties":{"id":"24662867","dp":4831,"de":0}},{"type":"Polygon","arcs":[[6740,-6739,6741]],"properties":{"id":"24662868","dp":3710,"de":0}},{"type":"Polygon","arcs":[[6742,6743,-5257,6744]],"properties":{"id":"24663113","dp":1103,"de":305}},{"type":"Polygon","arcs":[[-2072,-2083,6745,6746,6747,-868,-2069]],"properties":{"id":"24662830","dp":4737,"de":0}},{"type":"Polygon","arcs":[[6748,-6747,6749,6750]],"properties":{"id":"24662831","dp":5663,"de":0}},{"type":"Polygon","arcs":[[6751,-6751,6752,6753]],"properties":{"id":"24662832","dp":5790,"de":0}},{"type":"Polygon","arcs":[[6754,-6753,-6750,-6746,6755,6756]],"properties":{"id":"24662833","dp":8438,"de":0}},{"type":"Polygon","arcs":[[-2082,-2085,6757,6758,-6756]],"properties":{"id":"24662834","dp":13589,"de":0}},{"type":"Polygon","arcs":[[6759,-6757,-6759,6760,6761,6762]],"properties":{"id":"24662835","dp":6318,"de":803}},{"type":"Polygon","arcs":[[-6727,-2101,-2066,6763,-6742,-6738]],"properties":{"id":"24662869","dp":2880,"de":2304}},{"type":"Polygon","arcs":[[-2065,-2070,-873,6764,-888,-6734,-6737,-6740,-6741,-6764]],"properties":{"id":"24662870","dp":2654,"de":333}},{"type":"Polygon","arcs":[[6765,6766,6767,6768]],"properties":{"id":"24661557","dp":13272,"de":0}},{"type":"Polygon","arcs":[[6769,6770,6771,-6767]],"properties":{"id":"24661558","dp":24042,"de":2836}},{"type":"Polygon","arcs":[[6772,6773,-6771,6774]],"properties":{"id":"24661559","dp":24840,"de":0}},{"type":"Polygon","arcs":[[-6772,6775,6776,6777,6778,-6768]],"properties":{"id":"24661560","dp":18750,"de":2138}},{"type":"Polygon","arcs":[[6779,6780,-6777]],"properties":{"id":"24661561","dp":25255,"de":0}},{"type":"Polygon","arcs":[[6781,-6778,-6781,6782]],"properties":{"id":"24661562","dp":29653,"de":0}},{"type":"Polygon","arcs":[[6783,-6782,6784,6785,-5563,6786,6787,6788]],"properties":{"id":"24661563","dp":18218,"de":0}},{"type":"Polygon","arcs":[[6789,6790,-6785,-6783,-6780]],"properties":{"id":"24661564","dp":32313,"de":2313}},{"type":"Polygon","arcs":[[-6774,6791,-6790,-6776]],"properties":{"id":"24661566","dp":48333,"de":0}},{"type":"Polygon","arcs":[[6792,6793,6794,6795,6796,6797,6798,-3551,-5564,-6786,-6791,-6792,-6773]],"properties":{"id":"24661567","dp":1490,"de":5112}},{"type":"Polygon","arcs":[[6799,-6798,6800,6801]],"properties":{"id":"24661568","dp":2638,"de":303}},{"type":"Polygon","arcs":[[6802,-6801,-6797,6803]],"properties":{"id":"24661569","dp":2676,"de":254}},{"type":"Polygon","arcs":[[6804,6805,6806,6807,6808,6809,6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820]],"properties":{"id":"24662942","dp":540,"de":977}},{"type":"Polygon","arcs":[[6821,6822,6823,-6811]],"properties":{"id":"24662943","dp":5099,"de":0}},{"type":"Polygon","arcs":[[6824,6825,-6812,-6824]],"properties":{"id":"24662944","dp":5075,"de":0}},{"type":"Polygon","arcs":[[-6826,-6813]],"properties":{"id":"24662945","dp":7296,"de":0}},{"type":"Polygon","arcs":[[-6823,6826,6827,6828,-6814,-6825]],"properties":{"id":"24662946","dp":5824,"de":0}},{"type":"Polygon","arcs":[[-909,-890,6829,6830,-6828,6831]],"properties":{"id":"24662947","dp":2837,"de":439}},{"type":"Polygon","arcs":[[6832,6833,6834,-1466]],"properties":{"id":"24661672","dp":11859,"de":2743}},{"type":"Polygon","arcs":[[6835,-5436]],"properties":{"id":"24663161","dp":3638,"de":0}},{"type":"Polygon","arcs":[[-6836,-5435]],"properties":{"id":"24663162","dp":3481,"de":0}},{"type":"Polygon","arcs":[[-5656,-5664,6836,6837,6838,-5631,-5639,-5439]],"properties":{"id":"24663050","dp":1456,"de":2365}},{"type":"Polygon","arcs":[[-6839,6839,6840,-5618,-5632]],"properties":{"id":"24663051","dp":4317,"de":469}},{"type":"Polygon","arcs":[[-6841,6841,-5619]],"properties":{"id":"24663052","dp":2500,"de":0}},{"type":"MultiPolygon","arcs":[[[-6840,-6838,6842,6843,-5609,-5620,-6842]],[[6844]]],"properties":{"id":"24663053","dp":4247,"de":273}},{"type":"Polygon","arcs":[[6845,6846,-6623,-6616]],"properties":{"id":"24662802","dp":9247,"de":0}},{"type":"Polygon","arcs":[[6847,6848,6849,-6624,-6847]],"properties":{"id":"24662803","dp":9469,"de":0}},{"type":"Polygon","arcs":[[6850,-6514,6851,6852,-6615,-6601]],"properties":{"id":"24662804","dp":8281,"de":1615}},{"type":"Polygon","arcs":[[-6524,-6515,-6851,-6600,6853,-6531]],"properties":{"id":"24662805","dp":6032,"de":2526}},{"type":"Polygon","arcs":[[-6532,-6854,-6598,-6539]],"properties":{"id":"24662806","dp":14884,"de":1156}},{"type":"Polygon","arcs":[[6854,6855,6856,6857,6858,6859]],"properties":{"id":"24662807","dp":4530,"de":729}},{"type":"Polygon","arcs":[[6860,6861,6862,6863,-6860]],"properties":{"id":"24662808","dp":6016,"de":0}},{"type":"Polygon","arcs":[[6864,-6861,-6859,6865,6866]],"properties":{"id":"24662809","dp":3980,"de":717}},{"type":"Polygon","arcs":[[6867,-6866,6868,6869,6870]],"properties":{"id":"24662810","dp":3325,"de":1836}},{"type":"Polygon","arcs":[[-6870,6871,6872,6873]],"properties":{"id":"24662811","dp":6633,"de":685}},{"type":"Polygon","arcs":[[-6873,6874,6875,6876]],"properties":{"id":"24662812","dp":5492,"de":2710}},{"type":"Polygon","arcs":[[-6876,6877,-3560,6878,6879]],"properties":{"id":"24662813","dp":12181,"de":3454}},{"type":"Polygon","arcs":[[6880,-6877,-6880,6881,6882]],"properties":{"id":"24662814","dp":19191,"de":0}},{"type":"Polygon","arcs":[[6883,-6883,6884,6885,6886,6887,6888]],"properties":{"id":"24662815","dp":23152,"de":0}},{"type":"Polygon","arcs":[[6889,6890,6891,-6885,6892]],"properties":{"id":"24662816","dp":18819,"de":0}},{"type":"Polygon","arcs":[[6893,-6893,-6882,-6879,-3563,-3580]],"properties":{"id":"24662817","dp":3026,"de":2098}},{"type":"Polygon","arcs":[[-6858,6894,6895,-3561,-6878,-6875,-6872,-6869]],"properties":{"id":"24662819","dp":8716,"de":591}},{"type":"MultiPolygon","arcs":[[[-883,6896,6897,6898,-6896,6899,-871,-878]],[[6900]],[[6901]]],"properties":{"id":"24662821","dp":5191,"de":857}},{"type":"Polygon","arcs":[[6902,6903,-4241,6904,6905]],"properties":{"id":"24661485","dp":7704,"de":1130}},{"type":"Polygon","arcs":[[-3183,-2294,-6905,-4245,-1903,-3190]],"properties":{"id":"24661486","dp":12156,"de":3317}},{"type":"Polygon","arcs":[[6906,6907,-4242,-6904]],"properties":{"id":"24661487","dp":18454,"de":0}},{"type":"Polygon","arcs":[[6908,-6907,6909]],"properties":{"id":"24661488","dp":9503,"de":793}},{"type":"Polygon","arcs":[[6910,6911,-4259,-4251,-4250,-4246,-4243,-6908,-6909]],"properties":{"id":"24661489","dp":7408,"de":0}},{"type":"Polygon","arcs":[[6912,-4256,-6912,6913,6914]],"properties":{"id":"24661490","dp":11955,"de":0}},{"type":"Polygon","arcs":[[6915,-4262,-6913,6916]],"properties":{"id":"24661491","dp":5716,"de":1286}},{"type":"Polygon","arcs":[[6917,6918,-4270,-6916]],"properties":{"id":"24661492","dp":14933,"de":3833}},{"type":"Polygon","arcs":[[6919,-6762,6920,6921]],"properties":{"id":"24662836","dp":7163,"de":1242}},{"type":"Polygon","arcs":[[6922,-6763,-6920,6923]],"properties":{"id":"24662837","dp":6030,"de":0}},{"type":"Polygon","arcs":[[6924,6925,-6924]],"properties":{"id":"24662838","dp":3175,"de":0}},{"type":"Polygon","arcs":[[-3576,6926,6927,-6925,-6922,6928,6929]],"properties":{"id":"24662839","dp":1409,"de":1983}},{"type":"Polygon","arcs":[[6930,6931,6932,-6927]],"properties":{"id":"24662840","dp":9553,"de":0}},{"type":"Polygon","arcs":[[6933,6934,-6928,-6933,6935,6936,6937]],"properties":{"id":"24662841","dp":4500,"de":1416}},{"type":"Polygon","arcs":[[-6934,6938,6939]],"properties":{"id":"24662842","dp":9608,"de":0}},{"type":"Polygon","arcs":[[-6754,-6755,-6760,-6923,-6926,-6935,-6940,6940]],"properties":{"id":"24662843","dp":3677,"de":1180}},{"type":"Polygon","arcs":[[-6936,-6932,6941,6942,6943]],"properties":{"id":"24662844","dp":3318,"de":0}},{"type":"Polygon","arcs":[[6944,-6942,-6931,-3584]],"properties":{"id":"24662845","dp":5077,"de":0}},{"type":"Polygon","arcs":[[-3562,-6899,6945,-3581]],"properties":{"id":"24662848","dp":7466,"de":0}},{"type":"Polygon","arcs":[[6946,6947,6948,6949]],"properties":{"id":"24661519","dp":14224,"de":4176}},{"type":"Polygon","arcs":[[6950,6951,6952,6953,6954,-6947]],"properties":{"id":"24661520","dp":8110,"de":5381}},{"type":"Polygon","arcs":[[-3686,-4307,6955,6956,6957,-6948,-6955,6958]],"properties":{"id":"24661521","dp":7769,"de":14124}},{"type":"Polygon","arcs":[[6959,6960,-3390,-3687,-6959,6961]],"properties":{"id":"24661522","dp":9824,"de":6955}},{"type":"Polygon","arcs":[[6962,6963,6964,-6960,6965]],"properties":{"id":"24661523","dp":20044,"de":13053}},{"type":"Polygon","arcs":[[6966,6967,6968,6969,-6964,6970]],"properties":{"id":"24661524","dp":14770,"de":5045}},{"type":"Polygon","arcs":[[6971,6972,6973,6974,6975,-6968,6976,6977]],"properties":{"id":"24661525","dp":16561,"de":4731}},{"type":"Polygon","arcs":[[6978,6979,-6977,6980]],"properties":{"id":"24661526","dp":19583,"de":2604}},{"type":"Polygon","arcs":[[6981,6982,-6978,-6980]],"properties":{"id":"24661527","dp":21813,"de":0}},{"type":"Polygon","arcs":[[6983,6984,-6972,-6983]],"properties":{"id":"24661528","dp":27283,"de":2890}},{"type":"Polygon","arcs":[[6985,6986,-6985]],"properties":{"id":"24661529","dp":24125,"de":5312}},{"type":"Polygon","arcs":[[-6607,6987,6988,-6986,-6984,-6982,-6979,6989,-4721]],"properties":{"id":"24661530","dp":6718,"de":3696}},{"type":"Polygon","arcs":[[6990,6991,6992,-6973,-6987,-6989]],"properties":{"id":"24661531","dp":20208,"de":5555}},{"type":"Polygon","arcs":[[6993,6994,-3783,6995]],"properties":{"id":"24662928","dp":4422,"de":402}},{"type":"Polygon","arcs":[[6996,6997,-6994,6998,6999,7000]],"properties":{"id":"24662929","dp":3719,"de":5212}},{"type":"Polygon","arcs":[[-6995,-6998,7001,7002,-3778]],"properties":{"id":"24662930","dp":4861,"de":0}},{"type":"Polygon","arcs":[[-3779,-7003,7003,7004]],"properties":{"id":"24662931","dp":3678,"de":0}},{"type":"Polygon","arcs":[[-3657,-7005,7005,-3636,-3641,-3654]],"properties":{"id":"24662932","dp":6625,"de":0}},{"type":"Polygon","arcs":[[-6835,7006,-2256,7007,7008,7009]],"properties":{"id":"24661673","dp":15104,"de":2022}},{"type":"Polygon","arcs":[[7010,-7008,-2259,-2253,7011,-1390]],"properties":{"id":"24661674","dp":12972,"de":1380}},{"type":"Polygon","arcs":[[-1391,-7012,-3585,7012]],"properties":{"id":"24661675","dp":11932,"de":0}},{"type":"Polygon","arcs":[[-1440,-7013,-2250,7013]],"properties":{"id":"24661676","dp":18614,"de":2164}},{"type":"Polygon","arcs":[[-1441,-7014,-2252,7014]],"properties":{"id":"24661677","dp":17160,"de":0}},{"type":"Polygon","arcs":[[-1442,-7015,-2245,7015]],"properties":{"id":"24661678","dp":7049,"de":0}},{"type":"Polygon","arcs":[[-1443,-7016,-2249,-2241,7016]],"properties":{"id":"24661679","dp":3646,"de":0}},{"type":"Polygon","arcs":[[-7017,-2244,7017,-1445]],"properties":{"id":"24661680","dp":13592,"de":1219}},{"type":"Polygon","arcs":[[-7018,7018,7019,-1448]],"properties":{"id":"24661681","dp":11264,"de":1340}},{"type":"Polygon","arcs":[[-7020,7020,-1534,7021,7022]],"properties":{"id":"24661682","dp":5823,"de":608}},{"type":"Polygon","arcs":[[-1449,-7023,7023,7024]],"properties":{"id":"24661683","dp":10484,"de":2222}},{"type":"Polygon","arcs":[[-7024,-7022,7025,7026]],"properties":{"id":"24661684","dp":12403,"de":0}},{"type":"Polygon","arcs":[[-7026,-1537,7027,7028]],"properties":{"id":"24661685","dp":14946,"de":0}},{"type":"Polygon","arcs":[[-1450,-7025,-7027,-7029,7029,7030]],"properties":{"id":"24661686","dp":6037,"de":1596}},{"type":"Polygon","arcs":[[-7030,-7028,7031,7032,7033,-3491]],"properties":{"id":"24661687","dp":8422,"de":0}},{"type":"Polygon","arcs":[[-7034,7034,-1750,-3833,-3492]],"properties":{"id":"24661688","dp":3666,"de":1681}},{"type":"Polygon","arcs":[[-7033,7035,-7035]],"properties":{"id":"24661689","dp":11156,"de":0}},{"type":"Polygon","arcs":[[-1536,-1736,-1742,-1746,-7036,-7032]],"properties":{"id":"24661690","dp":4255,"de":2097}},{"type":"Polygon","arcs":[[7036,-3149,-3097,-3096,-3092,7037,-3084,-3077,-4954]],"properties":{"id":"24663054","dp":1808,"de":386}},{"type":"Polygon","arcs":[[-7038,-3094,-3087,7038,-3085]],"properties":{"id":"24663055","dp":2806,"de":0}},{"type":"Polygon","arcs":[[-3091,-3079,-3086,-7039]],"properties":{"id":"24663056","dp":3577,"de":0}},{"type":"Polygon","arcs":[[7039,7040,7041,7042,-5830]],"properties":{"id":"24661826","dp":17040,"de":3582}},{"type":"Polygon","arcs":[[-5109,7043,7044,-7042,7045]],"properties":{"id":"24661827","dp":5877,"de":1779}},{"type":"Polygon","arcs":[[-5110,-7046,-7041,7046]],"properties":{"id":"24661828","dp":14654,"de":4608}},{"type":"Polygon","arcs":[[7047,-7047,-7040,-5826,-5807,-5811,-5813]],"properties":{"id":"24661829","dp":11941,"de":5036}},{"type":"Polygon","arcs":[[7048,-5104,-5106,-7048,-5816,-5818]],"properties":{"id":"24661830","dp":13383,"de":6565}},{"type":"Polygon","arcs":[[-5492,-5486,7049,-5101,-7049,-5817]],"properties":{"id":"24661831","dp":14793,"de":3793}},{"type":"Polygon","arcs":[[7050,-5099,-7050,-5485]],"properties":{"id":"24661832","dp":19090,"de":3846}},{"type":"Polygon","arcs":[[-5484,-6707,-5481,-5100,-7051]],"properties":{"id":"24661833","dp":12399,"de":12526}},{"type":"Polygon","arcs":[[7051,7052,7053,7054,7055]],"properties":{"id":"24661457","dp":18027,"de":2916}},{"type":"Polygon","arcs":[[7056,7057,-7052]],"properties":{"id":"24661458","dp":18820,"de":3589}},{"type":"Polygon","arcs":[[7058,7059,-7058,7060]],"properties":{"id":"24661459","dp":16330,"de":4357}},{"type":"Polygon","arcs":[[7061,7062,-7053,-7060]],"properties":{"id":"24661460","dp":13878,"de":2803}},{"type":"Polygon","arcs":[[-7054,-7063,7063,7064,7065,7066]],"properties":{"id":"24661461","dp":17252,"de":2266}},{"type":"Polygon","arcs":[[7067,7068,-7066,7069]],"properties":{"id":"24661462","dp":14907,"de":2314}},{"type":"Polygon","arcs":[[-7068,7070,7071,7072,7073,7074]],"properties":{"id":"24661463","dp":11728,"de":6558}},{"type":"Polygon","arcs":[[-7074,7075,7076,7077,7078]],"properties":{"id":"24661464","dp":10497,"de":5231}},{"type":"Polygon","arcs":[[7079,7080,-7076,-7073]],"properties":{"id":"24661465","dp":12769,"de":1798}},{"type":"Polygon","arcs":[[-7081,7081,7082,7083,7084,-7077]],"properties":{"id":"24661466","dp":8604,"de":9660}},{"type":"Polygon","arcs":[[-7085,7085,7086,7087]],"properties":{"id":"24661467","dp":10199,"de":8890}},{"type":"Polygon","arcs":[[7088,7089,7090,-480,-486,-487,-497,7091,7092,7093,7094,7095,-6806,7096]],"properties":{"id":"24662905","dp":72,"de":354}},{"type":"Polygon","arcs":[[7097,7098,7099,-1400,-4665,-1396,-1405,7100,-7093]],"properties":{"id":"24662906","dp":853,"de":110}},{"type":"Polygon","arcs":[[7101,-4666,-1401,-7100]],"properties":{"id":"24662907","dp":5283,"de":0}},{"type":"Polygon","arcs":[[-683,-4664,-7102,-7099,7102]],"properties":{"id":"24662908","dp":18464,"de":0}},{"type":"Polygon","arcs":[[-3925,7103,-667,-670,-672,-676,-684,-7103,-7098,-7092,-496,-3921]],"properties":{"id":"24662909","dp":5218,"de":1097}},{"type":"Polygon","arcs":[[-656,-658,-668,-7104,-3924,-3928,-3931]],"properties":{"id":"24662910","dp":11536,"de":1696}},{"type":"Polygon","arcs":[[7104,-7089,7105,7106,7107]],"properties":{"id":"24662911","dp":1531,"de":846}},{"type":"Polygon","arcs":[[-7090,-7105,7108,7109,7110]],"properties":{"id":"24662912","dp":6269,"de":0}},{"type":"Polygon","arcs":[[-7109,7111,7112]],"properties":{"id":"24662913","dp":5594,"de":0}},{"type":"Polygon","arcs":[[7113,-7110,-7113,7114,-1159,-465,-468,-471]],"properties":{"id":"24662914","dp":4598,"de":655}},{"type":"Polygon","arcs":[[-7091,-7111,-7114,-470,-477]],"properties":{"id":"24662915","dp":6083,"de":979}},{"type":"Polygon","arcs":[[7115,7116,7117,-7115,-7112,-7108]],"properties":{"id":"24662916","dp":3201,"de":2302}},{"type":"Polygon","arcs":[[-1160,-7118,7118,7119,-1143,-1150,-1156]],"properties":{"id":"24662917","dp":3547,"de":1924}},{"type":"Polygon","arcs":[[7120,-7119,-7117,7121]],"properties":{"id":"24662918","dp":8833,"de":0}},{"type":"Polygon","arcs":[[7122,7123,7124,-4409,-3129,7125,-3559,-4492,-5573,-5566]],"properties":{"id":"24661603","dp":307,"de":4543}},{"type":"Polygon","arcs":[[-7126,-3128,7126,-3555]],"properties":{"id":"24661606","dp":27500,"de":0}},{"type":"Polygon","arcs":[[-7127,-3127,-4500,-3556]],"properties":{"id":"24661609","dp":18665,"de":0}},{"type":"Polygon","arcs":[[-4289,-3476,-4288,-595,-584,-5569]],"properties":{"id":"24661611","dp":7078,"de":5486}},{"type":"Polygon","arcs":[[7127,7128,7129,7130,-6787,-5570,-4206]],"properties":{"id":"24661614","dp":11031,"de":0}},{"type":"Polygon","arcs":[[7131,7132,-6788,-7131]],"properties":{"id":"24661615","dp":32801,"de":0}},{"type":"Polygon","arcs":[[7133,-6789,-7133]],"properties":{"id":"24661616","dp":27903,"de":3493}},{"type":"Polygon","arcs":[[7134,7135,-7130,7136]],"properties":{"id":"24661617","dp":18058,"de":0}},{"type":"Polygon","arcs":[[7137,-7137,-7129,7138]],"properties":{"id":"24661618","dp":27520,"de":1377}},{"type":"Polygon","arcs":[[-2940,-918,7139,7140,-4457]],"properties":{"id":"24661619","dp":4711,"de":1334}},{"type":"Polygon","arcs":[[-7004,-7002,7141,7142,-3635,-7006]],"properties":{"id":"24662933","dp":1588,"de":2410}},{"type":"Polygon","arcs":[[7143,7144,7145,-7143]],"properties":{"id":"24662934","dp":2106,"de":0}},{"type":"Polygon","arcs":[[7146,-1127,-3623,-3629,-3465,-3632,-7146]],"properties":{"id":"24662935","dp":982,"de":375}},{"type":"Polygon","arcs":[[7147,7148,7149,7150]],"properties":{"id":"24661636","dp":10835,"de":1284}},{"type":"Polygon","arcs":[[7151,7152,7153,-7148]],"properties":{"id":"24661637","dp":10254,"de":5090}},{"type":"Polygon","arcs":[[7154,7155,-7153,7156]],"properties":{"id":"24661638","dp":14758,"de":0}},{"type":"Polygon","arcs":[[7157,7158,7159,-7155,7160,7161]],"properties":{"id":"24661639","dp":10641,"de":2540}},{"type":"Polygon","arcs":[[7162,7163,7164,-7158,7165]],"properties":{"id":"24661640","dp":16422,"de":4743}},{"type":"Polygon","arcs":[[7166,7167,7168,-7163,7169,7170]],"properties":{"id":"24661641","dp":13275,"de":3658}},{"type":"Polygon","arcs":[[7171,7172,-7167,7173]],"properties":{"id":"24661642","dp":14177,"de":1973}},{"type":"Polygon","arcs":[[7174,7175,7176,-7172]],"properties":{"id":"24661643","dp":14590,"de":1803}},{"type":"Polygon","arcs":[[7177,7178,7179,-7176]],"properties":{"id":"24661644","dp":15390,"de":1950}},{"type":"Polygon","arcs":[[-7087,7180,-7179,7181]],"properties":{"id":"24661645","dp":19844,"de":3115}},{"type":"Polygon","arcs":[[7182,-7182,7183,7184]],"properties":{"id":"24661646","dp":11585,"de":2743}},{"type":"Polygon","arcs":[[-7078,-7088,-7183,7185]],"properties":{"id":"24661647","dp":12103,"de":5469}},{"type":"Polygon","arcs":[[7186,-7184,-7178,7187]],"properties":{"id":"24661648","dp":15555,"de":2083}},{"type":"Polygon","arcs":[[7188,-7188,-7175,7189]],"properties":{"id":"24661649","dp":13627,"de":6372}},{"type":"Polygon","arcs":[[-7190,-7174,7190,7191]],"properties":{"id":"24661650","dp":14983,"de":2786}},{"type":"Polygon","arcs":[[-7191,-7171,7192,7193]],"properties":{"id":"24661651","dp":16678,"de":1384}},{"type":"Polygon","arcs":[[-7193,-7170,7194,7195]],"properties":{"id":"24661652","dp":13893,"de":2666}},{"type":"Polygon","arcs":[[-7195,-7166,7196,7197,7198]],"properties":{"id":"24661653","dp":11914,"de":3710}},{"type":"Polygon","arcs":[[-7197,-7162,7199,7200,7201]],"properties":{"id":"24661654","dp":15430,"de":2049}},{"type":"Polygon","arcs":[[-7200,-7161,7202,7203]],"properties":{"id":"24661655","dp":15183,"de":0}},{"type":"Polygon","arcs":[[-1501,-7203,-7157,7204]],"properties":{"id":"24661656","dp":13046,"de":1562}},{"type":"Polygon","arcs":[[-7205,-7152,7205,-1497]],"properties":{"id":"24661657","dp":14362,"de":2684}},{"type":"Polygon","arcs":[[-7206,-7151,7206,-1492]],"properties":{"id":"24661658","dp":11503,"de":2534}},{"type":"Polygon","arcs":[[-7207,7207,7208,7209,-5762,-5760]],"properties":{"id":"24661659","dp":9249,"de":1657}},{"type":"Polygon","arcs":[[-7084,7210,7211,7212,-7086]],"properties":{"id":"24661468","dp":8863,"de":7410}},{"type":"Polygon","arcs":[[7213,7214,-7181,-7213]],"properties":{"id":"24661469","dp":14171,"de":4294}},{"type":"Polygon","arcs":[[-7180,-7215,7215,7216]],"properties":{"id":"24661470","dp":13006,"de":2972}},{"type":"Polygon","arcs":[[-7177,-7217,7217,7218]],"properties":{"id":"24661471","dp":12579,"de":3184}},{"type":"Polygon","arcs":[[-7219,7219,7220,-7173]],"properties":{"id":"24661472","dp":12709,"de":2580}},{"type":"Polygon","arcs":[[-7221,7221,7222,-7168]],"properties":{"id":"24661473","dp":9940,"de":6804}},{"type":"Polygon","arcs":[[-7169,-7223,7223,7224]],"properties":{"id":"24661474","dp":14274,"de":2745}},{"type":"Polygon","arcs":[[-7164,-7225,7225,7226]],"properties":{"id":"24661475","dp":13307,"de":3149}},{"type":"Polygon","arcs":[[-7165,-7227,7227,7228]],"properties":{"id":"24661476","dp":13065,"de":0}},{"type":"Polygon","arcs":[[-7229,7229,7230,7231,-7159]],"properties":{"id":"24661477","dp":14345,"de":2182}},{"type":"Polygon","arcs":[[-7232,7232,7233,-7160]],"properties":{"id":"24661478","dp":16908,"de":4389}},{"type":"Polygon","arcs":[[-7234,7234,-6918,7235,-7154,-7156]],"properties":{"id":"24661479","dp":14762,"de":1939}},{"type":"Polygon","arcs":[[-7149,-7236,-6917,7236,7237]],"properties":{"id":"24661480","dp":8243,"de":3399}},{"type":"Polygon","arcs":[[7238,-7237,-6915,7239,7240]],"properties":{"id":"24661481","dp":12135,"de":1941}},{"type":"Polygon","arcs":[[7241,-7240,-6914,-6911,7242,7243]],"properties":{"id":"24661482","dp":12693,"de":2552}},{"type":"Polygon","arcs":[[-7244,7244,7245,7246,7247]],"properties":{"id":"24661483","dp":8645,"de":1181}},{"type":"Polygon","arcs":[[-7243,-6910,-6903,-7245]],"properties":{"id":"24661484","dp":11379,"de":1819}},{"type":"Polygon","arcs":[[-5114,-5120,-5126,7248,7249,7250,-7044,-5108]],"properties":{"id":"24661966","dp":7873,"de":3232}},{"type":"Polygon","arcs":[[7251,7252,7253,7254,7255,-7251,7256,7257,7258,-7198,7259]],"properties":{"id":"24661967","dp":3177,"de":3564}},{"type":"Polygon","arcs":[[-7252,7260,7261,7262,7263]],"properties":{"id":"24661968","dp":13015,"de":2763}},{"type":"Polygon","arcs":[[7264,-7263,7265,7266,7267]],"properties":{"id":"24661969","dp":18865,"de":2835}},{"type":"Polygon","arcs":[[-7254,7268,-7268,7269,7270,7271,7272]],"properties":{"id":"24661970","dp":11617,"de":5024}},{"type":"Polygon","arcs":[[7273,-7270,-7267,-1502,-1495,-5753]],"properties":{"id":"24661971","dp":13829,"de":4255}},{"type":"Polygon","arcs":[[-6745,-5256,-5250,-5246,-5240,7274]],"properties":{"id":"24663114","dp":1217,"de":108}},{"type":"Polygon","arcs":[[7275,-5254,7276,7277,-6743,-7275,-5239,7278]],"properties":{"id":"24663115","dp":693,"de":123}},{"type":"Polygon","arcs":[[7279,7280,7281,-6414,-6412]],"properties":{"id":"24662579","dp":7222,"de":3378}},{"type":"Polygon","arcs":[[7282,7283,7284,-7280,-6411,7285]],"properties":{"id":"24662580","dp":8328,"de":3391}},{"type":"Polygon","arcs":[[-547,7286,-7283,7287]],"properties":{"id":"24662581","dp":11340,"de":1250}},{"type":"Polygon","arcs":[[-2357,7288,7289,7290,-7284,-7287]],"properties":{"id":"24662582","dp":10340,"de":2086}},{"type":"Polygon","arcs":[[-548,-7288,-7286,-6410,7291]],"properties":{"id":"24662583","dp":6255,"de":755}},{"type":"Polygon","arcs":[[-538,-7292,-6409,-6597]],"properties":{"id":"24662584","dp":9332,"de":1824}},{"type":"Polygon","arcs":[[-6364,7292,-6637,-6639,7293,7294,-1651,-3588]],"properties":{"id":"24662967","dp":1778,"de":3217}},{"type":"Polygon","arcs":[[-6363,-6604,-6622,-6634,-7293]],"properties":{"id":"24662968","dp":7128,"de":0}},{"type":"Polygon","arcs":[[-1216,7295,-1629,-1633,-1637,-1641,-1647,-1652,7296,-1624]],"properties":{"id":"24662969","dp":657,"de":2500}},{"type":"Polygon","arcs":[[-1630,-7296,-1215,-1429]],"properties":{"id":"24662970","dp":11054,"de":1318}},{"type":"Polygon","arcs":[[7297,7298,-6305,-6426,-6345,7299]],"properties":{"id":"24662971","dp":9022,"de":0}},{"type":"Polygon","arcs":[[-1828,-4920,-4922,-4924,-4925,-4927,7300,-4932,7301]],"properties":{"id":"24662972","dp":4122,"de":3140}},{"type":"Polygon","arcs":[[-7302,-4931,-7300,-1829]],"properties":{"id":"24662973","dp":6364,"de":1612}},{"type":"Polygon","arcs":[[7302,7303,7304,-7298,-4930]],"properties":{"id":"24662974","dp":9606,"de":0}},{"type":"Polygon","arcs":[[7305,7306,7307,-7304]],"properties":{"id":"24662975","dp":11605,"de":0}},{"type":"Polygon","arcs":[[-7308,7308,7309,7310,-6303,-6306,-7299,-7305]],"properties":{"id":"24662976","dp":2804,"de":0}},{"type":"Polygon","arcs":[[-7307,7311,7312,-7309]],"properties":{"id":"24662977","dp":8587,"de":0}},{"type":"Polygon","arcs":[[7313,7314,-7312,7315]],"properties":{"id":"24662978","dp":8765,"de":2839}},{"type":"Polygon","arcs":[[7316,7317,-7316,-7306,-7303,-4935,-4940]],"properties":{"id":"24662979","dp":5790,"de":604}},{"type":"Polygon","arcs":[[7318,7319,-4892,-4896,-4117,-4118]],"properties":{"id":"24662980","dp":13309,"de":0}},{"type":"Polygon","arcs":[[-4320,-3796,-4893,-7320,7320,-4129,-4131]],"properties":{"id":"24662981","dp":3753,"de":531}},{"type":"Polygon","arcs":[[-7321,-7319,-4121,-4125]],"properties":{"id":"24662982","dp":21013,"de":1843}},{"type":"Polygon","arcs":[[7321,7322,7323,7324]],"properties":{"id":"24662983","dp":4104,"de":0}},{"type":"Polygon","arcs":[[7325,7326,-7322,7327,7328,-5978]],"properties":{"id":"24662984","dp":694,"de":59}},{"type":"Polygon","arcs":[[7329,7330,7331,-6804,-6796]],"properties":{"id":"24661570","dp":1675,"de":646}},{"type":"Polygon","arcs":[[7332,7333,7334,7335,-7330,-6795]],"properties":{"id":"24661571","dp":3139,"de":419}},{"type":"Polygon","arcs":[[7336,-7335,7337,7338]],"properties":{"id":"24661572","dp":8257,"de":891}},{"type":"Polygon","arcs":[[-6605,-6491,-2861,7339,7340,-7339,7341]],"properties":{"id":"24661573","dp":4632,"de":2777}},{"type":"Polygon","arcs":[[7342,7343,7344,-7331,-7336,-7337,-7341]],"properties":{"id":"24661574","dp":3764,"de":329}},{"type":"Polygon","arcs":[[7345,-7332,-7345,7346]],"properties":{"id":"24661575","dp":6144,"de":652}},{"type":"Polygon","arcs":[[7347,7348,7349,-7347,-7344]],"properties":{"id":"24661576","dp":5741,"de":1770}},{"type":"Polygon","arcs":[[-7350,7350,7351,7352,-6803,-7346]],"properties":{"id":"24661577","dp":4896,"de":1349}},{"type":"Polygon","arcs":[[7353,7354,7355,7356,-7352]],"properties":{"id":"24661578","dp":3561,"de":2340}},{"type":"Polygon","arcs":[[7357,7358,7359,-7355,7360]],"properties":{"id":"24661579","dp":13350,"de":2094}},{"type":"Polygon","arcs":[[7361,7362,-7361,-7354,-7351,7363]],"properties":{"id":"24661580","dp":5877,"de":1084}},{"type":"Polygon","arcs":[[-917,7364,-7364,-7349,7365,-7140]],"properties":{"id":"24661581","dp":2279,"de":1302}},{"type":"Polygon","arcs":[[-921,-937,7366,-7362,-7365,-916]],"properties":{"id":"24661582","dp":3033,"de":380}},{"type":"Polygon","arcs":[[7367,7368,7369,7370,7371,7372,7373,7374,7375,-397,7376]],"properties":{"id":"24662067","dp":0,"de":4307}},{"type":"Polygon","arcs":[[7377,7378,-384,7379]],"properties":{"id":"24662069","dp":13885,"de":0}},{"type":"Polygon","arcs":[[7380,7381,7382,-7378,7383,7384]],"properties":{"id":"24662070","dp":13016,"de":0}},{"type":"Polygon","arcs":[[7385,7386,7387,-7381]],"properties":{"id":"24662071","dp":23709,"de":0}},{"type":"Polygon","arcs":[[-7278,7388,-5252,-5258,-6744]],"properties":{"id":"24663116","dp":1197,"de":230}},{"type":"Polygon","arcs":[[-7277,-5253,-7389]],"properties":{"id":"24663117","dp":1178,"de":0}},{"type":"Polygon","arcs":[[-6113,-5255,-7276,7389,7390,7391,7392,7393,-5145,-5148,7394,-5172],[-5151,-5152]],"properties":{"id":"24663118","dp":122,"de":297}},{"type":"Polygon","arcs":[[-5138,-5146,-7394,7395]],"properties":{"id":"24663119","dp":1488,"de":3982}},{"type":"Polygon","arcs":[[7396,-5139,-7396,-7393,7397]],"properties":{"id":"24663120","dp":3795,"de":596}},{"type":"Polygon","arcs":[[-7398,-7392,7398]],"properties":{"id":"24663121","dp":3712,"de":1164}},{"type":"Polygon","arcs":[[-7399,-7391,7399,-5140,-7397]],"properties":{"id":"24663122","dp":3883,"de":2478}},{"type":"Polygon","arcs":[[-6114,7400,-5167,-5169,-5165,-5878,-5870,-5184,-6117]],"properties":{"id":"24663407","dp":1668,"de":0}},{"type":"Polygon","arcs":[[-5399,-3436]],"properties":{"id":"24663164","dp":2687,"de":1734}},{"type":"Polygon","arcs":[[-5448,7401,-5445,-5451,7402,7403,-5453,-3438,-5398,7404,7405,7406]],"properties":{"id":"24663166","dp":1449,"de":3685}},{"type":"Polygon","arcs":[[7407,-7405,-5397,7408,7409]],"properties":{"id":"24663167","dp":2844,"de":0}},{"type":"Polygon","arcs":[[-5441,-7402,-5447]],"properties":{"id":"24663168","dp":3333,"de":542}},{"type":"Polygon","arcs":[[7410,-4272,-4271,-6919,-7235,-7233]],"properties":{"id":"24661493","dp":14917,"de":1543}},{"type":"Polygon","arcs":[[7411,-4101,-7411,-7231]],"properties":{"id":"24661494","dp":31176,"de":0}},{"type":"Polygon","arcs":[[7412,-4105,-7412,-7230]],"properties":{"id":"24661495","dp":16679,"de":3754}},{"type":"Polygon","arcs":[[7413,-4108,-7413,-7228]],"properties":{"id":"24661496","dp":13100,"de":2131}},{"type":"Polygon","arcs":[[7414,7415,7416,-7387]],"properties":{"id":"24662072","dp":24268,"de":0}},{"type":"Polygon","arcs":[[7417,7418,7419,7420,-7416,7421,7422,7423,7424]],"properties":{"id":"24662073","dp":10919,"de":4245}},{"type":"Polygon","arcs":[[7425,7426,7427,7428,-7417,-7421]],"properties":{"id":"24662074","dp":13825,"de":1663}},{"type":"Polygon","arcs":[[-7429,7429,7430,-7388]],"properties":{"id":"24662075","dp":20565,"de":0}},{"type":"Polygon","arcs":[[-7431,7431,7432,-7382]],"properties":{"id":"24662076","dp":15990,"de":0}},{"type":"Polygon","arcs":[[-7383,-7433,7433,-385,-7379]],"properties":{"id":"24662077","dp":12444,"de":0}},{"type":"Polygon","arcs":[[7434,7435,-1388,-390]],"properties":{"id":"24662078","dp":14730,"de":0}},{"type":"Polygon","arcs":[[-1454,-1467,-7010,7436,-7435,-389]],"properties":{"id":"24662079","dp":10897,"de":1201}},{"type":"Polygon","arcs":[[-7437,-7009,-7011,-1389,-7436]],"properties":{"id":"24662080","dp":11847,"de":2653}},{"type":"Polygon","arcs":[[-5713,-5716,7437,7438]],"properties":{"id":"24661798","dp":15497,"de":6544}},{"type":"Polygon","arcs":[[-5714,-7439,7439,7440,-5709]],"properties":{"id":"24661799","dp":23933,"de":3080}},{"type":"Polygon","arcs":[[-5710,-7441,7441,7442]],"properties":{"id":"24661800","dp":25858,"de":0}},{"type":"Polygon","arcs":[[-5707,-7443,7443,7444,-5701]],"properties":{"id":"24661801","dp":7223,"de":3251}},{"type":"Polygon","arcs":[[7445,7446,7447,7448,-7444]],"properties":{"id":"24661802","dp":8200,"de":2197}},{"type":"Polygon","arcs":[[-7446,-7442,7449,7450]],"properties":{"id":"24661803","dp":24945,"de":2472}},{"type":"Polygon","arcs":[[-7440,7451,7452,7453,-7450]],"properties":{"id":"24661804","dp":20105,"de":4577}},{"type":"Polygon","arcs":[[-7438,7454,7455,-7452]],"properties":{"id":"24661805","dp":17472,"de":2361}},{"type":"Polygon","arcs":[[-5715,-5033,7456,7457,-7455]],"properties":{"id":"24661806","dp":18461,"de":3974}},{"type":"Polygon","arcs":[[-7453,-7456,-7458,7458,7459,7460]],"properties":{"id":"24661807","dp":19787,"de":4416}},{"type":"Polygon","arcs":[[-7454,-7461,7461,7462,7463,7464]],"properties":{"id":"24661808","dp":18647,"de":4713}},{"type":"Polygon","arcs":[[-7451,-7465,7465,-7447]],"properties":{"id":"24661809","dp":10440,"de":2422}},{"type":"Polygon","arcs":[[-7464,7466,7467,7468,7469,-7448,-7466]],"properties":{"id":"24661810","dp":9196,"de":6551}},{"type":"Polygon","arcs":[[-7467,-7463,7470,7471]],"properties":{"id":"24661811","dp":18634,"de":3614}},{"type":"Polygon","arcs":[[-7471,-7462,-7460,7472,7473]],"properties":{"id":"24661812","dp":19173,"de":3512}},{"type":"Polygon","arcs":[[-7473,-7459,7474,7475]],"properties":{"id":"24661813","dp":15366,"de":8494}},{"type":"Polygon","arcs":[[-7475,-7457,7476,7477,7478,7479]],"properties":{"id":"24661814","dp":12566,"de":3318}},{"type":"Polygon","arcs":[[-5032,7480,-7477]],"properties":{"id":"24661815","dp":15734,"de":7109}},{"type":"Polygon","arcs":[[7481,7482,-7481,-5031]],"properties":{"id":"24661816","dp":11709,"de":7952}},{"type":"Polygon","arcs":[[-5835,-5823,-5829,7483,7484,-7482]],"properties":{"id":"24661817","dp":12057,"de":5199}},{"type":"Polygon","arcs":[[-7485,7485,-7478,-7483]],"properties":{"id":"24661818","dp":20765,"de":0}},{"type":"Polygon","arcs":[[7486,7487,7488,7489,-7486]],"properties":{"id":"24661819","dp":17472,"de":3296}},{"type":"Polygon","arcs":[[-5828,-5833,7490,7491,7492,-7487,-7484]],"properties":{"id":"24661820","dp":12617,"de":5679}},{"type":"Polygon","arcs":[[-7493,7493,-7273,7494,-7488]],"properties":{"id":"24661821","dp":11378,"de":4407}},{"type":"Polygon","arcs":[[7495,7496,-939,-946,7497,7498]],"properties":{"id":"24661592","dp":3003,"de":0}},{"type":"Polygon","arcs":[[-945,7499,-7498]],"properties":{"id":"24661593","dp":9223,"de":0}},{"type":"Polygon","arcs":[[-7360,7500,-7499,-7500,-944,-3549,7501]],"properties":{"id":"24661594","dp":5594,"de":471}},{"type":"Polygon","arcs":[[-7356,-7502,-3554,7502]],"properties":{"id":"24661595","dp":3869,"de":455}},{"type":"Polygon","arcs":[[-7353,-7357,-7503,-3553,7503,-6802]],"properties":{"id":"24661597","dp":3066,"de":400}},{"type":"Polygon","arcs":[[-7504,-3552,-6799,-6800]],"properties":{"id":"24661598","dp":3017,"de":361}},{"type":"Polygon","arcs":[[7504,-4111,-7414,-7226]],"properties":{"id":"24661497","dp":13043,"de":1976}},{"type":"Polygon","arcs":[[7505,-4119,-4115,-4112,-7505,-7224,-7222]],"properties":{"id":"24661498","dp":5474,"de":23734}},{"type":"Polygon","arcs":[[-7506,-7220,-7218,-7216,7506,-4126,-4122]],"properties":{"id":"24661499","dp":10355,"de":1601}},{"type":"Polygon","arcs":[[7507,-4135,-4132,-4127,-7507,-7214,-7212]],"properties":{"id":"24661500","dp":8146,"de":4517}},{"type":"Polygon","arcs":[[-7508,-7211,7508,7509,-4136]],"properties":{"id":"24661501","dp":12047,"de":6428}},{"type":"Polygon","arcs":[[7510,7511,-4143,-7510,7512]],"properties":{"id":"24661502","dp":13410,"de":1589}},{"type":"Polygon","arcs":[[7513,-7513,-7509,-7083,7514]],"properties":{"id":"24661503","dp":14649,"de":3184}},{"type":"Polygon","arcs":[[7515,-4149,7516,-7511,-7514,7517]],"properties":{"id":"24661504","dp":15988,"de":8720}},{"type":"Polygon","arcs":[[-7517,-4146,-4139,-7512]],"properties":{"id":"24661505","dp":18595,"de":0}},{"type":"Polygon","arcs":[[7518,7519,-4152,-7516,7520]],"properties":{"id":"24661506","dp":19589,"de":5479}},{"type":"Polygon","arcs":[[7521,-4302,-4299,-7520,7522]],"properties":{"id":"24661507","dp":14609,"de":4687}},{"type":"Polygon","arcs":[[-6956,-4305,-7522,7523]],"properties":{"id":"24661508","dp":12172,"de":1114}},{"type":"Polygon","arcs":[[-6957,-7524,7524,7525,7526]],"properties":{"id":"24661509","dp":12715,"de":5387}},{"type":"Polygon","arcs":[[-7525,-7523,-7519,7527]],"properties":{"id":"24661510","dp":15028,"de":3693}},{"type":"Polygon","arcs":[[7528,-7521,-7518,-7515,-7082,-7080,-7072]],"properties":{"id":"24661513","dp":11255,"de":36595}},{"type":"Polygon","arcs":[[-7065,7529,7530,7531,-7071,-7070]],"properties":{"id":"24661514","dp":11062,"de":6941}},{"type":"Polygon","arcs":[[-7062,-7059,7532,7533,7534,-7530,-7064]],"properties":{"id":"24661515","dp":11259,"de":3827}},{"type":"Polygon","arcs":[[7535,7536,7537,-7533,7538]],"properties":{"id":"24661516","dp":13723,"de":7040}},{"type":"Polygon","arcs":[[-6951,-6950,7539,-7537,7540]],"properties":{"id":"24661517","dp":13107,"de":6265}},{"type":"Polygon","arcs":[[-7534,-7538,-7540,-6949,-6958,-7527,7541]],"properties":{"id":"24661518","dp":10919,"de":11069}},{"type":"Polygon","arcs":[[-5925,-1470,7542,7543]],"properties":{"id":"24661997","dp":11583,"de":1583}},{"type":"Polygon","arcs":[[-7543,-1469,7544,7545]],"properties":{"id":"24661998","dp":14210,"de":0}},{"type":"Polygon","arcs":[[7546,-7545,-1468,-1456,7547,7548]],"properties":{"id":"24661999","dp":13684,"de":1258}},{"type":"Polygon","arcs":[[7549,-7548,-1458,-1451,7550,7551]],"properties":{"id":"24662000","dp":13549,"de":1267}},{"type":"Polygon","arcs":[[7552,-7551,-1455,-388,7553]],"properties":{"id":"24662001","dp":15687,"de":0}},{"type":"Polygon","arcs":[[7554,7555,-7552,-7553,7556,7557]],"properties":{"id":"24662002","dp":16578,"de":2359}},{"type":"Polygon","arcs":[[-7557,-7554,-387,7558]],"properties":{"id":"24662003","dp":13910,"de":0}},{"type":"Polygon","arcs":[[7559,-7558,-7559,-386,-7434]],"properties":{"id":"24662004","dp":13737,"de":2706}},{"type":"Polygon","arcs":[[7560,7561,-7555,-7560,-7432]],"properties":{"id":"24662005","dp":16012,"de":1446}},{"type":"Polygon","arcs":[[-7428,7562,7563,7564,-7561,-7430]],"properties":{"id":"24662006","dp":17889,"de":1623}},{"type":"Polygon","arcs":[[-4458,-7141,-7366,-7348,-7343,-7340,-2860,-2847]],"properties":{"id":"24661620","dp":4479,"de":445}},{"type":"Polygon","arcs":[[-6990,7565,7566,7567,-6966,-6962,-6954,7568,-4727]],"properties":{"id":"24661621","dp":7933,"de":23795}},{"type":"Polygon","arcs":[[-6606,-7342,-7338,-7334,-6991,-6988]],"properties":{"id":"24661532","dp":2209,"de":4562}},{"type":"Polygon","arcs":[[-7333,7569,7570,7571,-6992]],"properties":{"id":"24661533","dp":22113,"de":2303}},{"type":"Polygon","arcs":[[-6993,-7572,7572,7573]],"properties":{"id":"24661534","dp":20646,"de":2985}},{"type":"Polygon","arcs":[[-6974,-7574,7574,7575]],"properties":{"id":"24661535","dp":23657,"de":2777}},{"type":"Polygon","arcs":[[-6975,-7576,7576,7577]],"properties":{"id":"24661536","dp":23127,"de":2132}},{"type":"Polygon","arcs":[[-6976,-7578,7578,7579]],"properties":{"id":"24661537","dp":24251,"de":3140}},{"type":"Polygon","arcs":[[-6969,-7580,7580,7581]],"properties":{"id":"24661538","dp":20189,"de":2606}},{"type":"Polygon","arcs":[[-6970,-7582,7582,7583]],"properties":{"id":"24661539","dp":24692,"de":2192}},{"type":"Polygon","arcs":[[-6965,-7584,7584,-6961]],"properties":{"id":"24661540","dp":25922,"de":0}},{"type":"Polygon","arcs":[[-7585,7585,-3391]],"properties":{"id":"24661541","dp":26096,"de":2673}},{"type":"Polygon","arcs":[[7586,7587,-7586,-7583]],"properties":{"id":"24661542","dp":18052,"de":0}},{"type":"Polygon","arcs":[[-7581,7588,7589,-7587]],"properties":{"id":"24661543","dp":21771,"de":0}},{"type":"Polygon","arcs":[[-7579,7590,7591,-7589]],"properties":{"id":"24661544","dp":21511,"de":2616}},{"type":"Polygon","arcs":[[-7575,7592,7593,-7591,-7577]],"properties":{"id":"24661545","dp":17464,"de":1424}},{"type":"Polygon","arcs":[[-7571,7594,7595,7596,-7593,-7573]],"properties":{"id":"24661546","dp":15792,"de":0}},{"type":"Polygon","arcs":[[-7570,-6794,7597,-7595]],"properties":{"id":"24661547","dp":37974,"de":0}},{"type":"Polygon","arcs":[[-7598,-6793,-6775,-6770,7598,-7596]],"properties":{"id":"24661548","dp":18980,"de":0}},{"type":"Polygon","arcs":[[-7597,-7599,-6766,7599,7600,-7594]],"properties":{"id":"24661549","dp":11074,"de":2399}},{"type":"Polygon","arcs":[[-7601,7601,7602,-7592]],"properties":{"id":"24661550","dp":20568,"de":0}},{"type":"Polygon","arcs":[[-7590,-7603,7603,-3392,-7588]],"properties":{"id":"24661551","dp":13873,"de":2747}},{"type":"Polygon","arcs":[[7604,-7139,-7128,-4205,-3393]],"properties":{"id":"24661554","dp":9649,"de":2192}},{"type":"Polygon","arcs":[[7605,-7135,-7138,-7605,-7604]],"properties":{"id":"24661555","dp":19215,"de":1260}},{"type":"Polygon","arcs":[[-7600,-6769,-6779,-6784,-7134,-7132,-7136,-7606,-7602]],"properties":{"id":"24661556","dp":6867,"de":1040}},{"type":"Polygon","arcs":[[7606,7607,7608]],"properties":{"id":"24662030","dp":21111,"de":2263}},{"type":"Polygon","arcs":[[-7489,7609,-7608,7610]],"properties":{"id":"24662031","dp":15163,"de":3485}},{"type":"Polygon","arcs":[[-7271,-7274,-5758,-5890,-5892,-5900,7611,7612]],"properties":{"id":"24662032","dp":2764,"de":6921}},{"type":"Polygon","arcs":[[-7253,-7264,-7265,-7269]],"properties":{"id":"24662033","dp":14688,"de":2564}},{"type":"Polygon","arcs":[[7613,-7418,7614]],"properties":{"id":"24662034","dp":16629,"de":0}},{"type":"Polygon","arcs":[[7615,7616,-7615,-7425,7617,7618]],"properties":{"id":"24662035","dp":17830,"de":0}},{"type":"Polygon","arcs":[[-7618,-7424,7619,7620]],"properties":{"id":"24662036","dp":11662,"de":0}},{"type":"Polygon","arcs":[[-6250,7621,-7619,-7621,7622,7623]],"properties":{"id":"24662037","dp":13612,"de":1076}},{"type":"Polygon","arcs":[[7624,-7623,-7620,-7423,7625,7626]],"properties":{"id":"24662038","dp":12873,"de":0}},{"type":"Polygon","arcs":[[-7626,-7422,-7415,7627]],"properties":{"id":"24662039","dp":8935,"de":0}},{"type":"Polygon","arcs":[[-7627,-7628,-7386,7628,7629]],"properties":{"id":"24662040","dp":14587,"de":899}},{"type":"Polygon","arcs":[[7630,-7629,-7385,7631,7632]],"properties":{"id":"24662041","dp":12411,"de":1996}},{"type":"Polygon","arcs":[[-7632,-7384,-7380,-383,7633,7634]],"properties":{"id":"24662042","dp":8479,"de":1305}},{"type":"Polygon","arcs":[[7635,-7634,-7376,7636]],"properties":{"id":"24662043","dp":11617,"de":0}},{"type":"Polygon","arcs":[[-7492,7637,7638,-7255,-7494]],"properties":{"id":"24661822","dp":11670,"de":1354}},{"type":"Polygon","arcs":[[-7491,7639,-7638]],"properties":{"id":"24661823","dp":18630,"de":1712}},{"type":"Polygon","arcs":[[-5832,7640,-7045,-7256,-7639,-7640]],"properties":{"id":"24661824","dp":16313,"de":2120}},{"type":"Polygon","arcs":[[-7043,-7641,-5831]],"properties":{"id":"24661825","dp":16491,"de":3333}},{"type":"Polygon","arcs":[[-6594,-6592,-6585,7641,7642,7643]],"properties":{"id":"24662271","dp":3162,"de":370}},{"type":"Polygon","arcs":[[-6595,-7644,7644,-5395]],"properties":{"id":"24662272","dp":4295,"de":939}},{"type":"Polygon","arcs":[[7645,-7409,-5396,-7645,-7643,7646]],"properties":{"id":"24662273","dp":2869,"de":0}},{"type":"Polygon","arcs":[[7647,7648,-7647,-7642,-6584]],"properties":{"id":"24662274","dp":3347,"de":277}},{"type":"Polygon","arcs":[[-3072,7649,7650,-7648,-6583]],"properties":{"id":"24662275","dp":2304,"de":0}},{"type":"Polygon","arcs":[[7651,7652,-3712,-1269]],"properties":{"id":"24661940","dp":17157,"de":11710}},{"type":"Polygon","arcs":[[7653,7654,7655,-7653]],"properties":{"id":"24661941","dp":19380,"de":3925}},{"type":"Polygon","arcs":[[7656,7657,-1287,-5796,7658,7659,-7654]],"properties":{"id":"24661942","dp":2428,"de":18450}},{"type":"Polygon","arcs":[[7660,-7657,-7652,-1274]],"properties":{"id":"24661943","dp":16448,"de":13620}},{"type":"Polygon","arcs":[[-1280,-1283,-1288,-7658,-7661,-1273]],"properties":{"id":"24661944","dp":13028,"de":35981}},{"type":"Polygon","arcs":[[-7660,7661,7662,-7655]],"properties":{"id":"24661945","dp":16238,"de":4867}},{"type":"Polygon","arcs":[[-3713,-7656,-7663,7663,7664,7665]],"properties":{"id":"24661946","dp":10887,"de":15614}},{"type":"Polygon","arcs":[[-7665,7666,7667,7668,7669]],"properties":{"id":"24661947","dp":18826,"de":2826}},{"type":"Polygon","arcs":[[-7666,-7670,7670,7671,-3709]],"properties":{"id":"24661948","dp":14350,"de":6638}},{"type":"Polygon","arcs":[[-7671,-7669,7672,7673]],"properties":{"id":"24661949","dp":16658,"de":3367}},{"type":"Polygon","arcs":[[-7672,-7674,7674,-3696,-5135,-5137]],"properties":{"id":"24661950","dp":10156,"de":7702}},{"type":"Polygon","arcs":[[7675,-5498,-5506,-3689,-3700,-3697]],"properties":{"id":"24661953","dp":12183,"de":10204}},{"type":"Polygon","arcs":[[7676,7677,7678,-7676,-7675,-7673]],"properties":{"id":"24661954","dp":16651,"de":7683}},{"type":"Polygon","arcs":[[7679,7680,-7677,-7668]],"properties":{"id":"24661955","dp":18132,"de":2918}},{"type":"Polygon","arcs":[[7681,7682,7683,-7678,-7681]],"properties":{"id":"24661956","dp":9977,"de":3611}},{"type":"Polygon","arcs":[[7684,7685,7686,-7682,7687]],"properties":{"id":"24661957","dp":13908,"de":5456}},{"type":"Polygon","arcs":[[7688,-7688,-7680,-7667,-7664]],"properties":{"id":"24661958","dp":18788,"de":10695}},{"type":"Polygon","arcs":[[7689,7690,7691,-7689,-7662]],"properties":{"id":"24661959","dp":13929,"de":9824}},{"type":"Polygon","arcs":[[7692,7693,-7691]],"properties":{"id":"24661960","dp":16458,"de":4249}},{"type":"Polygon","arcs":[[-7690,-7659,-5795,-6693,-6698,-6700,7694,-7693]],"properties":{"id":"24661961","dp":3152,"de":1246}},{"type":"Polygon","arcs":[[-7692,-7694,-7695,-6702,7695,-7685]],"properties":{"id":"24661962","dp":8834,"de":37730}},{"type":"Polygon","arcs":[[-7696,-6703,-6710,7696,-7686]],"properties":{"id":"24661963","dp":18341,"de":4899}},{"type":"Polygon","arcs":[[7697,-7496,-7501,-7359]],"properties":{"id":"24661599","dp":4056,"de":0}},{"type":"Polygon","arcs":[[-7367,-940,-7497,-7698,-7358,-7363]],"properties":{"id":"24661600","dp":3124,"de":766}},{"type":"Polygon","arcs":[[-3550,-942,-4410,-7125,7698,-7123,-5565]],"properties":{"id":"24661601","dp":2188,"de":2150}},{"type":"Polygon","arcs":[[-7124,-7699]],"properties":{"id":"24661602","dp":4102,"de":0}},{"type":"Polygon","arcs":[[-7204,-1500,7699]],"properties":{"id":"24662098","dp":14023,"de":0}},{"type":"Polygon","arcs":[[-1499,-7266,-7262,7700,-7201,-7700]],"properties":{"id":"24662099","dp":10173,"de":1906}},{"type":"Polygon","arcs":[[-7260,-7202,-7701,-7261]],"properties":{"id":"24662100","dp":13190,"de":4605}},{"type":"Polygon","arcs":[[-7259,7701,-7194,-7196,-7199]],"properties":{"id":"24662101","dp":6017,"de":1857}},{"type":"Polygon","arcs":[[7702,-7192,-7702,-7258]],"properties":{"id":"24662102","dp":10739,"de":4225}},{"type":"Polygon","arcs":[[7703,7704,-333,7705]],"properties":{"id":"24662103","dp":6944,"de":1889}},{"type":"Polygon","arcs":[[7706,-3821,-3814,-7705]],"properties":{"id":"24662104","dp":8165,"de":2206}},{"type":"Polygon","arcs":[[-3495,7707,-3822,-7707,7708]],"properties":{"id":"24662105","dp":9480,"de":3003}},{"type":"Polygon","arcs":[[-3494,-3825,-3818,-7708]],"properties":{"id":"24662106","dp":9200,"de":0}},{"type":"Polygon","arcs":[[7709,-2264,-2257,-7007]],"properties":{"id":"24662108","dp":15333,"de":1770}},{"type":"Polygon","arcs":[[7710,-2274,-7710,-6834]],"properties":{"id":"24662109","dp":18228,"de":1351}},{"type":"Polygon","arcs":[[7711,-2275,-7711,7712]],"properties":{"id":"24662110","dp":15255,"de":0}},{"type":"Polygon","arcs":[[-5018,-5017,7713,-6554,-6549,-6545]],"properties":{"id":"24662111","dp":11775,"de":13054}},{"type":"Polygon","arcs":[[-5010,7714,-6555,-7714,-5016]],"properties":{"id":"24662112","dp":17245,"de":4918}},{"type":"Polygon","arcs":[[-6551,-7715,-5009,-5004,-4876,-4875,-4872,-6556]],"properties":{"id":"24662113","dp":3453,"de":442}},{"type":"Polygon","arcs":[[7715,-3523,7716,-1931]],"properties":{"id":"24662958","dp":3548,"de":461}},{"type":"Polygon","arcs":[[-1594,-1598,-1602,-3521,-7716,-1930]],"properties":{"id":"24662961","dp":7521,"de":1569}},{"type":"Polygon","arcs":[[-6653,7717,7718,7719,7720,-6655]],"properties":{"id":"24662962","dp":10448,"de":0}},{"type":"Polygon","arcs":[[-6656,-7721,7721,7722,-6667,-6662]],"properties":{"id":"24662963","dp":13293,"de":0}},{"type":"Polygon","arcs":[[-7295,7723,-6641,-6651,7724,-6665,-6685,-6687,-6691,7725,-1625,-7297]],"properties":{"id":"24662964","dp":941,"de":3834}},{"type":"Polygon","arcs":[[-6650,-6661,-6666,-7725]],"properties":{"id":"24662965","dp":13662,"de":4714}},{"type":"Polygon","arcs":[[-7294,-7724]],"properties":{"id":"24662966","dp":29845,"de":0}},{"type":"Polygon","arcs":[[-7566,-6981,-6967,7726]],"properties":{"id":"24661622","dp":19846,"de":2307}},{"type":"Polygon","arcs":[[-7567,-7727,-6971,7727]],"properties":{"id":"24661623","dp":23600,"de":2444}},{"type":"Polygon","arcs":[[-7728,-6963,-7568]],"properties":{"id":"24661624","dp":17574,"de":5106}},{"type":"Polygon","arcs":[[-4738,-4728,-7569,-6953,7728,-4750]],"properties":{"id":"24661625","dp":2091,"de":6686}},{"type":"Polygon","arcs":[[-4763,-7729,-6952,-7541,-7536,7729,7730]],"properties":{"id":"24661626","dp":6212,"de":10221}},{"type":"Polygon","arcs":[[-7730,-7539,-7061,7731]],"properties":{"id":"24661627","dp":17538,"de":5135}},{"type":"Polygon","arcs":[[-5115,-4764,-7731,-7732,-7057,-7056,7732,7733]],"properties":{"id":"24661628","dp":2730,"de":12672}},{"type":"Polygon","arcs":[[-7734,7734,7735,-5116]],"properties":{"id":"24661629","dp":10100,"de":8193}},{"type":"Polygon","arcs":[[-7246,-6906,-2293,7736]],"properties":{"id":"24661630","dp":6753,"de":2217}},{"type":"Polygon","arcs":[[7737,7738,-7737,7739,7740]],"properties":{"id":"24661631","dp":7161,"de":2380}},{"type":"Polygon","arcs":[[7741,-7247,-7739,7742,7743,7744]],"properties":{"id":"24661632","dp":11209,"de":756}},{"type":"Polygon","arcs":[[7745,-7242,-7248,-7742,7746]],"properties":{"id":"24661633","dp":11463,"de":958}},{"type":"Polygon","arcs":[[-7209,7747,-7241,-7746]],"properties":{"id":"24661634","dp":11827,"de":1724}},{"type":"Polygon","arcs":[[-7208,-7150,-7238,-7239,-7748]],"properties":{"id":"24661635","dp":12547,"de":2857}},{"type":"Polygon","arcs":[[7748,7749,-2903]],"properties":{"id":"24662131","dp":17239,"de":0}},{"type":"Polygon","arcs":[[7750,7751,-7749,-2902]],"properties":{"id":"24662132","dp":16117,"de":3324}},{"type":"Polygon","arcs":[[-7751,-2901,7752,7753,7754]],"properties":{"id":"24662133","dp":7219,"de":8005}},{"type":"Polygon","arcs":[[-7754,7755,7756,-2565,-2571,7757]],"properties":{"id":"24662134","dp":6560,"de":1864}},{"type":"Polygon","arcs":[[7758,-3540,7759,7760,-7756]],"properties":{"id":"24662135","dp":7688,"de":15667}},{"type":"Polygon","arcs":[[-2910,-2915,-7759,-7753]],"properties":{"id":"24662136","dp":21841,"de":2966}},{"type":"Polygon","arcs":[[-7761,7761,-6121,-2562,-7757]],"properties":{"id":"24662137","dp":10441,"de":8201}},{"type":"Polygon","arcs":[[-3539,7762,7763,-6125,-6122,-7762,-7760]],"properties":{"id":"24662138","dp":3353,"de":13807}},{"type":"Polygon","arcs":[[-5805,-5803,-2727,7764,-6126]],"properties":{"id":"24662140","dp":32804,"de":28048}},{"type":"Polygon","arcs":[[-6127,-7765,-2730]],"properties":{"id":"24662141","dp":31500,"de":2500}},{"type":"Polygon","arcs":[[7765,7766,-5207,-7764]],"properties":{"id":"24662142","dp":26520,"de":40878}},{"type":"Polygon","arcs":[[-4563,-2709,-2718,-5208,-7767,7767]],"properties":{"id":"24662143","dp":3505,"de":12207}},{"type":"Polygon","arcs":[[-3545,-4564,-7768,-7766,-7763,-3538]],"properties":{"id":"24662144","dp":13223,"de":28371}},{"type":"Polygon","arcs":[[-7210,-7747,7768,-5772,-5764]],"properties":{"id":"24661660","dp":10017,"de":1475}},{"type":"Polygon","arcs":[[-7769,-7745,7769,-5773]],"properties":{"id":"24661661","dp":14436,"de":0}},{"type":"Polygon","arcs":[[-7770,-7744,7770,-5775]],"properties":{"id":"24661662","dp":11105,"de":1442}},{"type":"Polygon","arcs":[[-1476,-5776,-7771,-7743,-7738,7771,-1472]],"properties":{"id":"24661663","dp":4123,"de":1231}},{"type":"Polygon","arcs":[[-7772,-7741,7772,7773,-1473]],"properties":{"id":"24661664","dp":8072,"de":2409}},{"type":"Polygon","arcs":[[-7774,7774,7775,-1462,-1474]],"properties":{"id":"24661665","dp":11469,"de":0}},{"type":"Polygon","arcs":[[-7776,7776,7777,7778,-1463]],"properties":{"id":"24661666","dp":8374,"de":643}},{"type":"Polygon","arcs":[[7779,-2288,7780,-7777]],"properties":{"id":"24661667","dp":7920,"de":1804}},{"type":"Polygon","arcs":[[-7773,-7740,-2292,-7780,-7775]],"properties":{"id":"24661668","dp":10695,"de":2139}},{"type":"Polygon","arcs":[[-7778,-7781,-2287,-2281,-2271,-7712,7781]],"properties":{"id":"24661669","dp":3545,"de":1232}},{"type":"Polygon","arcs":[[-7779,-7782,7782,-1464]],"properties":{"id":"24661670","dp":6715,"de":1863}},{"type":"Polygon","arcs":[[-7783,-7713,-6833,-1465]],"properties":{"id":"24661671","dp":15000,"de":1724}},{"type":"Polygon","arcs":[[-6010,-2310,7783,7784,7785,7786,7787,7788]],"properties":{"id":"24662162","dp":1682,"de":24676}},{"type":"Polygon","arcs":[[-6007,-7789,7789,7790,-2890,7791]],"properties":{"id":"24662163","dp":6950,"de":2593}},{"type":"Polygon","arcs":[[-2889,7792,-2874,-6008,-7792]],"properties":{"id":"24662164","dp":3200,"de":3169}},{"type":"Polygon","arcs":[[-7793,-2888,-2883,-2875]],"properties":{"id":"24662165","dp":13571,"de":0}},{"type":"Polygon","arcs":[[-3473,-2891,-7791,-3533,-2913,7793]],"properties":{"id":"24662167","dp":4663,"de":6351}},{"type":"Polygon","arcs":[[-2906,-7794]],"properties":{"id":"24662168","dp":23446,"de":0}},{"type":"Polygon","arcs":[[7794,-2528,7795]],"properties":{"id":"24662169","dp":10740,"de":0}},{"type":"Polygon","arcs":[[7796,7797,7798,7799,-7796,-2527,7800]],"properties":{"id":"24662170","dp":5975,"de":0}},{"type":"Polygon","arcs":[[7801,7802,-7799]],"properties":{"id":"24662171","dp":6305,"de":0}},{"type":"Polygon","arcs":[[-2529,-7795,-7800,7803]],"properties":{"id":"24662172","dp":8530,"de":884}},{"type":"Polygon","arcs":[[-7803,7804,-715,-706,-697,-3105,-7804]],"properties":{"id":"24662173","dp":3917,"de":770}},{"type":"Polygon","arcs":[[-2680,-2491,7805,7806,7807,-710,-7805,7808,-7797,7809]],"properties":{"id":"24662174","dp":2149,"de":185}},{"type":"Polygon","arcs":[[-7802,-7798,-7809]],"properties":{"id":"24662175","dp":10682,"de":741}},{"type":"Polygon","arcs":[[-7687,-7697,-6709,7810,-7683]],"properties":{"id":"24661964","dp":18611,"de":3213}},{"type":"Polygon","arcs":[[-7679,-7684,-7811,-6708,-5489,-5496]],"properties":{"id":"24661965","dp":12250,"de":13588}},{"type":"Polygon","arcs":[[-6344,-5686,7811]],"properties":{"id":"24662342","dp":4292,"de":0}},{"type":"Polygon","arcs":[[-3062,-6321,-6342,-7812,-5683,7812]],"properties":{"id":"24662343","dp":3632,"de":317}},{"type":"Polygon","arcs":[[-3057,-3063,-7813,-5682,7813]],"properties":{"id":"24662344","dp":3089,"de":0}},{"type":"Polygon","arcs":[[7814,7815,-5465,-3058,-7814,-5681,7816]],"properties":{"id":"24662345","dp":3383,"de":0}},{"type":"MultiPolygon","arcs":[[[7817,7818,7819,-6025,-6028,-6013,7820,7821]],[[7822,7823,-4282,7824]],[[7825,-4277,7826]]],"properties":{"id":"24663390","dp":694,"de":1243}},{"type":"Polygon","arcs":[[7827,7828,7829,-7819]],"properties":{"id":"24663391","dp":8240,"de":2423}},{"type":"Polygon","arcs":[[7830,-7828,7831,7832]],"properties":{"id":"24663392","dp":6712,"de":1909}},{"type":"Polygon","arcs":[[-7831,7833,-1778,7834,-7829]],"properties":{"id":"24663393","dp":8991,"de":2242}},{"type":"MultiPolygon","arcs":[[[-7833,7835,7836,-1772,7837,-1779,-7834]],[[-1781,7838,7839,7840]],[[-1786,7841,7842,7843]],[[-1783,7844,7845,7846]]],"properties":{"id":"24663394","dp":2124,"de":3179}},{"type":"MultiPolygon","arcs":[[[-7827,-4276,-2465,7847,-7840,7848]],[[7849,-7836,-7832,-7818]],[[7850,-7843,7851,-7823]],[[7852]],[[-7846,7853]]],"properties":{"id":"24663395","dp":3547,"de":470}},{"type":"Polygon","arcs":[[7854]],"properties":{"id":"24663396","dp":26,"de":0}},{"type":"Polygon","arcs":[[7855,7856,7857,7858,7859,-7419,-7614]],"properties":{"id":"24663397","dp":15008,"de":900}},{"type":"Polygon","arcs":[[7860,7861,7862,-7857]],"properties":{"id":"24663398","dp":10852,"de":0}},{"type":"Polygon","arcs":[[-7861,-7856,-7617,7863]],"properties":{"id":"24663399","dp":9401,"de":664}},{"type":"Polygon","arcs":[[7864,-7864,-7616,-7622,-6249]],"properties":{"id":"24663400","dp":12946,"de":4872}},{"type":"Polygon","arcs":[[7865,7866,7867,-7862,-7865,-6253]],"properties":{"id":"24663401","dp":2525,"de":7200}},{"type":"Polygon","arcs":[[7868,-1130,-1138,7869]],"properties":{"id":"24663402","dp":10158,"de":0}},{"type":"Polygon","arcs":[[-1749,-1757,-1767,-3983,-3844,-3840,-3836,-3834]],"properties":{"id":"24661703","dp":7376,"de":1388}},{"type":"Polygon","arcs":[[7870,-2230,-2227,-2221,-1737,-1539]],"properties":{"id":"24661704","dp":12107,"de":1789}},{"type":"Polygon","arcs":[[-7021,-7019,-2243,-2235,-2231,-7871,-1538]],"properties":{"id":"24661705","dp":4225,"de":15312}},{"type":"Polygon","arcs":[[7871,-7377,-396,-1447,-7031,-3490]],"properties":{"id":"24661708","dp":4721,"de":1518}},{"type":"Polygon","arcs":[[7872,7873,-7368,-7872,-3496,7874,7875]],"properties":{"id":"24661709","dp":2164,"de":5433}},{"type":"Polygon","arcs":[[-7709,-7704,7876,-7875]],"properties":{"id":"24661710","dp":8519,"de":3107}},{"type":"Polygon","arcs":[[7877,-7876,-7877,7878,7879,7880]],"properties":{"id":"24661711","dp":8349,"de":1225}},{"type":"Polygon","arcs":[[-7879,-7706,-332,7881]],"properties":{"id":"24661712","dp":8303,"de":0}},{"type":"Polygon","arcs":[[7882,-7880,-7882,-331,7883]],"properties":{"id":"24661713","dp":9049,"de":1311}},{"type":"Polygon","arcs":[[7884,-7884,7885,-3957]],"properties":{"id":"24661714","dp":11540,"de":0}},{"type":"Polygon","arcs":[[-3958,-7886,-330,-3808,-3800,-3799,-3960]],"properties":{"id":"24661715","dp":4304,"de":1828}},{"type":"Polygon","arcs":[[7886,-7881,-7883,-7885,7887]],"properties":{"id":"24661716","dp":9462,"de":833}},{"type":"Polygon","arcs":[[7888,-7888,-3956]],"properties":{"id":"24661717","dp":10787,"de":0}},{"type":"Polygon","arcs":[[7889,7890,-7874,7891,-7889,-3955]],"properties":{"id":"24661718","dp":1532,"de":1834}},{"type":"Polygon","arcs":[[-7873,-7878,-7887,-7892]],"properties":{"id":"24661719","dp":4314,"de":2983}},{"type":"Polygon","arcs":[[-3481,7892,-3479,-5317,-5320,-365,-7890,-3954,-3483,7893]],"properties":{"id":"24661720","dp":699,"de":878}},{"type":"Polygon","arcs":[[-3482,-7894]],"properties":{"id":"24661721","dp":12230,"de":0}},{"type":"MultiPolygon","arcs":[[[7894,-4685,7895,7896,-7327]],[[7897]]],"properties":{"id":"24662985","dp":777,"de":413}},{"type":"Polygon","arcs":[[-5977,7898,-7895,-7326]],"properties":{"id":"24662986","dp":1242,"de":153}},{"type":"Polygon","arcs":[[-3450,-4686,-7899,-5976]],"properties":{"id":"24662987","dp":974,"de":291}},{"type":"Polygon","arcs":[[-7869,7899,7900,-1121]],"properties":{"id":"24663403","dp":5476,"de":0}},{"type":"Polygon","arcs":[[-1135,7901,-7900,-7870,-1137,-3740]],"properties":{"id":"24663404","dp":7196,"de":0}},{"type":"Polygon","arcs":[[-7902,-1134,-1122,-7901]],"properties":{"id":"24663405","dp":6421,"de":0}},{"type":"Polygon","arcs":[[-5879,-5168,-7401,-5173,-7395,-5147,-4960,-5950,-5948,-4968,-4972]],"properties":{"id":"24663406","dp":686,"de":73}},{"type":"Polygon","arcs":[[7902,-7528,-7529,-7532]],"properties":{"id":"24663450","dp":14109,"de":2729}},{"type":"Polygon","arcs":[[-7531,-7535,-7542,-7526,-7903]],"properties":{"id":"24663451","dp":6708,"de":12304}},{"type":"Polygon","arcs":[[-6139,7903,-2963,-1308,-1249,-6135,-6137]],"properties":{"id":"24663452","dp":5953,"de":25994}},{"type":"Polygon","arcs":[[-4586,-2964,-7904,-6138,-2966]],"properties":{"id":"24663453","dp":12181,"de":2674}},{"type":"Polygon","arcs":[[7904,7905,7906,-7563,-7427]],"properties":{"id":"24662007","dp":19251,"de":0}},{"type":"Polygon","arcs":[[7907,-7546,-7547,7908,-7564,-7907]],"properties":{"id":"24662008","dp":8516,"de":1180}},{"type":"Polygon","arcs":[[-7565,-7909,-7549,-7550,-7556,-7562]],"properties":{"id":"24662009","dp":13447,"de":3561}},{"type":"Polygon","arcs":[[7909,-7544,-7908,7910]],"properties":{"id":"24662010","dp":15041,"de":2054}},{"type":"Polygon","arcs":[[7911,-5920,-5923,-5926,-7910,7912]],"properties":{"id":"24662011","dp":13357,"de":2828}},{"type":"Polygon","arcs":[[7913,-7913,-7911,-7906,7914]],"properties":{"id":"24662012","dp":12888,"de":3486}},{"type":"Polygon","arcs":[[7915,-5921,-7912,-7914,7916]],"properties":{"id":"24662013","dp":15308,"de":3089}},{"type":"Polygon","arcs":[[-7860,7917,-7917,-7915,-7905,-7426,-7420]],"properties":{"id":"24662014","dp":5970,"de":1146}},{"type":"Polygon","arcs":[[7918,7919,-5918,-7916,-7918,-7859]],"properties":{"id":"24662015","dp":7562,"de":3541}},{"type":"Polygon","arcs":[[7920,-5914,-5915,-7920]],"properties":{"id":"24662016","dp":15907,"de":4336}},{"type":"Polygon","arcs":[[7921,-5912,-7921,7922]],"properties":{"id":"24662017","dp":20319,"de":6914}},{"type":"Polygon","arcs":[[7923,-7633,-7635,-7636,7924,7925]],"properties":{"id":"24662044","dp":14034,"de":1136}},{"type":"Polygon","arcs":[[7926,-7925,-7637,7927,-6226]],"properties":{"id":"24662045","dp":13248,"de":2760}},{"type":"Polygon","arcs":[[7928,-7926,-7927,-6225,-6228]],"properties":{"id":"24662046","dp":17621,"de":1732}},{"type":"Polygon","arcs":[[7929,7930,-7924,-7929,-6230]],"properties":{"id":"24662047","dp":3978,"de":8507}},{"type":"Polygon","arcs":[[-6233,7931,7932,-7930]],"properties":{"id":"24662048","dp":15337,"de":1993}},{"type":"Polygon","arcs":[[-6235,-6241,7933,-7932,-6232]],"properties":{"id":"24662049","dp":14679,"de":1388}},{"type":"Polygon","arcs":[[7934,-7410,-7646,-7649,-7651]],"properties":{"id":"24662276","dp":2954,"de":0}},{"type":"Polygon","arcs":[[7935,7936,-7406,-7408,-7935,-7650,-3071]],"properties":{"id":"24662277","dp":2330,"de":1011}},{"type":"Polygon","arcs":[[7937,7938,-5449,-7407,-7937]],"properties":{"id":"24662278","dp":6876,"de":720}},{"type":"Polygon","arcs":[[-7936,-3070,7939,7940,-7938]],"properties":{"id":"24662279","dp":13111,"de":0}},{"type":"Polygon","arcs":[[7941,7942,-5450,-7939,-7941,7943]],"properties":{"id":"24662280","dp":2508,"de":224}},{"type":"Polygon","arcs":[[7944,-7944,-7940,-3069,7945]],"properties":{"id":"24662281","dp":1717,"de":148}},{"type":"Polygon","arcs":[[-3068,-5353,7946,7947,-7946]],"properties":{"id":"24662282","dp":4097,"de":0}},{"type":"Polygon","arcs":[[-7948,7948,-7942,-7945]],"properties":{"id":"24662283","dp":3343,"de":0}},{"type":"Polygon","arcs":[[-7943,-7949,-7947,-5352,-6160,-6167,7949,7950,-7403,-5452,-5443,-5446]],"properties":{"id":"24662284","dp":901,"de":2187}},{"type":"Polygon","arcs":[[7951,7952,7953,7954,-7951]],"properties":{"id":"24662285","dp":3759,"de":1181}},{"type":"Polygon","arcs":[[-7953,7955,7956,7957]],"properties":{"id":"24662286","dp":2763,"de":0}},{"type":"Polygon","arcs":[[-7958,7958,7959,-7954]],"properties":{"id":"24662287","dp":3685,"de":332}},{"type":"Polygon","arcs":[[7960,7961,-7959,-7957]],"properties":{"id":"24662288","dp":2965,"de":0}},{"type":"Polygon","arcs":[[-7955,-7960,-7962,7962,-5740,-5460,-5454,-7404]],"properties":{"id":"24662289","dp":856,"de":1771}},{"type":"Polygon","arcs":[[-1313,-1281,-1277,-1271,-1086,7963]],"properties":{"id":"24662114","dp":3221,"de":18847}},{"type":"Polygon","arcs":[[7964,-5911,-7922,7965]],"properties":{"id":"24662018","dp":21736,"de":6052}},{"type":"Polygon","arcs":[[7966,-5909,-7965,7967]],"properties":{"id":"24662019","dp":21354,"de":2343}},{"type":"Polygon","arcs":[[7968,-5907,-7967,7969,7970]],"properties":{"id":"24662020","dp":15658,"de":3202}},{"type":"Polygon","arcs":[[-7970,-7968,-7966,-7923,-7919,7971]],"properties":{"id":"24662021","dp":15519,"de":0}},{"type":"Polygon","arcs":[[7972,-7971,-7972,-7858,-7863,-7868]],"properties":{"id":"24662022","dp":14750,"de":0}},{"type":"Polygon","arcs":[[-7973,-7867,7973,7974,-7612,-5902,7975,-5906,-7969]],"properties":{"id":"24662024","dp":6894,"de":1088}},{"type":"Polygon","arcs":[[-5904,-7976]],"properties":{"id":"24662025","dp":28600,"de":4938}},{"type":"Polygon","arcs":[[-7445,-7449,-7470,-7974,-7866,-6252,-6258,-6274,-6275]],"properties":{"id":"24662026","dp":2804,"de":5234}},{"type":"Polygon","arcs":[[-7975,-7469,7976,7977,-7609,-7610,-7495,-7272,-7613]],"properties":{"id":"24662027","dp":3320,"de":6302}},{"type":"Polygon","arcs":[[-7480,7978,-7977,-7468,-7472,-7474,-7476]],"properties":{"id":"24662028","dp":13774,"de":2903}},{"type":"Polygon","arcs":[[-7490,-7611,-7607,-7978,-7979,-7479]],"properties":{"id":"24662029","dp":17312,"de":5000}},{"type":"Polygon","arcs":[[7979,7980,7981,7982,-5599,-5598,-5593]],"properties":{"id":"24662384","dp":1848,"de":652}},{"type":"Polygon","arcs":[[7983,7984,7985,7986,-7981,7987]],"properties":{"id":"24662385","dp":3341,"de":499}},{"type":"Polygon","arcs":[[7988,-7988,-7980,-5592,7989,7990]],"properties":{"id":"24662386","dp":4512,"de":406}},{"type":"Polygon","arcs":[[7991,7992,7993,-7990,-5596,-5590]],"properties":{"id":"24662387","dp":11225,"de":1092}},{"type":"Polygon","arcs":[[7994,-5943,7995,7996,-7993,7997]],"properties":{"id":"24662388","dp":3059,"de":0}},{"type":"Polygon","arcs":[[-5589,-5585,-5580,7998,7999,-7998,-7992]],"properties":{"id":"24662389","dp":2794,"de":1017}},{"type":"Polygon","arcs":[[8000,8001,-825,-4570,-4567,-4557,-3535]],"properties":{"id":"24662145","dp":2786,"de":2629}},{"type":"Polygon","arcs":[[8002,-8001,8003]],"properties":{"id":"24662147","dp":15989,"de":6951}},{"type":"Polygon","arcs":[[-7790,-7788,8004,8005,-8004,-3534]],"properties":{"id":"24662148","dp":5279,"de":5182}},{"type":"Polygon","arcs":[[8006,-835,-829,8007,-8006]],"properties":{"id":"24662149","dp":9821,"de":10425}},{"type":"Polygon","arcs":[[-8008,-832,-828,-8002,-8003]],"properties":{"id":"24662150","dp":7965,"de":2836}},{"type":"Polygon","arcs":[[-838,-8007,8008]],"properties":{"id":"24662151","dp":14970,"de":22058}},{"type":"Polygon","arcs":[[-7787,8009,-841,-3597,-836,-8009,-8005]],"properties":{"id":"24662152","dp":7012,"de":9674}},{"type":"Polygon","arcs":[[8010,-845,-842,-8010,-7786]],"properties":{"id":"24662153","dp":11924,"de":2405}},{"type":"Polygon","arcs":[[-6251,-7624,8011,-7934]],"properties":{"id":"24662050","dp":12577,"de":2333}},{"type":"Polygon","arcs":[[-8012,-7625,-7630,-7631,-7931,-7933]],"properties":{"id":"24662051","dp":8170,"de":24634}},{"type":"Polygon","arcs":[[-6221,-7928,-7375,8012]],"properties":{"id":"24662052","dp":12256,"de":2850}},{"type":"Polygon","arcs":[[-6222,-8013,-7374,8013]],"properties":{"id":"24662053","dp":16512,"de":1226}},{"type":"Polygon","arcs":[[8014,-8014,-7373,8015]],"properties":{"id":"24662054","dp":8411,"de":9371}},{"type":"Polygon","arcs":[[-8016,-7372,8016,8017]],"properties":{"id":"24662055","dp":18455,"de":2205}},{"type":"Polygon","arcs":[[-8017,-7371,8018,8019]],"properties":{"id":"24662056","dp":17165,"de":2330}},{"type":"Polygon","arcs":[[-8019,-7370,8020]],"properties":{"id":"24662057","dp":11772,"de":0}},{"type":"Polygon","arcs":[[8021,-8020,-8021,-7369,-7891,-364,-382]],"properties":{"id":"24662058","dp":3397,"de":3757}},{"type":"Polygon","arcs":[[-6045,-6048,8022,8023,-379]],"properties":{"id":"24662064","dp":14070,"de":2922}},{"type":"Polygon","arcs":[[-6058,-6219,8024,-8023,-6047,-6049,-6053]],"properties":{"id":"24662065","dp":5720,"de":3625}},{"type":"Polygon","arcs":[[-380,-8024,-8025,-6218,-6223,-8015,-8018,-8022]],"properties":{"id":"24662066","dp":5004,"de":3910}},{"type":"Polygon","arcs":[[-3504,8025,-5402,-5410,-5413,8026,8027,8028]],"properties":{"id":"24662405","dp":4160,"de":2203}},{"type":"Polygon","arcs":[[8029,-3506,8030,8031]],"properties":{"id":"24662408","dp":3040,"de":582}},{"type":"Polygon","arcs":[[-8031,-3505,-8029,8032,8033,8034,8035]],"properties":{"id":"24662409","dp":2358,"de":420}},{"type":"Polygon","arcs":[[-8035,8036,8037]],"properties":{"id":"24662410","dp":3768,"de":0}},{"type":"Polygon","arcs":[[-8037,-8034,8038,8039,8040]],"properties":{"id":"24662411","dp":9136,"de":0}},{"type":"Polygon","arcs":[[-5281,8041,8042,8043,-8040]],"properties":{"id":"24662412","dp":11314,"de":0}},{"type":"Polygon","arcs":[[8044,-8042,-5280,-5276,-5270]],"properties":{"id":"24662413","dp":6083,"de":0}},{"type":"Polygon","arcs":[[8045,8046,-8043,-8045,-5275]],"properties":{"id":"24662414","dp":10353,"de":0}},{"type":"Polygon","arcs":[[8047,-8044,-8047,8048]],"properties":{"id":"24662415","dp":9958,"de":0}},{"type":"Polygon","arcs":[[8049,-8049,-8046,-5274,-5268,-5160,8050]],"properties":{"id":"24662416","dp":8268,"de":0}},{"type":"Polygon","arcs":[[-2700,-2698,-2696,-2694,-2689,-2683,8051,-2707]],"properties":{"id":"24662176","dp":3281,"de":2157}},{"type":"Polygon","arcs":[[8052,-711,-7808]],"properties":{"id":"24662177","dp":10225,"de":0}},{"type":"Polygon","arcs":[[-7807,8053,-4591,8054,-721,-712,-8053]],"properties":{"id":"24662178","dp":10562,"de":672}},{"type":"Polygon","arcs":[[-8055,-4590,-4471,-4468,-726,-722]],"properties":{"id":"24662179","dp":8499,"de":1661}},{"type":"Polygon","arcs":[[-4326,-4600,-4592,-8054,-7806]],"properties":{"id":"24662180","dp":11991,"de":0}},{"type":"Polygon","arcs":[[-7961,-7956,-7952,-7950,-6170,-5741,-7963]],"properties":{"id":"24662290","dp":3018,"de":2519}},{"type":"Polygon","arcs":[[-4701,-4697,8055,-4939,-4938,-4936,-4928,-7301,-4911]],"properties":{"id":"24662642","dp":1972,"de":531}},{"type":"Polygon","arcs":[[-6423,8056,8057,-7317,-8056]],"properties":{"id":"24662643","dp":9678,"de":2506}},{"type":"Polygon","arcs":[[8058,8059,8060,8061,-8057]],"properties":{"id":"24662644","dp":7315,"de":1908}},{"type":"Polygon","arcs":[[-8058,-8062,8062,8063,-7318]],"properties":{"id":"24662645","dp":8890,"de":1239}},{"type":"Polygon","arcs":[[8064,8065,8066,-8063,-8061]],"properties":{"id":"24662646","dp":9131,"de":1595}},{"type":"Polygon","arcs":[[-8067,8067,8068,-7314,-8064]],"properties":{"id":"24662647","dp":5640,"de":15548}},{"type":"Polygon","arcs":[[8069,8070,8071,8072,-8068,-8066,8073]],"properties":{"id":"24662648","dp":5610,"de":2964}},{"type":"Polygon","arcs":[[-5459,-5466,-7816,8074,-5457]],"properties":{"id":"24662346","dp":2142,"de":0}},{"type":"Polygon","arcs":[[-8075,8075,8076,8077,8078,-5433]],"properties":{"id":"24662347","dp":2461,"de":0}},{"type":"Polygon","arcs":[[-7815,8079,8080,8081,-8076]],"properties":{"id":"24662348","dp":3249,"de":0}},{"type":"Polygon","arcs":[[-8080,-7817,-5680,8082,8083]],"properties":{"id":"24662349","dp":3082,"de":0}},{"type":"Polygon","arcs":[[-5674,8084,8085,8086,-8083]],"properties":{"id":"24662350","dp":3205,"de":0}},{"type":"Polygon","arcs":[[-8087,8087]],"properties":{"id":"24662351","dp":3520,"de":0}},{"type":"Polygon","arcs":[[-8081,-8084,-8088,-8086,8088,8089,8090]],"properties":{"id":"24662352","dp":2555,"de":0}},{"type":"Polygon","arcs":[[8091,-8089,-8085,-5677,-5659,-5366,8092]],"properties":{"id":"24662353","dp":4427,"de":724}},{"type":"Polygon","arcs":[[8093,-8090,-8092,8094]],"properties":{"id":"24662354","dp":3846,"de":0}},{"type":"Polygon","arcs":[[8095,-8095,-8093,8096,-8078]],"properties":{"id":"24662355","dp":4972,"de":2426}},{"type":"Polygon","arcs":[[-8077,-8082,-8091,-8094,-8096]],"properties":{"id":"24662356","dp":3809,"de":751}},{"type":"Polygon","arcs":[[-5431,-5434,-8079,-8097,-5365,8097,-5426,-5428]],"properties":{"id":"24662357","dp":3637,"de":1810}},{"type":"Polygon","arcs":[[-5364,-5260,-3497,8098,-8098]],"properties":{"id":"24662358","dp":8724,"de":358}},{"type":"Polygon","arcs":[[-8099,-3502,8099,-5421,-5427]],"properties":{"id":"24662359","dp":6330,"de":0}},{"type":"Polygon","arcs":[[-5369,-5652,8100,-3500]],"properties":{"id":"24662362","dp":3626,"de":0}},{"type":"Polygon","arcs":[[-5422,-8100,-3501,-8101,-5651,8101]],"properties":{"id":"24662363","dp":2313,"de":287}},{"type":"Polygon","arcs":[[-1251,-1314,-7964,-1264,-1258],[8102]],"properties":{"id":"24662115","dp":3939,"de":68855}},{"type":"Polygon","arcs":[[-8103]],"properties":{"id":"24662116","dp":16738,"de":73538}},{"type":"Polygon","arcs":[[8103,8104,8105,-3422,8106,8107]],"properties":{"id":"24662117","dp":2580,"de":0}},{"type":"Polygon","arcs":[[8108,-3423,-8106]],"properties":{"id":"24662118","dp":5803,"de":765}},{"type":"Polygon","arcs":[[-8105,8109,8110,-3424,-8109]],"properties":{"id":"24662119","dp":5864,"de":2286}},{"type":"Polygon","arcs":[[8111,-8110,-8104,8112]],"properties":{"id":"24662120","dp":5859,"de":0}},{"type":"Polygon","arcs":[[-2451,-2455,8113,-8112,8114]],"properties":{"id":"24662121","dp":7174,"de":0}},{"type":"MultiPolygon","arcs":[[[-8114,-2454,8115,-3425,-8111]],[[-2534,-6011,8116]]],"properties":{"id":"24662122","dp":2888,"de":196}},{"type":"Polygon","arcs":[[-2416,-2444,8117,-2447,-8115,-8113,-8108,8118]],"properties":{"id":"24662123","dp":3304,"de":512}},{"type":"Polygon","arcs":[[-2443,-2448,-8118]],"properties":{"id":"24662124","dp":10395,"de":0}},{"type":"Polygon","arcs":[[-3385,-3387,-3026,-2865,-2780,-213,8119]],"properties":{"id":"24662125","dp":15865,"de":2524}},{"type":"Polygon","arcs":[[-8120,-217,-220,-3202]],"properties":{"id":"24662126","dp":13625,"de":5500}},{"type":"Polygon","arcs":[[-2613,-2872,8120,-2601]],"properties":{"id":"24662127","dp":7707,"de":1115}},{"type":"Polygon","arcs":[[-2871,8121,-2592,8122,-8121]],"properties":{"id":"24662128","dp":8406,"de":2363}},{"type":"Polygon","arcs":[[-2602,-8123,-2591]],"properties":{"id":"24662129","dp":13488,"de":3685}},{"type":"Polygon","arcs":[[-7750,-7752,-7755,-7758,-2570,-2574,-2904]],"properties":{"id":"24662130","dp":5549,"de":9287}},{"type":"Polygon","arcs":[[-3609,-5956,8123,8124,-3604]],"properties":{"id":"24662444","dp":7695,"de":1810}},{"type":"Polygon","arcs":[[8125,-8124,-5955,-3510]],"properties":{"id":"24662445","dp":17926,"de":1295}},{"type":"Polygon","arcs":[[-3508,8126,8127]],"properties":{"id":"24662447","dp":12965,"de":0}},{"type":"Polygon","arcs":[[8128,-8126,-3509,-8128,8129,8130,8131]],"properties":{"id":"24662448","dp":22293,"de":0}},{"type":"Polygon","arcs":[[-8127,-3507,8132,-8130]],"properties":{"id":"24662449","dp":12234,"de":0}},{"type":"Polygon","arcs":[[-8131,-8133,-3513,8133,8134]],"properties":{"id":"24662450","dp":17622,"de":0}},{"type":"Polygon","arcs":[[-3512,-5954,8135,-8134]],"properties":{"id":"24662452","dp":27269,"de":0}},{"type":"Polygon","arcs":[[8136,-8136,-5953,8137]],"properties":{"id":"24662453","dp":24170,"de":2849}},{"type":"Polygon","arcs":[[8138,8139,-8138,-5952,-6037,-4358,8140]],"properties":{"id":"24662454","dp":12348,"de":910}},{"type":"Polygon","arcs":[[-8139,8141,8142]],"properties":{"id":"24662455","dp":11007,"de":0}},{"type":"Polygon","arcs":[[-3606,-8132,-8135,-8137,-8140,-8143,8143,-4363,8144]],"properties":{"id":"24662456","dp":7475,"de":1288}},{"type":"Polygon","arcs":[[-8142,-8141,-4357,-4364,-8144]],"properties":{"id":"24662457","dp":9683,"de":0}},{"type":"Polygon","arcs":[[8145,-3607,-8145,-4371,8146]],"properties":{"id":"24662458","dp":2625,"de":905}},{"type":"Polygon","arcs":[[8147,-8147,-4370,-4543,-4551]],"properties":{"id":"24662459","dp":3126,"de":0}},{"type":"Polygon","arcs":[[-7893,-3480]],"properties":{"id":"24661723","dp":14498,"de":1781}},{"type":"Polygon","arcs":[[8148,-852,-846,-8011,-7785,8149]],"properties":{"id":"24662154","dp":8850,"de":2331}},{"type":"Polygon","arcs":[[-2309,8150,8151,8152,8153,-8150,-7784]],"properties":{"id":"24662155","dp":13151,"de":2675}},{"type":"Polygon","arcs":[[8154,-8151,-2308]],"properties":{"id":"24662156","dp":5806,"de":1663}},{"type":"Polygon","arcs":[[8155,8156,-8152,-8155,-2307]],"properties":{"id":"24662157","dp":13811,"de":1647}},{"type":"Polygon","arcs":[[8157,-8156,-2306]],"properties":{"id":"24662158","dp":8404,"de":1033}},{"type":"Polygon","arcs":[[-2305,-987,-8153,-8157,-8158]],"properties":{"id":"24662159","dp":10089,"de":1485}},{"type":"Polygon","arcs":[[-986,8158,-853,-8149,-8154]],"properties":{"id":"24662160","dp":14163,"de":1951}},{"type":"Polygon","arcs":[[-960,-854,-8159]],"properties":{"id":"24662161","dp":14819,"de":2972}},{"type":"Polygon","arcs":[[8159,-7323,-7897,8160,8161,8162,8163,8164]],"properties":{"id":"24662475","dp":2046,"de":813}},{"type":"Polygon","arcs":[[8165,8166,-8163,8167]],"properties":{"id":"24662476","dp":11038,"de":5576}},{"type":"Polygon","arcs":[[8168,-8168,-8162,8169,8170,8171]],"properties":{"id":"24662477","dp":5435,"de":1136}},{"type":"Polygon","arcs":[[-8166,-8169,8172,-3452,8173]],"properties":{"id":"24662478","dp":17293,"de":2125}},{"type":"Polygon","arcs":[[-3453,-8173,-8172,8174]],"properties":{"id":"24662479","dp":3720,"de":3116}},{"type":"Polygon","arcs":[[-8175,-8171,8175,8176,8177,8178,-3454]],"properties":{"id":"24662480","dp":2279,"de":0}},{"type":"Polygon","arcs":[[-3407,8179,8180,8181,-8167,-8174,-3451]],"properties":{"id":"24662483","dp":10054,"de":1432}},{"type":"MultiPolygon","arcs":[[[-2114,8182,-7821,-6012,-1937,8183,-2106,-2110]],[[-4635,8184,-4624]]],"properties":{"id":"24662182","dp":2991,"de":455}},{"type":"Polygon","arcs":[[-1936,-2103,-8184]],"properties":{"id":"24662183","dp":9398,"de":0}},{"type":"Polygon","arcs":[[-5387,-6026,-7820,-7830,-7835,-1792,-1798,-5378,-5382]],"properties":{"id":"24662187","dp":2556,"de":5216}},{"type":"Polygon","arcs":[[-1780,-7838]],"properties":{"id":"24662192","dp":7263,"de":3092}},{"type":"Polygon","arcs":[[8185,8186,-3409,-3459,8187,8188]],"properties":{"id":"24662502","dp":13262,"de":658}},{"type":"Polygon","arcs":[[-3458,8189,-8188]],"properties":{"id":"24662503","dp":24772,"de":1893}},{"type":"Polygon","arcs":[[-8189,-8190,-3457,8190,8191,8192]],"properties":{"id":"24662504","dp":6754,"de":883}},{"type":"Polygon","arcs":[[-8192,8193,8194,8195,8196,8197]],"properties":{"id":"24662505","dp":4035,"de":1491}},{"type":"Polygon","arcs":[[-8191,-3456,8198,-8194]],"properties":{"id":"24662506","dp":4217,"de":1139}},{"type":"Polygon","arcs":[[8199,-8195,-8199,-3455,-8179,8200]],"properties":{"id":"24662507","dp":2845,"de":553}},{"type":"Polygon","arcs":[[8201,-8201,-8178,8202]],"properties":{"id":"24662508","dp":4187,"de":397}},{"type":"Polygon","arcs":[[8203,8204,-8203,8205,8206]],"properties":{"id":"24662509","dp":3635,"de":506}},{"type":"Polygon","arcs":[[8207,8208,-8207,8209]],"properties":{"id":"24662510","dp":5852,"de":0}},{"type":"Polygon","arcs":[[-8208,8210,8211]],"properties":{"id":"24662511","dp":10196,"de":0}},{"type":"Polygon","arcs":[[-3518,8212,8213,-8211,-8210,-8206,-8177,8214]],"properties":{"id":"24662512","dp":3717,"de":471}},{"type":"Polygon","arcs":[[8215,8216,-8213,-3517,8217]],"properties":{"id":"24662513","dp":6741,"de":561}},{"type":"Polygon","arcs":[[8218,8219,8220,-8218,-3516,8221]],"properties":{"id":"24662515","dp":5264,"de":1064}},{"type":"Polygon","arcs":[[8222,-8222,-3515,8223]],"properties":{"id":"24662516","dp":12660,"de":0}},{"type":"Polygon","arcs":[[8224,-5423,-8102,8225,-5927]],"properties":{"id":"24662364","dp":3878,"de":0}},{"type":"Polygon","arcs":[[-5928,-8226,-5654,-4941,-5932]],"properties":{"id":"24662365","dp":3614,"de":533}},{"type":"Polygon","arcs":[[-6690,-6692,-6683,8226,-3577,-7726]],"properties":{"id":"24662762","dp":1961,"de":5063}},{"type":"Polygon","arcs":[[-6680,8227,8228,-3578,-8227]],"properties":{"id":"24662763","dp":3052,"de":2800}},{"type":"Polygon","arcs":[[-6678,8229,8230,8231,-8228,-6679]],"properties":{"id":"24662764","dp":13112,"de":0}},{"type":"Polygon","arcs":[[8232,8233,8234,-6894,-3579,-8229,-8232]],"properties":{"id":"24662765","dp":3211,"de":601}},{"type":"Polygon","arcs":[[-8235,8235,8236,-6890]],"properties":{"id":"24662766","dp":21261,"de":0}},{"type":"Polygon","arcs":[[8237,8238,-8236,-8234]],"properties":{"id":"24662767","dp":21181,"de":0}},{"type":"Polygon","arcs":[[8239,8240,8241,-8238,-8233,-8231]],"properties":{"id":"24662768","dp":20216,"de":0}},{"type":"Polygon","arcs":[[8242,-3488,-3757,-3754,-3750]],"properties":{"id":"24661725","dp":2004,"de":984}},{"type":"Polygon","arcs":[[-3486,8243]],"properties":{"id":"24661726","dp":5105,"de":645}},{"type":"Polygon","arcs":[[-3487,-8244,-3485,-3953,-3758]],"properties":{"id":"24661727","dp":374,"de":2802}},{"type":"Polygon","arcs":[[-2344,-1774,8244,-6109,8245,8246,8247,8248,8249,8250,8251,-2334,-2335]],"properties":{"id":"24662218","dp":2745,"de":251}},{"type":"Polygon","arcs":[[8252,8253,-2331,-8252]],"properties":{"id":"24662219","dp":3553,"de":1027}},{"type":"Polygon","arcs":[[-8251,8254,8255,-8253]],"properties":{"id":"24662220","dp":7736,"de":2389}},{"type":"Polygon","arcs":[[8256,-8255,-8250,8257,8258]],"properties":{"id":"24662221","dp":3659,"de":615}},{"type":"Polygon","arcs":[[-8258,-8249,8259]],"properties":{"id":"24662222","dp":3714,"de":314}},{"type":"Polygon","arcs":[[-8259,-8260,-8248,8260,8261]],"properties":{"id":"24662223","dp":3242,"de":340}},{"type":"Polygon","arcs":[[-8261,-8247,8262,8263,8264]],"properties":{"id":"24662224","dp":3237,"de":0}},{"type":"Polygon","arcs":[[8265,-8262,-8265,8266,8267,8268]],"properties":{"id":"24662225","dp":3984,"de":580}},{"type":"Polygon","arcs":[[8269,-8269,8270]],"properties":{"id":"24662226","dp":2941,"de":514}},{"type":"Polygon","arcs":[[8271,8272,-8270,8273]],"properties":{"id":"24662227","dp":3996,"de":375}},{"type":"Polygon","arcs":[[-3548,8274,8275,-8274,-8271,-8268,8276,8277,-2034]],"properties":{"id":"24662228","dp":2285,"de":420}},{"type":"Polygon","arcs":[[-2332,-8254,8278,-8272,-8276,8279,-2329]],"properties":{"id":"24662229","dp":2847,"de":0}},{"type":"Polygon","arcs":[[-8256,-8257,-8266,-8273,-8279]],"properties":{"id":"24662230","dp":4047,"de":288}},{"type":"Polygon","arcs":[[-8280,-8275,-3547,-2330]],"properties":{"id":"24662231","dp":4144,"de":0}},{"type":"Polygon","arcs":[[8280,-8277,-8267,-8264]],"properties":{"id":"24662232","dp":8497,"de":0}},{"type":"Polygon","arcs":[[8281,8282,8283,8284,8285,-6378,-6385,-1528,-8278,-8281]],"properties":{"id":"24662233","dp":3857,"de":2193}},{"type":"Polygon","arcs":[[-5939,-4953,8286,-7996,-5942]],"properties":{"id":"24662371","dp":3734,"de":345}},{"type":"Polygon","arcs":[[8287,-8074,-8065,-8060]],"properties":{"id":"24662649","dp":14951,"de":4206}},{"type":"Polygon","arcs":[[8288,8289,-8288,8290]],"properties":{"id":"24662650","dp":6849,"de":940}},{"type":"Polygon","arcs":[[-6420,8291,-8291,-8059,-6422]],"properties":{"id":"24662651","dp":12148,"de":5177}},{"type":"Polygon","arcs":[[-6419,-6416,8292,8293,-8289,-8292]],"properties":{"id":"24662652","dp":6103,"de":878}},{"type":"Polygon","arcs":[[-8294,8294,8295,8296]],"properties":{"id":"24662653","dp":13477,"de":2954}},{"type":"Polygon","arcs":[[8297,8298,8299,-8295,-8293,-6415]],"properties":{"id":"24662654","dp":6030,"de":2576}},{"type":"Polygon","arcs":[[-8300,8300,8301,8302,-8296]],"properties":{"id":"24662655","dp":13144,"de":1417}},{"type":"Polygon","arcs":[[8303,8304,-8301,-8299]],"properties":{"id":"24662656","dp":12317,"de":0}},{"type":"Polygon","arcs":[[8305,8306,8307,-8302,-8305]],"properties":{"id":"24662657","dp":8948,"de":1091}},{"type":"Polygon","arcs":[[8308,8309,-6198,8310,8311,8312,-8307]],"properties":{"id":"24662658","dp":5459,"de":5550}},{"type":"Polygon","arcs":[[-8312,8313,8314]],"properties":{"id":"24662659","dp":18298,"de":1030}},{"type":"Polygon","arcs":[[-8297,-8303,-8308,-8313,-8315,8315,-8070,-8290]],"properties":{"id":"24662660","dp":3396,"de":3403}},{"type":"Polygon","arcs":[[-8316,8316,8317,8318,-8071]],"properties":{"id":"24662661","dp":6433,"de":1689}},{"type":"Polygon","arcs":[[-7997,-8287,-4952,-5640,-5636,8319,-7991,-7994]],"properties":{"id":"24662372","dp":3937,"de":493}},{"type":"Polygon","arcs":[[-5635,8320,-8320]],"properties":{"id":"24662373","dp":5025,"de":0}},{"type":"Polygon","arcs":[[-5629,8321,-7989,-8321]],"properties":{"id":"24662374","dp":3065,"de":963}},{"type":"Polygon","arcs":[[-5628,8322,8323,8324,-7984,-8322]],"properties":{"id":"24662375","dp":4733,"de":658}},{"type":"Polygon","arcs":[[-5623,-5614,8325,-8323,-5627]],"properties":{"id":"24662376","dp":2997,"de":581}},{"type":"Polygon","arcs":[[8326,-8324,-8326,-5613,-5606,8327]],"properties":{"id":"24662377","dp":3448,"de":446}},{"type":"Polygon","arcs":[[-7985,-8325,-8327,8328,8329]],"properties":{"id":"24662378","dp":3647,"de":0}},{"type":"Polygon","arcs":[[8330,-8329,-8328,-5612,8331]],"properties":{"id":"24662379","dp":3241,"de":0}},{"type":"Polygon","arcs":[[-7986,-8330,-8331,8332,8333]],"properties":{"id":"24662380","dp":3099,"de":0}},{"type":"Polygon","arcs":[[8334,8335,-8333,-8332,-5611,-5603]],"properties":{"id":"24662381","dp":4255,"de":0}},{"type":"Polygon","arcs":[[-7987,-8334,-8336,8336,-7982]],"properties":{"id":"24662382","dp":3573,"de":0}},{"type":"Polygon","arcs":[[-8335,-5602,-5600,-7983,-8337]],"properties":{"id":"24662383","dp":3995,"de":490}},{"type":"Polygon","arcs":[[8337,8338,8339,8340]],"properties":{"id":"24662795","dp":6055,"de":628}},{"type":"Polygon","arcs":[[8341,8342,-8341,8343,-6849]],"properties":{"id":"24662796","dp":5903,"de":2245}},{"type":"Polygon","arcs":[[8344,-8342,8345]],"properties":{"id":"24662797","dp":12400,"de":1473}},{"type":"Polygon","arcs":[[-6513,8346,-6507,-8338,-8343,-8345,8347,-6518]],"properties":{"id":"24662798","dp":7111,"de":1268}},{"type":"Polygon","arcs":[[-6512,-6502,-8347]],"properties":{"id":"24662799","dp":7366,"de":0}},{"type":"Polygon","arcs":[[-6519,-8348,-8346,-6848,8348,-6852]],"properties":{"id":"24662800","dp":6167,"de":623}},{"type":"Polygon","arcs":[[-8349,-6846,-6853]],"properties":{"id":"24662801","dp":10099,"de":2871}},{"type":"Polygon","arcs":[[-3611,8349,-3601,-8146,-8148,-4550]],"properties":{"id":"24662460","dp":3895,"de":1150}},{"type":"Polygon","arcs":[[-5935,-5941,-5944,-7995,-8000,8350,8351]],"properties":{"id":"24662390","dp":2804,"de":400}},{"type":"Polygon","arcs":[[-5304,-5302,8352,8353,-8351,-7999,-5579]],"properties":{"id":"24662391","dp":4464,"de":876}},{"type":"Polygon","arcs":[[-5287,8354,8355,8356,-8353,-5301,-5289]],"properties":{"id":"24662392","dp":5260,"de":660}},{"type":"Polygon","arcs":[[8357,8358,8359,-8356]],"properties":{"id":"24662393","dp":3702,"de":0}},{"type":"Polygon","arcs":[[8360,8361,-8358,-8355,-5286,8362]],"properties":{"id":"24662394","dp":4310,"de":282}},{"type":"Polygon","arcs":[[-5930,-5937,8363,-8359,-8362,8364]],"properties":{"id":"24662395","dp":3556,"de":466}},{"type":"Polygon","arcs":[[-5936,-8352,-8354,-8357,-8360,-8364]],"properties":{"id":"24662396","dp":3551,"de":0}},{"type":"Polygon","arcs":[[-5407,-5419,-5424,-8225,-5931,-8365,-8361,8365]],"properties":{"id":"24662397","dp":1083,"de":645}},{"type":"Polygon","arcs":[[-8366,-8363,8366,8367,-5408]],"properties":{"id":"24662398","dp":3300,"de":828}},{"type":"Polygon","arcs":[[-8367,-5285,8368,8369]],"properties":{"id":"24662399","dp":5645,"de":931}},{"type":"Polygon","arcs":[[-8368,-8370,8370,8371,8372,8373,-5411]],"properties":{"id":"24662400","dp":5122,"de":1226}},{"type":"Polygon","arcs":[[-8371,-8369,-5284,-5278,-5283,8374,8375]],"properties":{"id":"24662401","dp":3008,"de":531}},{"type":"Polygon","arcs":[[-8372,-8376,8376]],"properties":{"id":"24662402","dp":9081,"de":0}},{"type":"Polygon","arcs":[[-8028,8377,-8373,-8377,-8375,-5282,-8039,-8033]],"properties":{"id":"24662403","dp":6617,"de":0}},{"type":"Polygon","arcs":[[-5412,-8374,-8378,-8027]],"properties":{"id":"24662404","dp":9221,"de":0}},{"type":"Polygon","arcs":[[-3582,-6946,-6898,8378]],"properties":{"id":"24662822","dp":3355,"de":0}},{"type":"Polygon","arcs":[[-8379,-6897,-882,8379]],"properties":{"id":"24662823","dp":4159,"de":0}},{"type":"Polygon","arcs":[[-3583,-8380,-881,8380,-6943,-6945]],"properties":{"id":"24662824","dp":5738,"de":0}},{"type":"Polygon","arcs":[[-6937,-6944,-8381,-880,8381]],"properties":{"id":"24662825","dp":4732,"de":0}},{"type":"Polygon","arcs":[[-6938,-8382,-884,8382]],"properties":{"id":"24662826","dp":9033,"de":0}},{"type":"Polygon","arcs":[[-8383,-879,8383,-6939]],"properties":{"id":"24662827","dp":8535,"de":656}},{"type":"Polygon","arcs":[[-8384,-875,8384,-6941]],"properties":{"id":"24662828","dp":4735,"de":0}},{"type":"Polygon","arcs":[[-8385,-874,-869,-6748,-6749,-6752]],"properties":{"id":"24662829","dp":6797,"de":0}},{"type":"Polygon","arcs":[[8385,8386,-8051,-5159]],"properties":{"id":"24662417","dp":9238,"de":538}},{"type":"Polygon","arcs":[[-5155,8387,-5158,-3444]],"properties":{"id":"24662418","dp":8750,"de":0}},{"type":"Polygon","arcs":[[8388,-8386,-8388,-5154,-5975]],"properties":{"id":"24662419","dp":6129,"de":0}},{"type":"Polygon","arcs":[[-8032,-8036,-8038,-8041,-8048,-8050,-8387,-8389,-5974,8389]],"properties":{"id":"24662420","dp":539,"de":159}},{"type":"Polygon","arcs":[[-5957,-1531,-1526,-1524,-1520,-1519,-1513,8390,-5403,-8026,-3503,-8030,-8390,-5973]],"properties":{"id":"24662421","dp":93,"de":1414}},{"type":"Polygon","arcs":[[-1512,8391,8392,-6588,-6582,-6587,-6591,-5392,-8391]],"properties":{"id":"24662422","dp":1808,"de":351}},{"type":"Polygon","arcs":[[8393,-6589,-8393]],"properties":{"id":"24662423","dp":2362,"de":0}},{"type":"Polygon","arcs":[[-6574,-6580,-6590,-8394,-8392,-1511,-1504]],"properties":{"id":"24662424","dp":2937,"de":0}},{"type":"Polygon","arcs":[[-1932,-7717,-3522,-1610,-1615,-1617,-1619,-1622,-1627,-6930,8394,8395,-7094,-7101,-1404,-1410,-1423]],"properties":{"id":"24662849","dp":137,"de":2719}},{"type":"Polygon","arcs":[[8396,-8395,-6929,-6921,-6761,-6758,8397]],"properties":{"id":"24662850","dp":1660,"de":2564}},{"type":"Polygon","arcs":[[8398,-8398,-2084,8399,8400,8401]],"properties":{"id":"24662851","dp":6271,"de":2103}},{"type":"Polygon","arcs":[[-8400,-2087,-2090,8402,8403]],"properties":{"id":"24662852","dp":7329,"de":1475}},{"type":"Polygon","arcs":[[-8404,8404,8405,-8401]],"properties":{"id":"24662853","dp":8669,"de":0}},{"type":"Polygon","arcs":[[8406,-8405,-8403,-2093,8407,8408]],"properties":{"id":"24662854","dp":7892,"de":0}},{"type":"Polygon","arcs":[[-8402,-8406,-8407,8409,8410]],"properties":{"id":"24662855","dp":8326,"de":0}},{"type":"Polygon","arcs":[[8411,-8410,-8409,8412,-6711]],"properties":{"id":"24662856","dp":5615,"de":0}},{"type":"Polygon","arcs":[[-8408,-6723,-6712,-8413]],"properties":{"id":"24662857","dp":6407,"de":1388}},{"type":"Polygon","arcs":[[-8314,-8311,-6197,8413,-8317]],"properties":{"id":"24662662","dp":7637,"de":1026}},{"type":"Polygon","arcs":[[-8318,-8414,-6196,-6494,8414]],"properties":{"id":"24662663","dp":11495,"de":0}},{"type":"Polygon","arcs":[[-8319,-8415,-6493,8415,8416,-8072]],"properties":{"id":"24662664","dp":9173,"de":0}},{"type":"Polygon","arcs":[[-8416,-6495,8417,8418]],"properties":{"id":"24662665","dp":10692,"de":1207}},{"type":"Polygon","arcs":[[-8073,-8417,-8419,8419,-7315,-8069]],"properties":{"id":"24662666","dp":6614,"de":1566}},{"type":"Polygon","arcs":[[-8420,8420,8421,-7310,-7313]],"properties":{"id":"24662667","dp":7802,"de":1121}},{"type":"Polygon","arcs":[[-8418,-6287,8422,8423,-8421]],"properties":{"id":"24662668","dp":8275,"de":1793}},{"type":"Polygon","arcs":[[-7311,-8422,-8424,8424,-6285,-6294,-6301]],"properties":{"id":"24662669","dp":8402,"de":1341}},{"type":"Polygon","arcs":[[-6286,-8425,-8423]],"properties":{"id":"24662670","dp":7604,"de":0}},{"type":"Polygon","arcs":[[-6335,-6330,8425,8426,-5697]],"properties":{"id":"24663047","dp":2602,"de":2169}},{"type":"Polygon","arcs":[[-5694,-5698,-8427,8427,8428]],"properties":{"id":"24663048","dp":3553,"de":419}},{"type":"Polygon","arcs":[[-6843,-6837,-5663,-5695,-8429,8429]],"properties":{"id":"24663049","dp":4050,"de":746}},{"type":"Polygon","arcs":[[8430,8431,8432,-8241]],"properties":{"id":"24662769","dp":25506,"de":0}},{"type":"Polygon","arcs":[[8433,-8432,8434,8435]],"properties":{"id":"24662770","dp":21375,"de":0}},{"type":"Polygon","arcs":[[8436,-8436,8437,8438]],"properties":{"id":"24662771","dp":20604,"de":0}},{"type":"Polygon","arcs":[[-6671,-8438,-8435,-8431,-8240,-8230,-6677]],"properties":{"id":"24662772","dp":16165,"de":0}},{"type":"Polygon","arcs":[[-8437,8439,8440,-8237,-8239,-8242,-8433,-8434]],"properties":{"id":"24662773","dp":23203,"de":0}},{"type":"Polygon","arcs":[[8441,8442,8443,8444,8445,-6891,-8441]],"properties":{"id":"24662774","dp":23203,"de":0}},{"type":"Polygon","arcs":[[8446,-6886,-6892,-8446]],"properties":{"id":"24662775","dp":10721,"de":0}},{"type":"Polygon","arcs":[[-8445,8447,-6887,-8447]],"properties":{"id":"24662776","dp":19648,"de":0}},{"type":"Polygon","arcs":[[-8444,8448,-6888,-8448]],"properties":{"id":"24662777","dp":17637,"de":0}},{"type":"Polygon","arcs":[[8449,-6889,-8449,-8443]],"properties":{"id":"24662778","dp":17371,"de":1359}},{"type":"Polygon","arcs":[[-8450,-8442,8450,8451,8452,-6884]],"properties":{"id":"24662779","dp":16058,"de":0}},{"type":"Polygon","arcs":[[8453,8454,-8452]],"properties":{"id":"24662780","dp":11947,"de":0}},{"type":"Polygon","arcs":[[-8453,-8455,8455,-6871,-6874,-6881]],"properties":{"id":"24662781","dp":16317,"de":0}},{"type":"Polygon","arcs":[[-8454,-8451,-8440,-8439,-6670,-6668,-7723,8456,8457,-8456]],"properties":{"id":"24662782","dp":4226,"de":2476}},{"type":"Polygon","arcs":[[8458,-6867,-6868,-8458]],"properties":{"id":"24662783","dp":6920,"de":1739}},{"type":"Polygon","arcs":[[-7722,-7720,8459,8460,-8459,-8457]],"properties":{"id":"24662784","dp":6180,"de":431}},{"type":"Polygon","arcs":[[-8461,8461,8462,-6862,-6865]],"properties":{"id":"24662785","dp":6323,"de":0}},{"type":"Polygon","arcs":[[-7719,8463,8464,8465,-8462,-8460]],"properties":{"id":"24662786","dp":3458,"de":468}},{"type":"Polygon","arcs":[[-3610,-3602,-8350]],"properties":{"id":"24662461","dp":4240,"de":0}},{"type":"Polygon","arcs":[[-8125,-8129,-3605]],"properties":{"id":"24662463","dp":11983,"de":0}},{"type":"Polygon","arcs":[[-5967,8466,8467,-6032]],"properties":{"id":"24662465","dp":5102,"de":759}},{"type":"Polygon","arcs":[[-5966,-5979,-7329,8468,8469,-8467]],"properties":{"id":"24662466","dp":4620,"de":338}},{"type":"Polygon","arcs":[[8470,8471,-8469,-7328,-7325,8472]],"properties":{"id":"24662467","dp":2391,"de":0}},{"type":"Polygon","arcs":[[8473,-8471,8474,8475,8476,8477,8478]],"properties":{"id":"24662468","dp":4822,"de":559}},{"type":"Polygon","arcs":[[-8473,8479,-8475]],"properties":{"id":"24662469","dp":3556,"de":564}},{"type":"Polygon","arcs":[[8480,-8480,-7324,-8160,8481,8482]],"properties":{"id":"24662470","dp":3623,"de":279}},{"type":"Polygon","arcs":[[8483,-8476,-8481,8484]],"properties":{"id":"24662471","dp":7373,"de":0}},{"type":"Polygon","arcs":[[8485,-8485,-8483,8486]],"properties":{"id":"24662472","dp":5387,"de":0}},{"type":"Polygon","arcs":[[8487,-8484,-8486,8488]],"properties":{"id":"24662473","dp":12297,"de":0}},{"type":"Polygon","arcs":[[8489,-8489,-8487,-8482,-8165,8490]],"properties":{"id":"24662474","dp":4198,"de":270}},{"type":"Polygon","arcs":[[-6810,8491,-912,-910,-6832,-6827,-6822]],"properties":{"id":"24662897","dp":3813,"de":123}},{"type":"Polygon","arcs":[[8492,-913,-8492,-6809]],"properties":{"id":"24662898","dp":4568,"de":568}},{"type":"Polygon","arcs":[[8493,-907,-8493,-6808,8494]],"properties":{"id":"24662899","dp":2107,"de":1585}},{"type":"Polygon","arcs":[[8495,8496,-902,-904,-8494]],"properties":{"id":"24662900","dp":4924,"de":665}},{"type":"Polygon","arcs":[[-8497,8497,-6731,8498,-897,-903]],"properties":{"id":"24662901","dp":2928,"de":1075}},{"type":"Polygon","arcs":[[-898,-8499,-6735,-887,-893]],"properties":{"id":"24662902","dp":2286,"de":710}},{"type":"Polygon","arcs":[[-7096,8499,-6717,-6722,-8498,-8496,-8495,-6807]],"properties":{"id":"24662903","dp":521,"de":1841}},{"type":"Polygon","arcs":[[-8396,-8397,-8399,-8411,-8412,-6715,-6718,-8500,-7095]],"properties":{"id":"24662904","dp":812,"de":707}},{"type":"Polygon","arcs":[[8500,-8284]],"properties":{"id":"24662234","dp":14190,"de":0}},{"type":"Polygon","arcs":[[8501,-8285,-8501,-8283]],"properties":{"id":"24662235","dp":16380,"de":3095}},{"type":"Polygon","arcs":[[8502,-8181,8503]],"properties":{"id":"24662484","dp":19962,"de":1492}},{"type":"Polygon","arcs":[[8504,8505,-8491,-8164,-8182,-8503,8506,-3405]],"properties":{"id":"24662485","dp":5838,"de":1651}},{"type":"Polygon","arcs":[[-8507,-8504,-8180,-3406]],"properties":{"id":"24662486","dp":14878,"de":0}},{"type":"Polygon","arcs":[[-8187,8507,-3410]],"properties":{"id":"24662489","dp":9876,"de":2160}},{"type":"Polygon","arcs":[[8508,-8508,8509,-4335]],"properties":{"id":"24662490","dp":19199,"de":0}},{"type":"Polygon","arcs":[[-8509,8510,-3411]],"properties":{"id":"24662491","dp":34928,"de":0}},{"type":"Polygon","arcs":[[-3402,-8511,-4334,-5997,8511]],"properties":{"id":"24662492","dp":12140,"de":0}},{"type":"Polygon","arcs":[[8512,-8470,-8472,-8474,8513,8514,8515,8516,-3403,-8512,-5996,-6034]],"properties":{"id":"24662493","dp":1490,"de":1459}},{"type":"Polygon","arcs":[[-8468,-8513,-6033]],"properties":{"id":"24662494","dp":4528,"de":1570}},{"type":"Polygon","arcs":[[-8514,-8479,8517,8518]],"properties":{"id":"24662495","dp":9017,"de":0}},{"type":"Polygon","arcs":[[-8478,8519,8520,-8518]],"properties":{"id":"24662496","dp":8538,"de":0}},{"type":"Polygon","arcs":[[-8515,-8519,-8521,8521,8522]],"properties":{"id":"24662497","dp":7138,"de":0}},{"type":"Polygon","arcs":[[-8522,-8520,-8477,-8488,8523]],"properties":{"id":"24662498","dp":6698,"de":0}},{"type":"Polygon","arcs":[[8524,-8516,-8523,-8524,-8490,-8506]],"properties":{"id":"24662499","dp":2859,"de":0}},{"type":"Polygon","arcs":[[-8517,-8525,-8505,-3404]],"properties":{"id":"24662500","dp":5176,"de":1158}},{"type":"Polygon","arcs":[[-8510,-8186,8525,-4336]],"properties":{"id":"24662501","dp":7973,"de":460}},{"type":"Polygon","arcs":[[8526,8527,8528,8529,-1144,-7120,-7121]],"properties":{"id":"24662919","dp":3474,"de":1285}},{"type":"Polygon","arcs":[[8530,-8527,-7122,-7116,-7107]],"properties":{"id":"24662920","dp":5565,"de":1180}},{"type":"Polygon","arcs":[[-6997,8531,-8528,-8531,-7106,-7097,-6805,8532,-7144,-7142]],"properties":{"id":"24662921","dp":173,"de":1649}},{"type":"Polygon","arcs":[[-8529,-8532,-7001,8533,8534,8535]],"properties":{"id":"24662922","dp":6053,"de":1490}},{"type":"Polygon","arcs":[[-8530,-8536,8536,-1145]],"properties":{"id":"24662923","dp":3874,"de":0}},{"type":"Polygon","arcs":[[-8537,-8535,8537,-1146]],"properties":{"id":"24662924","dp":10460,"de":0}},{"type":"Polygon","arcs":[[-8534,8538,-1151,-1147,-8538]],"properties":{"id":"24662925","dp":8115,"de":687}},{"type":"Polygon","arcs":[[-8539,-7000,8539,-3789]],"properties":{"id":"24662926","dp":10821,"de":0}},{"type":"Polygon","arcs":[[-6999,-6996,-3782,-8540]],"properties":{"id":"24662927","dp":7975,"de":0}},{"type":"Polygon","arcs":[[8540,8541,8542,-3520,8543,-2349,8544,8545,8546,8547]],"properties":{"id":"24662518","dp":3065,"de":950}},{"type":"Polygon","arcs":[[-2386,-2397,8548,-3514,-8543,8549,8550,-2388]],"properties":{"id":"24662519","dp":1466,"de":1851}},{"type":"Polygon","arcs":[[-8550,-8542,8551]],"properties":{"id":"24662520","dp":6465,"de":0}},{"type":"Polygon","arcs":[[-8551,-8552,-8541,8552,-2373,-2389]],"properties":{"id":"24662521","dp":6449,"de":464}},{"type":"Polygon","arcs":[[-8553,-8548,8553,-2374]],"properties":{"id":"24662522","dp":7862,"de":703}},{"type":"Polygon","arcs":[[-8554,-8547,8554,-2375]],"properties":{"id":"24662523","dp":9225,"de":1320}},{"type":"Polygon","arcs":[[-8555,-8546,8555,-2369]],"properties":{"id":"24662524","dp":9885,"de":1575}},{"type":"Polygon","arcs":[[-8556,-8545,-2348,8556,-2366]],"properties":{"id":"24662525","dp":5619,"de":1733}},{"type":"Polygon","arcs":[[-8557,-2347,8557,-2359]],"properties":{"id":"24662526","dp":7254,"de":751}},{"type":"Polygon","arcs":[[-8558,-2346,-2360]],"properties":{"id":"24662527","dp":8389,"de":4424}},{"type":"Polygon","arcs":[[-7147,-7145,-8533,-6821,8558,8559,8560,-6815,-6829,-6831,8561,-1139,-1128]],"properties":{"id":"24662936","dp":292,"de":277}},{"type":"Polygon","arcs":[[-6820,8562,-8559]],"properties":{"id":"24662937","dp":3045,"de":0}},{"type":"Polygon","arcs":[[8563,8564,-8560,-8563,-6819]],"properties":{"id":"24662938","dp":626,"de":553}},{"type":"Polygon","arcs":[[-6818,8565,-6816,8566,-8564]],"properties":{"id":"24662939","dp":4716,"de":212}},{"type":"Polygon","arcs":[[-8561,-8565,-8567]],"properties":{"id":"24662940","dp":7082,"de":0}},{"type":"Polygon","arcs":[[-6817,-8566]],"properties":{"id":"24662941","dp":8629,"de":0}},{"type":"Polygon","arcs":[[-6647,8567,-8464,-7718,-6652]],"properties":{"id":"24662787","dp":10380,"de":0}},{"type":"Polygon","arcs":[[8568,-8465,-8568,-6646]],"properties":{"id":"24662788","dp":7279,"de":0}},{"type":"Polygon","arcs":[[-8569,-6645,-6642,-6630,8569,8570,8571,-6863,-8463,-8466]],"properties":{"id":"24662789","dp":3669,"de":1229}},{"type":"Polygon","arcs":[[-6625,-6850,-8344,8572,-8570,-6627]],"properties":{"id":"24662790","dp":4535,"de":608}},{"type":"Polygon","arcs":[[-8340,8573,8574,-8571,-8573]],"properties":{"id":"24662791","dp":7766,"de":431}},{"type":"Polygon","arcs":[[-8575,8575,8576,-8572]],"properties":{"id":"24662792","dp":7101,"de":0}},{"type":"Polygon","arcs":[[8577,-6855,-6864,-8577]],"properties":{"id":"24662793","dp":8053,"de":0}},{"type":"Polygon","arcs":[[-8574,-8339,-6506,8578,-6856,-8578,-8576]],"properties":{"id":"24662794","dp":4649,"de":521}},{"type":"Polygon","arcs":[[-7249,-5125,8579,8580]],"properties":{"id":"24661448","dp":19959,"de":1829}},{"type":"Polygon","arcs":[[-7250,-8581,8581,-7257]],"properties":{"id":"24661449","dp":16301,"de":2397}},{"type":"Polygon","arcs":[[-8582,8582,-7189,-7703]],"properties":{"id":"24661450","dp":14756,"de":2951}},{"type":"Polygon","arcs":[[-8580,8583,-7187,-8583]],"properties":{"id":"24661451","dp":16106,"de":2663}},{"type":"Polygon","arcs":[[8584,-7185,-8584,-5124]],"properties":{"id":"24661452","dp":12818,"de":5369}},{"type":"Polygon","arcs":[[8585,-7186,-8585,-5123,-5121]],"properties":{"id":"24661453","dp":11920,"de":6989}},{"type":"Polygon","arcs":[[8586,-7079,-8586,-5117,-7736]],"properties":{"id":"24661454","dp":11504,"de":7619}},{"type":"Polygon","arcs":[[-7075,-8587,-7735,8587]],"properties":{"id":"24661455","dp":12901,"de":4948}},{"type":"Polygon","arcs":[[-7055,-7067,-7069,-8588,-7733]],"properties":{"id":"24661456","dp":13718,"de":5895}},{"type":"Polygon","arcs":[[-8246,-6112,8588,-6367,-6376,-8286,-8502,-8282,-8263]],"properties":{"id":"24662236","dp":1511,"de":4086}},{"type":"Polygon","arcs":[[-6111,8589,-6108,-6368,-8589]],"properties":{"id":"24662237","dp":3294,"de":422}},{"type":"Polygon","arcs":[[-1098,8590,-1118,-1116]],"properties":{"id":"24662556","dp":11476,"de":0}},{"type":"Polygon","arcs":[[8591,8592,-8205,8593,8594,-1119,-8591,-1097]],"properties":{"id":"24662557","dp":4123,"de":3292}},{"type":"Polygon","arcs":[[8595,-8595,8596,8597]],"properties":{"id":"24662558","dp":8326,"de":0}},{"type":"Polygon","arcs":[[-8598,8598,8599,8600]],"properties":{"id":"24662559","dp":5288,"de":613}},{"type":"Polygon","arcs":[[8601,-8214,-8217,-8599]],"properties":{"id":"24662560","dp":12432,"de":720}},{"type":"Polygon","arcs":[[-8204,-8209,-8212,-8602,-8597,-8594]],"properties":{"id":"24662561","dp":9287,"de":2833}},{"type":"Polygon","arcs":[[-8600,-8216,-8221,8602]],"properties":{"id":"24662562","dp":8028,"de":976}},{"type":"Polygon","arcs":[[-2402,8603,-8603,-8220,8604]],"properties":{"id":"24662563","dp":8239,"de":4731}},{"type":"Polygon","arcs":[[-1120,-8596,-8601,-8604,-2406]],"properties":{"id":"24662564","dp":4582,"de":474}},{"type":"Polygon","arcs":[[-2395,-2403,-8605,-8219,-8223,8605]],"properties":{"id":"24662565","dp":3355,"de":610}},{"type":"Polygon","arcs":[[-2396,-8606,-8224,-8549]],"properties":{"id":"24662566","dp":3272,"de":0}},{"type":"Polygon","arcs":[[-8196,-8200,-8202,-8593,8606]],"properties":{"id":"24662567","dp":3434,"de":622}},{"type":"Polygon","arcs":[[8607,-8197,-8607,-8592,8608]],"properties":{"id":"24662568","dp":3493,"de":565}},{"type":"Polygon","arcs":[[-4328,8609,-8198,-8608,8610]],"properties":{"id":"24662569","dp":6037,"de":1204}},{"type":"Polygon","arcs":[[-3970,-3979,-4329,-8611,-8609,-1107,-5783]],"properties":{"id":"24662570","dp":2161,"de":753}},{"type":"Polygon","arcs":[[-4337,-8526,-8193,-8610,-4332]],"properties":{"id":"24662571","dp":8681,"de":0}},{"type":"Polygon","arcs":[[-2356,8611,-7289]],"properties":{"id":"24662572","dp":9447,"de":1142}},{"type":"Polygon","arcs":[[-8612,-2352,8612,8613,-7290]],"properties":{"id":"24662573","dp":9425,"de":2156}},{"type":"Polygon","arcs":[[-8614,8614,8615,8616]],"properties":{"id":"24662574","dp":7817,"de":7025}},{"type":"Polygon","arcs":[[8617,8618,-8615,-8613,-2351,8619,-8309,-8306,-8304]],"properties":{"id":"24662575","dp":2838,"de":1164}},{"type":"Polygon","arcs":[[-8616,-8619,8620,8621]],"properties":{"id":"24662576","dp":10968,"de":0}},{"type":"Polygon","arcs":[[-7282,8622,-8621,-8618,-8298]],"properties":{"id":"24662577","dp":9951,"de":1539}},{"type":"Polygon","arcs":[[-7291,-8617,-8622,-8623,-7281,-7285]],"properties":{"id":"24662578","dp":8510,"de":5229}}]}},"arcs":[[[7594,1708],[19,-83],[3,-12]],[[7616,1613],[-16,-5],[-10,-3]],[[7590,1605],[-3,12],[-2,11],[-6,28],[-7,33],[-3,12]],[[7569,1701],[25,7]],[[7554,1595],[-2,11],[-16,73],[-3,11]],[[7533,1690],[17,5],[19,6]],[[7590,1605],[-19,-6],[-17,-4]],[[7517,1685],[16,5]],[[7554,1595],[-18,-6]],[[7536,1589],[-2,12],[-15,73],[-2,11]],[[7518,1584],[-18,-5]],[[7500,1579],[-3,10],[-6,33],[-12,52]],[[7479,1674],[20,6]],[[7499,1680],[18,5]],[[7536,1589],[-18,-5]],[[7443,1562],[-2,10],[-7,31],[-2,12],[19,5],[-10,43],[19,6],[19,5]],[[7500,1579],[-19,-6]],[[7481,1573],[-19,-5],[-19,-6]],[[7443,1562],[-18,-5]],[[7425,1557],[-2,10],[-6,31],[-2,12],[-4,19],[-3,10],[-2,7],[-2,1]],[[7404,1647],[1,1],[10,20],[14,29],[2,3]],[[7431,1700],[16,-11],[24,7],[3,1],[5,-23]],[[7431,1700],[29,59],[-3,11]],[[7457,1770],[11,3],[11,3]],[[7479,1776],[3,-12],[15,-72],[2,-12]],[[7479,1776],[18,5]],[[7497,1781],[16,5]],[[7513,1786],[2,-12],[16,-72],[2,-12]],[[7513,1786],[17,5]],[[7530,1791],[19,5]],[[7549,1796],[2,-11],[16,-72],[2,-12]],[[7549,1796],[24,7]],[[7573,1803],[21,-95]],[[7573,1803],[22,7],[19,6]],[[7614,1816],[2,-11],[4,-17],[2,-10]],[[7622,1778],[6,-23],[2,-11],[3,-13],[2,-10]],[[7635,1721],[-18,-6],[-23,-7]],[[7662,1777],[4,-15],[2,-10],[2,-11],[2,-8]],[[7672,1733],[-9,-3],[-9,-3],[2,-11],[13,-56],[7,2],[2,0],[10,0]],[[7688,1662],[3,-12],[3,-12],[-9,-4],[-10,-3]],[[7675,1631],[-18,-5]],[[7657,1626],[-2,10],[-8,34],[-9,40],[-3,11]],[[7622,1778],[19,6],[2,-9],[7,2],[2,0],[10,0]],[[7735,1704],[-1,-22],[-1,-23]],[[7733,1659],[-11,1],[-34,2]],[[7672,1733],[1,-3],[63,-4]],[[7736,1726],[-1,-11],[0,-11]],[[7662,1777],[14,-1],[32,-2],[10,-1],[21,-1],[11,-1]],[[7750,1771],[1,-4]],[[7751,1767],[-1,-10],[-10,-6],[-3,-3],[-1,-11],[0,-11]],[[7808,1698],[-73,6]],[[7751,1767],[65,-4]],[[7816,1763],[-1,-20],[-5,0],[0,-11],[-1,-11],[-1,-11],[0,-12]],[[7750,1771],[1,17],[1,10]],[[7752,1798],[0,10]],[[7752,1808],[66,-4]],[[7818,1804],[-1,-21],[-1,-20]],[[7752,1808],[1,15],[0,6],[1,21],[1,6]],[[7755,1856],[1,17],[0,4],[1,20]],[[7757,1897],[4,-1],[36,-3],[15,-1],[11,-1]],[[7823,1891],[-2,-23],[-1,-23]],[[7820,1845],[-1,-21],[-1,-20]],[[7902,1819],[-8,-30],[-11,-32]],[[7883,1757],[-3,2],[-64,4]],[[7820,1845],[11,0],[38,-3],[9,-1],[-1,-20],[22,-2],[3,0]],[[7823,1891],[10,-1],[37,-2],[1,0],[10,-1],[1,27],[1,30],[1,15],[1,14]],[[7885,1973],[9,0],[10,-1],[3,0]],[[7907,1972],[4,-40],[1,-20]],[[7912,1912],[0,-8],[-2,-28],[-3,-28],[-5,-29]],[[7823,1891],[1,27],[2,30],[-11,0],[-6,1],[2,29]],[[7811,1978],[5,0],[10,-1]],[[7826,1977],[11,0],[5,-1],[9,0],[34,-3]],[[7757,1897],[1,21],[1,5],[0,16]],[[7759,1939],[1,14],[0,6],[2,24]],[[7762,1983],[9,-1],[1,0],[30,-3],[9,-1]],[[7762,1983],[1,29]],[[7763,2012],[2,29]],[[7765,2041],[11,-1],[5,0],[49,-4]],[[7830,2036],[-2,-29],[-2,-30]],[[7717,1942],[1,20],[1,23],[2,30]],[[7721,2015],[9,-1],[24,-1],[9,-1]],[[7759,1939],[-9,0],[-24,2],[-9,1]],[[7674,2018],[1,12],[0,17]],[[7675,2047],[48,-3],[38,-3],[4,0]],[[7721,2015],[-9,0],[-22,2],[-7,0],[-9,1]],[[7671,1945],[1,21]],[[7672,1966],[1,21]],[[7673,1987],[1,21],[0,10]],[[7717,1942],[-9,0],[-28,3],[-9,0]],[[7672,1966],[-9,0],[-70,6]],[[7593,1972],[-3,10],[-2,10],[75,-4],[1,0],[9,-1]],[[7593,1972],[-14,-5]],[[7579,1967],[-7,34]],[[7572,2001],[-3,11],[0,9],[-4,10]],[[7565,2031],[7,6],[23,22],[1,3],[-1,2],[2,7],[3,4],[7,8]],[[7607,2083],[6,-7],[4,-3],[23,-17],[9,-7],[26,-2]],[[7583,1952],[-4,15]],[[7671,1945],[-9,1],[-19,2],[-45,3],[-15,1]],[[7592,1912],[-2,10],[-7,30]],[[7671,1945],[-1,-20],[-2,-21]],[[7668,1904],[-8,1],[-50,3],[-3,8],[-15,-4]],[[7551,1899],[-2,5],[-7,35],[11,3],[11,4],[-11,49],[9,3],[10,3]],[[7592,1912],[-19,-6],[-11,-4],[-11,-3]],[[6769,2744],[-8,6],[-44,32],[-9,7]],[[6708,2789],[10,19],[6,11]],[[6724,2819],[20,-16],[21,-15],[6,11],[7,13]],[[6778,2812],[20,-16],[-12,-23],[-6,-11],[-7,-13],[-4,-5]],[[6744,2698],[-14,11],[-47,35]],[[6683,2744],[12,22],[13,23]],[[6769,2744],[-12,-24],[-6,-11],[-7,-11]],[[6818,2644],[-31,22],[-4,4],[-39,28]],[[6778,2812],[-7,7],[1,2],[1,2],[2,4]],[[6775,2827],[61,-45]],[[6836,2782],[40,-30]],[[6876,2752],[-1,-4],[-2,-3],[-8,-14],[-6,-13],[-13,-23]],[[6846,2695],[-16,-29],[-12,-22]],[[6818,2644],[-7,-13]],[[6811,2631],[-73,56]],[[6738,2687],[6,11]],[[6787,2558],[-23,-1],[-16,3]],[[6748,2560],[6,11],[3,15],[-23,5],[-23,6],[-22,15],[-20,14]],[[6669,2626],[9,13],[9,7],[18,6],[14,-1],[13,24],[6,12]],[[6811,2631],[-6,-11],[-12,-21],[-7,-15],[0,-14],[1,-12]],[[6872,2507],[-3,-1],[-24,-14]],[[6845,2492],[-20,-11],[-11,-3],[-8,-2],[-15,-1]],[[6791,2475],[-1,26],[0,3],[-2,26],[18,2],[5,2],[6,3],[7,6],[-18,13],[-5,2],[-5,1],[-9,-1]],[[6811,2631],[27,-20],[36,-27],[3,-2]],[[6877,2582],[-6,-10],[-12,-22],[-13,-24],[16,-12],[10,-7]],[[6736,2472],[-8,5],[-26,6],[-25,11]],[[6677,2494],[19,20],[2,2],[24,20],[16,11],[10,13]],[[6791,2475],[-28,-2],[-27,-1]],[[6864,2373],[-89,66],[-36,26],[-3,7]],[[6845,2492],[59,-43]],[[6904,2449],[-12,-23],[-13,-24]],[[6879,2402],[-13,-25],[-2,-4]],[[6831,2309],[-90,66]],[[6741,2375],[-59,44]],[[6682,2419],[17,18],[16,18],[16,16],[5,1]],[[6864,2373],[-11,-20]],[[6853,2353],[-12,-21],[-4,-10],[-6,-13]],[[6831,2309],[-11,-22],[-30,22],[-18,-17],[37,-26]],[[6809,2266],[-6,-10],[-11,-14]],[[6792,2242],[-15,11],[-5,-1],[-14,9],[-7,0],[-38,24]],[[6713,2285],[10,20],[2,13],[0,25],[4,10],[12,22]],[[6888,2268],[-11,-22],[-12,-21]],[[6865,2225],[-56,41]],[[6831,2309],[57,-41]],[[6853,2353],[45,-34],[11,-8]],[[6909,2311],[-11,-20],[-10,-23]],[[6879,2402],[56,-41]],[[6935,2361],[-13,-25],[-13,-25]],[[6904,2449],[56,-42]],[[6960,2407],[-12,-23],[-13,-23]],[[6999,2314],[-64,47]],[[6960,2407],[64,-48]],[[7024,2359],[-12,-22],[-13,-23]],[[6960,2407],[6,10],[5,11],[11,19]],[[6982,2447],[64,-48]],[[7046,2399],[-10,-20],[-6,-10],[-6,-10]],[[6982,2447],[11,19]],[[6993,2466],[11,20]],[[7004,2486],[64,-48]],[[7068,2438],[-11,-20],[-11,-19]],[[7004,2486],[10,20],[11,20]],[[7025,2526],[11,-7]],[[7036,2519],[53,-41]],[[7089,2478],[-10,-20],[-11,-20]],[[7167,2476],[-2,-2],[-2,2],[-1,0],[-1,0],[-2,-2],[-1,-4],[-17,-31]],[[7141,2439],[-18,13],[-16,13],[-18,13]],[[7036,2519],[9,19],[55,-41],[11,20],[5,10],[2,2],[2,5],[2,3],[2,4]],[[7124,2541],[5,-8],[10,-20],[5,-9],[1,0],[5,-8],[7,-9],[5,-5],[5,-6]],[[7025,2526],[-9,7],[-13,11],[-1,3]],[[7002,2547],[5,0],[14,4],[7,3],[5,2]],[[7033,2556],[5,4],[6,5],[4,3],[5,8]],[[7053,2576],[11,20],[3,4],[2,4],[1,3]],[[7070,2607],[5,-3],[6,-5],[7,-7],[5,-5],[9,-10],[5,-7],[4,-6],[2,-3],[7,-12],[4,-8]],[[7234,2415],[-4,3],[-11,9],[-8,8],[-10,8],[-6,7],[-7,7],[-18,16],[-3,3]],[[7070,2607],[2,4]],[[7072,2611],[8,-6],[11,-8],[14,-13],[26,-31],[12,-8]],[[7143,2545],[5,-4],[17,-13],[51,-38]],[[7216,2490],[41,-31]],[[7257,2459],[-9,-18],[-3,-6]],[[7245,2435],[-1,-1],[-6,-12],[-3,-5],[-1,-2]],[[7272,2574],[42,-32]],[[7314,2542],[-7,-9],[-16,-20]],[[7291,2513],[-13,-19],[-11,-18]],[[7267,2476],[-10,-17]],[[7216,2490],[9,17],[10,18]],[[7235,2525],[7,9],[7,10],[-34,26],[10,17],[2,5],[37,-27],[6,7],[2,2]],[[7235,2525],[-73,55],[-10,-18],[-5,-10],[-4,-7]],[[7072,2611],[2,4],[1,4],[4,6],[5,8],[29,35],[19,20],[14,8],[1,0],[14,2],[15,-2],[11,-2],[6,1],[9,2]],[[7202,2697],[16,10],[4,3]],[[7222,2710],[43,-31],[9,-8],[-15,-39],[-8,-16],[-5,-9],[-5,-10],[5,-4],[8,-6],[7,-5],[11,-8]],[[7202,2697],[-13,10],[-4,3],[-25,19],[-5,3],[-5,6],[0,6],[-11,-1],[-11,-15]],[[7128,2728],[2,10],[-1,7],[-3,7],[-4,11],[-8,8],[-24,17]],[[7090,2788],[-6,22],[2,13]],[[7086,2823],[94,-70],[4,-2]],[[7184,2751],[-6,-11],[27,-17],[17,-13]],[[7060,2684],[-2,7],[-14,56],[-8,36],[-7,15],[-9,8]],[[7020,2806],[6,9],[9,5],[13,0],[10,-8],[32,-24]],[[7128,2728],[-14,-20],[-4,-6],[-20,-26],[-15,-2],[-15,10]],[[7060,2684],[-32,25],[-5,4]],[[7023,2713],[-36,28],[-7,6],[-1,1],[-13,7]],[[6966,2755],[31,58]],[[6997,2813],[4,7]],[[7001,2820],[19,-14]],[[7001,2820],[26,47]],[[7027,2867],[59,-44]],[[6997,2813],[-18,13],[-17,13]],[[6962,2839],[-16,12]],[[6946,2851],[30,54]],[[6976,2905],[16,-12],[17,-12],[18,-14]],[[8099,2087],[4,74]],[[8103,2161],[21,-1]],[[8124,2160],[22,-2]],[[8146,2158],[-4,-74]],[[8142,2084],[-21,2],[-22,1]],[[8146,2158],[21,-1]],[[8167,2157],[-3,-75],[-22,2]],[[8138,2014],[4,70]],[[8167,2157],[10,-1],[1,0],[2,0],[9,-1]],[[8189,2155],[-4,-74]],[[8185,2081],[-4,-71]],[[8181,2010],[-21,3],[-22,1]],[[7911,3064],[-4,5],[-6,5],[-4,4],[-3,3]],[[7894,3081],[22,34]],[[7916,3115],[13,-9],[1,0],[7,-5]],[[7937,3101],[-11,-17],[-6,-8],[-2,-2],[-2,-3],[-5,-7]],[[7894,3081],[-11,11],[-11,11]],[[7872,3103],[15,28]],[[7887,3131],[29,-16]],[[7072,2611],[-2,1],[-16,13],[-15,11],[20,37],[1,11]],[[7078,3651],[-13,-25]],[[7065,3626],[-6,5],[-5,2],[-13,8],[-13,5],[-6,4],[-1,-1],[0,-2],[-4,5],[-31,-1]],[[6986,3651],[16,28]],[[7002,3679],[3,-2],[5,-1],[5,-1],[6,0],[6,0]],[[7027,3675],[4,1],[6,-1],[7,-2],[7,-2],[8,-6],[19,-14]],[[6939,2583],[-44,33]],[[6895,2616],[11,20],[6,10]],[[6912,2646],[13,23],[14,27],[2,3],[1,4]],[[6942,2703],[45,-33]],[[6987,2670],[-2,-4],[-2,-3],[-7,-13],[-7,-13]],[[6969,2637],[-13,-22]],[[6956,2615],[-6,-12],[-11,-20]],[[8730,6185],[-9,-28]],[[8721,6157],[-8,-21],[-7,-21],[-8,-21],[-7,-22],[-7,-19],[-5,-13]],[[8679,6040],[-18,-52]],[[8661,5988],[-3,2],[-3,1],[-9,5],[-9,4],[8,22],[-40,22],[-9,5],[-40,22],[-9,-21]],[[8547,6050],[-16,8]],[[8531,6058],[8,22],[-53,29]],[[8486,6109],[-47,25]],[[8439,6134],[-2,2]],[[8437,6136],[48,122]],[[8485,6258],[58,-28],[2,23]],[[8545,6253],[100,-39],[3,9],[45,-26],[8,0],[3,0],[6,-1],[17,-10],[3,-1]],[[8565,5953],[-7,-19]],[[8558,5934],[-45,25],[-18,10]],[[8495,5969],[7,18],[-16,9],[-15,9]],[[8471,6005],[8,23],[12,27],[16,-9],[7,18],[1,3],[16,-9]],[[8547,6050],[16,-9],[-1,-3],[-7,-18],[-21,-50],[31,-17]],[[8634,5915],[-2,2],[-12,6],[-9,5],[-16,8],[-30,17]],[[8661,5988],[-2,-3],[-17,-48],[-8,-22]],[[8471,6005],[-33,17],[10,23],[18,45],[1,3]],[[8467,6093],[10,-5],[9,21]],[[8495,5969],[-6,-14],[-4,-8],[-1,-3],[-11,-16],[-8,-9],[-5,-11],[-7,-17]],[[8453,5891],[-40,22]],[[8413,5913],[-53,29]],[[8360,5942],[17,40]],[[8377,5982],[8,20],[9,22]],[[8394,6024],[8,19]],[[8402,6043],[20,-11],[27,65],[1,2],[1,3],[10,-6],[6,-3]],[[8402,6043],[28,67],[1,3]],[[8431,6113],[8,21]],[[8394,6024],[-2,1],[-20,11]],[[8372,6036],[8,19]],[[8380,6055],[27,68],[1,3],[21,-12],[2,-1]],[[8380,6055],[-16,8],[-16,8]],[[8348,6071],[28,69],[1,3],[-15,8]],[[8362,6151],[8,20],[54,-29],[13,-6]],[[9365,6386],[-13,5],[-12,4],[-9,3],[-34,16],[-9,4]],[[9288,6418],[-5,30],[-5,3],[-9,4],[-6,4],[-10,5],[-10,4],[-19,10],[-10,4]],[[9214,6482],[-10,6],[-5,2]],[[9199,6490],[4,12],[5,14]],[[9208,6516],[9,-4],[55,-28],[8,-3],[-4,29],[-2,26],[-2,27]],[[9272,6563],[9,-4],[7,-4],[10,-5],[10,-4],[-1,32],[0,4],[0,4],[1,2],[0,17],[0,24]],[[9308,6629],[9,-5],[12,-4],[4,-2]],[[9333,6618],[0,-25],[-2,-5],[-1,-4],[4,-11],[1,-8],[0,-11],[3,-21],[1,-26],[2,-9],[1,-8],[1,-10],[2,-7],[1,-10],[2,-11],[1,-8],[1,-6],[14,-35],[0,-9],[1,-8]],[[9208,6516],[9,23],[7,22]],[[9224,6561],[8,22],[9,-5],[21,-10],[10,-5]],[[9224,6561],[-9,4],[-32,16],[-1,0],[-9,4],[-5,4]],[[9168,6589],[7,21]],[[9175,6610],[4,14],[16,57]],[[9195,6681],[9,-3]],[[9204,6678],[4,-1],[6,-3],[40,-19],[4,-2],[8,-4],[2,-1],[37,-19],[3,0]],[[9175,6610],[-4,2],[-9,5],[-2,0],[-19,10],[-8,4]],[[9133,6631],[8,21],[7,22],[2,8],[6,17],[4,9],[5,14],[1,3]],[[9166,6725],[2,-1],[7,-3],[16,-8],[9,-4],[-8,-27],[3,-1]],[[9133,6631],[-11,5],[-22,11],[-9,4]],[[9091,6651],[7,22]],[[9098,6673],[9,22],[8,24],[10,26]],[[9125,6745],[8,-4],[23,-11],[10,-5]],[[9117,6588],[-10,5],[-3,2],[-20,9],[-9,5],[-9,4],[-23,11],[-9,5]],[[9034,6629],[8,21],[-9,5],[-23,11],[-9,4]],[[9001,6670],[7,21]],[[9008,6691],[9,-4],[9,-4],[14,-7],[9,-4],[10,-5],[22,-11],[10,-5]],[[9133,6631],[-8,-22],[-8,-21]],[[9098,6673],[-9,4],[-23,12],[-9,4],[8,22],[3,7],[6,18]],[[9074,6740],[9,25],[7,21]],[[9090,6786],[41,-19]],[[9131,6767],[-6,-22]],[[9090,6786],[-32,15],[-9,4]],[[9049,6805],[3,11],[3,9],[11,38]],[[9066,6863],[11,-3],[8,-4],[-4,-17],[10,-5],[14,-6],[8,-4],[22,-9],[9,-4]],[[9144,6811],[-6,-22],[-7,-22]],[[9144,6811],[7,23],[5,18]],[[9156,6852],[6,18]],[[9162,6870],[9,-2],[23,-8],[9,-2]],[[9203,6858],[2,-1],[6,-2],[2,0],[18,-5],[10,-3],[5,16],[5,17],[7,21],[3,-1]],[[9261,6900],[-10,-32],[-1,-4],[-32,-109],[-2,-7],[-21,-67]],[[9308,6629],[1,2],[1,24],[1,16],[2,13],[3,24],[-1,2],[-2,1],[-9,5],[-18,8],[-3,1],[-10,5]],[[9273,6730],[-13,5],[-26,12],[-11,5],[-4,-12],[-2,-12],[-2,-11],[-4,-13]],[[9211,6704],[-7,-26]],[[9261,6900],[6,-2],[-6,-21]],[[9261,6877],[-6,-17],[-5,-16],[-4,-15],[-4,-14],[9,-2],[23,-8],[7,-3],[3,0],[3,14],[2,7],[2,9],[3,17],[4,16]],[[9298,6865],[10,-3],[12,-3],[2,-1],[9,-2],[5,22],[-9,3],[-3,1],[3,11],[3,15],[3,12],[1,6],[0,1]],[[9334,6927],[14,-5],[12,-5],[13,-1]],[[9373,6916],[1,-2],[5,1],[2,0],[-1,-2],[-3,-1],[-1,-2],[3,-7],[0,-4],[-5,-21],[-2,-13],[-6,-26],[-7,-24],[-5,-12],[-1,-6],[-1,-7],[-2,-16],[-5,-18],[-4,-22],[0,-12],[-3,-16],[0,-12],[-2,-17],[-1,-3],[-2,-2],[-1,-2],[2,-3],[1,-8],[-2,-7],[0,-12],[0,-22]],[[9261,6877],[7,-3],[2,0],[17,-5],[1,-1],[10,-3]],[[9273,6730],[-3,-27],[-1,-27],[-9,4],[-4,2],[-34,17],[-2,0],[-9,5]],[[8763,5769],[-15,-41]],[[8748,5728],[-9,5],[-37,20],[-9,5]],[[8693,5758],[-9,5],[-22,13],[-9,5]],[[8653,5781],[-9,5],[-38,21],[-9,5]],[[8597,5812],[15,40]],[[8612,5852],[15,44]],[[8627,5896],[21,-12]],[[8648,5884],[-8,-21]],[[8640,5863],[-9,-21],[9,-5],[53,-29],[8,-5],[8,-4]],[[8709,5799],[9,-5],[9,-5]],[[8727,5789],[9,-5],[9,-5],[8,-5],[10,-5]],[[8920,5998],[-8,-21]],[[8912,5977],[-10,6],[-37,20],[-9,4],[-70,39],[-11,6]],[[8775,6052],[9,21],[8,20],[8,21]],[[8800,6114],[80,-44]],[[8880,6070],[-8,-21],[-8,-20],[10,-6],[36,-20],[10,-5]],[[8880,6070],[10,-6],[37,-20],[9,-5],[-4,-11],[-4,-8],[0,-3],[-6,-15],[-2,-4]],[[8892,5924],[-11,6],[-36,20],[-9,5]],[[8836,5955],[12,31],[-10,6],[-61,33],[-10,5]],[[8767,6030],[8,22]],[[8912,5977],[-8,-21],[-8,-19],[-4,-13]],[[8881,5881],[-51,27],[-10,6]],[[8820,5914],[7,19],[9,22]],[[8892,5924],[-6,-23],[-4,-17],[-1,-3]],[[8820,5914],[-10,6],[-59,32],[-10,5]],[[8741,5957],[-9,6],[-22,12],[-3,1]],[[8707,5976],[8,17],[1,1],[1,0],[22,-12],[10,-5],[6,22],[4,12],[8,19]],[[8707,5976],[-2,1],[-12,6],[-20,2],[-10,3],[-2,0]],[[8679,6040],[19,-10],[13,31],[19,-10],[27,-15],[10,-6]],[[8721,6157],[10,-6],[69,-37]],[[8927,5255],[-1,-2],[-1,-2],[0,-2],[-1,-1],[0,-2],[-10,-24],[-5,-12]],[[8909,5210],[-9,5],[-20,11],[-9,5],[-9,-23],[-5,-11],[-4,-12]],[[8853,5185],[-10,5],[-21,12],[-10,5]],[[8812,5207],[-51,27],[0,1]],[[8761,5235],[1,4],[18,56],[9,29],[1,2]],[[8790,5326],[2,-1],[29,-16],[26,-15],[3,-1],[1,-1],[23,-12],[15,-7],[34,-17],[4,-1]],[[8891,5163],[-29,17],[-9,5]],[[8909,5210],[-9,-23],[-5,-12],[-4,-12]],[[8882,5140],[-28,16],[-10,5]],[[8844,5161],[-10,5],[-21,12],[-10,5]],[[8803,5183],[9,24]],[[8891,5163],[-7,-18],[-2,-5]],[[8826,5114],[-10,5],[-21,12],[-10,6]],[[8785,5137],[9,23],[9,23]],[[8844,5161],[-9,-23],[-9,-24]],[[8864,5093],[-9,-23]],[[8855,5070],[-10,5],[-18,10],[-11,6]],[[8816,5091],[10,23]],[[8882,5140],[-8,-20],[-1,-3],[-9,-24]],[[8816,5091],[-9,5],[-22,12],[-10,5],[-10,6],[-31,17],[-3,1]],[[8731,5137],[7,25]],[[8738,5162],[1,0],[35,-20],[11,-5]],[[8738,5162],[8,24],[7,24],[8,25]],[[8432,5056],[-4,2],[-4,2],[-40,21],[-40,21]],[[8344,5102],[-76,40]],[[8268,5142],[-58,31]],[[8210,5173],[-57,30]],[[8153,5203],[-54,29]],[[8099,5232],[-37,20],[-15,8]],[[8047,5260],[7,12],[4,8]],[[8058,5280],[10,18],[10,18],[10,19]],[[8088,5335],[10,19],[10,18]],[[8108,5372],[10,19]],[[8118,5391],[10,19],[10,19]],[[8138,5429],[22,41],[19,35]],[[8179,5505],[8,15],[10,17],[2,3]],[[8199,5540],[72,-39],[20,-11],[64,-35],[31,-16],[21,-12],[25,-13],[3,-2]],[[8435,5412],[-1,-4],[-2,-14],[-1,-5],[0,-11],[2,-53],[1,-55],[2,-58],[1,-36],[1,-44],[-1,-19],[-2,-36],[-3,-21]],[[8592,4282],[-59,38]],[[8533,4320],[-26,16],[-28,18],[-2,2]],[[8477,4356],[8,19],[8,20],[8,19]],[[8501,4414],[7,20],[8,19],[8,20]],[[8524,4473],[7,19],[3,5],[1,2],[9,23],[1,3]],[[8545,4525],[8,-5],[10,-10],[10,-15],[7,-14],[20,-41]],[[8600,4440],[33,-61],[4,-10],[1,-2],[1,-2],[2,-5],[2,-5],[25,-9]],[[8668,4346],[-7,-30],[-4,-19],[-4,-19],[-4,-18],[-27,2],[-30,20]],[[8499,4267],[-49,37]],[[8450,4304],[9,16]],[[8459,4320],[10,19],[7,14],[1,3]],[[8533,4320],[-10,-19],[-10,-19],[-4,2],[-5,-8],[-5,-9]],[[8470,4214],[-13,10],[-11,9],[-11,8],[12,18],[0,7],[1,2],[5,8],[-14,11]],[[8439,4287],[5,8],[6,9]],[[8499,4267],[-4,-9],[-5,-9]],[[8490,4249],[-5,-8],[-10,-17],[-5,-10]],[[8408,4151],[-23,18],[-8,6],[-3,0]],[[8374,4175],[12,21],[14,24],[19,33]],[[8419,4253],[17,28],[3,6]],[[8470,4214],[-6,-16],[-11,-19],[-22,-38],[-13,10],[-10,0]],[[9675,8212],[-4,2],[-4,1],[-2,1]],[[9665,8216],[-2,1],[-40,14],[-3,1]],[[9620,8232],[6,27],[5,28]],[[9631,8287],[4,22],[11,-3],[6,1],[2,5],[-1,15]],[[9653,8327],[-5,47]],[[9648,8374],[-1,14]],[[9647,8388],[10,-3],[51,-13],[6,-14],[5,-22],[4,-19],[1,-5]],[[9724,8312],[-7,-3],[-34,9],[-4,0],[-1,-2],[1,-7],[-13,-2],[4,-43]],[[9670,8264],[4,-34],[1,-11],[0,-7]],[[9669,8164],[-17,5],[-7,18],[-1,2],[-2,2],[-7,1],[-3,0],[-2,-2],[-7,-9],[-7,-12],[-4,-10],[-3,-11]],[[9609,8148],[-11,2],[-6,-1],[-14,-10],[-5,-6],[-1,-8],[1,-7],[-2,-13]],[[9571,8105],[-21,5],[5,27],[2,5],[6,11]],[[9563,8153],[7,5],[30,23],[7,8],[5,8],[3,8],[4,22],[1,5]],[[9665,8216],[0,-5],[4,-47]],[[9677,8082],[-11,-1],[-13,3],[3,16],[-4,34],[0,3],[-3,1],[-40,10]],[[9669,8164],[2,-23],[6,-59]],[[9677,8082],[2,-27],[0,-22],[1,-22]],[[9680,8011],[-61,15]],[[9619,8026],[5,21],[4,21],[-41,11],[4,21],[-20,5]],[[9690,8008],[-7,2],[-3,1]],[[9675,8212],[13,-4],[17,-5],[18,-4],[39,-10]],[[9762,8189],[0,-5],[-1,-10],[-2,-13],[-7,-26],[-19,-70],[-46,12],[1,-25],[1,-22],[1,-22]],[[9743,8257],[12,-29],[4,-20],[2,-8],[1,-11]],[[9670,8264],[13,2],[2,1],[1,1],[20,-5],[2,-1],[3,-2],[26,-6],[6,3]],[[9724,8312],[3,-13],[5,-12],[1,-5],[3,-6],[7,-19]],[[9775,8184],[-13,5]],[[9647,8388],[-1,10],[-2,22]],[[9644,8420],[5,-1],[16,-4],[18,-5],[10,-2]],[[9693,8408],[3,1],[35,-9],[3,0],[13,-1],[3,-1],[7,-1]],[[9757,8397],[2,-12],[7,-16],[3,-23],[3,-4],[3,-5],[2,-1],[1,0],[0,-1],[0,-2],[0,-1],[-3,-1],[-3,-3],[1,-9],[2,-8],[1,-8],[3,-23],[0,-2],[0,-11],[3,-12],[1,-28],[2,-5],[-1,-19],[2,-11],[-4,-4],[-7,-1],[0,-3]],[[9698,8655],[5,-5],[-1,-3],[2,-16],[2,-4],[5,-10],[0,-8],[3,-21],[5,-22],[2,-9],[3,-12],[3,-6],[1,-7],[2,-6],[3,-4],[3,-2],[7,-1],[0,-3],[-2,-4],[-3,-9],[-2,-2],[-2,-19],[1,-4],[6,-6],[2,-2],[3,-3],[1,-7],[-2,-10],[5,-20],[3,-21],[3,-10],[1,-2]],[[9693,8408],[-9,24],[-3,8],[-6,29],[-1,5],[-4,17],[-2,8]],[[9668,8499],[-3,23],[-2,10],[-6,40],[-5,39],[-4,29],[-4,28]],[[9644,8668],[31,-9],[3,1],[2,1],[1,1],[13,-6],[4,-1]],[[9775,8184],[0,-18],[-2,-30],[-2,-12],[-2,-7],[-1,-10],[-1,-8],[-4,-19],[-3,-8],[-2,-11],[-1,-7],[-6,-21],[-1,-9],[0,-24],[-1,-6]],[[9749,7994],[-24,5],[-9,2],[-26,7]],[[9774,7870],[-3,0],[-13,1],[1,2],[-21,5]],[[9738,7878],[-5,3],[-14,4],[-3,1],[-3,1],[-20,5],[-17,5]],[[9676,7897],[-5,1],[-3,1]],[[9668,7899],[4,25],[2,10],[1,10],[2,10],[1,11],[0,11],[1,13],[-64,16]],[[9615,8005],[4,21]],[[9749,7994],[0,-16],[-1,-2],[0,-8],[1,-9],[1,-2],[1,-3],[1,-21],[1,-4],[2,-4],[6,-6],[0,-4],[4,-9],[2,-8],[3,-10],[4,-8],[0,-10]],[[9679,7765],[-41,11]],[[9638,7776],[9,20],[10,21],[7,20]],[[9664,7837],[5,22],[1,3],[3,17],[2,15],[1,3]],[[9738,7878],[-3,-18],[-2,-16],[-5,-24],[-25,7],[-3,1],[-7,-21],[-7,-21],[-7,-21]],[[9652,7840],[-95,26]],[[9557,7866],[4,21],[8,36],[0,3]],[[9569,7926],[63,-17],[11,-3],[25,-7]],[[9664,7837],[-4,1],[-2,1],[-3,0],[-3,1]],[[9548,7822],[5,22],[4,22]],[[9652,7840],[-7,-20],[-4,-11],[-4,-10],[-89,23]],[[9534,7757],[2,8],[1,6],[2,8]],[[9539,7779],[4,22],[5,21]],[[9638,7776],[-11,-20],[-11,-21]],[[9616,7735],[-6,2],[-3,1],[-73,19]],[[9641,7660],[-58,16]],[[9583,7676],[7,12],[15,26],[11,21]],[[9679,7765],[-6,-21],[-6,-22],[-7,-24],[-4,-8],[-2,-5],[-6,-13],[-7,-12]],[[9521,7693],[3,14],[5,26],[5,24]],[[9583,7676],[-8,3],[-54,14]],[[9522,7584],[-22,6],[4,24],[5,23]],[[9509,7637],[5,23],[4,19],[3,14]],[[9641,7660],[-6,-9],[-13,-20],[-14,-21]],[[9608,7610],[-53,15],[-11,-22],[-12,-22]],[[9532,7581],[-6,1],[-4,2]],[[9522,7584],[-11,-20]],[[9511,7564],[-76,22]],[[9435,7586],[4,21],[5,23],[5,24],[60,-17]],[[9382,7601],[53,-15]],[[9511,7564],[-10,-18],[-10,-19],[-4,-8],[-6,-3],[-6,-2],[-4,0],[-6,0],[-7,1],[-39,10],[-53,16],[6,20],[5,19],[5,21]],[[9492,7435],[-13,-20],[-28,-40],[-12,-20],[-9,-16],[-8,-22],[-17,-49],[-12,-34],[-32,-95],[-11,-40],[-8,-28],[-4,-20],[-4,-15],[-16,-73],[-5,-24],[-1,-6]],[[9312,6933],[-32,9],[-5,2]],[[9275,6944],[-4,1],[-38,11],[-1,0]],[[9232,6956],[-42,12]],[[9190,6968],[-42,12]],[[9148,6980],[-43,10],[-42,12]],[[9063,7002],[-41,13]],[[9022,7015],[-3,1]],[[9019,7016],[0,1],[4,6],[37,117],[45,140],[15,71],[21,101],[5,13],[27,85],[13,42],[12,38],[2,8],[1,11],[6,20],[66,-17],[19,-5],[42,-12],[32,-9],[21,-5],[-5,-20]],[[9532,7581],[-11,-19],[-10,-18],[-34,-61],[-13,-23],[-8,-15],[36,-10]],[[6540,4618],[-62,30]],[[6478,4648],[7,19],[3,9],[4,11],[5,14],[6,17]],[[6503,4718],[61,-30]],[[6564,4688],[-6,-16],[-5,-14],[-3,-11],[-4,-9],[-6,-20]],[[6564,4688],[50,-24],[10,-3],[3,-1]],[[6627,4660],[-1,-3],[-6,-15],[-5,-14],[-3,-11],[-4,-9],[-3,-9],[-3,-10]],[[6602,4589],[-18,9],[-44,20]],[[8362,6151],[-1,-3],[-8,-20],[-27,14],[8,21],[1,3],[-22,12]],[[8313,6178],[8,21],[15,41],[31,82]],[[8367,6322],[4,11]],[[8371,6333],[114,-75]],[[6747,4747],[-10,-21],[-7,-12],[-2,-4],[-3,-8],[-7,-12],[0,-1],[-3,-7],[-5,-11],[-1,-3],[-1,-2],[-6,-17]],[[6702,4649],[0,1],[-1,0],[-2,1],[0,1],[-3,1],[-5,-2],[-7,-4],[-4,-3],[-4,-3],[-3,-1],[-2,0],[-4,1],[-18,9],[-22,10]],[[6503,4718],[-3,1],[-59,28],[-13,6],[-32,15]],[[6396,4768],[36,102],[6,17],[2,5],[1,3],[0,1],[5,14],[8,23]],[[6454,4933],[8,-4],[28,-13],[9,-4]],[[6499,4912],[-8,-23],[-3,-10],[-3,-9],[61,-29]],[[6546,4841],[61,-29]],[[6607,4812],[19,-9],[20,-9],[-4,-9],[-4,-13],[-4,-12],[22,-11]],[[6656,4749],[22,-10],[13,-6],[10,-5],[23,-11],[7,14],[5,9],[5,9],[1,-1],[2,0],[2,-1],[1,0]],[[6607,4812],[4,9],[3,10],[4,10],[3,9],[1,2]],[[6622,4852],[9,-4],[23,-11],[21,-10],[8,-4]],[[6683,4823],[-1,-2],[-3,-9],[-3,-10],[-4,-10],[-3,-9],[-4,-9],[-2,-7],[-2,-6],[-5,-12]],[[6546,4841],[3,9],[4,10],[3,10],[5,12]],[[6561,4882],[61,-30]],[[6561,4882],[5,17],[7,19],[6,18]],[[6579,4936],[62,-29]],[[6641,4907],[-7,-19],[-6,-19],[-1,-2],[-4,-13],[-1,-2]],[[6579,4936],[7,20],[4,11],[4,12]],[[6594,4979],[62,-28]],[[6656,4951],[-4,-13],[-4,-11],[-7,-20]],[[6561,4882],[-9,4],[-45,21],[-8,5]],[[6499,4912],[6,17],[6,19],[7,18],[6,19],[4,11],[5,13]],[[6533,5009],[61,-30]],[[6454,4933],[6,18]],[[6460,4951],[7,20],[4,11],[17,48]],[[6488,5030],[45,-21]],[[6460,4951],[-3,1],[-7,4],[-16,7],[-20,9],[2,6],[5,14],[3,9],[1,3]],[[6425,5004],[8,24],[5,12],[4,12]],[[6442,5052],[46,-22]],[[6396,4768],[-16,8],[-54,26]],[[6326,4802],[3,2],[2,3],[8,22],[1,3]],[[6340,4832],[10,25],[19,24],[3,4]],[[6372,4885],[15,18],[-2,4],[-57,28],[5,14],[4,12]],[[6337,4961],[5,12],[4,12],[4,12],[4,11],[8,23],[2,3]],[[6364,5034],[61,-30]],[[6364,5034],[-60,29],[-2,1]],[[6302,5064],[8,23],[9,25]],[[6319,5112],[11,-6],[50,-25]],[[6380,5081],[62,-29]],[[6337,4961],[-61,30]],[[6276,4991],[4,12],[5,12],[8,22],[7,22],[2,5]],[[6372,4885],[-3,1],[-22,11],[-22,11],[-13,6],[-54,27]],[[6258,4941],[9,23]],[[6267,4964],[5,14],[4,13]],[[6340,4832],[-3,2],[-50,25],[-34,17],[-16,8]],[[6237,4884],[9,25],[10,28],[2,4]],[[6326,4802],[-54,27]],[[6272,4829],[-19,10],[-27,13]],[[6226,4852],[6,17],[4,12],[1,3]],[[6253,4728],[-61,31]],[[6192,4759],[7,21],[8,22]],[[6207,4802],[8,21],[5,13],[6,16]],[[6272,4829],[-6,-16],[-5,-13]],[[6261,4800],[-8,-22],[5,-3],[10,-5],[-8,-21],[-7,-21]],[[6291,4708],[-7,3],[-1,1],[-30,16]],[[6261,4800],[54,-28],[-5,-13],[-4,-11],[-6,-16],[-1,-3],[-4,-11],[-4,-10]],[[6268,4661],[-14,7],[-20,10],[-61,30]],[[6173,4708],[2,7]],[[6175,4715],[8,22],[9,22]],[[6291,4708],[-1,-5],[-2,-7],[-8,-19],[-2,-3],[-10,-13]],[[6254,4623],[-1,0],[-95,46]],[[6158,4669],[3,8],[5,11],[2,8],[5,12]],[[6268,4661],[-7,-19],[-7,-19]],[[6225,4516],[3,22],[3,15],[3,12],[1,1],[3,10]],[[6238,4576],[5,14],[2,9],[8,20],[1,4]],[[6396,4768],[-3,-9],[-27,-75],[-16,-46],[-32,-93],[-2,-6],[-13,-38],[-2,-6]],[[6301,4495],[-2,0],[-18,5],[-28,8],[-8,2],[-20,6]],[[6238,4576],[-1,1],[-2,0],[-3,-10],[-8,4],[-5,3],[-43,21],[-16,7],[-5,-12],[-21,-25],[-14,4]],[[6120,4569],[12,32]],[[6132,4601],[5,11],[3,8],[6,19],[4,8],[4,11]],[[6154,4658],[4,11]],[[6225,4516],[-3,0],[-101,27],[-8,2]],[[6113,4545],[7,24]],[[6225,4516],[-3,-24],[-5,-38],[-4,-26]],[[6213,4428],[-4,1],[-17,0],[-13,-2],[-15,-5],[-14,-4]],[[6150,4418],[-2,13],[1,18]],[[6149,4449],[4,30]],[[6153,4479],[20,-5],[7,38],[-17,6],[-18,4],[-18,5],[-19,5]],[[6108,4532],[5,13]],[[6153,4479],[-20,9],[-17,8],[-17,9]],[[6099,4505],[-27,13],[-10,5],[-3,2],[0,2],[7,17],[42,-12]],[[6149,4449],[-55,27],[-5,2]],[[6089,4478],[10,27]],[[6150,4418],[-36,25],[-5,7],[-10,4],[-4,1],[-32,-5],[-26,-1],[-16,-7],[-5,10],[-12,24]],[[6004,4476],[14,-7],[2,0],[4,1],[3,1],[14,28],[1,1],[2,0],[31,-15],[14,-7]],[[6150,4418],[-50,-17],[1,-5]],[[6101,4396],[-18,-6],[-21,-7]],[[6062,4383],[-33,-10]],[[6029,4373],[-4,3],[-8,-3],[-1,2],[-5,16],[-7,13],[-24,17]],[[5980,4421],[13,26],[11,29]],[[7637,1518],[-21,95]],[[7616,1613],[22,7],[19,6]],[[7657,1626],[2,-11],[17,-74],[3,-11]],[[7679,1530],[-19,-6],[-11,-3],[-12,-3]],[[8505,6314],[9,-15],[1,-5],[-9,-21],[2,-4],[14,-8],[15,36],[1,2],[8,-12],[4,-5],[3,-2],[2,-1],[2,-3],[3,-1]],[[8560,6275],[-15,-22]],[[8371,6333],[10,28],[4,11],[10,24],[1,3]],[[8396,6399],[19,-10]],[[8415,6389],[49,-28]],[[8464,6361],[-1,-2],[-20,-51],[1,-3],[14,-8],[30,-18],[3,2],[6,16],[8,17]],[[8464,6361],[15,-8],[19,-10]],[[8498,6343],[-3,-3],[-6,-17],[16,-9]],[[8543,6376],[-4,-4],[-5,-6],[-4,-4],[-4,-3],[-3,-3],[-7,-4],[-14,-7],[-4,-2]],[[8415,6389],[17,34],[7,14],[2,3]],[[8441,6440],[52,-28],[5,-5],[4,4],[7,11]],[[8509,6422],[11,-8],[18,-10],[-8,-13],[0,-5],[13,-10]],[[8567,6293],[-7,-18]],[[8498,6343],[19,-11],[1,-1],[1,-1],[1,-2],[15,10],[23,-37],[3,-4],[3,-2],[3,-2]],[[8609,6408],[-14,-6],[-21,9],[-12,-31],[22,-13],[-4,-11],[7,-4]],[[8587,6352],[-13,-42],[-2,-4],[-5,-13]],[[8543,6376],[3,4],[7,12],[10,17],[13,22],[-45,31]],[[8531,6462],[2,2],[2,4],[2,4]],[[8537,6472],[0,-1],[4,-3],[3,-2],[6,-4],[4,-2],[5,-4],[4,-3],[41,-29],[9,-7],[1,0]],[[8614,6417],[-2,-4],[-2,-1],[-1,-4]],[[8609,6408],[14,-10],[-10,-26],[-2,-6],[1,-6],[3,-14],[1,-7],[-28,13],[-1,0]],[[8784,6337],[-1,-4],[-2,-6],[-5,-13],[-15,-43],[-6,-15],[-11,-33],[-12,-33],[-2,-5]],[[8614,6417],[7,-5],[7,-5],[3,-2],[9,-6],[6,-5],[10,-7],[10,-6],[7,-5],[8,-4],[7,-3],[7,-3],[7,-3],[13,-5],[7,-2],[3,-1],[2,0],[29,-9],[25,-8],[1,-1],[1,0],[1,0]],[[8786,6342],[-2,-5]],[[8614,6417],[1,7]],[[8615,6424],[2,-1],[24,-17],[8,-6],[7,-4],[9,-5],[18,44],[7,26],[2,10],[12,31]],[[8704,6502],[17,-9],[51,-26],[7,-3],[5,-2],[24,-13],[11,-5],[3,-1]],[[8822,6443],[-14,-39],[-6,-16],[-7,-21],[-1,-4],[-5,-12],[-3,-9]],[[8911,6419],[-6,-18]],[[8905,6401],[-17,8],[-19,-55],[16,-9],[-7,-20],[45,-23],[12,-7],[-10,3],[-8,4],[-16,7],[-19,5],[-44,13],[-8,3],[-37,10],[-7,2]],[[8822,6443],[7,18],[1,4],[21,57]],[[8851,6522],[9,-4],[10,-5],[-16,-43],[-2,-3],[-5,-15],[64,-33]],[[8918,6437],[-7,-18]],[[8851,6522],[8,22]],[[8859,6544],[9,-5],[32,-15],[41,-21]],[[8941,6503],[-8,-22],[-15,-44]],[[8802,6657],[-9,-25],[-8,-23],[36,-18],[5,-3],[8,24],[28,-14],[11,-5],[3,-2]],[[8876,6591],[-9,-23],[-8,-24]],[[8704,6502],[44,121],[4,12],[3,5],[5,11],[0,2]],[[8760,6653],[16,-11],[2,3],[4,-3],[7,17],[-1,4]],[[8788,6663],[5,-2],[9,-4]],[[8885,6616],[-9,-25]],[[8802,6657],[9,-5],[23,-11],[10,-5],[9,-4],[22,-11],[7,-3],[3,-2]],[[8911,6689],[-8,-23],[-9,-26],[-9,-24]],[[8802,6657],[8,24],[10,25]],[[8820,6706],[9,-4],[23,-11],[10,-5],[8,23],[9,-4],[19,-10],[3,-1],[7,-4],[3,-1]],[[8820,6706],[8,23],[8,22]],[[8836,6751],[8,21]],[[8844,6772],[9,-4],[23,-11],[9,-5],[9,-4],[23,-11],[7,-4],[3,-1]],[[8927,6732],[-8,-22],[-8,-21]],[[8934,6753],[-7,-21]],[[8844,6772],[8,22],[22,-11],[8,23],[8,22],[11,-5],[8,-4]],[[8909,6819],[8,-4],[11,-5],[11,-6],[9,-4],[2,-1]],[[8950,6799],[-8,-24],[-8,-22]],[[8921,6854],[-7,-19],[-5,-16]],[[8836,6751],[-30,14],[-10,5],[-23,12],[-16,13]],[[8757,6795],[-40,29],[-26,19]],[[8691,6843],[2,15],[4,17]],[[8697,6875],[5,20],[22,-8]],[[8724,6887],[37,-15]],[[8761,6872],[63,-24],[3,7],[1,2],[5,14]],[[8833,6871],[40,-18],[6,18],[32,-14],[10,-3]],[[8833,6871],[6,17]],[[8839,6888],[6,17],[6,20],[31,-10],[10,-3],[10,-3],[32,-12]],[[8934,6897],[-6,-24],[-7,-19]],[[8761,6872],[8,24],[5,19]],[[8774,6915],[10,-4],[45,-19],[10,-4]],[[8724,6887],[7,25],[7,24],[-60,23]],[[8678,6959],[7,24],[21,-9],[14,-6],[25,-8],[37,-13],[-1,-7],[-1,-8],[-4,-12],[-2,-5]],[[8697,6875],[-20,8]],[[8677,6883],[6,20],[-19,7],[7,25],[7,24]],[[8677,6883],[-19,9],[-11,4],[-34,22],[6,9],[8,24],[-6,9],[3,8],[-10,4],[-6,-1]],[[8608,6971],[3,15],[5,-3],[62,-24]],[[8691,6843],[4,-15],[10,-7],[-5,-8]],[[8700,6813],[-15,10],[-37,27]],[[8648,6850],[1,3],[4,13],[0,6],[-68,48]],[[8585,6920],[-71,51]],[[8514,6971],[10,20]],[[8524,6991],[8,15],[7,14]],[[8539,7020],[52,-37]],[[8591,6983],[0,-5],[13,-8],[4,1]],[[8631,6817],[-3,2],[-1,-3],[-35,26],[-36,25]],[[8556,6867],[2,3],[9,18],[8,14],[10,18]],[[8648,6850],[-1,-2],[-7,-13],[-9,-18]],[[8631,6817],[-2,-3],[-8,-17],[-7,-16],[-1,-3]],[[8613,6778],[-3,2],[-17,8],[-24,13],[-18,9],[-17,8],[-19,10],[-18,8],[-2,1],[-15,8]],[[8480,6845],[10,24],[10,22],[6,12]],[[8506,6903],[24,-17],[26,-19]],[[6775,2827],[-12,9],[-13,9],[-9,7]],[[6741,2852],[2,4],[8,18],[10,17]],[[6761,2891],[35,-26]],[[6796,2865],[-10,-17],[-9,-17],[-1,-2],[-1,-2]],[[6724,2819],[-21,15],[6,11],[3,5],[5,10],[20,-15],[2,4],[2,3]],[[7230,1149],[-6,-29],[-4,-21]],[[7220,1099],[-59,16],[-4,-23]],[[7157,1092],[-16,4]],[[7141,1096],[-2,1]],[[7139,1097],[4,21]],[[7143,1118],[9,20],[13,33]],[[7165,1171],[10,-7],[18,-6],[18,-5],[19,-4]],[[7210,1077],[-33,10]],[[7177,1087],[-18,4],[-2,1]],[[7220,1099],[-4,-12],[-6,-10]],[[7177,1087],[-7,-34],[25,-1],[-12,-21]],[[7183,1031],[-35,0],[-20,0]],[[7128,1031],[13,65]],[[7188,963],[-1,0],[-2,1],[-23,-1],[-8,0]],[[7154,963],[-10,1]],[[7144,964],[-49,1]],[[7095,965],[0,24],[11,0],[1,21]],[[7107,1010],[63,0],[13,21]],[[7210,1077],[37,-9],[-1,-5],[-58,-100]],[[7107,1010],[3,21]],[[7110,1031],[18,0]],[[7110,1031],[5,28],[4,20],[-51,11],[7,24]],[[7075,1114],[10,-3]],[[7085,1111],[39,-10],[15,-4]],[[7095,965],[-51,0]],[[7044,965],[-5,0],[-7,1],[-7,1]],[[7025,967],[6,23],[20,-1],[16,57],[-19,2],[-2,-8],[-11,3]],[[7035,1043],[2,7],[21,70]],[[7058,1120],[10,-4],[7,-2]],[[7025,967],[-17,6],[-24,10]],[[6984,983],[-17,7]],[[6967,990],[15,53],[3,5],[5,4],[8,3],[7,0],[13,-5],[17,-7]],[[6967,990],[-32,12],[-7,2],[-3,0]],[[6925,1004],[7,7],[6,7],[3,4],[7,12]],[[6948,1034],[67,103]],[[7015,1137],[2,-1],[24,-10],[9,-3],[8,-3]],[[6948,1034],[-2,2],[-24,20]],[[6922,1056],[-14,11]],[[6908,1067],[10,17],[11,18]],[[6929,1102],[11,16],[11,17]],[[6951,1135],[11,17],[14,-11],[12,17]],[[6988,1158],[24,-19],[3,-2]],[[6951,1135],[-44,33]],[[6907,1168],[9,17]],[[6916,1185],[19,-13],[10,17]],[[6945,1189],[43,-31]],[[6929,1102],[-41,30]],[[6888,1132],[9,18]],[[6897,1150],[10,18]],[[6908,1067],[-39,29]],[[6869,1096],[9,19],[10,17]],[[6869,1096],[-32,23]],[[6837,1119],[6,21],[5,20],[7,22]],[[6855,1182],[42,-32]],[[6922,1056],[-10,-16]],[[6912,1040],[-81,59]],[[6831,1099],[6,20]],[[6912,1040],[-14,-22],[-20,15],[-7,-12],[-52,39],[4,13],[8,26]],[[6925,1004],[-9,-8],[-10,-7],[-33,-20],[-23,-14],[-21,-12]],[[6829,943],[-2,2],[-8,13],[-12,16],[-8,12],[-4,3],[-10,17]],[[6785,1006],[-9,13],[-4,7]],[[6772,1026],[-4,4],[-7,12],[-5,8],[-8,12],[-3,5],[-5,7],[-38,57]],[[6702,1131],[-1,4],[-9,15],[-9,13],[-9,14],[-4,6],[-11,17],[-4,6],[-1,1],[-7,10],[-4,5],[-18,24],[-5,8],[-10,19],[-3,8],[-1,1]],[[6606,1282],[4,3],[6,2],[48,32],[23,17],[40,25],[54,36],[48,30]],[[6829,1427],[3,-5],[4,-3],[11,-9],[53,-41],[43,-31],[-12,-17]],[[6931,1321],[-11,-15],[-12,-16]],[[6908,1290],[-12,-15],[-12,-16],[-12,-15]],[[6872,1244],[-12,-16],[-13,-16],[13,-10],[-5,-20]],[[6872,1244],[38,-28],[-10,-19],[16,-12]],[[6908,1290],[51,-37]],[[6959,1253],[-10,-16],[-11,-17],[16,-12]],[[6954,1208],[-9,-19]],[[6931,1321],[48,-36]],[[6979,1285],[-10,-15],[-10,-17]],[[7009,1262],[-40,-64]],[[6969,1198],[-15,10]],[[6979,1285],[17,-12],[13,-11]],[[7009,1262],[16,-11]],[[7025,1251],[-41,-65],[-15,12]],[[7079,1236],[-29,-45],[-35,-54]],[[7025,1251],[16,-13],[10,19],[25,-19],[3,-2]],[[7111,1185],[-24,19],[-11,-18],[27,-20],[-15,-34],[-3,-21]],[[7079,1236],[9,-6],[32,-26],[-9,-19]],[[8252,1733],[-17,-43],[-3,-12],[-6,-11],[-4,-12],[-9,-19],[-4,-10]],[[8209,1626],[-34,1]],[[8175,1627],[-11,0],[-4,1]],[[8160,1628],[0,9],[1,11],[1,17]],[[8162,1665],[1,19],[2,25]],[[8165,1709],[1,29],[0,3]],[[8166,1741],[35,-2],[4,-3],[47,-3]],[[8166,1741],[2,25]],[[8168,1766],[56,-5],[12,22],[5,10],[3,11]],[[8244,1804],[5,18]],[[8249,1822],[4,20]],[[8253,1842],[1,19]],[[8254,1861],[2,27]],[[8256,1888],[54,-14],[1,1]],[[8311,1875],[-12,-28],[-7,-14],[-10,-26],[-5,-11],[-12,-29],[-3,-10],[-7,-13],[-3,-11]],[[8168,1766],[1,23]],[[8169,1789],[2,20]],[[8171,1809],[73,-5]],[[8171,1809],[0,19]],[[8171,1828],[78,-6]],[[8171,1828],[2,19]],[[8173,1847],[80,-5]],[[8173,1847],[0,20]],[[8173,1867],[81,-6]],[[8173,1867],[2,27]],[[8175,1894],[12,-1],[69,-5]],[[8175,1894],[1,29]],[[8176,1923],[12,-1],[70,-5]],[[8258,1917],[-2,-29]],[[8176,1923],[2,29]],[[8178,1952],[83,-7],[-3,-28]],[[8178,1952],[2,30]],[[8180,1982],[82,-6],[-10,30]],[[8252,2006],[7,0]],[[8259,2006],[1,-1],[7,-1],[1,-2],[2,-4],[51,1]],[[8321,1999],[0,-18],[-2,-39],[0,-31],[-4,-15],[-4,-21]],[[8380,2225],[-1,0],[-10,-3],[-12,-8],[-9,-5],[-4,-1],[-5,-8],[-7,-12],[-1,-39],[-2,-26],[-2,-26],[0,-16],[-4,-38],[-2,-15],[0,-29]],[[8259,2006],[1,2],[11,3],[1,4],[-1,7],[-1,4],[-1,6],[-4,29],[0,6],[0,9],[1,5],[1,6],[2,7],[3,12],[1,4],[1,5],[1,9],[-2,1],[-15,3],[-5,-9],[-4,0]],[[8249,2119],[1,11],[-3,6],[-3,5],[-3,5],[-34,15],[-3,1],[-3,0],[-4,-1],[-4,10],[-2,3]],[[8191,2174],[8,15],[2,1],[2,5]],[[8203,2195],[2,5],[6,14],[32,72],[6,12],[6,15],[5,8]],[[8260,2321],[1,-4],[37,-21],[10,-6],[3,-1],[68,-63],[1,-1]],[[7497,2612],[-92,70]],[[7405,2682],[1,2],[24,13],[27,12]],[[7457,2709],[72,-53]],[[7529,2656],[-15,-21],[-8,-11],[-9,-12]],[[7468,2570],[-91,68]],[[7377,2638],[12,22],[12,18],[4,4]],[[7497,2612],[-15,-22],[-14,-20]],[[7453,2548],[-17,-24]],[[7436,2524],[-28,22],[-27,20],[-17,12],[-13,11]],[[7351,2589],[14,25],[6,12],[6,12]],[[7468,2570],[-15,-22]],[[7403,2476],[-29,22],[-26,19],[-1,1],[-13,10],[-20,14]],[[7314,2542],[13,15],[12,16],[12,16]],[[7436,2524],[-21,-32],[-12,-16]],[[7395,2464],[-13,-20]],[[7382,2444],[-91,69]],[[7403,2476],[-8,-12]],[[7346,2393],[-89,66]],[[7267,2476],[90,-67]],[[7357,2409],[-11,-16]],[[7346,2393],[-9,-12],[-9,-8]],[[7328,2373],[-14,11],[-59,43],[-10,8]],[[7310,2357],[-3,3],[-16,12],[-14,10],[-16,12],[-10,8],[-9,6],[-8,7]],[[7328,2373],[-6,-6],[-2,-2],[-2,-2],[-2,-1],[-2,-1],[-4,-3],[0,-1]],[[7310,2357],[-3,-2],[-1,0],[0,-1],[-6,-5],[-17,-15]],[[7283,2334],[-11,7],[-47,35],[-9,7]],[[7216,2383],[-10,7],[-22,17],[-10,7]],[[7174,2414],[-33,25]],[[7179,2245],[-3,1],[-11,9],[-14,9]],[[7151,2264],[6,10],[6,11],[10,19],[11,20],[5,9],[5,10],[11,20],[11,20]],[[7283,2334],[-18,-15],[-18,-15]],[[7247,2304],[-8,-8],[-9,-7],[-17,-14]],[[7213,2275],[-17,-15],[-17,-15]],[[6740,2142],[-10,-22]],[[6730,2120],[-11,-5],[-56,36],[-17,-7]],[[6646,2144],[11,23]],[[6657,2167],[10,22]],[[6667,2189],[73,-47]],[[6667,2189],[9,19],[9,19],[9,19]],[[6694,2246],[74,-47]],[[6768,2199],[-10,-19]],[[6758,2180],[-9,-19],[-9,-19]],[[6792,2242],[-10,-12],[-5,-11],[-9,-20]],[[6694,2246],[10,20],[9,19]],[[7502,7769],[-14,21],[-21,35],[3,2],[14,13],[-22,33],[7,8],[9,10],[15,14],[11,12],[15,21],[9,12],[9,14]],[[7537,7964],[13,-10],[4,-5],[3,-4],[2,-5],[1,-6],[0,-10],[-2,-9],[11,-8],[5,-9],[-11,-21],[-1,-5],[1,-3],[6,-9]],[[7569,7860],[-3,-2],[-17,-15],[-22,-19],[-10,-8],[9,-14],[6,-8]],[[7532,7794],[-14,-12],[-16,-13]],[[7452,7720],[-2,3],[-50,77]],[[7400,7800],[-10,11]],[[7390,7811],[6,6],[24,27],[6,5],[21,27],[14,15],[10,8],[10,10],[5,6],[19,25],[11,18],[8,14],[4,5],[4,6],[3,6],[4,14],[1,2]],[[7540,8005],[-3,-41]],[[7502,7769],[3,-4],[-17,-14]],[[7488,7751],[-16,-14],[-18,-15],[-2,-2]],[[7427,7998],[5,-4],[4,0],[1,1],[3,4],[11,15],[11,12],[12,9],[10,3],[12,0],[7,5],[9,3],[-1,-8],[-10,-14],[-17,-18],[-10,-14],[-13,-9],[-9,-9],[-9,-12],[-23,-6],[-8,-9],[-8,-4],[-10,0],[-10,-2],[-9,-12],[0,-9],[7,-5],[14,3],[11,9],[11,7],[10,5],[4,0],[-1,-4],[3,1],[-2,-4],[-5,-7],[-5,-5],[-15,-13],[-22,-12],[-3,-5],[-5,-3],[-14,-1],[-15,3],[-12,7],[-2,4],[-3,5],[0,8],[3,7],[13,17],[12,8],[12,14],[5,10],[5,17],[7,2],[9,8],[5,13],[22,27],[25,22],[4,9],[7,10],[10,8],[5,6],[3,0],[2,-8],[-4,-6],[-16,-17],[-12,-16],[-18,-32],[-3,-14]],[[7413,7680],[-3,2],[-3,2],[-18,12],[-5,6],[-17,26]],[[7367,7728],[-11,19],[12,12],[6,7],[4,5],[11,14],[11,15]],[[7452,7720],[-2,-2],[-11,-10],[-11,-11],[-15,-17]],[[7382,7644],[-3,4],[-29,-34]],[[7350,7614],[-14,22]],[[7336,7636],[7,9],[7,8],[15,17],[-23,35],[3,3],[5,5]],[[7350,7713],[17,15]],[[7413,7680],[-3,-3],[-28,-33]],[[8063,8419],[-14,-13],[-26,41],[-2,4],[-2,6],[-9,15],[-18,-17]],[[7992,8455],[-50,-44],[-12,-9]],[[7930,8402],[-13,-10],[-22,-18],[-4,-5],[-14,-23],[-15,-24]],[[7862,8322],[-14,13]],[[7848,8335],[4,5],[8,10],[6,10],[12,10],[3,8],[2,3],[15,14],[16,5],[13,15],[12,5],[25,18],[9,10],[8,7],[3,7],[3,1],[6,1],[3,6],[7,10],[8,5],[8,11],[17,14],[5,8],[7,13],[2,7],[5,24],[5,7],[8,5],[18,2],[5,1],[3,1]],[[8094,8578],[1,-3],[4,-4],[4,-6],[14,-24],[-9,-6],[17,-26],[15,-25]],[[8140,8484],[-13,-11],[-22,-18],[-15,-13],[-14,-12],[-13,-11]],[[8030,8317],[-13,-18]],[[8017,8299],[-2,3],[-32,48],[-12,-13],[-1,2],[-16,24],[-2,10],[-10,14],[-7,7],[-5,8]],[[7992,8455],[40,-63],[-16,-14],[-17,-14],[29,-44],[2,-3]],[[8063,8419],[26,-40],[2,-3]],[[8091,8376],[-15,-13],[-16,-13],[-9,-8],[-8,-8],[-4,-5],[-5,-6],[-4,-6]],[[8076,8241],[-14,-14]],[[8062,8227],[-45,72]],[[8091,8376],[26,-41]],[[8117,8335],[-15,-13],[-17,-13],[-16,-15],[-17,-14],[24,-39]],[[8117,8335],[50,-79]],[[8167,8256],[-15,-13],[-17,-13],[-7,-7]],[[8128,8223],[-22,-20],[-3,0],[-2,1],[-10,15],[-14,21],[-1,1]],[[8180,8268],[-13,-12]],[[8117,8335],[13,11],[13,11],[16,14],[21,18],[12,11]],[[8192,8400],[49,-78]],[[8241,8322],[-12,-11],[-21,-18],[-15,-14],[-13,-11]],[[8140,8484],[24,-40],[3,-4],[25,-40]],[[8140,8484],[14,13],[15,12],[18,16],[13,11],[12,10],[24,-41],[2,-3]],[[8238,8502],[24,-41],[-8,-8]],[[8254,8453],[-14,-12],[-17,-15],[-16,-13],[-15,-13]],[[8254,8453],[47,-79]],[[8301,8374],[-12,-10],[-18,-16],[-15,-14],[-15,-12]],[[6673,3425],[-3,-2],[-12,6],[-23,11],[-19,9],[-21,10]],[[6595,3459],[13,37],[3,9]],[[6611,3505],[7,19],[13,37],[19,54]],[[6650,3615],[12,1],[3,0],[13,1],[45,-21],[-2,-5],[-2,-6],[-8,-14],[-6,-12],[13,-6]],[[6718,3553],[-20,-11],[-2,-17],[-2,-9],[-5,-15],[-3,-10],[-3,-4],[-3,-2],[-6,-1],[19,-10],[-18,-32],[1,-14],[0,-2]],[[6676,3426],[-3,-1]],[[6489,3426],[17,50],[0,6],[0,3],[7,6],[18,53]],[[6531,3544],[18,-9],[19,-10],[20,-9],[23,-11]],[[6595,3459],[-25,-70],[-2,0],[-20,11],[-20,9],[-19,8],[-20,9]],[[6673,3425],[2,-3],[3,-2],[-4,-6],[-4,-10],[-5,-9],[-13,-24],[-21,-38]],[[6631,3333],[-3,2],[-1,0],[-22,11],[-32,15],[-91,42]],[[6482,3403],[7,23]],[[6482,3403],[-22,10],[-20,9],[-25,11],[-25,12]],[[6390,3445],[35,98]],[[6425,3543],[24,-12],[5,-2],[4,-2],[4,-2],[4,-5],[5,-8],[19,52],[19,-10],[22,-10]],[[6631,3333],[-15,-27],[-6,-10]],[[6610,3296],[-89,76],[-34,17],[-5,-3]],[[6482,3386],[-88,-16],[-67,32],[-4,-14]],[[6323,3388],[-9,4],[6,22],[12,33],[16,-7],[1,11],[2,12]],[[6351,3463],[18,-9],[21,-9]],[[6351,3463],[-28,13],[-15,7]],[[6308,3483],[8,23],[8,24],[0,4],[0,5],[-1,3],[-2,2],[-3,6],[0,3],[0,2],[15,36],[4,9],[5,12],[4,0],[6,2],[3,1],[5,-3],[1,-4],[2,-3],[11,-24],[1,-3],[6,-13],[20,-10]],[[6401,3555],[24,-12]],[[6551,3599],[-20,-55]],[[6401,3555],[12,32],[-6,11],[-2,3],[-7,18],[0,2],[0,2],[1,2],[1,3],[-2,1],[-2,0],[-3,1],[-2,2],[-7,16]],[[6384,3648],[24,16],[20,12],[7,4],[4,4],[8,7]],[[6447,3691],[0,-5],[2,-6],[1,-3],[3,-4],[2,-3],[4,-3],[13,-7],[6,-12],[1,-3],[7,-14],[23,-12],[21,-10],[21,-10]],[[6308,3483],[-3,1],[-25,12],[-8,5],[-2,1],[-2,2]],[[6268,3504],[2,6],[4,12],[2,3],[1,4],[4,11],[2,4],[6,16],[1,2],[1,3],[7,17],[6,16],[8,22],[7,18],[24,62],[5,13],[1,3],[1,5],[1,2],[1,3],[2,4],[8,22],[13,31],[2,4],[6,15],[0,1],[14,33],[2,7],[13,31],[4,10],[5,12]],[[6421,3896],[1,-1]],[[6422,3895],[3,-1],[-9,-22],[-13,-31]],[[6403,3841],[-12,-27],[-12,-33]],[[6379,3781],[-13,-31],[-12,-33],[18,-9],[-25,-61],[-2,-7],[0,-8],[5,-1],[2,-3],[32,20]],[[5790,4258],[-10,12],[7,5],[18,10],[-11,19],[-12,19]],[[5782,4323],[19,15],[18,21],[-15,13],[12,16]],[[5816,4388],[62,-54],[-10,-18],[-8,-13],[-9,0],[-36,-35],[-1,-6],[-24,-4]],[[7151,2264],[-41,31]],[[7110,2295],[5,11],[6,10],[11,19]],[[7132,2335],[10,20],[11,19]],[[7153,2374],[11,20],[10,20]],[[7179,2245],[-16,-13]],[[7163,2232],[-4,-4],[-13,-10],[-11,-9],[-5,-5]],[[7130,2204],[-18,-14]],[[7112,2190],[-14,11],[-20,15],[-8,6]],[[7070,2222],[6,10],[8,15],[7,13],[7,13],[6,12],[6,10]],[[7230,2182],[-54,40],[-5,4],[-6,4],[-2,2]],[[7179,2245],[3,-1],[5,-4],[59,-44]],[[7246,2196],[-8,-7],[-8,-7]],[[7197,2154],[-4,4],[-51,37],[-5,3],[-7,6]],[[7230,2182],[-9,-7],[-8,-7],[-16,-14]],[[7180,2140],[-59,44],[-9,6]],[[7197,2154],[-7,-7],[-10,-7]],[[7160,2125],[-50,37],[-7,6],[-8,6]],[[7095,2174],[17,16]],[[7180,2140],[-7,-4],[-4,-3],[-9,-8]],[[7120,2091],[-65,48]],[[7055,2139],[22,19],[18,16]],[[7160,2125],[-10,-8],[-8,-7],[-22,-19]],[[7055,2139],[-21,16]],[[7034,2155],[13,25],[11,21]],[[7058,2201],[12,21]],[[7005,2096],[-46,33]],[[6959,2129],[11,21],[11,21],[12,21]],[[6993,2192],[5,-7],[3,-6],[33,-24]],[[7055,2139],[-15,-13],[-12,-11]],[[7028,2115],[-7,-6],[-7,-5],[-4,-3],[-5,-5]],[[7120,2091],[-27,-24]],[[7093,2067],[-65,48]],[[7093,2067],[-21,-21],[-67,50]],[[7016,1990],[-5,4]],[[7011,1994],[2,2],[42,36],[-23,16],[-9,-8],[-7,-6],[-18,14],[16,14],[-10,8],[-16,11]],[[6988,2081],[17,15]],[[7246,2196],[5,-3]],[[7251,2193],[-17,-14],[-33,-28],[-17,-15],[-15,-13],[-3,-2],[-17,-15],[-21,-18],[-2,-1]],[[7126,2087],[-27,-24],[-23,-20],[-17,-15],[-41,-36],[-2,-2]],[[6950,1933],[-6,3]],[[6944,1936],[16,15]],[[6960,1951],[18,14],[-68,44],[-4,0]],[[6906,2009],[37,33]],[[6943,2042],[7,-3],[10,-8],[14,-10],[4,-3],[2,-1],[11,-8],[20,-15]],[[7016,1990],[-3,-2],[-25,-22],[-38,-33]],[[6960,1951],[-69,45]],[[6891,1996],[15,13]],[[6944,1936],[-38,-33]],[[6906,1903],[-70,45]],[[6836,1948],[8,7]],[[6844,1955],[21,18],[9,8],[11,10]],[[6885,1991],[6,5]],[[8658,1867],[-4,5],[-21,28]],[[8633,1900],[10,11],[7,9]],[[8650,1920],[11,-9],[8,-4],[7,16],[6,15],[8,-3],[7,-4],[6,-6],[4,-2],[5,-2],[-4,-23],[-1,-8],[-6,-15],[-30,7],[-11,-12],[-2,-3]],[[8688,1948],[-25,10]],[[8663,1958],[12,57]],[[8675,2015],[10,-5],[8,-7],[-8,-44],[6,-2],[-3,-9]],[[8675,2015],[-31,9],[-1,3],[-3,1],[-3,-2],[-7,5],[-15,7]],[[8615,2038],[5,12],[4,11],[3,9],[2,7],[1,10],[-1,14],[1,4],[-1,0],[0,-1],[-1,0],[-1,0],[-1,0],[-1,0],[-1,1],[-1,1],[-1,2],[0,1],[0,2],[1,2],[0,1],[1,1],[-2,4],[-11,23],[-10,20],[-5,11],[-1,0],[-1,1],[-2,1],[-1,2],[-1,3]],[[8590,2180],[1,2],[0,1],[1,2],[2,1],[-2,12],[-1,3],[1,3],[0,3],[2,7],[3,10],[3,10],[3,7],[2,5],[4,7],[7,13],[2,3],[2,5],[1,0],[3,-1],[2,5],[17,33],[11,21],[4,9],[2,0],[12,27],[6,14],[3,8],[2,4]],[[8683,2394],[4,0],[7,2],[30,17],[8,1],[18,2],[3,3],[1,-4],[3,-8],[10,-7],[2,-2],[2,-8],[5,-12],[5,-8],[5,-12],[5,-12],[1,-6],[7,-8],[9,-12],[4,-12],[6,-11],[5,-14],[3,-11],[5,-7],[4,-3],[1,-5],[0,-6],[3,-6],[4,-2]],[[8843,2243],[-17,2],[0,-4],[1,-4],[-1,-8],[-1,-5],[-1,-5],[-3,-9],[-2,-6],[-4,-8],[-3,-4],[-5,-7],[-6,-5],[-5,-5]],[[8796,2175],[-10,-7],[-9,-4],[-12,-5],[-9,-4],[5,-14],[1,-8],[-1,-6],[0,-3],[-1,-3]],[[8760,2121],[-1,-4],[0,-2],[-2,-3],[-1,-4],[-8,-10],[-6,-6],[-10,15],[-6,18],[-24,-10],[3,-10],[15,-18],[6,-9],[-7,-6],[-5,-4],[-6,-6],[-14,-11],[-8,-11],[-7,-12],[-4,-13]],[[8796,2175],[4,-5],[11,-14],[15,-15],[0,-3],[-2,-4],[-8,-10],[-5,-4],[-2,-2],[-2,-2],[-2,-4],[-10,-15],[-3,-1],[-3,2],[-13,9],[-11,10],[-2,0],[-3,4]],[[6818,2142],[-60,38]],[[6865,2225],[-23,-40],[-14,-25],[-10,-18]],[[6878,2090],[-15,-27]],[[6863,2063],[-16,10],[16,29],[-14,15],[-14,14],[-17,11]],[[6865,2225],[62,-44],[-11,-21]],[[6916,2160],[-11,-20],[-27,-50]],[[6959,2129],[-43,31]],[[6888,2268],[62,-45]],[[6950,2223],[43,-31]],[[6988,2081],[-45,-39]],[[6943,2042],[-17,13],[-48,35]],[[6950,2223],[11,21],[11,20]],[[6972,2264],[86,-63]],[[6909,2311],[10,-7],[43,-32],[10,-8]],[[6999,2314],[-1,-3],[-12,-22],[-2,-3],[-12,-22]],[[7024,2359],[86,-64]],[[7046,2399],[86,-64]],[[7068,2438],[85,-64]],[[6694,2246],[-72,47]],[[6622,2293],[6,15],[3,5],[9,20]],[[6640,2333],[73,-48]],[[6640,2333],[-33,22]],[[6607,2355],[20,15],[3,4],[8,6]],[[6638,2380],[9,6],[4,4],[10,8],[3,3],[15,16],[3,2]],[[6603,2255],[-48,31],[-1,1]],[[6554,2287],[4,5]],[[6558,2292],[9,12],[13,17]],[[6580,2321],[19,24]],[[6599,2345],[8,10]],[[6622,2293],[-10,-19],[-9,-19]],[[6599,2345],[-2,3],[-58,43],[11,19],[8,16],[3,5]],[[6561,2431],[77,-51]],[[6580,2321],[1,5],[-54,41]],[[6527,2367],[-70,50]],[[6457,2417],[12,24],[11,19],[8,15],[4,8]],[[6492,2483],[69,-52]],[[6492,2483],[17,30]],[[6509,2513],[14,26]],[[6523,2539],[13,-10],[22,-17],[-3,-12],[-2,-11],[24,-3],[12,-3],[9,-4],[8,-6],[22,-18],[11,-5],[10,-8],[33,-23]],[[6523,2539],[37,68]],[[6560,2607],[34,-26]],[[6594,2581],[35,-25],[-2,-5],[-5,-8],[-5,-11],[21,-17],[24,-14],[15,-7]],[[6594,2581],[13,23],[13,24],[13,24],[36,-26]],[[6560,2607],[6,10],[4,8],[1,10],[-2,30],[0,2],[0,18]],[[6569,2685],[1,6],[2,5],[1,5],[2,3],[9,17],[13,24],[10,18],[1,2],[0,2],[13,23]],[[6621,2790],[62,-46]],[[6621,2790],[12,22],[13,24]],[[6646,2836],[23,-18],[30,-22],[9,-7]],[[6621,2790],[-62,47]],[[6559,2837],[12,22],[13,23]],[[6584,2882],[53,-40],[9,-6]],[[6584,2882],[10,19],[6,10]],[[6600,2911],[20,-15],[21,-16],[6,11],[3,6],[5,9],[21,-15]],[[6676,2891],[-5,-10],[-3,-5],[-6,-11],[-6,-10],[-10,-19]],[[6679,2898],[-2,-3],[-1,-4]],[[6600,2911],[-18,14],[-18,12],[-17,14]],[[6547,2951],[9,16],[4,7]],[[6560,2974],[2,2],[2,1],[3,3]],[[6567,2980],[6,-4],[18,-13],[10,-7],[1,-1],[5,-4],[9,-6]],[[6616,2945],[32,-23],[11,-9],[20,-15]],[[6616,2945],[2,4],[8,18],[10,18],[5,8],[11,9]],[[6652,3002],[24,-17],[19,-14],[18,-14]],[[6713,2957],[-9,-10],[-6,-9]],[[6698,2938],[-9,-18],[-9,-18],[-1,-4]],[[6567,2980],[1,1],[2,2],[10,18],[10,18],[12,21]],[[6602,3040],[40,-30],[10,-8]],[[6741,2852],[-1,1],[-61,45]],[[6698,2938],[63,-47]],[[8269,3639],[9,-6]],[[8278,3633],[-10,-19],[-3,-5],[-3,-6],[-8,-16],[-9,-15]],[[8245,3572],[-30,24],[-29,22],[-26,20],[-27,21]],[[8133,3659],[4,18]],[[8137,3677],[5,16]],[[8142,3693],[4,14]],[[8146,3707],[6,20]],[[8152,3727],[18,-14],[30,-22]],[[8200,3691],[-4,-22],[-6,-32],[34,-26]],[[8224,3611],[14,-11],[2,-2],[9,16],[1,1],[9,7],[2,2],[8,15]],[[8224,3611],[1,2],[23,42],[19,35]],[[8267,3690],[13,-11],[-10,-19],[-5,-17],[1,-1],[2,-1],[1,-2]],[[8200,3691],[9,42],[2,-1],[27,-21],[16,-12],[13,-9]],[[5608,4321],[12,16],[2,0],[1,1],[-1,1],[4,5]],[[5626,4344],[4,5]],[[5630,4349],[5,-5],[-11,-17],[33,-32],[8,18],[7,13]],[[5672,4326],[43,-45],[2,-2],[10,20]],[[5727,4299],[12,-13],[-3,-5],[-1,-4],[-2,-4],[-2,-3],[-1,-4],[-2,-4],[0,-3],[2,-1],[12,-2],[2,0],[2,5],[2,3],[1,3],[3,5],[16,-16],[22,2]],[[5816,4388],[11,17],[12,24],[2,4]],[[5841,4433],[51,-38],[13,-10],[3,-3]],[[5908,4382],[-1,-4]],[[5907,4378],[-7,-18],[-5,-12],[-29,-75]],[[5866,4273],[-4,-1],[-10,-4],[-19,-8],[-5,-1],[-3,-2],[-4,-1],[-4,-1]],[[5817,4255],[-5,-1],[-3,-1],[-4,-1],[-4,-1],[-5,-1],[-4,-1],[-3,0],[-4,-1],[-4,0],[-5,0],[-3,-1],[-6,0],[-5,0],[-7,0],[-7,1],[-6,0],[-6,1],[-4,1],[-4,0],[-4,1],[-5,1],[-5,2],[-4,1],[-4,1],[-10,3],[-4,2],[-4,1],[-6,3],[-5,2],[-4,3],[-4,2],[-4,2],[-3,2],[-8,4],[-4,4],[-4,2],[-3,2],[-3,3],[-3,2],[-3,3],[-3,3],[-3,2],[-10,10],[-10,10]],[[5727,4299],[3,8],[7,9],[5,4],[11,6]],[[5753,4326],[20,14]],[[5773,4340],[9,-17]],[[5672,4326],[9,20],[10,18]],[[5691,4364],[12,16],[29,-30],[18,-19],[2,-2],[1,-3]],[[5691,4364],[-13,14],[-15,14]],[[5663,4392],[47,61]],[[5710,4453],[13,-11],[15,-12],[31,-28],[-11,-17],[-12,-18],[23,-23],[2,-1],[2,-3]],[[5630,4349],[10,12],[12,16]],[[5652,4377],[11,15]],[[5652,4377],[-54,56]],[[5598,4433],[12,15]],[[5610,4448],[27,-28],[12,16],[19,27],[14,-12],[12,17],[16,-15]],[[9686,9775],[-1,-1],[-1,-1],[-36,-32],[-3,-2],[-2,-2],[-6,-6],[-7,-7],[-4,-5],[-5,-6],[-7,-10],[-6,-8],[-6,-11],[-2,-5]],[[9600,9679],[-4,-9],[-4,-10],[-4,-12],[-5,-26],[-1,-3],[-1,-6],[-7,-33]],[[9574,9580],[-6,-27],[-7,-25],[-4,-16],[-6,-28],[-16,-74],[-14,-65],[-10,-51]],[[9511,9294],[-10,-47],[-14,-67]],[[9487,9180],[-14,-68]],[[9473,9112],[-11,-50]],[[9462,9062],[-4,-1],[-8,-3],[-183,-67],[-130,-40]],[[9137,8951],[0,6],[1,6],[0,5],[1,6],[1,5],[0,5],[1,4],[1,9],[2,7],[2,12],[2,6],[1,6],[4,13],[6,23],[116,418],[29,103],[2,7],[22,78],[2,9],[1,4],[3,13],[2,7],[1,4],[1,9],[2,9],[0,4],[1,6],[1,4],[1,10],[0,6],[0,4],[1,3],[0,7],[0,41],[-3,0],[0,1],[0,12],[0,5],[0,6],[0,4]],[[9341,9838],[4,1],[6,2],[19,6],[6,2],[11,5],[8,3],[28,4],[5,-1],[4,-2],[2,-2],[3,-3],[2,-5],[2,-5],[3,-13],[5,-12],[2,-10],[1,-3],[1,-8],[5,-9],[10,-10],[14,-9],[11,-4],[9,0],[13,3],[13,-22],[2,-3],[9,-15],[3,-3],[2,0],[2,0],[32,13],[4,1],[-13,20],[11,9],[2,4],[-1,4],[-5,13],[14,3],[9,2],[9,3],[9,2],[5,0],[3,-1],[10,-2],[45,-12],[14,8],[1,0],[1,-1],[1,-1],[3,-4]],[[9700,9786],[-2,-2],[-10,-8],[-2,-1]],[[9673,9553],[-5,-24]],[[9668,9529],[-1,-3],[-1,-5],[-1,-11],[-2,-10],[-2,-17],[-2,-12],[-2,-12],[0,-9],[-7,-140]],[[9650,9310],[-30,-15],[-41,-6],[-36,1],[-32,4]],[[9574,9580],[37,-11],[1,9],[4,16],[5,23],[34,-9],[20,-6]],[[9675,9602],[-6,-33],[-3,-14],[7,-2]],[[9853,9901],[0,-3],[-1,-13],[-3,-13],[-6,-23],[-2,-5],[-1,-5],[-1,-6],[0,-3],[0,-2],[0,-1],[0,-1],[0,-1],[-1,-1],[-1,-1],[-1,-2],[-1,0],[-1,-1],[-1,0],[-1,1],[-1,0],[-1,1],[-1,2],[-1,1],[-1,0],[-2,0],[-2,1],[-2,0],[-2,-1],[-10,-2]],[[9809,9823],[-43,-11]],[[9766,9812],[-3,-1],[-11,-2],[-20,-6],[-14,-6],[-11,-6],[-5,-4],[-2,-1]],[[9341,9838],[0,1],[1,5],[0,5]],[[9342,9849],[3,0],[6,-1],[14,2],[12,4],[8,6],[9,3],[25,1],[8,2],[4,-1],[12,1],[15,-6],[8,2],[3,-1],[4,-4],[0,-5],[9,1],[4,-2],[4,-2],[3,-5],[2,-6],[6,-32],[2,-6],[1,-1],[4,-4],[8,-1],[3,0],[3,0],[4,0],[8,-4],[1,-4],[-4,-3],[-4,-1],[-4,0],[-4,-2],[-1,-1],[1,-1],[3,0],[2,0],[6,1],[11,5],[23,14],[8,2],[11,3],[5,4],[6,5],[4,1],[12,-1],[7,4],[14,13],[9,1],[8,4],[5,3],[8,8],[3,1],[6,2],[5,5],[7,2],[8,6],[5,1],[13,8],[16,10],[21,8],[9,10],[5,5],[3,0],[10,-2],[8,2],[8,4],[7,1],[8,4],[2,2],[6,6],[2,0],[8,-4],[5,1],[3,2],[5,6],[3,2],[8,1],[5,3]],[[9850,9931],[1,-16],[1,-5],[1,-9]],[[9667,9996],[2,-4],[4,0],[4,-1],[2,-3],[-3,-7],[1,-14],[-2,-9],[-4,-1],[-5,0],[-6,-3],[-15,-10],[-7,-7],[-6,-3],[-6,-10],[-12,-9],[-4,-4],[-4,-7],[-3,-5],[-6,0],[-1,2],[0,7],[-1,4],[-3,-1],[-1,-9],[-5,-19],[-3,-8],[-14,-13],[-6,-4],[-6,-1],[-14,3],[-22,9],[-2,4],[-1,4],[-1,4],[1,6],[1,4],[0,5],[1,5],[-2,7],[-2,5],[-1,7],[1,7],[5,2],[11,6],[5,6],[-1,5],[3,5],[7,1],[9,0],[9,2],[8,4],[6,4],[18,4],[19,8],[10,2],[6,5],[1,1],[13,12],[15,5],[4,0],[3,-3]],[[9455,8069],[-41,10]],[[9414,8079],[-42,11]],[[9372,8090],[5,21],[4,21],[4,21],[-24,6],[0,9],[-1,9],[8,1],[23,-6],[2,0],[1,2],[6,26]],[[9400,8200],[4,-1],[14,-7],[4,8],[7,12],[5,7],[6,6],[6,10],[1,3]],[[9447,8238],[20,-5]],[[9467,8233],[-4,-9],[-8,-12],[-9,-9],[-2,-3],[-4,-7],[15,-8],[1,-3],[-3,-5],[-3,-8],[-5,-28],[0,-3],[2,-1],[7,-2],[13,-1],[-1,-9],[-3,-15],[-4,-21],[-4,-20]],[[9563,8153],[-7,8],[-15,4],[-9,-47],[-1,-2],[-4,0],[-18,5],[-5,-21],[-4,-21],[-4,-21]],[[9496,8058],[-41,11]],[[9467,8233],[3,11],[1,8],[3,12],[1,5]],[[9475,8269],[22,-6],[15,-4],[18,-4],[15,-4],[49,-12],[24,-6],[2,-1]],[[9619,8026],[-41,11],[-41,11]],[[9537,8048],[-41,10]],[[9562,7952],[-42,11]],[[9520,7963],[-41,10],[4,20],[4,21],[5,23],[4,21]],[[9537,8048],[-4,-21],[-5,-24],[42,-10],[-4,-21],[-4,-20]],[[9615,8005],[-4,-23],[-4,-21],[-4,-19],[-41,10]],[[9569,7926],[-56,15]],[[9513,7941],[7,22]],[[8590,2180],[-19,-7],[-12,-5],[-11,-4],[-6,-4],[-4,-5],[-3,-3],[-3,-4]],[[8532,2148],[-14,-17],[-5,-4],[-10,-5],[-7,-2],[-6,0],[-15,2]],[[8475,2122],[-9,1],[-8,-2],[-11,-4],[-8,-8],[-4,-8],[-3,-10],[-1,-8],[1,-29],[0,-9],[0,-4],[0,-6]],[[8432,2035],[-2,-6],[-4,-16],[-8,-24],[0,-5],[-1,-9],[0,-5],[0,-3],[2,-1],[3,-2],[7,-4],[7,-1],[11,-1]],[[8447,1958],[0,-10],[-4,-7],[-6,-3],[-4,-4],[-2,-3],[-3,-4],[-2,-5],[-1,-4],[-2,-9],[1,-9],[-1,-10],[-3,-6],[-5,-6],[-1,-3],[-1,-3],[-1,-2],[-1,-3],[0,-3],[0,-8],[4,-8]],[[8415,1848],[-48,25]],[[8367,1873],[9,30],[4,12],[7,32],[3,60],[5,36],[1,42],[1,35],[5,12],[8,16],[4,6],[21,15],[3,0],[27,6],[9,2],[19,0],[2,2],[5,7],[13,16],[7,6],[27,24],[8,11],[3,4],[4,5],[0,8],[2,6],[4,2],[3,6],[2,5],[1,4],[7,7],[6,3],[6,8],[12,6],[21,11],[7,9],[3,11],[8,12],[3,7],[5,4],[8,8],[4,7],[1,4],[6,12],[4,5],[4,-2],[1,-1],[3,0]],[[8475,2122],[-3,-41],[-18,1],[-2,-25],[0,-17],[-1,-3],[-3,-3],[-4,0],[-12,1]],[[8489,1978],[2,-2],[1,-3],[-1,-17]],[[8491,1956],[-4,0],[-40,2]],[[8532,2148],[4,-7],[-2,-3],[-7,-7],[-3,-6],[2,-8],[2,-9],[3,-16],[2,-9],[13,-9],[-5,-8],[-3,0],[0,-1],[1,-2],[0,-1],[-1,-3],[-2,-1],[-2,-1],[-2,-2],[-3,-1],[-6,-2],[-12,-2],[-11,-2],[-2,-1],[-2,-1],[-5,-7],[0,-14],[-1,-18],[-12,0],[0,-6],[11,0],[0,-23]],[[8615,2038],[-12,-6],[-1,3],[-16,12],[-4,0],[-11,-19],[-7,-12],[-1,-4],[2,-13],[0,-4],[-3,-3],[-2,-2],[-16,-4],[-17,-5],[-10,-2],[-9,-1],[-19,0]],[[8615,2038],[-20,-48],[-2,-7],[0,-8],[0,-10],[5,-13],[6,-10],[3,-7],[1,-2]],[[8608,1933],[-7,8],[-4,3],[-4,3],[-9,3],[-4,2],[-5,1],[-4,2],[-6,1],[-5,0],[0,-3],[0,-8],[0,-9],[0,-1],[-3,-7],[-3,-5],[-3,-4],[-5,6],[-7,9],[-3,1],[-2,0],[-2,1],[-2,0],[-12,1],[-7,0],[-23,1]],[[8488,1938],[2,2],[1,16]],[[8663,1958],[-1,-5],[0,-5],[-5,-13],[-7,-15]],[[8633,1900],[-16,20],[-9,13]],[[8633,1900],[-4,-3],[-26,-30],[-9,-10]],[[8594,1857],[-5,7],[-27,-13],[-8,8],[-39,-31],[0,-6]],[[8515,1822],[-100,26]],[[8415,1848],[27,20],[12,8],[5,4],[5,4],[5,5],[11,-16],[2,-1],[2,0],[2,2],[7,9],[2,2],[-1,3],[-2,4],[-11,16],[2,6],[3,8],[1,8],[1,8]],[[8633,1765],[-26,-29],[-10,-17],[-11,-16]],[[8586,1703],[-3,3],[-18,21],[-10,12],[-25,31],[13,16],[-24,28],[-5,5],[1,3]],[[8594,1857],[5,-6],[-1,-33],[5,-17],[27,-33],[3,-3]],[[8658,1867],[3,-7],[3,-8],[2,-9],[1,-12],[0,-11],[-3,-11],[-3,-7],[-6,-11],[-9,-11],[-13,-15]],[[8741,2856],[7,-18],[4,-4],[6,-10],[10,-20],[6,-18],[3,-18],[0,-32],[-44,-209],[-13,-38],[-6,-1],[-2,0],[-4,-1],[-3,-1],[-5,-3],[-18,-18],[-14,-16],[-12,-14],[-7,-8],[-13,-9],[-34,-29],[-59,-44],[-61,-48],[0,-5],[-1,0],[-5,-4],[-13,-11],[-27,-15],[-31,-10],[-6,-2],[-6,0],[-9,1],[-47,39],[-3,0],[0,-3],[26,-22],[13,-12],[1,-2],[12,-7],[9,-1],[-2,-5],[-7,-8],[-6,-5]],[[8260,2321],[2,5]],[[8262,2326],[1,2],[1,3],[7,14]],[[8271,2345],[9,20]],[[8280,2365],[10,23],[12,25],[11,23]],[[8313,2436],[10,27]],[[8323,2463],[4,-3],[17,-9],[19,-11],[12,31],[15,39]],[[8390,2510],[1,-2],[18,0],[85,-4],[23,17],[5,6],[1,8],[1,19],[-36,0],[-29,1]],[[8459,2555],[0,23]],[[8459,2578],[0,22],[0,11],[0,12],[0,17],[0,1],[-1,1],[-59,1],[0,-18],[1,-1]],[[8400,2624],[-42,0],[-5,0]],[[8353,2624],[0,7],[1,13]],[[8354,2644],[1,15],[1,5],[2,7],[4,40],[1,5],[2,19]],[[8365,2735],[4,31],[5,49],[1,3],[0,3],[0,3]],[[8375,2824],[42,-6],[58,-10],[41,-6],[28,-4],[18,2],[12,2],[27,11],[4,1],[5,2],[5,1],[3,1],[2,1],[15,3],[16,4],[12,2],[12,3],[12,3],[6,2],[7,2],[8,5],[6,3],[3,2],[3,1],[1,1],[2,1]],[[8723,2851],[2,1],[3,-3],[13,7]],[[9137,3084],[1,1]],[[9138,3085],[2,-5],[-1,-2],[-1,1],[-1,5]],[[8390,2510],[5,12],[4,12]],[[8399,2534],[42,-1],[17,0],[1,22]],[[8399,2534],[0,11],[0,11]],[[8399,2556],[0,11],[0,12]],[[8399,2579],[32,-1],[28,0]],[[8312,3700],[-8,-17],[-8,-15],[-10,-20],[-8,-15]],[[8152,3727],[4,19]],[[8156,3746],[7,23],[5,21],[4,15]],[[8172,3805],[11,-8],[21,-16],[13,-9],[37,-28],[1,-1],[28,-21],[9,-7],[3,-2],[9,-7],[8,-6]],[[7761,6574],[-73,54],[-19,-32],[-22,-41],[-14,11]],[[7633,6566],[-16,12],[-22,17],[-21,18],[-2,2]],[[7572,6615],[-3,2],[-11,11],[-8,9],[-13,12],[-9,9],[-17,17]],[[7511,6675],[25,23],[10,9],[28,24],[24,17],[42,29],[13,11]],[[7653,6788],[5,-4],[17,-12],[67,-46]],[[7742,6726],[52,-35],[23,-16]],[[7817,6675],[-1,-3],[-10,-16],[-22,-42],[-23,-40]],[[7720,6501],[-1,-3],[-10,-18],[-14,11],[-4,-1],[-21,-40],[-17,13],[-11,-19]],[[7642,6444],[-8,-9]],[[7634,6435],[-14,16],[7,9],[10,14],[22,40],[-1,4],[-14,10]],[[7644,6528],[-18,14],[-2,1],[-1,2],[0,2],[1,3],[8,14],[1,2]],[[7761,6574],[-19,-33],[-22,-40]],[[8399,2579],[1,22],[0,23]],[[8345,2556],[3,23],[3,23],[2,22]],[[8399,2556],[-26,0],[-28,0]],[[8340,2511],[3,23],[2,22]],[[8390,2510],[-8,0],[-16,0],[-14,1],[-12,0]],[[8323,2463],[10,27],[7,21]],[[8313,2436],[-14,28],[-9,18]],[[8290,2482],[-8,16]],[[8282,2498],[14,17],[2,2],[9,40],[9,0],[10,0],[10,-1],[9,0]],[[8282,2498],[-10,19]],[[8272,2517],[-9,18],[-1,3],[-2,4]],[[8260,2542],[31,39],[18,21],[16,19]],[[8325,2621],[13,10],[16,13]],[[8325,2621],[2,6],[-15,13],[-14,13]],[[8298,2653],[25,37],[13,21],[4,6],[18,27],[7,-9]],[[8298,2653],[-11,16],[-7,9]],[[8280,2678],[-7,10],[-7,9],[-13,18],[-16,22],[-14,-14]],[[8223,2723],[-18,26],[-2,3]],[[8203,2752],[19,20],[11,11],[6,4],[26,24],[3,1],[26,25],[31,30],[47,41],[4,3]],[[8376,2911],[4,-26],[0,-6],[1,-6],[-3,-25],[-3,-24]],[[8446,3301],[8,-49],[2,-4],[4,-7],[1,-2],[1,-3],[2,-32]],[[8464,3204],[-4,0],[-24,14],[-12,7],[-27,15],[-8,5],[-11,6]],[[8378,3251],[19,34],[4,7],[7,21],[11,-5],[5,-3],[22,-4]],[[8378,3251],[-15,8],[-8,5],[-14,8],[-11,6]],[[8330,3278],[-15,9],[-26,15]],[[8289,3302],[8,16],[6,12],[5,9],[5,11]],[[8313,3350],[17,32],[5,10],[3,7],[8,14],[10,22],[14,24],[6,13]],[[8376,3472],[10,-6],[8,-6],[15,-10],[23,-14],[-4,-13],[-10,-28],[13,-6],[12,-5],[5,-2]],[[8448,3382],[-3,-15],[-1,-13],[1,-32],[1,-21]],[[8505,3564],[-7,-24],[-9,-26],[-6,-19],[-3,-6],[-1,-6],[-6,-16],[-9,-23],[-4,-12],[-2,-10],[-4,-13],[-6,-27]],[[8376,3472],[21,51],[4,5],[4,8]],[[8405,3536],[15,36],[3,8],[7,21],[3,8]],[[8433,3609],[12,-9],[10,-8],[16,-12],[3,-1],[19,-7],[0,-4],[9,-4],[3,0]],[[8376,3472],[-13,10],[-3,2],[-1,1],[-4,3],[-3,2],[-4,4],[-26,19]],[[8322,3513],[7,17],[13,28],[8,20]],[[8350,3578],[25,-18],[11,-9],[4,-3],[4,-3],[11,-9]],[[8350,3578],[-16,13],[-11,8]],[[8323,3599],[9,15],[10,18],[17,32]],[[8359,3664],[23,-17],[24,-18],[11,-8],[1,-1],[4,-3],[11,-8]],[[8322,3513],[-30,23],[-4,3],[-9,7],[-9,7],[-25,19]],[[8278,3633],[23,-18],[18,-13],[4,-3]],[[8312,3700],[26,-20],[18,-13],[3,-3]],[[8121,3613],[-15,11],[-8,5],[-5,3]],[[8093,3632],[-44,32]],[[8049,3664],[6,11],[1,2],[6,10],[4,8],[5,9]],[[8071,3704],[41,-29],[21,-16]],[[8133,3659],[-4,-17],[-8,-29]],[[8074,3602],[-2,1]],[[8072,3603],[-5,4],[-35,26]],[[8032,3633],[7,13],[10,18]],[[8093,3632],[-11,-19],[-4,-7],[-4,-4]],[[8111,3574],[-9,6],[-3,3],[-25,19]],[[8121,3613],[-6,-22],[-4,-17]],[[8096,3522],[-48,37]],[[8048,3559],[8,14],[6,10]],[[8062,3583],[5,10],[5,10]],[[8111,3574],[-5,-20],[-10,-32]],[[8048,3559],[-40,31]],[[8008,3590],[13,24],[41,-31]],[[8008,3590],[-11,-20]],[[7997,3570],[-18,13],[-22,17]],[[7957,3600],[-7,8],[-3,4]],[[7947,3612],[5,5],[6,11],[2,4]],[[7960,3632],[8,-7],[11,-10],[5,-6],[7,-5],[17,-14]],[[8027,3517],[-6,5],[-21,16],[-15,12]],[[7985,3550],[-18,14],[-20,15]],[[7947,3579],[1,3],[1,3],[3,2],[1,2],[1,3],[2,3],[1,5]],[[7997,3570],[10,-8],[26,-20],[4,-3]],[[8037,3539],[2,-2]],[[8039,3537],[-5,-9],[-7,-11]],[[8006,3479],[-10,8],[-7,6],[-17,13],[-9,7]],[[7963,3513],[7,12],[-20,15],[-8,6],[-9,7]],[[7933,3553],[12,22],[2,4]],[[7985,3550],[-6,-10],[-6,-10],[8,-6],[1,-1],[12,-10],[21,-17]],[[8015,3496],[-5,-9],[-4,-8]],[[8027,3517],[-12,-21]],[[8071,3451],[-12,9],[-9,8],[-14,11],[-14,11],[-7,6]],[[8027,3517],[20,-16],[18,-14],[4,-3],[11,-8]],[[8080,3476],[-4,-11],[-5,-14]],[[8088,3499],[-8,-23]],[[8039,3537],[37,-29],[12,-9]],[[8096,3522],[-8,-23]],[[8037,3539],[5,9],[6,11]],[[8289,3302],[-6,-12],[-3,-6],[-14,-28],[-2,-3],[-6,-12],[-2,-4],[-2,-2],[-1,-2],[-2,-2],[-1,-2],[-1,-1],[0,-1],[-30,-42],[-8,-10],[-10,-13],[-15,-20]],[[8186,3142],[-2,3],[-21,16],[-12,11],[-4,3],[-22,18],[-5,6],[-4,2],[-2,3],[-2,3],[-23,18],[-7,6],[-9,7],[-10,7]],[[8063,3245],[-9,7],[-1,2],[-25,20],[-24,20],[-3,1],[-7,6],[-4,5]],[[7990,3306],[14,22],[3,5],[9,16],[11,18],[13,22],[12,20]],[[8052,3409],[11,20],[7,18],[1,4]],[[8096,3522],[9,-7],[3,-2],[11,-9],[13,-11],[13,-10],[15,-11],[23,-19]],[[8183,3453],[10,-7],[33,-27],[3,-2],[7,-6],[13,-10],[19,-15],[18,-15],[3,1],[3,-2],[2,-2],[1,0],[1,-3],[1,-1],[16,-14]],[[8052,3409],[-59,48]],[[7993,3457],[13,22]],[[7993,3457],[-21,16],[-7,6],[-15,12]],[[7950,3491],[8,13],[5,9]],[[7950,3491],[-30,26]],[[7920,3517],[5,19],[2,1],[6,16]],[[7387,3495],[-118,-167],[-6,-12],[-20,-36],[-13,-29],[-12,-21],[-2,-3],[-6,-4],[-7,-5],[-5,-13],[-1,-10],[-1,-8],[-4,-9],[-5,-7],[-7,-6],[-6,-12],[-3,-7],[-1,-4],[0,-3],[-1,-4]],[[7169,3135],[-17,14]],[[7152,3149],[-27,23]],[[7125,3172],[39,74],[6,13],[2,31],[-3,10],[-9,32]],[[7160,3332],[-2,8],[-4,5],[-4,3],[-2,2],[-3,3]],[[7145,3353],[8,13],[0,1],[10,18],[4,7],[15,28],[-10,7]],[[7172,3427],[37,66]],[[7209,3493],[9,-7],[39,72],[2,5],[3,6],[3,3],[4,3],[3,2],[2,2],[5,3]],[[7279,3582],[10,-8]],[[7289,3574],[34,-25],[64,-54]],[[7172,3427],[-13,-25],[-10,7],[-6,4],[2,5]],[[7145,3418],[12,21],[11,22],[13,22],[12,21]],[[7193,3504],[5,-3],[10,-7],[1,-1]],[[7145,3353],[-17,13],[-5,-9],[-35,26],[-4,18]],[[7084,3401],[13,25]],[[7097,3426],[10,19]],[[7107,3445],[38,-27]],[[7107,3445],[12,21],[13,24],[11,21]],[[7143,3511],[12,22],[10,16]],[[7165,3549],[37,-27],[-9,-18]],[[7097,3426],[-42,31],[-5,11]],[[7050,3468],[33,62],[-15,21]],[[7068,3551],[12,-8],[21,2],[34,-26],[6,-4],[2,-4]],[[7050,3468],[-7,13],[-11,8],[-20,16]],[[7012,3505],[23,43],[6,23]],[[7041,3571],[27,-20]],[[7016,3593],[8,-9],[2,-2],[15,-11]],[[7012,3505],[-12,7],[-14,3],[-12,2]],[[6974,3517],[42,76]],[[6974,3517],[-19,8]],[[6955,3525],[13,4],[26,49],[10,15]],[[7004,3593],[12,0]],[[6955,3525],[-9,5],[-16,17]],[[6930,3547],[14,3],[18,34],[25,49],[2,-11],[15,-29]],[[7012,3505],[-11,-19],[-8,-8],[-4,-4],[-19,-17],[-6,-9],[-7,-21]],[[6957,3427],[-18,13]],[[6939,3440],[-36,25],[-4,3],[-13,10]],[[6886,3478],[7,12],[17,20],[20,37]],[[6886,3478],[0,20],[29,53],[-2,20]],[[6913,3571],[17,-24]],[[7481,5741],[-15,-10]],[[7466,5731],[-60,40]],[[7406,5771],[6,7],[12,5],[9,7]],[[7433,5790],[38,32]],[[7471,5822],[5,-8],[9,-8]],[[7485,5806],[14,-10],[-15,-28],[-12,-8],[9,-19]],[[7406,5771],[-56,40]],[[7350,5811],[5,8]],[[7355,5819],[9,14],[9,8],[19,15]],[[7392,5856],[11,-18]],[[7403,5838],[30,-48]],[[7485,5806],[17,15],[14,11],[4,0],[25,-19],[-10,-18],[-10,-18],[5,-5]],[[7530,5772],[-29,-55],[-4,-1],[-3,3],[-13,22]],[[7549,5614],[-2,2],[-4,2],[-52,38]],[[7491,5656],[14,26],[6,10],[3,5],[-48,34]],[[7530,5772],[16,-11],[29,55],[2,3],[10,17]],[[7587,5836],[13,26],[10,17],[11,18]],[[7621,5897],[15,-11]],[[7636,5886],[16,-13],[20,-14],[2,-2],[2,-1],[3,-3]],[[7679,5853],[-9,-18],[-10,-18]],[[7660,5817],[-1,-2],[-1,-2],[-3,-4],[-18,-34]],[[7637,5775],[-2,-3],[-1,-3],[-13,-23],[-14,-25],[-17,-32],[-23,-43],[-14,-25],[-4,-7]],[[7066,6051],[-10,-19]],[[7056,6032],[-11,13],[-8,-14],[-4,-8],[11,-8],[2,-1],[-4,-8],[-1,-1],[-4,-7]],[[7037,5998],[-7,5],[-7,5],[-7,5],[-6,4],[-20,-36],[-5,-9]],[[6985,5972],[-12,9],[-14,10],[-13,10]],[[6946,6001],[6,11],[2,5],[1,1],[1,3],[2,6],[8,15],[18,34],[1,4],[3,8],[2,11],[3,6],[4,-3],[69,-51]],[[8088,5335],[-3,1],[-7,4],[-2,1],[-22,12],[-3,1],[-8,4]],[[8043,5358],[-8,5],[-2,1],[-44,22],[-10,5],[-11,6]],[[7968,5397],[10,18]],[[7978,5415],[10,19]],[[7988,5434],[12,-6],[52,-27],[11,-5]],[[8063,5396],[11,-5],[24,-13],[8,-4],[2,-2]],[[8453,7042],[-11,-20]],[[8442,7022],[-59,43]],[[8383,7065],[11,20],[8,15],[7,14]],[[8409,7114],[59,-43]],[[8468,7071],[-7,-14],[-8,-15]],[[8475,7085],[-59,43]],[[8416,7128],[7,14],[41,77],[25,-19],[-3,-8],[33,-25]],[[8519,7167],[-10,-18],[-26,-50],[-8,-14]],[[8417,6967],[-5,3],[-11,8]],[[8401,6978],[-30,22],[-15,11],[-2,1],[-3,3]],[[8351,7015],[2,3],[6,12],[10,20],[10,18]],[[8379,7068],[4,-3]],[[8442,7022],[-9,-17]],[[8433,7005],[-8,-15],[-8,-15],[0,-4],[0,-4]],[[8360,6900],[-16,13],[-18,12]],[[8326,6925],[-13,10],[-6,-3]],[[8307,6932],[17,32],[4,8],[11,20],[1,2],[9,16],[2,5]],[[8401,6978],[-2,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-3],[-11,-21],[-15,-27],[-9,-23]],[[8384,6768],[-19,-1],[-15,0]],[[8350,6767],[1,2],[2,15],[1,3],[2,11],[0,3],[-3,0],[-15,4],[-2,2],[0,2],[1,7]],[[8337,6816],[6,22],[5,21],[7,21],[-23,17],[-15,11],[9,17]],[[8360,6900],[17,-12],[3,-2],[30,-20]],[[8410,6866],[1,-1],[16,-12]],[[8427,6853],[-6,-10],[-13,-54],[-17,-1],[-8,0],[1,-20]],[[8272,6779],[-7,-14],[-2,-10],[0,-13],[4,-14],[11,-16],[19,-27]],[[8297,6685],[9,-8],[13,-6],[17,-5],[3,-1]],[[8339,6665],[-1,-3],[-1,-4],[-1,-3],[-1,-3],[-4,-10],[-3,-9],[27,-19],[62,-45]],[[8417,6569],[-2,-4],[-2,-2]],[[8413,6563],[-24,18],[-18,13],[-13,9],[-4,3],[-4,3],[-4,2],[-3,3],[-4,3],[-19,14],[-3,3],[-10,8],[-7,6],[-14,11],[-4,4],[-3,3],[-3,3],[-4,4],[-2,2],[-3,3],[-9,9],[-5,5],[-3,3],[-1,1],[-5,4],[-5,6],[-23,23]],[[8216,6729],[0,2],[0,2],[0,1],[-1,2],[0,2],[1,2],[1,2],[1,1],[1,3],[1,1],[1,4],[2,4],[2,6],[2,7],[1,3],[2,4],[1,3],[2,5],[1,4],[1,4],[2,5],[2,5],[2,4],[1,3],[3,5],[3,6],[6,11],[4,9],[6,11],[5,9],[6,12],[5,8],[10,20],[17,33]],[[8337,6816],[-25,7],[-2,-5],[-12,8],[-5,-9],[-18,11],[-10,-19],[17,-12],[-10,-18]],[[7644,6528],[-13,-22]],[[7631,6506],[-32,24]],[[7599,6530],[-32,25],[-17,13]],[[7550,6568],[7,22],[3,10]],[[7560,6600],[10,12],[2,3]],[[7634,6435],[-15,-16]],[[7619,6419],[-5,8],[-9,11],[-12,12]],[[7593,6450],[5,9],[6,6],[8,8],[9,13],[10,20]],[[7593,6450],[-49,38]],[[7544,6488],[5,9],[3,8],[8,-3],[16,-12],[12,21],[11,19]],[[7544,6488],[-5,3],[-10,2]],[[7529,6493],[1,11],[16,51],[4,13]],[[8063,5396],[10,18]],[[8073,5414],[9,-4],[1,-1],[23,-11],[2,-1],[8,-4],[2,-2]],[[8073,5414],[10,19],[10,19],[8,-4],[7,-4],[5,11],[12,22],[13,-9],[-6,-13],[-10,-18],[3,-2],[11,-5],[2,-1]],[[7988,5434],[10,18]],[[7998,5452],[2,3],[8,16]],[[8008,5471],[10,19],[20,39]],[[8038,5529],[20,38]],[[8058,5567],[75,-39],[29,-15],[6,-3],[9,-4],[2,-1]],[[8058,5567],[8,15],[10,21]],[[8076,5603],[76,-39],[29,-15],[9,-4],[6,-3],[3,-2]],[[8209,5561],[-10,-21]],[[8076,5603],[7,11],[5,10],[11,20]],[[8099,5644],[11,-6],[55,-27],[9,-5]],[[8174,5606],[-11,-20],[12,-6],[32,-17],[2,-2]],[[8026,5219],[-4,-7]],[[8022,5212],[-3,1],[-9,5],[-5,2],[-18,9],[-9,5]],[[7978,5234],[12,23],[6,11],[6,11],[2,4]],[[8004,5283],[41,-22],[2,-1]],[[8047,5260],[-2,-3],[-10,-20],[-9,-18]],[[8006,5182],[-10,-20]],[[7996,5162],[-3,1],[-24,12],[-17,9],[14,26],[12,24]],[[8022,5212],[-6,-11],[-10,-19]],[[7942,5060],[-3,-6]],[[7939,5054],[-3,1],[-33,16],[-8,4]],[[7895,5075],[-31,15]],[[7864,5090],[-36,19],[-8,4]],[[7820,5113],[11,23],[12,22],[12,23]],[[7855,5181],[24,45],[12,23],[12,23]],[[7903,5272],[12,23]],[[7915,5295],[12,23],[2,3]],[[7929,5321],[75,-38]],[[7996,5162],[-12,-21]],[[7984,5141],[-11,-22],[-11,-22]],[[7962,5097],[-10,-19],[-10,-18]],[[7895,5075],[-11,-20],[-12,-23],[-12,-24],[-10,-18]],[[7850,4990],[-63,31],[-3,1],[-10,5]],[[7774,5027],[10,18],[12,25],[12,23]],[[7808,5093],[9,-5],[3,-1],[37,-18],[4,11],[3,10]],[[7866,4917],[-9,5],[-34,17]],[[7823,4939],[17,32],[10,19]],[[7939,5054],[-6,-12],[-5,-9],[-4,-8]],[[7924,5025],[-6,-11],[-3,-3],[-2,-4],[-11,-21],[-9,-18]],[[7893,4968],[-10,-18],[-8,-15],[-9,-18]],[[7913,4893],[-9,5],[-26,13],[-12,6]],[[7893,4968],[9,-4],[3,-1],[19,-10],[10,-4]],[[7934,4949],[-7,-19]],[[7927,4930],[-7,-17],[-7,-20]],[[7961,4869],[-9,5],[-30,15],[-9,4]],[[7927,4930],[9,-4],[30,-15],[9,-5]],[[7975,4906],[-7,-18],[-7,-19]],[[7961,4869],[-6,-18],[-7,-18]],[[7948,4833],[-9,5],[-30,14],[-9,5]],[[7900,4857],[6,18],[-9,5],[-26,13],[-5,3],[-3,1],[-7,2]],[[7856,4899],[6,10],[2,5],[2,3]],[[7711,4725],[-68,52]],[[7643,4777],[6,12],[6,11],[6,11],[6,12]],[[7667,4823],[68,-52]],[[7735,4771],[-6,-12],[-6,-11],[-6,-11],[-6,-12]],[[7749,4696],[-12,-25]],[[7737,4671],[-10,9],[-29,21],[-67,53]],[[7631,4754],[6,11],[6,12]],[[7711,4725],[29,-22],[9,-7]],[[7726,4651],[-38,30]],[[7688,4681],[-67,52]],[[7621,4733],[5,10],[5,11]],[[7737,4671],[-5,-10],[-6,-10]],[[3815,1681],[-46,-14],[-2,0],[-1,2],[-5,22],[-11,-3],[-4,-2],[-6,-6],[-18,-23],[-18,79]],[[3704,1736],[18,22],[6,7],[14,4],[50,16],[-3,12],[8,3],[11,4],[8,5],[7,3],[12,5],[20,5]],[[3855,1822],[6,-26],[1,-7],[3,-37],[2,-21],[-31,-10],[-8,-3],[-9,-2],[-8,-1],[0,-12],[1,-10],[3,-12]],[[3914,1792],[7,-27],[3,-16]],[[3924,1749],[-20,-6],[-23,-8],[3,-20],[2,-11],[1,-11],[3,-25],[2,-12],[4,-31],[1,-4],[3,-8],[4,-8],[10,-14],[2,-3],[2,-3],[0,-1]],[[3918,1584],[-37,1],[-3,0],[-5,1],[-10,0],[-66,1],[-49,-3],[-3,0],[-36,-5],[-16,-2]],[[3693,1577],[-2,8]],[[3691,1585],[25,5],[11,3],[9,6],[22,1],[16,2],[6,-1],[-1,12],[0,3],[0,6],[-2,8],[-2,10],[0,2],[2,2],[44,13],[-6,24]],[[3855,1822],[9,3]],[[3864,1825],[3,-2],[6,-1],[4,-1],[4,0],[13,-1],[13,3]],[[3907,1823],[3,-12],[4,-19]],[[4066,1586],[3,-5]],[[4069,1581],[-143,3],[-1,0],[-6,0],[-1,0]],[[3924,1749],[19,7],[3,0],[8,-33]],[[3954,1723],[19,-86],[3,-2],[3,0],[7,-3],[6,-3],[15,-11],[4,-30],[26,-1],[29,-1]],[[4037,1733],[-26,-7],[-2,-2],[-1,-4],[-17,-20],[-3,-4],[-5,8],[-6,7],[-8,6],[-10,4],[-3,0],[-2,2]],[[3914,1792],[61,48],[12,-22],[6,-10],[3,-13],[25,20],[16,-82]],[[4037,1733],[12,-59],[23,6]],[[4072,1680],[10,-46],[4,-25],[4,-23],[-24,0]],[[4204,1662],[15,-81],[-19,1],[3,-6]],[[4203,1576],[-95,4],[-39,1]],[[4072,1680],[26,9],[10,2]],[[4108,1691],[6,-34],[1,-2],[3,-1],[23,0],[29,-1],[16,4],[18,5]],[[4108,1691],[-6,30],[1,4],[21,17],[16,12],[26,7],[18,5],[22,6]],[[4206,1772],[3,-18],[3,-17],[3,-17],[4,-17],[3,-18],[4,-17],[-22,-6]],[[5108,1550],[-230,8],[-32,1],[-64,-2],[-93,2]],[[4689,1559],[-2,0],[-182,7],[-261,8]],[[4244,1574],[-6,0],[-35,2]],[[4206,1772],[17,5],[23,6],[-1,4],[-4,23],[-6,33],[-17,91],[147,186]],[[4365,2120],[155,-161],[188,239],[184,246],[127,167],[24,34],[10,4],[3,3],[1,-1],[-2,-4],[14,-10],[10,-8],[12,-9],[17,-12],[10,-7],[146,-147],[5,-6],[38,-39],[47,-50],[3,-3]],[[5357,2356],[-1,0],[-5,-7],[-26,-33],[-22,-26],[-1,-2],[-3,-3],[-26,-33],[-46,-57],[-32,-41],[-18,-22],[-12,-14],[-9,-12],[-6,-7],[-12,-15],[-5,-6],[-7,-8],[-22,-27],[-10,-13],[-37,-43],[-31,-37],[2,-3],[1,-2],[4,-9],[3,-9],[1,-3],[3,-14],[6,-32],[19,-101],[22,-114],[19,-105],[2,-8]],[[8142,5727],[-9,5],[-66,37]],[[8067,5769],[12,23],[12,22]],[[8091,5814],[63,-35],[12,-7]],[[8166,5772],[-12,-22],[-12,-23]],[[8067,5769],[-22,13],[-18,10],[-17,10]],[[8010,5802],[-7,3],[-2,1],[-9,5],[12,23],[12,23]],[[8016,5857],[75,-43]],[[7745,5975],[28,51],[2,4],[4,6],[15,29]],[[7794,6065],[3,-3]],[[7797,6062],[21,-16],[16,-11]],[[7834,6035],[31,-22],[15,-12],[3,-8]],[[7883,5993],[-4,-2],[-36,-21],[-11,-6],[-6,-3],[-8,-3],[-8,-2],[-5,0]],[[7805,5956],[-4,0],[-4,0],[-6,0],[-6,1],[-8,2],[-4,1],[-7,4],[-10,5],[-7,4],[-4,2]],[[7794,6065],[-4,1],[-6,-2],[-21,15],[-16,12],[-15,13]],[[7732,6104],[9,17]],[[7741,6121],[24,-17],[9,19],[6,-4],[7,5],[5,10],[-31,24],[11,21],[10,19]],[[7782,6198],[2,2],[12,22]],[[7796,6222],[53,-40],[3,-2],[3,-2]],[[7855,6178],[-6,-11],[-14,-27],[-7,-13],[-5,-9],[-16,-30],[-13,-23]],[[7741,6121],[-21,17],[-17,12],[31,57],[8,14]],[[7742,6221],[4,3],[36,-26]],[[7732,6104],[-56,42],[-16,12],[-28,21],[-16,12]],[[7616,6191],[15,29]],[[7631,6220],[12,22],[7,12],[3,8],[11,18]],[[7664,6280],[41,-31],[4,-4],[16,-11],[17,-13]],[[7660,6327],[4,-8],[9,-22]],[[7673,6297],[-9,-17]],[[7631,6220],[-17,12],[-8,6],[-11,25],[-18,14],[-14,11]],[[7563,6288],[23,14],[25,44],[15,9],[8,-19],[9,-19],[17,10]],[[7616,6191],[-21,-37],[-2,-3],[-4,-3],[-6,-4]],[[7583,6144],[-2,4],[-16,36]],[[7565,6184],[-10,23],[-10,19],[-19,34]],[[7526,6260],[-31,55]],[[7495,6315],[16,12],[16,9],[10,-17]],[[7537,6319],[10,-17],[10,-18],[6,4]],[[7645,6361],[15,-34]],[[7537,6319],[22,14],[19,35],[4,7],[1,9],[-2,9],[16,11],[22,15]],[[7619,6419],[8,-15],[18,-43]],[[7642,6444],[16,-12],[21,-52]],[[7679,6380],[-17,-9],[-17,-10]],[[7679,6380],[17,9]],[[7696,6389],[6,-6],[17,-12]],[[7719,6371],[-19,-33],[-12,-22],[-15,-19]],[[7720,6501],[17,-13]],[[7737,6488],[-1,-3],[-33,-60],[-4,-6],[-5,-5],[-7,-3],[9,-22]],[[7737,6488],[17,-13],[16,-12]],[[7770,6463],[-2,-2],[-23,-43],[-10,-18]],[[7735,6400],[-9,-18],[-7,-11]],[[7785,6364],[-17,11]],[[7768,6375],[-33,25]],[[7770,6463],[17,-12],[2,-2],[3,-2],[8,-5],[3,-2],[2,-2],[7,-3],[6,-2],[3,-2],[-1,-3],[-35,-64]],[[7862,6383],[-20,-35],[-15,-16],[-10,-18]],[[7817,6314],[-28,20],[-31,25],[10,16]],[[7785,6364],[15,-12],[10,18],[13,-11],[5,2],[17,33],[17,-11]],[[7817,6314],[-15,-28],[20,-15],[-5,-10],[-21,-39]],[[7862,6383],[10,18],[1,3],[17,-13],[17,-13],[32,-21],[6,-4],[1,-1],[6,-4],[4,-2],[3,-3]],[[7959,6343],[-3,-3],[-13,-14],[-4,-5],[-3,-4],[-4,-4],[-4,-6],[-3,-5],[-5,-6],[-1,-3],[-5,-7],[-1,-2],[-3,-5],[-2,-4],[-3,-5],[-19,-35],[-2,-4],[-3,-5],[-4,-8],[-5,-9],[-5,-10],[-3,-4],[-4,-7],[-4,-8],[-1,-2]],[[7817,6675],[38,-27]],[[7855,6648],[38,-28],[33,-23],[52,-41]],[[7978,6556],[53,-39]],[[8031,6517],[17,-14],[17,-15],[3,-3],[3,-2]],[[8071,6483],[-4,-8],[-5,-9],[-6,-8],[-4,-6],[-9,-12],[-6,-8],[-8,-9],[-17,-19],[-12,-13],[-23,-27],[-3,-3],[-3,-3],[-2,-3],[-2,-3],[-8,-9]],[[7978,6556],[3,8]],[[7981,6564],[13,24]],[[7994,6588],[54,-40],[-17,-31]],[[7981,6564],[-20,14],[-14,10],[-18,14],[11,24],[10,18]],[[7950,6644],[34,-24],[9,17],[1,2]],[[7994,6639],[20,-13]],[[8014,6626],[-2,-3],[-18,-35]],[[7855,6648],[21,22],[0,5],[-4,1],[9,17]],[[7881,6693],[42,-31],[27,-18]],[[7881,6693],[4,8],[3,11],[1,3]],[[7889,6715],[4,10],[4,7]],[[7897,6732],[17,-11],[16,-12],[16,-11],[16,-11]],[[7962,6687],[-9,-18],[41,-30]],[[7962,6687],[13,23],[6,12]],[[7981,6722],[44,-31],[17,-12]],[[8042,6679],[-19,-36],[-9,-17]],[[7897,6732],[12,24],[8,15]],[[7917,6771],[13,26]],[[7930,6797],[16,-12],[15,-11],[15,-10],[16,-12]],[[7992,6752],[-11,-30]],[[7930,6797],[10,18],[-37,28]],[[7903,6843],[10,18],[38,-27],[15,-12],[29,-20],[-10,-19],[17,-11],[-10,-20]],[[7917,6771],[-17,12],[-45,31],[-2,1],[-2,1],[-1,1],[1,1],[1,1],[2,0],[9,17]],[[7863,6836],[27,-19],[13,26]],[[7889,6715],[-25,18],[-24,18],[-11,8],[-6,4],[-29,20]],[[7794,6783],[50,49],[8,11]],[[7852,6843],[11,-7]],[[7742,6726],[6,10],[1,3],[11,12],[31,29],[3,3]],[[7653,6788],[-162,125],[-8,5],[-7,6],[-4,4],[-18,7]],[[7454,6935],[34,20],[-13,22],[-4,7]],[[7471,6984],[16,3],[12,3],[6,3],[10,4],[7,4],[7,5],[11,8],[3,2],[7,6],[3,2],[5,4],[17,15],[14,13],[13,14],[9,9],[3,4],[5,5],[7,8],[19,22]],[[7645,7118],[2,-2],[24,-17],[9,-12],[4,-13],[2,-10],[5,-8],[6,-7],[11,-8],[18,-11],[37,-20],[57,-32],[9,-6],[19,-12],[1,-1],[5,-5],[2,-3],[4,-9],[1,-5],[2,-7],[-27,-52],[25,-18],[-9,-17]],[[7509,6479],[3,29],[11,40]],[[7523,6548],[7,19],[7,24]],[[7537,6591],[6,22],[17,-13]],[[7529,6493],[-2,-17],[-18,3]],[[7490,6478],[3,19],[-56,43],[-1,4],[10,13],[12,16],[12,15]],[[7470,6588],[53,-40]],[[7509,6479],[-10,-1],[-9,0]],[[7490,6478],[-14,-5]],[[7476,6473],[-6,18],[-59,43],[0,4],[9,17],[35,44]],[[7455,6599],[15,-11]],[[7428,6417],[-17,12]],[[7411,6429],[11,17],[12,19],[8,11],[1,1],[1,7],[-44,33]],[[7400,6517],[-19,14],[9,15],[14,18]],[[7404,6564],[17,24],[19,23],[15,-12]],[[7476,6473],[-11,-6],[-7,-7],[-9,-10],[-14,-22],[-7,-11]],[[7411,6429],[-38,27],[7,21],[9,21],[11,19]],[[7428,6417],[-12,-18]],[[7416,6399],[-67,50]],[[7349,6449],[-12,9],[-9,8],[-3,2],[-2,3],[-6,7],[-4,5],[-5,6],[-6,9],[-5,8],[-5,11],[-7,16]],[[7285,6533],[9,15],[43,68],[34,-26],[33,-26]],[[7335,6358],[-16,12]],[[7319,6370],[1,2],[-16,12],[-43,31],[-16,12],[-6,-13]],[[7239,6414],[-57,41],[-23,16]],[[7159,6471],[55,111],[2,4],[13,27],[2,4]],[[7231,6617],[1,-2],[9,-13],[12,-15],[6,-7],[5,-8],[5,-7],[7,-12],[3,-8],[2,-4],[4,-8]],[[7349,6449],[-1,-4],[-8,-21],[35,-26],[0,-6],[-9,-1],[-8,-4],[-7,-4],[-6,-8],[-10,-17]],[[7294,6308],[-17,12],[-39,30],[-17,13]],[[7221,6363],[18,51]],[[7319,6370],[-7,-21],[-9,-24],[-9,-17]],[[7276,6266],[-72,53],[17,44]],[[7294,6308],[-6,-10],[-4,-11],[-3,-11],[-5,-10]],[[7300,6230],[-27,-49],[-15,12],[-16,11]],[[7242,6204],[1,3],[11,18],[10,19],[5,9]],[[7269,6253],[16,-12],[15,-11]],[[7294,6142],[-44,32]],[[7250,6174],[-17,13]],[[7233,6187],[9,17]],[[7300,6230],[14,-11],[-25,-48],[15,-12],[-10,-17]],[[7309,6130],[-15,12]],[[7300,6230],[12,23],[1,3],[2,0],[10,-8],[-1,-5],[3,-2],[21,-15],[4,-3],[5,-10]],[[7357,6213],[-6,-7],[-6,-9],[-27,-50],[-9,-17]],[[7293,6088],[-57,43],[-1,2],[-1,2],[0,2],[6,16],[4,10],[3,6],[1,3],[2,2]],[[7309,6130],[-1,-3],[-8,-18],[-7,-21]],[[7293,6088],[-5,-19],[-3,-16]],[[7285,6053],[-6,2],[-12,8],[-12,9],[-15,12],[-15,10],[-2,-2],[-15,-28]],[[7208,6064],[-23,17]],[[7185,6081],[7,11],[4,7],[9,18],[1,1],[7,17],[12,39],[6,10],[2,3]],[[7285,6053],[-2,-27],[-1,-25]],[[7282,6001],[-18,0]],[[7264,6001],[0,22],[-25,18],[-15,11],[-16,12]],[[7264,6001],[-18,-1]],[[7246,6000],[-1,11],[-72,54]],[[7173,6065],[12,16]],[[7159,6046],[7,12],[7,7]],[[7246,6000],[-18,1]],[[7228,6001],[-16,6],[-7,6],[-46,33]],[[7186,5977],[-47,34],[10,18],[10,17]],[[7228,6001],[0,-12],[0,-5],[-5,-9],[-27,19],[-10,-17]],[[7228,5945],[-8,-19],[-14,8],[-6,-12]],[[7200,5922],[-15,11]],[[7185,5933],[-16,12]],[[7169,5945],[6,12],[11,20]],[[7246,6000],[0,-14],[-1,-9],[-17,-32]],[[7185,5933],[-7,-15],[-14,10]],[[7164,5928],[-10,7],[-8,6],[-16,12],[-16,12]],[[7114,5965],[-14,10],[-13,9],[8,15]],[[7095,5999],[13,-9],[14,-11],[17,-12],[15,-11],[15,-11]],[[7134,5863],[-14,10],[-13,10]],[[7107,5883],[25,45],[-14,10],[-13,10]],[[7105,5948],[4,8],[5,9]],[[7164,5928],[1,-6],[-7,-14]],[[7158,5908],[-5,-8],[-19,-37]],[[7107,5883],[-13,9],[-13,10]],[[7081,5902],[24,46]],[[7081,5902],[-14,10],[-15,11],[-12,9],[-13,10]],[[7027,5942],[4,8],[8,13],[13,-9],[13,24]],[[7065,5978],[13,-10],[14,-10],[13,-10]],[[7027,5942],[-15,10]],[[7012,5952],[5,9],[20,37]],[[7037,5998],[8,-6],[6,-5],[7,-4],[7,-5]],[[7056,6032],[39,-33]],[[6510,2056],[-62,41]],[[6448,2097],[8,19],[4,10],[5,10],[13,28],[4,7],[10,10]],[[6492,2181],[59,-38]],[[6551,2143],[-11,-23]],[[6540,2120],[-11,-23],[-10,-22],[-9,-19]],[[6613,2074],[-73,46]],[[6551,2143],[11,23]],[[6562,2166],[63,-41],[10,-6]],[[6635,2119],[-11,-23],[-11,-22]],[[6492,2181],[7,7]],[[6499,2188],[11,11],[6,6],[3,5],[5,12]],[[6524,2222],[49,-31]],[[6573,2191],[-11,-25]],[[7962,6172],[-19,-42]],[[7943,6130],[-8,4],[-6,2],[-6,1],[-21,-2]],[[7902,6135],[-1,21],[1,5],[3,7],[10,-7],[10,0],[17,31],[8,15]],[[7950,6207],[19,-15]],[[7969,6192],[-7,-20]],[[7911,6055],[-14,11]],[[7897,6066],[16,40],[-15,11],[-15,11],[5,9]],[[7888,6137],[6,-2],[8,0]],[[7943,6130],[-15,-36],[-17,-39]],[[7897,6066],[-19,12],[-14,11],[-10,-17],[-8,-15],[-12,-22]],[[7797,6062],[2,2],[54,100],[27,-21],[8,-6]],[[7911,6055],[-4,-15],[-1,-14],[2,-24]],[[7908,6002],[-4,-1],[-8,-3],[-10,-3],[-3,-2]],[[8016,5857],[7,19],[8,19],[10,-6],[61,-34],[4,-3]],[[8106,5852],[-7,-19],[-8,-19]],[[8016,5857],[-29,17]],[[7987,5874],[12,16],[12,16],[31,54]],[[8042,5960],[13,-7]],[[8055,5953],[21,-11],[17,-10],[10,-5],[7,-4]],[[8110,5923],[17,-10]],[[8127,5913],[-6,-18],[-6,-19],[-2,-4],[-7,-20]],[[8055,5953],[14,35],[2,3]],[[8071,5991],[21,-12],[17,-9],[15,-9]],[[8124,5961],[-1,-3],[-6,-16],[-7,-19]],[[8203,5870],[-46,26],[-30,17]],[[8124,5961],[17,-8]],[[8141,5953],[13,-7],[15,-9]],[[8169,5937],[48,-26]],[[8217,5911],[0,-2],[-1,-2],[-13,-37]],[[8110,6073],[5,-3],[17,-6],[7,-3],[5,-5],[2,-8],[0,-8],[-3,-8],[-23,-42],[31,-18]],[[8151,5972],[-9,-16],[-1,-3]],[[8071,5991],[10,20],[16,29]],[[8097,6040],[13,33]],[[8151,5972],[10,19],[-11,8],[-1,5],[13,24],[4,2],[11,-8],[6,9],[7,13]],[[8190,6044],[13,11],[7,-19]],[[8210,6036],[12,-20],[-56,-71],[3,-8]],[[8110,6073],[9,19],[6,10],[8,13],[5,11],[6,16]],[[8144,6142],[14,-21]],[[8158,6121],[-3,-7],[-6,-17],[4,-3],[9,-14],[10,-15],[13,-19],[5,-2]],[[8097,6040],[-20,12]],[[8077,6052],[-17,10],[-34,20]],[[8026,6082],[10,18],[2,4],[17,31]],[[8055,6135],[10,17],[10,15],[15,17]],[[8090,6184],[15,15],[21,-30]],[[8126,6169],[18,-27]],[[8239,6072],[-29,-36]],[[8158,6121],[14,-20],[17,10],[17,9],[22,10],[-2,13],[-9,6],[-8,7],[-14,12],[-4,7]],[[8191,6175],[-9,25],[-19,8],[6,29]],[[8169,6237],[3,-1],[23,-61],[39,-33],[1,-45],[2,-14],[0,-6],[2,-5]],[[8158,6121],[8,22],[11,36],[14,-4]],[[5974,986],[0,-2]],[[5974,984],[-3,1],[-30,17],[-33,16],[-19,4],[-18,3],[-1,0],[-9,2],[-12,-10],[-11,-20],[-9,5],[-1,2],[1,5],[1,3],[7,10],[0,1],[-1,2],[-4,7],[-4,0],[-5,1],[-1,1],[-1,0],[-3,0],[-2,0],[-4,-15],[-3,2],[-7,4],[3,12],[-5,1],[-1,8],[-6,1],[0,2],[-4,1],[0,-4],[-1,0],[-1,0],[0,-7],[-3,0],[-1,7],[-5,0],[0,-4],[-3,-1],[0,-2],[-1,0],[-6,-1],[0,-3],[-3,0],[0,-2],[-31,-12],[-14,0],[-10,0],[0,-3],[0,-5],[0,-10],[8,-2],[0,-3],[-10,2],[-2,2],[0,8],[0,11],[-3,0],[-2,-2],[-11,-1]],[[5690,1018],[6,1],[2,19],[1,3]],[[5699,1041],[8,15],[5,18],[1,2],[7,10],[13,5],[21,7],[6,1],[8,0],[8,1],[18,2]],[[5794,1102],[15,3],[4,-1],[1,2],[46,2],[31,1],[13,1],[18,4]],[[5922,1114],[14,4],[21,7],[14,4],[1,0],[3,-4]],[[5975,1125],[-1,-36]],[[5974,1089],[0,-11]],[[5974,1078],[-10,0],[-9,1],[-18,3],[-19,3],[-17,2],[-3,-31],[-5,-32],[16,-4],[18,-7],[17,-10],[12,-8],[9,-5],[9,-4]],[[5977,881],[0,-10],[0,-16],[-2,-6]],[[5975,849],[-25,5],[-43,6],[-1,1],[-56,5],[-52,3],[-16,3],[-7,3],[-9,4],[-4,2],[-3,5],[-2,4],[0,6],[-1,2],[-67,27],[1,1],[1,3],[1,-1],[69,-28],[12,-5],[24,-4],[15,1],[14,3],[25,3],[13,3],[25,2],[20,-2],[30,-8],[16,-6],[22,-6]],[[5975,979],[1,-4],[0,-7]],[[5976,968],[-17,7],[-15,8],[-21,9],[-13,5],[-37,8],[-5,0],[-18,-4],[-1,5],[6,6],[8,6],[15,2],[6,0],[23,-8],[11,-4],[24,-12],[14,-10],[19,-7]],[[5978,906],[-2,1],[-6,8],[-15,14],[-7,2],[-27,6],[-22,2],[-4,0],[-11,-3],[-11,-1],[-11,0],[-4,1],[-2,2],[0,5],[0,7],[17,0],[4,2],[2,3],[1,0],[1,-3],[0,-3],[7,-2],[52,-7],[14,-3],[24,-8]],[[5978,929],[0,-6],[0,-17]],[[5794,1102],[-1,15]],[[5793,1117],[14,43],[4,12],[4,13]],[[5815,1185],[18,0],[27,1],[16,1],[-1,65]],[[5875,1252],[4,1],[12,0],[6,0],[22,1],[22,0]],[[5941,1254],[1,-66],[-21,-1],[1,-65],[0,-8]],[[5941,1254],[22,2],[2,-67],[0,-57],[10,3],[0,-5],[0,-5]],[[5815,1185],[-2,66]],[[5813,1251],[19,1],[43,0]],[[5813,1251],[-1,66]],[[5812,1317],[62,2],[22,0],[15,1],[7,0]],[[5918,1320],[8,0],[15,1]],[[5941,1321],[0,-67]],[[5813,1251],[-18,0],[-17,0],[0,-26],[-16,-2],[-3,27],[0,21],[-7,2],[0,24],[-11,0],[-43,1],[1,20]],[[5699,1318],[42,0],[32,-1]],[[5773,1317],[21,0],[18,0]],[[5773,1317],[0,26]],[[5773,1343],[-1,34]],[[5772,1377],[0,19],[0,19]],[[5772,1415],[20,0],[19,0]],[[5811,1415],[1,-98]],[[5773,1317],[-6,9],[-59,1],[-15,17]],[[5693,1344],[19,0]],[[5712,1344],[61,-1]],[[5712,1344],[-3,34]],[[5709,1378],[21,0],[7,2],[11,-1],[7,-2],[17,0]],[[5709,1378],[-2,19],[-1,20]],[[5706,1417],[17,0],[6,-1],[43,-1]],[[5693,1344],[-2,-4],[2,-22]],[[5693,1318],[-21,0]],[[5672,1318],[-5,64],[-1,18],[-1,11],[-1,6]],[[5664,1417],[1,5],[1,-3],[3,-1],[2,-1],[35,0]],[[5699,1318],[-6,0]],[[5810,1463],[1,-48]],[[5664,1417],[-1,20],[0,6],[0,8],[0,4],[0,27],[1,25],[0,3],[0,5],[0,4]],[[5664,1519],[11,0],[30,-2],[6,-1],[10,-1],[14,-1],[43,-5],[16,-2],[6,-1],[11,0],[0,-4],[0,-1],[-1,-5],[0,-33]],[[5683,1460],[-3,-20],[37,-1],[6,-1],[6,0],[5,0],[39,0],[0,19],[0,7],[0,20],[-87,2],[-2,-20],[-1,-6]],[[7012,5952],[-13,11],[-14,9]],[[6972,5772],[-49,36]],[[6923,5808],[-8,5],[-8,6],[-46,-86],[7,-6],[8,-5]],[[6876,5722],[49,-36]],[[6925,5686],[-4,-9],[-6,-11]],[[6915,5666],[-50,36]],[[6865,5702],[-6,5],[-5,3],[-4,5],[-4,4],[-7,10],[-3,4],[-5,5],[-4,3],[-4,4],[-11,7],[-15,10]],[[6797,5762],[33,60],[17,34],[1,3],[8,15],[8,16],[5,-3],[1,-3],[4,8],[11,24],[14,20],[9,14],[3,4],[2,4],[31,40],[2,3]],[[7027,5942],[-2,-4],[2,-5],[22,-17],[-20,-35],[-1,-2],[0,-1],[-56,-106]],[[6953,5737],[-49,36]],[[6904,5773],[9,17],[10,18]],[[6972,5772],[-9,-17],[-5,-9],[-5,-9]],[[6904,5773],[-10,-18],[-9,-16],[-9,-17]],[[6953,5737],[-5,-9],[-4,-8]],[[6944,5720],[-5,-9],[-4,-9],[-10,-16]],[[6953,5737],[60,-44],[-4,-9],[-5,-9]],[[7004,5675],[-60,45]],[[6995,5659],[-9,-17],[-61,44]],[[7004,5675],[-9,-16]],[[6995,5659],[36,-27],[2,-1],[8,-6],[19,-13],[1,-1],[6,-4]],[[7067,5607],[-3,-6],[-5,-8],[-2,-4],[-2,-3],[-9,-16]],[[7046,5570],[-12,9]],[[7034,5579],[-59,43]],[[6975,5622],[-60,44]],[[7004,5675],[36,-25],[30,-21],[7,-5]],[[7077,5624],[-1,-1],[-4,-8]],[[7072,5615],[-4,-7],[-1,-1]],[[7092,5536],[-46,34]],[[7072,5615],[45,-32]],[[7117,5583],[-4,-8],[-5,-7]],[[7108,5568],[-4,-7],[-4,-8]],[[7100,5553],[-7,-15],[-1,-2]],[[7072,5495],[-60,44]],[[7012,5539],[5,9],[5,9],[5,9],[5,10],[2,3]],[[7092,5536],[-1,-3],[0,-3],[-4,-8],[-5,-9],[-5,-9],[-5,-9]],[[7059,5470],[-20,15],[-4,-8],[-40,30]],[[6995,5507],[4,7],[4,8],[4,8],[5,9]],[[7072,5495],[-5,-9],[-8,-16]],[[7092,5536],[61,-44]],[[7153,5492],[-2,-3],[-5,-10],[-5,-10],[-5,-8],[-5,-9],[-13,-25],[-59,43]],[[7246,5424],[-33,24]],[[7213,5448],[-49,36],[-11,8]],[[7100,5553],[73,-53]],[[7173,5500],[63,-46],[18,-13]],[[7254,5441],[-4,-8],[-4,-9]],[[7108,5568],[73,-53]],[[7181,5515],[-4,-8],[-4,-7]],[[7117,5583],[73,-53]],[[7190,5530],[-5,-8],[-4,-7]],[[7117,5583],[4,7],[4,8],[72,-53],[-4,-8],[-3,-7]],[[7394,5476],[-9,-18],[-9,-17],[-12,-22]],[[7364,5419],[-18,13],[-6,5],[-5,3],[-2,0],[-3,4],[-8,9],[-6,5],[-5,5],[-32,23],[-7,-13],[-1,-2]],[[7271,5471],[-26,20],[-4,-8],[-4,-8],[-56,40]],[[7077,5624],[3,6],[2,4],[81,145],[2,3],[20,39],[2,3]],[[7187,5824],[55,-39]],[[7242,5785],[22,-17],[45,-33],[54,-39]],[[7363,5696],[54,-40],[28,-21],[26,-18]],[[7471,5617],[-2,-3],[-8,-14],[-2,-4]],[[7459,5596],[-9,-17],[-9,-17],[-9,-17]],[[7432,5545],[-9,-17],[-9,-17],[-12,-21],[-8,-14]],[[7271,5471],[-4,-8],[-5,-8],[-4,-7],[-4,-7]],[[7364,5419],[-7,-12]],[[7357,5407],[-10,-18],[-8,-16],[-7,-12]],[[7332,5361],[-25,18],[-5,5],[-30,21]],[[7272,5405],[-26,19]],[[7250,5365],[-59,43]],[[7191,5408],[5,9],[5,9],[5,9],[5,10],[2,3]],[[7272,5405],[-2,-3],[-10,-19],[-5,-9],[-5,-9]],[[7312,5324],[-8,5],[-54,36]],[[7332,5361],[-1,-3],[-11,-19],[-2,-3],[-6,-12]],[[7287,5277],[-12,-21]],[[7275,5256],[-86,63],[18,33],[-33,25],[3,7],[5,7],[4,8],[5,9]],[[7312,5324],[-2,-5],[-3,-5],[-9,-16],[-11,-21]],[[7400,5318],[6,-9],[2,-3],[2,-3],[3,-2],[10,-7],[5,-4],[20,-14]],[[7448,5276],[-2,-3],[-13,-22],[-8,7],[-42,30],[-1,4],[-5,-10],[-5,-9]],[[7372,5273],[-12,-20],[-14,-20]],[[7346,5233],[-3,2],[-2,2],[-3,2],[-2,1],[-1,1],[-48,36]],[[7332,5361],[28,-21],[4,-2],[4,-3],[4,-1],[9,-1],[3,-2],[5,-2],[2,-2],[2,-2],[1,0],[4,-4],[2,-3]],[[7357,5407],[52,-38],[1,-1],[3,-2],[2,-2],[2,-1],[3,-2]],[[7420,5361],[-10,-17],[-2,-5],[-5,-11],[0,-3],[-3,-7]],[[7491,5278],[-13,-24]],[[7478,5254],[-15,11],[-15,11]],[[7420,5361],[55,-40]],[[7475,5321],[-1,-14],[6,-11],[11,-18]],[[7394,5476],[28,-22],[24,-16],[3,-3],[3,-2],[4,-3]],[[7456,5430],[-9,-18],[-9,-17],[56,-41]],[[7494,5354],[-15,-13],[-4,-20]],[[7456,5430],[30,-22],[8,0],[6,-29]],[[7500,5379],[3,-17],[-9,-8]],[[6950,1933],[-103,-90],[-127,-106]],[[6720,1737],[-8,5],[29,47],[-22,15]],[[6719,1804],[5,11],[19,27],[35,50]],[[6778,1892],[2,3],[9,10],[4,5],[10,9],[12,11],[4,3]],[[6819,1933],[70,-44],[17,14]],[[8350,6767],[0,-4],[-2,-21],[-1,-5]],[[8347,6737],[0,-5],[-2,-22]],[[8345,6710],[-3,0],[-17,1],[2,28]],[[8327,6739],[1,20],[-16,1],[-11,2],[-13,5],[-16,12]],[[8327,6739],[-32,3],[-6,0],[-5,-2],[3,-7],[5,-8],[3,-3],[12,-3],[-2,-21],[-2,-7],[-6,-6]],[[8345,6710],[0,-4],[-1,-8],[-1,-7],[-1,-8],[-1,-9]],[[8341,6674],[-1,-2],[-1,-7]],[[8531,6462],[-10,-17],[-2,-5],[-10,-18]],[[8441,6440],[22,43],[-17,11],[-24,-45]],[[8422,6449],[-3,1],[-12,9],[-3,3],[-3,4],[0,3],[-1,5],[0,4],[2,6],[1,7],[0,6],[-1,7],[-2,3],[-3,2],[-34,25],[-16,-31],[-3,-6],[-2,-4],[-4,-8],[-1,-10],[0,-9],[1,-15],[-2,-8],[-4,-9]],[[8332,6434],[-7,3],[-40,17],[-26,14],[-2,-3],[-15,-39],[-1,-1],[-3,-5],[-4,-7]],[[8234,6413],[-5,-1],[-99,53],[-5,-14]],[[8125,6451],[-18,9],[-24,15],[-4,2],[-4,4],[-4,2]],[[8071,6483],[4,6],[34,65],[1,3]],[[8110,6557],[2,3],[13,26],[12,23],[3,6],[2,3],[4,8],[4,6],[8,12],[6,7],[9,12],[10,10],[6,8],[7,11]],[[8196,6692],[1,0],[4,8],[6,9],[4,8],[4,9],[1,3]],[[8413,6563],[4,-3],[4,-2],[3,-3],[4,-3],[18,-13],[34,-26],[42,-31],[4,-3],[8,-6],[3,-1]],[[6526,1502],[-10,-3],[-62,2],[-43,2],[-3,-3],[-3,-1],[4,-9],[2,-3],[0,-4]],[[6411,1483],[0,-23],[0,-28]],[[6411,1432],[0,-15],[0,-20],[50,-33]],[[6461,1364],[-4,-10]],[[6457,1354],[-35,21],[-6,2],[-12,6],[-1,52],[-3,1],[-3,2],[-2,1],[-3,1],[-101,53],[-2,1],[-6,4],[-5,4],[-27,18],[-15,9],[-42,44],[0,58],[0,7],[-60,19],[-23,7]],[[6111,1664],[-8,3],[-6,1],[-4,1],[-1,1],[-6,2]],[[6086,1672],[0,1],[1,2],[0,2],[2,6],[0,1],[4,7],[27,56],[1,8],[2,4],[4,5],[0,1],[5,7],[4,5],[7,7],[9,8],[6,14]],[[6158,1806],[191,-124],[41,-24],[11,-6],[2,-2],[3,-2],[23,-14],[6,-3],[25,-17],[13,-7],[1,-1],[82,-50]],[[6556,1556],[88,-41]],[[6644,1515],[-22,-5],[-4,-1],[-30,-7],[-4,-1],[-11,-1],[-7,0],[-5,1],[-2,1],[-14,9],[-11,7],[-8,-16]],[[8422,6449],[-26,-50]],[[8396,6399],[-3,2],[-4,2],[-5,2],[-5,3],[-28,16],[-5,2],[-4,3],[-5,3],[-5,2]],[[8234,6413],[-2,-3],[-3,-6],[-2,-6],[-9,-20]],[[8218,6378],[-7,-20]],[[8211,6358],[-9,-21],[-7,-20]],[[8195,6317],[-21,-51],[-4,-24]],[[8170,6242],[-24,97],[-9,51],[-12,61]],[[8182,6349],[3,-2],[17,39],[9,24],[-17,9],[-34,19],[-3,-10],[0,-2],[-1,-6],[2,-5],[13,-37],[8,-23],[3,-6]],[[8170,6242],[-1,-2]],[[8169,6240],[0,-3]],[[8126,6169],[7,7],[4,13],[-2,5],[-39,56],[-2,3],[0,3],[1,10],[1,3],[-33,12],[-3,1]],[[8060,6282],[-3,1],[-34,13],[-2,1]],[[8021,6297],[-14,10],[-4,3],[-15,12],[-18,13],[-9,7],[-2,1]],[[8090,6184],[-13,17],[-12,17],[-13,19]],[[8052,6237],[16,16],[-8,15],[-1,3],[0,2],[0,6],[1,3]],[[8055,6135],[-19,8],[-19,8],[-19,6]],[[7998,6157],[1,6],[8,13],[10,16],[10,15],[10,13],[15,17]],[[7998,6157],[-6,2],[-10,3],[-10,5],[-10,5]],[[7969,6192],[16,-8],[4,-1],[2,2],[7,15],[10,13],[15,21],[9,12],[8,8],[12,-17]],[[7969,6192],[22,50],[9,16]],[[8000,6258],[20,36],[1,3]],[[7950,6207],[15,25],[-18,12],[20,38],[17,-13],[16,-11]],[[7514,3024],[-1,0],[-7,-1],[-1,-4],[-7,-10],[3,-5],[1,-4],[-4,-9],[-3,-4],[-14,-14],[-13,-10],[-13,-12],[-26,-22],[-4,-4],[-56,-28],[-21,-16],[-29,-19],[-14,-5],[-14,-6],[-12,-2],[-16,0]],[[7263,2849],[-25,19],[-3,16],[4,12],[12,20],[-30,23],[10,20],[2,5],[-20,16]],[[7213,2980],[8,23],[5,10],[18,-12],[50,-33],[18,39],[14,23],[12,17]],[[7338,3047],[7,-7],[2,-1],[3,-2]],[[7350,3037],[10,-6],[19,23],[1,5],[6,31],[2,3]],[[7388,3093],[4,-2]],[[7392,3091],[5,-2],[6,-1],[15,-1],[2,0],[25,-2],[8,0],[6,0],[5,2]],[[7464,3087],[1,-7],[12,-14],[0,-1],[27,-11],[-3,-13],[7,-12],[6,-5]],[[7513,2895],[-9,5],[-6,-8],[-17,-3],[-20,-1],[-8,-3],[-37,-17],[-30,-15]],[[7386,2853],[-21,-14],[-20,-15],[-14,-8],[-11,-9],[-16,-18]],[[7304,2789],[-15,-15],[-17,-14]],[[7272,2760],[8,27],[4,16],[4,10],[7,11],[-25,21],[-7,4]],[[7514,3024],[9,-6],[10,-7],[20,-13],[2,-2],[24,-17]],[[7579,2979],[-12,-22],[-29,-51],[-4,-4],[-6,-3],[-15,-4]],[[7492,2773],[-5,7],[-5,4],[-5,1],[-5,4],[-4,7],[-8,5],[-4,0],[-7,2],[-8,11]],[[7441,2814],[-55,39]],[[7513,2895],[15,-11],[21,-16]],[[7549,2868],[-20,-37],[-17,-31],[-6,-14],[-14,-13]],[[7373,2736],[-69,53]],[[7441,2814],[-19,-17],[-18,-17],[-18,-24],[-13,-20]],[[7492,2773],[-5,-5],[37,-29]],[[7524,2739],[-28,-13],[-9,-4],[-30,-13]],[[7377,2638],[-41,31]],[[7336,2669],[12,22],[13,23],[12,22]],[[6573,2191],[63,-41],[10,-6]],[[6646,2144],[-11,-25]],[[6573,2191],[11,23]],[[6584,2214],[73,-47]],[[6584,2214],[10,22]],[[6594,2236],[73,-47]],[[6594,2236],[9,19]],[[6584,2214],[-54,34]],[[6530,2248],[3,6],[3,7],[0,1],[2,2],[4,6],[12,17]],[[6524,2222],[3,14]],[[6527,2236],[3,12]],[[6527,2236],[-2,1],[-2,1],[-28,19],[6,14],[-16,11]],[[6485,2282],[14,30],[9,18]],[[6508,2330],[29,-21],[19,-15],[2,-2]],[[6499,2188],[-2,1],[-43,28],[8,17]],[[6462,2234],[9,19],[14,29]],[[6527,2367],[-11,-21],[-2,-3],[-6,-13]],[[6462,2234],[-46,29],[0,24],[0,38],[0,24],[2,0],[1,1],[4,8],[1,2],[13,22],[2,-1],[-2,3],[0,3],[0,2],[1,2],[2,1],[1,1],[1,0],[7,-2],[-4,3],[2,3]],[[6447,2397],[0,2],[3,6],[2,3],[5,9]],[[7999,6097],[-8,-18]],[[7991,6079],[-19,10],[-18,10],[-22,-47],[-3,-11],[-2,-10],[22,2],[29,-2]],[[7978,6031],[-1,-24]],[[7977,6007],[-3,0],[-26,0],[-21,-1],[-15,-3],[-4,-1]],[[7943,6130],[21,-12],[16,-10],[19,-11]],[[7991,6079],[-8,-13]],[[7983,6066],[-4,-11],[-1,-24]],[[8026,6082],[-10,5],[-17,10]],[[8077,6052],[-18,-32],[-23,5],[-20,15],[-33,26]],[[8071,5991],[-14,6],[-9,4],[-9,2],[-14,2],[-45,2],[-3,0]],[[8042,5960],[-2,3],[-2,1],[-3,3],[-10,7],[-7,6],[-19,1],[-39,2]],[[7960,5983],[-17,0],[-13,-2],[-19,-3]],[[7911,5978],[-3,20],[0,4]],[[7987,5874],[-9,6]],[[7978,5880],[-14,13]],[[7964,5893],[13,16],[12,16],[7,8],[4,9],[-40,29],[0,12]],[[5871,2067],[-21,-122],[-1,-3]],[[5849,1942],[-3,-9],[-7,-22],[-8,-23],[-8,-22],[-20,-45],[0,-1],[-3,-8],[-19,-57],[14,-8],[2,-1],[1,0],[13,-6],[30,-14],[26,-12],[3,-2],[6,-2],[4,-2],[2,-1],[81,-39],[60,4]],[[6023,1672],[3,0],[22,0],[2,0],[10,0],[5,0],[8,0],[3,0],[3,0],[5,0],[2,0]],[[6111,1664],[0,-31],[0,-5],[0,-7],[-2,-98],[0,-14],[0,-2],[0,-1]],[[6109,1506],[-121,5],[-1,-8],[0,-4],[-1,-4],[-1,-13],[0,-30]],[[5985,1452],[-24,1]],[[5961,1453],[0,26],[-90,2],[0,-26]],[[5871,1455],[-13,1],[-10,-1],[-11,-1],[-9,4],[-6,6],[-12,-1]],[[5664,1519],[-4,0],[-2,0],[-71,3],[-2,0],[-2,0],[-72,2]],[[5511,1524],[0,2],[0,3],[0,9],[0,3],[-6,11],[-61,-7],[-7,0],[-5,1],[-22,-1],[-14,-2],[-27,-1],[-136,5],[-52,0],[-47,2],[-26,1]],[[5357,2356],[2,-2],[2,-2],[46,-49],[15,-12],[7,-5],[12,-9],[8,-7],[33,-35],[57,-64],[51,-59],[2,-3],[8,-9],[13,-14],[31,-37],[6,-6],[1,3],[2,17],[4,40],[7,50],[1,8],[0,7],[1,8],[6,49],[1,9],[1,7],[1,6],[1,5],[0,7],[1,3],[0,-1],[2,-1],[4,-4],[1,-2],[6,-5],[1,-1],[1,-1],[1,-1],[2,-1],[2,-3],[1,0],[2,-2],[2,-2],[1,-1],[2,-2],[2,-1],[2,-2],[0,-1],[1,-1],[1,0],[1,-2],[1,-1],[1,0],[3,-4],[6,-7],[2,-1],[0,-1],[1,0],[1,-1],[1,-1],[1,-1],[1,-1],[2,-1],[1,-1],[1,-2],[2,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-2],[2,-1],[1,-2],[1,-1],[1,-1],[2,-1],[1,-1],[1,-1],[1,-1],[1,-2],[1,-1],[2,-2],[1,-1],[1,-1],[1,-1],[1,-2],[1,-1],[7,-6],[3,-4],[2,-1],[1,-2],[2,-1],[1,-2],[1,-1],[2,-2],[1,-1],[1,-1],[2,-1],[0,-1],[7,-6],[9,-8],[24,-25],[1,-1],[3,-3],[16,-16],[0,-1],[4,-4],[2,-2],[1,-1],[3,-3],[1,-1],[1,-2],[2,-1],[3,-4],[7,-7],[1,-1]],[[5981,1916],[-16,-34],[-6,-7],[-24,15],[-13,10],[-2,2],[-1,1],[-2,1],[-2,2],[-1,1],[-1,1],[-1,0],[-1,1],[-3,2],[-1,1],[-1,1],[-1,0],[-1,1],[-1,1],[-1,1],[-2,1],[0,1],[-1,1],[-1,1],[-1,1],[-1,0],[-3,2],[-2,1],[-1,1],[-2,2],[-2,0],[-1,1],[-2,1],[0,1],[-2,1],[-1,0],[-1,2],[-1,1],[-2,1],[-1,1],[-1,0],[0,1],[-4,2],[-18,10],[-3,-7]],[[5871,2067],[13,73],[1,23],[2,9],[5,26],[2,9],[0,2],[40,237]],[[5934,2446],[10,-4],[12,-6],[17,-7],[11,-7],[8,-4],[4,-2],[16,-9],[7,-3],[13,-8],[4,-4],[108,-49]],[[6144,2343],[-20,-43],[-18,-36],[-6,-13],[-1,-5],[-5,-34]],[[6094,2212],[-6,-35],[0,-9]],[[6088,2168],[2,-34],[-1,-7],[-2,-4],[-24,-29],[-4,-10]],[[6059,2084],[-8,-18],[-8,-18],[-9,-18],[-8,-18],[-9,-19]],[[6017,1993],[-10,-20],[-9,-21],[-9,-18],[-33,21],[-4,-20],[29,-19]],[[6235,2626],[-9,-16],[-9,-21]],[[6217,2589],[-16,12],[-16,11],[-17,-33]],[[6168,2579],[-16,12],[17,32],[-17,13]],[[6152,2636],[8,17],[1,3],[-1,1],[-35,25],[-16,-21],[-6,-8],[-8,-5],[-6,-6],[-10,-18],[-3,-5],[-1,-8],[-9,-50],[51,-31]],[[6117,2530],[-10,-24]],[[6107,2506],[-4,-10],[-2,-11],[-15,-34],[17,-11],[18,-11],[18,-11],[26,-17]],[[6165,2401],[-4,-18],[-6,-17]],[[6155,2366],[-11,-23]],[[5934,2446],[25,152],[6,37]],[[5965,2635],[5,5],[39,44],[17,-20],[0,-1],[1,-1],[1,-1],[2,-2],[5,-7],[0,-1],[3,1],[21,10],[4,2],[0,1],[1,0],[1,1],[2,0],[0,1],[62,35],[66,-48],[40,-28]],[[6107,2506],[62,-41]],[[6169,2465],[-3,-22],[1,-27],[-2,-15]],[[6192,2521],[-41,29],[-9,7],[-5,4]],[[6137,2561],[-7,10],[-8,9],[30,56]],[[6168,2579],[16,-11],[23,-17],[-15,-30]],[[6137,2561],[-1,-5],[-4,1],[-1,0],[-1,0],[-2,-3],[-2,-4],[-9,-20]],[[6309,2476],[11,22],[-11,8],[-23,16],[-7,5],[-4,4],[2,4],[14,24],[36,-26],[7,-9]],[[6334,2524],[38,-27],[0,-52],[0,-2],[-16,0],[-3,1],[-3,2],[-4,3],[-37,27]],[[7738,7965],[-53,-45]],[[7685,7920],[-13,-12]],[[7672,7908],[-3,4],[-22,35],[-14,-12],[-49,77]],[[7584,8012],[13,13],[12,13],[51,-79],[18,15],[18,16],[17,15]],[[7713,8005],[23,-37],[2,-3]],[[7672,7908],[-15,-12],[-12,-10]],[[7645,7886],[-59,-52]],[[7586,7834],[-2,4],[-15,22]],[[7537,7964],[6,8],[5,5],[5,5],[2,1],[11,9],[3,3],[4,4],[11,13]],[[7640,7788],[-16,-14]],[[7624,7774],[-38,60]],[[7645,7886],[14,-22],[-14,-12],[11,-17]],[[7656,7835],[-30,-26],[14,-21]],[[7733,7779],[-11,-14]],[[7722,7765],[-26,41],[-14,-11],[-26,40]],[[7685,7920],[13,-21],[12,-18],[25,-40]],[[7735,7841],[24,-38]],[[7759,7803],[-13,-11],[-10,-9],[-3,-4]],[[7722,7765],[-4,-6],[-8,-7],[-15,-12],[-15,-14]],[[7680,7726],[-20,32],[12,11],[1,2],[-1,2],[-16,25],[-1,2],[-2,-1],[-13,-11]],[[7680,7726],[-16,-13]],[[7664,7713],[-40,61]],[[7805,7698],[-12,-15],[-10,-14],[-18,-22]],[[7765,7647],[-13,20],[-14,-18],[-4,-1],[-5,1],[-8,13],[-11,17],[-30,47]],[[7733,7779],[4,-7],[6,-11],[-8,-14],[10,-16],[2,-2],[1,-3],[11,-16],[10,9],[1,0],[1,-1],[10,-15],[12,15],[12,-20]],[[7831,7730],[-26,-32]],[[7759,7803],[17,14]],[[7776,7817],[42,-67],[13,-20]],[[7861,7768],[-30,-38]],[[7776,7817],[16,17],[11,11],[6,0],[5,-4],[34,-54]],[[7848,7787],[13,-19]],[[7917,7839],[-56,-71]],[[7848,7787],[20,26],[-29,44],[43,37]],[[7882,7894],[12,-18],[11,-17],[12,-20]],[[7735,7841],[9,9],[7,9],[14,21],[2,1],[15,13]],[[7782,7894],[8,-11],[3,-2],[4,0],[2,1],[11,9],[16,14],[-42,66],[16,14],[16,13]],[[7816,7998],[42,-65],[12,-20]],[[7870,7913],[12,-19]],[[7782,7894],[-30,49],[-14,22]],[[7738,7965],[65,55]],[[7803,8020],[13,-22]],[[6474,1392],[-63,40]],[[6411,1483],[20,-13],[12,-8],[12,-8],[38,-24]],[[6493,1430],[-5,-9]],[[6488,1421],[-4,-8],[-5,-11],[-5,-10]],[[6545,1440],[-10,-22],[-37,24],[-5,-12]],[[6526,1502],[10,-7],[11,-7],[16,-10],[-8,-18],[-10,-20]],[[6591,1409],[-16,-16],[-16,-17]],[[6559,1376],[-16,-16],[-39,26],[9,20],[-25,15]],[[6545,1440],[46,-31]],[[6644,1515],[8,0],[3,0],[4,1]],[[6659,1516],[0,-5],[-1,-11],[0,-8],[-2,-8],[-1,-4],[-3,-8],[-2,-2],[-24,-26],[-4,-3],[-14,-15],[-17,-17]],[[6601,1293],[-5,10],[-12,30],[-3,11],[-1,2],[-2,4],[-1,4],[-3,5],[-1,3],[-6,8],[-5,6],[-1,0],[-2,0]],[[6659,1516],[41,-1],[24,-16],[-1,-8],[2,-1],[1,0],[1,-1],[3,-1],[3,-2],[37,34],[14,13],[3,1],[3,2],[7,5],[1,0],[2,1],[5,2],[1,1],[7,4],[5,2],[4,2],[3,1],[2,2],[1,0],[2,1],[1,0],[4,2],[2,1],[1,1],[2,1],[1,0],[0,1],[2,0],[1,1],[7,5],[7,3],[5,2],[1,0],[1,1],[3,1],[3,2]],[[6871,1578],[2,-1],[7,-5],[20,-14],[35,-24],[3,-2]],[[6938,1532],[-14,-18],[-25,-20],[-27,-24],[-27,-18],[-54,-35],[-75,-47],[-110,-74],[-5,-3]],[[6556,1556],[3,8],[14,31],[9,19],[10,5],[9,6],[14,10],[15,13],[14,13],[2,2],[15,15],[16,14],[5,4],[3,1]],[[6685,1697],[46,-29]],[[6731,1668],[-8,-7],[-17,-14],[-3,-4],[-12,-10],[-27,-80],[-3,-9],[0,-6],[-1,-7],[-1,-9],[0,-6]],[[6731,1668],[85,-55],[1,0],[1,-1],[3,-2]],[[6821,1610],[2,-1],[31,-20],[1,-1],[16,-10]],[[6749,1741],[49,-32],[7,4],[7,3]],[[6812,1716],[35,-22],[11,8],[3,-2],[-31,-70]],[[6830,1630],[-9,-20]],[[6731,1668],[9,9],[9,7],[11,7],[18,8],[-15,10],[-8,5],[-21,14]],[[6734,1728],[8,7],[7,6]],[[6685,1697],[-5,5]],[[6680,1702],[40,35]],[[6720,1737],[5,-3],[4,-3],[5,-3]],[[6680,1702],[-9,4]],[[6671,1706],[6,12],[11,22]],[[6688,1740],[6,13],[2,5],[2,4],[10,21]],[[6708,1783],[11,21]],[[6688,1740],[-73,47],[-32,20],[10,22]],[[6593,1829],[10,21],[10,21]],[[6613,1871],[58,-37],[-10,-21],[36,-23],[11,-7]],[[6656,1963],[58,-38],[3,6]],[[6717,1931],[61,-39]],[[6613,1871],[9,20],[8,17],[9,18],[8,18],[9,19]],[[6593,1829],[-73,47]],[[6520,1876],[7,6],[6,12]],[[6533,1894],[10,22],[9,19],[8,18]],[[6560,1953],[17,36],[9,19]],[[6586,2008],[70,-45]],[[6671,1706],[-178,114]],[[6493,1820],[6,12],[11,23],[10,21]],[[6671,1706],[-5,-8]],[[6666,1698],[-73,47],[-8,-18]],[[6585,1727],[-59,37],[-8,-19],[-9,-19]],[[6509,1726],[-58,37]],[[6451,1763],[10,20],[8,18],[8,18],[13,-7],[3,8]],[[6532,1632],[-22,13],[-25,16],[-6,4],[10,23],[5,9],[4,5],[2,6],[9,18]],[[6585,1727],[-8,-19],[-9,-20],[-9,-18],[-7,5],[-9,-21],[-11,-22]],[[6666,1698],[-16,-14],[-15,-14],[-18,11],[-8,-20],[-1,-3],[-12,-9],[-3,-1],[-3,2],[-4,2],[-8,-16],[-2,-3],[-15,-6],[-17,-3],[-12,8]],[[6451,1763],[-9,-18],[-20,13],[-2,4],[0,21],[0,25],[-3,3]],[[6417,1811],[0,22],[0,24],[0,12]],[[6417,1869],[9,-4],[67,-45]],[[6417,1869],[6,12],[3,-2],[11,22],[10,22]],[[6447,1923],[10,20]],[[6457,1943],[70,-45],[6,-4]],[[6417,1869],[-16,8],[-10,7],[-1,1],[-28,16]],[[6362,1901],[10,5],[3,18],[2,14],[-6,29],[-2,6]],[[6369,1973],[5,6],[11,10],[19,18],[2,3],[1,3]],[[6407,2013],[1,-11],[8,-6],[0,-27],[1,-27],[30,-19]],[[6407,2013],[1,0],[5,12],[8,17]],[[6421,2042],[2,-2],[61,-38]],[[6484,2002],[-8,-18],[-9,-19],[-10,-22]],[[6484,2002],[9,17],[70,-45],[-9,-17],[6,-4]],[[6421,2042],[10,23],[8,13],[3,7],[6,12]],[[6510,2056],[70,-44],[6,-4]],[[6613,2074],[-10,-23],[-7,-14],[-1,-7],[0,-3],[-1,-3],[-8,-16]],[[6407,2013],[0,6],[-2,-6],[-3,-3],[0,-1]],[[6402,2009],[-1,26],[0,240]],[[6401,2275],[0,7]],[[6401,2282],[0,35],[1,44],[0,41],[0,4]],[[6402,2406],[4,0],[5,0],[9,0],[8,-1],[5,-1],[5,-2],[5,-2],[4,-3]],[[6401,2275],[-2,-23],[-2,-25],[-6,-29],[0,-1],[-7,-25],[-17,-42],[-13,-21]],[[6354,2109],[-14,8],[-38,25],[-31,20],[-15,9]],[[6256,2171],[13,60],[1,8],[3,9],[4,9],[4,-3]],[[6281,2254],[15,-9],[2,0],[2,2],[6,14],[17,-11],[-8,-16],[0,-1],[1,-2],[1,-1],[57,-37],[3,0],[1,2],[1,4],[1,12],[-1,8],[0,24],[0,19],[0,22],[0,2],[-2,1],[-29,18],[-17,12],[-3,3]],[[6328,2320],[0,17],[1,8],[4,11],[11,24],[6,13],[2,4],[2,8],[0,3],[-6,5],[-9,6],[2,3]],[[6341,2422],[9,-7],[7,-4],[7,-4],[4,-1],[6,0],[6,0],[7,0],[5,0],[9,0],[1,0]],[[6281,2254],[27,58],[3,7],[7,7],[6,-5],[4,-1]],[[6402,2009],[-3,1],[-19,-17],[-10,7],[-5,3],[12,24],[5,13],[-1,5],[-4,6],[-8,5],[-7,5],[-9,2],[-12,-1],[-6,-8],[-14,-22],[-21,-31]],[[6300,2001],[-15,-23]],[[6285,1978],[-25,-35]],[[6260,1943],[-15,-22]],[[6245,1921],[-11,7],[-4,3]],[[6230,1931],[71,99]],[[6301,2030],[24,35],[29,44]],[[6301,2030],[-12,12],[-57,35],[-17,10]],[[6215,2087],[8,17],[8,16],[6,10],[9,23],[10,18]],[[6230,1931],[-12,8],[10,15],[-57,37]],[[6171,1991],[8,18]],[[6179,2009],[8,18],[8,16],[9,20],[11,24]],[[6369,1973],[-3,2],[-11,7],[-8,5]],[[6347,1987],[-13,8],[-2,1],[-2,1],[-4,-1],[-9,-3],[-3,0],[-3,0],[-2,1],[-9,7]],[[6347,1987],[-31,-30]],[[6316,1957],[-17,12],[-14,9]],[[6316,1957],[-14,-14]],[[6302,1943],[-5,-4],[-3,-2],[-8,-6],[-3,0],[-4,0],[-3,2],[-16,10]],[[6281,1897],[-3,2],[-14,9],[-3,4],[-16,9]],[[6302,1943],[18,-13],[1,-3]],[[6321,1927],[-6,-4],[-18,-14],[-16,-12]],[[6321,1927],[21,-13],[-18,-15],[22,-15]],[[6346,1884],[-3,-4],[-11,-12],[-1,-3]],[[6331,1865],[-50,32]],[[6362,1901],[-5,-5],[-11,-12]],[[6730,2120],[-11,-23]],[[6719,2097],[-11,-24],[-11,-24],[-11,-22]],[[6686,2027],[-73,47]],[[6686,2027],[-11,-24],[-10,-21],[-9,-19]],[[6836,1948],[-12,-11],[-5,-4]],[[6717,1931],[6,14],[10,21],[11,23]],[[6744,1989],[61,-40],[12,24],[27,-18]],[[7964,5893],[-41,31],[-17,13]],[[7906,5937],[4,14],[1,10],[0,17]],[[7891,5897],[6,17],[9,23]],[[7978,5880],[-6,-9],[-14,-25],[-32,24],[-35,27]],[[7987,5874],[-27,-45],[8,-3],[9,-6],[-5,-10],[-5,-10],[-4,-7]],[[7963,5793],[-56,42],[-30,22]],[[7877,5857],[7,19],[7,21]],[[7944,5758],[-60,44],[-10,7],[-11,6]],[[7863,5815],[7,22]],[[7870,5837],[7,20]],[[7963,5793],[-5,-10],[-4,-8],[-7,-12],[-3,-5]],[[7925,5721],[-21,15],[-55,39]],[[7849,5775],[14,40]],[[7944,5758],[-3,-8]],[[7941,5750],[-5,-8],[-1,-3],[-9,-17],[-1,-1]],[[7908,5689],[-11,-22]],[[7897,5667],[-48,36],[-2,1],[-1,0],[-1,0],[-1,-1],[-8,-14],[-15,10]],[[7821,5699],[6,16],[4,12],[2,3],[4,13],[12,32]],[[7925,5721],[-7,-13],[-3,-6],[-7,-13]],[[7897,5667],[-7,-13]],[[7890,5654],[-9,-13],[-10,-5],[-24,-45],[2,-14],[-10,-19]],[[7839,5558],[-13,12],[-16,12],[-34,24]],[[7776,5606],[22,48]],[[7798,5654],[23,45]],[[7982,5606],[-18,9]],[[7964,5615],[-59,30],[-15,9]],[[7908,5689],[16,-8],[7,-3],[70,-36]],[[8001,5642],[-11,-21],[-8,-15]],[[7942,5529],[-10,-18]],[[7932,5511],[-9,4],[-3,2],[-54,27],[-2,1],[-9,5],[-10,-19],[-9,-19]],[[7836,5512],[-8,5],[-3,1],[-6,3]],[[7819,5521],[1,5],[7,15],[7,14],[5,3]],[[7964,5615],[-9,-19],[-9,-18],[-2,-3],[-10,-18],[-9,-18],[5,-3],[12,-7]],[[7922,5492],[-10,-19]],[[7912,5473],[-9,5],[-2,1],[-55,28],[-2,1],[-8,4]],[[7932,5511],[-10,-19]],[[7902,5454],[-9,-18]],[[7893,5436],[-10,5],[-2,1],[-25,13],[-29,15],[-2,1],[-9,5]],[[7816,5476],[10,18],[8,-4],[3,-2],[54,-28],[2,-1],[9,-5]],[[7883,5417],[-10,-19]],[[7873,5398],[-9,5],[-3,1],[-54,28],[-2,1],[-9,4]],[[7796,5437],[10,18],[0,1],[10,20]],[[7893,5436],[-10,-19]],[[7779,5446],[-62,45]],[[7717,5491],[3,6],[16,29],[1,2],[18,38],[10,21],[5,9]],[[7770,5596],[6,10]],[[7819,5521],[-10,-19],[-10,-18],[-10,-19],[-10,-19]],[[7796,5437],[-9,-17],[-11,-20]],[[7776,5400],[-23,11],[-2,1],[-2,2],[-11,7],[-42,31],[-2,-3],[-10,-18],[-9,-17],[-10,-16],[-9,-17]],[[7656,5381],[-49,36]],[[7607,5417],[9,17],[9,17],[2,4],[7,13]],[[7634,5468],[9,18],[2,3],[9,17],[8,15],[4,7]],[[7666,5528],[51,-37]],[[7779,5446],[6,-3],[3,-1],[8,-5]],[[7751,5351],[-13,-25]],[[7738,5326],[-10,5],[-1,1],[-14,8]],[[7713,5340],[-57,41]],[[7776,5400],[-1,-4],[-12,-23]],[[7763,5373],[-12,-22]],[[7685,5288],[-57,42]],[[7628,5330],[10,17],[9,17],[9,17]],[[7713,5340],[-10,-18],[-9,-17],[-5,-9],[-4,-8]],[[7702,5259],[-26,12]],[[7676,5271],[9,17]],[[7738,5326],[-12,-22],[-12,-24],[-12,-21]],[[7656,5236],[-56,41]],[[7600,5277],[9,18],[10,17],[9,18]],[[7676,5271],[-10,-18],[-10,-17]],[[7666,5190],[-8,4],[-4,3],[-14,7]],[[7640,5204],[7,14],[5,9],[4,9]],[[7702,5259],[-12,-23]],[[7690,5236],[-12,-23],[-12,-23]],[[7640,5204],[-2,-3]],[[7638,5201],[-57,42]],[[7581,5243],[9,17],[10,17]],[[7666,5190],[-10,-20],[-13,-22]],[[7643,5148],[-26,13],[-3,2],[-37,19],[-21,14]],[[7556,5196],[7,12],[9,17]],[[7572,5225],[42,-30],[14,-12],[10,18]],[[6885,1991],[-44,28]],[[6841,2019],[11,23],[7,13],[4,8]],[[6744,1989],[11,23],[11,24]],[[6766,2036],[63,-40],[12,23]],[[6766,2036],[11,24]],[[6777,2060],[11,24]],[[6788,2084],[11,20],[10,19],[9,19]],[[6788,2084],[-58,36]],[[6812,1716],[6,4],[10,4],[10,5],[-58,38],[-8,-8],[-7,-5],[-8,-7],[-8,-6]],[[7126,2087],[1,-1],[5,-4],[22,19]],[[7154,2101],[22,-16],[32,-24],[16,16],[7,7],[18,7],[19,5],[18,9],[4,5],[17,15]],[[7307,2125],[17,13],[22,10],[23,11]],[[7369,2159],[17,14],[29,34]],[[7415,2207],[19,13]],[[7434,2220],[5,5],[13,10],[4,5],[3,-3],[2,-1],[6,-7],[5,-6],[1,-1]],[[7473,2222],[-2,-3],[-3,-4],[-24,-26],[-71,-63],[-49,-40],[-52,-38],[-25,-18],[-1,0],[-49,-32],[-50,-31],[-48,-38],[-139,-160],[-7,-11],[-10,-15],[-37,-56],[-8,-10],[-10,-10],[-45,-39],[-4,-1],[-2,0],[-2,1],[-2,0],[-3,2]],[[7404,1647],[-9,-17],[-28,-56],[-10,-21],[-4,-10],[-5,-9],[-10,-13],[-6,-8],[-3,-3],[-8,-10],[-36,-48]],[[7285,1452],[-2,-2],[-39,-51],[-5,-7]],[[7239,1392],[-16,-18],[-38,-37],[-32,-30],[-8,-7]],[[7145,1300],[-24,-23],[-1,0],[-24,-23],[-9,-9],[-8,-9]],[[6829,1427],[24,16],[23,15],[21,17],[19,16],[26,25],[19,27],[16,28],[16,29],[31,37],[3,4],[3,4],[10,11],[25,29],[31,35],[25,20],[37,28],[91,67],[2,1]],[[7251,1836],[1,0],[2,-1],[4,-2],[119,-93],[5,-5],[4,-9],[16,-77],[2,-2]],[[7143,1118],[-18,4],[15,36],[-15,12],[-15,12],[1,3]],[[7145,1300],[10,-7],[49,-35]],[[7204,1258],[-25,-53],[-7,-18],[-7,-16]],[[5655,1209],[-29,15],[-2,21],[-22,-1],[3,-37]],[[5605,1207],[-24,13]],[[5581,1220],[-25,15]],[[5556,1235],[-1,6],[6,1],[11,1],[-6,77]],[[5566,1320],[19,0],[20,0],[4,0],[37,-1],[23,-1],[3,0]],[[5672,1318],[2,-20],[4,-44],[0,-7]],[[5678,1247],[-3,0],[-24,-1],[4,-37]],[[5556,1235],[-5,2],[-2,4],[-26,12]],[[5523,1253],[-1,10],[0,18],[4,19],[1,19]],[[5527,1319],[20,1],[19,0]],[[5487,1147],[-10,125]],[[5477,1272],[24,-9],[22,-10]],[[5556,1235],[1,-15],[4,-35],[-2,-14],[1,-14],[-34,-4]],[[5526,1153],[-14,-2],[-25,-4]],[[5584,1066],[-25,15],[-8,5],[-11,6],[-9,4],[-2,26],[0,6],[-3,25]],[[5581,1220],[5,-60],[5,-58]],[[5591,1102],[1,-16],[-8,-20]],[[5605,1207],[26,-15],[21,-11]],[[5652,1181],[3,-3]],[[5655,1178],[4,-58],[-22,-2],[4,-47],[-26,16],[-24,15]],[[5655,1209],[1,-18],[-4,-10]],[[5685,1161],[-3,1],[-7,3],[-8,6],[-12,7]],[[5678,1247],[2,-28],[4,-46],[1,-12]],[[5699,1041],[-16,3],[-5,-2],[-12,-9],[-7,-3],[-6,0],[-8,1],[-10,5],[-14,7],[-13,8],[-24,15]],[[5685,1161],[48,-25],[20,-8],[25,-8],[15,-3]],[[6161,5074],[-4,2],[-53,24],[-13,-21],[-35,17],[1,-5],[0,-4],[0,-2],[-1,-6],[-2,-9]],[[6054,5070],[-4,-14],[-14,-24]],[[6036,5032],[-25,-47],[-6,0],[-7,-18]],[[5998,4967],[-12,5],[-2,2]],[[5984,4974],[9,16],[8,18],[4,5],[4,4],[8,14],[2,7],[2,1],[7,11],[6,13],[8,16],[2,7],[1,8],[1,9],[0,25],[0,4],[2,16],[13,44],[7,15],[11,19]],[[6079,5226],[4,0],[7,-3],[70,-34]],[[6160,5189],[10,-5],[8,-4],[5,-2]],[[6183,5178],[-3,-5],[0,-3],[-1,-3],[0,-18],[0,-14],[-1,-11],[-2,-5],[-15,-45]],[[6267,4964],[-14,7],[-48,23]],[[6205,4994],[10,26],[4,13],[4,12],[-62,29]],[[6183,5178],[11,-6],[64,-31]],[[6258,5141],[61,-29]],[[6185,4939],[-58,30]],[[6127,4969],[9,30],[8,25]],[[6144,5024],[4,13],[4,13],[5,13],[4,11]],[[6205,4994],[-8,-23],[-2,-4],[-10,-28]],[[6226,4852],[-15,7],[-47,24]],[[6164,4883],[7,17],[4,11],[1,3],[4,12],[5,13]],[[6164,4883],[-14,7]],[[6150,4890],[-43,22]],[[6107,4912],[6,17],[4,11],[1,4],[4,11],[5,14]],[[6150,4890],[-11,-29]],[[6139,4861],[-43,21]],[[6096,4882],[5,14],[6,16]],[[6207,4802],[-61,30]],[[6146,4832],[8,22],[-15,7]],[[6115,4746],[-58,30]],[[6057,4776],[8,21]],[[6065,4797],[8,22],[8,21]],[[6081,4840],[7,21],[8,21]],[[6146,4832],[-8,-21],[-7,-21],[-8,-23],[-8,-21]],[[6175,4715],[-60,31]],[[6154,4658],[-61,31]],[[6093,4689],[7,19],[8,19],[7,19]],[[6132,4601],[-16,8],[-38,20],[-6,3]],[[6072,4632],[7,19]],[[6079,4651],[7,19],[7,19]],[[6120,4569],[-75,21],[17,47],[10,-5]],[[6113,4545],[0,1],[-130,33]],[[5983,4579],[2,5]],[[5985,4584],[11,29],[3,8],[5,16],[16,44]],[[6020,4681],[59,-30]],[[6020,4681],[8,19],[7,19]],[[6035,4719],[8,18],[7,20],[7,19]],[[6004,4476],[-21,10]],[[5983,4486],[-25,13],[-4,3]],[[5954,4502],[27,73],[2,4]],[[5954,4502],[-4,1],[-6,3]],[[5944,4506],[7,17],[-69,35],[-48,25]],[[5834,4583],[5,13],[5,13],[-1,7]],[[5843,4616],[1,0],[31,-8]],[[5875,4608],[104,-27],[2,4],[4,-1]],[[5954,4502],[-21,-54]],[[5933,4448],[-4,2],[-4,4],[-3,2],[-18,10],[0,3],[-16,7],[-15,8],[-15,9],[11,30],[7,18],[68,-35]],[[5933,4448],[-19,-48],[-6,-18]],[[5841,4433],[-3,2],[-64,48],[-26,20]],[[5748,4503],[6,9],[14,36],[7,20],[8,20],[6,18]],[[5789,4606],[45,-23]],[[6029,4373],[-4,-2],[-26,-9],[-9,-2],[-15,-2],[-9,1],[-7,0],[-6,0],[-11,2],[-9,4],[-13,5],[-13,8]],[[5983,4486],[-11,-29],[-11,-24],[19,-12]],[[5710,4453],[35,46],[3,4]],[[7848,608],[-11,0],[-8,4],[-5,6],[-17,28],[-10,13],[-6,19],[-1,22],[5,9],[5,6],[7,5],[10,9],[5,4],[8,7],[13,2],[11,-1],[15,-4],[5,-1],[17,1],[18,2],[20,5],[25,8],[16,7],[7,3],[12,4],[23,13],[11,5],[9,4],[9,3],[18,7],[10,-3],[4,0],[31,-10],[8,-1],[2,-12],[0,-8],[-4,-12],[0,-5],[-4,-17],[-4,-7],[-10,-9],[-10,-10],[-10,-12],[-7,-9],[-8,-11],[-12,-12],[-4,-2],[-9,-2],[-15,-8],[-28,-13],[-23,-3],[-25,-8],[-11,-2],[-14,-1],[-10,-4],[-19,-1],[-10,-1],[-29,-7]],[[7669,768],[-1,7]],[[7668,775],[4,5],[8,6],[3,7],[1,9],[-1,7],[-4,5],[-5,4],[-5,7],[-5,4],[-3,3],[-3,5],[-14,9],[-3,1],[-3,-2],[-1,-4],[-1,-2]],[[7636,839],[-12,10],[-6,1],[-4,1],[-2,1]],[[7612,852],[-65,17]],[[7547,869],[4,22],[4,21]],[[7555,912],[4,22],[4,20],[5,20]],[[7568,974],[65,-17]],[[7633,957],[51,-13]],[[7684,944],[38,12],[15,15]],[[7737,971],[-27,-27],[-9,-8],[-10,-10],[-7,-10],[-2,-7],[-1,-13],[1,-5],[4,-2],[4,0],[13,-4],[10,-6],[4,-6],[6,-13],[3,-3],[5,0],[8,4],[3,5],[11,13],[5,6],[2,0],[-1,-2],[-18,-25],[-10,-14],[0,-11],[-8,-4],[-4,-4],[-13,-20],[-3,-7],[-6,-9],[-6,-2],[-13,-11],[-9,-8]],[[7915,744],[-7,0],[-7,3],[-11,2],[-23,7],[-12,2],[-16,1],[-1,2],[4,3],[8,3],[21,11],[9,8],[32,20],[11,4],[6,2],[42,21],[13,6],[8,1],[12,-1],[18,-3],[27,-9],[13,-3],[27,-14],[6,-5],[0,-3],[-7,0],[-9,2],[-12,1],[-8,0],[-12,-2],[-12,-3],[-11,-5],[-18,-5],[-14,-5],[-13,-3],[-11,-4],[-18,-8],[-21,-6],[-9,-5],[-7,-1],[-2,-2],[2,-2],[5,-2],[2,-5],[-1,-2],[-4,-1]],[[7608,830],[-2,0],[-7,1],[-50,3],[-11,1]],[[7538,835],[4,14],[5,20]],[[7612,852],[-1,-7],[0,-4],[2,2],[-1,-4],[-4,-9]],[[7522,803],[4,8]],[[7526,811],[9,20],[1,2],[2,2]],[[7608,830],[-1,-3],[-9,-24],[-2,-4],[-3,-10],[-4,-11],[-9,-17],[-13,-13],[-14,-11],[-6,-5],[-11,20],[18,15],[11,11],[3,8],[-12,6],[-12,4],[-22,7]],[[7636,839],[-4,-4],[-3,-5],[-13,-27],[-34,-61],[-2,-3],[-7,-9],[-7,-12],[-13,-14],[-25,-35],[-11,-20],[-21,-30],[-15,-22],[-15,-18],[-9,-9],[-13,-11],[-19,-14],[-3,-2],[-14,-6],[-12,-4],[-12,-7],[-3,-2]],[[7381,524],[-1,6]],[[7380,530],[31,10],[49,37],[51,77],[5,9],[-22,13],[-25,15]],[[7469,691],[10,19],[15,32],[10,23]],[[7504,765],[8,17],[10,21]],[[7715,417],[-8,-8],[-9,-8],[-6,-7],[-18,-14],[-10,-4],[-19,1],[-8,2],[-11,10],[-10,12],[-4,9],[8,14],[9,6],[7,3],[3,2],[5,-1],[6,-2],[7,-4],[3,-1],[20,-3],[18,-2],[18,-2],[-1,-3]],[[7669,768],[-5,-5],[-8,-14],[-28,-30],[-11,-14],[-8,-12],[-6,-7],[-1,-1],[-1,0],[0,4],[6,11],[10,14],[22,26],[5,8],[15,15],[6,8],[3,4]],[[7380,530],[-9,14],[-9,19],[-16,35]],[[7346,598],[19,7],[18,8],[5,1],[14,6],[17,9],[2,1],[11,8],[2,2],[9,9],[4,4]],[[7447,653],[7,8],[7,12],[8,18]],[[7346,598],[-10,25]],[[7336,623],[67,28],[11,23]],[[7414,674],[16,-9],[17,-12]],[[7336,623],[-9,20],[-9,21]],[[7318,664],[17,6],[17,8]],[[7352,678],[25,9],[4,9]],[[7381,696],[17,-11],[16,-11]],[[7633,957],[4,21],[5,21]],[[7642,999],[74,-20]],[[7716,979],[-17,-17],[-15,-18]],[[7568,974],[3,22],[4,21]],[[7575,1017],[67,-18]],[[7630,1111],[-4,-21],[32,-7],[-8,-42]],[[7650,1041],[-4,-21],[-4,-21]],[[7575,1017],[5,21]],[[7580,1038],[3,20],[0,9],[-5,15],[-12,24],[-7,15],[0,9]],[[7559,1130],[71,-19]],[[7451,1007],[-13,5]],[[7438,1012],[39,41],[24,26],[10,12],[14,22],[28,52],[1,1]],[[7554,1166],[12,-2]],[[7566,1164],[-6,-11],[-3,-8],[2,-15]],[[7580,1038],[-66,18],[-5,-21],[-25,7],[-17,-18],[-16,-17]],[[7501,993],[-50,14]],[[7568,974],[-67,19]],[[6314,834],[-39,-1],[-2,-11],[-18,7],[-10,7],[-22,32],[-9,9]],[[6214,877],[0,47],[0,4],[17,0],[0,-34],[8,-8],[10,-13],[-1,55],[18,1],[0,9]],[[6266,938],[46,1]],[[6312,939],[1,-27],[1,-78]],[[6375,732],[-5,-17]],[[6370,715],[-11,11],[-5,9],[-14,17],[-2,4],[-17,17],[-3,3],[-35,24],[-8,11],[-1,1],[-10,4],[-5,0],[-8,5],[-3,4],[-11,14],[-2,3],[-7,7],[-17,18]],[[6211,867],[0,12]],[[6211,879],[3,-2]],[[6314,834],[20,0],[19,1]],[[6353,835],[20,0],[1,-80],[-5,-16],[3,-4],[3,-3]],[[6533,876],[-2,-8],[24,-6]],[[6555,862],[-22,-78],[-1,-6],[-4,-13]],[[6528,765],[-9,2],[-4,1],[-9,3],[-2,0],[-6,2],[-21,6]],[[6477,779],[-22,8],[-10,6],[-18,7],[-14,-46],[-14,-47],[-10,12],[-3,4],[-3,3],[-8,6]],[[6375,732],[1,6],[13,54],[1,3],[6,24],[3,17],[3,23],[1,5]],[[6403,864],[2,3],[1,2],[2,2],[2,4],[2,3],[1,2],[7,6],[12,5],[11,0],[17,-5],[5,-1],[19,-6],[45,-11],[2,8]],[[6531,876],[2,0]],[[6488,656],[-1,-2],[0,-4],[-1,-3],[-2,-6],[-2,-7],[-2,-5]],[[6480,629],[-3,-9]],[[6477,620],[-7,4],[-7,6],[-3,2],[-13,11],[-21,20],[-5,6],[-4,5],[-11,12],[-18,15],[-8,4],[-10,10]],[[6477,779],[-16,-53],[-5,-19],[-1,-7],[-5,-20],[17,-10],[7,-5],[1,-1],[13,-8]],[[6606,724],[-21,8],[-20,-74]],[[6565,658],[-51,33],[-6,4],[-1,-7],[-5,-16],[-6,-22],[-8,6]],[[6528,765],[6,-2],[11,-6],[13,-7],[32,-16],[3,-1],[14,-5],[-1,-4]],[[6565,658],[-7,-22],[-6,-22],[-7,-24],[-19,14],[-16,9],[-21,12],[-9,4]],[[6903,754],[18,-4],[17,-5],[19,-3]],[[6957,742],[-18,-64]],[[6939,678],[-9,-4],[-11,3],[-16,7],[-18,7],[18,63]],[[6940,607],[-2,4],[-2,-2],[-1,-1],[-3,-2],[-3,-1],[-4,0],[-3,1],[-4,1]],[[6918,607],[1,3],[6,21],[6,20]],[[6931,651],[6,20],[2,7]],[[6957,742],[18,-5],[20,-4],[20,1],[15,6],[7,4],[7,7],[7,11],[2,2]],[[7053,764],[4,-5],[4,-5],[3,-5],[14,-38],[1,-7],[1,-4],[3,-7]],[[7083,693],[-15,-8],[-37,-15],[-33,-16],[-18,-13],[-24,-20],[-16,-14]],[[7098,603],[-7,-20],[-14,-7],[-13,-4],[-7,-4]],[[7057,568],[-7,-2]],[[7050,566],[-16,44],[-8,19],[-30,-15],[-6,-3],[-15,-17],[1,-48]],[[6976,546],[-1,-59],[-1,-44],[-15,5],[-12,3],[-3,1],[-2,0],[-22,2],[-13,-2],[-5,0]],[[6902,452],[11,50],[12,46],[15,34],[18,25],[25,20],[29,21],[38,15],[33,14],[5,2]],[[7088,679],[3,-6],[2,-7],[2,-4],[2,-3],[3,-3],[2,-2],[14,-11],[-7,-13],[-7,-16],[-4,-11]],[[6993,546],[-17,0]],[[7050,566],[-20,-7],[-18,-7],[-19,-6]],[[7057,568],[-4,-31],[-1,-22],[-1,-4],[0,-23]],[[7051,488],[-22,0],[-21,0],[-15,58]],[[7098,603],[18,-8],[6,-14],[17,-45],[9,-20]],[[7148,516],[-15,-7],[-33,-13],[-9,-4]],[[7091,492],[-14,-3],[-26,-1]],[[7148,516],[15,-35],[8,-23]],[[7171,458],[-20,-8],[-37,-11],[-13,-3],[-8,22],[-2,34]],[[7194,535],[18,-43],[18,2]],[[7230,494],[19,1],[20,-1]],[[7269,494],[-4,-23],[-19,1],[-24,-4],[-29,-2],[-22,-8]],[[7148,516],[19,8],[9,4]],[[7176,528],[18,7]],[[7194,535],[17,8],[-19,44],[0,7],[2,8],[17,19],[13,10],[12,-14],[8,-15],[9,-20],[7,-19]],[[7260,563],[-16,-7],[8,-18]],[[7252,538],[-17,-7],[-17,-7],[12,-30]],[[7252,538],[16,6],[16,7],[21,-49]],[[7305,502],[-7,-7],[-9,-3],[-8,-1],[-12,3]],[[7260,563],[33,13]],[[7293,576],[26,-62],[-14,-12]],[[7175,450],[-4,8]],[[7293,576],[53,22]],[[7381,524],[-20,-14],[-8,-7],[-12,-8],[-18,-15],[-10,-6],[-12,-11],[-6,-4],[-4,-1],[-3,0],[-3,2],[-12,0],[-26,-4],[-16,-4],[-18,0],[-22,1],[-3,0],[-13,-3]],[[7175,450],[-16,-4],[-18,-6],[-10,-4],[-10,-7],[-8,-5],[-22,-3],[-11,1],[-5,3],[-8,3],[-21,2],[-35,0],[-26,-1],[-26,0],[-13,-2],[-8,1],[-1,-5],[-2,-2],[-7,-6],[-3,0],[-16,4],[-11,-2],[-4,1],[8,34]],[[6886,453],[-7,-32],[-23,4]],[[6856,425],[16,35]],[[6872,460],[3,-4],[4,-2],[3,-1],[4,0]],[[7464,1065],[-2,2],[-3,4],[-2,4],[-3,2],[-5,5],[-4,2],[-9,5]],[[7436,1089],[-9,3],[-16,5],[-78,21]],[[7333,1118],[-56,17]],[[7277,1135],[13,65]],[[7290,1200],[56,-15],[4,22]],[[7350,1207],[2,-1],[2,-1],[70,-17],[2,-2],[-1,-3],[-3,-17],[10,-3],[7,-3],[5,-2],[9,-4],[37,-9],[11,21],[2,3]],[[7503,1169],[17,1],[11,4],[4,-1]],[[7535,1173],[2,-1]],[[7537,1172],[-2,-3],[-24,-46],[-16,-23],[-10,-11],[-20,-24],[-1,0]],[[7350,1207],[4,12]],[[7354,1219],[95,-32],[54,-18]],[[7290,1200],[5,22],[2,12]],[[7297,1234],[57,-15]],[[7399,1492],[20,35],[6,30]],[[7481,1573],[2,-10],[7,-32],[0,-2],[8,-40],[-2,-11]],[[7496,1478],[-21,5],[-21,6],[-21,5],[-10,0],[-6,0],[-8,-1],[-10,-1]],[[7518,1584],[3,-10],[0,-2],[7,-35],[8,-37],[3,-11]],[[7539,1489],[2,-10],[-2,-12]],[[7539,1467],[-21,5],[-22,6]],[[7554,1595],[3,-12],[15,-72],[3,-12]],[[7575,1499],[-18,-5],[-18,-5]],[[7637,1518],[-27,-8]],[[7610,1510],[-19,-6],[-16,-5]],[[7610,1510],[3,-12],[9,-41],[-2,-11]],[[7620,1446],[-21,6],[-19,5],[-20,5],[-21,5]],[[7679,1530],[2,-10],[11,-48],[2,-2]],[[7694,1470],[-9,-16],[-5,-9]],[[7680,1445],[-2,-3],[-5,-9]],[[7673,1433],[-3,1],[-20,4],[-30,8]],[[7740,1546],[-18,-29],[-18,-30],[-10,-17]],[[7675,1631],[3,-10],[17,-75],[2,-10],[9,3],[9,3],[23,6],[2,-2]],[[7983,2761],[-12,16],[-9,10],[-7,7]],[[7955,2794],[26,32],[-7,8],[25,25]],[[7999,2859],[7,-8],[5,-5],[3,-3],[10,-12],[13,-17]],[[8037,2814],[-28,-27],[0,-1],[-26,-25]],[[7932,2709],[-8,21],[-4,11]],[[7920,2741],[8,11],[3,6],[24,36]],[[7983,2761],[-26,-27],[-10,-10],[-15,-15]],[[7949,2664],[-8,20],[-9,25]],[[7983,2761],[15,-20],[12,-15]],[[8010,2726],[-28,-29],[-33,-33]],[[8041,2683],[-25,-24]],[[8016,2659],[-7,10],[-23,-23],[-22,-22]],[[7964,2624],[-8,21]],[[7956,2645],[-7,19]],[[8010,2726],[10,-15],[2,-1],[11,-16],[8,-11]],[[8022,2541],[-5,7],[-6,8]],[[8011,2556],[-8,11],[-19,25],[-5,6],[-3,4],[0,4],[-12,18]],[[8016,2659],[7,-9],[11,-14],[4,-5],[12,-16],[12,-16],[1,-1]],[[8063,2598],[-13,-17],[-27,-38],[-1,-2]],[[8041,2683],[6,-9],[26,26],[13,11],[16,16]],[[8102,2727],[11,-16],[1,-3],[19,-15]],[[8133,2693],[-5,-7],[-19,-25],[-14,-20],[-7,-8],[-22,-32],[-3,-3]],[[8010,2726],[26,25],[27,28]],[[8063,2779],[11,-15],[12,-16]],[[8086,2748],[16,-21]],[[8037,2814],[9,-11],[6,-9]],[[8052,2794],[11,-15]],[[8052,2794],[17,18],[7,11]],[[8076,2823],[14,-12],[15,-12],[16,-12],[-8,-12],[-27,-27]],[[8285,2852],[-5,-5],[-3,5],[-10,-4],[6,-8],[-17,-17],[-6,9],[-7,-8],[3,-5],[-11,-6],[-9,-3],[-14,-3],[-11,-3],[-6,0],[-1,-3],[27,6],[6,0],[17,4],[-1,-3],[-10,-10],[-37,-37],[-2,-2],[-7,-3],[-9,-8],[-19,-22],[-6,-8],[-7,-9],[-5,-4],[0,-3],[-8,-9]],[[8076,2823],[13,22],[13,23],[27,48]],[[8129,2916],[23,-18],[12,-11],[14,29]],[[8178,2916],[16,-12],[24,-20],[36,-17],[31,-15]],[[8179,2575],[-13,18],[-1,1],[-14,19],[-50,-51]],[[8101,2562],[-13,12],[-8,7],[-12,12]],[[8068,2593],[5,7],[6,6],[6,7],[16,17],[5,2],[6,8],[15,20],[3,6],[5,4],[8,10],[9,11],[15,19],[33,35],[1,5],[2,2]],[[8223,2723],[-35,-36],[16,-20],[14,-19],[14,-19]],[[8232,2629],[-27,-27],[-26,-27]],[[8280,2678],[-18,-18],[-14,-14],[-16,-17]],[[8260,2542],[-5,11],[-10,19]],[[8245,2572],[14,21],[-12,16],[-15,20]],[[8245,2572],[-9,-11],[-27,-26],[-15,20],[-15,20]],[[8260,2542],[-31,-36],[-19,-19],[-13,-13]],[[8197,2474],[-3,3],[-3,1],[-10,10],[-15,14],[-13,12],[-19,17]],[[8134,2531],[45,44]],[[8272,2517],[-41,-74]],[[8231,2443],[-13,12],[-16,14],[-1,2],[-4,3]],[[8290,2482],[-33,-64]],[[8257,2418],[-14,13]],[[8243,2431],[-12,12]],[[8280,2365],[-21,12],[8,17],[5,11],[-15,13]],[[8271,2345],[-20,14],[-18,12],[-9,5],[-8,6],[6,11],[3,6],[13,22],[5,10]],[[8262,2326],[-20,13]],[[8242,2339],[-17,10],[-20,11],[-15,9],[-15,8],[-33,19],[-1,0],[-9,1],[-12,3]],[[8120,2400],[1,10],[0,4],[0,2],[0,5],[0,10],[0,6]],[[8121,2437],[22,6],[16,8],[16,9],[14,8],[7,5],[1,1]],[[6637,501],[-2,-12]],[[6635,489],[-23,26],[-11,12],[-16,12],[-16,19],[-5,7],[-31,25],[-18,9],[-10,3],[-15,10],[-13,8]],[[6565,658],[3,-67],[44,-43],[2,-22],[23,-25]],[[6565,658],[17,-7],[-6,-21]],[[6576,630],[-3,-14],[1,-7],[34,-36],[4,-5],[6,-4],[6,-3],[27,-10]],[[6651,551],[-8,-28]],[[6643,523],[-6,-22]],[[6576,630],[10,-6],[30,-30]],[[6616,594],[10,-11],[12,-5],[10,37]],[[6648,615],[19,-7]],[[6667,608],[-9,-31],[-7,-26]],[[6616,594],[10,13],[1,5],[-17,16],[-2,4],[0,3],[3,14],[5,21],[-16,7],[5,20]],[[6605,697],[60,-22],[-6,-20],[-11,-40]],[[6606,724],[5,-2],[-6,-25]],[[6691,692],[-9,-33]],[[6682,659],[-15,-51]],[[6555,862],[95,-24]],[[6650,838],[78,-17]],[[6728,821],[-27,-94],[-9,-31],[-1,-4]],[[6682,659],[18,-8],[17,-6]],[[6717,645],[-13,-48],[-3,-2],[-16,5],[-18,8]],[[6822,642],[-10,-33]],[[6812,609],[-42,16]],[[6770,625],[-17,6],[-17,7]],[[6736,638],[-16,6],[-3,1]],[[6691,692],[23,-9],[27,-10],[33,-13],[48,-18]],[[6770,625],[-13,-47],[-2,-3],[-4,0],[-13,5],[-16,6],[0,6],[14,46]],[[6812,609],[-15,-52]],[[6797,557],[-10,-33],[-11,-37]],[[6776,487],[-20,2],[-5,1],[-20,3],[-18,4],[-16,5],[-36,14],[-18,7]],[[6834,517],[2,-23],[-18,-3],[4,-33]],[[6822,458],[-26,-6],[-8,0],[-9,-1],[-13,2],[10,34]],[[6797,557],[20,-8],[9,-3],[4,0],[4,-29]],[[6856,425],[-81,14],[-9,-1],[-14,1],[-15,4],[-11,2],[-13,2],[-3,2],[-16,5],[-16,7],[-9,2],[-21,12],[-6,6],[-7,8]],[[6822,458],[31,5],[10,0],[5,-2],[4,-1]],[[6834,517],[11,2],[5,4],[2,4],[6,21]],[[6858,548],[19,-7],[-13,-45],[5,-1],[4,-1],[5,-1],[4,-2],[-10,-31]],[[6822,642],[52,-19]],[[6874,623],[-6,-24],[-2,-24],[-8,-27]],[[6874,623],[29,-11],[15,-5]],[[6940,607],[-4,-4],[-11,-19],[-17,-46],[-12,-43],[-10,-42]],[[6822,642],[1,4],[9,31],[28,-10],[3,11]],[[6863,678],[9,-4],[8,-3],[51,-20]],[[6863,678],[22,80],[18,-4]],[[7573,1803],[-22,96]],[[7592,1912],[3,-11],[4,-18],[1,-5]],[[7600,1878],[2,-11],[9,-40],[3,-11]],[[7668,1904],[-1,-20]],[[7667,1884],[-1,-21]],[[7666,1863],[-9,1],[-13,1],[-12,1],[-3,-1],[-6,-1],[-3,10],[-2,9],[-18,-5]],[[7666,1863],[-1,-20],[-1,-10],[0,-10]],[[7664,1823],[-22,1],[-10,-2],[-18,-6]],[[7664,1823],[17,-1],[29,-2],[-1,-20],[10,0],[23,-2],[10,0]],[[7714,1880],[-1,-21],[8,0],[25,-2],[9,-1]],[[7667,1884],[9,-1],[29,-2],[9,-1]],[[7714,1880],[1,21],[1,20],[1,21]],[[7530,1791],[-3,12],[-15,72],[-3,11]],[[7509,1886],[19,6],[23,7]],[[7497,1781],[-3,12],[-13,61],[-1,7],[0,2],[1,2]],[[7481,1865],[1,2],[1,11],[9,3],[17,5]],[[7457,1770],[-5,24],[-5,24],[-7,35],[11,3],[10,3],[20,6]],[[7251,1836],[25,14],[30,16],[35,19],[72,37],[123,85],[22,18],[3,3],[3,2],[1,1]],[[7176,528],[-9,21],[-1,5],[-8,17],[-1,5],[-8,18],[-3,8],[2,5],[15,17],[12,15],[17,17],[12,9],[15,9],[16,9],[-16,43],[14,16],[15,14]],[[7248,756],[34,-22],[5,-6],[7,-11],[24,-53]],[[7088,679],[20,8],[29,17],[38,29],[1,0],[47,51],[2,2]],[[7225,786],[0,-1],[5,-7],[5,-5],[13,-17]],[[7083,693],[36,18],[24,16]],[[7143,727],[-15,-12],[-45,-22]],[[7225,786],[37,40]],[[7262,826],[1,-1],[12,-9],[8,-6],[7,-4],[65,-42]],[[7355,764],[-6,-10],[-5,-8],[-2,-1],[-6,-6],[-8,-4],[12,-27],[12,-30]],[[7355,764],[33,-21],[11,-7]],[[7399,736],[-9,-20],[-9,-20]],[[7445,731],[-9,-19]],[[7436,712],[-37,24]],[[7355,764],[9,19],[17,-11],[15,-10],[10,19]],[[7406,781],[48,-30],[-9,-20]],[[7436,712],[13,-7],[20,-14]],[[7445,731],[18,-11],[25,55]],[[7488,775],[16,-10]],[[7406,781],[7,18]],[[7413,799],[49,-30],[9,17],[17,-11]],[[7413,799],[10,20]],[[7423,819],[23,-4],[36,-3],[23,-1],[-17,-36]],[[7423,819],[-17,9],[-17,11],[4,8],[5,9]],[[7398,856],[8,-4],[11,-6],[19,-7],[16,-4],[41,-2],[25,-1],[5,-2],[3,-3],[1,-2],[0,-2],[1,-2],[0,-3],[-1,-2],[-1,-5]],[[7398,856],[0,2],[1,1],[5,11],[7,16],[4,18]],[[7415,904],[66,-17]],[[7481,887],[66,-18]],[[7415,904],[4,21],[4,22],[5,21],[66,-18]],[[7494,950],[-4,-20]],[[7490,930],[-5,-22],[-4,-21]],[[7501,993],[-4,-21],[-3,-22]],[[7415,904],[-48,12],[-12,6],[-2,1]],[[7353,923],[14,13],[71,76]],[[7684,2843],[-14,-11],[-9,-7]],[[7661,2825],[-6,-2],[-11,-6],[-11,-9]],[[7633,2808],[-29,21],[-31,22],[-11,7],[-9,8]],[[7553,2866],[12,18],[19,-12],[4,-3],[21,3],[3,2],[2,4],[2,4],[4,5],[6,-1],[8,-6]],[[7634,2880],[50,-37]],[[7727,2937],[-5,-7],[-8,5],[-9,-1],[-11,-6],[-7,-9],[-6,-12],[-13,9],[-11,7],[-11,-22],[-12,-21]],[[7553,2866],[-4,2]],[[7579,2979],[13,-8],[9,14],[8,14]],[[7609,2999],[15,-8],[16,-8],[14,-7],[18,-10],[25,-13],[30,-16]],[[7745,2927],[-15,-22],[-16,-23],[-14,-20],[-16,-19]],[[7727,2937],[18,-10]],[[7866,3000],[-19,18]],[[7847,3018],[15,20],[8,11]],[[7870,3049],[12,-12],[3,-3],[3,-2]],[[7888,3032],[-8,-11],[-3,-5],[-4,-6],[-7,-10]],[[7891,2976],[-7,6],[-2,3],[-7,7],[-2,1],[-7,7]],[[7888,3032],[8,-9],[8,-7],[9,-10]],[[7913,3006],[-11,-15],[-11,-15]],[[7911,2957],[-20,19]],[[7913,3006],[10,-9],[2,-1],[7,-7]],[[7932,2989],[-1,-2],[-6,-10],[-8,-10],[-1,-1],[-4,-6],[-1,-3]],[[7952,2919],[-3,3],[-6,7],[-9,9],[-8,6],[-3,1],[-12,12]],[[7932,2989],[0,3],[7,8],[9,13],[6,10],[14,-14]],[[7968,3009],[-5,-7],[-2,-2],[-9,-13],[-6,-8],[-2,0],[-2,0],[4,-2],[24,-24],[1,-1],[1,-2]],[[7972,2950],[-1,-2],[-9,-15],[-10,-14]],[[7968,3009],[12,-11],[8,-7],[2,-2],[1,-1],[1,-2]],[[7992,2986],[-8,-16],[-12,-20]],[[8023,3038],[-16,-27],[-15,-25]],[[7913,3006],[24,34],[14,20],[14,20]],[[7965,3080],[11,-8],[5,-3],[23,-17],[4,-5],[7,-5],[5,-1],[3,-3]],[[7888,3032],[5,7],[10,13],[2,3],[0,1],[6,8]],[[7937,3101],[18,-14],[10,-7]],[[7847,3018],[-13,13]],[[7834,3031],[18,35],[20,37]],[[7894,3081],[-7,-9],[-17,-23]],[[7830,3205],[-10,-19],[-5,-11],[-4,-6],[-22,-45]],[[7789,3124],[-7,3],[-4,0],[-7,-2],[-5,-2],[-8,-6],[7,10],[4,6],[2,5],[33,70]],[[7804,3208],[3,-2],[6,11],[17,-12]],[[7804,3208],[4,17],[5,24],[2,7]],[[7815,3256],[32,71],[9,19],[12,23],[15,26]],[[7883,3395],[49,-39],[-2,-4],[-18,-22]],[[7912,3330],[-13,-21]],[[7899,3309],[-17,-24]],[[7882,3285],[-19,-27]],[[7863,3258],[-17,-27],[-16,-26]],[[7900,3152],[-29,22],[-6,5]],[[7865,3179],[-35,26]],[[7863,3258],[39,-30],[8,-7],[21,-16]],[[7931,3205],[-9,-16],[-8,-12],[-7,-12],[-7,-13]],[[7887,3131],[-25,-3],[-12,-2],[-13,-1]],[[7837,3125],[18,41],[2,0],[8,13]],[[7900,3152],[-13,-21]],[[8242,2339],[-19,-40]],[[8223,2299],[-17,10],[-11,7],[-36,24],[-2,0],[-4,-2],[-4,-1],[-7,-3],[-9,-5],[-2,-1]],[[8131,2328],[-10,27],[-3,8],[-1,3],[0,4],[2,21],[1,9]],[[8223,2299],[-11,-29]],[[8212,2270],[-4,1],[-31,2],[-9,-5],[-10,-4],[0,-2]],[[8158,2262],[-6,13],[0,1],[-14,34],[-4,10],[-2,5],[-1,3]],[[8203,2195],[-14,8],[-10,4]],[[8179,2207],[3,1],[17,29],[13,33]],[[8149,2209],[2,53],[7,0]],[[8179,2207],[-9,0],[-21,2]],[[8124,2160],[3,51]],[[8127,2211],[22,-2]],[[8191,2174],[-1,-4],[-1,-6],[0,-9]],[[8127,2211],[3,52],[-21,2]],[[8109,2265],[2,60],[0,2],[10,-1],[6,0],[2,1],[2,1]],[[8084,2214],[3,53]],[[8087,2267],[22,-2]],[[8127,2211],[-22,1],[-21,2]],[[8087,2267],[3,57],[0,5],[-7,9],[1,2],[-6,13],[-4,18],[-1,5],[-4,14],[3,3],[9,5],[9,0],[9,1],[21,1]],[[8103,2161],[-22,2]],[[8081,2163],[3,51]],[[6842,3392],[17,-12],[-33,-63],[-1,-4]],[[6825,3313],[-17,13]],[[6808,3326],[34,66]],[[6766,3248],[42,78]],[[6825,3313],[0,-4],[-41,-75]],[[6784,3234],[-18,14]],[[6752,3369],[17,-12]],[[6769,3357],[3,-3],[1,-2],[13,-10]],[[6786,3342],[2,-2],[2,-2],[1,0],[11,-8],[2,-2],[2,-2],[2,0]],[[6766,3248],[-19,13]],[[6747,3261],[-38,29],[-15,11]],[[6694,3301],[39,74],[16,-11],[2,3],[1,2]],[[6769,3357],[15,8],[39,73],[15,2]],[[6838,3440],[-52,-98]],[[6957,3427],[-9,-23],[-34,-65]],[[6914,3339],[-10,6],[-9,7]],[[6895,3352],[38,72],[6,16]],[[6957,3427],[21,-15],[4,0]],[[6982,3412],[-12,-22],[-12,-22],[-12,-22]],[[6946,3346],[-12,-23]],[[6934,3323],[-2,2],[-18,14]],[[6984,3317],[-38,29]],[[6982,3412],[21,1]],[[7003,3413],[-5,-16],[-11,-20],[21,-16],[-12,-22],[-12,-22]],[[6984,3317],[-11,-21]],[[6973,3296],[-17,13]],[[6956,3309],[-18,13],[-4,1]],[[6950,3253],[-15,11],[0,5],[19,37],[2,3]],[[6973,3296],[-1,-3],[-22,-40]],[[6973,3296],[21,-16]],[[6994,3280],[-1,-3],[-22,-40],[-21,16]],[[7010,3266],[-23,-42]],[[6987,3224],[-14,-24]],[[6973,3200],[-35,30]],[[6938,3230],[12,23]],[[6994,3280],[13,-9],[3,-5]],[[6938,3230],[-16,11]],[[6922,3241],[-18,13]],[[6904,3254],[5,13],[13,34],[12,22]],[[6904,3254],[-2,2],[-8,6],[-15,11]],[[6879,3273],[6,11],[29,55]],[[6861,3286],[1,3],[33,63]],[[6879,3273],[-15,11]],[[6864,3284],[-3,2]],[[6904,3254],[-41,-78]],[[6863,3176],[-3,2],[-8,6],[-10,7]],[[6842,3191],[-20,15]],[[6822,3206],[42,78]],[[6880,3163],[-17,13]],[[6922,3241],[-42,-78]],[[6973,3200],[-41,-76]],[[6932,3124],[-33,26]],[[6899,3150],[-19,13]],[[7003,3413],[17,1]],[[7020,3414],[20,-15],[4,-3],[26,-19]],[[7070,3377],[-25,-45],[-35,-66]],[[7145,3353],[-36,-67],[-37,-66]],[[7072,3220],[-13,10],[-49,36]],[[7070,3377],[14,24]],[[7125,3172],[-5,4],[-12,12],[-3,2]],[[7105,3190],[-15,15]],[[7090,3205],[38,68],[32,59]],[[7020,3414],[14,24],[16,30]],[[6939,3671],[-44,-81]],[[6895,3590],[-11,8],[-8,6],[-17,13],[-9,7],[-3,3]],[[6847,3627],[9,17],[21,39],[5,13],[2,2]],[[6884,3698],[2,-2],[9,-7],[2,-1],[2,-2],[6,-6],[11,-2],[23,-7]],[[6939,3671],[25,-7]],[[6964,3664],[-18,-6],[-9,-15],[-29,-51],[-13,-2]],[[6964,3664],[-7,-12],[-20,-37],[-24,-44]],[[6913,3571],[-7,11],[-11,8]],[[6964,3664],[10,-4],[12,-9]],[[6986,3651],[-7,-12],[-49,-92]],[[6964,3664],[9,17],[19,27],[15,27]],[[7007,3735],[12,21],[11,-7]],[[7030,3749],[6,-6],[-34,-64]],[[6939,3671],[17,30],[9,15],[10,13],[6,6],[4,5],[3,3],[4,1],[3,-1],[4,-2],[8,-6]],[[7035,3759],[-5,-10]],[[6884,3698],[19,32]],[[6903,3730],[13,-6],[20,-9],[7,-4],[14,24],[7,17],[19,31],[5,10]],[[6988,3793],[2,-2],[38,-26],[3,-2],[4,-4]],[[7070,3733],[-6,-11],[-2,2],[-5,-1],[-4,-3],[-4,-2],[-3,-4],[-3,-5],[-5,-9],[-3,-5],[-5,-8],[-3,-8],[0,-4]],[[7035,3759],[35,-26]],[[8081,2163],[-2,-35]],[[8079,2128],[-22,0],[-21,1],[-22,2],[3,44],[-41,3],[-4,-4],[-6,-7],[-20,2],[-4,-35],[-15,1]],[[7927,2135],[44,128],[29,53],[24,40],[-5,4],[-25,-41],[-28,-53],[-47,-130]],[[7919,2136],[-2,0],[0,-1],[-10,-38],[0,-1],[0,-2],[-1,-2],[0,-2],[0,-17],[0,-3],[0,-2],[-1,-3],[0,-4],[-1,-8],[-2,-19],[0,-2]],[[7902,2032],[-2,0],[-2,0],[-2,0],[-4,0],[-3,0],[-28,2],[-31,2]],[[7607,2083],[3,3],[4,3],[2,1],[2,2],[2,1],[4,3],[21,15],[20,14],[52,18],[5,1],[5,2],[44,32],[2,2],[2,0],[3,1],[4,3],[7,1],[7,3],[4,3],[5,4],[5,4],[9,7],[8,7],[6,6],[1,3],[-1,2],[1,3],[0,3],[5,4],[1,4],[3,2],[3,3],[2,3],[2,2],[13,18],[11,13],[2,3],[1,3],[2,1],[2,-2],[-1,-3],[2,-1],[2,1],[2,0],[16,25],[2,11],[5,10],[54,97],[5,8],[3,5],[0,3],[1,5],[3,5],[2,4],[2,3],[2,3],[1,2],[3,3],[3,1],[2,3],[19,27],[2,2],[20,28]],[[8031,2526],[7,-14],[3,-12],[9,-41],[6,-8]],[[8056,2451],[1,-11],[0,-2],[3,-13],[31,5],[30,7]],[[7613,2099],[-2,1],[-3,4]],[[7608,2104],[1,2],[27,24],[3,4],[1,2],[1,1],[1,5],[3,16],[2,10],[1,14],[1,4],[2,17],[2,10],[3,15]],[[7656,2228],[27,17],[15,10],[2,3],[6,10]],[[7706,2268],[17,-13]],[[7723,2255],[6,-5],[10,-8]],[[7739,2242],[11,-6],[1,-1],[1,-1],[1,-3],[13,-23],[6,-13]],[[7772,2195],[-3,-1],[-49,-33],[-3,-3],[-5,-4],[-27,-11],[-7,0],[-9,-3],[-18,-10],[-18,-12],[-17,-16],[-3,-3]],[[7790,2307],[-13,-23],[-8,7],[-23,-39],[-3,-6],[-3,-3],[-1,-1]],[[7723,2255],[6,10],[17,31],[18,31]],[[7764,2327],[9,-6],[9,-7],[8,-7]],[[7706,2268],[-4,2],[-6,5],[-2,2],[-6,5],[-9,7],[-9,6]],[[7670,2295],[24,41],[18,32],[17,-13],[9,-7],[9,-7]],[[7747,2341],[9,-7],[8,-7]],[[7794,2428],[-10,-18],[-5,-9],[-1,-1],[-4,-9]],[[7774,2391],[-10,-18],[-1,-3],[-4,-6],[-4,-8],[-8,-15]],[[7670,2295],[-7,4],[-5,3],[-11,8]],[[7647,2310],[-3,1],[-2,2]],[[7642,2313],[1,1],[45,42],[18,17]],[[7706,2373],[26,23],[5,4],[16,19],[18,21]],[[7771,2440],[5,-4],[10,-7],[8,-1]],[[7774,2391],[50,-38]],[[7824,2353],[13,-10],[-11,-18],[-13,10],[-5,-9],[-5,-8],[-8,-14],[-5,3]],[[7794,2428],[21,-17],[5,-3],[25,-19]],[[7845,2389],[-10,-18],[-6,-9],[-5,-9]],[[7845,2389],[20,-15],[8,-8],[20,-20],[6,-4]],[[7899,2342],[-2,-2],[-7,-11],[-1,-3],[-3,1],[-17,-31],[-19,-28],[-11,-12],[-32,-33],[-35,-27],[0,-1]],[[7845,2389],[11,18],[9,16],[-54,41],[4,8],[0,3],[5,9],[2,2],[4,9],[-17,12]],[[7809,2507],[12,19]],[[7821,2526],[18,-15],[9,8],[14,13],[4,3]],[[7866,2535],[9,-9],[-7,-11],[13,-18],[12,-12],[8,-2],[9,15]],[[7910,2498],[33,-26],[12,15],[11,16],[13,16]],[[7979,2519],[5,5],[3,4],[1,2],[8,10],[4,4],[11,12]],[[8022,2541],[-17,-23],[-4,-6],[-2,-2],[-8,-10],[-7,-10],[-8,-11],[-10,-19],[-2,-3],[-14,-24],[-32,-56],[-18,-32],[-1,-3]],[[7742,2464],[-14,13],[-14,14],[-9,9],[-20,19]],[[7685,2519],[6,8],[5,7]],[[7696,2534],[28,-27],[11,15],[11,15]],[[7746,2537],[17,24],[5,7]],[[7768,2568],[7,-6],[11,-8],[35,-28]],[[7809,2507],[-16,-13],[-13,-6],[-18,-11],[-20,-13]],[[7696,2534],[5,7],[3,5],[7,8],[6,7],[20,-16],[9,-8]],[[7685,2519],[-11,10]],[[7674,2529],[32,39],[43,49],[3,3],[2,2],[2,3],[7,8],[2,2],[2,2],[1,1],[25,27],[7,7],[11,-8],[5,-5],[4,-3]],[[7820,2656],[-11,-18],[-10,-18],[-5,-8],[-5,-9],[-10,-18],[-11,-17]],[[6826,3110],[-35,-67]],[[6791,3043],[-2,1],[-19,14]],[[6770,3058],[36,66]],[[6806,3124],[18,-13],[2,-1]],[[6770,3058],[-20,15],[-19,14]],[[6731,3087],[36,66]],[[6767,3153],[19,-14]],[[6786,3139],[20,-15]],[[6712,3101],[36,67]],[[6748,3168],[19,-15]],[[6731,3087],[-19,14]],[[6694,3114],[36,67]],[[6730,3181],[18,-13]],[[6712,3101],[-18,13]],[[6675,3128],[36,67]],[[6711,3195],[19,-14]],[[6694,3114],[-19,14]],[[6657,3142],[36,67]],[[6693,3209],[18,-14]],[[6675,3128],[-18,14]],[[6694,3301],[-8,-13],[-9,-8],[-23,-43]],[[6654,3237],[-34,-62],[19,-14],[-3,-4]],[[6636,3157],[-3,4],[-15,11],[-12,9],[-40,29],[-4,3]],[[6562,3213],[3,4],[0,1],[7,11],[5,5],[14,26],[19,36]],[[6676,3426],[1,-1],[2,-2],[3,-2],[11,-8],[9,-6],[18,-14]],[[6720,3393],[3,-2],[26,-20],[3,-2]],[[6747,3261],[-36,-66]],[[6693,3209],[-20,14],[-19,14]],[[6766,3248],[-36,-67]],[[6784,3234],[-36,-66]],[[6784,3234],[19,-14],[-36,-67]],[[6822,3206],[-36,-67]],[[6825,3313],[20,-15],[16,-12]],[[6842,3191],[-36,-67]],[[6863,3176],[-37,-66]],[[6844,3096],[-18,14]],[[6880,3163],[-36,-67]],[[6899,3150],[-36,-68]],[[6863,3082],[-19,14]],[[7981,3106],[-13,11],[-22,17],[-1,0],[-29,-19]],[[7931,3205],[3,5],[13,24],[15,25]],[[7962,3259],[14,23]],[[7976,3282],[14,24]],[[8063,3245],[-13,-23],[-14,-23],[-15,-25],[-13,-23],[-13,-21],[-14,-24]],[[7981,3106],[-16,-26]],[[8076,2997],[-2,2],[-3,2]],[[8071,3001],[-4,3],[-2,2],[-1,0],[-3,3],[-4,2],[-34,27]],[[8186,3142],[-4,-3],[-13,-17],[-1,-4],[-18,-22],[-11,-15]],[[8139,3081],[-19,-26],[-12,-16],[-2,-1],[-6,-10],[-6,-8],[-3,-4],[-15,-19]],[[8178,2916],[-11,10],[-45,34]],[[8122,2960],[15,26],[11,18],[11,19]],[[8159,3023],[21,-15],[17,-13],[-13,-24],[16,-12]],[[8200,2959],[-8,-16],[-14,-27]],[[8129,2916],[-23,16]],[[8106,2932],[16,28]],[[8037,2814],[17,25],[13,24],[13,22]],[[8080,2885],[8,16],[4,7],[14,24]],[[8080,2885],[-18,14],[-7,5],[-16,13],[-14,12],[15,20]],[[8040,2949],[13,-10],[4,-3],[18,-14],[5,10],[3,6],[5,9],[3,-3],[15,-12]],[[7053,2576],[-3,1],[-2,1],[-72,54],[-7,5]],[[6987,2670],[78,-58],[3,-3],[2,-2]],[[6987,2670],[1,2],[4,-1],[18,34],[13,8]],[[6942,2703],[2,3],[9,18],[6,13],[1,5]],[[6960,2742],[6,13]],[[1046,2541],[-5,-4],[-22,-21],[-5,-5],[-14,-15],[-2,-2],[-2,-2],[-2,-3],[-6,-6],[2,-10]],[[990,2473],[-17,21],[-4,1],[-2,0],[-13,-4],[-10,-5],[-3,-12],[-4,-2],[-7,10],[-1,13],[-8,10],[-4,6],[-2,1],[-2,0],[-3,1],[-9,-3],[-7,-1],[-10,-7],[0,-8],[-2,0],[-7,0],[-4,-7],[-1,-5],[-2,-7],[-5,-8],[-5,-11],[-9,2],[-7,4],[-9,3],[-7,5],[-9,0],[-18,-4],[-5,-2],[-3,-5],[-13,-5],[-4,-1],[-7,1],[-6,3],[-3,0],[-5,-2],[-4,1],[-13,-4],[-17,0],[-13,-6],[-3,-3],[-20,-6],[1,-4],[0,-2],[-12,2],[-7,-3],[-22,10],[-3,4],[-1,7],[1,5],[0,10],[15,41],[10,21],[5,7],[5,10],[7,9],[6,4],[9,5],[9,3],[2,-2],[4,-8],[3,1],[5,-2],[6,-5],[1,0],[4,4],[9,3],[5,5],[8,5],[3,5],[2,10],[3,20],[0,5],[-1,10],[-1,6],[-2,3],[-7,10],[-9,4],[-12,-5],[-9,-5],[0,-3],[-6,-1],[-5,1],[-4,8],[5,5],[4,8],[3,9],[0,10],[-5,16],[-1,4],[-10,11],[-10,1],[-5,-1],[-2,-1],[-3,-6],[-4,-17],[-2,-2],[-15,-6],[-5,1],[-3,4],[0,7],[3,5],[-1,8],[0,4],[2,5],[2,2],[6,3],[18,-3],[5,-1],[9,2],[6,1],[2,27],[2,10],[0,12],[-3,15],[1,11],[4,19],[9,21],[2,8],[3,4],[2,11],[0,25],[0,5],[5,18],[3,0],[12,20],[7,9],[7,5],[10,12],[6,5],[2,7],[4,7],[9,16],[3,1],[1,1],[1,-1],[1,-7],[2,-3],[5,1],[16,27],[3,8],[3,8],[2,12],[4,3],[2,2],[4,1],[3,0],[17,1],[4,1],[6,4],[4,4],[2,4],[3,3],[3,0],[1,-6],[2,-6],[3,-4],[5,-2],[14,0],[7,2],[2,2],[3,1],[15,5],[13,9],[5,2],[19,-4],[14,0],[8,2],[5,7],[9,16],[10,15],[16,36],[7,18],[6,16],[7,19],[10,17],[1,1],[7,15],[5,16],[7,15],[4,7],[3,3],[11,4],[14,5],[10,9],[12,6],[27,8],[10,11],[7,7],[4,0],[8,0],[6,-4],[12,-2],[5,0],[5,-6],[3,-1],[6,-1],[6,2],[16,12],[5,8],[9,21],[4,15],[3,19],[4,15],[1,7]],[[1274,3378],[9,-11],[23,-32],[4,-5]],[[1310,3330],[-15,-33],[-2,-4],[-7,-11],[-3,-6],[-6,-10],[-6,-10],[-3,-4],[-3,-3],[-3,-2],[-2,-2],[-3,-3],[-5,-2],[-7,-5],[-20,-12],[-9,-6],[-3,-2],[-3,-1],[-3,-1],[-1,-1],[-4,-1],[-8,-2],[-10,-3],[-2,3],[-5,7],[-18,28],[-1,2],[-1,1],[-1,0],[-2,0],[-1,1],[-1,0],[-7,-2],[-8,-1],[-1,-1],[-1,-1],[0,-1],[0,-1],[0,-1],[0,-1],[1,-2],[14,-21],[9,-14],[2,-3],[-2,-1],[-2,-1],[-2,-2],[-3,-2],[-3,-3],[-6,-5],[-5,-5],[-5,-5],[-14,-15],[-7,-7],[-4,-4],[-5,-8],[-3,-3],[-10,-12],[-10,-11],[-12,-12],[-7,-8],[-7,-9],[-6,-10],[-6,-9],[-13,-18],[-11,-14],[-13,-19],[-3,-4],[-6,-6],[-5,-5],[-7,-6],[-5,-4],[-7,-4],[-9,-5],[-17,-10],[-9,-4],[-11,-5],[-7,-3],[-10,-5],[-10,-5],[-13,-6],[-7,-3],[-21,-10],[-18,-8],[-5,-4],[-4,-3],[-7,-6],[-9,-10],[-4,-4],[-2,-2],[-2,-4],[-1,-3],[5,-8],[7,-13],[10,-15],[6,-9],[14,-20],[9,-14],[10,-14],[12,-18],[16,-24],[20,-29],[11,-17],[35,-46],[13,-17],[11,-13],[7,-11],[18,-26],[28,-40],[8,-12]],[[2002,2744],[4,-14],[4,3],[8,3],[8,-2],[7,-7],[0,-13],[-3,-10],[-12,-21],[0,-5],[1,-4],[3,-1],[2,3],[3,-1],[1,-5],[-8,-16],[-4,-1],[-4,1],[-10,-2],[-10,0],[-9,-8],[-2,4],[-6,12],[1,40],[1,10],[2,8],[4,10],[7,10],[5,7],[7,-1]],[[1961,2688],[-5,15],[1,6],[-4,1],[-2,2],[-2,1],[-1,1],[-1,2],[-4,4],[-2,4],[-2,2],[-2,3],[-3,5],[-3,4],[-1,2],[-2,2],[-2,2],[-3,3],[-2,2],[-7,8]],[[1914,2757],[7,7],[2,3],[8,8],[16,19]],[[1947,2794],[6,6]],[[1953,2800],[11,-16],[6,-9],[8,-8]],[[1978,2767],[-3,-10],[-3,-12],[0,-8],[0,-7],[-3,-6],[-8,-10],[-2,-9],[3,-10],[-1,-7]],[[6932,3124],[-36,-67]],[[6896,3057],[-4,3],[-29,22]],[[6860,2991],[-4,3],[-29,22]],[[6827,3016],[36,66]],[[6896,3057],[-5,-9],[-4,-8],[-5,-9],[-4,-7],[-5,-9],[-4,-8],[-4,-7],[-5,-9]],[[6932,3124],[24,-17]],[[6956,3107],[-36,-67]],[[6920,3040],[-24,17]],[[6941,3024],[-21,16]],[[6956,3107],[21,-15]],[[6977,3092],[-36,-68]],[[6978,2997],[-19,14],[-18,13]],[[6977,3092],[19,-15]],[[6996,3077],[19,-13],[-37,-67]],[[6996,3077],[40,76]],[[7036,3153],[19,-14]],[[7055,3139],[33,-24]],[[7088,3115],[-40,-75],[-26,-48],[-16,12],[-11,-19],[-17,12]],[[6956,3107],[40,76]],[[6996,3183],[22,-16],[18,-14]],[[6973,3200],[23,-17]],[[7050,3177],[-14,-24]],[[6987,3224],[63,-47]],[[7072,3220],[-22,-43]],[[7068,3164],[-13,-25]],[[7072,3220],[18,-15]],[[7090,3205],[-22,-41]],[[7105,3190],[-21,-38],[-16,12]],[[7119,3092],[-31,23]],[[7152,3149],[-8,-15],[-11,-18],[-14,-24]],[[7145,3082],[-3,1],[-3,1],[-7,2],[-13,6]],[[7169,3135],[3,-2],[9,-7]],[[7181,3126],[-18,-32],[12,-10]],[[7175,3084],[-10,-3],[-11,-1],[-2,0],[-7,2]],[[7181,3126],[18,-16],[19,-16]],[[7218,3094],[-12,0],[-15,-3],[-16,-7]],[[8079,2128],[-2,-39]],[[8077,2089],[-22,1],[-22,2]],[[8033,2092],[-21,2],[-22,1]],[[7990,2095],[-21,1],[-21,2],[-5,-70]],[[7943,2028],[-21,2],[-6,0]],[[7916,2030],[0,5],[4,65],[5,29],[2,6]],[[7908,2031],[-6,1]],[[7919,2136],[-2,-6],[-5,-25],[-2,-28],[-3,-38],[1,-4],[0,-4]],[[7990,2095],[-3,-70]],[[7987,2025],[-23,1],[-21,2]],[[7902,2032],[0,-18],[0,-12],[5,-30]],[[7997,1801],[-66,6],[-4,4],[0,8],[-11,0]],[[7916,1819],[5,34],[3,47],[-2,10],[0,1]],[[7922,1911],[17,0],[63,-5]],[[8002,1906],[-1,-27],[-1,-19]],[[8000,1860],[-1,-19]],[[7999,1841],[-2,-19]],[[7997,1822],[0,-21]],[[7906,1819],[-4,0]],[[7912,1912],[1,0]],[[7913,1912],[0,-3],[0,-2],[-3,-57],[-4,-31]],[[7997,1801],[-2,-23]],[[7995,1778],[0,-9],[-1,-18]],[[7994,1751],[-1,-9]],[[7993,1742],[-86,6],[-12,4]],[[7895,1752],[2,5],[5,12],[13,48],[1,2]],[[7886,1756],[-3,1]],[[7906,1819],[-1,-2],[-13,-47],[-6,-14]],[[2358,2080],[-34,-33],[-17,-16],[-30,-30],[2,-10],[0,-1],[-18,-17],[-20,-19],[-7,-7],[-18,-17],[-8,-8]],[[2208,1922],[-3,6],[-3,4],[-7,14],[-2,2],[-3,6],[-8,10]],[[2182,1964],[29,30],[56,50],[38,47],[14,25],[59,80]],[[2378,2196],[13,17]],[[2391,2213],[3,-3],[4,-4],[9,-9],[2,-1],[29,-40],[-15,-14],[-45,-44],[-1,0],[-1,0],[-1,0],[-1,0],[0,1],[-3,4],[-9,-5],[-10,-10],[6,-8]],[[2182,1964],[-4,4],[-2,3],[-5,6],[-9,9],[-12,10]],[[2150,1996],[5,5],[25,27]],[[2180,2028],[23,20],[14,14],[13,15],[7,10],[12,18],[4,8],[5,14],[9,27]],[[2267,2154],[17,-12]],[[2284,2142],[19,-15],[5,-5],[15,19],[13,17],[35,45],[7,-7]],[[3488,1518],[22,10],[19,8],[19,7],[20,7],[20,8],[13,6],[20,5]],[[3621,1569],[34,8],[36,8]],[[3693,1577],[-11,-2],[-2,-2],[-27,-5],[-34,-8],[-39,-12],[-36,-13],[-49,-20],[-4,-2],[-33,-16],[-4,-2],[-29,-15],[-30,-15],[-37,-20],[-1,-1],[-35,-15],[-17,-10],[-31,-15],[-26,-13],[-29,-15],[-4,-1]],[[3215,1375],[-3,-2]],[[3212,1373],[-2,7],[-17,67]],[[3193,1447],[-13,53],[-17,66]],[[3163,1566],[4,1]],[[3167,1567],[7,2],[3,0],[7,2],[6,3],[14,12],[41,34],[9,8],[0,14],[0,10]],[[3254,1652],[88,75]],[[3342,1727],[28,23],[26,22],[26,21]],[[3422,1793],[1,-5],[24,-100],[22,-89]],[[3469,1599],[-11,-4],[-2,-1],[-2,-2],[-1,-2],[-1,-3],[-4,-6],[-22,-13],[-2,-4],[-6,-4],[-28,-14],[-6,-3],[-6,-5],[-9,-8],[-2,-3],[5,-15],[4,-19],[1,-1],[2,-1],[1,0],[32,17],[9,-23],[3,2],[41,21],[9,4],[14,6]],[[3469,1599],[19,-81]],[[2331,3626],[5,-20],[-14,-7],[-13,-13],[-12,-8],[-9,-3],[-1,-4],[15,-24],[-4,-13]],[[2298,3534],[-7,11],[-6,9],[-1,0],[-1,0],[-1,-1],[-11,-10],[-12,-11],[-2,-2],[-8,-6],[-11,-9],[-6,-2],[-10,15],[-17,27],[2,11],[-1,12],[-1,10],[-5,4],[-2,1],[-12,3],[-11,-5],[-17,-20],[-1,-4],[-17,-11],[-19,-9],[-21,-7],[-8,-4],[-8,-5],[-5,-6],[-1,-5],[0,-6],[1,-11],[1,-8],[0,-1],[0,-2],[1,-3],[0,-2],[1,-4],[2,-3],[2,-4],[3,-4],[5,-3],[6,-3],[3,-1],[4,0],[7,0],[8,1],[10,0],[6,1],[17,-1],[4,0]],[[2159,3466],[-1,-8],[-1,-8],[-1,-10],[-1,-4],[-3,-5],[-2,-2],[-10,-10],[-19,-18],[-13,-12],[-10,-9],[-7,-6],[-1,-1],[-1,-2],[0,-1],[0,-1],[0,-1],[1,0],[14,-20]],[[2104,3348],[-28,0],[-19,-2],[-6,-23],[4,-6],[15,-9],[0,-20],[27,-42],[-17,-41],[-12,-35],[8,-27]],[[2076,3143],[-30,18],[1,1],[5,14],[3,6],[-25,14],[-6,3],[-4,2],[-3,1],[-3,1],[-2,0],[-2,0],[-3,0],[-19,-2]],[[1988,3201],[0,2],[-1,4],[0,13],[0,15],[-1,19],[-2,0],[-1,0],[0,1],[-1,1],[0,1],[0,1],[0,1],[1,0],[3,38],[6,14],[4,11],[-45,71],[-204,386]],[[1747,3779],[3,2],[3,1],[3,2],[17,12],[17,12],[14,9],[2,1],[3,3],[3,1],[2,2],[3,3],[2,2],[6,5],[22,21],[7,7],[3,2],[2,3],[4,2],[3,3],[7,6],[6,4],[10,6],[9,5],[2,1],[4,2],[3,2],[3,0],[4,1],[9,-1],[5,0],[8,0],[5,1],[23,-1],[0,-8],[1,-12],[0,-3],[1,-2],[1,-3],[18,-27],[11,-16],[6,-9],[4,-6],[19,-28],[1,-2],[1,0],[1,0],[1,-1],[2,0],[1,1],[1,1],[12,12],[16,14],[11,9],[6,6],[9,9],[6,6],[-2,3],[-6,9],[-3,4],[-3,4],[-5,7],[-2,5],[-1,1],[0,1],[-1,2],[-1,3],[-2,8],[-1,5],[6,-2],[8,-2],[10,-3],[5,-2],[5,-1],[2,-4],[5,-9],[4,-7],[6,-8],[5,-7],[4,-6],[14,-21],[4,-6],[6,-10],[5,-6],[12,12],[13,13],[8,7],[13,-20],[7,-11],[7,-9],[13,-18],[12,-17],[2,-2],[14,-17],[12,-19],[26,-37],[9,-12],[14,-20],[14,-21]],[[2298,3534],[5,-6],[9,-14],[5,-6],[3,-4],[3,-2],[6,-6],[-2,-3],[-2,-7],[-2,-4],[-3,-6],[-2,-5],[-2,-6],[-7,-15],[-1,-3],[-1,-3],[-1,-2],[-1,-3],[-2,-7],[0,-3],[-1,-1],[-1,-7],[0,-8],[-1,-4],[-1,-17],[-1,-6],[-1,-3],[-1,-3],[-1,-2],[-1,-2],[-2,-4],[-3,-3],[-5,-4],[-18,-10],[-1,-1],[-1,-1],[-2,-1],[-2,-2],[-2,-2],[-2,-2],[-1,-2],[-1,-2],[0,-2],[-1,-1],[0,-2],[-1,-3],[-1,-8],[0,-6]],[[2251,3320],[-7,0],[-2,0],[-1,0],[-2,1],[-1,1],[-1,1],[-11,16],[-2,3],[-2,1],[-3,3],[-4,3]],[[2215,3349],[2,5],[4,8],[4,6],[1,2],[1,1],[1,3],[10,10],[8,9],[-37,54],[-6,7],[-2,2],[-2,2],[-2,1],[-2,1],[-1,0],[-3,1],[-6,1],[-24,3],[-2,1]],[[2164,3320],[0,-1],[13,-20],[-8,-9],[-6,-6],[-9,-9],[-6,-6],[2,-10],[-8,-12],[-10,-14],[-2,-3],[8,-11],[11,4],[12,-6]],[[2161,3217],[-4,-10],[-1,-2],[0,-2],[-2,-5],[0,-1],[-1,-3],[0,-2],[-1,-7],[0,-4],[-1,-5],[-4,-9],[-3,-5],[-3,-5]],[[2141,3157],[-4,3],[-1,0],[-1,1],[-1,0],[-2,1],[-1,0],[-2,0],[-2,0],[-3,0],[-3,-1],[-2,0],[-2,-1],[-3,-2],[-1,-1],[-1,-1],[-1,-1],[0,-1],[-1,-1],[-1,-3],[-2,-3],[-4,-10],[-3,-7]],[[2100,3130],[-24,13]],[[2104,3348],[15,14],[7,-11],[1,-1],[2,-1],[24,-3],[-1,-6],[-2,-18],[14,-2]],[[2259,3137],[-6,-14],[-4,-8],[-9,-13],[-9,-12],[-8,-14],[-3,-3],[-3,-5],[-1,-3],[-4,-5],[-4,-6],[-9,-12],[-7,-7],[-6,-9],[-3,-2],[-5,-7]],[[2178,3017],[-10,14],[-12,18],[-14,20],[4,3],[5,6],[10,10],[5,7],[6,6],[4,4],[-9,13],[-4,5],[-5,9],[-7,9],[-5,7],[-1,1],[-4,8]],[[2161,3217],[10,-4],[3,-4],[2,-2],[0,-1],[0,-1],[-5,-14],[0,-1],[11,-16],[7,-10],[2,-2],[7,-4],[2,3],[1,2],[2,2],[1,2],[3,2],[1,1],[2,1],[2,1],[2,0],[3,1],[3,-1],[2,0],[2,0],[3,-1],[1,-1],[2,-1],[2,-2],[1,0],[1,-1],[1,-1],[1,-1],[2,-5],[1,-2],[5,-8],[2,-3],[4,-3],[9,-6]],[[2139,2977],[-3,5],[-12,16],[-7,-7],[-1,-1],[-3,-5],[-2,-3],[-1,-2],[-2,0],[-1,-1],[0,-1],[-1,0],[-1,0],[-1,0],[-1,0],[-1,0],[-2,0],[-1,0],[-2,0],[0,1],[-2,1],[-6,8],[-3,5],[-4,9],[-2,2],[-2,2],[-1,1],[0,1],[-1,0],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[1,0],[0,1],[4,3],[10,8],[-3,7],[0,2],[-1,4],[-1,7],[-2,21],[-1,6],[0,4],[1,6],[0,4],[1,3],[1,5],[1,4],[1,3],[4,8],[4,11],[4,9]],[[2178,3017],[-7,-7],[-5,-6],[-10,-9],[-10,-11],[-7,-7]],[[2139,2977],[-10,-11],[-6,-6],[-8,-8],[-12,-13],[-7,-7]],[[2096,2932],[-6,8],[-8,11],[-18,26],[-12,-10],[-7,-5],[-8,-7],[-7,-8],[-24,35],[-14,20],[-1,1],[-1,0],[-1,0],[-1,-1],[-13,-12],[-13,19]],[[1962,3009],[12,11],[2,2],[12,11],[2,2],[1,1],[2,2],[3,3],[7,6],[8,8],[6,5],[4,4],[8,8],[8,7],[10,12],[1,2],[2,2],[1,2],[2,3],[9,14],[2,3],[2,4],[5,11],[4,9],[1,2]],[[1767,3047],[13,-17],[14,-21],[6,-9],[7,-9],[6,-8],[15,-22],[27,-39],[7,-9]],[[1862,2913],[29,-40],[11,-15],[45,-64]],[[1914,2757],[-3,-4],[-9,-9],[-5,-7],[-3,-2],[-7,-7],[-6,-4],[-17,-15],[23,-33],[13,-19],[3,-3],[31,-45],[1,-1],[0,-1],[0,-2],[-1,-1],[-13,-12],[-18,26],[-5,6],[-18,26],[-15,21],[-16,23],[-10,-11],[-3,-3],[-4,-6],[-4,-6],[-4,-7],[-5,-8],[-6,-11],[-4,-8],[-2,-3],[6,-7],[47,-67],[0,-2],[0,-1],[-17,-15],[-53,77],[-18,-15],[38,-53],[-15,-14],[-39,56],[-21,-15],[-10,-7],[-8,-6],[-13,-7],[-16,-8],[-14,-6],[-12,-5],[-15,-7],[-24,-10],[-14,-6],[-36,-17],[-55,-26],[-13,-5],[-9,-3],[-12,-3],[-23,-6],[-30,-7],[-10,-2],[-5,-2],[-9,-3],[-9,-3],[-6,-2],[-4,-2],[-8,-4],[-7,-3],[-5,-3],[-4,-3],[-6,-4],[-6,-4],[-12,-8],[-10,-8],[-7,-4],[-6,-3],[-10,-3],[-5,-2],[-11,-3],[-8,-2],[-7,-2],[-7,0],[-25,0],[-8,-1],[-6,0],[-6,-2],[-5,-2],[-5,-3],[-6,-3],[-7,-5],[-4,-3],[-5,-1],[-4,0],[-4,0],[-6,2],[-5,3],[-4,3],[-11,15],[-21,31],[-39,56],[-16,23],[-31,45],[-5,7]],[[1310,3330],[17,-21],[-20,-25],[12,-29],[162,112],[15,56]],[[1496,3423],[20,-29],[13,-20],[25,-35],[17,-25],[12,-16],[18,-24],[20,-24],[16,-19],[8,-10],[1,-2],[7,-8],[7,-10],[8,-11],[5,-8],[10,-13],[17,-25],[7,-11],[24,-34],[12,-17],[20,-28],[4,-7]],[[7277,1135],[-14,4],[-14,4],[-19,6]],[[7204,1258],[16,18],[0,2],[-1,2],[-11,14],[0,3],[1,3],[11,11],[12,13],[1,1],[8,8],[32,34]],[[7273,1367],[27,-22],[2,-1],[2,0],[1,2],[2,6],[2,10],[6,13],[7,13],[5,9],[4,7],[1,2],[0,1],[-2,4],[-12,12],[-7,6],[-7,6],[-5,5],[-7,5],[-7,7]],[[7399,1492],[-3,-4],[-26,-40],[-50,-76],[-6,-15],[-12,-33],[-14,-54],[-5,-31],[14,-5]],[[6562,3213],[-1,-3],[-3,-5],[-4,-10],[-3,-7],[-19,-35],[-6,-8],[-3,-4],[-28,-37],[-20,-26],[-2,-5],[-6,-7],[-4,-6],[2,-3],[9,-9],[8,-7],[9,-8],[7,-5],[13,-10],[5,-3],[4,-3],[13,-9],[18,-13],[16,-10]],[[6560,2974],[-45,30],[-1,1],[-3,1],[-38,-72]],[[6473,2934],[-43,-74],[-14,-32],[-9,-29],[-5,-23],[-1,-13],[-1,-7],[-1,-26],[0,-3]],[[6399,2727],[2,-134],[0,-2],[0,-4],[0,-4],[0,-2],[0,-2],[0,-3],[0,-3],[0,-2],[0,-2],[0,-4],[0,-11]],[[6401,2554],[-4,3],[-3,2],[-31,22]],[[6363,2581],[-56,44],[-21,-35],[-30,22],[-21,14]],[[5965,2635],[6,39],[1,7],[5,29]],[[5977,2710],[42,255],[57,-64],[58,-57],[23,-33],[12,-14],[1,-2],[2,-2],[1,-1],[2,-2],[1,-1],[2,-2],[1,-2],[2,-2],[2,2],[1,2],[2,2],[1,2],[2,1],[1,1],[1,2],[7,8],[31,36],[5,5],[28,37],[8,10],[2,2],[11,14],[6,8],[9,11],[38,49],[35,45],[28,37],[-16,17]],[[6383,3074],[2,3],[22,28],[2,3],[3,4],[3,4],[14,19],[17,22]],[[6446,3157],[7,8],[33,43],[3,4],[3,4],[2,3],[2,1],[8,6],[13,5],[9,3],[4,1],[3,1],[3,-1],[2,-1],[-5,33],[-1,3],[-20,-5]],[[6512,3265],[-4,19],[-3,21],[-4,20],[-4,21],[-3,20],[-2,9],[-6,4],[-4,7]],[[9002,6235],[-3,-11],[-1,-5],[-2,-3],[-1,-4],[-1,-13],[1,-44],[-1,-29],[-1,-12],[-4,-16],[-5,-16],[-5,-12],[-5,-9],[-6,-9],[-8,-9],[-9,-9],[-13,-13],[-6,-4],[-12,-19]],[[8784,6337],[12,-4],[11,-3],[3,-1],[8,-3],[13,-4],[6,-2],[46,-14],[8,-3],[14,-4],[2,-1],[3,-1],[3,-1],[6,-2],[9,-3],[7,-3],[3,-2],[3,-1],[3,-2],[3,-2],[3,-1],[2,-2],[1,0],[12,-9],[6,-4],[5,-4],[3,-2],[4,-4],[12,-11],[7,-8],[0,-1]],[[6122,3588],[-8,6]],[[6114,3594],[-25,21],[-13,12],[-66,68]],[[6010,3695],[-21,22],[-4,4],[-15,15],[-3,3]],[[5967,3739],[6,8],[6,8],[9,-9],[9,-10],[9,8],[-9,12],[2,3],[30,36],[4,7],[3,15],[2,12],[0,12],[-1,12],[-4,11],[-15,19],[-9,10]],[[6009,3893],[27,33],[10,14],[2,3]],[[6048,3943],[9,-9],[5,-5],[10,-8],[8,-4],[7,-3]],[[6087,3914],[25,-1],[41,0]],[[6153,3913],[0,-4],[0,-15],[1,-36],[-1,-52],[-1,-27],[-2,-13],[-3,-28],[-5,-34],[-17,-99],[0,-6],[-1,-4],[-2,-7]],[[5910,3161],[-16,-2],[-30,-41],[-9,9],[15,19],[-14,15]],[[5856,3161],[29,37],[-1,4],[-11,12],[-3,0],[-14,-19],[-14,15]],[[5842,3210],[21,28],[8,10],[2,3]],[[5873,3251],[30,-32],[14,-14]],[[5917,3205],[-2,-3],[-13,-15],[10,-11],[-2,-15]],[[5778,3715],[-40,42],[-15,17]],[[5723,3774],[27,36],[15,17]],[[5765,3827],[55,-58]],[[5820,3769],[-13,-18],[-14,-18],[-15,-18]],[[2096,2932],[-6,-8],[-9,-9],[-2,-1],[-8,-8],[-7,-5],[-2,0],[-9,-4],[-12,-6]],[[2041,2891],[-9,-5],[-7,-5],[-8,-6],[-6,-7]],[[2011,2868],[-20,25],[-44,64],[-1,0],[-1,1],[-1,0],[-1,0],[-13,-12],[-13,19]],[[1917,2965],[20,21],[9,7]],[[1946,2993],[16,16]],[[2011,2868],[-7,-9],[-5,-6],[-2,-2]],[[1997,2851],[-9,-11],[-7,-7],[-18,-21],[-10,-12]],[[1862,2913],[8,8],[1,1],[23,22]],[[1894,2944],[8,8],[15,13]],[[2041,2891],[25,-34],[12,-18],[9,-11],[10,-8],[-7,-12],[-2,-3],[-4,-6],[-1,-4],[-1,-2],[-1,-2],[-1,-2],[-3,-4],[-3,-3],[-1,-1],[-1,0],[-1,1],[-1,1],[-6,5],[-10,1],[-12,2],[-1,0],[-1,1],[-1,1],[-30,42],[-9,12],[-3,4]],[[2096,2932],[8,-10],[45,-67],[2,-2]],[[2151,2853],[-3,-2],[-2,0],[-2,0],[-2,-1],[-10,-7],[-7,-8],[-8,-8],[-7,-7],[-1,-6],[-2,-4],[-4,-4],[-4,-11],[-13,-18],[-2,-7],[-6,-4],[-7,-4],[-9,13],[-21,6],[-7,-1],[-7,2],[-6,6],[-6,1],[-9,-3],[-4,8],[-3,1],[-4,-3],[-5,-11],[-3,-4],[-6,-5],[-3,-4],[0,-1]],[[1961,2688],[1,-8],[0,-21],[-3,-22],[-6,-8],[-6,-16],[-7,-4],[-1,-5],[-4,-11],[-5,-2],[-6,-6],[-5,0],[-9,-8],[-8,-8],[-6,-9],[-6,-10],[-4,-5],[-15,-2],[-9,-8],[-8,-10],[-6,-6],[-4,-5],[-17,-20],[-11,-14],[-13,-12],[-4,-3],[-6,-7],[-5,-7],[-3,-7],[-8,-11],[-2,-7],[-3,-5],[-6,-6],[-3,-4],[-1,-1],[-7,-15],[-2,-8],[-8,-24],[0,-9],[-4,-4],[-12,-10],[-5,-7],[-3,-2],[-6,-1],[-2,-1],[-2,-6],[-1,-3],[0,-3],[-2,-3],[-8,-7],[-6,-1],[-1,-1],[-3,-3],[-5,-2],[-12,2],[-12,3],[-8,4],[-6,4],[-10,1],[-13,4],[-5,-3],[-8,0],[-7,4],[-6,-3],[-7,-1],[-7,2],[-6,-5],[-17,0],[-6,2],[-2,-1],[-10,6],[-5,-1],[-5,-4],[-9,-11],[-10,-7],[-6,-2],[-4,-2],[-3,-4],[-1,-5],[-5,-13],[0,-2],[0,-2],[1,-2],[3,0],[1,2],[3,1],[2,-1],[4,-9],[10,-1],[7,-1],[7,5],[5,-13],[3,-4],[0,-2],[1,-2],[4,-2],[3,-4],[0,-5],[-3,-3],[-4,0],[-4,-2],[-4,-6],[-4,-7],[-5,-6],[-9,-9],[-7,-11],[-4,-3],[-5,-2],[-4,-4],[-7,-1],[-6,4],[-5,11],[0,5],[-2,5],[-5,6],[-10,8],[-5,8],[-8,9],[-8,5],[-5,0],[-6,-1],[-8,-2],[-19,0],[-6,-1],[-6,-3],[-14,-1],[-17,1],[-4,-4],[-8,-2],[-6,-4],[-8,0],[-7,-4],[-16,-14],[-4,-1],[-2,3],[-5,-1],[-2,-3],[-3,-3],[-5,0],[-3,-3],[-2,-3],[-5,-4],[-15,0],[-13,-4],[-6,0],[8,9],[7,4],[6,5],[4,6],[5,8],[3,7],[-2,10],[-9,1],[-10,-1],[-6,1],[-4,3],[-2,6],[-4,5],[-18,8],[-7,5],[-2,1],[-4,6],[-2,4],[-4,4],[-6,1],[-15,0],[-1,5],[-4,-5],[-4,1],[-4,-2],[-1,0],[-1,15],[-4,10],[-6,7],[-8,20],[-2,9],[-3,13],[-2,4],[-1,3],[-1,1],[-6,17],[-4,5],[-4,1],[-5,-3],[-3,3],[-7,3],[-15,-2],[-5,4],[-9,12],[-1,3],[-1,12],[-14,27],[-5,10],[-6,9],[-12,22],[-1,1],[-2,1],[-5,7],[-8,9],[-6,0],[-9,-3],[-6,-7],[-7,-5],[-6,-9],[-4,1]],[[1767,3047],[14,14],[2,1],[1,0],[1,0],[1,-1],[12,-16],[16,14],[-16,21],[-1,3],[0,3],[3,4],[2,4],[2,3],[3,7],[9,22]],[[1816,3126],[17,-22],[27,-38]],[[1860,3066],[6,-8],[1,-2],[2,-2],[1,-5],[3,-13],[1,-5],[1,-5],[0,-9],[-3,-22],[0,-10],[1,-4],[1,-4],[1,-4],[3,-6],[13,-19],[3,-4]],[[1860,3066],[5,4],[5,5],[3,5],[1,3],[0,3],[1,2],[26,26],[7,8],[1,1]],[[1909,3123],[1,-1],[29,-42],[15,-21],[1,-2],[0,-1],[1,-1],[-1,-1],[-7,-7],[-7,-6],[5,-6],[0,-1],[0,-1],[1,-1],[-1,-1],[-16,-16],[1,0],[11,-17],[4,-5]],[[1816,3126],[5,12],[3,7],[0,5],[1,4],[5,12],[3,8],[3,5],[2,4],[3,3],[4,2],[16,8],[4,2],[3,2],[2,0],[3,1],[4,0],[4,0],[13,0],[7,0],[5,0],[8,0],[20,0],[20,-1],[-1,-14],[1,-9],[0,-1],[0,-2]],[[1954,3174],[1,-7],[0,-9],[1,-3],[-15,-2],[-1,0],[-1,0],[-11,-11],[-19,-19]],[[1954,3174],[34,4],[0,16],[0,7]],[[1496,3423],[-14,19],[-11,16],[-12,17],[-1,3],[-3,6],[3,1],[4,2],[3,2],[5,5],[9,9],[5,5],[8,9],[2,2],[9,10],[5,5],[7,8],[5,5],[-51,82]],[[1469,3629],[0,5],[11,28],[3,28],[1,26],[-1,11],[-7,18],[-3,15],[2,3],[7,1],[11,0],[5,2],[5,18],[0,5],[-13,8],[-5,5],[-5,7],[1,7],[5,4],[3,2],[18,0],[17,-7],[10,-7],[5,-5],[4,-5],[10,-10],[7,-5],[15,0],[8,4],[6,6],[0,4],[-4,4],[6,7],[2,4],[5,6],[2,2],[14,8],[6,-5],[3,-1],[3,2],[2,3],[0,4],[3,1],[2,-2],[4,0],[3,5],[7,2],[4,-2],[7,4],[9,3],[11,12],[13,10],[2,1]],[[1693,3865],[4,-9],[51,-66],[-1,-11]],[[8210,3953],[-7,6],[-11,12],[-1,2]],[[8191,3973],[-3,3],[-43,32]],[[8145,4008],[-42,31]],[[8103,4039],[-28,22]],[[8075,4061],[-30,22],[-3,3],[0,2],[0,1],[-1,2],[-6,4]],[[8035,4095],[5,3],[12,22]],[[8052,4120],[11,18],[10,17],[9,15]],[[8082,4170],[11,19]],[[8093,4189],[13,22],[12,22]],[[8118,4233],[14,24]],[[8132,4257],[28,-21],[14,-11]],[[8174,4225],[12,-10],[7,-5],[18,-14],[32,-25]],[[8243,4171],[-6,-31],[-10,-55]],[[8227,4085],[-5,-24],[-5,-27]],[[8217,4034],[-4,-25],[-2,-16]],[[8211,3993],[0,-19],[-1,-21]],[[9697,9303],[30,-11]],[[9727,9292],[0,-2],[0,-2],[-2,-2],[0,-12],[-3,-8],[0,-10],[0,-4],[0,-7],[-1,-6],[-1,-19],[-1,-24],[-1,-4],[3,-11],[1,-2],[-2,-14],[-2,-9],[-2,-6],[0,-8],[-2,-10],[-2,-8],[-7,-33],[0,-25],[1,-4],[1,-8],[-1,-9],[-3,-5],[-2,-19],[0,-4],[-1,-2],[-2,-7],[-2,-35],[-2,-4],[-1,-7],[0,-1],[3,-11],[-2,-16],[0,-5],[1,-9],[-3,-13],[0,-6],[2,-2],[1,-8],[0,-1]],[[9695,8890],[-13,7]],[[9682,8897],[1,26],[-38,11],[4,25],[4,24],[3,21],[4,28],[1,11],[1,6],[1,11],[2,22],[-2,2],[-11,1],[-1,1],[-1,2],[1,5],[1,2],[2,1],[13,-3],[3,22],[1,8],[2,22],[2,20],[1,10],[2,14],[19,114]],[[7572,5225],[-40,29],[-8,1],[-3,18]],[[7521,5273],[10,7]],[[7531,5280],[50,-37]],[[7531,5280],[14,13],[4,21]],[[7549,5314],[51,-37]],[[7549,5314],[1,13],[16,5],[1,8],[13,25]],[[7580,5365],[30,-22],[18,-13]],[[7521,5273],[-11,1],[-19,4]],[[7500,5379],[6,6],[14,24]],[[7520,5409],[15,-10],[-20,-39],[18,-4],[17,31],[15,-11],[15,-11]],[[7520,5409],[9,17],[9,18],[5,11],[4,6]],[[7547,5461],[9,-6],[51,-38]],[[7607,5417],[-9,-17],[-9,-18],[-9,-17]],[[8249,2119],[-34,10],[-10,-3],[2,-12],[14,-36]],[[8221,2078],[-14,1],[-22,2]],[[8252,2006],[-22,49],[-9,23]],[[8252,2006],[-32,2],[-17,2],[-22,0]],[[8180,1982],[-87,6]],[[8093,1988],[2,29]],[[8095,2017],[22,-2],[21,-1]],[[8178,1952],[-86,6]],[[8092,1958],[1,30]],[[8176,1923],[-86,6]],[[8090,1929],[2,29]],[[8175,1894],[-87,6]],[[8088,1900],[2,29]],[[9146,6516],[-7,-25]],[[9139,6491],[-5,2]],[[9134,6493],[-10,5],[-25,12],[-8,4]],[[9091,6514],[9,25],[9,26],[8,23]],[[9168,6589],[-6,-22],[-16,-51]],[[9199,6490],[-38,19],[-9,5],[-6,2]],[[9196,6434],[-10,5],[-17,9],[-24,11],[-9,5],[-4,3]],[[9132,6467],[7,24]],[[9214,6482],[-9,-24],[-9,-24]],[[9293,6387],[-13,6],[-5,2],[-3,2],[-8,4]],[[9264,6401],[-9,4],[-10,5],[-3,1],[-7,4],[-9,5]],[[9226,6420],[-20,9],[-2,1]],[[9204,6430],[-8,4]],[[9288,6418],[2,-15],[3,-16]],[[9226,6420],[-14,-38],[-7,-19],[-3,-9]],[[9202,6354],[-32,16],[-3,2]],[[9167,6372],[-5,2],[4,11],[5,15],[1,2],[5,16],[19,-10],[4,11],[4,11]],[[9240,6335],[-4,2],[-18,9],[-16,8]],[[9264,6401],[-21,-57],[-1,-2],[-1,-4],[-1,-3]],[[9161,6350],[6,22]],[[9240,6335],[-7,-21]],[[9233,6314],[-54,27],[-18,9]],[[7992,1720],[-98,7],[-5,-11],[-4,-14],[-5,-19]],[[7880,1683],[-4,-15]],[[7876,1668],[-5,-21],[-4,-20]],[[7867,1627],[-4,-22]],[[7863,1605],[-47,3],[-18,-23],[-13,-21]],[[7785,1564],[-21,-9]],[[7764,1555],[3,6],[14,24],[21,29],[17,18],[27,31],[15,24],[2,3],[18,31],[14,31]],[[7993,1742],[-1,-22]],[[7746,1548],[-6,-2]],[[7740,1546],[38,61],[17,21]],[[7795,1628],[20,23],[19,22],[16,22]],[[7850,1695],[12,20],[12,21],[9,21]],[[7886,1756],[-1,-3],[-8,-16],[-24,-43],[-1,-2],[-16,-21],[-22,-26],[-10,-11],[-19,-24],[-28,-43],[-11,-19]],[[7989,1676],[-109,7]],[[7992,1720],[-2,-25]],[[7990,1695],[-1,-19]],[[7989,1660],[-113,8]],[[7989,1676],[0,-16]],[[7987,1618],[-120,9]],[[7989,1660],[-1,-20]],[[7988,1640],[-1,-22]],[[7984,1571],[-126,9],[5,25]],[[7987,1618],[-2,-21]],[[7985,1597],[-1,-26]],[[7983,1547],[-2,-20]],[[7981,1527],[-97,15],[-11,2],[1,5],[-21,3]],[[7853,1552],[-35,6],[-33,6]],[[7984,1571],[-1,-24]],[[7981,1527],[-1,-23]],[[7980,1504],[-1,-19]],[[7979,1485],[-39,8],[-7,2],[-8,7],[-5,5],[-4,5]],[[7916,1512],[-68,12]],[[7848,1524],[4,24],[1,4]],[[7906,1461],[-67,19]],[[7839,1480],[5,22],[4,22]],[[7916,1512],[-5,-28],[-5,-23]],[[7979,1485],[-1,-21],[-1,-24]],[[7977,1440],[-71,21]],[[8056,1383],[-3,-5],[-9,-9]],[[8044,1369],[-1,-2],[-55,13],[-17,-19],[3,32]],[[7974,1393],[1,24],[-74,21]],[[7901,1438],[5,23]],[[7977,1440],[46,-13],[8,-9],[14,-34],[11,-1]],[[7828,1424],[3,10]],[[7831,1434],[65,-19],[5,23]],[[7974,1393],[-9,-9],[-137,40]],[[7831,1434],[4,23],[4,23]],[[8807,5880],[-19,10],[-7,-16],[-17,9],[-18,11],[-13,8],[-12,6]],[[8721,5908],[11,26],[8,20],[1,3]],[[8820,5914],[-2,-3],[-11,-31]],[[7222,2710],[8,8]],[[7230,2718],[91,-70],[3,-3],[12,24]],[[7230,2718],[18,18],[19,18],[5,6]],[[7184,2751],[12,21]],[[7196,2772],[14,24]],[[7210,2796],[12,-9],[13,22],[12,21],[6,13],[5,4],[5,2]],[[7210,2796],[6,11],[-62,47],[0,9],[4,16],[5,15]],[[7163,2894],[11,21],[21,39],[15,21],[3,5]],[[7106,2931],[16,-12],[2,2],[39,-27]],[[7196,2772],[0,9],[-144,113],[-3,13]],[[7049,2907],[15,-11],[22,-18],[14,42],[6,11]],[[7196,2772],[-7,3],[-151,113]],[[7038,2888],[11,19]],[[7027,2867],[11,21]],[[7049,2907],[23,42],[3,6]],[[7075,2955],[15,-12],[16,-12]],[[6924,2944],[-30,-55]],[[6894,2889],[-26,-48]],[[6868,2841],[-18,14],[-43,32]],[[6807,2887],[7,19],[17,30]],[[6831,2936],[16,31]],[[6847,2967],[45,-34],[13,25]],[[6905,2958],[19,-14]],[[6894,2889],[19,-14]],[[6913,2875],[-26,-48]],[[6887,2827],[-19,14]],[[6896,2789],[-10,-16],[-20,16],[-19,13]],[[6847,2802],[-33,25],[9,17],[-27,21]],[[6796,2865],[11,22]],[[6887,2827],[16,-12],[-2,-13]],[[6901,2802],[-5,-13]],[[6962,2839],[-31,-59],[-16,12],[-14,10]],[[6913,2875],[16,-12],[17,-12]],[[6960,2742],[-64,47]],[[6942,2703],[-2,2],[-7,5],[-57,42]],[[6836,2782],[2,3],[9,17]],[[6912,2646],[-3,2],[-63,47]],[[6895,2616],[-12,-23]],[[6883,2593],[-2,2],[-63,49]],[[6908,2558],[-31,24]],[[6883,2593],[31,-23],[-1,-4],[-5,-8]],[[6908,2558],[-6,-10],[21,-15]],[[6923,2533],[10,-7]],[[6933,2526],[-14,-4]],[[6919,2522],[-25,-8],[-22,-7]],[[6939,2583],[6,-4]],[[6945,2579],[-4,-8],[-10,-19],[1,-3],[-9,-16]],[[6945,2579],[15,-11],[32,-23]],[[6992,2545],[-20,-7],[-24,-9],[-15,-3]],[[7002,2547],[-10,-2]],[[6956,2615],[8,-6],[66,-50],[2,-1],[1,-2]],[[6993,2466],[-9,7],[-47,36]],[[6937,2509],[-18,13]],[[8173,1867],[-86,6]],[[8087,1873],[1,27]],[[8173,1847],[-87,7]],[[8086,1854],[1,19]],[[8171,1828],[-86,6]],[[8085,1834],[1,20]],[[8171,1809],[-87,6]],[[8084,1815],[1,19]],[[8169,1789],[-86,6]],[[8083,1795],[1,20]],[[8168,1766],[-86,6]],[[8082,1772],[1,23]],[[8166,1741],[-41,3],[-45,4]],[[8080,1748],[2,24]],[[8165,1709],[-86,5]],[[8079,1714],[1,29],[0,5]],[[8162,1665],[-86,6]],[[8076,1671],[1,17]],[[8077,1688],[2,26]],[[8160,1628],[-86,6]],[[8074,1634],[1,20]],[[8075,1654],[1,17]],[[8159,1606],[-86,6]],[[8073,1612],[1,22]],[[8175,1627],[-1,-21],[-15,0]],[[8071,1565],[1,25]],[[8072,1590],[1,22]],[[8159,1606],[-5,-21],[-6,-26],[-77,6]],[[8067,1512],[-86,15]],[[7983,1547],[86,-7],[2,25]],[[8209,1626],[-10,-23],[-17,-32],[-15,-19],[-23,-37],[-2,-12],[2,-3],[-6,-5]],[[8138,1495],[-15,5],[-31,9],[-25,3]],[[7984,1571],[87,-6]],[[7985,1597],[87,-7]],[[7988,1640],[86,-6]],[[7989,1660],[86,-6]],[[7990,1695],[87,-7]],[[7994,1751],[4,1],[38,-2],[44,-2]],[[7995,1778],[87,-6]],[[7997,1801],[86,-6]],[[7997,1822],[87,-7]],[[7999,1841],[86,-7]],[[8000,1860],[86,-6]],[[8002,1906],[86,-6]],[[8002,1906],[2,30],[1,29]],[[8005,1965],[76,-6],[11,-1]],[[8005,1965],[2,29]],[[8007,1994],[42,-2],[44,-4]],[[8007,1994],[0,18],[0,11]],[[8007,2023],[23,-1]],[[8030,2022],[21,-2],[22,-1]],[[8073,2019],[22,-2]],[[8030,2022],[3,70]],[[8077,2089],[-4,-70]],[[8007,2023],[-20,2]],[[7837,3125],[-26,-3],[-11,-1],[-11,3]],[[6962,4312],[1,-7],[-1,-4],[-1,-3],[-5,-12],[-8,-22]],[[6948,4264],[-62,30],[-7,-19]],[[6879,4275],[-58,28],[-5,2]],[[6816,4305],[0,5],[13,35],[1,3]],[[6830,4348],[3,0],[4,-2],[83,-21],[4,-2],[6,-2],[20,-6],[12,-3]],[[6923,5101],[-10,-19]],[[6913,5082],[-54,39],[-18,13],[-28,20]],[[6813,5154],[4,7],[25,46],[2,5],[5,9],[1,2],[1,2]],[[6851,5225],[46,-33]],[[6897,5192],[-2,-3],[-6,-9],[-2,-1],[-18,-34],[0,-2],[0,-2],[14,-10],[24,-17],[16,-13]],[[6136,4314],[-12,5],[-4,2],[-5,1],[-5,2],[-4,1],[-5,1],[-5,1],[-4,1],[-6,1],[-6,1],[-3,0],[-4,1],[-5,0],[-7,1],[-5,0],[-4,0],[-5,0],[-3,0],[-3,-1],[-5,-2],[-11,-1],[-5,-1],[-4,0],[-5,-1],[-6,-1],[-6,-2],[-3,-1],[-4,-1],[-4,-1],[-4,-2],[-5,-1],[-5,-2],[-14,-6],[-28,-10],[-3,-1],[-40,-16],[-11,-4],[-7,-3],[-5,-2]],[[6062,4383],[5,-21],[-16,-22],[5,-2],[5,-1],[19,-2],[8,-1],[9,-2],[12,-4],[27,-14]],[[5312,4075],[-13,-17]],[[5299,4058],[-15,16],[-3,-5]],[[5281,4069],[-18,11]],[[5263,4080],[-5,4],[-2,3],[-19,11],[-8,5]],[[5229,4103],[9,14],[0,5],[-31,32],[-30,33]],[[5177,4187],[14,18],[14,18]],[[5205,4223],[10,-11],[15,-15],[8,-8],[28,-29]],[[5266,4160],[18,-20]],[[5284,4140],[43,-45]],[[5327,4095],[-15,-20]],[[7828,1424],[-94,22],[-7,22],[-25,-18]],[[7702,1450],[3,5],[8,17],[4,5],[17,27],[1,2]],[[7735,1506],[1,0],[9,1],[5,-1],[89,-26]],[[7685,1444],[-5,1]],[[7740,1546],[3,-2]],[[7743,1544],[-3,-6],[-9,-14],[-9,-17],[-15,-23],[-4,-6],[-11,-23],[-7,-11]],[[7735,1506],[29,49]],[[7746,1548],[-3,-4]],[[7733,1659],[-2,-23],[11,-1],[27,-2],[18,-1],[6,-1],[2,-3]],[[7808,1698],[39,-2],[3,-1]],[[7934,1216],[-39,5]],[[7895,1221],[-51,11],[-47,12]],[[7797,1244],[-63,18],[-88,26],[-20,-8]],[[7626,1280],[-21,0]],[[7605,1280],[6,13],[2,5],[10,15],[12,24],[15,26],[7,15],[25,38],[20,34]],[[8044,1369],[-3,-5],[-7,-9],[-16,-23],[-11,-21],[-11,-17],[-10,-5],[-11,-13],[-6,-12],[-11,-12],[-6,-12],[-18,-24]],[[7590,1280],[10,22],[46,84],[24,42],[3,5]],[[7685,1444],[-5,-9],[-29,-51],[-3,-5],[-11,-16],[-35,-62],[-12,-20],[0,-1]],[[7979,1485],[86,-19],[0,5],[1,17]],[[8066,1488],[1,24]],[[8138,1495],[-3,-2],[-6,-7],[-20,-30],[-4,-8],[-22,-32],[-13,-18],[-9,-9],[-5,-6]],[[7980,1504],[86,-16]],[[8586,1703],[2,-3],[4,-4],[3,-2],[11,-4],[4,-14],[3,-9],[4,-4]],[[8617,1663],[-2,-2],[-9,-9],[-7,-9],[-3,-5],[-2,-8],[0,-8],[-2,-11],[-1,-20],[-4,-11],[-9,-17],[-15,-20],[-5,-2],[-8,1],[-8,-1],[-13,0],[-4,0],[-9,-1],[-8,-4],[-5,-4],[-20,-11],[-7,-3],[-8,-2],[-4,-2],[-5,-3],[-7,-9],[-6,-5],[-5,-8],[0,-11],[-3,-8],[-4,-8],[-10,-7],[-6,-1],[-3,-5],[-1,-4],[-4,-1],[-3,2],[-2,3],[-1,0],[-1,-2],[-12,-1],[-5,-1],[-12,2],[-3,-1],[-1,-6],[-2,-3],[-2,-2],[-5,-1],[-5,2],[-3,7],[-3,-1],[-3,-3],[0,-5],[-1,-3],[-4,-2],[-3,-1],[-3,1],[-5,5],[-3,5],[-4,1],[-6,3],[-6,8],[-3,5],[-7,15],[-1,6],[-1,1],[-1,7],[-7,20],[-7,27],[-4,25],[11,41],[6,13],[3,8],[5,17],[4,18],[8,23],[4,16],[5,28],[3,22],[0,22],[8,16],[5,19],[5,13],[2,15],[4,16],[9,18],[4,11]],[[2899,2234],[-37,-32],[-7,10],[-1,0],[-3,0],[-19,-17],[1,-3],[5,-7],[2,-2],[1,-3],[10,-17],[-35,-32],[-18,30],[-2,0],[-2,0],[-6,-5],[-1,-2],[0,-3],[19,-28],[-17,-15],[-18,29],[-2,1],[-2,0],[-7,-5],[-1,-2],[1,-3],[19,-29],[-14,-11],[-8,6],[-4,5],[-8,13],[-2,2],[-3,0],[-24,-20],[-1,-4],[1,-3],[9,-15],[2,-3],[-2,-3],[-13,-12],[-15,23],[-2,0],[-12,-10],[-2,-2],[1,-4],[13,-20],[-16,-14],[-12,20],[-2,2],[-2,1],[-12,-10],[-1,-2],[1,-3],[6,-11],[1,-9],[14,0],[2,0],[2,1],[2,2],[10,-14],[-42,-36],[-1,-1],[0,-1],[1,-2],[8,-13],[2,-2],[2,0],[2,1],[40,34],[6,-9],[2,-3],[2,-3],[26,22],[27,23],[9,7],[5,6],[48,41],[33,29],[22,19],[6,5],[5,4],[49,42]],[[2940,2167],[24,-39],[15,-25],[11,-17],[2,3],[7,-12],[10,-16],[4,-6],[3,-5]],[[3016,2050],[-3,-3],[-42,-35],[-19,-16],[-35,-29],[-26,-22],[-25,-21],[-24,-20],[-22,-19],[-24,-20],[-8,-6],[-3,-3],[-5,-4],[-7,-5],[-10,-7],[-10,-7],[-10,-6],[-10,-5],[-7,-4],[-7,-3],[-1,-1],[-2,-1]],[[2716,1813],[-3,6],[-4,6],[-5,9],[-59,86],[-3,4],[-15,31],[-7,12],[-22,36]],[[2598,2003],[3,4],[3,5],[10,8],[272,237],[3,3]],[[2889,2260],[13,-23],[-3,-3]],[[4158,3361],[-66,-13],[-2,-2],[-18,-16],[7,-7],[15,-14]],[[4094,3309],[-7,-8],[-7,-5],[-6,-3],[-8,-3],[-18,-6],[-7,-4],[-4,-5]],[[4037,3275],[-5,6],[-2,4],[-5,13]],[[4025,3298],[-2,5],[-1,4],[-4,8],[-15,15],[-1,0],[-13,14]],[[3989,3344],[8,8],[3,3],[5,2],[8,6],[3,4],[0,2],[1,3],[0,2],[-1,3],[-2,2],[-32,34]],[[3982,3413],[11,8],[3,3]],[[3996,3424],[28,-30],[30,-32],[6,0],[16,4],[6,1],[4,2],[5,5],[4,5],[12,-13],[3,0],[10,15],[-3,5],[-5,4],[-7,8],[-11,12],[-22,23],[-5,5],[-22,23]],[[4045,3461],[17,13]],[[4062,3474],[80,-86],[7,-7],[-2,-3],[11,-17]],[[5205,4223],[-37,40]],[[5168,4263],[-4,4],[-3,3],[0,1],[-4,4],[-12,13]],[[5145,4288],[24,30],[-15,15],[6,5],[12,10],[16,15],[11,10],[11,12],[3,4],[4,7]],[[5217,4396],[7,17],[2,5],[2,4]],[[5228,4422],[69,-72]],[[5297,4350],[62,-65]],[[5359,4285],[-11,-15]],[[5348,4270],[-44,-60]],[[5304,4210],[-10,-12],[-28,-38]],[[6657,3142],[-21,15]],[[6986,3651],[11,-15],[9,-21],[10,-22]],[[7145,3082],[-3,-7],[-1,-2],[-7,-9],[-16,-28],[-12,-24],[-31,-57]],[[6976,2905],[-17,13],[-1,1],[-1,0],[-6,5],[-9,6]],[[6942,2930],[4,7],[32,60]],[[9331,8884],[7,32],[8,37],[88,-25]],[[9434,8928],[-5,-24],[-1,-8],[-3,-23],[-2,-13]],[[9423,8860],[-6,2],[-12,3],[-10,3],[-18,5],[-43,12],[-3,-1]],[[6904,2449],[12,21],[10,19],[5,10],[6,10]],[[6256,2171],[-18,12],[-43,27]],[[6195,2210],[10,20],[6,14],[20,42],[3,4],[6,11],[3,9],[1,10],[1,5]],[[6245,2325],[1,11],[2,7],[4,10],[7,15],[1,3]],[[6260,2371],[19,-12],[16,33],[17,-11],[-6,-13],[-9,-20],[12,-8],[5,-5],[5,-6],[6,-5],[3,-4]],[[7771,2440],[-24,17],[-5,7]],[[7922,1911],[1,26],[-6,61],[0,3],[-1,5],[0,24]],[[7908,2031],[0,-3],[-2,-4],[1,-19],[0,-3],[0,-4],[4,-27],[2,-34],[0,-25]],[[6126,4375],[6,2],[2,0],[12,1],[0,27],[1,1],[1,1],[13,4],[2,0],[1,-2],[1,-50],[-5,-14],[1,-2],[15,-7]],[[6176,4336],[-6,-18],[-2,-1],[-2,1],[-31,14],[-14,8],[-1,1],[-1,3],[9,23],[-2,8]],[[9040,5199],[-22,11],[-1,1],[-1,1],[-13,6]],[[9003,5218],[4,8],[5,10],[3,6],[4,10],[6,21],[1,9],[6,26],[4,18],[10,54],[5,18],[3,14],[8,35],[6,29],[1,4],[1,5],[3,12]],[[9073,5497],[2,5],[4,15],[1,3],[2,5],[6,15],[-2,1],[-9,6],[-51,28],[-9,4],[-7,-19]],[[9010,5560],[-9,5],[-39,21],[-9,5]],[[8953,5591],[-8,4],[-53,30]],[[8892,5625],[-6,3]],[[8886,5628],[2,7],[4,13],[32,95],[15,45],[14,42],[14,52]],[[8967,5882],[15,-8],[19,-10],[9,-5],[1,0],[34,-20],[16,-8],[50,-29],[52,-27],[30,-16],[2,-2],[1,3],[6,11],[5,9],[12,24],[2,4]],[[9221,5808],[11,20],[10,19]],[[9242,5847],[7,14],[3,5],[7,13],[7,13],[2,3],[16,31],[2,4],[20,36],[2,4],[1,2],[2,5],[5,10],[4,7],[2,4],[19,34],[6,11],[2,4],[4,9],[2,4],[2,8],[1,4],[2,6]],[[9360,6078],[47,-16],[4,-2]],[[9411,6060],[-1,-6],[-1,-4],[-1,-4],[1,-4],[1,-3],[2,-1],[16,-9],[-27,-111],[3,-1],[-65,-160],[-2,-2],[-36,-56],[-62,-104],[-99,-87],[-1,-6],[1,-2],[2,-2],[5,-2],[9,2],[26,3],[9,0],[3,-1],[6,-7],[5,-9],[4,2],[3,-4],[-22,-18],[-30,-25],[-65,-131],[-37,-75],[-18,-34]],[[8504,5582],[-1,1],[-2,1],[-12,7],[-35,18],[-9,5],[-34,18],[-41,22],[-1,-3],[-9,-23],[-9,-23],[-15,-36],[-6,1],[-9,18],[11,27],[-22,12],[-3,2],[-1,2],[0,2],[0,2],[4,4],[3,4],[3,5],[1,3],[1,8],[0,6],[1,3],[2,5],[1,4],[1,3],[-26,15],[-15,9],[-4,3],[-3,3],[-5,2]],[[8270,5712],[1,4],[6,16],[7,19]],[[8284,5751],[4,9],[8,20],[6,17],[6,16],[4,9],[8,21],[2,5],[1,2],[1,2]],[[8324,5852],[23,-13],[4,-2],[5,-5],[5,-6],[6,-9],[17,-27],[16,-26]],[[8400,5764],[2,-3],[5,-4],[3,-2],[29,-16],[41,-22]],[[8480,5717],[53,-30],[6,-3],[2,-1],[3,-2]],[[8544,5681],[-1,-3],[-1,-3],[-22,-53],[-2,-5],[-14,-35]],[[2883,2571],[-21,-11],[-5,-3]],[[2857,2557],[-4,5],[-24,23],[-12,13],[-5,5],[-4,7],[-6,4],[-21,11]],[[2781,2625],[3,9],[10,8],[18,-8],[5,17],[2,5]],[[2819,2656],[4,2],[44,37]],[[2867,2695],[11,-18],[11,-18],[20,-31],[14,-17]],[[2923,2611],[-9,-12],[-14,-16],[-17,-12]],[[3891,2848],[-153,-124],[-5,-3]],[[3733,2721],[-26,44],[43,35],[-1,5],[3,26],[-19,3],[-15,-6],[-6,-4],[-26,-21],[-3,1],[-10,17],[-10,18],[1,3],[38,30],[5,3],[-11,18],[1,2],[34,11],[3,0],[1,-3],[2,-18],[10,2],[10,-1]],[[3757,2886],[20,0],[0,5],[-2,22],[0,4],[1,3],[37,29],[3,0],[4,0]],[[3820,2949],[2,-20],[-28,-21],[0,-3],[1,-8],[1,-8],[6,1],[29,21],[8,-15],[0,-2],[-1,-2],[-34,-27],[-4,-1],[-6,1],[-2,-23],[6,-1],[4,1],[5,1],[4,3],[19,15],[19,15],[17,14],[25,-42]],[[5490,3360],[-15,-21],[13,-14]],[[5488,3325],[-11,-16],[14,-16],[14,-15],[8,10]],[[5513,3288],[2,-2],[14,-14]],[[5529,3272],[-38,-9],[-4,4],[0,1],[-13,13],[-4,4],[-13,13],[-25,25],[-30,-2]],[[5402,3321],[34,49]],[[5436,3370],[20,-20],[20,23]],[[5476,3373],[14,-13]],[[5741,4799],[-17,-9],[-4,-2],[-24,-13],[-3,-2],[-9,-4],[-3,-1],[-2,2],[-1,-4],[-2,-6],[-2,-3],[-7,-17]],[[5667,4740],[-40,20]],[[5627,4760],[-32,18],[-10,-2],[-13,-4],[-2,-1],[-10,-7],[-8,-7],[-12,-8],[50,-26],[-6,-14],[-6,-16],[-7,-18]],[[5571,4675],[-76,42],[-16,-16],[-16,-15]],[[5463,4686],[-5,12],[-15,10],[-4,1],[-4,2]],[[5435,4711],[0,1],[5,3],[10,11],[3,3],[7,3],[10,-6],[2,0],[2,2],[2,3],[1,2],[0,3],[-5,3],[-2,5],[1,5],[4,5],[3,7],[8,8],[9,1],[6,6],[9,12],[2,2],[3,1],[7,-3],[4,-1],[6,1],[2,2],[17,8],[7,3],[3,1],[6,-1],[2,0],[13,4],[17,6],[8,0],[19,5],[5,0],[16,-1],[10,1],[5,-2],[3,-2],[13,-2],[7,3],[10,-1],[17,5],[8,2],[5,3],[9,3],[2,0]],[[5736,4825],[0,-7],[5,-19]],[[8104,6561],[-34,25],[-16,11],[-40,29]],[[8042,6679],[14,26],[1,2]],[[8057,6707],[39,-28],[16,-11],[-1,-3],[-32,-62],[34,-24],[-5,-10],[-4,-8]],[[5917,3205],[27,37]],[[5944,3242],[14,-14],[9,-10]],[[5967,3218],[-25,-33],[-3,-2],[-1,-1],[-3,-1],[-8,-3],[-8,-7],[-9,-10]],[[8731,1930],[-11,5],[-32,13]],[[8843,2243],[4,-3],[2,-2],[4,-5],[3,-6],[5,-16],[10,-36],[4,-11],[3,-4],[3,-4],[1,-4],[0,-3],[-1,-1],[-2,-3],[-4,-2],[-16,1],[-5,-1],[-5,-7],[-15,-15],[-15,-13],[-8,-12],[-4,-5],[-7,-7],[-2,-2],[-8,-8],[-33,-37],[-17,-18],[0,-17],[-2,-14],[-1,-20],[-6,-38]],[[8731,1930],[-4,-25],[-4,-16],[-5,-14],[-13,-28],[-4,-11],[-8,-18],[-3,-10],[-7,-11],[-2,-5],[-11,-29],[-1,-3],[-9,-18],[-5,-10],[-11,-17],[-5,-9],[-6,-11],[-5,-12],[-5,-11],[-4,-6],[-2,-3]],[[6158,1806],[5,7]],[[6163,1813],[11,-6],[9,-6],[46,-30],[3,0],[7,16],[3,-2],[5,-2],[3,-3],[3,-4],[0,-17],[1,-3],[55,-34],[11,-8],[6,-2],[32,-20],[14,-9],[3,3],[0,78],[-8,7]],[[6367,1771],[8,12],[0,6],[0,22],[0,25],[27,-16],[15,-9]],[[7674,2529],[-28,-35],[-19,-59]],[[7627,2435],[-8,7],[-2,2],[-1,1],[-1,1],[-2,1],[-3,3],[-2,1],[-19,20],[-7,10],[-6,12],[-2,9],[2,14]],[[7576,2516],[1,1],[2,1],[3,0],[2,2],[2,1],[5,5],[6,7],[10,17],[3,4],[13,19]],[[7623,2573],[20,-20],[17,15],[2,1],[14,12],[-8,7],[29,36],[25,29],[2,3],[-26,24]],[[7698,2680],[6,8],[30,40],[4,5]],[[7738,2733],[13,28],[14,25]],[[7765,2786],[15,-11],[2,-1],[22,-20],[19,-17],[2,-2],[7,-6],[1,-1],[3,-3],[1,0],[2,-2],[17,-17]],[[7856,2706],[-14,-16],[-5,-7],[-7,-10],[-10,-17]],[[7698,2680],[-10,-14]],[[7688,2666],[-38,28]],[[7650,2694],[15,22],[17,24]],[[7682,2740],[15,21]],[[7697,2761],[41,-28]],[[6192,2521],[-1,-3],[-8,-17],[-9,-19],[-5,-17]],[[5566,1320],[-9,99],[-8,90],[-18,1],[-1,-4],[-6,-3],[-3,0],[-9,-1]],[[5512,1502],[-1,15],[0,2],[0,5]],[[6426,3903],[-4,-8]],[[6421,3896],[4,13],[22,56],[10,26],[8,24],[2,5],[2,5],[6,16],[3,10],[2,6],[2,5],[1,4],[2,3],[1,3],[1,4],[1,2],[2,6],[0,1],[2,7],[11,47],[2,9]],[[6505,4148],[6,-3],[2,0],[2,-1],[19,-9]],[[6534,4135],[-1,-3],[-8,-24],[-9,-23],[-7,-21],[-8,-23],[-7,-21],[33,-16]],[[6527,4004],[-1,-11],[0,-8],[0,-6],[-1,-7],[-2,-7]],[[6523,3965],[-3,0],[-3,-1],[-2,-1],[-2,-3],[-35,17],[-28,-80],[-20,9],[-3,2],[-1,-5]],[[6153,3930],[-19,-2],[0,3],[-2,1],[-9,1],[-24,11]],[[6099,3944],[3,9],[2,5],[1,4],[3,8],[5,14],[1,5],[0,5],[-2,8],[-4,10],[-2,5],[-3,4],[-4,2],[-16,8]],[[6083,4031],[11,29]],[[6094,4060],[12,-6],[28,-19],[18,-10]],[[6152,4025],[1,-48],[0,-11],[0,-13],[0,-14],[0,-1],[0,-8]],[[7062,7388],[-18,28]],[[7044,7416],[14,15],[6,7],[3,3],[3,4],[5,6],[6,7],[3,4],[6,7],[17,23],[4,5],[6,8],[1,1],[3,5],[7,8]],[[7128,7519],[58,-72],[8,-11],[3,-3]],[[7197,7433],[-8,-8],[-5,-5],[-14,-13],[-27,-23],[-6,-5],[-30,-25],[-1,2],[-30,46],[-14,-14]],[[6260,2371],[33,69],[0,1],[2,7],[1,3]],[[6296,2451],[45,-29]],[[6155,2366],[61,-39],[6,-2],[20,1],[3,-1]],[[6195,2210],[-6,4],[-11,7],[-38,-3],[-5,-1],[-4,-2],[-8,-1],[-29,-2]],[[6489,6147],[-16,25],[-1,-8]],[[6472,6164],[1,10],[2,13],[1,34],[1,9],[12,23],[11,17],[2,4],[8,13],[7,10],[4,11],[7,19],[1,6],[3,13],[3,5],[2,9],[2,9],[3,4],[3,4],[6,4],[5,10],[3,6],[3,3],[5,3],[6,11],[5,6],[14,21],[10,10],[4,7],[2,5],[3,7],[2,0],[0,15],[4,10],[1,3]],[[6618,6498],[1,-1],[3,-3],[3,-3],[3,-3],[3,-3],[2,-4],[2,-1]],[[6635,6480],[-2,-3],[-7,-20],[-8,-17],[-13,-17],[-13,-16]],[[6592,6407],[-11,-14],[-13,-14],[-4,-5],[-1,-3],[-2,-3],[-1,-11]],[[6560,6357],[-3,-26],[-3,-10],[-5,-14],[-9,-21]],[[6540,6286],[-14,-20],[-8,-14],[-7,-14],[-3,-5],[-2,-8],[-3,-10],[-2,-7]],[[6501,6208],[-6,-28],[-6,-33]],[[7493,7356],[12,-20],[49,-78],[50,-79],[4,-3],[2,-5],[30,-47],[3,-3],[1,-1],[1,-2]],[[7471,6984],[-2,2],[-5,11],[-45,101],[-10,16],[-14,22]],[[7395,7136],[-23,37],[-32,51]],[[7340,7224],[-2,3],[-71,102]],[[7267,7329],[-70,104]],[[7197,7433],[4,4],[22,26]],[[7223,7463],[28,31],[29,34],[17,20],[2,2],[15,17]],[[7314,7567],[13,-21],[50,-77]],[[7377,7469],[50,-78],[36,-56],[2,-3],[15,13],[13,11]],[[7912,5473],[-10,-19]],[[7233,6187],[-39,28],[-5,4],[-22,17],[-5,2],[-26,17],[-33,42],[-30,9]],[[7073,6306],[15,29],[24,46],[6,12]],[[7118,6393],[16,29],[13,25],[12,24]],[[7276,6266],[-7,-13]],[[5894,3747],[-3,3],[-2,12],[-4,5],[-8,9],[-29,29]],[[5848,3805],[-54,58]],[[5794,3863],[-56,59]],[[5738,3922],[12,14],[12,17],[14,17],[14,17]],[[5790,3987],[26,-28],[2,-2],[-6,-8],[-6,-7],[-2,-1],[28,-30],[23,-24]],[[5855,3887],[-13,-17],[15,-17],[17,-17],[9,-9],[3,-4],[36,-37],[3,-3]],[[5925,3783],[-11,-14],[-10,-11],[-10,-11]],[[7382,2444],[-13,-18],[-12,-17]],[[5710,3061],[-3,7],[22,5],[13,3],[13,1],[24,2],[23,1],[60,4],[15,0],[-3,4],[-3,4],[0,9],[0,2],[2,10],[37,48]],[[5967,3218],[16,-16],[50,-52],[2,-2],[3,-3]],[[6038,3145],[-7,-8],[-10,-10],[-10,-10],[-8,-6],[-9,-7],[-8,-5],[-10,-5],[-8,-3],[-9,-4],[-10,-3],[-5,-2],[-6,-1],[-10,-2],[-11,-1],[-16,-1],[-1,0],[-1,0],[-7,0],[-18,-1],[-20,-1],[-22,-1],[-13,0],[-12,-1],[-21,-1],[-17,-1],[-14,-2],[-7,0],[-4,-1],[-5,-1],[-6,-1],[-7,-1],[-5,-1],[-5,-2],[-6,-1]],[[5641,3296],[17,-17],[-14,-18]],[[5644,3261],[-5,-7],[-5,-8],[-3,-10],[-1,-9],[1,-9],[3,-7]],[[5634,3211],[-13,1],[-12,-18],[9,-12],[-17,-9]],[[5601,3173],[1,4],[-5,11],[-3,3],[11,15],[3,4],[3,6],[1,4],[0,7],[-1,7],[0,9]],[[5611,3243],[7,16],[9,12],[1,3],[-1,3],[-19,21],[-8,2],[-14,4],[-2,1],[-5,4],[-10,11]],[[5569,3320],[22,29]],[[5591,3349],[35,-37],[15,-16]],[[5710,3061],[-6,-1],[-5,-2],[-6,-2],[-6,-2],[-4,-1],[-4,-2],[-4,-1],[-7,-3],[-5,-2],[-2,-1],[-4,-2],[-11,-5],[-6,-3],[-4,-2],[-10,-6],[-11,-5],[-10,-5],[-2,-2],[-3,-1],[-2,2],[-3,4],[-2,2],[-10,10],[-14,15],[-13,15],[-6,10],[-2,6],[-3,7],[-3,9],[-3,13],[-2,12],[-6,25]],[[5531,3143],[42,16],[5,2],[20,8],[1,1],[1,1],[1,2]],[[5634,3211],[-8,-10],[-3,-4],[0,-2],[0,-2],[1,-3],[47,-48],[1,-1],[2,0],[2,0],[8,12],[1,3],[-1,13],[6,1],[6,2],[5,3],[5,5],[21,28]],[[5727,3208],[15,-15],[15,-16]],[[5757,3177],[17,-18]],[[5774,3159],[15,-16],[23,29],[14,-16],[-23,-31],[12,-13],[5,0],[36,49]],[[7239,1392],[7,-5],[27,-20]],[[9682,8897],[-40,12],[-2,-14],[-34,10],[-6,1]],[[9600,8906],[5,8],[1,9],[9,48],[1,5],[5,17],[0,8],[5,23],[9,46],[1,5],[10,96],[0,8],[-2,0],[-2,0],[-1,1],[3,10],[3,16],[1,61],[2,43]],[[9650,9310],[2,-1],[40,-11],[5,5]],[[9600,8906],[4,24],[4,21],[4,21],[5,20],[2,10],[-1,11],[-2,22],[-43,11]],[[9573,9046],[-65,18],[-2,-3]],[[9506,9061],[-7,-4],[-15,-5],[-2,-10],[-6,-8],[-12,-63],[20,-6],[2,-2]],[[9486,8963],[-5,-23]],[[9481,8940],[-36,9],[-6,2]],[[9439,8951],[23,111]],[[9473,9112],[6,-2],[18,-5],[-1,-7],[0,-3],[1,-3],[3,2],[20,7],[22,8],[20,7],[13,6],[10,6],[6,5],[7,6],[5,6],[2,7],[-39,11],[-18,5],[-18,5],[-18,5],[-19,1],[-6,1]],[[9547,8921],[5,24],[4,21],[4,21],[4,20],[5,19],[4,20]],[[9600,8906],[-20,6],[-5,1],[-28,8]],[[9547,8921],[-66,19]],[[9486,8963],[5,21],[4,21],[4,21],[4,19],[2,9],[1,7]],[[9434,8928],[5,23]],[[9547,8921],[-5,-23],[-5,-24],[-4,-22]],[[9533,8852],[-66,18],[-4,-21],[-27,7],[-13,4]],[[9302,8735],[5,25],[5,22],[8,53],[6,25],[5,24]],[[9423,8860],[0,-4],[-2,-17],[-1,-6],[-5,-24]],[[9415,8809],[-3,-16],[-12,-59],[-4,-11],[-4,-11],[0,-1]],[[9392,8711],[-5,1],[-19,5],[-30,9],[-15,3],[-21,6]],[[9432,8700],[-38,10],[-2,1]],[[9415,8809],[38,-10]],[[9453,8799],[-6,-29],[-1,-5],[-11,3],[-3,-14],[11,-3],[0,-3],[-5,-24],[-3,-17],[-3,-7]],[[9514,8759],[-10,-52]],[[9504,8707],[-5,-25]],[[9499,8682],[-67,18]],[[9453,8799],[4,24],[66,-19]],[[9523,8804],[-5,-24],[-4,-21]],[[9533,8852],[-4,-22]],[[9529,8830],[-1,-3],[-3,-15],[-2,-8]],[[9529,8830],[76,-21],[2,-1]],[[9607,8808],[0,-3],[3,-24]],[[9610,8781],[2,-26],[4,-45],[-25,7],[4,17],[-2,3],[-56,16],[-23,6]],[[9600,8906],[0,-24],[2,-25],[3,-25],[2,-24]],[[9644,8668],[-3,24],[-5,32],[0,7],[-3,20],[0,11],[0,13],[-23,6]],[[9695,8890],[-2,-4],[0,-6],[0,-16],[1,-5],[-2,-10],[0,-20],[2,-19],[-3,-6],[0,-9],[2,-10],[1,-7],[0,-1],[-2,-10],[-4,-10],[1,-25],[2,-7],[-1,-11],[4,-10],[0,-13],[-1,-9],[2,-7],[2,-10],[-1,-7],[2,-3]],[[9644,8668],[-19,5],[-5,2],[3,-27],[-59,16]],[[9564,8664],[5,25],[-42,11],[-23,7]],[[9490,8638],[4,20],[5,24]],[[9564,8664],[-5,-24],[-3,-19]],[[9556,8621],[-49,13],[-17,4]],[[9486,8616],[4,22]],[[9556,8621],[16,-5],[4,18],[3,1],[33,-9],[2,-1],[0,-2],[2,-19],[2,-18],[-1,-2],[-2,-1],[-64,17],[-65,16]],[[8996,3934],[12,-63],[1,-4],[53,-282],[38,-209],[4,1],[24,-132],[23,-100],[-27,-16],[0,-27],[2,-1],[-13,4],[-47,24],[-17,11],[-21,18],[-30,31],[-13,17],[-10,15],[-8,13],[-13,22],[-8,16],[-3,12],[-9,22],[-11,45],[-3,22],[-3,24],[-1,22],[1,23],[0,18],[4,20],[3,22],[1,4],[0,3],[0,1],[1,5],[5,9],[4,13],[6,19],[11,40],[6,44],[0,34],[0,6],[-3,66],[-8,103],[-7,97],[0,8],[0,5],[0,4],[3,6],[4,1],[10,-4],[4,0],[5,4],[12,7],[1,1],[-19,106],[1,9],[1,1],[5,-1],[25,-127],[5,-3],[2,-9],[1,-7],[-1,-1],[-3,-3],[0,-9]],[[9038,3405],[-1,6],[-11,1],[-11,1],[-1,-3],[-27,3],[-3,1],[-3,0],[0,32],[1,3],[0,3],[1,10],[2,7],[2,18],[2,7],[1,5],[2,3],[0,6],[2,4],[0,4],[0,6],[0,1],[10,33],[6,32],[-11,33],[-21,2],[-4,-31],[-4,-19],[-10,-37],[-1,-5],[-6,-29],[-2,-10],[-3,-21],[-1,-15],[-2,-26],[-1,-5],[0,-21],[0,-2],[0,-17],[12,0],[17,-1],[0,-31],[0,-2],[5,0],[0,-30],[-1,-1],[-3,-9],[-7,0],[-3,-1],[-2,-3],[0,-26],[1,-6],[2,-3],[2,-2],[2,0],[1,2],[0,6],[2,4],[2,3],[11,0],[1,0],[2,4],[2,13],[1,2],[2,1],[3,-2],[2,-4],[1,-4],[2,-8],[3,-22],[-2,-1],[0,-7],[-3,-3],[-5,-1],[-6,3],[-3,-1],[-2,-3],[3,-4],[1,-1],[1,-2],[5,-7],[3,-5],[2,-4],[0,8],[-1,8],[1,4],[3,4],[3,0],[3,-2],[3,-2],[0,-3],[2,-2],[-2,-7],[-2,-9],[3,-7],[3,-6],[4,-1],[2,-6],[0,-6],[4,-9],[2,-4],[4,-2],[1,-4],[2,-1],[4,-1],[6,1],[1,0],[5,6],[1,5],[-2,21],[1,9],[-2,7],[-5,12],[0,8],[4,10],[0,9],[-2,5],[0,9],[2,11],[0,11],[-4,20],[-3,37],[0,37],[-1,6]],[[8980,3810],[102,-565],[12,-65],[27,7],[-10,58],[-105,572],[-26,-7]],[[8960,3872],[1,-1],[1,1],[3,2],[3,4],[10,0],[5,-4],[3,0],[-1,15],[-1,3],[2,3],[-2,10],[-6,8],[-4,3],[-6,0],[-1,-1],[-9,-12],[1,-10],[1,-3],[-1,-3],[1,-15]],[[8953,3313],[0,1],[-2,0],[-1,3],[-4,4],[-4,0],[-1,-2],[0,-6],[1,-3],[3,-3],[3,0],[4,3],[1,1],[0,2]],[[8794,4165],[1,-13],[4,-1],[5,1],[3,-1],[8,-2],[8,-2],[9,-2],[4,-1],[3,-4],[3,-3],[1,-5],[1,-16],[1,-6],[3,0],[6,-1],[5,-3],[4,-3],[5,-3],[3,-3],[3,-3],[2,-1],[3,-3],[1,1],[0,3],[3,2],[1,0],[1,-4],[7,-139],[2,-13],[4,-44],[2,-14],[11,-37],[1,-19],[12,-90],[-1,-15],[-2,-6],[-3,-10],[0,-6],[-4,-8],[-1,-4],[-1,-12],[-3,-29],[-6,-40],[-14,-54],[-5,-21],[-3,-13],[-9,-37],[-2,-6],[-1,-5],[-1,-3],[-8,-9],[-3,-2],[-2,0],[-7,-1],[-6,0],[-4,1],[-5,2],[-7,8],[-14,25],[-2,6],[-26,51],[-6,25],[-19,90],[-9,37],[1,57],[6,62],[1,36],[0,3],[-1,2],[1,7],[-4,27],[-3,8],[-5,18],[-2,16],[-3,15],[0,1],[-2,20],[-1,3],[-4,9],[-1,11],[1,22],[4,17],[5,39],[6,20],[7,21],[19,47],[34,73],[3,4],[3,2],[6,12],[0,6],[5,8],[1,5],[5,7],[5,6],[3,3],[20,0],[8,-5],[3,-5],[3,-7],[2,-13],[3,-49],[-3,-6],[-6,-7],[-57,7],[-17,-31],[-2,-6]],[[8983,3495],[-1,-13],[-4,-21],[-1,-8],[0,-3],[1,-3],[-1,-14],[-2,-17],[-18,1],[-8,0],[0,12],[1,12],[2,15],[4,31],[10,-2],[1,9],[-9,2],[0,5],[1,5],[2,5],[-1,6],[3,3],[1,4],[0,6],[-1,3],[11,36],[7,30],[2,17],[15,-4],[8,-20],[-3,-14],[-13,-54],[-5,-10],[2,-5],[1,-3],[-2,-2],[-2,-6],[-1,-3]],[[8988,3410],[-1,-32],[17,-1],[-3,-27],[-1,-7],[-1,-2],[-5,-4],[-12,-1],[0,20],[-5,0],[1,38],[-12,1],[-1,-6],[-8,1],[-9,1],[0,11],[0,10],[9,0],[27,-1],[4,-1]],[[8879,4108],[-1,1],[-1,2],[-1,25],[-2,37],[2,8],[1,3],[3,-1],[3,-4],[1,-5],[-1,-16],[-2,-6],[2,-39],[-4,-5]],[[9137,3084],[-6,17],[2,-3],[5,-13]],[[8620,3881],[-23,-113],[1,-1],[-3,-12]],[[8595,3755],[-15,5],[-6,2]],[[8574,3762],[-40,11],[0,4],[0,1],[2,7],[2,2],[-8,1],[-2,0],[-6,-2],[-5,-3],[-7,-6],[-6,-6],[-2,-1],[-3,-4],[-3,-5],[-5,-8],[-3,-11]],[[8488,3742],[-5,3],[-1,1],[-4,3],[-4,4],[-22,16],[-25,19]],[[8427,3788],[-4,3],[-43,32]],[[8380,3823],[8,15],[8,15]],[[8396,3853],[46,-35],[11,13],[9,14]],[[8462,3845],[13,22],[10,20],[6,10]],[[8491,3897],[7,12],[12,22],[14,24]],[[8524,3955],[2,-3],[12,-15],[8,-5],[15,-9],[3,-1],[3,-2],[7,-5],[5,-1],[23,-18],[9,-4],[9,-11]],[[8396,3853],[8,15],[8,15]],[[8412,3883],[10,-7],[14,-11],[26,-20]],[[6830,4348],[17,49],[3,4],[12,35]],[[6862,4436],[29,85],[2,2],[3,10],[2,3]],[[6898,4536],[43,-21],[8,-4],[9,-4]],[[6958,4507],[62,-31]],[[7020,4476],[44,-20],[13,-7]],[[7077,4449],[-1,-3],[-4,-13],[-2,-5],[-36,-102],[-10,-27],[-1,-5]],[[7023,4294],[-61,18]],[[8089,3915],[6,13],[-66,50]],[[8029,3978],[7,12]],[[8036,3990],[43,-32],[23,-18]],[[8102,3940],[9,-7],[29,-22]],[[8140,3911],[-7,-12],[-6,-11],[-33,25],[-5,2]],[[8152,3903],[-14,-25]],[[8138,3878],[-2,-2],[-4,-4],[-17,-23]],[[8115,3849],[-29,22]],[[8086,3871],[-16,12],[-66,49]],[[8004,3932],[6,11],[4,8]],[[8014,3951],[59,-44],[3,-3],[5,-3],[8,14]],[[8140,3911],[12,-8]],[[8014,3951],[4,7],[5,8],[6,12]],[[8172,3805],[-10,8],[-14,11],[-3,2],[-10,8],[-6,5]],[[8129,3839],[-9,7],[-5,3]],[[8138,3878],[5,-1],[36,-27],[5,-3]],[[8184,3847],[-1,-4],[-1,-3],[-1,-4],[-9,-31]],[[8152,3903],[10,-8],[18,-14],[11,-8]],[[8191,3873],[-7,-26]],[[8094,3750],[-8,-15]],[[8086,3735],[-50,39]],[[8036,3774],[3,6],[4,9],[8,15],[3,7],[5,9]],[[8059,3820],[41,-32],[11,-8]],[[8111,3780],[-6,-10],[-3,-5],[-8,-15]],[[8071,3704],[-1,2],[-33,24],[-7,5],[-10,8]],[[8020,3743],[1,3],[7,13],[8,15]],[[8086,3735],[8,-6]],[[8094,3729],[-8,-14],[51,-38]],[[8142,3693],[-4,3],[-40,30],[-4,3]],[[8094,3750],[12,-11],[14,-11],[22,-19],[4,-2]],[[8111,3780],[6,-4],[10,-7],[19,-15],[10,-8]],[[9697,9303],[3,20],[1,5],[2,8],[1,6],[5,32]],[[9709,9374],[5,33],[2,7],[6,40],[1,7]],[[9723,9461],[4,24]],[[9727,9485],[41,-10],[20,21],[17,23],[11,15],[15,25]],[[9831,9559],[25,42],[7,11],[2,12]],[[9865,9624],[4,20],[-8,13],[-1,5],[2,12]],[[9862,9674],[4,22],[5,23],[7,38],[-14,3],[2,15],[14,-2],[4,23]],[[9884,9796],[1,6],[1,7],[8,33],[4,14],[12,48],[3,5],[5,12],[-15,-5],[-17,-5],[-25,-8]],[[9861,9903],[-8,-2]],[[9850,9931],[2,2],[2,-1],[2,-1],[2,-2],[10,0],[16,4],[8,3],[20,11],[3,1],[7,5],[6,3],[1,0],[7,-1],[6,-3],[6,2],[6,10],[6,5],[17,3],[4,4],[3,-1],[2,0],[4,4],[5,0],[4,-2],[0,-5],[-4,-7],[-2,-5],[-6,-14],[-11,-14],[-3,-6],[-4,-7],[-3,-1],[-6,-20],[-6,-3],[-3,-3],[-2,-12],[0,-10],[-3,-12],[-4,-5],[0,-13],[-1,-7],[-3,-4],[0,-2],[0,-1],[-6,-7],[-1,-8],[-3,-4],[-3,-8],[0,-3],[0,-5],[0,-11],[-3,-3],[-4,-9],[0,-11],[-2,-9],[-5,-22],[-2,-22],[-2,-8],[-6,-14],[-4,-19],[-5,-9],[-10,-27],[-4,-7],[-6,-4],[-2,-2],[-6,-10],[-5,-7],[-1,-6],[1,-6],[-8,-5],[-5,-10],[-6,-9],[-6,-6],[-7,-13],[-4,-5],[-5,-13],[-7,-6],[-2,-9],[4,-6],[1,-1],[-2,-3],[-5,-4],[0,-6],[-4,-2],[-9,1],[-6,0],[-10,-16],[-2,-11],[-6,-10],[-2,-4],[-1,-3],[-4,-6],[-6,-4],[-1,0],[-1,0],[-7,-14],[0,-7],[-1,-7],[0,-5],[-1,-3],[-3,-5],[-3,-12],[-1,-3],[-1,-10],[0,-4],[-1,-6],[-7,-13],[-1,-11],[0,-14],[-1,-6],[-1,-22]],[[9862,9674],[-28,6],[-13,4],[-9,2],[-9,8],[-8,8],[-19,20]],[[9776,9722],[10,6],[2,2],[5,6],[30,45],[15,23]],[[9838,9804],[46,-8]],[[9838,9804],[11,16],[5,10],[5,14],[4,15],[1,11],[0,10],[-3,23]],[[9865,9624],[-83,23],[-5,-25]],[[9777,9622],[-26,7],[4,26],[3,13],[1,5],[0,5],[3,16],[4,10],[4,8],[6,10]],[[9831,9559],[-22,6],[-25,6]],[[9784,9571],[4,24],[5,23],[-16,4]],[[9727,9485],[5,26]],[[9732,9511],[4,26],[4,24],[40,-10],[4,20]],[[9732,9511],[-4,3],[-60,15]],[[9673,9553],[0,4],[9,27],[9,23],[12,24],[4,7],[12,18],[17,21],[14,18],[13,18],[19,31],[7,15],[11,28],[9,36]],[[9723,9461],[-43,12],[-3,0],[-1,-3],[-3,-17],[-1,-17],[0,-8],[1,-6],[1,-10],[3,-13],[8,-24],[9,2],[15,-3]],[[9233,6314],[-7,-25],[-22,11],[-7,-23]],[[9197,6277],[-10,5],[-31,16],[-10,5]],[[9146,6303],[7,24],[8,23]],[[9274,6238],[-9,5],[-58,29],[-10,5]],[[9240,6335],[17,-9],[18,-8],[17,-9],[2,-1]],[[9294,6308],[-5,-18],[-5,-20],[-10,-32]],[[9293,6387],[21,-89],[-20,10]],[[9365,6386],[2,-11],[0,-11],[3,-6],[1,-12],[4,-11],[2,-19],[1,0],[6,-21],[2,-3],[9,2],[3,1],[4,0],[4,-3],[1,-1],[-1,5],[4,1],[27,-135]],[[9437,6162],[-43,20],[-3,2],[-5,1],[-4,2],[-35,17],[-8,1]],[[9339,6205],[-8,4],[-36,18],[-5,2],[-6,3],[-10,6]],[[9298,6153],[-45,23]],[[9253,6176],[3,7],[4,11],[8,21],[6,23]],[[9339,6205],[8,-30],[8,-30],[3,-12],[2,-12],[-26,13],[-36,19]],[[9253,6176],[-8,-15],[-72,36]],[[9173,6197],[5,16],[2,8],[4,12],[6,22],[7,22]],[[9298,6153],[-6,-16],[-4,-10],[-4,-10],[18,-10],[19,-4],[3,7],[4,9],[33,-18],[1,-2],[-1,-8],[-1,-11],[0,-2]],[[9360,6078],[-3,1],[-14,5],[-8,3],[-9,3],[-10,4],[-10,3],[-7,3],[-31,11],[-9,3],[-6,2],[-4,2],[-6,2],[-9,5],[-7,3],[-5,2],[-5,3],[-4,2],[-2,1],[-2,1],[-5,3],[-3,2],[-2,1],[-3,2],[-3,1],[-20,11],[-5,2],[11,-11],[-8,5],[-6,3],[-2,1],[-3,2],[-2,1],[-3,1],[-8,3],[-4,1],[-5,1],[-5,2],[-7,1],[-5,1],[-6,1],[-11,1],[-6,0],[-2,1],[-3,0],[-3,0],[-4,1],[-4,0],[-3,0],[-4,1],[-4,1],[-4,0],[-3,1],[-4,1],[-3,1],[-4,2],[-3,1],[-3,1],[-1,1]],[[9046,6184],[2,7]],[[9048,6191],[7,23],[2,7],[1,4],[3,10],[9,26],[14,48]],[[9084,6309],[5,-2],[-6,-23],[-6,-20],[-5,-16],[10,-6],[41,-20]],[[9123,6222],[-2,-11],[-3,-8],[14,-7],[12,-6],[24,-12],[5,19]],[[9123,6222],[2,17],[3,9],[4,11],[7,22],[7,22]],[[9084,6309],[7,23]],[[9091,6332],[5,-3],[10,-5],[31,-16],[9,-5]],[[9091,6332],[21,70],[20,65]],[[9084,6309],[-6,3],[-3,2],[-14,7],[-29,15]],[[9032,6336],[2,2],[7,22],[4,16]],[[9045,6376],[11,-6],[9,-4],[5,15],[8,27],[4,11],[4,12],[-13,7],[-7,4]],[[9066,6442],[2,5],[0,2],[1,1],[4,12],[2,4]],[[9075,6466],[7,-4],[28,-14],[10,-5],[7,24],[7,26]],[[9045,6376],[13,43]],[[9058,6419],[1,3],[3,9],[3,7],[1,4]],[[9668,8499],[-23,7],[-9,2]],[[9636,8508],[-96,24],[-1,0],[-1,-2],[-8,-38]],[[9530,8492],[-8,-40]],[[9522,8452],[-66,16]],[[9456,8468],[4,22],[12,59]],[[9472,8549],[14,67]],[[9636,8508],[2,-23],[-20,5],[4,-37],[-1,-4],[-4,0],[-70,18],[-2,1],[0,2],[3,17],[-18,5]],[[9644,8420],[-56,15],[-66,17]],[[9469,8308],[-16,25],[-12,20],[-4,16],[1,13]],[[9438,8382],[5,21],[5,23],[4,21],[4,21]],[[9648,8374],[-20,5],[-44,11],[-55,15],[-3,-1],[-2,-3],[-3,-18],[-5,-21]],[[9516,8362],[-11,2],[-3,-21],[-7,-34]],[[9495,8309],[-13,4],[-4,0],[-4,-2],[-5,-3]],[[9653,8327],[-77,19],[-60,16]],[[9631,8287],[-76,19],[-2,-12],[-19,5],[-20,5],[-19,5]],[[9475,8269],[2,12],[0,8],[-2,8],[-6,11]],[[7032,4840],[-4,3],[-4,3],[-21,15],[-21,16]],[[6982,4877],[-41,30],[-3,3],[-1,1],[-3,-2],[-7,-7],[-12,-11],[-7,-5],[-1,-3],[-8,-7]],[[6899,4876],[-8,-6],[-7,-7],[-7,-5],[-10,-7]],[[6867,4851],[-30,14],[-10,5],[-3,1],[0,1]],[[6824,4872],[5,4],[5,4],[4,3],[7,4],[4,3],[4,2],[9,3],[4,2],[4,2],[6,2],[6,1],[8,2],[10,3],[7,2],[7,3],[7,2],[6,3],[3,1],[2,1],[1,1],[3,1],[3,2],[4,3],[9,6],[3,2],[7,5],[10,9],[2,2],[11,10],[6,6]],[[6991,4966],[2,-4],[89,-65]],[[7082,4897],[-15,-19],[-18,-19],[-2,-3],[-5,-5],[-8,-10],[-2,-1]],[[8792,5843],[-9,5],[-62,34],[-8,4]],[[8713,5886],[3,10],[5,12]],[[8807,5880],[-15,-37]],[[8792,5843],[-8,-21]],[[8784,5822],[-9,5],[-9,5]],[[8766,5832],[-27,15],[-9,4],[-4,-9]],[[8726,5842],[-8,5],[-9,4],[-9,5]],[[8700,5856],[8,20],[5,10]],[[8709,5799],[9,22]],[[8718,5821],[4,10],[4,11]],[[8766,5832],[-4,-10],[-4,-10],[-9,5],[-9,5],[-13,-33]],[[8784,5822],[-21,-53]],[[8640,5863],[8,-5],[61,-33],[9,-4]],[[8648,5884],[9,-4],[35,-19],[8,-5]],[[8627,5896],[7,19]],[[8612,5852],[-3,2],[-11,6],[-31,17],[-14,8],[10,24],[-4,2],[1,3]],[[8560,5914],[6,15],[-8,5]],[[8597,5812],[-3,1],[-43,24],[-9,5],[-9,5]],[[8533,5847],[7,17],[-18,11],[20,49],[18,-10]],[[8533,5847],[-9,5],[-31,17]],[[8493,5869],[-21,12],[-19,10]],[[8496,5756],[-40,22]],[[8456,5778],[4,10],[4,11],[13,31],[8,20]],[[8485,5850],[8,19]],[[8533,5847],[-8,-20],[-8,-19],[-8,-21],[-5,-11]],[[8504,5776],[-4,-10],[-4,-10]],[[8485,5850],[-39,21],[-9,-19],[-40,21]],[[8397,5873],[8,20],[8,20]],[[8456,5778],[-41,23],[-8,-20],[-7,-17]],[[8324,5852],[11,26],[1,5]],[[8336,5883],[5,-2],[16,-9],[16,-9],[16,-9],[8,19]],[[8336,5883],[8,19]],[[8344,5902],[8,20],[8,20]],[[8344,5902],[-3,2],[-34,19],[-13,8],[8,19]],[[8302,5950],[8,20],[14,-8],[4,8],[2,2],[4,9]],[[8334,5981],[17,-9],[4,9],[2,2],[4,8],[14,-8],[2,-1]],[[8324,5852],[-3,1],[-31,17],[-73,41]],[[8217,5911],[7,18],[24,67],[18,48]],[[8266,6044],[17,-10],[-16,-40],[-8,-19],[43,-25]],[[8266,6044],[7,21]],[[8273,6065],[11,-7],[51,-28]],[[8335,6030],[-8,-20],[14,-8],[-4,-8],[1,-4],[-4,-9]],[[8335,6030],[9,22],[28,-16]],[[8273,6065],[3,7],[5,13]],[[8281,6085],[6,20]],[[8287,6105],[20,-12],[26,-14],[15,-8]],[[8287,6105],[5,14],[7,20],[13,36],[1,3]],[[8281,6085],[-3,2]],[[8278,6087],[-3,1],[-7,4],[-9,5],[-12,6],[0,10]],[[8247,6113],[7,20],[15,42],[15,-7],[7,18],[1,3]],[[8292,6189],[3,-1],[16,-9],[2,-1]],[[7547,5461],[-53,39],[-3,2],[-2,1],[-3,2],[-2,2],[-2,2]],[[7482,5509],[9,16],[9,17],[11,16],[3,3]],[[7514,5561],[3,7],[5,10],[2,3],[3,-2],[2,-2],[3,-2],[23,-16],[9,-9],[2,-3],[4,-3],[15,-11]],[[7585,5533],[-1,-3],[-10,-18],[60,-44]],[[7585,5533],[9,16],[8,16],[4,7]],[[7606,5572],[60,-44]],[[7606,5572],[5,8]],[[7611,5580],[9,-6],[19,36],[6,4],[6,-1],[8,-6],[15,-11],[21,-14],[10,18]],[[7705,5600],[50,5],[8,-4],[7,-5]],[[7611,5580],[-6,5],[12,22],[-2,9],[6,4],[10,11],[16,4],[10,0],[48,-35]],[[7729,5708],[1,-10],[-1,-5],[-18,-33],[23,-18],[12,13],[12,6],[12,4],[12,-3]],[[7782,5662],[10,-3],[6,-5]],[[7606,5572],[-53,39],[-4,3]],[[7637,5775],[3,-2],[7,-5],[36,-26],[3,-2],[2,-2],[2,-1],[8,-4],[3,-1],[3,0],[8,-1],[10,-1],[3,1],[2,0],[0,-3],[0,-3],[2,-17]],[[7729,5708],[13,1],[4,0],[42,-30],[-5,-10],[-1,-7]],[[7777,5747],[-2,-4],[-3,-5],[0,-2],[1,-1],[1,-1],[47,-35]],[[7660,5817],[3,-2],[3,-2],[49,-36],[39,-29],[2,-1],[1,-2],[1,-3],[2,1],[5,2],[3,1],[4,0],[5,1]],[[7679,5853],[3,-1],[2,-2],[27,-19]],[[7711,5831],[23,-18],[58,-41],[-10,-18],[-5,-7]],[[7711,5831],[1,4],[8,13],[9,16],[2,1],[3,-1],[30,-22],[7,5]],[[7771,5847],[6,-3],[4,-7],[16,-13],[11,8],[29,-21],[7,20],[4,11],[5,8]],[[7853,5850],[17,-13]],[[7771,5847],[1,17]],[[7772,5864],[7,0],[11,5],[5,6],[6,13]],[[7801,5888],[12,-9],[27,-20],[13,-9]],[[7801,5888],[-17,13],[-2,1],[10,18]],[[7792,5920],[9,18],[3,5],[2,4],[0,2],[0,3],[-1,4]],[[7772,5864],[-8,2],[-5,4],[-47,33],[5,9],[7,11],[7,8],[2,2],[3,2],[7,4],[24,7],[-1,-8],[26,-18]],[[7679,5853],[13,24],[16,29],[0,1],[19,34],[17,31],[1,3]],[[7636,5886],[22,41],[26,47],[-15,11]],[[7669,5985],[16,32],[2,3]],[[7687,6020],[10,-8],[1,-1],[29,-25],[4,-3],[3,-2],[5,-2],[3,-2],[3,-2]],[[7621,5897],[10,22],[-11,8],[-8,0]],[[7612,5927],[1,22],[3,10],[4,11],[3,9],[0,13]],[[7623,5992],[8,2],[7,-1]],[[7638,5993],[25,-18],[6,10]],[[7562,5946],[11,19],[9,16],[-1,5],[-14,10],[11,19],[9,19]],[[7587,6034],[21,-16],[9,-9],[1,-3],[5,-14]],[[7612,5927],[-17,0],[-7,1],[-4,1],[-22,17]],[[7587,6034],[-15,10]],[[7572,6044],[12,21],[13,13]],[[7597,6078],[9,-14],[1,-5],[-6,-5],[1,-5],[13,-10],[3,1],[3,4],[2,1],[13,-12],[14,-13],[1,-5],[-13,-22]],[[7597,6078],[14,13],[2,3]],[[7613,6094],[2,-3],[9,-12],[9,-10],[10,-11],[13,-13],[15,-13],[16,-12]],[[7613,6094],[-2,4],[-11,16],[-5,9],[-10,17],[-2,4]],[[6559,2837],[-53,39]],[[6506,2876],[11,22],[14,24],[10,18],[6,11]],[[6489,2725],[-19,5],[-10,7],[-6,9],[-2,10],[0,6],[3,7],[19,35],[12,22],[-11,8]],[[6475,2834],[13,20],[3,0],[0,5],[11,20],[4,-3]],[[6559,2837],[-12,-23],[-13,-23],[-15,-22],[-11,-18],[-15,-15],[-4,-11]],[[6489,2725],[-2,-8],[-2,-22]],[[6485,2695],[-18,-3],[-9,-6],[-10,-9],[-10,-16],[-4,-18],[0,-14]],[[6434,2629],[-9,0],[-11,-1],[1,-75],[4,-4],[5,-3],[58,-43],[4,0],[10,19]],[[6496,2522],[11,-8],[2,-1]],[[6492,2483],[-1,1],[-68,50],[-4,0],[-13,16],[-5,4]],[[6399,2727],[12,-4],[14,-9],[19,37],[-8,6],[39,77]],[[9334,6927],[-22,6]],[[9492,7435],[10,15],[12,18],[2,3],[10,16],[2,3],[20,30],[31,-10],[2,11],[5,13],[7,30],[-13,4],[14,20],[14,22]],[[9641,7660],[15,-3],[17,-6],[10,-3]],[[9683,7648],[-3,-6],[-3,-13],[1,-2],[0,-2],[-4,-4],[-1,-3],[1,-2],[11,-10],[21,35],[5,-2],[-36,-57],[-5,-7],[-3,3],[1,1],[-1,3],[-2,0],[-13,-10],[-5,-4],[-4,-5],[-12,-10],[-5,-2],[-5,-3],[0,-3],[-2,-7],[0,-2],[8,-4],[0,-1],[-4,-2],[-4,1],[-2,3],[-2,0],[-1,-1],[-3,-4],[-2,-2],[-1,-2],[1,-6],[2,-3],[8,-4],[1,-2],[1,-1],[-1,-1],[-2,0],[-2,0],[-5,4],[-2,0],[-1,-1],[-3,-3],[-1,-4],[0,-15],[-3,-3],[-5,-14],[2,-3],[7,-1],[4,4],[1,9],[3,-1],[0,-3],[2,-1],[2,-5],[5,9],[3,-2],[-36,-56],[-2,2],[-1,0],[-16,-9],[0,-3],[-1,-1],[-7,2],[0,1],[-1,0],[-31,-27],[-4,-9],[1,-8],[46,16],[1,-5],[-50,-17],[-2,-5],[-1,-6],[-2,-1],[-3,-2],[-10,-10],[-4,-18],[0,-1],[9,-5],[5,-7],[4,-4],[2,-5],[3,0],[14,22],[4,-3],[-19,-28],[-6,-9],[-30,-46],[-4,-10],[-34,-81],[-11,-26],[-3,-9],[-22,-92],[-22,-94],[-4,1],[1,2],[-4,0],[-3,-1],[0,-4],[-6,-1],[-2,0],[-1,-3],[0,-1]],[[9774,7870],[0,-4],[-1,-1],[0,-1],[-2,-10],[8,-8],[-4,0],[-4,3],[-4,2],[-2,0],[-2,-1],[-2,-1],[-8,-14],[-3,-5],[-3,-9],[-3,-5],[-9,-9],[-5,-7],[-8,-18],[-2,-8],[0,-4],[-6,-16],[0,-1],[-2,-12],[-5,-7],[-10,-8],[-4,-6],[-7,-14],[0,-4],[0,-7],[11,-8],[2,-5],[-1,-3],[-2,-2],[-6,-15],[-3,-3],[-4,-10],[0,-1]],[[9261,6900],[14,44]],[[9203,6858],[5,16],[5,17],[6,22],[7,25],[5,16],[1,2]],[[9162,6870],[4,16],[6,16],[6,22],[7,25],[5,19]],[[9116,6865],[5,17],[5,16],[5,16],[6,22]],[[9137,6936],[6,25],[5,19]],[[9156,6852],[-7,3],[-24,7],[-9,3]],[[9066,6863],[5,16],[9,-2],[36,-12]],[[9047,6869],[-11,4],[-11,4],[3,8],[3,7],[4,14]],[[9035,6906],[5,16]],[[9040,6922],[33,-9],[8,-2],[6,16],[6,22],[9,-3],[25,-7],[10,-3]],[[9066,6863],[-9,3],[-10,3]],[[9040,6922],[2,9],[2,8],[7,22],[7,23],[5,18]],[[8990,6920],[6,15],[4,13],[1,4],[1,2],[6,19],[8,24],[6,18]],[[9035,6906],[-9,3],[-28,8],[-8,3]],[[9047,6869],[-8,-25],[-11,4],[-11,5],[-8,-20],[-41,17]],[[8968,6850],[2,7],[7,23]],[[8977,6880],[7,19],[6,21]],[[9049,6805],[-3,-8],[-9,4],[-33,14]],[[9004,6815],[-41,18],[0,1]],[[8963,6834],[5,16]],[[9074,6740],[-32,15],[-9,5],[-8,4],[-33,16]],[[8992,6780],[6,17],[6,18]],[[8950,6799],[7,17],[6,18]],[[8992,6780],[-9,-25],[-8,-22],[-9,5],[-23,11],[-9,4]],[[9008,6691],[-9,5],[-23,11],[-9,5],[-9,4],[-23,11],[-8,5]],[[9001,6670],[-8,-21],[-9,5],[-23,11],[-9,4]],[[8952,6669],[-9,5],[-23,10],[-9,5]],[[9034,6629],[-8,-23],[-9,-26],[-9,-25]],[[9008,6555],[-10,5],[-22,11],[-9,5]],[[8967,6576],[9,24],[9,26],[-9,4],[-23,12],[-9,4],[8,23]],[[8967,6576],[-9,4],[-23,11],[-10,5]],[[8925,6596],[-9,4],[-23,12],[-8,4]],[[8990,6507],[-8,-24],[-9,5],[-23,11],[-9,4]],[[8925,6596],[-8,-25],[-8,-24],[31,-15],[10,-5],[8,-4],[23,-11],[9,-5]],[[9049,6535],[-9,-25]],[[9040,6510],[-9,5],[-23,11],[-9,5],[-9,-24]],[[9008,6555],[9,-4],[13,-6],[10,-5],[9,-5]],[[9058,6419],[-2,1],[-13,7],[-8,4],[-19,9],[-16,-45],[-35,18],[-47,24]],[[9040,6510],[-8,-23],[8,-5],[23,-11],[10,-4],[2,-1]],[[9049,6535],[9,-5],[23,-11],[10,-5]],[[9032,6336],[-7,-23]],[[9025,6313],[-45,24],[-37,18],[7,18],[1,4],[-46,24]],[[9025,6313],[-10,-34],[-6,-23],[-1,-4],[-3,-10],[-3,-7]],[[9048,6191],[-1,0],[-3,-2],[-2,-1],[-2,-1],[-1,0],[0,1],[-3,1],[-2,2],[-3,1],[-3,3],[-3,2],[-3,2],[-2,3],[-1,0],[-1,1],[0,2],[-3,8],[-2,6],[-5,8],[-6,8]],[[9046,6184],[-15,-53],[-32,-108],[-9,-33],[-10,-50],[-7,-29],[-6,-29]],[[8886,5628],[-7,-20],[-28,-87],[-6,-18]],[[8845,5503],[-7,3],[2,6],[4,9],[2,6],[0,1],[4,10],[2,5],[4,13],[4,13],[3,9],[-3,2],[-1,1],[-6,3],[-15,8]],[[8838,5592],[6,9],[5,8],[6,13],[-9,5],[-8,4],[-10,5],[-9,5],[-9,5],[-13,7]],[[8797,5653],[8,20],[8,19]],[[8813,5692],[4,11],[25,69],[0,1],[16,46],[14,38]],[[8872,5857],[7,19],[1,1],[0,2],[1,2]],[[8872,5857],[-14,8],[-10,6],[-11,-27],[-19,10],[6,17],[-17,9]],[[5886,4124],[-6,3],[-16,8],[-18,8],[-12,-35],[0,-1],[0,-1],[26,-28],[-12,-16],[-13,-16]],[[5835,4046],[-18,-23]],[[5817,4023],[-14,14],[-13,15],[-14,14],[-3,3],[-12,12]],[[5761,4081],[31,41],[5,7],[13,27],[1,4],[6,16],[73,-34],[1,-1],[0,-3],[-5,-14]],[[5913,4145],[-1,-5],[-8,-24]],[[5904,4116],[-18,8]],[[5761,4081],[-13,14],[-30,31],[-3,3],[-16,18]],[[5699,4147],[-27,27],[-3,8]],[[5669,4182],[-1,14]],[[5668,4196],[22,5],[28,2],[23,1],[26,-2],[11,-1],[10,-2]],[[5788,4199],[5,-2],[15,-5],[3,-1],[5,-2],[36,-14],[1,-1],[8,-4],[52,-24],[0,-1]],[[5682,3982],[-61,63]],[[5621,4045],[11,15],[13,17]],[[5645,4077],[11,13],[10,14],[6,7]],[[5672,4111],[5,7],[9,12],[2,2],[11,15]],[[5761,4081],[-14,-17],[-14,-18],[-13,-18],[-26,-33],[-6,-7],[-6,-6]],[[5672,4111],[-15,15],[-11,-15],[-2,-1],[-2,1],[-27,29],[-4,16],[18,9],[19,8],[21,9]],[[5645,4077],[-2,2],[-58,62],[-4,-2],[-13,-12],[-11,11],[-3,4]],[[5554,4142],[61,35],[23,10],[26,8],[4,1]],[[5621,4045],[-66,69]],[[5555,4114],[-13,15],[-6,2]],[[5536,4131],[18,11]],[[8278,6087],[-9,-6],[-5,1],[-25,-10]],[[8169,6240],[2,-1],[15,-5]],[[8186,6234],[-1,-3],[0,-5],[10,-28],[9,4],[33,-13],[-11,-30],[14,-12],[5,-4],[1,-2],[1,-3],[0,-5],[0,-20]],[[8186,6234],[72,-29],[3,-1],[2,-1],[16,-6],[11,-6],[2,-2]],[[8195,6317],[72,-40],[9,21]],[[8276,6298],[45,-25],[8,21],[7,20],[7,21],[10,-5],[11,-6],[3,-2]],[[8211,6358],[73,-40]],[[8284,6318],[-8,-20]],[[8292,6339],[-8,-21]],[[8218,6378],[74,-39]],[[8234,6413],[70,-43]],[[8304,6370],[-4,-11],[-8,-20]],[[8332,6434],[-1,-3],[-6,-14],[-8,-20],[35,-19],[-9,-18],[-34,18],[-5,-8]],[[8371,6333],[-3,2],[-64,35]],[[6019,3434],[-11,10],[-6,20],[-12,-13],[-13,13]],[[5977,3464],[-4,5],[-5,2],[-6,7]],[[5962,3478],[12,16],[13,17]],[[5987,3511],[18,24],[16,21],[2,2]],[[6023,3558],[7,-6],[5,-8],[17,-18],[5,-4],[8,-7],[4,-2],[5,-4]],[[6074,3509],[-2,-2],[-15,-26],[-31,-39],[-7,-8]],[[7432,5545],[50,-36]],[[7459,5596],[12,-8],[30,-22],[5,-5],[3,0],[5,0]],[[7471,5617],[9,17],[8,14],[1,4]],[[7489,5652],[2,4]],[[7363,5696],[10,17]],[[7373,5713],[9,17]],[[7382,5730],[54,-39]],[[7436,5691],[53,-39]],[[7436,5691],[10,20],[6,10],[-54,39]],[[7398,5760],[8,11]],[[7382,5730],[10,20]],[[7392,5750],[4,7],[2,3]],[[7392,5750],[-9,6],[-1,0],[-17,12],[-16,12],[-8,6],[-2,3]],[[7339,5789],[3,7],[8,15]],[[7373,5713],[-54,39],[9,17]],[[7328,5769],[11,20]],[[7242,5785],[9,17],[9,17]],[[7260,5819],[68,-50]],[[7260,5819],[12,22],[10,18]],[[7282,5859],[16,-11]],[[7298,5848],[52,-37]],[[7298,5848],[18,32],[9,18],[25,-18]],[[7350,5880],[-2,-6],[-1,-18],[-2,-14],[-6,-12],[16,-11]],[[7282,5859],[5,9]],[[7287,5868],[13,26],[18,33]],[[7318,5927],[26,-17],[16,-12]],[[7360,5898],[-10,-18]],[[7360,5898],[8,-8],[13,-16],[11,-18]],[[7366,5916],[8,-5],[6,-4]],[[7380,5907],[15,-18],[22,-38]],[[7417,5851],[-14,-13]],[[7360,5898],[4,9],[2,9]],[[7392,5923],[13,-15],[10,-16],[16,-27]],[[7431,5865],[-5,-7],[-9,-7]],[[7380,5907],[3,7],[1,10],[8,-1]],[[7392,5923],[19,34]],[[7411,5957],[22,-17],[16,-11]],[[7449,5929],[-4,-10],[-3,-12],[-1,-15],[-4,-16],[-6,-11]],[[7366,5916],[0,7],[-2,8],[0,6],[0,7],[2,6],[3,7]],[[7369,5957],[12,22]],[[7381,5979],[15,-11],[15,-11]],[[7381,5979],[22,42],[10,14],[9,7],[2,2]],[[7424,6044],[3,-2],[12,-10],[6,-6],[5,-7],[4,-6],[3,-8],[3,-10],[2,-16]],[[7462,5979],[3,-28],[1,-7],[2,-10],[1,-3],[-3,-1],[-6,-3],[-5,-1],[-6,3]],[[7369,5957],[-17,13],[10,19],[-1,5],[-18,14]],[[7343,6008],[14,9],[10,18],[9,17],[10,17],[1,2]],[[7387,6071],[16,-12],[18,-13],[3,-2]],[[7490,6111],[9,-20]],[[7499,6091],[-54,-34],[-21,-13]],[[7387,6071],[13,24]],[[7400,6095],[16,-13],[11,22],[5,8],[9,16],[4,1],[22,-16],[5,-13],[18,11]],[[7400,6095],[11,20],[-15,11],[14,26],[-1,5],[-13,9],[7,20]],[[7403,6186],[33,-25],[16,-12],[18,-13]],[[7470,6136],[12,-9],[8,-16]],[[7387,6071],[-78,59]],[[7357,6213],[11,8],[13,7],[12,6],[8,8]],[[7401,6242],[15,17],[15,16]],[[7431,6275],[6,-7],[2,-9],[-2,-12],[-24,-43]],[[7413,6204],[-10,-18]],[[7546,6172],[-48,-29],[-18,13],[-10,-20]],[[7413,6204],[17,-12],[16,-13],[29,53],[16,-12],[16,-13],[10,-7],[10,9],[10,-19],[9,-18]],[[7565,6184],[-3,-2],[-16,-10]],[[7431,6275],[29,32]],[[7460,6307],[7,7],[9,-11],[3,-7],[9,-16],[8,-12],[15,-20],[12,9],[3,3]],[[7583,6144],[-3,-2],[-16,-10],[-65,-41]],[[7520,5979],[-8,5],[-8,3],[-22,-5]],[[7482,5982],[-20,-3]],[[7572,6044],[-4,-5],[-7,-4],[-4,-3],[-9,-7],[-8,-9],[-9,-14],[-11,-23]],[[7562,5946],[-11,9]],[[7551,5955],[-17,12],[-14,12]],[[7534,5912],[-46,35],[-2,12],[-4,23]],[[7551,5955],[-11,-20],[-6,-23]],[[7587,5836],[-65,48]],[[7522,5884],[8,16],[4,12]],[[7471,5822],[31,25],[9,17],[1,2],[10,18]],[[8458,6764],[4,22],[6,20],[5,19]],[[8473,6825],[7,20]],[[8613,6778],[-1,-2],[-3,-9],[-1,-2],[0,-2],[-6,-22],[-1,-3]],[[8601,6738],[-2,1],[-36,9],[-35,7]],[[8528,6755],[-25,5],[-45,4]],[[8521,6693],[-17,2]],[[8504,6695],[2,33],[0,3],[2,0],[12,-1],[3,-1],[5,26]],[[8601,6738],[0,-2],[-4,-23]],[[8597,6713],[-3,0],[-32,8],[-3,1],[0,-3],[-2,-27],[-15,4],[-17,1],[-4,-4]],[[8513,6626],[5,25],[2,26],[1,16]],[[8597,6713],[0,-4],[-3,-35],[-1,-17],[-2,-14],[0,-3],[-1,-3],[-2,-13],[-4,-19]],[[8584,6605],[-2,0],[-17,5],[-17,5],[-18,6],[-17,5]],[[8736,6670],[-8,-11],[-50,38],[-16,-44],[55,-26],[0,-3],[0,-3],[2,-11],[-11,-24],[-38,15],[-38,20],[-12,-53],[3,-10]],[[8623,6558],[-3,1],[-7,3],[-2,1],[-6,3],[-9,2],[-2,0],[-17,6]],[[8577,6574],[4,16],[3,15]],[[8597,6713],[14,-4],[3,-1],[2,-1],[15,-4],[3,-2],[15,-5],[1,15],[3,17]],[[8653,6728],[16,-10],[18,-12],[18,-13],[17,-12],[14,-11]],[[8631,6817],[14,-10],[14,-11],[8,-6],[8,-5]],[[8675,6785],[-2,-3],[-7,-15],[-6,-14],[-3,-10],[-4,-15]],[[7460,6307],[-13,15],[-17,-18],[-13,10],[4,10],[8,8],[-46,34],[-5,3],[-7,0],[-6,-2],[-4,-4],[-4,-5],[-6,-11],[-16,11]],[[7416,6399],[17,-12],[15,-12],[2,-1],[10,-8],[5,-5],[5,-6],[4,-6],[6,-8],[2,-4],[2,-3],[11,-19]],[[7322,4905],[-56,41]],[[7266,4946],[5,9],[6,10],[56,-42]],[[7333,4923],[-6,-9],[-5,-9]],[[7312,4885],[-56,41],[-25,18]],[[7231,4944],[7,10],[5,9]],[[7243,4963],[23,-17]],[[7322,4905],[-4,-10],[-6,-10]],[[7301,4864],[-56,42],[-25,18]],[[7220,4924],[5,9],[6,11]],[[7312,4885],[-6,-11],[-5,-10]],[[7290,4844],[-56,42],[-25,18]],[[7209,4904],[6,10],[5,10]],[[7301,4864],[-5,-9],[-6,-11]],[[7290,4844],[-10,-18]],[[7280,4826],[-10,7],[-47,34],[-15,12],[-9,6]],[[7199,4885],[5,10],[5,9]],[[7280,4826],[-10,-19]],[[7270,4807],[-10,7],[-72,54]],[[7188,4868],[11,17]],[[7178,4851],[5,8],[5,9]],[[7270,4807],[-5,-8],[-4,-9]],[[7261,4790],[-83,61]],[[7169,4833],[5,10],[4,8]],[[7261,4790],[-5,-8],[-4,-9]],[[7252,4773],[-83,60]],[[7252,4773],[-6,-11],[-6,-11],[-51,37],[-32,23]],[[7157,4811],[6,12],[6,10]],[[7252,4773],[31,-24],[2,0],[-6,-12],[-7,-11],[-6,-11],[-5,-11]],[[7261,4704],[-33,25]],[[7228,4729],[-82,60]],[[7146,4789],[6,12],[5,10]],[[7214,4704],[-82,60]],[[7132,4764],[7,14],[7,11]],[[7228,4729],[-7,-12],[-7,-13]],[[7200,4678],[-63,46],[-19,14]],[[7118,4738],[14,26]],[[7214,4704],[-8,-14],[-6,-12]],[[7200,4678],[-9,-17],[-23,16],[-6,-10]],[[7162,4667],[-58,44]],[[7104,4711],[5,11],[9,16]],[[7151,4646],[-18,14],[-2,-4],[-2,-9],[-5,-13]],[[7124,4634],[-16,8],[-27,12],[-2,3]],[[7079,4657],[2,1],[5,17],[0,2]],[[7086,4677],[6,14],[6,11],[6,9]],[[7162,4667],[-5,-10],[-6,-11]],[[7133,4610],[-57,26]],[[7076,4636],[2,9],[1,8],[0,4]],[[7124,4634],[9,-4],[7,-4],[-4,-9],[-3,-7]],[[7125,4591],[-55,26]],[[7070,4617],[3,10],[3,9]],[[7133,4610],[-2,-3],[-3,-6],[-3,-10]],[[7118,4571],[-10,4],[-45,22]],[[7063,4597],[4,12],[3,8]],[[7125,4591],[-3,-9],[-4,-11]],[[6952,4806],[-42,23]],[[6910,4829],[-36,18],[-7,4]],[[6899,4876],[24,-13],[14,-7],[14,-8],[14,-7]],[[6965,4841],[-3,-9],[-3,-8],[-3,-9],[-4,-9]],[[6933,4749],[-21,10],[-9,4]],[[6903,4763],[-10,4],[-4,3]],[[6889,4770],[4,10],[3,9],[3,8],[3,9],[4,11],[4,12]],[[6952,4806],[-3,-9],[-4,-11],[-3,-8],[-3,-9],[-3,-9],[-3,-11]],[[6889,4770],[-38,18],[-5,2]],[[6846,4790],[4,10],[3,9],[3,9],[3,9],[4,11],[4,13]],[[6889,4724],[-9,5],[-43,20],[-9,5]],[[6828,4754],[7,19],[6,19]],[[6841,4792],[5,-2]],[[6903,4763],[-7,-19],[-7,-20]],[[6876,4687],[-61,29]],[[6815,4716],[4,11],[2,9],[7,18]],[[6889,4724],[-3,-10],[-3,-8],[-3,-8],[-4,-11]],[[6861,4644],[-61,29]],[[6800,4673],[3,10],[4,9],[3,11],[5,13]],[[6876,4687],[-4,-13],[-4,-12],[-4,-9],[-3,-9]],[[6846,4603],[-61,29]],[[6785,4632],[4,11],[4,10]],[[6793,4653],[3,10],[4,10]],[[6861,4644],[-4,-10],[-3,-10],[-4,-10],[-4,-11]],[[6834,4567],[-61,29]],[[6773,4596],[6,18],[3,9],[3,9]],[[6846,4603],[-3,-9],[-3,-9],[-6,-18]],[[6898,4536],[-2,1],[-62,30]],[[6846,4603],[64,-30]],[[6910,4573],[-4,-10],[-3,-8],[-2,-5],[1,-3],[-4,-11]],[[6861,4644],[32,-15],[31,-15]],[[6924,4614],[-4,-10],[-3,-10],[-3,-10],[-4,-11]],[[6876,4687],[63,-31]],[[6939,4656],[-5,-12],[-3,-11],[-4,-10],[-3,-9]],[[6889,4724],[10,-4],[45,-21],[9,-4]],[[6953,4695],[-4,-10],[-3,-8],[-3,-9],[-4,-12]],[[6933,4749],[26,-12],[10,-5]],[[6969,4732],[-9,-18],[-7,-19]],[[7014,4666],[-10,5],[-39,18],[-2,1],[-10,5]],[[6969,4732],[10,-5],[1,0],[18,-8],[19,-9]],[[7017,4710],[10,-5]],[[7027,4705],[-6,-20],[-7,-19]],[[7000,4627],[-61,29]],[[7014,4666],[-3,-10],[-4,-9]],[[7007,4647],[-3,-9],[-4,-11]],[[6985,4584],[-61,30]],[[7000,4627],[-4,-12],[-4,-12]],[[6992,4603],[-3,-9],[-4,-10]],[[6971,4543],[-23,11],[-16,8],[-22,11]],[[6985,4584],[-3,-9],[-4,-10],[-3,-10],[-4,-12]],[[6971,4543],[-3,-9],[-3,-8],[-7,-19]],[[6862,4436],[-64,30],[-4,3],[-17,9],[-38,18],[6,18],[6,18],[6,18],[6,18],[61,-30],[3,10],[6,15],[1,4]],[[6830,4348],[-66,18]],[[6764,4366],[-10,3],[-51,15],[-39,10],[-49,13],[-4,1],[-2,1]],[[6609,4409],[2,4]],[[6611,4413],[23,62],[13,32],[2,4],[3,8]],[[6652,4519],[15,41],[7,17],[10,27],[2,3],[0,1],[2,5],[12,31]],[[6700,4644],[1,-1],[2,-2],[1,-1],[2,-3],[3,-9],[1,-1],[1,-2],[2,-1],[2,-1],[1,-1],[3,0],[14,-7],[22,-10],[18,-9]],[[6652,4519],[-3,1],[-3,2]],[[6646,4522],[1,3],[6,18],[7,18],[-9,4],[-11,5],[-38,19]],[[6702,4649],[-1,-3],[-1,-2]],[[6646,4522],[-8,4],[-46,22],[-4,2]],[[6588,4550],[4,11],[3,9],[4,10],[3,9]],[[6575,4513],[3,9],[3,9],[4,10],[3,9]],[[6646,4522],[-8,-18],[-7,-18],[-7,3],[-2,1],[-43,20],[-4,3]],[[6568,4493],[-62,30]],[[6506,4523],[7,19],[6,19]],[[6519,4561],[7,18],[7,21],[7,18]],[[6575,4513],[-4,-10],[-3,-10]],[[6569,2685],[-2,0],[-35,5],[-47,5]],[[6496,2522],[-17,12],[17,31],[8,18],[2,15],[-1,18],[-20,-3],[-4,24],[-6,0],[-20,-3],[-21,-5]],[[6402,2406],[-1,148]],[[7401,6242],[-17,-2],[-90,68]],[[7343,6008],[-10,-4],[-15,-3],[-36,0]],[[7318,5927],[-12,10],[-10,12],[-5,7],[-4,10]],[[7287,5966],[-2,8],[-1,5],[-2,22]],[[7259,5922],[-15,11],[-16,12]],[[7287,5966],[-5,-1],[-23,-43]],[[7287,5868],[-23,17],[-1,6],[6,11],[6,8],[-16,12]],[[7282,5859],[-41,32],[-13,10]],[[7228,5901],[-14,11],[-14,10]],[[7228,5901],[-3,-7],[-4,-7],[-2,-3],[-2,-4],[-1,-4],[-4,-6]],[[7212,5870],[-14,9],[-13,10]],[[7185,5889],[-13,10],[-7,4],[-7,5]],[[7187,5824],[-13,10],[-13,10]],[[7161,5844],[4,8],[20,37]],[[7212,5870],[-6,-12],[-9,-17],[-10,-17]],[[7161,5844],[-13,9],[-14,10]],[[7532,5214],[1,-5],[-14,0],[-6,-11],[-12,-18],[-5,-10]],[[7496,5170],[-58,40],[-5,-8],[-4,-7],[-4,-8],[-4,-8]],[[7421,5179],[-20,14]],[[7401,5193],[13,21],[11,20],[-9,7],[-41,30],[-3,2]],[[7478,5254],[15,-11],[15,-11],[24,-18]],[[7401,5193],[-8,6],[-7,5]],[[7386,5204],[-33,25],[-7,4]],[[7354,5145],[-46,33],[10,20],[-5,3],[-4,3],[-2,2],[-1,1],[-3,2],[-38,28]],[[7265,5237],[10,19]],[[7386,5204],[-11,-21],[-11,-19],[-10,-19]],[[7354,5145],[-11,-21]],[[7343,5124],[-46,34]],[[7297,5158],[-9,6],[-5,5],[-4,4],[-1,2]],[[7278,5175],[-3,4]],[[7275,5179],[-1,3],[-2,2],[-1,2],[-2,2],[-3,3],[-6,5],[-8,6],[-5,1],[7,14],[11,20]],[[7389,5090],[-11,-19]],[[7378,5071],[-8,6],[-38,28],[-10,-20],[-46,34]],[[7276,5119],[11,19],[10,20]],[[7343,5124],[37,-28],[9,-6]],[[7276,5119],[-11,-20]],[[7265,5099],[-37,28],[-3,2],[-1,0],[-1,0],[4,7],[14,12],[17,12],[15,10],[0,3],[5,2]],[[7378,5071],[-10,-20],[-11,-19],[-9,-17],[-9,-18]],[[7339,4997],[-9,6],[-29,22],[-8,6]],[[7293,5031],[-9,6],[-29,21],[-8,6]],[[7247,5064],[9,18],[9,17]],[[7274,4996],[-43,31]],[[7231,5027],[5,9],[5,9],[-3,2],[9,17]],[[7293,5031],[-10,-18],[-4,-8],[-5,-9]],[[7344,4944],[-57,42],[-13,10]],[[7339,4997],[-10,-17],[9,-7],[15,-12]],[[7353,4961],[-4,-8],[-5,-9]],[[7344,4944],[-6,-10],[-5,-11]],[[7243,4963],[8,8],[7,7],[9,9],[7,9]],[[6352,1008],[-1,-19]],[[6351,989],[-19,0],[1,46],[-2,5],[-24,-16],[-20,-13],[-18,-14],[6,-9],[-1,-23],[-7,-1],[-1,-26]],[[6211,879],[-2,78]],[[6209,957],[2,8]],[[6211,965],[5,3],[15,11],[22,15],[19,14],[18,15],[22,15],[16,11],[19,18],[28,30],[30,23]],[[6405,1120],[0,-13]],[[6405,1107],[-5,-2],[-15,-23]],[[6385,1082],[-4,-4],[-29,-22],[0,-11],[0,-25],[0,-12]],[[6211,966],[4,23]],[[6215,989],[4,3],[2,-1],[1,-2],[1,-4],[0,-3],[-1,-3],[-2,-3],[-2,-3],[-3,-4],[-4,-3]],[[6351,989],[2,-77]],[[6353,912],[-20,0],[-1,41],[-16,0],[-2,-1],[-1,-1],[-1,-3],[0,-9]],[[6353,912],[0,-77]],[[6180,4293],[-2,1],[-1,1],[-41,19]],[[6101,4396],[7,-28],[18,7]],[[6176,4336],[7,17],[1,3],[-1,12],[18,-3],[3,0]],[[6204,4365],[-1,-8],[-3,-9],[-15,-42],[-5,-13]],[[6024,4170],[-8,-3]],[[6016,4167],[-36,-4],[-35,16],[-12,-3],[-7,4],[-2,1]],[[5924,4181],[3,8]],[[5927,4189],[8,23]],[[5935,4212],[3,-1],[17,-8],[17,-8],[1,1],[1,1],[4,9],[4,5],[5,6],[9,5],[12,5],[9,3],[8,-14]],[[6025,4216],[-5,-5],[-4,-6],[-4,-9],[-5,-16],[0,-2],[1,0],[16,-8]],[[7110,4547],[-9,4],[-47,22]],[[7054,4573],[5,12],[4,12]],[[7118,4571],[-5,-13],[-3,-11]],[[7103,4528],[-55,26]],[[7048,4554],[3,10],[3,9]],[[7110,4547],[-4,-10],[-3,-9]],[[7091,4486],[-18,8],[-40,20]],[[7033,4514],[4,11],[4,10],[4,10],[3,9]],[[7103,4528],[-3,-10],[-3,-10],[-3,-11],[-3,-11]],[[7020,4476],[4,11],[3,9],[3,9],[3,9]],[[7091,4486],[-7,-18],[-7,-19]],[[6971,4543],[62,-29]],[[6985,4584],[63,-30]],[[6992,4603],[62,-30]],[[7000,4627],[63,-30]],[[7007,4647],[63,-30]],[[7014,4666],[9,-5],[38,-17],[8,-4],[7,-4]],[[7027,4705],[9,-5],[38,-17],[12,-6]],[[7017,4710],[3,8],[4,9],[5,9],[5,8],[4,8]],[[7038,4752],[23,-16],[3,-1],[2,-2],[3,0],[8,-2],[2,-1],[10,-7],[15,-12]],[[7038,4752],[5,9],[4,8],[4,8],[4,7],[39,-28],[2,-1],[7,-5],[15,-12]],[[7038,4752],[-42,31]],[[6996,4783],[4,9],[5,8],[4,7],[4,9],[1,0],[2,3],[0,2],[1,3],[4,4],[6,6],[2,3],[3,3]],[[7032,4840],[2,-2],[3,-2],[75,-55],[5,-6],[15,-11]],[[6969,4732],[5,10],[4,8],[4,8],[5,9],[4,8],[5,8]],[[6952,4806],[44,-23]],[[6965,4841],[4,8],[3,9],[8,15],[2,4]],[[6728,821],[50,-10]],[[6778,811],[25,-6],[50,-12],[41,-9],[99,-23],[15,0],[7,2],[13,3],[7,3],[4,3],[1,2]],[[7040,774],[13,-10]],[[5536,4131],[-20,6],[-20,21],[-2,14]],[[5494,4172],[14,17]],[[5508,4189],[46,-47]],[[5536,4131],[-40,-24]],[[5496,4107],[-2,1],[-15,12],[-8,9],[14,9],[-3,17]],[[5482,4155],[12,17]],[[5382,4039],[-2,-1]],[[5380,4038],[-7,7],[-3,5],[-11,12]],[[5359,4062],[3,2],[4,-1],[8,-7],[3,-1],[9,6],[18,11]],[[5404,4072],[14,8],[15,12],[14,18]],[[5447,4110],[35,45]],[[5496,4107],[-2,-1],[-12,-7],[-13,-8],[-87,-52]],[[5585,3901],[8,8]],[[5593,3909],[20,-21],[40,-41],[16,-17]],[[5669,3830],[-15,-19]],[[5654,3811],[-77,81]],[[5577,3892],[8,9]],[[5593,3909],[9,7],[27,21]],[[5629,3937],[39,-40],[1,-3],[9,-47],[-1,-4],[-2,-5],[-6,-8]],[[5668,3680],[-3,3],[-43,45],[-23,24],[-20,20],[-53,54]],[[5526,3826],[4,3],[11,13],[13,17],[1,4]],[[5555,3863],[15,20],[7,9]],[[5654,3811],[-23,-30],[54,-58]],[[5685,3723],[7,-7],[1,-2],[-25,-34]],[[5654,3811],[54,-56]],[[5708,3755],[-23,-32]],[[5692,3654],[-24,26]],[[5708,3755],[56,-58]],[[5764,3697],[-13,-18],[-1,-2],[-3,-3],[-7,-8],[-48,-12]],[[5724,3527],[-15,16],[-3,5],[-26,26],[-12,-16],[-13,-16],[-13,-19],[-13,-18]],[[5629,3505],[-15,15]],[[5614,3520],[-13,14]],[[5601,3534],[89,117],[2,3]],[[5692,3654],[64,-66],[7,-7],[2,-3]],[[5765,3578],[-2,-2],[-14,-18],[-3,-1],[-10,-15],[-12,-15]],[[5689,3476],[-14,-18]],[[5675,3458],[-4,2],[-14,15]],[[5657,3475],[-28,30]],[[5724,3527],[0,-3],[-35,-48]],[[5756,3465],[-8,8],[-20,22],[-6,-19],[-13,-17],[-3,-1],[-17,18]],[[5765,3578],[12,-12],[7,-7],[25,-26]],[[5809,3533],[-2,-3],[-16,-20],[-11,-15],[-11,-15],[-13,-15]],[[5812,3408],[-11,-15],[-15,-18],[-14,-18]],[[5772,3357],[-14,15],[-15,15],[-33,35]],[[5710,3422],[-35,36]],[[5756,3465],[7,-7],[5,-5],[14,-14],[16,-15],[14,-16]],[[5866,3352],[-17,18],[-16,16],[-3,3],[-2,3],[-16,16]],[[5809,3533],[40,-42]],[[5849,3491],[33,-34],[15,-16],[11,-10],[10,-7],[2,-2]],[[5920,3422],[-2,-2],[-18,-23]],[[5900,3397],[-11,-14],[-12,-15],[-11,-16]],[[6611,4413],[-2,1],[-1,0],[-3,1],[-3,0],[0,1],[-1,2],[0,1],[0,2],[2,2],[2,3],[-52,26],[4,13],[4,9],[3,10],[4,9]],[[6609,4409],[-3,0],[-3,1],[-5,2],[-35,10],[-39,11],[-45,10]],[[6479,4443],[1,4],[3,10],[9,25],[4,12],[4,10],[3,10],[3,9]],[[6478,4648],[-3,-9],[-4,-9],[-7,-22],[-6,-17]],[[6458,4591],[-7,-18],[-6,-20],[61,-30]],[[6479,4443],[-40,7],[-29,7],[-3,1],[-63,22],[-34,12],[-9,3]],[[6458,4591],[61,-30]],[[7555,912],[-65,18]],[[5962,3478],[-36,37],[-33,33]],[[5893,3548],[13,17],[12,17],[20,23]],[[5938,3605],[31,-33],[-18,-24],[36,-37]],[[5938,3605],[16,21],[2,2],[14,17],[10,12]],[[5980,3657],[67,-69]],[[6047,3588],[-10,-12],[-14,-18]],[[5980,3657],[9,12]],[[5989,3669],[7,9],[14,17]],[[6114,3594],[-8,0],[-12,-17],[-15,-22],[-6,5],[-26,28]],[[5894,3747],[43,-46],[9,12],[43,-44]],[[5938,3605],[-42,43]],[[5896,3648],[-20,22],[-1,1],[-2,0],[-1,1],[-5,6]],[[5867,3678],[12,13],[2,5],[2,2],[3,2],[-16,17],[14,17],[10,13]],[[5865,3512],[-40,41],[14,19]],[[5839,3572],[14,18],[12,17],[13,17],[18,24]],[[5893,3548],[-15,-18],[-13,-18]],[[5839,3572],[-22,23],[14,18],[-3,2],[-5,6],[-14,15],[6,8],[7,9],[7,9]],[[5829,3662],[5,7],[18,24],[15,-15]],[[5764,3697],[14,18]],[[5778,3715],[49,-50],[2,-3]],[[5865,3512],[-12,-16],[-4,-5]],[[5962,3478],[-15,-19],[-14,-19],[-13,-18]],[[6222,3365],[-1,2],[-1,1],[-1,2],[-2,2],[-1,1],[-1,2],[-2,1],[-2,2],[-2,1],[0,1],[-3,2],[-1,1],[-1,0],[-2,1],[-1,1],[-2,1],[-2,1],[-2,0],[-5,4],[0,1],[-2,1],[-1,1],[-1,1],[-2,1],[-1,1],[-2,3],[-1,2],[-2,3],[-3,3],[-4,4],[-5,7],[-35,37],[-22,21],[-3,4],[-32,28]],[[6122,3588],[14,-12],[12,-9],[14,-7],[15,-8]],[[6177,3552],[34,-19],[13,-6],[16,-9],[19,-10],[3,-1],[2,-2],[4,-1]],[[6268,3504],[-3,-6],[-3,-10],[-8,-22],[-6,-18],[-12,-31],[0,-1],[-2,-4],[-1,-4],[-1,-1],[-1,-3],[-1,-3],[0,-1],[-2,-7],[-1,-2],[-1,-3],[-1,-6],[0,-1],[-1,-4],[0,-3],[-1,-5],[-1,-4]],[[6323,3388],[-4,-40],[-11,-24],[-22,-4],[-6,-11],[-1,-49],[5,-6]],[[6284,3254],[1,-6],[-1,-6],[1,-6],[2,-8],[-25,-25],[26,-26],[49,-54],[46,-49]],[[5977,2710],[-9,13],[-10,9],[-14,15],[-89,100],[-52,48],[-3,2],[3,2],[4,2],[5,3],[2,1],[5,3],[7,4],[3,2],[5,3],[20,10],[8,5],[3,2],[7,4],[3,2],[3,2],[1,1],[5,4],[1,1],[2,1],[7,6],[20,24],[8,11],[11,16],[8,10],[7,8],[13,17],[4,6],[8,9],[2,3],[11,14],[8,12],[21,26],[11,12],[10,10],[6,8],[2,2],[1,1],[0,2],[1,2],[0,3]],[[6046,3151],[15,20],[1,1],[11,14],[2,3],[34,44],[14,19],[12,15],[4,7],[4,6],[4,5],[1,1],[4,5],[5,6],[3,5],[4,5],[2,3],[2,1],[0,1],[3,4],[4,3],[4,3],[3,2],[2,1],[4,2],[2,1],[5,1],[4,1],[6,0],[1,0],[2,3],[2,3],[2,4],[1,0],[1,3],[2,3],[2,6],[2,4],[1,3],[1,4],[0,2]],[[6512,3265],[-25,-6],[-45,-11],[-14,-4],[-54,-13]],[[6374,3231],[-6,-2],[-19,-4],[-19,-6],[-10,-2],[-10,10],[-17,17],[-9,10]],[[6374,3231],[3,-3],[4,-3],[5,-6],[13,-15],[9,-9],[9,-8],[29,-30]],[[6607,3102],[-19,14],[-25,-46],[19,-14],[20,-16]],[[6636,3157],[-2,-4],[-27,-51]],[[6627,3087],[-25,-47]],[[6607,3102],[20,-15]],[[6657,3142],[-30,-55]],[[6296,2451],[13,25]],[[6334,2524],[13,24]],[[6347,2548],[0,1],[0,1],[0,1],[4,7],[4,7],[2,1],[1,-1],[1,-1],[-1,-2],[-3,-6],[7,2],[3,6],[-6,7],[4,10]],[[6192,2521],[6,-4],[52,-35],[16,-10],[4,-3],[26,-18]],[[6155,2125],[-67,43]],[[6195,2210],[-16,-36],[-8,-15],[-9,-17],[-7,-17]],[[6215,2087],[-60,38]],[[6179,2009],[-60,38]],[[6119,2047],[8,18],[8,18],[9,18],[11,24]],[[6119,2047],[-45,29],[-15,8]],[[6076,1955],[-59,38]],[[6119,2047],[-8,-18],[-9,-19],[-8,-18],[-9,-18],[-9,-19]],[[6117,1876],[-59,38]],[[6058,1914],[9,20],[9,21]],[[6171,1991],[-10,-20],[-8,-17],[-8,-18],[-9,-20],[-9,-19],[-10,-21]],[[6058,1914],[-9,-18],[-8,-18],[-60,38]],[[6108,1858],[-8,-19],[-9,-20],[-10,-22],[39,-26],[2,-3]],[[6122,1768],[-10,-14],[-14,-21],[-19,-21],[-18,-17],[-20,-14],[-17,-8],[-1,-1]],[[6117,1876],[-9,-18]],[[6170,1839],[-48,-71]],[[6108,1858],[43,-25],[11,15],[1,-3],[7,-6]],[[6230,1931],[-2,-3],[-1,-2],[-57,-87]],[[6301,1836],[-26,18],[-32,19],[-12,-8],[-14,-6],[-31,-14],[4,-4],[26,-17],[14,-9],[13,-9],[43,-28],[13,-8],[6,-3],[8,17],[8,16],[4,9],[1,1]],[[6326,1810],[27,-18],[9,-5],[-6,-9]],[[6356,1778],[-17,-30],[-5,-10],[-159,101],[-3,-10],[-9,-16]],[[6331,1865],[-1,-3],[-3,-6],[-3,-2],[-5,-3],[-4,0],[-14,-15]],[[6301,1836],[-4,-5],[-2,-2],[31,-19]],[[6367,1771],[-11,7]],[[6886,3478],[-19,13]],[[6867,3491],[20,33],[26,47]],[[6867,3491],[-18,-32]],[[6849,3459],[-19,14]],[[6830,3473],[65,117]],[[6720,3393],[56,101],[8,17]],[[6784,3511],[63,116]],[[6830,3473],[-10,-20],[-51,-96]],[[6849,3459],[-11,-19]],[[6886,3478],[-28,-53]],[[6858,3425],[-20,15]],[[6858,3425],[-16,-33]],[[6975,953],[-17,7],[-18,6]],[[6940,966],[-5,3],[-7,1],[-4,-3],[-4,-5],[-14,-49],[-13,-22]],[[6893,891],[-10,9],[-13,9],[-11,9],[-8,7]],[[6851,925],[-4,3],[-18,15]],[[6984,983],[-1,-4],[-8,-26]],[[6959,897],[-7,-21]],[[6952,876],[-15,12],[-16,13],[19,65]],[[6975,953],[-16,-56]],[[6952,876],[-13,-22]],[[6939,854],[-10,8],[-10,8]],[[6919,870],[-8,7],[-18,14]],[[5935,4212],[2,8],[2,4],[3,4],[4,7],[4,6],[2,3],[4,4],[6,6],[13,10]],[[5975,4264],[30,11],[19,4],[10,1],[12,1]],[[6046,4281],[0,-3],[0,-10],[3,-10],[6,-15]],[[6055,4243],[-16,-13],[-14,-14]],[[6124,4232],[-13,-36]],[[6111,4196],[-3,1],[-9,5],[-7,4],[-6,3],[-8,6],[-5,4],[-8,9],[-5,6],[-5,9]],[[6046,4281],[14,0],[4,0],[9,-1],[14,-3]],[[6087,4277],[12,-4],[13,-6],[7,-3],[3,-1],[2,-2],[2,-2],[1,-3],[1,-3],[1,-2],[-1,-5],[-4,-14]],[[6146,4200],[-1,-4],[-3,-9],[-5,-14],[-8,-21]],[[6129,4152],[-3,1],[-26,14]],[[6100,4167],[11,29]],[[6124,4232],[18,-8]],[[6142,4224],[1,-4],[7,3],[5,17],[4,2],[-15,-41],[2,-1]],[[6094,4060],[0,1],[11,29],[2,4]],[[6107,4094],[22,58]],[[6146,4200],[11,-6],[11,-5]],[[6168,4189],[22,-10]],[[6190,4179],[-1,-4],[-2,-6],[-9,-24],[-10,-31],[-8,-22],[-8,-27],[0,-40]],[[6107,4094],[-3,2],[-39,18]],[[6065,4114],[4,8],[3,5],[3,6],[7,8]],[[6082,4141],[15,20],[3,6]],[[6065,4114],[-2,1],[-47,52]],[[6024,4170],[36,-17],[16,-8],[3,-2],[3,-2]],[[6094,4060],[-2,1],[-8,3],[-117,55],[-37,18],[-17,8]],[[5913,4145],[6,23],[4,9],[1,4]],[[6083,4031],[-7,-19],[-14,-33],[0,-1],[-7,-18],[-7,-17]],[[6048,3943],[-4,1],[-42,44]],[[6002,3988],[11,15]],[[6013,4003],[11,15],[18,-18],[15,44],[5,16],[-2,2],[-79,37],[-35,16],[-1,0],[-1,-2],[-5,-14]],[[5939,4099],[-18,8]],[[5921,4107],[-17,9]],[[6013,4003],[-47,49],[-1,2],[0,2],[10,26],[-18,9],[-18,8]],[[6002,3988],[-12,-15]],[[5990,3973],[-57,60]],[[5933,4033],[-15,15],[-5,6],[-10,9],[5,6],[13,38]],[[5932,3902],[-15,16],[-6,7],[-8,7]],[[5903,3932],[19,25],[-14,15],[-13,14]],[[5895,3986],[7,7],[4,5],[2,2],[12,15],[13,18]],[[5990,3973],[-14,-16],[-14,-15],[-11,-14],[-19,-26]],[[6009,3893],[-14,-18],[-3,-5],[-13,-17]],[[5979,3853],[-3,3],[-30,32],[-14,14]],[[5979,3853],[-42,-54],[-12,-16]],[[5855,3887],[14,18],[15,-15],[15,-17],[9,13],[5,4],[4,2],[5,2],[5,2],[5,6]],[[5967,3739],[-23,24],[-9,9],[-10,11]],[[5820,3769],[15,20]],[[5835,3789],[13,16]],[[5835,3789],[-54,58]],[[5781,3847],[13,16]],[[5765,3827],[16,20]],[[5669,3830],[54,-56]],[[5629,3937],[10,9]],[[5639,3946],[8,6]],[[5647,3952],[63,-66]],[[5710,3886],[55,-59]],[[5710,3886],[15,19],[56,-58]],[[5647,3952],[20,18],[15,12]],[[5682,3982],[56,-60]],[[5817,4023],[-14,-18],[-13,-18]],[[5817,4023],[56,-59],[23,-24],[7,-8]],[[5835,4046],[29,-30],[28,-29],[3,-1]],[[8740,6667],[-4,3]],[[8675,6785],[15,-11]],[[8690,6774],[24,-16],[-2,-3],[-10,-19],[18,-14],[21,-15],[4,-5],[3,-7],[0,-4],[0,-5],[0,-4],[-2,-6],[-6,-9]],[[8696,6785],[-6,-11]],[[8700,6813],[-8,-16],[-4,-8],[8,-4]],[[8737,6756],[-41,29]],[[8757,6795],[-9,-17],[-7,-15],[-4,-7]],[[5826,3300],[-17,18],[-15,16]],[[5794,3334],[-2,2],[-20,21]],[[5866,3352],[-1,-3],[-1,-3],[-33,-43],[-2,-2],[-3,-1]],[[5873,3251],[-32,34],[-15,15]],[[5900,3397],[16,-16],[15,-16],[16,-16]],[[5947,3349],[-12,-15]],[[5935,3334],[-11,-15],[-13,-15],[-24,-34],[-14,-19]],[[5842,3210],[-16,16],[-9,-3],[-6,-2],[-8,1],[-8,2],[2,-6],[2,-15],[-1,-7],[-1,-8],[-8,-10],[-15,-19]],[[5757,3177],[17,21],[1,4],[1,4],[-1,4],[-12,11],[-14,16],[15,19],[-16,18]],[[5748,3274],[36,47],[8,9],[2,4]],[[5935,3334],[43,-45],[-12,-17],[-1,-2],[-10,-12],[-11,-16]],[[5947,3349],[30,38],[2,3]],[[5979,3390],[3,0],[1,3],[4,4],[3,1],[5,3],[3,6],[4,5],[17,22]],[[6046,3151],[-4,-5],[-2,-3],[-2,2]],[[5977,3464],[-23,-31],[5,-3],[8,-5],[-11,-23],[23,-12]],[[7623,2573],[4,6],[2,3],[7,10],[12,16],[5,8]],[[7653,2616],[19,26]],[[7672,2642],[5,8],[3,4],[2,3],[6,9]],[[7672,2642],[-20,15],[-18,14],[16,23]],[[7682,2740],[-64,46]],[[7618,2786],[15,22]],[[7661,2825],[2,-1],[52,-37]],[[7715,2787],[-18,-26]],[[7650,2694],[-64,46]],[[7586,2740],[10,14],[6,9],[8,10],[8,13]],[[7653,2616],[-39,27],[-45,35],[-16,12]],[[7553,2690],[17,27],[16,23]],[[7524,2739],[11,6],[11,9],[12,9],[10,9],[13,6],[16,5],[7,3],[7,6],[9,7],[13,9]],[[7553,2690],[-10,-11],[-14,-23]],[[6694,3114],[-30,-55],[19,-14]],[[6683,3045],[-16,-29],[-15,-14]],[[6712,3101],[-29,-56]],[[6770,3058],[-30,-56]],[[6740,3002],[-20,16],[-19,14],[-18,13]],[[6740,3002],[-18,-34],[-9,-11]],[[6772,2913],[-11,-22]],[[6791,3043],[17,-14]],[[6808,3029],[-29,-55]],[[6779,2974],[-26,-47],[19,-14]],[[6797,2960],[-25,-47]],[[6779,2974],[18,-14]],[[6807,2887],[-1,4],[-2,2],[-2,-2],[-30,22]],[[6797,2960],[29,-21],[5,-3]],[[8040,2949],[13,17],[8,11],[15,20]],[[8076,2997],[11,-9],[35,-28]],[[7006,800],[-13,11],[-8,7]],[[6985,818],[-7,5],[-8,7],[-8,6],[-8,6]],[[6954,842],[-8,7],[-7,5]],[[6959,897],[53,-42],[16,-13]],[[7028,842],[10,-8]],[[7038,834],[-15,-15],[-17,-19]],[[6915,794],[-18,4],[-18,5]],[[6879,803],[20,51],[7,-6],[12,20],[1,2]],[[6954,842],[-1,-2],[-9,-24],[-15,13],[-14,-35]],[[6985,818],[-1,-2],[-14,-35],[-18,4],[-18,5],[-19,4]],[[6839,901],[-11,-24],[-20,13],[-6,-20],[17,-11],[-3,-6],[-3,-12],[-16,9],[-7,-27],[17,-4],[18,-4]],[[6825,815],[18,-3],[18,-5]],[[6861,807],[18,-4]],[[7006,800],[9,-6],[9,-8],[16,-12]],[[6778,811],[27,95],[-15,-9]],[[6790,897],[-34,2]],[[6756,899],[42,25],[16,9],[12,8],[3,2]],[[6851,925],[-1,-2],[-11,-22]],[[6861,807],[7,26],[15,32],[-14,12],[-15,12]],[[6854,889],[-15,12]],[[6825,815],[10,35],[19,39]],[[6728,821],[0,1],[14,46],[19,-8],[4,14],[23,11],[2,12]],[[6650,838],[14,8],[10,7],[35,21],[11,6],[11,7],[2,2]],[[6733,889],[4,3],[6,3],[3,2]],[[6746,897],[1,-3],[9,5]],[[6746,897],[-3,5],[2,0],[13,10],[23,80],[4,14]],[[6733,889],[-11,4],[-2,-1],[-7,3],[-21,8],[-22,8]],[[6670,911],[24,83],[-4,1],[6,22]],[[6696,1017],[6,22]],[[6702,1039],[24,-10]],[[6726,1029],[-12,-43],[22,-8],[21,-8],[12,44],[3,12]],[[6726,1029],[-5,7],[3,17],[-1,5],[-5,10],[-28,43],[12,20]],[[6702,1039],[2,8],[-1,8],[-3,6],[-5,5],[-77,30],[-6,-24],[-6,-24]],[[6606,1048],[-4,-14],[-2,-8],[-22,-81]],[[6578,945],[-51,19],[-3,1]],[[6524,965],[-3,7],[-3,9],[-1,4],[-1,3],[0,3],[-1,3],[0,4],[0,5],[-1,5],[1,4],[0,4],[0,8],[1,5],[0,8],[1,5],[1,12]],[[6518,1054],[0,6],[1,21],[2,25],[2,16],[0,7],[1,13],[1,10],[0,3],[0,5],[0,3],[0,5],[0,7],[-1,5],[0,6],[-1,8],[0,5],[-1,5]],[[6522,1204],[0,1],[1,7],[-1,2]],[[6522,1214],[2,2],[3,0],[19,18],[41,35],[9,7],[3,1],[2,2],[5,3]],[[6696,1017],[-90,31]],[[6670,911],[-21,7],[-31,12],[-1,2],[-4,0],[-3,2],[-32,11]],[[6533,876],[1,6],[2,7],[1,7],[1,7],[0,4],[0,9],[-1,5],[0,5],[-2,7],[-2,6],[-1,4],[-3,8],[-5,14]],[[6531,876],[-20,5],[-26,5],[-25,6],[6,26],[-26,9],[-4,7],[-4,56],[2,9]],[[6434,999],[50,-19],[9,34],[5,16],[4,18],[3,11]],[[6505,1059],[10,-4],[3,-1]],[[6434,999],[-13,6],[6,38],[1,7],[4,9],[6,7],[16,17],[19,-11],[32,-13]],[[6403,864],[1,23],[0,8],[2,114],[-1,82],[0,16]],[[6405,1120],[7,6],[52,37],[20,13],[11,10],[19,18],[4,4],[1,2],[2,2]],[[6521,1212],[0,-1],[1,-7]],[[6352,1008],[21,1],[3,-1],[3,-1],[7,0],[5,1],[2,1],[0,3],[-1,3],[-2,4],[0,9],[0,6],[2,7],[1,1],[0,25],[-5,11],[-3,4]],[[8760,6653],[-2,1],[-18,13]],[[8737,6756],[31,-22],[-4,-18],[12,-3],[5,-18],[0,-16],[11,-4],[-4,-12]],[[8615,6424],[4,1],[24,77],[-6,3],[-7,3],[-9,38],[2,12]],[[8537,6472],[3,5],[12,27],[8,18],[1,2],[1,3],[8,24],[7,23]],[[8417,6569],[26,-21],[20,-15],[6,12],[2,9],[3,9],[3,6],[5,5],[-4,8],[-3,10],[7,3],[7,-2],[4,10],[2,7],[4,19],[14,-3]],[[8417,6569],[9,17],[9,23],[4,16],[5,21]],[[8444,6646],[6,34],[1,21]],[[8451,6701],[36,-3],[17,-3]],[[8341,6674],[31,-8],[3,21],[1,19],[4,4],[33,-1],[18,0],[-1,-27],[-4,-31],[18,-5]],[[8347,6737],[5,2],[19,1],[33,0],[30,-1]],[[8434,6739],[20,-1]],[[8454,6738],[0,-4],[-3,-33]],[[8384,6768],[50,-1],[0,-28]],[[8458,6764],[-4,-26]],[[8427,6853],[16,-12],[12,-8]],[[8455,6833],[6,-3],[12,-5]],[[8410,6866],[10,19],[10,19]],[[8430,6904],[41,-30],[-8,-20],[-8,-21]],[[8430,6904],[10,19],[-32,22],[8,16],[1,6]],[[8417,6967],[35,-25],[33,-24]],[[8485,6918],[21,-15]],[[8433,7005],[71,-52]],[[8504,6953],[-8,-15],[-9,-17],[-2,-3]],[[8514,6971],[-10,-18]],[[8442,7022],[72,-51]],[[8453,7042],[71,-51]],[[8468,7071],[71,-51]],[[8546,7034],[-7,-14]],[[8409,7114],[7,14]],[[8475,7085],[71,-51]],[[6924,2944],[18,-14]],[[6905,2958],[36,66]],[[6884,2974],[4,8],[5,8],[4,8],[4,8],[5,9],[4,7],[5,9],[5,9]],[[6905,2958],[-21,16]],[[6884,2974],[-24,17]],[[6847,2967],[13,24]],[[6797,2960],[30,56]],[[6808,3029],[19,-13]],[[6808,3029],[36,67]],[[2104,990],[-13,-3],[-18,-4],[-6,-3],[-6,-4],[-5,-4],[-16,-14]],[[2040,958],[-23,38],[-3,5],[-4,4],[-4,3],[-1,1]],[[2005,1009],[6,14],[-28,17],[-7,4],[-3,4],[-1,6],[-4,16],[3,2],[5,2],[7,4],[14,-19],[2,-1],[3,0],[1,2],[4,8],[6,8],[8,9],[9,8],[9,6],[4,2],[19,5],[4,-23],[8,2],[6,2],[4,1],[3,3],[6,5]],[[2093,1096],[13,-10],[-10,-24],[-1,4],[-3,-1],[-2,-2],[-1,-2],[0,-4],[2,-7],[8,-37],[5,-23]],[[4045,3461],[-16,-12],[-33,-25]],[[3982,3413],[-19,-15]],[[3963,3398],[-31,31],[-35,37],[-17,19],[-4,4],[-9,9],[-12,13],[-28,29],[-7,8],[-2,2],[-3,1],[-4,1],[-3,1],[-3,0],[-6,1],[-5,1],[-6,0],[-13,-6],[-7,-3],[-12,-2],[-5,-1],[-9,-1]],[[3742,3542],[0,6]],[[3742,3548],[16,1],[10,0],[14,7],[5,2],[5,1],[11,-1],[10,0],[5,-3],[7,-1],[8,5],[11,2],[11,1],[2,1],[6,0],[21,-5],[2,-1],[6,-4],[9,-5],[14,-7],[23,-5],[33,-6],[6,-1],[5,-1],[16,-2],[2,1],[17,0],[4,0],[14,2],[10,2],[28,5],[11,0],[26,16],[16,8],[20,0],[18,-2],[18,1],[46,7],[14,4],[7,1],[3,1],[6,4],[2,0],[3,1],[1,1],[11,5],[17,5]],[[4292,3588],[64,-59]],[[4356,3529],[-8,-5],[-9,-6],[-6,-7],[-10,-6],[-10,-4],[-2,-1],[-4,-1],[-3,-2],[-2,0],[-8,-3],[-10,0],[-11,1],[-22,-2],[-31,-2],[-18,-1],[-22,3],[-32,5],[-8,0],[-14,0],[-17,-3],[-24,-9],[-4,-2],[-19,-10]],[[7345,3904],[-13,-22]],[[7332,3882],[-19,15],[-18,13]],[[7295,3910],[-19,13],[-19,15],[-19,13]],[[7238,3951],[12,22]],[[7250,3973],[57,-42]],[[7307,3931],[38,-27]],[[6618,5223],[-22,-57]],[[6596,5166],[-4,2],[-43,21],[-4,2]],[[6545,5191],[11,30]],[[6556,5221],[52,149],[7,20],[1,3]],[[6616,5393],[10,-7],[8,-5],[38,-27],[3,-2]],[[6675,5352],[0,-2],[-1,-2],[-3,-6],[-28,-54]],[[6643,5288],[-10,-24],[-15,-41]],[[6732,5273],[-17,12],[-20,13],[-19,13],[-17,-34],[-16,11]],[[6675,5352],[36,-26],[17,-13]],[[6728,5313],[36,-25]],[[6764,5288],[-2,-4],[-3,-4],[-10,-21],[-17,14]],[[6732,5273],[-12,-22],[9,-17],[9,-17],[8,-8],[-9,-17]],[[6737,5192],[-11,9],[-13,23],[-16,-11]],[[6697,5213],[-9,16],[-20,15],[-17,13],[-17,-43],[-16,9]],[[6754,5179],[-17,13]],[[6764,5288],[33,-24]],[[6797,5264],[-2,-4],[-1,-6],[-40,-75]],[[7356,3926],[-11,-22]],[[7307,3931],[12,21]],[[7319,3952],[11,21]],[[7330,3973],[38,-26]],[[7368,3947],[-12,-21]],[[7273,4015],[57,-42]],[[7319,3952],[-58,42]],[[7261,3994],[12,21]],[[7250,3973],[-37,28],[11,21],[37,-28]],[[7238,3951],[-16,12],[-21,15],[-20,15]],[[7181,3993],[-61,47]],[[7120,4040],[31,59]],[[7151,4099],[80,-52],[5,-3],[37,-29]],[[7209,3897],[-36,28]],[[7173,3925],[11,22],[-20,15],[17,31]],[[7238,3951],[-15,-31],[-14,-23]],[[7339,3991],[-9,-18]],[[7151,4099],[8,15],[18,33],[5,15]],[[7182,4162],[8,-3],[37,-28],[26,-19],[19,-14],[4,-3]],[[7276,4095],[4,-2],[26,-19]],[[7306,4074],[-12,-22]],[[7294,4052],[-11,-20],[56,-41]],[[7294,4052],[57,-41]],[[7351,4011],[-12,-20]],[[7306,4074],[56,-41]],[[7362,4033],[-11,-22]],[[7412,4029],[-13,-24]],[[7399,4005],[-37,28]],[[7276,4095],[19,19],[2,2]],[[7297,4116],[4,-4],[1,-1],[16,-13]],[[7318,4098],[94,-69]],[[7318,4098],[7,12],[6,11]],[[7331,4121],[85,-62],[8,-6]],[[7424,4053],[-12,-24]],[[7435,4072],[-11,-19]],[[7331,4121],[5,9],[5,6],[5,4]],[[7346,4140],[89,-68]],[[7346,4140],[8,7],[9,8],[60,-47],[23,-17]],[[7446,4091],[-6,-10],[-5,-9]],[[7457,4112],[-6,-11],[-5,-10]],[[7297,4116],[26,23],[31,27],[13,8],[5,3],[15,5],[6,3],[22,0],[16,-1]],[[7431,4184],[12,-9],[4,-1],[5,-4],[3,-2],[1,-1],[8,-6],[12,-8],[3,-3]],[[7479,4150],[-5,-9],[-6,-9]],[[7468,4132],[-5,-10],[-6,-10]],[[7511,4041],[-65,50]],[[7457,4112],[66,-51]],[[7523,4061],[-6,-10],[-6,-10]],[[7468,4132],[35,-27],[12,-9],[17,-12],[2,-2]],[[7534,4082],[-5,-10],[-6,-11]],[[7479,4150],[6,-5],[40,-30],[8,-6],[11,-9]],[[7544,4100],[-5,-9],[-5,-9]],[[7654,4145],[-17,-31],[2,-2],[5,-4],[16,-12],[-9,-18],[-10,7],[-6,5],[-8,6]],[[7627,4096],[-15,11],[-35,27],[-11,9],[-10,-18],[-12,-21],[0,-4]],[[7431,4184],[4,1]],[[7435,4185],[12,-1],[16,0],[9,1],[6,1],[7,2],[5,1],[16,3],[16,5],[22,8],[16,9],[4,2],[19,14],[9,8],[2,3],[2,1]],[[7596,4242],[10,-7],[7,-5],[3,-3],[8,-6],[1,-2],[19,-15]],[[7644,4204],[-6,-12],[-5,-9],[-8,-15],[29,-23]],[[7604,4055],[-52,40],[-8,5]],[[7627,4096],[-10,-18]],[[7617,4078],[-6,-11],[-7,-12]],[[7604,4055],[25,-18],[3,-2]],[[7632,4035],[-5,-9],[-6,-10]],[[7621,4016],[-87,66]],[[7621,4016],[-5,-9],[-6,-11]],[[7610,3996],[-42,32],[-45,33]],[[7599,3976],[-18,13],[-25,18],[-45,34]],[[7610,3996],[-6,-10],[-4,-8],[-1,-2]],[[7594,3967],[-6,-10]],[[7588,3957],[-20,15],[-23,16],[-45,34]],[[7500,4022],[6,10],[5,9]],[[7599,3976],[-5,-9]],[[7578,3939],[-27,20],[-15,11],[-45,34]],[[7491,4004],[5,9],[4,9]],[[7588,3957],[-6,-12],[-4,-6]],[[7478,3981],[7,12],[6,11]],[[7578,3939],[-2,-5],[-7,-12]],[[7569,3922],[-10,5],[-8,2],[-8,4],[-19,14],[-46,34]],[[8191,3873],[8,29]],[[8199,3902],[1,5]],[[8200,3907],[34,-26],[14,-10]],[[8248,3871],[-6,-16]],[[8242,3855],[-6,-17],[39,-30],[26,-19],[14,-11],[28,-21]],[[8343,3757],[-8,-15],[-7,-12],[-3,-5],[-13,-25]],[[8360,3787],[-8,-15],[-9,-15]],[[8242,3855],[10,-8],[24,-18],[1,-1],[8,-6],[18,-13],[13,-10],[7,-5],[8,15],[-7,5],[-15,11]],[[8309,3825],[5,8],[21,-16],[8,13],[-45,34]],[[8298,3864],[8,15]],[[8306,3879],[45,-34]],[[8351,3845],[21,-16],[8,-6]],[[8380,3823],[-8,-15],[-12,-21]],[[8309,3825],[-16,12],[-7,6]],[[8286,3843],[7,14],[5,7]],[[8351,3845],[4,9],[4,7],[-7,5],[-37,29],[7,13]],[[8322,3908],[2,0],[43,-32],[9,15],[8,14]],[[8384,3905],[13,-10],[15,-12]],[[8322,3908],[7,12],[3,4],[8,15]],[[8340,3939],[16,-12]],[[8356,3927],[28,-22]],[[8356,3927],[7,13],[5,9],[11,19]],[[8379,3968],[12,22]],[[8391,3990],[29,-21],[-13,-22]],[[8407,3947],[-11,-20],[-7,-11],[-5,-11]],[[8407,3947],[18,-14],[11,-8]],[[8436,3925],[-11,-20],[-13,-22]],[[8442,3935],[-6,-10]],[[8391,3990],[12,22],[15,25]],[[8418,4037],[28,-21]],[[8446,4016],[19,-15],[9,-7]],[[8474,3994],[-13,-25],[-13,-23],[-6,-11]],[[8442,3935],[24,-18],[16,-13],[9,-7]],[[6717,5109],[-56,27]],[[6661,5136],[8,22],[6,20],[9,20],[13,15]],[[6754,5179],[-20,-37],[-16,-31],[-1,-2]],[[6754,5179],[21,-15],[32,-6],[6,-4]],[[6813,5154],[-36,-69],[-2,-3]],[[6775,5082],[-58,27]],[[6797,5264],[54,-39]],[[6897,5192],[54,-39],[17,-12]],[[6968,5141],[-2,-4],[-4,-9],[-10,-18],[-18,12],[-11,-21]],[[6972,5040],[-49,35]],[[6923,5075],[-10,7]],[[6968,5141],[31,-22]],[[6999,5119],[-1,-2],[-1,-3],[-1,-3],[10,-6],[-3,-6],[-10,-20],[-10,-19],[-11,-20]],[[6900,5033],[5,8],[6,13],[12,21]],[[6972,5040],[17,-13],[-19,-16],[-19,-17],[-11,10],[-9,7],[-13,9],[-18,13]],[[7103,5060],[-13,-9],[-3,-2],[-7,-5],[-5,-4],[-2,-2],[-4,-3],[-5,-4],[-6,-5],[-5,-5],[-6,-4],[-34,-32],[-13,-11],[-9,-8]],[[6824,4872],[-2,1],[-1,0],[-2,1],[-3,2]],[[6816,4876],[24,19],[9,5],[13,6],[13,5],[22,4],[9,2],[9,3],[12,6],[3,1],[-15,38],[-6,12],[-5,9],[-8,12],[-10,13]],[[6886,5011],[5,6],[6,11],[3,5]],[[6999,5119],[33,-24],[16,-11],[16,-12],[3,-1],[3,-1],[13,0],[4,-1],[5,-1],[3,-1],[3,-2],[3,-2],[1,-3],[1,0]],[[6886,5011],[-7,8],[-1,2],[-8,8],[-11,8],[-12,9],[-10,6],[-11,6],[-51,24]],[[6816,4876],[-5,2],[-2,3],[-5,2],[-4,1],[-17,8],[-13,5],[-20,10],[-31,14]],[[6719,4921],[8,22],[46,136],[2,3]],[[6824,4872],[-2,-2],[-2,-1],[-2,-2],[-4,-5],[-7,-7],[-2,-3],[-5,-7],[-3,-5],[-4,-7],[-5,-9],[-4,-6]],[[6784,4818],[-2,-6],[-8,-13],[-5,-10],[-3,-7]],[[6766,4782],[-1,1],[-2,1],[-4,2]],[[6759,4786],[9,16],[9,18],[-34,16],[-8,4],[-31,15],[-8,4]],[[6696,4859],[7,18]],[[6703,4877],[7,21],[4,11],[5,12]],[[6841,4792],[-9,5],[-36,16],[-7,4],[-5,1]],[[6828,4754],[-9,4],[-50,23],[-3,1]],[[6815,4716],[-52,24],[-2,1],[-10,5]],[[6751,4746],[-4,1]],[[6747,4747],[3,4],[7,15],[9,16]],[[6800,4673],[-57,28],[-3,1],[-7,3],[0,4]],[[6733,4709],[7,15],[11,22]],[[6793,4653],[-43,20],[-14,7],[-3,2],[-11,5],[11,22]],[[6683,4823],[9,-4],[31,-15],[8,-4],[14,-7],[14,-7]],[[6683,4823],[2,2],[5,15],[2,7],[4,12]],[[6641,4907],[62,-30]],[[3400,3543],[-4,3],[-54,21],[-23,24],[-5,5],[-3,2],[-3,5]],[[3308,3603],[7,1],[19,1],[7,0]],[[3341,3605],[8,0],[16,1],[9,0],[9,1],[2,0],[6,0],[13,-3]],[[3404,3604],[21,-7],[6,-3],[11,-6]],[[3442,3588],[3,-2],[20,-14],[63,-41]],[[3528,3531],[-12,-24],[-2,-5],[-44,16],[-70,25]],[[3341,3605],[-5,5],[-126,131],[4,4],[7,2],[13,3],[3,-1],[14,-15],[26,9],[127,-133],[0,-6]],[[7377,3964],[-9,-17]],[[7351,4011],[37,-28]],[[7388,3983],[-11,-19]],[[7399,3832],[-30,22],[-18,13],[-15,12],[-4,3]],[[7356,3926],[66,-51]],[[7422,3875],[-11,-21],[-12,-22]],[[7381,3799],[-12,-20],[-65,47]],[[7304,3826],[10,18],[2,4],[0,2],[16,32]],[[7399,3832],[-18,-33]],[[7381,3799],[22,-19],[4,-3],[2,-3],[8,-16]],[[7417,3758],[-7,-3],[-8,-3],[-7,-1],[-4,-1],[-7,-2],[-9,-3],[-23,-10],[-9,-4],[-6,-3]],[[7337,3728],[-7,-3],[-21,-9],[-5,-3],[-4,-2],[-3,-2],[-3,-2]],[[7294,3707],[0,2],[-1,2],[-1,1],[-36,27]],[[7256,3739],[12,22],[11,22],[2,2],[3,4],[8,13],[2,4],[10,20]],[[7256,3739],[-37,27]],[[7219,3766],[12,23],[11,22],[11,21],[2,3],[11,19]],[[7266,3854],[36,-26],[2,-2]],[[6677,5055],[-16,7],[-9,-22],[-5,2],[-1,0],[-3,0],[-5,3],[-33,16],[-2,1],[-2,2],[-4,2],[8,23]],[[6605,5089],[17,-8],[11,33],[1,3],[1,2],[1,0],[2,1],[1,-1],[1,0],[13,-6],[28,-13],[3,-3],[4,-6],[0,-4],[-1,-5],[-3,-6],[-7,-21]],[[6605,5089],[-33,16],[22,57],[2,4]],[[6596,5166],[65,-30]],[[6717,5109],[-1,-3],[-2,-2],[-19,-57],[-18,8]],[[7142,5009],[-6,-10],[-5,-10]],[[7131,4989],[-7,5],[-46,33],[-3,2],[-6,1],[-5,-5],[-9,-7],[59,-44],[6,-5]],[[7120,4969],[-9,-19]],[[7111,4950],[-10,-19],[-10,-16]],[[7091,4915],[-9,-18]],[[7103,5060],[1,-4],[1,-5],[-1,-7],[1,-4],[0,-2],[2,-2],[1,-1],[2,-2],[3,-1],[6,-3],[20,-16],[3,-4]],[[7131,4989],[-5,-10],[-6,-10]],[[7199,4885],[-32,24],[-56,41]],[[7131,4989],[57,-42],[32,-23]],[[7142,5009],[57,-41]],[[7199,4968],[32,-24]],[[7142,5009],[6,11],[5,9],[5,9],[5,10],[6,11],[5,9]],[[7174,5068],[57,-41]],[[7231,5027],[-5,-10],[-6,-11],[-5,-9],[-5,-10],[-5,-9],[-6,-10]],[[7174,5068],[5,10],[5,8],[5,2],[9,12],[40,-29],[9,-7]],[[7174,5068],[-24,19],[-2,4]],[[7148,5091],[1,0],[12,9],[4,3],[18,12],[15,10],[1,1],[2,1],[5,4],[20,14],[1,1],[24,16],[21,14],[3,3]],[[7103,5060],[11,8],[18,12],[4,3],[12,8]],[[6851,5225],[120,236],[4,8],[4,8]],[[6979,5477],[4,7],[4,8],[4,6],[4,9]],[[6851,5547],[60,-43],[4,8],[4,8]],[[6919,5520],[60,-43]],[[6728,5313],[114,216],[5,11],[4,7]],[[6919,5520],[4,8],[4,7]],[[6927,5535],[4,8],[5,8]],[[6936,5551],[51,-38],[8,-6]],[[6936,5551],[4,7],[4,8]],[[6944,5566],[4,7],[5,9]],[[6953,5582],[33,-24],[26,-19]],[[6953,5582],[5,9],[5,9],[4,9],[6,10],[2,3]],[[6953,5582],[-60,44]],[[6893,5626],[5,9],[5,9],[5,9],[5,10],[2,3]],[[6944,5566],[-60,43]],[[6884,5609],[4,8],[5,9]],[[6927,5535],[-59,44]],[[6868,5579],[4,7],[4,8],[8,15]],[[6860,5563],[4,8],[4,8]],[[6919,5520],[-59,43]],[[6851,5547],[5,9],[4,7]],[[6793,5590],[-9,-18]],[[6784,5572],[-38,26],[-9,6],[-10,-20],[-13,9]],[[6714,5593],[10,20],[11,21],[27,54],[8,16]],[[6770,5704],[7,-4],[6,-5],[-11,-23],[8,-6],[9,-6],[31,-21]],[[6820,5639],[-14,-26],[-5,-8],[-4,-7],[-2,-4],[-2,-4]],[[6784,5518],[-59,41],[-8,5],[-10,-19]],[[6707,5545],[-9,6],[-4,2]],[[6694,5553],[20,40]],[[6784,5572],[19,-13],[1,-2],[-1,-2],[-3,-7],[-6,-10],[-5,-10],[-5,-10]],[[6763,5479],[-65,48],[4,9],[5,9]],[[6784,5518],[-6,-10],[-6,-11],[-5,-9],[-4,-9]],[[6763,5479],[-9,-15],[-39,29],[-11,-19],[-5,-9],[-6,-12],[-3,-7],[-10,7],[-15,10],[10,19],[-13,8]],[[6662,5490],[9,18],[6,12],[17,33]],[[2967,2895],[-40,-34],[-3,-2],[-2,1],[-23,33],[-10,-8],[-4,-6],[-2,-3],[-5,4],[-5,3],[-26,14]],[[2847,2897],[-33,17],[-3,1],[-2,-4],[-6,-18],[-12,-29],[-3,-3],[-7,-7],[-17,-14],[-6,9],[-2,4],[-2,4],[-3,19]],[[2751,2876],[-1,5],[-9,15],[-21,36],[-12,19],[-8,13]],[[2700,2964],[17,14],[31,26]],[[2748,3004],[9,7],[7,5],[13,10],[3,3],[6,5],[16,13],[6,5],[2,3],[4,5],[3,3],[3,3],[3,2]],[[2823,3068],[6,5],[33,28]],[[2862,3101],[46,-78],[5,-10],[6,-27],[3,-9],[6,-14],[21,-35]],[[2949,2928],[18,-33]],[[2901,3123],[-20,-9]],[[2881,3114],[-19,-13]],[[2823,3068],[-40,64],[-4,28],[-10,12],[40,30]],[[2809,3202],[18,1],[29,20],[3,0]],[[2859,3223],[5,-11],[-25,-20],[11,-19],[22,-35],[2,-2],[3,0],[23,10],[1,-23]],[[2386,3567],[-23,7],[1,-3],[0,-3],[0,-2],[0,-3],[-1,-2],[0,-2],[0,-2],[-1,-2],[-1,-2],[-1,-1],[-1,-2],[-1,-1],[-2,-3],[-1,-2],[-8,9],[-16,24],[12,10],[5,6],[4,3],[2,-2],[3,2],[6,6],[1,0],[13,12],[1,1],[0,1],[6,4],[11,15],[-1,2],[0,1],[-1,2],[-1,4],[-1,4],[-2,9],[0,3],[-1,2],[-1,2],[-1,1],[-1,1],[-1,1],[-1,0],[-1,0],[-1,1],[-1,0],[-1,-1],[-2,0],[-1,-1],[-2,-1],[-2,-2],[-4,-3],[-3,-4],[-8,-7],[-15,-14],[-1,-1],[-6,-5],[-4,-3]],[[1693,3865],[4,2],[6,2],[11,0],[3,-2],[6,-4],[4,-6],[4,-4],[7,-5],[3,2],[7,6],[2,0],[5,-5],[1,-1],[5,-3],[6,-1],[3,2],[2,1],[2,7],[5,17],[3,8],[9,18],[6,8],[4,6],[10,9],[4,4],[11,5],[12,3],[10,1],[8,3],[10,1],[7,0],[3,-1],[10,-2],[17,-8],[11,-7],[26,-12],[11,-4],[6,0],[4,-1],[3,-1],[15,-1],[29,0],[44,-5],[8,-1],[30,-5],[10,0],[10,-2],[15,4],[15,-2],[3,-1],[7,-5],[4,-8],[4,-5],[6,-3],[7,-1],[7,2],[12,1],[6,2],[4,-1],[5,3],[18,8],[10,1],[13,1],[4,-1],[2,-1],[0,-5],[-2,-10],[-2,-4],[-8,-17],[2,-9],[0,-3],[1,-2],[11,-4],[17,-17],[17,-24],[21,-18],[40,-21],[10,-6],[9,-9],[7,-4],[5,-3],[0,-7],[5,-23],[-1,-3],[2,-3],[4,-5],[6,-9],[3,-10],[7,-20],[3,-4],[4,-4],[6,-1],[5,-6],[0,-1],[1,-5],[-1,-10],[-2,-9],[-2,-6],[-5,-7],[-11,-10],[-18,-17]],[[1274,3378],[2,27],[1,14],[-1,11],[1,8],[13,33],[6,10],[4,5],[7,4],[7,3],[8,4],[10,8],[4,14],[8,3],[21,-2],[5,3],[3,2],[2,0],[7,-7],[4,0],[13,3],[10,6],[12,10],[9,13],[9,12],[7,10],[12,11],[7,10],[3,13],[1,23]],[[1806,2151],[-14,-10],[-7,-4],[-17,-9]],[[1768,2128],[-12,-5],[-9,-3],[-10,-4],[-7,-6],[-10,-7],[-4,-3],[-22,-14],[-16,-11],[-12,-12]],[[1666,2063],[-10,-7],[-9,-4],[-17,-6],[-16,-6]],[[1614,2040],[-9,-3],[-8,-5],[-5,-3],[-34,-25],[-2,-2],[-5,-3],[-39,-29],[-16,-12],[-11,-9],[-15,-14],[-7,-4],[-5,-2],[-5,-1],[-9,2],[-11,1],[-11,2],[-15,3],[-13,1],[-18,-1],[-12,-1],[-1,8],[-2,4],[-7,13],[-1,1],[-1,1],[-1,0],[-2,0],[-4,-1],[-7,-1],[-2,-1],[-1,0],[-1,-1],[1,-13],[-1,0],[0,-1],[0,-1],[0,-2],[0,-2],[0,-2],[0,-2],[-16,-1],[-8,-1],[-11,-4],[-8,-2],[-10,-3],[-6,0],[-3,1],[-4,1],[-4,2],[-27,19],[-7,5],[-29,21],[-11,6],[-4,2],[-5,2],[-5,2],[-1,0],[-2,-1],[-2,0],[-2,-1],[-13,-8],[-25,-17],[-10,-6],[-3,-2],[-7,-4],[-27,-18],[-66,-43],[-59,-38],[-38,-24],[-55,-35],[-15,-9],[-19,-12],[-19,-11],[-7,-5],[-2,-6],[0,-5],[0,-5],[7,-18],[6,-18],[1,-6],[0,-5],[-1,-10],[-2,-4],[-10,-18],[-4,-7],[-3,-7],[-1,-5],[-2,-7],[-3,-16],[-2,-11]],[[790,1603],[-10,5]],[[780,1608],[5,4],[2,9],[0,11],[-1,5],[-4,5],[0,3],[4,7],[6,2],[11,14],[2,10],[0,9],[-2,5],[0,9],[-1,1],[-2,4],[-36,0],[-7,2],[-8,7],[4,8],[6,1],[0,9],[-3,9],[-7,5],[-7,3],[-5,8],[-8,9],[-7,12],[-5,3],[-5,2],[-25,0],[-3,2],[-9,9],[-7,-2],[-5,-3],[-7,2],[-7,11],[-8,17],[-7,16],[-1,11],[-3,7],[-4,2],[-3,-2],[-1,-2],[-1,-9],[-2,-6],[-6,-4],[-13,0],[-8,1],[-11,15],[-5,10],[-2,11],[0,10],[0,10],[2,7],[8,12],[1,0],[2,-5],[-6,-9],[-1,-5],[1,-3],[4,-1],[4,4],[3,0],[4,-2],[2,-6],[5,-2],[4,0],[9,9],[3,8],[12,12],[5,2],[4,-9],[7,-1],[7,2],[3,5],[6,-1],[2,2],[0,9],[3,8],[8,12],[5,7],[5,10],[4,9],[-1,10],[-1,7],[-3,7],[-3,6],[-5,6],[-6,0],[-3,1],[-5,3],[-5,2],[-10,-3],[-15,-8],[-9,-3],[-9,1],[-7,6],[0,4],[-2,7],[6,8],[5,9],[0,7],[-1,9],[-4,15],[-1,6],[4,9],[6,2],[6,1],[6,-1],[3,-4],[2,-9],[6,-5],[5,0],[8,1],[8,6],[10,10],[0,11],[1,10],[5,8],[5,12],[0,3],[-1,1],[0,5],[3,2],[3,0],[3,-6],[2,-1],[5,0],[2,4],[14,11],[11,0],[7,1],[3,1],[3,4],[-1,2],[-5,3],[-5,7],[-3,11],[-4,8],[0,5],[3,5],[6,2],[3,3],[3,7],[2,10],[-2,9],[-4,3],[-5,-6],[-6,-3],[-5,-2],[0,4],[1,1],[5,6],[3,18],[5,4],[1,9],[3,9],[5,3],[5,8],[10,12],[3,6],[3,12],[4,5],[5,4],[8,0],[6,5],[5,7],[9,8],[8,-1],[1,0],[3,1],[7,6],[9,17],[13,11],[2,-5],[6,-8],[6,-4],[7,1],[6,-7],[1,0],[5,4],[9,4],[1,2],[5,1],[12,15],[6,1],[12,0],[18,14],[10,0],[4,2],[9,0],[4,-4],[6,-1],[9,2],[5,5],[8,5],[8,2],[13,1],[1,-16],[7,-16],[2,-9],[2,-8],[2,-7],[8,-13],[2,-3],[4,-7],[8,-9],[8,-7],[5,-3],[4,-2],[18,-20],[-4,-11],[-4,-5],[-5,-7],[-3,-12],[9,-12],[4,-7],[6,-2],[7,3],[3,4],[6,-4],[2,-5],[0,-18],[-2,-8],[-7,-15],[-1,-4],[0,-1],[0,-8],[2,-13],[7,-14],[1,-4],[9,-15],[2,-24],[14,-30],[2,-7],[12,-23],[3,-10],[3,-1],[3,1],[2,0],[6,-11],[0,-6],[3,-4],[6,-3],[8,3],[8,-4],[7,-6],[13,-2],[7,1],[5,2],[7,-2],[10,-5],[4,-5],[1,-7],[5,-6],[12,-14],[5,-7],[5,-1],[3,-3],[1,-2],[2,-3],[10,0],[5,2],[6,4],[6,3],[7,1],[2,4],[3,2],[5,3],[6,24],[4,3],[6,-1],[16,0],[11,4],[4,3],[4,5],[2,2],[0,-3],[-3,-4],[-2,-2],[-1,-2],[1,-4],[2,-9],[4,-9],[9,-6],[13,-2],[27,1],[5,-12],[2,1],[8,0],[7,1],[6,-2],[10,5],[20,22],[7,10],[-3,12],[-1,12],[6,10],[7,5],[6,-3],[5,-7],[5,-5],[3,1],[6,1],[7,5],[9,12],[14,29],[3,5],[5,13],[11,20],[4,12],[4,6],[9,2],[11,3],[4,3],[-1,6],[-1,5],[1,3],[12,6],[3,-1],[6,4],[3,-2],[4,1],[2,-1],[2,-1],[5,4],[20,13],[2,0],[3,-3],[4,-4],[12,-4],[9,-1],[4,1],[5,8],[4,15],[2,8],[-1,17],[3,3],[7,0],[12,13],[7,3],[23,1],[8,3],[6,0],[3,-2],[4,-1],[6,4],[-2,5],[0,3],[11,10]],[[1787,2228],[-10,-8],[4,-16],[25,-53]],[[1955,2280],[-10,-6],[-6,-3],[-14,-10],[-11,22],[-6,-4],[-33,-21],[-1,-3],[0,-3],[11,-21],[3,-2]],[[1888,2229],[-15,-24],[-2,-2],[-19,41],[-2,1],[-13,-9],[-12,-7],[-2,0],[-6,11],[-3,11]],[[1814,2251],[4,6],[3,0],[3,-1],[1,-10],[4,-4],[5,-1],[4,7],[8,22],[2,3],[14,20],[0,6],[4,9],[4,4],[1,0],[5,-6],[17,16],[8,0],[8,-4],[5,-5],[7,-6],[2,2],[5,6],[1,10],[-1,3],[2,1],[2,2]],[[1932,2331],[0,-1],[23,-50]],[[1685,1876],[-5,9],[-9,19]],[[1671,1904],[86,54]],[[1757,1958],[21,-45],[-17,-12],[-33,-21],[-6,-8],[-12,11],[-4,10],[-11,-7],[-10,-10]],[[1808,1847],[-32,-20],[-19,-11],[-18,-12]],[[1739,1804],[-14,31],[-6,8],[-9,10],[-10,9],[-8,7],[-7,7]],[[1757,1958],[33,21]],[[1790,1979],[11,-24]],[[1801,1955],[-15,-9],[0,-3],[8,-17],[21,-47],[0,-2],[-2,-2],[-14,-9],[9,-19]],[[1892,1898],[-50,-31],[-34,-20]],[[1801,1955],[11,8],[5,3],[14,8],[2,0],[1,-1],[10,-22],[16,10],[22,-47],[10,-16]],[[1926,1919],[-34,-21]],[[1790,1979],[25,17],[2,1],[4,3],[5,3],[10,8]],[[1836,2011],[22,19],[26,29]],[[1884,2059],[12,-25],[-9,-7],[-8,-8],[37,-79],[10,-21]],[[7184,3585],[-31,26],[-4,10]],[[7149,3621],[14,27],[7,10],[-7,5]],[[7163,3663],[7,12],[12,24],[12,24],[13,22],[12,21]],[[7294,3707],[-14,-13],[-9,-8],[-11,-11],[-22,-18],[-17,-15],[-8,-8]],[[7213,3634],[-5,-4],[-3,-5],[-1,-3],[-7,-13]],[[7197,3609],[-10,-16],[-1,-4],[-2,-4]],[[7163,3663],[-56,42]],[[7107,3705],[6,11],[12,25],[13,24]],[[7138,3765],[11,22],[13,22]],[[7162,3809],[57,-43]],[[7041,3571],[73,17],[4,8],[31,25]],[[7184,3585],[-8,-15],[-3,-6],[-8,-15]],[[7041,3571],[3,15],[5,12],[15,26],[1,2]],[[7078,3651],[12,20],[12,23],[5,11]],[[7197,3609],[41,-30],[14,23],[1,1]],[[7253,3603],[4,-4],[1,-1],[3,-3]],[[7261,3595],[-8,-18],[-44,-84]],[[7213,3634],[34,-27],[1,-1],[5,-3]],[[7279,3582],[-18,13]],[[7337,3728],[1,-7],[1,-2],[1,-2],[3,-2],[39,-31],[23,-15]],[[7405,3669],[-15,-27],[-26,-16],[-24,-13],[-21,-10],[-18,-13],[-12,-16]],[[7467,3693],[-7,1],[-10,1],[-11,-4],[-4,-1],[-3,-2],[-6,-1],[-8,-2],[-6,-3],[-7,-13]],[[7417,3758],[11,3],[53,8],[19,2],[8,0]],[[7508,3771],[0,-7],[-13,-9],[1,-24],[5,-1],[11,-7],[-36,-26],[-9,-4]],[[7621,3366],[-86,59],[-6,-8],[-57,37],[-6,-12],[-79,53]],[[7467,3693],[3,-5],[27,-23],[4,-5],[21,-12],[16,28]],[[7538,3676],[34,8],[12,-13],[-3,-36],[17,-23],[23,-5],[29,-10],[-9,-13],[-2,-16],[50,-51],[-68,-151]],[[7508,3771],[35,5],[14,2]],[[7557,3778],[27,1]],[[7584,3779],[49,-8]],[[7633,3771],[4,0],[4,-1],[2,-1],[11,-3],[7,1],[23,11],[9,2]],[[7693,3780],[2,0],[2,0],[3,-1],[9,-6],[8,-5]],[[7717,3768],[-3,-8],[-1,-3],[-5,-9],[-2,-3],[-2,-2],[-8,-8],[-1,-1],[-2,-2],[-3,-2],[-3,-1],[-4,-1],[-9,1],[-53,3],[-33,-1],[-3,0],[-4,-1],[-3,-1],[-3,-2],[-4,-3],[-7,-7],[-3,-4],[-11,-18],[-12,-19]],[[7583,3811],[12,-9],[5,9],[39,-29],[-6,-11]],[[7584,3779],[2,7],[-13,9],[-3,1],[-12,9],[9,18]],[[7567,3823],[16,-12]],[[7583,3811],[20,41]],[[7603,3852],[14,-10],[39,-29]],[[7656,3813],[18,-12],[19,-21]],[[7603,3852],[13,22],[5,10]],[[7621,3884],[3,-2],[9,-7],[2,-2]],[[7635,3873],[10,-7],[20,-14],[9,-6]],[[7674,3846],[-6,-12],[-6,-11]],[[7662,3823],[-5,-9],[-1,-1]],[[8132,4257],[13,22]],[[8145,4279],[8,-6],[26,-20],[8,-6]],[[8187,4247],[-5,-8],[-8,-14]],[[8132,4257],[-11,9],[-36,27],[-9,7],[-7,6],[-2,2]],[[8067,4308],[-27,20],[-2,2],[-8,6]],[[8030,4336],[13,22],[9,16]],[[8052,4374],[10,16]],[[8062,4390],[8,-6],[27,-22],[2,-1],[8,-7],[56,-43]],[[8163,4311],[-9,-16],[-9,-16]],[[8118,4233],[-11,8],[-35,28],[-7,-11],[-6,-11]],[[8059,4247],[-9,7]],[[8050,4254],[-9,7]],[[8041,4261],[6,11],[6,11],[7,12],[7,13]],[[8093,4189],[-10,8],[6,11],[6,12],[-36,27]],[[8082,4170],[-10,8],[-28,21],[-8,6],[-9,7]],[[8027,4212],[11,20],[12,22]],[[8052,4120],[-9,7],[5,9],[5,9],[-45,34]],[[8008,4179],[5,10],[5,8],[9,15]],[[8035,4095],[-5,9],[-6,5],[-30,22],[-9,7]],[[7985,4138],[8,15],[5,9],[1,2],[4,7],[5,8]],[[7985,4138],[-10,7],[-28,21],[-9,7]],[[7938,4173],[13,24]],[[7951,4197],[11,18]],[[7962,4215],[7,-6],[39,-30]],[[7962,4215],[9,18],[9,15]],[[7980,4248],[10,-7],[1,-2],[22,-16],[5,-4],[9,-7]],[[2022,1996],[-6,1],[-32,-19],[-9,-7]],[[1975,1971],[-1,6],[-16,34],[-10,21],[-17,36],[-3,6],[-3,0],[-15,-20],[-9,19],[-1,5]],[[1900,2078],[18,23],[46,53]],[[1964,2154],[17,-20],[2,-2]],[[1983,2132],[13,-28],[11,-24],[-17,-14],[10,-23],[11,-24],[11,-23]],[[1900,2078],[-48,103],[-4,-3],[-13,-9],[-2,-1],[-12,-8],[-15,-9]],[[1787,2228],[5,4],[11,5],[5,6],[6,8]],[[1888,2229],[9,13],[11,-23],[-14,-19],[-1,-3],[31,-66],[33,34],[7,-11]],[[1900,2078],[-16,-19]],[[1836,2011],[-13,27]],[[1823,2038],[12,8],[7,7],[26,31],[2,2],[0,2],[0,3],[-3,7],[-6,11],[-25,-19],[-5,-4],[-2,-3],[-3,-4],[-13,12],[-4,4],[-3,3],[-8,14],[-2,2],[-18,-9]],[[1778,2105],[-10,23]],[[7785,4046],[-12,-22]],[[7773,4024],[-10,7],[-10,7],[-8,-15],[-1,-2],[-10,7],[-10,8]],[[7724,4036],[9,18],[12,22]],[[7745,4076],[30,-23],[10,-7]],[[7773,4024],[-8,-15],[-2,-3],[-8,-15],[-1,-2]],[[7754,3989],[-9,-16],[-10,-17]],[[7735,3956],[-39,29]],[[7696,3985],[10,17],[9,17],[9,17]],[[7713,3916],[-10,8],[-19,14],[-9,8]],[[7675,3946],[6,11],[6,11],[9,17]],[[7735,3956],[-10,-18],[-5,-10],[-7,-12]],[[7675,3946],[-3,2],[-8,7],[-9,6],[-1,1],[-9,7],[-9,8],[-9,7],[-17,12]],[[7632,4035],[24,-19],[11,-7],[27,-22],[2,-2]],[[7675,3946],[-14,-26]],[[7661,3920],[-3,1],[-2,0],[-8,6],[-9,7],[-9,7],[-19,13],[-17,13]],[[7661,3920],[-12,-22]],[[7649,3898],[-14,-25]],[[7621,3884],[-6,5],[-9,6],[-17,13],[-17,12],[-3,2]],[[7700,3892],[-12,-22]],[[7688,3870],[-10,7],[-1,1],[-18,13],[-9,7],[-1,0]],[[7713,3916],[-13,-24]],[[7617,4078],[14,-10],[9,-8],[-3,-6],[38,-29],[13,24],[5,11]],[[7693,4060],[10,-8],[9,-6],[9,-8],[3,-2]],[[7654,4145],[14,-11]],[[7668,4134],[36,-26],[10,-8]],[[7714,4100],[-4,-8],[-8,-15],[-4,-9],[-5,-8]],[[7714,4100],[8,15],[8,17],[2,6]],[[7732,4138],[23,-17],[8,-6],[2,-2]],[[7765,4113],[-7,-13],[-4,-9],[-9,-15]],[[7668,4134],[8,16],[5,10],[6,12]],[[7687,4172],[45,-34]],[[7687,4172],[9,19],[10,-7],[11,21],[-10,7],[7,13],[6,13]],[[7720,4238],[37,-28],[2,-1],[5,-2],[1,-1],[1,-1]],[[7766,4205],[-7,-15],[-6,-12],[-11,-22],[-10,-18]],[[7766,4205],[3,-2],[5,-4],[17,-12],[8,-6],[3,-2]],[[7802,4179],[-8,-14],[-8,-13]],[[7786,4152],[-11,-22],[-10,-17]],[[7810,4195],[-8,-16]],[[7766,4205],[9,16],[5,10],[5,10]],[[7785,4241],[7,12],[8,-7],[17,-13],[8,-6],[3,-2]],[[7828,4225],[-6,-11],[-12,-19]],[[7720,4238],[5,9],[5,8],[5,10],[6,10],[44,-34]],[[7840,4247],[-12,-22]],[[7720,4238],[-36,26],[-3,5],[-8,9],[-4,5],[-5,3],[-20,16]],[[7644,4302],[37,53],[1,1]],[[7682,4356],[8,-7],[8,-9],[19,-15],[86,-50]],[[7803,4275],[9,-7],[16,-13],[9,-7],[3,-1]],[[7687,4172],[-29,22],[-14,10]],[[7596,4242],[9,8],[6,8],[18,25],[13,17],[2,2]],[[7591,4344],[20,-15],[3,-1],[28,-21]],[[7642,4307],[-2,-3],[4,-2]],[[7596,4242],[-4,3],[-19,15],[-16,11],[-5,2]],[[7552,4273],[8,14],[6,11],[6,11],[6,11],[-67,52]],[[7511,4372],[6,12],[6,11]],[[7523,4395],[68,-51]],[[7591,4344],[6,10],[5,10],[6,12]],[[7608,4376],[33,-24],[22,-16],[-9,-12],[-6,-9],[-6,-8]],[[7523,4395],[6,10],[5,10],[7,11]],[[7541,4426],[39,-29],[28,-21]],[[7541,4426],[6,12],[8,13]],[[7555,4451],[7,14],[6,12]],[[7568,4477],[37,-27],[31,-23]],[[7636,4427],[-6,-12],[-8,-14],[-7,-13],[-7,-12]],[[8574,3762],[-30,-96],[-18,-58],[-9,-42],[-3,0],[-5,0],[-4,-2]],[[8433,3609],[13,36],[10,31],[8,18],[8,17]],[[8472,3711],[7,14],[7,14],[2,3]],[[8472,3711],[-6,5],[-4,3],[-5,4],[-2,2],[-12,10],[-8,5],[-16,-28],[-5,-9],[-24,18]],[[8390,3721],[20,38]],[[8410,3759],[8,14],[9,15]],[[8359,3664],[5,10],[7,12],[4,8],[7,12],[8,15]],[[8360,3787],[24,-18],[20,-15],[6,5]],[[8068,3836],[8,15],[4,8],[6,12]],[[8129,3839],[-11,-20],[-9,-15],[-8,7],[-25,19],[-8,6]],[[8059,3820],[5,8],[4,8]],[[533,371],[-1,-3],[-1,-6],[-3,-6],[-2,-4],[-5,-11],[-5,-9],[-2,-3],[-2,-5],[-2,-7],[-1,-3],[-1,-6],[-1,-5],[-1,-7],[0,-5],[0,-7],[0,-5],[0,-6],[1,-8],[2,-10],[1,-5],[2,-15],[0,-4],[0,-3],[0,-2],[-1,-4],[-1,-6],[-1,-3],[-3,-7],[-2,-6],[-1,-4],[0,-4],[-1,-5],[0,-7]],[[502,180],[0,-3],[3,-10],[1,-3]],[[506,164],[-2,-2],[-5,-3],[-10,-8],[-7,-6],[-7,-7],[-7,-8],[-10,-11],[-8,-10],[-6,-11],[-4,-6],[-8,-16],[-9,-18]],[[423,58],[-1,1],[-5,3],[-5,-4],[0,-4],[-3,2],[-18,14],[-23,19],[-30,17],[-6,1],[-1,3],[3,0],[33,-17],[26,-22],[2,5],[-15,16],[3,1],[23,-16],[16,-13],[2,5],[-15,9],[-17,14],[-19,30],[0,3],[4,4],[1,7],[-1,6],[3,10],[0,9],[6,14],[2,3],[1,7],[0,2],[-1,5],[-14,19]],[[374,211],[19,37]],[[393,248],[7,-11],[11,-16],[5,-8],[4,-6],[13,-19],[5,11],[21,39],[17,35],[18,33],[3,5],[14,25],[7,14],[9,17],[-1,6],[5,-4],[2,2]],[[393,248],[-2,3],[-4,6],[-6,14],[4,7],[9,16],[15,30],[18,34],[-24,17],[-24,18],[-21,16],[-3,2],[-70,53],[-1,0],[-1,0],[-2,-1],[-3,0],[-3,4],[-13,22],[-8,15],[-10,15],[-4,8],[-30,33],[-19,19],[-10,11],[-4,5],[-3,3],[-2,3],[-4,11],[-3,8],[-1,11],[0,2],[-1,3],[0,7],[5,1],[8,1],[21,3],[18,2],[10,1],[10,0],[10,0],[10,-1],[42,-5],[12,-2],[41,-5],[4,-1],[50,-6],[59,-8]],[[463,623],[4,-6],[64,-126],[1,-5]],[[532,486],[0,-2],[0,-6],[-1,-8],[0,-17],[1,-11],[3,-25],[1,-13],[1,-4],[0,-7],[-1,-8],[0,-3],[-1,-2],[-1,-5],[-1,-4]],[[790,1603],[48,-45],[181,-263]],[[1019,1295],[-32,-16],[-7,15],[-18,-11],[-70,-42],[8,-20],[-77,-58],[-12,20],[-35,-27],[-72,50],[-19,-33],[-37,-19],[-9,30],[-42,-26],[-5,-68],[-25,-15],[-4,-64],[-45,38],[-148,-241],[27,-17],[3,-8],[62,-154],[1,-6]],[[374,211],[-1,2],[-3,1],[-3,6],[-3,2],[-4,2],[-4,7],[-2,3],[-8,10],[-5,13],[-5,8],[-3,2],[-13,16],[-4,7],[-6,20],[-8,13],[-6,9],[-2,6],[-1,8],[-6,12],[-4,6],[-5,4],[-10,6],[-4,-2],[-8,-8],[-3,0],[-3,5],[-7,1],[-1,8],[-7,11],[-3,8],[-4,3],[-5,7],[-4,0],[-3,-5],[-3,-1],[0,3],[2,5],[2,14],[0,9],[2,5],[2,1],[0,2],[1,3],[2,-3],[8,1],[5,5],[5,7],[5,14],[0,12],[0,5],[-3,12],[-4,9],[-4,6],[-2,7],[-4,3],[-4,1],[-7,-3],[-11,-1],[-7,4],[-5,6],[-4,10],[-2,8],[-9,13],[-2,-1],[-2,-2],[-8,-11],[-3,-7],[-4,-10],[-1,-8],[-2,0],[-2,4],[3,10],[-2,9],[0,6],[-1,3],[-5,5],[-3,1],[-1,6],[2,4],[0,3],[-17,29],[-6,13],[-6,9],[-3,2],[-6,0],[-7,0],[-1,-1],[-3,-1],[-14,-3],[-3,-11],[0,-4],[-4,-4],[-9,1],[-5,-4],[-8,-4],[-3,4],[0,7],[0,5],[-1,4],[-2,2],[-3,1],[-4,-2],[-5,-4],[-6,-5],[-5,-4],[-3,-1],[-3,-2],[-1,1],[0,-3],[-3,1],[-1,2],[-9,2],[-2,-1],[0,-3],[-2,-2],[-3,0],[-2,12],[1,4],[19,3],[0,3],[0,2],[-2,2],[-5,-1],[-6,-1],[-4,-1],[0,3],[-1,4],[-2,6],[0,3],[5,2],[2,-1],[2,1],[2,6],[5,14],[2,8],[5,8],[3,4],[4,3],[4,5],[4,4],[11,0],[14,-7],[4,-4],[2,-11],[2,-7],[5,-8],[7,-4],[4,-1],[3,-3],[3,1],[6,0],[9,1],[4,1],[3,0],[0,2],[-3,5],[1,7],[4,7],[2,10],[4,10],[-3,6],[-3,2],[0,4],[2,4],[3,11],[0,8],[-3,12],[-10,10],[-8,9],[-5,3],[-11,3],[-3,3],[-1,3],[-3,0],[-5,1],[-6,7],[-15,1],[-4,-7],[-4,-1],[-5,2],[-5,9],[-3,10],[-2,9],[-6,14],[2,35],[0,13],[-1,3],[0,4],[-2,8],[5,13],[4,9],[4,12],[-5,5],[-2,3],[0,3],[2,1],[7,-3],[7,2],[3,15],[-1,5],[-10,12],[0,5],[3,8],[5,18],[2,11],[5,8],[3,9],[3,13],[1,15],[2,12],[2,15],[3,9],[1,18],[6,22],[1,6],[3,28],[0,1],[2,3],[1,2],[6,-6],[1,0],[2,-2],[-3,-6],[1,-1],[2,-1],[3,5],[2,-1],[5,12],[2,-1],[-3,-7],[2,-1],[6,12],[9,40],[13,15],[9,3],[6,6],[18,-7],[6,-3],[7,2],[5,8],[4,8],[2,10],[-1,7],[-4,7],[-4,13],[-9,36],[-2,11],[0,4],[1,10],[2,4],[1,1],[3,2],[3,2],[0,3],[2,2],[7,2],[1,3],[2,0],[1,-10],[-1,-10],[13,-7],[3,-14],[1,-4],[5,1],[7,5],[6,6],[2,3],[1,3],[1,3],[4,3],[6,2],[5,0],[6,-8],[0,-5],[4,-3],[3,-1],[4,4],[3,9],[3,3],[2,1],[3,0],[7,10],[2,1],[2,-1],[1,-1],[3,1],[3,1],[1,3],[-5,8],[2,2],[5,-8],[2,0],[2,2],[4,0],[3,-4],[3,2],[2,4],[2,2],[2,0],[1,4],[13,8],[4,0],[8,-4],[5,-1],[3,1],[8,4],[5,1],[7,5],[4,7],[3,10],[1,11],[-1,9],[-4,9],[-5,7],[-7,1],[-3,-1],[-5,0],[-24,14],[-6,8],[-2,7],[2,6],[6,5],[4,1],[27,-1],[8,1],[10,7],[11,3],[8,0],[7,-1],[5,-7],[4,-9],[6,-7],[9,-13],[8,-1],[9,3],[22,0],[12,-1],[5,1],[8,3],[8,5],[5,4],[-1,7],[-13,10],[-1,5],[22,-1],[-1,2],[-3,5],[-5,3],[-3,4],[5,0],[9,-4],[7,4],[12,4],[4,5],[3,11],[0,9],[-4,5],[-3,2],[-13,7],[-3,2],[-3,1],[-5,0],[-13,7],[1,7],[6,13],[6,5],[7,0],[4,0],[3,-4],[5,-1],[3,0],[4,5],[5,11],[2,4],[4,5],[5,7],[8,7],[11,10],[3,1],[3,-9],[1,-2],[12,1],[4,-4],[4,-6],[3,-2],[5,-1],[1,1],[1,5],[1,1],[2,0],[0,-7],[0,-4],[3,0],[2,3],[2,-3],[1,-2],[5,-1],[8,1],[-1,3],[4,6],[7,2],[2,-6],[6,-1],[9,-6],[6,-14],[21,-4],[11,-6],[9,-2],[7,-1],[6,7],[6,0],[9,-2],[6,4],[7,12],[15,12],[2,9],[7,3],[7,14],[6,-12],[9,-1],[1,2],[-6,4],[-1,3],[1,6]],[[919,1105],[19,9],[-8,23],[1,1],[18,10],[49,25],[5,2],[4,2],[11,2],[5,1]],[[1023,1180],[28,-74],[-18,-11],[-19,-12],[-15,-9],[-1,-1],[-1,-1],[0,-1],[-1,-1],[-1,-1],[0,-2],[-3,-9],[-13,-49],[-1,-2],[-1,-4],[0,-1],[-1,-2],[-1,-2],[-2,-1],[-2,-1],[-5,-3],[-4,-2],[-5,16],[-1,2],[0,2],[1,1],[0,2],[2,11],[-8,3],[-2,2],[-1,1],[-1,1],[-1,3],[-3,7],[-6,16],[-18,47]],[[919,1105],[-9,24],[-8,20],[-14,34],[0,3],[1,1],[17,9],[19,11],[-8,20],[-7,17],[0,2],[1,0],[0,1],[0,1],[58,30],[2,0],[2,0],[1,-1],[4,-8],[1,-3],[1,-4],[1,-1],[0,-1],[-1,-1],[-8,-4],[7,-21],[18,9],[26,-63]],[[4094,3309],[23,-28],[-33,-36],[6,-6]],[[4090,3239],[-20,-5],[-13,-16],[-5,-4],[-5,1],[-5,2],[-4,5],[-9,20],[-3,9],[-5,8]],[[4021,3259],[16,16]],[[3947,3388],[8,4],[8,6]],[[3989,3344],[-5,5],[-37,39]],[[4025,3298],[-17,-13],[-2,0],[-12,10],[-12,15],[-4,2],[-5,1],[-4,-2],[-5,-3],[-6,-1],[-10,-14],[-1,-2],[-1,-9]],[[3946,3282],[-24,2],[-7,2],[-22,25],[-9,7],[-36,13],[-6,1],[-2,0],[-4,-2],[-11,-7],[1,3]],[[3826,3326],[10,7],[3,12],[3,13],[-48,15]],[[3794,3373],[-3,1]],[[3791,3374],[3,9],[7,26]],[[3801,3409],[2,-1],[72,-25],[14,-3],[15,-1],[5,0],[6,1],[16,2],[10,3],[6,3]],[[1702,1781],[9,-20],[16,10],[3,0],[21,-47],[32,-68]],[[1783,1656],[8,-18],[-1,-3],[-15,-20],[-7,-8],[-11,-18]],[[1757,1589],[-8,7],[-4,1],[-19,-2],[-25,-10],[-10,-4],[-4,-3],[-5,-5],[-9,22]],[[1673,1595],[15,12],[33,13],[-3,26]],[[1718,1646],[0,4],[-2,9],[-5,12],[-7,-3],[-31,-17],[-12,-7],[-9,-5],[-3,-1],[-2,2],[-6,19],[-8,23],[-7,23],[-3,6],[-5,11],[-2,5],[2,2],[31,20],[12,8],[41,24]],[[1757,1589],[-6,-11],[-4,-4],[-29,-21],[-37,-28],[-4,-2],[-2,-2],[-8,-3],[-6,-1],[-2,26],[0,8],[-2,27],[1,4],[12,11],[3,2]],[[1515,1277],[-13,1],[-3,0],[-4,-2],[-17,39],[-2,5],[-30,-19],[-1,0],[0,-1],[3,-19],[0,-1],[1,-1],[1,0],[1,0],[13,7],[1,0],[1,0],[1,0],[1,-1],[1,-1],[8,-17],[2,-5],[1,-5],[4,-27],[1,-1],[5,2],[3,0],[4,0],[8,-1],[1,-5],[2,-14],[1,-9],[-2,-26]],[[1507,1176],[-9,1],[-11,1]],[[1487,1178],[-3,4],[2,34],[-10,5],[-11,51],[-11,-7],[-9,2],[-8,15],[-5,32],[-14,99],[26,13],[-9,52]],[[1435,1478],[45,25],[17,-37],[24,11],[-3,16],[42,12]],[[1560,1505],[5,-19]],[[1565,1486],[-4,-2],[-14,-6],[-9,-6],[-12,-6],[-42,-22],[6,-23],[7,-20],[6,-17],[4,-11],[3,-5],[5,-11],[5,-9],[4,-6],[1,-6],[1,-5],[-1,-6],[-2,-9],[-3,-15],[-5,-24]],[[1565,1486],[11,-56],[3,-18],[1,-9],[1,-5],[2,-13],[4,-22],[8,-45],[0,-20],[0,-10]],[[1595,1288],[-52,-11],[-11,-2],[-4,-1],[-13,3]],[[1595,1288],[2,-9],[6,-19],[8,-21],[-36,-19],[-4,-4],[-5,-3],[-7,-7],[-10,-12],[-3,-4],[-12,-23],[-4,3],[-9,3],[-5,2],[-3,1],[-6,0]],[[1832,1366],[-6,-5],[-12,-10],[-11,-8],[-4,-2],[-7,-3],[-2,-1],[-6,0],[-3,0],[-6,1],[-8,6],[-5,3],[-15,10],[-4,3],[-3,2],[-11,8],[3,4],[2,5],[1,4],[1,5],[2,5],[1,4],[0,6],[0,12],[4,0],[5,1],[2,1],[5,3],[4,2],[5,1],[3,1],[1,0],[2,2],[1,3],[5,-4],[2,0],[1,0],[1,0],[14,4],[1,0],[0,1],[0,1],[0,1],[-4,22],[-2,14],[-1,1],[0,1],[-1,1],[-14,2],[0,8],[1,16]],[[1774,1497],[8,-1],[2,0],[2,0],[1,1],[2,0],[2,1],[2,1],[2,2],[6,3],[18,11],[4,3],[2,-6],[2,-7],[1,-5],[0,-3],[0,-2],[-1,-1],[-1,-2],[4,-9],[1,-4],[14,-69],[1,-3],[0,-1],[-18,-13],[-2,-4],[0,-2],[0,-3],[2,-8],[0,-2],[4,-8]],[[1934,1567],[23,-37],[26,-44]],[[1983,1486],[-93,-74],[-2,-2],[-6,-6],[-3,-2],[-6,-5],[-15,-10],[-26,-21]],[[1774,1497],[-1,9],[-8,45],[1,6],[2,6],[13,19],[7,-6],[2,-2],[1,-2],[4,-7],[1,0],[1,0],[14,9],[1,1],[1,1],[0,1],[0,1],[0,1],[-8,18],[-2,3],[-6,6],[13,15],[3,1],[5,1],[-17,8]],[[1801,1631],[12,15]],[[1813,1646],[20,24],[22,2]],[[1855,1672],[1,-13],[5,0],[14,1],[13,1],[1,-1],[1,0],[0,-1],[1,0],[13,-29],[21,-45],[9,-18]],[[1861,1129],[-7,35],[-2,10],[-45,-6],[2,-12],[-15,-4]],[[1794,1152],[-162,-19],[-4,13]],[[1628,1146],[27,10],[6,2],[22,9],[19,9],[10,4],[16,8],[6,3],[-2,6],[-1,3],[-1,5]],[[1730,1205],[43,23],[5,3],[4,3],[6,-5],[16,9],[15,10],[12,9],[19,13],[23,17],[22,19],[23,18],[67,55],[21,17],[7,6],[14,11]],[[2027,1413],[3,-5]],[[2030,1408],[-22,-19],[1,-7],[14,-64]],[[2023,1318],[-11,-5],[-23,-8],[19,-95],[-31,-17],[-14,4],[-19,-2],[-14,51],[-19,-10],[-9,-9],[1,-3],[-14,-6],[16,-73],[-44,-16]],[[1956,1014],[-20,-6],[-16,-5],[-20,-6]],[[1900,997],[-2,11],[-1,5],[2,5],[3,5],[-9,11],[-1,3],[-1,4],[-3,14],[-9,42],[-5,23]],[[1874,1120],[-13,9]],[[2023,1318],[1,-3],[5,-25],[5,-23],[-19,-5],[3,-15],[0,-5],[-4,-10],[-1,-5],[2,-6],[3,-3],[6,-8],[2,-5],[2,-8]],[[2028,1197],[-15,-4],[-6,-2],[-4,-1],[-10,-7],[-6,-6],[-7,-5],[-10,-11],[-3,-3],[-4,-4],[-2,-1],[-5,-2],[-14,-6],[-6,-4],[-2,-2],[-2,-2],[-2,-3],[-3,-6],[-1,-3],[-2,-8],[-1,-7],[0,-11],[0,-13],[14,1],[3,-2],[1,-4],[1,-3],[14,-64]],[[1874,1120],[-22,-9],[6,-25],[5,-22],[2,-11],[1,-5],[0,-5],[-1,-9],[-1,-1],[-1,-1],[-1,-1],[-1,0],[-24,6],[-22,5],[1,10],[0,9],[0,9],[-5,21],[-6,27],[-6,27],[-2,0],[-1,1],[0,1],[0,1],[0,1],[1,0],[-3,3]],[[1900,997],[14,-65],[72,-11],[9,-12],[5,-4],[-2,-2]],[[1998,903],[-54,-16],[-40,-10],[-47,-12],[-45,-12],[1,-6]],[[1813,847],[-136,-37],[-38,-8],[-32,-9],[-54,-17]],[[1553,776],[-46,314],[-1,2]],[[1506,1092],[0,1],[7,3],[12,6],[16,8],[19,9],[19,8],[9,4],[16,6],[24,9]],[[2040,958],[4,-7],[4,-5],[10,-8],[3,-2],[3,-5],[3,-11],[-69,-17]],[[1956,1014],[8,2],[2,0],[1,0],[3,-2],[28,-22],[7,17]],[[7827,2883],[-1,2],[-31,15]],[[7795,2900],[-50,27]],[[7745,2927],[13,22],[3,1],[2,4],[3,3]],[[7766,2957],[2,4],[1,2],[7,10],[8,9]],[[7784,2982],[21,-21],[20,-19],[7,-7],[9,-9],[9,-9]],[[7850,2917],[-3,-5],[-14,-20],[-2,-3],[-4,-6]],[[2028,1197],[20,4],[21,4]],[[2069,1205],[13,3],[4,-1],[3,-2],[2,-5],[4,-35],[1,-24]],[[2096,1141],[3,-24],[0,-6],[0,-3],[-1,-4],[-1,-3],[-4,-5]],[[1830,564],[-15,90]],[[1815,654],[-23,137],[-2,10],[1,4],[2,1],[28,7],[-1,5],[-1,4],[-1,3],[-1,5],[-2,7],[-2,10]],[[1813,847],[66,16]],[[1879,863],[3,-17],[1,-4],[0,-3],[1,-4],[0,-3],[3,-2],[2,-7],[-1,-3]],[[1888,820],[3,-9],[5,-15],[5,-18],[21,-101]],[[1922,677],[18,-86]],[[1940,591],[-36,-9],[-42,-9],[-19,-4],[-13,-5]],[[2004,847],[5,-26],[12,-61],[0,-3],[0,-2],[-1,-1],[-1,-1],[-4,-3],[-5,-3],[-10,-3],[6,-29],[-19,-11],[-23,-12],[-9,-5],[-12,-4],[-21,-6]],[[1888,820],[25,7],[22,5],[34,9],[4,0],[5,-2],[6,-2],[5,1],[4,2],[6,4],[5,3]],[[2077,670],[-5,-3],[-30,-27],[-12,-10],[-11,-8],[-12,-8],[-17,-9],[-10,-4],[-18,-5],[-22,-5]],[[2004,847],[21,5],[43,11],[5,-23],[5,-22],[5,-24],[6,-29],[-17,-11],[-3,-1],[0,-3],[5,-21],[-18,-10],[-2,-3],[0,-4],[4,-20],[3,-1],[9,5],[7,-26]],[[1962,486],[-1,4],[0,17],[-4,9],[-4,10],[-13,65]],[[2077,670],[15,8],[14,5],[26,9],[4,1],[30,10],[16,5],[5,3],[4,2],[3,1],[5,3],[6,4],[5,4],[5,4]],[[2215,729],[4,5],[9,10]],[[2228,744],[35,-8],[37,-30]],[[2300,706],[-2,0],[-10,-1],[0,-2],[-15,-8],[7,-17],[-5,-2],[-8,12],[-2,-1],[-2,-1],[-1,-3],[-3,-5],[-4,-5],[-6,-10],[-8,-9],[-7,-3],[-7,-3],[-5,-3],[-16,-5],[-4,9],[-4,1],[-2,-2],[-2,-6],[-8,0],[0,-4],[-3,-2],[-5,1],[-1,3],[-2,0],[0,-5],[0,-2],[-2,-1],[-5,-1],[-2,4],[-1,1],[-4,0],[-17,-5],[-3,-1],[-5,-4],[-4,-2],[-8,-7],[-6,-5],[-2,-3],[1,-6],[0,-2],[-3,-2],[-2,0],[-3,1],[-14,0],[-2,0],[-1,-2],[0,-4],[-1,-2],[-1,-1],[-1,1],[-3,4],[-7,0],[-5,3],[-6,0],[-2,-3],[-13,-8],[-5,-11],[-6,-4],[-4,-5],[-3,-2],[-8,-6],[-6,-3],[-5,-5],[-4,-8],[-2,-10],[-3,-8],[-5,-8],[-4,-5],[-2,-4],[-2,-8],[-2,-3],[-16,-1],[-3,-2],[-7,-5],[-4,-4]],[[2537,873],[-28,28]],[[2509,901],[31,18]],[[2540,919],[68,41],[7,-27],[2,-12],[2,-3],[2,-1],[14,-3],[14,-4],[10,-3],[16,-8],[16,-10]],[[2691,889],[9,-5],[6,-4],[4,-4],[4,-2],[13,-10],[6,-6],[6,-2],[51,-24],[28,-13],[6,2],[5,3],[5,4],[4,7],[3,7],[1,8],[1,5],[0,1],[-1,4],[0,3],[3,1],[4,2],[5,3],[8,3]],[[2862,872],[11,3],[11,3],[5,2]],[[2889,880],[9,-7]],[[2898,873],[-4,-1],[-5,-5],[-12,-3],[-18,-8],[-2,-4],[0,-8],[-1,-5],[-1,0],[-3,1],[-4,-3],[-3,-2],[3,-3],[-2,-5],[5,-7],[-5,-6],[-4,3],[-7,-7],[-2,2],[-1,-2],[1,-2],[-4,-14],[-8,-7],[-10,-1],[-3,-4],[-4,-5],[-9,0],[-2,0],[1,20],[-3,13],[-1,1],[-3,-1],[-3,-3],[-2,1],[-7,5],[-1,1],[-7,1],[-3,1],[-2,2],[-7,4],[-7,2],[-9,4],[-4,4],[-3,0],[-2,2],[-2,2],[-3,9],[-1,11],[-2,5],[-6,3],[-6,5],[-5,-2],[-6,3],[-3,3],[-14,8],[-9,7],[0,1],[-1,1],[-7,1],[-5,1],[-14,8],[-6,2],[-4,3],[-11,4],[-10,5],[-3,0],[-7,-1],[-5,-3],[-9,-6],[-2,-2],[-9,-4],[-20,-9],[-8,-6],[-7,-2],[-6,-7],[-2,-1]],[[1618,401],[-2,10]],[[1616,411],[-4,21]],[[1612,432],[15,23],[11,13],[9,8],[12,8],[6,4]],[[1665,488],[6,-35],[6,-30],[10,3],[24,6],[18,5],[6,2],[6,2],[10,1],[-14,83],[28,12],[43,18],[22,9]],[[1962,486],[-10,-12],[0,-4],[2,-4],[2,-3],[4,-13],[0,-4],[-1,-7],[1,-11],[-3,-8],[-11,-13],[-4,-2],[-20,-2],[-2,-1],[-8,0],[-3,1],[-4,6],[-7,14],[-3,4],[-1,4],[-5,2],[-4,10],[-2,4],[-3,4],[-3,0],[-9,-4],[-2,0],[-8,-2],[-6,-2],[-8,-5],[-9,-2],[-5,-7],[-10,-11],[-7,-10],[-4,-4],[-18,0],[-7,5],[-4,4],[-10,4],[-8,4],[-5,1],[-7,1],[-8,-1],[-9,-2],[-14,-6],[-7,-5],[-10,-2],[-12,-5],[-17,-3],[-13,3],[-13,2],[-23,0],[-6,-3]],[[1665,488],[22,14],[12,8],[9,4],[1,3],[-4,22],[-3,15],[-1,9],[-12,74]],[[1689,637],[6,1],[5,0],[4,1],[14,4],[15,3],[12,2],[14,1],[33,3],[23,2]],[[1612,432],[-14,74],[-20,109]],[[1578,615],[-16,112]],[[1562,727],[9,3],[22,7],[21,6],[11,-65],[4,-25],[13,3],[1,-5],[4,-21],[19,4],[12,3],[11,0]],[[1562,727],[-4,21],[-1,5],[-4,23]],[[1578,615],[-12,-7],[-24,-14],[-4,-2],[-6,-3],[-11,-3],[-11,-2],[-16,-9],[-16,-9]],[[1478,566],[-5,34],[-8,47],[-26,-14],[-7,33],[-5,-2],[-8,-4],[-13,-4],[-6,-1],[-3,-1],[-15,-3],[-7,-4],[-19,-11],[-26,-16],[-43,-26],[-13,-8]],[[1274,586],[-31,-18],[-16,-9],[-12,-7],[-2,-3],[-1,-1],[-1,-3],[0,-1],[0,-4],[1,-12],[-1,-4],[-1,-3],[-3,-3],[-4,-2],[-3,0],[-3,0],[-3,0],[1,-12],[-34,-20],[-28,-17],[-7,-4],[-9,-5],[-11,-8],[-13,-9],[-3,-3],[-6,-4],[-2,-1],[-4,-2],[-48,-29],[0,-1]],[[1030,401],[-9,19],[-26,-16],[-40,-24],[-1,-1],[-1,-1],[0,-1],[-12,-118],[-28,3],[-12,-128],[0,-3],[0,-5],[2,-8],[5,-14]],[[908,104],[-9,-3],[-7,-2],[-7,-1],[-8,0],[-23,-1]],[[854,97],[4,44],[9,91],[3,33],[5,93],[-1,4],[21,226],[4,2],[7,3],[3,1],[4,2],[4,1],[1,1],[1,1],[5,2],[2,1],[2,2],[6,3],[2,1],[1,1],[1,0],[8,7],[4,2],[5,4],[8,7],[9,7],[1,1],[2,2],[4,4],[7,6],[1,1],[21,18],[19,17],[2,2],[3,3],[11,10],[24,21],[24,21],[1,1],[2,2],[19,17],[57,51],[14,12],[13,12],[4,3],[1,1],[1,1],[12,11],[12,11],[7,6],[8,7],[41,36],[35,31],[3,3],[5,4],[19,18],[24,21],[20,18],[9,8],[17,15],[7,6],[13,10],[16,12],[6,4],[5,4],[8,5],[5,3],[4,2],[5,3],[4,3],[6,3],[4,2],[8,4]],[[1478,566],[-24,-14],[-7,-5],[-14,-9],[-12,-5],[-25,-12],[-20,-8]],[[1376,513],[-12,-4],[-22,-15],[-24,-16],[-10,-7],[-11,-8],[-22,-10]],[[1275,453],[-2,3],[-1,15],[-1,14],[0,10],[0,8],[3,16],[2,11],[0,10],[0,10],[0,11],[-2,25]],[[2801,2509],[-8,14],[-43,35],[-3,3],[-21,35],[9,8],[3,6],[12,31],[20,-11],[11,-5]],[[2857,2557],[-5,-3],[-19,-17],[-32,-28]],[[3801,3409],[3,11],[2,-2],[8,-9],[3,0],[10,15],[10,-3],[4,-1],[2,0],[1,-1],[2,0],[2,7],[-2,5],[-26,26],[-59,63],[-13,-1],[-3,0],[-2,14],[-1,9]],[[3801,3409],[-36,12]],[[3765,3421],[-3,4],[-9,9],[-47,48],[-56,57],[-2,9]],[[3648,3548],[12,-2],[10,-3],[30,-6],[16,-2],[6,2],[10,4],[10,1]],[[3626,3472],[24,-11],[34,-12],[19,-6],[49,-18],[13,-4]],[[3791,3374],[-69,29]],[[3722,3403],[-59,23],[-37,46]],[[3794,3373],[-12,-48]],[[3782,3325],[-1,0],[-1,1],[-15,16],[6,8],[4,15],[-1,3],[-34,12],[-5,-7],[-6,-8],[-17,-14],[-2,-3],[0,-2],[10,-16],[17,-23],[12,-16]],[[3749,3291],[-16,-15],[-5,-6],[-6,-10],[-6,-16],[-3,-14]],[[3713,3230],[-18,5],[4,21],[4,16],[0,5],[-1,4],[-16,23]],[[3686,3304],[-6,9],[-7,10],[-71,-56],[-7,11]],[[3595,3278],[49,40],[61,74],[5,9],[12,2]],[[3782,3325],[-5,-20],[-3,-7]],[[3774,3298],[-7,-1],[-10,-1],[-8,-5]],[[3713,3230],[-1,-24]],[[3712,3206],[-35,11],[-10,2],[-11,-1],[-10,-2],[-2,-2],[0,-3],[1,-3],[17,-20],[2,-3],[-16,-10],[-19,23],[-3,9],[-3,1],[-16,-6],[-2,-3],[0,-3],[2,-3],[27,-31],[-16,-13]],[[3618,3149],[-15,17],[-14,17],[-7,14],[-5,12]],[[3577,3209],[16,10],[6,3],[17,7],[-5,15],[27,22],[16,12],[32,26]],[[3712,3206],[-1,-60]],[[3711,3146],[5,-45]],[[3716,3101],[-39,-6],[-11,-5],[-13,-9]],[[3653,3081],[-7,21],[-6,17],[-3,7],[-6,8],[-13,15]],[[3577,3209],[-16,-12],[-3,-4],[-10,-12],[-3,-7],[-4,-15],[-1,-10],[-2,-17],[-2,-10],[-6,-12],[-6,-9],[1,-1],[8,-15],[13,-24],[-1,-2],[-13,-10],[-10,18],[-13,24],[-10,-8],[-7,-6],[-5,-9]],[[3487,3068],[-10,5],[-11,3],[-13,0],[-9,-2],[-7,-3],[-9,-6],[-9,-7],[-16,-13],[-18,-14]],[[3385,3031],[-39,66]],[[3346,3097],[-25,44]],[[3321,3141],[18,14],[5,-10],[151,119],[27,-41],[73,55]],[[3321,3141],[-29,48]],[[3292,3189],[18,14],[20,16],[13,10]],[[3343,3229],[28,-47],[20,17],[20,16],[131,103],[1,2],[-1,4],[-12,20],[-14,23]],[[3516,3367],[22,16],[32,26],[26,21],[-94,34],[-79,30],[-12,21]],[[3411,3515],[-4,7],[-7,21]],[[3528,3531],[15,-10],[56,-35],[17,-9],[10,-5]],[[3343,3229],[11,9],[10,8],[20,16],[10,8]],[[3394,3270],[68,54],[21,16],[20,16]],[[3503,3356],[13,11]],[[3394,3270],[-14,23],[12,10],[-12,20],[-3,7],[-3,4],[-12,19],[-12,-9]],[[3350,3344],[-13,24],[68,54]],[[3405,3422],[20,18],[20,17],[23,-41],[12,-20],[12,-20],[11,-20]],[[3292,3189],[-25,42]],[[3267,3231],[-10,18]],[[3257,3249],[18,14],[-3,10],[-1,9],[1,9],[3,8],[11,18],[20,-16],[7,11],[6,6],[4,4],[27,22]],[[3257,3249],[-20,36],[13,10],[-6,11],[-13,-11],[-8,14],[-2,3]],[[3221,3312],[22,17],[-3,6],[-2,6],[0,21],[33,30],[5,5],[10,9],[15,14],[16,14],[22,-32],[17,13],[10,8],[16,12]],[[3382,3435],[11,8],[12,-21]],[[3382,3435],[-23,32],[-10,-9],[-18,20]],[[3331,3478],[-11,11],[13,18],[14,-15],[1,0],[2,0],[17,17],[10,11],[3,4],[3,0],[20,-7],[8,-2]],[[3331,3478],[-17,-16],[-48,49],[-54,56],[-25,25],[8,3],[7,4],[9,3],[13,2]],[[3224,3604],[17,-19],[29,-11],[68,-26],[-46,55]],[[3292,3603],[9,0],[7,0]],[[9039,4992],[-6,1],[-27,7],[-17,5],[-13,4],[-7,4],[-39,21],[-14,3],[-17,9]],[[8899,5046],[5,12],[4,11],[17,-9],[4,12],[5,12],[-17,9],[-9,5]],[[8908,5098],[8,24],[9,23]],[[8925,5145],[5,12],[4,12],[6,14],[0,3],[2,7]],[[8942,5193],[7,3],[6,1],[4,-1],[6,1],[5,0],[6,-1],[3,-1],[13,9],[1,0],[4,10],[3,5]],[[9000,5219],[3,-1]],[[9040,5199],[-24,-47],[4,-4],[-3,-9],[6,-5],[-2,-4],[19,-12],[5,12],[4,-2],[36,72],[-2,2],[25,45],[5,-3],[-18,-41],[4,-6],[1,-4],[-3,-10],[-3,-3],[-3,-6],[-3,-6],[-2,-5],[3,-5],[7,-11],[0,-3],[0,-3],[0,-3],[3,-3],[2,5],[38,59],[11,-9],[-75,-125],[-13,-25],[-23,-48]],[[8942,5193],[-9,4],[-15,8],[-9,5]],[[8927,5255],[60,-30],[3,-2],[10,-4]],[[8474,3994],[10,-7],[14,-12]],[[8498,3975],[26,-20]],[[8446,4016],[12,22],[8,-6],[13,-10],[8,-6]],[[8487,4016],[24,-19],[-13,-22]],[[8418,4037],[9,16],[3,6],[7,13],[9,14],[13,24]],[[8459,4110],[27,-21]],[[8486,4089],[10,-7],[18,-15]],[[8514,4067],[-6,-11],[-15,-28],[-6,-12]],[[8597,4005],[2,-1],[1,-1],[1,-1],[3,-3],[-2,-7],[5,-1],[3,-1],[12,-4],[12,-3]],[[8634,3983],[-13,-66],[6,-2],[-7,-34]],[[8514,4067],[17,-13],[16,-12],[10,-9],[4,-1],[5,-4],[19,-14],[6,-4],[6,-5]],[[3440,1055],[-2,1],[-17,26],[-5,3],[-5,3],[-6,-1],[-7,-3],[-8,-10],[-4,-8],[-3,-9],[-57,-8],[-6,-8],[-3,-2],[-2,-3],[-9,-6],[-1,-3],[-2,-1],[-4,-5],[-3,0],[-6,6],[-3,1],[-7,0],[-1,4],[-2,0],[-7,0],[-4,-2],[-12,-3],[-5,-1],[-10,0],[-5,-1],[-2,-3],[-3,-3],[-11,2],[-1,1],[-4,4],[-2,1],[-4,-1],[-10,-4],[-6,-5],[-3,-3],[-8,-5],[-6,-1],[1,-3],[-3,-4],[-7,-4],[-5,0],[-1,-1],[0,-2],[-1,-2],[0,-1],[2,-4],[0,-1],[-6,-14],[-1,-4],[1,-3],[17,-12],[-7,-7],[0,-5],[-4,-5],[-14,-6],[-6,-2],[-34,-20],[-5,-5],[-2,-3],[-10,-9],[-4,-7],[8,-11],[5,-7],[0,-4],[7,-4],[-1,-2],[7,-7],[2,2],[3,-2],[-6,-10],[-2,1],[-1,0],[2,-2],[1,-4],[-1,-2],[-14,-22],[-6,0],[-5,2],[-8,0],[-4,4],[-2,4],[-2,2],[-7,2],[-5,-2],[-9,-7],[-4,-1],[-12,-10],[-8,-9],[-3,-2],[1,-10],[3,-9],[1,-9],[0,-6],[-2,-4],[-4,-1],[-4,0],[-4,2],[-7,5],[-5,8],[-1,3],[0,4],[1,7],[6,11],[0,7],[-2,5],[-1,7],[-1,5],[1,7],[2,3],[-1,6],[-5,8],[-5,8],[-2,5],[-2,0],[-1,0],[-1,1],[-2,5],[-1,0],[-8,0],[-7,2],[-6,0],[-3,4],[-2,0],[-8,-2],[-4,0],[-4,5],[-9,4],[-4,-2],[-1,0],[-3,0],[-3,4],[-5,3],[-4,-3],[-6,-1],[-6,0],[-3,-1],[0,-1]],[[2889,880],[5,1],[12,4],[-5,22],[22,7],[8,-30],[10,-4],[5,-1],[7,-1],[-5,45],[5,1],[13,4],[20,7],[14,5],[21,7]],[[3021,947],[11,-49],[13,4],[4,3],[4,4],[4,4],[3,3],[15,8],[8,3],[26,7],[16,3],[6,2],[3,1],[3,3],[2,5],[5,10],[2,8],[1,11],[1,7],[4,9]],[[3152,993],[7,10],[6,6],[8,6],[9,6],[6,4],[8,3],[7,3],[6,1],[7,-1],[8,-1],[6,1],[3,0],[19,4],[5,1],[10,0],[14,-1],[8,-1],[8,2],[8,5],[15,18]],[[3320,1059],[22,26],[11,12],[19,21],[11,13],[6,7],[10,9],[8,6],[13,6]],[[3420,1159],[5,4],[20,-86],[-5,-22]],[[2889,880],[3,18],[-16,73],[-53,204],[-1,4]],[[2822,1179],[2,1],[9,4],[1,0],[34,16],[34,16],[20,9],[17,7],[14,6],[27,11],[1,-4],[1,-6],[2,-16]],[[2984,1223],[3,-19],[5,-32],[6,-23],[3,-13],[2,-9],[7,-22],[14,-55]],[[3024,1050],[16,-66],[8,-27],[-27,-10]],[[3024,1050],[19,8],[3,2],[23,7],[20,7],[20,7]],[[3109,1081],[4,-14],[9,-23],[4,-18],[3,-1],[3,-3],[20,-29]],[[3120,1129],[-6,-1],[-5,-2],[-2,-1],[-2,-3],[-1,-4],[0,-6],[5,-31]],[[2984,1223],[8,1],[4,-1],[14,-3],[9,-1],[13,-1]],[[3032,1218],[0,-2],[2,-10],[4,-17],[0,-2],[1,-2],[1,-1],[1,0],[20,-3],[7,0],[19,6],[4,1],[2,-3],[13,-17],[4,-6],[4,-6],[2,-6],[2,-7],[1,-9],[1,-5]],[[3120,1129],[2,2],[10,3],[32,10],[34,11]],[[3198,1155],[24,10],[11,8],[25,17],[17,11],[7,5],[17,11]],[[3299,1217],[1,-3],[2,-8],[0,-2],[1,-5],[0,-5],[-18,-12],[-1,-2],[0,-3],[0,-2],[16,-64],[5,-24],[4,-15],[2,-4],[9,-9]],[[3032,1218],[6,1],[14,4],[9,1],[8,0],[8,0],[3,1],[2,-1],[0,7],[3,10],[2,7],[4,5],[3,4],[22,16],[4,3],[5,10],[2,7],[33,10],[1,-1],[0,-1],[4,-15],[5,-20],[6,-22],[8,-33],[3,-12],[11,-44]],[[2822,1179],[0,1],[-5,18]],[[2817,1198],[114,52],[45,19],[45,20],[49,23],[20,8]],[[3090,1320],[27,11],[95,42]],[[3215,1375],[2,-11],[3,-13],[0,-1],[3,-13],[1,-3]],[[3224,1334],[1,-4],[23,7],[-2,-7],[0,-5],[1,-2],[10,-40],[6,-24],[6,-23],[23,8],[26,10],[7,4],[-5,21],[-6,23],[-11,48],[24,12],[39,22],[25,-104]],[[3391,1280],[-31,-21],[-61,-42]],[[3224,1334],[1,0],[3,1],[29,9],[5,2],[7,2],[14,5],[10,4],[10,4],[16,8],[9,5],[11,6],[8,4],[8,5],[12,8],[4,3],[12,7],[9,7],[11,8],[5,3],[13,8],[14,10],[7,5],[18,12],[13,9],[1,-4],[1,-3],[0,-2],[20,-81]],[[3495,1379],[-20,-19],[-4,-7],[-4,-7],[-3,-8],[-1,-8],[-2,-12],[-1,-18],[-15,1],[-12,-4],[-22,-7],[-9,-3],[-11,-7]],[[3948,1440],[2,-9]],[[3950,1431],[-5,0],[-2,1],[-3,5],[-3,8],[-9,5],[-2,3],[-10,9],[-6,4],[-4,4],[-3,2],[-15,5],[-3,3],[-4,0],[-14,0],[-8,6],[-3,2],[-7,4],[-24,15],[-5,2],[-11,3],[-8,1],[-2,-1],[-12,-8],[-13,1],[-3,7],[-4,3],[-10,3],[-2,3],[-3,1],[-13,4],[-36,-1],[-5,2],[-24,2],[-4,-5],[-1,-6],[-5,-1],[-4,3],[-8,0],[-11,-3],[-5,-7],[-5,0],[-2,1],[-7,0],[-10,-7],[0,-12],[-11,-10],[-16,-11],[-21,-20],[-2,-7],[2,-5],[2,-8],[-2,-3],[-2,-11],[-3,-8],[-5,-6],[-13,-12],[-5,-2],[-7,6],[-3,-2],[0,-3],[-13,-8],[-3,1],[-3,-2],[-19,-15],[-11,-12],[-8,-9],[-3,-8],[0,-6],[6,-2],[2,-8],[2,-12],[-4,-15],[-7,-22],[-4,-3],[-9,-20],[0,-4],[6,-20],[1,-7],[0,-9],[-2,-16],[-2,-5],[-2,-1],[-1,-1],[0,-3],[-4,-13],[-1,-9],[-1,-1],[3,-12],[0,-11],[0,-7],[6,-7],[5,-8],[12,-9],[1,-6],[1,-10],[-3,-1],[-4,0],[-3,-5],[0,-4],[-1,-6],[-6,-10],[-2,-6],[-4,0],[-4,-2],[-2,-4],[-5,3]],[[3420,1159],[-29,121]],[[3495,1379],[8,6],[9,5],[7,3],[4,2],[6,3],[6,6],[4,6],[5,10],[2,7],[2,8],[1,7],[1,7],[-1,6],[-1,5],[0,5],[1,6],[5,6],[4,3],[23,13],[5,3],[7,2],[4,3],[9,7],[5,3],[15,4],[5,3],[15,12],[5,2],[4,1],[3,-1],[5,0],[4,-1],[24,-1],[7,0],[6,1],[9,1],[2,0],[3,-1],[5,-1],[3,-1],[3,0]],[[3729,1529],[5,0],[4,-1],[9,-3],[12,-4],[3,-1],[6,-2],[6,-1],[3,1],[11,5],[5,1],[1,0],[4,-1],[1,0],[29,-12],[6,-3],[8,-7],[12,-7],[16,-7],[6,-2],[10,-2],[3,-1],[5,-2],[6,-2],[10,-6],[6,-5],[26,-21],[6,-6]],[[2801,2509],[-22,-21]],[[2779,2488],[-19,-15]],[[2760,2473],[-71,115]],[[2689,2588],[20,16],[7,8],[15,39]],[[2731,2651],[13,36],[4,7],[6,7],[5,5],[16,13]],[[2775,2719],[12,-20],[13,-24],[8,-13],[11,-6]],[[3648,3548],[-13,2],[-9,1],[-11,0],[-18,-2],[-16,1],[-16,2],[-4,11],[-4,3],[-14,4],[-2,2],[-5,19],[-14,-10],[-2,0],[-43,17],[2,8],[-2,3],[-35,35],[-17,-22],[6,-6],[17,-7],[-6,-21]],[[3442,3588],[-3,4],[-14,12],[-100,116],[-46,48]],[[3279,3768],[8,4],[15,4],[9,4],[10,1],[0,2],[1,1],[11,0],[6,0],[11,-1],[6,-2],[17,-7],[16,-8],[4,-4],[5,-7],[3,-8],[4,-7],[5,-3],[8,-2],[21,0],[2,2],[3,3],[1,1],[27,1],[33,-1],[8,-2],[8,-5],[3,-3],[1,-14],[4,-9],[4,-12],[0,-33],[3,-21],[3,-12],[3,-30],[2,-7],[5,-5],[7,-4],[5,-1],[6,-3],[2,-2],[11,-18],[3,-2],[3,-4],[3,0],[2,1],[3,1],[24,-2],[10,-1],[23,-2],[29,-6],[12,-1],[7,-2],[15,-2],[6,1],[8,4],[7,2],[7,1]],[[5918,1454],[-47,1]],[[5961,1453],[-43,1]],[[5918,1320],[0,8],[0,6],[0,120]],[[5985,1452],[0,-32]],[[5985,1420],[1,-99]],[[5986,1321],[-23,0],[-22,0]],[[5985,1420],[20,0],[20,0],[20,0]],[[6045,1420],[1,-99]],[[6046,1321],[-20,0]],[[6026,1321],[-21,0],[-19,0]],[[6045,1420],[20,0],[20,0],[20,1]],[[6105,1421],[0,-70],[0,-30]],[[6105,1321],[-19,0],[-21,0],[-19,0]],[[6105,1321],[1,-64]],[[6106,1257],[-14,4],[-6,0],[-20,-1],[-20,-1],[-20,-2],[0,64]],[[6045,1420],[-1,67],[21,0],[20,-2],[9,-2],[9,-2],[3,-1]],[[6106,1480],[-1,-59]],[[6109,1506],[-1,-16]],[[6108,1490],[-1,-4],[-1,-6]],[[3833,2087],[-15,-12],[-3,-3],[-13,-10],[-3,-1],[-7,-4],[-15,-3],[-9,-4],[-6,-4],[-59,-48]],[[3703,1998],[-11,19],[-32,53],[-3,1],[-8,-6],[-6,-3],[-16,-4],[-5,11],[-12,19],[-11,17],[-21,35],[-15,-13]],[[3563,2127],[-11,18],[-11,20],[-30,-24],[-11,18],[-5,9],[-33,-26]],[[3462,2142],[-31,83],[-17,-14],[-8,-8],[-6,-13],[-15,-42],[-5,-9],[-6,-7],[-15,-13],[-32,-27],[-7,-5]],[[3320,2087],[-26,-23],[-45,-36]],[[3249,2028],[-31,-27],[-23,-21],[-2,-2],[-1,-3],[-12,-9],[-16,-14],[-17,-14],[-15,-12],[-25,-21],[-4,-2],[-12,-5],[-2,0],[-5,-2]],[[3084,1896],[-6,22],[-7,26],[-5,15],[-2,8],[-3,6],[-7,14],[-11,18],[-7,12],[-17,27],[0,1],[-3,5]],[[2940,2167],[-2,3],[-39,64]],[[2889,2260],[325,267]],[[3214,2527],[9,-22],[13,-27],[24,-39],[2,-3],[3,-5],[215,154],[36,31],[51,35],[37,22],[4,6]],[[3608,2679],[1,1],[11,-17],[4,-7],[8,-14]],[[3632,2642],[14,-25],[14,-23],[4,-6],[3,-5],[2,-5],[1,-1],[15,-25],[15,-25],[10,-17],[8,-12],[12,-22],[5,-10],[2,-4],[15,-26],[7,-12],[8,-14],[9,-14],[14,-24],[13,-20],[35,-61],[54,-93],[6,-9],[5,-8],[16,-24],[-36,-29],[-50,-41]],[[3214,2527],[-2,3],[-6,10]],[[3206,2540],[-13,18],[-12,19],[-3,5],[-9,16],[-17,29]],[[3152,2627],[-15,28]],[[3137,2655],[18,14],[4,3],[18,14],[5,3],[17,15],[4,3],[5,2],[1,1],[5,0],[16,0],[10,0],[12,0],[1,-24],[-1,-14],[31,-4],[0,-7],[1,0],[4,0],[14,-2],[5,0],[4,0],[4,1],[11,3],[11,4],[9,4],[4,3],[54,42]],[[3404,2716],[49,38],[48,37],[26,26],[3,3]],[[3530,2820],[75,-130],[2,-3]],[[3607,2687],[-3,-2],[1,-2],[3,-4]],[[3530,2820],[14,15],[-2,3],[9,10],[-14,23],[15,12]],[[3552,2883],[5,-3],[12,-21],[12,-19],[0,-6]],[[3581,2834],[10,2],[34,26],[43,-73],[-29,-23],[-3,-3],[-3,-8],[-1,-5],[9,-4],[2,-2],[10,-17],[2,-3],[-18,-14],[-8,-6],[-22,-17]],[[3054,2513],[4,4],[5,7],[2,4],[-12,17],[-6,6]],[[3047,2551],[55,47],[11,7],[39,22]],[[3206,2540],[-55,-46],[-5,-4],[-6,-2],[-6,-2],[-10,0],[0,-9],[-1,-5],[-3,-5],[-23,-19],[-3,0],[-11,18],[-29,47]],[[3047,2551],[-3,2],[-27,45]],[[3017,2598],[55,47],[-11,19],[19,16],[18,15],[2,7]],[[3100,2702],[12,-5],[3,-3],[11,-21],[11,-18]],[[3017,2598],[-12,19],[-14,-12],[-13,-11],[-3,1],[-20,20]],[[2955,2615],[-16,17]],[[2939,2632],[41,53],[7,11],[8,25]],[[2995,2721],[7,23]],[[3002,2744],[98,-42]],[[3047,2551],[-113,-95]],[[2934,2456],[-11,23],[-11,19],[-9,17]],[[2903,2515],[11,0],[6,-10],[15,13],[23,19],[-11,18],[16,13],[-7,10],[-15,16],[0,3],[14,18]],[[2913,2339],[14,12],[4,4],[3,6],[2,5],[0,12],[1,22],[1,24],[1,24],[-5,8]],[[3054,2513],[-16,-14],[-15,-13],[-16,-13],[38,-62],[1,-3],[-1,-3],[-13,-11],[-49,-40],[-10,2],[-2,-12],[-1,-2],[-13,-11],[-9,-8],[-14,-12],[-3,0],[-18,28]],[[2889,2260],[-10,16],[-13,21]],[[2866,2297],[10,8],[7,9],[15,13],[15,12]],[[2598,2003],[-63,103],[-3,4]],[[2532,2110],[11,11],[17,12],[12,7],[21,19],[46,39],[54,48],[23,20],[69,59],[5,4],[19,17],[15,12],[4,3]],[[2828,2361],[37,-61],[1,-3]],[[2730,2218],[-21,11],[-4,-10],[-2,-3],[-4,-3],[-22,-20],[0,-2],[12,-19],[0,-3],[-1,-2],[-14,-12],[-24,-21],[-27,1],[-21,1],[-1,-19],[0,-32],[5,5],[46,-2],[7,2],[9,4],[7,5],[38,33],[24,20],[5,6],[7,9],[5,13],[8,22]],[[2762,2202],[9,-3],[8,0],[9,1],[8,4],[8,6],[53,46],[-12,19],[-25,38],[-2,1],[-1,0],[-74,-63],[-1,-3],[-4,-9],[-2,-4],[-6,-17]],[[2751,2876],[-47,-38]],[[2704,2838],[-12,16],[-34,-28],[-15,-12],[-22,36],[-13,21],[-5,8],[-2,4]],[[2601,2883],[70,57]],[[2671,2940],[29,24]],[[2931,1675],[-1,-5],[0,-5],[2,-4],[3,-2],[16,-9],[3,-3],[9,-16]],[[2963,1631],[-3,-4],[-4,-5],[-3,-7],[-3,-8],[-7,1],[-6,-2],[-5,-2],[-4,-3],[-39,-32],[-4,-4]],[[2885,1565],[-4,6],[-8,15]],[[2873,1586],[44,37],[-94,31]],[[2823,1654],[49,41],[5,3],[4,1],[4,-1],[4,-3],[13,-11],[4,-2],[16,-5],[9,-2]],[[2988,1522],[-13,22],[-14,-13],[-3,0],[-26,43],[-17,-14],[26,-43],[0,-2],[-1,-2],[-14,-10],[-2,0],[-1,1],[-25,41],[-13,20]],[[2963,1631],[15,12],[51,42]],[[3029,1685],[14,12]],[[3043,1697],[11,-20],[16,-23],[10,-15],[16,-23],[-1,-2]],[[3095,1614],[-17,-15],[-18,-15],[-18,-15],[-18,-15],[-36,-32]],[[2845,1617],[-22,37]],[[2873,1586],[-9,6],[-8,5],[-5,8],[-6,12]],[[2716,1813],[2,-2]],[[2718,1811],[-13,-4],[-22,-7],[-25,-9],[-2,-1],[-13,-4],[-14,-5],[-58,-21],[-45,-16],[-29,-10]],[[2497,1734],[-1,7],[-2,6],[-3,9],[-3,9],[-3,8],[-9,15],[-4,7],[-4,6],[-2,5],[-7,20]],[[2459,1826],[42,21],[32,16],[-1,5],[-11,17],[-5,9],[-2,3],[-25,41],[-3,9],[-1,8],[-1,9],[0,5],[0,5],[2,11],[3,17],[4,16],[3,12],[0,4],[8,24]],[[2504,2058],[1,-4],[2,-2],[6,-10],[5,-9],[0,-7],[7,5],[10,8],[17,14],[0,1],[0,1],[0,1],[-11,18],[-17,27],[4,4],[4,5]],[[2459,1826],[-2,4],[-7,20],[0,1],[0,2],[0,2],[1,3],[2,10],[-1,5],[-1,4],[-3,5],[-11,22],[-10,22],[-5,6],[0,3],[-3,6],[-1,1],[-1,1],[-1,-1],[-3,-2],[-5,-5],[-3,2],[-2,1],[-2,1],[-2,2],[-2,3],[-1,1],[-6,9]],[[2390,1954],[17,12],[-2,4],[-2,4],[-3,2],[-5,4],[-4,3],[-1,0],[0,1],[0,1],[0,1],[1,1],[13,12],[1,0],[1,0],[5,-3],[1,0],[2,0],[31,27],[0,1],[2,0],[1,0],[10,-4],[8,29],[3,3],[3,4],[14,12],[18,-10]],[[2497,1734],[-12,-4],[-19,-7],[-33,-11],[-11,-4],[-11,-5],[-8,-3],[-6,-3],[-5,-3],[-4,-2],[-9,-5],[-5,-3],[-5,-3],[-6,-4],[-6,-4],[-5,-4]],[[2352,1669],[-3,6],[-3,4],[-7,11],[-10,18],[-23,41],[-25,39]],[[2281,1788],[-13,24],[-19,33],[-2,3]],[[2247,1848],[13,9],[4,3],[1,1],[4,2],[2,1],[2,1],[4,0],[5,0],[2,1],[1,0],[1,1],[2,1],[-7,13],[19,16],[16,14],[1,0],[1,0],[1,0],[10,-5],[1,0],[1,0],[1,0],[10,9],[48,39]],[[2247,1848],[-19,37],[-1,2],[-4,8],[-8,15],[-7,12]],[[2358,2080],[3,-5],[9,-14]],[[2370,2061],[-13,-13],[-20,-19],[0,-1],[0,-1],[0,-1],[11,-16],[20,-33],[2,-4],[2,-2],[4,-6],[3,-3],[2,-2],[5,-2],[2,-2],[2,-2]],[[2281,1788],[-3,-2],[-17,-14]],[[2261,1772],[-11,18],[-5,9],[-5,9],[-1,0],[-11,-9],[-17,-14],[-17,-13],[-12,20],[-17,-14],[-40,-31],[-17,-14]],[[2108,1733],[-7,12],[-2,4],[-1,2],[-2,6],[-3,13],[-1,7],[-2,9],[-2,2],[-9,17],[-5,9]],[[2074,1814],[131,103],[3,5]],[[2188,1714],[-30,-24],[-17,-13]],[[2141,1677],[-21,36]],[[2120,1713],[-12,20]],[[2261,1772],[-12,-10],[-61,-48]],[[2143,1500],[-3,5],[-1,2],[-3,4],[-24,42],[-5,9]],[[2107,1562],[71,56],[3,2],[1,1],[1,2],[0,1],[1,2],[4,11],[2,6],[5,16],[0,1],[1,2],[1,1],[14,11],[-11,20],[-12,20]],[[2352,1669],[-2,-1],[-1,-1],[-7,-5],[-19,-16],[-44,-36],[-11,-9]],[[2268,1601],[-38,-31],[-35,-28],[-26,-21],[-8,-7],[-18,-14]],[[2107,1562],[-12,19],[-12,20],[-11,21]],[[2072,1622],[52,41],[17,14]],[[7765,4113],[9,-6],[28,-21],[3,-3]],[[7805,4083],[-7,-13],[-5,-9],[-8,-15]],[[7864,4039],[-37,27]],[[7827,4066],[6,11],[5,7],[3,8],[4,7],[5,9]],[[7850,4108],[5,10],[8,13],[0,2]],[[7863,4133],[8,-6],[20,-15],[9,-6]],[[7900,4106],[-5,-9],[-2,-3],[-1,-2],[-6,-11],[-4,-8]],[[7882,4073],[-8,-16],[-4,-7],[-6,-11]],[[7910,4004],[-39,29],[-7,6]],[[7882,4073],[16,-12],[2,-2],[29,-22]],[[7929,4037],[-4,-8],[-4,-7],[-5,-7],[-6,-11]],[[7900,4106],[9,15]],[[7909,4121],[8,-6],[30,-23],[9,-6]],[[7956,4086],[0,-3],[-5,-8],[-8,-15]],[[7943,4060],[-7,-12],[-6,-10],[-1,-1]],[[7958,3968],[-48,36]],[[7943,4060],[47,-36]],[[7990,4024],[-7,-12],[-6,-12],[-4,-7],[-5,-7],[-4,-8],[-6,-10]],[[7956,4086],[5,10],[5,9]],[[7966,4105],[10,-7],[30,-22],[9,-7]],[[8015,4069],[-6,-10],[-5,-10],[-6,-9],[-8,-16]],[[7966,4105],[7,11],[12,22]],[[8035,4095],[-7,-3],[-7,-12],[-6,-11]],[[8061,4034],[-17,12],[-20,16],[-9,7]],[[8075,4061],[-2,-4],[-6,-12],[-6,-11]],[[8036,3990],[-7,5],[-30,23],[-9,6]],[[8061,4034],[-6,-10],[-5,-10]],[[8050,4014],[-6,-9],[-8,-15]],[[8486,4089],[18,31],[8,14],[13,24],[1,2],[4,7]],[[8530,4167],[19,-14],[10,-8],[21,37]],[[8580,4182],[14,26],[10,-8],[6,-5],[7,-5],[6,14],[3,-2],[3,-1],[6,-3],[-9,-46],[-3,-10],[-3,-13],[-3,-17],[0,-2],[-1,-9],[-3,-52],[-2,-19],[-14,-25]],[[8530,4167],[21,37],[10,18],[10,19]],[[8571,4241],[8,-5],[5,-4],[-6,-13],[-4,-7],[-9,-18],[15,-12]],[[8530,4167],[-14,11],[-14,11],[6,10],[9,17],[5,9]],[[8522,4225],[10,18],[10,18],[7,-5],[1,-1],[13,-9],[8,-5]],[[8522,4225],[-6,5],[-9,6],[-17,13]],[[8592,4282],[-11,-22],[-10,-19]],[[8419,4253],[-10,8],[-9,8],[-20,14],[-31,24]],[[8349,4307],[12,22]],[[8361,4329],[6,10],[0,1],[5,9],[8,14],[5,9]],[[8385,4372],[2,-1],[5,-4],[2,-1]],[[8394,4366],[57,-40],[8,-6]],[[8374,4175],[-20,15],[-18,16],[-17,13]],[[8319,4219],[-14,10]],[[8305,4229],[6,11],[6,10],[13,25],[-27,21]],[[8303,4296],[8,14],[5,9],[5,9]],[[8321,4328],[10,-7],[18,-14]],[[8354,4139],[-38,30],[-18,14]],[[8298,4183],[4,8],[6,9],[4,8],[7,11]],[[8374,4175],[-10,-18],[-10,-18]],[[8298,4183],[-35,27],[-11,8]],[[8252,4218],[4,21]],[[8256,4239],[5,25]],[[8261,4264],[10,-7],[1,-1],[33,-27]],[[8333,4102],[-50,39],[-29,22],[-11,8]],[[8243,4171],[6,29]],[[8249,4200],[3,18]],[[8354,4139],[-8,-14],[-7,-13],[-6,-10]],[[8313,4051],[-9,-24]],[[8304,4027],[-67,50],[-10,8]],[[8333,4102],[-10,-28],[-10,-23]],[[8359,4015],[-46,36]],[[8333,4102],[11,-8],[15,-11],[12,-10],[2,-3],[12,-9]],[[8385,4061],[-14,-24],[-12,-22]],[[8418,4037],[-17,13],[-6,3],[-8,6],[-2,2]],[[8408,4151],[18,-14],[30,-23],[3,-4]],[[8379,3968],[-32,26],[12,21]],[[8187,4247],[7,-6],[43,-32],[12,-9]],[[8187,4247],[9,16]],[[8196,4263],[7,-6],[36,-28],[6,-6],[7,-5]],[[8196,4263],[9,15]],[[8205,4278],[7,-6],[16,-12],[17,-14],[9,-6],[2,-1]],[[8163,4311],[33,-26],[9,-7]],[[2691,889],[2,4],[0,5],[-3,4],[-6,5],[-13,49],[16,6],[7,0],[7,-2],[20,7]],[[2721,967],[23,7]],[[2744,974],[16,5],[6,1],[5,0],[6,0],[5,-1],[11,-3],[22,-7],[26,-6],[21,-91]],[[2540,919],[-7,23],[-3,10],[-1,6],[-2,8],[-3,11],[-2,8],[-1,13],[-2,8],[-2,8],[-3,11]],[[2514,1025],[11,5],[38,14],[17,7],[6,3],[2,1]],[[2588,1055],[7,3],[18,8],[8,4],[9,7],[4,2],[5,3],[24,10],[1,0],[1,0],[1,-1],[3,-12]],[[2669,1079],[21,-85],[1,-1],[0,-1],[1,-1],[2,0],[19,7],[8,-31]],[[2509,901],[4,-14],[1,-4],[-1,-1],[-1,-2],[-24,-22],[-14,-13],[-2,-1],[-2,-1],[-1,0],[-1,0],[-1,1],[-6,9],[-10,13],[-1,2],[12,8],[13,7],[-7,22],[-7,23],[-10,-4],[-9,-5],[-19,-13],[-5,-3],[-11,-4],[-5,-1],[-4,6],[-2,4],[-2,3],[-9,10],[-4,4],[-4,3],[-9,7]],[[2368,935],[23,33],[3,4],[4,2],[32,14],[34,15],[30,14],[20,8]],[[6592,4365],[-3,-7],[-4,-10],[-2,-5],[-6,-12],[-5,-14],[-8,-19],[-3,-9],[-1,-3],[-1,-2],[-1,-2],[-1,-4],[-3,-7],[-2,-5],[-3,-7],[-3,-7],[-1,-4],[-2,-4]],[[6543,4244],[-1,-2],[-2,-4],[-2,-4],[-6,-11],[-2,-4],[-5,-9],[-1,-1],[-1,-2],[-1,-2],[-1,-3],[-1,-2],[-1,-3],[-1,-2],[-1,-2],[-1,-2],[0,-2],[-1,-3],[-1,-2],[-2,-9],[-2,-8],[0,-1],[-2,-7],[-3,-11]],[[6505,4148],[-2,-2],[-3,-2],[-2,-1],[-2,-1],[-2,-1],[-2,0],[-2,-1],[-3,0],[-1,0],[-1,1],[-1,2],[-1,2],[-1,1],[-1,2],[-1,1],[-1,2],[-1,1],[-2,1],[-1,2],[-2,1],[-1,1],[-1,1],[-1,1],[-2,1],[-2,1],[-3,1],[-3,2],[-2,0],[-4,1]],[[6454,4165],[-4,1],[-4,-13],[-6,2],[-10,5],[-12,6],[-16,8],[-18,9],[-20,9],[-11,5],[-33,16],[-21,10],[-6,3],[-8,4],[-8,3],[-14,7],[-11,6],[-6,3],[-7,3],[-7,3],[-13,7]],[[6219,4262],[-42,20]],[[6177,4282],[2,7],[1,4]],[[6204,4365],[6,30],[1,14],[2,14],[0,5]],[[6609,4409],[-2,-6],[-4,-11],[-5,-12],[-4,-9],[-2,-6]],[[6168,4189],[11,19],[8,14],[2,7],[0,2],[-1,1],[-13,6],[-13,6]],[[6162,4244],[13,34],[2,4]],[[6219,4262],[-26,-76],[-3,-7]],[[6146,4200],[3,8],[13,36]],[[3292,3603],[-60,72],[-12,11],[-19,18],[-12,20]],[[3189,3724],[0,4],[1,12],[2,4],[8,8],[9,7],[11,3],[8,1],[5,-1],[4,-2],[3,-1],[10,0],[8,4],[6,2],[1,-1],[4,0],[6,2],[4,2]],[[3224,3604],[-65,68]],[[3159,3672],[4,4],[7,17],[3,9],[5,10],[7,5],[4,4],[0,3]],[[3221,3312],[0,5],[11,9],[-3,4],[-10,-9],[-3,5],[-4,1]],[[3212,3327],[-2,4]],[[3210,3331],[9,6],[-8,14],[6,9],[58,44],[-110,173]],[[3165,3577],[-32,48]],[[3133,3625],[-1,2],[-11,13],[-23,35]],[[3098,3675],[2,-2],[9,-5],[9,-5],[21,0],[12,3],[7,5],[1,1]],[[3210,3331],[-8,14],[-34,58]],[[3168,3403],[4,3],[9,7],[4,2],[5,1],[14,3],[4,2],[6,3],[11,8],[14,13],[-30,45],[-14,21],[-3,2],[-2,1],[-14,1],[-22,1]],[[3154,3516],[-1,15],[-4,17],[-8,13]],[[3141,3561],[9,5],[15,11]],[[3168,3403],[-22,37]],[[3146,3440],[-4,8],[-13,22]],[[3129,3470],[15,12],[4,5],[3,5],[2,5],[1,6],[0,13]],[[2978,3381],[-26,55],[-8,20]],[[2944,3456],[40,13],[17,6],[13,5],[6,3],[7,4],[16,9],[14,8],[21,15],[13,8],[3,3]],[[3094,3530],[32,21]],[[3126,3551],[15,10]],[[3129,3470],[-3,-2],[-13,-8],[-21,-17],[-7,-6],[-8,-5],[-5,-3],[-1,-1],[-6,-4],[-7,-4],[-20,-10],[-25,-12],[-22,49],[-3,2],[-5,-1],[-6,-4],[-3,-4],[0,-5],[22,-45],[-18,-9]],[[3049,3625],[7,5],[50,-17],[-1,-16],[1,-4],[10,-23],[10,-19]],[[3094,3530],[-19,40],[-26,55]],[[3049,3625],[-8,15]],[[3041,3640],[-8,18]],[[3033,3658],[6,-2],[54,-16],[40,-15]],[[3033,3658],[-4,1],[-9,3],[-12,3],[-60,12],[-156,27]],[[2792,3704],[-113,19],[-42,8]],[[2637,3731],[22,72]],[[2659,3803],[17,3],[8,4],[8,1],[8,0],[8,-2],[25,-2],[4,-2],[27,-1],[18,-5],[3,-2],[6,0],[12,-2],[6,-3],[17,-2],[8,-1],[19,0],[12,0],[10,-2],[2,-3],[2,0],[4,0],[2,3],[5,3],[4,4],[1,5],[3,2],[16,6],[9,1],[1,-1],[6,0],[11,-3],[17,-7],[15,-11],[4,-3],[11,-15],[6,-2],[5,0],[5,-4],[23,-3],[4,-13],[4,-5],[4,-3],[4,-6],[6,-7],[8,-5],[4,-5],[8,-5],[10,-2],[12,-5],[3,-2],[0,-3],[-4,-5],[-1,-4],[3,-6],[5,-7],[1,-1]],[[2591,3556],[0,-13],[2,-12],[2,-9]],[[2595,3522],[-12,-5],[-5,-3],[-3,9],[-2,9],[-1,5],[1,20],[0,20],[1,16],[-1,7],[-3,7],[-8,18],[-13,-8],[-11,-5],[-19,-7],[-5,-3],[-24,-25],[-1,-4],[25,-55],[-10,-6]],[[2504,3512],[-8,-2],[-11,-3],[-7,-4],[-13,-9],[-22,-13]],[[2443,3481],[-13,25],[-1,2]],[[2429,3508],[4,2],[4,4],[3,10],[7,12],[5,10],[5,8],[6,9],[6,7],[7,8],[3,6],[3,4],[4,0],[4,6],[10,17],[2,3],[1,1],[22,12],[10,8],[5,6],[5,4],[4,4],[0,3],[2,6],[-2,22],[1,6],[1,5],[1,4],[1,6],[12,23],[4,11],[14,32],[11,15],[8,8],[14,2],[11,3],[13,4],[19,4]],[[2637,3731],[-2,-28],[-2,-17]],[[2633,3686],[-4,0],[-4,1],[-4,-1],[-3,-2],[-2,-3],[-2,-3],[-7,-34],[-7,-29],[-5,-29],[-4,-30]],[[2595,3522],[5,-14],[8,-17]],[[2608,3491],[-18,-9],[-18,-4]],[[2572,3478],[-4,-1],[-3,-1],[-4,-3],[-6,-6],[-21,-15],[-3,-4],[-4,-6]],[[2527,3442],[-15,12],[10,17],[-9,20],[-9,21]],[[2577,3262],[-4,-7],[-3,-8]],[[2570,3247],[-4,2],[-3,3],[-4,8],[-2,3],[-2,1],[-2,0],[-2,-1],[-3,-2]],[[2548,3261],[-14,29],[-18,38],[-10,23],[-3,-2],[-4,-2],[-3,0],[-4,2],[-35,25],[-5,11],[-33,69]],[[2419,3454],[2,6],[2,5],[5,5],[15,11]],[[2527,3442],[9,-8],[-12,-21],[10,-22],[-17,-11],[19,-40],[25,-54],[6,-11],[10,-13]],[[2582,3267],[-5,-5]],[[2572,3478],[8,-19],[-16,-11],[25,-54],[1,-4],[1,-3],[-1,-4],[-2,-5],[-5,-8],[-5,-4],[-6,-5],[-3,-2],[12,-27],[20,-46]],[[2601,3286],[-19,-19]],[[2757,3266],[-8,-5],[-1,-3],[-13,-10],[-6,-5],[-10,-8],[-5,-4],[-26,-25],[-10,13],[-21,-20],[-13,-14],[-16,-17]],[[2628,3168],[-31,68],[-9,20],[-6,11]],[[2601,3286],[11,10],[10,5],[6,3],[20,8],[18,8]],[[2666,3320],[27,11]],[[2693,3331],[21,-49],[9,-20],[28,16],[6,-12]],[[2634,3148],[-38,-46]],[[2596,3102],[-12,27],[-21,43],[-12,7]],[[2551,3179],[3,11],[8,28],[6,24],[2,5]],[[2628,3168],[11,-15],[-5,-5]],[[2678,3129],[-20,-9],[-2,0],[-5,5],[-6,10],[-11,13]],[[2757,3266],[2,-3],[7,-17]],[[2766,3246],[5,-7],[21,-16],[8,-8]],[[2800,3215],[-2,0],[-14,-18],[-19,-21],[-7,-7],[-7,-6],[-16,-10],[-23,-10],[-25,-10],[-9,-4]],[[2678,3129],[7,-21],[5,2],[10,4],[2,-2],[8,-26],[-1,-2],[-40,-17],[7,-23],[28,-45],[3,0],[29,24],[12,-19]],[[2671,2940],[-10,22],[-9,20],[-10,21],[-6,12],[-10,22],[-4,9],[-5,12],[-9,20],[-12,24]],[[2800,3215],[9,-13]],[[8632,4758],[-10,-26]],[[8622,4732],[-11,6],[-47,23],[-11,6]],[[8553,4767],[10,26]],[[8563,4793],[11,-5],[47,-24],[11,-6]],[[8563,4793],[5,13],[4,13]],[[8572,4819],[11,-5],[48,-24],[11,-5]],[[8642,4785],[-10,-27]],[[8572,4819],[9,23]],[[8581,4842],[11,-6],[39,-19],[9,-5],[10,-5]],[[8650,4807],[-8,-22]],[[2920,2824],[-68,-57]],[[2852,2767],[-16,-14],[-7,-3],[-6,-3],[-16,-5],[-8,-3],[-7,-6],[-17,-14]],[[2731,2651],[-19,10],[-11,6],[-12,9],[-13,12],[-13,15],[-10,13],[-7,12],[-8,13],[-11,18],[6,6],[3,4],[6,13],[3,5],[4,6],[5,4],[29,24],[21,17]],[[2847,2897],[-8,-22],[-8,-22],[-4,-9],[-1,-17],[0,-3],[6,-3],[6,-1],[7,-4],[6,-5],[6,-10],[17,15],[17,14],[16,13],[13,-19]],[[2689,2588],[-18,29],[-45,75],[-3,5],[-11,17],[-14,23],[-44,76],[-9,19],[-1,4]],[[2544,2836],[57,47]],[[2582,2544],[16,13],[-1,3],[0,3],[5,4],[6,5],[-10,20],[-8,19],[-14,19],[-6,25],[-6,23],[-10,22]],[[2554,2700],[-17,42],[-14,36],[0,4],[1,2],[-10,19],[27,30],[3,3]],[[2689,2588],[-3,-2],[-20,-17],[-14,-5],[-16,-7],[-12,-10],[-20,-17],[-10,-5],[-12,19]],[[2506,2663],[-5,10],[-12,30],[-18,-10],[-6,-4],[-9,-5],[-4,-1],[-8,-2],[0,6],[-1,3],[-2,9],[-5,14],[-11,-8],[-3,-1],[-2,0],[-2,2],[-7,11],[-5,6],[-3,1],[-2,-1],[-8,-12]],[[2393,2711],[-16,16],[-32,-45]],[[2345,2682],[-12,31],[10,11],[7,10],[5,7],[5,7],[7,11],[5,9],[2,4]],[[2374,2772],[2,3],[2,6],[4,10],[3,6],[5,16],[9,28],[6,20],[6,17],[11,19],[12,19],[30,33],[11,12],[12,14],[2,2]],[[2489,2977],[14,-34],[24,-63],[17,-44]],[[2554,2700],[-17,-13],[-25,-19],[-6,-5]],[[2506,2663],[22,-55],[4,-12],[3,-8],[1,-11],[-1,-9],[-4,-10],[-8,2],[-3,-1],[-17,-8],[-6,-3],[-6,0],[-7,2]],[[2484,2550],[-5,3],[-4,0],[-4,-1],[-3,-1],[-9,23],[-11,29]],[[2448,2603],[-2,6],[-1,16],[0,22],[-14,0],[-2,2],[-6,13],[-6,10],[-6,8],[-9,9],[-14,15],[5,7]],[[2448,2603],[-73,-26]],[[2375,2577],[-5,12],[-14,-8],[-6,-5]],[[2350,2576],[-14,-13],[-8,22],[-12,29]],[[2316,2614],[1,3],[10,6],[4,4],[9,12],[13,17],[7,11],[-15,15]],[[2484,2550],[-1,-9],[-2,-5],[-7,-3],[16,-41],[5,-3],[6,0],[8,5],[7,7],[17,10],[3,-7]],[[2536,2504],[-147,-124]],[[2389,2380],[-6,11]],[[2383,2391],[38,27],[19,18],[33,29],[2,4],[0,5],[-6,15],[-17,-8],[-7,19],[-17,-8],[-27,71],[-19,-6],[-7,20]],[[2582,2544],[-46,-40]],[[2383,2391],[-38,92],[-9,23]],[[2336,2506],[4,1],[6,2],[9,5],[14,15],[0,2],[0,2],[-4,10],[-3,9],[-4,9],[-5,11],[-3,4]],[[2389,2380],[-9,-10],[54,-98]],[[2434,2272],[-6,-12]],[[2428,2260],[-6,11],[-36,62]],[[2386,2333],[-6,8],[-3,4],[-14,7],[-17,8],[-7,4],[-24,10]],[[2315,2374],[9,24],[7,22],[13,-6],[3,0],[3,1],[-12,30],[-3,8],[-1,3],[3,8],[-1,3],[-20,9],[-1,1],[-2,3],[-6,18],[-9,23],[8,4],[6,5],[4,4],[8,4]],[[2324,2538],[12,-32]],[[2315,2374],[-16,8]],[[2299,2382],[-23,11]],[[2276,2393],[8,24],[-6,3],[-6,5],[-3,4],[-3,4],[-2,5],[-20,55],[-8,21]],[[2236,2514],[19,10],[42,21],[2,2],[3,3],[5,5],[5,3],[4,2],[8,-22]],[[2236,2514],[-12,34],[-2,6],[16,17],[-9,21]],[[2229,2592],[14,15],[38,44],[2,2],[4,-14],[0,-2],[4,-10],[8,-22],[17,9]],[[2229,2592],[-2,3],[-15,39]],[[2212,2634],[10,14],[4,5],[13,17],[15,18],[7,7],[2,3]],[[2263,2698],[4,6],[39,54],[5,3],[3,1],[13,28],[19,27]],[[2346,2817],[14,-10],[-9,-18],[23,-17]],[[2095,2473],[-3,7],[-2,6],[-11,23],[-5,8],[-12,18]],[[2062,2535],[3,10],[3,7],[2,6],[2,5],[5,4],[5,4],[11,7],[5,2],[17,10],[1,1],[1,2],[1,1],[2,2],[4,11],[1,3],[4,11],[2,9],[3,16],[3,3],[29,27],[11,15],[1,2],[16,25],[6,6],[14,12],[13,11],[2,2]],[[2229,2749],[23,-33],[11,-17],[0,-1]],[[2212,2634],[-93,-136],[-24,-25]],[[8316,4362],[-21,16],[-11,8]],[[8284,4386],[6,26],[5,23]],[[8295,4435],[8,-6],[5,-3],[23,-16],[8,-6]],[[8339,4404],[-6,-10],[-6,-11],[-5,-10],[-6,-11]],[[8361,4329],[-18,13],[-27,20]],[[8339,4404],[35,-24],[11,-8]],[[8321,4328],[-17,13],[-14,11],[-11,8]],[[8279,4360],[5,26]],[[8303,4296],[-31,24]],[[8272,4320],[4,20]],[[8276,4340],[3,20]],[[8261,4264],[5,26],[4,19],[2,11]],[[8261,4264],[-11,9],[-34,25]],[[8216,4298],[7,12],[5,9],[6,-5],[14,25]],[[8248,4339],[9,-7],[7,-6],[8,-6]],[[8163,4311],[11,20]],[[8174,4331],[9,-7],[33,-26]],[[8093,3982],[-43,32]],[[8103,4039],[-2,-2],[-6,-13],[-6,-11],[15,-11],[-6,-10],[-5,-10]],[[8093,3982],[22,-17],[4,-3]],[[8119,3962],[-10,-6],[-6,-12],[-1,-4]],[[8145,4008],[-2,-3],[-7,-12],[-6,-11],[-5,-10],[-6,-10]],[[8176,3947],[-9,8],[-6,-11],[-6,-9],[-36,27]],[[8191,3973],[-3,-4],[-12,-22]],[[8176,3947],[-11,-19],[11,-9],[8,-6],[2,-1],[8,-6],[5,-4]],[[8210,3953],[0,-10],[-3,-10],[-7,-26]],[[8210,3953],[31,-23],[22,-17]],[[8263,3913],[-6,-17],[-4,-9],[-5,-16]],[[8211,3993],[63,-48]],[[8274,3945],[-5,-15],[-3,-8],[-3,-9]],[[8217,4034],[11,-8],[28,-22],[16,-12],[15,-12]],[[8287,3980],[-8,-21],[-5,-14]],[[8304,4027],[-8,-22],[-9,-25]],[[8340,3939],[-17,13],[-9,7],[-9,7],[-8,7],[-10,7]],[[8322,3908],[-48,37]],[[8306,3879],[-43,34]],[[8286,3843],[-38,28]],[[2488,1435],[-4,0],[-63,-53]],[[2421,1382],[-3,12],[2,2],[5,6],[1,3],[2,3],[1,3],[0,2],[0,4],[1,5],[0,7],[-1,3],[-1,7],[-1,7],[-2,5],[-1,4],[-1,4],[-3,5],[-6,10],[-6,11],[-5,6],[-5,6],[-5,4],[-3,2],[-5,1],[-7,0],[-6,-1],[-6,-3],[-6,-3],[-6,-5],[-6,-5],[-6,-8]],[[2342,1479],[-9,9],[-28,47],[-4,5],[-4,9],[-4,10],[-5,9],[-8,13],[-9,15],[-3,5]],[[2352,1669],[3,-4],[12,-20],[3,-5],[19,-33],[22,-36]],[[2411,1571],[33,-54],[2,-2],[20,-35],[8,-14],[7,-15],[7,-16]],[[2323,1305],[-2,8],[-1,5],[-3,20]],[[2317,1338],[17,3],[4,2],[-3,23],[-6,30],[-2,21],[-1,6]],[[2326,1423],[1,4],[0,5],[1,9],[2,11],[3,10],[4,8],[5,9]],[[2421,1382],[-92,-76],[-6,-1]],[[2202,1373],[-30,53],[-3,13],[-1,7],[-5,9],[-10,17],[-11,18],[-3,6]],[[2139,1496],[4,4]],[[2326,1423],[-19,-4],[-38,-7],[-18,-4],[-3,-1],[-17,-13],[-29,-21]],[[2194,1305],[-2,4],[-4,8],[-3,7],[-1,12],[1,11],[3,8],[5,9],[9,9]],[[2317,1338],[-7,-2],[-5,-2],[-7,-5],[-14,-17],[-9,16],[-8,15],[-1,0],[-1,0],[-1,0],[-1,0],[-35,-27],[-2,-2],[-3,-17],[-5,-23],[-6,5],[-1,1],[-3,3],[-9,15],[-5,7]],[[2323,1305],[-90,-81],[-47,74]],[[2186,1298],[8,7]],[[7804,4647],[-29,23],[-9,7],[3,3],[-9,7],[-1,1],[-10,8]],[[7749,4696],[6,11],[6,11],[6,11],[6,12]],[[7773,4741],[3,6],[3,5],[6,12]],[[7785,4764],[6,11],[6,11]],[[7797,4786],[10,-7],[8,-6],[3,-2],[8,-6],[8,-6],[24,-17]],[[7858,4742],[-10,-18],[-11,-18],[-28,-49],[-5,-10]],[[7735,4771],[38,-30]],[[7667,4823],[6,11],[6,11]],[[7679,4845],[68,-52],[38,-29]],[[7679,4845],[6,12],[6,11]],[[7691,4868],[67,-53],[39,-29]],[[7691,4868],[6,11],[6,12]],[[7703,4891],[10,-8],[57,-45]],[[7770,4838],[39,-29]],[[7809,4809],[-6,-12],[-6,-11]],[[7770,4838],[6,11],[6,12],[6,11],[6,11]],[[7794,4883],[29,-22],[1,-1],[9,-7]],[[7833,4853],[-3,-5],[-9,-17]],[[7821,4831],[-3,-5],[-3,-6],[-6,-11]],[[7703,4891],[5,11],[7,12]],[[7715,4914],[5,11],[6,11]],[[7726,4936],[39,-30],[29,-23]],[[7726,4936],[6,11],[6,11],[6,12],[4,7]],[[7748,4977],[28,-15],[47,-23]],[[7823,4939],[-5,-11],[-6,-11],[-6,-11],[-6,-11],[-6,-12]],[[7839,4866],[-6,-13]],[[7856,4899],[-8,-16],[-4,-7],[-5,-10]],[[6142,4224],[1,-1],[2,0],[1,1],[1,1],[9,30],[1,6],[-1,5],[-2,8],[-4,7],[-6,7],[-7,5],[-15,6],[-10,4],[-9,4],[-11,2]],[[6092,4309],[-23,4],[-4,0],[-10,1],[-8,0],[-11,0],[-21,-4],[-18,-4],[-18,-6],[-14,-6],[4,-14],[6,-16]],[[5975,4264],[-18,7],[-15,-12],[-9,-10],[-13,-29],[-6,-19],[13,-12]],[[5788,4199],[24,46],[2,3],[3,7]],[[6092,4309],[-5,-32]],[[7976,3282],[-12,10],[-32,25],[-9,4],[-11,9]],[[7883,3395],[16,26],[11,52],[1,8],[2,7],[5,22],[2,7]],[[7962,3259],[-6,5],[-7,5]],[[7949,3269],[-17,14],[-4,3],[-5,4],[-4,3],[-20,16]],[[7949,3269],[-7,-13],[-4,-7],[-19,7],[-37,29]],[[7815,3256],[-6,-5],[-32,-22],[-12,-12],[-11,-14],[-4,-5],[0,-1],[-14,-20],[-24,-52],[-20,-36],[-2,-4],[-1,-4]],[[7689,3081],[-27,1],[-12,2],[-10,3],[-18,4],[-22,0],[-21,2],[-10,1],[-3,1],[-10,1],[-9,1],[-33,1],[-17,0],[-7,-2],[-6,-2],[-20,-7]],[[7392,3091],[6,1],[21,5],[6,2],[3,2],[4,3],[50,79],[9,13],[21,31],[37,54],[23,23],[23,15],[9,5],[7,19],[2,3],[8,20]],[[7717,3768],[3,4],[6,11]],[[7726,3783],[10,17]],[[7736,3800],[4,0],[14,-10],[26,-20],[1,-2],[32,-25],[14,-10],[24,-18],[23,-17]],[[7874,3698],[7,-6],[54,-41],[1,-6],[0,-7],[1,0],[0,-3],[1,-3],[1,-6],[4,-7],[4,-7]],[[7789,3124],[-7,-8],[-9,-10],[-8,-8],[-10,-7],[-3,-2],[-1,-4],[0,-2],[1,-6],[1,-7],[2,-7],[-3,-8],[-9,-10],[-9,-12],[-6,-16],[0,-10],[1,-8],[6,-16],[12,-13],[3,-1],[3,-2],[4,-5],[6,-4],[3,-1]],[[7609,2999],[11,21],[-11,14],[3,7],[4,5],[3,2],[4,2],[34,8],[8,3],[7,4],[2,1],[5,2],[4,4],[3,4],[3,5]],[[7834,3031],[-27,-27]],[[7807,3004],[-23,-22]],[[7844,2969],[-20,18],[-17,17]],[[7866,3000],[-8,-10],[-7,-11],[-7,-10]],[[7891,2976],[-22,-32]],[[7869,2944],[-9,9],[-7,7],[-9,9]],[[7869,2944],[-1,-2],[-18,-25]],[[7962,4215],[-8,6],[-61,47]],[[7893,4268],[5,9],[5,8],[8,16]],[[7911,4301],[9,-7],[46,-35],[6,-4]],[[7972,4255],[8,-7]],[[7951,4197],[-7,6],[-61,46]],[[7883,4249],[5,10],[5,9]],[[7938,4173],[-9,7],[-51,38],[-9,7]],[[7869,4225],[8,15],[6,9]],[[7938,4173],[-12,-21]],[[7926,4152],[-9,7],[-51,38],[-9,7]],[[7857,4204],[12,21]],[[7909,4121],[-9,7],[-20,15],[-8,5]],[[7872,4148],[6,10],[5,10],[-23,17],[-10,7],[7,12]],[[7926,4152],[-7,-12],[-10,-19]],[[7911,4301],[12,-2],[8,14],[13,23]],[[7944,4336],[51,-40],[-12,-22],[-6,-10],[-5,-9]],[[7944,4336],[6,11],[6,11]],[[7956,4358],[51,-40],[9,-7]],[[8016,4311],[-12,-22]],[[8004,4289],[-13,-22],[-11,-19]],[[7911,4301],[-28,22]],[[7883,4323],[11,19],[12,22]],[[7906,4364],[13,22]],[[7919,4386],[8,-6],[11,-8],[9,-7],[9,-7]],[[7883,4323],[-2,2],[-10,8],[-2,1],[-14,11],[-10,7]],[[7845,4352],[11,19]],[[7856,4371],[13,22]],[[7869,4393],[9,-7],[18,-13],[8,-7],[2,-2]],[[8041,4261],[-26,20],[-2,1],[-9,7]],[[8016,4311],[14,25]],[[8668,4346],[15,-7],[14,-6]],[[8697,4333],[0,-1],[6,-2],[-22,-87],[0,-2],[6,-3],[-14,-42],[5,-2],[-14,-43],[6,-3],[-6,-19],[-8,-23],[6,-3],[-14,-41],[-9,-55],[-5,-24]],[[8790,4543],[-73,-117],[-20,-93]],[[8600,4440],[6,8],[3,7],[0,2],[1,2],[1,2],[1,2],[1,2],[0,1],[1,2],[1,1],[0,2],[1,1],[6,15],[12,31],[9,24]],[[8643,4542],[9,-5],[22,-11],[9,25],[8,21],[4,10],[1,2],[4,11]],[[8700,4595],[6,-3],[9,-4]],[[8715,4588],[9,-5],[10,-5],[4,-2],[13,-6],[20,-13],[4,-2],[11,-9],[4,-3]],[[8846,4618],[-16,-6],[0,-3],[-40,-66]],[[8715,4588],[8,21],[7,20]],[[8730,4629],[8,22],[7,19]],[[8745,4670],[11,-5],[19,-10],[16,-5],[17,-9],[1,-1],[1,0],[1,-1],[2,-1],[3,-2],[4,-3],[21,-13],[5,-2]],[[8944,4779],[-48,-16],[-20,-40],[0,-3],[65,21],[-7,-29],[-60,-20],[5,-12],[4,0],[1,-7],[-36,-12],[3,-15],[43,14],[0,-1],[0,-24],[-48,-17]],[[8745,4670],[10,27],[10,26]],[[8765,4723],[10,-5],[19,-10],[5,11],[4,12],[-19,10],[-11,5]],[[8773,4746],[10,25],[9,24]],[[8792,4795],[5,13],[5,16],[9,25],[1,4]],[[8812,4853],[9,-5],[28,-15],[3,-4],[2,-2],[7,-4],[28,-15],[3,1],[2,-1],[7,-4],[43,-25]],[[8978,4870],[-35,-70],[23,7],[6,-19],[-28,-9]],[[8812,4853],[5,13],[4,13],[-25,13],[-9,4],[9,24]],[[8796,4920],[11,-6],[13,-6],[9,-5],[24,-13],[7,-4],[5,12],[4,11]],[[8869,4909],[11,-6],[2,-1],[39,-21],[13,-7],[40,-4],[4,0]],[[9015,4945],[-37,-75]],[[8869,4909],[-31,17],[-22,11]],[[8816,4937],[5,12],[22,-11],[7,16],[11,28],[9,23]],[[8870,5005],[10,-5],[17,-9],[14,-7],[45,-21],[6,-3],[3,-1],[20,-6],[26,-8],[4,0]],[[9039,4992],[-24,-47]],[[8870,5005],[-11,6],[-12,6]],[[8847,5017],[-10,6]],[[8837,5023],[9,24]],[[8846,5047],[10,-5],[13,-7],[12,-6],[8,22]],[[8889,5051],[10,-5]],[[2120,1713],[-52,-40],[-10,18],[-1,2],[-1,1],[-1,0],[-1,0],[-10,0],[-18,-2],[-1,-1],[-1,-1],[-1,-1],[1,-22],[-42,-33],[-10,-8],[0,-1],[-1,0],[0,-1],[0,-1],[0,-1],[11,-17],[-18,-14],[-11,-10]],[[1953,1581],[-19,-14]],[[1855,1672],[44,3],[18,15],[157,124]],[[1813,1646],[-1,3],[-5,8],[-5,10]],[[1802,1667],[-19,41],[11,7],[8,4],[-10,20],[18,8],[20,5],[8,1],[11,4]],[[1849,1757],[18,-40],[13,-30],[7,1],[6,2],[7,4],[12,8],[6,6]],[[1918,1708],[94,73],[17,14]],[[2029,1795],[19,16],[19,15]],[[2067,1826],[7,-12]],[[1849,1757],[-1,1],[-13,30],[0,3],[43,26],[9,-20],[41,25],[-10,19]],[[1918,1841],[16,10],[3,-1],[33,-73],[-35,-29],[-27,-18],[10,-22]],[[1802,1667],[-19,-11]],[[1702,1781],[17,11],[20,12]],[[1892,1898],[9,-19],[8,-19],[9,-19]],[[1926,1919],[18,11],[18,12]],[[1962,1942],[17,-37],[20,-44],[10,-22],[20,-44]],[[2102,1961],[-11,-7],[-14,-9],[-6,-3],[-4,-1],[-10,-1],[-1,-20],[8,-15],[30,22],[10,-19],[-25,-19],[-15,-12],[0,-3],[10,-17],[11,-19],[-18,-12]],[[1962,1942],[9,6],[3,5],[1,7],[0,11]],[[2022,1996],[7,-3],[31,28],[7,-20],[4,-9],[11,8],[1,-1],[9,-17],[10,-21]],[[7900,4857],[-7,-19]],[[7893,4838],[-9,5],[-33,17],[-2,1],[-10,5]],[[7879,4801],[-8,5],[-37,19],[-2,1],[-11,5]],[[7893,4838],[-7,-18],[-7,-19]],[[7882,4725],[-24,17]],[[7879,4801],[-4,-12],[-3,-8],[26,-13],[-6,-17],[-10,-26]],[[7902,4711],[-20,14]],[[7893,4838],[9,-4],[30,-15],[9,-4]],[[7941,4815],[-7,-19]],[[7934,4796],[-6,-19]],[[7928,4777],[-8,-20]],[[7920,4757],[-7,-19]],[[7913,4738],[-5,-11],[-6,-16]],[[7920,4757],[11,-6],[9,-5],[7,-3],[7,-4],[1,-4],[-3,-9],[-4,-9],[-4,-1],[-6,4],[-7,4],[-7,6],[-7,5],[-4,3]],[[7959,4671],[-3,2],[-2,2],[-4,2],[-40,29],[-8,5]],[[7928,4777],[9,-4],[44,-22],[10,-4]],[[7991,4747],[-15,-40],[-5,-10],[0,-6],[-2,-5],[-10,-15]],[[7934,4796],[10,-4],[44,-23],[9,-4]],[[7997,4765],[-6,-18]],[[7941,4815],[9,-5],[44,-22],[9,-5]],[[8003,4783],[-6,-18]],[[8010,4802],[-7,-19]],[[7948,4833],[9,-5],[44,-22],[9,-4]],[[8017,4820],[-7,-18]],[[7961,4869],[9,-4],[45,-22],[9,-4]],[[8024,4839],[-7,-19]],[[8031,4857],[-7,-18]],[[7975,4906],[9,-4],[44,-22],[9,-5]],[[8037,4875],[-6,-18]],[[8044,4894],[-7,-19]],[[7934,4949],[9,-5],[26,-13],[3,-2],[10,-4]],[[7982,4925],[9,-5],[44,-22],[9,-4]],[[8051,4912],[-7,-18]],[[7982,4925],[6,18],[9,22]],[[7997,4965],[10,-4],[42,-21],[10,-5]],[[8059,4935],[-8,-23]],[[7934,4949],[6,18],[4,11],[4,12],[39,-20],[10,-5]],[[8004,4985],[-7,-20]],[[7924,5025],[10,-5],[61,-30],[9,-5]],[[7942,5060],[8,-4],[3,-1],[26,-13],[13,-6],[16,-8],[9,-5]],[[8017,5023],[-6,-19],[-7,-19]],[[3044,2793],[-31,52],[-16,-13],[-17,-15],[-21,-17],[-12,18],[-11,19]],[[2936,2837],[44,37]],[[2980,2874],[78,63]],[[3058,2937],[11,-18]],[[3069,2919],[10,-18],[22,-37],[-38,-29],[-14,-11],[13,-23],[-18,-8]],[[2980,2874],[-13,21]],[[2949,2928],[63,51],[14,11],[-15,25],[14,16],[37,-60],[3,0],[14,11],[-11,19],[-17,28],[0,3],[1,2],[14,17],[7,7],[13,12],[-8,21]],[[3078,3091],[20,15]],[[3098,3106],[10,-25]],[[3108,3081],[27,-80],[5,-15],[3,-8]],[[3143,2978],[-21,-16],[-10,-6],[-9,-2],[-7,0],[-12,-2],[-6,-2],[-7,-3],[-13,-10]],[[2881,3114],[4,-11],[8,-14],[40,-65],[2,0],[14,11],[18,15],[17,13],[43,35],[3,2],[3,-1],[9,-12],[11,-17],[25,21]],[[2901,3123],[19,6]],[[2920,3129],[12,2],[20,5],[16,5],[15,9],[11,8],[9,8],[8,7],[18,23]],[[3029,3196],[44,-52],[16,-21],[9,-17]],[[2920,3129],[0,25],[-1,40],[5,17],[7,18],[9,12],[12,12],[12,8],[20,11],[-7,24]],[[2977,3296],[19,8],[8,-22],[5,-18],[5,-11],[6,-10],[9,-11],[14,-18]],[[3043,3214],[-14,-18]],[[1823,2038],[-7,16],[-4,7],[-18,15],[-6,7],[-10,22]],[[1757,1958],[-2,3],[-10,21],[-10,21],[-11,24]],[[1724,2027],[-9,19],[-2,6],[-3,1],[-29,-22],[-15,32]],[[1671,1904],[-17,36]],[[1654,1940],[19,12],[10,-21],[2,0],[7,4],[7,6],[0,3],[-3,8],[-6,12],[-3,5],[-10,22],[18,13],[29,23]],[[1654,1940],[-9,21],[-19,41],[-4,16],[-5,18],[-3,4]],[[6347,2548],[-57,41],[-14,-20],[-11,-7],[-18,12],[-15,12],[-15,3]],[[5577,3559],[-3,-3],[-24,-38]],[[5550,3518],[-20,-25],[-22,-30],[-15,-20],[-4,-4]],[[5489,3439],[-18,-24],[-35,-45]],[[5402,3321],[42,-43],[3,-4],[16,-17],[4,-3],[21,-23],[6,-6],[3,-3]],[[5497,3222],[6,-5],[4,-5],[6,-9],[5,-9],[6,-15],[4,-19],[3,-17]],[[4365,2120],[-83,83],[-2,3],[-88,154],[-32,58],[41,62],[-121,125]],[[4080,2605],[22,17],[8,5],[8,3],[44,10],[3,-17],[2,-6],[3,-6],[6,-11],[3,-4],[4,-5],[21,-22],[36,-40],[5,-14],[72,16],[5,1],[77,19],[156,37],[10,0],[11,14],[17,22],[70,92],[38,51],[16,10],[27,-27],[28,36],[0,4],[-18,21],[32,38],[5,5],[6,4],[7,1],[7,0],[6,-1],[7,-4],[12,-7],[12,-5],[12,-7],[10,-6],[5,-2],[5,0],[2,0],[3,0],[2,0],[-9,12],[-12,16],[-2,3],[-3,4],[-3,3],[-3,4],[-4,4],[-4,5],[-2,3],[-5,5],[-6,7],[-6,6],[-7,8],[-4,3],[-5,5],[-2,2],[14,-1],[12,-1],[42,-4],[30,-3],[11,-1],[36,-4],[37,-3],[20,-2],[18,-2],[-2,6],[-3,9],[6,69],[2,3],[5,63],[2,12],[2,12],[2,4],[8,19],[2,3],[8,12],[11,14],[54,69],[41,52],[43,55],[66,86],[4,10],[3,2],[2,4],[2,5],[3,4],[7,10],[2,2]],[[5300,3421],[5,8],[14,18],[6,8],[5,8],[6,15],[4,13],[3,19],[0,12],[4,2],[3,9],[8,17],[3,6],[2,5],[1,5],[-1,26]],[[5363,3592],[15,2],[15,-15],[22,28]],[[5415,3607],[7,9],[14,19],[3,3],[2,-2],[38,-40],[11,14]],[[5490,3610],[6,8],[1,0],[1,0],[1,0],[1,-1],[11,-11],[5,0],[19,1],[-1,-1],[-1,-1],[-1,-1],[0,-2],[1,-23],[6,1],[8,0],[5,0],[4,-1],[3,-2],[14,-14],[4,-4]],[[5031,3567],[1,-25],[-34,-3],[-22,0],[-9,-1],[-13,-1],[2,-21],[6,-20],[-11,-3],[-8,-7],[-5,-7],[42,-44],[-1,-2],[-23,-33],[-17,-27]],[[4939,3373],[-17,18],[-13,14],[-6,6],[-14,14],[-15,16],[-8,4],[-6,2],[-6,2],[-5,3],[-8,8],[-1,3],[-1,5],[1,8],[2,4],[7,7],[6,4],[5,3],[3,3],[5,5],[10,12],[-17,18],[-1,3],[-15,16],[-10,12],[-3,0],[-4,3]],[[4828,3566],[41,50],[7,7],[4,4],[6,3],[5,2],[5,2],[16,3],[7,1]],[[4919,3638],[34,2],[21,2]],[[4974,3642],[19,0]],[[4993,3642],[0,-3],[1,-20],[1,-23],[1,-31],[35,2]],[[4939,3373],[-15,-17],[-26,-27],[-10,-10],[-67,68],[-71,76],[-4,4],[82,99]],[[5031,3567],[23,1],[6,0],[8,-2],[33,1],[16,1],[36,4],[6,0],[6,-10],[6,-7],[40,-42]],[[5211,3513],[-2,-3],[-63,-81],[-28,-37],[-4,-4],[-3,-2],[-11,-5],[-8,21],[-2,3],[-22,-10],[-26,-12],[-3,-1],[-1,0],[-3,2],[-35,36],[-12,-20],[-13,-17],[-13,-16],[-5,-7],[-3,-3],[-15,16]],[[5211,3513],[31,-33],[28,-27],[27,-29],[3,-3]],[[4080,2605],[-28,43],[1,0],[12,10],[97,81],[7,5],[12,36],[1,2],[1,0],[2,2],[11,4],[1,3],[8,4],[0,7],[1,4],[4,1],[-1,5],[3,2],[2,3],[-2,3],[0,3],[-4,1],[-4,0],[-4,-1],[-4,-1],[-3,1],[3,8],[-1,5],[-6,34],[4,4],[5,4],[-1,6],[0,1],[-2,8],[4,7],[8,6],[12,8],[16,14],[-7,17],[-9,19],[-26,49],[-27,50]],[[4166,3063],[-48,44],[-61,58],[10,4]],[[4067,3169],[42,48],[-19,22]],[[4158,3361],[36,-47],[23,30],[20,-20],[11,12],[65,-62],[31,40],[20,-24],[37,44],[5,0],[4,2],[1,5],[14,11],[23,-1],[33,29],[-26,28],[-1,1],[-42,47]],[[4412,3456],[31,18],[15,11],[0,1],[32,19],[8,5],[45,28],[3,1]],[[4546,3539],[7,5],[36,22],[69,39],[28,16],[125,75],[36,22]],[[4847,3718],[20,-11],[51,-58],[1,-11]],[[5211,3513],[15,21],[30,39],[24,32]],[[5280,3605],[15,-20],[5,6],[2,0],[3,-2],[3,-5],[-6,-9],[16,-17],[25,32],[6,1],[14,1]],[[5374,3648],[16,-17],[7,9],[8,-8],[0,-1],[-6,-8],[16,-16]],[[5280,3605],[18,24],[6,8],[12,16]],[[5316,3653],[8,-3],[12,-11],[21,28],[17,-19]],[[6777,2060],[-58,37]],[[7388,3093],[-11,5]],[[7377,3098],[-28,13],[-10,1],[-8,-1],[-7,-1],[-8,-3],[-38,-10],[-18,-3],[-26,0],[-16,0]],[[7350,3037],[3,8],[4,0],[2,7],[-4,6],[21,38]],[[7376,3096],[1,2]],[[7338,3047],[12,27],[5,9],[4,7],[17,6]],[[5555,4114],[-40,-28]],[[5515,4086],[-46,-34],[-46,-34],[-2,-4],[-11,-8],[-2,3],[-16,18],[-3,4],[-2,3],[-2,2],[-3,3]],[[5524,4010],[-20,-25]],[[5504,3985],[-13,14],[-4,4],[-14,14],[-14,-19],[-16,-20],[-29,-36]],[[5414,3942],[-16,14],[-10,10],[-4,4],[-9,10]],[[5375,3980],[-3,3],[-7,7],[-21,22],[-3,2]],[[5341,4014],[39,24]],[[5515,4086],[11,-22],[-11,-6],[-10,-7],[-8,-6],[7,-11],[8,-11],[6,-7],[6,-6]],[[5504,3985],[35,-37]],[[5539,3948],[-14,-19],[-36,38],[-14,-19],[36,-38],[44,-47]],[[5526,3826],[-34,36]],[[5492,3862],[-11,11],[-67,69]],[[5539,3948],[46,-47]],[[5610,4014],[8,0],[3,-1],[2,-4],[-2,-4],[-3,-2],[-5,-2],[0,-3],[0,-8],[-1,-8],[11,-3],[9,-5],[-5,-12],[0,-3],[2,-2],[3,-5],[7,-6]],[[5524,4010],[5,-5],[11,-8],[11,20],[11,18],[11,-8],[7,-6],[9,-6],[9,-5],[9,-3],[5,0],[-2,7]],[[5610,4014],[-1,3],[-3,7],[-3,7],[11,6],[2,2],[5,6]],[[7592,2355],[0,-1],[-1,-4],[-1,-3],[0,-2],[-4,-17],[-2,-7],[-1,-4],[-4,-17],[-3,-14],[-2,-9],[-1,-3],[-1,-3],[-11,-43],[-1,-4]],[[7560,2224],[-3,-11],[0,-1],[0,-1],[0,-1],[-1,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-2],[0,-1],[0,-1],[0,-2],[0,-2],[1,-5],[0,-2],[0,-1],[1,-1],[0,-2],[0,-1],[1,-1],[0,-2],[1,-1],[0,-1],[0,-1],[1,-3],[1,-1],[1,-2],[0,-1],[1,-1],[0,-2],[1,-1],[1,-1],[1,-2],[0,-1],[1,-2],[1,-1],[2,-2],[6,-9],[6,-7],[13,-18],[6,-9],[2,-2],[2,-2],[2,-2]],[[7613,2099],[-2,-2],[-2,-2],[-1,-1],[-5,-6],[-2,-2],[-40,-40],[-4,-4],[-2,-2],[-3,-3],[-34,-26],[-130,-88],[-4,-3],[-72,-34],[-42,-22],[-24,-13],[-96,-72],[-58,-45],[-38,-41],[-22,-27],[-8,-10],[-4,-4],[-4,-4],[-20,-25],[-18,-25],[-31,-53],[-9,-13]],[[7473,2222],[2,2],[12,16],[4,5],[3,4],[5,8],[27,40],[8,10],[9,7],[5,5],[41,36],[1,1],[2,-1]],[[7590,1280],[-53,-103],[-2,-4]],[[6457,1354],[28,-19],[5,-11],[2,-2],[3,-2],[1,-2],[2,-1],[0,-1],[3,-3],[2,-2],[3,-4],[1,-4],[2,-3],[1,-2]],[[6510,1298],[-12,-4],[-3,-1],[-91,-29],[-6,-2],[-38,-10],[-21,-6],[-75,-24],[-4,-2],[-6,-2]],[[6254,1218],[0,5],[-1,35],[-22,0],[-23,-1]],[[6208,1257],[0,65]],[[6208,1322],[22,0],[0,32],[15,36],[3,8],[1,4],[1,3],[-6,4],[-11,6],[-10,6],[-54,37],[-9,6],[-7,4]],[[6153,1468],[-1,1],[-7,4],[-4,3],[-6,3],[-7,3],[-7,3],[-6,3],[-7,2]],[[6153,1321],[-1,100],[0,37],[0,6],[1,4]],[[6208,1322],[-19,0],[-18,-1],[-18,0]],[[6172,1257],[-19,0]],[[6153,1257],[0,64]],[[6208,1257],[-19,0],[-17,0]],[[6153,1257],[-17,-1],[-18,0],[-12,1]],[[6105,1421],[12,0],[17,0],[1,-100],[18,0]],[[6137,1181],[-19,-6]],[[6118,1175],[0,5],[-8,12],[-5,57],[1,8]],[[6172,1257],[0,-60],[-18,-5],[-18,-6],[1,-5]],[[6254,1218],[-22,-7],[-95,-30]],[[5468,3830],[-27,27],[-2,1],[-2,-1],[-40,-52],[-39,-52],[15,-16],[13,-13]],[[5386,3724],[-13,-18]],[[5373,3706],[-13,13],[-16,16],[-3,-2],[-4,-6],[-18,-22],[-18,-24],[1,-12],[14,-16]],[[4993,3642],[21,2],[21,1],[22,1],[10,2],[8,2],[8,5],[8,8],[7,8],[10,17],[9,15],[1,3]],[[5118,3706],[12,19],[13,22],[13,20]],[[5156,3767],[13,19],[16,19],[14,17],[26,30],[11,9],[16,10],[7,5],[14,11],[42,41],[19,18],[6,4],[22,19],[10,9],[3,2]],[[5492,3862],[-3,-3],[-13,-17],[-8,-12]],[[5468,3830],[11,-12],[-14,-20],[-14,-18],[-3,2],[-10,9],[-13,-15],[-10,-15],[9,-13],[-1,-5],[-25,-32],[-12,13]],[[5601,3534],[-24,25]],[[5490,3610],[-26,28],[7,10],[-13,14],[-11,11],[-3,1],[-6,-6],[-2,-1],[-1,1],[-9,10],[-3,3],[-12,12],[-11,-15]],[[5400,3678],[-4,4],[-23,24]],[[5400,3678],[-4,-2],[-22,-28]],[[8925,5145],[-10,6],[-8,4],[-5,2],[-1,1],[-10,5]],[[8908,5098],[-10,-24],[-10,6],[-14,8],[-10,5]],[[8889,5051],[-10,5],[-14,8],[-10,6]],[[8846,5047],[-11,6],[-18,9],[-10,6]],[[8807,5068],[9,23]],[[8837,5023],[-11,6],[-19,10],[-10,5]],[[8797,5044],[-11,6],[-19,10],[-10,5]],[[8757,5065],[9,25],[10,-6],[20,-11],[11,-5]],[[8776,4996],[11,25],[10,23]],[[8847,5017],[-5,-11],[-4,-12],[-11,6],[-10,-26],[-41,22]],[[8816,4937],[-11,6],[-12,6]],[[8793,4949],[-29,16]],[[8764,4965],[5,12],[6,15],[1,4]],[[8796,4920],[-12,6],[5,12],[4,11]],[[8812,4853],[-10,5],[-16,8],[-9,6]],[[8777,4872],[-41,21]],[[8736,4893],[10,25],[4,12],[5,12],[-23,12],[1,2],[3,8],[5,13]],[[8741,4977],[23,-12]],[[8792,4795],[-11,5],[-31,17]],[[8750,4817],[6,11],[8,17],[11,23],[2,4]],[[8750,4817],[-38,21]],[[8712,4838],[5,11],[8,16],[6,14],[4,11],[1,3]],[[8728,4768],[-10,6],[-18,9],[-11,5]],[[8689,4788],[6,16],[6,11],[5,11],[6,12]],[[8750,4817],[-5,-11],[-6,-11],[-4,-10],[-1,-2],[-6,-15]],[[8773,4746],[-10,5],[-24,12],[-11,5]],[[8765,4723],[-11,5],[-24,12],[-10,5]],[[8720,4745],[8,23]],[[8745,4670],[-11,6],[-23,12],[-10,5]],[[8701,4693],[9,26],[10,26]],[[8730,4629],[-9,5],[-25,13],[-11,5]],[[8685,4652],[8,21],[8,20]],[[8685,4652],[-7,-21]],[[8678,4631],[-11,5],[-18,9],[-11,5],[8,19],[0,2],[9,22],[7,19]],[[8662,4712],[10,-5],[13,-6],[5,-3],[11,-5]],[[8700,4595],[-20,10],[-10,5]],[[8670,4610],[8,21]],[[8661,4587],[-36,19],[-4,1],[-39,19]],[[8582,4626],[5,11],[4,12]],[[8591,4649],[8,21]],[[8599,4670],[7,19],[1,2]],[[8607,4691],[8,22],[7,19]],[[8622,4732],[11,-5],[10,-5],[8,-4],[11,-6]],[[8670,4610],[-5,-11],[-4,-12]],[[8643,4542],[9,24]],[[8652,4566],[4,11],[5,10]],[[8652,4566],[-35,17],[-4,2],[-10,-24],[-2,1],[-7,4],[-20,10],[-10,5]],[[8564,4581],[10,24]],[[8574,4605],[8,21]],[[8545,4525],[10,29],[0,3],[9,24]],[[8545,4525],[-2,1],[-9,5],[-11,5],[-17,4],[-36,5]],[[8470,4545],[12,30],[6,15],[9,24],[5,14],[4,11]],[[8506,4639],[36,-19],[22,-10],[2,-1],[8,-4]],[[8506,4639],[4,10],[4,11]],[[8514,4660],[10,-5],[26,-13],[20,-10],[2,-1],[10,-5]],[[8514,4660],[4,12],[4,11]],[[8522,4683],[10,-5],[49,-24],[10,-5]],[[8522,4683],[8,21]],[[8530,4704],[9,-5],[2,0],[47,-24],[11,-5]],[[8530,4704],[8,21]],[[8538,4725],[11,-5],[47,-24],[11,-5]],[[8538,4725],[8,22]],[[8546,4747],[7,20]],[[5016,1222],[4,-1],[16,-1],[4,-5],[1,-11],[-2,-4],[-2,-2],[-4,-2],[-13,-4],[-8,-2],[-4,0],[-8,4],[-5,0],[-2,-1],[-4,-2],[-4,-6],[-2,-9],[-4,-6],[-8,-6],[-6,-4],[-3,-8],[-3,-3],[-15,-6],[-7,-4],[-12,-3],[-11,0],[-13,4],[-16,12],[-13,12],[-3,2],[-1,3],[-8,3],[-5,1],[-3,1],[-3,1],[-2,0],[-2,0],[-9,-3],[-9,-10],[-7,-1],[-6,-2],[-4,2],[-4,2],[-9,5],[-6,6],[-2,0],[-5,4],[-3,0],[-5,1],[-4,0],[-3,1],[-5,3],[-2,1],[-4,-1],[-2,-10],[-3,-4],[-9,2],[-2,2],[-1,0]],[[4741,1173],[-2,3],[1,20],[-2,4],[-5,2],[-2,20]],[[4731,1222],[11,-2],[3,0],[16,1],[4,0],[4,1],[11,4],[8,8],[2,0],[0,1],[1,2],[2,2],[2,2],[3,3],[4,4],[5,3],[13,8],[13,5]],[[4833,1264],[26,5],[11,2],[15,2],[20,6]],[[4905,1279],[4,1],[17,2],[19,0],[6,-30],[3,-25],[4,-24],[38,9],[8,1],[6,-3],[5,0],[1,9],[0,3]],[[5122,1221],[0,-4],[3,-15]],[[5125,1202],[-8,2],[-10,1],[-20,1],[-5,0],[-4,-1],[-18,-2],[-2,2],[-6,6],[-8,10],[-4,2],[-11,2],[-9,0],[-4,2]],[[5016,1227],[1,8],[17,0],[0,33],[-18,1],[0,12]],[[5016,1281],[11,0],[26,-1],[11,-2],[11,-7],[9,-8],[10,-12],[5,-9],[10,-10],[7,-7],[6,-4]],[[1506,1092],[-3,7],[-2,7],[-3,45],[-11,27]],[[1560,1505],[64,-17]],[[1624,1488],[14,-49],[22,-78],[23,-80],[29,-62],[4,-7],[2,-5],[3,-3],[4,0],[5,1]],[[1983,1486],[7,-12],[33,-54],[4,-7]],[[1624,1488],[2,-1],[26,11],[10,4],[2,4],[9,4],[5,-7],[6,8],[8,7],[7,7],[34,24],[3,3],[16,12],[9,11],[15,23],[12,16],[13,17]],[[6475,2834],[-8,6],[11,20],[0,17],[-12,8],[2,12],[4,14],[10,16],[-5,4],[-2,1],[-2,2]],[[7999,2859],[-7,9],[-7,7],[-5,4],[-2,3]],[[7978,2882],[3,3],[32,42],[2,2],[4,6],[8,10],[12,16],[0,1],[20,25],[5,7],[4,5],[3,2]],[[7920,2741],[-10,27]],[[7910,2768],[-8,17],[-1,2],[-1,4]],[[7900,2791],[15,15],[8,9],[15,17],[7,8],[11,14],[14,17],[8,11]],[[7978,2882],[-2,4],[-1,2],[-1,3],[-4,6],[-2,3],[-8,10],[-8,9]],[[7900,2791],[-1,1],[-1,3],[-3,5],[-2,6],[-2,3],[-2,5],[-4,5],[-8,11],[-15,19],[-2,3],[14,7],[-26,13],[-8,4],[-13,7]],[[7850,2917],[3,0],[2,-2],[1,-3],[4,-4],[8,-9],[8,10],[4,6],[2,3],[14,18]],[[7896,2936],[7,-6],[2,-1],[15,-12],[13,-10],[15,14],[3,-3],[1,1]],[[8723,2851],[-10,7],[-12,6],[-16,5],[-40,13],[-5,1],[-2,1],[-32,10],[-33,10],[-2,-1],[-4,1],[-21,7],[-4,2],[-3,2],[-7,2],[-10,4],[-13,7],[-13,10],[-7,7],[-4,3],[-10,12],[-7,10],[-6,9],[-5,11],[-3,9],[-1,2],[-3,11],[-2,6]],[[8448,3018],[7,2],[1,2],[1,6],[6,35],[3,22],[2,20],[0,2],[0,2],[-1,0],[-6,4],[-1,1],[2,5],[0,5],[0,9],[0,3],[2,23],[1,24],[-1,21]],[[8595,3755],[-7,-33],[-50,-139],[0,-2],[26,1],[27,75],[3,0],[3,15],[13,-16],[-22,-123],[8,-1],[-10,-57],[-89,-6],[-17,-47],[0,-1],[98,9],[-7,-30],[-97,-10],[-4,-25],[54,6],[0,-5],[-54,-6],[-4,-19],[97,13],[-6,-32],[-90,-12],[6,-49],[1,-11],[4,-26],[6,0],[0,-5],[4,-1],[5,20],[11,1],[-3,-27],[3,0],[2,8],[2,0],[4,15],[22,-3],[0,-13],[2,0],[-7,-113],[1,0],[0,-3],[-9,-131],[2,-5],[3,1],[0,-6],[6,0],[1,-2],[4,-1],[0,8],[6,-1],[7,103],[13,173],[1,2],[8,-1],[30,0],[-11,-169],[22,-2],[12,159],[3,41],[3,50],[0,7],[5,49],[3,18],[10,75],[3,27],[2,8],[3,2],[2,1],[3,-2],[5,-4],[-1,-102],[-1,-17],[1,-81],[1,-12],[-2,-19],[-1,-22],[0,-16],[0,-20],[0,-18],[8,-43],[0,-13],[1,-2],[7,-55],[14,-111],[3,-10],[6,-18],[7,-21],[16,-33],[13,-30],[2,-4]],[[8376,2911],[3,3],[31,28],[3,1],[8,-1],[7,0],[9,-1],[9,2],[7,1],[4,2],[6,-1],[5,0],[7,0],[0,3],[-6,6],[-2,3],[-3,6],[-4,5],[-3,5],[-4,6],[-3,5],[-1,4],[-2,4],[-3,6],[-8,-7],[-2,1],[2,21],[-7,0],[-4,-33],[-11,-10],[4,41],[-7,-1],[-6,-50],[-21,-20],[-5,-4]],[[8379,2936],[2,3],[7,29]],[[8388,2968],[4,21],[3,23],[14,2],[30,2],[2,0],[3,1],[4,1]],[[8448,3018],[-6,26],[-6,19],[-3,11],[-1,3],[-6,12],[-7,11],[-8,8],[-3,3],[-6,4],[-28,19],[-10,6],[-4,3],[-16,10],[-11,7],[-7,4],[-32,26]],[[8294,3190],[1,3],[1,2],[1,4],[20,46],[5,12],[4,9],[4,12]],[[8388,2968],[-29,17],[-2,2],[-40,25],[-8,-19],[-6,-12],[-31,5],[-11,2],[-11,3],[-9,6],[-6,4],[-3,4],[-6,6]],[[8226,3011],[12,23],[9,22],[15,37],[6,16],[1,4],[3,9],[2,6],[2,6],[5,15],[10,29],[1,5],[0,1],[1,2],[1,3],[0,1]],[[8159,3023],[17,28]],[[8176,3051],[50,-40]],[[8226,3011],[-12,-25],[-14,-27]],[[8379,2936],[-3,-4],[-3,-2],[-15,-12],[-32,-27],[-30,-28],[-8,-9],[-3,-2]],[[2357,1179],[-39,-11],[-36,-9],[-22,-6],[-35,-9]],[[2225,1144],[-10,35],[-1,4],[-25,84],[-4,7],[-10,19]],[[2175,1293],[10,5],[1,0]],[[2323,1305],[6,-15],[-1,-3],[1,-5],[2,-8],[6,-19],[1,-6],[3,-12],[3,-11],[6,-24],[7,-23]],[[2439,1152],[8,-30],[-9,-3],[-11,-4],[-9,-3],[-10,-4],[-10,-3],[-18,-7],[-2,0],[2,-9]],[[2380,1089],[-36,-13],[-48,-17],[0,-1],[0,-2],[0,-1],[18,-70],[-39,-11]],[[2275,974],[-2,7],[-2,6],[-9,32],[-7,26],[-30,99]],[[2357,1179],[3,-15],[3,-8],[50,12],[20,6],[3,-9],[3,-13]],[[2421,1382],[2,-8],[3,-10],[0,-3],[3,-10],[6,-24],[12,-48],[6,-24],[-11,-4],[3,-11],[3,-12],[4,-19],[2,-4]],[[2454,1205],[-1,-2],[11,-42],[-25,-9]],[[2454,1205],[58,20],[25,9],[4,2]],[[2541,1236],[10,-39]],[[2551,1197],[-3,-2],[8,-25],[-1,-5],[-1,-2],[-1,-2],[-2,-3],[-7,-2],[4,-18],[4,-16],[-6,-1],[-1,0],[-3,2],[-1,0],[-22,-7],[0,-1],[-1,-1],[0,-1],[10,-34],[-20,-9],[-32,-17],[-37,-17],[-40,-17],[-2,9],[-4,11],[-4,16],[-2,10],[-7,24]],[[2582,1092],[-3,-1],[-7,-3],[-1,-1],[-26,-12],[-56,-24],[-90,-41],[-55,-22],[-22,-7],[-38,-10],[-6,-2]],[[2278,969],[-3,5]],[[2551,1197],[13,-40],[5,-8],[3,-2],[2,0],[3,-1],[9,3],[15,6],[42,15],[-4,16]],[[2639,1186],[4,2],[45,15],[1,0],[1,-1],[5,-19],[0,-2],[0,-1],[-49,-22],[7,-28],[69,31],[48,22]],[[2770,1183],[46,21]],[[2816,1204],[1,-6]],[[2817,1198],[-2,-1],[-153,-69],[-74,-33],[-6,-3]],[[2607,1311],[3,-11],[1,-1],[13,0],[5,0],[9,2],[2,-11],[4,-13]],[[2644,1277],[-6,-2],[-3,0],[-13,0],[-1,-14],[0,-6],[3,-11],[11,-44],[4,-14]],[[2541,1236],[-30,118],[-5,16]],[[2506,1370],[13,4],[7,-24],[10,4],[3,0],[35,-7],[1,-1],[1,-2],[4,-17],[6,-20],[1,-3],[20,7]],[[2488,1435],[4,-9],[2,-9],[12,-47]],[[2757,1440],[59,-236]],[[2770,1183],[-5,22],[-1,1],[-2,1],[-7,-3],[-15,55],[-5,22],[-9,25],[-1,1],[-1,1],[-1,0],[-1,0],[-11,-4],[-7,-4]],[[2704,1300],[-5,17],[-2,8],[21,7],[1,1],[-4,17],[0,13],[-7,29],[-8,31],[-1,1],[-1,0],[-60,0],[-7,1],[-1,-1],[0,-1],[0,-4],[7,-25],[-20,-7],[-27,-9],[6,-24],[11,-43]],[[2488,1435],[22,3],[247,2]],[[2704,1300],[-13,-6],[-6,-3],[-20,-7],[-21,-7]],[[2537,873],[-2,-1],[-2,-2],[-12,-7],[-2,-3],[-13,-9],[-12,-13],[6,-11],[2,2],[1,-1],[-2,-3],[-4,-3],[-10,11],[-4,-3],[-11,-11],[-14,-16],[-3,-2],[-3,-1],[-4,-4],[-4,-6],[-5,-3],[-5,-6],[0,-2],[0,-2],[-15,-18],[-2,-3],[-1,-1],[-3,0],[-3,-1],[-2,-4],[-8,-4],[-13,-1],[-3,1],[-13,1],[-12,2],[-13,0],[-16,-4],[-2,-2],[-5,-5],[-3,-1],[-2,-1],[-1,-1],[-11,-5],[-6,-4],[7,-19],[-4,-3],[-4,10],[-1,0],[2,-8]],[[2228,744],[9,10],[9,8],[10,5],[16,7],[43,17],[23,9],[21,8],[-11,38],[-13,45],[0,2],[1,0],[1,1],[1,0],[4,-1],[6,-2],[6,-3],[5,-4],[22,7],[-2,3],[-4,5],[-4,5],[-6,4],[-7,4],[-9,4],[-10,2],[-11,0],[-1,1],[-7,23]],[[2320,942],[10,1],[13,-1],[8,-2],[5,-1],[12,-4]],[[2215,729],[-2,5],[-6,23],[-6,19],[2,4],[6,7],[1,3],[-1,2],[-1,3],[-7,8],[-29,101],[17,6],[5,1],[8,3],[22,6],[73,19],[10,2],[13,1]],[[1879,863],[27,8],[14,3],[32,8],[56,16],[46,12],[17,4],[70,20],[124,31],[13,4]],[[2582,1092],[3,-15],[1,-6],[0,-4],[2,-8],[0,-4]],[[2104,990],[13,2],[5,1],[5,3],[3,3],[4,5]],[[2134,1004],[4,-5],[4,-3],[11,-19],[1,-1],[1,0],[38,10],[20,6],[4,-10],[2,-9],[4,-12],[52,13]],[[2134,1004],[2,3],[2,7],[1,6],[0,8],[-1,7],[-5,23],[17,5],[0,2],[0,3],[-2,7],[-3,5],[-3,5],[-5,6],[-5,5],[-2,5],[-2,5],[-5,18],[20,5],[5,-18],[2,-5],[4,-3],[5,-2],[4,1],[20,7],[22,10],[-5,19]],[[2200,1138],[25,6]],[[2096,1141],[41,12],[-3,9],[1,4],[2,7],[2,6],[25,-1],[16,-1],[3,0],[4,1],[6,-20],[-4,-10],[6,-5],[5,-5]],[[2069,1205],[-4,19],[0,3],[1,2],[37,8],[-8,26],[-6,23],[16,6],[3,3],[7,-23],[41,14],[12,4],[7,3]],[[2023,1318],[25,12],[16,9],[5,2],[1,1],[26,-42],[12,11],[22,21],[30,18],[24,-49],[2,-3]],[[2030,1408],[6,4],[50,41],[36,29],[17,14]],[[1953,1581],[11,-19],[9,-15],[1,-3],[77,61],[21,17]],[[6461,6069],[4,24],[18,-5],[8,-1]],[[6491,6087],[1,-12],[-2,-13],[-1,-5]],[[6489,6057],[-1,-4],[-2,-9],[-25,25]],[[6489,6057],[26,-26],[4,-4]],[[6519,6027],[-1,-5],[-4,-13],[-2,-10],[-6,-28],[-2,-8]],[[6504,5963],[-4,3],[-4,1],[-24,19]],[[6472,5986],[2,6],[2,11],[5,22],[-25,19],[5,25]],[[6326,5854],[4,-2],[25,-26],[2,1],[2,0],[2,-3],[1,-3],[33,-23]],[[6395,5798],[-2,-6],[-3,-5],[-3,-2],[-5,-3],[-6,-5],[-3,-1],[-3,-4],[-12,-26],[-3,-6]],[[6355,5740],[-10,-23],[-5,-11]],[[6340,5706],[-16,8],[-4,-11],[-2,-14],[-11,-39],[-5,1],[-1,-10],[-5,-14],[-7,-3]],[[6289,5624],[-4,-1],[-5,-2]],[[6280,5621],[-14,15],[-18,23],[-3,6],[0,1],[-16,-8],[-5,4],[-6,6],[-5,7],[-5,9],[-4,9],[0,7],[5,15],[5,9],[2,4],[9,13],[3,9],[11,25],[5,10],[3,8],[5,8],[22,24],[5,5],[2,2],[1,3],[0,13],[12,16],[3,6],[0,10],[13,31],[5,7],[1,1],[5,4],[8,4],[8,8],[1,-2],[-5,-5],[5,0],[4,2],[9,9],[25,29],[0,2],[3,-1],[3,5],[4,10],[2,1],[0,-5],[-1,-10],[-4,-10],[-8,-14],[-7,-9],[-8,-6],[-7,-3],[-14,-13],[-10,-10],[-1,-1],[-5,-11],[-6,-13],[-4,-13],[-1,-5],[1,-1],[0,-3],[-4,-7],[-1,-5],[-3,-6],[0,-4],[-9,-12],[0,-23],[-2,-13],[-5,-15],[0,-4],[-1,-5],[-2,-7],[-1,-13],[2,-1],[2,3],[2,-1],[-3,-12],[7,-2],[2,3],[3,6],[5,13],[1,6],[2,9],[1,8],[-1,26],[1,16],[5,5],[6,6],[-1,4],[1,5],[3,12],[3,4]],[[6407,6036],[-3,-8],[-3,9],[-3,0],[-2,2],[0,10],[1,8],[5,23],[0,6],[3,9],[6,11],[1,1],[6,-3],[1,-9],[-2,-14],[-4,-19],[-4,-8],[-2,-6],[0,-12]],[[6428,5995],[1,7],[3,10],[4,5]],[[6436,6017],[3,-9]],[[6439,6008],[-11,-13]],[[6395,6005],[-1,0],[-3,3],[0,2],[2,0],[3,0],[0,-2],[0,-1],[-1,-2]],[[8581,4842],[7,19],[4,9]],[[8592,4870],[5,10],[4,10]],[[8601,4890],[44,-24],[16,-8],[10,-6]],[[8671,4852],[-9,-16],[-1,-2],[-5,-11],[-2,-4],[-4,-12]],[[8689,4788],[-8,-23],[-11,5],[-7,4],[-6,3],[-15,8]],[[8671,4852],[3,6]],[[8674,4858],[10,-6],[28,-14]],[[8674,4858],[6,12],[7,16],[9,24],[1,4]],[[8697,4914],[11,-6],[28,-15]],[[8601,4890],[7,18],[7,16],[5,12],[5,12],[1,3]],[[8626,4951],[34,-18]],[[8660,4933],[4,-2],[33,-17]],[[8660,4933],[10,25],[9,24]],[[8679,4982],[9,23]],[[8688,5005],[29,-15],[8,-5],[16,-8]],[[8626,4951],[-8,5],[-61,32]],[[8557,4988],[4,5],[7,19],[10,24]],[[8578,5036],[9,23]],[[8587,5059],[10,-5],[46,-24],[11,-7],[-9,-23],[34,-18]],[[8601,4890],[-42,22],[-23,12]],[[8536,4924],[3,10],[3,10]],[[8542,4944],[4,17],[10,24],[1,3]],[[8592,4870],[-62,34]],[[8530,4904],[3,10],[3,10]],[[8563,4793],[-11,5],[-40,20],[-9,5]],[[8503,4823],[9,26],[9,23],[6,21],[3,11]],[[8546,4747],[-11,6],[-39,20],[-10,4]],[[8486,4777],[7,20]],[[8493,4797],[10,26]],[[8538,4725],[-11,5],[-40,20],[-9,5]],[[8478,4755],[8,22]],[[8514,4660],[-12,6],[-38,19],[-10,5]],[[8454,4690],[8,23],[8,21]],[[8470,4734],[8,21]],[[8470,4734],[-11,5],[-45,23],[-13,6]],[[8401,4768],[7,21]],[[8408,4789],[13,-6],[45,-23],[12,-5]],[[8454,4690],[-12,6],[-5,2],[-37,18],[-13,7]],[[8387,4723],[7,24],[7,21]],[[8436,4644],[-10,5],[-42,21],[-12,6]],[[8372,4676],[7,25]],[[8379,4701],[8,22]],[[8454,4690],[-9,-22],[-9,-24]],[[8379,4701],[-74,37]],[[8305,4738],[8,22],[16,43]],[[8329,4803],[8,21]],[[8337,4824],[10,-4],[48,-24],[13,-7]],[[8337,4567],[-45,9]],[[8292,4576],[-1,13],[-2,30],[-2,38],[1,2],[0,6],[0,7],[-2,1],[0,5],[1,8],[1,5],[3,10],[5,12],[9,25]],[[8372,4676],[-3,-9],[-2,-6],[-3,-10],[-5,-15],[-9,-29],[-1,-3],[-8,-26],[-4,-11]],[[8436,4644],[-9,-24],[-5,-16],[-14,-38],[0,-2],[-3,-9]],[[8405,4555],[-3,1],[-65,11]],[[8378,4487],[-9,5],[-36,21],[-2,1],[-10,6]],[[8321,4520],[7,20],[7,20],[2,7]],[[8405,4555],[-3,-7],[-2,-2],[-8,-20],[-6,-17],[0,-3],[-8,-19]],[[8434,4454],[-9,5],[-6,4],[-34,19],[-7,5]],[[8405,4555],[65,-10]],[[8470,4545],[-5,-13],[-8,-20],[-8,-19]],[[8449,4493],[-8,-20],[-7,-19]],[[8524,4473],[-9,5],[0,-3],[-3,-7],[-4,-10],[-51,30],[-8,5]],[[8501,4414],[-12,7]],[[8489,4421],[-35,21],[-1,0],[-11,7],[-8,5]],[[8418,4414],[7,20],[9,20]],[[8489,4421],[-4,-10],[-4,-9],[0,-4],[-3,-7],[-4,-9],[-47,27],[-9,5]],[[8394,4366],[10,18],[7,14],[7,16]],[[8339,4404],[5,9],[6,10],[6,11],[5,14]],[[8361,4448],[8,-5],[14,-8],[18,-10],[8,-5],[9,-6]],[[8361,4448],[8,19],[9,20]],[[8361,4448],[-9,6],[-32,18],[-2,1],[-10,6]],[[8308,4479],[7,20],[6,21]],[[8295,4435],[6,21],[7,23]],[[4188,1444],[-4,25],[-6,25],[-4,24],[-5,31],[14,-2],[26,0],[17,-1],[24,-1]],[[4250,1545],[6,-30],[4,-19],[4,-18],[3,-17],[4,-17],[4,-17]],[[4275,1427],[-25,-1],[-17,0],[-21,-1],[-19,-5],[-5,24]],[[4296,1317],[4,-22],[6,-30]],[[4306,1265],[-4,2],[-4,2],[-5,2],[-12,4],[-9,2],[-4,0],[-6,1],[-8,36],[-19,-1],[-52,-3]],[[4183,1310],[-4,23],[-5,23],[-11,56]],[[4163,1412],[-5,24],[30,8]],[[4275,1427],[3,-18],[3,-17],[4,-19],[4,-19],[3,-17],[4,-20]],[[2744,974],[-8,32],[25,9],[9,3],[1,1],[2,1],[1,2],[4,8],[16,26],[16,30],[17,27],[-11,46],[0,1],[-1,1],[-1,0],[-20,-9],[-22,-10],[-25,-11],[-1,-1],[0,-1],[0,-1],[2,-10],[0,-1],[0,-1],[-11,-5],[-26,-12],[-21,-10],[-21,-10]],[[6481,5902],[-5,-12]],[[6476,5890],[-44,30],[-8,-14],[-4,-8],[-3,-9],[0,-1],[-1,-4],[-1,-3],[-5,-20],[36,-25],[4,-3]],[[6450,5833],[-10,-23],[-9,-19]],[[6431,5791],[-1,2],[-3,2],[-10,6],[-17,12],[-5,-15]],[[6326,5854],[2,3],[3,2],[2,1],[7,7],[2,7],[0,4],[6,8],[2,4],[3,3],[0,-4],[2,-5],[2,0],[1,2],[0,7],[1,6],[15,21],[8,11],[6,4],[7,3],[8,7],[6,5],[5,7],[6,11],[5,17],[3,10]],[[6439,6008],[33,-22]],[[6472,5986],[-6,-15],[28,-20],[3,-1],[-2,-7],[-5,-16],[-4,-11],[-5,-14]],[[6504,5963],[14,-11],[9,-7],[12,-4],[19,-13],[19,-15]],[[6577,5913],[-6,-12],[-11,-22],[-11,-23]],[[6549,5856],[-64,43],[-4,3]],[[6552,6028],[60,-67]],[[6612,5961],[-14,-17],[-2,-3],[-12,-18],[-7,-10]],[[6519,6027],[22,-23],[11,24]],[[6636,5872],[-22,15],[-37,26]],[[6612,5961],[58,-61]],[[6670,5900],[-6,-6],[-2,-2],[-3,-2],[-4,-3],[-2,-1],[-3,-1],[-9,-6],[-3,-3],[-2,-4]],[[6596,5793],[-9,6],[-16,12],[4,9],[-33,23],[7,13]],[[6636,5872],[-6,-12],[-11,-22]],[[6619,5838],[-12,-22],[-11,-23]],[[6714,5822],[4,-5],[6,-4],[7,-5],[11,-8],[11,-8]],[[6753,5792],[-1,-3],[-9,-16],[-8,-17]],[[6735,5756],[-9,5],[-46,32],[-3,3],[0,2],[-58,40]],[[6636,5872],[6,-6],[53,-34],[17,-13],[2,3]],[[6670,5900],[11,15],[7,7]],[[6688,5922],[38,-61],[5,-6],[5,-7]],[[6736,5848],[-9,-10],[-13,-16]],[[6688,5922],[13,11],[14,13]],[[6715,5946],[49,-74],[-15,-13],[-13,-11]],[[2102,1961],[17,11],[13,9],[12,10],[3,2],[1,1],[2,2]],[[2063,2107],[15,-34],[6,-11],[7,-11],[4,-5],[8,-10],[6,-7],[1,-2],[10,-9],[19,-14],[11,-8]],[[1983,2132],[10,12],[3,2],[3,0],[2,-1],[12,-27],[3,-6],[3,-4],[4,-4],[2,-5],[6,-14],[28,16],[1,3],[3,3]],[[2063,2107],[1,2],[10,4],[-9,19],[7,5],[7,3],[4,2]],[[2083,2142],[19,0],[9,-1],[0,-22],[7,0],[8,1],[7,3],[9,-19],[8,-18],[9,-19],[8,-20],[13,-19]],[[2083,2142],[0,20],[-9,0],[-11,25],[0,3],[7,18],[-14,8],[4,6],[7,15],[7,15],[6,12],[8,11],[7,9]],[[2095,2284],[10,-8],[2,-4],[3,-8],[13,-27],[17,10],[18,11],[18,11],[16,11],[17,11]],[[2209,2291],[11,-29]],[[2220,2262],[18,-51],[2,-5],[4,-4],[5,-4],[28,-16],[-2,-5],[-8,-23]],[[2063,2107],[-16,36],[-31,70],[-12,25],[-19,42]],[[1985,2280],[87,59],[28,17],[-14,41]],[[2086,2397],[5,19]],[[2091,2416],[6,-2],[3,-4],[23,-50],[-15,-9],[-9,-7],[-2,-2],[-1,-4],[-6,-22],[-3,-13],[0,-5],[1,-3],[7,-11]],[[1964,2154],[22,25],[-32,71],[3,1],[4,2],[4,0],[4,3],[19,11],[-5,11]],[[1983,2278],[2,2]],[[1955,2280],[7,-14],[21,12]],[[1932,2331],[2,1],[2,-5],[3,-3],[3,-1],[5,3],[2,1],[4,6],[1,2],[10,6],[6,1],[5,1],[5,7],[5,12],[-3,11],[3,12],[1,0],[3,2],[7,0],[4,1],[3,3],[1,2],[1,7],[-2,4],[1,6],[0,2],[0,21],[6,15],[5,9],[2,10],[0,18],[4,10],[3,19],[6,17],[5,22],[3,8]],[[2038,2561],[-2,-10],[21,-22],[2,-2]],[[2059,2527],[-5,-14],[-2,-5],[-9,-25],[-2,-6],[0,-2],[0,-6],[0,-6],[-1,-64]],[[2040,2399],[-2,-21],[-1,-7],[0,-5],[-2,-7],[-18,-20],[-11,-9],[-13,-10],[-6,-7],[-7,-13],[-2,-4],[6,-14],[1,-2]],[[2040,2399],[25,15],[9,6],[1,2]],[[2075,2422],[11,-25]],[[2059,2527],[3,8]],[[2095,2473],[-17,-24],[-8,-18],[5,-9]],[[2276,2393],[-37,17]],[[2239,2410],[1,8],[0,6],[0,5],[-2,6],[-2,6],[-7,17],[-2,1],[-2,-1],[-12,-6],[-7,19],[16,8],[-14,38],[-7,9],[-13,-14],[-12,-14],[-20,-22],[-15,19],[-15,-17],[-11,-16],[-9,-13]],[[2106,2449],[-9,-19],[-6,-14]],[[2239,2410],[-6,1],[-5,0],[-7,-1],[-5,-2],[-41,-21]],[[2175,2387],[-8,20],[-8,17],[-16,35],[-13,-18],[-12,-18],[-12,26]],[[2238,2271],[-18,-9]],[[2209,2291],[-15,32],[-4,5],[-6,4],[-7,4],[7,19],[4,11],[-6,5],[-3,6],[-4,10]],[[2299,2382],[-7,-19],[7,-18],[-10,-5],[-2,0],[-2,0],[-6,3],[-17,8],[-10,-29],[-26,-13],[-1,-3],[13,-35]],[[6797,5762],[-3,2]],[[6794,5764],[0,6],[1,5],[2,11],[1,6],[7,14],[10,17]],[[6815,5823],[10,19],[16,26],[-16,8],[-38,59]],[[6787,5935],[15,13]],[[6802,5948],[13,12],[14,12],[13,11],[-40,64]],[[6802,6047],[13,12],[15,12]],[[6830,6071],[41,35],[2,2]],[[6873,6108],[6,-9],[11,-16],[9,-14],[15,-24],[11,-17]],[[6925,6028],[2,-3],[2,-3]],[[6929,6022],[2,-3],[5,-7],[5,-5],[0,-1],[5,-5]],[[7185,6081],[-18,13],[-11,-15],[-4,0],[-32,23],[-11,-19],[-6,4]],[[7103,6087],[-16,11],[-5,-8],[-2,-2],[-8,-19],[-6,-18]],[[6929,6022],[120,237],[5,10],[7,13]],[[7061,6282],[12,24]],[[7159,6046],[-18,13],[-9,-18],[-9,-15],[-4,-1],[-30,23],[-1,1],[0,2],[0,2],[5,16],[10,18]],[[7061,6282],[-4,5],[-18,26],[-36,57]],[[7003,6370],[15,13],[17,13],[-36,57]],[[6999,6453],[16,13],[10,9],[14,13]],[[7039,6488],[14,11]],[[7053,6499],[36,-56],[26,-41],[3,-9]],[[7003,6370],[-35,56]],[[6968,6426],[15,13],[16,14]],[[4901,1424],[11,-63]],[[4912,1361],[-19,-5],[7,-49],[5,-28]],[[4833,1264],[-5,30]],[[4828,1294],[-3,22],[-3,17],[-2,4],[-2,2],[2,0],[2,1],[2,2],[4,10],[5,7],[7,5],[3,2],[1,2],[0,1],[-1,3],[0,1],[-1,2],[-4,0],[-3,2],[-4,3],[-2,5],[-3,8],[-3,13]],[[4823,1406],[-2,17],[0,8],[2,5],[2,4],[4,3],[4,-1],[3,-2],[3,-3],[2,-6],[5,-20],[19,5],[17,4],[19,4]],[[4731,1222],[-6,45],[0,3],[-1,2],[1,5],[-3,22]],[[4722,1299],[31,-3],[20,-2],[4,0],[24,-2],[14,0],[13,2]],[[4722,1299],[-2,19],[-10,64]],[[4710,1382],[31,6],[25,6],[39,8],[18,4]],[[4892,1481],[9,-57]],[[4710,1382],[-4,27],[-3,26],[-3,20],[0,5],[1,7],[1,1],[2,4],[6,7]],[[4710,1479],[3,3],[2,1],[2,2],[1,0],[8,5],[6,3],[13,6],[20,8],[12,3],[14,1],[7,0],[8,0],[4,-1],[4,0],[4,-2],[25,-9],[5,-1],[24,-9],[20,-8]],[[4710,1382],[-3,-1],[-60,-10],[-10,3],[-20,8],[-19,7],[-4,22],[-4,21],[-4,23],[-34,10],[4,-23],[4,-21],[3,-21]],[[4563,1400],[-33,10]],[[4530,1410],[-7,46],[-5,24],[-8,49],[-2,1],[-4,0],[-20,4],[-36,5],[-51,2]],[[4397,1541],[-96,3]],[[4301,1544],[-16,0],[-35,1]],[[4250,1545],[-1,6],[-1,5],[-1,5],[-3,13]],[[4689,1559],[-1,-3],[0,-4],[-1,-5],[0,-3],[0,-2],[0,-4],[0,-2],[1,-4],[0,-3],[1,-3],[1,-2],[1,-2],[1,-1],[1,-2],[1,-2],[1,-1],[3,-2],[3,-1],[4,-3],[4,-2],[3,-2],[1,-1],[1,-1],[1,-2],[0,-1],[1,-2],[0,-1],[1,-1],[0,-1],[0,-1],[0,-1],[0,-2],[0,-1],[-1,-2],[0,-1],[-1,-3],[-1,-1],[-2,-2],[-2,-3]],[[4722,1299],[-3,0],[-26,2]],[[4693,1301],[-26,2]],[[4667,1303],[-20,2],[-14,2],[-24,2]],[[4609,1309],[-31,2],[0,4],[-3,18],[-3,23],[-4,20],[-5,24]],[[4609,1309],[-1,-3],[13,-78],[1,-3],[0,-5]],[[4622,1220],[-16,9],[-3,2],[-5,2],[-5,2],[-17,7],[-4,1],[-7,3],[-5,1],[-3,1],[-3,1],[-5,0],[-5,0],[-25,-5]],[[4519,1244],[-4,25],[-1,1],[-2,1],[1,5],[-8,41],[-8,49],[-8,48]],[[4489,1414],[17,4],[4,-2],[17,-5],[3,-1]],[[4731,1222],[-13,-1],[-12,-3],[-11,-2],[-12,-1],[-11,-2],[-6,0],[-6,0],[-10,1],[-6,0],[-7,1],[-6,1],[-4,2],[-5,2]],[[4667,1303],[9,-44],[1,-2],[2,-1],[19,3],[2,4],[-7,38]],[[4741,1173],[-2,1],[-3,1],[-1,2],[1,5],[2,12],[-1,2],[-1,2],[-3,-1],[0,-7],[-11,-1],[-7,-1],[-12,-2],[-6,-2],[-9,0],[-16,2],[-14,6],[-18,-2],[-7,-3],[-2,0],[-5,-1],[-7,-6],[-7,-9],[-7,-7],[-7,-3],[-16,-4],[-4,-3],[-3,-8],[-7,-11],[-3,-9],[-5,-4],[-8,-5],[-6,-6],[-4,1],[-2,1],[-2,6],[0,14],[-1,6],[-3,6],[-5,8],[-4,7],[-10,9],[-12,8],[-10,4],[-4,2],[-7,1],[-6,-1],[-4,0],[-5,0],[-5,5],[-3,-3],[-4,-5],[-5,-7],[-7,-15],[-1,-1],[-2,-6],[-2,-1],[-9,-19],[12,-21],[44,-7],[0,-3],[-1,-3],[-38,5],[-1,0],[-6,2],[-13,24],[-11,14],[-9,18],[-9,13],[-6,10],[-9,12],[-7,6],[-4,12],[-3,6],[-3,1],[-10,2],[-16,8],[-27,9]],[[4312,1239],[-6,26]],[[4306,1265],[18,-14],[7,-4],[13,-9],[8,-6],[7,-5],[5,-3],[4,-2],[5,-1],[5,-1],[7,0],[21,5],[6,1],[9,0],[8,0],[7,-1],[5,0],[6,0],[7,0],[5,-1],[4,1],[7,1],[8,2],[4,1],[12,5],[18,8],[3,1],[4,1]],[[4296,1317],[19,1],[17,1],[-2,2],[0,2],[-6,22],[-3,18],[-4,19],[-4,18],[-4,18],[-3,16],[13,2],[6,0]],[[4325,1436],[30,-8],[46,-11]],[[4401,1417],[48,-12],[12,2],[2,0],[24,6],[2,1]],[[4401,1417],[0,6],[-1,6],[-1,5],[3,2],[5,2],[6,1],[5,-2],[7,-1],[8,1],[-4,28],[-5,32],[-2,1],[-1,0],[-1,0],[-3,-1],[-3,0],[-18,8],[1,5]],[[4397,1510],[2,8],[-2,23]],[[4325,1436],[2,8],[-13,63],[-1,6]],[[4313,1513],[84,-3]],[[4313,1513],[-4,4],[-3,2],[-2,7],[-3,18]],[[6550,5222],[6,-1]],[[6545,5191],[-1,-4],[-7,-22]],[[6537,5165],[-5,3],[-42,20],[-4,-12],[-4,-11],[-4,-11],[-4,-11]],[[6474,5143],[-61,30]],[[6413,5173],[4,11],[4,11]],[[6421,5195],[4,11],[4,11],[8,24],[9,25]],[[6446,5266],[61,-31],[9,-4],[16,-8],[18,-1]],[[6446,5266],[-52,25],[-10,4]],[[6384,5295],[8,23],[8,21],[8,23]],[[6408,5362],[9,-5],[13,-6],[19,-9],[20,-9],[42,-21]],[[6511,5312],[-8,-22],[20,-10],[21,-10]],[[6544,5270],[18,-9],[-7,-22],[-5,-17]],[[6511,5312],[19,57]],[[6530,5369],[10,-7],[9,-6]],[[6549,5356],[10,-8],[10,-5],[-4,-13],[-9,-22],[-5,-15],[-7,-23]],[[6549,5356],[14,41],[8,24],[1,4]],[[6572,5425],[44,-32]],[[4088,1402],[18,2],[19,2],[18,2],[9,2],[11,2]],[[4183,1310],[1,-6],[4,-17],[4,-24],[-9,0],[-4,0],[-3,1],[-7,4],[-25,18],[-3,1],[-3,1],[-3,1],[-3,0],[-10,-2],[-18,-4],[-7,-1],[-5,-2],[-6,30],[-3,0],[-12,6],[-12,8],[-3,4],[-6,31],[-2,6],[1,4],[3,8],[7,10],[5,6],[3,3],[1,4],[4,-1],[9,2],[7,1]],[[6794,5764],[-10,7],[-16,11],[-15,10]],[[6715,5946],[13,12]],[[6728,5958],[31,-47]],[[6759,5911],[18,-28],[38,-60]],[[6759,5911],[13,12],[15,12]],[[6728,5958],[3,15],[1,6],[0,6],[14,14],[15,12]],[[6761,6011],[41,-63]],[[6761,6011],[13,12],[14,12]],[[6788,6035],[14,12]],[[6761,6011],[-41,64]],[[6720,6075],[14,11],[13,12]],[[6747,6098],[41,-63]],[[6747,6098],[15,12],[13,12],[14,14]],[[6789,6136],[10,-17],[10,-14],[9,-15],[12,-19]],[[6747,6098],[-17,28],[13,12],[-5,8],[-13,-11],[-18,27]],[[6707,6162],[14,12],[13,11]],[[6734,6185],[15,13]],[[6749,6198],[40,-62]],[[6720,6075],[-14,-13]],[[6706,6062],[-41,63]],[[6665,6125],[15,13],[13,12],[14,12]],[[6665,6125],[-40,64]],[[6625,6189],[15,12],[13,12],[13,12]],[[6666,6225],[41,-63]],[[6666,6225],[14,12]],[[6680,6237],[14,12]],[[6694,6249],[40,-64]],[[6694,6249],[14,12]],[[6708,6261],[16,15],[-13,21],[24,21],[3,2]],[[6738,6320],[14,-21],[24,-38]],[[6776,6261],[16,-26]],[[6792,6235],[-2,-2],[-25,-21],[-16,-14]],[[6680,6237],[-54,86]],[[6626,6323],[9,18]],[[6635,6341],[9,20]],[[6644,6361],[36,-56],[28,-44]],[[6644,6361],[4,7],[9,17],[10,23],[5,9],[2,5]],[[6674,6422],[26,-42]],[[6700,6380],[38,-60]],[[6635,6341],[-3,5],[-40,61]],[[6635,6480],[1,-2],[2,-3],[2,-3],[3,-3],[2,-3],[2,-4],[2,-3],[2,-3],[2,-3],[2,-3],[2,-3],[2,-4],[1,-2],[4,-6],[5,-4],[3,-5],[2,-4]],[[6607,6285],[-3,5],[-44,67]],[[6626,6323],[-10,-19],[-9,-19]],[[6587,6247],[-9,-20]],[[6578,6227],[-3,5],[-35,54]],[[6607,6285],[-9,-18],[-11,-20]],[[6625,6189],[-34,52],[-4,6]],[[6635,6101],[-66,106]],[[6569,6207],[9,20]],[[6665,6125],[-14,-13],[-7,-4],[-9,-7]],[[6608,6078],[-13,-12]],[[6595,6066],[-43,68],[-5,7]],[[6547,6141],[7,22],[8,23],[7,21]],[[6635,6101],[-12,-11],[-15,-12]],[[6547,6141],[-3,5],[-40,60],[-3,2]],[[6532,6080],[-3,5],[-40,62]],[[6547,6141],[-7,-31],[-8,-30]],[[6436,6017],[3,3],[0,21],[3,8],[3,12],[5,15],[0,3],[-16,42],[-11,-5],[-6,-1],[-2,0],[0,3],[0,3],[4,2],[3,1],[0,3],[1,1],[5,2],[0,3],[-2,1],[-1,0],[8,2],[3,-5],[6,-19],[5,-7],[4,-5],[3,-3],[2,3],[5,20],[1,1],[5,8],[1,5],[1,13],[3,17]],[[6489,6147],[-3,-14],[-1,-8],[0,-5],[1,-5],[1,-5],[2,-11],[2,-12]],[[6532,6080],[-13,-53]],[[7070,3733],[37,-28]],[[7035,3759],[6,11],[13,26]],[[7054,3796],[34,-27],[13,23],[37,-27]],[[7054,3796],[13,22],[3,6],[7,6],[8,4],[27,-21],[13,23]],[[7125,3836],[37,-27]],[[6988,3793],[6,13],[4,10],[16,40],[18,34],[1,2]],[[7033,3892],[2,-1],[3,-1],[2,0],[7,-2],[17,-9],[14,-7],[9,-7],[3,-3],[3,-2],[32,-24]],[[6403,5730],[-8,-18]],[[6395,5712],[-10,8],[-9,6],[-11,7],[-10,7]],[[6431,5791],[-10,-23],[-9,-20],[-9,-18]],[[6595,6066],[-17,-15],[-17,-15],[-9,-8]],[[6608,6078],[45,-70]],[[6653,6008],[-13,-12],[-14,-17],[-14,-18]],[[6667,6020],[-14,-12]],[[6706,6062],[-15,-13],[-8,-6],[-6,-5],[4,-6],[-14,-12]],[[6667,6020],[48,-74]],[[6733,6691],[-3,3],[-34,53],[-3,3],[-1,-26],[-1,-9],[-3,-13],[-6,-16],[1,-3],[0,-2],[-4,-11],[-3,-11],[-2,-2],[9,-14],[19,-30]],[[6702,6613],[-5,-8],[-17,-25]],[[6680,6580],[-4,-5],[-6,-8],[-3,-6],[-1,-3],[-2,-3],[-5,-10],[-3,-7],[-7,-18],[-6,-18],[-8,-21],[0,-1]],[[6618,6498],[1,2],[2,5],[4,11],[8,30],[9,23],[7,16],[3,9],[0,13],[2,8],[0,2],[2,8],[1,16],[3,9],[7,20],[4,15],[2,5],[4,7],[2,6],[4,9],[2,9],[2,15],[2,8],[1,10],[1,7],[4,10],[1,7],[7,20],[4,8],[7,24],[1,4]],[[6715,6834],[4,-9],[2,-4],[29,-45]],[[6750,6776],[-4,-31],[-1,-8],[-2,-14],[-2,-12],[-2,-7],[-6,-13]],[[6680,6580],[36,-55],[2,-5],[2,-8]],[[6720,6512],[-2,-3],[-11,-21]],[[6707,6488],[-8,-16],[-8,-16],[-8,-16],[-9,-18]],[[6733,6538],[-13,-26]],[[6702,6613],[8,14]],[[6710,6627],[9,-6],[2,-3],[25,-37],[4,-5],[-6,-14],[-11,-24]],[[6836,6486],[37,-55]],[[6873,6431],[-15,-14],[-23,-18],[-29,-21]],[[6806,6378],[-11,18],[-10,15],[-16,25]],[[6769,6436],[-45,71],[-4,5]],[[6733,6538],[16,20],[6,8],[4,4]],[[6759,6570],[26,-40],[17,-26],[20,-30],[14,12]],[[6769,6436],[-14,-8],[-5,-5]],[[6750,6423],[-43,65]],[[6750,6423],[-13,-10],[-11,-11],[-12,-10],[-14,-12]],[[6806,6378],[-19,-15],[-23,-20],[-12,-10],[-14,-13]],[[6806,6378],[38,-58]],[[6844,6320],[-19,-16],[-12,-11],[-12,-10],[-12,-9],[-13,-13]],[[6804,6217],[-12,18]],[[6844,6320],[38,-58]],[[6882,6262],[-19,-17]],[[6863,6245],[-12,-11],[-12,-10],[-10,16],[-11,-11],[-14,-12]],[[6908,6285],[-26,-23]],[[6844,6320],[27,22],[24,19]],[[6895,6361],[35,-56]],[[6930,6305],[-22,-20]],[[6919,6203],[-18,-18]],[[6901,6185],[-38,60]],[[6908,6285],[27,-43],[10,-15],[-26,-24]],[[6925,6028],[18,34],[-19,28],[-9,15]],[[6915,6105],[12,11],[11,10],[20,17],[-39,60]],[[6930,6305],[15,14],[16,13]],[[6961,6332],[14,11],[14,14],[14,13]],[[6915,6105],[-10,16],[-19,29],[-9,15],[12,10],[12,10]],[[6873,6108],[-12,20],[-10,15],[-18,29]],[[6833,6172],[-9,14],[-10,15],[-10,16]],[[6789,6136],[17,13],[24,20],[3,3]],[[7603,3852],[-6,4],[-6,5],[-1,4],[-9,7],[-9,6],[-8,6],[-9,7]],[[7555,3891],[-90,65]],[[7465,3956],[6,12],[7,13]],[[7454,3935],[11,21]],[[7555,3891],[-11,-23]],[[7544,3868],[-90,67]],[[7513,3814],[-20,15],[-11,2],[-22,17]],[[7460,3848],[10,21],[10,18],[-38,27]],[[7442,3914],[12,21]],[[7544,3868],[-12,-19]],[[7532,3849],[-10,-18],[-9,-17]],[[7460,3848],[-38,27]],[[7377,3964],[65,-50]],[[7388,3983],[66,-48]],[[7388,3983],[11,22]],[[7399,4005],[66,-49]],[[7412,4029],[66,-48]],[[7424,4053],[6,-5],[48,-35],[13,-9]],[[7435,4072],[65,-50]],[[4312,1239],[-1,0],[-57,11],[-13,1],[-5,-6],[-13,-39],[-2,-7],[-1,-2],[-3,4],[-3,14],[-2,5],[-10,14],[-6,5],[-23,18],[-7,8],[-5,3],[-6,8],[-8,4],[-5,0],[-4,4],[-3,0],[-3,-2],[-3,-2],[-8,0],[-2,-1],[-7,-1],[-5,-2],[-5,-4],[-4,0],[-7,0],[-6,-2],[-5,-3],[-2,-3],[2,-7],[0,-2],[-3,-3],[-11,-5],[-10,-8],[-3,-5],[-7,1],[-8,-1],[-2,0],[-4,3],[0,6],[0,27],[-3,13],[-2,21],[-1,5],[-4,23],[-3,9],[-5,14],[-1,0],[-14,19],[-1,1],[-23,27],[-9,7],[-7,10],[-7,12],[-2,0]],[[3948,1440],[2,-3],[4,-4],[21,-20],[8,-7],[6,-7],[7,-9],[14,-15],[2,2],[2,3],[2,3],[1,2],[2,5],[2,6],[-1,3],[2,4],[3,5],[3,5],[4,4],[5,4],[2,2],[-1,5],[-3,10],[0,9],[2,11],[3,8],[4,5],[6,8],[1,1],[1,3]],[[4052,1483],[2,1],[17,6],[17,-88]],[[4052,1483],[-4,3],[-6,1],[-9,5],[-8,6],[-5,3],[-8,45],[1,4],[-2,2],[-18,1],[-6,2],[-10,0],[-24,1],[-7,-2],[-1,0],[-1,0],[-21,-4]],[[3923,1550],[-2,6],[-5,-1],[0,1],[3,4],[0,1],[1,2],[1,2]],[[3921,1565],[0,2],[0,3],[0,4],[0,2],[-1,3],[-1,3],[-1,2]],[[3948,1440],[-25,110]],[[3729,1529],[-4,21],[-26,1],[0,4],[0,4],[19,3],[2,0],[14,2],[7,1],[14,2],[16,1],[11,0],[10,1],[15,0],[11,0],[25,-1],[19,-1],[22,0],[21,-1],[16,-1]],[[3621,1569],[-26,106]],[[3595,1675],[17,7],[6,2],[35,32],[11,3],[19,6]],[[3683,1725],[14,6],[7,5]],[[3469,1599],[23,8],[8,2],[9,8],[18,16],[18,16],[18,16]],[[3563,1665],[5,2],[27,8]],[[3422,1793],[20,17]],[[3442,1810],[6,-24],[16,6],[21,18],[12,10],[3,1],[2,-1],[2,-1],[7,-29],[17,6],[3,3],[32,-134]],[[3627,1871],[19,-76],[19,6]],[[3665,1801],[18,-76]],[[3442,1810],[21,18],[32,27],[24,20],[24,20]],[[3543,1895],[15,-61],[37,13],[4,3],[9,14],[19,7]],[[3342,1727],[-17,28],[-17,29],[29,25],[-14,26],[-12,19]],[[3311,1854],[17,14],[10,-18],[3,0],[16,12],[46,38],[14,12],[1,4],[-11,18],[17,14]],[[3424,1948],[11,-18],[2,0],[16,13],[16,14],[17,14],[7,6],[10,9],[17,14],[17,13]],[[3537,2013],[16,-26],[37,-59]],[[3590,1928],[-26,-22],[-6,-3],[-9,-4],[-6,-4]],[[3627,1871],[-7,29],[0,3],[2,2],[5,1],[13,3],[9,4],[2,2],[3,3],[1,4],[5,1],[0,3],[0,5],[1,4],[3,4],[5,3],[10,2],[2,-7]],[[3681,1937],[23,-101]],[[3704,1836],[-18,-23],[-6,-6],[-15,-6]],[[3703,1998],[-22,-18],[-5,-2],[-16,-5],[-14,-4],[-10,-3],[-12,-5],[-2,-2],[-6,-5],[-6,-5],[-5,-6],[-4,-6],[-11,-9]],[[3537,2013],[-33,54],[-5,8]],[[3499,2075],[3,2],[14,12],[20,-33],[2,0],[14,12],[13,10],[1,2],[0,3],[-19,31],[16,13]],[[3499,2075],[-23,38]],[[3476,2113],[-8,15],[-6,14]],[[6656,4951],[63,-30]],[[6488,5030],[9,25],[21,60],[3,7],[16,43]],[[6961,6332],[-36,56]],[[6925,6388],[14,12],[15,13],[14,13]],[[6925,6388],[-37,56]],[[6888,6444],[15,13],[14,12],[15,13]],[[6932,6482],[36,-56]],[[6932,6482],[15,13],[17,14],[16,14],[9,9],[14,12]],[[7003,6544],[36,-56]],[[7033,3892],[1,3]],[[7034,3895],[1,1],[76,130]],[[7111,4026],[9,14]],[[7173,3925],[-12,-22],[-13,-23]],[[7148,3880],[-11,-22],[-12,-22]],[[7148,3880],[37,-27]],[[7185,3853],[-11,-21],[-12,-23]],[[7209,3897],[-12,-22],[-12,-22]],[[7209,3897],[57,-43]],[[7295,3910],[-17,-32],[-12,-24]],[[6932,6482],[-36,56]],[[6896,6538],[16,14],[16,14],[15,13]],[[6943,6579],[11,9],[6,7],[7,6]],[[6967,6601],[36,-57]],[[6967,6601],[14,12]],[[6981,6613],[15,13],[14,12],[14,13]],[[7024,6651],[37,-57]],[[7061,6594],[-15,-13],[-14,-12],[-14,-13],[-15,-12]],[[6943,6579],[-35,57]],[[6908,6636],[10,9],[13,12],[-7,11]],[[6924,6668],[17,9]],[[6941,6677],[40,-64]],[[6941,6677],[15,9],[17,9],[17,9]],[[6990,6704],[12,-18],[10,-16]],[[7012,6670],[12,-19]],[[6990,6704],[27,16],[21,11],[2,1]],[[7040,6732],[12,7]],[[7052,6739],[13,-22]],[[7065,6717],[-29,-26],[-24,-21]],[[7114,6640],[-28,-25],[-25,-21]],[[7065,6717],[13,-20]],[[7078,6697],[-14,-13],[20,-33],[3,-1],[13,12],[14,-22]],[[7162,6681],[-48,-41]],[[7078,6697],[20,15],[16,11],[18,-30],[4,-1],[12,11],[14,-22]],[[7180,6696],[-2,-2],[-5,-4],[-11,-9]],[[7052,6739],[44,25],[27,15],[3,1]],[[7126,6780],[7,-11],[14,-22],[33,-51]],[[7040,6732],[-1,4],[-9,20],[-2,4],[38,32]],[[7066,6792],[4,-6],[1,-1],[9,0],[2,1],[8,7],[15,13],[2,2]],[[7107,6808],[16,-24],[3,-4]],[[7066,6792],[-12,19]],[[7054,6811],[-11,18],[15,13],[-6,9]],[[7052,6851],[16,14],[2,2]],[[7070,6867],[37,-59]],[[7133,6876],[11,-18],[14,-21]],[[7158,6837],[16,-26],[2,-3]],[[7176,6808],[-23,-13],[-16,-9],[-11,-6]],[[7070,6867],[-16,25]],[[7054,6892],[15,13]],[[7069,6905],[12,-18],[12,-18],[11,-18],[29,25]],[[7069,6905],[-11,18],[28,25]],[[7086,6948],[9,-14],[3,-4]],[[7098,6930],[11,-18],[12,-18]],[[7121,6894],[12,-18]],[[7121,6894],[15,13],[13,11]],[[7149,6918],[41,-63]],[[7190,6855],[-16,-9],[-16,-9]],[[7098,6930],[15,12],[14,13]],[[7127,6955],[14,12],[23,-36],[-15,-13]],[[7220,6935],[11,-17]],[[7231,6918],[11,-17],[10,-15]],[[7252,6886],[-44,-22],[-18,-9]],[[7127,6955],[-37,56]],[[7090,7011],[14,13],[25,20]],[[7129,7044],[55,-86],[22,-34],[14,11]],[[7129,7044],[13,11]],[[7142,7055],[12,-18],[11,-17]],[[7165,7020],[10,-16],[11,-17]],[[7186,6987],[11,-17]],[[7197,6970],[12,-18]],[[7209,6952],[11,-17]],[[7247,7038],[-61,-51]],[[7165,7020],[34,30],[13,12]],[[7212,7062],[12,11],[12,-18],[11,-17]],[[7247,7038],[22,20],[2,2]],[[7271,7060],[11,-17]],[[7282,7043],[-2,-2],[-83,-71]],[[7287,6993],[-9,16],[-1,0],[-1,1],[-1,0],[-1,-1],[-65,-57]],[[7282,7043],[22,-34]],[[7304,7009],[-2,-3],[-15,-13]],[[7254,6938],[-23,-20]],[[7287,6993],[-14,-11],[-15,-13],[-15,-13],[11,-18]],[[7278,6900],[-2,3],[-11,17],[-11,18]],[[7287,6993],[41,-62],[-1,-4],[-15,-7],[-17,-9],[-17,-11]],[[7304,7009],[47,-72]],[[7351,6937],[13,-21],[3,-4]],[[7367,6912],[-4,-1],[-4,-2],[-29,-16],[-37,-20],[-2,4],[-12,21],[-1,2]],[[7304,7009],[16,13],[46,-72],[-15,-13]],[[7749,3826],[-13,-26]],[[7736,3800],[-12,9],[-19,14],[-22,15],[-9,8]],[[7688,3870],[9,-7],[41,-29],[11,-8]],[[7726,3783],[-8,7],[-17,12],[-8,-1],[-31,22]],[[7700,3892],[9,-7],[41,-29],[11,-9]],[[7761,3847],[-12,-21]],[[7713,3916],[9,-7],[41,-30],[10,-8]],[[7773,3871],[-10,-18],[-2,-6]],[[7735,3956],[19,-15],[31,-23],[9,-7]],[[7794,3911],[-1,-3],[-8,-15],[-12,-22]],[[7804,3927],[-10,-16]],[[7754,3989],[49,-37]],[[7803,3952],[-9,-17],[10,-8]],[[7773,4024],[30,-23],[19,-15],[-9,-17],[-5,-8],[-5,-9]],[[7805,4083],[22,-17]],[[7864,4039],[-6,-12],[-5,-8],[-8,-16]],[[7845,4003],[-8,-15],[-5,-9],[-3,-6],[-7,-11],[-2,-4]],[[7820,3958],[-7,-14],[-1,-2],[-4,-7],[-4,-8]],[[7989,7819],[7,9],[8,7],[-25,39]],[[7979,7874],[12,16],[13,18],[-12,20],[-2,2]],[[7990,7930],[34,44]],[[8024,7974],[2,-3],[13,-19],[-5,-8],[9,-15],[0,-5],[-2,-5],[-8,-8],[-1,-2],[1,-4],[20,-29]],[[8053,7876],[-18,-15],[7,-11],[-16,-14],[22,-35],[0,-2],[0,-1],[-11,-15],[-13,-15],[-9,14],[-20,-24],[-2,-1],[-2,2],[-9,14],[0,2],[1,3],[19,24],[-6,10],[-7,7]],[[8024,7974],[33,41],[2,3]],[[8059,8018],[2,-3],[9,-14],[4,-6],[5,-8],[10,-19],[9,-19],[2,-3]],[[8100,7946],[-3,-3],[2,-3],[9,-15],[-18,-15],[-16,-15],[-21,-19]],[[7990,7930],[-13,20],[-24,38]],[[7953,7988],[-20,32]],[[7933,8020],[15,12],[12,11],[13,11],[14,12],[23,20],[3,3]],[[8013,8089],[2,-3],[10,-16],[8,-12],[12,-19],[9,-14],[5,-7]],[[7990,7930],[-73,-91]],[[7870,7913],[19,16],[11,15],[6,5],[17,13],[14,13],[16,13]],[[7816,7998],[20,16],[24,22],[9,11],[12,17],[13,18]],[[7894,8082],[39,-62]],[[7803,8020],[17,15],[17,15],[7,7],[7,7],[5,7],[11,15]],[[7867,8086],[12,18]],[[7879,8104],[15,-22]],[[7879,8104],[22,31],[10,14],[12,17],[17,24],[2,3],[2,3]],[[7944,8196],[19,-29],[3,-6],[11,-17],[10,-15],[4,-7],[13,-20],[9,-13]],[[7879,8104],[-2,4],[-3,5],[-13,20]],[[7861,8133],[11,10],[4,5],[5,6],[1,4],[-10,15],[-2,3],[-1,2],[-11,17],[5,3],[11,10],[13,12],[-47,75]],[[7840,8295],[22,27]],[[7862,8322],[11,-18],[3,-4],[10,-16],[3,-4],[11,-16],[2,-5],[11,-17],[8,-9],[19,-30],[2,-4],[2,-3]],[[7861,8133],[-29,45],[-12,20],[-1,1],[-16,26],[-14,20]],[[7789,8245],[24,24],[14,11],[13,15]],[[7867,8086],[-3,3],[-8,12],[-14,-12],[-15,-12],[-14,22],[-11,18],[-13,21]],[[7789,8138],[5,8],[7,7],[15,12],[-22,34],[-20,31]],[[7774,8230],[15,15]],[[7719,8067],[-12,19],[-18,28],[14,14],[-14,20],[9,10],[11,10],[25,19],[7,7],[5,5],[15,16],[13,15]],[[7789,8138],[-11,-15],[-6,-9],[-7,-8],[-15,-12],[-15,-13],[-16,-14]],[[1401,355],[2,-11],[4,-16],[-6,-3],[-5,-3],[-5,-2],[-8,-4],[-15,-7],[-6,-2],[-9,-4],[-11,-7],[-4,-3],[-7,-4],[-4,-2],[-8,-5],[-10,-5],[-6,-4],[-7,-6],[-4,-2],[-6,-5],[-4,-4],[-6,-3],[-10,-5],[-13,-7],[-2,-2],[-35,-25],[-2,2],[1,10],[-2,22],[-2,34]],[[1211,282],[-7,103],[-3,32],[36,4],[9,2],[3,1],[3,2],[2,1],[2,3],[4,8],[3,7],[3,3],[9,5]],[[1376,513],[6,-34],[1,-20],[1,-10],[1,-7],[1,-8],[2,-7],[3,-12],[7,3],[3,2],[-2,-18],[-2,-16],[0,-6],[3,-18],[1,-7]],[[7664,7713],[-3,-3],[-17,-14]],[[7644,7696],[-35,54],[-8,13],[-2,2],[-2,-1],[-26,-23],[-13,-11],[-1,-4],[0,-3],[7,-11],[-16,-14]],[[7548,7698],[-22,34],[21,18],[1,2],[2,1],[18,16],[2,3],[-1,3],[-18,29],[-3,4],[-16,-14]],[[7577,7652],[-29,46]],[[7644,7696],[-15,-14]],[[7629,7682],[-13,-11],[-6,-3],[-14,-7],[-19,-9]],[[7560,7638],[13,11],[4,3]],[[7629,7682],[12,-18],[13,-22],[10,-14],[1,-4],[-2,-2],[-26,-25]],[[7637,7597],[-16,-14],[-16,-14],[-45,69]],[[7650,7576],[-13,21]],[[7664,7713],[35,-54]],[[7699,7659],[-4,-3],[-16,-14],[12,-19],[-22,-26],[-19,-21]],[[7765,7647],[-32,-41]],[[7733,7606],[-34,53]],[[7679,7533],[-2,2],[-14,22],[-13,19]],[[7733,7606],[1,-3]],[[7734,7603],[-2,-3],[-16,-20],[-9,-11]],[[7707,7569],[-26,-33],[-2,-3]],[[7713,8005],[-20,31],[0,6],[4,5],[22,20]],[[7540,8005],[7,8],[2,2],[11,13],[10,10],[22,24],[2,2],[2,3],[4,5],[13,13],[1,10],[5,8],[11,4],[5,0],[6,6],[2,5],[8,9],[15,21],[3,3],[2,6],[7,9],[9,1],[15,20],[19,27],[3,2],[2,2],[4,5],[4,9],[5,3],[6,3],[21,22],[7,8],[28,24],[15,11],[8,7],[10,8],[4,4],[6,7],[4,6]],[[6790,4231],[-7,-19],[-6,-17]],[[6777,4195],[-8,4],[-44,22],[-9,4]],[[6716,4225],[6,17]],[[6722,4242],[6,16],[27,-12],[8,-1],[19,-10],[8,-4]],[[6777,4195],[-5,-15]],[[6772,4180],[-53,25],[-8,5]],[[6711,4210],[5,15]],[[6766,4164],[-7,3],[-45,22],[-9,4]],[[6705,4193],[6,17]],[[6772,4180],[-6,-16]],[[6711,4210],[-62,29]],[[6649,4239],[5,15]],[[6654,4254],[7,17]],[[6661,4271],[61,-29]],[[6649,4239],[-58,28],[5,16]],[[6596,4283],[58,-29]],[[6594,4303],[58,-28],[9,-4]],[[6596,4283],[-8,4],[4,12],[2,4]],[[6666,4288],[-5,-17]],[[6594,4303],[-9,5],[-3,1],[-5,3],[-2,-3],[-2,-6],[-2,-6],[-1,-3],[-1,-5],[1,-4],[1,-5],[6,-18],[0,-4]],[[6577,4258],[-2,-3],[-2,-5],[-4,-1],[-4,-1],[-4,-3],[-5,-1],[-4,-2],[-1,0],[-1,0],[-3,0],[-3,1],[-1,1]],[[6592,4365],[2,-1],[3,-1]],[[6597,4363],[-3,-8]],[[6594,4355],[-2,-3],[-3,-5],[-7,-18],[6,-3],[78,-38]],[[6649,4239],[-6,-16]],[[6643,4223],[-56,26],[-4,3],[-4,3],[-2,3]],[[6705,4193],[-14,7],[-48,23]],[[6766,4164],[10,-5],[53,-26]],[[6829,4133],[62,-30]],[[6891,4103],[-1,-4],[-43,21],[-1,-4]],[[6846,4116],[-20,10],[-20,9]],[[6806,4135],[-19,9],[-20,10],[-20,9]],[[6747,4163],[-20,10],[-19,10],[-20,9],[-18,-50],[-7,-23],[-14,-39]],[[6649,4080],[-19,9],[-19,9],[-18,9],[-19,8],[-40,20]],[[6626,4014],[5,17],[17,46],[1,3]],[[6747,4163],[-17,-50],[-5,-13],[-17,-48],[-1,-3],[-18,-51],[-5,-13]],[[6684,3985],[-7,2],[-15,4],[-10,4],[-10,6],[-5,2],[-2,2],[-3,3],[-4,3],[-1,2],[-1,1]],[[6744,3958],[-11,5],[-8,5],[-3,2],[-13,10],[-2,2],[-1,2],[-22,1]],[[6806,4135],[-16,-46],[-15,-40],[-9,-25],[-1,-3],[-17,-51],[-4,-12]],[[8952,8419],[-76,-62],[-71,-58],[-6,-5],[-3,-1],[-10,-8],[-17,-14],[-32,-26],[-17,-15],[-15,-12],[-54,-36],[-25,-19],[-11,-9]],[[8615,8154],[-28,-23],[-9,-8],[-8,-9],[-11,-11],[-6,-7],[-7,-6],[-69,-57],[-3,-2],[-3,-3],[-18,-17],[-8,-7],[-2,-2]],[[8443,8002],[-1,2],[-1,1],[-8,13],[-34,54],[-31,51],[-18,27]],[[8350,8150],[-26,40],[-6,10],[-23,37],[-3,4]],[[8292,8241],[2,1],[4,3],[6,2],[4,2],[2,2],[15,12],[18,16],[13,11]],[[8356,8290],[14,17],[18,16],[21,16],[22,14]],[[8431,8353],[23,11],[8,6],[10,6],[35,23],[51,26],[22,15],[-7,14],[-2,5],[-3,5],[-6,9],[-1,1],[-4,7],[-5,5],[-8,7],[-3,2],[-8,4],[-10,5],[-2,1],[-1,0],[-8,3],[-12,4],[-2,1],[-11,4],[-6,2]],[[8481,8519],[-12,6],[-9,8],[-9,12],[-6,10],[-5,13]],[[8440,8568],[19,10],[18,10],[15,9],[15,8],[1,2],[0,3],[-24,57],[-1,1],[-3,0],[-14,-8],[-34,-19],[-18,-11]],[[8414,8630],[-12,29]],[[8402,8659],[3,3],[29,40],[20,26],[11,15],[3,3]],[[8468,8746],[20,-18],[-11,-16],[0,-2],[1,-2],[8,-7],[11,-15],[4,-5],[4,-9]],[[8505,8672],[22,-54],[16,-39],[2,-4],[4,-7],[6,-6]],[[8555,8562],[-12,-15],[-9,-12],[16,-13],[11,-2],[24,-2],[1,-9],[22,-53],[35,29],[41,38],[2,2]],[[8686,8525],[69,70],[7,7],[1,4],[5,7],[27,27]],[[8795,8640],[16,16],[20,20],[2,2]],[[8833,8678],[2,-3],[13,-29],[32,-70],[0,-4],[67,-144],[3,-6],[2,-3]],[[8431,8353],[0,5],[-2,6],[-40,93],[-36,88]],[[8353,8545],[20,11]],[[8373,8556],[37,-87],[19,11],[-7,18],[-1,3],[2,2],[19,11],[4,1],[2,-1],[7,-6],[5,-11],[16,10],[2,2],[3,10]],[[8373,8556],[20,11],[-11,27],[-1,2],[2,3],[13,15],[11,12],[7,4]],[[8414,8630],[26,-62]],[[8353,8545],[-6,13],[-8,20],[-3,7]],[[8336,8585],[-2,3],[-12,28],[-1,5],[1,3],[1,4],[2,4],[13,8],[-5,12],[-3,5],[-11,24],[-4,8]],[[8315,8689],[29,24],[26,25],[17,18],[21,21],[11,-26],[7,-15],[-15,-20],[-20,-28],[0,-1],[10,-24],[1,-4]],[[8094,8578],[17,5],[10,1],[25,3],[10,0],[20,7],[11,2],[1,1],[6,3],[7,7],[8,10],[3,1],[8,5],[10,3],[19,16],[1,4],[5,3],[4,6],[3,3],[5,3],[6,3],[5,3],[6,8],[8,12],[5,1],[8,6]],[[8305,8694],[4,5],[6,-10]],[[8336,8585],[-3,-2],[-7,-6],[-75,-65],[-13,-10]],[[7915,5295],[-11,6],[-53,27],[-2,1],[-10,5]],[[7839,5334],[12,23],[2,3]],[[7853,5360],[76,-39]],[[2762,2202],[-32,16]],[[2489,2977],[-10,27],[-10,32]],[[2469,3036],[9,14],[12,20],[7,16],[4,7]],[[2501,3093],[11,22],[8,15],[3,5],[3,5],[13,19],[3,4],[5,8],[4,8]],[[2501,3093],[-2,4],[-14,36],[-21,59],[-28,54]],[[2436,3246],[25,12],[8,5],[5,5],[5,9],[3,0],[2,-1],[13,-26],[12,17],[12,-26],[27,20]],[[2436,3246],[-25,51],[-1,4],[2,35],[1,23],[3,64],[0,23],[3,8]],[[2469,3036],[-3,-3],[-17,45]],[[2449,3078],[1,3],[6,11],[3,10],[2,10],[-2,10],[-1,1],[-1,5],[-3,6],[-2,3],[-1,7],[-2,4],[-4,8],[-3,4],[-2,2],[-4,4],[-1,3],[-1,0],[-1,11],[-2,16],[0,5],[-2,0],[-1,3],[-1,9],[0,3],[-3,4],[-4,4],[-3,5],[-6,7],[-3,0],[-2,1],[-14,-1],[-12,-2],[-7,-2],[-2,-2],[-4,0],[-5,0],[-7,9],[-4,9],[0,3],[-4,6],[-4,12],[-1,10],[1,9],[2,2],[6,7],[7,11],[2,3],[3,3],[1,0],[-2,7],[0,6],[0,8],[0,2],[8,13],[3,9],[5,11],[6,14],[0,8],[-1,12],[-2,12],[-1,8],[4,6],[6,4],[2,5],[2,5],[6,16],[6,19],[1,10],[1,7],[8,5],[13,7]],[[2385,3434],[-2,-1],[-1,1],[-1,3],[0,2],[0,3],[-4,5],[-3,2],[-7,8],[0,3],[-5,6],[-3,6],[-1,6],[3,2],[12,11],[16,13],[8,5],[5,3],[3,1],[3,-1],[1,-2],[0,-3],[-1,-3],[-2,-5],[-1,-6],[-1,-8],[1,-3],[-2,-8],[-2,-2],[-3,-7],[-3,-7],[-2,-7],[0,-3],[-5,-12],[-3,-2]],[[6896,6538],[-37,56]],[[6859,6594],[16,14],[16,13],[17,15]],[[6859,6594],[-18,27]],[[6841,6621],[19,11],[19,10],[18,10]],[[6897,6652],[11,7],[16,9]],[[6888,6444],[-15,-13]],[[6836,6486],[16,14]],[[6852,6500],[15,13],[14,13],[15,12]],[[6925,6388],[-16,-14],[-14,-13]],[[6842,6934],[-29,47],[-15,24],[-3,-9],[-4,-15]],[[6791,6981],[-10,9]],[[6781,6990],[28,110],[36,85],[1,13],[7,11]],[[6853,7209],[8,-17]],[[6861,7192],[-3,-5],[-5,-9],[-22,-52],[-1,-5],[-3,-7],[-1,-4],[7,-4],[19,-29],[11,-18]],[[6863,7059],[-6,-5],[-4,-16],[-7,-24],[-9,-33],[16,-25],[-5,-16],[-6,-6]],[[6863,7059],[17,-26],[5,0],[16,-21],[3,-3]],[[6904,7009],[-20,-57]],[[6884,6952],[-1,-2],[-17,-51]],[[6866,6899],[-3,3],[-5,9],[-16,23]],[[6960,7041],[-3,-3],[-15,-13],[-21,33],[-17,-49]],[[6861,7192],[7,-12],[12,-20],[39,-59],[9,-14],[2,-3]],[[6930,7084],[5,-6],[25,-37]],[[6983,7161],[-14,-29],[-11,16],[-3,4],[-15,-40],[-10,-28]],[[6861,7192],[18,32],[3,6],[4,6],[15,24],[1,2],[2,3],[17,21]],[[6921,7286],[6,-10],[2,-2],[7,-5],[27,-42],[-10,-20],[13,-20],[2,-4]],[[6968,7183],[15,-22]],[[6921,7286],[7,9],[8,11],[3,4],[3,3],[3,3],[6,6],[10,7]],[[6961,7329],[11,-17],[7,-2],[4,-7],[15,-24],[13,-20],[2,-3]],[[7013,7256],[-2,-3],[-7,-9],[-9,-14],[-13,-22],[-14,-25]],[[6961,7329],[10,8],[11,8],[4,3],[5,5],[4,3],[9,11],[11,12],[13,18]],[[7028,7397],[23,-35],[-36,-32],[23,-37],[2,-3]],[[7040,7290],[-13,-15],[-12,-15],[-2,-4]],[[7028,7397],[14,16],[2,3]],[[7062,7388],[28,-45],[2,-3]],[[7092,7340],[-2,-2],[-18,-15],[-10,-9],[-10,-11],[-12,-13]],[[7028,7233],[-15,23]],[[7092,7340],[14,-22]],[[7106,7318],[-2,-2],[-21,-18],[-15,-15],[-17,-21],[-23,-29]],[[7039,7215],[-11,18]],[[7106,7318],[12,-18]],[[7118,7300],[-2,-2],[-23,-19]],[[7093,7279],[-15,-16]],[[7078,7263],[-13,-15]],[[7065,7248],[-11,-14],[-15,-19]],[[7184,7234],[-15,-13]],[[7169,7221],[-12,17]],[[7157,7238],[-39,62]],[[7106,7318],[16,14],[62,-98]],[[7267,7329],[-58,-61],[-25,-34]],[[6853,7209],[6,10],[38,53],[5,10],[7,9],[4,6],[9,13],[22,28],[23,24],[4,6],[12,13],[17,24],[13,14],[18,24],[14,13],[5,6],[25,33],[20,29],[14,27]],[[7109,7551],[2,-5],[17,-27]],[[7350,7713],[-11,18],[-14,-13],[-6,-7],[-2,-2],[-7,-9],[-13,-18],[-8,-8],[-13,-12],[-15,-14],[-9,-8]],[[7252,7640],[-14,-13],[-1,0],[-3,-3],[-5,-4],[-4,-3],[-8,-7],[-14,-9],[-9,-9],[-30,-33]],[[7164,7559],[-32,-36],[-4,-4]],[[7109,7551],[1,3],[8,11],[1,4],[0,5],[3,4],[6,5],[4,3],[2,4],[6,12],[3,3],[17,7],[5,3],[10,-2],[14,3],[35,24],[3,3],[7,4],[3,6],[4,3],[11,8],[10,8],[8,7],[10,4],[6,7],[11,12],[8,13],[0,5],[-5,7],[0,3],[2,3],[3,0],[7,-6],[13,11],[3,7],[3,4],[9,11],[18,18],[16,20],[5,4],[6,4],[5,5]],[[7300,7735],[-4,-4],[-4,2],[-7,-9],[-4,-3],[-4,-1],[-18,-4],[-8,-1],[-5,1],[-3,3],[-2,3],[-2,7],[-1,7],[1,5],[12,16],[12,15],[8,9],[30,22],[5,3],[11,4],[2,2],[7,3],[22,8],[3,-1],[2,-4],[-1,-4],[-7,-12],[-10,-13],[-10,-11],[-11,-17],[-6,-6],[-5,-5],[-3,-5],[-1,-4],[1,-6]],[[7204,7708],[-2,0],[-3,3],[-4,14],[1,12],[-6,5],[-1,11],[11,23],[9,8],[18,9],[25,30],[14,13],[10,5],[3,-3],[1,-8],[-3,-10],[-6,-8],[-16,-21],[-9,-10],[-6,-8],[-6,-6],[-5,-7],[0,-6],[-6,-16],[-4,-11],[-2,-11],[-9,-8],[-4,0]],[[7526,5104],[-47,35]],[[7479,5139],[4,8],[1,1],[3,7],[3,5],[2,3],[4,7]],[[7532,5214],[24,-18]],[[7556,5196],[-2,-3],[-9,-18],[-4,-15],[1,-9],[-6,-24],[-6,-13],[-4,-10]],[[7479,5139],[-47,32]],[[7432,5171],[-11,8]],[[7446,5078],[-8,5],[-30,23],[-8,5],[10,19],[11,20],[11,21]],[[7479,5139],[-12,-22],[-11,-20],[-10,-19]],[[7446,5078],[-11,-22]],[[7435,5056],[-9,6],[-29,22],[-8,6]],[[7461,4983],[-10,7],[-28,21],[-9,6],[11,20],[-9,6],[-29,21],[-9,7]],[[7435,5056],[8,-6],[30,-21],[9,-7]],[[7482,5022],[-11,-20],[-10,-19]],[[7432,4928],[-9,7],[-31,22],[-8,6],[-8,7],[-29,21],[-8,6]],[[7461,4983],[-11,-20],[-9,-17],[-9,-18]],[[7432,4928],[-10,-17]],[[7422,4911],[-8,6],[-31,23],[-8,6],[-9,6],[-13,9]],[[7743,7476],[-36,56],[13,17],[-13,20]],[[7734,7603],[26,-40],[10,-14],[15,-20],[2,-2]],[[7787,7527],[-3,-3],[-2,-3],[-13,-14],[-13,-16],[-13,-15]],[[7658,7506],[2,3],[17,21],[2,3]],[[7743,7476],[-12,-15],[-13,-15],[-13,-15],[-20,33],[-15,23],[-12,19]],[[7743,7476],[14,-22],[-14,-12],[13,-21],[-12,-15],[-13,-16],[-13,-17],[-17,-16],[-26,42],[-16,-13],[-24,36],[-24,36]],[[7611,7458],[16,13],[7,8],[2,2],[2,2],[10,11],[8,10],[2,2]],[[7493,7356],[25,22],[27,22]],[[7545,7400],[30,27],[36,31]],[[7787,7527],[2,-2],[41,-49],[2,-2],[12,-15],[24,-29],[23,-28],[1,-1],[1,-2]],[[7893,7399],[-3,-3],[-50,-58],[-51,-57],[-31,-36],[-38,-43],[-39,-44],[-36,-40]],[[7493,7356],[-2,2],[-36,57]],[[7455,7415],[7,6],[18,14],[16,12]],[[7496,7447],[16,15],[5,-9],[4,-13],[4,-9],[18,-28],[2,-3]],[[7489,7566],[52,-81],[43,36]],[[7584,7521],[3,-6],[4,-9],[1,-9],[0,-4],[1,-5],[3,-5],[13,-22],[2,-3]],[[7496,7447],[-55,85]],[[7441,7532],[17,15]],[[7458,7547],[8,7],[7,4],[8,4],[5,2],[2,1],[1,1]],[[7489,7566],[6,6],[7,14],[5,7],[20,17]],[[7527,7610],[13,-21],[31,-48],[13,-20]],[[7527,7610],[17,14],[16,14]],[[7455,7415],[-50,78]],[[7405,7493],[-50,77]],[[7355,7570],[6,6],[8,9],[21,-34],[23,19],[2,1],[2,-1],[10,-16],[3,-4],[11,-18]],[[7377,7469],[16,13],[12,11]],[[7164,7559],[14,-23],[18,-29],[3,-3],[11,-18],[11,-19],[2,-4]],[[7204,4330],[-10,-18],[-8,6],[-44,32],[-7,6]],[[7135,4356],[10,18],[6,10],[5,9],[1,1],[1,2]],[[7158,4396],[4,-4],[4,-6],[6,-4],[13,-10],[13,-9],[10,-8],[7,-5]],[[7215,4350],[-5,-10],[-6,-10]],[[7204,4330],[7,-6],[1,-1],[7,-5],[-5,-11],[-5,-10],[25,-18],[9,-6]],[[7243,4273],[-10,-18],[-5,-9],[-3,-5]],[[7225,4241],[-91,23]],[[7134,4264],[-2,1],[-39,11]],[[7093,4276],[11,21],[1,4],[10,18],[10,19],[10,18]],[[7091,4486],[9,-4],[9,-5],[9,-4],[10,-5],[8,-4],[8,-4],[2,-2]],[[7146,4458],[-1,-3],[-8,-15],[9,-8],[22,-16],[7,-5]],[[7175,4411],[-9,-8],[-8,-5],[0,-2]],[[7093,4276],[-2,0],[-68,18]],[[7069,4228],[-38,18],[-6,-19]],[[7025,4227],[-67,33],[-10,4]],[[7093,4276],[-7,-11],[-10,-22],[-1,-3],[0,-2],[-3,-2],[-3,-8]],[[7062,4209],[-7,-20]],[[7055,4189],[-30,15],[-8,3]],[[7017,4207],[8,20]],[[7069,4228],[-5,-13],[1,-2],[-1,-3],[-2,-1]],[[7049,4170],[-7,-18]],[[7042,4152],[-16,7],[-8,4],[-5,2],[-9,5]],[[7004,4170],[6,18]],[[7010,4188],[7,19]],[[7055,4189],[-6,-19]],[[7029,4115],[-6,-17]],[[7023,4098],[-10,4],[-19,9],[-9,5]],[[6985,4116],[7,18]],[[6992,4134],[6,18]],[[6998,4152],[6,18]],[[7042,4152],[-6,-19]],[[7036,4133],[-7,-18]],[[7112,4117],[-9,-16]],[[7103,4101],[-9,4],[-50,24],[-8,4]],[[7042,4152],[8,-4],[52,-26],[2,0],[8,-5]],[[7103,4101],[-10,-17]],[[7093,4084],[-9,5],[-47,22],[-8,4]],[[7093,4084],[-9,-16]],[[7084,4068],[-9,4],[-44,22],[-8,4]],[[7084,4068],[-8,-16],[-51,24],[-8,4]],[[7017,4080],[6,18]],[[7111,4026],[-30,17],[-13,-24],[-9,4],[-12,6],[-5,2],[-11,5],[-18,8],[-3,2],[-4,2]],[[7006,4048],[5,17],[6,15]],[[7112,4117],[39,-18]],[[7006,4048],[-8,4],[-31,15]],[[6967,4067],[6,16],[6,15]],[[6979,4098],[6,18]],[[9369,8355],[0,8],[-4,16],[1,11],[7,31],[4,18],[2,4],[5,11],[2,10],[4,21]],[[9390,8485],[66,-17]],[[9438,8382],[-18,4],[-1,-18],[3,-20],[-6,-3],[-3,-1],[-5,1],[-39,10]],[[9308,8311],[7,34],[5,27],[6,28],[5,24],[5,21],[6,30],[4,21]],[[9346,8496],[44,-11]],[[9369,8355],[-6,-27]],[[9363,8328],[-5,-30]],[[9358,8298],[-21,6],[-6,1],[-23,6]],[[9346,8496],[7,31],[8,39]],[[9361,8566],[19,-5],[11,-2],[8,0],[1,-11],[0,-11],[-6,-31],[18,-4],[5,24],[2,12],[0,19],[0,4],[4,1],[31,-8],[18,-5]],[[9361,8566],[7,35],[8,41],[6,25]],[[9382,8667],[27,-7],[-5,-22],[82,-22]],[[9382,8667],[6,27],[1,8],[3,9]],[[7853,5360],[11,20],[9,18]],[[7883,5417],[8,-4],[3,-2],[38,-20],[16,-8],[11,-5]],[[7959,5378],[-11,-19]],[[7948,5359],[-9,-17],[-10,-21]],[[7968,5397],[-9,-19]],[[7902,5454],[9,-4],[2,-1],[55,-28],[2,-1],[8,-5]],[[7912,5473],[9,-4],[2,-1],[25,-13],[30,-15],[2,-2],[8,-4]],[[7922,5492],[9,-5],[2,-1],[54,-28],[3,-2],[2,-1],[6,-3]],[[7932,5511],[9,-5],[2,-1],[54,-28],[2,-1],[9,-5]],[[7942,5529],[8,-4],[9,-4],[10,18],[9,18],[2,4],[42,-22],[14,-7],[2,-3]],[[7982,5606],[17,-9],[50,-25],[9,-5]],[[8001,5642],[9,-5],[1,0],[65,-34]],[[8001,5642],[11,21],[3,6],[8,14]],[[8023,5683],[11,-6],[57,-29],[8,-4]],[[8023,5683],[10,20],[10,20],[11,20],[13,26]],[[8142,5727],[-12,-23],[-10,-20]],[[8120,5684],[-11,-20],[-10,-20]],[[8120,5684],[8,-4],[1,-1],[57,-29],[9,-5]],[[8195,5645],[-11,-19],[-10,-20]],[[8142,5727],[8,-4],[66,-37]],[[8216,5686],[-11,-21],[-10,-20]],[[8166,5772],[73,-42]],[[8239,5730],[-12,-22],[-11,-22]],[[8239,5730],[28,-16],[3,-2]],[[8270,5712],[-1,-6],[-2,-10],[-1,-8],[0,-3],[-1,-9],[-1,-3],[-1,-2],[-1,-7],[-1,-4],[-1,-2],[-1,-2],[-2,-6],[-1,-2],[-1,-2],[-3,-5],[-10,-20],[-4,-8],[-7,-11],[-6,-12],[-4,-8],[-8,-14],[-4,-7]],[[8166,5772],[7,19],[8,19]],[[8181,5810],[17,-9],[18,-11]],[[8216,5790],[39,-22],[27,-15],[2,-2]],[[8216,5790],[7,19],[3,5],[7,18],[2,5],[8,18],[2,5],[2,6],[-19,10],[-2,-3],[1,-3],[-5,-12],[-19,12]],[[8181,5810],[20,54],[2,6]],[[2386,3567],[-7,-7],[-9,-11],[-10,-9],[-8,-9],[-9,-13],[-2,-7],[-4,-8],[-3,-12],[-3,-10],[0,-11],[0,-23],[-1,-13],[2,-19],[0,-9],[-1,-8],[-2,-4],[-4,-12],[-8,-11],[-36,-14],[-9,-5],[-9,-9],[-5,-6],[-2,-7],[0,-12],[0,-9],[0,-3],[2,-4],[1,-29],[2,-11],[0,-15],[2,-19],[2,-7],[4,-8],[3,-4],[10,-12],[12,-7],[3,-7],[2,-6],[1,-3],[4,-3],[1,-3],[1,-7],[0,-20],[-3,-13],[-2,-3],[-5,-16],[-2,-4],[-3,-3],[-4,-1],[-10,-6],[-3,-3],[-2,-3],[-11,-15],[-3,-10],[-1,-9],[-4,-14],[-6,-5],[-5,-3],[-1,-2],[0,-4],[0,-9],[1,-18],[1,-3],[4,-6],[6,-3],[1,-1],[0,-2],[-1,-5],[-3,-5],[-1,-5],[-2,-4],[-4,-12],[-2,-5],[-1,-1],[-5,-4],[-7,-4],[-6,-5],[-4,0],[-8,1],[-5,-3],[-6,-9],[-10,-11],[-3,-6],[-5,-3],[-2,-7],[-2,-10],[-4,-6],[-6,-3],[-2,-2],[-5,-6],[-1,-3],[-3,-5],[0,-4],[-3,-4],[-2,-1]],[[2259,3137],[3,6],[2,5],[1,3],[1,8],[2,9],[1,2],[0,5],[1,5],[0,4],[1,6],[-1,2],[0,2],[-2,6],[-1,3],[0,2],[-1,2],[-1,2],[-2,3],[-8,12],[-4,8],[-2,4],[-1,4],[0,7],[1,3],[0,3],[1,3],[2,9],[1,7],[0,2],[1,3],[-1,3],[0,5],[0,6],[-1,8],[0,5],[-1,16]],[[2164,3320],[7,6],[1,0],[13,-19],[5,6],[4,5],[4,6],[2,2],[2,3],[1,2],[6,8],[6,10]],[[7883,4323],[-8,-15]],[[7875,4308],[-3,2],[-8,6],[-1,1],[-26,20]],[[7837,4337],[-79,61],[8,14]],[[7766,4412],[71,-53],[8,-7]],[[7682,4356],[4,6],[55,78]],[[7741,4440],[1,-1],[0,-1],[2,-2],[1,-7],[21,-17]],[[7837,4337],[-5,-9],[-5,-9],[-10,-18],[-14,-26]],[[7875,4308],[-11,-18],[-10,-19],[-14,-24]],[[7869,4225],[-10,7],[-11,8],[-8,7]],[[7872,4148],[-7,6],[-31,23],[-8,6],[-7,6],[-9,6]],[[7863,4133],[-7,5],[-32,24],[-7,5],[-7,6],[-8,6]],[[7850,4108],[-47,35],[-2,-3],[-13,11],[-2,1]],[[7447,4255],[-10,7],[-44,34],[-9,6]],[[7384,4302],[9,17]],[[7393,4319],[8,14]],[[7401,4333],[63,-47]],[[7464,4286],[-9,-14],[-8,-17]],[[7447,4255],[-10,-17],[-9,7],[-44,34],[-9,7]],[[7375,4286],[9,16]],[[7305,4338],[9,17]],[[7314,4355],[10,-7],[20,-15],[31,-24],[9,-7]],[[7375,4286],[-10,7],[-51,38],[-9,7]],[[7314,4355],[9,17]],[[7323,4372],[10,-7],[6,-5],[45,-34],[9,-7]],[[7323,4372],[9,14]],[[7332,4386],[7,13]],[[7339,4399],[50,-38],[19,-15]],[[7408,4346],[-7,-13]],[[7353,4424],[69,-53]],[[7422,4371],[-7,-13],[-7,-12]],[[7339,4399],[6,11],[8,14]],[[7353,4424],[-69,52]],[[7284,4476],[7,14],[7,11]],[[7298,4501],[68,-52]],[[7366,4449],[46,-34],[6,-5],[18,-14]],[[7436,4396],[-6,-11],[-8,-14]],[[7366,4449],[7,11],[6,11]],[[7379,4471],[6,12],[7,11]],[[7392,4494],[69,-52]],[[7461,4442],[-6,-11],[-6,-12],[-7,-12],[-6,-11]],[[7298,4501],[6,11],[6,11]],[[7310,4523],[69,-52]],[[7310,4523],[-37,27],[-18,14],[-2,2],[-1,1],[-1,2]],[[7251,4569],[1,4],[2,8],[5,12]],[[7259,4593],[64,-47]],[[7323,4546],[69,-52]],[[7323,4546],[7,11],[9,18],[7,12],[7,14]],[[7353,4601],[69,-52]],[[7422,4549],[-7,-13],[-7,-12],[-9,-18],[-7,-12]],[[9197,7781],[97,-26],[62,-16],[52,-15]],[[9408,7724],[52,-14]],[[9460,7710],[61,-17]],[[9019,7016],[-207,59],[-36,11]],[[8776,7086],[18,116],[4,22],[-218,166],[-2,2],[-17,11],[-3,3]],[[8558,7406],[-3,2],[-4,2],[-28,22],[-2,1],[-351,274]],[[8170,7707],[44,47],[3,4],[3,2]],[[8220,7760],[2,3],[18,20],[11,12],[38,41],[6,7],[30,32],[43,47],[5,5],[39,43],[21,23],[8,8],[2,1]],[[8615,8154],[3,-3],[3,-1],[10,8],[37,-30],[39,-29],[129,-99],[20,-14],[5,-4],[3,-2],[4,-3],[23,-18],[46,-34],[19,-13],[91,-68],[54,-41],[62,-17],[7,-2],[24,-2],[3,-1]],[[8776,7086],[-14,-61],[-68,22],[-4,-7],[-51,20],[-33,-49]],[[8606,7011],[-22,16],[-4,3],[-9,7]],[[8571,7037],[12,22],[1,11],[1,26],[4,7],[-12,9],[-5,3],[-3,2],[-5,3],[-6,4],[-4,20],[-35,23]],[[8379,7068],[1,2],[18,33],[10,19],[16,32],[9,16],[27,50],[22,43],[9,17],[11,19],[5,11],[4,7],[4,8],[40,75],[0,1],[1,0],[0,1],[2,4]],[[8571,7037],[-17,12],[-8,-15]],[[8606,7011],[-8,-14],[-7,-14]],[[8977,6880],[-2,1],[-41,16]],[[9430,7831],[-4,-22],[-5,-21],[-5,-24],[-5,-27],[-3,-13]],[[9197,7781],[14,62],[8,43],[5,23],[2,8],[2,13],[5,22]],[[9233,7952],[31,-8],[66,-18]],[[9330,7926],[-5,-21],[-4,-22],[-5,-22],[61,-16],[53,-14]],[[9430,7831],[53,-14]],[[9483,7817],[-5,-22]],[[9478,7795],[-4,-22],[-5,-24],[-6,-26],[-3,-13]],[[9430,7831],[5,22],[1,6],[3,15],[4,22],[5,22],[53,-14]],[[9501,7904],[-5,-22],[-4,-22],[-5,-21],[-4,-22]],[[9539,7779],[-61,16]],[[9501,7904],[2,10],[8,24],[2,3]],[[9330,7926],[4,22],[8,36],[0,3]],[[9342,7987],[51,-14]],[[9393,7973],[43,-11],[44,-12],[33,-9]],[[9393,7973],[4,21],[4,20]],[[9401,8014],[4,21],[4,23],[5,21]],[[9268,8006],[4,20],[4,20],[41,-11],[43,-10],[41,-11]],[[9342,7987],[-45,12],[-20,5],[-9,2]],[[6454,4165],[-1,-3],[-4,-11],[-1,-3],[-1,-2],[0,-1],[-1,-6],[0,-6],[3,-8],[12,-29],[2,-9],[2,-8],[1,-15],[-2,-20],[-5,-19],[-3,-13],[-3,-8],[-4,-13],[-8,-16],[-9,-24],[-2,-6],[-12,-32],[2,-1],[-1,-2],[-4,-11],[-1,-3],[-8,-20],[0,-2],[-20,-46],[-4,-10],[-5,-11],[-15,7],[-36,16],[-12,5],[-33,16],[-1,-4],[-12,-34],[2,-2],[23,-11],[1,-1],[0,-1],[0,-1],[-7,-18],[-1,-1],[-2,-1],[-2,1],[-19,9],[-4,0],[-9,-26]],[[6250,3761],[-23,-65],[-24,-69]],[[6203,3627],[-26,-75]],[[6153,3913],[0,7],[0,10]],[[6087,3914],[12,30]],[[6764,4366],[-2,-12]],[[6762,4354],[-9,4],[-24,12],[-30,9],[-6,-16],[-4,-11],[-3,-9]],[[6686,4343],[-6,-18]],[[6680,4325],[-78,35],[-5,3]],[[6680,4325],[-7,-18]],[[6673,4307],[-81,36],[-1,3],[3,9]],[[6673,4307],[-7,-19]],[[6748,4315],[-7,-18]],[[6741,4297],[-8,4],[-29,13],[-24,11]],[[6686,4343],[24,-11],[28,-13],[10,-4]],[[6755,4335],[-7,-20]],[[6762,4354],[-7,-19]],[[6718,3553],[33,50],[12,34]],[[6763,3637],[21,-11],[-10,-24],[24,-11],[-13,-24],[-11,-20],[-10,-20],[10,-9],[4,-3],[6,-4]],[[9346,8496],[-3,1],[-19,5],[3,18],[0,2],[-2,2],[-9,2],[7,32],[-1,3],[-2,1],[-15,4],[-18,5],[-6,-36],[-18,5],[-18,5],[7,35],[-18,4],[3,14],[-6,2],[-4,2],[-2,3],[-1,3],[0,4]],[[9224,8612],[27,34],[20,22],[6,5],[18,18],[-14,4],[19,16],[-2,3],[4,21]],[[9224,8612],[-7,-10],[-18,-21],[-20,-14],[-10,-6],[-9,-4],[-5,-2],[-6,-3],[-6,-3],[5,20],[3,17]],[[9151,8586],[1,13],[1,26],[1,21],[-2,30],[-2,14],[-6,42],[-3,26]],[[9141,8758],[7,-4],[6,-4],[7,-4],[1,1],[2,0],[2,0],[66,-18],[5,24],[65,-18]],[[9141,8758],[1,1],[0,2],[0,2],[0,3],[0,4],[-1,14],[0,5],[-1,9],[-1,17],[0,6],[-1,15],[-4,40],[-2,13],[0,9],[-1,9],[-1,16],[0,6],[6,3],[0,6],[1,9],[0,4]],[[7575,4830],[-48,37],[-3,-6],[-14,10],[-7,5]],[[7503,4876],[9,18]],[[7512,4894],[7,-6],[12,-9],[4,10],[1,4],[4,0],[5,2],[2,5],[1,4],[3,8],[48,-36]],[[7599,4876],[-6,-12],[-6,-11],[-6,-11],[-6,-12]],[[7575,4830],[-6,-12],[-7,-12]],[[7562,4806],[-46,36],[-15,11],[-7,5]],[[7494,4858],[9,18]],[[7553,4786],[-69,53]],[[7484,4839],[5,10],[5,9]],[[7562,4806],[-4,-10],[-5,-10]],[[7521,4729],[-54,40],[-5,4],[-11,8]],[[7451,4781],[6,11],[6,9],[5,9],[5,10]],[[7473,4820],[6,9],[5,10]],[[7553,4786],[-5,-10],[-6,-10]],[[7542,4766],[-5,-9],[-5,-9],[-5,-9],[-6,-10]],[[7498,4689],[-17,13],[-8,8],[-34,25],[-10,7]],[[7429,4742],[11,19]],[[7440,4761],[6,10],[5,10]],[[7521,4729],[-7,-11],[-5,-10],[-5,-10],[-6,-9]],[[7475,4645],[-10,7],[-51,37],[-9,7]],[[7405,4696],[14,26]],[[7419,4722],[10,20]],[[7498,4689],[-5,-10],[-5,-10]],[[7488,4669],[-7,-13],[-6,-11]],[[7461,4621],[-9,7],[-51,37],[-9,7]],[[7392,4672],[13,24]],[[7475,4645],[-14,-24]],[[7461,4621],[-13,-23]],[[7448,4598],[-9,6],[-51,37],[-9,7]],[[7379,4648],[13,24]],[[7448,4598],[-6,-13],[-6,-10]],[[7436,4575],[-63,46],[-6,5]],[[7367,4626],[6,10],[6,12]],[[7353,4601],[8,13],[6,12]],[[7436,4575],[-6,-12],[-8,-14]],[[7491,4498],[-69,51]],[[7436,4575],[60,-44],[9,-7]],[[7505,4524],[-6,-12],[-8,-14]],[[7491,4498],[-7,-13],[-7,-12],[-5,-11],[-4,-7],[-2,-3],[-5,-10]],[[7518,4547],[-6,-12],[-7,-11]],[[7448,4598],[11,-8],[50,-37],[9,-6]],[[7531,4571],[-13,-24]],[[7461,4621],[11,-7],[23,-17],[14,-10],[13,-10],[9,-6]],[[7475,4645],[10,-7],[50,-37],[9,-7]],[[7544,4594],[-13,-23]],[[7488,4669],[9,-8],[50,-38],[9,-7]],[[7556,4616],[-12,-22]],[[7498,4689],[69,-53]],[[7567,4636],[34,-27],[-5,-9],[-5,-10],[-23,17],[-12,9]],[[7521,4729],[68,-54]],[[7589,4675],[-6,-10],[-5,-10]],[[7578,4655],[-6,-10],[-5,-9]],[[7542,4766],[69,-53]],[[7611,4713],[-6,-9],[-5,-9]],[[7600,4695],[-5,-9],[-6,-11]],[[7553,4786],[68,-53]],[[7621,4733],[-5,-10],[-5,-10]],[[7562,4806],[69,-52]],[[7575,4830],[68,-53]],[[7599,4876],[68,-53]],[[7599,4876],[5,11],[6,12]],[[7610,4899],[6,11],[6,12]],[[7622,4922],[34,-27],[35,-27]],[[7259,4593],[4,13],[4,14],[2,6]],[[7269,4626],[3,7],[4,8],[2,5],[4,7]],[[7282,4653],[71,-52]],[[7282,4653],[8,13],[6,12]],[[7296,4678],[71,-52]],[[7296,4678],[6,10],[6,12]],[[7308,4700],[10,-8],[51,-37],[10,-7]],[[7308,4700],[13,24]],[[7321,4724],[10,-7],[51,-38],[10,-7]],[[7321,4724],[13,24]],[[7334,4748],[10,-7],[51,-38],[10,-7]],[[7334,4748],[9,16],[6,10]],[[7349,4774],[9,-7],[52,-38],[9,-7]],[[7349,4774],[10,20]],[[7359,4794],[61,-45],[9,-7]],[[7359,4794],[6,9],[5,11]],[[7370,4814],[7,-6],[63,-47]],[[7370,4814],[5,9],[6,11]],[[7381,4834],[70,-53]],[[7381,4834],[6,10],[5,10]],[[7392,4854],[5,9],[5,10]],[[7402,4873],[71,-53]],[[7402,4873],[6,10],[6,10]],[[7414,4893],[70,-54]],[[7414,4893],[4,9],[4,9]],[[7432,4928],[7,-5],[16,-12],[18,-13],[21,-16],[9,-6]],[[7461,4983],[8,-6],[53,-39],[9,-7]],[[7531,4931],[-10,-20],[-9,-17]],[[7541,4951],[-10,-20]],[[7482,5022],[8,-6],[30,-22],[16,-7],[17,-12]],[[7553,4975],[-12,-24]],[[7565,4997],[-6,-11],[-6,-11]],[[7446,5078],[8,-6],[31,-23],[8,-6],[10,20]],[[7503,5063],[8,-6],[18,-13],[-1,-3],[-4,-7],[-2,-4],[43,-33]],[[7503,5063],[11,19],[6,11],[6,11]],[[7526,5104],[39,-29],[12,-8],[18,-13]],[[7595,5054],[-6,-11],[-6,-12],[-6,-11]],[[7577,5020],[-6,-12],[-6,-11]],[[7636,4427],[6,11],[5,8]],[[7647,4446],[13,24]],[[7660,4470],[9,18],[2,6],[2,0],[9,-7],[29,-22],[30,-25]],[[7696,4593],[11,-9],[20,-15],[3,-1],[30,-23]],[[7760,4545],[33,-25]],[[7793,4520],[4,-3]],[[7797,4517],[-2,-2],[-19,-25]],[[7776,4490],[-11,-15],[-24,-35]],[[7660,4470],[-13,9],[-45,35],[-8,6]],[[7594,4520],[13,23]],[[7607,4543],[42,65],[-34,25],[-14,5],[-23,17]],[[7589,4675],[33,-25],[4,-3],[31,-24],[39,-30]],[[7696,4593],[4,8],[4,7]],[[7704,4608],[5,11],[6,12]],[[7715,4631],[36,-28],[8,-7],[7,-3]],[[7766,4593],[1,-22],[-2,-9],[-3,-13],[-2,-4]],[[7814,4558],[-8,6],[-27,21],[-7,5],[-6,3]],[[7715,4631],[4,7],[2,4],[1,1],[4,8]],[[7726,4651],[24,-17],[8,-7],[4,-3]],[[7762,4624],[1,-4],[6,-4],[8,-6],[38,-29],[8,-7],[-9,-16]],[[7793,4520],[2,3],[10,19],[9,16]],[[7762,4624],[-3,29],[20,-16],[12,-7],[2,-2]],[[7793,4628],[27,-20],[15,-12],[20,-15]],[[7855,4581],[-3,-2],[-19,-16],[-11,-11]],[[7822,4552],[-4,-5],[-21,-30]],[[7804,4647],[-6,-9],[-5,-10]],[[1616,411],[-3,-1],[-36,-16],[-25,-12],[-8,-4],[-33,-14],[-12,-6],[-12,-4],[-28,-10],[-6,27],[-25,-7],[-27,-9]],[[848,76],[6,21]],[[908,104],[10,4],[6,2],[3,1],[8,1],[4,-1],[19,-5],[0,4],[1,11],[1,20],[1,7],[-1,7],[0,6],[1,3],[2,2],[3,8],[1,19],[9,2],[7,2],[10,3],[10,4],[49,35],[29,21],[4,2],[5,0],[8,-1],[12,0]],[[1110,261],[5,-1],[4,0],[4,0],[9,2],[43,13],[10,2],[26,5]],[[1618,401],[-3,-2],[-4,-7],[-5,-9],[-9,-13],[-11,-22],[-9,-1],[-24,-23],[-8,-4],[-6,-4],[-1,-2],[-2,-5],[-8,-4],[-9,-2],[-15,1],[-3,1],[-16,4],[-31,0],[-21,2],[-8,1],[-4,2],[-13,0],[-6,-3],[-2,0],[-18,-8],[-1,3],[-11,-8],[-17,-5],[-4,-4],[-11,-7],[-7,-6],[-3,-1],[-9,-6],[-4,2],[-23,-14],[-15,-14],[-2,-4],[-8,-4],[-10,-9],[-13,-5],[-4,0],[-3,-5],[-2,-2],[-5,-7],[-2,-6],[-5,-6],[-4,-5],[-6,-2],[-13,-8],[-7,-2],[0,-13],[-1,0],[-1,13],[-2,0],[-4,4],[-6,2],[-11,1],[-6,-1],[-12,-8],[-5,-8],[-5,-14],[-3,-7],[-6,-13],[-2,-4],[-1,-11],[1,-32],[-8,-14],[-6,-6],[-2,-2],[0,-3],[-2,-4],[-4,-7],[-5,-3],[-2,0],[-2,2],[-7,5],[-9,3],[-5,-2],[-3,-3],[-1,-21],[-1,-3],[-2,-1],[-3,2],[-1,4],[5,0],[0,31],[-12,2],[-3,-31],[5,-1],[0,-4],[-10,1],[-1,1],[-1,2],[0,7],[-1,0],[-4,6],[-12,0],[-7,-1],[-3,6],[-2,3],[-3,0],[-5,-1],[-15,-5],[-4,-3],[-5,-10],[-2,-2],[-5,-2],[-11,0],[-1,2],[-1,13],[-3,2],[-3,-6],[-3,-2],[-6,0],[-13,1],[-9,3],[-4,3],[-4,4],[-3,5],[-9,6],[-4,13],[-1,4],[-3,3],[-8,0],[-3,-1],[-23,-1],[-10,-1],[-7,-2],[-3,-2],[-1,-1]],[[6421,5195],[-62,30]],[[6359,5225],[4,11],[4,11]],[[6367,5247],[4,11],[4,13],[9,24]],[[6397,5128],[-61,30]],[[6336,5158],[4,11],[3,11]],[[6343,5180],[5,12],[4,11],[3,11],[4,11]],[[6413,5173],[-4,-11],[-4,-11],[-4,-12],[-4,-11]],[[6319,5112],[4,12],[5,11],[4,12],[4,11]],[[6397,5128],[-4,-11],[-4,-11],[-4,-12],[-5,-13]],[[6258,5141],[4,13],[4,11],[4,11],[4,12]],[[6274,5188],[4,11],[4,11]],[[6282,5210],[61,-30]],[[6474,5143],[-4,-11],[-4,-11],[-4,-11],[-4,-12],[-4,-11],[-4,-11],[-4,-12],[-4,-12]],[[7053,6499],[15,13],[14,12],[14,13],[13,19],[-19,29],[14,13],[9,7],[14,13],[-13,22]],[[7180,6696],[19,-30]],[[7199,6666],[30,-46],[2,-3]],[[7511,6675],[-2,-1],[-21,-19],[-2,-2],[-14,-13],[65,-49]],[[7231,6617],[33,65],[3,6],[60,120],[13,26],[23,35],[25,33],[16,20],[28,-36],[14,13],[-5,21],[13,15]],[[6770,5704],[-4,3],[-33,22],[-8,6]],[[6725,5735],[10,21]],[[6797,5762],[-1,-2],[-8,-18],[-8,-17],[-10,-21]],[[6851,5547],[-58,43]],[[6820,5639],[6,11],[6,11],[6,11],[5,9],[5,9],[4,8],[3,7],[9,-6],[1,3]],[[6714,5593],[-5,3]],[[6709,5596],[11,21],[11,21],[-32,23],[-9,6]],[[6690,5667],[11,22],[12,24],[12,22]],[[6709,5596],[-32,23],[-9,6],[-8,6],[-42,28],[-8,6]],[[6610,5665],[10,20]],[[6620,5685],[9,-6],[41,-28],[8,-6],[12,22]],[[6620,5685],[11,23],[-50,34],[-8,6]],[[6573,5748],[11,22]],[[6584,5770],[12,23]],[[6610,5665],[-9,6],[-41,29],[-9,6]],[[6551,5706],[11,20],[11,22]],[[6590,5626],[-59,41]],[[6531,5667],[10,19],[10,20]],[[6610,5665],[-10,-20],[-10,-19]],[[6662,5490],[-4,4],[-42,28]],[[6616,5522],[9,18],[13,25],[1,3],[9,18],[-58,40]],[[7178,4851],[-30,22]],[[7148,4873],[-57,42]],[[7148,4873],[-9,-17],[-12,-22],[30,-23]],[[4805,3933],[-5,6],[-47,49]],[[4753,3988],[7,8],[-13,14],[-11,11],[-1,1],[0,1],[-1,1],[1,1],[5,7],[-13,14],[28,37],[6,-6],[7,-8],[4,-3]],[[4772,4066],[9,-11],[16,-16],[4,-2],[14,-15],[15,-15],[15,-15],[6,-7]],[[4851,3985],[-2,-3],[-44,-49]],[[4546,3539],[-4,6],[20,11],[11,8],[8,6],[3,6],[-2,-1],[-1,0],[-1,0],[-3,3],[-43,47],[17,19],[16,-18],[16,-16],[26,15],[1,1],[-1,2],[-39,41],[4,5],[0,2],[-1,2],[-13,13]],[[4560,3691],[13,20],[16,24],[9,15],[2,4],[7,14],[6,13],[3,8],[10,23],[7,15],[13,18],[12,17],[13,18],[14,18],[14,18],[8,10],[10,13],[11,11],[7,9],[18,29]],[[4805,3933],[133,-148],[2,-3],[4,-4],[2,-1]],[[4946,3777],[-89,-54],[-10,-5]],[[6846,4116],[-16,-46],[1,0],[12,-1],[11,-2],[10,-3],[3,-2],[8,-5],[7,-6],[4,-4],[3,-2],[6,-3],[-25,-68],[0,-3],[-6,-5],[-3,-4],[-3,-5],[-4,-9],[-1,-8],[0,-7],[-1,-8],[-2,-9],[-3,-8]],[[6847,3908],[-20,10],[-24,11]],[[6803,3929],[-20,9],[-20,10],[-19,10]],[[6891,4103],[76,-36]],[[6967,4067],[-1,-4],[-18,8],[-1,-4],[-18,-49],[-21,-62]],[[6908,3956],[-1,-3],[-13,-35],[0,-3],[0,-3],[1,-3],[2,-8],[-26,-12]],[[6871,3889],[-4,10],[-3,2],[-17,7]],[[6878,3872],[-5,12],[-2,5]],[[6908,3956],[18,-9],[18,-9],[14,-6],[4,-2],[2,-1]],[[6964,3929],[-1,-3],[0,-2],[-4,-10],[-3,-5],[-23,-64],[-19,9],[-18,9],[-18,9]],[[6903,3730],[-7,4],[-3,1],[-18,8],[-19,9],[-19,8]],[[6837,3760],[15,39],[26,73]],[[6964,3929],[33,-17],[36,-17],[1,0]],[[6837,3760],[-9,4],[-11,-27],[-3,-4]],[[6814,3733],[-6,3],[-20,10],[-2,2],[19,54],[-5,2],[-7,12],[-9,25],[-1,4]],[[6783,3845],[-5,13],[25,71]],[[6699,3803],[-6,13],[25,71],[26,71]],[[6783,3845],[-28,-14],[-28,-14],[-28,-14]],[[6814,3733],[-4,-13],[-16,7]],[[6794,3727],[-39,19],[-80,38]],[[6675,3784],[2,6],[1,4],[2,0],[1,0],[2,1],[16,8]],[[6675,3784],[-13,6]],[[6662,3790],[2,7],[1,3],[-5,3],[-6,3],[-1,0],[-2,0],[-8,22],[11,7],[3,2],[1,4],[22,64],[-20,10]],[[6660,3915],[24,70]],[[6662,3790],[-12,6]],[[6650,3796],[-65,31]],[[6585,3827],[1,5],[-20,9],[-19,9],[29,81]],[[6576,3931],[18,-9],[11,6],[3,1],[11,5],[20,-9],[21,-10]],[[6577,3711],[-4,9],[0,2],[0,3],[0,3],[9,27]],[[6582,3755],[19,55],[-19,9]],[[6582,3819],[3,8]],[[6650,3796],[1,-4],[-4,-14],[-3,-1],[-4,-2],[-2,-3],[-1,-2],[-9,-22],[-1,-3],[-4,-4],[-5,-4],[-9,-6],[-25,-15],[-4,-3],[-3,-2]],[[6630,3633],[-20,11],[-20,8],[-18,9]],[[6572,3661],[13,34],[-6,14],[-2,2]],[[6675,3784],[-3,-11],[-4,-18],[-7,-21],[-2,-9],[1,-27],[2,-19],[-4,0],[-14,-2],[0,-4],[-14,-40]],[[6650,3615],[-2,7],[-2,3],[-2,2],[-14,6]],[[6794,3727],[-3,-8],[-4,-14],[-24,-68]],[[6551,3599],[21,62]],[[8469,5496],[75,-40],[14,4],[4,0],[9,-4],[7,-4],[16,-8],[9,-6],[17,-11],[82,-46],[2,-1]],[[8704,5380],[-7,-23],[-4,-15],[-2,-4],[-2,-8],[-8,-24],[-7,-24]],[[8674,5282],[-3,2],[-14,8],[-6,3],[-14,8],[-32,17],[-3,-3],[-1,-8],[-14,-36]],[[8587,5273],[-9,-24],[-9,-24]],[[8569,5225],[-10,-26],[-10,-23]],[[8549,5176],[-31,-80]],[[8518,5096],[-10,-23],[-9,-23]],[[8499,5050],[-8,-21],[-3,-4]],[[8488,5025],[-6,4],[-50,27]],[[8435,5412],[6,14],[6,15],[2,5],[6,16],[14,34]],[[8334,5073],[-67,36],[-9,5]],[[8258,5114],[8,19],[1,6],[1,3]],[[8344,5102],[-1,-4],[-9,-25]],[[8313,5019],[-76,40]],[[8237,5059],[4,10],[4,10],[7,19]],[[8252,5098],[6,16]],[[8334,5073],[-6,-15]],[[8328,5058],[-8,-19],[-3,-10],[-4,-10]],[[8313,5019],[-4,-10],[-5,-13]],[[8304,4996],[-9,7],[-3,2],[-8,4],[-5,3],[-41,21],[-9,5]],[[8229,5038],[4,11],[4,10]],[[1110,261],[2,35],[2,34],[-43,5],[-32,3],[4,34],[-13,29]],[[848,76],[-2,-3],[-5,-3],[-5,-1],[-6,1],[-8,5],[-14,0],[-7,-2],[-19,-9],[-5,-5],[-5,-4],[-11,-4],[-6,-11],[-7,-7],[-4,-3],[-12,-3],[-11,-1],[-6,-2],[-26,-5],[-22,-7],[-5,-3]],[[662,9],[-5,19]],[[657,28],[-10,68],[-1,8],[-1,3],[4,-1],[-3,14],[-2,1],[-3,16],[-10,73]],[[631,210],[0,3],[-3,2],[-2,1],[-5,2],[-7,4],[-8,4]],[[606,226],[-2,2],[-13,118],[-23,37],[-36,103]],[[1019,1295],[22,13],[-2,11],[37,25],[-4,14],[132,53],[6,8],[195,119],[30,-60]],[[606,226],[-36,-15],[-36,-15],[-32,-16]],[[570,85],[-2,-2],[-15,-2],[-23,-4],[-1,21],[-13,-2],[-7,50],[0,3],[-1,8],[-1,3],[-1,4]],[[631,210],[-4,-1],[-4,-2],[-2,0],[-2,-1],[-2,-1],[-1,-1],[-31,-14],[4,-36],[1,-5],[2,-20],[2,-20],[2,-20],[-26,-4]],[[657,28],[-5,-3],[-15,-6],[-3,0],[-10,-1],[-5,0],[-8,1],[-15,1],[-17,-1],[-3,0],[-6,66]],[[662,9],[-4,-2],[-5,-1],[-4,-2],[-33,1],[-17,-1],[-1,6],[-1,0],[-1,-1],[-1,-5],[-14,-2],[-2,0],[0,2],[-1,2],[-1,-3],[-3,-3],[-4,1],[-2,0],[0,4],[-2,2],[-37,10],[-11,7],[-13,1],[-71,41],[-3,-7],[62,-37],[0,-3],[0,-2],[-7,4],[-45,26],[0,1],[-12,7],[-3,1],[-3,2]],[[1560,1505],[-9,19],[-9,44],[124,49],[25,17],[11,7],[10,4],[6,1]],[[3029,1685],[-25,40],[-28,46],[-17,-14],[-17,-14],[-15,-12],[-1,-2],[0,-2],[27,-44],[-9,-7],[-3,-2],[-2,-1],[-4,0],[-4,2]],[[2845,1617],[-8,-6]],[[2837,1611],[-43,71],[-33,59],[-15,25],[-26,42],[-2,3]],[[3084,1896],[5,-22],[10,-40]],[[3099,1834],[19,-75]],[[3118,1759],[-1,-1],[-2,-1],[-3,-3],[-53,-43],[-16,-14]],[[3127,1864],[-4,-4],[-1,-1],[-2,-3],[-2,-6],[-2,-3],[-2,-2],[-15,-11]],[[3249,2028],[10,-19],[1,-7],[-1,-39],[1,-4],[11,-20],[-20,-18]],[[3251,1921],[-39,-31],[-33,-28],[-12,19],[-7,11],[-17,-15],[-11,-9],[-5,-4]],[[7402,4873],[-69,50]],[[7392,4854],[-70,51]],[[7381,4834],[-69,51]],[[7370,4814],[-69,50]],[[8304,4996],[-13,-20]],[[8291,4976],[-10,8],[-7,6],[-5,2],[-4,2],[-35,19],[-9,4]],[[8221,5017],[8,21]],[[8233,4878],[-44,22],[-1,0],[-2,-1],[0,-1],[-1,-1],[-7,-18],[-1,-3]],[[8177,4876],[-15,6],[-4,3]],[[8158,4885],[8,20],[6,18],[4,11],[4,7],[5,11],[6,9],[11,17],[4,7],[5,11]],[[8211,4996],[5,10],[5,11]],[[8291,4976],[-12,-20]],[[8279,4956],[-13,-21]],[[8266,4935],[-12,-20],[-13,-20]],[[8241,4895],[-4,-7],[-4,-10]],[[8211,4996],[-2,1],[-10,6],[-48,24],[-9,5]],[[8142,5032],[8,22]],[[8150,5054],[8,22]],[[8158,5076],[9,-5],[52,-28],[8,-3],[2,-2]],[[8158,5076],[6,11],[5,8]],[[8169,5095],[66,-35],[2,-1]],[[8169,5095],[5,10],[5,9],[5,8],[6,9]],[[8190,5131],[60,-31],[2,-2]],[[8190,5131],[5,9],[3,6],[3,5],[3,6],[1,2],[4,10],[1,4]],[[8058,5280],[-2,1],[-7,4],[-25,13],[-10,5],[10,18]],[[8024,5321],[10,18],[9,19]],[[7948,5359],[8,-4],[3,-1],[54,-28],[3,-1],[8,-4]],[[8174,4331],[12,20],[14,24]],[[8200,4375],[9,-6],[30,-24],[9,-6]],[[8200,4375],[9,17]],[[8209,4392],[67,-52]],[[8209,4392],[10,17]],[[8219,4409],[60,-49]],[[8219,4409],[10,18],[12,19],[11,20]],[[8252,4466],[8,-6],[22,-15],[2,-2],[11,-8]],[[8219,4409],[-8,6],[-9,8],[-30,23],[-9,7]],[[8163,4453],[21,35],[-8,7],[-19,13],[-10,8],[-9,7]],[[8138,4523],[9,16]],[[8147,4539],[38,-27],[9,-6],[8,-6],[20,-14],[20,-14],[10,-6]],[[8209,4392],[-7,6],[-20,15],[-20,16],[-9,6]],[[8153,4435],[10,18]],[[8200,4375],[-16,12],[-8,-14],[-31,25],[-9,7]],[[8136,4405],[8,14]],[[8144,4419],[9,16]],[[8174,4331],[-56,44]],[[8118,4375],[6,10],[6,10],[6,10]],[[8062,4390],[11,20]],[[8073,4410],[9,-7],[36,-28]],[[8073,4410],[11,20]],[[8084,4430],[6,10]],[[8090,4440],[8,-7],[1,0],[28,-21],[8,14],[1,-2],[8,-5]],[[8090,4440],[5,9]],[[8095,4449],[3,5],[8,14]],[[8106,4468],[2,3]],[[8108,4471],[8,-6],[30,-24],[7,-6]],[[8108,4471],[10,17],[10,18],[10,17]],[[8106,4468],[-9,7],[-51,40],[-9,6]],[[8037,4521],[-18,15],[-9,7]],[[8010,4543],[11,19],[28,46]],[[8049,4608],[71,-50],[27,-19]],[[8095,4449],[-69,53]],[[8026,4502],[6,10],[5,9]],[[8084,4430],[-8,7],[-23,17],[-10,8],[-19,15],[-8,6]],[[8016,4483],[4,9],[1,1],[5,9]],[[8073,4410],[-69,54]],[[8004,4464],[6,10],[6,9]],[[8062,4390],[-9,7],[-40,31],[-20,16],[-9,-16]],[[7984,4428],[-9,6],[-12,9],[-8,7]],[[7955,4450],[9,16],[11,20]],[[7975,4486],[29,-22]],[[8052,4374],[-8,6],[-53,42],[-7,6]],[[8030,4336],[-7,6],[-2,1],[-51,39],[-9,7]],[[7961,4389],[9,15],[5,8],[9,16]],[[7919,4386],[13,25]],[[7932,4411],[9,-7],[11,-8],[9,-7]],[[7932,4411],[14,23],[9,16]],[[7932,4411],[-2,2],[-7,5],[-13,10]],[[7910,4428],[6,11],[2,2],[5,10],[-7,5],[-1,1],[-50,39],[-8,6],[9,16]],[[7866,4518],[8,-6],[26,-20],[24,-19],[8,-6]],[[7932,4467],[8,-6],[5,-4],[7,-6],[3,-1]],[[7869,4393],[-8,10],[11,19]],[[7872,4422],[14,24]],[[7886,4446],[9,-7],[9,-7],[6,-4]],[[7886,4446],[-42,33],[-17,12],[-11,10],[-7,5],[-4,5],[-8,6]],[[7822,4552],[3,-3],[32,-25],[9,-6]],[[6501,3793],[-7,-19],[-17,-41]],[[6477,3733],[-5,-9],[-3,-6],[-4,-5],[-6,-9],[-5,-6],[-7,-7]],[[6379,3781],[20,-10],[20,-10],[13,28],[14,17]],[[6446,3806],[2,-2],[3,-1],[4,0],[4,2],[2,3],[2,2],[19,-9],[10,-5],[9,-3]],[[6403,3841],[21,-11],[19,-10],[0,-4],[0,-2],[0,-3],[1,-2],[2,-3]],[[6582,3819],[-21,11],[-19,8],[-19,9],[-9,-22],[-13,-32]],[[6426,3903],[3,-1],[20,-10],[19,-9],[4,-2],[8,-4],[10,-5],[36,-17],[39,-18],[20,-10]],[[6523,3965],[1,-2],[2,-3],[1,-2],[0,-4],[12,-6],[18,-8],[19,-9]],[[6527,4004],[4,12],[4,9],[18,-9],[2,-1],[8,8],[7,5],[4,2],[4,1],[4,1],[7,0],[6,-2],[14,-6],[16,-8],[1,-2]],[[7359,4794],[-69,50]],[[7334,4748],[-36,26],[-4,-8],[-33,24]],[[7296,4678],[-35,26]],[[7269,4626],[-69,52]],[[7259,4593],[-40,31]],[[7219,4624],[-34,26],[-23,17]],[[7190,4582],[-8,4],[-15,8]],[[7167,4594],[2,8],[4,9],[7,13],[-29,22]],[[7219,4624],[-5,-10],[-6,-10],[-7,-13],[-11,-9]],[[7247,4555],[-6,3],[-44,21],[-7,3]],[[7251,4569],[-2,-6],[-2,-8]],[[7241,4535],[-7,4],[-7,3],[-5,2],[-39,19],[-23,11],[-35,17]],[[7133,4610],[34,-16]],[[7247,4555],[-3,-14],[-3,-6]],[[7234,4514],[-10,6],[-48,22]],[[7176,4542],[-58,29]],[[7241,4535],[-2,-6],[-3,-9],[-2,-6]],[[7162,4500],[-38,18],[-21,10]],[[7176,4542],[-4,-12],[-4,-11],[-3,-10],[-3,-9]],[[7162,4500],[-4,-10],[-4,-10],[-4,-11],[0,-2],[-4,-9]],[[7162,4500],[40,-20],[3,-1],[7,-4]],[[7212,4475],[-11,-19],[-16,-28]],[[7185,4428],[-7,-14],[-2,-1],[-1,-2]],[[7234,4514],[-12,-19],[0,-2],[-3,-4],[-7,-14]],[[7284,4476],[-50,38]],[[7332,4386],[-39,29]],[[7293,4415],[-9,7],[-9,6],[7,13],[-6,5],[-10,7]],[[7266,4453],[10,9],[8,14]],[[7305,4338],[-9,7],[-21,16],[-9,7],[-8,6],[-10,7]],[[7248,4381],[10,17]],[[7258,4398],[9,-7],[8,-6],[9,16],[9,14]],[[7283,4299],[-6,4]],[[7277,4303],[-3,3],[-21,15],[-9,7],[-8,6],[-10,8]],[[7226,4342],[6,11],[6,10],[7,11],[3,7]],[[7305,4338],[-10,-18],[-12,-21]],[[7215,4350],[11,-8]],[[7277,4303],[-6,-10],[-5,-9],[-5,-9],[-1,-2],[-5,-9],[-12,9]],[[7185,4428],[9,-6],[13,-10],[13,-10],[10,-7],[10,17],[9,-7],[9,-7]],[[7962,5097],[10,-5],[51,-26],[9,-4]],[[8032,5062],[-8,-20],[-7,-19]],[[7984,5141],[9,-5],[1,-1],[46,-24],[9,-5]],[[8049,5106],[-8,-22],[-9,-22]],[[8058,5129],[-9,-23]],[[8006,5182],[9,-4],[43,-23],[8,-5]],[[8066,5150],[-2,-4],[-6,-17]],[[8074,5170],[-8,-20]],[[8026,5219],[1,-1],[7,-3],[39,-21],[8,-5]],[[8081,5189],[-7,-19]],[[8089,5209],[-8,-20]],[[8099,5232],[-2,-3],[-8,-20]],[[8136,5160],[-8,-19]],[[8128,5141],[-9,4],[-37,20],[-8,5]],[[8089,5209],[9,-5],[8,-4],[21,-11],[8,-4],[9,-5]],[[8144,5180],[-8,-20]],[[8153,5203],[-1,-3],[-8,-20]],[[8190,5131],[-46,24],[-8,5]],[[8169,5095],[-40,22],[-8,4]],[[8121,5121],[7,20]],[[8150,5054],[-10,5],[-25,14],[-9,4]],[[8106,5077],[7,23]],[[8113,5100],[8,21]],[[7112,4117],[9,17]],[[7121,4134],[10,18]],[[7131,4152],[10,18],[-8,5],[-11,5],[-51,25],[-9,4]],[[7134,4264],[11,-4],[11,-7],[10,-10],[8,-11],[3,-7],[4,-10],[2,-15],[0,-4],[1,-17],[-2,-17]],[[6891,4103],[6,17]],[[6897,4120],[6,15]],[[6903,4135],[8,-5],[58,-27],[10,-5]],[[6903,4135],[6,17]],[[6909,4152],[9,-4],[57,-28],[10,-4]],[[6909,4152],[6,19]],[[6915,4171],[9,-5],[58,-28],[10,-4]],[[6915,4171],[7,18]],[[6922,4189],[66,-33],[10,-4]],[[6922,4189],[6,17]],[[6928,4206],[76,-36]],[[6928,4206],[7,18]],[[6935,4224],[9,-4],[57,-28],[9,-4]],[[6935,4224],[3,10],[4,10]],[[6942,4244],[75,-37]],[[6942,4244],[6,20]],[[6942,4244],[-63,31]],[[6935,4224],[-10,5],[-44,22],[-9,4]],[[6872,4255],[3,9],[4,11]],[[6928,4206],[-9,5],[-44,21],[-9,5]],[[6866,4237],[6,18]],[[6922,4189],[-9,4],[-18,9],[-27,12],[-9,4]],[[6859,4218],[7,19]],[[6909,4152],[-9,4],[-8,4],[-37,18],[-9,4]],[[6846,4182],[7,19],[6,17]],[[6897,4120],[-62,30]],[[6835,4150],[5,15]],[[6840,4165],[6,17]],[[6829,4133],[6,17]],[[6777,4195],[10,-5],[44,-21],[9,-4]],[[6790,4231],[7,18]],[[6797,4249],[9,-5],[44,-21],[9,-5]],[[6797,4249],[6,18]],[[6803,4267],[10,-5],[53,-25]],[[6803,4267],[2,7],[5,11],[6,20]],[[6816,4305],[-5,2],[-56,28]],[[6803,4267],[-8,4],[-45,22],[-9,4]],[[7965,4523],[-12,-19]],[[7953,4504],[-8,6],[-50,38],[-8,6]],[[7887,4554],[4,5],[3,4],[3,3],[5,6],[5,-3],[49,-39],[9,-7]],[[7866,4518],[9,17],[12,19]],[[7953,4504],[-11,-21],[-10,-16]],[[7959,4671],[3,-2],[7,-5],[4,-2],[27,-19],[26,-19],[2,-3],[6,-4]],[[8034,4617],[-32,6],[-33,1],[-21,-2],[-19,-5],[-5,-1],[-28,-10],[-17,-9],[-24,-16]],[[8225,4853],[-38,19],[-10,4]],[[8233,4878],[-7,-21],[-1,-4]],[[8284,4828],[-1,-4]],[[8283,4824],[-58,29]],[[8241,4895],[14,-12],[39,-32]],[[8294,4851],[-6,-11],[-4,-12]],[[8266,4935],[53,-44]],[[8319,4891],[-13,-20],[-12,-20]],[[8329,4803],[-4,5],[-41,20]],[[8319,4891],[15,-13],[4,-3],[14,-8]],[[8352,4867],[-7,-20],[-8,-23]],[[8362,4893],[-10,-26]],[[8279,4956],[18,-16],[35,-29]],[[8332,4911],[4,-4],[7,-4],[19,-10]],[[8304,4996],[18,-15],[17,-15],[-10,-17],[-1,-2],[1,-3],[15,-12],[-12,-21]],[[8313,5019],[79,-42]],[[8392,4977],[-3,-10],[-9,-25],[-18,-49]],[[8425,4960],[-11,5],[-6,4],[-16,8]],[[8328,5058],[9,-5],[69,-36],[8,-5],[1,0],[12,-7]],[[8427,5005],[-1,-22],[-1,-23]],[[8432,5056],[0,-5],[-2,-29]],[[8430,5022],[-1,-10],[-2,-7]],[[8479,4997],[-10,5],[-23,12],[-16,8]],[[8488,5025],[-1,-3],[-3,-11],[-5,-14]],[[7872,4422],[-15,12],[-55,42],[-2,-5]],[[7800,4471],[-16,12],[-8,7]],[[7869,4393],[-10,7],[-69,54],[6,11],[4,6]],[[7856,4371],[-9,7],[-70,54],[-5,-10],[-6,-10]],[[3424,1948],[-33,54],[-3,5]],[[3388,2007],[-3,4]],[[3385,2011],[17,14],[-10,16],[15,14],[1,1],[0,2],[-31,49],[17,14],[18,14],[13,12],[4,-1],[28,-46],[3,0],[16,13]],[[3385,2011],[-9,15],[-8,13],[-30,19],[-6,10],[-12,19]],[[3275,1912],[-24,9]],[[3388,2007],[-56,-48],[-57,-47]],[[3311,1854],[-24,38]],[[3287,1892],[-12,20]],[[3254,1652],[-17,29],[-5,8],[-12,21],[-4,5],[-13,19]],[[3203,1734],[4,4],[48,40],[-35,58],[17,14],[17,14],[17,14],[16,14]],[[8049,3664],[-24,19],[-6,4],[-11,8],[-9,7]],[[7999,3702],[4,9],[4,7],[5,10],[4,8],[4,7]],[[7999,3702],[-18,14],[4,8],[4,8],[-4,2],[-20,15],[4,8]],[[7969,3757],[4,9],[5,8]],[[7978,3774],[26,-18],[14,-11],[2,-2]],[[7999,3702],[-10,-18],[-7,-13]],[[7982,3671],[-11,-19],[-11,-20]],[[7874,3698],[28,51],[10,18]],[[7912,3767],[21,-15],[6,11],[6,11],[24,-17]],[[8032,3633],[-36,27],[-2,2],[-12,9]],[[7912,3767],[7,12],[5,10],[5,9],[5,9]],[[7934,3807],[20,-15],[8,-6],[16,-12]],[[7934,3807],[9,16],[8,15]],[[7951,3838],[28,-22],[8,15]],[[7987,3831],[39,-29],[0,-3],[-3,-6],[-3,-7],[16,-12]],[[7951,3838],[8,14]],[[7959,3852],[10,15],[3,7],[4,8]],[[7976,3882],[28,-21]],[[8004,3861],[-5,-8],[-3,-7],[-4,-6],[-5,-9]],[[8004,3861],[39,-29]],[[8043,3832],[7,-6],[9,-6]],[[7976,3882],[5,9],[4,7],[5,8],[4,8]],[[7994,3914],[66,-50],[-4,-8],[-5,-7],[-4,-8],[-4,-9]],[[7994,3914],[4,7],[6,11]],[[8004,3932],[-46,36]],[[7976,3882],[-46,35]],[[7930,3917],[5,9],[4,7],[8,15]],[[7947,3948],[5,8],[6,12]],[[7959,3852],[-13,10],[-33,25]],[[7913,3887],[9,15],[4,7],[4,8]],[[7913,3887],[-10,7],[8,15],[-37,29]],[[7874,3938],[4,7],[4,8],[5,9],[4,7]],[[7891,3969],[5,8],[4,7],[28,-21],[19,-15]],[[7888,3842],[-10,7],[-28,21],[-9,6]],[[7841,3876],[9,17],[4,8],[4,7],[3,6],[5,9]],[[7866,3923],[8,15]],[[7913,3887],[-8,-15],[-8,-14],[-9,-16]],[[7934,3807],[-46,35]],[[7912,3767],[-10,8],[-36,27]],[[7866,3802],[12,22]],[[7878,3824],[10,18]],[[7866,3802],[-11,-18],[-46,35],[10,18]],[[7819,3837],[6,11],[6,11],[47,-35]],[[7773,3871],[14,-10],[32,-24]],[[7794,3911],[47,-35]],[[7820,3958],[46,-35]],[[6582,3755],[-20,8],[-22,-59],[-21,9],[-21,10],[-21,10]],[[6203,3627],[19,-9],[50,-23],[7,23],[8,23],[8,23],[8,22],[7,21],[8,21],[-49,24],[-19,9]],[[7688,4681],[-5,-10],[-6,-11],[-48,37],[-9,10],[-9,6]],[[7704,4608],[-39,30],[-46,35],[-3,6],[-4,6],[-12,10]],[[7607,4543],[-11,9],[-9,8],[-32,26],[-11,8]],[[7594,4520],[-12,9],[-41,33],[-10,9]],[[8624,5710],[-47,26],[-9,5]],[[8568,5741],[13,31],[8,20],[8,20]],[[8653,5781],[-8,-20],[-8,-20],[-8,-20],[-5,-11]],[[8568,5741],[-2,2],[-9,4],[-53,29]],[[8480,5717],[8,19],[8,20]],[[8568,5741],[-8,-20],[-8,-20],[-7,-17],[-1,-3]],[[7853,5360],[-77,40]],[[7839,5334],[-9,5],[-2,1],[-65,33]],[[7827,5311],[-76,40]],[[7839,5334],[-12,-23]],[[7567,3823],[-35,26]],[[7557,3778],[-8,9],[-8,6],[-28,21]],[[8110,6557],[-3,2],[-3,2]],[[8057,6707],[10,19],[19,35],[2,3],[7,15],[6,11],[3,5],[1,2],[2,-2],[7,-7],[7,-8],[3,-4],[2,-2],[2,-2],[1,-2],[2,-2],[1,-1],[1,-2],[1,-2],[2,-2],[1,-2],[1,-1],[1,-2],[2,-3],[1,-2],[2,-2],[2,-4],[3,-3],[7,-12],[1,-2],[5,-6],[3,-4],[2,-2],[2,-3],[2,-2],[3,-3],[6,-6],[5,-3],[1,-1],[4,-3],[3,-2],[3,-1]],[[7054,6892],[-24,37]],[[7030,6929],[-12,20]],[[7018,6949],[44,38]],[[7062,6987],[13,-22],[11,-17]],[[7062,6987],[14,12]],[[7076,6999],[14,12]],[[7199,6666],[3,2],[2,0],[1,0],[15,-25],[3,-2],[2,2],[8,15],[-35,54],[-18,-16]],[[7176,6808],[23,13],[22,12],[48,27],[-2,3],[-15,23]],[[7367,6912],[5,3],[9,4],[9,6],[7,5],[6,5],[5,6],[7,7],[9,8],[6,6],[5,5],[6,4],[3,1],[6,3],[8,4],[13,5]],[[7049,4170],[8,-4],[55,-28],[2,-1],[7,-3]],[[7055,4189],[76,-37]],[[7225,4241],[86,-23],[13,-4],[1,0],[4,-3],[6,-3],[23,-15],[9,-4],[10,-1],[5,0],[28,0],[13,-2],[8,-2]],[[7283,4299],[17,-13],[34,-27],[9,-6],[9,-7]],[[7352,4246],[34,-25],[22,-17],[7,-4],[20,-15]],[[7375,4286],[-5,-9],[-5,-9],[-6,-10],[-7,-12]],[[7464,4286],[6,13],[7,12],[8,13]],[[7485,4324],[58,-44],[9,-7]],[[7485,4324],[7,14],[6,12]],[[7498,4350],[6,11],[7,11]],[[7643,5148],[-1,-3],[-12,-24],[-10,-18],[-9,-18],[-16,-31]],[[7698,5065],[-9,-19],[-24,12],[-13,-33]],[[7652,5025],[-17,9],[-2,1],[-15,7],[-10,5],[-13,7]],[[7643,5148],[10,-6],[6,-4],[51,-25],[10,-6]],[[7720,5107],[-12,-24],[-10,-18]],[[7646,4967],[-69,53]],[[7652,5025],[20,-10]],[[7672,5015],[-8,-15],[-6,-11]],[[7658,4989],[-6,-11],[-6,-11]],[[7622,4922],[-69,53]],[[7646,4967],[-6,-12],[-6,-11],[-6,-11],[-6,-11]],[[7610,4899],[-59,45],[-10,7]],[[7910,2498],[10,17],[11,17]],[[7931,2532],[10,18],[38,-31]],[[7866,2535],[14,13],[14,13]],[[7894,2561],[37,-29]],[[7821,2526],[8,19],[9,19],[8,19],[8,20],[9,19]],[[7863,2622],[13,-11],[9,-7],[15,-12],[33,30]],[[7933,2622],[12,-16],[-13,-11],[-17,-15],[-5,-6],[-16,-13]],[[7863,2622],[10,18],[11,18],[10,13],[14,14]],[[7908,2685],[15,15],[7,7],[2,2]],[[7956,2645],[-2,-3],[-21,-20]],[[7863,2622],[-43,34]],[[7856,2706],[4,4],[14,16]],[[7874,2726],[7,-8],[6,-7],[13,-16],[8,-10]],[[7874,2726],[14,16],[5,6],[15,17],[1,2],[1,1]],[[7765,2786],[20,35],[5,8]],[[7790,2829],[34,50],[3,4]],[[7911,2957],[-1,-3],[-8,-10],[-6,-8]],[[7790,2829],[-5,4],[-24,16]],[[7761,2849],[3,4],[31,47]],[[7761,2849],[-17,-18],[-13,-21],[-16,-23]],[[7646,4967],[69,-53]],[[7658,4989],[60,-46],[8,-7]],[[7672,5015],[21,-12],[55,-26]],[[7698,5065],[66,-33],[10,-5]],[[7720,5107],[12,24]],[[7732,5131],[10,-5],[2,-1],[53,-26],[3,-2],[8,-4]],[[7732,5131],[11,21]],[[7743,5152],[10,-5],[55,-28],[3,-1],[9,-5]],[[7743,5152],[13,22],[12,23]],[[7768,5197],[11,23]],[[7779,5220],[9,-5],[55,-28],[12,-6]],[[7743,5152],[-11,5],[-19,10],[-16,8],[-19,9],[-3,2],[-9,4]],[[7690,5236],[3,-1],[4,-3],[1,0],[17,-9],[3,-1],[13,-7],[27,-14],[10,-4]],[[7827,5311],[-12,-24],[-12,-23],[-24,-44]],[[7827,5311],[9,-5],[2,-1],[55,-27],[10,-6]],[[7434,2220],[-9,7],[-5,4],[-36,27],[-2,2],[-10,6],[-14,10],[-6,5]],[[7352,2281],[2,1],[21,18],[3,2],[2,2]],[[7380,2304],[1,1],[3,2],[0,1],[2,1],[15,14],[3,3],[3,2],[9,9],[2,1],[1,1]],[[7419,2339],[49,43],[24,22],[16,15]],[[7508,2419],[65,-42],[2,-1],[27,30],[5,5]],[[7607,2411],[-1,-4],[-2,-8],[-10,-39],[-2,-5]],[[7607,2411],[4,5],[16,19]],[[7627,2435],[14,-12],[4,-3],[7,-5],[16,-13],[5,-4],[30,-23],[3,-2]],[[7642,2313],[-55,-51],[-17,-26],[-7,-10],[-3,-2]],[[7647,2310],[-1,-5],[-17,-30],[-7,-14],[11,-8],[6,-5],[4,-3],[16,8],[-1,-11],[-2,-14]],[[7685,2519],[-5,-7],[-5,-7],[17,-17],[11,-12],[-13,-19],[19,-16],[14,10],[4,2],[15,11]],[[7328,1095],[5,23]],[[7436,1089],[-8,-8],[-10,-11],[-6,1],[-84,24]],[[7333,922],[-3,3],[-3,3]],[[7327,928],[-2,3],[-2,1]],[[7323,932],[14,16],[24,27],[21,23],[14,16],[7,10],[-13,3],[-42,12],[-4,2],[-5,2],[-5,1],[-5,0],[-11,3]],[[7318,1047],[5,23],[5,25]],[[7464,1065],[-39,-46],[-2,-2],[-43,-46],[-44,-46],[-3,-3]],[[7323,932],[-4,2],[-5,2],[-6,0],[-9,0],[-8,2],[-25,7],[-13,3]],[[7253,948],[10,12],[11,12],[-1,2],[-1,3],[-32,25],[10,18],[24,-20],[14,15],[30,32]],[[7318,1047],[-23,6],[-23,6],[-11,4],[6,23],[5,25],[5,24]],[[7253,948],[-36,9],[-12,4],[-10,2],[-7,0]],[[7053,764],[61,74],[-10,9],[-30,25]],[[7074,872],[21,21],[18,22]],[[7113,915],[3,4],[14,-19],[12,19],[19,32],[1,2],[1,3],[-1,3],[-8,4]],[[7253,948],[-4,-3],[-9,-10],[-5,-6],[-39,25],[-9,-17],[34,-23],[-2,-8],[50,-32],[13,14],[27,28],[1,1],[0,2],[1,3],[0,3],[1,-2],[0,-2],[0,-3],[-1,-4],[-1,-3],[-2,-3],[17,17],[2,3]],[[7333,922],[-3,-3],[-1,-2],[-101,-104],[-15,-17],[-47,-50],[-1,-1],[-12,-10],[-10,-8]],[[7845,4003],[9,-6],[1,-1],[36,-27]],[[2315,2374],[-2,-8],[0,-3],[15,-39],[1,-3],[2,-1],[3,0],[-20,-64],[-4,-11],[-8,-15],[-4,4],[-4,4],[-3,5],[-1,6],[1,6],[5,11],[-3,1],[-3,1],[-3,0],[-2,-1],[-19,-10],[-1,-2],[10,-27],[0,-3],[-1,-3],[-2,-3],[-3,-6],[-13,7],[-18,51]],[[2386,2333],[-17,-14],[-11,-9],[-4,-4],[-4,-5],[-3,-7],[-18,-56],[-7,-13],[-11,-21],[-12,-21],[-3,-8],[-12,-33]],[[2428,2260],[-37,-47]],[[2464,2222],[39,-63]],[[2503,2159],[-4,-4],[-5,-4],[-15,-15],[-27,-26],[-16,-15],[-3,-2],[-1,0],[-3,-1],[-1,0],[-8,0],[-3,1],[-3,0],[-3,0],[-3,0],[-3,-1],[-3,-2],[-2,-1],[-1,-1],[-2,-1],[-27,-26]],[[2434,2272],[30,-50]],[[6193,991],[0,1],[-6,3],[-7,0],[-7,-2],[-5,-4],[-4,-5],[-7,-4],[-10,-3],[-10,-1],[0,65],[-19,1],[-11,0],[0,45],[-18,0]],[[6089,1087],[1,75],[0,4]],[[6090,1166],[28,9]],[[6510,1298],[0,-1],[1,-4],[1,-1],[1,-3],[1,-4],[0,-2],[1,-3],[0,-3],[1,-13],[-1,-8],[-2,-4],[-3,-11],[-3,-9],[-3,-10],[-4,-14]],[[6500,1208],[-10,-10],[-31,-28],[-28,-21],[-21,-16],[-24,-15],[-25,-13],[-28,-18],[-20,-15],[-33,-25],[-17,-14],[-28,-17],[-15,-9],[-17,-11],[-10,-5]],[[6204,963],[0,9],[-2,7],[-4,7]],[[6198,986],[3,2],[7,2],[4,-2],[3,1]],[[6211,966],[-2,-1],[-5,-2]],[[6203,961],[8,4]],[[6209,957],[-3,-2],[-1,0],[-2,-1],[0,7]],[[6089,1087],[-18,0],[-18,1],[-22,0]],[[6031,1088],[1,55],[-19,-6],[-19,-6]],[[5994,1131],[-1,5],[78,24],[3,1],[16,5]],[[6031,1043],[0,45]],[[6089,1087],[1,-44],[-9,0],[0,-63]],[[6081,980],[-11,3],[-17,1],[-22,0],[0,59]],[[6031,1043],[-19,0],[1,45],[-19,0],[-20,1]],[[5975,1125],[19,6]],[[6081,980],[0,-10]],[[6081,970],[-21,1],[-6,1],[-23,4],[-14,3],[-43,5]],[[5974,986],[0,56],[0,5],[0,31]],[[5977,881],[27,-8],[22,-1],[25,4],[22,9],[7,3]],[[6080,888],[-2,-21]],[[6078,867],[-12,-6],[-21,-2],[-6,0],[-9,-3],[-7,0],[-4,-2],[-4,0],[-7,-6],[-11,-2],[-14,1],[-8,2]],[[5978,929],[3,-2],[77,-24],[22,12]],[[6080,915],[0,-4],[0,-2]],[[6080,909],[-14,-7],[-12,-5],[-12,1],[2,-3],[-1,0],[-11,1],[-21,0],[-12,1],[-12,4],[-5,2],[-4,3]],[[5975,979],[12,-4],[12,-1],[10,2],[7,0],[16,-3],[31,-7],[17,0]],[[6080,966],[0,-3],[0,-3]],[[6080,960],[-4,0],[-13,-3],[-17,-2],[-12,0],[-18,3],[-5,2],[-27,6],[-7,1],[-1,1]],[[6211,867],[-12,8],[-10,11],[-28,6],[-6,2],[-16,0],[-12,-4],[-11,-4],[-6,-4],[-1,-1],[-22,-11],[-9,-3]],[[6080,888],[5,2],[18,11],[27,16],[6,3],[6,4],[5,7],[-1,3],[3,1],[30,16],[19,6],[5,4]],[[6193,991],[-10,-5],[-26,-10],[-20,-5],[-18,0],[-22,-1],[-16,0]],[[6204,963],[-7,-1],[-8,3],[-15,-11],[-26,-15],[-3,-1],[0,1],[-10,1],[-55,-31]],[[6080,915],[59,32],[0,1],[7,4],[0,3],[16,9],[10,4],[15,10],[4,3],[3,4],[4,1]],[[6096,939],[-2,0],[-2,0],[0,3],[0,10],[6,5],[4,1],[2,3],[2,3],[4,2],[7,0],[2,1],[8,0],[5,0],[2,-8],[-3,-3],[-35,-17]],[[6080,966],[23,0],[-2,-4],[-4,0],[-17,-2]],[[4784,1039],[0,-13],[-2,-7],[-2,-9],[-8,-13],[-11,-10],[-7,-9],[-3,-17],[-3,-3],[-5,-3],[-11,-10],[-4,-2],[-8,0],[-5,-1],[-14,6],[-20,5],[-17,8],[-18,2],[-20,5],[-20,15],[-9,15],[1,8],[3,6],[4,8],[12,10],[9,13],[8,7],[4,1],[6,0],[14,-4],[15,-3],[29,3],[14,4],[17,1],[12,-4],[6,-3],[8,-3],[20,0],[5,-3]],[[8225,4853],[-8,-19]],[[8217,4834],[-17,8],[-9,-24],[-7,-19],[-14,6],[-5,-15]],[[8165,4790],[-10,5],[-26,13]],[[8129,4808],[14,37],[7,19]],[[8150,4864],[8,21]],[[8217,4834],[-16,-43],[66,-33]],[[8267,4758],[-13,-34],[-17,9],[-8,4],[-15,7],[-9,5],[-16,8],[-31,15]],[[8158,4772],[7,18]],[[8283,4824],[-7,-19],[-1,-6],[0,-17],[-8,-24]],[[8305,4738],[-22,12],[-16,8]],[[8292,4576],[-60,12],[-19,2],[-61,10],[-36,6],[-32,4],[-31,5]],[[8053,4615],[4,6],[6,11],[5,10],[6,16],[11,28],[12,33]],[[8097,4719],[1,-1],[5,-2],[4,7],[4,7],[4,9],[5,8],[4,7],[14,-7],[9,-5],[5,12],[6,18]],[[9689,9681],[2,4],[1,4],[0,3],[3,4],[5,5],[6,6],[7,7],[5,7],[1,7],[1,9],[-2,2],[-8,2],[-6,1],[-18,33]],[[9766,9812],[7,-15],[1,-6],[2,-6],[0,-3],[0,-11],[-1,-10],[-26,7],[-2,-3],[-5,-33],[-2,-9],[0,-6],[-1,-4],[-3,-6],[-6,-9],[-12,-15],[-4,-4],[-1,-2],[-2,-1],[-22,5]],[[8010,5802],[-12,-30],[-9,4],[-12,6],[-21,-39],[-15,7]],[[8504,5582],[-1,-3],[-3,-5],[-11,-28],[-12,-29],[-8,-21]],[[8703,5618],[-9,-21],[-3,-11],[-29,-91],[66,-36]],[[8728,5459],[-1,-3],[-19,-59],[0,-5],[-4,-12]],[[8544,5681],[6,-3],[1,-2],[49,-27],[4,11],[4,10]],[[8608,5670],[40,-22],[31,-17],[9,-5],[15,-8]],[[8624,5710],[-4,-10],[-4,-10],[-4,-10],[-4,-10]],[[8711,5638],[-8,-20]],[[8624,5710],[41,-22]],[[8665,5688],[31,-17],[9,-5],[14,-8]],[[8719,5658],[-8,-20]],[[8693,5758],[-8,-19],[-8,-20],[-8,-20],[-4,-11]],[[8732,5690],[-13,-32]],[[8748,5728],[-8,-19],[-8,-19]],[[8797,5653],[-9,5],[-1,1],[-21,12],[-8,4],[-17,9],[-9,6]],[[8748,5728],[9,-5],[47,-26],[9,-5]],[[8776,5602],[-40,21],[-16,10],[-9,5]],[[8797,5653],[-9,-21],[-4,-10],[-4,-10],[-4,-10]],[[8838,5592],[-13,7],[-5,-10],[-4,-10],[-40,23]],[[8845,5503],[-1,-3],[-33,-104],[-4,-12],[-4,-14],[-5,-16],[-7,-25],[-1,-3]],[[8790,5326],[-1,1],[-25,18],[-22,14],[-7,4],[-31,17]],[[8728,5459],[32,102],[4,11],[4,10],[4,10],[4,10]],[[9010,5560],[-8,-20],[8,-5],[52,-29],[10,-5],[1,-4]],[[8892,5625],[-4,-10],[-3,-10],[-4,-9],[-3,-10],[62,-35],[5,10],[3,9],[-3,1],[8,20]],[[4560,3691],[-5,-8],[-8,-8],[-11,-8],[-15,-10],[-9,-9],[-21,-19],[-8,-9],[-6,-7],[-9,-10],[-7,-8],[-10,-9],[-28,-19],[-45,-22],[-22,-16]],[[4292,3588],[10,4],[8,3],[7,3],[10,7],[6,6],[3,5],[4,8],[1,10],[3,1],[8,6],[3,4],[23,17],[6,3],[4,0],[15,-1],[14,-3],[7,-2],[0,-23],[-2,-5],[0,-1],[11,5],[8,5],[7,6],[5,3],[1,0],[3,0],[9,-4],[-1,14],[5,6],[5,0],[7,2],[7,10],[4,4],[13,14],[3,15],[2,22],[0,15],[7,20],[8,14],[8,11],[15,24],[4,5],[3,2],[11,-2],[2,2],[2,5],[9,2],[3,0],[1,-12],[2,-4],[6,4],[15,22],[18,28],[3,-3],[5,3],[8,10],[24,36],[7,20],[1,20],[6,9],[3,15],[6,15],[0,8],[2,14],[12,5],[13,6],[1,3]],[[4716,4029],[1,-5],[36,-36]],[[4404,3716],[-6,-1],[-4,5],[-5,9],[-1,9],[-4,20],[0,17],[4,7],[14,12],[6,9],[7,8],[29,19],[14,6],[8,5],[8,0],[6,-2],[5,-5],[0,-8],[0,-10],[-8,-26],[-1,-13],[-5,-29],[-4,-9],[-4,-6],[-6,-5],[-7,-10],[-5,-4],[-17,-1],[-24,3]],[[4412,3456],[-56,73]],[[9689,9681],[-1,-9],[-4,-19]],[[9684,9653],[-52,14],[-17,4],[-6,3],[-9,5]],[[9675,9602],[9,51]],[[7266,4453],[-9,-11],[-11,8],[-24,18],[-10,7]],[[8176,3051],[-3,4],[-10,8],[-2,1],[-2,2],[-3,1],[-1,1],[-4,3],[-12,10]],[[8142,5032],[-8,-21]],[[8134,5011],[-33,17],[-9,4]],[[8092,5032],[6,23],[8,22]],[[8092,5032],[-10,5],[-2,1],[-17,9],[-22,10],[-9,5]],[[8058,5129],[9,-5],[14,-7],[23,-12],[9,-5]],[[8079,4993],[-10,5],[-42,21],[-10,4]],[[8092,5032],[-7,-20],[-6,-19]],[[8066,4954],[-7,-19]],[[8079,4993],[-7,-20],[-6,-19]],[[8113,4932],[-9,4],[-28,14],[-10,4]],[[8134,5011],[-14,-39],[-7,-19],[0,-21]],[[8113,4882],[-14,6],[-39,20],[-9,4]],[[8113,4932],[0,-24],[0,-26]],[[8150,4864],[-2,1],[-28,13],[-7,4]],[[8129,4808],[-2,1],[-21,11],[-9,4]],[[8097,4824],[1,6],[1,4],[2,9],[4,10],[3,9],[-55,27],[-9,5]],[[8097,4824],[-9,5],[-48,23],[-9,5]],[[8090,4806],[-9,4],[-48,24],[-9,5]],[[8097,4824],[-7,-18]],[[8457,4942],[-32,18]],[[8479,4997],[-7,-16]],[[8472,4981],[-3,-9],[-4,-10],[-4,-10],[-4,-10]],[[8542,4944],[-10,5],[-60,32]],[[8488,5025],[10,-5],[59,-32]],[[8530,4904],[-49,26],[-24,12]],[[8503,4823],[-12,6],[-48,24],[-11,5],[-13,7]],[[8419,4865],[2,30],[1,26],[1,14],[2,25]],[[8493,4797],[-11,5],[-41,21],[-24,11]],[[8417,4834],[1,11],[0,6],[1,14]],[[8408,4789],[3,11],[2,6],[2,7],[1,4],[1,17]],[[3203,1734],[-34,59],[-4,7],[-12,21],[-26,43]],[[3167,1567],[-16,63]],[[3151,1630],[-33,129]],[[3151,1630],[-4,-1],[-9,5],[0,-3],[0,-2],[-2,-1],[-20,-8]],[[3116,1620],[-4,2],[-5,1],[-3,-2],[-9,-7]],[[3163,1566],[-8,-2],[-20,-18]],[[3135,1546],[-19,74]],[[3008,1441],[-17,-14]],[[2991,1427],[-7,28],[-7,26],[-24,-19],[-2,-2],[-2,0],[-2,1],[-8,14],[-2,3],[0,2],[2,3],[49,39]],[[3135,1546],[-19,-15],[-17,-15],[-18,-15],[-18,-14],[-17,-14],[-19,-17],[-19,-15]],[[3082,1349],[-18,-8],[-20,-9],[-16,68],[-6,12],[-4,7],[-6,9],[-4,13]],[[3193,1447],[-14,-5],[-30,-11],[-6,-4],[-4,12],[-16,-5],[-2,-2],[-1,-2],[9,-34],[-22,-10],[-10,-5],[-1,-2],[5,-22],[-19,-8]],[[3090,1320],[-3,6]],[[3087,1326],[-5,23]],[[3087,1326],[-55,-26],[-30,-12],[-9,34],[-23,-7],[-20,86],[-2,6],[4,7],[11,-7],[8,2],[20,18]],[[2757,1440],[60,-6]],[[2817,1434],[65,2],[-63,131],[30,23],[-12,21]],[[2817,1434],[-4,19]],[[2813,1453],[-6,23],[-5,16],[-1,8],[-1,9],[-2,15],[-1,9]],[[2797,1533],[-3,9],[-6,12],[-7,10],[13,11],[6,5],[7,5],[11,10],[3,3]],[[2821,1598],[3,2],[10,8],[3,3]],[[2813,1453],[-13,-4],[-35,0],[-21,0],[-37,0]],[[2707,1449],[-5,24],[-6,34],[-2,8],[-9,22],[-10,23]],[[2675,1560],[6,2],[9,3],[10,7],[25,21],[5,-7],[9,-11],[-33,-28],[-1,-2],[0,-2],[10,-19],[22,19],[1,1],[1,-1],[7,-6],[7,-10],[6,5],[7,1],[8,0],[23,0]],[[2675,1560],[-12,29]],[[2663,1589],[19,7],[14,6],[9,5],[11,9],[14,10],[12,-19],[19,17],[16,12],[11,10],[1,1],[1,0],[2,0],[1,-1],[0,-1],[28,-47]],[[2707,1449],[-20,0],[-1,1],[-1,1],[-6,32],[-1,2],[-2,0],[-18,1],[-1,-1],[-6,-9],[9,-9],[1,-3],[2,-10],[1,-4],[-1,-1],[-1,0],[-13,0],[-4,1],[-12,10],[-13,11],[-1,1],[-2,0],[-20,1],[-2,0],[-1,1],[0,1],[-1,2],[0,2],[1,17]],[[2594,1496],[0,22],[0,24],[0,17],[1,25],[21,0],[22,1],[11,1],[14,3]],[[2594,1496],[-74,0],[-20,1],[-1,26],[-17,0],[-1,0],[-1,1],[-1,3],[2,20],[-1,20],[1,3],[2,0],[15,0],[2,-2],[0,-2],[0,-23],[17,0],[3,0],[1,42],[-59,0],[-25,0],[-8,-1],[-4,-3],[-14,-10]],[[8245,3572],[-7,-14],[-13,-24],[-27,-52],[-6,-12],[-9,-17]],[[8083,4787],[-9,5],[-48,24],[-9,4]],[[8090,4806],[-7,-19]],[[8077,4769],[-10,4],[-48,24],[-9,5]],[[8083,4787],[-6,-18]],[[8102,4734],[-2,1],[-21,11],[-9,4],[-9,5],[-48,24],[-10,4]],[[8077,4769],[9,-5],[20,-10],[3,-2]],[[8109,4752],[-3,-9],[-4,-9]],[[8129,4808],[-3,-9],[-3,-10],[-4,-9],[-3,-9],[-7,-19]],[[8097,4719],[3,7],[2,8]],[[8053,4615],[-4,-7]],[[8049,4608],[-2,2],[-4,1],[-9,6]],[[7991,4747],[11,-11],[53,-27],[9,25],[-9,5],[-48,23],[-10,3]],[[8010,4543],[-12,-19]],[[7998,4524],[-2,2],[-8,6],[-5,4],[-8,6],[-10,-19]],[[7975,4486],[12,20],[11,18]],[[2944,3456],[-7,-2]],[[2937,3454],[-10,24],[-2,4],[-14,29]],[[2911,3511],[11,6],[4,1],[7,2],[7,1],[8,5],[10,6],[-6,12],[-3,6],[-8,19],[9,6],[4,3],[4,5],[5,8],[3,10],[1,7],[-1,10],[-2,7],[-13,29]],[[2951,3654],[32,-6],[34,-6],[18,-3],[3,1],[3,0]],[[2791,3388],[-15,24]],[[2776,3412],[20,11],[1,3],[-5,10],[-3,6],[-1,6],[0,6],[1,7],[1,5],[4,17],[0,9],[0,6],[-1,6],[-1,4],[-7,18],[-2,4]],[[2783,3530],[31,15],[8,5],[13,6],[11,4],[11,2],[10,1],[7,0]],[[2874,3563],[21,-5],[-1,-9],[0,-3],[8,-16],[9,-19]],[[2937,3454],[-15,-5],[-42,-10],[-31,-8],[-10,-3],[-21,-15],[-7,-6],[-20,-19]],[[2832,3313],[-14,29],[-11,22],[-16,24]],[[2978,3381],[-31,-14]],[[2947,3367],[-39,-18],[-47,-22],[-29,-14]],[[3146,3440],[-3,-3],[-5,9],[-31,-26],[-30,-22]],[[3077,3398],[-38,-27],[-27,-25],[-8,-5]],[[3004,3341],[-3,13],[-41,-17],[-12,27],[-1,3]],[[3114,3269],[-25,-12],[-11,-6],[-11,-10],[-10,-9],[-14,-18]],[[2977,3296],[-4,11],[-2,5]],[[2971,3312],[17,13],[16,16]],[[3077,3398],[6,-5],[8,-6],[-5,-10],[-3,-9],[-3,-15],[-5,-23],[8,-3],[7,-4],[5,-6],[6,-7],[4,-10],[2,-8],[7,-23]],[[3212,3327],[-3,-3],[-18,-13],[-12,-7],[-14,-11],[-13,-7],[-16,-7]],[[3136,3279],[-22,-10]],[[7576,2516],[0,11],[1,15],[-1,3],[0,4],[-2,3],[-1,3],[-3,2],[-9,8]],[[7561,2565],[-64,47]],[[7516,2500],[15,23],[14,19],[16,23]],[[7576,2516],[-3,-6],[-10,-13],[-15,-20],[-2,1],[-10,8],[-20,14]],[[7508,2419],[-10,11],[-4,1],[-2,2],[-11,8],[-3,4]],[[7478,2445],[22,32],[13,18],[3,5]],[[7478,2445],[-16,11],[-15,11],[-16,12],[-7,6],[-11,-12],[-10,3]],[[7453,2548],[33,-25],[30,-23]],[[7478,2445],[-12,-17],[-8,-12],[-61,45],[-2,3]],[[7419,2339],[-2,1],[-4,2],[-5,4],[-6,5],[-56,42]],[[7380,2304],[-5,4],[-16,12],[-8,6],[-13,9],[-22,17],[-1,1],[-4,3],[-1,1]],[[8352,4867],[10,-5],[41,-20],[3,-2],[11,-6]],[[8499,5050],[12,-7],[3,-1],[4,12],[33,-17],[4,11],[11,-6],[9,-5],[3,-1]],[[8518,5096],[11,-6],[46,-24],[9,-5],[3,-2]],[[8618,5139],[-31,-80]],[[8549,5176],[67,-36],[2,-1]],[[8569,5225],[10,-5],[48,-26],[8,-5],[3,-1]],[[8638,5188],[-10,-25],[-10,-24]],[[8587,5273],[10,-6],[48,-26],[8,-5],[3,-1]],[[8656,5235],[-9,-24],[-9,-23]],[[8674,5282],[-9,-24],[-9,-23]],[[8738,5162],[-24,13],[-9,-24],[-10,6],[-2,1],[-46,25],[-9,5]],[[8757,5065],[-41,22],[-1,0]],[[8715,5087],[8,25],[8,25]],[[8688,5005],[18,50],[9,32]],[[3733,2721],[-98,-76],[-2,-2],[-1,-1]],[[3581,2834],[10,10],[43,30],[17,11],[14,10],[-11,79]],[[3654,2974],[12,-19],[3,-15],[19,6],[-6,23],[-11,19],[17,13],[21,17]],[[3709,3018],[6,-10],[4,-26],[6,-25],[19,7],[9,-42],[3,-20],[1,-16]],[[4001,2937],[-43,-35],[-67,-54]],[[3820,2949],[18,0],[1,10],[4,10],[5,6],[27,21],[10,-17],[12,-19],[19,15],[42,34]],[[3958,3009],[32,-54],[11,-18]],[[3709,3018],[14,10],[13,2]],[[3736,3030],[21,2]],[[3757,3032],[5,1],[6,2],[8,5],[32,24],[10,-17],[10,-17],[9,-17],[3,-1],[21,17],[15,15],[14,18],[12,18]],[[3902,3080],[21,-19],[13,-15],[22,-37]],[[3757,3032],[-3,21],[77,61],[12,-16],[15,17]],[[3858,3115],[13,-13],[13,-10],[18,-12]],[[3736,3030],[-1,8],[-12,21],[-3,11],[-4,31]],[[3716,3101],[19,6],[11,6],[70,55]],[[3816,3168],[13,-12],[8,-11],[2,-4],[11,-16],[8,-10]],[[3711,3146],[6,2],[5,2],[6,4],[3,3]],[[3731,3157],[42,32],[18,13]],[[3791,3202],[7,-13],[8,-11],[10,-10]],[[3749,3291],[2,-2],[2,-4],[5,-51],[0,-3],[-2,-2],[-24,-19],[-1,-42],[0,-11]],[[3774,3298],[3,-35]],[[3777,3263],[3,-22],[3,-18],[8,-21]],[[3855,3198],[-39,-30]],[[3777,3263],[14,2],[64,-67]],[[3915,3234],[-44,-23],[-16,-13]],[[3826,3326],[-2,-2],[-16,-11],[-3,-2],[-5,0],[-1,-15],[17,-20],[50,-55],[35,24],[1,1],[0,-1],[7,-8],[6,-3]],[[7262,826],[76,80],[2,2],[2,2],[3,3],[3,4],[5,6]],[[7113,915],[-45,0],[5,21],[54,0],[9,14],[6,10],[2,4]],[[7074,872],[-36,-38]],[[7028,842],[27,93],[-19,1],[7,24],[1,5]],[[6616,5393],[12,28],[8,17],[17,33],[9,19]],[[6572,5425],[9,27],[2,4],[5,12],[9,18],[9,18]],[[6606,5504],[10,18]],[[6572,5425],[-4,3],[-35,24],[-16,11],[-3,2]],[[6514,5465],[7,23],[4,10],[5,10]],[[6530,5508],[9,18],[9,18]],[[6548,5544],[58,-40]],[[6548,5544],[10,19]],[[6558,5563],[9,17],[12,26],[2,3],[9,17]],[[6530,5508],[-58,40]],[[6472,5548],[9,18],[9,19],[9,18]],[[6499,5603],[59,-40]],[[6499,5603],[6,12],[3,6]],[[6508,5621],[2,4],[11,21],[2,3],[8,18]],[[6455,5505],[-46,32]],[[6409,5537],[10,22],[5,11],[4,8],[6,12],[12,25]],[[6446,5615],[12,23],[6,13]],[[6464,5651],[44,-30]],[[6472,5548],[-6,-9],[-3,-10],[-8,-24]],[[2503,2159],[29,-49]],[[2503,2159],[10,10],[0,3],[10,-18],[16,13],[65,56],[-12,19],[15,13]],[[2607,2255],[16,14],[17,14],[16,14],[18,-29],[11,-18],[62,54]],[[2747,2304],[51,44],[4,-4],[5,5],[15,13],[3,3]],[[2825,2365],[3,-4]],[[2464,2222],[11,13],[30,25],[10,-18],[6,5],[8,8],[10,14],[21,41]],[[2560,2310],[8,-5],[9,-7],[7,-8]],[[2584,2290],[12,-17],[11,-18]],[[2389,2380],[2,-3],[2,-4],[2,-3],[11,-18],[22,-37],[52,43],[16,14]],[[2496,2372],[17,-28],[5,-6],[8,-6],[17,-11],[17,-11]],[[2536,2504],[3,-5],[3,-6]],[[2542,2493],[-31,-26]],[[2511,2467],[-48,-40],[6,-11],[27,-44]],[[2511,2467],[10,-19],[11,-18],[11,-18],[-15,-13],[18,-30],[1,-2],[-10,-14],[-2,0],[-3,1],[-4,5],[-16,26],[-16,-13]],[[2542,2493],[12,9],[7,4],[9,-22],[17,-28],[5,-6],[20,-14],[4,-3],[4,-4],[6,-4],[7,-12],[13,-21],[6,-5],[4,-2]],[[2656,2385],[-6,-12],[-2,-8]],[[2648,2365],[-4,-19],[-2,-6],[-3,-3],[-55,-47]],[[2734,2450],[-13,-7],[-4,-3],[-33,-28],[-19,-15],[-6,-7],[-3,-5]],[[2760,2473],[-3,-3],[-23,-20]],[[2714,2357],[-32,-28],[-20,7],[3,13],[1,6],[1,5],[-19,5]],[[2734,2450],[19,-32],[12,-18],[-36,-30],[-15,-13]],[[2747,2304],[-11,18],[-11,17],[-11,18]],[[2760,2473],[65,-108]],[[2779,2488],[43,-69],[3,-4],[4,0],[18,15],[3,5],[8,20],[14,13],[-8,14],[21,17],[18,16]],[[2883,2571],[3,-6],[9,-15],[2,-12],[2,-12],[4,-11]],[[2923,2611],[16,21]],[[2852,2767],[8,-13],[7,-4],[27,-18],[-3,-7],[-9,-14],[-15,-16]],[[2920,2824],[11,-19],[-46,-40],[18,-12],[22,18],[3,-1],[13,-18],[8,-8],[8,-6],[18,-8],[20,-9]],[[8244,3448],[38,-30],[6,11],[-2,10],[8,14],[10,21],[-1,2],[-6,4],[-25,19],[-28,-51]],[[7803,1101],[-31,8]],[[7772,1109],[2,12],[4,23],[5,22],[3,23]],[[7786,1189],[73,-20],[14,20],[13,20],[9,12]],[[7934,1216],[-32,-44],[-37,-53],[-20,-28]],[[7845,1091],[-42,10]],[[7786,1189],[5,22],[4,23],[2,10]],[[7772,1109],[-64,17]],[[7708,1126],[2,12],[5,23],[4,22],[4,23],[4,22],[-38,10],[4,23],[-58,15],[-9,4]],[[7701,1092],[4,23],[3,11]],[[7803,1101],[-7,-10],[-10,-21],[-9,-17],[-6,-14],[-5,-7],[-42,11],[-31,8],[4,21],[4,20]],[[7566,1164],[142,-38]],[[7701,1092],[-71,19]],[[7554,1166],[3,8],[28,59],[15,39],[1,1],[4,7]],[[7590,1280],[-53,-106],[0,-2]],[[7716,979],[17,18],[16,18],[-99,26]],[[7845,1091],[-8,-11],[-20,-25],[-26,-29],[-16,-10],[-15,-19],[-10,-8],[-8,-6],[-5,-12]],[[8099,2087],[-4,-70]],[[8056,2451],[35,35],[43,45]],[[8031,2526],[9,13],[2,6],[1,8],[2,8],[7,8],[7,10],[7,12],[2,2]],[[8101,2562],[16,-15],[17,-16]],[[5497,3222],[4,6],[31,42]],[[5532,3270],[7,-9],[4,-5],[4,-11],[14,7],[2,3],[14,18],[2,0],[3,-1],[14,-14],[15,-15]],[[5529,3272],[3,-2]],[[5488,3325],[29,35],[13,-14],[-18,-25],[13,-15]],[[5525,3306],[-12,-18]],[[5569,3320],[-37,-50]],[[5525,3306],[26,32]],[[5551,3338],[16,-16]],[[5567,3322],[2,-2]],[[5490,3360],[23,30],[3,0],[39,-41],[1,-3],[-5,-8]],[[5476,3373],[33,45]],[[5509,3418],[61,-67],[-3,-29]],[[5489,3439],[20,-21]],[[5532,3446],[-23,-28]],[[5550,3518],[20,-22],[-38,-50]],[[5584,3482],[-38,-50]],[[5546,3432],[-14,14]],[[5614,3520],[-2,-3],[-17,-21],[-11,-14]],[[5584,3482],[14,-15],[-24,-33],[14,-14],[25,32],[14,-16]],[[5627,3436],[-15,-19],[-24,-30],[-42,45]],[[5627,3436],[28,37],[2,2]],[[5675,3458],[-3,-4],[-43,-56],[-38,-49]],[[5663,3327],[-22,-31]],[[5710,3422],[-3,-4],[-7,-9],[-23,-28],[-13,-18],[-3,-4],[-12,-17],[14,-15]],[[5748,3274],[-2,2],[-16,16],[-36,36],[-6,3],[-8,2],[-8,-3],[-9,-3]],[[7316,2249],[-2,5],[-53,39],[-3,2],[-11,9]],[[7352,2281],[-2,-2],[-15,-13],[-2,-2],[-17,-15]],[[7415,2207],[-10,7],[-35,27],[-2,1],[-9,7],[-8,-9],[-20,-25],[-14,-17]],[[7317,2198],[-14,-17],[-14,-17]],[[7289,2164],[-35,27],[-3,2]],[[7251,2193],[8,7],[8,7],[17,14],[17,15],[15,13]],[[7369,2159],[-8,6],[-11,8],[-23,17],[-10,8]],[[7307,2125],[-7,5],[-5,3],[-20,15]],[[7275,2148],[7,8],[7,8]],[[7154,2101],[18,15],[18,16],[32,-24],[4,-2],[9,-7],[13,18],[5,7],[8,9],[7,7],[7,8]],[[7246,2196],[17,15],[16,14],[-66,50]],[[4915,4124],[-9,-12],[-14,-10],[-17,-7],[-23,-10],[-18,-11],[-17,17],[-13,13],[-17,-21],[-15,-17]],[[4716,4029],[2,3],[2,7],[3,14],[1,14],[3,13],[4,8],[5,6],[7,8],[8,6],[7,0],[2,-1],[11,-11],[6,-1],[16,17],[26,27],[6,6],[6,15],[9,20],[9,16],[5,9],[16,19],[5,5],[13,-6],[8,0],[8,3],[8,7],[18,11],[7,5],[13,10],[9,10],[0,2],[-3,2],[-2,2],[-2,3],[-1,3],[4,7],[3,7],[5,1],[8,15],[4,1],[6,1]],[[4981,4313],[12,-15],[3,-4],[4,-3],[5,-4],[6,-3]],[[5011,4284],[2,-2],[13,-12],[2,-3],[13,-14],[11,-13],[4,-6],[3,-5]],[[5059,4229],[-10,-9],[-7,-8]],[[5042,4212],[-18,-9],[-13,-7],[-23,-12],[-29,-16],[-12,-6],[-2,-1],[-2,-1],[-4,-3],[-9,-10],[-15,-23]],[[5110,4308],[-9,-9],[-13,-19],[14,-14]],[[5102,4266],[-19,-30],[-12,13],[-12,-20]],[[5011,4284],[2,10],[-4,1],[5,28],[1,2],[2,2],[4,0],[4,-3],[4,-4],[4,-3],[14,-3],[2,1],[1,1],[8,11],[17,-17],[15,20],[20,-22]],[[5120,4314],[-10,-6]],[[4981,4313],[5,1],[5,1],[3,8],[1,10],[1,6],[3,17],[2,4],[6,6],[15,18],[13,17],[11,13]],[[5046,4414],[2,-4],[8,-9]],[[5056,4401],[50,-52],[28,-30],[-14,-5]],[[5120,4314],[25,-26]],[[5168,4263],[-15,-19],[-13,-18],[-38,40]],[[5056,4401],[16,20],[49,-52],[14,19],[-5,6],[12,18],[14,19],[48,-49],[5,6],[3,5],[3,5],[2,-2]],[[5046,4414],[17,20],[1,0],[34,25],[12,5],[10,6],[16,2],[8,1],[2,1],[5,2],[17,2],[13,0],[14,0],[1,-3],[-2,-8],[0,-7],[5,-17],[1,-5],[0,-3],[-3,-3],[-7,-6],[-3,-7],[-1,-2],[1,-8],[8,-4],[7,-1],[4,-1],[-3,10],[0,10],[0,9],[3,13],[0,10],[1,10],[1,5],[3,3],[2,4],[3,2],[0,2],[5,4],[6,0],[6,2],[6,4],[8,2],[5,4],[3,8],[8,6],[9,3],[5,3],[3,5],[6,6],[19,24],[3,4]],[[5308,4556],[8,-8],[7,-8],[3,-3]],[[5326,4537],[-3,-4],[-8,-13],[-16,-17],[-17,-17],[-14,-15]],[[5268,4471],[-15,-17],[-14,-15],[-5,-6],[-3,-5],[-2,-4],[-1,-2]],[[5177,4187],[-20,21],[-2,2],[-16,-21]],[[5139,4189],[-41,36],[-16,-22]],[[5082,4203],[-5,6],[-4,4],[-4,4],[-3,4],[-7,8]],[[6601,1293],[-5,-3],[-3,-2],[-7,-5],[-29,-23],[-33,-30],[0,-5],[-2,-1],[-2,-2],[-2,-1],[-2,-2],[-4,-3],[-8,-5],[-4,-3]],[[6461,1364],[7,14],[6,14]],[[6521,1212],[1,2]],[[5409,4205],[-44,-59],[-1,-2],[-12,-16]],[[5352,4128],[-40,41],[-3,0],[-3,-1],[-22,-28]],[[5304,4210],[11,-11],[8,-9],[44,59]],[[5367,4249],[42,-44]],[[5348,4270],[11,-12],[8,-9]],[[5359,4285],[12,16]],[[5371,4301],[62,-64]],[[5433,4237],[-13,-17],[-11,-15]],[[5371,4301],[14,17],[13,18],[13,16]],[[5411,4352],[13,18]],[[5424,4370],[62,-64]],[[5486,4306],[-14,-18]],[[5472,4288],[-12,-16],[-13,-18],[-14,-17]],[[5297,4350],[12,16],[13,18],[13,16],[9,3],[16,2],[32,-33],[19,-20]],[[5447,4399],[-10,-12],[-13,-17]],[[5268,4471],[40,-41],[12,16],[15,19],[32,-34],[16,19],[6,9],[7,8],[22,-6],[28,-28],[-14,-19],[15,-15]],[[5488,4445],[-4,-4],[-2,-2],[-13,-16],[-17,-19],[-5,-5]],[[5326,4537],[2,-2],[1,-1],[9,-9],[3,-3],[4,-3],[3,-2],[2,-2],[3,-2],[3,-2],[5,-4],[7,-4],[2,-1],[2,-1],[6,-3],[7,-3],[9,-3],[5,-2],[4,-2],[5,-1],[4,-1],[3,-1],[3,-1],[4,-1],[4,-2],[3,-1],[3,-1],[3,-1],[3,-1],[3,-1],[3,-2],[4,-1],[3,-2],[2,-2],[3,-1],[4,-2],[3,-2],[3,-2],[3,-2],[3,-2],[2,-1],[2,-2],[3,-3],[4,-3],[2,-2],[3,-2]],[[5482,4531],[22,-22],[19,-20],[1,-2]],[[5524,4487],[-19,-22],[-8,-10],[-9,-10]],[[5326,4537],[15,23]],[[5341,4560],[20,-21],[13,-12],[6,-6],[27,30],[14,13],[22,-21],[9,18],[15,-15],[15,-15]],[[5432,4607],[60,-62]],[[5492,4545],[-10,-14]],[[5341,4560],[12,18],[17,26],[23,19],[29,-29],[10,13]],[[5432,4607],[3,4],[4,5],[4,5],[9,12],[3,0],[3,0],[4,2],[1,2],[1,2],[56,-54]],[[5520,4585],[-2,-4],[-15,-21],[-11,-15]],[[5463,4686],[11,-10],[26,-15],[51,-30]],[[5551,4631],[-1,-3],[-11,-15],[-19,-28]],[[5308,4556],[1,2],[12,19],[9,15],[9,12],[3,11],[9,15],[14,15],[3,-3],[2,2],[-3,3],[2,3],[2,5],[2,7],[3,9],[4,16],[2,3],[4,5],[5,2],[5,0],[7,1],[7,9],[2,1],[14,0],[6,1],[3,2]],[[5620,4619],[-10,-22]],[[5610,4597],[-26,15],[-33,19]],[[5571,4675],[-10,-22],[59,-34]],[[5659,4720],[-8,-23],[0,-3],[-8,-21],[-2,-3],[-3,-7]],[[5638,4663],[-8,-21]],[[5630,4642],[-10,-23]],[[5627,4760],[-9,-23],[18,-10],[-8,-20],[12,-10],[4,-2],[2,3],[6,17],[3,4],[4,1]],[[5742,4702],[-9,-25],[-51,27],[-7,-18],[-4,-3],[-4,-1],[-10,6],[-2,3],[0,3],[6,17],[1,5],[-3,4]],[[5667,4740],[75,-38]],[[3044,2793],[-25,-21],[-8,-9],[-6,-12],[-3,-7]],[[2920,2824],[16,13]],[[7282,7043],[16,13],[31,26],[19,17],[14,7],[8,7],[11,10],[14,13]],[[7271,7060],[-32,51],[-11,16]],[[7228,7127],[26,22],[20,18],[30,26],[7,7],[6,5],[8,6],[15,13]],[[7212,7062],[-23,35]],[[7189,7097],[13,11]],[[7202,7108],[14,11],[2,0],[8,6],[2,2]],[[7202,7108],[-14,22]],[[7188,7130],[23,19],[2,2]],[[7213,7151],[15,13],[-44,70]],[[7213,7151],[-33,51]],[[7180,7202],[-11,19]],[[7188,7130],[-32,52]],[[7156,7182],[22,18],[2,2]],[[7189,7097],[-2,-3]],[[7187,7094],[-47,74]],[[7140,7168],[16,14]],[[9437,6162],[2,-8],[3,-1],[-21,-80],[-3,2],[-3,0],[-1,-4],[-2,-7],[-1,-4]],[[9221,5808],[-2,1],[-8,5],[-26,14],[-52,28],[-9,6],[-41,22],[-17,9],[8,21],[47,-26],[11,-6],[8,21],[89,-49],[11,-5],[2,-2]],[[5690,1018],[1,-12],[3,-1],[0,-4],[-1,-2],[-5,0],[-1,1],[-1,4],[0,8],[-1,6],[-13,1],[-6,-6],[-1,-2],[6,-2],[0,-2],[-12,2],[-1,-5],[-10,2],[-23,-10],[-1,3],[15,8],[-18,28],[-6,6],[-7,3],[-8,2],[-7,1],[-6,2],[-12,8],[-14,9],[-5,2],[-12,6],[-12,3],[-7,1],[-4,1],[-4,0],[-14,1],[-3,2],[-1,4],[-4,2],[-6,1],[-6,3],[-7,-3],[-9,5],[-3,0],[-8,4],[-5,-1],[-11,-6],[-2,0],[-11,1],[-6,-5],[-23,13],[-22,15],[-20,11],[-6,3],[-3,-1],[-10,0],[-3,-1],[-9,-3],[-10,1],[-6,1],[-8,3],[-10,4],[-12,0],[-3,2],[-3,1],[-16,7],[-5,6],[-9,15],[-6,5],[-6,0],[-14,4],[-3,2],[-4,2],[-25,7],[-46,16],[-14,2]],[[5122,1221],[2,1],[1,-1],[1,-1]],[[5126,1220],[9,-2],[17,1],[11,1],[11,-5],[10,-3],[12,-2]],[[5196,1210],[9,-2],[10,-4]],[[5215,1204],[13,-7],[6,-7],[8,-12],[9,-18],[6,-11],[8,-4],[25,-8],[12,-2],[20,-2]],[[5322,1133],[20,5],[9,3],[12,6],[11,5],[11,0]],[[5385,1152],[11,-3],[12,-6]],[[5408,1143],[2,-3],[0,-1],[3,-5],[2,-2],[3,-3],[2,-3],[4,-4],[5,-4],[17,-10],[-4,33],[21,3],[13,1],[11,2]],[[5408,1143],[-2,37],[26,3],[-8,108]],[[5424,1291],[26,-10],[27,-9]],[[5385,1152],[-13,159]],[[5372,1311],[23,-9],[29,-11]],[[5326,1327],[22,-8],[14,-4],[1,-1],[9,-3]],[[5322,1133],[-9,92],[-20,-2],[-6,85]],[[5287,1308],[20,0],[21,-1],[-2,20]],[[5215,1204],[1,3],[0,17],[-1,6],[-2,3],[3,2],[9,15],[3,9],[-1,12],[-4,24],[22,5],[19,6],[23,2]],[[5196,1210],[-13,64],[-18,99],[23,-9],[-3,16]],[[5185,1380],[23,-9],[26,-9],[12,-5],[18,-7],[19,-7],[21,-8],[22,-8]],[[5126,1220],[-1,8],[11,2],[-29,168],[0,4]],[[5107,1402],[10,-1],[3,3],[17,-6]],[[5137,1398],[25,-10],[23,-8]],[[5318,1421],[8,-94]],[[5137,1398],[2,2],[-3,14]],[[5136,1414],[20,4]],[[5156,1418],[11,3],[11,-1],[20,1],[23,-1],[13,1],[22,0],[21,-1],[20,1],[21,0]],[[5310,1509],[8,-88]],[[5156,1418],[-20,106],[12,0],[12,-10],[21,0],[21,0],[68,-3],[21,-1],[19,-1]],[[5438,1423],[-26,-2]],[[5412,1421],[-2,1],[-24,0],[-22,-1],[-24,1],[-22,-1]],[[5310,1509],[22,-1],[22,-2],[18,-1],[19,0],[20,-1],[20,-1],[3,-24],[4,-56]],[[5512,1502],[7,-83]],[[5519,1419],[-21,-2],[-19,2],[-20,5],[-21,-1]],[[5136,1414],[-18,88],[-1,3],[-4,22],[-1,6],[-1,4],[-1,4],[-2,4]],[[5108,1545],[0,5]],[[5424,1291],[-3,29],[-9,101]],[[5519,1419],[8,-100]],[[5107,1402],[-24,112],[1,15],[-1,5],[-2,4],[-1,3],[-2,6],[30,-2]],[[5107,1402],[-14,5]],[[5093,1407],[-4,15],[-8,40]],[[5081,1462],[-11,63],[0,1],[-1,1],[-1,1],[-36,1],[14,-76]],[[5046,1453],[6,-31]],[[5052,1422],[-43,16],[-5,2],[-18,6],[-18,7],[-5,2],[-71,26]],[[2859,3223],[3,4],[16,13],[9,5],[2,2],[48,38],[16,11],[18,16]],[[6514,5465],[-59,40]],[[6491,5396],[-20,14],[-18,12],[-20,15]],[[6433,5437],[6,16],[1,4],[7,20],[7,23],[1,5]],[[6514,5465],[-2,-4],[-7,-23],[-7,-21],[-7,-21]],[[6530,5369],[-20,13],[-19,14]],[[6408,5362],[9,25]],[[6417,5387],[16,50]],[[6417,5387],[-21,14],[-21,14],[-16,12]],[[6359,5427],[12,25],[9,21]],[[6380,5473],[15,-11],[13,-9],[5,-3],[20,-13]],[[6384,5295],[-9,5],[-43,20],[-9,5]],[[6323,5325],[8,23],[8,22],[7,22]],[[6346,5392],[13,35]],[[6346,5392],[-20,10],[-18,9]],[[6308,5411],[12,43]],[[6320,5454],[20,-13],[6,11],[17,33],[17,-12]],[[6323,5325],[-36,17]],[[6287,5342],[7,24],[7,22],[3,11],[4,12]],[[6287,5342],[-5,2],[-22,12],[-6,8],[-10,10]],[[6244,5374],[9,8],[3,2],[7,5],[6,5],[6,7],[6,22],[10,29],[0,1],[1,2],[1,2],[1,3],[1,4],[2,6]],[[6297,5470],[18,-13],[5,-3]],[[6244,5374],[-4,6],[-4,1]],[[6236,5381],[13,20],[4,8],[2,13],[4,29],[-4,11],[-2,22],[-2,12],[1,2],[5,7],[5,6],[5,6],[2,8],[3,13],[0,5],[0,6],[2,20],[0,1],[-1,4],[0,7],[-6,10],[5,4],[5,4],[4,6],[3,10],[-1,3],[-3,3]],[[6289,5624],[4,-4],[7,-5],[4,-4],[4,-3],[3,-3],[3,-2],[5,-3]],[[6319,5600],[-1,-5],[-1,-5],[-1,-9],[2,-15],[0,-8],[-2,-11],[0,-6],[-2,-23],[-6,-18]],[[6308,5500],[-5,-13],[-6,-17]],[[6319,5600],[4,-3],[13,-9],[16,-11],[2,-2],[3,-1]],[[6357,5574],[-1,-4],[-4,-13],[-9,-27],[-13,-43],[-5,3],[-17,10]],[[6357,5574],[12,-10],[21,-15],[19,-12]],[[6357,5574],[10,34],[7,24],[-4,2]],[[6370,5634],[8,28]],[[6378,5662],[5,-4],[63,-43]],[[2766,3246],[18,13],[3,-4],[14,-10],[30,24],[5,-8],[6,-10],[16,9],[14,5],[6,2],[6,0],[6,0],[5,1],[4,2],[43,33],[-4,9],[-2,4],[-3,7],[-1,1],[-1,0],[-1,0],[-7,-4],[-4,-2],[-4,10],[-1,2],[-2,0],[-23,-10],[-49,-24],[-7,13],[-1,4]],[[2757,3266],[11,7],[7,5],[15,10],[13,8],[12,8],[11,5],[6,4]],[[2693,3331],[20,8],[17,8],[16,9],[13,8],[10,6],[9,7],[7,5],[6,6]],[[2666,3320],[-9,19],[-6,16],[-2,7],[-2,9],[1,10],[1,8]],[[2649,3389],[6,13],[6,8],[6,6],[5,4],[6,3],[28,9],[4,1],[10,0],[4,1],[6,3],[7,2],[6,2],[7,0],[16,0]],[[2766,3441],[0,-6],[2,-6],[8,-17]],[[2608,3491],[18,-40],[2,-7],[2,-6],[0,-8],[1,-11],[1,-4],[2,-8],[4,-7],[4,-5],[7,-6]],[[2705,3480],[9,-19],[20,2],[10,2],[4,1],[10,7],[7,3],[4,0],[2,-4],[-4,-22],[-1,-9]],[[2591,3556],[20,0],[25,0],[4,-18],[8,3],[6,4],[11,-25],[8,-17],[8,-18],[7,-16],[17,11]],[[2705,3480],[-7,15],[-15,34],[-1,4],[0,5],[0,5],[1,5],[3,10],[1,3],[2,2],[3,1],[5,0],[19,0],[2,7],[2,6],[3,4],[4,4],[7,4]],[[2734,3589],[5,-11],[27,-59],[17,11]],[[2709,3645],[15,-33],[10,-23]],[[2633,3686],[0,-4],[0,-3],[2,-6],[2,-4],[5,-2],[4,-1],[4,0],[19,2],[5,0],[4,0],[2,0],[2,0],[2,-1],[4,-1],[7,-4],[6,-5],[4,-6],[4,-6]],[[2709,3645],[17,11],[9,-20],[15,7],[15,6],[14,3],[13,2],[16,1]],[[2808,3655],[17,-35],[9,-21],[16,9],[3,1],[21,-46]],[[2792,3704],[-5,-26],[9,1],[6,0],[7,-1]],[[2809,3678],[-2,-12],[-1,-5],[2,-6]],[[2809,3678],[20,-3],[-1,-13],[9,-19],[6,5],[2,1],[38,-7],[2,-2],[1,-2],[-3,-19],[0,-8],[0,-5],[1,-6],[3,-5],[3,-5],[5,-3],[6,-3],[6,-1],[7,1],[5,1],[19,12],[3,2],[3,5],[1,5],[0,3],[-8,18],[-2,2],[-2,1],[-24,4],[-2,1],[-2,3],[3,20],[43,-7]],[[6797,6703],[-2,3],[-5,7],[-5,8],[-35,55]],[[6750,6776],[2,15],[1,11],[0,3],[2,33],[0,6],[2,7],[5,16],[55,-88],[2,-3]],[[6819,6776],[11,-17]],[[6830,6759],[-17,-14],[-6,-5],[-4,-16],[-6,-21]],[[6841,6621],[-2,4],[-12,20],[-7,10],[-25,40]],[[6795,6695],[2,8]],[[6830,6759],[39,-63],[26,-40],[2,-4]],[[6791,6593],[-2,4],[-18,29],[4,13],[4,11],[8,22],[2,6],[6,17]],[[6841,6621],[-16,-9],[-16,-9],[-18,-10]],[[6710,6627],[2,3],[2,5],[4,13],[2,6],[1,5],[2,7],[3,9],[6,12],[1,4]],[[6791,6593],[-10,-6],[-7,-4],[-1,-1],[-8,-7],[-6,-5]],[[6859,6594],[-14,-12],[-15,-13],[-13,-12],[-1,-2],[1,-2],[15,-22],[20,-31]],[[5727,3208],[-18,18],[-16,18],[-13,-17],[-2,-2],[-20,20],[-14,16]],[[3136,3279],[9,-25],[4,-14],[2,-11],[4,-23],[6,-11],[-17,-13],[10,-17],[-41,-33],[0,-3],[9,-15],[12,-19]],[[3134,3095],[-7,-6],[-19,-8]],[[3267,3231],[-3,-2],[-32,-25],[-10,-9],[-5,-6],[-6,-9]],[[3211,3180],[-18,-29],[-5,-7],[-10,-12],[-9,-9],[-35,-28]],[[3346,3097],[-3,-2],[-23,-19]],[[3320,3076],[-12,21],[-17,28],[-10,18],[-44,-34],[-30,24]],[[3207,3133],[20,33],[-16,14]],[[3320,3076],[-37,-30],[-26,-20],[-4,-2],[-9,0]],[[3244,3024],[-4,1],[-23,2]],[[3217,3027],[1,13],[-10,18],[15,12],[15,12],[-17,14],[-23,18],[-1,3],[10,16]],[[3305,2980],[-6,3],[-5,0],[-5,-1],[-18,-14],[-8,-6],[-76,-61],[-12,21]],[[3175,2922],[-10,17],[56,46],[1,18],[19,-2],[3,23]],[[3385,3031],[-4,-2],[-26,-12],[-5,0],[-34,-27],[-11,-10]],[[3143,2978],[38,30],[21,18],[5,1],[10,0]],[[3175,2922],[-15,-13],[-40,-33],[-2,1],[-31,53],[-7,-3],[-9,-6],[-2,-2]],[[3305,2980],[42,-70],[29,-52],[8,-15],[7,-19],[2,-11],[1,-11],[-3,-44],[1,-11],[2,-8],[4,-11],[4,-9],[2,-3]],[[3385,3031],[19,-32],[15,-23],[10,-13],[21,-20],[18,-21]],[[3468,2922],[29,-47],[30,-51],[3,-4]],[[3487,3068],[-4,-9],[-1,-9],[-1,-8],[2,-9],[2,-9],[12,-30],[8,-22],[9,-23]],[[3514,2949],[-6,-1],[-9,-4],[-12,-7],[-19,-15]],[[3514,2949],[10,1],[7,-1],[6,2],[7,3],[19,16],[20,15],[7,8],[15,21]],[[3605,3014],[21,-35],[4,-6]],[[3630,2973],[2,-3],[4,-9]],[[3636,2961],[-2,-7],[-2,-6],[-2,-4],[-6,-4],[-8,-6],[-21,-17],[-16,-13],[-22,-16],[-5,-5]],[[3653,3081],[-7,-7],[-5,-7]],[[3641,3067],[-15,-22],[-21,-31]],[[3641,3067],[22,-21],[5,-6],[0,-3],[2,-1],[2,0],[5,-16],[-19,-20],[-18,-18],[-10,-9]],[[3654,2974],[-8,-7],[-10,-6]],[[7252,7640],[11,-18],[2,-1],[1,0],[6,5],[2,1],[2,-1],[36,-56],[2,-3]],[[7336,7636],[-6,-9],[-7,-6],[-12,-11],[15,-24],[2,-3],[-14,-16]],[[7350,7614],[-13,-15],[2,-3],[16,-26]],[[7382,7644],[12,-19],[10,-15],[3,-5],[4,-8],[6,5],[7,-4],[2,-1],[1,-2],[19,-29],[12,-19]],[[7413,7680],[11,-17],[65,-97]],[[7452,7720],[15,-18],[11,-18],[34,-51],[15,-23]],[[7488,7751],[2,-3],[17,-26],[53,-84]],[[3946,3282],[-1,-13],[-1,-6],[0,-3],[-1,-1]],[[3943,3259],[-2,-4],[-6,-6],[-19,-14],[-1,-1]],[[4021,3259],[-17,-18],[-3,-1],[-2,-2],[-4,2],[-10,15],[1,1],[1,2],[0,3],[-1,1],[-3,1],[-4,-1],[-1,2],[-13,12],[-2,2],[-3,1],[-3,2],[-4,0],[-7,1]],[[4067,3169],[-94,77],[-30,13]],[[4166,3063],[-35,-28],[-6,-5],[-3,-2],[-120,-88],[-1,-3]],[[3907,1823],[-3,14],[-13,51],[-5,6],[-2,33],[-3,8],[0,7],[-2,13],[-3,11],[-2,5],[0,6],[-6,13],[2,4],[-11,48],[-2,3],[-7,13],[-17,29]],[[3864,1825],[1,18],[0,24],[0,24],[-20,1],[-5,0],[-21,-7]],[[3819,1885],[-3,12],[-11,15],[-1,3],[-11,49],[-19,-6],[-20,-7],[-4,19],[16,15],[1,2],[-1,3],[-6,17],[-2,1],[-2,1],[-18,-14],[-8,-7],[-7,-5],[-21,-17],[-3,-28],[-10,2],[-8,-3]],[[3819,1885],[-19,-6],[-10,-3],[-9,-2],[-6,-2],[1,-12],[0,-9],[4,-14],[-46,-15],[-3,1],[-1,2],[-5,22],[-11,-3],[-5,-3],[-5,-5]],[[7893,7399],[48,53]],[[7941,7452],[37,43],[3,4],[51,58],[19,20],[19,21],[54,59],[33,35],[13,15]],[[7878,7584],[-12,-15],[15,-23],[3,-6],[5,-8],[8,-12],[17,-26],[24,-38],[3,-4]],[[7765,7647],[2,-3],[12,-20],[20,24],[10,-16],[2,-1],[2,1],[19,24],[12,-18],[18,-29],[16,-25]],[[7967,7659],[-44,-55],[-2,0],[-1,1],[-11,16],[-31,-37]],[[7805,7698],[2,-3],[13,-20],[12,15],[42,-66],[13,17]],[[7887,7641],[15,18],[15,19]],[[7917,7678],[16,-26],[21,26],[13,-19]],[[7861,7768],[2,-3],[12,-20],[13,-20]],[[7888,7725],[-16,-20],[-14,-18],[29,-46]],[[7888,7725],[13,16],[29,-46]],[[7930,7695],[-13,-17]],[[7958,7730],[-14,-18],[-14,-17]],[[7917,7839],[2,-3],[13,-20]],[[7932,7816],[-16,-20],[42,-66]],[[7958,7730],[16,19]],[[7974,7749],[16,-26],[11,-16],[0,-4],[-34,-44]],[[7989,7819],[-33,-42],[18,-28]],[[7932,7816],[12,-19],[32,40],[1,2],[-1,2],[-11,17],[14,16]],[[6340,5706],[-4,-13],[15,-9],[9,-8],[-9,-28],[2,-2],[17,-12]],[[6395,5712],[-3,-7],[-2,-5],[-4,-12],[-8,-26]],[[6403,5730],[5,-3],[8,-5],[2,-2],[45,-31]],[[6463,5689],[5,-2],[2,-1],[-1,-3],[-3,-20],[-2,-12]],[[6431,5791],[4,-4],[2,-2],[7,-5],[49,-34]],[[6493,5746],[-10,-20],[-3,-5],[-7,-14],[-2,-4],[-8,-14]],[[6493,5746],[8,-6],[42,-28],[8,-6]],[[6493,5746],[10,20],[11,23],[12,22]],[[6526,5811],[51,-36],[7,-5]],[[6450,5833],[5,9],[6,13]],[[6461,5855],[4,-3],[61,-41]],[[6461,5855],[9,20],[6,15]],[[2038,2561],[8,17],[8,12],[7,6],[9,12],[8,6],[5,2],[12,15],[4,1],[7,-7],[6,0],[1,4],[-3,8],[-1,23],[1,10],[3,14],[2,7],[8,9],[10,13],[2,2],[-2,8],[-5,6],[0,2],[-2,14],[1,7],[10,14],[5,-3],[1,-4],[1,-2],[-5,-17],[-3,-2],[-1,-4],[1,-4],[3,2],[9,9],[1,5],[1,5],[-2,8],[-2,4],[0,1],[-1,10],[7,12],[4,5],[6,4],[5,7],[5,3],[3,2],[3,1],[3,2]],[[2181,2810],[2,-3],[30,-39],[3,-1],[9,-12],[4,-6]],[[2181,2810],[3,3],[1,5],[7,5],[3,2],[3,6],[3,2],[5,3],[2,1],[3,-1],[9,-7],[10,-4],[5,0],[7,2],[14,13],[4,0],[4,0],[4,2],[6,0],[4,4],[5,7],[1,2],[19,11],[3,1],[9,0],[4,2],[3,2],[7,8]],[[2329,2879],[0,-1],[6,-13],[9,-23],[9,-15],[-7,-10]],[[2329,2879],[1,1],[9,2],[13,10],[9,11],[1,2],[3,5],[4,5],[0,4],[1,2],[3,0],[1,2],[9,27],[14,19],[8,14],[4,6],[3,7],[4,5],[4,9],[7,12],[5,9],[5,12],[1,5],[3,14],[5,9],[3,7]],[[7187,7094],[-15,-13]],[[7172,7081],[-47,74]],[[7125,7155],[15,13]],[[7109,7141],[16,14]],[[7172,7081],[-16,-14]],[[7156,7067],[-47,74]],[[7094,7129],[15,12]],[[7156,7067],[-14,-12]],[[7142,7055],[-48,74]],[[7094,7129],[-11,18]],[[7083,7147],[51,43],[32,28],[3,3]],[[7083,7147],[-11,17]],[[7072,7164],[16,15],[14,11]],[[7102,7190],[15,13]],[[7117,7203],[16,14]],[[7133,7217],[22,19],[2,2]],[[7133,7217],[-40,62]],[[7117,7203],[-39,60]],[[7102,7190],[-37,58]],[[7072,7164],[-33,51]],[[7083,7147],[-13,-11]],[[7070,7136],[-40,64],[-13,-20],[-12,19]],[[7005,7199],[23,34]],[[7070,7136],[-16,-13],[-15,-13],[-45,70]],[[6994,7180],[11,19]],[[6994,7180],[-11,-19]],[[7076,6999],[-47,75],[-14,-13],[-12,19]],[[7003,7080],[20,17],[-11,19],[-12,17],[-17,28]],[[7003,7080],[-29,-26],[-14,-13]],[[7018,6949],[-12,19]],[[7006,6968],[-24,37],[-22,36]],[[7006,6968],[-3,-2],[-16,-14],[-11,18],[-36,-31],[-11,17],[-19,9],[-7,-21]],[[6903,6944],[-19,8]],[[7030,6929],[-2,-2],[-15,-13],[-38,-32]],[[6975,6882],[-15,-13],[7,-12],[11,-18]],[[6978,6839],[-2,-2],[-19,-17],[-20,5],[-3,3],[-46,73],[8,24],[1,2],[2,2],[9,9],[3,2],[-2,1],[-6,3]],[[4974,3642],[-2,37],[-11,0],[-5,0],[-5,1],[-5,3],[-6,6],[-5,13],[-4,8],[-4,8],[1,4],[16,10],[12,-30],[2,-2],[18,2],[9,1],[5,1],[6,2],[6,4],[7,8],[41,54],[2,3]],[[5052,3775],[29,-29],[12,-13],[25,-27]],[[4946,3777],[62,39],[-11,11],[3,3]],[[5000,3830],[12,-13],[11,-11],[29,-31]],[[4954,3878],[14,-14],[13,-14],[2,-3]],[[4983,3847],[17,-17]],[[4851,3985],[7,-8],[-2,-2],[-22,-27],[-12,-14],[-1,-1],[1,-2],[27,-28],[15,-16],[22,29],[12,15],[2,3],[11,-12],[20,-20],[2,-2],[21,-22]],[[5034,3892],[-4,-2],[-5,-3],[-9,-5],[-7,-6],[-6,-4],[-3,-4],[-5,-5],[-12,-16]],[[4954,3878],[12,16],[-14,15],[-14,13],[-1,2],[1,1],[3,5],[11,13],[1,3],[0,2],[-40,41],[-23,25],[-8,7]],[[4882,4021],[7,9],[75,-80],[9,14],[34,52],[12,16]],[[5019,4032],[7,-9]],[[5026,4023],[-26,-35]],[[5000,3988],[-12,-17],[39,-41],[-13,-16],[7,-8],[11,-11],[2,-3]],[[4851,3985],[18,21],[13,15]],[[4955,4047],[-26,-42],[-38,39],[-15,-17],[6,-6]],[[4915,4124],[11,-13],[1,-6],[11,-11]],[[4938,4094],[-15,-14],[15,-15],[17,-18]],[[5012,4039],[7,-7]],[[4955,4047],[11,14],[5,-7],[7,-9],[22,-23],[12,17]],[[5030,4106],[-22,-14],[-21,-26],[25,-27]],[[4938,4094],[26,23],[9,10],[2,2],[2,0],[1,0],[1,0],[6,-5],[15,13],[14,-14],[16,-17]],[[5069,4101],[-50,-69]],[[5030,4106],[17,-16],[14,19],[8,-8]],[[5082,4120],[-13,-19]],[[5042,4212],[6,-12],[48,-51],[-18,-24],[4,-5]],[[8356,8290],[-53,86],[-2,-2]],[[8292,8241],[-1,3],[-50,78]],[[8217,8176],[13,12],[-2,2],[-5,10],[-43,68]],[[8350,8150],[-12,-11],[-17,-15],[-5,-4],[-28,-24],[-13,-11],[-45,71],[-13,20]],[[8217,8176],[-36,-31],[-2,-1],[-2,3],[-13,19],[-40,-35],[-23,36]],[[8101,8167],[15,13],[23,20],[2,1],[-13,22]],[[8101,8167],[-16,-14],[-16,-15],[-27,-22],[-13,-12],[-14,-12],[-2,-3]],[[7944,8196],[4,5],[15,20],[16,23],[21,-20],[-12,-17],[-1,-4],[1,-3],[10,-15],[15,13],[2,1],[2,-1],[4,-6],[41,35]],[[8220,7760],[-3,4],[-17,27],[-28,42],[-4,7],[-23,35],[-26,41],[-8,13],[-9,14],[-2,3]],[[5081,1462],[-35,-9]],[[5093,1407],[-7,3],[-34,12]],[[5148,4153],[-16,11],[-22,14],[-28,25]],[[5139,4189],[17,-17],[-8,-19]],[[5263,4080],[-30,-44],[-37,38],[-14,15],[-18,-11]],[[5164,4078],[-7,-10],[-63,62],[-12,-10]],[[5148,4153],[40,-24],[29,-19],[12,-7]],[[5352,4128],[-13,-17],[-12,-16]],[[5359,4062],[-32,33]],[[5352,4128],[52,-56]],[[5359,4062],[-3,-4],[-12,-11],[-3,-1],[-2,1],[-27,28]],[[5341,4014],[-42,44]],[[5156,3767],[-20,20],[-37,40],[-7,-1],[-11,-14],[-15,-19],[-14,-18]],[[5034,3892],[9,1],[12,0],[10,1],[6,2],[7,2],[7,4],[26,16]],[[5111,3918],[55,33],[4,1]],[[5170,3952],[9,4],[3,1],[3,2],[9,5]],[[5194,3964],[25,15],[2,1],[16,22],[2,3],[7,14],[3,6],[32,44]],[[5000,3988],[15,-14],[26,-27],[5,-5],[5,-2],[5,0],[6,1],[4,3],[3,3],[4,3],[10,12]],[[5083,3962],[8,-8],[6,-7],[5,-7],[7,-18],[2,-4]],[[5026,4023],[8,-10],[20,-20]],[[5054,3993],[14,-15],[15,-16]],[[5054,3993],[12,17],[24,34],[3,1],[2,-1],[11,-12]],[[5106,4032],[-26,-37],[25,-25],[1,-1],[1,0],[3,1],[17,10],[5,4],[3,2],[3,4],[2,1],[2,-3],[1,-1],[10,-11],[12,-12],[4,-8],[1,-4]],[[5069,4101],[6,-7],[15,-15],[28,-30],[-12,-17]],[[5164,4078],[8,-9],[-17,-22],[5,-7],[25,-26],[4,-3],[3,-3],[-6,-8],[-11,-13],[-1,-2],[0,-1],[1,-1],[1,-1],[7,-6],[8,-9],[3,-3]],[[5409,4205],[46,-49],[-22,-31],[14,-15]],[[9268,8006],[-23,6]],[[9245,8012],[5,22],[3,16],[5,22],[3,17],[3,13],[4,15]],[[9268,8117],[21,-5]],[[9289,8112],[41,-11],[42,-11]],[[9233,7952],[6,26],[6,31],[0,3]],[[9308,8311],[-1,-4],[-11,-55],[-4,-18],[-5,-23],[-5,-23],[-3,-18],[-11,-53]],[[8952,8419],[33,26],[26,21],[33,26],[20,15],[-1,1],[0,2],[0,2],[5,4],[24,22],[21,17],[16,13],[22,18]],[[9358,8298],[-1,-4],[-6,-31],[-5,-26],[-1,-3]],[[9345,8234],[-3,-19]],[[9342,8215],[-5,-6],[-9,-6],[-5,-4],[-10,-6],[-4,-3],[-4,-4],[-2,-5],[-2,-7],[-4,-21],[-4,-21],[-4,-20]],[[9342,8215],[56,-15],[2,0]],[[9345,8234],[39,-10],[3,14],[3,3],[2,11],[36,-9],[19,-5]],[[9358,8298],[117,-29]],[[9363,8328],[45,-11],[23,-7],[15,-4],[11,-3],[4,1],[8,4]],[[5950,4855],[-23,-11]],[[5927,4844],[-20,-12],[-21,-13]],[[5886,4819],[-13,-3],[-16,1],[-7,1],[-12,1],[-19,-3],[-5,-2],[-9,-2],[-5,-1],[-2,-1],[-25,-7],[-32,-4]],[[5736,4825],[6,1],[6,0],[5,3],[18,30],[8,9],[3,1],[4,3],[19,7],[7,1],[10,-2],[7,-4],[6,-3],[7,-6],[3,-1],[6,-2],[5,2],[3,1],[5,2],[3,1],[48,13],[6,2],[4,-1],[2,-1],[-2,-12],[11,-9],[5,-1],[0,4],[0,2],[0,8],[-1,6],[-1,3],[0,21],[7,12],[6,6],[7,9],[1,4],[8,14],[5,6],[11,20]],[[5998,4967],[13,-7],[25,-12]],[[6036,4948],[-11,-14],[-9,-11]],[[6016,4923],[-14,-17],[-7,-8],[-10,-9]],[[5985,4889],[-16,-17],[-8,-9],[-11,-8]],[[5875,4608],[6,4],[4,12],[6,20],[-84,49],[-113,59],[-27,-12]],[[5886,4819],[4,-3],[27,-14],[-8,-19],[62,-31]],[[5971,4752],[61,-31],[3,-2]],[[5927,4844],[5,-4],[61,-31],[-7,-19],[-7,-19],[-8,-19]],[[5950,4855],[111,-57],[4,-1]],[[5985,4889],[83,-42],[9,-5],[4,-2]],[[6016,4923],[62,-32],[14,-7],[4,-2]],[[6036,4948],[53,-27],[14,-7],[4,-2]],[[6036,5032],[21,-10],[-5,-16],[11,-6],[60,-30],[4,-1]],[[6054,5070],[23,-11],[3,-3],[61,-31],[3,-1]],[[8833,8678],[16,16],[-21,48],[-20,-12],[-8,19],[-37,80],[20,12],[-15,33],[-23,53],[-2,5],[-20,-13],[-23,-15]],[[8700,8904],[-7,14],[-3,5],[-9,22],[-8,-5],[-11,-5],[-7,-3],[-13,-7],[-42,-17],[-13,-4],[-25,-4],[-11,-1],[-5,0],[-3,0],[-6,1],[-12,2],[-8,0],[-6,-2]],[[8511,8900],[-4,-2],[-7,-3],[-3,-2],[-5,-4],[-8,-6],[-3,-3],[-5,-4],[-6,-7],[-12,-20],[17,-41],[-32,-18],[-1,-1],[0,-2],[7,-17],[4,-10],[12,-11],[3,-3]],[[8305,8694],[13,17],[9,6],[7,6],[1,2],[4,5],[6,5],[8,1],[6,6],[10,9],[8,9],[11,7],[18,16],[7,9],[6,11],[13,20],[7,7],[4,4],[4,3],[6,13],[9,12],[7,15],[22,19],[20,9],[21,1],[17,-1],[20,1],[12,2],[15,6],[13,7],[9,3],[3,3],[0,7],[1,1],[3,-2],[3,0],[7,6],[13,13],[10,8],[9,12],[9,8],[24,23],[6,9],[9,7],[10,10],[13,11],[24,24],[24,22],[9,10],[11,29],[5,9],[6,13],[4,13],[12,27],[4,13],[3,13],[12,20],[10,22],[9,14],[12,17],[9,10],[6,9],[20,28],[10,9],[6,7],[2,5],[8,6],[6,7],[4,8],[3,11],[12,23],[6,16],[0,7],[2,19],[4,8],[9,17],[24,48],[8,14],[9,10],[2,7],[8,14],[4,15],[4,9],[2,6],[9,13],[4,8],[4,13],[1,13],[4,13],[10,21],[6,6],[12,17],[2,0],[13,23],[12,4],[6,7],[12,10],[8,4],[6,4],[7,8],[1,1],[18,9],[8,2],[7,3],[7,5],[20,8],[5,0],[12,8],[14,10],[10,6],[16,4],[10,4],[11,4],[14,8],[16,10],[4,4],[2,0]],[[8795,8640],[-8,18],[-64,142],[-2,4],[-22,50],[0,4],[2,4],[14,8],[-14,31],[-1,2],[0,1]],[[8686,8525],[-2,4],[-2,2],[-3,6],[-3,5],[-2,2],[-11,23],[-20,47],[-13,31],[-16,35],[-30,69],[-33,78]],[[8551,8827],[-1,4],[-7,15],[-5,8],[-9,13],[-6,8],[-4,7],[-8,18]],[[8555,8562],[17,19],[14,17],[-9,11],[-4,9],[-22,51],[-2,2],[-17,-10],[-9,21],[-18,-10]],[[8468,8746],[6,8],[7,9],[9,9],[10,11],[11,10],[19,17],[18,15],[3,2]],[[7052,6851],[-5,9],[-12,18],[-37,-32],[-11,18],[-12,18]],[[7054,6811],[-37,-33],[-12,18],[-15,24],[-12,19]],[[6990,6704],[-3,4],[-44,68],[-7,12]],[[6936,6788],[-9,15],[-30,47]],[[6897,6850],[-31,49]],[[6830,6759],[10,8],[25,-40],[14,13],[14,12],[14,12],[14,12],[15,12]],[[6819,6776],[10,27]],[[6829,6803],[5,-7],[6,5],[13,11],[15,13],[14,12],[15,13]],[[6829,6803],[-2,3],[-9,13],[-7,11],[-16,26],[18,17],[16,14]],[[6829,6887],[18,-29],[2,-3],[8,21],[2,6],[7,17]],[[6829,6887],[-44,68],[1,5],[5,21]],[[6715,6834],[2,7],[8,19],[7,14],[5,12],[5,5],[35,82],[4,17]],[[7568,4477],[7,11],[5,9]],[[7580,4497],[9,-7],[45,-34],[13,-10]],[[7580,4497],[14,23]],[[7580,4497],[-11,8],[-42,33],[-9,9]],[[7568,4477],[-63,47]],[[7555,4451],[-19,14],[-37,27],[-8,6]],[[7523,4395],[-62,47]],[[7498,4350],[-62,46]],[[7485,4324],[-63,47]],[[5016,1281],[-46,1],[-3,21],[0,14],[1,6],[-4,20],[-18,-3],[-3,0],[-2,1],[-2,3],[-4,22],[-23,-5]],[[5016,1227],[-10,3],[-8,7],[-3,5],[-2,12],[1,19],[-3,-4],[-3,-9],[-1,-8],[2,-7],[2,-6],[4,-8],[6,-4],[9,-3],[6,-2]],[[5626,4344],[-6,6],[-47,50],[13,16],[12,17]],[[5608,4321],[-1,0],[-14,15],[-40,42],[-7,7]],[[5546,4385],[-26,27],[-19,20],[-3,3],[-3,3],[-4,4],[-2,2],[-1,1]],[[5524,4487],[5,5],[0,2],[17,20]],[[5546,4514],[31,-30],[33,-36]],[[5639,4489],[-17,-24],[-12,-17]],[[5546,4514],[19,22],[3,3]],[[5568,4539],[14,-12],[3,-3],[3,-2],[4,-1],[5,0],[5,1],[21,-19],[16,-14]],[[5568,4539],[21,26],[13,20],[6,9],[2,3]],[[5610,4597],[73,-44]],[[5683,4553],[-3,-4],[-2,-4],[-14,-19],[-14,-19],[-11,-18]],[[5568,4539],[-19,19],[-14,13],[-15,14]],[[5630,4642],[74,-41],[-11,-25],[-10,-23]],[[5748,4503],[-22,16],[-43,34]],[[5638,4663],[4,-2],[7,16],[20,-12],[26,-13],[2,-1],[13,-4],[79,-41]],[[5742,4702],[54,-28],[-9,-24],[30,-15],[29,-7],[0,-1],[-3,-11]],[[5546,4385],[-3,-5],[-5,-5],[-9,-12],[0,-3],[-2,-3],[-5,-6],[-4,-2],[-5,-7],[-14,-19],[-13,-17]],[[5534,4223],[-62,65]],[[5608,4321],[-3,-5],[-12,-16],[-2,0],[0,-1],[0,-1],[-8,-11],[-9,-11],[-13,-17],[-13,-18],[-14,-18]],[[5494,4172],[-61,65]],[[5534,4223],[-13,-16],[-13,-18]],[[6183,5178],[9,23],[10,22],[11,-6],[39,-19],[22,-10]],[[6160,5189],[10,23],[10,22],[7,22]],[[6187,5256],[19,-9],[5,-2],[9,-5],[32,-16],[30,-14]],[[6187,5256],[17,49]],[[6204,5305],[20,-10],[3,-2],[3,-4],[2,-2],[6,-3],[14,-7],[46,-22]],[[6298,5255],[-4,-12],[-4,-11],[-4,-11],[-4,-11]],[[6323,5325],[-9,-24],[-10,4],[-28,14]],[[6276,5319],[-5,3],[-31,14],[-24,2],[-6,-16],[-6,-17]],[[6079,5226],[9,15],[21,27],[12,18],[27,28],[13,16],[20,23],[3,2],[3,2],[15,0],[9,1],[6,3],[18,19],[1,1]],[[6276,5319],[-23,-15],[3,-2],[50,-25]],[[6306,5277],[-4,-11],[-4,-11]],[[6367,5247],[-44,21],[-17,9]]],"box":[-73.97639960366291,45.40212922961762,-73.47606597759493,45.70374747616739],"transform":{"scale":[0.000050038366443442794,0.000030164841139091116],"translate":[-73.97639960366291,45.40212922961762]}} diff --git a/test/memoryLimitCases/json/src/4.json b/test/memoryLimitCases/json/src/4.json new file mode 100644 index 00000000000..33726beae05 --- /dev/null +++ b/test/memoryLimitCases/json/src/4.json @@ -0,0 +1 @@ +{"type":"Topology","objects":{"da_polygons":{"type":"GeometryCollection","geometries":[{"type":"Polygon","arcs":[[0,1,2,3]],"properties":{"id":"24661006","dp":8931,"de":1335}},{"type":"Polygon","arcs":[[4,5,-3,6]],"properties":{"id":"24661007","dp":10647,"de":1878}},{"type":"Polygon","arcs":[[7,-5,8,9]],"properties":{"id":"24661008","dp":16943,"de":0}},{"type":"Polygon","arcs":[[10,11,12,13,-10,14]],"properties":{"id":"24661009","dp":12530,"de":0}},{"type":"Polygon","arcs":[[15,-12,16,17]],"properties":{"id":"24661010","dp":9438,"de":702}},{"type":"Polygon","arcs":[[-16,18,19,20,21]],"properties":{"id":"24661011","dp":8010,"de":0}},{"type":"Polygon","arcs":[[-13,-22,22,23,24]],"properties":{"id":"24661012","dp":11850,"de":2286}},{"type":"Polygon","arcs":[[-14,-25,25,26,27,-8]],"properties":{"id":"24661013","dp":14048,"de":0}},{"type":"Polygon","arcs":[[-28,28,29,30,-6]],"properties":{"id":"24661014","dp":13125,"de":937}},{"type":"Polygon","arcs":[[-4,-31,31,32]],"properties":{"id":"24661015","dp":9751,"de":0}},{"type":"Polygon","arcs":[[-33,33,34,35,36]],"properties":{"id":"24661016","dp":11366,"de":3096}},{"type":"Polygon","arcs":[[37,38,39,40,41,-36,42]],"properties":{"id":"24661017","dp":12016,"de":2796}},{"type":"Polygon","arcs":[[43,44,-39,45,46]],"properties":{"id":"24661018","dp":11687,"de":0}},{"type":"Polygon","arcs":[[-46,-38,47,48,49]],"properties":{"id":"24661019","dp":12350,"de":0}},{"type":"Polygon","arcs":[[50,-47,-50,51,52]],"properties":{"id":"24661020","dp":9967,"de":0}},{"type":"Polygon","arcs":[[-52,-49,53,54,55,56]],"properties":{"id":"24661021","dp":7994,"de":1432}},{"type":"Polygon","arcs":[[-56,57,58,59,60,61]],"properties":{"id":"24661022","dp":5211,"de":1785}},{"type":"Polygon","arcs":[[62,63,-57,-62,64]],"properties":{"id":"24661023","dp":6243,"de":582}},{"type":"Polygon","arcs":[[-65,-61,65,66,67,68]],"properties":{"id":"24661024","dp":5485,"de":0}},{"type":"Polygon","arcs":[[69,70,71,-66]],"properties":{"id":"24661025","dp":7364,"de":0}},{"type":"Polygon","arcs":[[-70,-60,72,73,74]],"properties":{"id":"24661026","dp":10337,"de":1466}},{"type":"Polygon","arcs":[[75,76,77,78,-71,-75]],"properties":{"id":"24661027","dp":12164,"de":1903}},{"type":"Polygon","arcs":[[79,80,-76,-74,81]],"properties":{"id":"24661028","dp":11862,"de":0}},{"type":"Polygon","arcs":[[82,83,-77,-81,84]],"properties":{"id":"24661029","dp":13911,"de":0}},{"type":"Polygon","arcs":[[85,86,87,-85,-80,88]],"properties":{"id":"24661030","dp":19910,"de":0}},{"type":"Polygon","arcs":[[-87,89,90]],"properties":{"id":"24661031","dp":19144,"de":0}},{"type":"Polygon","arcs":[[-83,-88,-91,91,92,93,94,95]],"properties":{"id":"24661032","dp":7816,"de":7672}},{"type":"Polygon","arcs":[[96,-92,-90,-86,97]],"properties":{"id":"24661033","dp":15840,"de":0}},{"type":"Polygon","arcs":[[98,-98,99,100]],"properties":{"id":"24661034","dp":14082,"de":0}},{"type":"Polygon","arcs":[[101,-93,-97,-99,102]],"properties":{"id":"24661035","dp":13138,"de":1666}},{"type":"Polygon","arcs":[[103,104,105,106]],"properties":{"id":"24660626","dp":11270,"de":0}},{"type":"Polygon","arcs":[[107,108,-104,109]],"properties":{"id":"24660627","dp":9435,"de":0}},{"type":"Polygon","arcs":[[110,-110,-107,111,112,113,114,115]],"properties":{"id":"24660628","dp":3679,"de":3326}},{"type":"Polygon","arcs":[[116,117,118,-111]],"properties":{"id":"24660629","dp":48819,"de":4658}},{"type":"Polygon","arcs":[[119,120,121,-118,122]],"properties":{"id":"24660630","dp":4054,"de":851}},{"type":"Polygon","arcs":[[123,124,125,-123,126,127]],"properties":{"id":"24660631","dp":6140,"de":1321}},{"type":"Polygon","arcs":[[128,129,-120,-126,130]],"properties":{"id":"24660632","dp":4964,"de":0}},{"type":"Polygon","arcs":[[131,-131,-125,132,133,134]],"properties":{"id":"24660633","dp":4795,"de":6787}},{"type":"Polygon","arcs":[[135,136,137,-132,138,139]],"properties":{"id":"24660634","dp":4116,"de":1223}},{"type":"Polygon","arcs":[[140,141,142,143,-136]],"properties":{"id":"24660635","dp":8631,"de":1131}},{"type":"Polygon","arcs":[[144,145,-141,146]],"properties":{"id":"24660636","dp":9930,"de":2797}},{"type":"Polygon","arcs":[[-147,-140,147,148]],"properties":{"id":"24660637","dp":12431,"de":0}},{"type":"Polygon","arcs":[[-148,-139,-135,149,150]],"properties":{"id":"24660638","dp":8941,"de":1274}},{"type":"Polygon","arcs":[[-150,-134,151,152]],"properties":{"id":"24660639","dp":10337,"de":1054}},{"type":"Polygon","arcs":[[153,-153,154,155]],"properties":{"id":"24660640","dp":7798,"de":3731}},{"type":"Polygon","arcs":[[-155,156,157,158]],"properties":{"id":"24660641","dp":11155,"de":3361}},{"type":"Polygon","arcs":[[-158,159,160,161,162]],"properties":{"id":"24660642","dp":10407,"de":4184}},{"type":"Polygon","arcs":[[-162,163,164,165,166]],"properties":{"id":"24660643","dp":12951,"de":8280}},{"type":"Polygon","arcs":[[167,168,-166,169,170]],"properties":{"id":"24660644","dp":9054,"de":2215}},{"type":"Polygon","arcs":[[-165,171,172,173,174,175,-170]],"properties":{"id":"24660645","dp":11651,"de":2816}},{"type":"Polygon","arcs":[[176,-171,-176,177,178,179,180,181,182]],"properties":{"id":"24660646","dp":6723,"de":3837}},{"type":"Polygon","arcs":[[183,184,185,186,-181,187,188]],"properties":{"id":"24660649","dp":9487,"de":1370}},{"type":"Polygon","arcs":[[-189,189,-179,190,191,192]],"properties":{"id":"24660650","dp":4420,"de":2155}},{"type":"Polygon","arcs":[[-192,193,194,195,196,197]],"properties":{"id":"24660652","dp":9408,"de":869}},{"type":"Polygon","arcs":[[198,199,-195,200]],"properties":{"id":"24660654","dp":3356,"de":0}},{"type":"Polygon","arcs":[[201,202,203,204,205,-199]],"properties":{"id":"24660655","dp":6279,"de":3761}},{"type":"Polygon","arcs":[[206,207,-196,-200,-206]],"properties":{"id":"24660656","dp":16096,"de":1470}},{"type":"Polygon","arcs":[[-205,208,209,210,211,-207]],"properties":{"id":"24660657","dp":14502,"de":974}},{"type":"Polygon","arcs":[[212,213,214,215,216]],"properties":{"id":"24661144","dp":17838,"de":1781}},{"type":"Polygon","arcs":[[-216,217,218]],"properties":{"id":"24661145","dp":14407,"de":0}},{"type":"Polygon","arcs":[[219,-219,220,221,222,223]],"properties":{"id":"24661146","dp":10811,"de":7711}},{"type":"Polygon","arcs":[[224,225,226,227]],"properties":{"id":"24663242","dp":135547,"de":31021}},{"type":"Polygon","arcs":[[-226,228,229,230]],"properties":{"id":"24663243","dp":74527,"de":15540}},{"type":"Polygon","arcs":[[231,-201,-194,-191]],"properties":{"id":"24663244","dp":15460,"de":1381}},{"type":"Polygon","arcs":[[232,233,234,235,236]],"properties":{"id":"24663245","dp":28870,"de":2258}},{"type":"Polygon","arcs":[[237,238,239,240,241,242,243]],"properties":{"id":"24663215","dp":11166,"de":5263}},{"type":"Polygon","arcs":[[244,245,246,247,248,249,250,251,252,253,254]],"properties":{"id":"24663216","dp":1357,"de":364}},{"type":"Polygon","arcs":[[255,256,257,258,-249,259]],"properties":{"id":"24663217","dp":5669,"de":873}},{"type":"Polygon","arcs":[[260,-260,-248,261]],"properties":{"id":"24663218","dp":4290,"de":1018}},{"type":"Polygon","arcs":[[-259,262,263,-250]],"properties":{"id":"24663219","dp":9313,"de":0}},{"type":"Polygon","arcs":[[-258,264,265,266,267,268,269,270,-263]],"properties":{"id":"24663220","dp":3197,"de":1020}},{"type":"Polygon","arcs":[[-264,-271,271,272,-251]],"properties":{"id":"24663221","dp":11214,"de":0}},{"type":"Polygon","arcs":[[-270,273,274,275,-272]],"properties":{"id":"24663222","dp":9621,"de":0}},{"type":"Polygon","arcs":[[-273,-276,276,277,278,-252]],"properties":{"id":"24663223","dp":11269,"de":0}},{"type":"Polygon","arcs":[[279,280,281,282,283,284,285,286]],"properties":{"id":"24663227","dp":3208,"de":243}},{"type":"Polygon","arcs":[[287,288,-284]],"properties":{"id":"24663228","dp":9806,"de":1320}},{"type":"Polygon","arcs":[[-285,-289,289,290,291,292,293]],"properties":{"id":"24663229","dp":2759,"de":1023}},{"type":"Polygon","arcs":[[294,295,296,-292]],"properties":{"id":"24663230","dp":8375,"de":1160}},{"type":"Polygon","arcs":[[297,298,299,300,-296]],"properties":{"id":"24663231","dp":10815,"de":998}},{"type":"Polygon","arcs":[[301,302,303,304,-298,305]],"properties":{"id":"24663232","dp":7492,"de":3592}},{"type":"Polygon","arcs":[[306,307,308,309,-300]],"properties":{"id":"24663233","dp":7652,"de":0}},{"type":"Polygon","arcs":[[-309,310,311,312,313]],"properties":{"id":"24663234","dp":9826,"de":1391}},{"type":"Polygon","arcs":[[-297,-301,-310,-314,314,315,316,317,318]],"properties":{"id":"24663235","dp":8550,"de":1062}},{"type":"Polygon","arcs":[[-286,319,320,321,-293,-319,322,323,324,325,326]],"properties":{"id":"24663236","dp":1908,"de":0}},{"type":"Polygon","arcs":[[327,-324]],"properties":{"id":"24663237","dp":12585,"de":0}},{"type":"Polygon","arcs":[[-321,328]],"properties":{"id":"24663238","dp":12077,"de":0}},{"type":"Polygon","arcs":[[-294,-322,-329,-320]],"properties":{"id":"24663239","dp":9419,"de":0}},{"type":"Polygon","arcs":[[329,330,331,332,333,334,335,336,337,338,339]],"properties":{"id":"24663241","dp":9132,"de":3526}},{"type":"Polygon","arcs":[[340,341,342,343,344]],"properties":{"id":"24663315","dp":6316,"de":663}},{"type":"Polygon","arcs":[[-345,345]],"properties":{"id":"24663316","dp":17073,"de":0}},{"type":"Polygon","arcs":[[346,347,348,-342,349]],"properties":{"id":"24663317","dp":6559,"de":940}},{"type":"Polygon","arcs":[[350,351,-347,352]],"properties":{"id":"24663318","dp":13324,"de":0}},{"type":"Polygon","arcs":[[-352,353,354,355,-348]],"properties":{"id":"24663319","dp":5197,"de":591}},{"type":"Polygon","arcs":[[356,-247,357,-356]],"properties":{"id":"24663320","dp":8801,"de":4778}},{"type":"Polygon","arcs":[[-349,-358,-246,358,-343]],"properties":{"id":"24663321","dp":4576,"de":2380}},{"type":"Polygon","arcs":[[359,360,361,362,363,364]],"properties":{"id":"24663322","dp":5794,"de":2158}},{"type":"Polygon","arcs":[[365,-361,366]],"properties":{"id":"24663323","dp":14574,"de":0}},{"type":"Polygon","arcs":[[367,368,369,-362,-366,370]],"properties":{"id":"24663324","dp":14421,"de":0}},{"type":"Polygon","arcs":[[371,372,-369,373]],"properties":{"id":"24663325","dp":15522,"de":0}},{"type":"Polygon","arcs":[[374,375,376,-374,-368,377]],"properties":{"id":"24663326","dp":10725,"de":1170}},{"type":"Polygon","arcs":[[-377,378,379,380,-372]],"properties":{"id":"24663327","dp":17213,"de":0}},{"type":"Polygon","arcs":[[-381,381,-363,-370,-373]],"properties":{"id":"24663328","dp":15796,"de":1851}},{"type":"Polygon","arcs":[[382,383,384,385,386,387,388,389,390,391,392,393,394,395,396]],"properties":{"id":"24663329","dp":0,"de":296}},{"type":"Polygon","arcs":[[397,398,399,400,401,402,403,404]],"properties":{"id":"24663330","dp":4436,"de":5953}},{"type":"Polygon","arcs":[[405,406,407,-399,408]],"properties":{"id":"24663331","dp":11992,"de":1562}},{"type":"Polygon","arcs":[[409,410,-406,411,412]],"properties":{"id":"24663332","dp":14081,"de":2551}},{"type":"Polygon","arcs":[[413,414,415,-410,416]],"properties":{"id":"24663333","dp":8329,"de":1540}},{"type":"Polygon","arcs":[[417,418,419,420,421,422,423,424,425]],"properties":{"id":"24660037","dp":6132,"de":0}},{"type":"Polygon","arcs":[[426,427,428,429,-419,430]],"properties":{"id":"24660038","dp":9844,"de":0}},{"type":"Polygon","arcs":[[431,-427,432]],"properties":{"id":"24660039","dp":11381,"de":0}},{"type":"Polygon","arcs":[[433,434,435,-428,-432]],"properties":{"id":"24660040","dp":4262,"de":404}},{"type":"Polygon","arcs":[[436,-434,-433,-431,-418,437,438]],"properties":{"id":"24660041","dp":3909,"de":348}},{"type":"Polygon","arcs":[[439,-438,-426,440]],"properties":{"id":"24660042","dp":9275,"de":0}},{"type":"Polygon","arcs":[[-425,441,-441]],"properties":{"id":"24660043","dp":10046,"de":0}},{"type":"Polygon","arcs":[[442,-440,-442,-424,443,444,445,446]],"properties":{"id":"24660044","dp":3139,"de":1321}},{"type":"Polygon","arcs":[[447,-446,448,449,450]],"properties":{"id":"24660045","dp":2288,"de":0}},{"type":"Polygon","arcs":[[-439,-443,451,452]],"properties":{"id":"24660046","dp":4770,"de":478}},{"type":"Polygon","arcs":[[453,454,455,456,457,-435,-437,-453,458]],"properties":{"id":"24660047","dp":2550,"de":2172}},{"type":"Polygon","arcs":[[459,460,461,-455,462]],"properties":{"id":"24660048","dp":6159,"de":1346}},{"type":"Polygon","arcs":[[463,464,465,-456,-462,466]],"properties":{"id":"24660049","dp":5493,"de":681}},{"type":"Polygon","arcs":[[467,-464,468]],"properties":{"id":"24660050","dp":9764,"de":0}},{"type":"Polygon","arcs":[[469,470,-469,-467,-461,471,472]],"properties":{"id":"24660051","dp":4193,"de":0}},{"type":"Polygon","arcs":[[473,474,-472,-460,475]],"properties":{"id":"24660052","dp":7412,"de":1105}},{"type":"Polygon","arcs":[[476,-473,-475,477]],"properties":{"id":"24660053","dp":6310,"de":0}},{"type":"Polygon","arcs":[[478,479,-478,-474,480,481,482]],"properties":{"id":"24660054","dp":4320,"de":724}},{"type":"Polygon","arcs":[[483,484,485,-479]],"properties":{"id":"24660055","dp":9536,"de":0}},{"type":"Polygon","arcs":[[486,-485,487]],"properties":{"id":"24660056","dp":4995,"de":0}},{"type":"Polygon","arcs":[[488,489,490,491,492,493,494,495,496,-488,-484,-483,497]],"properties":{"id":"24660057","dp":338,"de":536}},{"type":"Polygon","arcs":[[498,499,500,501]],"properties":{"id":"24660489","dp":8249,"de":6849}},{"type":"Polygon","arcs":[[502,503,504,-502]],"properties":{"id":"24660490","dp":8603,"de":3262}},{"type":"Polygon","arcs":[[-253,-279,505,506,507,508]],"properties":{"id":"24660141","dp":1836,"de":234}},{"type":"Polygon","arcs":[[509,510,-503,-501,511,512,513,514,515,516,517]],"properties":{"id":"24660491","dp":1351,"de":5936}},{"type":"Polygon","arcs":[[-517,518,519,520]],"properties":{"id":"24660492","dp":13313,"de":0}},{"type":"Polygon","arcs":[[-516,521,522,-519]],"properties":{"id":"24660493","dp":13219,"de":1570}},{"type":"Polygon","arcs":[[-523,523,524,525]],"properties":{"id":"24660494","dp":11926,"de":1361}},{"type":"Polygon","arcs":[[-525,526,527,528]],"properties":{"id":"24660495","dp":9387,"de":1348}},{"type":"Polygon","arcs":[[529,530,531,-527,-524]],"properties":{"id":"24660496","dp":11422,"de":1845}},{"type":"Polygon","arcs":[[-515,-530,-522]],"properties":{"id":"24660497","dp":14505,"de":1692}},{"type":"Polygon","arcs":[[-514,532,533,534,-531]],"properties":{"id":"24660498","dp":10225,"de":1503}},{"type":"Polygon","arcs":[[535,536,537,-534]],"properties":{"id":"24660499","dp":9676,"de":0}},{"type":"Polygon","arcs":[[-533,-513,538,539,540,541,542,543,-536]],"properties":{"id":"24660500","dp":3362,"de":7441}},{"type":"Polygon","arcs":[[-544,544,545,546,547,-537]],"properties":{"id":"24660501","dp":7888,"de":837}},{"type":"Polygon","arcs":[[548,549,-545,-543]],"properties":{"id":"24660502","dp":13405,"de":1811}},{"type":"Polygon","arcs":[[550,551,552,-549,-542]],"properties":{"id":"24660503","dp":7376,"de":874}},{"type":"Polygon","arcs":[[553,554,-551,-541]],"properties":{"id":"24660504","dp":5407,"de":1005}},{"type":"Polygon","arcs":[[555,556,557,-554,-540]],"properties":{"id":"24660505","dp":9900,"de":2490}},{"type":"Polygon","arcs":[[558,559,560,-557,561,562]],"properties":{"id":"24660506","dp":8935,"de":2987}},{"type":"Polygon","arcs":[[563,-563,564]],"properties":{"id":"24660507","dp":10570,"de":1027}},{"type":"Polygon","arcs":[[565,566,567,-559,-564,568]],"properties":{"id":"24660508","dp":6919,"de":1668}},{"type":"Polygon","arcs":[[569,570,-566,571]],"properties":{"id":"24660509","dp":8828,"de":0}},{"type":"Polygon","arcs":[[572,573,-572,-569,-565,-562,-556,-539,574,575]],"properties":{"id":"24660510","dp":1306,"de":8518}},{"type":"Polygon","arcs":[[576,577,578,579,-570,-574]],"properties":{"id":"24660511","dp":4287,"de":468}},{"type":"Polygon","arcs":[[-573,580,581,-577]],"properties":{"id":"24660512","dp":13997,"de":0}},{"type":"Polygon","arcs":[[582,583,584,585,586,587,-581]],"properties":{"id":"24660513","dp":10449,"de":1063}},{"type":"Polygon","arcs":[[588,589,-587]],"properties":{"id":"24660514","dp":9284,"de":0}},{"type":"Polygon","arcs":[[-586,590,591,-589]],"properties":{"id":"24660515","dp":39141,"de":3862}},{"type":"Polygon","arcs":[[-585,592,593,-591]],"properties":{"id":"24660516","dp":26174,"de":1912}},{"type":"Polygon","arcs":[[594,595,596,597,598,-593]],"properties":{"id":"24660517","dp":8932,"de":485}},{"type":"Polygon","arcs":[[599,600,601,602]],"properties":{"id":"24661004","dp":10054,"de":0}},{"type":"Polygon","arcs":[[-1,-37,-42,-601]],"properties":{"id":"24661005","dp":8535,"de":5063}},{"type":"Polygon","arcs":[[603,604,-254,-509,605,606,607,608]],"properties":{"id":"24660142","dp":3728,"de":2421}},{"type":"Polygon","arcs":[[609,610,-609]],"properties":{"id":"24660143","dp":10342,"de":0}},{"type":"Polygon","arcs":[[611,-610,-608,612,613,614]],"properties":{"id":"24660144","dp":15266,"de":722}},{"type":"Polygon","arcs":[[615,-604,-611,616]],"properties":{"id":"24660145","dp":12741,"de":0}},{"type":"Polygon","arcs":[[617,618,-617,-612,619,620,621,622]],"properties":{"id":"24660146","dp":7606,"de":1504}},{"type":"Polygon","arcs":[[-618,623]],"properties":{"id":"24660147","dp":20632,"de":1656}},{"type":"Polygon","arcs":[[624,-255,-605,-616,-619,-624,-623,625]],"properties":{"id":"24660148","dp":1454,"de":5705}},{"type":"Polygon","arcs":[[626,-626,627,628,629,630]],"properties":{"id":"24660149","dp":5561,"de":963}},{"type":"Polygon","arcs":[[631,632,-631,633,634]],"properties":{"id":"24660150","dp":3943,"de":1446}},{"type":"Polygon","arcs":[[635,-635,636,637,638]],"properties":{"id":"24660151","dp":4713,"de":0}},{"type":"Polygon","arcs":[[639,640,-637,-634,-630,641,642,643]],"properties":{"id":"24660152","dp":3337,"de":3856}},{"type":"Polygon","arcs":[[644,-640,645]],"properties":{"id":"24660153","dp":10086,"de":867}},{"type":"Polygon","arcs":[[646,-646,647,648]],"properties":{"id":"24660154","dp":6043,"de":699}},{"type":"Polygon","arcs":[[-649,649,650,651,652]],"properties":{"id":"24660155","dp":8086,"de":942}},{"type":"Polygon","arcs":[[653,-652,654,655,656]],"properties":{"id":"24660156","dp":11496,"de":2733}},{"type":"Polygon","arcs":[[657,-655,-651,658,659,660,661,662,663,664]],"properties":{"id":"24660157","dp":2446,"de":187}},{"type":"Polygon","arcs":[[-665,665,666,667]],"properties":{"id":"24660158","dp":9450,"de":1247}},{"type":"Polygon","arcs":[[668,669,-666,-664]],"properties":{"id":"24660159","dp":16040,"de":0}},{"type":"Polygon","arcs":[[-669,-663,670,671]],"properties":{"id":"24660160","dp":6754,"de":0}},{"type":"Polygon","arcs":[[-662,672,673,-671]],"properties":{"id":"24660161","dp":7033,"de":0}},{"type":"Polygon","arcs":[[-674,674,675]],"properties":{"id":"24660162","dp":9412,"de":0}},{"type":"Polygon","arcs":[[-675,-673,-661,676,677,678,679,680,681,682,683]],"properties":{"id":"24660163","dp":8293,"de":697}},{"type":"Polygon","arcs":[[684,685,-679,686]],"properties":{"id":"24660164","dp":9226,"de":3080}},{"type":"Polygon","arcs":[[687,688,689,690,-685]],"properties":{"id":"24660165","dp":9571,"de":0}},{"type":"Polygon","arcs":[[691,692,693,694]],"properties":{"id":"24660624","dp":17755,"de":2448}},{"type":"Polygon","arcs":[[-112,-106,695,-692]],"properties":{"id":"24660625","dp":16190,"de":1636}},{"type":"Polygon","arcs":[[696,697,698,699,700,701,702]],"properties":{"id":"24660877","dp":8154,"de":0}},{"type":"Polygon","arcs":[[703,704,-698,705]],"properties":{"id":"24660878","dp":13204,"de":0}},{"type":"Polygon","arcs":[[706,707,708,-699,-705]],"properties":{"id":"24660879","dp":14016,"de":0}},{"type":"Polygon","arcs":[[709,710,711,712,713,-707,-704,714]],"properties":{"id":"24660880","dp":5343,"de":1738}},{"type":"Polygon","arcs":[[715,716,-708,-714]],"properties":{"id":"24660881","dp":15212,"de":0}},{"type":"Polygon","arcs":[[-709,-717,717,718,719,-700]],"properties":{"id":"24660882","dp":13107,"de":0}},{"type":"Polygon","arcs":[[-718,-716,-713,720,721,722,723,724]],"properties":{"id":"24660883","dp":6469,"de":524}},{"type":"Polygon","arcs":[[725,726,727,-723]],"properties":{"id":"24660884","dp":8508,"de":732}},{"type":"Polygon","arcs":[[-728,728,729,730,731,-724]],"properties":{"id":"24660885","dp":6490,"de":3685}},{"type":"Polygon","arcs":[[-731,732,733,734,735,736,737]],"properties":{"id":"24660886","dp":11863,"de":2534}},{"type":"Polygon","arcs":[[-737,738,739,740,741]],"properties":{"id":"24660887","dp":15000,"de":0}},{"type":"Polygon","arcs":[[742,743,744,-739,-736]],"properties":{"id":"24660888","dp":15464,"de":0}},{"type":"Polygon","arcs":[[745,746,-743,-735]],"properties":{"id":"24660889","dp":15095,"de":0}},{"type":"Polygon","arcs":[[747,748,749,-744,-747]],"properties":{"id":"24660890","dp":15628,"de":0}},{"type":"Polygon","arcs":[[750,751,752,-748,-746,-734]],"properties":{"id":"24660891","dp":16444,"de":0}},{"type":"Polygon","arcs":[[753,-752]],"properties":{"id":"24660892","dp":12290,"de":0}},{"type":"Polygon","arcs":[[-751,-733,-730,754,755,756,757,758,759,760,761,762,763,-749,-753,-754]],"properties":{"id":"24660893","dp":480,"de":3413}},{"type":"Polygon","arcs":[[-745,-750,-764,764,-740]],"properties":{"id":"24660894","dp":15893,"de":957}},{"type":"Polygon","arcs":[[-741,-765,-763,765,766,767]],"properties":{"id":"24660895","dp":6906,"de":2126}},{"type":"Polygon","arcs":[[-766,-762,768,769]],"properties":{"id":"24660896","dp":13624,"de":0}},{"type":"Polygon","arcs":[[770,771,-767,-770,772]],"properties":{"id":"24660897","dp":17031,"de":0}},{"type":"Polygon","arcs":[[773,774,-771]],"properties":{"id":"24660898","dp":13979,"de":0}},{"type":"Polygon","arcs":[[775,-738,-742,-768,-772,-775,776]],"properties":{"id":"24660899","dp":5594,"de":4325}},{"type":"Polygon","arcs":[[777,-719,-725,-732,-776,778]],"properties":{"id":"24660900","dp":7907,"de":2759}},{"type":"Polygon","arcs":[[779,780,781,782,783,784,785]],"properties":{"id":"24661213","dp":5261,"de":5231}},{"type":"Polygon","arcs":[[-786,786,787,788,789,790,791,792,793]],"properties":{"id":"24661214","dp":6711,"de":933}},{"type":"Polygon","arcs":[[794,795,796,-788]],"properties":{"id":"24661215","dp":18148,"de":1851}},{"type":"Polygon","arcs":[[-797,797,798,-789]],"properties":{"id":"24661216","dp":19680,"de":3723}},{"type":"Polygon","arcs":[[-790,-799,799,800]],"properties":{"id":"24661217","dp":17804,"de":0}},{"type":"Polygon","arcs":[[-791,-801,801,802]],"properties":{"id":"24661218","dp":21421,"de":2696}},{"type":"Polygon","arcs":[[-792,-803,803,804]],"properties":{"id":"24661219","dp":11752,"de":2061}},{"type":"Polygon","arcs":[[-805,805,806,807]],"properties":{"id":"24661220","dp":11693,"de":3674}},{"type":"Polygon","arcs":[[-807,808,809]],"properties":{"id":"24661221","dp":13514,"de":2236}},{"type":"Polygon","arcs":[[-793,-808,-810,810,811,812,813,814]],"properties":{"id":"24661222","dp":8084,"de":3112}},{"type":"Polygon","arcs":[[815,-814,816,817,818,819,820]],"properties":{"id":"24661223","dp":2721,"de":1293}},{"type":"Polygon","arcs":[[821,822,823,824]],"properties":{"id":"24660715","dp":7667,"de":3137}},{"type":"Polygon","arcs":[[825,826,-822,827]],"properties":{"id":"24660716","dp":6704,"de":1787}},{"type":"Polygon","arcs":[[828,829,830,-826,831]],"properties":{"id":"24660717","dp":8223,"de":2919}},{"type":"Polygon","arcs":[[832,833,-830,834]],"properties":{"id":"24660718","dp":7019,"de":3425}},{"type":"Polygon","arcs":[[835,836,-185,-833,837]],"properties":{"id":"24660719","dp":6743,"de":3362}},{"type":"Polygon","arcs":[[838,-187,839,840]],"properties":{"id":"24660722","dp":14111,"de":2439}},{"type":"Polygon","arcs":[[841,842,-182,-839]],"properties":{"id":"24660723","dp":14735,"de":8730}},{"type":"Polygon","arcs":[[843,-183,-843,844]],"properties":{"id":"24660724","dp":13245,"de":1324}},{"type":"Polygon","arcs":[[-844,845,846,847,848,-168,-177]],"properties":{"id":"24660725","dp":6444,"de":2017}},{"type":"Polygon","arcs":[[849,850,-847,851,852,853]],"properties":{"id":"24660726","dp":4920,"de":3063}},{"type":"Polygon","arcs":[[854,855,856,857,858]],"properties":{"id":"24660749","dp":19316,"de":2278}},{"type":"Polygon","arcs":[[-859,859,860,861,862]],"properties":{"id":"24660750","dp":8036,"de":1740}},{"type":"Polygon","arcs":[[-143,863,-861,864]],"properties":{"id":"24660751","dp":11931,"de":956}},{"type":"Polygon","arcs":[[865,866,867,868]],"properties":{"id":"24662884","dp":4529,"de":0}},{"type":"MultiPolygon","arcs":[[[869,870,871,872,-866,873,874]],[[875]]],"properties":{"id":"24662885","dp":1894,"de":308}},{"type":"Polygon","arcs":[[876,877,-870,878]],"properties":{"id":"24662886","dp":7047,"de":0}},{"type":"Polygon","arcs":[[879,880,881,882,-877,883]],"properties":{"id":"24662887","dp":9032,"de":0}},{"type":"Polygon","arcs":[[884,885,886,887,888,889,890]],"properties":{"id":"24662888","dp":3292,"de":263}},{"type":"Polygon","arcs":[[891,892,-886,893]],"properties":{"id":"24662889","dp":6524,"de":0}},{"type":"Polygon","arcs":[[894,895,-894,-885]],"properties":{"id":"24662890","dp":6933,"de":0}},{"type":"Polygon","arcs":[[896,897,-892,-896,898,899]],"properties":{"id":"24662891","dp":7590,"de":0}},{"type":"Polygon","arcs":[[-900,900,901,902]],"properties":{"id":"24662892","dp":5797,"de":0}},{"type":"Polygon","arcs":[[903,-901,904,905,906]],"properties":{"id":"24662893","dp":4546,"de":0}},{"type":"Polygon","arcs":[[-899,-895,-891,907,-905]],"properties":{"id":"24662894","dp":4164,"de":0}},{"type":"Polygon","arcs":[[-908,908,909,910]],"properties":{"id":"24662895","dp":5343,"de":0}},{"type":"Polygon","arcs":[[-906,-911,911,912]],"properties":{"id":"24662896","dp":5953,"de":684}},{"type":"Polygon","arcs":[[913,914,915,916,917,918]],"properties":{"id":"24661583","dp":2600,"de":306}},{"type":"Polygon","arcs":[[919,920,-915,921]],"properties":{"id":"24661584","dp":2784,"de":451}},{"type":"Polygon","arcs":[[922,923,924,-922,-914]],"properties":{"id":"24661585","dp":4379,"de":948}},{"type":"Polygon","arcs":[[-920,-925,925,926,927]],"properties":{"id":"24661586","dp":2973,"de":0}},{"type":"Polygon","arcs":[[-924,928,929,930,931,932,-926]],"properties":{"id":"24661587","dp":3944,"de":657}},{"type":"Polygon","arcs":[[-927,-933,933,934,935]],"properties":{"id":"24661589","dp":2770,"de":840}},{"type":"Polygon","arcs":[[936,-928,-936,937,938,939]],"properties":{"id":"24661590","dp":2453,"de":284}},{"type":"Polygon","arcs":[[-938,-935,940,941,942,943,944,945]],"properties":{"id":"24661591","dp":3828,"de":3190}},{"type":"Polygon","arcs":[[946,947,948]],"properties":{"id":"24662549","dp":6190,"de":0}},{"type":"Polygon","arcs":[[949,950,951,952,-848,-851]],"properties":{"id":"24660727","dp":7519,"de":983}},{"type":"Polygon","arcs":[[953,954,955,956,957,-950,-850]],"properties":{"id":"24660728","dp":8488,"de":2785}},{"type":"Polygon","arcs":[[958,-954,959,960]],"properties":{"id":"24660729","dp":14304,"de":0}},{"type":"Polygon","arcs":[[961,-955,-959,962]],"properties":{"id":"24660730","dp":11732,"de":4385}},{"type":"Polygon","arcs":[[963,-956,-962,964]],"properties":{"id":"24660731","dp":14750,"de":3333}},{"type":"Polygon","arcs":[[965,966,-964,967]],"properties":{"id":"24660732","dp":11921,"de":2156}},{"type":"Polygon","arcs":[[968,969,-966,970]],"properties":{"id":"24660733","dp":8852,"de":2550}},{"type":"Polygon","arcs":[[971,972,973,-957,-967,-970]],"properties":{"id":"24660734","dp":12379,"de":3291}},{"type":"Polygon","arcs":[[974,975,976,-972,977,978]],"properties":{"id":"24660735","dp":9475,"de":846}},{"type":"Polygon","arcs":[[979,980,-978,-969]],"properties":{"id":"24660736","dp":22776,"de":0}},{"type":"Polygon","arcs":[[981,-979,-981]],"properties":{"id":"24660737","dp":21798,"de":1419}},{"type":"Polygon","arcs":[[982,983,984,-982,-980,-971,-968,-965,-963,-961,985,986,987]],"properties":{"id":"24660738","dp":8438,"de":1526}},{"type":"Polygon","arcs":[[988,989,990,991,992,-983,993]],"properties":{"id":"24660741","dp":26512,"de":3914}},{"type":"Polygon","arcs":[[994,995,-991]],"properties":{"id":"24660742","dp":14478,"de":0}},{"type":"Polygon","arcs":[[996,997,998,999,1000,-995,-990]],"properties":{"id":"24660743","dp":5183,"de":0}},{"type":"Polygon","arcs":[[1001,1002,1003]],"properties":{"id":"24661234","dp":9777,"de":0}},{"type":"Polygon","arcs":[[1004,1005,1006]],"properties":{"id":"24661237","dp":5723,"de":0}},{"type":"Polygon","arcs":[[1007,1008,1009,1010,1011,1012,1013]],"properties":{"id":"24661240","dp":3181,"de":8764}},{"type":"Polygon","arcs":[[-1013,1014]],"properties":{"id":"24661241","dp":7276,"de":0}},{"type":"Polygon","arcs":[[1015,-862,-864,-142,-146,1016]],"properties":{"id":"24660752","dp":4836,"de":653}},{"type":"Polygon","arcs":[[1017,1018,-1017,1019,1020]],"properties":{"id":"24660753","dp":4845,"de":1452}},{"type":"Polygon","arcs":[[1021,-1020,-145,1022,1023,-976]],"properties":{"id":"24660754","dp":6224,"de":1491}},{"type":"Polygon","arcs":[[1024,1025,-1021,-1022,-975,-985]],"properties":{"id":"24660755","dp":11419,"de":4481}},{"type":"Polygon","arcs":[[-977,-1024,1026,1027,-973]],"properties":{"id":"24660756","dp":7419,"de":1093}},{"type":"Polygon","arcs":[[-1023,-149,1028,-1027]],"properties":{"id":"24660757","dp":12898,"de":1759}},{"type":"Polygon","arcs":[[-1029,-151,-154,1029]],"properties":{"id":"24660758","dp":7137,"de":1982}},{"type":"Polygon","arcs":[[-974,-1028,-1030,-156,1030,-958]],"properties":{"id":"24660759","dp":5183,"de":3210}},{"type":"Polygon","arcs":[[-1031,-159,1031,-951]],"properties":{"id":"24660760","dp":7373,"de":3006}},{"type":"Polygon","arcs":[[-1032,-163,1032,-952]],"properties":{"id":"24660761","dp":8741,"de":2532}},{"type":"Polygon","arcs":[[-1033,-167,-169,-849,-953]],"properties":{"id":"24660762","dp":10111,"de":4306}},{"type":"Polygon","arcs":[[1033,1034,1035,-865]],"properties":{"id":"24660763","dp":10505,"de":0}},{"type":"Polygon","arcs":[[-1036,1036,1037,1038,-137,-144]],"properties":{"id":"24660764","dp":6917,"de":1820}},{"type":"Polygon","arcs":[[1039,1040,1041,1042,1043,-1037,-1035,1044]],"properties":{"id":"24660765","dp":12311,"de":6182}},{"type":"Polygon","arcs":[[-1044,1045,1046,-1038]],"properties":{"id":"24660766","dp":10347,"de":1544}},{"type":"Polygon","arcs":[[-1043,1047,1048,1049,1050,-1046]],"properties":{"id":"24660767","dp":4532,"de":0}},{"type":"Polygon","arcs":[[-1039,-1047,-1051,1051,1052,1053]],"properties":{"id":"24660768","dp":3583,"de":487}},{"type":"Polygon","arcs":[[-129,-138,-1054,1054,1055,1056]],"properties":{"id":"24660769","dp":4103,"de":612}},{"type":"Polygon","arcs":[[-130,-1057,1057,-121]],"properties":{"id":"24660770","dp":2805,"de":741}},{"type":"Polygon","arcs":[[-1058,-1056,1058,1059,1060,-108,-119,-122]],"properties":{"id":"24660771","dp":2493,"de":396}},{"type":"Polygon","arcs":[[-1061,1061,1062,-109]],"properties":{"id":"24660772","dp":9883,"de":773}},{"type":"Polygon","arcs":[[1063,1064,1065,-1062]],"properties":{"id":"24660773","dp":9652,"de":0}},{"type":"Polygon","arcs":[[-1066,1066,1067,1068]],"properties":{"id":"24660774","dp":15219,"de":1732}},{"type":"Polygon","arcs":[[1069,-1068,1070,1071,1072,1073,1074]],"properties":{"id":"24660775","dp":8818,"de":2140}},{"type":"Polygon","arcs":[[-1075,1075,1076,1077,1078]],"properties":{"id":"24660776","dp":9580,"de":1881}},{"type":"Polygon","arcs":[[-1074,1079,1080,-1076]],"properties":{"id":"24660777","dp":8269,"de":2884}},{"type":"Polygon","arcs":[[1081,-1079,1082,-693]],"properties":{"id":"24660778","dp":11621,"de":4223}},{"type":"Polygon","arcs":[[1083,1084,1085,1086,1087,1088,1089,1090,1091,1092]],"properties":{"id":"24661262","dp":10544,"de":11245}},{"type":"Polygon","arcs":[[-1093,1093,1094]],"properties":{"id":"24661263","dp":10688,"de":0}},{"type":"Polygon","arcs":[[-1092,1095,-1094]],"properties":{"id":"24661264","dp":14722,"de":599}},{"type":"Polygon","arcs":[[1096,1097,1098,1099,1100,-949,1101,1102,1103,1104,1105,1106]],"properties":{"id":"24662550","dp":5727,"de":546}},{"type":"Polygon","arcs":[[-1101,1107,1108,1109,-947]],"properties":{"id":"24662551","dp":8291,"de":0}},{"type":"Polygon","arcs":[[-1100,1110,1111,-1108]],"properties":{"id":"24662552","dp":10076,"de":0}},{"type":"Polygon","arcs":[[-1109,-1112,1112,1113,1114]],"properties":{"id":"24662553","dp":4893,"de":0}},{"type":"Polygon","arcs":[[1115,1116,-1113,-1111,-1099]],"properties":{"id":"24662554","dp":10898,"de":0}},{"type":"Polygon","arcs":[[-1114,-1117,1117,1118,1119]],"properties":{"id":"24662555","dp":9113,"de":0}},{"type":"Polygon","arcs":[[1120,1121,1122,1123,1124,1125,1126,1127,1128,1129]],"properties":{"id":"24662948","dp":453,"de":63}},{"type":"Polygon","arcs":[[1130,1131,1132,-1123,1133,1134]],"properties":{"id":"24662949","dp":1624,"de":1021}},{"type":"MultiPolygon","arcs":[[[1135,1136,1137,-1129,1138,1139,1140]],[[1141]]],"properties":{"id":"24662951","dp":1327,"de":0}},{"type":"Polygon","arcs":[[1142,1143,1144,1145,1146,1147]],"properties":{"id":"24662952","dp":4083,"de":0}},{"type":"Polygon","arcs":[[1148,1149,-1148,1150,1151,-430]],"properties":{"id":"24662953","dp":1585,"de":954}},{"type":"Polygon","arcs":[[-436,1152,1153,-1149,-429]],"properties":{"id":"24662954","dp":4192,"de":0}},{"type":"Polygon","arcs":[[1154,1155,-1154,1156]],"properties":{"id":"24662955","dp":6779,"de":0}},{"type":"Polygon","arcs":[[-1157,-1153,-458,1157]],"properties":{"id":"24662956","dp":4753,"de":0}},{"type":"Polygon","arcs":[[1158,1159,-1155,-1158,-457,-466]],"properties":{"id":"24662957","dp":4014,"de":0}},{"type":"Polygon","arcs":[[-1010,1160,1161,1162,1163,1164,1165,1166]],"properties":{"id":"24661224","dp":3673,"de":543}},{"type":"Polygon","arcs":[[-1163,1167]],"properties":{"id":"24661225","dp":8734,"de":4430}},{"type":"Polygon","arcs":[[1168,1169,-1164,-1168,-1162,1170]],"properties":{"id":"24661226","dp":6306,"de":1749}},{"type":"Polygon","arcs":[[1171,-1171,-1161,-1009]],"properties":{"id":"24661227","dp":7016,"de":665}},{"type":"Polygon","arcs":[[1172,1173,1174,-1169,-1172]],"properties":{"id":"24661228","dp":5756,"de":1204}},{"type":"Polygon","arcs":[[-1006,1175,-1003,1176,-1173,-1008]],"properties":{"id":"24661229","dp":12388,"de":530}},{"type":"Polygon","arcs":[[-1177,1177,1178,1179,1180,-1174]],"properties":{"id":"24661230","dp":5897,"de":482}},{"type":"Polygon","arcs":[[-1165,-1170,-1175,-1181]],"properties":{"id":"24661231","dp":5275,"de":0}},{"type":"Polygon","arcs":[[1181,1182,-1179,1183]],"properties":{"id":"24661232","dp":9961,"de":1413}},{"type":"Polygon","arcs":[[-1184,-1178,-1002,1184]],"properties":{"id":"24661233","dp":8900,"de":955}},{"type":"MultiPolygon","arcs":[[[1185,-821,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200]],[[1201,1202]]],"properties":{"id":"24661242","dp":258,"de":753}},{"type":"Polygon","arcs":[[1203,1204,-1193]],"properties":{"id":"24661243","dp":11314,"de":11896}},{"type":"Polygon","arcs":[[1205,1206,1207,-1194,-1205]],"properties":{"id":"24661244","dp":15228,"de":1428}},{"type":"Polygon","arcs":[[1208,-1084,-1095,-1096,-1091,1209,1210,1211]],"properties":{"id":"24661265","dp":4266,"de":28208}},{"type":"Polygon","arcs":[[1212,1213,1214,1215,1216,1217,1218]],"properties":{"id":"24660302","dp":1865,"de":2736}},{"type":"Polygon","arcs":[[1219,1220,1221,1222,-1213,1223]],"properties":{"id":"24660303","dp":3634,"de":3670}},{"type":"Polygon","arcs":[[1224,-1195,-1208]],"properties":{"id":"24661245","dp":9284,"de":994}},{"type":"Polygon","arcs":[[1225,-1196,-1225,-1207,1226]],"properties":{"id":"24661246","dp":11670,"de":1002}},{"type":"Polygon","arcs":[[1227,-1227,-1206,-1204,1228]],"properties":{"id":"24661247","dp":12923,"de":2769}},{"type":"Polygon","arcs":[[1229,-1229,-1192]],"properties":{"id":"24661248","dp":9450,"de":2094}},{"type":"Polygon","arcs":[[-1191,1230,1231,1232,-1228,-1230]],"properties":{"id":"24661249","dp":10381,"de":2359}},{"type":"Polygon","arcs":[[1233,1234,1235,1236,-1197,-1226,-1233]],"properties":{"id":"24661250","dp":9612,"de":862}},{"type":"Polygon","arcs":[[1237,1238,-1198,-1237]],"properties":{"id":"24661251","dp":12371,"de":1482}},{"type":"Polygon","arcs":[[-1239,1239,1240,1241,1242,1243,-1199]],"properties":{"id":"24661252","dp":4372,"de":11270}},{"type":"Polygon","arcs":[[1244,1245,1246]],"properties":{"id":"24661255","dp":8291,"de":32020}},{"type":"Polygon","arcs":[[-1247,1247,1248,1249,1250,1251,1252]],"properties":{"id":"24661256","dp":4213,"de":74639}},{"type":"Polygon","arcs":[[1253,-1252,1254,1255,1256]],"properties":{"id":"24661257","dp":4213,"de":39480}},{"type":"Polygon","arcs":[[1257,1258,1259,-1255]],"properties":{"id":"24661258","dp":5163,"de":5655}},{"type":"Polygon","arcs":[[-1260,1260,1261,1262,-1256]],"properties":{"id":"24661259","dp":3602,"de":49947}},{"type":"Polygon","arcs":[[1263,-1085,1264,-1261,-1259]],"properties":{"id":"24661260","dp":15390,"de":21335}},{"type":"Polygon","arcs":[[-1265,-1209,1265,-1262]],"properties":{"id":"24661261","dp":13935,"de":18783}},{"type":"Polygon","arcs":[[1266,1267,1268,1269,1270]],"properties":{"id":"24661269","dp":10143,"de":15503}},{"type":"Polygon","arcs":[[1271,1272,1273,-1268,1274]],"properties":{"id":"24661270","dp":25177,"de":24703}},{"type":"Polygon","arcs":[[1275,-1275,-1267,1276]],"properties":{"id":"24661271","dp":23439,"de":12698}},{"type":"Polygon","arcs":[[1277,1278,1279,-1272,-1276,1280]],"properties":{"id":"24661272","dp":23659,"de":14245}},{"type":"Polygon","arcs":[[1281,1282,-1279]],"properties":{"id":"24661273","dp":34525,"de":28212}},{"type":"Polygon","arcs":[[1283,1284,1285,1286,1287]],"properties":{"id":"24661276","dp":32985,"de":4228}},{"type":"Polygon","arcs":[[1288,1289,1290,-1285,1291,1292,1293]],"properties":{"id":"24661277","dp":19180,"de":1803}},{"type":"Polygon","arcs":[[1294,1295,1296,-1290,1297,1298]],"properties":{"id":"24661278","dp":19310,"de":3918}},{"type":"Polygon","arcs":[[-1298,-1289,1299]],"properties":{"id":"24661279","dp":23975,"de":0}},{"type":"Polygon","arcs":[[1300,-1300,1301,1302]],"properties":{"id":"24661280","dp":30720,"de":11261}},{"type":"Polygon","arcs":[[1303,-1302,-1294,1304]],"properties":{"id":"24661281","dp":39278,"de":6443}},{"type":"Polygon","arcs":[[1305,-1305,-1293,1306,-1278]],"properties":{"id":"24661282","dp":20572,"de":14583}},{"type":"Polygon","arcs":[[-1250,1307,1308,1309,1310,1311,-1303,-1304,-1306,1312,1313]],"properties":{"id":"24661283","dp":3006,"de":135078}},{"type":"Polygon","arcs":[[1314,1315,-1299,-1301,-1312]],"properties":{"id":"24661284","dp":5856,"de":10763}},{"type":"Polygon","arcs":[[-1316,1316,1317,-1295]],"properties":{"id":"24661285","dp":31428,"de":2747}},{"type":"Polygon","arcs":[[1318,1319,-1296,-1318]],"properties":{"id":"24661286","dp":19859,"de":4205}},{"type":"Polygon","arcs":[[1320,1321,1322,1323,1324,1325,1326,1327,1328,1329]],"properties":{"id":"24661299","dp":1509,"de":12065}},{"type":"Polygon","arcs":[[1330,1331,1332,-1327]],"properties":{"id":"24661300","dp":12480,"de":0}},{"type":"Polygon","arcs":[[1333,1334,1335,1336,-1331,-1326]],"properties":{"id":"24661301","dp":9872,"de":3200}},{"type":"Polygon","arcs":[[-1337,1337,1338,1339,-1332]],"properties":{"id":"24661302","dp":7579,"de":1460}},{"type":"Polygon","arcs":[[-1338,-1336,1340,1341,1342]],"properties":{"id":"24661303","dp":7226,"de":2176}},{"type":"Polygon","arcs":[[1343,1344,1345,-1342]],"properties":{"id":"24661304","dp":6115,"de":1652}},{"type":"Polygon","arcs":[[1346,-1345,1347,1348]],"properties":{"id":"24661305","dp":11550,"de":7219}},{"type":"Polygon","arcs":[[-1349,1349,1350,1351]],"properties":{"id":"24661306","dp":33834,"de":0}},{"type":"Polygon","arcs":[[1352,1353,-1351]],"properties":{"id":"24661308","dp":20664,"de":0}},{"type":"Polygon","arcs":[[-1350,-1348,1354,1355,1356,1357,-1353]],"properties":{"id":"24661309","dp":4461,"de":8568}},{"type":"Polygon","arcs":[[1358,1359,-1358]],"properties":{"id":"24661310","dp":20965,"de":0}},{"type":"Polygon","arcs":[[1360,1361,1362,1363,1364,1365]],"properties":{"id":"24660395","dp":10242,"de":0}},{"type":"Polygon","arcs":[[1366,1367,1368,1369,1370,-1363]],"properties":{"id":"24660396","dp":10130,"de":0}},{"type":"Polygon","arcs":[[-1366,1371,1372]],"properties":{"id":"24660397","dp":11880,"de":0}},{"type":"Polygon","arcs":[[1373,1374,-1361,-1373,1375,1376,1377,1378,1379,1380,1381]],"properties":{"id":"24660398","dp":3646,"de":2889}},{"type":"Polygon","arcs":[[1382,1383,1384,1385,1386]],"properties":{"id":"24660335","dp":6886,"de":2422}},{"type":"Polygon","arcs":[[1387,1388,1389,1390,1391,1392,-391]],"properties":{"id":"24662081","dp":10320,"de":2533}},{"type":"Polygon","arcs":[[1393,1394,1395,1396,1397]],"properties":{"id":"24660194","dp":6417,"de":1819}},{"type":"Polygon","arcs":[[1398,1399,1400]],"properties":{"id":"24660195","dp":6399,"de":2060}},{"type":"Polygon","arcs":[[1401,1402,1403,1404,-1395,1405,1406]],"properties":{"id":"24660196","dp":6960,"de":1062}},{"type":"Polygon","arcs":[[1407,1408,1409,-1403,1410]],"properties":{"id":"24660197","dp":8815,"de":877}},{"type":"Polygon","arcs":[[1411,1412,1413,-1408,1414,1415,1416]],"properties":{"id":"24660198","dp":5286,"de":423}},{"type":"Polygon","arcs":[[1417,1418,1419,1420,1421,1422,-1409,-1414,1423]],"properties":{"id":"24660199","dp":2222,"de":4573}},{"type":"Polygon","arcs":[[1424,1425,1426,1427,1428,-1214,-1223]],"properties":{"id":"24660304","dp":7336,"de":2680}},{"type":"Polygon","arcs":[[1429,1430,1431,-1425,-1222]],"properties":{"id":"24660305","dp":14721,"de":0}},{"type":"Polygon","arcs":[[1432,1433,-1426,-1432]],"properties":{"id":"24660306","dp":14441,"de":0}},{"type":"Polygon","arcs":[[1434,1435,-1427,-1434]],"properties":{"id":"24660307","dp":13449,"de":0}},{"type":"Polygon","arcs":[[-392,-1393,1436,1437]],"properties":{"id":"24662082","dp":32198,"de":0}},{"type":"Polygon","arcs":[[-393,-1438,1438]],"properties":{"id":"24662083","dp":16061,"de":0}},{"type":"Polygon","arcs":[[-1439,-1437,-1392,1439,1440,1441,1442,1443,-394]],"properties":{"id":"24662084","dp":3544,"de":786}},{"type":"Polygon","arcs":[[-1444,1444,1445,-395]],"properties":{"id":"24662085","dp":9063,"de":550}},{"type":"Polygon","arcs":[[1446,-1446,1447,1448,1449]],"properties":{"id":"24662086","dp":9446,"de":2551}},{"type":"Polygon","arcs":[[1450,1451,1452,1453,1454]],"properties":{"id":"24662087","dp":21285,"de":2428}},{"type":"Polygon","arcs":[[1455,1456,-1452,1457]],"properties":{"id":"24662088","dp":19668,"de":0}},{"type":"Polygon","arcs":[[1458,1459,1460,1461,1462,1463,1464,1465,1466,-1453,-1457,1467,1468,1469]],"properties":{"id":"24662089","dp":3893,"de":3973}},{"type":"Polygon","arcs":[[1470,1471,1472,1473,-1461]],"properties":{"id":"24662090","dp":7603,"de":1143}},{"type":"Polygon","arcs":[[1474,1475,-1471,-1460,1476,1477,1478]],"properties":{"id":"24662091","dp":4567,"de":2314}},{"type":"Polygon","arcs":[[1479,-1479,1480,1481,1482]],"properties":{"id":"24662092","dp":16334,"de":0}},{"type":"Polygon","arcs":[[1483,-1483,1484,1485]],"properties":{"id":"24662093","dp":17883,"de":0}},{"type":"Polygon","arcs":[[1486,1487,1488,1489,-1480,-1484]],"properties":{"id":"24662094","dp":16941,"de":0}},{"type":"Polygon","arcs":[[1490,1491,1492,1493]],"properties":{"id":"24662095","dp":10494,"de":3268}},{"type":"Polygon","arcs":[[1494,1495,1496,-1491,1497]],"properties":{"id":"24662096","dp":11922,"de":2375}},{"type":"Polygon","arcs":[[1498,1499,1500,-1496,1501]],"properties":{"id":"24662097","dp":14433,"de":1889}},{"type":"Polygon","arcs":[[1502,1503,1504]],"properties":{"id":"24662425","dp":2648,"de":227}},{"type":"Polygon","arcs":[[1505,1506,1507,1508,1509,-1505,1510,1511,1512]],"properties":{"id":"24662426","dp":2375,"de":642}},{"type":"Polygon","arcs":[[1513,1514,-1507,1515,1516]],"properties":{"id":"24662427","dp":2989,"de":0}},{"type":"Polygon","arcs":[[1517,-1516,-1506,1518]],"properties":{"id":"24662428","dp":3507,"de":0}},{"type":"Polygon","arcs":[[1519,1520,-1517,-1518]],"properties":{"id":"24662429","dp":2811,"de":0}},{"type":"Polygon","arcs":[[1521,1522,-1514,-1521,1523,1524]],"properties":{"id":"24662430","dp":3947,"de":3220}},{"type":"Polygon","arcs":[[1525,1526,-1525]],"properties":{"id":"24662431","dp":3490,"de":0}},{"type":"Polygon","arcs":[[1527,1528,1529,-1522,-1527,1530,1531,1532]],"properties":{"id":"24662432","dp":60,"de":3143}},{"type":"Polygon","arcs":[[1533,1534,1535,1536]],"properties":{"id":"24661691","dp":10052,"de":0}},{"type":"Polygon","arcs":[[1537,1538,1539,-1535]],"properties":{"id":"24661692","dp":12677,"de":1036}},{"type":"Polygon","arcs":[[1540,1541,1542,1543,1544,1545]],"properties":{"id":"24660275","dp":14750,"de":4621}},{"type":"Polygon","arcs":[[1546,1547,1548,1549,1550,1551]],"properties":{"id":"24660276","dp":4398,"de":1077}},{"type":"Polygon","arcs":[[1552,1553,-1549]],"properties":{"id":"24660277","dp":7535,"de":991}},{"type":"Polygon","arcs":[[-1548,1554,1555,1556,1557,-1553]],"properties":{"id":"24660278","dp":3608,"de":0}},{"type":"Polygon","arcs":[[1558,1559,-1557,1560,1561]],"properties":{"id":"24660279","dp":4084,"de":0}},{"type":"Polygon","arcs":[[-1561,-1556,1562,1563,1564,1565,1566,1567]],"properties":{"id":"24660280","dp":3697,"de":0}},{"type":"Polygon","arcs":[[1568,-1562,-1568,1569,1570]],"properties":{"id":"24660281","dp":6639,"de":3983}},{"type":"Polygon","arcs":[[-1571,-1430,-1221,1571,1572]],"properties":{"id":"24660282","dp":15441,"de":0}},{"type":"Polygon","arcs":[[-1559,-1569,-1573,1573,1574,1575]],"properties":{"id":"24660283","dp":8896,"de":2252}},{"type":"Polygon","arcs":[[-1574,-1572,-1220,1576,1577]],"properties":{"id":"24660284","dp":12043,"de":0}},{"type":"Polygon","arcs":[[-1575,-1578,1578,1579,1580]],"properties":{"id":"24660285","dp":12352,"de":1069}},{"type":"Polygon","arcs":[[1581,1582,-1580,1583]],"properties":{"id":"24660286","dp":11359,"de":0}},{"type":"Polygon","arcs":[[1584,1585,-1582,1586]],"properties":{"id":"24660287","dp":11125,"de":0}},{"type":"Polygon","arcs":[[-1550,-1554,-1558,-1560,-1576,-1581,-1583,-1586,1587]],"properties":{"id":"24660288","dp":2997,"de":572}},{"type":"Polygon","arcs":[[-1551,-1588,-1585,1588,1589]],"properties":{"id":"24660289","dp":4436,"de":3209}},{"type":"Polygon","arcs":[[-1589,-1587,-1584,-1579,-1577,-1224,-1219,1590,1591,1592,1593,1594]],"properties":{"id":"24660290","dp":881,"de":5260}},{"type":"Polygon","arcs":[[1595,1596,1597,-1593]],"properties":{"id":"24660291","dp":13029,"de":0}},{"type":"Polygon","arcs":[[-1597,1598,1599,1600,1601]],"properties":{"id":"24660292","dp":14340,"de":3085}},{"type":"Polygon","arcs":[[-1599,-1596,-1592,1602,1603]],"properties":{"id":"24660293","dp":9424,"de":0}},{"type":"Polygon","arcs":[[-1604,1604,1605,1606,1607,-1600]],"properties":{"id":"24660294","dp":7266,"de":0}},{"type":"Polygon","arcs":[[-1601,-1608,1608,1609,1610]],"properties":{"id":"24660295","dp":10255,"de":0}},{"type":"Polygon","arcs":[[-1607,1611,1612,1613,1614,-1609]],"properties":{"id":"24660296","dp":10027,"de":1426}},{"type":"Polygon","arcs":[[-1614,1615,1616]],"properties":{"id":"24660297","dp":8167,"de":0}},{"type":"Polygon","arcs":[[-1613,1617,1618,-1616]],"properties":{"id":"24660298","dp":6766,"de":0}},{"type":"Polygon","arcs":[[1619,1620,1621,-1618,-1612,-1606]],"properties":{"id":"24660299","dp":8714,"de":2254}},{"type":"Polygon","arcs":[[-1603,-1591,-1218,1622,-1620,-1605]],"properties":{"id":"24660300","dp":4604,"de":0}},{"type":"Polygon","arcs":[[-1217,1623,1624,1625,1626,-1621,-1623]],"properties":{"id":"24660301","dp":1470,"de":1672}},{"type":"Polygon","arcs":[[1627,1628,1629,-1428,-1436,1630]],"properties":{"id":"24660308","dp":11556,"de":0}},{"type":"Polygon","arcs":[[1631,1632,-1628,1633]],"properties":{"id":"24660309","dp":7460,"de":0}},{"type":"Polygon","arcs":[[1634,1635,1636,-1632]],"properties":{"id":"24660310","dp":14345,"de":0}},{"type":"Polygon","arcs":[[1637,1638,1639,1640,-1636,1641]],"properties":{"id":"24660311","dp":13577,"de":0}},{"type":"Polygon","arcs":[[1642,-1639]],"properties":{"id":"24660312","dp":11893,"de":0}},{"type":"Polygon","arcs":[[1643,1644,1645,1646,-1640,-1643,-1638]],"properties":{"id":"24660313","dp":4276,"de":3872}},{"type":"Polygon","arcs":[[1647,1648,1649,1650,1651,-1646,1652]],"properties":{"id":"24660314","dp":1610,"de":1587}},{"type":"Polygon","arcs":[[1653,1654,-1649,1655]],"properties":{"id":"24660315","dp":4853,"de":0}},{"type":"Polygon","arcs":[[1656,-1654,1657]],"properties":{"id":"24660316","dp":10881,"de":0}},{"type":"Polygon","arcs":[[1658,1659,1660]],"properties":{"id":"24660319","dp":15719,"de":0}},{"type":"Polygon","arcs":[[1661,1662,1663,-1659,1664]],"properties":{"id":"24660320","dp":17446,"de":0}},{"type":"Polygon","arcs":[[1665,-1665,1666,1667]],"properties":{"id":"24660321","dp":14506,"de":0}},{"type":"Polygon","arcs":[[1668,-1662,-1666,1669]],"properties":{"id":"24660322","dp":15473,"de":0}},{"type":"Polygon","arcs":[[1670,1671,1672,1673,-1663,-1669]],"properties":{"id":"24660323","dp":9120,"de":0}},{"type":"Polygon","arcs":[[1674,1675,1676,-1672]],"properties":{"id":"24660324","dp":14019,"de":1331}},{"type":"Polygon","arcs":[[-1673,-1677,1677,1678,1679]],"properties":{"id":"24660325","dp":18655,"de":0}},{"type":"Polygon","arcs":[[1680,-1679,1681,1682]],"properties":{"id":"24660326","dp":13955,"de":0}},{"type":"Polygon","arcs":[[1683,-1683,1684]],"properties":{"id":"24660327","dp":14862,"de":0}},{"type":"Polygon","arcs":[[1685,1686,1687,1688,-1685,-1682,1689]],"properties":{"id":"24660328","dp":15552,"de":1036}},{"type":"Polygon","arcs":[[1690,1691,1692,1693,-1688]],"properties":{"id":"24660329","dp":20916,"de":0}},{"type":"Polygon","arcs":[[1694,1695,1696,-1692,1697,1698]],"properties":{"id":"24660330","dp":15639,"de":1044}},{"type":"Polygon","arcs":[[1699,1700,-1696]],"properties":{"id":"24660331","dp":23619,"de":2941}},{"type":"Polygon","arcs":[[-1701,1701,1702,1703]],"properties":{"id":"24660332","dp":12557,"de":0}},{"type":"Polygon","arcs":[[-1703,1704,1705,1706]],"properties":{"id":"24660333","dp":26931,"de":0}},{"type":"Polygon","arcs":[[-1704,-1707,-1384,1707,-1693,-1697]],"properties":{"id":"24660334","dp":17231,"de":1612}},{"type":"Polygon","arcs":[[1708,1709,1710,1711,1712]],"properties":{"id":"24660840","dp":7241,"de":1239}},{"type":"Polygon","arcs":[[1713,-1712,1714,1715,1716]],"properties":{"id":"24660841","dp":11728,"de":793}},{"type":"Polygon","arcs":[[-1715,-1711,1717,1718,1719,1720]],"properties":{"id":"24660842","dp":15317,"de":2705}},{"type":"Polygon","arcs":[[1721,1722,1723,1724,1725]],"properties":{"id":"24660216","dp":12738,"de":0}},{"type":"Polygon","arcs":[[1726,1727,1728,-1723,1729]],"properties":{"id":"24660217","dp":20416,"de":3472}},{"type":"Polygon","arcs":[[1730,-1543,1731,-1728]],"properties":{"id":"24660218","dp":6618,"de":948}},{"type":"Polygon","arcs":[[-1544,-1731,-1727,1732,1733]],"properties":{"id":"24660219","dp":9982,"de":1158}},{"type":"Polygon","arcs":[[-1540,1734,1735]],"properties":{"id":"24661693","dp":10767,"de":0}},{"type":"Polygon","arcs":[[-1735,1736,1737,1738,1739,1740,1741]],"properties":{"id":"24661694","dp":4665,"de":18681}},{"type":"Polygon","arcs":[[-1740,1742,1743,1744]],"properties":{"id":"24661695","dp":10363,"de":0}},{"type":"Polygon","arcs":[[1745,-1741,-1745,1746,1747,1748,1749]],"properties":{"id":"24661696","dp":10017,"de":853}},{"type":"Polygon","arcs":[[1750,1751,-1747,-1744,1752,1753]],"properties":{"id":"24661697","dp":18777,"de":783}},{"type":"Polygon","arcs":[[-1748,-1752,1754,1755,1756]],"properties":{"id":"24661698","dp":9695,"de":0}},{"type":"Polygon","arcs":[[-1755,-1751,1757,1758,1759]],"properties":{"id":"24661699","dp":10851,"de":0}},{"type":"Polygon","arcs":[[-1754,1760,1761,1762,1763,1764,1765,-1758]],"properties":{"id":"24661700","dp":5499,"de":550}},{"type":"Polygon","arcs":[[1766,-1756,-1760,1767,1768,1769]],"properties":{"id":"24661701","dp":6071,"de":0}},{"type":"Polygon","arcs":[[1770,-1768]],"properties":{"id":"24661702","dp":12620,"de":0}},{"type":"MultiPolygon","arcs":[[[1771,1772,1773,1774,1775,1776,1777,1778,1779]],[[1780,1781]],[[1782,1783]],[[1784,1785]]],"properties":{"id":"24662193","dp":2677,"de":1628}},{"type":"Polygon","arcs":[[1786,1787,1788,1789,1790,-1776]],"properties":{"id":"24662194","dp":11546,"de":1251}},{"type":"Polygon","arcs":[[-1777,-1791,1791]],"properties":{"id":"24662195","dp":9233,"de":0}},{"type":"Polygon","arcs":[[1792,1793,-1789]],"properties":{"id":"24662196","dp":9212,"de":0}},{"type":"Polygon","arcs":[[1794,1795,1796,1797,-1790,-1794]],"properties":{"id":"24662197","dp":5282,"de":1479}},{"type":"Polygon","arcs":[[-1795,1798,1799,1800]],"properties":{"id":"24662198","dp":9160,"de":839}},{"type":"Polygon","arcs":[[1801,1802,1803,1804,1805,-1801]],"properties":{"id":"24662199","dp":11124,"de":1282}},{"type":"Polygon","arcs":[[1806,1807,1808,-1802]],"properties":{"id":"24662200","dp":26084,"de":0}},{"type":"Polygon","arcs":[[-1809,1809,1810,-1803]],"properties":{"id":"24662201","dp":18007,"de":0}},{"type":"Polygon","arcs":[[1811,1812,-1804,-1811]],"properties":{"id":"24662202","dp":14267,"de":0}},{"type":"Polygon","arcs":[[-1812,-1810,-1808,1813,1814,1815,1816]],"properties":{"id":"24662203","dp":16359,"de":963}},{"type":"Polygon","arcs":[[-1800,1817,-1814,-1807]],"properties":{"id":"24662204","dp":48198,"de":0}},{"type":"Polygon","arcs":[[1818,-1805,-1813,-1817,1819,1820],[1821]],"properties":{"id":"24662205","dp":7167,"de":0}},{"type":"Polygon","arcs":[[-1822]],"properties":{"id":"24662206","dp":8176,"de":828}},{"type":"Polygon","arcs":[[1822,-1385,-1706]],"properties":{"id":"24660336","dp":24911,"de":0}},{"type":"Polygon","arcs":[[1823,1824,1825,1826,1827,1828,1829,-1386,-1823,-1705,1830]],"properties":{"id":"24660337","dp":1429,"de":714}},{"type":"Polygon","arcs":[[1831,1832,-1824,1833]],"properties":{"id":"24660338","dp":26878,"de":0}},{"type":"Polygon","arcs":[[-1825,-1833,1834]],"properties":{"id":"24660339","dp":24393,"de":0}},{"type":"Polygon","arcs":[[-1826,-1835,-1832,1835,1836]],"properties":{"id":"24660340","dp":5519,"de":0}},{"type":"Polygon","arcs":[[-1836,1837,1838]],"properties":{"id":"24660341","dp":20785,"de":0}},{"type":"Polygon","arcs":[[1839,-1837,-1839,1840]],"properties":{"id":"24660342","dp":15495,"de":0}},{"type":"Polygon","arcs":[[-1840,1841,1842,1843,1844,1845,-1827]],"properties":{"id":"24660343","dp":7521,"de":2920}},{"type":"Polygon","arcs":[[-1841,1846,1847,1848,-1842]],"properties":{"id":"24660344","dp":21048,"de":0}},{"type":"Polygon","arcs":[[1849,-1843,-1849,1850,1851,1852,1853]],"properties":{"id":"24660345","dp":17427,"de":2624}},{"type":"Polygon","arcs":[[1854,1855,-1844,-1850,1856]],"properties":{"id":"24660346","dp":17276,"de":0}},{"type":"Polygon","arcs":[[1857,1858,-1855,1859]],"properties":{"id":"24660347","dp":14938,"de":2006}},{"type":"Polygon","arcs":[[-1860,-1857,1860,1861]],"properties":{"id":"24660348","dp":4517,"de":3622}},{"type":"Polygon","arcs":[[1862,1863,-1861,-1854,1864,1865,1866]],"properties":{"id":"24660349","dp":10616,"de":2312}},{"type":"Polygon","arcs":[[-1853,1867,1868,-1865]],"properties":{"id":"24660350","dp":29850,"de":2500}},{"type":"Polygon","arcs":[[-1852,1869,1870,-1868]],"properties":{"id":"24660351","dp":26300,"de":0}},{"type":"Polygon","arcs":[[-1870,1871]],"properties":{"id":"24660352","dp":26515,"de":0}},{"type":"Polygon","arcs":[[1872,1873,1874,-1871,-1872,-1851,-1848,1875,1876,1877,1878,1879,1880,1881]],"properties":{"id":"24660353","dp":504,"de":4974}},{"type":"Polygon","arcs":[[-1875,1882,-1866,-1869]],"properties":{"id":"24660354","dp":21788,"de":0}},{"type":"Polygon","arcs":[[1883,1884,1885,1886,-1867,-1883,-1874]],"properties":{"id":"24660355","dp":5610,"de":5052}},{"type":"Polygon","arcs":[[1887,1888,-1863,-1887,1889]],"properties":{"id":"24660356","dp":10344,"de":0}},{"type":"Polygon","arcs":[[1890,-1890,-1886,1891]],"properties":{"id":"24660357","dp":10936,"de":2224}},{"type":"Polygon","arcs":[[1892,1893,-1888,-1891,1894]],"properties":{"id":"24660358","dp":4829,"de":3930}},{"type":"Polygon","arcs":[[1895,1896,1897,1898,-1895,-1892,1899]],"properties":{"id":"24660359","dp":5068,"de":5425}},{"type":"Polygon","arcs":[[-1900,-1885,1900,1901]],"properties":{"id":"24660360","dp":9188,"de":4752}},{"type":"Polygon","arcs":[[1902,1903,-1896,-1902,1904,1905]],"properties":{"id":"24660361","dp":8870,"de":2419}},{"type":"Polygon","arcs":[[-1905,-1901,-1884,-1873,1906,1907,1908]],"properties":{"id":"24660362","dp":5838,"de":1838}},{"type":"Polygon","arcs":[[1909,1910,-1908]],"properties":{"id":"24660363","dp":21333,"de":0}},{"type":"Polygon","arcs":[[1911,1912,1913,1914,1915,-997,-989]],"properties":{"id":"24660870","dp":2283,"de":3942}},{"type":"Polygon","arcs":[[-1413,1916,1917,1918,1919,-1424]],"properties":{"id":"24660200","dp":5940,"de":1495}},{"type":"Polygon","arcs":[[1920,-1418,-1920]],"properties":{"id":"24660201","dp":15261,"de":0}},{"type":"Polygon","arcs":[[-1919,1921,1922,-1419,-1921]],"properties":{"id":"24660202","dp":14923,"de":0}},{"type":"Polygon","arcs":[[-621,1923,-614,1924,1925,1926,1927,1928,1929,1930,1931,-1422,1932]],"properties":{"id":"24660203","dp":1500,"de":6992}},{"type":"Polygon","arcs":[[-615,-1924,-620]],"properties":{"id":"24660204","dp":12657,"de":4931}},{"type":"Polygon","arcs":[[1933,1934,1935,1936,1937,1938,1939,1940,1941,1942]],"properties":{"id":"24660812","dp":1273,"de":772}},{"type":"Polygon","arcs":[[1943,1944,-1926]],"properties":{"id":"24660205","dp":20945,"de":1879}},{"type":"Polygon","arcs":[[-607,-1944,-1925,-613]],"properties":{"id":"24660206","dp":15395,"de":0}},{"type":"Polygon","arcs":[[1945,1946,1947,1948,1949,-1928],[1950]],"properties":{"id":"24660207","dp":3459,"de":1886}},{"type":"Polygon","arcs":[[-1951]],"properties":{"id":"24660208","dp":10092,"de":15797}},{"type":"Polygon","arcs":[[1951,1952,-1769,-1771,-1759,-1766,1953,1954,1955,-1595,-1929,-1950]],"properties":{"id":"24660209","dp":919,"de":4717}},{"type":"Polygon","arcs":[[-1765,1956,1957,-1954]],"properties":{"id":"24660210","dp":12107,"de":924}},{"type":"Polygon","arcs":[[1958,1959,-1957,-1764]],"properties":{"id":"24660211","dp":11984,"de":0}},{"type":"Polygon","arcs":[[-1960,1960,-1726,1961]],"properties":{"id":"24660212","dp":17538,"de":0}},{"type":"Polygon","arcs":[[-1962,1962,1963,-1955,-1958]],"properties":{"id":"24660213","dp":10966,"de":5098}},{"type":"Polygon","arcs":[[-1725,1964,-1963]],"properties":{"id":"24660214","dp":16655,"de":0}},{"type":"Polygon","arcs":[[-1965,-1724,-1729,-1732,-1542,-1552,-1590,-1956,-1964]],"properties":{"id":"24660215","dp":2931,"de":6869}},{"type":"Polygon","arcs":[[1965,1966,1967,1968,1969,1970,1971,1972]],"properties":{"id":"24660710","dp":1058,"de":289}},{"type":"Polygon","arcs":[[1973,1974,1975,1976,-1966,1977,1978]],"properties":{"id":"24660711","dp":2449,"de":1123}},{"type":"Polygon","arcs":[[1979,1980,-1974,1981,1982]],"properties":{"id":"24660712","dp":3549,"de":827}},{"type":"Polygon","arcs":[[1983,-1975,-1981,1984]],"properties":{"id":"24660713","dp":5000,"de":1076}},{"type":"Polygon","arcs":[[-1980,1985,1986,-823,-827,1987,1988,-1985]],"properties":{"id":"24660714","dp":2684,"de":481}},{"type":"Polygon","arcs":[[1989,1990,-1716,-1721]],"properties":{"id":"24660843","dp":9278,"de":2295}},{"type":"Polygon","arcs":[[-857,-1990,1991,1992]],"properties":{"id":"24660844","dp":19828,"de":0}},{"type":"Polygon","arcs":[[-858,-1993,1993,1994]],"properties":{"id":"24660845","dp":19557,"de":0}},{"type":"Polygon","arcs":[[-1995,1995,-1045,-1034,-860]],"properties":{"id":"24660846","dp":9328,"de":629}},{"type":"Polygon","arcs":[[-1994,1996,1997,-1040,-1996]],"properties":{"id":"24660847","dp":15994,"de":1771}},{"type":"Polygon","arcs":[[-1992,-1720,1998,1999,-1997]],"properties":{"id":"24660848","dp":20817,"de":0}},{"type":"Polygon","arcs":[[-2000,2000,2001,2002,-1041,-1998]],"properties":{"id":"24660849","dp":12334,"de":0}},{"type":"Polygon","arcs":[[2003,2004,-2001,-1999,-1719]],"properties":{"id":"24660850","dp":8991,"de":0}},{"type":"Polygon","arcs":[[2005,-2002,-2005,2006,2007,-1049]],"properties":{"id":"24660851","dp":3291,"de":663}},{"type":"Polygon","arcs":[[-2003,-2006,-1048,-1042]],"properties":{"id":"24660852","dp":15593,"de":0}},{"type":"Polygon","arcs":[[2008,2009,2010,2011,-1733,-1730,2012]],"properties":{"id":"24660220","dp":15119,"de":3030}},{"type":"Polygon","arcs":[[2013,2014,-2010]],"properties":{"id":"24660221","dp":9971,"de":0}},{"type":"Polygon","arcs":[[-1959,-1763,2015,-2013,-1722,-1961]],"properties":{"id":"24660222","dp":7621,"de":4405}},{"type":"Polygon","arcs":[[-2014,-2009,-2016,-1762,2016]],"properties":{"id":"24660223","dp":12115,"de":0}},{"type":"Polygon","arcs":[[2017,-2011,-2015,-2017,-1761,-1753]],"properties":{"id":"24660224","dp":7843,"de":2973}},{"type":"Polygon","arcs":[[-1739,2018,2019,2020,-2012,-2018,-1743]],"properties":{"id":"24660225","dp":10223,"de":1807}},{"type":"Polygon","arcs":[[2021,2022,2023,-2019,-1738]],"properties":{"id":"24660226","dp":10194,"de":0}},{"type":"Polygon","arcs":[[2024,2025,2026,-1939,2027,2028,2029,2030,2031,-1821,2032,2033,-1533,2034]],"properties":{"id":"24662433","dp":75,"de":1528}},{"type":"Polygon","arcs":[[2035,-2025,2036,2037,2038,2039,2040,2041,2042]],"properties":{"id":"24662434","dp":383,"de":566}},{"type":"Polygon","arcs":[[2043,2044,2045,2046,2047,2048,2049,2050,-2038,2051,2052]],"properties":{"id":"24662435","dp":1157,"de":196}},{"type":"Polygon","arcs":[[-2049,2053,2054]],"properties":{"id":"24662436","dp":4584,"de":978}},{"type":"Polygon","arcs":[[2055,2056,-2046,2057]],"properties":{"id":"24662439","dp":12768,"de":2066}},{"type":"Polygon","arcs":[[2058,-2047,-2057]],"properties":{"id":"24662440","dp":8561,"de":499}},{"type":"Polygon","arcs":[[2059,2060]],"properties":{"id":"24662442","dp":12774,"de":0}},{"type":"Polygon","arcs":[[2061,2062,2063,2064,2065]],"properties":{"id":"24662871","dp":4619,"de":469}},{"type":"Polygon","arcs":[[-2064,2066,2067,2068,-867,2069]],"properties":{"id":"24662872","dp":2712,"de":0}},{"type":"Polygon","arcs":[[2070,2071,-2068,2072,2073]],"properties":{"id":"24662873","dp":8395,"de":0}},{"type":"Polygon","arcs":[[2074,2075,-2073,-2067,-2063,2076,2077,2078]],"properties":{"id":"24662874","dp":5198,"de":676}},{"type":"Polygon","arcs":[[-2076,2079,2080,-2074]],"properties":{"id":"24662875","dp":8431,"de":1984}},{"type":"Polygon","arcs":[[2081,2082,-2071,-2081]],"properties":{"id":"24662876","dp":8885,"de":0}},{"type":"Polygon","arcs":[[2083,2084,-2080,-2075,2085]],"properties":{"id":"24662877","dp":4231,"de":614}},{"type":"Polygon","arcs":[[2086,-2086,-2079,2087,2088]],"properties":{"id":"24662878","dp":5278,"de":946}},{"type":"Polygon","arcs":[[2089,-2089,2090,2091]],"properties":{"id":"24662879","dp":5059,"de":0}},{"type":"Polygon","arcs":[[2092,-2092,2093,2094]],"properties":{"id":"24662880","dp":6737,"de":652}},{"type":"Polygon","arcs":[[-2094,-2091,-2088,-2078,2095,2096,2097,2098]],"properties":{"id":"24662881","dp":2813,"de":530}},{"type":"Polygon","arcs":[[2099,2100,2101,-2097]],"properties":{"id":"24662882","dp":8525,"de":0}},{"type":"Polygon","arcs":[[-2077,-2062,-2100,-2096]],"properties":{"id":"24662883","dp":6157,"de":0}},{"type":"Polygon","arcs":[[2102,-1935,2103,2104,2105]],"properties":{"id":"24660813","dp":12857,"de":0}},{"type":"Polygon","arcs":[[2106,-2104,-1934,2107]],"properties":{"id":"24660814","dp":6033,"de":791}},{"type":"Polygon","arcs":[[2108,2109,-2105,-2107,2110]],"properties":{"id":"24660815","dp":9108,"de":713}},{"type":"Polygon","arcs":[[-2111,-2108,-1943,2111,2112]],"properties":{"id":"24660816","dp":7492,"de":1253}},{"type":"Polygon","arcs":[[2113,-2109,-2113,2114,2115,2116]],"properties":{"id":"24660818","dp":1261,"de":1526}},{"type":"Polygon","arcs":[[-1942,2117,2118,2119,-2112]],"properties":{"id":"24660820","dp":2735,"de":1490}},{"type":"Polygon","arcs":[[-2120,2120,2121,-2115]],"properties":{"id":"24660821","dp":2075,"de":785}},{"type":"Polygon","arcs":[[2122,2123,2124,-2121,2125,2126]],"properties":{"id":"24660822","dp":3376,"de":2525}},{"type":"Polygon","arcs":[[-2119,2127,2128,2129,-2126]],"properties":{"id":"24660823","dp":13409,"de":0}},{"type":"Polygon","arcs":[[-2129,2130,2131,2132,2133,-1913]],"properties":{"id":"24660824","dp":28392,"de":2572}},{"type":"Polygon","arcs":[[2134,2135,2136,-2133]],"properties":{"id":"24660825","dp":5644,"de":613}},{"type":"Polygon","arcs":[[2137,2138,-1914,-2134,-2137,2139]],"properties":{"id":"24660826","dp":2385,"de":6142}},{"type":"Polygon","arcs":[[2140,2141,2142,2143,2144,-2140,-2136]],"properties":{"id":"24660827","dp":4237,"de":437}},{"type":"Polygon","arcs":[[2145,2146,-2141,-2135,-2132]],"properties":{"id":"24660828","dp":4457,"de":344}},{"type":"Polygon","arcs":[[-2146,2147,2148,2149,2150,2151]],"properties":{"id":"24660829","dp":5890,"de":650}},{"type":"Polygon","arcs":[[2152,-2150,2153]],"properties":{"id":"24660830","dp":6060,"de":1155}},{"type":"Polygon","arcs":[[-2154,-2149,2154]],"properties":{"id":"24660832","dp":4675,"de":3640}},{"type":"Polygon","arcs":[[-2152,2155,2156,2157]],"properties":{"id":"24660833","dp":6296,"de":1171}},{"type":"Polygon","arcs":[[-2158,2158,2159,2160,-2142,-2147]],"properties":{"id":"24660834","dp":6118,"de":0}},{"type":"Polygon","arcs":[[2161,2162,2163,2164,-2159]],"properties":{"id":"24660835","dp":8983,"de":2354}},{"type":"Polygon","arcs":[[-2160,-2165,2165,2166,2167]],"properties":{"id":"24660836","dp":6957,"de":582}},{"type":"Polygon","arcs":[[-2161,-2168,2168,-2143]],"properties":{"id":"24660837","dp":6714,"de":513}},{"type":"Polygon","arcs":[[-2144,-2169,-2167,2169,-1709,2170]],"properties":{"id":"24660838","dp":5546,"de":0}},{"type":"Polygon","arcs":[[-2171,-1713,-1714,2171]],"properties":{"id":"24660839","dp":9049,"de":0}},{"type":"Polygon","arcs":[[-2004,-1718,-1710,-2170,-2166,2172,2173,2174,2175,2176,-2007]],"properties":{"id":"24660853","dp":2741,"de":2439}},{"type":"Polygon","arcs":[[-2175,2177,2178,2179,2180,2181,2182,-2176]],"properties":{"id":"24660854","dp":3216,"de":1037}},{"type":"Polygon","arcs":[[-2181,2183]],"properties":{"id":"24660855","dp":5005,"de":728}},{"type":"Polygon","arcs":[[-2174,2184,2185,2186,2187,2188,2189,2190,-2178,2174,-2175]],"properties":{"id":"24660856","dp":7421,"de":1732}},{"type":"Polygon","arcs":[[2191,2192,-2179,-2191]],"properties":{"id":"24660857","dp":4775,"de":374}},{"type":"Polygon","arcs":[[-2190,2193,2194,2195,-2192]],"properties":{"id":"24660858","dp":3480,"de":1312}},{"type":"Polygon","arcs":[[-2173,-2164,2196,2197,-2185]],"properties":{"id":"24660859","dp":11472,"de":0}},{"type":"Polygon","arcs":[[2198,2199,-2186,-2198]],"properties":{"id":"24660860","dp":40687,"de":3439}},{"type":"Polygon","arcs":[[-2187,-2200,2200,2201]],"properties":{"id":"24660861","dp":51902,"de":2989}},{"type":"Polygon","arcs":[[2202,-2188,-2202,2203,2204]],"properties":{"id":"24660862","dp":19757,"de":3238}},{"type":"Polygon","arcs":[[-2205,2205,2206,2207]],"properties":{"id":"24660863","dp":23466,"de":0}},{"type":"Polygon","arcs":[[-2206,-2204,-2201,-2199,-2197,-2163,2208]],"properties":{"id":"24660864","dp":16176,"de":3008}},{"type":"Polygon","arcs":[[2209,2210,2211,-1717,-1991,-856]],"properties":{"id":"24660865","dp":10490,"de":481}},{"type":"Polygon","arcs":[[-2145,-2172,-2212,2212]],"properties":{"id":"24660866","dp":12103,"de":887}},{"type":"Polygon","arcs":[[2213,-1915,-2139,2214,2215,-999]],"properties":{"id":"24660868","dp":7760,"de":836}},{"type":"Polygon","arcs":[[-1916,-2214,-998]],"properties":{"id":"24660869","dp":13318,"de":2586}},{"type":"Polygon","arcs":[[2216,2217,-2020,-2024]],"properties":{"id":"24660227","dp":10606,"de":1590}},{"type":"Polygon","arcs":[[2218,-2217,-2023,2219]],"properties":{"id":"24660228","dp":10064,"de":0}},{"type":"Polygon","arcs":[[2220,2221,2222,-2220,-2022]],"properties":{"id":"24660229","dp":9885,"de":821}},{"type":"Polygon","arcs":[[2223,2224,2225,-2222,2226]],"properties":{"id":"24660230","dp":9353,"de":0}},{"type":"Polygon","arcs":[[2227,2228,-2224,2229,2230]],"properties":{"id":"24660231","dp":13943,"de":1132}},{"type":"Polygon","arcs":[[2231,2232,2233,-2228,2234]],"properties":{"id":"24660232","dp":12870,"de":4582}},{"type":"Polygon","arcs":[[2235,2236,2237,2238,2239,-2233]],"properties":{"id":"24660233","dp":12546,"de":936}},{"type":"Polygon","arcs":[[2240,2241,-2236,-2232,2242,2243]],"properties":{"id":"24660234","dp":10162,"de":1711}},{"type":"Polygon","arcs":[[2244,2245,2246,2247,-2237,-2242,2248]],"properties":{"id":"24660235","dp":5817,"de":2967}},{"type":"Polygon","arcs":[[2249,2250,-2246,2251]],"properties":{"id":"24660236","dp":15345,"de":1257}},{"type":"Polygon","arcs":[[2252,2253,2254]],"properties":{"id":"24660238","dp":20508,"de":0}},{"type":"Polygon","arcs":[[2255,2256,2257,-2254,2258]],"properties":{"id":"24660239","dp":17380,"de":0}},{"type":"Polygon","arcs":[[2259,2260,2261,-2238,-2248,2262]],"properties":{"id":"24660241","dp":6161,"de":4545}},{"type":"Polygon","arcs":[[2263,2264,2265,2266,2267,2268,-2260,2269]],"properties":{"id":"24660242","dp":5450,"de":702}},{"type":"Polygon","arcs":[[2270,2271,2272,-2265,2273,2274]],"properties":{"id":"24660243","dp":8307,"de":2451}},{"type":"Polygon","arcs":[[2275,2276,-2273,2277]],"properties":{"id":"24660244","dp":14548,"de":1315}},{"type":"Polygon","arcs":[[2278,2279,-2278,-2272,2280]],"properties":{"id":"24660245","dp":17713,"de":0}},{"type":"Polygon","arcs":[[2281,2282,-2276,-2280,2283]],"properties":{"id":"24660246","dp":16062,"de":2106}},{"type":"Polygon","arcs":[[2284,2285,-2284,-2279,2286,2287]],"properties":{"id":"24660247","dp":21906,"de":0}},{"type":"Polygon","arcs":[[2288,2289,2290,-2282,-2286]],"properties":{"id":"24660248","dp":18379,"de":0}},{"type":"Polygon","arcs":[[2291,2292,2293,2294,-2289,-2285]],"properties":{"id":"24660249","dp":13646,"de":1918}},{"type":"Polygon","arcs":[[-1001,2295,2296,-1018,-1026,-992,-996]],"properties":{"id":"24660744","dp":16730,"de":1026}},{"type":"Polygon","arcs":[[-2216,2297,2298,-2296,-1000]],"properties":{"id":"24660745","dp":6708,"de":1012}},{"type":"Polygon","arcs":[[-2299,2299,2300,2301,-1019,-2297]],"properties":{"id":"24660746","dp":5153,"de":2351}},{"type":"Polygon","arcs":[[2302,-855,-863,-1016,-2302]],"properties":{"id":"24660748","dp":9417,"de":2579}},{"type":"Polygon","arcs":[[-2124,2303,-2127,-2130,-1912,-994,-988,2304,2305,2306,2307,2308,2309,2310]],"properties":{"id":"24660871","dp":622,"de":2045}},{"type":"Polygon","arcs":[[-2304,-2123]],"properties":{"id":"24660872","dp":23146,"de":0}},{"type":"Polygon","arcs":[[2311,2312,2313,2314,-777,-774,-773,-769,-761,2315,2316]],"properties":{"id":"24660874","dp":228,"de":2471}},{"type":"Polygon","arcs":[[2317,-779,-2315,2318,2319,-702]],"properties":{"id":"24660876","dp":3867,"de":2463}},{"type":"Polygon","arcs":[[2320,2321,2322,2323,2324,2325,2326]],"properties":{"id":"24662209","dp":5617,"de":1367}},{"type":"Polygon","arcs":[[2327,2328,2329,-2324]],"properties":{"id":"24662210","dp":9661,"de":0}},{"type":"Polygon","arcs":[[2330,2331,-2328,2332,2333]],"properties":{"id":"24662211","dp":5038,"de":0}},{"type":"Polygon","arcs":[[2334,-2333,-2323,2335,2336]],"properties":{"id":"24662212","dp":5151,"de":1397}},{"type":"Polygon","arcs":[[-2336,-2322,2337,2338,2339]],"properties":{"id":"24662213","dp":4664,"de":559}},{"type":"Polygon","arcs":[[-2321,2340,-2338]],"properties":{"id":"24662214","dp":25404,"de":0}},{"type":"Polygon","arcs":[[2341,-2339,-2341,-2327,2342]],"properties":{"id":"24662215","dp":26156,"de":0}},{"type":"Polygon","arcs":[[-1787,-1775,2343,-2337,-2340,-2342,2344]],"properties":{"id":"24662216","dp":8094,"de":2005}},{"type":"Polygon","arcs":[[-1799,-1793,-1788,-2345,-2343,-2326,-1815,-1818]],"properties":{"id":"24662217","dp":4662,"de":4977}},{"type":"Polygon","arcs":[[2345,2346,2347,2348,2349,2350,2351,2352]],"properties":{"id":"24662528","dp":6375,"de":1910}},{"type":"Polygon","arcs":[[2353,2354,-2353,2355,2356,-546,-550,-553]],"properties":{"id":"24662529","dp":3087,"de":738}},{"type":"Polygon","arcs":[[2357,2358,2359,-2355,2360]],"properties":{"id":"24662530","dp":5897,"de":4387}},{"type":"Polygon","arcs":[[2361,2362,-2361,-2354,-552,-555,-558]],"properties":{"id":"24662531","dp":5424,"de":2358}},{"type":"Polygon","arcs":[[2363,2364,2365,-2358,-2363]],"properties":{"id":"24662532","dp":8260,"de":1482}},{"type":"Polygon","arcs":[[-2365,2366,2367,2368]],"properties":{"id":"24662533","dp":19497,"de":2261}},{"type":"Polygon","arcs":[[2369,2370,-2367,-2364,-2362,-561]],"properties":{"id":"24662534","dp":9025,"de":2481}},{"type":"Polygon","arcs":[[2371,2372,2373,2374,-2368,-2371,2375]],"properties":{"id":"24662535","dp":5193,"de":1570}},{"type":"Polygon","arcs":[[2376,-2376,-2370,-560,-568]],"properties":{"id":"24662536","dp":6181,"de":2325}},{"type":"Polygon","arcs":[[-580,2377,2378,-2377,-567,-571]],"properties":{"id":"24662537","dp":8931,"de":0}},{"type":"Polygon","arcs":[[2379,2380,2381,-2378,-579]],"properties":{"id":"24662538","dp":7771,"de":0}},{"type":"Polygon","arcs":[[2382,-2380,-578]],"properties":{"id":"24662539","dp":9813,"de":0}},{"type":"Polygon","arcs":[[-2381,-2383,-582,2383,2384,2385,2386]],"properties":{"id":"24662540","dp":7382,"de":0}},{"type":"Polygon","arcs":[[-2387,2387,2388,-2372,-2379,-2382]],"properties":{"id":"24662541","dp":6209,"de":3255}},{"type":"Polygon","arcs":[[-592,-594,2389,2390,2391,-2384,-588,-590]],"properties":{"id":"24662542","dp":6060,"de":5127}},{"type":"Polygon","arcs":[[2392,2393,2394,2395,2396,-2385,-2392]],"properties":{"id":"24662543","dp":2786,"de":4994}},{"type":"Polygon","arcs":[[2397,2398,-2393]],"properties":{"id":"24662544","dp":12186,"de":3422}},{"type":"Polygon","arcs":[[-2399,2399,-1103,2400,2401,2402,-2394]],"properties":{"id":"24662545","dp":2981,"de":193}},{"type":"Polygon","arcs":[[2403,-1104,-2400,-2398,-2391,2404,-598]],"properties":{"id":"24662546","dp":6713,"de":2941}},{"type":"Polygon","arcs":[[-2405,-2390,-599]],"properties":{"id":"24662547","dp":30883,"de":0}},{"type":"Polygon","arcs":[[-1110,-1115,2405,-2401,-1102,-948]],"properties":{"id":"24662548","dp":3129,"de":1403}},{"type":"MultiPolygon","arcs":[[[2406]],[[2407,2408,2409,2410,2411,2412,2413,2414,2415,2416]],[[2417]]],"properties":{"id":"24660981","dp":1087,"de":199}},{"type":"Polygon","arcs":[[2418,2419,-2411,2420]],"properties":{"id":"24660982","dp":16381,"de":0}},{"type":"Polygon","arcs":[[2421,2422,-2419,2423]],"properties":{"id":"24660983","dp":12144,"de":0}},{"type":"MultiPolygon","arcs":[[[2424,2425,2426,2427,2428,-2424,-2421,-2410]],[[2429]],[[-2408,2430]]],"properties":{"id":"24660984","dp":1590,"de":0}},{"type":"Polygon","arcs":[[2431,2432,2433,-2427]],"properties":{"id":"24660985","dp":2890,"de":0}},{"type":"Polygon","arcs":[[2434,2435,2436,-2433]],"properties":{"id":"24660986","dp":10024,"de":0}},{"type":"Polygon","arcs":[[2437,2438,2439,2440,-2436]],"properties":{"id":"24660987","dp":8861,"de":0}},{"type":"Polygon","arcs":[[-2415,2441,2442,2443]],"properties":{"id":"24660988","dp":9694,"de":0}},{"type":"Polygon","arcs":[[-2414,2444,2445,-2442]],"properties":{"id":"24660989","dp":8756,"de":1813}},{"type":"Polygon","arcs":[[2446,2447,-2446,2448,2449,2450]],"properties":{"id":"24660990","dp":6031,"de":694}},{"type":"Polygon","arcs":[[2451,2452,2453,2454,-2450,2455]],"properties":{"id":"24660991","dp":7671,"de":0}},{"type":"Polygon","arcs":[[2456,-2456,-2449,-2445,2457]],"properties":{"id":"24660992","dp":9300,"de":686}},{"type":"Polygon","arcs":[[2458,2459,2460,2461]],"properties":{"id":"24660929","dp":5500,"de":1386}},{"type":"Polygon","arcs":[[2462,2463,2464,2465,-2459,2466,2467]],"properties":{"id":"24660930","dp":3388,"de":0}},{"type":"Polygon","arcs":[[2468,2469,2470,2471,2472,2473,2474]],"properties":{"id":"24660931","dp":2322,"de":601}},{"type":"Polygon","arcs":[[2475,2476,2477,-2463,-2472,2478]],"properties":{"id":"24660932","dp":3414,"de":1386}},{"type":"Polygon","arcs":[[2479,2480,-2479,-2471,2481]],"properties":{"id":"24660933","dp":2989,"de":0}},{"type":"Polygon","arcs":[[-2476,-2481,2482]],"properties":{"id":"24660934","dp":7191,"de":1136}},{"type":"Polygon","arcs":[[2483,2484,2485]],"properties":{"id":"24660953","dp":9161,"de":0}},{"type":"Polygon","arcs":[[2486,2487,2488,-2485,2489,2490,2491]],"properties":{"id":"24660954","dp":3154,"de":632}},{"type":"Polygon","arcs":[[2492,2493,2494,2495,2496,2497]],"properties":{"id":"24660955","dp":2302,"de":4021}},{"type":"Polygon","arcs":[[2498,-2495,2499]],"properties":{"id":"24660956","dp":9854,"de":0}},{"type":"Polygon","arcs":[[-2500,-2494,2500,2501]],"properties":{"id":"24660957","dp":7941,"de":0}},{"type":"Polygon","arcs":[[-2501,-2493,2502,2503,2504]],"properties":{"id":"24660958","dp":5311,"de":1425}},{"type":"Polygon","arcs":[[-2504,2505,2506]],"properties":{"id":"24660959","dp":9409,"de":3935}},{"type":"Polygon","arcs":[[2507,2508,2509,-2506,2510,2511]],"properties":{"id":"24660960","dp":7666,"de":0}},{"type":"Polygon","arcs":[[-2508,2512,2513,2514]],"properties":{"id":"24660961","dp":7663,"de":0}},{"type":"Polygon","arcs":[[-2515,2515,2516,-2509]],"properties":{"id":"24660962","dp":10592,"de":0}},{"type":"Polygon","arcs":[[-2514,2517,2518,-2516]],"properties":{"id":"24660963","dp":17674,"de":0}},{"type":"Polygon","arcs":[[2519,-2510,-2517,-2519,2520,-2432,-2426,2521]],"properties":{"id":"24660964","dp":4929,"de":486}},{"type":"MultiPolygon","arcs":[[[-2502,-2505,-2507,-2520,2522,-2496,-2499]],[[2523,2524,2525]]],"properties":{"id":"24660965","dp":2729,"de":1049}},{"type":"Polygon","arcs":[[2526,2527,2528,2529,2530,2531,2532,2533,2534]],"properties":{"id":"24660993","dp":2196,"de":3472}},{"type":"Polygon","arcs":[[2535,2536,-2532]],"properties":{"id":"24660994","dp":13724,"de":0}},{"type":"Polygon","arcs":[[2537,2538,-2536,-2531]],"properties":{"id":"24660995","dp":10984,"de":0}},{"type":"Polygon","arcs":[[2539,-19,-18,2540,2541]],"properties":{"id":"24660997","dp":12708,"de":0}},{"type":"Polygon","arcs":[[-2541,-17,-11,2542,2543,2544]],"properties":{"id":"24660998","dp":11929,"de":0}},{"type":"Polygon","arcs":[[-2543,-15,-9,2545,2546]],"properties":{"id":"24660999","dp":11446,"de":0}},{"type":"Polygon","arcs":[[-2546,-7,-2,-600,2547,2548]],"properties":{"id":"24661000","dp":5922,"de":1085}},{"type":"Polygon","arcs":[[-2544,-2547,-2549,2549,2550]],"properties":{"id":"24661001","dp":13156,"de":0}},{"type":"Polygon","arcs":[[-2550,-2548,-603,2551,2552,2553,2554]],"properties":{"id":"24661002","dp":10699,"de":0}},{"type":"Polygon","arcs":[[2555,-2552,-602,-41,2556]],"properties":{"id":"24661003","dp":10741,"de":1235}},{"type":"Polygon","arcs":[[2557,2558,2559,2560]],"properties":{"id":"24661114","dp":11867,"de":1264}},{"type":"Polygon","arcs":[[2561,2562,-2558,2563]],"properties":{"id":"24661116","dp":17239,"de":0}},{"type":"Polygon","arcs":[[2564,-2564,2565,2566]],"properties":{"id":"24661117","dp":12894,"de":3728}},{"type":"Polygon","arcs":[[2567,2568,2569,2570,-2567,2571]],"properties":{"id":"24661118","dp":9790,"de":7714}},{"type":"Polygon","arcs":[[2572,2573,-2569,2574,2575]],"properties":{"id":"24661119","dp":9914,"de":5109}},{"type":"Polygon","arcs":[[-2575,-2568,2576,2577,2578]],"properties":{"id":"24661120","dp":9918,"de":1103}},{"type":"Polygon","arcs":[[-2572,2579,2580,2581,-2577]],"properties":{"id":"24661121","dp":8755,"de":5661}},{"type":"Polygon","arcs":[[-2566,-2561,2582,2583,-2580]],"properties":{"id":"24661122","dp":15967,"de":2188}},{"type":"Polygon","arcs":[[-2581,-2584,2584,2585]],"properties":{"id":"24661123","dp":17083,"de":0}},{"type":"Polygon","arcs":[[2586,-2578,-2582,-2586,2587,2588,2589]],"properties":{"id":"24661124","dp":4092,"de":4851}},{"type":"Polygon","arcs":[[2590,2591,2592,-1242,2593,2594]],"properties":{"id":"24661125","dp":5881,"de":3774}},{"type":"Polygon","arcs":[[-2594,-1241,2595]],"properties":{"id":"24661126","dp":9908,"de":1987}},{"type":"Polygon","arcs":[[2596,2597,-2596,-1240,-1238,-1236]],"properties":{"id":"24661127","dp":8756,"de":4166}},{"type":"Polygon","arcs":[[-2595,-2598,2598]],"properties":{"id":"24661128","dp":12551,"de":3497}},{"type":"Polygon","arcs":[[2599,2600,2601,-2599,-2597]],"properties":{"id":"24661129","dp":8860,"de":980}},{"type":"Polygon","arcs":[[2602,2603,-2600,-1235]],"properties":{"id":"24661130","dp":13182,"de":1629}},{"type":"Polygon","arcs":[[2604,2605,2606,-2603,-1234,-1232]],"properties":{"id":"24661131","dp":14178,"de":0}},{"type":"Polygon","arcs":[[2607,-2605,-1231,-1190]],"properties":{"id":"24661132","dp":11372,"de":1395}},{"type":"Polygon","arcs":[[-1189,2608,-2606,-2608]],"properties":{"id":"24661133","dp":10964,"de":1169}},{"type":"Polygon","arcs":[[-1188,2609,2610,2611,2612,-2604,-2607,-2609]],"properties":{"id":"24661134","dp":3930,"de":1008}},{"type":"Polygon","arcs":[[2613,2614,-2477,-2483,2615]],"properties":{"id":"24660935","dp":11908,"de":0}},{"type":"Polygon","arcs":[[-2616,2616,2617,2618,2619]],"properties":{"id":"24660936","dp":10886,"de":0}},{"type":"Polygon","arcs":[[-2618,2620,2621,2622,2623]],"properties":{"id":"24660937","dp":10815,"de":0}},{"type":"Polygon","arcs":[[-2622,2624,2625]],"properties":{"id":"24660938","dp":10205,"de":0}},{"type":"Polygon","arcs":[[-2621,-2617,-2480,2626,-2625]],"properties":{"id":"24660939","dp":7011,"de":1597}},{"type":"Polygon","arcs":[[2627,2628,-2623,-2626,-2627,-2482,-2470,2629,2630,2631]],"properties":{"id":"24660940","dp":1940,"de":3894}},{"type":"Polygon","arcs":[[-2629,2632,2633]],"properties":{"id":"24660941","dp":12602,"de":0}},{"type":"Polygon","arcs":[[2634,2635,2636,2637,-2633,-2628,2638]],"properties":{"id":"24660942","dp":11469,"de":0}},{"type":"Polygon","arcs":[[-2637,2639]],"properties":{"id":"24660943","dp":12692,"de":0}},{"type":"Polygon","arcs":[[-2636,2640,2641,2642,-2619,-2624,-2634,-2638,-2640]],"properties":{"id":"24660944","dp":2821,"de":1634}},{"type":"Polygon","arcs":[[2643,2644,-2642,2645]],"properties":{"id":"24660945","dp":6650,"de":0}},{"type":"Polygon","arcs":[[2646,-2614,-2620,-2643,-2645,2647,-2525]],"properties":{"id":"24660946","dp":5511,"de":0}},{"type":"Polygon","arcs":[[-2648,-2644,2648,2649]],"properties":{"id":"24660947","dp":9716,"de":0}},{"type":"Polygon","arcs":[[-2649,-2646,-2641,-2635,2650,2651]],"properties":{"id":"24660948","dp":9356,"de":737}},{"type":"Polygon","arcs":[[-2526,-2650,-2652,2652,-2487,2653]],"properties":{"id":"24660949","dp":10876,"de":493}},{"type":"Polygon","arcs":[[-2488,-2653,-2651,2654,2655]],"properties":{"id":"24660950","dp":9711,"de":679}},{"type":"Polygon","arcs":[[-2489,-2656,2656,-2486]],"properties":{"id":"24660951","dp":14016,"de":0}},{"type":"Polygon","arcs":[[2657,-103,2658,2659,-34]],"properties":{"id":"24661036","dp":9081,"de":3603}},{"type":"Polygon","arcs":[[2660,2661,2662,-2659,-101]],"properties":{"id":"24661037","dp":12683,"de":0}},{"type":"Polygon","arcs":[[2663,2664,-2660,-2663]],"properties":{"id":"24661038","dp":11284,"de":3142}},{"type":"Polygon","arcs":[[-54,-48,-43,-35,-2665,2665]],"properties":{"id":"24661039","dp":6049,"de":2821}},{"type":"Polygon","arcs":[[2666,-58,-55,-2666,-2664,-2662,2667]],"properties":{"id":"24661040","dp":7503,"de":2654}},{"type":"Polygon","arcs":[[2668,-82,-73,-59,-2667]],"properties":{"id":"24661041","dp":12472,"de":976}},{"type":"Polygon","arcs":[[-2661,-100,-89,-2669,-2668]],"properties":{"id":"24661042","dp":14666,"de":1466}},{"type":"Polygon","arcs":[[-30,2669,2670,-2658,-32]],"properties":{"id":"24661043","dp":13705,"de":797}},{"type":"Polygon","arcs":[[-27,2671,2672,-2670,-29]],"properties":{"id":"24661044","dp":13519,"de":0}},{"type":"Polygon","arcs":[[2673,-2672,-26,-24]],"properties":{"id":"24661045","dp":11781,"de":1224}},{"type":"Polygon","arcs":[[-23,-21,-2317,2674,-94,-102,-2671,-2673,-2674]],"properties":{"id":"24661046","dp":766,"de":510}},{"type":"Polygon","arcs":[[-2521,-2518,-2513,-2512,2675,2676,-2438,-2435]],"properties":{"id":"24660966","dp":2365,"de":909}},{"type":"MultiPolygon","arcs":[[[-2503,-2498,2677,2678,-2676,-2511]],[[2679,2680]]],"properties":{"id":"24660967","dp":3800,"de":740}},{"type":"Polygon","arcs":[[-2677,-2679,2681,2682,2683,-2439]],"properties":{"id":"24660968","dp":8178,"de":3130}},{"type":"Polygon","arcs":[[-2684,2684,2685,-2440]],"properties":{"id":"24660969","dp":14061,"de":2207}},{"type":"Polygon","arcs":[[2686,2687,-2685,2688,2689]],"properties":{"id":"24660970","dp":12500,"de":1190}},{"type":"Polygon","arcs":[[-2437,-2441,-2686,-2688,2690,-2434]],"properties":{"id":"24660971","dp":8921,"de":0}},{"type":"Polygon","arcs":[[-2691,-2687,2691,2692,-2428]],"properties":{"id":"24660972","dp":11556,"de":0}},{"type":"Polygon","arcs":[[-2692,-2690,2693,2694]],"properties":{"id":"24660973","dp":12628,"de":0}},{"type":"Polygon","arcs":[[-2695,2695,2696]],"properties":{"id":"24660974","dp":9657,"de":0}},{"type":"Polygon","arcs":[[-2693,-2697,2697,2698,-2422,-2429]],"properties":{"id":"24660975","dp":12725,"de":0}},{"type":"Polygon","arcs":[[-2699,2699,2700,2701,-2420,-2423]],"properties":{"id":"24660976","dp":5042,"de":2127}},{"type":"Polygon","arcs":[[-2701,2702,2703,2704]],"properties":{"id":"24660977","dp":9210,"de":771}},{"type":"Polygon","arcs":[[2705,-2703,2706,2707,-2452,-2457]],"properties":{"id":"24660978","dp":6021,"de":712}},{"type":"Polygon","arcs":[[2708,2709,2710,2711,2712]],"properties":{"id":"24661071","dp":6304,"de":980}},{"type":"Polygon","arcs":[[2713,-2712,2714,-1982,-1979,2715,2716]],"properties":{"id":"24661072","dp":3038,"de":1041}},{"type":"Polygon","arcs":[[2717,-2713,-2714,2718]],"properties":{"id":"24661073","dp":9224,"de":7613}},{"type":"Polygon","arcs":[[2719,2720,2721,2722]],"properties":{"id":"24661080","dp":106320,"de":7200}},{"type":"Polygon","arcs":[[2723,-2723,2724,2725]],"properties":{"id":"24661081","dp":36742,"de":6285}},{"type":"Polygon","arcs":[[2726,-2726,2727,2728]],"properties":{"id":"24661082","dp":65076,"de":19230}},{"type":"Polygon","arcs":[[2729,-2729,2730,2731,2732]],"properties":{"id":"24661083","dp":10943,"de":4716}},{"type":"Polygon","arcs":[[-2732,2733,2734]],"properties":{"id":"24661084","dp":34946,"de":8776}},{"type":"Polygon","arcs":[[2735,-2734,-2731,-2728,2736,2737]],"properties":{"id":"24661086","dp":1993,"de":14953}},{"type":"Polygon","arcs":[[-2725,2738,-228,2739,-2737]],"properties":{"id":"24661087","dp":14900,"de":24502}},{"type":"Polygon","arcs":[[2740,2741,-229,2742,-2721]],"properties":{"id":"24661093","dp":17007,"de":28346}},{"type":"Polygon","arcs":[[-2722,-2743,-225,-2739]],"properties":{"id":"24661094","dp":71875,"de":25390}},{"type":"Polygon","arcs":[[2743,2744,2745]],"properties":{"id":"24661099","dp":13087,"de":2631}},{"type":"Polygon","arcs":[[-2746,2746,2747,2748,2749,2750,2751,2752]],"properties":{"id":"24661100","dp":6033,"de":9406}},{"type":"Polygon","arcs":[[2753,2754,-2753,2755,2756]],"properties":{"id":"24661102","dp":12857,"de":5869}},{"type":"Polygon","arcs":[[2757,2758,-2754,2759]],"properties":{"id":"24661103","dp":19795,"de":6326}},{"type":"Polygon","arcs":[[2760,2761,2762,-2611]],"properties":{"id":"24661135","dp":9961,"de":701}},{"type":"Polygon","arcs":[[2763,2764,2765,-2762]],"properties":{"id":"24661136","dp":10724,"de":0}},{"type":"Polygon","arcs":[[2766,2767,-2764,-2761,-2610,-1187,-820]],"properties":{"id":"24661137","dp":15317,"de":941}},{"type":"Polygon","arcs":[[2768,-2765,-2768,2769]],"properties":{"id":"24661138","dp":14517,"de":0}},{"type":"Polygon","arcs":[[-215,2770,2771,-2770,-2767,-819,2772,-221,-218]],"properties":{"id":"24661139","dp":11507,"de":4767}},{"type":"Polygon","arcs":[[-2772,2773,2774,-2766,-2769]],"properties":{"id":"24661140","dp":12708,"de":925}},{"type":"Polygon","arcs":[[2775,2776,-2774,2777]],"properties":{"id":"24661141","dp":17060,"de":2027}},{"type":"Polygon","arcs":[[-2777,2778,-2763,-2775]],"properties":{"id":"24661142","dp":6130,"de":0}},{"type":"Polygon","arcs":[[2779,2780,-2778,-2771,-214]],"properties":{"id":"24661143","dp":17058,"de":0}},{"type":"Polygon","arcs":[[2781,2782,2783]],"properties":{"id":"24661318","dp":14343,"de":8838}},{"type":"Polygon","arcs":[[2784,-2783,2785,2786]],"properties":{"id":"24661319","dp":21226,"de":1915}},{"type":"Polygon","arcs":[[2787,2788,2789,-2785,2790,2791,2792]],"properties":{"id":"24661320","dp":6695,"de":9399}},{"type":"Polygon","arcs":[[2793,2794,-2789]],"properties":{"id":"24661321","dp":26318,"de":7692}},{"type":"Polygon","arcs":[[-1356,2795,2796,2797]],"properties":{"id":"24661322","dp":15896,"de":0}},{"type":"Polygon","arcs":[[2798,2799,2800,2801,-2796]],"properties":{"id":"24661323","dp":20628,"de":0}},{"type":"Polygon","arcs":[[2802,-2800,2803,2804]],"properties":{"id":"24661324","dp":10893,"de":0}},{"type":"Polygon","arcs":[[-2801,-2803,2805,2806,2807]],"properties":{"id":"24661325","dp":22913,"de":0}},{"type":"Polygon","arcs":[[2808,-2807,2809]],"properties":{"id":"24661326","dp":22238,"de":0}},{"type":"Polygon","arcs":[[-2810,2810,2811]],"properties":{"id":"24661327","dp":28231,"de":0}},{"type":"Polygon","arcs":[[2812,2813,2814,2815,-2812,2816]],"properties":{"id":"24661328","dp":28682,"de":5574}},{"type":"Polygon","arcs":[[-2816,2817,2818,2819,-2808,-2809]],"properties":{"id":"24661329","dp":20798,"de":6230}},{"type":"Polygon","arcs":[[2820,2821,-2802,-2820]],"properties":{"id":"24661330","dp":19015,"de":4166}},{"type":"Polygon","arcs":[[2822,-2797,-2822,2823,2824]],"properties":{"id":"24661331","dp":15550,"de":0}},{"type":"Polygon","arcs":[[2825,2826,2827,2828,-2824,-2821]],"properties":{"id":"24661332","dp":10467,"de":5632}},{"type":"Polygon","arcs":[[2829,-2826,-2819,2830]],"properties":{"id":"24661333","dp":19484,"de":5357}},{"type":"Polygon","arcs":[[2831,2832,2833,-2831,-2818,-2815]],"properties":{"id":"24661334","dp":1442,"de":44407}},{"type":"Polygon","arcs":[[-2817,-2811,-2806,-2805,2834,2835,2836]],"properties":{"id":"24661335","dp":5345,"de":44384}},{"type":"Polygon","arcs":[[2837,2838,-2837,2839,-1334]],"properties":{"id":"24661336","dp":4168,"de":10743}},{"type":"Polygon","arcs":[[2840,2841,2842,-1324]],"properties":{"id":"24661337","dp":6426,"de":2200}},{"type":"Polygon","arcs":[[-2840,-2836,2843,-1341,-1335]],"properties":{"id":"24661338","dp":11828,"de":0}},{"type":"Polygon","arcs":[[-2799,-1355,-1344,-2844,-2835,-2804]],"properties":{"id":"24661339","dp":14736,"de":827}},{"type":"Polygon","arcs":[[2844,2845,2846,2847]],"properties":{"id":"24661340","dp":10679,"de":2341}},{"type":"Polygon","arcs":[[-2845,2848,2849]],"properties":{"id":"24661341","dp":18819,"de":0}},{"type":"Polygon","arcs":[[-2850,2850,2851]],"properties":{"id":"24661342","dp":25999,"de":0}},{"type":"Polygon","arcs":[[-1360,-2851,2852,2853]],"properties":{"id":"24661343","dp":28256,"de":1153}},{"type":"Polygon","arcs":[[2854,2855,2856,-235,-2853]],"properties":{"id":"24661344","dp":11419,"de":0}},{"type":"Polygon","arcs":[[2857,-2855,-2849]],"properties":{"id":"24661345","dp":10982,"de":0}},{"type":"Polygon","arcs":[[2858,-2856,-2858,-2848,2859,2860,2861]],"properties":{"id":"24661346","dp":10621,"de":2118}},{"type":"Polygon","arcs":[[2862,-236,-2857,-2859,2863]],"properties":{"id":"24661347","dp":12509,"de":1636}},{"type":"Polygon","arcs":[[-2612,-2779,-2776,-2781,2864,2865,2866,2867,2868,-78,-84,-96,2869,2870,2871]],"properties":{"id":"24661047","dp":662,"de":1474}},{"type":"Polygon","arcs":[[2872,2873,2874,2875,2876,2877,2878]],"properties":{"id":"24661048","dp":10641,"de":1368}},{"type":"Polygon","arcs":[[2879,-2877,2880,2881]],"properties":{"id":"24661049","dp":15948,"de":0}},{"type":"Polygon","arcs":[[-2876,2882,2883,2884,-2881]],"properties":{"id":"24661050","dp":7888,"de":4583}},{"type":"Polygon","arcs":[[2885,2886,-2884,2887,2888,2889,2890,2891]],"properties":{"id":"24661051","dp":7705,"de":4329}},{"type":"Polygon","arcs":[[-2882,-2885,-2887,2892,2893]],"properties":{"id":"24661052","dp":10079,"de":1888}},{"type":"Polygon","arcs":[[-2893,-2886,2894,2895]],"properties":{"id":"24661053","dp":15918,"de":4373}},{"type":"Polygon","arcs":[[-2878,-2880,-2894,-2896,2896,2897]],"properties":{"id":"24661054","dp":4683,"de":3448}},{"type":"Polygon","arcs":[[-2897,2898,2899,2900,2901,2902,2903,-2573,2904]],"properties":{"id":"24661055","dp":5696,"de":7172}},{"type":"Polygon","arcs":[[2905,2906,2907,2908,2909,-2900,2910]],"properties":{"id":"24661058","dp":8016,"de":4474}},{"type":"Polygon","arcs":[[2911,-2908]],"properties":{"id":"24661059","dp":21576,"de":2717}},{"type":"Polygon","arcs":[[-2909,-2912,-2907,2912,2913,2914]],"properties":{"id":"24661060","dp":8331,"de":9517}},{"type":"Polygon","arcs":[[2915,2916,2917,2918]],"properties":{"id":"24660668","dp":18577,"de":0}},{"type":"Polygon","arcs":[[-2918,2919,2920,2921,2922]],"properties":{"id":"24660669","dp":10729,"de":5208}},{"type":"Polygon","arcs":[[2923,2924,-2921,2925]],"properties":{"id":"24660670","dp":32008,"de":0}},{"type":"Polygon","arcs":[[2926,2927,-2924,2928]],"properties":{"id":"24660671","dp":33656,"de":0}},{"type":"Polygon","arcs":[[2929,2930,-2927,2931]],"properties":{"id":"24660672","dp":20829,"de":2183}},{"type":"Polygon","arcs":[[2932,2933,-2930,2934]],"properties":{"id":"24660673","dp":19867,"de":0}},{"type":"Polygon","arcs":[[-2793,2935,2936,2937,2938,-929,-923,-919,2939,2940]],"properties":{"id":"24660676","dp":2074,"de":4783}},{"type":"Polygon","arcs":[[2941,-2934,2942,-2936,-2792]],"properties":{"id":"24660677","dp":7771,"de":3762}},{"type":"Polygon","arcs":[[-2942,-2791,2943,-2931]],"properties":{"id":"24660678","dp":41397,"de":0}},{"type":"Polygon","arcs":[[-2944,-2787,2944,-2928]],"properties":{"id":"24660679","dp":25133,"de":0}},{"type":"Polygon","arcs":[[-2925,-2945,2945]],"properties":{"id":"24660680","dp":17854,"de":0}},{"type":"Polygon","arcs":[[2946,-2922,-2946,-2786,2947,-2825,-2829]],"properties":{"id":"24660681","dp":12996,"de":1167}},{"type":"Polygon","arcs":[[-2923,-2947,-2828,2948]],"properties":{"id":"24660682","dp":8995,"de":0}},{"type":"Polygon","arcs":[[2949,-2919,-2949,-2827]],"properties":{"id":"24660683","dp":17903,"de":0}},{"type":"Polygon","arcs":[[2950,-2950,-2830,2951]],"properties":{"id":"24660684","dp":25898,"de":0}},{"type":"Polygon","arcs":[[2952,2953,-2952,-2834]],"properties":{"id":"24660685","dp":26000,"de":0}},{"type":"Polygon","arcs":[[2954,-231,-2760,-2757,2955,2956,2957,-1310,2958]],"properties":{"id":"24661104","dp":6626,"de":56553}},{"type":"Polygon","arcs":[[2959,-2740,-227,-2955]],"properties":{"id":"24661105","dp":14474,"de":80365}},{"type":"Polygon","arcs":[[2960,2961,-2738,-2960,-2959,-1309,2962,2963]],"properties":{"id":"24661106","dp":3120,"de":61103}},{"type":"Polygon","arcs":[[2964,2965,2966,2967]],"properties":{"id":"24661108","dp":11387,"de":1438}},{"type":"Polygon","arcs":[[-2589,2968,2969,-2965]],"properties":{"id":"24661109","dp":19050,"de":0}},{"type":"Polygon","arcs":[[-2583,2970,2971,-2969,-2588,-2585]],"properties":{"id":"24661110","dp":11532,"de":4125}},{"type":"Polygon","arcs":[[-2972,2972,2973]],"properties":{"id":"24661111","dp":18640,"de":3236}},{"type":"Polygon","arcs":[[2974,-242,2975,-175]],"properties":{"id":"24663212","dp":18537,"de":1679}},{"type":"Polygon","arcs":[[-178,-2976,2976,-202,-232]],"properties":{"id":"24663213","dp":8255,"de":0}},{"type":"Polygon","arcs":[[-241,2977,2978,-203,-2977]],"properties":{"id":"24663214","dp":12494,"de":4880}},{"type":"MultiPolygon","arcs":[[[2979,2980,2981,2982]],[[2983]],[[2984,2985,2986,2987,2988]]],"properties":{"id":"24663067","dp":259,"de":112}},{"type":"Polygon","arcs":[[-2953,-2833,2989,2990]],"properties":{"id":"24660686","dp":8668,"de":1815}},{"type":"Polygon","arcs":[[2991,2992,-2991,2993]],"properties":{"id":"24660687","dp":22923,"de":10073}},{"type":"Polygon","arcs":[[2994,2995,2996,-2990]],"properties":{"id":"24660688","dp":20687,"de":0}},{"type":"Polygon","arcs":[[2997,-2996,2998,2999]],"properties":{"id":"24660689","dp":29575,"de":0}},{"type":"Polygon","arcs":[[3000,-3000,3001,3002]],"properties":{"id":"24660690","dp":12919,"de":0}},{"type":"Polygon","arcs":[[-3003,3003,3004,3005,3006]],"properties":{"id":"24660691","dp":5439,"de":20443}},{"type":"Polygon","arcs":[[-3004,-3002,-2999,3007,3008]],"properties":{"id":"24660692","dp":11088,"de":3901}},{"type":"Polygon","arcs":[[-3008,-2995,-2832,3009]],"properties":{"id":"24660693","dp":22857,"de":14285}},{"type":"Polygon","arcs":[[3010,-3009,-3010,-2814,3011]],"properties":{"id":"24660694","dp":22350,"de":14035}},{"type":"Polygon","arcs":[[3012,-3012,-2813,-2839]],"properties":{"id":"24660695","dp":20388,"de":1124}},{"type":"Polygon","arcs":[[3013,-3005,-3011,-3013,3014,3015]],"properties":{"id":"24660696","dp":24400,"de":5555}},{"type":"Polygon","arcs":[[-3015,-2838,-1325,-2843]],"properties":{"id":"24660697","dp":15011,"de":4231}},{"type":"Polygon","arcs":[[3016,-3016,-2842]],"properties":{"id":"24660698","dp":21565,"de":10869}},{"type":"Polygon","arcs":[[3017,-3006,-3014,-3017,-2841,-1323,3018]],"properties":{"id":"24660699","dp":6191,"de":8508}},{"type":"Polygon","arcs":[[3019,-3019,-1322,3020,3021,3022]],"properties":{"id":"24660700","dp":15954,"de":22330}},{"type":"Polygon","arcs":[[-3022,3023,3024]],"properties":{"id":"24660701","dp":33450,"de":0}},{"type":"MultiPolygon","arcs":[[[3025,3026,3027,3028,3029,3030,-2866]],[[3031,-2868,3032]]],"properties":{"id":"24661184","dp":4169,"de":2953}},{"type":"Polygon","arcs":[[-3029,3033,3034]],"properties":{"id":"24661185","dp":12280,"de":1253}},{"type":"Polygon","arcs":[[-79,-2869,3035,-67,-72]],"properties":{"id":"24661187","dp":9794,"de":940}},{"type":"MultiPolygon","arcs":[[[3036,3037,3038,3039,3040,3041,3042]],[[3043,-69,3044,3045]]],"properties":{"id":"24661189","dp":6727,"de":727}},{"type":"MultiPolygon","arcs":[[[3046,3047,3048,3049,3050,-3037]],[[3051,-63,-3044,3052]]],"properties":{"id":"24661190","dp":8156,"de":1633}},{"type":"Polygon","arcs":[[3053,3054,3055,3056,3057]],"properties":{"id":"24663180","dp":2415,"de":686}},{"type":"Polygon","arcs":[[-3056,3058,3059,3060,3061,3062]],"properties":{"id":"24663181","dp":3183,"de":1018}},{"type":"Polygon","arcs":[[3063,3064,-1509,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074]],"properties":{"id":"24663182","dp":1077,"de":1517}},{"type":"Polygon","arcs":[[3075,-3075]],"properties":{"id":"24663183","dp":5428,"de":877}},{"type":"Polygon","arcs":[[3076,3077,3078,3079,3080,3081,3082]],"properties":{"id":"24663057","dp":593,"de":78}},{"type":"Polygon","arcs":[[3083,3084,3085,-3078]],"properties":{"id":"24663058","dp":2857,"de":312}},{"type":"Polygon","arcs":[[3086,3087,3088,3089,-3080,3090]],"properties":{"id":"24663059","dp":2379,"de":437}},{"type":"Polygon","arcs":[[3091,3092,-3088,3093]],"properties":{"id":"24663060","dp":2919,"de":0}},{"type":"Polygon","arcs":[[3094,-3089,-3093,3095]],"properties":{"id":"24663061","dp":3187,"de":250}},{"type":"Polygon","arcs":[[3096,3097,3098,-3090,-3095]],"properties":{"id":"24663062","dp":2804,"de":0}},{"type":"Polygon","arcs":[[3099,3100,-2986,3101,-2983,3102,3103]],"properties":{"id":"24663068","dp":126,"de":44}},{"type":"Polygon","arcs":[[-2538,-2530,3104,-703,-2320,3105,3106,-2312,-20,-2540,3107]],"properties":{"id":"24663306","dp":8248,"de":513}},{"type":"Polygon","arcs":[[3108,-1073,3109,3110,3111,3112,3113,-2053,3114,3115,3116,3117,3118,-930,-2939]],"properties":{"id":"24663311","dp":1255,"de":2169}},{"type":"Polygon","arcs":[[3119,-346,-344,-359,-245,-625,3120]],"properties":{"id":"24663314","dp":3789,"de":3877}},{"type":"Polygon","arcs":[[3121,3122,3123,3124,3125,3126,3127,3128]],"properties":{"id":"24663263","dp":4368,"de":4448}},{"type":"Polygon","arcs":[[3129,3130,3131,3132,3133]],"properties":{"id":"24663264","dp":14594,"de":900}},{"type":"Polygon","arcs":[[3134,3135,3136,3137]],"properties":{"id":"24663266","dp":11922,"de":0}},{"type":"Polygon","arcs":[[3138,3139,3140,3141,3142,-3098]],"properties":{"id":"24663063","dp":2789,"de":699}},{"type":"Polygon","arcs":[[3143,3144,-2987,-3101,3145,3146,-3141]],"properties":{"id":"24663064","dp":2965,"de":860}},{"type":"Polygon","arcs":[[-3144,-3140,3147]],"properties":{"id":"24663065","dp":5767,"de":0}},{"type":"Polygon","arcs":[[-2988,-3145,-3148,-3139,3148,3149]],"properties":{"id":"24663066","dp":1821,"de":738}},{"type":"Polygon","arcs":[[3150,-2980,-3102,-2985]],"properties":{"id":"24663069","dp":492,"de":40}},{"type":"Polygon","arcs":[[-3146,-3100,3151,3152,3153]],"properties":{"id":"24663070","dp":2795,"de":0}},{"type":"Polygon","arcs":[[-3154,3154,3155,-3142,-3147]],"properties":{"id":"24663071","dp":2994,"de":0}},{"type":"Polygon","arcs":[[-3153,3156,3157,-3155]],"properties":{"id":"24663072","dp":3381,"de":344}},{"type":"Polygon","arcs":[[-3143,-3156,-3158,3158,-3081,-3099]],"properties":{"id":"24663073","dp":2370,"de":1312}},{"type":"Polygon","arcs":[[-3082,-3159,-3157,-3152,-3104,3159,3160,3161]],"properties":{"id":"24663074","dp":338,"de":51}},{"type":"Polygon","arcs":[[3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,3177]],"properties":{"id":"24663334","dp":0,"de":983}},{"type":"Polygon","arcs":[[3178,3179,3180,3181]],"properties":{"id":"24660010","dp":3254,"de":395}},{"type":"Polygon","arcs":[[-2290,-2295,3182,3183,3184]],"properties":{"id":"24660250","dp":15885,"de":0}},{"type":"Polygon","arcs":[[-3185,3185,3186,-2291]],"properties":{"id":"24660251","dp":18471,"de":2159}},{"type":"Polygon","arcs":[[-3187,3187,3188,-2283]],"properties":{"id":"24660252","dp":12673,"de":1157}},{"type":"Polygon","arcs":[[-3188,-3186,-3184,3189,-1906,-1909,-1911,3190,3191]],"properties":{"id":"24660253","dp":4949,"de":2626}},{"type":"Polygon","arcs":[[-3192,3192,3193,3194]],"properties":{"id":"24660254","dp":12413,"de":2337}},{"type":"Polygon","arcs":[[-3189,-3195,-2266,-2277]],"properties":{"id":"24660255","dp":13650,"de":0}},{"type":"Polygon","arcs":[[3195,3196,-222,-2773,-818]],"properties":{"id":"24661147","dp":16692,"de":3359}},{"type":"Polygon","arcs":[[-813,3197,-3196,-817]],"properties":{"id":"24661148","dp":7286,"de":28963}},{"type":"Polygon","arcs":[[-223,-3197,-3198,3198]],"properties":{"id":"24661149","dp":12032,"de":5954}},{"type":"Polygon","arcs":[[3199,3200,3201,-224,-3199,-812]],"properties":{"id":"24661150","dp":8940,"de":10433}},{"type":"Polygon","arcs":[[3202,3203,-3200,-811]],"properties":{"id":"24661151","dp":10386,"de":2976}},{"type":"Polygon","arcs":[[3204,3205,-3203,-809]],"properties":{"id":"24661152","dp":16071,"de":1488}},{"type":"Polygon","arcs":[[3206,3207,-3205,-806]],"properties":{"id":"24661153","dp":15435,"de":4054}},{"type":"Polygon","arcs":[[3208,3209,3210,3211,-306,-295,-291,3212]],"properties":{"id":"24660082","dp":7922,"de":1243}},{"type":"Polygon","arcs":[[3213,-3213,-290,-288,-283]],"properties":{"id":"24660083","dp":7790,"de":843}},{"type":"Polygon","arcs":[[3214,3215,-3209,-3214,-282,3216]],"properties":{"id":"24660084","dp":8822,"de":0}},{"type":"Polygon","arcs":[[3217,3218,3219,3220,-3217,-281,3221]],"properties":{"id":"24660085","dp":9453,"de":1045}},{"type":"Polygon","arcs":[[3222,3223,3224,-3220]],"properties":{"id":"24660086","dp":12280,"de":0}},{"type":"Polygon","arcs":[[3225,-3223,-3219,3226]],"properties":{"id":"24660087","dp":20078,"de":0}},{"type":"Polygon","arcs":[[3227,-3224,-3226,3228,3229]],"properties":{"id":"24660088","dp":19234,"de":0}},{"type":"MultiPolygon","arcs":[[[3230,3231,3232,3233,3234,3235,3236,-3050,3237]],[[3238,3239,3240,3241,-3052,3242]]],"properties":{"id":"24661191","dp":5217,"de":395}},{"type":"Polygon","arcs":[[3243,-3231,3244,3245]],"properties":{"id":"24661192","dp":10329,"de":3047}},{"type":"Polygon","arcs":[[3246,-3232,-3244,3247]],"properties":{"id":"24661193","dp":14310,"de":2155}},{"type":"Polygon","arcs":[[3248,-3233,-3247,3249,3250]],"properties":{"id":"24661194","dp":10312,"de":780}},{"type":"Polygon","arcs":[[3251,-3234,-3249,3252,3253]],"properties":{"id":"24661195","dp":7338,"de":1778}},{"type":"Polygon","arcs":[[3254,3255,3256,-3235,-3252,3257]],"properties":{"id":"24661196","dp":6634,"de":437}},{"type":"Polygon","arcs":[[3258,3259,3260,3261,3262,-3256]],"properties":{"id":"24661197","dp":10199,"de":1268}},{"type":"Polygon","arcs":[[3263,3264,-3262,3265]],"properties":{"id":"24661198","dp":11922,"de":915}},{"type":"Polygon","arcs":[[3266,3267,-3266,-3261]],"properties":{"id":"24661199","dp":13511,"de":1272}},{"type":"Polygon","arcs":[[3268,3269,3270,3271,-3268,3272]],"properties":{"id":"24661200","dp":7638,"de":0}},{"type":"Polygon","arcs":[[3273,3274,-3271,3275]],"properties":{"id":"24661201","dp":12803,"de":0}},{"type":"Polygon","arcs":[[3276,-3264,-3272,-3275]],"properties":{"id":"24661202","dp":10665,"de":0}},{"type":"Polygon","arcs":[[3277,3278,-354,3279]],"properties":{"id":"24660108","dp":12724,"de":0}},{"type":"Polygon","arcs":[[-1988,-831,-834,-184,-193,3280,3281]],"properties":{"id":"24663184","dp":2621,"de":2323}},{"type":"Polygon","arcs":[[-3282,3282,-1976,-1984,-1989]],"properties":{"id":"24663185","dp":4750,"de":1246}},{"type":"Polygon","arcs":[[-3283,-3281,-198,3283,3284,3285,-1977]],"properties":{"id":"24663186","dp":4383,"de":757}},{"type":"Polygon","arcs":[[3286,3287,-1967,-3286]],"properties":{"id":"24663187","dp":2962,"de":1234}},{"type":"Polygon","arcs":[[3288,-3287,-3285,3289,3290]],"properties":{"id":"24663188","dp":4195,"de":394}},{"type":"Polygon","arcs":[[-3290,3291,3292]],"properties":{"id":"24663189","dp":14500,"de":0}},{"type":"Polygon","arcs":[[-3284,-197,-208,3293,-3292]],"properties":{"id":"24663190","dp":11452,"de":1085}},{"type":"Polygon","arcs":[[3294,3295,-3291]],"properties":{"id":"24663191","dp":16375,"de":0}},{"type":"Polygon","arcs":[[3296,3297,3298,3299,3300,3301,3302]],"properties":{"id":"24663194","dp":6012,"de":1831}},{"type":"Polygon","arcs":[[-3298,3303,3304,3305]],"properties":{"id":"24663195","dp":20000,"de":0}},{"type":"Polygon","arcs":[[3306,3307,3308,-3299,-3306,3309,3310]],"properties":{"id":"24663196","dp":6317,"de":5079}},{"type":"Polygon","arcs":[[3311,-3310,-3305,3312,-210]],"properties":{"id":"24663197","dp":8346,"de":0}},{"type":"Polygon","arcs":[[-204,-2979,3313,-3311,-3312,-209]],"properties":{"id":"24663198","dp":10715,"de":6769}},{"type":"Polygon","arcs":[[-3314,-2978,3314,-114,3315,-3307]],"properties":{"id":"24663199","dp":7392,"de":12541}},{"type":"Polygon","arcs":[[-113,-695,-3308,-3316]],"properties":{"id":"24663200","dp":12563,"de":2689}},{"type":"Polygon","arcs":[[3316,-115,-3315,-240]],"properties":{"id":"24663201","dp":6288,"de":8951}},{"type":"Polygon","arcs":[[3317,3318,-116,-3317,-239]],"properties":{"id":"24663202","dp":11703,"de":3548}},{"type":"Polygon","arcs":[[3319,-127,-117,-3319,3320]],"properties":{"id":"24663203","dp":34809,"de":4761}},{"type":"Polygon","arcs":[[-128,-3320,3321,3322,3323,3324]],"properties":{"id":"24663204","dp":9533,"de":0}},{"type":"Polygon","arcs":[[-3322,-3321,-3318,-238,3325,3326]],"properties":{"id":"24663205","dp":17491,"de":2920}},{"type":"Polygon","arcs":[[-3323,-3327,3327,3328]],"properties":{"id":"24663206","dp":26118,"de":7805}},{"type":"Polygon","arcs":[[3329,-3328,-3326,-244,3330,-173]],"properties":{"id":"24663207","dp":17308,"de":0}},{"type":"Polygon","arcs":[[-161,3331,3332,-3324,-3329,-3330,-172,-164]],"properties":{"id":"24663208","dp":11967,"de":1083}},{"type":"Polygon","arcs":[[-804,3333,3334,-3207]],"properties":{"id":"24661154","dp":13961,"de":2759}},{"type":"Polygon","arcs":[[-802,3335,3336,-3334]],"properties":{"id":"24661155","dp":21612,"de":2764}},{"type":"Polygon","arcs":[[-800,3337,3338,-3336]],"properties":{"id":"24661156","dp":22321,"de":4241}},{"type":"Polygon","arcs":[[3339,3340,-3338,-798]],"properties":{"id":"24661157","dp":19493,"de":0}},{"type":"Polygon","arcs":[[3341,3342,-3340,-796]],"properties":{"id":"24661158","dp":18669,"de":4935}},{"type":"Polygon","arcs":[[3343,3344,-3342,-795]],"properties":{"id":"24661159","dp":14922,"de":2519}},{"type":"Polygon","arcs":[[3345,3346,-3344,-787]],"properties":{"id":"24661160","dp":15663,"de":3763}},{"type":"Polygon","arcs":[[3347,3348,-3346,-785]],"properties":{"id":"24661161","dp":9785,"de":2412}},{"type":"Polygon","arcs":[[3349,3350,3351,-3348,-784]],"properties":{"id":"24661162","dp":13058,"de":1106}},{"type":"Polygon","arcs":[[3352,3353,3354,-3350,-783]],"properties":{"id":"24661163","dp":16531,"de":0}},{"type":"Polygon","arcs":[[3355,3356,-3353,-782,3357]],"properties":{"id":"24661164","dp":16909,"de":0}},{"type":"Polygon","arcs":[[3358,3359,-3356,3360]],"properties":{"id":"24661165","dp":10887,"de":1380}},{"type":"Polygon","arcs":[[3361,-3255,3362,-3361,-3358,-781,3363,3364]],"properties":{"id":"24661166","dp":5202,"de":1692}},{"type":"Polygon","arcs":[[-3258,3365,-3363]],"properties":{"id":"24661167","dp":15246,"de":0}},{"type":"Polygon","arcs":[[-3366,-3254,3366,-3359]],"properties":{"id":"24661168","dp":13460,"de":0}},{"type":"Polygon","arcs":[[-3367,-3253,-3251,3367,-3357,-3360]],"properties":{"id":"24661169","dp":15337,"de":1533}},{"type":"Polygon","arcs":[[-3368,-3250,3368,-3354]],"properties":{"id":"24661170","dp":23842,"de":0}},{"type":"Polygon","arcs":[[-3369,-3248,-3246,3369,-3351,-3355]],"properties":{"id":"24661171","dp":14472,"de":3140}},{"type":"Polygon","arcs":[[-3370,-3245,-3238,-3049,3370,-3349,-3352]],"properties":{"id":"24661172","dp":9834,"de":1731}},{"type":"Polygon","arcs":[[-3371,-3048,3371,-3347]],"properties":{"id":"24661173","dp":13832,"de":3310}},{"type":"Polygon","arcs":[[-3372,-3047,3372,-3345]],"properties":{"id":"24661174","dp":21274,"de":3861}},{"type":"Polygon","arcs":[[-3373,-3043,3373,-3343]],"properties":{"id":"24661175","dp":19230,"de":0}},{"type":"Polygon","arcs":[[-3374,-3042,3374,-3341]],"properties":{"id":"24661176","dp":21751,"de":0}},{"type":"Polygon","arcs":[[-3339,-3375,-3041,3375]],"properties":{"id":"24661177","dp":21036,"de":0}},{"type":"Polygon","arcs":[[-3376,-3040,3376,-3335,-3337]],"properties":{"id":"24661178","dp":6833,"de":3742}},{"type":"Polygon","arcs":[[-3377,3377,3378,-3206,-3208]],"properties":{"id":"24661179","dp":14724,"de":1862}},{"type":"Polygon","arcs":[[-3379,3379,3380,-3204]],"properties":{"id":"24661180","dp":23074,"de":0}},{"type":"Polygon","arcs":[[3381,3382,3383,3384,-3201,-3381]],"properties":{"id":"24661181","dp":18403,"de":2409}},{"type":"Polygon","arcs":[[3385,-3027,3386,-3384]],"properties":{"id":"24661182","dp":11259,"de":1358}},{"type":"Polygon","arcs":[[3387,-3034,-3028,-3386,-3383]],"properties":{"id":"24661183","dp":18908,"de":1649}},{"type":"Polygon","arcs":[[-2744,-2755,-2759,3388]],"properties":{"id":"24663246","dp":31756,"de":5620}},{"type":"Polygon","arcs":[[-1307,-1292,-1284,-1282]],"properties":{"id":"24663249","dp":47225,"de":5161}},{"type":"Polygon","arcs":[[3389,3390,3391,3392,3393]],"properties":{"id":"24663250","dp":12063,"de":3798}},{"type":"Polygon","arcs":[[3394,3395,3396,3397,3398]],"properties":{"id":"24663251","dp":11937,"de":0}},{"type":"Polygon","arcs":[[3399,-1105,-2404,-597,3400]],"properties":{"id":"24663252","dp":26443,"de":1408}},{"type":"Polygon","arcs":[[3401,3402,3403,3404,3405,3406,3407,3408,3409,3410]],"properties":{"id":"24663253","dp":13664,"de":1865}},{"type":"MultiPolygon","arcs":[[[-3274,3411,3412,3413,-3277]],[[3414,-2553,-2556,3415,3416]]],"properties":{"id":"24661203","dp":9063,"de":0}},{"type":"MultiPolygon","arcs":[[[3417,-3236,-3257,-3263,-3265,-3414]],[[3418,-3416,-3239]]],"properties":{"id":"24661204","dp":3052,"de":1081}},{"type":"Polygon","arcs":[[3419,-3240,-2557,-40,-45]],"properties":{"id":"24661205","dp":5939,"de":0}},{"type":"Polygon","arcs":[[-3420,-44,-51,3420,-3241]],"properties":{"id":"24661206","dp":6356,"de":550}},{"type":"Polygon","arcs":[[-53,-64,-3242,-3421]],"properties":{"id":"24661207","dp":10224,"de":0}},{"type":"MultiPolygon","arcs":[[[3421,3422,3423,3424,3425,-3412,-3276,-3270,3426]],[[3427,-2554,-3415,3428]]],"properties":{"id":"24661208","dp":295,"de":1732}},{"type":"Polygon","arcs":[[-3273,-3267,3429,3430,-3365,3431]],"properties":{"id":"24661209","dp":5475,"de":356}},{"type":"Polygon","arcs":[[-3260,3432,-3430]],"properties":{"id":"24661210","dp":15641,"de":0}},{"type":"Polygon","arcs":[[-3431,-3433,-3259,-3362]],"properties":{"id":"24661211","dp":12188,"de":4716}},{"type":"Polygon","arcs":[[3433,3434,-1166,-1180,-1183]],"properties":{"id":"24661212","dp":4038,"de":622}},{"type":"Polygon","arcs":[[3435,3436,3437,3438,3439,3440]],"properties":{"id":"24663269","dp":1061,"de":3255}},{"type":"Polygon","arcs":[[3441,3442,3443,3444,3445,3446,3447,3448,3449]],"properties":{"id":"24663270","dp":7341,"de":307}},{"type":"Polygon","arcs":[[-3408,3450,3451,3452,3453,3454,3455,3456,3457,3458]],"properties":{"id":"24663271","dp":2233,"de":11596}},{"type":"Polygon","arcs":[[-2933,3459,-2937,-2943]],"properties":{"id":"24663273","dp":19587,"de":976}},{"type":"Polygon","arcs":[[-1352,-1354,-2854,3460]],"properties":{"id":"24663274","dp":27500,"de":1973}},{"type":"Polygon","arcs":[[-3020,3461,-3295,-3293,-3294,-212,3462,3463,-3007,-3018]],"properties":{"id":"24663275","dp":4884,"de":10149}},{"type":"Polygon","arcs":[[3464,3465,3466]],"properties":{"id":"24663276","dp":12939,"de":0}},{"type":"Polygon","arcs":[[-152,3467,-3332,-160,-157]],"properties":{"id":"24663209","dp":9659,"de":810}},{"type":"Polygon","arcs":[[-133,-124,-3325,-3333,-3468]],"properties":{"id":"24663210","dp":10178,"de":1002}},{"type":"Polygon","arcs":[[-3331,-243,-2975,-174]],"properties":{"id":"24663211","dp":9648,"de":3079}},{"type":"Polygon","arcs":[[-2184,-2180,3468,3469,3470,3471]],"properties":{"id":"24663288","dp":4980,"de":1679}},{"type":"Polygon","arcs":[[-2895,-2892,3472,-2911,-2899]],"properties":{"id":"24663289","dp":8868,"de":2340}},{"type":"MultiPolygon","arcs":[[[3473,-3030,-3035,-3388,-3382,-3380,-3378,-3039]],[[-3045,-68,-3036,-3032,3474]]],"properties":{"id":"24663290","dp":6596,"de":3206}},{"type":"Polygon","arcs":[[3475,3476]],"properties":{"id":"24663291","dp":16843,"de":0}},{"type":"Polygon","arcs":[[3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488]],"properties":{"id":"24663292","dp":424,"de":759}},{"type":"Polygon","arcs":[[3489,3490,3491,3492,3493,3494,3495]],"properties":{"id":"24663293","dp":3039,"de":13093}},{"type":"Polygon","arcs":[[3496,3497,3498,3499,3500,3501]],"properties":{"id":"24663294","dp":3803,"de":0}},{"type":"Polygon","arcs":[[3502,3503,3504,3505]],"properties":{"id":"24663295","dp":3273,"de":1243}},{"type":"Polygon","arcs":[[3506,3507,3508,3509,3510,3511,3512]],"properties":{"id":"24663296","dp":10980,"de":0}},{"type":"Polygon","arcs":[[3513,3514,3515,3516,3517,3518,3519]],"properties":{"id":"24663297","dp":4062,"de":3647}},{"type":"Polygon","arcs":[[3520,-1611,3521,3522]],"properties":{"id":"24663298","dp":10290,"de":431}},{"type":"Polygon","arcs":[[-3134,3523,3524,3525]],"properties":{"id":"24663299","dp":20633,"de":2816}},{"type":"Polygon","arcs":[[3526,-1007,-1014,-1015,-1012,3527]],"properties":{"id":"24663254","dp":8178,"de":1468}},{"type":"Polygon","arcs":[[3528,-3434,-1182,-1185,-1004,-1176,-1005,-3527]],"properties":{"id":"24663255","dp":13213,"de":1348}},{"type":"Polygon","arcs":[[-2151,-2153,-2155,-2148,-2131,-2128,-2118,-1941,3529,3530,3531,-2156]],"properties":{"id":"24663256","dp":2761,"de":842}},{"type":"Polygon","arcs":[[-2914,3532,3533,3534,3535,3536,3537,3538,3539]],"properties":{"id":"24663257","dp":2943,"de":5095}},{"type":"Polygon","arcs":[[3540,3541,3542,3543,3544,-3537]],"properties":{"id":"24663258","dp":19200,"de":5619}},{"type":"Polygon","arcs":[[3545,-2054,-2048,-2059,-2056]],"properties":{"id":"24663259","dp":19775,"de":1810}},{"type":"Polygon","arcs":[[-1816,-2325,3546,3547,-2033,-1820]],"properties":{"id":"24663260","dp":5799,"de":302}},{"type":"Polygon","arcs":[[3548,-943,3549,3550,3551,3552,3553]],"properties":{"id":"24663261","dp":10430,"de":2822}},{"type":"Polygon","arcs":[[3554,3555,3556,3557,3558]],"properties":{"id":"24663262","dp":21363,"de":1420}},{"type":"Polygon","arcs":[[3559,3560,3561,3562]],"properties":{"id":"24663277","dp":11305,"de":1820}},{"type":"Polygon","arcs":[[-993,-1025,-984]],"properties":{"id":"24663278","dp":41141,"de":6974}},{"type":"Polygon","arcs":[[-3472,3563,3564,-2182]],"properties":{"id":"24663279","dp":24677,"de":2263}},{"type":"Polygon","arcs":[[3565,-3470,3566,-2039,-2051]],"properties":{"id":"24663280","dp":5196,"de":4803}},{"type":"Polygon","arcs":[[3567,3568,3569,3570,3571,3572,3573,3574]],"properties":{"id":"24663281","dp":12352,"de":5560}},{"type":"Polygon","arcs":[[3575,-1626,3576,3577,3578,3579,3580,3581,3582,3583]],"properties":{"id":"24663282","dp":403,"de":1720}},{"type":"Polygon","arcs":[[3584,-2255,-2258,-2270,-2263,-2247,-2251]],"properties":{"id":"24663283","dp":14097,"de":2115}},{"type":"Polygon","arcs":[[-1664,3585,3586,3587,-1650,-1655,-1657,3588,-1660]],"properties":{"id":"24663284","dp":5898,"de":454}},{"type":"Polygon","arcs":[[3589,3590,3591,3592,3593,3594,3595]],"properties":{"id":"24663285","dp":4915,"de":722}},{"type":"Polygon","arcs":[[-180,-190,-188]],"properties":{"id":"24663286","dp":14516,"de":3151}},{"type":"Polygon","arcs":[[-840,-186,-837,3596]],"properties":{"id":"24663287","dp":9080,"de":3738}},{"type":"Polygon","arcs":[[3597,-3526,3598,3599]],"properties":{"id":"24663300","dp":4306,"de":7142}},{"type":"Polygon","arcs":[[3600,3601,3602,3603,3604,3605,3606]],"properties":{"id":"24663301","dp":5000,"de":874}},{"type":"Polygon","arcs":[[-3598,3607,3608,-3603,3609,3610,3611,3612,-3130]],"properties":{"id":"24663302","dp":2740,"de":3662}},{"type":"Polygon","arcs":[[-2319,-2314,3613,-3106]],"properties":{"id":"24663304","dp":4222,"de":1674}},{"type":"Polygon","arcs":[[-3614,-2313,-3107]],"properties":{"id":"24663305","dp":11317,"de":0}},{"type":"Polygon","arcs":[[-3182,3614,3615,3616]],"properties":{"id":"24660011","dp":3302,"de":512}},{"type":"Polygon","arcs":[[3617,3618,3619,3620,3621,3622,-1126,3623,-1124,-1133,-3616]],"properties":{"id":"24660012","dp":1821,"de":144}},{"type":"Polygon","arcs":[[3624,-3618,3625]],"properties":{"id":"24660013","dp":5428,"de":0}},{"type":"Polygon","arcs":[[3626,-3621,3627,-3619,-3625]],"properties":{"id":"24660014","dp":4686,"de":0}},{"type":"Polygon","arcs":[[-3620,-3628]],"properties":{"id":"24660015","dp":16000,"de":0}},{"type":"Polygon","arcs":[[-1125,-3624]],"properties":{"id":"24660016","dp":7637,"de":0}},{"type":"Polygon","arcs":[[-3466,3628,-3622,-3627,3629,3630]],"properties":{"id":"24660017","dp":4391,"de":0}},{"type":"Polygon","arcs":[[3631,-3467,3632,3633,3634]],"properties":{"id":"24660020","dp":2240,"de":701}},{"type":"Polygon","arcs":[[3635,-3634,3636,3637]],"properties":{"id":"24660021","dp":11277,"de":0}},{"type":"Polygon","arcs":[[3638,3639,3640,-3638,3641,3642]],"properties":{"id":"24660022","dp":2906,"de":441}},{"type":"Polygon","arcs":[[-3637,-3633,-3631,3643,3644,-3642]],"properties":{"id":"24660023","dp":7629,"de":0}},{"type":"Polygon","arcs":[[-3643,-3645,3645,3646,3647]],"properties":{"id":"24660024","dp":6532,"de":636}},{"type":"Polygon","arcs":[[-3644,-3630,-3626,3648,-3646]],"properties":{"id":"24660025","dp":6474,"de":798}},{"type":"Polygon","arcs":[[-451,3649,-3647,-3649,-3615,-3181,3650]],"properties":{"id":"24660026","dp":3172,"de":5079}},{"type":"Polygon","arcs":[[3651,3652,-3639,-3648,-3650]],"properties":{"id":"24660027","dp":4713,"de":0}},{"type":"Polygon","arcs":[[3653,-3640,-3653,3654,3655]],"properties":{"id":"24660028","dp":5487,"de":0}},{"type":"Polygon","arcs":[[3656,-3656,3657]],"properties":{"id":"24660029","dp":7930,"de":0}},{"type":"MultiPolygon","arcs":[[[3658],[3659],[3660],[3661],[3662]],[[3663]],[[3664]],[[3665]],[[3666]],[[-1202,3667]]],"properties":{"id":"24663335","dp":0,"de":1576}},{"type":"Polygon","arcs":[[3668,3669,3670,3671,3672,3673,3674,3675,3676,3677]],"properties":{"id":"24663336","dp":1743,"de":12924}},{"type":"Polygon","arcs":[[3678,3679,-3675]],"properties":{"id":"24663337","dp":16604,"de":10074}},{"type":"Polygon","arcs":[[3680,3681,3682,3683,3684,3685,3686,-3394]],"properties":{"id":"24663340","dp":0,"de":454}},{"type":"Polygon","arcs":[[3687,3688,3689,3690,3691]],"properties":{"id":"24663341","dp":12943,"de":6012}},{"type":"Polygon","arcs":[[3692,3693,3694,3695,3696,3697,-3692,3698]],"properties":{"id":"24663342","dp":7561,"de":11140}},{"type":"Polygon","arcs":[[-3698,3699,-3688]],"properties":{"id":"24663343","dp":15903,"de":4819}},{"type":"Polygon","arcs":[[3700,3701,-3694,3702,3703]],"properties":{"id":"24663344","dp":13444,"de":19335}},{"type":"Polygon","arcs":[[-3703,-3693,3704,3705]],"properties":{"id":"24663345","dp":33611,"de":9444}},{"type":"Polygon","arcs":[[3706,3707,3708,3709,3710]],"properties":{"id":"24663346","dp":13606,"de":4566}},{"type":"Polygon","arcs":[[-1087,-1270,3711,3712,-3708,3713,3714]],"properties":{"id":"24663347","dp":8468,"de":33829}},{"type":"Polygon","arcs":[[-1089,3715,-3714,-3707,3716]],"properties":{"id":"24663348","dp":36692,"de":3846}},{"type":"Polygon","arcs":[[-3715,-3716,-1088]],"properties":{"id":"24663349","dp":45769,"de":3076}},{"type":"Polygon","arcs":[[-1090,-3717,-3711,3717,-1210]],"properties":{"id":"24663350","dp":15335,"de":17449}},{"type":"Polygon","arcs":[[-3179,3718,3719,3720,3721,3722,3723,3724,3725,3726,-1141,3727]],"properties":{"id":"24660001","dp":2047,"de":233}},{"type":"Polygon","arcs":[[3728,3729,3730,-3725]],"properties":{"id":"24660002","dp":5004,"de":0}},{"type":"Polygon","arcs":[[-3731,3731,-3726]],"properties":{"id":"24660003","dp":5058,"de":0}},{"type":"Polygon","arcs":[[-3724,3732,3733,-3729]],"properties":{"id":"24660004","dp":3438,"de":911}},{"type":"Polygon","arcs":[[3734,3735,-3733,-3723]],"properties":{"id":"24660005","dp":3742,"de":0}},{"type":"Polygon","arcs":[[3736,3737,-3735,-3722]],"properties":{"id":"24660006","dp":5415,"de":0}},{"type":"Polygon","arcs":[[-3730,-3734,-3736,-3738,3738,-1131,3739,-1136,-3727,-3732]],"properties":{"id":"24660007","dp":3336,"de":320}},{"type":"Polygon","arcs":[[-3719,-3617,-1132,-3739,-3737,-3721,3740]],"properties":{"id":"24660008","dp":4464,"de":418}},{"type":"Polygon","arcs":[[-3720,-3741]],"properties":{"id":"24660009","dp":4909,"de":0}},{"type":"Polygon","arcs":[[3741,3742,3743,-3230]],"properties":{"id":"24660089","dp":8651,"de":0}},{"type":"Polygon","arcs":[[3744,-3742,-3229,3745,3746]],"properties":{"id":"24660090","dp":15840,"de":0}},{"type":"Polygon","arcs":[[3747,-3746,-3227,-3218]],"properties":{"id":"24660091","dp":10712,"de":4502}},{"type":"Polygon","arcs":[[3748,3749,3750,-3747,-3748,-3222,-280]],"properties":{"id":"24660092","dp":1236,"de":585}},{"type":"Polygon","arcs":[[3751,3752,-3751,3753]],"properties":{"id":"24660093","dp":7496,"de":915}},{"type":"Polygon","arcs":[[3754,3755,-3745,-3753]],"properties":{"id":"24660094","dp":6199,"de":0}},{"type":"Polygon","arcs":[[-3755,-3752,3756,3757,3758,3759,3760,3761]],"properties":{"id":"24660095","dp":3070,"de":445}},{"type":"Polygon","arcs":[[-3762,3762,-3743,-3756]],"properties":{"id":"24660096","dp":6771,"de":0}},{"type":"Polygon","arcs":[[-3761,3763,3764,-3763]],"properties":{"id":"24660097","dp":8248,"de":0}},{"type":"Polygon","arcs":[[-3228,-3744,-3765,3765,-3215,-3221,-3225]],"properties":{"id":"24660098","dp":4304,"de":432}},{"type":"Polygon","arcs":[[-3766,-3764,3766,3767,3768,3769,3770,-3210,-3216]],"properties":{"id":"24660099","dp":9366,"de":477}},{"type":"Polygon","arcs":[[3771,3772,-3769]],"properties":{"id":"24660100","dp":22663,"de":0}},{"type":"Polygon","arcs":[[3773,3774,3775,3776,3777,3778,-3658,-3655,-3652,-450]],"properties":{"id":"24660030","dp":3590,"de":131}},{"type":"Polygon","arcs":[[-3775,3779]],"properties":{"id":"24660031","dp":6939,"de":0}},{"type":"Polygon","arcs":[[-445,3780,-3776,-3780,-3774,-449]],"properties":{"id":"24660032","dp":5086,"de":0}},{"type":"Polygon","arcs":[[3781,3782,-3777,-3781,-444,-423,3783,3784,3785]],"properties":{"id":"24660033","dp":4427,"de":0}},{"type":"Polygon","arcs":[[-3784,-422,3786]],"properties":{"id":"24660034","dp":4525,"de":0}},{"type":"Polygon","arcs":[[-3785,-3787,-421,3787]],"properties":{"id":"24660035","dp":4877,"de":0}},{"type":"Polygon","arcs":[[3788,-3786,-3788,-420,-1152]],"properties":{"id":"24660036","dp":7800,"de":0}},{"type":"Polygon","arcs":[[3789,3790,3791,3792,3793,3794,3795]],"properties":{"id":"24660458","dp":4152,"de":4725}},{"type":"Polygon","arcs":[[3796,3797,-3278,3798]],"properties":{"id":"24660109","dp":17802,"de":0}},{"type":"Polygon","arcs":[[3799,3800,3801,3802,3803,-3797]],"properties":{"id":"24660110","dp":22450,"de":0}},{"type":"Polygon","arcs":[[-339,3804,3805,-3802,3806]],"properties":{"id":"24660111","dp":18067,"de":0}},{"type":"Polygon","arcs":[[3807,-340,-3807,-3801]],"properties":{"id":"24660112","dp":18508,"de":0}},{"type":"Polygon","arcs":[[-338,3808,-3805]],"properties":{"id":"24660114","dp":23632,"de":0}},{"type":"Polygon","arcs":[[-3809,-337,3809,-3803,-3806]],"properties":{"id":"24660115","dp":16015,"de":0}},{"type":"Polygon","arcs":[[-3810,-336,3810,-262,-357,-355,-3279,-3798,-3804]],"properties":{"id":"24660117","dp":4462,"de":5461}},{"type":"Polygon","arcs":[[-335,3811,3812,-256,-261,-3811]],"properties":{"id":"24660118","dp":9364,"de":2931}},{"type":"Polygon","arcs":[[-334,3813,3814,-3812]],"properties":{"id":"24660119","dp":6607,"de":2031}},{"type":"Polygon","arcs":[[-3815,3815,3816,-265,-257,-3813]],"properties":{"id":"24660120","dp":6476,"de":0}},{"type":"Polygon","arcs":[[3817,3818,3819,-3816,3820,3821]],"properties":{"id":"24660121","dp":8339,"de":1797}},{"type":"Polygon","arcs":[[-3820,3822,3823,-266,-3817]],"properties":{"id":"24660122","dp":11481,"de":0}},{"type":"Polygon","arcs":[[-3819,3824,-3493,3825,3826,-3823]],"properties":{"id":"24660123","dp":3694,"de":0}},{"type":"Polygon","arcs":[[-3827,3827,3828,-267,-3824]],"properties":{"id":"24660124","dp":11609,"de":0}},{"type":"Polygon","arcs":[[-268,-3829,3829,3830,3831]],"properties":{"id":"24660125","dp":13209,"de":1131}},{"type":"Polygon","arcs":[[3832,3833,3834,-3830,-3828,-3826]],"properties":{"id":"24660126","dp":4189,"de":0}},{"type":"Polygon","arcs":[[-3835,3835,3836,3837,-3831]],"properties":{"id":"24660127","dp":6483,"de":773}},{"type":"Polygon","arcs":[[-3832,-3838,3838,-274,-269]],"properties":{"id":"24660128","dp":12889,"de":0}},{"type":"Polygon","arcs":[[-275,-3839,-3837,3839,3840,3841,-277]],"properties":{"id":"24660129","dp":10520,"de":1145}},{"type":"Polygon","arcs":[[-278,-3842,3842,-506]],"properties":{"id":"24660130","dp":9644,"de":3074}},{"type":"Polygon","arcs":[[-3841,3843,3844,3845,3846,-3843]],"properties":{"id":"24660131","dp":12089,"de":2665}},{"type":"Polygon","arcs":[[-3194,3847,3848,3849,3850,-2267]],"properties":{"id":"24660256","dp":4794,"de":1063}},{"type":"Polygon","arcs":[[-3851,3851,3852,-2268]],"properties":{"id":"24660257","dp":8399,"de":0}},{"type":"Polygon","arcs":[[-2269,-3853,3853,3854,3855,-2261]],"properties":{"id":"24660258","dp":4598,"de":2641}},{"type":"Polygon","arcs":[[-3855,3856]],"properties":{"id":"24660259","dp":15089,"de":0}},{"type":"Polygon","arcs":[[3857,3858,-2239,-2262,-3856,-3857,-3854,3859,-1382,3860]],"properties":{"id":"24660260","dp":2424,"de":2400}},{"type":"Polygon","arcs":[[3861,-3858]],"properties":{"id":"24660261","dp":11855,"de":1385}},{"type":"Polygon","arcs":[[3862,-2240,-3859,-3862,-3861,-1381,3863]],"properties":{"id":"24660262","dp":5335,"de":617}},{"type":"Polygon","arcs":[[-1380,3864,3865,-3864]],"properties":{"id":"24660263","dp":9710,"de":826}},{"type":"Polygon","arcs":[[-2229,-2234,-3863,-3866,3866,3867,3868,-2225]],"properties":{"id":"24660264","dp":7393,"de":4612}},{"type":"Polygon","arcs":[[3869,3870,3871,-3868]],"properties":{"id":"24660265","dp":10184,"de":0}},{"type":"Polygon","arcs":[[-2226,-3869,-3872,3872,3873,-1545,-1734,-2021,-2218,-2219,-2223]],"properties":{"id":"24660266","dp":4161,"de":2015}},{"type":"Polygon","arcs":[[3874,-3873,-3871]],"properties":{"id":"24660267","dp":9696,"de":0}},{"type":"Polygon","arcs":[[-3875,-3870,-3867,-3865,3875,-1546,-3874]],"properties":{"id":"24660268","dp":5985,"de":3475}},{"type":"Polygon","arcs":[[-1379,3876,3877,3878,-3876]],"properties":{"id":"24660269","dp":4919,"de":3068}},{"type":"Polygon","arcs":[[-1378,3879,3880,3881,3882,-3877]],"properties":{"id":"24660270","dp":9120,"de":1282}},{"type":"Polygon","arcs":[[3883,3884,-3881,3885]],"properties":{"id":"24660271","dp":9671,"de":0}},{"type":"Polygon","arcs":[[-3882,-3885,3886,3887,3888]],"properties":{"id":"24660272","dp":12573,"de":0}},{"type":"Polygon","arcs":[[-3878,-3883,-3889,3889,3890]],"properties":{"id":"24660273","dp":11016,"de":0}},{"type":"Polygon","arcs":[[-1541,-3879,-3891,3891,-1563,-1555,-1547]],"properties":{"id":"24660274","dp":2558,"de":1977}},{"type":"Polygon","arcs":[[-696,-105,-1063,-1069,-1070,-1082]],"properties":{"id":"24660779","dp":9027,"de":2188}},{"type":"Polygon","arcs":[[3892,3893,-1071,-1067,-1065]],"properties":{"id":"24660780","dp":7729,"de":0}},{"type":"Polygon","arcs":[[3894,3895,-3893,3896]],"properties":{"id":"24660781","dp":4710,"de":550}},{"type":"Polygon","arcs":[[3897,3898,3899,3900,-1052,3901,-3112,3902,-3895]],"properties":{"id":"24660783","dp":4526,"de":1025}},{"type":"Polygon","arcs":[[-326,3903,-489,3904,-481,3905,3906]],"properties":{"id":"24660058","dp":474,"de":381}},{"type":"Polygon","arcs":[[-3906,-476,-463,-454,3907]],"properties":{"id":"24660059","dp":4875,"de":1197}},{"type":"Polygon","arcs":[[-498,-482,-3905]],"properties":{"id":"24660060","dp":2995,"de":2623}},{"type":"Polygon","arcs":[[-328,-323,3908,-490,-3904,-325]],"properties":{"id":"24660061","dp":9766,"de":833}},{"type":"Polygon","arcs":[[3909,-491,-3909,-318]],"properties":{"id":"24660062","dp":7499,"de":0}},{"type":"Polygon","arcs":[[3910,-492,-3910,-317]],"properties":{"id":"24660063","dp":10650,"de":0}},{"type":"Polygon","arcs":[[3911,3912,-493,-3911,-316,3913]],"properties":{"id":"24660064","dp":8991,"de":0}},{"type":"Polygon","arcs":[[-313,3914,-3914,-315]],"properties":{"id":"24660065","dp":13836,"de":0}},{"type":"Polygon","arcs":[[3915,3916,3917,-3912,-3915,3918]],"properties":{"id":"24660066","dp":6968,"de":834}},{"type":"Polygon","arcs":[[3919,-494,-3913,-3918]],"properties":{"id":"24660067","dp":7838,"de":0}},{"type":"Polygon","arcs":[[3920,-495,-3920,-3917,3921]],"properties":{"id":"24660068","dp":8108,"de":844}},{"type":"Polygon","arcs":[[3922,3923,3924,-3922,-3916]],"properties":{"id":"24660069","dp":10914,"de":4850}},{"type":"Polygon","arcs":[[-312,3925,3926,3927,-3923,-3919]],"properties":{"id":"24660070","dp":11619,"de":1190}},{"type":"Polygon","arcs":[[-308,3928,3929,-3926,-311]],"properties":{"id":"24660071","dp":10212,"de":0}},{"type":"Polygon","arcs":[[-657,3930,-3927,-3930,3931]],"properties":{"id":"24660072","dp":10846,"de":1476}},{"type":"Polygon","arcs":[[-299,-305,3932,-654,-3932,-3929,-307]],"properties":{"id":"24660073","dp":4275,"de":574}},{"type":"Polygon","arcs":[[3933,3934,-653,-3933,-304]],"properties":{"id":"24660074","dp":8286,"de":1582}},{"type":"Polygon","arcs":[[3935,3936,3937,-3934,-303]],"properties":{"id":"24660075","dp":5793,"de":672}},{"type":"Polygon","arcs":[[3938,3939,-647,-3935,-3938]],"properties":{"id":"24660076","dp":6507,"de":902}},{"type":"Polygon","arcs":[[3940,-638,-641,-645,-3940,3941]],"properties":{"id":"24660077","dp":6005,"de":0}},{"type":"Polygon","arcs":[[3942,3943,-3942,-3939,-3937,3944]],"properties":{"id":"24660078","dp":6475,"de":0}},{"type":"Polygon","arcs":[[-3773,3945,-639,-3941,-3944,3946,-3770]],"properties":{"id":"24660079","dp":3312,"de":756}},{"type":"Polygon","arcs":[[-3947,-3943,3947,-3211,-3771]],"properties":{"id":"24660080","dp":9645,"de":0}},{"type":"Polygon","arcs":[[-3948,-3945,-3936,-302,-3212]],"properties":{"id":"24660081","dp":6897,"de":1705}},{"type":"Polygon","arcs":[[-3772,-3768,3948,3949,-632,-636,-3946]],"properties":{"id":"24660101","dp":3859,"de":1078}},{"type":"Polygon","arcs":[[-3121,-627,-633,-3950,3950]],"properties":{"id":"24660102","dp":3071,"de":604}},{"type":"Polygon","arcs":[[-3951,-3949,-3767,-3760,3951]],"properties":{"id":"24660103","dp":4091,"de":0}},{"type":"Polygon","arcs":[[-3759,3952,-3484,3953,3954,3955,3956,3957,3958,-353,-350,-341,-3120,-3952]],"properties":{"id":"24660104","dp":968,"de":1344}},{"type":"Polygon","arcs":[[3959,-3280,-351,-3959]],"properties":{"id":"24660107","dp":14011,"de":0}},{"type":"Polygon","arcs":[[3960,3961,3962,3963]],"properties":{"id":"24660564","dp":5572,"de":412}},{"type":"Polygon","arcs":[[3964,3965,-3964,3966,3967,3968,3969,3970]],"properties":{"id":"24660565","dp":5712,"de":0}},{"type":"Polygon","arcs":[[3971,3972,3973,3974,-3967,3975]],"properties":{"id":"24660566","dp":3902,"de":1012}},{"type":"Polygon","arcs":[[3976,-3968,-3975]],"properties":{"id":"24660567","dp":10783,"de":1546}},{"type":"Polygon","arcs":[[-3974,3977,3978,-3969,-3977]],"properties":{"id":"24660568","dp":10551,"de":0}},{"type":"Polygon","arcs":[[-3973,3979,3980,3981,-3978]],"properties":{"id":"24660569","dp":8966,"de":0}},{"type":"Polygon","arcs":[[-3845,3982,-1770,-1953,3983,3984]],"properties":{"id":"24660132","dp":12459,"de":0}},{"type":"Polygon","arcs":[[-3985,3985,-3846]],"properties":{"id":"24660133","dp":12254,"de":0}},{"type":"Polygon","arcs":[[-507,-3847,-3986,-3984,-1952,-1949,3986,3987]],"properties":{"id":"24660134","dp":2753,"de":849}},{"type":"Polygon","arcs":[[-3987,-1948,3988,3989]],"properties":{"id":"24660135","dp":10378,"de":0}},{"type":"Polygon","arcs":[[3990,-3989,-1947,3991]],"properties":{"id":"24660136","dp":13547,"de":0}},{"type":"Polygon","arcs":[[-3992,-1946,3992,3993]],"properties":{"id":"24660137","dp":12757,"de":0}},{"type":"Polygon","arcs":[[-3993,-1927,3994]],"properties":{"id":"24660138","dp":23147,"de":758}},{"type":"Polygon","arcs":[[3995,-3995,-1945,-606]],"properties":{"id":"24660139","dp":6485,"de":3954}},{"type":"Polygon","arcs":[[-508,-3988,-3990,-3991,-3994,-3996]],"properties":{"id":"24660140","dp":12885,"de":1179}},{"type":"Polygon","arcs":[[3996,3997,3998,3999,4000,4001]],"properties":{"id":"24660598","dp":4539,"de":2885}},{"type":"Polygon","arcs":[[-3191,-1910,-1907,-1882,4002,-3848,-3193]],"properties":{"id":"24660364","dp":5171,"de":4040}},{"type":"Polygon","arcs":[[-3849,-4003,-1881,4003]],"properties":{"id":"24660365","dp":12324,"de":3944}},{"type":"Polygon","arcs":[[-3850,-4004,-1880,4004,4005,-1374,-3860,-3852]],"properties":{"id":"24660366","dp":5486,"de":2006}},{"type":"Polygon","arcs":[[-1879,4006,4007,4008,4009,-4005]],"properties":{"id":"24660367","dp":12082,"de":879}},{"type":"Polygon","arcs":[[-4006,-4010,4010,4011,-1362,-1375]],"properties":{"id":"24660368","dp":13387,"de":1254}},{"type":"Polygon","arcs":[[4012,4013,-4011,-4009]],"properties":{"id":"24660369","dp":19425,"de":0}},{"type":"Polygon","arcs":[[4014,4015,-1367,-4012,-4014]],"properties":{"id":"24660370","dp":26294,"de":6696}},{"type":"Polygon","arcs":[[-4013,-4008,4016,4017,-4015]],"properties":{"id":"24660371","dp":15693,"de":0}},{"type":"Polygon","arcs":[[-4007,-1878,4018,4019,-4017]],"properties":{"id":"24660372","dp":12250,"de":833}},{"type":"Polygon","arcs":[[-4018,-4020,4020,4021,4022,-4016]],"properties":{"id":"24660373","dp":13591,"de":892}},{"type":"Polygon","arcs":[[-1368,-4023,4023,4024]],"properties":{"id":"24660374","dp":15451,"de":0}},{"type":"Polygon","arcs":[[4025,4026,4027,4028,-4024,-4022]],"properties":{"id":"24660375","dp":17118,"de":0}},{"type":"Polygon","arcs":[[-4025,-4029,4029,-1369]],"properties":{"id":"24660376","dp":10732,"de":0}},{"type":"Polygon","arcs":[[4030,4031,4032,-1370,-4030,4033]],"properties":{"id":"24660377","dp":16050,"de":0}},{"type":"Polygon","arcs":[[4034,4035,-4032,4036]],"properties":{"id":"24660378","dp":16162,"de":0}},{"type":"Polygon","arcs":[[-4035,4037,4038,4039]],"properties":{"id":"24660379","dp":13517,"de":0}},{"type":"Polygon","arcs":[[-4031,4040,4041,4042,-4038,-4037]],"properties":{"id":"24660380","dp":14898,"de":0}},{"type":"Polygon","arcs":[[-4039,-4043,4043,4044,4045]],"properties":{"id":"24660381","dp":14686,"de":1174}},{"type":"Polygon","arcs":[[-4042,4046,4047,4048,-4044]],"properties":{"id":"24660382","dp":10102,"de":0}},{"type":"Polygon","arcs":[[4049,4050,-4049,4051,4052]],"properties":{"id":"24660383","dp":9879,"de":1982}},{"type":"Polygon","arcs":[[-4053,4053,4054,4055]],"properties":{"id":"24660384","dp":10290,"de":0}},{"type":"Polygon","arcs":[[-4052,4056,-1668,4057,4058,4059,4060,-4054]],"properties":{"id":"24660385","dp":4564,"de":788}},{"type":"Polygon","arcs":[[4061,-4055,-4061,4062]],"properties":{"id":"24660386","dp":6116,"de":0}},{"type":"Polygon","arcs":[[-1565,4063,-4063,-4060,4064,4065]],"properties":{"id":"24660387","dp":3554,"de":0}},{"type":"Polygon","arcs":[[-4050,-4056,-4062,-4064,-1564,4066]],"properties":{"id":"24660388","dp":7447,"de":2180}},{"type":"Polygon","arcs":[[4067,4068,-4045,-4051,-4067,-3892,-3890,-3888,4069]],"properties":{"id":"24660389","dp":3721,"de":3940}},{"type":"Polygon","arcs":[[4070,4071,-4070,-3887,-3884]],"properties":{"id":"24660390","dp":9086,"de":0}},{"type":"Polygon","arcs":[[4072,-4068,-4072,4073]],"properties":{"id":"24660391","dp":9632,"de":0}},{"type":"Polygon","arcs":[[-3880,-1377,4074,4075,-4074,-4071,-3886]],"properties":{"id":"24660392","dp":5027,"de":3240}},{"type":"Polygon","arcs":[[-1372,-1365,4076,-4075,-1376]],"properties":{"id":"24660393","dp":9076,"de":1988}},{"type":"Polygon","arcs":[[-4076,-4077,-1364,-1371,-4033,-4036,-4040,-4046,-4069,-4073]],"properties":{"id":"24660394","dp":4090,"de":1463}},{"type":"Polygon","arcs":[[4077,4078,-689,4079,4080,4081]],"properties":{"id":"24660166","dp":5356,"de":515}},{"type":"Polygon","arcs":[[4082,4083,-4081,4084,4085]],"properties":{"id":"24660167","dp":16198,"de":1033}},{"type":"Polygon","arcs":[[4086,-4086,4087,4088]],"properties":{"id":"24660168","dp":4927,"de":671}},{"type":"Polygon","arcs":[[4089,4090,4091,-4088,4092,4093]],"properties":{"id":"24660169","dp":3152,"de":935}},{"type":"Polygon","arcs":[[-4085,-4080,-688,4094,4095,-4093]],"properties":{"id":"24660170","dp":7031,"de":0}},{"type":"Polygon","arcs":[[-1566,-4066,4096,-1653,-1645,4097]],"properties":{"id":"24660399","dp":3414,"de":0}},{"type":"Polygon","arcs":[[-1567,-4098,-1644,-1642,-1635,-1634,-1631,-1435,-1433,-1431,-1570]],"properties":{"id":"24660400","dp":2100,"de":575}},{"type":"Polygon","arcs":[[4098,4099,4100]],"properties":{"id":"24660423","dp":23730,"de":0}},{"type":"Polygon","arcs":[[4101,4102,4103,-4099,4104]],"properties":{"id":"24660424","dp":15945,"de":1718}},{"type":"Polygon","arcs":[[4105,4106,-4102,4107]],"properties":{"id":"24660425","dp":18770,"de":1495}},{"type":"Polygon","arcs":[[4108,4109,-4106,4110]],"properties":{"id":"24660426","dp":17269,"de":0}},{"type":"Polygon","arcs":[[4111,4112,4113,-4109]],"properties":{"id":"24660427","dp":17706,"de":0}},{"type":"Polygon","arcs":[[4114,4115,4116,-4113]],"properties":{"id":"24660428","dp":27773,"de":0}},{"type":"Polygon","arcs":[[4117,-4116,4118,4119]],"properties":{"id":"24660429","dp":23579,"de":0}},{"type":"Polygon","arcs":[[4120,-4120,4121,4122]],"properties":{"id":"24660430","dp":16882,"de":0}},{"type":"Polygon","arcs":[[-4123,4123,4124]],"properties":{"id":"24660431","dp":14984,"de":0}},{"type":"Polygon","arcs":[[4125,4126,4127,4128,-4124]],"properties":{"id":"24660432","dp":10350,"de":0}},{"type":"Polygon","arcs":[[4129,4130,-4128,4131]],"properties":{"id":"24660433","dp":17389,"de":1174}},{"type":"Polygon","arcs":[[4132,4133,-4130,4134]],"properties":{"id":"24660434","dp":16356,"de":0}},{"type":"Polygon","arcs":[[4135,4136,4137,-4133]],"properties":{"id":"24660435","dp":15329,"de":3708}},{"type":"Polygon","arcs":[[4138,4139,4140,4141,-4137,4142]],"properties":{"id":"24660436","dp":10709,"de":4233}},{"type":"Polygon","arcs":[[4143,4144,-4140,4145]],"properties":{"id":"24660437","dp":22179,"de":0}},{"type":"Polygon","arcs":[[4146,4147,-4144,4148]],"properties":{"id":"24660438","dp":25625,"de":3750}},{"type":"Polygon","arcs":[[4149,4150,-4147,4151]],"properties":{"id":"24660439","dp":20000,"de":6140}},{"type":"Polygon","arcs":[[4152,4153,-3792,4154,4155]],"properties":{"id":"24660459","dp":17007,"de":2068}},{"type":"Polygon","arcs":[[4156,4157,4158,-4153,4159]],"properties":{"id":"24660460","dp":18172,"de":0}},{"type":"Polygon","arcs":[[4160,4161,-4154,-4159]],"properties":{"id":"24660461","dp":15100,"de":1507}},{"type":"Polygon","arcs":[[4162,4163,4164,-4161,-4158,4165]],"properties":{"id":"24660462","dp":15151,"de":1377}},{"type":"Polygon","arcs":[[4166,4167,-4163,4168]],"properties":{"id":"24660463","dp":19042,"de":2816}},{"type":"Polygon","arcs":[[4169,4170,-4167,4171]],"properties":{"id":"24660464","dp":15386,"de":2743}},{"type":"Polygon","arcs":[[4172,4173,4174,-4170,4175]],"properties":{"id":"24660465","dp":13896,"de":1558}},{"type":"Polygon","arcs":[[4176,4177,-4173,4178]],"properties":{"id":"24660466","dp":14131,"de":3443}},{"type":"Polygon","arcs":[[4179,-4179,4180,4181]],"properties":{"id":"24660467","dp":11898,"de":7365}},{"type":"Polygon","arcs":[[-4181,-4176,4182,4183]],"properties":{"id":"24660468","dp":16944,"de":2146}},{"type":"Polygon","arcs":[[-4183,-4172,4184,4185]],"properties":{"id":"24660469","dp":12219,"de":2682}},{"type":"Polygon","arcs":[[-4185,-4169,4186,4187]],"properties":{"id":"24660470","dp":17717,"de":6929}},{"type":"Polygon","arcs":[[-4187,-4166,-4157,4188,4189]],"properties":{"id":"24660471","dp":14788,"de":2380}},{"type":"Polygon","arcs":[[4190,-4190,4191,4192,4193]],"properties":{"id":"24660472","dp":17818,"de":3541}},{"type":"Polygon","arcs":[[4194,-4188,-4191,4195,4196]],"properties":{"id":"24660473","dp":17999,"de":3150}},{"type":"Polygon","arcs":[[4197,-4186,-4195,4198,4199]],"properties":{"id":"24660474","dp":15870,"de":3233}},{"type":"Polygon","arcs":[[4200,-4184,-4198,4201]],"properties":{"id":"24660475","dp":12894,"de":3617}},{"type":"Polygon","arcs":[[-3683,-4182,-4201,4202]],"properties":{"id":"24660476","dp":17076,"de":7748}},{"type":"Polygon","arcs":[[4203,-4180,-3682]],"properties":{"id":"24660478","dp":4474,"de":4523}},{"type":"Polygon","arcs":[[-4177,-4204,-3681,4204,4205,4206,4207,4208,4209]],"properties":{"id":"24660479","dp":1370,"de":9509}},{"type":"Polygon","arcs":[[-4209,4210,4211,-504,-511,4212]],"properties":{"id":"24660480","dp":5733,"de":3267}},{"type":"Polygon","arcs":[[4213,4214,-4212]],"properties":{"id":"24660481","dp":12109,"de":1734}},{"type":"Polygon","arcs":[[4215,-4214,4216]],"properties":{"id":"24660482","dp":16749,"de":4489}},{"type":"Polygon","arcs":[[4217,4218,4219,-505,-4215,-4216,4220]],"properties":{"id":"24660483","dp":5110,"de":940}},{"type":"Polygon","arcs":[[-3898,-3897,-1064,-1060,4221]],"properties":{"id":"24660784","dp":3202,"de":407}},{"type":"Polygon","arcs":[[-1055,-1053,-3901,4222,-3899,-4222,-1059]],"properties":{"id":"24660785","dp":3121,"de":559}},{"type":"Polygon","arcs":[[-3900,-4223]],"properties":{"id":"24660786","dp":3672,"de":491}},{"type":"Polygon","arcs":[[-1050,-2008,-2177,4223,-3902]],"properties":{"id":"24660787","dp":3514,"de":355}},{"type":"Polygon","arcs":[[-4065,-4059,4224,-1656,-1648,-4097]],"properties":{"id":"24660401","dp":3324,"de":913}},{"type":"Polygon","arcs":[[-4225,-4058,-1667,-1661,-3589,-1658]],"properties":{"id":"24660402","dp":12199,"de":0}},{"type":"Polygon","arcs":[[-1675,-1671,-1670,-4057,-4048,4225]],"properties":{"id":"24660403","dp":3108,"de":1372}},{"type":"Polygon","arcs":[[-4028,4226,4227,-4226,-4047,-4041,-4034]],"properties":{"id":"24660404","dp":5442,"de":0}},{"type":"Polygon","arcs":[[4228,-1690,-1678,-1676,-4228,4229]],"properties":{"id":"24660405","dp":15799,"de":0}},{"type":"Polygon","arcs":[[4230,-4230,-4227,-4027]],"properties":{"id":"24660406","dp":10615,"de":1538}},{"type":"Polygon","arcs":[[-4026,4231,4232,-1686,-4229,-4231]],"properties":{"id":"24660407","dp":13564,"de":0}},{"type":"Polygon","arcs":[[4233,4234,4235,-1698,-1691,-1687,-4233]],"properties":{"id":"24660408","dp":18621,"de":0}},{"type":"Polygon","arcs":[[4236,4237,-4235,4238]],"properties":{"id":"24660409","dp":22556,"de":0}},{"type":"Polygon","arcs":[[-1877,-4239,-4234,-4232,-4021,-4019]],"properties":{"id":"24660410","dp":6211,"de":1941}},{"type":"Polygon","arcs":[[4239,-1699,-4236,-4238]],"properties":{"id":"24660411","dp":21674,"de":3167}},{"type":"Polygon","arcs":[[-1847,-1838,-1834,-1831,-1702,-1700,-1695,-4240,-4237,-1876]],"properties":{"id":"24660412","dp":1516,"de":947}},{"type":"Polygon","arcs":[[4240,4241,4242,4243,-1897,-1904,4244]],"properties":{"id":"24660413","dp":7629,"de":3237}},{"type":"Polygon","arcs":[[4245,4246,-1898,-4244]],"properties":{"id":"24660414","dp":13892,"de":0}},{"type":"Polygon","arcs":[[4247,4248,-1893,-1899,-4247,4249]],"properties":{"id":"24660415","dp":7452,"de":1071}},{"type":"Polygon","arcs":[[4250,4251,4252,4253,4254,-4248]],"properties":{"id":"24660416","dp":8088,"de":0}},{"type":"Polygon","arcs":[[4255,4256,4257,-4252,4258]],"properties":{"id":"24660417","dp":8397,"de":1217}},{"type":"Polygon","arcs":[[4259,4260,-4253,-4258]],"properties":{"id":"24660418","dp":7408,"de":0}},{"type":"Polygon","arcs":[[4261,4262,4263,4264,-4260,-4257]],"properties":{"id":"24660419","dp":4079,"de":789}},{"type":"Polygon","arcs":[[4265,4266,-4264,4267]],"properties":{"id":"24660420","dp":17323,"de":0}},{"type":"Polygon","arcs":[[4268,-4268,-4263,4269,4270]],"properties":{"id":"24660421","dp":16531,"de":1219}},{"type":"Polygon","arcs":[[4271,-4100,-4104,4272,-4269]],"properties":{"id":"24660422","dp":15726,"de":0}},{"type":"MultiPolygon","arcs":[[[4273,4274,-2460,-2466,4275,4276,4277,4278,4279,4280]],[[4281,4282]]],"properties":{"id":"24660926","dp":6773,"de":0}},{"type":"Polygon","arcs":[[4283,4284,-2461,-4275]],"properties":{"id":"24660927","dp":7585,"de":0}},{"type":"Polygon","arcs":[[4285,-2467,-2462,-4285]],"properties":{"id":"24660928","dp":8019,"de":0}},{"type":"Polygon","arcs":[[4286,-3401,-596,4287,-3477,4288,4289]],"properties":{"id":"24660518","dp":15000,"de":563}},{"type":"Polygon","arcs":[[4290,4291,4292,4293,4294,4295]],"properties":{"id":"24660525","dp":12410,"de":0}},{"type":"Polygon","arcs":[[4296,4297,-4150,4298]],"properties":{"id":"24660440","dp":14646,"de":0}},{"type":"Polygon","arcs":[[4299,4300,-4297,4301]],"properties":{"id":"24660441","dp":18742,"de":3459}},{"type":"Polygon","arcs":[[4302,4303,-4300,4304]],"properties":{"id":"24660442","dp":16552,"de":1709}},{"type":"Polygon","arcs":[[-3685,4305,-4303,4306]],"properties":{"id":"24660443","dp":15920,"de":4447}},{"type":"Polygon","arcs":[[-3684,-4203,4307,-4306]],"properties":{"id":"24660444","dp":14444,"de":7834}},{"type":"Polygon","arcs":[[-4308,-4202,4308,-4304]],"properties":{"id":"24660445","dp":16717,"de":2671}},{"type":"Polygon","arcs":[[-4309,-4200,4309,-4301]],"properties":{"id":"24660446","dp":17611,"de":0}},{"type":"Polygon","arcs":[[-4310,-4199,4310,-4298]],"properties":{"id":"24660447","dp":17577,"de":2863}},{"type":"Polygon","arcs":[[-4311,-4197,4311,-4151]],"properties":{"id":"24660448","dp":22538,"de":6735}},{"type":"Polygon","arcs":[[-4312,-4196,4312,-4148]],"properties":{"id":"24660449","dp":20333,"de":2500}},{"type":"Polygon","arcs":[[-4313,-4194,4313,-4141,-4145]],"properties":{"id":"24660450","dp":15549,"de":1126}},{"type":"Polygon","arcs":[[-4142,-4314,-4193,4314,4315]],"properties":{"id":"24660451","dp":14132,"de":2739}},{"type":"Polygon","arcs":[[-4316,4316,-4138]],"properties":{"id":"24660452","dp":13869,"de":1636}},{"type":"Polygon","arcs":[[-4134,-4317,4317,4318,4319]],"properties":{"id":"24660453","dp":8690,"de":1719}},{"type":"Polygon","arcs":[[-4192,4320,-4318,-4315]],"properties":{"id":"24660454","dp":13194,"de":4027}},{"type":"Polygon","arcs":[[-4189,-4160,4321,-4321]],"properties":{"id":"24660455","dp":11069,"de":3323}},{"type":"Polygon","arcs":[[-4322,-4156,4322,-3790,-4319]],"properties":{"id":"24660456","dp":15204,"de":1656}},{"type":"Polygon","arcs":[[-4155,-3791,-4323]],"properties":{"id":"24660457","dp":13793,"de":2387}},{"type":"Polygon","arcs":[[-2655,-2639,-2632,4323,4324,4325,-2490,-2484,-2657]],"properties":{"id":"24660952","dp":2107,"de":2644}},{"type":"Polygon","arcs":[[4326,4327,4328,-3982]],"properties":{"id":"24660570","dp":22280,"de":3947}},{"type":"Polygon","arcs":[[4329,4330,4331,-4327]],"properties":{"id":"24660571","dp":32237,"de":0}},{"type":"Polygon","arcs":[[4332,4333,4334,4335,4336,-4331,4337]],"properties":{"id":"24660572","dp":13214,"de":0}},{"type":"Polygon","arcs":[[4338,4339,4340,4341,4342]],"properties":{"id":"24660576","dp":15705,"de":0}},{"type":"Polygon","arcs":[[-4340,4343,4344]],"properties":{"id":"24660577","dp":7985,"de":0}},{"type":"Polygon","arcs":[[4345,4346,4347,-4342,4348,4349]],"properties":{"id":"24660578","dp":4970,"de":3345}},{"type":"Polygon","arcs":[[4350,4351,-4349]],"properties":{"id":"24660579","dp":14097,"de":4768}},{"type":"Polygon","arcs":[[4352,-4350,-4352,4353,4354]],"properties":{"id":"24660580","dp":4554,"de":1508}},{"type":"Polygon","arcs":[[4355,4356,4357,4358,4359,4360]],"properties":{"id":"24660581","dp":5580,"de":2961}},{"type":"Polygon","arcs":[[4361,4362,4363,-4356,4364]],"properties":{"id":"24660582","dp":11443,"de":1012}},{"type":"Polygon","arcs":[[4365,-4365,-4361,4366,4367]],"properties":{"id":"24660583","dp":10212,"de":5418}},{"type":"Polygon","arcs":[[4368,4369,4370,-4362,-4366,4371]],"properties":{"id":"24660584","dp":5052,"de":862}},{"type":"Polygon","arcs":[[4372,-4372,-4368,4373,4374,4375,4376]],"properties":{"id":"24660585","dp":4741,"de":2181}},{"type":"Polygon","arcs":[[4377,-4221,-4217,-4211,-4208]],"properties":{"id":"24660484","dp":10803,"de":2362}},{"type":"Polygon","arcs":[[-4207,4378,4379,-4218,-4378]],"properties":{"id":"24660485","dp":5224,"de":6205}},{"type":"Polygon","arcs":[[-575,-512,-500,4380,4381,-4380,4382]],"properties":{"id":"24660486","dp":1819,"de":13159}},{"type":"Polygon","arcs":[[-4382,4383,-4219]],"properties":{"id":"24660487","dp":15706,"de":2077}},{"type":"Polygon","arcs":[[-4384,-4381,-499,-4220]],"properties":{"id":"24660488","dp":12904,"de":919}},{"type":"Polygon","arcs":[[4384,-2704,-2706,-2458,-2413]],"properties":{"id":"24660979","dp":9222,"de":2208}},{"type":"Polygon","arcs":[[-2702,-2705,-4385,-2412]],"properties":{"id":"24660980","dp":10359,"de":0}},{"type":"Polygon","arcs":[[4385,4386,4387,-3999]],"properties":{"id":"24660599","dp":6274,"de":0}},{"type":"Polygon","arcs":[[-4388,4388,4389,4390,-4000]],"properties":{"id":"24660600","dp":5620,"de":5057}},{"type":"Polygon","arcs":[[-4390,4391,4392,-3123,4393]],"properties":{"id":"24660601","dp":7892,"de":2229}},{"type":"Polygon","arcs":[[4394,-4392,-4389,4395,4396,4397]],"properties":{"id":"24660602","dp":4270,"de":5729}},{"type":"Polygon","arcs":[[4398,4399,-4396,-4387,4400]],"properties":{"id":"24660603","dp":4420,"de":1462}},{"type":"Polygon","arcs":[[-4400,4401,4402,-4397]],"properties":{"id":"24660604","dp":6686,"de":0}},{"type":"Polygon","arcs":[[-4374,-4367,-4360,-4355,4403,4404,-4402,-4399,4405]],"properties":{"id":"24660605","dp":2946,"de":5468}},{"type":"Polygon","arcs":[[-4375,-4406,-4401,-4386,4406]],"properties":{"id":"24660606","dp":3811,"de":1411}},{"type":"Polygon","arcs":[[4407,-4001,-4391,-4394,-3122,4408,4409,4410]],"properties":{"id":"24660607","dp":2848,"de":7381}},{"type":"Polygon","arcs":[[4411,4412,-3116,4413,4414,-4411,-941,-934,-932]],"properties":{"id":"24660608","dp":463,"de":5260}},{"type":"Polygon","arcs":[[4415,4416,-4412,-931,-3119]],"properties":{"id":"24660609","dp":2641,"de":2531}},{"type":"Polygon","arcs":[[-3117,-4413,-4417,4417]],"properties":{"id":"24660610","dp":2666,"de":14393}},{"type":"Polygon","arcs":[[-4418,-4416,-3118]],"properties":{"id":"24660611","dp":16222,"de":7040}},{"type":"Polygon","arcs":[[4418,-1080,-3109,-2938,4419]],"properties":{"id":"24660613","dp":3786,"de":4147}},{"type":"Polygon","arcs":[[4420,-4419,4421]],"properties":{"id":"24660614","dp":12644,"de":8510}},{"type":"Polygon","arcs":[[-3460,4422,-4422,-4420]],"properties":{"id":"24660615","dp":27462,"de":0}},{"type":"Polygon","arcs":[[-4224,-2183,-3565,4423,-2061,4424,4425,-3113]],"properties":{"id":"24660788","dp":7484,"de":1600}},{"type":"Polygon","arcs":[[-2050,-2055,-3546,4426,-3564,-3471,-3566]],"properties":{"id":"24660794","dp":4439,"de":2791}},{"type":"Polygon","arcs":[[4427,-2040,-3567,4428]],"properties":{"id":"24660797","dp":5200,"de":1235}},{"type":"Polygon","arcs":[[4429,-4429,-3469,-2193]],"properties":{"id":"24660798","dp":6746,"de":0}},{"type":"Polygon","arcs":[[4430,4431,-4430,-2196]],"properties":{"id":"24660799","dp":7162,"de":0}},{"type":"Polygon","arcs":[[4432,-2041,-4428,-4432]],"properties":{"id":"24660800","dp":6923,"de":729}},{"type":"Polygon","arcs":[[4433,-2042,-4433,4434]],"properties":{"id":"24660801","dp":4749,"de":426}},{"type":"Polygon","arcs":[[4435,4436,-4435,-4431,-2195,4437]],"properties":{"id":"24660802","dp":4322,"de":481}},{"type":"Polygon","arcs":[[4438,-2043,-4434,-4437]],"properties":{"id":"24660803","dp":4712,"de":517}},{"type":"Polygon","arcs":[[4439,4440,-2026,-2036,-4439,-4436,4441]],"properties":{"id":"24660804","dp":745,"de":55}},{"type":"Polygon","arcs":[[4442,-4440,4443]],"properties":{"id":"24660805","dp":8888,"de":0}},{"type":"Polygon","arcs":[[-4444,-4442,-4438,-2194,4444]],"properties":{"id":"24660806","dp":4068,"de":648}},{"type":"Polygon","arcs":[[4445,4446,4447,-3530,-1940,-2027,-4441,-4443,-4445,-2189,-2203,-2208,4448]],"properties":{"id":"24660807","dp":3586,"de":559}},{"type":"Polygon","arcs":[[4449,-4446]],"properties":{"id":"24660808","dp":3833,"de":0}},{"type":"Polygon","arcs":[[-3532,4450,-4447,-4450,-4449,-2207,-2209,-2162,-2157]],"properties":{"id":"24660809","dp":5176,"de":880}},{"type":"Polygon","arcs":[[-4448,-4451,-3531]],"properties":{"id":"24660810","dp":4575,"de":0}},{"type":"Polygon","arcs":[[4451,4452,-1359]],"properties":{"id":"24661311","dp":32867,"de":0}},{"type":"Polygon","arcs":[[4453,4454,4455,-2852,-4453]],"properties":{"id":"24661312","dp":10645,"de":1794}},{"type":"Polygon","arcs":[[-2788,-2941,4456,4457,-2846,-4456,4458]],"properties":{"id":"24661313","dp":2863,"de":2616}},{"type":"Polygon","arcs":[[-4459,-4455,4459,-2794]],"properties":{"id":"24661314","dp":37951,"de":0}},{"type":"Polygon","arcs":[[4460,4461,-4460,-4454,-4452]],"properties":{"id":"24661315","dp":34814,"de":0}},{"type":"Polygon","arcs":[[-2784,-2790,-2795,-4462,4462]],"properties":{"id":"24661316","dp":22947,"de":4736}},{"type":"Polygon","arcs":[[-2948,-2782,-4463,-4461,-1357,-2798,-2823]],"properties":{"id":"24661317","dp":3828,"de":0}},{"type":"Polygon","arcs":[[-701,-720,-778,-2318]],"properties":{"id":"24660901","dp":10963,"de":0}},{"type":"Polygon","arcs":[[4463,4464,4465,4466,-755,-729,-727,4467]],"properties":{"id":"24660902","dp":5807,"de":6610}},{"type":"Polygon","arcs":[[4468,4469,-4464,4470]],"properties":{"id":"24660903","dp":12154,"de":0}},{"type":"Polygon","arcs":[[4471,4472,4473,-4465,-4470]],"properties":{"id":"24660904","dp":11378,"de":3372}},{"type":"Polygon","arcs":[[-4295,4474,4475,4476,4477]],"properties":{"id":"24660526","dp":10221,"de":968}},{"type":"Polygon","arcs":[[4478,4479,-4477,4480,4481]],"properties":{"id":"24660530","dp":11022,"de":936}},{"type":"Polygon","arcs":[[4482,4483,4484,-4479,4485,4486]],"properties":{"id":"24660533","dp":17837,"de":7939}},{"type":"Polygon","arcs":[[-3558,4487,4488,-4483,4489,4490,4491]],"properties":{"id":"24660536","dp":16698,"de":2226}},{"type":"Polygon","arcs":[[-4489,4492,4493,4494,-4484]],"properties":{"id":"24660537","dp":30743,"de":0}},{"type":"Polygon","arcs":[[4495,-4291,4496,-4494]],"properties":{"id":"24660538","dp":28089,"de":0}},{"type":"Polygon","arcs":[[-4497,-4296,-4478,-4480,-4485,-4495]],"properties":{"id":"24660539","dp":8857,"de":2124}},{"type":"Polygon","arcs":[[-4496,-4493,-4488,4497,4498,-4292]],"properties":{"id":"24660540","dp":9237,"de":5053}},{"type":"Polygon","arcs":[[-3557,4499,4500,4501,4502,4503,4504,-3965,-4498]],"properties":{"id":"24660541","dp":5923,"de":1763}},{"type":"Polygon","arcs":[[4505,-4503]],"properties":{"id":"24660542","dp":5433,"de":680}},{"type":"Polygon","arcs":[[4506,4507,4508,-4504,-4506,-4502]],"properties":{"id":"24660543","dp":6713,"de":0}},{"type":"Polygon","arcs":[[4509,4510,4511,-4508,4512]],"properties":{"id":"24660544","dp":6430,"de":0}},{"type":"Polygon","arcs":[[-4501,-3126,4513,4514,-4513,-4507]],"properties":{"id":"24660545","dp":7629,"de":1708}},{"type":"Polygon","arcs":[[4515,-3595,4516,-4515]],"properties":{"id":"24660546","dp":9042,"de":5953}},{"type":"Polygon","arcs":[[4517,-4516,-4514,-3125]],"properties":{"id":"24660547","dp":5863,"de":7096}},{"type":"Polygon","arcs":[[-4393,-4395,-3596,-4518,-3124]],"properties":{"id":"24660548","dp":9006,"de":1319}},{"type":"Polygon","arcs":[[-4403,-4405,-3138,4518,4519,-3590,-4398]],"properties":{"id":"24660550","dp":4107,"de":4395}},{"type":"Polygon","arcs":[[-3591,-4520,4520,4521]],"properties":{"id":"24660551","dp":19581,"de":0}},{"type":"Polygon","arcs":[[-4521,-4519,-3137,4522]],"properties":{"id":"24660552","dp":27578,"de":4882}},{"type":"Polygon","arcs":[[-4404,-4354,-4351,-4341,4523,-3135]],"properties":{"id":"24660555","dp":12644,"de":0}},{"type":"Polygon","arcs":[[-4524,-4345,4524,4525,4526,4527,-3136]],"properties":{"id":"24660556","dp":10140,"de":1358}},{"type":"Polygon","arcs":[[-4523,-4528,4528]],"properties":{"id":"24660557","dp":22720,"de":0}},{"type":"Polygon","arcs":[[-3592,-4522,-4529,-4527,4529,4530]],"properties":{"id":"24660558","dp":8979,"de":2312}},{"type":"Polygon","arcs":[[-4531,-3976,-3963,4531,-3593]],"properties":{"id":"24660560","dp":3900,"de":1036}},{"type":"Polygon","arcs":[[-3594,-4532,4532,-4510,-4517]],"properties":{"id":"24660561","dp":5533,"de":917}},{"type":"Polygon","arcs":[[-4533,-3962,4533,-4511]],"properties":{"id":"24660562","dp":12880,"de":0}},{"type":"Polygon","arcs":[[-4534,-3961,-3966,-4505,-4509,-4512]],"properties":{"id":"24660563","dp":4956,"de":1557}},{"type":"Polygon","arcs":[[4534,-4094,-4096,4535,4536]],"properties":{"id":"24660171","dp":10209,"de":0}},{"type":"Polygon","arcs":[[4537,-4536,-4095,-687,-678,4538]],"properties":{"id":"24660172","dp":12507,"de":0}},{"type":"Polygon","arcs":[[4539,-4539,-677,-660,4540]],"properties":{"id":"24660173","dp":10934,"de":0}},{"type":"Polygon","arcs":[[4541,4542,-4369,-4373,4543]],"properties":{"id":"24660586","dp":7473,"de":0}},{"type":"Polygon","arcs":[[4544,-4544,-4377,4545,4546,4547]],"properties":{"id":"24660587","dp":4432,"de":714}},{"type":"Polygon","arcs":[[4548,-3612,4549,4550,-4542,-4545,-3132]],"properties":{"id":"24660588","dp":3861,"de":0}},{"type":"Polygon","arcs":[[-3613,-4549,-3131]],"properties":{"id":"24660590","dp":4636,"de":0}},{"type":"Polygon","arcs":[[-3524,-3133,-4548,4551]],"properties":{"id":"24660594","dp":6326,"de":0}},{"type":"Polygon","arcs":[[-3599,-3525,-4552,-4547,4552,4553,-4002,-4408,-4415,4554]],"properties":{"id":"24660595","dp":3087,"de":2310}},{"type":"Polygon","arcs":[[-4546,-4376,-4407,-3998,4555,-4553]],"properties":{"id":"24660596","dp":9901,"de":0}},{"type":"Polygon","arcs":[[-4554,-4556,-3997]],"properties":{"id":"24660597","dp":12168,"de":1084}},{"type":"Polygon","arcs":[[4556,4557,4558,-3541,-3536]],"properties":{"id":"24661062","dp":17500,"de":6793}},{"type":"Polygon","arcs":[[4559,-3542,-4559]],"properties":{"id":"24661063","dp":31257,"de":0}},{"type":"Polygon","arcs":[[-3544,4560,4561,-2710,4562,4563]],"properties":{"id":"24661066","dp":7992,"de":2200}},{"type":"Polygon","arcs":[[4564,4565,-4561,-3543]],"properties":{"id":"24661067","dp":6868,"de":1124}},{"type":"Polygon","arcs":[[-4558,4566,4567,-4565,-4560]],"properties":{"id":"24661068","dp":7535,"de":2392}},{"type":"Polygon","arcs":[[-824,-1987,4568,-4562,-4566,-4568,4569]],"properties":{"id":"24661069","dp":6727,"de":4444}},{"type":"Polygon","arcs":[[-1986,-1983,-2715,-2711,-4569]],"properties":{"id":"24661070","dp":5254,"de":3708}},{"type":"Polygon","arcs":[[-1081,-4421,-4423,-2935,-2932,4570,4571]],"properties":{"id":"24660616","dp":10046,"de":1113}},{"type":"Polygon","arcs":[[-2929,4572,-4571]],"properties":{"id":"24660617","dp":18432,"de":0}},{"type":"Polygon","arcs":[[4573,4574,-4573,-2926,-2920]],"properties":{"id":"24660618","dp":10665,"de":6569}},{"type":"Polygon","arcs":[[-1077,-4572,-4575,4575]],"properties":{"id":"24660619","dp":10755,"de":2485}},{"type":"Polygon","arcs":[[4576,-1083,-1078,-4576,-4574,-2917,4577,4578,4579]],"properties":{"id":"24660620","dp":4651,"de":2549}},{"type":"Polygon","arcs":[[4580,-4580,4581]],"properties":{"id":"24660621","dp":22919,"de":0}},{"type":"Polygon","arcs":[[4582,-4581,4583,-3300]],"properties":{"id":"24660622","dp":17689,"de":0}},{"type":"Polygon","arcs":[[-4583,-3309,-694,-4577]],"properties":{"id":"24660623","dp":20567,"de":28723}},{"type":"Polygon","arcs":[[-2970,-2974,4584,4585]],"properties":{"id":"24661113","dp":17609,"de":3902}},{"type":"Polygon","arcs":[[4586,4587,4588,-4472,-4469,4589,4590,4591]],"properties":{"id":"24660905","dp":12702,"de":1621}},{"type":"Polygon","arcs":[[4592,4593,-4473,-4589,4594]],"properties":{"id":"24660906","dp":10153,"de":1282}},{"type":"Polygon","arcs":[[-4595,-4588,4595]],"properties":{"id":"24660907","dp":9488,"de":2555}},{"type":"Polygon","arcs":[[4596,4597,4598,-4593,-4596,-4587,4599,-4325,4600,4601,4602,-4467,4603]],"properties":{"id":"24660908","dp":6482,"de":1924}},{"type":"Polygon","arcs":[[-4599,4604,4605,-4604,-4466,-4474,-4594]],"properties":{"id":"24660909","dp":10358,"de":1793}},{"type":"Polygon","arcs":[[4606,-4605,-4598]],"properties":{"id":"24660910","dp":13546,"de":0}},{"type":"Polygon","arcs":[[-4607,-4597,-4606]],"properties":{"id":"24660911","dp":13955,"de":0}},{"type":"Polygon","arcs":[[-4324,4607,-4601]],"properties":{"id":"24660912","dp":12570,"de":2712}},{"type":"Polygon","arcs":[[-2631,4608,4609,4610,-4602,-4608]],"properties":{"id":"24660913","dp":6696,"de":10600}},{"type":"Polygon","arcs":[[-4611,4611,-756,-4603]],"properties":{"id":"24660914","dp":6847,"de":4130}},{"type":"Polygon","arcs":[[-4610,4612,4613,4614,4615,4616,-757,-4612]],"properties":{"id":"24660915","dp":6709,"de":1865}},{"type":"Polygon","arcs":[[4617,-758,-4617]],"properties":{"id":"24660916","dp":6732,"de":911}},{"type":"Polygon","arcs":[[-4616,4618,4619,4620,4621,4622,4623,4624,-759,-4618]],"properties":{"id":"24660917","dp":937,"de":2228}},{"type":"Polygon","arcs":[[-4615,4625,-4619]],"properties":{"id":"24660918","dp":7993,"de":1445}},{"type":"Polygon","arcs":[[4626,-4620,-4626,-4614]],"properties":{"id":"24660919","dp":3671,"de":2519}},{"type":"Polygon","arcs":[[-4613,-4609,-2630,-2469,4627,-4621,-4627]],"properties":{"id":"24660920","dp":2294,"de":2096}},{"type":"Polygon","arcs":[[-4628,-2475,4628,4629,4630,-4622]],"properties":{"id":"24660921","dp":4868,"de":0}},{"type":"Polygon","arcs":[[4631,-4630]],"properties":{"id":"24660922","dp":7716,"de":0}},{"type":"Polygon","arcs":[[-4631,-4632,-4629,-2474,4632,-4279,4633,4634,-4623]],"properties":{"id":"24660923","dp":3032,"de":1617}},{"type":"Polygon","arcs":[[-2473,-2468,-4286,-4284,-4274,4635,-4280,-4633]],"properties":{"id":"24660924","dp":2561,"de":291}},{"type":"Polygon","arcs":[[-4281,-4636]],"properties":{"id":"24660925","dp":19018,"de":1380}},{"type":"Polygon","arcs":[[-643,4636,-4537,-4538,-4540,4637]],"properties":{"id":"24660174","dp":9953,"de":0}},{"type":"Polygon","arcs":[[-648,-644,-4638,-4541,-659,-650]],"properties":{"id":"24660175","dp":7087,"de":0}},{"type":"Polygon","arcs":[[-4535,-4637,-642,-629,4638,-4090]],"properties":{"id":"24660176","dp":2965,"de":1467}},{"type":"Polygon","arcs":[[-4639,-628,-622,4639,-4091]],"properties":{"id":"24660177","dp":2979,"de":0}},{"type":"Polygon","arcs":[[-1933,-1421,4640,-4089,-4092,-4640]],"properties":{"id":"24660178","dp":2868,"de":1465}},{"type":"Polygon","arcs":[[4641,4642,4643,-4083,-4087,-4641]],"properties":{"id":"24660179","dp":3765,"de":321}},{"type":"Polygon","arcs":[[-4642,-1420,-1923,4644]],"properties":{"id":"24660180","dp":4749,"de":1354}},{"type":"Polygon","arcs":[[-4643,-4645,-1922,-1918,4645,4646,4647]],"properties":{"id":"24660181","dp":12371,"de":2291}},{"type":"Polygon","arcs":[[-1917,-1412,4648,-4646]],"properties":{"id":"24660182","dp":22071,"de":0}},{"type":"Polygon","arcs":[[4649,-4647,-4649,-1417,4650,4651,-4078]],"properties":{"id":"24660183","dp":7839,"de":1737}},{"type":"Polygon","arcs":[[-4648,-4650,-4082,-4084,-4644]],"properties":{"id":"24660184","dp":8692,"de":5130}},{"type":"Polygon","arcs":[[-4651,-1416,4652,4653]],"properties":{"id":"24660185","dp":10135,"de":0}},{"type":"Polygon","arcs":[[-4079,-4652,-4654,4654,4655,4656,-690]],"properties":{"id":"24660186","dp":12608,"de":1440}},{"type":"Polygon","arcs":[[-1415,-1411,-1402,-4655,-4653]],"properties":{"id":"24660187","dp":9391,"de":0}},{"type":"Polygon","arcs":[[-4656,-1407,4657,4658]],"properties":{"id":"24660188","dp":12819,"de":1101}},{"type":"Polygon","arcs":[[4659,-4658,-1406,4660]],"properties":{"id":"24660189","dp":23013,"de":0}},{"type":"Polygon","arcs":[[-691,-4657,-4659,-4660,-680,-686]],"properties":{"id":"24660190","dp":11042,"de":2055}},{"type":"Polygon","arcs":[[-681,-4661,-1394,4661]],"properties":{"id":"24660191","dp":20078,"de":0}},{"type":"Polygon","arcs":[[-4662,-1398,4662,-682]],"properties":{"id":"24660192","dp":16729,"de":0}},{"type":"Polygon","arcs":[[4663,-4663,-1397,4664,-1399,4665]],"properties":{"id":"24660193","dp":13200,"de":0}},{"type":"Polygon","arcs":[[-211,-3313,-3304,-3297,4666,-3463]],"properties":{"id":"24660659","dp":11496,"de":852}},{"type":"Polygon","arcs":[[-4667,-3303,4667,-3001,-3464]],"properties":{"id":"24660660","dp":12273,"de":1986}},{"type":"Polygon","arcs":[[4668,-2998,-4668,4669]],"properties":{"id":"24660661","dp":28965,"de":2681}},{"type":"Polygon","arcs":[[4670,-2994,-2997,-4669]],"properties":{"id":"24660662","dp":8566,"de":0}},{"type":"Polygon","arcs":[[4671,-4671,-4670,-3302]],"properties":{"id":"24660663","dp":30346,"de":2475}},{"type":"Polygon","arcs":[[-3301,-4584,4672,-2992,-4672]],"properties":{"id":"24660664","dp":30088,"de":0}},{"type":"Polygon","arcs":[[-4673,-4582,-4579,4673]],"properties":{"id":"24660665","dp":26808,"de":0}},{"type":"Polygon","arcs":[[4674,-2954,-2993,-4674]],"properties":{"id":"24660666","dp":34933,"de":2202}},{"type":"Polygon","arcs":[[-4578,-2916,-2951,-4675]],"properties":{"id":"24660667","dp":23824,"de":2534}},{"type":"Polygon","arcs":[[4675,4676,4677,4678]],"properties":{"id":"24663101","dp":2883,"de":305}},{"type":"Polygon","arcs":[[-3449,4679,-3447,4680,4681,4682,4683,4684,4685]],"properties":{"id":"24662988","dp":1403,"de":926}},{"type":"Polygon","arcs":[[4686,4687,4688,4689,4690,4691]],"properties":{"id":"24661358","dp":14773,"de":10933}},{"type":"Polygon","arcs":[[4692,4693,4694,4695,4696,4697,4698]],"properties":{"id":"24662589","dp":2389,"de":1641}},{"type":"Polygon","arcs":[[4699,-4698,4700,4701,4702]],"properties":{"id":"24662590","dp":7384,"de":736}},{"type":"Polygon","arcs":[[4703,4704,4705,-4699,-4700]],"properties":{"id":"24662591","dp":4921,"de":0}},{"type":"Polygon","arcs":[[4706,-4704,-4703,4707,4708]],"properties":{"id":"24662592","dp":7996,"de":0}},{"type":"Polygon","arcs":[[4709,-4692,4710,4711,4712,4713]],"properties":{"id":"24661359","dp":22229,"de":8188}},{"type":"Polygon","arcs":[[4714,-4712,4715,4716]],"properties":{"id":"24661360","dp":20497,"de":3167}},{"type":"Polygon","arcs":[[-4711,-4691,4717,-4716]],"properties":{"id":"24661361","dp":16989,"de":5510}},{"type":"Polygon","arcs":[[-4717,-4718,-4690,4718,4719,4720,4721]],"properties":{"id":"24661362","dp":6549,"de":2243}},{"type":"Polygon","arcs":[[4722,4723,-4719,4724]],"properties":{"id":"24661363","dp":10041,"de":5463}},{"type":"Polygon","arcs":[[4725,-4715,-4722,4726,4727,4728,4729,4730]],"properties":{"id":"24661364","dp":5086,"de":5761}},{"type":"Polygon","arcs":[[4731,4732,-4731]],"properties":{"id":"24661365","dp":28461,"de":0}},{"type":"Polygon","arcs":[[-4730,4733,4734,-4732]],"properties":{"id":"24661366","dp":31026,"de":2901}},{"type":"Polygon","arcs":[[4735,4736,-4734,-4729,4737,4738,4739]],"properties":{"id":"24661367","dp":18933,"de":3523}},{"type":"Polygon","arcs":[[-4740,4740,4741,4742]],"properties":{"id":"24661368","dp":19522,"de":4020}},{"type":"Polygon","arcs":[[4743,-4742,4744,4745]],"properties":{"id":"24661369","dp":17923,"de":4824}},{"type":"Polygon","arcs":[[4746,4747,-4746]],"properties":{"id":"24661370","dp":19392,"de":4153}},{"type":"Polygon","arcs":[[4748,-4747,-4745,-4741,-4739,4749,4750,4751,4752]],"properties":{"id":"24661371","dp":5503,"de":3788}},{"type":"Polygon","arcs":[[4753,-4749,4754,4755]],"properties":{"id":"24661372","dp":16048,"de":3024}},{"type":"Polygon","arcs":[[-4753,4756,4757,-4755]],"properties":{"id":"24661373","dp":16679,"de":1778}},{"type":"Polygon","arcs":[[-4752,4758,4759,-4757]],"properties":{"id":"24661374","dp":11866,"de":6888}},{"type":"Polygon","arcs":[[4760,4761,-4759,-4751,4762,4763,4764,4765]],"properties":{"id":"24661375","dp":4338,"de":21860}},{"type":"Polygon","arcs":[[4766,-4762,4767,4768]],"properties":{"id":"24661376","dp":11936,"de":55212}},{"type":"Polygon","arcs":[[-4760,-4767,4769,4770,4771]],"properties":{"id":"24661377","dp":13010,"de":13210}},{"type":"Polygon","arcs":[[-4758,-4772,4772,4773]],"properties":{"id":"24661378","dp":16306,"de":2552}},{"type":"Polygon","arcs":[[4774,-4756,-4774,4775]],"properties":{"id":"24661379","dp":15426,"de":3963}},{"type":"Polygon","arcs":[[4776,4777,4778,-4775,4779]],"properties":{"id":"24661380","dp":14057,"de":4472}},{"type":"Polygon","arcs":[[4780,4781,-4778,4782]],"properties":{"id":"24661381","dp":23529,"de":3287}},{"type":"Polygon","arcs":[[4783,-4781,4784,4785]],"properties":{"id":"24661382","dp":18792,"de":12640}},{"type":"Polygon","arcs":[[-1212,-3704,-3706,4786,4787,4788,4789,4790,4791]],"properties":{"id":"24661858","dp":4735,"de":20919}},{"type":"Polygon","arcs":[[4792,-4791,4793,4794,4795,4796,4797,4798]],"properties":{"id":"24661859","dp":8760,"de":65700}},{"type":"Polygon","arcs":[[4799,4800,-4795]],"properties":{"id":"24661860","dp":41379,"de":12068}},{"type":"Polygon","arcs":[[-3674,-4798,4801,4802,4803,-3679]],"properties":{"id":"24661861","dp":13040,"de":9684}},{"type":"Polygon","arcs":[[4804,4805,4806,-4803]],"properties":{"id":"24661862","dp":17269,"de":3212}},{"type":"Polygon","arcs":[[-4807,4807,4808,4809,4810]],"properties":{"id":"24661863","dp":17048,"de":2108}},{"type":"Polygon","arcs":[[-4804,-4811,4811,4812]],"properties":{"id":"24661864","dp":15515,"de":8520}},{"type":"Polygon","arcs":[[4813,-4812,-4810,4814,4815,4816,4817]],"properties":{"id":"24661865","dp":7883,"de":25525}},{"type":"Polygon","arcs":[[-3680,-4813,-4814,4818,-3676]],"properties":{"id":"24661866","dp":10557,"de":5268}},{"type":"Polygon","arcs":[[4819,4820,-4705,-4707,4821]],"properties":{"id":"24662593","dp":6048,"de":0}},{"type":"Polygon","arcs":[[4822,4823,4824,-4822]],"properties":{"id":"24662594","dp":6442,"de":0}},{"type":"Polygon","arcs":[[-4823,-4709,4825,-3397]],"properties":{"id":"24662595","dp":7840,"de":4466}},{"type":"Polygon","arcs":[[-3399,4826,4827]],"properties":{"id":"24662598","dp":8152,"de":0}},{"type":"Polygon","arcs":[[4828,4829,-3395,-4828,4830,4831]],"properties":{"id":"24662599","dp":9471,"de":0}},{"type":"Polygon","arcs":[[4832,-4829,4833]],"properties":{"id":"24662600","dp":12691,"de":0}},{"type":"Polygon","arcs":[[4834,-3794,4835,4836,4837,-4834,-4832,4838]],"properties":{"id":"24662601","dp":2907,"de":6314}},{"type":"Polygon","arcs":[[4839,-4824,-3396,-4830,-4833,-4838]],"properties":{"id":"24662602","dp":4897,"de":0}},{"type":"Polygon","arcs":[[4840,4841,-4840,-4837]],"properties":{"id":"24662603","dp":4293,"de":3968}},{"type":"Polygon","arcs":[[-4836,4842,4843,4844,4845,4846,4847,-4841]],"properties":{"id":"24662604","dp":4586,"de":0}},{"type":"Polygon","arcs":[[-4165,4848,-4843,-3793,-4162]],"properties":{"id":"24662605","dp":13399,"de":2272}},{"type":"Polygon","arcs":[[4849,-4844,-4849,-4164]],"properties":{"id":"24662606","dp":17614,"de":0}},{"type":"Polygon","arcs":[[4850,4851,4852,-4850,-4168]],"properties":{"id":"24662607","dp":10490,"de":5313}},{"type":"Polygon","arcs":[[4853,4854,-4851,-4171]],"properties":{"id":"24662608","dp":13543,"de":6526}},{"type":"Polygon","arcs":[[-4854,-4175,4855]],"properties":{"id":"24662609","dp":14225,"de":0}},{"type":"Polygon","arcs":[[-4210,-4213,-510,-4852,-4855,-4856,-4174,-4178]],"properties":{"id":"24662610","dp":9243,"de":6914}},{"type":"Polygon","arcs":[[-521,4856,-4845,-4853,-518]],"properties":{"id":"24662611","dp":10550,"de":13188}},{"type":"Polygon","arcs":[[-4857,4857,-4846]],"properties":{"id":"24662612","dp":11108,"de":10277}},{"type":"Polygon","arcs":[[-520,-526,4858,-4847,-4858]],"properties":{"id":"24662613","dp":9747,"de":2135}},{"type":"Polygon","arcs":[[4859,4860,4861,4862,4863,4864]],"properties":{"id":"24663010","dp":2137,"de":1450}},{"type":"Polygon","arcs":[[-4862,4865]],"properties":{"id":"24663011","dp":4900,"de":330}},{"type":"Polygon","arcs":[[4866,-4713,-4726,-4733,4867,4868]],"properties":{"id":"24661394","dp":27470,"de":7312}},{"type":"Polygon","arcs":[[4869,-4687,-4710,4870,4871]],"properties":{"id":"24661395","dp":8754,"de":3679}},{"type":"Polygon","arcs":[[4872,4873,-4870,4874]],"properties":{"id":"24661396","dp":9097,"de":1299}},{"type":"Polygon","arcs":[[-4873,4875,4876,4877,4878,4879]],"properties":{"id":"24661397","dp":3270,"de":1639}},{"type":"Polygon","arcs":[[4880,4881,4882,-4880]],"properties":{"id":"24661398","dp":8016,"de":901}},{"type":"Polygon","arcs":[[4883,4884]],"properties":{"id":"24662616","dp":9001,"de":0}},{"type":"Polygon","arcs":[[-4885,4885,4886,-4820,4887]],"properties":{"id":"24662617","dp":10181,"de":726}},{"type":"Polygon","arcs":[[-4887,-4693,-4706,-4821]],"properties":{"id":"24662618","dp":4851,"de":652}},{"type":"Polygon","arcs":[[4888,4889,4890,4891,4892,-3795,-4835,4893]],"properties":{"id":"24662619","dp":5920,"de":3944}},{"type":"Polygon","arcs":[[4894,-4890]],"properties":{"id":"24662620","dp":19502,"de":0}},{"type":"Polygon","arcs":[[4895,-4891,-4895,4896,-4110,-4114]],"properties":{"id":"24662621","dp":10958,"de":798}},{"type":"Polygon","arcs":[[-4897,-4889,4897,4898,-4107]],"properties":{"id":"24662622","dp":17121,"de":2424}},{"type":"Polygon","arcs":[[-4898,4899,4900,4901]],"properties":{"id":"24662623","dp":13792,"de":1458}},{"type":"Polygon","arcs":[[-4899,-4902,-4266,-4273,-4103]],"properties":{"id":"24662624","dp":13073,"de":2015}},{"type":"Polygon","arcs":[[-4901,4902,-4267]],"properties":{"id":"24662625","dp":16887,"de":0}},{"type":"Polygon","arcs":[[-4265,-4903,4903,4904,-4254,-4261]],"properties":{"id":"24662626","dp":11488,"de":0}},{"type":"Polygon","arcs":[[-4894,4905,-4904,-4900]],"properties":{"id":"24662627","dp":11148,"de":2153}},{"type":"Polygon","arcs":[[-1894,-4249,-4255,-4905,-4906,-4839,-4831,-4827,-3398,4906,4907,-1858,-1862,-1864,-1889]],"properties":{"id":"24662628","dp":472,"de":1388}},{"type":"Polygon","arcs":[[4908,4909,-4907,-4826,-4708,-4702,4910]],"properties":{"id":"24662629","dp":1060,"de":115}},{"type":"Polygon","arcs":[[-4910,4911,4912,4913,-4908]],"properties":{"id":"24662630","dp":11777,"de":1204}},{"type":"Polygon","arcs":[[-4914,4914,4915,4916,-1859]],"properties":{"id":"24662631","dp":15867,"de":1589}},{"type":"Polygon","arcs":[[-4917,4917,-1845,-1856]],"properties":{"id":"24662632","dp":15483,"de":2995}},{"type":"Polygon","arcs":[[4918,4919,-1846,-4918]],"properties":{"id":"24662633","dp":17894,"de":1372}},{"type":"Polygon","arcs":[[-4919,-4916,4920,4921]],"properties":{"id":"24662634","dp":20934,"de":0}},{"type":"Polygon","arcs":[[4922,4923,-4921,-4915,-4913]],"properties":{"id":"24662635","dp":11686,"de":2710}},{"type":"Polygon","arcs":[[4924,-4923,-4912,4925]],"properties":{"id":"24662636","dp":24550,"de":0}},{"type":"Polygon","arcs":[[4926,-4926,-4909]],"properties":{"id":"24662637","dp":23988,"de":0}},{"type":"Polygon","arcs":[[4927,4928,4929,4930,4931]],"properties":{"id":"24662638","dp":10316,"de":1399}},{"type":"Polygon","arcs":[[4932,4933,4934,-4929,4935]],"properties":{"id":"24662639","dp":9787,"de":1415}},{"type":"Polygon","arcs":[[4936,-4933,4937]],"properties":{"id":"24662640","dp":12450,"de":1214}},{"type":"Polygon","arcs":[[4938,4939,-4934,-4937]],"properties":{"id":"24662641","dp":9096,"de":0}},{"type":"Polygon","arcs":[[4940,4941,4942,4943,4944,4945,4946,4947]],"properties":{"id":"24663030","dp":2966,"de":382}},{"type":"Polygon","arcs":[[4948,4949,-4946,4950,4951,4952]],"properties":{"id":"24663031","dp":3616,"de":0}},{"type":"Polygon","arcs":[[4953,-3083,-3162,4954]],"properties":{"id":"24663075","dp":674,"de":79}},{"type":"Polygon","arcs":[[-3103,-2982,4955,-3160]],"properties":{"id":"24663076","dp":1076,"de":101}},{"type":"MultiPolygon","arcs":[[[4956,4957,4958,4959,4960,4961,4962]],[[4963,4964,4965,4966]]],"properties":{"id":"24663077","dp":282,"de":62}},{"type":"Polygon","arcs":[[4967,4968,4969]],"properties":{"id":"24663079","dp":7864,"de":0}},{"type":"Polygon","arcs":[[4970,4971,-4970,4972,4973,4974]],"properties":{"id":"24663080","dp":5606,"de":0}},{"type":"Polygon","arcs":[[4975,-4975,4976]],"properties":{"id":"24663081","dp":5152,"de":0}},{"type":"Polygon","arcs":[[4977,-4977,-4974,4978,4979,4980]],"properties":{"id":"24663082","dp":4933,"de":0}},{"type":"Polygon","arcs":[[4981,4982,4983,-4881,-4879,4984,4985,4986]],"properties":{"id":"24661399","dp":2976,"de":541}},{"type":"Polygon","arcs":[[4987,4988,4989,4990,-4984]],"properties":{"id":"24661400","dp":3899,"de":708}},{"type":"Polygon","arcs":[[-1343,-1346,4991,-4982,4992,-1339]],"properties":{"id":"24661401","dp":5107,"de":3163}},{"type":"Polygon","arcs":[[4993,-233,4994,-4988,-4983,-4992]],"properties":{"id":"24661402","dp":12976,"de":5402}},{"type":"Polygon","arcs":[[-4994,-1347,-3461,-234]],"properties":{"id":"24661405","dp":31666,"de":1570}},{"type":"Polygon","arcs":[[-1333,-1340,-4993,-4987,4995,4996,4997]],"properties":{"id":"24661407","dp":9731,"de":1788}},{"type":"Polygon","arcs":[[-4986,4998,-4996]],"properties":{"id":"24661408","dp":22746,"de":2331}},{"type":"Polygon","arcs":[[-1329,4999,-4997,-4999,-4985,-4878,5000,5001]],"properties":{"id":"24661409","dp":2728,"de":4005}},{"type":"Polygon","arcs":[[-4998,-5000,-1328]],"properties":{"id":"24661410","dp":24615,"de":5384}},{"type":"Polygon","arcs":[[5002,-5001,-4877,5003,5004]],"properties":{"id":"24661411","dp":3817,"de":566}},{"type":"Polygon","arcs":[[5005,-1330,-5002,-5003,5006,5007]],"properties":{"id":"24661412","dp":254,"de":260}},{"type":"Polygon","arcs":[[-5007,-5005,5008,5009,5010,5011,5012,5013]],"properties":{"id":"24661413","dp":3642,"de":721}},{"type":"Polygon","arcs":[[5014,-5011,5015,5016]],"properties":{"id":"24661414","dp":21659,"de":3526}},{"type":"Polygon","arcs":[[-5012,-5015,5017,5018,5019]],"properties":{"id":"24661415","dp":16468,"de":1984}},{"type":"Polygon","arcs":[[-5019,5020,5021,5022,5023,5024]],"properties":{"id":"24661416","dp":16285,"de":3650}},{"type":"Polygon","arcs":[[5025,5026,5027,-3173]],"properties":{"id":"24661893","dp":17329,"de":3125}},{"type":"Polygon","arcs":[[-5026,5028,5029,5030,5031,5032,5033]],"properties":{"id":"24661894","dp":5661,"de":8260}},{"type":"Polygon","arcs":[[-3172,5034,5035,5036,5037,-5029]],"properties":{"id":"24661895","dp":16720,"de":5600}},{"type":"Polygon","arcs":[[5038,-5035,-3171]],"properties":{"id":"24661896","dp":20169,"de":0}},{"type":"Polygon","arcs":[[-3170,5039,5040,-5036,-5039]],"properties":{"id":"24661897","dp":16994,"de":1554}},{"type":"Polygon","arcs":[[5041,5042,-5040,-3169]],"properties":{"id":"24661898","dp":14101,"de":6568}},{"type":"Polygon","arcs":[[5043,5044,-5042,-3168]],"properties":{"id":"24661899","dp":23580,"de":5626}},{"type":"Polygon","arcs":[[5045,5046,5047,5048,-5045]],"properties":{"id":"24661900","dp":15261,"de":8126}},{"type":"Polygon","arcs":[[-5049,5049,5050,-5043]],"properties":{"id":"24661901","dp":13506,"de":6944}},{"type":"Polygon","arcs":[[5051,5052,5053,5054,5055]],"properties":{"id":"24663084","dp":3793,"de":0}},{"type":"Polygon","arcs":[[-5054,5056,-4963,5057,-4965,5058]],"properties":{"id":"24663085","dp":3675,"de":0}},{"type":"Polygon","arcs":[[5059,-4980,5060,5061,5062,-4957,-5057]],"properties":{"id":"24663086","dp":5384,"de":0}},{"type":"Polygon","arcs":[[5063,5064,5065,5066]],"properties":{"id":"24661426","dp":21391,"de":2173}},{"type":"Polygon","arcs":[[5067,5068,5069,5070,-5065]],"properties":{"id":"24661427","dp":12930,"de":8255}},{"type":"Polygon","arcs":[[5071,5072,-5070,5073]],"properties":{"id":"24661428","dp":16936,"de":8274}},{"type":"Polygon","arcs":[[5074,-4773,-4771,5075,-5073]],"properties":{"id":"24661429","dp":10381,"de":14088}},{"type":"Polygon","arcs":[[5076,5077,-4780,-4776,-5075]],"properties":{"id":"24661430","dp":12173,"de":6956}},{"type":"Polygon","arcs":[[5078,5079,-5022,5080,-4785,-4783,-4777,-5078]],"properties":{"id":"24661431","dp":11167,"de":10583}},{"type":"Polygon","arcs":[[5081,5082,-5079,-5077,-5072,5083]],"properties":{"id":"24661432","dp":17155,"de":2245}},{"type":"Polygon","arcs":[[-5076,-4770,-4769,5084,5085,-5071]],"properties":{"id":"24661433","dp":10080,"de":7329}},{"type":"Polygon","arcs":[[-5085,-4768,-4761,5086,5087,5088]],"properties":{"id":"24661434","dp":12990,"de":11934}},{"type":"Polygon","arcs":[[-5086,-5089,5089,5090,5091,-5066]],"properties":{"id":"24661435","dp":14108,"de":11512}},{"type":"Polygon","arcs":[[-5088,5092,5093,-5090]],"properties":{"id":"24661436","dp":20194,"de":3721}},{"type":"Polygon","arcs":[[-5094,5094,5095,5096]],"properties":{"id":"24661437","dp":16964,"de":8333}},{"type":"Polygon","arcs":[[-5091,-5097,5097,5098,5099]],"properties":{"id":"24661438","dp":15305,"de":6845}},{"type":"Polygon","arcs":[[5100,-5098,5101,5102,5103]],"properties":{"id":"24661439","dp":14174,"de":7119}},{"type":"Polygon","arcs":[[-5096,5104,-5102]],"properties":{"id":"24661440","dp":17272,"de":3409}},{"type":"Polygon","arcs":[[5105,-5103,-5105,5106,5107,5108,5109]],"properties":{"id":"24661441","dp":8472,"de":1280}},{"type":"Polygon","arcs":[[5110,-4765,5111,-5107,-5095]],"properties":{"id":"24661442","dp":9494,"de":2853}},{"type":"Polygon","arcs":[[-5087,-4766,-5111,-5093]],"properties":{"id":"24661443","dp":19421,"de":2210}},{"type":"Polygon","arcs":[[5112,5113,-5112,5114,5115,5116,5117]],"properties":{"id":"24661444","dp":15638,"de":2543}},{"type":"Polygon","arcs":[[-5113,5118,5119]],"properties":{"id":"24661445","dp":13980,"de":3618}},{"type":"Polygon","arcs":[[-5118,5120,5121,-5119]],"properties":{"id":"24661446","dp":14249,"de":2544}},{"type":"Polygon","arcs":[[-5122,5122,5123,5124,5125]],"properties":{"id":"24661447","dp":14377,"de":3228}},{"type":"Polygon","arcs":[[5126,-1257,5127,5128,-3671]],"properties":{"id":"24661925","dp":10527,"de":8822}},{"type":"Polygon","arcs":[[5129,5130,5131,-3672,-5129]],"properties":{"id":"24661926","dp":8836,"de":5325}},{"type":"Polygon","arcs":[[-1263,5132,-5130,-5128]],"properties":{"id":"24661927","dp":9599,"de":8166}},{"type":"Polygon","arcs":[[-5131,-5133,-1266,-4792,-4793,5133]],"properties":{"id":"24661928","dp":7821,"de":17913}},{"type":"Polygon","arcs":[[-5134,-4799,-3673,-5132]],"properties":{"id":"24661929","dp":15569,"de":24683}},{"type":"Polygon","arcs":[[5134,-3695,-3702,5135]],"properties":{"id":"24661936","dp":14148,"de":8703}},{"type":"Polygon","arcs":[[-3718,-3710,5136,-5136,-3701,-1211]],"properties":{"id":"24661937","dp":11421,"de":7106}},{"type":"Polygon","arcs":[[5137,5138,5139,5140,5141,5142]],"properties":{"id":"24663123","dp":3014,"de":274}},{"type":"Polygon","arcs":[[-5143,5143,5144,5145]],"properties":{"id":"24663124","dp":426,"de":1169}},{"type":"Polygon","arcs":[[5146,5147,-5144,-5142,5148,-4961]],"properties":{"id":"24663125","dp":72,"de":62}},{"type":"Polygon","arcs":[[5149,5150]],"properties":{"id":"24663126","dp":3847,"de":308}},{"type":"Polygon","arcs":[[-5150,5151]],"properties":{"id":"24663127","dp":3074,"de":0}},{"type":"Polygon","arcs":[[-4680,-3448]],"properties":{"id":"24662989","dp":4683,"de":496}},{"type":"Polygon","arcs":[[5152,5153,5154,-3443]],"properties":{"id":"24662992","dp":8168,"de":0}},{"type":"Polygon","arcs":[[5155,-4681,-3446,5156]],"properties":{"id":"24662993","dp":7857,"de":2639}},{"type":"Polygon","arcs":[[-3445,5157,5158,5159,5160,5161,5162,-5157]],"properties":{"id":"24662994","dp":3402,"de":728}},{"type":"Polygon","arcs":[[5163,5164,5165,5166,5167]],"properties":{"id":"24663088","dp":3617,"de":225}},{"type":"Polygon","arcs":[[-5166,5168]],"properties":{"id":"24663089","dp":4119,"de":0}},{"type":"Polygon","arcs":[[5169,5170,5171,5172,5173,5174]],"properties":{"id":"24663090","dp":2782,"de":211}},{"type":"Polygon","arcs":[[-5175,5175,5176]],"properties":{"id":"24663091","dp":2875,"de":0}},{"type":"Polygon","arcs":[[-5170,-5177,5177]],"properties":{"id":"24663092","dp":3252,"de":0}},{"type":"Polygon","arcs":[[5178,5179]],"properties":{"id":"24663094","dp":3788,"de":0}},{"type":"Polygon","arcs":[[5180,5181,-5180,5182,5183,5184,5185]],"properties":{"id":"24663095","dp":2894,"de":362}},{"type":"Polygon","arcs":[[5186,5187,5188,5189,5190,5191,5192]],"properties":{"id":"24663096","dp":1854,"de":332}},{"type":"Polygon","arcs":[[5193,5194,5195,-5193,5196,5197]],"properties":{"id":"24663097","dp":2731,"de":255}},{"type":"Polygon","arcs":[[5198,-5187,-5196]],"properties":{"id":"24663098","dp":2882,"de":0}},{"type":"Polygon","arcs":[[-5195,5199,5200,5201,5202,5203,-5188,-5199]],"properties":{"id":"24663099","dp":804,"de":140}},{"type":"Polygon","arcs":[[5204,-5200,-5194,5205,-4677]],"properties":{"id":"24663100","dp":3489,"de":0}},{"type":"Polygon","arcs":[[5206,5207,5208,5209,5210,5211]],"properties":{"id":"24663369","dp":10290,"de":38854}},{"type":"Polygon","arcs":[[-4678,-5206,-5198,5212,5213,5214]],"properties":{"id":"24663102","dp":2151,"de":413}},{"type":"Polygon","arcs":[[5215,5216,5217,5218,5219,5220,5221]],"properties":{"id":"24663103","dp":1368,"de":279}},{"type":"Polygon","arcs":[[5222,-5220,5223]],"properties":{"id":"24663104","dp":2245,"de":0}},{"type":"Polygon","arcs":[[5224,-5221,-5223,5225]],"properties":{"id":"24663105","dp":2219,"de":179}},{"type":"MultiPolygon","arcs":[[[5226,-5225,5227,5228,5229,5230]],[[5231,5232,5233,5234,5235,5236,5237]]],"properties":{"id":"24663106","dp":1239,"de":485}},{"type":"Polygon","arcs":[[5238,5239,5240,5241,-5222,-5227,5242]],"properties":{"id":"24663107","dp":1383,"de":479}},{"type":"Polygon","arcs":[[5243,5244,-5216,-5242]],"properties":{"id":"24663108","dp":1929,"de":0}},{"type":"Polygon","arcs":[[-5244,-5241,5245,5246,5247]],"properties":{"id":"24663109","dp":1943,"de":163}},{"type":"Polygon","arcs":[[-5245,-5248,5248,-5202,-5217]],"properties":{"id":"24663110","dp":1462,"de":139}},{"type":"Polygon","arcs":[[-5247,5249,5250,5251,5252,5253,5254,-5203,-5249]],"properties":{"id":"24663111","dp":206,"de":1307}},{"type":"Polygon","arcs":[[5255,5256,5257,-5251]],"properties":{"id":"24663112","dp":1319,"de":168}},{"type":"Polygon","arcs":[[5258,-3498,5259]],"properties":{"id":"24663139","dp":8410,"de":0}},{"type":"Polygon","arcs":[[-5156,-5163,5260,-4682]],"properties":{"id":"24662995","dp":2103,"de":574}},{"type":"Polygon","arcs":[[5261,5262,5263,-5261]],"properties":{"id":"24662996","dp":2752,"de":0}},{"type":"Polygon","arcs":[[5264,-5262,-5162,5265,5266]],"properties":{"id":"24662997","dp":11611,"de":828}},{"type":"Polygon","arcs":[[-5266,-5161,5267,5268,5269,5270,5271,5272]],"properties":{"id":"24662998","dp":262,"de":0}},{"type":"Polygon","arcs":[[-5269,5273,5274]],"properties":{"id":"24662999","dp":6982,"de":0}},{"type":"Polygon","arcs":[[5275,5276,5277,5278,-5271]],"properties":{"id":"24663000","dp":3577,"de":0}},{"type":"Polygon","arcs":[[5279,5280,5281,5282,-5277]],"properties":{"id":"24663001","dp":2883,"de":0}},{"type":"Polygon","arcs":[[5283,5284,5285,5286,5287,-5272,-5279]],"properties":{"id":"24663002","dp":3145,"de":589}},{"type":"Polygon","arcs":[[-5267,-5273,-5288,5288,5289,5290,5291,5292,-4865,5293]],"properties":{"id":"24663003","dp":2185,"de":331}},{"type":"Polygon","arcs":[[5294,5295,5296,-5291]],"properties":{"id":"24663004","dp":2748,"de":0}},{"type":"Polygon","arcs":[[5297,5298,5299,-5296]],"properties":{"id":"24663005","dp":2154,"de":436}},{"type":"Polygon","arcs":[[-5295,-5290,5300,5301,5302,-5298]],"properties":{"id":"24663006","dp":2700,"de":513}},{"type":"Polygon","arcs":[[-5299,-5303,5303,5304,5305]],"properties":{"id":"24663007","dp":2390,"de":442}},{"type":"Polygon","arcs":[[-5292,-5297,-5300,-5306,5306,5307]],"properties":{"id":"24663008","dp":2340,"de":0}},{"type":"Polygon","arcs":[[-5293,-5308,5308,5309,5310,-4860]],"properties":{"id":"24663009","dp":3982,"de":369}},{"type":"Polygon","arcs":[[5311,5312,5313,5314,5315,5316,-3478,5317]],"properties":{"id":"24661728","dp":2231,"de":181}},{"type":"Polygon","arcs":[[-5316,5318,-360,5319]],"properties":{"id":"24661729","dp":8286,"de":7159}},{"type":"Polygon","arcs":[[-4819,-4818,5320,5321,-3677]],"properties":{"id":"24661867","dp":7988,"de":18450}},{"type":"Polygon","arcs":[[-5321,-4817,5322,5323]],"properties":{"id":"24661868","dp":21743,"de":4816}},{"type":"Polygon","arcs":[[-5323,-4816,5324,5325,5326,5327]],"properties":{"id":"24661869","dp":6918,"de":5238}},{"type":"Polygon","arcs":[[5328,5329,-3678,-5322,-5324,-5328,5330]],"properties":{"id":"24661870","dp":4383,"de":5790}},{"type":"Polygon","arcs":[[5331,-5237,5332,5333,5334,5335,5336]],"properties":{"id":"24663128","dp":1312,"de":1785}},{"type":"Polygon","arcs":[[5337,5338,5339,5340,-5333]],"properties":{"id":"24663129","dp":1128,"de":536}},{"type":"Polygon","arcs":[[-5341,5341,5342,-5334]],"properties":{"id":"24663130","dp":2422,"de":866}},{"type":"Polygon","arcs":[[5343,-5342,-5340,5344,5345]],"properties":{"id":"24663131","dp":3284,"de":945}},{"type":"Polygon","arcs":[[-5343,-5344,5346,5347,5348,-5335]],"properties":{"id":"24663132","dp":1831,"de":453}},{"type":"Polygon","arcs":[[-5347,-5346,5349]],"properties":{"id":"24663133","dp":2086,"de":0}},{"type":"Polygon","arcs":[[-5348,-5350,-5345,-5339,5350,5351,5352,-3067,5353,5354,5355]],"properties":{"id":"24663134","dp":1348,"de":312}},{"type":"Polygon","arcs":[[-5355,5356,5357]],"properties":{"id":"24663135","dp":1995,"de":0}},{"type":"Polygon","arcs":[[5358,5359,-5337,5360,-5358,5361,5362]],"properties":{"id":"24663136","dp":1330,"de":200}},{"type":"Polygon","arcs":[[-5349,-5356,-5361,-5336]],"properties":{"id":"24663137","dp":2671,"de":273}},{"type":"Polygon","arcs":[[-5259,5363,5364,5365,5366,5367,5368,-3499]],"properties":{"id":"24663138","dp":7577,"de":924}},{"type":"Polygon","arcs":[[-4683,-5264,5369,5370,5371]],"properties":{"id":"24663140","dp":2380,"de":0}},{"type":"Polygon","arcs":[[-5263,-5265,-5294,-4864,-5370]],"properties":{"id":"24663141","dp":3953,"de":467}},{"type":"Polygon","arcs":[[5372,-2031,5373]],"properties":{"id":"24663142","dp":25457,"de":0}},{"type":"Polygon","arcs":[[5374,-5374,-2030,5375,5376,5377,-1797]],"properties":{"id":"24663143","dp":4089,"de":1331}},{"type":"Polygon","arcs":[[-5375,-1796,-1806,-1819,-2032,-5373]],"properties":{"id":"24663144","dp":4815,"de":1012}},{"type":"Polygon","arcs":[[-5377,5378,5379,5380,5381]],"properties":{"id":"24663145","dp":7448,"de":576}},{"type":"Polygon","arcs":[[-5380,5382,5383,5384]],"properties":{"id":"24663146","dp":6888,"de":576}},{"type":"Polygon","arcs":[[-5381,-5385,5385,5386]],"properties":{"id":"24663147","dp":8625,"de":2031}},{"type":"Polygon","arcs":[[5387,5388,-5383]],"properties":{"id":"24663149","dp":5396,"de":1353}},{"type":"Polygon","arcs":[[-5376,-2029,5389,5390,-5388,-5379]],"properties":{"id":"24663150","dp":5796,"de":0}},{"type":"Polygon","arcs":[[5391,5392,5393,5394,5395,5396,5397,-3437,5398,-3441,5399,5400,5401,5402]],"properties":{"id":"24663151","dp":284,"de":2721}},{"type":"Polygon","arcs":[[5403,5404,5405,5406,5407,5408,5409,-5401]],"properties":{"id":"24663152","dp":718,"de":2931}},{"type":"Polygon","arcs":[[-5409,5410,5411,5412]],"properties":{"id":"24663153","dp":1498,"de":3607}},{"type":"Polygon","arcs":[[5413,5414,-5405,5415]],"properties":{"id":"24663154","dp":2620,"de":0}},{"type":"Polygon","arcs":[[5416,5417,5418,-5406,-5415]],"properties":{"id":"24663155","dp":3962,"de":0}},{"type":"Polygon","arcs":[[5419,5420,5421,5422,5423,-5418]],"properties":{"id":"24663156","dp":4107,"de":274}},{"type":"Polygon","arcs":[[-5417,5424,5425,5426,-5420]],"properties":{"id":"24663157","dp":4373,"de":0}},{"type":"Polygon","arcs":[[5427,-5425,-5414,5428]],"properties":{"id":"24663158","dp":2091,"de":0}},{"type":"Polygon","arcs":[[-5400,5429,5430,-5429,-5416,-5404]],"properties":{"id":"24663159","dp":2908,"de":392}},{"type":"Polygon","arcs":[[-5430,-3440,5431,5432,5433],[5434,5435]],"properties":{"id":"24663160","dp":1418,"de":512}},{"type":"Polygon","arcs":[[5436,5437,5438,5439,-4943]],"properties":{"id":"24663032","dp":4308,"de":297}},{"type":"Polygon","arcs":[[5440,5441,5442,5443,5444]],"properties":{"id":"24663169","dp":5649,"de":654}},{"type":"Polygon","arcs":[[5445,-5442,5446,5447,5448,5449]],"properties":{"id":"24663170","dp":2125,"de":1054}},{"type":"Polygon","arcs":[[5450,-5444,5451]],"properties":{"id":"24663171","dp":15617,"de":8707}},{"type":"Polygon","arcs":[[-3439,5452,5453,5454,5455,5456,-5432]],"properties":{"id":"24663172","dp":1321,"de":715}},{"type":"Polygon","arcs":[[5457,5458,-5456]],"properties":{"id":"24663173","dp":2771,"de":200}},{"type":"Polygon","arcs":[[-5455,5459,5460,5461,5462,-5458]],"properties":{"id":"24663174","dp":1629,"de":1407}},{"type":"Polygon","arcs":[[5463,-3054,5464,5465,-5463]],"properties":{"id":"24663175","dp":2280,"de":724}},{"type":"Polygon","arcs":[[5466,5467,5468,5469,-5464,-5462]],"properties":{"id":"24663176","dp":2022,"de":1603}},{"type":"Polygon","arcs":[[5470,5471,5472,-5468,5473]],"properties":{"id":"24663177","dp":3514,"de":0}},{"type":"Polygon","arcs":[[5474,5475,-5474,-5467,-5461,5476,5477]],"properties":{"id":"24663178","dp":1104,"de":1497}},{"type":"Polygon","arcs":[[5478,5479,-5471,-5476]],"properties":{"id":"24663179","dp":3160,"de":0}},{"type":"Polygon","arcs":[[-5067,-5092,5480,5481]],"properties":{"id":"24661834","dp":19267,"de":5860}},{"type":"Polygon","arcs":[[5482,5483,5484,5485,5486,5487]],"properties":{"id":"24661835","dp":13910,"de":10337}},{"type":"Polygon","arcs":[[5488,-5488,5489,5490]],"properties":{"id":"24661836","dp":11541,"de":9589}},{"type":"Polygon","arcs":[[-5490,-5487,5491,5492,5493,5494]],"properties":{"id":"24661837","dp":10114,"de":10665}},{"type":"Polygon","arcs":[[5495,-5491,-5495,5496,5497]],"properties":{"id":"24661838","dp":14367,"de":7806}},{"type":"Polygon","arcs":[[-5497,-5494,5498,5499,5500]],"properties":{"id":"24661839","dp":14441,"de":6472}},{"type":"Polygon","arcs":[[-5500,5501,-5044,5502]],"properties":{"id":"24661840","dp":10863,"de":7142}},{"type":"Polygon","arcs":[[5503,-5503,-3167,5504]],"properties":{"id":"24661841","dp":15344,"de":5603}},{"type":"Polygon","arcs":[[5505,-5501,-5504,5506,5507]],"properties":{"id":"24661842","dp":18575,"de":3166}},{"type":"Polygon","arcs":[[-5331,-5327,5508,5509,5510]],"properties":{"id":"24661871","dp":6399,"de":9697}},{"type":"Polygon","arcs":[[-5510,5511,5512]],"properties":{"id":"24661872","dp":13771,"de":13840}},{"type":"Polygon","arcs":[[5513,5514,-5512]],"properties":{"id":"24661873","dp":15744,"de":1566}},{"type":"Polygon","arcs":[[-5515,5515,-412,-409,-398,5516]],"properties":{"id":"24661874","dp":11193,"de":5645}},{"type":"Polygon","arcs":[[5517,5518,5519,5520,5521,-407,-411,-416]],"properties":{"id":"24661877","dp":4971,"de":5242}},{"type":"Polygon","arcs":[[5522,5523,5524,5525,5526,-5518,-415]],"properties":{"id":"24661879","dp":7276,"de":7811}},{"type":"Polygon","arcs":[[5527,5528,-5523,5529]],"properties":{"id":"24661880","dp":14052,"de":2236}},{"type":"Polygon","arcs":[[5530,5531,5532,5533,-5524,-5529]],"properties":{"id":"24661881","dp":19101,"de":3651}},{"type":"Polygon","arcs":[[5534,5535,5536,-5531,-5528,5537]],"properties":{"id":"24661882","dp":14992,"de":2623}},{"type":"Polygon","arcs":[[5538,5539,-3175,-5535,5540]],"properties":{"id":"24661883","dp":5861,"de":38564}},{"type":"Polygon","arcs":[[5541,-5541,5542,5543]],"properties":{"id":"24661884","dp":12598,"de":8352}},{"type":"Polygon","arcs":[[5544,-5543,-5538,-5530,-414,5545,-5325]],"properties":{"id":"24661885","dp":6272,"de":887}},{"type":"Polygon","arcs":[[-5326,-5546,-417,-413,-5516,-5514,-5509]],"properties":{"id":"24661886","dp":5636,"de":22045}},{"type":"Polygon","arcs":[[-4809,5546,-5544,-5545,-4815]],"properties":{"id":"24661887","dp":14227,"de":1328}},{"type":"Polygon","arcs":[[-5536,-3174,-5028,5547]],"properties":{"id":"24661889","dp":45392,"de":10535}},{"type":"Polygon","arcs":[[-5548,5548,5549,-5537]],"properties":{"id":"24661890","dp":22307,"de":4142}},{"type":"Polygon","arcs":[[-5550,5550,5551,-5532]],"properties":{"id":"24661891","dp":19068,"de":3105}},{"type":"Polygon","arcs":[[-5549,-5027,-5034,5552,-5551]],"properties":{"id":"24661892","dp":20722,"de":2208}},{"type":"Polygon","arcs":[[5553,5554,5555,-5235]],"properties":{"id":"24662308","dp":1893,"de":261}},{"type":"Polygon","arcs":[[-5554,-5234,5556,5557,5558,5559]],"properties":{"id":"24662309","dp":1331,"de":1818}},{"type":"Polygon","arcs":[[-5233,5560,5561,-5557]],"properties":{"id":"24662310","dp":2185,"de":325}},{"type":"Polygon","arcs":[[5562,5563,5564,5565,5566,5567,-4290,5568,-583,-576,-4383,-4379,5569]],"properties":{"id":"24663351","dp":0,"de":5176}},{"type":"Polygon","arcs":[[-4491,5570,5571,-5567,5572]],"properties":{"id":"24663352","dp":17255,"de":1583}},{"type":"Polygon","arcs":[[-4490,5573,-5571]],"properties":{"id":"24663353","dp":38342,"de":4285}},{"type":"Polygon","arcs":[[-5371,-4863,-4866,-4861,-5311,5574,5575]],"properties":{"id":"24663012","dp":3553,"de":0}},{"type":"Polygon","arcs":[[-5310,5576,5577,-5575]],"properties":{"id":"24663013","dp":4801,"de":1237}},{"type":"Polygon","arcs":[[-5577,-5309,-5307,-5305,5578,5579,5580,5581,5582,5583]],"properties":{"id":"24663014","dp":2146,"de":461}},{"type":"Polygon","arcs":[[-5581,5584,5585,5586,5587]],"properties":{"id":"24663015","dp":6630,"de":867}},{"type":"Polygon","arcs":[[5588,5589,5590,-5586]],"properties":{"id":"24663016","dp":6259,"de":797}},{"type":"Polygon","arcs":[[5591,5592,5593,5594,-5587,-5591,5595]],"properties":{"id":"24663017","dp":4788,"de":1934}},{"type":"Polygon","arcs":[[5596,-5594,5597]],"properties":{"id":"24663018","dp":12425,"de":1063}},{"type":"Polygon","arcs":[[-5582,-5588,-5595,-5597,5598,5599,5600]],"properties":{"id":"24663019","dp":8546,"de":0}},{"type":"Polygon","arcs":[[-5583,-5601,5601,5602,5603,5604]],"properties":{"id":"24663020","dp":3414,"de":88}},{"type":"Polygon","arcs":[[5605,5606,5607,5608,5609,-5604,5610,5611]],"properties":{"id":"24663021","dp":1716,"de":0}},{"type":"Polygon","arcs":[[5612,5613,5614,5615,-5607]],"properties":{"id":"24663022","dp":2784,"de":0}},{"type":"Polygon","arcs":[[5616,5617,5618,5619,-5608,-5616,5620]],"properties":{"id":"24663023","dp":2460,"de":0}},{"type":"Polygon","arcs":[[5621,-5621,-5615,5622,5623]],"properties":{"id":"24663024","dp":3356,"de":0}},{"type":"Polygon","arcs":[[5624,5625,-5624,5626,5627,5628]],"properties":{"id":"24663025","dp":2667,"de":277}},{"type":"Polygon","arcs":[[5629,5630,5631,-5617,-5622,-5626,5632]],"properties":{"id":"24663026","dp":8355,"de":0}},{"type":"Polygon","arcs":[[5633,-5633,-5625,5634,5635,5636]],"properties":{"id":"24663027","dp":2987,"de":288}},{"type":"Polygon","arcs":[[5637,-4944,-5440,5638,-5630,-5634]],"properties":{"id":"24663028","dp":4176,"de":0}},{"type":"Polygon","arcs":[[-4945,-5638,-5637,5639,-4951]],"properties":{"id":"24663029","dp":3170,"de":0}},{"type":"Polygon","arcs":[[5640,5641,5642,5643]],"properties":{"id":"24661758","dp":16156,"de":2135}},{"type":"Polygon","arcs":[[-5644,5644,5645,5646]],"properties":{"id":"24661759","dp":16996,"de":0}},{"type":"Polygon","arcs":[[-5646,5647,5648,5649]],"properties":{"id":"24661760","dp":16938,"de":2857}},{"type":"Polygon","arcs":[[5650,5651,-5368,5652,-5437,-4942,5653]],"properties":{"id":"24663033","dp":3425,"de":276}},{"type":"Polygon","arcs":[[-5367,5654,5655,-5438,-5653]],"properties":{"id":"24663034","dp":4851,"de":2227}},{"type":"Polygon","arcs":[[5656,5657,-5655,5658]],"properties":{"id":"24663035","dp":2814,"de":1185}},{"type":"Polygon","arcs":[[5659,5660,5661,5662,5663,-5658,5664]],"properties":{"id":"24663036","dp":4236,"de":1253}},{"type":"Polygon","arcs":[[5665,5666,5667,-5660]],"properties":{"id":"24663037","dp":2719,"de":477}},{"type":"Polygon","arcs":[[5668,5669,5670,5671,-5661,-5668]],"properties":{"id":"24663038","dp":3770,"de":0}},{"type":"Polygon","arcs":[[5672,5673,5674,5675,-5669,-5667]],"properties":{"id":"24663039","dp":3710,"de":0}},{"type":"Polygon","arcs":[[5676,-5673,-5666,-5665,-5657]],"properties":{"id":"24663040","dp":2819,"de":336}},{"type":"Polygon","arcs":[[-5676,5677,5678,-5670]],"properties":{"id":"24663041","dp":2945,"de":0}},{"type":"Polygon","arcs":[[-5675,5679,5680,5681,5682,5683,5684,-5678]],"properties":{"id":"24663042","dp":3268,"de":0}},{"type":"Polygon","arcs":[[5685,5686,5687,5688,-5684]],"properties":{"id":"24663043","dp":2853,"de":340}},{"type":"Polygon","arcs":[[-5671,-5679,-5685,-5689,5689,5690]],"properties":{"id":"24663044","dp":3365,"de":635}},{"type":"Polygon","arcs":[[-5691,5691,5692,5693,5694,-5662,-5672]],"properties":{"id":"24663045","dp":3039,"de":3211}},{"type":"Polygon","arcs":[[5695,5696,5697,-5693,5698]],"properties":{"id":"24663046","dp":3451,"de":1261}},{"type":"Polygon","arcs":[[5699,5700,5701,5702]],"properties":{"id":"24661791","dp":18706,"de":2097}},{"type":"Polygon","arcs":[[5703,-5703,5704,-5520]],"properties":{"id":"24661792","dp":17711,"de":0}},{"type":"Polygon","arcs":[[-5519,-5527,5705,5706,-5700,-5704]],"properties":{"id":"24661793","dp":13902,"de":5226}},{"type":"Polygon","arcs":[[5707,5708,5709,-5706,-5526]],"properties":{"id":"24661794","dp":18778,"de":0}},{"type":"Polygon","arcs":[[-5534,5710,-5708,-5525]],"properties":{"id":"24661795","dp":17990,"de":7191}},{"type":"Polygon","arcs":[[5711,5712,5713,-5711]],"properties":{"id":"24661796","dp":15874,"de":3321}},{"type":"Polygon","arcs":[[-5552,-5553,5714,5715,-5712,-5533]],"properties":{"id":"24661797","dp":11063,"de":7183}},{"type":"Polygon","arcs":[[5716,-5507,-5505,-3166,5717]],"properties":{"id":"24661843","dp":21604,"de":2389}},{"type":"Polygon","arcs":[[-3690,-5508,-5717,5718,5719]],"properties":{"id":"24661844","dp":17615,"de":3145}},{"type":"Polygon","arcs":[[-5719,-5718,-3165,5720]],"properties":{"id":"24661845","dp":17066,"de":2666}},{"type":"Polygon","arcs":[[5721,-5721,-3164,5722]],"properties":{"id":"24661846","dp":15626,"de":2924}},{"type":"Polygon","arcs":[[5723,-4787,-3705,-3699,-3691,-5720,-5722]],"properties":{"id":"24661847","dp":13139,"de":6744}},{"type":"Polygon","arcs":[[-4788,-5724,-5723,-3163,5724]],"properties":{"id":"24661848","dp":31371,"de":18805}},{"type":"Polygon","arcs":[[-4789,-5725,5725,5726]],"properties":{"id":"24661849","dp":17768,"de":4347}},{"type":"Polygon","arcs":[[-5726,-3178,5727,5728]],"properties":{"id":"24661850","dp":20327,"de":4754}},{"type":"Polygon","arcs":[[-5728,-3177,5729,5730]],"properties":{"id":"24661851","dp":17157,"de":4987}},{"type":"Polygon","arcs":[[-5730,-3176,-5540,5731]],"properties":{"id":"24661852","dp":12081,"de":5338}},{"type":"Polygon","arcs":[[-4806,5732,-5732,-5539,-5542,-5547,-4808]],"properties":{"id":"24661853","dp":11568,"de":4222}},{"type":"Polygon","arcs":[[5733,-5731,-5733,-4805]],"properties":{"id":"24661854","dp":16275,"de":3691}},{"type":"Polygon","arcs":[[-4797,5734,-5729,-5734,-4802]],"properties":{"id":"24661855","dp":14986,"de":4289}},{"type":"Polygon","arcs":[[5735,-5727,-5735,-4796,-4801]],"properties":{"id":"24661856","dp":12903,"de":2867}},{"type":"Polygon","arcs":[[-4790,-5736,-4800,-4794]],"properties":{"id":"24661857","dp":15374,"de":3524}},{"type":"Polygon","arcs":[[5736,5737,5738,-5477,5739,5740]],"properties":{"id":"24662291","dp":2363,"de":2620}},{"type":"Polygon","arcs":[[5741,5742,5743,-5738,5744]],"properties":{"id":"24662292","dp":3110,"de":249}},{"type":"Polygon","arcs":[[5745,5746,-5478,-5739,-5744,5747]],"properties":{"id":"24662293","dp":1729,"de":569}},{"type":"Polygon","arcs":[[5748,-5748,-5743,5749]],"properties":{"id":"24662294","dp":3013,"de":0}},{"type":"Polygon","arcs":[[5750,5751,-5750,-5742]],"properties":{"id":"24662295","dp":3863,"de":0}},{"type":"Polygon","arcs":[[5752,5753,5754,5755,5756,5757]],"properties":{"id":"24661972","dp":7154,"de":5237}},{"type":"Polygon","arcs":[[-1498,-1494,5758,-5754]],"properties":{"id":"24661973","dp":14735,"de":0}},{"type":"Polygon","arcs":[[-5759,-1493,5759,5760,-5755]],"properties":{"id":"24661974","dp":11199,"de":2828}},{"type":"Polygon","arcs":[[-5761,5761,5762,-5756]],"properties":{"id":"24661975","dp":12568,"de":1477}},{"type":"Polygon","arcs":[[-5763,5763,5764,5765,5766]],"properties":{"id":"24661976","dp":12302,"de":3386}},{"type":"Polygon","arcs":[[-5766,5767,5768,5769,5770]],"properties":{"id":"24661977","dp":12413,"de":3605}},{"type":"Polygon","arcs":[[-5765,5771,5772,5773,-5768]],"properties":{"id":"24661978","dp":9698,"de":3723}},{"type":"Polygon","arcs":[[-5774,5774,5775,5776]],"properties":{"id":"24661979","dp":10805,"de":1761}},{"type":"Polygon","arcs":[[5777,-5769,-5777,-1475,-1490,5778]],"properties":{"id":"24661980","dp":12658,"de":0}},{"type":"Polygon","arcs":[[-5572,-5574,-4487,5779,5780,5781,-4293,-4499,-3971,5782,-1106,-3400,-4287,-5568]],"properties":{"id":"24663354","dp":3628,"de":402}},{"type":"Polygon","arcs":[[-4294,-5782,-4475]],"properties":{"id":"24663355","dp":111302,"de":4166}},{"type":"Polygon","arcs":[[-5781,5783,-4481,-4476]],"properties":{"id":"24663356","dp":44790,"de":2958}},{"type":"Polygon","arcs":[[-4486,-4482,-5784,-5780]],"properties":{"id":"24663357","dp":30050,"de":1518}},{"type":"Polygon","arcs":[[-2958,5784,-2749,5785,-1319,-1317,-1315,-1311]],"properties":{"id":"24663358","dp":4498,"de":23309}},{"type":"Polygon","arcs":[[-2957,5786,5787,-2750,-5785]],"properties":{"id":"24663359","dp":24693,"de":8844}},{"type":"Polygon","arcs":[[-2751,-5788,5788]],"properties":{"id":"24663360","dp":43966,"de":6404}},{"type":"Polygon","arcs":[[-2956,-2756,-2752,-5789,-5787]],"properties":{"id":"24663361","dp":11578,"de":26430}},{"type":"Polygon","arcs":[[-1320,-5786,-2748,5789,5790,-1972,5791,-5008,-5014,5792,5793,5794,5795,-1286,-1291,-1297]],"properties":{"id":"24663362","dp":377,"de":1046}},{"type":"Polygon","arcs":[[5796,-5209,-2719,-2717,5797,-5790,-2747,-2745]],"properties":{"id":"24663363","dp":3285,"de":10361}},{"type":"Polygon","arcs":[[-1978,-1973,-5791,-5798,-2716]],"properties":{"id":"24663364","dp":3918,"de":1604}},{"type":"Polygon","arcs":[[-5797,-3389,-2758,-230,-2742,5798,5799,-5210]],"properties":{"id":"24663365","dp":5087,"de":3867}},{"type":"Polygon","arcs":[[5800,-5799,-2741,-2720,5801]],"properties":{"id":"24663366","dp":27344,"de":2074}},{"type":"Polygon","arcs":[[5802,5803,-5802,-2724]],"properties":{"id":"24663367","dp":45965,"de":30965}},{"type":"Polygon","arcs":[[-5211,-5800,-5801,-5804,5804]],"properties":{"id":"24663368","dp":39370,"de":14173}},{"type":"Polygon","arcs":[[5805,5806,5807,5808,-5050]],"properties":{"id":"24661902","dp":15724,"de":3621}},{"type":"Polygon","arcs":[[-5048,5809,5810,-5806]],"properties":{"id":"24661903","dp":17957,"de":4042}},{"type":"Polygon","arcs":[[-5047,5811,5812,-5810]],"properties":{"id":"24661904","dp":14102,"de":5769}},{"type":"Polygon","arcs":[[5813,5814,5815,-5812]],"properties":{"id":"24661905","dp":18581,"de":4181}},{"type":"Polygon","arcs":[[5816,5817,-5815,5818]],"properties":{"id":"24661906","dp":17101,"de":5253}},{"type":"Polygon","arcs":[[-5493,-5819,-5814,-5046,-5502,-5499]],"properties":{"id":"24661907","dp":14172,"de":6843}},{"type":"Polygon","arcs":[[-5808,5819,5820]],"properties":{"id":"24661908","dp":18148,"de":3086}},{"type":"Polygon","arcs":[[-5809,-5821,5821,5822,5823,5824]],"properties":{"id":"24661909","dp":12063,"de":9047}},{"type":"Polygon","arcs":[[5825,5826,5827,5828,-5822,-5820]],"properties":{"id":"24661910","dp":10776,"de":4223}},{"type":"Polygon","arcs":[[5829,5830,5831,5832,-5827]],"properties":{"id":"24661911","dp":17397,"de":3253}},{"type":"Polygon","arcs":[[5833,-5824,5834,-5030,-5038]],"properties":{"id":"24661912","dp":13715,"de":8823}},{"type":"Polygon","arcs":[[-5051,-5825,-5834,-5037,-5041]],"properties":{"id":"24661913","dp":15152,"de":9418}},{"type":"Polygon","arcs":[[-5329,-5511,-5513,-5517,-405,5835,5836]],"properties":{"id":"24661916","dp":2651,"de":334}},{"type":"Polygon","arcs":[[5837,-5836,-404,5838,5839,5840,5841]],"properties":{"id":"24661917","dp":2234,"de":4686}},{"type":"Polygon","arcs":[[5842,-5842,5843,5844,5845]],"properties":{"id":"24661918","dp":5145,"de":970}},{"type":"Polygon","arcs":[[5846,-5846,5847,5848,5849,5850,5851]],"properties":{"id":"24661919","dp":2671,"de":1380}},{"type":"Polygon","arcs":[[5852,-5852,5853,5854,5855]],"properties":{"id":"24661920","dp":2496,"de":1621}},{"type":"Polygon","arcs":[[5856,-5856,5857,5858,5859]],"properties":{"id":"24661921","dp":2077,"de":837}},{"type":"Polygon","arcs":[[-5312,5860,-5860,5861,5862,5863,5864,5865]],"properties":{"id":"24661922","dp":3886,"de":1209}},{"type":"Polygon","arcs":[[5866,5867,-5186,5868,-5469,-5473]],"properties":{"id":"24662322","dp":2640,"de":0}},{"type":"Polygon","arcs":[[-5185,5869,5870,5871,5872,5873,5874,-5869]],"properties":{"id":"24662323","dp":4678,"de":0}},{"type":"Polygon","arcs":[[-5872,5875,5876]],"properties":{"id":"24662324","dp":4533,"de":0}},{"type":"Polygon","arcs":[[-5871,5877,-5164,5878,-4971,-4976,5879,-5876]],"properties":{"id":"24662325","dp":3143,"de":348}},{"type":"Polygon","arcs":[[-5873,-5877,-5880,-4978,5880,5881]],"properties":{"id":"24662326","dp":3614,"de":0}},{"type":"Polygon","arcs":[[5882,-5874,-5882,5883,-5052,5884]],"properties":{"id":"24662327","dp":2698,"de":177}},{"type":"Polygon","arcs":[[5885,5886,-5779,-1489]],"properties":{"id":"24661981","dp":16081,"de":1520}},{"type":"Polygon","arcs":[[5887,-5770,-5778,-5887,5888]],"properties":{"id":"24661982","dp":15856,"de":1401}},{"type":"Polygon","arcs":[[5889,-5757,-5767,-5771,-5888,5890]],"properties":{"id":"24661983","dp":8888,"de":2923}},{"type":"Polygon","arcs":[[5891,-5891,-5889,5892,5893,5894,5895,5896,5897]],"properties":{"id":"24661984","dp":10451,"de":0}},{"type":"Polygon","arcs":[[5898,-5897]],"properties":{"id":"24661985","dp":29836,"de":0}},{"type":"Polygon","arcs":[[5899,-5898,-5899,-5896,5900,5901]],"properties":{"id":"24661986","dp":10344,"de":2323}},{"type":"Polygon","arcs":[[-5901,-5895,5902,5903]],"properties":{"id":"24661987","dp":21005,"de":2234}},{"type":"Polygon","arcs":[[-5903,-5894,5904,5905]],"properties":{"id":"24661988","dp":17865,"de":3370}},{"type":"Polygon","arcs":[[5906,-5905,-5893,-5886,-1488,5907]],"properties":{"id":"24661989","dp":16571,"de":2380}},{"type":"Polygon","arcs":[[5908,-5908,-1487,5909,5910]],"properties":{"id":"24661990","dp":12929,"de":3521}},{"type":"Polygon","arcs":[[5911,-5910,-1486,5912,5913]],"properties":{"id":"24661991","dp":16134,"de":3781}},{"type":"Polygon","arcs":[[5914,-5913,-1485,-1482,5915,5916]],"properties":{"id":"24661992","dp":16920,"de":3492}},{"type":"Polygon","arcs":[[5917,-5917,5918,5919,5920]],"properties":{"id":"24661993","dp":15101,"de":4949}},{"type":"Polygon","arcs":[[-5916,5921,-5919]],"properties":{"id":"24661994","dp":15261,"de":0}},{"type":"Polygon","arcs":[[5922,-5922,-1481,-1478,5923]],"properties":{"id":"24661995","dp":14195,"de":2545}},{"type":"Polygon","arcs":[[-5924,-1477,-1459,5924,5925]],"properties":{"id":"24661996","dp":9977,"de":0}},{"type":"Polygon","arcs":[[5926,5927,5928,5929,5930]],"properties":{"id":"24662366","dp":4026,"de":0}},{"type":"Polygon","arcs":[[-5929,5931,-4948,5932,5933,5934,5935,5936]],"properties":{"id":"24662367","dp":3485,"de":744}},{"type":"Polygon","arcs":[[-4947,-4950,5937,-5933]],"properties":{"id":"24662368","dp":3632,"de":284}},{"type":"Polygon","arcs":[[-5938,-4949,5938,5939,5940,-5934]],"properties":{"id":"24662369","dp":2238,"de":438}},{"type":"Polygon","arcs":[[5941,5942,5943,-5940]],"properties":{"id":"24662370","dp":3178,"de":317}},{"type":"Polygon","arcs":[[5944,-5062]],"properties":{"id":"24663408","dp":7381,"de":0}},{"type":"Polygon","arcs":[[-4979,-4973,5945,5946,-4958,-5063,-5945,-5061]],"properties":{"id":"24663409","dp":4978,"de":712}},{"type":"Polygon","arcs":[[-4969,5947,5948,-5946]],"properties":{"id":"24663410","dp":6406,"de":0}},{"type":"Polygon","arcs":[[-5949,5949,-4959,-5947]],"properties":{"id":"24663411","dp":4462,"de":0}},{"type":"Polygon","arcs":[[5950,-2044,-3114,-4426]],"properties":{"id":"24663412","dp":4522,"de":895}},{"type":"Polygon","arcs":[[-4425,-2060,-4424,-4427,-2058,-2045,-5951]],"properties":{"id":"24663413","dp":9115,"de":3651}},{"type":"Polygon","arcs":[[5951,5952,5953,-3511,5954,5955,-3608,-3600,-4555,-4414,-3115,-2052,-2037,-2035,-1532,5956,5957,5958,5959,5960,5961]],"properties":{"id":"24663419","dp":33,"de":2588}},{"type":"Polygon","arcs":[[5962,5963,5964,5965,5966,5967]],"properties":{"id":"24663420","dp":4244,"de":312}},{"type":"Polygon","arcs":[[-5964,5968]],"properties":{"id":"24663421","dp":4817,"de":400}},{"type":"Polygon","arcs":[[-5963,5969,5970]],"properties":{"id":"24663422","dp":4695,"de":428}},{"type":"Polygon","arcs":[[-5969,-5971,5971,-5958,5972,5973,5974,-5153,-3442,5975,5976,5977,5978,-5965]],"properties":{"id":"24663423","dp":110,"de":3086}},{"type":"Polygon","arcs":[[-5972,5979,5980,-5959]],"properties":{"id":"24663424","dp":4548,"de":989}},{"type":"Polygon","arcs":[[5981,-5960,-5981,5982,5983]],"properties":{"id":"24663425","dp":9652,"de":1159}},{"type":"Polygon","arcs":[[5984,-2210,-2303,-2301]],"properties":{"id":"24663426","dp":17381,"de":0}},{"type":"Polygon","arcs":[[-2138,-2213,-2211,-5985,-2300,-2298,-2215]],"properties":{"id":"24663428","dp":4996,"de":1087}},{"type":"Polygon","arcs":[[-5006,-5792,-1971,5985,5986,-3024,-3021,-1321]],"properties":{"id":"24663370","dp":3,"de":174}},{"type":"Polygon","arcs":[[5987,5988,-5986,-1970]],"properties":{"id":"24663371","dp":48581,"de":4391}},{"type":"Polygon","arcs":[[-1969,5989,-5988]],"properties":{"id":"24663372","dp":40918,"de":0}},{"type":"Polygon","arcs":[[-3288,-3289,-3296,-3462,-3023,-3025,-5987,-5989,-5990,-1968]],"properties":{"id":"24663373","dp":11791,"de":1515}},{"type":"Polygon","arcs":[[-4338,-4330,-3981,5990,5991]],"properties":{"id":"24663374","dp":10415,"de":1298}},{"type":"Polygon","arcs":[[5992,5993,5994,5995,5996,-4333,-5992,5997]],"properties":{"id":"24663375","dp":9598,"de":802}},{"type":"Polygon","arcs":[[5998,5999,-4347,6000,6001,-5994]],"properties":{"id":"24663376","dp":3970,"de":5338}},{"type":"Polygon","arcs":[[6002,-4343,-4348,-6000]],"properties":{"id":"24663377","dp":9555,"de":1420}},{"type":"Polygon","arcs":[[6003,-4525,-4344,-4339,-6003,-5999,-5993,6004]],"properties":{"id":"24663378","dp":4187,"de":1067}},{"type":"Polygon","arcs":[[-3972,-4530,-4526,-6004,6005]],"properties":{"id":"24663379","dp":14021,"de":0}},{"type":"Polygon","arcs":[[-6005,-5998,-5991,-3980,-6006]],"properties":{"id":"24663380","dp":5446,"de":0}},{"type":"Polygon","arcs":[[6006,6007,-2873,6008,-2116,-2122,-2125,-2311,6009]],"properties":{"id":"24663381","dp":2,"de":638}},{"type":"Polygon","arcs":[[-3108,-2542,-2545,-2551,-2555,-3428,6010,-2533,-2537,-2539]],"properties":{"id":"24663382","dp":5,"de":0}},{"type":"Polygon","arcs":[[6011,6012,6013,6014,6015,6016,-5390,-2028,-1938]],"properties":{"id":"24663383","dp":617,"de":1335}},{"type":"Polygon","arcs":[[6017,-6016,6018]],"properties":{"id":"24663384","dp":4514,"de":4583}},{"type":"Polygon","arcs":[[6019,6020,-6019,-6015,6021]],"properties":{"id":"24663385","dp":9437,"de":974}},{"type":"Polygon","arcs":[[-6021,6022,-5386,-5384,6023]],"properties":{"id":"24663386","dp":7647,"de":880}},{"type":"Polygon","arcs":[[-6024,-5389,-5391,-6017,-6018]],"properties":{"id":"24663387","dp":8240,"de":0}},{"type":"Polygon","arcs":[[6024,6025,-6023,-6020,6026]],"properties":{"id":"24663388","dp":9557,"de":766}},{"type":"Polygon","arcs":[[-6027,-6022,-6014,6027]],"properties":{"id":"24663389","dp":7300,"de":933}},{"type":"Polygon","arcs":[[6028,6029,6030,-5983,-5980,-5970,-5968,6031,6032,6033,-5995,-6002,6034]],"properties":{"id":"24663414","dp":3210,"de":1098}},{"type":"Polygon","arcs":[[-6029,6035]],"properties":{"id":"24663415","dp":8810,"de":0}},{"type":"Polygon","arcs":[[-4353,-4359,6036,-5962,6037,6038,-6030,-6036,-6035,-6001,-4346]],"properties":{"id":"24663416","dp":2317,"de":5462}},{"type":"Polygon","arcs":[[-5984,-6031,-6039,6039]],"properties":{"id":"24663417","dp":9046,"de":2798}},{"type":"Polygon","arcs":[[-5961,-5982,-6040,-6038]],"properties":{"id":"24663418","dp":10895,"de":0}},{"type":"Polygon","arcs":[[6040,-367,-5319,-5315]],"properties":{"id":"24661730","dp":16880,"de":0}},{"type":"Polygon","arcs":[[6041,-378,-371,-6041,-5314]],"properties":{"id":"24661731","dp":12441,"de":2597}},{"type":"Polygon","arcs":[[-5866,6042,-375,-6042,-5313]],"properties":{"id":"24661732","dp":16168,"de":3448}},{"type":"Polygon","arcs":[[-5865,6043,6044,-376,-6043]],"properties":{"id":"24661733","dp":17262,"de":0}},{"type":"Polygon","arcs":[[-5864,6045,6046,6047,-6044]],"properties":{"id":"24661734","dp":18052,"de":0}},{"type":"Polygon","arcs":[[6048,-6046,-5863,6049]],"properties":{"id":"24661735","dp":15244,"de":1152}},{"type":"Polygon","arcs":[[-5859,6050,6051,6052,-6050,-5862]],"properties":{"id":"24661736","dp":9780,"de":5118}},{"type":"Polygon","arcs":[[6053,-6051,-5858,-5855]],"properties":{"id":"24661737","dp":14640,"de":2877}},{"type":"Polygon","arcs":[[6054,6055,6056,6057,-6052,-6054,-5854]],"properties":{"id":"24661738","dp":10280,"de":2730}},{"type":"Polygon","arcs":[[6058,6059,-6055,-5851]],"properties":{"id":"24661739","dp":15628,"de":2428}},{"type":"Polygon","arcs":[[6060,6061,-6056,-6060]],"properties":{"id":"24661740","dp":12657,"de":1571}},{"type":"Polygon","arcs":[[6062,6063,-6061,6064]],"properties":{"id":"24661741","dp":17597,"de":0}},{"type":"Polygon","arcs":[[6065,-6065,-6059,-5850]],"properties":{"id":"24661742","dp":14510,"de":3115}},{"type":"Polygon","arcs":[[6066,6067,-6066,-5849]],"properties":{"id":"24661743","dp":15205,"de":74531}},{"type":"Polygon","arcs":[[6068,6069,-6067,-5848]],"properties":{"id":"24661744","dp":16950,"de":3571}},{"type":"Polygon","arcs":[[6070,6071,-6069,-5845]],"properties":{"id":"24661745","dp":16925,"de":1766}},{"type":"Polygon","arcs":[[6072,6073,6074,-6072]],"properties":{"id":"24661746","dp":20318,"de":1724}},{"type":"Polygon","arcs":[[-5841,6075,6076,-6073,-6071,-5844]],"properties":{"id":"24661747","dp":16655,"de":1535}},{"type":"Polygon","arcs":[[6077,6078,6079,6080,6081,6082,-6074,-6077,6083]],"properties":{"id":"24661748","dp":11237,"de":3669}},{"type":"Polygon","arcs":[[6084,6085,-6084,-6076,-5840]],"properties":{"id":"24661749","dp":17024,"de":0}},{"type":"Polygon","arcs":[[6086,6087,6088,-6078,-6086]],"properties":{"id":"24661750","dp":13285,"de":0}},{"type":"Polygon","arcs":[[-6085,-5839,-403,6089,-6087]],"properties":{"id":"24661751","dp":2890,"de":2701}},{"type":"Polygon","arcs":[[6090,6091,6092,-6088,-6090]],"properties":{"id":"24661752","dp":8127,"de":3802}},{"type":"Polygon","arcs":[[-6093,6093,6094,-6089]],"properties":{"id":"24661753","dp":21478,"de":0}},{"type":"Polygon","arcs":[[-6095,6095,6096,-6079]],"properties":{"id":"24661754","dp":17242,"de":2263}},{"type":"Polygon","arcs":[[-6080,-6097,6097,6098]],"properties":{"id":"24661755","dp":20180,"de":4279}},{"type":"Polygon","arcs":[[-6099,6099,6100,-6081]],"properties":{"id":"24661756","dp":18355,"de":2444}},{"type":"Polygon","arcs":[[-6101,6101,6102,-5642,-6082]],"properties":{"id":"24661757","dp":17674,"de":3386}},{"type":"MultiPolygon","arcs":[[[6103,6104,6105,6106,6107]],[[6108,6109,6110,6111]]],"properties":{"id":"24662238","dp":2261,"de":793}},{"type":"Polygon","arcs":[[-5189,-5204,6112,-5171,-5178,-5176,-5174,6113,6114]],"properties":{"id":"24663429","dp":2041,"de":2799}},{"type":"Polygon","arcs":[[-5179,-5182,6115,-5190,-6115,6116,-5183]],"properties":{"id":"24663430","dp":900,"de":1705}},{"type":"Polygon","arcs":[[-3896,6117,-3110,-1072,-3894]],"properties":{"id":"24663431","dp":5080,"de":6645}},{"type":"Polygon","arcs":[[-3111,-6118,-3903]],"properties":{"id":"24663432","dp":5280,"de":570}},{"type":"Polygon","arcs":[[-2560,6118,6119,-2961,-4585,-2973,-2971]],"properties":{"id":"24663434","dp":8464,"de":616}},{"type":"Polygon","arcs":[[6120,6121,6122,-6119,-2559,-2563]],"properties":{"id":"24663436","dp":10303,"de":1757}},{"type":"Polygon","arcs":[[6123,-2733,-2735,-2736,-2962,-6120]],"properties":{"id":"24663437","dp":9503,"de":20644}},{"type":"Polygon","arcs":[[-6124,-6123,6124,-5212,6125,6126]],"properties":{"id":"24663438","dp":6438,"de":2319}},{"type":"Polygon","arcs":[[-1201,6127,6128,-1245,-1253,-1254,-5127,-3670,6129]],"properties":{"id":"24663439","dp":625,"de":1190}},{"type":"Polygon","arcs":[[-1200,-1244,6130,6131,6132,-6128]],"properties":{"id":"24663441","dp":0,"de":2041}},{"type":"Polygon","arcs":[[-6129,6133,6134,-1248,-1246]],"properties":{"id":"24663442","dp":7644,"de":47537}},{"type":"Polygon","arcs":[[6135,6136,-6134,-6133]],"properties":{"id":"24663443","dp":9341,"de":8797}},{"type":"Polygon","arcs":[[-2967,6137,6138,6139]],"properties":{"id":"24663444","dp":23480,"de":0}},{"type":"Polygon","arcs":[[-6132,6140,-2590,-2968,-6140,-6136]],"properties":{"id":"24663445","dp":5663,"de":8789}},{"type":"Polygon","arcs":[[6141,6142,6143,-5751,6144]],"properties":{"id":"24662296","dp":2301,"de":0}},{"type":"Polygon","arcs":[[6145,6146,6147,-6142,6148]],"properties":{"id":"24662297","dp":1810,"de":391}},{"type":"Polygon","arcs":[[-6149,-6145,-5745,6149,6150]],"properties":{"id":"24662298","dp":1947,"de":0}},{"type":"Polygon","arcs":[[-6146,-6151,6151,6152,6153]],"properties":{"id":"24662299","dp":2278,"de":0}},{"type":"Polygon","arcs":[[6154,6155,-6147,-6154,6156,6157,6158,6159,6160]],"properties":{"id":"24662300","dp":1832,"de":1214}},{"type":"Polygon","arcs":[[6161,6162,-6157,-6153,6163,6164]],"properties":{"id":"24662301","dp":2556,"de":1063}},{"type":"Polygon","arcs":[[-6150,-5737,6165,-6164,-6152]],"properties":{"id":"24662302","dp":2085,"de":0}},{"type":"Polygon","arcs":[[6166,-6159,6167,6168,-6165,-6166,6169]],"properties":{"id":"24662303","dp":1580,"de":0}},{"type":"Polygon","arcs":[[-6162,-6169,6170]],"properties":{"id":"24662304","dp":2816,"de":348}},{"type":"Polygon","arcs":[[-6158,-6163,-6171,-6168]],"properties":{"id":"24662305","dp":2878,"de":384}},{"type":"Polygon","arcs":[[-5232,6171,-5230,6172,6173,-5561]],"properties":{"id":"24662311","dp":1553,"de":149}},{"type":"Polygon","arcs":[[-5229,6174,-6173]],"properties":{"id":"24662312","dp":1454,"de":1075}},{"type":"Polygon","arcs":[[-6174,-6175,-5228,-5226,-5224,-5219,6175,-6155,6176,-5558,-5562]],"properties":{"id":"24662313","dp":840,"de":142}},{"type":"Polygon","arcs":[[-5218,-5201,-5205,-4676,6177,6178,-6156,-6176]],"properties":{"id":"24662314","dp":3498,"de":0}},{"type":"Polygon","arcs":[[-6148,-6179,6179,6180]],"properties":{"id":"24662315","dp":2455,"de":527}},{"type":"Polygon","arcs":[[-6178,-4679,-5215,6181,-6180]],"properties":{"id":"24662316","dp":2888,"de":306}},{"type":"Polygon","arcs":[[-6181,-6182,-5214,6182,-6143]],"properties":{"id":"24662317","dp":2817,"de":0}},{"type":"Polygon","arcs":[[-5213,-5197,6183,-6144,-6183]],"properties":{"id":"24662318","dp":2925,"de":0}},{"type":"Polygon","arcs":[[-5752,-6184,-5192,6184,-5746,-5749]],"properties":{"id":"24662319","dp":1692,"de":360}},{"type":"Polygon","arcs":[[-6185,-5191,-6116,-5181,-5868,6185,-5479,-5475,-5747]],"properties":{"id":"24662320","dp":2385,"de":812}},{"type":"Polygon","arcs":[[-6186,-5867,-5472,-5480]],"properties":{"id":"24662321","dp":3259,"de":0}},{"type":"Polygon","arcs":[[6186,6187,6188]],"properties":{"id":"24662705","dp":41953,"de":0}},{"type":"Polygon","arcs":[[-6189,6189,6190,6191,6192]],"properties":{"id":"24662706","dp":13309,"de":1079}},{"type":"MultiPolygon","arcs":[[[6193,6194,6195,6196,6197,6198]],[[6199]],[[6200,6201,6202]],[[6203]]],"properties":{"id":"24662707","dp":1614,"de":0}},{"type":"Polygon","arcs":[[-5649,6204,6205,6206,6207]],"properties":{"id":"24661761","dp":15096,"de":5038}},{"type":"Polygon","arcs":[[6208,-5650,-6208,6209,6210,-6064]],"properties":{"id":"24661762","dp":12626,"de":4966}},{"type":"Polygon","arcs":[[-6068,-6070,-6075,-6083,-5641,-5647,-6209,-6063]],"properties":{"id":"24661763","dp":12583,"de":3149}},{"type":"Polygon","arcs":[[-6211,6211,6212,-6062]],"properties":{"id":"24661764","dp":13913,"de":7681}},{"type":"Polygon","arcs":[[-6210,-6207,6213,6214,6215,-6212]],"properties":{"id":"24661765","dp":12851,"de":21205}},{"type":"Polygon","arcs":[[-6213,-6216,6216,6217,6218,-6057]],"properties":{"id":"24661766","dp":11159,"de":8956}},{"type":"Polygon","arcs":[[-6215,6219,6220,6221,6222,-6217]],"properties":{"id":"24661767","dp":11887,"de":8657}},{"type":"Polygon","arcs":[[6223,6224,6225,-6220,-6214]],"properties":{"id":"24661768","dp":7238,"de":1791}},{"type":"Polygon","arcs":[[6226,6227,-6224,-6206]],"properties":{"id":"24661769","dp":16767,"de":0}},{"type":"Polygon","arcs":[[6228,6229,-6227,-6205,-5648,-5645]],"properties":{"id":"24661770","dp":7574,"de":2425}},{"type":"Polygon","arcs":[[-6103,6230,6231,6232,-6229,-5643]],"properties":{"id":"24661771","dp":16973,"de":2600}},{"type":"Polygon","arcs":[[-6102,6233,6234,-6231]],"properties":{"id":"24661772","dp":16303,"de":0}},{"type":"Polygon","arcs":[[6235,6236,6237,-6234,-6100,-6098,-6096]],"properties":{"id":"24661773","dp":10762,"de":1326}},{"type":"Polygon","arcs":[[6238,6239,6240,-6238]],"properties":{"id":"24661774","dp":19375,"de":0}},{"type":"Polygon","arcs":[[6241,6242,-6239,-6237]],"properties":{"id":"24661775","dp":11594,"de":1293}},{"type":"Polygon","arcs":[[6243,6244,6245,-6242,6246]],"properties":{"id":"24661776","dp":8608,"de":2355}},{"type":"Polygon","arcs":[[-6246,6247,6248,6249,6250,-6240,-6243]],"properties":{"id":"24661777","dp":6741,"de":1690}},{"type":"Polygon","arcs":[[6251,6252,-6248,-6245,6253]],"properties":{"id":"24661778","dp":8116,"de":4743}},{"type":"Polygon","arcs":[[-6254,-6244,6254,6255]],"properties":{"id":"24661779","dp":6321,"de":2008}},{"type":"Polygon","arcs":[[6256,6257,-6256,6258]],"properties":{"id":"24661780","dp":9661,"de":1224}},{"type":"Polygon","arcs":[[6259,-6259,6260,6261,6262]],"properties":{"id":"24661781","dp":9341,"de":1508}},{"type":"Polygon","arcs":[[-6261,-6255,-6247,-6236,-6094,-6092]],"properties":{"id":"24661782","dp":5055,"de":2746}},{"type":"Polygon","arcs":[[6263,-6262,-6091,-402]],"properties":{"id":"24661783","dp":14177,"de":1407}},{"type":"Polygon","arcs":[[-401,6264,6265,-6263,-6264]],"properties":{"id":"24661784","dp":14551,"de":1345}},{"type":"Polygon","arcs":[[6266,-6266,6267]],"properties":{"id":"24661785","dp":11036,"de":0}},{"type":"Polygon","arcs":[[-408,-5522,6268,-6268,-6265,-400]],"properties":{"id":"24661786","dp":8508,"de":2130}},{"type":"Polygon","arcs":[[-5521,-5705,6269,6270,-6269]],"properties":{"id":"24661787","dp":11700,"de":0}},{"type":"Polygon","arcs":[[-6271,6271,-6260,-6267]],"properties":{"id":"24661788","dp":14873,"de":0}},{"type":"Polygon","arcs":[[6272,6273,-6257,-6272]],"properties":{"id":"24661789","dp":15202,"de":0}},{"type":"Polygon","arcs":[[-5702,6274,-6273,-6270]],"properties":{"id":"24661790","dp":16011,"de":1123}},{"type":"Polygon","arcs":[[6275,6276,6277]],"properties":{"id":"24662255","dp":3737,"de":0}},{"type":"Polygon","arcs":[[6278,6279,6280,6281,-6278,6282]],"properties":{"id":"24662256","dp":2588,"de":430}},{"type":"Polygon","arcs":[[-5236,-5556,6283,-5559,-6177,-6161,-5351,-5338]],"properties":{"id":"24662306","dp":1249,"de":139}},{"type":"Polygon","arcs":[[-5555,-5560,-6284]],"properties":{"id":"24662307","dp":1959,"de":424}},{"type":"Polygon","arcs":[[6284,6285,6286,6287,-6194,6288,-6203,6289,6290]],"properties":{"id":"24662671","dp":2857,"de":348}},{"type":"Polygon","arcs":[[-6192,6291,6292,6293,-6291]],"properties":{"id":"24662672","dp":6882,"de":887}},{"type":"Polygon","arcs":[[6294,6295,-6292,-6191,6296]],"properties":{"id":"24662673","dp":7914,"de":1071}},{"type":"Polygon","arcs":[[6297,-6296,6298,6299]],"properties":{"id":"24662674","dp":13984,"de":957}},{"type":"Polygon","arcs":[[6300,-6293,-6298,6301,6302]],"properties":{"id":"24662675","dp":9869,"de":913}},{"type":"Polygon","arcs":[[6303,6304,6305,-6302,6306]],"properties":{"id":"24662676","dp":6731,"de":2977}},{"type":"Polygon","arcs":[[-6307,-6300,6307,6308,6309]],"properties":{"id":"24662677","dp":11051,"de":1860}},{"type":"Polygon","arcs":[[-6309,6310,6311]],"properties":{"id":"24662678","dp":11729,"de":947}},{"type":"Polygon","arcs":[[-5875,-5883,6312,-3059,-3055,-5470]],"properties":{"id":"24662328","dp":3185,"de":1033}},{"type":"Polygon","arcs":[[6313,-6313,-5885,-5056,6314]],"properties":{"id":"24662329","dp":3261,"de":438}},{"type":"Polygon","arcs":[[-3060,-6314,6315,6316]],"properties":{"id":"24662330","dp":3657,"de":1406}},{"type":"Polygon","arcs":[[-3061,-6317,6317,6318,6319,6320]],"properties":{"id":"24662331","dp":1606,"de":110}},{"type":"Polygon","arcs":[[-6316,6321,6322,6323,6324,-6318]],"properties":{"id":"24662332","dp":6775,"de":602}},{"type":"Polygon","arcs":[[-6315,-5055,6325,6326,-6322]],"properties":{"id":"24662333","dp":3983,"de":1212}},{"type":"Polygon","arcs":[[-5059,-4964,6327,-6326]],"properties":{"id":"24662334","dp":4472,"de":365}},{"type":"Polygon","arcs":[[-6327,-6328,-4967,6328,6329,6330,6331]],"properties":{"id":"24662335","dp":3950,"de":1421}},{"type":"Polygon","arcs":[[-6332,6332,6333,-6323]],"properties":{"id":"24662336","dp":9900,"de":931}},{"type":"Polygon","arcs":[[-6331,6334,-5696,6335,-6333]],"properties":{"id":"24662337","dp":7324,"de":0}},{"type":"Polygon","arcs":[[-5688,6336,6337,6338,-6324,-6334,-6336,-5699,-5692,-5690]],"properties":{"id":"24662338","dp":2305,"de":1478}},{"type":"Polygon","arcs":[[6339,6340,-6338]],"properties":{"id":"24662339","dp":4017,"de":0}},{"type":"Polygon","arcs":[[6341,-6320,6342,-6340,-6337,-5687,6343]],"properties":{"id":"24662340","dp":3325,"de":764}},{"type":"Polygon","arcs":[[-6343,-6319,-6325,-6339,-6341]],"properties":{"id":"24662341","dp":3875,"de":230}},{"type":"Polygon","arcs":[[6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,-1830]],"properties":{"id":"24662730","dp":1834,"de":2895}},{"type":"Polygon","arcs":[[-1674,6354,6355,-1387,-6354,6356,6357,-3586]],"properties":{"id":"24662731","dp":614,"de":2821}},{"type":"Polygon","arcs":[[-1680,-1681,6358,-6355]],"properties":{"id":"24662732","dp":7581,"de":0}},{"type":"Polygon","arcs":[[-1684,-1689,-1694,-1708,-1383,-6356,-6359]],"properties":{"id":"24662733","dp":9120,"de":685}},{"type":"Polygon","arcs":[[-6358,6359,6360,6361,6362,6363,-3587]],"properties":{"id":"24662734","dp":3022,"de":2329}},{"type":"Polygon","arcs":[[6364,6365,-6361]],"properties":{"id":"24662735","dp":9518,"de":0}},{"type":"Polygon","arcs":[[6366,6367,-6107,6368,6369,6370]],"properties":{"id":"24662239","dp":3567,"de":602}},{"type":"Polygon","arcs":[[6371,6372,-6369,-6106]],"properties":{"id":"24662240","dp":7881,"de":3268}},{"type":"Polygon","arcs":[[-6373,6373,6374,-6370]],"properties":{"id":"24662241","dp":3505,"de":1525}},{"type":"Polygon","arcs":[[6375,-6371,-6375,6376,6377]],"properties":{"id":"24662242","dp":3234,"de":1782}},{"type":"Polygon","arcs":[[6378,6379,6380,6381,6382,6383,-1529,6384,-6377]],"properties":{"id":"24662243","dp":1208,"de":2566}},{"type":"Polygon","arcs":[[-6374,6385,6386,6387,6388,-6379]],"properties":{"id":"24662244","dp":2557,"de":909}},{"type":"Polygon","arcs":[[-6389,6389,6390,6391,6392,-6380]],"properties":{"id":"24662245","dp":2398,"de":0}},{"type":"Polygon","arcs":[[6393,-6390,-6388,6394,-6386,-6372]],"properties":{"id":"24662246","dp":10977,"de":448}},{"type":"Polygon","arcs":[[-6387,-6395]],"properties":{"id":"24662247","dp":0,"de":0}},{"type":"Polygon","arcs":[[6395,6396,6397,-6391,-6394,-6105]],"properties":{"id":"24662248","dp":1504,"de":225}},{"type":"Polygon","arcs":[[-6279,6398,6399,6400,-6392,-6398]],"properties":{"id":"24662250","dp":1143,"de":762}},{"type":"Polygon","arcs":[[-6393,-6401,6401,6402,-6381]],"properties":{"id":"24662251","dp":2939,"de":744}},{"type":"Polygon","arcs":[[-6400,6403,6404,-6402]],"properties":{"id":"24662252","dp":3252,"de":0}},{"type":"Polygon","arcs":[[6405,-6382,-6403,-6405]],"properties":{"id":"24662253","dp":10107,"de":0}},{"type":"Polygon","arcs":[[-6283,-6277,-6383,-6406,-6404,-6399]],"properties":{"id":"24662254","dp":3446,"de":461}},{"type":"Polygon","arcs":[[6406,-4695,6407,6408,6409,6410,6411,6412]],"properties":{"id":"24662585","dp":4198,"de":409}},{"type":"Polygon","arcs":[[-6413,6413,6414,6415,6416,6417]],"properties":{"id":"24662586","dp":4531,"de":1060}},{"type":"Polygon","arcs":[[-6417,6418,6419,6420]],"properties":{"id":"24662587","dp":13375,"de":1380}},{"type":"Polygon","arcs":[[-6407,-6418,-6421,6421,6422,-4696]],"properties":{"id":"24662588","dp":8159,"de":0}},{"type":"Polygon","arcs":[[6423,-6281,6424]],"properties":{"id":"24662257","dp":3152,"de":0}},{"type":"Polygon","arcs":[[6425,-6304,-6310,-6312,6426,6427,6428,-6346]],"properties":{"id":"24662679","dp":5501,"de":2354}},{"type":"Polygon","arcs":[[-6429,6429,-6347]],"properties":{"id":"24662680","dp":9791,"de":2083}},{"type":"Polygon","arcs":[[-6428,6430,6431,-6348,-6430]],"properties":{"id":"24662681","dp":9580,"de":1904}},{"type":"Polygon","arcs":[[-6432,6432,6433,-6349]],"properties":{"id":"24662682","dp":9391,"de":2186}},{"type":"Polygon","arcs":[[6434,6435,6436,-6433]],"properties":{"id":"24662683","dp":14871,"de":0}},{"type":"Polygon","arcs":[[-6434,-6437,6437,6438,-6350]],"properties":{"id":"24662684","dp":11510,"de":0}},{"type":"Polygon","arcs":[[-6438,6439,6440,6441,6442]],"properties":{"id":"24662685","dp":10287,"de":1053}},{"type":"Polygon","arcs":[[-6440,-6436,6443,6444,6445]],"properties":{"id":"24662686","dp":12788,"de":0}},{"type":"Polygon","arcs":[[6446,6447,6448,-6446]],"properties":{"id":"24662687","dp":10598,"de":1028}},{"type":"Polygon","arcs":[[-6449,6449,6450,6451,-6441]],"properties":{"id":"24662688","dp":13352,"de":0}},{"type":"Polygon","arcs":[[-6442,-6452,6452,6453,6454,6455,6456]],"properties":{"id":"24662689","dp":5850,"de":1264}},{"type":"Polygon","arcs":[[-6451,6457,6458,6459,6460,-6453]],"properties":{"id":"24662690","dp":12312,"de":0}},{"type":"Polygon","arcs":[[-6461,6461,6462,6463,-6454]],"properties":{"id":"24662691","dp":6297,"de":749}},{"type":"Polygon","arcs":[[-6460,6464,-3571,6465,-6462]],"properties":{"id":"24662692","dp":5813,"de":1182}},{"type":"Polygon","arcs":[[6466,-3572,-6465,-6459,6467]],"properties":{"id":"24662693","dp":7787,"de":0}},{"type":"Polygon","arcs":[[6468,6469,-3573,-6467,6470]],"properties":{"id":"24662694","dp":7267,"de":910}},{"type":"Polygon","arcs":[[6471,-6471,-6468,-6458,-6450,-6448]],"properties":{"id":"24662695","dp":12815,"de":1958}},{"type":"Polygon","arcs":[[6472,6473,-6469,-6472,-6447,6474]],"properties":{"id":"24662696","dp":8731,"de":755}},{"type":"Polygon","arcs":[[6475,6476,6477,-6473,6478]],"properties":{"id":"24662697","dp":9029,"de":0}},{"type":"Polygon","arcs":[[6479,-3574,-6470,-6474,-6478]],"properties":{"id":"24662698","dp":5712,"de":6724}},{"type":"Polygon","arcs":[[6480,-3575,-6480,6481]],"properties":{"id":"24662699","dp":9426,"de":1946}},{"type":"Polygon","arcs":[[-6193,-6290,-6202,6482,-3568,6483,-6187]],"properties":{"id":"24662703","dp":7760,"de":673}},{"type":"Polygon","arcs":[[6484,-6190,-6188,-6484,-6481]],"properties":{"id":"24662704","dp":18992,"de":1162}},{"type":"Polygon","arcs":[[6485,-4995,-237,-2863]],"properties":{"id":"24661348","dp":9008,"de":969}},{"type":"Polygon","arcs":[[-4989,-6486,-2864,6486,6487]],"properties":{"id":"24661349","dp":6533,"de":0}},{"type":"Polygon","arcs":[[-4990,-6488,6488,6489]],"properties":{"id":"24661350","dp":7350,"de":964}},{"type":"Polygon","arcs":[[-6489,-6487,-2862,6490,6491]],"properties":{"id":"24661351","dp":13397,"de":3406}},{"type":"Polygon","arcs":[[6492,6493,-6195,-6288,6494]],"properties":{"id":"24662708","dp":12607,"de":1745}},{"type":"Polygon","arcs":[[-6297,-6485,-6482,-6477,6495]],"properties":{"id":"24662709","dp":6141,"de":964}},{"type":"Polygon","arcs":[[-6295,-6496,-6476,6496,6497]],"properties":{"id":"24662710","dp":8015,"de":591}},{"type":"Polygon","arcs":[[6498,-6497,-6479,-6475,-6445,6499]],"properties":{"id":"24662711","dp":6504,"de":0}},{"type":"Polygon","arcs":[[-6299,-6498,-6499,6500,-6311,-6308]],"properties":{"id":"24662712","dp":6907,"de":488}},{"type":"Polygon","arcs":[[-6427,-6501,-6500,-6444,-6435,-6431]],"properties":{"id":"24662713","dp":7611,"de":830}},{"type":"Polygon","arcs":[[6501,6502,6503,-3570,6504,6505,6506]],"properties":{"id":"24662714","dp":4649,"de":584}},{"type":"Polygon","arcs":[[-6466,-6504,6507,6508,6509]],"properties":{"id":"24662715","dp":5495,"de":0}},{"type":"Polygon","arcs":[[6510,-6508,-6503,6511,6512]],"properties":{"id":"24662716","dp":9445,"de":2103}},{"type":"Polygon","arcs":[[6513,6514,6515,6516,-6511,6517,6518]],"properties":{"id":"24662717","dp":7157,"de":2793}},{"type":"Polygon","arcs":[[-6517,6519,6520,-6509]],"properties":{"id":"24662718","dp":23720,"de":0}},{"type":"Polygon","arcs":[[-6463,-6510,-6521,6521]],"properties":{"id":"24662719","dp":18764,"de":0}},{"type":"Polygon","arcs":[[-6464,-6522,-6520,-6516,6522]],"properties":{"id":"24662720","dp":7496,"de":2034}},{"type":"Polygon","arcs":[[-6455,-6523,6523,6524]],"properties":{"id":"24662721","dp":6829,"de":2325}},{"type":"Polygon","arcs":[[6525,-6456,-6525,6526,6527,6528]],"properties":{"id":"24662722","dp":8355,"de":2088}},{"type":"Polygon","arcs":[[6529,-6527,6530,6531,6532]],"properties":{"id":"24662723","dp":10122,"de":1573}},{"type":"Polygon","arcs":[[6533,6534,-6528,-6530,6535]],"properties":{"id":"24662724","dp":8763,"de":0}},{"type":"Polygon","arcs":[[-6353,6536,6537,-6536,-6533,6538,6539,-6360,-6357]],"properties":{"id":"24662725","dp":2056,"de":2765}},{"type":"Polygon","arcs":[[6540,-6534,-6538]],"properties":{"id":"24662726","dp":8689,"de":3564}},{"type":"Polygon","arcs":[[-6535,-6541,-6537,-6352,6541,6542,-6529]],"properties":{"id":"24662727","dp":5662,"de":3899}},{"type":"Polygon","arcs":[[-6439,6543,-6542,-6351]],"properties":{"id":"24662728","dp":11821,"de":5000}},{"type":"Polygon","arcs":[[-6443,-6457,-6526,-6543,-6544]],"properties":{"id":"24662729","dp":9927,"de":1989}},{"type":"Polygon","arcs":[[-5081,-5021,6544,6545,6546,-4786]],"properties":{"id":"24661383","dp":15167,"de":14087}},{"type":"Polygon","arcs":[[6547,-6546,6548,6549]],"properties":{"id":"24661384","dp":19614,"de":4958}},{"type":"Polygon","arcs":[[6550,6551,6552,-6550,6553,6554]],"properties":{"id":"24661385","dp":9100,"de":2507}},{"type":"Polygon","arcs":[[6555,-4871,-4714,-4867,6556,-6552]],"properties":{"id":"24661386","dp":5555,"de":3917}},{"type":"Polygon","arcs":[[-4869,6557,-6553,-6557]],"properties":{"id":"24661387","dp":18056,"de":0}},{"type":"Polygon","arcs":[[6558,6559,-6548,-6558]],"properties":{"id":"24661388","dp":17000,"de":3269}},{"type":"Polygon","arcs":[[6560,-6547,-6560,-4736]],"properties":{"id":"24661389","dp":14501,"de":9965}},{"type":"Polygon","arcs":[[-4743,6561,-4784,-6561]],"properties":{"id":"24661390","dp":15266,"de":12099}},{"type":"Polygon","arcs":[[-4744,6562,-4782,-6562]],"properties":{"id":"24661391","dp":21659,"de":4148}},{"type":"Polygon","arcs":[[-4748,-4754,-4779,-6563]],"properties":{"id":"24661392","dp":19071,"de":5696}},{"type":"Polygon","arcs":[[-4735,-4737,-6559,-4868]],"properties":{"id":"24661393","dp":24794,"de":3082}},{"type":"Polygon","arcs":[[-6280,-6397,6563,-5359,6564,6565,-6425]],"properties":{"id":"24662258","dp":1732,"de":233}},{"type":"Polygon","arcs":[[-6282,-6424,-6566,6566,6567,6568,-1515,-1523,-1530,-6384,-6276]],"properties":{"id":"24662259","dp":1941,"de":140}},{"type":"Polygon","arcs":[[-6565,6569,-6567]],"properties":{"id":"24662260","dp":3077,"de":1065}},{"type":"Polygon","arcs":[[-6570,-5363,6570,-6568]],"properties":{"id":"24662261","dp":6716,"de":1198}},{"type":"Polygon","arcs":[[-5362,-5357,-5354,-3066,-1508,-6569,-6571]],"properties":{"id":"24662262","dp":1256,"de":114}},{"type":"Polygon","arcs":[[-1503,-1510,-3065,6571,6572,6573]],"properties":{"id":"24662263","dp":1981,"de":926}},{"type":"Polygon","arcs":[[-3076,6574,6575,-6572,-3064]],"properties":{"id":"24662264","dp":2928,"de":0}},{"type":"Polygon","arcs":[[-6575,-3074,6576,6577]],"properties":{"id":"24662265","dp":2289,"de":357}},{"type":"Polygon","arcs":[[6578,6579,-6573,-6576,-6578,6580,6581]],"properties":{"id":"24662266","dp":1534,"de":696}},{"type":"Polygon","arcs":[[-6581,-6577,-3073,6582,6583,6584,6585,6586]],"properties":{"id":"24662267","dp":1532,"de":188}},{"type":"Polygon","arcs":[[-6579,6587,6588,6589]],"properties":{"id":"24662268","dp":2975,"de":0}},{"type":"Polygon","arcs":[[6590,-6586,6591,6592,-5393]],"properties":{"id":"24662269","dp":5171,"de":199}},{"type":"Polygon","arcs":[[-6593,6593,6594,-5394]],"properties":{"id":"24662270","dp":4907,"de":0}},{"type":"Polygon","arcs":[[-4859,-529,6595,-4848]],"properties":{"id":"24662614","dp":9881,"de":0}},{"type":"Polygon","arcs":[[-4888,-4825,-4842,-6596,-528,-532,-535,6596,-6408,-4694,-4886,-4884]],"properties":{"id":"24662615","dp":1551,"de":3919}},{"type":"Polygon","arcs":[[6597,6598,-6365,-6540]],"properties":{"id":"24662736","dp":13797,"de":0}},{"type":"Polygon","arcs":[[6599,6600,6601,-6599]],"properties":{"id":"24662737","dp":9680,"de":1600}},{"type":"Polygon","arcs":[[-6602,6602,6603,-6362,-6366]],"properties":{"id":"24662738","dp":8241,"de":0}},{"type":"Polygon","arcs":[[-6492,6604,6605,6606,-4720,-4724,6607,6608]],"properties":{"id":"24661352","dp":3119,"de":1795}},{"type":"Polygon","arcs":[[-6490,-6609,6609,6610]],"properties":{"id":"24661353","dp":18231,"de":3231}},{"type":"Polygon","arcs":[[-6610,-6608,-4723,6611]],"properties":{"id":"24661354","dp":19464,"de":5351}},{"type":"Polygon","arcs":[[-4991,-6611,-6612,6612,-4882]],"properties":{"id":"24661355","dp":6644,"de":6469}},{"type":"Polygon","arcs":[[-6613,-4725,-4689,6613]],"properties":{"id":"24661356","dp":9520,"de":2309}},{"type":"Polygon","arcs":[[-4883,-6614,-4688,-4874]],"properties":{"id":"24661357","dp":13662,"de":1298}},{"type":"Polygon","arcs":[[-5884,-5881,-4981,-5060,-5053]],"properties":{"id":"24663083","dp":3712,"de":0}},{"type":"Polygon","arcs":[[6614,6615,6616,6617,-6603]],"properties":{"id":"24662739","dp":6662,"de":1395}},{"type":"Polygon","arcs":[[-6618,6618,6619,6620,6621]],"properties":{"id":"24662740","dp":10030,"de":1739}},{"type":"Polygon","arcs":[[6622,6623,6624,6625,-6619,-6617]],"properties":{"id":"24662741","dp":10694,"de":0}},{"type":"Polygon","arcs":[[-6626,6626,6627,6628,-6620]],"properties":{"id":"24662742","dp":11025,"de":870}},{"type":"Polygon","arcs":[[-6628,6629,6630,6631,6632]],"properties":{"id":"24662743","dp":15439,"de":0}},{"type":"Polygon","arcs":[[6633,-6621,-6629,-6633,6634,6635]],"properties":{"id":"24662744","dp":9313,"de":1991}},{"type":"Polygon","arcs":[[6636,-6636,6637]],"properties":{"id":"24662745","dp":13688,"de":825}},{"type":"Polygon","arcs":[[6638,-6638,-6635,-6632,6639,6640]],"properties":{"id":"24662746","dp":7690,"de":3548}},{"type":"Polygon","arcs":[[-6631,6641,6642,6643,-6640]],"properties":{"id":"24662747","dp":22567,"de":1234}},{"type":"Polygon","arcs":[[6644,6645,6646,6647,-6643]],"properties":{"id":"24662748","dp":11504,"de":0}},{"type":"Polygon","arcs":[[6648,6649,6650,-6644,-6648,6651,6652,6653]],"properties":{"id":"24662749","dp":10243,"de":6707}},{"type":"Polygon","arcs":[[-6654,6654,6655,6656,6657]],"properties":{"id":"24662750","dp":12246,"de":0}},{"type":"Polygon","arcs":[[-6649,-6658,6658,6659,6660]],"properties":{"id":"24662751","dp":13468,"de":0}},{"type":"Polygon","arcs":[[-6657,6661,6662,-6659]],"properties":{"id":"24662752","dp":12830,"de":0}},{"type":"Polygon","arcs":[[6663,6664,6665,-6660,-6663,6666,6667,6668]],"properties":{"id":"24662753","dp":4003,"de":2306}},{"type":"Polygon","arcs":[[-6669,6669,6670,6671,6672,6673,6674]],"properties":{"id":"24662754","dp":12857,"de":0}},{"type":"Polygon","arcs":[[6675,-6672,6676,6677]],"properties":{"id":"24662755","dp":12687,"de":0}},{"type":"Polygon","arcs":[[-6673,-6676,6678,6679,6680]],"properties":{"id":"24662756","dp":18873,"de":0}},{"type":"Polygon","arcs":[[6681,-6674,-6681,6682,6683]],"properties":{"id":"24662757","dp":15235,"de":0}},{"type":"Polygon","arcs":[[6684,-6664,-6675,-6682,6685]],"properties":{"id":"24662758","dp":13365,"de":1282}},{"type":"Polygon","arcs":[[6686,-6686,6687]],"properties":{"id":"24662759","dp":10279,"de":0}},{"type":"Polygon","arcs":[[-6688,-6684,6688,6689,6690]],"properties":{"id":"24662760","dp":17013,"de":767}},{"type":"Polygon","arcs":[[-6689,6691]],"properties":{"id":"24662761","dp":22232,"de":0}},{"type":"Polygon","arcs":[[6692,6693,-5023,-5080,-5083,6694]],"properties":{"id":"24661417","dp":13624,"de":7969}},{"type":"Polygon","arcs":[[-5794,6695,-5024,-6694]],"properties":{"id":"24661418","dp":14488,"de":4444}},{"type":"Polygon","arcs":[[-5020,-5025,-6696,-5793,-5013]],"properties":{"id":"24661419","dp":30000,"de":0}},{"type":"Polygon","arcs":[[-5082,6696,6697,-6695]],"properties":{"id":"24661420","dp":16448,"de":3877}},{"type":"Polygon","arcs":[[-5084,6698,6699,-6697]],"properties":{"id":"24661421","dp":17083,"de":3030}},{"type":"Polygon","arcs":[[-6699,-5074,6700,6701]],"properties":{"id":"24661422","dp":12876,"de":24315}},{"type":"Polygon","arcs":[[6702,-6701,-5069,6703,6704]],"properties":{"id":"24661423","dp":19588,"de":9264}},{"type":"Polygon","arcs":[[-6704,-5068,6705]],"properties":{"id":"24661424","dp":16603,"de":1904}},{"type":"Polygon","arcs":[[-6705,-6706,-5064,-5482,6706,-5483,6707,6708,6709]],"properties":{"id":"24661425","dp":10108,"de":8276}},{"type":"Polygon","arcs":[[6710,6711,6712,6713,6714]],"properties":{"id":"24662858","dp":6699,"de":1150}},{"type":"Polygon","arcs":[[-6714,6715,6716,6717]],"properties":{"id":"24662859","dp":6916,"de":967}},{"type":"Polygon","arcs":[[-6713,6718,6719,6720,6721,-6716]],"properties":{"id":"24662860","dp":8429,"de":0}},{"type":"Polygon","arcs":[[6722,-2095,-2099,6723,-6719]],"properties":{"id":"24662861","dp":5689,"de":438}},{"type":"Polygon","arcs":[[-2098,6724,6725,-6720,-6724]],"properties":{"id":"24662862","dp":4585,"de":308}},{"type":"Polygon","arcs":[[-2102,6726,6727,6728,-6725]],"properties":{"id":"24662863","dp":13131,"de":0}},{"type":"Polygon","arcs":[[-6726,-6729,6729,6730,-6721]],"properties":{"id":"24662864","dp":7819,"de":0}},{"type":"Polygon","arcs":[[6731,6732,6733,6734,-6730]],"properties":{"id":"24662865","dp":5207,"de":0}},{"type":"Polygon","arcs":[[6735,6736,-6733]],"properties":{"id":"24662866","dp":4979,"de":0}},{"type":"Polygon","arcs":[[-6728,6737,6738,6739,-6736,-6732]],"properties":{"id":"24662867","dp":4831,"de":0}},{"type":"Polygon","arcs":[[6740,-6739,6741]],"properties":{"id":"24662868","dp":3710,"de":0}},{"type":"Polygon","arcs":[[6742,6743,-5257,6744]],"properties":{"id":"24663113","dp":1103,"de":305}},{"type":"Polygon","arcs":[[-2072,-2083,6745,6746,6747,-868,-2069]],"properties":{"id":"24662830","dp":4737,"de":0}},{"type":"Polygon","arcs":[[6748,-6747,6749,6750]],"properties":{"id":"24662831","dp":5663,"de":0}},{"type":"Polygon","arcs":[[6751,-6751,6752,6753]],"properties":{"id":"24662832","dp":5790,"de":0}},{"type":"Polygon","arcs":[[6754,-6753,-6750,-6746,6755,6756]],"properties":{"id":"24662833","dp":8438,"de":0}},{"type":"Polygon","arcs":[[-2082,-2085,6757,6758,-6756]],"properties":{"id":"24662834","dp":13589,"de":0}},{"type":"Polygon","arcs":[[6759,-6757,-6759,6760,6761,6762]],"properties":{"id":"24662835","dp":6318,"de":803}},{"type":"Polygon","arcs":[[-6727,-2101,-2066,6763,-6742,-6738]],"properties":{"id":"24662869","dp":2880,"de":2304}},{"type":"Polygon","arcs":[[-2065,-2070,-873,6764,-888,-6734,-6737,-6740,-6741,-6764]],"properties":{"id":"24662870","dp":2654,"de":333}},{"type":"Polygon","arcs":[[6765,6766,6767,6768]],"properties":{"id":"24661557","dp":13272,"de":0}},{"type":"Polygon","arcs":[[6769,6770,6771,-6767]],"properties":{"id":"24661558","dp":24042,"de":2836}},{"type":"Polygon","arcs":[[6772,6773,-6771,6774]],"properties":{"id":"24661559","dp":24840,"de":0}},{"type":"Polygon","arcs":[[-6772,6775,6776,6777,6778,-6768]],"properties":{"id":"24661560","dp":18750,"de":2138}},{"type":"Polygon","arcs":[[6779,6780,-6777]],"properties":{"id":"24661561","dp":25255,"de":0}},{"type":"Polygon","arcs":[[6781,-6778,-6781,6782]],"properties":{"id":"24661562","dp":29653,"de":0}},{"type":"Polygon","arcs":[[6783,-6782,6784,6785,-5563,6786,6787,6788]],"properties":{"id":"24661563","dp":18218,"de":0}},{"type":"Polygon","arcs":[[6789,6790,-6785,-6783,-6780]],"properties":{"id":"24661564","dp":32313,"de":2313}},{"type":"Polygon","arcs":[[-6774,6791,-6790,-6776]],"properties":{"id":"24661566","dp":48333,"de":0}},{"type":"Polygon","arcs":[[6792,6793,6794,6795,6796,6797,6798,-3551,-5564,-6786,-6791,-6792,-6773]],"properties":{"id":"24661567","dp":1490,"de":5112}},{"type":"Polygon","arcs":[[6799,-6798,6800,6801]],"properties":{"id":"24661568","dp":2638,"de":303}},{"type":"Polygon","arcs":[[6802,-6801,-6797,6803]],"properties":{"id":"24661569","dp":2676,"de":254}},{"type":"Polygon","arcs":[[6804,6805,6806,6807,6808,6809,6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820]],"properties":{"id":"24662942","dp":540,"de":977}},{"type":"Polygon","arcs":[[6821,6822,6823,-6811]],"properties":{"id":"24662943","dp":5099,"de":0}},{"type":"Polygon","arcs":[[6824,6825,-6812,-6824]],"properties":{"id":"24662944","dp":5075,"de":0}},{"type":"Polygon","arcs":[[-6826,-6813]],"properties":{"id":"24662945","dp":7296,"de":0}},{"type":"Polygon","arcs":[[-6823,6826,6827,6828,-6814,-6825]],"properties":{"id":"24662946","dp":5824,"de":0}},{"type":"Polygon","arcs":[[-909,-890,6829,6830,-6828,6831]],"properties":{"id":"24662947","dp":2837,"de":439}},{"type":"Polygon","arcs":[[6832,6833,6834,-1466]],"properties":{"id":"24661672","dp":11859,"de":2743}},{"type":"Polygon","arcs":[[6835,-5436]],"properties":{"id":"24663161","dp":3638,"de":0}},{"type":"Polygon","arcs":[[-6836,-5435]],"properties":{"id":"24663162","dp":3481,"de":0}},{"type":"Polygon","arcs":[[-5656,-5664,6836,6837,6838,-5631,-5639,-5439]],"properties":{"id":"24663050","dp":1456,"de":2365}},{"type":"Polygon","arcs":[[-6839,6839,6840,-5618,-5632]],"properties":{"id":"24663051","dp":4317,"de":469}},{"type":"Polygon","arcs":[[-6841,6841,-5619]],"properties":{"id":"24663052","dp":2500,"de":0}},{"type":"MultiPolygon","arcs":[[[-6840,-6838,6842,6843,-5609,-5620,-6842]],[[6844]]],"properties":{"id":"24663053","dp":4247,"de":273}},{"type":"Polygon","arcs":[[6845,6846,-6623,-6616]],"properties":{"id":"24662802","dp":9247,"de":0}},{"type":"Polygon","arcs":[[6847,6848,6849,-6624,-6847]],"properties":{"id":"24662803","dp":9469,"de":0}},{"type":"Polygon","arcs":[[6850,-6514,6851,6852,-6615,-6601]],"properties":{"id":"24662804","dp":8281,"de":1615}},{"type":"Polygon","arcs":[[-6524,-6515,-6851,-6600,6853,-6531]],"properties":{"id":"24662805","dp":6032,"de":2526}},{"type":"Polygon","arcs":[[-6532,-6854,-6598,-6539]],"properties":{"id":"24662806","dp":14884,"de":1156}},{"type":"Polygon","arcs":[[6854,6855,6856,6857,6858,6859]],"properties":{"id":"24662807","dp":4530,"de":729}},{"type":"Polygon","arcs":[[6860,6861,6862,6863,-6860]],"properties":{"id":"24662808","dp":6016,"de":0}},{"type":"Polygon","arcs":[[6864,-6861,-6859,6865,6866]],"properties":{"id":"24662809","dp":3980,"de":717}},{"type":"Polygon","arcs":[[6867,-6866,6868,6869,6870]],"properties":{"id":"24662810","dp":3325,"de":1836}},{"type":"Polygon","arcs":[[-6870,6871,6872,6873]],"properties":{"id":"24662811","dp":6633,"de":685}},{"type":"Polygon","arcs":[[-6873,6874,6875,6876]],"properties":{"id":"24662812","dp":5492,"de":2710}},{"type":"Polygon","arcs":[[-6876,6877,-3560,6878,6879]],"properties":{"id":"24662813","dp":12181,"de":3454}},{"type":"Polygon","arcs":[[6880,-6877,-6880,6881,6882]],"properties":{"id":"24662814","dp":19191,"de":0}},{"type":"Polygon","arcs":[[6883,-6883,6884,6885,6886,6887,6888]],"properties":{"id":"24662815","dp":23152,"de":0}},{"type":"Polygon","arcs":[[6889,6890,6891,-6885,6892]],"properties":{"id":"24662816","dp":18819,"de":0}},{"type":"Polygon","arcs":[[6893,-6893,-6882,-6879,-3563,-3580]],"properties":{"id":"24662817","dp":3026,"de":2098}},{"type":"Polygon","arcs":[[-6858,6894,6895,-3561,-6878,-6875,-6872,-6869]],"properties":{"id":"24662819","dp":8716,"de":591}},{"type":"MultiPolygon","arcs":[[[-883,6896,6897,6898,-6896,6899,-871,-878]],[[6900]],[[6901]]],"properties":{"id":"24662821","dp":5191,"de":857}},{"type":"Polygon","arcs":[[6902,6903,-4241,6904,6905]],"properties":{"id":"24661485","dp":7704,"de":1130}},{"type":"Polygon","arcs":[[-3183,-2294,-6905,-4245,-1903,-3190]],"properties":{"id":"24661486","dp":12156,"de":3317}},{"type":"Polygon","arcs":[[6906,6907,-4242,-6904]],"properties":{"id":"24661487","dp":18454,"de":0}},{"type":"Polygon","arcs":[[6908,-6907,6909]],"properties":{"id":"24661488","dp":9503,"de":793}},{"type":"Polygon","arcs":[[6910,6911,-4259,-4251,-4250,-4246,-4243,-6908,-6909]],"properties":{"id":"24661489","dp":7408,"de":0}},{"type":"Polygon","arcs":[[6912,-4256,-6912,6913,6914]],"properties":{"id":"24661490","dp":11955,"de":0}},{"type":"Polygon","arcs":[[6915,-4262,-6913,6916]],"properties":{"id":"24661491","dp":5716,"de":1286}},{"type":"Polygon","arcs":[[6917,6918,-4270,-6916]],"properties":{"id":"24661492","dp":14933,"de":3833}},{"type":"Polygon","arcs":[[6919,-6762,6920,6921]],"properties":{"id":"24662836","dp":7163,"de":1242}},{"type":"Polygon","arcs":[[6922,-6763,-6920,6923]],"properties":{"id":"24662837","dp":6030,"de":0}},{"type":"Polygon","arcs":[[6924,6925,-6924]],"properties":{"id":"24662838","dp":3175,"de":0}},{"type":"Polygon","arcs":[[-3576,6926,6927,-6925,-6922,6928,6929]],"properties":{"id":"24662839","dp":1409,"de":1983}},{"type":"Polygon","arcs":[[6930,6931,6932,-6927]],"properties":{"id":"24662840","dp":9553,"de":0}},{"type":"Polygon","arcs":[[6933,6934,-6928,-6933,6935,6936,6937]],"properties":{"id":"24662841","dp":4500,"de":1416}},{"type":"Polygon","arcs":[[-6934,6938,6939]],"properties":{"id":"24662842","dp":9608,"de":0}},{"type":"Polygon","arcs":[[-6754,-6755,-6760,-6923,-6926,-6935,-6940,6940]],"properties":{"id":"24662843","dp":3677,"de":1180}},{"type":"Polygon","arcs":[[-6936,-6932,6941,6942,6943]],"properties":{"id":"24662844","dp":3318,"de":0}},{"type":"Polygon","arcs":[[6944,-6942,-6931,-3584]],"properties":{"id":"24662845","dp":5077,"de":0}},{"type":"Polygon","arcs":[[-3562,-6899,6945,-3581]],"properties":{"id":"24662848","dp":7466,"de":0}},{"type":"Polygon","arcs":[[6946,6947,6948,6949]],"properties":{"id":"24661519","dp":14224,"de":4176}},{"type":"Polygon","arcs":[[6950,6951,6952,6953,6954,-6947]],"properties":{"id":"24661520","dp":8110,"de":5381}},{"type":"Polygon","arcs":[[-3686,-4307,6955,6956,6957,-6948,-6955,6958]],"properties":{"id":"24661521","dp":7769,"de":14124}},{"type":"Polygon","arcs":[[6959,6960,-3390,-3687,-6959,6961]],"properties":{"id":"24661522","dp":9824,"de":6955}},{"type":"Polygon","arcs":[[6962,6963,6964,-6960,6965]],"properties":{"id":"24661523","dp":20044,"de":13053}},{"type":"Polygon","arcs":[[6966,6967,6968,6969,-6964,6970]],"properties":{"id":"24661524","dp":14770,"de":5045}},{"type":"Polygon","arcs":[[6971,6972,6973,6974,6975,-6968,6976,6977]],"properties":{"id":"24661525","dp":16561,"de":4731}},{"type":"Polygon","arcs":[[6978,6979,-6977,6980]],"properties":{"id":"24661526","dp":19583,"de":2604}},{"type":"Polygon","arcs":[[6981,6982,-6978,-6980]],"properties":{"id":"24661527","dp":21813,"de":0}},{"type":"Polygon","arcs":[[6983,6984,-6972,-6983]],"properties":{"id":"24661528","dp":27283,"de":2890}},{"type":"Polygon","arcs":[[6985,6986,-6985]],"properties":{"id":"24661529","dp":24125,"de":5312}},{"type":"Polygon","arcs":[[-6607,6987,6988,-6986,-6984,-6982,-6979,6989,-4721]],"properties":{"id":"24661530","dp":6718,"de":3696}},{"type":"Polygon","arcs":[[6990,6991,6992,-6973,-6987,-6989]],"properties":{"id":"24661531","dp":20208,"de":5555}},{"type":"Polygon","arcs":[[6993,6994,-3783,6995]],"properties":{"id":"24662928","dp":4422,"de":402}},{"type":"Polygon","arcs":[[6996,6997,-6994,6998,6999,7000]],"properties":{"id":"24662929","dp":3719,"de":5212}},{"type":"Polygon","arcs":[[-6995,-6998,7001,7002,-3778]],"properties":{"id":"24662930","dp":4861,"de":0}},{"type":"Polygon","arcs":[[-3779,-7003,7003,7004]],"properties":{"id":"24662931","dp":3678,"de":0}},{"type":"Polygon","arcs":[[-3657,-7005,7005,-3636,-3641,-3654]],"properties":{"id":"24662932","dp":6625,"de":0}},{"type":"Polygon","arcs":[[-6835,7006,-2256,7007,7008,7009]],"properties":{"id":"24661673","dp":15104,"de":2022}},{"type":"Polygon","arcs":[[7010,-7008,-2259,-2253,7011,-1390]],"properties":{"id":"24661674","dp":12972,"de":1380}},{"type":"Polygon","arcs":[[-1391,-7012,-3585,7012]],"properties":{"id":"24661675","dp":11932,"de":0}},{"type":"Polygon","arcs":[[-1440,-7013,-2250,7013]],"properties":{"id":"24661676","dp":18614,"de":2164}},{"type":"Polygon","arcs":[[-1441,-7014,-2252,7014]],"properties":{"id":"24661677","dp":17160,"de":0}},{"type":"Polygon","arcs":[[-1442,-7015,-2245,7015]],"properties":{"id":"24661678","dp":7049,"de":0}},{"type":"Polygon","arcs":[[-1443,-7016,-2249,-2241,7016]],"properties":{"id":"24661679","dp":3646,"de":0}},{"type":"Polygon","arcs":[[-7017,-2244,7017,-1445]],"properties":{"id":"24661680","dp":13592,"de":1219}},{"type":"Polygon","arcs":[[-7018,7018,7019,-1448]],"properties":{"id":"24661681","dp":11264,"de":1340}},{"type":"Polygon","arcs":[[-7020,7020,-1534,7021,7022]],"properties":{"id":"24661682","dp":5823,"de":608}},{"type":"Polygon","arcs":[[-1449,-7023,7023,7024]],"properties":{"id":"24661683","dp":10484,"de":2222}},{"type":"Polygon","arcs":[[-7024,-7022,7025,7026]],"properties":{"id":"24661684","dp":12403,"de":0}},{"type":"Polygon","arcs":[[-7026,-1537,7027,7028]],"properties":{"id":"24661685","dp":14946,"de":0}},{"type":"Polygon","arcs":[[-1450,-7025,-7027,-7029,7029,7030]],"properties":{"id":"24661686","dp":6037,"de":1596}},{"type":"Polygon","arcs":[[-7030,-7028,7031,7032,7033,-3491]],"properties":{"id":"24661687","dp":8422,"de":0}},{"type":"Polygon","arcs":[[-7034,7034,-1750,-3833,-3492]],"properties":{"id":"24661688","dp":3666,"de":1681}},{"type":"Polygon","arcs":[[-7033,7035,-7035]],"properties":{"id":"24661689","dp":11156,"de":0}},{"type":"Polygon","arcs":[[-1536,-1736,-1742,-1746,-7036,-7032]],"properties":{"id":"24661690","dp":4255,"de":2097}},{"type":"Polygon","arcs":[[7036,-3149,-3097,-3096,-3092,7037,-3084,-3077,-4954]],"properties":{"id":"24663054","dp":1808,"de":386}},{"type":"Polygon","arcs":[[-7038,-3094,-3087,7038,-3085]],"properties":{"id":"24663055","dp":2806,"de":0}},{"type":"Polygon","arcs":[[-3091,-3079,-3086,-7039]],"properties":{"id":"24663056","dp":3577,"de":0}},{"type":"Polygon","arcs":[[7039,7040,7041,7042,-5830]],"properties":{"id":"24661826","dp":17040,"de":3582}},{"type":"Polygon","arcs":[[-5109,7043,7044,-7042,7045]],"properties":{"id":"24661827","dp":5877,"de":1779}},{"type":"Polygon","arcs":[[-5110,-7046,-7041,7046]],"properties":{"id":"24661828","dp":14654,"de":4608}},{"type":"Polygon","arcs":[[7047,-7047,-7040,-5826,-5807,-5811,-5813]],"properties":{"id":"24661829","dp":11941,"de":5036}},{"type":"Polygon","arcs":[[7048,-5104,-5106,-7048,-5816,-5818]],"properties":{"id":"24661830","dp":13383,"de":6565}},{"type":"Polygon","arcs":[[-5492,-5486,7049,-5101,-7049,-5817]],"properties":{"id":"24661831","dp":14793,"de":3793}},{"type":"Polygon","arcs":[[7050,-5099,-7050,-5485]],"properties":{"id":"24661832","dp":19090,"de":3846}},{"type":"Polygon","arcs":[[-5484,-6707,-5481,-5100,-7051]],"properties":{"id":"24661833","dp":12399,"de":12526}},{"type":"Polygon","arcs":[[7051,7052,7053,7054,7055]],"properties":{"id":"24661457","dp":18027,"de":2916}},{"type":"Polygon","arcs":[[7056,7057,-7052]],"properties":{"id":"24661458","dp":18820,"de":3589}},{"type":"Polygon","arcs":[[7058,7059,-7058,7060]],"properties":{"id":"24661459","dp":16330,"de":4357}},{"type":"Polygon","arcs":[[7061,7062,-7053,-7060]],"properties":{"id":"24661460","dp":13878,"de":2803}},{"type":"Polygon","arcs":[[-7054,-7063,7063,7064,7065,7066]],"properties":{"id":"24661461","dp":17252,"de":2266}},{"type":"Polygon","arcs":[[7067,7068,-7066,7069]],"properties":{"id":"24661462","dp":14907,"de":2314}},{"type":"Polygon","arcs":[[-7068,7070,7071,7072,7073,7074]],"properties":{"id":"24661463","dp":11728,"de":6558}},{"type":"Polygon","arcs":[[-7074,7075,7076,7077,7078]],"properties":{"id":"24661464","dp":10497,"de":5231}},{"type":"Polygon","arcs":[[7079,7080,-7076,-7073]],"properties":{"id":"24661465","dp":12769,"de":1798}},{"type":"Polygon","arcs":[[-7081,7081,7082,7083,7084,-7077]],"properties":{"id":"24661466","dp":8604,"de":9660}},{"type":"Polygon","arcs":[[-7085,7085,7086,7087]],"properties":{"id":"24661467","dp":10199,"de":8890}},{"type":"Polygon","arcs":[[7088,7089,7090,-480,-486,-487,-497,7091,7092,7093,7094,7095,-6806,7096]],"properties":{"id":"24662905","dp":72,"de":354}},{"type":"Polygon","arcs":[[7097,7098,7099,-1400,-4665,-1396,-1405,7100,-7093]],"properties":{"id":"24662906","dp":853,"de":110}},{"type":"Polygon","arcs":[[7101,-4666,-1401,-7100]],"properties":{"id":"24662907","dp":5283,"de":0}},{"type":"Polygon","arcs":[[-683,-4664,-7102,-7099,7102]],"properties":{"id":"24662908","dp":18464,"de":0}},{"type":"Polygon","arcs":[[-3925,7103,-667,-670,-672,-676,-684,-7103,-7098,-7092,-496,-3921]],"properties":{"id":"24662909","dp":5218,"de":1097}},{"type":"Polygon","arcs":[[-656,-658,-668,-7104,-3924,-3928,-3931]],"properties":{"id":"24662910","dp":11536,"de":1696}},{"type":"Polygon","arcs":[[7104,-7089,7105,7106,7107]],"properties":{"id":"24662911","dp":1531,"de":846}},{"type":"Polygon","arcs":[[-7090,-7105,7108,7109,7110]],"properties":{"id":"24662912","dp":6269,"de":0}},{"type":"Polygon","arcs":[[-7109,7111,7112]],"properties":{"id":"24662913","dp":5594,"de":0}},{"type":"Polygon","arcs":[[7113,-7110,-7113,7114,-1159,-465,-468,-471]],"properties":{"id":"24662914","dp":4598,"de":655}},{"type":"Polygon","arcs":[[-7091,-7111,-7114,-470,-477]],"properties":{"id":"24662915","dp":6083,"de":979}},{"type":"Polygon","arcs":[[7115,7116,7117,-7115,-7112,-7108]],"properties":{"id":"24662916","dp":3201,"de":2302}},{"type":"Polygon","arcs":[[-1160,-7118,7118,7119,-1143,-1150,-1156]],"properties":{"id":"24662917","dp":3547,"de":1924}},{"type":"Polygon","arcs":[[7120,-7119,-7117,7121]],"properties":{"id":"24662918","dp":8833,"de":0}},{"type":"Polygon","arcs":[[7122,7123,7124,-4409,-3129,7125,-3559,-4492,-5573,-5566]],"properties":{"id":"24661603","dp":307,"de":4543}},{"type":"Polygon","arcs":[[-7126,-3128,7126,-3555]],"properties":{"id":"24661606","dp":27500,"de":0}},{"type":"Polygon","arcs":[[-7127,-3127,-4500,-3556]],"properties":{"id":"24661609","dp":18665,"de":0}},{"type":"Polygon","arcs":[[-4289,-3476,-4288,-595,-584,-5569]],"properties":{"id":"24661611","dp":7078,"de":5486}},{"type":"Polygon","arcs":[[7127,7128,7129,7130,-6787,-5570,-4206]],"properties":{"id":"24661614","dp":11031,"de":0}},{"type":"Polygon","arcs":[[7131,7132,-6788,-7131]],"properties":{"id":"24661615","dp":32801,"de":0}},{"type":"Polygon","arcs":[[7133,-6789,-7133]],"properties":{"id":"24661616","dp":27903,"de":3493}},{"type":"Polygon","arcs":[[7134,7135,-7130,7136]],"properties":{"id":"24661617","dp":18058,"de":0}},{"type":"Polygon","arcs":[[7137,-7137,-7129,7138]],"properties":{"id":"24661618","dp":27520,"de":1377}},{"type":"Polygon","arcs":[[-2940,-918,7139,7140,-4457]],"properties":{"id":"24661619","dp":4711,"de":1334}},{"type":"Polygon","arcs":[[-7004,-7002,7141,7142,-3635,-7006]],"properties":{"id":"24662933","dp":1588,"de":2410}},{"type":"Polygon","arcs":[[7143,7144,7145,-7143]],"properties":{"id":"24662934","dp":2106,"de":0}},{"type":"Polygon","arcs":[[7146,-1127,-3623,-3629,-3465,-3632,-7146]],"properties":{"id":"24662935","dp":982,"de":375}},{"type":"Polygon","arcs":[[7147,7148,7149,7150]],"properties":{"id":"24661636","dp":10835,"de":1284}},{"type":"Polygon","arcs":[[7151,7152,7153,-7148]],"properties":{"id":"24661637","dp":10254,"de":5090}},{"type":"Polygon","arcs":[[7154,7155,-7153,7156]],"properties":{"id":"24661638","dp":14758,"de":0}},{"type":"Polygon","arcs":[[7157,7158,7159,-7155,7160,7161]],"properties":{"id":"24661639","dp":10641,"de":2540}},{"type":"Polygon","arcs":[[7162,7163,7164,-7158,7165]],"properties":{"id":"24661640","dp":16422,"de":4743}},{"type":"Polygon","arcs":[[7166,7167,7168,-7163,7169,7170]],"properties":{"id":"24661641","dp":13275,"de":3658}},{"type":"Polygon","arcs":[[7171,7172,-7167,7173]],"properties":{"id":"24661642","dp":14177,"de":1973}},{"type":"Polygon","arcs":[[7174,7175,7176,-7172]],"properties":{"id":"24661643","dp":14590,"de":1803}},{"type":"Polygon","arcs":[[7177,7178,7179,-7176]],"properties":{"id":"24661644","dp":15390,"de":1950}},{"type":"Polygon","arcs":[[-7087,7180,-7179,7181]],"properties":{"id":"24661645","dp":19844,"de":3115}},{"type":"Polygon","arcs":[[7182,-7182,7183,7184]],"properties":{"id":"24661646","dp":11585,"de":2743}},{"type":"Polygon","arcs":[[-7078,-7088,-7183,7185]],"properties":{"id":"24661647","dp":12103,"de":5469}},{"type":"Polygon","arcs":[[7186,-7184,-7178,7187]],"properties":{"id":"24661648","dp":15555,"de":2083}},{"type":"Polygon","arcs":[[7188,-7188,-7175,7189]],"properties":{"id":"24661649","dp":13627,"de":6372}},{"type":"Polygon","arcs":[[-7190,-7174,7190,7191]],"properties":{"id":"24661650","dp":14983,"de":2786}},{"type":"Polygon","arcs":[[-7191,-7171,7192,7193]],"properties":{"id":"24661651","dp":16678,"de":1384}},{"type":"Polygon","arcs":[[-7193,-7170,7194,7195]],"properties":{"id":"24661652","dp":13893,"de":2666}},{"type":"Polygon","arcs":[[-7195,-7166,7196,7197,7198]],"properties":{"id":"24661653","dp":11914,"de":3710}},{"type":"Polygon","arcs":[[-7197,-7162,7199,7200,7201]],"properties":{"id":"24661654","dp":15430,"de":2049}},{"type":"Polygon","arcs":[[-7200,-7161,7202,7203]],"properties":{"id":"24661655","dp":15183,"de":0}},{"type":"Polygon","arcs":[[-1501,-7203,-7157,7204]],"properties":{"id":"24661656","dp":13046,"de":1562}},{"type":"Polygon","arcs":[[-7205,-7152,7205,-1497]],"properties":{"id":"24661657","dp":14362,"de":2684}},{"type":"Polygon","arcs":[[-7206,-7151,7206,-1492]],"properties":{"id":"24661658","dp":11503,"de":2534}},{"type":"Polygon","arcs":[[-7207,7207,7208,7209,-5762,-5760]],"properties":{"id":"24661659","dp":9249,"de":1657}},{"type":"Polygon","arcs":[[-7084,7210,7211,7212,-7086]],"properties":{"id":"24661468","dp":8863,"de":7410}},{"type":"Polygon","arcs":[[7213,7214,-7181,-7213]],"properties":{"id":"24661469","dp":14171,"de":4294}},{"type":"Polygon","arcs":[[-7180,-7215,7215,7216]],"properties":{"id":"24661470","dp":13006,"de":2972}},{"type":"Polygon","arcs":[[-7177,-7217,7217,7218]],"properties":{"id":"24661471","dp":12579,"de":3184}},{"type":"Polygon","arcs":[[-7219,7219,7220,-7173]],"properties":{"id":"24661472","dp":12709,"de":2580}},{"type":"Polygon","arcs":[[-7221,7221,7222,-7168]],"properties":{"id":"24661473","dp":9940,"de":6804}},{"type":"Polygon","arcs":[[-7169,-7223,7223,7224]],"properties":{"id":"24661474","dp":14274,"de":2745}},{"type":"Polygon","arcs":[[-7164,-7225,7225,7226]],"properties":{"id":"24661475","dp":13307,"de":3149}},{"type":"Polygon","arcs":[[-7165,-7227,7227,7228]],"properties":{"id":"24661476","dp":13065,"de":0}},{"type":"Polygon","arcs":[[-7229,7229,7230,7231,-7159]],"properties":{"id":"24661477","dp":14345,"de":2182}},{"type":"Polygon","arcs":[[-7232,7232,7233,-7160]],"properties":{"id":"24661478","dp":16908,"de":4389}},{"type":"Polygon","arcs":[[-7234,7234,-6918,7235,-7154,-7156]],"properties":{"id":"24661479","dp":14762,"de":1939}},{"type":"Polygon","arcs":[[-7149,-7236,-6917,7236,7237]],"properties":{"id":"24661480","dp":8243,"de":3399}},{"type":"Polygon","arcs":[[7238,-7237,-6915,7239,7240]],"properties":{"id":"24661481","dp":12135,"de":1941}},{"type":"Polygon","arcs":[[7241,-7240,-6914,-6911,7242,7243]],"properties":{"id":"24661482","dp":12693,"de":2552}},{"type":"Polygon","arcs":[[-7244,7244,7245,7246,7247]],"properties":{"id":"24661483","dp":8645,"de":1181}},{"type":"Polygon","arcs":[[-7243,-6910,-6903,-7245]],"properties":{"id":"24661484","dp":11379,"de":1819}},{"type":"Polygon","arcs":[[-5114,-5120,-5126,7248,7249,7250,-7044,-5108]],"properties":{"id":"24661966","dp":7873,"de":3232}},{"type":"Polygon","arcs":[[7251,7252,7253,7254,7255,-7251,7256,7257,7258,-7198,7259]],"properties":{"id":"24661967","dp":3177,"de":3564}},{"type":"Polygon","arcs":[[-7252,7260,7261,7262,7263]],"properties":{"id":"24661968","dp":13015,"de":2763}},{"type":"Polygon","arcs":[[7264,-7263,7265,7266,7267]],"properties":{"id":"24661969","dp":18865,"de":2835}},{"type":"Polygon","arcs":[[-7254,7268,-7268,7269,7270,7271,7272]],"properties":{"id":"24661970","dp":11617,"de":5024}},{"type":"Polygon","arcs":[[7273,-7270,-7267,-1502,-1495,-5753]],"properties":{"id":"24661971","dp":13829,"de":4255}},{"type":"Polygon","arcs":[[-6745,-5256,-5250,-5246,-5240,7274]],"properties":{"id":"24663114","dp":1217,"de":108}},{"type":"Polygon","arcs":[[7275,-5254,7276,7277,-6743,-7275,-5239,7278]],"properties":{"id":"24663115","dp":693,"de":123}},{"type":"Polygon","arcs":[[7279,7280,7281,-6414,-6412]],"properties":{"id":"24662579","dp":7222,"de":3378}},{"type":"Polygon","arcs":[[7282,7283,7284,-7280,-6411,7285]],"properties":{"id":"24662580","dp":8328,"de":3391}},{"type":"Polygon","arcs":[[-547,7286,-7283,7287]],"properties":{"id":"24662581","dp":11340,"de":1250}},{"type":"Polygon","arcs":[[-2357,7288,7289,7290,-7284,-7287]],"properties":{"id":"24662582","dp":10340,"de":2086}},{"type":"Polygon","arcs":[[-548,-7288,-7286,-6410,7291]],"properties":{"id":"24662583","dp":6255,"de":755}},{"type":"Polygon","arcs":[[-538,-7292,-6409,-6597]],"properties":{"id":"24662584","dp":9332,"de":1824}},{"type":"Polygon","arcs":[[-6364,7292,-6637,-6639,7293,7294,-1651,-3588]],"properties":{"id":"24662967","dp":1778,"de":3217}},{"type":"Polygon","arcs":[[-6363,-6604,-6622,-6634,-7293]],"properties":{"id":"24662968","dp":7128,"de":0}},{"type":"Polygon","arcs":[[-1216,7295,-1629,-1633,-1637,-1641,-1647,-1652,7296,-1624]],"properties":{"id":"24662969","dp":657,"de":2500}},{"type":"Polygon","arcs":[[-1630,-7296,-1215,-1429]],"properties":{"id":"24662970","dp":11054,"de":1318}},{"type":"Polygon","arcs":[[7297,7298,-6305,-6426,-6345,7299]],"properties":{"id":"24662971","dp":9022,"de":0}},{"type":"Polygon","arcs":[[-1828,-4920,-4922,-4924,-4925,-4927,7300,-4932,7301]],"properties":{"id":"24662972","dp":4122,"de":3140}},{"type":"Polygon","arcs":[[-7302,-4931,-7300,-1829]],"properties":{"id":"24662973","dp":6364,"de":1612}},{"type":"Polygon","arcs":[[7302,7303,7304,-7298,-4930]],"properties":{"id":"24662974","dp":9606,"de":0}},{"type":"Polygon","arcs":[[7305,7306,7307,-7304]],"properties":{"id":"24662975","dp":11605,"de":0}},{"type":"Polygon","arcs":[[-7308,7308,7309,7310,-6303,-6306,-7299,-7305]],"properties":{"id":"24662976","dp":2804,"de":0}},{"type":"Polygon","arcs":[[-7307,7311,7312,-7309]],"properties":{"id":"24662977","dp":8587,"de":0}},{"type":"Polygon","arcs":[[7313,7314,-7312,7315]],"properties":{"id":"24662978","dp":8765,"de":2839}},{"type":"Polygon","arcs":[[7316,7317,-7316,-7306,-7303,-4935,-4940]],"properties":{"id":"24662979","dp":5790,"de":604}},{"type":"Polygon","arcs":[[7318,7319,-4892,-4896,-4117,-4118]],"properties":{"id":"24662980","dp":13309,"de":0}},{"type":"Polygon","arcs":[[-4320,-3796,-4893,-7320,7320,-4129,-4131]],"properties":{"id":"24662981","dp":3753,"de":531}},{"type":"Polygon","arcs":[[-7321,-7319,-4121,-4125]],"properties":{"id":"24662982","dp":21013,"de":1843}},{"type":"Polygon","arcs":[[7321,7322,7323,7324]],"properties":{"id":"24662983","dp":4104,"de":0}},{"type":"Polygon","arcs":[[7325,7326,-7322,7327,7328,-5978]],"properties":{"id":"24662984","dp":694,"de":59}},{"type":"Polygon","arcs":[[7329,7330,7331,-6804,-6796]],"properties":{"id":"24661570","dp":1675,"de":646}},{"type":"Polygon","arcs":[[7332,7333,7334,7335,-7330,-6795]],"properties":{"id":"24661571","dp":3139,"de":419}},{"type":"Polygon","arcs":[[7336,-7335,7337,7338]],"properties":{"id":"24661572","dp":8257,"de":891}},{"type":"Polygon","arcs":[[-6605,-6491,-2861,7339,7340,-7339,7341]],"properties":{"id":"24661573","dp":4632,"de":2777}},{"type":"Polygon","arcs":[[7342,7343,7344,-7331,-7336,-7337,-7341]],"properties":{"id":"24661574","dp":3764,"de":329}},{"type":"Polygon","arcs":[[7345,-7332,-7345,7346]],"properties":{"id":"24661575","dp":6144,"de":652}},{"type":"Polygon","arcs":[[7347,7348,7349,-7347,-7344]],"properties":{"id":"24661576","dp":5741,"de":1770}},{"type":"Polygon","arcs":[[-7350,7350,7351,7352,-6803,-7346]],"properties":{"id":"24661577","dp":4896,"de":1349}},{"type":"Polygon","arcs":[[7353,7354,7355,7356,-7352]],"properties":{"id":"24661578","dp":3561,"de":2340}},{"type":"Polygon","arcs":[[7357,7358,7359,-7355,7360]],"properties":{"id":"24661579","dp":13350,"de":2094}},{"type":"Polygon","arcs":[[7361,7362,-7361,-7354,-7351,7363]],"properties":{"id":"24661580","dp":5877,"de":1084}},{"type":"Polygon","arcs":[[-917,7364,-7364,-7349,7365,-7140]],"properties":{"id":"24661581","dp":2279,"de":1302}},{"type":"Polygon","arcs":[[-921,-937,7366,-7362,-7365,-916]],"properties":{"id":"24661582","dp":3033,"de":380}},{"type":"Polygon","arcs":[[7367,7368,7369,7370,7371,7372,7373,7374,7375,-397,7376]],"properties":{"id":"24662067","dp":0,"de":4307}},{"type":"Polygon","arcs":[[7377,7378,-384,7379]],"properties":{"id":"24662069","dp":13885,"de":0}},{"type":"Polygon","arcs":[[7380,7381,7382,-7378,7383,7384]],"properties":{"id":"24662070","dp":13016,"de":0}},{"type":"Polygon","arcs":[[7385,7386,7387,-7381]],"properties":{"id":"24662071","dp":23709,"de":0}},{"type":"Polygon","arcs":[[-7278,7388,-5252,-5258,-6744]],"properties":{"id":"24663116","dp":1197,"de":230}},{"type":"Polygon","arcs":[[-7277,-5253,-7389]],"properties":{"id":"24663117","dp":1178,"de":0}},{"type":"Polygon","arcs":[[-6113,-5255,-7276,7389,7390,7391,7392,7393,-5145,-5148,7394,-5172],[-5151,-5152]],"properties":{"id":"24663118","dp":122,"de":297}},{"type":"Polygon","arcs":[[-5138,-5146,-7394,7395]],"properties":{"id":"24663119","dp":1488,"de":3982}},{"type":"Polygon","arcs":[[7396,-5139,-7396,-7393,7397]],"properties":{"id":"24663120","dp":3795,"de":596}},{"type":"Polygon","arcs":[[-7398,-7392,7398]],"properties":{"id":"24663121","dp":3712,"de":1164}},{"type":"Polygon","arcs":[[-7399,-7391,7399,-5140,-7397]],"properties":{"id":"24663122","dp":3883,"de":2478}},{"type":"Polygon","arcs":[[-6114,7400,-5167,-5169,-5165,-5878,-5870,-5184,-6117]],"properties":{"id":"24663407","dp":1668,"de":0}},{"type":"Polygon","arcs":[[-5399,-3436]],"properties":{"id":"24663164","dp":2687,"de":1734}},{"type":"Polygon","arcs":[[-5448,7401,-5445,-5451,7402,7403,-5453,-3438,-5398,7404,7405,7406]],"properties":{"id":"24663166","dp":1449,"de":3685}},{"type":"Polygon","arcs":[[7407,-7405,-5397,7408,7409]],"properties":{"id":"24663167","dp":2844,"de":0}},{"type":"Polygon","arcs":[[-5441,-7402,-5447]],"properties":{"id":"24663168","dp":3333,"de":542}},{"type":"Polygon","arcs":[[7410,-4272,-4271,-6919,-7235,-7233]],"properties":{"id":"24661493","dp":14917,"de":1543}},{"type":"Polygon","arcs":[[7411,-4101,-7411,-7231]],"properties":{"id":"24661494","dp":31176,"de":0}},{"type":"Polygon","arcs":[[7412,-4105,-7412,-7230]],"properties":{"id":"24661495","dp":16679,"de":3754}},{"type":"Polygon","arcs":[[7413,-4108,-7413,-7228]],"properties":{"id":"24661496","dp":13100,"de":2131}},{"type":"Polygon","arcs":[[7414,7415,7416,-7387]],"properties":{"id":"24662072","dp":24268,"de":0}},{"type":"Polygon","arcs":[[7417,7418,7419,7420,-7416,7421,7422,7423,7424]],"properties":{"id":"24662073","dp":10919,"de":4245}},{"type":"Polygon","arcs":[[7425,7426,7427,7428,-7417,-7421]],"properties":{"id":"24662074","dp":13825,"de":1663}},{"type":"Polygon","arcs":[[-7429,7429,7430,-7388]],"properties":{"id":"24662075","dp":20565,"de":0}},{"type":"Polygon","arcs":[[-7431,7431,7432,-7382]],"properties":{"id":"24662076","dp":15990,"de":0}},{"type":"Polygon","arcs":[[-7383,-7433,7433,-385,-7379]],"properties":{"id":"24662077","dp":12444,"de":0}},{"type":"Polygon","arcs":[[7434,7435,-1388,-390]],"properties":{"id":"24662078","dp":14730,"de":0}},{"type":"Polygon","arcs":[[-1454,-1467,-7010,7436,-7435,-389]],"properties":{"id":"24662079","dp":10897,"de":1201}},{"type":"Polygon","arcs":[[-7437,-7009,-7011,-1389,-7436]],"properties":{"id":"24662080","dp":11847,"de":2653}},{"type":"Polygon","arcs":[[-5713,-5716,7437,7438]],"properties":{"id":"24661798","dp":15497,"de":6544}},{"type":"Polygon","arcs":[[-5714,-7439,7439,7440,-5709]],"properties":{"id":"24661799","dp":23933,"de":3080}},{"type":"Polygon","arcs":[[-5710,-7441,7441,7442]],"properties":{"id":"24661800","dp":25858,"de":0}},{"type":"Polygon","arcs":[[-5707,-7443,7443,7444,-5701]],"properties":{"id":"24661801","dp":7223,"de":3251}},{"type":"Polygon","arcs":[[7445,7446,7447,7448,-7444]],"properties":{"id":"24661802","dp":8200,"de":2197}},{"type":"Polygon","arcs":[[-7446,-7442,7449,7450]],"properties":{"id":"24661803","dp":24945,"de":2472}},{"type":"Polygon","arcs":[[-7440,7451,7452,7453,-7450]],"properties":{"id":"24661804","dp":20105,"de":4577}},{"type":"Polygon","arcs":[[-7438,7454,7455,-7452]],"properties":{"id":"24661805","dp":17472,"de":2361}},{"type":"Polygon","arcs":[[-5715,-5033,7456,7457,-7455]],"properties":{"id":"24661806","dp":18461,"de":3974}},{"type":"Polygon","arcs":[[-7453,-7456,-7458,7458,7459,7460]],"properties":{"id":"24661807","dp":19787,"de":4416}},{"type":"Polygon","arcs":[[-7454,-7461,7461,7462,7463,7464]],"properties":{"id":"24661808","dp":18647,"de":4713}},{"type":"Polygon","arcs":[[-7451,-7465,7465,-7447]],"properties":{"id":"24661809","dp":10440,"de":2422}},{"type":"Polygon","arcs":[[-7464,7466,7467,7468,7469,-7448,-7466]],"properties":{"id":"24661810","dp":9196,"de":6551}},{"type":"Polygon","arcs":[[-7467,-7463,7470,7471]],"properties":{"id":"24661811","dp":18634,"de":3614}},{"type":"Polygon","arcs":[[-7471,-7462,-7460,7472,7473]],"properties":{"id":"24661812","dp":19173,"de":3512}},{"type":"Polygon","arcs":[[-7473,-7459,7474,7475]],"properties":{"id":"24661813","dp":15366,"de":8494}},{"type":"Polygon","arcs":[[-7475,-7457,7476,7477,7478,7479]],"properties":{"id":"24661814","dp":12566,"de":3318}},{"type":"Polygon","arcs":[[-5032,7480,-7477]],"properties":{"id":"24661815","dp":15734,"de":7109}},{"type":"Polygon","arcs":[[7481,7482,-7481,-5031]],"properties":{"id":"24661816","dp":11709,"de":7952}},{"type":"Polygon","arcs":[[-5835,-5823,-5829,7483,7484,-7482]],"properties":{"id":"24661817","dp":12057,"de":5199}},{"type":"Polygon","arcs":[[-7485,7485,-7478,-7483]],"properties":{"id":"24661818","dp":20765,"de":0}},{"type":"Polygon","arcs":[[7486,7487,7488,7489,-7486]],"properties":{"id":"24661819","dp":17472,"de":3296}},{"type":"Polygon","arcs":[[-5828,-5833,7490,7491,7492,-7487,-7484]],"properties":{"id":"24661820","dp":12617,"de":5679}},{"type":"Polygon","arcs":[[-7493,7493,-7273,7494,-7488]],"properties":{"id":"24661821","dp":11378,"de":4407}},{"type":"Polygon","arcs":[[7495,7496,-939,-946,7497,7498]],"properties":{"id":"24661592","dp":3003,"de":0}},{"type":"Polygon","arcs":[[-945,7499,-7498]],"properties":{"id":"24661593","dp":9223,"de":0}},{"type":"Polygon","arcs":[[-7360,7500,-7499,-7500,-944,-3549,7501]],"properties":{"id":"24661594","dp":5594,"de":471}},{"type":"Polygon","arcs":[[-7356,-7502,-3554,7502]],"properties":{"id":"24661595","dp":3869,"de":455}},{"type":"Polygon","arcs":[[-7353,-7357,-7503,-3553,7503,-6802]],"properties":{"id":"24661597","dp":3066,"de":400}},{"type":"Polygon","arcs":[[-7504,-3552,-6799,-6800]],"properties":{"id":"24661598","dp":3017,"de":361}},{"type":"Polygon","arcs":[[7504,-4111,-7414,-7226]],"properties":{"id":"24661497","dp":13043,"de":1976}},{"type":"Polygon","arcs":[[7505,-4119,-4115,-4112,-7505,-7224,-7222]],"properties":{"id":"24661498","dp":5474,"de":23734}},{"type":"Polygon","arcs":[[-7506,-7220,-7218,-7216,7506,-4126,-4122]],"properties":{"id":"24661499","dp":10355,"de":1601}},{"type":"Polygon","arcs":[[7507,-4135,-4132,-4127,-7507,-7214,-7212]],"properties":{"id":"24661500","dp":8146,"de":4517}},{"type":"Polygon","arcs":[[-7508,-7211,7508,7509,-4136]],"properties":{"id":"24661501","dp":12047,"de":6428}},{"type":"Polygon","arcs":[[7510,7511,-4143,-7510,7512]],"properties":{"id":"24661502","dp":13410,"de":1589}},{"type":"Polygon","arcs":[[7513,-7513,-7509,-7083,7514]],"properties":{"id":"24661503","dp":14649,"de":3184}},{"type":"Polygon","arcs":[[7515,-4149,7516,-7511,-7514,7517]],"properties":{"id":"24661504","dp":15988,"de":8720}},{"type":"Polygon","arcs":[[-7517,-4146,-4139,-7512]],"properties":{"id":"24661505","dp":18595,"de":0}},{"type":"Polygon","arcs":[[7518,7519,-4152,-7516,7520]],"properties":{"id":"24661506","dp":19589,"de":5479}},{"type":"Polygon","arcs":[[7521,-4302,-4299,-7520,7522]],"properties":{"id":"24661507","dp":14609,"de":4687}},{"type":"Polygon","arcs":[[-6956,-4305,-7522,7523]],"properties":{"id":"24661508","dp":12172,"de":1114}},{"type":"Polygon","arcs":[[-6957,-7524,7524,7525,7526]],"properties":{"id":"24661509","dp":12715,"de":5387}},{"type":"Polygon","arcs":[[-7525,-7523,-7519,7527]],"properties":{"id":"24661510","dp":15028,"de":3693}},{"type":"Polygon","arcs":[[7528,-7521,-7518,-7515,-7082,-7080,-7072]],"properties":{"id":"24661513","dp":11255,"de":36595}},{"type":"Polygon","arcs":[[-7065,7529,7530,7531,-7071,-7070]],"properties":{"id":"24661514","dp":11062,"de":6941}},{"type":"Polygon","arcs":[[-7062,-7059,7532,7533,7534,-7530,-7064]],"properties":{"id":"24661515","dp":11259,"de":3827}},{"type":"Polygon","arcs":[[7535,7536,7537,-7533,7538]],"properties":{"id":"24661516","dp":13723,"de":7040}},{"type":"Polygon","arcs":[[-6951,-6950,7539,-7537,7540]],"properties":{"id":"24661517","dp":13107,"de":6265}},{"type":"Polygon","arcs":[[-7534,-7538,-7540,-6949,-6958,-7527,7541]],"properties":{"id":"24661518","dp":10919,"de":11069}},{"type":"Polygon","arcs":[[-5925,-1470,7542,7543]],"properties":{"id":"24661997","dp":11583,"de":1583}},{"type":"Polygon","arcs":[[-7543,-1469,7544,7545]],"properties":{"id":"24661998","dp":14210,"de":0}},{"type":"Polygon","arcs":[[7546,-7545,-1468,-1456,7547,7548]],"properties":{"id":"24661999","dp":13684,"de":1258}},{"type":"Polygon","arcs":[[7549,-7548,-1458,-1451,7550,7551]],"properties":{"id":"24662000","dp":13549,"de":1267}},{"type":"Polygon","arcs":[[7552,-7551,-1455,-388,7553]],"properties":{"id":"24662001","dp":15687,"de":0}},{"type":"Polygon","arcs":[[7554,7555,-7552,-7553,7556,7557]],"properties":{"id":"24662002","dp":16578,"de":2359}},{"type":"Polygon","arcs":[[-7557,-7554,-387,7558]],"properties":{"id":"24662003","dp":13910,"de":0}},{"type":"Polygon","arcs":[[7559,-7558,-7559,-386,-7434]],"properties":{"id":"24662004","dp":13737,"de":2706}},{"type":"Polygon","arcs":[[7560,7561,-7555,-7560,-7432]],"properties":{"id":"24662005","dp":16012,"de":1446}},{"type":"Polygon","arcs":[[-7428,7562,7563,7564,-7561,-7430]],"properties":{"id":"24662006","dp":17889,"de":1623}},{"type":"Polygon","arcs":[[-4458,-7141,-7366,-7348,-7343,-7340,-2860,-2847]],"properties":{"id":"24661620","dp":4479,"de":445}},{"type":"Polygon","arcs":[[-6990,7565,7566,7567,-6966,-6962,-6954,7568,-4727]],"properties":{"id":"24661621","dp":7933,"de":23795}},{"type":"Polygon","arcs":[[-6606,-7342,-7338,-7334,-6991,-6988]],"properties":{"id":"24661532","dp":2209,"de":4562}},{"type":"Polygon","arcs":[[-7333,7569,7570,7571,-6992]],"properties":{"id":"24661533","dp":22113,"de":2303}},{"type":"Polygon","arcs":[[-6993,-7572,7572,7573]],"properties":{"id":"24661534","dp":20646,"de":2985}},{"type":"Polygon","arcs":[[-6974,-7574,7574,7575]],"properties":{"id":"24661535","dp":23657,"de":2777}},{"type":"Polygon","arcs":[[-6975,-7576,7576,7577]],"properties":{"id":"24661536","dp":23127,"de":2132}},{"type":"Polygon","arcs":[[-6976,-7578,7578,7579]],"properties":{"id":"24661537","dp":24251,"de":3140}},{"type":"Polygon","arcs":[[-6969,-7580,7580,7581]],"properties":{"id":"24661538","dp":20189,"de":2606}},{"type":"Polygon","arcs":[[-6970,-7582,7582,7583]],"properties":{"id":"24661539","dp":24692,"de":2192}},{"type":"Polygon","arcs":[[-6965,-7584,7584,-6961]],"properties":{"id":"24661540","dp":25922,"de":0}},{"type":"Polygon","arcs":[[-7585,7585,-3391]],"properties":{"id":"24661541","dp":26096,"de":2673}},{"type":"Polygon","arcs":[[7586,7587,-7586,-7583]],"properties":{"id":"24661542","dp":18052,"de":0}},{"type":"Polygon","arcs":[[-7581,7588,7589,-7587]],"properties":{"id":"24661543","dp":21771,"de":0}},{"type":"Polygon","arcs":[[-7579,7590,7591,-7589]],"properties":{"id":"24661544","dp":21511,"de":2616}},{"type":"Polygon","arcs":[[-7575,7592,7593,-7591,-7577]],"properties":{"id":"24661545","dp":17464,"de":1424}},{"type":"Polygon","arcs":[[-7571,7594,7595,7596,-7593,-7573]],"properties":{"id":"24661546","dp":15792,"de":0}},{"type":"Polygon","arcs":[[-7570,-6794,7597,-7595]],"properties":{"id":"24661547","dp":37974,"de":0}},{"type":"Polygon","arcs":[[-7598,-6793,-6775,-6770,7598,-7596]],"properties":{"id":"24661548","dp":18980,"de":0}},{"type":"Polygon","arcs":[[-7597,-7599,-6766,7599,7600,-7594]],"properties":{"id":"24661549","dp":11074,"de":2399}},{"type":"Polygon","arcs":[[-7601,7601,7602,-7592]],"properties":{"id":"24661550","dp":20568,"de":0}},{"type":"Polygon","arcs":[[-7590,-7603,7603,-3392,-7588]],"properties":{"id":"24661551","dp":13873,"de":2747}},{"type":"Polygon","arcs":[[7604,-7139,-7128,-4205,-3393]],"properties":{"id":"24661554","dp":9649,"de":2192}},{"type":"Polygon","arcs":[[7605,-7135,-7138,-7605,-7604]],"properties":{"id":"24661555","dp":19215,"de":1260}},{"type":"Polygon","arcs":[[-7600,-6769,-6779,-6784,-7134,-7132,-7136,-7606,-7602]],"properties":{"id":"24661556","dp":6867,"de":1040}},{"type":"Polygon","arcs":[[7606,7607,7608]],"properties":{"id":"24662030","dp":21111,"de":2263}},{"type":"Polygon","arcs":[[-7489,7609,-7608,7610]],"properties":{"id":"24662031","dp":15163,"de":3485}},{"type":"Polygon","arcs":[[-7271,-7274,-5758,-5890,-5892,-5900,7611,7612]],"properties":{"id":"24662032","dp":2764,"de":6921}},{"type":"Polygon","arcs":[[-7253,-7264,-7265,-7269]],"properties":{"id":"24662033","dp":14688,"de":2564}},{"type":"Polygon","arcs":[[7613,-7418,7614]],"properties":{"id":"24662034","dp":16629,"de":0}},{"type":"Polygon","arcs":[[7615,7616,-7615,-7425,7617,7618]],"properties":{"id":"24662035","dp":17830,"de":0}},{"type":"Polygon","arcs":[[-7618,-7424,7619,7620]],"properties":{"id":"24662036","dp":11662,"de":0}},{"type":"Polygon","arcs":[[-6250,7621,-7619,-7621,7622,7623]],"properties":{"id":"24662037","dp":13612,"de":1076}},{"type":"Polygon","arcs":[[7624,-7623,-7620,-7423,7625,7626]],"properties":{"id":"24662038","dp":12873,"de":0}},{"type":"Polygon","arcs":[[-7626,-7422,-7415,7627]],"properties":{"id":"24662039","dp":8935,"de":0}},{"type":"Polygon","arcs":[[-7627,-7628,-7386,7628,7629]],"properties":{"id":"24662040","dp":14587,"de":899}},{"type":"Polygon","arcs":[[7630,-7629,-7385,7631,7632]],"properties":{"id":"24662041","dp":12411,"de":1996}},{"type":"Polygon","arcs":[[-7632,-7384,-7380,-383,7633,7634]],"properties":{"id":"24662042","dp":8479,"de":1305}},{"type":"Polygon","arcs":[[7635,-7634,-7376,7636]],"properties":{"id":"24662043","dp":11617,"de":0}},{"type":"Polygon","arcs":[[-7492,7637,7638,-7255,-7494]],"properties":{"id":"24661822","dp":11670,"de":1354}},{"type":"Polygon","arcs":[[-7491,7639,-7638]],"properties":{"id":"24661823","dp":18630,"de":1712}},{"type":"Polygon","arcs":[[-5832,7640,-7045,-7256,-7639,-7640]],"properties":{"id":"24661824","dp":16313,"de":2120}},{"type":"Polygon","arcs":[[-7043,-7641,-5831]],"properties":{"id":"24661825","dp":16491,"de":3333}},{"type":"Polygon","arcs":[[-6594,-6592,-6585,7641,7642,7643]],"properties":{"id":"24662271","dp":3162,"de":370}},{"type":"Polygon","arcs":[[-6595,-7644,7644,-5395]],"properties":{"id":"24662272","dp":4295,"de":939}},{"type":"Polygon","arcs":[[7645,-7409,-5396,-7645,-7643,7646]],"properties":{"id":"24662273","dp":2869,"de":0}},{"type":"Polygon","arcs":[[7647,7648,-7647,-7642,-6584]],"properties":{"id":"24662274","dp":3347,"de":277}},{"type":"Polygon","arcs":[[-3072,7649,7650,-7648,-6583]],"properties":{"id":"24662275","dp":2304,"de":0}},{"type":"Polygon","arcs":[[7651,7652,-3712,-1269]],"properties":{"id":"24661940","dp":17157,"de":11710}},{"type":"Polygon","arcs":[[7653,7654,7655,-7653]],"properties":{"id":"24661941","dp":19380,"de":3925}},{"type":"Polygon","arcs":[[7656,7657,-1287,-5796,7658,7659,-7654]],"properties":{"id":"24661942","dp":2428,"de":18450}},{"type":"Polygon","arcs":[[7660,-7657,-7652,-1274]],"properties":{"id":"24661943","dp":16448,"de":13620}},{"type":"Polygon","arcs":[[-1280,-1283,-1288,-7658,-7661,-1273]],"properties":{"id":"24661944","dp":13028,"de":35981}},{"type":"Polygon","arcs":[[-7660,7661,7662,-7655]],"properties":{"id":"24661945","dp":16238,"de":4867}},{"type":"Polygon","arcs":[[-3713,-7656,-7663,7663,7664,7665]],"properties":{"id":"24661946","dp":10887,"de":15614}},{"type":"Polygon","arcs":[[-7665,7666,7667,7668,7669]],"properties":{"id":"24661947","dp":18826,"de":2826}},{"type":"Polygon","arcs":[[-7666,-7670,7670,7671,-3709]],"properties":{"id":"24661948","dp":14350,"de":6638}},{"type":"Polygon","arcs":[[-7671,-7669,7672,7673]],"properties":{"id":"24661949","dp":16658,"de":3367}},{"type":"Polygon","arcs":[[-7672,-7674,7674,-3696,-5135,-5137]],"properties":{"id":"24661950","dp":10156,"de":7702}},{"type":"Polygon","arcs":[[7675,-5498,-5506,-3689,-3700,-3697]],"properties":{"id":"24661953","dp":12183,"de":10204}},{"type":"Polygon","arcs":[[7676,7677,7678,-7676,-7675,-7673]],"properties":{"id":"24661954","dp":16651,"de":7683}},{"type":"Polygon","arcs":[[7679,7680,-7677,-7668]],"properties":{"id":"24661955","dp":18132,"de":2918}},{"type":"Polygon","arcs":[[7681,7682,7683,-7678,-7681]],"properties":{"id":"24661956","dp":9977,"de":3611}},{"type":"Polygon","arcs":[[7684,7685,7686,-7682,7687]],"properties":{"id":"24661957","dp":13908,"de":5456}},{"type":"Polygon","arcs":[[7688,-7688,-7680,-7667,-7664]],"properties":{"id":"24661958","dp":18788,"de":10695}},{"type":"Polygon","arcs":[[7689,7690,7691,-7689,-7662]],"properties":{"id":"24661959","dp":13929,"de":9824}},{"type":"Polygon","arcs":[[7692,7693,-7691]],"properties":{"id":"24661960","dp":16458,"de":4249}},{"type":"Polygon","arcs":[[-7690,-7659,-5795,-6693,-6698,-6700,7694,-7693]],"properties":{"id":"24661961","dp":3152,"de":1246}},{"type":"Polygon","arcs":[[-7692,-7694,-7695,-6702,7695,-7685]],"properties":{"id":"24661962","dp":8834,"de":37730}},{"type":"Polygon","arcs":[[-7696,-6703,-6710,7696,-7686]],"properties":{"id":"24661963","dp":18341,"de":4899}},{"type":"Polygon","arcs":[[7697,-7496,-7501,-7359]],"properties":{"id":"24661599","dp":4056,"de":0}},{"type":"Polygon","arcs":[[-7367,-940,-7497,-7698,-7358,-7363]],"properties":{"id":"24661600","dp":3124,"de":766}},{"type":"Polygon","arcs":[[-3550,-942,-4410,-7125,7698,-7123,-5565]],"properties":{"id":"24661601","dp":2188,"de":2150}},{"type":"Polygon","arcs":[[-7124,-7699]],"properties":{"id":"24661602","dp":4102,"de":0}},{"type":"Polygon","arcs":[[-7204,-1500,7699]],"properties":{"id":"24662098","dp":14023,"de":0}},{"type":"Polygon","arcs":[[-1499,-7266,-7262,7700,-7201,-7700]],"properties":{"id":"24662099","dp":10173,"de":1906}},{"type":"Polygon","arcs":[[-7260,-7202,-7701,-7261]],"properties":{"id":"24662100","dp":13190,"de":4605}},{"type":"Polygon","arcs":[[-7259,7701,-7194,-7196,-7199]],"properties":{"id":"24662101","dp":6017,"de":1857}},{"type":"Polygon","arcs":[[7702,-7192,-7702,-7258]],"properties":{"id":"24662102","dp":10739,"de":4225}},{"type":"Polygon","arcs":[[7703,7704,-333,7705]],"properties":{"id":"24662103","dp":6944,"de":1889}},{"type":"Polygon","arcs":[[7706,-3821,-3814,-7705]],"properties":{"id":"24662104","dp":8165,"de":2206}},{"type":"Polygon","arcs":[[-3495,7707,-3822,-7707,7708]],"properties":{"id":"24662105","dp":9480,"de":3003}},{"type":"Polygon","arcs":[[-3494,-3825,-3818,-7708]],"properties":{"id":"24662106","dp":9200,"de":0}},{"type":"Polygon","arcs":[[7709,-2264,-2257,-7007]],"properties":{"id":"24662108","dp":15333,"de":1770}},{"type":"Polygon","arcs":[[7710,-2274,-7710,-6834]],"properties":{"id":"24662109","dp":18228,"de":1351}},{"type":"Polygon","arcs":[[7711,-2275,-7711,7712]],"properties":{"id":"24662110","dp":15255,"de":0}},{"type":"Polygon","arcs":[[-5018,-5017,7713,-6554,-6549,-6545]],"properties":{"id":"24662111","dp":11775,"de":13054}},{"type":"Polygon","arcs":[[-5010,7714,-6555,-7714,-5016]],"properties":{"id":"24662112","dp":17245,"de":4918}},{"type":"Polygon","arcs":[[-6551,-7715,-5009,-5004,-4876,-4875,-4872,-6556]],"properties":{"id":"24662113","dp":3453,"de":442}},{"type":"Polygon","arcs":[[7715,-3523,7716,-1931]],"properties":{"id":"24662958","dp":3548,"de":461}},{"type":"Polygon","arcs":[[-1594,-1598,-1602,-3521,-7716,-1930]],"properties":{"id":"24662961","dp":7521,"de":1569}},{"type":"Polygon","arcs":[[-6653,7717,7718,7719,7720,-6655]],"properties":{"id":"24662962","dp":10448,"de":0}},{"type":"Polygon","arcs":[[-6656,-7721,7721,7722,-6667,-6662]],"properties":{"id":"24662963","dp":13293,"de":0}},{"type":"Polygon","arcs":[[-7295,7723,-6641,-6651,7724,-6665,-6685,-6687,-6691,7725,-1625,-7297]],"properties":{"id":"24662964","dp":941,"de":3834}},{"type":"Polygon","arcs":[[-6650,-6661,-6666,-7725]],"properties":{"id":"24662965","dp":13662,"de":4714}},{"type":"Polygon","arcs":[[-7294,-7724]],"properties":{"id":"24662966","dp":29845,"de":0}},{"type":"Polygon","arcs":[[-7566,-6981,-6967,7726]],"properties":{"id":"24661622","dp":19846,"de":2307}},{"type":"Polygon","arcs":[[-7567,-7727,-6971,7727]],"properties":{"id":"24661623","dp":23600,"de":2444}},{"type":"Polygon","arcs":[[-7728,-6963,-7568]],"properties":{"id":"24661624","dp":17574,"de":5106}},{"type":"Polygon","arcs":[[-4738,-4728,-7569,-6953,7728,-4750]],"properties":{"id":"24661625","dp":2091,"de":6686}},{"type":"Polygon","arcs":[[-4763,-7729,-6952,-7541,-7536,7729,7730]],"properties":{"id":"24661626","dp":6212,"de":10221}},{"type":"Polygon","arcs":[[-7730,-7539,-7061,7731]],"properties":{"id":"24661627","dp":17538,"de":5135}},{"type":"Polygon","arcs":[[-5115,-4764,-7731,-7732,-7057,-7056,7732,7733]],"properties":{"id":"24661628","dp":2730,"de":12672}},{"type":"Polygon","arcs":[[-7734,7734,7735,-5116]],"properties":{"id":"24661629","dp":10100,"de":8193}},{"type":"Polygon","arcs":[[-7246,-6906,-2293,7736]],"properties":{"id":"24661630","dp":6753,"de":2217}},{"type":"Polygon","arcs":[[7737,7738,-7737,7739,7740]],"properties":{"id":"24661631","dp":7161,"de":2380}},{"type":"Polygon","arcs":[[7741,-7247,-7739,7742,7743,7744]],"properties":{"id":"24661632","dp":11209,"de":756}},{"type":"Polygon","arcs":[[7745,-7242,-7248,-7742,7746]],"properties":{"id":"24661633","dp":11463,"de":958}},{"type":"Polygon","arcs":[[-7209,7747,-7241,-7746]],"properties":{"id":"24661634","dp":11827,"de":1724}},{"type":"Polygon","arcs":[[-7208,-7150,-7238,-7239,-7748]],"properties":{"id":"24661635","dp":12547,"de":2857}},{"type":"Polygon","arcs":[[7748,7749,-2903]],"properties":{"id":"24662131","dp":17239,"de":0}},{"type":"Polygon","arcs":[[7750,7751,-7749,-2902]],"properties":{"id":"24662132","dp":16117,"de":3324}},{"type":"Polygon","arcs":[[-7751,-2901,7752,7753,7754]],"properties":{"id":"24662133","dp":7219,"de":8005}},{"type":"Polygon","arcs":[[-7754,7755,7756,-2565,-2571,7757]],"properties":{"id":"24662134","dp":6560,"de":1864}},{"type":"Polygon","arcs":[[7758,-3540,7759,7760,-7756]],"properties":{"id":"24662135","dp":7688,"de":15667}},{"type":"Polygon","arcs":[[-2910,-2915,-7759,-7753]],"properties":{"id":"24662136","dp":21841,"de":2966}},{"type":"Polygon","arcs":[[-7761,7761,-6121,-2562,-7757]],"properties":{"id":"24662137","dp":10441,"de":8201}},{"type":"Polygon","arcs":[[-3539,7762,7763,-6125,-6122,-7762,-7760]],"properties":{"id":"24662138","dp":3353,"de":13807}},{"type":"Polygon","arcs":[[-5805,-5803,-2727,7764,-6126]],"properties":{"id":"24662140","dp":32804,"de":28048}},{"type":"Polygon","arcs":[[-6127,-7765,-2730]],"properties":{"id":"24662141","dp":31500,"de":2500}},{"type":"Polygon","arcs":[[7765,7766,-5207,-7764]],"properties":{"id":"24662142","dp":26520,"de":40878}},{"type":"Polygon","arcs":[[-4563,-2709,-2718,-5208,-7767,7767]],"properties":{"id":"24662143","dp":3505,"de":12207}},{"type":"Polygon","arcs":[[-3545,-4564,-7768,-7766,-7763,-3538]],"properties":{"id":"24662144","dp":13223,"de":28371}},{"type":"Polygon","arcs":[[-7210,-7747,7768,-5772,-5764]],"properties":{"id":"24661660","dp":10017,"de":1475}},{"type":"Polygon","arcs":[[-7769,-7745,7769,-5773]],"properties":{"id":"24661661","dp":14436,"de":0}},{"type":"Polygon","arcs":[[-7770,-7744,7770,-5775]],"properties":{"id":"24661662","dp":11105,"de":1442}},{"type":"Polygon","arcs":[[-1476,-5776,-7771,-7743,-7738,7771,-1472]],"properties":{"id":"24661663","dp":4123,"de":1231}},{"type":"Polygon","arcs":[[-7772,-7741,7772,7773,-1473]],"properties":{"id":"24661664","dp":8072,"de":2409}},{"type":"Polygon","arcs":[[-7774,7774,7775,-1462,-1474]],"properties":{"id":"24661665","dp":11469,"de":0}},{"type":"Polygon","arcs":[[-7776,7776,7777,7778,-1463]],"properties":{"id":"24661666","dp":8374,"de":643}},{"type":"Polygon","arcs":[[7779,-2288,7780,-7777]],"properties":{"id":"24661667","dp":7920,"de":1804}},{"type":"Polygon","arcs":[[-7773,-7740,-2292,-7780,-7775]],"properties":{"id":"24661668","dp":10695,"de":2139}},{"type":"Polygon","arcs":[[-7778,-7781,-2287,-2281,-2271,-7712,7781]],"properties":{"id":"24661669","dp":3545,"de":1232}},{"type":"Polygon","arcs":[[-7779,-7782,7782,-1464]],"properties":{"id":"24661670","dp":6715,"de":1863}},{"type":"Polygon","arcs":[[-7783,-7713,-6833,-1465]],"properties":{"id":"24661671","dp":15000,"de":1724}},{"type":"Polygon","arcs":[[-6010,-2310,7783,7784,7785,7786,7787,7788]],"properties":{"id":"24662162","dp":1682,"de":24676}},{"type":"Polygon","arcs":[[-6007,-7789,7789,7790,-2890,7791]],"properties":{"id":"24662163","dp":6950,"de":2593}},{"type":"Polygon","arcs":[[-2889,7792,-2874,-6008,-7792]],"properties":{"id":"24662164","dp":3200,"de":3169}},{"type":"Polygon","arcs":[[-7793,-2888,-2883,-2875]],"properties":{"id":"24662165","dp":13571,"de":0}},{"type":"Polygon","arcs":[[-3473,-2891,-7791,-3533,-2913,7793]],"properties":{"id":"24662167","dp":4663,"de":6351}},{"type":"Polygon","arcs":[[-2906,-7794]],"properties":{"id":"24662168","dp":23446,"de":0}},{"type":"Polygon","arcs":[[7794,-2528,7795]],"properties":{"id":"24662169","dp":10740,"de":0}},{"type":"Polygon","arcs":[[7796,7797,7798,7799,-7796,-2527,7800]],"properties":{"id":"24662170","dp":5975,"de":0}},{"type":"Polygon","arcs":[[7801,7802,-7799]],"properties":{"id":"24662171","dp":6305,"de":0}},{"type":"Polygon","arcs":[[-2529,-7795,-7800,7803]],"properties":{"id":"24662172","dp":8530,"de":884}},{"type":"Polygon","arcs":[[-7803,7804,-715,-706,-697,-3105,-7804]],"properties":{"id":"24662173","dp":3917,"de":770}},{"type":"Polygon","arcs":[[-2680,-2491,7805,7806,7807,-710,-7805,7808,-7797,7809]],"properties":{"id":"24662174","dp":2149,"de":185}},{"type":"Polygon","arcs":[[-7802,-7798,-7809]],"properties":{"id":"24662175","dp":10682,"de":741}},{"type":"Polygon","arcs":[[-7687,-7697,-6709,7810,-7683]],"properties":{"id":"24661964","dp":18611,"de":3213}},{"type":"Polygon","arcs":[[-7679,-7684,-7811,-6708,-5489,-5496]],"properties":{"id":"24661965","dp":12250,"de":13588}},{"type":"Polygon","arcs":[[-6344,-5686,7811]],"properties":{"id":"24662342","dp":4292,"de":0}},{"type":"Polygon","arcs":[[-3062,-6321,-6342,-7812,-5683,7812]],"properties":{"id":"24662343","dp":3632,"de":317}},{"type":"Polygon","arcs":[[-3057,-3063,-7813,-5682,7813]],"properties":{"id":"24662344","dp":3089,"de":0}},{"type":"Polygon","arcs":[[7814,7815,-5465,-3058,-7814,-5681,7816]],"properties":{"id":"24662345","dp":3383,"de":0}},{"type":"MultiPolygon","arcs":[[[7817,7818,7819,-6025,-6028,-6013,7820,7821]],[[7822,7823,-4282,7824]],[[7825,-4277,7826]]],"properties":{"id":"24663390","dp":694,"de":1243}},{"type":"Polygon","arcs":[[7827,7828,7829,-7819]],"properties":{"id":"24663391","dp":8240,"de":2423}},{"type":"Polygon","arcs":[[7830,-7828,7831,7832]],"properties":{"id":"24663392","dp":6712,"de":1909}},{"type":"Polygon","arcs":[[-7831,7833,-1778,7834,-7829]],"properties":{"id":"24663393","dp":8991,"de":2242}},{"type":"MultiPolygon","arcs":[[[-7833,7835,7836,-1772,7837,-1779,-7834]],[[-1781,7838,7839,7840]],[[-1786,7841,7842,7843]],[[-1783,7844,7845,7846]]],"properties":{"id":"24663394","dp":2124,"de":3179}},{"type":"MultiPolygon","arcs":[[[-7827,-4276,-2465,7847,-7840,7848]],[[7849,-7836,-7832,-7818]],[[7850,-7843,7851,-7823]],[[7852]],[[-7846,7853]]],"properties":{"id":"24663395","dp":3547,"de":470}},{"type":"Polygon","arcs":[[7854]],"properties":{"id":"24663396","dp":26,"de":0}},{"type":"Polygon","arcs":[[7855,7856,7857,7858,7859,-7419,-7614]],"properties":{"id":"24663397","dp":15008,"de":900}},{"type":"Polygon","arcs":[[7860,7861,7862,-7857]],"properties":{"id":"24663398","dp":10852,"de":0}},{"type":"Polygon","arcs":[[-7861,-7856,-7617,7863]],"properties":{"id":"24663399","dp":9401,"de":664}},{"type":"Polygon","arcs":[[7864,-7864,-7616,-7622,-6249]],"properties":{"id":"24663400","dp":12946,"de":4872}},{"type":"Polygon","arcs":[[7865,7866,7867,-7862,-7865,-6253]],"properties":{"id":"24663401","dp":2525,"de":7200}},{"type":"Polygon","arcs":[[7868,-1130,-1138,7869]],"properties":{"id":"24663402","dp":10158,"de":0}},{"type":"Polygon","arcs":[[-1749,-1757,-1767,-3983,-3844,-3840,-3836,-3834]],"properties":{"id":"24661703","dp":7376,"de":1388}},{"type":"Polygon","arcs":[[7870,-2230,-2227,-2221,-1737,-1539]],"properties":{"id":"24661704","dp":12107,"de":1789}},{"type":"Polygon","arcs":[[-7021,-7019,-2243,-2235,-2231,-7871,-1538]],"properties":{"id":"24661705","dp":4225,"de":15312}},{"type":"Polygon","arcs":[[7871,-7377,-396,-1447,-7031,-3490]],"properties":{"id":"24661708","dp":4721,"de":1518}},{"type":"Polygon","arcs":[[7872,7873,-7368,-7872,-3496,7874,7875]],"properties":{"id":"24661709","dp":2164,"de":5433}},{"type":"Polygon","arcs":[[-7709,-7704,7876,-7875]],"properties":{"id":"24661710","dp":8519,"de":3107}},{"type":"Polygon","arcs":[[7877,-7876,-7877,7878,7879,7880]],"properties":{"id":"24661711","dp":8349,"de":1225}},{"type":"Polygon","arcs":[[-7879,-7706,-332,7881]],"properties":{"id":"24661712","dp":8303,"de":0}},{"type":"Polygon","arcs":[[7882,-7880,-7882,-331,7883]],"properties":{"id":"24661713","dp":9049,"de":1311}},{"type":"Polygon","arcs":[[7884,-7884,7885,-3957]],"properties":{"id":"24661714","dp":11540,"de":0}},{"type":"Polygon","arcs":[[-3958,-7886,-330,-3808,-3800,-3799,-3960]],"properties":{"id":"24661715","dp":4304,"de":1828}},{"type":"Polygon","arcs":[[7886,-7881,-7883,-7885,7887]],"properties":{"id":"24661716","dp":9462,"de":833}},{"type":"Polygon","arcs":[[7888,-7888,-3956]],"properties":{"id":"24661717","dp":10787,"de":0}},{"type":"Polygon","arcs":[[7889,7890,-7874,7891,-7889,-3955]],"properties":{"id":"24661718","dp":1532,"de":1834}},{"type":"Polygon","arcs":[[-7873,-7878,-7887,-7892]],"properties":{"id":"24661719","dp":4314,"de":2983}},{"type":"Polygon","arcs":[[-3481,7892,-3479,-5317,-5320,-365,-7890,-3954,-3483,7893]],"properties":{"id":"24661720","dp":699,"de":878}},{"type":"Polygon","arcs":[[-3482,-7894]],"properties":{"id":"24661721","dp":12230,"de":0}},{"type":"MultiPolygon","arcs":[[[7894,-4685,7895,7896,-7327]],[[7897]]],"properties":{"id":"24662985","dp":777,"de":413}},{"type":"Polygon","arcs":[[-5977,7898,-7895,-7326]],"properties":{"id":"24662986","dp":1242,"de":153}},{"type":"Polygon","arcs":[[-3450,-4686,-7899,-5976]],"properties":{"id":"24662987","dp":974,"de":291}},{"type":"Polygon","arcs":[[-7869,7899,7900,-1121]],"properties":{"id":"24663403","dp":5476,"de":0}},{"type":"Polygon","arcs":[[-1135,7901,-7900,-7870,-1137,-3740]],"properties":{"id":"24663404","dp":7196,"de":0}},{"type":"Polygon","arcs":[[-7902,-1134,-1122,-7901]],"properties":{"id":"24663405","dp":6421,"de":0}},{"type":"Polygon","arcs":[[-5879,-5168,-7401,-5173,-7395,-5147,-4960,-5950,-5948,-4968,-4972]],"properties":{"id":"24663406","dp":686,"de":73}},{"type":"Polygon","arcs":[[7902,-7528,-7529,-7532]],"properties":{"id":"24663450","dp":14109,"de":2729}},{"type":"Polygon","arcs":[[-7531,-7535,-7542,-7526,-7903]],"properties":{"id":"24663451","dp":6708,"de":12304}},{"type":"Polygon","arcs":[[-6139,7903,-2963,-1308,-1249,-6135,-6137]],"properties":{"id":"24663452","dp":5953,"de":25994}},{"type":"Polygon","arcs":[[-4586,-2964,-7904,-6138,-2966]],"properties":{"id":"24663453","dp":12181,"de":2674}},{"type":"Polygon","arcs":[[7904,7905,7906,-7563,-7427]],"properties":{"id":"24662007","dp":19251,"de":0}},{"type":"Polygon","arcs":[[7907,-7546,-7547,7908,-7564,-7907]],"properties":{"id":"24662008","dp":8516,"de":1180}},{"type":"Polygon","arcs":[[-7565,-7909,-7549,-7550,-7556,-7562]],"properties":{"id":"24662009","dp":13447,"de":3561}},{"type":"Polygon","arcs":[[7909,-7544,-7908,7910]],"properties":{"id":"24662010","dp":15041,"de":2054}},{"type":"Polygon","arcs":[[7911,-5920,-5923,-5926,-7910,7912]],"properties":{"id":"24662011","dp":13357,"de":2828}},{"type":"Polygon","arcs":[[7913,-7913,-7911,-7906,7914]],"properties":{"id":"24662012","dp":12888,"de":3486}},{"type":"Polygon","arcs":[[7915,-5921,-7912,-7914,7916]],"properties":{"id":"24662013","dp":15308,"de":3089}},{"type":"Polygon","arcs":[[-7860,7917,-7917,-7915,-7905,-7426,-7420]],"properties":{"id":"24662014","dp":5970,"de":1146}},{"type":"Polygon","arcs":[[7918,7919,-5918,-7916,-7918,-7859]],"properties":{"id":"24662015","dp":7562,"de":3541}},{"type":"Polygon","arcs":[[7920,-5914,-5915,-7920]],"properties":{"id":"24662016","dp":15907,"de":4336}},{"type":"Polygon","arcs":[[7921,-5912,-7921,7922]],"properties":{"id":"24662017","dp":20319,"de":6914}},{"type":"Polygon","arcs":[[7923,-7633,-7635,-7636,7924,7925]],"properties":{"id":"24662044","dp":14034,"de":1136}},{"type":"Polygon","arcs":[[7926,-7925,-7637,7927,-6226]],"properties":{"id":"24662045","dp":13248,"de":2760}},{"type":"Polygon","arcs":[[7928,-7926,-7927,-6225,-6228]],"properties":{"id":"24662046","dp":17621,"de":1732}},{"type":"Polygon","arcs":[[7929,7930,-7924,-7929,-6230]],"properties":{"id":"24662047","dp":3978,"de":8507}},{"type":"Polygon","arcs":[[-6233,7931,7932,-7930]],"properties":{"id":"24662048","dp":15337,"de":1993}},{"type":"Polygon","arcs":[[-6235,-6241,7933,-7932,-6232]],"properties":{"id":"24662049","dp":14679,"de":1388}},{"type":"Polygon","arcs":[[7934,-7410,-7646,-7649,-7651]],"properties":{"id":"24662276","dp":2954,"de":0}},{"type":"Polygon","arcs":[[7935,7936,-7406,-7408,-7935,-7650,-3071]],"properties":{"id":"24662277","dp":2330,"de":1011}},{"type":"Polygon","arcs":[[7937,7938,-5449,-7407,-7937]],"properties":{"id":"24662278","dp":6876,"de":720}},{"type":"Polygon","arcs":[[-7936,-3070,7939,7940,-7938]],"properties":{"id":"24662279","dp":13111,"de":0}},{"type":"Polygon","arcs":[[7941,7942,-5450,-7939,-7941,7943]],"properties":{"id":"24662280","dp":2508,"de":224}},{"type":"Polygon","arcs":[[7944,-7944,-7940,-3069,7945]],"properties":{"id":"24662281","dp":1717,"de":148}},{"type":"Polygon","arcs":[[-3068,-5353,7946,7947,-7946]],"properties":{"id":"24662282","dp":4097,"de":0}},{"type":"Polygon","arcs":[[-7948,7948,-7942,-7945]],"properties":{"id":"24662283","dp":3343,"de":0}},{"type":"Polygon","arcs":[[-7943,-7949,-7947,-5352,-6160,-6167,7949,7950,-7403,-5452,-5443,-5446]],"properties":{"id":"24662284","dp":901,"de":2187}},{"type":"Polygon","arcs":[[7951,7952,7953,7954,-7951]],"properties":{"id":"24662285","dp":3759,"de":1181}},{"type":"Polygon","arcs":[[-7953,7955,7956,7957]],"properties":{"id":"24662286","dp":2763,"de":0}},{"type":"Polygon","arcs":[[-7958,7958,7959,-7954]],"properties":{"id":"24662287","dp":3685,"de":332}},{"type":"Polygon","arcs":[[7960,7961,-7959,-7957]],"properties":{"id":"24662288","dp":2965,"de":0}},{"type":"Polygon","arcs":[[-7955,-7960,-7962,7962,-5740,-5460,-5454,-7404]],"properties":{"id":"24662289","dp":856,"de":1771}},{"type":"Polygon","arcs":[[-1313,-1281,-1277,-1271,-1086,7963]],"properties":{"id":"24662114","dp":3221,"de":18847}},{"type":"Polygon","arcs":[[7964,-5911,-7922,7965]],"properties":{"id":"24662018","dp":21736,"de":6052}},{"type":"Polygon","arcs":[[7966,-5909,-7965,7967]],"properties":{"id":"24662019","dp":21354,"de":2343}},{"type":"Polygon","arcs":[[7968,-5907,-7967,7969,7970]],"properties":{"id":"24662020","dp":15658,"de":3202}},{"type":"Polygon","arcs":[[-7970,-7968,-7966,-7923,-7919,7971]],"properties":{"id":"24662021","dp":15519,"de":0}},{"type":"Polygon","arcs":[[7972,-7971,-7972,-7858,-7863,-7868]],"properties":{"id":"24662022","dp":14750,"de":0}},{"type":"Polygon","arcs":[[-7973,-7867,7973,7974,-7612,-5902,7975,-5906,-7969]],"properties":{"id":"24662024","dp":6894,"de":1088}},{"type":"Polygon","arcs":[[-5904,-7976]],"properties":{"id":"24662025","dp":28600,"de":4938}},{"type":"Polygon","arcs":[[-7445,-7449,-7470,-7974,-7866,-6252,-6258,-6274,-6275]],"properties":{"id":"24662026","dp":2804,"de":5234}},{"type":"Polygon","arcs":[[-7975,-7469,7976,7977,-7609,-7610,-7495,-7272,-7613]],"properties":{"id":"24662027","dp":3320,"de":6302}},{"type":"Polygon","arcs":[[-7480,7978,-7977,-7468,-7472,-7474,-7476]],"properties":{"id":"24662028","dp":13774,"de":2903}},{"type":"Polygon","arcs":[[-7490,-7611,-7607,-7978,-7979,-7479]],"properties":{"id":"24662029","dp":17312,"de":5000}},{"type":"Polygon","arcs":[[7979,7980,7981,7982,-5599,-5598,-5593]],"properties":{"id":"24662384","dp":1848,"de":652}},{"type":"Polygon","arcs":[[7983,7984,7985,7986,-7981,7987]],"properties":{"id":"24662385","dp":3341,"de":499}},{"type":"Polygon","arcs":[[7988,-7988,-7980,-5592,7989,7990]],"properties":{"id":"24662386","dp":4512,"de":406}},{"type":"Polygon","arcs":[[7991,7992,7993,-7990,-5596,-5590]],"properties":{"id":"24662387","dp":11225,"de":1092}},{"type":"Polygon","arcs":[[7994,-5943,7995,7996,-7993,7997]],"properties":{"id":"24662388","dp":3059,"de":0}},{"type":"Polygon","arcs":[[-5589,-5585,-5580,7998,7999,-7998,-7992]],"properties":{"id":"24662389","dp":2794,"de":1017}},{"type":"Polygon","arcs":[[8000,8001,-825,-4570,-4567,-4557,-3535]],"properties":{"id":"24662145","dp":2786,"de":2629}},{"type":"Polygon","arcs":[[8002,-8001,8003]],"properties":{"id":"24662147","dp":15989,"de":6951}},{"type":"Polygon","arcs":[[-7790,-7788,8004,8005,-8004,-3534]],"properties":{"id":"24662148","dp":5279,"de":5182}},{"type":"Polygon","arcs":[[8006,-835,-829,8007,-8006]],"properties":{"id":"24662149","dp":9821,"de":10425}},{"type":"Polygon","arcs":[[-8008,-832,-828,-8002,-8003]],"properties":{"id":"24662150","dp":7965,"de":2836}},{"type":"Polygon","arcs":[[-838,-8007,8008]],"properties":{"id":"24662151","dp":14970,"de":22058}},{"type":"Polygon","arcs":[[-7787,8009,-841,-3597,-836,-8009,-8005]],"properties":{"id":"24662152","dp":7012,"de":9674}},{"type":"Polygon","arcs":[[8010,-845,-842,-8010,-7786]],"properties":{"id":"24662153","dp":11924,"de":2405}},{"type":"Polygon","arcs":[[-6251,-7624,8011,-7934]],"properties":{"id":"24662050","dp":12577,"de":2333}},{"type":"Polygon","arcs":[[-8012,-7625,-7630,-7631,-7931,-7933]],"properties":{"id":"24662051","dp":8170,"de":24634}},{"type":"Polygon","arcs":[[-6221,-7928,-7375,8012]],"properties":{"id":"24662052","dp":12256,"de":2850}},{"type":"Polygon","arcs":[[-6222,-8013,-7374,8013]],"properties":{"id":"24662053","dp":16512,"de":1226}},{"type":"Polygon","arcs":[[8014,-8014,-7373,8015]],"properties":{"id":"24662054","dp":8411,"de":9371}},{"type":"Polygon","arcs":[[-8016,-7372,8016,8017]],"properties":{"id":"24662055","dp":18455,"de":2205}},{"type":"Polygon","arcs":[[-8017,-7371,8018,8019]],"properties":{"id":"24662056","dp":17165,"de":2330}},{"type":"Polygon","arcs":[[-8019,-7370,8020]],"properties":{"id":"24662057","dp":11772,"de":0}},{"type":"Polygon","arcs":[[8021,-8020,-8021,-7369,-7891,-364,-382]],"properties":{"id":"24662058","dp":3397,"de":3757}},{"type":"Polygon","arcs":[[-6045,-6048,8022,8023,-379]],"properties":{"id":"24662064","dp":14070,"de":2922}},{"type":"Polygon","arcs":[[-6058,-6219,8024,-8023,-6047,-6049,-6053]],"properties":{"id":"24662065","dp":5720,"de":3625}},{"type":"Polygon","arcs":[[-380,-8024,-8025,-6218,-6223,-8015,-8018,-8022]],"properties":{"id":"24662066","dp":5004,"de":3910}},{"type":"Polygon","arcs":[[-3504,8025,-5402,-5410,-5413,8026,8027,8028]],"properties":{"id":"24662405","dp":4160,"de":2203}},{"type":"Polygon","arcs":[[8029,-3506,8030,8031]],"properties":{"id":"24662408","dp":3040,"de":582}},{"type":"Polygon","arcs":[[-8031,-3505,-8029,8032,8033,8034,8035]],"properties":{"id":"24662409","dp":2358,"de":420}},{"type":"Polygon","arcs":[[-8035,8036,8037]],"properties":{"id":"24662410","dp":3768,"de":0}},{"type":"Polygon","arcs":[[-8037,-8034,8038,8039,8040]],"properties":{"id":"24662411","dp":9136,"de":0}},{"type":"Polygon","arcs":[[-5281,8041,8042,8043,-8040]],"properties":{"id":"24662412","dp":11314,"de":0}},{"type":"Polygon","arcs":[[8044,-8042,-5280,-5276,-5270]],"properties":{"id":"24662413","dp":6083,"de":0}},{"type":"Polygon","arcs":[[8045,8046,-8043,-8045,-5275]],"properties":{"id":"24662414","dp":10353,"de":0}},{"type":"Polygon","arcs":[[8047,-8044,-8047,8048]],"properties":{"id":"24662415","dp":9958,"de":0}},{"type":"Polygon","arcs":[[8049,-8049,-8046,-5274,-5268,-5160,8050]],"properties":{"id":"24662416","dp":8268,"de":0}},{"type":"Polygon","arcs":[[-2700,-2698,-2696,-2694,-2689,-2683,8051,-2707]],"properties":{"id":"24662176","dp":3281,"de":2157}},{"type":"Polygon","arcs":[[8052,-711,-7808]],"properties":{"id":"24662177","dp":10225,"de":0}},{"type":"Polygon","arcs":[[-7807,8053,-4591,8054,-721,-712,-8053]],"properties":{"id":"24662178","dp":10562,"de":672}},{"type":"Polygon","arcs":[[-8055,-4590,-4471,-4468,-726,-722]],"properties":{"id":"24662179","dp":8499,"de":1661}},{"type":"Polygon","arcs":[[-4326,-4600,-4592,-8054,-7806]],"properties":{"id":"24662180","dp":11991,"de":0}},{"type":"Polygon","arcs":[[-7961,-7956,-7952,-7950,-6170,-5741,-7963]],"properties":{"id":"24662290","dp":3018,"de":2519}},{"type":"Polygon","arcs":[[-4701,-4697,8055,-4939,-4938,-4936,-4928,-7301,-4911]],"properties":{"id":"24662642","dp":1972,"de":531}},{"type":"Polygon","arcs":[[-6423,8056,8057,-7317,-8056]],"properties":{"id":"24662643","dp":9678,"de":2506}},{"type":"Polygon","arcs":[[8058,8059,8060,8061,-8057]],"properties":{"id":"24662644","dp":7315,"de":1908}},{"type":"Polygon","arcs":[[-8058,-8062,8062,8063,-7318]],"properties":{"id":"24662645","dp":8890,"de":1239}},{"type":"Polygon","arcs":[[8064,8065,8066,-8063,-8061]],"properties":{"id":"24662646","dp":9131,"de":1595}},{"type":"Polygon","arcs":[[-8067,8067,8068,-7314,-8064]],"properties":{"id":"24662647","dp":5640,"de":15548}},{"type":"Polygon","arcs":[[8069,8070,8071,8072,-8068,-8066,8073]],"properties":{"id":"24662648","dp":5610,"de":2964}},{"type":"Polygon","arcs":[[-5459,-5466,-7816,8074,-5457]],"properties":{"id":"24662346","dp":2142,"de":0}},{"type":"Polygon","arcs":[[-8075,8075,8076,8077,8078,-5433]],"properties":{"id":"24662347","dp":2461,"de":0}},{"type":"Polygon","arcs":[[-7815,8079,8080,8081,-8076]],"properties":{"id":"24662348","dp":3249,"de":0}},{"type":"Polygon","arcs":[[-8080,-7817,-5680,8082,8083]],"properties":{"id":"24662349","dp":3082,"de":0}},{"type":"Polygon","arcs":[[-5674,8084,8085,8086,-8083]],"properties":{"id":"24662350","dp":3205,"de":0}},{"type":"Polygon","arcs":[[-8087,8087]],"properties":{"id":"24662351","dp":3520,"de":0}},{"type":"Polygon","arcs":[[-8081,-8084,-8088,-8086,8088,8089,8090]],"properties":{"id":"24662352","dp":2555,"de":0}},{"type":"Polygon","arcs":[[8091,-8089,-8085,-5677,-5659,-5366,8092]],"properties":{"id":"24662353","dp":4427,"de":724}},{"type":"Polygon","arcs":[[8093,-8090,-8092,8094]],"properties":{"id":"24662354","dp":3846,"de":0}},{"type":"Polygon","arcs":[[8095,-8095,-8093,8096,-8078]],"properties":{"id":"24662355","dp":4972,"de":2426}},{"type":"Polygon","arcs":[[-8077,-8082,-8091,-8094,-8096]],"properties":{"id":"24662356","dp":3809,"de":751}},{"type":"Polygon","arcs":[[-5431,-5434,-8079,-8097,-5365,8097,-5426,-5428]],"properties":{"id":"24662357","dp":3637,"de":1810}},{"type":"Polygon","arcs":[[-5364,-5260,-3497,8098,-8098]],"properties":{"id":"24662358","dp":8724,"de":358}},{"type":"Polygon","arcs":[[-8099,-3502,8099,-5421,-5427]],"properties":{"id":"24662359","dp":6330,"de":0}},{"type":"Polygon","arcs":[[-5369,-5652,8100,-3500]],"properties":{"id":"24662362","dp":3626,"de":0}},{"type":"Polygon","arcs":[[-5422,-8100,-3501,-8101,-5651,8101]],"properties":{"id":"24662363","dp":2313,"de":287}},{"type":"Polygon","arcs":[[-1251,-1314,-7964,-1264,-1258],[8102]],"properties":{"id":"24662115","dp":3939,"de":68855}},{"type":"Polygon","arcs":[[-8103]],"properties":{"id":"24662116","dp":16738,"de":73538}},{"type":"Polygon","arcs":[[8103,8104,8105,-3422,8106,8107]],"properties":{"id":"24662117","dp":2580,"de":0}},{"type":"Polygon","arcs":[[8108,-3423,-8106]],"properties":{"id":"24662118","dp":5803,"de":765}},{"type":"Polygon","arcs":[[-8105,8109,8110,-3424,-8109]],"properties":{"id":"24662119","dp":5864,"de":2286}},{"type":"Polygon","arcs":[[8111,-8110,-8104,8112]],"properties":{"id":"24662120","dp":5859,"de":0}},{"type":"Polygon","arcs":[[-2451,-2455,8113,-8112,8114]],"properties":{"id":"24662121","dp":7174,"de":0}},{"type":"MultiPolygon","arcs":[[[-8114,-2454,8115,-3425,-8111]],[[-2534,-6011,8116]]],"properties":{"id":"24662122","dp":2888,"de":196}},{"type":"Polygon","arcs":[[-2416,-2444,8117,-2447,-8115,-8113,-8108,8118]],"properties":{"id":"24662123","dp":3304,"de":512}},{"type":"Polygon","arcs":[[-2443,-2448,-8118]],"properties":{"id":"24662124","dp":10395,"de":0}},{"type":"Polygon","arcs":[[-3385,-3387,-3026,-2865,-2780,-213,8119]],"properties":{"id":"24662125","dp":15865,"de":2524}},{"type":"Polygon","arcs":[[-8120,-217,-220,-3202]],"properties":{"id":"24662126","dp":13625,"de":5500}},{"type":"Polygon","arcs":[[-2613,-2872,8120,-2601]],"properties":{"id":"24662127","dp":7707,"de":1115}},{"type":"Polygon","arcs":[[-2871,8121,-2592,8122,-8121]],"properties":{"id":"24662128","dp":8406,"de":2363}},{"type":"Polygon","arcs":[[-2602,-8123,-2591]],"properties":{"id":"24662129","dp":13488,"de":3685}},{"type":"Polygon","arcs":[[-7750,-7752,-7755,-7758,-2570,-2574,-2904]],"properties":{"id":"24662130","dp":5549,"de":9287}},{"type":"Polygon","arcs":[[-3609,-5956,8123,8124,-3604]],"properties":{"id":"24662444","dp":7695,"de":1810}},{"type":"Polygon","arcs":[[8125,-8124,-5955,-3510]],"properties":{"id":"24662445","dp":17926,"de":1295}},{"type":"Polygon","arcs":[[-3508,8126,8127]],"properties":{"id":"24662447","dp":12965,"de":0}},{"type":"Polygon","arcs":[[8128,-8126,-3509,-8128,8129,8130,8131]],"properties":{"id":"24662448","dp":22293,"de":0}},{"type":"Polygon","arcs":[[-8127,-3507,8132,-8130]],"properties":{"id":"24662449","dp":12234,"de":0}},{"type":"Polygon","arcs":[[-8131,-8133,-3513,8133,8134]],"properties":{"id":"24662450","dp":17622,"de":0}},{"type":"Polygon","arcs":[[-3512,-5954,8135,-8134]],"properties":{"id":"24662452","dp":27269,"de":0}},{"type":"Polygon","arcs":[[8136,-8136,-5953,8137]],"properties":{"id":"24662453","dp":24170,"de":2849}},{"type":"Polygon","arcs":[[8138,8139,-8138,-5952,-6037,-4358,8140]],"properties":{"id":"24662454","dp":12348,"de":910}},{"type":"Polygon","arcs":[[-8139,8141,8142]],"properties":{"id":"24662455","dp":11007,"de":0}},{"type":"Polygon","arcs":[[-3606,-8132,-8135,-8137,-8140,-8143,8143,-4363,8144]],"properties":{"id":"24662456","dp":7475,"de":1288}},{"type":"Polygon","arcs":[[-8142,-8141,-4357,-4364,-8144]],"properties":{"id":"24662457","dp":9683,"de":0}},{"type":"Polygon","arcs":[[8145,-3607,-8145,-4371,8146]],"properties":{"id":"24662458","dp":2625,"de":905}},{"type":"Polygon","arcs":[[8147,-8147,-4370,-4543,-4551]],"properties":{"id":"24662459","dp":3126,"de":0}},{"type":"Polygon","arcs":[[-7893,-3480]],"properties":{"id":"24661723","dp":14498,"de":1781}},{"type":"Polygon","arcs":[[8148,-852,-846,-8011,-7785,8149]],"properties":{"id":"24662154","dp":8850,"de":2331}},{"type":"Polygon","arcs":[[-2309,8150,8151,8152,8153,-8150,-7784]],"properties":{"id":"24662155","dp":13151,"de":2675}},{"type":"Polygon","arcs":[[8154,-8151,-2308]],"properties":{"id":"24662156","dp":5806,"de":1663}},{"type":"Polygon","arcs":[[8155,8156,-8152,-8155,-2307]],"properties":{"id":"24662157","dp":13811,"de":1647}},{"type":"Polygon","arcs":[[8157,-8156,-2306]],"properties":{"id":"24662158","dp":8404,"de":1033}},{"type":"Polygon","arcs":[[-2305,-987,-8153,-8157,-8158]],"properties":{"id":"24662159","dp":10089,"de":1485}},{"type":"Polygon","arcs":[[-986,8158,-853,-8149,-8154]],"properties":{"id":"24662160","dp":14163,"de":1951}},{"type":"Polygon","arcs":[[-960,-854,-8159]],"properties":{"id":"24662161","dp":14819,"de":2972}},{"type":"Polygon","arcs":[[8159,-7323,-7897,8160,8161,8162,8163,8164]],"properties":{"id":"24662475","dp":2046,"de":813}},{"type":"Polygon","arcs":[[8165,8166,-8163,8167]],"properties":{"id":"24662476","dp":11038,"de":5576}},{"type":"Polygon","arcs":[[8168,-8168,-8162,8169,8170,8171]],"properties":{"id":"24662477","dp":5435,"de":1136}},{"type":"Polygon","arcs":[[-8166,-8169,8172,-3452,8173]],"properties":{"id":"24662478","dp":17293,"de":2125}},{"type":"Polygon","arcs":[[-3453,-8173,-8172,8174]],"properties":{"id":"24662479","dp":3720,"de":3116}},{"type":"Polygon","arcs":[[-8175,-8171,8175,8176,8177,8178,-3454]],"properties":{"id":"24662480","dp":2279,"de":0}},{"type":"Polygon","arcs":[[-3407,8179,8180,8181,-8167,-8174,-3451]],"properties":{"id":"24662483","dp":10054,"de":1432}},{"type":"MultiPolygon","arcs":[[[-2114,8182,-7821,-6012,-1937,8183,-2106,-2110]],[[-4635,8184,-4624]]],"properties":{"id":"24662182","dp":2991,"de":455}},{"type":"Polygon","arcs":[[-1936,-2103,-8184]],"properties":{"id":"24662183","dp":9398,"de":0}},{"type":"Polygon","arcs":[[-5387,-6026,-7820,-7830,-7835,-1792,-1798,-5378,-5382]],"properties":{"id":"24662187","dp":2556,"de":5216}},{"type":"Polygon","arcs":[[-1780,-7838]],"properties":{"id":"24662192","dp":7263,"de":3092}},{"type":"Polygon","arcs":[[8185,8186,-3409,-3459,8187,8188]],"properties":{"id":"24662502","dp":13262,"de":658}},{"type":"Polygon","arcs":[[-3458,8189,-8188]],"properties":{"id":"24662503","dp":24772,"de":1893}},{"type":"Polygon","arcs":[[-8189,-8190,-3457,8190,8191,8192]],"properties":{"id":"24662504","dp":6754,"de":883}},{"type":"Polygon","arcs":[[-8192,8193,8194,8195,8196,8197]],"properties":{"id":"24662505","dp":4035,"de":1491}},{"type":"Polygon","arcs":[[-8191,-3456,8198,-8194]],"properties":{"id":"24662506","dp":4217,"de":1139}},{"type":"Polygon","arcs":[[8199,-8195,-8199,-3455,-8179,8200]],"properties":{"id":"24662507","dp":2845,"de":553}},{"type":"Polygon","arcs":[[8201,-8201,-8178,8202]],"properties":{"id":"24662508","dp":4187,"de":397}},{"type":"Polygon","arcs":[[8203,8204,-8203,8205,8206]],"properties":{"id":"24662509","dp":3635,"de":506}},{"type":"Polygon","arcs":[[8207,8208,-8207,8209]],"properties":{"id":"24662510","dp":5852,"de":0}},{"type":"Polygon","arcs":[[-8208,8210,8211]],"properties":{"id":"24662511","dp":10196,"de":0}},{"type":"Polygon","arcs":[[-3518,8212,8213,-8211,-8210,-8206,-8177,8214]],"properties":{"id":"24662512","dp":3717,"de":471}},{"type":"Polygon","arcs":[[8215,8216,-8213,-3517,8217]],"properties":{"id":"24662513","dp":6741,"de":561}},{"type":"Polygon","arcs":[[8218,8219,8220,-8218,-3516,8221]],"properties":{"id":"24662515","dp":5264,"de":1064}},{"type":"Polygon","arcs":[[8222,-8222,-3515,8223]],"properties":{"id":"24662516","dp":12660,"de":0}},{"type":"Polygon","arcs":[[8224,-5423,-8102,8225,-5927]],"properties":{"id":"24662364","dp":3878,"de":0}},{"type":"Polygon","arcs":[[-5928,-8226,-5654,-4941,-5932]],"properties":{"id":"24662365","dp":3614,"de":533}},{"type":"Polygon","arcs":[[-6690,-6692,-6683,8226,-3577,-7726]],"properties":{"id":"24662762","dp":1961,"de":5063}},{"type":"Polygon","arcs":[[-6680,8227,8228,-3578,-8227]],"properties":{"id":"24662763","dp":3052,"de":2800}},{"type":"Polygon","arcs":[[-6678,8229,8230,8231,-8228,-6679]],"properties":{"id":"24662764","dp":13112,"de":0}},{"type":"Polygon","arcs":[[8232,8233,8234,-6894,-3579,-8229,-8232]],"properties":{"id":"24662765","dp":3211,"de":601}},{"type":"Polygon","arcs":[[-8235,8235,8236,-6890]],"properties":{"id":"24662766","dp":21261,"de":0}},{"type":"Polygon","arcs":[[8237,8238,-8236,-8234]],"properties":{"id":"24662767","dp":21181,"de":0}},{"type":"Polygon","arcs":[[8239,8240,8241,-8238,-8233,-8231]],"properties":{"id":"24662768","dp":20216,"de":0}},{"type":"Polygon","arcs":[[8242,-3488,-3757,-3754,-3750]],"properties":{"id":"24661725","dp":2004,"de":984}},{"type":"Polygon","arcs":[[-3486,8243]],"properties":{"id":"24661726","dp":5105,"de":645}},{"type":"Polygon","arcs":[[-3487,-8244,-3485,-3953,-3758]],"properties":{"id":"24661727","dp":374,"de":2802}},{"type":"Polygon","arcs":[[-2344,-1774,8244,-6109,8245,8246,8247,8248,8249,8250,8251,-2334,-2335]],"properties":{"id":"24662218","dp":2745,"de":251}},{"type":"Polygon","arcs":[[8252,8253,-2331,-8252]],"properties":{"id":"24662219","dp":3553,"de":1027}},{"type":"Polygon","arcs":[[-8251,8254,8255,-8253]],"properties":{"id":"24662220","dp":7736,"de":2389}},{"type":"Polygon","arcs":[[8256,-8255,-8250,8257,8258]],"properties":{"id":"24662221","dp":3659,"de":615}},{"type":"Polygon","arcs":[[-8258,-8249,8259]],"properties":{"id":"24662222","dp":3714,"de":314}},{"type":"Polygon","arcs":[[-8259,-8260,-8248,8260,8261]],"properties":{"id":"24662223","dp":3242,"de":340}},{"type":"Polygon","arcs":[[-8261,-8247,8262,8263,8264]],"properties":{"id":"24662224","dp":3237,"de":0}},{"type":"Polygon","arcs":[[8265,-8262,-8265,8266,8267,8268]],"properties":{"id":"24662225","dp":3984,"de":580}},{"type":"Polygon","arcs":[[8269,-8269,8270]],"properties":{"id":"24662226","dp":2941,"de":514}},{"type":"Polygon","arcs":[[8271,8272,-8270,8273]],"properties":{"id":"24662227","dp":3996,"de":375}},{"type":"Polygon","arcs":[[-3548,8274,8275,-8274,-8271,-8268,8276,8277,-2034]],"properties":{"id":"24662228","dp":2285,"de":420}},{"type":"Polygon","arcs":[[-2332,-8254,8278,-8272,-8276,8279,-2329]],"properties":{"id":"24662229","dp":2847,"de":0}},{"type":"Polygon","arcs":[[-8256,-8257,-8266,-8273,-8279]],"properties":{"id":"24662230","dp":4047,"de":288}},{"type":"Polygon","arcs":[[-8280,-8275,-3547,-2330]],"properties":{"id":"24662231","dp":4144,"de":0}},{"type":"Polygon","arcs":[[8280,-8277,-8267,-8264]],"properties":{"id":"24662232","dp":8497,"de":0}},{"type":"Polygon","arcs":[[8281,8282,8283,8284,8285,-6378,-6385,-1528,-8278,-8281]],"properties":{"id":"24662233","dp":3857,"de":2193}},{"type":"Polygon","arcs":[[-5939,-4953,8286,-7996,-5942]],"properties":{"id":"24662371","dp":3734,"de":345}},{"type":"Polygon","arcs":[[8287,-8074,-8065,-8060]],"properties":{"id":"24662649","dp":14951,"de":4206}},{"type":"Polygon","arcs":[[8288,8289,-8288,8290]],"properties":{"id":"24662650","dp":6849,"de":940}},{"type":"Polygon","arcs":[[-6420,8291,-8291,-8059,-6422]],"properties":{"id":"24662651","dp":12148,"de":5177}},{"type":"Polygon","arcs":[[-6419,-6416,8292,8293,-8289,-8292]],"properties":{"id":"24662652","dp":6103,"de":878}},{"type":"Polygon","arcs":[[-8294,8294,8295,8296]],"properties":{"id":"24662653","dp":13477,"de":2954}},{"type":"Polygon","arcs":[[8297,8298,8299,-8295,-8293,-6415]],"properties":{"id":"24662654","dp":6030,"de":2576}},{"type":"Polygon","arcs":[[-8300,8300,8301,8302,-8296]],"properties":{"id":"24662655","dp":13144,"de":1417}},{"type":"Polygon","arcs":[[8303,8304,-8301,-8299]],"properties":{"id":"24662656","dp":12317,"de":0}},{"type":"Polygon","arcs":[[8305,8306,8307,-8302,-8305]],"properties":{"id":"24662657","dp":8948,"de":1091}},{"type":"Polygon","arcs":[[8308,8309,-6198,8310,8311,8312,-8307]],"properties":{"id":"24662658","dp":5459,"de":5550}},{"type":"Polygon","arcs":[[-8312,8313,8314]],"properties":{"id":"24662659","dp":18298,"de":1030}},{"type":"Polygon","arcs":[[-8297,-8303,-8308,-8313,-8315,8315,-8070,-8290]],"properties":{"id":"24662660","dp":3396,"de":3403}},{"type":"Polygon","arcs":[[-8316,8316,8317,8318,-8071]],"properties":{"id":"24662661","dp":6433,"de":1689}},{"type":"Polygon","arcs":[[-7997,-8287,-4952,-5640,-5636,8319,-7991,-7994]],"properties":{"id":"24662372","dp":3937,"de":493}},{"type":"Polygon","arcs":[[-5635,8320,-8320]],"properties":{"id":"24662373","dp":5025,"de":0}},{"type":"Polygon","arcs":[[-5629,8321,-7989,-8321]],"properties":{"id":"24662374","dp":3065,"de":963}},{"type":"Polygon","arcs":[[-5628,8322,8323,8324,-7984,-8322]],"properties":{"id":"24662375","dp":4733,"de":658}},{"type":"Polygon","arcs":[[-5623,-5614,8325,-8323,-5627]],"properties":{"id":"24662376","dp":2997,"de":581}},{"type":"Polygon","arcs":[[8326,-8324,-8326,-5613,-5606,8327]],"properties":{"id":"24662377","dp":3448,"de":446}},{"type":"Polygon","arcs":[[-7985,-8325,-8327,8328,8329]],"properties":{"id":"24662378","dp":3647,"de":0}},{"type":"Polygon","arcs":[[8330,-8329,-8328,-5612,8331]],"properties":{"id":"24662379","dp":3241,"de":0}},{"type":"Polygon","arcs":[[-7986,-8330,-8331,8332,8333]],"properties":{"id":"24662380","dp":3099,"de":0}},{"type":"Polygon","arcs":[[8334,8335,-8333,-8332,-5611,-5603]],"properties":{"id":"24662381","dp":4255,"de":0}},{"type":"Polygon","arcs":[[-7987,-8334,-8336,8336,-7982]],"properties":{"id":"24662382","dp":3573,"de":0}},{"type":"Polygon","arcs":[[-8335,-5602,-5600,-7983,-8337]],"properties":{"id":"24662383","dp":3995,"de":490}},{"type":"Polygon","arcs":[[8337,8338,8339,8340]],"properties":{"id":"24662795","dp":6055,"de":628}},{"type":"Polygon","arcs":[[8341,8342,-8341,8343,-6849]],"properties":{"id":"24662796","dp":5903,"de":2245}},{"type":"Polygon","arcs":[[8344,-8342,8345]],"properties":{"id":"24662797","dp":12400,"de":1473}},{"type":"Polygon","arcs":[[-6513,8346,-6507,-8338,-8343,-8345,8347,-6518]],"properties":{"id":"24662798","dp":7111,"de":1268}},{"type":"Polygon","arcs":[[-6512,-6502,-8347]],"properties":{"id":"24662799","dp":7366,"de":0}},{"type":"Polygon","arcs":[[-6519,-8348,-8346,-6848,8348,-6852]],"properties":{"id":"24662800","dp":6167,"de":623}},{"type":"Polygon","arcs":[[-8349,-6846,-6853]],"properties":{"id":"24662801","dp":10099,"de":2871}},{"type":"Polygon","arcs":[[-3611,8349,-3601,-8146,-8148,-4550]],"properties":{"id":"24662460","dp":3895,"de":1150}},{"type":"Polygon","arcs":[[-5935,-5941,-5944,-7995,-8000,8350,8351]],"properties":{"id":"24662390","dp":2804,"de":400}},{"type":"Polygon","arcs":[[-5304,-5302,8352,8353,-8351,-7999,-5579]],"properties":{"id":"24662391","dp":4464,"de":876}},{"type":"Polygon","arcs":[[-5287,8354,8355,8356,-8353,-5301,-5289]],"properties":{"id":"24662392","dp":5260,"de":660}},{"type":"Polygon","arcs":[[8357,8358,8359,-8356]],"properties":{"id":"24662393","dp":3702,"de":0}},{"type":"Polygon","arcs":[[8360,8361,-8358,-8355,-5286,8362]],"properties":{"id":"24662394","dp":4310,"de":282}},{"type":"Polygon","arcs":[[-5930,-5937,8363,-8359,-8362,8364]],"properties":{"id":"24662395","dp":3556,"de":466}},{"type":"Polygon","arcs":[[-5936,-8352,-8354,-8357,-8360,-8364]],"properties":{"id":"24662396","dp":3551,"de":0}},{"type":"Polygon","arcs":[[-5407,-5419,-5424,-8225,-5931,-8365,-8361,8365]],"properties":{"id":"24662397","dp":1083,"de":645}},{"type":"Polygon","arcs":[[-8366,-8363,8366,8367,-5408]],"properties":{"id":"24662398","dp":3300,"de":828}},{"type":"Polygon","arcs":[[-8367,-5285,8368,8369]],"properties":{"id":"24662399","dp":5645,"de":931}},{"type":"Polygon","arcs":[[-8368,-8370,8370,8371,8372,8373,-5411]],"properties":{"id":"24662400","dp":5122,"de":1226}},{"type":"Polygon","arcs":[[-8371,-8369,-5284,-5278,-5283,8374,8375]],"properties":{"id":"24662401","dp":3008,"de":531}},{"type":"Polygon","arcs":[[-8372,-8376,8376]],"properties":{"id":"24662402","dp":9081,"de":0}},{"type":"Polygon","arcs":[[-8028,8377,-8373,-8377,-8375,-5282,-8039,-8033]],"properties":{"id":"24662403","dp":6617,"de":0}},{"type":"Polygon","arcs":[[-5412,-8374,-8378,-8027]],"properties":{"id":"24662404","dp":9221,"de":0}},{"type":"Polygon","arcs":[[-3582,-6946,-6898,8378]],"properties":{"id":"24662822","dp":3355,"de":0}},{"type":"Polygon","arcs":[[-8379,-6897,-882,8379]],"properties":{"id":"24662823","dp":4159,"de":0}},{"type":"Polygon","arcs":[[-3583,-8380,-881,8380,-6943,-6945]],"properties":{"id":"24662824","dp":5738,"de":0}},{"type":"Polygon","arcs":[[-6937,-6944,-8381,-880,8381]],"properties":{"id":"24662825","dp":4732,"de":0}},{"type":"Polygon","arcs":[[-6938,-8382,-884,8382]],"properties":{"id":"24662826","dp":9033,"de":0}},{"type":"Polygon","arcs":[[-8383,-879,8383,-6939]],"properties":{"id":"24662827","dp":8535,"de":656}},{"type":"Polygon","arcs":[[-8384,-875,8384,-6941]],"properties":{"id":"24662828","dp":4735,"de":0}},{"type":"Polygon","arcs":[[-8385,-874,-869,-6748,-6749,-6752]],"properties":{"id":"24662829","dp":6797,"de":0}},{"type":"Polygon","arcs":[[8385,8386,-8051,-5159]],"properties":{"id":"24662417","dp":9238,"de":538}},{"type":"Polygon","arcs":[[-5155,8387,-5158,-3444]],"properties":{"id":"24662418","dp":8750,"de":0}},{"type":"Polygon","arcs":[[8388,-8386,-8388,-5154,-5975]],"properties":{"id":"24662419","dp":6129,"de":0}},{"type":"Polygon","arcs":[[-8032,-8036,-8038,-8041,-8048,-8050,-8387,-8389,-5974,8389]],"properties":{"id":"24662420","dp":539,"de":159}},{"type":"Polygon","arcs":[[-5957,-1531,-1526,-1524,-1520,-1519,-1513,8390,-5403,-8026,-3503,-8030,-8390,-5973]],"properties":{"id":"24662421","dp":93,"de":1414}},{"type":"Polygon","arcs":[[-1512,8391,8392,-6588,-6582,-6587,-6591,-5392,-8391]],"properties":{"id":"24662422","dp":1808,"de":351}},{"type":"Polygon","arcs":[[8393,-6589,-8393]],"properties":{"id":"24662423","dp":2362,"de":0}},{"type":"Polygon","arcs":[[-6574,-6580,-6590,-8394,-8392,-1511,-1504]],"properties":{"id":"24662424","dp":2937,"de":0}},{"type":"Polygon","arcs":[[-1932,-7717,-3522,-1610,-1615,-1617,-1619,-1622,-1627,-6930,8394,8395,-7094,-7101,-1404,-1410,-1423]],"properties":{"id":"24662849","dp":137,"de":2719}},{"type":"Polygon","arcs":[[8396,-8395,-6929,-6921,-6761,-6758,8397]],"properties":{"id":"24662850","dp":1660,"de":2564}},{"type":"Polygon","arcs":[[8398,-8398,-2084,8399,8400,8401]],"properties":{"id":"24662851","dp":6271,"de":2103}},{"type":"Polygon","arcs":[[-8400,-2087,-2090,8402,8403]],"properties":{"id":"24662852","dp":7329,"de":1475}},{"type":"Polygon","arcs":[[-8404,8404,8405,-8401]],"properties":{"id":"24662853","dp":8669,"de":0}},{"type":"Polygon","arcs":[[8406,-8405,-8403,-2093,8407,8408]],"properties":{"id":"24662854","dp":7892,"de":0}},{"type":"Polygon","arcs":[[-8402,-8406,-8407,8409,8410]],"properties":{"id":"24662855","dp":8326,"de":0}},{"type":"Polygon","arcs":[[8411,-8410,-8409,8412,-6711]],"properties":{"id":"24662856","dp":5615,"de":0}},{"type":"Polygon","arcs":[[-8408,-6723,-6712,-8413]],"properties":{"id":"24662857","dp":6407,"de":1388}},{"type":"Polygon","arcs":[[-8314,-8311,-6197,8413,-8317]],"properties":{"id":"24662662","dp":7637,"de":1026}},{"type":"Polygon","arcs":[[-8318,-8414,-6196,-6494,8414]],"properties":{"id":"24662663","dp":11495,"de":0}},{"type":"Polygon","arcs":[[-8319,-8415,-6493,8415,8416,-8072]],"properties":{"id":"24662664","dp":9173,"de":0}},{"type":"Polygon","arcs":[[-8416,-6495,8417,8418]],"properties":{"id":"24662665","dp":10692,"de":1207}},{"type":"Polygon","arcs":[[-8073,-8417,-8419,8419,-7315,-8069]],"properties":{"id":"24662666","dp":6614,"de":1566}},{"type":"Polygon","arcs":[[-8420,8420,8421,-7310,-7313]],"properties":{"id":"24662667","dp":7802,"de":1121}},{"type":"Polygon","arcs":[[-8418,-6287,8422,8423,-8421]],"properties":{"id":"24662668","dp":8275,"de":1793}},{"type":"Polygon","arcs":[[-7311,-8422,-8424,8424,-6285,-6294,-6301]],"properties":{"id":"24662669","dp":8402,"de":1341}},{"type":"Polygon","arcs":[[-6286,-8425,-8423]],"properties":{"id":"24662670","dp":7604,"de":0}},{"type":"Polygon","arcs":[[-6335,-6330,8425,8426,-5697]],"properties":{"id":"24663047","dp":2602,"de":2169}},{"type":"Polygon","arcs":[[-5694,-5698,-8427,8427,8428]],"properties":{"id":"24663048","dp":3553,"de":419}},{"type":"Polygon","arcs":[[-6843,-6837,-5663,-5695,-8429,8429]],"properties":{"id":"24663049","dp":4050,"de":746}},{"type":"Polygon","arcs":[[8430,8431,8432,-8241]],"properties":{"id":"24662769","dp":25506,"de":0}},{"type":"Polygon","arcs":[[8433,-8432,8434,8435]],"properties":{"id":"24662770","dp":21375,"de":0}},{"type":"Polygon","arcs":[[8436,-8436,8437,8438]],"properties":{"id":"24662771","dp":20604,"de":0}},{"type":"Polygon","arcs":[[-6671,-8438,-8435,-8431,-8240,-8230,-6677]],"properties":{"id":"24662772","dp":16165,"de":0}},{"type":"Polygon","arcs":[[-8437,8439,8440,-8237,-8239,-8242,-8433,-8434]],"properties":{"id":"24662773","dp":23203,"de":0}},{"type":"Polygon","arcs":[[8441,8442,8443,8444,8445,-6891,-8441]],"properties":{"id":"24662774","dp":23203,"de":0}},{"type":"Polygon","arcs":[[8446,-6886,-6892,-8446]],"properties":{"id":"24662775","dp":10721,"de":0}},{"type":"Polygon","arcs":[[-8445,8447,-6887,-8447]],"properties":{"id":"24662776","dp":19648,"de":0}},{"type":"Polygon","arcs":[[-8444,8448,-6888,-8448]],"properties":{"id":"24662777","dp":17637,"de":0}},{"type":"Polygon","arcs":[[8449,-6889,-8449,-8443]],"properties":{"id":"24662778","dp":17371,"de":1359}},{"type":"Polygon","arcs":[[-8450,-8442,8450,8451,8452,-6884]],"properties":{"id":"24662779","dp":16058,"de":0}},{"type":"Polygon","arcs":[[8453,8454,-8452]],"properties":{"id":"24662780","dp":11947,"de":0}},{"type":"Polygon","arcs":[[-8453,-8455,8455,-6871,-6874,-6881]],"properties":{"id":"24662781","dp":16317,"de":0}},{"type":"Polygon","arcs":[[-8454,-8451,-8440,-8439,-6670,-6668,-7723,8456,8457,-8456]],"properties":{"id":"24662782","dp":4226,"de":2476}},{"type":"Polygon","arcs":[[8458,-6867,-6868,-8458]],"properties":{"id":"24662783","dp":6920,"de":1739}},{"type":"Polygon","arcs":[[-7722,-7720,8459,8460,-8459,-8457]],"properties":{"id":"24662784","dp":6180,"de":431}},{"type":"Polygon","arcs":[[-8461,8461,8462,-6862,-6865]],"properties":{"id":"24662785","dp":6323,"de":0}},{"type":"Polygon","arcs":[[-7719,8463,8464,8465,-8462,-8460]],"properties":{"id":"24662786","dp":3458,"de":468}},{"type":"Polygon","arcs":[[-3610,-3602,-8350]],"properties":{"id":"24662461","dp":4240,"de":0}},{"type":"Polygon","arcs":[[-8125,-8129,-3605]],"properties":{"id":"24662463","dp":11983,"de":0}},{"type":"Polygon","arcs":[[-5967,8466,8467,-6032]],"properties":{"id":"24662465","dp":5102,"de":759}},{"type":"Polygon","arcs":[[-5966,-5979,-7329,8468,8469,-8467]],"properties":{"id":"24662466","dp":4620,"de":338}},{"type":"Polygon","arcs":[[8470,8471,-8469,-7328,-7325,8472]],"properties":{"id":"24662467","dp":2391,"de":0}},{"type":"Polygon","arcs":[[8473,-8471,8474,8475,8476,8477,8478]],"properties":{"id":"24662468","dp":4822,"de":559}},{"type":"Polygon","arcs":[[-8473,8479,-8475]],"properties":{"id":"24662469","dp":3556,"de":564}},{"type":"Polygon","arcs":[[8480,-8480,-7324,-8160,8481,8482]],"properties":{"id":"24662470","dp":3623,"de":279}},{"type":"Polygon","arcs":[[8483,-8476,-8481,8484]],"properties":{"id":"24662471","dp":7373,"de":0}},{"type":"Polygon","arcs":[[8485,-8485,-8483,8486]],"properties":{"id":"24662472","dp":5387,"de":0}},{"type":"Polygon","arcs":[[8487,-8484,-8486,8488]],"properties":{"id":"24662473","dp":12297,"de":0}},{"type":"Polygon","arcs":[[8489,-8489,-8487,-8482,-8165,8490]],"properties":{"id":"24662474","dp":4198,"de":270}},{"type":"Polygon","arcs":[[-6810,8491,-912,-910,-6832,-6827,-6822]],"properties":{"id":"24662897","dp":3813,"de":123}},{"type":"Polygon","arcs":[[8492,-913,-8492,-6809]],"properties":{"id":"24662898","dp":4568,"de":568}},{"type":"Polygon","arcs":[[8493,-907,-8493,-6808,8494]],"properties":{"id":"24662899","dp":2107,"de":1585}},{"type":"Polygon","arcs":[[8495,8496,-902,-904,-8494]],"properties":{"id":"24662900","dp":4924,"de":665}},{"type":"Polygon","arcs":[[-8497,8497,-6731,8498,-897,-903]],"properties":{"id":"24662901","dp":2928,"de":1075}},{"type":"Polygon","arcs":[[-898,-8499,-6735,-887,-893]],"properties":{"id":"24662902","dp":2286,"de":710}},{"type":"Polygon","arcs":[[-7096,8499,-6717,-6722,-8498,-8496,-8495,-6807]],"properties":{"id":"24662903","dp":521,"de":1841}},{"type":"Polygon","arcs":[[-8396,-8397,-8399,-8411,-8412,-6715,-6718,-8500,-7095]],"properties":{"id":"24662904","dp":812,"de":707}},{"type":"Polygon","arcs":[[8500,-8284]],"properties":{"id":"24662234","dp":14190,"de":0}},{"type":"Polygon","arcs":[[8501,-8285,-8501,-8283]],"properties":{"id":"24662235","dp":16380,"de":3095}},{"type":"Polygon","arcs":[[8502,-8181,8503]],"properties":{"id":"24662484","dp":19962,"de":1492}},{"type":"Polygon","arcs":[[8504,8505,-8491,-8164,-8182,-8503,8506,-3405]],"properties":{"id":"24662485","dp":5838,"de":1651}},{"type":"Polygon","arcs":[[-8507,-8504,-8180,-3406]],"properties":{"id":"24662486","dp":14878,"de":0}},{"type":"Polygon","arcs":[[-8187,8507,-3410]],"properties":{"id":"24662489","dp":9876,"de":2160}},{"type":"Polygon","arcs":[[8508,-8508,8509,-4335]],"properties":{"id":"24662490","dp":19199,"de":0}},{"type":"Polygon","arcs":[[-8509,8510,-3411]],"properties":{"id":"24662491","dp":34928,"de":0}},{"type":"Polygon","arcs":[[-3402,-8511,-4334,-5997,8511]],"properties":{"id":"24662492","dp":12140,"de":0}},{"type":"Polygon","arcs":[[8512,-8470,-8472,-8474,8513,8514,8515,8516,-3403,-8512,-5996,-6034]],"properties":{"id":"24662493","dp":1490,"de":1459}},{"type":"Polygon","arcs":[[-8468,-8513,-6033]],"properties":{"id":"24662494","dp":4528,"de":1570}},{"type":"Polygon","arcs":[[-8514,-8479,8517,8518]],"properties":{"id":"24662495","dp":9017,"de":0}},{"type":"Polygon","arcs":[[-8478,8519,8520,-8518]],"properties":{"id":"24662496","dp":8538,"de":0}},{"type":"Polygon","arcs":[[-8515,-8519,-8521,8521,8522]],"properties":{"id":"24662497","dp":7138,"de":0}},{"type":"Polygon","arcs":[[-8522,-8520,-8477,-8488,8523]],"properties":{"id":"24662498","dp":6698,"de":0}},{"type":"Polygon","arcs":[[8524,-8516,-8523,-8524,-8490,-8506]],"properties":{"id":"24662499","dp":2859,"de":0}},{"type":"Polygon","arcs":[[-8517,-8525,-8505,-3404]],"properties":{"id":"24662500","dp":5176,"de":1158}},{"type":"Polygon","arcs":[[-8510,-8186,8525,-4336]],"properties":{"id":"24662501","dp":7973,"de":460}},{"type":"Polygon","arcs":[[8526,8527,8528,8529,-1144,-7120,-7121]],"properties":{"id":"24662919","dp":3474,"de":1285}},{"type":"Polygon","arcs":[[8530,-8527,-7122,-7116,-7107]],"properties":{"id":"24662920","dp":5565,"de":1180}},{"type":"Polygon","arcs":[[-6997,8531,-8528,-8531,-7106,-7097,-6805,8532,-7144,-7142]],"properties":{"id":"24662921","dp":173,"de":1649}},{"type":"Polygon","arcs":[[-8529,-8532,-7001,8533,8534,8535]],"properties":{"id":"24662922","dp":6053,"de":1490}},{"type":"Polygon","arcs":[[-8530,-8536,8536,-1145]],"properties":{"id":"24662923","dp":3874,"de":0}},{"type":"Polygon","arcs":[[-8537,-8535,8537,-1146]],"properties":{"id":"24662924","dp":10460,"de":0}},{"type":"Polygon","arcs":[[-8534,8538,-1151,-1147,-8538]],"properties":{"id":"24662925","dp":8115,"de":687}},{"type":"Polygon","arcs":[[-8539,-7000,8539,-3789]],"properties":{"id":"24662926","dp":10821,"de":0}},{"type":"Polygon","arcs":[[-6999,-6996,-3782,-8540]],"properties":{"id":"24662927","dp":7975,"de":0}},{"type":"Polygon","arcs":[[8540,8541,8542,-3520,8543,-2349,8544,8545,8546,8547]],"properties":{"id":"24662518","dp":3065,"de":950}},{"type":"Polygon","arcs":[[-2386,-2397,8548,-3514,-8543,8549,8550,-2388]],"properties":{"id":"24662519","dp":1466,"de":1851}},{"type":"Polygon","arcs":[[-8550,-8542,8551]],"properties":{"id":"24662520","dp":6465,"de":0}},{"type":"Polygon","arcs":[[-8551,-8552,-8541,8552,-2373,-2389]],"properties":{"id":"24662521","dp":6449,"de":464}},{"type":"Polygon","arcs":[[-8553,-8548,8553,-2374]],"properties":{"id":"24662522","dp":7862,"de":703}},{"type":"Polygon","arcs":[[-8554,-8547,8554,-2375]],"properties":{"id":"24662523","dp":9225,"de":1320}},{"type":"Polygon","arcs":[[-8555,-8546,8555,-2369]],"properties":{"id":"24662524","dp":9885,"de":1575}},{"type":"Polygon","arcs":[[-8556,-8545,-2348,8556,-2366]],"properties":{"id":"24662525","dp":5619,"de":1733}},{"type":"Polygon","arcs":[[-8557,-2347,8557,-2359]],"properties":{"id":"24662526","dp":7254,"de":751}},{"type":"Polygon","arcs":[[-8558,-2346,-2360]],"properties":{"id":"24662527","dp":8389,"de":4424}},{"type":"Polygon","arcs":[[-7147,-7145,-8533,-6821,8558,8559,8560,-6815,-6829,-6831,8561,-1139,-1128]],"properties":{"id":"24662936","dp":292,"de":277}},{"type":"Polygon","arcs":[[-6820,8562,-8559]],"properties":{"id":"24662937","dp":3045,"de":0}},{"type":"Polygon","arcs":[[8563,8564,-8560,-8563,-6819]],"properties":{"id":"24662938","dp":626,"de":553}},{"type":"Polygon","arcs":[[-6818,8565,-6816,8566,-8564]],"properties":{"id":"24662939","dp":4716,"de":212}},{"type":"Polygon","arcs":[[-8561,-8565,-8567]],"properties":{"id":"24662940","dp":7082,"de":0}},{"type":"Polygon","arcs":[[-6817,-8566]],"properties":{"id":"24662941","dp":8629,"de":0}},{"type":"Polygon","arcs":[[-6647,8567,-8464,-7718,-6652]],"properties":{"id":"24662787","dp":10380,"de":0}},{"type":"Polygon","arcs":[[8568,-8465,-8568,-6646]],"properties":{"id":"24662788","dp":7279,"de":0}},{"type":"Polygon","arcs":[[-8569,-6645,-6642,-6630,8569,8570,8571,-6863,-8463,-8466]],"properties":{"id":"24662789","dp":3669,"de":1229}},{"type":"Polygon","arcs":[[-6625,-6850,-8344,8572,-8570,-6627]],"properties":{"id":"24662790","dp":4535,"de":608}},{"type":"Polygon","arcs":[[-8340,8573,8574,-8571,-8573]],"properties":{"id":"24662791","dp":7766,"de":431}},{"type":"Polygon","arcs":[[-8575,8575,8576,-8572]],"properties":{"id":"24662792","dp":7101,"de":0}},{"type":"Polygon","arcs":[[8577,-6855,-6864,-8577]],"properties":{"id":"24662793","dp":8053,"de":0}},{"type":"Polygon","arcs":[[-8574,-8339,-6506,8578,-6856,-8578,-8576]],"properties":{"id":"24662794","dp":4649,"de":521}},{"type":"Polygon","arcs":[[-7249,-5125,8579,8580]],"properties":{"id":"24661448","dp":19959,"de":1829}},{"type":"Polygon","arcs":[[-7250,-8581,8581,-7257]],"properties":{"id":"24661449","dp":16301,"de":2397}},{"type":"Polygon","arcs":[[-8582,8582,-7189,-7703]],"properties":{"id":"24661450","dp":14756,"de":2951}},{"type":"Polygon","arcs":[[-8580,8583,-7187,-8583]],"properties":{"id":"24661451","dp":16106,"de":2663}},{"type":"Polygon","arcs":[[8584,-7185,-8584,-5124]],"properties":{"id":"24661452","dp":12818,"de":5369}},{"type":"Polygon","arcs":[[8585,-7186,-8585,-5123,-5121]],"properties":{"id":"24661453","dp":11920,"de":6989}},{"type":"Polygon","arcs":[[8586,-7079,-8586,-5117,-7736]],"properties":{"id":"24661454","dp":11504,"de":7619}},{"type":"Polygon","arcs":[[-7075,-8587,-7735,8587]],"properties":{"id":"24661455","dp":12901,"de":4948}},{"type":"Polygon","arcs":[[-7055,-7067,-7069,-8588,-7733]],"properties":{"id":"24661456","dp":13718,"de":5895}},{"type":"Polygon","arcs":[[-8246,-6112,8588,-6367,-6376,-8286,-8502,-8282,-8263]],"properties":{"id":"24662236","dp":1511,"de":4086}},{"type":"Polygon","arcs":[[-6111,8589,-6108,-6368,-8589]],"properties":{"id":"24662237","dp":3294,"de":422}},{"type":"Polygon","arcs":[[-1098,8590,-1118,-1116]],"properties":{"id":"24662556","dp":11476,"de":0}},{"type":"Polygon","arcs":[[8591,8592,-8205,8593,8594,-1119,-8591,-1097]],"properties":{"id":"24662557","dp":4123,"de":3292}},{"type":"Polygon","arcs":[[8595,-8595,8596,8597]],"properties":{"id":"24662558","dp":8326,"de":0}},{"type":"Polygon","arcs":[[-8598,8598,8599,8600]],"properties":{"id":"24662559","dp":5288,"de":613}},{"type":"Polygon","arcs":[[8601,-8214,-8217,-8599]],"properties":{"id":"24662560","dp":12432,"de":720}},{"type":"Polygon","arcs":[[-8204,-8209,-8212,-8602,-8597,-8594]],"properties":{"id":"24662561","dp":9287,"de":2833}},{"type":"Polygon","arcs":[[-8600,-8216,-8221,8602]],"properties":{"id":"24662562","dp":8028,"de":976}},{"type":"Polygon","arcs":[[-2402,8603,-8603,-8220,8604]],"properties":{"id":"24662563","dp":8239,"de":4731}},{"type":"Polygon","arcs":[[-1120,-8596,-8601,-8604,-2406]],"properties":{"id":"24662564","dp":4582,"de":474}},{"type":"Polygon","arcs":[[-2395,-2403,-8605,-8219,-8223,8605]],"properties":{"id":"24662565","dp":3355,"de":610}},{"type":"Polygon","arcs":[[-2396,-8606,-8224,-8549]],"properties":{"id":"24662566","dp":3272,"de":0}},{"type":"Polygon","arcs":[[-8196,-8200,-8202,-8593,8606]],"properties":{"id":"24662567","dp":3434,"de":622}},{"type":"Polygon","arcs":[[8607,-8197,-8607,-8592,8608]],"properties":{"id":"24662568","dp":3493,"de":565}},{"type":"Polygon","arcs":[[-4328,8609,-8198,-8608,8610]],"properties":{"id":"24662569","dp":6037,"de":1204}},{"type":"Polygon","arcs":[[-3970,-3979,-4329,-8611,-8609,-1107,-5783]],"properties":{"id":"24662570","dp":2161,"de":753}},{"type":"Polygon","arcs":[[-4337,-8526,-8193,-8610,-4332]],"properties":{"id":"24662571","dp":8681,"de":0}},{"type":"Polygon","arcs":[[-2356,8611,-7289]],"properties":{"id":"24662572","dp":9447,"de":1142}},{"type":"Polygon","arcs":[[-8612,-2352,8612,8613,-7290]],"properties":{"id":"24662573","dp":9425,"de":2156}},{"type":"Polygon","arcs":[[-8614,8614,8615,8616]],"properties":{"id":"24662574","dp":7817,"de":7025}},{"type":"Polygon","arcs":[[8617,8618,-8615,-8613,-2351,8619,-8309,-8306,-8304]],"properties":{"id":"24662575","dp":2838,"de":1164}},{"type":"Polygon","arcs":[[-8616,-8619,8620,8621]],"properties":{"id":"24662576","dp":10968,"de":0}},{"type":"Polygon","arcs":[[-7282,8622,-8621,-8618,-8298]],"properties":{"id":"24662577","dp":9951,"de":1539}},{"type":"Polygon","arcs":[[-7291,-8617,-8622,-8623,-7281,-7285]],"properties":{"id":"24662578","dp":8510,"de":5229}}]}},"arcs":[[[7594,1708],[19,-83],[3,-12]],[[7616,1613],[-16,-5],[-10,-3]],[[7590,1605],[-3,12],[-2,11],[-6,28],[-7,33],[-3,12]],[[7569,1701],[25,7]],[[7554,1595],[-2,11],[-16,73],[-3,11]],[[7533,1690],[17,5],[19,6]],[[7590,1605],[-19,-6],[-17,-4]],[[7517,1685],[16,5]],[[7554,1595],[-18,-6]],[[7536,1589],[-2,12],[-15,73],[-2,11]],[[7518,1584],[-18,-5]],[[7500,1579],[-3,10],[-6,33],[-12,52]],[[7479,1674],[20,6]],[[7499,1680],[18,5]],[[7536,1589],[-18,-5]],[[7443,1562],[-2,10],[-7,31],[-2,12],[19,5],[-10,43],[19,6],[19,5]],[[7500,1579],[-19,-6]],[[7481,1573],[-19,-5],[-19,-6]],[[7443,1562],[-18,-5]],[[7425,1557],[-2,10],[-6,31],[-2,12],[-4,19],[-3,10],[-2,7],[-2,1]],[[7404,1647],[1,1],[10,20],[14,29],[2,3]],[[7431,1700],[16,-11],[24,7],[3,1],[5,-23]],[[7431,1700],[29,59],[-3,11]],[[7457,1770],[11,3],[11,3]],[[7479,1776],[3,-12],[15,-72],[2,-12]],[[7479,1776],[18,5]],[[7497,1781],[16,5]],[[7513,1786],[2,-12],[16,-72],[2,-12]],[[7513,1786],[17,5]],[[7530,1791],[19,5]],[[7549,1796],[2,-11],[16,-72],[2,-12]],[[7549,1796],[24,7]],[[7573,1803],[21,-95]],[[7573,1803],[22,7],[19,6]],[[7614,1816],[2,-11],[4,-17],[2,-10]],[[7622,1778],[6,-23],[2,-11],[3,-13],[2,-10]],[[7635,1721],[-18,-6],[-23,-7]],[[7662,1777],[4,-15],[2,-10],[2,-11],[2,-8]],[[7672,1733],[-9,-3],[-9,-3],[2,-11],[13,-56],[7,2],[2,0],[10,0]],[[7688,1662],[3,-12],[3,-12],[-9,-4],[-10,-3]],[[7675,1631],[-18,-5]],[[7657,1626],[-2,10],[-8,34],[-9,40],[-3,11]],[[7622,1778],[19,6],[2,-9],[7,2],[2,0],[10,0]],[[7735,1704],[-1,-22],[-1,-23]],[[7733,1659],[-11,1],[-34,2]],[[7672,1733],[1,-3],[63,-4]],[[7736,1726],[-1,-11],[0,-11]],[[7662,1777],[14,-1],[32,-2],[10,-1],[21,-1],[11,-1]],[[7750,1771],[1,-4]],[[7751,1767],[-1,-10],[-10,-6],[-3,-3],[-1,-11],[0,-11]],[[7808,1698],[-73,6]],[[7751,1767],[65,-4]],[[7816,1763],[-1,-20],[-5,0],[0,-11],[-1,-11],[-1,-11],[0,-12]],[[7750,1771],[1,17],[1,10]],[[7752,1798],[0,10]],[[7752,1808],[66,-4]],[[7818,1804],[-1,-21],[-1,-20]],[[7752,1808],[1,15],[0,6],[1,21],[1,6]],[[7755,1856],[1,17],[0,4],[1,20]],[[7757,1897],[4,-1],[36,-3],[15,-1],[11,-1]],[[7823,1891],[-2,-23],[-1,-23]],[[7820,1845],[-1,-21],[-1,-20]],[[7902,1819],[-8,-30],[-11,-32]],[[7883,1757],[-3,2],[-64,4]],[[7820,1845],[11,0],[38,-3],[9,-1],[-1,-20],[22,-2],[3,0]],[[7823,1891],[10,-1],[37,-2],[1,0],[10,-1],[1,27],[1,30],[1,15],[1,14]],[[7885,1973],[9,0],[10,-1],[3,0]],[[7907,1972],[4,-40],[1,-20]],[[7912,1912],[0,-8],[-2,-28],[-3,-28],[-5,-29]],[[7823,1891],[1,27],[2,30],[-11,0],[-6,1],[2,29]],[[7811,1978],[5,0],[10,-1]],[[7826,1977],[11,0],[5,-1],[9,0],[34,-3]],[[7757,1897],[1,21],[1,5],[0,16]],[[7759,1939],[1,14],[0,6],[2,24]],[[7762,1983],[9,-1],[1,0],[30,-3],[9,-1]],[[7762,1983],[1,29]],[[7763,2012],[2,29]],[[7765,2041],[11,-1],[5,0],[49,-4]],[[7830,2036],[-2,-29],[-2,-30]],[[7717,1942],[1,20],[1,23],[2,30]],[[7721,2015],[9,-1],[24,-1],[9,-1]],[[7759,1939],[-9,0],[-24,2],[-9,1]],[[7674,2018],[1,12],[0,17]],[[7675,2047],[48,-3],[38,-3],[4,0]],[[7721,2015],[-9,0],[-22,2],[-7,0],[-9,1]],[[7671,1945],[1,21]],[[7672,1966],[1,21]],[[7673,1987],[1,21],[0,10]],[[7717,1942],[-9,0],[-28,3],[-9,0]],[[7672,1966],[-9,0],[-70,6]],[[7593,1972],[-3,10],[-2,10],[75,-4],[1,0],[9,-1]],[[7593,1972],[-14,-5]],[[7579,1967],[-7,34]],[[7572,2001],[-3,11],[0,9],[-4,10]],[[7565,2031],[7,6],[23,22],[1,3],[-1,2],[2,7],[3,4],[7,8]],[[7607,2083],[6,-7],[4,-3],[23,-17],[9,-7],[26,-2]],[[7583,1952],[-4,15]],[[7671,1945],[-9,1],[-19,2],[-45,3],[-15,1]],[[7592,1912],[-2,10],[-7,30]],[[7671,1945],[-1,-20],[-2,-21]],[[7668,1904],[-8,1],[-50,3],[-3,8],[-15,-4]],[[7551,1899],[-2,5],[-7,35],[11,3],[11,4],[-11,49],[9,3],[10,3]],[[7592,1912],[-19,-6],[-11,-4],[-11,-3]],[[6769,2744],[-8,6],[-44,32],[-9,7]],[[6708,2789],[10,19],[6,11]],[[6724,2819],[20,-16],[21,-15],[6,11],[7,13]],[[6778,2812],[20,-16],[-12,-23],[-6,-11],[-7,-13],[-4,-5]],[[6744,2698],[-14,11],[-47,35]],[[6683,2744],[12,22],[13,23]],[[6769,2744],[-12,-24],[-6,-11],[-7,-11]],[[6818,2644],[-31,22],[-4,4],[-39,28]],[[6778,2812],[-7,7],[1,2],[1,2],[2,4]],[[6775,2827],[61,-45]],[[6836,2782],[40,-30]],[[6876,2752],[-1,-4],[-2,-3],[-8,-14],[-6,-13],[-13,-23]],[[6846,2695],[-16,-29],[-12,-22]],[[6818,2644],[-7,-13]],[[6811,2631],[-73,56]],[[6738,2687],[6,11]],[[6787,2558],[-23,-1],[-16,3]],[[6748,2560],[6,11],[3,15],[-23,5],[-23,6],[-22,15],[-20,14]],[[6669,2626],[9,13],[9,7],[18,6],[14,-1],[13,24],[6,12]],[[6811,2631],[-6,-11],[-12,-21],[-7,-15],[0,-14],[1,-12]],[[6872,2507],[-3,-1],[-24,-14]],[[6845,2492],[-20,-11],[-11,-3],[-8,-2],[-15,-1]],[[6791,2475],[-1,26],[0,3],[-2,26],[18,2],[5,2],[6,3],[7,6],[-18,13],[-5,2],[-5,1],[-9,-1]],[[6811,2631],[27,-20],[36,-27],[3,-2]],[[6877,2582],[-6,-10],[-12,-22],[-13,-24],[16,-12],[10,-7]],[[6736,2472],[-8,5],[-26,6],[-25,11]],[[6677,2494],[19,20],[2,2],[24,20],[16,11],[10,13]],[[6791,2475],[-28,-2],[-27,-1]],[[6864,2373],[-89,66],[-36,26],[-3,7]],[[6845,2492],[59,-43]],[[6904,2449],[-12,-23],[-13,-24]],[[6879,2402],[-13,-25],[-2,-4]],[[6831,2309],[-90,66]],[[6741,2375],[-59,44]],[[6682,2419],[17,18],[16,18],[16,16],[5,1]],[[6864,2373],[-11,-20]],[[6853,2353],[-12,-21],[-4,-10],[-6,-13]],[[6831,2309],[-11,-22],[-30,22],[-18,-17],[37,-26]],[[6809,2266],[-6,-10],[-11,-14]],[[6792,2242],[-15,11],[-5,-1],[-14,9],[-7,0],[-38,24]],[[6713,2285],[10,20],[2,13],[0,25],[4,10],[12,22]],[[6888,2268],[-11,-22],[-12,-21]],[[6865,2225],[-56,41]],[[6831,2309],[57,-41]],[[6853,2353],[45,-34],[11,-8]],[[6909,2311],[-11,-20],[-10,-23]],[[6879,2402],[56,-41]],[[6935,2361],[-13,-25],[-13,-25]],[[6904,2449],[56,-42]],[[6960,2407],[-12,-23],[-13,-23]],[[6999,2314],[-64,47]],[[6960,2407],[64,-48]],[[7024,2359],[-12,-22],[-13,-23]],[[6960,2407],[6,10],[5,11],[11,19]],[[6982,2447],[64,-48]],[[7046,2399],[-10,-20],[-6,-10],[-6,-10]],[[6982,2447],[11,19]],[[6993,2466],[11,20]],[[7004,2486],[64,-48]],[[7068,2438],[-11,-20],[-11,-19]],[[7004,2486],[10,20],[11,20]],[[7025,2526],[11,-7]],[[7036,2519],[53,-41]],[[7089,2478],[-10,-20],[-11,-20]],[[7167,2476],[-2,-2],[-2,2],[-1,0],[-1,0],[-2,-2],[-1,-4],[-17,-31]],[[7141,2439],[-18,13],[-16,13],[-18,13]],[[7036,2519],[9,19],[55,-41],[11,20],[5,10],[2,2],[2,5],[2,3],[2,4]],[[7124,2541],[5,-8],[10,-20],[5,-9],[1,0],[5,-8],[7,-9],[5,-5],[5,-6]],[[7025,2526],[-9,7],[-13,11],[-1,3]],[[7002,2547],[5,0],[14,4],[7,3],[5,2]],[[7033,2556],[5,4],[6,5],[4,3],[5,8]],[[7053,2576],[11,20],[3,4],[2,4],[1,3]],[[7070,2607],[5,-3],[6,-5],[7,-7],[5,-5],[9,-10],[5,-7],[4,-6],[2,-3],[7,-12],[4,-8]],[[7234,2415],[-4,3],[-11,9],[-8,8],[-10,8],[-6,7],[-7,7],[-18,16],[-3,3]],[[7070,2607],[2,4]],[[7072,2611],[8,-6],[11,-8],[14,-13],[26,-31],[12,-8]],[[7143,2545],[5,-4],[17,-13],[51,-38]],[[7216,2490],[41,-31]],[[7257,2459],[-9,-18],[-3,-6]],[[7245,2435],[-1,-1],[-6,-12],[-3,-5],[-1,-2]],[[7272,2574],[42,-32]],[[7314,2542],[-7,-9],[-16,-20]],[[7291,2513],[-13,-19],[-11,-18]],[[7267,2476],[-10,-17]],[[7216,2490],[9,17],[10,18]],[[7235,2525],[7,9],[7,10],[-34,26],[10,17],[2,5],[37,-27],[6,7],[2,2]],[[7235,2525],[-73,55],[-10,-18],[-5,-10],[-4,-7]],[[7072,2611],[2,4],[1,4],[4,6],[5,8],[29,35],[19,20],[14,8],[1,0],[14,2],[15,-2],[11,-2],[6,1],[9,2]],[[7202,2697],[16,10],[4,3]],[[7222,2710],[43,-31],[9,-8],[-15,-39],[-8,-16],[-5,-9],[-5,-10],[5,-4],[8,-6],[7,-5],[11,-8]],[[7202,2697],[-13,10],[-4,3],[-25,19],[-5,3],[-5,6],[0,6],[-11,-1],[-11,-15]],[[7128,2728],[2,10],[-1,7],[-3,7],[-4,11],[-8,8],[-24,17]],[[7090,2788],[-6,22],[2,13]],[[7086,2823],[94,-70],[4,-2]],[[7184,2751],[-6,-11],[27,-17],[17,-13]],[[7060,2684],[-2,7],[-14,56],[-8,36],[-7,15],[-9,8]],[[7020,2806],[6,9],[9,5],[13,0],[10,-8],[32,-24]],[[7128,2728],[-14,-20],[-4,-6],[-20,-26],[-15,-2],[-15,10]],[[7060,2684],[-32,25],[-5,4]],[[7023,2713],[-36,28],[-7,6],[-1,1],[-13,7]],[[6966,2755],[31,58]],[[6997,2813],[4,7]],[[7001,2820],[19,-14]],[[7001,2820],[26,47]],[[7027,2867],[59,-44]],[[6997,2813],[-18,13],[-17,13]],[[6962,2839],[-16,12]],[[6946,2851],[30,54]],[[6976,2905],[16,-12],[17,-12],[18,-14]],[[8099,2087],[4,74]],[[8103,2161],[21,-1]],[[8124,2160],[22,-2]],[[8146,2158],[-4,-74]],[[8142,2084],[-21,2],[-22,1]],[[8146,2158],[21,-1]],[[8167,2157],[-3,-75],[-22,2]],[[8138,2014],[4,70]],[[8167,2157],[10,-1],[1,0],[2,0],[9,-1]],[[8189,2155],[-4,-74]],[[8185,2081],[-4,-71]],[[8181,2010],[-21,3],[-22,1]],[[7911,3064],[-4,5],[-6,5],[-4,4],[-3,3]],[[7894,3081],[22,34]],[[7916,3115],[13,-9],[1,0],[7,-5]],[[7937,3101],[-11,-17],[-6,-8],[-2,-2],[-2,-3],[-5,-7]],[[7894,3081],[-11,11],[-11,11]],[[7872,3103],[15,28]],[[7887,3131],[29,-16]],[[7072,2611],[-2,1],[-16,13],[-15,11],[20,37],[1,11]],[[7078,3651],[-13,-25]],[[7065,3626],[-6,5],[-5,2],[-13,8],[-13,5],[-6,4],[-1,-1],[0,-2],[-4,5],[-31,-1]],[[6986,3651],[16,28]],[[7002,3679],[3,-2],[5,-1],[5,-1],[6,0],[6,0]],[[7027,3675],[4,1],[6,-1],[7,-2],[7,-2],[8,-6],[19,-14]],[[6939,2583],[-44,33]],[[6895,2616],[11,20],[6,10]],[[6912,2646],[13,23],[14,27],[2,3],[1,4]],[[6942,2703],[45,-33]],[[6987,2670],[-2,-4],[-2,-3],[-7,-13],[-7,-13]],[[6969,2637],[-13,-22]],[[6956,2615],[-6,-12],[-11,-20]],[[8730,6185],[-9,-28]],[[8721,6157],[-8,-21],[-7,-21],[-8,-21],[-7,-22],[-7,-19],[-5,-13]],[[8679,6040],[-18,-52]],[[8661,5988],[-3,2],[-3,1],[-9,5],[-9,4],[8,22],[-40,22],[-9,5],[-40,22],[-9,-21]],[[8547,6050],[-16,8]],[[8531,6058],[8,22],[-53,29]],[[8486,6109],[-47,25]],[[8439,6134],[-2,2]],[[8437,6136],[48,122]],[[8485,6258],[58,-28],[2,23]],[[8545,6253],[100,-39],[3,9],[45,-26],[8,0],[3,0],[6,-1],[17,-10],[3,-1]],[[8565,5953],[-7,-19]],[[8558,5934],[-45,25],[-18,10]],[[8495,5969],[7,18],[-16,9],[-15,9]],[[8471,6005],[8,23],[12,27],[16,-9],[7,18],[1,3],[16,-9]],[[8547,6050],[16,-9],[-1,-3],[-7,-18],[-21,-50],[31,-17]],[[8634,5915],[-2,2],[-12,6],[-9,5],[-16,8],[-30,17]],[[8661,5988],[-2,-3],[-17,-48],[-8,-22]],[[8471,6005],[-33,17],[10,23],[18,45],[1,3]],[[8467,6093],[10,-5],[9,21]],[[8495,5969],[-6,-14],[-4,-8],[-1,-3],[-11,-16],[-8,-9],[-5,-11],[-7,-17]],[[8453,5891],[-40,22]],[[8413,5913],[-53,29]],[[8360,5942],[17,40]],[[8377,5982],[8,20],[9,22]],[[8394,6024],[8,19]],[[8402,6043],[20,-11],[27,65],[1,2],[1,3],[10,-6],[6,-3]],[[8402,6043],[28,67],[1,3]],[[8431,6113],[8,21]],[[8394,6024],[-2,1],[-20,11]],[[8372,6036],[8,19]],[[8380,6055],[27,68],[1,3],[21,-12],[2,-1]],[[8380,6055],[-16,8],[-16,8]],[[8348,6071],[28,69],[1,3],[-15,8]],[[8362,6151],[8,20],[54,-29],[13,-6]],[[9365,6386],[-13,5],[-12,4],[-9,3],[-34,16],[-9,4]],[[9288,6418],[-5,30],[-5,3],[-9,4],[-6,4],[-10,5],[-10,4],[-19,10],[-10,4]],[[9214,6482],[-10,6],[-5,2]],[[9199,6490],[4,12],[5,14]],[[9208,6516],[9,-4],[55,-28],[8,-3],[-4,29],[-2,26],[-2,27]],[[9272,6563],[9,-4],[7,-4],[10,-5],[10,-4],[-1,32],[0,4],[0,4],[1,2],[0,17],[0,24]],[[9308,6629],[9,-5],[12,-4],[4,-2]],[[9333,6618],[0,-25],[-2,-5],[-1,-4],[4,-11],[1,-8],[0,-11],[3,-21],[1,-26],[2,-9],[1,-8],[1,-10],[2,-7],[1,-10],[2,-11],[1,-8],[1,-6],[14,-35],[0,-9],[1,-8]],[[9208,6516],[9,23],[7,22]],[[9224,6561],[8,22],[9,-5],[21,-10],[10,-5]],[[9224,6561],[-9,4],[-32,16],[-1,0],[-9,4],[-5,4]],[[9168,6589],[7,21]],[[9175,6610],[4,14],[16,57]],[[9195,6681],[9,-3]],[[9204,6678],[4,-1],[6,-3],[40,-19],[4,-2],[8,-4],[2,-1],[37,-19],[3,0]],[[9175,6610],[-4,2],[-9,5],[-2,0],[-19,10],[-8,4]],[[9133,6631],[8,21],[7,22],[2,8],[6,17],[4,9],[5,14],[1,3]],[[9166,6725],[2,-1],[7,-3],[16,-8],[9,-4],[-8,-27],[3,-1]],[[9133,6631],[-11,5],[-22,11],[-9,4]],[[9091,6651],[7,22]],[[9098,6673],[9,22],[8,24],[10,26]],[[9125,6745],[8,-4],[23,-11],[10,-5]],[[9117,6588],[-10,5],[-3,2],[-20,9],[-9,5],[-9,4],[-23,11],[-9,5]],[[9034,6629],[8,21],[-9,5],[-23,11],[-9,4]],[[9001,6670],[7,21]],[[9008,6691],[9,-4],[9,-4],[14,-7],[9,-4],[10,-5],[22,-11],[10,-5]],[[9133,6631],[-8,-22],[-8,-21]],[[9098,6673],[-9,4],[-23,12],[-9,4],[8,22],[3,7],[6,18]],[[9074,6740],[9,25],[7,21]],[[9090,6786],[41,-19]],[[9131,6767],[-6,-22]],[[9090,6786],[-32,15],[-9,4]],[[9049,6805],[3,11],[3,9],[11,38]],[[9066,6863],[11,-3],[8,-4],[-4,-17],[10,-5],[14,-6],[8,-4],[22,-9],[9,-4]],[[9144,6811],[-6,-22],[-7,-22]],[[9144,6811],[7,23],[5,18]],[[9156,6852],[6,18]],[[9162,6870],[9,-2],[23,-8],[9,-2]],[[9203,6858],[2,-1],[6,-2],[2,0],[18,-5],[10,-3],[5,16],[5,17],[7,21],[3,-1]],[[9261,6900],[-10,-32],[-1,-4],[-32,-109],[-2,-7],[-21,-67]],[[9308,6629],[1,2],[1,24],[1,16],[2,13],[3,24],[-1,2],[-2,1],[-9,5],[-18,8],[-3,1],[-10,5]],[[9273,6730],[-13,5],[-26,12],[-11,5],[-4,-12],[-2,-12],[-2,-11],[-4,-13]],[[9211,6704],[-7,-26]],[[9261,6900],[6,-2],[-6,-21]],[[9261,6877],[-6,-17],[-5,-16],[-4,-15],[-4,-14],[9,-2],[23,-8],[7,-3],[3,0],[3,14],[2,7],[2,9],[3,17],[4,16]],[[9298,6865],[10,-3],[12,-3],[2,-1],[9,-2],[5,22],[-9,3],[-3,1],[3,11],[3,15],[3,12],[1,6],[0,1]],[[9334,6927],[14,-5],[12,-5],[13,-1]],[[9373,6916],[1,-2],[5,1],[2,0],[-1,-2],[-3,-1],[-1,-2],[3,-7],[0,-4],[-5,-21],[-2,-13],[-6,-26],[-7,-24],[-5,-12],[-1,-6],[-1,-7],[-2,-16],[-5,-18],[-4,-22],[0,-12],[-3,-16],[0,-12],[-2,-17],[-1,-3],[-2,-2],[-1,-2],[2,-3],[1,-8],[-2,-7],[0,-12],[0,-22]],[[9261,6877],[7,-3],[2,0],[17,-5],[1,-1],[10,-3]],[[9273,6730],[-3,-27],[-1,-27],[-9,4],[-4,2],[-34,17],[-2,0],[-9,5]],[[8763,5769],[-15,-41]],[[8748,5728],[-9,5],[-37,20],[-9,5]],[[8693,5758],[-9,5],[-22,13],[-9,5]],[[8653,5781],[-9,5],[-38,21],[-9,5]],[[8597,5812],[15,40]],[[8612,5852],[15,44]],[[8627,5896],[21,-12]],[[8648,5884],[-8,-21]],[[8640,5863],[-9,-21],[9,-5],[53,-29],[8,-5],[8,-4]],[[8709,5799],[9,-5],[9,-5]],[[8727,5789],[9,-5],[9,-5],[8,-5],[10,-5]],[[8920,5998],[-8,-21]],[[8912,5977],[-10,6],[-37,20],[-9,4],[-70,39],[-11,6]],[[8775,6052],[9,21],[8,20],[8,21]],[[8800,6114],[80,-44]],[[8880,6070],[-8,-21],[-8,-20],[10,-6],[36,-20],[10,-5]],[[8880,6070],[10,-6],[37,-20],[9,-5],[-4,-11],[-4,-8],[0,-3],[-6,-15],[-2,-4]],[[8892,5924],[-11,6],[-36,20],[-9,5]],[[8836,5955],[12,31],[-10,6],[-61,33],[-10,5]],[[8767,6030],[8,22]],[[8912,5977],[-8,-21],[-8,-19],[-4,-13]],[[8881,5881],[-51,27],[-10,6]],[[8820,5914],[7,19],[9,22]],[[8892,5924],[-6,-23],[-4,-17],[-1,-3]],[[8820,5914],[-10,6],[-59,32],[-10,5]],[[8741,5957],[-9,6],[-22,12],[-3,1]],[[8707,5976],[8,17],[1,1],[1,0],[22,-12],[10,-5],[6,22],[4,12],[8,19]],[[8707,5976],[-2,1],[-12,6],[-20,2],[-10,3],[-2,0]],[[8679,6040],[19,-10],[13,31],[19,-10],[27,-15],[10,-6]],[[8721,6157],[10,-6],[69,-37]],[[8927,5255],[-1,-2],[-1,-2],[0,-2],[-1,-1],[0,-2],[-10,-24],[-5,-12]],[[8909,5210],[-9,5],[-20,11],[-9,5],[-9,-23],[-5,-11],[-4,-12]],[[8853,5185],[-10,5],[-21,12],[-10,5]],[[8812,5207],[-51,27],[0,1]],[[8761,5235],[1,4],[18,56],[9,29],[1,2]],[[8790,5326],[2,-1],[29,-16],[26,-15],[3,-1],[1,-1],[23,-12],[15,-7],[34,-17],[4,-1]],[[8891,5163],[-29,17],[-9,5]],[[8909,5210],[-9,-23],[-5,-12],[-4,-12]],[[8882,5140],[-28,16],[-10,5]],[[8844,5161],[-10,5],[-21,12],[-10,5]],[[8803,5183],[9,24]],[[8891,5163],[-7,-18],[-2,-5]],[[8826,5114],[-10,5],[-21,12],[-10,6]],[[8785,5137],[9,23],[9,23]],[[8844,5161],[-9,-23],[-9,-24]],[[8864,5093],[-9,-23]],[[8855,5070],[-10,5],[-18,10],[-11,6]],[[8816,5091],[10,23]],[[8882,5140],[-8,-20],[-1,-3],[-9,-24]],[[8816,5091],[-9,5],[-22,12],[-10,5],[-10,6],[-31,17],[-3,1]],[[8731,5137],[7,25]],[[8738,5162],[1,0],[35,-20],[11,-5]],[[8738,5162],[8,24],[7,24],[8,25]],[[8432,5056],[-4,2],[-4,2],[-40,21],[-40,21]],[[8344,5102],[-76,40]],[[8268,5142],[-58,31]],[[8210,5173],[-57,30]],[[8153,5203],[-54,29]],[[8099,5232],[-37,20],[-15,8]],[[8047,5260],[7,12],[4,8]],[[8058,5280],[10,18],[10,18],[10,19]],[[8088,5335],[10,19],[10,18]],[[8108,5372],[10,19]],[[8118,5391],[10,19],[10,19]],[[8138,5429],[22,41],[19,35]],[[8179,5505],[8,15],[10,17],[2,3]],[[8199,5540],[72,-39],[20,-11],[64,-35],[31,-16],[21,-12],[25,-13],[3,-2]],[[8435,5412],[-1,-4],[-2,-14],[-1,-5],[0,-11],[2,-53],[1,-55],[2,-58],[1,-36],[1,-44],[-1,-19],[-2,-36],[-3,-21]],[[8592,4282],[-59,38]],[[8533,4320],[-26,16],[-28,18],[-2,2]],[[8477,4356],[8,19],[8,20],[8,19]],[[8501,4414],[7,20],[8,19],[8,20]],[[8524,4473],[7,19],[3,5],[1,2],[9,23],[1,3]],[[8545,4525],[8,-5],[10,-10],[10,-15],[7,-14],[20,-41]],[[8600,4440],[33,-61],[4,-10],[1,-2],[1,-2],[2,-5],[2,-5],[25,-9]],[[8668,4346],[-7,-30],[-4,-19],[-4,-19],[-4,-18],[-27,2],[-30,20]],[[8499,4267],[-49,37]],[[8450,4304],[9,16]],[[8459,4320],[10,19],[7,14],[1,3]],[[8533,4320],[-10,-19],[-10,-19],[-4,2],[-5,-8],[-5,-9]],[[8470,4214],[-13,10],[-11,9],[-11,8],[12,18],[0,7],[1,2],[5,8],[-14,11]],[[8439,4287],[5,8],[6,9]],[[8499,4267],[-4,-9],[-5,-9]],[[8490,4249],[-5,-8],[-10,-17],[-5,-10]],[[8408,4151],[-23,18],[-8,6],[-3,0]],[[8374,4175],[12,21],[14,24],[19,33]],[[8419,4253],[17,28],[3,6]],[[8470,4214],[-6,-16],[-11,-19],[-22,-38],[-13,10],[-10,0]],[[9675,8212],[-4,2],[-4,1],[-2,1]],[[9665,8216],[-2,1],[-40,14],[-3,1]],[[9620,8232],[6,27],[5,28]],[[9631,8287],[4,22],[11,-3],[6,1],[2,5],[-1,15]],[[9653,8327],[-5,47]],[[9648,8374],[-1,14]],[[9647,8388],[10,-3],[51,-13],[6,-14],[5,-22],[4,-19],[1,-5]],[[9724,8312],[-7,-3],[-34,9],[-4,0],[-1,-2],[1,-7],[-13,-2],[4,-43]],[[9670,8264],[4,-34],[1,-11],[0,-7]],[[9669,8164],[-17,5],[-7,18],[-1,2],[-2,2],[-7,1],[-3,0],[-2,-2],[-7,-9],[-7,-12],[-4,-10],[-3,-11]],[[9609,8148],[-11,2],[-6,-1],[-14,-10],[-5,-6],[-1,-8],[1,-7],[-2,-13]],[[9571,8105],[-21,5],[5,27],[2,5],[6,11]],[[9563,8153],[7,5],[30,23],[7,8],[5,8],[3,8],[4,22],[1,5]],[[9665,8216],[0,-5],[4,-47]],[[9677,8082],[-11,-1],[-13,3],[3,16],[-4,34],[0,3],[-3,1],[-40,10]],[[9669,8164],[2,-23],[6,-59]],[[9677,8082],[2,-27],[0,-22],[1,-22]],[[9680,8011],[-61,15]],[[9619,8026],[5,21],[4,21],[-41,11],[4,21],[-20,5]],[[9690,8008],[-7,2],[-3,1]],[[9675,8212],[13,-4],[17,-5],[18,-4],[39,-10]],[[9762,8189],[0,-5],[-1,-10],[-2,-13],[-7,-26],[-19,-70],[-46,12],[1,-25],[1,-22],[1,-22]],[[9743,8257],[12,-29],[4,-20],[2,-8],[1,-11]],[[9670,8264],[13,2],[2,1],[1,1],[20,-5],[2,-1],[3,-2],[26,-6],[6,3]],[[9724,8312],[3,-13],[5,-12],[1,-5],[3,-6],[7,-19]],[[9775,8184],[-13,5]],[[9647,8388],[-1,10],[-2,22]],[[9644,8420],[5,-1],[16,-4],[18,-5],[10,-2]],[[9693,8408],[3,1],[35,-9],[3,0],[13,-1],[3,-1],[7,-1]],[[9757,8397],[2,-12],[7,-16],[3,-23],[3,-4],[3,-5],[2,-1],[1,0],[0,-1],[0,-2],[0,-1],[-3,-1],[-3,-3],[1,-9],[2,-8],[1,-8],[3,-23],[0,-2],[0,-11],[3,-12],[1,-28],[2,-5],[-1,-19],[2,-11],[-4,-4],[-7,-1],[0,-3]],[[9698,8655],[5,-5],[-1,-3],[2,-16],[2,-4],[5,-10],[0,-8],[3,-21],[5,-22],[2,-9],[3,-12],[3,-6],[1,-7],[2,-6],[3,-4],[3,-2],[7,-1],[0,-3],[-2,-4],[-3,-9],[-2,-2],[-2,-19],[1,-4],[6,-6],[2,-2],[3,-3],[1,-7],[-2,-10],[5,-20],[3,-21],[3,-10],[1,-2]],[[9693,8408],[-9,24],[-3,8],[-6,29],[-1,5],[-4,17],[-2,8]],[[9668,8499],[-3,23],[-2,10],[-6,40],[-5,39],[-4,29],[-4,28]],[[9644,8668],[31,-9],[3,1],[2,1],[1,1],[13,-6],[4,-1]],[[9775,8184],[0,-18],[-2,-30],[-2,-12],[-2,-7],[-1,-10],[-1,-8],[-4,-19],[-3,-8],[-2,-11],[-1,-7],[-6,-21],[-1,-9],[0,-24],[-1,-6]],[[9749,7994],[-24,5],[-9,2],[-26,7]],[[9774,7870],[-3,0],[-13,1],[1,2],[-21,5]],[[9738,7878],[-5,3],[-14,4],[-3,1],[-3,1],[-20,5],[-17,5]],[[9676,7897],[-5,1],[-3,1]],[[9668,7899],[4,25],[2,10],[1,10],[2,10],[1,11],[0,11],[1,13],[-64,16]],[[9615,8005],[4,21]],[[9749,7994],[0,-16],[-1,-2],[0,-8],[1,-9],[1,-2],[1,-3],[1,-21],[1,-4],[2,-4],[6,-6],[0,-4],[4,-9],[2,-8],[3,-10],[4,-8],[0,-10]],[[9679,7765],[-41,11]],[[9638,7776],[9,20],[10,21],[7,20]],[[9664,7837],[5,22],[1,3],[3,17],[2,15],[1,3]],[[9738,7878],[-3,-18],[-2,-16],[-5,-24],[-25,7],[-3,1],[-7,-21],[-7,-21],[-7,-21]],[[9652,7840],[-95,26]],[[9557,7866],[4,21],[8,36],[0,3]],[[9569,7926],[63,-17],[11,-3],[25,-7]],[[9664,7837],[-4,1],[-2,1],[-3,0],[-3,1]],[[9548,7822],[5,22],[4,22]],[[9652,7840],[-7,-20],[-4,-11],[-4,-10],[-89,23]],[[9534,7757],[2,8],[1,6],[2,8]],[[9539,7779],[4,22],[5,21]],[[9638,7776],[-11,-20],[-11,-21]],[[9616,7735],[-6,2],[-3,1],[-73,19]],[[9641,7660],[-58,16]],[[9583,7676],[7,12],[15,26],[11,21]],[[9679,7765],[-6,-21],[-6,-22],[-7,-24],[-4,-8],[-2,-5],[-6,-13],[-7,-12]],[[9521,7693],[3,14],[5,26],[5,24]],[[9583,7676],[-8,3],[-54,14]],[[9522,7584],[-22,6],[4,24],[5,23]],[[9509,7637],[5,23],[4,19],[3,14]],[[9641,7660],[-6,-9],[-13,-20],[-14,-21]],[[9608,7610],[-53,15],[-11,-22],[-12,-22]],[[9532,7581],[-6,1],[-4,2]],[[9522,7584],[-11,-20]],[[9511,7564],[-76,22]],[[9435,7586],[4,21],[5,23],[5,24],[60,-17]],[[9382,7601],[53,-15]],[[9511,7564],[-10,-18],[-10,-19],[-4,-8],[-6,-3],[-6,-2],[-4,0],[-6,0],[-7,1],[-39,10],[-53,16],[6,20],[5,19],[5,21]],[[9492,7435],[-13,-20],[-28,-40],[-12,-20],[-9,-16],[-8,-22],[-17,-49],[-12,-34],[-32,-95],[-11,-40],[-8,-28],[-4,-20],[-4,-15],[-16,-73],[-5,-24],[-1,-6]],[[9312,6933],[-32,9],[-5,2]],[[9275,6944],[-4,1],[-38,11],[-1,0]],[[9232,6956],[-42,12]],[[9190,6968],[-42,12]],[[9148,6980],[-43,10],[-42,12]],[[9063,7002],[-41,13]],[[9022,7015],[-3,1]],[[9019,7016],[0,1],[4,6],[37,117],[45,140],[15,71],[21,101],[5,13],[27,85],[13,42],[12,38],[2,8],[1,11],[6,20],[66,-17],[19,-5],[42,-12],[32,-9],[21,-5],[-5,-20]],[[9532,7581],[-11,-19],[-10,-18],[-34,-61],[-13,-23],[-8,-15],[36,-10]],[[6540,4618],[-62,30]],[[6478,4648],[7,19],[3,9],[4,11],[5,14],[6,17]],[[6503,4718],[61,-30]],[[6564,4688],[-6,-16],[-5,-14],[-3,-11],[-4,-9],[-6,-20]],[[6564,4688],[50,-24],[10,-3],[3,-1]],[[6627,4660],[-1,-3],[-6,-15],[-5,-14],[-3,-11],[-4,-9],[-3,-9],[-3,-10]],[[6602,4589],[-18,9],[-44,20]],[[8362,6151],[-1,-3],[-8,-20],[-27,14],[8,21],[1,3],[-22,12]],[[8313,6178],[8,21],[15,41],[31,82]],[[8367,6322],[4,11]],[[8371,6333],[114,-75]],[[6747,4747],[-10,-21],[-7,-12],[-2,-4],[-3,-8],[-7,-12],[0,-1],[-3,-7],[-5,-11],[-1,-3],[-1,-2],[-6,-17]],[[6702,4649],[0,1],[-1,0],[-2,1],[0,1],[-3,1],[-5,-2],[-7,-4],[-4,-3],[-4,-3],[-3,-1],[-2,0],[-4,1],[-18,9],[-22,10]],[[6503,4718],[-3,1],[-59,28],[-13,6],[-32,15]],[[6396,4768],[36,102],[6,17],[2,5],[1,3],[0,1],[5,14],[8,23]],[[6454,4933],[8,-4],[28,-13],[9,-4]],[[6499,4912],[-8,-23],[-3,-10],[-3,-9],[61,-29]],[[6546,4841],[61,-29]],[[6607,4812],[19,-9],[20,-9],[-4,-9],[-4,-13],[-4,-12],[22,-11]],[[6656,4749],[22,-10],[13,-6],[10,-5],[23,-11],[7,14],[5,9],[5,9],[1,-1],[2,0],[2,-1],[1,0]],[[6607,4812],[4,9],[3,10],[4,10],[3,9],[1,2]],[[6622,4852],[9,-4],[23,-11],[21,-10],[8,-4]],[[6683,4823],[-1,-2],[-3,-9],[-3,-10],[-4,-10],[-3,-9],[-4,-9],[-2,-7],[-2,-6],[-5,-12]],[[6546,4841],[3,9],[4,10],[3,10],[5,12]],[[6561,4882],[61,-30]],[[6561,4882],[5,17],[7,19],[6,18]],[[6579,4936],[62,-29]],[[6641,4907],[-7,-19],[-6,-19],[-1,-2],[-4,-13],[-1,-2]],[[6579,4936],[7,20],[4,11],[4,12]],[[6594,4979],[62,-28]],[[6656,4951],[-4,-13],[-4,-11],[-7,-20]],[[6561,4882],[-9,4],[-45,21],[-8,5]],[[6499,4912],[6,17],[6,19],[7,18],[6,19],[4,11],[5,13]],[[6533,5009],[61,-30]],[[6454,4933],[6,18]],[[6460,4951],[7,20],[4,11],[17,48]],[[6488,5030],[45,-21]],[[6460,4951],[-3,1],[-7,4],[-16,7],[-20,9],[2,6],[5,14],[3,9],[1,3]],[[6425,5004],[8,24],[5,12],[4,12]],[[6442,5052],[46,-22]],[[6396,4768],[-16,8],[-54,26]],[[6326,4802],[3,2],[2,3],[8,22],[1,3]],[[6340,4832],[10,25],[19,24],[3,4]],[[6372,4885],[15,18],[-2,4],[-57,28],[5,14],[4,12]],[[6337,4961],[5,12],[4,12],[4,12],[4,11],[8,23],[2,3]],[[6364,5034],[61,-30]],[[6364,5034],[-60,29],[-2,1]],[[6302,5064],[8,23],[9,25]],[[6319,5112],[11,-6],[50,-25]],[[6380,5081],[62,-29]],[[6337,4961],[-61,30]],[[6276,4991],[4,12],[5,12],[8,22],[7,22],[2,5]],[[6372,4885],[-3,1],[-22,11],[-22,11],[-13,6],[-54,27]],[[6258,4941],[9,23]],[[6267,4964],[5,14],[4,13]],[[6340,4832],[-3,2],[-50,25],[-34,17],[-16,8]],[[6237,4884],[9,25],[10,28],[2,4]],[[6326,4802],[-54,27]],[[6272,4829],[-19,10],[-27,13]],[[6226,4852],[6,17],[4,12],[1,3]],[[6253,4728],[-61,31]],[[6192,4759],[7,21],[8,22]],[[6207,4802],[8,21],[5,13],[6,16]],[[6272,4829],[-6,-16],[-5,-13]],[[6261,4800],[-8,-22],[5,-3],[10,-5],[-8,-21],[-7,-21]],[[6291,4708],[-7,3],[-1,1],[-30,16]],[[6261,4800],[54,-28],[-5,-13],[-4,-11],[-6,-16],[-1,-3],[-4,-11],[-4,-10]],[[6268,4661],[-14,7],[-20,10],[-61,30]],[[6173,4708],[2,7]],[[6175,4715],[8,22],[9,22]],[[6291,4708],[-1,-5],[-2,-7],[-8,-19],[-2,-3],[-10,-13]],[[6254,4623],[-1,0],[-95,46]],[[6158,4669],[3,8],[5,11],[2,8],[5,12]],[[6268,4661],[-7,-19],[-7,-19]],[[6225,4516],[3,22],[3,15],[3,12],[1,1],[3,10]],[[6238,4576],[5,14],[2,9],[8,20],[1,4]],[[6396,4768],[-3,-9],[-27,-75],[-16,-46],[-32,-93],[-2,-6],[-13,-38],[-2,-6]],[[6301,4495],[-2,0],[-18,5],[-28,8],[-8,2],[-20,6]],[[6238,4576],[-1,1],[-2,0],[-3,-10],[-8,4],[-5,3],[-43,21],[-16,7],[-5,-12],[-21,-25],[-14,4]],[[6120,4569],[12,32]],[[6132,4601],[5,11],[3,8],[6,19],[4,8],[4,11]],[[6154,4658],[4,11]],[[6225,4516],[-3,0],[-101,27],[-8,2]],[[6113,4545],[7,24]],[[6225,4516],[-3,-24],[-5,-38],[-4,-26]],[[6213,4428],[-4,1],[-17,0],[-13,-2],[-15,-5],[-14,-4]],[[6150,4418],[-2,13],[1,18]],[[6149,4449],[4,30]],[[6153,4479],[20,-5],[7,38],[-17,6],[-18,4],[-18,5],[-19,5]],[[6108,4532],[5,13]],[[6153,4479],[-20,9],[-17,8],[-17,9]],[[6099,4505],[-27,13],[-10,5],[-3,2],[0,2],[7,17],[42,-12]],[[6149,4449],[-55,27],[-5,2]],[[6089,4478],[10,27]],[[6150,4418],[-36,25],[-5,7],[-10,4],[-4,1],[-32,-5],[-26,-1],[-16,-7],[-5,10],[-12,24]],[[6004,4476],[14,-7],[2,0],[4,1],[3,1],[14,28],[1,1],[2,0],[31,-15],[14,-7]],[[6150,4418],[-50,-17],[1,-5]],[[6101,4396],[-18,-6],[-21,-7]],[[6062,4383],[-33,-10]],[[6029,4373],[-4,3],[-8,-3],[-1,2],[-5,16],[-7,13],[-24,17]],[[5980,4421],[13,26],[11,29]],[[7637,1518],[-21,95]],[[7616,1613],[22,7],[19,6]],[[7657,1626],[2,-11],[17,-74],[3,-11]],[[7679,1530],[-19,-6],[-11,-3],[-12,-3]],[[8505,6314],[9,-15],[1,-5],[-9,-21],[2,-4],[14,-8],[15,36],[1,2],[8,-12],[4,-5],[3,-2],[2,-1],[2,-3],[3,-1]],[[8560,6275],[-15,-22]],[[8371,6333],[10,28],[4,11],[10,24],[1,3]],[[8396,6399],[19,-10]],[[8415,6389],[49,-28]],[[8464,6361],[-1,-2],[-20,-51],[1,-3],[14,-8],[30,-18],[3,2],[6,16],[8,17]],[[8464,6361],[15,-8],[19,-10]],[[8498,6343],[-3,-3],[-6,-17],[16,-9]],[[8543,6376],[-4,-4],[-5,-6],[-4,-4],[-4,-3],[-3,-3],[-7,-4],[-14,-7],[-4,-2]],[[8415,6389],[17,34],[7,14],[2,3]],[[8441,6440],[52,-28],[5,-5],[4,4],[7,11]],[[8509,6422],[11,-8],[18,-10],[-8,-13],[0,-5],[13,-10]],[[8567,6293],[-7,-18]],[[8498,6343],[19,-11],[1,-1],[1,-1],[1,-2],[15,10],[23,-37],[3,-4],[3,-2],[3,-2]],[[8609,6408],[-14,-6],[-21,9],[-12,-31],[22,-13],[-4,-11],[7,-4]],[[8587,6352],[-13,-42],[-2,-4],[-5,-13]],[[8543,6376],[3,4],[7,12],[10,17],[13,22],[-45,31]],[[8531,6462],[2,2],[2,4],[2,4]],[[8537,6472],[0,-1],[4,-3],[3,-2],[6,-4],[4,-2],[5,-4],[4,-3],[41,-29],[9,-7],[1,0]],[[8614,6417],[-2,-4],[-2,-1],[-1,-4]],[[8609,6408],[14,-10],[-10,-26],[-2,-6],[1,-6],[3,-14],[1,-7],[-28,13],[-1,0]],[[8784,6337],[-1,-4],[-2,-6],[-5,-13],[-15,-43],[-6,-15],[-11,-33],[-12,-33],[-2,-5]],[[8614,6417],[7,-5],[7,-5],[3,-2],[9,-6],[6,-5],[10,-7],[10,-6],[7,-5],[8,-4],[7,-3],[7,-3],[7,-3],[13,-5],[7,-2],[3,-1],[2,0],[29,-9],[25,-8],[1,-1],[1,0],[1,0]],[[8786,6342],[-2,-5]],[[8614,6417],[1,7]],[[8615,6424],[2,-1],[24,-17],[8,-6],[7,-4],[9,-5],[18,44],[7,26],[2,10],[12,31]],[[8704,6502],[17,-9],[51,-26],[7,-3],[5,-2],[24,-13],[11,-5],[3,-1]],[[8822,6443],[-14,-39],[-6,-16],[-7,-21],[-1,-4],[-5,-12],[-3,-9]],[[8911,6419],[-6,-18]],[[8905,6401],[-17,8],[-19,-55],[16,-9],[-7,-20],[45,-23],[12,-7],[-10,3],[-8,4],[-16,7],[-19,5],[-44,13],[-8,3],[-37,10],[-7,2]],[[8822,6443],[7,18],[1,4],[21,57]],[[8851,6522],[9,-4],[10,-5],[-16,-43],[-2,-3],[-5,-15],[64,-33]],[[8918,6437],[-7,-18]],[[8851,6522],[8,22]],[[8859,6544],[9,-5],[32,-15],[41,-21]],[[8941,6503],[-8,-22],[-15,-44]],[[8802,6657],[-9,-25],[-8,-23],[36,-18],[5,-3],[8,24],[28,-14],[11,-5],[3,-2]],[[8876,6591],[-9,-23],[-8,-24]],[[8704,6502],[44,121],[4,12],[3,5],[5,11],[0,2]],[[8760,6653],[16,-11],[2,3],[4,-3],[7,17],[-1,4]],[[8788,6663],[5,-2],[9,-4]],[[8885,6616],[-9,-25]],[[8802,6657],[9,-5],[23,-11],[10,-5],[9,-4],[22,-11],[7,-3],[3,-2]],[[8911,6689],[-8,-23],[-9,-26],[-9,-24]],[[8802,6657],[8,24],[10,25]],[[8820,6706],[9,-4],[23,-11],[10,-5],[8,23],[9,-4],[19,-10],[3,-1],[7,-4],[3,-1]],[[8820,6706],[8,23],[8,22]],[[8836,6751],[8,21]],[[8844,6772],[9,-4],[23,-11],[9,-5],[9,-4],[23,-11],[7,-4],[3,-1]],[[8927,6732],[-8,-22],[-8,-21]],[[8934,6753],[-7,-21]],[[8844,6772],[8,22],[22,-11],[8,23],[8,22],[11,-5],[8,-4]],[[8909,6819],[8,-4],[11,-5],[11,-6],[9,-4],[2,-1]],[[8950,6799],[-8,-24],[-8,-22]],[[8921,6854],[-7,-19],[-5,-16]],[[8836,6751],[-30,14],[-10,5],[-23,12],[-16,13]],[[8757,6795],[-40,29],[-26,19]],[[8691,6843],[2,15],[4,17]],[[8697,6875],[5,20],[22,-8]],[[8724,6887],[37,-15]],[[8761,6872],[63,-24],[3,7],[1,2],[5,14]],[[8833,6871],[40,-18],[6,18],[32,-14],[10,-3]],[[8833,6871],[6,17]],[[8839,6888],[6,17],[6,20],[31,-10],[10,-3],[10,-3],[32,-12]],[[8934,6897],[-6,-24],[-7,-19]],[[8761,6872],[8,24],[5,19]],[[8774,6915],[10,-4],[45,-19],[10,-4]],[[8724,6887],[7,25],[7,24],[-60,23]],[[8678,6959],[7,24],[21,-9],[14,-6],[25,-8],[37,-13],[-1,-7],[-1,-8],[-4,-12],[-2,-5]],[[8697,6875],[-20,8]],[[8677,6883],[6,20],[-19,7],[7,25],[7,24]],[[8677,6883],[-19,9],[-11,4],[-34,22],[6,9],[8,24],[-6,9],[3,8],[-10,4],[-6,-1]],[[8608,6971],[3,15],[5,-3],[62,-24]],[[8691,6843],[4,-15],[10,-7],[-5,-8]],[[8700,6813],[-15,10],[-37,27]],[[8648,6850],[1,3],[4,13],[0,6],[-68,48]],[[8585,6920],[-71,51]],[[8514,6971],[10,20]],[[8524,6991],[8,15],[7,14]],[[8539,7020],[52,-37]],[[8591,6983],[0,-5],[13,-8],[4,1]],[[8631,6817],[-3,2],[-1,-3],[-35,26],[-36,25]],[[8556,6867],[2,3],[9,18],[8,14],[10,18]],[[8648,6850],[-1,-2],[-7,-13],[-9,-18]],[[8631,6817],[-2,-3],[-8,-17],[-7,-16],[-1,-3]],[[8613,6778],[-3,2],[-17,8],[-24,13],[-18,9],[-17,8],[-19,10],[-18,8],[-2,1],[-15,8]],[[8480,6845],[10,24],[10,22],[6,12]],[[8506,6903],[24,-17],[26,-19]],[[6775,2827],[-12,9],[-13,9],[-9,7]],[[6741,2852],[2,4],[8,18],[10,17]],[[6761,2891],[35,-26]],[[6796,2865],[-10,-17],[-9,-17],[-1,-2],[-1,-2]],[[6724,2819],[-21,15],[6,11],[3,5],[5,10],[20,-15],[2,4],[2,3]],[[7230,1149],[-6,-29],[-4,-21]],[[7220,1099],[-59,16],[-4,-23]],[[7157,1092],[-16,4]],[[7141,1096],[-2,1]],[[7139,1097],[4,21]],[[7143,1118],[9,20],[13,33]],[[7165,1171],[10,-7],[18,-6],[18,-5],[19,-4]],[[7210,1077],[-33,10]],[[7177,1087],[-18,4],[-2,1]],[[7220,1099],[-4,-12],[-6,-10]],[[7177,1087],[-7,-34],[25,-1],[-12,-21]],[[7183,1031],[-35,0],[-20,0]],[[7128,1031],[13,65]],[[7188,963],[-1,0],[-2,1],[-23,-1],[-8,0]],[[7154,963],[-10,1]],[[7144,964],[-49,1]],[[7095,965],[0,24],[11,0],[1,21]],[[7107,1010],[63,0],[13,21]],[[7210,1077],[37,-9],[-1,-5],[-58,-100]],[[7107,1010],[3,21]],[[7110,1031],[18,0]],[[7110,1031],[5,28],[4,20],[-51,11],[7,24]],[[7075,1114],[10,-3]],[[7085,1111],[39,-10],[15,-4]],[[7095,965],[-51,0]],[[7044,965],[-5,0],[-7,1],[-7,1]],[[7025,967],[6,23],[20,-1],[16,57],[-19,2],[-2,-8],[-11,3]],[[7035,1043],[2,7],[21,70]],[[7058,1120],[10,-4],[7,-2]],[[7025,967],[-17,6],[-24,10]],[[6984,983],[-17,7]],[[6967,990],[15,53],[3,5],[5,4],[8,3],[7,0],[13,-5],[17,-7]],[[6967,990],[-32,12],[-7,2],[-3,0]],[[6925,1004],[7,7],[6,7],[3,4],[7,12]],[[6948,1034],[67,103]],[[7015,1137],[2,-1],[24,-10],[9,-3],[8,-3]],[[6948,1034],[-2,2],[-24,20]],[[6922,1056],[-14,11]],[[6908,1067],[10,17],[11,18]],[[6929,1102],[11,16],[11,17]],[[6951,1135],[11,17],[14,-11],[12,17]],[[6988,1158],[24,-19],[3,-2]],[[6951,1135],[-44,33]],[[6907,1168],[9,17]],[[6916,1185],[19,-13],[10,17]],[[6945,1189],[43,-31]],[[6929,1102],[-41,30]],[[6888,1132],[9,18]],[[6897,1150],[10,18]],[[6908,1067],[-39,29]],[[6869,1096],[9,19],[10,17]],[[6869,1096],[-32,23]],[[6837,1119],[6,21],[5,20],[7,22]],[[6855,1182],[42,-32]],[[6922,1056],[-10,-16]],[[6912,1040],[-81,59]],[[6831,1099],[6,20]],[[6912,1040],[-14,-22],[-20,15],[-7,-12],[-52,39],[4,13],[8,26]],[[6925,1004],[-9,-8],[-10,-7],[-33,-20],[-23,-14],[-21,-12]],[[6829,943],[-2,2],[-8,13],[-12,16],[-8,12],[-4,3],[-10,17]],[[6785,1006],[-9,13],[-4,7]],[[6772,1026],[-4,4],[-7,12],[-5,8],[-8,12],[-3,5],[-5,7],[-38,57]],[[6702,1131],[-1,4],[-9,15],[-9,13],[-9,14],[-4,6],[-11,17],[-4,6],[-1,1],[-7,10],[-4,5],[-18,24],[-5,8],[-10,19],[-3,8],[-1,1]],[[6606,1282],[4,3],[6,2],[48,32],[23,17],[40,25],[54,36],[48,30]],[[6829,1427],[3,-5],[4,-3],[11,-9],[53,-41],[43,-31],[-12,-17]],[[6931,1321],[-11,-15],[-12,-16]],[[6908,1290],[-12,-15],[-12,-16],[-12,-15]],[[6872,1244],[-12,-16],[-13,-16],[13,-10],[-5,-20]],[[6872,1244],[38,-28],[-10,-19],[16,-12]],[[6908,1290],[51,-37]],[[6959,1253],[-10,-16],[-11,-17],[16,-12]],[[6954,1208],[-9,-19]],[[6931,1321],[48,-36]],[[6979,1285],[-10,-15],[-10,-17]],[[7009,1262],[-40,-64]],[[6969,1198],[-15,10]],[[6979,1285],[17,-12],[13,-11]],[[7009,1262],[16,-11]],[[7025,1251],[-41,-65],[-15,12]],[[7079,1236],[-29,-45],[-35,-54]],[[7025,1251],[16,-13],[10,19],[25,-19],[3,-2]],[[7111,1185],[-24,19],[-11,-18],[27,-20],[-15,-34],[-3,-21]],[[7079,1236],[9,-6],[32,-26],[-9,-19]],[[8252,1733],[-17,-43],[-3,-12],[-6,-11],[-4,-12],[-9,-19],[-4,-10]],[[8209,1626],[-34,1]],[[8175,1627],[-11,0],[-4,1]],[[8160,1628],[0,9],[1,11],[1,17]],[[8162,1665],[1,19],[2,25]],[[8165,1709],[1,29],[0,3]],[[8166,1741],[35,-2],[4,-3],[47,-3]],[[8166,1741],[2,25]],[[8168,1766],[56,-5],[12,22],[5,10],[3,11]],[[8244,1804],[5,18]],[[8249,1822],[4,20]],[[8253,1842],[1,19]],[[8254,1861],[2,27]],[[8256,1888],[54,-14],[1,1]],[[8311,1875],[-12,-28],[-7,-14],[-10,-26],[-5,-11],[-12,-29],[-3,-10],[-7,-13],[-3,-11]],[[8168,1766],[1,23]],[[8169,1789],[2,20]],[[8171,1809],[73,-5]],[[8171,1809],[0,19]],[[8171,1828],[78,-6]],[[8171,1828],[2,19]],[[8173,1847],[80,-5]],[[8173,1847],[0,20]],[[8173,1867],[81,-6]],[[8173,1867],[2,27]],[[8175,1894],[12,-1],[69,-5]],[[8175,1894],[1,29]],[[8176,1923],[12,-1],[70,-5]],[[8258,1917],[-2,-29]],[[8176,1923],[2,29]],[[8178,1952],[83,-7],[-3,-28]],[[8178,1952],[2,30]],[[8180,1982],[82,-6],[-10,30]],[[8252,2006],[7,0]],[[8259,2006],[1,-1],[7,-1],[1,-2],[2,-4],[51,1]],[[8321,1999],[0,-18],[-2,-39],[0,-31],[-4,-15],[-4,-21]],[[8380,2225],[-1,0],[-10,-3],[-12,-8],[-9,-5],[-4,-1],[-5,-8],[-7,-12],[-1,-39],[-2,-26],[-2,-26],[0,-16],[-4,-38],[-2,-15],[0,-29]],[[8259,2006],[1,2],[11,3],[1,4],[-1,7],[-1,4],[-1,6],[-4,29],[0,6],[0,9],[1,5],[1,6],[2,7],[3,12],[1,4],[1,5],[1,9],[-2,1],[-15,3],[-5,-9],[-4,0]],[[8249,2119],[1,11],[-3,6],[-3,5],[-3,5],[-34,15],[-3,1],[-3,0],[-4,-1],[-4,10],[-2,3]],[[8191,2174],[8,15],[2,1],[2,5]],[[8203,2195],[2,5],[6,14],[32,72],[6,12],[6,15],[5,8]],[[8260,2321],[1,-4],[37,-21],[10,-6],[3,-1],[68,-63],[1,-1]],[[7497,2612],[-92,70]],[[7405,2682],[1,2],[24,13],[27,12]],[[7457,2709],[72,-53]],[[7529,2656],[-15,-21],[-8,-11],[-9,-12]],[[7468,2570],[-91,68]],[[7377,2638],[12,22],[12,18],[4,4]],[[7497,2612],[-15,-22],[-14,-20]],[[7453,2548],[-17,-24]],[[7436,2524],[-28,22],[-27,20],[-17,12],[-13,11]],[[7351,2589],[14,25],[6,12],[6,12]],[[7468,2570],[-15,-22]],[[7403,2476],[-29,22],[-26,19],[-1,1],[-13,10],[-20,14]],[[7314,2542],[13,15],[12,16],[12,16]],[[7436,2524],[-21,-32],[-12,-16]],[[7395,2464],[-13,-20]],[[7382,2444],[-91,69]],[[7403,2476],[-8,-12]],[[7346,2393],[-89,66]],[[7267,2476],[90,-67]],[[7357,2409],[-11,-16]],[[7346,2393],[-9,-12],[-9,-8]],[[7328,2373],[-14,11],[-59,43],[-10,8]],[[7310,2357],[-3,3],[-16,12],[-14,10],[-16,12],[-10,8],[-9,6],[-8,7]],[[7328,2373],[-6,-6],[-2,-2],[-2,-2],[-2,-1],[-2,-1],[-4,-3],[0,-1]],[[7310,2357],[-3,-2],[-1,0],[0,-1],[-6,-5],[-17,-15]],[[7283,2334],[-11,7],[-47,35],[-9,7]],[[7216,2383],[-10,7],[-22,17],[-10,7]],[[7174,2414],[-33,25]],[[7179,2245],[-3,1],[-11,9],[-14,9]],[[7151,2264],[6,10],[6,11],[10,19],[11,20],[5,9],[5,10],[11,20],[11,20]],[[7283,2334],[-18,-15],[-18,-15]],[[7247,2304],[-8,-8],[-9,-7],[-17,-14]],[[7213,2275],[-17,-15],[-17,-15]],[[6740,2142],[-10,-22]],[[6730,2120],[-11,-5],[-56,36],[-17,-7]],[[6646,2144],[11,23]],[[6657,2167],[10,22]],[[6667,2189],[73,-47]],[[6667,2189],[9,19],[9,19],[9,19]],[[6694,2246],[74,-47]],[[6768,2199],[-10,-19]],[[6758,2180],[-9,-19],[-9,-19]],[[6792,2242],[-10,-12],[-5,-11],[-9,-20]],[[6694,2246],[10,20],[9,19]],[[7502,7769],[-14,21],[-21,35],[3,2],[14,13],[-22,33],[7,8],[9,10],[15,14],[11,12],[15,21],[9,12],[9,14]],[[7537,7964],[13,-10],[4,-5],[3,-4],[2,-5],[1,-6],[0,-10],[-2,-9],[11,-8],[5,-9],[-11,-21],[-1,-5],[1,-3],[6,-9]],[[7569,7860],[-3,-2],[-17,-15],[-22,-19],[-10,-8],[9,-14],[6,-8]],[[7532,7794],[-14,-12],[-16,-13]],[[7452,7720],[-2,3],[-50,77]],[[7400,7800],[-10,11]],[[7390,7811],[6,6],[24,27],[6,5],[21,27],[14,15],[10,8],[10,10],[5,6],[19,25],[11,18],[8,14],[4,5],[4,6],[3,6],[4,14],[1,2]],[[7540,8005],[-3,-41]],[[7502,7769],[3,-4],[-17,-14]],[[7488,7751],[-16,-14],[-18,-15],[-2,-2]],[[7427,7998],[5,-4],[4,0],[1,1],[3,4],[11,15],[11,12],[12,9],[10,3],[12,0],[7,5],[9,3],[-1,-8],[-10,-14],[-17,-18],[-10,-14],[-13,-9],[-9,-9],[-9,-12],[-23,-6],[-8,-9],[-8,-4],[-10,0],[-10,-2],[-9,-12],[0,-9],[7,-5],[14,3],[11,9],[11,7],[10,5],[4,0],[-1,-4],[3,1],[-2,-4],[-5,-7],[-5,-5],[-15,-13],[-22,-12],[-3,-5],[-5,-3],[-14,-1],[-15,3],[-12,7],[-2,4],[-3,5],[0,8],[3,7],[13,17],[12,8],[12,14],[5,10],[5,17],[7,2],[9,8],[5,13],[22,27],[25,22],[4,9],[7,10],[10,8],[5,6],[3,0],[2,-8],[-4,-6],[-16,-17],[-12,-16],[-18,-32],[-3,-14]],[[7413,7680],[-3,2],[-3,2],[-18,12],[-5,6],[-17,26]],[[7367,7728],[-11,19],[12,12],[6,7],[4,5],[11,14],[11,15]],[[7452,7720],[-2,-2],[-11,-10],[-11,-11],[-15,-17]],[[7382,7644],[-3,4],[-29,-34]],[[7350,7614],[-14,22]],[[7336,7636],[7,9],[7,8],[15,17],[-23,35],[3,3],[5,5]],[[7350,7713],[17,15]],[[7413,7680],[-3,-3],[-28,-33]],[[8063,8419],[-14,-13],[-26,41],[-2,4],[-2,6],[-9,15],[-18,-17]],[[7992,8455],[-50,-44],[-12,-9]],[[7930,8402],[-13,-10],[-22,-18],[-4,-5],[-14,-23],[-15,-24]],[[7862,8322],[-14,13]],[[7848,8335],[4,5],[8,10],[6,10],[12,10],[3,8],[2,3],[15,14],[16,5],[13,15],[12,5],[25,18],[9,10],[8,7],[3,7],[3,1],[6,1],[3,6],[7,10],[8,5],[8,11],[17,14],[5,8],[7,13],[2,7],[5,24],[5,7],[8,5],[18,2],[5,1],[3,1]],[[8094,8578],[1,-3],[4,-4],[4,-6],[14,-24],[-9,-6],[17,-26],[15,-25]],[[8140,8484],[-13,-11],[-22,-18],[-15,-13],[-14,-12],[-13,-11]],[[8030,8317],[-13,-18]],[[8017,8299],[-2,3],[-32,48],[-12,-13],[-1,2],[-16,24],[-2,10],[-10,14],[-7,7],[-5,8]],[[7992,8455],[40,-63],[-16,-14],[-17,-14],[29,-44],[2,-3]],[[8063,8419],[26,-40],[2,-3]],[[8091,8376],[-15,-13],[-16,-13],[-9,-8],[-8,-8],[-4,-5],[-5,-6],[-4,-6]],[[8076,8241],[-14,-14]],[[8062,8227],[-45,72]],[[8091,8376],[26,-41]],[[8117,8335],[-15,-13],[-17,-13],[-16,-15],[-17,-14],[24,-39]],[[8117,8335],[50,-79]],[[8167,8256],[-15,-13],[-17,-13],[-7,-7]],[[8128,8223],[-22,-20],[-3,0],[-2,1],[-10,15],[-14,21],[-1,1]],[[8180,8268],[-13,-12]],[[8117,8335],[13,11],[13,11],[16,14],[21,18],[12,11]],[[8192,8400],[49,-78]],[[8241,8322],[-12,-11],[-21,-18],[-15,-14],[-13,-11]],[[8140,8484],[24,-40],[3,-4],[25,-40]],[[8140,8484],[14,13],[15,12],[18,16],[13,11],[12,10],[24,-41],[2,-3]],[[8238,8502],[24,-41],[-8,-8]],[[8254,8453],[-14,-12],[-17,-15],[-16,-13],[-15,-13]],[[8254,8453],[47,-79]],[[8301,8374],[-12,-10],[-18,-16],[-15,-14],[-15,-12]],[[6673,3425],[-3,-2],[-12,6],[-23,11],[-19,9],[-21,10]],[[6595,3459],[13,37],[3,9]],[[6611,3505],[7,19],[13,37],[19,54]],[[6650,3615],[12,1],[3,0],[13,1],[45,-21],[-2,-5],[-2,-6],[-8,-14],[-6,-12],[13,-6]],[[6718,3553],[-20,-11],[-2,-17],[-2,-9],[-5,-15],[-3,-10],[-3,-4],[-3,-2],[-6,-1],[19,-10],[-18,-32],[1,-14],[0,-2]],[[6676,3426],[-3,-1]],[[6489,3426],[17,50],[0,6],[0,3],[7,6],[18,53]],[[6531,3544],[18,-9],[19,-10],[20,-9],[23,-11]],[[6595,3459],[-25,-70],[-2,0],[-20,11],[-20,9],[-19,8],[-20,9]],[[6673,3425],[2,-3],[3,-2],[-4,-6],[-4,-10],[-5,-9],[-13,-24],[-21,-38]],[[6631,3333],[-3,2],[-1,0],[-22,11],[-32,15],[-91,42]],[[6482,3403],[7,23]],[[6482,3403],[-22,10],[-20,9],[-25,11],[-25,12]],[[6390,3445],[35,98]],[[6425,3543],[24,-12],[5,-2],[4,-2],[4,-2],[4,-5],[5,-8],[19,52],[19,-10],[22,-10]],[[6631,3333],[-15,-27],[-6,-10]],[[6610,3296],[-89,76],[-34,17],[-5,-3]],[[6482,3386],[-88,-16],[-67,32],[-4,-14]],[[6323,3388],[-9,4],[6,22],[12,33],[16,-7],[1,11],[2,12]],[[6351,3463],[18,-9],[21,-9]],[[6351,3463],[-28,13],[-15,7]],[[6308,3483],[8,23],[8,24],[0,4],[0,5],[-1,3],[-2,2],[-3,6],[0,3],[0,2],[15,36],[4,9],[5,12],[4,0],[6,2],[3,1],[5,-3],[1,-4],[2,-3],[11,-24],[1,-3],[6,-13],[20,-10]],[[6401,3555],[24,-12]],[[6551,3599],[-20,-55]],[[6401,3555],[12,32],[-6,11],[-2,3],[-7,18],[0,2],[0,2],[1,2],[1,3],[-2,1],[-2,0],[-3,1],[-2,2],[-7,16]],[[6384,3648],[24,16],[20,12],[7,4],[4,4],[8,7]],[[6447,3691],[0,-5],[2,-6],[1,-3],[3,-4],[2,-3],[4,-3],[13,-7],[6,-12],[1,-3],[7,-14],[23,-12],[21,-10],[21,-10]],[[6308,3483],[-3,1],[-25,12],[-8,5],[-2,1],[-2,2]],[[6268,3504],[2,6],[4,12],[2,3],[1,4],[4,11],[2,4],[6,16],[1,2],[1,3],[7,17],[6,16],[8,22],[7,18],[24,62],[5,13],[1,3],[1,5],[1,2],[1,3],[2,4],[8,22],[13,31],[2,4],[6,15],[0,1],[14,33],[2,7],[13,31],[4,10],[5,12]],[[6421,3896],[1,-1]],[[6422,3895],[3,-1],[-9,-22],[-13,-31]],[[6403,3841],[-12,-27],[-12,-33]],[[6379,3781],[-13,-31],[-12,-33],[18,-9],[-25,-61],[-2,-7],[0,-8],[5,-1],[2,-3],[32,20]],[[5790,4258],[-10,12],[7,5],[18,10],[-11,19],[-12,19]],[[5782,4323],[19,15],[18,21],[-15,13],[12,16]],[[5816,4388],[62,-54],[-10,-18],[-8,-13],[-9,0],[-36,-35],[-1,-6],[-24,-4]],[[7151,2264],[-41,31]],[[7110,2295],[5,11],[6,10],[11,19]],[[7132,2335],[10,20],[11,19]],[[7153,2374],[11,20],[10,20]],[[7179,2245],[-16,-13]],[[7163,2232],[-4,-4],[-13,-10],[-11,-9],[-5,-5]],[[7130,2204],[-18,-14]],[[7112,2190],[-14,11],[-20,15],[-8,6]],[[7070,2222],[6,10],[8,15],[7,13],[7,13],[6,12],[6,10]],[[7230,2182],[-54,40],[-5,4],[-6,4],[-2,2]],[[7179,2245],[3,-1],[5,-4],[59,-44]],[[7246,2196],[-8,-7],[-8,-7]],[[7197,2154],[-4,4],[-51,37],[-5,3],[-7,6]],[[7230,2182],[-9,-7],[-8,-7],[-16,-14]],[[7180,2140],[-59,44],[-9,6]],[[7197,2154],[-7,-7],[-10,-7]],[[7160,2125],[-50,37],[-7,6],[-8,6]],[[7095,2174],[17,16]],[[7180,2140],[-7,-4],[-4,-3],[-9,-8]],[[7120,2091],[-65,48]],[[7055,2139],[22,19],[18,16]],[[7160,2125],[-10,-8],[-8,-7],[-22,-19]],[[7055,2139],[-21,16]],[[7034,2155],[13,25],[11,21]],[[7058,2201],[12,21]],[[7005,2096],[-46,33]],[[6959,2129],[11,21],[11,21],[12,21]],[[6993,2192],[5,-7],[3,-6],[33,-24]],[[7055,2139],[-15,-13],[-12,-11]],[[7028,2115],[-7,-6],[-7,-5],[-4,-3],[-5,-5]],[[7120,2091],[-27,-24]],[[7093,2067],[-65,48]],[[7093,2067],[-21,-21],[-67,50]],[[7016,1990],[-5,4]],[[7011,1994],[2,2],[42,36],[-23,16],[-9,-8],[-7,-6],[-18,14],[16,14],[-10,8],[-16,11]],[[6988,2081],[17,15]],[[7246,2196],[5,-3]],[[7251,2193],[-17,-14],[-33,-28],[-17,-15],[-15,-13],[-3,-2],[-17,-15],[-21,-18],[-2,-1]],[[7126,2087],[-27,-24],[-23,-20],[-17,-15],[-41,-36],[-2,-2]],[[6950,1933],[-6,3]],[[6944,1936],[16,15]],[[6960,1951],[18,14],[-68,44],[-4,0]],[[6906,2009],[37,33]],[[6943,2042],[7,-3],[10,-8],[14,-10],[4,-3],[2,-1],[11,-8],[20,-15]],[[7016,1990],[-3,-2],[-25,-22],[-38,-33]],[[6960,1951],[-69,45]],[[6891,1996],[15,13]],[[6944,1936],[-38,-33]],[[6906,1903],[-70,45]],[[6836,1948],[8,7]],[[6844,1955],[21,18],[9,8],[11,10]],[[6885,1991],[6,5]],[[8658,1867],[-4,5],[-21,28]],[[8633,1900],[10,11],[7,9]],[[8650,1920],[11,-9],[8,-4],[7,16],[6,15],[8,-3],[7,-4],[6,-6],[4,-2],[5,-2],[-4,-23],[-1,-8],[-6,-15],[-30,7],[-11,-12],[-2,-3]],[[8688,1948],[-25,10]],[[8663,1958],[12,57]],[[8675,2015],[10,-5],[8,-7],[-8,-44],[6,-2],[-3,-9]],[[8675,2015],[-31,9],[-1,3],[-3,1],[-3,-2],[-7,5],[-15,7]],[[8615,2038],[5,12],[4,11],[3,9],[2,7],[1,10],[-1,14],[1,4],[-1,0],[0,-1],[-1,0],[-1,0],[-1,0],[-1,0],[-1,1],[-1,1],[-1,2],[0,1],[0,2],[1,2],[0,1],[1,1],[-2,4],[-11,23],[-10,20],[-5,11],[-1,0],[-1,1],[-2,1],[-1,2],[-1,3]],[[8590,2180],[1,2],[0,1],[1,2],[2,1],[-2,12],[-1,3],[1,3],[0,3],[2,7],[3,10],[3,10],[3,7],[2,5],[4,7],[7,13],[2,3],[2,5],[1,0],[3,-1],[2,5],[17,33],[11,21],[4,9],[2,0],[12,27],[6,14],[3,8],[2,4]],[[8683,2394],[4,0],[7,2],[30,17],[8,1],[18,2],[3,3],[1,-4],[3,-8],[10,-7],[2,-2],[2,-8],[5,-12],[5,-8],[5,-12],[5,-12],[1,-6],[7,-8],[9,-12],[4,-12],[6,-11],[5,-14],[3,-11],[5,-7],[4,-3],[1,-5],[0,-6],[3,-6],[4,-2]],[[8843,2243],[-17,2],[0,-4],[1,-4],[-1,-8],[-1,-5],[-1,-5],[-3,-9],[-2,-6],[-4,-8],[-3,-4],[-5,-7],[-6,-5],[-5,-5]],[[8796,2175],[-10,-7],[-9,-4],[-12,-5],[-9,-4],[5,-14],[1,-8],[-1,-6],[0,-3],[-1,-3]],[[8760,2121],[-1,-4],[0,-2],[-2,-3],[-1,-4],[-8,-10],[-6,-6],[-10,15],[-6,18],[-24,-10],[3,-10],[15,-18],[6,-9],[-7,-6],[-5,-4],[-6,-6],[-14,-11],[-8,-11],[-7,-12],[-4,-13]],[[8796,2175],[4,-5],[11,-14],[15,-15],[0,-3],[-2,-4],[-8,-10],[-5,-4],[-2,-2],[-2,-2],[-2,-4],[-10,-15],[-3,-1],[-3,2],[-13,9],[-11,10],[-2,0],[-3,4]],[[6818,2142],[-60,38]],[[6865,2225],[-23,-40],[-14,-25],[-10,-18]],[[6878,2090],[-15,-27]],[[6863,2063],[-16,10],[16,29],[-14,15],[-14,14],[-17,11]],[[6865,2225],[62,-44],[-11,-21]],[[6916,2160],[-11,-20],[-27,-50]],[[6959,2129],[-43,31]],[[6888,2268],[62,-45]],[[6950,2223],[43,-31]],[[6988,2081],[-45,-39]],[[6943,2042],[-17,13],[-48,35]],[[6950,2223],[11,21],[11,20]],[[6972,2264],[86,-63]],[[6909,2311],[10,-7],[43,-32],[10,-8]],[[6999,2314],[-1,-3],[-12,-22],[-2,-3],[-12,-22]],[[7024,2359],[86,-64]],[[7046,2399],[86,-64]],[[7068,2438],[85,-64]],[[6694,2246],[-72,47]],[[6622,2293],[6,15],[3,5],[9,20]],[[6640,2333],[73,-48]],[[6640,2333],[-33,22]],[[6607,2355],[20,15],[3,4],[8,6]],[[6638,2380],[9,6],[4,4],[10,8],[3,3],[15,16],[3,2]],[[6603,2255],[-48,31],[-1,1]],[[6554,2287],[4,5]],[[6558,2292],[9,12],[13,17]],[[6580,2321],[19,24]],[[6599,2345],[8,10]],[[6622,2293],[-10,-19],[-9,-19]],[[6599,2345],[-2,3],[-58,43],[11,19],[8,16],[3,5]],[[6561,2431],[77,-51]],[[6580,2321],[1,5],[-54,41]],[[6527,2367],[-70,50]],[[6457,2417],[12,24],[11,19],[8,15],[4,8]],[[6492,2483],[69,-52]],[[6492,2483],[17,30]],[[6509,2513],[14,26]],[[6523,2539],[13,-10],[22,-17],[-3,-12],[-2,-11],[24,-3],[12,-3],[9,-4],[8,-6],[22,-18],[11,-5],[10,-8],[33,-23]],[[6523,2539],[37,68]],[[6560,2607],[34,-26]],[[6594,2581],[35,-25],[-2,-5],[-5,-8],[-5,-11],[21,-17],[24,-14],[15,-7]],[[6594,2581],[13,23],[13,24],[13,24],[36,-26]],[[6560,2607],[6,10],[4,8],[1,10],[-2,30],[0,2],[0,18]],[[6569,2685],[1,6],[2,5],[1,5],[2,3],[9,17],[13,24],[10,18],[1,2],[0,2],[13,23]],[[6621,2790],[62,-46]],[[6621,2790],[12,22],[13,24]],[[6646,2836],[23,-18],[30,-22],[9,-7]],[[6621,2790],[-62,47]],[[6559,2837],[12,22],[13,23]],[[6584,2882],[53,-40],[9,-6]],[[6584,2882],[10,19],[6,10]],[[6600,2911],[20,-15],[21,-16],[6,11],[3,6],[5,9],[21,-15]],[[6676,2891],[-5,-10],[-3,-5],[-6,-11],[-6,-10],[-10,-19]],[[6679,2898],[-2,-3],[-1,-4]],[[6600,2911],[-18,14],[-18,12],[-17,14]],[[6547,2951],[9,16],[4,7]],[[6560,2974],[2,2],[2,1],[3,3]],[[6567,2980],[6,-4],[18,-13],[10,-7],[1,-1],[5,-4],[9,-6]],[[6616,2945],[32,-23],[11,-9],[20,-15]],[[6616,2945],[2,4],[8,18],[10,18],[5,8],[11,9]],[[6652,3002],[24,-17],[19,-14],[18,-14]],[[6713,2957],[-9,-10],[-6,-9]],[[6698,2938],[-9,-18],[-9,-18],[-1,-4]],[[6567,2980],[1,1],[2,2],[10,18],[10,18],[12,21]],[[6602,3040],[40,-30],[10,-8]],[[6741,2852],[-1,1],[-61,45]],[[6698,2938],[63,-47]],[[8269,3639],[9,-6]],[[8278,3633],[-10,-19],[-3,-5],[-3,-6],[-8,-16],[-9,-15]],[[8245,3572],[-30,24],[-29,22],[-26,20],[-27,21]],[[8133,3659],[4,18]],[[8137,3677],[5,16]],[[8142,3693],[4,14]],[[8146,3707],[6,20]],[[8152,3727],[18,-14],[30,-22]],[[8200,3691],[-4,-22],[-6,-32],[34,-26]],[[8224,3611],[14,-11],[2,-2],[9,16],[1,1],[9,7],[2,2],[8,15]],[[8224,3611],[1,2],[23,42],[19,35]],[[8267,3690],[13,-11],[-10,-19],[-5,-17],[1,-1],[2,-1],[1,-2]],[[8200,3691],[9,42],[2,-1],[27,-21],[16,-12],[13,-9]],[[5608,4321],[12,16],[2,0],[1,1],[-1,1],[4,5]],[[5626,4344],[4,5]],[[5630,4349],[5,-5],[-11,-17],[33,-32],[8,18],[7,13]],[[5672,4326],[43,-45],[2,-2],[10,20]],[[5727,4299],[12,-13],[-3,-5],[-1,-4],[-2,-4],[-2,-3],[-1,-4],[-2,-4],[0,-3],[2,-1],[12,-2],[2,0],[2,5],[2,3],[1,3],[3,5],[16,-16],[22,2]],[[5816,4388],[11,17],[12,24],[2,4]],[[5841,4433],[51,-38],[13,-10],[3,-3]],[[5908,4382],[-1,-4]],[[5907,4378],[-7,-18],[-5,-12],[-29,-75]],[[5866,4273],[-4,-1],[-10,-4],[-19,-8],[-5,-1],[-3,-2],[-4,-1],[-4,-1]],[[5817,4255],[-5,-1],[-3,-1],[-4,-1],[-4,-1],[-5,-1],[-4,-1],[-3,0],[-4,-1],[-4,0],[-5,0],[-3,-1],[-6,0],[-5,0],[-7,0],[-7,1],[-6,0],[-6,1],[-4,1],[-4,0],[-4,1],[-5,1],[-5,2],[-4,1],[-4,1],[-10,3],[-4,2],[-4,1],[-6,3],[-5,2],[-4,3],[-4,2],[-4,2],[-3,2],[-8,4],[-4,4],[-4,2],[-3,2],[-3,3],[-3,2],[-3,3],[-3,3],[-3,2],[-10,10],[-10,10]],[[5727,4299],[3,8],[7,9],[5,4],[11,6]],[[5753,4326],[20,14]],[[5773,4340],[9,-17]],[[5672,4326],[9,20],[10,18]],[[5691,4364],[12,16],[29,-30],[18,-19],[2,-2],[1,-3]],[[5691,4364],[-13,14],[-15,14]],[[5663,4392],[47,61]],[[5710,4453],[13,-11],[15,-12],[31,-28],[-11,-17],[-12,-18],[23,-23],[2,-1],[2,-3]],[[5630,4349],[10,12],[12,16]],[[5652,4377],[11,15]],[[5652,4377],[-54,56]],[[5598,4433],[12,15]],[[5610,4448],[27,-28],[12,16],[19,27],[14,-12],[12,17],[16,-15]],[[9686,9775],[-1,-1],[-1,-1],[-36,-32],[-3,-2],[-2,-2],[-6,-6],[-7,-7],[-4,-5],[-5,-6],[-7,-10],[-6,-8],[-6,-11],[-2,-5]],[[9600,9679],[-4,-9],[-4,-10],[-4,-12],[-5,-26],[-1,-3],[-1,-6],[-7,-33]],[[9574,9580],[-6,-27],[-7,-25],[-4,-16],[-6,-28],[-16,-74],[-14,-65],[-10,-51]],[[9511,9294],[-10,-47],[-14,-67]],[[9487,9180],[-14,-68]],[[9473,9112],[-11,-50]],[[9462,9062],[-4,-1],[-8,-3],[-183,-67],[-130,-40]],[[9137,8951],[0,6],[1,6],[0,5],[1,6],[1,5],[0,5],[1,4],[1,9],[2,7],[2,12],[2,6],[1,6],[4,13],[6,23],[116,418],[29,103],[2,7],[22,78],[2,9],[1,4],[3,13],[2,7],[1,4],[1,9],[2,9],[0,4],[1,6],[1,4],[1,10],[0,6],[0,4],[1,3],[0,7],[0,41],[-3,0],[0,1],[0,12],[0,5],[0,6],[0,4]],[[9341,9838],[4,1],[6,2],[19,6],[6,2],[11,5],[8,3],[28,4],[5,-1],[4,-2],[2,-2],[3,-3],[2,-5],[2,-5],[3,-13],[5,-12],[2,-10],[1,-3],[1,-8],[5,-9],[10,-10],[14,-9],[11,-4],[9,0],[13,3],[13,-22],[2,-3],[9,-15],[3,-3],[2,0],[2,0],[32,13],[4,1],[-13,20],[11,9],[2,4],[-1,4],[-5,13],[14,3],[9,2],[9,3],[9,2],[5,0],[3,-1],[10,-2],[45,-12],[14,8],[1,0],[1,-1],[1,-1],[3,-4]],[[9700,9786],[-2,-2],[-10,-8],[-2,-1]],[[9673,9553],[-5,-24]],[[9668,9529],[-1,-3],[-1,-5],[-1,-11],[-2,-10],[-2,-17],[-2,-12],[-2,-12],[0,-9],[-7,-140]],[[9650,9310],[-30,-15],[-41,-6],[-36,1],[-32,4]],[[9574,9580],[37,-11],[1,9],[4,16],[5,23],[34,-9],[20,-6]],[[9675,9602],[-6,-33],[-3,-14],[7,-2]],[[9853,9901],[0,-3],[-1,-13],[-3,-13],[-6,-23],[-2,-5],[-1,-5],[-1,-6],[0,-3],[0,-2],[0,-1],[0,-1],[0,-1],[-1,-1],[-1,-1],[-1,-2],[-1,0],[-1,-1],[-1,0],[-1,1],[-1,0],[-1,1],[-1,2],[-1,1],[-1,0],[-2,0],[-2,1],[-2,0],[-2,-1],[-10,-2]],[[9809,9823],[-43,-11]],[[9766,9812],[-3,-1],[-11,-2],[-20,-6],[-14,-6],[-11,-6],[-5,-4],[-2,-1]],[[9341,9838],[0,1],[1,5],[0,5]],[[9342,9849],[3,0],[6,-1],[14,2],[12,4],[8,6],[9,3],[25,1],[8,2],[4,-1],[12,1],[15,-6],[8,2],[3,-1],[4,-4],[0,-5],[9,1],[4,-2],[4,-2],[3,-5],[2,-6],[6,-32],[2,-6],[1,-1],[4,-4],[8,-1],[3,0],[3,0],[4,0],[8,-4],[1,-4],[-4,-3],[-4,-1],[-4,0],[-4,-2],[-1,-1],[1,-1],[3,0],[2,0],[6,1],[11,5],[23,14],[8,2],[11,3],[5,4],[6,5],[4,1],[12,-1],[7,4],[14,13],[9,1],[8,4],[5,3],[8,8],[3,1],[6,2],[5,5],[7,2],[8,6],[5,1],[13,8],[16,10],[21,8],[9,10],[5,5],[3,0],[10,-2],[8,2],[8,4],[7,1],[8,4],[2,2],[6,6],[2,0],[8,-4],[5,1],[3,2],[5,6],[3,2],[8,1],[5,3]],[[9850,9931],[1,-16],[1,-5],[1,-9]],[[9667,9996],[2,-4],[4,0],[4,-1],[2,-3],[-3,-7],[1,-14],[-2,-9],[-4,-1],[-5,0],[-6,-3],[-15,-10],[-7,-7],[-6,-3],[-6,-10],[-12,-9],[-4,-4],[-4,-7],[-3,-5],[-6,0],[-1,2],[0,7],[-1,4],[-3,-1],[-1,-9],[-5,-19],[-3,-8],[-14,-13],[-6,-4],[-6,-1],[-14,3],[-22,9],[-2,4],[-1,4],[-1,4],[1,6],[1,4],[0,5],[1,5],[-2,7],[-2,5],[-1,7],[1,7],[5,2],[11,6],[5,6],[-1,5],[3,5],[7,1],[9,0],[9,2],[8,4],[6,4],[18,4],[19,8],[10,2],[6,5],[1,1],[13,12],[15,5],[4,0],[3,-3]],[[9455,8069],[-41,10]],[[9414,8079],[-42,11]],[[9372,8090],[5,21],[4,21],[4,21],[-24,6],[0,9],[-1,9],[8,1],[23,-6],[2,0],[1,2],[6,26]],[[9400,8200],[4,-1],[14,-7],[4,8],[7,12],[5,7],[6,6],[6,10],[1,3]],[[9447,8238],[20,-5]],[[9467,8233],[-4,-9],[-8,-12],[-9,-9],[-2,-3],[-4,-7],[15,-8],[1,-3],[-3,-5],[-3,-8],[-5,-28],[0,-3],[2,-1],[7,-2],[13,-1],[-1,-9],[-3,-15],[-4,-21],[-4,-20]],[[9563,8153],[-7,8],[-15,4],[-9,-47],[-1,-2],[-4,0],[-18,5],[-5,-21],[-4,-21],[-4,-21]],[[9496,8058],[-41,11]],[[9467,8233],[3,11],[1,8],[3,12],[1,5]],[[9475,8269],[22,-6],[15,-4],[18,-4],[15,-4],[49,-12],[24,-6],[2,-1]],[[9619,8026],[-41,11],[-41,11]],[[9537,8048],[-41,10]],[[9562,7952],[-42,11]],[[9520,7963],[-41,10],[4,20],[4,21],[5,23],[4,21]],[[9537,8048],[-4,-21],[-5,-24],[42,-10],[-4,-21],[-4,-20]],[[9615,8005],[-4,-23],[-4,-21],[-4,-19],[-41,10]],[[9569,7926],[-56,15]],[[9513,7941],[7,22]],[[8590,2180],[-19,-7],[-12,-5],[-11,-4],[-6,-4],[-4,-5],[-3,-3],[-3,-4]],[[8532,2148],[-14,-17],[-5,-4],[-10,-5],[-7,-2],[-6,0],[-15,2]],[[8475,2122],[-9,1],[-8,-2],[-11,-4],[-8,-8],[-4,-8],[-3,-10],[-1,-8],[1,-29],[0,-9],[0,-4],[0,-6]],[[8432,2035],[-2,-6],[-4,-16],[-8,-24],[0,-5],[-1,-9],[0,-5],[0,-3],[2,-1],[3,-2],[7,-4],[7,-1],[11,-1]],[[8447,1958],[0,-10],[-4,-7],[-6,-3],[-4,-4],[-2,-3],[-3,-4],[-2,-5],[-1,-4],[-2,-9],[1,-9],[-1,-10],[-3,-6],[-5,-6],[-1,-3],[-1,-3],[-1,-2],[-1,-3],[0,-3],[0,-8],[4,-8]],[[8415,1848],[-48,25]],[[8367,1873],[9,30],[4,12],[7,32],[3,60],[5,36],[1,42],[1,35],[5,12],[8,16],[4,6],[21,15],[3,0],[27,6],[9,2],[19,0],[2,2],[5,7],[13,16],[7,6],[27,24],[8,11],[3,4],[4,5],[0,8],[2,6],[4,2],[3,6],[2,5],[1,4],[7,7],[6,3],[6,8],[12,6],[21,11],[7,9],[3,11],[8,12],[3,7],[5,4],[8,8],[4,7],[1,4],[6,12],[4,5],[4,-2],[1,-1],[3,0]],[[8475,2122],[-3,-41],[-18,1],[-2,-25],[0,-17],[-1,-3],[-3,-3],[-4,0],[-12,1]],[[8489,1978],[2,-2],[1,-3],[-1,-17]],[[8491,1956],[-4,0],[-40,2]],[[8532,2148],[4,-7],[-2,-3],[-7,-7],[-3,-6],[2,-8],[2,-9],[3,-16],[2,-9],[13,-9],[-5,-8],[-3,0],[0,-1],[1,-2],[0,-1],[-1,-3],[-2,-1],[-2,-1],[-2,-2],[-3,-1],[-6,-2],[-12,-2],[-11,-2],[-2,-1],[-2,-1],[-5,-7],[0,-14],[-1,-18],[-12,0],[0,-6],[11,0],[0,-23]],[[8615,2038],[-12,-6],[-1,3],[-16,12],[-4,0],[-11,-19],[-7,-12],[-1,-4],[2,-13],[0,-4],[-3,-3],[-2,-2],[-16,-4],[-17,-5],[-10,-2],[-9,-1],[-19,0]],[[8615,2038],[-20,-48],[-2,-7],[0,-8],[0,-10],[5,-13],[6,-10],[3,-7],[1,-2]],[[8608,1933],[-7,8],[-4,3],[-4,3],[-9,3],[-4,2],[-5,1],[-4,2],[-6,1],[-5,0],[0,-3],[0,-8],[0,-9],[0,-1],[-3,-7],[-3,-5],[-3,-4],[-5,6],[-7,9],[-3,1],[-2,0],[-2,1],[-2,0],[-12,1],[-7,0],[-23,1]],[[8488,1938],[2,2],[1,16]],[[8663,1958],[-1,-5],[0,-5],[-5,-13],[-7,-15]],[[8633,1900],[-16,20],[-9,13]],[[8633,1900],[-4,-3],[-26,-30],[-9,-10]],[[8594,1857],[-5,7],[-27,-13],[-8,8],[-39,-31],[0,-6]],[[8515,1822],[-100,26]],[[8415,1848],[27,20],[12,8],[5,4],[5,4],[5,5],[11,-16],[2,-1],[2,0],[2,2],[7,9],[2,2],[-1,3],[-2,4],[-11,16],[2,6],[3,8],[1,8],[1,8]],[[8633,1765],[-26,-29],[-10,-17],[-11,-16]],[[8586,1703],[-3,3],[-18,21],[-10,12],[-25,31],[13,16],[-24,28],[-5,5],[1,3]],[[8594,1857],[5,-6],[-1,-33],[5,-17],[27,-33],[3,-3]],[[8658,1867],[3,-7],[3,-8],[2,-9],[1,-12],[0,-11],[-3,-11],[-3,-7],[-6,-11],[-9,-11],[-13,-15]],[[8741,2856],[7,-18],[4,-4],[6,-10],[10,-20],[6,-18],[3,-18],[0,-32],[-44,-209],[-13,-38],[-6,-1],[-2,0],[-4,-1],[-3,-1],[-5,-3],[-18,-18],[-14,-16],[-12,-14],[-7,-8],[-13,-9],[-34,-29],[-59,-44],[-61,-48],[0,-5],[-1,0],[-5,-4],[-13,-11],[-27,-15],[-31,-10],[-6,-2],[-6,0],[-9,1],[-47,39],[-3,0],[0,-3],[26,-22],[13,-12],[1,-2],[12,-7],[9,-1],[-2,-5],[-7,-8],[-6,-5]],[[8260,2321],[2,5]],[[8262,2326],[1,2],[1,3],[7,14]],[[8271,2345],[9,20]],[[8280,2365],[10,23],[12,25],[11,23]],[[8313,2436],[10,27]],[[8323,2463],[4,-3],[17,-9],[19,-11],[12,31],[15,39]],[[8390,2510],[1,-2],[18,0],[85,-4],[23,17],[5,6],[1,8],[1,19],[-36,0],[-29,1]],[[8459,2555],[0,23]],[[8459,2578],[0,22],[0,11],[0,12],[0,17],[0,1],[-1,1],[-59,1],[0,-18],[1,-1]],[[8400,2624],[-42,0],[-5,0]],[[8353,2624],[0,7],[1,13]],[[8354,2644],[1,15],[1,5],[2,7],[4,40],[1,5],[2,19]],[[8365,2735],[4,31],[5,49],[1,3],[0,3],[0,3]],[[8375,2824],[42,-6],[58,-10],[41,-6],[28,-4],[18,2],[12,2],[27,11],[4,1],[5,2],[5,1],[3,1],[2,1],[15,3],[16,4],[12,2],[12,3],[12,3],[6,2],[7,2],[8,5],[6,3],[3,2],[3,1],[1,1],[2,1]],[[8723,2851],[2,1],[3,-3],[13,7]],[[9137,3084],[1,1]],[[9138,3085],[2,-5],[-1,-2],[-1,1],[-1,5]],[[8390,2510],[5,12],[4,12]],[[8399,2534],[42,-1],[17,0],[1,22]],[[8399,2534],[0,11],[0,11]],[[8399,2556],[0,11],[0,12]],[[8399,2579],[32,-1],[28,0]],[[8312,3700],[-8,-17],[-8,-15],[-10,-20],[-8,-15]],[[8152,3727],[4,19]],[[8156,3746],[7,23],[5,21],[4,15]],[[8172,3805],[11,-8],[21,-16],[13,-9],[37,-28],[1,-1],[28,-21],[9,-7],[3,-2],[9,-7],[8,-6]],[[7761,6574],[-73,54],[-19,-32],[-22,-41],[-14,11]],[[7633,6566],[-16,12],[-22,17],[-21,18],[-2,2]],[[7572,6615],[-3,2],[-11,11],[-8,9],[-13,12],[-9,9],[-17,17]],[[7511,6675],[25,23],[10,9],[28,24],[24,17],[42,29],[13,11]],[[7653,6788],[5,-4],[17,-12],[67,-46]],[[7742,6726],[52,-35],[23,-16]],[[7817,6675],[-1,-3],[-10,-16],[-22,-42],[-23,-40]],[[7720,6501],[-1,-3],[-10,-18],[-14,11],[-4,-1],[-21,-40],[-17,13],[-11,-19]],[[7642,6444],[-8,-9]],[[7634,6435],[-14,16],[7,9],[10,14],[22,40],[-1,4],[-14,10]],[[7644,6528],[-18,14],[-2,1],[-1,2],[0,2],[1,3],[8,14],[1,2]],[[7761,6574],[-19,-33],[-22,-40]],[[8399,2579],[1,22],[0,23]],[[8345,2556],[3,23],[3,23],[2,22]],[[8399,2556],[-26,0],[-28,0]],[[8340,2511],[3,23],[2,22]],[[8390,2510],[-8,0],[-16,0],[-14,1],[-12,0]],[[8323,2463],[10,27],[7,21]],[[8313,2436],[-14,28],[-9,18]],[[8290,2482],[-8,16]],[[8282,2498],[14,17],[2,2],[9,40],[9,0],[10,0],[10,-1],[9,0]],[[8282,2498],[-10,19]],[[8272,2517],[-9,18],[-1,3],[-2,4]],[[8260,2542],[31,39],[18,21],[16,19]],[[8325,2621],[13,10],[16,13]],[[8325,2621],[2,6],[-15,13],[-14,13]],[[8298,2653],[25,37],[13,21],[4,6],[18,27],[7,-9]],[[8298,2653],[-11,16],[-7,9]],[[8280,2678],[-7,10],[-7,9],[-13,18],[-16,22],[-14,-14]],[[8223,2723],[-18,26],[-2,3]],[[8203,2752],[19,20],[11,11],[6,4],[26,24],[3,1],[26,25],[31,30],[47,41],[4,3]],[[8376,2911],[4,-26],[0,-6],[1,-6],[-3,-25],[-3,-24]],[[8446,3301],[8,-49],[2,-4],[4,-7],[1,-2],[1,-3],[2,-32]],[[8464,3204],[-4,0],[-24,14],[-12,7],[-27,15],[-8,5],[-11,6]],[[8378,3251],[19,34],[4,7],[7,21],[11,-5],[5,-3],[22,-4]],[[8378,3251],[-15,8],[-8,5],[-14,8],[-11,6]],[[8330,3278],[-15,9],[-26,15]],[[8289,3302],[8,16],[6,12],[5,9],[5,11]],[[8313,3350],[17,32],[5,10],[3,7],[8,14],[10,22],[14,24],[6,13]],[[8376,3472],[10,-6],[8,-6],[15,-10],[23,-14],[-4,-13],[-10,-28],[13,-6],[12,-5],[5,-2]],[[8448,3382],[-3,-15],[-1,-13],[1,-32],[1,-21]],[[8505,3564],[-7,-24],[-9,-26],[-6,-19],[-3,-6],[-1,-6],[-6,-16],[-9,-23],[-4,-12],[-2,-10],[-4,-13],[-6,-27]],[[8376,3472],[21,51],[4,5],[4,8]],[[8405,3536],[15,36],[3,8],[7,21],[3,8]],[[8433,3609],[12,-9],[10,-8],[16,-12],[3,-1],[19,-7],[0,-4],[9,-4],[3,0]],[[8376,3472],[-13,10],[-3,2],[-1,1],[-4,3],[-3,2],[-4,4],[-26,19]],[[8322,3513],[7,17],[13,28],[8,20]],[[8350,3578],[25,-18],[11,-9],[4,-3],[4,-3],[11,-9]],[[8350,3578],[-16,13],[-11,8]],[[8323,3599],[9,15],[10,18],[17,32]],[[8359,3664],[23,-17],[24,-18],[11,-8],[1,-1],[4,-3],[11,-8]],[[8322,3513],[-30,23],[-4,3],[-9,7],[-9,7],[-25,19]],[[8278,3633],[23,-18],[18,-13],[4,-3]],[[8312,3700],[26,-20],[18,-13],[3,-3]],[[8121,3613],[-15,11],[-8,5],[-5,3]],[[8093,3632],[-44,32]],[[8049,3664],[6,11],[1,2],[6,10],[4,8],[5,9]],[[8071,3704],[41,-29],[21,-16]],[[8133,3659],[-4,-17],[-8,-29]],[[8074,3602],[-2,1]],[[8072,3603],[-5,4],[-35,26]],[[8032,3633],[7,13],[10,18]],[[8093,3632],[-11,-19],[-4,-7],[-4,-4]],[[8111,3574],[-9,6],[-3,3],[-25,19]],[[8121,3613],[-6,-22],[-4,-17]],[[8096,3522],[-48,37]],[[8048,3559],[8,14],[6,10]],[[8062,3583],[5,10],[5,10]],[[8111,3574],[-5,-20],[-10,-32]],[[8048,3559],[-40,31]],[[8008,3590],[13,24],[41,-31]],[[8008,3590],[-11,-20]],[[7997,3570],[-18,13],[-22,17]],[[7957,3600],[-7,8],[-3,4]],[[7947,3612],[5,5],[6,11],[2,4]],[[7960,3632],[8,-7],[11,-10],[5,-6],[7,-5],[17,-14]],[[8027,3517],[-6,5],[-21,16],[-15,12]],[[7985,3550],[-18,14],[-20,15]],[[7947,3579],[1,3],[1,3],[3,2],[1,2],[1,3],[2,3],[1,5]],[[7997,3570],[10,-8],[26,-20],[4,-3]],[[8037,3539],[2,-2]],[[8039,3537],[-5,-9],[-7,-11]],[[8006,3479],[-10,8],[-7,6],[-17,13],[-9,7]],[[7963,3513],[7,12],[-20,15],[-8,6],[-9,7]],[[7933,3553],[12,22],[2,4]],[[7985,3550],[-6,-10],[-6,-10],[8,-6],[1,-1],[12,-10],[21,-17]],[[8015,3496],[-5,-9],[-4,-8]],[[8027,3517],[-12,-21]],[[8071,3451],[-12,9],[-9,8],[-14,11],[-14,11],[-7,6]],[[8027,3517],[20,-16],[18,-14],[4,-3],[11,-8]],[[8080,3476],[-4,-11],[-5,-14]],[[8088,3499],[-8,-23]],[[8039,3537],[37,-29],[12,-9]],[[8096,3522],[-8,-23]],[[8037,3539],[5,9],[6,11]],[[8289,3302],[-6,-12],[-3,-6],[-14,-28],[-2,-3],[-6,-12],[-2,-4],[-2,-2],[-1,-2],[-2,-2],[-1,-2],[-1,-1],[0,-1],[-30,-42],[-8,-10],[-10,-13],[-15,-20]],[[8186,3142],[-2,3],[-21,16],[-12,11],[-4,3],[-22,18],[-5,6],[-4,2],[-2,3],[-2,3],[-23,18],[-7,6],[-9,7],[-10,7]],[[8063,3245],[-9,7],[-1,2],[-25,20],[-24,20],[-3,1],[-7,6],[-4,5]],[[7990,3306],[14,22],[3,5],[9,16],[11,18],[13,22],[12,20]],[[8052,3409],[11,20],[7,18],[1,4]],[[8096,3522],[9,-7],[3,-2],[11,-9],[13,-11],[13,-10],[15,-11],[23,-19]],[[8183,3453],[10,-7],[33,-27],[3,-2],[7,-6],[13,-10],[19,-15],[18,-15],[3,1],[3,-2],[2,-2],[1,0],[1,-3],[1,-1],[16,-14]],[[8052,3409],[-59,48]],[[7993,3457],[13,22]],[[7993,3457],[-21,16],[-7,6],[-15,12]],[[7950,3491],[8,13],[5,9]],[[7950,3491],[-30,26]],[[7920,3517],[5,19],[2,1],[6,16]],[[7387,3495],[-118,-167],[-6,-12],[-20,-36],[-13,-29],[-12,-21],[-2,-3],[-6,-4],[-7,-5],[-5,-13],[-1,-10],[-1,-8],[-4,-9],[-5,-7],[-7,-6],[-6,-12],[-3,-7],[-1,-4],[0,-3],[-1,-4]],[[7169,3135],[-17,14]],[[7152,3149],[-27,23]],[[7125,3172],[39,74],[6,13],[2,31],[-3,10],[-9,32]],[[7160,3332],[-2,8],[-4,5],[-4,3],[-2,2],[-3,3]],[[7145,3353],[8,13],[0,1],[10,18],[4,7],[15,28],[-10,7]],[[7172,3427],[37,66]],[[7209,3493],[9,-7],[39,72],[2,5],[3,6],[3,3],[4,3],[3,2],[2,2],[5,3]],[[7279,3582],[10,-8]],[[7289,3574],[34,-25],[64,-54]],[[7172,3427],[-13,-25],[-10,7],[-6,4],[2,5]],[[7145,3418],[12,21],[11,22],[13,22],[12,21]],[[7193,3504],[5,-3],[10,-7],[1,-1]],[[7145,3353],[-17,13],[-5,-9],[-35,26],[-4,18]],[[7084,3401],[13,25]],[[7097,3426],[10,19]],[[7107,3445],[38,-27]],[[7107,3445],[12,21],[13,24],[11,21]],[[7143,3511],[12,22],[10,16]],[[7165,3549],[37,-27],[-9,-18]],[[7097,3426],[-42,31],[-5,11]],[[7050,3468],[33,62],[-15,21]],[[7068,3551],[12,-8],[21,2],[34,-26],[6,-4],[2,-4]],[[7050,3468],[-7,13],[-11,8],[-20,16]],[[7012,3505],[23,43],[6,23]],[[7041,3571],[27,-20]],[[7016,3593],[8,-9],[2,-2],[15,-11]],[[7012,3505],[-12,7],[-14,3],[-12,2]],[[6974,3517],[42,76]],[[6974,3517],[-19,8]],[[6955,3525],[13,4],[26,49],[10,15]],[[7004,3593],[12,0]],[[6955,3525],[-9,5],[-16,17]],[[6930,3547],[14,3],[18,34],[25,49],[2,-11],[15,-29]],[[7012,3505],[-11,-19],[-8,-8],[-4,-4],[-19,-17],[-6,-9],[-7,-21]],[[6957,3427],[-18,13]],[[6939,3440],[-36,25],[-4,3],[-13,10]],[[6886,3478],[7,12],[17,20],[20,37]],[[6886,3478],[0,20],[29,53],[-2,20]],[[6913,3571],[17,-24]],[[7481,5741],[-15,-10]],[[7466,5731],[-60,40]],[[7406,5771],[6,7],[12,5],[9,7]],[[7433,5790],[38,32]],[[7471,5822],[5,-8],[9,-8]],[[7485,5806],[14,-10],[-15,-28],[-12,-8],[9,-19]],[[7406,5771],[-56,40]],[[7350,5811],[5,8]],[[7355,5819],[9,14],[9,8],[19,15]],[[7392,5856],[11,-18]],[[7403,5838],[30,-48]],[[7485,5806],[17,15],[14,11],[4,0],[25,-19],[-10,-18],[-10,-18],[5,-5]],[[7530,5772],[-29,-55],[-4,-1],[-3,3],[-13,22]],[[7549,5614],[-2,2],[-4,2],[-52,38]],[[7491,5656],[14,26],[6,10],[3,5],[-48,34]],[[7530,5772],[16,-11],[29,55],[2,3],[10,17]],[[7587,5836],[13,26],[10,17],[11,18]],[[7621,5897],[15,-11]],[[7636,5886],[16,-13],[20,-14],[2,-2],[2,-1],[3,-3]],[[7679,5853],[-9,-18],[-10,-18]],[[7660,5817],[-1,-2],[-1,-2],[-3,-4],[-18,-34]],[[7637,5775],[-2,-3],[-1,-3],[-13,-23],[-14,-25],[-17,-32],[-23,-43],[-14,-25],[-4,-7]],[[7066,6051],[-10,-19]],[[7056,6032],[-11,13],[-8,-14],[-4,-8],[11,-8],[2,-1],[-4,-8],[-1,-1],[-4,-7]],[[7037,5998],[-7,5],[-7,5],[-7,5],[-6,4],[-20,-36],[-5,-9]],[[6985,5972],[-12,9],[-14,10],[-13,10]],[[6946,6001],[6,11],[2,5],[1,1],[1,3],[2,6],[8,15],[18,34],[1,4],[3,8],[2,11],[3,6],[4,-3],[69,-51]],[[8088,5335],[-3,1],[-7,4],[-2,1],[-22,12],[-3,1],[-8,4]],[[8043,5358],[-8,5],[-2,1],[-44,22],[-10,5],[-11,6]],[[7968,5397],[10,18]],[[7978,5415],[10,19]],[[7988,5434],[12,-6],[52,-27],[11,-5]],[[8063,5396],[11,-5],[24,-13],[8,-4],[2,-2]],[[8453,7042],[-11,-20]],[[8442,7022],[-59,43]],[[8383,7065],[11,20],[8,15],[7,14]],[[8409,7114],[59,-43]],[[8468,7071],[-7,-14],[-8,-15]],[[8475,7085],[-59,43]],[[8416,7128],[7,14],[41,77],[25,-19],[-3,-8],[33,-25]],[[8519,7167],[-10,-18],[-26,-50],[-8,-14]],[[8417,6967],[-5,3],[-11,8]],[[8401,6978],[-30,22],[-15,11],[-2,1],[-3,3]],[[8351,7015],[2,3],[6,12],[10,20],[10,18]],[[8379,7068],[4,-3]],[[8442,7022],[-9,-17]],[[8433,7005],[-8,-15],[-8,-15],[0,-4],[0,-4]],[[8360,6900],[-16,13],[-18,12]],[[8326,6925],[-13,10],[-6,-3]],[[8307,6932],[17,32],[4,8],[11,20],[1,2],[9,16],[2,5]],[[8401,6978],[-2,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-3],[-11,-21],[-15,-27],[-9,-23]],[[8384,6768],[-19,-1],[-15,0]],[[8350,6767],[1,2],[2,15],[1,3],[2,11],[0,3],[-3,0],[-15,4],[-2,2],[0,2],[1,7]],[[8337,6816],[6,22],[5,21],[7,21],[-23,17],[-15,11],[9,17]],[[8360,6900],[17,-12],[3,-2],[30,-20]],[[8410,6866],[1,-1],[16,-12]],[[8427,6853],[-6,-10],[-13,-54],[-17,-1],[-8,0],[1,-20]],[[8272,6779],[-7,-14],[-2,-10],[0,-13],[4,-14],[11,-16],[19,-27]],[[8297,6685],[9,-8],[13,-6],[17,-5],[3,-1]],[[8339,6665],[-1,-3],[-1,-4],[-1,-3],[-1,-3],[-4,-10],[-3,-9],[27,-19],[62,-45]],[[8417,6569],[-2,-4],[-2,-2]],[[8413,6563],[-24,18],[-18,13],[-13,9],[-4,3],[-4,3],[-4,2],[-3,3],[-4,3],[-19,14],[-3,3],[-10,8],[-7,6],[-14,11],[-4,4],[-3,3],[-3,3],[-4,4],[-2,2],[-3,3],[-9,9],[-5,5],[-3,3],[-1,1],[-5,4],[-5,6],[-23,23]],[[8216,6729],[0,2],[0,2],[0,1],[-1,2],[0,2],[1,2],[1,2],[1,1],[1,3],[1,1],[1,4],[2,4],[2,6],[2,7],[1,3],[2,4],[1,3],[2,5],[1,4],[1,4],[2,5],[2,5],[2,4],[1,3],[3,5],[3,6],[6,11],[4,9],[6,11],[5,9],[6,12],[5,8],[10,20],[17,33]],[[8337,6816],[-25,7],[-2,-5],[-12,8],[-5,-9],[-18,11],[-10,-19],[17,-12],[-10,-18]],[[7644,6528],[-13,-22]],[[7631,6506],[-32,24]],[[7599,6530],[-32,25],[-17,13]],[[7550,6568],[7,22],[3,10]],[[7560,6600],[10,12],[2,3]],[[7634,6435],[-15,-16]],[[7619,6419],[-5,8],[-9,11],[-12,12]],[[7593,6450],[5,9],[6,6],[8,8],[9,13],[10,20]],[[7593,6450],[-49,38]],[[7544,6488],[5,9],[3,8],[8,-3],[16,-12],[12,21],[11,19]],[[7544,6488],[-5,3],[-10,2]],[[7529,6493],[1,11],[16,51],[4,13]],[[8063,5396],[10,18]],[[8073,5414],[9,-4],[1,-1],[23,-11],[2,-1],[8,-4],[2,-2]],[[8073,5414],[10,19],[10,19],[8,-4],[7,-4],[5,11],[12,22],[13,-9],[-6,-13],[-10,-18],[3,-2],[11,-5],[2,-1]],[[7988,5434],[10,18]],[[7998,5452],[2,3],[8,16]],[[8008,5471],[10,19],[20,39]],[[8038,5529],[20,38]],[[8058,5567],[75,-39],[29,-15],[6,-3],[9,-4],[2,-1]],[[8058,5567],[8,15],[10,21]],[[8076,5603],[76,-39],[29,-15],[9,-4],[6,-3],[3,-2]],[[8209,5561],[-10,-21]],[[8076,5603],[7,11],[5,10],[11,20]],[[8099,5644],[11,-6],[55,-27],[9,-5]],[[8174,5606],[-11,-20],[12,-6],[32,-17],[2,-2]],[[8026,5219],[-4,-7]],[[8022,5212],[-3,1],[-9,5],[-5,2],[-18,9],[-9,5]],[[7978,5234],[12,23],[6,11],[6,11],[2,4]],[[8004,5283],[41,-22],[2,-1]],[[8047,5260],[-2,-3],[-10,-20],[-9,-18]],[[8006,5182],[-10,-20]],[[7996,5162],[-3,1],[-24,12],[-17,9],[14,26],[12,24]],[[8022,5212],[-6,-11],[-10,-19]],[[7942,5060],[-3,-6]],[[7939,5054],[-3,1],[-33,16],[-8,4]],[[7895,5075],[-31,15]],[[7864,5090],[-36,19],[-8,4]],[[7820,5113],[11,23],[12,22],[12,23]],[[7855,5181],[24,45],[12,23],[12,23]],[[7903,5272],[12,23]],[[7915,5295],[12,23],[2,3]],[[7929,5321],[75,-38]],[[7996,5162],[-12,-21]],[[7984,5141],[-11,-22],[-11,-22]],[[7962,5097],[-10,-19],[-10,-18]],[[7895,5075],[-11,-20],[-12,-23],[-12,-24],[-10,-18]],[[7850,4990],[-63,31],[-3,1],[-10,5]],[[7774,5027],[10,18],[12,25],[12,23]],[[7808,5093],[9,-5],[3,-1],[37,-18],[4,11],[3,10]],[[7866,4917],[-9,5],[-34,17]],[[7823,4939],[17,32],[10,19]],[[7939,5054],[-6,-12],[-5,-9],[-4,-8]],[[7924,5025],[-6,-11],[-3,-3],[-2,-4],[-11,-21],[-9,-18]],[[7893,4968],[-10,-18],[-8,-15],[-9,-18]],[[7913,4893],[-9,5],[-26,13],[-12,6]],[[7893,4968],[9,-4],[3,-1],[19,-10],[10,-4]],[[7934,4949],[-7,-19]],[[7927,4930],[-7,-17],[-7,-20]],[[7961,4869],[-9,5],[-30,15],[-9,4]],[[7927,4930],[9,-4],[30,-15],[9,-5]],[[7975,4906],[-7,-18],[-7,-19]],[[7961,4869],[-6,-18],[-7,-18]],[[7948,4833],[-9,5],[-30,14],[-9,5]],[[7900,4857],[6,18],[-9,5],[-26,13],[-5,3],[-3,1],[-7,2]],[[7856,4899],[6,10],[2,5],[2,3]],[[7711,4725],[-68,52]],[[7643,4777],[6,12],[6,11],[6,11],[6,12]],[[7667,4823],[68,-52]],[[7735,4771],[-6,-12],[-6,-11],[-6,-11],[-6,-12]],[[7749,4696],[-12,-25]],[[7737,4671],[-10,9],[-29,21],[-67,53]],[[7631,4754],[6,11],[6,12]],[[7711,4725],[29,-22],[9,-7]],[[7726,4651],[-38,30]],[[7688,4681],[-67,52]],[[7621,4733],[5,10],[5,11]],[[7737,4671],[-5,-10],[-6,-10]],[[3815,1681],[-46,-14],[-2,0],[-1,2],[-5,22],[-11,-3],[-4,-2],[-6,-6],[-18,-23],[-18,79]],[[3704,1736],[18,22],[6,7],[14,4],[50,16],[-3,12],[8,3],[11,4],[8,5],[7,3],[12,5],[20,5]],[[3855,1822],[6,-26],[1,-7],[3,-37],[2,-21],[-31,-10],[-8,-3],[-9,-2],[-8,-1],[0,-12],[1,-10],[3,-12]],[[3914,1792],[7,-27],[3,-16]],[[3924,1749],[-20,-6],[-23,-8],[3,-20],[2,-11],[1,-11],[3,-25],[2,-12],[4,-31],[1,-4],[3,-8],[4,-8],[10,-14],[2,-3],[2,-3],[0,-1]],[[3918,1584],[-37,1],[-3,0],[-5,1],[-10,0],[-66,1],[-49,-3],[-3,0],[-36,-5],[-16,-2]],[[3693,1577],[-2,8]],[[3691,1585],[25,5],[11,3],[9,6],[22,1],[16,2],[6,-1],[-1,12],[0,3],[0,6],[-2,8],[-2,10],[0,2],[2,2],[44,13],[-6,24]],[[3855,1822],[9,3]],[[3864,1825],[3,-2],[6,-1],[4,-1],[4,0],[13,-1],[13,3]],[[3907,1823],[3,-12],[4,-19]],[[4066,1586],[3,-5]],[[4069,1581],[-143,3],[-1,0],[-6,0],[-1,0]],[[3924,1749],[19,7],[3,0],[8,-33]],[[3954,1723],[19,-86],[3,-2],[3,0],[7,-3],[6,-3],[15,-11],[4,-30],[26,-1],[29,-1]],[[4037,1733],[-26,-7],[-2,-2],[-1,-4],[-17,-20],[-3,-4],[-5,8],[-6,7],[-8,6],[-10,4],[-3,0],[-2,2]],[[3914,1792],[61,48],[12,-22],[6,-10],[3,-13],[25,20],[16,-82]],[[4037,1733],[12,-59],[23,6]],[[4072,1680],[10,-46],[4,-25],[4,-23],[-24,0]],[[4204,1662],[15,-81],[-19,1],[3,-6]],[[4203,1576],[-95,4],[-39,1]],[[4072,1680],[26,9],[10,2]],[[4108,1691],[6,-34],[1,-2],[3,-1],[23,0],[29,-1],[16,4],[18,5]],[[4108,1691],[-6,30],[1,4],[21,17],[16,12],[26,7],[18,5],[22,6]],[[4206,1772],[3,-18],[3,-17],[3,-17],[4,-17],[3,-18],[4,-17],[-22,-6]],[[5108,1550],[-230,8],[-32,1],[-64,-2],[-93,2]],[[4689,1559],[-2,0],[-182,7],[-261,8]],[[4244,1574],[-6,0],[-35,2]],[[4206,1772],[17,5],[23,6],[-1,4],[-4,23],[-6,33],[-17,91],[147,186]],[[4365,2120],[155,-161],[188,239],[184,246],[127,167],[24,34],[10,4],[3,3],[1,-1],[-2,-4],[14,-10],[10,-8],[12,-9],[17,-12],[10,-7],[146,-147],[5,-6],[38,-39],[47,-50],[3,-3]],[[5357,2356],[-1,0],[-5,-7],[-26,-33],[-22,-26],[-1,-2],[-3,-3],[-26,-33],[-46,-57],[-32,-41],[-18,-22],[-12,-14],[-9,-12],[-6,-7],[-12,-15],[-5,-6],[-7,-8],[-22,-27],[-10,-13],[-37,-43],[-31,-37],[2,-3],[1,-2],[4,-9],[3,-9],[1,-3],[3,-14],[6,-32],[19,-101],[22,-114],[19,-105],[2,-8]],[[8142,5727],[-9,5],[-66,37]],[[8067,5769],[12,23],[12,22]],[[8091,5814],[63,-35],[12,-7]],[[8166,5772],[-12,-22],[-12,-23]],[[8067,5769],[-22,13],[-18,10],[-17,10]],[[8010,5802],[-7,3],[-2,1],[-9,5],[12,23],[12,23]],[[8016,5857],[75,-43]],[[7745,5975],[28,51],[2,4],[4,6],[15,29]],[[7794,6065],[3,-3]],[[7797,6062],[21,-16],[16,-11]],[[7834,6035],[31,-22],[15,-12],[3,-8]],[[7883,5993],[-4,-2],[-36,-21],[-11,-6],[-6,-3],[-8,-3],[-8,-2],[-5,0]],[[7805,5956],[-4,0],[-4,0],[-6,0],[-6,1],[-8,2],[-4,1],[-7,4],[-10,5],[-7,4],[-4,2]],[[7794,6065],[-4,1],[-6,-2],[-21,15],[-16,12],[-15,13]],[[7732,6104],[9,17]],[[7741,6121],[24,-17],[9,19],[6,-4],[7,5],[5,10],[-31,24],[11,21],[10,19]],[[7782,6198],[2,2],[12,22]],[[7796,6222],[53,-40],[3,-2],[3,-2]],[[7855,6178],[-6,-11],[-14,-27],[-7,-13],[-5,-9],[-16,-30],[-13,-23]],[[7741,6121],[-21,17],[-17,12],[31,57],[8,14]],[[7742,6221],[4,3],[36,-26]],[[7732,6104],[-56,42],[-16,12],[-28,21],[-16,12]],[[7616,6191],[15,29]],[[7631,6220],[12,22],[7,12],[3,8],[11,18]],[[7664,6280],[41,-31],[4,-4],[16,-11],[17,-13]],[[7660,6327],[4,-8],[9,-22]],[[7673,6297],[-9,-17]],[[7631,6220],[-17,12],[-8,6],[-11,25],[-18,14],[-14,11]],[[7563,6288],[23,14],[25,44],[15,9],[8,-19],[9,-19],[17,10]],[[7616,6191],[-21,-37],[-2,-3],[-4,-3],[-6,-4]],[[7583,6144],[-2,4],[-16,36]],[[7565,6184],[-10,23],[-10,19],[-19,34]],[[7526,6260],[-31,55]],[[7495,6315],[16,12],[16,9],[10,-17]],[[7537,6319],[10,-17],[10,-18],[6,4]],[[7645,6361],[15,-34]],[[7537,6319],[22,14],[19,35],[4,7],[1,9],[-2,9],[16,11],[22,15]],[[7619,6419],[8,-15],[18,-43]],[[7642,6444],[16,-12],[21,-52]],[[7679,6380],[-17,-9],[-17,-10]],[[7679,6380],[17,9]],[[7696,6389],[6,-6],[17,-12]],[[7719,6371],[-19,-33],[-12,-22],[-15,-19]],[[7720,6501],[17,-13]],[[7737,6488],[-1,-3],[-33,-60],[-4,-6],[-5,-5],[-7,-3],[9,-22]],[[7737,6488],[17,-13],[16,-12]],[[7770,6463],[-2,-2],[-23,-43],[-10,-18]],[[7735,6400],[-9,-18],[-7,-11]],[[7785,6364],[-17,11]],[[7768,6375],[-33,25]],[[7770,6463],[17,-12],[2,-2],[3,-2],[8,-5],[3,-2],[2,-2],[7,-3],[6,-2],[3,-2],[-1,-3],[-35,-64]],[[7862,6383],[-20,-35],[-15,-16],[-10,-18]],[[7817,6314],[-28,20],[-31,25],[10,16]],[[7785,6364],[15,-12],[10,18],[13,-11],[5,2],[17,33],[17,-11]],[[7817,6314],[-15,-28],[20,-15],[-5,-10],[-21,-39]],[[7862,6383],[10,18],[1,3],[17,-13],[17,-13],[32,-21],[6,-4],[1,-1],[6,-4],[4,-2],[3,-3]],[[7959,6343],[-3,-3],[-13,-14],[-4,-5],[-3,-4],[-4,-4],[-4,-6],[-3,-5],[-5,-6],[-1,-3],[-5,-7],[-1,-2],[-3,-5],[-2,-4],[-3,-5],[-19,-35],[-2,-4],[-3,-5],[-4,-8],[-5,-9],[-5,-10],[-3,-4],[-4,-7],[-4,-8],[-1,-2]],[[7817,6675],[38,-27]],[[7855,6648],[38,-28],[33,-23],[52,-41]],[[7978,6556],[53,-39]],[[8031,6517],[17,-14],[17,-15],[3,-3],[3,-2]],[[8071,6483],[-4,-8],[-5,-9],[-6,-8],[-4,-6],[-9,-12],[-6,-8],[-8,-9],[-17,-19],[-12,-13],[-23,-27],[-3,-3],[-3,-3],[-2,-3],[-2,-3],[-8,-9]],[[7978,6556],[3,8]],[[7981,6564],[13,24]],[[7994,6588],[54,-40],[-17,-31]],[[7981,6564],[-20,14],[-14,10],[-18,14],[11,24],[10,18]],[[7950,6644],[34,-24],[9,17],[1,2]],[[7994,6639],[20,-13]],[[8014,6626],[-2,-3],[-18,-35]],[[7855,6648],[21,22],[0,5],[-4,1],[9,17]],[[7881,6693],[42,-31],[27,-18]],[[7881,6693],[4,8],[3,11],[1,3]],[[7889,6715],[4,10],[4,7]],[[7897,6732],[17,-11],[16,-12],[16,-11],[16,-11]],[[7962,6687],[-9,-18],[41,-30]],[[7962,6687],[13,23],[6,12]],[[7981,6722],[44,-31],[17,-12]],[[8042,6679],[-19,-36],[-9,-17]],[[7897,6732],[12,24],[8,15]],[[7917,6771],[13,26]],[[7930,6797],[16,-12],[15,-11],[15,-10],[16,-12]],[[7992,6752],[-11,-30]],[[7930,6797],[10,18],[-37,28]],[[7903,6843],[10,18],[38,-27],[15,-12],[29,-20],[-10,-19],[17,-11],[-10,-20]],[[7917,6771],[-17,12],[-45,31],[-2,1],[-2,1],[-1,1],[1,1],[1,1],[2,0],[9,17]],[[7863,6836],[27,-19],[13,26]],[[7889,6715],[-25,18],[-24,18],[-11,8],[-6,4],[-29,20]],[[7794,6783],[50,49],[8,11]],[[7852,6843],[11,-7]],[[7742,6726],[6,10],[1,3],[11,12],[31,29],[3,3]],[[7653,6788],[-162,125],[-8,5],[-7,6],[-4,4],[-18,7]],[[7454,6935],[34,20],[-13,22],[-4,7]],[[7471,6984],[16,3],[12,3],[6,3],[10,4],[7,4],[7,5],[11,8],[3,2],[7,6],[3,2],[5,4],[17,15],[14,13],[13,14],[9,9],[3,4],[5,5],[7,8],[19,22]],[[7645,7118],[2,-2],[24,-17],[9,-12],[4,-13],[2,-10],[5,-8],[6,-7],[11,-8],[18,-11],[37,-20],[57,-32],[9,-6],[19,-12],[1,-1],[5,-5],[2,-3],[4,-9],[1,-5],[2,-7],[-27,-52],[25,-18],[-9,-17]],[[7509,6479],[3,29],[11,40]],[[7523,6548],[7,19],[7,24]],[[7537,6591],[6,22],[17,-13]],[[7529,6493],[-2,-17],[-18,3]],[[7490,6478],[3,19],[-56,43],[-1,4],[10,13],[12,16],[12,15]],[[7470,6588],[53,-40]],[[7509,6479],[-10,-1],[-9,0]],[[7490,6478],[-14,-5]],[[7476,6473],[-6,18],[-59,43],[0,4],[9,17],[35,44]],[[7455,6599],[15,-11]],[[7428,6417],[-17,12]],[[7411,6429],[11,17],[12,19],[8,11],[1,1],[1,7],[-44,33]],[[7400,6517],[-19,14],[9,15],[14,18]],[[7404,6564],[17,24],[19,23],[15,-12]],[[7476,6473],[-11,-6],[-7,-7],[-9,-10],[-14,-22],[-7,-11]],[[7411,6429],[-38,27],[7,21],[9,21],[11,19]],[[7428,6417],[-12,-18]],[[7416,6399],[-67,50]],[[7349,6449],[-12,9],[-9,8],[-3,2],[-2,3],[-6,7],[-4,5],[-5,6],[-6,9],[-5,8],[-5,11],[-7,16]],[[7285,6533],[9,15],[43,68],[34,-26],[33,-26]],[[7335,6358],[-16,12]],[[7319,6370],[1,2],[-16,12],[-43,31],[-16,12],[-6,-13]],[[7239,6414],[-57,41],[-23,16]],[[7159,6471],[55,111],[2,4],[13,27],[2,4]],[[7231,6617],[1,-2],[9,-13],[12,-15],[6,-7],[5,-8],[5,-7],[7,-12],[3,-8],[2,-4],[4,-8]],[[7349,6449],[-1,-4],[-8,-21],[35,-26],[0,-6],[-9,-1],[-8,-4],[-7,-4],[-6,-8],[-10,-17]],[[7294,6308],[-17,12],[-39,30],[-17,13]],[[7221,6363],[18,51]],[[7319,6370],[-7,-21],[-9,-24],[-9,-17]],[[7276,6266],[-72,53],[17,44]],[[7294,6308],[-6,-10],[-4,-11],[-3,-11],[-5,-10]],[[7300,6230],[-27,-49],[-15,12],[-16,11]],[[7242,6204],[1,3],[11,18],[10,19],[5,9]],[[7269,6253],[16,-12],[15,-11]],[[7294,6142],[-44,32]],[[7250,6174],[-17,13]],[[7233,6187],[9,17]],[[7300,6230],[14,-11],[-25,-48],[15,-12],[-10,-17]],[[7309,6130],[-15,12]],[[7300,6230],[12,23],[1,3],[2,0],[10,-8],[-1,-5],[3,-2],[21,-15],[4,-3],[5,-10]],[[7357,6213],[-6,-7],[-6,-9],[-27,-50],[-9,-17]],[[7293,6088],[-57,43],[-1,2],[-1,2],[0,2],[6,16],[4,10],[3,6],[1,3],[2,2]],[[7309,6130],[-1,-3],[-8,-18],[-7,-21]],[[7293,6088],[-5,-19],[-3,-16]],[[7285,6053],[-6,2],[-12,8],[-12,9],[-15,12],[-15,10],[-2,-2],[-15,-28]],[[7208,6064],[-23,17]],[[7185,6081],[7,11],[4,7],[9,18],[1,1],[7,17],[12,39],[6,10],[2,3]],[[7285,6053],[-2,-27],[-1,-25]],[[7282,6001],[-18,0]],[[7264,6001],[0,22],[-25,18],[-15,11],[-16,12]],[[7264,6001],[-18,-1]],[[7246,6000],[-1,11],[-72,54]],[[7173,6065],[12,16]],[[7159,6046],[7,12],[7,7]],[[7246,6000],[-18,1]],[[7228,6001],[-16,6],[-7,6],[-46,33]],[[7186,5977],[-47,34],[10,18],[10,17]],[[7228,6001],[0,-12],[0,-5],[-5,-9],[-27,19],[-10,-17]],[[7228,5945],[-8,-19],[-14,8],[-6,-12]],[[7200,5922],[-15,11]],[[7185,5933],[-16,12]],[[7169,5945],[6,12],[11,20]],[[7246,6000],[0,-14],[-1,-9],[-17,-32]],[[7185,5933],[-7,-15],[-14,10]],[[7164,5928],[-10,7],[-8,6],[-16,12],[-16,12]],[[7114,5965],[-14,10],[-13,9],[8,15]],[[7095,5999],[13,-9],[14,-11],[17,-12],[15,-11],[15,-11]],[[7134,5863],[-14,10],[-13,10]],[[7107,5883],[25,45],[-14,10],[-13,10]],[[7105,5948],[4,8],[5,9]],[[7164,5928],[1,-6],[-7,-14]],[[7158,5908],[-5,-8],[-19,-37]],[[7107,5883],[-13,9],[-13,10]],[[7081,5902],[24,46]],[[7081,5902],[-14,10],[-15,11],[-12,9],[-13,10]],[[7027,5942],[4,8],[8,13],[13,-9],[13,24]],[[7065,5978],[13,-10],[14,-10],[13,-10]],[[7027,5942],[-15,10]],[[7012,5952],[5,9],[20,37]],[[7037,5998],[8,-6],[6,-5],[7,-4],[7,-5]],[[7056,6032],[39,-33]],[[6510,2056],[-62,41]],[[6448,2097],[8,19],[4,10],[5,10],[13,28],[4,7],[10,10]],[[6492,2181],[59,-38]],[[6551,2143],[-11,-23]],[[6540,2120],[-11,-23],[-10,-22],[-9,-19]],[[6613,2074],[-73,46]],[[6551,2143],[11,23]],[[6562,2166],[63,-41],[10,-6]],[[6635,2119],[-11,-23],[-11,-22]],[[6492,2181],[7,7]],[[6499,2188],[11,11],[6,6],[3,5],[5,12]],[[6524,2222],[49,-31]],[[6573,2191],[-11,-25]],[[7962,6172],[-19,-42]],[[7943,6130],[-8,4],[-6,2],[-6,1],[-21,-2]],[[7902,6135],[-1,21],[1,5],[3,7],[10,-7],[10,0],[17,31],[8,15]],[[7950,6207],[19,-15]],[[7969,6192],[-7,-20]],[[7911,6055],[-14,11]],[[7897,6066],[16,40],[-15,11],[-15,11],[5,9]],[[7888,6137],[6,-2],[8,0]],[[7943,6130],[-15,-36],[-17,-39]],[[7897,6066],[-19,12],[-14,11],[-10,-17],[-8,-15],[-12,-22]],[[7797,6062],[2,2],[54,100],[27,-21],[8,-6]],[[7911,6055],[-4,-15],[-1,-14],[2,-24]],[[7908,6002],[-4,-1],[-8,-3],[-10,-3],[-3,-2]],[[8016,5857],[7,19],[8,19],[10,-6],[61,-34],[4,-3]],[[8106,5852],[-7,-19],[-8,-19]],[[8016,5857],[-29,17]],[[7987,5874],[12,16],[12,16],[31,54]],[[8042,5960],[13,-7]],[[8055,5953],[21,-11],[17,-10],[10,-5],[7,-4]],[[8110,5923],[17,-10]],[[8127,5913],[-6,-18],[-6,-19],[-2,-4],[-7,-20]],[[8055,5953],[14,35],[2,3]],[[8071,5991],[21,-12],[17,-9],[15,-9]],[[8124,5961],[-1,-3],[-6,-16],[-7,-19]],[[8203,5870],[-46,26],[-30,17]],[[8124,5961],[17,-8]],[[8141,5953],[13,-7],[15,-9]],[[8169,5937],[48,-26]],[[8217,5911],[0,-2],[-1,-2],[-13,-37]],[[8110,6073],[5,-3],[17,-6],[7,-3],[5,-5],[2,-8],[0,-8],[-3,-8],[-23,-42],[31,-18]],[[8151,5972],[-9,-16],[-1,-3]],[[8071,5991],[10,20],[16,29]],[[8097,6040],[13,33]],[[8151,5972],[10,19],[-11,8],[-1,5],[13,24],[4,2],[11,-8],[6,9],[7,13]],[[8190,6044],[13,11],[7,-19]],[[8210,6036],[12,-20],[-56,-71],[3,-8]],[[8110,6073],[9,19],[6,10],[8,13],[5,11],[6,16]],[[8144,6142],[14,-21]],[[8158,6121],[-3,-7],[-6,-17],[4,-3],[9,-14],[10,-15],[13,-19],[5,-2]],[[8097,6040],[-20,12]],[[8077,6052],[-17,10],[-34,20]],[[8026,6082],[10,18],[2,4],[17,31]],[[8055,6135],[10,17],[10,15],[15,17]],[[8090,6184],[15,15],[21,-30]],[[8126,6169],[18,-27]],[[8239,6072],[-29,-36]],[[8158,6121],[14,-20],[17,10],[17,9],[22,10],[-2,13],[-9,6],[-8,7],[-14,12],[-4,7]],[[8191,6175],[-9,25],[-19,8],[6,29]],[[8169,6237],[3,-1],[23,-61],[39,-33],[1,-45],[2,-14],[0,-6],[2,-5]],[[8158,6121],[8,22],[11,36],[14,-4]],[[5974,986],[0,-2]],[[5974,984],[-3,1],[-30,17],[-33,16],[-19,4],[-18,3],[-1,0],[-9,2],[-12,-10],[-11,-20],[-9,5],[-1,2],[1,5],[1,3],[7,10],[0,1],[-1,2],[-4,7],[-4,0],[-5,1],[-1,1],[-1,0],[-3,0],[-2,0],[-4,-15],[-3,2],[-7,4],[3,12],[-5,1],[-1,8],[-6,1],[0,2],[-4,1],[0,-4],[-1,0],[-1,0],[0,-7],[-3,0],[-1,7],[-5,0],[0,-4],[-3,-1],[0,-2],[-1,0],[-6,-1],[0,-3],[-3,0],[0,-2],[-31,-12],[-14,0],[-10,0],[0,-3],[0,-5],[0,-10],[8,-2],[0,-3],[-10,2],[-2,2],[0,8],[0,11],[-3,0],[-2,-2],[-11,-1]],[[5690,1018],[6,1],[2,19],[1,3]],[[5699,1041],[8,15],[5,18],[1,2],[7,10],[13,5],[21,7],[6,1],[8,0],[8,1],[18,2]],[[5794,1102],[15,3],[4,-1],[1,2],[46,2],[31,1],[13,1],[18,4]],[[5922,1114],[14,4],[21,7],[14,4],[1,0],[3,-4]],[[5975,1125],[-1,-36]],[[5974,1089],[0,-11]],[[5974,1078],[-10,0],[-9,1],[-18,3],[-19,3],[-17,2],[-3,-31],[-5,-32],[16,-4],[18,-7],[17,-10],[12,-8],[9,-5],[9,-4]],[[5977,881],[0,-10],[0,-16],[-2,-6]],[[5975,849],[-25,5],[-43,6],[-1,1],[-56,5],[-52,3],[-16,3],[-7,3],[-9,4],[-4,2],[-3,5],[-2,4],[0,6],[-1,2],[-67,27],[1,1],[1,3],[1,-1],[69,-28],[12,-5],[24,-4],[15,1],[14,3],[25,3],[13,3],[25,2],[20,-2],[30,-8],[16,-6],[22,-6]],[[5975,979],[1,-4],[0,-7]],[[5976,968],[-17,7],[-15,8],[-21,9],[-13,5],[-37,8],[-5,0],[-18,-4],[-1,5],[6,6],[8,6],[15,2],[6,0],[23,-8],[11,-4],[24,-12],[14,-10],[19,-7]],[[5978,906],[-2,1],[-6,8],[-15,14],[-7,2],[-27,6],[-22,2],[-4,0],[-11,-3],[-11,-1],[-11,0],[-4,1],[-2,2],[0,5],[0,7],[17,0],[4,2],[2,3],[1,0],[1,-3],[0,-3],[7,-2],[52,-7],[14,-3],[24,-8]],[[5978,929],[0,-6],[0,-17]],[[5794,1102],[-1,15]],[[5793,1117],[14,43],[4,12],[4,13]],[[5815,1185],[18,0],[27,1],[16,1],[-1,65]],[[5875,1252],[4,1],[12,0],[6,0],[22,1],[22,0]],[[5941,1254],[1,-66],[-21,-1],[1,-65],[0,-8]],[[5941,1254],[22,2],[2,-67],[0,-57],[10,3],[0,-5],[0,-5]],[[5815,1185],[-2,66]],[[5813,1251],[19,1],[43,0]],[[5813,1251],[-1,66]],[[5812,1317],[62,2],[22,0],[15,1],[7,0]],[[5918,1320],[8,0],[15,1]],[[5941,1321],[0,-67]],[[5813,1251],[-18,0],[-17,0],[0,-26],[-16,-2],[-3,27],[0,21],[-7,2],[0,24],[-11,0],[-43,1],[1,20]],[[5699,1318],[42,0],[32,-1]],[[5773,1317],[21,0],[18,0]],[[5773,1317],[0,26]],[[5773,1343],[-1,34]],[[5772,1377],[0,19],[0,19]],[[5772,1415],[20,0],[19,0]],[[5811,1415],[1,-98]],[[5773,1317],[-6,9],[-59,1],[-15,17]],[[5693,1344],[19,0]],[[5712,1344],[61,-1]],[[5712,1344],[-3,34]],[[5709,1378],[21,0],[7,2],[11,-1],[7,-2],[17,0]],[[5709,1378],[-2,19],[-1,20]],[[5706,1417],[17,0],[6,-1],[43,-1]],[[5693,1344],[-2,-4],[2,-22]],[[5693,1318],[-21,0]],[[5672,1318],[-5,64],[-1,18],[-1,11],[-1,6]],[[5664,1417],[1,5],[1,-3],[3,-1],[2,-1],[35,0]],[[5699,1318],[-6,0]],[[5810,1463],[1,-48]],[[5664,1417],[-1,20],[0,6],[0,8],[0,4],[0,27],[1,25],[0,3],[0,5],[0,4]],[[5664,1519],[11,0],[30,-2],[6,-1],[10,-1],[14,-1],[43,-5],[16,-2],[6,-1],[11,0],[0,-4],[0,-1],[-1,-5],[0,-33]],[[5683,1460],[-3,-20],[37,-1],[6,-1],[6,0],[5,0],[39,0],[0,19],[0,7],[0,20],[-87,2],[-2,-20],[-1,-6]],[[7012,5952],[-13,11],[-14,9]],[[6972,5772],[-49,36]],[[6923,5808],[-8,5],[-8,6],[-46,-86],[7,-6],[8,-5]],[[6876,5722],[49,-36]],[[6925,5686],[-4,-9],[-6,-11]],[[6915,5666],[-50,36]],[[6865,5702],[-6,5],[-5,3],[-4,5],[-4,4],[-7,10],[-3,4],[-5,5],[-4,3],[-4,4],[-11,7],[-15,10]],[[6797,5762],[33,60],[17,34],[1,3],[8,15],[8,16],[5,-3],[1,-3],[4,8],[11,24],[14,20],[9,14],[3,4],[2,4],[31,40],[2,3]],[[7027,5942],[-2,-4],[2,-5],[22,-17],[-20,-35],[-1,-2],[0,-1],[-56,-106]],[[6953,5737],[-49,36]],[[6904,5773],[9,17],[10,18]],[[6972,5772],[-9,-17],[-5,-9],[-5,-9]],[[6904,5773],[-10,-18],[-9,-16],[-9,-17]],[[6953,5737],[-5,-9],[-4,-8]],[[6944,5720],[-5,-9],[-4,-9],[-10,-16]],[[6953,5737],[60,-44],[-4,-9],[-5,-9]],[[7004,5675],[-60,45]],[[6995,5659],[-9,-17],[-61,44]],[[7004,5675],[-9,-16]],[[6995,5659],[36,-27],[2,-1],[8,-6],[19,-13],[1,-1],[6,-4]],[[7067,5607],[-3,-6],[-5,-8],[-2,-4],[-2,-3],[-9,-16]],[[7046,5570],[-12,9]],[[7034,5579],[-59,43]],[[6975,5622],[-60,44]],[[7004,5675],[36,-25],[30,-21],[7,-5]],[[7077,5624],[-1,-1],[-4,-8]],[[7072,5615],[-4,-7],[-1,-1]],[[7092,5536],[-46,34]],[[7072,5615],[45,-32]],[[7117,5583],[-4,-8],[-5,-7]],[[7108,5568],[-4,-7],[-4,-8]],[[7100,5553],[-7,-15],[-1,-2]],[[7072,5495],[-60,44]],[[7012,5539],[5,9],[5,9],[5,9],[5,10],[2,3]],[[7092,5536],[-1,-3],[0,-3],[-4,-8],[-5,-9],[-5,-9],[-5,-9]],[[7059,5470],[-20,15],[-4,-8],[-40,30]],[[6995,5507],[4,7],[4,8],[4,8],[5,9]],[[7072,5495],[-5,-9],[-8,-16]],[[7092,5536],[61,-44]],[[7153,5492],[-2,-3],[-5,-10],[-5,-10],[-5,-8],[-5,-9],[-13,-25],[-59,43]],[[7246,5424],[-33,24]],[[7213,5448],[-49,36],[-11,8]],[[7100,5553],[73,-53]],[[7173,5500],[63,-46],[18,-13]],[[7254,5441],[-4,-8],[-4,-9]],[[7108,5568],[73,-53]],[[7181,5515],[-4,-8],[-4,-7]],[[7117,5583],[73,-53]],[[7190,5530],[-5,-8],[-4,-7]],[[7117,5583],[4,7],[4,8],[72,-53],[-4,-8],[-3,-7]],[[7394,5476],[-9,-18],[-9,-17],[-12,-22]],[[7364,5419],[-18,13],[-6,5],[-5,3],[-2,0],[-3,4],[-8,9],[-6,5],[-5,5],[-32,23],[-7,-13],[-1,-2]],[[7271,5471],[-26,20],[-4,-8],[-4,-8],[-56,40]],[[7077,5624],[3,6],[2,4],[81,145],[2,3],[20,39],[2,3]],[[7187,5824],[55,-39]],[[7242,5785],[22,-17],[45,-33],[54,-39]],[[7363,5696],[54,-40],[28,-21],[26,-18]],[[7471,5617],[-2,-3],[-8,-14],[-2,-4]],[[7459,5596],[-9,-17],[-9,-17],[-9,-17]],[[7432,5545],[-9,-17],[-9,-17],[-12,-21],[-8,-14]],[[7271,5471],[-4,-8],[-5,-8],[-4,-7],[-4,-7]],[[7364,5419],[-7,-12]],[[7357,5407],[-10,-18],[-8,-16],[-7,-12]],[[7332,5361],[-25,18],[-5,5],[-30,21]],[[7272,5405],[-26,19]],[[7250,5365],[-59,43]],[[7191,5408],[5,9],[5,9],[5,9],[5,10],[2,3]],[[7272,5405],[-2,-3],[-10,-19],[-5,-9],[-5,-9]],[[7312,5324],[-8,5],[-54,36]],[[7332,5361],[-1,-3],[-11,-19],[-2,-3],[-6,-12]],[[7287,5277],[-12,-21]],[[7275,5256],[-86,63],[18,33],[-33,25],[3,7],[5,7],[4,8],[5,9]],[[7312,5324],[-2,-5],[-3,-5],[-9,-16],[-11,-21]],[[7400,5318],[6,-9],[2,-3],[2,-3],[3,-2],[10,-7],[5,-4],[20,-14]],[[7448,5276],[-2,-3],[-13,-22],[-8,7],[-42,30],[-1,4],[-5,-10],[-5,-9]],[[7372,5273],[-12,-20],[-14,-20]],[[7346,5233],[-3,2],[-2,2],[-3,2],[-2,1],[-1,1],[-48,36]],[[7332,5361],[28,-21],[4,-2],[4,-3],[4,-1],[9,-1],[3,-2],[5,-2],[2,-2],[2,-2],[1,0],[4,-4],[2,-3]],[[7357,5407],[52,-38],[1,-1],[3,-2],[2,-2],[2,-1],[3,-2]],[[7420,5361],[-10,-17],[-2,-5],[-5,-11],[0,-3],[-3,-7]],[[7491,5278],[-13,-24]],[[7478,5254],[-15,11],[-15,11]],[[7420,5361],[55,-40]],[[7475,5321],[-1,-14],[6,-11],[11,-18]],[[7394,5476],[28,-22],[24,-16],[3,-3],[3,-2],[4,-3]],[[7456,5430],[-9,-18],[-9,-17],[56,-41]],[[7494,5354],[-15,-13],[-4,-20]],[[7456,5430],[30,-22],[8,0],[6,-29]],[[7500,5379],[3,-17],[-9,-8]],[[6950,1933],[-103,-90],[-127,-106]],[[6720,1737],[-8,5],[29,47],[-22,15]],[[6719,1804],[5,11],[19,27],[35,50]],[[6778,1892],[2,3],[9,10],[4,5],[10,9],[12,11],[4,3]],[[6819,1933],[70,-44],[17,14]],[[8350,6767],[0,-4],[-2,-21],[-1,-5]],[[8347,6737],[0,-5],[-2,-22]],[[8345,6710],[-3,0],[-17,1],[2,28]],[[8327,6739],[1,20],[-16,1],[-11,2],[-13,5],[-16,12]],[[8327,6739],[-32,3],[-6,0],[-5,-2],[3,-7],[5,-8],[3,-3],[12,-3],[-2,-21],[-2,-7],[-6,-6]],[[8345,6710],[0,-4],[-1,-8],[-1,-7],[-1,-8],[-1,-9]],[[8341,6674],[-1,-2],[-1,-7]],[[8531,6462],[-10,-17],[-2,-5],[-10,-18]],[[8441,6440],[22,43],[-17,11],[-24,-45]],[[8422,6449],[-3,1],[-12,9],[-3,3],[-3,4],[0,3],[-1,5],[0,4],[2,6],[1,7],[0,6],[-1,7],[-2,3],[-3,2],[-34,25],[-16,-31],[-3,-6],[-2,-4],[-4,-8],[-1,-10],[0,-9],[1,-15],[-2,-8],[-4,-9]],[[8332,6434],[-7,3],[-40,17],[-26,14],[-2,-3],[-15,-39],[-1,-1],[-3,-5],[-4,-7]],[[8234,6413],[-5,-1],[-99,53],[-5,-14]],[[8125,6451],[-18,9],[-24,15],[-4,2],[-4,4],[-4,2]],[[8071,6483],[4,6],[34,65],[1,3]],[[8110,6557],[2,3],[13,26],[12,23],[3,6],[2,3],[4,8],[4,6],[8,12],[6,7],[9,12],[10,10],[6,8],[7,11]],[[8196,6692],[1,0],[4,8],[6,9],[4,8],[4,9],[1,3]],[[8413,6563],[4,-3],[4,-2],[3,-3],[4,-3],[18,-13],[34,-26],[42,-31],[4,-3],[8,-6],[3,-1]],[[6526,1502],[-10,-3],[-62,2],[-43,2],[-3,-3],[-3,-1],[4,-9],[2,-3],[0,-4]],[[6411,1483],[0,-23],[0,-28]],[[6411,1432],[0,-15],[0,-20],[50,-33]],[[6461,1364],[-4,-10]],[[6457,1354],[-35,21],[-6,2],[-12,6],[-1,52],[-3,1],[-3,2],[-2,1],[-3,1],[-101,53],[-2,1],[-6,4],[-5,4],[-27,18],[-15,9],[-42,44],[0,58],[0,7],[-60,19],[-23,7]],[[6111,1664],[-8,3],[-6,1],[-4,1],[-1,1],[-6,2]],[[6086,1672],[0,1],[1,2],[0,2],[2,6],[0,1],[4,7],[27,56],[1,8],[2,4],[4,5],[0,1],[5,7],[4,5],[7,7],[9,8],[6,14]],[[6158,1806],[191,-124],[41,-24],[11,-6],[2,-2],[3,-2],[23,-14],[6,-3],[25,-17],[13,-7],[1,-1],[82,-50]],[[6556,1556],[88,-41]],[[6644,1515],[-22,-5],[-4,-1],[-30,-7],[-4,-1],[-11,-1],[-7,0],[-5,1],[-2,1],[-14,9],[-11,7],[-8,-16]],[[8422,6449],[-26,-50]],[[8396,6399],[-3,2],[-4,2],[-5,2],[-5,3],[-28,16],[-5,2],[-4,3],[-5,3],[-5,2]],[[8234,6413],[-2,-3],[-3,-6],[-2,-6],[-9,-20]],[[8218,6378],[-7,-20]],[[8211,6358],[-9,-21],[-7,-20]],[[8195,6317],[-21,-51],[-4,-24]],[[8170,6242],[-24,97],[-9,51],[-12,61]],[[8182,6349],[3,-2],[17,39],[9,24],[-17,9],[-34,19],[-3,-10],[0,-2],[-1,-6],[2,-5],[13,-37],[8,-23],[3,-6]],[[8170,6242],[-1,-2]],[[8169,6240],[0,-3]],[[8126,6169],[7,7],[4,13],[-2,5],[-39,56],[-2,3],[0,3],[1,10],[1,3],[-33,12],[-3,1]],[[8060,6282],[-3,1],[-34,13],[-2,1]],[[8021,6297],[-14,10],[-4,3],[-15,12],[-18,13],[-9,7],[-2,1]],[[8090,6184],[-13,17],[-12,17],[-13,19]],[[8052,6237],[16,16],[-8,15],[-1,3],[0,2],[0,6],[1,3]],[[8055,6135],[-19,8],[-19,8],[-19,6]],[[7998,6157],[1,6],[8,13],[10,16],[10,15],[10,13],[15,17]],[[7998,6157],[-6,2],[-10,3],[-10,5],[-10,5]],[[7969,6192],[16,-8],[4,-1],[2,2],[7,15],[10,13],[15,21],[9,12],[8,8],[12,-17]],[[7969,6192],[22,50],[9,16]],[[8000,6258],[20,36],[1,3]],[[7950,6207],[15,25],[-18,12],[20,38],[17,-13],[16,-11]],[[7514,3024],[-1,0],[-7,-1],[-1,-4],[-7,-10],[3,-5],[1,-4],[-4,-9],[-3,-4],[-14,-14],[-13,-10],[-13,-12],[-26,-22],[-4,-4],[-56,-28],[-21,-16],[-29,-19],[-14,-5],[-14,-6],[-12,-2],[-16,0]],[[7263,2849],[-25,19],[-3,16],[4,12],[12,20],[-30,23],[10,20],[2,5],[-20,16]],[[7213,2980],[8,23],[5,10],[18,-12],[50,-33],[18,39],[14,23],[12,17]],[[7338,3047],[7,-7],[2,-1],[3,-2]],[[7350,3037],[10,-6],[19,23],[1,5],[6,31],[2,3]],[[7388,3093],[4,-2]],[[7392,3091],[5,-2],[6,-1],[15,-1],[2,0],[25,-2],[8,0],[6,0],[5,2]],[[7464,3087],[1,-7],[12,-14],[0,-1],[27,-11],[-3,-13],[7,-12],[6,-5]],[[7513,2895],[-9,5],[-6,-8],[-17,-3],[-20,-1],[-8,-3],[-37,-17],[-30,-15]],[[7386,2853],[-21,-14],[-20,-15],[-14,-8],[-11,-9],[-16,-18]],[[7304,2789],[-15,-15],[-17,-14]],[[7272,2760],[8,27],[4,16],[4,10],[7,11],[-25,21],[-7,4]],[[7514,3024],[9,-6],[10,-7],[20,-13],[2,-2],[24,-17]],[[7579,2979],[-12,-22],[-29,-51],[-4,-4],[-6,-3],[-15,-4]],[[7492,2773],[-5,7],[-5,4],[-5,1],[-5,4],[-4,7],[-8,5],[-4,0],[-7,2],[-8,11]],[[7441,2814],[-55,39]],[[7513,2895],[15,-11],[21,-16]],[[7549,2868],[-20,-37],[-17,-31],[-6,-14],[-14,-13]],[[7373,2736],[-69,53]],[[7441,2814],[-19,-17],[-18,-17],[-18,-24],[-13,-20]],[[7492,2773],[-5,-5],[37,-29]],[[7524,2739],[-28,-13],[-9,-4],[-30,-13]],[[7377,2638],[-41,31]],[[7336,2669],[12,22],[13,23],[12,22]],[[6573,2191],[63,-41],[10,-6]],[[6646,2144],[-11,-25]],[[6573,2191],[11,23]],[[6584,2214],[73,-47]],[[6584,2214],[10,22]],[[6594,2236],[73,-47]],[[6594,2236],[9,19]],[[6584,2214],[-54,34]],[[6530,2248],[3,6],[3,7],[0,1],[2,2],[4,6],[12,17]],[[6524,2222],[3,14]],[[6527,2236],[3,12]],[[6527,2236],[-2,1],[-2,1],[-28,19],[6,14],[-16,11]],[[6485,2282],[14,30],[9,18]],[[6508,2330],[29,-21],[19,-15],[2,-2]],[[6499,2188],[-2,1],[-43,28],[8,17]],[[6462,2234],[9,19],[14,29]],[[6527,2367],[-11,-21],[-2,-3],[-6,-13]],[[6462,2234],[-46,29],[0,24],[0,38],[0,24],[2,0],[1,1],[4,8],[1,2],[13,22],[2,-1],[-2,3],[0,3],[0,2],[1,2],[2,1],[1,1],[1,0],[7,-2],[-4,3],[2,3]],[[6447,2397],[0,2],[3,6],[2,3],[5,9]],[[7999,6097],[-8,-18]],[[7991,6079],[-19,10],[-18,10],[-22,-47],[-3,-11],[-2,-10],[22,2],[29,-2]],[[7978,6031],[-1,-24]],[[7977,6007],[-3,0],[-26,0],[-21,-1],[-15,-3],[-4,-1]],[[7943,6130],[21,-12],[16,-10],[19,-11]],[[7991,6079],[-8,-13]],[[7983,6066],[-4,-11],[-1,-24]],[[8026,6082],[-10,5],[-17,10]],[[8077,6052],[-18,-32],[-23,5],[-20,15],[-33,26]],[[8071,5991],[-14,6],[-9,4],[-9,2],[-14,2],[-45,2],[-3,0]],[[8042,5960],[-2,3],[-2,1],[-3,3],[-10,7],[-7,6],[-19,1],[-39,2]],[[7960,5983],[-17,0],[-13,-2],[-19,-3]],[[7911,5978],[-3,20],[0,4]],[[7987,5874],[-9,6]],[[7978,5880],[-14,13]],[[7964,5893],[13,16],[12,16],[7,8],[4,9],[-40,29],[0,12]],[[5871,2067],[-21,-122],[-1,-3]],[[5849,1942],[-3,-9],[-7,-22],[-8,-23],[-8,-22],[-20,-45],[0,-1],[-3,-8],[-19,-57],[14,-8],[2,-1],[1,0],[13,-6],[30,-14],[26,-12],[3,-2],[6,-2],[4,-2],[2,-1],[81,-39],[60,4]],[[6023,1672],[3,0],[22,0],[2,0],[10,0],[5,0],[8,0],[3,0],[3,0],[5,0],[2,0]],[[6111,1664],[0,-31],[0,-5],[0,-7],[-2,-98],[0,-14],[0,-2],[0,-1]],[[6109,1506],[-121,5],[-1,-8],[0,-4],[-1,-4],[-1,-13],[0,-30]],[[5985,1452],[-24,1]],[[5961,1453],[0,26],[-90,2],[0,-26]],[[5871,1455],[-13,1],[-10,-1],[-11,-1],[-9,4],[-6,6],[-12,-1]],[[5664,1519],[-4,0],[-2,0],[-71,3],[-2,0],[-2,0],[-72,2]],[[5511,1524],[0,2],[0,3],[0,9],[0,3],[-6,11],[-61,-7],[-7,0],[-5,1],[-22,-1],[-14,-2],[-27,-1],[-136,5],[-52,0],[-47,2],[-26,1]],[[5357,2356],[2,-2],[2,-2],[46,-49],[15,-12],[7,-5],[12,-9],[8,-7],[33,-35],[57,-64],[51,-59],[2,-3],[8,-9],[13,-14],[31,-37],[6,-6],[1,3],[2,17],[4,40],[7,50],[1,8],[0,7],[1,8],[6,49],[1,9],[1,7],[1,6],[1,5],[0,7],[1,3],[0,-1],[2,-1],[4,-4],[1,-2],[6,-5],[1,-1],[1,-1],[1,-1],[2,-1],[2,-3],[1,0],[2,-2],[2,-2],[1,-1],[2,-2],[2,-1],[2,-2],[0,-1],[1,-1],[1,0],[1,-2],[1,-1],[1,0],[3,-4],[6,-7],[2,-1],[0,-1],[1,0],[1,-1],[1,-1],[1,-1],[1,-1],[2,-1],[1,-1],[1,-2],[2,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-2],[2,-1],[1,-2],[1,-1],[1,-1],[2,-1],[1,-1],[1,-1],[1,-1],[1,-2],[1,-1],[2,-2],[1,-1],[1,-1],[1,-1],[1,-2],[1,-1],[7,-6],[3,-4],[2,-1],[1,-2],[2,-1],[1,-2],[1,-1],[2,-2],[1,-1],[1,-1],[2,-1],[0,-1],[7,-6],[9,-8],[24,-25],[1,-1],[3,-3],[16,-16],[0,-1],[4,-4],[2,-2],[1,-1],[3,-3],[1,-1],[1,-2],[2,-1],[3,-4],[7,-7],[1,-1]],[[5981,1916],[-16,-34],[-6,-7],[-24,15],[-13,10],[-2,2],[-1,1],[-2,1],[-2,2],[-1,1],[-1,1],[-1,0],[-1,1],[-3,2],[-1,1],[-1,1],[-1,0],[-1,1],[-1,1],[-1,1],[-2,1],[0,1],[-1,1],[-1,1],[-1,1],[-1,0],[-3,2],[-2,1],[-1,1],[-2,2],[-2,0],[-1,1],[-2,1],[0,1],[-2,1],[-1,0],[-1,2],[-1,1],[-2,1],[-1,1],[-1,0],[0,1],[-4,2],[-18,10],[-3,-7]],[[5871,2067],[13,73],[1,23],[2,9],[5,26],[2,9],[0,2],[40,237]],[[5934,2446],[10,-4],[12,-6],[17,-7],[11,-7],[8,-4],[4,-2],[16,-9],[7,-3],[13,-8],[4,-4],[108,-49]],[[6144,2343],[-20,-43],[-18,-36],[-6,-13],[-1,-5],[-5,-34]],[[6094,2212],[-6,-35],[0,-9]],[[6088,2168],[2,-34],[-1,-7],[-2,-4],[-24,-29],[-4,-10]],[[6059,2084],[-8,-18],[-8,-18],[-9,-18],[-8,-18],[-9,-19]],[[6017,1993],[-10,-20],[-9,-21],[-9,-18],[-33,21],[-4,-20],[29,-19]],[[6235,2626],[-9,-16],[-9,-21]],[[6217,2589],[-16,12],[-16,11],[-17,-33]],[[6168,2579],[-16,12],[17,32],[-17,13]],[[6152,2636],[8,17],[1,3],[-1,1],[-35,25],[-16,-21],[-6,-8],[-8,-5],[-6,-6],[-10,-18],[-3,-5],[-1,-8],[-9,-50],[51,-31]],[[6117,2530],[-10,-24]],[[6107,2506],[-4,-10],[-2,-11],[-15,-34],[17,-11],[18,-11],[18,-11],[26,-17]],[[6165,2401],[-4,-18],[-6,-17]],[[6155,2366],[-11,-23]],[[5934,2446],[25,152],[6,37]],[[5965,2635],[5,5],[39,44],[17,-20],[0,-1],[1,-1],[1,-1],[2,-2],[5,-7],[0,-1],[3,1],[21,10],[4,2],[0,1],[1,0],[1,1],[2,0],[0,1],[62,35],[66,-48],[40,-28]],[[6107,2506],[62,-41]],[[6169,2465],[-3,-22],[1,-27],[-2,-15]],[[6192,2521],[-41,29],[-9,7],[-5,4]],[[6137,2561],[-7,10],[-8,9],[30,56]],[[6168,2579],[16,-11],[23,-17],[-15,-30]],[[6137,2561],[-1,-5],[-4,1],[-1,0],[-1,0],[-2,-3],[-2,-4],[-9,-20]],[[6309,2476],[11,22],[-11,8],[-23,16],[-7,5],[-4,4],[2,4],[14,24],[36,-26],[7,-9]],[[6334,2524],[38,-27],[0,-52],[0,-2],[-16,0],[-3,1],[-3,2],[-4,3],[-37,27]],[[7738,7965],[-53,-45]],[[7685,7920],[-13,-12]],[[7672,7908],[-3,4],[-22,35],[-14,-12],[-49,77]],[[7584,8012],[13,13],[12,13],[51,-79],[18,15],[18,16],[17,15]],[[7713,8005],[23,-37],[2,-3]],[[7672,7908],[-15,-12],[-12,-10]],[[7645,7886],[-59,-52]],[[7586,7834],[-2,4],[-15,22]],[[7537,7964],[6,8],[5,5],[5,5],[2,1],[11,9],[3,3],[4,4],[11,13]],[[7640,7788],[-16,-14]],[[7624,7774],[-38,60]],[[7645,7886],[14,-22],[-14,-12],[11,-17]],[[7656,7835],[-30,-26],[14,-21]],[[7733,7779],[-11,-14]],[[7722,7765],[-26,41],[-14,-11],[-26,40]],[[7685,7920],[13,-21],[12,-18],[25,-40]],[[7735,7841],[24,-38]],[[7759,7803],[-13,-11],[-10,-9],[-3,-4]],[[7722,7765],[-4,-6],[-8,-7],[-15,-12],[-15,-14]],[[7680,7726],[-20,32],[12,11],[1,2],[-1,2],[-16,25],[-1,2],[-2,-1],[-13,-11]],[[7680,7726],[-16,-13]],[[7664,7713],[-40,61]],[[7805,7698],[-12,-15],[-10,-14],[-18,-22]],[[7765,7647],[-13,20],[-14,-18],[-4,-1],[-5,1],[-8,13],[-11,17],[-30,47]],[[7733,7779],[4,-7],[6,-11],[-8,-14],[10,-16],[2,-2],[1,-3],[11,-16],[10,9],[1,0],[1,-1],[10,-15],[12,15],[12,-20]],[[7831,7730],[-26,-32]],[[7759,7803],[17,14]],[[7776,7817],[42,-67],[13,-20]],[[7861,7768],[-30,-38]],[[7776,7817],[16,17],[11,11],[6,0],[5,-4],[34,-54]],[[7848,7787],[13,-19]],[[7917,7839],[-56,-71]],[[7848,7787],[20,26],[-29,44],[43,37]],[[7882,7894],[12,-18],[11,-17],[12,-20]],[[7735,7841],[9,9],[7,9],[14,21],[2,1],[15,13]],[[7782,7894],[8,-11],[3,-2],[4,0],[2,1],[11,9],[16,14],[-42,66],[16,14],[16,13]],[[7816,7998],[42,-65],[12,-20]],[[7870,7913],[12,-19]],[[7782,7894],[-30,49],[-14,22]],[[7738,7965],[65,55]],[[7803,8020],[13,-22]],[[6474,1392],[-63,40]],[[6411,1483],[20,-13],[12,-8],[12,-8],[38,-24]],[[6493,1430],[-5,-9]],[[6488,1421],[-4,-8],[-5,-11],[-5,-10]],[[6545,1440],[-10,-22],[-37,24],[-5,-12]],[[6526,1502],[10,-7],[11,-7],[16,-10],[-8,-18],[-10,-20]],[[6591,1409],[-16,-16],[-16,-17]],[[6559,1376],[-16,-16],[-39,26],[9,20],[-25,15]],[[6545,1440],[46,-31]],[[6644,1515],[8,0],[3,0],[4,1]],[[6659,1516],[0,-5],[-1,-11],[0,-8],[-2,-8],[-1,-4],[-3,-8],[-2,-2],[-24,-26],[-4,-3],[-14,-15],[-17,-17]],[[6601,1293],[-5,10],[-12,30],[-3,11],[-1,2],[-2,4],[-1,4],[-3,5],[-1,3],[-6,8],[-5,6],[-1,0],[-2,0]],[[6659,1516],[41,-1],[24,-16],[-1,-8],[2,-1],[1,0],[1,-1],[3,-1],[3,-2],[37,34],[14,13],[3,1],[3,2],[7,5],[1,0],[2,1],[5,2],[1,1],[7,4],[5,2],[4,2],[3,1],[2,2],[1,0],[2,1],[1,0],[4,2],[2,1],[1,1],[2,1],[1,0],[0,1],[2,0],[1,1],[7,5],[7,3],[5,2],[1,0],[1,1],[3,1],[3,2]],[[6871,1578],[2,-1],[7,-5],[20,-14],[35,-24],[3,-2]],[[6938,1532],[-14,-18],[-25,-20],[-27,-24],[-27,-18],[-54,-35],[-75,-47],[-110,-74],[-5,-3]],[[6556,1556],[3,8],[14,31],[9,19],[10,5],[9,6],[14,10],[15,13],[14,13],[2,2],[15,15],[16,14],[5,4],[3,1]],[[6685,1697],[46,-29]],[[6731,1668],[-8,-7],[-17,-14],[-3,-4],[-12,-10],[-27,-80],[-3,-9],[0,-6],[-1,-7],[-1,-9],[0,-6]],[[6731,1668],[85,-55],[1,0],[1,-1],[3,-2]],[[6821,1610],[2,-1],[31,-20],[1,-1],[16,-10]],[[6749,1741],[49,-32],[7,4],[7,3]],[[6812,1716],[35,-22],[11,8],[3,-2],[-31,-70]],[[6830,1630],[-9,-20]],[[6731,1668],[9,9],[9,7],[11,7],[18,8],[-15,10],[-8,5],[-21,14]],[[6734,1728],[8,7],[7,6]],[[6685,1697],[-5,5]],[[6680,1702],[40,35]],[[6720,1737],[5,-3],[4,-3],[5,-3]],[[6680,1702],[-9,4]],[[6671,1706],[6,12],[11,22]],[[6688,1740],[6,13],[2,5],[2,4],[10,21]],[[6708,1783],[11,21]],[[6688,1740],[-73,47],[-32,20],[10,22]],[[6593,1829],[10,21],[10,21]],[[6613,1871],[58,-37],[-10,-21],[36,-23],[11,-7]],[[6656,1963],[58,-38],[3,6]],[[6717,1931],[61,-39]],[[6613,1871],[9,20],[8,17],[9,18],[8,18],[9,19]],[[6593,1829],[-73,47]],[[6520,1876],[7,6],[6,12]],[[6533,1894],[10,22],[9,19],[8,18]],[[6560,1953],[17,36],[9,19]],[[6586,2008],[70,-45]],[[6671,1706],[-178,114]],[[6493,1820],[6,12],[11,23],[10,21]],[[6671,1706],[-5,-8]],[[6666,1698],[-73,47],[-8,-18]],[[6585,1727],[-59,37],[-8,-19],[-9,-19]],[[6509,1726],[-58,37]],[[6451,1763],[10,20],[8,18],[8,18],[13,-7],[3,8]],[[6532,1632],[-22,13],[-25,16],[-6,4],[10,23],[5,9],[4,5],[2,6],[9,18]],[[6585,1727],[-8,-19],[-9,-20],[-9,-18],[-7,5],[-9,-21],[-11,-22]],[[6666,1698],[-16,-14],[-15,-14],[-18,11],[-8,-20],[-1,-3],[-12,-9],[-3,-1],[-3,2],[-4,2],[-8,-16],[-2,-3],[-15,-6],[-17,-3],[-12,8]],[[6451,1763],[-9,-18],[-20,13],[-2,4],[0,21],[0,25],[-3,3]],[[6417,1811],[0,22],[0,24],[0,12]],[[6417,1869],[9,-4],[67,-45]],[[6417,1869],[6,12],[3,-2],[11,22],[10,22]],[[6447,1923],[10,20]],[[6457,1943],[70,-45],[6,-4]],[[6417,1869],[-16,8],[-10,7],[-1,1],[-28,16]],[[6362,1901],[10,5],[3,18],[2,14],[-6,29],[-2,6]],[[6369,1973],[5,6],[11,10],[19,18],[2,3],[1,3]],[[6407,2013],[1,-11],[8,-6],[0,-27],[1,-27],[30,-19]],[[6407,2013],[1,0],[5,12],[8,17]],[[6421,2042],[2,-2],[61,-38]],[[6484,2002],[-8,-18],[-9,-19],[-10,-22]],[[6484,2002],[9,17],[70,-45],[-9,-17],[6,-4]],[[6421,2042],[10,23],[8,13],[3,7],[6,12]],[[6510,2056],[70,-44],[6,-4]],[[6613,2074],[-10,-23],[-7,-14],[-1,-7],[0,-3],[-1,-3],[-8,-16]],[[6407,2013],[0,6],[-2,-6],[-3,-3],[0,-1]],[[6402,2009],[-1,26],[0,240]],[[6401,2275],[0,7]],[[6401,2282],[0,35],[1,44],[0,41],[0,4]],[[6402,2406],[4,0],[5,0],[9,0],[8,-1],[5,-1],[5,-2],[5,-2],[4,-3]],[[6401,2275],[-2,-23],[-2,-25],[-6,-29],[0,-1],[-7,-25],[-17,-42],[-13,-21]],[[6354,2109],[-14,8],[-38,25],[-31,20],[-15,9]],[[6256,2171],[13,60],[1,8],[3,9],[4,9],[4,-3]],[[6281,2254],[15,-9],[2,0],[2,2],[6,14],[17,-11],[-8,-16],[0,-1],[1,-2],[1,-1],[57,-37],[3,0],[1,2],[1,4],[1,12],[-1,8],[0,24],[0,19],[0,22],[0,2],[-2,1],[-29,18],[-17,12],[-3,3]],[[6328,2320],[0,17],[1,8],[4,11],[11,24],[6,13],[2,4],[2,8],[0,3],[-6,5],[-9,6],[2,3]],[[6341,2422],[9,-7],[7,-4],[7,-4],[4,-1],[6,0],[6,0],[7,0],[5,0],[9,0],[1,0]],[[6281,2254],[27,58],[3,7],[7,7],[6,-5],[4,-1]],[[6402,2009],[-3,1],[-19,-17],[-10,7],[-5,3],[12,24],[5,13],[-1,5],[-4,6],[-8,5],[-7,5],[-9,2],[-12,-1],[-6,-8],[-14,-22],[-21,-31]],[[6300,2001],[-15,-23]],[[6285,1978],[-25,-35]],[[6260,1943],[-15,-22]],[[6245,1921],[-11,7],[-4,3]],[[6230,1931],[71,99]],[[6301,2030],[24,35],[29,44]],[[6301,2030],[-12,12],[-57,35],[-17,10]],[[6215,2087],[8,17],[8,16],[6,10],[9,23],[10,18]],[[6230,1931],[-12,8],[10,15],[-57,37]],[[6171,1991],[8,18]],[[6179,2009],[8,18],[8,16],[9,20],[11,24]],[[6369,1973],[-3,2],[-11,7],[-8,5]],[[6347,1987],[-13,8],[-2,1],[-2,1],[-4,-1],[-9,-3],[-3,0],[-3,0],[-2,1],[-9,7]],[[6347,1987],[-31,-30]],[[6316,1957],[-17,12],[-14,9]],[[6316,1957],[-14,-14]],[[6302,1943],[-5,-4],[-3,-2],[-8,-6],[-3,0],[-4,0],[-3,2],[-16,10]],[[6281,1897],[-3,2],[-14,9],[-3,4],[-16,9]],[[6302,1943],[18,-13],[1,-3]],[[6321,1927],[-6,-4],[-18,-14],[-16,-12]],[[6321,1927],[21,-13],[-18,-15],[22,-15]],[[6346,1884],[-3,-4],[-11,-12],[-1,-3]],[[6331,1865],[-50,32]],[[6362,1901],[-5,-5],[-11,-12]],[[6730,2120],[-11,-23]],[[6719,2097],[-11,-24],[-11,-24],[-11,-22]],[[6686,2027],[-73,47]],[[6686,2027],[-11,-24],[-10,-21],[-9,-19]],[[6836,1948],[-12,-11],[-5,-4]],[[6717,1931],[6,14],[10,21],[11,23]],[[6744,1989],[61,-40],[12,24],[27,-18]],[[7964,5893],[-41,31],[-17,13]],[[7906,5937],[4,14],[1,10],[0,17]],[[7891,5897],[6,17],[9,23]],[[7978,5880],[-6,-9],[-14,-25],[-32,24],[-35,27]],[[7987,5874],[-27,-45],[8,-3],[9,-6],[-5,-10],[-5,-10],[-4,-7]],[[7963,5793],[-56,42],[-30,22]],[[7877,5857],[7,19],[7,21]],[[7944,5758],[-60,44],[-10,7],[-11,6]],[[7863,5815],[7,22]],[[7870,5837],[7,20]],[[7963,5793],[-5,-10],[-4,-8],[-7,-12],[-3,-5]],[[7925,5721],[-21,15],[-55,39]],[[7849,5775],[14,40]],[[7944,5758],[-3,-8]],[[7941,5750],[-5,-8],[-1,-3],[-9,-17],[-1,-1]],[[7908,5689],[-11,-22]],[[7897,5667],[-48,36],[-2,1],[-1,0],[-1,0],[-1,-1],[-8,-14],[-15,10]],[[7821,5699],[6,16],[4,12],[2,3],[4,13],[12,32]],[[7925,5721],[-7,-13],[-3,-6],[-7,-13]],[[7897,5667],[-7,-13]],[[7890,5654],[-9,-13],[-10,-5],[-24,-45],[2,-14],[-10,-19]],[[7839,5558],[-13,12],[-16,12],[-34,24]],[[7776,5606],[22,48]],[[7798,5654],[23,45]],[[7982,5606],[-18,9]],[[7964,5615],[-59,30],[-15,9]],[[7908,5689],[16,-8],[7,-3],[70,-36]],[[8001,5642],[-11,-21],[-8,-15]],[[7942,5529],[-10,-18]],[[7932,5511],[-9,4],[-3,2],[-54,27],[-2,1],[-9,5],[-10,-19],[-9,-19]],[[7836,5512],[-8,5],[-3,1],[-6,3]],[[7819,5521],[1,5],[7,15],[7,14],[5,3]],[[7964,5615],[-9,-19],[-9,-18],[-2,-3],[-10,-18],[-9,-18],[5,-3],[12,-7]],[[7922,5492],[-10,-19]],[[7912,5473],[-9,5],[-2,1],[-55,28],[-2,1],[-8,4]],[[7932,5511],[-10,-19]],[[7902,5454],[-9,-18]],[[7893,5436],[-10,5],[-2,1],[-25,13],[-29,15],[-2,1],[-9,5]],[[7816,5476],[10,18],[8,-4],[3,-2],[54,-28],[2,-1],[9,-5]],[[7883,5417],[-10,-19]],[[7873,5398],[-9,5],[-3,1],[-54,28],[-2,1],[-9,4]],[[7796,5437],[10,18],[0,1],[10,20]],[[7893,5436],[-10,-19]],[[7779,5446],[-62,45]],[[7717,5491],[3,6],[16,29],[1,2],[18,38],[10,21],[5,9]],[[7770,5596],[6,10]],[[7819,5521],[-10,-19],[-10,-18],[-10,-19],[-10,-19]],[[7796,5437],[-9,-17],[-11,-20]],[[7776,5400],[-23,11],[-2,1],[-2,2],[-11,7],[-42,31],[-2,-3],[-10,-18],[-9,-17],[-10,-16],[-9,-17]],[[7656,5381],[-49,36]],[[7607,5417],[9,17],[9,17],[2,4],[7,13]],[[7634,5468],[9,18],[2,3],[9,17],[8,15],[4,7]],[[7666,5528],[51,-37]],[[7779,5446],[6,-3],[3,-1],[8,-5]],[[7751,5351],[-13,-25]],[[7738,5326],[-10,5],[-1,1],[-14,8]],[[7713,5340],[-57,41]],[[7776,5400],[-1,-4],[-12,-23]],[[7763,5373],[-12,-22]],[[7685,5288],[-57,42]],[[7628,5330],[10,17],[9,17],[9,17]],[[7713,5340],[-10,-18],[-9,-17],[-5,-9],[-4,-8]],[[7702,5259],[-26,12]],[[7676,5271],[9,17]],[[7738,5326],[-12,-22],[-12,-24],[-12,-21]],[[7656,5236],[-56,41]],[[7600,5277],[9,18],[10,17],[9,18]],[[7676,5271],[-10,-18],[-10,-17]],[[7666,5190],[-8,4],[-4,3],[-14,7]],[[7640,5204],[7,14],[5,9],[4,9]],[[7702,5259],[-12,-23]],[[7690,5236],[-12,-23],[-12,-23]],[[7640,5204],[-2,-3]],[[7638,5201],[-57,42]],[[7581,5243],[9,17],[10,17]],[[7666,5190],[-10,-20],[-13,-22]],[[7643,5148],[-26,13],[-3,2],[-37,19],[-21,14]],[[7556,5196],[7,12],[9,17]],[[7572,5225],[42,-30],[14,-12],[10,18]],[[6885,1991],[-44,28]],[[6841,2019],[11,23],[7,13],[4,8]],[[6744,1989],[11,23],[11,24]],[[6766,2036],[63,-40],[12,23]],[[6766,2036],[11,24]],[[6777,2060],[11,24]],[[6788,2084],[11,20],[10,19],[9,19]],[[6788,2084],[-58,36]],[[6812,1716],[6,4],[10,4],[10,5],[-58,38],[-8,-8],[-7,-5],[-8,-7],[-8,-6]],[[7126,2087],[1,-1],[5,-4],[22,19]],[[7154,2101],[22,-16],[32,-24],[16,16],[7,7],[18,7],[19,5],[18,9],[4,5],[17,15]],[[7307,2125],[17,13],[22,10],[23,11]],[[7369,2159],[17,14],[29,34]],[[7415,2207],[19,13]],[[7434,2220],[5,5],[13,10],[4,5],[3,-3],[2,-1],[6,-7],[5,-6],[1,-1]],[[7473,2222],[-2,-3],[-3,-4],[-24,-26],[-71,-63],[-49,-40],[-52,-38],[-25,-18],[-1,0],[-49,-32],[-50,-31],[-48,-38],[-139,-160],[-7,-11],[-10,-15],[-37,-56],[-8,-10],[-10,-10],[-45,-39],[-4,-1],[-2,0],[-2,1],[-2,0],[-3,2]],[[7404,1647],[-9,-17],[-28,-56],[-10,-21],[-4,-10],[-5,-9],[-10,-13],[-6,-8],[-3,-3],[-8,-10],[-36,-48]],[[7285,1452],[-2,-2],[-39,-51],[-5,-7]],[[7239,1392],[-16,-18],[-38,-37],[-32,-30],[-8,-7]],[[7145,1300],[-24,-23],[-1,0],[-24,-23],[-9,-9],[-8,-9]],[[6829,1427],[24,16],[23,15],[21,17],[19,16],[26,25],[19,27],[16,28],[16,29],[31,37],[3,4],[3,4],[10,11],[25,29],[31,35],[25,20],[37,28],[91,67],[2,1]],[[7251,1836],[1,0],[2,-1],[4,-2],[119,-93],[5,-5],[4,-9],[16,-77],[2,-2]],[[7143,1118],[-18,4],[15,36],[-15,12],[-15,12],[1,3]],[[7145,1300],[10,-7],[49,-35]],[[7204,1258],[-25,-53],[-7,-18],[-7,-16]],[[5655,1209],[-29,15],[-2,21],[-22,-1],[3,-37]],[[5605,1207],[-24,13]],[[5581,1220],[-25,15]],[[5556,1235],[-1,6],[6,1],[11,1],[-6,77]],[[5566,1320],[19,0],[20,0],[4,0],[37,-1],[23,-1],[3,0]],[[5672,1318],[2,-20],[4,-44],[0,-7]],[[5678,1247],[-3,0],[-24,-1],[4,-37]],[[5556,1235],[-5,2],[-2,4],[-26,12]],[[5523,1253],[-1,10],[0,18],[4,19],[1,19]],[[5527,1319],[20,1],[19,0]],[[5487,1147],[-10,125]],[[5477,1272],[24,-9],[22,-10]],[[5556,1235],[1,-15],[4,-35],[-2,-14],[1,-14],[-34,-4]],[[5526,1153],[-14,-2],[-25,-4]],[[5584,1066],[-25,15],[-8,5],[-11,6],[-9,4],[-2,26],[0,6],[-3,25]],[[5581,1220],[5,-60],[5,-58]],[[5591,1102],[1,-16],[-8,-20]],[[5605,1207],[26,-15],[21,-11]],[[5652,1181],[3,-3]],[[5655,1178],[4,-58],[-22,-2],[4,-47],[-26,16],[-24,15]],[[5655,1209],[1,-18],[-4,-10]],[[5685,1161],[-3,1],[-7,3],[-8,6],[-12,7]],[[5678,1247],[2,-28],[4,-46],[1,-12]],[[5699,1041],[-16,3],[-5,-2],[-12,-9],[-7,-3],[-6,0],[-8,1],[-10,5],[-14,7],[-13,8],[-24,15]],[[5685,1161],[48,-25],[20,-8],[25,-8],[15,-3]],[[6161,5074],[-4,2],[-53,24],[-13,-21],[-35,17],[1,-5],[0,-4],[0,-2],[-1,-6],[-2,-9]],[[6054,5070],[-4,-14],[-14,-24]],[[6036,5032],[-25,-47],[-6,0],[-7,-18]],[[5998,4967],[-12,5],[-2,2]],[[5984,4974],[9,16],[8,18],[4,5],[4,4],[8,14],[2,7],[2,1],[7,11],[6,13],[8,16],[2,7],[1,8],[1,9],[0,25],[0,4],[2,16],[13,44],[7,15],[11,19]],[[6079,5226],[4,0],[7,-3],[70,-34]],[[6160,5189],[10,-5],[8,-4],[5,-2]],[[6183,5178],[-3,-5],[0,-3],[-1,-3],[0,-18],[0,-14],[-1,-11],[-2,-5],[-15,-45]],[[6267,4964],[-14,7],[-48,23]],[[6205,4994],[10,26],[4,13],[4,12],[-62,29]],[[6183,5178],[11,-6],[64,-31]],[[6258,5141],[61,-29]],[[6185,4939],[-58,30]],[[6127,4969],[9,30],[8,25]],[[6144,5024],[4,13],[4,13],[5,13],[4,11]],[[6205,4994],[-8,-23],[-2,-4],[-10,-28]],[[6226,4852],[-15,7],[-47,24]],[[6164,4883],[7,17],[4,11],[1,3],[4,12],[5,13]],[[6164,4883],[-14,7]],[[6150,4890],[-43,22]],[[6107,4912],[6,17],[4,11],[1,4],[4,11],[5,14]],[[6150,4890],[-11,-29]],[[6139,4861],[-43,21]],[[6096,4882],[5,14],[6,16]],[[6207,4802],[-61,30]],[[6146,4832],[8,22],[-15,7]],[[6115,4746],[-58,30]],[[6057,4776],[8,21]],[[6065,4797],[8,22],[8,21]],[[6081,4840],[7,21],[8,21]],[[6146,4832],[-8,-21],[-7,-21],[-8,-23],[-8,-21]],[[6175,4715],[-60,31]],[[6154,4658],[-61,31]],[[6093,4689],[7,19],[8,19],[7,19]],[[6132,4601],[-16,8],[-38,20],[-6,3]],[[6072,4632],[7,19]],[[6079,4651],[7,19],[7,19]],[[6120,4569],[-75,21],[17,47],[10,-5]],[[6113,4545],[0,1],[-130,33]],[[5983,4579],[2,5]],[[5985,4584],[11,29],[3,8],[5,16],[16,44]],[[6020,4681],[59,-30]],[[6020,4681],[8,19],[7,19]],[[6035,4719],[8,18],[7,20],[7,19]],[[6004,4476],[-21,10]],[[5983,4486],[-25,13],[-4,3]],[[5954,4502],[27,73],[2,4]],[[5954,4502],[-4,1],[-6,3]],[[5944,4506],[7,17],[-69,35],[-48,25]],[[5834,4583],[5,13],[5,13],[-1,7]],[[5843,4616],[1,0],[31,-8]],[[5875,4608],[104,-27],[2,4],[4,-1]],[[5954,4502],[-21,-54]],[[5933,4448],[-4,2],[-4,4],[-3,2],[-18,10],[0,3],[-16,7],[-15,8],[-15,9],[11,30],[7,18],[68,-35]],[[5933,4448],[-19,-48],[-6,-18]],[[5841,4433],[-3,2],[-64,48],[-26,20]],[[5748,4503],[6,9],[14,36],[7,20],[8,20],[6,18]],[[5789,4606],[45,-23]],[[6029,4373],[-4,-2],[-26,-9],[-9,-2],[-15,-2],[-9,1],[-7,0],[-6,0],[-11,2],[-9,4],[-13,5],[-13,8]],[[5983,4486],[-11,-29],[-11,-24],[19,-12]],[[5710,4453],[35,46],[3,4]],[[7848,608],[-11,0],[-8,4],[-5,6],[-17,28],[-10,13],[-6,19],[-1,22],[5,9],[5,6],[7,5],[10,9],[5,4],[8,7],[13,2],[11,-1],[15,-4],[5,-1],[17,1],[18,2],[20,5],[25,8],[16,7],[7,3],[12,4],[23,13],[11,5],[9,4],[9,3],[18,7],[10,-3],[4,0],[31,-10],[8,-1],[2,-12],[0,-8],[-4,-12],[0,-5],[-4,-17],[-4,-7],[-10,-9],[-10,-10],[-10,-12],[-7,-9],[-8,-11],[-12,-12],[-4,-2],[-9,-2],[-15,-8],[-28,-13],[-23,-3],[-25,-8],[-11,-2],[-14,-1],[-10,-4],[-19,-1],[-10,-1],[-29,-7]],[[7669,768],[-1,7]],[[7668,775],[4,5],[8,6],[3,7],[1,9],[-1,7],[-4,5],[-5,4],[-5,7],[-5,4],[-3,3],[-3,5],[-14,9],[-3,1],[-3,-2],[-1,-4],[-1,-2]],[[7636,839],[-12,10],[-6,1],[-4,1],[-2,1]],[[7612,852],[-65,17]],[[7547,869],[4,22],[4,21]],[[7555,912],[4,22],[4,20],[5,20]],[[7568,974],[65,-17]],[[7633,957],[51,-13]],[[7684,944],[38,12],[15,15]],[[7737,971],[-27,-27],[-9,-8],[-10,-10],[-7,-10],[-2,-7],[-1,-13],[1,-5],[4,-2],[4,0],[13,-4],[10,-6],[4,-6],[6,-13],[3,-3],[5,0],[8,4],[3,5],[11,13],[5,6],[2,0],[-1,-2],[-18,-25],[-10,-14],[0,-11],[-8,-4],[-4,-4],[-13,-20],[-3,-7],[-6,-9],[-6,-2],[-13,-11],[-9,-8]],[[7915,744],[-7,0],[-7,3],[-11,2],[-23,7],[-12,2],[-16,1],[-1,2],[4,3],[8,3],[21,11],[9,8],[32,20],[11,4],[6,2],[42,21],[13,6],[8,1],[12,-1],[18,-3],[27,-9],[13,-3],[27,-14],[6,-5],[0,-3],[-7,0],[-9,2],[-12,1],[-8,0],[-12,-2],[-12,-3],[-11,-5],[-18,-5],[-14,-5],[-13,-3],[-11,-4],[-18,-8],[-21,-6],[-9,-5],[-7,-1],[-2,-2],[2,-2],[5,-2],[2,-5],[-1,-2],[-4,-1]],[[7608,830],[-2,0],[-7,1],[-50,3],[-11,1]],[[7538,835],[4,14],[5,20]],[[7612,852],[-1,-7],[0,-4],[2,2],[-1,-4],[-4,-9]],[[7522,803],[4,8]],[[7526,811],[9,20],[1,2],[2,2]],[[7608,830],[-1,-3],[-9,-24],[-2,-4],[-3,-10],[-4,-11],[-9,-17],[-13,-13],[-14,-11],[-6,-5],[-11,20],[18,15],[11,11],[3,8],[-12,6],[-12,4],[-22,7]],[[7636,839],[-4,-4],[-3,-5],[-13,-27],[-34,-61],[-2,-3],[-7,-9],[-7,-12],[-13,-14],[-25,-35],[-11,-20],[-21,-30],[-15,-22],[-15,-18],[-9,-9],[-13,-11],[-19,-14],[-3,-2],[-14,-6],[-12,-4],[-12,-7],[-3,-2]],[[7381,524],[-1,6]],[[7380,530],[31,10],[49,37],[51,77],[5,9],[-22,13],[-25,15]],[[7469,691],[10,19],[15,32],[10,23]],[[7504,765],[8,17],[10,21]],[[7715,417],[-8,-8],[-9,-8],[-6,-7],[-18,-14],[-10,-4],[-19,1],[-8,2],[-11,10],[-10,12],[-4,9],[8,14],[9,6],[7,3],[3,2],[5,-1],[6,-2],[7,-4],[3,-1],[20,-3],[18,-2],[18,-2],[-1,-3]],[[7669,768],[-5,-5],[-8,-14],[-28,-30],[-11,-14],[-8,-12],[-6,-7],[-1,-1],[-1,0],[0,4],[6,11],[10,14],[22,26],[5,8],[15,15],[6,8],[3,4]],[[7380,530],[-9,14],[-9,19],[-16,35]],[[7346,598],[19,7],[18,8],[5,1],[14,6],[17,9],[2,1],[11,8],[2,2],[9,9],[4,4]],[[7447,653],[7,8],[7,12],[8,18]],[[7346,598],[-10,25]],[[7336,623],[67,28],[11,23]],[[7414,674],[16,-9],[17,-12]],[[7336,623],[-9,20],[-9,21]],[[7318,664],[17,6],[17,8]],[[7352,678],[25,9],[4,9]],[[7381,696],[17,-11],[16,-11]],[[7633,957],[4,21],[5,21]],[[7642,999],[74,-20]],[[7716,979],[-17,-17],[-15,-18]],[[7568,974],[3,22],[4,21]],[[7575,1017],[67,-18]],[[7630,1111],[-4,-21],[32,-7],[-8,-42]],[[7650,1041],[-4,-21],[-4,-21]],[[7575,1017],[5,21]],[[7580,1038],[3,20],[0,9],[-5,15],[-12,24],[-7,15],[0,9]],[[7559,1130],[71,-19]],[[7451,1007],[-13,5]],[[7438,1012],[39,41],[24,26],[10,12],[14,22],[28,52],[1,1]],[[7554,1166],[12,-2]],[[7566,1164],[-6,-11],[-3,-8],[2,-15]],[[7580,1038],[-66,18],[-5,-21],[-25,7],[-17,-18],[-16,-17]],[[7501,993],[-50,14]],[[7568,974],[-67,19]],[[6314,834],[-39,-1],[-2,-11],[-18,7],[-10,7],[-22,32],[-9,9]],[[6214,877],[0,47],[0,4],[17,0],[0,-34],[8,-8],[10,-13],[-1,55],[18,1],[0,9]],[[6266,938],[46,1]],[[6312,939],[1,-27],[1,-78]],[[6375,732],[-5,-17]],[[6370,715],[-11,11],[-5,9],[-14,17],[-2,4],[-17,17],[-3,3],[-35,24],[-8,11],[-1,1],[-10,4],[-5,0],[-8,5],[-3,4],[-11,14],[-2,3],[-7,7],[-17,18]],[[6211,867],[0,12]],[[6211,879],[3,-2]],[[6314,834],[20,0],[19,1]],[[6353,835],[20,0],[1,-80],[-5,-16],[3,-4],[3,-3]],[[6533,876],[-2,-8],[24,-6]],[[6555,862],[-22,-78],[-1,-6],[-4,-13]],[[6528,765],[-9,2],[-4,1],[-9,3],[-2,0],[-6,2],[-21,6]],[[6477,779],[-22,8],[-10,6],[-18,7],[-14,-46],[-14,-47],[-10,12],[-3,4],[-3,3],[-8,6]],[[6375,732],[1,6],[13,54],[1,3],[6,24],[3,17],[3,23],[1,5]],[[6403,864],[2,3],[1,2],[2,2],[2,4],[2,3],[1,2],[7,6],[12,5],[11,0],[17,-5],[5,-1],[19,-6],[45,-11],[2,8]],[[6531,876],[2,0]],[[6488,656],[-1,-2],[0,-4],[-1,-3],[-2,-6],[-2,-7],[-2,-5]],[[6480,629],[-3,-9]],[[6477,620],[-7,4],[-7,6],[-3,2],[-13,11],[-21,20],[-5,6],[-4,5],[-11,12],[-18,15],[-8,4],[-10,10]],[[6477,779],[-16,-53],[-5,-19],[-1,-7],[-5,-20],[17,-10],[7,-5],[1,-1],[13,-8]],[[6606,724],[-21,8],[-20,-74]],[[6565,658],[-51,33],[-6,4],[-1,-7],[-5,-16],[-6,-22],[-8,6]],[[6528,765],[6,-2],[11,-6],[13,-7],[32,-16],[3,-1],[14,-5],[-1,-4]],[[6565,658],[-7,-22],[-6,-22],[-7,-24],[-19,14],[-16,9],[-21,12],[-9,4]],[[6903,754],[18,-4],[17,-5],[19,-3]],[[6957,742],[-18,-64]],[[6939,678],[-9,-4],[-11,3],[-16,7],[-18,7],[18,63]],[[6940,607],[-2,4],[-2,-2],[-1,-1],[-3,-2],[-3,-1],[-4,0],[-3,1],[-4,1]],[[6918,607],[1,3],[6,21],[6,20]],[[6931,651],[6,20],[2,7]],[[6957,742],[18,-5],[20,-4],[20,1],[15,6],[7,4],[7,7],[7,11],[2,2]],[[7053,764],[4,-5],[4,-5],[3,-5],[14,-38],[1,-7],[1,-4],[3,-7]],[[7083,693],[-15,-8],[-37,-15],[-33,-16],[-18,-13],[-24,-20],[-16,-14]],[[7098,603],[-7,-20],[-14,-7],[-13,-4],[-7,-4]],[[7057,568],[-7,-2]],[[7050,566],[-16,44],[-8,19],[-30,-15],[-6,-3],[-15,-17],[1,-48]],[[6976,546],[-1,-59],[-1,-44],[-15,5],[-12,3],[-3,1],[-2,0],[-22,2],[-13,-2],[-5,0]],[[6902,452],[11,50],[12,46],[15,34],[18,25],[25,20],[29,21],[38,15],[33,14],[5,2]],[[7088,679],[3,-6],[2,-7],[2,-4],[2,-3],[3,-3],[2,-2],[14,-11],[-7,-13],[-7,-16],[-4,-11]],[[6993,546],[-17,0]],[[7050,566],[-20,-7],[-18,-7],[-19,-6]],[[7057,568],[-4,-31],[-1,-22],[-1,-4],[0,-23]],[[7051,488],[-22,0],[-21,0],[-15,58]],[[7098,603],[18,-8],[6,-14],[17,-45],[9,-20]],[[7148,516],[-15,-7],[-33,-13],[-9,-4]],[[7091,492],[-14,-3],[-26,-1]],[[7148,516],[15,-35],[8,-23]],[[7171,458],[-20,-8],[-37,-11],[-13,-3],[-8,22],[-2,34]],[[7194,535],[18,-43],[18,2]],[[7230,494],[19,1],[20,-1]],[[7269,494],[-4,-23],[-19,1],[-24,-4],[-29,-2],[-22,-8]],[[7148,516],[19,8],[9,4]],[[7176,528],[18,7]],[[7194,535],[17,8],[-19,44],[0,7],[2,8],[17,19],[13,10],[12,-14],[8,-15],[9,-20],[7,-19]],[[7260,563],[-16,-7],[8,-18]],[[7252,538],[-17,-7],[-17,-7],[12,-30]],[[7252,538],[16,6],[16,7],[21,-49]],[[7305,502],[-7,-7],[-9,-3],[-8,-1],[-12,3]],[[7260,563],[33,13]],[[7293,576],[26,-62],[-14,-12]],[[7175,450],[-4,8]],[[7293,576],[53,22]],[[7381,524],[-20,-14],[-8,-7],[-12,-8],[-18,-15],[-10,-6],[-12,-11],[-6,-4],[-4,-1],[-3,0],[-3,2],[-12,0],[-26,-4],[-16,-4],[-18,0],[-22,1],[-3,0],[-13,-3]],[[7175,450],[-16,-4],[-18,-6],[-10,-4],[-10,-7],[-8,-5],[-22,-3],[-11,1],[-5,3],[-8,3],[-21,2],[-35,0],[-26,-1],[-26,0],[-13,-2],[-8,1],[-1,-5],[-2,-2],[-7,-6],[-3,0],[-16,4],[-11,-2],[-4,1],[8,34]],[[6886,453],[-7,-32],[-23,4]],[[6856,425],[16,35]],[[6872,460],[3,-4],[4,-2],[3,-1],[4,0]],[[7464,1065],[-2,2],[-3,4],[-2,4],[-3,2],[-5,5],[-4,2],[-9,5]],[[7436,1089],[-9,3],[-16,5],[-78,21]],[[7333,1118],[-56,17]],[[7277,1135],[13,65]],[[7290,1200],[56,-15],[4,22]],[[7350,1207],[2,-1],[2,-1],[70,-17],[2,-2],[-1,-3],[-3,-17],[10,-3],[7,-3],[5,-2],[9,-4],[37,-9],[11,21],[2,3]],[[7503,1169],[17,1],[11,4],[4,-1]],[[7535,1173],[2,-1]],[[7537,1172],[-2,-3],[-24,-46],[-16,-23],[-10,-11],[-20,-24],[-1,0]],[[7350,1207],[4,12]],[[7354,1219],[95,-32],[54,-18]],[[7290,1200],[5,22],[2,12]],[[7297,1234],[57,-15]],[[7399,1492],[20,35],[6,30]],[[7481,1573],[2,-10],[7,-32],[0,-2],[8,-40],[-2,-11]],[[7496,1478],[-21,5],[-21,6],[-21,5],[-10,0],[-6,0],[-8,-1],[-10,-1]],[[7518,1584],[3,-10],[0,-2],[7,-35],[8,-37],[3,-11]],[[7539,1489],[2,-10],[-2,-12]],[[7539,1467],[-21,5],[-22,6]],[[7554,1595],[3,-12],[15,-72],[3,-12]],[[7575,1499],[-18,-5],[-18,-5]],[[7637,1518],[-27,-8]],[[7610,1510],[-19,-6],[-16,-5]],[[7610,1510],[3,-12],[9,-41],[-2,-11]],[[7620,1446],[-21,6],[-19,5],[-20,5],[-21,5]],[[7679,1530],[2,-10],[11,-48],[2,-2]],[[7694,1470],[-9,-16],[-5,-9]],[[7680,1445],[-2,-3],[-5,-9]],[[7673,1433],[-3,1],[-20,4],[-30,8]],[[7740,1546],[-18,-29],[-18,-30],[-10,-17]],[[7675,1631],[3,-10],[17,-75],[2,-10],[9,3],[9,3],[23,6],[2,-2]],[[7983,2761],[-12,16],[-9,10],[-7,7]],[[7955,2794],[26,32],[-7,8],[25,25]],[[7999,2859],[7,-8],[5,-5],[3,-3],[10,-12],[13,-17]],[[8037,2814],[-28,-27],[0,-1],[-26,-25]],[[7932,2709],[-8,21],[-4,11]],[[7920,2741],[8,11],[3,6],[24,36]],[[7983,2761],[-26,-27],[-10,-10],[-15,-15]],[[7949,2664],[-8,20],[-9,25]],[[7983,2761],[15,-20],[12,-15]],[[8010,2726],[-28,-29],[-33,-33]],[[8041,2683],[-25,-24]],[[8016,2659],[-7,10],[-23,-23],[-22,-22]],[[7964,2624],[-8,21]],[[7956,2645],[-7,19]],[[8010,2726],[10,-15],[2,-1],[11,-16],[8,-11]],[[8022,2541],[-5,7],[-6,8]],[[8011,2556],[-8,11],[-19,25],[-5,6],[-3,4],[0,4],[-12,18]],[[8016,2659],[7,-9],[11,-14],[4,-5],[12,-16],[12,-16],[1,-1]],[[8063,2598],[-13,-17],[-27,-38],[-1,-2]],[[8041,2683],[6,-9],[26,26],[13,11],[16,16]],[[8102,2727],[11,-16],[1,-3],[19,-15]],[[8133,2693],[-5,-7],[-19,-25],[-14,-20],[-7,-8],[-22,-32],[-3,-3]],[[8010,2726],[26,25],[27,28]],[[8063,2779],[11,-15],[12,-16]],[[8086,2748],[16,-21]],[[8037,2814],[9,-11],[6,-9]],[[8052,2794],[11,-15]],[[8052,2794],[17,18],[7,11]],[[8076,2823],[14,-12],[15,-12],[16,-12],[-8,-12],[-27,-27]],[[8285,2852],[-5,-5],[-3,5],[-10,-4],[6,-8],[-17,-17],[-6,9],[-7,-8],[3,-5],[-11,-6],[-9,-3],[-14,-3],[-11,-3],[-6,0],[-1,-3],[27,6],[6,0],[17,4],[-1,-3],[-10,-10],[-37,-37],[-2,-2],[-7,-3],[-9,-8],[-19,-22],[-6,-8],[-7,-9],[-5,-4],[0,-3],[-8,-9]],[[8076,2823],[13,22],[13,23],[27,48]],[[8129,2916],[23,-18],[12,-11],[14,29]],[[8178,2916],[16,-12],[24,-20],[36,-17],[31,-15]],[[8179,2575],[-13,18],[-1,1],[-14,19],[-50,-51]],[[8101,2562],[-13,12],[-8,7],[-12,12]],[[8068,2593],[5,7],[6,6],[6,7],[16,17],[5,2],[6,8],[15,20],[3,6],[5,4],[8,10],[9,11],[15,19],[33,35],[1,5],[2,2]],[[8223,2723],[-35,-36],[16,-20],[14,-19],[14,-19]],[[8232,2629],[-27,-27],[-26,-27]],[[8280,2678],[-18,-18],[-14,-14],[-16,-17]],[[8260,2542],[-5,11],[-10,19]],[[8245,2572],[14,21],[-12,16],[-15,20]],[[8245,2572],[-9,-11],[-27,-26],[-15,20],[-15,20]],[[8260,2542],[-31,-36],[-19,-19],[-13,-13]],[[8197,2474],[-3,3],[-3,1],[-10,10],[-15,14],[-13,12],[-19,17]],[[8134,2531],[45,44]],[[8272,2517],[-41,-74]],[[8231,2443],[-13,12],[-16,14],[-1,2],[-4,3]],[[8290,2482],[-33,-64]],[[8257,2418],[-14,13]],[[8243,2431],[-12,12]],[[8280,2365],[-21,12],[8,17],[5,11],[-15,13]],[[8271,2345],[-20,14],[-18,12],[-9,5],[-8,6],[6,11],[3,6],[13,22],[5,10]],[[8262,2326],[-20,13]],[[8242,2339],[-17,10],[-20,11],[-15,9],[-15,8],[-33,19],[-1,0],[-9,1],[-12,3]],[[8120,2400],[1,10],[0,4],[0,2],[0,5],[0,10],[0,6]],[[8121,2437],[22,6],[16,8],[16,9],[14,8],[7,5],[1,1]],[[6637,501],[-2,-12]],[[6635,489],[-23,26],[-11,12],[-16,12],[-16,19],[-5,7],[-31,25],[-18,9],[-10,3],[-15,10],[-13,8]],[[6565,658],[3,-67],[44,-43],[2,-22],[23,-25]],[[6565,658],[17,-7],[-6,-21]],[[6576,630],[-3,-14],[1,-7],[34,-36],[4,-5],[6,-4],[6,-3],[27,-10]],[[6651,551],[-8,-28]],[[6643,523],[-6,-22]],[[6576,630],[10,-6],[30,-30]],[[6616,594],[10,-11],[12,-5],[10,37]],[[6648,615],[19,-7]],[[6667,608],[-9,-31],[-7,-26]],[[6616,594],[10,13],[1,5],[-17,16],[-2,4],[0,3],[3,14],[5,21],[-16,7],[5,20]],[[6605,697],[60,-22],[-6,-20],[-11,-40]],[[6606,724],[5,-2],[-6,-25]],[[6691,692],[-9,-33]],[[6682,659],[-15,-51]],[[6555,862],[95,-24]],[[6650,838],[78,-17]],[[6728,821],[-27,-94],[-9,-31],[-1,-4]],[[6682,659],[18,-8],[17,-6]],[[6717,645],[-13,-48],[-3,-2],[-16,5],[-18,8]],[[6822,642],[-10,-33]],[[6812,609],[-42,16]],[[6770,625],[-17,6],[-17,7]],[[6736,638],[-16,6],[-3,1]],[[6691,692],[23,-9],[27,-10],[33,-13],[48,-18]],[[6770,625],[-13,-47],[-2,-3],[-4,0],[-13,5],[-16,6],[0,6],[14,46]],[[6812,609],[-15,-52]],[[6797,557],[-10,-33],[-11,-37]],[[6776,487],[-20,2],[-5,1],[-20,3],[-18,4],[-16,5],[-36,14],[-18,7]],[[6834,517],[2,-23],[-18,-3],[4,-33]],[[6822,458],[-26,-6],[-8,0],[-9,-1],[-13,2],[10,34]],[[6797,557],[20,-8],[9,-3],[4,0],[4,-29]],[[6856,425],[-81,14],[-9,-1],[-14,1],[-15,4],[-11,2],[-13,2],[-3,2],[-16,5],[-16,7],[-9,2],[-21,12],[-6,6],[-7,8]],[[6822,458],[31,5],[10,0],[5,-2],[4,-1]],[[6834,517],[11,2],[5,4],[2,4],[6,21]],[[6858,548],[19,-7],[-13,-45],[5,-1],[4,-1],[5,-1],[4,-2],[-10,-31]],[[6822,642],[52,-19]],[[6874,623],[-6,-24],[-2,-24],[-8,-27]],[[6874,623],[29,-11],[15,-5]],[[6940,607],[-4,-4],[-11,-19],[-17,-46],[-12,-43],[-10,-42]],[[6822,642],[1,4],[9,31],[28,-10],[3,11]],[[6863,678],[9,-4],[8,-3],[51,-20]],[[6863,678],[22,80],[18,-4]],[[7573,1803],[-22,96]],[[7592,1912],[3,-11],[4,-18],[1,-5]],[[7600,1878],[2,-11],[9,-40],[3,-11]],[[7668,1904],[-1,-20]],[[7667,1884],[-1,-21]],[[7666,1863],[-9,1],[-13,1],[-12,1],[-3,-1],[-6,-1],[-3,10],[-2,9],[-18,-5]],[[7666,1863],[-1,-20],[-1,-10],[0,-10]],[[7664,1823],[-22,1],[-10,-2],[-18,-6]],[[7664,1823],[17,-1],[29,-2],[-1,-20],[10,0],[23,-2],[10,0]],[[7714,1880],[-1,-21],[8,0],[25,-2],[9,-1]],[[7667,1884],[9,-1],[29,-2],[9,-1]],[[7714,1880],[1,21],[1,20],[1,21]],[[7530,1791],[-3,12],[-15,72],[-3,11]],[[7509,1886],[19,6],[23,7]],[[7497,1781],[-3,12],[-13,61],[-1,7],[0,2],[1,2]],[[7481,1865],[1,2],[1,11],[9,3],[17,5]],[[7457,1770],[-5,24],[-5,24],[-7,35],[11,3],[10,3],[20,6]],[[7251,1836],[25,14],[30,16],[35,19],[72,37],[123,85],[22,18],[3,3],[3,2],[1,1]],[[7176,528],[-9,21],[-1,5],[-8,17],[-1,5],[-8,18],[-3,8],[2,5],[15,17],[12,15],[17,17],[12,9],[15,9],[16,9],[-16,43],[14,16],[15,14]],[[7248,756],[34,-22],[5,-6],[7,-11],[24,-53]],[[7088,679],[20,8],[29,17],[38,29],[1,0],[47,51],[2,2]],[[7225,786],[0,-1],[5,-7],[5,-5],[13,-17]],[[7083,693],[36,18],[24,16]],[[7143,727],[-15,-12],[-45,-22]],[[7225,786],[37,40]],[[7262,826],[1,-1],[12,-9],[8,-6],[7,-4],[65,-42]],[[7355,764],[-6,-10],[-5,-8],[-2,-1],[-6,-6],[-8,-4],[12,-27],[12,-30]],[[7355,764],[33,-21],[11,-7]],[[7399,736],[-9,-20],[-9,-20]],[[7445,731],[-9,-19]],[[7436,712],[-37,24]],[[7355,764],[9,19],[17,-11],[15,-10],[10,19]],[[7406,781],[48,-30],[-9,-20]],[[7436,712],[13,-7],[20,-14]],[[7445,731],[18,-11],[25,55]],[[7488,775],[16,-10]],[[7406,781],[7,18]],[[7413,799],[49,-30],[9,17],[17,-11]],[[7413,799],[10,20]],[[7423,819],[23,-4],[36,-3],[23,-1],[-17,-36]],[[7423,819],[-17,9],[-17,11],[4,8],[5,9]],[[7398,856],[8,-4],[11,-6],[19,-7],[16,-4],[41,-2],[25,-1],[5,-2],[3,-3],[1,-2],[0,-2],[1,-2],[0,-3],[-1,-2],[-1,-5]],[[7398,856],[0,2],[1,1],[5,11],[7,16],[4,18]],[[7415,904],[66,-17]],[[7481,887],[66,-18]],[[7415,904],[4,21],[4,22],[5,21],[66,-18]],[[7494,950],[-4,-20]],[[7490,930],[-5,-22],[-4,-21]],[[7501,993],[-4,-21],[-3,-22]],[[7415,904],[-48,12],[-12,6],[-2,1]],[[7353,923],[14,13],[71,76]],[[7684,2843],[-14,-11],[-9,-7]],[[7661,2825],[-6,-2],[-11,-6],[-11,-9]],[[7633,2808],[-29,21],[-31,22],[-11,7],[-9,8]],[[7553,2866],[12,18],[19,-12],[4,-3],[21,3],[3,2],[2,4],[2,4],[4,5],[6,-1],[8,-6]],[[7634,2880],[50,-37]],[[7727,2937],[-5,-7],[-8,5],[-9,-1],[-11,-6],[-7,-9],[-6,-12],[-13,9],[-11,7],[-11,-22],[-12,-21]],[[7553,2866],[-4,2]],[[7579,2979],[13,-8],[9,14],[8,14]],[[7609,2999],[15,-8],[16,-8],[14,-7],[18,-10],[25,-13],[30,-16]],[[7745,2927],[-15,-22],[-16,-23],[-14,-20],[-16,-19]],[[7727,2937],[18,-10]],[[7866,3000],[-19,18]],[[7847,3018],[15,20],[8,11]],[[7870,3049],[12,-12],[3,-3],[3,-2]],[[7888,3032],[-8,-11],[-3,-5],[-4,-6],[-7,-10]],[[7891,2976],[-7,6],[-2,3],[-7,7],[-2,1],[-7,7]],[[7888,3032],[8,-9],[8,-7],[9,-10]],[[7913,3006],[-11,-15],[-11,-15]],[[7911,2957],[-20,19]],[[7913,3006],[10,-9],[2,-1],[7,-7]],[[7932,2989],[-1,-2],[-6,-10],[-8,-10],[-1,-1],[-4,-6],[-1,-3]],[[7952,2919],[-3,3],[-6,7],[-9,9],[-8,6],[-3,1],[-12,12]],[[7932,2989],[0,3],[7,8],[9,13],[6,10],[14,-14]],[[7968,3009],[-5,-7],[-2,-2],[-9,-13],[-6,-8],[-2,0],[-2,0],[4,-2],[24,-24],[1,-1],[1,-2]],[[7972,2950],[-1,-2],[-9,-15],[-10,-14]],[[7968,3009],[12,-11],[8,-7],[2,-2],[1,-1],[1,-2]],[[7992,2986],[-8,-16],[-12,-20]],[[8023,3038],[-16,-27],[-15,-25]],[[7913,3006],[24,34],[14,20],[14,20]],[[7965,3080],[11,-8],[5,-3],[23,-17],[4,-5],[7,-5],[5,-1],[3,-3]],[[7888,3032],[5,7],[10,13],[2,3],[0,1],[6,8]],[[7937,3101],[18,-14],[10,-7]],[[7847,3018],[-13,13]],[[7834,3031],[18,35],[20,37]],[[7894,3081],[-7,-9],[-17,-23]],[[7830,3205],[-10,-19],[-5,-11],[-4,-6],[-22,-45]],[[7789,3124],[-7,3],[-4,0],[-7,-2],[-5,-2],[-8,-6],[7,10],[4,6],[2,5],[33,70]],[[7804,3208],[3,-2],[6,11],[17,-12]],[[7804,3208],[4,17],[5,24],[2,7]],[[7815,3256],[32,71],[9,19],[12,23],[15,26]],[[7883,3395],[49,-39],[-2,-4],[-18,-22]],[[7912,3330],[-13,-21]],[[7899,3309],[-17,-24]],[[7882,3285],[-19,-27]],[[7863,3258],[-17,-27],[-16,-26]],[[7900,3152],[-29,22],[-6,5]],[[7865,3179],[-35,26]],[[7863,3258],[39,-30],[8,-7],[21,-16]],[[7931,3205],[-9,-16],[-8,-12],[-7,-12],[-7,-13]],[[7887,3131],[-25,-3],[-12,-2],[-13,-1]],[[7837,3125],[18,41],[2,0],[8,13]],[[7900,3152],[-13,-21]],[[8242,2339],[-19,-40]],[[8223,2299],[-17,10],[-11,7],[-36,24],[-2,0],[-4,-2],[-4,-1],[-7,-3],[-9,-5],[-2,-1]],[[8131,2328],[-10,27],[-3,8],[-1,3],[0,4],[2,21],[1,9]],[[8223,2299],[-11,-29]],[[8212,2270],[-4,1],[-31,2],[-9,-5],[-10,-4],[0,-2]],[[8158,2262],[-6,13],[0,1],[-14,34],[-4,10],[-2,5],[-1,3]],[[8203,2195],[-14,8],[-10,4]],[[8179,2207],[3,1],[17,29],[13,33]],[[8149,2209],[2,53],[7,0]],[[8179,2207],[-9,0],[-21,2]],[[8124,2160],[3,51]],[[8127,2211],[22,-2]],[[8191,2174],[-1,-4],[-1,-6],[0,-9]],[[8127,2211],[3,52],[-21,2]],[[8109,2265],[2,60],[0,2],[10,-1],[6,0],[2,1],[2,1]],[[8084,2214],[3,53]],[[8087,2267],[22,-2]],[[8127,2211],[-22,1],[-21,2]],[[8087,2267],[3,57],[0,5],[-7,9],[1,2],[-6,13],[-4,18],[-1,5],[-4,14],[3,3],[9,5],[9,0],[9,1],[21,1]],[[8103,2161],[-22,2]],[[8081,2163],[3,51]],[[6842,3392],[17,-12],[-33,-63],[-1,-4]],[[6825,3313],[-17,13]],[[6808,3326],[34,66]],[[6766,3248],[42,78]],[[6825,3313],[0,-4],[-41,-75]],[[6784,3234],[-18,14]],[[6752,3369],[17,-12]],[[6769,3357],[3,-3],[1,-2],[13,-10]],[[6786,3342],[2,-2],[2,-2],[1,0],[11,-8],[2,-2],[2,-2],[2,0]],[[6766,3248],[-19,13]],[[6747,3261],[-38,29],[-15,11]],[[6694,3301],[39,74],[16,-11],[2,3],[1,2]],[[6769,3357],[15,8],[39,73],[15,2]],[[6838,3440],[-52,-98]],[[6957,3427],[-9,-23],[-34,-65]],[[6914,3339],[-10,6],[-9,7]],[[6895,3352],[38,72],[6,16]],[[6957,3427],[21,-15],[4,0]],[[6982,3412],[-12,-22],[-12,-22],[-12,-22]],[[6946,3346],[-12,-23]],[[6934,3323],[-2,2],[-18,14]],[[6984,3317],[-38,29]],[[6982,3412],[21,1]],[[7003,3413],[-5,-16],[-11,-20],[21,-16],[-12,-22],[-12,-22]],[[6984,3317],[-11,-21]],[[6973,3296],[-17,13]],[[6956,3309],[-18,13],[-4,1]],[[6950,3253],[-15,11],[0,5],[19,37],[2,3]],[[6973,3296],[-1,-3],[-22,-40]],[[6973,3296],[21,-16]],[[6994,3280],[-1,-3],[-22,-40],[-21,16]],[[7010,3266],[-23,-42]],[[6987,3224],[-14,-24]],[[6973,3200],[-35,30]],[[6938,3230],[12,23]],[[6994,3280],[13,-9],[3,-5]],[[6938,3230],[-16,11]],[[6922,3241],[-18,13]],[[6904,3254],[5,13],[13,34],[12,22]],[[6904,3254],[-2,2],[-8,6],[-15,11]],[[6879,3273],[6,11],[29,55]],[[6861,3286],[1,3],[33,63]],[[6879,3273],[-15,11]],[[6864,3284],[-3,2]],[[6904,3254],[-41,-78]],[[6863,3176],[-3,2],[-8,6],[-10,7]],[[6842,3191],[-20,15]],[[6822,3206],[42,78]],[[6880,3163],[-17,13]],[[6922,3241],[-42,-78]],[[6973,3200],[-41,-76]],[[6932,3124],[-33,26]],[[6899,3150],[-19,13]],[[7003,3413],[17,1]],[[7020,3414],[20,-15],[4,-3],[26,-19]],[[7070,3377],[-25,-45],[-35,-66]],[[7145,3353],[-36,-67],[-37,-66]],[[7072,3220],[-13,10],[-49,36]],[[7070,3377],[14,24]],[[7125,3172],[-5,4],[-12,12],[-3,2]],[[7105,3190],[-15,15]],[[7090,3205],[38,68],[32,59]],[[7020,3414],[14,24],[16,30]],[[6939,3671],[-44,-81]],[[6895,3590],[-11,8],[-8,6],[-17,13],[-9,7],[-3,3]],[[6847,3627],[9,17],[21,39],[5,13],[2,2]],[[6884,3698],[2,-2],[9,-7],[2,-1],[2,-2],[6,-6],[11,-2],[23,-7]],[[6939,3671],[25,-7]],[[6964,3664],[-18,-6],[-9,-15],[-29,-51],[-13,-2]],[[6964,3664],[-7,-12],[-20,-37],[-24,-44]],[[6913,3571],[-7,11],[-11,8]],[[6964,3664],[10,-4],[12,-9]],[[6986,3651],[-7,-12],[-49,-92]],[[6964,3664],[9,17],[19,27],[15,27]],[[7007,3735],[12,21],[11,-7]],[[7030,3749],[6,-6],[-34,-64]],[[6939,3671],[17,30],[9,15],[10,13],[6,6],[4,5],[3,3],[4,1],[3,-1],[4,-2],[8,-6]],[[7035,3759],[-5,-10]],[[6884,3698],[19,32]],[[6903,3730],[13,-6],[20,-9],[7,-4],[14,24],[7,17],[19,31],[5,10]],[[6988,3793],[2,-2],[38,-26],[3,-2],[4,-4]],[[7070,3733],[-6,-11],[-2,2],[-5,-1],[-4,-3],[-4,-2],[-3,-4],[-3,-5],[-5,-9],[-3,-5],[-5,-8],[-3,-8],[0,-4]],[[7035,3759],[35,-26]],[[8081,2163],[-2,-35]],[[8079,2128],[-22,0],[-21,1],[-22,2],[3,44],[-41,3],[-4,-4],[-6,-7],[-20,2],[-4,-35],[-15,1]],[[7927,2135],[44,128],[29,53],[24,40],[-5,4],[-25,-41],[-28,-53],[-47,-130]],[[7919,2136],[-2,0],[0,-1],[-10,-38],[0,-1],[0,-2],[-1,-2],[0,-2],[0,-17],[0,-3],[0,-2],[-1,-3],[0,-4],[-1,-8],[-2,-19],[0,-2]],[[7902,2032],[-2,0],[-2,0],[-2,0],[-4,0],[-3,0],[-28,2],[-31,2]],[[7607,2083],[3,3],[4,3],[2,1],[2,2],[2,1],[4,3],[21,15],[20,14],[52,18],[5,1],[5,2],[44,32],[2,2],[2,0],[3,1],[4,3],[7,1],[7,3],[4,3],[5,4],[5,4],[9,7],[8,7],[6,6],[1,3],[-1,2],[1,3],[0,3],[5,4],[1,4],[3,2],[3,3],[2,3],[2,2],[13,18],[11,13],[2,3],[1,3],[2,1],[2,-2],[-1,-3],[2,-1],[2,1],[2,0],[16,25],[2,11],[5,10],[54,97],[5,8],[3,5],[0,3],[1,5],[3,5],[2,4],[2,3],[2,3],[1,2],[3,3],[3,1],[2,3],[19,27],[2,2],[20,28]],[[8031,2526],[7,-14],[3,-12],[9,-41],[6,-8]],[[8056,2451],[1,-11],[0,-2],[3,-13],[31,5],[30,7]],[[7613,2099],[-2,1],[-3,4]],[[7608,2104],[1,2],[27,24],[3,4],[1,2],[1,1],[1,5],[3,16],[2,10],[1,14],[1,4],[2,17],[2,10],[3,15]],[[7656,2228],[27,17],[15,10],[2,3],[6,10]],[[7706,2268],[17,-13]],[[7723,2255],[6,-5],[10,-8]],[[7739,2242],[11,-6],[1,-1],[1,-1],[1,-3],[13,-23],[6,-13]],[[7772,2195],[-3,-1],[-49,-33],[-3,-3],[-5,-4],[-27,-11],[-7,0],[-9,-3],[-18,-10],[-18,-12],[-17,-16],[-3,-3]],[[7790,2307],[-13,-23],[-8,7],[-23,-39],[-3,-6],[-3,-3],[-1,-1]],[[7723,2255],[6,10],[17,31],[18,31]],[[7764,2327],[9,-6],[9,-7],[8,-7]],[[7706,2268],[-4,2],[-6,5],[-2,2],[-6,5],[-9,7],[-9,6]],[[7670,2295],[24,41],[18,32],[17,-13],[9,-7],[9,-7]],[[7747,2341],[9,-7],[8,-7]],[[7794,2428],[-10,-18],[-5,-9],[-1,-1],[-4,-9]],[[7774,2391],[-10,-18],[-1,-3],[-4,-6],[-4,-8],[-8,-15]],[[7670,2295],[-7,4],[-5,3],[-11,8]],[[7647,2310],[-3,1],[-2,2]],[[7642,2313],[1,1],[45,42],[18,17]],[[7706,2373],[26,23],[5,4],[16,19],[18,21]],[[7771,2440],[5,-4],[10,-7],[8,-1]],[[7774,2391],[50,-38]],[[7824,2353],[13,-10],[-11,-18],[-13,10],[-5,-9],[-5,-8],[-8,-14],[-5,3]],[[7794,2428],[21,-17],[5,-3],[25,-19]],[[7845,2389],[-10,-18],[-6,-9],[-5,-9]],[[7845,2389],[20,-15],[8,-8],[20,-20],[6,-4]],[[7899,2342],[-2,-2],[-7,-11],[-1,-3],[-3,1],[-17,-31],[-19,-28],[-11,-12],[-32,-33],[-35,-27],[0,-1]],[[7845,2389],[11,18],[9,16],[-54,41],[4,8],[0,3],[5,9],[2,2],[4,9],[-17,12]],[[7809,2507],[12,19]],[[7821,2526],[18,-15],[9,8],[14,13],[4,3]],[[7866,2535],[9,-9],[-7,-11],[13,-18],[12,-12],[8,-2],[9,15]],[[7910,2498],[33,-26],[12,15],[11,16],[13,16]],[[7979,2519],[5,5],[3,4],[1,2],[8,10],[4,4],[11,12]],[[8022,2541],[-17,-23],[-4,-6],[-2,-2],[-8,-10],[-7,-10],[-8,-11],[-10,-19],[-2,-3],[-14,-24],[-32,-56],[-18,-32],[-1,-3]],[[7742,2464],[-14,13],[-14,14],[-9,9],[-20,19]],[[7685,2519],[6,8],[5,7]],[[7696,2534],[28,-27],[11,15],[11,15]],[[7746,2537],[17,24],[5,7]],[[7768,2568],[7,-6],[11,-8],[35,-28]],[[7809,2507],[-16,-13],[-13,-6],[-18,-11],[-20,-13]],[[7696,2534],[5,7],[3,5],[7,8],[6,7],[20,-16],[9,-8]],[[7685,2519],[-11,10]],[[7674,2529],[32,39],[43,49],[3,3],[2,2],[2,3],[7,8],[2,2],[2,2],[1,1],[25,27],[7,7],[11,-8],[5,-5],[4,-3]],[[7820,2656],[-11,-18],[-10,-18],[-5,-8],[-5,-9],[-10,-18],[-11,-17]],[[6826,3110],[-35,-67]],[[6791,3043],[-2,1],[-19,14]],[[6770,3058],[36,66]],[[6806,3124],[18,-13],[2,-1]],[[6770,3058],[-20,15],[-19,14]],[[6731,3087],[36,66]],[[6767,3153],[19,-14]],[[6786,3139],[20,-15]],[[6712,3101],[36,67]],[[6748,3168],[19,-15]],[[6731,3087],[-19,14]],[[6694,3114],[36,67]],[[6730,3181],[18,-13]],[[6712,3101],[-18,13]],[[6675,3128],[36,67]],[[6711,3195],[19,-14]],[[6694,3114],[-19,14]],[[6657,3142],[36,67]],[[6693,3209],[18,-14]],[[6675,3128],[-18,14]],[[6694,3301],[-8,-13],[-9,-8],[-23,-43]],[[6654,3237],[-34,-62],[19,-14],[-3,-4]],[[6636,3157],[-3,4],[-15,11],[-12,9],[-40,29],[-4,3]],[[6562,3213],[3,4],[0,1],[7,11],[5,5],[14,26],[19,36]],[[6676,3426],[1,-1],[2,-2],[3,-2],[11,-8],[9,-6],[18,-14]],[[6720,3393],[3,-2],[26,-20],[3,-2]],[[6747,3261],[-36,-66]],[[6693,3209],[-20,14],[-19,14]],[[6766,3248],[-36,-67]],[[6784,3234],[-36,-66]],[[6784,3234],[19,-14],[-36,-67]],[[6822,3206],[-36,-67]],[[6825,3313],[20,-15],[16,-12]],[[6842,3191],[-36,-67]],[[6863,3176],[-37,-66]],[[6844,3096],[-18,14]],[[6880,3163],[-36,-67]],[[6899,3150],[-36,-68]],[[6863,3082],[-19,14]],[[7981,3106],[-13,11],[-22,17],[-1,0],[-29,-19]],[[7931,3205],[3,5],[13,24],[15,25]],[[7962,3259],[14,23]],[[7976,3282],[14,24]],[[8063,3245],[-13,-23],[-14,-23],[-15,-25],[-13,-23],[-13,-21],[-14,-24]],[[7981,3106],[-16,-26]],[[8076,2997],[-2,2],[-3,2]],[[8071,3001],[-4,3],[-2,2],[-1,0],[-3,3],[-4,2],[-34,27]],[[8186,3142],[-4,-3],[-13,-17],[-1,-4],[-18,-22],[-11,-15]],[[8139,3081],[-19,-26],[-12,-16],[-2,-1],[-6,-10],[-6,-8],[-3,-4],[-15,-19]],[[8178,2916],[-11,10],[-45,34]],[[8122,2960],[15,26],[11,18],[11,19]],[[8159,3023],[21,-15],[17,-13],[-13,-24],[16,-12]],[[8200,2959],[-8,-16],[-14,-27]],[[8129,2916],[-23,16]],[[8106,2932],[16,28]],[[8037,2814],[17,25],[13,24],[13,22]],[[8080,2885],[8,16],[4,7],[14,24]],[[8080,2885],[-18,14],[-7,5],[-16,13],[-14,12],[15,20]],[[8040,2949],[13,-10],[4,-3],[18,-14],[5,10],[3,6],[5,9],[3,-3],[15,-12]],[[7053,2576],[-3,1],[-2,1],[-72,54],[-7,5]],[[6987,2670],[78,-58],[3,-3],[2,-2]],[[6987,2670],[1,2],[4,-1],[18,34],[13,8]],[[6942,2703],[2,3],[9,18],[6,13],[1,5]],[[6960,2742],[6,13]],[[1046,2541],[-5,-4],[-22,-21],[-5,-5],[-14,-15],[-2,-2],[-2,-2],[-2,-3],[-6,-6],[2,-10]],[[990,2473],[-17,21],[-4,1],[-2,0],[-13,-4],[-10,-5],[-3,-12],[-4,-2],[-7,10],[-1,13],[-8,10],[-4,6],[-2,1],[-2,0],[-3,1],[-9,-3],[-7,-1],[-10,-7],[0,-8],[-2,0],[-7,0],[-4,-7],[-1,-5],[-2,-7],[-5,-8],[-5,-11],[-9,2],[-7,4],[-9,3],[-7,5],[-9,0],[-18,-4],[-5,-2],[-3,-5],[-13,-5],[-4,-1],[-7,1],[-6,3],[-3,0],[-5,-2],[-4,1],[-13,-4],[-17,0],[-13,-6],[-3,-3],[-20,-6],[1,-4],[0,-2],[-12,2],[-7,-3],[-22,10],[-3,4],[-1,7],[1,5],[0,10],[15,41],[10,21],[5,7],[5,10],[7,9],[6,4],[9,5],[9,3],[2,-2],[4,-8],[3,1],[5,-2],[6,-5],[1,0],[4,4],[9,3],[5,5],[8,5],[3,5],[2,10],[3,20],[0,5],[-1,10],[-1,6],[-2,3],[-7,10],[-9,4],[-12,-5],[-9,-5],[0,-3],[-6,-1],[-5,1],[-4,8],[5,5],[4,8],[3,9],[0,10],[-5,16],[-1,4],[-10,11],[-10,1],[-5,-1],[-2,-1],[-3,-6],[-4,-17],[-2,-2],[-15,-6],[-5,1],[-3,4],[0,7],[3,5],[-1,8],[0,4],[2,5],[2,2],[6,3],[18,-3],[5,-1],[9,2],[6,1],[2,27],[2,10],[0,12],[-3,15],[1,11],[4,19],[9,21],[2,8],[3,4],[2,11],[0,25],[0,5],[5,18],[3,0],[12,20],[7,9],[7,5],[10,12],[6,5],[2,7],[4,7],[9,16],[3,1],[1,1],[1,-1],[1,-7],[2,-3],[5,1],[16,27],[3,8],[3,8],[2,12],[4,3],[2,2],[4,1],[3,0],[17,1],[4,1],[6,4],[4,4],[2,4],[3,3],[3,0],[1,-6],[2,-6],[3,-4],[5,-2],[14,0],[7,2],[2,2],[3,1],[15,5],[13,9],[5,2],[19,-4],[14,0],[8,2],[5,7],[9,16],[10,15],[16,36],[7,18],[6,16],[7,19],[10,17],[1,1],[7,15],[5,16],[7,15],[4,7],[3,3],[11,4],[14,5],[10,9],[12,6],[27,8],[10,11],[7,7],[4,0],[8,0],[6,-4],[12,-2],[5,0],[5,-6],[3,-1],[6,-1],[6,2],[16,12],[5,8],[9,21],[4,15],[3,19],[4,15],[1,7]],[[1274,3378],[9,-11],[23,-32],[4,-5]],[[1310,3330],[-15,-33],[-2,-4],[-7,-11],[-3,-6],[-6,-10],[-6,-10],[-3,-4],[-3,-3],[-3,-2],[-2,-2],[-3,-3],[-5,-2],[-7,-5],[-20,-12],[-9,-6],[-3,-2],[-3,-1],[-3,-1],[-1,-1],[-4,-1],[-8,-2],[-10,-3],[-2,3],[-5,7],[-18,28],[-1,2],[-1,1],[-1,0],[-2,0],[-1,1],[-1,0],[-7,-2],[-8,-1],[-1,-1],[-1,-1],[0,-1],[0,-1],[0,-1],[0,-1],[1,-2],[14,-21],[9,-14],[2,-3],[-2,-1],[-2,-1],[-2,-2],[-3,-2],[-3,-3],[-6,-5],[-5,-5],[-5,-5],[-14,-15],[-7,-7],[-4,-4],[-5,-8],[-3,-3],[-10,-12],[-10,-11],[-12,-12],[-7,-8],[-7,-9],[-6,-10],[-6,-9],[-13,-18],[-11,-14],[-13,-19],[-3,-4],[-6,-6],[-5,-5],[-7,-6],[-5,-4],[-7,-4],[-9,-5],[-17,-10],[-9,-4],[-11,-5],[-7,-3],[-10,-5],[-10,-5],[-13,-6],[-7,-3],[-21,-10],[-18,-8],[-5,-4],[-4,-3],[-7,-6],[-9,-10],[-4,-4],[-2,-2],[-2,-4],[-1,-3],[5,-8],[7,-13],[10,-15],[6,-9],[14,-20],[9,-14],[10,-14],[12,-18],[16,-24],[20,-29],[11,-17],[35,-46],[13,-17],[11,-13],[7,-11],[18,-26],[28,-40],[8,-12]],[[2002,2744],[4,-14],[4,3],[8,3],[8,-2],[7,-7],[0,-13],[-3,-10],[-12,-21],[0,-5],[1,-4],[3,-1],[2,3],[3,-1],[1,-5],[-8,-16],[-4,-1],[-4,1],[-10,-2],[-10,0],[-9,-8],[-2,4],[-6,12],[1,40],[1,10],[2,8],[4,10],[7,10],[5,7],[7,-1]],[[1961,2688],[-5,15],[1,6],[-4,1],[-2,2],[-2,1],[-1,1],[-1,2],[-4,4],[-2,4],[-2,2],[-2,3],[-3,5],[-3,4],[-1,2],[-2,2],[-2,2],[-3,3],[-2,2],[-7,8]],[[1914,2757],[7,7],[2,3],[8,8],[16,19]],[[1947,2794],[6,6]],[[1953,2800],[11,-16],[6,-9],[8,-8]],[[1978,2767],[-3,-10],[-3,-12],[0,-8],[0,-7],[-3,-6],[-8,-10],[-2,-9],[3,-10],[-1,-7]],[[6932,3124],[-36,-67]],[[6896,3057],[-4,3],[-29,22]],[[6860,2991],[-4,3],[-29,22]],[[6827,3016],[36,66]],[[6896,3057],[-5,-9],[-4,-8],[-5,-9],[-4,-7],[-5,-9],[-4,-8],[-4,-7],[-5,-9]],[[6932,3124],[24,-17]],[[6956,3107],[-36,-67]],[[6920,3040],[-24,17]],[[6941,3024],[-21,16]],[[6956,3107],[21,-15]],[[6977,3092],[-36,-68]],[[6978,2997],[-19,14],[-18,13]],[[6977,3092],[19,-15]],[[6996,3077],[19,-13],[-37,-67]],[[6996,3077],[40,76]],[[7036,3153],[19,-14]],[[7055,3139],[33,-24]],[[7088,3115],[-40,-75],[-26,-48],[-16,12],[-11,-19],[-17,12]],[[6956,3107],[40,76]],[[6996,3183],[22,-16],[18,-14]],[[6973,3200],[23,-17]],[[7050,3177],[-14,-24]],[[6987,3224],[63,-47]],[[7072,3220],[-22,-43]],[[7068,3164],[-13,-25]],[[7072,3220],[18,-15]],[[7090,3205],[-22,-41]],[[7105,3190],[-21,-38],[-16,12]],[[7119,3092],[-31,23]],[[7152,3149],[-8,-15],[-11,-18],[-14,-24]],[[7145,3082],[-3,1],[-3,1],[-7,2],[-13,6]],[[7169,3135],[3,-2],[9,-7]],[[7181,3126],[-18,-32],[12,-10]],[[7175,3084],[-10,-3],[-11,-1],[-2,0],[-7,2]],[[7181,3126],[18,-16],[19,-16]],[[7218,3094],[-12,0],[-15,-3],[-16,-7]],[[8079,2128],[-2,-39]],[[8077,2089],[-22,1],[-22,2]],[[8033,2092],[-21,2],[-22,1]],[[7990,2095],[-21,1],[-21,2],[-5,-70]],[[7943,2028],[-21,2],[-6,0]],[[7916,2030],[0,5],[4,65],[5,29],[2,6]],[[7908,2031],[-6,1]],[[7919,2136],[-2,-6],[-5,-25],[-2,-28],[-3,-38],[1,-4],[0,-4]],[[7990,2095],[-3,-70]],[[7987,2025],[-23,1],[-21,2]],[[7902,2032],[0,-18],[0,-12],[5,-30]],[[7997,1801],[-66,6],[-4,4],[0,8],[-11,0]],[[7916,1819],[5,34],[3,47],[-2,10],[0,1]],[[7922,1911],[17,0],[63,-5]],[[8002,1906],[-1,-27],[-1,-19]],[[8000,1860],[-1,-19]],[[7999,1841],[-2,-19]],[[7997,1822],[0,-21]],[[7906,1819],[-4,0]],[[7912,1912],[1,0]],[[7913,1912],[0,-3],[0,-2],[-3,-57],[-4,-31]],[[7997,1801],[-2,-23]],[[7995,1778],[0,-9],[-1,-18]],[[7994,1751],[-1,-9]],[[7993,1742],[-86,6],[-12,4]],[[7895,1752],[2,5],[5,12],[13,48],[1,2]],[[7886,1756],[-3,1]],[[7906,1819],[-1,-2],[-13,-47],[-6,-14]],[[2358,2080],[-34,-33],[-17,-16],[-30,-30],[2,-10],[0,-1],[-18,-17],[-20,-19],[-7,-7],[-18,-17],[-8,-8]],[[2208,1922],[-3,6],[-3,4],[-7,14],[-2,2],[-3,6],[-8,10]],[[2182,1964],[29,30],[56,50],[38,47],[14,25],[59,80]],[[2378,2196],[13,17]],[[2391,2213],[3,-3],[4,-4],[9,-9],[2,-1],[29,-40],[-15,-14],[-45,-44],[-1,0],[-1,0],[-1,0],[-1,0],[0,1],[-3,4],[-9,-5],[-10,-10],[6,-8]],[[2182,1964],[-4,4],[-2,3],[-5,6],[-9,9],[-12,10]],[[2150,1996],[5,5],[25,27]],[[2180,2028],[23,20],[14,14],[13,15],[7,10],[12,18],[4,8],[5,14],[9,27]],[[2267,2154],[17,-12]],[[2284,2142],[19,-15],[5,-5],[15,19],[13,17],[35,45],[7,-7]],[[3488,1518],[22,10],[19,8],[19,7],[20,7],[20,8],[13,6],[20,5]],[[3621,1569],[34,8],[36,8]],[[3693,1577],[-11,-2],[-2,-2],[-27,-5],[-34,-8],[-39,-12],[-36,-13],[-49,-20],[-4,-2],[-33,-16],[-4,-2],[-29,-15],[-30,-15],[-37,-20],[-1,-1],[-35,-15],[-17,-10],[-31,-15],[-26,-13],[-29,-15],[-4,-1]],[[3215,1375],[-3,-2]],[[3212,1373],[-2,7],[-17,67]],[[3193,1447],[-13,53],[-17,66]],[[3163,1566],[4,1]],[[3167,1567],[7,2],[3,0],[7,2],[6,3],[14,12],[41,34],[9,8],[0,14],[0,10]],[[3254,1652],[88,75]],[[3342,1727],[28,23],[26,22],[26,21]],[[3422,1793],[1,-5],[24,-100],[22,-89]],[[3469,1599],[-11,-4],[-2,-1],[-2,-2],[-1,-2],[-1,-3],[-4,-6],[-22,-13],[-2,-4],[-6,-4],[-28,-14],[-6,-3],[-6,-5],[-9,-8],[-2,-3],[5,-15],[4,-19],[1,-1],[2,-1],[1,0],[32,17],[9,-23],[3,2],[41,21],[9,4],[14,6]],[[3469,1599],[19,-81]],[[2331,3626],[5,-20],[-14,-7],[-13,-13],[-12,-8],[-9,-3],[-1,-4],[15,-24],[-4,-13]],[[2298,3534],[-7,11],[-6,9],[-1,0],[-1,0],[-1,-1],[-11,-10],[-12,-11],[-2,-2],[-8,-6],[-11,-9],[-6,-2],[-10,15],[-17,27],[2,11],[-1,12],[-1,10],[-5,4],[-2,1],[-12,3],[-11,-5],[-17,-20],[-1,-4],[-17,-11],[-19,-9],[-21,-7],[-8,-4],[-8,-5],[-5,-6],[-1,-5],[0,-6],[1,-11],[1,-8],[0,-1],[0,-2],[1,-3],[0,-2],[1,-4],[2,-3],[2,-4],[3,-4],[5,-3],[6,-3],[3,-1],[4,0],[7,0],[8,1],[10,0],[6,1],[17,-1],[4,0]],[[2159,3466],[-1,-8],[-1,-8],[-1,-10],[-1,-4],[-3,-5],[-2,-2],[-10,-10],[-19,-18],[-13,-12],[-10,-9],[-7,-6],[-1,-1],[-1,-2],[0,-1],[0,-1],[0,-1],[1,0],[14,-20]],[[2104,3348],[-28,0],[-19,-2],[-6,-23],[4,-6],[15,-9],[0,-20],[27,-42],[-17,-41],[-12,-35],[8,-27]],[[2076,3143],[-30,18],[1,1],[5,14],[3,6],[-25,14],[-6,3],[-4,2],[-3,1],[-3,1],[-2,0],[-2,0],[-3,0],[-19,-2]],[[1988,3201],[0,2],[-1,4],[0,13],[0,15],[-1,19],[-2,0],[-1,0],[0,1],[-1,1],[0,1],[0,1],[0,1],[1,0],[3,38],[6,14],[4,11],[-45,71],[-204,386]],[[1747,3779],[3,2],[3,1],[3,2],[17,12],[17,12],[14,9],[2,1],[3,3],[3,1],[2,2],[3,3],[2,2],[6,5],[22,21],[7,7],[3,2],[2,3],[4,2],[3,3],[7,6],[6,4],[10,6],[9,5],[2,1],[4,2],[3,2],[3,0],[4,1],[9,-1],[5,0],[8,0],[5,1],[23,-1],[0,-8],[1,-12],[0,-3],[1,-2],[1,-3],[18,-27],[11,-16],[6,-9],[4,-6],[19,-28],[1,-2],[1,0],[1,0],[1,-1],[2,0],[1,1],[1,1],[12,12],[16,14],[11,9],[6,6],[9,9],[6,6],[-2,3],[-6,9],[-3,4],[-3,4],[-5,7],[-2,5],[-1,1],[0,1],[-1,2],[-1,3],[-2,8],[-1,5],[6,-2],[8,-2],[10,-3],[5,-2],[5,-1],[2,-4],[5,-9],[4,-7],[6,-8],[5,-7],[4,-6],[14,-21],[4,-6],[6,-10],[5,-6],[12,12],[13,13],[8,7],[13,-20],[7,-11],[7,-9],[13,-18],[12,-17],[2,-2],[14,-17],[12,-19],[26,-37],[9,-12],[14,-20],[14,-21]],[[2298,3534],[5,-6],[9,-14],[5,-6],[3,-4],[3,-2],[6,-6],[-2,-3],[-2,-7],[-2,-4],[-3,-6],[-2,-5],[-2,-6],[-7,-15],[-1,-3],[-1,-3],[-1,-2],[-1,-3],[-2,-7],[0,-3],[-1,-1],[-1,-7],[0,-8],[-1,-4],[-1,-17],[-1,-6],[-1,-3],[-1,-3],[-1,-2],[-1,-2],[-2,-4],[-3,-3],[-5,-4],[-18,-10],[-1,-1],[-1,-1],[-2,-1],[-2,-2],[-2,-2],[-2,-2],[-1,-2],[-1,-2],[0,-2],[-1,-1],[0,-2],[-1,-3],[-1,-8],[0,-6]],[[2251,3320],[-7,0],[-2,0],[-1,0],[-2,1],[-1,1],[-1,1],[-11,16],[-2,3],[-2,1],[-3,3],[-4,3]],[[2215,3349],[2,5],[4,8],[4,6],[1,2],[1,1],[1,3],[10,10],[8,9],[-37,54],[-6,7],[-2,2],[-2,2],[-2,1],[-2,1],[-1,0],[-3,1],[-6,1],[-24,3],[-2,1]],[[2164,3320],[0,-1],[13,-20],[-8,-9],[-6,-6],[-9,-9],[-6,-6],[2,-10],[-8,-12],[-10,-14],[-2,-3],[8,-11],[11,4],[12,-6]],[[2161,3217],[-4,-10],[-1,-2],[0,-2],[-2,-5],[0,-1],[-1,-3],[0,-2],[-1,-7],[0,-4],[-1,-5],[-4,-9],[-3,-5],[-3,-5]],[[2141,3157],[-4,3],[-1,0],[-1,1],[-1,0],[-2,1],[-1,0],[-2,0],[-2,0],[-3,0],[-3,-1],[-2,0],[-2,-1],[-3,-2],[-1,-1],[-1,-1],[-1,-1],[0,-1],[-1,-1],[-1,-3],[-2,-3],[-4,-10],[-3,-7]],[[2100,3130],[-24,13]],[[2104,3348],[15,14],[7,-11],[1,-1],[2,-1],[24,-3],[-1,-6],[-2,-18],[14,-2]],[[2259,3137],[-6,-14],[-4,-8],[-9,-13],[-9,-12],[-8,-14],[-3,-3],[-3,-5],[-1,-3],[-4,-5],[-4,-6],[-9,-12],[-7,-7],[-6,-9],[-3,-2],[-5,-7]],[[2178,3017],[-10,14],[-12,18],[-14,20],[4,3],[5,6],[10,10],[5,7],[6,6],[4,4],[-9,13],[-4,5],[-5,9],[-7,9],[-5,7],[-1,1],[-4,8]],[[2161,3217],[10,-4],[3,-4],[2,-2],[0,-1],[0,-1],[-5,-14],[0,-1],[11,-16],[7,-10],[2,-2],[7,-4],[2,3],[1,2],[2,2],[1,2],[3,2],[1,1],[2,1],[2,1],[2,0],[3,1],[3,-1],[2,0],[2,0],[3,-1],[1,-1],[2,-1],[2,-2],[1,0],[1,-1],[1,-1],[1,-1],[2,-5],[1,-2],[5,-8],[2,-3],[4,-3],[9,-6]],[[2139,2977],[-3,5],[-12,16],[-7,-7],[-1,-1],[-3,-5],[-2,-3],[-1,-2],[-2,0],[-1,-1],[0,-1],[-1,0],[-1,0],[-1,0],[-1,0],[-1,0],[-2,0],[-1,0],[-2,0],[0,1],[-2,1],[-6,8],[-3,5],[-4,9],[-2,2],[-2,2],[-1,1],[0,1],[-1,0],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[1,0],[0,1],[4,3],[10,8],[-3,7],[0,2],[-1,4],[-1,7],[-2,21],[-1,6],[0,4],[1,6],[0,4],[1,3],[1,5],[1,4],[1,3],[4,8],[4,11],[4,9]],[[2178,3017],[-7,-7],[-5,-6],[-10,-9],[-10,-11],[-7,-7]],[[2139,2977],[-10,-11],[-6,-6],[-8,-8],[-12,-13],[-7,-7]],[[2096,2932],[-6,8],[-8,11],[-18,26],[-12,-10],[-7,-5],[-8,-7],[-7,-8],[-24,35],[-14,20],[-1,1],[-1,0],[-1,0],[-1,-1],[-13,-12],[-13,19]],[[1962,3009],[12,11],[2,2],[12,11],[2,2],[1,1],[2,2],[3,3],[7,6],[8,8],[6,5],[4,4],[8,8],[8,7],[10,12],[1,2],[2,2],[1,2],[2,3],[9,14],[2,3],[2,4],[5,11],[4,9],[1,2]],[[1767,3047],[13,-17],[14,-21],[6,-9],[7,-9],[6,-8],[15,-22],[27,-39],[7,-9]],[[1862,2913],[29,-40],[11,-15],[45,-64]],[[1914,2757],[-3,-4],[-9,-9],[-5,-7],[-3,-2],[-7,-7],[-6,-4],[-17,-15],[23,-33],[13,-19],[3,-3],[31,-45],[1,-1],[0,-1],[0,-2],[-1,-1],[-13,-12],[-18,26],[-5,6],[-18,26],[-15,21],[-16,23],[-10,-11],[-3,-3],[-4,-6],[-4,-6],[-4,-7],[-5,-8],[-6,-11],[-4,-8],[-2,-3],[6,-7],[47,-67],[0,-2],[0,-1],[-17,-15],[-53,77],[-18,-15],[38,-53],[-15,-14],[-39,56],[-21,-15],[-10,-7],[-8,-6],[-13,-7],[-16,-8],[-14,-6],[-12,-5],[-15,-7],[-24,-10],[-14,-6],[-36,-17],[-55,-26],[-13,-5],[-9,-3],[-12,-3],[-23,-6],[-30,-7],[-10,-2],[-5,-2],[-9,-3],[-9,-3],[-6,-2],[-4,-2],[-8,-4],[-7,-3],[-5,-3],[-4,-3],[-6,-4],[-6,-4],[-12,-8],[-10,-8],[-7,-4],[-6,-3],[-10,-3],[-5,-2],[-11,-3],[-8,-2],[-7,-2],[-7,0],[-25,0],[-8,-1],[-6,0],[-6,-2],[-5,-2],[-5,-3],[-6,-3],[-7,-5],[-4,-3],[-5,-1],[-4,0],[-4,0],[-6,2],[-5,3],[-4,3],[-11,15],[-21,31],[-39,56],[-16,23],[-31,45],[-5,7]],[[1310,3330],[17,-21],[-20,-25],[12,-29],[162,112],[15,56]],[[1496,3423],[20,-29],[13,-20],[25,-35],[17,-25],[12,-16],[18,-24],[20,-24],[16,-19],[8,-10],[1,-2],[7,-8],[7,-10],[8,-11],[5,-8],[10,-13],[17,-25],[7,-11],[24,-34],[12,-17],[20,-28],[4,-7]],[[7277,1135],[-14,4],[-14,4],[-19,6]],[[7204,1258],[16,18],[0,2],[-1,2],[-11,14],[0,3],[1,3],[11,11],[12,13],[1,1],[8,8],[32,34]],[[7273,1367],[27,-22],[2,-1],[2,0],[1,2],[2,6],[2,10],[6,13],[7,13],[5,9],[4,7],[1,2],[0,1],[-2,4],[-12,12],[-7,6],[-7,6],[-5,5],[-7,5],[-7,7]],[[7399,1492],[-3,-4],[-26,-40],[-50,-76],[-6,-15],[-12,-33],[-14,-54],[-5,-31],[14,-5]],[[6562,3213],[-1,-3],[-3,-5],[-4,-10],[-3,-7],[-19,-35],[-6,-8],[-3,-4],[-28,-37],[-20,-26],[-2,-5],[-6,-7],[-4,-6],[2,-3],[9,-9],[8,-7],[9,-8],[7,-5],[13,-10],[5,-3],[4,-3],[13,-9],[18,-13],[16,-10]],[[6560,2974],[-45,30],[-1,1],[-3,1],[-38,-72]],[[6473,2934],[-43,-74],[-14,-32],[-9,-29],[-5,-23],[-1,-13],[-1,-7],[-1,-26],[0,-3]],[[6399,2727],[2,-134],[0,-2],[0,-4],[0,-4],[0,-2],[0,-2],[0,-3],[0,-3],[0,-2],[0,-2],[0,-4],[0,-11]],[[6401,2554],[-4,3],[-3,2],[-31,22]],[[6363,2581],[-56,44],[-21,-35],[-30,22],[-21,14]],[[5965,2635],[6,39],[1,7],[5,29]],[[5977,2710],[42,255],[57,-64],[58,-57],[23,-33],[12,-14],[1,-2],[2,-2],[1,-1],[2,-2],[1,-1],[2,-2],[1,-2],[2,-2],[2,2],[1,2],[2,2],[1,2],[2,1],[1,1],[1,2],[7,8],[31,36],[5,5],[28,37],[8,10],[2,2],[11,14],[6,8],[9,11],[38,49],[35,45],[28,37],[-16,17]],[[6383,3074],[2,3],[22,28],[2,3],[3,4],[3,4],[14,19],[17,22]],[[6446,3157],[7,8],[33,43],[3,4],[3,4],[2,3],[2,1],[8,6],[13,5],[9,3],[4,1],[3,1],[3,-1],[2,-1],[-5,33],[-1,3],[-20,-5]],[[6512,3265],[-4,19],[-3,21],[-4,20],[-4,21],[-3,20],[-2,9],[-6,4],[-4,7]],[[9002,6235],[-3,-11],[-1,-5],[-2,-3],[-1,-4],[-1,-13],[1,-44],[-1,-29],[-1,-12],[-4,-16],[-5,-16],[-5,-12],[-5,-9],[-6,-9],[-8,-9],[-9,-9],[-13,-13],[-6,-4],[-12,-19]],[[8784,6337],[12,-4],[11,-3],[3,-1],[8,-3],[13,-4],[6,-2],[46,-14],[8,-3],[14,-4],[2,-1],[3,-1],[3,-1],[6,-2],[9,-3],[7,-3],[3,-2],[3,-1],[3,-2],[3,-2],[3,-1],[2,-2],[1,0],[12,-9],[6,-4],[5,-4],[3,-2],[4,-4],[12,-11],[7,-8],[0,-1]],[[6122,3588],[-8,6]],[[6114,3594],[-25,21],[-13,12],[-66,68]],[[6010,3695],[-21,22],[-4,4],[-15,15],[-3,3]],[[5967,3739],[6,8],[6,8],[9,-9],[9,-10],[9,8],[-9,12],[2,3],[30,36],[4,7],[3,15],[2,12],[0,12],[-1,12],[-4,11],[-15,19],[-9,10]],[[6009,3893],[27,33],[10,14],[2,3]],[[6048,3943],[9,-9],[5,-5],[10,-8],[8,-4],[7,-3]],[[6087,3914],[25,-1],[41,0]],[[6153,3913],[0,-4],[0,-15],[1,-36],[-1,-52],[-1,-27],[-2,-13],[-3,-28],[-5,-34],[-17,-99],[0,-6],[-1,-4],[-2,-7]],[[5910,3161],[-16,-2],[-30,-41],[-9,9],[15,19],[-14,15]],[[5856,3161],[29,37],[-1,4],[-11,12],[-3,0],[-14,-19],[-14,15]],[[5842,3210],[21,28],[8,10],[2,3]],[[5873,3251],[30,-32],[14,-14]],[[5917,3205],[-2,-3],[-13,-15],[10,-11],[-2,-15]],[[5778,3715],[-40,42],[-15,17]],[[5723,3774],[27,36],[15,17]],[[5765,3827],[55,-58]],[[5820,3769],[-13,-18],[-14,-18],[-15,-18]],[[2096,2932],[-6,-8],[-9,-9],[-2,-1],[-8,-8],[-7,-5],[-2,0],[-9,-4],[-12,-6]],[[2041,2891],[-9,-5],[-7,-5],[-8,-6],[-6,-7]],[[2011,2868],[-20,25],[-44,64],[-1,0],[-1,1],[-1,0],[-1,0],[-13,-12],[-13,19]],[[1917,2965],[20,21],[9,7]],[[1946,2993],[16,16]],[[2011,2868],[-7,-9],[-5,-6],[-2,-2]],[[1997,2851],[-9,-11],[-7,-7],[-18,-21],[-10,-12]],[[1862,2913],[8,8],[1,1],[23,22]],[[1894,2944],[8,8],[15,13]],[[2041,2891],[25,-34],[12,-18],[9,-11],[10,-8],[-7,-12],[-2,-3],[-4,-6],[-1,-4],[-1,-2],[-1,-2],[-1,-2],[-3,-4],[-3,-3],[-1,-1],[-1,0],[-1,1],[-1,1],[-6,5],[-10,1],[-12,2],[-1,0],[-1,1],[-1,1],[-30,42],[-9,12],[-3,4]],[[2096,2932],[8,-10],[45,-67],[2,-2]],[[2151,2853],[-3,-2],[-2,0],[-2,0],[-2,-1],[-10,-7],[-7,-8],[-8,-8],[-7,-7],[-1,-6],[-2,-4],[-4,-4],[-4,-11],[-13,-18],[-2,-7],[-6,-4],[-7,-4],[-9,13],[-21,6],[-7,-1],[-7,2],[-6,6],[-6,1],[-9,-3],[-4,8],[-3,1],[-4,-3],[-5,-11],[-3,-4],[-6,-5],[-3,-4],[0,-1]],[[1961,2688],[1,-8],[0,-21],[-3,-22],[-6,-8],[-6,-16],[-7,-4],[-1,-5],[-4,-11],[-5,-2],[-6,-6],[-5,0],[-9,-8],[-8,-8],[-6,-9],[-6,-10],[-4,-5],[-15,-2],[-9,-8],[-8,-10],[-6,-6],[-4,-5],[-17,-20],[-11,-14],[-13,-12],[-4,-3],[-6,-7],[-5,-7],[-3,-7],[-8,-11],[-2,-7],[-3,-5],[-6,-6],[-3,-4],[-1,-1],[-7,-15],[-2,-8],[-8,-24],[0,-9],[-4,-4],[-12,-10],[-5,-7],[-3,-2],[-6,-1],[-2,-1],[-2,-6],[-1,-3],[0,-3],[-2,-3],[-8,-7],[-6,-1],[-1,-1],[-3,-3],[-5,-2],[-12,2],[-12,3],[-8,4],[-6,4],[-10,1],[-13,4],[-5,-3],[-8,0],[-7,4],[-6,-3],[-7,-1],[-7,2],[-6,-5],[-17,0],[-6,2],[-2,-1],[-10,6],[-5,-1],[-5,-4],[-9,-11],[-10,-7],[-6,-2],[-4,-2],[-3,-4],[-1,-5],[-5,-13],[0,-2],[0,-2],[1,-2],[3,0],[1,2],[3,1],[2,-1],[4,-9],[10,-1],[7,-1],[7,5],[5,-13],[3,-4],[0,-2],[1,-2],[4,-2],[3,-4],[0,-5],[-3,-3],[-4,0],[-4,-2],[-4,-6],[-4,-7],[-5,-6],[-9,-9],[-7,-11],[-4,-3],[-5,-2],[-4,-4],[-7,-1],[-6,4],[-5,11],[0,5],[-2,5],[-5,6],[-10,8],[-5,8],[-8,9],[-8,5],[-5,0],[-6,-1],[-8,-2],[-19,0],[-6,-1],[-6,-3],[-14,-1],[-17,1],[-4,-4],[-8,-2],[-6,-4],[-8,0],[-7,-4],[-16,-14],[-4,-1],[-2,3],[-5,-1],[-2,-3],[-3,-3],[-5,0],[-3,-3],[-2,-3],[-5,-4],[-15,0],[-13,-4],[-6,0],[8,9],[7,4],[6,5],[4,6],[5,8],[3,7],[-2,10],[-9,1],[-10,-1],[-6,1],[-4,3],[-2,6],[-4,5],[-18,8],[-7,5],[-2,1],[-4,6],[-2,4],[-4,4],[-6,1],[-15,0],[-1,5],[-4,-5],[-4,1],[-4,-2],[-1,0],[-1,15],[-4,10],[-6,7],[-8,20],[-2,9],[-3,13],[-2,4],[-1,3],[-1,1],[-6,17],[-4,5],[-4,1],[-5,-3],[-3,3],[-7,3],[-15,-2],[-5,4],[-9,12],[-1,3],[-1,12],[-14,27],[-5,10],[-6,9],[-12,22],[-1,1],[-2,1],[-5,7],[-8,9],[-6,0],[-9,-3],[-6,-7],[-7,-5],[-6,-9],[-4,1]],[[1767,3047],[14,14],[2,1],[1,0],[1,0],[1,-1],[12,-16],[16,14],[-16,21],[-1,3],[0,3],[3,4],[2,4],[2,3],[3,7],[9,22]],[[1816,3126],[17,-22],[27,-38]],[[1860,3066],[6,-8],[1,-2],[2,-2],[1,-5],[3,-13],[1,-5],[1,-5],[0,-9],[-3,-22],[0,-10],[1,-4],[1,-4],[1,-4],[3,-6],[13,-19],[3,-4]],[[1860,3066],[5,4],[5,5],[3,5],[1,3],[0,3],[1,2],[26,26],[7,8],[1,1]],[[1909,3123],[1,-1],[29,-42],[15,-21],[1,-2],[0,-1],[1,-1],[-1,-1],[-7,-7],[-7,-6],[5,-6],[0,-1],[0,-1],[1,-1],[-1,-1],[-16,-16],[1,0],[11,-17],[4,-5]],[[1816,3126],[5,12],[3,7],[0,5],[1,4],[5,12],[3,8],[3,5],[2,4],[3,3],[4,2],[16,8],[4,2],[3,2],[2,0],[3,1],[4,0],[4,0],[13,0],[7,0],[5,0],[8,0],[20,0],[20,-1],[-1,-14],[1,-9],[0,-1],[0,-2]],[[1954,3174],[1,-7],[0,-9],[1,-3],[-15,-2],[-1,0],[-1,0],[-11,-11],[-19,-19]],[[1954,3174],[34,4],[0,16],[0,7]],[[1496,3423],[-14,19],[-11,16],[-12,17],[-1,3],[-3,6],[3,1],[4,2],[3,2],[5,5],[9,9],[5,5],[8,9],[2,2],[9,10],[5,5],[7,8],[5,5],[-51,82]],[[1469,3629],[0,5],[11,28],[3,28],[1,26],[-1,11],[-7,18],[-3,15],[2,3],[7,1],[11,0],[5,2],[5,18],[0,5],[-13,8],[-5,5],[-5,7],[1,7],[5,4],[3,2],[18,0],[17,-7],[10,-7],[5,-5],[4,-5],[10,-10],[7,-5],[15,0],[8,4],[6,6],[0,4],[-4,4],[6,7],[2,4],[5,6],[2,2],[14,8],[6,-5],[3,-1],[3,2],[2,3],[0,4],[3,1],[2,-2],[4,0],[3,5],[7,2],[4,-2],[7,4],[9,3],[11,12],[13,10],[2,1]],[[1693,3865],[4,-9],[51,-66],[-1,-11]],[[8210,3953],[-7,6],[-11,12],[-1,2]],[[8191,3973],[-3,3],[-43,32]],[[8145,4008],[-42,31]],[[8103,4039],[-28,22]],[[8075,4061],[-30,22],[-3,3],[0,2],[0,1],[-1,2],[-6,4]],[[8035,4095],[5,3],[12,22]],[[8052,4120],[11,18],[10,17],[9,15]],[[8082,4170],[11,19]],[[8093,4189],[13,22],[12,22]],[[8118,4233],[14,24]],[[8132,4257],[28,-21],[14,-11]],[[8174,4225],[12,-10],[7,-5],[18,-14],[32,-25]],[[8243,4171],[-6,-31],[-10,-55]],[[8227,4085],[-5,-24],[-5,-27]],[[8217,4034],[-4,-25],[-2,-16]],[[8211,3993],[0,-19],[-1,-21]],[[9697,9303],[30,-11]],[[9727,9292],[0,-2],[0,-2],[-2,-2],[0,-12],[-3,-8],[0,-10],[0,-4],[0,-7],[-1,-6],[-1,-19],[-1,-24],[-1,-4],[3,-11],[1,-2],[-2,-14],[-2,-9],[-2,-6],[0,-8],[-2,-10],[-2,-8],[-7,-33],[0,-25],[1,-4],[1,-8],[-1,-9],[-3,-5],[-2,-19],[0,-4],[-1,-2],[-2,-7],[-2,-35],[-2,-4],[-1,-7],[0,-1],[3,-11],[-2,-16],[0,-5],[1,-9],[-3,-13],[0,-6],[2,-2],[1,-8],[0,-1]],[[9695,8890],[-13,7]],[[9682,8897],[1,26],[-38,11],[4,25],[4,24],[3,21],[4,28],[1,11],[1,6],[1,11],[2,22],[-2,2],[-11,1],[-1,1],[-1,2],[1,5],[1,2],[2,1],[13,-3],[3,22],[1,8],[2,22],[2,20],[1,10],[2,14],[19,114]],[[7572,5225],[-40,29],[-8,1],[-3,18]],[[7521,5273],[10,7]],[[7531,5280],[50,-37]],[[7531,5280],[14,13],[4,21]],[[7549,5314],[51,-37]],[[7549,5314],[1,13],[16,5],[1,8],[13,25]],[[7580,5365],[30,-22],[18,-13]],[[7521,5273],[-11,1],[-19,4]],[[7500,5379],[6,6],[14,24]],[[7520,5409],[15,-10],[-20,-39],[18,-4],[17,31],[15,-11],[15,-11]],[[7520,5409],[9,17],[9,18],[5,11],[4,6]],[[7547,5461],[9,-6],[51,-38]],[[7607,5417],[-9,-17],[-9,-18],[-9,-17]],[[8249,2119],[-34,10],[-10,-3],[2,-12],[14,-36]],[[8221,2078],[-14,1],[-22,2]],[[8252,2006],[-22,49],[-9,23]],[[8252,2006],[-32,2],[-17,2],[-22,0]],[[8180,1982],[-87,6]],[[8093,1988],[2,29]],[[8095,2017],[22,-2],[21,-1]],[[8178,1952],[-86,6]],[[8092,1958],[1,30]],[[8176,1923],[-86,6]],[[8090,1929],[2,29]],[[8175,1894],[-87,6]],[[8088,1900],[2,29]],[[9146,6516],[-7,-25]],[[9139,6491],[-5,2]],[[9134,6493],[-10,5],[-25,12],[-8,4]],[[9091,6514],[9,25],[9,26],[8,23]],[[9168,6589],[-6,-22],[-16,-51]],[[9199,6490],[-38,19],[-9,5],[-6,2]],[[9196,6434],[-10,5],[-17,9],[-24,11],[-9,5],[-4,3]],[[9132,6467],[7,24]],[[9214,6482],[-9,-24],[-9,-24]],[[9293,6387],[-13,6],[-5,2],[-3,2],[-8,4]],[[9264,6401],[-9,4],[-10,5],[-3,1],[-7,4],[-9,5]],[[9226,6420],[-20,9],[-2,1]],[[9204,6430],[-8,4]],[[9288,6418],[2,-15],[3,-16]],[[9226,6420],[-14,-38],[-7,-19],[-3,-9]],[[9202,6354],[-32,16],[-3,2]],[[9167,6372],[-5,2],[4,11],[5,15],[1,2],[5,16],[19,-10],[4,11],[4,11]],[[9240,6335],[-4,2],[-18,9],[-16,8]],[[9264,6401],[-21,-57],[-1,-2],[-1,-4],[-1,-3]],[[9161,6350],[6,22]],[[9240,6335],[-7,-21]],[[9233,6314],[-54,27],[-18,9]],[[7992,1720],[-98,7],[-5,-11],[-4,-14],[-5,-19]],[[7880,1683],[-4,-15]],[[7876,1668],[-5,-21],[-4,-20]],[[7867,1627],[-4,-22]],[[7863,1605],[-47,3],[-18,-23],[-13,-21]],[[7785,1564],[-21,-9]],[[7764,1555],[3,6],[14,24],[21,29],[17,18],[27,31],[15,24],[2,3],[18,31],[14,31]],[[7993,1742],[-1,-22]],[[7746,1548],[-6,-2]],[[7740,1546],[38,61],[17,21]],[[7795,1628],[20,23],[19,22],[16,22]],[[7850,1695],[12,20],[12,21],[9,21]],[[7886,1756],[-1,-3],[-8,-16],[-24,-43],[-1,-2],[-16,-21],[-22,-26],[-10,-11],[-19,-24],[-28,-43],[-11,-19]],[[7989,1676],[-109,7]],[[7992,1720],[-2,-25]],[[7990,1695],[-1,-19]],[[7989,1660],[-113,8]],[[7989,1676],[0,-16]],[[7987,1618],[-120,9]],[[7989,1660],[-1,-20]],[[7988,1640],[-1,-22]],[[7984,1571],[-126,9],[5,25]],[[7987,1618],[-2,-21]],[[7985,1597],[-1,-26]],[[7983,1547],[-2,-20]],[[7981,1527],[-97,15],[-11,2],[1,5],[-21,3]],[[7853,1552],[-35,6],[-33,6]],[[7984,1571],[-1,-24]],[[7981,1527],[-1,-23]],[[7980,1504],[-1,-19]],[[7979,1485],[-39,8],[-7,2],[-8,7],[-5,5],[-4,5]],[[7916,1512],[-68,12]],[[7848,1524],[4,24],[1,4]],[[7906,1461],[-67,19]],[[7839,1480],[5,22],[4,22]],[[7916,1512],[-5,-28],[-5,-23]],[[7979,1485],[-1,-21],[-1,-24]],[[7977,1440],[-71,21]],[[8056,1383],[-3,-5],[-9,-9]],[[8044,1369],[-1,-2],[-55,13],[-17,-19],[3,32]],[[7974,1393],[1,24],[-74,21]],[[7901,1438],[5,23]],[[7977,1440],[46,-13],[8,-9],[14,-34],[11,-1]],[[7828,1424],[3,10]],[[7831,1434],[65,-19],[5,23]],[[7974,1393],[-9,-9],[-137,40]],[[7831,1434],[4,23],[4,23]],[[8807,5880],[-19,10],[-7,-16],[-17,9],[-18,11],[-13,8],[-12,6]],[[8721,5908],[11,26],[8,20],[1,3]],[[8820,5914],[-2,-3],[-11,-31]],[[7222,2710],[8,8]],[[7230,2718],[91,-70],[3,-3],[12,24]],[[7230,2718],[18,18],[19,18],[5,6]],[[7184,2751],[12,21]],[[7196,2772],[14,24]],[[7210,2796],[12,-9],[13,22],[12,21],[6,13],[5,4],[5,2]],[[7210,2796],[6,11],[-62,47],[0,9],[4,16],[5,15]],[[7163,2894],[11,21],[21,39],[15,21],[3,5]],[[7106,2931],[16,-12],[2,2],[39,-27]],[[7196,2772],[0,9],[-144,113],[-3,13]],[[7049,2907],[15,-11],[22,-18],[14,42],[6,11]],[[7196,2772],[-7,3],[-151,113]],[[7038,2888],[11,19]],[[7027,2867],[11,21]],[[7049,2907],[23,42],[3,6]],[[7075,2955],[15,-12],[16,-12]],[[6924,2944],[-30,-55]],[[6894,2889],[-26,-48]],[[6868,2841],[-18,14],[-43,32]],[[6807,2887],[7,19],[17,30]],[[6831,2936],[16,31]],[[6847,2967],[45,-34],[13,25]],[[6905,2958],[19,-14]],[[6894,2889],[19,-14]],[[6913,2875],[-26,-48]],[[6887,2827],[-19,14]],[[6896,2789],[-10,-16],[-20,16],[-19,13]],[[6847,2802],[-33,25],[9,17],[-27,21]],[[6796,2865],[11,22]],[[6887,2827],[16,-12],[-2,-13]],[[6901,2802],[-5,-13]],[[6962,2839],[-31,-59],[-16,12],[-14,10]],[[6913,2875],[16,-12],[17,-12]],[[6960,2742],[-64,47]],[[6942,2703],[-2,2],[-7,5],[-57,42]],[[6836,2782],[2,3],[9,17]],[[6912,2646],[-3,2],[-63,47]],[[6895,2616],[-12,-23]],[[6883,2593],[-2,2],[-63,49]],[[6908,2558],[-31,24]],[[6883,2593],[31,-23],[-1,-4],[-5,-8]],[[6908,2558],[-6,-10],[21,-15]],[[6923,2533],[10,-7]],[[6933,2526],[-14,-4]],[[6919,2522],[-25,-8],[-22,-7]],[[6939,2583],[6,-4]],[[6945,2579],[-4,-8],[-10,-19],[1,-3],[-9,-16]],[[6945,2579],[15,-11],[32,-23]],[[6992,2545],[-20,-7],[-24,-9],[-15,-3]],[[7002,2547],[-10,-2]],[[6956,2615],[8,-6],[66,-50],[2,-1],[1,-2]],[[6993,2466],[-9,7],[-47,36]],[[6937,2509],[-18,13]],[[8173,1867],[-86,6]],[[8087,1873],[1,27]],[[8173,1847],[-87,7]],[[8086,1854],[1,19]],[[8171,1828],[-86,6]],[[8085,1834],[1,20]],[[8171,1809],[-87,6]],[[8084,1815],[1,19]],[[8169,1789],[-86,6]],[[8083,1795],[1,20]],[[8168,1766],[-86,6]],[[8082,1772],[1,23]],[[8166,1741],[-41,3],[-45,4]],[[8080,1748],[2,24]],[[8165,1709],[-86,5]],[[8079,1714],[1,29],[0,5]],[[8162,1665],[-86,6]],[[8076,1671],[1,17]],[[8077,1688],[2,26]],[[8160,1628],[-86,6]],[[8074,1634],[1,20]],[[8075,1654],[1,17]],[[8159,1606],[-86,6]],[[8073,1612],[1,22]],[[8175,1627],[-1,-21],[-15,0]],[[8071,1565],[1,25]],[[8072,1590],[1,22]],[[8159,1606],[-5,-21],[-6,-26],[-77,6]],[[8067,1512],[-86,15]],[[7983,1547],[86,-7],[2,25]],[[8209,1626],[-10,-23],[-17,-32],[-15,-19],[-23,-37],[-2,-12],[2,-3],[-6,-5]],[[8138,1495],[-15,5],[-31,9],[-25,3]],[[7984,1571],[87,-6]],[[7985,1597],[87,-7]],[[7988,1640],[86,-6]],[[7989,1660],[86,-6]],[[7990,1695],[87,-7]],[[7994,1751],[4,1],[38,-2],[44,-2]],[[7995,1778],[87,-6]],[[7997,1801],[86,-6]],[[7997,1822],[87,-7]],[[7999,1841],[86,-7]],[[8000,1860],[86,-6]],[[8002,1906],[86,-6]],[[8002,1906],[2,30],[1,29]],[[8005,1965],[76,-6],[11,-1]],[[8005,1965],[2,29]],[[8007,1994],[42,-2],[44,-4]],[[8007,1994],[0,18],[0,11]],[[8007,2023],[23,-1]],[[8030,2022],[21,-2],[22,-1]],[[8073,2019],[22,-2]],[[8030,2022],[3,70]],[[8077,2089],[-4,-70]],[[8007,2023],[-20,2]],[[7837,3125],[-26,-3],[-11,-1],[-11,3]],[[6962,4312],[1,-7],[-1,-4],[-1,-3],[-5,-12],[-8,-22]],[[6948,4264],[-62,30],[-7,-19]],[[6879,4275],[-58,28],[-5,2]],[[6816,4305],[0,5],[13,35],[1,3]],[[6830,4348],[3,0],[4,-2],[83,-21],[4,-2],[6,-2],[20,-6],[12,-3]],[[6923,5101],[-10,-19]],[[6913,5082],[-54,39],[-18,13],[-28,20]],[[6813,5154],[4,7],[25,46],[2,5],[5,9],[1,2],[1,2]],[[6851,5225],[46,-33]],[[6897,5192],[-2,-3],[-6,-9],[-2,-1],[-18,-34],[0,-2],[0,-2],[14,-10],[24,-17],[16,-13]],[[6136,4314],[-12,5],[-4,2],[-5,1],[-5,2],[-4,1],[-5,1],[-5,1],[-4,1],[-6,1],[-6,1],[-3,0],[-4,1],[-5,0],[-7,1],[-5,0],[-4,0],[-5,0],[-3,0],[-3,-1],[-5,-2],[-11,-1],[-5,-1],[-4,0],[-5,-1],[-6,-1],[-6,-2],[-3,-1],[-4,-1],[-4,-1],[-4,-2],[-5,-1],[-5,-2],[-14,-6],[-28,-10],[-3,-1],[-40,-16],[-11,-4],[-7,-3],[-5,-2]],[[6062,4383],[5,-21],[-16,-22],[5,-2],[5,-1],[19,-2],[8,-1],[9,-2],[12,-4],[27,-14]],[[5312,4075],[-13,-17]],[[5299,4058],[-15,16],[-3,-5]],[[5281,4069],[-18,11]],[[5263,4080],[-5,4],[-2,3],[-19,11],[-8,5]],[[5229,4103],[9,14],[0,5],[-31,32],[-30,33]],[[5177,4187],[14,18],[14,18]],[[5205,4223],[10,-11],[15,-15],[8,-8],[28,-29]],[[5266,4160],[18,-20]],[[5284,4140],[43,-45]],[[5327,4095],[-15,-20]],[[7828,1424],[-94,22],[-7,22],[-25,-18]],[[7702,1450],[3,5],[8,17],[4,5],[17,27],[1,2]],[[7735,1506],[1,0],[9,1],[5,-1],[89,-26]],[[7685,1444],[-5,1]],[[7740,1546],[3,-2]],[[7743,1544],[-3,-6],[-9,-14],[-9,-17],[-15,-23],[-4,-6],[-11,-23],[-7,-11]],[[7735,1506],[29,49]],[[7746,1548],[-3,-4]],[[7733,1659],[-2,-23],[11,-1],[27,-2],[18,-1],[6,-1],[2,-3]],[[7808,1698],[39,-2],[3,-1]],[[7934,1216],[-39,5]],[[7895,1221],[-51,11],[-47,12]],[[7797,1244],[-63,18],[-88,26],[-20,-8]],[[7626,1280],[-21,0]],[[7605,1280],[6,13],[2,5],[10,15],[12,24],[15,26],[7,15],[25,38],[20,34]],[[8044,1369],[-3,-5],[-7,-9],[-16,-23],[-11,-21],[-11,-17],[-10,-5],[-11,-13],[-6,-12],[-11,-12],[-6,-12],[-18,-24]],[[7590,1280],[10,22],[46,84],[24,42],[3,5]],[[7685,1444],[-5,-9],[-29,-51],[-3,-5],[-11,-16],[-35,-62],[-12,-20],[0,-1]],[[7979,1485],[86,-19],[0,5],[1,17]],[[8066,1488],[1,24]],[[8138,1495],[-3,-2],[-6,-7],[-20,-30],[-4,-8],[-22,-32],[-13,-18],[-9,-9],[-5,-6]],[[7980,1504],[86,-16]],[[8586,1703],[2,-3],[4,-4],[3,-2],[11,-4],[4,-14],[3,-9],[4,-4]],[[8617,1663],[-2,-2],[-9,-9],[-7,-9],[-3,-5],[-2,-8],[0,-8],[-2,-11],[-1,-20],[-4,-11],[-9,-17],[-15,-20],[-5,-2],[-8,1],[-8,-1],[-13,0],[-4,0],[-9,-1],[-8,-4],[-5,-4],[-20,-11],[-7,-3],[-8,-2],[-4,-2],[-5,-3],[-7,-9],[-6,-5],[-5,-8],[0,-11],[-3,-8],[-4,-8],[-10,-7],[-6,-1],[-3,-5],[-1,-4],[-4,-1],[-3,2],[-2,3],[-1,0],[-1,-2],[-12,-1],[-5,-1],[-12,2],[-3,-1],[-1,-6],[-2,-3],[-2,-2],[-5,-1],[-5,2],[-3,7],[-3,-1],[-3,-3],[0,-5],[-1,-3],[-4,-2],[-3,-1],[-3,1],[-5,5],[-3,5],[-4,1],[-6,3],[-6,8],[-3,5],[-7,15],[-1,6],[-1,1],[-1,7],[-7,20],[-7,27],[-4,25],[11,41],[6,13],[3,8],[5,17],[4,18],[8,23],[4,16],[5,28],[3,22],[0,22],[8,16],[5,19],[5,13],[2,15],[4,16],[9,18],[4,11]],[[2899,2234],[-37,-32],[-7,10],[-1,0],[-3,0],[-19,-17],[1,-3],[5,-7],[2,-2],[1,-3],[10,-17],[-35,-32],[-18,30],[-2,0],[-2,0],[-6,-5],[-1,-2],[0,-3],[19,-28],[-17,-15],[-18,29],[-2,1],[-2,0],[-7,-5],[-1,-2],[1,-3],[19,-29],[-14,-11],[-8,6],[-4,5],[-8,13],[-2,2],[-3,0],[-24,-20],[-1,-4],[1,-3],[9,-15],[2,-3],[-2,-3],[-13,-12],[-15,23],[-2,0],[-12,-10],[-2,-2],[1,-4],[13,-20],[-16,-14],[-12,20],[-2,2],[-2,1],[-12,-10],[-1,-2],[1,-3],[6,-11],[1,-9],[14,0],[2,0],[2,1],[2,2],[10,-14],[-42,-36],[-1,-1],[0,-1],[1,-2],[8,-13],[2,-2],[2,0],[2,1],[40,34],[6,-9],[2,-3],[2,-3],[26,22],[27,23],[9,7],[5,6],[48,41],[33,29],[22,19],[6,5],[5,4],[49,42]],[[2940,2167],[24,-39],[15,-25],[11,-17],[2,3],[7,-12],[10,-16],[4,-6],[3,-5]],[[3016,2050],[-3,-3],[-42,-35],[-19,-16],[-35,-29],[-26,-22],[-25,-21],[-24,-20],[-22,-19],[-24,-20],[-8,-6],[-3,-3],[-5,-4],[-7,-5],[-10,-7],[-10,-7],[-10,-6],[-10,-5],[-7,-4],[-7,-3],[-1,-1],[-2,-1]],[[2716,1813],[-3,6],[-4,6],[-5,9],[-59,86],[-3,4],[-15,31],[-7,12],[-22,36]],[[2598,2003],[3,4],[3,5],[10,8],[272,237],[3,3]],[[2889,2260],[13,-23],[-3,-3]],[[4158,3361],[-66,-13],[-2,-2],[-18,-16],[7,-7],[15,-14]],[[4094,3309],[-7,-8],[-7,-5],[-6,-3],[-8,-3],[-18,-6],[-7,-4],[-4,-5]],[[4037,3275],[-5,6],[-2,4],[-5,13]],[[4025,3298],[-2,5],[-1,4],[-4,8],[-15,15],[-1,0],[-13,14]],[[3989,3344],[8,8],[3,3],[5,2],[8,6],[3,4],[0,2],[1,3],[0,2],[-1,3],[-2,2],[-32,34]],[[3982,3413],[11,8],[3,3]],[[3996,3424],[28,-30],[30,-32],[6,0],[16,4],[6,1],[4,2],[5,5],[4,5],[12,-13],[3,0],[10,15],[-3,5],[-5,4],[-7,8],[-11,12],[-22,23],[-5,5],[-22,23]],[[4045,3461],[17,13]],[[4062,3474],[80,-86],[7,-7],[-2,-3],[11,-17]],[[5205,4223],[-37,40]],[[5168,4263],[-4,4],[-3,3],[0,1],[-4,4],[-12,13]],[[5145,4288],[24,30],[-15,15],[6,5],[12,10],[16,15],[11,10],[11,12],[3,4],[4,7]],[[5217,4396],[7,17],[2,5],[2,4]],[[5228,4422],[69,-72]],[[5297,4350],[62,-65]],[[5359,4285],[-11,-15]],[[5348,4270],[-44,-60]],[[5304,4210],[-10,-12],[-28,-38]],[[6657,3142],[-21,15]],[[6986,3651],[11,-15],[9,-21],[10,-22]],[[7145,3082],[-3,-7],[-1,-2],[-7,-9],[-16,-28],[-12,-24],[-31,-57]],[[6976,2905],[-17,13],[-1,1],[-1,0],[-6,5],[-9,6]],[[6942,2930],[4,7],[32,60]],[[9331,8884],[7,32],[8,37],[88,-25]],[[9434,8928],[-5,-24],[-1,-8],[-3,-23],[-2,-13]],[[9423,8860],[-6,2],[-12,3],[-10,3],[-18,5],[-43,12],[-3,-1]],[[6904,2449],[12,21],[10,19],[5,10],[6,10]],[[6256,2171],[-18,12],[-43,27]],[[6195,2210],[10,20],[6,14],[20,42],[3,4],[6,11],[3,9],[1,10],[1,5]],[[6245,2325],[1,11],[2,7],[4,10],[7,15],[1,3]],[[6260,2371],[19,-12],[16,33],[17,-11],[-6,-13],[-9,-20],[12,-8],[5,-5],[5,-6],[6,-5],[3,-4]],[[7771,2440],[-24,17],[-5,7]],[[7922,1911],[1,26],[-6,61],[0,3],[-1,5],[0,24]],[[7908,2031],[0,-3],[-2,-4],[1,-19],[0,-3],[0,-4],[4,-27],[2,-34],[0,-25]],[[6126,4375],[6,2],[2,0],[12,1],[0,27],[1,1],[1,1],[13,4],[2,0],[1,-2],[1,-50],[-5,-14],[1,-2],[15,-7]],[[6176,4336],[-6,-18],[-2,-1],[-2,1],[-31,14],[-14,8],[-1,1],[-1,3],[9,23],[-2,8]],[[9040,5199],[-22,11],[-1,1],[-1,1],[-13,6]],[[9003,5218],[4,8],[5,10],[3,6],[4,10],[6,21],[1,9],[6,26],[4,18],[10,54],[5,18],[3,14],[8,35],[6,29],[1,4],[1,5],[3,12]],[[9073,5497],[2,5],[4,15],[1,3],[2,5],[6,15],[-2,1],[-9,6],[-51,28],[-9,4],[-7,-19]],[[9010,5560],[-9,5],[-39,21],[-9,5]],[[8953,5591],[-8,4],[-53,30]],[[8892,5625],[-6,3]],[[8886,5628],[2,7],[4,13],[32,95],[15,45],[14,42],[14,52]],[[8967,5882],[15,-8],[19,-10],[9,-5],[1,0],[34,-20],[16,-8],[50,-29],[52,-27],[30,-16],[2,-2],[1,3],[6,11],[5,9],[12,24],[2,4]],[[9221,5808],[11,20],[10,19]],[[9242,5847],[7,14],[3,5],[7,13],[7,13],[2,3],[16,31],[2,4],[20,36],[2,4],[1,2],[2,5],[5,10],[4,7],[2,4],[19,34],[6,11],[2,4],[4,9],[2,4],[2,8],[1,4],[2,6]],[[9360,6078],[47,-16],[4,-2]],[[9411,6060],[-1,-6],[-1,-4],[-1,-4],[1,-4],[1,-3],[2,-1],[16,-9],[-27,-111],[3,-1],[-65,-160],[-2,-2],[-36,-56],[-62,-104],[-99,-87],[-1,-6],[1,-2],[2,-2],[5,-2],[9,2],[26,3],[9,0],[3,-1],[6,-7],[5,-9],[4,2],[3,-4],[-22,-18],[-30,-25],[-65,-131],[-37,-75],[-18,-34]],[[8504,5582],[-1,1],[-2,1],[-12,7],[-35,18],[-9,5],[-34,18],[-41,22],[-1,-3],[-9,-23],[-9,-23],[-15,-36],[-6,1],[-9,18],[11,27],[-22,12],[-3,2],[-1,2],[0,2],[0,2],[4,4],[3,4],[3,5],[1,3],[1,8],[0,6],[1,3],[2,5],[1,4],[1,3],[-26,15],[-15,9],[-4,3],[-3,3],[-5,2]],[[8270,5712],[1,4],[6,16],[7,19]],[[8284,5751],[4,9],[8,20],[6,17],[6,16],[4,9],[8,21],[2,5],[1,2],[1,2]],[[8324,5852],[23,-13],[4,-2],[5,-5],[5,-6],[6,-9],[17,-27],[16,-26]],[[8400,5764],[2,-3],[5,-4],[3,-2],[29,-16],[41,-22]],[[8480,5717],[53,-30],[6,-3],[2,-1],[3,-2]],[[8544,5681],[-1,-3],[-1,-3],[-22,-53],[-2,-5],[-14,-35]],[[2883,2571],[-21,-11],[-5,-3]],[[2857,2557],[-4,5],[-24,23],[-12,13],[-5,5],[-4,7],[-6,4],[-21,11]],[[2781,2625],[3,9],[10,8],[18,-8],[5,17],[2,5]],[[2819,2656],[4,2],[44,37]],[[2867,2695],[11,-18],[11,-18],[20,-31],[14,-17]],[[2923,2611],[-9,-12],[-14,-16],[-17,-12]],[[3891,2848],[-153,-124],[-5,-3]],[[3733,2721],[-26,44],[43,35],[-1,5],[3,26],[-19,3],[-15,-6],[-6,-4],[-26,-21],[-3,1],[-10,17],[-10,18],[1,3],[38,30],[5,3],[-11,18],[1,2],[34,11],[3,0],[1,-3],[2,-18],[10,2],[10,-1]],[[3757,2886],[20,0],[0,5],[-2,22],[0,4],[1,3],[37,29],[3,0],[4,0]],[[3820,2949],[2,-20],[-28,-21],[0,-3],[1,-8],[1,-8],[6,1],[29,21],[8,-15],[0,-2],[-1,-2],[-34,-27],[-4,-1],[-6,1],[-2,-23],[6,-1],[4,1],[5,1],[4,3],[19,15],[19,15],[17,14],[25,-42]],[[5490,3360],[-15,-21],[13,-14]],[[5488,3325],[-11,-16],[14,-16],[14,-15],[8,10]],[[5513,3288],[2,-2],[14,-14]],[[5529,3272],[-38,-9],[-4,4],[0,1],[-13,13],[-4,4],[-13,13],[-25,25],[-30,-2]],[[5402,3321],[34,49]],[[5436,3370],[20,-20],[20,23]],[[5476,3373],[14,-13]],[[5741,4799],[-17,-9],[-4,-2],[-24,-13],[-3,-2],[-9,-4],[-3,-1],[-2,2],[-1,-4],[-2,-6],[-2,-3],[-7,-17]],[[5667,4740],[-40,20]],[[5627,4760],[-32,18],[-10,-2],[-13,-4],[-2,-1],[-10,-7],[-8,-7],[-12,-8],[50,-26],[-6,-14],[-6,-16],[-7,-18]],[[5571,4675],[-76,42],[-16,-16],[-16,-15]],[[5463,4686],[-5,12],[-15,10],[-4,1],[-4,2]],[[5435,4711],[0,1],[5,3],[10,11],[3,3],[7,3],[10,-6],[2,0],[2,2],[2,3],[1,2],[0,3],[-5,3],[-2,5],[1,5],[4,5],[3,7],[8,8],[9,1],[6,6],[9,12],[2,2],[3,1],[7,-3],[4,-1],[6,1],[2,2],[17,8],[7,3],[3,1],[6,-1],[2,0],[13,4],[17,6],[8,0],[19,5],[5,0],[16,-1],[10,1],[5,-2],[3,-2],[13,-2],[7,3],[10,-1],[17,5],[8,2],[5,3],[9,3],[2,0]],[[5736,4825],[0,-7],[5,-19]],[[8104,6561],[-34,25],[-16,11],[-40,29]],[[8042,6679],[14,26],[1,2]],[[8057,6707],[39,-28],[16,-11],[-1,-3],[-32,-62],[34,-24],[-5,-10],[-4,-8]],[[5917,3205],[27,37]],[[5944,3242],[14,-14],[9,-10]],[[5967,3218],[-25,-33],[-3,-2],[-1,-1],[-3,-1],[-8,-3],[-8,-7],[-9,-10]],[[8731,1930],[-11,5],[-32,13]],[[8843,2243],[4,-3],[2,-2],[4,-5],[3,-6],[5,-16],[10,-36],[4,-11],[3,-4],[3,-4],[1,-4],[0,-3],[-1,-1],[-2,-3],[-4,-2],[-16,1],[-5,-1],[-5,-7],[-15,-15],[-15,-13],[-8,-12],[-4,-5],[-7,-7],[-2,-2],[-8,-8],[-33,-37],[-17,-18],[0,-17],[-2,-14],[-1,-20],[-6,-38]],[[8731,1930],[-4,-25],[-4,-16],[-5,-14],[-13,-28],[-4,-11],[-8,-18],[-3,-10],[-7,-11],[-2,-5],[-11,-29],[-1,-3],[-9,-18],[-5,-10],[-11,-17],[-5,-9],[-6,-11],[-5,-12],[-5,-11],[-4,-6],[-2,-3]],[[6158,1806],[5,7]],[[6163,1813],[11,-6],[9,-6],[46,-30],[3,0],[7,16],[3,-2],[5,-2],[3,-3],[3,-4],[0,-17],[1,-3],[55,-34],[11,-8],[6,-2],[32,-20],[14,-9],[3,3],[0,78],[-8,7]],[[6367,1771],[8,12],[0,6],[0,22],[0,25],[27,-16],[15,-9]],[[7674,2529],[-28,-35],[-19,-59]],[[7627,2435],[-8,7],[-2,2],[-1,1],[-1,1],[-2,1],[-3,3],[-2,1],[-19,20],[-7,10],[-6,12],[-2,9],[2,14]],[[7576,2516],[1,1],[2,1],[3,0],[2,2],[2,1],[5,5],[6,7],[10,17],[3,4],[13,19]],[[7623,2573],[20,-20],[17,15],[2,1],[14,12],[-8,7],[29,36],[25,29],[2,3],[-26,24]],[[7698,2680],[6,8],[30,40],[4,5]],[[7738,2733],[13,28],[14,25]],[[7765,2786],[15,-11],[2,-1],[22,-20],[19,-17],[2,-2],[7,-6],[1,-1],[3,-3],[1,0],[2,-2],[17,-17]],[[7856,2706],[-14,-16],[-5,-7],[-7,-10],[-10,-17]],[[7698,2680],[-10,-14]],[[7688,2666],[-38,28]],[[7650,2694],[15,22],[17,24]],[[7682,2740],[15,21]],[[7697,2761],[41,-28]],[[6192,2521],[-1,-3],[-8,-17],[-9,-19],[-5,-17]],[[5566,1320],[-9,99],[-8,90],[-18,1],[-1,-4],[-6,-3],[-3,0],[-9,-1]],[[5512,1502],[-1,15],[0,2],[0,5]],[[6426,3903],[-4,-8]],[[6421,3896],[4,13],[22,56],[10,26],[8,24],[2,5],[2,5],[6,16],[3,10],[2,6],[2,5],[1,4],[2,3],[1,3],[1,4],[1,2],[2,6],[0,1],[2,7],[11,47],[2,9]],[[6505,4148],[6,-3],[2,0],[2,-1],[19,-9]],[[6534,4135],[-1,-3],[-8,-24],[-9,-23],[-7,-21],[-8,-23],[-7,-21],[33,-16]],[[6527,4004],[-1,-11],[0,-8],[0,-6],[-1,-7],[-2,-7]],[[6523,3965],[-3,0],[-3,-1],[-2,-1],[-2,-3],[-35,17],[-28,-80],[-20,9],[-3,2],[-1,-5]],[[6153,3930],[-19,-2],[0,3],[-2,1],[-9,1],[-24,11]],[[6099,3944],[3,9],[2,5],[1,4],[3,8],[5,14],[1,5],[0,5],[-2,8],[-4,10],[-2,5],[-3,4],[-4,2],[-16,8]],[[6083,4031],[11,29]],[[6094,4060],[12,-6],[28,-19],[18,-10]],[[6152,4025],[1,-48],[0,-11],[0,-13],[0,-14],[0,-1],[0,-8]],[[7062,7388],[-18,28]],[[7044,7416],[14,15],[6,7],[3,3],[3,4],[5,6],[6,7],[3,4],[6,7],[17,23],[4,5],[6,8],[1,1],[3,5],[7,8]],[[7128,7519],[58,-72],[8,-11],[3,-3]],[[7197,7433],[-8,-8],[-5,-5],[-14,-13],[-27,-23],[-6,-5],[-30,-25],[-1,2],[-30,46],[-14,-14]],[[6260,2371],[33,69],[0,1],[2,7],[1,3]],[[6296,2451],[45,-29]],[[6155,2366],[61,-39],[6,-2],[20,1],[3,-1]],[[6195,2210],[-6,4],[-11,7],[-38,-3],[-5,-1],[-4,-2],[-8,-1],[-29,-2]],[[6489,6147],[-16,25],[-1,-8]],[[6472,6164],[1,10],[2,13],[1,34],[1,9],[12,23],[11,17],[2,4],[8,13],[7,10],[4,11],[7,19],[1,6],[3,13],[3,5],[2,9],[2,9],[3,4],[3,4],[6,4],[5,10],[3,6],[3,3],[5,3],[6,11],[5,6],[14,21],[10,10],[4,7],[2,5],[3,7],[2,0],[0,15],[4,10],[1,3]],[[6618,6498],[1,-1],[3,-3],[3,-3],[3,-3],[3,-3],[2,-4],[2,-1]],[[6635,6480],[-2,-3],[-7,-20],[-8,-17],[-13,-17],[-13,-16]],[[6592,6407],[-11,-14],[-13,-14],[-4,-5],[-1,-3],[-2,-3],[-1,-11]],[[6560,6357],[-3,-26],[-3,-10],[-5,-14],[-9,-21]],[[6540,6286],[-14,-20],[-8,-14],[-7,-14],[-3,-5],[-2,-8],[-3,-10],[-2,-7]],[[6501,6208],[-6,-28],[-6,-33]],[[7493,7356],[12,-20],[49,-78],[50,-79],[4,-3],[2,-5],[30,-47],[3,-3],[1,-1],[1,-2]],[[7471,6984],[-2,2],[-5,11],[-45,101],[-10,16],[-14,22]],[[7395,7136],[-23,37],[-32,51]],[[7340,7224],[-2,3],[-71,102]],[[7267,7329],[-70,104]],[[7197,7433],[4,4],[22,26]],[[7223,7463],[28,31],[29,34],[17,20],[2,2],[15,17]],[[7314,7567],[13,-21],[50,-77]],[[7377,7469],[50,-78],[36,-56],[2,-3],[15,13],[13,11]],[[7912,5473],[-10,-19]],[[7233,6187],[-39,28],[-5,4],[-22,17],[-5,2],[-26,17],[-33,42],[-30,9]],[[7073,6306],[15,29],[24,46],[6,12]],[[7118,6393],[16,29],[13,25],[12,24]],[[7276,6266],[-7,-13]],[[5894,3747],[-3,3],[-2,12],[-4,5],[-8,9],[-29,29]],[[5848,3805],[-54,58]],[[5794,3863],[-56,59]],[[5738,3922],[12,14],[12,17],[14,17],[14,17]],[[5790,3987],[26,-28],[2,-2],[-6,-8],[-6,-7],[-2,-1],[28,-30],[23,-24]],[[5855,3887],[-13,-17],[15,-17],[17,-17],[9,-9],[3,-4],[36,-37],[3,-3]],[[5925,3783],[-11,-14],[-10,-11],[-10,-11]],[[7382,2444],[-13,-18],[-12,-17]],[[5710,3061],[-3,7],[22,5],[13,3],[13,1],[24,2],[23,1],[60,4],[15,0],[-3,4],[-3,4],[0,9],[0,2],[2,10],[37,48]],[[5967,3218],[16,-16],[50,-52],[2,-2],[3,-3]],[[6038,3145],[-7,-8],[-10,-10],[-10,-10],[-8,-6],[-9,-7],[-8,-5],[-10,-5],[-8,-3],[-9,-4],[-10,-3],[-5,-2],[-6,-1],[-10,-2],[-11,-1],[-16,-1],[-1,0],[-1,0],[-7,0],[-18,-1],[-20,-1],[-22,-1],[-13,0],[-12,-1],[-21,-1],[-17,-1],[-14,-2],[-7,0],[-4,-1],[-5,-1],[-6,-1],[-7,-1],[-5,-1],[-5,-2],[-6,-1]],[[5641,3296],[17,-17],[-14,-18]],[[5644,3261],[-5,-7],[-5,-8],[-3,-10],[-1,-9],[1,-9],[3,-7]],[[5634,3211],[-13,1],[-12,-18],[9,-12],[-17,-9]],[[5601,3173],[1,4],[-5,11],[-3,3],[11,15],[3,4],[3,6],[1,4],[0,7],[-1,7],[0,9]],[[5611,3243],[7,16],[9,12],[1,3],[-1,3],[-19,21],[-8,2],[-14,4],[-2,1],[-5,4],[-10,11]],[[5569,3320],[22,29]],[[5591,3349],[35,-37],[15,-16]],[[5710,3061],[-6,-1],[-5,-2],[-6,-2],[-6,-2],[-4,-1],[-4,-2],[-4,-1],[-7,-3],[-5,-2],[-2,-1],[-4,-2],[-11,-5],[-6,-3],[-4,-2],[-10,-6],[-11,-5],[-10,-5],[-2,-2],[-3,-1],[-2,2],[-3,4],[-2,2],[-10,10],[-14,15],[-13,15],[-6,10],[-2,6],[-3,7],[-3,9],[-3,13],[-2,12],[-6,25]],[[5531,3143],[42,16],[5,2],[20,8],[1,1],[1,1],[1,2]],[[5634,3211],[-8,-10],[-3,-4],[0,-2],[0,-2],[1,-3],[47,-48],[1,-1],[2,0],[2,0],[8,12],[1,3],[-1,13],[6,1],[6,2],[5,3],[5,5],[21,28]],[[5727,3208],[15,-15],[15,-16]],[[5757,3177],[17,-18]],[[5774,3159],[15,-16],[23,29],[14,-16],[-23,-31],[12,-13],[5,0],[36,49]],[[7239,1392],[7,-5],[27,-20]],[[9682,8897],[-40,12],[-2,-14],[-34,10],[-6,1]],[[9600,8906],[5,8],[1,9],[9,48],[1,5],[5,17],[0,8],[5,23],[9,46],[1,5],[10,96],[0,8],[-2,0],[-2,0],[-1,1],[3,10],[3,16],[1,61],[2,43]],[[9650,9310],[2,-1],[40,-11],[5,5]],[[9600,8906],[4,24],[4,21],[4,21],[5,20],[2,10],[-1,11],[-2,22],[-43,11]],[[9573,9046],[-65,18],[-2,-3]],[[9506,9061],[-7,-4],[-15,-5],[-2,-10],[-6,-8],[-12,-63],[20,-6],[2,-2]],[[9486,8963],[-5,-23]],[[9481,8940],[-36,9],[-6,2]],[[9439,8951],[23,111]],[[9473,9112],[6,-2],[18,-5],[-1,-7],[0,-3],[1,-3],[3,2],[20,7],[22,8],[20,7],[13,6],[10,6],[6,5],[7,6],[5,6],[2,7],[-39,11],[-18,5],[-18,5],[-18,5],[-19,1],[-6,1]],[[9547,8921],[5,24],[4,21],[4,21],[4,20],[5,19],[4,20]],[[9600,8906],[-20,6],[-5,1],[-28,8]],[[9547,8921],[-66,19]],[[9486,8963],[5,21],[4,21],[4,21],[4,19],[2,9],[1,7]],[[9434,8928],[5,23]],[[9547,8921],[-5,-23],[-5,-24],[-4,-22]],[[9533,8852],[-66,18],[-4,-21],[-27,7],[-13,4]],[[9302,8735],[5,25],[5,22],[8,53],[6,25],[5,24]],[[9423,8860],[0,-4],[-2,-17],[-1,-6],[-5,-24]],[[9415,8809],[-3,-16],[-12,-59],[-4,-11],[-4,-11],[0,-1]],[[9392,8711],[-5,1],[-19,5],[-30,9],[-15,3],[-21,6]],[[9432,8700],[-38,10],[-2,1]],[[9415,8809],[38,-10]],[[9453,8799],[-6,-29],[-1,-5],[-11,3],[-3,-14],[11,-3],[0,-3],[-5,-24],[-3,-17],[-3,-7]],[[9514,8759],[-10,-52]],[[9504,8707],[-5,-25]],[[9499,8682],[-67,18]],[[9453,8799],[4,24],[66,-19]],[[9523,8804],[-5,-24],[-4,-21]],[[9533,8852],[-4,-22]],[[9529,8830],[-1,-3],[-3,-15],[-2,-8]],[[9529,8830],[76,-21],[2,-1]],[[9607,8808],[0,-3],[3,-24]],[[9610,8781],[2,-26],[4,-45],[-25,7],[4,17],[-2,3],[-56,16],[-23,6]],[[9600,8906],[0,-24],[2,-25],[3,-25],[2,-24]],[[9644,8668],[-3,24],[-5,32],[0,7],[-3,20],[0,11],[0,13],[-23,6]],[[9695,8890],[-2,-4],[0,-6],[0,-16],[1,-5],[-2,-10],[0,-20],[2,-19],[-3,-6],[0,-9],[2,-10],[1,-7],[0,-1],[-2,-10],[-4,-10],[1,-25],[2,-7],[-1,-11],[4,-10],[0,-13],[-1,-9],[2,-7],[2,-10],[-1,-7],[2,-3]],[[9644,8668],[-19,5],[-5,2],[3,-27],[-59,16]],[[9564,8664],[5,25],[-42,11],[-23,7]],[[9490,8638],[4,20],[5,24]],[[9564,8664],[-5,-24],[-3,-19]],[[9556,8621],[-49,13],[-17,4]],[[9486,8616],[4,22]],[[9556,8621],[16,-5],[4,18],[3,1],[33,-9],[2,-1],[0,-2],[2,-19],[2,-18],[-1,-2],[-2,-1],[-64,17],[-65,16]],[[8996,3934],[12,-63],[1,-4],[53,-282],[38,-209],[4,1],[24,-132],[23,-100],[-27,-16],[0,-27],[2,-1],[-13,4],[-47,24],[-17,11],[-21,18],[-30,31],[-13,17],[-10,15],[-8,13],[-13,22],[-8,16],[-3,12],[-9,22],[-11,45],[-3,22],[-3,24],[-1,22],[1,23],[0,18],[4,20],[3,22],[1,4],[0,3],[0,1],[1,5],[5,9],[4,13],[6,19],[11,40],[6,44],[0,34],[0,6],[-3,66],[-8,103],[-7,97],[0,8],[0,5],[0,4],[3,6],[4,1],[10,-4],[4,0],[5,4],[12,7],[1,1],[-19,106],[1,9],[1,1],[5,-1],[25,-127],[5,-3],[2,-9],[1,-7],[-1,-1],[-3,-3],[0,-9]],[[9038,3405],[-1,6],[-11,1],[-11,1],[-1,-3],[-27,3],[-3,1],[-3,0],[0,32],[1,3],[0,3],[1,10],[2,7],[2,18],[2,7],[1,5],[2,3],[0,6],[2,4],[0,4],[0,6],[0,1],[10,33],[6,32],[-11,33],[-21,2],[-4,-31],[-4,-19],[-10,-37],[-1,-5],[-6,-29],[-2,-10],[-3,-21],[-1,-15],[-2,-26],[-1,-5],[0,-21],[0,-2],[0,-17],[12,0],[17,-1],[0,-31],[0,-2],[5,0],[0,-30],[-1,-1],[-3,-9],[-7,0],[-3,-1],[-2,-3],[0,-26],[1,-6],[2,-3],[2,-2],[2,0],[1,2],[0,6],[2,4],[2,3],[11,0],[1,0],[2,4],[2,13],[1,2],[2,1],[3,-2],[2,-4],[1,-4],[2,-8],[3,-22],[-2,-1],[0,-7],[-3,-3],[-5,-1],[-6,3],[-3,-1],[-2,-3],[3,-4],[1,-1],[1,-2],[5,-7],[3,-5],[2,-4],[0,8],[-1,8],[1,4],[3,4],[3,0],[3,-2],[3,-2],[0,-3],[2,-2],[-2,-7],[-2,-9],[3,-7],[3,-6],[4,-1],[2,-6],[0,-6],[4,-9],[2,-4],[4,-2],[1,-4],[2,-1],[4,-1],[6,1],[1,0],[5,6],[1,5],[-2,21],[1,9],[-2,7],[-5,12],[0,8],[4,10],[0,9],[-2,5],[0,9],[2,11],[0,11],[-4,20],[-3,37],[0,37],[-1,6]],[[8980,3810],[102,-565],[12,-65],[27,7],[-10,58],[-105,572],[-26,-7]],[[8960,3872],[1,-1],[1,1],[3,2],[3,4],[10,0],[5,-4],[3,0],[-1,15],[-1,3],[2,3],[-2,10],[-6,8],[-4,3],[-6,0],[-1,-1],[-9,-12],[1,-10],[1,-3],[-1,-3],[1,-15]],[[8953,3313],[0,1],[-2,0],[-1,3],[-4,4],[-4,0],[-1,-2],[0,-6],[1,-3],[3,-3],[3,0],[4,3],[1,1],[0,2]],[[8794,4165],[1,-13],[4,-1],[5,1],[3,-1],[8,-2],[8,-2],[9,-2],[4,-1],[3,-4],[3,-3],[1,-5],[1,-16],[1,-6],[3,0],[6,-1],[5,-3],[4,-3],[5,-3],[3,-3],[3,-3],[2,-1],[3,-3],[1,1],[0,3],[3,2],[1,0],[1,-4],[7,-139],[2,-13],[4,-44],[2,-14],[11,-37],[1,-19],[12,-90],[-1,-15],[-2,-6],[-3,-10],[0,-6],[-4,-8],[-1,-4],[-1,-12],[-3,-29],[-6,-40],[-14,-54],[-5,-21],[-3,-13],[-9,-37],[-2,-6],[-1,-5],[-1,-3],[-8,-9],[-3,-2],[-2,0],[-7,-1],[-6,0],[-4,1],[-5,2],[-7,8],[-14,25],[-2,6],[-26,51],[-6,25],[-19,90],[-9,37],[1,57],[6,62],[1,36],[0,3],[-1,2],[1,7],[-4,27],[-3,8],[-5,18],[-2,16],[-3,15],[0,1],[-2,20],[-1,3],[-4,9],[-1,11],[1,22],[4,17],[5,39],[6,20],[7,21],[19,47],[34,73],[3,4],[3,2],[6,12],[0,6],[5,8],[1,5],[5,7],[5,6],[3,3],[20,0],[8,-5],[3,-5],[3,-7],[2,-13],[3,-49],[-3,-6],[-6,-7],[-57,7],[-17,-31],[-2,-6]],[[8983,3495],[-1,-13],[-4,-21],[-1,-8],[0,-3],[1,-3],[-1,-14],[-2,-17],[-18,1],[-8,0],[0,12],[1,12],[2,15],[4,31],[10,-2],[1,9],[-9,2],[0,5],[1,5],[2,5],[-1,6],[3,3],[1,4],[0,6],[-1,3],[11,36],[7,30],[2,17],[15,-4],[8,-20],[-3,-14],[-13,-54],[-5,-10],[2,-5],[1,-3],[-2,-2],[-2,-6],[-1,-3]],[[8988,3410],[-1,-32],[17,-1],[-3,-27],[-1,-7],[-1,-2],[-5,-4],[-12,-1],[0,20],[-5,0],[1,38],[-12,1],[-1,-6],[-8,1],[-9,1],[0,11],[0,10],[9,0],[27,-1],[4,-1]],[[8879,4108],[-1,1],[-1,2],[-1,25],[-2,37],[2,8],[1,3],[3,-1],[3,-4],[1,-5],[-1,-16],[-2,-6],[2,-39],[-4,-5]],[[9137,3084],[-6,17],[2,-3],[5,-13]],[[8620,3881],[-23,-113],[1,-1],[-3,-12]],[[8595,3755],[-15,5],[-6,2]],[[8574,3762],[-40,11],[0,4],[0,1],[2,7],[2,2],[-8,1],[-2,0],[-6,-2],[-5,-3],[-7,-6],[-6,-6],[-2,-1],[-3,-4],[-3,-5],[-5,-8],[-3,-11]],[[8488,3742],[-5,3],[-1,1],[-4,3],[-4,4],[-22,16],[-25,19]],[[8427,3788],[-4,3],[-43,32]],[[8380,3823],[8,15],[8,15]],[[8396,3853],[46,-35],[11,13],[9,14]],[[8462,3845],[13,22],[10,20],[6,10]],[[8491,3897],[7,12],[12,22],[14,24]],[[8524,3955],[2,-3],[12,-15],[8,-5],[15,-9],[3,-1],[3,-2],[7,-5],[5,-1],[23,-18],[9,-4],[9,-11]],[[8396,3853],[8,15],[8,15]],[[8412,3883],[10,-7],[14,-11],[26,-20]],[[6830,4348],[17,49],[3,4],[12,35]],[[6862,4436],[29,85],[2,2],[3,10],[2,3]],[[6898,4536],[43,-21],[8,-4],[9,-4]],[[6958,4507],[62,-31]],[[7020,4476],[44,-20],[13,-7]],[[7077,4449],[-1,-3],[-4,-13],[-2,-5],[-36,-102],[-10,-27],[-1,-5]],[[7023,4294],[-61,18]],[[8089,3915],[6,13],[-66,50]],[[8029,3978],[7,12]],[[8036,3990],[43,-32],[23,-18]],[[8102,3940],[9,-7],[29,-22]],[[8140,3911],[-7,-12],[-6,-11],[-33,25],[-5,2]],[[8152,3903],[-14,-25]],[[8138,3878],[-2,-2],[-4,-4],[-17,-23]],[[8115,3849],[-29,22]],[[8086,3871],[-16,12],[-66,49]],[[8004,3932],[6,11],[4,8]],[[8014,3951],[59,-44],[3,-3],[5,-3],[8,14]],[[8140,3911],[12,-8]],[[8014,3951],[4,7],[5,8],[6,12]],[[8172,3805],[-10,8],[-14,11],[-3,2],[-10,8],[-6,5]],[[8129,3839],[-9,7],[-5,3]],[[8138,3878],[5,-1],[36,-27],[5,-3]],[[8184,3847],[-1,-4],[-1,-3],[-1,-4],[-9,-31]],[[8152,3903],[10,-8],[18,-14],[11,-8]],[[8191,3873],[-7,-26]],[[8094,3750],[-8,-15]],[[8086,3735],[-50,39]],[[8036,3774],[3,6],[4,9],[8,15],[3,7],[5,9]],[[8059,3820],[41,-32],[11,-8]],[[8111,3780],[-6,-10],[-3,-5],[-8,-15]],[[8071,3704],[-1,2],[-33,24],[-7,5],[-10,8]],[[8020,3743],[1,3],[7,13],[8,15]],[[8086,3735],[8,-6]],[[8094,3729],[-8,-14],[51,-38]],[[8142,3693],[-4,3],[-40,30],[-4,3]],[[8094,3750],[12,-11],[14,-11],[22,-19],[4,-2]],[[8111,3780],[6,-4],[10,-7],[19,-15],[10,-8]],[[9697,9303],[3,20],[1,5],[2,8],[1,6],[5,32]],[[9709,9374],[5,33],[2,7],[6,40],[1,7]],[[9723,9461],[4,24]],[[9727,9485],[41,-10],[20,21],[17,23],[11,15],[15,25]],[[9831,9559],[25,42],[7,11],[2,12]],[[9865,9624],[4,20],[-8,13],[-1,5],[2,12]],[[9862,9674],[4,22],[5,23],[7,38],[-14,3],[2,15],[14,-2],[4,23]],[[9884,9796],[1,6],[1,7],[8,33],[4,14],[12,48],[3,5],[5,12],[-15,-5],[-17,-5],[-25,-8]],[[9861,9903],[-8,-2]],[[9850,9931],[2,2],[2,-1],[2,-1],[2,-2],[10,0],[16,4],[8,3],[20,11],[3,1],[7,5],[6,3],[1,0],[7,-1],[6,-3],[6,2],[6,10],[6,5],[17,3],[4,4],[3,-1],[2,0],[4,4],[5,0],[4,-2],[0,-5],[-4,-7],[-2,-5],[-6,-14],[-11,-14],[-3,-6],[-4,-7],[-3,-1],[-6,-20],[-6,-3],[-3,-3],[-2,-12],[0,-10],[-3,-12],[-4,-5],[0,-13],[-1,-7],[-3,-4],[0,-2],[0,-1],[-6,-7],[-1,-8],[-3,-4],[-3,-8],[0,-3],[0,-5],[0,-11],[-3,-3],[-4,-9],[0,-11],[-2,-9],[-5,-22],[-2,-22],[-2,-8],[-6,-14],[-4,-19],[-5,-9],[-10,-27],[-4,-7],[-6,-4],[-2,-2],[-6,-10],[-5,-7],[-1,-6],[1,-6],[-8,-5],[-5,-10],[-6,-9],[-6,-6],[-7,-13],[-4,-5],[-5,-13],[-7,-6],[-2,-9],[4,-6],[1,-1],[-2,-3],[-5,-4],[0,-6],[-4,-2],[-9,1],[-6,0],[-10,-16],[-2,-11],[-6,-10],[-2,-4],[-1,-3],[-4,-6],[-6,-4],[-1,0],[-1,0],[-7,-14],[0,-7],[-1,-7],[0,-5],[-1,-3],[-3,-5],[-3,-12],[-1,-3],[-1,-10],[0,-4],[-1,-6],[-7,-13],[-1,-11],[0,-14],[-1,-6],[-1,-22]],[[9862,9674],[-28,6],[-13,4],[-9,2],[-9,8],[-8,8],[-19,20]],[[9776,9722],[10,6],[2,2],[5,6],[30,45],[15,23]],[[9838,9804],[46,-8]],[[9838,9804],[11,16],[5,10],[5,14],[4,15],[1,11],[0,10],[-3,23]],[[9865,9624],[-83,23],[-5,-25]],[[9777,9622],[-26,7],[4,26],[3,13],[1,5],[0,5],[3,16],[4,10],[4,8],[6,10]],[[9831,9559],[-22,6],[-25,6]],[[9784,9571],[4,24],[5,23],[-16,4]],[[9727,9485],[5,26]],[[9732,9511],[4,26],[4,24],[40,-10],[4,20]],[[9732,9511],[-4,3],[-60,15]],[[9673,9553],[0,4],[9,27],[9,23],[12,24],[4,7],[12,18],[17,21],[14,18],[13,18],[19,31],[7,15],[11,28],[9,36]],[[9723,9461],[-43,12],[-3,0],[-1,-3],[-3,-17],[-1,-17],[0,-8],[1,-6],[1,-10],[3,-13],[8,-24],[9,2],[15,-3]],[[9233,6314],[-7,-25],[-22,11],[-7,-23]],[[9197,6277],[-10,5],[-31,16],[-10,5]],[[9146,6303],[7,24],[8,23]],[[9274,6238],[-9,5],[-58,29],[-10,5]],[[9240,6335],[17,-9],[18,-8],[17,-9],[2,-1]],[[9294,6308],[-5,-18],[-5,-20],[-10,-32]],[[9293,6387],[21,-89],[-20,10]],[[9365,6386],[2,-11],[0,-11],[3,-6],[1,-12],[4,-11],[2,-19],[1,0],[6,-21],[2,-3],[9,2],[3,1],[4,0],[4,-3],[1,-1],[-1,5],[4,1],[27,-135]],[[9437,6162],[-43,20],[-3,2],[-5,1],[-4,2],[-35,17],[-8,1]],[[9339,6205],[-8,4],[-36,18],[-5,2],[-6,3],[-10,6]],[[9298,6153],[-45,23]],[[9253,6176],[3,7],[4,11],[8,21],[6,23]],[[9339,6205],[8,-30],[8,-30],[3,-12],[2,-12],[-26,13],[-36,19]],[[9253,6176],[-8,-15],[-72,36]],[[9173,6197],[5,16],[2,8],[4,12],[6,22],[7,22]],[[9298,6153],[-6,-16],[-4,-10],[-4,-10],[18,-10],[19,-4],[3,7],[4,9],[33,-18],[1,-2],[-1,-8],[-1,-11],[0,-2]],[[9360,6078],[-3,1],[-14,5],[-8,3],[-9,3],[-10,4],[-10,3],[-7,3],[-31,11],[-9,3],[-6,2],[-4,2],[-6,2],[-9,5],[-7,3],[-5,2],[-5,3],[-4,2],[-2,1],[-2,1],[-5,3],[-3,2],[-2,1],[-3,2],[-3,1],[-20,11],[-5,2],[11,-11],[-8,5],[-6,3],[-2,1],[-3,2],[-2,1],[-3,1],[-8,3],[-4,1],[-5,1],[-5,2],[-7,1],[-5,1],[-6,1],[-11,1],[-6,0],[-2,1],[-3,0],[-3,0],[-4,1],[-4,0],[-3,0],[-4,1],[-4,1],[-4,0],[-3,1],[-4,1],[-3,1],[-4,2],[-3,1],[-3,1],[-1,1]],[[9046,6184],[2,7]],[[9048,6191],[7,23],[2,7],[1,4],[3,10],[9,26],[14,48]],[[9084,6309],[5,-2],[-6,-23],[-6,-20],[-5,-16],[10,-6],[41,-20]],[[9123,6222],[-2,-11],[-3,-8],[14,-7],[12,-6],[24,-12],[5,19]],[[9123,6222],[2,17],[3,9],[4,11],[7,22],[7,22]],[[9084,6309],[7,23]],[[9091,6332],[5,-3],[10,-5],[31,-16],[9,-5]],[[9091,6332],[21,70],[20,65]],[[9084,6309],[-6,3],[-3,2],[-14,7],[-29,15]],[[9032,6336],[2,2],[7,22],[4,16]],[[9045,6376],[11,-6],[9,-4],[5,15],[8,27],[4,11],[4,12],[-13,7],[-7,4]],[[9066,6442],[2,5],[0,2],[1,1],[4,12],[2,4]],[[9075,6466],[7,-4],[28,-14],[10,-5],[7,24],[7,26]],[[9045,6376],[13,43]],[[9058,6419],[1,3],[3,9],[3,7],[1,4]],[[9668,8499],[-23,7],[-9,2]],[[9636,8508],[-96,24],[-1,0],[-1,-2],[-8,-38]],[[9530,8492],[-8,-40]],[[9522,8452],[-66,16]],[[9456,8468],[4,22],[12,59]],[[9472,8549],[14,67]],[[9636,8508],[2,-23],[-20,5],[4,-37],[-1,-4],[-4,0],[-70,18],[-2,1],[0,2],[3,17],[-18,5]],[[9644,8420],[-56,15],[-66,17]],[[9469,8308],[-16,25],[-12,20],[-4,16],[1,13]],[[9438,8382],[5,21],[5,23],[4,21],[4,21]],[[9648,8374],[-20,5],[-44,11],[-55,15],[-3,-1],[-2,-3],[-3,-18],[-5,-21]],[[9516,8362],[-11,2],[-3,-21],[-7,-34]],[[9495,8309],[-13,4],[-4,0],[-4,-2],[-5,-3]],[[9653,8327],[-77,19],[-60,16]],[[9631,8287],[-76,19],[-2,-12],[-19,5],[-20,5],[-19,5]],[[9475,8269],[2,12],[0,8],[-2,8],[-6,11]],[[7032,4840],[-4,3],[-4,3],[-21,15],[-21,16]],[[6982,4877],[-41,30],[-3,3],[-1,1],[-3,-2],[-7,-7],[-12,-11],[-7,-5],[-1,-3],[-8,-7]],[[6899,4876],[-8,-6],[-7,-7],[-7,-5],[-10,-7]],[[6867,4851],[-30,14],[-10,5],[-3,1],[0,1]],[[6824,4872],[5,4],[5,4],[4,3],[7,4],[4,3],[4,2],[9,3],[4,2],[4,2],[6,2],[6,1],[8,2],[10,3],[7,2],[7,3],[7,2],[6,3],[3,1],[2,1],[1,1],[3,1],[3,2],[4,3],[9,6],[3,2],[7,5],[10,9],[2,2],[11,10],[6,6]],[[6991,4966],[2,-4],[89,-65]],[[7082,4897],[-15,-19],[-18,-19],[-2,-3],[-5,-5],[-8,-10],[-2,-1]],[[8792,5843],[-9,5],[-62,34],[-8,4]],[[8713,5886],[3,10],[5,12]],[[8807,5880],[-15,-37]],[[8792,5843],[-8,-21]],[[8784,5822],[-9,5],[-9,5]],[[8766,5832],[-27,15],[-9,4],[-4,-9]],[[8726,5842],[-8,5],[-9,4],[-9,5]],[[8700,5856],[8,20],[5,10]],[[8709,5799],[9,22]],[[8718,5821],[4,10],[4,11]],[[8766,5832],[-4,-10],[-4,-10],[-9,5],[-9,5],[-13,-33]],[[8784,5822],[-21,-53]],[[8640,5863],[8,-5],[61,-33],[9,-4]],[[8648,5884],[9,-4],[35,-19],[8,-5]],[[8627,5896],[7,19]],[[8612,5852],[-3,2],[-11,6],[-31,17],[-14,8],[10,24],[-4,2],[1,3]],[[8560,5914],[6,15],[-8,5]],[[8597,5812],[-3,1],[-43,24],[-9,5],[-9,5]],[[8533,5847],[7,17],[-18,11],[20,49],[18,-10]],[[8533,5847],[-9,5],[-31,17]],[[8493,5869],[-21,12],[-19,10]],[[8496,5756],[-40,22]],[[8456,5778],[4,10],[4,11],[13,31],[8,20]],[[8485,5850],[8,19]],[[8533,5847],[-8,-20],[-8,-19],[-8,-21],[-5,-11]],[[8504,5776],[-4,-10],[-4,-10]],[[8485,5850],[-39,21],[-9,-19],[-40,21]],[[8397,5873],[8,20],[8,20]],[[8456,5778],[-41,23],[-8,-20],[-7,-17]],[[8324,5852],[11,26],[1,5]],[[8336,5883],[5,-2],[16,-9],[16,-9],[16,-9],[8,19]],[[8336,5883],[8,19]],[[8344,5902],[8,20],[8,20]],[[8344,5902],[-3,2],[-34,19],[-13,8],[8,19]],[[8302,5950],[8,20],[14,-8],[4,8],[2,2],[4,9]],[[8334,5981],[17,-9],[4,9],[2,2],[4,8],[14,-8],[2,-1]],[[8324,5852],[-3,1],[-31,17],[-73,41]],[[8217,5911],[7,18],[24,67],[18,48]],[[8266,6044],[17,-10],[-16,-40],[-8,-19],[43,-25]],[[8266,6044],[7,21]],[[8273,6065],[11,-7],[51,-28]],[[8335,6030],[-8,-20],[14,-8],[-4,-8],[1,-4],[-4,-9]],[[8335,6030],[9,22],[28,-16]],[[8273,6065],[3,7],[5,13]],[[8281,6085],[6,20]],[[8287,6105],[20,-12],[26,-14],[15,-8]],[[8287,6105],[5,14],[7,20],[13,36],[1,3]],[[8281,6085],[-3,2]],[[8278,6087],[-3,1],[-7,4],[-9,5],[-12,6],[0,10]],[[8247,6113],[7,20],[15,42],[15,-7],[7,18],[1,3]],[[8292,6189],[3,-1],[16,-9],[2,-1]],[[7547,5461],[-53,39],[-3,2],[-2,1],[-3,2],[-2,2],[-2,2]],[[7482,5509],[9,16],[9,17],[11,16],[3,3]],[[7514,5561],[3,7],[5,10],[2,3],[3,-2],[2,-2],[3,-2],[23,-16],[9,-9],[2,-3],[4,-3],[15,-11]],[[7585,5533],[-1,-3],[-10,-18],[60,-44]],[[7585,5533],[9,16],[8,16],[4,7]],[[7606,5572],[60,-44]],[[7606,5572],[5,8]],[[7611,5580],[9,-6],[19,36],[6,4],[6,-1],[8,-6],[15,-11],[21,-14],[10,18]],[[7705,5600],[50,5],[8,-4],[7,-5]],[[7611,5580],[-6,5],[12,22],[-2,9],[6,4],[10,11],[16,4],[10,0],[48,-35]],[[7729,5708],[1,-10],[-1,-5],[-18,-33],[23,-18],[12,13],[12,6],[12,4],[12,-3]],[[7782,5662],[10,-3],[6,-5]],[[7606,5572],[-53,39],[-4,3]],[[7637,5775],[3,-2],[7,-5],[36,-26],[3,-2],[2,-2],[2,-1],[8,-4],[3,-1],[3,0],[8,-1],[10,-1],[3,1],[2,0],[0,-3],[0,-3],[2,-17]],[[7729,5708],[13,1],[4,0],[42,-30],[-5,-10],[-1,-7]],[[7777,5747],[-2,-4],[-3,-5],[0,-2],[1,-1],[1,-1],[47,-35]],[[7660,5817],[3,-2],[3,-2],[49,-36],[39,-29],[2,-1],[1,-2],[1,-3],[2,1],[5,2],[3,1],[4,0],[5,1]],[[7679,5853],[3,-1],[2,-2],[27,-19]],[[7711,5831],[23,-18],[58,-41],[-10,-18],[-5,-7]],[[7711,5831],[1,4],[8,13],[9,16],[2,1],[3,-1],[30,-22],[7,5]],[[7771,5847],[6,-3],[4,-7],[16,-13],[11,8],[29,-21],[7,20],[4,11],[5,8]],[[7853,5850],[17,-13]],[[7771,5847],[1,17]],[[7772,5864],[7,0],[11,5],[5,6],[6,13]],[[7801,5888],[12,-9],[27,-20],[13,-9]],[[7801,5888],[-17,13],[-2,1],[10,18]],[[7792,5920],[9,18],[3,5],[2,4],[0,2],[0,3],[-1,4]],[[7772,5864],[-8,2],[-5,4],[-47,33],[5,9],[7,11],[7,8],[2,2],[3,2],[7,4],[24,7],[-1,-8],[26,-18]],[[7679,5853],[13,24],[16,29],[0,1],[19,34],[17,31],[1,3]],[[7636,5886],[22,41],[26,47],[-15,11]],[[7669,5985],[16,32],[2,3]],[[7687,6020],[10,-8],[1,-1],[29,-25],[4,-3],[3,-2],[5,-2],[3,-2],[3,-2]],[[7621,5897],[10,22],[-11,8],[-8,0]],[[7612,5927],[1,22],[3,10],[4,11],[3,9],[0,13]],[[7623,5992],[8,2],[7,-1]],[[7638,5993],[25,-18],[6,10]],[[7562,5946],[11,19],[9,16],[-1,5],[-14,10],[11,19],[9,19]],[[7587,6034],[21,-16],[9,-9],[1,-3],[5,-14]],[[7612,5927],[-17,0],[-7,1],[-4,1],[-22,17]],[[7587,6034],[-15,10]],[[7572,6044],[12,21],[13,13]],[[7597,6078],[9,-14],[1,-5],[-6,-5],[1,-5],[13,-10],[3,1],[3,4],[2,1],[13,-12],[14,-13],[1,-5],[-13,-22]],[[7597,6078],[14,13],[2,3]],[[7613,6094],[2,-3],[9,-12],[9,-10],[10,-11],[13,-13],[15,-13],[16,-12]],[[7613,6094],[-2,4],[-11,16],[-5,9],[-10,17],[-2,4]],[[6559,2837],[-53,39]],[[6506,2876],[11,22],[14,24],[10,18],[6,11]],[[6489,2725],[-19,5],[-10,7],[-6,9],[-2,10],[0,6],[3,7],[19,35],[12,22],[-11,8]],[[6475,2834],[13,20],[3,0],[0,5],[11,20],[4,-3]],[[6559,2837],[-12,-23],[-13,-23],[-15,-22],[-11,-18],[-15,-15],[-4,-11]],[[6489,2725],[-2,-8],[-2,-22]],[[6485,2695],[-18,-3],[-9,-6],[-10,-9],[-10,-16],[-4,-18],[0,-14]],[[6434,2629],[-9,0],[-11,-1],[1,-75],[4,-4],[5,-3],[58,-43],[4,0],[10,19]],[[6496,2522],[11,-8],[2,-1]],[[6492,2483],[-1,1],[-68,50],[-4,0],[-13,16],[-5,4]],[[6399,2727],[12,-4],[14,-9],[19,37],[-8,6],[39,77]],[[9334,6927],[-22,6]],[[9492,7435],[10,15],[12,18],[2,3],[10,16],[2,3],[20,30],[31,-10],[2,11],[5,13],[7,30],[-13,4],[14,20],[14,22]],[[9641,7660],[15,-3],[17,-6],[10,-3]],[[9683,7648],[-3,-6],[-3,-13],[1,-2],[0,-2],[-4,-4],[-1,-3],[1,-2],[11,-10],[21,35],[5,-2],[-36,-57],[-5,-7],[-3,3],[1,1],[-1,3],[-2,0],[-13,-10],[-5,-4],[-4,-5],[-12,-10],[-5,-2],[-5,-3],[0,-3],[-2,-7],[0,-2],[8,-4],[0,-1],[-4,-2],[-4,1],[-2,3],[-2,0],[-1,-1],[-3,-4],[-2,-2],[-1,-2],[1,-6],[2,-3],[8,-4],[1,-2],[1,-1],[-1,-1],[-2,0],[-2,0],[-5,4],[-2,0],[-1,-1],[-3,-3],[-1,-4],[0,-15],[-3,-3],[-5,-14],[2,-3],[7,-1],[4,4],[1,9],[3,-1],[0,-3],[2,-1],[2,-5],[5,9],[3,-2],[-36,-56],[-2,2],[-1,0],[-16,-9],[0,-3],[-1,-1],[-7,2],[0,1],[-1,0],[-31,-27],[-4,-9],[1,-8],[46,16],[1,-5],[-50,-17],[-2,-5],[-1,-6],[-2,-1],[-3,-2],[-10,-10],[-4,-18],[0,-1],[9,-5],[5,-7],[4,-4],[2,-5],[3,0],[14,22],[4,-3],[-19,-28],[-6,-9],[-30,-46],[-4,-10],[-34,-81],[-11,-26],[-3,-9],[-22,-92],[-22,-94],[-4,1],[1,2],[-4,0],[-3,-1],[0,-4],[-6,-1],[-2,0],[-1,-3],[0,-1]],[[9774,7870],[0,-4],[-1,-1],[0,-1],[-2,-10],[8,-8],[-4,0],[-4,3],[-4,2],[-2,0],[-2,-1],[-2,-1],[-8,-14],[-3,-5],[-3,-9],[-3,-5],[-9,-9],[-5,-7],[-8,-18],[-2,-8],[0,-4],[-6,-16],[0,-1],[-2,-12],[-5,-7],[-10,-8],[-4,-6],[-7,-14],[0,-4],[0,-7],[11,-8],[2,-5],[-1,-3],[-2,-2],[-6,-15],[-3,-3],[-4,-10],[0,-1]],[[9261,6900],[14,44]],[[9203,6858],[5,16],[5,17],[6,22],[7,25],[5,16],[1,2]],[[9162,6870],[4,16],[6,16],[6,22],[7,25],[5,19]],[[9116,6865],[5,17],[5,16],[5,16],[6,22]],[[9137,6936],[6,25],[5,19]],[[9156,6852],[-7,3],[-24,7],[-9,3]],[[9066,6863],[5,16],[9,-2],[36,-12]],[[9047,6869],[-11,4],[-11,4],[3,8],[3,7],[4,14]],[[9035,6906],[5,16]],[[9040,6922],[33,-9],[8,-2],[6,16],[6,22],[9,-3],[25,-7],[10,-3]],[[9066,6863],[-9,3],[-10,3]],[[9040,6922],[2,9],[2,8],[7,22],[7,23],[5,18]],[[8990,6920],[6,15],[4,13],[1,4],[1,2],[6,19],[8,24],[6,18]],[[9035,6906],[-9,3],[-28,8],[-8,3]],[[9047,6869],[-8,-25],[-11,4],[-11,5],[-8,-20],[-41,17]],[[8968,6850],[2,7],[7,23]],[[8977,6880],[7,19],[6,21]],[[9049,6805],[-3,-8],[-9,4],[-33,14]],[[9004,6815],[-41,18],[0,1]],[[8963,6834],[5,16]],[[9074,6740],[-32,15],[-9,5],[-8,4],[-33,16]],[[8992,6780],[6,17],[6,18]],[[8950,6799],[7,17],[6,18]],[[8992,6780],[-9,-25],[-8,-22],[-9,5],[-23,11],[-9,4]],[[9008,6691],[-9,5],[-23,11],[-9,5],[-9,4],[-23,11],[-8,5]],[[9001,6670],[-8,-21],[-9,5],[-23,11],[-9,4]],[[8952,6669],[-9,5],[-23,10],[-9,5]],[[9034,6629],[-8,-23],[-9,-26],[-9,-25]],[[9008,6555],[-10,5],[-22,11],[-9,5]],[[8967,6576],[9,24],[9,26],[-9,4],[-23,12],[-9,4],[8,23]],[[8967,6576],[-9,4],[-23,11],[-10,5]],[[8925,6596],[-9,4],[-23,12],[-8,4]],[[8990,6507],[-8,-24],[-9,5],[-23,11],[-9,4]],[[8925,6596],[-8,-25],[-8,-24],[31,-15],[10,-5],[8,-4],[23,-11],[9,-5]],[[9049,6535],[-9,-25]],[[9040,6510],[-9,5],[-23,11],[-9,5],[-9,-24]],[[9008,6555],[9,-4],[13,-6],[10,-5],[9,-5]],[[9058,6419],[-2,1],[-13,7],[-8,4],[-19,9],[-16,-45],[-35,18],[-47,24]],[[9040,6510],[-8,-23],[8,-5],[23,-11],[10,-4],[2,-1]],[[9049,6535],[9,-5],[23,-11],[10,-5]],[[9032,6336],[-7,-23]],[[9025,6313],[-45,24],[-37,18],[7,18],[1,4],[-46,24]],[[9025,6313],[-10,-34],[-6,-23],[-1,-4],[-3,-10],[-3,-7]],[[9048,6191],[-1,0],[-3,-2],[-2,-1],[-2,-1],[-1,0],[0,1],[-3,1],[-2,2],[-3,1],[-3,3],[-3,2],[-3,2],[-2,3],[-1,0],[-1,1],[0,2],[-3,8],[-2,6],[-5,8],[-6,8]],[[9046,6184],[-15,-53],[-32,-108],[-9,-33],[-10,-50],[-7,-29],[-6,-29]],[[8886,5628],[-7,-20],[-28,-87],[-6,-18]],[[8845,5503],[-7,3],[2,6],[4,9],[2,6],[0,1],[4,10],[2,5],[4,13],[4,13],[3,9],[-3,2],[-1,1],[-6,3],[-15,8]],[[8838,5592],[6,9],[5,8],[6,13],[-9,5],[-8,4],[-10,5],[-9,5],[-9,5],[-13,7]],[[8797,5653],[8,20],[8,19]],[[8813,5692],[4,11],[25,69],[0,1],[16,46],[14,38]],[[8872,5857],[7,19],[1,1],[0,2],[1,2]],[[8872,5857],[-14,8],[-10,6],[-11,-27],[-19,10],[6,17],[-17,9]],[[5886,4124],[-6,3],[-16,8],[-18,8],[-12,-35],[0,-1],[0,-1],[26,-28],[-12,-16],[-13,-16]],[[5835,4046],[-18,-23]],[[5817,4023],[-14,14],[-13,15],[-14,14],[-3,3],[-12,12]],[[5761,4081],[31,41],[5,7],[13,27],[1,4],[6,16],[73,-34],[1,-1],[0,-3],[-5,-14]],[[5913,4145],[-1,-5],[-8,-24]],[[5904,4116],[-18,8]],[[5761,4081],[-13,14],[-30,31],[-3,3],[-16,18]],[[5699,4147],[-27,27],[-3,8]],[[5669,4182],[-1,14]],[[5668,4196],[22,5],[28,2],[23,1],[26,-2],[11,-1],[10,-2]],[[5788,4199],[5,-2],[15,-5],[3,-1],[5,-2],[36,-14],[1,-1],[8,-4],[52,-24],[0,-1]],[[5682,3982],[-61,63]],[[5621,4045],[11,15],[13,17]],[[5645,4077],[11,13],[10,14],[6,7]],[[5672,4111],[5,7],[9,12],[2,2],[11,15]],[[5761,4081],[-14,-17],[-14,-18],[-13,-18],[-26,-33],[-6,-7],[-6,-6]],[[5672,4111],[-15,15],[-11,-15],[-2,-1],[-2,1],[-27,29],[-4,16],[18,9],[19,8],[21,9]],[[5645,4077],[-2,2],[-58,62],[-4,-2],[-13,-12],[-11,11],[-3,4]],[[5554,4142],[61,35],[23,10],[26,8],[4,1]],[[5621,4045],[-66,69]],[[5555,4114],[-13,15],[-6,2]],[[5536,4131],[18,11]],[[8278,6087],[-9,-6],[-5,1],[-25,-10]],[[8169,6240],[2,-1],[15,-5]],[[8186,6234],[-1,-3],[0,-5],[10,-28],[9,4],[33,-13],[-11,-30],[14,-12],[5,-4],[1,-2],[1,-3],[0,-5],[0,-20]],[[8186,6234],[72,-29],[3,-1],[2,-1],[16,-6],[11,-6],[2,-2]],[[8195,6317],[72,-40],[9,21]],[[8276,6298],[45,-25],[8,21],[7,20],[7,21],[10,-5],[11,-6],[3,-2]],[[8211,6358],[73,-40]],[[8284,6318],[-8,-20]],[[8292,6339],[-8,-21]],[[8218,6378],[74,-39]],[[8234,6413],[70,-43]],[[8304,6370],[-4,-11],[-8,-20]],[[8332,6434],[-1,-3],[-6,-14],[-8,-20],[35,-19],[-9,-18],[-34,18],[-5,-8]],[[8371,6333],[-3,2],[-64,35]],[[6019,3434],[-11,10],[-6,20],[-12,-13],[-13,13]],[[5977,3464],[-4,5],[-5,2],[-6,7]],[[5962,3478],[12,16],[13,17]],[[5987,3511],[18,24],[16,21],[2,2]],[[6023,3558],[7,-6],[5,-8],[17,-18],[5,-4],[8,-7],[4,-2],[5,-4]],[[6074,3509],[-2,-2],[-15,-26],[-31,-39],[-7,-8]],[[7432,5545],[50,-36]],[[7459,5596],[12,-8],[30,-22],[5,-5],[3,0],[5,0]],[[7471,5617],[9,17],[8,14],[1,4]],[[7489,5652],[2,4]],[[7363,5696],[10,17]],[[7373,5713],[9,17]],[[7382,5730],[54,-39]],[[7436,5691],[53,-39]],[[7436,5691],[10,20],[6,10],[-54,39]],[[7398,5760],[8,11]],[[7382,5730],[10,20]],[[7392,5750],[4,7],[2,3]],[[7392,5750],[-9,6],[-1,0],[-17,12],[-16,12],[-8,6],[-2,3]],[[7339,5789],[3,7],[8,15]],[[7373,5713],[-54,39],[9,17]],[[7328,5769],[11,20]],[[7242,5785],[9,17],[9,17]],[[7260,5819],[68,-50]],[[7260,5819],[12,22],[10,18]],[[7282,5859],[16,-11]],[[7298,5848],[52,-37]],[[7298,5848],[18,32],[9,18],[25,-18]],[[7350,5880],[-2,-6],[-1,-18],[-2,-14],[-6,-12],[16,-11]],[[7282,5859],[5,9]],[[7287,5868],[13,26],[18,33]],[[7318,5927],[26,-17],[16,-12]],[[7360,5898],[-10,-18]],[[7360,5898],[8,-8],[13,-16],[11,-18]],[[7366,5916],[8,-5],[6,-4]],[[7380,5907],[15,-18],[22,-38]],[[7417,5851],[-14,-13]],[[7360,5898],[4,9],[2,9]],[[7392,5923],[13,-15],[10,-16],[16,-27]],[[7431,5865],[-5,-7],[-9,-7]],[[7380,5907],[3,7],[1,10],[8,-1]],[[7392,5923],[19,34]],[[7411,5957],[22,-17],[16,-11]],[[7449,5929],[-4,-10],[-3,-12],[-1,-15],[-4,-16],[-6,-11]],[[7366,5916],[0,7],[-2,8],[0,6],[0,7],[2,6],[3,7]],[[7369,5957],[12,22]],[[7381,5979],[15,-11],[15,-11]],[[7381,5979],[22,42],[10,14],[9,7],[2,2]],[[7424,6044],[3,-2],[12,-10],[6,-6],[5,-7],[4,-6],[3,-8],[3,-10],[2,-16]],[[7462,5979],[3,-28],[1,-7],[2,-10],[1,-3],[-3,-1],[-6,-3],[-5,-1],[-6,3]],[[7369,5957],[-17,13],[10,19],[-1,5],[-18,14]],[[7343,6008],[14,9],[10,18],[9,17],[10,17],[1,2]],[[7387,6071],[16,-12],[18,-13],[3,-2]],[[7490,6111],[9,-20]],[[7499,6091],[-54,-34],[-21,-13]],[[7387,6071],[13,24]],[[7400,6095],[16,-13],[11,22],[5,8],[9,16],[4,1],[22,-16],[5,-13],[18,11]],[[7400,6095],[11,20],[-15,11],[14,26],[-1,5],[-13,9],[7,20]],[[7403,6186],[33,-25],[16,-12],[18,-13]],[[7470,6136],[12,-9],[8,-16]],[[7387,6071],[-78,59]],[[7357,6213],[11,8],[13,7],[12,6],[8,8]],[[7401,6242],[15,17],[15,16]],[[7431,6275],[6,-7],[2,-9],[-2,-12],[-24,-43]],[[7413,6204],[-10,-18]],[[7546,6172],[-48,-29],[-18,13],[-10,-20]],[[7413,6204],[17,-12],[16,-13],[29,53],[16,-12],[16,-13],[10,-7],[10,9],[10,-19],[9,-18]],[[7565,6184],[-3,-2],[-16,-10]],[[7431,6275],[29,32]],[[7460,6307],[7,7],[9,-11],[3,-7],[9,-16],[8,-12],[15,-20],[12,9],[3,3]],[[7583,6144],[-3,-2],[-16,-10],[-65,-41]],[[7520,5979],[-8,5],[-8,3],[-22,-5]],[[7482,5982],[-20,-3]],[[7572,6044],[-4,-5],[-7,-4],[-4,-3],[-9,-7],[-8,-9],[-9,-14],[-11,-23]],[[7562,5946],[-11,9]],[[7551,5955],[-17,12],[-14,12]],[[7534,5912],[-46,35],[-2,12],[-4,23]],[[7551,5955],[-11,-20],[-6,-23]],[[7587,5836],[-65,48]],[[7522,5884],[8,16],[4,12]],[[7471,5822],[31,25],[9,17],[1,2],[10,18]],[[8458,6764],[4,22],[6,20],[5,19]],[[8473,6825],[7,20]],[[8613,6778],[-1,-2],[-3,-9],[-1,-2],[0,-2],[-6,-22],[-1,-3]],[[8601,6738],[-2,1],[-36,9],[-35,7]],[[8528,6755],[-25,5],[-45,4]],[[8521,6693],[-17,2]],[[8504,6695],[2,33],[0,3],[2,0],[12,-1],[3,-1],[5,26]],[[8601,6738],[0,-2],[-4,-23]],[[8597,6713],[-3,0],[-32,8],[-3,1],[0,-3],[-2,-27],[-15,4],[-17,1],[-4,-4]],[[8513,6626],[5,25],[2,26],[1,16]],[[8597,6713],[0,-4],[-3,-35],[-1,-17],[-2,-14],[0,-3],[-1,-3],[-2,-13],[-4,-19]],[[8584,6605],[-2,0],[-17,5],[-17,5],[-18,6],[-17,5]],[[8736,6670],[-8,-11],[-50,38],[-16,-44],[55,-26],[0,-3],[0,-3],[2,-11],[-11,-24],[-38,15],[-38,20],[-12,-53],[3,-10]],[[8623,6558],[-3,1],[-7,3],[-2,1],[-6,3],[-9,2],[-2,0],[-17,6]],[[8577,6574],[4,16],[3,15]],[[8597,6713],[14,-4],[3,-1],[2,-1],[15,-4],[3,-2],[15,-5],[1,15],[3,17]],[[8653,6728],[16,-10],[18,-12],[18,-13],[17,-12],[14,-11]],[[8631,6817],[14,-10],[14,-11],[8,-6],[8,-5]],[[8675,6785],[-2,-3],[-7,-15],[-6,-14],[-3,-10],[-4,-15]],[[7460,6307],[-13,15],[-17,-18],[-13,10],[4,10],[8,8],[-46,34],[-5,3],[-7,0],[-6,-2],[-4,-4],[-4,-5],[-6,-11],[-16,11]],[[7416,6399],[17,-12],[15,-12],[2,-1],[10,-8],[5,-5],[5,-6],[4,-6],[6,-8],[2,-4],[2,-3],[11,-19]],[[7322,4905],[-56,41]],[[7266,4946],[5,9],[6,10],[56,-42]],[[7333,4923],[-6,-9],[-5,-9]],[[7312,4885],[-56,41],[-25,18]],[[7231,4944],[7,10],[5,9]],[[7243,4963],[23,-17]],[[7322,4905],[-4,-10],[-6,-10]],[[7301,4864],[-56,42],[-25,18]],[[7220,4924],[5,9],[6,11]],[[7312,4885],[-6,-11],[-5,-10]],[[7290,4844],[-56,42],[-25,18]],[[7209,4904],[6,10],[5,10]],[[7301,4864],[-5,-9],[-6,-11]],[[7290,4844],[-10,-18]],[[7280,4826],[-10,7],[-47,34],[-15,12],[-9,6]],[[7199,4885],[5,10],[5,9]],[[7280,4826],[-10,-19]],[[7270,4807],[-10,7],[-72,54]],[[7188,4868],[11,17]],[[7178,4851],[5,8],[5,9]],[[7270,4807],[-5,-8],[-4,-9]],[[7261,4790],[-83,61]],[[7169,4833],[5,10],[4,8]],[[7261,4790],[-5,-8],[-4,-9]],[[7252,4773],[-83,60]],[[7252,4773],[-6,-11],[-6,-11],[-51,37],[-32,23]],[[7157,4811],[6,12],[6,10]],[[7252,4773],[31,-24],[2,0],[-6,-12],[-7,-11],[-6,-11],[-5,-11]],[[7261,4704],[-33,25]],[[7228,4729],[-82,60]],[[7146,4789],[6,12],[5,10]],[[7214,4704],[-82,60]],[[7132,4764],[7,14],[7,11]],[[7228,4729],[-7,-12],[-7,-13]],[[7200,4678],[-63,46],[-19,14]],[[7118,4738],[14,26]],[[7214,4704],[-8,-14],[-6,-12]],[[7200,4678],[-9,-17],[-23,16],[-6,-10]],[[7162,4667],[-58,44]],[[7104,4711],[5,11],[9,16]],[[7151,4646],[-18,14],[-2,-4],[-2,-9],[-5,-13]],[[7124,4634],[-16,8],[-27,12],[-2,3]],[[7079,4657],[2,1],[5,17],[0,2]],[[7086,4677],[6,14],[6,11],[6,9]],[[7162,4667],[-5,-10],[-6,-11]],[[7133,4610],[-57,26]],[[7076,4636],[2,9],[1,8],[0,4]],[[7124,4634],[9,-4],[7,-4],[-4,-9],[-3,-7]],[[7125,4591],[-55,26]],[[7070,4617],[3,10],[3,9]],[[7133,4610],[-2,-3],[-3,-6],[-3,-10]],[[7118,4571],[-10,4],[-45,22]],[[7063,4597],[4,12],[3,8]],[[7125,4591],[-3,-9],[-4,-11]],[[6952,4806],[-42,23]],[[6910,4829],[-36,18],[-7,4]],[[6899,4876],[24,-13],[14,-7],[14,-8],[14,-7]],[[6965,4841],[-3,-9],[-3,-8],[-3,-9],[-4,-9]],[[6933,4749],[-21,10],[-9,4]],[[6903,4763],[-10,4],[-4,3]],[[6889,4770],[4,10],[3,9],[3,8],[3,9],[4,11],[4,12]],[[6952,4806],[-3,-9],[-4,-11],[-3,-8],[-3,-9],[-3,-9],[-3,-11]],[[6889,4770],[-38,18],[-5,2]],[[6846,4790],[4,10],[3,9],[3,9],[3,9],[4,11],[4,13]],[[6889,4724],[-9,5],[-43,20],[-9,5]],[[6828,4754],[7,19],[6,19]],[[6841,4792],[5,-2]],[[6903,4763],[-7,-19],[-7,-20]],[[6876,4687],[-61,29]],[[6815,4716],[4,11],[2,9],[7,18]],[[6889,4724],[-3,-10],[-3,-8],[-3,-8],[-4,-11]],[[6861,4644],[-61,29]],[[6800,4673],[3,10],[4,9],[3,11],[5,13]],[[6876,4687],[-4,-13],[-4,-12],[-4,-9],[-3,-9]],[[6846,4603],[-61,29]],[[6785,4632],[4,11],[4,10]],[[6793,4653],[3,10],[4,10]],[[6861,4644],[-4,-10],[-3,-10],[-4,-10],[-4,-11]],[[6834,4567],[-61,29]],[[6773,4596],[6,18],[3,9],[3,9]],[[6846,4603],[-3,-9],[-3,-9],[-6,-18]],[[6898,4536],[-2,1],[-62,30]],[[6846,4603],[64,-30]],[[6910,4573],[-4,-10],[-3,-8],[-2,-5],[1,-3],[-4,-11]],[[6861,4644],[32,-15],[31,-15]],[[6924,4614],[-4,-10],[-3,-10],[-3,-10],[-4,-11]],[[6876,4687],[63,-31]],[[6939,4656],[-5,-12],[-3,-11],[-4,-10],[-3,-9]],[[6889,4724],[10,-4],[45,-21],[9,-4]],[[6953,4695],[-4,-10],[-3,-8],[-3,-9],[-4,-12]],[[6933,4749],[26,-12],[10,-5]],[[6969,4732],[-9,-18],[-7,-19]],[[7014,4666],[-10,5],[-39,18],[-2,1],[-10,5]],[[6969,4732],[10,-5],[1,0],[18,-8],[19,-9]],[[7017,4710],[10,-5]],[[7027,4705],[-6,-20],[-7,-19]],[[7000,4627],[-61,29]],[[7014,4666],[-3,-10],[-4,-9]],[[7007,4647],[-3,-9],[-4,-11]],[[6985,4584],[-61,30]],[[7000,4627],[-4,-12],[-4,-12]],[[6992,4603],[-3,-9],[-4,-10]],[[6971,4543],[-23,11],[-16,8],[-22,11]],[[6985,4584],[-3,-9],[-4,-10],[-3,-10],[-4,-12]],[[6971,4543],[-3,-9],[-3,-8],[-7,-19]],[[6862,4436],[-64,30],[-4,3],[-17,9],[-38,18],[6,18],[6,18],[6,18],[6,18],[61,-30],[3,10],[6,15],[1,4]],[[6830,4348],[-66,18]],[[6764,4366],[-10,3],[-51,15],[-39,10],[-49,13],[-4,1],[-2,1]],[[6609,4409],[2,4]],[[6611,4413],[23,62],[13,32],[2,4],[3,8]],[[6652,4519],[15,41],[7,17],[10,27],[2,3],[0,1],[2,5],[12,31]],[[6700,4644],[1,-1],[2,-2],[1,-1],[2,-3],[3,-9],[1,-1],[1,-2],[2,-1],[2,-1],[1,-1],[3,0],[14,-7],[22,-10],[18,-9]],[[6652,4519],[-3,1],[-3,2]],[[6646,4522],[1,3],[6,18],[7,18],[-9,4],[-11,5],[-38,19]],[[6702,4649],[-1,-3],[-1,-2]],[[6646,4522],[-8,4],[-46,22],[-4,2]],[[6588,4550],[4,11],[3,9],[4,10],[3,9]],[[6575,4513],[3,9],[3,9],[4,10],[3,9]],[[6646,4522],[-8,-18],[-7,-18],[-7,3],[-2,1],[-43,20],[-4,3]],[[6568,4493],[-62,30]],[[6506,4523],[7,19],[6,19]],[[6519,4561],[7,18],[7,21],[7,18]],[[6575,4513],[-4,-10],[-3,-10]],[[6569,2685],[-2,0],[-35,5],[-47,5]],[[6496,2522],[-17,12],[17,31],[8,18],[2,15],[-1,18],[-20,-3],[-4,24],[-6,0],[-20,-3],[-21,-5]],[[6402,2406],[-1,148]],[[7401,6242],[-17,-2],[-90,68]],[[7343,6008],[-10,-4],[-15,-3],[-36,0]],[[7318,5927],[-12,10],[-10,12],[-5,7],[-4,10]],[[7287,5966],[-2,8],[-1,5],[-2,22]],[[7259,5922],[-15,11],[-16,12]],[[7287,5966],[-5,-1],[-23,-43]],[[7287,5868],[-23,17],[-1,6],[6,11],[6,8],[-16,12]],[[7282,5859],[-41,32],[-13,10]],[[7228,5901],[-14,11],[-14,10]],[[7228,5901],[-3,-7],[-4,-7],[-2,-3],[-2,-4],[-1,-4],[-4,-6]],[[7212,5870],[-14,9],[-13,10]],[[7185,5889],[-13,10],[-7,4],[-7,5]],[[7187,5824],[-13,10],[-13,10]],[[7161,5844],[4,8],[20,37]],[[7212,5870],[-6,-12],[-9,-17],[-10,-17]],[[7161,5844],[-13,9],[-14,10]],[[7532,5214],[1,-5],[-14,0],[-6,-11],[-12,-18],[-5,-10]],[[7496,5170],[-58,40],[-5,-8],[-4,-7],[-4,-8],[-4,-8]],[[7421,5179],[-20,14]],[[7401,5193],[13,21],[11,20],[-9,7],[-41,30],[-3,2]],[[7478,5254],[15,-11],[15,-11],[24,-18]],[[7401,5193],[-8,6],[-7,5]],[[7386,5204],[-33,25],[-7,4]],[[7354,5145],[-46,33],[10,20],[-5,3],[-4,3],[-2,2],[-1,1],[-3,2],[-38,28]],[[7265,5237],[10,19]],[[7386,5204],[-11,-21],[-11,-19],[-10,-19]],[[7354,5145],[-11,-21]],[[7343,5124],[-46,34]],[[7297,5158],[-9,6],[-5,5],[-4,4],[-1,2]],[[7278,5175],[-3,4]],[[7275,5179],[-1,3],[-2,2],[-1,2],[-2,2],[-3,3],[-6,5],[-8,6],[-5,1],[7,14],[11,20]],[[7389,5090],[-11,-19]],[[7378,5071],[-8,6],[-38,28],[-10,-20],[-46,34]],[[7276,5119],[11,19],[10,20]],[[7343,5124],[37,-28],[9,-6]],[[7276,5119],[-11,-20]],[[7265,5099],[-37,28],[-3,2],[-1,0],[-1,0],[4,7],[14,12],[17,12],[15,10],[0,3],[5,2]],[[7378,5071],[-10,-20],[-11,-19],[-9,-17],[-9,-18]],[[7339,4997],[-9,6],[-29,22],[-8,6]],[[7293,5031],[-9,6],[-29,21],[-8,6]],[[7247,5064],[9,18],[9,17]],[[7274,4996],[-43,31]],[[7231,5027],[5,9],[5,9],[-3,2],[9,17]],[[7293,5031],[-10,-18],[-4,-8],[-5,-9]],[[7344,4944],[-57,42],[-13,10]],[[7339,4997],[-10,-17],[9,-7],[15,-12]],[[7353,4961],[-4,-8],[-5,-9]],[[7344,4944],[-6,-10],[-5,-11]],[[7243,4963],[8,8],[7,7],[9,9],[7,9]],[[6352,1008],[-1,-19]],[[6351,989],[-19,0],[1,46],[-2,5],[-24,-16],[-20,-13],[-18,-14],[6,-9],[-1,-23],[-7,-1],[-1,-26]],[[6211,879],[-2,78]],[[6209,957],[2,8]],[[6211,965],[5,3],[15,11],[22,15],[19,14],[18,15],[22,15],[16,11],[19,18],[28,30],[30,23]],[[6405,1120],[0,-13]],[[6405,1107],[-5,-2],[-15,-23]],[[6385,1082],[-4,-4],[-29,-22],[0,-11],[0,-25],[0,-12]],[[6211,966],[4,23]],[[6215,989],[4,3],[2,-1],[1,-2],[1,-4],[0,-3],[-1,-3],[-2,-3],[-2,-3],[-3,-4],[-4,-3]],[[6351,989],[2,-77]],[[6353,912],[-20,0],[-1,41],[-16,0],[-2,-1],[-1,-1],[-1,-3],[0,-9]],[[6353,912],[0,-77]],[[6180,4293],[-2,1],[-1,1],[-41,19]],[[6101,4396],[7,-28],[18,7]],[[6176,4336],[7,17],[1,3],[-1,12],[18,-3],[3,0]],[[6204,4365],[-1,-8],[-3,-9],[-15,-42],[-5,-13]],[[6024,4170],[-8,-3]],[[6016,4167],[-36,-4],[-35,16],[-12,-3],[-7,4],[-2,1]],[[5924,4181],[3,8]],[[5927,4189],[8,23]],[[5935,4212],[3,-1],[17,-8],[17,-8],[1,1],[1,1],[4,9],[4,5],[5,6],[9,5],[12,5],[9,3],[8,-14]],[[6025,4216],[-5,-5],[-4,-6],[-4,-9],[-5,-16],[0,-2],[1,0],[16,-8]],[[7110,4547],[-9,4],[-47,22]],[[7054,4573],[5,12],[4,12]],[[7118,4571],[-5,-13],[-3,-11]],[[7103,4528],[-55,26]],[[7048,4554],[3,10],[3,9]],[[7110,4547],[-4,-10],[-3,-9]],[[7091,4486],[-18,8],[-40,20]],[[7033,4514],[4,11],[4,10],[4,10],[3,9]],[[7103,4528],[-3,-10],[-3,-10],[-3,-11],[-3,-11]],[[7020,4476],[4,11],[3,9],[3,9],[3,9]],[[7091,4486],[-7,-18],[-7,-19]],[[6971,4543],[62,-29]],[[6985,4584],[63,-30]],[[6992,4603],[62,-30]],[[7000,4627],[63,-30]],[[7007,4647],[63,-30]],[[7014,4666],[9,-5],[38,-17],[8,-4],[7,-4]],[[7027,4705],[9,-5],[38,-17],[12,-6]],[[7017,4710],[3,8],[4,9],[5,9],[5,8],[4,8]],[[7038,4752],[23,-16],[3,-1],[2,-2],[3,0],[8,-2],[2,-1],[10,-7],[15,-12]],[[7038,4752],[5,9],[4,8],[4,8],[4,7],[39,-28],[2,-1],[7,-5],[15,-12]],[[7038,4752],[-42,31]],[[6996,4783],[4,9],[5,8],[4,7],[4,9],[1,0],[2,3],[0,2],[1,3],[4,4],[6,6],[2,3],[3,3]],[[7032,4840],[2,-2],[3,-2],[75,-55],[5,-6],[15,-11]],[[6969,4732],[5,10],[4,8],[4,8],[5,9],[4,8],[5,8]],[[6952,4806],[44,-23]],[[6965,4841],[4,8],[3,9],[8,15],[2,4]],[[6728,821],[50,-10]],[[6778,811],[25,-6],[50,-12],[41,-9],[99,-23],[15,0],[7,2],[13,3],[7,3],[4,3],[1,2]],[[7040,774],[13,-10]],[[5536,4131],[-20,6],[-20,21],[-2,14]],[[5494,4172],[14,17]],[[5508,4189],[46,-47]],[[5536,4131],[-40,-24]],[[5496,4107],[-2,1],[-15,12],[-8,9],[14,9],[-3,17]],[[5482,4155],[12,17]],[[5382,4039],[-2,-1]],[[5380,4038],[-7,7],[-3,5],[-11,12]],[[5359,4062],[3,2],[4,-1],[8,-7],[3,-1],[9,6],[18,11]],[[5404,4072],[14,8],[15,12],[14,18]],[[5447,4110],[35,45]],[[5496,4107],[-2,-1],[-12,-7],[-13,-8],[-87,-52]],[[5585,3901],[8,8]],[[5593,3909],[20,-21],[40,-41],[16,-17]],[[5669,3830],[-15,-19]],[[5654,3811],[-77,81]],[[5577,3892],[8,9]],[[5593,3909],[9,7],[27,21]],[[5629,3937],[39,-40],[1,-3],[9,-47],[-1,-4],[-2,-5],[-6,-8]],[[5668,3680],[-3,3],[-43,45],[-23,24],[-20,20],[-53,54]],[[5526,3826],[4,3],[11,13],[13,17],[1,4]],[[5555,3863],[15,20],[7,9]],[[5654,3811],[-23,-30],[54,-58]],[[5685,3723],[7,-7],[1,-2],[-25,-34]],[[5654,3811],[54,-56]],[[5708,3755],[-23,-32]],[[5692,3654],[-24,26]],[[5708,3755],[56,-58]],[[5764,3697],[-13,-18],[-1,-2],[-3,-3],[-7,-8],[-48,-12]],[[5724,3527],[-15,16],[-3,5],[-26,26],[-12,-16],[-13,-16],[-13,-19],[-13,-18]],[[5629,3505],[-15,15]],[[5614,3520],[-13,14]],[[5601,3534],[89,117],[2,3]],[[5692,3654],[64,-66],[7,-7],[2,-3]],[[5765,3578],[-2,-2],[-14,-18],[-3,-1],[-10,-15],[-12,-15]],[[5689,3476],[-14,-18]],[[5675,3458],[-4,2],[-14,15]],[[5657,3475],[-28,30]],[[5724,3527],[0,-3],[-35,-48]],[[5756,3465],[-8,8],[-20,22],[-6,-19],[-13,-17],[-3,-1],[-17,18]],[[5765,3578],[12,-12],[7,-7],[25,-26]],[[5809,3533],[-2,-3],[-16,-20],[-11,-15],[-11,-15],[-13,-15]],[[5812,3408],[-11,-15],[-15,-18],[-14,-18]],[[5772,3357],[-14,15],[-15,15],[-33,35]],[[5710,3422],[-35,36]],[[5756,3465],[7,-7],[5,-5],[14,-14],[16,-15],[14,-16]],[[5866,3352],[-17,18],[-16,16],[-3,3],[-2,3],[-16,16]],[[5809,3533],[40,-42]],[[5849,3491],[33,-34],[15,-16],[11,-10],[10,-7],[2,-2]],[[5920,3422],[-2,-2],[-18,-23]],[[5900,3397],[-11,-14],[-12,-15],[-11,-16]],[[6611,4413],[-2,1],[-1,0],[-3,1],[-3,0],[0,1],[-1,2],[0,1],[0,2],[2,2],[2,3],[-52,26],[4,13],[4,9],[3,10],[4,9]],[[6609,4409],[-3,0],[-3,1],[-5,2],[-35,10],[-39,11],[-45,10]],[[6479,4443],[1,4],[3,10],[9,25],[4,12],[4,10],[3,10],[3,9]],[[6478,4648],[-3,-9],[-4,-9],[-7,-22],[-6,-17]],[[6458,4591],[-7,-18],[-6,-20],[61,-30]],[[6479,4443],[-40,7],[-29,7],[-3,1],[-63,22],[-34,12],[-9,3]],[[6458,4591],[61,-30]],[[7555,912],[-65,18]],[[5962,3478],[-36,37],[-33,33]],[[5893,3548],[13,17],[12,17],[20,23]],[[5938,3605],[31,-33],[-18,-24],[36,-37]],[[5938,3605],[16,21],[2,2],[14,17],[10,12]],[[5980,3657],[67,-69]],[[6047,3588],[-10,-12],[-14,-18]],[[5980,3657],[9,12]],[[5989,3669],[7,9],[14,17]],[[6114,3594],[-8,0],[-12,-17],[-15,-22],[-6,5],[-26,28]],[[5894,3747],[43,-46],[9,12],[43,-44]],[[5938,3605],[-42,43]],[[5896,3648],[-20,22],[-1,1],[-2,0],[-1,1],[-5,6]],[[5867,3678],[12,13],[2,5],[2,2],[3,2],[-16,17],[14,17],[10,13]],[[5865,3512],[-40,41],[14,19]],[[5839,3572],[14,18],[12,17],[13,17],[18,24]],[[5893,3548],[-15,-18],[-13,-18]],[[5839,3572],[-22,23],[14,18],[-3,2],[-5,6],[-14,15],[6,8],[7,9],[7,9]],[[5829,3662],[5,7],[18,24],[15,-15]],[[5764,3697],[14,18]],[[5778,3715],[49,-50],[2,-3]],[[5865,3512],[-12,-16],[-4,-5]],[[5962,3478],[-15,-19],[-14,-19],[-13,-18]],[[6222,3365],[-1,2],[-1,1],[-1,2],[-2,2],[-1,1],[-1,2],[-2,1],[-2,2],[-2,1],[0,1],[-3,2],[-1,1],[-1,0],[-2,1],[-1,1],[-2,1],[-2,1],[-2,0],[-5,4],[0,1],[-2,1],[-1,1],[-1,1],[-2,1],[-1,1],[-2,3],[-1,2],[-2,3],[-3,3],[-4,4],[-5,7],[-35,37],[-22,21],[-3,4],[-32,28]],[[6122,3588],[14,-12],[12,-9],[14,-7],[15,-8]],[[6177,3552],[34,-19],[13,-6],[16,-9],[19,-10],[3,-1],[2,-2],[4,-1]],[[6268,3504],[-3,-6],[-3,-10],[-8,-22],[-6,-18],[-12,-31],[0,-1],[-2,-4],[-1,-4],[-1,-1],[-1,-3],[-1,-3],[0,-1],[-2,-7],[-1,-2],[-1,-3],[-1,-6],[0,-1],[-1,-4],[0,-3],[-1,-5],[-1,-4]],[[6323,3388],[-4,-40],[-11,-24],[-22,-4],[-6,-11],[-1,-49],[5,-6]],[[6284,3254],[1,-6],[-1,-6],[1,-6],[2,-8],[-25,-25],[26,-26],[49,-54],[46,-49]],[[5977,2710],[-9,13],[-10,9],[-14,15],[-89,100],[-52,48],[-3,2],[3,2],[4,2],[5,3],[2,1],[5,3],[7,4],[3,2],[5,3],[20,10],[8,5],[3,2],[7,4],[3,2],[3,2],[1,1],[5,4],[1,1],[2,1],[7,6],[20,24],[8,11],[11,16],[8,10],[7,8],[13,17],[4,6],[8,9],[2,3],[11,14],[8,12],[21,26],[11,12],[10,10],[6,8],[2,2],[1,1],[0,2],[1,2],[0,3]],[[6046,3151],[15,20],[1,1],[11,14],[2,3],[34,44],[14,19],[12,15],[4,7],[4,6],[4,5],[1,1],[4,5],[5,6],[3,5],[4,5],[2,3],[2,1],[0,1],[3,4],[4,3],[4,3],[3,2],[2,1],[4,2],[2,1],[5,1],[4,1],[6,0],[1,0],[2,3],[2,3],[2,4],[1,0],[1,3],[2,3],[2,6],[2,4],[1,3],[1,4],[0,2]],[[6512,3265],[-25,-6],[-45,-11],[-14,-4],[-54,-13]],[[6374,3231],[-6,-2],[-19,-4],[-19,-6],[-10,-2],[-10,10],[-17,17],[-9,10]],[[6374,3231],[3,-3],[4,-3],[5,-6],[13,-15],[9,-9],[9,-8],[29,-30]],[[6607,3102],[-19,14],[-25,-46],[19,-14],[20,-16]],[[6636,3157],[-2,-4],[-27,-51]],[[6627,3087],[-25,-47]],[[6607,3102],[20,-15]],[[6657,3142],[-30,-55]],[[6296,2451],[13,25]],[[6334,2524],[13,24]],[[6347,2548],[0,1],[0,1],[0,1],[4,7],[4,7],[2,1],[1,-1],[1,-1],[-1,-2],[-3,-6],[7,2],[3,6],[-6,7],[4,10]],[[6192,2521],[6,-4],[52,-35],[16,-10],[4,-3],[26,-18]],[[6155,2125],[-67,43]],[[6195,2210],[-16,-36],[-8,-15],[-9,-17],[-7,-17]],[[6215,2087],[-60,38]],[[6179,2009],[-60,38]],[[6119,2047],[8,18],[8,18],[9,18],[11,24]],[[6119,2047],[-45,29],[-15,8]],[[6076,1955],[-59,38]],[[6119,2047],[-8,-18],[-9,-19],[-8,-18],[-9,-18],[-9,-19]],[[6117,1876],[-59,38]],[[6058,1914],[9,20],[9,21]],[[6171,1991],[-10,-20],[-8,-17],[-8,-18],[-9,-20],[-9,-19],[-10,-21]],[[6058,1914],[-9,-18],[-8,-18],[-60,38]],[[6108,1858],[-8,-19],[-9,-20],[-10,-22],[39,-26],[2,-3]],[[6122,1768],[-10,-14],[-14,-21],[-19,-21],[-18,-17],[-20,-14],[-17,-8],[-1,-1]],[[6117,1876],[-9,-18]],[[6170,1839],[-48,-71]],[[6108,1858],[43,-25],[11,15],[1,-3],[7,-6]],[[6230,1931],[-2,-3],[-1,-2],[-57,-87]],[[6301,1836],[-26,18],[-32,19],[-12,-8],[-14,-6],[-31,-14],[4,-4],[26,-17],[14,-9],[13,-9],[43,-28],[13,-8],[6,-3],[8,17],[8,16],[4,9],[1,1]],[[6326,1810],[27,-18],[9,-5],[-6,-9]],[[6356,1778],[-17,-30],[-5,-10],[-159,101],[-3,-10],[-9,-16]],[[6331,1865],[-1,-3],[-3,-6],[-3,-2],[-5,-3],[-4,0],[-14,-15]],[[6301,1836],[-4,-5],[-2,-2],[31,-19]],[[6367,1771],[-11,7]],[[6886,3478],[-19,13]],[[6867,3491],[20,33],[26,47]],[[6867,3491],[-18,-32]],[[6849,3459],[-19,14]],[[6830,3473],[65,117]],[[6720,3393],[56,101],[8,17]],[[6784,3511],[63,116]],[[6830,3473],[-10,-20],[-51,-96]],[[6849,3459],[-11,-19]],[[6886,3478],[-28,-53]],[[6858,3425],[-20,15]],[[6858,3425],[-16,-33]],[[6975,953],[-17,7],[-18,6]],[[6940,966],[-5,3],[-7,1],[-4,-3],[-4,-5],[-14,-49],[-13,-22]],[[6893,891],[-10,9],[-13,9],[-11,9],[-8,7]],[[6851,925],[-4,3],[-18,15]],[[6984,983],[-1,-4],[-8,-26]],[[6959,897],[-7,-21]],[[6952,876],[-15,12],[-16,13],[19,65]],[[6975,953],[-16,-56]],[[6952,876],[-13,-22]],[[6939,854],[-10,8],[-10,8]],[[6919,870],[-8,7],[-18,14]],[[5935,4212],[2,8],[2,4],[3,4],[4,7],[4,6],[2,3],[4,4],[6,6],[13,10]],[[5975,4264],[30,11],[19,4],[10,1],[12,1]],[[6046,4281],[0,-3],[0,-10],[3,-10],[6,-15]],[[6055,4243],[-16,-13],[-14,-14]],[[6124,4232],[-13,-36]],[[6111,4196],[-3,1],[-9,5],[-7,4],[-6,3],[-8,6],[-5,4],[-8,9],[-5,6],[-5,9]],[[6046,4281],[14,0],[4,0],[9,-1],[14,-3]],[[6087,4277],[12,-4],[13,-6],[7,-3],[3,-1],[2,-2],[2,-2],[1,-3],[1,-3],[1,-2],[-1,-5],[-4,-14]],[[6146,4200],[-1,-4],[-3,-9],[-5,-14],[-8,-21]],[[6129,4152],[-3,1],[-26,14]],[[6100,4167],[11,29]],[[6124,4232],[18,-8]],[[6142,4224],[1,-4],[7,3],[5,17],[4,2],[-15,-41],[2,-1]],[[6094,4060],[0,1],[11,29],[2,4]],[[6107,4094],[22,58]],[[6146,4200],[11,-6],[11,-5]],[[6168,4189],[22,-10]],[[6190,4179],[-1,-4],[-2,-6],[-9,-24],[-10,-31],[-8,-22],[-8,-27],[0,-40]],[[6107,4094],[-3,2],[-39,18]],[[6065,4114],[4,8],[3,5],[3,6],[7,8]],[[6082,4141],[15,20],[3,6]],[[6065,4114],[-2,1],[-47,52]],[[6024,4170],[36,-17],[16,-8],[3,-2],[3,-2]],[[6094,4060],[-2,1],[-8,3],[-117,55],[-37,18],[-17,8]],[[5913,4145],[6,23],[4,9],[1,4]],[[6083,4031],[-7,-19],[-14,-33],[0,-1],[-7,-18],[-7,-17]],[[6048,3943],[-4,1],[-42,44]],[[6002,3988],[11,15]],[[6013,4003],[11,15],[18,-18],[15,44],[5,16],[-2,2],[-79,37],[-35,16],[-1,0],[-1,-2],[-5,-14]],[[5939,4099],[-18,8]],[[5921,4107],[-17,9]],[[6013,4003],[-47,49],[-1,2],[0,2],[10,26],[-18,9],[-18,8]],[[6002,3988],[-12,-15]],[[5990,3973],[-57,60]],[[5933,4033],[-15,15],[-5,6],[-10,9],[5,6],[13,38]],[[5932,3902],[-15,16],[-6,7],[-8,7]],[[5903,3932],[19,25],[-14,15],[-13,14]],[[5895,3986],[7,7],[4,5],[2,2],[12,15],[13,18]],[[5990,3973],[-14,-16],[-14,-15],[-11,-14],[-19,-26]],[[6009,3893],[-14,-18],[-3,-5],[-13,-17]],[[5979,3853],[-3,3],[-30,32],[-14,14]],[[5979,3853],[-42,-54],[-12,-16]],[[5855,3887],[14,18],[15,-15],[15,-17],[9,13],[5,4],[4,2],[5,2],[5,2],[5,6]],[[5967,3739],[-23,24],[-9,9],[-10,11]],[[5820,3769],[15,20]],[[5835,3789],[13,16]],[[5835,3789],[-54,58]],[[5781,3847],[13,16]],[[5765,3827],[16,20]],[[5669,3830],[54,-56]],[[5629,3937],[10,9]],[[5639,3946],[8,6]],[[5647,3952],[63,-66]],[[5710,3886],[55,-59]],[[5710,3886],[15,19],[56,-58]],[[5647,3952],[20,18],[15,12]],[[5682,3982],[56,-60]],[[5817,4023],[-14,-18],[-13,-18]],[[5817,4023],[56,-59],[23,-24],[7,-8]],[[5835,4046],[29,-30],[28,-29],[3,-1]],[[8740,6667],[-4,3]],[[8675,6785],[15,-11]],[[8690,6774],[24,-16],[-2,-3],[-10,-19],[18,-14],[21,-15],[4,-5],[3,-7],[0,-4],[0,-5],[0,-4],[-2,-6],[-6,-9]],[[8696,6785],[-6,-11]],[[8700,6813],[-8,-16],[-4,-8],[8,-4]],[[8737,6756],[-41,29]],[[8757,6795],[-9,-17],[-7,-15],[-4,-7]],[[5826,3300],[-17,18],[-15,16]],[[5794,3334],[-2,2],[-20,21]],[[5866,3352],[-1,-3],[-1,-3],[-33,-43],[-2,-2],[-3,-1]],[[5873,3251],[-32,34],[-15,15]],[[5900,3397],[16,-16],[15,-16],[16,-16]],[[5947,3349],[-12,-15]],[[5935,3334],[-11,-15],[-13,-15],[-24,-34],[-14,-19]],[[5842,3210],[-16,16],[-9,-3],[-6,-2],[-8,1],[-8,2],[2,-6],[2,-15],[-1,-7],[-1,-8],[-8,-10],[-15,-19]],[[5757,3177],[17,21],[1,4],[1,4],[-1,4],[-12,11],[-14,16],[15,19],[-16,18]],[[5748,3274],[36,47],[8,9],[2,4]],[[5935,3334],[43,-45],[-12,-17],[-1,-2],[-10,-12],[-11,-16]],[[5947,3349],[30,38],[2,3]],[[5979,3390],[3,0],[1,3],[4,4],[3,1],[5,3],[3,6],[4,5],[17,22]],[[6046,3151],[-4,-5],[-2,-3],[-2,2]],[[5977,3464],[-23,-31],[5,-3],[8,-5],[-11,-23],[23,-12]],[[7623,2573],[4,6],[2,3],[7,10],[12,16],[5,8]],[[7653,2616],[19,26]],[[7672,2642],[5,8],[3,4],[2,3],[6,9]],[[7672,2642],[-20,15],[-18,14],[16,23]],[[7682,2740],[-64,46]],[[7618,2786],[15,22]],[[7661,2825],[2,-1],[52,-37]],[[7715,2787],[-18,-26]],[[7650,2694],[-64,46]],[[7586,2740],[10,14],[6,9],[8,10],[8,13]],[[7653,2616],[-39,27],[-45,35],[-16,12]],[[7553,2690],[17,27],[16,23]],[[7524,2739],[11,6],[11,9],[12,9],[10,9],[13,6],[16,5],[7,3],[7,6],[9,7],[13,9]],[[7553,2690],[-10,-11],[-14,-23]],[[6694,3114],[-30,-55],[19,-14]],[[6683,3045],[-16,-29],[-15,-14]],[[6712,3101],[-29,-56]],[[6770,3058],[-30,-56]],[[6740,3002],[-20,16],[-19,14],[-18,13]],[[6740,3002],[-18,-34],[-9,-11]],[[6772,2913],[-11,-22]],[[6791,3043],[17,-14]],[[6808,3029],[-29,-55]],[[6779,2974],[-26,-47],[19,-14]],[[6797,2960],[-25,-47]],[[6779,2974],[18,-14]],[[6807,2887],[-1,4],[-2,2],[-2,-2],[-30,22]],[[6797,2960],[29,-21],[5,-3]],[[8040,2949],[13,17],[8,11],[15,20]],[[8076,2997],[11,-9],[35,-28]],[[7006,800],[-13,11],[-8,7]],[[6985,818],[-7,5],[-8,7],[-8,6],[-8,6]],[[6954,842],[-8,7],[-7,5]],[[6959,897],[53,-42],[16,-13]],[[7028,842],[10,-8]],[[7038,834],[-15,-15],[-17,-19]],[[6915,794],[-18,4],[-18,5]],[[6879,803],[20,51],[7,-6],[12,20],[1,2]],[[6954,842],[-1,-2],[-9,-24],[-15,13],[-14,-35]],[[6985,818],[-1,-2],[-14,-35],[-18,4],[-18,5],[-19,4]],[[6839,901],[-11,-24],[-20,13],[-6,-20],[17,-11],[-3,-6],[-3,-12],[-16,9],[-7,-27],[17,-4],[18,-4]],[[6825,815],[18,-3],[18,-5]],[[6861,807],[18,-4]],[[7006,800],[9,-6],[9,-8],[16,-12]],[[6778,811],[27,95],[-15,-9]],[[6790,897],[-34,2]],[[6756,899],[42,25],[16,9],[12,8],[3,2]],[[6851,925],[-1,-2],[-11,-22]],[[6861,807],[7,26],[15,32],[-14,12],[-15,12]],[[6854,889],[-15,12]],[[6825,815],[10,35],[19,39]],[[6728,821],[0,1],[14,46],[19,-8],[4,14],[23,11],[2,12]],[[6650,838],[14,8],[10,7],[35,21],[11,6],[11,7],[2,2]],[[6733,889],[4,3],[6,3],[3,2]],[[6746,897],[1,-3],[9,5]],[[6746,897],[-3,5],[2,0],[13,10],[23,80],[4,14]],[[6733,889],[-11,4],[-2,-1],[-7,3],[-21,8],[-22,8]],[[6670,911],[24,83],[-4,1],[6,22]],[[6696,1017],[6,22]],[[6702,1039],[24,-10]],[[6726,1029],[-12,-43],[22,-8],[21,-8],[12,44],[3,12]],[[6726,1029],[-5,7],[3,17],[-1,5],[-5,10],[-28,43],[12,20]],[[6702,1039],[2,8],[-1,8],[-3,6],[-5,5],[-77,30],[-6,-24],[-6,-24]],[[6606,1048],[-4,-14],[-2,-8],[-22,-81]],[[6578,945],[-51,19],[-3,1]],[[6524,965],[-3,7],[-3,9],[-1,4],[-1,3],[0,3],[-1,3],[0,4],[0,5],[-1,5],[1,4],[0,4],[0,8],[1,5],[0,8],[1,5],[1,12]],[[6518,1054],[0,6],[1,21],[2,25],[2,16],[0,7],[1,13],[1,10],[0,3],[0,5],[0,3],[0,5],[0,7],[-1,5],[0,6],[-1,8],[0,5],[-1,5]],[[6522,1204],[0,1],[1,7],[-1,2]],[[6522,1214],[2,2],[3,0],[19,18],[41,35],[9,7],[3,1],[2,2],[5,3]],[[6696,1017],[-90,31]],[[6670,911],[-21,7],[-31,12],[-1,2],[-4,0],[-3,2],[-32,11]],[[6533,876],[1,6],[2,7],[1,7],[1,7],[0,4],[0,9],[-1,5],[0,5],[-2,7],[-2,6],[-1,4],[-3,8],[-5,14]],[[6531,876],[-20,5],[-26,5],[-25,6],[6,26],[-26,9],[-4,7],[-4,56],[2,9]],[[6434,999],[50,-19],[9,34],[5,16],[4,18],[3,11]],[[6505,1059],[10,-4],[3,-1]],[[6434,999],[-13,6],[6,38],[1,7],[4,9],[6,7],[16,17],[19,-11],[32,-13]],[[6403,864],[1,23],[0,8],[2,114],[-1,82],[0,16]],[[6405,1120],[7,6],[52,37],[20,13],[11,10],[19,18],[4,4],[1,2],[2,2]],[[6521,1212],[0,-1],[1,-7]],[[6352,1008],[21,1],[3,-1],[3,-1],[7,0],[5,1],[2,1],[0,3],[-1,3],[-2,4],[0,9],[0,6],[2,7],[1,1],[0,25],[-5,11],[-3,4]],[[8760,6653],[-2,1],[-18,13]],[[8737,6756],[31,-22],[-4,-18],[12,-3],[5,-18],[0,-16],[11,-4],[-4,-12]],[[8615,6424],[4,1],[24,77],[-6,3],[-7,3],[-9,38],[2,12]],[[8537,6472],[3,5],[12,27],[8,18],[1,2],[1,3],[8,24],[7,23]],[[8417,6569],[26,-21],[20,-15],[6,12],[2,9],[3,9],[3,6],[5,5],[-4,8],[-3,10],[7,3],[7,-2],[4,10],[2,7],[4,19],[14,-3]],[[8417,6569],[9,17],[9,23],[4,16],[5,21]],[[8444,6646],[6,34],[1,21]],[[8451,6701],[36,-3],[17,-3]],[[8341,6674],[31,-8],[3,21],[1,19],[4,4],[33,-1],[18,0],[-1,-27],[-4,-31],[18,-5]],[[8347,6737],[5,2],[19,1],[33,0],[30,-1]],[[8434,6739],[20,-1]],[[8454,6738],[0,-4],[-3,-33]],[[8384,6768],[50,-1],[0,-28]],[[8458,6764],[-4,-26]],[[8427,6853],[16,-12],[12,-8]],[[8455,6833],[6,-3],[12,-5]],[[8410,6866],[10,19],[10,19]],[[8430,6904],[41,-30],[-8,-20],[-8,-21]],[[8430,6904],[10,19],[-32,22],[8,16],[1,6]],[[8417,6967],[35,-25],[33,-24]],[[8485,6918],[21,-15]],[[8433,7005],[71,-52]],[[8504,6953],[-8,-15],[-9,-17],[-2,-3]],[[8514,6971],[-10,-18]],[[8442,7022],[72,-51]],[[8453,7042],[71,-51]],[[8468,7071],[71,-51]],[[8546,7034],[-7,-14]],[[8409,7114],[7,14]],[[8475,7085],[71,-51]],[[6924,2944],[18,-14]],[[6905,2958],[36,66]],[[6884,2974],[4,8],[5,8],[4,8],[4,8],[5,9],[4,7],[5,9],[5,9]],[[6905,2958],[-21,16]],[[6884,2974],[-24,17]],[[6847,2967],[13,24]],[[6797,2960],[30,56]],[[6808,3029],[19,-13]],[[6808,3029],[36,67]],[[2104,990],[-13,-3],[-18,-4],[-6,-3],[-6,-4],[-5,-4],[-16,-14]],[[2040,958],[-23,38],[-3,5],[-4,4],[-4,3],[-1,1]],[[2005,1009],[6,14],[-28,17],[-7,4],[-3,4],[-1,6],[-4,16],[3,2],[5,2],[7,4],[14,-19],[2,-1],[3,0],[1,2],[4,8],[6,8],[8,9],[9,8],[9,6],[4,2],[19,5],[4,-23],[8,2],[6,2],[4,1],[3,3],[6,5]],[[2093,1096],[13,-10],[-10,-24],[-1,4],[-3,-1],[-2,-2],[-1,-2],[0,-4],[2,-7],[8,-37],[5,-23]],[[4045,3461],[-16,-12],[-33,-25]],[[3982,3413],[-19,-15]],[[3963,3398],[-31,31],[-35,37],[-17,19],[-4,4],[-9,9],[-12,13],[-28,29],[-7,8],[-2,2],[-3,1],[-4,1],[-3,1],[-3,0],[-6,1],[-5,1],[-6,0],[-13,-6],[-7,-3],[-12,-2],[-5,-1],[-9,-1]],[[3742,3542],[0,6]],[[3742,3548],[16,1],[10,0],[14,7],[5,2],[5,1],[11,-1],[10,0],[5,-3],[7,-1],[8,5],[11,2],[11,1],[2,1],[6,0],[21,-5],[2,-1],[6,-4],[9,-5],[14,-7],[23,-5],[33,-6],[6,-1],[5,-1],[16,-2],[2,1],[17,0],[4,0],[14,2],[10,2],[28,5],[11,0],[26,16],[16,8],[20,0],[18,-2],[18,1],[46,7],[14,4],[7,1],[3,1],[6,4],[2,0],[3,1],[1,1],[11,5],[17,5]],[[4292,3588],[64,-59]],[[4356,3529],[-8,-5],[-9,-6],[-6,-7],[-10,-6],[-10,-4],[-2,-1],[-4,-1],[-3,-2],[-2,0],[-8,-3],[-10,0],[-11,1],[-22,-2],[-31,-2],[-18,-1],[-22,3],[-32,5],[-8,0],[-14,0],[-17,-3],[-24,-9],[-4,-2],[-19,-10]],[[7345,3904],[-13,-22]],[[7332,3882],[-19,15],[-18,13]],[[7295,3910],[-19,13],[-19,15],[-19,13]],[[7238,3951],[12,22]],[[7250,3973],[57,-42]],[[7307,3931],[38,-27]],[[6618,5223],[-22,-57]],[[6596,5166],[-4,2],[-43,21],[-4,2]],[[6545,5191],[11,30]],[[6556,5221],[52,149],[7,20],[1,3]],[[6616,5393],[10,-7],[8,-5],[38,-27],[3,-2]],[[6675,5352],[0,-2],[-1,-2],[-3,-6],[-28,-54]],[[6643,5288],[-10,-24],[-15,-41]],[[6732,5273],[-17,12],[-20,13],[-19,13],[-17,-34],[-16,11]],[[6675,5352],[36,-26],[17,-13]],[[6728,5313],[36,-25]],[[6764,5288],[-2,-4],[-3,-4],[-10,-21],[-17,14]],[[6732,5273],[-12,-22],[9,-17],[9,-17],[8,-8],[-9,-17]],[[6737,5192],[-11,9],[-13,23],[-16,-11]],[[6697,5213],[-9,16],[-20,15],[-17,13],[-17,-43],[-16,9]],[[6754,5179],[-17,13]],[[6764,5288],[33,-24]],[[6797,5264],[-2,-4],[-1,-6],[-40,-75]],[[7356,3926],[-11,-22]],[[7307,3931],[12,21]],[[7319,3952],[11,21]],[[7330,3973],[38,-26]],[[7368,3947],[-12,-21]],[[7273,4015],[57,-42]],[[7319,3952],[-58,42]],[[7261,3994],[12,21]],[[7250,3973],[-37,28],[11,21],[37,-28]],[[7238,3951],[-16,12],[-21,15],[-20,15]],[[7181,3993],[-61,47]],[[7120,4040],[31,59]],[[7151,4099],[80,-52],[5,-3],[37,-29]],[[7209,3897],[-36,28]],[[7173,3925],[11,22],[-20,15],[17,31]],[[7238,3951],[-15,-31],[-14,-23]],[[7339,3991],[-9,-18]],[[7151,4099],[8,15],[18,33],[5,15]],[[7182,4162],[8,-3],[37,-28],[26,-19],[19,-14],[4,-3]],[[7276,4095],[4,-2],[26,-19]],[[7306,4074],[-12,-22]],[[7294,4052],[-11,-20],[56,-41]],[[7294,4052],[57,-41]],[[7351,4011],[-12,-20]],[[7306,4074],[56,-41]],[[7362,4033],[-11,-22]],[[7412,4029],[-13,-24]],[[7399,4005],[-37,28]],[[7276,4095],[19,19],[2,2]],[[7297,4116],[4,-4],[1,-1],[16,-13]],[[7318,4098],[94,-69]],[[7318,4098],[7,12],[6,11]],[[7331,4121],[85,-62],[8,-6]],[[7424,4053],[-12,-24]],[[7435,4072],[-11,-19]],[[7331,4121],[5,9],[5,6],[5,4]],[[7346,4140],[89,-68]],[[7346,4140],[8,7],[9,8],[60,-47],[23,-17]],[[7446,4091],[-6,-10],[-5,-9]],[[7457,4112],[-6,-11],[-5,-10]],[[7297,4116],[26,23],[31,27],[13,8],[5,3],[15,5],[6,3],[22,0],[16,-1]],[[7431,4184],[12,-9],[4,-1],[5,-4],[3,-2],[1,-1],[8,-6],[12,-8],[3,-3]],[[7479,4150],[-5,-9],[-6,-9]],[[7468,4132],[-5,-10],[-6,-10]],[[7511,4041],[-65,50]],[[7457,4112],[66,-51]],[[7523,4061],[-6,-10],[-6,-10]],[[7468,4132],[35,-27],[12,-9],[17,-12],[2,-2]],[[7534,4082],[-5,-10],[-6,-11]],[[7479,4150],[6,-5],[40,-30],[8,-6],[11,-9]],[[7544,4100],[-5,-9],[-5,-9]],[[7654,4145],[-17,-31],[2,-2],[5,-4],[16,-12],[-9,-18],[-10,7],[-6,5],[-8,6]],[[7627,4096],[-15,11],[-35,27],[-11,9],[-10,-18],[-12,-21],[0,-4]],[[7431,4184],[4,1]],[[7435,4185],[12,-1],[16,0],[9,1],[6,1],[7,2],[5,1],[16,3],[16,5],[22,8],[16,9],[4,2],[19,14],[9,8],[2,3],[2,1]],[[7596,4242],[10,-7],[7,-5],[3,-3],[8,-6],[1,-2],[19,-15]],[[7644,4204],[-6,-12],[-5,-9],[-8,-15],[29,-23]],[[7604,4055],[-52,40],[-8,5]],[[7627,4096],[-10,-18]],[[7617,4078],[-6,-11],[-7,-12]],[[7604,4055],[25,-18],[3,-2]],[[7632,4035],[-5,-9],[-6,-10]],[[7621,4016],[-87,66]],[[7621,4016],[-5,-9],[-6,-11]],[[7610,3996],[-42,32],[-45,33]],[[7599,3976],[-18,13],[-25,18],[-45,34]],[[7610,3996],[-6,-10],[-4,-8],[-1,-2]],[[7594,3967],[-6,-10]],[[7588,3957],[-20,15],[-23,16],[-45,34]],[[7500,4022],[6,10],[5,9]],[[7599,3976],[-5,-9]],[[7578,3939],[-27,20],[-15,11],[-45,34]],[[7491,4004],[5,9],[4,9]],[[7588,3957],[-6,-12],[-4,-6]],[[7478,3981],[7,12],[6,11]],[[7578,3939],[-2,-5],[-7,-12]],[[7569,3922],[-10,5],[-8,2],[-8,4],[-19,14],[-46,34]],[[8191,3873],[8,29]],[[8199,3902],[1,5]],[[8200,3907],[34,-26],[14,-10]],[[8248,3871],[-6,-16]],[[8242,3855],[-6,-17],[39,-30],[26,-19],[14,-11],[28,-21]],[[8343,3757],[-8,-15],[-7,-12],[-3,-5],[-13,-25]],[[8360,3787],[-8,-15],[-9,-15]],[[8242,3855],[10,-8],[24,-18],[1,-1],[8,-6],[18,-13],[13,-10],[7,-5],[8,15],[-7,5],[-15,11]],[[8309,3825],[5,8],[21,-16],[8,13],[-45,34]],[[8298,3864],[8,15]],[[8306,3879],[45,-34]],[[8351,3845],[21,-16],[8,-6]],[[8380,3823],[-8,-15],[-12,-21]],[[8309,3825],[-16,12],[-7,6]],[[8286,3843],[7,14],[5,7]],[[8351,3845],[4,9],[4,7],[-7,5],[-37,29],[7,13]],[[8322,3908],[2,0],[43,-32],[9,15],[8,14]],[[8384,3905],[13,-10],[15,-12]],[[8322,3908],[7,12],[3,4],[8,15]],[[8340,3939],[16,-12]],[[8356,3927],[28,-22]],[[8356,3927],[7,13],[5,9],[11,19]],[[8379,3968],[12,22]],[[8391,3990],[29,-21],[-13,-22]],[[8407,3947],[-11,-20],[-7,-11],[-5,-11]],[[8407,3947],[18,-14],[11,-8]],[[8436,3925],[-11,-20],[-13,-22]],[[8442,3935],[-6,-10]],[[8391,3990],[12,22],[15,25]],[[8418,4037],[28,-21]],[[8446,4016],[19,-15],[9,-7]],[[8474,3994],[-13,-25],[-13,-23],[-6,-11]],[[8442,3935],[24,-18],[16,-13],[9,-7]],[[6717,5109],[-56,27]],[[6661,5136],[8,22],[6,20],[9,20],[13,15]],[[6754,5179],[-20,-37],[-16,-31],[-1,-2]],[[6754,5179],[21,-15],[32,-6],[6,-4]],[[6813,5154],[-36,-69],[-2,-3]],[[6775,5082],[-58,27]],[[6797,5264],[54,-39]],[[6897,5192],[54,-39],[17,-12]],[[6968,5141],[-2,-4],[-4,-9],[-10,-18],[-18,12],[-11,-21]],[[6972,5040],[-49,35]],[[6923,5075],[-10,7]],[[6968,5141],[31,-22]],[[6999,5119],[-1,-2],[-1,-3],[-1,-3],[10,-6],[-3,-6],[-10,-20],[-10,-19],[-11,-20]],[[6900,5033],[5,8],[6,13],[12,21]],[[6972,5040],[17,-13],[-19,-16],[-19,-17],[-11,10],[-9,7],[-13,9],[-18,13]],[[7103,5060],[-13,-9],[-3,-2],[-7,-5],[-5,-4],[-2,-2],[-4,-3],[-5,-4],[-6,-5],[-5,-5],[-6,-4],[-34,-32],[-13,-11],[-9,-8]],[[6824,4872],[-2,1],[-1,0],[-2,1],[-3,2]],[[6816,4876],[24,19],[9,5],[13,6],[13,5],[22,4],[9,2],[9,3],[12,6],[3,1],[-15,38],[-6,12],[-5,9],[-8,12],[-10,13]],[[6886,5011],[5,6],[6,11],[3,5]],[[6999,5119],[33,-24],[16,-11],[16,-12],[3,-1],[3,-1],[13,0],[4,-1],[5,-1],[3,-1],[3,-2],[3,-2],[1,-3],[1,0]],[[6886,5011],[-7,8],[-1,2],[-8,8],[-11,8],[-12,9],[-10,6],[-11,6],[-51,24]],[[6816,4876],[-5,2],[-2,3],[-5,2],[-4,1],[-17,8],[-13,5],[-20,10],[-31,14]],[[6719,4921],[8,22],[46,136],[2,3]],[[6824,4872],[-2,-2],[-2,-1],[-2,-2],[-4,-5],[-7,-7],[-2,-3],[-5,-7],[-3,-5],[-4,-7],[-5,-9],[-4,-6]],[[6784,4818],[-2,-6],[-8,-13],[-5,-10],[-3,-7]],[[6766,4782],[-1,1],[-2,1],[-4,2]],[[6759,4786],[9,16],[9,18],[-34,16],[-8,4],[-31,15],[-8,4]],[[6696,4859],[7,18]],[[6703,4877],[7,21],[4,11],[5,12]],[[6841,4792],[-9,5],[-36,16],[-7,4],[-5,1]],[[6828,4754],[-9,4],[-50,23],[-3,1]],[[6815,4716],[-52,24],[-2,1],[-10,5]],[[6751,4746],[-4,1]],[[6747,4747],[3,4],[7,15],[9,16]],[[6800,4673],[-57,28],[-3,1],[-7,3],[0,4]],[[6733,4709],[7,15],[11,22]],[[6793,4653],[-43,20],[-14,7],[-3,2],[-11,5],[11,22]],[[6683,4823],[9,-4],[31,-15],[8,-4],[14,-7],[14,-7]],[[6683,4823],[2,2],[5,15],[2,7],[4,12]],[[6641,4907],[62,-30]],[[3400,3543],[-4,3],[-54,21],[-23,24],[-5,5],[-3,2],[-3,5]],[[3308,3603],[7,1],[19,1],[7,0]],[[3341,3605],[8,0],[16,1],[9,0],[9,1],[2,0],[6,0],[13,-3]],[[3404,3604],[21,-7],[6,-3],[11,-6]],[[3442,3588],[3,-2],[20,-14],[63,-41]],[[3528,3531],[-12,-24],[-2,-5],[-44,16],[-70,25]],[[3341,3605],[-5,5],[-126,131],[4,4],[7,2],[13,3],[3,-1],[14,-15],[26,9],[127,-133],[0,-6]],[[7377,3964],[-9,-17]],[[7351,4011],[37,-28]],[[7388,3983],[-11,-19]],[[7399,3832],[-30,22],[-18,13],[-15,12],[-4,3]],[[7356,3926],[66,-51]],[[7422,3875],[-11,-21],[-12,-22]],[[7381,3799],[-12,-20],[-65,47]],[[7304,3826],[10,18],[2,4],[0,2],[16,32]],[[7399,3832],[-18,-33]],[[7381,3799],[22,-19],[4,-3],[2,-3],[8,-16]],[[7417,3758],[-7,-3],[-8,-3],[-7,-1],[-4,-1],[-7,-2],[-9,-3],[-23,-10],[-9,-4],[-6,-3]],[[7337,3728],[-7,-3],[-21,-9],[-5,-3],[-4,-2],[-3,-2],[-3,-2]],[[7294,3707],[0,2],[-1,2],[-1,1],[-36,27]],[[7256,3739],[12,22],[11,22],[2,2],[3,4],[8,13],[2,4],[10,20]],[[7256,3739],[-37,27]],[[7219,3766],[12,23],[11,22],[11,21],[2,3],[11,19]],[[7266,3854],[36,-26],[2,-2]],[[6677,5055],[-16,7],[-9,-22],[-5,2],[-1,0],[-3,0],[-5,3],[-33,16],[-2,1],[-2,2],[-4,2],[8,23]],[[6605,5089],[17,-8],[11,33],[1,3],[1,2],[1,0],[2,1],[1,-1],[1,0],[13,-6],[28,-13],[3,-3],[4,-6],[0,-4],[-1,-5],[-3,-6],[-7,-21]],[[6605,5089],[-33,16],[22,57],[2,4]],[[6596,5166],[65,-30]],[[6717,5109],[-1,-3],[-2,-2],[-19,-57],[-18,8]],[[7142,5009],[-6,-10],[-5,-10]],[[7131,4989],[-7,5],[-46,33],[-3,2],[-6,1],[-5,-5],[-9,-7],[59,-44],[6,-5]],[[7120,4969],[-9,-19]],[[7111,4950],[-10,-19],[-10,-16]],[[7091,4915],[-9,-18]],[[7103,5060],[1,-4],[1,-5],[-1,-7],[1,-4],[0,-2],[2,-2],[1,-1],[2,-2],[3,-1],[6,-3],[20,-16],[3,-4]],[[7131,4989],[-5,-10],[-6,-10]],[[7199,4885],[-32,24],[-56,41]],[[7131,4989],[57,-42],[32,-23]],[[7142,5009],[57,-41]],[[7199,4968],[32,-24]],[[7142,5009],[6,11],[5,9],[5,9],[5,10],[6,11],[5,9]],[[7174,5068],[57,-41]],[[7231,5027],[-5,-10],[-6,-11],[-5,-9],[-5,-10],[-5,-9],[-6,-10]],[[7174,5068],[5,10],[5,8],[5,2],[9,12],[40,-29],[9,-7]],[[7174,5068],[-24,19],[-2,4]],[[7148,5091],[1,0],[12,9],[4,3],[18,12],[15,10],[1,1],[2,1],[5,4],[20,14],[1,1],[24,16],[21,14],[3,3]],[[7103,5060],[11,8],[18,12],[4,3],[12,8]],[[6851,5225],[120,236],[4,8],[4,8]],[[6979,5477],[4,7],[4,8],[4,6],[4,9]],[[6851,5547],[60,-43],[4,8],[4,8]],[[6919,5520],[60,-43]],[[6728,5313],[114,216],[5,11],[4,7]],[[6919,5520],[4,8],[4,7]],[[6927,5535],[4,8],[5,8]],[[6936,5551],[51,-38],[8,-6]],[[6936,5551],[4,7],[4,8]],[[6944,5566],[4,7],[5,9]],[[6953,5582],[33,-24],[26,-19]],[[6953,5582],[5,9],[5,9],[4,9],[6,10],[2,3]],[[6953,5582],[-60,44]],[[6893,5626],[5,9],[5,9],[5,9],[5,10],[2,3]],[[6944,5566],[-60,43]],[[6884,5609],[4,8],[5,9]],[[6927,5535],[-59,44]],[[6868,5579],[4,7],[4,8],[8,15]],[[6860,5563],[4,8],[4,8]],[[6919,5520],[-59,43]],[[6851,5547],[5,9],[4,7]],[[6793,5590],[-9,-18]],[[6784,5572],[-38,26],[-9,6],[-10,-20],[-13,9]],[[6714,5593],[10,20],[11,21],[27,54],[8,16]],[[6770,5704],[7,-4],[6,-5],[-11,-23],[8,-6],[9,-6],[31,-21]],[[6820,5639],[-14,-26],[-5,-8],[-4,-7],[-2,-4],[-2,-4]],[[6784,5518],[-59,41],[-8,5],[-10,-19]],[[6707,5545],[-9,6],[-4,2]],[[6694,5553],[20,40]],[[6784,5572],[19,-13],[1,-2],[-1,-2],[-3,-7],[-6,-10],[-5,-10],[-5,-10]],[[6763,5479],[-65,48],[4,9],[5,9]],[[6784,5518],[-6,-10],[-6,-11],[-5,-9],[-4,-9]],[[6763,5479],[-9,-15],[-39,29],[-11,-19],[-5,-9],[-6,-12],[-3,-7],[-10,7],[-15,10],[10,19],[-13,8]],[[6662,5490],[9,18],[6,12],[17,33]],[[2967,2895],[-40,-34],[-3,-2],[-2,1],[-23,33],[-10,-8],[-4,-6],[-2,-3],[-5,4],[-5,3],[-26,14]],[[2847,2897],[-33,17],[-3,1],[-2,-4],[-6,-18],[-12,-29],[-3,-3],[-7,-7],[-17,-14],[-6,9],[-2,4],[-2,4],[-3,19]],[[2751,2876],[-1,5],[-9,15],[-21,36],[-12,19],[-8,13]],[[2700,2964],[17,14],[31,26]],[[2748,3004],[9,7],[7,5],[13,10],[3,3],[6,5],[16,13],[6,5],[2,3],[4,5],[3,3],[3,3],[3,2]],[[2823,3068],[6,5],[33,28]],[[2862,3101],[46,-78],[5,-10],[6,-27],[3,-9],[6,-14],[21,-35]],[[2949,2928],[18,-33]],[[2901,3123],[-20,-9]],[[2881,3114],[-19,-13]],[[2823,3068],[-40,64],[-4,28],[-10,12],[40,30]],[[2809,3202],[18,1],[29,20],[3,0]],[[2859,3223],[5,-11],[-25,-20],[11,-19],[22,-35],[2,-2],[3,0],[23,10],[1,-23]],[[2386,3567],[-23,7],[1,-3],[0,-3],[0,-2],[0,-3],[-1,-2],[0,-2],[0,-2],[-1,-2],[-1,-2],[-1,-1],[-1,-2],[-1,-1],[-2,-3],[-1,-2],[-8,9],[-16,24],[12,10],[5,6],[4,3],[2,-2],[3,2],[6,6],[1,0],[13,12],[1,1],[0,1],[6,4],[11,15],[-1,2],[0,1],[-1,2],[-1,4],[-1,4],[-2,9],[0,3],[-1,2],[-1,2],[-1,1],[-1,1],[-1,1],[-1,0],[-1,0],[-1,1],[-1,0],[-1,-1],[-2,0],[-1,-1],[-2,-1],[-2,-2],[-4,-3],[-3,-4],[-8,-7],[-15,-14],[-1,-1],[-6,-5],[-4,-3]],[[1693,3865],[4,2],[6,2],[11,0],[3,-2],[6,-4],[4,-6],[4,-4],[7,-5],[3,2],[7,6],[2,0],[5,-5],[1,-1],[5,-3],[6,-1],[3,2],[2,1],[2,7],[5,17],[3,8],[9,18],[6,8],[4,6],[10,9],[4,4],[11,5],[12,3],[10,1],[8,3],[10,1],[7,0],[3,-1],[10,-2],[17,-8],[11,-7],[26,-12],[11,-4],[6,0],[4,-1],[3,-1],[15,-1],[29,0],[44,-5],[8,-1],[30,-5],[10,0],[10,-2],[15,4],[15,-2],[3,-1],[7,-5],[4,-8],[4,-5],[6,-3],[7,-1],[7,2],[12,1],[6,2],[4,-1],[5,3],[18,8],[10,1],[13,1],[4,-1],[2,-1],[0,-5],[-2,-10],[-2,-4],[-8,-17],[2,-9],[0,-3],[1,-2],[11,-4],[17,-17],[17,-24],[21,-18],[40,-21],[10,-6],[9,-9],[7,-4],[5,-3],[0,-7],[5,-23],[-1,-3],[2,-3],[4,-5],[6,-9],[3,-10],[7,-20],[3,-4],[4,-4],[6,-1],[5,-6],[0,-1],[1,-5],[-1,-10],[-2,-9],[-2,-6],[-5,-7],[-11,-10],[-18,-17]],[[1274,3378],[2,27],[1,14],[-1,11],[1,8],[13,33],[6,10],[4,5],[7,4],[7,3],[8,4],[10,8],[4,14],[8,3],[21,-2],[5,3],[3,2],[2,0],[7,-7],[4,0],[13,3],[10,6],[12,10],[9,13],[9,12],[7,10],[12,11],[7,10],[3,13],[1,23]],[[1806,2151],[-14,-10],[-7,-4],[-17,-9]],[[1768,2128],[-12,-5],[-9,-3],[-10,-4],[-7,-6],[-10,-7],[-4,-3],[-22,-14],[-16,-11],[-12,-12]],[[1666,2063],[-10,-7],[-9,-4],[-17,-6],[-16,-6]],[[1614,2040],[-9,-3],[-8,-5],[-5,-3],[-34,-25],[-2,-2],[-5,-3],[-39,-29],[-16,-12],[-11,-9],[-15,-14],[-7,-4],[-5,-2],[-5,-1],[-9,2],[-11,1],[-11,2],[-15,3],[-13,1],[-18,-1],[-12,-1],[-1,8],[-2,4],[-7,13],[-1,1],[-1,1],[-1,0],[-2,0],[-4,-1],[-7,-1],[-2,-1],[-1,0],[-1,-1],[1,-13],[-1,0],[0,-1],[0,-1],[0,-2],[0,-2],[0,-2],[0,-2],[-16,-1],[-8,-1],[-11,-4],[-8,-2],[-10,-3],[-6,0],[-3,1],[-4,1],[-4,2],[-27,19],[-7,5],[-29,21],[-11,6],[-4,2],[-5,2],[-5,2],[-1,0],[-2,-1],[-2,0],[-2,-1],[-13,-8],[-25,-17],[-10,-6],[-3,-2],[-7,-4],[-27,-18],[-66,-43],[-59,-38],[-38,-24],[-55,-35],[-15,-9],[-19,-12],[-19,-11],[-7,-5],[-2,-6],[0,-5],[0,-5],[7,-18],[6,-18],[1,-6],[0,-5],[-1,-10],[-2,-4],[-10,-18],[-4,-7],[-3,-7],[-1,-5],[-2,-7],[-3,-16],[-2,-11]],[[790,1603],[-10,5]],[[780,1608],[5,4],[2,9],[0,11],[-1,5],[-4,5],[0,3],[4,7],[6,2],[11,14],[2,10],[0,9],[-2,5],[0,9],[-1,1],[-2,4],[-36,0],[-7,2],[-8,7],[4,8],[6,1],[0,9],[-3,9],[-7,5],[-7,3],[-5,8],[-8,9],[-7,12],[-5,3],[-5,2],[-25,0],[-3,2],[-9,9],[-7,-2],[-5,-3],[-7,2],[-7,11],[-8,17],[-7,16],[-1,11],[-3,7],[-4,2],[-3,-2],[-1,-2],[-1,-9],[-2,-6],[-6,-4],[-13,0],[-8,1],[-11,15],[-5,10],[-2,11],[0,10],[0,10],[2,7],[8,12],[1,0],[2,-5],[-6,-9],[-1,-5],[1,-3],[4,-1],[4,4],[3,0],[4,-2],[2,-6],[5,-2],[4,0],[9,9],[3,8],[12,12],[5,2],[4,-9],[7,-1],[7,2],[3,5],[6,-1],[2,2],[0,9],[3,8],[8,12],[5,7],[5,10],[4,9],[-1,10],[-1,7],[-3,7],[-3,6],[-5,6],[-6,0],[-3,1],[-5,3],[-5,2],[-10,-3],[-15,-8],[-9,-3],[-9,1],[-7,6],[0,4],[-2,7],[6,8],[5,9],[0,7],[-1,9],[-4,15],[-1,6],[4,9],[6,2],[6,1],[6,-1],[3,-4],[2,-9],[6,-5],[5,0],[8,1],[8,6],[10,10],[0,11],[1,10],[5,8],[5,12],[0,3],[-1,1],[0,5],[3,2],[3,0],[3,-6],[2,-1],[5,0],[2,4],[14,11],[11,0],[7,1],[3,1],[3,4],[-1,2],[-5,3],[-5,7],[-3,11],[-4,8],[0,5],[3,5],[6,2],[3,3],[3,7],[2,10],[-2,9],[-4,3],[-5,-6],[-6,-3],[-5,-2],[0,4],[1,1],[5,6],[3,18],[5,4],[1,9],[3,9],[5,3],[5,8],[10,12],[3,6],[3,12],[4,5],[5,4],[8,0],[6,5],[5,7],[9,8],[8,-1],[1,0],[3,1],[7,6],[9,17],[13,11],[2,-5],[6,-8],[6,-4],[7,1],[6,-7],[1,0],[5,4],[9,4],[1,2],[5,1],[12,15],[6,1],[12,0],[18,14],[10,0],[4,2],[9,0],[4,-4],[6,-1],[9,2],[5,5],[8,5],[8,2],[13,1],[1,-16],[7,-16],[2,-9],[2,-8],[2,-7],[8,-13],[2,-3],[4,-7],[8,-9],[8,-7],[5,-3],[4,-2],[18,-20],[-4,-11],[-4,-5],[-5,-7],[-3,-12],[9,-12],[4,-7],[6,-2],[7,3],[3,4],[6,-4],[2,-5],[0,-18],[-2,-8],[-7,-15],[-1,-4],[0,-1],[0,-8],[2,-13],[7,-14],[1,-4],[9,-15],[2,-24],[14,-30],[2,-7],[12,-23],[3,-10],[3,-1],[3,1],[2,0],[6,-11],[0,-6],[3,-4],[6,-3],[8,3],[8,-4],[7,-6],[13,-2],[7,1],[5,2],[7,-2],[10,-5],[4,-5],[1,-7],[5,-6],[12,-14],[5,-7],[5,-1],[3,-3],[1,-2],[2,-3],[10,0],[5,2],[6,4],[6,3],[7,1],[2,4],[3,2],[5,3],[6,24],[4,3],[6,-1],[16,0],[11,4],[4,3],[4,5],[2,2],[0,-3],[-3,-4],[-2,-2],[-1,-2],[1,-4],[2,-9],[4,-9],[9,-6],[13,-2],[27,1],[5,-12],[2,1],[8,0],[7,1],[6,-2],[10,5],[20,22],[7,10],[-3,12],[-1,12],[6,10],[7,5],[6,-3],[5,-7],[5,-5],[3,1],[6,1],[7,5],[9,12],[14,29],[3,5],[5,13],[11,20],[4,12],[4,6],[9,2],[11,3],[4,3],[-1,6],[-1,5],[1,3],[12,6],[3,-1],[6,4],[3,-2],[4,1],[2,-1],[2,-1],[5,4],[20,13],[2,0],[3,-3],[4,-4],[12,-4],[9,-1],[4,1],[5,8],[4,15],[2,8],[-1,17],[3,3],[7,0],[12,13],[7,3],[23,1],[8,3],[6,0],[3,-2],[4,-1],[6,4],[-2,5],[0,3],[11,10]],[[1787,2228],[-10,-8],[4,-16],[25,-53]],[[1955,2280],[-10,-6],[-6,-3],[-14,-10],[-11,22],[-6,-4],[-33,-21],[-1,-3],[0,-3],[11,-21],[3,-2]],[[1888,2229],[-15,-24],[-2,-2],[-19,41],[-2,1],[-13,-9],[-12,-7],[-2,0],[-6,11],[-3,11]],[[1814,2251],[4,6],[3,0],[3,-1],[1,-10],[4,-4],[5,-1],[4,7],[8,22],[2,3],[14,20],[0,6],[4,9],[4,4],[1,0],[5,-6],[17,16],[8,0],[8,-4],[5,-5],[7,-6],[2,2],[5,6],[1,10],[-1,3],[2,1],[2,2]],[[1932,2331],[0,-1],[23,-50]],[[1685,1876],[-5,9],[-9,19]],[[1671,1904],[86,54]],[[1757,1958],[21,-45],[-17,-12],[-33,-21],[-6,-8],[-12,11],[-4,10],[-11,-7],[-10,-10]],[[1808,1847],[-32,-20],[-19,-11],[-18,-12]],[[1739,1804],[-14,31],[-6,8],[-9,10],[-10,9],[-8,7],[-7,7]],[[1757,1958],[33,21]],[[1790,1979],[11,-24]],[[1801,1955],[-15,-9],[0,-3],[8,-17],[21,-47],[0,-2],[-2,-2],[-14,-9],[9,-19]],[[1892,1898],[-50,-31],[-34,-20]],[[1801,1955],[11,8],[5,3],[14,8],[2,0],[1,-1],[10,-22],[16,10],[22,-47],[10,-16]],[[1926,1919],[-34,-21]],[[1790,1979],[25,17],[2,1],[4,3],[5,3],[10,8]],[[1836,2011],[22,19],[26,29]],[[1884,2059],[12,-25],[-9,-7],[-8,-8],[37,-79],[10,-21]],[[7184,3585],[-31,26],[-4,10]],[[7149,3621],[14,27],[7,10],[-7,5]],[[7163,3663],[7,12],[12,24],[12,24],[13,22],[12,21]],[[7294,3707],[-14,-13],[-9,-8],[-11,-11],[-22,-18],[-17,-15],[-8,-8]],[[7213,3634],[-5,-4],[-3,-5],[-1,-3],[-7,-13]],[[7197,3609],[-10,-16],[-1,-4],[-2,-4]],[[7163,3663],[-56,42]],[[7107,3705],[6,11],[12,25],[13,24]],[[7138,3765],[11,22],[13,22]],[[7162,3809],[57,-43]],[[7041,3571],[73,17],[4,8],[31,25]],[[7184,3585],[-8,-15],[-3,-6],[-8,-15]],[[7041,3571],[3,15],[5,12],[15,26],[1,2]],[[7078,3651],[12,20],[12,23],[5,11]],[[7197,3609],[41,-30],[14,23],[1,1]],[[7253,3603],[4,-4],[1,-1],[3,-3]],[[7261,3595],[-8,-18],[-44,-84]],[[7213,3634],[34,-27],[1,-1],[5,-3]],[[7279,3582],[-18,13]],[[7337,3728],[1,-7],[1,-2],[1,-2],[3,-2],[39,-31],[23,-15]],[[7405,3669],[-15,-27],[-26,-16],[-24,-13],[-21,-10],[-18,-13],[-12,-16]],[[7467,3693],[-7,1],[-10,1],[-11,-4],[-4,-1],[-3,-2],[-6,-1],[-8,-2],[-6,-3],[-7,-13]],[[7417,3758],[11,3],[53,8],[19,2],[8,0]],[[7508,3771],[0,-7],[-13,-9],[1,-24],[5,-1],[11,-7],[-36,-26],[-9,-4]],[[7621,3366],[-86,59],[-6,-8],[-57,37],[-6,-12],[-79,53]],[[7467,3693],[3,-5],[27,-23],[4,-5],[21,-12],[16,28]],[[7538,3676],[34,8],[12,-13],[-3,-36],[17,-23],[23,-5],[29,-10],[-9,-13],[-2,-16],[50,-51],[-68,-151]],[[7508,3771],[35,5],[14,2]],[[7557,3778],[27,1]],[[7584,3779],[49,-8]],[[7633,3771],[4,0],[4,-1],[2,-1],[11,-3],[7,1],[23,11],[9,2]],[[7693,3780],[2,0],[2,0],[3,-1],[9,-6],[8,-5]],[[7717,3768],[-3,-8],[-1,-3],[-5,-9],[-2,-3],[-2,-2],[-8,-8],[-1,-1],[-2,-2],[-3,-2],[-3,-1],[-4,-1],[-9,1],[-53,3],[-33,-1],[-3,0],[-4,-1],[-3,-1],[-3,-2],[-4,-3],[-7,-7],[-3,-4],[-11,-18],[-12,-19]],[[7583,3811],[12,-9],[5,9],[39,-29],[-6,-11]],[[7584,3779],[2,7],[-13,9],[-3,1],[-12,9],[9,18]],[[7567,3823],[16,-12]],[[7583,3811],[20,41]],[[7603,3852],[14,-10],[39,-29]],[[7656,3813],[18,-12],[19,-21]],[[7603,3852],[13,22],[5,10]],[[7621,3884],[3,-2],[9,-7],[2,-2]],[[7635,3873],[10,-7],[20,-14],[9,-6]],[[7674,3846],[-6,-12],[-6,-11]],[[7662,3823],[-5,-9],[-1,-1]],[[8132,4257],[13,22]],[[8145,4279],[8,-6],[26,-20],[8,-6]],[[8187,4247],[-5,-8],[-8,-14]],[[8132,4257],[-11,9],[-36,27],[-9,7],[-7,6],[-2,2]],[[8067,4308],[-27,20],[-2,2],[-8,6]],[[8030,4336],[13,22],[9,16]],[[8052,4374],[10,16]],[[8062,4390],[8,-6],[27,-22],[2,-1],[8,-7],[56,-43]],[[8163,4311],[-9,-16],[-9,-16]],[[8118,4233],[-11,8],[-35,28],[-7,-11],[-6,-11]],[[8059,4247],[-9,7]],[[8050,4254],[-9,7]],[[8041,4261],[6,11],[6,11],[7,12],[7,13]],[[8093,4189],[-10,8],[6,11],[6,12],[-36,27]],[[8082,4170],[-10,8],[-28,21],[-8,6],[-9,7]],[[8027,4212],[11,20],[12,22]],[[8052,4120],[-9,7],[5,9],[5,9],[-45,34]],[[8008,4179],[5,10],[5,8],[9,15]],[[8035,4095],[-5,9],[-6,5],[-30,22],[-9,7]],[[7985,4138],[8,15],[5,9],[1,2],[4,7],[5,8]],[[7985,4138],[-10,7],[-28,21],[-9,7]],[[7938,4173],[13,24]],[[7951,4197],[11,18]],[[7962,4215],[7,-6],[39,-30]],[[7962,4215],[9,18],[9,15]],[[7980,4248],[10,-7],[1,-2],[22,-16],[5,-4],[9,-7]],[[2022,1996],[-6,1],[-32,-19],[-9,-7]],[[1975,1971],[-1,6],[-16,34],[-10,21],[-17,36],[-3,6],[-3,0],[-15,-20],[-9,19],[-1,5]],[[1900,2078],[18,23],[46,53]],[[1964,2154],[17,-20],[2,-2]],[[1983,2132],[13,-28],[11,-24],[-17,-14],[10,-23],[11,-24],[11,-23]],[[1900,2078],[-48,103],[-4,-3],[-13,-9],[-2,-1],[-12,-8],[-15,-9]],[[1787,2228],[5,4],[11,5],[5,6],[6,8]],[[1888,2229],[9,13],[11,-23],[-14,-19],[-1,-3],[31,-66],[33,34],[7,-11]],[[1900,2078],[-16,-19]],[[1836,2011],[-13,27]],[[1823,2038],[12,8],[7,7],[26,31],[2,2],[0,2],[0,3],[-3,7],[-6,11],[-25,-19],[-5,-4],[-2,-3],[-3,-4],[-13,12],[-4,4],[-3,3],[-8,14],[-2,2],[-18,-9]],[[1778,2105],[-10,23]],[[7785,4046],[-12,-22]],[[7773,4024],[-10,7],[-10,7],[-8,-15],[-1,-2],[-10,7],[-10,8]],[[7724,4036],[9,18],[12,22]],[[7745,4076],[30,-23],[10,-7]],[[7773,4024],[-8,-15],[-2,-3],[-8,-15],[-1,-2]],[[7754,3989],[-9,-16],[-10,-17]],[[7735,3956],[-39,29]],[[7696,3985],[10,17],[9,17],[9,17]],[[7713,3916],[-10,8],[-19,14],[-9,8]],[[7675,3946],[6,11],[6,11],[9,17]],[[7735,3956],[-10,-18],[-5,-10],[-7,-12]],[[7675,3946],[-3,2],[-8,7],[-9,6],[-1,1],[-9,7],[-9,8],[-9,7],[-17,12]],[[7632,4035],[24,-19],[11,-7],[27,-22],[2,-2]],[[7675,3946],[-14,-26]],[[7661,3920],[-3,1],[-2,0],[-8,6],[-9,7],[-9,7],[-19,13],[-17,13]],[[7661,3920],[-12,-22]],[[7649,3898],[-14,-25]],[[7621,3884],[-6,5],[-9,6],[-17,13],[-17,12],[-3,2]],[[7700,3892],[-12,-22]],[[7688,3870],[-10,7],[-1,1],[-18,13],[-9,7],[-1,0]],[[7713,3916],[-13,-24]],[[7617,4078],[14,-10],[9,-8],[-3,-6],[38,-29],[13,24],[5,11]],[[7693,4060],[10,-8],[9,-6],[9,-8],[3,-2]],[[7654,4145],[14,-11]],[[7668,4134],[36,-26],[10,-8]],[[7714,4100],[-4,-8],[-8,-15],[-4,-9],[-5,-8]],[[7714,4100],[8,15],[8,17],[2,6]],[[7732,4138],[23,-17],[8,-6],[2,-2]],[[7765,4113],[-7,-13],[-4,-9],[-9,-15]],[[7668,4134],[8,16],[5,10],[6,12]],[[7687,4172],[45,-34]],[[7687,4172],[9,19],[10,-7],[11,21],[-10,7],[7,13],[6,13]],[[7720,4238],[37,-28],[2,-1],[5,-2],[1,-1],[1,-1]],[[7766,4205],[-7,-15],[-6,-12],[-11,-22],[-10,-18]],[[7766,4205],[3,-2],[5,-4],[17,-12],[8,-6],[3,-2]],[[7802,4179],[-8,-14],[-8,-13]],[[7786,4152],[-11,-22],[-10,-17]],[[7810,4195],[-8,-16]],[[7766,4205],[9,16],[5,10],[5,10]],[[7785,4241],[7,12],[8,-7],[17,-13],[8,-6],[3,-2]],[[7828,4225],[-6,-11],[-12,-19]],[[7720,4238],[5,9],[5,8],[5,10],[6,10],[44,-34]],[[7840,4247],[-12,-22]],[[7720,4238],[-36,26],[-3,5],[-8,9],[-4,5],[-5,3],[-20,16]],[[7644,4302],[37,53],[1,1]],[[7682,4356],[8,-7],[8,-9],[19,-15],[86,-50]],[[7803,4275],[9,-7],[16,-13],[9,-7],[3,-1]],[[7687,4172],[-29,22],[-14,10]],[[7596,4242],[9,8],[6,8],[18,25],[13,17],[2,2]],[[7591,4344],[20,-15],[3,-1],[28,-21]],[[7642,4307],[-2,-3],[4,-2]],[[7596,4242],[-4,3],[-19,15],[-16,11],[-5,2]],[[7552,4273],[8,14],[6,11],[6,11],[6,11],[-67,52]],[[7511,4372],[6,12],[6,11]],[[7523,4395],[68,-51]],[[7591,4344],[6,10],[5,10],[6,12]],[[7608,4376],[33,-24],[22,-16],[-9,-12],[-6,-9],[-6,-8]],[[7523,4395],[6,10],[5,10],[7,11]],[[7541,4426],[39,-29],[28,-21]],[[7541,4426],[6,12],[8,13]],[[7555,4451],[7,14],[6,12]],[[7568,4477],[37,-27],[31,-23]],[[7636,4427],[-6,-12],[-8,-14],[-7,-13],[-7,-12]],[[8574,3762],[-30,-96],[-18,-58],[-9,-42],[-3,0],[-5,0],[-4,-2]],[[8433,3609],[13,36],[10,31],[8,18],[8,17]],[[8472,3711],[7,14],[7,14],[2,3]],[[8472,3711],[-6,5],[-4,3],[-5,4],[-2,2],[-12,10],[-8,5],[-16,-28],[-5,-9],[-24,18]],[[8390,3721],[20,38]],[[8410,3759],[8,14],[9,15]],[[8359,3664],[5,10],[7,12],[4,8],[7,12],[8,15]],[[8360,3787],[24,-18],[20,-15],[6,5]],[[8068,3836],[8,15],[4,8],[6,12]],[[8129,3839],[-11,-20],[-9,-15],[-8,7],[-25,19],[-8,6]],[[8059,3820],[5,8],[4,8]],[[533,371],[-1,-3],[-1,-6],[-3,-6],[-2,-4],[-5,-11],[-5,-9],[-2,-3],[-2,-5],[-2,-7],[-1,-3],[-1,-6],[-1,-5],[-1,-7],[0,-5],[0,-7],[0,-5],[0,-6],[1,-8],[2,-10],[1,-5],[2,-15],[0,-4],[0,-3],[0,-2],[-1,-4],[-1,-6],[-1,-3],[-3,-7],[-2,-6],[-1,-4],[0,-4],[-1,-5],[0,-7]],[[502,180],[0,-3],[3,-10],[1,-3]],[[506,164],[-2,-2],[-5,-3],[-10,-8],[-7,-6],[-7,-7],[-7,-8],[-10,-11],[-8,-10],[-6,-11],[-4,-6],[-8,-16],[-9,-18]],[[423,58],[-1,1],[-5,3],[-5,-4],[0,-4],[-3,2],[-18,14],[-23,19],[-30,17],[-6,1],[-1,3],[3,0],[33,-17],[26,-22],[2,5],[-15,16],[3,1],[23,-16],[16,-13],[2,5],[-15,9],[-17,14],[-19,30],[0,3],[4,4],[1,7],[-1,6],[3,10],[0,9],[6,14],[2,3],[1,7],[0,2],[-1,5],[-14,19]],[[374,211],[19,37]],[[393,248],[7,-11],[11,-16],[5,-8],[4,-6],[13,-19],[5,11],[21,39],[17,35],[18,33],[3,5],[14,25],[7,14],[9,17],[-1,6],[5,-4],[2,2]],[[393,248],[-2,3],[-4,6],[-6,14],[4,7],[9,16],[15,30],[18,34],[-24,17],[-24,18],[-21,16],[-3,2],[-70,53],[-1,0],[-1,0],[-2,-1],[-3,0],[-3,4],[-13,22],[-8,15],[-10,15],[-4,8],[-30,33],[-19,19],[-10,11],[-4,5],[-3,3],[-2,3],[-4,11],[-3,8],[-1,11],[0,2],[-1,3],[0,7],[5,1],[8,1],[21,3],[18,2],[10,1],[10,0],[10,0],[10,-1],[42,-5],[12,-2],[41,-5],[4,-1],[50,-6],[59,-8]],[[463,623],[4,-6],[64,-126],[1,-5]],[[532,486],[0,-2],[0,-6],[-1,-8],[0,-17],[1,-11],[3,-25],[1,-13],[1,-4],[0,-7],[-1,-8],[0,-3],[-1,-2],[-1,-5],[-1,-4]],[[790,1603],[48,-45],[181,-263]],[[1019,1295],[-32,-16],[-7,15],[-18,-11],[-70,-42],[8,-20],[-77,-58],[-12,20],[-35,-27],[-72,50],[-19,-33],[-37,-19],[-9,30],[-42,-26],[-5,-68],[-25,-15],[-4,-64],[-45,38],[-148,-241],[27,-17],[3,-8],[62,-154],[1,-6]],[[374,211],[-1,2],[-3,1],[-3,6],[-3,2],[-4,2],[-4,7],[-2,3],[-8,10],[-5,13],[-5,8],[-3,2],[-13,16],[-4,7],[-6,20],[-8,13],[-6,9],[-2,6],[-1,8],[-6,12],[-4,6],[-5,4],[-10,6],[-4,-2],[-8,-8],[-3,0],[-3,5],[-7,1],[-1,8],[-7,11],[-3,8],[-4,3],[-5,7],[-4,0],[-3,-5],[-3,-1],[0,3],[2,5],[2,14],[0,9],[2,5],[2,1],[0,2],[1,3],[2,-3],[8,1],[5,5],[5,7],[5,14],[0,12],[0,5],[-3,12],[-4,9],[-4,6],[-2,7],[-4,3],[-4,1],[-7,-3],[-11,-1],[-7,4],[-5,6],[-4,10],[-2,8],[-9,13],[-2,-1],[-2,-2],[-8,-11],[-3,-7],[-4,-10],[-1,-8],[-2,0],[-2,4],[3,10],[-2,9],[0,6],[-1,3],[-5,5],[-3,1],[-1,6],[2,4],[0,3],[-17,29],[-6,13],[-6,9],[-3,2],[-6,0],[-7,0],[-1,-1],[-3,-1],[-14,-3],[-3,-11],[0,-4],[-4,-4],[-9,1],[-5,-4],[-8,-4],[-3,4],[0,7],[0,5],[-1,4],[-2,2],[-3,1],[-4,-2],[-5,-4],[-6,-5],[-5,-4],[-3,-1],[-3,-2],[-1,1],[0,-3],[-3,1],[-1,2],[-9,2],[-2,-1],[0,-3],[-2,-2],[-3,0],[-2,12],[1,4],[19,3],[0,3],[0,2],[-2,2],[-5,-1],[-6,-1],[-4,-1],[0,3],[-1,4],[-2,6],[0,3],[5,2],[2,-1],[2,1],[2,6],[5,14],[2,8],[5,8],[3,4],[4,3],[4,5],[4,4],[11,0],[14,-7],[4,-4],[2,-11],[2,-7],[5,-8],[7,-4],[4,-1],[3,-3],[3,1],[6,0],[9,1],[4,1],[3,0],[0,2],[-3,5],[1,7],[4,7],[2,10],[4,10],[-3,6],[-3,2],[0,4],[2,4],[3,11],[0,8],[-3,12],[-10,10],[-8,9],[-5,3],[-11,3],[-3,3],[-1,3],[-3,0],[-5,1],[-6,7],[-15,1],[-4,-7],[-4,-1],[-5,2],[-5,9],[-3,10],[-2,9],[-6,14],[2,35],[0,13],[-1,3],[0,4],[-2,8],[5,13],[4,9],[4,12],[-5,5],[-2,3],[0,3],[2,1],[7,-3],[7,2],[3,15],[-1,5],[-10,12],[0,5],[3,8],[5,18],[2,11],[5,8],[3,9],[3,13],[1,15],[2,12],[2,15],[3,9],[1,18],[6,22],[1,6],[3,28],[0,1],[2,3],[1,2],[6,-6],[1,0],[2,-2],[-3,-6],[1,-1],[2,-1],[3,5],[2,-1],[5,12],[2,-1],[-3,-7],[2,-1],[6,12],[9,40],[13,15],[9,3],[6,6],[18,-7],[6,-3],[7,2],[5,8],[4,8],[2,10],[-1,7],[-4,7],[-4,13],[-9,36],[-2,11],[0,4],[1,10],[2,4],[1,1],[3,2],[3,2],[0,3],[2,2],[7,2],[1,3],[2,0],[1,-10],[-1,-10],[13,-7],[3,-14],[1,-4],[5,1],[7,5],[6,6],[2,3],[1,3],[1,3],[4,3],[6,2],[5,0],[6,-8],[0,-5],[4,-3],[3,-1],[4,4],[3,9],[3,3],[2,1],[3,0],[7,10],[2,1],[2,-1],[1,-1],[3,1],[3,1],[1,3],[-5,8],[2,2],[5,-8],[2,0],[2,2],[4,0],[3,-4],[3,2],[2,4],[2,2],[2,0],[1,4],[13,8],[4,0],[8,-4],[5,-1],[3,1],[8,4],[5,1],[7,5],[4,7],[3,10],[1,11],[-1,9],[-4,9],[-5,7],[-7,1],[-3,-1],[-5,0],[-24,14],[-6,8],[-2,7],[2,6],[6,5],[4,1],[27,-1],[8,1],[10,7],[11,3],[8,0],[7,-1],[5,-7],[4,-9],[6,-7],[9,-13],[8,-1],[9,3],[22,0],[12,-1],[5,1],[8,3],[8,5],[5,4],[-1,7],[-13,10],[-1,5],[22,-1],[-1,2],[-3,5],[-5,3],[-3,4],[5,0],[9,-4],[7,4],[12,4],[4,5],[3,11],[0,9],[-4,5],[-3,2],[-13,7],[-3,2],[-3,1],[-5,0],[-13,7],[1,7],[6,13],[6,5],[7,0],[4,0],[3,-4],[5,-1],[3,0],[4,5],[5,11],[2,4],[4,5],[5,7],[8,7],[11,10],[3,1],[3,-9],[1,-2],[12,1],[4,-4],[4,-6],[3,-2],[5,-1],[1,1],[1,5],[1,1],[2,0],[0,-7],[0,-4],[3,0],[2,3],[2,-3],[1,-2],[5,-1],[8,1],[-1,3],[4,6],[7,2],[2,-6],[6,-1],[9,-6],[6,-14],[21,-4],[11,-6],[9,-2],[7,-1],[6,7],[6,0],[9,-2],[6,4],[7,12],[15,12],[2,9],[7,3],[7,14],[6,-12],[9,-1],[1,2],[-6,4],[-1,3],[1,6]],[[919,1105],[19,9],[-8,23],[1,1],[18,10],[49,25],[5,2],[4,2],[11,2],[5,1]],[[1023,1180],[28,-74],[-18,-11],[-19,-12],[-15,-9],[-1,-1],[-1,-1],[0,-1],[-1,-1],[-1,-1],[0,-2],[-3,-9],[-13,-49],[-1,-2],[-1,-4],[0,-1],[-1,-2],[-1,-2],[-2,-1],[-2,-1],[-5,-3],[-4,-2],[-5,16],[-1,2],[0,2],[1,1],[0,2],[2,11],[-8,3],[-2,2],[-1,1],[-1,1],[-1,3],[-3,7],[-6,16],[-18,47]],[[919,1105],[-9,24],[-8,20],[-14,34],[0,3],[1,1],[17,9],[19,11],[-8,20],[-7,17],[0,2],[1,0],[0,1],[0,1],[58,30],[2,0],[2,0],[1,-1],[4,-8],[1,-3],[1,-4],[1,-1],[0,-1],[-1,-1],[-8,-4],[7,-21],[18,9],[26,-63]],[[4094,3309],[23,-28],[-33,-36],[6,-6]],[[4090,3239],[-20,-5],[-13,-16],[-5,-4],[-5,1],[-5,2],[-4,5],[-9,20],[-3,9],[-5,8]],[[4021,3259],[16,16]],[[3947,3388],[8,4],[8,6]],[[3989,3344],[-5,5],[-37,39]],[[4025,3298],[-17,-13],[-2,0],[-12,10],[-12,15],[-4,2],[-5,1],[-4,-2],[-5,-3],[-6,-1],[-10,-14],[-1,-2],[-1,-9]],[[3946,3282],[-24,2],[-7,2],[-22,25],[-9,7],[-36,13],[-6,1],[-2,0],[-4,-2],[-11,-7],[1,3]],[[3826,3326],[10,7],[3,12],[3,13],[-48,15]],[[3794,3373],[-3,1]],[[3791,3374],[3,9],[7,26]],[[3801,3409],[2,-1],[72,-25],[14,-3],[15,-1],[5,0],[6,1],[16,2],[10,3],[6,3]],[[1702,1781],[9,-20],[16,10],[3,0],[21,-47],[32,-68]],[[1783,1656],[8,-18],[-1,-3],[-15,-20],[-7,-8],[-11,-18]],[[1757,1589],[-8,7],[-4,1],[-19,-2],[-25,-10],[-10,-4],[-4,-3],[-5,-5],[-9,22]],[[1673,1595],[15,12],[33,13],[-3,26]],[[1718,1646],[0,4],[-2,9],[-5,12],[-7,-3],[-31,-17],[-12,-7],[-9,-5],[-3,-1],[-2,2],[-6,19],[-8,23],[-7,23],[-3,6],[-5,11],[-2,5],[2,2],[31,20],[12,8],[41,24]],[[1757,1589],[-6,-11],[-4,-4],[-29,-21],[-37,-28],[-4,-2],[-2,-2],[-8,-3],[-6,-1],[-2,26],[0,8],[-2,27],[1,4],[12,11],[3,2]],[[1515,1277],[-13,1],[-3,0],[-4,-2],[-17,39],[-2,5],[-30,-19],[-1,0],[0,-1],[3,-19],[0,-1],[1,-1],[1,0],[1,0],[13,7],[1,0],[1,0],[1,0],[1,-1],[1,-1],[8,-17],[2,-5],[1,-5],[4,-27],[1,-1],[5,2],[3,0],[4,0],[8,-1],[1,-5],[2,-14],[1,-9],[-2,-26]],[[1507,1176],[-9,1],[-11,1]],[[1487,1178],[-3,4],[2,34],[-10,5],[-11,51],[-11,-7],[-9,2],[-8,15],[-5,32],[-14,99],[26,13],[-9,52]],[[1435,1478],[45,25],[17,-37],[24,11],[-3,16],[42,12]],[[1560,1505],[5,-19]],[[1565,1486],[-4,-2],[-14,-6],[-9,-6],[-12,-6],[-42,-22],[6,-23],[7,-20],[6,-17],[4,-11],[3,-5],[5,-11],[5,-9],[4,-6],[1,-6],[1,-5],[-1,-6],[-2,-9],[-3,-15],[-5,-24]],[[1565,1486],[11,-56],[3,-18],[1,-9],[1,-5],[2,-13],[4,-22],[8,-45],[0,-20],[0,-10]],[[1595,1288],[-52,-11],[-11,-2],[-4,-1],[-13,3]],[[1595,1288],[2,-9],[6,-19],[8,-21],[-36,-19],[-4,-4],[-5,-3],[-7,-7],[-10,-12],[-3,-4],[-12,-23],[-4,3],[-9,3],[-5,2],[-3,1],[-6,0]],[[1832,1366],[-6,-5],[-12,-10],[-11,-8],[-4,-2],[-7,-3],[-2,-1],[-6,0],[-3,0],[-6,1],[-8,6],[-5,3],[-15,10],[-4,3],[-3,2],[-11,8],[3,4],[2,5],[1,4],[1,5],[2,5],[1,4],[0,6],[0,12],[4,0],[5,1],[2,1],[5,3],[4,2],[5,1],[3,1],[1,0],[2,2],[1,3],[5,-4],[2,0],[1,0],[1,0],[14,4],[1,0],[0,1],[0,1],[0,1],[-4,22],[-2,14],[-1,1],[0,1],[-1,1],[-14,2],[0,8],[1,16]],[[1774,1497],[8,-1],[2,0],[2,0],[1,1],[2,0],[2,1],[2,1],[2,2],[6,3],[18,11],[4,3],[2,-6],[2,-7],[1,-5],[0,-3],[0,-2],[-1,-1],[-1,-2],[4,-9],[1,-4],[14,-69],[1,-3],[0,-1],[-18,-13],[-2,-4],[0,-2],[0,-3],[2,-8],[0,-2],[4,-8]],[[1934,1567],[23,-37],[26,-44]],[[1983,1486],[-93,-74],[-2,-2],[-6,-6],[-3,-2],[-6,-5],[-15,-10],[-26,-21]],[[1774,1497],[-1,9],[-8,45],[1,6],[2,6],[13,19],[7,-6],[2,-2],[1,-2],[4,-7],[1,0],[1,0],[14,9],[1,1],[1,1],[0,1],[0,1],[0,1],[-8,18],[-2,3],[-6,6],[13,15],[3,1],[5,1],[-17,8]],[[1801,1631],[12,15]],[[1813,1646],[20,24],[22,2]],[[1855,1672],[1,-13],[5,0],[14,1],[13,1],[1,-1],[1,0],[0,-1],[1,0],[13,-29],[21,-45],[9,-18]],[[1861,1129],[-7,35],[-2,10],[-45,-6],[2,-12],[-15,-4]],[[1794,1152],[-162,-19],[-4,13]],[[1628,1146],[27,10],[6,2],[22,9],[19,9],[10,4],[16,8],[6,3],[-2,6],[-1,3],[-1,5]],[[1730,1205],[43,23],[5,3],[4,3],[6,-5],[16,9],[15,10],[12,9],[19,13],[23,17],[22,19],[23,18],[67,55],[21,17],[7,6],[14,11]],[[2027,1413],[3,-5]],[[2030,1408],[-22,-19],[1,-7],[14,-64]],[[2023,1318],[-11,-5],[-23,-8],[19,-95],[-31,-17],[-14,4],[-19,-2],[-14,51],[-19,-10],[-9,-9],[1,-3],[-14,-6],[16,-73],[-44,-16]],[[1956,1014],[-20,-6],[-16,-5],[-20,-6]],[[1900,997],[-2,11],[-1,5],[2,5],[3,5],[-9,11],[-1,3],[-1,4],[-3,14],[-9,42],[-5,23]],[[1874,1120],[-13,9]],[[2023,1318],[1,-3],[5,-25],[5,-23],[-19,-5],[3,-15],[0,-5],[-4,-10],[-1,-5],[2,-6],[3,-3],[6,-8],[2,-5],[2,-8]],[[2028,1197],[-15,-4],[-6,-2],[-4,-1],[-10,-7],[-6,-6],[-7,-5],[-10,-11],[-3,-3],[-4,-4],[-2,-1],[-5,-2],[-14,-6],[-6,-4],[-2,-2],[-2,-2],[-2,-3],[-3,-6],[-1,-3],[-2,-8],[-1,-7],[0,-11],[0,-13],[14,1],[3,-2],[1,-4],[1,-3],[14,-64]],[[1874,1120],[-22,-9],[6,-25],[5,-22],[2,-11],[1,-5],[0,-5],[-1,-9],[-1,-1],[-1,-1],[-1,-1],[-1,0],[-24,6],[-22,5],[1,10],[0,9],[0,9],[-5,21],[-6,27],[-6,27],[-2,0],[-1,1],[0,1],[0,1],[0,1],[1,0],[-3,3]],[[1900,997],[14,-65],[72,-11],[9,-12],[5,-4],[-2,-2]],[[1998,903],[-54,-16],[-40,-10],[-47,-12],[-45,-12],[1,-6]],[[1813,847],[-136,-37],[-38,-8],[-32,-9],[-54,-17]],[[1553,776],[-46,314],[-1,2]],[[1506,1092],[0,1],[7,3],[12,6],[16,8],[19,9],[19,8],[9,4],[16,6],[24,9]],[[2040,958],[4,-7],[4,-5],[10,-8],[3,-2],[3,-5],[3,-11],[-69,-17]],[[1956,1014],[8,2],[2,0],[1,0],[3,-2],[28,-22],[7,17]],[[7827,2883],[-1,2],[-31,15]],[[7795,2900],[-50,27]],[[7745,2927],[13,22],[3,1],[2,4],[3,3]],[[7766,2957],[2,4],[1,2],[7,10],[8,9]],[[7784,2982],[21,-21],[20,-19],[7,-7],[9,-9],[9,-9]],[[7850,2917],[-3,-5],[-14,-20],[-2,-3],[-4,-6]],[[2028,1197],[20,4],[21,4]],[[2069,1205],[13,3],[4,-1],[3,-2],[2,-5],[4,-35],[1,-24]],[[2096,1141],[3,-24],[0,-6],[0,-3],[-1,-4],[-1,-3],[-4,-5]],[[1830,564],[-15,90]],[[1815,654],[-23,137],[-2,10],[1,4],[2,1],[28,7],[-1,5],[-1,4],[-1,3],[-1,5],[-2,7],[-2,10]],[[1813,847],[66,16]],[[1879,863],[3,-17],[1,-4],[0,-3],[1,-4],[0,-3],[3,-2],[2,-7],[-1,-3]],[[1888,820],[3,-9],[5,-15],[5,-18],[21,-101]],[[1922,677],[18,-86]],[[1940,591],[-36,-9],[-42,-9],[-19,-4],[-13,-5]],[[2004,847],[5,-26],[12,-61],[0,-3],[0,-2],[-1,-1],[-1,-1],[-4,-3],[-5,-3],[-10,-3],[6,-29],[-19,-11],[-23,-12],[-9,-5],[-12,-4],[-21,-6]],[[1888,820],[25,7],[22,5],[34,9],[4,0],[5,-2],[6,-2],[5,1],[4,2],[6,4],[5,3]],[[2077,670],[-5,-3],[-30,-27],[-12,-10],[-11,-8],[-12,-8],[-17,-9],[-10,-4],[-18,-5],[-22,-5]],[[2004,847],[21,5],[43,11],[5,-23],[5,-22],[5,-24],[6,-29],[-17,-11],[-3,-1],[0,-3],[5,-21],[-18,-10],[-2,-3],[0,-4],[4,-20],[3,-1],[9,5],[7,-26]],[[1962,486],[-1,4],[0,17],[-4,9],[-4,10],[-13,65]],[[2077,670],[15,8],[14,5],[26,9],[4,1],[30,10],[16,5],[5,3],[4,2],[3,1],[5,3],[6,4],[5,4],[5,4]],[[2215,729],[4,5],[9,10]],[[2228,744],[35,-8],[37,-30]],[[2300,706],[-2,0],[-10,-1],[0,-2],[-15,-8],[7,-17],[-5,-2],[-8,12],[-2,-1],[-2,-1],[-1,-3],[-3,-5],[-4,-5],[-6,-10],[-8,-9],[-7,-3],[-7,-3],[-5,-3],[-16,-5],[-4,9],[-4,1],[-2,-2],[-2,-6],[-8,0],[0,-4],[-3,-2],[-5,1],[-1,3],[-2,0],[0,-5],[0,-2],[-2,-1],[-5,-1],[-2,4],[-1,1],[-4,0],[-17,-5],[-3,-1],[-5,-4],[-4,-2],[-8,-7],[-6,-5],[-2,-3],[1,-6],[0,-2],[-3,-2],[-2,0],[-3,1],[-14,0],[-2,0],[-1,-2],[0,-4],[-1,-2],[-1,-1],[-1,1],[-3,4],[-7,0],[-5,3],[-6,0],[-2,-3],[-13,-8],[-5,-11],[-6,-4],[-4,-5],[-3,-2],[-8,-6],[-6,-3],[-5,-5],[-4,-8],[-2,-10],[-3,-8],[-5,-8],[-4,-5],[-2,-4],[-2,-8],[-2,-3],[-16,-1],[-3,-2],[-7,-5],[-4,-4]],[[2537,873],[-28,28]],[[2509,901],[31,18]],[[2540,919],[68,41],[7,-27],[2,-12],[2,-3],[2,-1],[14,-3],[14,-4],[10,-3],[16,-8],[16,-10]],[[2691,889],[9,-5],[6,-4],[4,-4],[4,-2],[13,-10],[6,-6],[6,-2],[51,-24],[28,-13],[6,2],[5,3],[5,4],[4,7],[3,7],[1,8],[1,5],[0,1],[-1,4],[0,3],[3,1],[4,2],[5,3],[8,3]],[[2862,872],[11,3],[11,3],[5,2]],[[2889,880],[9,-7]],[[2898,873],[-4,-1],[-5,-5],[-12,-3],[-18,-8],[-2,-4],[0,-8],[-1,-5],[-1,0],[-3,1],[-4,-3],[-3,-2],[3,-3],[-2,-5],[5,-7],[-5,-6],[-4,3],[-7,-7],[-2,2],[-1,-2],[1,-2],[-4,-14],[-8,-7],[-10,-1],[-3,-4],[-4,-5],[-9,0],[-2,0],[1,20],[-3,13],[-1,1],[-3,-1],[-3,-3],[-2,1],[-7,5],[-1,1],[-7,1],[-3,1],[-2,2],[-7,4],[-7,2],[-9,4],[-4,4],[-3,0],[-2,2],[-2,2],[-3,9],[-1,11],[-2,5],[-6,3],[-6,5],[-5,-2],[-6,3],[-3,3],[-14,8],[-9,7],[0,1],[-1,1],[-7,1],[-5,1],[-14,8],[-6,2],[-4,3],[-11,4],[-10,5],[-3,0],[-7,-1],[-5,-3],[-9,-6],[-2,-2],[-9,-4],[-20,-9],[-8,-6],[-7,-2],[-6,-7],[-2,-1]],[[1618,401],[-2,10]],[[1616,411],[-4,21]],[[1612,432],[15,23],[11,13],[9,8],[12,8],[6,4]],[[1665,488],[6,-35],[6,-30],[10,3],[24,6],[18,5],[6,2],[6,2],[10,1],[-14,83],[28,12],[43,18],[22,9]],[[1962,486],[-10,-12],[0,-4],[2,-4],[2,-3],[4,-13],[0,-4],[-1,-7],[1,-11],[-3,-8],[-11,-13],[-4,-2],[-20,-2],[-2,-1],[-8,0],[-3,1],[-4,6],[-7,14],[-3,4],[-1,4],[-5,2],[-4,10],[-2,4],[-3,4],[-3,0],[-9,-4],[-2,0],[-8,-2],[-6,-2],[-8,-5],[-9,-2],[-5,-7],[-10,-11],[-7,-10],[-4,-4],[-18,0],[-7,5],[-4,4],[-10,4],[-8,4],[-5,1],[-7,1],[-8,-1],[-9,-2],[-14,-6],[-7,-5],[-10,-2],[-12,-5],[-17,-3],[-13,3],[-13,2],[-23,0],[-6,-3]],[[1665,488],[22,14],[12,8],[9,4],[1,3],[-4,22],[-3,15],[-1,9],[-12,74]],[[1689,637],[6,1],[5,0],[4,1],[14,4],[15,3],[12,2],[14,1],[33,3],[23,2]],[[1612,432],[-14,74],[-20,109]],[[1578,615],[-16,112]],[[1562,727],[9,3],[22,7],[21,6],[11,-65],[4,-25],[13,3],[1,-5],[4,-21],[19,4],[12,3],[11,0]],[[1562,727],[-4,21],[-1,5],[-4,23]],[[1578,615],[-12,-7],[-24,-14],[-4,-2],[-6,-3],[-11,-3],[-11,-2],[-16,-9],[-16,-9]],[[1478,566],[-5,34],[-8,47],[-26,-14],[-7,33],[-5,-2],[-8,-4],[-13,-4],[-6,-1],[-3,-1],[-15,-3],[-7,-4],[-19,-11],[-26,-16],[-43,-26],[-13,-8]],[[1274,586],[-31,-18],[-16,-9],[-12,-7],[-2,-3],[-1,-1],[-1,-3],[0,-1],[0,-4],[1,-12],[-1,-4],[-1,-3],[-3,-3],[-4,-2],[-3,0],[-3,0],[-3,0],[1,-12],[-34,-20],[-28,-17],[-7,-4],[-9,-5],[-11,-8],[-13,-9],[-3,-3],[-6,-4],[-2,-1],[-4,-2],[-48,-29],[0,-1]],[[1030,401],[-9,19],[-26,-16],[-40,-24],[-1,-1],[-1,-1],[0,-1],[-12,-118],[-28,3],[-12,-128],[0,-3],[0,-5],[2,-8],[5,-14]],[[908,104],[-9,-3],[-7,-2],[-7,-1],[-8,0],[-23,-1]],[[854,97],[4,44],[9,91],[3,33],[5,93],[-1,4],[21,226],[4,2],[7,3],[3,1],[4,2],[4,1],[1,1],[1,1],[5,2],[2,1],[2,2],[6,3],[2,1],[1,1],[1,0],[8,7],[4,2],[5,4],[8,7],[9,7],[1,1],[2,2],[4,4],[7,6],[1,1],[21,18],[19,17],[2,2],[3,3],[11,10],[24,21],[24,21],[1,1],[2,2],[19,17],[57,51],[14,12],[13,12],[4,3],[1,1],[1,1],[12,11],[12,11],[7,6],[8,7],[41,36],[35,31],[3,3],[5,4],[19,18],[24,21],[20,18],[9,8],[17,15],[7,6],[13,10],[16,12],[6,4],[5,4],[8,5],[5,3],[4,2],[5,3],[4,3],[6,3],[4,2],[8,4]],[[1478,566],[-24,-14],[-7,-5],[-14,-9],[-12,-5],[-25,-12],[-20,-8]],[[1376,513],[-12,-4],[-22,-15],[-24,-16],[-10,-7],[-11,-8],[-22,-10]],[[1275,453],[-2,3],[-1,15],[-1,14],[0,10],[0,8],[3,16],[2,11],[0,10],[0,10],[0,11],[-2,25]],[[2801,2509],[-8,14],[-43,35],[-3,3],[-21,35],[9,8],[3,6],[12,31],[20,-11],[11,-5]],[[2857,2557],[-5,-3],[-19,-17],[-32,-28]],[[3801,3409],[3,11],[2,-2],[8,-9],[3,0],[10,15],[10,-3],[4,-1],[2,0],[1,-1],[2,0],[2,7],[-2,5],[-26,26],[-59,63],[-13,-1],[-3,0],[-2,14],[-1,9]],[[3801,3409],[-36,12]],[[3765,3421],[-3,4],[-9,9],[-47,48],[-56,57],[-2,9]],[[3648,3548],[12,-2],[10,-3],[30,-6],[16,-2],[6,2],[10,4],[10,1]],[[3626,3472],[24,-11],[34,-12],[19,-6],[49,-18],[13,-4]],[[3791,3374],[-69,29]],[[3722,3403],[-59,23],[-37,46]],[[3794,3373],[-12,-48]],[[3782,3325],[-1,0],[-1,1],[-15,16],[6,8],[4,15],[-1,3],[-34,12],[-5,-7],[-6,-8],[-17,-14],[-2,-3],[0,-2],[10,-16],[17,-23],[12,-16]],[[3749,3291],[-16,-15],[-5,-6],[-6,-10],[-6,-16],[-3,-14]],[[3713,3230],[-18,5],[4,21],[4,16],[0,5],[-1,4],[-16,23]],[[3686,3304],[-6,9],[-7,10],[-71,-56],[-7,11]],[[3595,3278],[49,40],[61,74],[5,9],[12,2]],[[3782,3325],[-5,-20],[-3,-7]],[[3774,3298],[-7,-1],[-10,-1],[-8,-5]],[[3713,3230],[-1,-24]],[[3712,3206],[-35,11],[-10,2],[-11,-1],[-10,-2],[-2,-2],[0,-3],[1,-3],[17,-20],[2,-3],[-16,-10],[-19,23],[-3,9],[-3,1],[-16,-6],[-2,-3],[0,-3],[2,-3],[27,-31],[-16,-13]],[[3618,3149],[-15,17],[-14,17],[-7,14],[-5,12]],[[3577,3209],[16,10],[6,3],[17,7],[-5,15],[27,22],[16,12],[32,26]],[[3712,3206],[-1,-60]],[[3711,3146],[5,-45]],[[3716,3101],[-39,-6],[-11,-5],[-13,-9]],[[3653,3081],[-7,21],[-6,17],[-3,7],[-6,8],[-13,15]],[[3577,3209],[-16,-12],[-3,-4],[-10,-12],[-3,-7],[-4,-15],[-1,-10],[-2,-17],[-2,-10],[-6,-12],[-6,-9],[1,-1],[8,-15],[13,-24],[-1,-2],[-13,-10],[-10,18],[-13,24],[-10,-8],[-7,-6],[-5,-9]],[[3487,3068],[-10,5],[-11,3],[-13,0],[-9,-2],[-7,-3],[-9,-6],[-9,-7],[-16,-13],[-18,-14]],[[3385,3031],[-39,66]],[[3346,3097],[-25,44]],[[3321,3141],[18,14],[5,-10],[151,119],[27,-41],[73,55]],[[3321,3141],[-29,48]],[[3292,3189],[18,14],[20,16],[13,10]],[[3343,3229],[28,-47],[20,17],[20,16],[131,103],[1,2],[-1,4],[-12,20],[-14,23]],[[3516,3367],[22,16],[32,26],[26,21],[-94,34],[-79,30],[-12,21]],[[3411,3515],[-4,7],[-7,21]],[[3528,3531],[15,-10],[56,-35],[17,-9],[10,-5]],[[3343,3229],[11,9],[10,8],[20,16],[10,8]],[[3394,3270],[68,54],[21,16],[20,16]],[[3503,3356],[13,11]],[[3394,3270],[-14,23],[12,10],[-12,20],[-3,7],[-3,4],[-12,19],[-12,-9]],[[3350,3344],[-13,24],[68,54]],[[3405,3422],[20,18],[20,17],[23,-41],[12,-20],[12,-20],[11,-20]],[[3292,3189],[-25,42]],[[3267,3231],[-10,18]],[[3257,3249],[18,14],[-3,10],[-1,9],[1,9],[3,8],[11,18],[20,-16],[7,11],[6,6],[4,4],[27,22]],[[3257,3249],[-20,36],[13,10],[-6,11],[-13,-11],[-8,14],[-2,3]],[[3221,3312],[22,17],[-3,6],[-2,6],[0,21],[33,30],[5,5],[10,9],[15,14],[16,14],[22,-32],[17,13],[10,8],[16,12]],[[3382,3435],[11,8],[12,-21]],[[3382,3435],[-23,32],[-10,-9],[-18,20]],[[3331,3478],[-11,11],[13,18],[14,-15],[1,0],[2,0],[17,17],[10,11],[3,4],[3,0],[20,-7],[8,-2]],[[3331,3478],[-17,-16],[-48,49],[-54,56],[-25,25],[8,3],[7,4],[9,3],[13,2]],[[3224,3604],[17,-19],[29,-11],[68,-26],[-46,55]],[[3292,3603],[9,0],[7,0]],[[9039,4992],[-6,1],[-27,7],[-17,5],[-13,4],[-7,4],[-39,21],[-14,3],[-17,9]],[[8899,5046],[5,12],[4,11],[17,-9],[4,12],[5,12],[-17,9],[-9,5]],[[8908,5098],[8,24],[9,23]],[[8925,5145],[5,12],[4,12],[6,14],[0,3],[2,7]],[[8942,5193],[7,3],[6,1],[4,-1],[6,1],[5,0],[6,-1],[3,-1],[13,9],[1,0],[4,10],[3,5]],[[9000,5219],[3,-1]],[[9040,5199],[-24,-47],[4,-4],[-3,-9],[6,-5],[-2,-4],[19,-12],[5,12],[4,-2],[36,72],[-2,2],[25,45],[5,-3],[-18,-41],[4,-6],[1,-4],[-3,-10],[-3,-3],[-3,-6],[-3,-6],[-2,-5],[3,-5],[7,-11],[0,-3],[0,-3],[0,-3],[3,-3],[2,5],[38,59],[11,-9],[-75,-125],[-13,-25],[-23,-48]],[[8942,5193],[-9,4],[-15,8],[-9,5]],[[8927,5255],[60,-30],[3,-2],[10,-4]],[[8474,3994],[10,-7],[14,-12]],[[8498,3975],[26,-20]],[[8446,4016],[12,22],[8,-6],[13,-10],[8,-6]],[[8487,4016],[24,-19],[-13,-22]],[[8418,4037],[9,16],[3,6],[7,13],[9,14],[13,24]],[[8459,4110],[27,-21]],[[8486,4089],[10,-7],[18,-15]],[[8514,4067],[-6,-11],[-15,-28],[-6,-12]],[[8597,4005],[2,-1],[1,-1],[1,-1],[3,-3],[-2,-7],[5,-1],[3,-1],[12,-4],[12,-3]],[[8634,3983],[-13,-66],[6,-2],[-7,-34]],[[8514,4067],[17,-13],[16,-12],[10,-9],[4,-1],[5,-4],[19,-14],[6,-4],[6,-5]],[[3440,1055],[-2,1],[-17,26],[-5,3],[-5,3],[-6,-1],[-7,-3],[-8,-10],[-4,-8],[-3,-9],[-57,-8],[-6,-8],[-3,-2],[-2,-3],[-9,-6],[-1,-3],[-2,-1],[-4,-5],[-3,0],[-6,6],[-3,1],[-7,0],[-1,4],[-2,0],[-7,0],[-4,-2],[-12,-3],[-5,-1],[-10,0],[-5,-1],[-2,-3],[-3,-3],[-11,2],[-1,1],[-4,4],[-2,1],[-4,-1],[-10,-4],[-6,-5],[-3,-3],[-8,-5],[-6,-1],[1,-3],[-3,-4],[-7,-4],[-5,0],[-1,-1],[0,-2],[-1,-2],[0,-1],[2,-4],[0,-1],[-6,-14],[-1,-4],[1,-3],[17,-12],[-7,-7],[0,-5],[-4,-5],[-14,-6],[-6,-2],[-34,-20],[-5,-5],[-2,-3],[-10,-9],[-4,-7],[8,-11],[5,-7],[0,-4],[7,-4],[-1,-2],[7,-7],[2,2],[3,-2],[-6,-10],[-2,1],[-1,0],[2,-2],[1,-4],[-1,-2],[-14,-22],[-6,0],[-5,2],[-8,0],[-4,4],[-2,4],[-2,2],[-7,2],[-5,-2],[-9,-7],[-4,-1],[-12,-10],[-8,-9],[-3,-2],[1,-10],[3,-9],[1,-9],[0,-6],[-2,-4],[-4,-1],[-4,0],[-4,2],[-7,5],[-5,8],[-1,3],[0,4],[1,7],[6,11],[0,7],[-2,5],[-1,7],[-1,5],[1,7],[2,3],[-1,6],[-5,8],[-5,8],[-2,5],[-2,0],[-1,0],[-1,1],[-2,5],[-1,0],[-8,0],[-7,2],[-6,0],[-3,4],[-2,0],[-8,-2],[-4,0],[-4,5],[-9,4],[-4,-2],[-1,0],[-3,0],[-3,4],[-5,3],[-4,-3],[-6,-1],[-6,0],[-3,-1],[0,-1]],[[2889,880],[5,1],[12,4],[-5,22],[22,7],[8,-30],[10,-4],[5,-1],[7,-1],[-5,45],[5,1],[13,4],[20,7],[14,5],[21,7]],[[3021,947],[11,-49],[13,4],[4,3],[4,4],[4,4],[3,3],[15,8],[8,3],[26,7],[16,3],[6,2],[3,1],[3,3],[2,5],[5,10],[2,8],[1,11],[1,7],[4,9]],[[3152,993],[7,10],[6,6],[8,6],[9,6],[6,4],[8,3],[7,3],[6,1],[7,-1],[8,-1],[6,1],[3,0],[19,4],[5,1],[10,0],[14,-1],[8,-1],[8,2],[8,5],[15,18]],[[3320,1059],[22,26],[11,12],[19,21],[11,13],[6,7],[10,9],[8,6],[13,6]],[[3420,1159],[5,4],[20,-86],[-5,-22]],[[2889,880],[3,18],[-16,73],[-53,204],[-1,4]],[[2822,1179],[2,1],[9,4],[1,0],[34,16],[34,16],[20,9],[17,7],[14,6],[27,11],[1,-4],[1,-6],[2,-16]],[[2984,1223],[3,-19],[5,-32],[6,-23],[3,-13],[2,-9],[7,-22],[14,-55]],[[3024,1050],[16,-66],[8,-27],[-27,-10]],[[3024,1050],[19,8],[3,2],[23,7],[20,7],[20,7]],[[3109,1081],[4,-14],[9,-23],[4,-18],[3,-1],[3,-3],[20,-29]],[[3120,1129],[-6,-1],[-5,-2],[-2,-1],[-2,-3],[-1,-4],[0,-6],[5,-31]],[[2984,1223],[8,1],[4,-1],[14,-3],[9,-1],[13,-1]],[[3032,1218],[0,-2],[2,-10],[4,-17],[0,-2],[1,-2],[1,-1],[1,0],[20,-3],[7,0],[19,6],[4,1],[2,-3],[13,-17],[4,-6],[4,-6],[2,-6],[2,-7],[1,-9],[1,-5]],[[3120,1129],[2,2],[10,3],[32,10],[34,11]],[[3198,1155],[24,10],[11,8],[25,17],[17,11],[7,5],[17,11]],[[3299,1217],[1,-3],[2,-8],[0,-2],[1,-5],[0,-5],[-18,-12],[-1,-2],[0,-3],[0,-2],[16,-64],[5,-24],[4,-15],[2,-4],[9,-9]],[[3032,1218],[6,1],[14,4],[9,1],[8,0],[8,0],[3,1],[2,-1],[0,7],[3,10],[2,7],[4,5],[3,4],[22,16],[4,3],[5,10],[2,7],[33,10],[1,-1],[0,-1],[4,-15],[5,-20],[6,-22],[8,-33],[3,-12],[11,-44]],[[2822,1179],[0,1],[-5,18]],[[2817,1198],[114,52],[45,19],[45,20],[49,23],[20,8]],[[3090,1320],[27,11],[95,42]],[[3215,1375],[2,-11],[3,-13],[0,-1],[3,-13],[1,-3]],[[3224,1334],[1,-4],[23,7],[-2,-7],[0,-5],[1,-2],[10,-40],[6,-24],[6,-23],[23,8],[26,10],[7,4],[-5,21],[-6,23],[-11,48],[24,12],[39,22],[25,-104]],[[3391,1280],[-31,-21],[-61,-42]],[[3224,1334],[1,0],[3,1],[29,9],[5,2],[7,2],[14,5],[10,4],[10,4],[16,8],[9,5],[11,6],[8,4],[8,5],[12,8],[4,3],[12,7],[9,7],[11,8],[5,3],[13,8],[14,10],[7,5],[18,12],[13,9],[1,-4],[1,-3],[0,-2],[20,-81]],[[3495,1379],[-20,-19],[-4,-7],[-4,-7],[-3,-8],[-1,-8],[-2,-12],[-1,-18],[-15,1],[-12,-4],[-22,-7],[-9,-3],[-11,-7]],[[3948,1440],[2,-9]],[[3950,1431],[-5,0],[-2,1],[-3,5],[-3,8],[-9,5],[-2,3],[-10,9],[-6,4],[-4,4],[-3,2],[-15,5],[-3,3],[-4,0],[-14,0],[-8,6],[-3,2],[-7,4],[-24,15],[-5,2],[-11,3],[-8,1],[-2,-1],[-12,-8],[-13,1],[-3,7],[-4,3],[-10,3],[-2,3],[-3,1],[-13,4],[-36,-1],[-5,2],[-24,2],[-4,-5],[-1,-6],[-5,-1],[-4,3],[-8,0],[-11,-3],[-5,-7],[-5,0],[-2,1],[-7,0],[-10,-7],[0,-12],[-11,-10],[-16,-11],[-21,-20],[-2,-7],[2,-5],[2,-8],[-2,-3],[-2,-11],[-3,-8],[-5,-6],[-13,-12],[-5,-2],[-7,6],[-3,-2],[0,-3],[-13,-8],[-3,1],[-3,-2],[-19,-15],[-11,-12],[-8,-9],[-3,-8],[0,-6],[6,-2],[2,-8],[2,-12],[-4,-15],[-7,-22],[-4,-3],[-9,-20],[0,-4],[6,-20],[1,-7],[0,-9],[-2,-16],[-2,-5],[-2,-1],[-1,-1],[0,-3],[-4,-13],[-1,-9],[-1,-1],[3,-12],[0,-11],[0,-7],[6,-7],[5,-8],[12,-9],[1,-6],[1,-10],[-3,-1],[-4,0],[-3,-5],[0,-4],[-1,-6],[-6,-10],[-2,-6],[-4,0],[-4,-2],[-2,-4],[-5,3]],[[3420,1159],[-29,121]],[[3495,1379],[8,6],[9,5],[7,3],[4,2],[6,3],[6,6],[4,6],[5,10],[2,7],[2,8],[1,7],[1,7],[-1,6],[-1,5],[0,5],[1,6],[5,6],[4,3],[23,13],[5,3],[7,2],[4,3],[9,7],[5,3],[15,4],[5,3],[15,12],[5,2],[4,1],[3,-1],[5,0],[4,-1],[24,-1],[7,0],[6,1],[9,1],[2,0],[3,-1],[5,-1],[3,-1],[3,0]],[[3729,1529],[5,0],[4,-1],[9,-3],[12,-4],[3,-1],[6,-2],[6,-1],[3,1],[11,5],[5,1],[1,0],[4,-1],[1,0],[29,-12],[6,-3],[8,-7],[12,-7],[16,-7],[6,-2],[10,-2],[3,-1],[5,-2],[6,-2],[10,-6],[6,-5],[26,-21],[6,-6]],[[2801,2509],[-22,-21]],[[2779,2488],[-19,-15]],[[2760,2473],[-71,115]],[[2689,2588],[20,16],[7,8],[15,39]],[[2731,2651],[13,36],[4,7],[6,7],[5,5],[16,13]],[[2775,2719],[12,-20],[13,-24],[8,-13],[11,-6]],[[3648,3548],[-13,2],[-9,1],[-11,0],[-18,-2],[-16,1],[-16,2],[-4,11],[-4,3],[-14,4],[-2,2],[-5,19],[-14,-10],[-2,0],[-43,17],[2,8],[-2,3],[-35,35],[-17,-22],[6,-6],[17,-7],[-6,-21]],[[3442,3588],[-3,4],[-14,12],[-100,116],[-46,48]],[[3279,3768],[8,4],[15,4],[9,4],[10,1],[0,2],[1,1],[11,0],[6,0],[11,-1],[6,-2],[17,-7],[16,-8],[4,-4],[5,-7],[3,-8],[4,-7],[5,-3],[8,-2],[21,0],[2,2],[3,3],[1,1],[27,1],[33,-1],[8,-2],[8,-5],[3,-3],[1,-14],[4,-9],[4,-12],[0,-33],[3,-21],[3,-12],[3,-30],[2,-7],[5,-5],[7,-4],[5,-1],[6,-3],[2,-2],[11,-18],[3,-2],[3,-4],[3,0],[2,1],[3,1],[24,-2],[10,-1],[23,-2],[29,-6],[12,-1],[7,-2],[15,-2],[6,1],[8,4],[7,2],[7,1]],[[5918,1454],[-47,1]],[[5961,1453],[-43,1]],[[5918,1320],[0,8],[0,6],[0,120]],[[5985,1452],[0,-32]],[[5985,1420],[1,-99]],[[5986,1321],[-23,0],[-22,0]],[[5985,1420],[20,0],[20,0],[20,0]],[[6045,1420],[1,-99]],[[6046,1321],[-20,0]],[[6026,1321],[-21,0],[-19,0]],[[6045,1420],[20,0],[20,0],[20,1]],[[6105,1421],[0,-70],[0,-30]],[[6105,1321],[-19,0],[-21,0],[-19,0]],[[6105,1321],[1,-64]],[[6106,1257],[-14,4],[-6,0],[-20,-1],[-20,-1],[-20,-2],[0,64]],[[6045,1420],[-1,67],[21,0],[20,-2],[9,-2],[9,-2],[3,-1]],[[6106,1480],[-1,-59]],[[6109,1506],[-1,-16]],[[6108,1490],[-1,-4],[-1,-6]],[[3833,2087],[-15,-12],[-3,-3],[-13,-10],[-3,-1],[-7,-4],[-15,-3],[-9,-4],[-6,-4],[-59,-48]],[[3703,1998],[-11,19],[-32,53],[-3,1],[-8,-6],[-6,-3],[-16,-4],[-5,11],[-12,19],[-11,17],[-21,35],[-15,-13]],[[3563,2127],[-11,18],[-11,20],[-30,-24],[-11,18],[-5,9],[-33,-26]],[[3462,2142],[-31,83],[-17,-14],[-8,-8],[-6,-13],[-15,-42],[-5,-9],[-6,-7],[-15,-13],[-32,-27],[-7,-5]],[[3320,2087],[-26,-23],[-45,-36]],[[3249,2028],[-31,-27],[-23,-21],[-2,-2],[-1,-3],[-12,-9],[-16,-14],[-17,-14],[-15,-12],[-25,-21],[-4,-2],[-12,-5],[-2,0],[-5,-2]],[[3084,1896],[-6,22],[-7,26],[-5,15],[-2,8],[-3,6],[-7,14],[-11,18],[-7,12],[-17,27],[0,1],[-3,5]],[[2940,2167],[-2,3],[-39,64]],[[2889,2260],[325,267]],[[3214,2527],[9,-22],[13,-27],[24,-39],[2,-3],[3,-5],[215,154],[36,31],[51,35],[37,22],[4,6]],[[3608,2679],[1,1],[11,-17],[4,-7],[8,-14]],[[3632,2642],[14,-25],[14,-23],[4,-6],[3,-5],[2,-5],[1,-1],[15,-25],[15,-25],[10,-17],[8,-12],[12,-22],[5,-10],[2,-4],[15,-26],[7,-12],[8,-14],[9,-14],[14,-24],[13,-20],[35,-61],[54,-93],[6,-9],[5,-8],[16,-24],[-36,-29],[-50,-41]],[[3214,2527],[-2,3],[-6,10]],[[3206,2540],[-13,18],[-12,19],[-3,5],[-9,16],[-17,29]],[[3152,2627],[-15,28]],[[3137,2655],[18,14],[4,3],[18,14],[5,3],[17,15],[4,3],[5,2],[1,1],[5,0],[16,0],[10,0],[12,0],[1,-24],[-1,-14],[31,-4],[0,-7],[1,0],[4,0],[14,-2],[5,0],[4,0],[4,1],[11,3],[11,4],[9,4],[4,3],[54,42]],[[3404,2716],[49,38],[48,37],[26,26],[3,3]],[[3530,2820],[75,-130],[2,-3]],[[3607,2687],[-3,-2],[1,-2],[3,-4]],[[3530,2820],[14,15],[-2,3],[9,10],[-14,23],[15,12]],[[3552,2883],[5,-3],[12,-21],[12,-19],[0,-6]],[[3581,2834],[10,2],[34,26],[43,-73],[-29,-23],[-3,-3],[-3,-8],[-1,-5],[9,-4],[2,-2],[10,-17],[2,-3],[-18,-14],[-8,-6],[-22,-17]],[[3054,2513],[4,4],[5,7],[2,4],[-12,17],[-6,6]],[[3047,2551],[55,47],[11,7],[39,22]],[[3206,2540],[-55,-46],[-5,-4],[-6,-2],[-6,-2],[-10,0],[0,-9],[-1,-5],[-3,-5],[-23,-19],[-3,0],[-11,18],[-29,47]],[[3047,2551],[-3,2],[-27,45]],[[3017,2598],[55,47],[-11,19],[19,16],[18,15],[2,7]],[[3100,2702],[12,-5],[3,-3],[11,-21],[11,-18]],[[3017,2598],[-12,19],[-14,-12],[-13,-11],[-3,1],[-20,20]],[[2955,2615],[-16,17]],[[2939,2632],[41,53],[7,11],[8,25]],[[2995,2721],[7,23]],[[3002,2744],[98,-42]],[[3047,2551],[-113,-95]],[[2934,2456],[-11,23],[-11,19],[-9,17]],[[2903,2515],[11,0],[6,-10],[15,13],[23,19],[-11,18],[16,13],[-7,10],[-15,16],[0,3],[14,18]],[[2913,2339],[14,12],[4,4],[3,6],[2,5],[0,12],[1,22],[1,24],[1,24],[-5,8]],[[3054,2513],[-16,-14],[-15,-13],[-16,-13],[38,-62],[1,-3],[-1,-3],[-13,-11],[-49,-40],[-10,2],[-2,-12],[-1,-2],[-13,-11],[-9,-8],[-14,-12],[-3,0],[-18,28]],[[2889,2260],[-10,16],[-13,21]],[[2866,2297],[10,8],[7,9],[15,13],[15,12]],[[2598,2003],[-63,103],[-3,4]],[[2532,2110],[11,11],[17,12],[12,7],[21,19],[46,39],[54,48],[23,20],[69,59],[5,4],[19,17],[15,12],[4,3]],[[2828,2361],[37,-61],[1,-3]],[[2730,2218],[-21,11],[-4,-10],[-2,-3],[-4,-3],[-22,-20],[0,-2],[12,-19],[0,-3],[-1,-2],[-14,-12],[-24,-21],[-27,1],[-21,1],[-1,-19],[0,-32],[5,5],[46,-2],[7,2],[9,4],[7,5],[38,33],[24,20],[5,6],[7,9],[5,13],[8,22]],[[2762,2202],[9,-3],[8,0],[9,1],[8,4],[8,6],[53,46],[-12,19],[-25,38],[-2,1],[-1,0],[-74,-63],[-1,-3],[-4,-9],[-2,-4],[-6,-17]],[[2751,2876],[-47,-38]],[[2704,2838],[-12,16],[-34,-28],[-15,-12],[-22,36],[-13,21],[-5,8],[-2,4]],[[2601,2883],[70,57]],[[2671,2940],[29,24]],[[2931,1675],[-1,-5],[0,-5],[2,-4],[3,-2],[16,-9],[3,-3],[9,-16]],[[2963,1631],[-3,-4],[-4,-5],[-3,-7],[-3,-8],[-7,1],[-6,-2],[-5,-2],[-4,-3],[-39,-32],[-4,-4]],[[2885,1565],[-4,6],[-8,15]],[[2873,1586],[44,37],[-94,31]],[[2823,1654],[49,41],[5,3],[4,1],[4,-1],[4,-3],[13,-11],[4,-2],[16,-5],[9,-2]],[[2988,1522],[-13,22],[-14,-13],[-3,0],[-26,43],[-17,-14],[26,-43],[0,-2],[-1,-2],[-14,-10],[-2,0],[-1,1],[-25,41],[-13,20]],[[2963,1631],[15,12],[51,42]],[[3029,1685],[14,12]],[[3043,1697],[11,-20],[16,-23],[10,-15],[16,-23],[-1,-2]],[[3095,1614],[-17,-15],[-18,-15],[-18,-15],[-18,-15],[-36,-32]],[[2845,1617],[-22,37]],[[2873,1586],[-9,6],[-8,5],[-5,8],[-6,12]],[[2716,1813],[2,-2]],[[2718,1811],[-13,-4],[-22,-7],[-25,-9],[-2,-1],[-13,-4],[-14,-5],[-58,-21],[-45,-16],[-29,-10]],[[2497,1734],[-1,7],[-2,6],[-3,9],[-3,9],[-3,8],[-9,15],[-4,7],[-4,6],[-2,5],[-7,20]],[[2459,1826],[42,21],[32,16],[-1,5],[-11,17],[-5,9],[-2,3],[-25,41],[-3,9],[-1,8],[-1,9],[0,5],[0,5],[2,11],[3,17],[4,16],[3,12],[0,4],[8,24]],[[2504,2058],[1,-4],[2,-2],[6,-10],[5,-9],[0,-7],[7,5],[10,8],[17,14],[0,1],[0,1],[0,1],[-11,18],[-17,27],[4,4],[4,5]],[[2459,1826],[-2,4],[-7,20],[0,1],[0,2],[0,2],[1,3],[2,10],[-1,5],[-1,4],[-3,5],[-11,22],[-10,22],[-5,6],[0,3],[-3,6],[-1,1],[-1,1],[-1,-1],[-3,-2],[-5,-5],[-3,2],[-2,1],[-2,1],[-2,2],[-2,3],[-1,1],[-6,9]],[[2390,1954],[17,12],[-2,4],[-2,4],[-3,2],[-5,4],[-4,3],[-1,0],[0,1],[0,1],[0,1],[1,1],[13,12],[1,0],[1,0],[5,-3],[1,0],[2,0],[31,27],[0,1],[2,0],[1,0],[10,-4],[8,29],[3,3],[3,4],[14,12],[18,-10]],[[2497,1734],[-12,-4],[-19,-7],[-33,-11],[-11,-4],[-11,-5],[-8,-3],[-6,-3],[-5,-3],[-4,-2],[-9,-5],[-5,-3],[-5,-3],[-6,-4],[-6,-4],[-5,-4]],[[2352,1669],[-3,6],[-3,4],[-7,11],[-10,18],[-23,41],[-25,39]],[[2281,1788],[-13,24],[-19,33],[-2,3]],[[2247,1848],[13,9],[4,3],[1,1],[4,2],[2,1],[2,1],[4,0],[5,0],[2,1],[1,0],[1,1],[2,1],[-7,13],[19,16],[16,14],[1,0],[1,0],[1,0],[10,-5],[1,0],[1,0],[1,0],[10,9],[48,39]],[[2247,1848],[-19,37],[-1,2],[-4,8],[-8,15],[-7,12]],[[2358,2080],[3,-5],[9,-14]],[[2370,2061],[-13,-13],[-20,-19],[0,-1],[0,-1],[0,-1],[11,-16],[20,-33],[2,-4],[2,-2],[4,-6],[3,-3],[2,-2],[5,-2],[2,-2],[2,-2]],[[2281,1788],[-3,-2],[-17,-14]],[[2261,1772],[-11,18],[-5,9],[-5,9],[-1,0],[-11,-9],[-17,-14],[-17,-13],[-12,20],[-17,-14],[-40,-31],[-17,-14]],[[2108,1733],[-7,12],[-2,4],[-1,2],[-2,6],[-3,13],[-1,7],[-2,9],[-2,2],[-9,17],[-5,9]],[[2074,1814],[131,103],[3,5]],[[2188,1714],[-30,-24],[-17,-13]],[[2141,1677],[-21,36]],[[2120,1713],[-12,20]],[[2261,1772],[-12,-10],[-61,-48]],[[2143,1500],[-3,5],[-1,2],[-3,4],[-24,42],[-5,9]],[[2107,1562],[71,56],[3,2],[1,1],[1,2],[0,1],[1,2],[4,11],[2,6],[5,16],[0,1],[1,2],[1,1],[14,11],[-11,20],[-12,20]],[[2352,1669],[-2,-1],[-1,-1],[-7,-5],[-19,-16],[-44,-36],[-11,-9]],[[2268,1601],[-38,-31],[-35,-28],[-26,-21],[-8,-7],[-18,-14]],[[2107,1562],[-12,19],[-12,20],[-11,21]],[[2072,1622],[52,41],[17,14]],[[7765,4113],[9,-6],[28,-21],[3,-3]],[[7805,4083],[-7,-13],[-5,-9],[-8,-15]],[[7864,4039],[-37,27]],[[7827,4066],[6,11],[5,7],[3,8],[4,7],[5,9]],[[7850,4108],[5,10],[8,13],[0,2]],[[7863,4133],[8,-6],[20,-15],[9,-6]],[[7900,4106],[-5,-9],[-2,-3],[-1,-2],[-6,-11],[-4,-8]],[[7882,4073],[-8,-16],[-4,-7],[-6,-11]],[[7910,4004],[-39,29],[-7,6]],[[7882,4073],[16,-12],[2,-2],[29,-22]],[[7929,4037],[-4,-8],[-4,-7],[-5,-7],[-6,-11]],[[7900,4106],[9,15]],[[7909,4121],[8,-6],[30,-23],[9,-6]],[[7956,4086],[0,-3],[-5,-8],[-8,-15]],[[7943,4060],[-7,-12],[-6,-10],[-1,-1]],[[7958,3968],[-48,36]],[[7943,4060],[47,-36]],[[7990,4024],[-7,-12],[-6,-12],[-4,-7],[-5,-7],[-4,-8],[-6,-10]],[[7956,4086],[5,10],[5,9]],[[7966,4105],[10,-7],[30,-22],[9,-7]],[[8015,4069],[-6,-10],[-5,-10],[-6,-9],[-8,-16]],[[7966,4105],[7,11],[12,22]],[[8035,4095],[-7,-3],[-7,-12],[-6,-11]],[[8061,4034],[-17,12],[-20,16],[-9,7]],[[8075,4061],[-2,-4],[-6,-12],[-6,-11]],[[8036,3990],[-7,5],[-30,23],[-9,6]],[[8061,4034],[-6,-10],[-5,-10]],[[8050,4014],[-6,-9],[-8,-15]],[[8486,4089],[18,31],[8,14],[13,24],[1,2],[4,7]],[[8530,4167],[19,-14],[10,-8],[21,37]],[[8580,4182],[14,26],[10,-8],[6,-5],[7,-5],[6,14],[3,-2],[3,-1],[6,-3],[-9,-46],[-3,-10],[-3,-13],[-3,-17],[0,-2],[-1,-9],[-3,-52],[-2,-19],[-14,-25]],[[8530,4167],[21,37],[10,18],[10,19]],[[8571,4241],[8,-5],[5,-4],[-6,-13],[-4,-7],[-9,-18],[15,-12]],[[8530,4167],[-14,11],[-14,11],[6,10],[9,17],[5,9]],[[8522,4225],[10,18],[10,18],[7,-5],[1,-1],[13,-9],[8,-5]],[[8522,4225],[-6,5],[-9,6],[-17,13]],[[8592,4282],[-11,-22],[-10,-19]],[[8419,4253],[-10,8],[-9,8],[-20,14],[-31,24]],[[8349,4307],[12,22]],[[8361,4329],[6,10],[0,1],[5,9],[8,14],[5,9]],[[8385,4372],[2,-1],[5,-4],[2,-1]],[[8394,4366],[57,-40],[8,-6]],[[8374,4175],[-20,15],[-18,16],[-17,13]],[[8319,4219],[-14,10]],[[8305,4229],[6,11],[6,10],[13,25],[-27,21]],[[8303,4296],[8,14],[5,9],[5,9]],[[8321,4328],[10,-7],[18,-14]],[[8354,4139],[-38,30],[-18,14]],[[8298,4183],[4,8],[6,9],[4,8],[7,11]],[[8374,4175],[-10,-18],[-10,-18]],[[8298,4183],[-35,27],[-11,8]],[[8252,4218],[4,21]],[[8256,4239],[5,25]],[[8261,4264],[10,-7],[1,-1],[33,-27]],[[8333,4102],[-50,39],[-29,22],[-11,8]],[[8243,4171],[6,29]],[[8249,4200],[3,18]],[[8354,4139],[-8,-14],[-7,-13],[-6,-10]],[[8313,4051],[-9,-24]],[[8304,4027],[-67,50],[-10,8]],[[8333,4102],[-10,-28],[-10,-23]],[[8359,4015],[-46,36]],[[8333,4102],[11,-8],[15,-11],[12,-10],[2,-3],[12,-9]],[[8385,4061],[-14,-24],[-12,-22]],[[8418,4037],[-17,13],[-6,3],[-8,6],[-2,2]],[[8408,4151],[18,-14],[30,-23],[3,-4]],[[8379,3968],[-32,26],[12,21]],[[8187,4247],[7,-6],[43,-32],[12,-9]],[[8187,4247],[9,16]],[[8196,4263],[7,-6],[36,-28],[6,-6],[7,-5]],[[8196,4263],[9,15]],[[8205,4278],[7,-6],[16,-12],[17,-14],[9,-6],[2,-1]],[[8163,4311],[33,-26],[9,-7]],[[2691,889],[2,4],[0,5],[-3,4],[-6,5],[-13,49],[16,6],[7,0],[7,-2],[20,7]],[[2721,967],[23,7]],[[2744,974],[16,5],[6,1],[5,0],[6,0],[5,-1],[11,-3],[22,-7],[26,-6],[21,-91]],[[2540,919],[-7,23],[-3,10],[-1,6],[-2,8],[-3,11],[-2,8],[-1,13],[-2,8],[-2,8],[-3,11]],[[2514,1025],[11,5],[38,14],[17,7],[6,3],[2,1]],[[2588,1055],[7,3],[18,8],[8,4],[9,7],[4,2],[5,3],[24,10],[1,0],[1,0],[1,-1],[3,-12]],[[2669,1079],[21,-85],[1,-1],[0,-1],[1,-1],[2,0],[19,7],[8,-31]],[[2509,901],[4,-14],[1,-4],[-1,-1],[-1,-2],[-24,-22],[-14,-13],[-2,-1],[-2,-1],[-1,0],[-1,0],[-1,1],[-6,9],[-10,13],[-1,2],[12,8],[13,7],[-7,22],[-7,23],[-10,-4],[-9,-5],[-19,-13],[-5,-3],[-11,-4],[-5,-1],[-4,6],[-2,4],[-2,3],[-9,10],[-4,4],[-4,3],[-9,7]],[[2368,935],[23,33],[3,4],[4,2],[32,14],[34,15],[30,14],[20,8]],[[6592,4365],[-3,-7],[-4,-10],[-2,-5],[-6,-12],[-5,-14],[-8,-19],[-3,-9],[-1,-3],[-1,-2],[-1,-2],[-1,-4],[-3,-7],[-2,-5],[-3,-7],[-3,-7],[-1,-4],[-2,-4]],[[6543,4244],[-1,-2],[-2,-4],[-2,-4],[-6,-11],[-2,-4],[-5,-9],[-1,-1],[-1,-2],[-1,-2],[-1,-3],[-1,-2],[-1,-3],[-1,-2],[-1,-2],[-1,-2],[0,-2],[-1,-3],[-1,-2],[-2,-9],[-2,-8],[0,-1],[-2,-7],[-3,-11]],[[6505,4148],[-2,-2],[-3,-2],[-2,-1],[-2,-1],[-2,-1],[-2,0],[-2,-1],[-3,0],[-1,0],[-1,1],[-1,2],[-1,2],[-1,1],[-1,2],[-1,1],[-1,2],[-1,1],[-2,1],[-1,2],[-2,1],[-1,1],[-1,1],[-1,1],[-2,1],[-2,1],[-3,1],[-3,2],[-2,0],[-4,1]],[[6454,4165],[-4,1],[-4,-13],[-6,2],[-10,5],[-12,6],[-16,8],[-18,9],[-20,9],[-11,5],[-33,16],[-21,10],[-6,3],[-8,4],[-8,3],[-14,7],[-11,6],[-6,3],[-7,3],[-7,3],[-13,7]],[[6219,4262],[-42,20]],[[6177,4282],[2,7],[1,4]],[[6204,4365],[6,30],[1,14],[2,14],[0,5]],[[6609,4409],[-2,-6],[-4,-11],[-5,-12],[-4,-9],[-2,-6]],[[6168,4189],[11,19],[8,14],[2,7],[0,2],[-1,1],[-13,6],[-13,6]],[[6162,4244],[13,34],[2,4]],[[6219,4262],[-26,-76],[-3,-7]],[[6146,4200],[3,8],[13,36]],[[3292,3603],[-60,72],[-12,11],[-19,18],[-12,20]],[[3189,3724],[0,4],[1,12],[2,4],[8,8],[9,7],[11,3],[8,1],[5,-1],[4,-2],[3,-1],[10,0],[8,4],[6,2],[1,-1],[4,0],[6,2],[4,2]],[[3224,3604],[-65,68]],[[3159,3672],[4,4],[7,17],[3,9],[5,10],[7,5],[4,4],[0,3]],[[3221,3312],[0,5],[11,9],[-3,4],[-10,-9],[-3,5],[-4,1]],[[3212,3327],[-2,4]],[[3210,3331],[9,6],[-8,14],[6,9],[58,44],[-110,173]],[[3165,3577],[-32,48]],[[3133,3625],[-1,2],[-11,13],[-23,35]],[[3098,3675],[2,-2],[9,-5],[9,-5],[21,0],[12,3],[7,5],[1,1]],[[3210,3331],[-8,14],[-34,58]],[[3168,3403],[4,3],[9,7],[4,2],[5,1],[14,3],[4,2],[6,3],[11,8],[14,13],[-30,45],[-14,21],[-3,2],[-2,1],[-14,1],[-22,1]],[[3154,3516],[-1,15],[-4,17],[-8,13]],[[3141,3561],[9,5],[15,11]],[[3168,3403],[-22,37]],[[3146,3440],[-4,8],[-13,22]],[[3129,3470],[15,12],[4,5],[3,5],[2,5],[1,6],[0,13]],[[2978,3381],[-26,55],[-8,20]],[[2944,3456],[40,13],[17,6],[13,5],[6,3],[7,4],[16,9],[14,8],[21,15],[13,8],[3,3]],[[3094,3530],[32,21]],[[3126,3551],[15,10]],[[3129,3470],[-3,-2],[-13,-8],[-21,-17],[-7,-6],[-8,-5],[-5,-3],[-1,-1],[-6,-4],[-7,-4],[-20,-10],[-25,-12],[-22,49],[-3,2],[-5,-1],[-6,-4],[-3,-4],[0,-5],[22,-45],[-18,-9]],[[3049,3625],[7,5],[50,-17],[-1,-16],[1,-4],[10,-23],[10,-19]],[[3094,3530],[-19,40],[-26,55]],[[3049,3625],[-8,15]],[[3041,3640],[-8,18]],[[3033,3658],[6,-2],[54,-16],[40,-15]],[[3033,3658],[-4,1],[-9,3],[-12,3],[-60,12],[-156,27]],[[2792,3704],[-113,19],[-42,8]],[[2637,3731],[22,72]],[[2659,3803],[17,3],[8,4],[8,1],[8,0],[8,-2],[25,-2],[4,-2],[27,-1],[18,-5],[3,-2],[6,0],[12,-2],[6,-3],[17,-2],[8,-1],[19,0],[12,0],[10,-2],[2,-3],[2,0],[4,0],[2,3],[5,3],[4,4],[1,5],[3,2],[16,6],[9,1],[1,-1],[6,0],[11,-3],[17,-7],[15,-11],[4,-3],[11,-15],[6,-2],[5,0],[5,-4],[23,-3],[4,-13],[4,-5],[4,-3],[4,-6],[6,-7],[8,-5],[4,-5],[8,-5],[10,-2],[12,-5],[3,-2],[0,-3],[-4,-5],[-1,-4],[3,-6],[5,-7],[1,-1]],[[2591,3556],[0,-13],[2,-12],[2,-9]],[[2595,3522],[-12,-5],[-5,-3],[-3,9],[-2,9],[-1,5],[1,20],[0,20],[1,16],[-1,7],[-3,7],[-8,18],[-13,-8],[-11,-5],[-19,-7],[-5,-3],[-24,-25],[-1,-4],[25,-55],[-10,-6]],[[2504,3512],[-8,-2],[-11,-3],[-7,-4],[-13,-9],[-22,-13]],[[2443,3481],[-13,25],[-1,2]],[[2429,3508],[4,2],[4,4],[3,10],[7,12],[5,10],[5,8],[6,9],[6,7],[7,8],[3,6],[3,4],[4,0],[4,6],[10,17],[2,3],[1,1],[22,12],[10,8],[5,6],[5,4],[4,4],[0,3],[2,6],[-2,22],[1,6],[1,5],[1,4],[1,6],[12,23],[4,11],[14,32],[11,15],[8,8],[14,2],[11,3],[13,4],[19,4]],[[2637,3731],[-2,-28],[-2,-17]],[[2633,3686],[-4,0],[-4,1],[-4,-1],[-3,-2],[-2,-3],[-2,-3],[-7,-34],[-7,-29],[-5,-29],[-4,-30]],[[2595,3522],[5,-14],[8,-17]],[[2608,3491],[-18,-9],[-18,-4]],[[2572,3478],[-4,-1],[-3,-1],[-4,-3],[-6,-6],[-21,-15],[-3,-4],[-4,-6]],[[2527,3442],[-15,12],[10,17],[-9,20],[-9,21]],[[2577,3262],[-4,-7],[-3,-8]],[[2570,3247],[-4,2],[-3,3],[-4,8],[-2,3],[-2,1],[-2,0],[-2,-1],[-3,-2]],[[2548,3261],[-14,29],[-18,38],[-10,23],[-3,-2],[-4,-2],[-3,0],[-4,2],[-35,25],[-5,11],[-33,69]],[[2419,3454],[2,6],[2,5],[5,5],[15,11]],[[2527,3442],[9,-8],[-12,-21],[10,-22],[-17,-11],[19,-40],[25,-54],[6,-11],[10,-13]],[[2582,3267],[-5,-5]],[[2572,3478],[8,-19],[-16,-11],[25,-54],[1,-4],[1,-3],[-1,-4],[-2,-5],[-5,-8],[-5,-4],[-6,-5],[-3,-2],[12,-27],[20,-46]],[[2601,3286],[-19,-19]],[[2757,3266],[-8,-5],[-1,-3],[-13,-10],[-6,-5],[-10,-8],[-5,-4],[-26,-25],[-10,13],[-21,-20],[-13,-14],[-16,-17]],[[2628,3168],[-31,68],[-9,20],[-6,11]],[[2601,3286],[11,10],[10,5],[6,3],[20,8],[18,8]],[[2666,3320],[27,11]],[[2693,3331],[21,-49],[9,-20],[28,16],[6,-12]],[[2634,3148],[-38,-46]],[[2596,3102],[-12,27],[-21,43],[-12,7]],[[2551,3179],[3,11],[8,28],[6,24],[2,5]],[[2628,3168],[11,-15],[-5,-5]],[[2678,3129],[-20,-9],[-2,0],[-5,5],[-6,10],[-11,13]],[[2757,3266],[2,-3],[7,-17]],[[2766,3246],[5,-7],[21,-16],[8,-8]],[[2800,3215],[-2,0],[-14,-18],[-19,-21],[-7,-7],[-7,-6],[-16,-10],[-23,-10],[-25,-10],[-9,-4]],[[2678,3129],[7,-21],[5,2],[10,4],[2,-2],[8,-26],[-1,-2],[-40,-17],[7,-23],[28,-45],[3,0],[29,24],[12,-19]],[[2671,2940],[-10,22],[-9,20],[-10,21],[-6,12],[-10,22],[-4,9],[-5,12],[-9,20],[-12,24]],[[2800,3215],[9,-13]],[[8632,4758],[-10,-26]],[[8622,4732],[-11,6],[-47,23],[-11,6]],[[8553,4767],[10,26]],[[8563,4793],[11,-5],[47,-24],[11,-6]],[[8563,4793],[5,13],[4,13]],[[8572,4819],[11,-5],[48,-24],[11,-5]],[[8642,4785],[-10,-27]],[[8572,4819],[9,23]],[[8581,4842],[11,-6],[39,-19],[9,-5],[10,-5]],[[8650,4807],[-8,-22]],[[2920,2824],[-68,-57]],[[2852,2767],[-16,-14],[-7,-3],[-6,-3],[-16,-5],[-8,-3],[-7,-6],[-17,-14]],[[2731,2651],[-19,10],[-11,6],[-12,9],[-13,12],[-13,15],[-10,13],[-7,12],[-8,13],[-11,18],[6,6],[3,4],[6,13],[3,5],[4,6],[5,4],[29,24],[21,17]],[[2847,2897],[-8,-22],[-8,-22],[-4,-9],[-1,-17],[0,-3],[6,-3],[6,-1],[7,-4],[6,-5],[6,-10],[17,15],[17,14],[16,13],[13,-19]],[[2689,2588],[-18,29],[-45,75],[-3,5],[-11,17],[-14,23],[-44,76],[-9,19],[-1,4]],[[2544,2836],[57,47]],[[2582,2544],[16,13],[-1,3],[0,3],[5,4],[6,5],[-10,20],[-8,19],[-14,19],[-6,25],[-6,23],[-10,22]],[[2554,2700],[-17,42],[-14,36],[0,4],[1,2],[-10,19],[27,30],[3,3]],[[2689,2588],[-3,-2],[-20,-17],[-14,-5],[-16,-7],[-12,-10],[-20,-17],[-10,-5],[-12,19]],[[2506,2663],[-5,10],[-12,30],[-18,-10],[-6,-4],[-9,-5],[-4,-1],[-8,-2],[0,6],[-1,3],[-2,9],[-5,14],[-11,-8],[-3,-1],[-2,0],[-2,2],[-7,11],[-5,6],[-3,1],[-2,-1],[-8,-12]],[[2393,2711],[-16,16],[-32,-45]],[[2345,2682],[-12,31],[10,11],[7,10],[5,7],[5,7],[7,11],[5,9],[2,4]],[[2374,2772],[2,3],[2,6],[4,10],[3,6],[5,16],[9,28],[6,20],[6,17],[11,19],[12,19],[30,33],[11,12],[12,14],[2,2]],[[2489,2977],[14,-34],[24,-63],[17,-44]],[[2554,2700],[-17,-13],[-25,-19],[-6,-5]],[[2506,2663],[22,-55],[4,-12],[3,-8],[1,-11],[-1,-9],[-4,-10],[-8,2],[-3,-1],[-17,-8],[-6,-3],[-6,0],[-7,2]],[[2484,2550],[-5,3],[-4,0],[-4,-1],[-3,-1],[-9,23],[-11,29]],[[2448,2603],[-2,6],[-1,16],[0,22],[-14,0],[-2,2],[-6,13],[-6,10],[-6,8],[-9,9],[-14,15],[5,7]],[[2448,2603],[-73,-26]],[[2375,2577],[-5,12],[-14,-8],[-6,-5]],[[2350,2576],[-14,-13],[-8,22],[-12,29]],[[2316,2614],[1,3],[10,6],[4,4],[9,12],[13,17],[7,11],[-15,15]],[[2484,2550],[-1,-9],[-2,-5],[-7,-3],[16,-41],[5,-3],[6,0],[8,5],[7,7],[17,10],[3,-7]],[[2536,2504],[-147,-124]],[[2389,2380],[-6,11]],[[2383,2391],[38,27],[19,18],[33,29],[2,4],[0,5],[-6,15],[-17,-8],[-7,19],[-17,-8],[-27,71],[-19,-6],[-7,20]],[[2582,2544],[-46,-40]],[[2383,2391],[-38,92],[-9,23]],[[2336,2506],[4,1],[6,2],[9,5],[14,15],[0,2],[0,2],[-4,10],[-3,9],[-4,9],[-5,11],[-3,4]],[[2389,2380],[-9,-10],[54,-98]],[[2434,2272],[-6,-12]],[[2428,2260],[-6,11],[-36,62]],[[2386,2333],[-6,8],[-3,4],[-14,7],[-17,8],[-7,4],[-24,10]],[[2315,2374],[9,24],[7,22],[13,-6],[3,0],[3,1],[-12,30],[-3,8],[-1,3],[3,8],[-1,3],[-20,9],[-1,1],[-2,3],[-6,18],[-9,23],[8,4],[6,5],[4,4],[8,4]],[[2324,2538],[12,-32]],[[2315,2374],[-16,8]],[[2299,2382],[-23,11]],[[2276,2393],[8,24],[-6,3],[-6,5],[-3,4],[-3,4],[-2,5],[-20,55],[-8,21]],[[2236,2514],[19,10],[42,21],[2,2],[3,3],[5,5],[5,3],[4,2],[8,-22]],[[2236,2514],[-12,34],[-2,6],[16,17],[-9,21]],[[2229,2592],[14,15],[38,44],[2,2],[4,-14],[0,-2],[4,-10],[8,-22],[17,9]],[[2229,2592],[-2,3],[-15,39]],[[2212,2634],[10,14],[4,5],[13,17],[15,18],[7,7],[2,3]],[[2263,2698],[4,6],[39,54],[5,3],[3,1],[13,28],[19,27]],[[2346,2817],[14,-10],[-9,-18],[23,-17]],[[2095,2473],[-3,7],[-2,6],[-11,23],[-5,8],[-12,18]],[[2062,2535],[3,10],[3,7],[2,6],[2,5],[5,4],[5,4],[11,7],[5,2],[17,10],[1,1],[1,2],[1,1],[2,2],[4,11],[1,3],[4,11],[2,9],[3,16],[3,3],[29,27],[11,15],[1,2],[16,25],[6,6],[14,12],[13,11],[2,2]],[[2229,2749],[23,-33],[11,-17],[0,-1]],[[2212,2634],[-93,-136],[-24,-25]],[[8316,4362],[-21,16],[-11,8]],[[8284,4386],[6,26],[5,23]],[[8295,4435],[8,-6],[5,-3],[23,-16],[8,-6]],[[8339,4404],[-6,-10],[-6,-11],[-5,-10],[-6,-11]],[[8361,4329],[-18,13],[-27,20]],[[8339,4404],[35,-24],[11,-8]],[[8321,4328],[-17,13],[-14,11],[-11,8]],[[8279,4360],[5,26]],[[8303,4296],[-31,24]],[[8272,4320],[4,20]],[[8276,4340],[3,20]],[[8261,4264],[5,26],[4,19],[2,11]],[[8261,4264],[-11,9],[-34,25]],[[8216,4298],[7,12],[5,9],[6,-5],[14,25]],[[8248,4339],[9,-7],[7,-6],[8,-6]],[[8163,4311],[11,20]],[[8174,4331],[9,-7],[33,-26]],[[8093,3982],[-43,32]],[[8103,4039],[-2,-2],[-6,-13],[-6,-11],[15,-11],[-6,-10],[-5,-10]],[[8093,3982],[22,-17],[4,-3]],[[8119,3962],[-10,-6],[-6,-12],[-1,-4]],[[8145,4008],[-2,-3],[-7,-12],[-6,-11],[-5,-10],[-6,-10]],[[8176,3947],[-9,8],[-6,-11],[-6,-9],[-36,27]],[[8191,3973],[-3,-4],[-12,-22]],[[8176,3947],[-11,-19],[11,-9],[8,-6],[2,-1],[8,-6],[5,-4]],[[8210,3953],[0,-10],[-3,-10],[-7,-26]],[[8210,3953],[31,-23],[22,-17]],[[8263,3913],[-6,-17],[-4,-9],[-5,-16]],[[8211,3993],[63,-48]],[[8274,3945],[-5,-15],[-3,-8],[-3,-9]],[[8217,4034],[11,-8],[28,-22],[16,-12],[15,-12]],[[8287,3980],[-8,-21],[-5,-14]],[[8304,4027],[-8,-22],[-9,-25]],[[8340,3939],[-17,13],[-9,7],[-9,7],[-8,7],[-10,7]],[[8322,3908],[-48,37]],[[8306,3879],[-43,34]],[[8286,3843],[-38,28]],[[2488,1435],[-4,0],[-63,-53]],[[2421,1382],[-3,12],[2,2],[5,6],[1,3],[2,3],[1,3],[0,2],[0,4],[1,5],[0,7],[-1,3],[-1,7],[-1,7],[-2,5],[-1,4],[-1,4],[-3,5],[-6,10],[-6,11],[-5,6],[-5,6],[-5,4],[-3,2],[-5,1],[-7,0],[-6,-1],[-6,-3],[-6,-3],[-6,-5],[-6,-5],[-6,-8]],[[2342,1479],[-9,9],[-28,47],[-4,5],[-4,9],[-4,10],[-5,9],[-8,13],[-9,15],[-3,5]],[[2352,1669],[3,-4],[12,-20],[3,-5],[19,-33],[22,-36]],[[2411,1571],[33,-54],[2,-2],[20,-35],[8,-14],[7,-15],[7,-16]],[[2323,1305],[-2,8],[-1,5],[-3,20]],[[2317,1338],[17,3],[4,2],[-3,23],[-6,30],[-2,21],[-1,6]],[[2326,1423],[1,4],[0,5],[1,9],[2,11],[3,10],[4,8],[5,9]],[[2421,1382],[-92,-76],[-6,-1]],[[2202,1373],[-30,53],[-3,13],[-1,7],[-5,9],[-10,17],[-11,18],[-3,6]],[[2139,1496],[4,4]],[[2326,1423],[-19,-4],[-38,-7],[-18,-4],[-3,-1],[-17,-13],[-29,-21]],[[2194,1305],[-2,4],[-4,8],[-3,7],[-1,12],[1,11],[3,8],[5,9],[9,9]],[[2317,1338],[-7,-2],[-5,-2],[-7,-5],[-14,-17],[-9,16],[-8,15],[-1,0],[-1,0],[-1,0],[-1,0],[-35,-27],[-2,-2],[-3,-17],[-5,-23],[-6,5],[-1,1],[-3,3],[-9,15],[-5,7]],[[2323,1305],[-90,-81],[-47,74]],[[2186,1298],[8,7]],[[7804,4647],[-29,23],[-9,7],[3,3],[-9,7],[-1,1],[-10,8]],[[7749,4696],[6,11],[6,11],[6,11],[6,12]],[[7773,4741],[3,6],[3,5],[6,12]],[[7785,4764],[6,11],[6,11]],[[7797,4786],[10,-7],[8,-6],[3,-2],[8,-6],[8,-6],[24,-17]],[[7858,4742],[-10,-18],[-11,-18],[-28,-49],[-5,-10]],[[7735,4771],[38,-30]],[[7667,4823],[6,11],[6,11]],[[7679,4845],[68,-52],[38,-29]],[[7679,4845],[6,12],[6,11]],[[7691,4868],[67,-53],[39,-29]],[[7691,4868],[6,11],[6,12]],[[7703,4891],[10,-8],[57,-45]],[[7770,4838],[39,-29]],[[7809,4809],[-6,-12],[-6,-11]],[[7770,4838],[6,11],[6,12],[6,11],[6,11]],[[7794,4883],[29,-22],[1,-1],[9,-7]],[[7833,4853],[-3,-5],[-9,-17]],[[7821,4831],[-3,-5],[-3,-6],[-6,-11]],[[7703,4891],[5,11],[7,12]],[[7715,4914],[5,11],[6,11]],[[7726,4936],[39,-30],[29,-23]],[[7726,4936],[6,11],[6,11],[6,12],[4,7]],[[7748,4977],[28,-15],[47,-23]],[[7823,4939],[-5,-11],[-6,-11],[-6,-11],[-6,-11],[-6,-12]],[[7839,4866],[-6,-13]],[[7856,4899],[-8,-16],[-4,-7],[-5,-10]],[[6142,4224],[1,-1],[2,0],[1,1],[1,1],[9,30],[1,6],[-1,5],[-2,8],[-4,7],[-6,7],[-7,5],[-15,6],[-10,4],[-9,4],[-11,2]],[[6092,4309],[-23,4],[-4,0],[-10,1],[-8,0],[-11,0],[-21,-4],[-18,-4],[-18,-6],[-14,-6],[4,-14],[6,-16]],[[5975,4264],[-18,7],[-15,-12],[-9,-10],[-13,-29],[-6,-19],[13,-12]],[[5788,4199],[24,46],[2,3],[3,7]],[[6092,4309],[-5,-32]],[[7976,3282],[-12,10],[-32,25],[-9,4],[-11,9]],[[7883,3395],[16,26],[11,52],[1,8],[2,7],[5,22],[2,7]],[[7962,3259],[-6,5],[-7,5]],[[7949,3269],[-17,14],[-4,3],[-5,4],[-4,3],[-20,16]],[[7949,3269],[-7,-13],[-4,-7],[-19,7],[-37,29]],[[7815,3256],[-6,-5],[-32,-22],[-12,-12],[-11,-14],[-4,-5],[0,-1],[-14,-20],[-24,-52],[-20,-36],[-2,-4],[-1,-4]],[[7689,3081],[-27,1],[-12,2],[-10,3],[-18,4],[-22,0],[-21,2],[-10,1],[-3,1],[-10,1],[-9,1],[-33,1],[-17,0],[-7,-2],[-6,-2],[-20,-7]],[[7392,3091],[6,1],[21,5],[6,2],[3,2],[4,3],[50,79],[9,13],[21,31],[37,54],[23,23],[23,15],[9,5],[7,19],[2,3],[8,20]],[[7717,3768],[3,4],[6,11]],[[7726,3783],[10,17]],[[7736,3800],[4,0],[14,-10],[26,-20],[1,-2],[32,-25],[14,-10],[24,-18],[23,-17]],[[7874,3698],[7,-6],[54,-41],[1,-6],[0,-7],[1,0],[0,-3],[1,-3],[1,-6],[4,-7],[4,-7]],[[7789,3124],[-7,-8],[-9,-10],[-8,-8],[-10,-7],[-3,-2],[-1,-4],[0,-2],[1,-6],[1,-7],[2,-7],[-3,-8],[-9,-10],[-9,-12],[-6,-16],[0,-10],[1,-8],[6,-16],[12,-13],[3,-1],[3,-2],[4,-5],[6,-4],[3,-1]],[[7609,2999],[11,21],[-11,14],[3,7],[4,5],[3,2],[4,2],[34,8],[8,3],[7,4],[2,1],[5,2],[4,4],[3,4],[3,5]],[[7834,3031],[-27,-27]],[[7807,3004],[-23,-22]],[[7844,2969],[-20,18],[-17,17]],[[7866,3000],[-8,-10],[-7,-11],[-7,-10]],[[7891,2976],[-22,-32]],[[7869,2944],[-9,9],[-7,7],[-9,9]],[[7869,2944],[-1,-2],[-18,-25]],[[7962,4215],[-8,6],[-61,47]],[[7893,4268],[5,9],[5,8],[8,16]],[[7911,4301],[9,-7],[46,-35],[6,-4]],[[7972,4255],[8,-7]],[[7951,4197],[-7,6],[-61,46]],[[7883,4249],[5,10],[5,9]],[[7938,4173],[-9,7],[-51,38],[-9,7]],[[7869,4225],[8,15],[6,9]],[[7938,4173],[-12,-21]],[[7926,4152],[-9,7],[-51,38],[-9,7]],[[7857,4204],[12,21]],[[7909,4121],[-9,7],[-20,15],[-8,5]],[[7872,4148],[6,10],[5,10],[-23,17],[-10,7],[7,12]],[[7926,4152],[-7,-12],[-10,-19]],[[7911,4301],[12,-2],[8,14],[13,23]],[[7944,4336],[51,-40],[-12,-22],[-6,-10],[-5,-9]],[[7944,4336],[6,11],[6,11]],[[7956,4358],[51,-40],[9,-7]],[[8016,4311],[-12,-22]],[[8004,4289],[-13,-22],[-11,-19]],[[7911,4301],[-28,22]],[[7883,4323],[11,19],[12,22]],[[7906,4364],[13,22]],[[7919,4386],[8,-6],[11,-8],[9,-7],[9,-7]],[[7883,4323],[-2,2],[-10,8],[-2,1],[-14,11],[-10,7]],[[7845,4352],[11,19]],[[7856,4371],[13,22]],[[7869,4393],[9,-7],[18,-13],[8,-7],[2,-2]],[[8041,4261],[-26,20],[-2,1],[-9,7]],[[8016,4311],[14,25]],[[8668,4346],[15,-7],[14,-6]],[[8697,4333],[0,-1],[6,-2],[-22,-87],[0,-2],[6,-3],[-14,-42],[5,-2],[-14,-43],[6,-3],[-6,-19],[-8,-23],[6,-3],[-14,-41],[-9,-55],[-5,-24]],[[8790,4543],[-73,-117],[-20,-93]],[[8600,4440],[6,8],[3,7],[0,2],[1,2],[1,2],[1,2],[1,2],[0,1],[1,2],[1,1],[0,2],[1,1],[6,15],[12,31],[9,24]],[[8643,4542],[9,-5],[22,-11],[9,25],[8,21],[4,10],[1,2],[4,11]],[[8700,4595],[6,-3],[9,-4]],[[8715,4588],[9,-5],[10,-5],[4,-2],[13,-6],[20,-13],[4,-2],[11,-9],[4,-3]],[[8846,4618],[-16,-6],[0,-3],[-40,-66]],[[8715,4588],[8,21],[7,20]],[[8730,4629],[8,22],[7,19]],[[8745,4670],[11,-5],[19,-10],[16,-5],[17,-9],[1,-1],[1,0],[1,-1],[2,-1],[3,-2],[4,-3],[21,-13],[5,-2]],[[8944,4779],[-48,-16],[-20,-40],[0,-3],[65,21],[-7,-29],[-60,-20],[5,-12],[4,0],[1,-7],[-36,-12],[3,-15],[43,14],[0,-1],[0,-24],[-48,-17]],[[8745,4670],[10,27],[10,26]],[[8765,4723],[10,-5],[19,-10],[5,11],[4,12],[-19,10],[-11,5]],[[8773,4746],[10,25],[9,24]],[[8792,4795],[5,13],[5,16],[9,25],[1,4]],[[8812,4853],[9,-5],[28,-15],[3,-4],[2,-2],[7,-4],[28,-15],[3,1],[2,-1],[7,-4],[43,-25]],[[8978,4870],[-35,-70],[23,7],[6,-19],[-28,-9]],[[8812,4853],[5,13],[4,13],[-25,13],[-9,4],[9,24]],[[8796,4920],[11,-6],[13,-6],[9,-5],[24,-13],[7,-4],[5,12],[4,11]],[[8869,4909],[11,-6],[2,-1],[39,-21],[13,-7],[40,-4],[4,0]],[[9015,4945],[-37,-75]],[[8869,4909],[-31,17],[-22,11]],[[8816,4937],[5,12],[22,-11],[7,16],[11,28],[9,23]],[[8870,5005],[10,-5],[17,-9],[14,-7],[45,-21],[6,-3],[3,-1],[20,-6],[26,-8],[4,0]],[[9039,4992],[-24,-47]],[[8870,5005],[-11,6],[-12,6]],[[8847,5017],[-10,6]],[[8837,5023],[9,24]],[[8846,5047],[10,-5],[13,-7],[12,-6],[8,22]],[[8889,5051],[10,-5]],[[2120,1713],[-52,-40],[-10,18],[-1,2],[-1,1],[-1,0],[-1,0],[-10,0],[-18,-2],[-1,-1],[-1,-1],[-1,-1],[1,-22],[-42,-33],[-10,-8],[0,-1],[-1,0],[0,-1],[0,-1],[0,-1],[11,-17],[-18,-14],[-11,-10]],[[1953,1581],[-19,-14]],[[1855,1672],[44,3],[18,15],[157,124]],[[1813,1646],[-1,3],[-5,8],[-5,10]],[[1802,1667],[-19,41],[11,7],[8,4],[-10,20],[18,8],[20,5],[8,1],[11,4]],[[1849,1757],[18,-40],[13,-30],[7,1],[6,2],[7,4],[12,8],[6,6]],[[1918,1708],[94,73],[17,14]],[[2029,1795],[19,16],[19,15]],[[2067,1826],[7,-12]],[[1849,1757],[-1,1],[-13,30],[0,3],[43,26],[9,-20],[41,25],[-10,19]],[[1918,1841],[16,10],[3,-1],[33,-73],[-35,-29],[-27,-18],[10,-22]],[[1802,1667],[-19,-11]],[[1702,1781],[17,11],[20,12]],[[1892,1898],[9,-19],[8,-19],[9,-19]],[[1926,1919],[18,11],[18,12]],[[1962,1942],[17,-37],[20,-44],[10,-22],[20,-44]],[[2102,1961],[-11,-7],[-14,-9],[-6,-3],[-4,-1],[-10,-1],[-1,-20],[8,-15],[30,22],[10,-19],[-25,-19],[-15,-12],[0,-3],[10,-17],[11,-19],[-18,-12]],[[1962,1942],[9,6],[3,5],[1,7],[0,11]],[[2022,1996],[7,-3],[31,28],[7,-20],[4,-9],[11,8],[1,-1],[9,-17],[10,-21]],[[7900,4857],[-7,-19]],[[7893,4838],[-9,5],[-33,17],[-2,1],[-10,5]],[[7879,4801],[-8,5],[-37,19],[-2,1],[-11,5]],[[7893,4838],[-7,-18],[-7,-19]],[[7882,4725],[-24,17]],[[7879,4801],[-4,-12],[-3,-8],[26,-13],[-6,-17],[-10,-26]],[[7902,4711],[-20,14]],[[7893,4838],[9,-4],[30,-15],[9,-4]],[[7941,4815],[-7,-19]],[[7934,4796],[-6,-19]],[[7928,4777],[-8,-20]],[[7920,4757],[-7,-19]],[[7913,4738],[-5,-11],[-6,-16]],[[7920,4757],[11,-6],[9,-5],[7,-3],[7,-4],[1,-4],[-3,-9],[-4,-9],[-4,-1],[-6,4],[-7,4],[-7,6],[-7,5],[-4,3]],[[7959,4671],[-3,2],[-2,2],[-4,2],[-40,29],[-8,5]],[[7928,4777],[9,-4],[44,-22],[10,-4]],[[7991,4747],[-15,-40],[-5,-10],[0,-6],[-2,-5],[-10,-15]],[[7934,4796],[10,-4],[44,-23],[9,-4]],[[7997,4765],[-6,-18]],[[7941,4815],[9,-5],[44,-22],[9,-5]],[[8003,4783],[-6,-18]],[[8010,4802],[-7,-19]],[[7948,4833],[9,-5],[44,-22],[9,-4]],[[8017,4820],[-7,-18]],[[7961,4869],[9,-4],[45,-22],[9,-4]],[[8024,4839],[-7,-19]],[[8031,4857],[-7,-18]],[[7975,4906],[9,-4],[44,-22],[9,-5]],[[8037,4875],[-6,-18]],[[8044,4894],[-7,-19]],[[7934,4949],[9,-5],[26,-13],[3,-2],[10,-4]],[[7982,4925],[9,-5],[44,-22],[9,-4]],[[8051,4912],[-7,-18]],[[7982,4925],[6,18],[9,22]],[[7997,4965],[10,-4],[42,-21],[10,-5]],[[8059,4935],[-8,-23]],[[7934,4949],[6,18],[4,11],[4,12],[39,-20],[10,-5]],[[8004,4985],[-7,-20]],[[7924,5025],[10,-5],[61,-30],[9,-5]],[[7942,5060],[8,-4],[3,-1],[26,-13],[13,-6],[16,-8],[9,-5]],[[8017,5023],[-6,-19],[-7,-19]],[[3044,2793],[-31,52],[-16,-13],[-17,-15],[-21,-17],[-12,18],[-11,19]],[[2936,2837],[44,37]],[[2980,2874],[78,63]],[[3058,2937],[11,-18]],[[3069,2919],[10,-18],[22,-37],[-38,-29],[-14,-11],[13,-23],[-18,-8]],[[2980,2874],[-13,21]],[[2949,2928],[63,51],[14,11],[-15,25],[14,16],[37,-60],[3,0],[14,11],[-11,19],[-17,28],[0,3],[1,2],[14,17],[7,7],[13,12],[-8,21]],[[3078,3091],[20,15]],[[3098,3106],[10,-25]],[[3108,3081],[27,-80],[5,-15],[3,-8]],[[3143,2978],[-21,-16],[-10,-6],[-9,-2],[-7,0],[-12,-2],[-6,-2],[-7,-3],[-13,-10]],[[2881,3114],[4,-11],[8,-14],[40,-65],[2,0],[14,11],[18,15],[17,13],[43,35],[3,2],[3,-1],[9,-12],[11,-17],[25,21]],[[2901,3123],[19,6]],[[2920,3129],[12,2],[20,5],[16,5],[15,9],[11,8],[9,8],[8,7],[18,23]],[[3029,3196],[44,-52],[16,-21],[9,-17]],[[2920,3129],[0,25],[-1,40],[5,17],[7,18],[9,12],[12,12],[12,8],[20,11],[-7,24]],[[2977,3296],[19,8],[8,-22],[5,-18],[5,-11],[6,-10],[9,-11],[14,-18]],[[3043,3214],[-14,-18]],[[1823,2038],[-7,16],[-4,7],[-18,15],[-6,7],[-10,22]],[[1757,1958],[-2,3],[-10,21],[-10,21],[-11,24]],[[1724,2027],[-9,19],[-2,6],[-3,1],[-29,-22],[-15,32]],[[1671,1904],[-17,36]],[[1654,1940],[19,12],[10,-21],[2,0],[7,4],[7,6],[0,3],[-3,8],[-6,12],[-3,5],[-10,22],[18,13],[29,23]],[[1654,1940],[-9,21],[-19,41],[-4,16],[-5,18],[-3,4]],[[6347,2548],[-57,41],[-14,-20],[-11,-7],[-18,12],[-15,12],[-15,3]],[[5577,3559],[-3,-3],[-24,-38]],[[5550,3518],[-20,-25],[-22,-30],[-15,-20],[-4,-4]],[[5489,3439],[-18,-24],[-35,-45]],[[5402,3321],[42,-43],[3,-4],[16,-17],[4,-3],[21,-23],[6,-6],[3,-3]],[[5497,3222],[6,-5],[4,-5],[6,-9],[5,-9],[6,-15],[4,-19],[3,-17]],[[4365,2120],[-83,83],[-2,3],[-88,154],[-32,58],[41,62],[-121,125]],[[4080,2605],[22,17],[8,5],[8,3],[44,10],[3,-17],[2,-6],[3,-6],[6,-11],[3,-4],[4,-5],[21,-22],[36,-40],[5,-14],[72,16],[5,1],[77,19],[156,37],[10,0],[11,14],[17,22],[70,92],[38,51],[16,10],[27,-27],[28,36],[0,4],[-18,21],[32,38],[5,5],[6,4],[7,1],[7,0],[6,-1],[7,-4],[12,-7],[12,-5],[12,-7],[10,-6],[5,-2],[5,0],[2,0],[3,0],[2,0],[-9,12],[-12,16],[-2,3],[-3,4],[-3,3],[-3,4],[-4,4],[-4,5],[-2,3],[-5,5],[-6,7],[-6,6],[-7,8],[-4,3],[-5,5],[-2,2],[14,-1],[12,-1],[42,-4],[30,-3],[11,-1],[36,-4],[37,-3],[20,-2],[18,-2],[-2,6],[-3,9],[6,69],[2,3],[5,63],[2,12],[2,12],[2,4],[8,19],[2,3],[8,12],[11,14],[54,69],[41,52],[43,55],[66,86],[4,10],[3,2],[2,4],[2,5],[3,4],[7,10],[2,2]],[[5300,3421],[5,8],[14,18],[6,8],[5,8],[6,15],[4,13],[3,19],[0,12],[4,2],[3,9],[8,17],[3,6],[2,5],[1,5],[-1,26]],[[5363,3592],[15,2],[15,-15],[22,28]],[[5415,3607],[7,9],[14,19],[3,3],[2,-2],[38,-40],[11,14]],[[5490,3610],[6,8],[1,0],[1,0],[1,0],[1,-1],[11,-11],[5,0],[19,1],[-1,-1],[-1,-1],[-1,-1],[0,-2],[1,-23],[6,1],[8,0],[5,0],[4,-1],[3,-2],[14,-14],[4,-4]],[[5031,3567],[1,-25],[-34,-3],[-22,0],[-9,-1],[-13,-1],[2,-21],[6,-20],[-11,-3],[-8,-7],[-5,-7],[42,-44],[-1,-2],[-23,-33],[-17,-27]],[[4939,3373],[-17,18],[-13,14],[-6,6],[-14,14],[-15,16],[-8,4],[-6,2],[-6,2],[-5,3],[-8,8],[-1,3],[-1,5],[1,8],[2,4],[7,7],[6,4],[5,3],[3,3],[5,5],[10,12],[-17,18],[-1,3],[-15,16],[-10,12],[-3,0],[-4,3]],[[4828,3566],[41,50],[7,7],[4,4],[6,3],[5,2],[5,2],[16,3],[7,1]],[[4919,3638],[34,2],[21,2]],[[4974,3642],[19,0]],[[4993,3642],[0,-3],[1,-20],[1,-23],[1,-31],[35,2]],[[4939,3373],[-15,-17],[-26,-27],[-10,-10],[-67,68],[-71,76],[-4,4],[82,99]],[[5031,3567],[23,1],[6,0],[8,-2],[33,1],[16,1],[36,4],[6,0],[6,-10],[6,-7],[40,-42]],[[5211,3513],[-2,-3],[-63,-81],[-28,-37],[-4,-4],[-3,-2],[-11,-5],[-8,21],[-2,3],[-22,-10],[-26,-12],[-3,-1],[-1,0],[-3,2],[-35,36],[-12,-20],[-13,-17],[-13,-16],[-5,-7],[-3,-3],[-15,16]],[[5211,3513],[31,-33],[28,-27],[27,-29],[3,-3]],[[4080,2605],[-28,43],[1,0],[12,10],[97,81],[7,5],[12,36],[1,2],[1,0],[2,2],[11,4],[1,3],[8,4],[0,7],[1,4],[4,1],[-1,5],[3,2],[2,3],[-2,3],[0,3],[-4,1],[-4,0],[-4,-1],[-4,-1],[-3,1],[3,8],[-1,5],[-6,34],[4,4],[5,4],[-1,6],[0,1],[-2,8],[4,7],[8,6],[12,8],[16,14],[-7,17],[-9,19],[-26,49],[-27,50]],[[4166,3063],[-48,44],[-61,58],[10,4]],[[4067,3169],[42,48],[-19,22]],[[4158,3361],[36,-47],[23,30],[20,-20],[11,12],[65,-62],[31,40],[20,-24],[37,44],[5,0],[4,2],[1,5],[14,11],[23,-1],[33,29],[-26,28],[-1,1],[-42,47]],[[4412,3456],[31,18],[15,11],[0,1],[32,19],[8,5],[45,28],[3,1]],[[4546,3539],[7,5],[36,22],[69,39],[28,16],[125,75],[36,22]],[[4847,3718],[20,-11],[51,-58],[1,-11]],[[5211,3513],[15,21],[30,39],[24,32]],[[5280,3605],[15,-20],[5,6],[2,0],[3,-2],[3,-5],[-6,-9],[16,-17],[25,32],[6,1],[14,1]],[[5374,3648],[16,-17],[7,9],[8,-8],[0,-1],[-6,-8],[16,-16]],[[5280,3605],[18,24],[6,8],[12,16]],[[5316,3653],[8,-3],[12,-11],[21,28],[17,-19]],[[6777,2060],[-58,37]],[[7388,3093],[-11,5]],[[7377,3098],[-28,13],[-10,1],[-8,-1],[-7,-1],[-8,-3],[-38,-10],[-18,-3],[-26,0],[-16,0]],[[7350,3037],[3,8],[4,0],[2,7],[-4,6],[21,38]],[[7376,3096],[1,2]],[[7338,3047],[12,27],[5,9],[4,7],[17,6]],[[5555,4114],[-40,-28]],[[5515,4086],[-46,-34],[-46,-34],[-2,-4],[-11,-8],[-2,3],[-16,18],[-3,4],[-2,3],[-2,2],[-3,3]],[[5524,4010],[-20,-25]],[[5504,3985],[-13,14],[-4,4],[-14,14],[-14,-19],[-16,-20],[-29,-36]],[[5414,3942],[-16,14],[-10,10],[-4,4],[-9,10]],[[5375,3980],[-3,3],[-7,7],[-21,22],[-3,2]],[[5341,4014],[39,24]],[[5515,4086],[11,-22],[-11,-6],[-10,-7],[-8,-6],[7,-11],[8,-11],[6,-7],[6,-6]],[[5504,3985],[35,-37]],[[5539,3948],[-14,-19],[-36,38],[-14,-19],[36,-38],[44,-47]],[[5526,3826],[-34,36]],[[5492,3862],[-11,11],[-67,69]],[[5539,3948],[46,-47]],[[5610,4014],[8,0],[3,-1],[2,-4],[-2,-4],[-3,-2],[-5,-2],[0,-3],[0,-8],[-1,-8],[11,-3],[9,-5],[-5,-12],[0,-3],[2,-2],[3,-5],[7,-6]],[[5524,4010],[5,-5],[11,-8],[11,20],[11,18],[11,-8],[7,-6],[9,-6],[9,-5],[9,-3],[5,0],[-2,7]],[[5610,4014],[-1,3],[-3,7],[-3,7],[11,6],[2,2],[5,6]],[[7592,2355],[0,-1],[-1,-4],[-1,-3],[0,-2],[-4,-17],[-2,-7],[-1,-4],[-4,-17],[-3,-14],[-2,-9],[-1,-3],[-1,-3],[-11,-43],[-1,-4]],[[7560,2224],[-3,-11],[0,-1],[0,-1],[0,-1],[-1,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-2],[0,-1],[0,-1],[0,-2],[0,-2],[1,-5],[0,-2],[0,-1],[1,-1],[0,-2],[0,-1],[1,-1],[0,-2],[1,-1],[0,-1],[0,-1],[1,-3],[1,-1],[1,-2],[0,-1],[1,-1],[0,-2],[1,-1],[1,-1],[1,-2],[0,-1],[1,-2],[1,-1],[2,-2],[6,-9],[6,-7],[13,-18],[6,-9],[2,-2],[2,-2],[2,-2]],[[7613,2099],[-2,-2],[-2,-2],[-1,-1],[-5,-6],[-2,-2],[-40,-40],[-4,-4],[-2,-2],[-3,-3],[-34,-26],[-130,-88],[-4,-3],[-72,-34],[-42,-22],[-24,-13],[-96,-72],[-58,-45],[-38,-41],[-22,-27],[-8,-10],[-4,-4],[-4,-4],[-20,-25],[-18,-25],[-31,-53],[-9,-13]],[[7473,2222],[2,2],[12,16],[4,5],[3,4],[5,8],[27,40],[8,10],[9,7],[5,5],[41,36],[1,1],[2,-1]],[[7590,1280],[-53,-103],[-2,-4]],[[6457,1354],[28,-19],[5,-11],[2,-2],[3,-2],[1,-2],[2,-1],[0,-1],[3,-3],[2,-2],[3,-4],[1,-4],[2,-3],[1,-2]],[[6510,1298],[-12,-4],[-3,-1],[-91,-29],[-6,-2],[-38,-10],[-21,-6],[-75,-24],[-4,-2],[-6,-2]],[[6254,1218],[0,5],[-1,35],[-22,0],[-23,-1]],[[6208,1257],[0,65]],[[6208,1322],[22,0],[0,32],[15,36],[3,8],[1,4],[1,3],[-6,4],[-11,6],[-10,6],[-54,37],[-9,6],[-7,4]],[[6153,1468],[-1,1],[-7,4],[-4,3],[-6,3],[-7,3],[-7,3],[-6,3],[-7,2]],[[6153,1321],[-1,100],[0,37],[0,6],[1,4]],[[6208,1322],[-19,0],[-18,-1],[-18,0]],[[6172,1257],[-19,0]],[[6153,1257],[0,64]],[[6208,1257],[-19,0],[-17,0]],[[6153,1257],[-17,-1],[-18,0],[-12,1]],[[6105,1421],[12,0],[17,0],[1,-100],[18,0]],[[6137,1181],[-19,-6]],[[6118,1175],[0,5],[-8,12],[-5,57],[1,8]],[[6172,1257],[0,-60],[-18,-5],[-18,-6],[1,-5]],[[6254,1218],[-22,-7],[-95,-30]],[[5468,3830],[-27,27],[-2,1],[-2,-1],[-40,-52],[-39,-52],[15,-16],[13,-13]],[[5386,3724],[-13,-18]],[[5373,3706],[-13,13],[-16,16],[-3,-2],[-4,-6],[-18,-22],[-18,-24],[1,-12],[14,-16]],[[4993,3642],[21,2],[21,1],[22,1],[10,2],[8,2],[8,5],[8,8],[7,8],[10,17],[9,15],[1,3]],[[5118,3706],[12,19],[13,22],[13,20]],[[5156,3767],[13,19],[16,19],[14,17],[26,30],[11,9],[16,10],[7,5],[14,11],[42,41],[19,18],[6,4],[22,19],[10,9],[3,2]],[[5492,3862],[-3,-3],[-13,-17],[-8,-12]],[[5468,3830],[11,-12],[-14,-20],[-14,-18],[-3,2],[-10,9],[-13,-15],[-10,-15],[9,-13],[-1,-5],[-25,-32],[-12,13]],[[5601,3534],[-24,25]],[[5490,3610],[-26,28],[7,10],[-13,14],[-11,11],[-3,1],[-6,-6],[-2,-1],[-1,1],[-9,10],[-3,3],[-12,12],[-11,-15]],[[5400,3678],[-4,4],[-23,24]],[[5400,3678],[-4,-2],[-22,-28]],[[8925,5145],[-10,6],[-8,4],[-5,2],[-1,1],[-10,5]],[[8908,5098],[-10,-24],[-10,6],[-14,8],[-10,5]],[[8889,5051],[-10,5],[-14,8],[-10,6]],[[8846,5047],[-11,6],[-18,9],[-10,6]],[[8807,5068],[9,23]],[[8837,5023],[-11,6],[-19,10],[-10,5]],[[8797,5044],[-11,6],[-19,10],[-10,5]],[[8757,5065],[9,25],[10,-6],[20,-11],[11,-5]],[[8776,4996],[11,25],[10,23]],[[8847,5017],[-5,-11],[-4,-12],[-11,6],[-10,-26],[-41,22]],[[8816,4937],[-11,6],[-12,6]],[[8793,4949],[-29,16]],[[8764,4965],[5,12],[6,15],[1,4]],[[8796,4920],[-12,6],[5,12],[4,11]],[[8812,4853],[-10,5],[-16,8],[-9,6]],[[8777,4872],[-41,21]],[[8736,4893],[10,25],[4,12],[5,12],[-23,12],[1,2],[3,8],[5,13]],[[8741,4977],[23,-12]],[[8792,4795],[-11,5],[-31,17]],[[8750,4817],[6,11],[8,17],[11,23],[2,4]],[[8750,4817],[-38,21]],[[8712,4838],[5,11],[8,16],[6,14],[4,11],[1,3]],[[8728,4768],[-10,6],[-18,9],[-11,5]],[[8689,4788],[6,16],[6,11],[5,11],[6,12]],[[8750,4817],[-5,-11],[-6,-11],[-4,-10],[-1,-2],[-6,-15]],[[8773,4746],[-10,5],[-24,12],[-11,5]],[[8765,4723],[-11,5],[-24,12],[-10,5]],[[8720,4745],[8,23]],[[8745,4670],[-11,6],[-23,12],[-10,5]],[[8701,4693],[9,26],[10,26]],[[8730,4629],[-9,5],[-25,13],[-11,5]],[[8685,4652],[8,21],[8,20]],[[8685,4652],[-7,-21]],[[8678,4631],[-11,5],[-18,9],[-11,5],[8,19],[0,2],[9,22],[7,19]],[[8662,4712],[10,-5],[13,-6],[5,-3],[11,-5]],[[8700,4595],[-20,10],[-10,5]],[[8670,4610],[8,21]],[[8661,4587],[-36,19],[-4,1],[-39,19]],[[8582,4626],[5,11],[4,12]],[[8591,4649],[8,21]],[[8599,4670],[7,19],[1,2]],[[8607,4691],[8,22],[7,19]],[[8622,4732],[11,-5],[10,-5],[8,-4],[11,-6]],[[8670,4610],[-5,-11],[-4,-12]],[[8643,4542],[9,24]],[[8652,4566],[4,11],[5,10]],[[8652,4566],[-35,17],[-4,2],[-10,-24],[-2,1],[-7,4],[-20,10],[-10,5]],[[8564,4581],[10,24]],[[8574,4605],[8,21]],[[8545,4525],[10,29],[0,3],[9,24]],[[8545,4525],[-2,1],[-9,5],[-11,5],[-17,4],[-36,5]],[[8470,4545],[12,30],[6,15],[9,24],[5,14],[4,11]],[[8506,4639],[36,-19],[22,-10],[2,-1],[8,-4]],[[8506,4639],[4,10],[4,11]],[[8514,4660],[10,-5],[26,-13],[20,-10],[2,-1],[10,-5]],[[8514,4660],[4,12],[4,11]],[[8522,4683],[10,-5],[49,-24],[10,-5]],[[8522,4683],[8,21]],[[8530,4704],[9,-5],[2,0],[47,-24],[11,-5]],[[8530,4704],[8,21]],[[8538,4725],[11,-5],[47,-24],[11,-5]],[[8538,4725],[8,22]],[[8546,4747],[7,20]],[[5016,1222],[4,-1],[16,-1],[4,-5],[1,-11],[-2,-4],[-2,-2],[-4,-2],[-13,-4],[-8,-2],[-4,0],[-8,4],[-5,0],[-2,-1],[-4,-2],[-4,-6],[-2,-9],[-4,-6],[-8,-6],[-6,-4],[-3,-8],[-3,-3],[-15,-6],[-7,-4],[-12,-3],[-11,0],[-13,4],[-16,12],[-13,12],[-3,2],[-1,3],[-8,3],[-5,1],[-3,1],[-3,1],[-2,0],[-2,0],[-9,-3],[-9,-10],[-7,-1],[-6,-2],[-4,2],[-4,2],[-9,5],[-6,6],[-2,0],[-5,4],[-3,0],[-5,1],[-4,0],[-3,1],[-5,3],[-2,1],[-4,-1],[-2,-10],[-3,-4],[-9,2],[-2,2],[-1,0]],[[4741,1173],[-2,3],[1,20],[-2,4],[-5,2],[-2,20]],[[4731,1222],[11,-2],[3,0],[16,1],[4,0],[4,1],[11,4],[8,8],[2,0],[0,1],[1,2],[2,2],[2,2],[3,3],[4,4],[5,3],[13,8],[13,5]],[[4833,1264],[26,5],[11,2],[15,2],[20,6]],[[4905,1279],[4,1],[17,2],[19,0],[6,-30],[3,-25],[4,-24],[38,9],[8,1],[6,-3],[5,0],[1,9],[0,3]],[[5122,1221],[0,-4],[3,-15]],[[5125,1202],[-8,2],[-10,1],[-20,1],[-5,0],[-4,-1],[-18,-2],[-2,2],[-6,6],[-8,10],[-4,2],[-11,2],[-9,0],[-4,2]],[[5016,1227],[1,8],[17,0],[0,33],[-18,1],[0,12]],[[5016,1281],[11,0],[26,-1],[11,-2],[11,-7],[9,-8],[10,-12],[5,-9],[10,-10],[7,-7],[6,-4]],[[1506,1092],[-3,7],[-2,7],[-3,45],[-11,27]],[[1560,1505],[64,-17]],[[1624,1488],[14,-49],[22,-78],[23,-80],[29,-62],[4,-7],[2,-5],[3,-3],[4,0],[5,1]],[[1983,1486],[7,-12],[33,-54],[4,-7]],[[1624,1488],[2,-1],[26,11],[10,4],[2,4],[9,4],[5,-7],[6,8],[8,7],[7,7],[34,24],[3,3],[16,12],[9,11],[15,23],[12,16],[13,17]],[[6475,2834],[-8,6],[11,20],[0,17],[-12,8],[2,12],[4,14],[10,16],[-5,4],[-2,1],[-2,2]],[[7999,2859],[-7,9],[-7,7],[-5,4],[-2,3]],[[7978,2882],[3,3],[32,42],[2,2],[4,6],[8,10],[12,16],[0,1],[20,25],[5,7],[4,5],[3,2]],[[7920,2741],[-10,27]],[[7910,2768],[-8,17],[-1,2],[-1,4]],[[7900,2791],[15,15],[8,9],[15,17],[7,8],[11,14],[14,17],[8,11]],[[7978,2882],[-2,4],[-1,2],[-1,3],[-4,6],[-2,3],[-8,10],[-8,9]],[[7900,2791],[-1,1],[-1,3],[-3,5],[-2,6],[-2,3],[-2,5],[-4,5],[-8,11],[-15,19],[-2,3],[14,7],[-26,13],[-8,4],[-13,7]],[[7850,2917],[3,0],[2,-2],[1,-3],[4,-4],[8,-9],[8,10],[4,6],[2,3],[14,18]],[[7896,2936],[7,-6],[2,-1],[15,-12],[13,-10],[15,14],[3,-3],[1,1]],[[8723,2851],[-10,7],[-12,6],[-16,5],[-40,13],[-5,1],[-2,1],[-32,10],[-33,10],[-2,-1],[-4,1],[-21,7],[-4,2],[-3,2],[-7,2],[-10,4],[-13,7],[-13,10],[-7,7],[-4,3],[-10,12],[-7,10],[-6,9],[-5,11],[-3,9],[-1,2],[-3,11],[-2,6]],[[8448,3018],[7,2],[1,2],[1,6],[6,35],[3,22],[2,20],[0,2],[0,2],[-1,0],[-6,4],[-1,1],[2,5],[0,5],[0,9],[0,3],[2,23],[1,24],[-1,21]],[[8595,3755],[-7,-33],[-50,-139],[0,-2],[26,1],[27,75],[3,0],[3,15],[13,-16],[-22,-123],[8,-1],[-10,-57],[-89,-6],[-17,-47],[0,-1],[98,9],[-7,-30],[-97,-10],[-4,-25],[54,6],[0,-5],[-54,-6],[-4,-19],[97,13],[-6,-32],[-90,-12],[6,-49],[1,-11],[4,-26],[6,0],[0,-5],[4,-1],[5,20],[11,1],[-3,-27],[3,0],[2,8],[2,0],[4,15],[22,-3],[0,-13],[2,0],[-7,-113],[1,0],[0,-3],[-9,-131],[2,-5],[3,1],[0,-6],[6,0],[1,-2],[4,-1],[0,8],[6,-1],[7,103],[13,173],[1,2],[8,-1],[30,0],[-11,-169],[22,-2],[12,159],[3,41],[3,50],[0,7],[5,49],[3,18],[10,75],[3,27],[2,8],[3,2],[2,1],[3,-2],[5,-4],[-1,-102],[-1,-17],[1,-81],[1,-12],[-2,-19],[-1,-22],[0,-16],[0,-20],[0,-18],[8,-43],[0,-13],[1,-2],[7,-55],[14,-111],[3,-10],[6,-18],[7,-21],[16,-33],[13,-30],[2,-4]],[[8376,2911],[3,3],[31,28],[3,1],[8,-1],[7,0],[9,-1],[9,2],[7,1],[4,2],[6,-1],[5,0],[7,0],[0,3],[-6,6],[-2,3],[-3,6],[-4,5],[-3,5],[-4,6],[-3,5],[-1,4],[-2,4],[-3,6],[-8,-7],[-2,1],[2,21],[-7,0],[-4,-33],[-11,-10],[4,41],[-7,-1],[-6,-50],[-21,-20],[-5,-4]],[[8379,2936],[2,3],[7,29]],[[8388,2968],[4,21],[3,23],[14,2],[30,2],[2,0],[3,1],[4,1]],[[8448,3018],[-6,26],[-6,19],[-3,11],[-1,3],[-6,12],[-7,11],[-8,8],[-3,3],[-6,4],[-28,19],[-10,6],[-4,3],[-16,10],[-11,7],[-7,4],[-32,26]],[[8294,3190],[1,3],[1,2],[1,4],[20,46],[5,12],[4,9],[4,12]],[[8388,2968],[-29,17],[-2,2],[-40,25],[-8,-19],[-6,-12],[-31,5],[-11,2],[-11,3],[-9,6],[-6,4],[-3,4],[-6,6]],[[8226,3011],[12,23],[9,22],[15,37],[6,16],[1,4],[3,9],[2,6],[2,6],[5,15],[10,29],[1,5],[0,1],[1,2],[1,3],[0,1]],[[8159,3023],[17,28]],[[8176,3051],[50,-40]],[[8226,3011],[-12,-25],[-14,-27]],[[8379,2936],[-3,-4],[-3,-2],[-15,-12],[-32,-27],[-30,-28],[-8,-9],[-3,-2]],[[2357,1179],[-39,-11],[-36,-9],[-22,-6],[-35,-9]],[[2225,1144],[-10,35],[-1,4],[-25,84],[-4,7],[-10,19]],[[2175,1293],[10,5],[1,0]],[[2323,1305],[6,-15],[-1,-3],[1,-5],[2,-8],[6,-19],[1,-6],[3,-12],[3,-11],[6,-24],[7,-23]],[[2439,1152],[8,-30],[-9,-3],[-11,-4],[-9,-3],[-10,-4],[-10,-3],[-18,-7],[-2,0],[2,-9]],[[2380,1089],[-36,-13],[-48,-17],[0,-1],[0,-2],[0,-1],[18,-70],[-39,-11]],[[2275,974],[-2,7],[-2,6],[-9,32],[-7,26],[-30,99]],[[2357,1179],[3,-15],[3,-8],[50,12],[20,6],[3,-9],[3,-13]],[[2421,1382],[2,-8],[3,-10],[0,-3],[3,-10],[6,-24],[12,-48],[6,-24],[-11,-4],[3,-11],[3,-12],[4,-19],[2,-4]],[[2454,1205],[-1,-2],[11,-42],[-25,-9]],[[2454,1205],[58,20],[25,9],[4,2]],[[2541,1236],[10,-39]],[[2551,1197],[-3,-2],[8,-25],[-1,-5],[-1,-2],[-1,-2],[-2,-3],[-7,-2],[4,-18],[4,-16],[-6,-1],[-1,0],[-3,2],[-1,0],[-22,-7],[0,-1],[-1,-1],[0,-1],[10,-34],[-20,-9],[-32,-17],[-37,-17],[-40,-17],[-2,9],[-4,11],[-4,16],[-2,10],[-7,24]],[[2582,1092],[-3,-1],[-7,-3],[-1,-1],[-26,-12],[-56,-24],[-90,-41],[-55,-22],[-22,-7],[-38,-10],[-6,-2]],[[2278,969],[-3,5]],[[2551,1197],[13,-40],[5,-8],[3,-2],[2,0],[3,-1],[9,3],[15,6],[42,15],[-4,16]],[[2639,1186],[4,2],[45,15],[1,0],[1,-1],[5,-19],[0,-2],[0,-1],[-49,-22],[7,-28],[69,31],[48,22]],[[2770,1183],[46,21]],[[2816,1204],[1,-6]],[[2817,1198],[-2,-1],[-153,-69],[-74,-33],[-6,-3]],[[2607,1311],[3,-11],[1,-1],[13,0],[5,0],[9,2],[2,-11],[4,-13]],[[2644,1277],[-6,-2],[-3,0],[-13,0],[-1,-14],[0,-6],[3,-11],[11,-44],[4,-14]],[[2541,1236],[-30,118],[-5,16]],[[2506,1370],[13,4],[7,-24],[10,4],[3,0],[35,-7],[1,-1],[1,-2],[4,-17],[6,-20],[1,-3],[20,7]],[[2488,1435],[4,-9],[2,-9],[12,-47]],[[2757,1440],[59,-236]],[[2770,1183],[-5,22],[-1,1],[-2,1],[-7,-3],[-15,55],[-5,22],[-9,25],[-1,1],[-1,1],[-1,0],[-1,0],[-11,-4],[-7,-4]],[[2704,1300],[-5,17],[-2,8],[21,7],[1,1],[-4,17],[0,13],[-7,29],[-8,31],[-1,1],[-1,0],[-60,0],[-7,1],[-1,-1],[0,-1],[0,-4],[7,-25],[-20,-7],[-27,-9],[6,-24],[11,-43]],[[2488,1435],[22,3],[247,2]],[[2704,1300],[-13,-6],[-6,-3],[-20,-7],[-21,-7]],[[2537,873],[-2,-1],[-2,-2],[-12,-7],[-2,-3],[-13,-9],[-12,-13],[6,-11],[2,2],[1,-1],[-2,-3],[-4,-3],[-10,11],[-4,-3],[-11,-11],[-14,-16],[-3,-2],[-3,-1],[-4,-4],[-4,-6],[-5,-3],[-5,-6],[0,-2],[0,-2],[-15,-18],[-2,-3],[-1,-1],[-3,0],[-3,-1],[-2,-4],[-8,-4],[-13,-1],[-3,1],[-13,1],[-12,2],[-13,0],[-16,-4],[-2,-2],[-5,-5],[-3,-1],[-2,-1],[-1,-1],[-11,-5],[-6,-4],[7,-19],[-4,-3],[-4,10],[-1,0],[2,-8]],[[2228,744],[9,10],[9,8],[10,5],[16,7],[43,17],[23,9],[21,8],[-11,38],[-13,45],[0,2],[1,0],[1,1],[1,0],[4,-1],[6,-2],[6,-3],[5,-4],[22,7],[-2,3],[-4,5],[-4,5],[-6,4],[-7,4],[-9,4],[-10,2],[-11,0],[-1,1],[-7,23]],[[2320,942],[10,1],[13,-1],[8,-2],[5,-1],[12,-4]],[[2215,729],[-2,5],[-6,23],[-6,19],[2,4],[6,7],[1,3],[-1,2],[-1,3],[-7,8],[-29,101],[17,6],[5,1],[8,3],[22,6],[73,19],[10,2],[13,1]],[[1879,863],[27,8],[14,3],[32,8],[56,16],[46,12],[17,4],[70,20],[124,31],[13,4]],[[2582,1092],[3,-15],[1,-6],[0,-4],[2,-8],[0,-4]],[[2104,990],[13,2],[5,1],[5,3],[3,3],[4,5]],[[2134,1004],[4,-5],[4,-3],[11,-19],[1,-1],[1,0],[38,10],[20,6],[4,-10],[2,-9],[4,-12],[52,13]],[[2134,1004],[2,3],[2,7],[1,6],[0,8],[-1,7],[-5,23],[17,5],[0,2],[0,3],[-2,7],[-3,5],[-3,5],[-5,6],[-5,5],[-2,5],[-2,5],[-5,18],[20,5],[5,-18],[2,-5],[4,-3],[5,-2],[4,1],[20,7],[22,10],[-5,19]],[[2200,1138],[25,6]],[[2096,1141],[41,12],[-3,9],[1,4],[2,7],[2,6],[25,-1],[16,-1],[3,0],[4,1],[6,-20],[-4,-10],[6,-5],[5,-5]],[[2069,1205],[-4,19],[0,3],[1,2],[37,8],[-8,26],[-6,23],[16,6],[3,3],[7,-23],[41,14],[12,4],[7,3]],[[2023,1318],[25,12],[16,9],[5,2],[1,1],[26,-42],[12,11],[22,21],[30,18],[24,-49],[2,-3]],[[2030,1408],[6,4],[50,41],[36,29],[17,14]],[[1953,1581],[11,-19],[9,-15],[1,-3],[77,61],[21,17]],[[6461,6069],[4,24],[18,-5],[8,-1]],[[6491,6087],[1,-12],[-2,-13],[-1,-5]],[[6489,6057],[-1,-4],[-2,-9],[-25,25]],[[6489,6057],[26,-26],[4,-4]],[[6519,6027],[-1,-5],[-4,-13],[-2,-10],[-6,-28],[-2,-8]],[[6504,5963],[-4,3],[-4,1],[-24,19]],[[6472,5986],[2,6],[2,11],[5,22],[-25,19],[5,25]],[[6326,5854],[4,-2],[25,-26],[2,1],[2,0],[2,-3],[1,-3],[33,-23]],[[6395,5798],[-2,-6],[-3,-5],[-3,-2],[-5,-3],[-6,-5],[-3,-1],[-3,-4],[-12,-26],[-3,-6]],[[6355,5740],[-10,-23],[-5,-11]],[[6340,5706],[-16,8],[-4,-11],[-2,-14],[-11,-39],[-5,1],[-1,-10],[-5,-14],[-7,-3]],[[6289,5624],[-4,-1],[-5,-2]],[[6280,5621],[-14,15],[-18,23],[-3,6],[0,1],[-16,-8],[-5,4],[-6,6],[-5,7],[-5,9],[-4,9],[0,7],[5,15],[5,9],[2,4],[9,13],[3,9],[11,25],[5,10],[3,8],[5,8],[22,24],[5,5],[2,2],[1,3],[0,13],[12,16],[3,6],[0,10],[13,31],[5,7],[1,1],[5,4],[8,4],[8,8],[1,-2],[-5,-5],[5,0],[4,2],[9,9],[25,29],[0,2],[3,-1],[3,5],[4,10],[2,1],[0,-5],[-1,-10],[-4,-10],[-8,-14],[-7,-9],[-8,-6],[-7,-3],[-14,-13],[-10,-10],[-1,-1],[-5,-11],[-6,-13],[-4,-13],[-1,-5],[1,-1],[0,-3],[-4,-7],[-1,-5],[-3,-6],[0,-4],[-9,-12],[0,-23],[-2,-13],[-5,-15],[0,-4],[-1,-5],[-2,-7],[-1,-13],[2,-1],[2,3],[2,-1],[-3,-12],[7,-2],[2,3],[3,6],[5,13],[1,6],[2,9],[1,8],[-1,26],[1,16],[5,5],[6,6],[-1,4],[1,5],[3,12],[3,4]],[[6407,6036],[-3,-8],[-3,9],[-3,0],[-2,2],[0,10],[1,8],[5,23],[0,6],[3,9],[6,11],[1,1],[6,-3],[1,-9],[-2,-14],[-4,-19],[-4,-8],[-2,-6],[0,-12]],[[6428,5995],[1,7],[3,10],[4,5]],[[6436,6017],[3,-9]],[[6439,6008],[-11,-13]],[[6395,6005],[-1,0],[-3,3],[0,2],[2,0],[3,0],[0,-2],[0,-1],[-1,-2]],[[8581,4842],[7,19],[4,9]],[[8592,4870],[5,10],[4,10]],[[8601,4890],[44,-24],[16,-8],[10,-6]],[[8671,4852],[-9,-16],[-1,-2],[-5,-11],[-2,-4],[-4,-12]],[[8689,4788],[-8,-23],[-11,5],[-7,4],[-6,3],[-15,8]],[[8671,4852],[3,6]],[[8674,4858],[10,-6],[28,-14]],[[8674,4858],[6,12],[7,16],[9,24],[1,4]],[[8697,4914],[11,-6],[28,-15]],[[8601,4890],[7,18],[7,16],[5,12],[5,12],[1,3]],[[8626,4951],[34,-18]],[[8660,4933],[4,-2],[33,-17]],[[8660,4933],[10,25],[9,24]],[[8679,4982],[9,23]],[[8688,5005],[29,-15],[8,-5],[16,-8]],[[8626,4951],[-8,5],[-61,32]],[[8557,4988],[4,5],[7,19],[10,24]],[[8578,5036],[9,23]],[[8587,5059],[10,-5],[46,-24],[11,-7],[-9,-23],[34,-18]],[[8601,4890],[-42,22],[-23,12]],[[8536,4924],[3,10],[3,10]],[[8542,4944],[4,17],[10,24],[1,3]],[[8592,4870],[-62,34]],[[8530,4904],[3,10],[3,10]],[[8563,4793],[-11,5],[-40,20],[-9,5]],[[8503,4823],[9,26],[9,23],[6,21],[3,11]],[[8546,4747],[-11,6],[-39,20],[-10,4]],[[8486,4777],[7,20]],[[8493,4797],[10,26]],[[8538,4725],[-11,5],[-40,20],[-9,5]],[[8478,4755],[8,22]],[[8514,4660],[-12,6],[-38,19],[-10,5]],[[8454,4690],[8,23],[8,21]],[[8470,4734],[8,21]],[[8470,4734],[-11,5],[-45,23],[-13,6]],[[8401,4768],[7,21]],[[8408,4789],[13,-6],[45,-23],[12,-5]],[[8454,4690],[-12,6],[-5,2],[-37,18],[-13,7]],[[8387,4723],[7,24],[7,21]],[[8436,4644],[-10,5],[-42,21],[-12,6]],[[8372,4676],[7,25]],[[8379,4701],[8,22]],[[8454,4690],[-9,-22],[-9,-24]],[[8379,4701],[-74,37]],[[8305,4738],[8,22],[16,43]],[[8329,4803],[8,21]],[[8337,4824],[10,-4],[48,-24],[13,-7]],[[8337,4567],[-45,9]],[[8292,4576],[-1,13],[-2,30],[-2,38],[1,2],[0,6],[0,7],[-2,1],[0,5],[1,8],[1,5],[3,10],[5,12],[9,25]],[[8372,4676],[-3,-9],[-2,-6],[-3,-10],[-5,-15],[-9,-29],[-1,-3],[-8,-26],[-4,-11]],[[8436,4644],[-9,-24],[-5,-16],[-14,-38],[0,-2],[-3,-9]],[[8405,4555],[-3,1],[-65,11]],[[8378,4487],[-9,5],[-36,21],[-2,1],[-10,6]],[[8321,4520],[7,20],[7,20],[2,7]],[[8405,4555],[-3,-7],[-2,-2],[-8,-20],[-6,-17],[0,-3],[-8,-19]],[[8434,4454],[-9,5],[-6,4],[-34,19],[-7,5]],[[8405,4555],[65,-10]],[[8470,4545],[-5,-13],[-8,-20],[-8,-19]],[[8449,4493],[-8,-20],[-7,-19]],[[8524,4473],[-9,5],[0,-3],[-3,-7],[-4,-10],[-51,30],[-8,5]],[[8501,4414],[-12,7]],[[8489,4421],[-35,21],[-1,0],[-11,7],[-8,5]],[[8418,4414],[7,20],[9,20]],[[8489,4421],[-4,-10],[-4,-9],[0,-4],[-3,-7],[-4,-9],[-47,27],[-9,5]],[[8394,4366],[10,18],[7,14],[7,16]],[[8339,4404],[5,9],[6,10],[6,11],[5,14]],[[8361,4448],[8,-5],[14,-8],[18,-10],[8,-5],[9,-6]],[[8361,4448],[8,19],[9,20]],[[8361,4448],[-9,6],[-32,18],[-2,1],[-10,6]],[[8308,4479],[7,20],[6,21]],[[8295,4435],[6,21],[7,23]],[[4188,1444],[-4,25],[-6,25],[-4,24],[-5,31],[14,-2],[26,0],[17,-1],[24,-1]],[[4250,1545],[6,-30],[4,-19],[4,-18],[3,-17],[4,-17],[4,-17]],[[4275,1427],[-25,-1],[-17,0],[-21,-1],[-19,-5],[-5,24]],[[4296,1317],[4,-22],[6,-30]],[[4306,1265],[-4,2],[-4,2],[-5,2],[-12,4],[-9,2],[-4,0],[-6,1],[-8,36],[-19,-1],[-52,-3]],[[4183,1310],[-4,23],[-5,23],[-11,56]],[[4163,1412],[-5,24],[30,8]],[[4275,1427],[3,-18],[3,-17],[4,-19],[4,-19],[3,-17],[4,-20]],[[2744,974],[-8,32],[25,9],[9,3],[1,1],[2,1],[1,2],[4,8],[16,26],[16,30],[17,27],[-11,46],[0,1],[-1,1],[-1,0],[-20,-9],[-22,-10],[-25,-11],[-1,-1],[0,-1],[0,-1],[2,-10],[0,-1],[0,-1],[-11,-5],[-26,-12],[-21,-10],[-21,-10]],[[6481,5902],[-5,-12]],[[6476,5890],[-44,30],[-8,-14],[-4,-8],[-3,-9],[0,-1],[-1,-4],[-1,-3],[-5,-20],[36,-25],[4,-3]],[[6450,5833],[-10,-23],[-9,-19]],[[6431,5791],[-1,2],[-3,2],[-10,6],[-17,12],[-5,-15]],[[6326,5854],[2,3],[3,2],[2,1],[7,7],[2,7],[0,4],[6,8],[2,4],[3,3],[0,-4],[2,-5],[2,0],[1,2],[0,7],[1,6],[15,21],[8,11],[6,4],[7,3],[8,7],[6,5],[5,7],[6,11],[5,17],[3,10]],[[6439,6008],[33,-22]],[[6472,5986],[-6,-15],[28,-20],[3,-1],[-2,-7],[-5,-16],[-4,-11],[-5,-14]],[[6504,5963],[14,-11],[9,-7],[12,-4],[19,-13],[19,-15]],[[6577,5913],[-6,-12],[-11,-22],[-11,-23]],[[6549,5856],[-64,43],[-4,3]],[[6552,6028],[60,-67]],[[6612,5961],[-14,-17],[-2,-3],[-12,-18],[-7,-10]],[[6519,6027],[22,-23],[11,24]],[[6636,5872],[-22,15],[-37,26]],[[6612,5961],[58,-61]],[[6670,5900],[-6,-6],[-2,-2],[-3,-2],[-4,-3],[-2,-1],[-3,-1],[-9,-6],[-3,-3],[-2,-4]],[[6596,5793],[-9,6],[-16,12],[4,9],[-33,23],[7,13]],[[6636,5872],[-6,-12],[-11,-22]],[[6619,5838],[-12,-22],[-11,-23]],[[6714,5822],[4,-5],[6,-4],[7,-5],[11,-8],[11,-8]],[[6753,5792],[-1,-3],[-9,-16],[-8,-17]],[[6735,5756],[-9,5],[-46,32],[-3,3],[0,2],[-58,40]],[[6636,5872],[6,-6],[53,-34],[17,-13],[2,3]],[[6670,5900],[11,15],[7,7]],[[6688,5922],[38,-61],[5,-6],[5,-7]],[[6736,5848],[-9,-10],[-13,-16]],[[6688,5922],[13,11],[14,13]],[[6715,5946],[49,-74],[-15,-13],[-13,-11]],[[2102,1961],[17,11],[13,9],[12,10],[3,2],[1,1],[2,2]],[[2063,2107],[15,-34],[6,-11],[7,-11],[4,-5],[8,-10],[6,-7],[1,-2],[10,-9],[19,-14],[11,-8]],[[1983,2132],[10,12],[3,2],[3,0],[2,-1],[12,-27],[3,-6],[3,-4],[4,-4],[2,-5],[6,-14],[28,16],[1,3],[3,3]],[[2063,2107],[1,2],[10,4],[-9,19],[7,5],[7,3],[4,2]],[[2083,2142],[19,0],[9,-1],[0,-22],[7,0],[8,1],[7,3],[9,-19],[8,-18],[9,-19],[8,-20],[13,-19]],[[2083,2142],[0,20],[-9,0],[-11,25],[0,3],[7,18],[-14,8],[4,6],[7,15],[7,15],[6,12],[8,11],[7,9]],[[2095,2284],[10,-8],[2,-4],[3,-8],[13,-27],[17,10],[18,11],[18,11],[16,11],[17,11]],[[2209,2291],[11,-29]],[[2220,2262],[18,-51],[2,-5],[4,-4],[5,-4],[28,-16],[-2,-5],[-8,-23]],[[2063,2107],[-16,36],[-31,70],[-12,25],[-19,42]],[[1985,2280],[87,59],[28,17],[-14,41]],[[2086,2397],[5,19]],[[2091,2416],[6,-2],[3,-4],[23,-50],[-15,-9],[-9,-7],[-2,-2],[-1,-4],[-6,-22],[-3,-13],[0,-5],[1,-3],[7,-11]],[[1964,2154],[22,25],[-32,71],[3,1],[4,2],[4,0],[4,3],[19,11],[-5,11]],[[1983,2278],[2,2]],[[1955,2280],[7,-14],[21,12]],[[1932,2331],[2,1],[2,-5],[3,-3],[3,-1],[5,3],[2,1],[4,6],[1,2],[10,6],[6,1],[5,1],[5,7],[5,12],[-3,11],[3,12],[1,0],[3,2],[7,0],[4,1],[3,3],[1,2],[1,7],[-2,4],[1,6],[0,2],[0,21],[6,15],[5,9],[2,10],[0,18],[4,10],[3,19],[6,17],[5,22],[3,8]],[[2038,2561],[-2,-10],[21,-22],[2,-2]],[[2059,2527],[-5,-14],[-2,-5],[-9,-25],[-2,-6],[0,-2],[0,-6],[0,-6],[-1,-64]],[[2040,2399],[-2,-21],[-1,-7],[0,-5],[-2,-7],[-18,-20],[-11,-9],[-13,-10],[-6,-7],[-7,-13],[-2,-4],[6,-14],[1,-2]],[[2040,2399],[25,15],[9,6],[1,2]],[[2075,2422],[11,-25]],[[2059,2527],[3,8]],[[2095,2473],[-17,-24],[-8,-18],[5,-9]],[[2276,2393],[-37,17]],[[2239,2410],[1,8],[0,6],[0,5],[-2,6],[-2,6],[-7,17],[-2,1],[-2,-1],[-12,-6],[-7,19],[16,8],[-14,38],[-7,9],[-13,-14],[-12,-14],[-20,-22],[-15,19],[-15,-17],[-11,-16],[-9,-13]],[[2106,2449],[-9,-19],[-6,-14]],[[2239,2410],[-6,1],[-5,0],[-7,-1],[-5,-2],[-41,-21]],[[2175,2387],[-8,20],[-8,17],[-16,35],[-13,-18],[-12,-18],[-12,26]],[[2238,2271],[-18,-9]],[[2209,2291],[-15,32],[-4,5],[-6,4],[-7,4],[7,19],[4,11],[-6,5],[-3,6],[-4,10]],[[2299,2382],[-7,-19],[7,-18],[-10,-5],[-2,0],[-2,0],[-6,3],[-17,8],[-10,-29],[-26,-13],[-1,-3],[13,-35]],[[6797,5762],[-3,2]],[[6794,5764],[0,6],[1,5],[2,11],[1,6],[7,14],[10,17]],[[6815,5823],[10,19],[16,26],[-16,8],[-38,59]],[[6787,5935],[15,13]],[[6802,5948],[13,12],[14,12],[13,11],[-40,64]],[[6802,6047],[13,12],[15,12]],[[6830,6071],[41,35],[2,2]],[[6873,6108],[6,-9],[11,-16],[9,-14],[15,-24],[11,-17]],[[6925,6028],[2,-3],[2,-3]],[[6929,6022],[2,-3],[5,-7],[5,-5],[0,-1],[5,-5]],[[7185,6081],[-18,13],[-11,-15],[-4,0],[-32,23],[-11,-19],[-6,4]],[[7103,6087],[-16,11],[-5,-8],[-2,-2],[-8,-19],[-6,-18]],[[6929,6022],[120,237],[5,10],[7,13]],[[7061,6282],[12,24]],[[7159,6046],[-18,13],[-9,-18],[-9,-15],[-4,-1],[-30,23],[-1,1],[0,2],[0,2],[5,16],[10,18]],[[7061,6282],[-4,5],[-18,26],[-36,57]],[[7003,6370],[15,13],[17,13],[-36,57]],[[6999,6453],[16,13],[10,9],[14,13]],[[7039,6488],[14,11]],[[7053,6499],[36,-56],[26,-41],[3,-9]],[[7003,6370],[-35,56]],[[6968,6426],[15,13],[16,14]],[[4901,1424],[11,-63]],[[4912,1361],[-19,-5],[7,-49],[5,-28]],[[4833,1264],[-5,30]],[[4828,1294],[-3,22],[-3,17],[-2,4],[-2,2],[2,0],[2,1],[2,2],[4,10],[5,7],[7,5],[3,2],[1,2],[0,1],[-1,3],[0,1],[-1,2],[-4,0],[-3,2],[-4,3],[-2,5],[-3,8],[-3,13]],[[4823,1406],[-2,17],[0,8],[2,5],[2,4],[4,3],[4,-1],[3,-2],[3,-3],[2,-6],[5,-20],[19,5],[17,4],[19,4]],[[4731,1222],[-6,45],[0,3],[-1,2],[1,5],[-3,22]],[[4722,1299],[31,-3],[20,-2],[4,0],[24,-2],[14,0],[13,2]],[[4722,1299],[-2,19],[-10,64]],[[4710,1382],[31,6],[25,6],[39,8],[18,4]],[[4892,1481],[9,-57]],[[4710,1382],[-4,27],[-3,26],[-3,20],[0,5],[1,7],[1,1],[2,4],[6,7]],[[4710,1479],[3,3],[2,1],[2,2],[1,0],[8,5],[6,3],[13,6],[20,8],[12,3],[14,1],[7,0],[8,0],[4,-1],[4,0],[4,-2],[25,-9],[5,-1],[24,-9],[20,-8]],[[4710,1382],[-3,-1],[-60,-10],[-10,3],[-20,8],[-19,7],[-4,22],[-4,21],[-4,23],[-34,10],[4,-23],[4,-21],[3,-21]],[[4563,1400],[-33,10]],[[4530,1410],[-7,46],[-5,24],[-8,49],[-2,1],[-4,0],[-20,4],[-36,5],[-51,2]],[[4397,1541],[-96,3]],[[4301,1544],[-16,0],[-35,1]],[[4250,1545],[-1,6],[-1,5],[-1,5],[-3,13]],[[4689,1559],[-1,-3],[0,-4],[-1,-5],[0,-3],[0,-2],[0,-4],[0,-2],[1,-4],[0,-3],[1,-3],[1,-2],[1,-2],[1,-1],[1,-2],[1,-2],[1,-1],[3,-2],[3,-1],[4,-3],[4,-2],[3,-2],[1,-1],[1,-1],[1,-2],[0,-1],[1,-2],[0,-1],[1,-1],[0,-1],[0,-1],[0,-1],[0,-2],[0,-1],[-1,-2],[0,-1],[-1,-3],[-1,-1],[-2,-2],[-2,-3]],[[4722,1299],[-3,0],[-26,2]],[[4693,1301],[-26,2]],[[4667,1303],[-20,2],[-14,2],[-24,2]],[[4609,1309],[-31,2],[0,4],[-3,18],[-3,23],[-4,20],[-5,24]],[[4609,1309],[-1,-3],[13,-78],[1,-3],[0,-5]],[[4622,1220],[-16,9],[-3,2],[-5,2],[-5,2],[-17,7],[-4,1],[-7,3],[-5,1],[-3,1],[-3,1],[-5,0],[-5,0],[-25,-5]],[[4519,1244],[-4,25],[-1,1],[-2,1],[1,5],[-8,41],[-8,49],[-8,48]],[[4489,1414],[17,4],[4,-2],[17,-5],[3,-1]],[[4731,1222],[-13,-1],[-12,-3],[-11,-2],[-12,-1],[-11,-2],[-6,0],[-6,0],[-10,1],[-6,0],[-7,1],[-6,1],[-4,2],[-5,2]],[[4667,1303],[9,-44],[1,-2],[2,-1],[19,3],[2,4],[-7,38]],[[4741,1173],[-2,1],[-3,1],[-1,2],[1,5],[2,12],[-1,2],[-1,2],[-3,-1],[0,-7],[-11,-1],[-7,-1],[-12,-2],[-6,-2],[-9,0],[-16,2],[-14,6],[-18,-2],[-7,-3],[-2,0],[-5,-1],[-7,-6],[-7,-9],[-7,-7],[-7,-3],[-16,-4],[-4,-3],[-3,-8],[-7,-11],[-3,-9],[-5,-4],[-8,-5],[-6,-6],[-4,1],[-2,1],[-2,6],[0,14],[-1,6],[-3,6],[-5,8],[-4,7],[-10,9],[-12,8],[-10,4],[-4,2],[-7,1],[-6,-1],[-4,0],[-5,0],[-5,5],[-3,-3],[-4,-5],[-5,-7],[-7,-15],[-1,-1],[-2,-6],[-2,-1],[-9,-19],[12,-21],[44,-7],[0,-3],[-1,-3],[-38,5],[-1,0],[-6,2],[-13,24],[-11,14],[-9,18],[-9,13],[-6,10],[-9,12],[-7,6],[-4,12],[-3,6],[-3,1],[-10,2],[-16,8],[-27,9]],[[4312,1239],[-6,26]],[[4306,1265],[18,-14],[7,-4],[13,-9],[8,-6],[7,-5],[5,-3],[4,-2],[5,-1],[5,-1],[7,0],[21,5],[6,1],[9,0],[8,0],[7,-1],[5,0],[6,0],[7,0],[5,-1],[4,1],[7,1],[8,2],[4,1],[12,5],[18,8],[3,1],[4,1]],[[4296,1317],[19,1],[17,1],[-2,2],[0,2],[-6,22],[-3,18],[-4,19],[-4,18],[-4,18],[-3,16],[13,2],[6,0]],[[4325,1436],[30,-8],[46,-11]],[[4401,1417],[48,-12],[12,2],[2,0],[24,6],[2,1]],[[4401,1417],[0,6],[-1,6],[-1,5],[3,2],[5,2],[6,1],[5,-2],[7,-1],[8,1],[-4,28],[-5,32],[-2,1],[-1,0],[-1,0],[-3,-1],[-3,0],[-18,8],[1,5]],[[4397,1510],[2,8],[-2,23]],[[4325,1436],[2,8],[-13,63],[-1,6]],[[4313,1513],[84,-3]],[[4313,1513],[-4,4],[-3,2],[-2,7],[-3,18]],[[6550,5222],[6,-1]],[[6545,5191],[-1,-4],[-7,-22]],[[6537,5165],[-5,3],[-42,20],[-4,-12],[-4,-11],[-4,-11],[-4,-11]],[[6474,5143],[-61,30]],[[6413,5173],[4,11],[4,11]],[[6421,5195],[4,11],[4,11],[8,24],[9,25]],[[6446,5266],[61,-31],[9,-4],[16,-8],[18,-1]],[[6446,5266],[-52,25],[-10,4]],[[6384,5295],[8,23],[8,21],[8,23]],[[6408,5362],[9,-5],[13,-6],[19,-9],[20,-9],[42,-21]],[[6511,5312],[-8,-22],[20,-10],[21,-10]],[[6544,5270],[18,-9],[-7,-22],[-5,-17]],[[6511,5312],[19,57]],[[6530,5369],[10,-7],[9,-6]],[[6549,5356],[10,-8],[10,-5],[-4,-13],[-9,-22],[-5,-15],[-7,-23]],[[6549,5356],[14,41],[8,24],[1,4]],[[6572,5425],[44,-32]],[[4088,1402],[18,2],[19,2],[18,2],[9,2],[11,2]],[[4183,1310],[1,-6],[4,-17],[4,-24],[-9,0],[-4,0],[-3,1],[-7,4],[-25,18],[-3,1],[-3,1],[-3,1],[-3,0],[-10,-2],[-18,-4],[-7,-1],[-5,-2],[-6,30],[-3,0],[-12,6],[-12,8],[-3,4],[-6,31],[-2,6],[1,4],[3,8],[7,10],[5,6],[3,3],[1,4],[4,-1],[9,2],[7,1]],[[6794,5764],[-10,7],[-16,11],[-15,10]],[[6715,5946],[13,12]],[[6728,5958],[31,-47]],[[6759,5911],[18,-28],[38,-60]],[[6759,5911],[13,12],[15,12]],[[6728,5958],[3,15],[1,6],[0,6],[14,14],[15,12]],[[6761,6011],[41,-63]],[[6761,6011],[13,12],[14,12]],[[6788,6035],[14,12]],[[6761,6011],[-41,64]],[[6720,6075],[14,11],[13,12]],[[6747,6098],[41,-63]],[[6747,6098],[15,12],[13,12],[14,14]],[[6789,6136],[10,-17],[10,-14],[9,-15],[12,-19]],[[6747,6098],[-17,28],[13,12],[-5,8],[-13,-11],[-18,27]],[[6707,6162],[14,12],[13,11]],[[6734,6185],[15,13]],[[6749,6198],[40,-62]],[[6720,6075],[-14,-13]],[[6706,6062],[-41,63]],[[6665,6125],[15,13],[13,12],[14,12]],[[6665,6125],[-40,64]],[[6625,6189],[15,12],[13,12],[13,12]],[[6666,6225],[41,-63]],[[6666,6225],[14,12]],[[6680,6237],[14,12]],[[6694,6249],[40,-64]],[[6694,6249],[14,12]],[[6708,6261],[16,15],[-13,21],[24,21],[3,2]],[[6738,6320],[14,-21],[24,-38]],[[6776,6261],[16,-26]],[[6792,6235],[-2,-2],[-25,-21],[-16,-14]],[[6680,6237],[-54,86]],[[6626,6323],[9,18]],[[6635,6341],[9,20]],[[6644,6361],[36,-56],[28,-44]],[[6644,6361],[4,7],[9,17],[10,23],[5,9],[2,5]],[[6674,6422],[26,-42]],[[6700,6380],[38,-60]],[[6635,6341],[-3,5],[-40,61]],[[6635,6480],[1,-2],[2,-3],[2,-3],[3,-3],[2,-3],[2,-4],[2,-3],[2,-3],[2,-3],[2,-3],[2,-3],[2,-4],[1,-2],[4,-6],[5,-4],[3,-5],[2,-4]],[[6607,6285],[-3,5],[-44,67]],[[6626,6323],[-10,-19],[-9,-19]],[[6587,6247],[-9,-20]],[[6578,6227],[-3,5],[-35,54]],[[6607,6285],[-9,-18],[-11,-20]],[[6625,6189],[-34,52],[-4,6]],[[6635,6101],[-66,106]],[[6569,6207],[9,20]],[[6665,6125],[-14,-13],[-7,-4],[-9,-7]],[[6608,6078],[-13,-12]],[[6595,6066],[-43,68],[-5,7]],[[6547,6141],[7,22],[8,23],[7,21]],[[6635,6101],[-12,-11],[-15,-12]],[[6547,6141],[-3,5],[-40,60],[-3,2]],[[6532,6080],[-3,5],[-40,62]],[[6547,6141],[-7,-31],[-8,-30]],[[6436,6017],[3,3],[0,21],[3,8],[3,12],[5,15],[0,3],[-16,42],[-11,-5],[-6,-1],[-2,0],[0,3],[0,3],[4,2],[3,1],[0,3],[1,1],[5,2],[0,3],[-2,1],[-1,0],[8,2],[3,-5],[6,-19],[5,-7],[4,-5],[3,-3],[2,3],[5,20],[1,1],[5,8],[1,5],[1,13],[3,17]],[[6489,6147],[-3,-14],[-1,-8],[0,-5],[1,-5],[1,-5],[2,-11],[2,-12]],[[6532,6080],[-13,-53]],[[7070,3733],[37,-28]],[[7035,3759],[6,11],[13,26]],[[7054,3796],[34,-27],[13,23],[37,-27]],[[7054,3796],[13,22],[3,6],[7,6],[8,4],[27,-21],[13,23]],[[7125,3836],[37,-27]],[[6988,3793],[6,13],[4,10],[16,40],[18,34],[1,2]],[[7033,3892],[2,-1],[3,-1],[2,0],[7,-2],[17,-9],[14,-7],[9,-7],[3,-3],[3,-2],[32,-24]],[[6403,5730],[-8,-18]],[[6395,5712],[-10,8],[-9,6],[-11,7],[-10,7]],[[6431,5791],[-10,-23],[-9,-20],[-9,-18]],[[6595,6066],[-17,-15],[-17,-15],[-9,-8]],[[6608,6078],[45,-70]],[[6653,6008],[-13,-12],[-14,-17],[-14,-18]],[[6667,6020],[-14,-12]],[[6706,6062],[-15,-13],[-8,-6],[-6,-5],[4,-6],[-14,-12]],[[6667,6020],[48,-74]],[[6733,6691],[-3,3],[-34,53],[-3,3],[-1,-26],[-1,-9],[-3,-13],[-6,-16],[1,-3],[0,-2],[-4,-11],[-3,-11],[-2,-2],[9,-14],[19,-30]],[[6702,6613],[-5,-8],[-17,-25]],[[6680,6580],[-4,-5],[-6,-8],[-3,-6],[-1,-3],[-2,-3],[-5,-10],[-3,-7],[-7,-18],[-6,-18],[-8,-21],[0,-1]],[[6618,6498],[1,2],[2,5],[4,11],[8,30],[9,23],[7,16],[3,9],[0,13],[2,8],[0,2],[2,8],[1,16],[3,9],[7,20],[4,15],[2,5],[4,7],[2,6],[4,9],[2,9],[2,15],[2,8],[1,10],[1,7],[4,10],[1,7],[7,20],[4,8],[7,24],[1,4]],[[6715,6834],[4,-9],[2,-4],[29,-45]],[[6750,6776],[-4,-31],[-1,-8],[-2,-14],[-2,-12],[-2,-7],[-6,-13]],[[6680,6580],[36,-55],[2,-5],[2,-8]],[[6720,6512],[-2,-3],[-11,-21]],[[6707,6488],[-8,-16],[-8,-16],[-8,-16],[-9,-18]],[[6733,6538],[-13,-26]],[[6702,6613],[8,14]],[[6710,6627],[9,-6],[2,-3],[25,-37],[4,-5],[-6,-14],[-11,-24]],[[6836,6486],[37,-55]],[[6873,6431],[-15,-14],[-23,-18],[-29,-21]],[[6806,6378],[-11,18],[-10,15],[-16,25]],[[6769,6436],[-45,71],[-4,5]],[[6733,6538],[16,20],[6,8],[4,4]],[[6759,6570],[26,-40],[17,-26],[20,-30],[14,12]],[[6769,6436],[-14,-8],[-5,-5]],[[6750,6423],[-43,65]],[[6750,6423],[-13,-10],[-11,-11],[-12,-10],[-14,-12]],[[6806,6378],[-19,-15],[-23,-20],[-12,-10],[-14,-13]],[[6806,6378],[38,-58]],[[6844,6320],[-19,-16],[-12,-11],[-12,-10],[-12,-9],[-13,-13]],[[6804,6217],[-12,18]],[[6844,6320],[38,-58]],[[6882,6262],[-19,-17]],[[6863,6245],[-12,-11],[-12,-10],[-10,16],[-11,-11],[-14,-12]],[[6908,6285],[-26,-23]],[[6844,6320],[27,22],[24,19]],[[6895,6361],[35,-56]],[[6930,6305],[-22,-20]],[[6919,6203],[-18,-18]],[[6901,6185],[-38,60]],[[6908,6285],[27,-43],[10,-15],[-26,-24]],[[6925,6028],[18,34],[-19,28],[-9,15]],[[6915,6105],[12,11],[11,10],[20,17],[-39,60]],[[6930,6305],[15,14],[16,13]],[[6961,6332],[14,11],[14,14],[14,13]],[[6915,6105],[-10,16],[-19,29],[-9,15],[12,10],[12,10]],[[6873,6108],[-12,20],[-10,15],[-18,29]],[[6833,6172],[-9,14],[-10,15],[-10,16]],[[6789,6136],[17,13],[24,20],[3,3]],[[7603,3852],[-6,4],[-6,5],[-1,4],[-9,7],[-9,6],[-8,6],[-9,7]],[[7555,3891],[-90,65]],[[7465,3956],[6,12],[7,13]],[[7454,3935],[11,21]],[[7555,3891],[-11,-23]],[[7544,3868],[-90,67]],[[7513,3814],[-20,15],[-11,2],[-22,17]],[[7460,3848],[10,21],[10,18],[-38,27]],[[7442,3914],[12,21]],[[7544,3868],[-12,-19]],[[7532,3849],[-10,-18],[-9,-17]],[[7460,3848],[-38,27]],[[7377,3964],[65,-50]],[[7388,3983],[66,-48]],[[7388,3983],[11,22]],[[7399,4005],[66,-49]],[[7412,4029],[66,-48]],[[7424,4053],[6,-5],[48,-35],[13,-9]],[[7435,4072],[65,-50]],[[4312,1239],[-1,0],[-57,11],[-13,1],[-5,-6],[-13,-39],[-2,-7],[-1,-2],[-3,4],[-3,14],[-2,5],[-10,14],[-6,5],[-23,18],[-7,8],[-5,3],[-6,8],[-8,4],[-5,0],[-4,4],[-3,0],[-3,-2],[-3,-2],[-8,0],[-2,-1],[-7,-1],[-5,-2],[-5,-4],[-4,0],[-7,0],[-6,-2],[-5,-3],[-2,-3],[2,-7],[0,-2],[-3,-3],[-11,-5],[-10,-8],[-3,-5],[-7,1],[-8,-1],[-2,0],[-4,3],[0,6],[0,27],[-3,13],[-2,21],[-1,5],[-4,23],[-3,9],[-5,14],[-1,0],[-14,19],[-1,1],[-23,27],[-9,7],[-7,10],[-7,12],[-2,0]],[[3948,1440],[2,-3],[4,-4],[21,-20],[8,-7],[6,-7],[7,-9],[14,-15],[2,2],[2,3],[2,3],[1,2],[2,5],[2,6],[-1,3],[2,4],[3,5],[3,5],[4,4],[5,4],[2,2],[-1,5],[-3,10],[0,9],[2,11],[3,8],[4,5],[6,8],[1,1],[1,3]],[[4052,1483],[2,1],[17,6],[17,-88]],[[4052,1483],[-4,3],[-6,1],[-9,5],[-8,6],[-5,3],[-8,45],[1,4],[-2,2],[-18,1],[-6,2],[-10,0],[-24,1],[-7,-2],[-1,0],[-1,0],[-21,-4]],[[3923,1550],[-2,6],[-5,-1],[0,1],[3,4],[0,1],[1,2],[1,2]],[[3921,1565],[0,2],[0,3],[0,4],[0,2],[-1,3],[-1,3],[-1,2]],[[3948,1440],[-25,110]],[[3729,1529],[-4,21],[-26,1],[0,4],[0,4],[19,3],[2,0],[14,2],[7,1],[14,2],[16,1],[11,0],[10,1],[15,0],[11,0],[25,-1],[19,-1],[22,0],[21,-1],[16,-1]],[[3621,1569],[-26,106]],[[3595,1675],[17,7],[6,2],[35,32],[11,3],[19,6]],[[3683,1725],[14,6],[7,5]],[[3469,1599],[23,8],[8,2],[9,8],[18,16],[18,16],[18,16]],[[3563,1665],[5,2],[27,8]],[[3422,1793],[20,17]],[[3442,1810],[6,-24],[16,6],[21,18],[12,10],[3,1],[2,-1],[2,-1],[7,-29],[17,6],[3,3],[32,-134]],[[3627,1871],[19,-76],[19,6]],[[3665,1801],[18,-76]],[[3442,1810],[21,18],[32,27],[24,20],[24,20]],[[3543,1895],[15,-61],[37,13],[4,3],[9,14],[19,7]],[[3342,1727],[-17,28],[-17,29],[29,25],[-14,26],[-12,19]],[[3311,1854],[17,14],[10,-18],[3,0],[16,12],[46,38],[14,12],[1,4],[-11,18],[17,14]],[[3424,1948],[11,-18],[2,0],[16,13],[16,14],[17,14],[7,6],[10,9],[17,14],[17,13]],[[3537,2013],[16,-26],[37,-59]],[[3590,1928],[-26,-22],[-6,-3],[-9,-4],[-6,-4]],[[3627,1871],[-7,29],[0,3],[2,2],[5,1],[13,3],[9,4],[2,2],[3,3],[1,4],[5,1],[0,3],[0,5],[1,4],[3,4],[5,3],[10,2],[2,-7]],[[3681,1937],[23,-101]],[[3704,1836],[-18,-23],[-6,-6],[-15,-6]],[[3703,1998],[-22,-18],[-5,-2],[-16,-5],[-14,-4],[-10,-3],[-12,-5],[-2,-2],[-6,-5],[-6,-5],[-5,-6],[-4,-6],[-11,-9]],[[3537,2013],[-33,54],[-5,8]],[[3499,2075],[3,2],[14,12],[20,-33],[2,0],[14,12],[13,10],[1,2],[0,3],[-19,31],[16,13]],[[3499,2075],[-23,38]],[[3476,2113],[-8,15],[-6,14]],[[6656,4951],[63,-30]],[[6488,5030],[9,25],[21,60],[3,7],[16,43]],[[6961,6332],[-36,56]],[[6925,6388],[14,12],[15,13],[14,13]],[[6925,6388],[-37,56]],[[6888,6444],[15,13],[14,12],[15,13]],[[6932,6482],[36,-56]],[[6932,6482],[15,13],[17,14],[16,14],[9,9],[14,12]],[[7003,6544],[36,-56]],[[7033,3892],[1,3]],[[7034,3895],[1,1],[76,130]],[[7111,4026],[9,14]],[[7173,3925],[-12,-22],[-13,-23]],[[7148,3880],[-11,-22],[-12,-22]],[[7148,3880],[37,-27]],[[7185,3853],[-11,-21],[-12,-23]],[[7209,3897],[-12,-22],[-12,-22]],[[7209,3897],[57,-43]],[[7295,3910],[-17,-32],[-12,-24]],[[6932,6482],[-36,56]],[[6896,6538],[16,14],[16,14],[15,13]],[[6943,6579],[11,9],[6,7],[7,6]],[[6967,6601],[36,-57]],[[6967,6601],[14,12]],[[6981,6613],[15,13],[14,12],[14,13]],[[7024,6651],[37,-57]],[[7061,6594],[-15,-13],[-14,-12],[-14,-13],[-15,-12]],[[6943,6579],[-35,57]],[[6908,6636],[10,9],[13,12],[-7,11]],[[6924,6668],[17,9]],[[6941,6677],[40,-64]],[[6941,6677],[15,9],[17,9],[17,9]],[[6990,6704],[12,-18],[10,-16]],[[7012,6670],[12,-19]],[[6990,6704],[27,16],[21,11],[2,1]],[[7040,6732],[12,7]],[[7052,6739],[13,-22]],[[7065,6717],[-29,-26],[-24,-21]],[[7114,6640],[-28,-25],[-25,-21]],[[7065,6717],[13,-20]],[[7078,6697],[-14,-13],[20,-33],[3,-1],[13,12],[14,-22]],[[7162,6681],[-48,-41]],[[7078,6697],[20,15],[16,11],[18,-30],[4,-1],[12,11],[14,-22]],[[7180,6696],[-2,-2],[-5,-4],[-11,-9]],[[7052,6739],[44,25],[27,15],[3,1]],[[7126,6780],[7,-11],[14,-22],[33,-51]],[[7040,6732],[-1,4],[-9,20],[-2,4],[38,32]],[[7066,6792],[4,-6],[1,-1],[9,0],[2,1],[8,7],[15,13],[2,2]],[[7107,6808],[16,-24],[3,-4]],[[7066,6792],[-12,19]],[[7054,6811],[-11,18],[15,13],[-6,9]],[[7052,6851],[16,14],[2,2]],[[7070,6867],[37,-59]],[[7133,6876],[11,-18],[14,-21]],[[7158,6837],[16,-26],[2,-3]],[[7176,6808],[-23,-13],[-16,-9],[-11,-6]],[[7070,6867],[-16,25]],[[7054,6892],[15,13]],[[7069,6905],[12,-18],[12,-18],[11,-18],[29,25]],[[7069,6905],[-11,18],[28,25]],[[7086,6948],[9,-14],[3,-4]],[[7098,6930],[11,-18],[12,-18]],[[7121,6894],[12,-18]],[[7121,6894],[15,13],[13,11]],[[7149,6918],[41,-63]],[[7190,6855],[-16,-9],[-16,-9]],[[7098,6930],[15,12],[14,13]],[[7127,6955],[14,12],[23,-36],[-15,-13]],[[7220,6935],[11,-17]],[[7231,6918],[11,-17],[10,-15]],[[7252,6886],[-44,-22],[-18,-9]],[[7127,6955],[-37,56]],[[7090,7011],[14,13],[25,20]],[[7129,7044],[55,-86],[22,-34],[14,11]],[[7129,7044],[13,11]],[[7142,7055],[12,-18],[11,-17]],[[7165,7020],[10,-16],[11,-17]],[[7186,6987],[11,-17]],[[7197,6970],[12,-18]],[[7209,6952],[11,-17]],[[7247,7038],[-61,-51]],[[7165,7020],[34,30],[13,12]],[[7212,7062],[12,11],[12,-18],[11,-17]],[[7247,7038],[22,20],[2,2]],[[7271,7060],[11,-17]],[[7282,7043],[-2,-2],[-83,-71]],[[7287,6993],[-9,16],[-1,0],[-1,1],[-1,0],[-1,-1],[-65,-57]],[[7282,7043],[22,-34]],[[7304,7009],[-2,-3],[-15,-13]],[[7254,6938],[-23,-20]],[[7287,6993],[-14,-11],[-15,-13],[-15,-13],[11,-18]],[[7278,6900],[-2,3],[-11,17],[-11,18]],[[7287,6993],[41,-62],[-1,-4],[-15,-7],[-17,-9],[-17,-11]],[[7304,7009],[47,-72]],[[7351,6937],[13,-21],[3,-4]],[[7367,6912],[-4,-1],[-4,-2],[-29,-16],[-37,-20],[-2,4],[-12,21],[-1,2]],[[7304,7009],[16,13],[46,-72],[-15,-13]],[[7749,3826],[-13,-26]],[[7736,3800],[-12,9],[-19,14],[-22,15],[-9,8]],[[7688,3870],[9,-7],[41,-29],[11,-8]],[[7726,3783],[-8,7],[-17,12],[-8,-1],[-31,22]],[[7700,3892],[9,-7],[41,-29],[11,-9]],[[7761,3847],[-12,-21]],[[7713,3916],[9,-7],[41,-30],[10,-8]],[[7773,3871],[-10,-18],[-2,-6]],[[7735,3956],[19,-15],[31,-23],[9,-7]],[[7794,3911],[-1,-3],[-8,-15],[-12,-22]],[[7804,3927],[-10,-16]],[[7754,3989],[49,-37]],[[7803,3952],[-9,-17],[10,-8]],[[7773,4024],[30,-23],[19,-15],[-9,-17],[-5,-8],[-5,-9]],[[7805,4083],[22,-17]],[[7864,4039],[-6,-12],[-5,-8],[-8,-16]],[[7845,4003],[-8,-15],[-5,-9],[-3,-6],[-7,-11],[-2,-4]],[[7820,3958],[-7,-14],[-1,-2],[-4,-7],[-4,-8]],[[7989,7819],[7,9],[8,7],[-25,39]],[[7979,7874],[12,16],[13,18],[-12,20],[-2,2]],[[7990,7930],[34,44]],[[8024,7974],[2,-3],[13,-19],[-5,-8],[9,-15],[0,-5],[-2,-5],[-8,-8],[-1,-2],[1,-4],[20,-29]],[[8053,7876],[-18,-15],[7,-11],[-16,-14],[22,-35],[0,-2],[0,-1],[-11,-15],[-13,-15],[-9,14],[-20,-24],[-2,-1],[-2,2],[-9,14],[0,2],[1,3],[19,24],[-6,10],[-7,7]],[[8024,7974],[33,41],[2,3]],[[8059,8018],[2,-3],[9,-14],[4,-6],[5,-8],[10,-19],[9,-19],[2,-3]],[[8100,7946],[-3,-3],[2,-3],[9,-15],[-18,-15],[-16,-15],[-21,-19]],[[7990,7930],[-13,20],[-24,38]],[[7953,7988],[-20,32]],[[7933,8020],[15,12],[12,11],[13,11],[14,12],[23,20],[3,3]],[[8013,8089],[2,-3],[10,-16],[8,-12],[12,-19],[9,-14],[5,-7]],[[7990,7930],[-73,-91]],[[7870,7913],[19,16],[11,15],[6,5],[17,13],[14,13],[16,13]],[[7816,7998],[20,16],[24,22],[9,11],[12,17],[13,18]],[[7894,8082],[39,-62]],[[7803,8020],[17,15],[17,15],[7,7],[7,7],[5,7],[11,15]],[[7867,8086],[12,18]],[[7879,8104],[15,-22]],[[7879,8104],[22,31],[10,14],[12,17],[17,24],[2,3],[2,3]],[[7944,8196],[19,-29],[3,-6],[11,-17],[10,-15],[4,-7],[13,-20],[9,-13]],[[7879,8104],[-2,4],[-3,5],[-13,20]],[[7861,8133],[11,10],[4,5],[5,6],[1,4],[-10,15],[-2,3],[-1,2],[-11,17],[5,3],[11,10],[13,12],[-47,75]],[[7840,8295],[22,27]],[[7862,8322],[11,-18],[3,-4],[10,-16],[3,-4],[11,-16],[2,-5],[11,-17],[8,-9],[19,-30],[2,-4],[2,-3]],[[7861,8133],[-29,45],[-12,20],[-1,1],[-16,26],[-14,20]],[[7789,8245],[24,24],[14,11],[13,15]],[[7867,8086],[-3,3],[-8,12],[-14,-12],[-15,-12],[-14,22],[-11,18],[-13,21]],[[7789,8138],[5,8],[7,7],[15,12],[-22,34],[-20,31]],[[7774,8230],[15,15]],[[7719,8067],[-12,19],[-18,28],[14,14],[-14,20],[9,10],[11,10],[25,19],[7,7],[5,5],[15,16],[13,15]],[[7789,8138],[-11,-15],[-6,-9],[-7,-8],[-15,-12],[-15,-13],[-16,-14]],[[1401,355],[2,-11],[4,-16],[-6,-3],[-5,-3],[-5,-2],[-8,-4],[-15,-7],[-6,-2],[-9,-4],[-11,-7],[-4,-3],[-7,-4],[-4,-2],[-8,-5],[-10,-5],[-6,-4],[-7,-6],[-4,-2],[-6,-5],[-4,-4],[-6,-3],[-10,-5],[-13,-7],[-2,-2],[-35,-25],[-2,2],[1,10],[-2,22],[-2,34]],[[1211,282],[-7,103],[-3,32],[36,4],[9,2],[3,1],[3,2],[2,1],[2,3],[4,8],[3,7],[3,3],[9,5]],[[1376,513],[6,-34],[1,-20],[1,-10],[1,-7],[1,-8],[2,-7],[3,-12],[7,3],[3,2],[-2,-18],[-2,-16],[0,-6],[3,-18],[1,-7]],[[7664,7713],[-3,-3],[-17,-14]],[[7644,7696],[-35,54],[-8,13],[-2,2],[-2,-1],[-26,-23],[-13,-11],[-1,-4],[0,-3],[7,-11],[-16,-14]],[[7548,7698],[-22,34],[21,18],[1,2],[2,1],[18,16],[2,3],[-1,3],[-18,29],[-3,4],[-16,-14]],[[7577,7652],[-29,46]],[[7644,7696],[-15,-14]],[[7629,7682],[-13,-11],[-6,-3],[-14,-7],[-19,-9]],[[7560,7638],[13,11],[4,3]],[[7629,7682],[12,-18],[13,-22],[10,-14],[1,-4],[-2,-2],[-26,-25]],[[7637,7597],[-16,-14],[-16,-14],[-45,69]],[[7650,7576],[-13,21]],[[7664,7713],[35,-54]],[[7699,7659],[-4,-3],[-16,-14],[12,-19],[-22,-26],[-19,-21]],[[7765,7647],[-32,-41]],[[7733,7606],[-34,53]],[[7679,7533],[-2,2],[-14,22],[-13,19]],[[7733,7606],[1,-3]],[[7734,7603],[-2,-3],[-16,-20],[-9,-11]],[[7707,7569],[-26,-33],[-2,-3]],[[7713,8005],[-20,31],[0,6],[4,5],[22,20]],[[7540,8005],[7,8],[2,2],[11,13],[10,10],[22,24],[2,2],[2,3],[4,5],[13,13],[1,10],[5,8],[11,4],[5,0],[6,6],[2,5],[8,9],[15,21],[3,3],[2,6],[7,9],[9,1],[15,20],[19,27],[3,2],[2,2],[4,5],[4,9],[5,3],[6,3],[21,22],[7,8],[28,24],[15,11],[8,7],[10,8],[4,4],[6,7],[4,6]],[[6790,4231],[-7,-19],[-6,-17]],[[6777,4195],[-8,4],[-44,22],[-9,4]],[[6716,4225],[6,17]],[[6722,4242],[6,16],[27,-12],[8,-1],[19,-10],[8,-4]],[[6777,4195],[-5,-15]],[[6772,4180],[-53,25],[-8,5]],[[6711,4210],[5,15]],[[6766,4164],[-7,3],[-45,22],[-9,4]],[[6705,4193],[6,17]],[[6772,4180],[-6,-16]],[[6711,4210],[-62,29]],[[6649,4239],[5,15]],[[6654,4254],[7,17]],[[6661,4271],[61,-29]],[[6649,4239],[-58,28],[5,16]],[[6596,4283],[58,-29]],[[6594,4303],[58,-28],[9,-4]],[[6596,4283],[-8,4],[4,12],[2,4]],[[6666,4288],[-5,-17]],[[6594,4303],[-9,5],[-3,1],[-5,3],[-2,-3],[-2,-6],[-2,-6],[-1,-3],[-1,-5],[1,-4],[1,-5],[6,-18],[0,-4]],[[6577,4258],[-2,-3],[-2,-5],[-4,-1],[-4,-1],[-4,-3],[-5,-1],[-4,-2],[-1,0],[-1,0],[-3,0],[-3,1],[-1,1]],[[6592,4365],[2,-1],[3,-1]],[[6597,4363],[-3,-8]],[[6594,4355],[-2,-3],[-3,-5],[-7,-18],[6,-3],[78,-38]],[[6649,4239],[-6,-16]],[[6643,4223],[-56,26],[-4,3],[-4,3],[-2,3]],[[6705,4193],[-14,7],[-48,23]],[[6766,4164],[10,-5],[53,-26]],[[6829,4133],[62,-30]],[[6891,4103],[-1,-4],[-43,21],[-1,-4]],[[6846,4116],[-20,10],[-20,9]],[[6806,4135],[-19,9],[-20,10],[-20,9]],[[6747,4163],[-20,10],[-19,10],[-20,9],[-18,-50],[-7,-23],[-14,-39]],[[6649,4080],[-19,9],[-19,9],[-18,9],[-19,8],[-40,20]],[[6626,4014],[5,17],[17,46],[1,3]],[[6747,4163],[-17,-50],[-5,-13],[-17,-48],[-1,-3],[-18,-51],[-5,-13]],[[6684,3985],[-7,2],[-15,4],[-10,4],[-10,6],[-5,2],[-2,2],[-3,3],[-4,3],[-1,2],[-1,1]],[[6744,3958],[-11,5],[-8,5],[-3,2],[-13,10],[-2,2],[-1,2],[-22,1]],[[6806,4135],[-16,-46],[-15,-40],[-9,-25],[-1,-3],[-17,-51],[-4,-12]],[[8952,8419],[-76,-62],[-71,-58],[-6,-5],[-3,-1],[-10,-8],[-17,-14],[-32,-26],[-17,-15],[-15,-12],[-54,-36],[-25,-19],[-11,-9]],[[8615,8154],[-28,-23],[-9,-8],[-8,-9],[-11,-11],[-6,-7],[-7,-6],[-69,-57],[-3,-2],[-3,-3],[-18,-17],[-8,-7],[-2,-2]],[[8443,8002],[-1,2],[-1,1],[-8,13],[-34,54],[-31,51],[-18,27]],[[8350,8150],[-26,40],[-6,10],[-23,37],[-3,4]],[[8292,8241],[2,1],[4,3],[6,2],[4,2],[2,2],[15,12],[18,16],[13,11]],[[8356,8290],[14,17],[18,16],[21,16],[22,14]],[[8431,8353],[23,11],[8,6],[10,6],[35,23],[51,26],[22,15],[-7,14],[-2,5],[-3,5],[-6,9],[-1,1],[-4,7],[-5,5],[-8,7],[-3,2],[-8,4],[-10,5],[-2,1],[-1,0],[-8,3],[-12,4],[-2,1],[-11,4],[-6,2]],[[8481,8519],[-12,6],[-9,8],[-9,12],[-6,10],[-5,13]],[[8440,8568],[19,10],[18,10],[15,9],[15,8],[1,2],[0,3],[-24,57],[-1,1],[-3,0],[-14,-8],[-34,-19],[-18,-11]],[[8414,8630],[-12,29]],[[8402,8659],[3,3],[29,40],[20,26],[11,15],[3,3]],[[8468,8746],[20,-18],[-11,-16],[0,-2],[1,-2],[8,-7],[11,-15],[4,-5],[4,-9]],[[8505,8672],[22,-54],[16,-39],[2,-4],[4,-7],[6,-6]],[[8555,8562],[-12,-15],[-9,-12],[16,-13],[11,-2],[24,-2],[1,-9],[22,-53],[35,29],[41,38],[2,2]],[[8686,8525],[69,70],[7,7],[1,4],[5,7],[27,27]],[[8795,8640],[16,16],[20,20],[2,2]],[[8833,8678],[2,-3],[13,-29],[32,-70],[0,-4],[67,-144],[3,-6],[2,-3]],[[8431,8353],[0,5],[-2,6],[-40,93],[-36,88]],[[8353,8545],[20,11]],[[8373,8556],[37,-87],[19,11],[-7,18],[-1,3],[2,2],[19,11],[4,1],[2,-1],[7,-6],[5,-11],[16,10],[2,2],[3,10]],[[8373,8556],[20,11],[-11,27],[-1,2],[2,3],[13,15],[11,12],[7,4]],[[8414,8630],[26,-62]],[[8353,8545],[-6,13],[-8,20],[-3,7]],[[8336,8585],[-2,3],[-12,28],[-1,5],[1,3],[1,4],[2,4],[13,8],[-5,12],[-3,5],[-11,24],[-4,8]],[[8315,8689],[29,24],[26,25],[17,18],[21,21],[11,-26],[7,-15],[-15,-20],[-20,-28],[0,-1],[10,-24],[1,-4]],[[8094,8578],[17,5],[10,1],[25,3],[10,0],[20,7],[11,2],[1,1],[6,3],[7,7],[8,10],[3,1],[8,5],[10,3],[19,16],[1,4],[5,3],[4,6],[3,3],[5,3],[6,3],[5,3],[6,8],[8,12],[5,1],[8,6]],[[8305,8694],[4,5],[6,-10]],[[8336,8585],[-3,-2],[-7,-6],[-75,-65],[-13,-10]],[[7915,5295],[-11,6],[-53,27],[-2,1],[-10,5]],[[7839,5334],[12,23],[2,3]],[[7853,5360],[76,-39]],[[2762,2202],[-32,16]],[[2489,2977],[-10,27],[-10,32]],[[2469,3036],[9,14],[12,20],[7,16],[4,7]],[[2501,3093],[11,22],[8,15],[3,5],[3,5],[13,19],[3,4],[5,8],[4,8]],[[2501,3093],[-2,4],[-14,36],[-21,59],[-28,54]],[[2436,3246],[25,12],[8,5],[5,5],[5,9],[3,0],[2,-1],[13,-26],[12,17],[12,-26],[27,20]],[[2436,3246],[-25,51],[-1,4],[2,35],[1,23],[3,64],[0,23],[3,8]],[[2469,3036],[-3,-3],[-17,45]],[[2449,3078],[1,3],[6,11],[3,10],[2,10],[-2,10],[-1,1],[-1,5],[-3,6],[-2,3],[-1,7],[-2,4],[-4,8],[-3,4],[-2,2],[-4,4],[-1,3],[-1,0],[-1,11],[-2,16],[0,5],[-2,0],[-1,3],[-1,9],[0,3],[-3,4],[-4,4],[-3,5],[-6,7],[-3,0],[-2,1],[-14,-1],[-12,-2],[-7,-2],[-2,-2],[-4,0],[-5,0],[-7,9],[-4,9],[0,3],[-4,6],[-4,12],[-1,10],[1,9],[2,2],[6,7],[7,11],[2,3],[3,3],[1,0],[-2,7],[0,6],[0,8],[0,2],[8,13],[3,9],[5,11],[6,14],[0,8],[-1,12],[-2,12],[-1,8],[4,6],[6,4],[2,5],[2,5],[6,16],[6,19],[1,10],[1,7],[8,5],[13,7]],[[2385,3434],[-2,-1],[-1,1],[-1,3],[0,2],[0,3],[-4,5],[-3,2],[-7,8],[0,3],[-5,6],[-3,6],[-1,6],[3,2],[12,11],[16,13],[8,5],[5,3],[3,1],[3,-1],[1,-2],[0,-3],[-1,-3],[-2,-5],[-1,-6],[-1,-8],[1,-3],[-2,-8],[-2,-2],[-3,-7],[-3,-7],[-2,-7],[0,-3],[-5,-12],[-3,-2]],[[6896,6538],[-37,56]],[[6859,6594],[16,14],[16,13],[17,15]],[[6859,6594],[-18,27]],[[6841,6621],[19,11],[19,10],[18,10]],[[6897,6652],[11,7],[16,9]],[[6888,6444],[-15,-13]],[[6836,6486],[16,14]],[[6852,6500],[15,13],[14,13],[15,12]],[[6925,6388],[-16,-14],[-14,-13]],[[6842,6934],[-29,47],[-15,24],[-3,-9],[-4,-15]],[[6791,6981],[-10,9]],[[6781,6990],[28,110],[36,85],[1,13],[7,11]],[[6853,7209],[8,-17]],[[6861,7192],[-3,-5],[-5,-9],[-22,-52],[-1,-5],[-3,-7],[-1,-4],[7,-4],[19,-29],[11,-18]],[[6863,7059],[-6,-5],[-4,-16],[-7,-24],[-9,-33],[16,-25],[-5,-16],[-6,-6]],[[6863,7059],[17,-26],[5,0],[16,-21],[3,-3]],[[6904,7009],[-20,-57]],[[6884,6952],[-1,-2],[-17,-51]],[[6866,6899],[-3,3],[-5,9],[-16,23]],[[6960,7041],[-3,-3],[-15,-13],[-21,33],[-17,-49]],[[6861,7192],[7,-12],[12,-20],[39,-59],[9,-14],[2,-3]],[[6930,7084],[5,-6],[25,-37]],[[6983,7161],[-14,-29],[-11,16],[-3,4],[-15,-40],[-10,-28]],[[6861,7192],[18,32],[3,6],[4,6],[15,24],[1,2],[2,3],[17,21]],[[6921,7286],[6,-10],[2,-2],[7,-5],[27,-42],[-10,-20],[13,-20],[2,-4]],[[6968,7183],[15,-22]],[[6921,7286],[7,9],[8,11],[3,4],[3,3],[3,3],[6,6],[10,7]],[[6961,7329],[11,-17],[7,-2],[4,-7],[15,-24],[13,-20],[2,-3]],[[7013,7256],[-2,-3],[-7,-9],[-9,-14],[-13,-22],[-14,-25]],[[6961,7329],[10,8],[11,8],[4,3],[5,5],[4,3],[9,11],[11,12],[13,18]],[[7028,7397],[23,-35],[-36,-32],[23,-37],[2,-3]],[[7040,7290],[-13,-15],[-12,-15],[-2,-4]],[[7028,7397],[14,16],[2,3]],[[7062,7388],[28,-45],[2,-3]],[[7092,7340],[-2,-2],[-18,-15],[-10,-9],[-10,-11],[-12,-13]],[[7028,7233],[-15,23]],[[7092,7340],[14,-22]],[[7106,7318],[-2,-2],[-21,-18],[-15,-15],[-17,-21],[-23,-29]],[[7039,7215],[-11,18]],[[7106,7318],[12,-18]],[[7118,7300],[-2,-2],[-23,-19]],[[7093,7279],[-15,-16]],[[7078,7263],[-13,-15]],[[7065,7248],[-11,-14],[-15,-19]],[[7184,7234],[-15,-13]],[[7169,7221],[-12,17]],[[7157,7238],[-39,62]],[[7106,7318],[16,14],[62,-98]],[[7267,7329],[-58,-61],[-25,-34]],[[6853,7209],[6,10],[38,53],[5,10],[7,9],[4,6],[9,13],[22,28],[23,24],[4,6],[12,13],[17,24],[13,14],[18,24],[14,13],[5,6],[25,33],[20,29],[14,27]],[[7109,7551],[2,-5],[17,-27]],[[7350,7713],[-11,18],[-14,-13],[-6,-7],[-2,-2],[-7,-9],[-13,-18],[-8,-8],[-13,-12],[-15,-14],[-9,-8]],[[7252,7640],[-14,-13],[-1,0],[-3,-3],[-5,-4],[-4,-3],[-8,-7],[-14,-9],[-9,-9],[-30,-33]],[[7164,7559],[-32,-36],[-4,-4]],[[7109,7551],[1,3],[8,11],[1,4],[0,5],[3,4],[6,5],[4,3],[2,4],[6,12],[3,3],[17,7],[5,3],[10,-2],[14,3],[35,24],[3,3],[7,4],[3,6],[4,3],[11,8],[10,8],[8,7],[10,4],[6,7],[11,12],[8,13],[0,5],[-5,7],[0,3],[2,3],[3,0],[7,-6],[13,11],[3,7],[3,4],[9,11],[18,18],[16,20],[5,4],[6,4],[5,5]],[[7300,7735],[-4,-4],[-4,2],[-7,-9],[-4,-3],[-4,-1],[-18,-4],[-8,-1],[-5,1],[-3,3],[-2,3],[-2,7],[-1,7],[1,5],[12,16],[12,15],[8,9],[30,22],[5,3],[11,4],[2,2],[7,3],[22,8],[3,-1],[2,-4],[-1,-4],[-7,-12],[-10,-13],[-10,-11],[-11,-17],[-6,-6],[-5,-5],[-3,-5],[-1,-4],[1,-6]],[[7204,7708],[-2,0],[-3,3],[-4,14],[1,12],[-6,5],[-1,11],[11,23],[9,8],[18,9],[25,30],[14,13],[10,5],[3,-3],[1,-8],[-3,-10],[-6,-8],[-16,-21],[-9,-10],[-6,-8],[-6,-6],[-5,-7],[0,-6],[-6,-16],[-4,-11],[-2,-11],[-9,-8],[-4,0]],[[7526,5104],[-47,35]],[[7479,5139],[4,8],[1,1],[3,7],[3,5],[2,3],[4,7]],[[7532,5214],[24,-18]],[[7556,5196],[-2,-3],[-9,-18],[-4,-15],[1,-9],[-6,-24],[-6,-13],[-4,-10]],[[7479,5139],[-47,32]],[[7432,5171],[-11,8]],[[7446,5078],[-8,5],[-30,23],[-8,5],[10,19],[11,20],[11,21]],[[7479,5139],[-12,-22],[-11,-20],[-10,-19]],[[7446,5078],[-11,-22]],[[7435,5056],[-9,6],[-29,22],[-8,6]],[[7461,4983],[-10,7],[-28,21],[-9,6],[11,20],[-9,6],[-29,21],[-9,7]],[[7435,5056],[8,-6],[30,-21],[9,-7]],[[7482,5022],[-11,-20],[-10,-19]],[[7432,4928],[-9,7],[-31,22],[-8,6],[-8,7],[-29,21],[-8,6]],[[7461,4983],[-11,-20],[-9,-17],[-9,-18]],[[7432,4928],[-10,-17]],[[7422,4911],[-8,6],[-31,23],[-8,6],[-9,6],[-13,9]],[[7743,7476],[-36,56],[13,17],[-13,20]],[[7734,7603],[26,-40],[10,-14],[15,-20],[2,-2]],[[7787,7527],[-3,-3],[-2,-3],[-13,-14],[-13,-16],[-13,-15]],[[7658,7506],[2,3],[17,21],[2,3]],[[7743,7476],[-12,-15],[-13,-15],[-13,-15],[-20,33],[-15,23],[-12,19]],[[7743,7476],[14,-22],[-14,-12],[13,-21],[-12,-15],[-13,-16],[-13,-17],[-17,-16],[-26,42],[-16,-13],[-24,36],[-24,36]],[[7611,7458],[16,13],[7,8],[2,2],[2,2],[10,11],[8,10],[2,2]],[[7493,7356],[25,22],[27,22]],[[7545,7400],[30,27],[36,31]],[[7787,7527],[2,-2],[41,-49],[2,-2],[12,-15],[24,-29],[23,-28],[1,-1],[1,-2]],[[7893,7399],[-3,-3],[-50,-58],[-51,-57],[-31,-36],[-38,-43],[-39,-44],[-36,-40]],[[7493,7356],[-2,2],[-36,57]],[[7455,7415],[7,6],[18,14],[16,12]],[[7496,7447],[16,15],[5,-9],[4,-13],[4,-9],[18,-28],[2,-3]],[[7489,7566],[52,-81],[43,36]],[[7584,7521],[3,-6],[4,-9],[1,-9],[0,-4],[1,-5],[3,-5],[13,-22],[2,-3]],[[7496,7447],[-55,85]],[[7441,7532],[17,15]],[[7458,7547],[8,7],[7,4],[8,4],[5,2],[2,1],[1,1]],[[7489,7566],[6,6],[7,14],[5,7],[20,17]],[[7527,7610],[13,-21],[31,-48],[13,-20]],[[7527,7610],[17,14],[16,14]],[[7455,7415],[-50,78]],[[7405,7493],[-50,77]],[[7355,7570],[6,6],[8,9],[21,-34],[23,19],[2,1],[2,-1],[10,-16],[3,-4],[11,-18]],[[7377,7469],[16,13],[12,11]],[[7164,7559],[14,-23],[18,-29],[3,-3],[11,-18],[11,-19],[2,-4]],[[7204,4330],[-10,-18],[-8,6],[-44,32],[-7,6]],[[7135,4356],[10,18],[6,10],[5,9],[1,1],[1,2]],[[7158,4396],[4,-4],[4,-6],[6,-4],[13,-10],[13,-9],[10,-8],[7,-5]],[[7215,4350],[-5,-10],[-6,-10]],[[7204,4330],[7,-6],[1,-1],[7,-5],[-5,-11],[-5,-10],[25,-18],[9,-6]],[[7243,4273],[-10,-18],[-5,-9],[-3,-5]],[[7225,4241],[-91,23]],[[7134,4264],[-2,1],[-39,11]],[[7093,4276],[11,21],[1,4],[10,18],[10,19],[10,18]],[[7091,4486],[9,-4],[9,-5],[9,-4],[10,-5],[8,-4],[8,-4],[2,-2]],[[7146,4458],[-1,-3],[-8,-15],[9,-8],[22,-16],[7,-5]],[[7175,4411],[-9,-8],[-8,-5],[0,-2]],[[7093,4276],[-2,0],[-68,18]],[[7069,4228],[-38,18],[-6,-19]],[[7025,4227],[-67,33],[-10,4]],[[7093,4276],[-7,-11],[-10,-22],[-1,-3],[0,-2],[-3,-2],[-3,-8]],[[7062,4209],[-7,-20]],[[7055,4189],[-30,15],[-8,3]],[[7017,4207],[8,20]],[[7069,4228],[-5,-13],[1,-2],[-1,-3],[-2,-1]],[[7049,4170],[-7,-18]],[[7042,4152],[-16,7],[-8,4],[-5,2],[-9,5]],[[7004,4170],[6,18]],[[7010,4188],[7,19]],[[7055,4189],[-6,-19]],[[7029,4115],[-6,-17]],[[7023,4098],[-10,4],[-19,9],[-9,5]],[[6985,4116],[7,18]],[[6992,4134],[6,18]],[[6998,4152],[6,18]],[[7042,4152],[-6,-19]],[[7036,4133],[-7,-18]],[[7112,4117],[-9,-16]],[[7103,4101],[-9,4],[-50,24],[-8,4]],[[7042,4152],[8,-4],[52,-26],[2,0],[8,-5]],[[7103,4101],[-10,-17]],[[7093,4084],[-9,5],[-47,22],[-8,4]],[[7093,4084],[-9,-16]],[[7084,4068],[-9,4],[-44,22],[-8,4]],[[7084,4068],[-8,-16],[-51,24],[-8,4]],[[7017,4080],[6,18]],[[7111,4026],[-30,17],[-13,-24],[-9,4],[-12,6],[-5,2],[-11,5],[-18,8],[-3,2],[-4,2]],[[7006,4048],[5,17],[6,15]],[[7112,4117],[39,-18]],[[7006,4048],[-8,4],[-31,15]],[[6967,4067],[6,16],[6,15]],[[6979,4098],[6,18]],[[9369,8355],[0,8],[-4,16],[1,11],[7,31],[4,18],[2,4],[5,11],[2,10],[4,21]],[[9390,8485],[66,-17]],[[9438,8382],[-18,4],[-1,-18],[3,-20],[-6,-3],[-3,-1],[-5,1],[-39,10]],[[9308,8311],[7,34],[5,27],[6,28],[5,24],[5,21],[6,30],[4,21]],[[9346,8496],[44,-11]],[[9369,8355],[-6,-27]],[[9363,8328],[-5,-30]],[[9358,8298],[-21,6],[-6,1],[-23,6]],[[9346,8496],[7,31],[8,39]],[[9361,8566],[19,-5],[11,-2],[8,0],[1,-11],[0,-11],[-6,-31],[18,-4],[5,24],[2,12],[0,19],[0,4],[4,1],[31,-8],[18,-5]],[[9361,8566],[7,35],[8,41],[6,25]],[[9382,8667],[27,-7],[-5,-22],[82,-22]],[[9382,8667],[6,27],[1,8],[3,9]],[[7853,5360],[11,20],[9,18]],[[7883,5417],[8,-4],[3,-2],[38,-20],[16,-8],[11,-5]],[[7959,5378],[-11,-19]],[[7948,5359],[-9,-17],[-10,-21]],[[7968,5397],[-9,-19]],[[7902,5454],[9,-4],[2,-1],[55,-28],[2,-1],[8,-5]],[[7912,5473],[9,-4],[2,-1],[25,-13],[30,-15],[2,-2],[8,-4]],[[7922,5492],[9,-5],[2,-1],[54,-28],[3,-2],[2,-1],[6,-3]],[[7932,5511],[9,-5],[2,-1],[54,-28],[2,-1],[9,-5]],[[7942,5529],[8,-4],[9,-4],[10,18],[9,18],[2,4],[42,-22],[14,-7],[2,-3]],[[7982,5606],[17,-9],[50,-25],[9,-5]],[[8001,5642],[9,-5],[1,0],[65,-34]],[[8001,5642],[11,21],[3,6],[8,14]],[[8023,5683],[11,-6],[57,-29],[8,-4]],[[8023,5683],[10,20],[10,20],[11,20],[13,26]],[[8142,5727],[-12,-23],[-10,-20]],[[8120,5684],[-11,-20],[-10,-20]],[[8120,5684],[8,-4],[1,-1],[57,-29],[9,-5]],[[8195,5645],[-11,-19],[-10,-20]],[[8142,5727],[8,-4],[66,-37]],[[8216,5686],[-11,-21],[-10,-20]],[[8166,5772],[73,-42]],[[8239,5730],[-12,-22],[-11,-22]],[[8239,5730],[28,-16],[3,-2]],[[8270,5712],[-1,-6],[-2,-10],[-1,-8],[0,-3],[-1,-9],[-1,-3],[-1,-2],[-1,-7],[-1,-4],[-1,-2],[-1,-2],[-2,-6],[-1,-2],[-1,-2],[-3,-5],[-10,-20],[-4,-8],[-7,-11],[-6,-12],[-4,-8],[-8,-14],[-4,-7]],[[8166,5772],[7,19],[8,19]],[[8181,5810],[17,-9],[18,-11]],[[8216,5790],[39,-22],[27,-15],[2,-2]],[[8216,5790],[7,19],[3,5],[7,18],[2,5],[8,18],[2,5],[2,6],[-19,10],[-2,-3],[1,-3],[-5,-12],[-19,12]],[[8181,5810],[20,54],[2,6]],[[2386,3567],[-7,-7],[-9,-11],[-10,-9],[-8,-9],[-9,-13],[-2,-7],[-4,-8],[-3,-12],[-3,-10],[0,-11],[0,-23],[-1,-13],[2,-19],[0,-9],[-1,-8],[-2,-4],[-4,-12],[-8,-11],[-36,-14],[-9,-5],[-9,-9],[-5,-6],[-2,-7],[0,-12],[0,-9],[0,-3],[2,-4],[1,-29],[2,-11],[0,-15],[2,-19],[2,-7],[4,-8],[3,-4],[10,-12],[12,-7],[3,-7],[2,-6],[1,-3],[4,-3],[1,-3],[1,-7],[0,-20],[-3,-13],[-2,-3],[-5,-16],[-2,-4],[-3,-3],[-4,-1],[-10,-6],[-3,-3],[-2,-3],[-11,-15],[-3,-10],[-1,-9],[-4,-14],[-6,-5],[-5,-3],[-1,-2],[0,-4],[0,-9],[1,-18],[1,-3],[4,-6],[6,-3],[1,-1],[0,-2],[-1,-5],[-3,-5],[-1,-5],[-2,-4],[-4,-12],[-2,-5],[-1,-1],[-5,-4],[-7,-4],[-6,-5],[-4,0],[-8,1],[-5,-3],[-6,-9],[-10,-11],[-3,-6],[-5,-3],[-2,-7],[-2,-10],[-4,-6],[-6,-3],[-2,-2],[-5,-6],[-1,-3],[-3,-5],[0,-4],[-3,-4],[-2,-1]],[[2259,3137],[3,6],[2,5],[1,3],[1,8],[2,9],[1,2],[0,5],[1,5],[0,4],[1,6],[-1,2],[0,2],[-2,6],[-1,3],[0,2],[-1,2],[-1,2],[-2,3],[-8,12],[-4,8],[-2,4],[-1,4],[0,7],[1,3],[0,3],[1,3],[2,9],[1,7],[0,2],[1,3],[-1,3],[0,5],[0,6],[-1,8],[0,5],[-1,16]],[[2164,3320],[7,6],[1,0],[13,-19],[5,6],[4,5],[4,6],[2,2],[2,3],[1,2],[6,8],[6,10]],[[7883,4323],[-8,-15]],[[7875,4308],[-3,2],[-8,6],[-1,1],[-26,20]],[[7837,4337],[-79,61],[8,14]],[[7766,4412],[71,-53],[8,-7]],[[7682,4356],[4,6],[55,78]],[[7741,4440],[1,-1],[0,-1],[2,-2],[1,-7],[21,-17]],[[7837,4337],[-5,-9],[-5,-9],[-10,-18],[-14,-26]],[[7875,4308],[-11,-18],[-10,-19],[-14,-24]],[[7869,4225],[-10,7],[-11,8],[-8,7]],[[7872,4148],[-7,6],[-31,23],[-8,6],[-7,6],[-9,6]],[[7863,4133],[-7,5],[-32,24],[-7,5],[-7,6],[-8,6]],[[7850,4108],[-47,35],[-2,-3],[-13,11],[-2,1]],[[7447,4255],[-10,7],[-44,34],[-9,6]],[[7384,4302],[9,17]],[[7393,4319],[8,14]],[[7401,4333],[63,-47]],[[7464,4286],[-9,-14],[-8,-17]],[[7447,4255],[-10,-17],[-9,7],[-44,34],[-9,7]],[[7375,4286],[9,16]],[[7305,4338],[9,17]],[[7314,4355],[10,-7],[20,-15],[31,-24],[9,-7]],[[7375,4286],[-10,7],[-51,38],[-9,7]],[[7314,4355],[9,17]],[[7323,4372],[10,-7],[6,-5],[45,-34],[9,-7]],[[7323,4372],[9,14]],[[7332,4386],[7,13]],[[7339,4399],[50,-38],[19,-15]],[[7408,4346],[-7,-13]],[[7353,4424],[69,-53]],[[7422,4371],[-7,-13],[-7,-12]],[[7339,4399],[6,11],[8,14]],[[7353,4424],[-69,52]],[[7284,4476],[7,14],[7,11]],[[7298,4501],[68,-52]],[[7366,4449],[46,-34],[6,-5],[18,-14]],[[7436,4396],[-6,-11],[-8,-14]],[[7366,4449],[7,11],[6,11]],[[7379,4471],[6,12],[7,11]],[[7392,4494],[69,-52]],[[7461,4442],[-6,-11],[-6,-12],[-7,-12],[-6,-11]],[[7298,4501],[6,11],[6,11]],[[7310,4523],[69,-52]],[[7310,4523],[-37,27],[-18,14],[-2,2],[-1,1],[-1,2]],[[7251,4569],[1,4],[2,8],[5,12]],[[7259,4593],[64,-47]],[[7323,4546],[69,-52]],[[7323,4546],[7,11],[9,18],[7,12],[7,14]],[[7353,4601],[69,-52]],[[7422,4549],[-7,-13],[-7,-12],[-9,-18],[-7,-12]],[[9197,7781],[97,-26],[62,-16],[52,-15]],[[9408,7724],[52,-14]],[[9460,7710],[61,-17]],[[9019,7016],[-207,59],[-36,11]],[[8776,7086],[18,116],[4,22],[-218,166],[-2,2],[-17,11],[-3,3]],[[8558,7406],[-3,2],[-4,2],[-28,22],[-2,1],[-351,274]],[[8170,7707],[44,47],[3,4],[3,2]],[[8220,7760],[2,3],[18,20],[11,12],[38,41],[6,7],[30,32],[43,47],[5,5],[39,43],[21,23],[8,8],[2,1]],[[8615,8154],[3,-3],[3,-1],[10,8],[37,-30],[39,-29],[129,-99],[20,-14],[5,-4],[3,-2],[4,-3],[23,-18],[46,-34],[19,-13],[91,-68],[54,-41],[62,-17],[7,-2],[24,-2],[3,-1]],[[8776,7086],[-14,-61],[-68,22],[-4,-7],[-51,20],[-33,-49]],[[8606,7011],[-22,16],[-4,3],[-9,7]],[[8571,7037],[12,22],[1,11],[1,26],[4,7],[-12,9],[-5,3],[-3,2],[-5,3],[-6,4],[-4,20],[-35,23]],[[8379,7068],[1,2],[18,33],[10,19],[16,32],[9,16],[27,50],[22,43],[9,17],[11,19],[5,11],[4,7],[4,8],[40,75],[0,1],[1,0],[0,1],[2,4]],[[8571,7037],[-17,12],[-8,-15]],[[8606,7011],[-8,-14],[-7,-14]],[[8977,6880],[-2,1],[-41,16]],[[9430,7831],[-4,-22],[-5,-21],[-5,-24],[-5,-27],[-3,-13]],[[9197,7781],[14,62],[8,43],[5,23],[2,8],[2,13],[5,22]],[[9233,7952],[31,-8],[66,-18]],[[9330,7926],[-5,-21],[-4,-22],[-5,-22],[61,-16],[53,-14]],[[9430,7831],[53,-14]],[[9483,7817],[-5,-22]],[[9478,7795],[-4,-22],[-5,-24],[-6,-26],[-3,-13]],[[9430,7831],[5,22],[1,6],[3,15],[4,22],[5,22],[53,-14]],[[9501,7904],[-5,-22],[-4,-22],[-5,-21],[-4,-22]],[[9539,7779],[-61,16]],[[9501,7904],[2,10],[8,24],[2,3]],[[9330,7926],[4,22],[8,36],[0,3]],[[9342,7987],[51,-14]],[[9393,7973],[43,-11],[44,-12],[33,-9]],[[9393,7973],[4,21],[4,20]],[[9401,8014],[4,21],[4,23],[5,21]],[[9268,8006],[4,20],[4,20],[41,-11],[43,-10],[41,-11]],[[9342,7987],[-45,12],[-20,5],[-9,2]],[[6454,4165],[-1,-3],[-4,-11],[-1,-3],[-1,-2],[0,-1],[-1,-6],[0,-6],[3,-8],[12,-29],[2,-9],[2,-8],[1,-15],[-2,-20],[-5,-19],[-3,-13],[-3,-8],[-4,-13],[-8,-16],[-9,-24],[-2,-6],[-12,-32],[2,-1],[-1,-2],[-4,-11],[-1,-3],[-8,-20],[0,-2],[-20,-46],[-4,-10],[-5,-11],[-15,7],[-36,16],[-12,5],[-33,16],[-1,-4],[-12,-34],[2,-2],[23,-11],[1,-1],[0,-1],[0,-1],[-7,-18],[-1,-1],[-2,-1],[-2,1],[-19,9],[-4,0],[-9,-26]],[[6250,3761],[-23,-65],[-24,-69]],[[6203,3627],[-26,-75]],[[6153,3913],[0,7],[0,10]],[[6087,3914],[12,30]],[[6764,4366],[-2,-12]],[[6762,4354],[-9,4],[-24,12],[-30,9],[-6,-16],[-4,-11],[-3,-9]],[[6686,4343],[-6,-18]],[[6680,4325],[-78,35],[-5,3]],[[6680,4325],[-7,-18]],[[6673,4307],[-81,36],[-1,3],[3,9]],[[6673,4307],[-7,-19]],[[6748,4315],[-7,-18]],[[6741,4297],[-8,4],[-29,13],[-24,11]],[[6686,4343],[24,-11],[28,-13],[10,-4]],[[6755,4335],[-7,-20]],[[6762,4354],[-7,-19]],[[6718,3553],[33,50],[12,34]],[[6763,3637],[21,-11],[-10,-24],[24,-11],[-13,-24],[-11,-20],[-10,-20],[10,-9],[4,-3],[6,-4]],[[9346,8496],[-3,1],[-19,5],[3,18],[0,2],[-2,2],[-9,2],[7,32],[-1,3],[-2,1],[-15,4],[-18,5],[-6,-36],[-18,5],[-18,5],[7,35],[-18,4],[3,14],[-6,2],[-4,2],[-2,3],[-1,3],[0,4]],[[9224,8612],[27,34],[20,22],[6,5],[18,18],[-14,4],[19,16],[-2,3],[4,21]],[[9224,8612],[-7,-10],[-18,-21],[-20,-14],[-10,-6],[-9,-4],[-5,-2],[-6,-3],[-6,-3],[5,20],[3,17]],[[9151,8586],[1,13],[1,26],[1,21],[-2,30],[-2,14],[-6,42],[-3,26]],[[9141,8758],[7,-4],[6,-4],[7,-4],[1,1],[2,0],[2,0],[66,-18],[5,24],[65,-18]],[[9141,8758],[1,1],[0,2],[0,2],[0,3],[0,4],[-1,14],[0,5],[-1,9],[-1,17],[0,6],[-1,15],[-4,40],[-2,13],[0,9],[-1,9],[-1,16],[0,6],[6,3],[0,6],[1,9],[0,4]],[[7575,4830],[-48,37],[-3,-6],[-14,10],[-7,5]],[[7503,4876],[9,18]],[[7512,4894],[7,-6],[12,-9],[4,10],[1,4],[4,0],[5,2],[2,5],[1,4],[3,8],[48,-36]],[[7599,4876],[-6,-12],[-6,-11],[-6,-11],[-6,-12]],[[7575,4830],[-6,-12],[-7,-12]],[[7562,4806],[-46,36],[-15,11],[-7,5]],[[7494,4858],[9,18]],[[7553,4786],[-69,53]],[[7484,4839],[5,10],[5,9]],[[7562,4806],[-4,-10],[-5,-10]],[[7521,4729],[-54,40],[-5,4],[-11,8]],[[7451,4781],[6,11],[6,9],[5,9],[5,10]],[[7473,4820],[6,9],[5,10]],[[7553,4786],[-5,-10],[-6,-10]],[[7542,4766],[-5,-9],[-5,-9],[-5,-9],[-6,-10]],[[7498,4689],[-17,13],[-8,8],[-34,25],[-10,7]],[[7429,4742],[11,19]],[[7440,4761],[6,10],[5,10]],[[7521,4729],[-7,-11],[-5,-10],[-5,-10],[-6,-9]],[[7475,4645],[-10,7],[-51,37],[-9,7]],[[7405,4696],[14,26]],[[7419,4722],[10,20]],[[7498,4689],[-5,-10],[-5,-10]],[[7488,4669],[-7,-13],[-6,-11]],[[7461,4621],[-9,7],[-51,37],[-9,7]],[[7392,4672],[13,24]],[[7475,4645],[-14,-24]],[[7461,4621],[-13,-23]],[[7448,4598],[-9,6],[-51,37],[-9,7]],[[7379,4648],[13,24]],[[7448,4598],[-6,-13],[-6,-10]],[[7436,4575],[-63,46],[-6,5]],[[7367,4626],[6,10],[6,12]],[[7353,4601],[8,13],[6,12]],[[7436,4575],[-6,-12],[-8,-14]],[[7491,4498],[-69,51]],[[7436,4575],[60,-44],[9,-7]],[[7505,4524],[-6,-12],[-8,-14]],[[7491,4498],[-7,-13],[-7,-12],[-5,-11],[-4,-7],[-2,-3],[-5,-10]],[[7518,4547],[-6,-12],[-7,-11]],[[7448,4598],[11,-8],[50,-37],[9,-6]],[[7531,4571],[-13,-24]],[[7461,4621],[11,-7],[23,-17],[14,-10],[13,-10],[9,-6]],[[7475,4645],[10,-7],[50,-37],[9,-7]],[[7544,4594],[-13,-23]],[[7488,4669],[9,-8],[50,-38],[9,-7]],[[7556,4616],[-12,-22]],[[7498,4689],[69,-53]],[[7567,4636],[34,-27],[-5,-9],[-5,-10],[-23,17],[-12,9]],[[7521,4729],[68,-54]],[[7589,4675],[-6,-10],[-5,-10]],[[7578,4655],[-6,-10],[-5,-9]],[[7542,4766],[69,-53]],[[7611,4713],[-6,-9],[-5,-9]],[[7600,4695],[-5,-9],[-6,-11]],[[7553,4786],[68,-53]],[[7621,4733],[-5,-10],[-5,-10]],[[7562,4806],[69,-52]],[[7575,4830],[68,-53]],[[7599,4876],[68,-53]],[[7599,4876],[5,11],[6,12]],[[7610,4899],[6,11],[6,12]],[[7622,4922],[34,-27],[35,-27]],[[7259,4593],[4,13],[4,14],[2,6]],[[7269,4626],[3,7],[4,8],[2,5],[4,7]],[[7282,4653],[71,-52]],[[7282,4653],[8,13],[6,12]],[[7296,4678],[71,-52]],[[7296,4678],[6,10],[6,12]],[[7308,4700],[10,-8],[51,-37],[10,-7]],[[7308,4700],[13,24]],[[7321,4724],[10,-7],[51,-38],[10,-7]],[[7321,4724],[13,24]],[[7334,4748],[10,-7],[51,-38],[10,-7]],[[7334,4748],[9,16],[6,10]],[[7349,4774],[9,-7],[52,-38],[9,-7]],[[7349,4774],[10,20]],[[7359,4794],[61,-45],[9,-7]],[[7359,4794],[6,9],[5,11]],[[7370,4814],[7,-6],[63,-47]],[[7370,4814],[5,9],[6,11]],[[7381,4834],[70,-53]],[[7381,4834],[6,10],[5,10]],[[7392,4854],[5,9],[5,10]],[[7402,4873],[71,-53]],[[7402,4873],[6,10],[6,10]],[[7414,4893],[70,-54]],[[7414,4893],[4,9],[4,9]],[[7432,4928],[7,-5],[16,-12],[18,-13],[21,-16],[9,-6]],[[7461,4983],[8,-6],[53,-39],[9,-7]],[[7531,4931],[-10,-20],[-9,-17]],[[7541,4951],[-10,-20]],[[7482,5022],[8,-6],[30,-22],[16,-7],[17,-12]],[[7553,4975],[-12,-24]],[[7565,4997],[-6,-11],[-6,-11]],[[7446,5078],[8,-6],[31,-23],[8,-6],[10,20]],[[7503,5063],[8,-6],[18,-13],[-1,-3],[-4,-7],[-2,-4],[43,-33]],[[7503,5063],[11,19],[6,11],[6,11]],[[7526,5104],[39,-29],[12,-8],[18,-13]],[[7595,5054],[-6,-11],[-6,-12],[-6,-11]],[[7577,5020],[-6,-12],[-6,-11]],[[7636,4427],[6,11],[5,8]],[[7647,4446],[13,24]],[[7660,4470],[9,18],[2,6],[2,0],[9,-7],[29,-22],[30,-25]],[[7696,4593],[11,-9],[20,-15],[3,-1],[30,-23]],[[7760,4545],[33,-25]],[[7793,4520],[4,-3]],[[7797,4517],[-2,-2],[-19,-25]],[[7776,4490],[-11,-15],[-24,-35]],[[7660,4470],[-13,9],[-45,35],[-8,6]],[[7594,4520],[13,23]],[[7607,4543],[42,65],[-34,25],[-14,5],[-23,17]],[[7589,4675],[33,-25],[4,-3],[31,-24],[39,-30]],[[7696,4593],[4,8],[4,7]],[[7704,4608],[5,11],[6,12]],[[7715,4631],[36,-28],[8,-7],[7,-3]],[[7766,4593],[1,-22],[-2,-9],[-3,-13],[-2,-4]],[[7814,4558],[-8,6],[-27,21],[-7,5],[-6,3]],[[7715,4631],[4,7],[2,4],[1,1],[4,8]],[[7726,4651],[24,-17],[8,-7],[4,-3]],[[7762,4624],[1,-4],[6,-4],[8,-6],[38,-29],[8,-7],[-9,-16]],[[7793,4520],[2,3],[10,19],[9,16]],[[7762,4624],[-3,29],[20,-16],[12,-7],[2,-2]],[[7793,4628],[27,-20],[15,-12],[20,-15]],[[7855,4581],[-3,-2],[-19,-16],[-11,-11]],[[7822,4552],[-4,-5],[-21,-30]],[[7804,4647],[-6,-9],[-5,-10]],[[1616,411],[-3,-1],[-36,-16],[-25,-12],[-8,-4],[-33,-14],[-12,-6],[-12,-4],[-28,-10],[-6,27],[-25,-7],[-27,-9]],[[848,76],[6,21]],[[908,104],[10,4],[6,2],[3,1],[8,1],[4,-1],[19,-5],[0,4],[1,11],[1,20],[1,7],[-1,7],[0,6],[1,3],[2,2],[3,8],[1,19],[9,2],[7,2],[10,3],[10,4],[49,35],[29,21],[4,2],[5,0],[8,-1],[12,0]],[[1110,261],[5,-1],[4,0],[4,0],[9,2],[43,13],[10,2],[26,5]],[[1618,401],[-3,-2],[-4,-7],[-5,-9],[-9,-13],[-11,-22],[-9,-1],[-24,-23],[-8,-4],[-6,-4],[-1,-2],[-2,-5],[-8,-4],[-9,-2],[-15,1],[-3,1],[-16,4],[-31,0],[-21,2],[-8,1],[-4,2],[-13,0],[-6,-3],[-2,0],[-18,-8],[-1,3],[-11,-8],[-17,-5],[-4,-4],[-11,-7],[-7,-6],[-3,-1],[-9,-6],[-4,2],[-23,-14],[-15,-14],[-2,-4],[-8,-4],[-10,-9],[-13,-5],[-4,0],[-3,-5],[-2,-2],[-5,-7],[-2,-6],[-5,-6],[-4,-5],[-6,-2],[-13,-8],[-7,-2],[0,-13],[-1,0],[-1,13],[-2,0],[-4,4],[-6,2],[-11,1],[-6,-1],[-12,-8],[-5,-8],[-5,-14],[-3,-7],[-6,-13],[-2,-4],[-1,-11],[1,-32],[-8,-14],[-6,-6],[-2,-2],[0,-3],[-2,-4],[-4,-7],[-5,-3],[-2,0],[-2,2],[-7,5],[-9,3],[-5,-2],[-3,-3],[-1,-21],[-1,-3],[-2,-1],[-3,2],[-1,4],[5,0],[0,31],[-12,2],[-3,-31],[5,-1],[0,-4],[-10,1],[-1,1],[-1,2],[0,7],[-1,0],[-4,6],[-12,0],[-7,-1],[-3,6],[-2,3],[-3,0],[-5,-1],[-15,-5],[-4,-3],[-5,-10],[-2,-2],[-5,-2],[-11,0],[-1,2],[-1,13],[-3,2],[-3,-6],[-3,-2],[-6,0],[-13,1],[-9,3],[-4,3],[-4,4],[-3,5],[-9,6],[-4,13],[-1,4],[-3,3],[-8,0],[-3,-1],[-23,-1],[-10,-1],[-7,-2],[-3,-2],[-1,-1]],[[6421,5195],[-62,30]],[[6359,5225],[4,11],[4,11]],[[6367,5247],[4,11],[4,13],[9,24]],[[6397,5128],[-61,30]],[[6336,5158],[4,11],[3,11]],[[6343,5180],[5,12],[4,11],[3,11],[4,11]],[[6413,5173],[-4,-11],[-4,-11],[-4,-12],[-4,-11]],[[6319,5112],[4,12],[5,11],[4,12],[4,11]],[[6397,5128],[-4,-11],[-4,-11],[-4,-12],[-5,-13]],[[6258,5141],[4,13],[4,11],[4,11],[4,12]],[[6274,5188],[4,11],[4,11]],[[6282,5210],[61,-30]],[[6474,5143],[-4,-11],[-4,-11],[-4,-11],[-4,-12],[-4,-11],[-4,-11],[-4,-12],[-4,-12]],[[7053,6499],[15,13],[14,12],[14,13],[13,19],[-19,29],[14,13],[9,7],[14,13],[-13,22]],[[7180,6696],[19,-30]],[[7199,6666],[30,-46],[2,-3]],[[7511,6675],[-2,-1],[-21,-19],[-2,-2],[-14,-13],[65,-49]],[[7231,6617],[33,65],[3,6],[60,120],[13,26],[23,35],[25,33],[16,20],[28,-36],[14,13],[-5,21],[13,15]],[[6770,5704],[-4,3],[-33,22],[-8,6]],[[6725,5735],[10,21]],[[6797,5762],[-1,-2],[-8,-18],[-8,-17],[-10,-21]],[[6851,5547],[-58,43]],[[6820,5639],[6,11],[6,11],[6,11],[5,9],[5,9],[4,8],[3,7],[9,-6],[1,3]],[[6714,5593],[-5,3]],[[6709,5596],[11,21],[11,21],[-32,23],[-9,6]],[[6690,5667],[11,22],[12,24],[12,22]],[[6709,5596],[-32,23],[-9,6],[-8,6],[-42,28],[-8,6]],[[6610,5665],[10,20]],[[6620,5685],[9,-6],[41,-28],[8,-6],[12,22]],[[6620,5685],[11,23],[-50,34],[-8,6]],[[6573,5748],[11,22]],[[6584,5770],[12,23]],[[6610,5665],[-9,6],[-41,29],[-9,6]],[[6551,5706],[11,20],[11,22]],[[6590,5626],[-59,41]],[[6531,5667],[10,19],[10,20]],[[6610,5665],[-10,-20],[-10,-19]],[[6662,5490],[-4,4],[-42,28]],[[6616,5522],[9,18],[13,25],[1,3],[9,18],[-58,40]],[[7178,4851],[-30,22]],[[7148,4873],[-57,42]],[[7148,4873],[-9,-17],[-12,-22],[30,-23]],[[4805,3933],[-5,6],[-47,49]],[[4753,3988],[7,8],[-13,14],[-11,11],[-1,1],[0,1],[-1,1],[1,1],[5,7],[-13,14],[28,37],[6,-6],[7,-8],[4,-3]],[[4772,4066],[9,-11],[16,-16],[4,-2],[14,-15],[15,-15],[15,-15],[6,-7]],[[4851,3985],[-2,-3],[-44,-49]],[[4546,3539],[-4,6],[20,11],[11,8],[8,6],[3,6],[-2,-1],[-1,0],[-1,0],[-3,3],[-43,47],[17,19],[16,-18],[16,-16],[26,15],[1,1],[-1,2],[-39,41],[4,5],[0,2],[-1,2],[-13,13]],[[4560,3691],[13,20],[16,24],[9,15],[2,4],[7,14],[6,13],[3,8],[10,23],[7,15],[13,18],[12,17],[13,18],[14,18],[14,18],[8,10],[10,13],[11,11],[7,9],[18,29]],[[4805,3933],[133,-148],[2,-3],[4,-4],[2,-1]],[[4946,3777],[-89,-54],[-10,-5]],[[6846,4116],[-16,-46],[1,0],[12,-1],[11,-2],[10,-3],[3,-2],[8,-5],[7,-6],[4,-4],[3,-2],[6,-3],[-25,-68],[0,-3],[-6,-5],[-3,-4],[-3,-5],[-4,-9],[-1,-8],[0,-7],[-1,-8],[-2,-9],[-3,-8]],[[6847,3908],[-20,10],[-24,11]],[[6803,3929],[-20,9],[-20,10],[-19,10]],[[6891,4103],[76,-36]],[[6967,4067],[-1,-4],[-18,8],[-1,-4],[-18,-49],[-21,-62]],[[6908,3956],[-1,-3],[-13,-35],[0,-3],[0,-3],[1,-3],[2,-8],[-26,-12]],[[6871,3889],[-4,10],[-3,2],[-17,7]],[[6878,3872],[-5,12],[-2,5]],[[6908,3956],[18,-9],[18,-9],[14,-6],[4,-2],[2,-1]],[[6964,3929],[-1,-3],[0,-2],[-4,-10],[-3,-5],[-23,-64],[-19,9],[-18,9],[-18,9]],[[6903,3730],[-7,4],[-3,1],[-18,8],[-19,9],[-19,8]],[[6837,3760],[15,39],[26,73]],[[6964,3929],[33,-17],[36,-17],[1,0]],[[6837,3760],[-9,4],[-11,-27],[-3,-4]],[[6814,3733],[-6,3],[-20,10],[-2,2],[19,54],[-5,2],[-7,12],[-9,25],[-1,4]],[[6783,3845],[-5,13],[25,71]],[[6699,3803],[-6,13],[25,71],[26,71]],[[6783,3845],[-28,-14],[-28,-14],[-28,-14]],[[6814,3733],[-4,-13],[-16,7]],[[6794,3727],[-39,19],[-80,38]],[[6675,3784],[2,6],[1,4],[2,0],[1,0],[2,1],[16,8]],[[6675,3784],[-13,6]],[[6662,3790],[2,7],[1,3],[-5,3],[-6,3],[-1,0],[-2,0],[-8,22],[11,7],[3,2],[1,4],[22,64],[-20,10]],[[6660,3915],[24,70]],[[6662,3790],[-12,6]],[[6650,3796],[-65,31]],[[6585,3827],[1,5],[-20,9],[-19,9],[29,81]],[[6576,3931],[18,-9],[11,6],[3,1],[11,5],[20,-9],[21,-10]],[[6577,3711],[-4,9],[0,2],[0,3],[0,3],[9,27]],[[6582,3755],[19,55],[-19,9]],[[6582,3819],[3,8]],[[6650,3796],[1,-4],[-4,-14],[-3,-1],[-4,-2],[-2,-3],[-1,-2],[-9,-22],[-1,-3],[-4,-4],[-5,-4],[-9,-6],[-25,-15],[-4,-3],[-3,-2]],[[6630,3633],[-20,11],[-20,8],[-18,9]],[[6572,3661],[13,34],[-6,14],[-2,2]],[[6675,3784],[-3,-11],[-4,-18],[-7,-21],[-2,-9],[1,-27],[2,-19],[-4,0],[-14,-2],[0,-4],[-14,-40]],[[6650,3615],[-2,7],[-2,3],[-2,2],[-14,6]],[[6794,3727],[-3,-8],[-4,-14],[-24,-68]],[[6551,3599],[21,62]],[[8469,5496],[75,-40],[14,4],[4,0],[9,-4],[7,-4],[16,-8],[9,-6],[17,-11],[82,-46],[2,-1]],[[8704,5380],[-7,-23],[-4,-15],[-2,-4],[-2,-8],[-8,-24],[-7,-24]],[[8674,5282],[-3,2],[-14,8],[-6,3],[-14,8],[-32,17],[-3,-3],[-1,-8],[-14,-36]],[[8587,5273],[-9,-24],[-9,-24]],[[8569,5225],[-10,-26],[-10,-23]],[[8549,5176],[-31,-80]],[[8518,5096],[-10,-23],[-9,-23]],[[8499,5050],[-8,-21],[-3,-4]],[[8488,5025],[-6,4],[-50,27]],[[8435,5412],[6,14],[6,15],[2,5],[6,16],[14,34]],[[8334,5073],[-67,36],[-9,5]],[[8258,5114],[8,19],[1,6],[1,3]],[[8344,5102],[-1,-4],[-9,-25]],[[8313,5019],[-76,40]],[[8237,5059],[4,10],[4,10],[7,19]],[[8252,5098],[6,16]],[[8334,5073],[-6,-15]],[[8328,5058],[-8,-19],[-3,-10],[-4,-10]],[[8313,5019],[-4,-10],[-5,-13]],[[8304,4996],[-9,7],[-3,2],[-8,4],[-5,3],[-41,21],[-9,5]],[[8229,5038],[4,11],[4,10]],[[1110,261],[2,35],[2,34],[-43,5],[-32,3],[4,34],[-13,29]],[[848,76],[-2,-3],[-5,-3],[-5,-1],[-6,1],[-8,5],[-14,0],[-7,-2],[-19,-9],[-5,-5],[-5,-4],[-11,-4],[-6,-11],[-7,-7],[-4,-3],[-12,-3],[-11,-1],[-6,-2],[-26,-5],[-22,-7],[-5,-3]],[[662,9],[-5,19]],[[657,28],[-10,68],[-1,8],[-1,3],[4,-1],[-3,14],[-2,1],[-3,16],[-10,73]],[[631,210],[0,3],[-3,2],[-2,1],[-5,2],[-7,4],[-8,4]],[[606,226],[-2,2],[-13,118],[-23,37],[-36,103]],[[1019,1295],[22,13],[-2,11],[37,25],[-4,14],[132,53],[6,8],[195,119],[30,-60]],[[606,226],[-36,-15],[-36,-15],[-32,-16]],[[570,85],[-2,-2],[-15,-2],[-23,-4],[-1,21],[-13,-2],[-7,50],[0,3],[-1,8],[-1,3],[-1,4]],[[631,210],[-4,-1],[-4,-2],[-2,0],[-2,-1],[-2,-1],[-1,-1],[-31,-14],[4,-36],[1,-5],[2,-20],[2,-20],[2,-20],[-26,-4]],[[657,28],[-5,-3],[-15,-6],[-3,0],[-10,-1],[-5,0],[-8,1],[-15,1],[-17,-1],[-3,0],[-6,66]],[[662,9],[-4,-2],[-5,-1],[-4,-2],[-33,1],[-17,-1],[-1,6],[-1,0],[-1,-1],[-1,-5],[-14,-2],[-2,0],[0,2],[-1,2],[-1,-3],[-3,-3],[-4,1],[-2,0],[0,4],[-2,2],[-37,10],[-11,7],[-13,1],[-71,41],[-3,-7],[62,-37],[0,-3],[0,-2],[-7,4],[-45,26],[0,1],[-12,7],[-3,1],[-3,2]],[[1560,1505],[-9,19],[-9,44],[124,49],[25,17],[11,7],[10,4],[6,1]],[[3029,1685],[-25,40],[-28,46],[-17,-14],[-17,-14],[-15,-12],[-1,-2],[0,-2],[27,-44],[-9,-7],[-3,-2],[-2,-1],[-4,0],[-4,2]],[[2845,1617],[-8,-6]],[[2837,1611],[-43,71],[-33,59],[-15,25],[-26,42],[-2,3]],[[3084,1896],[5,-22],[10,-40]],[[3099,1834],[19,-75]],[[3118,1759],[-1,-1],[-2,-1],[-3,-3],[-53,-43],[-16,-14]],[[3127,1864],[-4,-4],[-1,-1],[-2,-3],[-2,-6],[-2,-3],[-2,-2],[-15,-11]],[[3249,2028],[10,-19],[1,-7],[-1,-39],[1,-4],[11,-20],[-20,-18]],[[3251,1921],[-39,-31],[-33,-28],[-12,19],[-7,11],[-17,-15],[-11,-9],[-5,-4]],[[7402,4873],[-69,50]],[[7392,4854],[-70,51]],[[7381,4834],[-69,51]],[[7370,4814],[-69,50]],[[8304,4996],[-13,-20]],[[8291,4976],[-10,8],[-7,6],[-5,2],[-4,2],[-35,19],[-9,4]],[[8221,5017],[8,21]],[[8233,4878],[-44,22],[-1,0],[-2,-1],[0,-1],[-1,-1],[-7,-18],[-1,-3]],[[8177,4876],[-15,6],[-4,3]],[[8158,4885],[8,20],[6,18],[4,11],[4,7],[5,11],[6,9],[11,17],[4,7],[5,11]],[[8211,4996],[5,10],[5,11]],[[8291,4976],[-12,-20]],[[8279,4956],[-13,-21]],[[8266,4935],[-12,-20],[-13,-20]],[[8241,4895],[-4,-7],[-4,-10]],[[8211,4996],[-2,1],[-10,6],[-48,24],[-9,5]],[[8142,5032],[8,22]],[[8150,5054],[8,22]],[[8158,5076],[9,-5],[52,-28],[8,-3],[2,-2]],[[8158,5076],[6,11],[5,8]],[[8169,5095],[66,-35],[2,-1]],[[8169,5095],[5,10],[5,9],[5,8],[6,9]],[[8190,5131],[60,-31],[2,-2]],[[8190,5131],[5,9],[3,6],[3,5],[3,6],[1,2],[4,10],[1,4]],[[8058,5280],[-2,1],[-7,4],[-25,13],[-10,5],[10,18]],[[8024,5321],[10,18],[9,19]],[[7948,5359],[8,-4],[3,-1],[54,-28],[3,-1],[8,-4]],[[8174,4331],[12,20],[14,24]],[[8200,4375],[9,-6],[30,-24],[9,-6]],[[8200,4375],[9,17]],[[8209,4392],[67,-52]],[[8209,4392],[10,17]],[[8219,4409],[60,-49]],[[8219,4409],[10,18],[12,19],[11,20]],[[8252,4466],[8,-6],[22,-15],[2,-2],[11,-8]],[[8219,4409],[-8,6],[-9,8],[-30,23],[-9,7]],[[8163,4453],[21,35],[-8,7],[-19,13],[-10,8],[-9,7]],[[8138,4523],[9,16]],[[8147,4539],[38,-27],[9,-6],[8,-6],[20,-14],[20,-14],[10,-6]],[[8209,4392],[-7,6],[-20,15],[-20,16],[-9,6]],[[8153,4435],[10,18]],[[8200,4375],[-16,12],[-8,-14],[-31,25],[-9,7]],[[8136,4405],[8,14]],[[8144,4419],[9,16]],[[8174,4331],[-56,44]],[[8118,4375],[6,10],[6,10],[6,10]],[[8062,4390],[11,20]],[[8073,4410],[9,-7],[36,-28]],[[8073,4410],[11,20]],[[8084,4430],[6,10]],[[8090,4440],[8,-7],[1,0],[28,-21],[8,14],[1,-2],[8,-5]],[[8090,4440],[5,9]],[[8095,4449],[3,5],[8,14]],[[8106,4468],[2,3]],[[8108,4471],[8,-6],[30,-24],[7,-6]],[[8108,4471],[10,17],[10,18],[10,17]],[[8106,4468],[-9,7],[-51,40],[-9,6]],[[8037,4521],[-18,15],[-9,7]],[[8010,4543],[11,19],[28,46]],[[8049,4608],[71,-50],[27,-19]],[[8095,4449],[-69,53]],[[8026,4502],[6,10],[5,9]],[[8084,4430],[-8,7],[-23,17],[-10,8],[-19,15],[-8,6]],[[8016,4483],[4,9],[1,1],[5,9]],[[8073,4410],[-69,54]],[[8004,4464],[6,10],[6,9]],[[8062,4390],[-9,7],[-40,31],[-20,16],[-9,-16]],[[7984,4428],[-9,6],[-12,9],[-8,7]],[[7955,4450],[9,16],[11,20]],[[7975,4486],[29,-22]],[[8052,4374],[-8,6],[-53,42],[-7,6]],[[8030,4336],[-7,6],[-2,1],[-51,39],[-9,7]],[[7961,4389],[9,15],[5,8],[9,16]],[[7919,4386],[13,25]],[[7932,4411],[9,-7],[11,-8],[9,-7]],[[7932,4411],[14,23],[9,16]],[[7932,4411],[-2,2],[-7,5],[-13,10]],[[7910,4428],[6,11],[2,2],[5,10],[-7,5],[-1,1],[-50,39],[-8,6],[9,16]],[[7866,4518],[8,-6],[26,-20],[24,-19],[8,-6]],[[7932,4467],[8,-6],[5,-4],[7,-6],[3,-1]],[[7869,4393],[-8,10],[11,19]],[[7872,4422],[14,24]],[[7886,4446],[9,-7],[9,-7],[6,-4]],[[7886,4446],[-42,33],[-17,12],[-11,10],[-7,5],[-4,5],[-8,6]],[[7822,4552],[3,-3],[32,-25],[9,-6]],[[6501,3793],[-7,-19],[-17,-41]],[[6477,3733],[-5,-9],[-3,-6],[-4,-5],[-6,-9],[-5,-6],[-7,-7]],[[6379,3781],[20,-10],[20,-10],[13,28],[14,17]],[[6446,3806],[2,-2],[3,-1],[4,0],[4,2],[2,3],[2,2],[19,-9],[10,-5],[9,-3]],[[6403,3841],[21,-11],[19,-10],[0,-4],[0,-2],[0,-3],[1,-2],[2,-3]],[[6582,3819],[-21,11],[-19,8],[-19,9],[-9,-22],[-13,-32]],[[6426,3903],[3,-1],[20,-10],[19,-9],[4,-2],[8,-4],[10,-5],[36,-17],[39,-18],[20,-10]],[[6523,3965],[1,-2],[2,-3],[1,-2],[0,-4],[12,-6],[18,-8],[19,-9]],[[6527,4004],[4,12],[4,9],[18,-9],[2,-1],[8,8],[7,5],[4,2],[4,1],[4,1],[7,0],[6,-2],[14,-6],[16,-8],[1,-2]],[[7359,4794],[-69,50]],[[7334,4748],[-36,26],[-4,-8],[-33,24]],[[7296,4678],[-35,26]],[[7269,4626],[-69,52]],[[7259,4593],[-40,31]],[[7219,4624],[-34,26],[-23,17]],[[7190,4582],[-8,4],[-15,8]],[[7167,4594],[2,8],[4,9],[7,13],[-29,22]],[[7219,4624],[-5,-10],[-6,-10],[-7,-13],[-11,-9]],[[7247,4555],[-6,3],[-44,21],[-7,3]],[[7251,4569],[-2,-6],[-2,-8]],[[7241,4535],[-7,4],[-7,3],[-5,2],[-39,19],[-23,11],[-35,17]],[[7133,4610],[34,-16]],[[7247,4555],[-3,-14],[-3,-6]],[[7234,4514],[-10,6],[-48,22]],[[7176,4542],[-58,29]],[[7241,4535],[-2,-6],[-3,-9],[-2,-6]],[[7162,4500],[-38,18],[-21,10]],[[7176,4542],[-4,-12],[-4,-11],[-3,-10],[-3,-9]],[[7162,4500],[-4,-10],[-4,-10],[-4,-11],[0,-2],[-4,-9]],[[7162,4500],[40,-20],[3,-1],[7,-4]],[[7212,4475],[-11,-19],[-16,-28]],[[7185,4428],[-7,-14],[-2,-1],[-1,-2]],[[7234,4514],[-12,-19],[0,-2],[-3,-4],[-7,-14]],[[7284,4476],[-50,38]],[[7332,4386],[-39,29]],[[7293,4415],[-9,7],[-9,6],[7,13],[-6,5],[-10,7]],[[7266,4453],[10,9],[8,14]],[[7305,4338],[-9,7],[-21,16],[-9,7],[-8,6],[-10,7]],[[7248,4381],[10,17]],[[7258,4398],[9,-7],[8,-6],[9,16],[9,14]],[[7283,4299],[-6,4]],[[7277,4303],[-3,3],[-21,15],[-9,7],[-8,6],[-10,8]],[[7226,4342],[6,11],[6,10],[7,11],[3,7]],[[7305,4338],[-10,-18],[-12,-21]],[[7215,4350],[11,-8]],[[7277,4303],[-6,-10],[-5,-9],[-5,-9],[-1,-2],[-5,-9],[-12,9]],[[7185,4428],[9,-6],[13,-10],[13,-10],[10,-7],[10,17],[9,-7],[9,-7]],[[7962,5097],[10,-5],[51,-26],[9,-4]],[[8032,5062],[-8,-20],[-7,-19]],[[7984,5141],[9,-5],[1,-1],[46,-24],[9,-5]],[[8049,5106],[-8,-22],[-9,-22]],[[8058,5129],[-9,-23]],[[8006,5182],[9,-4],[43,-23],[8,-5]],[[8066,5150],[-2,-4],[-6,-17]],[[8074,5170],[-8,-20]],[[8026,5219],[1,-1],[7,-3],[39,-21],[8,-5]],[[8081,5189],[-7,-19]],[[8089,5209],[-8,-20]],[[8099,5232],[-2,-3],[-8,-20]],[[8136,5160],[-8,-19]],[[8128,5141],[-9,4],[-37,20],[-8,5]],[[8089,5209],[9,-5],[8,-4],[21,-11],[8,-4],[9,-5]],[[8144,5180],[-8,-20]],[[8153,5203],[-1,-3],[-8,-20]],[[8190,5131],[-46,24],[-8,5]],[[8169,5095],[-40,22],[-8,4]],[[8121,5121],[7,20]],[[8150,5054],[-10,5],[-25,14],[-9,4]],[[8106,5077],[7,23]],[[8113,5100],[8,21]],[[7112,4117],[9,17]],[[7121,4134],[10,18]],[[7131,4152],[10,18],[-8,5],[-11,5],[-51,25],[-9,4]],[[7134,4264],[11,-4],[11,-7],[10,-10],[8,-11],[3,-7],[4,-10],[2,-15],[0,-4],[1,-17],[-2,-17]],[[6891,4103],[6,17]],[[6897,4120],[6,15]],[[6903,4135],[8,-5],[58,-27],[10,-5]],[[6903,4135],[6,17]],[[6909,4152],[9,-4],[57,-28],[10,-4]],[[6909,4152],[6,19]],[[6915,4171],[9,-5],[58,-28],[10,-4]],[[6915,4171],[7,18]],[[6922,4189],[66,-33],[10,-4]],[[6922,4189],[6,17]],[[6928,4206],[76,-36]],[[6928,4206],[7,18]],[[6935,4224],[9,-4],[57,-28],[9,-4]],[[6935,4224],[3,10],[4,10]],[[6942,4244],[75,-37]],[[6942,4244],[6,20]],[[6942,4244],[-63,31]],[[6935,4224],[-10,5],[-44,22],[-9,4]],[[6872,4255],[3,9],[4,11]],[[6928,4206],[-9,5],[-44,21],[-9,5]],[[6866,4237],[6,18]],[[6922,4189],[-9,4],[-18,9],[-27,12],[-9,4]],[[6859,4218],[7,19]],[[6909,4152],[-9,4],[-8,4],[-37,18],[-9,4]],[[6846,4182],[7,19],[6,17]],[[6897,4120],[-62,30]],[[6835,4150],[5,15]],[[6840,4165],[6,17]],[[6829,4133],[6,17]],[[6777,4195],[10,-5],[44,-21],[9,-4]],[[6790,4231],[7,18]],[[6797,4249],[9,-5],[44,-21],[9,-5]],[[6797,4249],[6,18]],[[6803,4267],[10,-5],[53,-25]],[[6803,4267],[2,7],[5,11],[6,20]],[[6816,4305],[-5,2],[-56,28]],[[6803,4267],[-8,4],[-45,22],[-9,4]],[[7965,4523],[-12,-19]],[[7953,4504],[-8,6],[-50,38],[-8,6]],[[7887,4554],[4,5],[3,4],[3,3],[5,6],[5,-3],[49,-39],[9,-7]],[[7866,4518],[9,17],[12,19]],[[7953,4504],[-11,-21],[-10,-16]],[[7959,4671],[3,-2],[7,-5],[4,-2],[27,-19],[26,-19],[2,-3],[6,-4]],[[8034,4617],[-32,6],[-33,1],[-21,-2],[-19,-5],[-5,-1],[-28,-10],[-17,-9],[-24,-16]],[[8225,4853],[-38,19],[-10,4]],[[8233,4878],[-7,-21],[-1,-4]],[[8284,4828],[-1,-4]],[[8283,4824],[-58,29]],[[8241,4895],[14,-12],[39,-32]],[[8294,4851],[-6,-11],[-4,-12]],[[8266,4935],[53,-44]],[[8319,4891],[-13,-20],[-12,-20]],[[8329,4803],[-4,5],[-41,20]],[[8319,4891],[15,-13],[4,-3],[14,-8]],[[8352,4867],[-7,-20],[-8,-23]],[[8362,4893],[-10,-26]],[[8279,4956],[18,-16],[35,-29]],[[8332,4911],[4,-4],[7,-4],[19,-10]],[[8304,4996],[18,-15],[17,-15],[-10,-17],[-1,-2],[1,-3],[15,-12],[-12,-21]],[[8313,5019],[79,-42]],[[8392,4977],[-3,-10],[-9,-25],[-18,-49]],[[8425,4960],[-11,5],[-6,4],[-16,8]],[[8328,5058],[9,-5],[69,-36],[8,-5],[1,0],[12,-7]],[[8427,5005],[-1,-22],[-1,-23]],[[8432,5056],[0,-5],[-2,-29]],[[8430,5022],[-1,-10],[-2,-7]],[[8479,4997],[-10,5],[-23,12],[-16,8]],[[8488,5025],[-1,-3],[-3,-11],[-5,-14]],[[7872,4422],[-15,12],[-55,42],[-2,-5]],[[7800,4471],[-16,12],[-8,7]],[[7869,4393],[-10,7],[-69,54],[6,11],[4,6]],[[7856,4371],[-9,7],[-70,54],[-5,-10],[-6,-10]],[[3424,1948],[-33,54],[-3,5]],[[3388,2007],[-3,4]],[[3385,2011],[17,14],[-10,16],[15,14],[1,1],[0,2],[-31,49],[17,14],[18,14],[13,12],[4,-1],[28,-46],[3,0],[16,13]],[[3385,2011],[-9,15],[-8,13],[-30,19],[-6,10],[-12,19]],[[3275,1912],[-24,9]],[[3388,2007],[-56,-48],[-57,-47]],[[3311,1854],[-24,38]],[[3287,1892],[-12,20]],[[3254,1652],[-17,29],[-5,8],[-12,21],[-4,5],[-13,19]],[[3203,1734],[4,4],[48,40],[-35,58],[17,14],[17,14],[17,14],[16,14]],[[8049,3664],[-24,19],[-6,4],[-11,8],[-9,7]],[[7999,3702],[4,9],[4,7],[5,10],[4,8],[4,7]],[[7999,3702],[-18,14],[4,8],[4,8],[-4,2],[-20,15],[4,8]],[[7969,3757],[4,9],[5,8]],[[7978,3774],[26,-18],[14,-11],[2,-2]],[[7999,3702],[-10,-18],[-7,-13]],[[7982,3671],[-11,-19],[-11,-20]],[[7874,3698],[28,51],[10,18]],[[7912,3767],[21,-15],[6,11],[6,11],[24,-17]],[[8032,3633],[-36,27],[-2,2],[-12,9]],[[7912,3767],[7,12],[5,10],[5,9],[5,9]],[[7934,3807],[20,-15],[8,-6],[16,-12]],[[7934,3807],[9,16],[8,15]],[[7951,3838],[28,-22],[8,15]],[[7987,3831],[39,-29],[0,-3],[-3,-6],[-3,-7],[16,-12]],[[7951,3838],[8,14]],[[7959,3852],[10,15],[3,7],[4,8]],[[7976,3882],[28,-21]],[[8004,3861],[-5,-8],[-3,-7],[-4,-6],[-5,-9]],[[8004,3861],[39,-29]],[[8043,3832],[7,-6],[9,-6]],[[7976,3882],[5,9],[4,7],[5,8],[4,8]],[[7994,3914],[66,-50],[-4,-8],[-5,-7],[-4,-8],[-4,-9]],[[7994,3914],[4,7],[6,11]],[[8004,3932],[-46,36]],[[7976,3882],[-46,35]],[[7930,3917],[5,9],[4,7],[8,15]],[[7947,3948],[5,8],[6,12]],[[7959,3852],[-13,10],[-33,25]],[[7913,3887],[9,15],[4,7],[4,8]],[[7913,3887],[-10,7],[8,15],[-37,29]],[[7874,3938],[4,7],[4,8],[5,9],[4,7]],[[7891,3969],[5,8],[4,7],[28,-21],[19,-15]],[[7888,3842],[-10,7],[-28,21],[-9,6]],[[7841,3876],[9,17],[4,8],[4,7],[3,6],[5,9]],[[7866,3923],[8,15]],[[7913,3887],[-8,-15],[-8,-14],[-9,-16]],[[7934,3807],[-46,35]],[[7912,3767],[-10,8],[-36,27]],[[7866,3802],[12,22]],[[7878,3824],[10,18]],[[7866,3802],[-11,-18],[-46,35],[10,18]],[[7819,3837],[6,11],[6,11],[47,-35]],[[7773,3871],[14,-10],[32,-24]],[[7794,3911],[47,-35]],[[7820,3958],[46,-35]],[[6582,3755],[-20,8],[-22,-59],[-21,9],[-21,10],[-21,10]],[[6203,3627],[19,-9],[50,-23],[7,23],[8,23],[8,23],[8,22],[7,21],[8,21],[-49,24],[-19,9]],[[7688,4681],[-5,-10],[-6,-11],[-48,37],[-9,10],[-9,6]],[[7704,4608],[-39,30],[-46,35],[-3,6],[-4,6],[-12,10]],[[7607,4543],[-11,9],[-9,8],[-32,26],[-11,8]],[[7594,4520],[-12,9],[-41,33],[-10,9]],[[8624,5710],[-47,26],[-9,5]],[[8568,5741],[13,31],[8,20],[8,20]],[[8653,5781],[-8,-20],[-8,-20],[-8,-20],[-5,-11]],[[8568,5741],[-2,2],[-9,4],[-53,29]],[[8480,5717],[8,19],[8,20]],[[8568,5741],[-8,-20],[-8,-20],[-7,-17],[-1,-3]],[[7853,5360],[-77,40]],[[7839,5334],[-9,5],[-2,1],[-65,33]],[[7827,5311],[-76,40]],[[7839,5334],[-12,-23]],[[7567,3823],[-35,26]],[[7557,3778],[-8,9],[-8,6],[-28,21]],[[8110,6557],[-3,2],[-3,2]],[[8057,6707],[10,19],[19,35],[2,3],[7,15],[6,11],[3,5],[1,2],[2,-2],[7,-7],[7,-8],[3,-4],[2,-2],[2,-2],[1,-2],[2,-2],[1,-1],[1,-2],[1,-2],[2,-2],[1,-2],[1,-1],[1,-2],[2,-3],[1,-2],[2,-2],[2,-4],[3,-3],[7,-12],[1,-2],[5,-6],[3,-4],[2,-2],[2,-3],[2,-2],[3,-3],[6,-6],[5,-3],[1,-1],[4,-3],[3,-2],[3,-1]],[[7054,6892],[-24,37]],[[7030,6929],[-12,20]],[[7018,6949],[44,38]],[[7062,6987],[13,-22],[11,-17]],[[7062,6987],[14,12]],[[7076,6999],[14,12]],[[7199,6666],[3,2],[2,0],[1,0],[15,-25],[3,-2],[2,2],[8,15],[-35,54],[-18,-16]],[[7176,6808],[23,13],[22,12],[48,27],[-2,3],[-15,23]],[[7367,6912],[5,3],[9,4],[9,6],[7,5],[6,5],[5,6],[7,7],[9,8],[6,6],[5,5],[6,4],[3,1],[6,3],[8,4],[13,5]],[[7049,4170],[8,-4],[55,-28],[2,-1],[7,-3]],[[7055,4189],[76,-37]],[[7225,4241],[86,-23],[13,-4],[1,0],[4,-3],[6,-3],[23,-15],[9,-4],[10,-1],[5,0],[28,0],[13,-2],[8,-2]],[[7283,4299],[17,-13],[34,-27],[9,-6],[9,-7]],[[7352,4246],[34,-25],[22,-17],[7,-4],[20,-15]],[[7375,4286],[-5,-9],[-5,-9],[-6,-10],[-7,-12]],[[7464,4286],[6,13],[7,12],[8,13]],[[7485,4324],[58,-44],[9,-7]],[[7485,4324],[7,14],[6,12]],[[7498,4350],[6,11],[7,11]],[[7643,5148],[-1,-3],[-12,-24],[-10,-18],[-9,-18],[-16,-31]],[[7698,5065],[-9,-19],[-24,12],[-13,-33]],[[7652,5025],[-17,9],[-2,1],[-15,7],[-10,5],[-13,7]],[[7643,5148],[10,-6],[6,-4],[51,-25],[10,-6]],[[7720,5107],[-12,-24],[-10,-18]],[[7646,4967],[-69,53]],[[7652,5025],[20,-10]],[[7672,5015],[-8,-15],[-6,-11]],[[7658,4989],[-6,-11],[-6,-11]],[[7622,4922],[-69,53]],[[7646,4967],[-6,-12],[-6,-11],[-6,-11],[-6,-11]],[[7610,4899],[-59,45],[-10,7]],[[7910,2498],[10,17],[11,17]],[[7931,2532],[10,18],[38,-31]],[[7866,2535],[14,13],[14,13]],[[7894,2561],[37,-29]],[[7821,2526],[8,19],[9,19],[8,19],[8,20],[9,19]],[[7863,2622],[13,-11],[9,-7],[15,-12],[33,30]],[[7933,2622],[12,-16],[-13,-11],[-17,-15],[-5,-6],[-16,-13]],[[7863,2622],[10,18],[11,18],[10,13],[14,14]],[[7908,2685],[15,15],[7,7],[2,2]],[[7956,2645],[-2,-3],[-21,-20]],[[7863,2622],[-43,34]],[[7856,2706],[4,4],[14,16]],[[7874,2726],[7,-8],[6,-7],[13,-16],[8,-10]],[[7874,2726],[14,16],[5,6],[15,17],[1,2],[1,1]],[[7765,2786],[20,35],[5,8]],[[7790,2829],[34,50],[3,4]],[[7911,2957],[-1,-3],[-8,-10],[-6,-8]],[[7790,2829],[-5,4],[-24,16]],[[7761,2849],[3,4],[31,47]],[[7761,2849],[-17,-18],[-13,-21],[-16,-23]],[[7646,4967],[69,-53]],[[7658,4989],[60,-46],[8,-7]],[[7672,5015],[21,-12],[55,-26]],[[7698,5065],[66,-33],[10,-5]],[[7720,5107],[12,24]],[[7732,5131],[10,-5],[2,-1],[53,-26],[3,-2],[8,-4]],[[7732,5131],[11,21]],[[7743,5152],[10,-5],[55,-28],[3,-1],[9,-5]],[[7743,5152],[13,22],[12,23]],[[7768,5197],[11,23]],[[7779,5220],[9,-5],[55,-28],[12,-6]],[[7743,5152],[-11,5],[-19,10],[-16,8],[-19,9],[-3,2],[-9,4]],[[7690,5236],[3,-1],[4,-3],[1,0],[17,-9],[3,-1],[13,-7],[27,-14],[10,-4]],[[7827,5311],[-12,-24],[-12,-23],[-24,-44]],[[7827,5311],[9,-5],[2,-1],[55,-27],[10,-6]],[[7434,2220],[-9,7],[-5,4],[-36,27],[-2,2],[-10,6],[-14,10],[-6,5]],[[7352,2281],[2,1],[21,18],[3,2],[2,2]],[[7380,2304],[1,1],[3,2],[0,1],[2,1],[15,14],[3,3],[3,2],[9,9],[2,1],[1,1]],[[7419,2339],[49,43],[24,22],[16,15]],[[7508,2419],[65,-42],[2,-1],[27,30],[5,5]],[[7607,2411],[-1,-4],[-2,-8],[-10,-39],[-2,-5]],[[7607,2411],[4,5],[16,19]],[[7627,2435],[14,-12],[4,-3],[7,-5],[16,-13],[5,-4],[30,-23],[3,-2]],[[7642,2313],[-55,-51],[-17,-26],[-7,-10],[-3,-2]],[[7647,2310],[-1,-5],[-17,-30],[-7,-14],[11,-8],[6,-5],[4,-3],[16,8],[-1,-11],[-2,-14]],[[7685,2519],[-5,-7],[-5,-7],[17,-17],[11,-12],[-13,-19],[19,-16],[14,10],[4,2],[15,11]],[[7328,1095],[5,23]],[[7436,1089],[-8,-8],[-10,-11],[-6,1],[-84,24]],[[7333,922],[-3,3],[-3,3]],[[7327,928],[-2,3],[-2,1]],[[7323,932],[14,16],[24,27],[21,23],[14,16],[7,10],[-13,3],[-42,12],[-4,2],[-5,2],[-5,1],[-5,0],[-11,3]],[[7318,1047],[5,23],[5,25]],[[7464,1065],[-39,-46],[-2,-2],[-43,-46],[-44,-46],[-3,-3]],[[7323,932],[-4,2],[-5,2],[-6,0],[-9,0],[-8,2],[-25,7],[-13,3]],[[7253,948],[10,12],[11,12],[-1,2],[-1,3],[-32,25],[10,18],[24,-20],[14,15],[30,32]],[[7318,1047],[-23,6],[-23,6],[-11,4],[6,23],[5,25],[5,24]],[[7253,948],[-36,9],[-12,4],[-10,2],[-7,0]],[[7053,764],[61,74],[-10,9],[-30,25]],[[7074,872],[21,21],[18,22]],[[7113,915],[3,4],[14,-19],[12,19],[19,32],[1,2],[1,3],[-1,3],[-8,4]],[[7253,948],[-4,-3],[-9,-10],[-5,-6],[-39,25],[-9,-17],[34,-23],[-2,-8],[50,-32],[13,14],[27,28],[1,1],[0,2],[1,3],[0,3],[1,-2],[0,-2],[0,-3],[-1,-4],[-1,-3],[-2,-3],[17,17],[2,3]],[[7333,922],[-3,-3],[-1,-2],[-101,-104],[-15,-17],[-47,-50],[-1,-1],[-12,-10],[-10,-8]],[[7845,4003],[9,-6],[1,-1],[36,-27]],[[2315,2374],[-2,-8],[0,-3],[15,-39],[1,-3],[2,-1],[3,0],[-20,-64],[-4,-11],[-8,-15],[-4,4],[-4,4],[-3,5],[-1,6],[1,6],[5,11],[-3,1],[-3,1],[-3,0],[-2,-1],[-19,-10],[-1,-2],[10,-27],[0,-3],[-1,-3],[-2,-3],[-3,-6],[-13,7],[-18,51]],[[2386,2333],[-17,-14],[-11,-9],[-4,-4],[-4,-5],[-3,-7],[-18,-56],[-7,-13],[-11,-21],[-12,-21],[-3,-8],[-12,-33]],[[2428,2260],[-37,-47]],[[2464,2222],[39,-63]],[[2503,2159],[-4,-4],[-5,-4],[-15,-15],[-27,-26],[-16,-15],[-3,-2],[-1,0],[-3,-1],[-1,0],[-8,0],[-3,1],[-3,0],[-3,0],[-3,0],[-3,-1],[-3,-2],[-2,-1],[-1,-1],[-2,-1],[-27,-26]],[[2434,2272],[30,-50]],[[6193,991],[0,1],[-6,3],[-7,0],[-7,-2],[-5,-4],[-4,-5],[-7,-4],[-10,-3],[-10,-1],[0,65],[-19,1],[-11,0],[0,45],[-18,0]],[[6089,1087],[1,75],[0,4]],[[6090,1166],[28,9]],[[6510,1298],[0,-1],[1,-4],[1,-1],[1,-3],[1,-4],[0,-2],[1,-3],[0,-3],[1,-13],[-1,-8],[-2,-4],[-3,-11],[-3,-9],[-3,-10],[-4,-14]],[[6500,1208],[-10,-10],[-31,-28],[-28,-21],[-21,-16],[-24,-15],[-25,-13],[-28,-18],[-20,-15],[-33,-25],[-17,-14],[-28,-17],[-15,-9],[-17,-11],[-10,-5]],[[6204,963],[0,9],[-2,7],[-4,7]],[[6198,986],[3,2],[7,2],[4,-2],[3,1]],[[6211,966],[-2,-1],[-5,-2]],[[6203,961],[8,4]],[[6209,957],[-3,-2],[-1,0],[-2,-1],[0,7]],[[6089,1087],[-18,0],[-18,1],[-22,0]],[[6031,1088],[1,55],[-19,-6],[-19,-6]],[[5994,1131],[-1,5],[78,24],[3,1],[16,5]],[[6031,1043],[0,45]],[[6089,1087],[1,-44],[-9,0],[0,-63]],[[6081,980],[-11,3],[-17,1],[-22,0],[0,59]],[[6031,1043],[-19,0],[1,45],[-19,0],[-20,1]],[[5975,1125],[19,6]],[[6081,980],[0,-10]],[[6081,970],[-21,1],[-6,1],[-23,4],[-14,3],[-43,5]],[[5974,986],[0,56],[0,5],[0,31]],[[5977,881],[27,-8],[22,-1],[25,4],[22,9],[7,3]],[[6080,888],[-2,-21]],[[6078,867],[-12,-6],[-21,-2],[-6,0],[-9,-3],[-7,0],[-4,-2],[-4,0],[-7,-6],[-11,-2],[-14,1],[-8,2]],[[5978,929],[3,-2],[77,-24],[22,12]],[[6080,915],[0,-4],[0,-2]],[[6080,909],[-14,-7],[-12,-5],[-12,1],[2,-3],[-1,0],[-11,1],[-21,0],[-12,1],[-12,4],[-5,2],[-4,3]],[[5975,979],[12,-4],[12,-1],[10,2],[7,0],[16,-3],[31,-7],[17,0]],[[6080,966],[0,-3],[0,-3]],[[6080,960],[-4,0],[-13,-3],[-17,-2],[-12,0],[-18,3],[-5,2],[-27,6],[-7,1],[-1,1]],[[6211,867],[-12,8],[-10,11],[-28,6],[-6,2],[-16,0],[-12,-4],[-11,-4],[-6,-4],[-1,-1],[-22,-11],[-9,-3]],[[6080,888],[5,2],[18,11],[27,16],[6,3],[6,4],[5,7],[-1,3],[3,1],[30,16],[19,6],[5,4]],[[6193,991],[-10,-5],[-26,-10],[-20,-5],[-18,0],[-22,-1],[-16,0]],[[6204,963],[-7,-1],[-8,3],[-15,-11],[-26,-15],[-3,-1],[0,1],[-10,1],[-55,-31]],[[6080,915],[59,32],[0,1],[7,4],[0,3],[16,9],[10,4],[15,10],[4,3],[3,4],[4,1]],[[6096,939],[-2,0],[-2,0],[0,3],[0,10],[6,5],[4,1],[2,3],[2,3],[4,2],[7,0],[2,1],[8,0],[5,0],[2,-8],[-3,-3],[-35,-17]],[[6080,966],[23,0],[-2,-4],[-4,0],[-17,-2]],[[4784,1039],[0,-13],[-2,-7],[-2,-9],[-8,-13],[-11,-10],[-7,-9],[-3,-17],[-3,-3],[-5,-3],[-11,-10],[-4,-2],[-8,0],[-5,-1],[-14,6],[-20,5],[-17,8],[-18,2],[-20,5],[-20,15],[-9,15],[1,8],[3,6],[4,8],[12,10],[9,13],[8,7],[4,1],[6,0],[14,-4],[15,-3],[29,3],[14,4],[17,1],[12,-4],[6,-3],[8,-3],[20,0],[5,-3]],[[8225,4853],[-8,-19]],[[8217,4834],[-17,8],[-9,-24],[-7,-19],[-14,6],[-5,-15]],[[8165,4790],[-10,5],[-26,13]],[[8129,4808],[14,37],[7,19]],[[8150,4864],[8,21]],[[8217,4834],[-16,-43],[66,-33]],[[8267,4758],[-13,-34],[-17,9],[-8,4],[-15,7],[-9,5],[-16,8],[-31,15]],[[8158,4772],[7,18]],[[8283,4824],[-7,-19],[-1,-6],[0,-17],[-8,-24]],[[8305,4738],[-22,12],[-16,8]],[[8292,4576],[-60,12],[-19,2],[-61,10],[-36,6],[-32,4],[-31,5]],[[8053,4615],[4,6],[6,11],[5,10],[6,16],[11,28],[12,33]],[[8097,4719],[1,-1],[5,-2],[4,7],[4,7],[4,9],[5,8],[4,7],[14,-7],[9,-5],[5,12],[6,18]],[[9689,9681],[2,4],[1,4],[0,3],[3,4],[5,5],[6,6],[7,7],[5,7],[1,7],[1,9],[-2,2],[-8,2],[-6,1],[-18,33]],[[9766,9812],[7,-15],[1,-6],[2,-6],[0,-3],[0,-11],[-1,-10],[-26,7],[-2,-3],[-5,-33],[-2,-9],[0,-6],[-1,-4],[-3,-6],[-6,-9],[-12,-15],[-4,-4],[-1,-2],[-2,-1],[-22,5]],[[8010,5802],[-12,-30],[-9,4],[-12,6],[-21,-39],[-15,7]],[[8504,5582],[-1,-3],[-3,-5],[-11,-28],[-12,-29],[-8,-21]],[[8703,5618],[-9,-21],[-3,-11],[-29,-91],[66,-36]],[[8728,5459],[-1,-3],[-19,-59],[0,-5],[-4,-12]],[[8544,5681],[6,-3],[1,-2],[49,-27],[4,11],[4,10]],[[8608,5670],[40,-22],[31,-17],[9,-5],[15,-8]],[[8624,5710],[-4,-10],[-4,-10],[-4,-10],[-4,-10]],[[8711,5638],[-8,-20]],[[8624,5710],[41,-22]],[[8665,5688],[31,-17],[9,-5],[14,-8]],[[8719,5658],[-8,-20]],[[8693,5758],[-8,-19],[-8,-20],[-8,-20],[-4,-11]],[[8732,5690],[-13,-32]],[[8748,5728],[-8,-19],[-8,-19]],[[8797,5653],[-9,5],[-1,1],[-21,12],[-8,4],[-17,9],[-9,6]],[[8748,5728],[9,-5],[47,-26],[9,-5]],[[8776,5602],[-40,21],[-16,10],[-9,5]],[[8797,5653],[-9,-21],[-4,-10],[-4,-10],[-4,-10]],[[8838,5592],[-13,7],[-5,-10],[-4,-10],[-40,23]],[[8845,5503],[-1,-3],[-33,-104],[-4,-12],[-4,-14],[-5,-16],[-7,-25],[-1,-3]],[[8790,5326],[-1,1],[-25,18],[-22,14],[-7,4],[-31,17]],[[8728,5459],[32,102],[4,11],[4,10],[4,10],[4,10]],[[9010,5560],[-8,-20],[8,-5],[52,-29],[10,-5],[1,-4]],[[8892,5625],[-4,-10],[-3,-10],[-4,-9],[-3,-10],[62,-35],[5,10],[3,9],[-3,1],[8,20]],[[4560,3691],[-5,-8],[-8,-8],[-11,-8],[-15,-10],[-9,-9],[-21,-19],[-8,-9],[-6,-7],[-9,-10],[-7,-8],[-10,-9],[-28,-19],[-45,-22],[-22,-16]],[[4292,3588],[10,4],[8,3],[7,3],[10,7],[6,6],[3,5],[4,8],[1,10],[3,1],[8,6],[3,4],[23,17],[6,3],[4,0],[15,-1],[14,-3],[7,-2],[0,-23],[-2,-5],[0,-1],[11,5],[8,5],[7,6],[5,3],[1,0],[3,0],[9,-4],[-1,14],[5,6],[5,0],[7,2],[7,10],[4,4],[13,14],[3,15],[2,22],[0,15],[7,20],[8,14],[8,11],[15,24],[4,5],[3,2],[11,-2],[2,2],[2,5],[9,2],[3,0],[1,-12],[2,-4],[6,4],[15,22],[18,28],[3,-3],[5,3],[8,10],[24,36],[7,20],[1,20],[6,9],[3,15],[6,15],[0,8],[2,14],[12,5],[13,6],[1,3]],[[4716,4029],[1,-5],[36,-36]],[[4404,3716],[-6,-1],[-4,5],[-5,9],[-1,9],[-4,20],[0,17],[4,7],[14,12],[6,9],[7,8],[29,19],[14,6],[8,5],[8,0],[6,-2],[5,-5],[0,-8],[0,-10],[-8,-26],[-1,-13],[-5,-29],[-4,-9],[-4,-6],[-6,-5],[-7,-10],[-5,-4],[-17,-1],[-24,3]],[[4412,3456],[-56,73]],[[9689,9681],[-1,-9],[-4,-19]],[[9684,9653],[-52,14],[-17,4],[-6,3],[-9,5]],[[9675,9602],[9,51]],[[7266,4453],[-9,-11],[-11,8],[-24,18],[-10,7]],[[8176,3051],[-3,4],[-10,8],[-2,1],[-2,2],[-3,1],[-1,1],[-4,3],[-12,10]],[[8142,5032],[-8,-21]],[[8134,5011],[-33,17],[-9,4]],[[8092,5032],[6,23],[8,22]],[[8092,5032],[-10,5],[-2,1],[-17,9],[-22,10],[-9,5]],[[8058,5129],[9,-5],[14,-7],[23,-12],[9,-5]],[[8079,4993],[-10,5],[-42,21],[-10,4]],[[8092,5032],[-7,-20],[-6,-19]],[[8066,4954],[-7,-19]],[[8079,4993],[-7,-20],[-6,-19]],[[8113,4932],[-9,4],[-28,14],[-10,4]],[[8134,5011],[-14,-39],[-7,-19],[0,-21]],[[8113,4882],[-14,6],[-39,20],[-9,4]],[[8113,4932],[0,-24],[0,-26]],[[8150,4864],[-2,1],[-28,13],[-7,4]],[[8129,4808],[-2,1],[-21,11],[-9,4]],[[8097,4824],[1,6],[1,4],[2,9],[4,10],[3,9],[-55,27],[-9,5]],[[8097,4824],[-9,5],[-48,23],[-9,5]],[[8090,4806],[-9,4],[-48,24],[-9,5]],[[8097,4824],[-7,-18]],[[8457,4942],[-32,18]],[[8479,4997],[-7,-16]],[[8472,4981],[-3,-9],[-4,-10],[-4,-10],[-4,-10]],[[8542,4944],[-10,5],[-60,32]],[[8488,5025],[10,-5],[59,-32]],[[8530,4904],[-49,26],[-24,12]],[[8503,4823],[-12,6],[-48,24],[-11,5],[-13,7]],[[8419,4865],[2,30],[1,26],[1,14],[2,25]],[[8493,4797],[-11,5],[-41,21],[-24,11]],[[8417,4834],[1,11],[0,6],[1,14]],[[8408,4789],[3,11],[2,6],[2,7],[1,4],[1,17]],[[3203,1734],[-34,59],[-4,7],[-12,21],[-26,43]],[[3167,1567],[-16,63]],[[3151,1630],[-33,129]],[[3151,1630],[-4,-1],[-9,5],[0,-3],[0,-2],[-2,-1],[-20,-8]],[[3116,1620],[-4,2],[-5,1],[-3,-2],[-9,-7]],[[3163,1566],[-8,-2],[-20,-18]],[[3135,1546],[-19,74]],[[3008,1441],[-17,-14]],[[2991,1427],[-7,28],[-7,26],[-24,-19],[-2,-2],[-2,0],[-2,1],[-8,14],[-2,3],[0,2],[2,3],[49,39]],[[3135,1546],[-19,-15],[-17,-15],[-18,-15],[-18,-14],[-17,-14],[-19,-17],[-19,-15]],[[3082,1349],[-18,-8],[-20,-9],[-16,68],[-6,12],[-4,7],[-6,9],[-4,13]],[[3193,1447],[-14,-5],[-30,-11],[-6,-4],[-4,12],[-16,-5],[-2,-2],[-1,-2],[9,-34],[-22,-10],[-10,-5],[-1,-2],[5,-22],[-19,-8]],[[3090,1320],[-3,6]],[[3087,1326],[-5,23]],[[3087,1326],[-55,-26],[-30,-12],[-9,34],[-23,-7],[-20,86],[-2,6],[4,7],[11,-7],[8,2],[20,18]],[[2757,1440],[60,-6]],[[2817,1434],[65,2],[-63,131],[30,23],[-12,21]],[[2817,1434],[-4,19]],[[2813,1453],[-6,23],[-5,16],[-1,8],[-1,9],[-2,15],[-1,9]],[[2797,1533],[-3,9],[-6,12],[-7,10],[13,11],[6,5],[7,5],[11,10],[3,3]],[[2821,1598],[3,2],[10,8],[3,3]],[[2813,1453],[-13,-4],[-35,0],[-21,0],[-37,0]],[[2707,1449],[-5,24],[-6,34],[-2,8],[-9,22],[-10,23]],[[2675,1560],[6,2],[9,3],[10,7],[25,21],[5,-7],[9,-11],[-33,-28],[-1,-2],[0,-2],[10,-19],[22,19],[1,1],[1,-1],[7,-6],[7,-10],[6,5],[7,1],[8,0],[23,0]],[[2675,1560],[-12,29]],[[2663,1589],[19,7],[14,6],[9,5],[11,9],[14,10],[12,-19],[19,17],[16,12],[11,10],[1,1],[1,0],[2,0],[1,-1],[0,-1],[28,-47]],[[2707,1449],[-20,0],[-1,1],[-1,1],[-6,32],[-1,2],[-2,0],[-18,1],[-1,-1],[-6,-9],[9,-9],[1,-3],[2,-10],[1,-4],[-1,-1],[-1,0],[-13,0],[-4,1],[-12,10],[-13,11],[-1,1],[-2,0],[-20,1],[-2,0],[-1,1],[0,1],[-1,2],[0,2],[1,17]],[[2594,1496],[0,22],[0,24],[0,17],[1,25],[21,0],[22,1],[11,1],[14,3]],[[2594,1496],[-74,0],[-20,1],[-1,26],[-17,0],[-1,0],[-1,1],[-1,3],[2,20],[-1,20],[1,3],[2,0],[15,0],[2,-2],[0,-2],[0,-23],[17,0],[3,0],[1,42],[-59,0],[-25,0],[-8,-1],[-4,-3],[-14,-10]],[[8245,3572],[-7,-14],[-13,-24],[-27,-52],[-6,-12],[-9,-17]],[[8083,4787],[-9,5],[-48,24],[-9,4]],[[8090,4806],[-7,-19]],[[8077,4769],[-10,4],[-48,24],[-9,5]],[[8083,4787],[-6,-18]],[[8102,4734],[-2,1],[-21,11],[-9,4],[-9,5],[-48,24],[-10,4]],[[8077,4769],[9,-5],[20,-10],[3,-2]],[[8109,4752],[-3,-9],[-4,-9]],[[8129,4808],[-3,-9],[-3,-10],[-4,-9],[-3,-9],[-7,-19]],[[8097,4719],[3,7],[2,8]],[[8053,4615],[-4,-7]],[[8049,4608],[-2,2],[-4,1],[-9,6]],[[7991,4747],[11,-11],[53,-27],[9,25],[-9,5],[-48,23],[-10,3]],[[8010,4543],[-12,-19]],[[7998,4524],[-2,2],[-8,6],[-5,4],[-8,6],[-10,-19]],[[7975,4486],[12,20],[11,18]],[[2944,3456],[-7,-2]],[[2937,3454],[-10,24],[-2,4],[-14,29]],[[2911,3511],[11,6],[4,1],[7,2],[7,1],[8,5],[10,6],[-6,12],[-3,6],[-8,19],[9,6],[4,3],[4,5],[5,8],[3,10],[1,7],[-1,10],[-2,7],[-13,29]],[[2951,3654],[32,-6],[34,-6],[18,-3],[3,1],[3,0]],[[2791,3388],[-15,24]],[[2776,3412],[20,11],[1,3],[-5,10],[-3,6],[-1,6],[0,6],[1,7],[1,5],[4,17],[0,9],[0,6],[-1,6],[-1,4],[-7,18],[-2,4]],[[2783,3530],[31,15],[8,5],[13,6],[11,4],[11,2],[10,1],[7,0]],[[2874,3563],[21,-5],[-1,-9],[0,-3],[8,-16],[9,-19]],[[2937,3454],[-15,-5],[-42,-10],[-31,-8],[-10,-3],[-21,-15],[-7,-6],[-20,-19]],[[2832,3313],[-14,29],[-11,22],[-16,24]],[[2978,3381],[-31,-14]],[[2947,3367],[-39,-18],[-47,-22],[-29,-14]],[[3146,3440],[-3,-3],[-5,9],[-31,-26],[-30,-22]],[[3077,3398],[-38,-27],[-27,-25],[-8,-5]],[[3004,3341],[-3,13],[-41,-17],[-12,27],[-1,3]],[[3114,3269],[-25,-12],[-11,-6],[-11,-10],[-10,-9],[-14,-18]],[[2977,3296],[-4,11],[-2,5]],[[2971,3312],[17,13],[16,16]],[[3077,3398],[6,-5],[8,-6],[-5,-10],[-3,-9],[-3,-15],[-5,-23],[8,-3],[7,-4],[5,-6],[6,-7],[4,-10],[2,-8],[7,-23]],[[3212,3327],[-3,-3],[-18,-13],[-12,-7],[-14,-11],[-13,-7],[-16,-7]],[[3136,3279],[-22,-10]],[[7576,2516],[0,11],[1,15],[-1,3],[0,4],[-2,3],[-1,3],[-3,2],[-9,8]],[[7561,2565],[-64,47]],[[7516,2500],[15,23],[14,19],[16,23]],[[7576,2516],[-3,-6],[-10,-13],[-15,-20],[-2,1],[-10,8],[-20,14]],[[7508,2419],[-10,11],[-4,1],[-2,2],[-11,8],[-3,4]],[[7478,2445],[22,32],[13,18],[3,5]],[[7478,2445],[-16,11],[-15,11],[-16,12],[-7,6],[-11,-12],[-10,3]],[[7453,2548],[33,-25],[30,-23]],[[7478,2445],[-12,-17],[-8,-12],[-61,45],[-2,3]],[[7419,2339],[-2,1],[-4,2],[-5,4],[-6,5],[-56,42]],[[7380,2304],[-5,4],[-16,12],[-8,6],[-13,9],[-22,17],[-1,1],[-4,3],[-1,1]],[[8352,4867],[10,-5],[41,-20],[3,-2],[11,-6]],[[8499,5050],[12,-7],[3,-1],[4,12],[33,-17],[4,11],[11,-6],[9,-5],[3,-1]],[[8518,5096],[11,-6],[46,-24],[9,-5],[3,-2]],[[8618,5139],[-31,-80]],[[8549,5176],[67,-36],[2,-1]],[[8569,5225],[10,-5],[48,-26],[8,-5],[3,-1]],[[8638,5188],[-10,-25],[-10,-24]],[[8587,5273],[10,-6],[48,-26],[8,-5],[3,-1]],[[8656,5235],[-9,-24],[-9,-23]],[[8674,5282],[-9,-24],[-9,-23]],[[8738,5162],[-24,13],[-9,-24],[-10,6],[-2,1],[-46,25],[-9,5]],[[8757,5065],[-41,22],[-1,0]],[[8715,5087],[8,25],[8,25]],[[8688,5005],[18,50],[9,32]],[[3733,2721],[-98,-76],[-2,-2],[-1,-1]],[[3581,2834],[10,10],[43,30],[17,11],[14,10],[-11,79]],[[3654,2974],[12,-19],[3,-15],[19,6],[-6,23],[-11,19],[17,13],[21,17]],[[3709,3018],[6,-10],[4,-26],[6,-25],[19,7],[9,-42],[3,-20],[1,-16]],[[4001,2937],[-43,-35],[-67,-54]],[[3820,2949],[18,0],[1,10],[4,10],[5,6],[27,21],[10,-17],[12,-19],[19,15],[42,34]],[[3958,3009],[32,-54],[11,-18]],[[3709,3018],[14,10],[13,2]],[[3736,3030],[21,2]],[[3757,3032],[5,1],[6,2],[8,5],[32,24],[10,-17],[10,-17],[9,-17],[3,-1],[21,17],[15,15],[14,18],[12,18]],[[3902,3080],[21,-19],[13,-15],[22,-37]],[[3757,3032],[-3,21],[77,61],[12,-16],[15,17]],[[3858,3115],[13,-13],[13,-10],[18,-12]],[[3736,3030],[-1,8],[-12,21],[-3,11],[-4,31]],[[3716,3101],[19,6],[11,6],[70,55]],[[3816,3168],[13,-12],[8,-11],[2,-4],[11,-16],[8,-10]],[[3711,3146],[6,2],[5,2],[6,4],[3,3]],[[3731,3157],[42,32],[18,13]],[[3791,3202],[7,-13],[8,-11],[10,-10]],[[3749,3291],[2,-2],[2,-4],[5,-51],[0,-3],[-2,-2],[-24,-19],[-1,-42],[0,-11]],[[3774,3298],[3,-35]],[[3777,3263],[3,-22],[3,-18],[8,-21]],[[3855,3198],[-39,-30]],[[3777,3263],[14,2],[64,-67]],[[3915,3234],[-44,-23],[-16,-13]],[[3826,3326],[-2,-2],[-16,-11],[-3,-2],[-5,0],[-1,-15],[17,-20],[50,-55],[35,24],[1,1],[0,-1],[7,-8],[6,-3]],[[7262,826],[76,80],[2,2],[2,2],[3,3],[3,4],[5,6]],[[7113,915],[-45,0],[5,21],[54,0],[9,14],[6,10],[2,4]],[[7074,872],[-36,-38]],[[7028,842],[27,93],[-19,1],[7,24],[1,5]],[[6616,5393],[12,28],[8,17],[17,33],[9,19]],[[6572,5425],[9,27],[2,4],[5,12],[9,18],[9,18]],[[6606,5504],[10,18]],[[6572,5425],[-4,3],[-35,24],[-16,11],[-3,2]],[[6514,5465],[7,23],[4,10],[5,10]],[[6530,5508],[9,18],[9,18]],[[6548,5544],[58,-40]],[[6548,5544],[10,19]],[[6558,5563],[9,17],[12,26],[2,3],[9,17]],[[6530,5508],[-58,40]],[[6472,5548],[9,18],[9,19],[9,18]],[[6499,5603],[59,-40]],[[6499,5603],[6,12],[3,6]],[[6508,5621],[2,4],[11,21],[2,3],[8,18]],[[6455,5505],[-46,32]],[[6409,5537],[10,22],[5,11],[4,8],[6,12],[12,25]],[[6446,5615],[12,23],[6,13]],[[6464,5651],[44,-30]],[[6472,5548],[-6,-9],[-3,-10],[-8,-24]],[[2503,2159],[29,-49]],[[2503,2159],[10,10],[0,3],[10,-18],[16,13],[65,56],[-12,19],[15,13]],[[2607,2255],[16,14],[17,14],[16,14],[18,-29],[11,-18],[62,54]],[[2747,2304],[51,44],[4,-4],[5,5],[15,13],[3,3]],[[2825,2365],[3,-4]],[[2464,2222],[11,13],[30,25],[10,-18],[6,5],[8,8],[10,14],[21,41]],[[2560,2310],[8,-5],[9,-7],[7,-8]],[[2584,2290],[12,-17],[11,-18]],[[2389,2380],[2,-3],[2,-4],[2,-3],[11,-18],[22,-37],[52,43],[16,14]],[[2496,2372],[17,-28],[5,-6],[8,-6],[17,-11],[17,-11]],[[2536,2504],[3,-5],[3,-6]],[[2542,2493],[-31,-26]],[[2511,2467],[-48,-40],[6,-11],[27,-44]],[[2511,2467],[10,-19],[11,-18],[11,-18],[-15,-13],[18,-30],[1,-2],[-10,-14],[-2,0],[-3,1],[-4,5],[-16,26],[-16,-13]],[[2542,2493],[12,9],[7,4],[9,-22],[17,-28],[5,-6],[20,-14],[4,-3],[4,-4],[6,-4],[7,-12],[13,-21],[6,-5],[4,-2]],[[2656,2385],[-6,-12],[-2,-8]],[[2648,2365],[-4,-19],[-2,-6],[-3,-3],[-55,-47]],[[2734,2450],[-13,-7],[-4,-3],[-33,-28],[-19,-15],[-6,-7],[-3,-5]],[[2760,2473],[-3,-3],[-23,-20]],[[2714,2357],[-32,-28],[-20,7],[3,13],[1,6],[1,5],[-19,5]],[[2734,2450],[19,-32],[12,-18],[-36,-30],[-15,-13]],[[2747,2304],[-11,18],[-11,17],[-11,18]],[[2760,2473],[65,-108]],[[2779,2488],[43,-69],[3,-4],[4,0],[18,15],[3,5],[8,20],[14,13],[-8,14],[21,17],[18,16]],[[2883,2571],[3,-6],[9,-15],[2,-12],[2,-12],[4,-11]],[[2923,2611],[16,21]],[[2852,2767],[8,-13],[7,-4],[27,-18],[-3,-7],[-9,-14],[-15,-16]],[[2920,2824],[11,-19],[-46,-40],[18,-12],[22,18],[3,-1],[13,-18],[8,-8],[8,-6],[18,-8],[20,-9]],[[8244,3448],[38,-30],[6,11],[-2,10],[8,14],[10,21],[-1,2],[-6,4],[-25,19],[-28,-51]],[[7803,1101],[-31,8]],[[7772,1109],[2,12],[4,23],[5,22],[3,23]],[[7786,1189],[73,-20],[14,20],[13,20],[9,12]],[[7934,1216],[-32,-44],[-37,-53],[-20,-28]],[[7845,1091],[-42,10]],[[7786,1189],[5,22],[4,23],[2,10]],[[7772,1109],[-64,17]],[[7708,1126],[2,12],[5,23],[4,22],[4,23],[4,22],[-38,10],[4,23],[-58,15],[-9,4]],[[7701,1092],[4,23],[3,11]],[[7803,1101],[-7,-10],[-10,-21],[-9,-17],[-6,-14],[-5,-7],[-42,11],[-31,8],[4,21],[4,20]],[[7566,1164],[142,-38]],[[7701,1092],[-71,19]],[[7554,1166],[3,8],[28,59],[15,39],[1,1],[4,7]],[[7590,1280],[-53,-106],[0,-2]],[[7716,979],[17,18],[16,18],[-99,26]],[[7845,1091],[-8,-11],[-20,-25],[-26,-29],[-16,-10],[-15,-19],[-10,-8],[-8,-6],[-5,-12]],[[8099,2087],[-4,-70]],[[8056,2451],[35,35],[43,45]],[[8031,2526],[9,13],[2,6],[1,8],[2,8],[7,8],[7,10],[7,12],[2,2]],[[8101,2562],[16,-15],[17,-16]],[[5497,3222],[4,6],[31,42]],[[5532,3270],[7,-9],[4,-5],[4,-11],[14,7],[2,3],[14,18],[2,0],[3,-1],[14,-14],[15,-15]],[[5529,3272],[3,-2]],[[5488,3325],[29,35],[13,-14],[-18,-25],[13,-15]],[[5525,3306],[-12,-18]],[[5569,3320],[-37,-50]],[[5525,3306],[26,32]],[[5551,3338],[16,-16]],[[5567,3322],[2,-2]],[[5490,3360],[23,30],[3,0],[39,-41],[1,-3],[-5,-8]],[[5476,3373],[33,45]],[[5509,3418],[61,-67],[-3,-29]],[[5489,3439],[20,-21]],[[5532,3446],[-23,-28]],[[5550,3518],[20,-22],[-38,-50]],[[5584,3482],[-38,-50]],[[5546,3432],[-14,14]],[[5614,3520],[-2,-3],[-17,-21],[-11,-14]],[[5584,3482],[14,-15],[-24,-33],[14,-14],[25,32],[14,-16]],[[5627,3436],[-15,-19],[-24,-30],[-42,45]],[[5627,3436],[28,37],[2,2]],[[5675,3458],[-3,-4],[-43,-56],[-38,-49]],[[5663,3327],[-22,-31]],[[5710,3422],[-3,-4],[-7,-9],[-23,-28],[-13,-18],[-3,-4],[-12,-17],[14,-15]],[[5748,3274],[-2,2],[-16,16],[-36,36],[-6,3],[-8,2],[-8,-3],[-9,-3]],[[7316,2249],[-2,5],[-53,39],[-3,2],[-11,9]],[[7352,2281],[-2,-2],[-15,-13],[-2,-2],[-17,-15]],[[7415,2207],[-10,7],[-35,27],[-2,1],[-9,7],[-8,-9],[-20,-25],[-14,-17]],[[7317,2198],[-14,-17],[-14,-17]],[[7289,2164],[-35,27],[-3,2]],[[7251,2193],[8,7],[8,7],[17,14],[17,15],[15,13]],[[7369,2159],[-8,6],[-11,8],[-23,17],[-10,8]],[[7307,2125],[-7,5],[-5,3],[-20,15]],[[7275,2148],[7,8],[7,8]],[[7154,2101],[18,15],[18,16],[32,-24],[4,-2],[9,-7],[13,18],[5,7],[8,9],[7,7],[7,8]],[[7246,2196],[17,15],[16,14],[-66,50]],[[4915,4124],[-9,-12],[-14,-10],[-17,-7],[-23,-10],[-18,-11],[-17,17],[-13,13],[-17,-21],[-15,-17]],[[4716,4029],[2,3],[2,7],[3,14],[1,14],[3,13],[4,8],[5,6],[7,8],[8,6],[7,0],[2,-1],[11,-11],[6,-1],[16,17],[26,27],[6,6],[6,15],[9,20],[9,16],[5,9],[16,19],[5,5],[13,-6],[8,0],[8,3],[8,7],[18,11],[7,5],[13,10],[9,10],[0,2],[-3,2],[-2,2],[-2,3],[-1,3],[4,7],[3,7],[5,1],[8,15],[4,1],[6,1]],[[4981,4313],[12,-15],[3,-4],[4,-3],[5,-4],[6,-3]],[[5011,4284],[2,-2],[13,-12],[2,-3],[13,-14],[11,-13],[4,-6],[3,-5]],[[5059,4229],[-10,-9],[-7,-8]],[[5042,4212],[-18,-9],[-13,-7],[-23,-12],[-29,-16],[-12,-6],[-2,-1],[-2,-1],[-4,-3],[-9,-10],[-15,-23]],[[5110,4308],[-9,-9],[-13,-19],[14,-14]],[[5102,4266],[-19,-30],[-12,13],[-12,-20]],[[5011,4284],[2,10],[-4,1],[5,28],[1,2],[2,2],[4,0],[4,-3],[4,-4],[4,-3],[14,-3],[2,1],[1,1],[8,11],[17,-17],[15,20],[20,-22]],[[5120,4314],[-10,-6]],[[4981,4313],[5,1],[5,1],[3,8],[1,10],[1,6],[3,17],[2,4],[6,6],[15,18],[13,17],[11,13]],[[5046,4414],[2,-4],[8,-9]],[[5056,4401],[50,-52],[28,-30],[-14,-5]],[[5120,4314],[25,-26]],[[5168,4263],[-15,-19],[-13,-18],[-38,40]],[[5056,4401],[16,20],[49,-52],[14,19],[-5,6],[12,18],[14,19],[48,-49],[5,6],[3,5],[3,5],[2,-2]],[[5046,4414],[17,20],[1,0],[34,25],[12,5],[10,6],[16,2],[8,1],[2,1],[5,2],[17,2],[13,0],[14,0],[1,-3],[-2,-8],[0,-7],[5,-17],[1,-5],[0,-3],[-3,-3],[-7,-6],[-3,-7],[-1,-2],[1,-8],[8,-4],[7,-1],[4,-1],[-3,10],[0,10],[0,9],[3,13],[0,10],[1,10],[1,5],[3,3],[2,4],[3,2],[0,2],[5,4],[6,0],[6,2],[6,4],[8,2],[5,4],[3,8],[8,6],[9,3],[5,3],[3,5],[6,6],[19,24],[3,4]],[[5308,4556],[8,-8],[7,-8],[3,-3]],[[5326,4537],[-3,-4],[-8,-13],[-16,-17],[-17,-17],[-14,-15]],[[5268,4471],[-15,-17],[-14,-15],[-5,-6],[-3,-5],[-2,-4],[-1,-2]],[[5177,4187],[-20,21],[-2,2],[-16,-21]],[[5139,4189],[-41,36],[-16,-22]],[[5082,4203],[-5,6],[-4,4],[-4,4],[-3,4],[-7,8]],[[6601,1293],[-5,-3],[-3,-2],[-7,-5],[-29,-23],[-33,-30],[0,-5],[-2,-1],[-2,-2],[-2,-1],[-2,-2],[-4,-3],[-8,-5],[-4,-3]],[[6461,1364],[7,14],[6,14]],[[6521,1212],[1,2]],[[5409,4205],[-44,-59],[-1,-2],[-12,-16]],[[5352,4128],[-40,41],[-3,0],[-3,-1],[-22,-28]],[[5304,4210],[11,-11],[8,-9],[44,59]],[[5367,4249],[42,-44]],[[5348,4270],[11,-12],[8,-9]],[[5359,4285],[12,16]],[[5371,4301],[62,-64]],[[5433,4237],[-13,-17],[-11,-15]],[[5371,4301],[14,17],[13,18],[13,16]],[[5411,4352],[13,18]],[[5424,4370],[62,-64]],[[5486,4306],[-14,-18]],[[5472,4288],[-12,-16],[-13,-18],[-14,-17]],[[5297,4350],[12,16],[13,18],[13,16],[9,3],[16,2],[32,-33],[19,-20]],[[5447,4399],[-10,-12],[-13,-17]],[[5268,4471],[40,-41],[12,16],[15,19],[32,-34],[16,19],[6,9],[7,8],[22,-6],[28,-28],[-14,-19],[15,-15]],[[5488,4445],[-4,-4],[-2,-2],[-13,-16],[-17,-19],[-5,-5]],[[5326,4537],[2,-2],[1,-1],[9,-9],[3,-3],[4,-3],[3,-2],[2,-2],[3,-2],[3,-2],[5,-4],[7,-4],[2,-1],[2,-1],[6,-3],[7,-3],[9,-3],[5,-2],[4,-2],[5,-1],[4,-1],[3,-1],[3,-1],[4,-1],[4,-2],[3,-1],[3,-1],[3,-1],[3,-1],[3,-1],[3,-2],[4,-1],[3,-2],[2,-2],[3,-1],[4,-2],[3,-2],[3,-2],[3,-2],[3,-2],[2,-1],[2,-2],[3,-3],[4,-3],[2,-2],[3,-2]],[[5482,4531],[22,-22],[19,-20],[1,-2]],[[5524,4487],[-19,-22],[-8,-10],[-9,-10]],[[5326,4537],[15,23]],[[5341,4560],[20,-21],[13,-12],[6,-6],[27,30],[14,13],[22,-21],[9,18],[15,-15],[15,-15]],[[5432,4607],[60,-62]],[[5492,4545],[-10,-14]],[[5341,4560],[12,18],[17,26],[23,19],[29,-29],[10,13]],[[5432,4607],[3,4],[4,5],[4,5],[9,12],[3,0],[3,0],[4,2],[1,2],[1,2],[56,-54]],[[5520,4585],[-2,-4],[-15,-21],[-11,-15]],[[5463,4686],[11,-10],[26,-15],[51,-30]],[[5551,4631],[-1,-3],[-11,-15],[-19,-28]],[[5308,4556],[1,2],[12,19],[9,15],[9,12],[3,11],[9,15],[14,15],[3,-3],[2,2],[-3,3],[2,3],[2,5],[2,7],[3,9],[4,16],[2,3],[4,5],[5,2],[5,0],[7,1],[7,9],[2,1],[14,0],[6,1],[3,2]],[[5620,4619],[-10,-22]],[[5610,4597],[-26,15],[-33,19]],[[5571,4675],[-10,-22],[59,-34]],[[5659,4720],[-8,-23],[0,-3],[-8,-21],[-2,-3],[-3,-7]],[[5638,4663],[-8,-21]],[[5630,4642],[-10,-23]],[[5627,4760],[-9,-23],[18,-10],[-8,-20],[12,-10],[4,-2],[2,3],[6,17],[3,4],[4,1]],[[5742,4702],[-9,-25],[-51,27],[-7,-18],[-4,-3],[-4,-1],[-10,6],[-2,3],[0,3],[6,17],[1,5],[-3,4]],[[5667,4740],[75,-38]],[[3044,2793],[-25,-21],[-8,-9],[-6,-12],[-3,-7]],[[2920,2824],[16,13]],[[7282,7043],[16,13],[31,26],[19,17],[14,7],[8,7],[11,10],[14,13]],[[7271,7060],[-32,51],[-11,16]],[[7228,7127],[26,22],[20,18],[30,26],[7,7],[6,5],[8,6],[15,13]],[[7212,7062],[-23,35]],[[7189,7097],[13,11]],[[7202,7108],[14,11],[2,0],[8,6],[2,2]],[[7202,7108],[-14,22]],[[7188,7130],[23,19],[2,2]],[[7213,7151],[15,13],[-44,70]],[[7213,7151],[-33,51]],[[7180,7202],[-11,19]],[[7188,7130],[-32,52]],[[7156,7182],[22,18],[2,2]],[[7189,7097],[-2,-3]],[[7187,7094],[-47,74]],[[7140,7168],[16,14]],[[9437,6162],[2,-8],[3,-1],[-21,-80],[-3,2],[-3,0],[-1,-4],[-2,-7],[-1,-4]],[[9221,5808],[-2,1],[-8,5],[-26,14],[-52,28],[-9,6],[-41,22],[-17,9],[8,21],[47,-26],[11,-6],[8,21],[89,-49],[11,-5],[2,-2]],[[5690,1018],[1,-12],[3,-1],[0,-4],[-1,-2],[-5,0],[-1,1],[-1,4],[0,8],[-1,6],[-13,1],[-6,-6],[-1,-2],[6,-2],[0,-2],[-12,2],[-1,-5],[-10,2],[-23,-10],[-1,3],[15,8],[-18,28],[-6,6],[-7,3],[-8,2],[-7,1],[-6,2],[-12,8],[-14,9],[-5,2],[-12,6],[-12,3],[-7,1],[-4,1],[-4,0],[-14,1],[-3,2],[-1,4],[-4,2],[-6,1],[-6,3],[-7,-3],[-9,5],[-3,0],[-8,4],[-5,-1],[-11,-6],[-2,0],[-11,1],[-6,-5],[-23,13],[-22,15],[-20,11],[-6,3],[-3,-1],[-10,0],[-3,-1],[-9,-3],[-10,1],[-6,1],[-8,3],[-10,4],[-12,0],[-3,2],[-3,1],[-16,7],[-5,6],[-9,15],[-6,5],[-6,0],[-14,4],[-3,2],[-4,2],[-25,7],[-46,16],[-14,2]],[[5122,1221],[2,1],[1,-1],[1,-1]],[[5126,1220],[9,-2],[17,1],[11,1],[11,-5],[10,-3],[12,-2]],[[5196,1210],[9,-2],[10,-4]],[[5215,1204],[13,-7],[6,-7],[8,-12],[9,-18],[6,-11],[8,-4],[25,-8],[12,-2],[20,-2]],[[5322,1133],[20,5],[9,3],[12,6],[11,5],[11,0]],[[5385,1152],[11,-3],[12,-6]],[[5408,1143],[2,-3],[0,-1],[3,-5],[2,-2],[3,-3],[2,-3],[4,-4],[5,-4],[17,-10],[-4,33],[21,3],[13,1],[11,2]],[[5408,1143],[-2,37],[26,3],[-8,108]],[[5424,1291],[26,-10],[27,-9]],[[5385,1152],[-13,159]],[[5372,1311],[23,-9],[29,-11]],[[5326,1327],[22,-8],[14,-4],[1,-1],[9,-3]],[[5322,1133],[-9,92],[-20,-2],[-6,85]],[[5287,1308],[20,0],[21,-1],[-2,20]],[[5215,1204],[1,3],[0,17],[-1,6],[-2,3],[3,2],[9,15],[3,9],[-1,12],[-4,24],[22,5],[19,6],[23,2]],[[5196,1210],[-13,64],[-18,99],[23,-9],[-3,16]],[[5185,1380],[23,-9],[26,-9],[12,-5],[18,-7],[19,-7],[21,-8],[22,-8]],[[5126,1220],[-1,8],[11,2],[-29,168],[0,4]],[[5107,1402],[10,-1],[3,3],[17,-6]],[[5137,1398],[25,-10],[23,-8]],[[5318,1421],[8,-94]],[[5137,1398],[2,2],[-3,14]],[[5136,1414],[20,4]],[[5156,1418],[11,3],[11,-1],[20,1],[23,-1],[13,1],[22,0],[21,-1],[20,1],[21,0]],[[5310,1509],[8,-88]],[[5156,1418],[-20,106],[12,0],[12,-10],[21,0],[21,0],[68,-3],[21,-1],[19,-1]],[[5438,1423],[-26,-2]],[[5412,1421],[-2,1],[-24,0],[-22,-1],[-24,1],[-22,-1]],[[5310,1509],[22,-1],[22,-2],[18,-1],[19,0],[20,-1],[20,-1],[3,-24],[4,-56]],[[5512,1502],[7,-83]],[[5519,1419],[-21,-2],[-19,2],[-20,5],[-21,-1]],[[5136,1414],[-18,88],[-1,3],[-4,22],[-1,6],[-1,4],[-1,4],[-2,4]],[[5108,1545],[0,5]],[[5424,1291],[-3,29],[-9,101]],[[5519,1419],[8,-100]],[[5107,1402],[-24,112],[1,15],[-1,5],[-2,4],[-1,3],[-2,6],[30,-2]],[[5107,1402],[-14,5]],[[5093,1407],[-4,15],[-8,40]],[[5081,1462],[-11,63],[0,1],[-1,1],[-1,1],[-36,1],[14,-76]],[[5046,1453],[6,-31]],[[5052,1422],[-43,16],[-5,2],[-18,6],[-18,7],[-5,2],[-71,26]],[[2859,3223],[3,4],[16,13],[9,5],[2,2],[48,38],[16,11],[18,16]],[[6514,5465],[-59,40]],[[6491,5396],[-20,14],[-18,12],[-20,15]],[[6433,5437],[6,16],[1,4],[7,20],[7,23],[1,5]],[[6514,5465],[-2,-4],[-7,-23],[-7,-21],[-7,-21]],[[6530,5369],[-20,13],[-19,14]],[[6408,5362],[9,25]],[[6417,5387],[16,50]],[[6417,5387],[-21,14],[-21,14],[-16,12]],[[6359,5427],[12,25],[9,21]],[[6380,5473],[15,-11],[13,-9],[5,-3],[20,-13]],[[6384,5295],[-9,5],[-43,20],[-9,5]],[[6323,5325],[8,23],[8,22],[7,22]],[[6346,5392],[13,35]],[[6346,5392],[-20,10],[-18,9]],[[6308,5411],[12,43]],[[6320,5454],[20,-13],[6,11],[17,33],[17,-12]],[[6323,5325],[-36,17]],[[6287,5342],[7,24],[7,22],[3,11],[4,12]],[[6287,5342],[-5,2],[-22,12],[-6,8],[-10,10]],[[6244,5374],[9,8],[3,2],[7,5],[6,5],[6,7],[6,22],[10,29],[0,1],[1,2],[1,2],[1,3],[1,4],[2,6]],[[6297,5470],[18,-13],[5,-3]],[[6244,5374],[-4,6],[-4,1]],[[6236,5381],[13,20],[4,8],[2,13],[4,29],[-4,11],[-2,22],[-2,12],[1,2],[5,7],[5,6],[5,6],[2,8],[3,13],[0,5],[0,6],[2,20],[0,1],[-1,4],[0,7],[-6,10],[5,4],[5,4],[4,6],[3,10],[-1,3],[-3,3]],[[6289,5624],[4,-4],[7,-5],[4,-4],[4,-3],[3,-3],[3,-2],[5,-3]],[[6319,5600],[-1,-5],[-1,-5],[-1,-9],[2,-15],[0,-8],[-2,-11],[0,-6],[-2,-23],[-6,-18]],[[6308,5500],[-5,-13],[-6,-17]],[[6319,5600],[4,-3],[13,-9],[16,-11],[2,-2],[3,-1]],[[6357,5574],[-1,-4],[-4,-13],[-9,-27],[-13,-43],[-5,3],[-17,10]],[[6357,5574],[12,-10],[21,-15],[19,-12]],[[6357,5574],[10,34],[7,24],[-4,2]],[[6370,5634],[8,28]],[[6378,5662],[5,-4],[63,-43]],[[2766,3246],[18,13],[3,-4],[14,-10],[30,24],[5,-8],[6,-10],[16,9],[14,5],[6,2],[6,0],[6,0],[5,1],[4,2],[43,33],[-4,9],[-2,4],[-3,7],[-1,1],[-1,0],[-1,0],[-7,-4],[-4,-2],[-4,10],[-1,2],[-2,0],[-23,-10],[-49,-24],[-7,13],[-1,4]],[[2757,3266],[11,7],[7,5],[15,10],[13,8],[12,8],[11,5],[6,4]],[[2693,3331],[20,8],[17,8],[16,9],[13,8],[10,6],[9,7],[7,5],[6,6]],[[2666,3320],[-9,19],[-6,16],[-2,7],[-2,9],[1,10],[1,8]],[[2649,3389],[6,13],[6,8],[6,6],[5,4],[6,3],[28,9],[4,1],[10,0],[4,1],[6,3],[7,2],[6,2],[7,0],[16,0]],[[2766,3441],[0,-6],[2,-6],[8,-17]],[[2608,3491],[18,-40],[2,-7],[2,-6],[0,-8],[1,-11],[1,-4],[2,-8],[4,-7],[4,-5],[7,-6]],[[2705,3480],[9,-19],[20,2],[10,2],[4,1],[10,7],[7,3],[4,0],[2,-4],[-4,-22],[-1,-9]],[[2591,3556],[20,0],[25,0],[4,-18],[8,3],[6,4],[11,-25],[8,-17],[8,-18],[7,-16],[17,11]],[[2705,3480],[-7,15],[-15,34],[-1,4],[0,5],[0,5],[1,5],[3,10],[1,3],[2,2],[3,1],[5,0],[19,0],[2,7],[2,6],[3,4],[4,4],[7,4]],[[2734,3589],[5,-11],[27,-59],[17,11]],[[2709,3645],[15,-33],[10,-23]],[[2633,3686],[0,-4],[0,-3],[2,-6],[2,-4],[5,-2],[4,-1],[4,0],[19,2],[5,0],[4,0],[2,0],[2,0],[2,-1],[4,-1],[7,-4],[6,-5],[4,-6],[4,-6]],[[2709,3645],[17,11],[9,-20],[15,7],[15,6],[14,3],[13,2],[16,1]],[[2808,3655],[17,-35],[9,-21],[16,9],[3,1],[21,-46]],[[2792,3704],[-5,-26],[9,1],[6,0],[7,-1]],[[2809,3678],[-2,-12],[-1,-5],[2,-6]],[[2809,3678],[20,-3],[-1,-13],[9,-19],[6,5],[2,1],[38,-7],[2,-2],[1,-2],[-3,-19],[0,-8],[0,-5],[1,-6],[3,-5],[3,-5],[5,-3],[6,-3],[6,-1],[7,1],[5,1],[19,12],[3,2],[3,5],[1,5],[0,3],[-8,18],[-2,2],[-2,1],[-24,4],[-2,1],[-2,3],[3,20],[43,-7]],[[6797,6703],[-2,3],[-5,7],[-5,8],[-35,55]],[[6750,6776],[2,15],[1,11],[0,3],[2,33],[0,6],[2,7],[5,16],[55,-88],[2,-3]],[[6819,6776],[11,-17]],[[6830,6759],[-17,-14],[-6,-5],[-4,-16],[-6,-21]],[[6841,6621],[-2,4],[-12,20],[-7,10],[-25,40]],[[6795,6695],[2,8]],[[6830,6759],[39,-63],[26,-40],[2,-4]],[[6791,6593],[-2,4],[-18,29],[4,13],[4,11],[8,22],[2,6],[6,17]],[[6841,6621],[-16,-9],[-16,-9],[-18,-10]],[[6710,6627],[2,3],[2,5],[4,13],[2,6],[1,5],[2,7],[3,9],[6,12],[1,4]],[[6791,6593],[-10,-6],[-7,-4],[-1,-1],[-8,-7],[-6,-5]],[[6859,6594],[-14,-12],[-15,-13],[-13,-12],[-1,-2],[1,-2],[15,-22],[20,-31]],[[5727,3208],[-18,18],[-16,18],[-13,-17],[-2,-2],[-20,20],[-14,16]],[[3136,3279],[9,-25],[4,-14],[2,-11],[4,-23],[6,-11],[-17,-13],[10,-17],[-41,-33],[0,-3],[9,-15],[12,-19]],[[3134,3095],[-7,-6],[-19,-8]],[[3267,3231],[-3,-2],[-32,-25],[-10,-9],[-5,-6],[-6,-9]],[[3211,3180],[-18,-29],[-5,-7],[-10,-12],[-9,-9],[-35,-28]],[[3346,3097],[-3,-2],[-23,-19]],[[3320,3076],[-12,21],[-17,28],[-10,18],[-44,-34],[-30,24]],[[3207,3133],[20,33],[-16,14]],[[3320,3076],[-37,-30],[-26,-20],[-4,-2],[-9,0]],[[3244,3024],[-4,1],[-23,2]],[[3217,3027],[1,13],[-10,18],[15,12],[15,12],[-17,14],[-23,18],[-1,3],[10,16]],[[3305,2980],[-6,3],[-5,0],[-5,-1],[-18,-14],[-8,-6],[-76,-61],[-12,21]],[[3175,2922],[-10,17],[56,46],[1,18],[19,-2],[3,23]],[[3385,3031],[-4,-2],[-26,-12],[-5,0],[-34,-27],[-11,-10]],[[3143,2978],[38,30],[21,18],[5,1],[10,0]],[[3175,2922],[-15,-13],[-40,-33],[-2,1],[-31,53],[-7,-3],[-9,-6],[-2,-2]],[[3305,2980],[42,-70],[29,-52],[8,-15],[7,-19],[2,-11],[1,-11],[-3,-44],[1,-11],[2,-8],[4,-11],[4,-9],[2,-3]],[[3385,3031],[19,-32],[15,-23],[10,-13],[21,-20],[18,-21]],[[3468,2922],[29,-47],[30,-51],[3,-4]],[[3487,3068],[-4,-9],[-1,-9],[-1,-8],[2,-9],[2,-9],[12,-30],[8,-22],[9,-23]],[[3514,2949],[-6,-1],[-9,-4],[-12,-7],[-19,-15]],[[3514,2949],[10,1],[7,-1],[6,2],[7,3],[19,16],[20,15],[7,8],[15,21]],[[3605,3014],[21,-35],[4,-6]],[[3630,2973],[2,-3],[4,-9]],[[3636,2961],[-2,-7],[-2,-6],[-2,-4],[-6,-4],[-8,-6],[-21,-17],[-16,-13],[-22,-16],[-5,-5]],[[3653,3081],[-7,-7],[-5,-7]],[[3641,3067],[-15,-22],[-21,-31]],[[3641,3067],[22,-21],[5,-6],[0,-3],[2,-1],[2,0],[5,-16],[-19,-20],[-18,-18],[-10,-9]],[[3654,2974],[-8,-7],[-10,-6]],[[7252,7640],[11,-18],[2,-1],[1,0],[6,5],[2,1],[2,-1],[36,-56],[2,-3]],[[7336,7636],[-6,-9],[-7,-6],[-12,-11],[15,-24],[2,-3],[-14,-16]],[[7350,7614],[-13,-15],[2,-3],[16,-26]],[[7382,7644],[12,-19],[10,-15],[3,-5],[4,-8],[6,5],[7,-4],[2,-1],[1,-2],[19,-29],[12,-19]],[[7413,7680],[11,-17],[65,-97]],[[7452,7720],[15,-18],[11,-18],[34,-51],[15,-23]],[[7488,7751],[2,-3],[17,-26],[53,-84]],[[3946,3282],[-1,-13],[-1,-6],[0,-3],[-1,-1]],[[3943,3259],[-2,-4],[-6,-6],[-19,-14],[-1,-1]],[[4021,3259],[-17,-18],[-3,-1],[-2,-2],[-4,2],[-10,15],[1,1],[1,2],[0,3],[-1,1],[-3,1],[-4,-1],[-1,2],[-13,12],[-2,2],[-3,1],[-3,2],[-4,0],[-7,1]],[[4067,3169],[-94,77],[-30,13]],[[4166,3063],[-35,-28],[-6,-5],[-3,-2],[-120,-88],[-1,-3]],[[3907,1823],[-3,14],[-13,51],[-5,6],[-2,33],[-3,8],[0,7],[-2,13],[-3,11],[-2,5],[0,6],[-6,13],[2,4],[-11,48],[-2,3],[-7,13],[-17,29]],[[3864,1825],[1,18],[0,24],[0,24],[-20,1],[-5,0],[-21,-7]],[[3819,1885],[-3,12],[-11,15],[-1,3],[-11,49],[-19,-6],[-20,-7],[-4,19],[16,15],[1,2],[-1,3],[-6,17],[-2,1],[-2,1],[-18,-14],[-8,-7],[-7,-5],[-21,-17],[-3,-28],[-10,2],[-8,-3]],[[3819,1885],[-19,-6],[-10,-3],[-9,-2],[-6,-2],[1,-12],[0,-9],[4,-14],[-46,-15],[-3,1],[-1,2],[-5,22],[-11,-3],[-5,-3],[-5,-5]],[[7893,7399],[48,53]],[[7941,7452],[37,43],[3,4],[51,58],[19,20],[19,21],[54,59],[33,35],[13,15]],[[7878,7584],[-12,-15],[15,-23],[3,-6],[5,-8],[8,-12],[17,-26],[24,-38],[3,-4]],[[7765,7647],[2,-3],[12,-20],[20,24],[10,-16],[2,-1],[2,1],[19,24],[12,-18],[18,-29],[16,-25]],[[7967,7659],[-44,-55],[-2,0],[-1,1],[-11,16],[-31,-37]],[[7805,7698],[2,-3],[13,-20],[12,15],[42,-66],[13,17]],[[7887,7641],[15,18],[15,19]],[[7917,7678],[16,-26],[21,26],[13,-19]],[[7861,7768],[2,-3],[12,-20],[13,-20]],[[7888,7725],[-16,-20],[-14,-18],[29,-46]],[[7888,7725],[13,16],[29,-46]],[[7930,7695],[-13,-17]],[[7958,7730],[-14,-18],[-14,-17]],[[7917,7839],[2,-3],[13,-20]],[[7932,7816],[-16,-20],[42,-66]],[[7958,7730],[16,19]],[[7974,7749],[16,-26],[11,-16],[0,-4],[-34,-44]],[[7989,7819],[-33,-42],[18,-28]],[[7932,7816],[12,-19],[32,40],[1,2],[-1,2],[-11,17],[14,16]],[[6340,5706],[-4,-13],[15,-9],[9,-8],[-9,-28],[2,-2],[17,-12]],[[6395,5712],[-3,-7],[-2,-5],[-4,-12],[-8,-26]],[[6403,5730],[5,-3],[8,-5],[2,-2],[45,-31]],[[6463,5689],[5,-2],[2,-1],[-1,-3],[-3,-20],[-2,-12]],[[6431,5791],[4,-4],[2,-2],[7,-5],[49,-34]],[[6493,5746],[-10,-20],[-3,-5],[-7,-14],[-2,-4],[-8,-14]],[[6493,5746],[8,-6],[42,-28],[8,-6]],[[6493,5746],[10,20],[11,23],[12,22]],[[6526,5811],[51,-36],[7,-5]],[[6450,5833],[5,9],[6,13]],[[6461,5855],[4,-3],[61,-41]],[[6461,5855],[9,20],[6,15]],[[2038,2561],[8,17],[8,12],[7,6],[9,12],[8,6],[5,2],[12,15],[4,1],[7,-7],[6,0],[1,4],[-3,8],[-1,23],[1,10],[3,14],[2,7],[8,9],[10,13],[2,2],[-2,8],[-5,6],[0,2],[-2,14],[1,7],[10,14],[5,-3],[1,-4],[1,-2],[-5,-17],[-3,-2],[-1,-4],[1,-4],[3,2],[9,9],[1,5],[1,5],[-2,8],[-2,4],[0,1],[-1,10],[7,12],[4,5],[6,4],[5,7],[5,3],[3,2],[3,1],[3,2]],[[2181,2810],[2,-3],[30,-39],[3,-1],[9,-12],[4,-6]],[[2181,2810],[3,3],[1,5],[7,5],[3,2],[3,6],[3,2],[5,3],[2,1],[3,-1],[9,-7],[10,-4],[5,0],[7,2],[14,13],[4,0],[4,0],[4,2],[6,0],[4,4],[5,7],[1,2],[19,11],[3,1],[9,0],[4,2],[3,2],[7,8]],[[2329,2879],[0,-1],[6,-13],[9,-23],[9,-15],[-7,-10]],[[2329,2879],[1,1],[9,2],[13,10],[9,11],[1,2],[3,5],[4,5],[0,4],[1,2],[3,0],[1,2],[9,27],[14,19],[8,14],[4,6],[3,7],[4,5],[4,9],[7,12],[5,9],[5,12],[1,5],[3,14],[5,9],[3,7]],[[7187,7094],[-15,-13]],[[7172,7081],[-47,74]],[[7125,7155],[15,13]],[[7109,7141],[16,14]],[[7172,7081],[-16,-14]],[[7156,7067],[-47,74]],[[7094,7129],[15,12]],[[7156,7067],[-14,-12]],[[7142,7055],[-48,74]],[[7094,7129],[-11,18]],[[7083,7147],[51,43],[32,28],[3,3]],[[7083,7147],[-11,17]],[[7072,7164],[16,15],[14,11]],[[7102,7190],[15,13]],[[7117,7203],[16,14]],[[7133,7217],[22,19],[2,2]],[[7133,7217],[-40,62]],[[7117,7203],[-39,60]],[[7102,7190],[-37,58]],[[7072,7164],[-33,51]],[[7083,7147],[-13,-11]],[[7070,7136],[-40,64],[-13,-20],[-12,19]],[[7005,7199],[23,34]],[[7070,7136],[-16,-13],[-15,-13],[-45,70]],[[6994,7180],[11,19]],[[6994,7180],[-11,-19]],[[7076,6999],[-47,75],[-14,-13],[-12,19]],[[7003,7080],[20,17],[-11,19],[-12,17],[-17,28]],[[7003,7080],[-29,-26],[-14,-13]],[[7018,6949],[-12,19]],[[7006,6968],[-24,37],[-22,36]],[[7006,6968],[-3,-2],[-16,-14],[-11,18],[-36,-31],[-11,17],[-19,9],[-7,-21]],[[6903,6944],[-19,8]],[[7030,6929],[-2,-2],[-15,-13],[-38,-32]],[[6975,6882],[-15,-13],[7,-12],[11,-18]],[[6978,6839],[-2,-2],[-19,-17],[-20,5],[-3,3],[-46,73],[8,24],[1,2],[2,2],[9,9],[3,2],[-2,1],[-6,3]],[[4974,3642],[-2,37],[-11,0],[-5,0],[-5,1],[-5,3],[-6,6],[-5,13],[-4,8],[-4,8],[1,4],[16,10],[12,-30],[2,-2],[18,2],[9,1],[5,1],[6,2],[6,4],[7,8],[41,54],[2,3]],[[5052,3775],[29,-29],[12,-13],[25,-27]],[[4946,3777],[62,39],[-11,11],[3,3]],[[5000,3830],[12,-13],[11,-11],[29,-31]],[[4954,3878],[14,-14],[13,-14],[2,-3]],[[4983,3847],[17,-17]],[[4851,3985],[7,-8],[-2,-2],[-22,-27],[-12,-14],[-1,-1],[1,-2],[27,-28],[15,-16],[22,29],[12,15],[2,3],[11,-12],[20,-20],[2,-2],[21,-22]],[[5034,3892],[-4,-2],[-5,-3],[-9,-5],[-7,-6],[-6,-4],[-3,-4],[-5,-5],[-12,-16]],[[4954,3878],[12,16],[-14,15],[-14,13],[-1,2],[1,1],[3,5],[11,13],[1,3],[0,2],[-40,41],[-23,25],[-8,7]],[[4882,4021],[7,9],[75,-80],[9,14],[34,52],[12,16]],[[5019,4032],[7,-9]],[[5026,4023],[-26,-35]],[[5000,3988],[-12,-17],[39,-41],[-13,-16],[7,-8],[11,-11],[2,-3]],[[4851,3985],[18,21],[13,15]],[[4955,4047],[-26,-42],[-38,39],[-15,-17],[6,-6]],[[4915,4124],[11,-13],[1,-6],[11,-11]],[[4938,4094],[-15,-14],[15,-15],[17,-18]],[[5012,4039],[7,-7]],[[4955,4047],[11,14],[5,-7],[7,-9],[22,-23],[12,17]],[[5030,4106],[-22,-14],[-21,-26],[25,-27]],[[4938,4094],[26,23],[9,10],[2,2],[2,0],[1,0],[1,0],[6,-5],[15,13],[14,-14],[16,-17]],[[5069,4101],[-50,-69]],[[5030,4106],[17,-16],[14,19],[8,-8]],[[5082,4120],[-13,-19]],[[5042,4212],[6,-12],[48,-51],[-18,-24],[4,-5]],[[8356,8290],[-53,86],[-2,-2]],[[8292,8241],[-1,3],[-50,78]],[[8217,8176],[13,12],[-2,2],[-5,10],[-43,68]],[[8350,8150],[-12,-11],[-17,-15],[-5,-4],[-28,-24],[-13,-11],[-45,71],[-13,20]],[[8217,8176],[-36,-31],[-2,-1],[-2,3],[-13,19],[-40,-35],[-23,36]],[[8101,8167],[15,13],[23,20],[2,1],[-13,22]],[[8101,8167],[-16,-14],[-16,-15],[-27,-22],[-13,-12],[-14,-12],[-2,-3]],[[7944,8196],[4,5],[15,20],[16,23],[21,-20],[-12,-17],[-1,-4],[1,-3],[10,-15],[15,13],[2,1],[2,-1],[4,-6],[41,35]],[[8220,7760],[-3,4],[-17,27],[-28,42],[-4,7],[-23,35],[-26,41],[-8,13],[-9,14],[-2,3]],[[5081,1462],[-35,-9]],[[5093,1407],[-7,3],[-34,12]],[[5148,4153],[-16,11],[-22,14],[-28,25]],[[5139,4189],[17,-17],[-8,-19]],[[5263,4080],[-30,-44],[-37,38],[-14,15],[-18,-11]],[[5164,4078],[-7,-10],[-63,62],[-12,-10]],[[5148,4153],[40,-24],[29,-19],[12,-7]],[[5352,4128],[-13,-17],[-12,-16]],[[5359,4062],[-32,33]],[[5352,4128],[52,-56]],[[5359,4062],[-3,-4],[-12,-11],[-3,-1],[-2,1],[-27,28]],[[5341,4014],[-42,44]],[[5156,3767],[-20,20],[-37,40],[-7,-1],[-11,-14],[-15,-19],[-14,-18]],[[5034,3892],[9,1],[12,0],[10,1],[6,2],[7,2],[7,4],[26,16]],[[5111,3918],[55,33],[4,1]],[[5170,3952],[9,4],[3,1],[3,2],[9,5]],[[5194,3964],[25,15],[2,1],[16,22],[2,3],[7,14],[3,6],[32,44]],[[5000,3988],[15,-14],[26,-27],[5,-5],[5,-2],[5,0],[6,1],[4,3],[3,3],[4,3],[10,12]],[[5083,3962],[8,-8],[6,-7],[5,-7],[7,-18],[2,-4]],[[5026,4023],[8,-10],[20,-20]],[[5054,3993],[14,-15],[15,-16]],[[5054,3993],[12,17],[24,34],[3,1],[2,-1],[11,-12]],[[5106,4032],[-26,-37],[25,-25],[1,-1],[1,0],[3,1],[17,10],[5,4],[3,2],[3,4],[2,1],[2,-3],[1,-1],[10,-11],[12,-12],[4,-8],[1,-4]],[[5069,4101],[6,-7],[15,-15],[28,-30],[-12,-17]],[[5164,4078],[8,-9],[-17,-22],[5,-7],[25,-26],[4,-3],[3,-3],[-6,-8],[-11,-13],[-1,-2],[0,-1],[1,-1],[1,-1],[7,-6],[8,-9],[3,-3]],[[5409,4205],[46,-49],[-22,-31],[14,-15]],[[9268,8006],[-23,6]],[[9245,8012],[5,22],[3,16],[5,22],[3,17],[3,13],[4,15]],[[9268,8117],[21,-5]],[[9289,8112],[41,-11],[42,-11]],[[9233,7952],[6,26],[6,31],[0,3]],[[9308,8311],[-1,-4],[-11,-55],[-4,-18],[-5,-23],[-5,-23],[-3,-18],[-11,-53]],[[8952,8419],[33,26],[26,21],[33,26],[20,15],[-1,1],[0,2],[0,2],[5,4],[24,22],[21,17],[16,13],[22,18]],[[9358,8298],[-1,-4],[-6,-31],[-5,-26],[-1,-3]],[[9345,8234],[-3,-19]],[[9342,8215],[-5,-6],[-9,-6],[-5,-4],[-10,-6],[-4,-3],[-4,-4],[-2,-5],[-2,-7],[-4,-21],[-4,-21],[-4,-20]],[[9342,8215],[56,-15],[2,0]],[[9345,8234],[39,-10],[3,14],[3,3],[2,11],[36,-9],[19,-5]],[[9358,8298],[117,-29]],[[9363,8328],[45,-11],[23,-7],[15,-4],[11,-3],[4,1],[8,4]],[[5950,4855],[-23,-11]],[[5927,4844],[-20,-12],[-21,-13]],[[5886,4819],[-13,-3],[-16,1],[-7,1],[-12,1],[-19,-3],[-5,-2],[-9,-2],[-5,-1],[-2,-1],[-25,-7],[-32,-4]],[[5736,4825],[6,1],[6,0],[5,3],[18,30],[8,9],[3,1],[4,3],[19,7],[7,1],[10,-2],[7,-4],[6,-3],[7,-6],[3,-1],[6,-2],[5,2],[3,1],[5,2],[3,1],[48,13],[6,2],[4,-1],[2,-1],[-2,-12],[11,-9],[5,-1],[0,4],[0,2],[0,8],[-1,6],[-1,3],[0,21],[7,12],[6,6],[7,9],[1,4],[8,14],[5,6],[11,20]],[[5998,4967],[13,-7],[25,-12]],[[6036,4948],[-11,-14],[-9,-11]],[[6016,4923],[-14,-17],[-7,-8],[-10,-9]],[[5985,4889],[-16,-17],[-8,-9],[-11,-8]],[[5875,4608],[6,4],[4,12],[6,20],[-84,49],[-113,59],[-27,-12]],[[5886,4819],[4,-3],[27,-14],[-8,-19],[62,-31]],[[5971,4752],[61,-31],[3,-2]],[[5927,4844],[5,-4],[61,-31],[-7,-19],[-7,-19],[-8,-19]],[[5950,4855],[111,-57],[4,-1]],[[5985,4889],[83,-42],[9,-5],[4,-2]],[[6016,4923],[62,-32],[14,-7],[4,-2]],[[6036,4948],[53,-27],[14,-7],[4,-2]],[[6036,5032],[21,-10],[-5,-16],[11,-6],[60,-30],[4,-1]],[[6054,5070],[23,-11],[3,-3],[61,-31],[3,-1]],[[8833,8678],[16,16],[-21,48],[-20,-12],[-8,19],[-37,80],[20,12],[-15,33],[-23,53],[-2,5],[-20,-13],[-23,-15]],[[8700,8904],[-7,14],[-3,5],[-9,22],[-8,-5],[-11,-5],[-7,-3],[-13,-7],[-42,-17],[-13,-4],[-25,-4],[-11,-1],[-5,0],[-3,0],[-6,1],[-12,2],[-8,0],[-6,-2]],[[8511,8900],[-4,-2],[-7,-3],[-3,-2],[-5,-4],[-8,-6],[-3,-3],[-5,-4],[-6,-7],[-12,-20],[17,-41],[-32,-18],[-1,-1],[0,-2],[7,-17],[4,-10],[12,-11],[3,-3]],[[8305,8694],[13,17],[9,6],[7,6],[1,2],[4,5],[6,5],[8,1],[6,6],[10,9],[8,9],[11,7],[18,16],[7,9],[6,11],[13,20],[7,7],[4,4],[4,3],[6,13],[9,12],[7,15],[22,19],[20,9],[21,1],[17,-1],[20,1],[12,2],[15,6],[13,7],[9,3],[3,3],[0,7],[1,1],[3,-2],[3,0],[7,6],[13,13],[10,8],[9,12],[9,8],[24,23],[6,9],[9,7],[10,10],[13,11],[24,24],[24,22],[9,10],[11,29],[5,9],[6,13],[4,13],[12,27],[4,13],[3,13],[12,20],[10,22],[9,14],[12,17],[9,10],[6,9],[20,28],[10,9],[6,7],[2,5],[8,6],[6,7],[4,8],[3,11],[12,23],[6,16],[0,7],[2,19],[4,8],[9,17],[24,48],[8,14],[9,10],[2,7],[8,14],[4,15],[4,9],[2,6],[9,13],[4,8],[4,13],[1,13],[4,13],[10,21],[6,6],[12,17],[2,0],[13,23],[12,4],[6,7],[12,10],[8,4],[6,4],[7,8],[1,1],[18,9],[8,2],[7,3],[7,5],[20,8],[5,0],[12,8],[14,10],[10,6],[16,4],[10,4],[11,4],[14,8],[16,10],[4,4],[2,0]],[[8795,8640],[-8,18],[-64,142],[-2,4],[-22,50],[0,4],[2,4],[14,8],[-14,31],[-1,2],[0,1]],[[8686,8525],[-2,4],[-2,2],[-3,6],[-3,5],[-2,2],[-11,23],[-20,47],[-13,31],[-16,35],[-30,69],[-33,78]],[[8551,8827],[-1,4],[-7,15],[-5,8],[-9,13],[-6,8],[-4,7],[-8,18]],[[8555,8562],[17,19],[14,17],[-9,11],[-4,9],[-22,51],[-2,2],[-17,-10],[-9,21],[-18,-10]],[[8468,8746],[6,8],[7,9],[9,9],[10,11],[11,10],[19,17],[18,15],[3,2]],[[7052,6851],[-5,9],[-12,18],[-37,-32],[-11,18],[-12,18]],[[7054,6811],[-37,-33],[-12,18],[-15,24],[-12,19]],[[6990,6704],[-3,4],[-44,68],[-7,12]],[[6936,6788],[-9,15],[-30,47]],[[6897,6850],[-31,49]],[[6830,6759],[10,8],[25,-40],[14,13],[14,12],[14,12],[14,12],[15,12]],[[6819,6776],[10,27]],[[6829,6803],[5,-7],[6,5],[13,11],[15,13],[14,12],[15,13]],[[6829,6803],[-2,3],[-9,13],[-7,11],[-16,26],[18,17],[16,14]],[[6829,6887],[18,-29],[2,-3],[8,21],[2,6],[7,17]],[[6829,6887],[-44,68],[1,5],[5,21]],[[6715,6834],[2,7],[8,19],[7,14],[5,12],[5,5],[35,82],[4,17]],[[7568,4477],[7,11],[5,9]],[[7580,4497],[9,-7],[45,-34],[13,-10]],[[7580,4497],[14,23]],[[7580,4497],[-11,8],[-42,33],[-9,9]],[[7568,4477],[-63,47]],[[7555,4451],[-19,14],[-37,27],[-8,6]],[[7523,4395],[-62,47]],[[7498,4350],[-62,46]],[[7485,4324],[-63,47]],[[5016,1281],[-46,1],[-3,21],[0,14],[1,6],[-4,20],[-18,-3],[-3,0],[-2,1],[-2,3],[-4,22],[-23,-5]],[[5016,1227],[-10,3],[-8,7],[-3,5],[-2,12],[1,19],[-3,-4],[-3,-9],[-1,-8],[2,-7],[2,-6],[4,-8],[6,-4],[9,-3],[6,-2]],[[5626,4344],[-6,6],[-47,50],[13,16],[12,17]],[[5608,4321],[-1,0],[-14,15],[-40,42],[-7,7]],[[5546,4385],[-26,27],[-19,20],[-3,3],[-3,3],[-4,4],[-2,2],[-1,1]],[[5524,4487],[5,5],[0,2],[17,20]],[[5546,4514],[31,-30],[33,-36]],[[5639,4489],[-17,-24],[-12,-17]],[[5546,4514],[19,22],[3,3]],[[5568,4539],[14,-12],[3,-3],[3,-2],[4,-1],[5,0],[5,1],[21,-19],[16,-14]],[[5568,4539],[21,26],[13,20],[6,9],[2,3]],[[5610,4597],[73,-44]],[[5683,4553],[-3,-4],[-2,-4],[-14,-19],[-14,-19],[-11,-18]],[[5568,4539],[-19,19],[-14,13],[-15,14]],[[5630,4642],[74,-41],[-11,-25],[-10,-23]],[[5748,4503],[-22,16],[-43,34]],[[5638,4663],[4,-2],[7,16],[20,-12],[26,-13],[2,-1],[13,-4],[79,-41]],[[5742,4702],[54,-28],[-9,-24],[30,-15],[29,-7],[0,-1],[-3,-11]],[[5546,4385],[-3,-5],[-5,-5],[-9,-12],[0,-3],[-2,-3],[-5,-6],[-4,-2],[-5,-7],[-14,-19],[-13,-17]],[[5534,4223],[-62,65]],[[5608,4321],[-3,-5],[-12,-16],[-2,0],[0,-1],[0,-1],[-8,-11],[-9,-11],[-13,-17],[-13,-18],[-14,-18]],[[5494,4172],[-61,65]],[[5534,4223],[-13,-16],[-13,-18]],[[6183,5178],[9,23],[10,22],[11,-6],[39,-19],[22,-10]],[[6160,5189],[10,23],[10,22],[7,22]],[[6187,5256],[19,-9],[5,-2],[9,-5],[32,-16],[30,-14]],[[6187,5256],[17,49]],[[6204,5305],[20,-10],[3,-2],[3,-4],[2,-2],[6,-3],[14,-7],[46,-22]],[[6298,5255],[-4,-12],[-4,-11],[-4,-11],[-4,-11]],[[6323,5325],[-9,-24],[-10,4],[-28,14]],[[6276,5319],[-5,3],[-31,14],[-24,2],[-6,-16],[-6,-17]],[[6079,5226],[9,15],[21,27],[12,18],[27,28],[13,16],[20,23],[3,2],[3,2],[15,0],[9,1],[6,3],[18,19],[1,1]],[[6276,5319],[-23,-15],[3,-2],[50,-25]],[[6306,5277],[-4,-11],[-4,-11]],[[6367,5247],[-44,21],[-17,9]]],"box":[-73.97639960366291,45.40212922961762,-73.47606597759493,45.70374747616739],"transform":{"scale":[0.000050038366443442794,0.000030164841139091116],"translate":[-73.97639960366291,45.40212922961762]}} diff --git a/test/memoryLimitCases/json/src/5.json b/test/memoryLimitCases/json/src/5.json new file mode 100644 index 00000000000..33726beae05 --- /dev/null +++ b/test/memoryLimitCases/json/src/5.json @@ -0,0 +1 @@ +{"type":"Topology","objects":{"da_polygons":{"type":"GeometryCollection","geometries":[{"type":"Polygon","arcs":[[0,1,2,3]],"properties":{"id":"24661006","dp":8931,"de":1335}},{"type":"Polygon","arcs":[[4,5,-3,6]],"properties":{"id":"24661007","dp":10647,"de":1878}},{"type":"Polygon","arcs":[[7,-5,8,9]],"properties":{"id":"24661008","dp":16943,"de":0}},{"type":"Polygon","arcs":[[10,11,12,13,-10,14]],"properties":{"id":"24661009","dp":12530,"de":0}},{"type":"Polygon","arcs":[[15,-12,16,17]],"properties":{"id":"24661010","dp":9438,"de":702}},{"type":"Polygon","arcs":[[-16,18,19,20,21]],"properties":{"id":"24661011","dp":8010,"de":0}},{"type":"Polygon","arcs":[[-13,-22,22,23,24]],"properties":{"id":"24661012","dp":11850,"de":2286}},{"type":"Polygon","arcs":[[-14,-25,25,26,27,-8]],"properties":{"id":"24661013","dp":14048,"de":0}},{"type":"Polygon","arcs":[[-28,28,29,30,-6]],"properties":{"id":"24661014","dp":13125,"de":937}},{"type":"Polygon","arcs":[[-4,-31,31,32]],"properties":{"id":"24661015","dp":9751,"de":0}},{"type":"Polygon","arcs":[[-33,33,34,35,36]],"properties":{"id":"24661016","dp":11366,"de":3096}},{"type":"Polygon","arcs":[[37,38,39,40,41,-36,42]],"properties":{"id":"24661017","dp":12016,"de":2796}},{"type":"Polygon","arcs":[[43,44,-39,45,46]],"properties":{"id":"24661018","dp":11687,"de":0}},{"type":"Polygon","arcs":[[-46,-38,47,48,49]],"properties":{"id":"24661019","dp":12350,"de":0}},{"type":"Polygon","arcs":[[50,-47,-50,51,52]],"properties":{"id":"24661020","dp":9967,"de":0}},{"type":"Polygon","arcs":[[-52,-49,53,54,55,56]],"properties":{"id":"24661021","dp":7994,"de":1432}},{"type":"Polygon","arcs":[[-56,57,58,59,60,61]],"properties":{"id":"24661022","dp":5211,"de":1785}},{"type":"Polygon","arcs":[[62,63,-57,-62,64]],"properties":{"id":"24661023","dp":6243,"de":582}},{"type":"Polygon","arcs":[[-65,-61,65,66,67,68]],"properties":{"id":"24661024","dp":5485,"de":0}},{"type":"Polygon","arcs":[[69,70,71,-66]],"properties":{"id":"24661025","dp":7364,"de":0}},{"type":"Polygon","arcs":[[-70,-60,72,73,74]],"properties":{"id":"24661026","dp":10337,"de":1466}},{"type":"Polygon","arcs":[[75,76,77,78,-71,-75]],"properties":{"id":"24661027","dp":12164,"de":1903}},{"type":"Polygon","arcs":[[79,80,-76,-74,81]],"properties":{"id":"24661028","dp":11862,"de":0}},{"type":"Polygon","arcs":[[82,83,-77,-81,84]],"properties":{"id":"24661029","dp":13911,"de":0}},{"type":"Polygon","arcs":[[85,86,87,-85,-80,88]],"properties":{"id":"24661030","dp":19910,"de":0}},{"type":"Polygon","arcs":[[-87,89,90]],"properties":{"id":"24661031","dp":19144,"de":0}},{"type":"Polygon","arcs":[[-83,-88,-91,91,92,93,94,95]],"properties":{"id":"24661032","dp":7816,"de":7672}},{"type":"Polygon","arcs":[[96,-92,-90,-86,97]],"properties":{"id":"24661033","dp":15840,"de":0}},{"type":"Polygon","arcs":[[98,-98,99,100]],"properties":{"id":"24661034","dp":14082,"de":0}},{"type":"Polygon","arcs":[[101,-93,-97,-99,102]],"properties":{"id":"24661035","dp":13138,"de":1666}},{"type":"Polygon","arcs":[[103,104,105,106]],"properties":{"id":"24660626","dp":11270,"de":0}},{"type":"Polygon","arcs":[[107,108,-104,109]],"properties":{"id":"24660627","dp":9435,"de":0}},{"type":"Polygon","arcs":[[110,-110,-107,111,112,113,114,115]],"properties":{"id":"24660628","dp":3679,"de":3326}},{"type":"Polygon","arcs":[[116,117,118,-111]],"properties":{"id":"24660629","dp":48819,"de":4658}},{"type":"Polygon","arcs":[[119,120,121,-118,122]],"properties":{"id":"24660630","dp":4054,"de":851}},{"type":"Polygon","arcs":[[123,124,125,-123,126,127]],"properties":{"id":"24660631","dp":6140,"de":1321}},{"type":"Polygon","arcs":[[128,129,-120,-126,130]],"properties":{"id":"24660632","dp":4964,"de":0}},{"type":"Polygon","arcs":[[131,-131,-125,132,133,134]],"properties":{"id":"24660633","dp":4795,"de":6787}},{"type":"Polygon","arcs":[[135,136,137,-132,138,139]],"properties":{"id":"24660634","dp":4116,"de":1223}},{"type":"Polygon","arcs":[[140,141,142,143,-136]],"properties":{"id":"24660635","dp":8631,"de":1131}},{"type":"Polygon","arcs":[[144,145,-141,146]],"properties":{"id":"24660636","dp":9930,"de":2797}},{"type":"Polygon","arcs":[[-147,-140,147,148]],"properties":{"id":"24660637","dp":12431,"de":0}},{"type":"Polygon","arcs":[[-148,-139,-135,149,150]],"properties":{"id":"24660638","dp":8941,"de":1274}},{"type":"Polygon","arcs":[[-150,-134,151,152]],"properties":{"id":"24660639","dp":10337,"de":1054}},{"type":"Polygon","arcs":[[153,-153,154,155]],"properties":{"id":"24660640","dp":7798,"de":3731}},{"type":"Polygon","arcs":[[-155,156,157,158]],"properties":{"id":"24660641","dp":11155,"de":3361}},{"type":"Polygon","arcs":[[-158,159,160,161,162]],"properties":{"id":"24660642","dp":10407,"de":4184}},{"type":"Polygon","arcs":[[-162,163,164,165,166]],"properties":{"id":"24660643","dp":12951,"de":8280}},{"type":"Polygon","arcs":[[167,168,-166,169,170]],"properties":{"id":"24660644","dp":9054,"de":2215}},{"type":"Polygon","arcs":[[-165,171,172,173,174,175,-170]],"properties":{"id":"24660645","dp":11651,"de":2816}},{"type":"Polygon","arcs":[[176,-171,-176,177,178,179,180,181,182]],"properties":{"id":"24660646","dp":6723,"de":3837}},{"type":"Polygon","arcs":[[183,184,185,186,-181,187,188]],"properties":{"id":"24660649","dp":9487,"de":1370}},{"type":"Polygon","arcs":[[-189,189,-179,190,191,192]],"properties":{"id":"24660650","dp":4420,"de":2155}},{"type":"Polygon","arcs":[[-192,193,194,195,196,197]],"properties":{"id":"24660652","dp":9408,"de":869}},{"type":"Polygon","arcs":[[198,199,-195,200]],"properties":{"id":"24660654","dp":3356,"de":0}},{"type":"Polygon","arcs":[[201,202,203,204,205,-199]],"properties":{"id":"24660655","dp":6279,"de":3761}},{"type":"Polygon","arcs":[[206,207,-196,-200,-206]],"properties":{"id":"24660656","dp":16096,"de":1470}},{"type":"Polygon","arcs":[[-205,208,209,210,211,-207]],"properties":{"id":"24660657","dp":14502,"de":974}},{"type":"Polygon","arcs":[[212,213,214,215,216]],"properties":{"id":"24661144","dp":17838,"de":1781}},{"type":"Polygon","arcs":[[-216,217,218]],"properties":{"id":"24661145","dp":14407,"de":0}},{"type":"Polygon","arcs":[[219,-219,220,221,222,223]],"properties":{"id":"24661146","dp":10811,"de":7711}},{"type":"Polygon","arcs":[[224,225,226,227]],"properties":{"id":"24663242","dp":135547,"de":31021}},{"type":"Polygon","arcs":[[-226,228,229,230]],"properties":{"id":"24663243","dp":74527,"de":15540}},{"type":"Polygon","arcs":[[231,-201,-194,-191]],"properties":{"id":"24663244","dp":15460,"de":1381}},{"type":"Polygon","arcs":[[232,233,234,235,236]],"properties":{"id":"24663245","dp":28870,"de":2258}},{"type":"Polygon","arcs":[[237,238,239,240,241,242,243]],"properties":{"id":"24663215","dp":11166,"de":5263}},{"type":"Polygon","arcs":[[244,245,246,247,248,249,250,251,252,253,254]],"properties":{"id":"24663216","dp":1357,"de":364}},{"type":"Polygon","arcs":[[255,256,257,258,-249,259]],"properties":{"id":"24663217","dp":5669,"de":873}},{"type":"Polygon","arcs":[[260,-260,-248,261]],"properties":{"id":"24663218","dp":4290,"de":1018}},{"type":"Polygon","arcs":[[-259,262,263,-250]],"properties":{"id":"24663219","dp":9313,"de":0}},{"type":"Polygon","arcs":[[-258,264,265,266,267,268,269,270,-263]],"properties":{"id":"24663220","dp":3197,"de":1020}},{"type":"Polygon","arcs":[[-264,-271,271,272,-251]],"properties":{"id":"24663221","dp":11214,"de":0}},{"type":"Polygon","arcs":[[-270,273,274,275,-272]],"properties":{"id":"24663222","dp":9621,"de":0}},{"type":"Polygon","arcs":[[-273,-276,276,277,278,-252]],"properties":{"id":"24663223","dp":11269,"de":0}},{"type":"Polygon","arcs":[[279,280,281,282,283,284,285,286]],"properties":{"id":"24663227","dp":3208,"de":243}},{"type":"Polygon","arcs":[[287,288,-284]],"properties":{"id":"24663228","dp":9806,"de":1320}},{"type":"Polygon","arcs":[[-285,-289,289,290,291,292,293]],"properties":{"id":"24663229","dp":2759,"de":1023}},{"type":"Polygon","arcs":[[294,295,296,-292]],"properties":{"id":"24663230","dp":8375,"de":1160}},{"type":"Polygon","arcs":[[297,298,299,300,-296]],"properties":{"id":"24663231","dp":10815,"de":998}},{"type":"Polygon","arcs":[[301,302,303,304,-298,305]],"properties":{"id":"24663232","dp":7492,"de":3592}},{"type":"Polygon","arcs":[[306,307,308,309,-300]],"properties":{"id":"24663233","dp":7652,"de":0}},{"type":"Polygon","arcs":[[-309,310,311,312,313]],"properties":{"id":"24663234","dp":9826,"de":1391}},{"type":"Polygon","arcs":[[-297,-301,-310,-314,314,315,316,317,318]],"properties":{"id":"24663235","dp":8550,"de":1062}},{"type":"Polygon","arcs":[[-286,319,320,321,-293,-319,322,323,324,325,326]],"properties":{"id":"24663236","dp":1908,"de":0}},{"type":"Polygon","arcs":[[327,-324]],"properties":{"id":"24663237","dp":12585,"de":0}},{"type":"Polygon","arcs":[[-321,328]],"properties":{"id":"24663238","dp":12077,"de":0}},{"type":"Polygon","arcs":[[-294,-322,-329,-320]],"properties":{"id":"24663239","dp":9419,"de":0}},{"type":"Polygon","arcs":[[329,330,331,332,333,334,335,336,337,338,339]],"properties":{"id":"24663241","dp":9132,"de":3526}},{"type":"Polygon","arcs":[[340,341,342,343,344]],"properties":{"id":"24663315","dp":6316,"de":663}},{"type":"Polygon","arcs":[[-345,345]],"properties":{"id":"24663316","dp":17073,"de":0}},{"type":"Polygon","arcs":[[346,347,348,-342,349]],"properties":{"id":"24663317","dp":6559,"de":940}},{"type":"Polygon","arcs":[[350,351,-347,352]],"properties":{"id":"24663318","dp":13324,"de":0}},{"type":"Polygon","arcs":[[-352,353,354,355,-348]],"properties":{"id":"24663319","dp":5197,"de":591}},{"type":"Polygon","arcs":[[356,-247,357,-356]],"properties":{"id":"24663320","dp":8801,"de":4778}},{"type":"Polygon","arcs":[[-349,-358,-246,358,-343]],"properties":{"id":"24663321","dp":4576,"de":2380}},{"type":"Polygon","arcs":[[359,360,361,362,363,364]],"properties":{"id":"24663322","dp":5794,"de":2158}},{"type":"Polygon","arcs":[[365,-361,366]],"properties":{"id":"24663323","dp":14574,"de":0}},{"type":"Polygon","arcs":[[367,368,369,-362,-366,370]],"properties":{"id":"24663324","dp":14421,"de":0}},{"type":"Polygon","arcs":[[371,372,-369,373]],"properties":{"id":"24663325","dp":15522,"de":0}},{"type":"Polygon","arcs":[[374,375,376,-374,-368,377]],"properties":{"id":"24663326","dp":10725,"de":1170}},{"type":"Polygon","arcs":[[-377,378,379,380,-372]],"properties":{"id":"24663327","dp":17213,"de":0}},{"type":"Polygon","arcs":[[-381,381,-363,-370,-373]],"properties":{"id":"24663328","dp":15796,"de":1851}},{"type":"Polygon","arcs":[[382,383,384,385,386,387,388,389,390,391,392,393,394,395,396]],"properties":{"id":"24663329","dp":0,"de":296}},{"type":"Polygon","arcs":[[397,398,399,400,401,402,403,404]],"properties":{"id":"24663330","dp":4436,"de":5953}},{"type":"Polygon","arcs":[[405,406,407,-399,408]],"properties":{"id":"24663331","dp":11992,"de":1562}},{"type":"Polygon","arcs":[[409,410,-406,411,412]],"properties":{"id":"24663332","dp":14081,"de":2551}},{"type":"Polygon","arcs":[[413,414,415,-410,416]],"properties":{"id":"24663333","dp":8329,"de":1540}},{"type":"Polygon","arcs":[[417,418,419,420,421,422,423,424,425]],"properties":{"id":"24660037","dp":6132,"de":0}},{"type":"Polygon","arcs":[[426,427,428,429,-419,430]],"properties":{"id":"24660038","dp":9844,"de":0}},{"type":"Polygon","arcs":[[431,-427,432]],"properties":{"id":"24660039","dp":11381,"de":0}},{"type":"Polygon","arcs":[[433,434,435,-428,-432]],"properties":{"id":"24660040","dp":4262,"de":404}},{"type":"Polygon","arcs":[[436,-434,-433,-431,-418,437,438]],"properties":{"id":"24660041","dp":3909,"de":348}},{"type":"Polygon","arcs":[[439,-438,-426,440]],"properties":{"id":"24660042","dp":9275,"de":0}},{"type":"Polygon","arcs":[[-425,441,-441]],"properties":{"id":"24660043","dp":10046,"de":0}},{"type":"Polygon","arcs":[[442,-440,-442,-424,443,444,445,446]],"properties":{"id":"24660044","dp":3139,"de":1321}},{"type":"Polygon","arcs":[[447,-446,448,449,450]],"properties":{"id":"24660045","dp":2288,"de":0}},{"type":"Polygon","arcs":[[-439,-443,451,452]],"properties":{"id":"24660046","dp":4770,"de":478}},{"type":"Polygon","arcs":[[453,454,455,456,457,-435,-437,-453,458]],"properties":{"id":"24660047","dp":2550,"de":2172}},{"type":"Polygon","arcs":[[459,460,461,-455,462]],"properties":{"id":"24660048","dp":6159,"de":1346}},{"type":"Polygon","arcs":[[463,464,465,-456,-462,466]],"properties":{"id":"24660049","dp":5493,"de":681}},{"type":"Polygon","arcs":[[467,-464,468]],"properties":{"id":"24660050","dp":9764,"de":0}},{"type":"Polygon","arcs":[[469,470,-469,-467,-461,471,472]],"properties":{"id":"24660051","dp":4193,"de":0}},{"type":"Polygon","arcs":[[473,474,-472,-460,475]],"properties":{"id":"24660052","dp":7412,"de":1105}},{"type":"Polygon","arcs":[[476,-473,-475,477]],"properties":{"id":"24660053","dp":6310,"de":0}},{"type":"Polygon","arcs":[[478,479,-478,-474,480,481,482]],"properties":{"id":"24660054","dp":4320,"de":724}},{"type":"Polygon","arcs":[[483,484,485,-479]],"properties":{"id":"24660055","dp":9536,"de":0}},{"type":"Polygon","arcs":[[486,-485,487]],"properties":{"id":"24660056","dp":4995,"de":0}},{"type":"Polygon","arcs":[[488,489,490,491,492,493,494,495,496,-488,-484,-483,497]],"properties":{"id":"24660057","dp":338,"de":536}},{"type":"Polygon","arcs":[[498,499,500,501]],"properties":{"id":"24660489","dp":8249,"de":6849}},{"type":"Polygon","arcs":[[502,503,504,-502]],"properties":{"id":"24660490","dp":8603,"de":3262}},{"type":"Polygon","arcs":[[-253,-279,505,506,507,508]],"properties":{"id":"24660141","dp":1836,"de":234}},{"type":"Polygon","arcs":[[509,510,-503,-501,511,512,513,514,515,516,517]],"properties":{"id":"24660491","dp":1351,"de":5936}},{"type":"Polygon","arcs":[[-517,518,519,520]],"properties":{"id":"24660492","dp":13313,"de":0}},{"type":"Polygon","arcs":[[-516,521,522,-519]],"properties":{"id":"24660493","dp":13219,"de":1570}},{"type":"Polygon","arcs":[[-523,523,524,525]],"properties":{"id":"24660494","dp":11926,"de":1361}},{"type":"Polygon","arcs":[[-525,526,527,528]],"properties":{"id":"24660495","dp":9387,"de":1348}},{"type":"Polygon","arcs":[[529,530,531,-527,-524]],"properties":{"id":"24660496","dp":11422,"de":1845}},{"type":"Polygon","arcs":[[-515,-530,-522]],"properties":{"id":"24660497","dp":14505,"de":1692}},{"type":"Polygon","arcs":[[-514,532,533,534,-531]],"properties":{"id":"24660498","dp":10225,"de":1503}},{"type":"Polygon","arcs":[[535,536,537,-534]],"properties":{"id":"24660499","dp":9676,"de":0}},{"type":"Polygon","arcs":[[-533,-513,538,539,540,541,542,543,-536]],"properties":{"id":"24660500","dp":3362,"de":7441}},{"type":"Polygon","arcs":[[-544,544,545,546,547,-537]],"properties":{"id":"24660501","dp":7888,"de":837}},{"type":"Polygon","arcs":[[548,549,-545,-543]],"properties":{"id":"24660502","dp":13405,"de":1811}},{"type":"Polygon","arcs":[[550,551,552,-549,-542]],"properties":{"id":"24660503","dp":7376,"de":874}},{"type":"Polygon","arcs":[[553,554,-551,-541]],"properties":{"id":"24660504","dp":5407,"de":1005}},{"type":"Polygon","arcs":[[555,556,557,-554,-540]],"properties":{"id":"24660505","dp":9900,"de":2490}},{"type":"Polygon","arcs":[[558,559,560,-557,561,562]],"properties":{"id":"24660506","dp":8935,"de":2987}},{"type":"Polygon","arcs":[[563,-563,564]],"properties":{"id":"24660507","dp":10570,"de":1027}},{"type":"Polygon","arcs":[[565,566,567,-559,-564,568]],"properties":{"id":"24660508","dp":6919,"de":1668}},{"type":"Polygon","arcs":[[569,570,-566,571]],"properties":{"id":"24660509","dp":8828,"de":0}},{"type":"Polygon","arcs":[[572,573,-572,-569,-565,-562,-556,-539,574,575]],"properties":{"id":"24660510","dp":1306,"de":8518}},{"type":"Polygon","arcs":[[576,577,578,579,-570,-574]],"properties":{"id":"24660511","dp":4287,"de":468}},{"type":"Polygon","arcs":[[-573,580,581,-577]],"properties":{"id":"24660512","dp":13997,"de":0}},{"type":"Polygon","arcs":[[582,583,584,585,586,587,-581]],"properties":{"id":"24660513","dp":10449,"de":1063}},{"type":"Polygon","arcs":[[588,589,-587]],"properties":{"id":"24660514","dp":9284,"de":0}},{"type":"Polygon","arcs":[[-586,590,591,-589]],"properties":{"id":"24660515","dp":39141,"de":3862}},{"type":"Polygon","arcs":[[-585,592,593,-591]],"properties":{"id":"24660516","dp":26174,"de":1912}},{"type":"Polygon","arcs":[[594,595,596,597,598,-593]],"properties":{"id":"24660517","dp":8932,"de":485}},{"type":"Polygon","arcs":[[599,600,601,602]],"properties":{"id":"24661004","dp":10054,"de":0}},{"type":"Polygon","arcs":[[-1,-37,-42,-601]],"properties":{"id":"24661005","dp":8535,"de":5063}},{"type":"Polygon","arcs":[[603,604,-254,-509,605,606,607,608]],"properties":{"id":"24660142","dp":3728,"de":2421}},{"type":"Polygon","arcs":[[609,610,-609]],"properties":{"id":"24660143","dp":10342,"de":0}},{"type":"Polygon","arcs":[[611,-610,-608,612,613,614]],"properties":{"id":"24660144","dp":15266,"de":722}},{"type":"Polygon","arcs":[[615,-604,-611,616]],"properties":{"id":"24660145","dp":12741,"de":0}},{"type":"Polygon","arcs":[[617,618,-617,-612,619,620,621,622]],"properties":{"id":"24660146","dp":7606,"de":1504}},{"type":"Polygon","arcs":[[-618,623]],"properties":{"id":"24660147","dp":20632,"de":1656}},{"type":"Polygon","arcs":[[624,-255,-605,-616,-619,-624,-623,625]],"properties":{"id":"24660148","dp":1454,"de":5705}},{"type":"Polygon","arcs":[[626,-626,627,628,629,630]],"properties":{"id":"24660149","dp":5561,"de":963}},{"type":"Polygon","arcs":[[631,632,-631,633,634]],"properties":{"id":"24660150","dp":3943,"de":1446}},{"type":"Polygon","arcs":[[635,-635,636,637,638]],"properties":{"id":"24660151","dp":4713,"de":0}},{"type":"Polygon","arcs":[[639,640,-637,-634,-630,641,642,643]],"properties":{"id":"24660152","dp":3337,"de":3856}},{"type":"Polygon","arcs":[[644,-640,645]],"properties":{"id":"24660153","dp":10086,"de":867}},{"type":"Polygon","arcs":[[646,-646,647,648]],"properties":{"id":"24660154","dp":6043,"de":699}},{"type":"Polygon","arcs":[[-649,649,650,651,652]],"properties":{"id":"24660155","dp":8086,"de":942}},{"type":"Polygon","arcs":[[653,-652,654,655,656]],"properties":{"id":"24660156","dp":11496,"de":2733}},{"type":"Polygon","arcs":[[657,-655,-651,658,659,660,661,662,663,664]],"properties":{"id":"24660157","dp":2446,"de":187}},{"type":"Polygon","arcs":[[-665,665,666,667]],"properties":{"id":"24660158","dp":9450,"de":1247}},{"type":"Polygon","arcs":[[668,669,-666,-664]],"properties":{"id":"24660159","dp":16040,"de":0}},{"type":"Polygon","arcs":[[-669,-663,670,671]],"properties":{"id":"24660160","dp":6754,"de":0}},{"type":"Polygon","arcs":[[-662,672,673,-671]],"properties":{"id":"24660161","dp":7033,"de":0}},{"type":"Polygon","arcs":[[-674,674,675]],"properties":{"id":"24660162","dp":9412,"de":0}},{"type":"Polygon","arcs":[[-675,-673,-661,676,677,678,679,680,681,682,683]],"properties":{"id":"24660163","dp":8293,"de":697}},{"type":"Polygon","arcs":[[684,685,-679,686]],"properties":{"id":"24660164","dp":9226,"de":3080}},{"type":"Polygon","arcs":[[687,688,689,690,-685]],"properties":{"id":"24660165","dp":9571,"de":0}},{"type":"Polygon","arcs":[[691,692,693,694]],"properties":{"id":"24660624","dp":17755,"de":2448}},{"type":"Polygon","arcs":[[-112,-106,695,-692]],"properties":{"id":"24660625","dp":16190,"de":1636}},{"type":"Polygon","arcs":[[696,697,698,699,700,701,702]],"properties":{"id":"24660877","dp":8154,"de":0}},{"type":"Polygon","arcs":[[703,704,-698,705]],"properties":{"id":"24660878","dp":13204,"de":0}},{"type":"Polygon","arcs":[[706,707,708,-699,-705]],"properties":{"id":"24660879","dp":14016,"de":0}},{"type":"Polygon","arcs":[[709,710,711,712,713,-707,-704,714]],"properties":{"id":"24660880","dp":5343,"de":1738}},{"type":"Polygon","arcs":[[715,716,-708,-714]],"properties":{"id":"24660881","dp":15212,"de":0}},{"type":"Polygon","arcs":[[-709,-717,717,718,719,-700]],"properties":{"id":"24660882","dp":13107,"de":0}},{"type":"Polygon","arcs":[[-718,-716,-713,720,721,722,723,724]],"properties":{"id":"24660883","dp":6469,"de":524}},{"type":"Polygon","arcs":[[725,726,727,-723]],"properties":{"id":"24660884","dp":8508,"de":732}},{"type":"Polygon","arcs":[[-728,728,729,730,731,-724]],"properties":{"id":"24660885","dp":6490,"de":3685}},{"type":"Polygon","arcs":[[-731,732,733,734,735,736,737]],"properties":{"id":"24660886","dp":11863,"de":2534}},{"type":"Polygon","arcs":[[-737,738,739,740,741]],"properties":{"id":"24660887","dp":15000,"de":0}},{"type":"Polygon","arcs":[[742,743,744,-739,-736]],"properties":{"id":"24660888","dp":15464,"de":0}},{"type":"Polygon","arcs":[[745,746,-743,-735]],"properties":{"id":"24660889","dp":15095,"de":0}},{"type":"Polygon","arcs":[[747,748,749,-744,-747]],"properties":{"id":"24660890","dp":15628,"de":0}},{"type":"Polygon","arcs":[[750,751,752,-748,-746,-734]],"properties":{"id":"24660891","dp":16444,"de":0}},{"type":"Polygon","arcs":[[753,-752]],"properties":{"id":"24660892","dp":12290,"de":0}},{"type":"Polygon","arcs":[[-751,-733,-730,754,755,756,757,758,759,760,761,762,763,-749,-753,-754]],"properties":{"id":"24660893","dp":480,"de":3413}},{"type":"Polygon","arcs":[[-745,-750,-764,764,-740]],"properties":{"id":"24660894","dp":15893,"de":957}},{"type":"Polygon","arcs":[[-741,-765,-763,765,766,767]],"properties":{"id":"24660895","dp":6906,"de":2126}},{"type":"Polygon","arcs":[[-766,-762,768,769]],"properties":{"id":"24660896","dp":13624,"de":0}},{"type":"Polygon","arcs":[[770,771,-767,-770,772]],"properties":{"id":"24660897","dp":17031,"de":0}},{"type":"Polygon","arcs":[[773,774,-771]],"properties":{"id":"24660898","dp":13979,"de":0}},{"type":"Polygon","arcs":[[775,-738,-742,-768,-772,-775,776]],"properties":{"id":"24660899","dp":5594,"de":4325}},{"type":"Polygon","arcs":[[777,-719,-725,-732,-776,778]],"properties":{"id":"24660900","dp":7907,"de":2759}},{"type":"Polygon","arcs":[[779,780,781,782,783,784,785]],"properties":{"id":"24661213","dp":5261,"de":5231}},{"type":"Polygon","arcs":[[-786,786,787,788,789,790,791,792,793]],"properties":{"id":"24661214","dp":6711,"de":933}},{"type":"Polygon","arcs":[[794,795,796,-788]],"properties":{"id":"24661215","dp":18148,"de":1851}},{"type":"Polygon","arcs":[[-797,797,798,-789]],"properties":{"id":"24661216","dp":19680,"de":3723}},{"type":"Polygon","arcs":[[-790,-799,799,800]],"properties":{"id":"24661217","dp":17804,"de":0}},{"type":"Polygon","arcs":[[-791,-801,801,802]],"properties":{"id":"24661218","dp":21421,"de":2696}},{"type":"Polygon","arcs":[[-792,-803,803,804]],"properties":{"id":"24661219","dp":11752,"de":2061}},{"type":"Polygon","arcs":[[-805,805,806,807]],"properties":{"id":"24661220","dp":11693,"de":3674}},{"type":"Polygon","arcs":[[-807,808,809]],"properties":{"id":"24661221","dp":13514,"de":2236}},{"type":"Polygon","arcs":[[-793,-808,-810,810,811,812,813,814]],"properties":{"id":"24661222","dp":8084,"de":3112}},{"type":"Polygon","arcs":[[815,-814,816,817,818,819,820]],"properties":{"id":"24661223","dp":2721,"de":1293}},{"type":"Polygon","arcs":[[821,822,823,824]],"properties":{"id":"24660715","dp":7667,"de":3137}},{"type":"Polygon","arcs":[[825,826,-822,827]],"properties":{"id":"24660716","dp":6704,"de":1787}},{"type":"Polygon","arcs":[[828,829,830,-826,831]],"properties":{"id":"24660717","dp":8223,"de":2919}},{"type":"Polygon","arcs":[[832,833,-830,834]],"properties":{"id":"24660718","dp":7019,"de":3425}},{"type":"Polygon","arcs":[[835,836,-185,-833,837]],"properties":{"id":"24660719","dp":6743,"de":3362}},{"type":"Polygon","arcs":[[838,-187,839,840]],"properties":{"id":"24660722","dp":14111,"de":2439}},{"type":"Polygon","arcs":[[841,842,-182,-839]],"properties":{"id":"24660723","dp":14735,"de":8730}},{"type":"Polygon","arcs":[[843,-183,-843,844]],"properties":{"id":"24660724","dp":13245,"de":1324}},{"type":"Polygon","arcs":[[-844,845,846,847,848,-168,-177]],"properties":{"id":"24660725","dp":6444,"de":2017}},{"type":"Polygon","arcs":[[849,850,-847,851,852,853]],"properties":{"id":"24660726","dp":4920,"de":3063}},{"type":"Polygon","arcs":[[854,855,856,857,858]],"properties":{"id":"24660749","dp":19316,"de":2278}},{"type":"Polygon","arcs":[[-859,859,860,861,862]],"properties":{"id":"24660750","dp":8036,"de":1740}},{"type":"Polygon","arcs":[[-143,863,-861,864]],"properties":{"id":"24660751","dp":11931,"de":956}},{"type":"Polygon","arcs":[[865,866,867,868]],"properties":{"id":"24662884","dp":4529,"de":0}},{"type":"MultiPolygon","arcs":[[[869,870,871,872,-866,873,874]],[[875]]],"properties":{"id":"24662885","dp":1894,"de":308}},{"type":"Polygon","arcs":[[876,877,-870,878]],"properties":{"id":"24662886","dp":7047,"de":0}},{"type":"Polygon","arcs":[[879,880,881,882,-877,883]],"properties":{"id":"24662887","dp":9032,"de":0}},{"type":"Polygon","arcs":[[884,885,886,887,888,889,890]],"properties":{"id":"24662888","dp":3292,"de":263}},{"type":"Polygon","arcs":[[891,892,-886,893]],"properties":{"id":"24662889","dp":6524,"de":0}},{"type":"Polygon","arcs":[[894,895,-894,-885]],"properties":{"id":"24662890","dp":6933,"de":0}},{"type":"Polygon","arcs":[[896,897,-892,-896,898,899]],"properties":{"id":"24662891","dp":7590,"de":0}},{"type":"Polygon","arcs":[[-900,900,901,902]],"properties":{"id":"24662892","dp":5797,"de":0}},{"type":"Polygon","arcs":[[903,-901,904,905,906]],"properties":{"id":"24662893","dp":4546,"de":0}},{"type":"Polygon","arcs":[[-899,-895,-891,907,-905]],"properties":{"id":"24662894","dp":4164,"de":0}},{"type":"Polygon","arcs":[[-908,908,909,910]],"properties":{"id":"24662895","dp":5343,"de":0}},{"type":"Polygon","arcs":[[-906,-911,911,912]],"properties":{"id":"24662896","dp":5953,"de":684}},{"type":"Polygon","arcs":[[913,914,915,916,917,918]],"properties":{"id":"24661583","dp":2600,"de":306}},{"type":"Polygon","arcs":[[919,920,-915,921]],"properties":{"id":"24661584","dp":2784,"de":451}},{"type":"Polygon","arcs":[[922,923,924,-922,-914]],"properties":{"id":"24661585","dp":4379,"de":948}},{"type":"Polygon","arcs":[[-920,-925,925,926,927]],"properties":{"id":"24661586","dp":2973,"de":0}},{"type":"Polygon","arcs":[[-924,928,929,930,931,932,-926]],"properties":{"id":"24661587","dp":3944,"de":657}},{"type":"Polygon","arcs":[[-927,-933,933,934,935]],"properties":{"id":"24661589","dp":2770,"de":840}},{"type":"Polygon","arcs":[[936,-928,-936,937,938,939]],"properties":{"id":"24661590","dp":2453,"de":284}},{"type":"Polygon","arcs":[[-938,-935,940,941,942,943,944,945]],"properties":{"id":"24661591","dp":3828,"de":3190}},{"type":"Polygon","arcs":[[946,947,948]],"properties":{"id":"24662549","dp":6190,"de":0}},{"type":"Polygon","arcs":[[949,950,951,952,-848,-851]],"properties":{"id":"24660727","dp":7519,"de":983}},{"type":"Polygon","arcs":[[953,954,955,956,957,-950,-850]],"properties":{"id":"24660728","dp":8488,"de":2785}},{"type":"Polygon","arcs":[[958,-954,959,960]],"properties":{"id":"24660729","dp":14304,"de":0}},{"type":"Polygon","arcs":[[961,-955,-959,962]],"properties":{"id":"24660730","dp":11732,"de":4385}},{"type":"Polygon","arcs":[[963,-956,-962,964]],"properties":{"id":"24660731","dp":14750,"de":3333}},{"type":"Polygon","arcs":[[965,966,-964,967]],"properties":{"id":"24660732","dp":11921,"de":2156}},{"type":"Polygon","arcs":[[968,969,-966,970]],"properties":{"id":"24660733","dp":8852,"de":2550}},{"type":"Polygon","arcs":[[971,972,973,-957,-967,-970]],"properties":{"id":"24660734","dp":12379,"de":3291}},{"type":"Polygon","arcs":[[974,975,976,-972,977,978]],"properties":{"id":"24660735","dp":9475,"de":846}},{"type":"Polygon","arcs":[[979,980,-978,-969]],"properties":{"id":"24660736","dp":22776,"de":0}},{"type":"Polygon","arcs":[[981,-979,-981]],"properties":{"id":"24660737","dp":21798,"de":1419}},{"type":"Polygon","arcs":[[982,983,984,-982,-980,-971,-968,-965,-963,-961,985,986,987]],"properties":{"id":"24660738","dp":8438,"de":1526}},{"type":"Polygon","arcs":[[988,989,990,991,992,-983,993]],"properties":{"id":"24660741","dp":26512,"de":3914}},{"type":"Polygon","arcs":[[994,995,-991]],"properties":{"id":"24660742","dp":14478,"de":0}},{"type":"Polygon","arcs":[[996,997,998,999,1000,-995,-990]],"properties":{"id":"24660743","dp":5183,"de":0}},{"type":"Polygon","arcs":[[1001,1002,1003]],"properties":{"id":"24661234","dp":9777,"de":0}},{"type":"Polygon","arcs":[[1004,1005,1006]],"properties":{"id":"24661237","dp":5723,"de":0}},{"type":"Polygon","arcs":[[1007,1008,1009,1010,1011,1012,1013]],"properties":{"id":"24661240","dp":3181,"de":8764}},{"type":"Polygon","arcs":[[-1013,1014]],"properties":{"id":"24661241","dp":7276,"de":0}},{"type":"Polygon","arcs":[[1015,-862,-864,-142,-146,1016]],"properties":{"id":"24660752","dp":4836,"de":653}},{"type":"Polygon","arcs":[[1017,1018,-1017,1019,1020]],"properties":{"id":"24660753","dp":4845,"de":1452}},{"type":"Polygon","arcs":[[1021,-1020,-145,1022,1023,-976]],"properties":{"id":"24660754","dp":6224,"de":1491}},{"type":"Polygon","arcs":[[1024,1025,-1021,-1022,-975,-985]],"properties":{"id":"24660755","dp":11419,"de":4481}},{"type":"Polygon","arcs":[[-977,-1024,1026,1027,-973]],"properties":{"id":"24660756","dp":7419,"de":1093}},{"type":"Polygon","arcs":[[-1023,-149,1028,-1027]],"properties":{"id":"24660757","dp":12898,"de":1759}},{"type":"Polygon","arcs":[[-1029,-151,-154,1029]],"properties":{"id":"24660758","dp":7137,"de":1982}},{"type":"Polygon","arcs":[[-974,-1028,-1030,-156,1030,-958]],"properties":{"id":"24660759","dp":5183,"de":3210}},{"type":"Polygon","arcs":[[-1031,-159,1031,-951]],"properties":{"id":"24660760","dp":7373,"de":3006}},{"type":"Polygon","arcs":[[-1032,-163,1032,-952]],"properties":{"id":"24660761","dp":8741,"de":2532}},{"type":"Polygon","arcs":[[-1033,-167,-169,-849,-953]],"properties":{"id":"24660762","dp":10111,"de":4306}},{"type":"Polygon","arcs":[[1033,1034,1035,-865]],"properties":{"id":"24660763","dp":10505,"de":0}},{"type":"Polygon","arcs":[[-1036,1036,1037,1038,-137,-144]],"properties":{"id":"24660764","dp":6917,"de":1820}},{"type":"Polygon","arcs":[[1039,1040,1041,1042,1043,-1037,-1035,1044]],"properties":{"id":"24660765","dp":12311,"de":6182}},{"type":"Polygon","arcs":[[-1044,1045,1046,-1038]],"properties":{"id":"24660766","dp":10347,"de":1544}},{"type":"Polygon","arcs":[[-1043,1047,1048,1049,1050,-1046]],"properties":{"id":"24660767","dp":4532,"de":0}},{"type":"Polygon","arcs":[[-1039,-1047,-1051,1051,1052,1053]],"properties":{"id":"24660768","dp":3583,"de":487}},{"type":"Polygon","arcs":[[-129,-138,-1054,1054,1055,1056]],"properties":{"id":"24660769","dp":4103,"de":612}},{"type":"Polygon","arcs":[[-130,-1057,1057,-121]],"properties":{"id":"24660770","dp":2805,"de":741}},{"type":"Polygon","arcs":[[-1058,-1056,1058,1059,1060,-108,-119,-122]],"properties":{"id":"24660771","dp":2493,"de":396}},{"type":"Polygon","arcs":[[-1061,1061,1062,-109]],"properties":{"id":"24660772","dp":9883,"de":773}},{"type":"Polygon","arcs":[[1063,1064,1065,-1062]],"properties":{"id":"24660773","dp":9652,"de":0}},{"type":"Polygon","arcs":[[-1066,1066,1067,1068]],"properties":{"id":"24660774","dp":15219,"de":1732}},{"type":"Polygon","arcs":[[1069,-1068,1070,1071,1072,1073,1074]],"properties":{"id":"24660775","dp":8818,"de":2140}},{"type":"Polygon","arcs":[[-1075,1075,1076,1077,1078]],"properties":{"id":"24660776","dp":9580,"de":1881}},{"type":"Polygon","arcs":[[-1074,1079,1080,-1076]],"properties":{"id":"24660777","dp":8269,"de":2884}},{"type":"Polygon","arcs":[[1081,-1079,1082,-693]],"properties":{"id":"24660778","dp":11621,"de":4223}},{"type":"Polygon","arcs":[[1083,1084,1085,1086,1087,1088,1089,1090,1091,1092]],"properties":{"id":"24661262","dp":10544,"de":11245}},{"type":"Polygon","arcs":[[-1093,1093,1094]],"properties":{"id":"24661263","dp":10688,"de":0}},{"type":"Polygon","arcs":[[-1092,1095,-1094]],"properties":{"id":"24661264","dp":14722,"de":599}},{"type":"Polygon","arcs":[[1096,1097,1098,1099,1100,-949,1101,1102,1103,1104,1105,1106]],"properties":{"id":"24662550","dp":5727,"de":546}},{"type":"Polygon","arcs":[[-1101,1107,1108,1109,-947]],"properties":{"id":"24662551","dp":8291,"de":0}},{"type":"Polygon","arcs":[[-1100,1110,1111,-1108]],"properties":{"id":"24662552","dp":10076,"de":0}},{"type":"Polygon","arcs":[[-1109,-1112,1112,1113,1114]],"properties":{"id":"24662553","dp":4893,"de":0}},{"type":"Polygon","arcs":[[1115,1116,-1113,-1111,-1099]],"properties":{"id":"24662554","dp":10898,"de":0}},{"type":"Polygon","arcs":[[-1114,-1117,1117,1118,1119]],"properties":{"id":"24662555","dp":9113,"de":0}},{"type":"Polygon","arcs":[[1120,1121,1122,1123,1124,1125,1126,1127,1128,1129]],"properties":{"id":"24662948","dp":453,"de":63}},{"type":"Polygon","arcs":[[1130,1131,1132,-1123,1133,1134]],"properties":{"id":"24662949","dp":1624,"de":1021}},{"type":"MultiPolygon","arcs":[[[1135,1136,1137,-1129,1138,1139,1140]],[[1141]]],"properties":{"id":"24662951","dp":1327,"de":0}},{"type":"Polygon","arcs":[[1142,1143,1144,1145,1146,1147]],"properties":{"id":"24662952","dp":4083,"de":0}},{"type":"Polygon","arcs":[[1148,1149,-1148,1150,1151,-430]],"properties":{"id":"24662953","dp":1585,"de":954}},{"type":"Polygon","arcs":[[-436,1152,1153,-1149,-429]],"properties":{"id":"24662954","dp":4192,"de":0}},{"type":"Polygon","arcs":[[1154,1155,-1154,1156]],"properties":{"id":"24662955","dp":6779,"de":0}},{"type":"Polygon","arcs":[[-1157,-1153,-458,1157]],"properties":{"id":"24662956","dp":4753,"de":0}},{"type":"Polygon","arcs":[[1158,1159,-1155,-1158,-457,-466]],"properties":{"id":"24662957","dp":4014,"de":0}},{"type":"Polygon","arcs":[[-1010,1160,1161,1162,1163,1164,1165,1166]],"properties":{"id":"24661224","dp":3673,"de":543}},{"type":"Polygon","arcs":[[-1163,1167]],"properties":{"id":"24661225","dp":8734,"de":4430}},{"type":"Polygon","arcs":[[1168,1169,-1164,-1168,-1162,1170]],"properties":{"id":"24661226","dp":6306,"de":1749}},{"type":"Polygon","arcs":[[1171,-1171,-1161,-1009]],"properties":{"id":"24661227","dp":7016,"de":665}},{"type":"Polygon","arcs":[[1172,1173,1174,-1169,-1172]],"properties":{"id":"24661228","dp":5756,"de":1204}},{"type":"Polygon","arcs":[[-1006,1175,-1003,1176,-1173,-1008]],"properties":{"id":"24661229","dp":12388,"de":530}},{"type":"Polygon","arcs":[[-1177,1177,1178,1179,1180,-1174]],"properties":{"id":"24661230","dp":5897,"de":482}},{"type":"Polygon","arcs":[[-1165,-1170,-1175,-1181]],"properties":{"id":"24661231","dp":5275,"de":0}},{"type":"Polygon","arcs":[[1181,1182,-1179,1183]],"properties":{"id":"24661232","dp":9961,"de":1413}},{"type":"Polygon","arcs":[[-1184,-1178,-1002,1184]],"properties":{"id":"24661233","dp":8900,"de":955}},{"type":"MultiPolygon","arcs":[[[1185,-821,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200]],[[1201,1202]]],"properties":{"id":"24661242","dp":258,"de":753}},{"type":"Polygon","arcs":[[1203,1204,-1193]],"properties":{"id":"24661243","dp":11314,"de":11896}},{"type":"Polygon","arcs":[[1205,1206,1207,-1194,-1205]],"properties":{"id":"24661244","dp":15228,"de":1428}},{"type":"Polygon","arcs":[[1208,-1084,-1095,-1096,-1091,1209,1210,1211]],"properties":{"id":"24661265","dp":4266,"de":28208}},{"type":"Polygon","arcs":[[1212,1213,1214,1215,1216,1217,1218]],"properties":{"id":"24660302","dp":1865,"de":2736}},{"type":"Polygon","arcs":[[1219,1220,1221,1222,-1213,1223]],"properties":{"id":"24660303","dp":3634,"de":3670}},{"type":"Polygon","arcs":[[1224,-1195,-1208]],"properties":{"id":"24661245","dp":9284,"de":994}},{"type":"Polygon","arcs":[[1225,-1196,-1225,-1207,1226]],"properties":{"id":"24661246","dp":11670,"de":1002}},{"type":"Polygon","arcs":[[1227,-1227,-1206,-1204,1228]],"properties":{"id":"24661247","dp":12923,"de":2769}},{"type":"Polygon","arcs":[[1229,-1229,-1192]],"properties":{"id":"24661248","dp":9450,"de":2094}},{"type":"Polygon","arcs":[[-1191,1230,1231,1232,-1228,-1230]],"properties":{"id":"24661249","dp":10381,"de":2359}},{"type":"Polygon","arcs":[[1233,1234,1235,1236,-1197,-1226,-1233]],"properties":{"id":"24661250","dp":9612,"de":862}},{"type":"Polygon","arcs":[[1237,1238,-1198,-1237]],"properties":{"id":"24661251","dp":12371,"de":1482}},{"type":"Polygon","arcs":[[-1239,1239,1240,1241,1242,1243,-1199]],"properties":{"id":"24661252","dp":4372,"de":11270}},{"type":"Polygon","arcs":[[1244,1245,1246]],"properties":{"id":"24661255","dp":8291,"de":32020}},{"type":"Polygon","arcs":[[-1247,1247,1248,1249,1250,1251,1252]],"properties":{"id":"24661256","dp":4213,"de":74639}},{"type":"Polygon","arcs":[[1253,-1252,1254,1255,1256]],"properties":{"id":"24661257","dp":4213,"de":39480}},{"type":"Polygon","arcs":[[1257,1258,1259,-1255]],"properties":{"id":"24661258","dp":5163,"de":5655}},{"type":"Polygon","arcs":[[-1260,1260,1261,1262,-1256]],"properties":{"id":"24661259","dp":3602,"de":49947}},{"type":"Polygon","arcs":[[1263,-1085,1264,-1261,-1259]],"properties":{"id":"24661260","dp":15390,"de":21335}},{"type":"Polygon","arcs":[[-1265,-1209,1265,-1262]],"properties":{"id":"24661261","dp":13935,"de":18783}},{"type":"Polygon","arcs":[[1266,1267,1268,1269,1270]],"properties":{"id":"24661269","dp":10143,"de":15503}},{"type":"Polygon","arcs":[[1271,1272,1273,-1268,1274]],"properties":{"id":"24661270","dp":25177,"de":24703}},{"type":"Polygon","arcs":[[1275,-1275,-1267,1276]],"properties":{"id":"24661271","dp":23439,"de":12698}},{"type":"Polygon","arcs":[[1277,1278,1279,-1272,-1276,1280]],"properties":{"id":"24661272","dp":23659,"de":14245}},{"type":"Polygon","arcs":[[1281,1282,-1279]],"properties":{"id":"24661273","dp":34525,"de":28212}},{"type":"Polygon","arcs":[[1283,1284,1285,1286,1287]],"properties":{"id":"24661276","dp":32985,"de":4228}},{"type":"Polygon","arcs":[[1288,1289,1290,-1285,1291,1292,1293]],"properties":{"id":"24661277","dp":19180,"de":1803}},{"type":"Polygon","arcs":[[1294,1295,1296,-1290,1297,1298]],"properties":{"id":"24661278","dp":19310,"de":3918}},{"type":"Polygon","arcs":[[-1298,-1289,1299]],"properties":{"id":"24661279","dp":23975,"de":0}},{"type":"Polygon","arcs":[[1300,-1300,1301,1302]],"properties":{"id":"24661280","dp":30720,"de":11261}},{"type":"Polygon","arcs":[[1303,-1302,-1294,1304]],"properties":{"id":"24661281","dp":39278,"de":6443}},{"type":"Polygon","arcs":[[1305,-1305,-1293,1306,-1278]],"properties":{"id":"24661282","dp":20572,"de":14583}},{"type":"Polygon","arcs":[[-1250,1307,1308,1309,1310,1311,-1303,-1304,-1306,1312,1313]],"properties":{"id":"24661283","dp":3006,"de":135078}},{"type":"Polygon","arcs":[[1314,1315,-1299,-1301,-1312]],"properties":{"id":"24661284","dp":5856,"de":10763}},{"type":"Polygon","arcs":[[-1316,1316,1317,-1295]],"properties":{"id":"24661285","dp":31428,"de":2747}},{"type":"Polygon","arcs":[[1318,1319,-1296,-1318]],"properties":{"id":"24661286","dp":19859,"de":4205}},{"type":"Polygon","arcs":[[1320,1321,1322,1323,1324,1325,1326,1327,1328,1329]],"properties":{"id":"24661299","dp":1509,"de":12065}},{"type":"Polygon","arcs":[[1330,1331,1332,-1327]],"properties":{"id":"24661300","dp":12480,"de":0}},{"type":"Polygon","arcs":[[1333,1334,1335,1336,-1331,-1326]],"properties":{"id":"24661301","dp":9872,"de":3200}},{"type":"Polygon","arcs":[[-1337,1337,1338,1339,-1332]],"properties":{"id":"24661302","dp":7579,"de":1460}},{"type":"Polygon","arcs":[[-1338,-1336,1340,1341,1342]],"properties":{"id":"24661303","dp":7226,"de":2176}},{"type":"Polygon","arcs":[[1343,1344,1345,-1342]],"properties":{"id":"24661304","dp":6115,"de":1652}},{"type":"Polygon","arcs":[[1346,-1345,1347,1348]],"properties":{"id":"24661305","dp":11550,"de":7219}},{"type":"Polygon","arcs":[[-1349,1349,1350,1351]],"properties":{"id":"24661306","dp":33834,"de":0}},{"type":"Polygon","arcs":[[1352,1353,-1351]],"properties":{"id":"24661308","dp":20664,"de":0}},{"type":"Polygon","arcs":[[-1350,-1348,1354,1355,1356,1357,-1353]],"properties":{"id":"24661309","dp":4461,"de":8568}},{"type":"Polygon","arcs":[[1358,1359,-1358]],"properties":{"id":"24661310","dp":20965,"de":0}},{"type":"Polygon","arcs":[[1360,1361,1362,1363,1364,1365]],"properties":{"id":"24660395","dp":10242,"de":0}},{"type":"Polygon","arcs":[[1366,1367,1368,1369,1370,-1363]],"properties":{"id":"24660396","dp":10130,"de":0}},{"type":"Polygon","arcs":[[-1366,1371,1372]],"properties":{"id":"24660397","dp":11880,"de":0}},{"type":"Polygon","arcs":[[1373,1374,-1361,-1373,1375,1376,1377,1378,1379,1380,1381]],"properties":{"id":"24660398","dp":3646,"de":2889}},{"type":"Polygon","arcs":[[1382,1383,1384,1385,1386]],"properties":{"id":"24660335","dp":6886,"de":2422}},{"type":"Polygon","arcs":[[1387,1388,1389,1390,1391,1392,-391]],"properties":{"id":"24662081","dp":10320,"de":2533}},{"type":"Polygon","arcs":[[1393,1394,1395,1396,1397]],"properties":{"id":"24660194","dp":6417,"de":1819}},{"type":"Polygon","arcs":[[1398,1399,1400]],"properties":{"id":"24660195","dp":6399,"de":2060}},{"type":"Polygon","arcs":[[1401,1402,1403,1404,-1395,1405,1406]],"properties":{"id":"24660196","dp":6960,"de":1062}},{"type":"Polygon","arcs":[[1407,1408,1409,-1403,1410]],"properties":{"id":"24660197","dp":8815,"de":877}},{"type":"Polygon","arcs":[[1411,1412,1413,-1408,1414,1415,1416]],"properties":{"id":"24660198","dp":5286,"de":423}},{"type":"Polygon","arcs":[[1417,1418,1419,1420,1421,1422,-1409,-1414,1423]],"properties":{"id":"24660199","dp":2222,"de":4573}},{"type":"Polygon","arcs":[[1424,1425,1426,1427,1428,-1214,-1223]],"properties":{"id":"24660304","dp":7336,"de":2680}},{"type":"Polygon","arcs":[[1429,1430,1431,-1425,-1222]],"properties":{"id":"24660305","dp":14721,"de":0}},{"type":"Polygon","arcs":[[1432,1433,-1426,-1432]],"properties":{"id":"24660306","dp":14441,"de":0}},{"type":"Polygon","arcs":[[1434,1435,-1427,-1434]],"properties":{"id":"24660307","dp":13449,"de":0}},{"type":"Polygon","arcs":[[-392,-1393,1436,1437]],"properties":{"id":"24662082","dp":32198,"de":0}},{"type":"Polygon","arcs":[[-393,-1438,1438]],"properties":{"id":"24662083","dp":16061,"de":0}},{"type":"Polygon","arcs":[[-1439,-1437,-1392,1439,1440,1441,1442,1443,-394]],"properties":{"id":"24662084","dp":3544,"de":786}},{"type":"Polygon","arcs":[[-1444,1444,1445,-395]],"properties":{"id":"24662085","dp":9063,"de":550}},{"type":"Polygon","arcs":[[1446,-1446,1447,1448,1449]],"properties":{"id":"24662086","dp":9446,"de":2551}},{"type":"Polygon","arcs":[[1450,1451,1452,1453,1454]],"properties":{"id":"24662087","dp":21285,"de":2428}},{"type":"Polygon","arcs":[[1455,1456,-1452,1457]],"properties":{"id":"24662088","dp":19668,"de":0}},{"type":"Polygon","arcs":[[1458,1459,1460,1461,1462,1463,1464,1465,1466,-1453,-1457,1467,1468,1469]],"properties":{"id":"24662089","dp":3893,"de":3973}},{"type":"Polygon","arcs":[[1470,1471,1472,1473,-1461]],"properties":{"id":"24662090","dp":7603,"de":1143}},{"type":"Polygon","arcs":[[1474,1475,-1471,-1460,1476,1477,1478]],"properties":{"id":"24662091","dp":4567,"de":2314}},{"type":"Polygon","arcs":[[1479,-1479,1480,1481,1482]],"properties":{"id":"24662092","dp":16334,"de":0}},{"type":"Polygon","arcs":[[1483,-1483,1484,1485]],"properties":{"id":"24662093","dp":17883,"de":0}},{"type":"Polygon","arcs":[[1486,1487,1488,1489,-1480,-1484]],"properties":{"id":"24662094","dp":16941,"de":0}},{"type":"Polygon","arcs":[[1490,1491,1492,1493]],"properties":{"id":"24662095","dp":10494,"de":3268}},{"type":"Polygon","arcs":[[1494,1495,1496,-1491,1497]],"properties":{"id":"24662096","dp":11922,"de":2375}},{"type":"Polygon","arcs":[[1498,1499,1500,-1496,1501]],"properties":{"id":"24662097","dp":14433,"de":1889}},{"type":"Polygon","arcs":[[1502,1503,1504]],"properties":{"id":"24662425","dp":2648,"de":227}},{"type":"Polygon","arcs":[[1505,1506,1507,1508,1509,-1505,1510,1511,1512]],"properties":{"id":"24662426","dp":2375,"de":642}},{"type":"Polygon","arcs":[[1513,1514,-1507,1515,1516]],"properties":{"id":"24662427","dp":2989,"de":0}},{"type":"Polygon","arcs":[[1517,-1516,-1506,1518]],"properties":{"id":"24662428","dp":3507,"de":0}},{"type":"Polygon","arcs":[[1519,1520,-1517,-1518]],"properties":{"id":"24662429","dp":2811,"de":0}},{"type":"Polygon","arcs":[[1521,1522,-1514,-1521,1523,1524]],"properties":{"id":"24662430","dp":3947,"de":3220}},{"type":"Polygon","arcs":[[1525,1526,-1525]],"properties":{"id":"24662431","dp":3490,"de":0}},{"type":"Polygon","arcs":[[1527,1528,1529,-1522,-1527,1530,1531,1532]],"properties":{"id":"24662432","dp":60,"de":3143}},{"type":"Polygon","arcs":[[1533,1534,1535,1536]],"properties":{"id":"24661691","dp":10052,"de":0}},{"type":"Polygon","arcs":[[1537,1538,1539,-1535]],"properties":{"id":"24661692","dp":12677,"de":1036}},{"type":"Polygon","arcs":[[1540,1541,1542,1543,1544,1545]],"properties":{"id":"24660275","dp":14750,"de":4621}},{"type":"Polygon","arcs":[[1546,1547,1548,1549,1550,1551]],"properties":{"id":"24660276","dp":4398,"de":1077}},{"type":"Polygon","arcs":[[1552,1553,-1549]],"properties":{"id":"24660277","dp":7535,"de":991}},{"type":"Polygon","arcs":[[-1548,1554,1555,1556,1557,-1553]],"properties":{"id":"24660278","dp":3608,"de":0}},{"type":"Polygon","arcs":[[1558,1559,-1557,1560,1561]],"properties":{"id":"24660279","dp":4084,"de":0}},{"type":"Polygon","arcs":[[-1561,-1556,1562,1563,1564,1565,1566,1567]],"properties":{"id":"24660280","dp":3697,"de":0}},{"type":"Polygon","arcs":[[1568,-1562,-1568,1569,1570]],"properties":{"id":"24660281","dp":6639,"de":3983}},{"type":"Polygon","arcs":[[-1571,-1430,-1221,1571,1572]],"properties":{"id":"24660282","dp":15441,"de":0}},{"type":"Polygon","arcs":[[-1559,-1569,-1573,1573,1574,1575]],"properties":{"id":"24660283","dp":8896,"de":2252}},{"type":"Polygon","arcs":[[-1574,-1572,-1220,1576,1577]],"properties":{"id":"24660284","dp":12043,"de":0}},{"type":"Polygon","arcs":[[-1575,-1578,1578,1579,1580]],"properties":{"id":"24660285","dp":12352,"de":1069}},{"type":"Polygon","arcs":[[1581,1582,-1580,1583]],"properties":{"id":"24660286","dp":11359,"de":0}},{"type":"Polygon","arcs":[[1584,1585,-1582,1586]],"properties":{"id":"24660287","dp":11125,"de":0}},{"type":"Polygon","arcs":[[-1550,-1554,-1558,-1560,-1576,-1581,-1583,-1586,1587]],"properties":{"id":"24660288","dp":2997,"de":572}},{"type":"Polygon","arcs":[[-1551,-1588,-1585,1588,1589]],"properties":{"id":"24660289","dp":4436,"de":3209}},{"type":"Polygon","arcs":[[-1589,-1587,-1584,-1579,-1577,-1224,-1219,1590,1591,1592,1593,1594]],"properties":{"id":"24660290","dp":881,"de":5260}},{"type":"Polygon","arcs":[[1595,1596,1597,-1593]],"properties":{"id":"24660291","dp":13029,"de":0}},{"type":"Polygon","arcs":[[-1597,1598,1599,1600,1601]],"properties":{"id":"24660292","dp":14340,"de":3085}},{"type":"Polygon","arcs":[[-1599,-1596,-1592,1602,1603]],"properties":{"id":"24660293","dp":9424,"de":0}},{"type":"Polygon","arcs":[[-1604,1604,1605,1606,1607,-1600]],"properties":{"id":"24660294","dp":7266,"de":0}},{"type":"Polygon","arcs":[[-1601,-1608,1608,1609,1610]],"properties":{"id":"24660295","dp":10255,"de":0}},{"type":"Polygon","arcs":[[-1607,1611,1612,1613,1614,-1609]],"properties":{"id":"24660296","dp":10027,"de":1426}},{"type":"Polygon","arcs":[[-1614,1615,1616]],"properties":{"id":"24660297","dp":8167,"de":0}},{"type":"Polygon","arcs":[[-1613,1617,1618,-1616]],"properties":{"id":"24660298","dp":6766,"de":0}},{"type":"Polygon","arcs":[[1619,1620,1621,-1618,-1612,-1606]],"properties":{"id":"24660299","dp":8714,"de":2254}},{"type":"Polygon","arcs":[[-1603,-1591,-1218,1622,-1620,-1605]],"properties":{"id":"24660300","dp":4604,"de":0}},{"type":"Polygon","arcs":[[-1217,1623,1624,1625,1626,-1621,-1623]],"properties":{"id":"24660301","dp":1470,"de":1672}},{"type":"Polygon","arcs":[[1627,1628,1629,-1428,-1436,1630]],"properties":{"id":"24660308","dp":11556,"de":0}},{"type":"Polygon","arcs":[[1631,1632,-1628,1633]],"properties":{"id":"24660309","dp":7460,"de":0}},{"type":"Polygon","arcs":[[1634,1635,1636,-1632]],"properties":{"id":"24660310","dp":14345,"de":0}},{"type":"Polygon","arcs":[[1637,1638,1639,1640,-1636,1641]],"properties":{"id":"24660311","dp":13577,"de":0}},{"type":"Polygon","arcs":[[1642,-1639]],"properties":{"id":"24660312","dp":11893,"de":0}},{"type":"Polygon","arcs":[[1643,1644,1645,1646,-1640,-1643,-1638]],"properties":{"id":"24660313","dp":4276,"de":3872}},{"type":"Polygon","arcs":[[1647,1648,1649,1650,1651,-1646,1652]],"properties":{"id":"24660314","dp":1610,"de":1587}},{"type":"Polygon","arcs":[[1653,1654,-1649,1655]],"properties":{"id":"24660315","dp":4853,"de":0}},{"type":"Polygon","arcs":[[1656,-1654,1657]],"properties":{"id":"24660316","dp":10881,"de":0}},{"type":"Polygon","arcs":[[1658,1659,1660]],"properties":{"id":"24660319","dp":15719,"de":0}},{"type":"Polygon","arcs":[[1661,1662,1663,-1659,1664]],"properties":{"id":"24660320","dp":17446,"de":0}},{"type":"Polygon","arcs":[[1665,-1665,1666,1667]],"properties":{"id":"24660321","dp":14506,"de":0}},{"type":"Polygon","arcs":[[1668,-1662,-1666,1669]],"properties":{"id":"24660322","dp":15473,"de":0}},{"type":"Polygon","arcs":[[1670,1671,1672,1673,-1663,-1669]],"properties":{"id":"24660323","dp":9120,"de":0}},{"type":"Polygon","arcs":[[1674,1675,1676,-1672]],"properties":{"id":"24660324","dp":14019,"de":1331}},{"type":"Polygon","arcs":[[-1673,-1677,1677,1678,1679]],"properties":{"id":"24660325","dp":18655,"de":0}},{"type":"Polygon","arcs":[[1680,-1679,1681,1682]],"properties":{"id":"24660326","dp":13955,"de":0}},{"type":"Polygon","arcs":[[1683,-1683,1684]],"properties":{"id":"24660327","dp":14862,"de":0}},{"type":"Polygon","arcs":[[1685,1686,1687,1688,-1685,-1682,1689]],"properties":{"id":"24660328","dp":15552,"de":1036}},{"type":"Polygon","arcs":[[1690,1691,1692,1693,-1688]],"properties":{"id":"24660329","dp":20916,"de":0}},{"type":"Polygon","arcs":[[1694,1695,1696,-1692,1697,1698]],"properties":{"id":"24660330","dp":15639,"de":1044}},{"type":"Polygon","arcs":[[1699,1700,-1696]],"properties":{"id":"24660331","dp":23619,"de":2941}},{"type":"Polygon","arcs":[[-1701,1701,1702,1703]],"properties":{"id":"24660332","dp":12557,"de":0}},{"type":"Polygon","arcs":[[-1703,1704,1705,1706]],"properties":{"id":"24660333","dp":26931,"de":0}},{"type":"Polygon","arcs":[[-1704,-1707,-1384,1707,-1693,-1697]],"properties":{"id":"24660334","dp":17231,"de":1612}},{"type":"Polygon","arcs":[[1708,1709,1710,1711,1712]],"properties":{"id":"24660840","dp":7241,"de":1239}},{"type":"Polygon","arcs":[[1713,-1712,1714,1715,1716]],"properties":{"id":"24660841","dp":11728,"de":793}},{"type":"Polygon","arcs":[[-1715,-1711,1717,1718,1719,1720]],"properties":{"id":"24660842","dp":15317,"de":2705}},{"type":"Polygon","arcs":[[1721,1722,1723,1724,1725]],"properties":{"id":"24660216","dp":12738,"de":0}},{"type":"Polygon","arcs":[[1726,1727,1728,-1723,1729]],"properties":{"id":"24660217","dp":20416,"de":3472}},{"type":"Polygon","arcs":[[1730,-1543,1731,-1728]],"properties":{"id":"24660218","dp":6618,"de":948}},{"type":"Polygon","arcs":[[-1544,-1731,-1727,1732,1733]],"properties":{"id":"24660219","dp":9982,"de":1158}},{"type":"Polygon","arcs":[[-1540,1734,1735]],"properties":{"id":"24661693","dp":10767,"de":0}},{"type":"Polygon","arcs":[[-1735,1736,1737,1738,1739,1740,1741]],"properties":{"id":"24661694","dp":4665,"de":18681}},{"type":"Polygon","arcs":[[-1740,1742,1743,1744]],"properties":{"id":"24661695","dp":10363,"de":0}},{"type":"Polygon","arcs":[[1745,-1741,-1745,1746,1747,1748,1749]],"properties":{"id":"24661696","dp":10017,"de":853}},{"type":"Polygon","arcs":[[1750,1751,-1747,-1744,1752,1753]],"properties":{"id":"24661697","dp":18777,"de":783}},{"type":"Polygon","arcs":[[-1748,-1752,1754,1755,1756]],"properties":{"id":"24661698","dp":9695,"de":0}},{"type":"Polygon","arcs":[[-1755,-1751,1757,1758,1759]],"properties":{"id":"24661699","dp":10851,"de":0}},{"type":"Polygon","arcs":[[-1754,1760,1761,1762,1763,1764,1765,-1758]],"properties":{"id":"24661700","dp":5499,"de":550}},{"type":"Polygon","arcs":[[1766,-1756,-1760,1767,1768,1769]],"properties":{"id":"24661701","dp":6071,"de":0}},{"type":"Polygon","arcs":[[1770,-1768]],"properties":{"id":"24661702","dp":12620,"de":0}},{"type":"MultiPolygon","arcs":[[[1771,1772,1773,1774,1775,1776,1777,1778,1779]],[[1780,1781]],[[1782,1783]],[[1784,1785]]],"properties":{"id":"24662193","dp":2677,"de":1628}},{"type":"Polygon","arcs":[[1786,1787,1788,1789,1790,-1776]],"properties":{"id":"24662194","dp":11546,"de":1251}},{"type":"Polygon","arcs":[[-1777,-1791,1791]],"properties":{"id":"24662195","dp":9233,"de":0}},{"type":"Polygon","arcs":[[1792,1793,-1789]],"properties":{"id":"24662196","dp":9212,"de":0}},{"type":"Polygon","arcs":[[1794,1795,1796,1797,-1790,-1794]],"properties":{"id":"24662197","dp":5282,"de":1479}},{"type":"Polygon","arcs":[[-1795,1798,1799,1800]],"properties":{"id":"24662198","dp":9160,"de":839}},{"type":"Polygon","arcs":[[1801,1802,1803,1804,1805,-1801]],"properties":{"id":"24662199","dp":11124,"de":1282}},{"type":"Polygon","arcs":[[1806,1807,1808,-1802]],"properties":{"id":"24662200","dp":26084,"de":0}},{"type":"Polygon","arcs":[[-1809,1809,1810,-1803]],"properties":{"id":"24662201","dp":18007,"de":0}},{"type":"Polygon","arcs":[[1811,1812,-1804,-1811]],"properties":{"id":"24662202","dp":14267,"de":0}},{"type":"Polygon","arcs":[[-1812,-1810,-1808,1813,1814,1815,1816]],"properties":{"id":"24662203","dp":16359,"de":963}},{"type":"Polygon","arcs":[[-1800,1817,-1814,-1807]],"properties":{"id":"24662204","dp":48198,"de":0}},{"type":"Polygon","arcs":[[1818,-1805,-1813,-1817,1819,1820],[1821]],"properties":{"id":"24662205","dp":7167,"de":0}},{"type":"Polygon","arcs":[[-1822]],"properties":{"id":"24662206","dp":8176,"de":828}},{"type":"Polygon","arcs":[[1822,-1385,-1706]],"properties":{"id":"24660336","dp":24911,"de":0}},{"type":"Polygon","arcs":[[1823,1824,1825,1826,1827,1828,1829,-1386,-1823,-1705,1830]],"properties":{"id":"24660337","dp":1429,"de":714}},{"type":"Polygon","arcs":[[1831,1832,-1824,1833]],"properties":{"id":"24660338","dp":26878,"de":0}},{"type":"Polygon","arcs":[[-1825,-1833,1834]],"properties":{"id":"24660339","dp":24393,"de":0}},{"type":"Polygon","arcs":[[-1826,-1835,-1832,1835,1836]],"properties":{"id":"24660340","dp":5519,"de":0}},{"type":"Polygon","arcs":[[-1836,1837,1838]],"properties":{"id":"24660341","dp":20785,"de":0}},{"type":"Polygon","arcs":[[1839,-1837,-1839,1840]],"properties":{"id":"24660342","dp":15495,"de":0}},{"type":"Polygon","arcs":[[-1840,1841,1842,1843,1844,1845,-1827]],"properties":{"id":"24660343","dp":7521,"de":2920}},{"type":"Polygon","arcs":[[-1841,1846,1847,1848,-1842]],"properties":{"id":"24660344","dp":21048,"de":0}},{"type":"Polygon","arcs":[[1849,-1843,-1849,1850,1851,1852,1853]],"properties":{"id":"24660345","dp":17427,"de":2624}},{"type":"Polygon","arcs":[[1854,1855,-1844,-1850,1856]],"properties":{"id":"24660346","dp":17276,"de":0}},{"type":"Polygon","arcs":[[1857,1858,-1855,1859]],"properties":{"id":"24660347","dp":14938,"de":2006}},{"type":"Polygon","arcs":[[-1860,-1857,1860,1861]],"properties":{"id":"24660348","dp":4517,"de":3622}},{"type":"Polygon","arcs":[[1862,1863,-1861,-1854,1864,1865,1866]],"properties":{"id":"24660349","dp":10616,"de":2312}},{"type":"Polygon","arcs":[[-1853,1867,1868,-1865]],"properties":{"id":"24660350","dp":29850,"de":2500}},{"type":"Polygon","arcs":[[-1852,1869,1870,-1868]],"properties":{"id":"24660351","dp":26300,"de":0}},{"type":"Polygon","arcs":[[-1870,1871]],"properties":{"id":"24660352","dp":26515,"de":0}},{"type":"Polygon","arcs":[[1872,1873,1874,-1871,-1872,-1851,-1848,1875,1876,1877,1878,1879,1880,1881]],"properties":{"id":"24660353","dp":504,"de":4974}},{"type":"Polygon","arcs":[[-1875,1882,-1866,-1869]],"properties":{"id":"24660354","dp":21788,"de":0}},{"type":"Polygon","arcs":[[1883,1884,1885,1886,-1867,-1883,-1874]],"properties":{"id":"24660355","dp":5610,"de":5052}},{"type":"Polygon","arcs":[[1887,1888,-1863,-1887,1889]],"properties":{"id":"24660356","dp":10344,"de":0}},{"type":"Polygon","arcs":[[1890,-1890,-1886,1891]],"properties":{"id":"24660357","dp":10936,"de":2224}},{"type":"Polygon","arcs":[[1892,1893,-1888,-1891,1894]],"properties":{"id":"24660358","dp":4829,"de":3930}},{"type":"Polygon","arcs":[[1895,1896,1897,1898,-1895,-1892,1899]],"properties":{"id":"24660359","dp":5068,"de":5425}},{"type":"Polygon","arcs":[[-1900,-1885,1900,1901]],"properties":{"id":"24660360","dp":9188,"de":4752}},{"type":"Polygon","arcs":[[1902,1903,-1896,-1902,1904,1905]],"properties":{"id":"24660361","dp":8870,"de":2419}},{"type":"Polygon","arcs":[[-1905,-1901,-1884,-1873,1906,1907,1908]],"properties":{"id":"24660362","dp":5838,"de":1838}},{"type":"Polygon","arcs":[[1909,1910,-1908]],"properties":{"id":"24660363","dp":21333,"de":0}},{"type":"Polygon","arcs":[[1911,1912,1913,1914,1915,-997,-989]],"properties":{"id":"24660870","dp":2283,"de":3942}},{"type":"Polygon","arcs":[[-1413,1916,1917,1918,1919,-1424]],"properties":{"id":"24660200","dp":5940,"de":1495}},{"type":"Polygon","arcs":[[1920,-1418,-1920]],"properties":{"id":"24660201","dp":15261,"de":0}},{"type":"Polygon","arcs":[[-1919,1921,1922,-1419,-1921]],"properties":{"id":"24660202","dp":14923,"de":0}},{"type":"Polygon","arcs":[[-621,1923,-614,1924,1925,1926,1927,1928,1929,1930,1931,-1422,1932]],"properties":{"id":"24660203","dp":1500,"de":6992}},{"type":"Polygon","arcs":[[-615,-1924,-620]],"properties":{"id":"24660204","dp":12657,"de":4931}},{"type":"Polygon","arcs":[[1933,1934,1935,1936,1937,1938,1939,1940,1941,1942]],"properties":{"id":"24660812","dp":1273,"de":772}},{"type":"Polygon","arcs":[[1943,1944,-1926]],"properties":{"id":"24660205","dp":20945,"de":1879}},{"type":"Polygon","arcs":[[-607,-1944,-1925,-613]],"properties":{"id":"24660206","dp":15395,"de":0}},{"type":"Polygon","arcs":[[1945,1946,1947,1948,1949,-1928],[1950]],"properties":{"id":"24660207","dp":3459,"de":1886}},{"type":"Polygon","arcs":[[-1951]],"properties":{"id":"24660208","dp":10092,"de":15797}},{"type":"Polygon","arcs":[[1951,1952,-1769,-1771,-1759,-1766,1953,1954,1955,-1595,-1929,-1950]],"properties":{"id":"24660209","dp":919,"de":4717}},{"type":"Polygon","arcs":[[-1765,1956,1957,-1954]],"properties":{"id":"24660210","dp":12107,"de":924}},{"type":"Polygon","arcs":[[1958,1959,-1957,-1764]],"properties":{"id":"24660211","dp":11984,"de":0}},{"type":"Polygon","arcs":[[-1960,1960,-1726,1961]],"properties":{"id":"24660212","dp":17538,"de":0}},{"type":"Polygon","arcs":[[-1962,1962,1963,-1955,-1958]],"properties":{"id":"24660213","dp":10966,"de":5098}},{"type":"Polygon","arcs":[[-1725,1964,-1963]],"properties":{"id":"24660214","dp":16655,"de":0}},{"type":"Polygon","arcs":[[-1965,-1724,-1729,-1732,-1542,-1552,-1590,-1956,-1964]],"properties":{"id":"24660215","dp":2931,"de":6869}},{"type":"Polygon","arcs":[[1965,1966,1967,1968,1969,1970,1971,1972]],"properties":{"id":"24660710","dp":1058,"de":289}},{"type":"Polygon","arcs":[[1973,1974,1975,1976,-1966,1977,1978]],"properties":{"id":"24660711","dp":2449,"de":1123}},{"type":"Polygon","arcs":[[1979,1980,-1974,1981,1982]],"properties":{"id":"24660712","dp":3549,"de":827}},{"type":"Polygon","arcs":[[1983,-1975,-1981,1984]],"properties":{"id":"24660713","dp":5000,"de":1076}},{"type":"Polygon","arcs":[[-1980,1985,1986,-823,-827,1987,1988,-1985]],"properties":{"id":"24660714","dp":2684,"de":481}},{"type":"Polygon","arcs":[[1989,1990,-1716,-1721]],"properties":{"id":"24660843","dp":9278,"de":2295}},{"type":"Polygon","arcs":[[-857,-1990,1991,1992]],"properties":{"id":"24660844","dp":19828,"de":0}},{"type":"Polygon","arcs":[[-858,-1993,1993,1994]],"properties":{"id":"24660845","dp":19557,"de":0}},{"type":"Polygon","arcs":[[-1995,1995,-1045,-1034,-860]],"properties":{"id":"24660846","dp":9328,"de":629}},{"type":"Polygon","arcs":[[-1994,1996,1997,-1040,-1996]],"properties":{"id":"24660847","dp":15994,"de":1771}},{"type":"Polygon","arcs":[[-1992,-1720,1998,1999,-1997]],"properties":{"id":"24660848","dp":20817,"de":0}},{"type":"Polygon","arcs":[[-2000,2000,2001,2002,-1041,-1998]],"properties":{"id":"24660849","dp":12334,"de":0}},{"type":"Polygon","arcs":[[2003,2004,-2001,-1999,-1719]],"properties":{"id":"24660850","dp":8991,"de":0}},{"type":"Polygon","arcs":[[2005,-2002,-2005,2006,2007,-1049]],"properties":{"id":"24660851","dp":3291,"de":663}},{"type":"Polygon","arcs":[[-2003,-2006,-1048,-1042]],"properties":{"id":"24660852","dp":15593,"de":0}},{"type":"Polygon","arcs":[[2008,2009,2010,2011,-1733,-1730,2012]],"properties":{"id":"24660220","dp":15119,"de":3030}},{"type":"Polygon","arcs":[[2013,2014,-2010]],"properties":{"id":"24660221","dp":9971,"de":0}},{"type":"Polygon","arcs":[[-1959,-1763,2015,-2013,-1722,-1961]],"properties":{"id":"24660222","dp":7621,"de":4405}},{"type":"Polygon","arcs":[[-2014,-2009,-2016,-1762,2016]],"properties":{"id":"24660223","dp":12115,"de":0}},{"type":"Polygon","arcs":[[2017,-2011,-2015,-2017,-1761,-1753]],"properties":{"id":"24660224","dp":7843,"de":2973}},{"type":"Polygon","arcs":[[-1739,2018,2019,2020,-2012,-2018,-1743]],"properties":{"id":"24660225","dp":10223,"de":1807}},{"type":"Polygon","arcs":[[2021,2022,2023,-2019,-1738]],"properties":{"id":"24660226","dp":10194,"de":0}},{"type":"Polygon","arcs":[[2024,2025,2026,-1939,2027,2028,2029,2030,2031,-1821,2032,2033,-1533,2034]],"properties":{"id":"24662433","dp":75,"de":1528}},{"type":"Polygon","arcs":[[2035,-2025,2036,2037,2038,2039,2040,2041,2042]],"properties":{"id":"24662434","dp":383,"de":566}},{"type":"Polygon","arcs":[[2043,2044,2045,2046,2047,2048,2049,2050,-2038,2051,2052]],"properties":{"id":"24662435","dp":1157,"de":196}},{"type":"Polygon","arcs":[[-2049,2053,2054]],"properties":{"id":"24662436","dp":4584,"de":978}},{"type":"Polygon","arcs":[[2055,2056,-2046,2057]],"properties":{"id":"24662439","dp":12768,"de":2066}},{"type":"Polygon","arcs":[[2058,-2047,-2057]],"properties":{"id":"24662440","dp":8561,"de":499}},{"type":"Polygon","arcs":[[2059,2060]],"properties":{"id":"24662442","dp":12774,"de":0}},{"type":"Polygon","arcs":[[2061,2062,2063,2064,2065]],"properties":{"id":"24662871","dp":4619,"de":469}},{"type":"Polygon","arcs":[[-2064,2066,2067,2068,-867,2069]],"properties":{"id":"24662872","dp":2712,"de":0}},{"type":"Polygon","arcs":[[2070,2071,-2068,2072,2073]],"properties":{"id":"24662873","dp":8395,"de":0}},{"type":"Polygon","arcs":[[2074,2075,-2073,-2067,-2063,2076,2077,2078]],"properties":{"id":"24662874","dp":5198,"de":676}},{"type":"Polygon","arcs":[[-2076,2079,2080,-2074]],"properties":{"id":"24662875","dp":8431,"de":1984}},{"type":"Polygon","arcs":[[2081,2082,-2071,-2081]],"properties":{"id":"24662876","dp":8885,"de":0}},{"type":"Polygon","arcs":[[2083,2084,-2080,-2075,2085]],"properties":{"id":"24662877","dp":4231,"de":614}},{"type":"Polygon","arcs":[[2086,-2086,-2079,2087,2088]],"properties":{"id":"24662878","dp":5278,"de":946}},{"type":"Polygon","arcs":[[2089,-2089,2090,2091]],"properties":{"id":"24662879","dp":5059,"de":0}},{"type":"Polygon","arcs":[[2092,-2092,2093,2094]],"properties":{"id":"24662880","dp":6737,"de":652}},{"type":"Polygon","arcs":[[-2094,-2091,-2088,-2078,2095,2096,2097,2098]],"properties":{"id":"24662881","dp":2813,"de":530}},{"type":"Polygon","arcs":[[2099,2100,2101,-2097]],"properties":{"id":"24662882","dp":8525,"de":0}},{"type":"Polygon","arcs":[[-2077,-2062,-2100,-2096]],"properties":{"id":"24662883","dp":6157,"de":0}},{"type":"Polygon","arcs":[[2102,-1935,2103,2104,2105]],"properties":{"id":"24660813","dp":12857,"de":0}},{"type":"Polygon","arcs":[[2106,-2104,-1934,2107]],"properties":{"id":"24660814","dp":6033,"de":791}},{"type":"Polygon","arcs":[[2108,2109,-2105,-2107,2110]],"properties":{"id":"24660815","dp":9108,"de":713}},{"type":"Polygon","arcs":[[-2111,-2108,-1943,2111,2112]],"properties":{"id":"24660816","dp":7492,"de":1253}},{"type":"Polygon","arcs":[[2113,-2109,-2113,2114,2115,2116]],"properties":{"id":"24660818","dp":1261,"de":1526}},{"type":"Polygon","arcs":[[-1942,2117,2118,2119,-2112]],"properties":{"id":"24660820","dp":2735,"de":1490}},{"type":"Polygon","arcs":[[-2120,2120,2121,-2115]],"properties":{"id":"24660821","dp":2075,"de":785}},{"type":"Polygon","arcs":[[2122,2123,2124,-2121,2125,2126]],"properties":{"id":"24660822","dp":3376,"de":2525}},{"type":"Polygon","arcs":[[-2119,2127,2128,2129,-2126]],"properties":{"id":"24660823","dp":13409,"de":0}},{"type":"Polygon","arcs":[[-2129,2130,2131,2132,2133,-1913]],"properties":{"id":"24660824","dp":28392,"de":2572}},{"type":"Polygon","arcs":[[2134,2135,2136,-2133]],"properties":{"id":"24660825","dp":5644,"de":613}},{"type":"Polygon","arcs":[[2137,2138,-1914,-2134,-2137,2139]],"properties":{"id":"24660826","dp":2385,"de":6142}},{"type":"Polygon","arcs":[[2140,2141,2142,2143,2144,-2140,-2136]],"properties":{"id":"24660827","dp":4237,"de":437}},{"type":"Polygon","arcs":[[2145,2146,-2141,-2135,-2132]],"properties":{"id":"24660828","dp":4457,"de":344}},{"type":"Polygon","arcs":[[-2146,2147,2148,2149,2150,2151]],"properties":{"id":"24660829","dp":5890,"de":650}},{"type":"Polygon","arcs":[[2152,-2150,2153]],"properties":{"id":"24660830","dp":6060,"de":1155}},{"type":"Polygon","arcs":[[-2154,-2149,2154]],"properties":{"id":"24660832","dp":4675,"de":3640}},{"type":"Polygon","arcs":[[-2152,2155,2156,2157]],"properties":{"id":"24660833","dp":6296,"de":1171}},{"type":"Polygon","arcs":[[-2158,2158,2159,2160,-2142,-2147]],"properties":{"id":"24660834","dp":6118,"de":0}},{"type":"Polygon","arcs":[[2161,2162,2163,2164,-2159]],"properties":{"id":"24660835","dp":8983,"de":2354}},{"type":"Polygon","arcs":[[-2160,-2165,2165,2166,2167]],"properties":{"id":"24660836","dp":6957,"de":582}},{"type":"Polygon","arcs":[[-2161,-2168,2168,-2143]],"properties":{"id":"24660837","dp":6714,"de":513}},{"type":"Polygon","arcs":[[-2144,-2169,-2167,2169,-1709,2170]],"properties":{"id":"24660838","dp":5546,"de":0}},{"type":"Polygon","arcs":[[-2171,-1713,-1714,2171]],"properties":{"id":"24660839","dp":9049,"de":0}},{"type":"Polygon","arcs":[[-2004,-1718,-1710,-2170,-2166,2172,2173,2174,2175,2176,-2007]],"properties":{"id":"24660853","dp":2741,"de":2439}},{"type":"Polygon","arcs":[[-2175,2177,2178,2179,2180,2181,2182,-2176]],"properties":{"id":"24660854","dp":3216,"de":1037}},{"type":"Polygon","arcs":[[-2181,2183]],"properties":{"id":"24660855","dp":5005,"de":728}},{"type":"Polygon","arcs":[[-2174,2184,2185,2186,2187,2188,2189,2190,-2178,2174,-2175]],"properties":{"id":"24660856","dp":7421,"de":1732}},{"type":"Polygon","arcs":[[2191,2192,-2179,-2191]],"properties":{"id":"24660857","dp":4775,"de":374}},{"type":"Polygon","arcs":[[-2190,2193,2194,2195,-2192]],"properties":{"id":"24660858","dp":3480,"de":1312}},{"type":"Polygon","arcs":[[-2173,-2164,2196,2197,-2185]],"properties":{"id":"24660859","dp":11472,"de":0}},{"type":"Polygon","arcs":[[2198,2199,-2186,-2198]],"properties":{"id":"24660860","dp":40687,"de":3439}},{"type":"Polygon","arcs":[[-2187,-2200,2200,2201]],"properties":{"id":"24660861","dp":51902,"de":2989}},{"type":"Polygon","arcs":[[2202,-2188,-2202,2203,2204]],"properties":{"id":"24660862","dp":19757,"de":3238}},{"type":"Polygon","arcs":[[-2205,2205,2206,2207]],"properties":{"id":"24660863","dp":23466,"de":0}},{"type":"Polygon","arcs":[[-2206,-2204,-2201,-2199,-2197,-2163,2208]],"properties":{"id":"24660864","dp":16176,"de":3008}},{"type":"Polygon","arcs":[[2209,2210,2211,-1717,-1991,-856]],"properties":{"id":"24660865","dp":10490,"de":481}},{"type":"Polygon","arcs":[[-2145,-2172,-2212,2212]],"properties":{"id":"24660866","dp":12103,"de":887}},{"type":"Polygon","arcs":[[2213,-1915,-2139,2214,2215,-999]],"properties":{"id":"24660868","dp":7760,"de":836}},{"type":"Polygon","arcs":[[-1916,-2214,-998]],"properties":{"id":"24660869","dp":13318,"de":2586}},{"type":"Polygon","arcs":[[2216,2217,-2020,-2024]],"properties":{"id":"24660227","dp":10606,"de":1590}},{"type":"Polygon","arcs":[[2218,-2217,-2023,2219]],"properties":{"id":"24660228","dp":10064,"de":0}},{"type":"Polygon","arcs":[[2220,2221,2222,-2220,-2022]],"properties":{"id":"24660229","dp":9885,"de":821}},{"type":"Polygon","arcs":[[2223,2224,2225,-2222,2226]],"properties":{"id":"24660230","dp":9353,"de":0}},{"type":"Polygon","arcs":[[2227,2228,-2224,2229,2230]],"properties":{"id":"24660231","dp":13943,"de":1132}},{"type":"Polygon","arcs":[[2231,2232,2233,-2228,2234]],"properties":{"id":"24660232","dp":12870,"de":4582}},{"type":"Polygon","arcs":[[2235,2236,2237,2238,2239,-2233]],"properties":{"id":"24660233","dp":12546,"de":936}},{"type":"Polygon","arcs":[[2240,2241,-2236,-2232,2242,2243]],"properties":{"id":"24660234","dp":10162,"de":1711}},{"type":"Polygon","arcs":[[2244,2245,2246,2247,-2237,-2242,2248]],"properties":{"id":"24660235","dp":5817,"de":2967}},{"type":"Polygon","arcs":[[2249,2250,-2246,2251]],"properties":{"id":"24660236","dp":15345,"de":1257}},{"type":"Polygon","arcs":[[2252,2253,2254]],"properties":{"id":"24660238","dp":20508,"de":0}},{"type":"Polygon","arcs":[[2255,2256,2257,-2254,2258]],"properties":{"id":"24660239","dp":17380,"de":0}},{"type":"Polygon","arcs":[[2259,2260,2261,-2238,-2248,2262]],"properties":{"id":"24660241","dp":6161,"de":4545}},{"type":"Polygon","arcs":[[2263,2264,2265,2266,2267,2268,-2260,2269]],"properties":{"id":"24660242","dp":5450,"de":702}},{"type":"Polygon","arcs":[[2270,2271,2272,-2265,2273,2274]],"properties":{"id":"24660243","dp":8307,"de":2451}},{"type":"Polygon","arcs":[[2275,2276,-2273,2277]],"properties":{"id":"24660244","dp":14548,"de":1315}},{"type":"Polygon","arcs":[[2278,2279,-2278,-2272,2280]],"properties":{"id":"24660245","dp":17713,"de":0}},{"type":"Polygon","arcs":[[2281,2282,-2276,-2280,2283]],"properties":{"id":"24660246","dp":16062,"de":2106}},{"type":"Polygon","arcs":[[2284,2285,-2284,-2279,2286,2287]],"properties":{"id":"24660247","dp":21906,"de":0}},{"type":"Polygon","arcs":[[2288,2289,2290,-2282,-2286]],"properties":{"id":"24660248","dp":18379,"de":0}},{"type":"Polygon","arcs":[[2291,2292,2293,2294,-2289,-2285]],"properties":{"id":"24660249","dp":13646,"de":1918}},{"type":"Polygon","arcs":[[-1001,2295,2296,-1018,-1026,-992,-996]],"properties":{"id":"24660744","dp":16730,"de":1026}},{"type":"Polygon","arcs":[[-2216,2297,2298,-2296,-1000]],"properties":{"id":"24660745","dp":6708,"de":1012}},{"type":"Polygon","arcs":[[-2299,2299,2300,2301,-1019,-2297]],"properties":{"id":"24660746","dp":5153,"de":2351}},{"type":"Polygon","arcs":[[2302,-855,-863,-1016,-2302]],"properties":{"id":"24660748","dp":9417,"de":2579}},{"type":"Polygon","arcs":[[-2124,2303,-2127,-2130,-1912,-994,-988,2304,2305,2306,2307,2308,2309,2310]],"properties":{"id":"24660871","dp":622,"de":2045}},{"type":"Polygon","arcs":[[-2304,-2123]],"properties":{"id":"24660872","dp":23146,"de":0}},{"type":"Polygon","arcs":[[2311,2312,2313,2314,-777,-774,-773,-769,-761,2315,2316]],"properties":{"id":"24660874","dp":228,"de":2471}},{"type":"Polygon","arcs":[[2317,-779,-2315,2318,2319,-702]],"properties":{"id":"24660876","dp":3867,"de":2463}},{"type":"Polygon","arcs":[[2320,2321,2322,2323,2324,2325,2326]],"properties":{"id":"24662209","dp":5617,"de":1367}},{"type":"Polygon","arcs":[[2327,2328,2329,-2324]],"properties":{"id":"24662210","dp":9661,"de":0}},{"type":"Polygon","arcs":[[2330,2331,-2328,2332,2333]],"properties":{"id":"24662211","dp":5038,"de":0}},{"type":"Polygon","arcs":[[2334,-2333,-2323,2335,2336]],"properties":{"id":"24662212","dp":5151,"de":1397}},{"type":"Polygon","arcs":[[-2336,-2322,2337,2338,2339]],"properties":{"id":"24662213","dp":4664,"de":559}},{"type":"Polygon","arcs":[[-2321,2340,-2338]],"properties":{"id":"24662214","dp":25404,"de":0}},{"type":"Polygon","arcs":[[2341,-2339,-2341,-2327,2342]],"properties":{"id":"24662215","dp":26156,"de":0}},{"type":"Polygon","arcs":[[-1787,-1775,2343,-2337,-2340,-2342,2344]],"properties":{"id":"24662216","dp":8094,"de":2005}},{"type":"Polygon","arcs":[[-1799,-1793,-1788,-2345,-2343,-2326,-1815,-1818]],"properties":{"id":"24662217","dp":4662,"de":4977}},{"type":"Polygon","arcs":[[2345,2346,2347,2348,2349,2350,2351,2352]],"properties":{"id":"24662528","dp":6375,"de":1910}},{"type":"Polygon","arcs":[[2353,2354,-2353,2355,2356,-546,-550,-553]],"properties":{"id":"24662529","dp":3087,"de":738}},{"type":"Polygon","arcs":[[2357,2358,2359,-2355,2360]],"properties":{"id":"24662530","dp":5897,"de":4387}},{"type":"Polygon","arcs":[[2361,2362,-2361,-2354,-552,-555,-558]],"properties":{"id":"24662531","dp":5424,"de":2358}},{"type":"Polygon","arcs":[[2363,2364,2365,-2358,-2363]],"properties":{"id":"24662532","dp":8260,"de":1482}},{"type":"Polygon","arcs":[[-2365,2366,2367,2368]],"properties":{"id":"24662533","dp":19497,"de":2261}},{"type":"Polygon","arcs":[[2369,2370,-2367,-2364,-2362,-561]],"properties":{"id":"24662534","dp":9025,"de":2481}},{"type":"Polygon","arcs":[[2371,2372,2373,2374,-2368,-2371,2375]],"properties":{"id":"24662535","dp":5193,"de":1570}},{"type":"Polygon","arcs":[[2376,-2376,-2370,-560,-568]],"properties":{"id":"24662536","dp":6181,"de":2325}},{"type":"Polygon","arcs":[[-580,2377,2378,-2377,-567,-571]],"properties":{"id":"24662537","dp":8931,"de":0}},{"type":"Polygon","arcs":[[2379,2380,2381,-2378,-579]],"properties":{"id":"24662538","dp":7771,"de":0}},{"type":"Polygon","arcs":[[2382,-2380,-578]],"properties":{"id":"24662539","dp":9813,"de":0}},{"type":"Polygon","arcs":[[-2381,-2383,-582,2383,2384,2385,2386]],"properties":{"id":"24662540","dp":7382,"de":0}},{"type":"Polygon","arcs":[[-2387,2387,2388,-2372,-2379,-2382]],"properties":{"id":"24662541","dp":6209,"de":3255}},{"type":"Polygon","arcs":[[-592,-594,2389,2390,2391,-2384,-588,-590]],"properties":{"id":"24662542","dp":6060,"de":5127}},{"type":"Polygon","arcs":[[2392,2393,2394,2395,2396,-2385,-2392]],"properties":{"id":"24662543","dp":2786,"de":4994}},{"type":"Polygon","arcs":[[2397,2398,-2393]],"properties":{"id":"24662544","dp":12186,"de":3422}},{"type":"Polygon","arcs":[[-2399,2399,-1103,2400,2401,2402,-2394]],"properties":{"id":"24662545","dp":2981,"de":193}},{"type":"Polygon","arcs":[[2403,-1104,-2400,-2398,-2391,2404,-598]],"properties":{"id":"24662546","dp":6713,"de":2941}},{"type":"Polygon","arcs":[[-2405,-2390,-599]],"properties":{"id":"24662547","dp":30883,"de":0}},{"type":"Polygon","arcs":[[-1110,-1115,2405,-2401,-1102,-948]],"properties":{"id":"24662548","dp":3129,"de":1403}},{"type":"MultiPolygon","arcs":[[[2406]],[[2407,2408,2409,2410,2411,2412,2413,2414,2415,2416]],[[2417]]],"properties":{"id":"24660981","dp":1087,"de":199}},{"type":"Polygon","arcs":[[2418,2419,-2411,2420]],"properties":{"id":"24660982","dp":16381,"de":0}},{"type":"Polygon","arcs":[[2421,2422,-2419,2423]],"properties":{"id":"24660983","dp":12144,"de":0}},{"type":"MultiPolygon","arcs":[[[2424,2425,2426,2427,2428,-2424,-2421,-2410]],[[2429]],[[-2408,2430]]],"properties":{"id":"24660984","dp":1590,"de":0}},{"type":"Polygon","arcs":[[2431,2432,2433,-2427]],"properties":{"id":"24660985","dp":2890,"de":0}},{"type":"Polygon","arcs":[[2434,2435,2436,-2433]],"properties":{"id":"24660986","dp":10024,"de":0}},{"type":"Polygon","arcs":[[2437,2438,2439,2440,-2436]],"properties":{"id":"24660987","dp":8861,"de":0}},{"type":"Polygon","arcs":[[-2415,2441,2442,2443]],"properties":{"id":"24660988","dp":9694,"de":0}},{"type":"Polygon","arcs":[[-2414,2444,2445,-2442]],"properties":{"id":"24660989","dp":8756,"de":1813}},{"type":"Polygon","arcs":[[2446,2447,-2446,2448,2449,2450]],"properties":{"id":"24660990","dp":6031,"de":694}},{"type":"Polygon","arcs":[[2451,2452,2453,2454,-2450,2455]],"properties":{"id":"24660991","dp":7671,"de":0}},{"type":"Polygon","arcs":[[2456,-2456,-2449,-2445,2457]],"properties":{"id":"24660992","dp":9300,"de":686}},{"type":"Polygon","arcs":[[2458,2459,2460,2461]],"properties":{"id":"24660929","dp":5500,"de":1386}},{"type":"Polygon","arcs":[[2462,2463,2464,2465,-2459,2466,2467]],"properties":{"id":"24660930","dp":3388,"de":0}},{"type":"Polygon","arcs":[[2468,2469,2470,2471,2472,2473,2474]],"properties":{"id":"24660931","dp":2322,"de":601}},{"type":"Polygon","arcs":[[2475,2476,2477,-2463,-2472,2478]],"properties":{"id":"24660932","dp":3414,"de":1386}},{"type":"Polygon","arcs":[[2479,2480,-2479,-2471,2481]],"properties":{"id":"24660933","dp":2989,"de":0}},{"type":"Polygon","arcs":[[-2476,-2481,2482]],"properties":{"id":"24660934","dp":7191,"de":1136}},{"type":"Polygon","arcs":[[2483,2484,2485]],"properties":{"id":"24660953","dp":9161,"de":0}},{"type":"Polygon","arcs":[[2486,2487,2488,-2485,2489,2490,2491]],"properties":{"id":"24660954","dp":3154,"de":632}},{"type":"Polygon","arcs":[[2492,2493,2494,2495,2496,2497]],"properties":{"id":"24660955","dp":2302,"de":4021}},{"type":"Polygon","arcs":[[2498,-2495,2499]],"properties":{"id":"24660956","dp":9854,"de":0}},{"type":"Polygon","arcs":[[-2500,-2494,2500,2501]],"properties":{"id":"24660957","dp":7941,"de":0}},{"type":"Polygon","arcs":[[-2501,-2493,2502,2503,2504]],"properties":{"id":"24660958","dp":5311,"de":1425}},{"type":"Polygon","arcs":[[-2504,2505,2506]],"properties":{"id":"24660959","dp":9409,"de":3935}},{"type":"Polygon","arcs":[[2507,2508,2509,-2506,2510,2511]],"properties":{"id":"24660960","dp":7666,"de":0}},{"type":"Polygon","arcs":[[-2508,2512,2513,2514]],"properties":{"id":"24660961","dp":7663,"de":0}},{"type":"Polygon","arcs":[[-2515,2515,2516,-2509]],"properties":{"id":"24660962","dp":10592,"de":0}},{"type":"Polygon","arcs":[[-2514,2517,2518,-2516]],"properties":{"id":"24660963","dp":17674,"de":0}},{"type":"Polygon","arcs":[[2519,-2510,-2517,-2519,2520,-2432,-2426,2521]],"properties":{"id":"24660964","dp":4929,"de":486}},{"type":"MultiPolygon","arcs":[[[-2502,-2505,-2507,-2520,2522,-2496,-2499]],[[2523,2524,2525]]],"properties":{"id":"24660965","dp":2729,"de":1049}},{"type":"Polygon","arcs":[[2526,2527,2528,2529,2530,2531,2532,2533,2534]],"properties":{"id":"24660993","dp":2196,"de":3472}},{"type":"Polygon","arcs":[[2535,2536,-2532]],"properties":{"id":"24660994","dp":13724,"de":0}},{"type":"Polygon","arcs":[[2537,2538,-2536,-2531]],"properties":{"id":"24660995","dp":10984,"de":0}},{"type":"Polygon","arcs":[[2539,-19,-18,2540,2541]],"properties":{"id":"24660997","dp":12708,"de":0}},{"type":"Polygon","arcs":[[-2541,-17,-11,2542,2543,2544]],"properties":{"id":"24660998","dp":11929,"de":0}},{"type":"Polygon","arcs":[[-2543,-15,-9,2545,2546]],"properties":{"id":"24660999","dp":11446,"de":0}},{"type":"Polygon","arcs":[[-2546,-7,-2,-600,2547,2548]],"properties":{"id":"24661000","dp":5922,"de":1085}},{"type":"Polygon","arcs":[[-2544,-2547,-2549,2549,2550]],"properties":{"id":"24661001","dp":13156,"de":0}},{"type":"Polygon","arcs":[[-2550,-2548,-603,2551,2552,2553,2554]],"properties":{"id":"24661002","dp":10699,"de":0}},{"type":"Polygon","arcs":[[2555,-2552,-602,-41,2556]],"properties":{"id":"24661003","dp":10741,"de":1235}},{"type":"Polygon","arcs":[[2557,2558,2559,2560]],"properties":{"id":"24661114","dp":11867,"de":1264}},{"type":"Polygon","arcs":[[2561,2562,-2558,2563]],"properties":{"id":"24661116","dp":17239,"de":0}},{"type":"Polygon","arcs":[[2564,-2564,2565,2566]],"properties":{"id":"24661117","dp":12894,"de":3728}},{"type":"Polygon","arcs":[[2567,2568,2569,2570,-2567,2571]],"properties":{"id":"24661118","dp":9790,"de":7714}},{"type":"Polygon","arcs":[[2572,2573,-2569,2574,2575]],"properties":{"id":"24661119","dp":9914,"de":5109}},{"type":"Polygon","arcs":[[-2575,-2568,2576,2577,2578]],"properties":{"id":"24661120","dp":9918,"de":1103}},{"type":"Polygon","arcs":[[-2572,2579,2580,2581,-2577]],"properties":{"id":"24661121","dp":8755,"de":5661}},{"type":"Polygon","arcs":[[-2566,-2561,2582,2583,-2580]],"properties":{"id":"24661122","dp":15967,"de":2188}},{"type":"Polygon","arcs":[[-2581,-2584,2584,2585]],"properties":{"id":"24661123","dp":17083,"de":0}},{"type":"Polygon","arcs":[[2586,-2578,-2582,-2586,2587,2588,2589]],"properties":{"id":"24661124","dp":4092,"de":4851}},{"type":"Polygon","arcs":[[2590,2591,2592,-1242,2593,2594]],"properties":{"id":"24661125","dp":5881,"de":3774}},{"type":"Polygon","arcs":[[-2594,-1241,2595]],"properties":{"id":"24661126","dp":9908,"de":1987}},{"type":"Polygon","arcs":[[2596,2597,-2596,-1240,-1238,-1236]],"properties":{"id":"24661127","dp":8756,"de":4166}},{"type":"Polygon","arcs":[[-2595,-2598,2598]],"properties":{"id":"24661128","dp":12551,"de":3497}},{"type":"Polygon","arcs":[[2599,2600,2601,-2599,-2597]],"properties":{"id":"24661129","dp":8860,"de":980}},{"type":"Polygon","arcs":[[2602,2603,-2600,-1235]],"properties":{"id":"24661130","dp":13182,"de":1629}},{"type":"Polygon","arcs":[[2604,2605,2606,-2603,-1234,-1232]],"properties":{"id":"24661131","dp":14178,"de":0}},{"type":"Polygon","arcs":[[2607,-2605,-1231,-1190]],"properties":{"id":"24661132","dp":11372,"de":1395}},{"type":"Polygon","arcs":[[-1189,2608,-2606,-2608]],"properties":{"id":"24661133","dp":10964,"de":1169}},{"type":"Polygon","arcs":[[-1188,2609,2610,2611,2612,-2604,-2607,-2609]],"properties":{"id":"24661134","dp":3930,"de":1008}},{"type":"Polygon","arcs":[[2613,2614,-2477,-2483,2615]],"properties":{"id":"24660935","dp":11908,"de":0}},{"type":"Polygon","arcs":[[-2616,2616,2617,2618,2619]],"properties":{"id":"24660936","dp":10886,"de":0}},{"type":"Polygon","arcs":[[-2618,2620,2621,2622,2623]],"properties":{"id":"24660937","dp":10815,"de":0}},{"type":"Polygon","arcs":[[-2622,2624,2625]],"properties":{"id":"24660938","dp":10205,"de":0}},{"type":"Polygon","arcs":[[-2621,-2617,-2480,2626,-2625]],"properties":{"id":"24660939","dp":7011,"de":1597}},{"type":"Polygon","arcs":[[2627,2628,-2623,-2626,-2627,-2482,-2470,2629,2630,2631]],"properties":{"id":"24660940","dp":1940,"de":3894}},{"type":"Polygon","arcs":[[-2629,2632,2633]],"properties":{"id":"24660941","dp":12602,"de":0}},{"type":"Polygon","arcs":[[2634,2635,2636,2637,-2633,-2628,2638]],"properties":{"id":"24660942","dp":11469,"de":0}},{"type":"Polygon","arcs":[[-2637,2639]],"properties":{"id":"24660943","dp":12692,"de":0}},{"type":"Polygon","arcs":[[-2636,2640,2641,2642,-2619,-2624,-2634,-2638,-2640]],"properties":{"id":"24660944","dp":2821,"de":1634}},{"type":"Polygon","arcs":[[2643,2644,-2642,2645]],"properties":{"id":"24660945","dp":6650,"de":0}},{"type":"Polygon","arcs":[[2646,-2614,-2620,-2643,-2645,2647,-2525]],"properties":{"id":"24660946","dp":5511,"de":0}},{"type":"Polygon","arcs":[[-2648,-2644,2648,2649]],"properties":{"id":"24660947","dp":9716,"de":0}},{"type":"Polygon","arcs":[[-2649,-2646,-2641,-2635,2650,2651]],"properties":{"id":"24660948","dp":9356,"de":737}},{"type":"Polygon","arcs":[[-2526,-2650,-2652,2652,-2487,2653]],"properties":{"id":"24660949","dp":10876,"de":493}},{"type":"Polygon","arcs":[[-2488,-2653,-2651,2654,2655]],"properties":{"id":"24660950","dp":9711,"de":679}},{"type":"Polygon","arcs":[[-2489,-2656,2656,-2486]],"properties":{"id":"24660951","dp":14016,"de":0}},{"type":"Polygon","arcs":[[2657,-103,2658,2659,-34]],"properties":{"id":"24661036","dp":9081,"de":3603}},{"type":"Polygon","arcs":[[2660,2661,2662,-2659,-101]],"properties":{"id":"24661037","dp":12683,"de":0}},{"type":"Polygon","arcs":[[2663,2664,-2660,-2663]],"properties":{"id":"24661038","dp":11284,"de":3142}},{"type":"Polygon","arcs":[[-54,-48,-43,-35,-2665,2665]],"properties":{"id":"24661039","dp":6049,"de":2821}},{"type":"Polygon","arcs":[[2666,-58,-55,-2666,-2664,-2662,2667]],"properties":{"id":"24661040","dp":7503,"de":2654}},{"type":"Polygon","arcs":[[2668,-82,-73,-59,-2667]],"properties":{"id":"24661041","dp":12472,"de":976}},{"type":"Polygon","arcs":[[-2661,-100,-89,-2669,-2668]],"properties":{"id":"24661042","dp":14666,"de":1466}},{"type":"Polygon","arcs":[[-30,2669,2670,-2658,-32]],"properties":{"id":"24661043","dp":13705,"de":797}},{"type":"Polygon","arcs":[[-27,2671,2672,-2670,-29]],"properties":{"id":"24661044","dp":13519,"de":0}},{"type":"Polygon","arcs":[[2673,-2672,-26,-24]],"properties":{"id":"24661045","dp":11781,"de":1224}},{"type":"Polygon","arcs":[[-23,-21,-2317,2674,-94,-102,-2671,-2673,-2674]],"properties":{"id":"24661046","dp":766,"de":510}},{"type":"Polygon","arcs":[[-2521,-2518,-2513,-2512,2675,2676,-2438,-2435]],"properties":{"id":"24660966","dp":2365,"de":909}},{"type":"MultiPolygon","arcs":[[[-2503,-2498,2677,2678,-2676,-2511]],[[2679,2680]]],"properties":{"id":"24660967","dp":3800,"de":740}},{"type":"Polygon","arcs":[[-2677,-2679,2681,2682,2683,-2439]],"properties":{"id":"24660968","dp":8178,"de":3130}},{"type":"Polygon","arcs":[[-2684,2684,2685,-2440]],"properties":{"id":"24660969","dp":14061,"de":2207}},{"type":"Polygon","arcs":[[2686,2687,-2685,2688,2689]],"properties":{"id":"24660970","dp":12500,"de":1190}},{"type":"Polygon","arcs":[[-2437,-2441,-2686,-2688,2690,-2434]],"properties":{"id":"24660971","dp":8921,"de":0}},{"type":"Polygon","arcs":[[-2691,-2687,2691,2692,-2428]],"properties":{"id":"24660972","dp":11556,"de":0}},{"type":"Polygon","arcs":[[-2692,-2690,2693,2694]],"properties":{"id":"24660973","dp":12628,"de":0}},{"type":"Polygon","arcs":[[-2695,2695,2696]],"properties":{"id":"24660974","dp":9657,"de":0}},{"type":"Polygon","arcs":[[-2693,-2697,2697,2698,-2422,-2429]],"properties":{"id":"24660975","dp":12725,"de":0}},{"type":"Polygon","arcs":[[-2699,2699,2700,2701,-2420,-2423]],"properties":{"id":"24660976","dp":5042,"de":2127}},{"type":"Polygon","arcs":[[-2701,2702,2703,2704]],"properties":{"id":"24660977","dp":9210,"de":771}},{"type":"Polygon","arcs":[[2705,-2703,2706,2707,-2452,-2457]],"properties":{"id":"24660978","dp":6021,"de":712}},{"type":"Polygon","arcs":[[2708,2709,2710,2711,2712]],"properties":{"id":"24661071","dp":6304,"de":980}},{"type":"Polygon","arcs":[[2713,-2712,2714,-1982,-1979,2715,2716]],"properties":{"id":"24661072","dp":3038,"de":1041}},{"type":"Polygon","arcs":[[2717,-2713,-2714,2718]],"properties":{"id":"24661073","dp":9224,"de":7613}},{"type":"Polygon","arcs":[[2719,2720,2721,2722]],"properties":{"id":"24661080","dp":106320,"de":7200}},{"type":"Polygon","arcs":[[2723,-2723,2724,2725]],"properties":{"id":"24661081","dp":36742,"de":6285}},{"type":"Polygon","arcs":[[2726,-2726,2727,2728]],"properties":{"id":"24661082","dp":65076,"de":19230}},{"type":"Polygon","arcs":[[2729,-2729,2730,2731,2732]],"properties":{"id":"24661083","dp":10943,"de":4716}},{"type":"Polygon","arcs":[[-2732,2733,2734]],"properties":{"id":"24661084","dp":34946,"de":8776}},{"type":"Polygon","arcs":[[2735,-2734,-2731,-2728,2736,2737]],"properties":{"id":"24661086","dp":1993,"de":14953}},{"type":"Polygon","arcs":[[-2725,2738,-228,2739,-2737]],"properties":{"id":"24661087","dp":14900,"de":24502}},{"type":"Polygon","arcs":[[2740,2741,-229,2742,-2721]],"properties":{"id":"24661093","dp":17007,"de":28346}},{"type":"Polygon","arcs":[[-2722,-2743,-225,-2739]],"properties":{"id":"24661094","dp":71875,"de":25390}},{"type":"Polygon","arcs":[[2743,2744,2745]],"properties":{"id":"24661099","dp":13087,"de":2631}},{"type":"Polygon","arcs":[[-2746,2746,2747,2748,2749,2750,2751,2752]],"properties":{"id":"24661100","dp":6033,"de":9406}},{"type":"Polygon","arcs":[[2753,2754,-2753,2755,2756]],"properties":{"id":"24661102","dp":12857,"de":5869}},{"type":"Polygon","arcs":[[2757,2758,-2754,2759]],"properties":{"id":"24661103","dp":19795,"de":6326}},{"type":"Polygon","arcs":[[2760,2761,2762,-2611]],"properties":{"id":"24661135","dp":9961,"de":701}},{"type":"Polygon","arcs":[[2763,2764,2765,-2762]],"properties":{"id":"24661136","dp":10724,"de":0}},{"type":"Polygon","arcs":[[2766,2767,-2764,-2761,-2610,-1187,-820]],"properties":{"id":"24661137","dp":15317,"de":941}},{"type":"Polygon","arcs":[[2768,-2765,-2768,2769]],"properties":{"id":"24661138","dp":14517,"de":0}},{"type":"Polygon","arcs":[[-215,2770,2771,-2770,-2767,-819,2772,-221,-218]],"properties":{"id":"24661139","dp":11507,"de":4767}},{"type":"Polygon","arcs":[[-2772,2773,2774,-2766,-2769]],"properties":{"id":"24661140","dp":12708,"de":925}},{"type":"Polygon","arcs":[[2775,2776,-2774,2777]],"properties":{"id":"24661141","dp":17060,"de":2027}},{"type":"Polygon","arcs":[[-2777,2778,-2763,-2775]],"properties":{"id":"24661142","dp":6130,"de":0}},{"type":"Polygon","arcs":[[2779,2780,-2778,-2771,-214]],"properties":{"id":"24661143","dp":17058,"de":0}},{"type":"Polygon","arcs":[[2781,2782,2783]],"properties":{"id":"24661318","dp":14343,"de":8838}},{"type":"Polygon","arcs":[[2784,-2783,2785,2786]],"properties":{"id":"24661319","dp":21226,"de":1915}},{"type":"Polygon","arcs":[[2787,2788,2789,-2785,2790,2791,2792]],"properties":{"id":"24661320","dp":6695,"de":9399}},{"type":"Polygon","arcs":[[2793,2794,-2789]],"properties":{"id":"24661321","dp":26318,"de":7692}},{"type":"Polygon","arcs":[[-1356,2795,2796,2797]],"properties":{"id":"24661322","dp":15896,"de":0}},{"type":"Polygon","arcs":[[2798,2799,2800,2801,-2796]],"properties":{"id":"24661323","dp":20628,"de":0}},{"type":"Polygon","arcs":[[2802,-2800,2803,2804]],"properties":{"id":"24661324","dp":10893,"de":0}},{"type":"Polygon","arcs":[[-2801,-2803,2805,2806,2807]],"properties":{"id":"24661325","dp":22913,"de":0}},{"type":"Polygon","arcs":[[2808,-2807,2809]],"properties":{"id":"24661326","dp":22238,"de":0}},{"type":"Polygon","arcs":[[-2810,2810,2811]],"properties":{"id":"24661327","dp":28231,"de":0}},{"type":"Polygon","arcs":[[2812,2813,2814,2815,-2812,2816]],"properties":{"id":"24661328","dp":28682,"de":5574}},{"type":"Polygon","arcs":[[-2816,2817,2818,2819,-2808,-2809]],"properties":{"id":"24661329","dp":20798,"de":6230}},{"type":"Polygon","arcs":[[2820,2821,-2802,-2820]],"properties":{"id":"24661330","dp":19015,"de":4166}},{"type":"Polygon","arcs":[[2822,-2797,-2822,2823,2824]],"properties":{"id":"24661331","dp":15550,"de":0}},{"type":"Polygon","arcs":[[2825,2826,2827,2828,-2824,-2821]],"properties":{"id":"24661332","dp":10467,"de":5632}},{"type":"Polygon","arcs":[[2829,-2826,-2819,2830]],"properties":{"id":"24661333","dp":19484,"de":5357}},{"type":"Polygon","arcs":[[2831,2832,2833,-2831,-2818,-2815]],"properties":{"id":"24661334","dp":1442,"de":44407}},{"type":"Polygon","arcs":[[-2817,-2811,-2806,-2805,2834,2835,2836]],"properties":{"id":"24661335","dp":5345,"de":44384}},{"type":"Polygon","arcs":[[2837,2838,-2837,2839,-1334]],"properties":{"id":"24661336","dp":4168,"de":10743}},{"type":"Polygon","arcs":[[2840,2841,2842,-1324]],"properties":{"id":"24661337","dp":6426,"de":2200}},{"type":"Polygon","arcs":[[-2840,-2836,2843,-1341,-1335]],"properties":{"id":"24661338","dp":11828,"de":0}},{"type":"Polygon","arcs":[[-2799,-1355,-1344,-2844,-2835,-2804]],"properties":{"id":"24661339","dp":14736,"de":827}},{"type":"Polygon","arcs":[[2844,2845,2846,2847]],"properties":{"id":"24661340","dp":10679,"de":2341}},{"type":"Polygon","arcs":[[-2845,2848,2849]],"properties":{"id":"24661341","dp":18819,"de":0}},{"type":"Polygon","arcs":[[-2850,2850,2851]],"properties":{"id":"24661342","dp":25999,"de":0}},{"type":"Polygon","arcs":[[-1360,-2851,2852,2853]],"properties":{"id":"24661343","dp":28256,"de":1153}},{"type":"Polygon","arcs":[[2854,2855,2856,-235,-2853]],"properties":{"id":"24661344","dp":11419,"de":0}},{"type":"Polygon","arcs":[[2857,-2855,-2849]],"properties":{"id":"24661345","dp":10982,"de":0}},{"type":"Polygon","arcs":[[2858,-2856,-2858,-2848,2859,2860,2861]],"properties":{"id":"24661346","dp":10621,"de":2118}},{"type":"Polygon","arcs":[[2862,-236,-2857,-2859,2863]],"properties":{"id":"24661347","dp":12509,"de":1636}},{"type":"Polygon","arcs":[[-2612,-2779,-2776,-2781,2864,2865,2866,2867,2868,-78,-84,-96,2869,2870,2871]],"properties":{"id":"24661047","dp":662,"de":1474}},{"type":"Polygon","arcs":[[2872,2873,2874,2875,2876,2877,2878]],"properties":{"id":"24661048","dp":10641,"de":1368}},{"type":"Polygon","arcs":[[2879,-2877,2880,2881]],"properties":{"id":"24661049","dp":15948,"de":0}},{"type":"Polygon","arcs":[[-2876,2882,2883,2884,-2881]],"properties":{"id":"24661050","dp":7888,"de":4583}},{"type":"Polygon","arcs":[[2885,2886,-2884,2887,2888,2889,2890,2891]],"properties":{"id":"24661051","dp":7705,"de":4329}},{"type":"Polygon","arcs":[[-2882,-2885,-2887,2892,2893]],"properties":{"id":"24661052","dp":10079,"de":1888}},{"type":"Polygon","arcs":[[-2893,-2886,2894,2895]],"properties":{"id":"24661053","dp":15918,"de":4373}},{"type":"Polygon","arcs":[[-2878,-2880,-2894,-2896,2896,2897]],"properties":{"id":"24661054","dp":4683,"de":3448}},{"type":"Polygon","arcs":[[-2897,2898,2899,2900,2901,2902,2903,-2573,2904]],"properties":{"id":"24661055","dp":5696,"de":7172}},{"type":"Polygon","arcs":[[2905,2906,2907,2908,2909,-2900,2910]],"properties":{"id":"24661058","dp":8016,"de":4474}},{"type":"Polygon","arcs":[[2911,-2908]],"properties":{"id":"24661059","dp":21576,"de":2717}},{"type":"Polygon","arcs":[[-2909,-2912,-2907,2912,2913,2914]],"properties":{"id":"24661060","dp":8331,"de":9517}},{"type":"Polygon","arcs":[[2915,2916,2917,2918]],"properties":{"id":"24660668","dp":18577,"de":0}},{"type":"Polygon","arcs":[[-2918,2919,2920,2921,2922]],"properties":{"id":"24660669","dp":10729,"de":5208}},{"type":"Polygon","arcs":[[2923,2924,-2921,2925]],"properties":{"id":"24660670","dp":32008,"de":0}},{"type":"Polygon","arcs":[[2926,2927,-2924,2928]],"properties":{"id":"24660671","dp":33656,"de":0}},{"type":"Polygon","arcs":[[2929,2930,-2927,2931]],"properties":{"id":"24660672","dp":20829,"de":2183}},{"type":"Polygon","arcs":[[2932,2933,-2930,2934]],"properties":{"id":"24660673","dp":19867,"de":0}},{"type":"Polygon","arcs":[[-2793,2935,2936,2937,2938,-929,-923,-919,2939,2940]],"properties":{"id":"24660676","dp":2074,"de":4783}},{"type":"Polygon","arcs":[[2941,-2934,2942,-2936,-2792]],"properties":{"id":"24660677","dp":7771,"de":3762}},{"type":"Polygon","arcs":[[-2942,-2791,2943,-2931]],"properties":{"id":"24660678","dp":41397,"de":0}},{"type":"Polygon","arcs":[[-2944,-2787,2944,-2928]],"properties":{"id":"24660679","dp":25133,"de":0}},{"type":"Polygon","arcs":[[-2925,-2945,2945]],"properties":{"id":"24660680","dp":17854,"de":0}},{"type":"Polygon","arcs":[[2946,-2922,-2946,-2786,2947,-2825,-2829]],"properties":{"id":"24660681","dp":12996,"de":1167}},{"type":"Polygon","arcs":[[-2923,-2947,-2828,2948]],"properties":{"id":"24660682","dp":8995,"de":0}},{"type":"Polygon","arcs":[[2949,-2919,-2949,-2827]],"properties":{"id":"24660683","dp":17903,"de":0}},{"type":"Polygon","arcs":[[2950,-2950,-2830,2951]],"properties":{"id":"24660684","dp":25898,"de":0}},{"type":"Polygon","arcs":[[2952,2953,-2952,-2834]],"properties":{"id":"24660685","dp":26000,"de":0}},{"type":"Polygon","arcs":[[2954,-231,-2760,-2757,2955,2956,2957,-1310,2958]],"properties":{"id":"24661104","dp":6626,"de":56553}},{"type":"Polygon","arcs":[[2959,-2740,-227,-2955]],"properties":{"id":"24661105","dp":14474,"de":80365}},{"type":"Polygon","arcs":[[2960,2961,-2738,-2960,-2959,-1309,2962,2963]],"properties":{"id":"24661106","dp":3120,"de":61103}},{"type":"Polygon","arcs":[[2964,2965,2966,2967]],"properties":{"id":"24661108","dp":11387,"de":1438}},{"type":"Polygon","arcs":[[-2589,2968,2969,-2965]],"properties":{"id":"24661109","dp":19050,"de":0}},{"type":"Polygon","arcs":[[-2583,2970,2971,-2969,-2588,-2585]],"properties":{"id":"24661110","dp":11532,"de":4125}},{"type":"Polygon","arcs":[[-2972,2972,2973]],"properties":{"id":"24661111","dp":18640,"de":3236}},{"type":"Polygon","arcs":[[2974,-242,2975,-175]],"properties":{"id":"24663212","dp":18537,"de":1679}},{"type":"Polygon","arcs":[[-178,-2976,2976,-202,-232]],"properties":{"id":"24663213","dp":8255,"de":0}},{"type":"Polygon","arcs":[[-241,2977,2978,-203,-2977]],"properties":{"id":"24663214","dp":12494,"de":4880}},{"type":"MultiPolygon","arcs":[[[2979,2980,2981,2982]],[[2983]],[[2984,2985,2986,2987,2988]]],"properties":{"id":"24663067","dp":259,"de":112}},{"type":"Polygon","arcs":[[-2953,-2833,2989,2990]],"properties":{"id":"24660686","dp":8668,"de":1815}},{"type":"Polygon","arcs":[[2991,2992,-2991,2993]],"properties":{"id":"24660687","dp":22923,"de":10073}},{"type":"Polygon","arcs":[[2994,2995,2996,-2990]],"properties":{"id":"24660688","dp":20687,"de":0}},{"type":"Polygon","arcs":[[2997,-2996,2998,2999]],"properties":{"id":"24660689","dp":29575,"de":0}},{"type":"Polygon","arcs":[[3000,-3000,3001,3002]],"properties":{"id":"24660690","dp":12919,"de":0}},{"type":"Polygon","arcs":[[-3003,3003,3004,3005,3006]],"properties":{"id":"24660691","dp":5439,"de":20443}},{"type":"Polygon","arcs":[[-3004,-3002,-2999,3007,3008]],"properties":{"id":"24660692","dp":11088,"de":3901}},{"type":"Polygon","arcs":[[-3008,-2995,-2832,3009]],"properties":{"id":"24660693","dp":22857,"de":14285}},{"type":"Polygon","arcs":[[3010,-3009,-3010,-2814,3011]],"properties":{"id":"24660694","dp":22350,"de":14035}},{"type":"Polygon","arcs":[[3012,-3012,-2813,-2839]],"properties":{"id":"24660695","dp":20388,"de":1124}},{"type":"Polygon","arcs":[[3013,-3005,-3011,-3013,3014,3015]],"properties":{"id":"24660696","dp":24400,"de":5555}},{"type":"Polygon","arcs":[[-3015,-2838,-1325,-2843]],"properties":{"id":"24660697","dp":15011,"de":4231}},{"type":"Polygon","arcs":[[3016,-3016,-2842]],"properties":{"id":"24660698","dp":21565,"de":10869}},{"type":"Polygon","arcs":[[3017,-3006,-3014,-3017,-2841,-1323,3018]],"properties":{"id":"24660699","dp":6191,"de":8508}},{"type":"Polygon","arcs":[[3019,-3019,-1322,3020,3021,3022]],"properties":{"id":"24660700","dp":15954,"de":22330}},{"type":"Polygon","arcs":[[-3022,3023,3024]],"properties":{"id":"24660701","dp":33450,"de":0}},{"type":"MultiPolygon","arcs":[[[3025,3026,3027,3028,3029,3030,-2866]],[[3031,-2868,3032]]],"properties":{"id":"24661184","dp":4169,"de":2953}},{"type":"Polygon","arcs":[[-3029,3033,3034]],"properties":{"id":"24661185","dp":12280,"de":1253}},{"type":"Polygon","arcs":[[-79,-2869,3035,-67,-72]],"properties":{"id":"24661187","dp":9794,"de":940}},{"type":"MultiPolygon","arcs":[[[3036,3037,3038,3039,3040,3041,3042]],[[3043,-69,3044,3045]]],"properties":{"id":"24661189","dp":6727,"de":727}},{"type":"MultiPolygon","arcs":[[[3046,3047,3048,3049,3050,-3037]],[[3051,-63,-3044,3052]]],"properties":{"id":"24661190","dp":8156,"de":1633}},{"type":"Polygon","arcs":[[3053,3054,3055,3056,3057]],"properties":{"id":"24663180","dp":2415,"de":686}},{"type":"Polygon","arcs":[[-3056,3058,3059,3060,3061,3062]],"properties":{"id":"24663181","dp":3183,"de":1018}},{"type":"Polygon","arcs":[[3063,3064,-1509,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074]],"properties":{"id":"24663182","dp":1077,"de":1517}},{"type":"Polygon","arcs":[[3075,-3075]],"properties":{"id":"24663183","dp":5428,"de":877}},{"type":"Polygon","arcs":[[3076,3077,3078,3079,3080,3081,3082]],"properties":{"id":"24663057","dp":593,"de":78}},{"type":"Polygon","arcs":[[3083,3084,3085,-3078]],"properties":{"id":"24663058","dp":2857,"de":312}},{"type":"Polygon","arcs":[[3086,3087,3088,3089,-3080,3090]],"properties":{"id":"24663059","dp":2379,"de":437}},{"type":"Polygon","arcs":[[3091,3092,-3088,3093]],"properties":{"id":"24663060","dp":2919,"de":0}},{"type":"Polygon","arcs":[[3094,-3089,-3093,3095]],"properties":{"id":"24663061","dp":3187,"de":250}},{"type":"Polygon","arcs":[[3096,3097,3098,-3090,-3095]],"properties":{"id":"24663062","dp":2804,"de":0}},{"type":"Polygon","arcs":[[3099,3100,-2986,3101,-2983,3102,3103]],"properties":{"id":"24663068","dp":126,"de":44}},{"type":"Polygon","arcs":[[-2538,-2530,3104,-703,-2320,3105,3106,-2312,-20,-2540,3107]],"properties":{"id":"24663306","dp":8248,"de":513}},{"type":"Polygon","arcs":[[3108,-1073,3109,3110,3111,3112,3113,-2053,3114,3115,3116,3117,3118,-930,-2939]],"properties":{"id":"24663311","dp":1255,"de":2169}},{"type":"Polygon","arcs":[[3119,-346,-344,-359,-245,-625,3120]],"properties":{"id":"24663314","dp":3789,"de":3877}},{"type":"Polygon","arcs":[[3121,3122,3123,3124,3125,3126,3127,3128]],"properties":{"id":"24663263","dp":4368,"de":4448}},{"type":"Polygon","arcs":[[3129,3130,3131,3132,3133]],"properties":{"id":"24663264","dp":14594,"de":900}},{"type":"Polygon","arcs":[[3134,3135,3136,3137]],"properties":{"id":"24663266","dp":11922,"de":0}},{"type":"Polygon","arcs":[[3138,3139,3140,3141,3142,-3098]],"properties":{"id":"24663063","dp":2789,"de":699}},{"type":"Polygon","arcs":[[3143,3144,-2987,-3101,3145,3146,-3141]],"properties":{"id":"24663064","dp":2965,"de":860}},{"type":"Polygon","arcs":[[-3144,-3140,3147]],"properties":{"id":"24663065","dp":5767,"de":0}},{"type":"Polygon","arcs":[[-2988,-3145,-3148,-3139,3148,3149]],"properties":{"id":"24663066","dp":1821,"de":738}},{"type":"Polygon","arcs":[[3150,-2980,-3102,-2985]],"properties":{"id":"24663069","dp":492,"de":40}},{"type":"Polygon","arcs":[[-3146,-3100,3151,3152,3153]],"properties":{"id":"24663070","dp":2795,"de":0}},{"type":"Polygon","arcs":[[-3154,3154,3155,-3142,-3147]],"properties":{"id":"24663071","dp":2994,"de":0}},{"type":"Polygon","arcs":[[-3153,3156,3157,-3155]],"properties":{"id":"24663072","dp":3381,"de":344}},{"type":"Polygon","arcs":[[-3143,-3156,-3158,3158,-3081,-3099]],"properties":{"id":"24663073","dp":2370,"de":1312}},{"type":"Polygon","arcs":[[-3082,-3159,-3157,-3152,-3104,3159,3160,3161]],"properties":{"id":"24663074","dp":338,"de":51}},{"type":"Polygon","arcs":[[3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,3177]],"properties":{"id":"24663334","dp":0,"de":983}},{"type":"Polygon","arcs":[[3178,3179,3180,3181]],"properties":{"id":"24660010","dp":3254,"de":395}},{"type":"Polygon","arcs":[[-2290,-2295,3182,3183,3184]],"properties":{"id":"24660250","dp":15885,"de":0}},{"type":"Polygon","arcs":[[-3185,3185,3186,-2291]],"properties":{"id":"24660251","dp":18471,"de":2159}},{"type":"Polygon","arcs":[[-3187,3187,3188,-2283]],"properties":{"id":"24660252","dp":12673,"de":1157}},{"type":"Polygon","arcs":[[-3188,-3186,-3184,3189,-1906,-1909,-1911,3190,3191]],"properties":{"id":"24660253","dp":4949,"de":2626}},{"type":"Polygon","arcs":[[-3192,3192,3193,3194]],"properties":{"id":"24660254","dp":12413,"de":2337}},{"type":"Polygon","arcs":[[-3189,-3195,-2266,-2277]],"properties":{"id":"24660255","dp":13650,"de":0}},{"type":"Polygon","arcs":[[3195,3196,-222,-2773,-818]],"properties":{"id":"24661147","dp":16692,"de":3359}},{"type":"Polygon","arcs":[[-813,3197,-3196,-817]],"properties":{"id":"24661148","dp":7286,"de":28963}},{"type":"Polygon","arcs":[[-223,-3197,-3198,3198]],"properties":{"id":"24661149","dp":12032,"de":5954}},{"type":"Polygon","arcs":[[3199,3200,3201,-224,-3199,-812]],"properties":{"id":"24661150","dp":8940,"de":10433}},{"type":"Polygon","arcs":[[3202,3203,-3200,-811]],"properties":{"id":"24661151","dp":10386,"de":2976}},{"type":"Polygon","arcs":[[3204,3205,-3203,-809]],"properties":{"id":"24661152","dp":16071,"de":1488}},{"type":"Polygon","arcs":[[3206,3207,-3205,-806]],"properties":{"id":"24661153","dp":15435,"de":4054}},{"type":"Polygon","arcs":[[3208,3209,3210,3211,-306,-295,-291,3212]],"properties":{"id":"24660082","dp":7922,"de":1243}},{"type":"Polygon","arcs":[[3213,-3213,-290,-288,-283]],"properties":{"id":"24660083","dp":7790,"de":843}},{"type":"Polygon","arcs":[[3214,3215,-3209,-3214,-282,3216]],"properties":{"id":"24660084","dp":8822,"de":0}},{"type":"Polygon","arcs":[[3217,3218,3219,3220,-3217,-281,3221]],"properties":{"id":"24660085","dp":9453,"de":1045}},{"type":"Polygon","arcs":[[3222,3223,3224,-3220]],"properties":{"id":"24660086","dp":12280,"de":0}},{"type":"Polygon","arcs":[[3225,-3223,-3219,3226]],"properties":{"id":"24660087","dp":20078,"de":0}},{"type":"Polygon","arcs":[[3227,-3224,-3226,3228,3229]],"properties":{"id":"24660088","dp":19234,"de":0}},{"type":"MultiPolygon","arcs":[[[3230,3231,3232,3233,3234,3235,3236,-3050,3237]],[[3238,3239,3240,3241,-3052,3242]]],"properties":{"id":"24661191","dp":5217,"de":395}},{"type":"Polygon","arcs":[[3243,-3231,3244,3245]],"properties":{"id":"24661192","dp":10329,"de":3047}},{"type":"Polygon","arcs":[[3246,-3232,-3244,3247]],"properties":{"id":"24661193","dp":14310,"de":2155}},{"type":"Polygon","arcs":[[3248,-3233,-3247,3249,3250]],"properties":{"id":"24661194","dp":10312,"de":780}},{"type":"Polygon","arcs":[[3251,-3234,-3249,3252,3253]],"properties":{"id":"24661195","dp":7338,"de":1778}},{"type":"Polygon","arcs":[[3254,3255,3256,-3235,-3252,3257]],"properties":{"id":"24661196","dp":6634,"de":437}},{"type":"Polygon","arcs":[[3258,3259,3260,3261,3262,-3256]],"properties":{"id":"24661197","dp":10199,"de":1268}},{"type":"Polygon","arcs":[[3263,3264,-3262,3265]],"properties":{"id":"24661198","dp":11922,"de":915}},{"type":"Polygon","arcs":[[3266,3267,-3266,-3261]],"properties":{"id":"24661199","dp":13511,"de":1272}},{"type":"Polygon","arcs":[[3268,3269,3270,3271,-3268,3272]],"properties":{"id":"24661200","dp":7638,"de":0}},{"type":"Polygon","arcs":[[3273,3274,-3271,3275]],"properties":{"id":"24661201","dp":12803,"de":0}},{"type":"Polygon","arcs":[[3276,-3264,-3272,-3275]],"properties":{"id":"24661202","dp":10665,"de":0}},{"type":"Polygon","arcs":[[3277,3278,-354,3279]],"properties":{"id":"24660108","dp":12724,"de":0}},{"type":"Polygon","arcs":[[-1988,-831,-834,-184,-193,3280,3281]],"properties":{"id":"24663184","dp":2621,"de":2323}},{"type":"Polygon","arcs":[[-3282,3282,-1976,-1984,-1989]],"properties":{"id":"24663185","dp":4750,"de":1246}},{"type":"Polygon","arcs":[[-3283,-3281,-198,3283,3284,3285,-1977]],"properties":{"id":"24663186","dp":4383,"de":757}},{"type":"Polygon","arcs":[[3286,3287,-1967,-3286]],"properties":{"id":"24663187","dp":2962,"de":1234}},{"type":"Polygon","arcs":[[3288,-3287,-3285,3289,3290]],"properties":{"id":"24663188","dp":4195,"de":394}},{"type":"Polygon","arcs":[[-3290,3291,3292]],"properties":{"id":"24663189","dp":14500,"de":0}},{"type":"Polygon","arcs":[[-3284,-197,-208,3293,-3292]],"properties":{"id":"24663190","dp":11452,"de":1085}},{"type":"Polygon","arcs":[[3294,3295,-3291]],"properties":{"id":"24663191","dp":16375,"de":0}},{"type":"Polygon","arcs":[[3296,3297,3298,3299,3300,3301,3302]],"properties":{"id":"24663194","dp":6012,"de":1831}},{"type":"Polygon","arcs":[[-3298,3303,3304,3305]],"properties":{"id":"24663195","dp":20000,"de":0}},{"type":"Polygon","arcs":[[3306,3307,3308,-3299,-3306,3309,3310]],"properties":{"id":"24663196","dp":6317,"de":5079}},{"type":"Polygon","arcs":[[3311,-3310,-3305,3312,-210]],"properties":{"id":"24663197","dp":8346,"de":0}},{"type":"Polygon","arcs":[[-204,-2979,3313,-3311,-3312,-209]],"properties":{"id":"24663198","dp":10715,"de":6769}},{"type":"Polygon","arcs":[[-3314,-2978,3314,-114,3315,-3307]],"properties":{"id":"24663199","dp":7392,"de":12541}},{"type":"Polygon","arcs":[[-113,-695,-3308,-3316]],"properties":{"id":"24663200","dp":12563,"de":2689}},{"type":"Polygon","arcs":[[3316,-115,-3315,-240]],"properties":{"id":"24663201","dp":6288,"de":8951}},{"type":"Polygon","arcs":[[3317,3318,-116,-3317,-239]],"properties":{"id":"24663202","dp":11703,"de":3548}},{"type":"Polygon","arcs":[[3319,-127,-117,-3319,3320]],"properties":{"id":"24663203","dp":34809,"de":4761}},{"type":"Polygon","arcs":[[-128,-3320,3321,3322,3323,3324]],"properties":{"id":"24663204","dp":9533,"de":0}},{"type":"Polygon","arcs":[[-3322,-3321,-3318,-238,3325,3326]],"properties":{"id":"24663205","dp":17491,"de":2920}},{"type":"Polygon","arcs":[[-3323,-3327,3327,3328]],"properties":{"id":"24663206","dp":26118,"de":7805}},{"type":"Polygon","arcs":[[3329,-3328,-3326,-244,3330,-173]],"properties":{"id":"24663207","dp":17308,"de":0}},{"type":"Polygon","arcs":[[-161,3331,3332,-3324,-3329,-3330,-172,-164]],"properties":{"id":"24663208","dp":11967,"de":1083}},{"type":"Polygon","arcs":[[-804,3333,3334,-3207]],"properties":{"id":"24661154","dp":13961,"de":2759}},{"type":"Polygon","arcs":[[-802,3335,3336,-3334]],"properties":{"id":"24661155","dp":21612,"de":2764}},{"type":"Polygon","arcs":[[-800,3337,3338,-3336]],"properties":{"id":"24661156","dp":22321,"de":4241}},{"type":"Polygon","arcs":[[3339,3340,-3338,-798]],"properties":{"id":"24661157","dp":19493,"de":0}},{"type":"Polygon","arcs":[[3341,3342,-3340,-796]],"properties":{"id":"24661158","dp":18669,"de":4935}},{"type":"Polygon","arcs":[[3343,3344,-3342,-795]],"properties":{"id":"24661159","dp":14922,"de":2519}},{"type":"Polygon","arcs":[[3345,3346,-3344,-787]],"properties":{"id":"24661160","dp":15663,"de":3763}},{"type":"Polygon","arcs":[[3347,3348,-3346,-785]],"properties":{"id":"24661161","dp":9785,"de":2412}},{"type":"Polygon","arcs":[[3349,3350,3351,-3348,-784]],"properties":{"id":"24661162","dp":13058,"de":1106}},{"type":"Polygon","arcs":[[3352,3353,3354,-3350,-783]],"properties":{"id":"24661163","dp":16531,"de":0}},{"type":"Polygon","arcs":[[3355,3356,-3353,-782,3357]],"properties":{"id":"24661164","dp":16909,"de":0}},{"type":"Polygon","arcs":[[3358,3359,-3356,3360]],"properties":{"id":"24661165","dp":10887,"de":1380}},{"type":"Polygon","arcs":[[3361,-3255,3362,-3361,-3358,-781,3363,3364]],"properties":{"id":"24661166","dp":5202,"de":1692}},{"type":"Polygon","arcs":[[-3258,3365,-3363]],"properties":{"id":"24661167","dp":15246,"de":0}},{"type":"Polygon","arcs":[[-3366,-3254,3366,-3359]],"properties":{"id":"24661168","dp":13460,"de":0}},{"type":"Polygon","arcs":[[-3367,-3253,-3251,3367,-3357,-3360]],"properties":{"id":"24661169","dp":15337,"de":1533}},{"type":"Polygon","arcs":[[-3368,-3250,3368,-3354]],"properties":{"id":"24661170","dp":23842,"de":0}},{"type":"Polygon","arcs":[[-3369,-3248,-3246,3369,-3351,-3355]],"properties":{"id":"24661171","dp":14472,"de":3140}},{"type":"Polygon","arcs":[[-3370,-3245,-3238,-3049,3370,-3349,-3352]],"properties":{"id":"24661172","dp":9834,"de":1731}},{"type":"Polygon","arcs":[[-3371,-3048,3371,-3347]],"properties":{"id":"24661173","dp":13832,"de":3310}},{"type":"Polygon","arcs":[[-3372,-3047,3372,-3345]],"properties":{"id":"24661174","dp":21274,"de":3861}},{"type":"Polygon","arcs":[[-3373,-3043,3373,-3343]],"properties":{"id":"24661175","dp":19230,"de":0}},{"type":"Polygon","arcs":[[-3374,-3042,3374,-3341]],"properties":{"id":"24661176","dp":21751,"de":0}},{"type":"Polygon","arcs":[[-3339,-3375,-3041,3375]],"properties":{"id":"24661177","dp":21036,"de":0}},{"type":"Polygon","arcs":[[-3376,-3040,3376,-3335,-3337]],"properties":{"id":"24661178","dp":6833,"de":3742}},{"type":"Polygon","arcs":[[-3377,3377,3378,-3206,-3208]],"properties":{"id":"24661179","dp":14724,"de":1862}},{"type":"Polygon","arcs":[[-3379,3379,3380,-3204]],"properties":{"id":"24661180","dp":23074,"de":0}},{"type":"Polygon","arcs":[[3381,3382,3383,3384,-3201,-3381]],"properties":{"id":"24661181","dp":18403,"de":2409}},{"type":"Polygon","arcs":[[3385,-3027,3386,-3384]],"properties":{"id":"24661182","dp":11259,"de":1358}},{"type":"Polygon","arcs":[[3387,-3034,-3028,-3386,-3383]],"properties":{"id":"24661183","dp":18908,"de":1649}},{"type":"Polygon","arcs":[[-2744,-2755,-2759,3388]],"properties":{"id":"24663246","dp":31756,"de":5620}},{"type":"Polygon","arcs":[[-1307,-1292,-1284,-1282]],"properties":{"id":"24663249","dp":47225,"de":5161}},{"type":"Polygon","arcs":[[3389,3390,3391,3392,3393]],"properties":{"id":"24663250","dp":12063,"de":3798}},{"type":"Polygon","arcs":[[3394,3395,3396,3397,3398]],"properties":{"id":"24663251","dp":11937,"de":0}},{"type":"Polygon","arcs":[[3399,-1105,-2404,-597,3400]],"properties":{"id":"24663252","dp":26443,"de":1408}},{"type":"Polygon","arcs":[[3401,3402,3403,3404,3405,3406,3407,3408,3409,3410]],"properties":{"id":"24663253","dp":13664,"de":1865}},{"type":"MultiPolygon","arcs":[[[-3274,3411,3412,3413,-3277]],[[3414,-2553,-2556,3415,3416]]],"properties":{"id":"24661203","dp":9063,"de":0}},{"type":"MultiPolygon","arcs":[[[3417,-3236,-3257,-3263,-3265,-3414]],[[3418,-3416,-3239]]],"properties":{"id":"24661204","dp":3052,"de":1081}},{"type":"Polygon","arcs":[[3419,-3240,-2557,-40,-45]],"properties":{"id":"24661205","dp":5939,"de":0}},{"type":"Polygon","arcs":[[-3420,-44,-51,3420,-3241]],"properties":{"id":"24661206","dp":6356,"de":550}},{"type":"Polygon","arcs":[[-53,-64,-3242,-3421]],"properties":{"id":"24661207","dp":10224,"de":0}},{"type":"MultiPolygon","arcs":[[[3421,3422,3423,3424,3425,-3412,-3276,-3270,3426]],[[3427,-2554,-3415,3428]]],"properties":{"id":"24661208","dp":295,"de":1732}},{"type":"Polygon","arcs":[[-3273,-3267,3429,3430,-3365,3431]],"properties":{"id":"24661209","dp":5475,"de":356}},{"type":"Polygon","arcs":[[-3260,3432,-3430]],"properties":{"id":"24661210","dp":15641,"de":0}},{"type":"Polygon","arcs":[[-3431,-3433,-3259,-3362]],"properties":{"id":"24661211","dp":12188,"de":4716}},{"type":"Polygon","arcs":[[3433,3434,-1166,-1180,-1183]],"properties":{"id":"24661212","dp":4038,"de":622}},{"type":"Polygon","arcs":[[3435,3436,3437,3438,3439,3440]],"properties":{"id":"24663269","dp":1061,"de":3255}},{"type":"Polygon","arcs":[[3441,3442,3443,3444,3445,3446,3447,3448,3449]],"properties":{"id":"24663270","dp":7341,"de":307}},{"type":"Polygon","arcs":[[-3408,3450,3451,3452,3453,3454,3455,3456,3457,3458]],"properties":{"id":"24663271","dp":2233,"de":11596}},{"type":"Polygon","arcs":[[-2933,3459,-2937,-2943]],"properties":{"id":"24663273","dp":19587,"de":976}},{"type":"Polygon","arcs":[[-1352,-1354,-2854,3460]],"properties":{"id":"24663274","dp":27500,"de":1973}},{"type":"Polygon","arcs":[[-3020,3461,-3295,-3293,-3294,-212,3462,3463,-3007,-3018]],"properties":{"id":"24663275","dp":4884,"de":10149}},{"type":"Polygon","arcs":[[3464,3465,3466]],"properties":{"id":"24663276","dp":12939,"de":0}},{"type":"Polygon","arcs":[[-152,3467,-3332,-160,-157]],"properties":{"id":"24663209","dp":9659,"de":810}},{"type":"Polygon","arcs":[[-133,-124,-3325,-3333,-3468]],"properties":{"id":"24663210","dp":10178,"de":1002}},{"type":"Polygon","arcs":[[-3331,-243,-2975,-174]],"properties":{"id":"24663211","dp":9648,"de":3079}},{"type":"Polygon","arcs":[[-2184,-2180,3468,3469,3470,3471]],"properties":{"id":"24663288","dp":4980,"de":1679}},{"type":"Polygon","arcs":[[-2895,-2892,3472,-2911,-2899]],"properties":{"id":"24663289","dp":8868,"de":2340}},{"type":"MultiPolygon","arcs":[[[3473,-3030,-3035,-3388,-3382,-3380,-3378,-3039]],[[-3045,-68,-3036,-3032,3474]]],"properties":{"id":"24663290","dp":6596,"de":3206}},{"type":"Polygon","arcs":[[3475,3476]],"properties":{"id":"24663291","dp":16843,"de":0}},{"type":"Polygon","arcs":[[3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488]],"properties":{"id":"24663292","dp":424,"de":759}},{"type":"Polygon","arcs":[[3489,3490,3491,3492,3493,3494,3495]],"properties":{"id":"24663293","dp":3039,"de":13093}},{"type":"Polygon","arcs":[[3496,3497,3498,3499,3500,3501]],"properties":{"id":"24663294","dp":3803,"de":0}},{"type":"Polygon","arcs":[[3502,3503,3504,3505]],"properties":{"id":"24663295","dp":3273,"de":1243}},{"type":"Polygon","arcs":[[3506,3507,3508,3509,3510,3511,3512]],"properties":{"id":"24663296","dp":10980,"de":0}},{"type":"Polygon","arcs":[[3513,3514,3515,3516,3517,3518,3519]],"properties":{"id":"24663297","dp":4062,"de":3647}},{"type":"Polygon","arcs":[[3520,-1611,3521,3522]],"properties":{"id":"24663298","dp":10290,"de":431}},{"type":"Polygon","arcs":[[-3134,3523,3524,3525]],"properties":{"id":"24663299","dp":20633,"de":2816}},{"type":"Polygon","arcs":[[3526,-1007,-1014,-1015,-1012,3527]],"properties":{"id":"24663254","dp":8178,"de":1468}},{"type":"Polygon","arcs":[[3528,-3434,-1182,-1185,-1004,-1176,-1005,-3527]],"properties":{"id":"24663255","dp":13213,"de":1348}},{"type":"Polygon","arcs":[[-2151,-2153,-2155,-2148,-2131,-2128,-2118,-1941,3529,3530,3531,-2156]],"properties":{"id":"24663256","dp":2761,"de":842}},{"type":"Polygon","arcs":[[-2914,3532,3533,3534,3535,3536,3537,3538,3539]],"properties":{"id":"24663257","dp":2943,"de":5095}},{"type":"Polygon","arcs":[[3540,3541,3542,3543,3544,-3537]],"properties":{"id":"24663258","dp":19200,"de":5619}},{"type":"Polygon","arcs":[[3545,-2054,-2048,-2059,-2056]],"properties":{"id":"24663259","dp":19775,"de":1810}},{"type":"Polygon","arcs":[[-1816,-2325,3546,3547,-2033,-1820]],"properties":{"id":"24663260","dp":5799,"de":302}},{"type":"Polygon","arcs":[[3548,-943,3549,3550,3551,3552,3553]],"properties":{"id":"24663261","dp":10430,"de":2822}},{"type":"Polygon","arcs":[[3554,3555,3556,3557,3558]],"properties":{"id":"24663262","dp":21363,"de":1420}},{"type":"Polygon","arcs":[[3559,3560,3561,3562]],"properties":{"id":"24663277","dp":11305,"de":1820}},{"type":"Polygon","arcs":[[-993,-1025,-984]],"properties":{"id":"24663278","dp":41141,"de":6974}},{"type":"Polygon","arcs":[[-3472,3563,3564,-2182]],"properties":{"id":"24663279","dp":24677,"de":2263}},{"type":"Polygon","arcs":[[3565,-3470,3566,-2039,-2051]],"properties":{"id":"24663280","dp":5196,"de":4803}},{"type":"Polygon","arcs":[[3567,3568,3569,3570,3571,3572,3573,3574]],"properties":{"id":"24663281","dp":12352,"de":5560}},{"type":"Polygon","arcs":[[3575,-1626,3576,3577,3578,3579,3580,3581,3582,3583]],"properties":{"id":"24663282","dp":403,"de":1720}},{"type":"Polygon","arcs":[[3584,-2255,-2258,-2270,-2263,-2247,-2251]],"properties":{"id":"24663283","dp":14097,"de":2115}},{"type":"Polygon","arcs":[[-1664,3585,3586,3587,-1650,-1655,-1657,3588,-1660]],"properties":{"id":"24663284","dp":5898,"de":454}},{"type":"Polygon","arcs":[[3589,3590,3591,3592,3593,3594,3595]],"properties":{"id":"24663285","dp":4915,"de":722}},{"type":"Polygon","arcs":[[-180,-190,-188]],"properties":{"id":"24663286","dp":14516,"de":3151}},{"type":"Polygon","arcs":[[-840,-186,-837,3596]],"properties":{"id":"24663287","dp":9080,"de":3738}},{"type":"Polygon","arcs":[[3597,-3526,3598,3599]],"properties":{"id":"24663300","dp":4306,"de":7142}},{"type":"Polygon","arcs":[[3600,3601,3602,3603,3604,3605,3606]],"properties":{"id":"24663301","dp":5000,"de":874}},{"type":"Polygon","arcs":[[-3598,3607,3608,-3603,3609,3610,3611,3612,-3130]],"properties":{"id":"24663302","dp":2740,"de":3662}},{"type":"Polygon","arcs":[[-2319,-2314,3613,-3106]],"properties":{"id":"24663304","dp":4222,"de":1674}},{"type":"Polygon","arcs":[[-3614,-2313,-3107]],"properties":{"id":"24663305","dp":11317,"de":0}},{"type":"Polygon","arcs":[[-3182,3614,3615,3616]],"properties":{"id":"24660011","dp":3302,"de":512}},{"type":"Polygon","arcs":[[3617,3618,3619,3620,3621,3622,-1126,3623,-1124,-1133,-3616]],"properties":{"id":"24660012","dp":1821,"de":144}},{"type":"Polygon","arcs":[[3624,-3618,3625]],"properties":{"id":"24660013","dp":5428,"de":0}},{"type":"Polygon","arcs":[[3626,-3621,3627,-3619,-3625]],"properties":{"id":"24660014","dp":4686,"de":0}},{"type":"Polygon","arcs":[[-3620,-3628]],"properties":{"id":"24660015","dp":16000,"de":0}},{"type":"Polygon","arcs":[[-1125,-3624]],"properties":{"id":"24660016","dp":7637,"de":0}},{"type":"Polygon","arcs":[[-3466,3628,-3622,-3627,3629,3630]],"properties":{"id":"24660017","dp":4391,"de":0}},{"type":"Polygon","arcs":[[3631,-3467,3632,3633,3634]],"properties":{"id":"24660020","dp":2240,"de":701}},{"type":"Polygon","arcs":[[3635,-3634,3636,3637]],"properties":{"id":"24660021","dp":11277,"de":0}},{"type":"Polygon","arcs":[[3638,3639,3640,-3638,3641,3642]],"properties":{"id":"24660022","dp":2906,"de":441}},{"type":"Polygon","arcs":[[-3637,-3633,-3631,3643,3644,-3642]],"properties":{"id":"24660023","dp":7629,"de":0}},{"type":"Polygon","arcs":[[-3643,-3645,3645,3646,3647]],"properties":{"id":"24660024","dp":6532,"de":636}},{"type":"Polygon","arcs":[[-3644,-3630,-3626,3648,-3646]],"properties":{"id":"24660025","dp":6474,"de":798}},{"type":"Polygon","arcs":[[-451,3649,-3647,-3649,-3615,-3181,3650]],"properties":{"id":"24660026","dp":3172,"de":5079}},{"type":"Polygon","arcs":[[3651,3652,-3639,-3648,-3650]],"properties":{"id":"24660027","dp":4713,"de":0}},{"type":"Polygon","arcs":[[3653,-3640,-3653,3654,3655]],"properties":{"id":"24660028","dp":5487,"de":0}},{"type":"Polygon","arcs":[[3656,-3656,3657]],"properties":{"id":"24660029","dp":7930,"de":0}},{"type":"MultiPolygon","arcs":[[[3658],[3659],[3660],[3661],[3662]],[[3663]],[[3664]],[[3665]],[[3666]],[[-1202,3667]]],"properties":{"id":"24663335","dp":0,"de":1576}},{"type":"Polygon","arcs":[[3668,3669,3670,3671,3672,3673,3674,3675,3676,3677]],"properties":{"id":"24663336","dp":1743,"de":12924}},{"type":"Polygon","arcs":[[3678,3679,-3675]],"properties":{"id":"24663337","dp":16604,"de":10074}},{"type":"Polygon","arcs":[[3680,3681,3682,3683,3684,3685,3686,-3394]],"properties":{"id":"24663340","dp":0,"de":454}},{"type":"Polygon","arcs":[[3687,3688,3689,3690,3691]],"properties":{"id":"24663341","dp":12943,"de":6012}},{"type":"Polygon","arcs":[[3692,3693,3694,3695,3696,3697,-3692,3698]],"properties":{"id":"24663342","dp":7561,"de":11140}},{"type":"Polygon","arcs":[[-3698,3699,-3688]],"properties":{"id":"24663343","dp":15903,"de":4819}},{"type":"Polygon","arcs":[[3700,3701,-3694,3702,3703]],"properties":{"id":"24663344","dp":13444,"de":19335}},{"type":"Polygon","arcs":[[-3703,-3693,3704,3705]],"properties":{"id":"24663345","dp":33611,"de":9444}},{"type":"Polygon","arcs":[[3706,3707,3708,3709,3710]],"properties":{"id":"24663346","dp":13606,"de":4566}},{"type":"Polygon","arcs":[[-1087,-1270,3711,3712,-3708,3713,3714]],"properties":{"id":"24663347","dp":8468,"de":33829}},{"type":"Polygon","arcs":[[-1089,3715,-3714,-3707,3716]],"properties":{"id":"24663348","dp":36692,"de":3846}},{"type":"Polygon","arcs":[[-3715,-3716,-1088]],"properties":{"id":"24663349","dp":45769,"de":3076}},{"type":"Polygon","arcs":[[-1090,-3717,-3711,3717,-1210]],"properties":{"id":"24663350","dp":15335,"de":17449}},{"type":"Polygon","arcs":[[-3179,3718,3719,3720,3721,3722,3723,3724,3725,3726,-1141,3727]],"properties":{"id":"24660001","dp":2047,"de":233}},{"type":"Polygon","arcs":[[3728,3729,3730,-3725]],"properties":{"id":"24660002","dp":5004,"de":0}},{"type":"Polygon","arcs":[[-3731,3731,-3726]],"properties":{"id":"24660003","dp":5058,"de":0}},{"type":"Polygon","arcs":[[-3724,3732,3733,-3729]],"properties":{"id":"24660004","dp":3438,"de":911}},{"type":"Polygon","arcs":[[3734,3735,-3733,-3723]],"properties":{"id":"24660005","dp":3742,"de":0}},{"type":"Polygon","arcs":[[3736,3737,-3735,-3722]],"properties":{"id":"24660006","dp":5415,"de":0}},{"type":"Polygon","arcs":[[-3730,-3734,-3736,-3738,3738,-1131,3739,-1136,-3727,-3732]],"properties":{"id":"24660007","dp":3336,"de":320}},{"type":"Polygon","arcs":[[-3719,-3617,-1132,-3739,-3737,-3721,3740]],"properties":{"id":"24660008","dp":4464,"de":418}},{"type":"Polygon","arcs":[[-3720,-3741]],"properties":{"id":"24660009","dp":4909,"de":0}},{"type":"Polygon","arcs":[[3741,3742,3743,-3230]],"properties":{"id":"24660089","dp":8651,"de":0}},{"type":"Polygon","arcs":[[3744,-3742,-3229,3745,3746]],"properties":{"id":"24660090","dp":15840,"de":0}},{"type":"Polygon","arcs":[[3747,-3746,-3227,-3218]],"properties":{"id":"24660091","dp":10712,"de":4502}},{"type":"Polygon","arcs":[[3748,3749,3750,-3747,-3748,-3222,-280]],"properties":{"id":"24660092","dp":1236,"de":585}},{"type":"Polygon","arcs":[[3751,3752,-3751,3753]],"properties":{"id":"24660093","dp":7496,"de":915}},{"type":"Polygon","arcs":[[3754,3755,-3745,-3753]],"properties":{"id":"24660094","dp":6199,"de":0}},{"type":"Polygon","arcs":[[-3755,-3752,3756,3757,3758,3759,3760,3761]],"properties":{"id":"24660095","dp":3070,"de":445}},{"type":"Polygon","arcs":[[-3762,3762,-3743,-3756]],"properties":{"id":"24660096","dp":6771,"de":0}},{"type":"Polygon","arcs":[[-3761,3763,3764,-3763]],"properties":{"id":"24660097","dp":8248,"de":0}},{"type":"Polygon","arcs":[[-3228,-3744,-3765,3765,-3215,-3221,-3225]],"properties":{"id":"24660098","dp":4304,"de":432}},{"type":"Polygon","arcs":[[-3766,-3764,3766,3767,3768,3769,3770,-3210,-3216]],"properties":{"id":"24660099","dp":9366,"de":477}},{"type":"Polygon","arcs":[[3771,3772,-3769]],"properties":{"id":"24660100","dp":22663,"de":0}},{"type":"Polygon","arcs":[[3773,3774,3775,3776,3777,3778,-3658,-3655,-3652,-450]],"properties":{"id":"24660030","dp":3590,"de":131}},{"type":"Polygon","arcs":[[-3775,3779]],"properties":{"id":"24660031","dp":6939,"de":0}},{"type":"Polygon","arcs":[[-445,3780,-3776,-3780,-3774,-449]],"properties":{"id":"24660032","dp":5086,"de":0}},{"type":"Polygon","arcs":[[3781,3782,-3777,-3781,-444,-423,3783,3784,3785]],"properties":{"id":"24660033","dp":4427,"de":0}},{"type":"Polygon","arcs":[[-3784,-422,3786]],"properties":{"id":"24660034","dp":4525,"de":0}},{"type":"Polygon","arcs":[[-3785,-3787,-421,3787]],"properties":{"id":"24660035","dp":4877,"de":0}},{"type":"Polygon","arcs":[[3788,-3786,-3788,-420,-1152]],"properties":{"id":"24660036","dp":7800,"de":0}},{"type":"Polygon","arcs":[[3789,3790,3791,3792,3793,3794,3795]],"properties":{"id":"24660458","dp":4152,"de":4725}},{"type":"Polygon","arcs":[[3796,3797,-3278,3798]],"properties":{"id":"24660109","dp":17802,"de":0}},{"type":"Polygon","arcs":[[3799,3800,3801,3802,3803,-3797]],"properties":{"id":"24660110","dp":22450,"de":0}},{"type":"Polygon","arcs":[[-339,3804,3805,-3802,3806]],"properties":{"id":"24660111","dp":18067,"de":0}},{"type":"Polygon","arcs":[[3807,-340,-3807,-3801]],"properties":{"id":"24660112","dp":18508,"de":0}},{"type":"Polygon","arcs":[[-338,3808,-3805]],"properties":{"id":"24660114","dp":23632,"de":0}},{"type":"Polygon","arcs":[[-3809,-337,3809,-3803,-3806]],"properties":{"id":"24660115","dp":16015,"de":0}},{"type":"Polygon","arcs":[[-3810,-336,3810,-262,-357,-355,-3279,-3798,-3804]],"properties":{"id":"24660117","dp":4462,"de":5461}},{"type":"Polygon","arcs":[[-335,3811,3812,-256,-261,-3811]],"properties":{"id":"24660118","dp":9364,"de":2931}},{"type":"Polygon","arcs":[[-334,3813,3814,-3812]],"properties":{"id":"24660119","dp":6607,"de":2031}},{"type":"Polygon","arcs":[[-3815,3815,3816,-265,-257,-3813]],"properties":{"id":"24660120","dp":6476,"de":0}},{"type":"Polygon","arcs":[[3817,3818,3819,-3816,3820,3821]],"properties":{"id":"24660121","dp":8339,"de":1797}},{"type":"Polygon","arcs":[[-3820,3822,3823,-266,-3817]],"properties":{"id":"24660122","dp":11481,"de":0}},{"type":"Polygon","arcs":[[-3819,3824,-3493,3825,3826,-3823]],"properties":{"id":"24660123","dp":3694,"de":0}},{"type":"Polygon","arcs":[[-3827,3827,3828,-267,-3824]],"properties":{"id":"24660124","dp":11609,"de":0}},{"type":"Polygon","arcs":[[-268,-3829,3829,3830,3831]],"properties":{"id":"24660125","dp":13209,"de":1131}},{"type":"Polygon","arcs":[[3832,3833,3834,-3830,-3828,-3826]],"properties":{"id":"24660126","dp":4189,"de":0}},{"type":"Polygon","arcs":[[-3835,3835,3836,3837,-3831]],"properties":{"id":"24660127","dp":6483,"de":773}},{"type":"Polygon","arcs":[[-3832,-3838,3838,-274,-269]],"properties":{"id":"24660128","dp":12889,"de":0}},{"type":"Polygon","arcs":[[-275,-3839,-3837,3839,3840,3841,-277]],"properties":{"id":"24660129","dp":10520,"de":1145}},{"type":"Polygon","arcs":[[-278,-3842,3842,-506]],"properties":{"id":"24660130","dp":9644,"de":3074}},{"type":"Polygon","arcs":[[-3841,3843,3844,3845,3846,-3843]],"properties":{"id":"24660131","dp":12089,"de":2665}},{"type":"Polygon","arcs":[[-3194,3847,3848,3849,3850,-2267]],"properties":{"id":"24660256","dp":4794,"de":1063}},{"type":"Polygon","arcs":[[-3851,3851,3852,-2268]],"properties":{"id":"24660257","dp":8399,"de":0}},{"type":"Polygon","arcs":[[-2269,-3853,3853,3854,3855,-2261]],"properties":{"id":"24660258","dp":4598,"de":2641}},{"type":"Polygon","arcs":[[-3855,3856]],"properties":{"id":"24660259","dp":15089,"de":0}},{"type":"Polygon","arcs":[[3857,3858,-2239,-2262,-3856,-3857,-3854,3859,-1382,3860]],"properties":{"id":"24660260","dp":2424,"de":2400}},{"type":"Polygon","arcs":[[3861,-3858]],"properties":{"id":"24660261","dp":11855,"de":1385}},{"type":"Polygon","arcs":[[3862,-2240,-3859,-3862,-3861,-1381,3863]],"properties":{"id":"24660262","dp":5335,"de":617}},{"type":"Polygon","arcs":[[-1380,3864,3865,-3864]],"properties":{"id":"24660263","dp":9710,"de":826}},{"type":"Polygon","arcs":[[-2229,-2234,-3863,-3866,3866,3867,3868,-2225]],"properties":{"id":"24660264","dp":7393,"de":4612}},{"type":"Polygon","arcs":[[3869,3870,3871,-3868]],"properties":{"id":"24660265","dp":10184,"de":0}},{"type":"Polygon","arcs":[[-2226,-3869,-3872,3872,3873,-1545,-1734,-2021,-2218,-2219,-2223]],"properties":{"id":"24660266","dp":4161,"de":2015}},{"type":"Polygon","arcs":[[3874,-3873,-3871]],"properties":{"id":"24660267","dp":9696,"de":0}},{"type":"Polygon","arcs":[[-3875,-3870,-3867,-3865,3875,-1546,-3874]],"properties":{"id":"24660268","dp":5985,"de":3475}},{"type":"Polygon","arcs":[[-1379,3876,3877,3878,-3876]],"properties":{"id":"24660269","dp":4919,"de":3068}},{"type":"Polygon","arcs":[[-1378,3879,3880,3881,3882,-3877]],"properties":{"id":"24660270","dp":9120,"de":1282}},{"type":"Polygon","arcs":[[3883,3884,-3881,3885]],"properties":{"id":"24660271","dp":9671,"de":0}},{"type":"Polygon","arcs":[[-3882,-3885,3886,3887,3888]],"properties":{"id":"24660272","dp":12573,"de":0}},{"type":"Polygon","arcs":[[-3878,-3883,-3889,3889,3890]],"properties":{"id":"24660273","dp":11016,"de":0}},{"type":"Polygon","arcs":[[-1541,-3879,-3891,3891,-1563,-1555,-1547]],"properties":{"id":"24660274","dp":2558,"de":1977}},{"type":"Polygon","arcs":[[-696,-105,-1063,-1069,-1070,-1082]],"properties":{"id":"24660779","dp":9027,"de":2188}},{"type":"Polygon","arcs":[[3892,3893,-1071,-1067,-1065]],"properties":{"id":"24660780","dp":7729,"de":0}},{"type":"Polygon","arcs":[[3894,3895,-3893,3896]],"properties":{"id":"24660781","dp":4710,"de":550}},{"type":"Polygon","arcs":[[3897,3898,3899,3900,-1052,3901,-3112,3902,-3895]],"properties":{"id":"24660783","dp":4526,"de":1025}},{"type":"Polygon","arcs":[[-326,3903,-489,3904,-481,3905,3906]],"properties":{"id":"24660058","dp":474,"de":381}},{"type":"Polygon","arcs":[[-3906,-476,-463,-454,3907]],"properties":{"id":"24660059","dp":4875,"de":1197}},{"type":"Polygon","arcs":[[-498,-482,-3905]],"properties":{"id":"24660060","dp":2995,"de":2623}},{"type":"Polygon","arcs":[[-328,-323,3908,-490,-3904,-325]],"properties":{"id":"24660061","dp":9766,"de":833}},{"type":"Polygon","arcs":[[3909,-491,-3909,-318]],"properties":{"id":"24660062","dp":7499,"de":0}},{"type":"Polygon","arcs":[[3910,-492,-3910,-317]],"properties":{"id":"24660063","dp":10650,"de":0}},{"type":"Polygon","arcs":[[3911,3912,-493,-3911,-316,3913]],"properties":{"id":"24660064","dp":8991,"de":0}},{"type":"Polygon","arcs":[[-313,3914,-3914,-315]],"properties":{"id":"24660065","dp":13836,"de":0}},{"type":"Polygon","arcs":[[3915,3916,3917,-3912,-3915,3918]],"properties":{"id":"24660066","dp":6968,"de":834}},{"type":"Polygon","arcs":[[3919,-494,-3913,-3918]],"properties":{"id":"24660067","dp":7838,"de":0}},{"type":"Polygon","arcs":[[3920,-495,-3920,-3917,3921]],"properties":{"id":"24660068","dp":8108,"de":844}},{"type":"Polygon","arcs":[[3922,3923,3924,-3922,-3916]],"properties":{"id":"24660069","dp":10914,"de":4850}},{"type":"Polygon","arcs":[[-312,3925,3926,3927,-3923,-3919]],"properties":{"id":"24660070","dp":11619,"de":1190}},{"type":"Polygon","arcs":[[-308,3928,3929,-3926,-311]],"properties":{"id":"24660071","dp":10212,"de":0}},{"type":"Polygon","arcs":[[-657,3930,-3927,-3930,3931]],"properties":{"id":"24660072","dp":10846,"de":1476}},{"type":"Polygon","arcs":[[-299,-305,3932,-654,-3932,-3929,-307]],"properties":{"id":"24660073","dp":4275,"de":574}},{"type":"Polygon","arcs":[[3933,3934,-653,-3933,-304]],"properties":{"id":"24660074","dp":8286,"de":1582}},{"type":"Polygon","arcs":[[3935,3936,3937,-3934,-303]],"properties":{"id":"24660075","dp":5793,"de":672}},{"type":"Polygon","arcs":[[3938,3939,-647,-3935,-3938]],"properties":{"id":"24660076","dp":6507,"de":902}},{"type":"Polygon","arcs":[[3940,-638,-641,-645,-3940,3941]],"properties":{"id":"24660077","dp":6005,"de":0}},{"type":"Polygon","arcs":[[3942,3943,-3942,-3939,-3937,3944]],"properties":{"id":"24660078","dp":6475,"de":0}},{"type":"Polygon","arcs":[[-3773,3945,-639,-3941,-3944,3946,-3770]],"properties":{"id":"24660079","dp":3312,"de":756}},{"type":"Polygon","arcs":[[-3947,-3943,3947,-3211,-3771]],"properties":{"id":"24660080","dp":9645,"de":0}},{"type":"Polygon","arcs":[[-3948,-3945,-3936,-302,-3212]],"properties":{"id":"24660081","dp":6897,"de":1705}},{"type":"Polygon","arcs":[[-3772,-3768,3948,3949,-632,-636,-3946]],"properties":{"id":"24660101","dp":3859,"de":1078}},{"type":"Polygon","arcs":[[-3121,-627,-633,-3950,3950]],"properties":{"id":"24660102","dp":3071,"de":604}},{"type":"Polygon","arcs":[[-3951,-3949,-3767,-3760,3951]],"properties":{"id":"24660103","dp":4091,"de":0}},{"type":"Polygon","arcs":[[-3759,3952,-3484,3953,3954,3955,3956,3957,3958,-353,-350,-341,-3120,-3952]],"properties":{"id":"24660104","dp":968,"de":1344}},{"type":"Polygon","arcs":[[3959,-3280,-351,-3959]],"properties":{"id":"24660107","dp":14011,"de":0}},{"type":"Polygon","arcs":[[3960,3961,3962,3963]],"properties":{"id":"24660564","dp":5572,"de":412}},{"type":"Polygon","arcs":[[3964,3965,-3964,3966,3967,3968,3969,3970]],"properties":{"id":"24660565","dp":5712,"de":0}},{"type":"Polygon","arcs":[[3971,3972,3973,3974,-3967,3975]],"properties":{"id":"24660566","dp":3902,"de":1012}},{"type":"Polygon","arcs":[[3976,-3968,-3975]],"properties":{"id":"24660567","dp":10783,"de":1546}},{"type":"Polygon","arcs":[[-3974,3977,3978,-3969,-3977]],"properties":{"id":"24660568","dp":10551,"de":0}},{"type":"Polygon","arcs":[[-3973,3979,3980,3981,-3978]],"properties":{"id":"24660569","dp":8966,"de":0}},{"type":"Polygon","arcs":[[-3845,3982,-1770,-1953,3983,3984]],"properties":{"id":"24660132","dp":12459,"de":0}},{"type":"Polygon","arcs":[[-3985,3985,-3846]],"properties":{"id":"24660133","dp":12254,"de":0}},{"type":"Polygon","arcs":[[-507,-3847,-3986,-3984,-1952,-1949,3986,3987]],"properties":{"id":"24660134","dp":2753,"de":849}},{"type":"Polygon","arcs":[[-3987,-1948,3988,3989]],"properties":{"id":"24660135","dp":10378,"de":0}},{"type":"Polygon","arcs":[[3990,-3989,-1947,3991]],"properties":{"id":"24660136","dp":13547,"de":0}},{"type":"Polygon","arcs":[[-3992,-1946,3992,3993]],"properties":{"id":"24660137","dp":12757,"de":0}},{"type":"Polygon","arcs":[[-3993,-1927,3994]],"properties":{"id":"24660138","dp":23147,"de":758}},{"type":"Polygon","arcs":[[3995,-3995,-1945,-606]],"properties":{"id":"24660139","dp":6485,"de":3954}},{"type":"Polygon","arcs":[[-508,-3988,-3990,-3991,-3994,-3996]],"properties":{"id":"24660140","dp":12885,"de":1179}},{"type":"Polygon","arcs":[[3996,3997,3998,3999,4000,4001]],"properties":{"id":"24660598","dp":4539,"de":2885}},{"type":"Polygon","arcs":[[-3191,-1910,-1907,-1882,4002,-3848,-3193]],"properties":{"id":"24660364","dp":5171,"de":4040}},{"type":"Polygon","arcs":[[-3849,-4003,-1881,4003]],"properties":{"id":"24660365","dp":12324,"de":3944}},{"type":"Polygon","arcs":[[-3850,-4004,-1880,4004,4005,-1374,-3860,-3852]],"properties":{"id":"24660366","dp":5486,"de":2006}},{"type":"Polygon","arcs":[[-1879,4006,4007,4008,4009,-4005]],"properties":{"id":"24660367","dp":12082,"de":879}},{"type":"Polygon","arcs":[[-4006,-4010,4010,4011,-1362,-1375]],"properties":{"id":"24660368","dp":13387,"de":1254}},{"type":"Polygon","arcs":[[4012,4013,-4011,-4009]],"properties":{"id":"24660369","dp":19425,"de":0}},{"type":"Polygon","arcs":[[4014,4015,-1367,-4012,-4014]],"properties":{"id":"24660370","dp":26294,"de":6696}},{"type":"Polygon","arcs":[[-4013,-4008,4016,4017,-4015]],"properties":{"id":"24660371","dp":15693,"de":0}},{"type":"Polygon","arcs":[[-4007,-1878,4018,4019,-4017]],"properties":{"id":"24660372","dp":12250,"de":833}},{"type":"Polygon","arcs":[[-4018,-4020,4020,4021,4022,-4016]],"properties":{"id":"24660373","dp":13591,"de":892}},{"type":"Polygon","arcs":[[-1368,-4023,4023,4024]],"properties":{"id":"24660374","dp":15451,"de":0}},{"type":"Polygon","arcs":[[4025,4026,4027,4028,-4024,-4022]],"properties":{"id":"24660375","dp":17118,"de":0}},{"type":"Polygon","arcs":[[-4025,-4029,4029,-1369]],"properties":{"id":"24660376","dp":10732,"de":0}},{"type":"Polygon","arcs":[[4030,4031,4032,-1370,-4030,4033]],"properties":{"id":"24660377","dp":16050,"de":0}},{"type":"Polygon","arcs":[[4034,4035,-4032,4036]],"properties":{"id":"24660378","dp":16162,"de":0}},{"type":"Polygon","arcs":[[-4035,4037,4038,4039]],"properties":{"id":"24660379","dp":13517,"de":0}},{"type":"Polygon","arcs":[[-4031,4040,4041,4042,-4038,-4037]],"properties":{"id":"24660380","dp":14898,"de":0}},{"type":"Polygon","arcs":[[-4039,-4043,4043,4044,4045]],"properties":{"id":"24660381","dp":14686,"de":1174}},{"type":"Polygon","arcs":[[-4042,4046,4047,4048,-4044]],"properties":{"id":"24660382","dp":10102,"de":0}},{"type":"Polygon","arcs":[[4049,4050,-4049,4051,4052]],"properties":{"id":"24660383","dp":9879,"de":1982}},{"type":"Polygon","arcs":[[-4053,4053,4054,4055]],"properties":{"id":"24660384","dp":10290,"de":0}},{"type":"Polygon","arcs":[[-4052,4056,-1668,4057,4058,4059,4060,-4054]],"properties":{"id":"24660385","dp":4564,"de":788}},{"type":"Polygon","arcs":[[4061,-4055,-4061,4062]],"properties":{"id":"24660386","dp":6116,"de":0}},{"type":"Polygon","arcs":[[-1565,4063,-4063,-4060,4064,4065]],"properties":{"id":"24660387","dp":3554,"de":0}},{"type":"Polygon","arcs":[[-4050,-4056,-4062,-4064,-1564,4066]],"properties":{"id":"24660388","dp":7447,"de":2180}},{"type":"Polygon","arcs":[[4067,4068,-4045,-4051,-4067,-3892,-3890,-3888,4069]],"properties":{"id":"24660389","dp":3721,"de":3940}},{"type":"Polygon","arcs":[[4070,4071,-4070,-3887,-3884]],"properties":{"id":"24660390","dp":9086,"de":0}},{"type":"Polygon","arcs":[[4072,-4068,-4072,4073]],"properties":{"id":"24660391","dp":9632,"de":0}},{"type":"Polygon","arcs":[[-3880,-1377,4074,4075,-4074,-4071,-3886]],"properties":{"id":"24660392","dp":5027,"de":3240}},{"type":"Polygon","arcs":[[-1372,-1365,4076,-4075,-1376]],"properties":{"id":"24660393","dp":9076,"de":1988}},{"type":"Polygon","arcs":[[-4076,-4077,-1364,-1371,-4033,-4036,-4040,-4046,-4069,-4073]],"properties":{"id":"24660394","dp":4090,"de":1463}},{"type":"Polygon","arcs":[[4077,4078,-689,4079,4080,4081]],"properties":{"id":"24660166","dp":5356,"de":515}},{"type":"Polygon","arcs":[[4082,4083,-4081,4084,4085]],"properties":{"id":"24660167","dp":16198,"de":1033}},{"type":"Polygon","arcs":[[4086,-4086,4087,4088]],"properties":{"id":"24660168","dp":4927,"de":671}},{"type":"Polygon","arcs":[[4089,4090,4091,-4088,4092,4093]],"properties":{"id":"24660169","dp":3152,"de":935}},{"type":"Polygon","arcs":[[-4085,-4080,-688,4094,4095,-4093]],"properties":{"id":"24660170","dp":7031,"de":0}},{"type":"Polygon","arcs":[[-1566,-4066,4096,-1653,-1645,4097]],"properties":{"id":"24660399","dp":3414,"de":0}},{"type":"Polygon","arcs":[[-1567,-4098,-1644,-1642,-1635,-1634,-1631,-1435,-1433,-1431,-1570]],"properties":{"id":"24660400","dp":2100,"de":575}},{"type":"Polygon","arcs":[[4098,4099,4100]],"properties":{"id":"24660423","dp":23730,"de":0}},{"type":"Polygon","arcs":[[4101,4102,4103,-4099,4104]],"properties":{"id":"24660424","dp":15945,"de":1718}},{"type":"Polygon","arcs":[[4105,4106,-4102,4107]],"properties":{"id":"24660425","dp":18770,"de":1495}},{"type":"Polygon","arcs":[[4108,4109,-4106,4110]],"properties":{"id":"24660426","dp":17269,"de":0}},{"type":"Polygon","arcs":[[4111,4112,4113,-4109]],"properties":{"id":"24660427","dp":17706,"de":0}},{"type":"Polygon","arcs":[[4114,4115,4116,-4113]],"properties":{"id":"24660428","dp":27773,"de":0}},{"type":"Polygon","arcs":[[4117,-4116,4118,4119]],"properties":{"id":"24660429","dp":23579,"de":0}},{"type":"Polygon","arcs":[[4120,-4120,4121,4122]],"properties":{"id":"24660430","dp":16882,"de":0}},{"type":"Polygon","arcs":[[-4123,4123,4124]],"properties":{"id":"24660431","dp":14984,"de":0}},{"type":"Polygon","arcs":[[4125,4126,4127,4128,-4124]],"properties":{"id":"24660432","dp":10350,"de":0}},{"type":"Polygon","arcs":[[4129,4130,-4128,4131]],"properties":{"id":"24660433","dp":17389,"de":1174}},{"type":"Polygon","arcs":[[4132,4133,-4130,4134]],"properties":{"id":"24660434","dp":16356,"de":0}},{"type":"Polygon","arcs":[[4135,4136,4137,-4133]],"properties":{"id":"24660435","dp":15329,"de":3708}},{"type":"Polygon","arcs":[[4138,4139,4140,4141,-4137,4142]],"properties":{"id":"24660436","dp":10709,"de":4233}},{"type":"Polygon","arcs":[[4143,4144,-4140,4145]],"properties":{"id":"24660437","dp":22179,"de":0}},{"type":"Polygon","arcs":[[4146,4147,-4144,4148]],"properties":{"id":"24660438","dp":25625,"de":3750}},{"type":"Polygon","arcs":[[4149,4150,-4147,4151]],"properties":{"id":"24660439","dp":20000,"de":6140}},{"type":"Polygon","arcs":[[4152,4153,-3792,4154,4155]],"properties":{"id":"24660459","dp":17007,"de":2068}},{"type":"Polygon","arcs":[[4156,4157,4158,-4153,4159]],"properties":{"id":"24660460","dp":18172,"de":0}},{"type":"Polygon","arcs":[[4160,4161,-4154,-4159]],"properties":{"id":"24660461","dp":15100,"de":1507}},{"type":"Polygon","arcs":[[4162,4163,4164,-4161,-4158,4165]],"properties":{"id":"24660462","dp":15151,"de":1377}},{"type":"Polygon","arcs":[[4166,4167,-4163,4168]],"properties":{"id":"24660463","dp":19042,"de":2816}},{"type":"Polygon","arcs":[[4169,4170,-4167,4171]],"properties":{"id":"24660464","dp":15386,"de":2743}},{"type":"Polygon","arcs":[[4172,4173,4174,-4170,4175]],"properties":{"id":"24660465","dp":13896,"de":1558}},{"type":"Polygon","arcs":[[4176,4177,-4173,4178]],"properties":{"id":"24660466","dp":14131,"de":3443}},{"type":"Polygon","arcs":[[4179,-4179,4180,4181]],"properties":{"id":"24660467","dp":11898,"de":7365}},{"type":"Polygon","arcs":[[-4181,-4176,4182,4183]],"properties":{"id":"24660468","dp":16944,"de":2146}},{"type":"Polygon","arcs":[[-4183,-4172,4184,4185]],"properties":{"id":"24660469","dp":12219,"de":2682}},{"type":"Polygon","arcs":[[-4185,-4169,4186,4187]],"properties":{"id":"24660470","dp":17717,"de":6929}},{"type":"Polygon","arcs":[[-4187,-4166,-4157,4188,4189]],"properties":{"id":"24660471","dp":14788,"de":2380}},{"type":"Polygon","arcs":[[4190,-4190,4191,4192,4193]],"properties":{"id":"24660472","dp":17818,"de":3541}},{"type":"Polygon","arcs":[[4194,-4188,-4191,4195,4196]],"properties":{"id":"24660473","dp":17999,"de":3150}},{"type":"Polygon","arcs":[[4197,-4186,-4195,4198,4199]],"properties":{"id":"24660474","dp":15870,"de":3233}},{"type":"Polygon","arcs":[[4200,-4184,-4198,4201]],"properties":{"id":"24660475","dp":12894,"de":3617}},{"type":"Polygon","arcs":[[-3683,-4182,-4201,4202]],"properties":{"id":"24660476","dp":17076,"de":7748}},{"type":"Polygon","arcs":[[4203,-4180,-3682]],"properties":{"id":"24660478","dp":4474,"de":4523}},{"type":"Polygon","arcs":[[-4177,-4204,-3681,4204,4205,4206,4207,4208,4209]],"properties":{"id":"24660479","dp":1370,"de":9509}},{"type":"Polygon","arcs":[[-4209,4210,4211,-504,-511,4212]],"properties":{"id":"24660480","dp":5733,"de":3267}},{"type":"Polygon","arcs":[[4213,4214,-4212]],"properties":{"id":"24660481","dp":12109,"de":1734}},{"type":"Polygon","arcs":[[4215,-4214,4216]],"properties":{"id":"24660482","dp":16749,"de":4489}},{"type":"Polygon","arcs":[[4217,4218,4219,-505,-4215,-4216,4220]],"properties":{"id":"24660483","dp":5110,"de":940}},{"type":"Polygon","arcs":[[-3898,-3897,-1064,-1060,4221]],"properties":{"id":"24660784","dp":3202,"de":407}},{"type":"Polygon","arcs":[[-1055,-1053,-3901,4222,-3899,-4222,-1059]],"properties":{"id":"24660785","dp":3121,"de":559}},{"type":"Polygon","arcs":[[-3900,-4223]],"properties":{"id":"24660786","dp":3672,"de":491}},{"type":"Polygon","arcs":[[-1050,-2008,-2177,4223,-3902]],"properties":{"id":"24660787","dp":3514,"de":355}},{"type":"Polygon","arcs":[[-4065,-4059,4224,-1656,-1648,-4097]],"properties":{"id":"24660401","dp":3324,"de":913}},{"type":"Polygon","arcs":[[-4225,-4058,-1667,-1661,-3589,-1658]],"properties":{"id":"24660402","dp":12199,"de":0}},{"type":"Polygon","arcs":[[-1675,-1671,-1670,-4057,-4048,4225]],"properties":{"id":"24660403","dp":3108,"de":1372}},{"type":"Polygon","arcs":[[-4028,4226,4227,-4226,-4047,-4041,-4034]],"properties":{"id":"24660404","dp":5442,"de":0}},{"type":"Polygon","arcs":[[4228,-1690,-1678,-1676,-4228,4229]],"properties":{"id":"24660405","dp":15799,"de":0}},{"type":"Polygon","arcs":[[4230,-4230,-4227,-4027]],"properties":{"id":"24660406","dp":10615,"de":1538}},{"type":"Polygon","arcs":[[-4026,4231,4232,-1686,-4229,-4231]],"properties":{"id":"24660407","dp":13564,"de":0}},{"type":"Polygon","arcs":[[4233,4234,4235,-1698,-1691,-1687,-4233]],"properties":{"id":"24660408","dp":18621,"de":0}},{"type":"Polygon","arcs":[[4236,4237,-4235,4238]],"properties":{"id":"24660409","dp":22556,"de":0}},{"type":"Polygon","arcs":[[-1877,-4239,-4234,-4232,-4021,-4019]],"properties":{"id":"24660410","dp":6211,"de":1941}},{"type":"Polygon","arcs":[[4239,-1699,-4236,-4238]],"properties":{"id":"24660411","dp":21674,"de":3167}},{"type":"Polygon","arcs":[[-1847,-1838,-1834,-1831,-1702,-1700,-1695,-4240,-4237,-1876]],"properties":{"id":"24660412","dp":1516,"de":947}},{"type":"Polygon","arcs":[[4240,4241,4242,4243,-1897,-1904,4244]],"properties":{"id":"24660413","dp":7629,"de":3237}},{"type":"Polygon","arcs":[[4245,4246,-1898,-4244]],"properties":{"id":"24660414","dp":13892,"de":0}},{"type":"Polygon","arcs":[[4247,4248,-1893,-1899,-4247,4249]],"properties":{"id":"24660415","dp":7452,"de":1071}},{"type":"Polygon","arcs":[[4250,4251,4252,4253,4254,-4248]],"properties":{"id":"24660416","dp":8088,"de":0}},{"type":"Polygon","arcs":[[4255,4256,4257,-4252,4258]],"properties":{"id":"24660417","dp":8397,"de":1217}},{"type":"Polygon","arcs":[[4259,4260,-4253,-4258]],"properties":{"id":"24660418","dp":7408,"de":0}},{"type":"Polygon","arcs":[[4261,4262,4263,4264,-4260,-4257]],"properties":{"id":"24660419","dp":4079,"de":789}},{"type":"Polygon","arcs":[[4265,4266,-4264,4267]],"properties":{"id":"24660420","dp":17323,"de":0}},{"type":"Polygon","arcs":[[4268,-4268,-4263,4269,4270]],"properties":{"id":"24660421","dp":16531,"de":1219}},{"type":"Polygon","arcs":[[4271,-4100,-4104,4272,-4269]],"properties":{"id":"24660422","dp":15726,"de":0}},{"type":"MultiPolygon","arcs":[[[4273,4274,-2460,-2466,4275,4276,4277,4278,4279,4280]],[[4281,4282]]],"properties":{"id":"24660926","dp":6773,"de":0}},{"type":"Polygon","arcs":[[4283,4284,-2461,-4275]],"properties":{"id":"24660927","dp":7585,"de":0}},{"type":"Polygon","arcs":[[4285,-2467,-2462,-4285]],"properties":{"id":"24660928","dp":8019,"de":0}},{"type":"Polygon","arcs":[[4286,-3401,-596,4287,-3477,4288,4289]],"properties":{"id":"24660518","dp":15000,"de":563}},{"type":"Polygon","arcs":[[4290,4291,4292,4293,4294,4295]],"properties":{"id":"24660525","dp":12410,"de":0}},{"type":"Polygon","arcs":[[4296,4297,-4150,4298]],"properties":{"id":"24660440","dp":14646,"de":0}},{"type":"Polygon","arcs":[[4299,4300,-4297,4301]],"properties":{"id":"24660441","dp":18742,"de":3459}},{"type":"Polygon","arcs":[[4302,4303,-4300,4304]],"properties":{"id":"24660442","dp":16552,"de":1709}},{"type":"Polygon","arcs":[[-3685,4305,-4303,4306]],"properties":{"id":"24660443","dp":15920,"de":4447}},{"type":"Polygon","arcs":[[-3684,-4203,4307,-4306]],"properties":{"id":"24660444","dp":14444,"de":7834}},{"type":"Polygon","arcs":[[-4308,-4202,4308,-4304]],"properties":{"id":"24660445","dp":16717,"de":2671}},{"type":"Polygon","arcs":[[-4309,-4200,4309,-4301]],"properties":{"id":"24660446","dp":17611,"de":0}},{"type":"Polygon","arcs":[[-4310,-4199,4310,-4298]],"properties":{"id":"24660447","dp":17577,"de":2863}},{"type":"Polygon","arcs":[[-4311,-4197,4311,-4151]],"properties":{"id":"24660448","dp":22538,"de":6735}},{"type":"Polygon","arcs":[[-4312,-4196,4312,-4148]],"properties":{"id":"24660449","dp":20333,"de":2500}},{"type":"Polygon","arcs":[[-4313,-4194,4313,-4141,-4145]],"properties":{"id":"24660450","dp":15549,"de":1126}},{"type":"Polygon","arcs":[[-4142,-4314,-4193,4314,4315]],"properties":{"id":"24660451","dp":14132,"de":2739}},{"type":"Polygon","arcs":[[-4316,4316,-4138]],"properties":{"id":"24660452","dp":13869,"de":1636}},{"type":"Polygon","arcs":[[-4134,-4317,4317,4318,4319]],"properties":{"id":"24660453","dp":8690,"de":1719}},{"type":"Polygon","arcs":[[-4192,4320,-4318,-4315]],"properties":{"id":"24660454","dp":13194,"de":4027}},{"type":"Polygon","arcs":[[-4189,-4160,4321,-4321]],"properties":{"id":"24660455","dp":11069,"de":3323}},{"type":"Polygon","arcs":[[-4322,-4156,4322,-3790,-4319]],"properties":{"id":"24660456","dp":15204,"de":1656}},{"type":"Polygon","arcs":[[-4155,-3791,-4323]],"properties":{"id":"24660457","dp":13793,"de":2387}},{"type":"Polygon","arcs":[[-2655,-2639,-2632,4323,4324,4325,-2490,-2484,-2657]],"properties":{"id":"24660952","dp":2107,"de":2644}},{"type":"Polygon","arcs":[[4326,4327,4328,-3982]],"properties":{"id":"24660570","dp":22280,"de":3947}},{"type":"Polygon","arcs":[[4329,4330,4331,-4327]],"properties":{"id":"24660571","dp":32237,"de":0}},{"type":"Polygon","arcs":[[4332,4333,4334,4335,4336,-4331,4337]],"properties":{"id":"24660572","dp":13214,"de":0}},{"type":"Polygon","arcs":[[4338,4339,4340,4341,4342]],"properties":{"id":"24660576","dp":15705,"de":0}},{"type":"Polygon","arcs":[[-4340,4343,4344]],"properties":{"id":"24660577","dp":7985,"de":0}},{"type":"Polygon","arcs":[[4345,4346,4347,-4342,4348,4349]],"properties":{"id":"24660578","dp":4970,"de":3345}},{"type":"Polygon","arcs":[[4350,4351,-4349]],"properties":{"id":"24660579","dp":14097,"de":4768}},{"type":"Polygon","arcs":[[4352,-4350,-4352,4353,4354]],"properties":{"id":"24660580","dp":4554,"de":1508}},{"type":"Polygon","arcs":[[4355,4356,4357,4358,4359,4360]],"properties":{"id":"24660581","dp":5580,"de":2961}},{"type":"Polygon","arcs":[[4361,4362,4363,-4356,4364]],"properties":{"id":"24660582","dp":11443,"de":1012}},{"type":"Polygon","arcs":[[4365,-4365,-4361,4366,4367]],"properties":{"id":"24660583","dp":10212,"de":5418}},{"type":"Polygon","arcs":[[4368,4369,4370,-4362,-4366,4371]],"properties":{"id":"24660584","dp":5052,"de":862}},{"type":"Polygon","arcs":[[4372,-4372,-4368,4373,4374,4375,4376]],"properties":{"id":"24660585","dp":4741,"de":2181}},{"type":"Polygon","arcs":[[4377,-4221,-4217,-4211,-4208]],"properties":{"id":"24660484","dp":10803,"de":2362}},{"type":"Polygon","arcs":[[-4207,4378,4379,-4218,-4378]],"properties":{"id":"24660485","dp":5224,"de":6205}},{"type":"Polygon","arcs":[[-575,-512,-500,4380,4381,-4380,4382]],"properties":{"id":"24660486","dp":1819,"de":13159}},{"type":"Polygon","arcs":[[-4382,4383,-4219]],"properties":{"id":"24660487","dp":15706,"de":2077}},{"type":"Polygon","arcs":[[-4384,-4381,-499,-4220]],"properties":{"id":"24660488","dp":12904,"de":919}},{"type":"Polygon","arcs":[[4384,-2704,-2706,-2458,-2413]],"properties":{"id":"24660979","dp":9222,"de":2208}},{"type":"Polygon","arcs":[[-2702,-2705,-4385,-2412]],"properties":{"id":"24660980","dp":10359,"de":0}},{"type":"Polygon","arcs":[[4385,4386,4387,-3999]],"properties":{"id":"24660599","dp":6274,"de":0}},{"type":"Polygon","arcs":[[-4388,4388,4389,4390,-4000]],"properties":{"id":"24660600","dp":5620,"de":5057}},{"type":"Polygon","arcs":[[-4390,4391,4392,-3123,4393]],"properties":{"id":"24660601","dp":7892,"de":2229}},{"type":"Polygon","arcs":[[4394,-4392,-4389,4395,4396,4397]],"properties":{"id":"24660602","dp":4270,"de":5729}},{"type":"Polygon","arcs":[[4398,4399,-4396,-4387,4400]],"properties":{"id":"24660603","dp":4420,"de":1462}},{"type":"Polygon","arcs":[[-4400,4401,4402,-4397]],"properties":{"id":"24660604","dp":6686,"de":0}},{"type":"Polygon","arcs":[[-4374,-4367,-4360,-4355,4403,4404,-4402,-4399,4405]],"properties":{"id":"24660605","dp":2946,"de":5468}},{"type":"Polygon","arcs":[[-4375,-4406,-4401,-4386,4406]],"properties":{"id":"24660606","dp":3811,"de":1411}},{"type":"Polygon","arcs":[[4407,-4001,-4391,-4394,-3122,4408,4409,4410]],"properties":{"id":"24660607","dp":2848,"de":7381}},{"type":"Polygon","arcs":[[4411,4412,-3116,4413,4414,-4411,-941,-934,-932]],"properties":{"id":"24660608","dp":463,"de":5260}},{"type":"Polygon","arcs":[[4415,4416,-4412,-931,-3119]],"properties":{"id":"24660609","dp":2641,"de":2531}},{"type":"Polygon","arcs":[[-3117,-4413,-4417,4417]],"properties":{"id":"24660610","dp":2666,"de":14393}},{"type":"Polygon","arcs":[[-4418,-4416,-3118]],"properties":{"id":"24660611","dp":16222,"de":7040}},{"type":"Polygon","arcs":[[4418,-1080,-3109,-2938,4419]],"properties":{"id":"24660613","dp":3786,"de":4147}},{"type":"Polygon","arcs":[[4420,-4419,4421]],"properties":{"id":"24660614","dp":12644,"de":8510}},{"type":"Polygon","arcs":[[-3460,4422,-4422,-4420]],"properties":{"id":"24660615","dp":27462,"de":0}},{"type":"Polygon","arcs":[[-4224,-2183,-3565,4423,-2061,4424,4425,-3113]],"properties":{"id":"24660788","dp":7484,"de":1600}},{"type":"Polygon","arcs":[[-2050,-2055,-3546,4426,-3564,-3471,-3566]],"properties":{"id":"24660794","dp":4439,"de":2791}},{"type":"Polygon","arcs":[[4427,-2040,-3567,4428]],"properties":{"id":"24660797","dp":5200,"de":1235}},{"type":"Polygon","arcs":[[4429,-4429,-3469,-2193]],"properties":{"id":"24660798","dp":6746,"de":0}},{"type":"Polygon","arcs":[[4430,4431,-4430,-2196]],"properties":{"id":"24660799","dp":7162,"de":0}},{"type":"Polygon","arcs":[[4432,-2041,-4428,-4432]],"properties":{"id":"24660800","dp":6923,"de":729}},{"type":"Polygon","arcs":[[4433,-2042,-4433,4434]],"properties":{"id":"24660801","dp":4749,"de":426}},{"type":"Polygon","arcs":[[4435,4436,-4435,-4431,-2195,4437]],"properties":{"id":"24660802","dp":4322,"de":481}},{"type":"Polygon","arcs":[[4438,-2043,-4434,-4437]],"properties":{"id":"24660803","dp":4712,"de":517}},{"type":"Polygon","arcs":[[4439,4440,-2026,-2036,-4439,-4436,4441]],"properties":{"id":"24660804","dp":745,"de":55}},{"type":"Polygon","arcs":[[4442,-4440,4443]],"properties":{"id":"24660805","dp":8888,"de":0}},{"type":"Polygon","arcs":[[-4444,-4442,-4438,-2194,4444]],"properties":{"id":"24660806","dp":4068,"de":648}},{"type":"Polygon","arcs":[[4445,4446,4447,-3530,-1940,-2027,-4441,-4443,-4445,-2189,-2203,-2208,4448]],"properties":{"id":"24660807","dp":3586,"de":559}},{"type":"Polygon","arcs":[[4449,-4446]],"properties":{"id":"24660808","dp":3833,"de":0}},{"type":"Polygon","arcs":[[-3532,4450,-4447,-4450,-4449,-2207,-2209,-2162,-2157]],"properties":{"id":"24660809","dp":5176,"de":880}},{"type":"Polygon","arcs":[[-4448,-4451,-3531]],"properties":{"id":"24660810","dp":4575,"de":0}},{"type":"Polygon","arcs":[[4451,4452,-1359]],"properties":{"id":"24661311","dp":32867,"de":0}},{"type":"Polygon","arcs":[[4453,4454,4455,-2852,-4453]],"properties":{"id":"24661312","dp":10645,"de":1794}},{"type":"Polygon","arcs":[[-2788,-2941,4456,4457,-2846,-4456,4458]],"properties":{"id":"24661313","dp":2863,"de":2616}},{"type":"Polygon","arcs":[[-4459,-4455,4459,-2794]],"properties":{"id":"24661314","dp":37951,"de":0}},{"type":"Polygon","arcs":[[4460,4461,-4460,-4454,-4452]],"properties":{"id":"24661315","dp":34814,"de":0}},{"type":"Polygon","arcs":[[-2784,-2790,-2795,-4462,4462]],"properties":{"id":"24661316","dp":22947,"de":4736}},{"type":"Polygon","arcs":[[-2948,-2782,-4463,-4461,-1357,-2798,-2823]],"properties":{"id":"24661317","dp":3828,"de":0}},{"type":"Polygon","arcs":[[-701,-720,-778,-2318]],"properties":{"id":"24660901","dp":10963,"de":0}},{"type":"Polygon","arcs":[[4463,4464,4465,4466,-755,-729,-727,4467]],"properties":{"id":"24660902","dp":5807,"de":6610}},{"type":"Polygon","arcs":[[4468,4469,-4464,4470]],"properties":{"id":"24660903","dp":12154,"de":0}},{"type":"Polygon","arcs":[[4471,4472,4473,-4465,-4470]],"properties":{"id":"24660904","dp":11378,"de":3372}},{"type":"Polygon","arcs":[[-4295,4474,4475,4476,4477]],"properties":{"id":"24660526","dp":10221,"de":968}},{"type":"Polygon","arcs":[[4478,4479,-4477,4480,4481]],"properties":{"id":"24660530","dp":11022,"de":936}},{"type":"Polygon","arcs":[[4482,4483,4484,-4479,4485,4486]],"properties":{"id":"24660533","dp":17837,"de":7939}},{"type":"Polygon","arcs":[[-3558,4487,4488,-4483,4489,4490,4491]],"properties":{"id":"24660536","dp":16698,"de":2226}},{"type":"Polygon","arcs":[[-4489,4492,4493,4494,-4484]],"properties":{"id":"24660537","dp":30743,"de":0}},{"type":"Polygon","arcs":[[4495,-4291,4496,-4494]],"properties":{"id":"24660538","dp":28089,"de":0}},{"type":"Polygon","arcs":[[-4497,-4296,-4478,-4480,-4485,-4495]],"properties":{"id":"24660539","dp":8857,"de":2124}},{"type":"Polygon","arcs":[[-4496,-4493,-4488,4497,4498,-4292]],"properties":{"id":"24660540","dp":9237,"de":5053}},{"type":"Polygon","arcs":[[-3557,4499,4500,4501,4502,4503,4504,-3965,-4498]],"properties":{"id":"24660541","dp":5923,"de":1763}},{"type":"Polygon","arcs":[[4505,-4503]],"properties":{"id":"24660542","dp":5433,"de":680}},{"type":"Polygon","arcs":[[4506,4507,4508,-4504,-4506,-4502]],"properties":{"id":"24660543","dp":6713,"de":0}},{"type":"Polygon","arcs":[[4509,4510,4511,-4508,4512]],"properties":{"id":"24660544","dp":6430,"de":0}},{"type":"Polygon","arcs":[[-4501,-3126,4513,4514,-4513,-4507]],"properties":{"id":"24660545","dp":7629,"de":1708}},{"type":"Polygon","arcs":[[4515,-3595,4516,-4515]],"properties":{"id":"24660546","dp":9042,"de":5953}},{"type":"Polygon","arcs":[[4517,-4516,-4514,-3125]],"properties":{"id":"24660547","dp":5863,"de":7096}},{"type":"Polygon","arcs":[[-4393,-4395,-3596,-4518,-3124]],"properties":{"id":"24660548","dp":9006,"de":1319}},{"type":"Polygon","arcs":[[-4403,-4405,-3138,4518,4519,-3590,-4398]],"properties":{"id":"24660550","dp":4107,"de":4395}},{"type":"Polygon","arcs":[[-3591,-4520,4520,4521]],"properties":{"id":"24660551","dp":19581,"de":0}},{"type":"Polygon","arcs":[[-4521,-4519,-3137,4522]],"properties":{"id":"24660552","dp":27578,"de":4882}},{"type":"Polygon","arcs":[[-4404,-4354,-4351,-4341,4523,-3135]],"properties":{"id":"24660555","dp":12644,"de":0}},{"type":"Polygon","arcs":[[-4524,-4345,4524,4525,4526,4527,-3136]],"properties":{"id":"24660556","dp":10140,"de":1358}},{"type":"Polygon","arcs":[[-4523,-4528,4528]],"properties":{"id":"24660557","dp":22720,"de":0}},{"type":"Polygon","arcs":[[-3592,-4522,-4529,-4527,4529,4530]],"properties":{"id":"24660558","dp":8979,"de":2312}},{"type":"Polygon","arcs":[[-4531,-3976,-3963,4531,-3593]],"properties":{"id":"24660560","dp":3900,"de":1036}},{"type":"Polygon","arcs":[[-3594,-4532,4532,-4510,-4517]],"properties":{"id":"24660561","dp":5533,"de":917}},{"type":"Polygon","arcs":[[-4533,-3962,4533,-4511]],"properties":{"id":"24660562","dp":12880,"de":0}},{"type":"Polygon","arcs":[[-4534,-3961,-3966,-4505,-4509,-4512]],"properties":{"id":"24660563","dp":4956,"de":1557}},{"type":"Polygon","arcs":[[4534,-4094,-4096,4535,4536]],"properties":{"id":"24660171","dp":10209,"de":0}},{"type":"Polygon","arcs":[[4537,-4536,-4095,-687,-678,4538]],"properties":{"id":"24660172","dp":12507,"de":0}},{"type":"Polygon","arcs":[[4539,-4539,-677,-660,4540]],"properties":{"id":"24660173","dp":10934,"de":0}},{"type":"Polygon","arcs":[[4541,4542,-4369,-4373,4543]],"properties":{"id":"24660586","dp":7473,"de":0}},{"type":"Polygon","arcs":[[4544,-4544,-4377,4545,4546,4547]],"properties":{"id":"24660587","dp":4432,"de":714}},{"type":"Polygon","arcs":[[4548,-3612,4549,4550,-4542,-4545,-3132]],"properties":{"id":"24660588","dp":3861,"de":0}},{"type":"Polygon","arcs":[[-3613,-4549,-3131]],"properties":{"id":"24660590","dp":4636,"de":0}},{"type":"Polygon","arcs":[[-3524,-3133,-4548,4551]],"properties":{"id":"24660594","dp":6326,"de":0}},{"type":"Polygon","arcs":[[-3599,-3525,-4552,-4547,4552,4553,-4002,-4408,-4415,4554]],"properties":{"id":"24660595","dp":3087,"de":2310}},{"type":"Polygon","arcs":[[-4546,-4376,-4407,-3998,4555,-4553]],"properties":{"id":"24660596","dp":9901,"de":0}},{"type":"Polygon","arcs":[[-4554,-4556,-3997]],"properties":{"id":"24660597","dp":12168,"de":1084}},{"type":"Polygon","arcs":[[4556,4557,4558,-3541,-3536]],"properties":{"id":"24661062","dp":17500,"de":6793}},{"type":"Polygon","arcs":[[4559,-3542,-4559]],"properties":{"id":"24661063","dp":31257,"de":0}},{"type":"Polygon","arcs":[[-3544,4560,4561,-2710,4562,4563]],"properties":{"id":"24661066","dp":7992,"de":2200}},{"type":"Polygon","arcs":[[4564,4565,-4561,-3543]],"properties":{"id":"24661067","dp":6868,"de":1124}},{"type":"Polygon","arcs":[[-4558,4566,4567,-4565,-4560]],"properties":{"id":"24661068","dp":7535,"de":2392}},{"type":"Polygon","arcs":[[-824,-1987,4568,-4562,-4566,-4568,4569]],"properties":{"id":"24661069","dp":6727,"de":4444}},{"type":"Polygon","arcs":[[-1986,-1983,-2715,-2711,-4569]],"properties":{"id":"24661070","dp":5254,"de":3708}},{"type":"Polygon","arcs":[[-1081,-4421,-4423,-2935,-2932,4570,4571]],"properties":{"id":"24660616","dp":10046,"de":1113}},{"type":"Polygon","arcs":[[-2929,4572,-4571]],"properties":{"id":"24660617","dp":18432,"de":0}},{"type":"Polygon","arcs":[[4573,4574,-4573,-2926,-2920]],"properties":{"id":"24660618","dp":10665,"de":6569}},{"type":"Polygon","arcs":[[-1077,-4572,-4575,4575]],"properties":{"id":"24660619","dp":10755,"de":2485}},{"type":"Polygon","arcs":[[4576,-1083,-1078,-4576,-4574,-2917,4577,4578,4579]],"properties":{"id":"24660620","dp":4651,"de":2549}},{"type":"Polygon","arcs":[[4580,-4580,4581]],"properties":{"id":"24660621","dp":22919,"de":0}},{"type":"Polygon","arcs":[[4582,-4581,4583,-3300]],"properties":{"id":"24660622","dp":17689,"de":0}},{"type":"Polygon","arcs":[[-4583,-3309,-694,-4577]],"properties":{"id":"24660623","dp":20567,"de":28723}},{"type":"Polygon","arcs":[[-2970,-2974,4584,4585]],"properties":{"id":"24661113","dp":17609,"de":3902}},{"type":"Polygon","arcs":[[4586,4587,4588,-4472,-4469,4589,4590,4591]],"properties":{"id":"24660905","dp":12702,"de":1621}},{"type":"Polygon","arcs":[[4592,4593,-4473,-4589,4594]],"properties":{"id":"24660906","dp":10153,"de":1282}},{"type":"Polygon","arcs":[[-4595,-4588,4595]],"properties":{"id":"24660907","dp":9488,"de":2555}},{"type":"Polygon","arcs":[[4596,4597,4598,-4593,-4596,-4587,4599,-4325,4600,4601,4602,-4467,4603]],"properties":{"id":"24660908","dp":6482,"de":1924}},{"type":"Polygon","arcs":[[-4599,4604,4605,-4604,-4466,-4474,-4594]],"properties":{"id":"24660909","dp":10358,"de":1793}},{"type":"Polygon","arcs":[[4606,-4605,-4598]],"properties":{"id":"24660910","dp":13546,"de":0}},{"type":"Polygon","arcs":[[-4607,-4597,-4606]],"properties":{"id":"24660911","dp":13955,"de":0}},{"type":"Polygon","arcs":[[-4324,4607,-4601]],"properties":{"id":"24660912","dp":12570,"de":2712}},{"type":"Polygon","arcs":[[-2631,4608,4609,4610,-4602,-4608]],"properties":{"id":"24660913","dp":6696,"de":10600}},{"type":"Polygon","arcs":[[-4611,4611,-756,-4603]],"properties":{"id":"24660914","dp":6847,"de":4130}},{"type":"Polygon","arcs":[[-4610,4612,4613,4614,4615,4616,-757,-4612]],"properties":{"id":"24660915","dp":6709,"de":1865}},{"type":"Polygon","arcs":[[4617,-758,-4617]],"properties":{"id":"24660916","dp":6732,"de":911}},{"type":"Polygon","arcs":[[-4616,4618,4619,4620,4621,4622,4623,4624,-759,-4618]],"properties":{"id":"24660917","dp":937,"de":2228}},{"type":"Polygon","arcs":[[-4615,4625,-4619]],"properties":{"id":"24660918","dp":7993,"de":1445}},{"type":"Polygon","arcs":[[4626,-4620,-4626,-4614]],"properties":{"id":"24660919","dp":3671,"de":2519}},{"type":"Polygon","arcs":[[-4613,-4609,-2630,-2469,4627,-4621,-4627]],"properties":{"id":"24660920","dp":2294,"de":2096}},{"type":"Polygon","arcs":[[-4628,-2475,4628,4629,4630,-4622]],"properties":{"id":"24660921","dp":4868,"de":0}},{"type":"Polygon","arcs":[[4631,-4630]],"properties":{"id":"24660922","dp":7716,"de":0}},{"type":"Polygon","arcs":[[-4631,-4632,-4629,-2474,4632,-4279,4633,4634,-4623]],"properties":{"id":"24660923","dp":3032,"de":1617}},{"type":"Polygon","arcs":[[-2473,-2468,-4286,-4284,-4274,4635,-4280,-4633]],"properties":{"id":"24660924","dp":2561,"de":291}},{"type":"Polygon","arcs":[[-4281,-4636]],"properties":{"id":"24660925","dp":19018,"de":1380}},{"type":"Polygon","arcs":[[-643,4636,-4537,-4538,-4540,4637]],"properties":{"id":"24660174","dp":9953,"de":0}},{"type":"Polygon","arcs":[[-648,-644,-4638,-4541,-659,-650]],"properties":{"id":"24660175","dp":7087,"de":0}},{"type":"Polygon","arcs":[[-4535,-4637,-642,-629,4638,-4090]],"properties":{"id":"24660176","dp":2965,"de":1467}},{"type":"Polygon","arcs":[[-4639,-628,-622,4639,-4091]],"properties":{"id":"24660177","dp":2979,"de":0}},{"type":"Polygon","arcs":[[-1933,-1421,4640,-4089,-4092,-4640]],"properties":{"id":"24660178","dp":2868,"de":1465}},{"type":"Polygon","arcs":[[4641,4642,4643,-4083,-4087,-4641]],"properties":{"id":"24660179","dp":3765,"de":321}},{"type":"Polygon","arcs":[[-4642,-1420,-1923,4644]],"properties":{"id":"24660180","dp":4749,"de":1354}},{"type":"Polygon","arcs":[[-4643,-4645,-1922,-1918,4645,4646,4647]],"properties":{"id":"24660181","dp":12371,"de":2291}},{"type":"Polygon","arcs":[[-1917,-1412,4648,-4646]],"properties":{"id":"24660182","dp":22071,"de":0}},{"type":"Polygon","arcs":[[4649,-4647,-4649,-1417,4650,4651,-4078]],"properties":{"id":"24660183","dp":7839,"de":1737}},{"type":"Polygon","arcs":[[-4648,-4650,-4082,-4084,-4644]],"properties":{"id":"24660184","dp":8692,"de":5130}},{"type":"Polygon","arcs":[[-4651,-1416,4652,4653]],"properties":{"id":"24660185","dp":10135,"de":0}},{"type":"Polygon","arcs":[[-4079,-4652,-4654,4654,4655,4656,-690]],"properties":{"id":"24660186","dp":12608,"de":1440}},{"type":"Polygon","arcs":[[-1415,-1411,-1402,-4655,-4653]],"properties":{"id":"24660187","dp":9391,"de":0}},{"type":"Polygon","arcs":[[-4656,-1407,4657,4658]],"properties":{"id":"24660188","dp":12819,"de":1101}},{"type":"Polygon","arcs":[[4659,-4658,-1406,4660]],"properties":{"id":"24660189","dp":23013,"de":0}},{"type":"Polygon","arcs":[[-691,-4657,-4659,-4660,-680,-686]],"properties":{"id":"24660190","dp":11042,"de":2055}},{"type":"Polygon","arcs":[[-681,-4661,-1394,4661]],"properties":{"id":"24660191","dp":20078,"de":0}},{"type":"Polygon","arcs":[[-4662,-1398,4662,-682]],"properties":{"id":"24660192","dp":16729,"de":0}},{"type":"Polygon","arcs":[[4663,-4663,-1397,4664,-1399,4665]],"properties":{"id":"24660193","dp":13200,"de":0}},{"type":"Polygon","arcs":[[-211,-3313,-3304,-3297,4666,-3463]],"properties":{"id":"24660659","dp":11496,"de":852}},{"type":"Polygon","arcs":[[-4667,-3303,4667,-3001,-3464]],"properties":{"id":"24660660","dp":12273,"de":1986}},{"type":"Polygon","arcs":[[4668,-2998,-4668,4669]],"properties":{"id":"24660661","dp":28965,"de":2681}},{"type":"Polygon","arcs":[[4670,-2994,-2997,-4669]],"properties":{"id":"24660662","dp":8566,"de":0}},{"type":"Polygon","arcs":[[4671,-4671,-4670,-3302]],"properties":{"id":"24660663","dp":30346,"de":2475}},{"type":"Polygon","arcs":[[-3301,-4584,4672,-2992,-4672]],"properties":{"id":"24660664","dp":30088,"de":0}},{"type":"Polygon","arcs":[[-4673,-4582,-4579,4673]],"properties":{"id":"24660665","dp":26808,"de":0}},{"type":"Polygon","arcs":[[4674,-2954,-2993,-4674]],"properties":{"id":"24660666","dp":34933,"de":2202}},{"type":"Polygon","arcs":[[-4578,-2916,-2951,-4675]],"properties":{"id":"24660667","dp":23824,"de":2534}},{"type":"Polygon","arcs":[[4675,4676,4677,4678]],"properties":{"id":"24663101","dp":2883,"de":305}},{"type":"Polygon","arcs":[[-3449,4679,-3447,4680,4681,4682,4683,4684,4685]],"properties":{"id":"24662988","dp":1403,"de":926}},{"type":"Polygon","arcs":[[4686,4687,4688,4689,4690,4691]],"properties":{"id":"24661358","dp":14773,"de":10933}},{"type":"Polygon","arcs":[[4692,4693,4694,4695,4696,4697,4698]],"properties":{"id":"24662589","dp":2389,"de":1641}},{"type":"Polygon","arcs":[[4699,-4698,4700,4701,4702]],"properties":{"id":"24662590","dp":7384,"de":736}},{"type":"Polygon","arcs":[[4703,4704,4705,-4699,-4700]],"properties":{"id":"24662591","dp":4921,"de":0}},{"type":"Polygon","arcs":[[4706,-4704,-4703,4707,4708]],"properties":{"id":"24662592","dp":7996,"de":0}},{"type":"Polygon","arcs":[[4709,-4692,4710,4711,4712,4713]],"properties":{"id":"24661359","dp":22229,"de":8188}},{"type":"Polygon","arcs":[[4714,-4712,4715,4716]],"properties":{"id":"24661360","dp":20497,"de":3167}},{"type":"Polygon","arcs":[[-4711,-4691,4717,-4716]],"properties":{"id":"24661361","dp":16989,"de":5510}},{"type":"Polygon","arcs":[[-4717,-4718,-4690,4718,4719,4720,4721]],"properties":{"id":"24661362","dp":6549,"de":2243}},{"type":"Polygon","arcs":[[4722,4723,-4719,4724]],"properties":{"id":"24661363","dp":10041,"de":5463}},{"type":"Polygon","arcs":[[4725,-4715,-4722,4726,4727,4728,4729,4730]],"properties":{"id":"24661364","dp":5086,"de":5761}},{"type":"Polygon","arcs":[[4731,4732,-4731]],"properties":{"id":"24661365","dp":28461,"de":0}},{"type":"Polygon","arcs":[[-4730,4733,4734,-4732]],"properties":{"id":"24661366","dp":31026,"de":2901}},{"type":"Polygon","arcs":[[4735,4736,-4734,-4729,4737,4738,4739]],"properties":{"id":"24661367","dp":18933,"de":3523}},{"type":"Polygon","arcs":[[-4740,4740,4741,4742]],"properties":{"id":"24661368","dp":19522,"de":4020}},{"type":"Polygon","arcs":[[4743,-4742,4744,4745]],"properties":{"id":"24661369","dp":17923,"de":4824}},{"type":"Polygon","arcs":[[4746,4747,-4746]],"properties":{"id":"24661370","dp":19392,"de":4153}},{"type":"Polygon","arcs":[[4748,-4747,-4745,-4741,-4739,4749,4750,4751,4752]],"properties":{"id":"24661371","dp":5503,"de":3788}},{"type":"Polygon","arcs":[[4753,-4749,4754,4755]],"properties":{"id":"24661372","dp":16048,"de":3024}},{"type":"Polygon","arcs":[[-4753,4756,4757,-4755]],"properties":{"id":"24661373","dp":16679,"de":1778}},{"type":"Polygon","arcs":[[-4752,4758,4759,-4757]],"properties":{"id":"24661374","dp":11866,"de":6888}},{"type":"Polygon","arcs":[[4760,4761,-4759,-4751,4762,4763,4764,4765]],"properties":{"id":"24661375","dp":4338,"de":21860}},{"type":"Polygon","arcs":[[4766,-4762,4767,4768]],"properties":{"id":"24661376","dp":11936,"de":55212}},{"type":"Polygon","arcs":[[-4760,-4767,4769,4770,4771]],"properties":{"id":"24661377","dp":13010,"de":13210}},{"type":"Polygon","arcs":[[-4758,-4772,4772,4773]],"properties":{"id":"24661378","dp":16306,"de":2552}},{"type":"Polygon","arcs":[[4774,-4756,-4774,4775]],"properties":{"id":"24661379","dp":15426,"de":3963}},{"type":"Polygon","arcs":[[4776,4777,4778,-4775,4779]],"properties":{"id":"24661380","dp":14057,"de":4472}},{"type":"Polygon","arcs":[[4780,4781,-4778,4782]],"properties":{"id":"24661381","dp":23529,"de":3287}},{"type":"Polygon","arcs":[[4783,-4781,4784,4785]],"properties":{"id":"24661382","dp":18792,"de":12640}},{"type":"Polygon","arcs":[[-1212,-3704,-3706,4786,4787,4788,4789,4790,4791]],"properties":{"id":"24661858","dp":4735,"de":20919}},{"type":"Polygon","arcs":[[4792,-4791,4793,4794,4795,4796,4797,4798]],"properties":{"id":"24661859","dp":8760,"de":65700}},{"type":"Polygon","arcs":[[4799,4800,-4795]],"properties":{"id":"24661860","dp":41379,"de":12068}},{"type":"Polygon","arcs":[[-3674,-4798,4801,4802,4803,-3679]],"properties":{"id":"24661861","dp":13040,"de":9684}},{"type":"Polygon","arcs":[[4804,4805,4806,-4803]],"properties":{"id":"24661862","dp":17269,"de":3212}},{"type":"Polygon","arcs":[[-4807,4807,4808,4809,4810]],"properties":{"id":"24661863","dp":17048,"de":2108}},{"type":"Polygon","arcs":[[-4804,-4811,4811,4812]],"properties":{"id":"24661864","dp":15515,"de":8520}},{"type":"Polygon","arcs":[[4813,-4812,-4810,4814,4815,4816,4817]],"properties":{"id":"24661865","dp":7883,"de":25525}},{"type":"Polygon","arcs":[[-3680,-4813,-4814,4818,-3676]],"properties":{"id":"24661866","dp":10557,"de":5268}},{"type":"Polygon","arcs":[[4819,4820,-4705,-4707,4821]],"properties":{"id":"24662593","dp":6048,"de":0}},{"type":"Polygon","arcs":[[4822,4823,4824,-4822]],"properties":{"id":"24662594","dp":6442,"de":0}},{"type":"Polygon","arcs":[[-4823,-4709,4825,-3397]],"properties":{"id":"24662595","dp":7840,"de":4466}},{"type":"Polygon","arcs":[[-3399,4826,4827]],"properties":{"id":"24662598","dp":8152,"de":0}},{"type":"Polygon","arcs":[[4828,4829,-3395,-4828,4830,4831]],"properties":{"id":"24662599","dp":9471,"de":0}},{"type":"Polygon","arcs":[[4832,-4829,4833]],"properties":{"id":"24662600","dp":12691,"de":0}},{"type":"Polygon","arcs":[[4834,-3794,4835,4836,4837,-4834,-4832,4838]],"properties":{"id":"24662601","dp":2907,"de":6314}},{"type":"Polygon","arcs":[[4839,-4824,-3396,-4830,-4833,-4838]],"properties":{"id":"24662602","dp":4897,"de":0}},{"type":"Polygon","arcs":[[4840,4841,-4840,-4837]],"properties":{"id":"24662603","dp":4293,"de":3968}},{"type":"Polygon","arcs":[[-4836,4842,4843,4844,4845,4846,4847,-4841]],"properties":{"id":"24662604","dp":4586,"de":0}},{"type":"Polygon","arcs":[[-4165,4848,-4843,-3793,-4162]],"properties":{"id":"24662605","dp":13399,"de":2272}},{"type":"Polygon","arcs":[[4849,-4844,-4849,-4164]],"properties":{"id":"24662606","dp":17614,"de":0}},{"type":"Polygon","arcs":[[4850,4851,4852,-4850,-4168]],"properties":{"id":"24662607","dp":10490,"de":5313}},{"type":"Polygon","arcs":[[4853,4854,-4851,-4171]],"properties":{"id":"24662608","dp":13543,"de":6526}},{"type":"Polygon","arcs":[[-4854,-4175,4855]],"properties":{"id":"24662609","dp":14225,"de":0}},{"type":"Polygon","arcs":[[-4210,-4213,-510,-4852,-4855,-4856,-4174,-4178]],"properties":{"id":"24662610","dp":9243,"de":6914}},{"type":"Polygon","arcs":[[-521,4856,-4845,-4853,-518]],"properties":{"id":"24662611","dp":10550,"de":13188}},{"type":"Polygon","arcs":[[-4857,4857,-4846]],"properties":{"id":"24662612","dp":11108,"de":10277}},{"type":"Polygon","arcs":[[-520,-526,4858,-4847,-4858]],"properties":{"id":"24662613","dp":9747,"de":2135}},{"type":"Polygon","arcs":[[4859,4860,4861,4862,4863,4864]],"properties":{"id":"24663010","dp":2137,"de":1450}},{"type":"Polygon","arcs":[[-4862,4865]],"properties":{"id":"24663011","dp":4900,"de":330}},{"type":"Polygon","arcs":[[4866,-4713,-4726,-4733,4867,4868]],"properties":{"id":"24661394","dp":27470,"de":7312}},{"type":"Polygon","arcs":[[4869,-4687,-4710,4870,4871]],"properties":{"id":"24661395","dp":8754,"de":3679}},{"type":"Polygon","arcs":[[4872,4873,-4870,4874]],"properties":{"id":"24661396","dp":9097,"de":1299}},{"type":"Polygon","arcs":[[-4873,4875,4876,4877,4878,4879]],"properties":{"id":"24661397","dp":3270,"de":1639}},{"type":"Polygon","arcs":[[4880,4881,4882,-4880]],"properties":{"id":"24661398","dp":8016,"de":901}},{"type":"Polygon","arcs":[[4883,4884]],"properties":{"id":"24662616","dp":9001,"de":0}},{"type":"Polygon","arcs":[[-4885,4885,4886,-4820,4887]],"properties":{"id":"24662617","dp":10181,"de":726}},{"type":"Polygon","arcs":[[-4887,-4693,-4706,-4821]],"properties":{"id":"24662618","dp":4851,"de":652}},{"type":"Polygon","arcs":[[4888,4889,4890,4891,4892,-3795,-4835,4893]],"properties":{"id":"24662619","dp":5920,"de":3944}},{"type":"Polygon","arcs":[[4894,-4890]],"properties":{"id":"24662620","dp":19502,"de":0}},{"type":"Polygon","arcs":[[4895,-4891,-4895,4896,-4110,-4114]],"properties":{"id":"24662621","dp":10958,"de":798}},{"type":"Polygon","arcs":[[-4897,-4889,4897,4898,-4107]],"properties":{"id":"24662622","dp":17121,"de":2424}},{"type":"Polygon","arcs":[[-4898,4899,4900,4901]],"properties":{"id":"24662623","dp":13792,"de":1458}},{"type":"Polygon","arcs":[[-4899,-4902,-4266,-4273,-4103]],"properties":{"id":"24662624","dp":13073,"de":2015}},{"type":"Polygon","arcs":[[-4901,4902,-4267]],"properties":{"id":"24662625","dp":16887,"de":0}},{"type":"Polygon","arcs":[[-4265,-4903,4903,4904,-4254,-4261]],"properties":{"id":"24662626","dp":11488,"de":0}},{"type":"Polygon","arcs":[[-4894,4905,-4904,-4900]],"properties":{"id":"24662627","dp":11148,"de":2153}},{"type":"Polygon","arcs":[[-1894,-4249,-4255,-4905,-4906,-4839,-4831,-4827,-3398,4906,4907,-1858,-1862,-1864,-1889]],"properties":{"id":"24662628","dp":472,"de":1388}},{"type":"Polygon","arcs":[[4908,4909,-4907,-4826,-4708,-4702,4910]],"properties":{"id":"24662629","dp":1060,"de":115}},{"type":"Polygon","arcs":[[-4910,4911,4912,4913,-4908]],"properties":{"id":"24662630","dp":11777,"de":1204}},{"type":"Polygon","arcs":[[-4914,4914,4915,4916,-1859]],"properties":{"id":"24662631","dp":15867,"de":1589}},{"type":"Polygon","arcs":[[-4917,4917,-1845,-1856]],"properties":{"id":"24662632","dp":15483,"de":2995}},{"type":"Polygon","arcs":[[4918,4919,-1846,-4918]],"properties":{"id":"24662633","dp":17894,"de":1372}},{"type":"Polygon","arcs":[[-4919,-4916,4920,4921]],"properties":{"id":"24662634","dp":20934,"de":0}},{"type":"Polygon","arcs":[[4922,4923,-4921,-4915,-4913]],"properties":{"id":"24662635","dp":11686,"de":2710}},{"type":"Polygon","arcs":[[4924,-4923,-4912,4925]],"properties":{"id":"24662636","dp":24550,"de":0}},{"type":"Polygon","arcs":[[4926,-4926,-4909]],"properties":{"id":"24662637","dp":23988,"de":0}},{"type":"Polygon","arcs":[[4927,4928,4929,4930,4931]],"properties":{"id":"24662638","dp":10316,"de":1399}},{"type":"Polygon","arcs":[[4932,4933,4934,-4929,4935]],"properties":{"id":"24662639","dp":9787,"de":1415}},{"type":"Polygon","arcs":[[4936,-4933,4937]],"properties":{"id":"24662640","dp":12450,"de":1214}},{"type":"Polygon","arcs":[[4938,4939,-4934,-4937]],"properties":{"id":"24662641","dp":9096,"de":0}},{"type":"Polygon","arcs":[[4940,4941,4942,4943,4944,4945,4946,4947]],"properties":{"id":"24663030","dp":2966,"de":382}},{"type":"Polygon","arcs":[[4948,4949,-4946,4950,4951,4952]],"properties":{"id":"24663031","dp":3616,"de":0}},{"type":"Polygon","arcs":[[4953,-3083,-3162,4954]],"properties":{"id":"24663075","dp":674,"de":79}},{"type":"Polygon","arcs":[[-3103,-2982,4955,-3160]],"properties":{"id":"24663076","dp":1076,"de":101}},{"type":"MultiPolygon","arcs":[[[4956,4957,4958,4959,4960,4961,4962]],[[4963,4964,4965,4966]]],"properties":{"id":"24663077","dp":282,"de":62}},{"type":"Polygon","arcs":[[4967,4968,4969]],"properties":{"id":"24663079","dp":7864,"de":0}},{"type":"Polygon","arcs":[[4970,4971,-4970,4972,4973,4974]],"properties":{"id":"24663080","dp":5606,"de":0}},{"type":"Polygon","arcs":[[4975,-4975,4976]],"properties":{"id":"24663081","dp":5152,"de":0}},{"type":"Polygon","arcs":[[4977,-4977,-4974,4978,4979,4980]],"properties":{"id":"24663082","dp":4933,"de":0}},{"type":"Polygon","arcs":[[4981,4982,4983,-4881,-4879,4984,4985,4986]],"properties":{"id":"24661399","dp":2976,"de":541}},{"type":"Polygon","arcs":[[4987,4988,4989,4990,-4984]],"properties":{"id":"24661400","dp":3899,"de":708}},{"type":"Polygon","arcs":[[-1343,-1346,4991,-4982,4992,-1339]],"properties":{"id":"24661401","dp":5107,"de":3163}},{"type":"Polygon","arcs":[[4993,-233,4994,-4988,-4983,-4992]],"properties":{"id":"24661402","dp":12976,"de":5402}},{"type":"Polygon","arcs":[[-4994,-1347,-3461,-234]],"properties":{"id":"24661405","dp":31666,"de":1570}},{"type":"Polygon","arcs":[[-1333,-1340,-4993,-4987,4995,4996,4997]],"properties":{"id":"24661407","dp":9731,"de":1788}},{"type":"Polygon","arcs":[[-4986,4998,-4996]],"properties":{"id":"24661408","dp":22746,"de":2331}},{"type":"Polygon","arcs":[[-1329,4999,-4997,-4999,-4985,-4878,5000,5001]],"properties":{"id":"24661409","dp":2728,"de":4005}},{"type":"Polygon","arcs":[[-4998,-5000,-1328]],"properties":{"id":"24661410","dp":24615,"de":5384}},{"type":"Polygon","arcs":[[5002,-5001,-4877,5003,5004]],"properties":{"id":"24661411","dp":3817,"de":566}},{"type":"Polygon","arcs":[[5005,-1330,-5002,-5003,5006,5007]],"properties":{"id":"24661412","dp":254,"de":260}},{"type":"Polygon","arcs":[[-5007,-5005,5008,5009,5010,5011,5012,5013]],"properties":{"id":"24661413","dp":3642,"de":721}},{"type":"Polygon","arcs":[[5014,-5011,5015,5016]],"properties":{"id":"24661414","dp":21659,"de":3526}},{"type":"Polygon","arcs":[[-5012,-5015,5017,5018,5019]],"properties":{"id":"24661415","dp":16468,"de":1984}},{"type":"Polygon","arcs":[[-5019,5020,5021,5022,5023,5024]],"properties":{"id":"24661416","dp":16285,"de":3650}},{"type":"Polygon","arcs":[[5025,5026,5027,-3173]],"properties":{"id":"24661893","dp":17329,"de":3125}},{"type":"Polygon","arcs":[[-5026,5028,5029,5030,5031,5032,5033]],"properties":{"id":"24661894","dp":5661,"de":8260}},{"type":"Polygon","arcs":[[-3172,5034,5035,5036,5037,-5029]],"properties":{"id":"24661895","dp":16720,"de":5600}},{"type":"Polygon","arcs":[[5038,-5035,-3171]],"properties":{"id":"24661896","dp":20169,"de":0}},{"type":"Polygon","arcs":[[-3170,5039,5040,-5036,-5039]],"properties":{"id":"24661897","dp":16994,"de":1554}},{"type":"Polygon","arcs":[[5041,5042,-5040,-3169]],"properties":{"id":"24661898","dp":14101,"de":6568}},{"type":"Polygon","arcs":[[5043,5044,-5042,-3168]],"properties":{"id":"24661899","dp":23580,"de":5626}},{"type":"Polygon","arcs":[[5045,5046,5047,5048,-5045]],"properties":{"id":"24661900","dp":15261,"de":8126}},{"type":"Polygon","arcs":[[-5049,5049,5050,-5043]],"properties":{"id":"24661901","dp":13506,"de":6944}},{"type":"Polygon","arcs":[[5051,5052,5053,5054,5055]],"properties":{"id":"24663084","dp":3793,"de":0}},{"type":"Polygon","arcs":[[-5054,5056,-4963,5057,-4965,5058]],"properties":{"id":"24663085","dp":3675,"de":0}},{"type":"Polygon","arcs":[[5059,-4980,5060,5061,5062,-4957,-5057]],"properties":{"id":"24663086","dp":5384,"de":0}},{"type":"Polygon","arcs":[[5063,5064,5065,5066]],"properties":{"id":"24661426","dp":21391,"de":2173}},{"type":"Polygon","arcs":[[5067,5068,5069,5070,-5065]],"properties":{"id":"24661427","dp":12930,"de":8255}},{"type":"Polygon","arcs":[[5071,5072,-5070,5073]],"properties":{"id":"24661428","dp":16936,"de":8274}},{"type":"Polygon","arcs":[[5074,-4773,-4771,5075,-5073]],"properties":{"id":"24661429","dp":10381,"de":14088}},{"type":"Polygon","arcs":[[5076,5077,-4780,-4776,-5075]],"properties":{"id":"24661430","dp":12173,"de":6956}},{"type":"Polygon","arcs":[[5078,5079,-5022,5080,-4785,-4783,-4777,-5078]],"properties":{"id":"24661431","dp":11167,"de":10583}},{"type":"Polygon","arcs":[[5081,5082,-5079,-5077,-5072,5083]],"properties":{"id":"24661432","dp":17155,"de":2245}},{"type":"Polygon","arcs":[[-5076,-4770,-4769,5084,5085,-5071]],"properties":{"id":"24661433","dp":10080,"de":7329}},{"type":"Polygon","arcs":[[-5085,-4768,-4761,5086,5087,5088]],"properties":{"id":"24661434","dp":12990,"de":11934}},{"type":"Polygon","arcs":[[-5086,-5089,5089,5090,5091,-5066]],"properties":{"id":"24661435","dp":14108,"de":11512}},{"type":"Polygon","arcs":[[-5088,5092,5093,-5090]],"properties":{"id":"24661436","dp":20194,"de":3721}},{"type":"Polygon","arcs":[[-5094,5094,5095,5096]],"properties":{"id":"24661437","dp":16964,"de":8333}},{"type":"Polygon","arcs":[[-5091,-5097,5097,5098,5099]],"properties":{"id":"24661438","dp":15305,"de":6845}},{"type":"Polygon","arcs":[[5100,-5098,5101,5102,5103]],"properties":{"id":"24661439","dp":14174,"de":7119}},{"type":"Polygon","arcs":[[-5096,5104,-5102]],"properties":{"id":"24661440","dp":17272,"de":3409}},{"type":"Polygon","arcs":[[5105,-5103,-5105,5106,5107,5108,5109]],"properties":{"id":"24661441","dp":8472,"de":1280}},{"type":"Polygon","arcs":[[5110,-4765,5111,-5107,-5095]],"properties":{"id":"24661442","dp":9494,"de":2853}},{"type":"Polygon","arcs":[[-5087,-4766,-5111,-5093]],"properties":{"id":"24661443","dp":19421,"de":2210}},{"type":"Polygon","arcs":[[5112,5113,-5112,5114,5115,5116,5117]],"properties":{"id":"24661444","dp":15638,"de":2543}},{"type":"Polygon","arcs":[[-5113,5118,5119]],"properties":{"id":"24661445","dp":13980,"de":3618}},{"type":"Polygon","arcs":[[-5118,5120,5121,-5119]],"properties":{"id":"24661446","dp":14249,"de":2544}},{"type":"Polygon","arcs":[[-5122,5122,5123,5124,5125]],"properties":{"id":"24661447","dp":14377,"de":3228}},{"type":"Polygon","arcs":[[5126,-1257,5127,5128,-3671]],"properties":{"id":"24661925","dp":10527,"de":8822}},{"type":"Polygon","arcs":[[5129,5130,5131,-3672,-5129]],"properties":{"id":"24661926","dp":8836,"de":5325}},{"type":"Polygon","arcs":[[-1263,5132,-5130,-5128]],"properties":{"id":"24661927","dp":9599,"de":8166}},{"type":"Polygon","arcs":[[-5131,-5133,-1266,-4792,-4793,5133]],"properties":{"id":"24661928","dp":7821,"de":17913}},{"type":"Polygon","arcs":[[-5134,-4799,-3673,-5132]],"properties":{"id":"24661929","dp":15569,"de":24683}},{"type":"Polygon","arcs":[[5134,-3695,-3702,5135]],"properties":{"id":"24661936","dp":14148,"de":8703}},{"type":"Polygon","arcs":[[-3718,-3710,5136,-5136,-3701,-1211]],"properties":{"id":"24661937","dp":11421,"de":7106}},{"type":"Polygon","arcs":[[5137,5138,5139,5140,5141,5142]],"properties":{"id":"24663123","dp":3014,"de":274}},{"type":"Polygon","arcs":[[-5143,5143,5144,5145]],"properties":{"id":"24663124","dp":426,"de":1169}},{"type":"Polygon","arcs":[[5146,5147,-5144,-5142,5148,-4961]],"properties":{"id":"24663125","dp":72,"de":62}},{"type":"Polygon","arcs":[[5149,5150]],"properties":{"id":"24663126","dp":3847,"de":308}},{"type":"Polygon","arcs":[[-5150,5151]],"properties":{"id":"24663127","dp":3074,"de":0}},{"type":"Polygon","arcs":[[-4680,-3448]],"properties":{"id":"24662989","dp":4683,"de":496}},{"type":"Polygon","arcs":[[5152,5153,5154,-3443]],"properties":{"id":"24662992","dp":8168,"de":0}},{"type":"Polygon","arcs":[[5155,-4681,-3446,5156]],"properties":{"id":"24662993","dp":7857,"de":2639}},{"type":"Polygon","arcs":[[-3445,5157,5158,5159,5160,5161,5162,-5157]],"properties":{"id":"24662994","dp":3402,"de":728}},{"type":"Polygon","arcs":[[5163,5164,5165,5166,5167]],"properties":{"id":"24663088","dp":3617,"de":225}},{"type":"Polygon","arcs":[[-5166,5168]],"properties":{"id":"24663089","dp":4119,"de":0}},{"type":"Polygon","arcs":[[5169,5170,5171,5172,5173,5174]],"properties":{"id":"24663090","dp":2782,"de":211}},{"type":"Polygon","arcs":[[-5175,5175,5176]],"properties":{"id":"24663091","dp":2875,"de":0}},{"type":"Polygon","arcs":[[-5170,-5177,5177]],"properties":{"id":"24663092","dp":3252,"de":0}},{"type":"Polygon","arcs":[[5178,5179]],"properties":{"id":"24663094","dp":3788,"de":0}},{"type":"Polygon","arcs":[[5180,5181,-5180,5182,5183,5184,5185]],"properties":{"id":"24663095","dp":2894,"de":362}},{"type":"Polygon","arcs":[[5186,5187,5188,5189,5190,5191,5192]],"properties":{"id":"24663096","dp":1854,"de":332}},{"type":"Polygon","arcs":[[5193,5194,5195,-5193,5196,5197]],"properties":{"id":"24663097","dp":2731,"de":255}},{"type":"Polygon","arcs":[[5198,-5187,-5196]],"properties":{"id":"24663098","dp":2882,"de":0}},{"type":"Polygon","arcs":[[-5195,5199,5200,5201,5202,5203,-5188,-5199]],"properties":{"id":"24663099","dp":804,"de":140}},{"type":"Polygon","arcs":[[5204,-5200,-5194,5205,-4677]],"properties":{"id":"24663100","dp":3489,"de":0}},{"type":"Polygon","arcs":[[5206,5207,5208,5209,5210,5211]],"properties":{"id":"24663369","dp":10290,"de":38854}},{"type":"Polygon","arcs":[[-4678,-5206,-5198,5212,5213,5214]],"properties":{"id":"24663102","dp":2151,"de":413}},{"type":"Polygon","arcs":[[5215,5216,5217,5218,5219,5220,5221]],"properties":{"id":"24663103","dp":1368,"de":279}},{"type":"Polygon","arcs":[[5222,-5220,5223]],"properties":{"id":"24663104","dp":2245,"de":0}},{"type":"Polygon","arcs":[[5224,-5221,-5223,5225]],"properties":{"id":"24663105","dp":2219,"de":179}},{"type":"MultiPolygon","arcs":[[[5226,-5225,5227,5228,5229,5230]],[[5231,5232,5233,5234,5235,5236,5237]]],"properties":{"id":"24663106","dp":1239,"de":485}},{"type":"Polygon","arcs":[[5238,5239,5240,5241,-5222,-5227,5242]],"properties":{"id":"24663107","dp":1383,"de":479}},{"type":"Polygon","arcs":[[5243,5244,-5216,-5242]],"properties":{"id":"24663108","dp":1929,"de":0}},{"type":"Polygon","arcs":[[-5244,-5241,5245,5246,5247]],"properties":{"id":"24663109","dp":1943,"de":163}},{"type":"Polygon","arcs":[[-5245,-5248,5248,-5202,-5217]],"properties":{"id":"24663110","dp":1462,"de":139}},{"type":"Polygon","arcs":[[-5247,5249,5250,5251,5252,5253,5254,-5203,-5249]],"properties":{"id":"24663111","dp":206,"de":1307}},{"type":"Polygon","arcs":[[5255,5256,5257,-5251]],"properties":{"id":"24663112","dp":1319,"de":168}},{"type":"Polygon","arcs":[[5258,-3498,5259]],"properties":{"id":"24663139","dp":8410,"de":0}},{"type":"Polygon","arcs":[[-5156,-5163,5260,-4682]],"properties":{"id":"24662995","dp":2103,"de":574}},{"type":"Polygon","arcs":[[5261,5262,5263,-5261]],"properties":{"id":"24662996","dp":2752,"de":0}},{"type":"Polygon","arcs":[[5264,-5262,-5162,5265,5266]],"properties":{"id":"24662997","dp":11611,"de":828}},{"type":"Polygon","arcs":[[-5266,-5161,5267,5268,5269,5270,5271,5272]],"properties":{"id":"24662998","dp":262,"de":0}},{"type":"Polygon","arcs":[[-5269,5273,5274]],"properties":{"id":"24662999","dp":6982,"de":0}},{"type":"Polygon","arcs":[[5275,5276,5277,5278,-5271]],"properties":{"id":"24663000","dp":3577,"de":0}},{"type":"Polygon","arcs":[[5279,5280,5281,5282,-5277]],"properties":{"id":"24663001","dp":2883,"de":0}},{"type":"Polygon","arcs":[[5283,5284,5285,5286,5287,-5272,-5279]],"properties":{"id":"24663002","dp":3145,"de":589}},{"type":"Polygon","arcs":[[-5267,-5273,-5288,5288,5289,5290,5291,5292,-4865,5293]],"properties":{"id":"24663003","dp":2185,"de":331}},{"type":"Polygon","arcs":[[5294,5295,5296,-5291]],"properties":{"id":"24663004","dp":2748,"de":0}},{"type":"Polygon","arcs":[[5297,5298,5299,-5296]],"properties":{"id":"24663005","dp":2154,"de":436}},{"type":"Polygon","arcs":[[-5295,-5290,5300,5301,5302,-5298]],"properties":{"id":"24663006","dp":2700,"de":513}},{"type":"Polygon","arcs":[[-5299,-5303,5303,5304,5305]],"properties":{"id":"24663007","dp":2390,"de":442}},{"type":"Polygon","arcs":[[-5292,-5297,-5300,-5306,5306,5307]],"properties":{"id":"24663008","dp":2340,"de":0}},{"type":"Polygon","arcs":[[-5293,-5308,5308,5309,5310,-4860]],"properties":{"id":"24663009","dp":3982,"de":369}},{"type":"Polygon","arcs":[[5311,5312,5313,5314,5315,5316,-3478,5317]],"properties":{"id":"24661728","dp":2231,"de":181}},{"type":"Polygon","arcs":[[-5316,5318,-360,5319]],"properties":{"id":"24661729","dp":8286,"de":7159}},{"type":"Polygon","arcs":[[-4819,-4818,5320,5321,-3677]],"properties":{"id":"24661867","dp":7988,"de":18450}},{"type":"Polygon","arcs":[[-5321,-4817,5322,5323]],"properties":{"id":"24661868","dp":21743,"de":4816}},{"type":"Polygon","arcs":[[-5323,-4816,5324,5325,5326,5327]],"properties":{"id":"24661869","dp":6918,"de":5238}},{"type":"Polygon","arcs":[[5328,5329,-3678,-5322,-5324,-5328,5330]],"properties":{"id":"24661870","dp":4383,"de":5790}},{"type":"Polygon","arcs":[[5331,-5237,5332,5333,5334,5335,5336]],"properties":{"id":"24663128","dp":1312,"de":1785}},{"type":"Polygon","arcs":[[5337,5338,5339,5340,-5333]],"properties":{"id":"24663129","dp":1128,"de":536}},{"type":"Polygon","arcs":[[-5341,5341,5342,-5334]],"properties":{"id":"24663130","dp":2422,"de":866}},{"type":"Polygon","arcs":[[5343,-5342,-5340,5344,5345]],"properties":{"id":"24663131","dp":3284,"de":945}},{"type":"Polygon","arcs":[[-5343,-5344,5346,5347,5348,-5335]],"properties":{"id":"24663132","dp":1831,"de":453}},{"type":"Polygon","arcs":[[-5347,-5346,5349]],"properties":{"id":"24663133","dp":2086,"de":0}},{"type":"Polygon","arcs":[[-5348,-5350,-5345,-5339,5350,5351,5352,-3067,5353,5354,5355]],"properties":{"id":"24663134","dp":1348,"de":312}},{"type":"Polygon","arcs":[[-5355,5356,5357]],"properties":{"id":"24663135","dp":1995,"de":0}},{"type":"Polygon","arcs":[[5358,5359,-5337,5360,-5358,5361,5362]],"properties":{"id":"24663136","dp":1330,"de":200}},{"type":"Polygon","arcs":[[-5349,-5356,-5361,-5336]],"properties":{"id":"24663137","dp":2671,"de":273}},{"type":"Polygon","arcs":[[-5259,5363,5364,5365,5366,5367,5368,-3499]],"properties":{"id":"24663138","dp":7577,"de":924}},{"type":"Polygon","arcs":[[-4683,-5264,5369,5370,5371]],"properties":{"id":"24663140","dp":2380,"de":0}},{"type":"Polygon","arcs":[[-5263,-5265,-5294,-4864,-5370]],"properties":{"id":"24663141","dp":3953,"de":467}},{"type":"Polygon","arcs":[[5372,-2031,5373]],"properties":{"id":"24663142","dp":25457,"de":0}},{"type":"Polygon","arcs":[[5374,-5374,-2030,5375,5376,5377,-1797]],"properties":{"id":"24663143","dp":4089,"de":1331}},{"type":"Polygon","arcs":[[-5375,-1796,-1806,-1819,-2032,-5373]],"properties":{"id":"24663144","dp":4815,"de":1012}},{"type":"Polygon","arcs":[[-5377,5378,5379,5380,5381]],"properties":{"id":"24663145","dp":7448,"de":576}},{"type":"Polygon","arcs":[[-5380,5382,5383,5384]],"properties":{"id":"24663146","dp":6888,"de":576}},{"type":"Polygon","arcs":[[-5381,-5385,5385,5386]],"properties":{"id":"24663147","dp":8625,"de":2031}},{"type":"Polygon","arcs":[[5387,5388,-5383]],"properties":{"id":"24663149","dp":5396,"de":1353}},{"type":"Polygon","arcs":[[-5376,-2029,5389,5390,-5388,-5379]],"properties":{"id":"24663150","dp":5796,"de":0}},{"type":"Polygon","arcs":[[5391,5392,5393,5394,5395,5396,5397,-3437,5398,-3441,5399,5400,5401,5402]],"properties":{"id":"24663151","dp":284,"de":2721}},{"type":"Polygon","arcs":[[5403,5404,5405,5406,5407,5408,5409,-5401]],"properties":{"id":"24663152","dp":718,"de":2931}},{"type":"Polygon","arcs":[[-5409,5410,5411,5412]],"properties":{"id":"24663153","dp":1498,"de":3607}},{"type":"Polygon","arcs":[[5413,5414,-5405,5415]],"properties":{"id":"24663154","dp":2620,"de":0}},{"type":"Polygon","arcs":[[5416,5417,5418,-5406,-5415]],"properties":{"id":"24663155","dp":3962,"de":0}},{"type":"Polygon","arcs":[[5419,5420,5421,5422,5423,-5418]],"properties":{"id":"24663156","dp":4107,"de":274}},{"type":"Polygon","arcs":[[-5417,5424,5425,5426,-5420]],"properties":{"id":"24663157","dp":4373,"de":0}},{"type":"Polygon","arcs":[[5427,-5425,-5414,5428]],"properties":{"id":"24663158","dp":2091,"de":0}},{"type":"Polygon","arcs":[[-5400,5429,5430,-5429,-5416,-5404]],"properties":{"id":"24663159","dp":2908,"de":392}},{"type":"Polygon","arcs":[[-5430,-3440,5431,5432,5433],[5434,5435]],"properties":{"id":"24663160","dp":1418,"de":512}},{"type":"Polygon","arcs":[[5436,5437,5438,5439,-4943]],"properties":{"id":"24663032","dp":4308,"de":297}},{"type":"Polygon","arcs":[[5440,5441,5442,5443,5444]],"properties":{"id":"24663169","dp":5649,"de":654}},{"type":"Polygon","arcs":[[5445,-5442,5446,5447,5448,5449]],"properties":{"id":"24663170","dp":2125,"de":1054}},{"type":"Polygon","arcs":[[5450,-5444,5451]],"properties":{"id":"24663171","dp":15617,"de":8707}},{"type":"Polygon","arcs":[[-3439,5452,5453,5454,5455,5456,-5432]],"properties":{"id":"24663172","dp":1321,"de":715}},{"type":"Polygon","arcs":[[5457,5458,-5456]],"properties":{"id":"24663173","dp":2771,"de":200}},{"type":"Polygon","arcs":[[-5455,5459,5460,5461,5462,-5458]],"properties":{"id":"24663174","dp":1629,"de":1407}},{"type":"Polygon","arcs":[[5463,-3054,5464,5465,-5463]],"properties":{"id":"24663175","dp":2280,"de":724}},{"type":"Polygon","arcs":[[5466,5467,5468,5469,-5464,-5462]],"properties":{"id":"24663176","dp":2022,"de":1603}},{"type":"Polygon","arcs":[[5470,5471,5472,-5468,5473]],"properties":{"id":"24663177","dp":3514,"de":0}},{"type":"Polygon","arcs":[[5474,5475,-5474,-5467,-5461,5476,5477]],"properties":{"id":"24663178","dp":1104,"de":1497}},{"type":"Polygon","arcs":[[5478,5479,-5471,-5476]],"properties":{"id":"24663179","dp":3160,"de":0}},{"type":"Polygon","arcs":[[-5067,-5092,5480,5481]],"properties":{"id":"24661834","dp":19267,"de":5860}},{"type":"Polygon","arcs":[[5482,5483,5484,5485,5486,5487]],"properties":{"id":"24661835","dp":13910,"de":10337}},{"type":"Polygon","arcs":[[5488,-5488,5489,5490]],"properties":{"id":"24661836","dp":11541,"de":9589}},{"type":"Polygon","arcs":[[-5490,-5487,5491,5492,5493,5494]],"properties":{"id":"24661837","dp":10114,"de":10665}},{"type":"Polygon","arcs":[[5495,-5491,-5495,5496,5497]],"properties":{"id":"24661838","dp":14367,"de":7806}},{"type":"Polygon","arcs":[[-5497,-5494,5498,5499,5500]],"properties":{"id":"24661839","dp":14441,"de":6472}},{"type":"Polygon","arcs":[[-5500,5501,-5044,5502]],"properties":{"id":"24661840","dp":10863,"de":7142}},{"type":"Polygon","arcs":[[5503,-5503,-3167,5504]],"properties":{"id":"24661841","dp":15344,"de":5603}},{"type":"Polygon","arcs":[[5505,-5501,-5504,5506,5507]],"properties":{"id":"24661842","dp":18575,"de":3166}},{"type":"Polygon","arcs":[[-5331,-5327,5508,5509,5510]],"properties":{"id":"24661871","dp":6399,"de":9697}},{"type":"Polygon","arcs":[[-5510,5511,5512]],"properties":{"id":"24661872","dp":13771,"de":13840}},{"type":"Polygon","arcs":[[5513,5514,-5512]],"properties":{"id":"24661873","dp":15744,"de":1566}},{"type":"Polygon","arcs":[[-5515,5515,-412,-409,-398,5516]],"properties":{"id":"24661874","dp":11193,"de":5645}},{"type":"Polygon","arcs":[[5517,5518,5519,5520,5521,-407,-411,-416]],"properties":{"id":"24661877","dp":4971,"de":5242}},{"type":"Polygon","arcs":[[5522,5523,5524,5525,5526,-5518,-415]],"properties":{"id":"24661879","dp":7276,"de":7811}},{"type":"Polygon","arcs":[[5527,5528,-5523,5529]],"properties":{"id":"24661880","dp":14052,"de":2236}},{"type":"Polygon","arcs":[[5530,5531,5532,5533,-5524,-5529]],"properties":{"id":"24661881","dp":19101,"de":3651}},{"type":"Polygon","arcs":[[5534,5535,5536,-5531,-5528,5537]],"properties":{"id":"24661882","dp":14992,"de":2623}},{"type":"Polygon","arcs":[[5538,5539,-3175,-5535,5540]],"properties":{"id":"24661883","dp":5861,"de":38564}},{"type":"Polygon","arcs":[[5541,-5541,5542,5543]],"properties":{"id":"24661884","dp":12598,"de":8352}},{"type":"Polygon","arcs":[[5544,-5543,-5538,-5530,-414,5545,-5325]],"properties":{"id":"24661885","dp":6272,"de":887}},{"type":"Polygon","arcs":[[-5326,-5546,-417,-413,-5516,-5514,-5509]],"properties":{"id":"24661886","dp":5636,"de":22045}},{"type":"Polygon","arcs":[[-4809,5546,-5544,-5545,-4815]],"properties":{"id":"24661887","dp":14227,"de":1328}},{"type":"Polygon","arcs":[[-5536,-3174,-5028,5547]],"properties":{"id":"24661889","dp":45392,"de":10535}},{"type":"Polygon","arcs":[[-5548,5548,5549,-5537]],"properties":{"id":"24661890","dp":22307,"de":4142}},{"type":"Polygon","arcs":[[-5550,5550,5551,-5532]],"properties":{"id":"24661891","dp":19068,"de":3105}},{"type":"Polygon","arcs":[[-5549,-5027,-5034,5552,-5551]],"properties":{"id":"24661892","dp":20722,"de":2208}},{"type":"Polygon","arcs":[[5553,5554,5555,-5235]],"properties":{"id":"24662308","dp":1893,"de":261}},{"type":"Polygon","arcs":[[-5554,-5234,5556,5557,5558,5559]],"properties":{"id":"24662309","dp":1331,"de":1818}},{"type":"Polygon","arcs":[[-5233,5560,5561,-5557]],"properties":{"id":"24662310","dp":2185,"de":325}},{"type":"Polygon","arcs":[[5562,5563,5564,5565,5566,5567,-4290,5568,-583,-576,-4383,-4379,5569]],"properties":{"id":"24663351","dp":0,"de":5176}},{"type":"Polygon","arcs":[[-4491,5570,5571,-5567,5572]],"properties":{"id":"24663352","dp":17255,"de":1583}},{"type":"Polygon","arcs":[[-4490,5573,-5571]],"properties":{"id":"24663353","dp":38342,"de":4285}},{"type":"Polygon","arcs":[[-5371,-4863,-4866,-4861,-5311,5574,5575]],"properties":{"id":"24663012","dp":3553,"de":0}},{"type":"Polygon","arcs":[[-5310,5576,5577,-5575]],"properties":{"id":"24663013","dp":4801,"de":1237}},{"type":"Polygon","arcs":[[-5577,-5309,-5307,-5305,5578,5579,5580,5581,5582,5583]],"properties":{"id":"24663014","dp":2146,"de":461}},{"type":"Polygon","arcs":[[-5581,5584,5585,5586,5587]],"properties":{"id":"24663015","dp":6630,"de":867}},{"type":"Polygon","arcs":[[5588,5589,5590,-5586]],"properties":{"id":"24663016","dp":6259,"de":797}},{"type":"Polygon","arcs":[[5591,5592,5593,5594,-5587,-5591,5595]],"properties":{"id":"24663017","dp":4788,"de":1934}},{"type":"Polygon","arcs":[[5596,-5594,5597]],"properties":{"id":"24663018","dp":12425,"de":1063}},{"type":"Polygon","arcs":[[-5582,-5588,-5595,-5597,5598,5599,5600]],"properties":{"id":"24663019","dp":8546,"de":0}},{"type":"Polygon","arcs":[[-5583,-5601,5601,5602,5603,5604]],"properties":{"id":"24663020","dp":3414,"de":88}},{"type":"Polygon","arcs":[[5605,5606,5607,5608,5609,-5604,5610,5611]],"properties":{"id":"24663021","dp":1716,"de":0}},{"type":"Polygon","arcs":[[5612,5613,5614,5615,-5607]],"properties":{"id":"24663022","dp":2784,"de":0}},{"type":"Polygon","arcs":[[5616,5617,5618,5619,-5608,-5616,5620]],"properties":{"id":"24663023","dp":2460,"de":0}},{"type":"Polygon","arcs":[[5621,-5621,-5615,5622,5623]],"properties":{"id":"24663024","dp":3356,"de":0}},{"type":"Polygon","arcs":[[5624,5625,-5624,5626,5627,5628]],"properties":{"id":"24663025","dp":2667,"de":277}},{"type":"Polygon","arcs":[[5629,5630,5631,-5617,-5622,-5626,5632]],"properties":{"id":"24663026","dp":8355,"de":0}},{"type":"Polygon","arcs":[[5633,-5633,-5625,5634,5635,5636]],"properties":{"id":"24663027","dp":2987,"de":288}},{"type":"Polygon","arcs":[[5637,-4944,-5440,5638,-5630,-5634]],"properties":{"id":"24663028","dp":4176,"de":0}},{"type":"Polygon","arcs":[[-4945,-5638,-5637,5639,-4951]],"properties":{"id":"24663029","dp":3170,"de":0}},{"type":"Polygon","arcs":[[5640,5641,5642,5643]],"properties":{"id":"24661758","dp":16156,"de":2135}},{"type":"Polygon","arcs":[[-5644,5644,5645,5646]],"properties":{"id":"24661759","dp":16996,"de":0}},{"type":"Polygon","arcs":[[-5646,5647,5648,5649]],"properties":{"id":"24661760","dp":16938,"de":2857}},{"type":"Polygon","arcs":[[5650,5651,-5368,5652,-5437,-4942,5653]],"properties":{"id":"24663033","dp":3425,"de":276}},{"type":"Polygon","arcs":[[-5367,5654,5655,-5438,-5653]],"properties":{"id":"24663034","dp":4851,"de":2227}},{"type":"Polygon","arcs":[[5656,5657,-5655,5658]],"properties":{"id":"24663035","dp":2814,"de":1185}},{"type":"Polygon","arcs":[[5659,5660,5661,5662,5663,-5658,5664]],"properties":{"id":"24663036","dp":4236,"de":1253}},{"type":"Polygon","arcs":[[5665,5666,5667,-5660]],"properties":{"id":"24663037","dp":2719,"de":477}},{"type":"Polygon","arcs":[[5668,5669,5670,5671,-5661,-5668]],"properties":{"id":"24663038","dp":3770,"de":0}},{"type":"Polygon","arcs":[[5672,5673,5674,5675,-5669,-5667]],"properties":{"id":"24663039","dp":3710,"de":0}},{"type":"Polygon","arcs":[[5676,-5673,-5666,-5665,-5657]],"properties":{"id":"24663040","dp":2819,"de":336}},{"type":"Polygon","arcs":[[-5676,5677,5678,-5670]],"properties":{"id":"24663041","dp":2945,"de":0}},{"type":"Polygon","arcs":[[-5675,5679,5680,5681,5682,5683,5684,-5678]],"properties":{"id":"24663042","dp":3268,"de":0}},{"type":"Polygon","arcs":[[5685,5686,5687,5688,-5684]],"properties":{"id":"24663043","dp":2853,"de":340}},{"type":"Polygon","arcs":[[-5671,-5679,-5685,-5689,5689,5690]],"properties":{"id":"24663044","dp":3365,"de":635}},{"type":"Polygon","arcs":[[-5691,5691,5692,5693,5694,-5662,-5672]],"properties":{"id":"24663045","dp":3039,"de":3211}},{"type":"Polygon","arcs":[[5695,5696,5697,-5693,5698]],"properties":{"id":"24663046","dp":3451,"de":1261}},{"type":"Polygon","arcs":[[5699,5700,5701,5702]],"properties":{"id":"24661791","dp":18706,"de":2097}},{"type":"Polygon","arcs":[[5703,-5703,5704,-5520]],"properties":{"id":"24661792","dp":17711,"de":0}},{"type":"Polygon","arcs":[[-5519,-5527,5705,5706,-5700,-5704]],"properties":{"id":"24661793","dp":13902,"de":5226}},{"type":"Polygon","arcs":[[5707,5708,5709,-5706,-5526]],"properties":{"id":"24661794","dp":18778,"de":0}},{"type":"Polygon","arcs":[[-5534,5710,-5708,-5525]],"properties":{"id":"24661795","dp":17990,"de":7191}},{"type":"Polygon","arcs":[[5711,5712,5713,-5711]],"properties":{"id":"24661796","dp":15874,"de":3321}},{"type":"Polygon","arcs":[[-5552,-5553,5714,5715,-5712,-5533]],"properties":{"id":"24661797","dp":11063,"de":7183}},{"type":"Polygon","arcs":[[5716,-5507,-5505,-3166,5717]],"properties":{"id":"24661843","dp":21604,"de":2389}},{"type":"Polygon","arcs":[[-3690,-5508,-5717,5718,5719]],"properties":{"id":"24661844","dp":17615,"de":3145}},{"type":"Polygon","arcs":[[-5719,-5718,-3165,5720]],"properties":{"id":"24661845","dp":17066,"de":2666}},{"type":"Polygon","arcs":[[5721,-5721,-3164,5722]],"properties":{"id":"24661846","dp":15626,"de":2924}},{"type":"Polygon","arcs":[[5723,-4787,-3705,-3699,-3691,-5720,-5722]],"properties":{"id":"24661847","dp":13139,"de":6744}},{"type":"Polygon","arcs":[[-4788,-5724,-5723,-3163,5724]],"properties":{"id":"24661848","dp":31371,"de":18805}},{"type":"Polygon","arcs":[[-4789,-5725,5725,5726]],"properties":{"id":"24661849","dp":17768,"de":4347}},{"type":"Polygon","arcs":[[-5726,-3178,5727,5728]],"properties":{"id":"24661850","dp":20327,"de":4754}},{"type":"Polygon","arcs":[[-5728,-3177,5729,5730]],"properties":{"id":"24661851","dp":17157,"de":4987}},{"type":"Polygon","arcs":[[-5730,-3176,-5540,5731]],"properties":{"id":"24661852","dp":12081,"de":5338}},{"type":"Polygon","arcs":[[-4806,5732,-5732,-5539,-5542,-5547,-4808]],"properties":{"id":"24661853","dp":11568,"de":4222}},{"type":"Polygon","arcs":[[5733,-5731,-5733,-4805]],"properties":{"id":"24661854","dp":16275,"de":3691}},{"type":"Polygon","arcs":[[-4797,5734,-5729,-5734,-4802]],"properties":{"id":"24661855","dp":14986,"de":4289}},{"type":"Polygon","arcs":[[5735,-5727,-5735,-4796,-4801]],"properties":{"id":"24661856","dp":12903,"de":2867}},{"type":"Polygon","arcs":[[-4790,-5736,-4800,-4794]],"properties":{"id":"24661857","dp":15374,"de":3524}},{"type":"Polygon","arcs":[[5736,5737,5738,-5477,5739,5740]],"properties":{"id":"24662291","dp":2363,"de":2620}},{"type":"Polygon","arcs":[[5741,5742,5743,-5738,5744]],"properties":{"id":"24662292","dp":3110,"de":249}},{"type":"Polygon","arcs":[[5745,5746,-5478,-5739,-5744,5747]],"properties":{"id":"24662293","dp":1729,"de":569}},{"type":"Polygon","arcs":[[5748,-5748,-5743,5749]],"properties":{"id":"24662294","dp":3013,"de":0}},{"type":"Polygon","arcs":[[5750,5751,-5750,-5742]],"properties":{"id":"24662295","dp":3863,"de":0}},{"type":"Polygon","arcs":[[5752,5753,5754,5755,5756,5757]],"properties":{"id":"24661972","dp":7154,"de":5237}},{"type":"Polygon","arcs":[[-1498,-1494,5758,-5754]],"properties":{"id":"24661973","dp":14735,"de":0}},{"type":"Polygon","arcs":[[-5759,-1493,5759,5760,-5755]],"properties":{"id":"24661974","dp":11199,"de":2828}},{"type":"Polygon","arcs":[[-5761,5761,5762,-5756]],"properties":{"id":"24661975","dp":12568,"de":1477}},{"type":"Polygon","arcs":[[-5763,5763,5764,5765,5766]],"properties":{"id":"24661976","dp":12302,"de":3386}},{"type":"Polygon","arcs":[[-5766,5767,5768,5769,5770]],"properties":{"id":"24661977","dp":12413,"de":3605}},{"type":"Polygon","arcs":[[-5765,5771,5772,5773,-5768]],"properties":{"id":"24661978","dp":9698,"de":3723}},{"type":"Polygon","arcs":[[-5774,5774,5775,5776]],"properties":{"id":"24661979","dp":10805,"de":1761}},{"type":"Polygon","arcs":[[5777,-5769,-5777,-1475,-1490,5778]],"properties":{"id":"24661980","dp":12658,"de":0}},{"type":"Polygon","arcs":[[-5572,-5574,-4487,5779,5780,5781,-4293,-4499,-3971,5782,-1106,-3400,-4287,-5568]],"properties":{"id":"24663354","dp":3628,"de":402}},{"type":"Polygon","arcs":[[-4294,-5782,-4475]],"properties":{"id":"24663355","dp":111302,"de":4166}},{"type":"Polygon","arcs":[[-5781,5783,-4481,-4476]],"properties":{"id":"24663356","dp":44790,"de":2958}},{"type":"Polygon","arcs":[[-4486,-4482,-5784,-5780]],"properties":{"id":"24663357","dp":30050,"de":1518}},{"type":"Polygon","arcs":[[-2958,5784,-2749,5785,-1319,-1317,-1315,-1311]],"properties":{"id":"24663358","dp":4498,"de":23309}},{"type":"Polygon","arcs":[[-2957,5786,5787,-2750,-5785]],"properties":{"id":"24663359","dp":24693,"de":8844}},{"type":"Polygon","arcs":[[-2751,-5788,5788]],"properties":{"id":"24663360","dp":43966,"de":6404}},{"type":"Polygon","arcs":[[-2956,-2756,-2752,-5789,-5787]],"properties":{"id":"24663361","dp":11578,"de":26430}},{"type":"Polygon","arcs":[[-1320,-5786,-2748,5789,5790,-1972,5791,-5008,-5014,5792,5793,5794,5795,-1286,-1291,-1297]],"properties":{"id":"24663362","dp":377,"de":1046}},{"type":"Polygon","arcs":[[5796,-5209,-2719,-2717,5797,-5790,-2747,-2745]],"properties":{"id":"24663363","dp":3285,"de":10361}},{"type":"Polygon","arcs":[[-1978,-1973,-5791,-5798,-2716]],"properties":{"id":"24663364","dp":3918,"de":1604}},{"type":"Polygon","arcs":[[-5797,-3389,-2758,-230,-2742,5798,5799,-5210]],"properties":{"id":"24663365","dp":5087,"de":3867}},{"type":"Polygon","arcs":[[5800,-5799,-2741,-2720,5801]],"properties":{"id":"24663366","dp":27344,"de":2074}},{"type":"Polygon","arcs":[[5802,5803,-5802,-2724]],"properties":{"id":"24663367","dp":45965,"de":30965}},{"type":"Polygon","arcs":[[-5211,-5800,-5801,-5804,5804]],"properties":{"id":"24663368","dp":39370,"de":14173}},{"type":"Polygon","arcs":[[5805,5806,5807,5808,-5050]],"properties":{"id":"24661902","dp":15724,"de":3621}},{"type":"Polygon","arcs":[[-5048,5809,5810,-5806]],"properties":{"id":"24661903","dp":17957,"de":4042}},{"type":"Polygon","arcs":[[-5047,5811,5812,-5810]],"properties":{"id":"24661904","dp":14102,"de":5769}},{"type":"Polygon","arcs":[[5813,5814,5815,-5812]],"properties":{"id":"24661905","dp":18581,"de":4181}},{"type":"Polygon","arcs":[[5816,5817,-5815,5818]],"properties":{"id":"24661906","dp":17101,"de":5253}},{"type":"Polygon","arcs":[[-5493,-5819,-5814,-5046,-5502,-5499]],"properties":{"id":"24661907","dp":14172,"de":6843}},{"type":"Polygon","arcs":[[-5808,5819,5820]],"properties":{"id":"24661908","dp":18148,"de":3086}},{"type":"Polygon","arcs":[[-5809,-5821,5821,5822,5823,5824]],"properties":{"id":"24661909","dp":12063,"de":9047}},{"type":"Polygon","arcs":[[5825,5826,5827,5828,-5822,-5820]],"properties":{"id":"24661910","dp":10776,"de":4223}},{"type":"Polygon","arcs":[[5829,5830,5831,5832,-5827]],"properties":{"id":"24661911","dp":17397,"de":3253}},{"type":"Polygon","arcs":[[5833,-5824,5834,-5030,-5038]],"properties":{"id":"24661912","dp":13715,"de":8823}},{"type":"Polygon","arcs":[[-5051,-5825,-5834,-5037,-5041]],"properties":{"id":"24661913","dp":15152,"de":9418}},{"type":"Polygon","arcs":[[-5329,-5511,-5513,-5517,-405,5835,5836]],"properties":{"id":"24661916","dp":2651,"de":334}},{"type":"Polygon","arcs":[[5837,-5836,-404,5838,5839,5840,5841]],"properties":{"id":"24661917","dp":2234,"de":4686}},{"type":"Polygon","arcs":[[5842,-5842,5843,5844,5845]],"properties":{"id":"24661918","dp":5145,"de":970}},{"type":"Polygon","arcs":[[5846,-5846,5847,5848,5849,5850,5851]],"properties":{"id":"24661919","dp":2671,"de":1380}},{"type":"Polygon","arcs":[[5852,-5852,5853,5854,5855]],"properties":{"id":"24661920","dp":2496,"de":1621}},{"type":"Polygon","arcs":[[5856,-5856,5857,5858,5859]],"properties":{"id":"24661921","dp":2077,"de":837}},{"type":"Polygon","arcs":[[-5312,5860,-5860,5861,5862,5863,5864,5865]],"properties":{"id":"24661922","dp":3886,"de":1209}},{"type":"Polygon","arcs":[[5866,5867,-5186,5868,-5469,-5473]],"properties":{"id":"24662322","dp":2640,"de":0}},{"type":"Polygon","arcs":[[-5185,5869,5870,5871,5872,5873,5874,-5869]],"properties":{"id":"24662323","dp":4678,"de":0}},{"type":"Polygon","arcs":[[-5872,5875,5876]],"properties":{"id":"24662324","dp":4533,"de":0}},{"type":"Polygon","arcs":[[-5871,5877,-5164,5878,-4971,-4976,5879,-5876]],"properties":{"id":"24662325","dp":3143,"de":348}},{"type":"Polygon","arcs":[[-5873,-5877,-5880,-4978,5880,5881]],"properties":{"id":"24662326","dp":3614,"de":0}},{"type":"Polygon","arcs":[[5882,-5874,-5882,5883,-5052,5884]],"properties":{"id":"24662327","dp":2698,"de":177}},{"type":"Polygon","arcs":[[5885,5886,-5779,-1489]],"properties":{"id":"24661981","dp":16081,"de":1520}},{"type":"Polygon","arcs":[[5887,-5770,-5778,-5887,5888]],"properties":{"id":"24661982","dp":15856,"de":1401}},{"type":"Polygon","arcs":[[5889,-5757,-5767,-5771,-5888,5890]],"properties":{"id":"24661983","dp":8888,"de":2923}},{"type":"Polygon","arcs":[[5891,-5891,-5889,5892,5893,5894,5895,5896,5897]],"properties":{"id":"24661984","dp":10451,"de":0}},{"type":"Polygon","arcs":[[5898,-5897]],"properties":{"id":"24661985","dp":29836,"de":0}},{"type":"Polygon","arcs":[[5899,-5898,-5899,-5896,5900,5901]],"properties":{"id":"24661986","dp":10344,"de":2323}},{"type":"Polygon","arcs":[[-5901,-5895,5902,5903]],"properties":{"id":"24661987","dp":21005,"de":2234}},{"type":"Polygon","arcs":[[-5903,-5894,5904,5905]],"properties":{"id":"24661988","dp":17865,"de":3370}},{"type":"Polygon","arcs":[[5906,-5905,-5893,-5886,-1488,5907]],"properties":{"id":"24661989","dp":16571,"de":2380}},{"type":"Polygon","arcs":[[5908,-5908,-1487,5909,5910]],"properties":{"id":"24661990","dp":12929,"de":3521}},{"type":"Polygon","arcs":[[5911,-5910,-1486,5912,5913]],"properties":{"id":"24661991","dp":16134,"de":3781}},{"type":"Polygon","arcs":[[5914,-5913,-1485,-1482,5915,5916]],"properties":{"id":"24661992","dp":16920,"de":3492}},{"type":"Polygon","arcs":[[5917,-5917,5918,5919,5920]],"properties":{"id":"24661993","dp":15101,"de":4949}},{"type":"Polygon","arcs":[[-5916,5921,-5919]],"properties":{"id":"24661994","dp":15261,"de":0}},{"type":"Polygon","arcs":[[5922,-5922,-1481,-1478,5923]],"properties":{"id":"24661995","dp":14195,"de":2545}},{"type":"Polygon","arcs":[[-5924,-1477,-1459,5924,5925]],"properties":{"id":"24661996","dp":9977,"de":0}},{"type":"Polygon","arcs":[[5926,5927,5928,5929,5930]],"properties":{"id":"24662366","dp":4026,"de":0}},{"type":"Polygon","arcs":[[-5929,5931,-4948,5932,5933,5934,5935,5936]],"properties":{"id":"24662367","dp":3485,"de":744}},{"type":"Polygon","arcs":[[-4947,-4950,5937,-5933]],"properties":{"id":"24662368","dp":3632,"de":284}},{"type":"Polygon","arcs":[[-5938,-4949,5938,5939,5940,-5934]],"properties":{"id":"24662369","dp":2238,"de":438}},{"type":"Polygon","arcs":[[5941,5942,5943,-5940]],"properties":{"id":"24662370","dp":3178,"de":317}},{"type":"Polygon","arcs":[[5944,-5062]],"properties":{"id":"24663408","dp":7381,"de":0}},{"type":"Polygon","arcs":[[-4979,-4973,5945,5946,-4958,-5063,-5945,-5061]],"properties":{"id":"24663409","dp":4978,"de":712}},{"type":"Polygon","arcs":[[-4969,5947,5948,-5946]],"properties":{"id":"24663410","dp":6406,"de":0}},{"type":"Polygon","arcs":[[-5949,5949,-4959,-5947]],"properties":{"id":"24663411","dp":4462,"de":0}},{"type":"Polygon","arcs":[[5950,-2044,-3114,-4426]],"properties":{"id":"24663412","dp":4522,"de":895}},{"type":"Polygon","arcs":[[-4425,-2060,-4424,-4427,-2058,-2045,-5951]],"properties":{"id":"24663413","dp":9115,"de":3651}},{"type":"Polygon","arcs":[[5951,5952,5953,-3511,5954,5955,-3608,-3600,-4555,-4414,-3115,-2052,-2037,-2035,-1532,5956,5957,5958,5959,5960,5961]],"properties":{"id":"24663419","dp":33,"de":2588}},{"type":"Polygon","arcs":[[5962,5963,5964,5965,5966,5967]],"properties":{"id":"24663420","dp":4244,"de":312}},{"type":"Polygon","arcs":[[-5964,5968]],"properties":{"id":"24663421","dp":4817,"de":400}},{"type":"Polygon","arcs":[[-5963,5969,5970]],"properties":{"id":"24663422","dp":4695,"de":428}},{"type":"Polygon","arcs":[[-5969,-5971,5971,-5958,5972,5973,5974,-5153,-3442,5975,5976,5977,5978,-5965]],"properties":{"id":"24663423","dp":110,"de":3086}},{"type":"Polygon","arcs":[[-5972,5979,5980,-5959]],"properties":{"id":"24663424","dp":4548,"de":989}},{"type":"Polygon","arcs":[[5981,-5960,-5981,5982,5983]],"properties":{"id":"24663425","dp":9652,"de":1159}},{"type":"Polygon","arcs":[[5984,-2210,-2303,-2301]],"properties":{"id":"24663426","dp":17381,"de":0}},{"type":"Polygon","arcs":[[-2138,-2213,-2211,-5985,-2300,-2298,-2215]],"properties":{"id":"24663428","dp":4996,"de":1087}},{"type":"Polygon","arcs":[[-5006,-5792,-1971,5985,5986,-3024,-3021,-1321]],"properties":{"id":"24663370","dp":3,"de":174}},{"type":"Polygon","arcs":[[5987,5988,-5986,-1970]],"properties":{"id":"24663371","dp":48581,"de":4391}},{"type":"Polygon","arcs":[[-1969,5989,-5988]],"properties":{"id":"24663372","dp":40918,"de":0}},{"type":"Polygon","arcs":[[-3288,-3289,-3296,-3462,-3023,-3025,-5987,-5989,-5990,-1968]],"properties":{"id":"24663373","dp":11791,"de":1515}},{"type":"Polygon","arcs":[[-4338,-4330,-3981,5990,5991]],"properties":{"id":"24663374","dp":10415,"de":1298}},{"type":"Polygon","arcs":[[5992,5993,5994,5995,5996,-4333,-5992,5997]],"properties":{"id":"24663375","dp":9598,"de":802}},{"type":"Polygon","arcs":[[5998,5999,-4347,6000,6001,-5994]],"properties":{"id":"24663376","dp":3970,"de":5338}},{"type":"Polygon","arcs":[[6002,-4343,-4348,-6000]],"properties":{"id":"24663377","dp":9555,"de":1420}},{"type":"Polygon","arcs":[[6003,-4525,-4344,-4339,-6003,-5999,-5993,6004]],"properties":{"id":"24663378","dp":4187,"de":1067}},{"type":"Polygon","arcs":[[-3972,-4530,-4526,-6004,6005]],"properties":{"id":"24663379","dp":14021,"de":0}},{"type":"Polygon","arcs":[[-6005,-5998,-5991,-3980,-6006]],"properties":{"id":"24663380","dp":5446,"de":0}},{"type":"Polygon","arcs":[[6006,6007,-2873,6008,-2116,-2122,-2125,-2311,6009]],"properties":{"id":"24663381","dp":2,"de":638}},{"type":"Polygon","arcs":[[-3108,-2542,-2545,-2551,-2555,-3428,6010,-2533,-2537,-2539]],"properties":{"id":"24663382","dp":5,"de":0}},{"type":"Polygon","arcs":[[6011,6012,6013,6014,6015,6016,-5390,-2028,-1938]],"properties":{"id":"24663383","dp":617,"de":1335}},{"type":"Polygon","arcs":[[6017,-6016,6018]],"properties":{"id":"24663384","dp":4514,"de":4583}},{"type":"Polygon","arcs":[[6019,6020,-6019,-6015,6021]],"properties":{"id":"24663385","dp":9437,"de":974}},{"type":"Polygon","arcs":[[-6021,6022,-5386,-5384,6023]],"properties":{"id":"24663386","dp":7647,"de":880}},{"type":"Polygon","arcs":[[-6024,-5389,-5391,-6017,-6018]],"properties":{"id":"24663387","dp":8240,"de":0}},{"type":"Polygon","arcs":[[6024,6025,-6023,-6020,6026]],"properties":{"id":"24663388","dp":9557,"de":766}},{"type":"Polygon","arcs":[[-6027,-6022,-6014,6027]],"properties":{"id":"24663389","dp":7300,"de":933}},{"type":"Polygon","arcs":[[6028,6029,6030,-5983,-5980,-5970,-5968,6031,6032,6033,-5995,-6002,6034]],"properties":{"id":"24663414","dp":3210,"de":1098}},{"type":"Polygon","arcs":[[-6029,6035]],"properties":{"id":"24663415","dp":8810,"de":0}},{"type":"Polygon","arcs":[[-4353,-4359,6036,-5962,6037,6038,-6030,-6036,-6035,-6001,-4346]],"properties":{"id":"24663416","dp":2317,"de":5462}},{"type":"Polygon","arcs":[[-5984,-6031,-6039,6039]],"properties":{"id":"24663417","dp":9046,"de":2798}},{"type":"Polygon","arcs":[[-5961,-5982,-6040,-6038]],"properties":{"id":"24663418","dp":10895,"de":0}},{"type":"Polygon","arcs":[[6040,-367,-5319,-5315]],"properties":{"id":"24661730","dp":16880,"de":0}},{"type":"Polygon","arcs":[[6041,-378,-371,-6041,-5314]],"properties":{"id":"24661731","dp":12441,"de":2597}},{"type":"Polygon","arcs":[[-5866,6042,-375,-6042,-5313]],"properties":{"id":"24661732","dp":16168,"de":3448}},{"type":"Polygon","arcs":[[-5865,6043,6044,-376,-6043]],"properties":{"id":"24661733","dp":17262,"de":0}},{"type":"Polygon","arcs":[[-5864,6045,6046,6047,-6044]],"properties":{"id":"24661734","dp":18052,"de":0}},{"type":"Polygon","arcs":[[6048,-6046,-5863,6049]],"properties":{"id":"24661735","dp":15244,"de":1152}},{"type":"Polygon","arcs":[[-5859,6050,6051,6052,-6050,-5862]],"properties":{"id":"24661736","dp":9780,"de":5118}},{"type":"Polygon","arcs":[[6053,-6051,-5858,-5855]],"properties":{"id":"24661737","dp":14640,"de":2877}},{"type":"Polygon","arcs":[[6054,6055,6056,6057,-6052,-6054,-5854]],"properties":{"id":"24661738","dp":10280,"de":2730}},{"type":"Polygon","arcs":[[6058,6059,-6055,-5851]],"properties":{"id":"24661739","dp":15628,"de":2428}},{"type":"Polygon","arcs":[[6060,6061,-6056,-6060]],"properties":{"id":"24661740","dp":12657,"de":1571}},{"type":"Polygon","arcs":[[6062,6063,-6061,6064]],"properties":{"id":"24661741","dp":17597,"de":0}},{"type":"Polygon","arcs":[[6065,-6065,-6059,-5850]],"properties":{"id":"24661742","dp":14510,"de":3115}},{"type":"Polygon","arcs":[[6066,6067,-6066,-5849]],"properties":{"id":"24661743","dp":15205,"de":74531}},{"type":"Polygon","arcs":[[6068,6069,-6067,-5848]],"properties":{"id":"24661744","dp":16950,"de":3571}},{"type":"Polygon","arcs":[[6070,6071,-6069,-5845]],"properties":{"id":"24661745","dp":16925,"de":1766}},{"type":"Polygon","arcs":[[6072,6073,6074,-6072]],"properties":{"id":"24661746","dp":20318,"de":1724}},{"type":"Polygon","arcs":[[-5841,6075,6076,-6073,-6071,-5844]],"properties":{"id":"24661747","dp":16655,"de":1535}},{"type":"Polygon","arcs":[[6077,6078,6079,6080,6081,6082,-6074,-6077,6083]],"properties":{"id":"24661748","dp":11237,"de":3669}},{"type":"Polygon","arcs":[[6084,6085,-6084,-6076,-5840]],"properties":{"id":"24661749","dp":17024,"de":0}},{"type":"Polygon","arcs":[[6086,6087,6088,-6078,-6086]],"properties":{"id":"24661750","dp":13285,"de":0}},{"type":"Polygon","arcs":[[-6085,-5839,-403,6089,-6087]],"properties":{"id":"24661751","dp":2890,"de":2701}},{"type":"Polygon","arcs":[[6090,6091,6092,-6088,-6090]],"properties":{"id":"24661752","dp":8127,"de":3802}},{"type":"Polygon","arcs":[[-6093,6093,6094,-6089]],"properties":{"id":"24661753","dp":21478,"de":0}},{"type":"Polygon","arcs":[[-6095,6095,6096,-6079]],"properties":{"id":"24661754","dp":17242,"de":2263}},{"type":"Polygon","arcs":[[-6080,-6097,6097,6098]],"properties":{"id":"24661755","dp":20180,"de":4279}},{"type":"Polygon","arcs":[[-6099,6099,6100,-6081]],"properties":{"id":"24661756","dp":18355,"de":2444}},{"type":"Polygon","arcs":[[-6101,6101,6102,-5642,-6082]],"properties":{"id":"24661757","dp":17674,"de":3386}},{"type":"MultiPolygon","arcs":[[[6103,6104,6105,6106,6107]],[[6108,6109,6110,6111]]],"properties":{"id":"24662238","dp":2261,"de":793}},{"type":"Polygon","arcs":[[-5189,-5204,6112,-5171,-5178,-5176,-5174,6113,6114]],"properties":{"id":"24663429","dp":2041,"de":2799}},{"type":"Polygon","arcs":[[-5179,-5182,6115,-5190,-6115,6116,-5183]],"properties":{"id":"24663430","dp":900,"de":1705}},{"type":"Polygon","arcs":[[-3896,6117,-3110,-1072,-3894]],"properties":{"id":"24663431","dp":5080,"de":6645}},{"type":"Polygon","arcs":[[-3111,-6118,-3903]],"properties":{"id":"24663432","dp":5280,"de":570}},{"type":"Polygon","arcs":[[-2560,6118,6119,-2961,-4585,-2973,-2971]],"properties":{"id":"24663434","dp":8464,"de":616}},{"type":"Polygon","arcs":[[6120,6121,6122,-6119,-2559,-2563]],"properties":{"id":"24663436","dp":10303,"de":1757}},{"type":"Polygon","arcs":[[6123,-2733,-2735,-2736,-2962,-6120]],"properties":{"id":"24663437","dp":9503,"de":20644}},{"type":"Polygon","arcs":[[-6124,-6123,6124,-5212,6125,6126]],"properties":{"id":"24663438","dp":6438,"de":2319}},{"type":"Polygon","arcs":[[-1201,6127,6128,-1245,-1253,-1254,-5127,-3670,6129]],"properties":{"id":"24663439","dp":625,"de":1190}},{"type":"Polygon","arcs":[[-1200,-1244,6130,6131,6132,-6128]],"properties":{"id":"24663441","dp":0,"de":2041}},{"type":"Polygon","arcs":[[-6129,6133,6134,-1248,-1246]],"properties":{"id":"24663442","dp":7644,"de":47537}},{"type":"Polygon","arcs":[[6135,6136,-6134,-6133]],"properties":{"id":"24663443","dp":9341,"de":8797}},{"type":"Polygon","arcs":[[-2967,6137,6138,6139]],"properties":{"id":"24663444","dp":23480,"de":0}},{"type":"Polygon","arcs":[[-6132,6140,-2590,-2968,-6140,-6136]],"properties":{"id":"24663445","dp":5663,"de":8789}},{"type":"Polygon","arcs":[[6141,6142,6143,-5751,6144]],"properties":{"id":"24662296","dp":2301,"de":0}},{"type":"Polygon","arcs":[[6145,6146,6147,-6142,6148]],"properties":{"id":"24662297","dp":1810,"de":391}},{"type":"Polygon","arcs":[[-6149,-6145,-5745,6149,6150]],"properties":{"id":"24662298","dp":1947,"de":0}},{"type":"Polygon","arcs":[[-6146,-6151,6151,6152,6153]],"properties":{"id":"24662299","dp":2278,"de":0}},{"type":"Polygon","arcs":[[6154,6155,-6147,-6154,6156,6157,6158,6159,6160]],"properties":{"id":"24662300","dp":1832,"de":1214}},{"type":"Polygon","arcs":[[6161,6162,-6157,-6153,6163,6164]],"properties":{"id":"24662301","dp":2556,"de":1063}},{"type":"Polygon","arcs":[[-6150,-5737,6165,-6164,-6152]],"properties":{"id":"24662302","dp":2085,"de":0}},{"type":"Polygon","arcs":[[6166,-6159,6167,6168,-6165,-6166,6169]],"properties":{"id":"24662303","dp":1580,"de":0}},{"type":"Polygon","arcs":[[-6162,-6169,6170]],"properties":{"id":"24662304","dp":2816,"de":348}},{"type":"Polygon","arcs":[[-6158,-6163,-6171,-6168]],"properties":{"id":"24662305","dp":2878,"de":384}},{"type":"Polygon","arcs":[[-5232,6171,-5230,6172,6173,-5561]],"properties":{"id":"24662311","dp":1553,"de":149}},{"type":"Polygon","arcs":[[-5229,6174,-6173]],"properties":{"id":"24662312","dp":1454,"de":1075}},{"type":"Polygon","arcs":[[-6174,-6175,-5228,-5226,-5224,-5219,6175,-6155,6176,-5558,-5562]],"properties":{"id":"24662313","dp":840,"de":142}},{"type":"Polygon","arcs":[[-5218,-5201,-5205,-4676,6177,6178,-6156,-6176]],"properties":{"id":"24662314","dp":3498,"de":0}},{"type":"Polygon","arcs":[[-6148,-6179,6179,6180]],"properties":{"id":"24662315","dp":2455,"de":527}},{"type":"Polygon","arcs":[[-6178,-4679,-5215,6181,-6180]],"properties":{"id":"24662316","dp":2888,"de":306}},{"type":"Polygon","arcs":[[-6181,-6182,-5214,6182,-6143]],"properties":{"id":"24662317","dp":2817,"de":0}},{"type":"Polygon","arcs":[[-5213,-5197,6183,-6144,-6183]],"properties":{"id":"24662318","dp":2925,"de":0}},{"type":"Polygon","arcs":[[-5752,-6184,-5192,6184,-5746,-5749]],"properties":{"id":"24662319","dp":1692,"de":360}},{"type":"Polygon","arcs":[[-6185,-5191,-6116,-5181,-5868,6185,-5479,-5475,-5747]],"properties":{"id":"24662320","dp":2385,"de":812}},{"type":"Polygon","arcs":[[-6186,-5867,-5472,-5480]],"properties":{"id":"24662321","dp":3259,"de":0}},{"type":"Polygon","arcs":[[6186,6187,6188]],"properties":{"id":"24662705","dp":41953,"de":0}},{"type":"Polygon","arcs":[[-6189,6189,6190,6191,6192]],"properties":{"id":"24662706","dp":13309,"de":1079}},{"type":"MultiPolygon","arcs":[[[6193,6194,6195,6196,6197,6198]],[[6199]],[[6200,6201,6202]],[[6203]]],"properties":{"id":"24662707","dp":1614,"de":0}},{"type":"Polygon","arcs":[[-5649,6204,6205,6206,6207]],"properties":{"id":"24661761","dp":15096,"de":5038}},{"type":"Polygon","arcs":[[6208,-5650,-6208,6209,6210,-6064]],"properties":{"id":"24661762","dp":12626,"de":4966}},{"type":"Polygon","arcs":[[-6068,-6070,-6075,-6083,-5641,-5647,-6209,-6063]],"properties":{"id":"24661763","dp":12583,"de":3149}},{"type":"Polygon","arcs":[[-6211,6211,6212,-6062]],"properties":{"id":"24661764","dp":13913,"de":7681}},{"type":"Polygon","arcs":[[-6210,-6207,6213,6214,6215,-6212]],"properties":{"id":"24661765","dp":12851,"de":21205}},{"type":"Polygon","arcs":[[-6213,-6216,6216,6217,6218,-6057]],"properties":{"id":"24661766","dp":11159,"de":8956}},{"type":"Polygon","arcs":[[-6215,6219,6220,6221,6222,-6217]],"properties":{"id":"24661767","dp":11887,"de":8657}},{"type":"Polygon","arcs":[[6223,6224,6225,-6220,-6214]],"properties":{"id":"24661768","dp":7238,"de":1791}},{"type":"Polygon","arcs":[[6226,6227,-6224,-6206]],"properties":{"id":"24661769","dp":16767,"de":0}},{"type":"Polygon","arcs":[[6228,6229,-6227,-6205,-5648,-5645]],"properties":{"id":"24661770","dp":7574,"de":2425}},{"type":"Polygon","arcs":[[-6103,6230,6231,6232,-6229,-5643]],"properties":{"id":"24661771","dp":16973,"de":2600}},{"type":"Polygon","arcs":[[-6102,6233,6234,-6231]],"properties":{"id":"24661772","dp":16303,"de":0}},{"type":"Polygon","arcs":[[6235,6236,6237,-6234,-6100,-6098,-6096]],"properties":{"id":"24661773","dp":10762,"de":1326}},{"type":"Polygon","arcs":[[6238,6239,6240,-6238]],"properties":{"id":"24661774","dp":19375,"de":0}},{"type":"Polygon","arcs":[[6241,6242,-6239,-6237]],"properties":{"id":"24661775","dp":11594,"de":1293}},{"type":"Polygon","arcs":[[6243,6244,6245,-6242,6246]],"properties":{"id":"24661776","dp":8608,"de":2355}},{"type":"Polygon","arcs":[[-6246,6247,6248,6249,6250,-6240,-6243]],"properties":{"id":"24661777","dp":6741,"de":1690}},{"type":"Polygon","arcs":[[6251,6252,-6248,-6245,6253]],"properties":{"id":"24661778","dp":8116,"de":4743}},{"type":"Polygon","arcs":[[-6254,-6244,6254,6255]],"properties":{"id":"24661779","dp":6321,"de":2008}},{"type":"Polygon","arcs":[[6256,6257,-6256,6258]],"properties":{"id":"24661780","dp":9661,"de":1224}},{"type":"Polygon","arcs":[[6259,-6259,6260,6261,6262]],"properties":{"id":"24661781","dp":9341,"de":1508}},{"type":"Polygon","arcs":[[-6261,-6255,-6247,-6236,-6094,-6092]],"properties":{"id":"24661782","dp":5055,"de":2746}},{"type":"Polygon","arcs":[[6263,-6262,-6091,-402]],"properties":{"id":"24661783","dp":14177,"de":1407}},{"type":"Polygon","arcs":[[-401,6264,6265,-6263,-6264]],"properties":{"id":"24661784","dp":14551,"de":1345}},{"type":"Polygon","arcs":[[6266,-6266,6267]],"properties":{"id":"24661785","dp":11036,"de":0}},{"type":"Polygon","arcs":[[-408,-5522,6268,-6268,-6265,-400]],"properties":{"id":"24661786","dp":8508,"de":2130}},{"type":"Polygon","arcs":[[-5521,-5705,6269,6270,-6269]],"properties":{"id":"24661787","dp":11700,"de":0}},{"type":"Polygon","arcs":[[-6271,6271,-6260,-6267]],"properties":{"id":"24661788","dp":14873,"de":0}},{"type":"Polygon","arcs":[[6272,6273,-6257,-6272]],"properties":{"id":"24661789","dp":15202,"de":0}},{"type":"Polygon","arcs":[[-5702,6274,-6273,-6270]],"properties":{"id":"24661790","dp":16011,"de":1123}},{"type":"Polygon","arcs":[[6275,6276,6277]],"properties":{"id":"24662255","dp":3737,"de":0}},{"type":"Polygon","arcs":[[6278,6279,6280,6281,-6278,6282]],"properties":{"id":"24662256","dp":2588,"de":430}},{"type":"Polygon","arcs":[[-5236,-5556,6283,-5559,-6177,-6161,-5351,-5338]],"properties":{"id":"24662306","dp":1249,"de":139}},{"type":"Polygon","arcs":[[-5555,-5560,-6284]],"properties":{"id":"24662307","dp":1959,"de":424}},{"type":"Polygon","arcs":[[6284,6285,6286,6287,-6194,6288,-6203,6289,6290]],"properties":{"id":"24662671","dp":2857,"de":348}},{"type":"Polygon","arcs":[[-6192,6291,6292,6293,-6291]],"properties":{"id":"24662672","dp":6882,"de":887}},{"type":"Polygon","arcs":[[6294,6295,-6292,-6191,6296]],"properties":{"id":"24662673","dp":7914,"de":1071}},{"type":"Polygon","arcs":[[6297,-6296,6298,6299]],"properties":{"id":"24662674","dp":13984,"de":957}},{"type":"Polygon","arcs":[[6300,-6293,-6298,6301,6302]],"properties":{"id":"24662675","dp":9869,"de":913}},{"type":"Polygon","arcs":[[6303,6304,6305,-6302,6306]],"properties":{"id":"24662676","dp":6731,"de":2977}},{"type":"Polygon","arcs":[[-6307,-6300,6307,6308,6309]],"properties":{"id":"24662677","dp":11051,"de":1860}},{"type":"Polygon","arcs":[[-6309,6310,6311]],"properties":{"id":"24662678","dp":11729,"de":947}},{"type":"Polygon","arcs":[[-5875,-5883,6312,-3059,-3055,-5470]],"properties":{"id":"24662328","dp":3185,"de":1033}},{"type":"Polygon","arcs":[[6313,-6313,-5885,-5056,6314]],"properties":{"id":"24662329","dp":3261,"de":438}},{"type":"Polygon","arcs":[[-3060,-6314,6315,6316]],"properties":{"id":"24662330","dp":3657,"de":1406}},{"type":"Polygon","arcs":[[-3061,-6317,6317,6318,6319,6320]],"properties":{"id":"24662331","dp":1606,"de":110}},{"type":"Polygon","arcs":[[-6316,6321,6322,6323,6324,-6318]],"properties":{"id":"24662332","dp":6775,"de":602}},{"type":"Polygon","arcs":[[-6315,-5055,6325,6326,-6322]],"properties":{"id":"24662333","dp":3983,"de":1212}},{"type":"Polygon","arcs":[[-5059,-4964,6327,-6326]],"properties":{"id":"24662334","dp":4472,"de":365}},{"type":"Polygon","arcs":[[-6327,-6328,-4967,6328,6329,6330,6331]],"properties":{"id":"24662335","dp":3950,"de":1421}},{"type":"Polygon","arcs":[[-6332,6332,6333,-6323]],"properties":{"id":"24662336","dp":9900,"de":931}},{"type":"Polygon","arcs":[[-6331,6334,-5696,6335,-6333]],"properties":{"id":"24662337","dp":7324,"de":0}},{"type":"Polygon","arcs":[[-5688,6336,6337,6338,-6324,-6334,-6336,-5699,-5692,-5690]],"properties":{"id":"24662338","dp":2305,"de":1478}},{"type":"Polygon","arcs":[[6339,6340,-6338]],"properties":{"id":"24662339","dp":4017,"de":0}},{"type":"Polygon","arcs":[[6341,-6320,6342,-6340,-6337,-5687,6343]],"properties":{"id":"24662340","dp":3325,"de":764}},{"type":"Polygon","arcs":[[-6343,-6319,-6325,-6339,-6341]],"properties":{"id":"24662341","dp":3875,"de":230}},{"type":"Polygon","arcs":[[6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,-1830]],"properties":{"id":"24662730","dp":1834,"de":2895}},{"type":"Polygon","arcs":[[-1674,6354,6355,-1387,-6354,6356,6357,-3586]],"properties":{"id":"24662731","dp":614,"de":2821}},{"type":"Polygon","arcs":[[-1680,-1681,6358,-6355]],"properties":{"id":"24662732","dp":7581,"de":0}},{"type":"Polygon","arcs":[[-1684,-1689,-1694,-1708,-1383,-6356,-6359]],"properties":{"id":"24662733","dp":9120,"de":685}},{"type":"Polygon","arcs":[[-6358,6359,6360,6361,6362,6363,-3587]],"properties":{"id":"24662734","dp":3022,"de":2329}},{"type":"Polygon","arcs":[[6364,6365,-6361]],"properties":{"id":"24662735","dp":9518,"de":0}},{"type":"Polygon","arcs":[[6366,6367,-6107,6368,6369,6370]],"properties":{"id":"24662239","dp":3567,"de":602}},{"type":"Polygon","arcs":[[6371,6372,-6369,-6106]],"properties":{"id":"24662240","dp":7881,"de":3268}},{"type":"Polygon","arcs":[[-6373,6373,6374,-6370]],"properties":{"id":"24662241","dp":3505,"de":1525}},{"type":"Polygon","arcs":[[6375,-6371,-6375,6376,6377]],"properties":{"id":"24662242","dp":3234,"de":1782}},{"type":"Polygon","arcs":[[6378,6379,6380,6381,6382,6383,-1529,6384,-6377]],"properties":{"id":"24662243","dp":1208,"de":2566}},{"type":"Polygon","arcs":[[-6374,6385,6386,6387,6388,-6379]],"properties":{"id":"24662244","dp":2557,"de":909}},{"type":"Polygon","arcs":[[-6389,6389,6390,6391,6392,-6380]],"properties":{"id":"24662245","dp":2398,"de":0}},{"type":"Polygon","arcs":[[6393,-6390,-6388,6394,-6386,-6372]],"properties":{"id":"24662246","dp":10977,"de":448}},{"type":"Polygon","arcs":[[-6387,-6395]],"properties":{"id":"24662247","dp":0,"de":0}},{"type":"Polygon","arcs":[[6395,6396,6397,-6391,-6394,-6105]],"properties":{"id":"24662248","dp":1504,"de":225}},{"type":"Polygon","arcs":[[-6279,6398,6399,6400,-6392,-6398]],"properties":{"id":"24662250","dp":1143,"de":762}},{"type":"Polygon","arcs":[[-6393,-6401,6401,6402,-6381]],"properties":{"id":"24662251","dp":2939,"de":744}},{"type":"Polygon","arcs":[[-6400,6403,6404,-6402]],"properties":{"id":"24662252","dp":3252,"de":0}},{"type":"Polygon","arcs":[[6405,-6382,-6403,-6405]],"properties":{"id":"24662253","dp":10107,"de":0}},{"type":"Polygon","arcs":[[-6283,-6277,-6383,-6406,-6404,-6399]],"properties":{"id":"24662254","dp":3446,"de":461}},{"type":"Polygon","arcs":[[6406,-4695,6407,6408,6409,6410,6411,6412]],"properties":{"id":"24662585","dp":4198,"de":409}},{"type":"Polygon","arcs":[[-6413,6413,6414,6415,6416,6417]],"properties":{"id":"24662586","dp":4531,"de":1060}},{"type":"Polygon","arcs":[[-6417,6418,6419,6420]],"properties":{"id":"24662587","dp":13375,"de":1380}},{"type":"Polygon","arcs":[[-6407,-6418,-6421,6421,6422,-4696]],"properties":{"id":"24662588","dp":8159,"de":0}},{"type":"Polygon","arcs":[[6423,-6281,6424]],"properties":{"id":"24662257","dp":3152,"de":0}},{"type":"Polygon","arcs":[[6425,-6304,-6310,-6312,6426,6427,6428,-6346]],"properties":{"id":"24662679","dp":5501,"de":2354}},{"type":"Polygon","arcs":[[-6429,6429,-6347]],"properties":{"id":"24662680","dp":9791,"de":2083}},{"type":"Polygon","arcs":[[-6428,6430,6431,-6348,-6430]],"properties":{"id":"24662681","dp":9580,"de":1904}},{"type":"Polygon","arcs":[[-6432,6432,6433,-6349]],"properties":{"id":"24662682","dp":9391,"de":2186}},{"type":"Polygon","arcs":[[6434,6435,6436,-6433]],"properties":{"id":"24662683","dp":14871,"de":0}},{"type":"Polygon","arcs":[[-6434,-6437,6437,6438,-6350]],"properties":{"id":"24662684","dp":11510,"de":0}},{"type":"Polygon","arcs":[[-6438,6439,6440,6441,6442]],"properties":{"id":"24662685","dp":10287,"de":1053}},{"type":"Polygon","arcs":[[-6440,-6436,6443,6444,6445]],"properties":{"id":"24662686","dp":12788,"de":0}},{"type":"Polygon","arcs":[[6446,6447,6448,-6446]],"properties":{"id":"24662687","dp":10598,"de":1028}},{"type":"Polygon","arcs":[[-6449,6449,6450,6451,-6441]],"properties":{"id":"24662688","dp":13352,"de":0}},{"type":"Polygon","arcs":[[-6442,-6452,6452,6453,6454,6455,6456]],"properties":{"id":"24662689","dp":5850,"de":1264}},{"type":"Polygon","arcs":[[-6451,6457,6458,6459,6460,-6453]],"properties":{"id":"24662690","dp":12312,"de":0}},{"type":"Polygon","arcs":[[-6461,6461,6462,6463,-6454]],"properties":{"id":"24662691","dp":6297,"de":749}},{"type":"Polygon","arcs":[[-6460,6464,-3571,6465,-6462]],"properties":{"id":"24662692","dp":5813,"de":1182}},{"type":"Polygon","arcs":[[6466,-3572,-6465,-6459,6467]],"properties":{"id":"24662693","dp":7787,"de":0}},{"type":"Polygon","arcs":[[6468,6469,-3573,-6467,6470]],"properties":{"id":"24662694","dp":7267,"de":910}},{"type":"Polygon","arcs":[[6471,-6471,-6468,-6458,-6450,-6448]],"properties":{"id":"24662695","dp":12815,"de":1958}},{"type":"Polygon","arcs":[[6472,6473,-6469,-6472,-6447,6474]],"properties":{"id":"24662696","dp":8731,"de":755}},{"type":"Polygon","arcs":[[6475,6476,6477,-6473,6478]],"properties":{"id":"24662697","dp":9029,"de":0}},{"type":"Polygon","arcs":[[6479,-3574,-6470,-6474,-6478]],"properties":{"id":"24662698","dp":5712,"de":6724}},{"type":"Polygon","arcs":[[6480,-3575,-6480,6481]],"properties":{"id":"24662699","dp":9426,"de":1946}},{"type":"Polygon","arcs":[[-6193,-6290,-6202,6482,-3568,6483,-6187]],"properties":{"id":"24662703","dp":7760,"de":673}},{"type":"Polygon","arcs":[[6484,-6190,-6188,-6484,-6481]],"properties":{"id":"24662704","dp":18992,"de":1162}},{"type":"Polygon","arcs":[[6485,-4995,-237,-2863]],"properties":{"id":"24661348","dp":9008,"de":969}},{"type":"Polygon","arcs":[[-4989,-6486,-2864,6486,6487]],"properties":{"id":"24661349","dp":6533,"de":0}},{"type":"Polygon","arcs":[[-4990,-6488,6488,6489]],"properties":{"id":"24661350","dp":7350,"de":964}},{"type":"Polygon","arcs":[[-6489,-6487,-2862,6490,6491]],"properties":{"id":"24661351","dp":13397,"de":3406}},{"type":"Polygon","arcs":[[6492,6493,-6195,-6288,6494]],"properties":{"id":"24662708","dp":12607,"de":1745}},{"type":"Polygon","arcs":[[-6297,-6485,-6482,-6477,6495]],"properties":{"id":"24662709","dp":6141,"de":964}},{"type":"Polygon","arcs":[[-6295,-6496,-6476,6496,6497]],"properties":{"id":"24662710","dp":8015,"de":591}},{"type":"Polygon","arcs":[[6498,-6497,-6479,-6475,-6445,6499]],"properties":{"id":"24662711","dp":6504,"de":0}},{"type":"Polygon","arcs":[[-6299,-6498,-6499,6500,-6311,-6308]],"properties":{"id":"24662712","dp":6907,"de":488}},{"type":"Polygon","arcs":[[-6427,-6501,-6500,-6444,-6435,-6431]],"properties":{"id":"24662713","dp":7611,"de":830}},{"type":"Polygon","arcs":[[6501,6502,6503,-3570,6504,6505,6506]],"properties":{"id":"24662714","dp":4649,"de":584}},{"type":"Polygon","arcs":[[-6466,-6504,6507,6508,6509]],"properties":{"id":"24662715","dp":5495,"de":0}},{"type":"Polygon","arcs":[[6510,-6508,-6503,6511,6512]],"properties":{"id":"24662716","dp":9445,"de":2103}},{"type":"Polygon","arcs":[[6513,6514,6515,6516,-6511,6517,6518]],"properties":{"id":"24662717","dp":7157,"de":2793}},{"type":"Polygon","arcs":[[-6517,6519,6520,-6509]],"properties":{"id":"24662718","dp":23720,"de":0}},{"type":"Polygon","arcs":[[-6463,-6510,-6521,6521]],"properties":{"id":"24662719","dp":18764,"de":0}},{"type":"Polygon","arcs":[[-6464,-6522,-6520,-6516,6522]],"properties":{"id":"24662720","dp":7496,"de":2034}},{"type":"Polygon","arcs":[[-6455,-6523,6523,6524]],"properties":{"id":"24662721","dp":6829,"de":2325}},{"type":"Polygon","arcs":[[6525,-6456,-6525,6526,6527,6528]],"properties":{"id":"24662722","dp":8355,"de":2088}},{"type":"Polygon","arcs":[[6529,-6527,6530,6531,6532]],"properties":{"id":"24662723","dp":10122,"de":1573}},{"type":"Polygon","arcs":[[6533,6534,-6528,-6530,6535]],"properties":{"id":"24662724","dp":8763,"de":0}},{"type":"Polygon","arcs":[[-6353,6536,6537,-6536,-6533,6538,6539,-6360,-6357]],"properties":{"id":"24662725","dp":2056,"de":2765}},{"type":"Polygon","arcs":[[6540,-6534,-6538]],"properties":{"id":"24662726","dp":8689,"de":3564}},{"type":"Polygon","arcs":[[-6535,-6541,-6537,-6352,6541,6542,-6529]],"properties":{"id":"24662727","dp":5662,"de":3899}},{"type":"Polygon","arcs":[[-6439,6543,-6542,-6351]],"properties":{"id":"24662728","dp":11821,"de":5000}},{"type":"Polygon","arcs":[[-6443,-6457,-6526,-6543,-6544]],"properties":{"id":"24662729","dp":9927,"de":1989}},{"type":"Polygon","arcs":[[-5081,-5021,6544,6545,6546,-4786]],"properties":{"id":"24661383","dp":15167,"de":14087}},{"type":"Polygon","arcs":[[6547,-6546,6548,6549]],"properties":{"id":"24661384","dp":19614,"de":4958}},{"type":"Polygon","arcs":[[6550,6551,6552,-6550,6553,6554]],"properties":{"id":"24661385","dp":9100,"de":2507}},{"type":"Polygon","arcs":[[6555,-4871,-4714,-4867,6556,-6552]],"properties":{"id":"24661386","dp":5555,"de":3917}},{"type":"Polygon","arcs":[[-4869,6557,-6553,-6557]],"properties":{"id":"24661387","dp":18056,"de":0}},{"type":"Polygon","arcs":[[6558,6559,-6548,-6558]],"properties":{"id":"24661388","dp":17000,"de":3269}},{"type":"Polygon","arcs":[[6560,-6547,-6560,-4736]],"properties":{"id":"24661389","dp":14501,"de":9965}},{"type":"Polygon","arcs":[[-4743,6561,-4784,-6561]],"properties":{"id":"24661390","dp":15266,"de":12099}},{"type":"Polygon","arcs":[[-4744,6562,-4782,-6562]],"properties":{"id":"24661391","dp":21659,"de":4148}},{"type":"Polygon","arcs":[[-4748,-4754,-4779,-6563]],"properties":{"id":"24661392","dp":19071,"de":5696}},{"type":"Polygon","arcs":[[-4735,-4737,-6559,-4868]],"properties":{"id":"24661393","dp":24794,"de":3082}},{"type":"Polygon","arcs":[[-6280,-6397,6563,-5359,6564,6565,-6425]],"properties":{"id":"24662258","dp":1732,"de":233}},{"type":"Polygon","arcs":[[-6282,-6424,-6566,6566,6567,6568,-1515,-1523,-1530,-6384,-6276]],"properties":{"id":"24662259","dp":1941,"de":140}},{"type":"Polygon","arcs":[[-6565,6569,-6567]],"properties":{"id":"24662260","dp":3077,"de":1065}},{"type":"Polygon","arcs":[[-6570,-5363,6570,-6568]],"properties":{"id":"24662261","dp":6716,"de":1198}},{"type":"Polygon","arcs":[[-5362,-5357,-5354,-3066,-1508,-6569,-6571]],"properties":{"id":"24662262","dp":1256,"de":114}},{"type":"Polygon","arcs":[[-1503,-1510,-3065,6571,6572,6573]],"properties":{"id":"24662263","dp":1981,"de":926}},{"type":"Polygon","arcs":[[-3076,6574,6575,-6572,-3064]],"properties":{"id":"24662264","dp":2928,"de":0}},{"type":"Polygon","arcs":[[-6575,-3074,6576,6577]],"properties":{"id":"24662265","dp":2289,"de":357}},{"type":"Polygon","arcs":[[6578,6579,-6573,-6576,-6578,6580,6581]],"properties":{"id":"24662266","dp":1534,"de":696}},{"type":"Polygon","arcs":[[-6581,-6577,-3073,6582,6583,6584,6585,6586]],"properties":{"id":"24662267","dp":1532,"de":188}},{"type":"Polygon","arcs":[[-6579,6587,6588,6589]],"properties":{"id":"24662268","dp":2975,"de":0}},{"type":"Polygon","arcs":[[6590,-6586,6591,6592,-5393]],"properties":{"id":"24662269","dp":5171,"de":199}},{"type":"Polygon","arcs":[[-6593,6593,6594,-5394]],"properties":{"id":"24662270","dp":4907,"de":0}},{"type":"Polygon","arcs":[[-4859,-529,6595,-4848]],"properties":{"id":"24662614","dp":9881,"de":0}},{"type":"Polygon","arcs":[[-4888,-4825,-4842,-6596,-528,-532,-535,6596,-6408,-4694,-4886,-4884]],"properties":{"id":"24662615","dp":1551,"de":3919}},{"type":"Polygon","arcs":[[6597,6598,-6365,-6540]],"properties":{"id":"24662736","dp":13797,"de":0}},{"type":"Polygon","arcs":[[6599,6600,6601,-6599]],"properties":{"id":"24662737","dp":9680,"de":1600}},{"type":"Polygon","arcs":[[-6602,6602,6603,-6362,-6366]],"properties":{"id":"24662738","dp":8241,"de":0}},{"type":"Polygon","arcs":[[-6492,6604,6605,6606,-4720,-4724,6607,6608]],"properties":{"id":"24661352","dp":3119,"de":1795}},{"type":"Polygon","arcs":[[-6490,-6609,6609,6610]],"properties":{"id":"24661353","dp":18231,"de":3231}},{"type":"Polygon","arcs":[[-6610,-6608,-4723,6611]],"properties":{"id":"24661354","dp":19464,"de":5351}},{"type":"Polygon","arcs":[[-4991,-6611,-6612,6612,-4882]],"properties":{"id":"24661355","dp":6644,"de":6469}},{"type":"Polygon","arcs":[[-6613,-4725,-4689,6613]],"properties":{"id":"24661356","dp":9520,"de":2309}},{"type":"Polygon","arcs":[[-4883,-6614,-4688,-4874]],"properties":{"id":"24661357","dp":13662,"de":1298}},{"type":"Polygon","arcs":[[-5884,-5881,-4981,-5060,-5053]],"properties":{"id":"24663083","dp":3712,"de":0}},{"type":"Polygon","arcs":[[6614,6615,6616,6617,-6603]],"properties":{"id":"24662739","dp":6662,"de":1395}},{"type":"Polygon","arcs":[[-6618,6618,6619,6620,6621]],"properties":{"id":"24662740","dp":10030,"de":1739}},{"type":"Polygon","arcs":[[6622,6623,6624,6625,-6619,-6617]],"properties":{"id":"24662741","dp":10694,"de":0}},{"type":"Polygon","arcs":[[-6626,6626,6627,6628,-6620]],"properties":{"id":"24662742","dp":11025,"de":870}},{"type":"Polygon","arcs":[[-6628,6629,6630,6631,6632]],"properties":{"id":"24662743","dp":15439,"de":0}},{"type":"Polygon","arcs":[[6633,-6621,-6629,-6633,6634,6635]],"properties":{"id":"24662744","dp":9313,"de":1991}},{"type":"Polygon","arcs":[[6636,-6636,6637]],"properties":{"id":"24662745","dp":13688,"de":825}},{"type":"Polygon","arcs":[[6638,-6638,-6635,-6632,6639,6640]],"properties":{"id":"24662746","dp":7690,"de":3548}},{"type":"Polygon","arcs":[[-6631,6641,6642,6643,-6640]],"properties":{"id":"24662747","dp":22567,"de":1234}},{"type":"Polygon","arcs":[[6644,6645,6646,6647,-6643]],"properties":{"id":"24662748","dp":11504,"de":0}},{"type":"Polygon","arcs":[[6648,6649,6650,-6644,-6648,6651,6652,6653]],"properties":{"id":"24662749","dp":10243,"de":6707}},{"type":"Polygon","arcs":[[-6654,6654,6655,6656,6657]],"properties":{"id":"24662750","dp":12246,"de":0}},{"type":"Polygon","arcs":[[-6649,-6658,6658,6659,6660]],"properties":{"id":"24662751","dp":13468,"de":0}},{"type":"Polygon","arcs":[[-6657,6661,6662,-6659]],"properties":{"id":"24662752","dp":12830,"de":0}},{"type":"Polygon","arcs":[[6663,6664,6665,-6660,-6663,6666,6667,6668]],"properties":{"id":"24662753","dp":4003,"de":2306}},{"type":"Polygon","arcs":[[-6669,6669,6670,6671,6672,6673,6674]],"properties":{"id":"24662754","dp":12857,"de":0}},{"type":"Polygon","arcs":[[6675,-6672,6676,6677]],"properties":{"id":"24662755","dp":12687,"de":0}},{"type":"Polygon","arcs":[[-6673,-6676,6678,6679,6680]],"properties":{"id":"24662756","dp":18873,"de":0}},{"type":"Polygon","arcs":[[6681,-6674,-6681,6682,6683]],"properties":{"id":"24662757","dp":15235,"de":0}},{"type":"Polygon","arcs":[[6684,-6664,-6675,-6682,6685]],"properties":{"id":"24662758","dp":13365,"de":1282}},{"type":"Polygon","arcs":[[6686,-6686,6687]],"properties":{"id":"24662759","dp":10279,"de":0}},{"type":"Polygon","arcs":[[-6688,-6684,6688,6689,6690]],"properties":{"id":"24662760","dp":17013,"de":767}},{"type":"Polygon","arcs":[[-6689,6691]],"properties":{"id":"24662761","dp":22232,"de":0}},{"type":"Polygon","arcs":[[6692,6693,-5023,-5080,-5083,6694]],"properties":{"id":"24661417","dp":13624,"de":7969}},{"type":"Polygon","arcs":[[-5794,6695,-5024,-6694]],"properties":{"id":"24661418","dp":14488,"de":4444}},{"type":"Polygon","arcs":[[-5020,-5025,-6696,-5793,-5013]],"properties":{"id":"24661419","dp":30000,"de":0}},{"type":"Polygon","arcs":[[-5082,6696,6697,-6695]],"properties":{"id":"24661420","dp":16448,"de":3877}},{"type":"Polygon","arcs":[[-5084,6698,6699,-6697]],"properties":{"id":"24661421","dp":17083,"de":3030}},{"type":"Polygon","arcs":[[-6699,-5074,6700,6701]],"properties":{"id":"24661422","dp":12876,"de":24315}},{"type":"Polygon","arcs":[[6702,-6701,-5069,6703,6704]],"properties":{"id":"24661423","dp":19588,"de":9264}},{"type":"Polygon","arcs":[[-6704,-5068,6705]],"properties":{"id":"24661424","dp":16603,"de":1904}},{"type":"Polygon","arcs":[[-6705,-6706,-5064,-5482,6706,-5483,6707,6708,6709]],"properties":{"id":"24661425","dp":10108,"de":8276}},{"type":"Polygon","arcs":[[6710,6711,6712,6713,6714]],"properties":{"id":"24662858","dp":6699,"de":1150}},{"type":"Polygon","arcs":[[-6714,6715,6716,6717]],"properties":{"id":"24662859","dp":6916,"de":967}},{"type":"Polygon","arcs":[[-6713,6718,6719,6720,6721,-6716]],"properties":{"id":"24662860","dp":8429,"de":0}},{"type":"Polygon","arcs":[[6722,-2095,-2099,6723,-6719]],"properties":{"id":"24662861","dp":5689,"de":438}},{"type":"Polygon","arcs":[[-2098,6724,6725,-6720,-6724]],"properties":{"id":"24662862","dp":4585,"de":308}},{"type":"Polygon","arcs":[[-2102,6726,6727,6728,-6725]],"properties":{"id":"24662863","dp":13131,"de":0}},{"type":"Polygon","arcs":[[-6726,-6729,6729,6730,-6721]],"properties":{"id":"24662864","dp":7819,"de":0}},{"type":"Polygon","arcs":[[6731,6732,6733,6734,-6730]],"properties":{"id":"24662865","dp":5207,"de":0}},{"type":"Polygon","arcs":[[6735,6736,-6733]],"properties":{"id":"24662866","dp":4979,"de":0}},{"type":"Polygon","arcs":[[-6728,6737,6738,6739,-6736,-6732]],"properties":{"id":"24662867","dp":4831,"de":0}},{"type":"Polygon","arcs":[[6740,-6739,6741]],"properties":{"id":"24662868","dp":3710,"de":0}},{"type":"Polygon","arcs":[[6742,6743,-5257,6744]],"properties":{"id":"24663113","dp":1103,"de":305}},{"type":"Polygon","arcs":[[-2072,-2083,6745,6746,6747,-868,-2069]],"properties":{"id":"24662830","dp":4737,"de":0}},{"type":"Polygon","arcs":[[6748,-6747,6749,6750]],"properties":{"id":"24662831","dp":5663,"de":0}},{"type":"Polygon","arcs":[[6751,-6751,6752,6753]],"properties":{"id":"24662832","dp":5790,"de":0}},{"type":"Polygon","arcs":[[6754,-6753,-6750,-6746,6755,6756]],"properties":{"id":"24662833","dp":8438,"de":0}},{"type":"Polygon","arcs":[[-2082,-2085,6757,6758,-6756]],"properties":{"id":"24662834","dp":13589,"de":0}},{"type":"Polygon","arcs":[[6759,-6757,-6759,6760,6761,6762]],"properties":{"id":"24662835","dp":6318,"de":803}},{"type":"Polygon","arcs":[[-6727,-2101,-2066,6763,-6742,-6738]],"properties":{"id":"24662869","dp":2880,"de":2304}},{"type":"Polygon","arcs":[[-2065,-2070,-873,6764,-888,-6734,-6737,-6740,-6741,-6764]],"properties":{"id":"24662870","dp":2654,"de":333}},{"type":"Polygon","arcs":[[6765,6766,6767,6768]],"properties":{"id":"24661557","dp":13272,"de":0}},{"type":"Polygon","arcs":[[6769,6770,6771,-6767]],"properties":{"id":"24661558","dp":24042,"de":2836}},{"type":"Polygon","arcs":[[6772,6773,-6771,6774]],"properties":{"id":"24661559","dp":24840,"de":0}},{"type":"Polygon","arcs":[[-6772,6775,6776,6777,6778,-6768]],"properties":{"id":"24661560","dp":18750,"de":2138}},{"type":"Polygon","arcs":[[6779,6780,-6777]],"properties":{"id":"24661561","dp":25255,"de":0}},{"type":"Polygon","arcs":[[6781,-6778,-6781,6782]],"properties":{"id":"24661562","dp":29653,"de":0}},{"type":"Polygon","arcs":[[6783,-6782,6784,6785,-5563,6786,6787,6788]],"properties":{"id":"24661563","dp":18218,"de":0}},{"type":"Polygon","arcs":[[6789,6790,-6785,-6783,-6780]],"properties":{"id":"24661564","dp":32313,"de":2313}},{"type":"Polygon","arcs":[[-6774,6791,-6790,-6776]],"properties":{"id":"24661566","dp":48333,"de":0}},{"type":"Polygon","arcs":[[6792,6793,6794,6795,6796,6797,6798,-3551,-5564,-6786,-6791,-6792,-6773]],"properties":{"id":"24661567","dp":1490,"de":5112}},{"type":"Polygon","arcs":[[6799,-6798,6800,6801]],"properties":{"id":"24661568","dp":2638,"de":303}},{"type":"Polygon","arcs":[[6802,-6801,-6797,6803]],"properties":{"id":"24661569","dp":2676,"de":254}},{"type":"Polygon","arcs":[[6804,6805,6806,6807,6808,6809,6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820]],"properties":{"id":"24662942","dp":540,"de":977}},{"type":"Polygon","arcs":[[6821,6822,6823,-6811]],"properties":{"id":"24662943","dp":5099,"de":0}},{"type":"Polygon","arcs":[[6824,6825,-6812,-6824]],"properties":{"id":"24662944","dp":5075,"de":0}},{"type":"Polygon","arcs":[[-6826,-6813]],"properties":{"id":"24662945","dp":7296,"de":0}},{"type":"Polygon","arcs":[[-6823,6826,6827,6828,-6814,-6825]],"properties":{"id":"24662946","dp":5824,"de":0}},{"type":"Polygon","arcs":[[-909,-890,6829,6830,-6828,6831]],"properties":{"id":"24662947","dp":2837,"de":439}},{"type":"Polygon","arcs":[[6832,6833,6834,-1466]],"properties":{"id":"24661672","dp":11859,"de":2743}},{"type":"Polygon","arcs":[[6835,-5436]],"properties":{"id":"24663161","dp":3638,"de":0}},{"type":"Polygon","arcs":[[-6836,-5435]],"properties":{"id":"24663162","dp":3481,"de":0}},{"type":"Polygon","arcs":[[-5656,-5664,6836,6837,6838,-5631,-5639,-5439]],"properties":{"id":"24663050","dp":1456,"de":2365}},{"type":"Polygon","arcs":[[-6839,6839,6840,-5618,-5632]],"properties":{"id":"24663051","dp":4317,"de":469}},{"type":"Polygon","arcs":[[-6841,6841,-5619]],"properties":{"id":"24663052","dp":2500,"de":0}},{"type":"MultiPolygon","arcs":[[[-6840,-6838,6842,6843,-5609,-5620,-6842]],[[6844]]],"properties":{"id":"24663053","dp":4247,"de":273}},{"type":"Polygon","arcs":[[6845,6846,-6623,-6616]],"properties":{"id":"24662802","dp":9247,"de":0}},{"type":"Polygon","arcs":[[6847,6848,6849,-6624,-6847]],"properties":{"id":"24662803","dp":9469,"de":0}},{"type":"Polygon","arcs":[[6850,-6514,6851,6852,-6615,-6601]],"properties":{"id":"24662804","dp":8281,"de":1615}},{"type":"Polygon","arcs":[[-6524,-6515,-6851,-6600,6853,-6531]],"properties":{"id":"24662805","dp":6032,"de":2526}},{"type":"Polygon","arcs":[[-6532,-6854,-6598,-6539]],"properties":{"id":"24662806","dp":14884,"de":1156}},{"type":"Polygon","arcs":[[6854,6855,6856,6857,6858,6859]],"properties":{"id":"24662807","dp":4530,"de":729}},{"type":"Polygon","arcs":[[6860,6861,6862,6863,-6860]],"properties":{"id":"24662808","dp":6016,"de":0}},{"type":"Polygon","arcs":[[6864,-6861,-6859,6865,6866]],"properties":{"id":"24662809","dp":3980,"de":717}},{"type":"Polygon","arcs":[[6867,-6866,6868,6869,6870]],"properties":{"id":"24662810","dp":3325,"de":1836}},{"type":"Polygon","arcs":[[-6870,6871,6872,6873]],"properties":{"id":"24662811","dp":6633,"de":685}},{"type":"Polygon","arcs":[[-6873,6874,6875,6876]],"properties":{"id":"24662812","dp":5492,"de":2710}},{"type":"Polygon","arcs":[[-6876,6877,-3560,6878,6879]],"properties":{"id":"24662813","dp":12181,"de":3454}},{"type":"Polygon","arcs":[[6880,-6877,-6880,6881,6882]],"properties":{"id":"24662814","dp":19191,"de":0}},{"type":"Polygon","arcs":[[6883,-6883,6884,6885,6886,6887,6888]],"properties":{"id":"24662815","dp":23152,"de":0}},{"type":"Polygon","arcs":[[6889,6890,6891,-6885,6892]],"properties":{"id":"24662816","dp":18819,"de":0}},{"type":"Polygon","arcs":[[6893,-6893,-6882,-6879,-3563,-3580]],"properties":{"id":"24662817","dp":3026,"de":2098}},{"type":"Polygon","arcs":[[-6858,6894,6895,-3561,-6878,-6875,-6872,-6869]],"properties":{"id":"24662819","dp":8716,"de":591}},{"type":"MultiPolygon","arcs":[[[-883,6896,6897,6898,-6896,6899,-871,-878]],[[6900]],[[6901]]],"properties":{"id":"24662821","dp":5191,"de":857}},{"type":"Polygon","arcs":[[6902,6903,-4241,6904,6905]],"properties":{"id":"24661485","dp":7704,"de":1130}},{"type":"Polygon","arcs":[[-3183,-2294,-6905,-4245,-1903,-3190]],"properties":{"id":"24661486","dp":12156,"de":3317}},{"type":"Polygon","arcs":[[6906,6907,-4242,-6904]],"properties":{"id":"24661487","dp":18454,"de":0}},{"type":"Polygon","arcs":[[6908,-6907,6909]],"properties":{"id":"24661488","dp":9503,"de":793}},{"type":"Polygon","arcs":[[6910,6911,-4259,-4251,-4250,-4246,-4243,-6908,-6909]],"properties":{"id":"24661489","dp":7408,"de":0}},{"type":"Polygon","arcs":[[6912,-4256,-6912,6913,6914]],"properties":{"id":"24661490","dp":11955,"de":0}},{"type":"Polygon","arcs":[[6915,-4262,-6913,6916]],"properties":{"id":"24661491","dp":5716,"de":1286}},{"type":"Polygon","arcs":[[6917,6918,-4270,-6916]],"properties":{"id":"24661492","dp":14933,"de":3833}},{"type":"Polygon","arcs":[[6919,-6762,6920,6921]],"properties":{"id":"24662836","dp":7163,"de":1242}},{"type":"Polygon","arcs":[[6922,-6763,-6920,6923]],"properties":{"id":"24662837","dp":6030,"de":0}},{"type":"Polygon","arcs":[[6924,6925,-6924]],"properties":{"id":"24662838","dp":3175,"de":0}},{"type":"Polygon","arcs":[[-3576,6926,6927,-6925,-6922,6928,6929]],"properties":{"id":"24662839","dp":1409,"de":1983}},{"type":"Polygon","arcs":[[6930,6931,6932,-6927]],"properties":{"id":"24662840","dp":9553,"de":0}},{"type":"Polygon","arcs":[[6933,6934,-6928,-6933,6935,6936,6937]],"properties":{"id":"24662841","dp":4500,"de":1416}},{"type":"Polygon","arcs":[[-6934,6938,6939]],"properties":{"id":"24662842","dp":9608,"de":0}},{"type":"Polygon","arcs":[[-6754,-6755,-6760,-6923,-6926,-6935,-6940,6940]],"properties":{"id":"24662843","dp":3677,"de":1180}},{"type":"Polygon","arcs":[[-6936,-6932,6941,6942,6943]],"properties":{"id":"24662844","dp":3318,"de":0}},{"type":"Polygon","arcs":[[6944,-6942,-6931,-3584]],"properties":{"id":"24662845","dp":5077,"de":0}},{"type":"Polygon","arcs":[[-3562,-6899,6945,-3581]],"properties":{"id":"24662848","dp":7466,"de":0}},{"type":"Polygon","arcs":[[6946,6947,6948,6949]],"properties":{"id":"24661519","dp":14224,"de":4176}},{"type":"Polygon","arcs":[[6950,6951,6952,6953,6954,-6947]],"properties":{"id":"24661520","dp":8110,"de":5381}},{"type":"Polygon","arcs":[[-3686,-4307,6955,6956,6957,-6948,-6955,6958]],"properties":{"id":"24661521","dp":7769,"de":14124}},{"type":"Polygon","arcs":[[6959,6960,-3390,-3687,-6959,6961]],"properties":{"id":"24661522","dp":9824,"de":6955}},{"type":"Polygon","arcs":[[6962,6963,6964,-6960,6965]],"properties":{"id":"24661523","dp":20044,"de":13053}},{"type":"Polygon","arcs":[[6966,6967,6968,6969,-6964,6970]],"properties":{"id":"24661524","dp":14770,"de":5045}},{"type":"Polygon","arcs":[[6971,6972,6973,6974,6975,-6968,6976,6977]],"properties":{"id":"24661525","dp":16561,"de":4731}},{"type":"Polygon","arcs":[[6978,6979,-6977,6980]],"properties":{"id":"24661526","dp":19583,"de":2604}},{"type":"Polygon","arcs":[[6981,6982,-6978,-6980]],"properties":{"id":"24661527","dp":21813,"de":0}},{"type":"Polygon","arcs":[[6983,6984,-6972,-6983]],"properties":{"id":"24661528","dp":27283,"de":2890}},{"type":"Polygon","arcs":[[6985,6986,-6985]],"properties":{"id":"24661529","dp":24125,"de":5312}},{"type":"Polygon","arcs":[[-6607,6987,6988,-6986,-6984,-6982,-6979,6989,-4721]],"properties":{"id":"24661530","dp":6718,"de":3696}},{"type":"Polygon","arcs":[[6990,6991,6992,-6973,-6987,-6989]],"properties":{"id":"24661531","dp":20208,"de":5555}},{"type":"Polygon","arcs":[[6993,6994,-3783,6995]],"properties":{"id":"24662928","dp":4422,"de":402}},{"type":"Polygon","arcs":[[6996,6997,-6994,6998,6999,7000]],"properties":{"id":"24662929","dp":3719,"de":5212}},{"type":"Polygon","arcs":[[-6995,-6998,7001,7002,-3778]],"properties":{"id":"24662930","dp":4861,"de":0}},{"type":"Polygon","arcs":[[-3779,-7003,7003,7004]],"properties":{"id":"24662931","dp":3678,"de":0}},{"type":"Polygon","arcs":[[-3657,-7005,7005,-3636,-3641,-3654]],"properties":{"id":"24662932","dp":6625,"de":0}},{"type":"Polygon","arcs":[[-6835,7006,-2256,7007,7008,7009]],"properties":{"id":"24661673","dp":15104,"de":2022}},{"type":"Polygon","arcs":[[7010,-7008,-2259,-2253,7011,-1390]],"properties":{"id":"24661674","dp":12972,"de":1380}},{"type":"Polygon","arcs":[[-1391,-7012,-3585,7012]],"properties":{"id":"24661675","dp":11932,"de":0}},{"type":"Polygon","arcs":[[-1440,-7013,-2250,7013]],"properties":{"id":"24661676","dp":18614,"de":2164}},{"type":"Polygon","arcs":[[-1441,-7014,-2252,7014]],"properties":{"id":"24661677","dp":17160,"de":0}},{"type":"Polygon","arcs":[[-1442,-7015,-2245,7015]],"properties":{"id":"24661678","dp":7049,"de":0}},{"type":"Polygon","arcs":[[-1443,-7016,-2249,-2241,7016]],"properties":{"id":"24661679","dp":3646,"de":0}},{"type":"Polygon","arcs":[[-7017,-2244,7017,-1445]],"properties":{"id":"24661680","dp":13592,"de":1219}},{"type":"Polygon","arcs":[[-7018,7018,7019,-1448]],"properties":{"id":"24661681","dp":11264,"de":1340}},{"type":"Polygon","arcs":[[-7020,7020,-1534,7021,7022]],"properties":{"id":"24661682","dp":5823,"de":608}},{"type":"Polygon","arcs":[[-1449,-7023,7023,7024]],"properties":{"id":"24661683","dp":10484,"de":2222}},{"type":"Polygon","arcs":[[-7024,-7022,7025,7026]],"properties":{"id":"24661684","dp":12403,"de":0}},{"type":"Polygon","arcs":[[-7026,-1537,7027,7028]],"properties":{"id":"24661685","dp":14946,"de":0}},{"type":"Polygon","arcs":[[-1450,-7025,-7027,-7029,7029,7030]],"properties":{"id":"24661686","dp":6037,"de":1596}},{"type":"Polygon","arcs":[[-7030,-7028,7031,7032,7033,-3491]],"properties":{"id":"24661687","dp":8422,"de":0}},{"type":"Polygon","arcs":[[-7034,7034,-1750,-3833,-3492]],"properties":{"id":"24661688","dp":3666,"de":1681}},{"type":"Polygon","arcs":[[-7033,7035,-7035]],"properties":{"id":"24661689","dp":11156,"de":0}},{"type":"Polygon","arcs":[[-1536,-1736,-1742,-1746,-7036,-7032]],"properties":{"id":"24661690","dp":4255,"de":2097}},{"type":"Polygon","arcs":[[7036,-3149,-3097,-3096,-3092,7037,-3084,-3077,-4954]],"properties":{"id":"24663054","dp":1808,"de":386}},{"type":"Polygon","arcs":[[-7038,-3094,-3087,7038,-3085]],"properties":{"id":"24663055","dp":2806,"de":0}},{"type":"Polygon","arcs":[[-3091,-3079,-3086,-7039]],"properties":{"id":"24663056","dp":3577,"de":0}},{"type":"Polygon","arcs":[[7039,7040,7041,7042,-5830]],"properties":{"id":"24661826","dp":17040,"de":3582}},{"type":"Polygon","arcs":[[-5109,7043,7044,-7042,7045]],"properties":{"id":"24661827","dp":5877,"de":1779}},{"type":"Polygon","arcs":[[-5110,-7046,-7041,7046]],"properties":{"id":"24661828","dp":14654,"de":4608}},{"type":"Polygon","arcs":[[7047,-7047,-7040,-5826,-5807,-5811,-5813]],"properties":{"id":"24661829","dp":11941,"de":5036}},{"type":"Polygon","arcs":[[7048,-5104,-5106,-7048,-5816,-5818]],"properties":{"id":"24661830","dp":13383,"de":6565}},{"type":"Polygon","arcs":[[-5492,-5486,7049,-5101,-7049,-5817]],"properties":{"id":"24661831","dp":14793,"de":3793}},{"type":"Polygon","arcs":[[7050,-5099,-7050,-5485]],"properties":{"id":"24661832","dp":19090,"de":3846}},{"type":"Polygon","arcs":[[-5484,-6707,-5481,-5100,-7051]],"properties":{"id":"24661833","dp":12399,"de":12526}},{"type":"Polygon","arcs":[[7051,7052,7053,7054,7055]],"properties":{"id":"24661457","dp":18027,"de":2916}},{"type":"Polygon","arcs":[[7056,7057,-7052]],"properties":{"id":"24661458","dp":18820,"de":3589}},{"type":"Polygon","arcs":[[7058,7059,-7058,7060]],"properties":{"id":"24661459","dp":16330,"de":4357}},{"type":"Polygon","arcs":[[7061,7062,-7053,-7060]],"properties":{"id":"24661460","dp":13878,"de":2803}},{"type":"Polygon","arcs":[[-7054,-7063,7063,7064,7065,7066]],"properties":{"id":"24661461","dp":17252,"de":2266}},{"type":"Polygon","arcs":[[7067,7068,-7066,7069]],"properties":{"id":"24661462","dp":14907,"de":2314}},{"type":"Polygon","arcs":[[-7068,7070,7071,7072,7073,7074]],"properties":{"id":"24661463","dp":11728,"de":6558}},{"type":"Polygon","arcs":[[-7074,7075,7076,7077,7078]],"properties":{"id":"24661464","dp":10497,"de":5231}},{"type":"Polygon","arcs":[[7079,7080,-7076,-7073]],"properties":{"id":"24661465","dp":12769,"de":1798}},{"type":"Polygon","arcs":[[-7081,7081,7082,7083,7084,-7077]],"properties":{"id":"24661466","dp":8604,"de":9660}},{"type":"Polygon","arcs":[[-7085,7085,7086,7087]],"properties":{"id":"24661467","dp":10199,"de":8890}},{"type":"Polygon","arcs":[[7088,7089,7090,-480,-486,-487,-497,7091,7092,7093,7094,7095,-6806,7096]],"properties":{"id":"24662905","dp":72,"de":354}},{"type":"Polygon","arcs":[[7097,7098,7099,-1400,-4665,-1396,-1405,7100,-7093]],"properties":{"id":"24662906","dp":853,"de":110}},{"type":"Polygon","arcs":[[7101,-4666,-1401,-7100]],"properties":{"id":"24662907","dp":5283,"de":0}},{"type":"Polygon","arcs":[[-683,-4664,-7102,-7099,7102]],"properties":{"id":"24662908","dp":18464,"de":0}},{"type":"Polygon","arcs":[[-3925,7103,-667,-670,-672,-676,-684,-7103,-7098,-7092,-496,-3921]],"properties":{"id":"24662909","dp":5218,"de":1097}},{"type":"Polygon","arcs":[[-656,-658,-668,-7104,-3924,-3928,-3931]],"properties":{"id":"24662910","dp":11536,"de":1696}},{"type":"Polygon","arcs":[[7104,-7089,7105,7106,7107]],"properties":{"id":"24662911","dp":1531,"de":846}},{"type":"Polygon","arcs":[[-7090,-7105,7108,7109,7110]],"properties":{"id":"24662912","dp":6269,"de":0}},{"type":"Polygon","arcs":[[-7109,7111,7112]],"properties":{"id":"24662913","dp":5594,"de":0}},{"type":"Polygon","arcs":[[7113,-7110,-7113,7114,-1159,-465,-468,-471]],"properties":{"id":"24662914","dp":4598,"de":655}},{"type":"Polygon","arcs":[[-7091,-7111,-7114,-470,-477]],"properties":{"id":"24662915","dp":6083,"de":979}},{"type":"Polygon","arcs":[[7115,7116,7117,-7115,-7112,-7108]],"properties":{"id":"24662916","dp":3201,"de":2302}},{"type":"Polygon","arcs":[[-1160,-7118,7118,7119,-1143,-1150,-1156]],"properties":{"id":"24662917","dp":3547,"de":1924}},{"type":"Polygon","arcs":[[7120,-7119,-7117,7121]],"properties":{"id":"24662918","dp":8833,"de":0}},{"type":"Polygon","arcs":[[7122,7123,7124,-4409,-3129,7125,-3559,-4492,-5573,-5566]],"properties":{"id":"24661603","dp":307,"de":4543}},{"type":"Polygon","arcs":[[-7126,-3128,7126,-3555]],"properties":{"id":"24661606","dp":27500,"de":0}},{"type":"Polygon","arcs":[[-7127,-3127,-4500,-3556]],"properties":{"id":"24661609","dp":18665,"de":0}},{"type":"Polygon","arcs":[[-4289,-3476,-4288,-595,-584,-5569]],"properties":{"id":"24661611","dp":7078,"de":5486}},{"type":"Polygon","arcs":[[7127,7128,7129,7130,-6787,-5570,-4206]],"properties":{"id":"24661614","dp":11031,"de":0}},{"type":"Polygon","arcs":[[7131,7132,-6788,-7131]],"properties":{"id":"24661615","dp":32801,"de":0}},{"type":"Polygon","arcs":[[7133,-6789,-7133]],"properties":{"id":"24661616","dp":27903,"de":3493}},{"type":"Polygon","arcs":[[7134,7135,-7130,7136]],"properties":{"id":"24661617","dp":18058,"de":0}},{"type":"Polygon","arcs":[[7137,-7137,-7129,7138]],"properties":{"id":"24661618","dp":27520,"de":1377}},{"type":"Polygon","arcs":[[-2940,-918,7139,7140,-4457]],"properties":{"id":"24661619","dp":4711,"de":1334}},{"type":"Polygon","arcs":[[-7004,-7002,7141,7142,-3635,-7006]],"properties":{"id":"24662933","dp":1588,"de":2410}},{"type":"Polygon","arcs":[[7143,7144,7145,-7143]],"properties":{"id":"24662934","dp":2106,"de":0}},{"type":"Polygon","arcs":[[7146,-1127,-3623,-3629,-3465,-3632,-7146]],"properties":{"id":"24662935","dp":982,"de":375}},{"type":"Polygon","arcs":[[7147,7148,7149,7150]],"properties":{"id":"24661636","dp":10835,"de":1284}},{"type":"Polygon","arcs":[[7151,7152,7153,-7148]],"properties":{"id":"24661637","dp":10254,"de":5090}},{"type":"Polygon","arcs":[[7154,7155,-7153,7156]],"properties":{"id":"24661638","dp":14758,"de":0}},{"type":"Polygon","arcs":[[7157,7158,7159,-7155,7160,7161]],"properties":{"id":"24661639","dp":10641,"de":2540}},{"type":"Polygon","arcs":[[7162,7163,7164,-7158,7165]],"properties":{"id":"24661640","dp":16422,"de":4743}},{"type":"Polygon","arcs":[[7166,7167,7168,-7163,7169,7170]],"properties":{"id":"24661641","dp":13275,"de":3658}},{"type":"Polygon","arcs":[[7171,7172,-7167,7173]],"properties":{"id":"24661642","dp":14177,"de":1973}},{"type":"Polygon","arcs":[[7174,7175,7176,-7172]],"properties":{"id":"24661643","dp":14590,"de":1803}},{"type":"Polygon","arcs":[[7177,7178,7179,-7176]],"properties":{"id":"24661644","dp":15390,"de":1950}},{"type":"Polygon","arcs":[[-7087,7180,-7179,7181]],"properties":{"id":"24661645","dp":19844,"de":3115}},{"type":"Polygon","arcs":[[7182,-7182,7183,7184]],"properties":{"id":"24661646","dp":11585,"de":2743}},{"type":"Polygon","arcs":[[-7078,-7088,-7183,7185]],"properties":{"id":"24661647","dp":12103,"de":5469}},{"type":"Polygon","arcs":[[7186,-7184,-7178,7187]],"properties":{"id":"24661648","dp":15555,"de":2083}},{"type":"Polygon","arcs":[[7188,-7188,-7175,7189]],"properties":{"id":"24661649","dp":13627,"de":6372}},{"type":"Polygon","arcs":[[-7190,-7174,7190,7191]],"properties":{"id":"24661650","dp":14983,"de":2786}},{"type":"Polygon","arcs":[[-7191,-7171,7192,7193]],"properties":{"id":"24661651","dp":16678,"de":1384}},{"type":"Polygon","arcs":[[-7193,-7170,7194,7195]],"properties":{"id":"24661652","dp":13893,"de":2666}},{"type":"Polygon","arcs":[[-7195,-7166,7196,7197,7198]],"properties":{"id":"24661653","dp":11914,"de":3710}},{"type":"Polygon","arcs":[[-7197,-7162,7199,7200,7201]],"properties":{"id":"24661654","dp":15430,"de":2049}},{"type":"Polygon","arcs":[[-7200,-7161,7202,7203]],"properties":{"id":"24661655","dp":15183,"de":0}},{"type":"Polygon","arcs":[[-1501,-7203,-7157,7204]],"properties":{"id":"24661656","dp":13046,"de":1562}},{"type":"Polygon","arcs":[[-7205,-7152,7205,-1497]],"properties":{"id":"24661657","dp":14362,"de":2684}},{"type":"Polygon","arcs":[[-7206,-7151,7206,-1492]],"properties":{"id":"24661658","dp":11503,"de":2534}},{"type":"Polygon","arcs":[[-7207,7207,7208,7209,-5762,-5760]],"properties":{"id":"24661659","dp":9249,"de":1657}},{"type":"Polygon","arcs":[[-7084,7210,7211,7212,-7086]],"properties":{"id":"24661468","dp":8863,"de":7410}},{"type":"Polygon","arcs":[[7213,7214,-7181,-7213]],"properties":{"id":"24661469","dp":14171,"de":4294}},{"type":"Polygon","arcs":[[-7180,-7215,7215,7216]],"properties":{"id":"24661470","dp":13006,"de":2972}},{"type":"Polygon","arcs":[[-7177,-7217,7217,7218]],"properties":{"id":"24661471","dp":12579,"de":3184}},{"type":"Polygon","arcs":[[-7219,7219,7220,-7173]],"properties":{"id":"24661472","dp":12709,"de":2580}},{"type":"Polygon","arcs":[[-7221,7221,7222,-7168]],"properties":{"id":"24661473","dp":9940,"de":6804}},{"type":"Polygon","arcs":[[-7169,-7223,7223,7224]],"properties":{"id":"24661474","dp":14274,"de":2745}},{"type":"Polygon","arcs":[[-7164,-7225,7225,7226]],"properties":{"id":"24661475","dp":13307,"de":3149}},{"type":"Polygon","arcs":[[-7165,-7227,7227,7228]],"properties":{"id":"24661476","dp":13065,"de":0}},{"type":"Polygon","arcs":[[-7229,7229,7230,7231,-7159]],"properties":{"id":"24661477","dp":14345,"de":2182}},{"type":"Polygon","arcs":[[-7232,7232,7233,-7160]],"properties":{"id":"24661478","dp":16908,"de":4389}},{"type":"Polygon","arcs":[[-7234,7234,-6918,7235,-7154,-7156]],"properties":{"id":"24661479","dp":14762,"de":1939}},{"type":"Polygon","arcs":[[-7149,-7236,-6917,7236,7237]],"properties":{"id":"24661480","dp":8243,"de":3399}},{"type":"Polygon","arcs":[[7238,-7237,-6915,7239,7240]],"properties":{"id":"24661481","dp":12135,"de":1941}},{"type":"Polygon","arcs":[[7241,-7240,-6914,-6911,7242,7243]],"properties":{"id":"24661482","dp":12693,"de":2552}},{"type":"Polygon","arcs":[[-7244,7244,7245,7246,7247]],"properties":{"id":"24661483","dp":8645,"de":1181}},{"type":"Polygon","arcs":[[-7243,-6910,-6903,-7245]],"properties":{"id":"24661484","dp":11379,"de":1819}},{"type":"Polygon","arcs":[[-5114,-5120,-5126,7248,7249,7250,-7044,-5108]],"properties":{"id":"24661966","dp":7873,"de":3232}},{"type":"Polygon","arcs":[[7251,7252,7253,7254,7255,-7251,7256,7257,7258,-7198,7259]],"properties":{"id":"24661967","dp":3177,"de":3564}},{"type":"Polygon","arcs":[[-7252,7260,7261,7262,7263]],"properties":{"id":"24661968","dp":13015,"de":2763}},{"type":"Polygon","arcs":[[7264,-7263,7265,7266,7267]],"properties":{"id":"24661969","dp":18865,"de":2835}},{"type":"Polygon","arcs":[[-7254,7268,-7268,7269,7270,7271,7272]],"properties":{"id":"24661970","dp":11617,"de":5024}},{"type":"Polygon","arcs":[[7273,-7270,-7267,-1502,-1495,-5753]],"properties":{"id":"24661971","dp":13829,"de":4255}},{"type":"Polygon","arcs":[[-6745,-5256,-5250,-5246,-5240,7274]],"properties":{"id":"24663114","dp":1217,"de":108}},{"type":"Polygon","arcs":[[7275,-5254,7276,7277,-6743,-7275,-5239,7278]],"properties":{"id":"24663115","dp":693,"de":123}},{"type":"Polygon","arcs":[[7279,7280,7281,-6414,-6412]],"properties":{"id":"24662579","dp":7222,"de":3378}},{"type":"Polygon","arcs":[[7282,7283,7284,-7280,-6411,7285]],"properties":{"id":"24662580","dp":8328,"de":3391}},{"type":"Polygon","arcs":[[-547,7286,-7283,7287]],"properties":{"id":"24662581","dp":11340,"de":1250}},{"type":"Polygon","arcs":[[-2357,7288,7289,7290,-7284,-7287]],"properties":{"id":"24662582","dp":10340,"de":2086}},{"type":"Polygon","arcs":[[-548,-7288,-7286,-6410,7291]],"properties":{"id":"24662583","dp":6255,"de":755}},{"type":"Polygon","arcs":[[-538,-7292,-6409,-6597]],"properties":{"id":"24662584","dp":9332,"de":1824}},{"type":"Polygon","arcs":[[-6364,7292,-6637,-6639,7293,7294,-1651,-3588]],"properties":{"id":"24662967","dp":1778,"de":3217}},{"type":"Polygon","arcs":[[-6363,-6604,-6622,-6634,-7293]],"properties":{"id":"24662968","dp":7128,"de":0}},{"type":"Polygon","arcs":[[-1216,7295,-1629,-1633,-1637,-1641,-1647,-1652,7296,-1624]],"properties":{"id":"24662969","dp":657,"de":2500}},{"type":"Polygon","arcs":[[-1630,-7296,-1215,-1429]],"properties":{"id":"24662970","dp":11054,"de":1318}},{"type":"Polygon","arcs":[[7297,7298,-6305,-6426,-6345,7299]],"properties":{"id":"24662971","dp":9022,"de":0}},{"type":"Polygon","arcs":[[-1828,-4920,-4922,-4924,-4925,-4927,7300,-4932,7301]],"properties":{"id":"24662972","dp":4122,"de":3140}},{"type":"Polygon","arcs":[[-7302,-4931,-7300,-1829]],"properties":{"id":"24662973","dp":6364,"de":1612}},{"type":"Polygon","arcs":[[7302,7303,7304,-7298,-4930]],"properties":{"id":"24662974","dp":9606,"de":0}},{"type":"Polygon","arcs":[[7305,7306,7307,-7304]],"properties":{"id":"24662975","dp":11605,"de":0}},{"type":"Polygon","arcs":[[-7308,7308,7309,7310,-6303,-6306,-7299,-7305]],"properties":{"id":"24662976","dp":2804,"de":0}},{"type":"Polygon","arcs":[[-7307,7311,7312,-7309]],"properties":{"id":"24662977","dp":8587,"de":0}},{"type":"Polygon","arcs":[[7313,7314,-7312,7315]],"properties":{"id":"24662978","dp":8765,"de":2839}},{"type":"Polygon","arcs":[[7316,7317,-7316,-7306,-7303,-4935,-4940]],"properties":{"id":"24662979","dp":5790,"de":604}},{"type":"Polygon","arcs":[[7318,7319,-4892,-4896,-4117,-4118]],"properties":{"id":"24662980","dp":13309,"de":0}},{"type":"Polygon","arcs":[[-4320,-3796,-4893,-7320,7320,-4129,-4131]],"properties":{"id":"24662981","dp":3753,"de":531}},{"type":"Polygon","arcs":[[-7321,-7319,-4121,-4125]],"properties":{"id":"24662982","dp":21013,"de":1843}},{"type":"Polygon","arcs":[[7321,7322,7323,7324]],"properties":{"id":"24662983","dp":4104,"de":0}},{"type":"Polygon","arcs":[[7325,7326,-7322,7327,7328,-5978]],"properties":{"id":"24662984","dp":694,"de":59}},{"type":"Polygon","arcs":[[7329,7330,7331,-6804,-6796]],"properties":{"id":"24661570","dp":1675,"de":646}},{"type":"Polygon","arcs":[[7332,7333,7334,7335,-7330,-6795]],"properties":{"id":"24661571","dp":3139,"de":419}},{"type":"Polygon","arcs":[[7336,-7335,7337,7338]],"properties":{"id":"24661572","dp":8257,"de":891}},{"type":"Polygon","arcs":[[-6605,-6491,-2861,7339,7340,-7339,7341]],"properties":{"id":"24661573","dp":4632,"de":2777}},{"type":"Polygon","arcs":[[7342,7343,7344,-7331,-7336,-7337,-7341]],"properties":{"id":"24661574","dp":3764,"de":329}},{"type":"Polygon","arcs":[[7345,-7332,-7345,7346]],"properties":{"id":"24661575","dp":6144,"de":652}},{"type":"Polygon","arcs":[[7347,7348,7349,-7347,-7344]],"properties":{"id":"24661576","dp":5741,"de":1770}},{"type":"Polygon","arcs":[[-7350,7350,7351,7352,-6803,-7346]],"properties":{"id":"24661577","dp":4896,"de":1349}},{"type":"Polygon","arcs":[[7353,7354,7355,7356,-7352]],"properties":{"id":"24661578","dp":3561,"de":2340}},{"type":"Polygon","arcs":[[7357,7358,7359,-7355,7360]],"properties":{"id":"24661579","dp":13350,"de":2094}},{"type":"Polygon","arcs":[[7361,7362,-7361,-7354,-7351,7363]],"properties":{"id":"24661580","dp":5877,"de":1084}},{"type":"Polygon","arcs":[[-917,7364,-7364,-7349,7365,-7140]],"properties":{"id":"24661581","dp":2279,"de":1302}},{"type":"Polygon","arcs":[[-921,-937,7366,-7362,-7365,-916]],"properties":{"id":"24661582","dp":3033,"de":380}},{"type":"Polygon","arcs":[[7367,7368,7369,7370,7371,7372,7373,7374,7375,-397,7376]],"properties":{"id":"24662067","dp":0,"de":4307}},{"type":"Polygon","arcs":[[7377,7378,-384,7379]],"properties":{"id":"24662069","dp":13885,"de":0}},{"type":"Polygon","arcs":[[7380,7381,7382,-7378,7383,7384]],"properties":{"id":"24662070","dp":13016,"de":0}},{"type":"Polygon","arcs":[[7385,7386,7387,-7381]],"properties":{"id":"24662071","dp":23709,"de":0}},{"type":"Polygon","arcs":[[-7278,7388,-5252,-5258,-6744]],"properties":{"id":"24663116","dp":1197,"de":230}},{"type":"Polygon","arcs":[[-7277,-5253,-7389]],"properties":{"id":"24663117","dp":1178,"de":0}},{"type":"Polygon","arcs":[[-6113,-5255,-7276,7389,7390,7391,7392,7393,-5145,-5148,7394,-5172],[-5151,-5152]],"properties":{"id":"24663118","dp":122,"de":297}},{"type":"Polygon","arcs":[[-5138,-5146,-7394,7395]],"properties":{"id":"24663119","dp":1488,"de":3982}},{"type":"Polygon","arcs":[[7396,-5139,-7396,-7393,7397]],"properties":{"id":"24663120","dp":3795,"de":596}},{"type":"Polygon","arcs":[[-7398,-7392,7398]],"properties":{"id":"24663121","dp":3712,"de":1164}},{"type":"Polygon","arcs":[[-7399,-7391,7399,-5140,-7397]],"properties":{"id":"24663122","dp":3883,"de":2478}},{"type":"Polygon","arcs":[[-6114,7400,-5167,-5169,-5165,-5878,-5870,-5184,-6117]],"properties":{"id":"24663407","dp":1668,"de":0}},{"type":"Polygon","arcs":[[-5399,-3436]],"properties":{"id":"24663164","dp":2687,"de":1734}},{"type":"Polygon","arcs":[[-5448,7401,-5445,-5451,7402,7403,-5453,-3438,-5398,7404,7405,7406]],"properties":{"id":"24663166","dp":1449,"de":3685}},{"type":"Polygon","arcs":[[7407,-7405,-5397,7408,7409]],"properties":{"id":"24663167","dp":2844,"de":0}},{"type":"Polygon","arcs":[[-5441,-7402,-5447]],"properties":{"id":"24663168","dp":3333,"de":542}},{"type":"Polygon","arcs":[[7410,-4272,-4271,-6919,-7235,-7233]],"properties":{"id":"24661493","dp":14917,"de":1543}},{"type":"Polygon","arcs":[[7411,-4101,-7411,-7231]],"properties":{"id":"24661494","dp":31176,"de":0}},{"type":"Polygon","arcs":[[7412,-4105,-7412,-7230]],"properties":{"id":"24661495","dp":16679,"de":3754}},{"type":"Polygon","arcs":[[7413,-4108,-7413,-7228]],"properties":{"id":"24661496","dp":13100,"de":2131}},{"type":"Polygon","arcs":[[7414,7415,7416,-7387]],"properties":{"id":"24662072","dp":24268,"de":0}},{"type":"Polygon","arcs":[[7417,7418,7419,7420,-7416,7421,7422,7423,7424]],"properties":{"id":"24662073","dp":10919,"de":4245}},{"type":"Polygon","arcs":[[7425,7426,7427,7428,-7417,-7421]],"properties":{"id":"24662074","dp":13825,"de":1663}},{"type":"Polygon","arcs":[[-7429,7429,7430,-7388]],"properties":{"id":"24662075","dp":20565,"de":0}},{"type":"Polygon","arcs":[[-7431,7431,7432,-7382]],"properties":{"id":"24662076","dp":15990,"de":0}},{"type":"Polygon","arcs":[[-7383,-7433,7433,-385,-7379]],"properties":{"id":"24662077","dp":12444,"de":0}},{"type":"Polygon","arcs":[[7434,7435,-1388,-390]],"properties":{"id":"24662078","dp":14730,"de":0}},{"type":"Polygon","arcs":[[-1454,-1467,-7010,7436,-7435,-389]],"properties":{"id":"24662079","dp":10897,"de":1201}},{"type":"Polygon","arcs":[[-7437,-7009,-7011,-1389,-7436]],"properties":{"id":"24662080","dp":11847,"de":2653}},{"type":"Polygon","arcs":[[-5713,-5716,7437,7438]],"properties":{"id":"24661798","dp":15497,"de":6544}},{"type":"Polygon","arcs":[[-5714,-7439,7439,7440,-5709]],"properties":{"id":"24661799","dp":23933,"de":3080}},{"type":"Polygon","arcs":[[-5710,-7441,7441,7442]],"properties":{"id":"24661800","dp":25858,"de":0}},{"type":"Polygon","arcs":[[-5707,-7443,7443,7444,-5701]],"properties":{"id":"24661801","dp":7223,"de":3251}},{"type":"Polygon","arcs":[[7445,7446,7447,7448,-7444]],"properties":{"id":"24661802","dp":8200,"de":2197}},{"type":"Polygon","arcs":[[-7446,-7442,7449,7450]],"properties":{"id":"24661803","dp":24945,"de":2472}},{"type":"Polygon","arcs":[[-7440,7451,7452,7453,-7450]],"properties":{"id":"24661804","dp":20105,"de":4577}},{"type":"Polygon","arcs":[[-7438,7454,7455,-7452]],"properties":{"id":"24661805","dp":17472,"de":2361}},{"type":"Polygon","arcs":[[-5715,-5033,7456,7457,-7455]],"properties":{"id":"24661806","dp":18461,"de":3974}},{"type":"Polygon","arcs":[[-7453,-7456,-7458,7458,7459,7460]],"properties":{"id":"24661807","dp":19787,"de":4416}},{"type":"Polygon","arcs":[[-7454,-7461,7461,7462,7463,7464]],"properties":{"id":"24661808","dp":18647,"de":4713}},{"type":"Polygon","arcs":[[-7451,-7465,7465,-7447]],"properties":{"id":"24661809","dp":10440,"de":2422}},{"type":"Polygon","arcs":[[-7464,7466,7467,7468,7469,-7448,-7466]],"properties":{"id":"24661810","dp":9196,"de":6551}},{"type":"Polygon","arcs":[[-7467,-7463,7470,7471]],"properties":{"id":"24661811","dp":18634,"de":3614}},{"type":"Polygon","arcs":[[-7471,-7462,-7460,7472,7473]],"properties":{"id":"24661812","dp":19173,"de":3512}},{"type":"Polygon","arcs":[[-7473,-7459,7474,7475]],"properties":{"id":"24661813","dp":15366,"de":8494}},{"type":"Polygon","arcs":[[-7475,-7457,7476,7477,7478,7479]],"properties":{"id":"24661814","dp":12566,"de":3318}},{"type":"Polygon","arcs":[[-5032,7480,-7477]],"properties":{"id":"24661815","dp":15734,"de":7109}},{"type":"Polygon","arcs":[[7481,7482,-7481,-5031]],"properties":{"id":"24661816","dp":11709,"de":7952}},{"type":"Polygon","arcs":[[-5835,-5823,-5829,7483,7484,-7482]],"properties":{"id":"24661817","dp":12057,"de":5199}},{"type":"Polygon","arcs":[[-7485,7485,-7478,-7483]],"properties":{"id":"24661818","dp":20765,"de":0}},{"type":"Polygon","arcs":[[7486,7487,7488,7489,-7486]],"properties":{"id":"24661819","dp":17472,"de":3296}},{"type":"Polygon","arcs":[[-5828,-5833,7490,7491,7492,-7487,-7484]],"properties":{"id":"24661820","dp":12617,"de":5679}},{"type":"Polygon","arcs":[[-7493,7493,-7273,7494,-7488]],"properties":{"id":"24661821","dp":11378,"de":4407}},{"type":"Polygon","arcs":[[7495,7496,-939,-946,7497,7498]],"properties":{"id":"24661592","dp":3003,"de":0}},{"type":"Polygon","arcs":[[-945,7499,-7498]],"properties":{"id":"24661593","dp":9223,"de":0}},{"type":"Polygon","arcs":[[-7360,7500,-7499,-7500,-944,-3549,7501]],"properties":{"id":"24661594","dp":5594,"de":471}},{"type":"Polygon","arcs":[[-7356,-7502,-3554,7502]],"properties":{"id":"24661595","dp":3869,"de":455}},{"type":"Polygon","arcs":[[-7353,-7357,-7503,-3553,7503,-6802]],"properties":{"id":"24661597","dp":3066,"de":400}},{"type":"Polygon","arcs":[[-7504,-3552,-6799,-6800]],"properties":{"id":"24661598","dp":3017,"de":361}},{"type":"Polygon","arcs":[[7504,-4111,-7414,-7226]],"properties":{"id":"24661497","dp":13043,"de":1976}},{"type":"Polygon","arcs":[[7505,-4119,-4115,-4112,-7505,-7224,-7222]],"properties":{"id":"24661498","dp":5474,"de":23734}},{"type":"Polygon","arcs":[[-7506,-7220,-7218,-7216,7506,-4126,-4122]],"properties":{"id":"24661499","dp":10355,"de":1601}},{"type":"Polygon","arcs":[[7507,-4135,-4132,-4127,-7507,-7214,-7212]],"properties":{"id":"24661500","dp":8146,"de":4517}},{"type":"Polygon","arcs":[[-7508,-7211,7508,7509,-4136]],"properties":{"id":"24661501","dp":12047,"de":6428}},{"type":"Polygon","arcs":[[7510,7511,-4143,-7510,7512]],"properties":{"id":"24661502","dp":13410,"de":1589}},{"type":"Polygon","arcs":[[7513,-7513,-7509,-7083,7514]],"properties":{"id":"24661503","dp":14649,"de":3184}},{"type":"Polygon","arcs":[[7515,-4149,7516,-7511,-7514,7517]],"properties":{"id":"24661504","dp":15988,"de":8720}},{"type":"Polygon","arcs":[[-7517,-4146,-4139,-7512]],"properties":{"id":"24661505","dp":18595,"de":0}},{"type":"Polygon","arcs":[[7518,7519,-4152,-7516,7520]],"properties":{"id":"24661506","dp":19589,"de":5479}},{"type":"Polygon","arcs":[[7521,-4302,-4299,-7520,7522]],"properties":{"id":"24661507","dp":14609,"de":4687}},{"type":"Polygon","arcs":[[-6956,-4305,-7522,7523]],"properties":{"id":"24661508","dp":12172,"de":1114}},{"type":"Polygon","arcs":[[-6957,-7524,7524,7525,7526]],"properties":{"id":"24661509","dp":12715,"de":5387}},{"type":"Polygon","arcs":[[-7525,-7523,-7519,7527]],"properties":{"id":"24661510","dp":15028,"de":3693}},{"type":"Polygon","arcs":[[7528,-7521,-7518,-7515,-7082,-7080,-7072]],"properties":{"id":"24661513","dp":11255,"de":36595}},{"type":"Polygon","arcs":[[-7065,7529,7530,7531,-7071,-7070]],"properties":{"id":"24661514","dp":11062,"de":6941}},{"type":"Polygon","arcs":[[-7062,-7059,7532,7533,7534,-7530,-7064]],"properties":{"id":"24661515","dp":11259,"de":3827}},{"type":"Polygon","arcs":[[7535,7536,7537,-7533,7538]],"properties":{"id":"24661516","dp":13723,"de":7040}},{"type":"Polygon","arcs":[[-6951,-6950,7539,-7537,7540]],"properties":{"id":"24661517","dp":13107,"de":6265}},{"type":"Polygon","arcs":[[-7534,-7538,-7540,-6949,-6958,-7527,7541]],"properties":{"id":"24661518","dp":10919,"de":11069}},{"type":"Polygon","arcs":[[-5925,-1470,7542,7543]],"properties":{"id":"24661997","dp":11583,"de":1583}},{"type":"Polygon","arcs":[[-7543,-1469,7544,7545]],"properties":{"id":"24661998","dp":14210,"de":0}},{"type":"Polygon","arcs":[[7546,-7545,-1468,-1456,7547,7548]],"properties":{"id":"24661999","dp":13684,"de":1258}},{"type":"Polygon","arcs":[[7549,-7548,-1458,-1451,7550,7551]],"properties":{"id":"24662000","dp":13549,"de":1267}},{"type":"Polygon","arcs":[[7552,-7551,-1455,-388,7553]],"properties":{"id":"24662001","dp":15687,"de":0}},{"type":"Polygon","arcs":[[7554,7555,-7552,-7553,7556,7557]],"properties":{"id":"24662002","dp":16578,"de":2359}},{"type":"Polygon","arcs":[[-7557,-7554,-387,7558]],"properties":{"id":"24662003","dp":13910,"de":0}},{"type":"Polygon","arcs":[[7559,-7558,-7559,-386,-7434]],"properties":{"id":"24662004","dp":13737,"de":2706}},{"type":"Polygon","arcs":[[7560,7561,-7555,-7560,-7432]],"properties":{"id":"24662005","dp":16012,"de":1446}},{"type":"Polygon","arcs":[[-7428,7562,7563,7564,-7561,-7430]],"properties":{"id":"24662006","dp":17889,"de":1623}},{"type":"Polygon","arcs":[[-4458,-7141,-7366,-7348,-7343,-7340,-2860,-2847]],"properties":{"id":"24661620","dp":4479,"de":445}},{"type":"Polygon","arcs":[[-6990,7565,7566,7567,-6966,-6962,-6954,7568,-4727]],"properties":{"id":"24661621","dp":7933,"de":23795}},{"type":"Polygon","arcs":[[-6606,-7342,-7338,-7334,-6991,-6988]],"properties":{"id":"24661532","dp":2209,"de":4562}},{"type":"Polygon","arcs":[[-7333,7569,7570,7571,-6992]],"properties":{"id":"24661533","dp":22113,"de":2303}},{"type":"Polygon","arcs":[[-6993,-7572,7572,7573]],"properties":{"id":"24661534","dp":20646,"de":2985}},{"type":"Polygon","arcs":[[-6974,-7574,7574,7575]],"properties":{"id":"24661535","dp":23657,"de":2777}},{"type":"Polygon","arcs":[[-6975,-7576,7576,7577]],"properties":{"id":"24661536","dp":23127,"de":2132}},{"type":"Polygon","arcs":[[-6976,-7578,7578,7579]],"properties":{"id":"24661537","dp":24251,"de":3140}},{"type":"Polygon","arcs":[[-6969,-7580,7580,7581]],"properties":{"id":"24661538","dp":20189,"de":2606}},{"type":"Polygon","arcs":[[-6970,-7582,7582,7583]],"properties":{"id":"24661539","dp":24692,"de":2192}},{"type":"Polygon","arcs":[[-6965,-7584,7584,-6961]],"properties":{"id":"24661540","dp":25922,"de":0}},{"type":"Polygon","arcs":[[-7585,7585,-3391]],"properties":{"id":"24661541","dp":26096,"de":2673}},{"type":"Polygon","arcs":[[7586,7587,-7586,-7583]],"properties":{"id":"24661542","dp":18052,"de":0}},{"type":"Polygon","arcs":[[-7581,7588,7589,-7587]],"properties":{"id":"24661543","dp":21771,"de":0}},{"type":"Polygon","arcs":[[-7579,7590,7591,-7589]],"properties":{"id":"24661544","dp":21511,"de":2616}},{"type":"Polygon","arcs":[[-7575,7592,7593,-7591,-7577]],"properties":{"id":"24661545","dp":17464,"de":1424}},{"type":"Polygon","arcs":[[-7571,7594,7595,7596,-7593,-7573]],"properties":{"id":"24661546","dp":15792,"de":0}},{"type":"Polygon","arcs":[[-7570,-6794,7597,-7595]],"properties":{"id":"24661547","dp":37974,"de":0}},{"type":"Polygon","arcs":[[-7598,-6793,-6775,-6770,7598,-7596]],"properties":{"id":"24661548","dp":18980,"de":0}},{"type":"Polygon","arcs":[[-7597,-7599,-6766,7599,7600,-7594]],"properties":{"id":"24661549","dp":11074,"de":2399}},{"type":"Polygon","arcs":[[-7601,7601,7602,-7592]],"properties":{"id":"24661550","dp":20568,"de":0}},{"type":"Polygon","arcs":[[-7590,-7603,7603,-3392,-7588]],"properties":{"id":"24661551","dp":13873,"de":2747}},{"type":"Polygon","arcs":[[7604,-7139,-7128,-4205,-3393]],"properties":{"id":"24661554","dp":9649,"de":2192}},{"type":"Polygon","arcs":[[7605,-7135,-7138,-7605,-7604]],"properties":{"id":"24661555","dp":19215,"de":1260}},{"type":"Polygon","arcs":[[-7600,-6769,-6779,-6784,-7134,-7132,-7136,-7606,-7602]],"properties":{"id":"24661556","dp":6867,"de":1040}},{"type":"Polygon","arcs":[[7606,7607,7608]],"properties":{"id":"24662030","dp":21111,"de":2263}},{"type":"Polygon","arcs":[[-7489,7609,-7608,7610]],"properties":{"id":"24662031","dp":15163,"de":3485}},{"type":"Polygon","arcs":[[-7271,-7274,-5758,-5890,-5892,-5900,7611,7612]],"properties":{"id":"24662032","dp":2764,"de":6921}},{"type":"Polygon","arcs":[[-7253,-7264,-7265,-7269]],"properties":{"id":"24662033","dp":14688,"de":2564}},{"type":"Polygon","arcs":[[7613,-7418,7614]],"properties":{"id":"24662034","dp":16629,"de":0}},{"type":"Polygon","arcs":[[7615,7616,-7615,-7425,7617,7618]],"properties":{"id":"24662035","dp":17830,"de":0}},{"type":"Polygon","arcs":[[-7618,-7424,7619,7620]],"properties":{"id":"24662036","dp":11662,"de":0}},{"type":"Polygon","arcs":[[-6250,7621,-7619,-7621,7622,7623]],"properties":{"id":"24662037","dp":13612,"de":1076}},{"type":"Polygon","arcs":[[7624,-7623,-7620,-7423,7625,7626]],"properties":{"id":"24662038","dp":12873,"de":0}},{"type":"Polygon","arcs":[[-7626,-7422,-7415,7627]],"properties":{"id":"24662039","dp":8935,"de":0}},{"type":"Polygon","arcs":[[-7627,-7628,-7386,7628,7629]],"properties":{"id":"24662040","dp":14587,"de":899}},{"type":"Polygon","arcs":[[7630,-7629,-7385,7631,7632]],"properties":{"id":"24662041","dp":12411,"de":1996}},{"type":"Polygon","arcs":[[-7632,-7384,-7380,-383,7633,7634]],"properties":{"id":"24662042","dp":8479,"de":1305}},{"type":"Polygon","arcs":[[7635,-7634,-7376,7636]],"properties":{"id":"24662043","dp":11617,"de":0}},{"type":"Polygon","arcs":[[-7492,7637,7638,-7255,-7494]],"properties":{"id":"24661822","dp":11670,"de":1354}},{"type":"Polygon","arcs":[[-7491,7639,-7638]],"properties":{"id":"24661823","dp":18630,"de":1712}},{"type":"Polygon","arcs":[[-5832,7640,-7045,-7256,-7639,-7640]],"properties":{"id":"24661824","dp":16313,"de":2120}},{"type":"Polygon","arcs":[[-7043,-7641,-5831]],"properties":{"id":"24661825","dp":16491,"de":3333}},{"type":"Polygon","arcs":[[-6594,-6592,-6585,7641,7642,7643]],"properties":{"id":"24662271","dp":3162,"de":370}},{"type":"Polygon","arcs":[[-6595,-7644,7644,-5395]],"properties":{"id":"24662272","dp":4295,"de":939}},{"type":"Polygon","arcs":[[7645,-7409,-5396,-7645,-7643,7646]],"properties":{"id":"24662273","dp":2869,"de":0}},{"type":"Polygon","arcs":[[7647,7648,-7647,-7642,-6584]],"properties":{"id":"24662274","dp":3347,"de":277}},{"type":"Polygon","arcs":[[-3072,7649,7650,-7648,-6583]],"properties":{"id":"24662275","dp":2304,"de":0}},{"type":"Polygon","arcs":[[7651,7652,-3712,-1269]],"properties":{"id":"24661940","dp":17157,"de":11710}},{"type":"Polygon","arcs":[[7653,7654,7655,-7653]],"properties":{"id":"24661941","dp":19380,"de":3925}},{"type":"Polygon","arcs":[[7656,7657,-1287,-5796,7658,7659,-7654]],"properties":{"id":"24661942","dp":2428,"de":18450}},{"type":"Polygon","arcs":[[7660,-7657,-7652,-1274]],"properties":{"id":"24661943","dp":16448,"de":13620}},{"type":"Polygon","arcs":[[-1280,-1283,-1288,-7658,-7661,-1273]],"properties":{"id":"24661944","dp":13028,"de":35981}},{"type":"Polygon","arcs":[[-7660,7661,7662,-7655]],"properties":{"id":"24661945","dp":16238,"de":4867}},{"type":"Polygon","arcs":[[-3713,-7656,-7663,7663,7664,7665]],"properties":{"id":"24661946","dp":10887,"de":15614}},{"type":"Polygon","arcs":[[-7665,7666,7667,7668,7669]],"properties":{"id":"24661947","dp":18826,"de":2826}},{"type":"Polygon","arcs":[[-7666,-7670,7670,7671,-3709]],"properties":{"id":"24661948","dp":14350,"de":6638}},{"type":"Polygon","arcs":[[-7671,-7669,7672,7673]],"properties":{"id":"24661949","dp":16658,"de":3367}},{"type":"Polygon","arcs":[[-7672,-7674,7674,-3696,-5135,-5137]],"properties":{"id":"24661950","dp":10156,"de":7702}},{"type":"Polygon","arcs":[[7675,-5498,-5506,-3689,-3700,-3697]],"properties":{"id":"24661953","dp":12183,"de":10204}},{"type":"Polygon","arcs":[[7676,7677,7678,-7676,-7675,-7673]],"properties":{"id":"24661954","dp":16651,"de":7683}},{"type":"Polygon","arcs":[[7679,7680,-7677,-7668]],"properties":{"id":"24661955","dp":18132,"de":2918}},{"type":"Polygon","arcs":[[7681,7682,7683,-7678,-7681]],"properties":{"id":"24661956","dp":9977,"de":3611}},{"type":"Polygon","arcs":[[7684,7685,7686,-7682,7687]],"properties":{"id":"24661957","dp":13908,"de":5456}},{"type":"Polygon","arcs":[[7688,-7688,-7680,-7667,-7664]],"properties":{"id":"24661958","dp":18788,"de":10695}},{"type":"Polygon","arcs":[[7689,7690,7691,-7689,-7662]],"properties":{"id":"24661959","dp":13929,"de":9824}},{"type":"Polygon","arcs":[[7692,7693,-7691]],"properties":{"id":"24661960","dp":16458,"de":4249}},{"type":"Polygon","arcs":[[-7690,-7659,-5795,-6693,-6698,-6700,7694,-7693]],"properties":{"id":"24661961","dp":3152,"de":1246}},{"type":"Polygon","arcs":[[-7692,-7694,-7695,-6702,7695,-7685]],"properties":{"id":"24661962","dp":8834,"de":37730}},{"type":"Polygon","arcs":[[-7696,-6703,-6710,7696,-7686]],"properties":{"id":"24661963","dp":18341,"de":4899}},{"type":"Polygon","arcs":[[7697,-7496,-7501,-7359]],"properties":{"id":"24661599","dp":4056,"de":0}},{"type":"Polygon","arcs":[[-7367,-940,-7497,-7698,-7358,-7363]],"properties":{"id":"24661600","dp":3124,"de":766}},{"type":"Polygon","arcs":[[-3550,-942,-4410,-7125,7698,-7123,-5565]],"properties":{"id":"24661601","dp":2188,"de":2150}},{"type":"Polygon","arcs":[[-7124,-7699]],"properties":{"id":"24661602","dp":4102,"de":0}},{"type":"Polygon","arcs":[[-7204,-1500,7699]],"properties":{"id":"24662098","dp":14023,"de":0}},{"type":"Polygon","arcs":[[-1499,-7266,-7262,7700,-7201,-7700]],"properties":{"id":"24662099","dp":10173,"de":1906}},{"type":"Polygon","arcs":[[-7260,-7202,-7701,-7261]],"properties":{"id":"24662100","dp":13190,"de":4605}},{"type":"Polygon","arcs":[[-7259,7701,-7194,-7196,-7199]],"properties":{"id":"24662101","dp":6017,"de":1857}},{"type":"Polygon","arcs":[[7702,-7192,-7702,-7258]],"properties":{"id":"24662102","dp":10739,"de":4225}},{"type":"Polygon","arcs":[[7703,7704,-333,7705]],"properties":{"id":"24662103","dp":6944,"de":1889}},{"type":"Polygon","arcs":[[7706,-3821,-3814,-7705]],"properties":{"id":"24662104","dp":8165,"de":2206}},{"type":"Polygon","arcs":[[-3495,7707,-3822,-7707,7708]],"properties":{"id":"24662105","dp":9480,"de":3003}},{"type":"Polygon","arcs":[[-3494,-3825,-3818,-7708]],"properties":{"id":"24662106","dp":9200,"de":0}},{"type":"Polygon","arcs":[[7709,-2264,-2257,-7007]],"properties":{"id":"24662108","dp":15333,"de":1770}},{"type":"Polygon","arcs":[[7710,-2274,-7710,-6834]],"properties":{"id":"24662109","dp":18228,"de":1351}},{"type":"Polygon","arcs":[[7711,-2275,-7711,7712]],"properties":{"id":"24662110","dp":15255,"de":0}},{"type":"Polygon","arcs":[[-5018,-5017,7713,-6554,-6549,-6545]],"properties":{"id":"24662111","dp":11775,"de":13054}},{"type":"Polygon","arcs":[[-5010,7714,-6555,-7714,-5016]],"properties":{"id":"24662112","dp":17245,"de":4918}},{"type":"Polygon","arcs":[[-6551,-7715,-5009,-5004,-4876,-4875,-4872,-6556]],"properties":{"id":"24662113","dp":3453,"de":442}},{"type":"Polygon","arcs":[[7715,-3523,7716,-1931]],"properties":{"id":"24662958","dp":3548,"de":461}},{"type":"Polygon","arcs":[[-1594,-1598,-1602,-3521,-7716,-1930]],"properties":{"id":"24662961","dp":7521,"de":1569}},{"type":"Polygon","arcs":[[-6653,7717,7718,7719,7720,-6655]],"properties":{"id":"24662962","dp":10448,"de":0}},{"type":"Polygon","arcs":[[-6656,-7721,7721,7722,-6667,-6662]],"properties":{"id":"24662963","dp":13293,"de":0}},{"type":"Polygon","arcs":[[-7295,7723,-6641,-6651,7724,-6665,-6685,-6687,-6691,7725,-1625,-7297]],"properties":{"id":"24662964","dp":941,"de":3834}},{"type":"Polygon","arcs":[[-6650,-6661,-6666,-7725]],"properties":{"id":"24662965","dp":13662,"de":4714}},{"type":"Polygon","arcs":[[-7294,-7724]],"properties":{"id":"24662966","dp":29845,"de":0}},{"type":"Polygon","arcs":[[-7566,-6981,-6967,7726]],"properties":{"id":"24661622","dp":19846,"de":2307}},{"type":"Polygon","arcs":[[-7567,-7727,-6971,7727]],"properties":{"id":"24661623","dp":23600,"de":2444}},{"type":"Polygon","arcs":[[-7728,-6963,-7568]],"properties":{"id":"24661624","dp":17574,"de":5106}},{"type":"Polygon","arcs":[[-4738,-4728,-7569,-6953,7728,-4750]],"properties":{"id":"24661625","dp":2091,"de":6686}},{"type":"Polygon","arcs":[[-4763,-7729,-6952,-7541,-7536,7729,7730]],"properties":{"id":"24661626","dp":6212,"de":10221}},{"type":"Polygon","arcs":[[-7730,-7539,-7061,7731]],"properties":{"id":"24661627","dp":17538,"de":5135}},{"type":"Polygon","arcs":[[-5115,-4764,-7731,-7732,-7057,-7056,7732,7733]],"properties":{"id":"24661628","dp":2730,"de":12672}},{"type":"Polygon","arcs":[[-7734,7734,7735,-5116]],"properties":{"id":"24661629","dp":10100,"de":8193}},{"type":"Polygon","arcs":[[-7246,-6906,-2293,7736]],"properties":{"id":"24661630","dp":6753,"de":2217}},{"type":"Polygon","arcs":[[7737,7738,-7737,7739,7740]],"properties":{"id":"24661631","dp":7161,"de":2380}},{"type":"Polygon","arcs":[[7741,-7247,-7739,7742,7743,7744]],"properties":{"id":"24661632","dp":11209,"de":756}},{"type":"Polygon","arcs":[[7745,-7242,-7248,-7742,7746]],"properties":{"id":"24661633","dp":11463,"de":958}},{"type":"Polygon","arcs":[[-7209,7747,-7241,-7746]],"properties":{"id":"24661634","dp":11827,"de":1724}},{"type":"Polygon","arcs":[[-7208,-7150,-7238,-7239,-7748]],"properties":{"id":"24661635","dp":12547,"de":2857}},{"type":"Polygon","arcs":[[7748,7749,-2903]],"properties":{"id":"24662131","dp":17239,"de":0}},{"type":"Polygon","arcs":[[7750,7751,-7749,-2902]],"properties":{"id":"24662132","dp":16117,"de":3324}},{"type":"Polygon","arcs":[[-7751,-2901,7752,7753,7754]],"properties":{"id":"24662133","dp":7219,"de":8005}},{"type":"Polygon","arcs":[[-7754,7755,7756,-2565,-2571,7757]],"properties":{"id":"24662134","dp":6560,"de":1864}},{"type":"Polygon","arcs":[[7758,-3540,7759,7760,-7756]],"properties":{"id":"24662135","dp":7688,"de":15667}},{"type":"Polygon","arcs":[[-2910,-2915,-7759,-7753]],"properties":{"id":"24662136","dp":21841,"de":2966}},{"type":"Polygon","arcs":[[-7761,7761,-6121,-2562,-7757]],"properties":{"id":"24662137","dp":10441,"de":8201}},{"type":"Polygon","arcs":[[-3539,7762,7763,-6125,-6122,-7762,-7760]],"properties":{"id":"24662138","dp":3353,"de":13807}},{"type":"Polygon","arcs":[[-5805,-5803,-2727,7764,-6126]],"properties":{"id":"24662140","dp":32804,"de":28048}},{"type":"Polygon","arcs":[[-6127,-7765,-2730]],"properties":{"id":"24662141","dp":31500,"de":2500}},{"type":"Polygon","arcs":[[7765,7766,-5207,-7764]],"properties":{"id":"24662142","dp":26520,"de":40878}},{"type":"Polygon","arcs":[[-4563,-2709,-2718,-5208,-7767,7767]],"properties":{"id":"24662143","dp":3505,"de":12207}},{"type":"Polygon","arcs":[[-3545,-4564,-7768,-7766,-7763,-3538]],"properties":{"id":"24662144","dp":13223,"de":28371}},{"type":"Polygon","arcs":[[-7210,-7747,7768,-5772,-5764]],"properties":{"id":"24661660","dp":10017,"de":1475}},{"type":"Polygon","arcs":[[-7769,-7745,7769,-5773]],"properties":{"id":"24661661","dp":14436,"de":0}},{"type":"Polygon","arcs":[[-7770,-7744,7770,-5775]],"properties":{"id":"24661662","dp":11105,"de":1442}},{"type":"Polygon","arcs":[[-1476,-5776,-7771,-7743,-7738,7771,-1472]],"properties":{"id":"24661663","dp":4123,"de":1231}},{"type":"Polygon","arcs":[[-7772,-7741,7772,7773,-1473]],"properties":{"id":"24661664","dp":8072,"de":2409}},{"type":"Polygon","arcs":[[-7774,7774,7775,-1462,-1474]],"properties":{"id":"24661665","dp":11469,"de":0}},{"type":"Polygon","arcs":[[-7776,7776,7777,7778,-1463]],"properties":{"id":"24661666","dp":8374,"de":643}},{"type":"Polygon","arcs":[[7779,-2288,7780,-7777]],"properties":{"id":"24661667","dp":7920,"de":1804}},{"type":"Polygon","arcs":[[-7773,-7740,-2292,-7780,-7775]],"properties":{"id":"24661668","dp":10695,"de":2139}},{"type":"Polygon","arcs":[[-7778,-7781,-2287,-2281,-2271,-7712,7781]],"properties":{"id":"24661669","dp":3545,"de":1232}},{"type":"Polygon","arcs":[[-7779,-7782,7782,-1464]],"properties":{"id":"24661670","dp":6715,"de":1863}},{"type":"Polygon","arcs":[[-7783,-7713,-6833,-1465]],"properties":{"id":"24661671","dp":15000,"de":1724}},{"type":"Polygon","arcs":[[-6010,-2310,7783,7784,7785,7786,7787,7788]],"properties":{"id":"24662162","dp":1682,"de":24676}},{"type":"Polygon","arcs":[[-6007,-7789,7789,7790,-2890,7791]],"properties":{"id":"24662163","dp":6950,"de":2593}},{"type":"Polygon","arcs":[[-2889,7792,-2874,-6008,-7792]],"properties":{"id":"24662164","dp":3200,"de":3169}},{"type":"Polygon","arcs":[[-7793,-2888,-2883,-2875]],"properties":{"id":"24662165","dp":13571,"de":0}},{"type":"Polygon","arcs":[[-3473,-2891,-7791,-3533,-2913,7793]],"properties":{"id":"24662167","dp":4663,"de":6351}},{"type":"Polygon","arcs":[[-2906,-7794]],"properties":{"id":"24662168","dp":23446,"de":0}},{"type":"Polygon","arcs":[[7794,-2528,7795]],"properties":{"id":"24662169","dp":10740,"de":0}},{"type":"Polygon","arcs":[[7796,7797,7798,7799,-7796,-2527,7800]],"properties":{"id":"24662170","dp":5975,"de":0}},{"type":"Polygon","arcs":[[7801,7802,-7799]],"properties":{"id":"24662171","dp":6305,"de":0}},{"type":"Polygon","arcs":[[-2529,-7795,-7800,7803]],"properties":{"id":"24662172","dp":8530,"de":884}},{"type":"Polygon","arcs":[[-7803,7804,-715,-706,-697,-3105,-7804]],"properties":{"id":"24662173","dp":3917,"de":770}},{"type":"Polygon","arcs":[[-2680,-2491,7805,7806,7807,-710,-7805,7808,-7797,7809]],"properties":{"id":"24662174","dp":2149,"de":185}},{"type":"Polygon","arcs":[[-7802,-7798,-7809]],"properties":{"id":"24662175","dp":10682,"de":741}},{"type":"Polygon","arcs":[[-7687,-7697,-6709,7810,-7683]],"properties":{"id":"24661964","dp":18611,"de":3213}},{"type":"Polygon","arcs":[[-7679,-7684,-7811,-6708,-5489,-5496]],"properties":{"id":"24661965","dp":12250,"de":13588}},{"type":"Polygon","arcs":[[-6344,-5686,7811]],"properties":{"id":"24662342","dp":4292,"de":0}},{"type":"Polygon","arcs":[[-3062,-6321,-6342,-7812,-5683,7812]],"properties":{"id":"24662343","dp":3632,"de":317}},{"type":"Polygon","arcs":[[-3057,-3063,-7813,-5682,7813]],"properties":{"id":"24662344","dp":3089,"de":0}},{"type":"Polygon","arcs":[[7814,7815,-5465,-3058,-7814,-5681,7816]],"properties":{"id":"24662345","dp":3383,"de":0}},{"type":"MultiPolygon","arcs":[[[7817,7818,7819,-6025,-6028,-6013,7820,7821]],[[7822,7823,-4282,7824]],[[7825,-4277,7826]]],"properties":{"id":"24663390","dp":694,"de":1243}},{"type":"Polygon","arcs":[[7827,7828,7829,-7819]],"properties":{"id":"24663391","dp":8240,"de":2423}},{"type":"Polygon","arcs":[[7830,-7828,7831,7832]],"properties":{"id":"24663392","dp":6712,"de":1909}},{"type":"Polygon","arcs":[[-7831,7833,-1778,7834,-7829]],"properties":{"id":"24663393","dp":8991,"de":2242}},{"type":"MultiPolygon","arcs":[[[-7833,7835,7836,-1772,7837,-1779,-7834]],[[-1781,7838,7839,7840]],[[-1786,7841,7842,7843]],[[-1783,7844,7845,7846]]],"properties":{"id":"24663394","dp":2124,"de":3179}},{"type":"MultiPolygon","arcs":[[[-7827,-4276,-2465,7847,-7840,7848]],[[7849,-7836,-7832,-7818]],[[7850,-7843,7851,-7823]],[[7852]],[[-7846,7853]]],"properties":{"id":"24663395","dp":3547,"de":470}},{"type":"Polygon","arcs":[[7854]],"properties":{"id":"24663396","dp":26,"de":0}},{"type":"Polygon","arcs":[[7855,7856,7857,7858,7859,-7419,-7614]],"properties":{"id":"24663397","dp":15008,"de":900}},{"type":"Polygon","arcs":[[7860,7861,7862,-7857]],"properties":{"id":"24663398","dp":10852,"de":0}},{"type":"Polygon","arcs":[[-7861,-7856,-7617,7863]],"properties":{"id":"24663399","dp":9401,"de":664}},{"type":"Polygon","arcs":[[7864,-7864,-7616,-7622,-6249]],"properties":{"id":"24663400","dp":12946,"de":4872}},{"type":"Polygon","arcs":[[7865,7866,7867,-7862,-7865,-6253]],"properties":{"id":"24663401","dp":2525,"de":7200}},{"type":"Polygon","arcs":[[7868,-1130,-1138,7869]],"properties":{"id":"24663402","dp":10158,"de":0}},{"type":"Polygon","arcs":[[-1749,-1757,-1767,-3983,-3844,-3840,-3836,-3834]],"properties":{"id":"24661703","dp":7376,"de":1388}},{"type":"Polygon","arcs":[[7870,-2230,-2227,-2221,-1737,-1539]],"properties":{"id":"24661704","dp":12107,"de":1789}},{"type":"Polygon","arcs":[[-7021,-7019,-2243,-2235,-2231,-7871,-1538]],"properties":{"id":"24661705","dp":4225,"de":15312}},{"type":"Polygon","arcs":[[7871,-7377,-396,-1447,-7031,-3490]],"properties":{"id":"24661708","dp":4721,"de":1518}},{"type":"Polygon","arcs":[[7872,7873,-7368,-7872,-3496,7874,7875]],"properties":{"id":"24661709","dp":2164,"de":5433}},{"type":"Polygon","arcs":[[-7709,-7704,7876,-7875]],"properties":{"id":"24661710","dp":8519,"de":3107}},{"type":"Polygon","arcs":[[7877,-7876,-7877,7878,7879,7880]],"properties":{"id":"24661711","dp":8349,"de":1225}},{"type":"Polygon","arcs":[[-7879,-7706,-332,7881]],"properties":{"id":"24661712","dp":8303,"de":0}},{"type":"Polygon","arcs":[[7882,-7880,-7882,-331,7883]],"properties":{"id":"24661713","dp":9049,"de":1311}},{"type":"Polygon","arcs":[[7884,-7884,7885,-3957]],"properties":{"id":"24661714","dp":11540,"de":0}},{"type":"Polygon","arcs":[[-3958,-7886,-330,-3808,-3800,-3799,-3960]],"properties":{"id":"24661715","dp":4304,"de":1828}},{"type":"Polygon","arcs":[[7886,-7881,-7883,-7885,7887]],"properties":{"id":"24661716","dp":9462,"de":833}},{"type":"Polygon","arcs":[[7888,-7888,-3956]],"properties":{"id":"24661717","dp":10787,"de":0}},{"type":"Polygon","arcs":[[7889,7890,-7874,7891,-7889,-3955]],"properties":{"id":"24661718","dp":1532,"de":1834}},{"type":"Polygon","arcs":[[-7873,-7878,-7887,-7892]],"properties":{"id":"24661719","dp":4314,"de":2983}},{"type":"Polygon","arcs":[[-3481,7892,-3479,-5317,-5320,-365,-7890,-3954,-3483,7893]],"properties":{"id":"24661720","dp":699,"de":878}},{"type":"Polygon","arcs":[[-3482,-7894]],"properties":{"id":"24661721","dp":12230,"de":0}},{"type":"MultiPolygon","arcs":[[[7894,-4685,7895,7896,-7327]],[[7897]]],"properties":{"id":"24662985","dp":777,"de":413}},{"type":"Polygon","arcs":[[-5977,7898,-7895,-7326]],"properties":{"id":"24662986","dp":1242,"de":153}},{"type":"Polygon","arcs":[[-3450,-4686,-7899,-5976]],"properties":{"id":"24662987","dp":974,"de":291}},{"type":"Polygon","arcs":[[-7869,7899,7900,-1121]],"properties":{"id":"24663403","dp":5476,"de":0}},{"type":"Polygon","arcs":[[-1135,7901,-7900,-7870,-1137,-3740]],"properties":{"id":"24663404","dp":7196,"de":0}},{"type":"Polygon","arcs":[[-7902,-1134,-1122,-7901]],"properties":{"id":"24663405","dp":6421,"de":0}},{"type":"Polygon","arcs":[[-5879,-5168,-7401,-5173,-7395,-5147,-4960,-5950,-5948,-4968,-4972]],"properties":{"id":"24663406","dp":686,"de":73}},{"type":"Polygon","arcs":[[7902,-7528,-7529,-7532]],"properties":{"id":"24663450","dp":14109,"de":2729}},{"type":"Polygon","arcs":[[-7531,-7535,-7542,-7526,-7903]],"properties":{"id":"24663451","dp":6708,"de":12304}},{"type":"Polygon","arcs":[[-6139,7903,-2963,-1308,-1249,-6135,-6137]],"properties":{"id":"24663452","dp":5953,"de":25994}},{"type":"Polygon","arcs":[[-4586,-2964,-7904,-6138,-2966]],"properties":{"id":"24663453","dp":12181,"de":2674}},{"type":"Polygon","arcs":[[7904,7905,7906,-7563,-7427]],"properties":{"id":"24662007","dp":19251,"de":0}},{"type":"Polygon","arcs":[[7907,-7546,-7547,7908,-7564,-7907]],"properties":{"id":"24662008","dp":8516,"de":1180}},{"type":"Polygon","arcs":[[-7565,-7909,-7549,-7550,-7556,-7562]],"properties":{"id":"24662009","dp":13447,"de":3561}},{"type":"Polygon","arcs":[[7909,-7544,-7908,7910]],"properties":{"id":"24662010","dp":15041,"de":2054}},{"type":"Polygon","arcs":[[7911,-5920,-5923,-5926,-7910,7912]],"properties":{"id":"24662011","dp":13357,"de":2828}},{"type":"Polygon","arcs":[[7913,-7913,-7911,-7906,7914]],"properties":{"id":"24662012","dp":12888,"de":3486}},{"type":"Polygon","arcs":[[7915,-5921,-7912,-7914,7916]],"properties":{"id":"24662013","dp":15308,"de":3089}},{"type":"Polygon","arcs":[[-7860,7917,-7917,-7915,-7905,-7426,-7420]],"properties":{"id":"24662014","dp":5970,"de":1146}},{"type":"Polygon","arcs":[[7918,7919,-5918,-7916,-7918,-7859]],"properties":{"id":"24662015","dp":7562,"de":3541}},{"type":"Polygon","arcs":[[7920,-5914,-5915,-7920]],"properties":{"id":"24662016","dp":15907,"de":4336}},{"type":"Polygon","arcs":[[7921,-5912,-7921,7922]],"properties":{"id":"24662017","dp":20319,"de":6914}},{"type":"Polygon","arcs":[[7923,-7633,-7635,-7636,7924,7925]],"properties":{"id":"24662044","dp":14034,"de":1136}},{"type":"Polygon","arcs":[[7926,-7925,-7637,7927,-6226]],"properties":{"id":"24662045","dp":13248,"de":2760}},{"type":"Polygon","arcs":[[7928,-7926,-7927,-6225,-6228]],"properties":{"id":"24662046","dp":17621,"de":1732}},{"type":"Polygon","arcs":[[7929,7930,-7924,-7929,-6230]],"properties":{"id":"24662047","dp":3978,"de":8507}},{"type":"Polygon","arcs":[[-6233,7931,7932,-7930]],"properties":{"id":"24662048","dp":15337,"de":1993}},{"type":"Polygon","arcs":[[-6235,-6241,7933,-7932,-6232]],"properties":{"id":"24662049","dp":14679,"de":1388}},{"type":"Polygon","arcs":[[7934,-7410,-7646,-7649,-7651]],"properties":{"id":"24662276","dp":2954,"de":0}},{"type":"Polygon","arcs":[[7935,7936,-7406,-7408,-7935,-7650,-3071]],"properties":{"id":"24662277","dp":2330,"de":1011}},{"type":"Polygon","arcs":[[7937,7938,-5449,-7407,-7937]],"properties":{"id":"24662278","dp":6876,"de":720}},{"type":"Polygon","arcs":[[-7936,-3070,7939,7940,-7938]],"properties":{"id":"24662279","dp":13111,"de":0}},{"type":"Polygon","arcs":[[7941,7942,-5450,-7939,-7941,7943]],"properties":{"id":"24662280","dp":2508,"de":224}},{"type":"Polygon","arcs":[[7944,-7944,-7940,-3069,7945]],"properties":{"id":"24662281","dp":1717,"de":148}},{"type":"Polygon","arcs":[[-3068,-5353,7946,7947,-7946]],"properties":{"id":"24662282","dp":4097,"de":0}},{"type":"Polygon","arcs":[[-7948,7948,-7942,-7945]],"properties":{"id":"24662283","dp":3343,"de":0}},{"type":"Polygon","arcs":[[-7943,-7949,-7947,-5352,-6160,-6167,7949,7950,-7403,-5452,-5443,-5446]],"properties":{"id":"24662284","dp":901,"de":2187}},{"type":"Polygon","arcs":[[7951,7952,7953,7954,-7951]],"properties":{"id":"24662285","dp":3759,"de":1181}},{"type":"Polygon","arcs":[[-7953,7955,7956,7957]],"properties":{"id":"24662286","dp":2763,"de":0}},{"type":"Polygon","arcs":[[-7958,7958,7959,-7954]],"properties":{"id":"24662287","dp":3685,"de":332}},{"type":"Polygon","arcs":[[7960,7961,-7959,-7957]],"properties":{"id":"24662288","dp":2965,"de":0}},{"type":"Polygon","arcs":[[-7955,-7960,-7962,7962,-5740,-5460,-5454,-7404]],"properties":{"id":"24662289","dp":856,"de":1771}},{"type":"Polygon","arcs":[[-1313,-1281,-1277,-1271,-1086,7963]],"properties":{"id":"24662114","dp":3221,"de":18847}},{"type":"Polygon","arcs":[[7964,-5911,-7922,7965]],"properties":{"id":"24662018","dp":21736,"de":6052}},{"type":"Polygon","arcs":[[7966,-5909,-7965,7967]],"properties":{"id":"24662019","dp":21354,"de":2343}},{"type":"Polygon","arcs":[[7968,-5907,-7967,7969,7970]],"properties":{"id":"24662020","dp":15658,"de":3202}},{"type":"Polygon","arcs":[[-7970,-7968,-7966,-7923,-7919,7971]],"properties":{"id":"24662021","dp":15519,"de":0}},{"type":"Polygon","arcs":[[7972,-7971,-7972,-7858,-7863,-7868]],"properties":{"id":"24662022","dp":14750,"de":0}},{"type":"Polygon","arcs":[[-7973,-7867,7973,7974,-7612,-5902,7975,-5906,-7969]],"properties":{"id":"24662024","dp":6894,"de":1088}},{"type":"Polygon","arcs":[[-5904,-7976]],"properties":{"id":"24662025","dp":28600,"de":4938}},{"type":"Polygon","arcs":[[-7445,-7449,-7470,-7974,-7866,-6252,-6258,-6274,-6275]],"properties":{"id":"24662026","dp":2804,"de":5234}},{"type":"Polygon","arcs":[[-7975,-7469,7976,7977,-7609,-7610,-7495,-7272,-7613]],"properties":{"id":"24662027","dp":3320,"de":6302}},{"type":"Polygon","arcs":[[-7480,7978,-7977,-7468,-7472,-7474,-7476]],"properties":{"id":"24662028","dp":13774,"de":2903}},{"type":"Polygon","arcs":[[-7490,-7611,-7607,-7978,-7979,-7479]],"properties":{"id":"24662029","dp":17312,"de":5000}},{"type":"Polygon","arcs":[[7979,7980,7981,7982,-5599,-5598,-5593]],"properties":{"id":"24662384","dp":1848,"de":652}},{"type":"Polygon","arcs":[[7983,7984,7985,7986,-7981,7987]],"properties":{"id":"24662385","dp":3341,"de":499}},{"type":"Polygon","arcs":[[7988,-7988,-7980,-5592,7989,7990]],"properties":{"id":"24662386","dp":4512,"de":406}},{"type":"Polygon","arcs":[[7991,7992,7993,-7990,-5596,-5590]],"properties":{"id":"24662387","dp":11225,"de":1092}},{"type":"Polygon","arcs":[[7994,-5943,7995,7996,-7993,7997]],"properties":{"id":"24662388","dp":3059,"de":0}},{"type":"Polygon","arcs":[[-5589,-5585,-5580,7998,7999,-7998,-7992]],"properties":{"id":"24662389","dp":2794,"de":1017}},{"type":"Polygon","arcs":[[8000,8001,-825,-4570,-4567,-4557,-3535]],"properties":{"id":"24662145","dp":2786,"de":2629}},{"type":"Polygon","arcs":[[8002,-8001,8003]],"properties":{"id":"24662147","dp":15989,"de":6951}},{"type":"Polygon","arcs":[[-7790,-7788,8004,8005,-8004,-3534]],"properties":{"id":"24662148","dp":5279,"de":5182}},{"type":"Polygon","arcs":[[8006,-835,-829,8007,-8006]],"properties":{"id":"24662149","dp":9821,"de":10425}},{"type":"Polygon","arcs":[[-8008,-832,-828,-8002,-8003]],"properties":{"id":"24662150","dp":7965,"de":2836}},{"type":"Polygon","arcs":[[-838,-8007,8008]],"properties":{"id":"24662151","dp":14970,"de":22058}},{"type":"Polygon","arcs":[[-7787,8009,-841,-3597,-836,-8009,-8005]],"properties":{"id":"24662152","dp":7012,"de":9674}},{"type":"Polygon","arcs":[[8010,-845,-842,-8010,-7786]],"properties":{"id":"24662153","dp":11924,"de":2405}},{"type":"Polygon","arcs":[[-6251,-7624,8011,-7934]],"properties":{"id":"24662050","dp":12577,"de":2333}},{"type":"Polygon","arcs":[[-8012,-7625,-7630,-7631,-7931,-7933]],"properties":{"id":"24662051","dp":8170,"de":24634}},{"type":"Polygon","arcs":[[-6221,-7928,-7375,8012]],"properties":{"id":"24662052","dp":12256,"de":2850}},{"type":"Polygon","arcs":[[-6222,-8013,-7374,8013]],"properties":{"id":"24662053","dp":16512,"de":1226}},{"type":"Polygon","arcs":[[8014,-8014,-7373,8015]],"properties":{"id":"24662054","dp":8411,"de":9371}},{"type":"Polygon","arcs":[[-8016,-7372,8016,8017]],"properties":{"id":"24662055","dp":18455,"de":2205}},{"type":"Polygon","arcs":[[-8017,-7371,8018,8019]],"properties":{"id":"24662056","dp":17165,"de":2330}},{"type":"Polygon","arcs":[[-8019,-7370,8020]],"properties":{"id":"24662057","dp":11772,"de":0}},{"type":"Polygon","arcs":[[8021,-8020,-8021,-7369,-7891,-364,-382]],"properties":{"id":"24662058","dp":3397,"de":3757}},{"type":"Polygon","arcs":[[-6045,-6048,8022,8023,-379]],"properties":{"id":"24662064","dp":14070,"de":2922}},{"type":"Polygon","arcs":[[-6058,-6219,8024,-8023,-6047,-6049,-6053]],"properties":{"id":"24662065","dp":5720,"de":3625}},{"type":"Polygon","arcs":[[-380,-8024,-8025,-6218,-6223,-8015,-8018,-8022]],"properties":{"id":"24662066","dp":5004,"de":3910}},{"type":"Polygon","arcs":[[-3504,8025,-5402,-5410,-5413,8026,8027,8028]],"properties":{"id":"24662405","dp":4160,"de":2203}},{"type":"Polygon","arcs":[[8029,-3506,8030,8031]],"properties":{"id":"24662408","dp":3040,"de":582}},{"type":"Polygon","arcs":[[-8031,-3505,-8029,8032,8033,8034,8035]],"properties":{"id":"24662409","dp":2358,"de":420}},{"type":"Polygon","arcs":[[-8035,8036,8037]],"properties":{"id":"24662410","dp":3768,"de":0}},{"type":"Polygon","arcs":[[-8037,-8034,8038,8039,8040]],"properties":{"id":"24662411","dp":9136,"de":0}},{"type":"Polygon","arcs":[[-5281,8041,8042,8043,-8040]],"properties":{"id":"24662412","dp":11314,"de":0}},{"type":"Polygon","arcs":[[8044,-8042,-5280,-5276,-5270]],"properties":{"id":"24662413","dp":6083,"de":0}},{"type":"Polygon","arcs":[[8045,8046,-8043,-8045,-5275]],"properties":{"id":"24662414","dp":10353,"de":0}},{"type":"Polygon","arcs":[[8047,-8044,-8047,8048]],"properties":{"id":"24662415","dp":9958,"de":0}},{"type":"Polygon","arcs":[[8049,-8049,-8046,-5274,-5268,-5160,8050]],"properties":{"id":"24662416","dp":8268,"de":0}},{"type":"Polygon","arcs":[[-2700,-2698,-2696,-2694,-2689,-2683,8051,-2707]],"properties":{"id":"24662176","dp":3281,"de":2157}},{"type":"Polygon","arcs":[[8052,-711,-7808]],"properties":{"id":"24662177","dp":10225,"de":0}},{"type":"Polygon","arcs":[[-7807,8053,-4591,8054,-721,-712,-8053]],"properties":{"id":"24662178","dp":10562,"de":672}},{"type":"Polygon","arcs":[[-8055,-4590,-4471,-4468,-726,-722]],"properties":{"id":"24662179","dp":8499,"de":1661}},{"type":"Polygon","arcs":[[-4326,-4600,-4592,-8054,-7806]],"properties":{"id":"24662180","dp":11991,"de":0}},{"type":"Polygon","arcs":[[-7961,-7956,-7952,-7950,-6170,-5741,-7963]],"properties":{"id":"24662290","dp":3018,"de":2519}},{"type":"Polygon","arcs":[[-4701,-4697,8055,-4939,-4938,-4936,-4928,-7301,-4911]],"properties":{"id":"24662642","dp":1972,"de":531}},{"type":"Polygon","arcs":[[-6423,8056,8057,-7317,-8056]],"properties":{"id":"24662643","dp":9678,"de":2506}},{"type":"Polygon","arcs":[[8058,8059,8060,8061,-8057]],"properties":{"id":"24662644","dp":7315,"de":1908}},{"type":"Polygon","arcs":[[-8058,-8062,8062,8063,-7318]],"properties":{"id":"24662645","dp":8890,"de":1239}},{"type":"Polygon","arcs":[[8064,8065,8066,-8063,-8061]],"properties":{"id":"24662646","dp":9131,"de":1595}},{"type":"Polygon","arcs":[[-8067,8067,8068,-7314,-8064]],"properties":{"id":"24662647","dp":5640,"de":15548}},{"type":"Polygon","arcs":[[8069,8070,8071,8072,-8068,-8066,8073]],"properties":{"id":"24662648","dp":5610,"de":2964}},{"type":"Polygon","arcs":[[-5459,-5466,-7816,8074,-5457]],"properties":{"id":"24662346","dp":2142,"de":0}},{"type":"Polygon","arcs":[[-8075,8075,8076,8077,8078,-5433]],"properties":{"id":"24662347","dp":2461,"de":0}},{"type":"Polygon","arcs":[[-7815,8079,8080,8081,-8076]],"properties":{"id":"24662348","dp":3249,"de":0}},{"type":"Polygon","arcs":[[-8080,-7817,-5680,8082,8083]],"properties":{"id":"24662349","dp":3082,"de":0}},{"type":"Polygon","arcs":[[-5674,8084,8085,8086,-8083]],"properties":{"id":"24662350","dp":3205,"de":0}},{"type":"Polygon","arcs":[[-8087,8087]],"properties":{"id":"24662351","dp":3520,"de":0}},{"type":"Polygon","arcs":[[-8081,-8084,-8088,-8086,8088,8089,8090]],"properties":{"id":"24662352","dp":2555,"de":0}},{"type":"Polygon","arcs":[[8091,-8089,-8085,-5677,-5659,-5366,8092]],"properties":{"id":"24662353","dp":4427,"de":724}},{"type":"Polygon","arcs":[[8093,-8090,-8092,8094]],"properties":{"id":"24662354","dp":3846,"de":0}},{"type":"Polygon","arcs":[[8095,-8095,-8093,8096,-8078]],"properties":{"id":"24662355","dp":4972,"de":2426}},{"type":"Polygon","arcs":[[-8077,-8082,-8091,-8094,-8096]],"properties":{"id":"24662356","dp":3809,"de":751}},{"type":"Polygon","arcs":[[-5431,-5434,-8079,-8097,-5365,8097,-5426,-5428]],"properties":{"id":"24662357","dp":3637,"de":1810}},{"type":"Polygon","arcs":[[-5364,-5260,-3497,8098,-8098]],"properties":{"id":"24662358","dp":8724,"de":358}},{"type":"Polygon","arcs":[[-8099,-3502,8099,-5421,-5427]],"properties":{"id":"24662359","dp":6330,"de":0}},{"type":"Polygon","arcs":[[-5369,-5652,8100,-3500]],"properties":{"id":"24662362","dp":3626,"de":0}},{"type":"Polygon","arcs":[[-5422,-8100,-3501,-8101,-5651,8101]],"properties":{"id":"24662363","dp":2313,"de":287}},{"type":"Polygon","arcs":[[-1251,-1314,-7964,-1264,-1258],[8102]],"properties":{"id":"24662115","dp":3939,"de":68855}},{"type":"Polygon","arcs":[[-8103]],"properties":{"id":"24662116","dp":16738,"de":73538}},{"type":"Polygon","arcs":[[8103,8104,8105,-3422,8106,8107]],"properties":{"id":"24662117","dp":2580,"de":0}},{"type":"Polygon","arcs":[[8108,-3423,-8106]],"properties":{"id":"24662118","dp":5803,"de":765}},{"type":"Polygon","arcs":[[-8105,8109,8110,-3424,-8109]],"properties":{"id":"24662119","dp":5864,"de":2286}},{"type":"Polygon","arcs":[[8111,-8110,-8104,8112]],"properties":{"id":"24662120","dp":5859,"de":0}},{"type":"Polygon","arcs":[[-2451,-2455,8113,-8112,8114]],"properties":{"id":"24662121","dp":7174,"de":0}},{"type":"MultiPolygon","arcs":[[[-8114,-2454,8115,-3425,-8111]],[[-2534,-6011,8116]]],"properties":{"id":"24662122","dp":2888,"de":196}},{"type":"Polygon","arcs":[[-2416,-2444,8117,-2447,-8115,-8113,-8108,8118]],"properties":{"id":"24662123","dp":3304,"de":512}},{"type":"Polygon","arcs":[[-2443,-2448,-8118]],"properties":{"id":"24662124","dp":10395,"de":0}},{"type":"Polygon","arcs":[[-3385,-3387,-3026,-2865,-2780,-213,8119]],"properties":{"id":"24662125","dp":15865,"de":2524}},{"type":"Polygon","arcs":[[-8120,-217,-220,-3202]],"properties":{"id":"24662126","dp":13625,"de":5500}},{"type":"Polygon","arcs":[[-2613,-2872,8120,-2601]],"properties":{"id":"24662127","dp":7707,"de":1115}},{"type":"Polygon","arcs":[[-2871,8121,-2592,8122,-8121]],"properties":{"id":"24662128","dp":8406,"de":2363}},{"type":"Polygon","arcs":[[-2602,-8123,-2591]],"properties":{"id":"24662129","dp":13488,"de":3685}},{"type":"Polygon","arcs":[[-7750,-7752,-7755,-7758,-2570,-2574,-2904]],"properties":{"id":"24662130","dp":5549,"de":9287}},{"type":"Polygon","arcs":[[-3609,-5956,8123,8124,-3604]],"properties":{"id":"24662444","dp":7695,"de":1810}},{"type":"Polygon","arcs":[[8125,-8124,-5955,-3510]],"properties":{"id":"24662445","dp":17926,"de":1295}},{"type":"Polygon","arcs":[[-3508,8126,8127]],"properties":{"id":"24662447","dp":12965,"de":0}},{"type":"Polygon","arcs":[[8128,-8126,-3509,-8128,8129,8130,8131]],"properties":{"id":"24662448","dp":22293,"de":0}},{"type":"Polygon","arcs":[[-8127,-3507,8132,-8130]],"properties":{"id":"24662449","dp":12234,"de":0}},{"type":"Polygon","arcs":[[-8131,-8133,-3513,8133,8134]],"properties":{"id":"24662450","dp":17622,"de":0}},{"type":"Polygon","arcs":[[-3512,-5954,8135,-8134]],"properties":{"id":"24662452","dp":27269,"de":0}},{"type":"Polygon","arcs":[[8136,-8136,-5953,8137]],"properties":{"id":"24662453","dp":24170,"de":2849}},{"type":"Polygon","arcs":[[8138,8139,-8138,-5952,-6037,-4358,8140]],"properties":{"id":"24662454","dp":12348,"de":910}},{"type":"Polygon","arcs":[[-8139,8141,8142]],"properties":{"id":"24662455","dp":11007,"de":0}},{"type":"Polygon","arcs":[[-3606,-8132,-8135,-8137,-8140,-8143,8143,-4363,8144]],"properties":{"id":"24662456","dp":7475,"de":1288}},{"type":"Polygon","arcs":[[-8142,-8141,-4357,-4364,-8144]],"properties":{"id":"24662457","dp":9683,"de":0}},{"type":"Polygon","arcs":[[8145,-3607,-8145,-4371,8146]],"properties":{"id":"24662458","dp":2625,"de":905}},{"type":"Polygon","arcs":[[8147,-8147,-4370,-4543,-4551]],"properties":{"id":"24662459","dp":3126,"de":0}},{"type":"Polygon","arcs":[[-7893,-3480]],"properties":{"id":"24661723","dp":14498,"de":1781}},{"type":"Polygon","arcs":[[8148,-852,-846,-8011,-7785,8149]],"properties":{"id":"24662154","dp":8850,"de":2331}},{"type":"Polygon","arcs":[[-2309,8150,8151,8152,8153,-8150,-7784]],"properties":{"id":"24662155","dp":13151,"de":2675}},{"type":"Polygon","arcs":[[8154,-8151,-2308]],"properties":{"id":"24662156","dp":5806,"de":1663}},{"type":"Polygon","arcs":[[8155,8156,-8152,-8155,-2307]],"properties":{"id":"24662157","dp":13811,"de":1647}},{"type":"Polygon","arcs":[[8157,-8156,-2306]],"properties":{"id":"24662158","dp":8404,"de":1033}},{"type":"Polygon","arcs":[[-2305,-987,-8153,-8157,-8158]],"properties":{"id":"24662159","dp":10089,"de":1485}},{"type":"Polygon","arcs":[[-986,8158,-853,-8149,-8154]],"properties":{"id":"24662160","dp":14163,"de":1951}},{"type":"Polygon","arcs":[[-960,-854,-8159]],"properties":{"id":"24662161","dp":14819,"de":2972}},{"type":"Polygon","arcs":[[8159,-7323,-7897,8160,8161,8162,8163,8164]],"properties":{"id":"24662475","dp":2046,"de":813}},{"type":"Polygon","arcs":[[8165,8166,-8163,8167]],"properties":{"id":"24662476","dp":11038,"de":5576}},{"type":"Polygon","arcs":[[8168,-8168,-8162,8169,8170,8171]],"properties":{"id":"24662477","dp":5435,"de":1136}},{"type":"Polygon","arcs":[[-8166,-8169,8172,-3452,8173]],"properties":{"id":"24662478","dp":17293,"de":2125}},{"type":"Polygon","arcs":[[-3453,-8173,-8172,8174]],"properties":{"id":"24662479","dp":3720,"de":3116}},{"type":"Polygon","arcs":[[-8175,-8171,8175,8176,8177,8178,-3454]],"properties":{"id":"24662480","dp":2279,"de":0}},{"type":"Polygon","arcs":[[-3407,8179,8180,8181,-8167,-8174,-3451]],"properties":{"id":"24662483","dp":10054,"de":1432}},{"type":"MultiPolygon","arcs":[[[-2114,8182,-7821,-6012,-1937,8183,-2106,-2110]],[[-4635,8184,-4624]]],"properties":{"id":"24662182","dp":2991,"de":455}},{"type":"Polygon","arcs":[[-1936,-2103,-8184]],"properties":{"id":"24662183","dp":9398,"de":0}},{"type":"Polygon","arcs":[[-5387,-6026,-7820,-7830,-7835,-1792,-1798,-5378,-5382]],"properties":{"id":"24662187","dp":2556,"de":5216}},{"type":"Polygon","arcs":[[-1780,-7838]],"properties":{"id":"24662192","dp":7263,"de":3092}},{"type":"Polygon","arcs":[[8185,8186,-3409,-3459,8187,8188]],"properties":{"id":"24662502","dp":13262,"de":658}},{"type":"Polygon","arcs":[[-3458,8189,-8188]],"properties":{"id":"24662503","dp":24772,"de":1893}},{"type":"Polygon","arcs":[[-8189,-8190,-3457,8190,8191,8192]],"properties":{"id":"24662504","dp":6754,"de":883}},{"type":"Polygon","arcs":[[-8192,8193,8194,8195,8196,8197]],"properties":{"id":"24662505","dp":4035,"de":1491}},{"type":"Polygon","arcs":[[-8191,-3456,8198,-8194]],"properties":{"id":"24662506","dp":4217,"de":1139}},{"type":"Polygon","arcs":[[8199,-8195,-8199,-3455,-8179,8200]],"properties":{"id":"24662507","dp":2845,"de":553}},{"type":"Polygon","arcs":[[8201,-8201,-8178,8202]],"properties":{"id":"24662508","dp":4187,"de":397}},{"type":"Polygon","arcs":[[8203,8204,-8203,8205,8206]],"properties":{"id":"24662509","dp":3635,"de":506}},{"type":"Polygon","arcs":[[8207,8208,-8207,8209]],"properties":{"id":"24662510","dp":5852,"de":0}},{"type":"Polygon","arcs":[[-8208,8210,8211]],"properties":{"id":"24662511","dp":10196,"de":0}},{"type":"Polygon","arcs":[[-3518,8212,8213,-8211,-8210,-8206,-8177,8214]],"properties":{"id":"24662512","dp":3717,"de":471}},{"type":"Polygon","arcs":[[8215,8216,-8213,-3517,8217]],"properties":{"id":"24662513","dp":6741,"de":561}},{"type":"Polygon","arcs":[[8218,8219,8220,-8218,-3516,8221]],"properties":{"id":"24662515","dp":5264,"de":1064}},{"type":"Polygon","arcs":[[8222,-8222,-3515,8223]],"properties":{"id":"24662516","dp":12660,"de":0}},{"type":"Polygon","arcs":[[8224,-5423,-8102,8225,-5927]],"properties":{"id":"24662364","dp":3878,"de":0}},{"type":"Polygon","arcs":[[-5928,-8226,-5654,-4941,-5932]],"properties":{"id":"24662365","dp":3614,"de":533}},{"type":"Polygon","arcs":[[-6690,-6692,-6683,8226,-3577,-7726]],"properties":{"id":"24662762","dp":1961,"de":5063}},{"type":"Polygon","arcs":[[-6680,8227,8228,-3578,-8227]],"properties":{"id":"24662763","dp":3052,"de":2800}},{"type":"Polygon","arcs":[[-6678,8229,8230,8231,-8228,-6679]],"properties":{"id":"24662764","dp":13112,"de":0}},{"type":"Polygon","arcs":[[8232,8233,8234,-6894,-3579,-8229,-8232]],"properties":{"id":"24662765","dp":3211,"de":601}},{"type":"Polygon","arcs":[[-8235,8235,8236,-6890]],"properties":{"id":"24662766","dp":21261,"de":0}},{"type":"Polygon","arcs":[[8237,8238,-8236,-8234]],"properties":{"id":"24662767","dp":21181,"de":0}},{"type":"Polygon","arcs":[[8239,8240,8241,-8238,-8233,-8231]],"properties":{"id":"24662768","dp":20216,"de":0}},{"type":"Polygon","arcs":[[8242,-3488,-3757,-3754,-3750]],"properties":{"id":"24661725","dp":2004,"de":984}},{"type":"Polygon","arcs":[[-3486,8243]],"properties":{"id":"24661726","dp":5105,"de":645}},{"type":"Polygon","arcs":[[-3487,-8244,-3485,-3953,-3758]],"properties":{"id":"24661727","dp":374,"de":2802}},{"type":"Polygon","arcs":[[-2344,-1774,8244,-6109,8245,8246,8247,8248,8249,8250,8251,-2334,-2335]],"properties":{"id":"24662218","dp":2745,"de":251}},{"type":"Polygon","arcs":[[8252,8253,-2331,-8252]],"properties":{"id":"24662219","dp":3553,"de":1027}},{"type":"Polygon","arcs":[[-8251,8254,8255,-8253]],"properties":{"id":"24662220","dp":7736,"de":2389}},{"type":"Polygon","arcs":[[8256,-8255,-8250,8257,8258]],"properties":{"id":"24662221","dp":3659,"de":615}},{"type":"Polygon","arcs":[[-8258,-8249,8259]],"properties":{"id":"24662222","dp":3714,"de":314}},{"type":"Polygon","arcs":[[-8259,-8260,-8248,8260,8261]],"properties":{"id":"24662223","dp":3242,"de":340}},{"type":"Polygon","arcs":[[-8261,-8247,8262,8263,8264]],"properties":{"id":"24662224","dp":3237,"de":0}},{"type":"Polygon","arcs":[[8265,-8262,-8265,8266,8267,8268]],"properties":{"id":"24662225","dp":3984,"de":580}},{"type":"Polygon","arcs":[[8269,-8269,8270]],"properties":{"id":"24662226","dp":2941,"de":514}},{"type":"Polygon","arcs":[[8271,8272,-8270,8273]],"properties":{"id":"24662227","dp":3996,"de":375}},{"type":"Polygon","arcs":[[-3548,8274,8275,-8274,-8271,-8268,8276,8277,-2034]],"properties":{"id":"24662228","dp":2285,"de":420}},{"type":"Polygon","arcs":[[-2332,-8254,8278,-8272,-8276,8279,-2329]],"properties":{"id":"24662229","dp":2847,"de":0}},{"type":"Polygon","arcs":[[-8256,-8257,-8266,-8273,-8279]],"properties":{"id":"24662230","dp":4047,"de":288}},{"type":"Polygon","arcs":[[-8280,-8275,-3547,-2330]],"properties":{"id":"24662231","dp":4144,"de":0}},{"type":"Polygon","arcs":[[8280,-8277,-8267,-8264]],"properties":{"id":"24662232","dp":8497,"de":0}},{"type":"Polygon","arcs":[[8281,8282,8283,8284,8285,-6378,-6385,-1528,-8278,-8281]],"properties":{"id":"24662233","dp":3857,"de":2193}},{"type":"Polygon","arcs":[[-5939,-4953,8286,-7996,-5942]],"properties":{"id":"24662371","dp":3734,"de":345}},{"type":"Polygon","arcs":[[8287,-8074,-8065,-8060]],"properties":{"id":"24662649","dp":14951,"de":4206}},{"type":"Polygon","arcs":[[8288,8289,-8288,8290]],"properties":{"id":"24662650","dp":6849,"de":940}},{"type":"Polygon","arcs":[[-6420,8291,-8291,-8059,-6422]],"properties":{"id":"24662651","dp":12148,"de":5177}},{"type":"Polygon","arcs":[[-6419,-6416,8292,8293,-8289,-8292]],"properties":{"id":"24662652","dp":6103,"de":878}},{"type":"Polygon","arcs":[[-8294,8294,8295,8296]],"properties":{"id":"24662653","dp":13477,"de":2954}},{"type":"Polygon","arcs":[[8297,8298,8299,-8295,-8293,-6415]],"properties":{"id":"24662654","dp":6030,"de":2576}},{"type":"Polygon","arcs":[[-8300,8300,8301,8302,-8296]],"properties":{"id":"24662655","dp":13144,"de":1417}},{"type":"Polygon","arcs":[[8303,8304,-8301,-8299]],"properties":{"id":"24662656","dp":12317,"de":0}},{"type":"Polygon","arcs":[[8305,8306,8307,-8302,-8305]],"properties":{"id":"24662657","dp":8948,"de":1091}},{"type":"Polygon","arcs":[[8308,8309,-6198,8310,8311,8312,-8307]],"properties":{"id":"24662658","dp":5459,"de":5550}},{"type":"Polygon","arcs":[[-8312,8313,8314]],"properties":{"id":"24662659","dp":18298,"de":1030}},{"type":"Polygon","arcs":[[-8297,-8303,-8308,-8313,-8315,8315,-8070,-8290]],"properties":{"id":"24662660","dp":3396,"de":3403}},{"type":"Polygon","arcs":[[-8316,8316,8317,8318,-8071]],"properties":{"id":"24662661","dp":6433,"de":1689}},{"type":"Polygon","arcs":[[-7997,-8287,-4952,-5640,-5636,8319,-7991,-7994]],"properties":{"id":"24662372","dp":3937,"de":493}},{"type":"Polygon","arcs":[[-5635,8320,-8320]],"properties":{"id":"24662373","dp":5025,"de":0}},{"type":"Polygon","arcs":[[-5629,8321,-7989,-8321]],"properties":{"id":"24662374","dp":3065,"de":963}},{"type":"Polygon","arcs":[[-5628,8322,8323,8324,-7984,-8322]],"properties":{"id":"24662375","dp":4733,"de":658}},{"type":"Polygon","arcs":[[-5623,-5614,8325,-8323,-5627]],"properties":{"id":"24662376","dp":2997,"de":581}},{"type":"Polygon","arcs":[[8326,-8324,-8326,-5613,-5606,8327]],"properties":{"id":"24662377","dp":3448,"de":446}},{"type":"Polygon","arcs":[[-7985,-8325,-8327,8328,8329]],"properties":{"id":"24662378","dp":3647,"de":0}},{"type":"Polygon","arcs":[[8330,-8329,-8328,-5612,8331]],"properties":{"id":"24662379","dp":3241,"de":0}},{"type":"Polygon","arcs":[[-7986,-8330,-8331,8332,8333]],"properties":{"id":"24662380","dp":3099,"de":0}},{"type":"Polygon","arcs":[[8334,8335,-8333,-8332,-5611,-5603]],"properties":{"id":"24662381","dp":4255,"de":0}},{"type":"Polygon","arcs":[[-7987,-8334,-8336,8336,-7982]],"properties":{"id":"24662382","dp":3573,"de":0}},{"type":"Polygon","arcs":[[-8335,-5602,-5600,-7983,-8337]],"properties":{"id":"24662383","dp":3995,"de":490}},{"type":"Polygon","arcs":[[8337,8338,8339,8340]],"properties":{"id":"24662795","dp":6055,"de":628}},{"type":"Polygon","arcs":[[8341,8342,-8341,8343,-6849]],"properties":{"id":"24662796","dp":5903,"de":2245}},{"type":"Polygon","arcs":[[8344,-8342,8345]],"properties":{"id":"24662797","dp":12400,"de":1473}},{"type":"Polygon","arcs":[[-6513,8346,-6507,-8338,-8343,-8345,8347,-6518]],"properties":{"id":"24662798","dp":7111,"de":1268}},{"type":"Polygon","arcs":[[-6512,-6502,-8347]],"properties":{"id":"24662799","dp":7366,"de":0}},{"type":"Polygon","arcs":[[-6519,-8348,-8346,-6848,8348,-6852]],"properties":{"id":"24662800","dp":6167,"de":623}},{"type":"Polygon","arcs":[[-8349,-6846,-6853]],"properties":{"id":"24662801","dp":10099,"de":2871}},{"type":"Polygon","arcs":[[-3611,8349,-3601,-8146,-8148,-4550]],"properties":{"id":"24662460","dp":3895,"de":1150}},{"type":"Polygon","arcs":[[-5935,-5941,-5944,-7995,-8000,8350,8351]],"properties":{"id":"24662390","dp":2804,"de":400}},{"type":"Polygon","arcs":[[-5304,-5302,8352,8353,-8351,-7999,-5579]],"properties":{"id":"24662391","dp":4464,"de":876}},{"type":"Polygon","arcs":[[-5287,8354,8355,8356,-8353,-5301,-5289]],"properties":{"id":"24662392","dp":5260,"de":660}},{"type":"Polygon","arcs":[[8357,8358,8359,-8356]],"properties":{"id":"24662393","dp":3702,"de":0}},{"type":"Polygon","arcs":[[8360,8361,-8358,-8355,-5286,8362]],"properties":{"id":"24662394","dp":4310,"de":282}},{"type":"Polygon","arcs":[[-5930,-5937,8363,-8359,-8362,8364]],"properties":{"id":"24662395","dp":3556,"de":466}},{"type":"Polygon","arcs":[[-5936,-8352,-8354,-8357,-8360,-8364]],"properties":{"id":"24662396","dp":3551,"de":0}},{"type":"Polygon","arcs":[[-5407,-5419,-5424,-8225,-5931,-8365,-8361,8365]],"properties":{"id":"24662397","dp":1083,"de":645}},{"type":"Polygon","arcs":[[-8366,-8363,8366,8367,-5408]],"properties":{"id":"24662398","dp":3300,"de":828}},{"type":"Polygon","arcs":[[-8367,-5285,8368,8369]],"properties":{"id":"24662399","dp":5645,"de":931}},{"type":"Polygon","arcs":[[-8368,-8370,8370,8371,8372,8373,-5411]],"properties":{"id":"24662400","dp":5122,"de":1226}},{"type":"Polygon","arcs":[[-8371,-8369,-5284,-5278,-5283,8374,8375]],"properties":{"id":"24662401","dp":3008,"de":531}},{"type":"Polygon","arcs":[[-8372,-8376,8376]],"properties":{"id":"24662402","dp":9081,"de":0}},{"type":"Polygon","arcs":[[-8028,8377,-8373,-8377,-8375,-5282,-8039,-8033]],"properties":{"id":"24662403","dp":6617,"de":0}},{"type":"Polygon","arcs":[[-5412,-8374,-8378,-8027]],"properties":{"id":"24662404","dp":9221,"de":0}},{"type":"Polygon","arcs":[[-3582,-6946,-6898,8378]],"properties":{"id":"24662822","dp":3355,"de":0}},{"type":"Polygon","arcs":[[-8379,-6897,-882,8379]],"properties":{"id":"24662823","dp":4159,"de":0}},{"type":"Polygon","arcs":[[-3583,-8380,-881,8380,-6943,-6945]],"properties":{"id":"24662824","dp":5738,"de":0}},{"type":"Polygon","arcs":[[-6937,-6944,-8381,-880,8381]],"properties":{"id":"24662825","dp":4732,"de":0}},{"type":"Polygon","arcs":[[-6938,-8382,-884,8382]],"properties":{"id":"24662826","dp":9033,"de":0}},{"type":"Polygon","arcs":[[-8383,-879,8383,-6939]],"properties":{"id":"24662827","dp":8535,"de":656}},{"type":"Polygon","arcs":[[-8384,-875,8384,-6941]],"properties":{"id":"24662828","dp":4735,"de":0}},{"type":"Polygon","arcs":[[-8385,-874,-869,-6748,-6749,-6752]],"properties":{"id":"24662829","dp":6797,"de":0}},{"type":"Polygon","arcs":[[8385,8386,-8051,-5159]],"properties":{"id":"24662417","dp":9238,"de":538}},{"type":"Polygon","arcs":[[-5155,8387,-5158,-3444]],"properties":{"id":"24662418","dp":8750,"de":0}},{"type":"Polygon","arcs":[[8388,-8386,-8388,-5154,-5975]],"properties":{"id":"24662419","dp":6129,"de":0}},{"type":"Polygon","arcs":[[-8032,-8036,-8038,-8041,-8048,-8050,-8387,-8389,-5974,8389]],"properties":{"id":"24662420","dp":539,"de":159}},{"type":"Polygon","arcs":[[-5957,-1531,-1526,-1524,-1520,-1519,-1513,8390,-5403,-8026,-3503,-8030,-8390,-5973]],"properties":{"id":"24662421","dp":93,"de":1414}},{"type":"Polygon","arcs":[[-1512,8391,8392,-6588,-6582,-6587,-6591,-5392,-8391]],"properties":{"id":"24662422","dp":1808,"de":351}},{"type":"Polygon","arcs":[[8393,-6589,-8393]],"properties":{"id":"24662423","dp":2362,"de":0}},{"type":"Polygon","arcs":[[-6574,-6580,-6590,-8394,-8392,-1511,-1504]],"properties":{"id":"24662424","dp":2937,"de":0}},{"type":"Polygon","arcs":[[-1932,-7717,-3522,-1610,-1615,-1617,-1619,-1622,-1627,-6930,8394,8395,-7094,-7101,-1404,-1410,-1423]],"properties":{"id":"24662849","dp":137,"de":2719}},{"type":"Polygon","arcs":[[8396,-8395,-6929,-6921,-6761,-6758,8397]],"properties":{"id":"24662850","dp":1660,"de":2564}},{"type":"Polygon","arcs":[[8398,-8398,-2084,8399,8400,8401]],"properties":{"id":"24662851","dp":6271,"de":2103}},{"type":"Polygon","arcs":[[-8400,-2087,-2090,8402,8403]],"properties":{"id":"24662852","dp":7329,"de":1475}},{"type":"Polygon","arcs":[[-8404,8404,8405,-8401]],"properties":{"id":"24662853","dp":8669,"de":0}},{"type":"Polygon","arcs":[[8406,-8405,-8403,-2093,8407,8408]],"properties":{"id":"24662854","dp":7892,"de":0}},{"type":"Polygon","arcs":[[-8402,-8406,-8407,8409,8410]],"properties":{"id":"24662855","dp":8326,"de":0}},{"type":"Polygon","arcs":[[8411,-8410,-8409,8412,-6711]],"properties":{"id":"24662856","dp":5615,"de":0}},{"type":"Polygon","arcs":[[-8408,-6723,-6712,-8413]],"properties":{"id":"24662857","dp":6407,"de":1388}},{"type":"Polygon","arcs":[[-8314,-8311,-6197,8413,-8317]],"properties":{"id":"24662662","dp":7637,"de":1026}},{"type":"Polygon","arcs":[[-8318,-8414,-6196,-6494,8414]],"properties":{"id":"24662663","dp":11495,"de":0}},{"type":"Polygon","arcs":[[-8319,-8415,-6493,8415,8416,-8072]],"properties":{"id":"24662664","dp":9173,"de":0}},{"type":"Polygon","arcs":[[-8416,-6495,8417,8418]],"properties":{"id":"24662665","dp":10692,"de":1207}},{"type":"Polygon","arcs":[[-8073,-8417,-8419,8419,-7315,-8069]],"properties":{"id":"24662666","dp":6614,"de":1566}},{"type":"Polygon","arcs":[[-8420,8420,8421,-7310,-7313]],"properties":{"id":"24662667","dp":7802,"de":1121}},{"type":"Polygon","arcs":[[-8418,-6287,8422,8423,-8421]],"properties":{"id":"24662668","dp":8275,"de":1793}},{"type":"Polygon","arcs":[[-7311,-8422,-8424,8424,-6285,-6294,-6301]],"properties":{"id":"24662669","dp":8402,"de":1341}},{"type":"Polygon","arcs":[[-6286,-8425,-8423]],"properties":{"id":"24662670","dp":7604,"de":0}},{"type":"Polygon","arcs":[[-6335,-6330,8425,8426,-5697]],"properties":{"id":"24663047","dp":2602,"de":2169}},{"type":"Polygon","arcs":[[-5694,-5698,-8427,8427,8428]],"properties":{"id":"24663048","dp":3553,"de":419}},{"type":"Polygon","arcs":[[-6843,-6837,-5663,-5695,-8429,8429]],"properties":{"id":"24663049","dp":4050,"de":746}},{"type":"Polygon","arcs":[[8430,8431,8432,-8241]],"properties":{"id":"24662769","dp":25506,"de":0}},{"type":"Polygon","arcs":[[8433,-8432,8434,8435]],"properties":{"id":"24662770","dp":21375,"de":0}},{"type":"Polygon","arcs":[[8436,-8436,8437,8438]],"properties":{"id":"24662771","dp":20604,"de":0}},{"type":"Polygon","arcs":[[-6671,-8438,-8435,-8431,-8240,-8230,-6677]],"properties":{"id":"24662772","dp":16165,"de":0}},{"type":"Polygon","arcs":[[-8437,8439,8440,-8237,-8239,-8242,-8433,-8434]],"properties":{"id":"24662773","dp":23203,"de":0}},{"type":"Polygon","arcs":[[8441,8442,8443,8444,8445,-6891,-8441]],"properties":{"id":"24662774","dp":23203,"de":0}},{"type":"Polygon","arcs":[[8446,-6886,-6892,-8446]],"properties":{"id":"24662775","dp":10721,"de":0}},{"type":"Polygon","arcs":[[-8445,8447,-6887,-8447]],"properties":{"id":"24662776","dp":19648,"de":0}},{"type":"Polygon","arcs":[[-8444,8448,-6888,-8448]],"properties":{"id":"24662777","dp":17637,"de":0}},{"type":"Polygon","arcs":[[8449,-6889,-8449,-8443]],"properties":{"id":"24662778","dp":17371,"de":1359}},{"type":"Polygon","arcs":[[-8450,-8442,8450,8451,8452,-6884]],"properties":{"id":"24662779","dp":16058,"de":0}},{"type":"Polygon","arcs":[[8453,8454,-8452]],"properties":{"id":"24662780","dp":11947,"de":0}},{"type":"Polygon","arcs":[[-8453,-8455,8455,-6871,-6874,-6881]],"properties":{"id":"24662781","dp":16317,"de":0}},{"type":"Polygon","arcs":[[-8454,-8451,-8440,-8439,-6670,-6668,-7723,8456,8457,-8456]],"properties":{"id":"24662782","dp":4226,"de":2476}},{"type":"Polygon","arcs":[[8458,-6867,-6868,-8458]],"properties":{"id":"24662783","dp":6920,"de":1739}},{"type":"Polygon","arcs":[[-7722,-7720,8459,8460,-8459,-8457]],"properties":{"id":"24662784","dp":6180,"de":431}},{"type":"Polygon","arcs":[[-8461,8461,8462,-6862,-6865]],"properties":{"id":"24662785","dp":6323,"de":0}},{"type":"Polygon","arcs":[[-7719,8463,8464,8465,-8462,-8460]],"properties":{"id":"24662786","dp":3458,"de":468}},{"type":"Polygon","arcs":[[-3610,-3602,-8350]],"properties":{"id":"24662461","dp":4240,"de":0}},{"type":"Polygon","arcs":[[-8125,-8129,-3605]],"properties":{"id":"24662463","dp":11983,"de":0}},{"type":"Polygon","arcs":[[-5967,8466,8467,-6032]],"properties":{"id":"24662465","dp":5102,"de":759}},{"type":"Polygon","arcs":[[-5966,-5979,-7329,8468,8469,-8467]],"properties":{"id":"24662466","dp":4620,"de":338}},{"type":"Polygon","arcs":[[8470,8471,-8469,-7328,-7325,8472]],"properties":{"id":"24662467","dp":2391,"de":0}},{"type":"Polygon","arcs":[[8473,-8471,8474,8475,8476,8477,8478]],"properties":{"id":"24662468","dp":4822,"de":559}},{"type":"Polygon","arcs":[[-8473,8479,-8475]],"properties":{"id":"24662469","dp":3556,"de":564}},{"type":"Polygon","arcs":[[8480,-8480,-7324,-8160,8481,8482]],"properties":{"id":"24662470","dp":3623,"de":279}},{"type":"Polygon","arcs":[[8483,-8476,-8481,8484]],"properties":{"id":"24662471","dp":7373,"de":0}},{"type":"Polygon","arcs":[[8485,-8485,-8483,8486]],"properties":{"id":"24662472","dp":5387,"de":0}},{"type":"Polygon","arcs":[[8487,-8484,-8486,8488]],"properties":{"id":"24662473","dp":12297,"de":0}},{"type":"Polygon","arcs":[[8489,-8489,-8487,-8482,-8165,8490]],"properties":{"id":"24662474","dp":4198,"de":270}},{"type":"Polygon","arcs":[[-6810,8491,-912,-910,-6832,-6827,-6822]],"properties":{"id":"24662897","dp":3813,"de":123}},{"type":"Polygon","arcs":[[8492,-913,-8492,-6809]],"properties":{"id":"24662898","dp":4568,"de":568}},{"type":"Polygon","arcs":[[8493,-907,-8493,-6808,8494]],"properties":{"id":"24662899","dp":2107,"de":1585}},{"type":"Polygon","arcs":[[8495,8496,-902,-904,-8494]],"properties":{"id":"24662900","dp":4924,"de":665}},{"type":"Polygon","arcs":[[-8497,8497,-6731,8498,-897,-903]],"properties":{"id":"24662901","dp":2928,"de":1075}},{"type":"Polygon","arcs":[[-898,-8499,-6735,-887,-893]],"properties":{"id":"24662902","dp":2286,"de":710}},{"type":"Polygon","arcs":[[-7096,8499,-6717,-6722,-8498,-8496,-8495,-6807]],"properties":{"id":"24662903","dp":521,"de":1841}},{"type":"Polygon","arcs":[[-8396,-8397,-8399,-8411,-8412,-6715,-6718,-8500,-7095]],"properties":{"id":"24662904","dp":812,"de":707}},{"type":"Polygon","arcs":[[8500,-8284]],"properties":{"id":"24662234","dp":14190,"de":0}},{"type":"Polygon","arcs":[[8501,-8285,-8501,-8283]],"properties":{"id":"24662235","dp":16380,"de":3095}},{"type":"Polygon","arcs":[[8502,-8181,8503]],"properties":{"id":"24662484","dp":19962,"de":1492}},{"type":"Polygon","arcs":[[8504,8505,-8491,-8164,-8182,-8503,8506,-3405]],"properties":{"id":"24662485","dp":5838,"de":1651}},{"type":"Polygon","arcs":[[-8507,-8504,-8180,-3406]],"properties":{"id":"24662486","dp":14878,"de":0}},{"type":"Polygon","arcs":[[-8187,8507,-3410]],"properties":{"id":"24662489","dp":9876,"de":2160}},{"type":"Polygon","arcs":[[8508,-8508,8509,-4335]],"properties":{"id":"24662490","dp":19199,"de":0}},{"type":"Polygon","arcs":[[-8509,8510,-3411]],"properties":{"id":"24662491","dp":34928,"de":0}},{"type":"Polygon","arcs":[[-3402,-8511,-4334,-5997,8511]],"properties":{"id":"24662492","dp":12140,"de":0}},{"type":"Polygon","arcs":[[8512,-8470,-8472,-8474,8513,8514,8515,8516,-3403,-8512,-5996,-6034]],"properties":{"id":"24662493","dp":1490,"de":1459}},{"type":"Polygon","arcs":[[-8468,-8513,-6033]],"properties":{"id":"24662494","dp":4528,"de":1570}},{"type":"Polygon","arcs":[[-8514,-8479,8517,8518]],"properties":{"id":"24662495","dp":9017,"de":0}},{"type":"Polygon","arcs":[[-8478,8519,8520,-8518]],"properties":{"id":"24662496","dp":8538,"de":0}},{"type":"Polygon","arcs":[[-8515,-8519,-8521,8521,8522]],"properties":{"id":"24662497","dp":7138,"de":0}},{"type":"Polygon","arcs":[[-8522,-8520,-8477,-8488,8523]],"properties":{"id":"24662498","dp":6698,"de":0}},{"type":"Polygon","arcs":[[8524,-8516,-8523,-8524,-8490,-8506]],"properties":{"id":"24662499","dp":2859,"de":0}},{"type":"Polygon","arcs":[[-8517,-8525,-8505,-3404]],"properties":{"id":"24662500","dp":5176,"de":1158}},{"type":"Polygon","arcs":[[-8510,-8186,8525,-4336]],"properties":{"id":"24662501","dp":7973,"de":460}},{"type":"Polygon","arcs":[[8526,8527,8528,8529,-1144,-7120,-7121]],"properties":{"id":"24662919","dp":3474,"de":1285}},{"type":"Polygon","arcs":[[8530,-8527,-7122,-7116,-7107]],"properties":{"id":"24662920","dp":5565,"de":1180}},{"type":"Polygon","arcs":[[-6997,8531,-8528,-8531,-7106,-7097,-6805,8532,-7144,-7142]],"properties":{"id":"24662921","dp":173,"de":1649}},{"type":"Polygon","arcs":[[-8529,-8532,-7001,8533,8534,8535]],"properties":{"id":"24662922","dp":6053,"de":1490}},{"type":"Polygon","arcs":[[-8530,-8536,8536,-1145]],"properties":{"id":"24662923","dp":3874,"de":0}},{"type":"Polygon","arcs":[[-8537,-8535,8537,-1146]],"properties":{"id":"24662924","dp":10460,"de":0}},{"type":"Polygon","arcs":[[-8534,8538,-1151,-1147,-8538]],"properties":{"id":"24662925","dp":8115,"de":687}},{"type":"Polygon","arcs":[[-8539,-7000,8539,-3789]],"properties":{"id":"24662926","dp":10821,"de":0}},{"type":"Polygon","arcs":[[-6999,-6996,-3782,-8540]],"properties":{"id":"24662927","dp":7975,"de":0}},{"type":"Polygon","arcs":[[8540,8541,8542,-3520,8543,-2349,8544,8545,8546,8547]],"properties":{"id":"24662518","dp":3065,"de":950}},{"type":"Polygon","arcs":[[-2386,-2397,8548,-3514,-8543,8549,8550,-2388]],"properties":{"id":"24662519","dp":1466,"de":1851}},{"type":"Polygon","arcs":[[-8550,-8542,8551]],"properties":{"id":"24662520","dp":6465,"de":0}},{"type":"Polygon","arcs":[[-8551,-8552,-8541,8552,-2373,-2389]],"properties":{"id":"24662521","dp":6449,"de":464}},{"type":"Polygon","arcs":[[-8553,-8548,8553,-2374]],"properties":{"id":"24662522","dp":7862,"de":703}},{"type":"Polygon","arcs":[[-8554,-8547,8554,-2375]],"properties":{"id":"24662523","dp":9225,"de":1320}},{"type":"Polygon","arcs":[[-8555,-8546,8555,-2369]],"properties":{"id":"24662524","dp":9885,"de":1575}},{"type":"Polygon","arcs":[[-8556,-8545,-2348,8556,-2366]],"properties":{"id":"24662525","dp":5619,"de":1733}},{"type":"Polygon","arcs":[[-8557,-2347,8557,-2359]],"properties":{"id":"24662526","dp":7254,"de":751}},{"type":"Polygon","arcs":[[-8558,-2346,-2360]],"properties":{"id":"24662527","dp":8389,"de":4424}},{"type":"Polygon","arcs":[[-7147,-7145,-8533,-6821,8558,8559,8560,-6815,-6829,-6831,8561,-1139,-1128]],"properties":{"id":"24662936","dp":292,"de":277}},{"type":"Polygon","arcs":[[-6820,8562,-8559]],"properties":{"id":"24662937","dp":3045,"de":0}},{"type":"Polygon","arcs":[[8563,8564,-8560,-8563,-6819]],"properties":{"id":"24662938","dp":626,"de":553}},{"type":"Polygon","arcs":[[-6818,8565,-6816,8566,-8564]],"properties":{"id":"24662939","dp":4716,"de":212}},{"type":"Polygon","arcs":[[-8561,-8565,-8567]],"properties":{"id":"24662940","dp":7082,"de":0}},{"type":"Polygon","arcs":[[-6817,-8566]],"properties":{"id":"24662941","dp":8629,"de":0}},{"type":"Polygon","arcs":[[-6647,8567,-8464,-7718,-6652]],"properties":{"id":"24662787","dp":10380,"de":0}},{"type":"Polygon","arcs":[[8568,-8465,-8568,-6646]],"properties":{"id":"24662788","dp":7279,"de":0}},{"type":"Polygon","arcs":[[-8569,-6645,-6642,-6630,8569,8570,8571,-6863,-8463,-8466]],"properties":{"id":"24662789","dp":3669,"de":1229}},{"type":"Polygon","arcs":[[-6625,-6850,-8344,8572,-8570,-6627]],"properties":{"id":"24662790","dp":4535,"de":608}},{"type":"Polygon","arcs":[[-8340,8573,8574,-8571,-8573]],"properties":{"id":"24662791","dp":7766,"de":431}},{"type":"Polygon","arcs":[[-8575,8575,8576,-8572]],"properties":{"id":"24662792","dp":7101,"de":0}},{"type":"Polygon","arcs":[[8577,-6855,-6864,-8577]],"properties":{"id":"24662793","dp":8053,"de":0}},{"type":"Polygon","arcs":[[-8574,-8339,-6506,8578,-6856,-8578,-8576]],"properties":{"id":"24662794","dp":4649,"de":521}},{"type":"Polygon","arcs":[[-7249,-5125,8579,8580]],"properties":{"id":"24661448","dp":19959,"de":1829}},{"type":"Polygon","arcs":[[-7250,-8581,8581,-7257]],"properties":{"id":"24661449","dp":16301,"de":2397}},{"type":"Polygon","arcs":[[-8582,8582,-7189,-7703]],"properties":{"id":"24661450","dp":14756,"de":2951}},{"type":"Polygon","arcs":[[-8580,8583,-7187,-8583]],"properties":{"id":"24661451","dp":16106,"de":2663}},{"type":"Polygon","arcs":[[8584,-7185,-8584,-5124]],"properties":{"id":"24661452","dp":12818,"de":5369}},{"type":"Polygon","arcs":[[8585,-7186,-8585,-5123,-5121]],"properties":{"id":"24661453","dp":11920,"de":6989}},{"type":"Polygon","arcs":[[8586,-7079,-8586,-5117,-7736]],"properties":{"id":"24661454","dp":11504,"de":7619}},{"type":"Polygon","arcs":[[-7075,-8587,-7735,8587]],"properties":{"id":"24661455","dp":12901,"de":4948}},{"type":"Polygon","arcs":[[-7055,-7067,-7069,-8588,-7733]],"properties":{"id":"24661456","dp":13718,"de":5895}},{"type":"Polygon","arcs":[[-8246,-6112,8588,-6367,-6376,-8286,-8502,-8282,-8263]],"properties":{"id":"24662236","dp":1511,"de":4086}},{"type":"Polygon","arcs":[[-6111,8589,-6108,-6368,-8589]],"properties":{"id":"24662237","dp":3294,"de":422}},{"type":"Polygon","arcs":[[-1098,8590,-1118,-1116]],"properties":{"id":"24662556","dp":11476,"de":0}},{"type":"Polygon","arcs":[[8591,8592,-8205,8593,8594,-1119,-8591,-1097]],"properties":{"id":"24662557","dp":4123,"de":3292}},{"type":"Polygon","arcs":[[8595,-8595,8596,8597]],"properties":{"id":"24662558","dp":8326,"de":0}},{"type":"Polygon","arcs":[[-8598,8598,8599,8600]],"properties":{"id":"24662559","dp":5288,"de":613}},{"type":"Polygon","arcs":[[8601,-8214,-8217,-8599]],"properties":{"id":"24662560","dp":12432,"de":720}},{"type":"Polygon","arcs":[[-8204,-8209,-8212,-8602,-8597,-8594]],"properties":{"id":"24662561","dp":9287,"de":2833}},{"type":"Polygon","arcs":[[-8600,-8216,-8221,8602]],"properties":{"id":"24662562","dp":8028,"de":976}},{"type":"Polygon","arcs":[[-2402,8603,-8603,-8220,8604]],"properties":{"id":"24662563","dp":8239,"de":4731}},{"type":"Polygon","arcs":[[-1120,-8596,-8601,-8604,-2406]],"properties":{"id":"24662564","dp":4582,"de":474}},{"type":"Polygon","arcs":[[-2395,-2403,-8605,-8219,-8223,8605]],"properties":{"id":"24662565","dp":3355,"de":610}},{"type":"Polygon","arcs":[[-2396,-8606,-8224,-8549]],"properties":{"id":"24662566","dp":3272,"de":0}},{"type":"Polygon","arcs":[[-8196,-8200,-8202,-8593,8606]],"properties":{"id":"24662567","dp":3434,"de":622}},{"type":"Polygon","arcs":[[8607,-8197,-8607,-8592,8608]],"properties":{"id":"24662568","dp":3493,"de":565}},{"type":"Polygon","arcs":[[-4328,8609,-8198,-8608,8610]],"properties":{"id":"24662569","dp":6037,"de":1204}},{"type":"Polygon","arcs":[[-3970,-3979,-4329,-8611,-8609,-1107,-5783]],"properties":{"id":"24662570","dp":2161,"de":753}},{"type":"Polygon","arcs":[[-4337,-8526,-8193,-8610,-4332]],"properties":{"id":"24662571","dp":8681,"de":0}},{"type":"Polygon","arcs":[[-2356,8611,-7289]],"properties":{"id":"24662572","dp":9447,"de":1142}},{"type":"Polygon","arcs":[[-8612,-2352,8612,8613,-7290]],"properties":{"id":"24662573","dp":9425,"de":2156}},{"type":"Polygon","arcs":[[-8614,8614,8615,8616]],"properties":{"id":"24662574","dp":7817,"de":7025}},{"type":"Polygon","arcs":[[8617,8618,-8615,-8613,-2351,8619,-8309,-8306,-8304]],"properties":{"id":"24662575","dp":2838,"de":1164}},{"type":"Polygon","arcs":[[-8616,-8619,8620,8621]],"properties":{"id":"24662576","dp":10968,"de":0}},{"type":"Polygon","arcs":[[-7282,8622,-8621,-8618,-8298]],"properties":{"id":"24662577","dp":9951,"de":1539}},{"type":"Polygon","arcs":[[-7291,-8617,-8622,-8623,-7281,-7285]],"properties":{"id":"24662578","dp":8510,"de":5229}}]}},"arcs":[[[7594,1708],[19,-83],[3,-12]],[[7616,1613],[-16,-5],[-10,-3]],[[7590,1605],[-3,12],[-2,11],[-6,28],[-7,33],[-3,12]],[[7569,1701],[25,7]],[[7554,1595],[-2,11],[-16,73],[-3,11]],[[7533,1690],[17,5],[19,6]],[[7590,1605],[-19,-6],[-17,-4]],[[7517,1685],[16,5]],[[7554,1595],[-18,-6]],[[7536,1589],[-2,12],[-15,73],[-2,11]],[[7518,1584],[-18,-5]],[[7500,1579],[-3,10],[-6,33],[-12,52]],[[7479,1674],[20,6]],[[7499,1680],[18,5]],[[7536,1589],[-18,-5]],[[7443,1562],[-2,10],[-7,31],[-2,12],[19,5],[-10,43],[19,6],[19,5]],[[7500,1579],[-19,-6]],[[7481,1573],[-19,-5],[-19,-6]],[[7443,1562],[-18,-5]],[[7425,1557],[-2,10],[-6,31],[-2,12],[-4,19],[-3,10],[-2,7],[-2,1]],[[7404,1647],[1,1],[10,20],[14,29],[2,3]],[[7431,1700],[16,-11],[24,7],[3,1],[5,-23]],[[7431,1700],[29,59],[-3,11]],[[7457,1770],[11,3],[11,3]],[[7479,1776],[3,-12],[15,-72],[2,-12]],[[7479,1776],[18,5]],[[7497,1781],[16,5]],[[7513,1786],[2,-12],[16,-72],[2,-12]],[[7513,1786],[17,5]],[[7530,1791],[19,5]],[[7549,1796],[2,-11],[16,-72],[2,-12]],[[7549,1796],[24,7]],[[7573,1803],[21,-95]],[[7573,1803],[22,7],[19,6]],[[7614,1816],[2,-11],[4,-17],[2,-10]],[[7622,1778],[6,-23],[2,-11],[3,-13],[2,-10]],[[7635,1721],[-18,-6],[-23,-7]],[[7662,1777],[4,-15],[2,-10],[2,-11],[2,-8]],[[7672,1733],[-9,-3],[-9,-3],[2,-11],[13,-56],[7,2],[2,0],[10,0]],[[7688,1662],[3,-12],[3,-12],[-9,-4],[-10,-3]],[[7675,1631],[-18,-5]],[[7657,1626],[-2,10],[-8,34],[-9,40],[-3,11]],[[7622,1778],[19,6],[2,-9],[7,2],[2,0],[10,0]],[[7735,1704],[-1,-22],[-1,-23]],[[7733,1659],[-11,1],[-34,2]],[[7672,1733],[1,-3],[63,-4]],[[7736,1726],[-1,-11],[0,-11]],[[7662,1777],[14,-1],[32,-2],[10,-1],[21,-1],[11,-1]],[[7750,1771],[1,-4]],[[7751,1767],[-1,-10],[-10,-6],[-3,-3],[-1,-11],[0,-11]],[[7808,1698],[-73,6]],[[7751,1767],[65,-4]],[[7816,1763],[-1,-20],[-5,0],[0,-11],[-1,-11],[-1,-11],[0,-12]],[[7750,1771],[1,17],[1,10]],[[7752,1798],[0,10]],[[7752,1808],[66,-4]],[[7818,1804],[-1,-21],[-1,-20]],[[7752,1808],[1,15],[0,6],[1,21],[1,6]],[[7755,1856],[1,17],[0,4],[1,20]],[[7757,1897],[4,-1],[36,-3],[15,-1],[11,-1]],[[7823,1891],[-2,-23],[-1,-23]],[[7820,1845],[-1,-21],[-1,-20]],[[7902,1819],[-8,-30],[-11,-32]],[[7883,1757],[-3,2],[-64,4]],[[7820,1845],[11,0],[38,-3],[9,-1],[-1,-20],[22,-2],[3,0]],[[7823,1891],[10,-1],[37,-2],[1,0],[10,-1],[1,27],[1,30],[1,15],[1,14]],[[7885,1973],[9,0],[10,-1],[3,0]],[[7907,1972],[4,-40],[1,-20]],[[7912,1912],[0,-8],[-2,-28],[-3,-28],[-5,-29]],[[7823,1891],[1,27],[2,30],[-11,0],[-6,1],[2,29]],[[7811,1978],[5,0],[10,-1]],[[7826,1977],[11,0],[5,-1],[9,0],[34,-3]],[[7757,1897],[1,21],[1,5],[0,16]],[[7759,1939],[1,14],[0,6],[2,24]],[[7762,1983],[9,-1],[1,0],[30,-3],[9,-1]],[[7762,1983],[1,29]],[[7763,2012],[2,29]],[[7765,2041],[11,-1],[5,0],[49,-4]],[[7830,2036],[-2,-29],[-2,-30]],[[7717,1942],[1,20],[1,23],[2,30]],[[7721,2015],[9,-1],[24,-1],[9,-1]],[[7759,1939],[-9,0],[-24,2],[-9,1]],[[7674,2018],[1,12],[0,17]],[[7675,2047],[48,-3],[38,-3],[4,0]],[[7721,2015],[-9,0],[-22,2],[-7,0],[-9,1]],[[7671,1945],[1,21]],[[7672,1966],[1,21]],[[7673,1987],[1,21],[0,10]],[[7717,1942],[-9,0],[-28,3],[-9,0]],[[7672,1966],[-9,0],[-70,6]],[[7593,1972],[-3,10],[-2,10],[75,-4],[1,0],[9,-1]],[[7593,1972],[-14,-5]],[[7579,1967],[-7,34]],[[7572,2001],[-3,11],[0,9],[-4,10]],[[7565,2031],[7,6],[23,22],[1,3],[-1,2],[2,7],[3,4],[7,8]],[[7607,2083],[6,-7],[4,-3],[23,-17],[9,-7],[26,-2]],[[7583,1952],[-4,15]],[[7671,1945],[-9,1],[-19,2],[-45,3],[-15,1]],[[7592,1912],[-2,10],[-7,30]],[[7671,1945],[-1,-20],[-2,-21]],[[7668,1904],[-8,1],[-50,3],[-3,8],[-15,-4]],[[7551,1899],[-2,5],[-7,35],[11,3],[11,4],[-11,49],[9,3],[10,3]],[[7592,1912],[-19,-6],[-11,-4],[-11,-3]],[[6769,2744],[-8,6],[-44,32],[-9,7]],[[6708,2789],[10,19],[6,11]],[[6724,2819],[20,-16],[21,-15],[6,11],[7,13]],[[6778,2812],[20,-16],[-12,-23],[-6,-11],[-7,-13],[-4,-5]],[[6744,2698],[-14,11],[-47,35]],[[6683,2744],[12,22],[13,23]],[[6769,2744],[-12,-24],[-6,-11],[-7,-11]],[[6818,2644],[-31,22],[-4,4],[-39,28]],[[6778,2812],[-7,7],[1,2],[1,2],[2,4]],[[6775,2827],[61,-45]],[[6836,2782],[40,-30]],[[6876,2752],[-1,-4],[-2,-3],[-8,-14],[-6,-13],[-13,-23]],[[6846,2695],[-16,-29],[-12,-22]],[[6818,2644],[-7,-13]],[[6811,2631],[-73,56]],[[6738,2687],[6,11]],[[6787,2558],[-23,-1],[-16,3]],[[6748,2560],[6,11],[3,15],[-23,5],[-23,6],[-22,15],[-20,14]],[[6669,2626],[9,13],[9,7],[18,6],[14,-1],[13,24],[6,12]],[[6811,2631],[-6,-11],[-12,-21],[-7,-15],[0,-14],[1,-12]],[[6872,2507],[-3,-1],[-24,-14]],[[6845,2492],[-20,-11],[-11,-3],[-8,-2],[-15,-1]],[[6791,2475],[-1,26],[0,3],[-2,26],[18,2],[5,2],[6,3],[7,6],[-18,13],[-5,2],[-5,1],[-9,-1]],[[6811,2631],[27,-20],[36,-27],[3,-2]],[[6877,2582],[-6,-10],[-12,-22],[-13,-24],[16,-12],[10,-7]],[[6736,2472],[-8,5],[-26,6],[-25,11]],[[6677,2494],[19,20],[2,2],[24,20],[16,11],[10,13]],[[6791,2475],[-28,-2],[-27,-1]],[[6864,2373],[-89,66],[-36,26],[-3,7]],[[6845,2492],[59,-43]],[[6904,2449],[-12,-23],[-13,-24]],[[6879,2402],[-13,-25],[-2,-4]],[[6831,2309],[-90,66]],[[6741,2375],[-59,44]],[[6682,2419],[17,18],[16,18],[16,16],[5,1]],[[6864,2373],[-11,-20]],[[6853,2353],[-12,-21],[-4,-10],[-6,-13]],[[6831,2309],[-11,-22],[-30,22],[-18,-17],[37,-26]],[[6809,2266],[-6,-10],[-11,-14]],[[6792,2242],[-15,11],[-5,-1],[-14,9],[-7,0],[-38,24]],[[6713,2285],[10,20],[2,13],[0,25],[4,10],[12,22]],[[6888,2268],[-11,-22],[-12,-21]],[[6865,2225],[-56,41]],[[6831,2309],[57,-41]],[[6853,2353],[45,-34],[11,-8]],[[6909,2311],[-11,-20],[-10,-23]],[[6879,2402],[56,-41]],[[6935,2361],[-13,-25],[-13,-25]],[[6904,2449],[56,-42]],[[6960,2407],[-12,-23],[-13,-23]],[[6999,2314],[-64,47]],[[6960,2407],[64,-48]],[[7024,2359],[-12,-22],[-13,-23]],[[6960,2407],[6,10],[5,11],[11,19]],[[6982,2447],[64,-48]],[[7046,2399],[-10,-20],[-6,-10],[-6,-10]],[[6982,2447],[11,19]],[[6993,2466],[11,20]],[[7004,2486],[64,-48]],[[7068,2438],[-11,-20],[-11,-19]],[[7004,2486],[10,20],[11,20]],[[7025,2526],[11,-7]],[[7036,2519],[53,-41]],[[7089,2478],[-10,-20],[-11,-20]],[[7167,2476],[-2,-2],[-2,2],[-1,0],[-1,0],[-2,-2],[-1,-4],[-17,-31]],[[7141,2439],[-18,13],[-16,13],[-18,13]],[[7036,2519],[9,19],[55,-41],[11,20],[5,10],[2,2],[2,5],[2,3],[2,4]],[[7124,2541],[5,-8],[10,-20],[5,-9],[1,0],[5,-8],[7,-9],[5,-5],[5,-6]],[[7025,2526],[-9,7],[-13,11],[-1,3]],[[7002,2547],[5,0],[14,4],[7,3],[5,2]],[[7033,2556],[5,4],[6,5],[4,3],[5,8]],[[7053,2576],[11,20],[3,4],[2,4],[1,3]],[[7070,2607],[5,-3],[6,-5],[7,-7],[5,-5],[9,-10],[5,-7],[4,-6],[2,-3],[7,-12],[4,-8]],[[7234,2415],[-4,3],[-11,9],[-8,8],[-10,8],[-6,7],[-7,7],[-18,16],[-3,3]],[[7070,2607],[2,4]],[[7072,2611],[8,-6],[11,-8],[14,-13],[26,-31],[12,-8]],[[7143,2545],[5,-4],[17,-13],[51,-38]],[[7216,2490],[41,-31]],[[7257,2459],[-9,-18],[-3,-6]],[[7245,2435],[-1,-1],[-6,-12],[-3,-5],[-1,-2]],[[7272,2574],[42,-32]],[[7314,2542],[-7,-9],[-16,-20]],[[7291,2513],[-13,-19],[-11,-18]],[[7267,2476],[-10,-17]],[[7216,2490],[9,17],[10,18]],[[7235,2525],[7,9],[7,10],[-34,26],[10,17],[2,5],[37,-27],[6,7],[2,2]],[[7235,2525],[-73,55],[-10,-18],[-5,-10],[-4,-7]],[[7072,2611],[2,4],[1,4],[4,6],[5,8],[29,35],[19,20],[14,8],[1,0],[14,2],[15,-2],[11,-2],[6,1],[9,2]],[[7202,2697],[16,10],[4,3]],[[7222,2710],[43,-31],[9,-8],[-15,-39],[-8,-16],[-5,-9],[-5,-10],[5,-4],[8,-6],[7,-5],[11,-8]],[[7202,2697],[-13,10],[-4,3],[-25,19],[-5,3],[-5,6],[0,6],[-11,-1],[-11,-15]],[[7128,2728],[2,10],[-1,7],[-3,7],[-4,11],[-8,8],[-24,17]],[[7090,2788],[-6,22],[2,13]],[[7086,2823],[94,-70],[4,-2]],[[7184,2751],[-6,-11],[27,-17],[17,-13]],[[7060,2684],[-2,7],[-14,56],[-8,36],[-7,15],[-9,8]],[[7020,2806],[6,9],[9,5],[13,0],[10,-8],[32,-24]],[[7128,2728],[-14,-20],[-4,-6],[-20,-26],[-15,-2],[-15,10]],[[7060,2684],[-32,25],[-5,4]],[[7023,2713],[-36,28],[-7,6],[-1,1],[-13,7]],[[6966,2755],[31,58]],[[6997,2813],[4,7]],[[7001,2820],[19,-14]],[[7001,2820],[26,47]],[[7027,2867],[59,-44]],[[6997,2813],[-18,13],[-17,13]],[[6962,2839],[-16,12]],[[6946,2851],[30,54]],[[6976,2905],[16,-12],[17,-12],[18,-14]],[[8099,2087],[4,74]],[[8103,2161],[21,-1]],[[8124,2160],[22,-2]],[[8146,2158],[-4,-74]],[[8142,2084],[-21,2],[-22,1]],[[8146,2158],[21,-1]],[[8167,2157],[-3,-75],[-22,2]],[[8138,2014],[4,70]],[[8167,2157],[10,-1],[1,0],[2,0],[9,-1]],[[8189,2155],[-4,-74]],[[8185,2081],[-4,-71]],[[8181,2010],[-21,3],[-22,1]],[[7911,3064],[-4,5],[-6,5],[-4,4],[-3,3]],[[7894,3081],[22,34]],[[7916,3115],[13,-9],[1,0],[7,-5]],[[7937,3101],[-11,-17],[-6,-8],[-2,-2],[-2,-3],[-5,-7]],[[7894,3081],[-11,11],[-11,11]],[[7872,3103],[15,28]],[[7887,3131],[29,-16]],[[7072,2611],[-2,1],[-16,13],[-15,11],[20,37],[1,11]],[[7078,3651],[-13,-25]],[[7065,3626],[-6,5],[-5,2],[-13,8],[-13,5],[-6,4],[-1,-1],[0,-2],[-4,5],[-31,-1]],[[6986,3651],[16,28]],[[7002,3679],[3,-2],[5,-1],[5,-1],[6,0],[6,0]],[[7027,3675],[4,1],[6,-1],[7,-2],[7,-2],[8,-6],[19,-14]],[[6939,2583],[-44,33]],[[6895,2616],[11,20],[6,10]],[[6912,2646],[13,23],[14,27],[2,3],[1,4]],[[6942,2703],[45,-33]],[[6987,2670],[-2,-4],[-2,-3],[-7,-13],[-7,-13]],[[6969,2637],[-13,-22]],[[6956,2615],[-6,-12],[-11,-20]],[[8730,6185],[-9,-28]],[[8721,6157],[-8,-21],[-7,-21],[-8,-21],[-7,-22],[-7,-19],[-5,-13]],[[8679,6040],[-18,-52]],[[8661,5988],[-3,2],[-3,1],[-9,5],[-9,4],[8,22],[-40,22],[-9,5],[-40,22],[-9,-21]],[[8547,6050],[-16,8]],[[8531,6058],[8,22],[-53,29]],[[8486,6109],[-47,25]],[[8439,6134],[-2,2]],[[8437,6136],[48,122]],[[8485,6258],[58,-28],[2,23]],[[8545,6253],[100,-39],[3,9],[45,-26],[8,0],[3,0],[6,-1],[17,-10],[3,-1]],[[8565,5953],[-7,-19]],[[8558,5934],[-45,25],[-18,10]],[[8495,5969],[7,18],[-16,9],[-15,9]],[[8471,6005],[8,23],[12,27],[16,-9],[7,18],[1,3],[16,-9]],[[8547,6050],[16,-9],[-1,-3],[-7,-18],[-21,-50],[31,-17]],[[8634,5915],[-2,2],[-12,6],[-9,5],[-16,8],[-30,17]],[[8661,5988],[-2,-3],[-17,-48],[-8,-22]],[[8471,6005],[-33,17],[10,23],[18,45],[1,3]],[[8467,6093],[10,-5],[9,21]],[[8495,5969],[-6,-14],[-4,-8],[-1,-3],[-11,-16],[-8,-9],[-5,-11],[-7,-17]],[[8453,5891],[-40,22]],[[8413,5913],[-53,29]],[[8360,5942],[17,40]],[[8377,5982],[8,20],[9,22]],[[8394,6024],[8,19]],[[8402,6043],[20,-11],[27,65],[1,2],[1,3],[10,-6],[6,-3]],[[8402,6043],[28,67],[1,3]],[[8431,6113],[8,21]],[[8394,6024],[-2,1],[-20,11]],[[8372,6036],[8,19]],[[8380,6055],[27,68],[1,3],[21,-12],[2,-1]],[[8380,6055],[-16,8],[-16,8]],[[8348,6071],[28,69],[1,3],[-15,8]],[[8362,6151],[8,20],[54,-29],[13,-6]],[[9365,6386],[-13,5],[-12,4],[-9,3],[-34,16],[-9,4]],[[9288,6418],[-5,30],[-5,3],[-9,4],[-6,4],[-10,5],[-10,4],[-19,10],[-10,4]],[[9214,6482],[-10,6],[-5,2]],[[9199,6490],[4,12],[5,14]],[[9208,6516],[9,-4],[55,-28],[8,-3],[-4,29],[-2,26],[-2,27]],[[9272,6563],[9,-4],[7,-4],[10,-5],[10,-4],[-1,32],[0,4],[0,4],[1,2],[0,17],[0,24]],[[9308,6629],[9,-5],[12,-4],[4,-2]],[[9333,6618],[0,-25],[-2,-5],[-1,-4],[4,-11],[1,-8],[0,-11],[3,-21],[1,-26],[2,-9],[1,-8],[1,-10],[2,-7],[1,-10],[2,-11],[1,-8],[1,-6],[14,-35],[0,-9],[1,-8]],[[9208,6516],[9,23],[7,22]],[[9224,6561],[8,22],[9,-5],[21,-10],[10,-5]],[[9224,6561],[-9,4],[-32,16],[-1,0],[-9,4],[-5,4]],[[9168,6589],[7,21]],[[9175,6610],[4,14],[16,57]],[[9195,6681],[9,-3]],[[9204,6678],[4,-1],[6,-3],[40,-19],[4,-2],[8,-4],[2,-1],[37,-19],[3,0]],[[9175,6610],[-4,2],[-9,5],[-2,0],[-19,10],[-8,4]],[[9133,6631],[8,21],[7,22],[2,8],[6,17],[4,9],[5,14],[1,3]],[[9166,6725],[2,-1],[7,-3],[16,-8],[9,-4],[-8,-27],[3,-1]],[[9133,6631],[-11,5],[-22,11],[-9,4]],[[9091,6651],[7,22]],[[9098,6673],[9,22],[8,24],[10,26]],[[9125,6745],[8,-4],[23,-11],[10,-5]],[[9117,6588],[-10,5],[-3,2],[-20,9],[-9,5],[-9,4],[-23,11],[-9,5]],[[9034,6629],[8,21],[-9,5],[-23,11],[-9,4]],[[9001,6670],[7,21]],[[9008,6691],[9,-4],[9,-4],[14,-7],[9,-4],[10,-5],[22,-11],[10,-5]],[[9133,6631],[-8,-22],[-8,-21]],[[9098,6673],[-9,4],[-23,12],[-9,4],[8,22],[3,7],[6,18]],[[9074,6740],[9,25],[7,21]],[[9090,6786],[41,-19]],[[9131,6767],[-6,-22]],[[9090,6786],[-32,15],[-9,4]],[[9049,6805],[3,11],[3,9],[11,38]],[[9066,6863],[11,-3],[8,-4],[-4,-17],[10,-5],[14,-6],[8,-4],[22,-9],[9,-4]],[[9144,6811],[-6,-22],[-7,-22]],[[9144,6811],[7,23],[5,18]],[[9156,6852],[6,18]],[[9162,6870],[9,-2],[23,-8],[9,-2]],[[9203,6858],[2,-1],[6,-2],[2,0],[18,-5],[10,-3],[5,16],[5,17],[7,21],[3,-1]],[[9261,6900],[-10,-32],[-1,-4],[-32,-109],[-2,-7],[-21,-67]],[[9308,6629],[1,2],[1,24],[1,16],[2,13],[3,24],[-1,2],[-2,1],[-9,5],[-18,8],[-3,1],[-10,5]],[[9273,6730],[-13,5],[-26,12],[-11,5],[-4,-12],[-2,-12],[-2,-11],[-4,-13]],[[9211,6704],[-7,-26]],[[9261,6900],[6,-2],[-6,-21]],[[9261,6877],[-6,-17],[-5,-16],[-4,-15],[-4,-14],[9,-2],[23,-8],[7,-3],[3,0],[3,14],[2,7],[2,9],[3,17],[4,16]],[[9298,6865],[10,-3],[12,-3],[2,-1],[9,-2],[5,22],[-9,3],[-3,1],[3,11],[3,15],[3,12],[1,6],[0,1]],[[9334,6927],[14,-5],[12,-5],[13,-1]],[[9373,6916],[1,-2],[5,1],[2,0],[-1,-2],[-3,-1],[-1,-2],[3,-7],[0,-4],[-5,-21],[-2,-13],[-6,-26],[-7,-24],[-5,-12],[-1,-6],[-1,-7],[-2,-16],[-5,-18],[-4,-22],[0,-12],[-3,-16],[0,-12],[-2,-17],[-1,-3],[-2,-2],[-1,-2],[2,-3],[1,-8],[-2,-7],[0,-12],[0,-22]],[[9261,6877],[7,-3],[2,0],[17,-5],[1,-1],[10,-3]],[[9273,6730],[-3,-27],[-1,-27],[-9,4],[-4,2],[-34,17],[-2,0],[-9,5]],[[8763,5769],[-15,-41]],[[8748,5728],[-9,5],[-37,20],[-9,5]],[[8693,5758],[-9,5],[-22,13],[-9,5]],[[8653,5781],[-9,5],[-38,21],[-9,5]],[[8597,5812],[15,40]],[[8612,5852],[15,44]],[[8627,5896],[21,-12]],[[8648,5884],[-8,-21]],[[8640,5863],[-9,-21],[9,-5],[53,-29],[8,-5],[8,-4]],[[8709,5799],[9,-5],[9,-5]],[[8727,5789],[9,-5],[9,-5],[8,-5],[10,-5]],[[8920,5998],[-8,-21]],[[8912,5977],[-10,6],[-37,20],[-9,4],[-70,39],[-11,6]],[[8775,6052],[9,21],[8,20],[8,21]],[[8800,6114],[80,-44]],[[8880,6070],[-8,-21],[-8,-20],[10,-6],[36,-20],[10,-5]],[[8880,6070],[10,-6],[37,-20],[9,-5],[-4,-11],[-4,-8],[0,-3],[-6,-15],[-2,-4]],[[8892,5924],[-11,6],[-36,20],[-9,5]],[[8836,5955],[12,31],[-10,6],[-61,33],[-10,5]],[[8767,6030],[8,22]],[[8912,5977],[-8,-21],[-8,-19],[-4,-13]],[[8881,5881],[-51,27],[-10,6]],[[8820,5914],[7,19],[9,22]],[[8892,5924],[-6,-23],[-4,-17],[-1,-3]],[[8820,5914],[-10,6],[-59,32],[-10,5]],[[8741,5957],[-9,6],[-22,12],[-3,1]],[[8707,5976],[8,17],[1,1],[1,0],[22,-12],[10,-5],[6,22],[4,12],[8,19]],[[8707,5976],[-2,1],[-12,6],[-20,2],[-10,3],[-2,0]],[[8679,6040],[19,-10],[13,31],[19,-10],[27,-15],[10,-6]],[[8721,6157],[10,-6],[69,-37]],[[8927,5255],[-1,-2],[-1,-2],[0,-2],[-1,-1],[0,-2],[-10,-24],[-5,-12]],[[8909,5210],[-9,5],[-20,11],[-9,5],[-9,-23],[-5,-11],[-4,-12]],[[8853,5185],[-10,5],[-21,12],[-10,5]],[[8812,5207],[-51,27],[0,1]],[[8761,5235],[1,4],[18,56],[9,29],[1,2]],[[8790,5326],[2,-1],[29,-16],[26,-15],[3,-1],[1,-1],[23,-12],[15,-7],[34,-17],[4,-1]],[[8891,5163],[-29,17],[-9,5]],[[8909,5210],[-9,-23],[-5,-12],[-4,-12]],[[8882,5140],[-28,16],[-10,5]],[[8844,5161],[-10,5],[-21,12],[-10,5]],[[8803,5183],[9,24]],[[8891,5163],[-7,-18],[-2,-5]],[[8826,5114],[-10,5],[-21,12],[-10,6]],[[8785,5137],[9,23],[9,23]],[[8844,5161],[-9,-23],[-9,-24]],[[8864,5093],[-9,-23]],[[8855,5070],[-10,5],[-18,10],[-11,6]],[[8816,5091],[10,23]],[[8882,5140],[-8,-20],[-1,-3],[-9,-24]],[[8816,5091],[-9,5],[-22,12],[-10,5],[-10,6],[-31,17],[-3,1]],[[8731,5137],[7,25]],[[8738,5162],[1,0],[35,-20],[11,-5]],[[8738,5162],[8,24],[7,24],[8,25]],[[8432,5056],[-4,2],[-4,2],[-40,21],[-40,21]],[[8344,5102],[-76,40]],[[8268,5142],[-58,31]],[[8210,5173],[-57,30]],[[8153,5203],[-54,29]],[[8099,5232],[-37,20],[-15,8]],[[8047,5260],[7,12],[4,8]],[[8058,5280],[10,18],[10,18],[10,19]],[[8088,5335],[10,19],[10,18]],[[8108,5372],[10,19]],[[8118,5391],[10,19],[10,19]],[[8138,5429],[22,41],[19,35]],[[8179,5505],[8,15],[10,17],[2,3]],[[8199,5540],[72,-39],[20,-11],[64,-35],[31,-16],[21,-12],[25,-13],[3,-2]],[[8435,5412],[-1,-4],[-2,-14],[-1,-5],[0,-11],[2,-53],[1,-55],[2,-58],[1,-36],[1,-44],[-1,-19],[-2,-36],[-3,-21]],[[8592,4282],[-59,38]],[[8533,4320],[-26,16],[-28,18],[-2,2]],[[8477,4356],[8,19],[8,20],[8,19]],[[8501,4414],[7,20],[8,19],[8,20]],[[8524,4473],[7,19],[3,5],[1,2],[9,23],[1,3]],[[8545,4525],[8,-5],[10,-10],[10,-15],[7,-14],[20,-41]],[[8600,4440],[33,-61],[4,-10],[1,-2],[1,-2],[2,-5],[2,-5],[25,-9]],[[8668,4346],[-7,-30],[-4,-19],[-4,-19],[-4,-18],[-27,2],[-30,20]],[[8499,4267],[-49,37]],[[8450,4304],[9,16]],[[8459,4320],[10,19],[7,14],[1,3]],[[8533,4320],[-10,-19],[-10,-19],[-4,2],[-5,-8],[-5,-9]],[[8470,4214],[-13,10],[-11,9],[-11,8],[12,18],[0,7],[1,2],[5,8],[-14,11]],[[8439,4287],[5,8],[6,9]],[[8499,4267],[-4,-9],[-5,-9]],[[8490,4249],[-5,-8],[-10,-17],[-5,-10]],[[8408,4151],[-23,18],[-8,6],[-3,0]],[[8374,4175],[12,21],[14,24],[19,33]],[[8419,4253],[17,28],[3,6]],[[8470,4214],[-6,-16],[-11,-19],[-22,-38],[-13,10],[-10,0]],[[9675,8212],[-4,2],[-4,1],[-2,1]],[[9665,8216],[-2,1],[-40,14],[-3,1]],[[9620,8232],[6,27],[5,28]],[[9631,8287],[4,22],[11,-3],[6,1],[2,5],[-1,15]],[[9653,8327],[-5,47]],[[9648,8374],[-1,14]],[[9647,8388],[10,-3],[51,-13],[6,-14],[5,-22],[4,-19],[1,-5]],[[9724,8312],[-7,-3],[-34,9],[-4,0],[-1,-2],[1,-7],[-13,-2],[4,-43]],[[9670,8264],[4,-34],[1,-11],[0,-7]],[[9669,8164],[-17,5],[-7,18],[-1,2],[-2,2],[-7,1],[-3,0],[-2,-2],[-7,-9],[-7,-12],[-4,-10],[-3,-11]],[[9609,8148],[-11,2],[-6,-1],[-14,-10],[-5,-6],[-1,-8],[1,-7],[-2,-13]],[[9571,8105],[-21,5],[5,27],[2,5],[6,11]],[[9563,8153],[7,5],[30,23],[7,8],[5,8],[3,8],[4,22],[1,5]],[[9665,8216],[0,-5],[4,-47]],[[9677,8082],[-11,-1],[-13,3],[3,16],[-4,34],[0,3],[-3,1],[-40,10]],[[9669,8164],[2,-23],[6,-59]],[[9677,8082],[2,-27],[0,-22],[1,-22]],[[9680,8011],[-61,15]],[[9619,8026],[5,21],[4,21],[-41,11],[4,21],[-20,5]],[[9690,8008],[-7,2],[-3,1]],[[9675,8212],[13,-4],[17,-5],[18,-4],[39,-10]],[[9762,8189],[0,-5],[-1,-10],[-2,-13],[-7,-26],[-19,-70],[-46,12],[1,-25],[1,-22],[1,-22]],[[9743,8257],[12,-29],[4,-20],[2,-8],[1,-11]],[[9670,8264],[13,2],[2,1],[1,1],[20,-5],[2,-1],[3,-2],[26,-6],[6,3]],[[9724,8312],[3,-13],[5,-12],[1,-5],[3,-6],[7,-19]],[[9775,8184],[-13,5]],[[9647,8388],[-1,10],[-2,22]],[[9644,8420],[5,-1],[16,-4],[18,-5],[10,-2]],[[9693,8408],[3,1],[35,-9],[3,0],[13,-1],[3,-1],[7,-1]],[[9757,8397],[2,-12],[7,-16],[3,-23],[3,-4],[3,-5],[2,-1],[1,0],[0,-1],[0,-2],[0,-1],[-3,-1],[-3,-3],[1,-9],[2,-8],[1,-8],[3,-23],[0,-2],[0,-11],[3,-12],[1,-28],[2,-5],[-1,-19],[2,-11],[-4,-4],[-7,-1],[0,-3]],[[9698,8655],[5,-5],[-1,-3],[2,-16],[2,-4],[5,-10],[0,-8],[3,-21],[5,-22],[2,-9],[3,-12],[3,-6],[1,-7],[2,-6],[3,-4],[3,-2],[7,-1],[0,-3],[-2,-4],[-3,-9],[-2,-2],[-2,-19],[1,-4],[6,-6],[2,-2],[3,-3],[1,-7],[-2,-10],[5,-20],[3,-21],[3,-10],[1,-2]],[[9693,8408],[-9,24],[-3,8],[-6,29],[-1,5],[-4,17],[-2,8]],[[9668,8499],[-3,23],[-2,10],[-6,40],[-5,39],[-4,29],[-4,28]],[[9644,8668],[31,-9],[3,1],[2,1],[1,1],[13,-6],[4,-1]],[[9775,8184],[0,-18],[-2,-30],[-2,-12],[-2,-7],[-1,-10],[-1,-8],[-4,-19],[-3,-8],[-2,-11],[-1,-7],[-6,-21],[-1,-9],[0,-24],[-1,-6]],[[9749,7994],[-24,5],[-9,2],[-26,7]],[[9774,7870],[-3,0],[-13,1],[1,2],[-21,5]],[[9738,7878],[-5,3],[-14,4],[-3,1],[-3,1],[-20,5],[-17,5]],[[9676,7897],[-5,1],[-3,1]],[[9668,7899],[4,25],[2,10],[1,10],[2,10],[1,11],[0,11],[1,13],[-64,16]],[[9615,8005],[4,21]],[[9749,7994],[0,-16],[-1,-2],[0,-8],[1,-9],[1,-2],[1,-3],[1,-21],[1,-4],[2,-4],[6,-6],[0,-4],[4,-9],[2,-8],[3,-10],[4,-8],[0,-10]],[[9679,7765],[-41,11]],[[9638,7776],[9,20],[10,21],[7,20]],[[9664,7837],[5,22],[1,3],[3,17],[2,15],[1,3]],[[9738,7878],[-3,-18],[-2,-16],[-5,-24],[-25,7],[-3,1],[-7,-21],[-7,-21],[-7,-21]],[[9652,7840],[-95,26]],[[9557,7866],[4,21],[8,36],[0,3]],[[9569,7926],[63,-17],[11,-3],[25,-7]],[[9664,7837],[-4,1],[-2,1],[-3,0],[-3,1]],[[9548,7822],[5,22],[4,22]],[[9652,7840],[-7,-20],[-4,-11],[-4,-10],[-89,23]],[[9534,7757],[2,8],[1,6],[2,8]],[[9539,7779],[4,22],[5,21]],[[9638,7776],[-11,-20],[-11,-21]],[[9616,7735],[-6,2],[-3,1],[-73,19]],[[9641,7660],[-58,16]],[[9583,7676],[7,12],[15,26],[11,21]],[[9679,7765],[-6,-21],[-6,-22],[-7,-24],[-4,-8],[-2,-5],[-6,-13],[-7,-12]],[[9521,7693],[3,14],[5,26],[5,24]],[[9583,7676],[-8,3],[-54,14]],[[9522,7584],[-22,6],[4,24],[5,23]],[[9509,7637],[5,23],[4,19],[3,14]],[[9641,7660],[-6,-9],[-13,-20],[-14,-21]],[[9608,7610],[-53,15],[-11,-22],[-12,-22]],[[9532,7581],[-6,1],[-4,2]],[[9522,7584],[-11,-20]],[[9511,7564],[-76,22]],[[9435,7586],[4,21],[5,23],[5,24],[60,-17]],[[9382,7601],[53,-15]],[[9511,7564],[-10,-18],[-10,-19],[-4,-8],[-6,-3],[-6,-2],[-4,0],[-6,0],[-7,1],[-39,10],[-53,16],[6,20],[5,19],[5,21]],[[9492,7435],[-13,-20],[-28,-40],[-12,-20],[-9,-16],[-8,-22],[-17,-49],[-12,-34],[-32,-95],[-11,-40],[-8,-28],[-4,-20],[-4,-15],[-16,-73],[-5,-24],[-1,-6]],[[9312,6933],[-32,9],[-5,2]],[[9275,6944],[-4,1],[-38,11],[-1,0]],[[9232,6956],[-42,12]],[[9190,6968],[-42,12]],[[9148,6980],[-43,10],[-42,12]],[[9063,7002],[-41,13]],[[9022,7015],[-3,1]],[[9019,7016],[0,1],[4,6],[37,117],[45,140],[15,71],[21,101],[5,13],[27,85],[13,42],[12,38],[2,8],[1,11],[6,20],[66,-17],[19,-5],[42,-12],[32,-9],[21,-5],[-5,-20]],[[9532,7581],[-11,-19],[-10,-18],[-34,-61],[-13,-23],[-8,-15],[36,-10]],[[6540,4618],[-62,30]],[[6478,4648],[7,19],[3,9],[4,11],[5,14],[6,17]],[[6503,4718],[61,-30]],[[6564,4688],[-6,-16],[-5,-14],[-3,-11],[-4,-9],[-6,-20]],[[6564,4688],[50,-24],[10,-3],[3,-1]],[[6627,4660],[-1,-3],[-6,-15],[-5,-14],[-3,-11],[-4,-9],[-3,-9],[-3,-10]],[[6602,4589],[-18,9],[-44,20]],[[8362,6151],[-1,-3],[-8,-20],[-27,14],[8,21],[1,3],[-22,12]],[[8313,6178],[8,21],[15,41],[31,82]],[[8367,6322],[4,11]],[[8371,6333],[114,-75]],[[6747,4747],[-10,-21],[-7,-12],[-2,-4],[-3,-8],[-7,-12],[0,-1],[-3,-7],[-5,-11],[-1,-3],[-1,-2],[-6,-17]],[[6702,4649],[0,1],[-1,0],[-2,1],[0,1],[-3,1],[-5,-2],[-7,-4],[-4,-3],[-4,-3],[-3,-1],[-2,0],[-4,1],[-18,9],[-22,10]],[[6503,4718],[-3,1],[-59,28],[-13,6],[-32,15]],[[6396,4768],[36,102],[6,17],[2,5],[1,3],[0,1],[5,14],[8,23]],[[6454,4933],[8,-4],[28,-13],[9,-4]],[[6499,4912],[-8,-23],[-3,-10],[-3,-9],[61,-29]],[[6546,4841],[61,-29]],[[6607,4812],[19,-9],[20,-9],[-4,-9],[-4,-13],[-4,-12],[22,-11]],[[6656,4749],[22,-10],[13,-6],[10,-5],[23,-11],[7,14],[5,9],[5,9],[1,-1],[2,0],[2,-1],[1,0]],[[6607,4812],[4,9],[3,10],[4,10],[3,9],[1,2]],[[6622,4852],[9,-4],[23,-11],[21,-10],[8,-4]],[[6683,4823],[-1,-2],[-3,-9],[-3,-10],[-4,-10],[-3,-9],[-4,-9],[-2,-7],[-2,-6],[-5,-12]],[[6546,4841],[3,9],[4,10],[3,10],[5,12]],[[6561,4882],[61,-30]],[[6561,4882],[5,17],[7,19],[6,18]],[[6579,4936],[62,-29]],[[6641,4907],[-7,-19],[-6,-19],[-1,-2],[-4,-13],[-1,-2]],[[6579,4936],[7,20],[4,11],[4,12]],[[6594,4979],[62,-28]],[[6656,4951],[-4,-13],[-4,-11],[-7,-20]],[[6561,4882],[-9,4],[-45,21],[-8,5]],[[6499,4912],[6,17],[6,19],[7,18],[6,19],[4,11],[5,13]],[[6533,5009],[61,-30]],[[6454,4933],[6,18]],[[6460,4951],[7,20],[4,11],[17,48]],[[6488,5030],[45,-21]],[[6460,4951],[-3,1],[-7,4],[-16,7],[-20,9],[2,6],[5,14],[3,9],[1,3]],[[6425,5004],[8,24],[5,12],[4,12]],[[6442,5052],[46,-22]],[[6396,4768],[-16,8],[-54,26]],[[6326,4802],[3,2],[2,3],[8,22],[1,3]],[[6340,4832],[10,25],[19,24],[3,4]],[[6372,4885],[15,18],[-2,4],[-57,28],[5,14],[4,12]],[[6337,4961],[5,12],[4,12],[4,12],[4,11],[8,23],[2,3]],[[6364,5034],[61,-30]],[[6364,5034],[-60,29],[-2,1]],[[6302,5064],[8,23],[9,25]],[[6319,5112],[11,-6],[50,-25]],[[6380,5081],[62,-29]],[[6337,4961],[-61,30]],[[6276,4991],[4,12],[5,12],[8,22],[7,22],[2,5]],[[6372,4885],[-3,1],[-22,11],[-22,11],[-13,6],[-54,27]],[[6258,4941],[9,23]],[[6267,4964],[5,14],[4,13]],[[6340,4832],[-3,2],[-50,25],[-34,17],[-16,8]],[[6237,4884],[9,25],[10,28],[2,4]],[[6326,4802],[-54,27]],[[6272,4829],[-19,10],[-27,13]],[[6226,4852],[6,17],[4,12],[1,3]],[[6253,4728],[-61,31]],[[6192,4759],[7,21],[8,22]],[[6207,4802],[8,21],[5,13],[6,16]],[[6272,4829],[-6,-16],[-5,-13]],[[6261,4800],[-8,-22],[5,-3],[10,-5],[-8,-21],[-7,-21]],[[6291,4708],[-7,3],[-1,1],[-30,16]],[[6261,4800],[54,-28],[-5,-13],[-4,-11],[-6,-16],[-1,-3],[-4,-11],[-4,-10]],[[6268,4661],[-14,7],[-20,10],[-61,30]],[[6173,4708],[2,7]],[[6175,4715],[8,22],[9,22]],[[6291,4708],[-1,-5],[-2,-7],[-8,-19],[-2,-3],[-10,-13]],[[6254,4623],[-1,0],[-95,46]],[[6158,4669],[3,8],[5,11],[2,8],[5,12]],[[6268,4661],[-7,-19],[-7,-19]],[[6225,4516],[3,22],[3,15],[3,12],[1,1],[3,10]],[[6238,4576],[5,14],[2,9],[8,20],[1,4]],[[6396,4768],[-3,-9],[-27,-75],[-16,-46],[-32,-93],[-2,-6],[-13,-38],[-2,-6]],[[6301,4495],[-2,0],[-18,5],[-28,8],[-8,2],[-20,6]],[[6238,4576],[-1,1],[-2,0],[-3,-10],[-8,4],[-5,3],[-43,21],[-16,7],[-5,-12],[-21,-25],[-14,4]],[[6120,4569],[12,32]],[[6132,4601],[5,11],[3,8],[6,19],[4,8],[4,11]],[[6154,4658],[4,11]],[[6225,4516],[-3,0],[-101,27],[-8,2]],[[6113,4545],[7,24]],[[6225,4516],[-3,-24],[-5,-38],[-4,-26]],[[6213,4428],[-4,1],[-17,0],[-13,-2],[-15,-5],[-14,-4]],[[6150,4418],[-2,13],[1,18]],[[6149,4449],[4,30]],[[6153,4479],[20,-5],[7,38],[-17,6],[-18,4],[-18,5],[-19,5]],[[6108,4532],[5,13]],[[6153,4479],[-20,9],[-17,8],[-17,9]],[[6099,4505],[-27,13],[-10,5],[-3,2],[0,2],[7,17],[42,-12]],[[6149,4449],[-55,27],[-5,2]],[[6089,4478],[10,27]],[[6150,4418],[-36,25],[-5,7],[-10,4],[-4,1],[-32,-5],[-26,-1],[-16,-7],[-5,10],[-12,24]],[[6004,4476],[14,-7],[2,0],[4,1],[3,1],[14,28],[1,1],[2,0],[31,-15],[14,-7]],[[6150,4418],[-50,-17],[1,-5]],[[6101,4396],[-18,-6],[-21,-7]],[[6062,4383],[-33,-10]],[[6029,4373],[-4,3],[-8,-3],[-1,2],[-5,16],[-7,13],[-24,17]],[[5980,4421],[13,26],[11,29]],[[7637,1518],[-21,95]],[[7616,1613],[22,7],[19,6]],[[7657,1626],[2,-11],[17,-74],[3,-11]],[[7679,1530],[-19,-6],[-11,-3],[-12,-3]],[[8505,6314],[9,-15],[1,-5],[-9,-21],[2,-4],[14,-8],[15,36],[1,2],[8,-12],[4,-5],[3,-2],[2,-1],[2,-3],[3,-1]],[[8560,6275],[-15,-22]],[[8371,6333],[10,28],[4,11],[10,24],[1,3]],[[8396,6399],[19,-10]],[[8415,6389],[49,-28]],[[8464,6361],[-1,-2],[-20,-51],[1,-3],[14,-8],[30,-18],[3,2],[6,16],[8,17]],[[8464,6361],[15,-8],[19,-10]],[[8498,6343],[-3,-3],[-6,-17],[16,-9]],[[8543,6376],[-4,-4],[-5,-6],[-4,-4],[-4,-3],[-3,-3],[-7,-4],[-14,-7],[-4,-2]],[[8415,6389],[17,34],[7,14],[2,3]],[[8441,6440],[52,-28],[5,-5],[4,4],[7,11]],[[8509,6422],[11,-8],[18,-10],[-8,-13],[0,-5],[13,-10]],[[8567,6293],[-7,-18]],[[8498,6343],[19,-11],[1,-1],[1,-1],[1,-2],[15,10],[23,-37],[3,-4],[3,-2],[3,-2]],[[8609,6408],[-14,-6],[-21,9],[-12,-31],[22,-13],[-4,-11],[7,-4]],[[8587,6352],[-13,-42],[-2,-4],[-5,-13]],[[8543,6376],[3,4],[7,12],[10,17],[13,22],[-45,31]],[[8531,6462],[2,2],[2,4],[2,4]],[[8537,6472],[0,-1],[4,-3],[3,-2],[6,-4],[4,-2],[5,-4],[4,-3],[41,-29],[9,-7],[1,0]],[[8614,6417],[-2,-4],[-2,-1],[-1,-4]],[[8609,6408],[14,-10],[-10,-26],[-2,-6],[1,-6],[3,-14],[1,-7],[-28,13],[-1,0]],[[8784,6337],[-1,-4],[-2,-6],[-5,-13],[-15,-43],[-6,-15],[-11,-33],[-12,-33],[-2,-5]],[[8614,6417],[7,-5],[7,-5],[3,-2],[9,-6],[6,-5],[10,-7],[10,-6],[7,-5],[8,-4],[7,-3],[7,-3],[7,-3],[13,-5],[7,-2],[3,-1],[2,0],[29,-9],[25,-8],[1,-1],[1,0],[1,0]],[[8786,6342],[-2,-5]],[[8614,6417],[1,7]],[[8615,6424],[2,-1],[24,-17],[8,-6],[7,-4],[9,-5],[18,44],[7,26],[2,10],[12,31]],[[8704,6502],[17,-9],[51,-26],[7,-3],[5,-2],[24,-13],[11,-5],[3,-1]],[[8822,6443],[-14,-39],[-6,-16],[-7,-21],[-1,-4],[-5,-12],[-3,-9]],[[8911,6419],[-6,-18]],[[8905,6401],[-17,8],[-19,-55],[16,-9],[-7,-20],[45,-23],[12,-7],[-10,3],[-8,4],[-16,7],[-19,5],[-44,13],[-8,3],[-37,10],[-7,2]],[[8822,6443],[7,18],[1,4],[21,57]],[[8851,6522],[9,-4],[10,-5],[-16,-43],[-2,-3],[-5,-15],[64,-33]],[[8918,6437],[-7,-18]],[[8851,6522],[8,22]],[[8859,6544],[9,-5],[32,-15],[41,-21]],[[8941,6503],[-8,-22],[-15,-44]],[[8802,6657],[-9,-25],[-8,-23],[36,-18],[5,-3],[8,24],[28,-14],[11,-5],[3,-2]],[[8876,6591],[-9,-23],[-8,-24]],[[8704,6502],[44,121],[4,12],[3,5],[5,11],[0,2]],[[8760,6653],[16,-11],[2,3],[4,-3],[7,17],[-1,4]],[[8788,6663],[5,-2],[9,-4]],[[8885,6616],[-9,-25]],[[8802,6657],[9,-5],[23,-11],[10,-5],[9,-4],[22,-11],[7,-3],[3,-2]],[[8911,6689],[-8,-23],[-9,-26],[-9,-24]],[[8802,6657],[8,24],[10,25]],[[8820,6706],[9,-4],[23,-11],[10,-5],[8,23],[9,-4],[19,-10],[3,-1],[7,-4],[3,-1]],[[8820,6706],[8,23],[8,22]],[[8836,6751],[8,21]],[[8844,6772],[9,-4],[23,-11],[9,-5],[9,-4],[23,-11],[7,-4],[3,-1]],[[8927,6732],[-8,-22],[-8,-21]],[[8934,6753],[-7,-21]],[[8844,6772],[8,22],[22,-11],[8,23],[8,22],[11,-5],[8,-4]],[[8909,6819],[8,-4],[11,-5],[11,-6],[9,-4],[2,-1]],[[8950,6799],[-8,-24],[-8,-22]],[[8921,6854],[-7,-19],[-5,-16]],[[8836,6751],[-30,14],[-10,5],[-23,12],[-16,13]],[[8757,6795],[-40,29],[-26,19]],[[8691,6843],[2,15],[4,17]],[[8697,6875],[5,20],[22,-8]],[[8724,6887],[37,-15]],[[8761,6872],[63,-24],[3,7],[1,2],[5,14]],[[8833,6871],[40,-18],[6,18],[32,-14],[10,-3]],[[8833,6871],[6,17]],[[8839,6888],[6,17],[6,20],[31,-10],[10,-3],[10,-3],[32,-12]],[[8934,6897],[-6,-24],[-7,-19]],[[8761,6872],[8,24],[5,19]],[[8774,6915],[10,-4],[45,-19],[10,-4]],[[8724,6887],[7,25],[7,24],[-60,23]],[[8678,6959],[7,24],[21,-9],[14,-6],[25,-8],[37,-13],[-1,-7],[-1,-8],[-4,-12],[-2,-5]],[[8697,6875],[-20,8]],[[8677,6883],[6,20],[-19,7],[7,25],[7,24]],[[8677,6883],[-19,9],[-11,4],[-34,22],[6,9],[8,24],[-6,9],[3,8],[-10,4],[-6,-1]],[[8608,6971],[3,15],[5,-3],[62,-24]],[[8691,6843],[4,-15],[10,-7],[-5,-8]],[[8700,6813],[-15,10],[-37,27]],[[8648,6850],[1,3],[4,13],[0,6],[-68,48]],[[8585,6920],[-71,51]],[[8514,6971],[10,20]],[[8524,6991],[8,15],[7,14]],[[8539,7020],[52,-37]],[[8591,6983],[0,-5],[13,-8],[4,1]],[[8631,6817],[-3,2],[-1,-3],[-35,26],[-36,25]],[[8556,6867],[2,3],[9,18],[8,14],[10,18]],[[8648,6850],[-1,-2],[-7,-13],[-9,-18]],[[8631,6817],[-2,-3],[-8,-17],[-7,-16],[-1,-3]],[[8613,6778],[-3,2],[-17,8],[-24,13],[-18,9],[-17,8],[-19,10],[-18,8],[-2,1],[-15,8]],[[8480,6845],[10,24],[10,22],[6,12]],[[8506,6903],[24,-17],[26,-19]],[[6775,2827],[-12,9],[-13,9],[-9,7]],[[6741,2852],[2,4],[8,18],[10,17]],[[6761,2891],[35,-26]],[[6796,2865],[-10,-17],[-9,-17],[-1,-2],[-1,-2]],[[6724,2819],[-21,15],[6,11],[3,5],[5,10],[20,-15],[2,4],[2,3]],[[7230,1149],[-6,-29],[-4,-21]],[[7220,1099],[-59,16],[-4,-23]],[[7157,1092],[-16,4]],[[7141,1096],[-2,1]],[[7139,1097],[4,21]],[[7143,1118],[9,20],[13,33]],[[7165,1171],[10,-7],[18,-6],[18,-5],[19,-4]],[[7210,1077],[-33,10]],[[7177,1087],[-18,4],[-2,1]],[[7220,1099],[-4,-12],[-6,-10]],[[7177,1087],[-7,-34],[25,-1],[-12,-21]],[[7183,1031],[-35,0],[-20,0]],[[7128,1031],[13,65]],[[7188,963],[-1,0],[-2,1],[-23,-1],[-8,0]],[[7154,963],[-10,1]],[[7144,964],[-49,1]],[[7095,965],[0,24],[11,0],[1,21]],[[7107,1010],[63,0],[13,21]],[[7210,1077],[37,-9],[-1,-5],[-58,-100]],[[7107,1010],[3,21]],[[7110,1031],[18,0]],[[7110,1031],[5,28],[4,20],[-51,11],[7,24]],[[7075,1114],[10,-3]],[[7085,1111],[39,-10],[15,-4]],[[7095,965],[-51,0]],[[7044,965],[-5,0],[-7,1],[-7,1]],[[7025,967],[6,23],[20,-1],[16,57],[-19,2],[-2,-8],[-11,3]],[[7035,1043],[2,7],[21,70]],[[7058,1120],[10,-4],[7,-2]],[[7025,967],[-17,6],[-24,10]],[[6984,983],[-17,7]],[[6967,990],[15,53],[3,5],[5,4],[8,3],[7,0],[13,-5],[17,-7]],[[6967,990],[-32,12],[-7,2],[-3,0]],[[6925,1004],[7,7],[6,7],[3,4],[7,12]],[[6948,1034],[67,103]],[[7015,1137],[2,-1],[24,-10],[9,-3],[8,-3]],[[6948,1034],[-2,2],[-24,20]],[[6922,1056],[-14,11]],[[6908,1067],[10,17],[11,18]],[[6929,1102],[11,16],[11,17]],[[6951,1135],[11,17],[14,-11],[12,17]],[[6988,1158],[24,-19],[3,-2]],[[6951,1135],[-44,33]],[[6907,1168],[9,17]],[[6916,1185],[19,-13],[10,17]],[[6945,1189],[43,-31]],[[6929,1102],[-41,30]],[[6888,1132],[9,18]],[[6897,1150],[10,18]],[[6908,1067],[-39,29]],[[6869,1096],[9,19],[10,17]],[[6869,1096],[-32,23]],[[6837,1119],[6,21],[5,20],[7,22]],[[6855,1182],[42,-32]],[[6922,1056],[-10,-16]],[[6912,1040],[-81,59]],[[6831,1099],[6,20]],[[6912,1040],[-14,-22],[-20,15],[-7,-12],[-52,39],[4,13],[8,26]],[[6925,1004],[-9,-8],[-10,-7],[-33,-20],[-23,-14],[-21,-12]],[[6829,943],[-2,2],[-8,13],[-12,16],[-8,12],[-4,3],[-10,17]],[[6785,1006],[-9,13],[-4,7]],[[6772,1026],[-4,4],[-7,12],[-5,8],[-8,12],[-3,5],[-5,7],[-38,57]],[[6702,1131],[-1,4],[-9,15],[-9,13],[-9,14],[-4,6],[-11,17],[-4,6],[-1,1],[-7,10],[-4,5],[-18,24],[-5,8],[-10,19],[-3,8],[-1,1]],[[6606,1282],[4,3],[6,2],[48,32],[23,17],[40,25],[54,36],[48,30]],[[6829,1427],[3,-5],[4,-3],[11,-9],[53,-41],[43,-31],[-12,-17]],[[6931,1321],[-11,-15],[-12,-16]],[[6908,1290],[-12,-15],[-12,-16],[-12,-15]],[[6872,1244],[-12,-16],[-13,-16],[13,-10],[-5,-20]],[[6872,1244],[38,-28],[-10,-19],[16,-12]],[[6908,1290],[51,-37]],[[6959,1253],[-10,-16],[-11,-17],[16,-12]],[[6954,1208],[-9,-19]],[[6931,1321],[48,-36]],[[6979,1285],[-10,-15],[-10,-17]],[[7009,1262],[-40,-64]],[[6969,1198],[-15,10]],[[6979,1285],[17,-12],[13,-11]],[[7009,1262],[16,-11]],[[7025,1251],[-41,-65],[-15,12]],[[7079,1236],[-29,-45],[-35,-54]],[[7025,1251],[16,-13],[10,19],[25,-19],[3,-2]],[[7111,1185],[-24,19],[-11,-18],[27,-20],[-15,-34],[-3,-21]],[[7079,1236],[9,-6],[32,-26],[-9,-19]],[[8252,1733],[-17,-43],[-3,-12],[-6,-11],[-4,-12],[-9,-19],[-4,-10]],[[8209,1626],[-34,1]],[[8175,1627],[-11,0],[-4,1]],[[8160,1628],[0,9],[1,11],[1,17]],[[8162,1665],[1,19],[2,25]],[[8165,1709],[1,29],[0,3]],[[8166,1741],[35,-2],[4,-3],[47,-3]],[[8166,1741],[2,25]],[[8168,1766],[56,-5],[12,22],[5,10],[3,11]],[[8244,1804],[5,18]],[[8249,1822],[4,20]],[[8253,1842],[1,19]],[[8254,1861],[2,27]],[[8256,1888],[54,-14],[1,1]],[[8311,1875],[-12,-28],[-7,-14],[-10,-26],[-5,-11],[-12,-29],[-3,-10],[-7,-13],[-3,-11]],[[8168,1766],[1,23]],[[8169,1789],[2,20]],[[8171,1809],[73,-5]],[[8171,1809],[0,19]],[[8171,1828],[78,-6]],[[8171,1828],[2,19]],[[8173,1847],[80,-5]],[[8173,1847],[0,20]],[[8173,1867],[81,-6]],[[8173,1867],[2,27]],[[8175,1894],[12,-1],[69,-5]],[[8175,1894],[1,29]],[[8176,1923],[12,-1],[70,-5]],[[8258,1917],[-2,-29]],[[8176,1923],[2,29]],[[8178,1952],[83,-7],[-3,-28]],[[8178,1952],[2,30]],[[8180,1982],[82,-6],[-10,30]],[[8252,2006],[7,0]],[[8259,2006],[1,-1],[7,-1],[1,-2],[2,-4],[51,1]],[[8321,1999],[0,-18],[-2,-39],[0,-31],[-4,-15],[-4,-21]],[[8380,2225],[-1,0],[-10,-3],[-12,-8],[-9,-5],[-4,-1],[-5,-8],[-7,-12],[-1,-39],[-2,-26],[-2,-26],[0,-16],[-4,-38],[-2,-15],[0,-29]],[[8259,2006],[1,2],[11,3],[1,4],[-1,7],[-1,4],[-1,6],[-4,29],[0,6],[0,9],[1,5],[1,6],[2,7],[3,12],[1,4],[1,5],[1,9],[-2,1],[-15,3],[-5,-9],[-4,0]],[[8249,2119],[1,11],[-3,6],[-3,5],[-3,5],[-34,15],[-3,1],[-3,0],[-4,-1],[-4,10],[-2,3]],[[8191,2174],[8,15],[2,1],[2,5]],[[8203,2195],[2,5],[6,14],[32,72],[6,12],[6,15],[5,8]],[[8260,2321],[1,-4],[37,-21],[10,-6],[3,-1],[68,-63],[1,-1]],[[7497,2612],[-92,70]],[[7405,2682],[1,2],[24,13],[27,12]],[[7457,2709],[72,-53]],[[7529,2656],[-15,-21],[-8,-11],[-9,-12]],[[7468,2570],[-91,68]],[[7377,2638],[12,22],[12,18],[4,4]],[[7497,2612],[-15,-22],[-14,-20]],[[7453,2548],[-17,-24]],[[7436,2524],[-28,22],[-27,20],[-17,12],[-13,11]],[[7351,2589],[14,25],[6,12],[6,12]],[[7468,2570],[-15,-22]],[[7403,2476],[-29,22],[-26,19],[-1,1],[-13,10],[-20,14]],[[7314,2542],[13,15],[12,16],[12,16]],[[7436,2524],[-21,-32],[-12,-16]],[[7395,2464],[-13,-20]],[[7382,2444],[-91,69]],[[7403,2476],[-8,-12]],[[7346,2393],[-89,66]],[[7267,2476],[90,-67]],[[7357,2409],[-11,-16]],[[7346,2393],[-9,-12],[-9,-8]],[[7328,2373],[-14,11],[-59,43],[-10,8]],[[7310,2357],[-3,3],[-16,12],[-14,10],[-16,12],[-10,8],[-9,6],[-8,7]],[[7328,2373],[-6,-6],[-2,-2],[-2,-2],[-2,-1],[-2,-1],[-4,-3],[0,-1]],[[7310,2357],[-3,-2],[-1,0],[0,-1],[-6,-5],[-17,-15]],[[7283,2334],[-11,7],[-47,35],[-9,7]],[[7216,2383],[-10,7],[-22,17],[-10,7]],[[7174,2414],[-33,25]],[[7179,2245],[-3,1],[-11,9],[-14,9]],[[7151,2264],[6,10],[6,11],[10,19],[11,20],[5,9],[5,10],[11,20],[11,20]],[[7283,2334],[-18,-15],[-18,-15]],[[7247,2304],[-8,-8],[-9,-7],[-17,-14]],[[7213,2275],[-17,-15],[-17,-15]],[[6740,2142],[-10,-22]],[[6730,2120],[-11,-5],[-56,36],[-17,-7]],[[6646,2144],[11,23]],[[6657,2167],[10,22]],[[6667,2189],[73,-47]],[[6667,2189],[9,19],[9,19],[9,19]],[[6694,2246],[74,-47]],[[6768,2199],[-10,-19]],[[6758,2180],[-9,-19],[-9,-19]],[[6792,2242],[-10,-12],[-5,-11],[-9,-20]],[[6694,2246],[10,20],[9,19]],[[7502,7769],[-14,21],[-21,35],[3,2],[14,13],[-22,33],[7,8],[9,10],[15,14],[11,12],[15,21],[9,12],[9,14]],[[7537,7964],[13,-10],[4,-5],[3,-4],[2,-5],[1,-6],[0,-10],[-2,-9],[11,-8],[5,-9],[-11,-21],[-1,-5],[1,-3],[6,-9]],[[7569,7860],[-3,-2],[-17,-15],[-22,-19],[-10,-8],[9,-14],[6,-8]],[[7532,7794],[-14,-12],[-16,-13]],[[7452,7720],[-2,3],[-50,77]],[[7400,7800],[-10,11]],[[7390,7811],[6,6],[24,27],[6,5],[21,27],[14,15],[10,8],[10,10],[5,6],[19,25],[11,18],[8,14],[4,5],[4,6],[3,6],[4,14],[1,2]],[[7540,8005],[-3,-41]],[[7502,7769],[3,-4],[-17,-14]],[[7488,7751],[-16,-14],[-18,-15],[-2,-2]],[[7427,7998],[5,-4],[4,0],[1,1],[3,4],[11,15],[11,12],[12,9],[10,3],[12,0],[7,5],[9,3],[-1,-8],[-10,-14],[-17,-18],[-10,-14],[-13,-9],[-9,-9],[-9,-12],[-23,-6],[-8,-9],[-8,-4],[-10,0],[-10,-2],[-9,-12],[0,-9],[7,-5],[14,3],[11,9],[11,7],[10,5],[4,0],[-1,-4],[3,1],[-2,-4],[-5,-7],[-5,-5],[-15,-13],[-22,-12],[-3,-5],[-5,-3],[-14,-1],[-15,3],[-12,7],[-2,4],[-3,5],[0,8],[3,7],[13,17],[12,8],[12,14],[5,10],[5,17],[7,2],[9,8],[5,13],[22,27],[25,22],[4,9],[7,10],[10,8],[5,6],[3,0],[2,-8],[-4,-6],[-16,-17],[-12,-16],[-18,-32],[-3,-14]],[[7413,7680],[-3,2],[-3,2],[-18,12],[-5,6],[-17,26]],[[7367,7728],[-11,19],[12,12],[6,7],[4,5],[11,14],[11,15]],[[7452,7720],[-2,-2],[-11,-10],[-11,-11],[-15,-17]],[[7382,7644],[-3,4],[-29,-34]],[[7350,7614],[-14,22]],[[7336,7636],[7,9],[7,8],[15,17],[-23,35],[3,3],[5,5]],[[7350,7713],[17,15]],[[7413,7680],[-3,-3],[-28,-33]],[[8063,8419],[-14,-13],[-26,41],[-2,4],[-2,6],[-9,15],[-18,-17]],[[7992,8455],[-50,-44],[-12,-9]],[[7930,8402],[-13,-10],[-22,-18],[-4,-5],[-14,-23],[-15,-24]],[[7862,8322],[-14,13]],[[7848,8335],[4,5],[8,10],[6,10],[12,10],[3,8],[2,3],[15,14],[16,5],[13,15],[12,5],[25,18],[9,10],[8,7],[3,7],[3,1],[6,1],[3,6],[7,10],[8,5],[8,11],[17,14],[5,8],[7,13],[2,7],[5,24],[5,7],[8,5],[18,2],[5,1],[3,1]],[[8094,8578],[1,-3],[4,-4],[4,-6],[14,-24],[-9,-6],[17,-26],[15,-25]],[[8140,8484],[-13,-11],[-22,-18],[-15,-13],[-14,-12],[-13,-11]],[[8030,8317],[-13,-18]],[[8017,8299],[-2,3],[-32,48],[-12,-13],[-1,2],[-16,24],[-2,10],[-10,14],[-7,7],[-5,8]],[[7992,8455],[40,-63],[-16,-14],[-17,-14],[29,-44],[2,-3]],[[8063,8419],[26,-40],[2,-3]],[[8091,8376],[-15,-13],[-16,-13],[-9,-8],[-8,-8],[-4,-5],[-5,-6],[-4,-6]],[[8076,8241],[-14,-14]],[[8062,8227],[-45,72]],[[8091,8376],[26,-41]],[[8117,8335],[-15,-13],[-17,-13],[-16,-15],[-17,-14],[24,-39]],[[8117,8335],[50,-79]],[[8167,8256],[-15,-13],[-17,-13],[-7,-7]],[[8128,8223],[-22,-20],[-3,0],[-2,1],[-10,15],[-14,21],[-1,1]],[[8180,8268],[-13,-12]],[[8117,8335],[13,11],[13,11],[16,14],[21,18],[12,11]],[[8192,8400],[49,-78]],[[8241,8322],[-12,-11],[-21,-18],[-15,-14],[-13,-11]],[[8140,8484],[24,-40],[3,-4],[25,-40]],[[8140,8484],[14,13],[15,12],[18,16],[13,11],[12,10],[24,-41],[2,-3]],[[8238,8502],[24,-41],[-8,-8]],[[8254,8453],[-14,-12],[-17,-15],[-16,-13],[-15,-13]],[[8254,8453],[47,-79]],[[8301,8374],[-12,-10],[-18,-16],[-15,-14],[-15,-12]],[[6673,3425],[-3,-2],[-12,6],[-23,11],[-19,9],[-21,10]],[[6595,3459],[13,37],[3,9]],[[6611,3505],[7,19],[13,37],[19,54]],[[6650,3615],[12,1],[3,0],[13,1],[45,-21],[-2,-5],[-2,-6],[-8,-14],[-6,-12],[13,-6]],[[6718,3553],[-20,-11],[-2,-17],[-2,-9],[-5,-15],[-3,-10],[-3,-4],[-3,-2],[-6,-1],[19,-10],[-18,-32],[1,-14],[0,-2]],[[6676,3426],[-3,-1]],[[6489,3426],[17,50],[0,6],[0,3],[7,6],[18,53]],[[6531,3544],[18,-9],[19,-10],[20,-9],[23,-11]],[[6595,3459],[-25,-70],[-2,0],[-20,11],[-20,9],[-19,8],[-20,9]],[[6673,3425],[2,-3],[3,-2],[-4,-6],[-4,-10],[-5,-9],[-13,-24],[-21,-38]],[[6631,3333],[-3,2],[-1,0],[-22,11],[-32,15],[-91,42]],[[6482,3403],[7,23]],[[6482,3403],[-22,10],[-20,9],[-25,11],[-25,12]],[[6390,3445],[35,98]],[[6425,3543],[24,-12],[5,-2],[4,-2],[4,-2],[4,-5],[5,-8],[19,52],[19,-10],[22,-10]],[[6631,3333],[-15,-27],[-6,-10]],[[6610,3296],[-89,76],[-34,17],[-5,-3]],[[6482,3386],[-88,-16],[-67,32],[-4,-14]],[[6323,3388],[-9,4],[6,22],[12,33],[16,-7],[1,11],[2,12]],[[6351,3463],[18,-9],[21,-9]],[[6351,3463],[-28,13],[-15,7]],[[6308,3483],[8,23],[8,24],[0,4],[0,5],[-1,3],[-2,2],[-3,6],[0,3],[0,2],[15,36],[4,9],[5,12],[4,0],[6,2],[3,1],[5,-3],[1,-4],[2,-3],[11,-24],[1,-3],[6,-13],[20,-10]],[[6401,3555],[24,-12]],[[6551,3599],[-20,-55]],[[6401,3555],[12,32],[-6,11],[-2,3],[-7,18],[0,2],[0,2],[1,2],[1,3],[-2,1],[-2,0],[-3,1],[-2,2],[-7,16]],[[6384,3648],[24,16],[20,12],[7,4],[4,4],[8,7]],[[6447,3691],[0,-5],[2,-6],[1,-3],[3,-4],[2,-3],[4,-3],[13,-7],[6,-12],[1,-3],[7,-14],[23,-12],[21,-10],[21,-10]],[[6308,3483],[-3,1],[-25,12],[-8,5],[-2,1],[-2,2]],[[6268,3504],[2,6],[4,12],[2,3],[1,4],[4,11],[2,4],[6,16],[1,2],[1,3],[7,17],[6,16],[8,22],[7,18],[24,62],[5,13],[1,3],[1,5],[1,2],[1,3],[2,4],[8,22],[13,31],[2,4],[6,15],[0,1],[14,33],[2,7],[13,31],[4,10],[5,12]],[[6421,3896],[1,-1]],[[6422,3895],[3,-1],[-9,-22],[-13,-31]],[[6403,3841],[-12,-27],[-12,-33]],[[6379,3781],[-13,-31],[-12,-33],[18,-9],[-25,-61],[-2,-7],[0,-8],[5,-1],[2,-3],[32,20]],[[5790,4258],[-10,12],[7,5],[18,10],[-11,19],[-12,19]],[[5782,4323],[19,15],[18,21],[-15,13],[12,16]],[[5816,4388],[62,-54],[-10,-18],[-8,-13],[-9,0],[-36,-35],[-1,-6],[-24,-4]],[[7151,2264],[-41,31]],[[7110,2295],[5,11],[6,10],[11,19]],[[7132,2335],[10,20],[11,19]],[[7153,2374],[11,20],[10,20]],[[7179,2245],[-16,-13]],[[7163,2232],[-4,-4],[-13,-10],[-11,-9],[-5,-5]],[[7130,2204],[-18,-14]],[[7112,2190],[-14,11],[-20,15],[-8,6]],[[7070,2222],[6,10],[8,15],[7,13],[7,13],[6,12],[6,10]],[[7230,2182],[-54,40],[-5,4],[-6,4],[-2,2]],[[7179,2245],[3,-1],[5,-4],[59,-44]],[[7246,2196],[-8,-7],[-8,-7]],[[7197,2154],[-4,4],[-51,37],[-5,3],[-7,6]],[[7230,2182],[-9,-7],[-8,-7],[-16,-14]],[[7180,2140],[-59,44],[-9,6]],[[7197,2154],[-7,-7],[-10,-7]],[[7160,2125],[-50,37],[-7,6],[-8,6]],[[7095,2174],[17,16]],[[7180,2140],[-7,-4],[-4,-3],[-9,-8]],[[7120,2091],[-65,48]],[[7055,2139],[22,19],[18,16]],[[7160,2125],[-10,-8],[-8,-7],[-22,-19]],[[7055,2139],[-21,16]],[[7034,2155],[13,25],[11,21]],[[7058,2201],[12,21]],[[7005,2096],[-46,33]],[[6959,2129],[11,21],[11,21],[12,21]],[[6993,2192],[5,-7],[3,-6],[33,-24]],[[7055,2139],[-15,-13],[-12,-11]],[[7028,2115],[-7,-6],[-7,-5],[-4,-3],[-5,-5]],[[7120,2091],[-27,-24]],[[7093,2067],[-65,48]],[[7093,2067],[-21,-21],[-67,50]],[[7016,1990],[-5,4]],[[7011,1994],[2,2],[42,36],[-23,16],[-9,-8],[-7,-6],[-18,14],[16,14],[-10,8],[-16,11]],[[6988,2081],[17,15]],[[7246,2196],[5,-3]],[[7251,2193],[-17,-14],[-33,-28],[-17,-15],[-15,-13],[-3,-2],[-17,-15],[-21,-18],[-2,-1]],[[7126,2087],[-27,-24],[-23,-20],[-17,-15],[-41,-36],[-2,-2]],[[6950,1933],[-6,3]],[[6944,1936],[16,15]],[[6960,1951],[18,14],[-68,44],[-4,0]],[[6906,2009],[37,33]],[[6943,2042],[7,-3],[10,-8],[14,-10],[4,-3],[2,-1],[11,-8],[20,-15]],[[7016,1990],[-3,-2],[-25,-22],[-38,-33]],[[6960,1951],[-69,45]],[[6891,1996],[15,13]],[[6944,1936],[-38,-33]],[[6906,1903],[-70,45]],[[6836,1948],[8,7]],[[6844,1955],[21,18],[9,8],[11,10]],[[6885,1991],[6,5]],[[8658,1867],[-4,5],[-21,28]],[[8633,1900],[10,11],[7,9]],[[8650,1920],[11,-9],[8,-4],[7,16],[6,15],[8,-3],[7,-4],[6,-6],[4,-2],[5,-2],[-4,-23],[-1,-8],[-6,-15],[-30,7],[-11,-12],[-2,-3]],[[8688,1948],[-25,10]],[[8663,1958],[12,57]],[[8675,2015],[10,-5],[8,-7],[-8,-44],[6,-2],[-3,-9]],[[8675,2015],[-31,9],[-1,3],[-3,1],[-3,-2],[-7,5],[-15,7]],[[8615,2038],[5,12],[4,11],[3,9],[2,7],[1,10],[-1,14],[1,4],[-1,0],[0,-1],[-1,0],[-1,0],[-1,0],[-1,0],[-1,1],[-1,1],[-1,2],[0,1],[0,2],[1,2],[0,1],[1,1],[-2,4],[-11,23],[-10,20],[-5,11],[-1,0],[-1,1],[-2,1],[-1,2],[-1,3]],[[8590,2180],[1,2],[0,1],[1,2],[2,1],[-2,12],[-1,3],[1,3],[0,3],[2,7],[3,10],[3,10],[3,7],[2,5],[4,7],[7,13],[2,3],[2,5],[1,0],[3,-1],[2,5],[17,33],[11,21],[4,9],[2,0],[12,27],[6,14],[3,8],[2,4]],[[8683,2394],[4,0],[7,2],[30,17],[8,1],[18,2],[3,3],[1,-4],[3,-8],[10,-7],[2,-2],[2,-8],[5,-12],[5,-8],[5,-12],[5,-12],[1,-6],[7,-8],[9,-12],[4,-12],[6,-11],[5,-14],[3,-11],[5,-7],[4,-3],[1,-5],[0,-6],[3,-6],[4,-2]],[[8843,2243],[-17,2],[0,-4],[1,-4],[-1,-8],[-1,-5],[-1,-5],[-3,-9],[-2,-6],[-4,-8],[-3,-4],[-5,-7],[-6,-5],[-5,-5]],[[8796,2175],[-10,-7],[-9,-4],[-12,-5],[-9,-4],[5,-14],[1,-8],[-1,-6],[0,-3],[-1,-3]],[[8760,2121],[-1,-4],[0,-2],[-2,-3],[-1,-4],[-8,-10],[-6,-6],[-10,15],[-6,18],[-24,-10],[3,-10],[15,-18],[6,-9],[-7,-6],[-5,-4],[-6,-6],[-14,-11],[-8,-11],[-7,-12],[-4,-13]],[[8796,2175],[4,-5],[11,-14],[15,-15],[0,-3],[-2,-4],[-8,-10],[-5,-4],[-2,-2],[-2,-2],[-2,-4],[-10,-15],[-3,-1],[-3,2],[-13,9],[-11,10],[-2,0],[-3,4]],[[6818,2142],[-60,38]],[[6865,2225],[-23,-40],[-14,-25],[-10,-18]],[[6878,2090],[-15,-27]],[[6863,2063],[-16,10],[16,29],[-14,15],[-14,14],[-17,11]],[[6865,2225],[62,-44],[-11,-21]],[[6916,2160],[-11,-20],[-27,-50]],[[6959,2129],[-43,31]],[[6888,2268],[62,-45]],[[6950,2223],[43,-31]],[[6988,2081],[-45,-39]],[[6943,2042],[-17,13],[-48,35]],[[6950,2223],[11,21],[11,20]],[[6972,2264],[86,-63]],[[6909,2311],[10,-7],[43,-32],[10,-8]],[[6999,2314],[-1,-3],[-12,-22],[-2,-3],[-12,-22]],[[7024,2359],[86,-64]],[[7046,2399],[86,-64]],[[7068,2438],[85,-64]],[[6694,2246],[-72,47]],[[6622,2293],[6,15],[3,5],[9,20]],[[6640,2333],[73,-48]],[[6640,2333],[-33,22]],[[6607,2355],[20,15],[3,4],[8,6]],[[6638,2380],[9,6],[4,4],[10,8],[3,3],[15,16],[3,2]],[[6603,2255],[-48,31],[-1,1]],[[6554,2287],[4,5]],[[6558,2292],[9,12],[13,17]],[[6580,2321],[19,24]],[[6599,2345],[8,10]],[[6622,2293],[-10,-19],[-9,-19]],[[6599,2345],[-2,3],[-58,43],[11,19],[8,16],[3,5]],[[6561,2431],[77,-51]],[[6580,2321],[1,5],[-54,41]],[[6527,2367],[-70,50]],[[6457,2417],[12,24],[11,19],[8,15],[4,8]],[[6492,2483],[69,-52]],[[6492,2483],[17,30]],[[6509,2513],[14,26]],[[6523,2539],[13,-10],[22,-17],[-3,-12],[-2,-11],[24,-3],[12,-3],[9,-4],[8,-6],[22,-18],[11,-5],[10,-8],[33,-23]],[[6523,2539],[37,68]],[[6560,2607],[34,-26]],[[6594,2581],[35,-25],[-2,-5],[-5,-8],[-5,-11],[21,-17],[24,-14],[15,-7]],[[6594,2581],[13,23],[13,24],[13,24],[36,-26]],[[6560,2607],[6,10],[4,8],[1,10],[-2,30],[0,2],[0,18]],[[6569,2685],[1,6],[2,5],[1,5],[2,3],[9,17],[13,24],[10,18],[1,2],[0,2],[13,23]],[[6621,2790],[62,-46]],[[6621,2790],[12,22],[13,24]],[[6646,2836],[23,-18],[30,-22],[9,-7]],[[6621,2790],[-62,47]],[[6559,2837],[12,22],[13,23]],[[6584,2882],[53,-40],[9,-6]],[[6584,2882],[10,19],[6,10]],[[6600,2911],[20,-15],[21,-16],[6,11],[3,6],[5,9],[21,-15]],[[6676,2891],[-5,-10],[-3,-5],[-6,-11],[-6,-10],[-10,-19]],[[6679,2898],[-2,-3],[-1,-4]],[[6600,2911],[-18,14],[-18,12],[-17,14]],[[6547,2951],[9,16],[4,7]],[[6560,2974],[2,2],[2,1],[3,3]],[[6567,2980],[6,-4],[18,-13],[10,-7],[1,-1],[5,-4],[9,-6]],[[6616,2945],[32,-23],[11,-9],[20,-15]],[[6616,2945],[2,4],[8,18],[10,18],[5,8],[11,9]],[[6652,3002],[24,-17],[19,-14],[18,-14]],[[6713,2957],[-9,-10],[-6,-9]],[[6698,2938],[-9,-18],[-9,-18],[-1,-4]],[[6567,2980],[1,1],[2,2],[10,18],[10,18],[12,21]],[[6602,3040],[40,-30],[10,-8]],[[6741,2852],[-1,1],[-61,45]],[[6698,2938],[63,-47]],[[8269,3639],[9,-6]],[[8278,3633],[-10,-19],[-3,-5],[-3,-6],[-8,-16],[-9,-15]],[[8245,3572],[-30,24],[-29,22],[-26,20],[-27,21]],[[8133,3659],[4,18]],[[8137,3677],[5,16]],[[8142,3693],[4,14]],[[8146,3707],[6,20]],[[8152,3727],[18,-14],[30,-22]],[[8200,3691],[-4,-22],[-6,-32],[34,-26]],[[8224,3611],[14,-11],[2,-2],[9,16],[1,1],[9,7],[2,2],[8,15]],[[8224,3611],[1,2],[23,42],[19,35]],[[8267,3690],[13,-11],[-10,-19],[-5,-17],[1,-1],[2,-1],[1,-2]],[[8200,3691],[9,42],[2,-1],[27,-21],[16,-12],[13,-9]],[[5608,4321],[12,16],[2,0],[1,1],[-1,1],[4,5]],[[5626,4344],[4,5]],[[5630,4349],[5,-5],[-11,-17],[33,-32],[8,18],[7,13]],[[5672,4326],[43,-45],[2,-2],[10,20]],[[5727,4299],[12,-13],[-3,-5],[-1,-4],[-2,-4],[-2,-3],[-1,-4],[-2,-4],[0,-3],[2,-1],[12,-2],[2,0],[2,5],[2,3],[1,3],[3,5],[16,-16],[22,2]],[[5816,4388],[11,17],[12,24],[2,4]],[[5841,4433],[51,-38],[13,-10],[3,-3]],[[5908,4382],[-1,-4]],[[5907,4378],[-7,-18],[-5,-12],[-29,-75]],[[5866,4273],[-4,-1],[-10,-4],[-19,-8],[-5,-1],[-3,-2],[-4,-1],[-4,-1]],[[5817,4255],[-5,-1],[-3,-1],[-4,-1],[-4,-1],[-5,-1],[-4,-1],[-3,0],[-4,-1],[-4,0],[-5,0],[-3,-1],[-6,0],[-5,0],[-7,0],[-7,1],[-6,0],[-6,1],[-4,1],[-4,0],[-4,1],[-5,1],[-5,2],[-4,1],[-4,1],[-10,3],[-4,2],[-4,1],[-6,3],[-5,2],[-4,3],[-4,2],[-4,2],[-3,2],[-8,4],[-4,4],[-4,2],[-3,2],[-3,3],[-3,2],[-3,3],[-3,3],[-3,2],[-10,10],[-10,10]],[[5727,4299],[3,8],[7,9],[5,4],[11,6]],[[5753,4326],[20,14]],[[5773,4340],[9,-17]],[[5672,4326],[9,20],[10,18]],[[5691,4364],[12,16],[29,-30],[18,-19],[2,-2],[1,-3]],[[5691,4364],[-13,14],[-15,14]],[[5663,4392],[47,61]],[[5710,4453],[13,-11],[15,-12],[31,-28],[-11,-17],[-12,-18],[23,-23],[2,-1],[2,-3]],[[5630,4349],[10,12],[12,16]],[[5652,4377],[11,15]],[[5652,4377],[-54,56]],[[5598,4433],[12,15]],[[5610,4448],[27,-28],[12,16],[19,27],[14,-12],[12,17],[16,-15]],[[9686,9775],[-1,-1],[-1,-1],[-36,-32],[-3,-2],[-2,-2],[-6,-6],[-7,-7],[-4,-5],[-5,-6],[-7,-10],[-6,-8],[-6,-11],[-2,-5]],[[9600,9679],[-4,-9],[-4,-10],[-4,-12],[-5,-26],[-1,-3],[-1,-6],[-7,-33]],[[9574,9580],[-6,-27],[-7,-25],[-4,-16],[-6,-28],[-16,-74],[-14,-65],[-10,-51]],[[9511,9294],[-10,-47],[-14,-67]],[[9487,9180],[-14,-68]],[[9473,9112],[-11,-50]],[[9462,9062],[-4,-1],[-8,-3],[-183,-67],[-130,-40]],[[9137,8951],[0,6],[1,6],[0,5],[1,6],[1,5],[0,5],[1,4],[1,9],[2,7],[2,12],[2,6],[1,6],[4,13],[6,23],[116,418],[29,103],[2,7],[22,78],[2,9],[1,4],[3,13],[2,7],[1,4],[1,9],[2,9],[0,4],[1,6],[1,4],[1,10],[0,6],[0,4],[1,3],[0,7],[0,41],[-3,0],[0,1],[0,12],[0,5],[0,6],[0,4]],[[9341,9838],[4,1],[6,2],[19,6],[6,2],[11,5],[8,3],[28,4],[5,-1],[4,-2],[2,-2],[3,-3],[2,-5],[2,-5],[3,-13],[5,-12],[2,-10],[1,-3],[1,-8],[5,-9],[10,-10],[14,-9],[11,-4],[9,0],[13,3],[13,-22],[2,-3],[9,-15],[3,-3],[2,0],[2,0],[32,13],[4,1],[-13,20],[11,9],[2,4],[-1,4],[-5,13],[14,3],[9,2],[9,3],[9,2],[5,0],[3,-1],[10,-2],[45,-12],[14,8],[1,0],[1,-1],[1,-1],[3,-4]],[[9700,9786],[-2,-2],[-10,-8],[-2,-1]],[[9673,9553],[-5,-24]],[[9668,9529],[-1,-3],[-1,-5],[-1,-11],[-2,-10],[-2,-17],[-2,-12],[-2,-12],[0,-9],[-7,-140]],[[9650,9310],[-30,-15],[-41,-6],[-36,1],[-32,4]],[[9574,9580],[37,-11],[1,9],[4,16],[5,23],[34,-9],[20,-6]],[[9675,9602],[-6,-33],[-3,-14],[7,-2]],[[9853,9901],[0,-3],[-1,-13],[-3,-13],[-6,-23],[-2,-5],[-1,-5],[-1,-6],[0,-3],[0,-2],[0,-1],[0,-1],[0,-1],[-1,-1],[-1,-1],[-1,-2],[-1,0],[-1,-1],[-1,0],[-1,1],[-1,0],[-1,1],[-1,2],[-1,1],[-1,0],[-2,0],[-2,1],[-2,0],[-2,-1],[-10,-2]],[[9809,9823],[-43,-11]],[[9766,9812],[-3,-1],[-11,-2],[-20,-6],[-14,-6],[-11,-6],[-5,-4],[-2,-1]],[[9341,9838],[0,1],[1,5],[0,5]],[[9342,9849],[3,0],[6,-1],[14,2],[12,4],[8,6],[9,3],[25,1],[8,2],[4,-1],[12,1],[15,-6],[8,2],[3,-1],[4,-4],[0,-5],[9,1],[4,-2],[4,-2],[3,-5],[2,-6],[6,-32],[2,-6],[1,-1],[4,-4],[8,-1],[3,0],[3,0],[4,0],[8,-4],[1,-4],[-4,-3],[-4,-1],[-4,0],[-4,-2],[-1,-1],[1,-1],[3,0],[2,0],[6,1],[11,5],[23,14],[8,2],[11,3],[5,4],[6,5],[4,1],[12,-1],[7,4],[14,13],[9,1],[8,4],[5,3],[8,8],[3,1],[6,2],[5,5],[7,2],[8,6],[5,1],[13,8],[16,10],[21,8],[9,10],[5,5],[3,0],[10,-2],[8,2],[8,4],[7,1],[8,4],[2,2],[6,6],[2,0],[8,-4],[5,1],[3,2],[5,6],[3,2],[8,1],[5,3]],[[9850,9931],[1,-16],[1,-5],[1,-9]],[[9667,9996],[2,-4],[4,0],[4,-1],[2,-3],[-3,-7],[1,-14],[-2,-9],[-4,-1],[-5,0],[-6,-3],[-15,-10],[-7,-7],[-6,-3],[-6,-10],[-12,-9],[-4,-4],[-4,-7],[-3,-5],[-6,0],[-1,2],[0,7],[-1,4],[-3,-1],[-1,-9],[-5,-19],[-3,-8],[-14,-13],[-6,-4],[-6,-1],[-14,3],[-22,9],[-2,4],[-1,4],[-1,4],[1,6],[1,4],[0,5],[1,5],[-2,7],[-2,5],[-1,7],[1,7],[5,2],[11,6],[5,6],[-1,5],[3,5],[7,1],[9,0],[9,2],[8,4],[6,4],[18,4],[19,8],[10,2],[6,5],[1,1],[13,12],[15,5],[4,0],[3,-3]],[[9455,8069],[-41,10]],[[9414,8079],[-42,11]],[[9372,8090],[5,21],[4,21],[4,21],[-24,6],[0,9],[-1,9],[8,1],[23,-6],[2,0],[1,2],[6,26]],[[9400,8200],[4,-1],[14,-7],[4,8],[7,12],[5,7],[6,6],[6,10],[1,3]],[[9447,8238],[20,-5]],[[9467,8233],[-4,-9],[-8,-12],[-9,-9],[-2,-3],[-4,-7],[15,-8],[1,-3],[-3,-5],[-3,-8],[-5,-28],[0,-3],[2,-1],[7,-2],[13,-1],[-1,-9],[-3,-15],[-4,-21],[-4,-20]],[[9563,8153],[-7,8],[-15,4],[-9,-47],[-1,-2],[-4,0],[-18,5],[-5,-21],[-4,-21],[-4,-21]],[[9496,8058],[-41,11]],[[9467,8233],[3,11],[1,8],[3,12],[1,5]],[[9475,8269],[22,-6],[15,-4],[18,-4],[15,-4],[49,-12],[24,-6],[2,-1]],[[9619,8026],[-41,11],[-41,11]],[[9537,8048],[-41,10]],[[9562,7952],[-42,11]],[[9520,7963],[-41,10],[4,20],[4,21],[5,23],[4,21]],[[9537,8048],[-4,-21],[-5,-24],[42,-10],[-4,-21],[-4,-20]],[[9615,8005],[-4,-23],[-4,-21],[-4,-19],[-41,10]],[[9569,7926],[-56,15]],[[9513,7941],[7,22]],[[8590,2180],[-19,-7],[-12,-5],[-11,-4],[-6,-4],[-4,-5],[-3,-3],[-3,-4]],[[8532,2148],[-14,-17],[-5,-4],[-10,-5],[-7,-2],[-6,0],[-15,2]],[[8475,2122],[-9,1],[-8,-2],[-11,-4],[-8,-8],[-4,-8],[-3,-10],[-1,-8],[1,-29],[0,-9],[0,-4],[0,-6]],[[8432,2035],[-2,-6],[-4,-16],[-8,-24],[0,-5],[-1,-9],[0,-5],[0,-3],[2,-1],[3,-2],[7,-4],[7,-1],[11,-1]],[[8447,1958],[0,-10],[-4,-7],[-6,-3],[-4,-4],[-2,-3],[-3,-4],[-2,-5],[-1,-4],[-2,-9],[1,-9],[-1,-10],[-3,-6],[-5,-6],[-1,-3],[-1,-3],[-1,-2],[-1,-3],[0,-3],[0,-8],[4,-8]],[[8415,1848],[-48,25]],[[8367,1873],[9,30],[4,12],[7,32],[3,60],[5,36],[1,42],[1,35],[5,12],[8,16],[4,6],[21,15],[3,0],[27,6],[9,2],[19,0],[2,2],[5,7],[13,16],[7,6],[27,24],[8,11],[3,4],[4,5],[0,8],[2,6],[4,2],[3,6],[2,5],[1,4],[7,7],[6,3],[6,8],[12,6],[21,11],[7,9],[3,11],[8,12],[3,7],[5,4],[8,8],[4,7],[1,4],[6,12],[4,5],[4,-2],[1,-1],[3,0]],[[8475,2122],[-3,-41],[-18,1],[-2,-25],[0,-17],[-1,-3],[-3,-3],[-4,0],[-12,1]],[[8489,1978],[2,-2],[1,-3],[-1,-17]],[[8491,1956],[-4,0],[-40,2]],[[8532,2148],[4,-7],[-2,-3],[-7,-7],[-3,-6],[2,-8],[2,-9],[3,-16],[2,-9],[13,-9],[-5,-8],[-3,0],[0,-1],[1,-2],[0,-1],[-1,-3],[-2,-1],[-2,-1],[-2,-2],[-3,-1],[-6,-2],[-12,-2],[-11,-2],[-2,-1],[-2,-1],[-5,-7],[0,-14],[-1,-18],[-12,0],[0,-6],[11,0],[0,-23]],[[8615,2038],[-12,-6],[-1,3],[-16,12],[-4,0],[-11,-19],[-7,-12],[-1,-4],[2,-13],[0,-4],[-3,-3],[-2,-2],[-16,-4],[-17,-5],[-10,-2],[-9,-1],[-19,0]],[[8615,2038],[-20,-48],[-2,-7],[0,-8],[0,-10],[5,-13],[6,-10],[3,-7],[1,-2]],[[8608,1933],[-7,8],[-4,3],[-4,3],[-9,3],[-4,2],[-5,1],[-4,2],[-6,1],[-5,0],[0,-3],[0,-8],[0,-9],[0,-1],[-3,-7],[-3,-5],[-3,-4],[-5,6],[-7,9],[-3,1],[-2,0],[-2,1],[-2,0],[-12,1],[-7,0],[-23,1]],[[8488,1938],[2,2],[1,16]],[[8663,1958],[-1,-5],[0,-5],[-5,-13],[-7,-15]],[[8633,1900],[-16,20],[-9,13]],[[8633,1900],[-4,-3],[-26,-30],[-9,-10]],[[8594,1857],[-5,7],[-27,-13],[-8,8],[-39,-31],[0,-6]],[[8515,1822],[-100,26]],[[8415,1848],[27,20],[12,8],[5,4],[5,4],[5,5],[11,-16],[2,-1],[2,0],[2,2],[7,9],[2,2],[-1,3],[-2,4],[-11,16],[2,6],[3,8],[1,8],[1,8]],[[8633,1765],[-26,-29],[-10,-17],[-11,-16]],[[8586,1703],[-3,3],[-18,21],[-10,12],[-25,31],[13,16],[-24,28],[-5,5],[1,3]],[[8594,1857],[5,-6],[-1,-33],[5,-17],[27,-33],[3,-3]],[[8658,1867],[3,-7],[3,-8],[2,-9],[1,-12],[0,-11],[-3,-11],[-3,-7],[-6,-11],[-9,-11],[-13,-15]],[[8741,2856],[7,-18],[4,-4],[6,-10],[10,-20],[6,-18],[3,-18],[0,-32],[-44,-209],[-13,-38],[-6,-1],[-2,0],[-4,-1],[-3,-1],[-5,-3],[-18,-18],[-14,-16],[-12,-14],[-7,-8],[-13,-9],[-34,-29],[-59,-44],[-61,-48],[0,-5],[-1,0],[-5,-4],[-13,-11],[-27,-15],[-31,-10],[-6,-2],[-6,0],[-9,1],[-47,39],[-3,0],[0,-3],[26,-22],[13,-12],[1,-2],[12,-7],[9,-1],[-2,-5],[-7,-8],[-6,-5]],[[8260,2321],[2,5]],[[8262,2326],[1,2],[1,3],[7,14]],[[8271,2345],[9,20]],[[8280,2365],[10,23],[12,25],[11,23]],[[8313,2436],[10,27]],[[8323,2463],[4,-3],[17,-9],[19,-11],[12,31],[15,39]],[[8390,2510],[1,-2],[18,0],[85,-4],[23,17],[5,6],[1,8],[1,19],[-36,0],[-29,1]],[[8459,2555],[0,23]],[[8459,2578],[0,22],[0,11],[0,12],[0,17],[0,1],[-1,1],[-59,1],[0,-18],[1,-1]],[[8400,2624],[-42,0],[-5,0]],[[8353,2624],[0,7],[1,13]],[[8354,2644],[1,15],[1,5],[2,7],[4,40],[1,5],[2,19]],[[8365,2735],[4,31],[5,49],[1,3],[0,3],[0,3]],[[8375,2824],[42,-6],[58,-10],[41,-6],[28,-4],[18,2],[12,2],[27,11],[4,1],[5,2],[5,1],[3,1],[2,1],[15,3],[16,4],[12,2],[12,3],[12,3],[6,2],[7,2],[8,5],[6,3],[3,2],[3,1],[1,1],[2,1]],[[8723,2851],[2,1],[3,-3],[13,7]],[[9137,3084],[1,1]],[[9138,3085],[2,-5],[-1,-2],[-1,1],[-1,5]],[[8390,2510],[5,12],[4,12]],[[8399,2534],[42,-1],[17,0],[1,22]],[[8399,2534],[0,11],[0,11]],[[8399,2556],[0,11],[0,12]],[[8399,2579],[32,-1],[28,0]],[[8312,3700],[-8,-17],[-8,-15],[-10,-20],[-8,-15]],[[8152,3727],[4,19]],[[8156,3746],[7,23],[5,21],[4,15]],[[8172,3805],[11,-8],[21,-16],[13,-9],[37,-28],[1,-1],[28,-21],[9,-7],[3,-2],[9,-7],[8,-6]],[[7761,6574],[-73,54],[-19,-32],[-22,-41],[-14,11]],[[7633,6566],[-16,12],[-22,17],[-21,18],[-2,2]],[[7572,6615],[-3,2],[-11,11],[-8,9],[-13,12],[-9,9],[-17,17]],[[7511,6675],[25,23],[10,9],[28,24],[24,17],[42,29],[13,11]],[[7653,6788],[5,-4],[17,-12],[67,-46]],[[7742,6726],[52,-35],[23,-16]],[[7817,6675],[-1,-3],[-10,-16],[-22,-42],[-23,-40]],[[7720,6501],[-1,-3],[-10,-18],[-14,11],[-4,-1],[-21,-40],[-17,13],[-11,-19]],[[7642,6444],[-8,-9]],[[7634,6435],[-14,16],[7,9],[10,14],[22,40],[-1,4],[-14,10]],[[7644,6528],[-18,14],[-2,1],[-1,2],[0,2],[1,3],[8,14],[1,2]],[[7761,6574],[-19,-33],[-22,-40]],[[8399,2579],[1,22],[0,23]],[[8345,2556],[3,23],[3,23],[2,22]],[[8399,2556],[-26,0],[-28,0]],[[8340,2511],[3,23],[2,22]],[[8390,2510],[-8,0],[-16,0],[-14,1],[-12,0]],[[8323,2463],[10,27],[7,21]],[[8313,2436],[-14,28],[-9,18]],[[8290,2482],[-8,16]],[[8282,2498],[14,17],[2,2],[9,40],[9,0],[10,0],[10,-1],[9,0]],[[8282,2498],[-10,19]],[[8272,2517],[-9,18],[-1,3],[-2,4]],[[8260,2542],[31,39],[18,21],[16,19]],[[8325,2621],[13,10],[16,13]],[[8325,2621],[2,6],[-15,13],[-14,13]],[[8298,2653],[25,37],[13,21],[4,6],[18,27],[7,-9]],[[8298,2653],[-11,16],[-7,9]],[[8280,2678],[-7,10],[-7,9],[-13,18],[-16,22],[-14,-14]],[[8223,2723],[-18,26],[-2,3]],[[8203,2752],[19,20],[11,11],[6,4],[26,24],[3,1],[26,25],[31,30],[47,41],[4,3]],[[8376,2911],[4,-26],[0,-6],[1,-6],[-3,-25],[-3,-24]],[[8446,3301],[8,-49],[2,-4],[4,-7],[1,-2],[1,-3],[2,-32]],[[8464,3204],[-4,0],[-24,14],[-12,7],[-27,15],[-8,5],[-11,6]],[[8378,3251],[19,34],[4,7],[7,21],[11,-5],[5,-3],[22,-4]],[[8378,3251],[-15,8],[-8,5],[-14,8],[-11,6]],[[8330,3278],[-15,9],[-26,15]],[[8289,3302],[8,16],[6,12],[5,9],[5,11]],[[8313,3350],[17,32],[5,10],[3,7],[8,14],[10,22],[14,24],[6,13]],[[8376,3472],[10,-6],[8,-6],[15,-10],[23,-14],[-4,-13],[-10,-28],[13,-6],[12,-5],[5,-2]],[[8448,3382],[-3,-15],[-1,-13],[1,-32],[1,-21]],[[8505,3564],[-7,-24],[-9,-26],[-6,-19],[-3,-6],[-1,-6],[-6,-16],[-9,-23],[-4,-12],[-2,-10],[-4,-13],[-6,-27]],[[8376,3472],[21,51],[4,5],[4,8]],[[8405,3536],[15,36],[3,8],[7,21],[3,8]],[[8433,3609],[12,-9],[10,-8],[16,-12],[3,-1],[19,-7],[0,-4],[9,-4],[3,0]],[[8376,3472],[-13,10],[-3,2],[-1,1],[-4,3],[-3,2],[-4,4],[-26,19]],[[8322,3513],[7,17],[13,28],[8,20]],[[8350,3578],[25,-18],[11,-9],[4,-3],[4,-3],[11,-9]],[[8350,3578],[-16,13],[-11,8]],[[8323,3599],[9,15],[10,18],[17,32]],[[8359,3664],[23,-17],[24,-18],[11,-8],[1,-1],[4,-3],[11,-8]],[[8322,3513],[-30,23],[-4,3],[-9,7],[-9,7],[-25,19]],[[8278,3633],[23,-18],[18,-13],[4,-3]],[[8312,3700],[26,-20],[18,-13],[3,-3]],[[8121,3613],[-15,11],[-8,5],[-5,3]],[[8093,3632],[-44,32]],[[8049,3664],[6,11],[1,2],[6,10],[4,8],[5,9]],[[8071,3704],[41,-29],[21,-16]],[[8133,3659],[-4,-17],[-8,-29]],[[8074,3602],[-2,1]],[[8072,3603],[-5,4],[-35,26]],[[8032,3633],[7,13],[10,18]],[[8093,3632],[-11,-19],[-4,-7],[-4,-4]],[[8111,3574],[-9,6],[-3,3],[-25,19]],[[8121,3613],[-6,-22],[-4,-17]],[[8096,3522],[-48,37]],[[8048,3559],[8,14],[6,10]],[[8062,3583],[5,10],[5,10]],[[8111,3574],[-5,-20],[-10,-32]],[[8048,3559],[-40,31]],[[8008,3590],[13,24],[41,-31]],[[8008,3590],[-11,-20]],[[7997,3570],[-18,13],[-22,17]],[[7957,3600],[-7,8],[-3,4]],[[7947,3612],[5,5],[6,11],[2,4]],[[7960,3632],[8,-7],[11,-10],[5,-6],[7,-5],[17,-14]],[[8027,3517],[-6,5],[-21,16],[-15,12]],[[7985,3550],[-18,14],[-20,15]],[[7947,3579],[1,3],[1,3],[3,2],[1,2],[1,3],[2,3],[1,5]],[[7997,3570],[10,-8],[26,-20],[4,-3]],[[8037,3539],[2,-2]],[[8039,3537],[-5,-9],[-7,-11]],[[8006,3479],[-10,8],[-7,6],[-17,13],[-9,7]],[[7963,3513],[7,12],[-20,15],[-8,6],[-9,7]],[[7933,3553],[12,22],[2,4]],[[7985,3550],[-6,-10],[-6,-10],[8,-6],[1,-1],[12,-10],[21,-17]],[[8015,3496],[-5,-9],[-4,-8]],[[8027,3517],[-12,-21]],[[8071,3451],[-12,9],[-9,8],[-14,11],[-14,11],[-7,6]],[[8027,3517],[20,-16],[18,-14],[4,-3],[11,-8]],[[8080,3476],[-4,-11],[-5,-14]],[[8088,3499],[-8,-23]],[[8039,3537],[37,-29],[12,-9]],[[8096,3522],[-8,-23]],[[8037,3539],[5,9],[6,11]],[[8289,3302],[-6,-12],[-3,-6],[-14,-28],[-2,-3],[-6,-12],[-2,-4],[-2,-2],[-1,-2],[-2,-2],[-1,-2],[-1,-1],[0,-1],[-30,-42],[-8,-10],[-10,-13],[-15,-20]],[[8186,3142],[-2,3],[-21,16],[-12,11],[-4,3],[-22,18],[-5,6],[-4,2],[-2,3],[-2,3],[-23,18],[-7,6],[-9,7],[-10,7]],[[8063,3245],[-9,7],[-1,2],[-25,20],[-24,20],[-3,1],[-7,6],[-4,5]],[[7990,3306],[14,22],[3,5],[9,16],[11,18],[13,22],[12,20]],[[8052,3409],[11,20],[7,18],[1,4]],[[8096,3522],[9,-7],[3,-2],[11,-9],[13,-11],[13,-10],[15,-11],[23,-19]],[[8183,3453],[10,-7],[33,-27],[3,-2],[7,-6],[13,-10],[19,-15],[18,-15],[3,1],[3,-2],[2,-2],[1,0],[1,-3],[1,-1],[16,-14]],[[8052,3409],[-59,48]],[[7993,3457],[13,22]],[[7993,3457],[-21,16],[-7,6],[-15,12]],[[7950,3491],[8,13],[5,9]],[[7950,3491],[-30,26]],[[7920,3517],[5,19],[2,1],[6,16]],[[7387,3495],[-118,-167],[-6,-12],[-20,-36],[-13,-29],[-12,-21],[-2,-3],[-6,-4],[-7,-5],[-5,-13],[-1,-10],[-1,-8],[-4,-9],[-5,-7],[-7,-6],[-6,-12],[-3,-7],[-1,-4],[0,-3],[-1,-4]],[[7169,3135],[-17,14]],[[7152,3149],[-27,23]],[[7125,3172],[39,74],[6,13],[2,31],[-3,10],[-9,32]],[[7160,3332],[-2,8],[-4,5],[-4,3],[-2,2],[-3,3]],[[7145,3353],[8,13],[0,1],[10,18],[4,7],[15,28],[-10,7]],[[7172,3427],[37,66]],[[7209,3493],[9,-7],[39,72],[2,5],[3,6],[3,3],[4,3],[3,2],[2,2],[5,3]],[[7279,3582],[10,-8]],[[7289,3574],[34,-25],[64,-54]],[[7172,3427],[-13,-25],[-10,7],[-6,4],[2,5]],[[7145,3418],[12,21],[11,22],[13,22],[12,21]],[[7193,3504],[5,-3],[10,-7],[1,-1]],[[7145,3353],[-17,13],[-5,-9],[-35,26],[-4,18]],[[7084,3401],[13,25]],[[7097,3426],[10,19]],[[7107,3445],[38,-27]],[[7107,3445],[12,21],[13,24],[11,21]],[[7143,3511],[12,22],[10,16]],[[7165,3549],[37,-27],[-9,-18]],[[7097,3426],[-42,31],[-5,11]],[[7050,3468],[33,62],[-15,21]],[[7068,3551],[12,-8],[21,2],[34,-26],[6,-4],[2,-4]],[[7050,3468],[-7,13],[-11,8],[-20,16]],[[7012,3505],[23,43],[6,23]],[[7041,3571],[27,-20]],[[7016,3593],[8,-9],[2,-2],[15,-11]],[[7012,3505],[-12,7],[-14,3],[-12,2]],[[6974,3517],[42,76]],[[6974,3517],[-19,8]],[[6955,3525],[13,4],[26,49],[10,15]],[[7004,3593],[12,0]],[[6955,3525],[-9,5],[-16,17]],[[6930,3547],[14,3],[18,34],[25,49],[2,-11],[15,-29]],[[7012,3505],[-11,-19],[-8,-8],[-4,-4],[-19,-17],[-6,-9],[-7,-21]],[[6957,3427],[-18,13]],[[6939,3440],[-36,25],[-4,3],[-13,10]],[[6886,3478],[7,12],[17,20],[20,37]],[[6886,3478],[0,20],[29,53],[-2,20]],[[6913,3571],[17,-24]],[[7481,5741],[-15,-10]],[[7466,5731],[-60,40]],[[7406,5771],[6,7],[12,5],[9,7]],[[7433,5790],[38,32]],[[7471,5822],[5,-8],[9,-8]],[[7485,5806],[14,-10],[-15,-28],[-12,-8],[9,-19]],[[7406,5771],[-56,40]],[[7350,5811],[5,8]],[[7355,5819],[9,14],[9,8],[19,15]],[[7392,5856],[11,-18]],[[7403,5838],[30,-48]],[[7485,5806],[17,15],[14,11],[4,0],[25,-19],[-10,-18],[-10,-18],[5,-5]],[[7530,5772],[-29,-55],[-4,-1],[-3,3],[-13,22]],[[7549,5614],[-2,2],[-4,2],[-52,38]],[[7491,5656],[14,26],[6,10],[3,5],[-48,34]],[[7530,5772],[16,-11],[29,55],[2,3],[10,17]],[[7587,5836],[13,26],[10,17],[11,18]],[[7621,5897],[15,-11]],[[7636,5886],[16,-13],[20,-14],[2,-2],[2,-1],[3,-3]],[[7679,5853],[-9,-18],[-10,-18]],[[7660,5817],[-1,-2],[-1,-2],[-3,-4],[-18,-34]],[[7637,5775],[-2,-3],[-1,-3],[-13,-23],[-14,-25],[-17,-32],[-23,-43],[-14,-25],[-4,-7]],[[7066,6051],[-10,-19]],[[7056,6032],[-11,13],[-8,-14],[-4,-8],[11,-8],[2,-1],[-4,-8],[-1,-1],[-4,-7]],[[7037,5998],[-7,5],[-7,5],[-7,5],[-6,4],[-20,-36],[-5,-9]],[[6985,5972],[-12,9],[-14,10],[-13,10]],[[6946,6001],[6,11],[2,5],[1,1],[1,3],[2,6],[8,15],[18,34],[1,4],[3,8],[2,11],[3,6],[4,-3],[69,-51]],[[8088,5335],[-3,1],[-7,4],[-2,1],[-22,12],[-3,1],[-8,4]],[[8043,5358],[-8,5],[-2,1],[-44,22],[-10,5],[-11,6]],[[7968,5397],[10,18]],[[7978,5415],[10,19]],[[7988,5434],[12,-6],[52,-27],[11,-5]],[[8063,5396],[11,-5],[24,-13],[8,-4],[2,-2]],[[8453,7042],[-11,-20]],[[8442,7022],[-59,43]],[[8383,7065],[11,20],[8,15],[7,14]],[[8409,7114],[59,-43]],[[8468,7071],[-7,-14],[-8,-15]],[[8475,7085],[-59,43]],[[8416,7128],[7,14],[41,77],[25,-19],[-3,-8],[33,-25]],[[8519,7167],[-10,-18],[-26,-50],[-8,-14]],[[8417,6967],[-5,3],[-11,8]],[[8401,6978],[-30,22],[-15,11],[-2,1],[-3,3]],[[8351,7015],[2,3],[6,12],[10,20],[10,18]],[[8379,7068],[4,-3]],[[8442,7022],[-9,-17]],[[8433,7005],[-8,-15],[-8,-15],[0,-4],[0,-4]],[[8360,6900],[-16,13],[-18,12]],[[8326,6925],[-13,10],[-6,-3]],[[8307,6932],[17,32],[4,8],[11,20],[1,2],[9,16],[2,5]],[[8401,6978],[-2,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-3],[-11,-21],[-15,-27],[-9,-23]],[[8384,6768],[-19,-1],[-15,0]],[[8350,6767],[1,2],[2,15],[1,3],[2,11],[0,3],[-3,0],[-15,4],[-2,2],[0,2],[1,7]],[[8337,6816],[6,22],[5,21],[7,21],[-23,17],[-15,11],[9,17]],[[8360,6900],[17,-12],[3,-2],[30,-20]],[[8410,6866],[1,-1],[16,-12]],[[8427,6853],[-6,-10],[-13,-54],[-17,-1],[-8,0],[1,-20]],[[8272,6779],[-7,-14],[-2,-10],[0,-13],[4,-14],[11,-16],[19,-27]],[[8297,6685],[9,-8],[13,-6],[17,-5],[3,-1]],[[8339,6665],[-1,-3],[-1,-4],[-1,-3],[-1,-3],[-4,-10],[-3,-9],[27,-19],[62,-45]],[[8417,6569],[-2,-4],[-2,-2]],[[8413,6563],[-24,18],[-18,13],[-13,9],[-4,3],[-4,3],[-4,2],[-3,3],[-4,3],[-19,14],[-3,3],[-10,8],[-7,6],[-14,11],[-4,4],[-3,3],[-3,3],[-4,4],[-2,2],[-3,3],[-9,9],[-5,5],[-3,3],[-1,1],[-5,4],[-5,6],[-23,23]],[[8216,6729],[0,2],[0,2],[0,1],[-1,2],[0,2],[1,2],[1,2],[1,1],[1,3],[1,1],[1,4],[2,4],[2,6],[2,7],[1,3],[2,4],[1,3],[2,5],[1,4],[1,4],[2,5],[2,5],[2,4],[1,3],[3,5],[3,6],[6,11],[4,9],[6,11],[5,9],[6,12],[5,8],[10,20],[17,33]],[[8337,6816],[-25,7],[-2,-5],[-12,8],[-5,-9],[-18,11],[-10,-19],[17,-12],[-10,-18]],[[7644,6528],[-13,-22]],[[7631,6506],[-32,24]],[[7599,6530],[-32,25],[-17,13]],[[7550,6568],[7,22],[3,10]],[[7560,6600],[10,12],[2,3]],[[7634,6435],[-15,-16]],[[7619,6419],[-5,8],[-9,11],[-12,12]],[[7593,6450],[5,9],[6,6],[8,8],[9,13],[10,20]],[[7593,6450],[-49,38]],[[7544,6488],[5,9],[3,8],[8,-3],[16,-12],[12,21],[11,19]],[[7544,6488],[-5,3],[-10,2]],[[7529,6493],[1,11],[16,51],[4,13]],[[8063,5396],[10,18]],[[8073,5414],[9,-4],[1,-1],[23,-11],[2,-1],[8,-4],[2,-2]],[[8073,5414],[10,19],[10,19],[8,-4],[7,-4],[5,11],[12,22],[13,-9],[-6,-13],[-10,-18],[3,-2],[11,-5],[2,-1]],[[7988,5434],[10,18]],[[7998,5452],[2,3],[8,16]],[[8008,5471],[10,19],[20,39]],[[8038,5529],[20,38]],[[8058,5567],[75,-39],[29,-15],[6,-3],[9,-4],[2,-1]],[[8058,5567],[8,15],[10,21]],[[8076,5603],[76,-39],[29,-15],[9,-4],[6,-3],[3,-2]],[[8209,5561],[-10,-21]],[[8076,5603],[7,11],[5,10],[11,20]],[[8099,5644],[11,-6],[55,-27],[9,-5]],[[8174,5606],[-11,-20],[12,-6],[32,-17],[2,-2]],[[8026,5219],[-4,-7]],[[8022,5212],[-3,1],[-9,5],[-5,2],[-18,9],[-9,5]],[[7978,5234],[12,23],[6,11],[6,11],[2,4]],[[8004,5283],[41,-22],[2,-1]],[[8047,5260],[-2,-3],[-10,-20],[-9,-18]],[[8006,5182],[-10,-20]],[[7996,5162],[-3,1],[-24,12],[-17,9],[14,26],[12,24]],[[8022,5212],[-6,-11],[-10,-19]],[[7942,5060],[-3,-6]],[[7939,5054],[-3,1],[-33,16],[-8,4]],[[7895,5075],[-31,15]],[[7864,5090],[-36,19],[-8,4]],[[7820,5113],[11,23],[12,22],[12,23]],[[7855,5181],[24,45],[12,23],[12,23]],[[7903,5272],[12,23]],[[7915,5295],[12,23],[2,3]],[[7929,5321],[75,-38]],[[7996,5162],[-12,-21]],[[7984,5141],[-11,-22],[-11,-22]],[[7962,5097],[-10,-19],[-10,-18]],[[7895,5075],[-11,-20],[-12,-23],[-12,-24],[-10,-18]],[[7850,4990],[-63,31],[-3,1],[-10,5]],[[7774,5027],[10,18],[12,25],[12,23]],[[7808,5093],[9,-5],[3,-1],[37,-18],[4,11],[3,10]],[[7866,4917],[-9,5],[-34,17]],[[7823,4939],[17,32],[10,19]],[[7939,5054],[-6,-12],[-5,-9],[-4,-8]],[[7924,5025],[-6,-11],[-3,-3],[-2,-4],[-11,-21],[-9,-18]],[[7893,4968],[-10,-18],[-8,-15],[-9,-18]],[[7913,4893],[-9,5],[-26,13],[-12,6]],[[7893,4968],[9,-4],[3,-1],[19,-10],[10,-4]],[[7934,4949],[-7,-19]],[[7927,4930],[-7,-17],[-7,-20]],[[7961,4869],[-9,5],[-30,15],[-9,4]],[[7927,4930],[9,-4],[30,-15],[9,-5]],[[7975,4906],[-7,-18],[-7,-19]],[[7961,4869],[-6,-18],[-7,-18]],[[7948,4833],[-9,5],[-30,14],[-9,5]],[[7900,4857],[6,18],[-9,5],[-26,13],[-5,3],[-3,1],[-7,2]],[[7856,4899],[6,10],[2,5],[2,3]],[[7711,4725],[-68,52]],[[7643,4777],[6,12],[6,11],[6,11],[6,12]],[[7667,4823],[68,-52]],[[7735,4771],[-6,-12],[-6,-11],[-6,-11],[-6,-12]],[[7749,4696],[-12,-25]],[[7737,4671],[-10,9],[-29,21],[-67,53]],[[7631,4754],[6,11],[6,12]],[[7711,4725],[29,-22],[9,-7]],[[7726,4651],[-38,30]],[[7688,4681],[-67,52]],[[7621,4733],[5,10],[5,11]],[[7737,4671],[-5,-10],[-6,-10]],[[3815,1681],[-46,-14],[-2,0],[-1,2],[-5,22],[-11,-3],[-4,-2],[-6,-6],[-18,-23],[-18,79]],[[3704,1736],[18,22],[6,7],[14,4],[50,16],[-3,12],[8,3],[11,4],[8,5],[7,3],[12,5],[20,5]],[[3855,1822],[6,-26],[1,-7],[3,-37],[2,-21],[-31,-10],[-8,-3],[-9,-2],[-8,-1],[0,-12],[1,-10],[3,-12]],[[3914,1792],[7,-27],[3,-16]],[[3924,1749],[-20,-6],[-23,-8],[3,-20],[2,-11],[1,-11],[3,-25],[2,-12],[4,-31],[1,-4],[3,-8],[4,-8],[10,-14],[2,-3],[2,-3],[0,-1]],[[3918,1584],[-37,1],[-3,0],[-5,1],[-10,0],[-66,1],[-49,-3],[-3,0],[-36,-5],[-16,-2]],[[3693,1577],[-2,8]],[[3691,1585],[25,5],[11,3],[9,6],[22,1],[16,2],[6,-1],[-1,12],[0,3],[0,6],[-2,8],[-2,10],[0,2],[2,2],[44,13],[-6,24]],[[3855,1822],[9,3]],[[3864,1825],[3,-2],[6,-1],[4,-1],[4,0],[13,-1],[13,3]],[[3907,1823],[3,-12],[4,-19]],[[4066,1586],[3,-5]],[[4069,1581],[-143,3],[-1,0],[-6,0],[-1,0]],[[3924,1749],[19,7],[3,0],[8,-33]],[[3954,1723],[19,-86],[3,-2],[3,0],[7,-3],[6,-3],[15,-11],[4,-30],[26,-1],[29,-1]],[[4037,1733],[-26,-7],[-2,-2],[-1,-4],[-17,-20],[-3,-4],[-5,8],[-6,7],[-8,6],[-10,4],[-3,0],[-2,2]],[[3914,1792],[61,48],[12,-22],[6,-10],[3,-13],[25,20],[16,-82]],[[4037,1733],[12,-59],[23,6]],[[4072,1680],[10,-46],[4,-25],[4,-23],[-24,0]],[[4204,1662],[15,-81],[-19,1],[3,-6]],[[4203,1576],[-95,4],[-39,1]],[[4072,1680],[26,9],[10,2]],[[4108,1691],[6,-34],[1,-2],[3,-1],[23,0],[29,-1],[16,4],[18,5]],[[4108,1691],[-6,30],[1,4],[21,17],[16,12],[26,7],[18,5],[22,6]],[[4206,1772],[3,-18],[3,-17],[3,-17],[4,-17],[3,-18],[4,-17],[-22,-6]],[[5108,1550],[-230,8],[-32,1],[-64,-2],[-93,2]],[[4689,1559],[-2,0],[-182,7],[-261,8]],[[4244,1574],[-6,0],[-35,2]],[[4206,1772],[17,5],[23,6],[-1,4],[-4,23],[-6,33],[-17,91],[147,186]],[[4365,2120],[155,-161],[188,239],[184,246],[127,167],[24,34],[10,4],[3,3],[1,-1],[-2,-4],[14,-10],[10,-8],[12,-9],[17,-12],[10,-7],[146,-147],[5,-6],[38,-39],[47,-50],[3,-3]],[[5357,2356],[-1,0],[-5,-7],[-26,-33],[-22,-26],[-1,-2],[-3,-3],[-26,-33],[-46,-57],[-32,-41],[-18,-22],[-12,-14],[-9,-12],[-6,-7],[-12,-15],[-5,-6],[-7,-8],[-22,-27],[-10,-13],[-37,-43],[-31,-37],[2,-3],[1,-2],[4,-9],[3,-9],[1,-3],[3,-14],[6,-32],[19,-101],[22,-114],[19,-105],[2,-8]],[[8142,5727],[-9,5],[-66,37]],[[8067,5769],[12,23],[12,22]],[[8091,5814],[63,-35],[12,-7]],[[8166,5772],[-12,-22],[-12,-23]],[[8067,5769],[-22,13],[-18,10],[-17,10]],[[8010,5802],[-7,3],[-2,1],[-9,5],[12,23],[12,23]],[[8016,5857],[75,-43]],[[7745,5975],[28,51],[2,4],[4,6],[15,29]],[[7794,6065],[3,-3]],[[7797,6062],[21,-16],[16,-11]],[[7834,6035],[31,-22],[15,-12],[3,-8]],[[7883,5993],[-4,-2],[-36,-21],[-11,-6],[-6,-3],[-8,-3],[-8,-2],[-5,0]],[[7805,5956],[-4,0],[-4,0],[-6,0],[-6,1],[-8,2],[-4,1],[-7,4],[-10,5],[-7,4],[-4,2]],[[7794,6065],[-4,1],[-6,-2],[-21,15],[-16,12],[-15,13]],[[7732,6104],[9,17]],[[7741,6121],[24,-17],[9,19],[6,-4],[7,5],[5,10],[-31,24],[11,21],[10,19]],[[7782,6198],[2,2],[12,22]],[[7796,6222],[53,-40],[3,-2],[3,-2]],[[7855,6178],[-6,-11],[-14,-27],[-7,-13],[-5,-9],[-16,-30],[-13,-23]],[[7741,6121],[-21,17],[-17,12],[31,57],[8,14]],[[7742,6221],[4,3],[36,-26]],[[7732,6104],[-56,42],[-16,12],[-28,21],[-16,12]],[[7616,6191],[15,29]],[[7631,6220],[12,22],[7,12],[3,8],[11,18]],[[7664,6280],[41,-31],[4,-4],[16,-11],[17,-13]],[[7660,6327],[4,-8],[9,-22]],[[7673,6297],[-9,-17]],[[7631,6220],[-17,12],[-8,6],[-11,25],[-18,14],[-14,11]],[[7563,6288],[23,14],[25,44],[15,9],[8,-19],[9,-19],[17,10]],[[7616,6191],[-21,-37],[-2,-3],[-4,-3],[-6,-4]],[[7583,6144],[-2,4],[-16,36]],[[7565,6184],[-10,23],[-10,19],[-19,34]],[[7526,6260],[-31,55]],[[7495,6315],[16,12],[16,9],[10,-17]],[[7537,6319],[10,-17],[10,-18],[6,4]],[[7645,6361],[15,-34]],[[7537,6319],[22,14],[19,35],[4,7],[1,9],[-2,9],[16,11],[22,15]],[[7619,6419],[8,-15],[18,-43]],[[7642,6444],[16,-12],[21,-52]],[[7679,6380],[-17,-9],[-17,-10]],[[7679,6380],[17,9]],[[7696,6389],[6,-6],[17,-12]],[[7719,6371],[-19,-33],[-12,-22],[-15,-19]],[[7720,6501],[17,-13]],[[7737,6488],[-1,-3],[-33,-60],[-4,-6],[-5,-5],[-7,-3],[9,-22]],[[7737,6488],[17,-13],[16,-12]],[[7770,6463],[-2,-2],[-23,-43],[-10,-18]],[[7735,6400],[-9,-18],[-7,-11]],[[7785,6364],[-17,11]],[[7768,6375],[-33,25]],[[7770,6463],[17,-12],[2,-2],[3,-2],[8,-5],[3,-2],[2,-2],[7,-3],[6,-2],[3,-2],[-1,-3],[-35,-64]],[[7862,6383],[-20,-35],[-15,-16],[-10,-18]],[[7817,6314],[-28,20],[-31,25],[10,16]],[[7785,6364],[15,-12],[10,18],[13,-11],[5,2],[17,33],[17,-11]],[[7817,6314],[-15,-28],[20,-15],[-5,-10],[-21,-39]],[[7862,6383],[10,18],[1,3],[17,-13],[17,-13],[32,-21],[6,-4],[1,-1],[6,-4],[4,-2],[3,-3]],[[7959,6343],[-3,-3],[-13,-14],[-4,-5],[-3,-4],[-4,-4],[-4,-6],[-3,-5],[-5,-6],[-1,-3],[-5,-7],[-1,-2],[-3,-5],[-2,-4],[-3,-5],[-19,-35],[-2,-4],[-3,-5],[-4,-8],[-5,-9],[-5,-10],[-3,-4],[-4,-7],[-4,-8],[-1,-2]],[[7817,6675],[38,-27]],[[7855,6648],[38,-28],[33,-23],[52,-41]],[[7978,6556],[53,-39]],[[8031,6517],[17,-14],[17,-15],[3,-3],[3,-2]],[[8071,6483],[-4,-8],[-5,-9],[-6,-8],[-4,-6],[-9,-12],[-6,-8],[-8,-9],[-17,-19],[-12,-13],[-23,-27],[-3,-3],[-3,-3],[-2,-3],[-2,-3],[-8,-9]],[[7978,6556],[3,8]],[[7981,6564],[13,24]],[[7994,6588],[54,-40],[-17,-31]],[[7981,6564],[-20,14],[-14,10],[-18,14],[11,24],[10,18]],[[7950,6644],[34,-24],[9,17],[1,2]],[[7994,6639],[20,-13]],[[8014,6626],[-2,-3],[-18,-35]],[[7855,6648],[21,22],[0,5],[-4,1],[9,17]],[[7881,6693],[42,-31],[27,-18]],[[7881,6693],[4,8],[3,11],[1,3]],[[7889,6715],[4,10],[4,7]],[[7897,6732],[17,-11],[16,-12],[16,-11],[16,-11]],[[7962,6687],[-9,-18],[41,-30]],[[7962,6687],[13,23],[6,12]],[[7981,6722],[44,-31],[17,-12]],[[8042,6679],[-19,-36],[-9,-17]],[[7897,6732],[12,24],[8,15]],[[7917,6771],[13,26]],[[7930,6797],[16,-12],[15,-11],[15,-10],[16,-12]],[[7992,6752],[-11,-30]],[[7930,6797],[10,18],[-37,28]],[[7903,6843],[10,18],[38,-27],[15,-12],[29,-20],[-10,-19],[17,-11],[-10,-20]],[[7917,6771],[-17,12],[-45,31],[-2,1],[-2,1],[-1,1],[1,1],[1,1],[2,0],[9,17]],[[7863,6836],[27,-19],[13,26]],[[7889,6715],[-25,18],[-24,18],[-11,8],[-6,4],[-29,20]],[[7794,6783],[50,49],[8,11]],[[7852,6843],[11,-7]],[[7742,6726],[6,10],[1,3],[11,12],[31,29],[3,3]],[[7653,6788],[-162,125],[-8,5],[-7,6],[-4,4],[-18,7]],[[7454,6935],[34,20],[-13,22],[-4,7]],[[7471,6984],[16,3],[12,3],[6,3],[10,4],[7,4],[7,5],[11,8],[3,2],[7,6],[3,2],[5,4],[17,15],[14,13],[13,14],[9,9],[3,4],[5,5],[7,8],[19,22]],[[7645,7118],[2,-2],[24,-17],[9,-12],[4,-13],[2,-10],[5,-8],[6,-7],[11,-8],[18,-11],[37,-20],[57,-32],[9,-6],[19,-12],[1,-1],[5,-5],[2,-3],[4,-9],[1,-5],[2,-7],[-27,-52],[25,-18],[-9,-17]],[[7509,6479],[3,29],[11,40]],[[7523,6548],[7,19],[7,24]],[[7537,6591],[6,22],[17,-13]],[[7529,6493],[-2,-17],[-18,3]],[[7490,6478],[3,19],[-56,43],[-1,4],[10,13],[12,16],[12,15]],[[7470,6588],[53,-40]],[[7509,6479],[-10,-1],[-9,0]],[[7490,6478],[-14,-5]],[[7476,6473],[-6,18],[-59,43],[0,4],[9,17],[35,44]],[[7455,6599],[15,-11]],[[7428,6417],[-17,12]],[[7411,6429],[11,17],[12,19],[8,11],[1,1],[1,7],[-44,33]],[[7400,6517],[-19,14],[9,15],[14,18]],[[7404,6564],[17,24],[19,23],[15,-12]],[[7476,6473],[-11,-6],[-7,-7],[-9,-10],[-14,-22],[-7,-11]],[[7411,6429],[-38,27],[7,21],[9,21],[11,19]],[[7428,6417],[-12,-18]],[[7416,6399],[-67,50]],[[7349,6449],[-12,9],[-9,8],[-3,2],[-2,3],[-6,7],[-4,5],[-5,6],[-6,9],[-5,8],[-5,11],[-7,16]],[[7285,6533],[9,15],[43,68],[34,-26],[33,-26]],[[7335,6358],[-16,12]],[[7319,6370],[1,2],[-16,12],[-43,31],[-16,12],[-6,-13]],[[7239,6414],[-57,41],[-23,16]],[[7159,6471],[55,111],[2,4],[13,27],[2,4]],[[7231,6617],[1,-2],[9,-13],[12,-15],[6,-7],[5,-8],[5,-7],[7,-12],[3,-8],[2,-4],[4,-8]],[[7349,6449],[-1,-4],[-8,-21],[35,-26],[0,-6],[-9,-1],[-8,-4],[-7,-4],[-6,-8],[-10,-17]],[[7294,6308],[-17,12],[-39,30],[-17,13]],[[7221,6363],[18,51]],[[7319,6370],[-7,-21],[-9,-24],[-9,-17]],[[7276,6266],[-72,53],[17,44]],[[7294,6308],[-6,-10],[-4,-11],[-3,-11],[-5,-10]],[[7300,6230],[-27,-49],[-15,12],[-16,11]],[[7242,6204],[1,3],[11,18],[10,19],[5,9]],[[7269,6253],[16,-12],[15,-11]],[[7294,6142],[-44,32]],[[7250,6174],[-17,13]],[[7233,6187],[9,17]],[[7300,6230],[14,-11],[-25,-48],[15,-12],[-10,-17]],[[7309,6130],[-15,12]],[[7300,6230],[12,23],[1,3],[2,0],[10,-8],[-1,-5],[3,-2],[21,-15],[4,-3],[5,-10]],[[7357,6213],[-6,-7],[-6,-9],[-27,-50],[-9,-17]],[[7293,6088],[-57,43],[-1,2],[-1,2],[0,2],[6,16],[4,10],[3,6],[1,3],[2,2]],[[7309,6130],[-1,-3],[-8,-18],[-7,-21]],[[7293,6088],[-5,-19],[-3,-16]],[[7285,6053],[-6,2],[-12,8],[-12,9],[-15,12],[-15,10],[-2,-2],[-15,-28]],[[7208,6064],[-23,17]],[[7185,6081],[7,11],[4,7],[9,18],[1,1],[7,17],[12,39],[6,10],[2,3]],[[7285,6053],[-2,-27],[-1,-25]],[[7282,6001],[-18,0]],[[7264,6001],[0,22],[-25,18],[-15,11],[-16,12]],[[7264,6001],[-18,-1]],[[7246,6000],[-1,11],[-72,54]],[[7173,6065],[12,16]],[[7159,6046],[7,12],[7,7]],[[7246,6000],[-18,1]],[[7228,6001],[-16,6],[-7,6],[-46,33]],[[7186,5977],[-47,34],[10,18],[10,17]],[[7228,6001],[0,-12],[0,-5],[-5,-9],[-27,19],[-10,-17]],[[7228,5945],[-8,-19],[-14,8],[-6,-12]],[[7200,5922],[-15,11]],[[7185,5933],[-16,12]],[[7169,5945],[6,12],[11,20]],[[7246,6000],[0,-14],[-1,-9],[-17,-32]],[[7185,5933],[-7,-15],[-14,10]],[[7164,5928],[-10,7],[-8,6],[-16,12],[-16,12]],[[7114,5965],[-14,10],[-13,9],[8,15]],[[7095,5999],[13,-9],[14,-11],[17,-12],[15,-11],[15,-11]],[[7134,5863],[-14,10],[-13,10]],[[7107,5883],[25,45],[-14,10],[-13,10]],[[7105,5948],[4,8],[5,9]],[[7164,5928],[1,-6],[-7,-14]],[[7158,5908],[-5,-8],[-19,-37]],[[7107,5883],[-13,9],[-13,10]],[[7081,5902],[24,46]],[[7081,5902],[-14,10],[-15,11],[-12,9],[-13,10]],[[7027,5942],[4,8],[8,13],[13,-9],[13,24]],[[7065,5978],[13,-10],[14,-10],[13,-10]],[[7027,5942],[-15,10]],[[7012,5952],[5,9],[20,37]],[[7037,5998],[8,-6],[6,-5],[7,-4],[7,-5]],[[7056,6032],[39,-33]],[[6510,2056],[-62,41]],[[6448,2097],[8,19],[4,10],[5,10],[13,28],[4,7],[10,10]],[[6492,2181],[59,-38]],[[6551,2143],[-11,-23]],[[6540,2120],[-11,-23],[-10,-22],[-9,-19]],[[6613,2074],[-73,46]],[[6551,2143],[11,23]],[[6562,2166],[63,-41],[10,-6]],[[6635,2119],[-11,-23],[-11,-22]],[[6492,2181],[7,7]],[[6499,2188],[11,11],[6,6],[3,5],[5,12]],[[6524,2222],[49,-31]],[[6573,2191],[-11,-25]],[[7962,6172],[-19,-42]],[[7943,6130],[-8,4],[-6,2],[-6,1],[-21,-2]],[[7902,6135],[-1,21],[1,5],[3,7],[10,-7],[10,0],[17,31],[8,15]],[[7950,6207],[19,-15]],[[7969,6192],[-7,-20]],[[7911,6055],[-14,11]],[[7897,6066],[16,40],[-15,11],[-15,11],[5,9]],[[7888,6137],[6,-2],[8,0]],[[7943,6130],[-15,-36],[-17,-39]],[[7897,6066],[-19,12],[-14,11],[-10,-17],[-8,-15],[-12,-22]],[[7797,6062],[2,2],[54,100],[27,-21],[8,-6]],[[7911,6055],[-4,-15],[-1,-14],[2,-24]],[[7908,6002],[-4,-1],[-8,-3],[-10,-3],[-3,-2]],[[8016,5857],[7,19],[8,19],[10,-6],[61,-34],[4,-3]],[[8106,5852],[-7,-19],[-8,-19]],[[8016,5857],[-29,17]],[[7987,5874],[12,16],[12,16],[31,54]],[[8042,5960],[13,-7]],[[8055,5953],[21,-11],[17,-10],[10,-5],[7,-4]],[[8110,5923],[17,-10]],[[8127,5913],[-6,-18],[-6,-19],[-2,-4],[-7,-20]],[[8055,5953],[14,35],[2,3]],[[8071,5991],[21,-12],[17,-9],[15,-9]],[[8124,5961],[-1,-3],[-6,-16],[-7,-19]],[[8203,5870],[-46,26],[-30,17]],[[8124,5961],[17,-8]],[[8141,5953],[13,-7],[15,-9]],[[8169,5937],[48,-26]],[[8217,5911],[0,-2],[-1,-2],[-13,-37]],[[8110,6073],[5,-3],[17,-6],[7,-3],[5,-5],[2,-8],[0,-8],[-3,-8],[-23,-42],[31,-18]],[[8151,5972],[-9,-16],[-1,-3]],[[8071,5991],[10,20],[16,29]],[[8097,6040],[13,33]],[[8151,5972],[10,19],[-11,8],[-1,5],[13,24],[4,2],[11,-8],[6,9],[7,13]],[[8190,6044],[13,11],[7,-19]],[[8210,6036],[12,-20],[-56,-71],[3,-8]],[[8110,6073],[9,19],[6,10],[8,13],[5,11],[6,16]],[[8144,6142],[14,-21]],[[8158,6121],[-3,-7],[-6,-17],[4,-3],[9,-14],[10,-15],[13,-19],[5,-2]],[[8097,6040],[-20,12]],[[8077,6052],[-17,10],[-34,20]],[[8026,6082],[10,18],[2,4],[17,31]],[[8055,6135],[10,17],[10,15],[15,17]],[[8090,6184],[15,15],[21,-30]],[[8126,6169],[18,-27]],[[8239,6072],[-29,-36]],[[8158,6121],[14,-20],[17,10],[17,9],[22,10],[-2,13],[-9,6],[-8,7],[-14,12],[-4,7]],[[8191,6175],[-9,25],[-19,8],[6,29]],[[8169,6237],[3,-1],[23,-61],[39,-33],[1,-45],[2,-14],[0,-6],[2,-5]],[[8158,6121],[8,22],[11,36],[14,-4]],[[5974,986],[0,-2]],[[5974,984],[-3,1],[-30,17],[-33,16],[-19,4],[-18,3],[-1,0],[-9,2],[-12,-10],[-11,-20],[-9,5],[-1,2],[1,5],[1,3],[7,10],[0,1],[-1,2],[-4,7],[-4,0],[-5,1],[-1,1],[-1,0],[-3,0],[-2,0],[-4,-15],[-3,2],[-7,4],[3,12],[-5,1],[-1,8],[-6,1],[0,2],[-4,1],[0,-4],[-1,0],[-1,0],[0,-7],[-3,0],[-1,7],[-5,0],[0,-4],[-3,-1],[0,-2],[-1,0],[-6,-1],[0,-3],[-3,0],[0,-2],[-31,-12],[-14,0],[-10,0],[0,-3],[0,-5],[0,-10],[8,-2],[0,-3],[-10,2],[-2,2],[0,8],[0,11],[-3,0],[-2,-2],[-11,-1]],[[5690,1018],[6,1],[2,19],[1,3]],[[5699,1041],[8,15],[5,18],[1,2],[7,10],[13,5],[21,7],[6,1],[8,0],[8,1],[18,2]],[[5794,1102],[15,3],[4,-1],[1,2],[46,2],[31,1],[13,1],[18,4]],[[5922,1114],[14,4],[21,7],[14,4],[1,0],[3,-4]],[[5975,1125],[-1,-36]],[[5974,1089],[0,-11]],[[5974,1078],[-10,0],[-9,1],[-18,3],[-19,3],[-17,2],[-3,-31],[-5,-32],[16,-4],[18,-7],[17,-10],[12,-8],[9,-5],[9,-4]],[[5977,881],[0,-10],[0,-16],[-2,-6]],[[5975,849],[-25,5],[-43,6],[-1,1],[-56,5],[-52,3],[-16,3],[-7,3],[-9,4],[-4,2],[-3,5],[-2,4],[0,6],[-1,2],[-67,27],[1,1],[1,3],[1,-1],[69,-28],[12,-5],[24,-4],[15,1],[14,3],[25,3],[13,3],[25,2],[20,-2],[30,-8],[16,-6],[22,-6]],[[5975,979],[1,-4],[0,-7]],[[5976,968],[-17,7],[-15,8],[-21,9],[-13,5],[-37,8],[-5,0],[-18,-4],[-1,5],[6,6],[8,6],[15,2],[6,0],[23,-8],[11,-4],[24,-12],[14,-10],[19,-7]],[[5978,906],[-2,1],[-6,8],[-15,14],[-7,2],[-27,6],[-22,2],[-4,0],[-11,-3],[-11,-1],[-11,0],[-4,1],[-2,2],[0,5],[0,7],[17,0],[4,2],[2,3],[1,0],[1,-3],[0,-3],[7,-2],[52,-7],[14,-3],[24,-8]],[[5978,929],[0,-6],[0,-17]],[[5794,1102],[-1,15]],[[5793,1117],[14,43],[4,12],[4,13]],[[5815,1185],[18,0],[27,1],[16,1],[-1,65]],[[5875,1252],[4,1],[12,0],[6,0],[22,1],[22,0]],[[5941,1254],[1,-66],[-21,-1],[1,-65],[0,-8]],[[5941,1254],[22,2],[2,-67],[0,-57],[10,3],[0,-5],[0,-5]],[[5815,1185],[-2,66]],[[5813,1251],[19,1],[43,0]],[[5813,1251],[-1,66]],[[5812,1317],[62,2],[22,0],[15,1],[7,0]],[[5918,1320],[8,0],[15,1]],[[5941,1321],[0,-67]],[[5813,1251],[-18,0],[-17,0],[0,-26],[-16,-2],[-3,27],[0,21],[-7,2],[0,24],[-11,0],[-43,1],[1,20]],[[5699,1318],[42,0],[32,-1]],[[5773,1317],[21,0],[18,0]],[[5773,1317],[0,26]],[[5773,1343],[-1,34]],[[5772,1377],[0,19],[0,19]],[[5772,1415],[20,0],[19,0]],[[5811,1415],[1,-98]],[[5773,1317],[-6,9],[-59,1],[-15,17]],[[5693,1344],[19,0]],[[5712,1344],[61,-1]],[[5712,1344],[-3,34]],[[5709,1378],[21,0],[7,2],[11,-1],[7,-2],[17,0]],[[5709,1378],[-2,19],[-1,20]],[[5706,1417],[17,0],[6,-1],[43,-1]],[[5693,1344],[-2,-4],[2,-22]],[[5693,1318],[-21,0]],[[5672,1318],[-5,64],[-1,18],[-1,11],[-1,6]],[[5664,1417],[1,5],[1,-3],[3,-1],[2,-1],[35,0]],[[5699,1318],[-6,0]],[[5810,1463],[1,-48]],[[5664,1417],[-1,20],[0,6],[0,8],[0,4],[0,27],[1,25],[0,3],[0,5],[0,4]],[[5664,1519],[11,0],[30,-2],[6,-1],[10,-1],[14,-1],[43,-5],[16,-2],[6,-1],[11,0],[0,-4],[0,-1],[-1,-5],[0,-33]],[[5683,1460],[-3,-20],[37,-1],[6,-1],[6,0],[5,0],[39,0],[0,19],[0,7],[0,20],[-87,2],[-2,-20],[-1,-6]],[[7012,5952],[-13,11],[-14,9]],[[6972,5772],[-49,36]],[[6923,5808],[-8,5],[-8,6],[-46,-86],[7,-6],[8,-5]],[[6876,5722],[49,-36]],[[6925,5686],[-4,-9],[-6,-11]],[[6915,5666],[-50,36]],[[6865,5702],[-6,5],[-5,3],[-4,5],[-4,4],[-7,10],[-3,4],[-5,5],[-4,3],[-4,4],[-11,7],[-15,10]],[[6797,5762],[33,60],[17,34],[1,3],[8,15],[8,16],[5,-3],[1,-3],[4,8],[11,24],[14,20],[9,14],[3,4],[2,4],[31,40],[2,3]],[[7027,5942],[-2,-4],[2,-5],[22,-17],[-20,-35],[-1,-2],[0,-1],[-56,-106]],[[6953,5737],[-49,36]],[[6904,5773],[9,17],[10,18]],[[6972,5772],[-9,-17],[-5,-9],[-5,-9]],[[6904,5773],[-10,-18],[-9,-16],[-9,-17]],[[6953,5737],[-5,-9],[-4,-8]],[[6944,5720],[-5,-9],[-4,-9],[-10,-16]],[[6953,5737],[60,-44],[-4,-9],[-5,-9]],[[7004,5675],[-60,45]],[[6995,5659],[-9,-17],[-61,44]],[[7004,5675],[-9,-16]],[[6995,5659],[36,-27],[2,-1],[8,-6],[19,-13],[1,-1],[6,-4]],[[7067,5607],[-3,-6],[-5,-8],[-2,-4],[-2,-3],[-9,-16]],[[7046,5570],[-12,9]],[[7034,5579],[-59,43]],[[6975,5622],[-60,44]],[[7004,5675],[36,-25],[30,-21],[7,-5]],[[7077,5624],[-1,-1],[-4,-8]],[[7072,5615],[-4,-7],[-1,-1]],[[7092,5536],[-46,34]],[[7072,5615],[45,-32]],[[7117,5583],[-4,-8],[-5,-7]],[[7108,5568],[-4,-7],[-4,-8]],[[7100,5553],[-7,-15],[-1,-2]],[[7072,5495],[-60,44]],[[7012,5539],[5,9],[5,9],[5,9],[5,10],[2,3]],[[7092,5536],[-1,-3],[0,-3],[-4,-8],[-5,-9],[-5,-9],[-5,-9]],[[7059,5470],[-20,15],[-4,-8],[-40,30]],[[6995,5507],[4,7],[4,8],[4,8],[5,9]],[[7072,5495],[-5,-9],[-8,-16]],[[7092,5536],[61,-44]],[[7153,5492],[-2,-3],[-5,-10],[-5,-10],[-5,-8],[-5,-9],[-13,-25],[-59,43]],[[7246,5424],[-33,24]],[[7213,5448],[-49,36],[-11,8]],[[7100,5553],[73,-53]],[[7173,5500],[63,-46],[18,-13]],[[7254,5441],[-4,-8],[-4,-9]],[[7108,5568],[73,-53]],[[7181,5515],[-4,-8],[-4,-7]],[[7117,5583],[73,-53]],[[7190,5530],[-5,-8],[-4,-7]],[[7117,5583],[4,7],[4,8],[72,-53],[-4,-8],[-3,-7]],[[7394,5476],[-9,-18],[-9,-17],[-12,-22]],[[7364,5419],[-18,13],[-6,5],[-5,3],[-2,0],[-3,4],[-8,9],[-6,5],[-5,5],[-32,23],[-7,-13],[-1,-2]],[[7271,5471],[-26,20],[-4,-8],[-4,-8],[-56,40]],[[7077,5624],[3,6],[2,4],[81,145],[2,3],[20,39],[2,3]],[[7187,5824],[55,-39]],[[7242,5785],[22,-17],[45,-33],[54,-39]],[[7363,5696],[54,-40],[28,-21],[26,-18]],[[7471,5617],[-2,-3],[-8,-14],[-2,-4]],[[7459,5596],[-9,-17],[-9,-17],[-9,-17]],[[7432,5545],[-9,-17],[-9,-17],[-12,-21],[-8,-14]],[[7271,5471],[-4,-8],[-5,-8],[-4,-7],[-4,-7]],[[7364,5419],[-7,-12]],[[7357,5407],[-10,-18],[-8,-16],[-7,-12]],[[7332,5361],[-25,18],[-5,5],[-30,21]],[[7272,5405],[-26,19]],[[7250,5365],[-59,43]],[[7191,5408],[5,9],[5,9],[5,9],[5,10],[2,3]],[[7272,5405],[-2,-3],[-10,-19],[-5,-9],[-5,-9]],[[7312,5324],[-8,5],[-54,36]],[[7332,5361],[-1,-3],[-11,-19],[-2,-3],[-6,-12]],[[7287,5277],[-12,-21]],[[7275,5256],[-86,63],[18,33],[-33,25],[3,7],[5,7],[4,8],[5,9]],[[7312,5324],[-2,-5],[-3,-5],[-9,-16],[-11,-21]],[[7400,5318],[6,-9],[2,-3],[2,-3],[3,-2],[10,-7],[5,-4],[20,-14]],[[7448,5276],[-2,-3],[-13,-22],[-8,7],[-42,30],[-1,4],[-5,-10],[-5,-9]],[[7372,5273],[-12,-20],[-14,-20]],[[7346,5233],[-3,2],[-2,2],[-3,2],[-2,1],[-1,1],[-48,36]],[[7332,5361],[28,-21],[4,-2],[4,-3],[4,-1],[9,-1],[3,-2],[5,-2],[2,-2],[2,-2],[1,0],[4,-4],[2,-3]],[[7357,5407],[52,-38],[1,-1],[3,-2],[2,-2],[2,-1],[3,-2]],[[7420,5361],[-10,-17],[-2,-5],[-5,-11],[0,-3],[-3,-7]],[[7491,5278],[-13,-24]],[[7478,5254],[-15,11],[-15,11]],[[7420,5361],[55,-40]],[[7475,5321],[-1,-14],[6,-11],[11,-18]],[[7394,5476],[28,-22],[24,-16],[3,-3],[3,-2],[4,-3]],[[7456,5430],[-9,-18],[-9,-17],[56,-41]],[[7494,5354],[-15,-13],[-4,-20]],[[7456,5430],[30,-22],[8,0],[6,-29]],[[7500,5379],[3,-17],[-9,-8]],[[6950,1933],[-103,-90],[-127,-106]],[[6720,1737],[-8,5],[29,47],[-22,15]],[[6719,1804],[5,11],[19,27],[35,50]],[[6778,1892],[2,3],[9,10],[4,5],[10,9],[12,11],[4,3]],[[6819,1933],[70,-44],[17,14]],[[8350,6767],[0,-4],[-2,-21],[-1,-5]],[[8347,6737],[0,-5],[-2,-22]],[[8345,6710],[-3,0],[-17,1],[2,28]],[[8327,6739],[1,20],[-16,1],[-11,2],[-13,5],[-16,12]],[[8327,6739],[-32,3],[-6,0],[-5,-2],[3,-7],[5,-8],[3,-3],[12,-3],[-2,-21],[-2,-7],[-6,-6]],[[8345,6710],[0,-4],[-1,-8],[-1,-7],[-1,-8],[-1,-9]],[[8341,6674],[-1,-2],[-1,-7]],[[8531,6462],[-10,-17],[-2,-5],[-10,-18]],[[8441,6440],[22,43],[-17,11],[-24,-45]],[[8422,6449],[-3,1],[-12,9],[-3,3],[-3,4],[0,3],[-1,5],[0,4],[2,6],[1,7],[0,6],[-1,7],[-2,3],[-3,2],[-34,25],[-16,-31],[-3,-6],[-2,-4],[-4,-8],[-1,-10],[0,-9],[1,-15],[-2,-8],[-4,-9]],[[8332,6434],[-7,3],[-40,17],[-26,14],[-2,-3],[-15,-39],[-1,-1],[-3,-5],[-4,-7]],[[8234,6413],[-5,-1],[-99,53],[-5,-14]],[[8125,6451],[-18,9],[-24,15],[-4,2],[-4,4],[-4,2]],[[8071,6483],[4,6],[34,65],[1,3]],[[8110,6557],[2,3],[13,26],[12,23],[3,6],[2,3],[4,8],[4,6],[8,12],[6,7],[9,12],[10,10],[6,8],[7,11]],[[8196,6692],[1,0],[4,8],[6,9],[4,8],[4,9],[1,3]],[[8413,6563],[4,-3],[4,-2],[3,-3],[4,-3],[18,-13],[34,-26],[42,-31],[4,-3],[8,-6],[3,-1]],[[6526,1502],[-10,-3],[-62,2],[-43,2],[-3,-3],[-3,-1],[4,-9],[2,-3],[0,-4]],[[6411,1483],[0,-23],[0,-28]],[[6411,1432],[0,-15],[0,-20],[50,-33]],[[6461,1364],[-4,-10]],[[6457,1354],[-35,21],[-6,2],[-12,6],[-1,52],[-3,1],[-3,2],[-2,1],[-3,1],[-101,53],[-2,1],[-6,4],[-5,4],[-27,18],[-15,9],[-42,44],[0,58],[0,7],[-60,19],[-23,7]],[[6111,1664],[-8,3],[-6,1],[-4,1],[-1,1],[-6,2]],[[6086,1672],[0,1],[1,2],[0,2],[2,6],[0,1],[4,7],[27,56],[1,8],[2,4],[4,5],[0,1],[5,7],[4,5],[7,7],[9,8],[6,14]],[[6158,1806],[191,-124],[41,-24],[11,-6],[2,-2],[3,-2],[23,-14],[6,-3],[25,-17],[13,-7],[1,-1],[82,-50]],[[6556,1556],[88,-41]],[[6644,1515],[-22,-5],[-4,-1],[-30,-7],[-4,-1],[-11,-1],[-7,0],[-5,1],[-2,1],[-14,9],[-11,7],[-8,-16]],[[8422,6449],[-26,-50]],[[8396,6399],[-3,2],[-4,2],[-5,2],[-5,3],[-28,16],[-5,2],[-4,3],[-5,3],[-5,2]],[[8234,6413],[-2,-3],[-3,-6],[-2,-6],[-9,-20]],[[8218,6378],[-7,-20]],[[8211,6358],[-9,-21],[-7,-20]],[[8195,6317],[-21,-51],[-4,-24]],[[8170,6242],[-24,97],[-9,51],[-12,61]],[[8182,6349],[3,-2],[17,39],[9,24],[-17,9],[-34,19],[-3,-10],[0,-2],[-1,-6],[2,-5],[13,-37],[8,-23],[3,-6]],[[8170,6242],[-1,-2]],[[8169,6240],[0,-3]],[[8126,6169],[7,7],[4,13],[-2,5],[-39,56],[-2,3],[0,3],[1,10],[1,3],[-33,12],[-3,1]],[[8060,6282],[-3,1],[-34,13],[-2,1]],[[8021,6297],[-14,10],[-4,3],[-15,12],[-18,13],[-9,7],[-2,1]],[[8090,6184],[-13,17],[-12,17],[-13,19]],[[8052,6237],[16,16],[-8,15],[-1,3],[0,2],[0,6],[1,3]],[[8055,6135],[-19,8],[-19,8],[-19,6]],[[7998,6157],[1,6],[8,13],[10,16],[10,15],[10,13],[15,17]],[[7998,6157],[-6,2],[-10,3],[-10,5],[-10,5]],[[7969,6192],[16,-8],[4,-1],[2,2],[7,15],[10,13],[15,21],[9,12],[8,8],[12,-17]],[[7969,6192],[22,50],[9,16]],[[8000,6258],[20,36],[1,3]],[[7950,6207],[15,25],[-18,12],[20,38],[17,-13],[16,-11]],[[7514,3024],[-1,0],[-7,-1],[-1,-4],[-7,-10],[3,-5],[1,-4],[-4,-9],[-3,-4],[-14,-14],[-13,-10],[-13,-12],[-26,-22],[-4,-4],[-56,-28],[-21,-16],[-29,-19],[-14,-5],[-14,-6],[-12,-2],[-16,0]],[[7263,2849],[-25,19],[-3,16],[4,12],[12,20],[-30,23],[10,20],[2,5],[-20,16]],[[7213,2980],[8,23],[5,10],[18,-12],[50,-33],[18,39],[14,23],[12,17]],[[7338,3047],[7,-7],[2,-1],[3,-2]],[[7350,3037],[10,-6],[19,23],[1,5],[6,31],[2,3]],[[7388,3093],[4,-2]],[[7392,3091],[5,-2],[6,-1],[15,-1],[2,0],[25,-2],[8,0],[6,0],[5,2]],[[7464,3087],[1,-7],[12,-14],[0,-1],[27,-11],[-3,-13],[7,-12],[6,-5]],[[7513,2895],[-9,5],[-6,-8],[-17,-3],[-20,-1],[-8,-3],[-37,-17],[-30,-15]],[[7386,2853],[-21,-14],[-20,-15],[-14,-8],[-11,-9],[-16,-18]],[[7304,2789],[-15,-15],[-17,-14]],[[7272,2760],[8,27],[4,16],[4,10],[7,11],[-25,21],[-7,4]],[[7514,3024],[9,-6],[10,-7],[20,-13],[2,-2],[24,-17]],[[7579,2979],[-12,-22],[-29,-51],[-4,-4],[-6,-3],[-15,-4]],[[7492,2773],[-5,7],[-5,4],[-5,1],[-5,4],[-4,7],[-8,5],[-4,0],[-7,2],[-8,11]],[[7441,2814],[-55,39]],[[7513,2895],[15,-11],[21,-16]],[[7549,2868],[-20,-37],[-17,-31],[-6,-14],[-14,-13]],[[7373,2736],[-69,53]],[[7441,2814],[-19,-17],[-18,-17],[-18,-24],[-13,-20]],[[7492,2773],[-5,-5],[37,-29]],[[7524,2739],[-28,-13],[-9,-4],[-30,-13]],[[7377,2638],[-41,31]],[[7336,2669],[12,22],[13,23],[12,22]],[[6573,2191],[63,-41],[10,-6]],[[6646,2144],[-11,-25]],[[6573,2191],[11,23]],[[6584,2214],[73,-47]],[[6584,2214],[10,22]],[[6594,2236],[73,-47]],[[6594,2236],[9,19]],[[6584,2214],[-54,34]],[[6530,2248],[3,6],[3,7],[0,1],[2,2],[4,6],[12,17]],[[6524,2222],[3,14]],[[6527,2236],[3,12]],[[6527,2236],[-2,1],[-2,1],[-28,19],[6,14],[-16,11]],[[6485,2282],[14,30],[9,18]],[[6508,2330],[29,-21],[19,-15],[2,-2]],[[6499,2188],[-2,1],[-43,28],[8,17]],[[6462,2234],[9,19],[14,29]],[[6527,2367],[-11,-21],[-2,-3],[-6,-13]],[[6462,2234],[-46,29],[0,24],[0,38],[0,24],[2,0],[1,1],[4,8],[1,2],[13,22],[2,-1],[-2,3],[0,3],[0,2],[1,2],[2,1],[1,1],[1,0],[7,-2],[-4,3],[2,3]],[[6447,2397],[0,2],[3,6],[2,3],[5,9]],[[7999,6097],[-8,-18]],[[7991,6079],[-19,10],[-18,10],[-22,-47],[-3,-11],[-2,-10],[22,2],[29,-2]],[[7978,6031],[-1,-24]],[[7977,6007],[-3,0],[-26,0],[-21,-1],[-15,-3],[-4,-1]],[[7943,6130],[21,-12],[16,-10],[19,-11]],[[7991,6079],[-8,-13]],[[7983,6066],[-4,-11],[-1,-24]],[[8026,6082],[-10,5],[-17,10]],[[8077,6052],[-18,-32],[-23,5],[-20,15],[-33,26]],[[8071,5991],[-14,6],[-9,4],[-9,2],[-14,2],[-45,2],[-3,0]],[[8042,5960],[-2,3],[-2,1],[-3,3],[-10,7],[-7,6],[-19,1],[-39,2]],[[7960,5983],[-17,0],[-13,-2],[-19,-3]],[[7911,5978],[-3,20],[0,4]],[[7987,5874],[-9,6]],[[7978,5880],[-14,13]],[[7964,5893],[13,16],[12,16],[7,8],[4,9],[-40,29],[0,12]],[[5871,2067],[-21,-122],[-1,-3]],[[5849,1942],[-3,-9],[-7,-22],[-8,-23],[-8,-22],[-20,-45],[0,-1],[-3,-8],[-19,-57],[14,-8],[2,-1],[1,0],[13,-6],[30,-14],[26,-12],[3,-2],[6,-2],[4,-2],[2,-1],[81,-39],[60,4]],[[6023,1672],[3,0],[22,0],[2,0],[10,0],[5,0],[8,0],[3,0],[3,0],[5,0],[2,0]],[[6111,1664],[0,-31],[0,-5],[0,-7],[-2,-98],[0,-14],[0,-2],[0,-1]],[[6109,1506],[-121,5],[-1,-8],[0,-4],[-1,-4],[-1,-13],[0,-30]],[[5985,1452],[-24,1]],[[5961,1453],[0,26],[-90,2],[0,-26]],[[5871,1455],[-13,1],[-10,-1],[-11,-1],[-9,4],[-6,6],[-12,-1]],[[5664,1519],[-4,0],[-2,0],[-71,3],[-2,0],[-2,0],[-72,2]],[[5511,1524],[0,2],[0,3],[0,9],[0,3],[-6,11],[-61,-7],[-7,0],[-5,1],[-22,-1],[-14,-2],[-27,-1],[-136,5],[-52,0],[-47,2],[-26,1]],[[5357,2356],[2,-2],[2,-2],[46,-49],[15,-12],[7,-5],[12,-9],[8,-7],[33,-35],[57,-64],[51,-59],[2,-3],[8,-9],[13,-14],[31,-37],[6,-6],[1,3],[2,17],[4,40],[7,50],[1,8],[0,7],[1,8],[6,49],[1,9],[1,7],[1,6],[1,5],[0,7],[1,3],[0,-1],[2,-1],[4,-4],[1,-2],[6,-5],[1,-1],[1,-1],[1,-1],[2,-1],[2,-3],[1,0],[2,-2],[2,-2],[1,-1],[2,-2],[2,-1],[2,-2],[0,-1],[1,-1],[1,0],[1,-2],[1,-1],[1,0],[3,-4],[6,-7],[2,-1],[0,-1],[1,0],[1,-1],[1,-1],[1,-1],[1,-1],[2,-1],[1,-1],[1,-2],[2,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-2],[2,-1],[1,-2],[1,-1],[1,-1],[2,-1],[1,-1],[1,-1],[1,-1],[1,-2],[1,-1],[2,-2],[1,-1],[1,-1],[1,-1],[1,-2],[1,-1],[7,-6],[3,-4],[2,-1],[1,-2],[2,-1],[1,-2],[1,-1],[2,-2],[1,-1],[1,-1],[2,-1],[0,-1],[7,-6],[9,-8],[24,-25],[1,-1],[3,-3],[16,-16],[0,-1],[4,-4],[2,-2],[1,-1],[3,-3],[1,-1],[1,-2],[2,-1],[3,-4],[7,-7],[1,-1]],[[5981,1916],[-16,-34],[-6,-7],[-24,15],[-13,10],[-2,2],[-1,1],[-2,1],[-2,2],[-1,1],[-1,1],[-1,0],[-1,1],[-3,2],[-1,1],[-1,1],[-1,0],[-1,1],[-1,1],[-1,1],[-2,1],[0,1],[-1,1],[-1,1],[-1,1],[-1,0],[-3,2],[-2,1],[-1,1],[-2,2],[-2,0],[-1,1],[-2,1],[0,1],[-2,1],[-1,0],[-1,2],[-1,1],[-2,1],[-1,1],[-1,0],[0,1],[-4,2],[-18,10],[-3,-7]],[[5871,2067],[13,73],[1,23],[2,9],[5,26],[2,9],[0,2],[40,237]],[[5934,2446],[10,-4],[12,-6],[17,-7],[11,-7],[8,-4],[4,-2],[16,-9],[7,-3],[13,-8],[4,-4],[108,-49]],[[6144,2343],[-20,-43],[-18,-36],[-6,-13],[-1,-5],[-5,-34]],[[6094,2212],[-6,-35],[0,-9]],[[6088,2168],[2,-34],[-1,-7],[-2,-4],[-24,-29],[-4,-10]],[[6059,2084],[-8,-18],[-8,-18],[-9,-18],[-8,-18],[-9,-19]],[[6017,1993],[-10,-20],[-9,-21],[-9,-18],[-33,21],[-4,-20],[29,-19]],[[6235,2626],[-9,-16],[-9,-21]],[[6217,2589],[-16,12],[-16,11],[-17,-33]],[[6168,2579],[-16,12],[17,32],[-17,13]],[[6152,2636],[8,17],[1,3],[-1,1],[-35,25],[-16,-21],[-6,-8],[-8,-5],[-6,-6],[-10,-18],[-3,-5],[-1,-8],[-9,-50],[51,-31]],[[6117,2530],[-10,-24]],[[6107,2506],[-4,-10],[-2,-11],[-15,-34],[17,-11],[18,-11],[18,-11],[26,-17]],[[6165,2401],[-4,-18],[-6,-17]],[[6155,2366],[-11,-23]],[[5934,2446],[25,152],[6,37]],[[5965,2635],[5,5],[39,44],[17,-20],[0,-1],[1,-1],[1,-1],[2,-2],[5,-7],[0,-1],[3,1],[21,10],[4,2],[0,1],[1,0],[1,1],[2,0],[0,1],[62,35],[66,-48],[40,-28]],[[6107,2506],[62,-41]],[[6169,2465],[-3,-22],[1,-27],[-2,-15]],[[6192,2521],[-41,29],[-9,7],[-5,4]],[[6137,2561],[-7,10],[-8,9],[30,56]],[[6168,2579],[16,-11],[23,-17],[-15,-30]],[[6137,2561],[-1,-5],[-4,1],[-1,0],[-1,0],[-2,-3],[-2,-4],[-9,-20]],[[6309,2476],[11,22],[-11,8],[-23,16],[-7,5],[-4,4],[2,4],[14,24],[36,-26],[7,-9]],[[6334,2524],[38,-27],[0,-52],[0,-2],[-16,0],[-3,1],[-3,2],[-4,3],[-37,27]],[[7738,7965],[-53,-45]],[[7685,7920],[-13,-12]],[[7672,7908],[-3,4],[-22,35],[-14,-12],[-49,77]],[[7584,8012],[13,13],[12,13],[51,-79],[18,15],[18,16],[17,15]],[[7713,8005],[23,-37],[2,-3]],[[7672,7908],[-15,-12],[-12,-10]],[[7645,7886],[-59,-52]],[[7586,7834],[-2,4],[-15,22]],[[7537,7964],[6,8],[5,5],[5,5],[2,1],[11,9],[3,3],[4,4],[11,13]],[[7640,7788],[-16,-14]],[[7624,7774],[-38,60]],[[7645,7886],[14,-22],[-14,-12],[11,-17]],[[7656,7835],[-30,-26],[14,-21]],[[7733,7779],[-11,-14]],[[7722,7765],[-26,41],[-14,-11],[-26,40]],[[7685,7920],[13,-21],[12,-18],[25,-40]],[[7735,7841],[24,-38]],[[7759,7803],[-13,-11],[-10,-9],[-3,-4]],[[7722,7765],[-4,-6],[-8,-7],[-15,-12],[-15,-14]],[[7680,7726],[-20,32],[12,11],[1,2],[-1,2],[-16,25],[-1,2],[-2,-1],[-13,-11]],[[7680,7726],[-16,-13]],[[7664,7713],[-40,61]],[[7805,7698],[-12,-15],[-10,-14],[-18,-22]],[[7765,7647],[-13,20],[-14,-18],[-4,-1],[-5,1],[-8,13],[-11,17],[-30,47]],[[7733,7779],[4,-7],[6,-11],[-8,-14],[10,-16],[2,-2],[1,-3],[11,-16],[10,9],[1,0],[1,-1],[10,-15],[12,15],[12,-20]],[[7831,7730],[-26,-32]],[[7759,7803],[17,14]],[[7776,7817],[42,-67],[13,-20]],[[7861,7768],[-30,-38]],[[7776,7817],[16,17],[11,11],[6,0],[5,-4],[34,-54]],[[7848,7787],[13,-19]],[[7917,7839],[-56,-71]],[[7848,7787],[20,26],[-29,44],[43,37]],[[7882,7894],[12,-18],[11,-17],[12,-20]],[[7735,7841],[9,9],[7,9],[14,21],[2,1],[15,13]],[[7782,7894],[8,-11],[3,-2],[4,0],[2,1],[11,9],[16,14],[-42,66],[16,14],[16,13]],[[7816,7998],[42,-65],[12,-20]],[[7870,7913],[12,-19]],[[7782,7894],[-30,49],[-14,22]],[[7738,7965],[65,55]],[[7803,8020],[13,-22]],[[6474,1392],[-63,40]],[[6411,1483],[20,-13],[12,-8],[12,-8],[38,-24]],[[6493,1430],[-5,-9]],[[6488,1421],[-4,-8],[-5,-11],[-5,-10]],[[6545,1440],[-10,-22],[-37,24],[-5,-12]],[[6526,1502],[10,-7],[11,-7],[16,-10],[-8,-18],[-10,-20]],[[6591,1409],[-16,-16],[-16,-17]],[[6559,1376],[-16,-16],[-39,26],[9,20],[-25,15]],[[6545,1440],[46,-31]],[[6644,1515],[8,0],[3,0],[4,1]],[[6659,1516],[0,-5],[-1,-11],[0,-8],[-2,-8],[-1,-4],[-3,-8],[-2,-2],[-24,-26],[-4,-3],[-14,-15],[-17,-17]],[[6601,1293],[-5,10],[-12,30],[-3,11],[-1,2],[-2,4],[-1,4],[-3,5],[-1,3],[-6,8],[-5,6],[-1,0],[-2,0]],[[6659,1516],[41,-1],[24,-16],[-1,-8],[2,-1],[1,0],[1,-1],[3,-1],[3,-2],[37,34],[14,13],[3,1],[3,2],[7,5],[1,0],[2,1],[5,2],[1,1],[7,4],[5,2],[4,2],[3,1],[2,2],[1,0],[2,1],[1,0],[4,2],[2,1],[1,1],[2,1],[1,0],[0,1],[2,0],[1,1],[7,5],[7,3],[5,2],[1,0],[1,1],[3,1],[3,2]],[[6871,1578],[2,-1],[7,-5],[20,-14],[35,-24],[3,-2]],[[6938,1532],[-14,-18],[-25,-20],[-27,-24],[-27,-18],[-54,-35],[-75,-47],[-110,-74],[-5,-3]],[[6556,1556],[3,8],[14,31],[9,19],[10,5],[9,6],[14,10],[15,13],[14,13],[2,2],[15,15],[16,14],[5,4],[3,1]],[[6685,1697],[46,-29]],[[6731,1668],[-8,-7],[-17,-14],[-3,-4],[-12,-10],[-27,-80],[-3,-9],[0,-6],[-1,-7],[-1,-9],[0,-6]],[[6731,1668],[85,-55],[1,0],[1,-1],[3,-2]],[[6821,1610],[2,-1],[31,-20],[1,-1],[16,-10]],[[6749,1741],[49,-32],[7,4],[7,3]],[[6812,1716],[35,-22],[11,8],[3,-2],[-31,-70]],[[6830,1630],[-9,-20]],[[6731,1668],[9,9],[9,7],[11,7],[18,8],[-15,10],[-8,5],[-21,14]],[[6734,1728],[8,7],[7,6]],[[6685,1697],[-5,5]],[[6680,1702],[40,35]],[[6720,1737],[5,-3],[4,-3],[5,-3]],[[6680,1702],[-9,4]],[[6671,1706],[6,12],[11,22]],[[6688,1740],[6,13],[2,5],[2,4],[10,21]],[[6708,1783],[11,21]],[[6688,1740],[-73,47],[-32,20],[10,22]],[[6593,1829],[10,21],[10,21]],[[6613,1871],[58,-37],[-10,-21],[36,-23],[11,-7]],[[6656,1963],[58,-38],[3,6]],[[6717,1931],[61,-39]],[[6613,1871],[9,20],[8,17],[9,18],[8,18],[9,19]],[[6593,1829],[-73,47]],[[6520,1876],[7,6],[6,12]],[[6533,1894],[10,22],[9,19],[8,18]],[[6560,1953],[17,36],[9,19]],[[6586,2008],[70,-45]],[[6671,1706],[-178,114]],[[6493,1820],[6,12],[11,23],[10,21]],[[6671,1706],[-5,-8]],[[6666,1698],[-73,47],[-8,-18]],[[6585,1727],[-59,37],[-8,-19],[-9,-19]],[[6509,1726],[-58,37]],[[6451,1763],[10,20],[8,18],[8,18],[13,-7],[3,8]],[[6532,1632],[-22,13],[-25,16],[-6,4],[10,23],[5,9],[4,5],[2,6],[9,18]],[[6585,1727],[-8,-19],[-9,-20],[-9,-18],[-7,5],[-9,-21],[-11,-22]],[[6666,1698],[-16,-14],[-15,-14],[-18,11],[-8,-20],[-1,-3],[-12,-9],[-3,-1],[-3,2],[-4,2],[-8,-16],[-2,-3],[-15,-6],[-17,-3],[-12,8]],[[6451,1763],[-9,-18],[-20,13],[-2,4],[0,21],[0,25],[-3,3]],[[6417,1811],[0,22],[0,24],[0,12]],[[6417,1869],[9,-4],[67,-45]],[[6417,1869],[6,12],[3,-2],[11,22],[10,22]],[[6447,1923],[10,20]],[[6457,1943],[70,-45],[6,-4]],[[6417,1869],[-16,8],[-10,7],[-1,1],[-28,16]],[[6362,1901],[10,5],[3,18],[2,14],[-6,29],[-2,6]],[[6369,1973],[5,6],[11,10],[19,18],[2,3],[1,3]],[[6407,2013],[1,-11],[8,-6],[0,-27],[1,-27],[30,-19]],[[6407,2013],[1,0],[5,12],[8,17]],[[6421,2042],[2,-2],[61,-38]],[[6484,2002],[-8,-18],[-9,-19],[-10,-22]],[[6484,2002],[9,17],[70,-45],[-9,-17],[6,-4]],[[6421,2042],[10,23],[8,13],[3,7],[6,12]],[[6510,2056],[70,-44],[6,-4]],[[6613,2074],[-10,-23],[-7,-14],[-1,-7],[0,-3],[-1,-3],[-8,-16]],[[6407,2013],[0,6],[-2,-6],[-3,-3],[0,-1]],[[6402,2009],[-1,26],[0,240]],[[6401,2275],[0,7]],[[6401,2282],[0,35],[1,44],[0,41],[0,4]],[[6402,2406],[4,0],[5,0],[9,0],[8,-1],[5,-1],[5,-2],[5,-2],[4,-3]],[[6401,2275],[-2,-23],[-2,-25],[-6,-29],[0,-1],[-7,-25],[-17,-42],[-13,-21]],[[6354,2109],[-14,8],[-38,25],[-31,20],[-15,9]],[[6256,2171],[13,60],[1,8],[3,9],[4,9],[4,-3]],[[6281,2254],[15,-9],[2,0],[2,2],[6,14],[17,-11],[-8,-16],[0,-1],[1,-2],[1,-1],[57,-37],[3,0],[1,2],[1,4],[1,12],[-1,8],[0,24],[0,19],[0,22],[0,2],[-2,1],[-29,18],[-17,12],[-3,3]],[[6328,2320],[0,17],[1,8],[4,11],[11,24],[6,13],[2,4],[2,8],[0,3],[-6,5],[-9,6],[2,3]],[[6341,2422],[9,-7],[7,-4],[7,-4],[4,-1],[6,0],[6,0],[7,0],[5,0],[9,0],[1,0]],[[6281,2254],[27,58],[3,7],[7,7],[6,-5],[4,-1]],[[6402,2009],[-3,1],[-19,-17],[-10,7],[-5,3],[12,24],[5,13],[-1,5],[-4,6],[-8,5],[-7,5],[-9,2],[-12,-1],[-6,-8],[-14,-22],[-21,-31]],[[6300,2001],[-15,-23]],[[6285,1978],[-25,-35]],[[6260,1943],[-15,-22]],[[6245,1921],[-11,7],[-4,3]],[[6230,1931],[71,99]],[[6301,2030],[24,35],[29,44]],[[6301,2030],[-12,12],[-57,35],[-17,10]],[[6215,2087],[8,17],[8,16],[6,10],[9,23],[10,18]],[[6230,1931],[-12,8],[10,15],[-57,37]],[[6171,1991],[8,18]],[[6179,2009],[8,18],[8,16],[9,20],[11,24]],[[6369,1973],[-3,2],[-11,7],[-8,5]],[[6347,1987],[-13,8],[-2,1],[-2,1],[-4,-1],[-9,-3],[-3,0],[-3,0],[-2,1],[-9,7]],[[6347,1987],[-31,-30]],[[6316,1957],[-17,12],[-14,9]],[[6316,1957],[-14,-14]],[[6302,1943],[-5,-4],[-3,-2],[-8,-6],[-3,0],[-4,0],[-3,2],[-16,10]],[[6281,1897],[-3,2],[-14,9],[-3,4],[-16,9]],[[6302,1943],[18,-13],[1,-3]],[[6321,1927],[-6,-4],[-18,-14],[-16,-12]],[[6321,1927],[21,-13],[-18,-15],[22,-15]],[[6346,1884],[-3,-4],[-11,-12],[-1,-3]],[[6331,1865],[-50,32]],[[6362,1901],[-5,-5],[-11,-12]],[[6730,2120],[-11,-23]],[[6719,2097],[-11,-24],[-11,-24],[-11,-22]],[[6686,2027],[-73,47]],[[6686,2027],[-11,-24],[-10,-21],[-9,-19]],[[6836,1948],[-12,-11],[-5,-4]],[[6717,1931],[6,14],[10,21],[11,23]],[[6744,1989],[61,-40],[12,24],[27,-18]],[[7964,5893],[-41,31],[-17,13]],[[7906,5937],[4,14],[1,10],[0,17]],[[7891,5897],[6,17],[9,23]],[[7978,5880],[-6,-9],[-14,-25],[-32,24],[-35,27]],[[7987,5874],[-27,-45],[8,-3],[9,-6],[-5,-10],[-5,-10],[-4,-7]],[[7963,5793],[-56,42],[-30,22]],[[7877,5857],[7,19],[7,21]],[[7944,5758],[-60,44],[-10,7],[-11,6]],[[7863,5815],[7,22]],[[7870,5837],[7,20]],[[7963,5793],[-5,-10],[-4,-8],[-7,-12],[-3,-5]],[[7925,5721],[-21,15],[-55,39]],[[7849,5775],[14,40]],[[7944,5758],[-3,-8]],[[7941,5750],[-5,-8],[-1,-3],[-9,-17],[-1,-1]],[[7908,5689],[-11,-22]],[[7897,5667],[-48,36],[-2,1],[-1,0],[-1,0],[-1,-1],[-8,-14],[-15,10]],[[7821,5699],[6,16],[4,12],[2,3],[4,13],[12,32]],[[7925,5721],[-7,-13],[-3,-6],[-7,-13]],[[7897,5667],[-7,-13]],[[7890,5654],[-9,-13],[-10,-5],[-24,-45],[2,-14],[-10,-19]],[[7839,5558],[-13,12],[-16,12],[-34,24]],[[7776,5606],[22,48]],[[7798,5654],[23,45]],[[7982,5606],[-18,9]],[[7964,5615],[-59,30],[-15,9]],[[7908,5689],[16,-8],[7,-3],[70,-36]],[[8001,5642],[-11,-21],[-8,-15]],[[7942,5529],[-10,-18]],[[7932,5511],[-9,4],[-3,2],[-54,27],[-2,1],[-9,5],[-10,-19],[-9,-19]],[[7836,5512],[-8,5],[-3,1],[-6,3]],[[7819,5521],[1,5],[7,15],[7,14],[5,3]],[[7964,5615],[-9,-19],[-9,-18],[-2,-3],[-10,-18],[-9,-18],[5,-3],[12,-7]],[[7922,5492],[-10,-19]],[[7912,5473],[-9,5],[-2,1],[-55,28],[-2,1],[-8,4]],[[7932,5511],[-10,-19]],[[7902,5454],[-9,-18]],[[7893,5436],[-10,5],[-2,1],[-25,13],[-29,15],[-2,1],[-9,5]],[[7816,5476],[10,18],[8,-4],[3,-2],[54,-28],[2,-1],[9,-5]],[[7883,5417],[-10,-19]],[[7873,5398],[-9,5],[-3,1],[-54,28],[-2,1],[-9,4]],[[7796,5437],[10,18],[0,1],[10,20]],[[7893,5436],[-10,-19]],[[7779,5446],[-62,45]],[[7717,5491],[3,6],[16,29],[1,2],[18,38],[10,21],[5,9]],[[7770,5596],[6,10]],[[7819,5521],[-10,-19],[-10,-18],[-10,-19],[-10,-19]],[[7796,5437],[-9,-17],[-11,-20]],[[7776,5400],[-23,11],[-2,1],[-2,2],[-11,7],[-42,31],[-2,-3],[-10,-18],[-9,-17],[-10,-16],[-9,-17]],[[7656,5381],[-49,36]],[[7607,5417],[9,17],[9,17],[2,4],[7,13]],[[7634,5468],[9,18],[2,3],[9,17],[8,15],[4,7]],[[7666,5528],[51,-37]],[[7779,5446],[6,-3],[3,-1],[8,-5]],[[7751,5351],[-13,-25]],[[7738,5326],[-10,5],[-1,1],[-14,8]],[[7713,5340],[-57,41]],[[7776,5400],[-1,-4],[-12,-23]],[[7763,5373],[-12,-22]],[[7685,5288],[-57,42]],[[7628,5330],[10,17],[9,17],[9,17]],[[7713,5340],[-10,-18],[-9,-17],[-5,-9],[-4,-8]],[[7702,5259],[-26,12]],[[7676,5271],[9,17]],[[7738,5326],[-12,-22],[-12,-24],[-12,-21]],[[7656,5236],[-56,41]],[[7600,5277],[9,18],[10,17],[9,18]],[[7676,5271],[-10,-18],[-10,-17]],[[7666,5190],[-8,4],[-4,3],[-14,7]],[[7640,5204],[7,14],[5,9],[4,9]],[[7702,5259],[-12,-23]],[[7690,5236],[-12,-23],[-12,-23]],[[7640,5204],[-2,-3]],[[7638,5201],[-57,42]],[[7581,5243],[9,17],[10,17]],[[7666,5190],[-10,-20],[-13,-22]],[[7643,5148],[-26,13],[-3,2],[-37,19],[-21,14]],[[7556,5196],[7,12],[9,17]],[[7572,5225],[42,-30],[14,-12],[10,18]],[[6885,1991],[-44,28]],[[6841,2019],[11,23],[7,13],[4,8]],[[6744,1989],[11,23],[11,24]],[[6766,2036],[63,-40],[12,23]],[[6766,2036],[11,24]],[[6777,2060],[11,24]],[[6788,2084],[11,20],[10,19],[9,19]],[[6788,2084],[-58,36]],[[6812,1716],[6,4],[10,4],[10,5],[-58,38],[-8,-8],[-7,-5],[-8,-7],[-8,-6]],[[7126,2087],[1,-1],[5,-4],[22,19]],[[7154,2101],[22,-16],[32,-24],[16,16],[7,7],[18,7],[19,5],[18,9],[4,5],[17,15]],[[7307,2125],[17,13],[22,10],[23,11]],[[7369,2159],[17,14],[29,34]],[[7415,2207],[19,13]],[[7434,2220],[5,5],[13,10],[4,5],[3,-3],[2,-1],[6,-7],[5,-6],[1,-1]],[[7473,2222],[-2,-3],[-3,-4],[-24,-26],[-71,-63],[-49,-40],[-52,-38],[-25,-18],[-1,0],[-49,-32],[-50,-31],[-48,-38],[-139,-160],[-7,-11],[-10,-15],[-37,-56],[-8,-10],[-10,-10],[-45,-39],[-4,-1],[-2,0],[-2,1],[-2,0],[-3,2]],[[7404,1647],[-9,-17],[-28,-56],[-10,-21],[-4,-10],[-5,-9],[-10,-13],[-6,-8],[-3,-3],[-8,-10],[-36,-48]],[[7285,1452],[-2,-2],[-39,-51],[-5,-7]],[[7239,1392],[-16,-18],[-38,-37],[-32,-30],[-8,-7]],[[7145,1300],[-24,-23],[-1,0],[-24,-23],[-9,-9],[-8,-9]],[[6829,1427],[24,16],[23,15],[21,17],[19,16],[26,25],[19,27],[16,28],[16,29],[31,37],[3,4],[3,4],[10,11],[25,29],[31,35],[25,20],[37,28],[91,67],[2,1]],[[7251,1836],[1,0],[2,-1],[4,-2],[119,-93],[5,-5],[4,-9],[16,-77],[2,-2]],[[7143,1118],[-18,4],[15,36],[-15,12],[-15,12],[1,3]],[[7145,1300],[10,-7],[49,-35]],[[7204,1258],[-25,-53],[-7,-18],[-7,-16]],[[5655,1209],[-29,15],[-2,21],[-22,-1],[3,-37]],[[5605,1207],[-24,13]],[[5581,1220],[-25,15]],[[5556,1235],[-1,6],[6,1],[11,1],[-6,77]],[[5566,1320],[19,0],[20,0],[4,0],[37,-1],[23,-1],[3,0]],[[5672,1318],[2,-20],[4,-44],[0,-7]],[[5678,1247],[-3,0],[-24,-1],[4,-37]],[[5556,1235],[-5,2],[-2,4],[-26,12]],[[5523,1253],[-1,10],[0,18],[4,19],[1,19]],[[5527,1319],[20,1],[19,0]],[[5487,1147],[-10,125]],[[5477,1272],[24,-9],[22,-10]],[[5556,1235],[1,-15],[4,-35],[-2,-14],[1,-14],[-34,-4]],[[5526,1153],[-14,-2],[-25,-4]],[[5584,1066],[-25,15],[-8,5],[-11,6],[-9,4],[-2,26],[0,6],[-3,25]],[[5581,1220],[5,-60],[5,-58]],[[5591,1102],[1,-16],[-8,-20]],[[5605,1207],[26,-15],[21,-11]],[[5652,1181],[3,-3]],[[5655,1178],[4,-58],[-22,-2],[4,-47],[-26,16],[-24,15]],[[5655,1209],[1,-18],[-4,-10]],[[5685,1161],[-3,1],[-7,3],[-8,6],[-12,7]],[[5678,1247],[2,-28],[4,-46],[1,-12]],[[5699,1041],[-16,3],[-5,-2],[-12,-9],[-7,-3],[-6,0],[-8,1],[-10,5],[-14,7],[-13,8],[-24,15]],[[5685,1161],[48,-25],[20,-8],[25,-8],[15,-3]],[[6161,5074],[-4,2],[-53,24],[-13,-21],[-35,17],[1,-5],[0,-4],[0,-2],[-1,-6],[-2,-9]],[[6054,5070],[-4,-14],[-14,-24]],[[6036,5032],[-25,-47],[-6,0],[-7,-18]],[[5998,4967],[-12,5],[-2,2]],[[5984,4974],[9,16],[8,18],[4,5],[4,4],[8,14],[2,7],[2,1],[7,11],[6,13],[8,16],[2,7],[1,8],[1,9],[0,25],[0,4],[2,16],[13,44],[7,15],[11,19]],[[6079,5226],[4,0],[7,-3],[70,-34]],[[6160,5189],[10,-5],[8,-4],[5,-2]],[[6183,5178],[-3,-5],[0,-3],[-1,-3],[0,-18],[0,-14],[-1,-11],[-2,-5],[-15,-45]],[[6267,4964],[-14,7],[-48,23]],[[6205,4994],[10,26],[4,13],[4,12],[-62,29]],[[6183,5178],[11,-6],[64,-31]],[[6258,5141],[61,-29]],[[6185,4939],[-58,30]],[[6127,4969],[9,30],[8,25]],[[6144,5024],[4,13],[4,13],[5,13],[4,11]],[[6205,4994],[-8,-23],[-2,-4],[-10,-28]],[[6226,4852],[-15,7],[-47,24]],[[6164,4883],[7,17],[4,11],[1,3],[4,12],[5,13]],[[6164,4883],[-14,7]],[[6150,4890],[-43,22]],[[6107,4912],[6,17],[4,11],[1,4],[4,11],[5,14]],[[6150,4890],[-11,-29]],[[6139,4861],[-43,21]],[[6096,4882],[5,14],[6,16]],[[6207,4802],[-61,30]],[[6146,4832],[8,22],[-15,7]],[[6115,4746],[-58,30]],[[6057,4776],[8,21]],[[6065,4797],[8,22],[8,21]],[[6081,4840],[7,21],[8,21]],[[6146,4832],[-8,-21],[-7,-21],[-8,-23],[-8,-21]],[[6175,4715],[-60,31]],[[6154,4658],[-61,31]],[[6093,4689],[7,19],[8,19],[7,19]],[[6132,4601],[-16,8],[-38,20],[-6,3]],[[6072,4632],[7,19]],[[6079,4651],[7,19],[7,19]],[[6120,4569],[-75,21],[17,47],[10,-5]],[[6113,4545],[0,1],[-130,33]],[[5983,4579],[2,5]],[[5985,4584],[11,29],[3,8],[5,16],[16,44]],[[6020,4681],[59,-30]],[[6020,4681],[8,19],[7,19]],[[6035,4719],[8,18],[7,20],[7,19]],[[6004,4476],[-21,10]],[[5983,4486],[-25,13],[-4,3]],[[5954,4502],[27,73],[2,4]],[[5954,4502],[-4,1],[-6,3]],[[5944,4506],[7,17],[-69,35],[-48,25]],[[5834,4583],[5,13],[5,13],[-1,7]],[[5843,4616],[1,0],[31,-8]],[[5875,4608],[104,-27],[2,4],[4,-1]],[[5954,4502],[-21,-54]],[[5933,4448],[-4,2],[-4,4],[-3,2],[-18,10],[0,3],[-16,7],[-15,8],[-15,9],[11,30],[7,18],[68,-35]],[[5933,4448],[-19,-48],[-6,-18]],[[5841,4433],[-3,2],[-64,48],[-26,20]],[[5748,4503],[6,9],[14,36],[7,20],[8,20],[6,18]],[[5789,4606],[45,-23]],[[6029,4373],[-4,-2],[-26,-9],[-9,-2],[-15,-2],[-9,1],[-7,0],[-6,0],[-11,2],[-9,4],[-13,5],[-13,8]],[[5983,4486],[-11,-29],[-11,-24],[19,-12]],[[5710,4453],[35,46],[3,4]],[[7848,608],[-11,0],[-8,4],[-5,6],[-17,28],[-10,13],[-6,19],[-1,22],[5,9],[5,6],[7,5],[10,9],[5,4],[8,7],[13,2],[11,-1],[15,-4],[5,-1],[17,1],[18,2],[20,5],[25,8],[16,7],[7,3],[12,4],[23,13],[11,5],[9,4],[9,3],[18,7],[10,-3],[4,0],[31,-10],[8,-1],[2,-12],[0,-8],[-4,-12],[0,-5],[-4,-17],[-4,-7],[-10,-9],[-10,-10],[-10,-12],[-7,-9],[-8,-11],[-12,-12],[-4,-2],[-9,-2],[-15,-8],[-28,-13],[-23,-3],[-25,-8],[-11,-2],[-14,-1],[-10,-4],[-19,-1],[-10,-1],[-29,-7]],[[7669,768],[-1,7]],[[7668,775],[4,5],[8,6],[3,7],[1,9],[-1,7],[-4,5],[-5,4],[-5,7],[-5,4],[-3,3],[-3,5],[-14,9],[-3,1],[-3,-2],[-1,-4],[-1,-2]],[[7636,839],[-12,10],[-6,1],[-4,1],[-2,1]],[[7612,852],[-65,17]],[[7547,869],[4,22],[4,21]],[[7555,912],[4,22],[4,20],[5,20]],[[7568,974],[65,-17]],[[7633,957],[51,-13]],[[7684,944],[38,12],[15,15]],[[7737,971],[-27,-27],[-9,-8],[-10,-10],[-7,-10],[-2,-7],[-1,-13],[1,-5],[4,-2],[4,0],[13,-4],[10,-6],[4,-6],[6,-13],[3,-3],[5,0],[8,4],[3,5],[11,13],[5,6],[2,0],[-1,-2],[-18,-25],[-10,-14],[0,-11],[-8,-4],[-4,-4],[-13,-20],[-3,-7],[-6,-9],[-6,-2],[-13,-11],[-9,-8]],[[7915,744],[-7,0],[-7,3],[-11,2],[-23,7],[-12,2],[-16,1],[-1,2],[4,3],[8,3],[21,11],[9,8],[32,20],[11,4],[6,2],[42,21],[13,6],[8,1],[12,-1],[18,-3],[27,-9],[13,-3],[27,-14],[6,-5],[0,-3],[-7,0],[-9,2],[-12,1],[-8,0],[-12,-2],[-12,-3],[-11,-5],[-18,-5],[-14,-5],[-13,-3],[-11,-4],[-18,-8],[-21,-6],[-9,-5],[-7,-1],[-2,-2],[2,-2],[5,-2],[2,-5],[-1,-2],[-4,-1]],[[7608,830],[-2,0],[-7,1],[-50,3],[-11,1]],[[7538,835],[4,14],[5,20]],[[7612,852],[-1,-7],[0,-4],[2,2],[-1,-4],[-4,-9]],[[7522,803],[4,8]],[[7526,811],[9,20],[1,2],[2,2]],[[7608,830],[-1,-3],[-9,-24],[-2,-4],[-3,-10],[-4,-11],[-9,-17],[-13,-13],[-14,-11],[-6,-5],[-11,20],[18,15],[11,11],[3,8],[-12,6],[-12,4],[-22,7]],[[7636,839],[-4,-4],[-3,-5],[-13,-27],[-34,-61],[-2,-3],[-7,-9],[-7,-12],[-13,-14],[-25,-35],[-11,-20],[-21,-30],[-15,-22],[-15,-18],[-9,-9],[-13,-11],[-19,-14],[-3,-2],[-14,-6],[-12,-4],[-12,-7],[-3,-2]],[[7381,524],[-1,6]],[[7380,530],[31,10],[49,37],[51,77],[5,9],[-22,13],[-25,15]],[[7469,691],[10,19],[15,32],[10,23]],[[7504,765],[8,17],[10,21]],[[7715,417],[-8,-8],[-9,-8],[-6,-7],[-18,-14],[-10,-4],[-19,1],[-8,2],[-11,10],[-10,12],[-4,9],[8,14],[9,6],[7,3],[3,2],[5,-1],[6,-2],[7,-4],[3,-1],[20,-3],[18,-2],[18,-2],[-1,-3]],[[7669,768],[-5,-5],[-8,-14],[-28,-30],[-11,-14],[-8,-12],[-6,-7],[-1,-1],[-1,0],[0,4],[6,11],[10,14],[22,26],[5,8],[15,15],[6,8],[3,4]],[[7380,530],[-9,14],[-9,19],[-16,35]],[[7346,598],[19,7],[18,8],[5,1],[14,6],[17,9],[2,1],[11,8],[2,2],[9,9],[4,4]],[[7447,653],[7,8],[7,12],[8,18]],[[7346,598],[-10,25]],[[7336,623],[67,28],[11,23]],[[7414,674],[16,-9],[17,-12]],[[7336,623],[-9,20],[-9,21]],[[7318,664],[17,6],[17,8]],[[7352,678],[25,9],[4,9]],[[7381,696],[17,-11],[16,-11]],[[7633,957],[4,21],[5,21]],[[7642,999],[74,-20]],[[7716,979],[-17,-17],[-15,-18]],[[7568,974],[3,22],[4,21]],[[7575,1017],[67,-18]],[[7630,1111],[-4,-21],[32,-7],[-8,-42]],[[7650,1041],[-4,-21],[-4,-21]],[[7575,1017],[5,21]],[[7580,1038],[3,20],[0,9],[-5,15],[-12,24],[-7,15],[0,9]],[[7559,1130],[71,-19]],[[7451,1007],[-13,5]],[[7438,1012],[39,41],[24,26],[10,12],[14,22],[28,52],[1,1]],[[7554,1166],[12,-2]],[[7566,1164],[-6,-11],[-3,-8],[2,-15]],[[7580,1038],[-66,18],[-5,-21],[-25,7],[-17,-18],[-16,-17]],[[7501,993],[-50,14]],[[7568,974],[-67,19]],[[6314,834],[-39,-1],[-2,-11],[-18,7],[-10,7],[-22,32],[-9,9]],[[6214,877],[0,47],[0,4],[17,0],[0,-34],[8,-8],[10,-13],[-1,55],[18,1],[0,9]],[[6266,938],[46,1]],[[6312,939],[1,-27],[1,-78]],[[6375,732],[-5,-17]],[[6370,715],[-11,11],[-5,9],[-14,17],[-2,4],[-17,17],[-3,3],[-35,24],[-8,11],[-1,1],[-10,4],[-5,0],[-8,5],[-3,4],[-11,14],[-2,3],[-7,7],[-17,18]],[[6211,867],[0,12]],[[6211,879],[3,-2]],[[6314,834],[20,0],[19,1]],[[6353,835],[20,0],[1,-80],[-5,-16],[3,-4],[3,-3]],[[6533,876],[-2,-8],[24,-6]],[[6555,862],[-22,-78],[-1,-6],[-4,-13]],[[6528,765],[-9,2],[-4,1],[-9,3],[-2,0],[-6,2],[-21,6]],[[6477,779],[-22,8],[-10,6],[-18,7],[-14,-46],[-14,-47],[-10,12],[-3,4],[-3,3],[-8,6]],[[6375,732],[1,6],[13,54],[1,3],[6,24],[3,17],[3,23],[1,5]],[[6403,864],[2,3],[1,2],[2,2],[2,4],[2,3],[1,2],[7,6],[12,5],[11,0],[17,-5],[5,-1],[19,-6],[45,-11],[2,8]],[[6531,876],[2,0]],[[6488,656],[-1,-2],[0,-4],[-1,-3],[-2,-6],[-2,-7],[-2,-5]],[[6480,629],[-3,-9]],[[6477,620],[-7,4],[-7,6],[-3,2],[-13,11],[-21,20],[-5,6],[-4,5],[-11,12],[-18,15],[-8,4],[-10,10]],[[6477,779],[-16,-53],[-5,-19],[-1,-7],[-5,-20],[17,-10],[7,-5],[1,-1],[13,-8]],[[6606,724],[-21,8],[-20,-74]],[[6565,658],[-51,33],[-6,4],[-1,-7],[-5,-16],[-6,-22],[-8,6]],[[6528,765],[6,-2],[11,-6],[13,-7],[32,-16],[3,-1],[14,-5],[-1,-4]],[[6565,658],[-7,-22],[-6,-22],[-7,-24],[-19,14],[-16,9],[-21,12],[-9,4]],[[6903,754],[18,-4],[17,-5],[19,-3]],[[6957,742],[-18,-64]],[[6939,678],[-9,-4],[-11,3],[-16,7],[-18,7],[18,63]],[[6940,607],[-2,4],[-2,-2],[-1,-1],[-3,-2],[-3,-1],[-4,0],[-3,1],[-4,1]],[[6918,607],[1,3],[6,21],[6,20]],[[6931,651],[6,20],[2,7]],[[6957,742],[18,-5],[20,-4],[20,1],[15,6],[7,4],[7,7],[7,11],[2,2]],[[7053,764],[4,-5],[4,-5],[3,-5],[14,-38],[1,-7],[1,-4],[3,-7]],[[7083,693],[-15,-8],[-37,-15],[-33,-16],[-18,-13],[-24,-20],[-16,-14]],[[7098,603],[-7,-20],[-14,-7],[-13,-4],[-7,-4]],[[7057,568],[-7,-2]],[[7050,566],[-16,44],[-8,19],[-30,-15],[-6,-3],[-15,-17],[1,-48]],[[6976,546],[-1,-59],[-1,-44],[-15,5],[-12,3],[-3,1],[-2,0],[-22,2],[-13,-2],[-5,0]],[[6902,452],[11,50],[12,46],[15,34],[18,25],[25,20],[29,21],[38,15],[33,14],[5,2]],[[7088,679],[3,-6],[2,-7],[2,-4],[2,-3],[3,-3],[2,-2],[14,-11],[-7,-13],[-7,-16],[-4,-11]],[[6993,546],[-17,0]],[[7050,566],[-20,-7],[-18,-7],[-19,-6]],[[7057,568],[-4,-31],[-1,-22],[-1,-4],[0,-23]],[[7051,488],[-22,0],[-21,0],[-15,58]],[[7098,603],[18,-8],[6,-14],[17,-45],[9,-20]],[[7148,516],[-15,-7],[-33,-13],[-9,-4]],[[7091,492],[-14,-3],[-26,-1]],[[7148,516],[15,-35],[8,-23]],[[7171,458],[-20,-8],[-37,-11],[-13,-3],[-8,22],[-2,34]],[[7194,535],[18,-43],[18,2]],[[7230,494],[19,1],[20,-1]],[[7269,494],[-4,-23],[-19,1],[-24,-4],[-29,-2],[-22,-8]],[[7148,516],[19,8],[9,4]],[[7176,528],[18,7]],[[7194,535],[17,8],[-19,44],[0,7],[2,8],[17,19],[13,10],[12,-14],[8,-15],[9,-20],[7,-19]],[[7260,563],[-16,-7],[8,-18]],[[7252,538],[-17,-7],[-17,-7],[12,-30]],[[7252,538],[16,6],[16,7],[21,-49]],[[7305,502],[-7,-7],[-9,-3],[-8,-1],[-12,3]],[[7260,563],[33,13]],[[7293,576],[26,-62],[-14,-12]],[[7175,450],[-4,8]],[[7293,576],[53,22]],[[7381,524],[-20,-14],[-8,-7],[-12,-8],[-18,-15],[-10,-6],[-12,-11],[-6,-4],[-4,-1],[-3,0],[-3,2],[-12,0],[-26,-4],[-16,-4],[-18,0],[-22,1],[-3,0],[-13,-3]],[[7175,450],[-16,-4],[-18,-6],[-10,-4],[-10,-7],[-8,-5],[-22,-3],[-11,1],[-5,3],[-8,3],[-21,2],[-35,0],[-26,-1],[-26,0],[-13,-2],[-8,1],[-1,-5],[-2,-2],[-7,-6],[-3,0],[-16,4],[-11,-2],[-4,1],[8,34]],[[6886,453],[-7,-32],[-23,4]],[[6856,425],[16,35]],[[6872,460],[3,-4],[4,-2],[3,-1],[4,0]],[[7464,1065],[-2,2],[-3,4],[-2,4],[-3,2],[-5,5],[-4,2],[-9,5]],[[7436,1089],[-9,3],[-16,5],[-78,21]],[[7333,1118],[-56,17]],[[7277,1135],[13,65]],[[7290,1200],[56,-15],[4,22]],[[7350,1207],[2,-1],[2,-1],[70,-17],[2,-2],[-1,-3],[-3,-17],[10,-3],[7,-3],[5,-2],[9,-4],[37,-9],[11,21],[2,3]],[[7503,1169],[17,1],[11,4],[4,-1]],[[7535,1173],[2,-1]],[[7537,1172],[-2,-3],[-24,-46],[-16,-23],[-10,-11],[-20,-24],[-1,0]],[[7350,1207],[4,12]],[[7354,1219],[95,-32],[54,-18]],[[7290,1200],[5,22],[2,12]],[[7297,1234],[57,-15]],[[7399,1492],[20,35],[6,30]],[[7481,1573],[2,-10],[7,-32],[0,-2],[8,-40],[-2,-11]],[[7496,1478],[-21,5],[-21,6],[-21,5],[-10,0],[-6,0],[-8,-1],[-10,-1]],[[7518,1584],[3,-10],[0,-2],[7,-35],[8,-37],[3,-11]],[[7539,1489],[2,-10],[-2,-12]],[[7539,1467],[-21,5],[-22,6]],[[7554,1595],[3,-12],[15,-72],[3,-12]],[[7575,1499],[-18,-5],[-18,-5]],[[7637,1518],[-27,-8]],[[7610,1510],[-19,-6],[-16,-5]],[[7610,1510],[3,-12],[9,-41],[-2,-11]],[[7620,1446],[-21,6],[-19,5],[-20,5],[-21,5]],[[7679,1530],[2,-10],[11,-48],[2,-2]],[[7694,1470],[-9,-16],[-5,-9]],[[7680,1445],[-2,-3],[-5,-9]],[[7673,1433],[-3,1],[-20,4],[-30,8]],[[7740,1546],[-18,-29],[-18,-30],[-10,-17]],[[7675,1631],[3,-10],[17,-75],[2,-10],[9,3],[9,3],[23,6],[2,-2]],[[7983,2761],[-12,16],[-9,10],[-7,7]],[[7955,2794],[26,32],[-7,8],[25,25]],[[7999,2859],[7,-8],[5,-5],[3,-3],[10,-12],[13,-17]],[[8037,2814],[-28,-27],[0,-1],[-26,-25]],[[7932,2709],[-8,21],[-4,11]],[[7920,2741],[8,11],[3,6],[24,36]],[[7983,2761],[-26,-27],[-10,-10],[-15,-15]],[[7949,2664],[-8,20],[-9,25]],[[7983,2761],[15,-20],[12,-15]],[[8010,2726],[-28,-29],[-33,-33]],[[8041,2683],[-25,-24]],[[8016,2659],[-7,10],[-23,-23],[-22,-22]],[[7964,2624],[-8,21]],[[7956,2645],[-7,19]],[[8010,2726],[10,-15],[2,-1],[11,-16],[8,-11]],[[8022,2541],[-5,7],[-6,8]],[[8011,2556],[-8,11],[-19,25],[-5,6],[-3,4],[0,4],[-12,18]],[[8016,2659],[7,-9],[11,-14],[4,-5],[12,-16],[12,-16],[1,-1]],[[8063,2598],[-13,-17],[-27,-38],[-1,-2]],[[8041,2683],[6,-9],[26,26],[13,11],[16,16]],[[8102,2727],[11,-16],[1,-3],[19,-15]],[[8133,2693],[-5,-7],[-19,-25],[-14,-20],[-7,-8],[-22,-32],[-3,-3]],[[8010,2726],[26,25],[27,28]],[[8063,2779],[11,-15],[12,-16]],[[8086,2748],[16,-21]],[[8037,2814],[9,-11],[6,-9]],[[8052,2794],[11,-15]],[[8052,2794],[17,18],[7,11]],[[8076,2823],[14,-12],[15,-12],[16,-12],[-8,-12],[-27,-27]],[[8285,2852],[-5,-5],[-3,5],[-10,-4],[6,-8],[-17,-17],[-6,9],[-7,-8],[3,-5],[-11,-6],[-9,-3],[-14,-3],[-11,-3],[-6,0],[-1,-3],[27,6],[6,0],[17,4],[-1,-3],[-10,-10],[-37,-37],[-2,-2],[-7,-3],[-9,-8],[-19,-22],[-6,-8],[-7,-9],[-5,-4],[0,-3],[-8,-9]],[[8076,2823],[13,22],[13,23],[27,48]],[[8129,2916],[23,-18],[12,-11],[14,29]],[[8178,2916],[16,-12],[24,-20],[36,-17],[31,-15]],[[8179,2575],[-13,18],[-1,1],[-14,19],[-50,-51]],[[8101,2562],[-13,12],[-8,7],[-12,12]],[[8068,2593],[5,7],[6,6],[6,7],[16,17],[5,2],[6,8],[15,20],[3,6],[5,4],[8,10],[9,11],[15,19],[33,35],[1,5],[2,2]],[[8223,2723],[-35,-36],[16,-20],[14,-19],[14,-19]],[[8232,2629],[-27,-27],[-26,-27]],[[8280,2678],[-18,-18],[-14,-14],[-16,-17]],[[8260,2542],[-5,11],[-10,19]],[[8245,2572],[14,21],[-12,16],[-15,20]],[[8245,2572],[-9,-11],[-27,-26],[-15,20],[-15,20]],[[8260,2542],[-31,-36],[-19,-19],[-13,-13]],[[8197,2474],[-3,3],[-3,1],[-10,10],[-15,14],[-13,12],[-19,17]],[[8134,2531],[45,44]],[[8272,2517],[-41,-74]],[[8231,2443],[-13,12],[-16,14],[-1,2],[-4,3]],[[8290,2482],[-33,-64]],[[8257,2418],[-14,13]],[[8243,2431],[-12,12]],[[8280,2365],[-21,12],[8,17],[5,11],[-15,13]],[[8271,2345],[-20,14],[-18,12],[-9,5],[-8,6],[6,11],[3,6],[13,22],[5,10]],[[8262,2326],[-20,13]],[[8242,2339],[-17,10],[-20,11],[-15,9],[-15,8],[-33,19],[-1,0],[-9,1],[-12,3]],[[8120,2400],[1,10],[0,4],[0,2],[0,5],[0,10],[0,6]],[[8121,2437],[22,6],[16,8],[16,9],[14,8],[7,5],[1,1]],[[6637,501],[-2,-12]],[[6635,489],[-23,26],[-11,12],[-16,12],[-16,19],[-5,7],[-31,25],[-18,9],[-10,3],[-15,10],[-13,8]],[[6565,658],[3,-67],[44,-43],[2,-22],[23,-25]],[[6565,658],[17,-7],[-6,-21]],[[6576,630],[-3,-14],[1,-7],[34,-36],[4,-5],[6,-4],[6,-3],[27,-10]],[[6651,551],[-8,-28]],[[6643,523],[-6,-22]],[[6576,630],[10,-6],[30,-30]],[[6616,594],[10,-11],[12,-5],[10,37]],[[6648,615],[19,-7]],[[6667,608],[-9,-31],[-7,-26]],[[6616,594],[10,13],[1,5],[-17,16],[-2,4],[0,3],[3,14],[5,21],[-16,7],[5,20]],[[6605,697],[60,-22],[-6,-20],[-11,-40]],[[6606,724],[5,-2],[-6,-25]],[[6691,692],[-9,-33]],[[6682,659],[-15,-51]],[[6555,862],[95,-24]],[[6650,838],[78,-17]],[[6728,821],[-27,-94],[-9,-31],[-1,-4]],[[6682,659],[18,-8],[17,-6]],[[6717,645],[-13,-48],[-3,-2],[-16,5],[-18,8]],[[6822,642],[-10,-33]],[[6812,609],[-42,16]],[[6770,625],[-17,6],[-17,7]],[[6736,638],[-16,6],[-3,1]],[[6691,692],[23,-9],[27,-10],[33,-13],[48,-18]],[[6770,625],[-13,-47],[-2,-3],[-4,0],[-13,5],[-16,6],[0,6],[14,46]],[[6812,609],[-15,-52]],[[6797,557],[-10,-33],[-11,-37]],[[6776,487],[-20,2],[-5,1],[-20,3],[-18,4],[-16,5],[-36,14],[-18,7]],[[6834,517],[2,-23],[-18,-3],[4,-33]],[[6822,458],[-26,-6],[-8,0],[-9,-1],[-13,2],[10,34]],[[6797,557],[20,-8],[9,-3],[4,0],[4,-29]],[[6856,425],[-81,14],[-9,-1],[-14,1],[-15,4],[-11,2],[-13,2],[-3,2],[-16,5],[-16,7],[-9,2],[-21,12],[-6,6],[-7,8]],[[6822,458],[31,5],[10,0],[5,-2],[4,-1]],[[6834,517],[11,2],[5,4],[2,4],[6,21]],[[6858,548],[19,-7],[-13,-45],[5,-1],[4,-1],[5,-1],[4,-2],[-10,-31]],[[6822,642],[52,-19]],[[6874,623],[-6,-24],[-2,-24],[-8,-27]],[[6874,623],[29,-11],[15,-5]],[[6940,607],[-4,-4],[-11,-19],[-17,-46],[-12,-43],[-10,-42]],[[6822,642],[1,4],[9,31],[28,-10],[3,11]],[[6863,678],[9,-4],[8,-3],[51,-20]],[[6863,678],[22,80],[18,-4]],[[7573,1803],[-22,96]],[[7592,1912],[3,-11],[4,-18],[1,-5]],[[7600,1878],[2,-11],[9,-40],[3,-11]],[[7668,1904],[-1,-20]],[[7667,1884],[-1,-21]],[[7666,1863],[-9,1],[-13,1],[-12,1],[-3,-1],[-6,-1],[-3,10],[-2,9],[-18,-5]],[[7666,1863],[-1,-20],[-1,-10],[0,-10]],[[7664,1823],[-22,1],[-10,-2],[-18,-6]],[[7664,1823],[17,-1],[29,-2],[-1,-20],[10,0],[23,-2],[10,0]],[[7714,1880],[-1,-21],[8,0],[25,-2],[9,-1]],[[7667,1884],[9,-1],[29,-2],[9,-1]],[[7714,1880],[1,21],[1,20],[1,21]],[[7530,1791],[-3,12],[-15,72],[-3,11]],[[7509,1886],[19,6],[23,7]],[[7497,1781],[-3,12],[-13,61],[-1,7],[0,2],[1,2]],[[7481,1865],[1,2],[1,11],[9,3],[17,5]],[[7457,1770],[-5,24],[-5,24],[-7,35],[11,3],[10,3],[20,6]],[[7251,1836],[25,14],[30,16],[35,19],[72,37],[123,85],[22,18],[3,3],[3,2],[1,1]],[[7176,528],[-9,21],[-1,5],[-8,17],[-1,5],[-8,18],[-3,8],[2,5],[15,17],[12,15],[17,17],[12,9],[15,9],[16,9],[-16,43],[14,16],[15,14]],[[7248,756],[34,-22],[5,-6],[7,-11],[24,-53]],[[7088,679],[20,8],[29,17],[38,29],[1,0],[47,51],[2,2]],[[7225,786],[0,-1],[5,-7],[5,-5],[13,-17]],[[7083,693],[36,18],[24,16]],[[7143,727],[-15,-12],[-45,-22]],[[7225,786],[37,40]],[[7262,826],[1,-1],[12,-9],[8,-6],[7,-4],[65,-42]],[[7355,764],[-6,-10],[-5,-8],[-2,-1],[-6,-6],[-8,-4],[12,-27],[12,-30]],[[7355,764],[33,-21],[11,-7]],[[7399,736],[-9,-20],[-9,-20]],[[7445,731],[-9,-19]],[[7436,712],[-37,24]],[[7355,764],[9,19],[17,-11],[15,-10],[10,19]],[[7406,781],[48,-30],[-9,-20]],[[7436,712],[13,-7],[20,-14]],[[7445,731],[18,-11],[25,55]],[[7488,775],[16,-10]],[[7406,781],[7,18]],[[7413,799],[49,-30],[9,17],[17,-11]],[[7413,799],[10,20]],[[7423,819],[23,-4],[36,-3],[23,-1],[-17,-36]],[[7423,819],[-17,9],[-17,11],[4,8],[5,9]],[[7398,856],[8,-4],[11,-6],[19,-7],[16,-4],[41,-2],[25,-1],[5,-2],[3,-3],[1,-2],[0,-2],[1,-2],[0,-3],[-1,-2],[-1,-5]],[[7398,856],[0,2],[1,1],[5,11],[7,16],[4,18]],[[7415,904],[66,-17]],[[7481,887],[66,-18]],[[7415,904],[4,21],[4,22],[5,21],[66,-18]],[[7494,950],[-4,-20]],[[7490,930],[-5,-22],[-4,-21]],[[7501,993],[-4,-21],[-3,-22]],[[7415,904],[-48,12],[-12,6],[-2,1]],[[7353,923],[14,13],[71,76]],[[7684,2843],[-14,-11],[-9,-7]],[[7661,2825],[-6,-2],[-11,-6],[-11,-9]],[[7633,2808],[-29,21],[-31,22],[-11,7],[-9,8]],[[7553,2866],[12,18],[19,-12],[4,-3],[21,3],[3,2],[2,4],[2,4],[4,5],[6,-1],[8,-6]],[[7634,2880],[50,-37]],[[7727,2937],[-5,-7],[-8,5],[-9,-1],[-11,-6],[-7,-9],[-6,-12],[-13,9],[-11,7],[-11,-22],[-12,-21]],[[7553,2866],[-4,2]],[[7579,2979],[13,-8],[9,14],[8,14]],[[7609,2999],[15,-8],[16,-8],[14,-7],[18,-10],[25,-13],[30,-16]],[[7745,2927],[-15,-22],[-16,-23],[-14,-20],[-16,-19]],[[7727,2937],[18,-10]],[[7866,3000],[-19,18]],[[7847,3018],[15,20],[8,11]],[[7870,3049],[12,-12],[3,-3],[3,-2]],[[7888,3032],[-8,-11],[-3,-5],[-4,-6],[-7,-10]],[[7891,2976],[-7,6],[-2,3],[-7,7],[-2,1],[-7,7]],[[7888,3032],[8,-9],[8,-7],[9,-10]],[[7913,3006],[-11,-15],[-11,-15]],[[7911,2957],[-20,19]],[[7913,3006],[10,-9],[2,-1],[7,-7]],[[7932,2989],[-1,-2],[-6,-10],[-8,-10],[-1,-1],[-4,-6],[-1,-3]],[[7952,2919],[-3,3],[-6,7],[-9,9],[-8,6],[-3,1],[-12,12]],[[7932,2989],[0,3],[7,8],[9,13],[6,10],[14,-14]],[[7968,3009],[-5,-7],[-2,-2],[-9,-13],[-6,-8],[-2,0],[-2,0],[4,-2],[24,-24],[1,-1],[1,-2]],[[7972,2950],[-1,-2],[-9,-15],[-10,-14]],[[7968,3009],[12,-11],[8,-7],[2,-2],[1,-1],[1,-2]],[[7992,2986],[-8,-16],[-12,-20]],[[8023,3038],[-16,-27],[-15,-25]],[[7913,3006],[24,34],[14,20],[14,20]],[[7965,3080],[11,-8],[5,-3],[23,-17],[4,-5],[7,-5],[5,-1],[3,-3]],[[7888,3032],[5,7],[10,13],[2,3],[0,1],[6,8]],[[7937,3101],[18,-14],[10,-7]],[[7847,3018],[-13,13]],[[7834,3031],[18,35],[20,37]],[[7894,3081],[-7,-9],[-17,-23]],[[7830,3205],[-10,-19],[-5,-11],[-4,-6],[-22,-45]],[[7789,3124],[-7,3],[-4,0],[-7,-2],[-5,-2],[-8,-6],[7,10],[4,6],[2,5],[33,70]],[[7804,3208],[3,-2],[6,11],[17,-12]],[[7804,3208],[4,17],[5,24],[2,7]],[[7815,3256],[32,71],[9,19],[12,23],[15,26]],[[7883,3395],[49,-39],[-2,-4],[-18,-22]],[[7912,3330],[-13,-21]],[[7899,3309],[-17,-24]],[[7882,3285],[-19,-27]],[[7863,3258],[-17,-27],[-16,-26]],[[7900,3152],[-29,22],[-6,5]],[[7865,3179],[-35,26]],[[7863,3258],[39,-30],[8,-7],[21,-16]],[[7931,3205],[-9,-16],[-8,-12],[-7,-12],[-7,-13]],[[7887,3131],[-25,-3],[-12,-2],[-13,-1]],[[7837,3125],[18,41],[2,0],[8,13]],[[7900,3152],[-13,-21]],[[8242,2339],[-19,-40]],[[8223,2299],[-17,10],[-11,7],[-36,24],[-2,0],[-4,-2],[-4,-1],[-7,-3],[-9,-5],[-2,-1]],[[8131,2328],[-10,27],[-3,8],[-1,3],[0,4],[2,21],[1,9]],[[8223,2299],[-11,-29]],[[8212,2270],[-4,1],[-31,2],[-9,-5],[-10,-4],[0,-2]],[[8158,2262],[-6,13],[0,1],[-14,34],[-4,10],[-2,5],[-1,3]],[[8203,2195],[-14,8],[-10,4]],[[8179,2207],[3,1],[17,29],[13,33]],[[8149,2209],[2,53],[7,0]],[[8179,2207],[-9,0],[-21,2]],[[8124,2160],[3,51]],[[8127,2211],[22,-2]],[[8191,2174],[-1,-4],[-1,-6],[0,-9]],[[8127,2211],[3,52],[-21,2]],[[8109,2265],[2,60],[0,2],[10,-1],[6,0],[2,1],[2,1]],[[8084,2214],[3,53]],[[8087,2267],[22,-2]],[[8127,2211],[-22,1],[-21,2]],[[8087,2267],[3,57],[0,5],[-7,9],[1,2],[-6,13],[-4,18],[-1,5],[-4,14],[3,3],[9,5],[9,0],[9,1],[21,1]],[[8103,2161],[-22,2]],[[8081,2163],[3,51]],[[6842,3392],[17,-12],[-33,-63],[-1,-4]],[[6825,3313],[-17,13]],[[6808,3326],[34,66]],[[6766,3248],[42,78]],[[6825,3313],[0,-4],[-41,-75]],[[6784,3234],[-18,14]],[[6752,3369],[17,-12]],[[6769,3357],[3,-3],[1,-2],[13,-10]],[[6786,3342],[2,-2],[2,-2],[1,0],[11,-8],[2,-2],[2,-2],[2,0]],[[6766,3248],[-19,13]],[[6747,3261],[-38,29],[-15,11]],[[6694,3301],[39,74],[16,-11],[2,3],[1,2]],[[6769,3357],[15,8],[39,73],[15,2]],[[6838,3440],[-52,-98]],[[6957,3427],[-9,-23],[-34,-65]],[[6914,3339],[-10,6],[-9,7]],[[6895,3352],[38,72],[6,16]],[[6957,3427],[21,-15],[4,0]],[[6982,3412],[-12,-22],[-12,-22],[-12,-22]],[[6946,3346],[-12,-23]],[[6934,3323],[-2,2],[-18,14]],[[6984,3317],[-38,29]],[[6982,3412],[21,1]],[[7003,3413],[-5,-16],[-11,-20],[21,-16],[-12,-22],[-12,-22]],[[6984,3317],[-11,-21]],[[6973,3296],[-17,13]],[[6956,3309],[-18,13],[-4,1]],[[6950,3253],[-15,11],[0,5],[19,37],[2,3]],[[6973,3296],[-1,-3],[-22,-40]],[[6973,3296],[21,-16]],[[6994,3280],[-1,-3],[-22,-40],[-21,16]],[[7010,3266],[-23,-42]],[[6987,3224],[-14,-24]],[[6973,3200],[-35,30]],[[6938,3230],[12,23]],[[6994,3280],[13,-9],[3,-5]],[[6938,3230],[-16,11]],[[6922,3241],[-18,13]],[[6904,3254],[5,13],[13,34],[12,22]],[[6904,3254],[-2,2],[-8,6],[-15,11]],[[6879,3273],[6,11],[29,55]],[[6861,3286],[1,3],[33,63]],[[6879,3273],[-15,11]],[[6864,3284],[-3,2]],[[6904,3254],[-41,-78]],[[6863,3176],[-3,2],[-8,6],[-10,7]],[[6842,3191],[-20,15]],[[6822,3206],[42,78]],[[6880,3163],[-17,13]],[[6922,3241],[-42,-78]],[[6973,3200],[-41,-76]],[[6932,3124],[-33,26]],[[6899,3150],[-19,13]],[[7003,3413],[17,1]],[[7020,3414],[20,-15],[4,-3],[26,-19]],[[7070,3377],[-25,-45],[-35,-66]],[[7145,3353],[-36,-67],[-37,-66]],[[7072,3220],[-13,10],[-49,36]],[[7070,3377],[14,24]],[[7125,3172],[-5,4],[-12,12],[-3,2]],[[7105,3190],[-15,15]],[[7090,3205],[38,68],[32,59]],[[7020,3414],[14,24],[16,30]],[[6939,3671],[-44,-81]],[[6895,3590],[-11,8],[-8,6],[-17,13],[-9,7],[-3,3]],[[6847,3627],[9,17],[21,39],[5,13],[2,2]],[[6884,3698],[2,-2],[9,-7],[2,-1],[2,-2],[6,-6],[11,-2],[23,-7]],[[6939,3671],[25,-7]],[[6964,3664],[-18,-6],[-9,-15],[-29,-51],[-13,-2]],[[6964,3664],[-7,-12],[-20,-37],[-24,-44]],[[6913,3571],[-7,11],[-11,8]],[[6964,3664],[10,-4],[12,-9]],[[6986,3651],[-7,-12],[-49,-92]],[[6964,3664],[9,17],[19,27],[15,27]],[[7007,3735],[12,21],[11,-7]],[[7030,3749],[6,-6],[-34,-64]],[[6939,3671],[17,30],[9,15],[10,13],[6,6],[4,5],[3,3],[4,1],[3,-1],[4,-2],[8,-6]],[[7035,3759],[-5,-10]],[[6884,3698],[19,32]],[[6903,3730],[13,-6],[20,-9],[7,-4],[14,24],[7,17],[19,31],[5,10]],[[6988,3793],[2,-2],[38,-26],[3,-2],[4,-4]],[[7070,3733],[-6,-11],[-2,2],[-5,-1],[-4,-3],[-4,-2],[-3,-4],[-3,-5],[-5,-9],[-3,-5],[-5,-8],[-3,-8],[0,-4]],[[7035,3759],[35,-26]],[[8081,2163],[-2,-35]],[[8079,2128],[-22,0],[-21,1],[-22,2],[3,44],[-41,3],[-4,-4],[-6,-7],[-20,2],[-4,-35],[-15,1]],[[7927,2135],[44,128],[29,53],[24,40],[-5,4],[-25,-41],[-28,-53],[-47,-130]],[[7919,2136],[-2,0],[0,-1],[-10,-38],[0,-1],[0,-2],[-1,-2],[0,-2],[0,-17],[0,-3],[0,-2],[-1,-3],[0,-4],[-1,-8],[-2,-19],[0,-2]],[[7902,2032],[-2,0],[-2,0],[-2,0],[-4,0],[-3,0],[-28,2],[-31,2]],[[7607,2083],[3,3],[4,3],[2,1],[2,2],[2,1],[4,3],[21,15],[20,14],[52,18],[5,1],[5,2],[44,32],[2,2],[2,0],[3,1],[4,3],[7,1],[7,3],[4,3],[5,4],[5,4],[9,7],[8,7],[6,6],[1,3],[-1,2],[1,3],[0,3],[5,4],[1,4],[3,2],[3,3],[2,3],[2,2],[13,18],[11,13],[2,3],[1,3],[2,1],[2,-2],[-1,-3],[2,-1],[2,1],[2,0],[16,25],[2,11],[5,10],[54,97],[5,8],[3,5],[0,3],[1,5],[3,5],[2,4],[2,3],[2,3],[1,2],[3,3],[3,1],[2,3],[19,27],[2,2],[20,28]],[[8031,2526],[7,-14],[3,-12],[9,-41],[6,-8]],[[8056,2451],[1,-11],[0,-2],[3,-13],[31,5],[30,7]],[[7613,2099],[-2,1],[-3,4]],[[7608,2104],[1,2],[27,24],[3,4],[1,2],[1,1],[1,5],[3,16],[2,10],[1,14],[1,4],[2,17],[2,10],[3,15]],[[7656,2228],[27,17],[15,10],[2,3],[6,10]],[[7706,2268],[17,-13]],[[7723,2255],[6,-5],[10,-8]],[[7739,2242],[11,-6],[1,-1],[1,-1],[1,-3],[13,-23],[6,-13]],[[7772,2195],[-3,-1],[-49,-33],[-3,-3],[-5,-4],[-27,-11],[-7,0],[-9,-3],[-18,-10],[-18,-12],[-17,-16],[-3,-3]],[[7790,2307],[-13,-23],[-8,7],[-23,-39],[-3,-6],[-3,-3],[-1,-1]],[[7723,2255],[6,10],[17,31],[18,31]],[[7764,2327],[9,-6],[9,-7],[8,-7]],[[7706,2268],[-4,2],[-6,5],[-2,2],[-6,5],[-9,7],[-9,6]],[[7670,2295],[24,41],[18,32],[17,-13],[9,-7],[9,-7]],[[7747,2341],[9,-7],[8,-7]],[[7794,2428],[-10,-18],[-5,-9],[-1,-1],[-4,-9]],[[7774,2391],[-10,-18],[-1,-3],[-4,-6],[-4,-8],[-8,-15]],[[7670,2295],[-7,4],[-5,3],[-11,8]],[[7647,2310],[-3,1],[-2,2]],[[7642,2313],[1,1],[45,42],[18,17]],[[7706,2373],[26,23],[5,4],[16,19],[18,21]],[[7771,2440],[5,-4],[10,-7],[8,-1]],[[7774,2391],[50,-38]],[[7824,2353],[13,-10],[-11,-18],[-13,10],[-5,-9],[-5,-8],[-8,-14],[-5,3]],[[7794,2428],[21,-17],[5,-3],[25,-19]],[[7845,2389],[-10,-18],[-6,-9],[-5,-9]],[[7845,2389],[20,-15],[8,-8],[20,-20],[6,-4]],[[7899,2342],[-2,-2],[-7,-11],[-1,-3],[-3,1],[-17,-31],[-19,-28],[-11,-12],[-32,-33],[-35,-27],[0,-1]],[[7845,2389],[11,18],[9,16],[-54,41],[4,8],[0,3],[5,9],[2,2],[4,9],[-17,12]],[[7809,2507],[12,19]],[[7821,2526],[18,-15],[9,8],[14,13],[4,3]],[[7866,2535],[9,-9],[-7,-11],[13,-18],[12,-12],[8,-2],[9,15]],[[7910,2498],[33,-26],[12,15],[11,16],[13,16]],[[7979,2519],[5,5],[3,4],[1,2],[8,10],[4,4],[11,12]],[[8022,2541],[-17,-23],[-4,-6],[-2,-2],[-8,-10],[-7,-10],[-8,-11],[-10,-19],[-2,-3],[-14,-24],[-32,-56],[-18,-32],[-1,-3]],[[7742,2464],[-14,13],[-14,14],[-9,9],[-20,19]],[[7685,2519],[6,8],[5,7]],[[7696,2534],[28,-27],[11,15],[11,15]],[[7746,2537],[17,24],[5,7]],[[7768,2568],[7,-6],[11,-8],[35,-28]],[[7809,2507],[-16,-13],[-13,-6],[-18,-11],[-20,-13]],[[7696,2534],[5,7],[3,5],[7,8],[6,7],[20,-16],[9,-8]],[[7685,2519],[-11,10]],[[7674,2529],[32,39],[43,49],[3,3],[2,2],[2,3],[7,8],[2,2],[2,2],[1,1],[25,27],[7,7],[11,-8],[5,-5],[4,-3]],[[7820,2656],[-11,-18],[-10,-18],[-5,-8],[-5,-9],[-10,-18],[-11,-17]],[[6826,3110],[-35,-67]],[[6791,3043],[-2,1],[-19,14]],[[6770,3058],[36,66]],[[6806,3124],[18,-13],[2,-1]],[[6770,3058],[-20,15],[-19,14]],[[6731,3087],[36,66]],[[6767,3153],[19,-14]],[[6786,3139],[20,-15]],[[6712,3101],[36,67]],[[6748,3168],[19,-15]],[[6731,3087],[-19,14]],[[6694,3114],[36,67]],[[6730,3181],[18,-13]],[[6712,3101],[-18,13]],[[6675,3128],[36,67]],[[6711,3195],[19,-14]],[[6694,3114],[-19,14]],[[6657,3142],[36,67]],[[6693,3209],[18,-14]],[[6675,3128],[-18,14]],[[6694,3301],[-8,-13],[-9,-8],[-23,-43]],[[6654,3237],[-34,-62],[19,-14],[-3,-4]],[[6636,3157],[-3,4],[-15,11],[-12,9],[-40,29],[-4,3]],[[6562,3213],[3,4],[0,1],[7,11],[5,5],[14,26],[19,36]],[[6676,3426],[1,-1],[2,-2],[3,-2],[11,-8],[9,-6],[18,-14]],[[6720,3393],[3,-2],[26,-20],[3,-2]],[[6747,3261],[-36,-66]],[[6693,3209],[-20,14],[-19,14]],[[6766,3248],[-36,-67]],[[6784,3234],[-36,-66]],[[6784,3234],[19,-14],[-36,-67]],[[6822,3206],[-36,-67]],[[6825,3313],[20,-15],[16,-12]],[[6842,3191],[-36,-67]],[[6863,3176],[-37,-66]],[[6844,3096],[-18,14]],[[6880,3163],[-36,-67]],[[6899,3150],[-36,-68]],[[6863,3082],[-19,14]],[[7981,3106],[-13,11],[-22,17],[-1,0],[-29,-19]],[[7931,3205],[3,5],[13,24],[15,25]],[[7962,3259],[14,23]],[[7976,3282],[14,24]],[[8063,3245],[-13,-23],[-14,-23],[-15,-25],[-13,-23],[-13,-21],[-14,-24]],[[7981,3106],[-16,-26]],[[8076,2997],[-2,2],[-3,2]],[[8071,3001],[-4,3],[-2,2],[-1,0],[-3,3],[-4,2],[-34,27]],[[8186,3142],[-4,-3],[-13,-17],[-1,-4],[-18,-22],[-11,-15]],[[8139,3081],[-19,-26],[-12,-16],[-2,-1],[-6,-10],[-6,-8],[-3,-4],[-15,-19]],[[8178,2916],[-11,10],[-45,34]],[[8122,2960],[15,26],[11,18],[11,19]],[[8159,3023],[21,-15],[17,-13],[-13,-24],[16,-12]],[[8200,2959],[-8,-16],[-14,-27]],[[8129,2916],[-23,16]],[[8106,2932],[16,28]],[[8037,2814],[17,25],[13,24],[13,22]],[[8080,2885],[8,16],[4,7],[14,24]],[[8080,2885],[-18,14],[-7,5],[-16,13],[-14,12],[15,20]],[[8040,2949],[13,-10],[4,-3],[18,-14],[5,10],[3,6],[5,9],[3,-3],[15,-12]],[[7053,2576],[-3,1],[-2,1],[-72,54],[-7,5]],[[6987,2670],[78,-58],[3,-3],[2,-2]],[[6987,2670],[1,2],[4,-1],[18,34],[13,8]],[[6942,2703],[2,3],[9,18],[6,13],[1,5]],[[6960,2742],[6,13]],[[1046,2541],[-5,-4],[-22,-21],[-5,-5],[-14,-15],[-2,-2],[-2,-2],[-2,-3],[-6,-6],[2,-10]],[[990,2473],[-17,21],[-4,1],[-2,0],[-13,-4],[-10,-5],[-3,-12],[-4,-2],[-7,10],[-1,13],[-8,10],[-4,6],[-2,1],[-2,0],[-3,1],[-9,-3],[-7,-1],[-10,-7],[0,-8],[-2,0],[-7,0],[-4,-7],[-1,-5],[-2,-7],[-5,-8],[-5,-11],[-9,2],[-7,4],[-9,3],[-7,5],[-9,0],[-18,-4],[-5,-2],[-3,-5],[-13,-5],[-4,-1],[-7,1],[-6,3],[-3,0],[-5,-2],[-4,1],[-13,-4],[-17,0],[-13,-6],[-3,-3],[-20,-6],[1,-4],[0,-2],[-12,2],[-7,-3],[-22,10],[-3,4],[-1,7],[1,5],[0,10],[15,41],[10,21],[5,7],[5,10],[7,9],[6,4],[9,5],[9,3],[2,-2],[4,-8],[3,1],[5,-2],[6,-5],[1,0],[4,4],[9,3],[5,5],[8,5],[3,5],[2,10],[3,20],[0,5],[-1,10],[-1,6],[-2,3],[-7,10],[-9,4],[-12,-5],[-9,-5],[0,-3],[-6,-1],[-5,1],[-4,8],[5,5],[4,8],[3,9],[0,10],[-5,16],[-1,4],[-10,11],[-10,1],[-5,-1],[-2,-1],[-3,-6],[-4,-17],[-2,-2],[-15,-6],[-5,1],[-3,4],[0,7],[3,5],[-1,8],[0,4],[2,5],[2,2],[6,3],[18,-3],[5,-1],[9,2],[6,1],[2,27],[2,10],[0,12],[-3,15],[1,11],[4,19],[9,21],[2,8],[3,4],[2,11],[0,25],[0,5],[5,18],[3,0],[12,20],[7,9],[7,5],[10,12],[6,5],[2,7],[4,7],[9,16],[3,1],[1,1],[1,-1],[1,-7],[2,-3],[5,1],[16,27],[3,8],[3,8],[2,12],[4,3],[2,2],[4,1],[3,0],[17,1],[4,1],[6,4],[4,4],[2,4],[3,3],[3,0],[1,-6],[2,-6],[3,-4],[5,-2],[14,0],[7,2],[2,2],[3,1],[15,5],[13,9],[5,2],[19,-4],[14,0],[8,2],[5,7],[9,16],[10,15],[16,36],[7,18],[6,16],[7,19],[10,17],[1,1],[7,15],[5,16],[7,15],[4,7],[3,3],[11,4],[14,5],[10,9],[12,6],[27,8],[10,11],[7,7],[4,0],[8,0],[6,-4],[12,-2],[5,0],[5,-6],[3,-1],[6,-1],[6,2],[16,12],[5,8],[9,21],[4,15],[3,19],[4,15],[1,7]],[[1274,3378],[9,-11],[23,-32],[4,-5]],[[1310,3330],[-15,-33],[-2,-4],[-7,-11],[-3,-6],[-6,-10],[-6,-10],[-3,-4],[-3,-3],[-3,-2],[-2,-2],[-3,-3],[-5,-2],[-7,-5],[-20,-12],[-9,-6],[-3,-2],[-3,-1],[-3,-1],[-1,-1],[-4,-1],[-8,-2],[-10,-3],[-2,3],[-5,7],[-18,28],[-1,2],[-1,1],[-1,0],[-2,0],[-1,1],[-1,0],[-7,-2],[-8,-1],[-1,-1],[-1,-1],[0,-1],[0,-1],[0,-1],[0,-1],[1,-2],[14,-21],[9,-14],[2,-3],[-2,-1],[-2,-1],[-2,-2],[-3,-2],[-3,-3],[-6,-5],[-5,-5],[-5,-5],[-14,-15],[-7,-7],[-4,-4],[-5,-8],[-3,-3],[-10,-12],[-10,-11],[-12,-12],[-7,-8],[-7,-9],[-6,-10],[-6,-9],[-13,-18],[-11,-14],[-13,-19],[-3,-4],[-6,-6],[-5,-5],[-7,-6],[-5,-4],[-7,-4],[-9,-5],[-17,-10],[-9,-4],[-11,-5],[-7,-3],[-10,-5],[-10,-5],[-13,-6],[-7,-3],[-21,-10],[-18,-8],[-5,-4],[-4,-3],[-7,-6],[-9,-10],[-4,-4],[-2,-2],[-2,-4],[-1,-3],[5,-8],[7,-13],[10,-15],[6,-9],[14,-20],[9,-14],[10,-14],[12,-18],[16,-24],[20,-29],[11,-17],[35,-46],[13,-17],[11,-13],[7,-11],[18,-26],[28,-40],[8,-12]],[[2002,2744],[4,-14],[4,3],[8,3],[8,-2],[7,-7],[0,-13],[-3,-10],[-12,-21],[0,-5],[1,-4],[3,-1],[2,3],[3,-1],[1,-5],[-8,-16],[-4,-1],[-4,1],[-10,-2],[-10,0],[-9,-8],[-2,4],[-6,12],[1,40],[1,10],[2,8],[4,10],[7,10],[5,7],[7,-1]],[[1961,2688],[-5,15],[1,6],[-4,1],[-2,2],[-2,1],[-1,1],[-1,2],[-4,4],[-2,4],[-2,2],[-2,3],[-3,5],[-3,4],[-1,2],[-2,2],[-2,2],[-3,3],[-2,2],[-7,8]],[[1914,2757],[7,7],[2,3],[8,8],[16,19]],[[1947,2794],[6,6]],[[1953,2800],[11,-16],[6,-9],[8,-8]],[[1978,2767],[-3,-10],[-3,-12],[0,-8],[0,-7],[-3,-6],[-8,-10],[-2,-9],[3,-10],[-1,-7]],[[6932,3124],[-36,-67]],[[6896,3057],[-4,3],[-29,22]],[[6860,2991],[-4,3],[-29,22]],[[6827,3016],[36,66]],[[6896,3057],[-5,-9],[-4,-8],[-5,-9],[-4,-7],[-5,-9],[-4,-8],[-4,-7],[-5,-9]],[[6932,3124],[24,-17]],[[6956,3107],[-36,-67]],[[6920,3040],[-24,17]],[[6941,3024],[-21,16]],[[6956,3107],[21,-15]],[[6977,3092],[-36,-68]],[[6978,2997],[-19,14],[-18,13]],[[6977,3092],[19,-15]],[[6996,3077],[19,-13],[-37,-67]],[[6996,3077],[40,76]],[[7036,3153],[19,-14]],[[7055,3139],[33,-24]],[[7088,3115],[-40,-75],[-26,-48],[-16,12],[-11,-19],[-17,12]],[[6956,3107],[40,76]],[[6996,3183],[22,-16],[18,-14]],[[6973,3200],[23,-17]],[[7050,3177],[-14,-24]],[[6987,3224],[63,-47]],[[7072,3220],[-22,-43]],[[7068,3164],[-13,-25]],[[7072,3220],[18,-15]],[[7090,3205],[-22,-41]],[[7105,3190],[-21,-38],[-16,12]],[[7119,3092],[-31,23]],[[7152,3149],[-8,-15],[-11,-18],[-14,-24]],[[7145,3082],[-3,1],[-3,1],[-7,2],[-13,6]],[[7169,3135],[3,-2],[9,-7]],[[7181,3126],[-18,-32],[12,-10]],[[7175,3084],[-10,-3],[-11,-1],[-2,0],[-7,2]],[[7181,3126],[18,-16],[19,-16]],[[7218,3094],[-12,0],[-15,-3],[-16,-7]],[[8079,2128],[-2,-39]],[[8077,2089],[-22,1],[-22,2]],[[8033,2092],[-21,2],[-22,1]],[[7990,2095],[-21,1],[-21,2],[-5,-70]],[[7943,2028],[-21,2],[-6,0]],[[7916,2030],[0,5],[4,65],[5,29],[2,6]],[[7908,2031],[-6,1]],[[7919,2136],[-2,-6],[-5,-25],[-2,-28],[-3,-38],[1,-4],[0,-4]],[[7990,2095],[-3,-70]],[[7987,2025],[-23,1],[-21,2]],[[7902,2032],[0,-18],[0,-12],[5,-30]],[[7997,1801],[-66,6],[-4,4],[0,8],[-11,0]],[[7916,1819],[5,34],[3,47],[-2,10],[0,1]],[[7922,1911],[17,0],[63,-5]],[[8002,1906],[-1,-27],[-1,-19]],[[8000,1860],[-1,-19]],[[7999,1841],[-2,-19]],[[7997,1822],[0,-21]],[[7906,1819],[-4,0]],[[7912,1912],[1,0]],[[7913,1912],[0,-3],[0,-2],[-3,-57],[-4,-31]],[[7997,1801],[-2,-23]],[[7995,1778],[0,-9],[-1,-18]],[[7994,1751],[-1,-9]],[[7993,1742],[-86,6],[-12,4]],[[7895,1752],[2,5],[5,12],[13,48],[1,2]],[[7886,1756],[-3,1]],[[7906,1819],[-1,-2],[-13,-47],[-6,-14]],[[2358,2080],[-34,-33],[-17,-16],[-30,-30],[2,-10],[0,-1],[-18,-17],[-20,-19],[-7,-7],[-18,-17],[-8,-8]],[[2208,1922],[-3,6],[-3,4],[-7,14],[-2,2],[-3,6],[-8,10]],[[2182,1964],[29,30],[56,50],[38,47],[14,25],[59,80]],[[2378,2196],[13,17]],[[2391,2213],[3,-3],[4,-4],[9,-9],[2,-1],[29,-40],[-15,-14],[-45,-44],[-1,0],[-1,0],[-1,0],[-1,0],[0,1],[-3,4],[-9,-5],[-10,-10],[6,-8]],[[2182,1964],[-4,4],[-2,3],[-5,6],[-9,9],[-12,10]],[[2150,1996],[5,5],[25,27]],[[2180,2028],[23,20],[14,14],[13,15],[7,10],[12,18],[4,8],[5,14],[9,27]],[[2267,2154],[17,-12]],[[2284,2142],[19,-15],[5,-5],[15,19],[13,17],[35,45],[7,-7]],[[3488,1518],[22,10],[19,8],[19,7],[20,7],[20,8],[13,6],[20,5]],[[3621,1569],[34,8],[36,8]],[[3693,1577],[-11,-2],[-2,-2],[-27,-5],[-34,-8],[-39,-12],[-36,-13],[-49,-20],[-4,-2],[-33,-16],[-4,-2],[-29,-15],[-30,-15],[-37,-20],[-1,-1],[-35,-15],[-17,-10],[-31,-15],[-26,-13],[-29,-15],[-4,-1]],[[3215,1375],[-3,-2]],[[3212,1373],[-2,7],[-17,67]],[[3193,1447],[-13,53],[-17,66]],[[3163,1566],[4,1]],[[3167,1567],[7,2],[3,0],[7,2],[6,3],[14,12],[41,34],[9,8],[0,14],[0,10]],[[3254,1652],[88,75]],[[3342,1727],[28,23],[26,22],[26,21]],[[3422,1793],[1,-5],[24,-100],[22,-89]],[[3469,1599],[-11,-4],[-2,-1],[-2,-2],[-1,-2],[-1,-3],[-4,-6],[-22,-13],[-2,-4],[-6,-4],[-28,-14],[-6,-3],[-6,-5],[-9,-8],[-2,-3],[5,-15],[4,-19],[1,-1],[2,-1],[1,0],[32,17],[9,-23],[3,2],[41,21],[9,4],[14,6]],[[3469,1599],[19,-81]],[[2331,3626],[5,-20],[-14,-7],[-13,-13],[-12,-8],[-9,-3],[-1,-4],[15,-24],[-4,-13]],[[2298,3534],[-7,11],[-6,9],[-1,0],[-1,0],[-1,-1],[-11,-10],[-12,-11],[-2,-2],[-8,-6],[-11,-9],[-6,-2],[-10,15],[-17,27],[2,11],[-1,12],[-1,10],[-5,4],[-2,1],[-12,3],[-11,-5],[-17,-20],[-1,-4],[-17,-11],[-19,-9],[-21,-7],[-8,-4],[-8,-5],[-5,-6],[-1,-5],[0,-6],[1,-11],[1,-8],[0,-1],[0,-2],[1,-3],[0,-2],[1,-4],[2,-3],[2,-4],[3,-4],[5,-3],[6,-3],[3,-1],[4,0],[7,0],[8,1],[10,0],[6,1],[17,-1],[4,0]],[[2159,3466],[-1,-8],[-1,-8],[-1,-10],[-1,-4],[-3,-5],[-2,-2],[-10,-10],[-19,-18],[-13,-12],[-10,-9],[-7,-6],[-1,-1],[-1,-2],[0,-1],[0,-1],[0,-1],[1,0],[14,-20]],[[2104,3348],[-28,0],[-19,-2],[-6,-23],[4,-6],[15,-9],[0,-20],[27,-42],[-17,-41],[-12,-35],[8,-27]],[[2076,3143],[-30,18],[1,1],[5,14],[3,6],[-25,14],[-6,3],[-4,2],[-3,1],[-3,1],[-2,0],[-2,0],[-3,0],[-19,-2]],[[1988,3201],[0,2],[-1,4],[0,13],[0,15],[-1,19],[-2,0],[-1,0],[0,1],[-1,1],[0,1],[0,1],[0,1],[1,0],[3,38],[6,14],[4,11],[-45,71],[-204,386]],[[1747,3779],[3,2],[3,1],[3,2],[17,12],[17,12],[14,9],[2,1],[3,3],[3,1],[2,2],[3,3],[2,2],[6,5],[22,21],[7,7],[3,2],[2,3],[4,2],[3,3],[7,6],[6,4],[10,6],[9,5],[2,1],[4,2],[3,2],[3,0],[4,1],[9,-1],[5,0],[8,0],[5,1],[23,-1],[0,-8],[1,-12],[0,-3],[1,-2],[1,-3],[18,-27],[11,-16],[6,-9],[4,-6],[19,-28],[1,-2],[1,0],[1,0],[1,-1],[2,0],[1,1],[1,1],[12,12],[16,14],[11,9],[6,6],[9,9],[6,6],[-2,3],[-6,9],[-3,4],[-3,4],[-5,7],[-2,5],[-1,1],[0,1],[-1,2],[-1,3],[-2,8],[-1,5],[6,-2],[8,-2],[10,-3],[5,-2],[5,-1],[2,-4],[5,-9],[4,-7],[6,-8],[5,-7],[4,-6],[14,-21],[4,-6],[6,-10],[5,-6],[12,12],[13,13],[8,7],[13,-20],[7,-11],[7,-9],[13,-18],[12,-17],[2,-2],[14,-17],[12,-19],[26,-37],[9,-12],[14,-20],[14,-21]],[[2298,3534],[5,-6],[9,-14],[5,-6],[3,-4],[3,-2],[6,-6],[-2,-3],[-2,-7],[-2,-4],[-3,-6],[-2,-5],[-2,-6],[-7,-15],[-1,-3],[-1,-3],[-1,-2],[-1,-3],[-2,-7],[0,-3],[-1,-1],[-1,-7],[0,-8],[-1,-4],[-1,-17],[-1,-6],[-1,-3],[-1,-3],[-1,-2],[-1,-2],[-2,-4],[-3,-3],[-5,-4],[-18,-10],[-1,-1],[-1,-1],[-2,-1],[-2,-2],[-2,-2],[-2,-2],[-1,-2],[-1,-2],[0,-2],[-1,-1],[0,-2],[-1,-3],[-1,-8],[0,-6]],[[2251,3320],[-7,0],[-2,0],[-1,0],[-2,1],[-1,1],[-1,1],[-11,16],[-2,3],[-2,1],[-3,3],[-4,3]],[[2215,3349],[2,5],[4,8],[4,6],[1,2],[1,1],[1,3],[10,10],[8,9],[-37,54],[-6,7],[-2,2],[-2,2],[-2,1],[-2,1],[-1,0],[-3,1],[-6,1],[-24,3],[-2,1]],[[2164,3320],[0,-1],[13,-20],[-8,-9],[-6,-6],[-9,-9],[-6,-6],[2,-10],[-8,-12],[-10,-14],[-2,-3],[8,-11],[11,4],[12,-6]],[[2161,3217],[-4,-10],[-1,-2],[0,-2],[-2,-5],[0,-1],[-1,-3],[0,-2],[-1,-7],[0,-4],[-1,-5],[-4,-9],[-3,-5],[-3,-5]],[[2141,3157],[-4,3],[-1,0],[-1,1],[-1,0],[-2,1],[-1,0],[-2,0],[-2,0],[-3,0],[-3,-1],[-2,0],[-2,-1],[-3,-2],[-1,-1],[-1,-1],[-1,-1],[0,-1],[-1,-1],[-1,-3],[-2,-3],[-4,-10],[-3,-7]],[[2100,3130],[-24,13]],[[2104,3348],[15,14],[7,-11],[1,-1],[2,-1],[24,-3],[-1,-6],[-2,-18],[14,-2]],[[2259,3137],[-6,-14],[-4,-8],[-9,-13],[-9,-12],[-8,-14],[-3,-3],[-3,-5],[-1,-3],[-4,-5],[-4,-6],[-9,-12],[-7,-7],[-6,-9],[-3,-2],[-5,-7]],[[2178,3017],[-10,14],[-12,18],[-14,20],[4,3],[5,6],[10,10],[5,7],[6,6],[4,4],[-9,13],[-4,5],[-5,9],[-7,9],[-5,7],[-1,1],[-4,8]],[[2161,3217],[10,-4],[3,-4],[2,-2],[0,-1],[0,-1],[-5,-14],[0,-1],[11,-16],[7,-10],[2,-2],[7,-4],[2,3],[1,2],[2,2],[1,2],[3,2],[1,1],[2,1],[2,1],[2,0],[3,1],[3,-1],[2,0],[2,0],[3,-1],[1,-1],[2,-1],[2,-2],[1,0],[1,-1],[1,-1],[1,-1],[2,-5],[1,-2],[5,-8],[2,-3],[4,-3],[9,-6]],[[2139,2977],[-3,5],[-12,16],[-7,-7],[-1,-1],[-3,-5],[-2,-3],[-1,-2],[-2,0],[-1,-1],[0,-1],[-1,0],[-1,0],[-1,0],[-1,0],[-1,0],[-2,0],[-1,0],[-2,0],[0,1],[-2,1],[-6,8],[-3,5],[-4,9],[-2,2],[-2,2],[-1,1],[0,1],[-1,0],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[1,0],[0,1],[4,3],[10,8],[-3,7],[0,2],[-1,4],[-1,7],[-2,21],[-1,6],[0,4],[1,6],[0,4],[1,3],[1,5],[1,4],[1,3],[4,8],[4,11],[4,9]],[[2178,3017],[-7,-7],[-5,-6],[-10,-9],[-10,-11],[-7,-7]],[[2139,2977],[-10,-11],[-6,-6],[-8,-8],[-12,-13],[-7,-7]],[[2096,2932],[-6,8],[-8,11],[-18,26],[-12,-10],[-7,-5],[-8,-7],[-7,-8],[-24,35],[-14,20],[-1,1],[-1,0],[-1,0],[-1,-1],[-13,-12],[-13,19]],[[1962,3009],[12,11],[2,2],[12,11],[2,2],[1,1],[2,2],[3,3],[7,6],[8,8],[6,5],[4,4],[8,8],[8,7],[10,12],[1,2],[2,2],[1,2],[2,3],[9,14],[2,3],[2,4],[5,11],[4,9],[1,2]],[[1767,3047],[13,-17],[14,-21],[6,-9],[7,-9],[6,-8],[15,-22],[27,-39],[7,-9]],[[1862,2913],[29,-40],[11,-15],[45,-64]],[[1914,2757],[-3,-4],[-9,-9],[-5,-7],[-3,-2],[-7,-7],[-6,-4],[-17,-15],[23,-33],[13,-19],[3,-3],[31,-45],[1,-1],[0,-1],[0,-2],[-1,-1],[-13,-12],[-18,26],[-5,6],[-18,26],[-15,21],[-16,23],[-10,-11],[-3,-3],[-4,-6],[-4,-6],[-4,-7],[-5,-8],[-6,-11],[-4,-8],[-2,-3],[6,-7],[47,-67],[0,-2],[0,-1],[-17,-15],[-53,77],[-18,-15],[38,-53],[-15,-14],[-39,56],[-21,-15],[-10,-7],[-8,-6],[-13,-7],[-16,-8],[-14,-6],[-12,-5],[-15,-7],[-24,-10],[-14,-6],[-36,-17],[-55,-26],[-13,-5],[-9,-3],[-12,-3],[-23,-6],[-30,-7],[-10,-2],[-5,-2],[-9,-3],[-9,-3],[-6,-2],[-4,-2],[-8,-4],[-7,-3],[-5,-3],[-4,-3],[-6,-4],[-6,-4],[-12,-8],[-10,-8],[-7,-4],[-6,-3],[-10,-3],[-5,-2],[-11,-3],[-8,-2],[-7,-2],[-7,0],[-25,0],[-8,-1],[-6,0],[-6,-2],[-5,-2],[-5,-3],[-6,-3],[-7,-5],[-4,-3],[-5,-1],[-4,0],[-4,0],[-6,2],[-5,3],[-4,3],[-11,15],[-21,31],[-39,56],[-16,23],[-31,45],[-5,7]],[[1310,3330],[17,-21],[-20,-25],[12,-29],[162,112],[15,56]],[[1496,3423],[20,-29],[13,-20],[25,-35],[17,-25],[12,-16],[18,-24],[20,-24],[16,-19],[8,-10],[1,-2],[7,-8],[7,-10],[8,-11],[5,-8],[10,-13],[17,-25],[7,-11],[24,-34],[12,-17],[20,-28],[4,-7]],[[7277,1135],[-14,4],[-14,4],[-19,6]],[[7204,1258],[16,18],[0,2],[-1,2],[-11,14],[0,3],[1,3],[11,11],[12,13],[1,1],[8,8],[32,34]],[[7273,1367],[27,-22],[2,-1],[2,0],[1,2],[2,6],[2,10],[6,13],[7,13],[5,9],[4,7],[1,2],[0,1],[-2,4],[-12,12],[-7,6],[-7,6],[-5,5],[-7,5],[-7,7]],[[7399,1492],[-3,-4],[-26,-40],[-50,-76],[-6,-15],[-12,-33],[-14,-54],[-5,-31],[14,-5]],[[6562,3213],[-1,-3],[-3,-5],[-4,-10],[-3,-7],[-19,-35],[-6,-8],[-3,-4],[-28,-37],[-20,-26],[-2,-5],[-6,-7],[-4,-6],[2,-3],[9,-9],[8,-7],[9,-8],[7,-5],[13,-10],[5,-3],[4,-3],[13,-9],[18,-13],[16,-10]],[[6560,2974],[-45,30],[-1,1],[-3,1],[-38,-72]],[[6473,2934],[-43,-74],[-14,-32],[-9,-29],[-5,-23],[-1,-13],[-1,-7],[-1,-26],[0,-3]],[[6399,2727],[2,-134],[0,-2],[0,-4],[0,-4],[0,-2],[0,-2],[0,-3],[0,-3],[0,-2],[0,-2],[0,-4],[0,-11]],[[6401,2554],[-4,3],[-3,2],[-31,22]],[[6363,2581],[-56,44],[-21,-35],[-30,22],[-21,14]],[[5965,2635],[6,39],[1,7],[5,29]],[[5977,2710],[42,255],[57,-64],[58,-57],[23,-33],[12,-14],[1,-2],[2,-2],[1,-1],[2,-2],[1,-1],[2,-2],[1,-2],[2,-2],[2,2],[1,2],[2,2],[1,2],[2,1],[1,1],[1,2],[7,8],[31,36],[5,5],[28,37],[8,10],[2,2],[11,14],[6,8],[9,11],[38,49],[35,45],[28,37],[-16,17]],[[6383,3074],[2,3],[22,28],[2,3],[3,4],[3,4],[14,19],[17,22]],[[6446,3157],[7,8],[33,43],[3,4],[3,4],[2,3],[2,1],[8,6],[13,5],[9,3],[4,1],[3,1],[3,-1],[2,-1],[-5,33],[-1,3],[-20,-5]],[[6512,3265],[-4,19],[-3,21],[-4,20],[-4,21],[-3,20],[-2,9],[-6,4],[-4,7]],[[9002,6235],[-3,-11],[-1,-5],[-2,-3],[-1,-4],[-1,-13],[1,-44],[-1,-29],[-1,-12],[-4,-16],[-5,-16],[-5,-12],[-5,-9],[-6,-9],[-8,-9],[-9,-9],[-13,-13],[-6,-4],[-12,-19]],[[8784,6337],[12,-4],[11,-3],[3,-1],[8,-3],[13,-4],[6,-2],[46,-14],[8,-3],[14,-4],[2,-1],[3,-1],[3,-1],[6,-2],[9,-3],[7,-3],[3,-2],[3,-1],[3,-2],[3,-2],[3,-1],[2,-2],[1,0],[12,-9],[6,-4],[5,-4],[3,-2],[4,-4],[12,-11],[7,-8],[0,-1]],[[6122,3588],[-8,6]],[[6114,3594],[-25,21],[-13,12],[-66,68]],[[6010,3695],[-21,22],[-4,4],[-15,15],[-3,3]],[[5967,3739],[6,8],[6,8],[9,-9],[9,-10],[9,8],[-9,12],[2,3],[30,36],[4,7],[3,15],[2,12],[0,12],[-1,12],[-4,11],[-15,19],[-9,10]],[[6009,3893],[27,33],[10,14],[2,3]],[[6048,3943],[9,-9],[5,-5],[10,-8],[8,-4],[7,-3]],[[6087,3914],[25,-1],[41,0]],[[6153,3913],[0,-4],[0,-15],[1,-36],[-1,-52],[-1,-27],[-2,-13],[-3,-28],[-5,-34],[-17,-99],[0,-6],[-1,-4],[-2,-7]],[[5910,3161],[-16,-2],[-30,-41],[-9,9],[15,19],[-14,15]],[[5856,3161],[29,37],[-1,4],[-11,12],[-3,0],[-14,-19],[-14,15]],[[5842,3210],[21,28],[8,10],[2,3]],[[5873,3251],[30,-32],[14,-14]],[[5917,3205],[-2,-3],[-13,-15],[10,-11],[-2,-15]],[[5778,3715],[-40,42],[-15,17]],[[5723,3774],[27,36],[15,17]],[[5765,3827],[55,-58]],[[5820,3769],[-13,-18],[-14,-18],[-15,-18]],[[2096,2932],[-6,-8],[-9,-9],[-2,-1],[-8,-8],[-7,-5],[-2,0],[-9,-4],[-12,-6]],[[2041,2891],[-9,-5],[-7,-5],[-8,-6],[-6,-7]],[[2011,2868],[-20,25],[-44,64],[-1,0],[-1,1],[-1,0],[-1,0],[-13,-12],[-13,19]],[[1917,2965],[20,21],[9,7]],[[1946,2993],[16,16]],[[2011,2868],[-7,-9],[-5,-6],[-2,-2]],[[1997,2851],[-9,-11],[-7,-7],[-18,-21],[-10,-12]],[[1862,2913],[8,8],[1,1],[23,22]],[[1894,2944],[8,8],[15,13]],[[2041,2891],[25,-34],[12,-18],[9,-11],[10,-8],[-7,-12],[-2,-3],[-4,-6],[-1,-4],[-1,-2],[-1,-2],[-1,-2],[-3,-4],[-3,-3],[-1,-1],[-1,0],[-1,1],[-1,1],[-6,5],[-10,1],[-12,2],[-1,0],[-1,1],[-1,1],[-30,42],[-9,12],[-3,4]],[[2096,2932],[8,-10],[45,-67],[2,-2]],[[2151,2853],[-3,-2],[-2,0],[-2,0],[-2,-1],[-10,-7],[-7,-8],[-8,-8],[-7,-7],[-1,-6],[-2,-4],[-4,-4],[-4,-11],[-13,-18],[-2,-7],[-6,-4],[-7,-4],[-9,13],[-21,6],[-7,-1],[-7,2],[-6,6],[-6,1],[-9,-3],[-4,8],[-3,1],[-4,-3],[-5,-11],[-3,-4],[-6,-5],[-3,-4],[0,-1]],[[1961,2688],[1,-8],[0,-21],[-3,-22],[-6,-8],[-6,-16],[-7,-4],[-1,-5],[-4,-11],[-5,-2],[-6,-6],[-5,0],[-9,-8],[-8,-8],[-6,-9],[-6,-10],[-4,-5],[-15,-2],[-9,-8],[-8,-10],[-6,-6],[-4,-5],[-17,-20],[-11,-14],[-13,-12],[-4,-3],[-6,-7],[-5,-7],[-3,-7],[-8,-11],[-2,-7],[-3,-5],[-6,-6],[-3,-4],[-1,-1],[-7,-15],[-2,-8],[-8,-24],[0,-9],[-4,-4],[-12,-10],[-5,-7],[-3,-2],[-6,-1],[-2,-1],[-2,-6],[-1,-3],[0,-3],[-2,-3],[-8,-7],[-6,-1],[-1,-1],[-3,-3],[-5,-2],[-12,2],[-12,3],[-8,4],[-6,4],[-10,1],[-13,4],[-5,-3],[-8,0],[-7,4],[-6,-3],[-7,-1],[-7,2],[-6,-5],[-17,0],[-6,2],[-2,-1],[-10,6],[-5,-1],[-5,-4],[-9,-11],[-10,-7],[-6,-2],[-4,-2],[-3,-4],[-1,-5],[-5,-13],[0,-2],[0,-2],[1,-2],[3,0],[1,2],[3,1],[2,-1],[4,-9],[10,-1],[7,-1],[7,5],[5,-13],[3,-4],[0,-2],[1,-2],[4,-2],[3,-4],[0,-5],[-3,-3],[-4,0],[-4,-2],[-4,-6],[-4,-7],[-5,-6],[-9,-9],[-7,-11],[-4,-3],[-5,-2],[-4,-4],[-7,-1],[-6,4],[-5,11],[0,5],[-2,5],[-5,6],[-10,8],[-5,8],[-8,9],[-8,5],[-5,0],[-6,-1],[-8,-2],[-19,0],[-6,-1],[-6,-3],[-14,-1],[-17,1],[-4,-4],[-8,-2],[-6,-4],[-8,0],[-7,-4],[-16,-14],[-4,-1],[-2,3],[-5,-1],[-2,-3],[-3,-3],[-5,0],[-3,-3],[-2,-3],[-5,-4],[-15,0],[-13,-4],[-6,0],[8,9],[7,4],[6,5],[4,6],[5,8],[3,7],[-2,10],[-9,1],[-10,-1],[-6,1],[-4,3],[-2,6],[-4,5],[-18,8],[-7,5],[-2,1],[-4,6],[-2,4],[-4,4],[-6,1],[-15,0],[-1,5],[-4,-5],[-4,1],[-4,-2],[-1,0],[-1,15],[-4,10],[-6,7],[-8,20],[-2,9],[-3,13],[-2,4],[-1,3],[-1,1],[-6,17],[-4,5],[-4,1],[-5,-3],[-3,3],[-7,3],[-15,-2],[-5,4],[-9,12],[-1,3],[-1,12],[-14,27],[-5,10],[-6,9],[-12,22],[-1,1],[-2,1],[-5,7],[-8,9],[-6,0],[-9,-3],[-6,-7],[-7,-5],[-6,-9],[-4,1]],[[1767,3047],[14,14],[2,1],[1,0],[1,0],[1,-1],[12,-16],[16,14],[-16,21],[-1,3],[0,3],[3,4],[2,4],[2,3],[3,7],[9,22]],[[1816,3126],[17,-22],[27,-38]],[[1860,3066],[6,-8],[1,-2],[2,-2],[1,-5],[3,-13],[1,-5],[1,-5],[0,-9],[-3,-22],[0,-10],[1,-4],[1,-4],[1,-4],[3,-6],[13,-19],[3,-4]],[[1860,3066],[5,4],[5,5],[3,5],[1,3],[0,3],[1,2],[26,26],[7,8],[1,1]],[[1909,3123],[1,-1],[29,-42],[15,-21],[1,-2],[0,-1],[1,-1],[-1,-1],[-7,-7],[-7,-6],[5,-6],[0,-1],[0,-1],[1,-1],[-1,-1],[-16,-16],[1,0],[11,-17],[4,-5]],[[1816,3126],[5,12],[3,7],[0,5],[1,4],[5,12],[3,8],[3,5],[2,4],[3,3],[4,2],[16,8],[4,2],[3,2],[2,0],[3,1],[4,0],[4,0],[13,0],[7,0],[5,0],[8,0],[20,0],[20,-1],[-1,-14],[1,-9],[0,-1],[0,-2]],[[1954,3174],[1,-7],[0,-9],[1,-3],[-15,-2],[-1,0],[-1,0],[-11,-11],[-19,-19]],[[1954,3174],[34,4],[0,16],[0,7]],[[1496,3423],[-14,19],[-11,16],[-12,17],[-1,3],[-3,6],[3,1],[4,2],[3,2],[5,5],[9,9],[5,5],[8,9],[2,2],[9,10],[5,5],[7,8],[5,5],[-51,82]],[[1469,3629],[0,5],[11,28],[3,28],[1,26],[-1,11],[-7,18],[-3,15],[2,3],[7,1],[11,0],[5,2],[5,18],[0,5],[-13,8],[-5,5],[-5,7],[1,7],[5,4],[3,2],[18,0],[17,-7],[10,-7],[5,-5],[4,-5],[10,-10],[7,-5],[15,0],[8,4],[6,6],[0,4],[-4,4],[6,7],[2,4],[5,6],[2,2],[14,8],[6,-5],[3,-1],[3,2],[2,3],[0,4],[3,1],[2,-2],[4,0],[3,5],[7,2],[4,-2],[7,4],[9,3],[11,12],[13,10],[2,1]],[[1693,3865],[4,-9],[51,-66],[-1,-11]],[[8210,3953],[-7,6],[-11,12],[-1,2]],[[8191,3973],[-3,3],[-43,32]],[[8145,4008],[-42,31]],[[8103,4039],[-28,22]],[[8075,4061],[-30,22],[-3,3],[0,2],[0,1],[-1,2],[-6,4]],[[8035,4095],[5,3],[12,22]],[[8052,4120],[11,18],[10,17],[9,15]],[[8082,4170],[11,19]],[[8093,4189],[13,22],[12,22]],[[8118,4233],[14,24]],[[8132,4257],[28,-21],[14,-11]],[[8174,4225],[12,-10],[7,-5],[18,-14],[32,-25]],[[8243,4171],[-6,-31],[-10,-55]],[[8227,4085],[-5,-24],[-5,-27]],[[8217,4034],[-4,-25],[-2,-16]],[[8211,3993],[0,-19],[-1,-21]],[[9697,9303],[30,-11]],[[9727,9292],[0,-2],[0,-2],[-2,-2],[0,-12],[-3,-8],[0,-10],[0,-4],[0,-7],[-1,-6],[-1,-19],[-1,-24],[-1,-4],[3,-11],[1,-2],[-2,-14],[-2,-9],[-2,-6],[0,-8],[-2,-10],[-2,-8],[-7,-33],[0,-25],[1,-4],[1,-8],[-1,-9],[-3,-5],[-2,-19],[0,-4],[-1,-2],[-2,-7],[-2,-35],[-2,-4],[-1,-7],[0,-1],[3,-11],[-2,-16],[0,-5],[1,-9],[-3,-13],[0,-6],[2,-2],[1,-8],[0,-1]],[[9695,8890],[-13,7]],[[9682,8897],[1,26],[-38,11],[4,25],[4,24],[3,21],[4,28],[1,11],[1,6],[1,11],[2,22],[-2,2],[-11,1],[-1,1],[-1,2],[1,5],[1,2],[2,1],[13,-3],[3,22],[1,8],[2,22],[2,20],[1,10],[2,14],[19,114]],[[7572,5225],[-40,29],[-8,1],[-3,18]],[[7521,5273],[10,7]],[[7531,5280],[50,-37]],[[7531,5280],[14,13],[4,21]],[[7549,5314],[51,-37]],[[7549,5314],[1,13],[16,5],[1,8],[13,25]],[[7580,5365],[30,-22],[18,-13]],[[7521,5273],[-11,1],[-19,4]],[[7500,5379],[6,6],[14,24]],[[7520,5409],[15,-10],[-20,-39],[18,-4],[17,31],[15,-11],[15,-11]],[[7520,5409],[9,17],[9,18],[5,11],[4,6]],[[7547,5461],[9,-6],[51,-38]],[[7607,5417],[-9,-17],[-9,-18],[-9,-17]],[[8249,2119],[-34,10],[-10,-3],[2,-12],[14,-36]],[[8221,2078],[-14,1],[-22,2]],[[8252,2006],[-22,49],[-9,23]],[[8252,2006],[-32,2],[-17,2],[-22,0]],[[8180,1982],[-87,6]],[[8093,1988],[2,29]],[[8095,2017],[22,-2],[21,-1]],[[8178,1952],[-86,6]],[[8092,1958],[1,30]],[[8176,1923],[-86,6]],[[8090,1929],[2,29]],[[8175,1894],[-87,6]],[[8088,1900],[2,29]],[[9146,6516],[-7,-25]],[[9139,6491],[-5,2]],[[9134,6493],[-10,5],[-25,12],[-8,4]],[[9091,6514],[9,25],[9,26],[8,23]],[[9168,6589],[-6,-22],[-16,-51]],[[9199,6490],[-38,19],[-9,5],[-6,2]],[[9196,6434],[-10,5],[-17,9],[-24,11],[-9,5],[-4,3]],[[9132,6467],[7,24]],[[9214,6482],[-9,-24],[-9,-24]],[[9293,6387],[-13,6],[-5,2],[-3,2],[-8,4]],[[9264,6401],[-9,4],[-10,5],[-3,1],[-7,4],[-9,5]],[[9226,6420],[-20,9],[-2,1]],[[9204,6430],[-8,4]],[[9288,6418],[2,-15],[3,-16]],[[9226,6420],[-14,-38],[-7,-19],[-3,-9]],[[9202,6354],[-32,16],[-3,2]],[[9167,6372],[-5,2],[4,11],[5,15],[1,2],[5,16],[19,-10],[4,11],[4,11]],[[9240,6335],[-4,2],[-18,9],[-16,8]],[[9264,6401],[-21,-57],[-1,-2],[-1,-4],[-1,-3]],[[9161,6350],[6,22]],[[9240,6335],[-7,-21]],[[9233,6314],[-54,27],[-18,9]],[[7992,1720],[-98,7],[-5,-11],[-4,-14],[-5,-19]],[[7880,1683],[-4,-15]],[[7876,1668],[-5,-21],[-4,-20]],[[7867,1627],[-4,-22]],[[7863,1605],[-47,3],[-18,-23],[-13,-21]],[[7785,1564],[-21,-9]],[[7764,1555],[3,6],[14,24],[21,29],[17,18],[27,31],[15,24],[2,3],[18,31],[14,31]],[[7993,1742],[-1,-22]],[[7746,1548],[-6,-2]],[[7740,1546],[38,61],[17,21]],[[7795,1628],[20,23],[19,22],[16,22]],[[7850,1695],[12,20],[12,21],[9,21]],[[7886,1756],[-1,-3],[-8,-16],[-24,-43],[-1,-2],[-16,-21],[-22,-26],[-10,-11],[-19,-24],[-28,-43],[-11,-19]],[[7989,1676],[-109,7]],[[7992,1720],[-2,-25]],[[7990,1695],[-1,-19]],[[7989,1660],[-113,8]],[[7989,1676],[0,-16]],[[7987,1618],[-120,9]],[[7989,1660],[-1,-20]],[[7988,1640],[-1,-22]],[[7984,1571],[-126,9],[5,25]],[[7987,1618],[-2,-21]],[[7985,1597],[-1,-26]],[[7983,1547],[-2,-20]],[[7981,1527],[-97,15],[-11,2],[1,5],[-21,3]],[[7853,1552],[-35,6],[-33,6]],[[7984,1571],[-1,-24]],[[7981,1527],[-1,-23]],[[7980,1504],[-1,-19]],[[7979,1485],[-39,8],[-7,2],[-8,7],[-5,5],[-4,5]],[[7916,1512],[-68,12]],[[7848,1524],[4,24],[1,4]],[[7906,1461],[-67,19]],[[7839,1480],[5,22],[4,22]],[[7916,1512],[-5,-28],[-5,-23]],[[7979,1485],[-1,-21],[-1,-24]],[[7977,1440],[-71,21]],[[8056,1383],[-3,-5],[-9,-9]],[[8044,1369],[-1,-2],[-55,13],[-17,-19],[3,32]],[[7974,1393],[1,24],[-74,21]],[[7901,1438],[5,23]],[[7977,1440],[46,-13],[8,-9],[14,-34],[11,-1]],[[7828,1424],[3,10]],[[7831,1434],[65,-19],[5,23]],[[7974,1393],[-9,-9],[-137,40]],[[7831,1434],[4,23],[4,23]],[[8807,5880],[-19,10],[-7,-16],[-17,9],[-18,11],[-13,8],[-12,6]],[[8721,5908],[11,26],[8,20],[1,3]],[[8820,5914],[-2,-3],[-11,-31]],[[7222,2710],[8,8]],[[7230,2718],[91,-70],[3,-3],[12,24]],[[7230,2718],[18,18],[19,18],[5,6]],[[7184,2751],[12,21]],[[7196,2772],[14,24]],[[7210,2796],[12,-9],[13,22],[12,21],[6,13],[5,4],[5,2]],[[7210,2796],[6,11],[-62,47],[0,9],[4,16],[5,15]],[[7163,2894],[11,21],[21,39],[15,21],[3,5]],[[7106,2931],[16,-12],[2,2],[39,-27]],[[7196,2772],[0,9],[-144,113],[-3,13]],[[7049,2907],[15,-11],[22,-18],[14,42],[6,11]],[[7196,2772],[-7,3],[-151,113]],[[7038,2888],[11,19]],[[7027,2867],[11,21]],[[7049,2907],[23,42],[3,6]],[[7075,2955],[15,-12],[16,-12]],[[6924,2944],[-30,-55]],[[6894,2889],[-26,-48]],[[6868,2841],[-18,14],[-43,32]],[[6807,2887],[7,19],[17,30]],[[6831,2936],[16,31]],[[6847,2967],[45,-34],[13,25]],[[6905,2958],[19,-14]],[[6894,2889],[19,-14]],[[6913,2875],[-26,-48]],[[6887,2827],[-19,14]],[[6896,2789],[-10,-16],[-20,16],[-19,13]],[[6847,2802],[-33,25],[9,17],[-27,21]],[[6796,2865],[11,22]],[[6887,2827],[16,-12],[-2,-13]],[[6901,2802],[-5,-13]],[[6962,2839],[-31,-59],[-16,12],[-14,10]],[[6913,2875],[16,-12],[17,-12]],[[6960,2742],[-64,47]],[[6942,2703],[-2,2],[-7,5],[-57,42]],[[6836,2782],[2,3],[9,17]],[[6912,2646],[-3,2],[-63,47]],[[6895,2616],[-12,-23]],[[6883,2593],[-2,2],[-63,49]],[[6908,2558],[-31,24]],[[6883,2593],[31,-23],[-1,-4],[-5,-8]],[[6908,2558],[-6,-10],[21,-15]],[[6923,2533],[10,-7]],[[6933,2526],[-14,-4]],[[6919,2522],[-25,-8],[-22,-7]],[[6939,2583],[6,-4]],[[6945,2579],[-4,-8],[-10,-19],[1,-3],[-9,-16]],[[6945,2579],[15,-11],[32,-23]],[[6992,2545],[-20,-7],[-24,-9],[-15,-3]],[[7002,2547],[-10,-2]],[[6956,2615],[8,-6],[66,-50],[2,-1],[1,-2]],[[6993,2466],[-9,7],[-47,36]],[[6937,2509],[-18,13]],[[8173,1867],[-86,6]],[[8087,1873],[1,27]],[[8173,1847],[-87,7]],[[8086,1854],[1,19]],[[8171,1828],[-86,6]],[[8085,1834],[1,20]],[[8171,1809],[-87,6]],[[8084,1815],[1,19]],[[8169,1789],[-86,6]],[[8083,1795],[1,20]],[[8168,1766],[-86,6]],[[8082,1772],[1,23]],[[8166,1741],[-41,3],[-45,4]],[[8080,1748],[2,24]],[[8165,1709],[-86,5]],[[8079,1714],[1,29],[0,5]],[[8162,1665],[-86,6]],[[8076,1671],[1,17]],[[8077,1688],[2,26]],[[8160,1628],[-86,6]],[[8074,1634],[1,20]],[[8075,1654],[1,17]],[[8159,1606],[-86,6]],[[8073,1612],[1,22]],[[8175,1627],[-1,-21],[-15,0]],[[8071,1565],[1,25]],[[8072,1590],[1,22]],[[8159,1606],[-5,-21],[-6,-26],[-77,6]],[[8067,1512],[-86,15]],[[7983,1547],[86,-7],[2,25]],[[8209,1626],[-10,-23],[-17,-32],[-15,-19],[-23,-37],[-2,-12],[2,-3],[-6,-5]],[[8138,1495],[-15,5],[-31,9],[-25,3]],[[7984,1571],[87,-6]],[[7985,1597],[87,-7]],[[7988,1640],[86,-6]],[[7989,1660],[86,-6]],[[7990,1695],[87,-7]],[[7994,1751],[4,1],[38,-2],[44,-2]],[[7995,1778],[87,-6]],[[7997,1801],[86,-6]],[[7997,1822],[87,-7]],[[7999,1841],[86,-7]],[[8000,1860],[86,-6]],[[8002,1906],[86,-6]],[[8002,1906],[2,30],[1,29]],[[8005,1965],[76,-6],[11,-1]],[[8005,1965],[2,29]],[[8007,1994],[42,-2],[44,-4]],[[8007,1994],[0,18],[0,11]],[[8007,2023],[23,-1]],[[8030,2022],[21,-2],[22,-1]],[[8073,2019],[22,-2]],[[8030,2022],[3,70]],[[8077,2089],[-4,-70]],[[8007,2023],[-20,2]],[[7837,3125],[-26,-3],[-11,-1],[-11,3]],[[6962,4312],[1,-7],[-1,-4],[-1,-3],[-5,-12],[-8,-22]],[[6948,4264],[-62,30],[-7,-19]],[[6879,4275],[-58,28],[-5,2]],[[6816,4305],[0,5],[13,35],[1,3]],[[6830,4348],[3,0],[4,-2],[83,-21],[4,-2],[6,-2],[20,-6],[12,-3]],[[6923,5101],[-10,-19]],[[6913,5082],[-54,39],[-18,13],[-28,20]],[[6813,5154],[4,7],[25,46],[2,5],[5,9],[1,2],[1,2]],[[6851,5225],[46,-33]],[[6897,5192],[-2,-3],[-6,-9],[-2,-1],[-18,-34],[0,-2],[0,-2],[14,-10],[24,-17],[16,-13]],[[6136,4314],[-12,5],[-4,2],[-5,1],[-5,2],[-4,1],[-5,1],[-5,1],[-4,1],[-6,1],[-6,1],[-3,0],[-4,1],[-5,0],[-7,1],[-5,0],[-4,0],[-5,0],[-3,0],[-3,-1],[-5,-2],[-11,-1],[-5,-1],[-4,0],[-5,-1],[-6,-1],[-6,-2],[-3,-1],[-4,-1],[-4,-1],[-4,-2],[-5,-1],[-5,-2],[-14,-6],[-28,-10],[-3,-1],[-40,-16],[-11,-4],[-7,-3],[-5,-2]],[[6062,4383],[5,-21],[-16,-22],[5,-2],[5,-1],[19,-2],[8,-1],[9,-2],[12,-4],[27,-14]],[[5312,4075],[-13,-17]],[[5299,4058],[-15,16],[-3,-5]],[[5281,4069],[-18,11]],[[5263,4080],[-5,4],[-2,3],[-19,11],[-8,5]],[[5229,4103],[9,14],[0,5],[-31,32],[-30,33]],[[5177,4187],[14,18],[14,18]],[[5205,4223],[10,-11],[15,-15],[8,-8],[28,-29]],[[5266,4160],[18,-20]],[[5284,4140],[43,-45]],[[5327,4095],[-15,-20]],[[7828,1424],[-94,22],[-7,22],[-25,-18]],[[7702,1450],[3,5],[8,17],[4,5],[17,27],[1,2]],[[7735,1506],[1,0],[9,1],[5,-1],[89,-26]],[[7685,1444],[-5,1]],[[7740,1546],[3,-2]],[[7743,1544],[-3,-6],[-9,-14],[-9,-17],[-15,-23],[-4,-6],[-11,-23],[-7,-11]],[[7735,1506],[29,49]],[[7746,1548],[-3,-4]],[[7733,1659],[-2,-23],[11,-1],[27,-2],[18,-1],[6,-1],[2,-3]],[[7808,1698],[39,-2],[3,-1]],[[7934,1216],[-39,5]],[[7895,1221],[-51,11],[-47,12]],[[7797,1244],[-63,18],[-88,26],[-20,-8]],[[7626,1280],[-21,0]],[[7605,1280],[6,13],[2,5],[10,15],[12,24],[15,26],[7,15],[25,38],[20,34]],[[8044,1369],[-3,-5],[-7,-9],[-16,-23],[-11,-21],[-11,-17],[-10,-5],[-11,-13],[-6,-12],[-11,-12],[-6,-12],[-18,-24]],[[7590,1280],[10,22],[46,84],[24,42],[3,5]],[[7685,1444],[-5,-9],[-29,-51],[-3,-5],[-11,-16],[-35,-62],[-12,-20],[0,-1]],[[7979,1485],[86,-19],[0,5],[1,17]],[[8066,1488],[1,24]],[[8138,1495],[-3,-2],[-6,-7],[-20,-30],[-4,-8],[-22,-32],[-13,-18],[-9,-9],[-5,-6]],[[7980,1504],[86,-16]],[[8586,1703],[2,-3],[4,-4],[3,-2],[11,-4],[4,-14],[3,-9],[4,-4]],[[8617,1663],[-2,-2],[-9,-9],[-7,-9],[-3,-5],[-2,-8],[0,-8],[-2,-11],[-1,-20],[-4,-11],[-9,-17],[-15,-20],[-5,-2],[-8,1],[-8,-1],[-13,0],[-4,0],[-9,-1],[-8,-4],[-5,-4],[-20,-11],[-7,-3],[-8,-2],[-4,-2],[-5,-3],[-7,-9],[-6,-5],[-5,-8],[0,-11],[-3,-8],[-4,-8],[-10,-7],[-6,-1],[-3,-5],[-1,-4],[-4,-1],[-3,2],[-2,3],[-1,0],[-1,-2],[-12,-1],[-5,-1],[-12,2],[-3,-1],[-1,-6],[-2,-3],[-2,-2],[-5,-1],[-5,2],[-3,7],[-3,-1],[-3,-3],[0,-5],[-1,-3],[-4,-2],[-3,-1],[-3,1],[-5,5],[-3,5],[-4,1],[-6,3],[-6,8],[-3,5],[-7,15],[-1,6],[-1,1],[-1,7],[-7,20],[-7,27],[-4,25],[11,41],[6,13],[3,8],[5,17],[4,18],[8,23],[4,16],[5,28],[3,22],[0,22],[8,16],[5,19],[5,13],[2,15],[4,16],[9,18],[4,11]],[[2899,2234],[-37,-32],[-7,10],[-1,0],[-3,0],[-19,-17],[1,-3],[5,-7],[2,-2],[1,-3],[10,-17],[-35,-32],[-18,30],[-2,0],[-2,0],[-6,-5],[-1,-2],[0,-3],[19,-28],[-17,-15],[-18,29],[-2,1],[-2,0],[-7,-5],[-1,-2],[1,-3],[19,-29],[-14,-11],[-8,6],[-4,5],[-8,13],[-2,2],[-3,0],[-24,-20],[-1,-4],[1,-3],[9,-15],[2,-3],[-2,-3],[-13,-12],[-15,23],[-2,0],[-12,-10],[-2,-2],[1,-4],[13,-20],[-16,-14],[-12,20],[-2,2],[-2,1],[-12,-10],[-1,-2],[1,-3],[6,-11],[1,-9],[14,0],[2,0],[2,1],[2,2],[10,-14],[-42,-36],[-1,-1],[0,-1],[1,-2],[8,-13],[2,-2],[2,0],[2,1],[40,34],[6,-9],[2,-3],[2,-3],[26,22],[27,23],[9,7],[5,6],[48,41],[33,29],[22,19],[6,5],[5,4],[49,42]],[[2940,2167],[24,-39],[15,-25],[11,-17],[2,3],[7,-12],[10,-16],[4,-6],[3,-5]],[[3016,2050],[-3,-3],[-42,-35],[-19,-16],[-35,-29],[-26,-22],[-25,-21],[-24,-20],[-22,-19],[-24,-20],[-8,-6],[-3,-3],[-5,-4],[-7,-5],[-10,-7],[-10,-7],[-10,-6],[-10,-5],[-7,-4],[-7,-3],[-1,-1],[-2,-1]],[[2716,1813],[-3,6],[-4,6],[-5,9],[-59,86],[-3,4],[-15,31],[-7,12],[-22,36]],[[2598,2003],[3,4],[3,5],[10,8],[272,237],[3,3]],[[2889,2260],[13,-23],[-3,-3]],[[4158,3361],[-66,-13],[-2,-2],[-18,-16],[7,-7],[15,-14]],[[4094,3309],[-7,-8],[-7,-5],[-6,-3],[-8,-3],[-18,-6],[-7,-4],[-4,-5]],[[4037,3275],[-5,6],[-2,4],[-5,13]],[[4025,3298],[-2,5],[-1,4],[-4,8],[-15,15],[-1,0],[-13,14]],[[3989,3344],[8,8],[3,3],[5,2],[8,6],[3,4],[0,2],[1,3],[0,2],[-1,3],[-2,2],[-32,34]],[[3982,3413],[11,8],[3,3]],[[3996,3424],[28,-30],[30,-32],[6,0],[16,4],[6,1],[4,2],[5,5],[4,5],[12,-13],[3,0],[10,15],[-3,5],[-5,4],[-7,8],[-11,12],[-22,23],[-5,5],[-22,23]],[[4045,3461],[17,13]],[[4062,3474],[80,-86],[7,-7],[-2,-3],[11,-17]],[[5205,4223],[-37,40]],[[5168,4263],[-4,4],[-3,3],[0,1],[-4,4],[-12,13]],[[5145,4288],[24,30],[-15,15],[6,5],[12,10],[16,15],[11,10],[11,12],[3,4],[4,7]],[[5217,4396],[7,17],[2,5],[2,4]],[[5228,4422],[69,-72]],[[5297,4350],[62,-65]],[[5359,4285],[-11,-15]],[[5348,4270],[-44,-60]],[[5304,4210],[-10,-12],[-28,-38]],[[6657,3142],[-21,15]],[[6986,3651],[11,-15],[9,-21],[10,-22]],[[7145,3082],[-3,-7],[-1,-2],[-7,-9],[-16,-28],[-12,-24],[-31,-57]],[[6976,2905],[-17,13],[-1,1],[-1,0],[-6,5],[-9,6]],[[6942,2930],[4,7],[32,60]],[[9331,8884],[7,32],[8,37],[88,-25]],[[9434,8928],[-5,-24],[-1,-8],[-3,-23],[-2,-13]],[[9423,8860],[-6,2],[-12,3],[-10,3],[-18,5],[-43,12],[-3,-1]],[[6904,2449],[12,21],[10,19],[5,10],[6,10]],[[6256,2171],[-18,12],[-43,27]],[[6195,2210],[10,20],[6,14],[20,42],[3,4],[6,11],[3,9],[1,10],[1,5]],[[6245,2325],[1,11],[2,7],[4,10],[7,15],[1,3]],[[6260,2371],[19,-12],[16,33],[17,-11],[-6,-13],[-9,-20],[12,-8],[5,-5],[5,-6],[6,-5],[3,-4]],[[7771,2440],[-24,17],[-5,7]],[[7922,1911],[1,26],[-6,61],[0,3],[-1,5],[0,24]],[[7908,2031],[0,-3],[-2,-4],[1,-19],[0,-3],[0,-4],[4,-27],[2,-34],[0,-25]],[[6126,4375],[6,2],[2,0],[12,1],[0,27],[1,1],[1,1],[13,4],[2,0],[1,-2],[1,-50],[-5,-14],[1,-2],[15,-7]],[[6176,4336],[-6,-18],[-2,-1],[-2,1],[-31,14],[-14,8],[-1,1],[-1,3],[9,23],[-2,8]],[[9040,5199],[-22,11],[-1,1],[-1,1],[-13,6]],[[9003,5218],[4,8],[5,10],[3,6],[4,10],[6,21],[1,9],[6,26],[4,18],[10,54],[5,18],[3,14],[8,35],[6,29],[1,4],[1,5],[3,12]],[[9073,5497],[2,5],[4,15],[1,3],[2,5],[6,15],[-2,1],[-9,6],[-51,28],[-9,4],[-7,-19]],[[9010,5560],[-9,5],[-39,21],[-9,5]],[[8953,5591],[-8,4],[-53,30]],[[8892,5625],[-6,3]],[[8886,5628],[2,7],[4,13],[32,95],[15,45],[14,42],[14,52]],[[8967,5882],[15,-8],[19,-10],[9,-5],[1,0],[34,-20],[16,-8],[50,-29],[52,-27],[30,-16],[2,-2],[1,3],[6,11],[5,9],[12,24],[2,4]],[[9221,5808],[11,20],[10,19]],[[9242,5847],[7,14],[3,5],[7,13],[7,13],[2,3],[16,31],[2,4],[20,36],[2,4],[1,2],[2,5],[5,10],[4,7],[2,4],[19,34],[6,11],[2,4],[4,9],[2,4],[2,8],[1,4],[2,6]],[[9360,6078],[47,-16],[4,-2]],[[9411,6060],[-1,-6],[-1,-4],[-1,-4],[1,-4],[1,-3],[2,-1],[16,-9],[-27,-111],[3,-1],[-65,-160],[-2,-2],[-36,-56],[-62,-104],[-99,-87],[-1,-6],[1,-2],[2,-2],[5,-2],[9,2],[26,3],[9,0],[3,-1],[6,-7],[5,-9],[4,2],[3,-4],[-22,-18],[-30,-25],[-65,-131],[-37,-75],[-18,-34]],[[8504,5582],[-1,1],[-2,1],[-12,7],[-35,18],[-9,5],[-34,18],[-41,22],[-1,-3],[-9,-23],[-9,-23],[-15,-36],[-6,1],[-9,18],[11,27],[-22,12],[-3,2],[-1,2],[0,2],[0,2],[4,4],[3,4],[3,5],[1,3],[1,8],[0,6],[1,3],[2,5],[1,4],[1,3],[-26,15],[-15,9],[-4,3],[-3,3],[-5,2]],[[8270,5712],[1,4],[6,16],[7,19]],[[8284,5751],[4,9],[8,20],[6,17],[6,16],[4,9],[8,21],[2,5],[1,2],[1,2]],[[8324,5852],[23,-13],[4,-2],[5,-5],[5,-6],[6,-9],[17,-27],[16,-26]],[[8400,5764],[2,-3],[5,-4],[3,-2],[29,-16],[41,-22]],[[8480,5717],[53,-30],[6,-3],[2,-1],[3,-2]],[[8544,5681],[-1,-3],[-1,-3],[-22,-53],[-2,-5],[-14,-35]],[[2883,2571],[-21,-11],[-5,-3]],[[2857,2557],[-4,5],[-24,23],[-12,13],[-5,5],[-4,7],[-6,4],[-21,11]],[[2781,2625],[3,9],[10,8],[18,-8],[5,17],[2,5]],[[2819,2656],[4,2],[44,37]],[[2867,2695],[11,-18],[11,-18],[20,-31],[14,-17]],[[2923,2611],[-9,-12],[-14,-16],[-17,-12]],[[3891,2848],[-153,-124],[-5,-3]],[[3733,2721],[-26,44],[43,35],[-1,5],[3,26],[-19,3],[-15,-6],[-6,-4],[-26,-21],[-3,1],[-10,17],[-10,18],[1,3],[38,30],[5,3],[-11,18],[1,2],[34,11],[3,0],[1,-3],[2,-18],[10,2],[10,-1]],[[3757,2886],[20,0],[0,5],[-2,22],[0,4],[1,3],[37,29],[3,0],[4,0]],[[3820,2949],[2,-20],[-28,-21],[0,-3],[1,-8],[1,-8],[6,1],[29,21],[8,-15],[0,-2],[-1,-2],[-34,-27],[-4,-1],[-6,1],[-2,-23],[6,-1],[4,1],[5,1],[4,3],[19,15],[19,15],[17,14],[25,-42]],[[5490,3360],[-15,-21],[13,-14]],[[5488,3325],[-11,-16],[14,-16],[14,-15],[8,10]],[[5513,3288],[2,-2],[14,-14]],[[5529,3272],[-38,-9],[-4,4],[0,1],[-13,13],[-4,4],[-13,13],[-25,25],[-30,-2]],[[5402,3321],[34,49]],[[5436,3370],[20,-20],[20,23]],[[5476,3373],[14,-13]],[[5741,4799],[-17,-9],[-4,-2],[-24,-13],[-3,-2],[-9,-4],[-3,-1],[-2,2],[-1,-4],[-2,-6],[-2,-3],[-7,-17]],[[5667,4740],[-40,20]],[[5627,4760],[-32,18],[-10,-2],[-13,-4],[-2,-1],[-10,-7],[-8,-7],[-12,-8],[50,-26],[-6,-14],[-6,-16],[-7,-18]],[[5571,4675],[-76,42],[-16,-16],[-16,-15]],[[5463,4686],[-5,12],[-15,10],[-4,1],[-4,2]],[[5435,4711],[0,1],[5,3],[10,11],[3,3],[7,3],[10,-6],[2,0],[2,2],[2,3],[1,2],[0,3],[-5,3],[-2,5],[1,5],[4,5],[3,7],[8,8],[9,1],[6,6],[9,12],[2,2],[3,1],[7,-3],[4,-1],[6,1],[2,2],[17,8],[7,3],[3,1],[6,-1],[2,0],[13,4],[17,6],[8,0],[19,5],[5,0],[16,-1],[10,1],[5,-2],[3,-2],[13,-2],[7,3],[10,-1],[17,5],[8,2],[5,3],[9,3],[2,0]],[[5736,4825],[0,-7],[5,-19]],[[8104,6561],[-34,25],[-16,11],[-40,29]],[[8042,6679],[14,26],[1,2]],[[8057,6707],[39,-28],[16,-11],[-1,-3],[-32,-62],[34,-24],[-5,-10],[-4,-8]],[[5917,3205],[27,37]],[[5944,3242],[14,-14],[9,-10]],[[5967,3218],[-25,-33],[-3,-2],[-1,-1],[-3,-1],[-8,-3],[-8,-7],[-9,-10]],[[8731,1930],[-11,5],[-32,13]],[[8843,2243],[4,-3],[2,-2],[4,-5],[3,-6],[5,-16],[10,-36],[4,-11],[3,-4],[3,-4],[1,-4],[0,-3],[-1,-1],[-2,-3],[-4,-2],[-16,1],[-5,-1],[-5,-7],[-15,-15],[-15,-13],[-8,-12],[-4,-5],[-7,-7],[-2,-2],[-8,-8],[-33,-37],[-17,-18],[0,-17],[-2,-14],[-1,-20],[-6,-38]],[[8731,1930],[-4,-25],[-4,-16],[-5,-14],[-13,-28],[-4,-11],[-8,-18],[-3,-10],[-7,-11],[-2,-5],[-11,-29],[-1,-3],[-9,-18],[-5,-10],[-11,-17],[-5,-9],[-6,-11],[-5,-12],[-5,-11],[-4,-6],[-2,-3]],[[6158,1806],[5,7]],[[6163,1813],[11,-6],[9,-6],[46,-30],[3,0],[7,16],[3,-2],[5,-2],[3,-3],[3,-4],[0,-17],[1,-3],[55,-34],[11,-8],[6,-2],[32,-20],[14,-9],[3,3],[0,78],[-8,7]],[[6367,1771],[8,12],[0,6],[0,22],[0,25],[27,-16],[15,-9]],[[7674,2529],[-28,-35],[-19,-59]],[[7627,2435],[-8,7],[-2,2],[-1,1],[-1,1],[-2,1],[-3,3],[-2,1],[-19,20],[-7,10],[-6,12],[-2,9],[2,14]],[[7576,2516],[1,1],[2,1],[3,0],[2,2],[2,1],[5,5],[6,7],[10,17],[3,4],[13,19]],[[7623,2573],[20,-20],[17,15],[2,1],[14,12],[-8,7],[29,36],[25,29],[2,3],[-26,24]],[[7698,2680],[6,8],[30,40],[4,5]],[[7738,2733],[13,28],[14,25]],[[7765,2786],[15,-11],[2,-1],[22,-20],[19,-17],[2,-2],[7,-6],[1,-1],[3,-3],[1,0],[2,-2],[17,-17]],[[7856,2706],[-14,-16],[-5,-7],[-7,-10],[-10,-17]],[[7698,2680],[-10,-14]],[[7688,2666],[-38,28]],[[7650,2694],[15,22],[17,24]],[[7682,2740],[15,21]],[[7697,2761],[41,-28]],[[6192,2521],[-1,-3],[-8,-17],[-9,-19],[-5,-17]],[[5566,1320],[-9,99],[-8,90],[-18,1],[-1,-4],[-6,-3],[-3,0],[-9,-1]],[[5512,1502],[-1,15],[0,2],[0,5]],[[6426,3903],[-4,-8]],[[6421,3896],[4,13],[22,56],[10,26],[8,24],[2,5],[2,5],[6,16],[3,10],[2,6],[2,5],[1,4],[2,3],[1,3],[1,4],[1,2],[2,6],[0,1],[2,7],[11,47],[2,9]],[[6505,4148],[6,-3],[2,0],[2,-1],[19,-9]],[[6534,4135],[-1,-3],[-8,-24],[-9,-23],[-7,-21],[-8,-23],[-7,-21],[33,-16]],[[6527,4004],[-1,-11],[0,-8],[0,-6],[-1,-7],[-2,-7]],[[6523,3965],[-3,0],[-3,-1],[-2,-1],[-2,-3],[-35,17],[-28,-80],[-20,9],[-3,2],[-1,-5]],[[6153,3930],[-19,-2],[0,3],[-2,1],[-9,1],[-24,11]],[[6099,3944],[3,9],[2,5],[1,4],[3,8],[5,14],[1,5],[0,5],[-2,8],[-4,10],[-2,5],[-3,4],[-4,2],[-16,8]],[[6083,4031],[11,29]],[[6094,4060],[12,-6],[28,-19],[18,-10]],[[6152,4025],[1,-48],[0,-11],[0,-13],[0,-14],[0,-1],[0,-8]],[[7062,7388],[-18,28]],[[7044,7416],[14,15],[6,7],[3,3],[3,4],[5,6],[6,7],[3,4],[6,7],[17,23],[4,5],[6,8],[1,1],[3,5],[7,8]],[[7128,7519],[58,-72],[8,-11],[3,-3]],[[7197,7433],[-8,-8],[-5,-5],[-14,-13],[-27,-23],[-6,-5],[-30,-25],[-1,2],[-30,46],[-14,-14]],[[6260,2371],[33,69],[0,1],[2,7],[1,3]],[[6296,2451],[45,-29]],[[6155,2366],[61,-39],[6,-2],[20,1],[3,-1]],[[6195,2210],[-6,4],[-11,7],[-38,-3],[-5,-1],[-4,-2],[-8,-1],[-29,-2]],[[6489,6147],[-16,25],[-1,-8]],[[6472,6164],[1,10],[2,13],[1,34],[1,9],[12,23],[11,17],[2,4],[8,13],[7,10],[4,11],[7,19],[1,6],[3,13],[3,5],[2,9],[2,9],[3,4],[3,4],[6,4],[5,10],[3,6],[3,3],[5,3],[6,11],[5,6],[14,21],[10,10],[4,7],[2,5],[3,7],[2,0],[0,15],[4,10],[1,3]],[[6618,6498],[1,-1],[3,-3],[3,-3],[3,-3],[3,-3],[2,-4],[2,-1]],[[6635,6480],[-2,-3],[-7,-20],[-8,-17],[-13,-17],[-13,-16]],[[6592,6407],[-11,-14],[-13,-14],[-4,-5],[-1,-3],[-2,-3],[-1,-11]],[[6560,6357],[-3,-26],[-3,-10],[-5,-14],[-9,-21]],[[6540,6286],[-14,-20],[-8,-14],[-7,-14],[-3,-5],[-2,-8],[-3,-10],[-2,-7]],[[6501,6208],[-6,-28],[-6,-33]],[[7493,7356],[12,-20],[49,-78],[50,-79],[4,-3],[2,-5],[30,-47],[3,-3],[1,-1],[1,-2]],[[7471,6984],[-2,2],[-5,11],[-45,101],[-10,16],[-14,22]],[[7395,7136],[-23,37],[-32,51]],[[7340,7224],[-2,3],[-71,102]],[[7267,7329],[-70,104]],[[7197,7433],[4,4],[22,26]],[[7223,7463],[28,31],[29,34],[17,20],[2,2],[15,17]],[[7314,7567],[13,-21],[50,-77]],[[7377,7469],[50,-78],[36,-56],[2,-3],[15,13],[13,11]],[[7912,5473],[-10,-19]],[[7233,6187],[-39,28],[-5,4],[-22,17],[-5,2],[-26,17],[-33,42],[-30,9]],[[7073,6306],[15,29],[24,46],[6,12]],[[7118,6393],[16,29],[13,25],[12,24]],[[7276,6266],[-7,-13]],[[5894,3747],[-3,3],[-2,12],[-4,5],[-8,9],[-29,29]],[[5848,3805],[-54,58]],[[5794,3863],[-56,59]],[[5738,3922],[12,14],[12,17],[14,17],[14,17]],[[5790,3987],[26,-28],[2,-2],[-6,-8],[-6,-7],[-2,-1],[28,-30],[23,-24]],[[5855,3887],[-13,-17],[15,-17],[17,-17],[9,-9],[3,-4],[36,-37],[3,-3]],[[5925,3783],[-11,-14],[-10,-11],[-10,-11]],[[7382,2444],[-13,-18],[-12,-17]],[[5710,3061],[-3,7],[22,5],[13,3],[13,1],[24,2],[23,1],[60,4],[15,0],[-3,4],[-3,4],[0,9],[0,2],[2,10],[37,48]],[[5967,3218],[16,-16],[50,-52],[2,-2],[3,-3]],[[6038,3145],[-7,-8],[-10,-10],[-10,-10],[-8,-6],[-9,-7],[-8,-5],[-10,-5],[-8,-3],[-9,-4],[-10,-3],[-5,-2],[-6,-1],[-10,-2],[-11,-1],[-16,-1],[-1,0],[-1,0],[-7,0],[-18,-1],[-20,-1],[-22,-1],[-13,0],[-12,-1],[-21,-1],[-17,-1],[-14,-2],[-7,0],[-4,-1],[-5,-1],[-6,-1],[-7,-1],[-5,-1],[-5,-2],[-6,-1]],[[5641,3296],[17,-17],[-14,-18]],[[5644,3261],[-5,-7],[-5,-8],[-3,-10],[-1,-9],[1,-9],[3,-7]],[[5634,3211],[-13,1],[-12,-18],[9,-12],[-17,-9]],[[5601,3173],[1,4],[-5,11],[-3,3],[11,15],[3,4],[3,6],[1,4],[0,7],[-1,7],[0,9]],[[5611,3243],[7,16],[9,12],[1,3],[-1,3],[-19,21],[-8,2],[-14,4],[-2,1],[-5,4],[-10,11]],[[5569,3320],[22,29]],[[5591,3349],[35,-37],[15,-16]],[[5710,3061],[-6,-1],[-5,-2],[-6,-2],[-6,-2],[-4,-1],[-4,-2],[-4,-1],[-7,-3],[-5,-2],[-2,-1],[-4,-2],[-11,-5],[-6,-3],[-4,-2],[-10,-6],[-11,-5],[-10,-5],[-2,-2],[-3,-1],[-2,2],[-3,4],[-2,2],[-10,10],[-14,15],[-13,15],[-6,10],[-2,6],[-3,7],[-3,9],[-3,13],[-2,12],[-6,25]],[[5531,3143],[42,16],[5,2],[20,8],[1,1],[1,1],[1,2]],[[5634,3211],[-8,-10],[-3,-4],[0,-2],[0,-2],[1,-3],[47,-48],[1,-1],[2,0],[2,0],[8,12],[1,3],[-1,13],[6,1],[6,2],[5,3],[5,5],[21,28]],[[5727,3208],[15,-15],[15,-16]],[[5757,3177],[17,-18]],[[5774,3159],[15,-16],[23,29],[14,-16],[-23,-31],[12,-13],[5,0],[36,49]],[[7239,1392],[7,-5],[27,-20]],[[9682,8897],[-40,12],[-2,-14],[-34,10],[-6,1]],[[9600,8906],[5,8],[1,9],[9,48],[1,5],[5,17],[0,8],[5,23],[9,46],[1,5],[10,96],[0,8],[-2,0],[-2,0],[-1,1],[3,10],[3,16],[1,61],[2,43]],[[9650,9310],[2,-1],[40,-11],[5,5]],[[9600,8906],[4,24],[4,21],[4,21],[5,20],[2,10],[-1,11],[-2,22],[-43,11]],[[9573,9046],[-65,18],[-2,-3]],[[9506,9061],[-7,-4],[-15,-5],[-2,-10],[-6,-8],[-12,-63],[20,-6],[2,-2]],[[9486,8963],[-5,-23]],[[9481,8940],[-36,9],[-6,2]],[[9439,8951],[23,111]],[[9473,9112],[6,-2],[18,-5],[-1,-7],[0,-3],[1,-3],[3,2],[20,7],[22,8],[20,7],[13,6],[10,6],[6,5],[7,6],[5,6],[2,7],[-39,11],[-18,5],[-18,5],[-18,5],[-19,1],[-6,1]],[[9547,8921],[5,24],[4,21],[4,21],[4,20],[5,19],[4,20]],[[9600,8906],[-20,6],[-5,1],[-28,8]],[[9547,8921],[-66,19]],[[9486,8963],[5,21],[4,21],[4,21],[4,19],[2,9],[1,7]],[[9434,8928],[5,23]],[[9547,8921],[-5,-23],[-5,-24],[-4,-22]],[[9533,8852],[-66,18],[-4,-21],[-27,7],[-13,4]],[[9302,8735],[5,25],[5,22],[8,53],[6,25],[5,24]],[[9423,8860],[0,-4],[-2,-17],[-1,-6],[-5,-24]],[[9415,8809],[-3,-16],[-12,-59],[-4,-11],[-4,-11],[0,-1]],[[9392,8711],[-5,1],[-19,5],[-30,9],[-15,3],[-21,6]],[[9432,8700],[-38,10],[-2,1]],[[9415,8809],[38,-10]],[[9453,8799],[-6,-29],[-1,-5],[-11,3],[-3,-14],[11,-3],[0,-3],[-5,-24],[-3,-17],[-3,-7]],[[9514,8759],[-10,-52]],[[9504,8707],[-5,-25]],[[9499,8682],[-67,18]],[[9453,8799],[4,24],[66,-19]],[[9523,8804],[-5,-24],[-4,-21]],[[9533,8852],[-4,-22]],[[9529,8830],[-1,-3],[-3,-15],[-2,-8]],[[9529,8830],[76,-21],[2,-1]],[[9607,8808],[0,-3],[3,-24]],[[9610,8781],[2,-26],[4,-45],[-25,7],[4,17],[-2,3],[-56,16],[-23,6]],[[9600,8906],[0,-24],[2,-25],[3,-25],[2,-24]],[[9644,8668],[-3,24],[-5,32],[0,7],[-3,20],[0,11],[0,13],[-23,6]],[[9695,8890],[-2,-4],[0,-6],[0,-16],[1,-5],[-2,-10],[0,-20],[2,-19],[-3,-6],[0,-9],[2,-10],[1,-7],[0,-1],[-2,-10],[-4,-10],[1,-25],[2,-7],[-1,-11],[4,-10],[0,-13],[-1,-9],[2,-7],[2,-10],[-1,-7],[2,-3]],[[9644,8668],[-19,5],[-5,2],[3,-27],[-59,16]],[[9564,8664],[5,25],[-42,11],[-23,7]],[[9490,8638],[4,20],[5,24]],[[9564,8664],[-5,-24],[-3,-19]],[[9556,8621],[-49,13],[-17,4]],[[9486,8616],[4,22]],[[9556,8621],[16,-5],[4,18],[3,1],[33,-9],[2,-1],[0,-2],[2,-19],[2,-18],[-1,-2],[-2,-1],[-64,17],[-65,16]],[[8996,3934],[12,-63],[1,-4],[53,-282],[38,-209],[4,1],[24,-132],[23,-100],[-27,-16],[0,-27],[2,-1],[-13,4],[-47,24],[-17,11],[-21,18],[-30,31],[-13,17],[-10,15],[-8,13],[-13,22],[-8,16],[-3,12],[-9,22],[-11,45],[-3,22],[-3,24],[-1,22],[1,23],[0,18],[4,20],[3,22],[1,4],[0,3],[0,1],[1,5],[5,9],[4,13],[6,19],[11,40],[6,44],[0,34],[0,6],[-3,66],[-8,103],[-7,97],[0,8],[0,5],[0,4],[3,6],[4,1],[10,-4],[4,0],[5,4],[12,7],[1,1],[-19,106],[1,9],[1,1],[5,-1],[25,-127],[5,-3],[2,-9],[1,-7],[-1,-1],[-3,-3],[0,-9]],[[9038,3405],[-1,6],[-11,1],[-11,1],[-1,-3],[-27,3],[-3,1],[-3,0],[0,32],[1,3],[0,3],[1,10],[2,7],[2,18],[2,7],[1,5],[2,3],[0,6],[2,4],[0,4],[0,6],[0,1],[10,33],[6,32],[-11,33],[-21,2],[-4,-31],[-4,-19],[-10,-37],[-1,-5],[-6,-29],[-2,-10],[-3,-21],[-1,-15],[-2,-26],[-1,-5],[0,-21],[0,-2],[0,-17],[12,0],[17,-1],[0,-31],[0,-2],[5,0],[0,-30],[-1,-1],[-3,-9],[-7,0],[-3,-1],[-2,-3],[0,-26],[1,-6],[2,-3],[2,-2],[2,0],[1,2],[0,6],[2,4],[2,3],[11,0],[1,0],[2,4],[2,13],[1,2],[2,1],[3,-2],[2,-4],[1,-4],[2,-8],[3,-22],[-2,-1],[0,-7],[-3,-3],[-5,-1],[-6,3],[-3,-1],[-2,-3],[3,-4],[1,-1],[1,-2],[5,-7],[3,-5],[2,-4],[0,8],[-1,8],[1,4],[3,4],[3,0],[3,-2],[3,-2],[0,-3],[2,-2],[-2,-7],[-2,-9],[3,-7],[3,-6],[4,-1],[2,-6],[0,-6],[4,-9],[2,-4],[4,-2],[1,-4],[2,-1],[4,-1],[6,1],[1,0],[5,6],[1,5],[-2,21],[1,9],[-2,7],[-5,12],[0,8],[4,10],[0,9],[-2,5],[0,9],[2,11],[0,11],[-4,20],[-3,37],[0,37],[-1,6]],[[8980,3810],[102,-565],[12,-65],[27,7],[-10,58],[-105,572],[-26,-7]],[[8960,3872],[1,-1],[1,1],[3,2],[3,4],[10,0],[5,-4],[3,0],[-1,15],[-1,3],[2,3],[-2,10],[-6,8],[-4,3],[-6,0],[-1,-1],[-9,-12],[1,-10],[1,-3],[-1,-3],[1,-15]],[[8953,3313],[0,1],[-2,0],[-1,3],[-4,4],[-4,0],[-1,-2],[0,-6],[1,-3],[3,-3],[3,0],[4,3],[1,1],[0,2]],[[8794,4165],[1,-13],[4,-1],[5,1],[3,-1],[8,-2],[8,-2],[9,-2],[4,-1],[3,-4],[3,-3],[1,-5],[1,-16],[1,-6],[3,0],[6,-1],[5,-3],[4,-3],[5,-3],[3,-3],[3,-3],[2,-1],[3,-3],[1,1],[0,3],[3,2],[1,0],[1,-4],[7,-139],[2,-13],[4,-44],[2,-14],[11,-37],[1,-19],[12,-90],[-1,-15],[-2,-6],[-3,-10],[0,-6],[-4,-8],[-1,-4],[-1,-12],[-3,-29],[-6,-40],[-14,-54],[-5,-21],[-3,-13],[-9,-37],[-2,-6],[-1,-5],[-1,-3],[-8,-9],[-3,-2],[-2,0],[-7,-1],[-6,0],[-4,1],[-5,2],[-7,8],[-14,25],[-2,6],[-26,51],[-6,25],[-19,90],[-9,37],[1,57],[6,62],[1,36],[0,3],[-1,2],[1,7],[-4,27],[-3,8],[-5,18],[-2,16],[-3,15],[0,1],[-2,20],[-1,3],[-4,9],[-1,11],[1,22],[4,17],[5,39],[6,20],[7,21],[19,47],[34,73],[3,4],[3,2],[6,12],[0,6],[5,8],[1,5],[5,7],[5,6],[3,3],[20,0],[8,-5],[3,-5],[3,-7],[2,-13],[3,-49],[-3,-6],[-6,-7],[-57,7],[-17,-31],[-2,-6]],[[8983,3495],[-1,-13],[-4,-21],[-1,-8],[0,-3],[1,-3],[-1,-14],[-2,-17],[-18,1],[-8,0],[0,12],[1,12],[2,15],[4,31],[10,-2],[1,9],[-9,2],[0,5],[1,5],[2,5],[-1,6],[3,3],[1,4],[0,6],[-1,3],[11,36],[7,30],[2,17],[15,-4],[8,-20],[-3,-14],[-13,-54],[-5,-10],[2,-5],[1,-3],[-2,-2],[-2,-6],[-1,-3]],[[8988,3410],[-1,-32],[17,-1],[-3,-27],[-1,-7],[-1,-2],[-5,-4],[-12,-1],[0,20],[-5,0],[1,38],[-12,1],[-1,-6],[-8,1],[-9,1],[0,11],[0,10],[9,0],[27,-1],[4,-1]],[[8879,4108],[-1,1],[-1,2],[-1,25],[-2,37],[2,8],[1,3],[3,-1],[3,-4],[1,-5],[-1,-16],[-2,-6],[2,-39],[-4,-5]],[[9137,3084],[-6,17],[2,-3],[5,-13]],[[8620,3881],[-23,-113],[1,-1],[-3,-12]],[[8595,3755],[-15,5],[-6,2]],[[8574,3762],[-40,11],[0,4],[0,1],[2,7],[2,2],[-8,1],[-2,0],[-6,-2],[-5,-3],[-7,-6],[-6,-6],[-2,-1],[-3,-4],[-3,-5],[-5,-8],[-3,-11]],[[8488,3742],[-5,3],[-1,1],[-4,3],[-4,4],[-22,16],[-25,19]],[[8427,3788],[-4,3],[-43,32]],[[8380,3823],[8,15],[8,15]],[[8396,3853],[46,-35],[11,13],[9,14]],[[8462,3845],[13,22],[10,20],[6,10]],[[8491,3897],[7,12],[12,22],[14,24]],[[8524,3955],[2,-3],[12,-15],[8,-5],[15,-9],[3,-1],[3,-2],[7,-5],[5,-1],[23,-18],[9,-4],[9,-11]],[[8396,3853],[8,15],[8,15]],[[8412,3883],[10,-7],[14,-11],[26,-20]],[[6830,4348],[17,49],[3,4],[12,35]],[[6862,4436],[29,85],[2,2],[3,10],[2,3]],[[6898,4536],[43,-21],[8,-4],[9,-4]],[[6958,4507],[62,-31]],[[7020,4476],[44,-20],[13,-7]],[[7077,4449],[-1,-3],[-4,-13],[-2,-5],[-36,-102],[-10,-27],[-1,-5]],[[7023,4294],[-61,18]],[[8089,3915],[6,13],[-66,50]],[[8029,3978],[7,12]],[[8036,3990],[43,-32],[23,-18]],[[8102,3940],[9,-7],[29,-22]],[[8140,3911],[-7,-12],[-6,-11],[-33,25],[-5,2]],[[8152,3903],[-14,-25]],[[8138,3878],[-2,-2],[-4,-4],[-17,-23]],[[8115,3849],[-29,22]],[[8086,3871],[-16,12],[-66,49]],[[8004,3932],[6,11],[4,8]],[[8014,3951],[59,-44],[3,-3],[5,-3],[8,14]],[[8140,3911],[12,-8]],[[8014,3951],[4,7],[5,8],[6,12]],[[8172,3805],[-10,8],[-14,11],[-3,2],[-10,8],[-6,5]],[[8129,3839],[-9,7],[-5,3]],[[8138,3878],[5,-1],[36,-27],[5,-3]],[[8184,3847],[-1,-4],[-1,-3],[-1,-4],[-9,-31]],[[8152,3903],[10,-8],[18,-14],[11,-8]],[[8191,3873],[-7,-26]],[[8094,3750],[-8,-15]],[[8086,3735],[-50,39]],[[8036,3774],[3,6],[4,9],[8,15],[3,7],[5,9]],[[8059,3820],[41,-32],[11,-8]],[[8111,3780],[-6,-10],[-3,-5],[-8,-15]],[[8071,3704],[-1,2],[-33,24],[-7,5],[-10,8]],[[8020,3743],[1,3],[7,13],[8,15]],[[8086,3735],[8,-6]],[[8094,3729],[-8,-14],[51,-38]],[[8142,3693],[-4,3],[-40,30],[-4,3]],[[8094,3750],[12,-11],[14,-11],[22,-19],[4,-2]],[[8111,3780],[6,-4],[10,-7],[19,-15],[10,-8]],[[9697,9303],[3,20],[1,5],[2,8],[1,6],[5,32]],[[9709,9374],[5,33],[2,7],[6,40],[1,7]],[[9723,9461],[4,24]],[[9727,9485],[41,-10],[20,21],[17,23],[11,15],[15,25]],[[9831,9559],[25,42],[7,11],[2,12]],[[9865,9624],[4,20],[-8,13],[-1,5],[2,12]],[[9862,9674],[4,22],[5,23],[7,38],[-14,3],[2,15],[14,-2],[4,23]],[[9884,9796],[1,6],[1,7],[8,33],[4,14],[12,48],[3,5],[5,12],[-15,-5],[-17,-5],[-25,-8]],[[9861,9903],[-8,-2]],[[9850,9931],[2,2],[2,-1],[2,-1],[2,-2],[10,0],[16,4],[8,3],[20,11],[3,1],[7,5],[6,3],[1,0],[7,-1],[6,-3],[6,2],[6,10],[6,5],[17,3],[4,4],[3,-1],[2,0],[4,4],[5,0],[4,-2],[0,-5],[-4,-7],[-2,-5],[-6,-14],[-11,-14],[-3,-6],[-4,-7],[-3,-1],[-6,-20],[-6,-3],[-3,-3],[-2,-12],[0,-10],[-3,-12],[-4,-5],[0,-13],[-1,-7],[-3,-4],[0,-2],[0,-1],[-6,-7],[-1,-8],[-3,-4],[-3,-8],[0,-3],[0,-5],[0,-11],[-3,-3],[-4,-9],[0,-11],[-2,-9],[-5,-22],[-2,-22],[-2,-8],[-6,-14],[-4,-19],[-5,-9],[-10,-27],[-4,-7],[-6,-4],[-2,-2],[-6,-10],[-5,-7],[-1,-6],[1,-6],[-8,-5],[-5,-10],[-6,-9],[-6,-6],[-7,-13],[-4,-5],[-5,-13],[-7,-6],[-2,-9],[4,-6],[1,-1],[-2,-3],[-5,-4],[0,-6],[-4,-2],[-9,1],[-6,0],[-10,-16],[-2,-11],[-6,-10],[-2,-4],[-1,-3],[-4,-6],[-6,-4],[-1,0],[-1,0],[-7,-14],[0,-7],[-1,-7],[0,-5],[-1,-3],[-3,-5],[-3,-12],[-1,-3],[-1,-10],[0,-4],[-1,-6],[-7,-13],[-1,-11],[0,-14],[-1,-6],[-1,-22]],[[9862,9674],[-28,6],[-13,4],[-9,2],[-9,8],[-8,8],[-19,20]],[[9776,9722],[10,6],[2,2],[5,6],[30,45],[15,23]],[[9838,9804],[46,-8]],[[9838,9804],[11,16],[5,10],[5,14],[4,15],[1,11],[0,10],[-3,23]],[[9865,9624],[-83,23],[-5,-25]],[[9777,9622],[-26,7],[4,26],[3,13],[1,5],[0,5],[3,16],[4,10],[4,8],[6,10]],[[9831,9559],[-22,6],[-25,6]],[[9784,9571],[4,24],[5,23],[-16,4]],[[9727,9485],[5,26]],[[9732,9511],[4,26],[4,24],[40,-10],[4,20]],[[9732,9511],[-4,3],[-60,15]],[[9673,9553],[0,4],[9,27],[9,23],[12,24],[4,7],[12,18],[17,21],[14,18],[13,18],[19,31],[7,15],[11,28],[9,36]],[[9723,9461],[-43,12],[-3,0],[-1,-3],[-3,-17],[-1,-17],[0,-8],[1,-6],[1,-10],[3,-13],[8,-24],[9,2],[15,-3]],[[9233,6314],[-7,-25],[-22,11],[-7,-23]],[[9197,6277],[-10,5],[-31,16],[-10,5]],[[9146,6303],[7,24],[8,23]],[[9274,6238],[-9,5],[-58,29],[-10,5]],[[9240,6335],[17,-9],[18,-8],[17,-9],[2,-1]],[[9294,6308],[-5,-18],[-5,-20],[-10,-32]],[[9293,6387],[21,-89],[-20,10]],[[9365,6386],[2,-11],[0,-11],[3,-6],[1,-12],[4,-11],[2,-19],[1,0],[6,-21],[2,-3],[9,2],[3,1],[4,0],[4,-3],[1,-1],[-1,5],[4,1],[27,-135]],[[9437,6162],[-43,20],[-3,2],[-5,1],[-4,2],[-35,17],[-8,1]],[[9339,6205],[-8,4],[-36,18],[-5,2],[-6,3],[-10,6]],[[9298,6153],[-45,23]],[[9253,6176],[3,7],[4,11],[8,21],[6,23]],[[9339,6205],[8,-30],[8,-30],[3,-12],[2,-12],[-26,13],[-36,19]],[[9253,6176],[-8,-15],[-72,36]],[[9173,6197],[5,16],[2,8],[4,12],[6,22],[7,22]],[[9298,6153],[-6,-16],[-4,-10],[-4,-10],[18,-10],[19,-4],[3,7],[4,9],[33,-18],[1,-2],[-1,-8],[-1,-11],[0,-2]],[[9360,6078],[-3,1],[-14,5],[-8,3],[-9,3],[-10,4],[-10,3],[-7,3],[-31,11],[-9,3],[-6,2],[-4,2],[-6,2],[-9,5],[-7,3],[-5,2],[-5,3],[-4,2],[-2,1],[-2,1],[-5,3],[-3,2],[-2,1],[-3,2],[-3,1],[-20,11],[-5,2],[11,-11],[-8,5],[-6,3],[-2,1],[-3,2],[-2,1],[-3,1],[-8,3],[-4,1],[-5,1],[-5,2],[-7,1],[-5,1],[-6,1],[-11,1],[-6,0],[-2,1],[-3,0],[-3,0],[-4,1],[-4,0],[-3,0],[-4,1],[-4,1],[-4,0],[-3,1],[-4,1],[-3,1],[-4,2],[-3,1],[-3,1],[-1,1]],[[9046,6184],[2,7]],[[9048,6191],[7,23],[2,7],[1,4],[3,10],[9,26],[14,48]],[[9084,6309],[5,-2],[-6,-23],[-6,-20],[-5,-16],[10,-6],[41,-20]],[[9123,6222],[-2,-11],[-3,-8],[14,-7],[12,-6],[24,-12],[5,19]],[[9123,6222],[2,17],[3,9],[4,11],[7,22],[7,22]],[[9084,6309],[7,23]],[[9091,6332],[5,-3],[10,-5],[31,-16],[9,-5]],[[9091,6332],[21,70],[20,65]],[[9084,6309],[-6,3],[-3,2],[-14,7],[-29,15]],[[9032,6336],[2,2],[7,22],[4,16]],[[9045,6376],[11,-6],[9,-4],[5,15],[8,27],[4,11],[4,12],[-13,7],[-7,4]],[[9066,6442],[2,5],[0,2],[1,1],[4,12],[2,4]],[[9075,6466],[7,-4],[28,-14],[10,-5],[7,24],[7,26]],[[9045,6376],[13,43]],[[9058,6419],[1,3],[3,9],[3,7],[1,4]],[[9668,8499],[-23,7],[-9,2]],[[9636,8508],[-96,24],[-1,0],[-1,-2],[-8,-38]],[[9530,8492],[-8,-40]],[[9522,8452],[-66,16]],[[9456,8468],[4,22],[12,59]],[[9472,8549],[14,67]],[[9636,8508],[2,-23],[-20,5],[4,-37],[-1,-4],[-4,0],[-70,18],[-2,1],[0,2],[3,17],[-18,5]],[[9644,8420],[-56,15],[-66,17]],[[9469,8308],[-16,25],[-12,20],[-4,16],[1,13]],[[9438,8382],[5,21],[5,23],[4,21],[4,21]],[[9648,8374],[-20,5],[-44,11],[-55,15],[-3,-1],[-2,-3],[-3,-18],[-5,-21]],[[9516,8362],[-11,2],[-3,-21],[-7,-34]],[[9495,8309],[-13,4],[-4,0],[-4,-2],[-5,-3]],[[9653,8327],[-77,19],[-60,16]],[[9631,8287],[-76,19],[-2,-12],[-19,5],[-20,5],[-19,5]],[[9475,8269],[2,12],[0,8],[-2,8],[-6,11]],[[7032,4840],[-4,3],[-4,3],[-21,15],[-21,16]],[[6982,4877],[-41,30],[-3,3],[-1,1],[-3,-2],[-7,-7],[-12,-11],[-7,-5],[-1,-3],[-8,-7]],[[6899,4876],[-8,-6],[-7,-7],[-7,-5],[-10,-7]],[[6867,4851],[-30,14],[-10,5],[-3,1],[0,1]],[[6824,4872],[5,4],[5,4],[4,3],[7,4],[4,3],[4,2],[9,3],[4,2],[4,2],[6,2],[6,1],[8,2],[10,3],[7,2],[7,3],[7,2],[6,3],[3,1],[2,1],[1,1],[3,1],[3,2],[4,3],[9,6],[3,2],[7,5],[10,9],[2,2],[11,10],[6,6]],[[6991,4966],[2,-4],[89,-65]],[[7082,4897],[-15,-19],[-18,-19],[-2,-3],[-5,-5],[-8,-10],[-2,-1]],[[8792,5843],[-9,5],[-62,34],[-8,4]],[[8713,5886],[3,10],[5,12]],[[8807,5880],[-15,-37]],[[8792,5843],[-8,-21]],[[8784,5822],[-9,5],[-9,5]],[[8766,5832],[-27,15],[-9,4],[-4,-9]],[[8726,5842],[-8,5],[-9,4],[-9,5]],[[8700,5856],[8,20],[5,10]],[[8709,5799],[9,22]],[[8718,5821],[4,10],[4,11]],[[8766,5832],[-4,-10],[-4,-10],[-9,5],[-9,5],[-13,-33]],[[8784,5822],[-21,-53]],[[8640,5863],[8,-5],[61,-33],[9,-4]],[[8648,5884],[9,-4],[35,-19],[8,-5]],[[8627,5896],[7,19]],[[8612,5852],[-3,2],[-11,6],[-31,17],[-14,8],[10,24],[-4,2],[1,3]],[[8560,5914],[6,15],[-8,5]],[[8597,5812],[-3,1],[-43,24],[-9,5],[-9,5]],[[8533,5847],[7,17],[-18,11],[20,49],[18,-10]],[[8533,5847],[-9,5],[-31,17]],[[8493,5869],[-21,12],[-19,10]],[[8496,5756],[-40,22]],[[8456,5778],[4,10],[4,11],[13,31],[8,20]],[[8485,5850],[8,19]],[[8533,5847],[-8,-20],[-8,-19],[-8,-21],[-5,-11]],[[8504,5776],[-4,-10],[-4,-10]],[[8485,5850],[-39,21],[-9,-19],[-40,21]],[[8397,5873],[8,20],[8,20]],[[8456,5778],[-41,23],[-8,-20],[-7,-17]],[[8324,5852],[11,26],[1,5]],[[8336,5883],[5,-2],[16,-9],[16,-9],[16,-9],[8,19]],[[8336,5883],[8,19]],[[8344,5902],[8,20],[8,20]],[[8344,5902],[-3,2],[-34,19],[-13,8],[8,19]],[[8302,5950],[8,20],[14,-8],[4,8],[2,2],[4,9]],[[8334,5981],[17,-9],[4,9],[2,2],[4,8],[14,-8],[2,-1]],[[8324,5852],[-3,1],[-31,17],[-73,41]],[[8217,5911],[7,18],[24,67],[18,48]],[[8266,6044],[17,-10],[-16,-40],[-8,-19],[43,-25]],[[8266,6044],[7,21]],[[8273,6065],[11,-7],[51,-28]],[[8335,6030],[-8,-20],[14,-8],[-4,-8],[1,-4],[-4,-9]],[[8335,6030],[9,22],[28,-16]],[[8273,6065],[3,7],[5,13]],[[8281,6085],[6,20]],[[8287,6105],[20,-12],[26,-14],[15,-8]],[[8287,6105],[5,14],[7,20],[13,36],[1,3]],[[8281,6085],[-3,2]],[[8278,6087],[-3,1],[-7,4],[-9,5],[-12,6],[0,10]],[[8247,6113],[7,20],[15,42],[15,-7],[7,18],[1,3]],[[8292,6189],[3,-1],[16,-9],[2,-1]],[[7547,5461],[-53,39],[-3,2],[-2,1],[-3,2],[-2,2],[-2,2]],[[7482,5509],[9,16],[9,17],[11,16],[3,3]],[[7514,5561],[3,7],[5,10],[2,3],[3,-2],[2,-2],[3,-2],[23,-16],[9,-9],[2,-3],[4,-3],[15,-11]],[[7585,5533],[-1,-3],[-10,-18],[60,-44]],[[7585,5533],[9,16],[8,16],[4,7]],[[7606,5572],[60,-44]],[[7606,5572],[5,8]],[[7611,5580],[9,-6],[19,36],[6,4],[6,-1],[8,-6],[15,-11],[21,-14],[10,18]],[[7705,5600],[50,5],[8,-4],[7,-5]],[[7611,5580],[-6,5],[12,22],[-2,9],[6,4],[10,11],[16,4],[10,0],[48,-35]],[[7729,5708],[1,-10],[-1,-5],[-18,-33],[23,-18],[12,13],[12,6],[12,4],[12,-3]],[[7782,5662],[10,-3],[6,-5]],[[7606,5572],[-53,39],[-4,3]],[[7637,5775],[3,-2],[7,-5],[36,-26],[3,-2],[2,-2],[2,-1],[8,-4],[3,-1],[3,0],[8,-1],[10,-1],[3,1],[2,0],[0,-3],[0,-3],[2,-17]],[[7729,5708],[13,1],[4,0],[42,-30],[-5,-10],[-1,-7]],[[7777,5747],[-2,-4],[-3,-5],[0,-2],[1,-1],[1,-1],[47,-35]],[[7660,5817],[3,-2],[3,-2],[49,-36],[39,-29],[2,-1],[1,-2],[1,-3],[2,1],[5,2],[3,1],[4,0],[5,1]],[[7679,5853],[3,-1],[2,-2],[27,-19]],[[7711,5831],[23,-18],[58,-41],[-10,-18],[-5,-7]],[[7711,5831],[1,4],[8,13],[9,16],[2,1],[3,-1],[30,-22],[7,5]],[[7771,5847],[6,-3],[4,-7],[16,-13],[11,8],[29,-21],[7,20],[4,11],[5,8]],[[7853,5850],[17,-13]],[[7771,5847],[1,17]],[[7772,5864],[7,0],[11,5],[5,6],[6,13]],[[7801,5888],[12,-9],[27,-20],[13,-9]],[[7801,5888],[-17,13],[-2,1],[10,18]],[[7792,5920],[9,18],[3,5],[2,4],[0,2],[0,3],[-1,4]],[[7772,5864],[-8,2],[-5,4],[-47,33],[5,9],[7,11],[7,8],[2,2],[3,2],[7,4],[24,7],[-1,-8],[26,-18]],[[7679,5853],[13,24],[16,29],[0,1],[19,34],[17,31],[1,3]],[[7636,5886],[22,41],[26,47],[-15,11]],[[7669,5985],[16,32],[2,3]],[[7687,6020],[10,-8],[1,-1],[29,-25],[4,-3],[3,-2],[5,-2],[3,-2],[3,-2]],[[7621,5897],[10,22],[-11,8],[-8,0]],[[7612,5927],[1,22],[3,10],[4,11],[3,9],[0,13]],[[7623,5992],[8,2],[7,-1]],[[7638,5993],[25,-18],[6,10]],[[7562,5946],[11,19],[9,16],[-1,5],[-14,10],[11,19],[9,19]],[[7587,6034],[21,-16],[9,-9],[1,-3],[5,-14]],[[7612,5927],[-17,0],[-7,1],[-4,1],[-22,17]],[[7587,6034],[-15,10]],[[7572,6044],[12,21],[13,13]],[[7597,6078],[9,-14],[1,-5],[-6,-5],[1,-5],[13,-10],[3,1],[3,4],[2,1],[13,-12],[14,-13],[1,-5],[-13,-22]],[[7597,6078],[14,13],[2,3]],[[7613,6094],[2,-3],[9,-12],[9,-10],[10,-11],[13,-13],[15,-13],[16,-12]],[[7613,6094],[-2,4],[-11,16],[-5,9],[-10,17],[-2,4]],[[6559,2837],[-53,39]],[[6506,2876],[11,22],[14,24],[10,18],[6,11]],[[6489,2725],[-19,5],[-10,7],[-6,9],[-2,10],[0,6],[3,7],[19,35],[12,22],[-11,8]],[[6475,2834],[13,20],[3,0],[0,5],[11,20],[4,-3]],[[6559,2837],[-12,-23],[-13,-23],[-15,-22],[-11,-18],[-15,-15],[-4,-11]],[[6489,2725],[-2,-8],[-2,-22]],[[6485,2695],[-18,-3],[-9,-6],[-10,-9],[-10,-16],[-4,-18],[0,-14]],[[6434,2629],[-9,0],[-11,-1],[1,-75],[4,-4],[5,-3],[58,-43],[4,0],[10,19]],[[6496,2522],[11,-8],[2,-1]],[[6492,2483],[-1,1],[-68,50],[-4,0],[-13,16],[-5,4]],[[6399,2727],[12,-4],[14,-9],[19,37],[-8,6],[39,77]],[[9334,6927],[-22,6]],[[9492,7435],[10,15],[12,18],[2,3],[10,16],[2,3],[20,30],[31,-10],[2,11],[5,13],[7,30],[-13,4],[14,20],[14,22]],[[9641,7660],[15,-3],[17,-6],[10,-3]],[[9683,7648],[-3,-6],[-3,-13],[1,-2],[0,-2],[-4,-4],[-1,-3],[1,-2],[11,-10],[21,35],[5,-2],[-36,-57],[-5,-7],[-3,3],[1,1],[-1,3],[-2,0],[-13,-10],[-5,-4],[-4,-5],[-12,-10],[-5,-2],[-5,-3],[0,-3],[-2,-7],[0,-2],[8,-4],[0,-1],[-4,-2],[-4,1],[-2,3],[-2,0],[-1,-1],[-3,-4],[-2,-2],[-1,-2],[1,-6],[2,-3],[8,-4],[1,-2],[1,-1],[-1,-1],[-2,0],[-2,0],[-5,4],[-2,0],[-1,-1],[-3,-3],[-1,-4],[0,-15],[-3,-3],[-5,-14],[2,-3],[7,-1],[4,4],[1,9],[3,-1],[0,-3],[2,-1],[2,-5],[5,9],[3,-2],[-36,-56],[-2,2],[-1,0],[-16,-9],[0,-3],[-1,-1],[-7,2],[0,1],[-1,0],[-31,-27],[-4,-9],[1,-8],[46,16],[1,-5],[-50,-17],[-2,-5],[-1,-6],[-2,-1],[-3,-2],[-10,-10],[-4,-18],[0,-1],[9,-5],[5,-7],[4,-4],[2,-5],[3,0],[14,22],[4,-3],[-19,-28],[-6,-9],[-30,-46],[-4,-10],[-34,-81],[-11,-26],[-3,-9],[-22,-92],[-22,-94],[-4,1],[1,2],[-4,0],[-3,-1],[0,-4],[-6,-1],[-2,0],[-1,-3],[0,-1]],[[9774,7870],[0,-4],[-1,-1],[0,-1],[-2,-10],[8,-8],[-4,0],[-4,3],[-4,2],[-2,0],[-2,-1],[-2,-1],[-8,-14],[-3,-5],[-3,-9],[-3,-5],[-9,-9],[-5,-7],[-8,-18],[-2,-8],[0,-4],[-6,-16],[0,-1],[-2,-12],[-5,-7],[-10,-8],[-4,-6],[-7,-14],[0,-4],[0,-7],[11,-8],[2,-5],[-1,-3],[-2,-2],[-6,-15],[-3,-3],[-4,-10],[0,-1]],[[9261,6900],[14,44]],[[9203,6858],[5,16],[5,17],[6,22],[7,25],[5,16],[1,2]],[[9162,6870],[4,16],[6,16],[6,22],[7,25],[5,19]],[[9116,6865],[5,17],[5,16],[5,16],[6,22]],[[9137,6936],[6,25],[5,19]],[[9156,6852],[-7,3],[-24,7],[-9,3]],[[9066,6863],[5,16],[9,-2],[36,-12]],[[9047,6869],[-11,4],[-11,4],[3,8],[3,7],[4,14]],[[9035,6906],[5,16]],[[9040,6922],[33,-9],[8,-2],[6,16],[6,22],[9,-3],[25,-7],[10,-3]],[[9066,6863],[-9,3],[-10,3]],[[9040,6922],[2,9],[2,8],[7,22],[7,23],[5,18]],[[8990,6920],[6,15],[4,13],[1,4],[1,2],[6,19],[8,24],[6,18]],[[9035,6906],[-9,3],[-28,8],[-8,3]],[[9047,6869],[-8,-25],[-11,4],[-11,5],[-8,-20],[-41,17]],[[8968,6850],[2,7],[7,23]],[[8977,6880],[7,19],[6,21]],[[9049,6805],[-3,-8],[-9,4],[-33,14]],[[9004,6815],[-41,18],[0,1]],[[8963,6834],[5,16]],[[9074,6740],[-32,15],[-9,5],[-8,4],[-33,16]],[[8992,6780],[6,17],[6,18]],[[8950,6799],[7,17],[6,18]],[[8992,6780],[-9,-25],[-8,-22],[-9,5],[-23,11],[-9,4]],[[9008,6691],[-9,5],[-23,11],[-9,5],[-9,4],[-23,11],[-8,5]],[[9001,6670],[-8,-21],[-9,5],[-23,11],[-9,4]],[[8952,6669],[-9,5],[-23,10],[-9,5]],[[9034,6629],[-8,-23],[-9,-26],[-9,-25]],[[9008,6555],[-10,5],[-22,11],[-9,5]],[[8967,6576],[9,24],[9,26],[-9,4],[-23,12],[-9,4],[8,23]],[[8967,6576],[-9,4],[-23,11],[-10,5]],[[8925,6596],[-9,4],[-23,12],[-8,4]],[[8990,6507],[-8,-24],[-9,5],[-23,11],[-9,4]],[[8925,6596],[-8,-25],[-8,-24],[31,-15],[10,-5],[8,-4],[23,-11],[9,-5]],[[9049,6535],[-9,-25]],[[9040,6510],[-9,5],[-23,11],[-9,5],[-9,-24]],[[9008,6555],[9,-4],[13,-6],[10,-5],[9,-5]],[[9058,6419],[-2,1],[-13,7],[-8,4],[-19,9],[-16,-45],[-35,18],[-47,24]],[[9040,6510],[-8,-23],[8,-5],[23,-11],[10,-4],[2,-1]],[[9049,6535],[9,-5],[23,-11],[10,-5]],[[9032,6336],[-7,-23]],[[9025,6313],[-45,24],[-37,18],[7,18],[1,4],[-46,24]],[[9025,6313],[-10,-34],[-6,-23],[-1,-4],[-3,-10],[-3,-7]],[[9048,6191],[-1,0],[-3,-2],[-2,-1],[-2,-1],[-1,0],[0,1],[-3,1],[-2,2],[-3,1],[-3,3],[-3,2],[-3,2],[-2,3],[-1,0],[-1,1],[0,2],[-3,8],[-2,6],[-5,8],[-6,8]],[[9046,6184],[-15,-53],[-32,-108],[-9,-33],[-10,-50],[-7,-29],[-6,-29]],[[8886,5628],[-7,-20],[-28,-87],[-6,-18]],[[8845,5503],[-7,3],[2,6],[4,9],[2,6],[0,1],[4,10],[2,5],[4,13],[4,13],[3,9],[-3,2],[-1,1],[-6,3],[-15,8]],[[8838,5592],[6,9],[5,8],[6,13],[-9,5],[-8,4],[-10,5],[-9,5],[-9,5],[-13,7]],[[8797,5653],[8,20],[8,19]],[[8813,5692],[4,11],[25,69],[0,1],[16,46],[14,38]],[[8872,5857],[7,19],[1,1],[0,2],[1,2]],[[8872,5857],[-14,8],[-10,6],[-11,-27],[-19,10],[6,17],[-17,9]],[[5886,4124],[-6,3],[-16,8],[-18,8],[-12,-35],[0,-1],[0,-1],[26,-28],[-12,-16],[-13,-16]],[[5835,4046],[-18,-23]],[[5817,4023],[-14,14],[-13,15],[-14,14],[-3,3],[-12,12]],[[5761,4081],[31,41],[5,7],[13,27],[1,4],[6,16],[73,-34],[1,-1],[0,-3],[-5,-14]],[[5913,4145],[-1,-5],[-8,-24]],[[5904,4116],[-18,8]],[[5761,4081],[-13,14],[-30,31],[-3,3],[-16,18]],[[5699,4147],[-27,27],[-3,8]],[[5669,4182],[-1,14]],[[5668,4196],[22,5],[28,2],[23,1],[26,-2],[11,-1],[10,-2]],[[5788,4199],[5,-2],[15,-5],[3,-1],[5,-2],[36,-14],[1,-1],[8,-4],[52,-24],[0,-1]],[[5682,3982],[-61,63]],[[5621,4045],[11,15],[13,17]],[[5645,4077],[11,13],[10,14],[6,7]],[[5672,4111],[5,7],[9,12],[2,2],[11,15]],[[5761,4081],[-14,-17],[-14,-18],[-13,-18],[-26,-33],[-6,-7],[-6,-6]],[[5672,4111],[-15,15],[-11,-15],[-2,-1],[-2,1],[-27,29],[-4,16],[18,9],[19,8],[21,9]],[[5645,4077],[-2,2],[-58,62],[-4,-2],[-13,-12],[-11,11],[-3,4]],[[5554,4142],[61,35],[23,10],[26,8],[4,1]],[[5621,4045],[-66,69]],[[5555,4114],[-13,15],[-6,2]],[[5536,4131],[18,11]],[[8278,6087],[-9,-6],[-5,1],[-25,-10]],[[8169,6240],[2,-1],[15,-5]],[[8186,6234],[-1,-3],[0,-5],[10,-28],[9,4],[33,-13],[-11,-30],[14,-12],[5,-4],[1,-2],[1,-3],[0,-5],[0,-20]],[[8186,6234],[72,-29],[3,-1],[2,-1],[16,-6],[11,-6],[2,-2]],[[8195,6317],[72,-40],[9,21]],[[8276,6298],[45,-25],[8,21],[7,20],[7,21],[10,-5],[11,-6],[3,-2]],[[8211,6358],[73,-40]],[[8284,6318],[-8,-20]],[[8292,6339],[-8,-21]],[[8218,6378],[74,-39]],[[8234,6413],[70,-43]],[[8304,6370],[-4,-11],[-8,-20]],[[8332,6434],[-1,-3],[-6,-14],[-8,-20],[35,-19],[-9,-18],[-34,18],[-5,-8]],[[8371,6333],[-3,2],[-64,35]],[[6019,3434],[-11,10],[-6,20],[-12,-13],[-13,13]],[[5977,3464],[-4,5],[-5,2],[-6,7]],[[5962,3478],[12,16],[13,17]],[[5987,3511],[18,24],[16,21],[2,2]],[[6023,3558],[7,-6],[5,-8],[17,-18],[5,-4],[8,-7],[4,-2],[5,-4]],[[6074,3509],[-2,-2],[-15,-26],[-31,-39],[-7,-8]],[[7432,5545],[50,-36]],[[7459,5596],[12,-8],[30,-22],[5,-5],[3,0],[5,0]],[[7471,5617],[9,17],[8,14],[1,4]],[[7489,5652],[2,4]],[[7363,5696],[10,17]],[[7373,5713],[9,17]],[[7382,5730],[54,-39]],[[7436,5691],[53,-39]],[[7436,5691],[10,20],[6,10],[-54,39]],[[7398,5760],[8,11]],[[7382,5730],[10,20]],[[7392,5750],[4,7],[2,3]],[[7392,5750],[-9,6],[-1,0],[-17,12],[-16,12],[-8,6],[-2,3]],[[7339,5789],[3,7],[8,15]],[[7373,5713],[-54,39],[9,17]],[[7328,5769],[11,20]],[[7242,5785],[9,17],[9,17]],[[7260,5819],[68,-50]],[[7260,5819],[12,22],[10,18]],[[7282,5859],[16,-11]],[[7298,5848],[52,-37]],[[7298,5848],[18,32],[9,18],[25,-18]],[[7350,5880],[-2,-6],[-1,-18],[-2,-14],[-6,-12],[16,-11]],[[7282,5859],[5,9]],[[7287,5868],[13,26],[18,33]],[[7318,5927],[26,-17],[16,-12]],[[7360,5898],[-10,-18]],[[7360,5898],[8,-8],[13,-16],[11,-18]],[[7366,5916],[8,-5],[6,-4]],[[7380,5907],[15,-18],[22,-38]],[[7417,5851],[-14,-13]],[[7360,5898],[4,9],[2,9]],[[7392,5923],[13,-15],[10,-16],[16,-27]],[[7431,5865],[-5,-7],[-9,-7]],[[7380,5907],[3,7],[1,10],[8,-1]],[[7392,5923],[19,34]],[[7411,5957],[22,-17],[16,-11]],[[7449,5929],[-4,-10],[-3,-12],[-1,-15],[-4,-16],[-6,-11]],[[7366,5916],[0,7],[-2,8],[0,6],[0,7],[2,6],[3,7]],[[7369,5957],[12,22]],[[7381,5979],[15,-11],[15,-11]],[[7381,5979],[22,42],[10,14],[9,7],[2,2]],[[7424,6044],[3,-2],[12,-10],[6,-6],[5,-7],[4,-6],[3,-8],[3,-10],[2,-16]],[[7462,5979],[3,-28],[1,-7],[2,-10],[1,-3],[-3,-1],[-6,-3],[-5,-1],[-6,3]],[[7369,5957],[-17,13],[10,19],[-1,5],[-18,14]],[[7343,6008],[14,9],[10,18],[9,17],[10,17],[1,2]],[[7387,6071],[16,-12],[18,-13],[3,-2]],[[7490,6111],[9,-20]],[[7499,6091],[-54,-34],[-21,-13]],[[7387,6071],[13,24]],[[7400,6095],[16,-13],[11,22],[5,8],[9,16],[4,1],[22,-16],[5,-13],[18,11]],[[7400,6095],[11,20],[-15,11],[14,26],[-1,5],[-13,9],[7,20]],[[7403,6186],[33,-25],[16,-12],[18,-13]],[[7470,6136],[12,-9],[8,-16]],[[7387,6071],[-78,59]],[[7357,6213],[11,8],[13,7],[12,6],[8,8]],[[7401,6242],[15,17],[15,16]],[[7431,6275],[6,-7],[2,-9],[-2,-12],[-24,-43]],[[7413,6204],[-10,-18]],[[7546,6172],[-48,-29],[-18,13],[-10,-20]],[[7413,6204],[17,-12],[16,-13],[29,53],[16,-12],[16,-13],[10,-7],[10,9],[10,-19],[9,-18]],[[7565,6184],[-3,-2],[-16,-10]],[[7431,6275],[29,32]],[[7460,6307],[7,7],[9,-11],[3,-7],[9,-16],[8,-12],[15,-20],[12,9],[3,3]],[[7583,6144],[-3,-2],[-16,-10],[-65,-41]],[[7520,5979],[-8,5],[-8,3],[-22,-5]],[[7482,5982],[-20,-3]],[[7572,6044],[-4,-5],[-7,-4],[-4,-3],[-9,-7],[-8,-9],[-9,-14],[-11,-23]],[[7562,5946],[-11,9]],[[7551,5955],[-17,12],[-14,12]],[[7534,5912],[-46,35],[-2,12],[-4,23]],[[7551,5955],[-11,-20],[-6,-23]],[[7587,5836],[-65,48]],[[7522,5884],[8,16],[4,12]],[[7471,5822],[31,25],[9,17],[1,2],[10,18]],[[8458,6764],[4,22],[6,20],[5,19]],[[8473,6825],[7,20]],[[8613,6778],[-1,-2],[-3,-9],[-1,-2],[0,-2],[-6,-22],[-1,-3]],[[8601,6738],[-2,1],[-36,9],[-35,7]],[[8528,6755],[-25,5],[-45,4]],[[8521,6693],[-17,2]],[[8504,6695],[2,33],[0,3],[2,0],[12,-1],[3,-1],[5,26]],[[8601,6738],[0,-2],[-4,-23]],[[8597,6713],[-3,0],[-32,8],[-3,1],[0,-3],[-2,-27],[-15,4],[-17,1],[-4,-4]],[[8513,6626],[5,25],[2,26],[1,16]],[[8597,6713],[0,-4],[-3,-35],[-1,-17],[-2,-14],[0,-3],[-1,-3],[-2,-13],[-4,-19]],[[8584,6605],[-2,0],[-17,5],[-17,5],[-18,6],[-17,5]],[[8736,6670],[-8,-11],[-50,38],[-16,-44],[55,-26],[0,-3],[0,-3],[2,-11],[-11,-24],[-38,15],[-38,20],[-12,-53],[3,-10]],[[8623,6558],[-3,1],[-7,3],[-2,1],[-6,3],[-9,2],[-2,0],[-17,6]],[[8577,6574],[4,16],[3,15]],[[8597,6713],[14,-4],[3,-1],[2,-1],[15,-4],[3,-2],[15,-5],[1,15],[3,17]],[[8653,6728],[16,-10],[18,-12],[18,-13],[17,-12],[14,-11]],[[8631,6817],[14,-10],[14,-11],[8,-6],[8,-5]],[[8675,6785],[-2,-3],[-7,-15],[-6,-14],[-3,-10],[-4,-15]],[[7460,6307],[-13,15],[-17,-18],[-13,10],[4,10],[8,8],[-46,34],[-5,3],[-7,0],[-6,-2],[-4,-4],[-4,-5],[-6,-11],[-16,11]],[[7416,6399],[17,-12],[15,-12],[2,-1],[10,-8],[5,-5],[5,-6],[4,-6],[6,-8],[2,-4],[2,-3],[11,-19]],[[7322,4905],[-56,41]],[[7266,4946],[5,9],[6,10],[56,-42]],[[7333,4923],[-6,-9],[-5,-9]],[[7312,4885],[-56,41],[-25,18]],[[7231,4944],[7,10],[5,9]],[[7243,4963],[23,-17]],[[7322,4905],[-4,-10],[-6,-10]],[[7301,4864],[-56,42],[-25,18]],[[7220,4924],[5,9],[6,11]],[[7312,4885],[-6,-11],[-5,-10]],[[7290,4844],[-56,42],[-25,18]],[[7209,4904],[6,10],[5,10]],[[7301,4864],[-5,-9],[-6,-11]],[[7290,4844],[-10,-18]],[[7280,4826],[-10,7],[-47,34],[-15,12],[-9,6]],[[7199,4885],[5,10],[5,9]],[[7280,4826],[-10,-19]],[[7270,4807],[-10,7],[-72,54]],[[7188,4868],[11,17]],[[7178,4851],[5,8],[5,9]],[[7270,4807],[-5,-8],[-4,-9]],[[7261,4790],[-83,61]],[[7169,4833],[5,10],[4,8]],[[7261,4790],[-5,-8],[-4,-9]],[[7252,4773],[-83,60]],[[7252,4773],[-6,-11],[-6,-11],[-51,37],[-32,23]],[[7157,4811],[6,12],[6,10]],[[7252,4773],[31,-24],[2,0],[-6,-12],[-7,-11],[-6,-11],[-5,-11]],[[7261,4704],[-33,25]],[[7228,4729],[-82,60]],[[7146,4789],[6,12],[5,10]],[[7214,4704],[-82,60]],[[7132,4764],[7,14],[7,11]],[[7228,4729],[-7,-12],[-7,-13]],[[7200,4678],[-63,46],[-19,14]],[[7118,4738],[14,26]],[[7214,4704],[-8,-14],[-6,-12]],[[7200,4678],[-9,-17],[-23,16],[-6,-10]],[[7162,4667],[-58,44]],[[7104,4711],[5,11],[9,16]],[[7151,4646],[-18,14],[-2,-4],[-2,-9],[-5,-13]],[[7124,4634],[-16,8],[-27,12],[-2,3]],[[7079,4657],[2,1],[5,17],[0,2]],[[7086,4677],[6,14],[6,11],[6,9]],[[7162,4667],[-5,-10],[-6,-11]],[[7133,4610],[-57,26]],[[7076,4636],[2,9],[1,8],[0,4]],[[7124,4634],[9,-4],[7,-4],[-4,-9],[-3,-7]],[[7125,4591],[-55,26]],[[7070,4617],[3,10],[3,9]],[[7133,4610],[-2,-3],[-3,-6],[-3,-10]],[[7118,4571],[-10,4],[-45,22]],[[7063,4597],[4,12],[3,8]],[[7125,4591],[-3,-9],[-4,-11]],[[6952,4806],[-42,23]],[[6910,4829],[-36,18],[-7,4]],[[6899,4876],[24,-13],[14,-7],[14,-8],[14,-7]],[[6965,4841],[-3,-9],[-3,-8],[-3,-9],[-4,-9]],[[6933,4749],[-21,10],[-9,4]],[[6903,4763],[-10,4],[-4,3]],[[6889,4770],[4,10],[3,9],[3,8],[3,9],[4,11],[4,12]],[[6952,4806],[-3,-9],[-4,-11],[-3,-8],[-3,-9],[-3,-9],[-3,-11]],[[6889,4770],[-38,18],[-5,2]],[[6846,4790],[4,10],[3,9],[3,9],[3,9],[4,11],[4,13]],[[6889,4724],[-9,5],[-43,20],[-9,5]],[[6828,4754],[7,19],[6,19]],[[6841,4792],[5,-2]],[[6903,4763],[-7,-19],[-7,-20]],[[6876,4687],[-61,29]],[[6815,4716],[4,11],[2,9],[7,18]],[[6889,4724],[-3,-10],[-3,-8],[-3,-8],[-4,-11]],[[6861,4644],[-61,29]],[[6800,4673],[3,10],[4,9],[3,11],[5,13]],[[6876,4687],[-4,-13],[-4,-12],[-4,-9],[-3,-9]],[[6846,4603],[-61,29]],[[6785,4632],[4,11],[4,10]],[[6793,4653],[3,10],[4,10]],[[6861,4644],[-4,-10],[-3,-10],[-4,-10],[-4,-11]],[[6834,4567],[-61,29]],[[6773,4596],[6,18],[3,9],[3,9]],[[6846,4603],[-3,-9],[-3,-9],[-6,-18]],[[6898,4536],[-2,1],[-62,30]],[[6846,4603],[64,-30]],[[6910,4573],[-4,-10],[-3,-8],[-2,-5],[1,-3],[-4,-11]],[[6861,4644],[32,-15],[31,-15]],[[6924,4614],[-4,-10],[-3,-10],[-3,-10],[-4,-11]],[[6876,4687],[63,-31]],[[6939,4656],[-5,-12],[-3,-11],[-4,-10],[-3,-9]],[[6889,4724],[10,-4],[45,-21],[9,-4]],[[6953,4695],[-4,-10],[-3,-8],[-3,-9],[-4,-12]],[[6933,4749],[26,-12],[10,-5]],[[6969,4732],[-9,-18],[-7,-19]],[[7014,4666],[-10,5],[-39,18],[-2,1],[-10,5]],[[6969,4732],[10,-5],[1,0],[18,-8],[19,-9]],[[7017,4710],[10,-5]],[[7027,4705],[-6,-20],[-7,-19]],[[7000,4627],[-61,29]],[[7014,4666],[-3,-10],[-4,-9]],[[7007,4647],[-3,-9],[-4,-11]],[[6985,4584],[-61,30]],[[7000,4627],[-4,-12],[-4,-12]],[[6992,4603],[-3,-9],[-4,-10]],[[6971,4543],[-23,11],[-16,8],[-22,11]],[[6985,4584],[-3,-9],[-4,-10],[-3,-10],[-4,-12]],[[6971,4543],[-3,-9],[-3,-8],[-7,-19]],[[6862,4436],[-64,30],[-4,3],[-17,9],[-38,18],[6,18],[6,18],[6,18],[6,18],[61,-30],[3,10],[6,15],[1,4]],[[6830,4348],[-66,18]],[[6764,4366],[-10,3],[-51,15],[-39,10],[-49,13],[-4,1],[-2,1]],[[6609,4409],[2,4]],[[6611,4413],[23,62],[13,32],[2,4],[3,8]],[[6652,4519],[15,41],[7,17],[10,27],[2,3],[0,1],[2,5],[12,31]],[[6700,4644],[1,-1],[2,-2],[1,-1],[2,-3],[3,-9],[1,-1],[1,-2],[2,-1],[2,-1],[1,-1],[3,0],[14,-7],[22,-10],[18,-9]],[[6652,4519],[-3,1],[-3,2]],[[6646,4522],[1,3],[6,18],[7,18],[-9,4],[-11,5],[-38,19]],[[6702,4649],[-1,-3],[-1,-2]],[[6646,4522],[-8,4],[-46,22],[-4,2]],[[6588,4550],[4,11],[3,9],[4,10],[3,9]],[[6575,4513],[3,9],[3,9],[4,10],[3,9]],[[6646,4522],[-8,-18],[-7,-18],[-7,3],[-2,1],[-43,20],[-4,3]],[[6568,4493],[-62,30]],[[6506,4523],[7,19],[6,19]],[[6519,4561],[7,18],[7,21],[7,18]],[[6575,4513],[-4,-10],[-3,-10]],[[6569,2685],[-2,0],[-35,5],[-47,5]],[[6496,2522],[-17,12],[17,31],[8,18],[2,15],[-1,18],[-20,-3],[-4,24],[-6,0],[-20,-3],[-21,-5]],[[6402,2406],[-1,148]],[[7401,6242],[-17,-2],[-90,68]],[[7343,6008],[-10,-4],[-15,-3],[-36,0]],[[7318,5927],[-12,10],[-10,12],[-5,7],[-4,10]],[[7287,5966],[-2,8],[-1,5],[-2,22]],[[7259,5922],[-15,11],[-16,12]],[[7287,5966],[-5,-1],[-23,-43]],[[7287,5868],[-23,17],[-1,6],[6,11],[6,8],[-16,12]],[[7282,5859],[-41,32],[-13,10]],[[7228,5901],[-14,11],[-14,10]],[[7228,5901],[-3,-7],[-4,-7],[-2,-3],[-2,-4],[-1,-4],[-4,-6]],[[7212,5870],[-14,9],[-13,10]],[[7185,5889],[-13,10],[-7,4],[-7,5]],[[7187,5824],[-13,10],[-13,10]],[[7161,5844],[4,8],[20,37]],[[7212,5870],[-6,-12],[-9,-17],[-10,-17]],[[7161,5844],[-13,9],[-14,10]],[[7532,5214],[1,-5],[-14,0],[-6,-11],[-12,-18],[-5,-10]],[[7496,5170],[-58,40],[-5,-8],[-4,-7],[-4,-8],[-4,-8]],[[7421,5179],[-20,14]],[[7401,5193],[13,21],[11,20],[-9,7],[-41,30],[-3,2]],[[7478,5254],[15,-11],[15,-11],[24,-18]],[[7401,5193],[-8,6],[-7,5]],[[7386,5204],[-33,25],[-7,4]],[[7354,5145],[-46,33],[10,20],[-5,3],[-4,3],[-2,2],[-1,1],[-3,2],[-38,28]],[[7265,5237],[10,19]],[[7386,5204],[-11,-21],[-11,-19],[-10,-19]],[[7354,5145],[-11,-21]],[[7343,5124],[-46,34]],[[7297,5158],[-9,6],[-5,5],[-4,4],[-1,2]],[[7278,5175],[-3,4]],[[7275,5179],[-1,3],[-2,2],[-1,2],[-2,2],[-3,3],[-6,5],[-8,6],[-5,1],[7,14],[11,20]],[[7389,5090],[-11,-19]],[[7378,5071],[-8,6],[-38,28],[-10,-20],[-46,34]],[[7276,5119],[11,19],[10,20]],[[7343,5124],[37,-28],[9,-6]],[[7276,5119],[-11,-20]],[[7265,5099],[-37,28],[-3,2],[-1,0],[-1,0],[4,7],[14,12],[17,12],[15,10],[0,3],[5,2]],[[7378,5071],[-10,-20],[-11,-19],[-9,-17],[-9,-18]],[[7339,4997],[-9,6],[-29,22],[-8,6]],[[7293,5031],[-9,6],[-29,21],[-8,6]],[[7247,5064],[9,18],[9,17]],[[7274,4996],[-43,31]],[[7231,5027],[5,9],[5,9],[-3,2],[9,17]],[[7293,5031],[-10,-18],[-4,-8],[-5,-9]],[[7344,4944],[-57,42],[-13,10]],[[7339,4997],[-10,-17],[9,-7],[15,-12]],[[7353,4961],[-4,-8],[-5,-9]],[[7344,4944],[-6,-10],[-5,-11]],[[7243,4963],[8,8],[7,7],[9,9],[7,9]],[[6352,1008],[-1,-19]],[[6351,989],[-19,0],[1,46],[-2,5],[-24,-16],[-20,-13],[-18,-14],[6,-9],[-1,-23],[-7,-1],[-1,-26]],[[6211,879],[-2,78]],[[6209,957],[2,8]],[[6211,965],[5,3],[15,11],[22,15],[19,14],[18,15],[22,15],[16,11],[19,18],[28,30],[30,23]],[[6405,1120],[0,-13]],[[6405,1107],[-5,-2],[-15,-23]],[[6385,1082],[-4,-4],[-29,-22],[0,-11],[0,-25],[0,-12]],[[6211,966],[4,23]],[[6215,989],[4,3],[2,-1],[1,-2],[1,-4],[0,-3],[-1,-3],[-2,-3],[-2,-3],[-3,-4],[-4,-3]],[[6351,989],[2,-77]],[[6353,912],[-20,0],[-1,41],[-16,0],[-2,-1],[-1,-1],[-1,-3],[0,-9]],[[6353,912],[0,-77]],[[6180,4293],[-2,1],[-1,1],[-41,19]],[[6101,4396],[7,-28],[18,7]],[[6176,4336],[7,17],[1,3],[-1,12],[18,-3],[3,0]],[[6204,4365],[-1,-8],[-3,-9],[-15,-42],[-5,-13]],[[6024,4170],[-8,-3]],[[6016,4167],[-36,-4],[-35,16],[-12,-3],[-7,4],[-2,1]],[[5924,4181],[3,8]],[[5927,4189],[8,23]],[[5935,4212],[3,-1],[17,-8],[17,-8],[1,1],[1,1],[4,9],[4,5],[5,6],[9,5],[12,5],[9,3],[8,-14]],[[6025,4216],[-5,-5],[-4,-6],[-4,-9],[-5,-16],[0,-2],[1,0],[16,-8]],[[7110,4547],[-9,4],[-47,22]],[[7054,4573],[5,12],[4,12]],[[7118,4571],[-5,-13],[-3,-11]],[[7103,4528],[-55,26]],[[7048,4554],[3,10],[3,9]],[[7110,4547],[-4,-10],[-3,-9]],[[7091,4486],[-18,8],[-40,20]],[[7033,4514],[4,11],[4,10],[4,10],[3,9]],[[7103,4528],[-3,-10],[-3,-10],[-3,-11],[-3,-11]],[[7020,4476],[4,11],[3,9],[3,9],[3,9]],[[7091,4486],[-7,-18],[-7,-19]],[[6971,4543],[62,-29]],[[6985,4584],[63,-30]],[[6992,4603],[62,-30]],[[7000,4627],[63,-30]],[[7007,4647],[63,-30]],[[7014,4666],[9,-5],[38,-17],[8,-4],[7,-4]],[[7027,4705],[9,-5],[38,-17],[12,-6]],[[7017,4710],[3,8],[4,9],[5,9],[5,8],[4,8]],[[7038,4752],[23,-16],[3,-1],[2,-2],[3,0],[8,-2],[2,-1],[10,-7],[15,-12]],[[7038,4752],[5,9],[4,8],[4,8],[4,7],[39,-28],[2,-1],[7,-5],[15,-12]],[[7038,4752],[-42,31]],[[6996,4783],[4,9],[5,8],[4,7],[4,9],[1,0],[2,3],[0,2],[1,3],[4,4],[6,6],[2,3],[3,3]],[[7032,4840],[2,-2],[3,-2],[75,-55],[5,-6],[15,-11]],[[6969,4732],[5,10],[4,8],[4,8],[5,9],[4,8],[5,8]],[[6952,4806],[44,-23]],[[6965,4841],[4,8],[3,9],[8,15],[2,4]],[[6728,821],[50,-10]],[[6778,811],[25,-6],[50,-12],[41,-9],[99,-23],[15,0],[7,2],[13,3],[7,3],[4,3],[1,2]],[[7040,774],[13,-10]],[[5536,4131],[-20,6],[-20,21],[-2,14]],[[5494,4172],[14,17]],[[5508,4189],[46,-47]],[[5536,4131],[-40,-24]],[[5496,4107],[-2,1],[-15,12],[-8,9],[14,9],[-3,17]],[[5482,4155],[12,17]],[[5382,4039],[-2,-1]],[[5380,4038],[-7,7],[-3,5],[-11,12]],[[5359,4062],[3,2],[4,-1],[8,-7],[3,-1],[9,6],[18,11]],[[5404,4072],[14,8],[15,12],[14,18]],[[5447,4110],[35,45]],[[5496,4107],[-2,-1],[-12,-7],[-13,-8],[-87,-52]],[[5585,3901],[8,8]],[[5593,3909],[20,-21],[40,-41],[16,-17]],[[5669,3830],[-15,-19]],[[5654,3811],[-77,81]],[[5577,3892],[8,9]],[[5593,3909],[9,7],[27,21]],[[5629,3937],[39,-40],[1,-3],[9,-47],[-1,-4],[-2,-5],[-6,-8]],[[5668,3680],[-3,3],[-43,45],[-23,24],[-20,20],[-53,54]],[[5526,3826],[4,3],[11,13],[13,17],[1,4]],[[5555,3863],[15,20],[7,9]],[[5654,3811],[-23,-30],[54,-58]],[[5685,3723],[7,-7],[1,-2],[-25,-34]],[[5654,3811],[54,-56]],[[5708,3755],[-23,-32]],[[5692,3654],[-24,26]],[[5708,3755],[56,-58]],[[5764,3697],[-13,-18],[-1,-2],[-3,-3],[-7,-8],[-48,-12]],[[5724,3527],[-15,16],[-3,5],[-26,26],[-12,-16],[-13,-16],[-13,-19],[-13,-18]],[[5629,3505],[-15,15]],[[5614,3520],[-13,14]],[[5601,3534],[89,117],[2,3]],[[5692,3654],[64,-66],[7,-7],[2,-3]],[[5765,3578],[-2,-2],[-14,-18],[-3,-1],[-10,-15],[-12,-15]],[[5689,3476],[-14,-18]],[[5675,3458],[-4,2],[-14,15]],[[5657,3475],[-28,30]],[[5724,3527],[0,-3],[-35,-48]],[[5756,3465],[-8,8],[-20,22],[-6,-19],[-13,-17],[-3,-1],[-17,18]],[[5765,3578],[12,-12],[7,-7],[25,-26]],[[5809,3533],[-2,-3],[-16,-20],[-11,-15],[-11,-15],[-13,-15]],[[5812,3408],[-11,-15],[-15,-18],[-14,-18]],[[5772,3357],[-14,15],[-15,15],[-33,35]],[[5710,3422],[-35,36]],[[5756,3465],[7,-7],[5,-5],[14,-14],[16,-15],[14,-16]],[[5866,3352],[-17,18],[-16,16],[-3,3],[-2,3],[-16,16]],[[5809,3533],[40,-42]],[[5849,3491],[33,-34],[15,-16],[11,-10],[10,-7],[2,-2]],[[5920,3422],[-2,-2],[-18,-23]],[[5900,3397],[-11,-14],[-12,-15],[-11,-16]],[[6611,4413],[-2,1],[-1,0],[-3,1],[-3,0],[0,1],[-1,2],[0,1],[0,2],[2,2],[2,3],[-52,26],[4,13],[4,9],[3,10],[4,9]],[[6609,4409],[-3,0],[-3,1],[-5,2],[-35,10],[-39,11],[-45,10]],[[6479,4443],[1,4],[3,10],[9,25],[4,12],[4,10],[3,10],[3,9]],[[6478,4648],[-3,-9],[-4,-9],[-7,-22],[-6,-17]],[[6458,4591],[-7,-18],[-6,-20],[61,-30]],[[6479,4443],[-40,7],[-29,7],[-3,1],[-63,22],[-34,12],[-9,3]],[[6458,4591],[61,-30]],[[7555,912],[-65,18]],[[5962,3478],[-36,37],[-33,33]],[[5893,3548],[13,17],[12,17],[20,23]],[[5938,3605],[31,-33],[-18,-24],[36,-37]],[[5938,3605],[16,21],[2,2],[14,17],[10,12]],[[5980,3657],[67,-69]],[[6047,3588],[-10,-12],[-14,-18]],[[5980,3657],[9,12]],[[5989,3669],[7,9],[14,17]],[[6114,3594],[-8,0],[-12,-17],[-15,-22],[-6,5],[-26,28]],[[5894,3747],[43,-46],[9,12],[43,-44]],[[5938,3605],[-42,43]],[[5896,3648],[-20,22],[-1,1],[-2,0],[-1,1],[-5,6]],[[5867,3678],[12,13],[2,5],[2,2],[3,2],[-16,17],[14,17],[10,13]],[[5865,3512],[-40,41],[14,19]],[[5839,3572],[14,18],[12,17],[13,17],[18,24]],[[5893,3548],[-15,-18],[-13,-18]],[[5839,3572],[-22,23],[14,18],[-3,2],[-5,6],[-14,15],[6,8],[7,9],[7,9]],[[5829,3662],[5,7],[18,24],[15,-15]],[[5764,3697],[14,18]],[[5778,3715],[49,-50],[2,-3]],[[5865,3512],[-12,-16],[-4,-5]],[[5962,3478],[-15,-19],[-14,-19],[-13,-18]],[[6222,3365],[-1,2],[-1,1],[-1,2],[-2,2],[-1,1],[-1,2],[-2,1],[-2,2],[-2,1],[0,1],[-3,2],[-1,1],[-1,0],[-2,1],[-1,1],[-2,1],[-2,1],[-2,0],[-5,4],[0,1],[-2,1],[-1,1],[-1,1],[-2,1],[-1,1],[-2,3],[-1,2],[-2,3],[-3,3],[-4,4],[-5,7],[-35,37],[-22,21],[-3,4],[-32,28]],[[6122,3588],[14,-12],[12,-9],[14,-7],[15,-8]],[[6177,3552],[34,-19],[13,-6],[16,-9],[19,-10],[3,-1],[2,-2],[4,-1]],[[6268,3504],[-3,-6],[-3,-10],[-8,-22],[-6,-18],[-12,-31],[0,-1],[-2,-4],[-1,-4],[-1,-1],[-1,-3],[-1,-3],[0,-1],[-2,-7],[-1,-2],[-1,-3],[-1,-6],[0,-1],[-1,-4],[0,-3],[-1,-5],[-1,-4]],[[6323,3388],[-4,-40],[-11,-24],[-22,-4],[-6,-11],[-1,-49],[5,-6]],[[6284,3254],[1,-6],[-1,-6],[1,-6],[2,-8],[-25,-25],[26,-26],[49,-54],[46,-49]],[[5977,2710],[-9,13],[-10,9],[-14,15],[-89,100],[-52,48],[-3,2],[3,2],[4,2],[5,3],[2,1],[5,3],[7,4],[3,2],[5,3],[20,10],[8,5],[3,2],[7,4],[3,2],[3,2],[1,1],[5,4],[1,1],[2,1],[7,6],[20,24],[8,11],[11,16],[8,10],[7,8],[13,17],[4,6],[8,9],[2,3],[11,14],[8,12],[21,26],[11,12],[10,10],[6,8],[2,2],[1,1],[0,2],[1,2],[0,3]],[[6046,3151],[15,20],[1,1],[11,14],[2,3],[34,44],[14,19],[12,15],[4,7],[4,6],[4,5],[1,1],[4,5],[5,6],[3,5],[4,5],[2,3],[2,1],[0,1],[3,4],[4,3],[4,3],[3,2],[2,1],[4,2],[2,1],[5,1],[4,1],[6,0],[1,0],[2,3],[2,3],[2,4],[1,0],[1,3],[2,3],[2,6],[2,4],[1,3],[1,4],[0,2]],[[6512,3265],[-25,-6],[-45,-11],[-14,-4],[-54,-13]],[[6374,3231],[-6,-2],[-19,-4],[-19,-6],[-10,-2],[-10,10],[-17,17],[-9,10]],[[6374,3231],[3,-3],[4,-3],[5,-6],[13,-15],[9,-9],[9,-8],[29,-30]],[[6607,3102],[-19,14],[-25,-46],[19,-14],[20,-16]],[[6636,3157],[-2,-4],[-27,-51]],[[6627,3087],[-25,-47]],[[6607,3102],[20,-15]],[[6657,3142],[-30,-55]],[[6296,2451],[13,25]],[[6334,2524],[13,24]],[[6347,2548],[0,1],[0,1],[0,1],[4,7],[4,7],[2,1],[1,-1],[1,-1],[-1,-2],[-3,-6],[7,2],[3,6],[-6,7],[4,10]],[[6192,2521],[6,-4],[52,-35],[16,-10],[4,-3],[26,-18]],[[6155,2125],[-67,43]],[[6195,2210],[-16,-36],[-8,-15],[-9,-17],[-7,-17]],[[6215,2087],[-60,38]],[[6179,2009],[-60,38]],[[6119,2047],[8,18],[8,18],[9,18],[11,24]],[[6119,2047],[-45,29],[-15,8]],[[6076,1955],[-59,38]],[[6119,2047],[-8,-18],[-9,-19],[-8,-18],[-9,-18],[-9,-19]],[[6117,1876],[-59,38]],[[6058,1914],[9,20],[9,21]],[[6171,1991],[-10,-20],[-8,-17],[-8,-18],[-9,-20],[-9,-19],[-10,-21]],[[6058,1914],[-9,-18],[-8,-18],[-60,38]],[[6108,1858],[-8,-19],[-9,-20],[-10,-22],[39,-26],[2,-3]],[[6122,1768],[-10,-14],[-14,-21],[-19,-21],[-18,-17],[-20,-14],[-17,-8],[-1,-1]],[[6117,1876],[-9,-18]],[[6170,1839],[-48,-71]],[[6108,1858],[43,-25],[11,15],[1,-3],[7,-6]],[[6230,1931],[-2,-3],[-1,-2],[-57,-87]],[[6301,1836],[-26,18],[-32,19],[-12,-8],[-14,-6],[-31,-14],[4,-4],[26,-17],[14,-9],[13,-9],[43,-28],[13,-8],[6,-3],[8,17],[8,16],[4,9],[1,1]],[[6326,1810],[27,-18],[9,-5],[-6,-9]],[[6356,1778],[-17,-30],[-5,-10],[-159,101],[-3,-10],[-9,-16]],[[6331,1865],[-1,-3],[-3,-6],[-3,-2],[-5,-3],[-4,0],[-14,-15]],[[6301,1836],[-4,-5],[-2,-2],[31,-19]],[[6367,1771],[-11,7]],[[6886,3478],[-19,13]],[[6867,3491],[20,33],[26,47]],[[6867,3491],[-18,-32]],[[6849,3459],[-19,14]],[[6830,3473],[65,117]],[[6720,3393],[56,101],[8,17]],[[6784,3511],[63,116]],[[6830,3473],[-10,-20],[-51,-96]],[[6849,3459],[-11,-19]],[[6886,3478],[-28,-53]],[[6858,3425],[-20,15]],[[6858,3425],[-16,-33]],[[6975,953],[-17,7],[-18,6]],[[6940,966],[-5,3],[-7,1],[-4,-3],[-4,-5],[-14,-49],[-13,-22]],[[6893,891],[-10,9],[-13,9],[-11,9],[-8,7]],[[6851,925],[-4,3],[-18,15]],[[6984,983],[-1,-4],[-8,-26]],[[6959,897],[-7,-21]],[[6952,876],[-15,12],[-16,13],[19,65]],[[6975,953],[-16,-56]],[[6952,876],[-13,-22]],[[6939,854],[-10,8],[-10,8]],[[6919,870],[-8,7],[-18,14]],[[5935,4212],[2,8],[2,4],[3,4],[4,7],[4,6],[2,3],[4,4],[6,6],[13,10]],[[5975,4264],[30,11],[19,4],[10,1],[12,1]],[[6046,4281],[0,-3],[0,-10],[3,-10],[6,-15]],[[6055,4243],[-16,-13],[-14,-14]],[[6124,4232],[-13,-36]],[[6111,4196],[-3,1],[-9,5],[-7,4],[-6,3],[-8,6],[-5,4],[-8,9],[-5,6],[-5,9]],[[6046,4281],[14,0],[4,0],[9,-1],[14,-3]],[[6087,4277],[12,-4],[13,-6],[7,-3],[3,-1],[2,-2],[2,-2],[1,-3],[1,-3],[1,-2],[-1,-5],[-4,-14]],[[6146,4200],[-1,-4],[-3,-9],[-5,-14],[-8,-21]],[[6129,4152],[-3,1],[-26,14]],[[6100,4167],[11,29]],[[6124,4232],[18,-8]],[[6142,4224],[1,-4],[7,3],[5,17],[4,2],[-15,-41],[2,-1]],[[6094,4060],[0,1],[11,29],[2,4]],[[6107,4094],[22,58]],[[6146,4200],[11,-6],[11,-5]],[[6168,4189],[22,-10]],[[6190,4179],[-1,-4],[-2,-6],[-9,-24],[-10,-31],[-8,-22],[-8,-27],[0,-40]],[[6107,4094],[-3,2],[-39,18]],[[6065,4114],[4,8],[3,5],[3,6],[7,8]],[[6082,4141],[15,20],[3,6]],[[6065,4114],[-2,1],[-47,52]],[[6024,4170],[36,-17],[16,-8],[3,-2],[3,-2]],[[6094,4060],[-2,1],[-8,3],[-117,55],[-37,18],[-17,8]],[[5913,4145],[6,23],[4,9],[1,4]],[[6083,4031],[-7,-19],[-14,-33],[0,-1],[-7,-18],[-7,-17]],[[6048,3943],[-4,1],[-42,44]],[[6002,3988],[11,15]],[[6013,4003],[11,15],[18,-18],[15,44],[5,16],[-2,2],[-79,37],[-35,16],[-1,0],[-1,-2],[-5,-14]],[[5939,4099],[-18,8]],[[5921,4107],[-17,9]],[[6013,4003],[-47,49],[-1,2],[0,2],[10,26],[-18,9],[-18,8]],[[6002,3988],[-12,-15]],[[5990,3973],[-57,60]],[[5933,4033],[-15,15],[-5,6],[-10,9],[5,6],[13,38]],[[5932,3902],[-15,16],[-6,7],[-8,7]],[[5903,3932],[19,25],[-14,15],[-13,14]],[[5895,3986],[7,7],[4,5],[2,2],[12,15],[13,18]],[[5990,3973],[-14,-16],[-14,-15],[-11,-14],[-19,-26]],[[6009,3893],[-14,-18],[-3,-5],[-13,-17]],[[5979,3853],[-3,3],[-30,32],[-14,14]],[[5979,3853],[-42,-54],[-12,-16]],[[5855,3887],[14,18],[15,-15],[15,-17],[9,13],[5,4],[4,2],[5,2],[5,2],[5,6]],[[5967,3739],[-23,24],[-9,9],[-10,11]],[[5820,3769],[15,20]],[[5835,3789],[13,16]],[[5835,3789],[-54,58]],[[5781,3847],[13,16]],[[5765,3827],[16,20]],[[5669,3830],[54,-56]],[[5629,3937],[10,9]],[[5639,3946],[8,6]],[[5647,3952],[63,-66]],[[5710,3886],[55,-59]],[[5710,3886],[15,19],[56,-58]],[[5647,3952],[20,18],[15,12]],[[5682,3982],[56,-60]],[[5817,4023],[-14,-18],[-13,-18]],[[5817,4023],[56,-59],[23,-24],[7,-8]],[[5835,4046],[29,-30],[28,-29],[3,-1]],[[8740,6667],[-4,3]],[[8675,6785],[15,-11]],[[8690,6774],[24,-16],[-2,-3],[-10,-19],[18,-14],[21,-15],[4,-5],[3,-7],[0,-4],[0,-5],[0,-4],[-2,-6],[-6,-9]],[[8696,6785],[-6,-11]],[[8700,6813],[-8,-16],[-4,-8],[8,-4]],[[8737,6756],[-41,29]],[[8757,6795],[-9,-17],[-7,-15],[-4,-7]],[[5826,3300],[-17,18],[-15,16]],[[5794,3334],[-2,2],[-20,21]],[[5866,3352],[-1,-3],[-1,-3],[-33,-43],[-2,-2],[-3,-1]],[[5873,3251],[-32,34],[-15,15]],[[5900,3397],[16,-16],[15,-16],[16,-16]],[[5947,3349],[-12,-15]],[[5935,3334],[-11,-15],[-13,-15],[-24,-34],[-14,-19]],[[5842,3210],[-16,16],[-9,-3],[-6,-2],[-8,1],[-8,2],[2,-6],[2,-15],[-1,-7],[-1,-8],[-8,-10],[-15,-19]],[[5757,3177],[17,21],[1,4],[1,4],[-1,4],[-12,11],[-14,16],[15,19],[-16,18]],[[5748,3274],[36,47],[8,9],[2,4]],[[5935,3334],[43,-45],[-12,-17],[-1,-2],[-10,-12],[-11,-16]],[[5947,3349],[30,38],[2,3]],[[5979,3390],[3,0],[1,3],[4,4],[3,1],[5,3],[3,6],[4,5],[17,22]],[[6046,3151],[-4,-5],[-2,-3],[-2,2]],[[5977,3464],[-23,-31],[5,-3],[8,-5],[-11,-23],[23,-12]],[[7623,2573],[4,6],[2,3],[7,10],[12,16],[5,8]],[[7653,2616],[19,26]],[[7672,2642],[5,8],[3,4],[2,3],[6,9]],[[7672,2642],[-20,15],[-18,14],[16,23]],[[7682,2740],[-64,46]],[[7618,2786],[15,22]],[[7661,2825],[2,-1],[52,-37]],[[7715,2787],[-18,-26]],[[7650,2694],[-64,46]],[[7586,2740],[10,14],[6,9],[8,10],[8,13]],[[7653,2616],[-39,27],[-45,35],[-16,12]],[[7553,2690],[17,27],[16,23]],[[7524,2739],[11,6],[11,9],[12,9],[10,9],[13,6],[16,5],[7,3],[7,6],[9,7],[13,9]],[[7553,2690],[-10,-11],[-14,-23]],[[6694,3114],[-30,-55],[19,-14]],[[6683,3045],[-16,-29],[-15,-14]],[[6712,3101],[-29,-56]],[[6770,3058],[-30,-56]],[[6740,3002],[-20,16],[-19,14],[-18,13]],[[6740,3002],[-18,-34],[-9,-11]],[[6772,2913],[-11,-22]],[[6791,3043],[17,-14]],[[6808,3029],[-29,-55]],[[6779,2974],[-26,-47],[19,-14]],[[6797,2960],[-25,-47]],[[6779,2974],[18,-14]],[[6807,2887],[-1,4],[-2,2],[-2,-2],[-30,22]],[[6797,2960],[29,-21],[5,-3]],[[8040,2949],[13,17],[8,11],[15,20]],[[8076,2997],[11,-9],[35,-28]],[[7006,800],[-13,11],[-8,7]],[[6985,818],[-7,5],[-8,7],[-8,6],[-8,6]],[[6954,842],[-8,7],[-7,5]],[[6959,897],[53,-42],[16,-13]],[[7028,842],[10,-8]],[[7038,834],[-15,-15],[-17,-19]],[[6915,794],[-18,4],[-18,5]],[[6879,803],[20,51],[7,-6],[12,20],[1,2]],[[6954,842],[-1,-2],[-9,-24],[-15,13],[-14,-35]],[[6985,818],[-1,-2],[-14,-35],[-18,4],[-18,5],[-19,4]],[[6839,901],[-11,-24],[-20,13],[-6,-20],[17,-11],[-3,-6],[-3,-12],[-16,9],[-7,-27],[17,-4],[18,-4]],[[6825,815],[18,-3],[18,-5]],[[6861,807],[18,-4]],[[7006,800],[9,-6],[9,-8],[16,-12]],[[6778,811],[27,95],[-15,-9]],[[6790,897],[-34,2]],[[6756,899],[42,25],[16,9],[12,8],[3,2]],[[6851,925],[-1,-2],[-11,-22]],[[6861,807],[7,26],[15,32],[-14,12],[-15,12]],[[6854,889],[-15,12]],[[6825,815],[10,35],[19,39]],[[6728,821],[0,1],[14,46],[19,-8],[4,14],[23,11],[2,12]],[[6650,838],[14,8],[10,7],[35,21],[11,6],[11,7],[2,2]],[[6733,889],[4,3],[6,3],[3,2]],[[6746,897],[1,-3],[9,5]],[[6746,897],[-3,5],[2,0],[13,10],[23,80],[4,14]],[[6733,889],[-11,4],[-2,-1],[-7,3],[-21,8],[-22,8]],[[6670,911],[24,83],[-4,1],[6,22]],[[6696,1017],[6,22]],[[6702,1039],[24,-10]],[[6726,1029],[-12,-43],[22,-8],[21,-8],[12,44],[3,12]],[[6726,1029],[-5,7],[3,17],[-1,5],[-5,10],[-28,43],[12,20]],[[6702,1039],[2,8],[-1,8],[-3,6],[-5,5],[-77,30],[-6,-24],[-6,-24]],[[6606,1048],[-4,-14],[-2,-8],[-22,-81]],[[6578,945],[-51,19],[-3,1]],[[6524,965],[-3,7],[-3,9],[-1,4],[-1,3],[0,3],[-1,3],[0,4],[0,5],[-1,5],[1,4],[0,4],[0,8],[1,5],[0,8],[1,5],[1,12]],[[6518,1054],[0,6],[1,21],[2,25],[2,16],[0,7],[1,13],[1,10],[0,3],[0,5],[0,3],[0,5],[0,7],[-1,5],[0,6],[-1,8],[0,5],[-1,5]],[[6522,1204],[0,1],[1,7],[-1,2]],[[6522,1214],[2,2],[3,0],[19,18],[41,35],[9,7],[3,1],[2,2],[5,3]],[[6696,1017],[-90,31]],[[6670,911],[-21,7],[-31,12],[-1,2],[-4,0],[-3,2],[-32,11]],[[6533,876],[1,6],[2,7],[1,7],[1,7],[0,4],[0,9],[-1,5],[0,5],[-2,7],[-2,6],[-1,4],[-3,8],[-5,14]],[[6531,876],[-20,5],[-26,5],[-25,6],[6,26],[-26,9],[-4,7],[-4,56],[2,9]],[[6434,999],[50,-19],[9,34],[5,16],[4,18],[3,11]],[[6505,1059],[10,-4],[3,-1]],[[6434,999],[-13,6],[6,38],[1,7],[4,9],[6,7],[16,17],[19,-11],[32,-13]],[[6403,864],[1,23],[0,8],[2,114],[-1,82],[0,16]],[[6405,1120],[7,6],[52,37],[20,13],[11,10],[19,18],[4,4],[1,2],[2,2]],[[6521,1212],[0,-1],[1,-7]],[[6352,1008],[21,1],[3,-1],[3,-1],[7,0],[5,1],[2,1],[0,3],[-1,3],[-2,4],[0,9],[0,6],[2,7],[1,1],[0,25],[-5,11],[-3,4]],[[8760,6653],[-2,1],[-18,13]],[[8737,6756],[31,-22],[-4,-18],[12,-3],[5,-18],[0,-16],[11,-4],[-4,-12]],[[8615,6424],[4,1],[24,77],[-6,3],[-7,3],[-9,38],[2,12]],[[8537,6472],[3,5],[12,27],[8,18],[1,2],[1,3],[8,24],[7,23]],[[8417,6569],[26,-21],[20,-15],[6,12],[2,9],[3,9],[3,6],[5,5],[-4,8],[-3,10],[7,3],[7,-2],[4,10],[2,7],[4,19],[14,-3]],[[8417,6569],[9,17],[9,23],[4,16],[5,21]],[[8444,6646],[6,34],[1,21]],[[8451,6701],[36,-3],[17,-3]],[[8341,6674],[31,-8],[3,21],[1,19],[4,4],[33,-1],[18,0],[-1,-27],[-4,-31],[18,-5]],[[8347,6737],[5,2],[19,1],[33,0],[30,-1]],[[8434,6739],[20,-1]],[[8454,6738],[0,-4],[-3,-33]],[[8384,6768],[50,-1],[0,-28]],[[8458,6764],[-4,-26]],[[8427,6853],[16,-12],[12,-8]],[[8455,6833],[6,-3],[12,-5]],[[8410,6866],[10,19],[10,19]],[[8430,6904],[41,-30],[-8,-20],[-8,-21]],[[8430,6904],[10,19],[-32,22],[8,16],[1,6]],[[8417,6967],[35,-25],[33,-24]],[[8485,6918],[21,-15]],[[8433,7005],[71,-52]],[[8504,6953],[-8,-15],[-9,-17],[-2,-3]],[[8514,6971],[-10,-18]],[[8442,7022],[72,-51]],[[8453,7042],[71,-51]],[[8468,7071],[71,-51]],[[8546,7034],[-7,-14]],[[8409,7114],[7,14]],[[8475,7085],[71,-51]],[[6924,2944],[18,-14]],[[6905,2958],[36,66]],[[6884,2974],[4,8],[5,8],[4,8],[4,8],[5,9],[4,7],[5,9],[5,9]],[[6905,2958],[-21,16]],[[6884,2974],[-24,17]],[[6847,2967],[13,24]],[[6797,2960],[30,56]],[[6808,3029],[19,-13]],[[6808,3029],[36,67]],[[2104,990],[-13,-3],[-18,-4],[-6,-3],[-6,-4],[-5,-4],[-16,-14]],[[2040,958],[-23,38],[-3,5],[-4,4],[-4,3],[-1,1]],[[2005,1009],[6,14],[-28,17],[-7,4],[-3,4],[-1,6],[-4,16],[3,2],[5,2],[7,4],[14,-19],[2,-1],[3,0],[1,2],[4,8],[6,8],[8,9],[9,8],[9,6],[4,2],[19,5],[4,-23],[8,2],[6,2],[4,1],[3,3],[6,5]],[[2093,1096],[13,-10],[-10,-24],[-1,4],[-3,-1],[-2,-2],[-1,-2],[0,-4],[2,-7],[8,-37],[5,-23]],[[4045,3461],[-16,-12],[-33,-25]],[[3982,3413],[-19,-15]],[[3963,3398],[-31,31],[-35,37],[-17,19],[-4,4],[-9,9],[-12,13],[-28,29],[-7,8],[-2,2],[-3,1],[-4,1],[-3,1],[-3,0],[-6,1],[-5,1],[-6,0],[-13,-6],[-7,-3],[-12,-2],[-5,-1],[-9,-1]],[[3742,3542],[0,6]],[[3742,3548],[16,1],[10,0],[14,7],[5,2],[5,1],[11,-1],[10,0],[5,-3],[7,-1],[8,5],[11,2],[11,1],[2,1],[6,0],[21,-5],[2,-1],[6,-4],[9,-5],[14,-7],[23,-5],[33,-6],[6,-1],[5,-1],[16,-2],[2,1],[17,0],[4,0],[14,2],[10,2],[28,5],[11,0],[26,16],[16,8],[20,0],[18,-2],[18,1],[46,7],[14,4],[7,1],[3,1],[6,4],[2,0],[3,1],[1,1],[11,5],[17,5]],[[4292,3588],[64,-59]],[[4356,3529],[-8,-5],[-9,-6],[-6,-7],[-10,-6],[-10,-4],[-2,-1],[-4,-1],[-3,-2],[-2,0],[-8,-3],[-10,0],[-11,1],[-22,-2],[-31,-2],[-18,-1],[-22,3],[-32,5],[-8,0],[-14,0],[-17,-3],[-24,-9],[-4,-2],[-19,-10]],[[7345,3904],[-13,-22]],[[7332,3882],[-19,15],[-18,13]],[[7295,3910],[-19,13],[-19,15],[-19,13]],[[7238,3951],[12,22]],[[7250,3973],[57,-42]],[[7307,3931],[38,-27]],[[6618,5223],[-22,-57]],[[6596,5166],[-4,2],[-43,21],[-4,2]],[[6545,5191],[11,30]],[[6556,5221],[52,149],[7,20],[1,3]],[[6616,5393],[10,-7],[8,-5],[38,-27],[3,-2]],[[6675,5352],[0,-2],[-1,-2],[-3,-6],[-28,-54]],[[6643,5288],[-10,-24],[-15,-41]],[[6732,5273],[-17,12],[-20,13],[-19,13],[-17,-34],[-16,11]],[[6675,5352],[36,-26],[17,-13]],[[6728,5313],[36,-25]],[[6764,5288],[-2,-4],[-3,-4],[-10,-21],[-17,14]],[[6732,5273],[-12,-22],[9,-17],[9,-17],[8,-8],[-9,-17]],[[6737,5192],[-11,9],[-13,23],[-16,-11]],[[6697,5213],[-9,16],[-20,15],[-17,13],[-17,-43],[-16,9]],[[6754,5179],[-17,13]],[[6764,5288],[33,-24]],[[6797,5264],[-2,-4],[-1,-6],[-40,-75]],[[7356,3926],[-11,-22]],[[7307,3931],[12,21]],[[7319,3952],[11,21]],[[7330,3973],[38,-26]],[[7368,3947],[-12,-21]],[[7273,4015],[57,-42]],[[7319,3952],[-58,42]],[[7261,3994],[12,21]],[[7250,3973],[-37,28],[11,21],[37,-28]],[[7238,3951],[-16,12],[-21,15],[-20,15]],[[7181,3993],[-61,47]],[[7120,4040],[31,59]],[[7151,4099],[80,-52],[5,-3],[37,-29]],[[7209,3897],[-36,28]],[[7173,3925],[11,22],[-20,15],[17,31]],[[7238,3951],[-15,-31],[-14,-23]],[[7339,3991],[-9,-18]],[[7151,4099],[8,15],[18,33],[5,15]],[[7182,4162],[8,-3],[37,-28],[26,-19],[19,-14],[4,-3]],[[7276,4095],[4,-2],[26,-19]],[[7306,4074],[-12,-22]],[[7294,4052],[-11,-20],[56,-41]],[[7294,4052],[57,-41]],[[7351,4011],[-12,-20]],[[7306,4074],[56,-41]],[[7362,4033],[-11,-22]],[[7412,4029],[-13,-24]],[[7399,4005],[-37,28]],[[7276,4095],[19,19],[2,2]],[[7297,4116],[4,-4],[1,-1],[16,-13]],[[7318,4098],[94,-69]],[[7318,4098],[7,12],[6,11]],[[7331,4121],[85,-62],[8,-6]],[[7424,4053],[-12,-24]],[[7435,4072],[-11,-19]],[[7331,4121],[5,9],[5,6],[5,4]],[[7346,4140],[89,-68]],[[7346,4140],[8,7],[9,8],[60,-47],[23,-17]],[[7446,4091],[-6,-10],[-5,-9]],[[7457,4112],[-6,-11],[-5,-10]],[[7297,4116],[26,23],[31,27],[13,8],[5,3],[15,5],[6,3],[22,0],[16,-1]],[[7431,4184],[12,-9],[4,-1],[5,-4],[3,-2],[1,-1],[8,-6],[12,-8],[3,-3]],[[7479,4150],[-5,-9],[-6,-9]],[[7468,4132],[-5,-10],[-6,-10]],[[7511,4041],[-65,50]],[[7457,4112],[66,-51]],[[7523,4061],[-6,-10],[-6,-10]],[[7468,4132],[35,-27],[12,-9],[17,-12],[2,-2]],[[7534,4082],[-5,-10],[-6,-11]],[[7479,4150],[6,-5],[40,-30],[8,-6],[11,-9]],[[7544,4100],[-5,-9],[-5,-9]],[[7654,4145],[-17,-31],[2,-2],[5,-4],[16,-12],[-9,-18],[-10,7],[-6,5],[-8,6]],[[7627,4096],[-15,11],[-35,27],[-11,9],[-10,-18],[-12,-21],[0,-4]],[[7431,4184],[4,1]],[[7435,4185],[12,-1],[16,0],[9,1],[6,1],[7,2],[5,1],[16,3],[16,5],[22,8],[16,9],[4,2],[19,14],[9,8],[2,3],[2,1]],[[7596,4242],[10,-7],[7,-5],[3,-3],[8,-6],[1,-2],[19,-15]],[[7644,4204],[-6,-12],[-5,-9],[-8,-15],[29,-23]],[[7604,4055],[-52,40],[-8,5]],[[7627,4096],[-10,-18]],[[7617,4078],[-6,-11],[-7,-12]],[[7604,4055],[25,-18],[3,-2]],[[7632,4035],[-5,-9],[-6,-10]],[[7621,4016],[-87,66]],[[7621,4016],[-5,-9],[-6,-11]],[[7610,3996],[-42,32],[-45,33]],[[7599,3976],[-18,13],[-25,18],[-45,34]],[[7610,3996],[-6,-10],[-4,-8],[-1,-2]],[[7594,3967],[-6,-10]],[[7588,3957],[-20,15],[-23,16],[-45,34]],[[7500,4022],[6,10],[5,9]],[[7599,3976],[-5,-9]],[[7578,3939],[-27,20],[-15,11],[-45,34]],[[7491,4004],[5,9],[4,9]],[[7588,3957],[-6,-12],[-4,-6]],[[7478,3981],[7,12],[6,11]],[[7578,3939],[-2,-5],[-7,-12]],[[7569,3922],[-10,5],[-8,2],[-8,4],[-19,14],[-46,34]],[[8191,3873],[8,29]],[[8199,3902],[1,5]],[[8200,3907],[34,-26],[14,-10]],[[8248,3871],[-6,-16]],[[8242,3855],[-6,-17],[39,-30],[26,-19],[14,-11],[28,-21]],[[8343,3757],[-8,-15],[-7,-12],[-3,-5],[-13,-25]],[[8360,3787],[-8,-15],[-9,-15]],[[8242,3855],[10,-8],[24,-18],[1,-1],[8,-6],[18,-13],[13,-10],[7,-5],[8,15],[-7,5],[-15,11]],[[8309,3825],[5,8],[21,-16],[8,13],[-45,34]],[[8298,3864],[8,15]],[[8306,3879],[45,-34]],[[8351,3845],[21,-16],[8,-6]],[[8380,3823],[-8,-15],[-12,-21]],[[8309,3825],[-16,12],[-7,6]],[[8286,3843],[7,14],[5,7]],[[8351,3845],[4,9],[4,7],[-7,5],[-37,29],[7,13]],[[8322,3908],[2,0],[43,-32],[9,15],[8,14]],[[8384,3905],[13,-10],[15,-12]],[[8322,3908],[7,12],[3,4],[8,15]],[[8340,3939],[16,-12]],[[8356,3927],[28,-22]],[[8356,3927],[7,13],[5,9],[11,19]],[[8379,3968],[12,22]],[[8391,3990],[29,-21],[-13,-22]],[[8407,3947],[-11,-20],[-7,-11],[-5,-11]],[[8407,3947],[18,-14],[11,-8]],[[8436,3925],[-11,-20],[-13,-22]],[[8442,3935],[-6,-10]],[[8391,3990],[12,22],[15,25]],[[8418,4037],[28,-21]],[[8446,4016],[19,-15],[9,-7]],[[8474,3994],[-13,-25],[-13,-23],[-6,-11]],[[8442,3935],[24,-18],[16,-13],[9,-7]],[[6717,5109],[-56,27]],[[6661,5136],[8,22],[6,20],[9,20],[13,15]],[[6754,5179],[-20,-37],[-16,-31],[-1,-2]],[[6754,5179],[21,-15],[32,-6],[6,-4]],[[6813,5154],[-36,-69],[-2,-3]],[[6775,5082],[-58,27]],[[6797,5264],[54,-39]],[[6897,5192],[54,-39],[17,-12]],[[6968,5141],[-2,-4],[-4,-9],[-10,-18],[-18,12],[-11,-21]],[[6972,5040],[-49,35]],[[6923,5075],[-10,7]],[[6968,5141],[31,-22]],[[6999,5119],[-1,-2],[-1,-3],[-1,-3],[10,-6],[-3,-6],[-10,-20],[-10,-19],[-11,-20]],[[6900,5033],[5,8],[6,13],[12,21]],[[6972,5040],[17,-13],[-19,-16],[-19,-17],[-11,10],[-9,7],[-13,9],[-18,13]],[[7103,5060],[-13,-9],[-3,-2],[-7,-5],[-5,-4],[-2,-2],[-4,-3],[-5,-4],[-6,-5],[-5,-5],[-6,-4],[-34,-32],[-13,-11],[-9,-8]],[[6824,4872],[-2,1],[-1,0],[-2,1],[-3,2]],[[6816,4876],[24,19],[9,5],[13,6],[13,5],[22,4],[9,2],[9,3],[12,6],[3,1],[-15,38],[-6,12],[-5,9],[-8,12],[-10,13]],[[6886,5011],[5,6],[6,11],[3,5]],[[6999,5119],[33,-24],[16,-11],[16,-12],[3,-1],[3,-1],[13,0],[4,-1],[5,-1],[3,-1],[3,-2],[3,-2],[1,-3],[1,0]],[[6886,5011],[-7,8],[-1,2],[-8,8],[-11,8],[-12,9],[-10,6],[-11,6],[-51,24]],[[6816,4876],[-5,2],[-2,3],[-5,2],[-4,1],[-17,8],[-13,5],[-20,10],[-31,14]],[[6719,4921],[8,22],[46,136],[2,3]],[[6824,4872],[-2,-2],[-2,-1],[-2,-2],[-4,-5],[-7,-7],[-2,-3],[-5,-7],[-3,-5],[-4,-7],[-5,-9],[-4,-6]],[[6784,4818],[-2,-6],[-8,-13],[-5,-10],[-3,-7]],[[6766,4782],[-1,1],[-2,1],[-4,2]],[[6759,4786],[9,16],[9,18],[-34,16],[-8,4],[-31,15],[-8,4]],[[6696,4859],[7,18]],[[6703,4877],[7,21],[4,11],[5,12]],[[6841,4792],[-9,5],[-36,16],[-7,4],[-5,1]],[[6828,4754],[-9,4],[-50,23],[-3,1]],[[6815,4716],[-52,24],[-2,1],[-10,5]],[[6751,4746],[-4,1]],[[6747,4747],[3,4],[7,15],[9,16]],[[6800,4673],[-57,28],[-3,1],[-7,3],[0,4]],[[6733,4709],[7,15],[11,22]],[[6793,4653],[-43,20],[-14,7],[-3,2],[-11,5],[11,22]],[[6683,4823],[9,-4],[31,-15],[8,-4],[14,-7],[14,-7]],[[6683,4823],[2,2],[5,15],[2,7],[4,12]],[[6641,4907],[62,-30]],[[3400,3543],[-4,3],[-54,21],[-23,24],[-5,5],[-3,2],[-3,5]],[[3308,3603],[7,1],[19,1],[7,0]],[[3341,3605],[8,0],[16,1],[9,0],[9,1],[2,0],[6,0],[13,-3]],[[3404,3604],[21,-7],[6,-3],[11,-6]],[[3442,3588],[3,-2],[20,-14],[63,-41]],[[3528,3531],[-12,-24],[-2,-5],[-44,16],[-70,25]],[[3341,3605],[-5,5],[-126,131],[4,4],[7,2],[13,3],[3,-1],[14,-15],[26,9],[127,-133],[0,-6]],[[7377,3964],[-9,-17]],[[7351,4011],[37,-28]],[[7388,3983],[-11,-19]],[[7399,3832],[-30,22],[-18,13],[-15,12],[-4,3]],[[7356,3926],[66,-51]],[[7422,3875],[-11,-21],[-12,-22]],[[7381,3799],[-12,-20],[-65,47]],[[7304,3826],[10,18],[2,4],[0,2],[16,32]],[[7399,3832],[-18,-33]],[[7381,3799],[22,-19],[4,-3],[2,-3],[8,-16]],[[7417,3758],[-7,-3],[-8,-3],[-7,-1],[-4,-1],[-7,-2],[-9,-3],[-23,-10],[-9,-4],[-6,-3]],[[7337,3728],[-7,-3],[-21,-9],[-5,-3],[-4,-2],[-3,-2],[-3,-2]],[[7294,3707],[0,2],[-1,2],[-1,1],[-36,27]],[[7256,3739],[12,22],[11,22],[2,2],[3,4],[8,13],[2,4],[10,20]],[[7256,3739],[-37,27]],[[7219,3766],[12,23],[11,22],[11,21],[2,3],[11,19]],[[7266,3854],[36,-26],[2,-2]],[[6677,5055],[-16,7],[-9,-22],[-5,2],[-1,0],[-3,0],[-5,3],[-33,16],[-2,1],[-2,2],[-4,2],[8,23]],[[6605,5089],[17,-8],[11,33],[1,3],[1,2],[1,0],[2,1],[1,-1],[1,0],[13,-6],[28,-13],[3,-3],[4,-6],[0,-4],[-1,-5],[-3,-6],[-7,-21]],[[6605,5089],[-33,16],[22,57],[2,4]],[[6596,5166],[65,-30]],[[6717,5109],[-1,-3],[-2,-2],[-19,-57],[-18,8]],[[7142,5009],[-6,-10],[-5,-10]],[[7131,4989],[-7,5],[-46,33],[-3,2],[-6,1],[-5,-5],[-9,-7],[59,-44],[6,-5]],[[7120,4969],[-9,-19]],[[7111,4950],[-10,-19],[-10,-16]],[[7091,4915],[-9,-18]],[[7103,5060],[1,-4],[1,-5],[-1,-7],[1,-4],[0,-2],[2,-2],[1,-1],[2,-2],[3,-1],[6,-3],[20,-16],[3,-4]],[[7131,4989],[-5,-10],[-6,-10]],[[7199,4885],[-32,24],[-56,41]],[[7131,4989],[57,-42],[32,-23]],[[7142,5009],[57,-41]],[[7199,4968],[32,-24]],[[7142,5009],[6,11],[5,9],[5,9],[5,10],[6,11],[5,9]],[[7174,5068],[57,-41]],[[7231,5027],[-5,-10],[-6,-11],[-5,-9],[-5,-10],[-5,-9],[-6,-10]],[[7174,5068],[5,10],[5,8],[5,2],[9,12],[40,-29],[9,-7]],[[7174,5068],[-24,19],[-2,4]],[[7148,5091],[1,0],[12,9],[4,3],[18,12],[15,10],[1,1],[2,1],[5,4],[20,14],[1,1],[24,16],[21,14],[3,3]],[[7103,5060],[11,8],[18,12],[4,3],[12,8]],[[6851,5225],[120,236],[4,8],[4,8]],[[6979,5477],[4,7],[4,8],[4,6],[4,9]],[[6851,5547],[60,-43],[4,8],[4,8]],[[6919,5520],[60,-43]],[[6728,5313],[114,216],[5,11],[4,7]],[[6919,5520],[4,8],[4,7]],[[6927,5535],[4,8],[5,8]],[[6936,5551],[51,-38],[8,-6]],[[6936,5551],[4,7],[4,8]],[[6944,5566],[4,7],[5,9]],[[6953,5582],[33,-24],[26,-19]],[[6953,5582],[5,9],[5,9],[4,9],[6,10],[2,3]],[[6953,5582],[-60,44]],[[6893,5626],[5,9],[5,9],[5,9],[5,10],[2,3]],[[6944,5566],[-60,43]],[[6884,5609],[4,8],[5,9]],[[6927,5535],[-59,44]],[[6868,5579],[4,7],[4,8],[8,15]],[[6860,5563],[4,8],[4,8]],[[6919,5520],[-59,43]],[[6851,5547],[5,9],[4,7]],[[6793,5590],[-9,-18]],[[6784,5572],[-38,26],[-9,6],[-10,-20],[-13,9]],[[6714,5593],[10,20],[11,21],[27,54],[8,16]],[[6770,5704],[7,-4],[6,-5],[-11,-23],[8,-6],[9,-6],[31,-21]],[[6820,5639],[-14,-26],[-5,-8],[-4,-7],[-2,-4],[-2,-4]],[[6784,5518],[-59,41],[-8,5],[-10,-19]],[[6707,5545],[-9,6],[-4,2]],[[6694,5553],[20,40]],[[6784,5572],[19,-13],[1,-2],[-1,-2],[-3,-7],[-6,-10],[-5,-10],[-5,-10]],[[6763,5479],[-65,48],[4,9],[5,9]],[[6784,5518],[-6,-10],[-6,-11],[-5,-9],[-4,-9]],[[6763,5479],[-9,-15],[-39,29],[-11,-19],[-5,-9],[-6,-12],[-3,-7],[-10,7],[-15,10],[10,19],[-13,8]],[[6662,5490],[9,18],[6,12],[17,33]],[[2967,2895],[-40,-34],[-3,-2],[-2,1],[-23,33],[-10,-8],[-4,-6],[-2,-3],[-5,4],[-5,3],[-26,14]],[[2847,2897],[-33,17],[-3,1],[-2,-4],[-6,-18],[-12,-29],[-3,-3],[-7,-7],[-17,-14],[-6,9],[-2,4],[-2,4],[-3,19]],[[2751,2876],[-1,5],[-9,15],[-21,36],[-12,19],[-8,13]],[[2700,2964],[17,14],[31,26]],[[2748,3004],[9,7],[7,5],[13,10],[3,3],[6,5],[16,13],[6,5],[2,3],[4,5],[3,3],[3,3],[3,2]],[[2823,3068],[6,5],[33,28]],[[2862,3101],[46,-78],[5,-10],[6,-27],[3,-9],[6,-14],[21,-35]],[[2949,2928],[18,-33]],[[2901,3123],[-20,-9]],[[2881,3114],[-19,-13]],[[2823,3068],[-40,64],[-4,28],[-10,12],[40,30]],[[2809,3202],[18,1],[29,20],[3,0]],[[2859,3223],[5,-11],[-25,-20],[11,-19],[22,-35],[2,-2],[3,0],[23,10],[1,-23]],[[2386,3567],[-23,7],[1,-3],[0,-3],[0,-2],[0,-3],[-1,-2],[0,-2],[0,-2],[-1,-2],[-1,-2],[-1,-1],[-1,-2],[-1,-1],[-2,-3],[-1,-2],[-8,9],[-16,24],[12,10],[5,6],[4,3],[2,-2],[3,2],[6,6],[1,0],[13,12],[1,1],[0,1],[6,4],[11,15],[-1,2],[0,1],[-1,2],[-1,4],[-1,4],[-2,9],[0,3],[-1,2],[-1,2],[-1,1],[-1,1],[-1,1],[-1,0],[-1,0],[-1,1],[-1,0],[-1,-1],[-2,0],[-1,-1],[-2,-1],[-2,-2],[-4,-3],[-3,-4],[-8,-7],[-15,-14],[-1,-1],[-6,-5],[-4,-3]],[[1693,3865],[4,2],[6,2],[11,0],[3,-2],[6,-4],[4,-6],[4,-4],[7,-5],[3,2],[7,6],[2,0],[5,-5],[1,-1],[5,-3],[6,-1],[3,2],[2,1],[2,7],[5,17],[3,8],[9,18],[6,8],[4,6],[10,9],[4,4],[11,5],[12,3],[10,1],[8,3],[10,1],[7,0],[3,-1],[10,-2],[17,-8],[11,-7],[26,-12],[11,-4],[6,0],[4,-1],[3,-1],[15,-1],[29,0],[44,-5],[8,-1],[30,-5],[10,0],[10,-2],[15,4],[15,-2],[3,-1],[7,-5],[4,-8],[4,-5],[6,-3],[7,-1],[7,2],[12,1],[6,2],[4,-1],[5,3],[18,8],[10,1],[13,1],[4,-1],[2,-1],[0,-5],[-2,-10],[-2,-4],[-8,-17],[2,-9],[0,-3],[1,-2],[11,-4],[17,-17],[17,-24],[21,-18],[40,-21],[10,-6],[9,-9],[7,-4],[5,-3],[0,-7],[5,-23],[-1,-3],[2,-3],[4,-5],[6,-9],[3,-10],[7,-20],[3,-4],[4,-4],[6,-1],[5,-6],[0,-1],[1,-5],[-1,-10],[-2,-9],[-2,-6],[-5,-7],[-11,-10],[-18,-17]],[[1274,3378],[2,27],[1,14],[-1,11],[1,8],[13,33],[6,10],[4,5],[7,4],[7,3],[8,4],[10,8],[4,14],[8,3],[21,-2],[5,3],[3,2],[2,0],[7,-7],[4,0],[13,3],[10,6],[12,10],[9,13],[9,12],[7,10],[12,11],[7,10],[3,13],[1,23]],[[1806,2151],[-14,-10],[-7,-4],[-17,-9]],[[1768,2128],[-12,-5],[-9,-3],[-10,-4],[-7,-6],[-10,-7],[-4,-3],[-22,-14],[-16,-11],[-12,-12]],[[1666,2063],[-10,-7],[-9,-4],[-17,-6],[-16,-6]],[[1614,2040],[-9,-3],[-8,-5],[-5,-3],[-34,-25],[-2,-2],[-5,-3],[-39,-29],[-16,-12],[-11,-9],[-15,-14],[-7,-4],[-5,-2],[-5,-1],[-9,2],[-11,1],[-11,2],[-15,3],[-13,1],[-18,-1],[-12,-1],[-1,8],[-2,4],[-7,13],[-1,1],[-1,1],[-1,0],[-2,0],[-4,-1],[-7,-1],[-2,-1],[-1,0],[-1,-1],[1,-13],[-1,0],[0,-1],[0,-1],[0,-2],[0,-2],[0,-2],[0,-2],[-16,-1],[-8,-1],[-11,-4],[-8,-2],[-10,-3],[-6,0],[-3,1],[-4,1],[-4,2],[-27,19],[-7,5],[-29,21],[-11,6],[-4,2],[-5,2],[-5,2],[-1,0],[-2,-1],[-2,0],[-2,-1],[-13,-8],[-25,-17],[-10,-6],[-3,-2],[-7,-4],[-27,-18],[-66,-43],[-59,-38],[-38,-24],[-55,-35],[-15,-9],[-19,-12],[-19,-11],[-7,-5],[-2,-6],[0,-5],[0,-5],[7,-18],[6,-18],[1,-6],[0,-5],[-1,-10],[-2,-4],[-10,-18],[-4,-7],[-3,-7],[-1,-5],[-2,-7],[-3,-16],[-2,-11]],[[790,1603],[-10,5]],[[780,1608],[5,4],[2,9],[0,11],[-1,5],[-4,5],[0,3],[4,7],[6,2],[11,14],[2,10],[0,9],[-2,5],[0,9],[-1,1],[-2,4],[-36,0],[-7,2],[-8,7],[4,8],[6,1],[0,9],[-3,9],[-7,5],[-7,3],[-5,8],[-8,9],[-7,12],[-5,3],[-5,2],[-25,0],[-3,2],[-9,9],[-7,-2],[-5,-3],[-7,2],[-7,11],[-8,17],[-7,16],[-1,11],[-3,7],[-4,2],[-3,-2],[-1,-2],[-1,-9],[-2,-6],[-6,-4],[-13,0],[-8,1],[-11,15],[-5,10],[-2,11],[0,10],[0,10],[2,7],[8,12],[1,0],[2,-5],[-6,-9],[-1,-5],[1,-3],[4,-1],[4,4],[3,0],[4,-2],[2,-6],[5,-2],[4,0],[9,9],[3,8],[12,12],[5,2],[4,-9],[7,-1],[7,2],[3,5],[6,-1],[2,2],[0,9],[3,8],[8,12],[5,7],[5,10],[4,9],[-1,10],[-1,7],[-3,7],[-3,6],[-5,6],[-6,0],[-3,1],[-5,3],[-5,2],[-10,-3],[-15,-8],[-9,-3],[-9,1],[-7,6],[0,4],[-2,7],[6,8],[5,9],[0,7],[-1,9],[-4,15],[-1,6],[4,9],[6,2],[6,1],[6,-1],[3,-4],[2,-9],[6,-5],[5,0],[8,1],[8,6],[10,10],[0,11],[1,10],[5,8],[5,12],[0,3],[-1,1],[0,5],[3,2],[3,0],[3,-6],[2,-1],[5,0],[2,4],[14,11],[11,0],[7,1],[3,1],[3,4],[-1,2],[-5,3],[-5,7],[-3,11],[-4,8],[0,5],[3,5],[6,2],[3,3],[3,7],[2,10],[-2,9],[-4,3],[-5,-6],[-6,-3],[-5,-2],[0,4],[1,1],[5,6],[3,18],[5,4],[1,9],[3,9],[5,3],[5,8],[10,12],[3,6],[3,12],[4,5],[5,4],[8,0],[6,5],[5,7],[9,8],[8,-1],[1,0],[3,1],[7,6],[9,17],[13,11],[2,-5],[6,-8],[6,-4],[7,1],[6,-7],[1,0],[5,4],[9,4],[1,2],[5,1],[12,15],[6,1],[12,0],[18,14],[10,0],[4,2],[9,0],[4,-4],[6,-1],[9,2],[5,5],[8,5],[8,2],[13,1],[1,-16],[7,-16],[2,-9],[2,-8],[2,-7],[8,-13],[2,-3],[4,-7],[8,-9],[8,-7],[5,-3],[4,-2],[18,-20],[-4,-11],[-4,-5],[-5,-7],[-3,-12],[9,-12],[4,-7],[6,-2],[7,3],[3,4],[6,-4],[2,-5],[0,-18],[-2,-8],[-7,-15],[-1,-4],[0,-1],[0,-8],[2,-13],[7,-14],[1,-4],[9,-15],[2,-24],[14,-30],[2,-7],[12,-23],[3,-10],[3,-1],[3,1],[2,0],[6,-11],[0,-6],[3,-4],[6,-3],[8,3],[8,-4],[7,-6],[13,-2],[7,1],[5,2],[7,-2],[10,-5],[4,-5],[1,-7],[5,-6],[12,-14],[5,-7],[5,-1],[3,-3],[1,-2],[2,-3],[10,0],[5,2],[6,4],[6,3],[7,1],[2,4],[3,2],[5,3],[6,24],[4,3],[6,-1],[16,0],[11,4],[4,3],[4,5],[2,2],[0,-3],[-3,-4],[-2,-2],[-1,-2],[1,-4],[2,-9],[4,-9],[9,-6],[13,-2],[27,1],[5,-12],[2,1],[8,0],[7,1],[6,-2],[10,5],[20,22],[7,10],[-3,12],[-1,12],[6,10],[7,5],[6,-3],[5,-7],[5,-5],[3,1],[6,1],[7,5],[9,12],[14,29],[3,5],[5,13],[11,20],[4,12],[4,6],[9,2],[11,3],[4,3],[-1,6],[-1,5],[1,3],[12,6],[3,-1],[6,4],[3,-2],[4,1],[2,-1],[2,-1],[5,4],[20,13],[2,0],[3,-3],[4,-4],[12,-4],[9,-1],[4,1],[5,8],[4,15],[2,8],[-1,17],[3,3],[7,0],[12,13],[7,3],[23,1],[8,3],[6,0],[3,-2],[4,-1],[6,4],[-2,5],[0,3],[11,10]],[[1787,2228],[-10,-8],[4,-16],[25,-53]],[[1955,2280],[-10,-6],[-6,-3],[-14,-10],[-11,22],[-6,-4],[-33,-21],[-1,-3],[0,-3],[11,-21],[3,-2]],[[1888,2229],[-15,-24],[-2,-2],[-19,41],[-2,1],[-13,-9],[-12,-7],[-2,0],[-6,11],[-3,11]],[[1814,2251],[4,6],[3,0],[3,-1],[1,-10],[4,-4],[5,-1],[4,7],[8,22],[2,3],[14,20],[0,6],[4,9],[4,4],[1,0],[5,-6],[17,16],[8,0],[8,-4],[5,-5],[7,-6],[2,2],[5,6],[1,10],[-1,3],[2,1],[2,2]],[[1932,2331],[0,-1],[23,-50]],[[1685,1876],[-5,9],[-9,19]],[[1671,1904],[86,54]],[[1757,1958],[21,-45],[-17,-12],[-33,-21],[-6,-8],[-12,11],[-4,10],[-11,-7],[-10,-10]],[[1808,1847],[-32,-20],[-19,-11],[-18,-12]],[[1739,1804],[-14,31],[-6,8],[-9,10],[-10,9],[-8,7],[-7,7]],[[1757,1958],[33,21]],[[1790,1979],[11,-24]],[[1801,1955],[-15,-9],[0,-3],[8,-17],[21,-47],[0,-2],[-2,-2],[-14,-9],[9,-19]],[[1892,1898],[-50,-31],[-34,-20]],[[1801,1955],[11,8],[5,3],[14,8],[2,0],[1,-1],[10,-22],[16,10],[22,-47],[10,-16]],[[1926,1919],[-34,-21]],[[1790,1979],[25,17],[2,1],[4,3],[5,3],[10,8]],[[1836,2011],[22,19],[26,29]],[[1884,2059],[12,-25],[-9,-7],[-8,-8],[37,-79],[10,-21]],[[7184,3585],[-31,26],[-4,10]],[[7149,3621],[14,27],[7,10],[-7,5]],[[7163,3663],[7,12],[12,24],[12,24],[13,22],[12,21]],[[7294,3707],[-14,-13],[-9,-8],[-11,-11],[-22,-18],[-17,-15],[-8,-8]],[[7213,3634],[-5,-4],[-3,-5],[-1,-3],[-7,-13]],[[7197,3609],[-10,-16],[-1,-4],[-2,-4]],[[7163,3663],[-56,42]],[[7107,3705],[6,11],[12,25],[13,24]],[[7138,3765],[11,22],[13,22]],[[7162,3809],[57,-43]],[[7041,3571],[73,17],[4,8],[31,25]],[[7184,3585],[-8,-15],[-3,-6],[-8,-15]],[[7041,3571],[3,15],[5,12],[15,26],[1,2]],[[7078,3651],[12,20],[12,23],[5,11]],[[7197,3609],[41,-30],[14,23],[1,1]],[[7253,3603],[4,-4],[1,-1],[3,-3]],[[7261,3595],[-8,-18],[-44,-84]],[[7213,3634],[34,-27],[1,-1],[5,-3]],[[7279,3582],[-18,13]],[[7337,3728],[1,-7],[1,-2],[1,-2],[3,-2],[39,-31],[23,-15]],[[7405,3669],[-15,-27],[-26,-16],[-24,-13],[-21,-10],[-18,-13],[-12,-16]],[[7467,3693],[-7,1],[-10,1],[-11,-4],[-4,-1],[-3,-2],[-6,-1],[-8,-2],[-6,-3],[-7,-13]],[[7417,3758],[11,3],[53,8],[19,2],[8,0]],[[7508,3771],[0,-7],[-13,-9],[1,-24],[5,-1],[11,-7],[-36,-26],[-9,-4]],[[7621,3366],[-86,59],[-6,-8],[-57,37],[-6,-12],[-79,53]],[[7467,3693],[3,-5],[27,-23],[4,-5],[21,-12],[16,28]],[[7538,3676],[34,8],[12,-13],[-3,-36],[17,-23],[23,-5],[29,-10],[-9,-13],[-2,-16],[50,-51],[-68,-151]],[[7508,3771],[35,5],[14,2]],[[7557,3778],[27,1]],[[7584,3779],[49,-8]],[[7633,3771],[4,0],[4,-1],[2,-1],[11,-3],[7,1],[23,11],[9,2]],[[7693,3780],[2,0],[2,0],[3,-1],[9,-6],[8,-5]],[[7717,3768],[-3,-8],[-1,-3],[-5,-9],[-2,-3],[-2,-2],[-8,-8],[-1,-1],[-2,-2],[-3,-2],[-3,-1],[-4,-1],[-9,1],[-53,3],[-33,-1],[-3,0],[-4,-1],[-3,-1],[-3,-2],[-4,-3],[-7,-7],[-3,-4],[-11,-18],[-12,-19]],[[7583,3811],[12,-9],[5,9],[39,-29],[-6,-11]],[[7584,3779],[2,7],[-13,9],[-3,1],[-12,9],[9,18]],[[7567,3823],[16,-12]],[[7583,3811],[20,41]],[[7603,3852],[14,-10],[39,-29]],[[7656,3813],[18,-12],[19,-21]],[[7603,3852],[13,22],[5,10]],[[7621,3884],[3,-2],[9,-7],[2,-2]],[[7635,3873],[10,-7],[20,-14],[9,-6]],[[7674,3846],[-6,-12],[-6,-11]],[[7662,3823],[-5,-9],[-1,-1]],[[8132,4257],[13,22]],[[8145,4279],[8,-6],[26,-20],[8,-6]],[[8187,4247],[-5,-8],[-8,-14]],[[8132,4257],[-11,9],[-36,27],[-9,7],[-7,6],[-2,2]],[[8067,4308],[-27,20],[-2,2],[-8,6]],[[8030,4336],[13,22],[9,16]],[[8052,4374],[10,16]],[[8062,4390],[8,-6],[27,-22],[2,-1],[8,-7],[56,-43]],[[8163,4311],[-9,-16],[-9,-16]],[[8118,4233],[-11,8],[-35,28],[-7,-11],[-6,-11]],[[8059,4247],[-9,7]],[[8050,4254],[-9,7]],[[8041,4261],[6,11],[6,11],[7,12],[7,13]],[[8093,4189],[-10,8],[6,11],[6,12],[-36,27]],[[8082,4170],[-10,8],[-28,21],[-8,6],[-9,7]],[[8027,4212],[11,20],[12,22]],[[8052,4120],[-9,7],[5,9],[5,9],[-45,34]],[[8008,4179],[5,10],[5,8],[9,15]],[[8035,4095],[-5,9],[-6,5],[-30,22],[-9,7]],[[7985,4138],[8,15],[5,9],[1,2],[4,7],[5,8]],[[7985,4138],[-10,7],[-28,21],[-9,7]],[[7938,4173],[13,24]],[[7951,4197],[11,18]],[[7962,4215],[7,-6],[39,-30]],[[7962,4215],[9,18],[9,15]],[[7980,4248],[10,-7],[1,-2],[22,-16],[5,-4],[9,-7]],[[2022,1996],[-6,1],[-32,-19],[-9,-7]],[[1975,1971],[-1,6],[-16,34],[-10,21],[-17,36],[-3,6],[-3,0],[-15,-20],[-9,19],[-1,5]],[[1900,2078],[18,23],[46,53]],[[1964,2154],[17,-20],[2,-2]],[[1983,2132],[13,-28],[11,-24],[-17,-14],[10,-23],[11,-24],[11,-23]],[[1900,2078],[-48,103],[-4,-3],[-13,-9],[-2,-1],[-12,-8],[-15,-9]],[[1787,2228],[5,4],[11,5],[5,6],[6,8]],[[1888,2229],[9,13],[11,-23],[-14,-19],[-1,-3],[31,-66],[33,34],[7,-11]],[[1900,2078],[-16,-19]],[[1836,2011],[-13,27]],[[1823,2038],[12,8],[7,7],[26,31],[2,2],[0,2],[0,3],[-3,7],[-6,11],[-25,-19],[-5,-4],[-2,-3],[-3,-4],[-13,12],[-4,4],[-3,3],[-8,14],[-2,2],[-18,-9]],[[1778,2105],[-10,23]],[[7785,4046],[-12,-22]],[[7773,4024],[-10,7],[-10,7],[-8,-15],[-1,-2],[-10,7],[-10,8]],[[7724,4036],[9,18],[12,22]],[[7745,4076],[30,-23],[10,-7]],[[7773,4024],[-8,-15],[-2,-3],[-8,-15],[-1,-2]],[[7754,3989],[-9,-16],[-10,-17]],[[7735,3956],[-39,29]],[[7696,3985],[10,17],[9,17],[9,17]],[[7713,3916],[-10,8],[-19,14],[-9,8]],[[7675,3946],[6,11],[6,11],[9,17]],[[7735,3956],[-10,-18],[-5,-10],[-7,-12]],[[7675,3946],[-3,2],[-8,7],[-9,6],[-1,1],[-9,7],[-9,8],[-9,7],[-17,12]],[[7632,4035],[24,-19],[11,-7],[27,-22],[2,-2]],[[7675,3946],[-14,-26]],[[7661,3920],[-3,1],[-2,0],[-8,6],[-9,7],[-9,7],[-19,13],[-17,13]],[[7661,3920],[-12,-22]],[[7649,3898],[-14,-25]],[[7621,3884],[-6,5],[-9,6],[-17,13],[-17,12],[-3,2]],[[7700,3892],[-12,-22]],[[7688,3870],[-10,7],[-1,1],[-18,13],[-9,7],[-1,0]],[[7713,3916],[-13,-24]],[[7617,4078],[14,-10],[9,-8],[-3,-6],[38,-29],[13,24],[5,11]],[[7693,4060],[10,-8],[9,-6],[9,-8],[3,-2]],[[7654,4145],[14,-11]],[[7668,4134],[36,-26],[10,-8]],[[7714,4100],[-4,-8],[-8,-15],[-4,-9],[-5,-8]],[[7714,4100],[8,15],[8,17],[2,6]],[[7732,4138],[23,-17],[8,-6],[2,-2]],[[7765,4113],[-7,-13],[-4,-9],[-9,-15]],[[7668,4134],[8,16],[5,10],[6,12]],[[7687,4172],[45,-34]],[[7687,4172],[9,19],[10,-7],[11,21],[-10,7],[7,13],[6,13]],[[7720,4238],[37,-28],[2,-1],[5,-2],[1,-1],[1,-1]],[[7766,4205],[-7,-15],[-6,-12],[-11,-22],[-10,-18]],[[7766,4205],[3,-2],[5,-4],[17,-12],[8,-6],[3,-2]],[[7802,4179],[-8,-14],[-8,-13]],[[7786,4152],[-11,-22],[-10,-17]],[[7810,4195],[-8,-16]],[[7766,4205],[9,16],[5,10],[5,10]],[[7785,4241],[7,12],[8,-7],[17,-13],[8,-6],[3,-2]],[[7828,4225],[-6,-11],[-12,-19]],[[7720,4238],[5,9],[5,8],[5,10],[6,10],[44,-34]],[[7840,4247],[-12,-22]],[[7720,4238],[-36,26],[-3,5],[-8,9],[-4,5],[-5,3],[-20,16]],[[7644,4302],[37,53],[1,1]],[[7682,4356],[8,-7],[8,-9],[19,-15],[86,-50]],[[7803,4275],[9,-7],[16,-13],[9,-7],[3,-1]],[[7687,4172],[-29,22],[-14,10]],[[7596,4242],[9,8],[6,8],[18,25],[13,17],[2,2]],[[7591,4344],[20,-15],[3,-1],[28,-21]],[[7642,4307],[-2,-3],[4,-2]],[[7596,4242],[-4,3],[-19,15],[-16,11],[-5,2]],[[7552,4273],[8,14],[6,11],[6,11],[6,11],[-67,52]],[[7511,4372],[6,12],[6,11]],[[7523,4395],[68,-51]],[[7591,4344],[6,10],[5,10],[6,12]],[[7608,4376],[33,-24],[22,-16],[-9,-12],[-6,-9],[-6,-8]],[[7523,4395],[6,10],[5,10],[7,11]],[[7541,4426],[39,-29],[28,-21]],[[7541,4426],[6,12],[8,13]],[[7555,4451],[7,14],[6,12]],[[7568,4477],[37,-27],[31,-23]],[[7636,4427],[-6,-12],[-8,-14],[-7,-13],[-7,-12]],[[8574,3762],[-30,-96],[-18,-58],[-9,-42],[-3,0],[-5,0],[-4,-2]],[[8433,3609],[13,36],[10,31],[8,18],[8,17]],[[8472,3711],[7,14],[7,14],[2,3]],[[8472,3711],[-6,5],[-4,3],[-5,4],[-2,2],[-12,10],[-8,5],[-16,-28],[-5,-9],[-24,18]],[[8390,3721],[20,38]],[[8410,3759],[8,14],[9,15]],[[8359,3664],[5,10],[7,12],[4,8],[7,12],[8,15]],[[8360,3787],[24,-18],[20,-15],[6,5]],[[8068,3836],[8,15],[4,8],[6,12]],[[8129,3839],[-11,-20],[-9,-15],[-8,7],[-25,19],[-8,6]],[[8059,3820],[5,8],[4,8]],[[533,371],[-1,-3],[-1,-6],[-3,-6],[-2,-4],[-5,-11],[-5,-9],[-2,-3],[-2,-5],[-2,-7],[-1,-3],[-1,-6],[-1,-5],[-1,-7],[0,-5],[0,-7],[0,-5],[0,-6],[1,-8],[2,-10],[1,-5],[2,-15],[0,-4],[0,-3],[0,-2],[-1,-4],[-1,-6],[-1,-3],[-3,-7],[-2,-6],[-1,-4],[0,-4],[-1,-5],[0,-7]],[[502,180],[0,-3],[3,-10],[1,-3]],[[506,164],[-2,-2],[-5,-3],[-10,-8],[-7,-6],[-7,-7],[-7,-8],[-10,-11],[-8,-10],[-6,-11],[-4,-6],[-8,-16],[-9,-18]],[[423,58],[-1,1],[-5,3],[-5,-4],[0,-4],[-3,2],[-18,14],[-23,19],[-30,17],[-6,1],[-1,3],[3,0],[33,-17],[26,-22],[2,5],[-15,16],[3,1],[23,-16],[16,-13],[2,5],[-15,9],[-17,14],[-19,30],[0,3],[4,4],[1,7],[-1,6],[3,10],[0,9],[6,14],[2,3],[1,7],[0,2],[-1,5],[-14,19]],[[374,211],[19,37]],[[393,248],[7,-11],[11,-16],[5,-8],[4,-6],[13,-19],[5,11],[21,39],[17,35],[18,33],[3,5],[14,25],[7,14],[9,17],[-1,6],[5,-4],[2,2]],[[393,248],[-2,3],[-4,6],[-6,14],[4,7],[9,16],[15,30],[18,34],[-24,17],[-24,18],[-21,16],[-3,2],[-70,53],[-1,0],[-1,0],[-2,-1],[-3,0],[-3,4],[-13,22],[-8,15],[-10,15],[-4,8],[-30,33],[-19,19],[-10,11],[-4,5],[-3,3],[-2,3],[-4,11],[-3,8],[-1,11],[0,2],[-1,3],[0,7],[5,1],[8,1],[21,3],[18,2],[10,1],[10,0],[10,0],[10,-1],[42,-5],[12,-2],[41,-5],[4,-1],[50,-6],[59,-8]],[[463,623],[4,-6],[64,-126],[1,-5]],[[532,486],[0,-2],[0,-6],[-1,-8],[0,-17],[1,-11],[3,-25],[1,-13],[1,-4],[0,-7],[-1,-8],[0,-3],[-1,-2],[-1,-5],[-1,-4]],[[790,1603],[48,-45],[181,-263]],[[1019,1295],[-32,-16],[-7,15],[-18,-11],[-70,-42],[8,-20],[-77,-58],[-12,20],[-35,-27],[-72,50],[-19,-33],[-37,-19],[-9,30],[-42,-26],[-5,-68],[-25,-15],[-4,-64],[-45,38],[-148,-241],[27,-17],[3,-8],[62,-154],[1,-6]],[[374,211],[-1,2],[-3,1],[-3,6],[-3,2],[-4,2],[-4,7],[-2,3],[-8,10],[-5,13],[-5,8],[-3,2],[-13,16],[-4,7],[-6,20],[-8,13],[-6,9],[-2,6],[-1,8],[-6,12],[-4,6],[-5,4],[-10,6],[-4,-2],[-8,-8],[-3,0],[-3,5],[-7,1],[-1,8],[-7,11],[-3,8],[-4,3],[-5,7],[-4,0],[-3,-5],[-3,-1],[0,3],[2,5],[2,14],[0,9],[2,5],[2,1],[0,2],[1,3],[2,-3],[8,1],[5,5],[5,7],[5,14],[0,12],[0,5],[-3,12],[-4,9],[-4,6],[-2,7],[-4,3],[-4,1],[-7,-3],[-11,-1],[-7,4],[-5,6],[-4,10],[-2,8],[-9,13],[-2,-1],[-2,-2],[-8,-11],[-3,-7],[-4,-10],[-1,-8],[-2,0],[-2,4],[3,10],[-2,9],[0,6],[-1,3],[-5,5],[-3,1],[-1,6],[2,4],[0,3],[-17,29],[-6,13],[-6,9],[-3,2],[-6,0],[-7,0],[-1,-1],[-3,-1],[-14,-3],[-3,-11],[0,-4],[-4,-4],[-9,1],[-5,-4],[-8,-4],[-3,4],[0,7],[0,5],[-1,4],[-2,2],[-3,1],[-4,-2],[-5,-4],[-6,-5],[-5,-4],[-3,-1],[-3,-2],[-1,1],[0,-3],[-3,1],[-1,2],[-9,2],[-2,-1],[0,-3],[-2,-2],[-3,0],[-2,12],[1,4],[19,3],[0,3],[0,2],[-2,2],[-5,-1],[-6,-1],[-4,-1],[0,3],[-1,4],[-2,6],[0,3],[5,2],[2,-1],[2,1],[2,6],[5,14],[2,8],[5,8],[3,4],[4,3],[4,5],[4,4],[11,0],[14,-7],[4,-4],[2,-11],[2,-7],[5,-8],[7,-4],[4,-1],[3,-3],[3,1],[6,0],[9,1],[4,1],[3,0],[0,2],[-3,5],[1,7],[4,7],[2,10],[4,10],[-3,6],[-3,2],[0,4],[2,4],[3,11],[0,8],[-3,12],[-10,10],[-8,9],[-5,3],[-11,3],[-3,3],[-1,3],[-3,0],[-5,1],[-6,7],[-15,1],[-4,-7],[-4,-1],[-5,2],[-5,9],[-3,10],[-2,9],[-6,14],[2,35],[0,13],[-1,3],[0,4],[-2,8],[5,13],[4,9],[4,12],[-5,5],[-2,3],[0,3],[2,1],[7,-3],[7,2],[3,15],[-1,5],[-10,12],[0,5],[3,8],[5,18],[2,11],[5,8],[3,9],[3,13],[1,15],[2,12],[2,15],[3,9],[1,18],[6,22],[1,6],[3,28],[0,1],[2,3],[1,2],[6,-6],[1,0],[2,-2],[-3,-6],[1,-1],[2,-1],[3,5],[2,-1],[5,12],[2,-1],[-3,-7],[2,-1],[6,12],[9,40],[13,15],[9,3],[6,6],[18,-7],[6,-3],[7,2],[5,8],[4,8],[2,10],[-1,7],[-4,7],[-4,13],[-9,36],[-2,11],[0,4],[1,10],[2,4],[1,1],[3,2],[3,2],[0,3],[2,2],[7,2],[1,3],[2,0],[1,-10],[-1,-10],[13,-7],[3,-14],[1,-4],[5,1],[7,5],[6,6],[2,3],[1,3],[1,3],[4,3],[6,2],[5,0],[6,-8],[0,-5],[4,-3],[3,-1],[4,4],[3,9],[3,3],[2,1],[3,0],[7,10],[2,1],[2,-1],[1,-1],[3,1],[3,1],[1,3],[-5,8],[2,2],[5,-8],[2,0],[2,2],[4,0],[3,-4],[3,2],[2,4],[2,2],[2,0],[1,4],[13,8],[4,0],[8,-4],[5,-1],[3,1],[8,4],[5,1],[7,5],[4,7],[3,10],[1,11],[-1,9],[-4,9],[-5,7],[-7,1],[-3,-1],[-5,0],[-24,14],[-6,8],[-2,7],[2,6],[6,5],[4,1],[27,-1],[8,1],[10,7],[11,3],[8,0],[7,-1],[5,-7],[4,-9],[6,-7],[9,-13],[8,-1],[9,3],[22,0],[12,-1],[5,1],[8,3],[8,5],[5,4],[-1,7],[-13,10],[-1,5],[22,-1],[-1,2],[-3,5],[-5,3],[-3,4],[5,0],[9,-4],[7,4],[12,4],[4,5],[3,11],[0,9],[-4,5],[-3,2],[-13,7],[-3,2],[-3,1],[-5,0],[-13,7],[1,7],[6,13],[6,5],[7,0],[4,0],[3,-4],[5,-1],[3,0],[4,5],[5,11],[2,4],[4,5],[5,7],[8,7],[11,10],[3,1],[3,-9],[1,-2],[12,1],[4,-4],[4,-6],[3,-2],[5,-1],[1,1],[1,5],[1,1],[2,0],[0,-7],[0,-4],[3,0],[2,3],[2,-3],[1,-2],[5,-1],[8,1],[-1,3],[4,6],[7,2],[2,-6],[6,-1],[9,-6],[6,-14],[21,-4],[11,-6],[9,-2],[7,-1],[6,7],[6,0],[9,-2],[6,4],[7,12],[15,12],[2,9],[7,3],[7,14],[6,-12],[9,-1],[1,2],[-6,4],[-1,3],[1,6]],[[919,1105],[19,9],[-8,23],[1,1],[18,10],[49,25],[5,2],[4,2],[11,2],[5,1]],[[1023,1180],[28,-74],[-18,-11],[-19,-12],[-15,-9],[-1,-1],[-1,-1],[0,-1],[-1,-1],[-1,-1],[0,-2],[-3,-9],[-13,-49],[-1,-2],[-1,-4],[0,-1],[-1,-2],[-1,-2],[-2,-1],[-2,-1],[-5,-3],[-4,-2],[-5,16],[-1,2],[0,2],[1,1],[0,2],[2,11],[-8,3],[-2,2],[-1,1],[-1,1],[-1,3],[-3,7],[-6,16],[-18,47]],[[919,1105],[-9,24],[-8,20],[-14,34],[0,3],[1,1],[17,9],[19,11],[-8,20],[-7,17],[0,2],[1,0],[0,1],[0,1],[58,30],[2,0],[2,0],[1,-1],[4,-8],[1,-3],[1,-4],[1,-1],[0,-1],[-1,-1],[-8,-4],[7,-21],[18,9],[26,-63]],[[4094,3309],[23,-28],[-33,-36],[6,-6]],[[4090,3239],[-20,-5],[-13,-16],[-5,-4],[-5,1],[-5,2],[-4,5],[-9,20],[-3,9],[-5,8]],[[4021,3259],[16,16]],[[3947,3388],[8,4],[8,6]],[[3989,3344],[-5,5],[-37,39]],[[4025,3298],[-17,-13],[-2,0],[-12,10],[-12,15],[-4,2],[-5,1],[-4,-2],[-5,-3],[-6,-1],[-10,-14],[-1,-2],[-1,-9]],[[3946,3282],[-24,2],[-7,2],[-22,25],[-9,7],[-36,13],[-6,1],[-2,0],[-4,-2],[-11,-7],[1,3]],[[3826,3326],[10,7],[3,12],[3,13],[-48,15]],[[3794,3373],[-3,1]],[[3791,3374],[3,9],[7,26]],[[3801,3409],[2,-1],[72,-25],[14,-3],[15,-1],[5,0],[6,1],[16,2],[10,3],[6,3]],[[1702,1781],[9,-20],[16,10],[3,0],[21,-47],[32,-68]],[[1783,1656],[8,-18],[-1,-3],[-15,-20],[-7,-8],[-11,-18]],[[1757,1589],[-8,7],[-4,1],[-19,-2],[-25,-10],[-10,-4],[-4,-3],[-5,-5],[-9,22]],[[1673,1595],[15,12],[33,13],[-3,26]],[[1718,1646],[0,4],[-2,9],[-5,12],[-7,-3],[-31,-17],[-12,-7],[-9,-5],[-3,-1],[-2,2],[-6,19],[-8,23],[-7,23],[-3,6],[-5,11],[-2,5],[2,2],[31,20],[12,8],[41,24]],[[1757,1589],[-6,-11],[-4,-4],[-29,-21],[-37,-28],[-4,-2],[-2,-2],[-8,-3],[-6,-1],[-2,26],[0,8],[-2,27],[1,4],[12,11],[3,2]],[[1515,1277],[-13,1],[-3,0],[-4,-2],[-17,39],[-2,5],[-30,-19],[-1,0],[0,-1],[3,-19],[0,-1],[1,-1],[1,0],[1,0],[13,7],[1,0],[1,0],[1,0],[1,-1],[1,-1],[8,-17],[2,-5],[1,-5],[4,-27],[1,-1],[5,2],[3,0],[4,0],[8,-1],[1,-5],[2,-14],[1,-9],[-2,-26]],[[1507,1176],[-9,1],[-11,1]],[[1487,1178],[-3,4],[2,34],[-10,5],[-11,51],[-11,-7],[-9,2],[-8,15],[-5,32],[-14,99],[26,13],[-9,52]],[[1435,1478],[45,25],[17,-37],[24,11],[-3,16],[42,12]],[[1560,1505],[5,-19]],[[1565,1486],[-4,-2],[-14,-6],[-9,-6],[-12,-6],[-42,-22],[6,-23],[7,-20],[6,-17],[4,-11],[3,-5],[5,-11],[5,-9],[4,-6],[1,-6],[1,-5],[-1,-6],[-2,-9],[-3,-15],[-5,-24]],[[1565,1486],[11,-56],[3,-18],[1,-9],[1,-5],[2,-13],[4,-22],[8,-45],[0,-20],[0,-10]],[[1595,1288],[-52,-11],[-11,-2],[-4,-1],[-13,3]],[[1595,1288],[2,-9],[6,-19],[8,-21],[-36,-19],[-4,-4],[-5,-3],[-7,-7],[-10,-12],[-3,-4],[-12,-23],[-4,3],[-9,3],[-5,2],[-3,1],[-6,0]],[[1832,1366],[-6,-5],[-12,-10],[-11,-8],[-4,-2],[-7,-3],[-2,-1],[-6,0],[-3,0],[-6,1],[-8,6],[-5,3],[-15,10],[-4,3],[-3,2],[-11,8],[3,4],[2,5],[1,4],[1,5],[2,5],[1,4],[0,6],[0,12],[4,0],[5,1],[2,1],[5,3],[4,2],[5,1],[3,1],[1,0],[2,2],[1,3],[5,-4],[2,0],[1,0],[1,0],[14,4],[1,0],[0,1],[0,1],[0,1],[-4,22],[-2,14],[-1,1],[0,1],[-1,1],[-14,2],[0,8],[1,16]],[[1774,1497],[8,-1],[2,0],[2,0],[1,1],[2,0],[2,1],[2,1],[2,2],[6,3],[18,11],[4,3],[2,-6],[2,-7],[1,-5],[0,-3],[0,-2],[-1,-1],[-1,-2],[4,-9],[1,-4],[14,-69],[1,-3],[0,-1],[-18,-13],[-2,-4],[0,-2],[0,-3],[2,-8],[0,-2],[4,-8]],[[1934,1567],[23,-37],[26,-44]],[[1983,1486],[-93,-74],[-2,-2],[-6,-6],[-3,-2],[-6,-5],[-15,-10],[-26,-21]],[[1774,1497],[-1,9],[-8,45],[1,6],[2,6],[13,19],[7,-6],[2,-2],[1,-2],[4,-7],[1,0],[1,0],[14,9],[1,1],[1,1],[0,1],[0,1],[0,1],[-8,18],[-2,3],[-6,6],[13,15],[3,1],[5,1],[-17,8]],[[1801,1631],[12,15]],[[1813,1646],[20,24],[22,2]],[[1855,1672],[1,-13],[5,0],[14,1],[13,1],[1,-1],[1,0],[0,-1],[1,0],[13,-29],[21,-45],[9,-18]],[[1861,1129],[-7,35],[-2,10],[-45,-6],[2,-12],[-15,-4]],[[1794,1152],[-162,-19],[-4,13]],[[1628,1146],[27,10],[6,2],[22,9],[19,9],[10,4],[16,8],[6,3],[-2,6],[-1,3],[-1,5]],[[1730,1205],[43,23],[5,3],[4,3],[6,-5],[16,9],[15,10],[12,9],[19,13],[23,17],[22,19],[23,18],[67,55],[21,17],[7,6],[14,11]],[[2027,1413],[3,-5]],[[2030,1408],[-22,-19],[1,-7],[14,-64]],[[2023,1318],[-11,-5],[-23,-8],[19,-95],[-31,-17],[-14,4],[-19,-2],[-14,51],[-19,-10],[-9,-9],[1,-3],[-14,-6],[16,-73],[-44,-16]],[[1956,1014],[-20,-6],[-16,-5],[-20,-6]],[[1900,997],[-2,11],[-1,5],[2,5],[3,5],[-9,11],[-1,3],[-1,4],[-3,14],[-9,42],[-5,23]],[[1874,1120],[-13,9]],[[2023,1318],[1,-3],[5,-25],[5,-23],[-19,-5],[3,-15],[0,-5],[-4,-10],[-1,-5],[2,-6],[3,-3],[6,-8],[2,-5],[2,-8]],[[2028,1197],[-15,-4],[-6,-2],[-4,-1],[-10,-7],[-6,-6],[-7,-5],[-10,-11],[-3,-3],[-4,-4],[-2,-1],[-5,-2],[-14,-6],[-6,-4],[-2,-2],[-2,-2],[-2,-3],[-3,-6],[-1,-3],[-2,-8],[-1,-7],[0,-11],[0,-13],[14,1],[3,-2],[1,-4],[1,-3],[14,-64]],[[1874,1120],[-22,-9],[6,-25],[5,-22],[2,-11],[1,-5],[0,-5],[-1,-9],[-1,-1],[-1,-1],[-1,-1],[-1,0],[-24,6],[-22,5],[1,10],[0,9],[0,9],[-5,21],[-6,27],[-6,27],[-2,0],[-1,1],[0,1],[0,1],[0,1],[1,0],[-3,3]],[[1900,997],[14,-65],[72,-11],[9,-12],[5,-4],[-2,-2]],[[1998,903],[-54,-16],[-40,-10],[-47,-12],[-45,-12],[1,-6]],[[1813,847],[-136,-37],[-38,-8],[-32,-9],[-54,-17]],[[1553,776],[-46,314],[-1,2]],[[1506,1092],[0,1],[7,3],[12,6],[16,8],[19,9],[19,8],[9,4],[16,6],[24,9]],[[2040,958],[4,-7],[4,-5],[10,-8],[3,-2],[3,-5],[3,-11],[-69,-17]],[[1956,1014],[8,2],[2,0],[1,0],[3,-2],[28,-22],[7,17]],[[7827,2883],[-1,2],[-31,15]],[[7795,2900],[-50,27]],[[7745,2927],[13,22],[3,1],[2,4],[3,3]],[[7766,2957],[2,4],[1,2],[7,10],[8,9]],[[7784,2982],[21,-21],[20,-19],[7,-7],[9,-9],[9,-9]],[[7850,2917],[-3,-5],[-14,-20],[-2,-3],[-4,-6]],[[2028,1197],[20,4],[21,4]],[[2069,1205],[13,3],[4,-1],[3,-2],[2,-5],[4,-35],[1,-24]],[[2096,1141],[3,-24],[0,-6],[0,-3],[-1,-4],[-1,-3],[-4,-5]],[[1830,564],[-15,90]],[[1815,654],[-23,137],[-2,10],[1,4],[2,1],[28,7],[-1,5],[-1,4],[-1,3],[-1,5],[-2,7],[-2,10]],[[1813,847],[66,16]],[[1879,863],[3,-17],[1,-4],[0,-3],[1,-4],[0,-3],[3,-2],[2,-7],[-1,-3]],[[1888,820],[3,-9],[5,-15],[5,-18],[21,-101]],[[1922,677],[18,-86]],[[1940,591],[-36,-9],[-42,-9],[-19,-4],[-13,-5]],[[2004,847],[5,-26],[12,-61],[0,-3],[0,-2],[-1,-1],[-1,-1],[-4,-3],[-5,-3],[-10,-3],[6,-29],[-19,-11],[-23,-12],[-9,-5],[-12,-4],[-21,-6]],[[1888,820],[25,7],[22,5],[34,9],[4,0],[5,-2],[6,-2],[5,1],[4,2],[6,4],[5,3]],[[2077,670],[-5,-3],[-30,-27],[-12,-10],[-11,-8],[-12,-8],[-17,-9],[-10,-4],[-18,-5],[-22,-5]],[[2004,847],[21,5],[43,11],[5,-23],[5,-22],[5,-24],[6,-29],[-17,-11],[-3,-1],[0,-3],[5,-21],[-18,-10],[-2,-3],[0,-4],[4,-20],[3,-1],[9,5],[7,-26]],[[1962,486],[-1,4],[0,17],[-4,9],[-4,10],[-13,65]],[[2077,670],[15,8],[14,5],[26,9],[4,1],[30,10],[16,5],[5,3],[4,2],[3,1],[5,3],[6,4],[5,4],[5,4]],[[2215,729],[4,5],[9,10]],[[2228,744],[35,-8],[37,-30]],[[2300,706],[-2,0],[-10,-1],[0,-2],[-15,-8],[7,-17],[-5,-2],[-8,12],[-2,-1],[-2,-1],[-1,-3],[-3,-5],[-4,-5],[-6,-10],[-8,-9],[-7,-3],[-7,-3],[-5,-3],[-16,-5],[-4,9],[-4,1],[-2,-2],[-2,-6],[-8,0],[0,-4],[-3,-2],[-5,1],[-1,3],[-2,0],[0,-5],[0,-2],[-2,-1],[-5,-1],[-2,4],[-1,1],[-4,0],[-17,-5],[-3,-1],[-5,-4],[-4,-2],[-8,-7],[-6,-5],[-2,-3],[1,-6],[0,-2],[-3,-2],[-2,0],[-3,1],[-14,0],[-2,0],[-1,-2],[0,-4],[-1,-2],[-1,-1],[-1,1],[-3,4],[-7,0],[-5,3],[-6,0],[-2,-3],[-13,-8],[-5,-11],[-6,-4],[-4,-5],[-3,-2],[-8,-6],[-6,-3],[-5,-5],[-4,-8],[-2,-10],[-3,-8],[-5,-8],[-4,-5],[-2,-4],[-2,-8],[-2,-3],[-16,-1],[-3,-2],[-7,-5],[-4,-4]],[[2537,873],[-28,28]],[[2509,901],[31,18]],[[2540,919],[68,41],[7,-27],[2,-12],[2,-3],[2,-1],[14,-3],[14,-4],[10,-3],[16,-8],[16,-10]],[[2691,889],[9,-5],[6,-4],[4,-4],[4,-2],[13,-10],[6,-6],[6,-2],[51,-24],[28,-13],[6,2],[5,3],[5,4],[4,7],[3,7],[1,8],[1,5],[0,1],[-1,4],[0,3],[3,1],[4,2],[5,3],[8,3]],[[2862,872],[11,3],[11,3],[5,2]],[[2889,880],[9,-7]],[[2898,873],[-4,-1],[-5,-5],[-12,-3],[-18,-8],[-2,-4],[0,-8],[-1,-5],[-1,0],[-3,1],[-4,-3],[-3,-2],[3,-3],[-2,-5],[5,-7],[-5,-6],[-4,3],[-7,-7],[-2,2],[-1,-2],[1,-2],[-4,-14],[-8,-7],[-10,-1],[-3,-4],[-4,-5],[-9,0],[-2,0],[1,20],[-3,13],[-1,1],[-3,-1],[-3,-3],[-2,1],[-7,5],[-1,1],[-7,1],[-3,1],[-2,2],[-7,4],[-7,2],[-9,4],[-4,4],[-3,0],[-2,2],[-2,2],[-3,9],[-1,11],[-2,5],[-6,3],[-6,5],[-5,-2],[-6,3],[-3,3],[-14,8],[-9,7],[0,1],[-1,1],[-7,1],[-5,1],[-14,8],[-6,2],[-4,3],[-11,4],[-10,5],[-3,0],[-7,-1],[-5,-3],[-9,-6],[-2,-2],[-9,-4],[-20,-9],[-8,-6],[-7,-2],[-6,-7],[-2,-1]],[[1618,401],[-2,10]],[[1616,411],[-4,21]],[[1612,432],[15,23],[11,13],[9,8],[12,8],[6,4]],[[1665,488],[6,-35],[6,-30],[10,3],[24,6],[18,5],[6,2],[6,2],[10,1],[-14,83],[28,12],[43,18],[22,9]],[[1962,486],[-10,-12],[0,-4],[2,-4],[2,-3],[4,-13],[0,-4],[-1,-7],[1,-11],[-3,-8],[-11,-13],[-4,-2],[-20,-2],[-2,-1],[-8,0],[-3,1],[-4,6],[-7,14],[-3,4],[-1,4],[-5,2],[-4,10],[-2,4],[-3,4],[-3,0],[-9,-4],[-2,0],[-8,-2],[-6,-2],[-8,-5],[-9,-2],[-5,-7],[-10,-11],[-7,-10],[-4,-4],[-18,0],[-7,5],[-4,4],[-10,4],[-8,4],[-5,1],[-7,1],[-8,-1],[-9,-2],[-14,-6],[-7,-5],[-10,-2],[-12,-5],[-17,-3],[-13,3],[-13,2],[-23,0],[-6,-3]],[[1665,488],[22,14],[12,8],[9,4],[1,3],[-4,22],[-3,15],[-1,9],[-12,74]],[[1689,637],[6,1],[5,0],[4,1],[14,4],[15,3],[12,2],[14,1],[33,3],[23,2]],[[1612,432],[-14,74],[-20,109]],[[1578,615],[-16,112]],[[1562,727],[9,3],[22,7],[21,6],[11,-65],[4,-25],[13,3],[1,-5],[4,-21],[19,4],[12,3],[11,0]],[[1562,727],[-4,21],[-1,5],[-4,23]],[[1578,615],[-12,-7],[-24,-14],[-4,-2],[-6,-3],[-11,-3],[-11,-2],[-16,-9],[-16,-9]],[[1478,566],[-5,34],[-8,47],[-26,-14],[-7,33],[-5,-2],[-8,-4],[-13,-4],[-6,-1],[-3,-1],[-15,-3],[-7,-4],[-19,-11],[-26,-16],[-43,-26],[-13,-8]],[[1274,586],[-31,-18],[-16,-9],[-12,-7],[-2,-3],[-1,-1],[-1,-3],[0,-1],[0,-4],[1,-12],[-1,-4],[-1,-3],[-3,-3],[-4,-2],[-3,0],[-3,0],[-3,0],[1,-12],[-34,-20],[-28,-17],[-7,-4],[-9,-5],[-11,-8],[-13,-9],[-3,-3],[-6,-4],[-2,-1],[-4,-2],[-48,-29],[0,-1]],[[1030,401],[-9,19],[-26,-16],[-40,-24],[-1,-1],[-1,-1],[0,-1],[-12,-118],[-28,3],[-12,-128],[0,-3],[0,-5],[2,-8],[5,-14]],[[908,104],[-9,-3],[-7,-2],[-7,-1],[-8,0],[-23,-1]],[[854,97],[4,44],[9,91],[3,33],[5,93],[-1,4],[21,226],[4,2],[7,3],[3,1],[4,2],[4,1],[1,1],[1,1],[5,2],[2,1],[2,2],[6,3],[2,1],[1,1],[1,0],[8,7],[4,2],[5,4],[8,7],[9,7],[1,1],[2,2],[4,4],[7,6],[1,1],[21,18],[19,17],[2,2],[3,3],[11,10],[24,21],[24,21],[1,1],[2,2],[19,17],[57,51],[14,12],[13,12],[4,3],[1,1],[1,1],[12,11],[12,11],[7,6],[8,7],[41,36],[35,31],[3,3],[5,4],[19,18],[24,21],[20,18],[9,8],[17,15],[7,6],[13,10],[16,12],[6,4],[5,4],[8,5],[5,3],[4,2],[5,3],[4,3],[6,3],[4,2],[8,4]],[[1478,566],[-24,-14],[-7,-5],[-14,-9],[-12,-5],[-25,-12],[-20,-8]],[[1376,513],[-12,-4],[-22,-15],[-24,-16],[-10,-7],[-11,-8],[-22,-10]],[[1275,453],[-2,3],[-1,15],[-1,14],[0,10],[0,8],[3,16],[2,11],[0,10],[0,10],[0,11],[-2,25]],[[2801,2509],[-8,14],[-43,35],[-3,3],[-21,35],[9,8],[3,6],[12,31],[20,-11],[11,-5]],[[2857,2557],[-5,-3],[-19,-17],[-32,-28]],[[3801,3409],[3,11],[2,-2],[8,-9],[3,0],[10,15],[10,-3],[4,-1],[2,0],[1,-1],[2,0],[2,7],[-2,5],[-26,26],[-59,63],[-13,-1],[-3,0],[-2,14],[-1,9]],[[3801,3409],[-36,12]],[[3765,3421],[-3,4],[-9,9],[-47,48],[-56,57],[-2,9]],[[3648,3548],[12,-2],[10,-3],[30,-6],[16,-2],[6,2],[10,4],[10,1]],[[3626,3472],[24,-11],[34,-12],[19,-6],[49,-18],[13,-4]],[[3791,3374],[-69,29]],[[3722,3403],[-59,23],[-37,46]],[[3794,3373],[-12,-48]],[[3782,3325],[-1,0],[-1,1],[-15,16],[6,8],[4,15],[-1,3],[-34,12],[-5,-7],[-6,-8],[-17,-14],[-2,-3],[0,-2],[10,-16],[17,-23],[12,-16]],[[3749,3291],[-16,-15],[-5,-6],[-6,-10],[-6,-16],[-3,-14]],[[3713,3230],[-18,5],[4,21],[4,16],[0,5],[-1,4],[-16,23]],[[3686,3304],[-6,9],[-7,10],[-71,-56],[-7,11]],[[3595,3278],[49,40],[61,74],[5,9],[12,2]],[[3782,3325],[-5,-20],[-3,-7]],[[3774,3298],[-7,-1],[-10,-1],[-8,-5]],[[3713,3230],[-1,-24]],[[3712,3206],[-35,11],[-10,2],[-11,-1],[-10,-2],[-2,-2],[0,-3],[1,-3],[17,-20],[2,-3],[-16,-10],[-19,23],[-3,9],[-3,1],[-16,-6],[-2,-3],[0,-3],[2,-3],[27,-31],[-16,-13]],[[3618,3149],[-15,17],[-14,17],[-7,14],[-5,12]],[[3577,3209],[16,10],[6,3],[17,7],[-5,15],[27,22],[16,12],[32,26]],[[3712,3206],[-1,-60]],[[3711,3146],[5,-45]],[[3716,3101],[-39,-6],[-11,-5],[-13,-9]],[[3653,3081],[-7,21],[-6,17],[-3,7],[-6,8],[-13,15]],[[3577,3209],[-16,-12],[-3,-4],[-10,-12],[-3,-7],[-4,-15],[-1,-10],[-2,-17],[-2,-10],[-6,-12],[-6,-9],[1,-1],[8,-15],[13,-24],[-1,-2],[-13,-10],[-10,18],[-13,24],[-10,-8],[-7,-6],[-5,-9]],[[3487,3068],[-10,5],[-11,3],[-13,0],[-9,-2],[-7,-3],[-9,-6],[-9,-7],[-16,-13],[-18,-14]],[[3385,3031],[-39,66]],[[3346,3097],[-25,44]],[[3321,3141],[18,14],[5,-10],[151,119],[27,-41],[73,55]],[[3321,3141],[-29,48]],[[3292,3189],[18,14],[20,16],[13,10]],[[3343,3229],[28,-47],[20,17],[20,16],[131,103],[1,2],[-1,4],[-12,20],[-14,23]],[[3516,3367],[22,16],[32,26],[26,21],[-94,34],[-79,30],[-12,21]],[[3411,3515],[-4,7],[-7,21]],[[3528,3531],[15,-10],[56,-35],[17,-9],[10,-5]],[[3343,3229],[11,9],[10,8],[20,16],[10,8]],[[3394,3270],[68,54],[21,16],[20,16]],[[3503,3356],[13,11]],[[3394,3270],[-14,23],[12,10],[-12,20],[-3,7],[-3,4],[-12,19],[-12,-9]],[[3350,3344],[-13,24],[68,54]],[[3405,3422],[20,18],[20,17],[23,-41],[12,-20],[12,-20],[11,-20]],[[3292,3189],[-25,42]],[[3267,3231],[-10,18]],[[3257,3249],[18,14],[-3,10],[-1,9],[1,9],[3,8],[11,18],[20,-16],[7,11],[6,6],[4,4],[27,22]],[[3257,3249],[-20,36],[13,10],[-6,11],[-13,-11],[-8,14],[-2,3]],[[3221,3312],[22,17],[-3,6],[-2,6],[0,21],[33,30],[5,5],[10,9],[15,14],[16,14],[22,-32],[17,13],[10,8],[16,12]],[[3382,3435],[11,8],[12,-21]],[[3382,3435],[-23,32],[-10,-9],[-18,20]],[[3331,3478],[-11,11],[13,18],[14,-15],[1,0],[2,0],[17,17],[10,11],[3,4],[3,0],[20,-7],[8,-2]],[[3331,3478],[-17,-16],[-48,49],[-54,56],[-25,25],[8,3],[7,4],[9,3],[13,2]],[[3224,3604],[17,-19],[29,-11],[68,-26],[-46,55]],[[3292,3603],[9,0],[7,0]],[[9039,4992],[-6,1],[-27,7],[-17,5],[-13,4],[-7,4],[-39,21],[-14,3],[-17,9]],[[8899,5046],[5,12],[4,11],[17,-9],[4,12],[5,12],[-17,9],[-9,5]],[[8908,5098],[8,24],[9,23]],[[8925,5145],[5,12],[4,12],[6,14],[0,3],[2,7]],[[8942,5193],[7,3],[6,1],[4,-1],[6,1],[5,0],[6,-1],[3,-1],[13,9],[1,0],[4,10],[3,5]],[[9000,5219],[3,-1]],[[9040,5199],[-24,-47],[4,-4],[-3,-9],[6,-5],[-2,-4],[19,-12],[5,12],[4,-2],[36,72],[-2,2],[25,45],[5,-3],[-18,-41],[4,-6],[1,-4],[-3,-10],[-3,-3],[-3,-6],[-3,-6],[-2,-5],[3,-5],[7,-11],[0,-3],[0,-3],[0,-3],[3,-3],[2,5],[38,59],[11,-9],[-75,-125],[-13,-25],[-23,-48]],[[8942,5193],[-9,4],[-15,8],[-9,5]],[[8927,5255],[60,-30],[3,-2],[10,-4]],[[8474,3994],[10,-7],[14,-12]],[[8498,3975],[26,-20]],[[8446,4016],[12,22],[8,-6],[13,-10],[8,-6]],[[8487,4016],[24,-19],[-13,-22]],[[8418,4037],[9,16],[3,6],[7,13],[9,14],[13,24]],[[8459,4110],[27,-21]],[[8486,4089],[10,-7],[18,-15]],[[8514,4067],[-6,-11],[-15,-28],[-6,-12]],[[8597,4005],[2,-1],[1,-1],[1,-1],[3,-3],[-2,-7],[5,-1],[3,-1],[12,-4],[12,-3]],[[8634,3983],[-13,-66],[6,-2],[-7,-34]],[[8514,4067],[17,-13],[16,-12],[10,-9],[4,-1],[5,-4],[19,-14],[6,-4],[6,-5]],[[3440,1055],[-2,1],[-17,26],[-5,3],[-5,3],[-6,-1],[-7,-3],[-8,-10],[-4,-8],[-3,-9],[-57,-8],[-6,-8],[-3,-2],[-2,-3],[-9,-6],[-1,-3],[-2,-1],[-4,-5],[-3,0],[-6,6],[-3,1],[-7,0],[-1,4],[-2,0],[-7,0],[-4,-2],[-12,-3],[-5,-1],[-10,0],[-5,-1],[-2,-3],[-3,-3],[-11,2],[-1,1],[-4,4],[-2,1],[-4,-1],[-10,-4],[-6,-5],[-3,-3],[-8,-5],[-6,-1],[1,-3],[-3,-4],[-7,-4],[-5,0],[-1,-1],[0,-2],[-1,-2],[0,-1],[2,-4],[0,-1],[-6,-14],[-1,-4],[1,-3],[17,-12],[-7,-7],[0,-5],[-4,-5],[-14,-6],[-6,-2],[-34,-20],[-5,-5],[-2,-3],[-10,-9],[-4,-7],[8,-11],[5,-7],[0,-4],[7,-4],[-1,-2],[7,-7],[2,2],[3,-2],[-6,-10],[-2,1],[-1,0],[2,-2],[1,-4],[-1,-2],[-14,-22],[-6,0],[-5,2],[-8,0],[-4,4],[-2,4],[-2,2],[-7,2],[-5,-2],[-9,-7],[-4,-1],[-12,-10],[-8,-9],[-3,-2],[1,-10],[3,-9],[1,-9],[0,-6],[-2,-4],[-4,-1],[-4,0],[-4,2],[-7,5],[-5,8],[-1,3],[0,4],[1,7],[6,11],[0,7],[-2,5],[-1,7],[-1,5],[1,7],[2,3],[-1,6],[-5,8],[-5,8],[-2,5],[-2,0],[-1,0],[-1,1],[-2,5],[-1,0],[-8,0],[-7,2],[-6,0],[-3,4],[-2,0],[-8,-2],[-4,0],[-4,5],[-9,4],[-4,-2],[-1,0],[-3,0],[-3,4],[-5,3],[-4,-3],[-6,-1],[-6,0],[-3,-1],[0,-1]],[[2889,880],[5,1],[12,4],[-5,22],[22,7],[8,-30],[10,-4],[5,-1],[7,-1],[-5,45],[5,1],[13,4],[20,7],[14,5],[21,7]],[[3021,947],[11,-49],[13,4],[4,3],[4,4],[4,4],[3,3],[15,8],[8,3],[26,7],[16,3],[6,2],[3,1],[3,3],[2,5],[5,10],[2,8],[1,11],[1,7],[4,9]],[[3152,993],[7,10],[6,6],[8,6],[9,6],[6,4],[8,3],[7,3],[6,1],[7,-1],[8,-1],[6,1],[3,0],[19,4],[5,1],[10,0],[14,-1],[8,-1],[8,2],[8,5],[15,18]],[[3320,1059],[22,26],[11,12],[19,21],[11,13],[6,7],[10,9],[8,6],[13,6]],[[3420,1159],[5,4],[20,-86],[-5,-22]],[[2889,880],[3,18],[-16,73],[-53,204],[-1,4]],[[2822,1179],[2,1],[9,4],[1,0],[34,16],[34,16],[20,9],[17,7],[14,6],[27,11],[1,-4],[1,-6],[2,-16]],[[2984,1223],[3,-19],[5,-32],[6,-23],[3,-13],[2,-9],[7,-22],[14,-55]],[[3024,1050],[16,-66],[8,-27],[-27,-10]],[[3024,1050],[19,8],[3,2],[23,7],[20,7],[20,7]],[[3109,1081],[4,-14],[9,-23],[4,-18],[3,-1],[3,-3],[20,-29]],[[3120,1129],[-6,-1],[-5,-2],[-2,-1],[-2,-3],[-1,-4],[0,-6],[5,-31]],[[2984,1223],[8,1],[4,-1],[14,-3],[9,-1],[13,-1]],[[3032,1218],[0,-2],[2,-10],[4,-17],[0,-2],[1,-2],[1,-1],[1,0],[20,-3],[7,0],[19,6],[4,1],[2,-3],[13,-17],[4,-6],[4,-6],[2,-6],[2,-7],[1,-9],[1,-5]],[[3120,1129],[2,2],[10,3],[32,10],[34,11]],[[3198,1155],[24,10],[11,8],[25,17],[17,11],[7,5],[17,11]],[[3299,1217],[1,-3],[2,-8],[0,-2],[1,-5],[0,-5],[-18,-12],[-1,-2],[0,-3],[0,-2],[16,-64],[5,-24],[4,-15],[2,-4],[9,-9]],[[3032,1218],[6,1],[14,4],[9,1],[8,0],[8,0],[3,1],[2,-1],[0,7],[3,10],[2,7],[4,5],[3,4],[22,16],[4,3],[5,10],[2,7],[33,10],[1,-1],[0,-1],[4,-15],[5,-20],[6,-22],[8,-33],[3,-12],[11,-44]],[[2822,1179],[0,1],[-5,18]],[[2817,1198],[114,52],[45,19],[45,20],[49,23],[20,8]],[[3090,1320],[27,11],[95,42]],[[3215,1375],[2,-11],[3,-13],[0,-1],[3,-13],[1,-3]],[[3224,1334],[1,-4],[23,7],[-2,-7],[0,-5],[1,-2],[10,-40],[6,-24],[6,-23],[23,8],[26,10],[7,4],[-5,21],[-6,23],[-11,48],[24,12],[39,22],[25,-104]],[[3391,1280],[-31,-21],[-61,-42]],[[3224,1334],[1,0],[3,1],[29,9],[5,2],[7,2],[14,5],[10,4],[10,4],[16,8],[9,5],[11,6],[8,4],[8,5],[12,8],[4,3],[12,7],[9,7],[11,8],[5,3],[13,8],[14,10],[7,5],[18,12],[13,9],[1,-4],[1,-3],[0,-2],[20,-81]],[[3495,1379],[-20,-19],[-4,-7],[-4,-7],[-3,-8],[-1,-8],[-2,-12],[-1,-18],[-15,1],[-12,-4],[-22,-7],[-9,-3],[-11,-7]],[[3948,1440],[2,-9]],[[3950,1431],[-5,0],[-2,1],[-3,5],[-3,8],[-9,5],[-2,3],[-10,9],[-6,4],[-4,4],[-3,2],[-15,5],[-3,3],[-4,0],[-14,0],[-8,6],[-3,2],[-7,4],[-24,15],[-5,2],[-11,3],[-8,1],[-2,-1],[-12,-8],[-13,1],[-3,7],[-4,3],[-10,3],[-2,3],[-3,1],[-13,4],[-36,-1],[-5,2],[-24,2],[-4,-5],[-1,-6],[-5,-1],[-4,3],[-8,0],[-11,-3],[-5,-7],[-5,0],[-2,1],[-7,0],[-10,-7],[0,-12],[-11,-10],[-16,-11],[-21,-20],[-2,-7],[2,-5],[2,-8],[-2,-3],[-2,-11],[-3,-8],[-5,-6],[-13,-12],[-5,-2],[-7,6],[-3,-2],[0,-3],[-13,-8],[-3,1],[-3,-2],[-19,-15],[-11,-12],[-8,-9],[-3,-8],[0,-6],[6,-2],[2,-8],[2,-12],[-4,-15],[-7,-22],[-4,-3],[-9,-20],[0,-4],[6,-20],[1,-7],[0,-9],[-2,-16],[-2,-5],[-2,-1],[-1,-1],[0,-3],[-4,-13],[-1,-9],[-1,-1],[3,-12],[0,-11],[0,-7],[6,-7],[5,-8],[12,-9],[1,-6],[1,-10],[-3,-1],[-4,0],[-3,-5],[0,-4],[-1,-6],[-6,-10],[-2,-6],[-4,0],[-4,-2],[-2,-4],[-5,3]],[[3420,1159],[-29,121]],[[3495,1379],[8,6],[9,5],[7,3],[4,2],[6,3],[6,6],[4,6],[5,10],[2,7],[2,8],[1,7],[1,7],[-1,6],[-1,5],[0,5],[1,6],[5,6],[4,3],[23,13],[5,3],[7,2],[4,3],[9,7],[5,3],[15,4],[5,3],[15,12],[5,2],[4,1],[3,-1],[5,0],[4,-1],[24,-1],[7,0],[6,1],[9,1],[2,0],[3,-1],[5,-1],[3,-1],[3,0]],[[3729,1529],[5,0],[4,-1],[9,-3],[12,-4],[3,-1],[6,-2],[6,-1],[3,1],[11,5],[5,1],[1,0],[4,-1],[1,0],[29,-12],[6,-3],[8,-7],[12,-7],[16,-7],[6,-2],[10,-2],[3,-1],[5,-2],[6,-2],[10,-6],[6,-5],[26,-21],[6,-6]],[[2801,2509],[-22,-21]],[[2779,2488],[-19,-15]],[[2760,2473],[-71,115]],[[2689,2588],[20,16],[7,8],[15,39]],[[2731,2651],[13,36],[4,7],[6,7],[5,5],[16,13]],[[2775,2719],[12,-20],[13,-24],[8,-13],[11,-6]],[[3648,3548],[-13,2],[-9,1],[-11,0],[-18,-2],[-16,1],[-16,2],[-4,11],[-4,3],[-14,4],[-2,2],[-5,19],[-14,-10],[-2,0],[-43,17],[2,8],[-2,3],[-35,35],[-17,-22],[6,-6],[17,-7],[-6,-21]],[[3442,3588],[-3,4],[-14,12],[-100,116],[-46,48]],[[3279,3768],[8,4],[15,4],[9,4],[10,1],[0,2],[1,1],[11,0],[6,0],[11,-1],[6,-2],[17,-7],[16,-8],[4,-4],[5,-7],[3,-8],[4,-7],[5,-3],[8,-2],[21,0],[2,2],[3,3],[1,1],[27,1],[33,-1],[8,-2],[8,-5],[3,-3],[1,-14],[4,-9],[4,-12],[0,-33],[3,-21],[3,-12],[3,-30],[2,-7],[5,-5],[7,-4],[5,-1],[6,-3],[2,-2],[11,-18],[3,-2],[3,-4],[3,0],[2,1],[3,1],[24,-2],[10,-1],[23,-2],[29,-6],[12,-1],[7,-2],[15,-2],[6,1],[8,4],[7,2],[7,1]],[[5918,1454],[-47,1]],[[5961,1453],[-43,1]],[[5918,1320],[0,8],[0,6],[0,120]],[[5985,1452],[0,-32]],[[5985,1420],[1,-99]],[[5986,1321],[-23,0],[-22,0]],[[5985,1420],[20,0],[20,0],[20,0]],[[6045,1420],[1,-99]],[[6046,1321],[-20,0]],[[6026,1321],[-21,0],[-19,0]],[[6045,1420],[20,0],[20,0],[20,1]],[[6105,1421],[0,-70],[0,-30]],[[6105,1321],[-19,0],[-21,0],[-19,0]],[[6105,1321],[1,-64]],[[6106,1257],[-14,4],[-6,0],[-20,-1],[-20,-1],[-20,-2],[0,64]],[[6045,1420],[-1,67],[21,0],[20,-2],[9,-2],[9,-2],[3,-1]],[[6106,1480],[-1,-59]],[[6109,1506],[-1,-16]],[[6108,1490],[-1,-4],[-1,-6]],[[3833,2087],[-15,-12],[-3,-3],[-13,-10],[-3,-1],[-7,-4],[-15,-3],[-9,-4],[-6,-4],[-59,-48]],[[3703,1998],[-11,19],[-32,53],[-3,1],[-8,-6],[-6,-3],[-16,-4],[-5,11],[-12,19],[-11,17],[-21,35],[-15,-13]],[[3563,2127],[-11,18],[-11,20],[-30,-24],[-11,18],[-5,9],[-33,-26]],[[3462,2142],[-31,83],[-17,-14],[-8,-8],[-6,-13],[-15,-42],[-5,-9],[-6,-7],[-15,-13],[-32,-27],[-7,-5]],[[3320,2087],[-26,-23],[-45,-36]],[[3249,2028],[-31,-27],[-23,-21],[-2,-2],[-1,-3],[-12,-9],[-16,-14],[-17,-14],[-15,-12],[-25,-21],[-4,-2],[-12,-5],[-2,0],[-5,-2]],[[3084,1896],[-6,22],[-7,26],[-5,15],[-2,8],[-3,6],[-7,14],[-11,18],[-7,12],[-17,27],[0,1],[-3,5]],[[2940,2167],[-2,3],[-39,64]],[[2889,2260],[325,267]],[[3214,2527],[9,-22],[13,-27],[24,-39],[2,-3],[3,-5],[215,154],[36,31],[51,35],[37,22],[4,6]],[[3608,2679],[1,1],[11,-17],[4,-7],[8,-14]],[[3632,2642],[14,-25],[14,-23],[4,-6],[3,-5],[2,-5],[1,-1],[15,-25],[15,-25],[10,-17],[8,-12],[12,-22],[5,-10],[2,-4],[15,-26],[7,-12],[8,-14],[9,-14],[14,-24],[13,-20],[35,-61],[54,-93],[6,-9],[5,-8],[16,-24],[-36,-29],[-50,-41]],[[3214,2527],[-2,3],[-6,10]],[[3206,2540],[-13,18],[-12,19],[-3,5],[-9,16],[-17,29]],[[3152,2627],[-15,28]],[[3137,2655],[18,14],[4,3],[18,14],[5,3],[17,15],[4,3],[5,2],[1,1],[5,0],[16,0],[10,0],[12,0],[1,-24],[-1,-14],[31,-4],[0,-7],[1,0],[4,0],[14,-2],[5,0],[4,0],[4,1],[11,3],[11,4],[9,4],[4,3],[54,42]],[[3404,2716],[49,38],[48,37],[26,26],[3,3]],[[3530,2820],[75,-130],[2,-3]],[[3607,2687],[-3,-2],[1,-2],[3,-4]],[[3530,2820],[14,15],[-2,3],[9,10],[-14,23],[15,12]],[[3552,2883],[5,-3],[12,-21],[12,-19],[0,-6]],[[3581,2834],[10,2],[34,26],[43,-73],[-29,-23],[-3,-3],[-3,-8],[-1,-5],[9,-4],[2,-2],[10,-17],[2,-3],[-18,-14],[-8,-6],[-22,-17]],[[3054,2513],[4,4],[5,7],[2,4],[-12,17],[-6,6]],[[3047,2551],[55,47],[11,7],[39,22]],[[3206,2540],[-55,-46],[-5,-4],[-6,-2],[-6,-2],[-10,0],[0,-9],[-1,-5],[-3,-5],[-23,-19],[-3,0],[-11,18],[-29,47]],[[3047,2551],[-3,2],[-27,45]],[[3017,2598],[55,47],[-11,19],[19,16],[18,15],[2,7]],[[3100,2702],[12,-5],[3,-3],[11,-21],[11,-18]],[[3017,2598],[-12,19],[-14,-12],[-13,-11],[-3,1],[-20,20]],[[2955,2615],[-16,17]],[[2939,2632],[41,53],[7,11],[8,25]],[[2995,2721],[7,23]],[[3002,2744],[98,-42]],[[3047,2551],[-113,-95]],[[2934,2456],[-11,23],[-11,19],[-9,17]],[[2903,2515],[11,0],[6,-10],[15,13],[23,19],[-11,18],[16,13],[-7,10],[-15,16],[0,3],[14,18]],[[2913,2339],[14,12],[4,4],[3,6],[2,5],[0,12],[1,22],[1,24],[1,24],[-5,8]],[[3054,2513],[-16,-14],[-15,-13],[-16,-13],[38,-62],[1,-3],[-1,-3],[-13,-11],[-49,-40],[-10,2],[-2,-12],[-1,-2],[-13,-11],[-9,-8],[-14,-12],[-3,0],[-18,28]],[[2889,2260],[-10,16],[-13,21]],[[2866,2297],[10,8],[7,9],[15,13],[15,12]],[[2598,2003],[-63,103],[-3,4]],[[2532,2110],[11,11],[17,12],[12,7],[21,19],[46,39],[54,48],[23,20],[69,59],[5,4],[19,17],[15,12],[4,3]],[[2828,2361],[37,-61],[1,-3]],[[2730,2218],[-21,11],[-4,-10],[-2,-3],[-4,-3],[-22,-20],[0,-2],[12,-19],[0,-3],[-1,-2],[-14,-12],[-24,-21],[-27,1],[-21,1],[-1,-19],[0,-32],[5,5],[46,-2],[7,2],[9,4],[7,5],[38,33],[24,20],[5,6],[7,9],[5,13],[8,22]],[[2762,2202],[9,-3],[8,0],[9,1],[8,4],[8,6],[53,46],[-12,19],[-25,38],[-2,1],[-1,0],[-74,-63],[-1,-3],[-4,-9],[-2,-4],[-6,-17]],[[2751,2876],[-47,-38]],[[2704,2838],[-12,16],[-34,-28],[-15,-12],[-22,36],[-13,21],[-5,8],[-2,4]],[[2601,2883],[70,57]],[[2671,2940],[29,24]],[[2931,1675],[-1,-5],[0,-5],[2,-4],[3,-2],[16,-9],[3,-3],[9,-16]],[[2963,1631],[-3,-4],[-4,-5],[-3,-7],[-3,-8],[-7,1],[-6,-2],[-5,-2],[-4,-3],[-39,-32],[-4,-4]],[[2885,1565],[-4,6],[-8,15]],[[2873,1586],[44,37],[-94,31]],[[2823,1654],[49,41],[5,3],[4,1],[4,-1],[4,-3],[13,-11],[4,-2],[16,-5],[9,-2]],[[2988,1522],[-13,22],[-14,-13],[-3,0],[-26,43],[-17,-14],[26,-43],[0,-2],[-1,-2],[-14,-10],[-2,0],[-1,1],[-25,41],[-13,20]],[[2963,1631],[15,12],[51,42]],[[3029,1685],[14,12]],[[3043,1697],[11,-20],[16,-23],[10,-15],[16,-23],[-1,-2]],[[3095,1614],[-17,-15],[-18,-15],[-18,-15],[-18,-15],[-36,-32]],[[2845,1617],[-22,37]],[[2873,1586],[-9,6],[-8,5],[-5,8],[-6,12]],[[2716,1813],[2,-2]],[[2718,1811],[-13,-4],[-22,-7],[-25,-9],[-2,-1],[-13,-4],[-14,-5],[-58,-21],[-45,-16],[-29,-10]],[[2497,1734],[-1,7],[-2,6],[-3,9],[-3,9],[-3,8],[-9,15],[-4,7],[-4,6],[-2,5],[-7,20]],[[2459,1826],[42,21],[32,16],[-1,5],[-11,17],[-5,9],[-2,3],[-25,41],[-3,9],[-1,8],[-1,9],[0,5],[0,5],[2,11],[3,17],[4,16],[3,12],[0,4],[8,24]],[[2504,2058],[1,-4],[2,-2],[6,-10],[5,-9],[0,-7],[7,5],[10,8],[17,14],[0,1],[0,1],[0,1],[-11,18],[-17,27],[4,4],[4,5]],[[2459,1826],[-2,4],[-7,20],[0,1],[0,2],[0,2],[1,3],[2,10],[-1,5],[-1,4],[-3,5],[-11,22],[-10,22],[-5,6],[0,3],[-3,6],[-1,1],[-1,1],[-1,-1],[-3,-2],[-5,-5],[-3,2],[-2,1],[-2,1],[-2,2],[-2,3],[-1,1],[-6,9]],[[2390,1954],[17,12],[-2,4],[-2,4],[-3,2],[-5,4],[-4,3],[-1,0],[0,1],[0,1],[0,1],[1,1],[13,12],[1,0],[1,0],[5,-3],[1,0],[2,0],[31,27],[0,1],[2,0],[1,0],[10,-4],[8,29],[3,3],[3,4],[14,12],[18,-10]],[[2497,1734],[-12,-4],[-19,-7],[-33,-11],[-11,-4],[-11,-5],[-8,-3],[-6,-3],[-5,-3],[-4,-2],[-9,-5],[-5,-3],[-5,-3],[-6,-4],[-6,-4],[-5,-4]],[[2352,1669],[-3,6],[-3,4],[-7,11],[-10,18],[-23,41],[-25,39]],[[2281,1788],[-13,24],[-19,33],[-2,3]],[[2247,1848],[13,9],[4,3],[1,1],[4,2],[2,1],[2,1],[4,0],[5,0],[2,1],[1,0],[1,1],[2,1],[-7,13],[19,16],[16,14],[1,0],[1,0],[1,0],[10,-5],[1,0],[1,0],[1,0],[10,9],[48,39]],[[2247,1848],[-19,37],[-1,2],[-4,8],[-8,15],[-7,12]],[[2358,2080],[3,-5],[9,-14]],[[2370,2061],[-13,-13],[-20,-19],[0,-1],[0,-1],[0,-1],[11,-16],[20,-33],[2,-4],[2,-2],[4,-6],[3,-3],[2,-2],[5,-2],[2,-2],[2,-2]],[[2281,1788],[-3,-2],[-17,-14]],[[2261,1772],[-11,18],[-5,9],[-5,9],[-1,0],[-11,-9],[-17,-14],[-17,-13],[-12,20],[-17,-14],[-40,-31],[-17,-14]],[[2108,1733],[-7,12],[-2,4],[-1,2],[-2,6],[-3,13],[-1,7],[-2,9],[-2,2],[-9,17],[-5,9]],[[2074,1814],[131,103],[3,5]],[[2188,1714],[-30,-24],[-17,-13]],[[2141,1677],[-21,36]],[[2120,1713],[-12,20]],[[2261,1772],[-12,-10],[-61,-48]],[[2143,1500],[-3,5],[-1,2],[-3,4],[-24,42],[-5,9]],[[2107,1562],[71,56],[3,2],[1,1],[1,2],[0,1],[1,2],[4,11],[2,6],[5,16],[0,1],[1,2],[1,1],[14,11],[-11,20],[-12,20]],[[2352,1669],[-2,-1],[-1,-1],[-7,-5],[-19,-16],[-44,-36],[-11,-9]],[[2268,1601],[-38,-31],[-35,-28],[-26,-21],[-8,-7],[-18,-14]],[[2107,1562],[-12,19],[-12,20],[-11,21]],[[2072,1622],[52,41],[17,14]],[[7765,4113],[9,-6],[28,-21],[3,-3]],[[7805,4083],[-7,-13],[-5,-9],[-8,-15]],[[7864,4039],[-37,27]],[[7827,4066],[6,11],[5,7],[3,8],[4,7],[5,9]],[[7850,4108],[5,10],[8,13],[0,2]],[[7863,4133],[8,-6],[20,-15],[9,-6]],[[7900,4106],[-5,-9],[-2,-3],[-1,-2],[-6,-11],[-4,-8]],[[7882,4073],[-8,-16],[-4,-7],[-6,-11]],[[7910,4004],[-39,29],[-7,6]],[[7882,4073],[16,-12],[2,-2],[29,-22]],[[7929,4037],[-4,-8],[-4,-7],[-5,-7],[-6,-11]],[[7900,4106],[9,15]],[[7909,4121],[8,-6],[30,-23],[9,-6]],[[7956,4086],[0,-3],[-5,-8],[-8,-15]],[[7943,4060],[-7,-12],[-6,-10],[-1,-1]],[[7958,3968],[-48,36]],[[7943,4060],[47,-36]],[[7990,4024],[-7,-12],[-6,-12],[-4,-7],[-5,-7],[-4,-8],[-6,-10]],[[7956,4086],[5,10],[5,9]],[[7966,4105],[10,-7],[30,-22],[9,-7]],[[8015,4069],[-6,-10],[-5,-10],[-6,-9],[-8,-16]],[[7966,4105],[7,11],[12,22]],[[8035,4095],[-7,-3],[-7,-12],[-6,-11]],[[8061,4034],[-17,12],[-20,16],[-9,7]],[[8075,4061],[-2,-4],[-6,-12],[-6,-11]],[[8036,3990],[-7,5],[-30,23],[-9,6]],[[8061,4034],[-6,-10],[-5,-10]],[[8050,4014],[-6,-9],[-8,-15]],[[8486,4089],[18,31],[8,14],[13,24],[1,2],[4,7]],[[8530,4167],[19,-14],[10,-8],[21,37]],[[8580,4182],[14,26],[10,-8],[6,-5],[7,-5],[6,14],[3,-2],[3,-1],[6,-3],[-9,-46],[-3,-10],[-3,-13],[-3,-17],[0,-2],[-1,-9],[-3,-52],[-2,-19],[-14,-25]],[[8530,4167],[21,37],[10,18],[10,19]],[[8571,4241],[8,-5],[5,-4],[-6,-13],[-4,-7],[-9,-18],[15,-12]],[[8530,4167],[-14,11],[-14,11],[6,10],[9,17],[5,9]],[[8522,4225],[10,18],[10,18],[7,-5],[1,-1],[13,-9],[8,-5]],[[8522,4225],[-6,5],[-9,6],[-17,13]],[[8592,4282],[-11,-22],[-10,-19]],[[8419,4253],[-10,8],[-9,8],[-20,14],[-31,24]],[[8349,4307],[12,22]],[[8361,4329],[6,10],[0,1],[5,9],[8,14],[5,9]],[[8385,4372],[2,-1],[5,-4],[2,-1]],[[8394,4366],[57,-40],[8,-6]],[[8374,4175],[-20,15],[-18,16],[-17,13]],[[8319,4219],[-14,10]],[[8305,4229],[6,11],[6,10],[13,25],[-27,21]],[[8303,4296],[8,14],[5,9],[5,9]],[[8321,4328],[10,-7],[18,-14]],[[8354,4139],[-38,30],[-18,14]],[[8298,4183],[4,8],[6,9],[4,8],[7,11]],[[8374,4175],[-10,-18],[-10,-18]],[[8298,4183],[-35,27],[-11,8]],[[8252,4218],[4,21]],[[8256,4239],[5,25]],[[8261,4264],[10,-7],[1,-1],[33,-27]],[[8333,4102],[-50,39],[-29,22],[-11,8]],[[8243,4171],[6,29]],[[8249,4200],[3,18]],[[8354,4139],[-8,-14],[-7,-13],[-6,-10]],[[8313,4051],[-9,-24]],[[8304,4027],[-67,50],[-10,8]],[[8333,4102],[-10,-28],[-10,-23]],[[8359,4015],[-46,36]],[[8333,4102],[11,-8],[15,-11],[12,-10],[2,-3],[12,-9]],[[8385,4061],[-14,-24],[-12,-22]],[[8418,4037],[-17,13],[-6,3],[-8,6],[-2,2]],[[8408,4151],[18,-14],[30,-23],[3,-4]],[[8379,3968],[-32,26],[12,21]],[[8187,4247],[7,-6],[43,-32],[12,-9]],[[8187,4247],[9,16]],[[8196,4263],[7,-6],[36,-28],[6,-6],[7,-5]],[[8196,4263],[9,15]],[[8205,4278],[7,-6],[16,-12],[17,-14],[9,-6],[2,-1]],[[8163,4311],[33,-26],[9,-7]],[[2691,889],[2,4],[0,5],[-3,4],[-6,5],[-13,49],[16,6],[7,0],[7,-2],[20,7]],[[2721,967],[23,7]],[[2744,974],[16,5],[6,1],[5,0],[6,0],[5,-1],[11,-3],[22,-7],[26,-6],[21,-91]],[[2540,919],[-7,23],[-3,10],[-1,6],[-2,8],[-3,11],[-2,8],[-1,13],[-2,8],[-2,8],[-3,11]],[[2514,1025],[11,5],[38,14],[17,7],[6,3],[2,1]],[[2588,1055],[7,3],[18,8],[8,4],[9,7],[4,2],[5,3],[24,10],[1,0],[1,0],[1,-1],[3,-12]],[[2669,1079],[21,-85],[1,-1],[0,-1],[1,-1],[2,0],[19,7],[8,-31]],[[2509,901],[4,-14],[1,-4],[-1,-1],[-1,-2],[-24,-22],[-14,-13],[-2,-1],[-2,-1],[-1,0],[-1,0],[-1,1],[-6,9],[-10,13],[-1,2],[12,8],[13,7],[-7,22],[-7,23],[-10,-4],[-9,-5],[-19,-13],[-5,-3],[-11,-4],[-5,-1],[-4,6],[-2,4],[-2,3],[-9,10],[-4,4],[-4,3],[-9,7]],[[2368,935],[23,33],[3,4],[4,2],[32,14],[34,15],[30,14],[20,8]],[[6592,4365],[-3,-7],[-4,-10],[-2,-5],[-6,-12],[-5,-14],[-8,-19],[-3,-9],[-1,-3],[-1,-2],[-1,-2],[-1,-4],[-3,-7],[-2,-5],[-3,-7],[-3,-7],[-1,-4],[-2,-4]],[[6543,4244],[-1,-2],[-2,-4],[-2,-4],[-6,-11],[-2,-4],[-5,-9],[-1,-1],[-1,-2],[-1,-2],[-1,-3],[-1,-2],[-1,-3],[-1,-2],[-1,-2],[-1,-2],[0,-2],[-1,-3],[-1,-2],[-2,-9],[-2,-8],[0,-1],[-2,-7],[-3,-11]],[[6505,4148],[-2,-2],[-3,-2],[-2,-1],[-2,-1],[-2,-1],[-2,0],[-2,-1],[-3,0],[-1,0],[-1,1],[-1,2],[-1,2],[-1,1],[-1,2],[-1,1],[-1,2],[-1,1],[-2,1],[-1,2],[-2,1],[-1,1],[-1,1],[-1,1],[-2,1],[-2,1],[-3,1],[-3,2],[-2,0],[-4,1]],[[6454,4165],[-4,1],[-4,-13],[-6,2],[-10,5],[-12,6],[-16,8],[-18,9],[-20,9],[-11,5],[-33,16],[-21,10],[-6,3],[-8,4],[-8,3],[-14,7],[-11,6],[-6,3],[-7,3],[-7,3],[-13,7]],[[6219,4262],[-42,20]],[[6177,4282],[2,7],[1,4]],[[6204,4365],[6,30],[1,14],[2,14],[0,5]],[[6609,4409],[-2,-6],[-4,-11],[-5,-12],[-4,-9],[-2,-6]],[[6168,4189],[11,19],[8,14],[2,7],[0,2],[-1,1],[-13,6],[-13,6]],[[6162,4244],[13,34],[2,4]],[[6219,4262],[-26,-76],[-3,-7]],[[6146,4200],[3,8],[13,36]],[[3292,3603],[-60,72],[-12,11],[-19,18],[-12,20]],[[3189,3724],[0,4],[1,12],[2,4],[8,8],[9,7],[11,3],[8,1],[5,-1],[4,-2],[3,-1],[10,0],[8,4],[6,2],[1,-1],[4,0],[6,2],[4,2]],[[3224,3604],[-65,68]],[[3159,3672],[4,4],[7,17],[3,9],[5,10],[7,5],[4,4],[0,3]],[[3221,3312],[0,5],[11,9],[-3,4],[-10,-9],[-3,5],[-4,1]],[[3212,3327],[-2,4]],[[3210,3331],[9,6],[-8,14],[6,9],[58,44],[-110,173]],[[3165,3577],[-32,48]],[[3133,3625],[-1,2],[-11,13],[-23,35]],[[3098,3675],[2,-2],[9,-5],[9,-5],[21,0],[12,3],[7,5],[1,1]],[[3210,3331],[-8,14],[-34,58]],[[3168,3403],[4,3],[9,7],[4,2],[5,1],[14,3],[4,2],[6,3],[11,8],[14,13],[-30,45],[-14,21],[-3,2],[-2,1],[-14,1],[-22,1]],[[3154,3516],[-1,15],[-4,17],[-8,13]],[[3141,3561],[9,5],[15,11]],[[3168,3403],[-22,37]],[[3146,3440],[-4,8],[-13,22]],[[3129,3470],[15,12],[4,5],[3,5],[2,5],[1,6],[0,13]],[[2978,3381],[-26,55],[-8,20]],[[2944,3456],[40,13],[17,6],[13,5],[6,3],[7,4],[16,9],[14,8],[21,15],[13,8],[3,3]],[[3094,3530],[32,21]],[[3126,3551],[15,10]],[[3129,3470],[-3,-2],[-13,-8],[-21,-17],[-7,-6],[-8,-5],[-5,-3],[-1,-1],[-6,-4],[-7,-4],[-20,-10],[-25,-12],[-22,49],[-3,2],[-5,-1],[-6,-4],[-3,-4],[0,-5],[22,-45],[-18,-9]],[[3049,3625],[7,5],[50,-17],[-1,-16],[1,-4],[10,-23],[10,-19]],[[3094,3530],[-19,40],[-26,55]],[[3049,3625],[-8,15]],[[3041,3640],[-8,18]],[[3033,3658],[6,-2],[54,-16],[40,-15]],[[3033,3658],[-4,1],[-9,3],[-12,3],[-60,12],[-156,27]],[[2792,3704],[-113,19],[-42,8]],[[2637,3731],[22,72]],[[2659,3803],[17,3],[8,4],[8,1],[8,0],[8,-2],[25,-2],[4,-2],[27,-1],[18,-5],[3,-2],[6,0],[12,-2],[6,-3],[17,-2],[8,-1],[19,0],[12,0],[10,-2],[2,-3],[2,0],[4,0],[2,3],[5,3],[4,4],[1,5],[3,2],[16,6],[9,1],[1,-1],[6,0],[11,-3],[17,-7],[15,-11],[4,-3],[11,-15],[6,-2],[5,0],[5,-4],[23,-3],[4,-13],[4,-5],[4,-3],[4,-6],[6,-7],[8,-5],[4,-5],[8,-5],[10,-2],[12,-5],[3,-2],[0,-3],[-4,-5],[-1,-4],[3,-6],[5,-7],[1,-1]],[[2591,3556],[0,-13],[2,-12],[2,-9]],[[2595,3522],[-12,-5],[-5,-3],[-3,9],[-2,9],[-1,5],[1,20],[0,20],[1,16],[-1,7],[-3,7],[-8,18],[-13,-8],[-11,-5],[-19,-7],[-5,-3],[-24,-25],[-1,-4],[25,-55],[-10,-6]],[[2504,3512],[-8,-2],[-11,-3],[-7,-4],[-13,-9],[-22,-13]],[[2443,3481],[-13,25],[-1,2]],[[2429,3508],[4,2],[4,4],[3,10],[7,12],[5,10],[5,8],[6,9],[6,7],[7,8],[3,6],[3,4],[4,0],[4,6],[10,17],[2,3],[1,1],[22,12],[10,8],[5,6],[5,4],[4,4],[0,3],[2,6],[-2,22],[1,6],[1,5],[1,4],[1,6],[12,23],[4,11],[14,32],[11,15],[8,8],[14,2],[11,3],[13,4],[19,4]],[[2637,3731],[-2,-28],[-2,-17]],[[2633,3686],[-4,0],[-4,1],[-4,-1],[-3,-2],[-2,-3],[-2,-3],[-7,-34],[-7,-29],[-5,-29],[-4,-30]],[[2595,3522],[5,-14],[8,-17]],[[2608,3491],[-18,-9],[-18,-4]],[[2572,3478],[-4,-1],[-3,-1],[-4,-3],[-6,-6],[-21,-15],[-3,-4],[-4,-6]],[[2527,3442],[-15,12],[10,17],[-9,20],[-9,21]],[[2577,3262],[-4,-7],[-3,-8]],[[2570,3247],[-4,2],[-3,3],[-4,8],[-2,3],[-2,1],[-2,0],[-2,-1],[-3,-2]],[[2548,3261],[-14,29],[-18,38],[-10,23],[-3,-2],[-4,-2],[-3,0],[-4,2],[-35,25],[-5,11],[-33,69]],[[2419,3454],[2,6],[2,5],[5,5],[15,11]],[[2527,3442],[9,-8],[-12,-21],[10,-22],[-17,-11],[19,-40],[25,-54],[6,-11],[10,-13]],[[2582,3267],[-5,-5]],[[2572,3478],[8,-19],[-16,-11],[25,-54],[1,-4],[1,-3],[-1,-4],[-2,-5],[-5,-8],[-5,-4],[-6,-5],[-3,-2],[12,-27],[20,-46]],[[2601,3286],[-19,-19]],[[2757,3266],[-8,-5],[-1,-3],[-13,-10],[-6,-5],[-10,-8],[-5,-4],[-26,-25],[-10,13],[-21,-20],[-13,-14],[-16,-17]],[[2628,3168],[-31,68],[-9,20],[-6,11]],[[2601,3286],[11,10],[10,5],[6,3],[20,8],[18,8]],[[2666,3320],[27,11]],[[2693,3331],[21,-49],[9,-20],[28,16],[6,-12]],[[2634,3148],[-38,-46]],[[2596,3102],[-12,27],[-21,43],[-12,7]],[[2551,3179],[3,11],[8,28],[6,24],[2,5]],[[2628,3168],[11,-15],[-5,-5]],[[2678,3129],[-20,-9],[-2,0],[-5,5],[-6,10],[-11,13]],[[2757,3266],[2,-3],[7,-17]],[[2766,3246],[5,-7],[21,-16],[8,-8]],[[2800,3215],[-2,0],[-14,-18],[-19,-21],[-7,-7],[-7,-6],[-16,-10],[-23,-10],[-25,-10],[-9,-4]],[[2678,3129],[7,-21],[5,2],[10,4],[2,-2],[8,-26],[-1,-2],[-40,-17],[7,-23],[28,-45],[3,0],[29,24],[12,-19]],[[2671,2940],[-10,22],[-9,20],[-10,21],[-6,12],[-10,22],[-4,9],[-5,12],[-9,20],[-12,24]],[[2800,3215],[9,-13]],[[8632,4758],[-10,-26]],[[8622,4732],[-11,6],[-47,23],[-11,6]],[[8553,4767],[10,26]],[[8563,4793],[11,-5],[47,-24],[11,-6]],[[8563,4793],[5,13],[4,13]],[[8572,4819],[11,-5],[48,-24],[11,-5]],[[8642,4785],[-10,-27]],[[8572,4819],[9,23]],[[8581,4842],[11,-6],[39,-19],[9,-5],[10,-5]],[[8650,4807],[-8,-22]],[[2920,2824],[-68,-57]],[[2852,2767],[-16,-14],[-7,-3],[-6,-3],[-16,-5],[-8,-3],[-7,-6],[-17,-14]],[[2731,2651],[-19,10],[-11,6],[-12,9],[-13,12],[-13,15],[-10,13],[-7,12],[-8,13],[-11,18],[6,6],[3,4],[6,13],[3,5],[4,6],[5,4],[29,24],[21,17]],[[2847,2897],[-8,-22],[-8,-22],[-4,-9],[-1,-17],[0,-3],[6,-3],[6,-1],[7,-4],[6,-5],[6,-10],[17,15],[17,14],[16,13],[13,-19]],[[2689,2588],[-18,29],[-45,75],[-3,5],[-11,17],[-14,23],[-44,76],[-9,19],[-1,4]],[[2544,2836],[57,47]],[[2582,2544],[16,13],[-1,3],[0,3],[5,4],[6,5],[-10,20],[-8,19],[-14,19],[-6,25],[-6,23],[-10,22]],[[2554,2700],[-17,42],[-14,36],[0,4],[1,2],[-10,19],[27,30],[3,3]],[[2689,2588],[-3,-2],[-20,-17],[-14,-5],[-16,-7],[-12,-10],[-20,-17],[-10,-5],[-12,19]],[[2506,2663],[-5,10],[-12,30],[-18,-10],[-6,-4],[-9,-5],[-4,-1],[-8,-2],[0,6],[-1,3],[-2,9],[-5,14],[-11,-8],[-3,-1],[-2,0],[-2,2],[-7,11],[-5,6],[-3,1],[-2,-1],[-8,-12]],[[2393,2711],[-16,16],[-32,-45]],[[2345,2682],[-12,31],[10,11],[7,10],[5,7],[5,7],[7,11],[5,9],[2,4]],[[2374,2772],[2,3],[2,6],[4,10],[3,6],[5,16],[9,28],[6,20],[6,17],[11,19],[12,19],[30,33],[11,12],[12,14],[2,2]],[[2489,2977],[14,-34],[24,-63],[17,-44]],[[2554,2700],[-17,-13],[-25,-19],[-6,-5]],[[2506,2663],[22,-55],[4,-12],[3,-8],[1,-11],[-1,-9],[-4,-10],[-8,2],[-3,-1],[-17,-8],[-6,-3],[-6,0],[-7,2]],[[2484,2550],[-5,3],[-4,0],[-4,-1],[-3,-1],[-9,23],[-11,29]],[[2448,2603],[-2,6],[-1,16],[0,22],[-14,0],[-2,2],[-6,13],[-6,10],[-6,8],[-9,9],[-14,15],[5,7]],[[2448,2603],[-73,-26]],[[2375,2577],[-5,12],[-14,-8],[-6,-5]],[[2350,2576],[-14,-13],[-8,22],[-12,29]],[[2316,2614],[1,3],[10,6],[4,4],[9,12],[13,17],[7,11],[-15,15]],[[2484,2550],[-1,-9],[-2,-5],[-7,-3],[16,-41],[5,-3],[6,0],[8,5],[7,7],[17,10],[3,-7]],[[2536,2504],[-147,-124]],[[2389,2380],[-6,11]],[[2383,2391],[38,27],[19,18],[33,29],[2,4],[0,5],[-6,15],[-17,-8],[-7,19],[-17,-8],[-27,71],[-19,-6],[-7,20]],[[2582,2544],[-46,-40]],[[2383,2391],[-38,92],[-9,23]],[[2336,2506],[4,1],[6,2],[9,5],[14,15],[0,2],[0,2],[-4,10],[-3,9],[-4,9],[-5,11],[-3,4]],[[2389,2380],[-9,-10],[54,-98]],[[2434,2272],[-6,-12]],[[2428,2260],[-6,11],[-36,62]],[[2386,2333],[-6,8],[-3,4],[-14,7],[-17,8],[-7,4],[-24,10]],[[2315,2374],[9,24],[7,22],[13,-6],[3,0],[3,1],[-12,30],[-3,8],[-1,3],[3,8],[-1,3],[-20,9],[-1,1],[-2,3],[-6,18],[-9,23],[8,4],[6,5],[4,4],[8,4]],[[2324,2538],[12,-32]],[[2315,2374],[-16,8]],[[2299,2382],[-23,11]],[[2276,2393],[8,24],[-6,3],[-6,5],[-3,4],[-3,4],[-2,5],[-20,55],[-8,21]],[[2236,2514],[19,10],[42,21],[2,2],[3,3],[5,5],[5,3],[4,2],[8,-22]],[[2236,2514],[-12,34],[-2,6],[16,17],[-9,21]],[[2229,2592],[14,15],[38,44],[2,2],[4,-14],[0,-2],[4,-10],[8,-22],[17,9]],[[2229,2592],[-2,3],[-15,39]],[[2212,2634],[10,14],[4,5],[13,17],[15,18],[7,7],[2,3]],[[2263,2698],[4,6],[39,54],[5,3],[3,1],[13,28],[19,27]],[[2346,2817],[14,-10],[-9,-18],[23,-17]],[[2095,2473],[-3,7],[-2,6],[-11,23],[-5,8],[-12,18]],[[2062,2535],[3,10],[3,7],[2,6],[2,5],[5,4],[5,4],[11,7],[5,2],[17,10],[1,1],[1,2],[1,1],[2,2],[4,11],[1,3],[4,11],[2,9],[3,16],[3,3],[29,27],[11,15],[1,2],[16,25],[6,6],[14,12],[13,11],[2,2]],[[2229,2749],[23,-33],[11,-17],[0,-1]],[[2212,2634],[-93,-136],[-24,-25]],[[8316,4362],[-21,16],[-11,8]],[[8284,4386],[6,26],[5,23]],[[8295,4435],[8,-6],[5,-3],[23,-16],[8,-6]],[[8339,4404],[-6,-10],[-6,-11],[-5,-10],[-6,-11]],[[8361,4329],[-18,13],[-27,20]],[[8339,4404],[35,-24],[11,-8]],[[8321,4328],[-17,13],[-14,11],[-11,8]],[[8279,4360],[5,26]],[[8303,4296],[-31,24]],[[8272,4320],[4,20]],[[8276,4340],[3,20]],[[8261,4264],[5,26],[4,19],[2,11]],[[8261,4264],[-11,9],[-34,25]],[[8216,4298],[7,12],[5,9],[6,-5],[14,25]],[[8248,4339],[9,-7],[7,-6],[8,-6]],[[8163,4311],[11,20]],[[8174,4331],[9,-7],[33,-26]],[[8093,3982],[-43,32]],[[8103,4039],[-2,-2],[-6,-13],[-6,-11],[15,-11],[-6,-10],[-5,-10]],[[8093,3982],[22,-17],[4,-3]],[[8119,3962],[-10,-6],[-6,-12],[-1,-4]],[[8145,4008],[-2,-3],[-7,-12],[-6,-11],[-5,-10],[-6,-10]],[[8176,3947],[-9,8],[-6,-11],[-6,-9],[-36,27]],[[8191,3973],[-3,-4],[-12,-22]],[[8176,3947],[-11,-19],[11,-9],[8,-6],[2,-1],[8,-6],[5,-4]],[[8210,3953],[0,-10],[-3,-10],[-7,-26]],[[8210,3953],[31,-23],[22,-17]],[[8263,3913],[-6,-17],[-4,-9],[-5,-16]],[[8211,3993],[63,-48]],[[8274,3945],[-5,-15],[-3,-8],[-3,-9]],[[8217,4034],[11,-8],[28,-22],[16,-12],[15,-12]],[[8287,3980],[-8,-21],[-5,-14]],[[8304,4027],[-8,-22],[-9,-25]],[[8340,3939],[-17,13],[-9,7],[-9,7],[-8,7],[-10,7]],[[8322,3908],[-48,37]],[[8306,3879],[-43,34]],[[8286,3843],[-38,28]],[[2488,1435],[-4,0],[-63,-53]],[[2421,1382],[-3,12],[2,2],[5,6],[1,3],[2,3],[1,3],[0,2],[0,4],[1,5],[0,7],[-1,3],[-1,7],[-1,7],[-2,5],[-1,4],[-1,4],[-3,5],[-6,10],[-6,11],[-5,6],[-5,6],[-5,4],[-3,2],[-5,1],[-7,0],[-6,-1],[-6,-3],[-6,-3],[-6,-5],[-6,-5],[-6,-8]],[[2342,1479],[-9,9],[-28,47],[-4,5],[-4,9],[-4,10],[-5,9],[-8,13],[-9,15],[-3,5]],[[2352,1669],[3,-4],[12,-20],[3,-5],[19,-33],[22,-36]],[[2411,1571],[33,-54],[2,-2],[20,-35],[8,-14],[7,-15],[7,-16]],[[2323,1305],[-2,8],[-1,5],[-3,20]],[[2317,1338],[17,3],[4,2],[-3,23],[-6,30],[-2,21],[-1,6]],[[2326,1423],[1,4],[0,5],[1,9],[2,11],[3,10],[4,8],[5,9]],[[2421,1382],[-92,-76],[-6,-1]],[[2202,1373],[-30,53],[-3,13],[-1,7],[-5,9],[-10,17],[-11,18],[-3,6]],[[2139,1496],[4,4]],[[2326,1423],[-19,-4],[-38,-7],[-18,-4],[-3,-1],[-17,-13],[-29,-21]],[[2194,1305],[-2,4],[-4,8],[-3,7],[-1,12],[1,11],[3,8],[5,9],[9,9]],[[2317,1338],[-7,-2],[-5,-2],[-7,-5],[-14,-17],[-9,16],[-8,15],[-1,0],[-1,0],[-1,0],[-1,0],[-35,-27],[-2,-2],[-3,-17],[-5,-23],[-6,5],[-1,1],[-3,3],[-9,15],[-5,7]],[[2323,1305],[-90,-81],[-47,74]],[[2186,1298],[8,7]],[[7804,4647],[-29,23],[-9,7],[3,3],[-9,7],[-1,1],[-10,8]],[[7749,4696],[6,11],[6,11],[6,11],[6,12]],[[7773,4741],[3,6],[3,5],[6,12]],[[7785,4764],[6,11],[6,11]],[[7797,4786],[10,-7],[8,-6],[3,-2],[8,-6],[8,-6],[24,-17]],[[7858,4742],[-10,-18],[-11,-18],[-28,-49],[-5,-10]],[[7735,4771],[38,-30]],[[7667,4823],[6,11],[6,11]],[[7679,4845],[68,-52],[38,-29]],[[7679,4845],[6,12],[6,11]],[[7691,4868],[67,-53],[39,-29]],[[7691,4868],[6,11],[6,12]],[[7703,4891],[10,-8],[57,-45]],[[7770,4838],[39,-29]],[[7809,4809],[-6,-12],[-6,-11]],[[7770,4838],[6,11],[6,12],[6,11],[6,11]],[[7794,4883],[29,-22],[1,-1],[9,-7]],[[7833,4853],[-3,-5],[-9,-17]],[[7821,4831],[-3,-5],[-3,-6],[-6,-11]],[[7703,4891],[5,11],[7,12]],[[7715,4914],[5,11],[6,11]],[[7726,4936],[39,-30],[29,-23]],[[7726,4936],[6,11],[6,11],[6,12],[4,7]],[[7748,4977],[28,-15],[47,-23]],[[7823,4939],[-5,-11],[-6,-11],[-6,-11],[-6,-11],[-6,-12]],[[7839,4866],[-6,-13]],[[7856,4899],[-8,-16],[-4,-7],[-5,-10]],[[6142,4224],[1,-1],[2,0],[1,1],[1,1],[9,30],[1,6],[-1,5],[-2,8],[-4,7],[-6,7],[-7,5],[-15,6],[-10,4],[-9,4],[-11,2]],[[6092,4309],[-23,4],[-4,0],[-10,1],[-8,0],[-11,0],[-21,-4],[-18,-4],[-18,-6],[-14,-6],[4,-14],[6,-16]],[[5975,4264],[-18,7],[-15,-12],[-9,-10],[-13,-29],[-6,-19],[13,-12]],[[5788,4199],[24,46],[2,3],[3,7]],[[6092,4309],[-5,-32]],[[7976,3282],[-12,10],[-32,25],[-9,4],[-11,9]],[[7883,3395],[16,26],[11,52],[1,8],[2,7],[5,22],[2,7]],[[7962,3259],[-6,5],[-7,5]],[[7949,3269],[-17,14],[-4,3],[-5,4],[-4,3],[-20,16]],[[7949,3269],[-7,-13],[-4,-7],[-19,7],[-37,29]],[[7815,3256],[-6,-5],[-32,-22],[-12,-12],[-11,-14],[-4,-5],[0,-1],[-14,-20],[-24,-52],[-20,-36],[-2,-4],[-1,-4]],[[7689,3081],[-27,1],[-12,2],[-10,3],[-18,4],[-22,0],[-21,2],[-10,1],[-3,1],[-10,1],[-9,1],[-33,1],[-17,0],[-7,-2],[-6,-2],[-20,-7]],[[7392,3091],[6,1],[21,5],[6,2],[3,2],[4,3],[50,79],[9,13],[21,31],[37,54],[23,23],[23,15],[9,5],[7,19],[2,3],[8,20]],[[7717,3768],[3,4],[6,11]],[[7726,3783],[10,17]],[[7736,3800],[4,0],[14,-10],[26,-20],[1,-2],[32,-25],[14,-10],[24,-18],[23,-17]],[[7874,3698],[7,-6],[54,-41],[1,-6],[0,-7],[1,0],[0,-3],[1,-3],[1,-6],[4,-7],[4,-7]],[[7789,3124],[-7,-8],[-9,-10],[-8,-8],[-10,-7],[-3,-2],[-1,-4],[0,-2],[1,-6],[1,-7],[2,-7],[-3,-8],[-9,-10],[-9,-12],[-6,-16],[0,-10],[1,-8],[6,-16],[12,-13],[3,-1],[3,-2],[4,-5],[6,-4],[3,-1]],[[7609,2999],[11,21],[-11,14],[3,7],[4,5],[3,2],[4,2],[34,8],[8,3],[7,4],[2,1],[5,2],[4,4],[3,4],[3,5]],[[7834,3031],[-27,-27]],[[7807,3004],[-23,-22]],[[7844,2969],[-20,18],[-17,17]],[[7866,3000],[-8,-10],[-7,-11],[-7,-10]],[[7891,2976],[-22,-32]],[[7869,2944],[-9,9],[-7,7],[-9,9]],[[7869,2944],[-1,-2],[-18,-25]],[[7962,4215],[-8,6],[-61,47]],[[7893,4268],[5,9],[5,8],[8,16]],[[7911,4301],[9,-7],[46,-35],[6,-4]],[[7972,4255],[8,-7]],[[7951,4197],[-7,6],[-61,46]],[[7883,4249],[5,10],[5,9]],[[7938,4173],[-9,7],[-51,38],[-9,7]],[[7869,4225],[8,15],[6,9]],[[7938,4173],[-12,-21]],[[7926,4152],[-9,7],[-51,38],[-9,7]],[[7857,4204],[12,21]],[[7909,4121],[-9,7],[-20,15],[-8,5]],[[7872,4148],[6,10],[5,10],[-23,17],[-10,7],[7,12]],[[7926,4152],[-7,-12],[-10,-19]],[[7911,4301],[12,-2],[8,14],[13,23]],[[7944,4336],[51,-40],[-12,-22],[-6,-10],[-5,-9]],[[7944,4336],[6,11],[6,11]],[[7956,4358],[51,-40],[9,-7]],[[8016,4311],[-12,-22]],[[8004,4289],[-13,-22],[-11,-19]],[[7911,4301],[-28,22]],[[7883,4323],[11,19],[12,22]],[[7906,4364],[13,22]],[[7919,4386],[8,-6],[11,-8],[9,-7],[9,-7]],[[7883,4323],[-2,2],[-10,8],[-2,1],[-14,11],[-10,7]],[[7845,4352],[11,19]],[[7856,4371],[13,22]],[[7869,4393],[9,-7],[18,-13],[8,-7],[2,-2]],[[8041,4261],[-26,20],[-2,1],[-9,7]],[[8016,4311],[14,25]],[[8668,4346],[15,-7],[14,-6]],[[8697,4333],[0,-1],[6,-2],[-22,-87],[0,-2],[6,-3],[-14,-42],[5,-2],[-14,-43],[6,-3],[-6,-19],[-8,-23],[6,-3],[-14,-41],[-9,-55],[-5,-24]],[[8790,4543],[-73,-117],[-20,-93]],[[8600,4440],[6,8],[3,7],[0,2],[1,2],[1,2],[1,2],[1,2],[0,1],[1,2],[1,1],[0,2],[1,1],[6,15],[12,31],[9,24]],[[8643,4542],[9,-5],[22,-11],[9,25],[8,21],[4,10],[1,2],[4,11]],[[8700,4595],[6,-3],[9,-4]],[[8715,4588],[9,-5],[10,-5],[4,-2],[13,-6],[20,-13],[4,-2],[11,-9],[4,-3]],[[8846,4618],[-16,-6],[0,-3],[-40,-66]],[[8715,4588],[8,21],[7,20]],[[8730,4629],[8,22],[7,19]],[[8745,4670],[11,-5],[19,-10],[16,-5],[17,-9],[1,-1],[1,0],[1,-1],[2,-1],[3,-2],[4,-3],[21,-13],[5,-2]],[[8944,4779],[-48,-16],[-20,-40],[0,-3],[65,21],[-7,-29],[-60,-20],[5,-12],[4,0],[1,-7],[-36,-12],[3,-15],[43,14],[0,-1],[0,-24],[-48,-17]],[[8745,4670],[10,27],[10,26]],[[8765,4723],[10,-5],[19,-10],[5,11],[4,12],[-19,10],[-11,5]],[[8773,4746],[10,25],[9,24]],[[8792,4795],[5,13],[5,16],[9,25],[1,4]],[[8812,4853],[9,-5],[28,-15],[3,-4],[2,-2],[7,-4],[28,-15],[3,1],[2,-1],[7,-4],[43,-25]],[[8978,4870],[-35,-70],[23,7],[6,-19],[-28,-9]],[[8812,4853],[5,13],[4,13],[-25,13],[-9,4],[9,24]],[[8796,4920],[11,-6],[13,-6],[9,-5],[24,-13],[7,-4],[5,12],[4,11]],[[8869,4909],[11,-6],[2,-1],[39,-21],[13,-7],[40,-4],[4,0]],[[9015,4945],[-37,-75]],[[8869,4909],[-31,17],[-22,11]],[[8816,4937],[5,12],[22,-11],[7,16],[11,28],[9,23]],[[8870,5005],[10,-5],[17,-9],[14,-7],[45,-21],[6,-3],[3,-1],[20,-6],[26,-8],[4,0]],[[9039,4992],[-24,-47]],[[8870,5005],[-11,6],[-12,6]],[[8847,5017],[-10,6]],[[8837,5023],[9,24]],[[8846,5047],[10,-5],[13,-7],[12,-6],[8,22]],[[8889,5051],[10,-5]],[[2120,1713],[-52,-40],[-10,18],[-1,2],[-1,1],[-1,0],[-1,0],[-10,0],[-18,-2],[-1,-1],[-1,-1],[-1,-1],[1,-22],[-42,-33],[-10,-8],[0,-1],[-1,0],[0,-1],[0,-1],[0,-1],[11,-17],[-18,-14],[-11,-10]],[[1953,1581],[-19,-14]],[[1855,1672],[44,3],[18,15],[157,124]],[[1813,1646],[-1,3],[-5,8],[-5,10]],[[1802,1667],[-19,41],[11,7],[8,4],[-10,20],[18,8],[20,5],[8,1],[11,4]],[[1849,1757],[18,-40],[13,-30],[7,1],[6,2],[7,4],[12,8],[6,6]],[[1918,1708],[94,73],[17,14]],[[2029,1795],[19,16],[19,15]],[[2067,1826],[7,-12]],[[1849,1757],[-1,1],[-13,30],[0,3],[43,26],[9,-20],[41,25],[-10,19]],[[1918,1841],[16,10],[3,-1],[33,-73],[-35,-29],[-27,-18],[10,-22]],[[1802,1667],[-19,-11]],[[1702,1781],[17,11],[20,12]],[[1892,1898],[9,-19],[8,-19],[9,-19]],[[1926,1919],[18,11],[18,12]],[[1962,1942],[17,-37],[20,-44],[10,-22],[20,-44]],[[2102,1961],[-11,-7],[-14,-9],[-6,-3],[-4,-1],[-10,-1],[-1,-20],[8,-15],[30,22],[10,-19],[-25,-19],[-15,-12],[0,-3],[10,-17],[11,-19],[-18,-12]],[[1962,1942],[9,6],[3,5],[1,7],[0,11]],[[2022,1996],[7,-3],[31,28],[7,-20],[4,-9],[11,8],[1,-1],[9,-17],[10,-21]],[[7900,4857],[-7,-19]],[[7893,4838],[-9,5],[-33,17],[-2,1],[-10,5]],[[7879,4801],[-8,5],[-37,19],[-2,1],[-11,5]],[[7893,4838],[-7,-18],[-7,-19]],[[7882,4725],[-24,17]],[[7879,4801],[-4,-12],[-3,-8],[26,-13],[-6,-17],[-10,-26]],[[7902,4711],[-20,14]],[[7893,4838],[9,-4],[30,-15],[9,-4]],[[7941,4815],[-7,-19]],[[7934,4796],[-6,-19]],[[7928,4777],[-8,-20]],[[7920,4757],[-7,-19]],[[7913,4738],[-5,-11],[-6,-16]],[[7920,4757],[11,-6],[9,-5],[7,-3],[7,-4],[1,-4],[-3,-9],[-4,-9],[-4,-1],[-6,4],[-7,4],[-7,6],[-7,5],[-4,3]],[[7959,4671],[-3,2],[-2,2],[-4,2],[-40,29],[-8,5]],[[7928,4777],[9,-4],[44,-22],[10,-4]],[[7991,4747],[-15,-40],[-5,-10],[0,-6],[-2,-5],[-10,-15]],[[7934,4796],[10,-4],[44,-23],[9,-4]],[[7997,4765],[-6,-18]],[[7941,4815],[9,-5],[44,-22],[9,-5]],[[8003,4783],[-6,-18]],[[8010,4802],[-7,-19]],[[7948,4833],[9,-5],[44,-22],[9,-4]],[[8017,4820],[-7,-18]],[[7961,4869],[9,-4],[45,-22],[9,-4]],[[8024,4839],[-7,-19]],[[8031,4857],[-7,-18]],[[7975,4906],[9,-4],[44,-22],[9,-5]],[[8037,4875],[-6,-18]],[[8044,4894],[-7,-19]],[[7934,4949],[9,-5],[26,-13],[3,-2],[10,-4]],[[7982,4925],[9,-5],[44,-22],[9,-4]],[[8051,4912],[-7,-18]],[[7982,4925],[6,18],[9,22]],[[7997,4965],[10,-4],[42,-21],[10,-5]],[[8059,4935],[-8,-23]],[[7934,4949],[6,18],[4,11],[4,12],[39,-20],[10,-5]],[[8004,4985],[-7,-20]],[[7924,5025],[10,-5],[61,-30],[9,-5]],[[7942,5060],[8,-4],[3,-1],[26,-13],[13,-6],[16,-8],[9,-5]],[[8017,5023],[-6,-19],[-7,-19]],[[3044,2793],[-31,52],[-16,-13],[-17,-15],[-21,-17],[-12,18],[-11,19]],[[2936,2837],[44,37]],[[2980,2874],[78,63]],[[3058,2937],[11,-18]],[[3069,2919],[10,-18],[22,-37],[-38,-29],[-14,-11],[13,-23],[-18,-8]],[[2980,2874],[-13,21]],[[2949,2928],[63,51],[14,11],[-15,25],[14,16],[37,-60],[3,0],[14,11],[-11,19],[-17,28],[0,3],[1,2],[14,17],[7,7],[13,12],[-8,21]],[[3078,3091],[20,15]],[[3098,3106],[10,-25]],[[3108,3081],[27,-80],[5,-15],[3,-8]],[[3143,2978],[-21,-16],[-10,-6],[-9,-2],[-7,0],[-12,-2],[-6,-2],[-7,-3],[-13,-10]],[[2881,3114],[4,-11],[8,-14],[40,-65],[2,0],[14,11],[18,15],[17,13],[43,35],[3,2],[3,-1],[9,-12],[11,-17],[25,21]],[[2901,3123],[19,6]],[[2920,3129],[12,2],[20,5],[16,5],[15,9],[11,8],[9,8],[8,7],[18,23]],[[3029,3196],[44,-52],[16,-21],[9,-17]],[[2920,3129],[0,25],[-1,40],[5,17],[7,18],[9,12],[12,12],[12,8],[20,11],[-7,24]],[[2977,3296],[19,8],[8,-22],[5,-18],[5,-11],[6,-10],[9,-11],[14,-18]],[[3043,3214],[-14,-18]],[[1823,2038],[-7,16],[-4,7],[-18,15],[-6,7],[-10,22]],[[1757,1958],[-2,3],[-10,21],[-10,21],[-11,24]],[[1724,2027],[-9,19],[-2,6],[-3,1],[-29,-22],[-15,32]],[[1671,1904],[-17,36]],[[1654,1940],[19,12],[10,-21],[2,0],[7,4],[7,6],[0,3],[-3,8],[-6,12],[-3,5],[-10,22],[18,13],[29,23]],[[1654,1940],[-9,21],[-19,41],[-4,16],[-5,18],[-3,4]],[[6347,2548],[-57,41],[-14,-20],[-11,-7],[-18,12],[-15,12],[-15,3]],[[5577,3559],[-3,-3],[-24,-38]],[[5550,3518],[-20,-25],[-22,-30],[-15,-20],[-4,-4]],[[5489,3439],[-18,-24],[-35,-45]],[[5402,3321],[42,-43],[3,-4],[16,-17],[4,-3],[21,-23],[6,-6],[3,-3]],[[5497,3222],[6,-5],[4,-5],[6,-9],[5,-9],[6,-15],[4,-19],[3,-17]],[[4365,2120],[-83,83],[-2,3],[-88,154],[-32,58],[41,62],[-121,125]],[[4080,2605],[22,17],[8,5],[8,3],[44,10],[3,-17],[2,-6],[3,-6],[6,-11],[3,-4],[4,-5],[21,-22],[36,-40],[5,-14],[72,16],[5,1],[77,19],[156,37],[10,0],[11,14],[17,22],[70,92],[38,51],[16,10],[27,-27],[28,36],[0,4],[-18,21],[32,38],[5,5],[6,4],[7,1],[7,0],[6,-1],[7,-4],[12,-7],[12,-5],[12,-7],[10,-6],[5,-2],[5,0],[2,0],[3,0],[2,0],[-9,12],[-12,16],[-2,3],[-3,4],[-3,3],[-3,4],[-4,4],[-4,5],[-2,3],[-5,5],[-6,7],[-6,6],[-7,8],[-4,3],[-5,5],[-2,2],[14,-1],[12,-1],[42,-4],[30,-3],[11,-1],[36,-4],[37,-3],[20,-2],[18,-2],[-2,6],[-3,9],[6,69],[2,3],[5,63],[2,12],[2,12],[2,4],[8,19],[2,3],[8,12],[11,14],[54,69],[41,52],[43,55],[66,86],[4,10],[3,2],[2,4],[2,5],[3,4],[7,10],[2,2]],[[5300,3421],[5,8],[14,18],[6,8],[5,8],[6,15],[4,13],[3,19],[0,12],[4,2],[3,9],[8,17],[3,6],[2,5],[1,5],[-1,26]],[[5363,3592],[15,2],[15,-15],[22,28]],[[5415,3607],[7,9],[14,19],[3,3],[2,-2],[38,-40],[11,14]],[[5490,3610],[6,8],[1,0],[1,0],[1,0],[1,-1],[11,-11],[5,0],[19,1],[-1,-1],[-1,-1],[-1,-1],[0,-2],[1,-23],[6,1],[8,0],[5,0],[4,-1],[3,-2],[14,-14],[4,-4]],[[5031,3567],[1,-25],[-34,-3],[-22,0],[-9,-1],[-13,-1],[2,-21],[6,-20],[-11,-3],[-8,-7],[-5,-7],[42,-44],[-1,-2],[-23,-33],[-17,-27]],[[4939,3373],[-17,18],[-13,14],[-6,6],[-14,14],[-15,16],[-8,4],[-6,2],[-6,2],[-5,3],[-8,8],[-1,3],[-1,5],[1,8],[2,4],[7,7],[6,4],[5,3],[3,3],[5,5],[10,12],[-17,18],[-1,3],[-15,16],[-10,12],[-3,0],[-4,3]],[[4828,3566],[41,50],[7,7],[4,4],[6,3],[5,2],[5,2],[16,3],[7,1]],[[4919,3638],[34,2],[21,2]],[[4974,3642],[19,0]],[[4993,3642],[0,-3],[1,-20],[1,-23],[1,-31],[35,2]],[[4939,3373],[-15,-17],[-26,-27],[-10,-10],[-67,68],[-71,76],[-4,4],[82,99]],[[5031,3567],[23,1],[6,0],[8,-2],[33,1],[16,1],[36,4],[6,0],[6,-10],[6,-7],[40,-42]],[[5211,3513],[-2,-3],[-63,-81],[-28,-37],[-4,-4],[-3,-2],[-11,-5],[-8,21],[-2,3],[-22,-10],[-26,-12],[-3,-1],[-1,0],[-3,2],[-35,36],[-12,-20],[-13,-17],[-13,-16],[-5,-7],[-3,-3],[-15,16]],[[5211,3513],[31,-33],[28,-27],[27,-29],[3,-3]],[[4080,2605],[-28,43],[1,0],[12,10],[97,81],[7,5],[12,36],[1,2],[1,0],[2,2],[11,4],[1,3],[8,4],[0,7],[1,4],[4,1],[-1,5],[3,2],[2,3],[-2,3],[0,3],[-4,1],[-4,0],[-4,-1],[-4,-1],[-3,1],[3,8],[-1,5],[-6,34],[4,4],[5,4],[-1,6],[0,1],[-2,8],[4,7],[8,6],[12,8],[16,14],[-7,17],[-9,19],[-26,49],[-27,50]],[[4166,3063],[-48,44],[-61,58],[10,4]],[[4067,3169],[42,48],[-19,22]],[[4158,3361],[36,-47],[23,30],[20,-20],[11,12],[65,-62],[31,40],[20,-24],[37,44],[5,0],[4,2],[1,5],[14,11],[23,-1],[33,29],[-26,28],[-1,1],[-42,47]],[[4412,3456],[31,18],[15,11],[0,1],[32,19],[8,5],[45,28],[3,1]],[[4546,3539],[7,5],[36,22],[69,39],[28,16],[125,75],[36,22]],[[4847,3718],[20,-11],[51,-58],[1,-11]],[[5211,3513],[15,21],[30,39],[24,32]],[[5280,3605],[15,-20],[5,6],[2,0],[3,-2],[3,-5],[-6,-9],[16,-17],[25,32],[6,1],[14,1]],[[5374,3648],[16,-17],[7,9],[8,-8],[0,-1],[-6,-8],[16,-16]],[[5280,3605],[18,24],[6,8],[12,16]],[[5316,3653],[8,-3],[12,-11],[21,28],[17,-19]],[[6777,2060],[-58,37]],[[7388,3093],[-11,5]],[[7377,3098],[-28,13],[-10,1],[-8,-1],[-7,-1],[-8,-3],[-38,-10],[-18,-3],[-26,0],[-16,0]],[[7350,3037],[3,8],[4,0],[2,7],[-4,6],[21,38]],[[7376,3096],[1,2]],[[7338,3047],[12,27],[5,9],[4,7],[17,6]],[[5555,4114],[-40,-28]],[[5515,4086],[-46,-34],[-46,-34],[-2,-4],[-11,-8],[-2,3],[-16,18],[-3,4],[-2,3],[-2,2],[-3,3]],[[5524,4010],[-20,-25]],[[5504,3985],[-13,14],[-4,4],[-14,14],[-14,-19],[-16,-20],[-29,-36]],[[5414,3942],[-16,14],[-10,10],[-4,4],[-9,10]],[[5375,3980],[-3,3],[-7,7],[-21,22],[-3,2]],[[5341,4014],[39,24]],[[5515,4086],[11,-22],[-11,-6],[-10,-7],[-8,-6],[7,-11],[8,-11],[6,-7],[6,-6]],[[5504,3985],[35,-37]],[[5539,3948],[-14,-19],[-36,38],[-14,-19],[36,-38],[44,-47]],[[5526,3826],[-34,36]],[[5492,3862],[-11,11],[-67,69]],[[5539,3948],[46,-47]],[[5610,4014],[8,0],[3,-1],[2,-4],[-2,-4],[-3,-2],[-5,-2],[0,-3],[0,-8],[-1,-8],[11,-3],[9,-5],[-5,-12],[0,-3],[2,-2],[3,-5],[7,-6]],[[5524,4010],[5,-5],[11,-8],[11,20],[11,18],[11,-8],[7,-6],[9,-6],[9,-5],[9,-3],[5,0],[-2,7]],[[5610,4014],[-1,3],[-3,7],[-3,7],[11,6],[2,2],[5,6]],[[7592,2355],[0,-1],[-1,-4],[-1,-3],[0,-2],[-4,-17],[-2,-7],[-1,-4],[-4,-17],[-3,-14],[-2,-9],[-1,-3],[-1,-3],[-11,-43],[-1,-4]],[[7560,2224],[-3,-11],[0,-1],[0,-1],[0,-1],[-1,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-2],[0,-1],[0,-1],[0,-2],[0,-2],[1,-5],[0,-2],[0,-1],[1,-1],[0,-2],[0,-1],[1,-1],[0,-2],[1,-1],[0,-1],[0,-1],[1,-3],[1,-1],[1,-2],[0,-1],[1,-1],[0,-2],[1,-1],[1,-1],[1,-2],[0,-1],[1,-2],[1,-1],[2,-2],[6,-9],[6,-7],[13,-18],[6,-9],[2,-2],[2,-2],[2,-2]],[[7613,2099],[-2,-2],[-2,-2],[-1,-1],[-5,-6],[-2,-2],[-40,-40],[-4,-4],[-2,-2],[-3,-3],[-34,-26],[-130,-88],[-4,-3],[-72,-34],[-42,-22],[-24,-13],[-96,-72],[-58,-45],[-38,-41],[-22,-27],[-8,-10],[-4,-4],[-4,-4],[-20,-25],[-18,-25],[-31,-53],[-9,-13]],[[7473,2222],[2,2],[12,16],[4,5],[3,4],[5,8],[27,40],[8,10],[9,7],[5,5],[41,36],[1,1],[2,-1]],[[7590,1280],[-53,-103],[-2,-4]],[[6457,1354],[28,-19],[5,-11],[2,-2],[3,-2],[1,-2],[2,-1],[0,-1],[3,-3],[2,-2],[3,-4],[1,-4],[2,-3],[1,-2]],[[6510,1298],[-12,-4],[-3,-1],[-91,-29],[-6,-2],[-38,-10],[-21,-6],[-75,-24],[-4,-2],[-6,-2]],[[6254,1218],[0,5],[-1,35],[-22,0],[-23,-1]],[[6208,1257],[0,65]],[[6208,1322],[22,0],[0,32],[15,36],[3,8],[1,4],[1,3],[-6,4],[-11,6],[-10,6],[-54,37],[-9,6],[-7,4]],[[6153,1468],[-1,1],[-7,4],[-4,3],[-6,3],[-7,3],[-7,3],[-6,3],[-7,2]],[[6153,1321],[-1,100],[0,37],[0,6],[1,4]],[[6208,1322],[-19,0],[-18,-1],[-18,0]],[[6172,1257],[-19,0]],[[6153,1257],[0,64]],[[6208,1257],[-19,0],[-17,0]],[[6153,1257],[-17,-1],[-18,0],[-12,1]],[[6105,1421],[12,0],[17,0],[1,-100],[18,0]],[[6137,1181],[-19,-6]],[[6118,1175],[0,5],[-8,12],[-5,57],[1,8]],[[6172,1257],[0,-60],[-18,-5],[-18,-6],[1,-5]],[[6254,1218],[-22,-7],[-95,-30]],[[5468,3830],[-27,27],[-2,1],[-2,-1],[-40,-52],[-39,-52],[15,-16],[13,-13]],[[5386,3724],[-13,-18]],[[5373,3706],[-13,13],[-16,16],[-3,-2],[-4,-6],[-18,-22],[-18,-24],[1,-12],[14,-16]],[[4993,3642],[21,2],[21,1],[22,1],[10,2],[8,2],[8,5],[8,8],[7,8],[10,17],[9,15],[1,3]],[[5118,3706],[12,19],[13,22],[13,20]],[[5156,3767],[13,19],[16,19],[14,17],[26,30],[11,9],[16,10],[7,5],[14,11],[42,41],[19,18],[6,4],[22,19],[10,9],[3,2]],[[5492,3862],[-3,-3],[-13,-17],[-8,-12]],[[5468,3830],[11,-12],[-14,-20],[-14,-18],[-3,2],[-10,9],[-13,-15],[-10,-15],[9,-13],[-1,-5],[-25,-32],[-12,13]],[[5601,3534],[-24,25]],[[5490,3610],[-26,28],[7,10],[-13,14],[-11,11],[-3,1],[-6,-6],[-2,-1],[-1,1],[-9,10],[-3,3],[-12,12],[-11,-15]],[[5400,3678],[-4,4],[-23,24]],[[5400,3678],[-4,-2],[-22,-28]],[[8925,5145],[-10,6],[-8,4],[-5,2],[-1,1],[-10,5]],[[8908,5098],[-10,-24],[-10,6],[-14,8],[-10,5]],[[8889,5051],[-10,5],[-14,8],[-10,6]],[[8846,5047],[-11,6],[-18,9],[-10,6]],[[8807,5068],[9,23]],[[8837,5023],[-11,6],[-19,10],[-10,5]],[[8797,5044],[-11,6],[-19,10],[-10,5]],[[8757,5065],[9,25],[10,-6],[20,-11],[11,-5]],[[8776,4996],[11,25],[10,23]],[[8847,5017],[-5,-11],[-4,-12],[-11,6],[-10,-26],[-41,22]],[[8816,4937],[-11,6],[-12,6]],[[8793,4949],[-29,16]],[[8764,4965],[5,12],[6,15],[1,4]],[[8796,4920],[-12,6],[5,12],[4,11]],[[8812,4853],[-10,5],[-16,8],[-9,6]],[[8777,4872],[-41,21]],[[8736,4893],[10,25],[4,12],[5,12],[-23,12],[1,2],[3,8],[5,13]],[[8741,4977],[23,-12]],[[8792,4795],[-11,5],[-31,17]],[[8750,4817],[6,11],[8,17],[11,23],[2,4]],[[8750,4817],[-38,21]],[[8712,4838],[5,11],[8,16],[6,14],[4,11],[1,3]],[[8728,4768],[-10,6],[-18,9],[-11,5]],[[8689,4788],[6,16],[6,11],[5,11],[6,12]],[[8750,4817],[-5,-11],[-6,-11],[-4,-10],[-1,-2],[-6,-15]],[[8773,4746],[-10,5],[-24,12],[-11,5]],[[8765,4723],[-11,5],[-24,12],[-10,5]],[[8720,4745],[8,23]],[[8745,4670],[-11,6],[-23,12],[-10,5]],[[8701,4693],[9,26],[10,26]],[[8730,4629],[-9,5],[-25,13],[-11,5]],[[8685,4652],[8,21],[8,20]],[[8685,4652],[-7,-21]],[[8678,4631],[-11,5],[-18,9],[-11,5],[8,19],[0,2],[9,22],[7,19]],[[8662,4712],[10,-5],[13,-6],[5,-3],[11,-5]],[[8700,4595],[-20,10],[-10,5]],[[8670,4610],[8,21]],[[8661,4587],[-36,19],[-4,1],[-39,19]],[[8582,4626],[5,11],[4,12]],[[8591,4649],[8,21]],[[8599,4670],[7,19],[1,2]],[[8607,4691],[8,22],[7,19]],[[8622,4732],[11,-5],[10,-5],[8,-4],[11,-6]],[[8670,4610],[-5,-11],[-4,-12]],[[8643,4542],[9,24]],[[8652,4566],[4,11],[5,10]],[[8652,4566],[-35,17],[-4,2],[-10,-24],[-2,1],[-7,4],[-20,10],[-10,5]],[[8564,4581],[10,24]],[[8574,4605],[8,21]],[[8545,4525],[10,29],[0,3],[9,24]],[[8545,4525],[-2,1],[-9,5],[-11,5],[-17,4],[-36,5]],[[8470,4545],[12,30],[6,15],[9,24],[5,14],[4,11]],[[8506,4639],[36,-19],[22,-10],[2,-1],[8,-4]],[[8506,4639],[4,10],[4,11]],[[8514,4660],[10,-5],[26,-13],[20,-10],[2,-1],[10,-5]],[[8514,4660],[4,12],[4,11]],[[8522,4683],[10,-5],[49,-24],[10,-5]],[[8522,4683],[8,21]],[[8530,4704],[9,-5],[2,0],[47,-24],[11,-5]],[[8530,4704],[8,21]],[[8538,4725],[11,-5],[47,-24],[11,-5]],[[8538,4725],[8,22]],[[8546,4747],[7,20]],[[5016,1222],[4,-1],[16,-1],[4,-5],[1,-11],[-2,-4],[-2,-2],[-4,-2],[-13,-4],[-8,-2],[-4,0],[-8,4],[-5,0],[-2,-1],[-4,-2],[-4,-6],[-2,-9],[-4,-6],[-8,-6],[-6,-4],[-3,-8],[-3,-3],[-15,-6],[-7,-4],[-12,-3],[-11,0],[-13,4],[-16,12],[-13,12],[-3,2],[-1,3],[-8,3],[-5,1],[-3,1],[-3,1],[-2,0],[-2,0],[-9,-3],[-9,-10],[-7,-1],[-6,-2],[-4,2],[-4,2],[-9,5],[-6,6],[-2,0],[-5,4],[-3,0],[-5,1],[-4,0],[-3,1],[-5,3],[-2,1],[-4,-1],[-2,-10],[-3,-4],[-9,2],[-2,2],[-1,0]],[[4741,1173],[-2,3],[1,20],[-2,4],[-5,2],[-2,20]],[[4731,1222],[11,-2],[3,0],[16,1],[4,0],[4,1],[11,4],[8,8],[2,0],[0,1],[1,2],[2,2],[2,2],[3,3],[4,4],[5,3],[13,8],[13,5]],[[4833,1264],[26,5],[11,2],[15,2],[20,6]],[[4905,1279],[4,1],[17,2],[19,0],[6,-30],[3,-25],[4,-24],[38,9],[8,1],[6,-3],[5,0],[1,9],[0,3]],[[5122,1221],[0,-4],[3,-15]],[[5125,1202],[-8,2],[-10,1],[-20,1],[-5,0],[-4,-1],[-18,-2],[-2,2],[-6,6],[-8,10],[-4,2],[-11,2],[-9,0],[-4,2]],[[5016,1227],[1,8],[17,0],[0,33],[-18,1],[0,12]],[[5016,1281],[11,0],[26,-1],[11,-2],[11,-7],[9,-8],[10,-12],[5,-9],[10,-10],[7,-7],[6,-4]],[[1506,1092],[-3,7],[-2,7],[-3,45],[-11,27]],[[1560,1505],[64,-17]],[[1624,1488],[14,-49],[22,-78],[23,-80],[29,-62],[4,-7],[2,-5],[3,-3],[4,0],[5,1]],[[1983,1486],[7,-12],[33,-54],[4,-7]],[[1624,1488],[2,-1],[26,11],[10,4],[2,4],[9,4],[5,-7],[6,8],[8,7],[7,7],[34,24],[3,3],[16,12],[9,11],[15,23],[12,16],[13,17]],[[6475,2834],[-8,6],[11,20],[0,17],[-12,8],[2,12],[4,14],[10,16],[-5,4],[-2,1],[-2,2]],[[7999,2859],[-7,9],[-7,7],[-5,4],[-2,3]],[[7978,2882],[3,3],[32,42],[2,2],[4,6],[8,10],[12,16],[0,1],[20,25],[5,7],[4,5],[3,2]],[[7920,2741],[-10,27]],[[7910,2768],[-8,17],[-1,2],[-1,4]],[[7900,2791],[15,15],[8,9],[15,17],[7,8],[11,14],[14,17],[8,11]],[[7978,2882],[-2,4],[-1,2],[-1,3],[-4,6],[-2,3],[-8,10],[-8,9]],[[7900,2791],[-1,1],[-1,3],[-3,5],[-2,6],[-2,3],[-2,5],[-4,5],[-8,11],[-15,19],[-2,3],[14,7],[-26,13],[-8,4],[-13,7]],[[7850,2917],[3,0],[2,-2],[1,-3],[4,-4],[8,-9],[8,10],[4,6],[2,3],[14,18]],[[7896,2936],[7,-6],[2,-1],[15,-12],[13,-10],[15,14],[3,-3],[1,1]],[[8723,2851],[-10,7],[-12,6],[-16,5],[-40,13],[-5,1],[-2,1],[-32,10],[-33,10],[-2,-1],[-4,1],[-21,7],[-4,2],[-3,2],[-7,2],[-10,4],[-13,7],[-13,10],[-7,7],[-4,3],[-10,12],[-7,10],[-6,9],[-5,11],[-3,9],[-1,2],[-3,11],[-2,6]],[[8448,3018],[7,2],[1,2],[1,6],[6,35],[3,22],[2,20],[0,2],[0,2],[-1,0],[-6,4],[-1,1],[2,5],[0,5],[0,9],[0,3],[2,23],[1,24],[-1,21]],[[8595,3755],[-7,-33],[-50,-139],[0,-2],[26,1],[27,75],[3,0],[3,15],[13,-16],[-22,-123],[8,-1],[-10,-57],[-89,-6],[-17,-47],[0,-1],[98,9],[-7,-30],[-97,-10],[-4,-25],[54,6],[0,-5],[-54,-6],[-4,-19],[97,13],[-6,-32],[-90,-12],[6,-49],[1,-11],[4,-26],[6,0],[0,-5],[4,-1],[5,20],[11,1],[-3,-27],[3,0],[2,8],[2,0],[4,15],[22,-3],[0,-13],[2,0],[-7,-113],[1,0],[0,-3],[-9,-131],[2,-5],[3,1],[0,-6],[6,0],[1,-2],[4,-1],[0,8],[6,-1],[7,103],[13,173],[1,2],[8,-1],[30,0],[-11,-169],[22,-2],[12,159],[3,41],[3,50],[0,7],[5,49],[3,18],[10,75],[3,27],[2,8],[3,2],[2,1],[3,-2],[5,-4],[-1,-102],[-1,-17],[1,-81],[1,-12],[-2,-19],[-1,-22],[0,-16],[0,-20],[0,-18],[8,-43],[0,-13],[1,-2],[7,-55],[14,-111],[3,-10],[6,-18],[7,-21],[16,-33],[13,-30],[2,-4]],[[8376,2911],[3,3],[31,28],[3,1],[8,-1],[7,0],[9,-1],[9,2],[7,1],[4,2],[6,-1],[5,0],[7,0],[0,3],[-6,6],[-2,3],[-3,6],[-4,5],[-3,5],[-4,6],[-3,5],[-1,4],[-2,4],[-3,6],[-8,-7],[-2,1],[2,21],[-7,0],[-4,-33],[-11,-10],[4,41],[-7,-1],[-6,-50],[-21,-20],[-5,-4]],[[8379,2936],[2,3],[7,29]],[[8388,2968],[4,21],[3,23],[14,2],[30,2],[2,0],[3,1],[4,1]],[[8448,3018],[-6,26],[-6,19],[-3,11],[-1,3],[-6,12],[-7,11],[-8,8],[-3,3],[-6,4],[-28,19],[-10,6],[-4,3],[-16,10],[-11,7],[-7,4],[-32,26]],[[8294,3190],[1,3],[1,2],[1,4],[20,46],[5,12],[4,9],[4,12]],[[8388,2968],[-29,17],[-2,2],[-40,25],[-8,-19],[-6,-12],[-31,5],[-11,2],[-11,3],[-9,6],[-6,4],[-3,4],[-6,6]],[[8226,3011],[12,23],[9,22],[15,37],[6,16],[1,4],[3,9],[2,6],[2,6],[5,15],[10,29],[1,5],[0,1],[1,2],[1,3],[0,1]],[[8159,3023],[17,28]],[[8176,3051],[50,-40]],[[8226,3011],[-12,-25],[-14,-27]],[[8379,2936],[-3,-4],[-3,-2],[-15,-12],[-32,-27],[-30,-28],[-8,-9],[-3,-2]],[[2357,1179],[-39,-11],[-36,-9],[-22,-6],[-35,-9]],[[2225,1144],[-10,35],[-1,4],[-25,84],[-4,7],[-10,19]],[[2175,1293],[10,5],[1,0]],[[2323,1305],[6,-15],[-1,-3],[1,-5],[2,-8],[6,-19],[1,-6],[3,-12],[3,-11],[6,-24],[7,-23]],[[2439,1152],[8,-30],[-9,-3],[-11,-4],[-9,-3],[-10,-4],[-10,-3],[-18,-7],[-2,0],[2,-9]],[[2380,1089],[-36,-13],[-48,-17],[0,-1],[0,-2],[0,-1],[18,-70],[-39,-11]],[[2275,974],[-2,7],[-2,6],[-9,32],[-7,26],[-30,99]],[[2357,1179],[3,-15],[3,-8],[50,12],[20,6],[3,-9],[3,-13]],[[2421,1382],[2,-8],[3,-10],[0,-3],[3,-10],[6,-24],[12,-48],[6,-24],[-11,-4],[3,-11],[3,-12],[4,-19],[2,-4]],[[2454,1205],[-1,-2],[11,-42],[-25,-9]],[[2454,1205],[58,20],[25,9],[4,2]],[[2541,1236],[10,-39]],[[2551,1197],[-3,-2],[8,-25],[-1,-5],[-1,-2],[-1,-2],[-2,-3],[-7,-2],[4,-18],[4,-16],[-6,-1],[-1,0],[-3,2],[-1,0],[-22,-7],[0,-1],[-1,-1],[0,-1],[10,-34],[-20,-9],[-32,-17],[-37,-17],[-40,-17],[-2,9],[-4,11],[-4,16],[-2,10],[-7,24]],[[2582,1092],[-3,-1],[-7,-3],[-1,-1],[-26,-12],[-56,-24],[-90,-41],[-55,-22],[-22,-7],[-38,-10],[-6,-2]],[[2278,969],[-3,5]],[[2551,1197],[13,-40],[5,-8],[3,-2],[2,0],[3,-1],[9,3],[15,6],[42,15],[-4,16]],[[2639,1186],[4,2],[45,15],[1,0],[1,-1],[5,-19],[0,-2],[0,-1],[-49,-22],[7,-28],[69,31],[48,22]],[[2770,1183],[46,21]],[[2816,1204],[1,-6]],[[2817,1198],[-2,-1],[-153,-69],[-74,-33],[-6,-3]],[[2607,1311],[3,-11],[1,-1],[13,0],[5,0],[9,2],[2,-11],[4,-13]],[[2644,1277],[-6,-2],[-3,0],[-13,0],[-1,-14],[0,-6],[3,-11],[11,-44],[4,-14]],[[2541,1236],[-30,118],[-5,16]],[[2506,1370],[13,4],[7,-24],[10,4],[3,0],[35,-7],[1,-1],[1,-2],[4,-17],[6,-20],[1,-3],[20,7]],[[2488,1435],[4,-9],[2,-9],[12,-47]],[[2757,1440],[59,-236]],[[2770,1183],[-5,22],[-1,1],[-2,1],[-7,-3],[-15,55],[-5,22],[-9,25],[-1,1],[-1,1],[-1,0],[-1,0],[-11,-4],[-7,-4]],[[2704,1300],[-5,17],[-2,8],[21,7],[1,1],[-4,17],[0,13],[-7,29],[-8,31],[-1,1],[-1,0],[-60,0],[-7,1],[-1,-1],[0,-1],[0,-4],[7,-25],[-20,-7],[-27,-9],[6,-24],[11,-43]],[[2488,1435],[22,3],[247,2]],[[2704,1300],[-13,-6],[-6,-3],[-20,-7],[-21,-7]],[[2537,873],[-2,-1],[-2,-2],[-12,-7],[-2,-3],[-13,-9],[-12,-13],[6,-11],[2,2],[1,-1],[-2,-3],[-4,-3],[-10,11],[-4,-3],[-11,-11],[-14,-16],[-3,-2],[-3,-1],[-4,-4],[-4,-6],[-5,-3],[-5,-6],[0,-2],[0,-2],[-15,-18],[-2,-3],[-1,-1],[-3,0],[-3,-1],[-2,-4],[-8,-4],[-13,-1],[-3,1],[-13,1],[-12,2],[-13,0],[-16,-4],[-2,-2],[-5,-5],[-3,-1],[-2,-1],[-1,-1],[-11,-5],[-6,-4],[7,-19],[-4,-3],[-4,10],[-1,0],[2,-8]],[[2228,744],[9,10],[9,8],[10,5],[16,7],[43,17],[23,9],[21,8],[-11,38],[-13,45],[0,2],[1,0],[1,1],[1,0],[4,-1],[6,-2],[6,-3],[5,-4],[22,7],[-2,3],[-4,5],[-4,5],[-6,4],[-7,4],[-9,4],[-10,2],[-11,0],[-1,1],[-7,23]],[[2320,942],[10,1],[13,-1],[8,-2],[5,-1],[12,-4]],[[2215,729],[-2,5],[-6,23],[-6,19],[2,4],[6,7],[1,3],[-1,2],[-1,3],[-7,8],[-29,101],[17,6],[5,1],[8,3],[22,6],[73,19],[10,2],[13,1]],[[1879,863],[27,8],[14,3],[32,8],[56,16],[46,12],[17,4],[70,20],[124,31],[13,4]],[[2582,1092],[3,-15],[1,-6],[0,-4],[2,-8],[0,-4]],[[2104,990],[13,2],[5,1],[5,3],[3,3],[4,5]],[[2134,1004],[4,-5],[4,-3],[11,-19],[1,-1],[1,0],[38,10],[20,6],[4,-10],[2,-9],[4,-12],[52,13]],[[2134,1004],[2,3],[2,7],[1,6],[0,8],[-1,7],[-5,23],[17,5],[0,2],[0,3],[-2,7],[-3,5],[-3,5],[-5,6],[-5,5],[-2,5],[-2,5],[-5,18],[20,5],[5,-18],[2,-5],[4,-3],[5,-2],[4,1],[20,7],[22,10],[-5,19]],[[2200,1138],[25,6]],[[2096,1141],[41,12],[-3,9],[1,4],[2,7],[2,6],[25,-1],[16,-1],[3,0],[4,1],[6,-20],[-4,-10],[6,-5],[5,-5]],[[2069,1205],[-4,19],[0,3],[1,2],[37,8],[-8,26],[-6,23],[16,6],[3,3],[7,-23],[41,14],[12,4],[7,3]],[[2023,1318],[25,12],[16,9],[5,2],[1,1],[26,-42],[12,11],[22,21],[30,18],[24,-49],[2,-3]],[[2030,1408],[6,4],[50,41],[36,29],[17,14]],[[1953,1581],[11,-19],[9,-15],[1,-3],[77,61],[21,17]],[[6461,6069],[4,24],[18,-5],[8,-1]],[[6491,6087],[1,-12],[-2,-13],[-1,-5]],[[6489,6057],[-1,-4],[-2,-9],[-25,25]],[[6489,6057],[26,-26],[4,-4]],[[6519,6027],[-1,-5],[-4,-13],[-2,-10],[-6,-28],[-2,-8]],[[6504,5963],[-4,3],[-4,1],[-24,19]],[[6472,5986],[2,6],[2,11],[5,22],[-25,19],[5,25]],[[6326,5854],[4,-2],[25,-26],[2,1],[2,0],[2,-3],[1,-3],[33,-23]],[[6395,5798],[-2,-6],[-3,-5],[-3,-2],[-5,-3],[-6,-5],[-3,-1],[-3,-4],[-12,-26],[-3,-6]],[[6355,5740],[-10,-23],[-5,-11]],[[6340,5706],[-16,8],[-4,-11],[-2,-14],[-11,-39],[-5,1],[-1,-10],[-5,-14],[-7,-3]],[[6289,5624],[-4,-1],[-5,-2]],[[6280,5621],[-14,15],[-18,23],[-3,6],[0,1],[-16,-8],[-5,4],[-6,6],[-5,7],[-5,9],[-4,9],[0,7],[5,15],[5,9],[2,4],[9,13],[3,9],[11,25],[5,10],[3,8],[5,8],[22,24],[5,5],[2,2],[1,3],[0,13],[12,16],[3,6],[0,10],[13,31],[5,7],[1,1],[5,4],[8,4],[8,8],[1,-2],[-5,-5],[5,0],[4,2],[9,9],[25,29],[0,2],[3,-1],[3,5],[4,10],[2,1],[0,-5],[-1,-10],[-4,-10],[-8,-14],[-7,-9],[-8,-6],[-7,-3],[-14,-13],[-10,-10],[-1,-1],[-5,-11],[-6,-13],[-4,-13],[-1,-5],[1,-1],[0,-3],[-4,-7],[-1,-5],[-3,-6],[0,-4],[-9,-12],[0,-23],[-2,-13],[-5,-15],[0,-4],[-1,-5],[-2,-7],[-1,-13],[2,-1],[2,3],[2,-1],[-3,-12],[7,-2],[2,3],[3,6],[5,13],[1,6],[2,9],[1,8],[-1,26],[1,16],[5,5],[6,6],[-1,4],[1,5],[3,12],[3,4]],[[6407,6036],[-3,-8],[-3,9],[-3,0],[-2,2],[0,10],[1,8],[5,23],[0,6],[3,9],[6,11],[1,1],[6,-3],[1,-9],[-2,-14],[-4,-19],[-4,-8],[-2,-6],[0,-12]],[[6428,5995],[1,7],[3,10],[4,5]],[[6436,6017],[3,-9]],[[6439,6008],[-11,-13]],[[6395,6005],[-1,0],[-3,3],[0,2],[2,0],[3,0],[0,-2],[0,-1],[-1,-2]],[[8581,4842],[7,19],[4,9]],[[8592,4870],[5,10],[4,10]],[[8601,4890],[44,-24],[16,-8],[10,-6]],[[8671,4852],[-9,-16],[-1,-2],[-5,-11],[-2,-4],[-4,-12]],[[8689,4788],[-8,-23],[-11,5],[-7,4],[-6,3],[-15,8]],[[8671,4852],[3,6]],[[8674,4858],[10,-6],[28,-14]],[[8674,4858],[6,12],[7,16],[9,24],[1,4]],[[8697,4914],[11,-6],[28,-15]],[[8601,4890],[7,18],[7,16],[5,12],[5,12],[1,3]],[[8626,4951],[34,-18]],[[8660,4933],[4,-2],[33,-17]],[[8660,4933],[10,25],[9,24]],[[8679,4982],[9,23]],[[8688,5005],[29,-15],[8,-5],[16,-8]],[[8626,4951],[-8,5],[-61,32]],[[8557,4988],[4,5],[7,19],[10,24]],[[8578,5036],[9,23]],[[8587,5059],[10,-5],[46,-24],[11,-7],[-9,-23],[34,-18]],[[8601,4890],[-42,22],[-23,12]],[[8536,4924],[3,10],[3,10]],[[8542,4944],[4,17],[10,24],[1,3]],[[8592,4870],[-62,34]],[[8530,4904],[3,10],[3,10]],[[8563,4793],[-11,5],[-40,20],[-9,5]],[[8503,4823],[9,26],[9,23],[6,21],[3,11]],[[8546,4747],[-11,6],[-39,20],[-10,4]],[[8486,4777],[7,20]],[[8493,4797],[10,26]],[[8538,4725],[-11,5],[-40,20],[-9,5]],[[8478,4755],[8,22]],[[8514,4660],[-12,6],[-38,19],[-10,5]],[[8454,4690],[8,23],[8,21]],[[8470,4734],[8,21]],[[8470,4734],[-11,5],[-45,23],[-13,6]],[[8401,4768],[7,21]],[[8408,4789],[13,-6],[45,-23],[12,-5]],[[8454,4690],[-12,6],[-5,2],[-37,18],[-13,7]],[[8387,4723],[7,24],[7,21]],[[8436,4644],[-10,5],[-42,21],[-12,6]],[[8372,4676],[7,25]],[[8379,4701],[8,22]],[[8454,4690],[-9,-22],[-9,-24]],[[8379,4701],[-74,37]],[[8305,4738],[8,22],[16,43]],[[8329,4803],[8,21]],[[8337,4824],[10,-4],[48,-24],[13,-7]],[[8337,4567],[-45,9]],[[8292,4576],[-1,13],[-2,30],[-2,38],[1,2],[0,6],[0,7],[-2,1],[0,5],[1,8],[1,5],[3,10],[5,12],[9,25]],[[8372,4676],[-3,-9],[-2,-6],[-3,-10],[-5,-15],[-9,-29],[-1,-3],[-8,-26],[-4,-11]],[[8436,4644],[-9,-24],[-5,-16],[-14,-38],[0,-2],[-3,-9]],[[8405,4555],[-3,1],[-65,11]],[[8378,4487],[-9,5],[-36,21],[-2,1],[-10,6]],[[8321,4520],[7,20],[7,20],[2,7]],[[8405,4555],[-3,-7],[-2,-2],[-8,-20],[-6,-17],[0,-3],[-8,-19]],[[8434,4454],[-9,5],[-6,4],[-34,19],[-7,5]],[[8405,4555],[65,-10]],[[8470,4545],[-5,-13],[-8,-20],[-8,-19]],[[8449,4493],[-8,-20],[-7,-19]],[[8524,4473],[-9,5],[0,-3],[-3,-7],[-4,-10],[-51,30],[-8,5]],[[8501,4414],[-12,7]],[[8489,4421],[-35,21],[-1,0],[-11,7],[-8,5]],[[8418,4414],[7,20],[9,20]],[[8489,4421],[-4,-10],[-4,-9],[0,-4],[-3,-7],[-4,-9],[-47,27],[-9,5]],[[8394,4366],[10,18],[7,14],[7,16]],[[8339,4404],[5,9],[6,10],[6,11],[5,14]],[[8361,4448],[8,-5],[14,-8],[18,-10],[8,-5],[9,-6]],[[8361,4448],[8,19],[9,20]],[[8361,4448],[-9,6],[-32,18],[-2,1],[-10,6]],[[8308,4479],[7,20],[6,21]],[[8295,4435],[6,21],[7,23]],[[4188,1444],[-4,25],[-6,25],[-4,24],[-5,31],[14,-2],[26,0],[17,-1],[24,-1]],[[4250,1545],[6,-30],[4,-19],[4,-18],[3,-17],[4,-17],[4,-17]],[[4275,1427],[-25,-1],[-17,0],[-21,-1],[-19,-5],[-5,24]],[[4296,1317],[4,-22],[6,-30]],[[4306,1265],[-4,2],[-4,2],[-5,2],[-12,4],[-9,2],[-4,0],[-6,1],[-8,36],[-19,-1],[-52,-3]],[[4183,1310],[-4,23],[-5,23],[-11,56]],[[4163,1412],[-5,24],[30,8]],[[4275,1427],[3,-18],[3,-17],[4,-19],[4,-19],[3,-17],[4,-20]],[[2744,974],[-8,32],[25,9],[9,3],[1,1],[2,1],[1,2],[4,8],[16,26],[16,30],[17,27],[-11,46],[0,1],[-1,1],[-1,0],[-20,-9],[-22,-10],[-25,-11],[-1,-1],[0,-1],[0,-1],[2,-10],[0,-1],[0,-1],[-11,-5],[-26,-12],[-21,-10],[-21,-10]],[[6481,5902],[-5,-12]],[[6476,5890],[-44,30],[-8,-14],[-4,-8],[-3,-9],[0,-1],[-1,-4],[-1,-3],[-5,-20],[36,-25],[4,-3]],[[6450,5833],[-10,-23],[-9,-19]],[[6431,5791],[-1,2],[-3,2],[-10,6],[-17,12],[-5,-15]],[[6326,5854],[2,3],[3,2],[2,1],[7,7],[2,7],[0,4],[6,8],[2,4],[3,3],[0,-4],[2,-5],[2,0],[1,2],[0,7],[1,6],[15,21],[8,11],[6,4],[7,3],[8,7],[6,5],[5,7],[6,11],[5,17],[3,10]],[[6439,6008],[33,-22]],[[6472,5986],[-6,-15],[28,-20],[3,-1],[-2,-7],[-5,-16],[-4,-11],[-5,-14]],[[6504,5963],[14,-11],[9,-7],[12,-4],[19,-13],[19,-15]],[[6577,5913],[-6,-12],[-11,-22],[-11,-23]],[[6549,5856],[-64,43],[-4,3]],[[6552,6028],[60,-67]],[[6612,5961],[-14,-17],[-2,-3],[-12,-18],[-7,-10]],[[6519,6027],[22,-23],[11,24]],[[6636,5872],[-22,15],[-37,26]],[[6612,5961],[58,-61]],[[6670,5900],[-6,-6],[-2,-2],[-3,-2],[-4,-3],[-2,-1],[-3,-1],[-9,-6],[-3,-3],[-2,-4]],[[6596,5793],[-9,6],[-16,12],[4,9],[-33,23],[7,13]],[[6636,5872],[-6,-12],[-11,-22]],[[6619,5838],[-12,-22],[-11,-23]],[[6714,5822],[4,-5],[6,-4],[7,-5],[11,-8],[11,-8]],[[6753,5792],[-1,-3],[-9,-16],[-8,-17]],[[6735,5756],[-9,5],[-46,32],[-3,3],[0,2],[-58,40]],[[6636,5872],[6,-6],[53,-34],[17,-13],[2,3]],[[6670,5900],[11,15],[7,7]],[[6688,5922],[38,-61],[5,-6],[5,-7]],[[6736,5848],[-9,-10],[-13,-16]],[[6688,5922],[13,11],[14,13]],[[6715,5946],[49,-74],[-15,-13],[-13,-11]],[[2102,1961],[17,11],[13,9],[12,10],[3,2],[1,1],[2,2]],[[2063,2107],[15,-34],[6,-11],[7,-11],[4,-5],[8,-10],[6,-7],[1,-2],[10,-9],[19,-14],[11,-8]],[[1983,2132],[10,12],[3,2],[3,0],[2,-1],[12,-27],[3,-6],[3,-4],[4,-4],[2,-5],[6,-14],[28,16],[1,3],[3,3]],[[2063,2107],[1,2],[10,4],[-9,19],[7,5],[7,3],[4,2]],[[2083,2142],[19,0],[9,-1],[0,-22],[7,0],[8,1],[7,3],[9,-19],[8,-18],[9,-19],[8,-20],[13,-19]],[[2083,2142],[0,20],[-9,0],[-11,25],[0,3],[7,18],[-14,8],[4,6],[7,15],[7,15],[6,12],[8,11],[7,9]],[[2095,2284],[10,-8],[2,-4],[3,-8],[13,-27],[17,10],[18,11],[18,11],[16,11],[17,11]],[[2209,2291],[11,-29]],[[2220,2262],[18,-51],[2,-5],[4,-4],[5,-4],[28,-16],[-2,-5],[-8,-23]],[[2063,2107],[-16,36],[-31,70],[-12,25],[-19,42]],[[1985,2280],[87,59],[28,17],[-14,41]],[[2086,2397],[5,19]],[[2091,2416],[6,-2],[3,-4],[23,-50],[-15,-9],[-9,-7],[-2,-2],[-1,-4],[-6,-22],[-3,-13],[0,-5],[1,-3],[7,-11]],[[1964,2154],[22,25],[-32,71],[3,1],[4,2],[4,0],[4,3],[19,11],[-5,11]],[[1983,2278],[2,2]],[[1955,2280],[7,-14],[21,12]],[[1932,2331],[2,1],[2,-5],[3,-3],[3,-1],[5,3],[2,1],[4,6],[1,2],[10,6],[6,1],[5,1],[5,7],[5,12],[-3,11],[3,12],[1,0],[3,2],[7,0],[4,1],[3,3],[1,2],[1,7],[-2,4],[1,6],[0,2],[0,21],[6,15],[5,9],[2,10],[0,18],[4,10],[3,19],[6,17],[5,22],[3,8]],[[2038,2561],[-2,-10],[21,-22],[2,-2]],[[2059,2527],[-5,-14],[-2,-5],[-9,-25],[-2,-6],[0,-2],[0,-6],[0,-6],[-1,-64]],[[2040,2399],[-2,-21],[-1,-7],[0,-5],[-2,-7],[-18,-20],[-11,-9],[-13,-10],[-6,-7],[-7,-13],[-2,-4],[6,-14],[1,-2]],[[2040,2399],[25,15],[9,6],[1,2]],[[2075,2422],[11,-25]],[[2059,2527],[3,8]],[[2095,2473],[-17,-24],[-8,-18],[5,-9]],[[2276,2393],[-37,17]],[[2239,2410],[1,8],[0,6],[0,5],[-2,6],[-2,6],[-7,17],[-2,1],[-2,-1],[-12,-6],[-7,19],[16,8],[-14,38],[-7,9],[-13,-14],[-12,-14],[-20,-22],[-15,19],[-15,-17],[-11,-16],[-9,-13]],[[2106,2449],[-9,-19],[-6,-14]],[[2239,2410],[-6,1],[-5,0],[-7,-1],[-5,-2],[-41,-21]],[[2175,2387],[-8,20],[-8,17],[-16,35],[-13,-18],[-12,-18],[-12,26]],[[2238,2271],[-18,-9]],[[2209,2291],[-15,32],[-4,5],[-6,4],[-7,4],[7,19],[4,11],[-6,5],[-3,6],[-4,10]],[[2299,2382],[-7,-19],[7,-18],[-10,-5],[-2,0],[-2,0],[-6,3],[-17,8],[-10,-29],[-26,-13],[-1,-3],[13,-35]],[[6797,5762],[-3,2]],[[6794,5764],[0,6],[1,5],[2,11],[1,6],[7,14],[10,17]],[[6815,5823],[10,19],[16,26],[-16,8],[-38,59]],[[6787,5935],[15,13]],[[6802,5948],[13,12],[14,12],[13,11],[-40,64]],[[6802,6047],[13,12],[15,12]],[[6830,6071],[41,35],[2,2]],[[6873,6108],[6,-9],[11,-16],[9,-14],[15,-24],[11,-17]],[[6925,6028],[2,-3],[2,-3]],[[6929,6022],[2,-3],[5,-7],[5,-5],[0,-1],[5,-5]],[[7185,6081],[-18,13],[-11,-15],[-4,0],[-32,23],[-11,-19],[-6,4]],[[7103,6087],[-16,11],[-5,-8],[-2,-2],[-8,-19],[-6,-18]],[[6929,6022],[120,237],[5,10],[7,13]],[[7061,6282],[12,24]],[[7159,6046],[-18,13],[-9,-18],[-9,-15],[-4,-1],[-30,23],[-1,1],[0,2],[0,2],[5,16],[10,18]],[[7061,6282],[-4,5],[-18,26],[-36,57]],[[7003,6370],[15,13],[17,13],[-36,57]],[[6999,6453],[16,13],[10,9],[14,13]],[[7039,6488],[14,11]],[[7053,6499],[36,-56],[26,-41],[3,-9]],[[7003,6370],[-35,56]],[[6968,6426],[15,13],[16,14]],[[4901,1424],[11,-63]],[[4912,1361],[-19,-5],[7,-49],[5,-28]],[[4833,1264],[-5,30]],[[4828,1294],[-3,22],[-3,17],[-2,4],[-2,2],[2,0],[2,1],[2,2],[4,10],[5,7],[7,5],[3,2],[1,2],[0,1],[-1,3],[0,1],[-1,2],[-4,0],[-3,2],[-4,3],[-2,5],[-3,8],[-3,13]],[[4823,1406],[-2,17],[0,8],[2,5],[2,4],[4,3],[4,-1],[3,-2],[3,-3],[2,-6],[5,-20],[19,5],[17,4],[19,4]],[[4731,1222],[-6,45],[0,3],[-1,2],[1,5],[-3,22]],[[4722,1299],[31,-3],[20,-2],[4,0],[24,-2],[14,0],[13,2]],[[4722,1299],[-2,19],[-10,64]],[[4710,1382],[31,6],[25,6],[39,8],[18,4]],[[4892,1481],[9,-57]],[[4710,1382],[-4,27],[-3,26],[-3,20],[0,5],[1,7],[1,1],[2,4],[6,7]],[[4710,1479],[3,3],[2,1],[2,2],[1,0],[8,5],[6,3],[13,6],[20,8],[12,3],[14,1],[7,0],[8,0],[4,-1],[4,0],[4,-2],[25,-9],[5,-1],[24,-9],[20,-8]],[[4710,1382],[-3,-1],[-60,-10],[-10,3],[-20,8],[-19,7],[-4,22],[-4,21],[-4,23],[-34,10],[4,-23],[4,-21],[3,-21]],[[4563,1400],[-33,10]],[[4530,1410],[-7,46],[-5,24],[-8,49],[-2,1],[-4,0],[-20,4],[-36,5],[-51,2]],[[4397,1541],[-96,3]],[[4301,1544],[-16,0],[-35,1]],[[4250,1545],[-1,6],[-1,5],[-1,5],[-3,13]],[[4689,1559],[-1,-3],[0,-4],[-1,-5],[0,-3],[0,-2],[0,-4],[0,-2],[1,-4],[0,-3],[1,-3],[1,-2],[1,-2],[1,-1],[1,-2],[1,-2],[1,-1],[3,-2],[3,-1],[4,-3],[4,-2],[3,-2],[1,-1],[1,-1],[1,-2],[0,-1],[1,-2],[0,-1],[1,-1],[0,-1],[0,-1],[0,-1],[0,-2],[0,-1],[-1,-2],[0,-1],[-1,-3],[-1,-1],[-2,-2],[-2,-3]],[[4722,1299],[-3,0],[-26,2]],[[4693,1301],[-26,2]],[[4667,1303],[-20,2],[-14,2],[-24,2]],[[4609,1309],[-31,2],[0,4],[-3,18],[-3,23],[-4,20],[-5,24]],[[4609,1309],[-1,-3],[13,-78],[1,-3],[0,-5]],[[4622,1220],[-16,9],[-3,2],[-5,2],[-5,2],[-17,7],[-4,1],[-7,3],[-5,1],[-3,1],[-3,1],[-5,0],[-5,0],[-25,-5]],[[4519,1244],[-4,25],[-1,1],[-2,1],[1,5],[-8,41],[-8,49],[-8,48]],[[4489,1414],[17,4],[4,-2],[17,-5],[3,-1]],[[4731,1222],[-13,-1],[-12,-3],[-11,-2],[-12,-1],[-11,-2],[-6,0],[-6,0],[-10,1],[-6,0],[-7,1],[-6,1],[-4,2],[-5,2]],[[4667,1303],[9,-44],[1,-2],[2,-1],[19,3],[2,4],[-7,38]],[[4741,1173],[-2,1],[-3,1],[-1,2],[1,5],[2,12],[-1,2],[-1,2],[-3,-1],[0,-7],[-11,-1],[-7,-1],[-12,-2],[-6,-2],[-9,0],[-16,2],[-14,6],[-18,-2],[-7,-3],[-2,0],[-5,-1],[-7,-6],[-7,-9],[-7,-7],[-7,-3],[-16,-4],[-4,-3],[-3,-8],[-7,-11],[-3,-9],[-5,-4],[-8,-5],[-6,-6],[-4,1],[-2,1],[-2,6],[0,14],[-1,6],[-3,6],[-5,8],[-4,7],[-10,9],[-12,8],[-10,4],[-4,2],[-7,1],[-6,-1],[-4,0],[-5,0],[-5,5],[-3,-3],[-4,-5],[-5,-7],[-7,-15],[-1,-1],[-2,-6],[-2,-1],[-9,-19],[12,-21],[44,-7],[0,-3],[-1,-3],[-38,5],[-1,0],[-6,2],[-13,24],[-11,14],[-9,18],[-9,13],[-6,10],[-9,12],[-7,6],[-4,12],[-3,6],[-3,1],[-10,2],[-16,8],[-27,9]],[[4312,1239],[-6,26]],[[4306,1265],[18,-14],[7,-4],[13,-9],[8,-6],[7,-5],[5,-3],[4,-2],[5,-1],[5,-1],[7,0],[21,5],[6,1],[9,0],[8,0],[7,-1],[5,0],[6,0],[7,0],[5,-1],[4,1],[7,1],[8,2],[4,1],[12,5],[18,8],[3,1],[4,1]],[[4296,1317],[19,1],[17,1],[-2,2],[0,2],[-6,22],[-3,18],[-4,19],[-4,18],[-4,18],[-3,16],[13,2],[6,0]],[[4325,1436],[30,-8],[46,-11]],[[4401,1417],[48,-12],[12,2],[2,0],[24,6],[2,1]],[[4401,1417],[0,6],[-1,6],[-1,5],[3,2],[5,2],[6,1],[5,-2],[7,-1],[8,1],[-4,28],[-5,32],[-2,1],[-1,0],[-1,0],[-3,-1],[-3,0],[-18,8],[1,5]],[[4397,1510],[2,8],[-2,23]],[[4325,1436],[2,8],[-13,63],[-1,6]],[[4313,1513],[84,-3]],[[4313,1513],[-4,4],[-3,2],[-2,7],[-3,18]],[[6550,5222],[6,-1]],[[6545,5191],[-1,-4],[-7,-22]],[[6537,5165],[-5,3],[-42,20],[-4,-12],[-4,-11],[-4,-11],[-4,-11]],[[6474,5143],[-61,30]],[[6413,5173],[4,11],[4,11]],[[6421,5195],[4,11],[4,11],[8,24],[9,25]],[[6446,5266],[61,-31],[9,-4],[16,-8],[18,-1]],[[6446,5266],[-52,25],[-10,4]],[[6384,5295],[8,23],[8,21],[8,23]],[[6408,5362],[9,-5],[13,-6],[19,-9],[20,-9],[42,-21]],[[6511,5312],[-8,-22],[20,-10],[21,-10]],[[6544,5270],[18,-9],[-7,-22],[-5,-17]],[[6511,5312],[19,57]],[[6530,5369],[10,-7],[9,-6]],[[6549,5356],[10,-8],[10,-5],[-4,-13],[-9,-22],[-5,-15],[-7,-23]],[[6549,5356],[14,41],[8,24],[1,4]],[[6572,5425],[44,-32]],[[4088,1402],[18,2],[19,2],[18,2],[9,2],[11,2]],[[4183,1310],[1,-6],[4,-17],[4,-24],[-9,0],[-4,0],[-3,1],[-7,4],[-25,18],[-3,1],[-3,1],[-3,1],[-3,0],[-10,-2],[-18,-4],[-7,-1],[-5,-2],[-6,30],[-3,0],[-12,6],[-12,8],[-3,4],[-6,31],[-2,6],[1,4],[3,8],[7,10],[5,6],[3,3],[1,4],[4,-1],[9,2],[7,1]],[[6794,5764],[-10,7],[-16,11],[-15,10]],[[6715,5946],[13,12]],[[6728,5958],[31,-47]],[[6759,5911],[18,-28],[38,-60]],[[6759,5911],[13,12],[15,12]],[[6728,5958],[3,15],[1,6],[0,6],[14,14],[15,12]],[[6761,6011],[41,-63]],[[6761,6011],[13,12],[14,12]],[[6788,6035],[14,12]],[[6761,6011],[-41,64]],[[6720,6075],[14,11],[13,12]],[[6747,6098],[41,-63]],[[6747,6098],[15,12],[13,12],[14,14]],[[6789,6136],[10,-17],[10,-14],[9,-15],[12,-19]],[[6747,6098],[-17,28],[13,12],[-5,8],[-13,-11],[-18,27]],[[6707,6162],[14,12],[13,11]],[[6734,6185],[15,13]],[[6749,6198],[40,-62]],[[6720,6075],[-14,-13]],[[6706,6062],[-41,63]],[[6665,6125],[15,13],[13,12],[14,12]],[[6665,6125],[-40,64]],[[6625,6189],[15,12],[13,12],[13,12]],[[6666,6225],[41,-63]],[[6666,6225],[14,12]],[[6680,6237],[14,12]],[[6694,6249],[40,-64]],[[6694,6249],[14,12]],[[6708,6261],[16,15],[-13,21],[24,21],[3,2]],[[6738,6320],[14,-21],[24,-38]],[[6776,6261],[16,-26]],[[6792,6235],[-2,-2],[-25,-21],[-16,-14]],[[6680,6237],[-54,86]],[[6626,6323],[9,18]],[[6635,6341],[9,20]],[[6644,6361],[36,-56],[28,-44]],[[6644,6361],[4,7],[9,17],[10,23],[5,9],[2,5]],[[6674,6422],[26,-42]],[[6700,6380],[38,-60]],[[6635,6341],[-3,5],[-40,61]],[[6635,6480],[1,-2],[2,-3],[2,-3],[3,-3],[2,-3],[2,-4],[2,-3],[2,-3],[2,-3],[2,-3],[2,-3],[2,-4],[1,-2],[4,-6],[5,-4],[3,-5],[2,-4]],[[6607,6285],[-3,5],[-44,67]],[[6626,6323],[-10,-19],[-9,-19]],[[6587,6247],[-9,-20]],[[6578,6227],[-3,5],[-35,54]],[[6607,6285],[-9,-18],[-11,-20]],[[6625,6189],[-34,52],[-4,6]],[[6635,6101],[-66,106]],[[6569,6207],[9,20]],[[6665,6125],[-14,-13],[-7,-4],[-9,-7]],[[6608,6078],[-13,-12]],[[6595,6066],[-43,68],[-5,7]],[[6547,6141],[7,22],[8,23],[7,21]],[[6635,6101],[-12,-11],[-15,-12]],[[6547,6141],[-3,5],[-40,60],[-3,2]],[[6532,6080],[-3,5],[-40,62]],[[6547,6141],[-7,-31],[-8,-30]],[[6436,6017],[3,3],[0,21],[3,8],[3,12],[5,15],[0,3],[-16,42],[-11,-5],[-6,-1],[-2,0],[0,3],[0,3],[4,2],[3,1],[0,3],[1,1],[5,2],[0,3],[-2,1],[-1,0],[8,2],[3,-5],[6,-19],[5,-7],[4,-5],[3,-3],[2,3],[5,20],[1,1],[5,8],[1,5],[1,13],[3,17]],[[6489,6147],[-3,-14],[-1,-8],[0,-5],[1,-5],[1,-5],[2,-11],[2,-12]],[[6532,6080],[-13,-53]],[[7070,3733],[37,-28]],[[7035,3759],[6,11],[13,26]],[[7054,3796],[34,-27],[13,23],[37,-27]],[[7054,3796],[13,22],[3,6],[7,6],[8,4],[27,-21],[13,23]],[[7125,3836],[37,-27]],[[6988,3793],[6,13],[4,10],[16,40],[18,34],[1,2]],[[7033,3892],[2,-1],[3,-1],[2,0],[7,-2],[17,-9],[14,-7],[9,-7],[3,-3],[3,-2],[32,-24]],[[6403,5730],[-8,-18]],[[6395,5712],[-10,8],[-9,6],[-11,7],[-10,7]],[[6431,5791],[-10,-23],[-9,-20],[-9,-18]],[[6595,6066],[-17,-15],[-17,-15],[-9,-8]],[[6608,6078],[45,-70]],[[6653,6008],[-13,-12],[-14,-17],[-14,-18]],[[6667,6020],[-14,-12]],[[6706,6062],[-15,-13],[-8,-6],[-6,-5],[4,-6],[-14,-12]],[[6667,6020],[48,-74]],[[6733,6691],[-3,3],[-34,53],[-3,3],[-1,-26],[-1,-9],[-3,-13],[-6,-16],[1,-3],[0,-2],[-4,-11],[-3,-11],[-2,-2],[9,-14],[19,-30]],[[6702,6613],[-5,-8],[-17,-25]],[[6680,6580],[-4,-5],[-6,-8],[-3,-6],[-1,-3],[-2,-3],[-5,-10],[-3,-7],[-7,-18],[-6,-18],[-8,-21],[0,-1]],[[6618,6498],[1,2],[2,5],[4,11],[8,30],[9,23],[7,16],[3,9],[0,13],[2,8],[0,2],[2,8],[1,16],[3,9],[7,20],[4,15],[2,5],[4,7],[2,6],[4,9],[2,9],[2,15],[2,8],[1,10],[1,7],[4,10],[1,7],[7,20],[4,8],[7,24],[1,4]],[[6715,6834],[4,-9],[2,-4],[29,-45]],[[6750,6776],[-4,-31],[-1,-8],[-2,-14],[-2,-12],[-2,-7],[-6,-13]],[[6680,6580],[36,-55],[2,-5],[2,-8]],[[6720,6512],[-2,-3],[-11,-21]],[[6707,6488],[-8,-16],[-8,-16],[-8,-16],[-9,-18]],[[6733,6538],[-13,-26]],[[6702,6613],[8,14]],[[6710,6627],[9,-6],[2,-3],[25,-37],[4,-5],[-6,-14],[-11,-24]],[[6836,6486],[37,-55]],[[6873,6431],[-15,-14],[-23,-18],[-29,-21]],[[6806,6378],[-11,18],[-10,15],[-16,25]],[[6769,6436],[-45,71],[-4,5]],[[6733,6538],[16,20],[6,8],[4,4]],[[6759,6570],[26,-40],[17,-26],[20,-30],[14,12]],[[6769,6436],[-14,-8],[-5,-5]],[[6750,6423],[-43,65]],[[6750,6423],[-13,-10],[-11,-11],[-12,-10],[-14,-12]],[[6806,6378],[-19,-15],[-23,-20],[-12,-10],[-14,-13]],[[6806,6378],[38,-58]],[[6844,6320],[-19,-16],[-12,-11],[-12,-10],[-12,-9],[-13,-13]],[[6804,6217],[-12,18]],[[6844,6320],[38,-58]],[[6882,6262],[-19,-17]],[[6863,6245],[-12,-11],[-12,-10],[-10,16],[-11,-11],[-14,-12]],[[6908,6285],[-26,-23]],[[6844,6320],[27,22],[24,19]],[[6895,6361],[35,-56]],[[6930,6305],[-22,-20]],[[6919,6203],[-18,-18]],[[6901,6185],[-38,60]],[[6908,6285],[27,-43],[10,-15],[-26,-24]],[[6925,6028],[18,34],[-19,28],[-9,15]],[[6915,6105],[12,11],[11,10],[20,17],[-39,60]],[[6930,6305],[15,14],[16,13]],[[6961,6332],[14,11],[14,14],[14,13]],[[6915,6105],[-10,16],[-19,29],[-9,15],[12,10],[12,10]],[[6873,6108],[-12,20],[-10,15],[-18,29]],[[6833,6172],[-9,14],[-10,15],[-10,16]],[[6789,6136],[17,13],[24,20],[3,3]],[[7603,3852],[-6,4],[-6,5],[-1,4],[-9,7],[-9,6],[-8,6],[-9,7]],[[7555,3891],[-90,65]],[[7465,3956],[6,12],[7,13]],[[7454,3935],[11,21]],[[7555,3891],[-11,-23]],[[7544,3868],[-90,67]],[[7513,3814],[-20,15],[-11,2],[-22,17]],[[7460,3848],[10,21],[10,18],[-38,27]],[[7442,3914],[12,21]],[[7544,3868],[-12,-19]],[[7532,3849],[-10,-18],[-9,-17]],[[7460,3848],[-38,27]],[[7377,3964],[65,-50]],[[7388,3983],[66,-48]],[[7388,3983],[11,22]],[[7399,4005],[66,-49]],[[7412,4029],[66,-48]],[[7424,4053],[6,-5],[48,-35],[13,-9]],[[7435,4072],[65,-50]],[[4312,1239],[-1,0],[-57,11],[-13,1],[-5,-6],[-13,-39],[-2,-7],[-1,-2],[-3,4],[-3,14],[-2,5],[-10,14],[-6,5],[-23,18],[-7,8],[-5,3],[-6,8],[-8,4],[-5,0],[-4,4],[-3,0],[-3,-2],[-3,-2],[-8,0],[-2,-1],[-7,-1],[-5,-2],[-5,-4],[-4,0],[-7,0],[-6,-2],[-5,-3],[-2,-3],[2,-7],[0,-2],[-3,-3],[-11,-5],[-10,-8],[-3,-5],[-7,1],[-8,-1],[-2,0],[-4,3],[0,6],[0,27],[-3,13],[-2,21],[-1,5],[-4,23],[-3,9],[-5,14],[-1,0],[-14,19],[-1,1],[-23,27],[-9,7],[-7,10],[-7,12],[-2,0]],[[3948,1440],[2,-3],[4,-4],[21,-20],[8,-7],[6,-7],[7,-9],[14,-15],[2,2],[2,3],[2,3],[1,2],[2,5],[2,6],[-1,3],[2,4],[3,5],[3,5],[4,4],[5,4],[2,2],[-1,5],[-3,10],[0,9],[2,11],[3,8],[4,5],[6,8],[1,1],[1,3]],[[4052,1483],[2,1],[17,6],[17,-88]],[[4052,1483],[-4,3],[-6,1],[-9,5],[-8,6],[-5,3],[-8,45],[1,4],[-2,2],[-18,1],[-6,2],[-10,0],[-24,1],[-7,-2],[-1,0],[-1,0],[-21,-4]],[[3923,1550],[-2,6],[-5,-1],[0,1],[3,4],[0,1],[1,2],[1,2]],[[3921,1565],[0,2],[0,3],[0,4],[0,2],[-1,3],[-1,3],[-1,2]],[[3948,1440],[-25,110]],[[3729,1529],[-4,21],[-26,1],[0,4],[0,4],[19,3],[2,0],[14,2],[7,1],[14,2],[16,1],[11,0],[10,1],[15,0],[11,0],[25,-1],[19,-1],[22,0],[21,-1],[16,-1]],[[3621,1569],[-26,106]],[[3595,1675],[17,7],[6,2],[35,32],[11,3],[19,6]],[[3683,1725],[14,6],[7,5]],[[3469,1599],[23,8],[8,2],[9,8],[18,16],[18,16],[18,16]],[[3563,1665],[5,2],[27,8]],[[3422,1793],[20,17]],[[3442,1810],[6,-24],[16,6],[21,18],[12,10],[3,1],[2,-1],[2,-1],[7,-29],[17,6],[3,3],[32,-134]],[[3627,1871],[19,-76],[19,6]],[[3665,1801],[18,-76]],[[3442,1810],[21,18],[32,27],[24,20],[24,20]],[[3543,1895],[15,-61],[37,13],[4,3],[9,14],[19,7]],[[3342,1727],[-17,28],[-17,29],[29,25],[-14,26],[-12,19]],[[3311,1854],[17,14],[10,-18],[3,0],[16,12],[46,38],[14,12],[1,4],[-11,18],[17,14]],[[3424,1948],[11,-18],[2,0],[16,13],[16,14],[17,14],[7,6],[10,9],[17,14],[17,13]],[[3537,2013],[16,-26],[37,-59]],[[3590,1928],[-26,-22],[-6,-3],[-9,-4],[-6,-4]],[[3627,1871],[-7,29],[0,3],[2,2],[5,1],[13,3],[9,4],[2,2],[3,3],[1,4],[5,1],[0,3],[0,5],[1,4],[3,4],[5,3],[10,2],[2,-7]],[[3681,1937],[23,-101]],[[3704,1836],[-18,-23],[-6,-6],[-15,-6]],[[3703,1998],[-22,-18],[-5,-2],[-16,-5],[-14,-4],[-10,-3],[-12,-5],[-2,-2],[-6,-5],[-6,-5],[-5,-6],[-4,-6],[-11,-9]],[[3537,2013],[-33,54],[-5,8]],[[3499,2075],[3,2],[14,12],[20,-33],[2,0],[14,12],[13,10],[1,2],[0,3],[-19,31],[16,13]],[[3499,2075],[-23,38]],[[3476,2113],[-8,15],[-6,14]],[[6656,4951],[63,-30]],[[6488,5030],[9,25],[21,60],[3,7],[16,43]],[[6961,6332],[-36,56]],[[6925,6388],[14,12],[15,13],[14,13]],[[6925,6388],[-37,56]],[[6888,6444],[15,13],[14,12],[15,13]],[[6932,6482],[36,-56]],[[6932,6482],[15,13],[17,14],[16,14],[9,9],[14,12]],[[7003,6544],[36,-56]],[[7033,3892],[1,3]],[[7034,3895],[1,1],[76,130]],[[7111,4026],[9,14]],[[7173,3925],[-12,-22],[-13,-23]],[[7148,3880],[-11,-22],[-12,-22]],[[7148,3880],[37,-27]],[[7185,3853],[-11,-21],[-12,-23]],[[7209,3897],[-12,-22],[-12,-22]],[[7209,3897],[57,-43]],[[7295,3910],[-17,-32],[-12,-24]],[[6932,6482],[-36,56]],[[6896,6538],[16,14],[16,14],[15,13]],[[6943,6579],[11,9],[6,7],[7,6]],[[6967,6601],[36,-57]],[[6967,6601],[14,12]],[[6981,6613],[15,13],[14,12],[14,13]],[[7024,6651],[37,-57]],[[7061,6594],[-15,-13],[-14,-12],[-14,-13],[-15,-12]],[[6943,6579],[-35,57]],[[6908,6636],[10,9],[13,12],[-7,11]],[[6924,6668],[17,9]],[[6941,6677],[40,-64]],[[6941,6677],[15,9],[17,9],[17,9]],[[6990,6704],[12,-18],[10,-16]],[[7012,6670],[12,-19]],[[6990,6704],[27,16],[21,11],[2,1]],[[7040,6732],[12,7]],[[7052,6739],[13,-22]],[[7065,6717],[-29,-26],[-24,-21]],[[7114,6640],[-28,-25],[-25,-21]],[[7065,6717],[13,-20]],[[7078,6697],[-14,-13],[20,-33],[3,-1],[13,12],[14,-22]],[[7162,6681],[-48,-41]],[[7078,6697],[20,15],[16,11],[18,-30],[4,-1],[12,11],[14,-22]],[[7180,6696],[-2,-2],[-5,-4],[-11,-9]],[[7052,6739],[44,25],[27,15],[3,1]],[[7126,6780],[7,-11],[14,-22],[33,-51]],[[7040,6732],[-1,4],[-9,20],[-2,4],[38,32]],[[7066,6792],[4,-6],[1,-1],[9,0],[2,1],[8,7],[15,13],[2,2]],[[7107,6808],[16,-24],[3,-4]],[[7066,6792],[-12,19]],[[7054,6811],[-11,18],[15,13],[-6,9]],[[7052,6851],[16,14],[2,2]],[[7070,6867],[37,-59]],[[7133,6876],[11,-18],[14,-21]],[[7158,6837],[16,-26],[2,-3]],[[7176,6808],[-23,-13],[-16,-9],[-11,-6]],[[7070,6867],[-16,25]],[[7054,6892],[15,13]],[[7069,6905],[12,-18],[12,-18],[11,-18],[29,25]],[[7069,6905],[-11,18],[28,25]],[[7086,6948],[9,-14],[3,-4]],[[7098,6930],[11,-18],[12,-18]],[[7121,6894],[12,-18]],[[7121,6894],[15,13],[13,11]],[[7149,6918],[41,-63]],[[7190,6855],[-16,-9],[-16,-9]],[[7098,6930],[15,12],[14,13]],[[7127,6955],[14,12],[23,-36],[-15,-13]],[[7220,6935],[11,-17]],[[7231,6918],[11,-17],[10,-15]],[[7252,6886],[-44,-22],[-18,-9]],[[7127,6955],[-37,56]],[[7090,7011],[14,13],[25,20]],[[7129,7044],[55,-86],[22,-34],[14,11]],[[7129,7044],[13,11]],[[7142,7055],[12,-18],[11,-17]],[[7165,7020],[10,-16],[11,-17]],[[7186,6987],[11,-17]],[[7197,6970],[12,-18]],[[7209,6952],[11,-17]],[[7247,7038],[-61,-51]],[[7165,7020],[34,30],[13,12]],[[7212,7062],[12,11],[12,-18],[11,-17]],[[7247,7038],[22,20],[2,2]],[[7271,7060],[11,-17]],[[7282,7043],[-2,-2],[-83,-71]],[[7287,6993],[-9,16],[-1,0],[-1,1],[-1,0],[-1,-1],[-65,-57]],[[7282,7043],[22,-34]],[[7304,7009],[-2,-3],[-15,-13]],[[7254,6938],[-23,-20]],[[7287,6993],[-14,-11],[-15,-13],[-15,-13],[11,-18]],[[7278,6900],[-2,3],[-11,17],[-11,18]],[[7287,6993],[41,-62],[-1,-4],[-15,-7],[-17,-9],[-17,-11]],[[7304,7009],[47,-72]],[[7351,6937],[13,-21],[3,-4]],[[7367,6912],[-4,-1],[-4,-2],[-29,-16],[-37,-20],[-2,4],[-12,21],[-1,2]],[[7304,7009],[16,13],[46,-72],[-15,-13]],[[7749,3826],[-13,-26]],[[7736,3800],[-12,9],[-19,14],[-22,15],[-9,8]],[[7688,3870],[9,-7],[41,-29],[11,-8]],[[7726,3783],[-8,7],[-17,12],[-8,-1],[-31,22]],[[7700,3892],[9,-7],[41,-29],[11,-9]],[[7761,3847],[-12,-21]],[[7713,3916],[9,-7],[41,-30],[10,-8]],[[7773,3871],[-10,-18],[-2,-6]],[[7735,3956],[19,-15],[31,-23],[9,-7]],[[7794,3911],[-1,-3],[-8,-15],[-12,-22]],[[7804,3927],[-10,-16]],[[7754,3989],[49,-37]],[[7803,3952],[-9,-17],[10,-8]],[[7773,4024],[30,-23],[19,-15],[-9,-17],[-5,-8],[-5,-9]],[[7805,4083],[22,-17]],[[7864,4039],[-6,-12],[-5,-8],[-8,-16]],[[7845,4003],[-8,-15],[-5,-9],[-3,-6],[-7,-11],[-2,-4]],[[7820,3958],[-7,-14],[-1,-2],[-4,-7],[-4,-8]],[[7989,7819],[7,9],[8,7],[-25,39]],[[7979,7874],[12,16],[13,18],[-12,20],[-2,2]],[[7990,7930],[34,44]],[[8024,7974],[2,-3],[13,-19],[-5,-8],[9,-15],[0,-5],[-2,-5],[-8,-8],[-1,-2],[1,-4],[20,-29]],[[8053,7876],[-18,-15],[7,-11],[-16,-14],[22,-35],[0,-2],[0,-1],[-11,-15],[-13,-15],[-9,14],[-20,-24],[-2,-1],[-2,2],[-9,14],[0,2],[1,3],[19,24],[-6,10],[-7,7]],[[8024,7974],[33,41],[2,3]],[[8059,8018],[2,-3],[9,-14],[4,-6],[5,-8],[10,-19],[9,-19],[2,-3]],[[8100,7946],[-3,-3],[2,-3],[9,-15],[-18,-15],[-16,-15],[-21,-19]],[[7990,7930],[-13,20],[-24,38]],[[7953,7988],[-20,32]],[[7933,8020],[15,12],[12,11],[13,11],[14,12],[23,20],[3,3]],[[8013,8089],[2,-3],[10,-16],[8,-12],[12,-19],[9,-14],[5,-7]],[[7990,7930],[-73,-91]],[[7870,7913],[19,16],[11,15],[6,5],[17,13],[14,13],[16,13]],[[7816,7998],[20,16],[24,22],[9,11],[12,17],[13,18]],[[7894,8082],[39,-62]],[[7803,8020],[17,15],[17,15],[7,7],[7,7],[5,7],[11,15]],[[7867,8086],[12,18]],[[7879,8104],[15,-22]],[[7879,8104],[22,31],[10,14],[12,17],[17,24],[2,3],[2,3]],[[7944,8196],[19,-29],[3,-6],[11,-17],[10,-15],[4,-7],[13,-20],[9,-13]],[[7879,8104],[-2,4],[-3,5],[-13,20]],[[7861,8133],[11,10],[4,5],[5,6],[1,4],[-10,15],[-2,3],[-1,2],[-11,17],[5,3],[11,10],[13,12],[-47,75]],[[7840,8295],[22,27]],[[7862,8322],[11,-18],[3,-4],[10,-16],[3,-4],[11,-16],[2,-5],[11,-17],[8,-9],[19,-30],[2,-4],[2,-3]],[[7861,8133],[-29,45],[-12,20],[-1,1],[-16,26],[-14,20]],[[7789,8245],[24,24],[14,11],[13,15]],[[7867,8086],[-3,3],[-8,12],[-14,-12],[-15,-12],[-14,22],[-11,18],[-13,21]],[[7789,8138],[5,8],[7,7],[15,12],[-22,34],[-20,31]],[[7774,8230],[15,15]],[[7719,8067],[-12,19],[-18,28],[14,14],[-14,20],[9,10],[11,10],[25,19],[7,7],[5,5],[15,16],[13,15]],[[7789,8138],[-11,-15],[-6,-9],[-7,-8],[-15,-12],[-15,-13],[-16,-14]],[[1401,355],[2,-11],[4,-16],[-6,-3],[-5,-3],[-5,-2],[-8,-4],[-15,-7],[-6,-2],[-9,-4],[-11,-7],[-4,-3],[-7,-4],[-4,-2],[-8,-5],[-10,-5],[-6,-4],[-7,-6],[-4,-2],[-6,-5],[-4,-4],[-6,-3],[-10,-5],[-13,-7],[-2,-2],[-35,-25],[-2,2],[1,10],[-2,22],[-2,34]],[[1211,282],[-7,103],[-3,32],[36,4],[9,2],[3,1],[3,2],[2,1],[2,3],[4,8],[3,7],[3,3],[9,5]],[[1376,513],[6,-34],[1,-20],[1,-10],[1,-7],[1,-8],[2,-7],[3,-12],[7,3],[3,2],[-2,-18],[-2,-16],[0,-6],[3,-18],[1,-7]],[[7664,7713],[-3,-3],[-17,-14]],[[7644,7696],[-35,54],[-8,13],[-2,2],[-2,-1],[-26,-23],[-13,-11],[-1,-4],[0,-3],[7,-11],[-16,-14]],[[7548,7698],[-22,34],[21,18],[1,2],[2,1],[18,16],[2,3],[-1,3],[-18,29],[-3,4],[-16,-14]],[[7577,7652],[-29,46]],[[7644,7696],[-15,-14]],[[7629,7682],[-13,-11],[-6,-3],[-14,-7],[-19,-9]],[[7560,7638],[13,11],[4,3]],[[7629,7682],[12,-18],[13,-22],[10,-14],[1,-4],[-2,-2],[-26,-25]],[[7637,7597],[-16,-14],[-16,-14],[-45,69]],[[7650,7576],[-13,21]],[[7664,7713],[35,-54]],[[7699,7659],[-4,-3],[-16,-14],[12,-19],[-22,-26],[-19,-21]],[[7765,7647],[-32,-41]],[[7733,7606],[-34,53]],[[7679,7533],[-2,2],[-14,22],[-13,19]],[[7733,7606],[1,-3]],[[7734,7603],[-2,-3],[-16,-20],[-9,-11]],[[7707,7569],[-26,-33],[-2,-3]],[[7713,8005],[-20,31],[0,6],[4,5],[22,20]],[[7540,8005],[7,8],[2,2],[11,13],[10,10],[22,24],[2,2],[2,3],[4,5],[13,13],[1,10],[5,8],[11,4],[5,0],[6,6],[2,5],[8,9],[15,21],[3,3],[2,6],[7,9],[9,1],[15,20],[19,27],[3,2],[2,2],[4,5],[4,9],[5,3],[6,3],[21,22],[7,8],[28,24],[15,11],[8,7],[10,8],[4,4],[6,7],[4,6]],[[6790,4231],[-7,-19],[-6,-17]],[[6777,4195],[-8,4],[-44,22],[-9,4]],[[6716,4225],[6,17]],[[6722,4242],[6,16],[27,-12],[8,-1],[19,-10],[8,-4]],[[6777,4195],[-5,-15]],[[6772,4180],[-53,25],[-8,5]],[[6711,4210],[5,15]],[[6766,4164],[-7,3],[-45,22],[-9,4]],[[6705,4193],[6,17]],[[6772,4180],[-6,-16]],[[6711,4210],[-62,29]],[[6649,4239],[5,15]],[[6654,4254],[7,17]],[[6661,4271],[61,-29]],[[6649,4239],[-58,28],[5,16]],[[6596,4283],[58,-29]],[[6594,4303],[58,-28],[9,-4]],[[6596,4283],[-8,4],[4,12],[2,4]],[[6666,4288],[-5,-17]],[[6594,4303],[-9,5],[-3,1],[-5,3],[-2,-3],[-2,-6],[-2,-6],[-1,-3],[-1,-5],[1,-4],[1,-5],[6,-18],[0,-4]],[[6577,4258],[-2,-3],[-2,-5],[-4,-1],[-4,-1],[-4,-3],[-5,-1],[-4,-2],[-1,0],[-1,0],[-3,0],[-3,1],[-1,1]],[[6592,4365],[2,-1],[3,-1]],[[6597,4363],[-3,-8]],[[6594,4355],[-2,-3],[-3,-5],[-7,-18],[6,-3],[78,-38]],[[6649,4239],[-6,-16]],[[6643,4223],[-56,26],[-4,3],[-4,3],[-2,3]],[[6705,4193],[-14,7],[-48,23]],[[6766,4164],[10,-5],[53,-26]],[[6829,4133],[62,-30]],[[6891,4103],[-1,-4],[-43,21],[-1,-4]],[[6846,4116],[-20,10],[-20,9]],[[6806,4135],[-19,9],[-20,10],[-20,9]],[[6747,4163],[-20,10],[-19,10],[-20,9],[-18,-50],[-7,-23],[-14,-39]],[[6649,4080],[-19,9],[-19,9],[-18,9],[-19,8],[-40,20]],[[6626,4014],[5,17],[17,46],[1,3]],[[6747,4163],[-17,-50],[-5,-13],[-17,-48],[-1,-3],[-18,-51],[-5,-13]],[[6684,3985],[-7,2],[-15,4],[-10,4],[-10,6],[-5,2],[-2,2],[-3,3],[-4,3],[-1,2],[-1,1]],[[6744,3958],[-11,5],[-8,5],[-3,2],[-13,10],[-2,2],[-1,2],[-22,1]],[[6806,4135],[-16,-46],[-15,-40],[-9,-25],[-1,-3],[-17,-51],[-4,-12]],[[8952,8419],[-76,-62],[-71,-58],[-6,-5],[-3,-1],[-10,-8],[-17,-14],[-32,-26],[-17,-15],[-15,-12],[-54,-36],[-25,-19],[-11,-9]],[[8615,8154],[-28,-23],[-9,-8],[-8,-9],[-11,-11],[-6,-7],[-7,-6],[-69,-57],[-3,-2],[-3,-3],[-18,-17],[-8,-7],[-2,-2]],[[8443,8002],[-1,2],[-1,1],[-8,13],[-34,54],[-31,51],[-18,27]],[[8350,8150],[-26,40],[-6,10],[-23,37],[-3,4]],[[8292,8241],[2,1],[4,3],[6,2],[4,2],[2,2],[15,12],[18,16],[13,11]],[[8356,8290],[14,17],[18,16],[21,16],[22,14]],[[8431,8353],[23,11],[8,6],[10,6],[35,23],[51,26],[22,15],[-7,14],[-2,5],[-3,5],[-6,9],[-1,1],[-4,7],[-5,5],[-8,7],[-3,2],[-8,4],[-10,5],[-2,1],[-1,0],[-8,3],[-12,4],[-2,1],[-11,4],[-6,2]],[[8481,8519],[-12,6],[-9,8],[-9,12],[-6,10],[-5,13]],[[8440,8568],[19,10],[18,10],[15,9],[15,8],[1,2],[0,3],[-24,57],[-1,1],[-3,0],[-14,-8],[-34,-19],[-18,-11]],[[8414,8630],[-12,29]],[[8402,8659],[3,3],[29,40],[20,26],[11,15],[3,3]],[[8468,8746],[20,-18],[-11,-16],[0,-2],[1,-2],[8,-7],[11,-15],[4,-5],[4,-9]],[[8505,8672],[22,-54],[16,-39],[2,-4],[4,-7],[6,-6]],[[8555,8562],[-12,-15],[-9,-12],[16,-13],[11,-2],[24,-2],[1,-9],[22,-53],[35,29],[41,38],[2,2]],[[8686,8525],[69,70],[7,7],[1,4],[5,7],[27,27]],[[8795,8640],[16,16],[20,20],[2,2]],[[8833,8678],[2,-3],[13,-29],[32,-70],[0,-4],[67,-144],[3,-6],[2,-3]],[[8431,8353],[0,5],[-2,6],[-40,93],[-36,88]],[[8353,8545],[20,11]],[[8373,8556],[37,-87],[19,11],[-7,18],[-1,3],[2,2],[19,11],[4,1],[2,-1],[7,-6],[5,-11],[16,10],[2,2],[3,10]],[[8373,8556],[20,11],[-11,27],[-1,2],[2,3],[13,15],[11,12],[7,4]],[[8414,8630],[26,-62]],[[8353,8545],[-6,13],[-8,20],[-3,7]],[[8336,8585],[-2,3],[-12,28],[-1,5],[1,3],[1,4],[2,4],[13,8],[-5,12],[-3,5],[-11,24],[-4,8]],[[8315,8689],[29,24],[26,25],[17,18],[21,21],[11,-26],[7,-15],[-15,-20],[-20,-28],[0,-1],[10,-24],[1,-4]],[[8094,8578],[17,5],[10,1],[25,3],[10,0],[20,7],[11,2],[1,1],[6,3],[7,7],[8,10],[3,1],[8,5],[10,3],[19,16],[1,4],[5,3],[4,6],[3,3],[5,3],[6,3],[5,3],[6,8],[8,12],[5,1],[8,6]],[[8305,8694],[4,5],[6,-10]],[[8336,8585],[-3,-2],[-7,-6],[-75,-65],[-13,-10]],[[7915,5295],[-11,6],[-53,27],[-2,1],[-10,5]],[[7839,5334],[12,23],[2,3]],[[7853,5360],[76,-39]],[[2762,2202],[-32,16]],[[2489,2977],[-10,27],[-10,32]],[[2469,3036],[9,14],[12,20],[7,16],[4,7]],[[2501,3093],[11,22],[8,15],[3,5],[3,5],[13,19],[3,4],[5,8],[4,8]],[[2501,3093],[-2,4],[-14,36],[-21,59],[-28,54]],[[2436,3246],[25,12],[8,5],[5,5],[5,9],[3,0],[2,-1],[13,-26],[12,17],[12,-26],[27,20]],[[2436,3246],[-25,51],[-1,4],[2,35],[1,23],[3,64],[0,23],[3,8]],[[2469,3036],[-3,-3],[-17,45]],[[2449,3078],[1,3],[6,11],[3,10],[2,10],[-2,10],[-1,1],[-1,5],[-3,6],[-2,3],[-1,7],[-2,4],[-4,8],[-3,4],[-2,2],[-4,4],[-1,3],[-1,0],[-1,11],[-2,16],[0,5],[-2,0],[-1,3],[-1,9],[0,3],[-3,4],[-4,4],[-3,5],[-6,7],[-3,0],[-2,1],[-14,-1],[-12,-2],[-7,-2],[-2,-2],[-4,0],[-5,0],[-7,9],[-4,9],[0,3],[-4,6],[-4,12],[-1,10],[1,9],[2,2],[6,7],[7,11],[2,3],[3,3],[1,0],[-2,7],[0,6],[0,8],[0,2],[8,13],[3,9],[5,11],[6,14],[0,8],[-1,12],[-2,12],[-1,8],[4,6],[6,4],[2,5],[2,5],[6,16],[6,19],[1,10],[1,7],[8,5],[13,7]],[[2385,3434],[-2,-1],[-1,1],[-1,3],[0,2],[0,3],[-4,5],[-3,2],[-7,8],[0,3],[-5,6],[-3,6],[-1,6],[3,2],[12,11],[16,13],[8,5],[5,3],[3,1],[3,-1],[1,-2],[0,-3],[-1,-3],[-2,-5],[-1,-6],[-1,-8],[1,-3],[-2,-8],[-2,-2],[-3,-7],[-3,-7],[-2,-7],[0,-3],[-5,-12],[-3,-2]],[[6896,6538],[-37,56]],[[6859,6594],[16,14],[16,13],[17,15]],[[6859,6594],[-18,27]],[[6841,6621],[19,11],[19,10],[18,10]],[[6897,6652],[11,7],[16,9]],[[6888,6444],[-15,-13]],[[6836,6486],[16,14]],[[6852,6500],[15,13],[14,13],[15,12]],[[6925,6388],[-16,-14],[-14,-13]],[[6842,6934],[-29,47],[-15,24],[-3,-9],[-4,-15]],[[6791,6981],[-10,9]],[[6781,6990],[28,110],[36,85],[1,13],[7,11]],[[6853,7209],[8,-17]],[[6861,7192],[-3,-5],[-5,-9],[-22,-52],[-1,-5],[-3,-7],[-1,-4],[7,-4],[19,-29],[11,-18]],[[6863,7059],[-6,-5],[-4,-16],[-7,-24],[-9,-33],[16,-25],[-5,-16],[-6,-6]],[[6863,7059],[17,-26],[5,0],[16,-21],[3,-3]],[[6904,7009],[-20,-57]],[[6884,6952],[-1,-2],[-17,-51]],[[6866,6899],[-3,3],[-5,9],[-16,23]],[[6960,7041],[-3,-3],[-15,-13],[-21,33],[-17,-49]],[[6861,7192],[7,-12],[12,-20],[39,-59],[9,-14],[2,-3]],[[6930,7084],[5,-6],[25,-37]],[[6983,7161],[-14,-29],[-11,16],[-3,4],[-15,-40],[-10,-28]],[[6861,7192],[18,32],[3,6],[4,6],[15,24],[1,2],[2,3],[17,21]],[[6921,7286],[6,-10],[2,-2],[7,-5],[27,-42],[-10,-20],[13,-20],[2,-4]],[[6968,7183],[15,-22]],[[6921,7286],[7,9],[8,11],[3,4],[3,3],[3,3],[6,6],[10,7]],[[6961,7329],[11,-17],[7,-2],[4,-7],[15,-24],[13,-20],[2,-3]],[[7013,7256],[-2,-3],[-7,-9],[-9,-14],[-13,-22],[-14,-25]],[[6961,7329],[10,8],[11,8],[4,3],[5,5],[4,3],[9,11],[11,12],[13,18]],[[7028,7397],[23,-35],[-36,-32],[23,-37],[2,-3]],[[7040,7290],[-13,-15],[-12,-15],[-2,-4]],[[7028,7397],[14,16],[2,3]],[[7062,7388],[28,-45],[2,-3]],[[7092,7340],[-2,-2],[-18,-15],[-10,-9],[-10,-11],[-12,-13]],[[7028,7233],[-15,23]],[[7092,7340],[14,-22]],[[7106,7318],[-2,-2],[-21,-18],[-15,-15],[-17,-21],[-23,-29]],[[7039,7215],[-11,18]],[[7106,7318],[12,-18]],[[7118,7300],[-2,-2],[-23,-19]],[[7093,7279],[-15,-16]],[[7078,7263],[-13,-15]],[[7065,7248],[-11,-14],[-15,-19]],[[7184,7234],[-15,-13]],[[7169,7221],[-12,17]],[[7157,7238],[-39,62]],[[7106,7318],[16,14],[62,-98]],[[7267,7329],[-58,-61],[-25,-34]],[[6853,7209],[6,10],[38,53],[5,10],[7,9],[4,6],[9,13],[22,28],[23,24],[4,6],[12,13],[17,24],[13,14],[18,24],[14,13],[5,6],[25,33],[20,29],[14,27]],[[7109,7551],[2,-5],[17,-27]],[[7350,7713],[-11,18],[-14,-13],[-6,-7],[-2,-2],[-7,-9],[-13,-18],[-8,-8],[-13,-12],[-15,-14],[-9,-8]],[[7252,7640],[-14,-13],[-1,0],[-3,-3],[-5,-4],[-4,-3],[-8,-7],[-14,-9],[-9,-9],[-30,-33]],[[7164,7559],[-32,-36],[-4,-4]],[[7109,7551],[1,3],[8,11],[1,4],[0,5],[3,4],[6,5],[4,3],[2,4],[6,12],[3,3],[17,7],[5,3],[10,-2],[14,3],[35,24],[3,3],[7,4],[3,6],[4,3],[11,8],[10,8],[8,7],[10,4],[6,7],[11,12],[8,13],[0,5],[-5,7],[0,3],[2,3],[3,0],[7,-6],[13,11],[3,7],[3,4],[9,11],[18,18],[16,20],[5,4],[6,4],[5,5]],[[7300,7735],[-4,-4],[-4,2],[-7,-9],[-4,-3],[-4,-1],[-18,-4],[-8,-1],[-5,1],[-3,3],[-2,3],[-2,7],[-1,7],[1,5],[12,16],[12,15],[8,9],[30,22],[5,3],[11,4],[2,2],[7,3],[22,8],[3,-1],[2,-4],[-1,-4],[-7,-12],[-10,-13],[-10,-11],[-11,-17],[-6,-6],[-5,-5],[-3,-5],[-1,-4],[1,-6]],[[7204,7708],[-2,0],[-3,3],[-4,14],[1,12],[-6,5],[-1,11],[11,23],[9,8],[18,9],[25,30],[14,13],[10,5],[3,-3],[1,-8],[-3,-10],[-6,-8],[-16,-21],[-9,-10],[-6,-8],[-6,-6],[-5,-7],[0,-6],[-6,-16],[-4,-11],[-2,-11],[-9,-8],[-4,0]],[[7526,5104],[-47,35]],[[7479,5139],[4,8],[1,1],[3,7],[3,5],[2,3],[4,7]],[[7532,5214],[24,-18]],[[7556,5196],[-2,-3],[-9,-18],[-4,-15],[1,-9],[-6,-24],[-6,-13],[-4,-10]],[[7479,5139],[-47,32]],[[7432,5171],[-11,8]],[[7446,5078],[-8,5],[-30,23],[-8,5],[10,19],[11,20],[11,21]],[[7479,5139],[-12,-22],[-11,-20],[-10,-19]],[[7446,5078],[-11,-22]],[[7435,5056],[-9,6],[-29,22],[-8,6]],[[7461,4983],[-10,7],[-28,21],[-9,6],[11,20],[-9,6],[-29,21],[-9,7]],[[7435,5056],[8,-6],[30,-21],[9,-7]],[[7482,5022],[-11,-20],[-10,-19]],[[7432,4928],[-9,7],[-31,22],[-8,6],[-8,7],[-29,21],[-8,6]],[[7461,4983],[-11,-20],[-9,-17],[-9,-18]],[[7432,4928],[-10,-17]],[[7422,4911],[-8,6],[-31,23],[-8,6],[-9,6],[-13,9]],[[7743,7476],[-36,56],[13,17],[-13,20]],[[7734,7603],[26,-40],[10,-14],[15,-20],[2,-2]],[[7787,7527],[-3,-3],[-2,-3],[-13,-14],[-13,-16],[-13,-15]],[[7658,7506],[2,3],[17,21],[2,3]],[[7743,7476],[-12,-15],[-13,-15],[-13,-15],[-20,33],[-15,23],[-12,19]],[[7743,7476],[14,-22],[-14,-12],[13,-21],[-12,-15],[-13,-16],[-13,-17],[-17,-16],[-26,42],[-16,-13],[-24,36],[-24,36]],[[7611,7458],[16,13],[7,8],[2,2],[2,2],[10,11],[8,10],[2,2]],[[7493,7356],[25,22],[27,22]],[[7545,7400],[30,27],[36,31]],[[7787,7527],[2,-2],[41,-49],[2,-2],[12,-15],[24,-29],[23,-28],[1,-1],[1,-2]],[[7893,7399],[-3,-3],[-50,-58],[-51,-57],[-31,-36],[-38,-43],[-39,-44],[-36,-40]],[[7493,7356],[-2,2],[-36,57]],[[7455,7415],[7,6],[18,14],[16,12]],[[7496,7447],[16,15],[5,-9],[4,-13],[4,-9],[18,-28],[2,-3]],[[7489,7566],[52,-81],[43,36]],[[7584,7521],[3,-6],[4,-9],[1,-9],[0,-4],[1,-5],[3,-5],[13,-22],[2,-3]],[[7496,7447],[-55,85]],[[7441,7532],[17,15]],[[7458,7547],[8,7],[7,4],[8,4],[5,2],[2,1],[1,1]],[[7489,7566],[6,6],[7,14],[5,7],[20,17]],[[7527,7610],[13,-21],[31,-48],[13,-20]],[[7527,7610],[17,14],[16,14]],[[7455,7415],[-50,78]],[[7405,7493],[-50,77]],[[7355,7570],[6,6],[8,9],[21,-34],[23,19],[2,1],[2,-1],[10,-16],[3,-4],[11,-18]],[[7377,7469],[16,13],[12,11]],[[7164,7559],[14,-23],[18,-29],[3,-3],[11,-18],[11,-19],[2,-4]],[[7204,4330],[-10,-18],[-8,6],[-44,32],[-7,6]],[[7135,4356],[10,18],[6,10],[5,9],[1,1],[1,2]],[[7158,4396],[4,-4],[4,-6],[6,-4],[13,-10],[13,-9],[10,-8],[7,-5]],[[7215,4350],[-5,-10],[-6,-10]],[[7204,4330],[7,-6],[1,-1],[7,-5],[-5,-11],[-5,-10],[25,-18],[9,-6]],[[7243,4273],[-10,-18],[-5,-9],[-3,-5]],[[7225,4241],[-91,23]],[[7134,4264],[-2,1],[-39,11]],[[7093,4276],[11,21],[1,4],[10,18],[10,19],[10,18]],[[7091,4486],[9,-4],[9,-5],[9,-4],[10,-5],[8,-4],[8,-4],[2,-2]],[[7146,4458],[-1,-3],[-8,-15],[9,-8],[22,-16],[7,-5]],[[7175,4411],[-9,-8],[-8,-5],[0,-2]],[[7093,4276],[-2,0],[-68,18]],[[7069,4228],[-38,18],[-6,-19]],[[7025,4227],[-67,33],[-10,4]],[[7093,4276],[-7,-11],[-10,-22],[-1,-3],[0,-2],[-3,-2],[-3,-8]],[[7062,4209],[-7,-20]],[[7055,4189],[-30,15],[-8,3]],[[7017,4207],[8,20]],[[7069,4228],[-5,-13],[1,-2],[-1,-3],[-2,-1]],[[7049,4170],[-7,-18]],[[7042,4152],[-16,7],[-8,4],[-5,2],[-9,5]],[[7004,4170],[6,18]],[[7010,4188],[7,19]],[[7055,4189],[-6,-19]],[[7029,4115],[-6,-17]],[[7023,4098],[-10,4],[-19,9],[-9,5]],[[6985,4116],[7,18]],[[6992,4134],[6,18]],[[6998,4152],[6,18]],[[7042,4152],[-6,-19]],[[7036,4133],[-7,-18]],[[7112,4117],[-9,-16]],[[7103,4101],[-9,4],[-50,24],[-8,4]],[[7042,4152],[8,-4],[52,-26],[2,0],[8,-5]],[[7103,4101],[-10,-17]],[[7093,4084],[-9,5],[-47,22],[-8,4]],[[7093,4084],[-9,-16]],[[7084,4068],[-9,4],[-44,22],[-8,4]],[[7084,4068],[-8,-16],[-51,24],[-8,4]],[[7017,4080],[6,18]],[[7111,4026],[-30,17],[-13,-24],[-9,4],[-12,6],[-5,2],[-11,5],[-18,8],[-3,2],[-4,2]],[[7006,4048],[5,17],[6,15]],[[7112,4117],[39,-18]],[[7006,4048],[-8,4],[-31,15]],[[6967,4067],[6,16],[6,15]],[[6979,4098],[6,18]],[[9369,8355],[0,8],[-4,16],[1,11],[7,31],[4,18],[2,4],[5,11],[2,10],[4,21]],[[9390,8485],[66,-17]],[[9438,8382],[-18,4],[-1,-18],[3,-20],[-6,-3],[-3,-1],[-5,1],[-39,10]],[[9308,8311],[7,34],[5,27],[6,28],[5,24],[5,21],[6,30],[4,21]],[[9346,8496],[44,-11]],[[9369,8355],[-6,-27]],[[9363,8328],[-5,-30]],[[9358,8298],[-21,6],[-6,1],[-23,6]],[[9346,8496],[7,31],[8,39]],[[9361,8566],[19,-5],[11,-2],[8,0],[1,-11],[0,-11],[-6,-31],[18,-4],[5,24],[2,12],[0,19],[0,4],[4,1],[31,-8],[18,-5]],[[9361,8566],[7,35],[8,41],[6,25]],[[9382,8667],[27,-7],[-5,-22],[82,-22]],[[9382,8667],[6,27],[1,8],[3,9]],[[7853,5360],[11,20],[9,18]],[[7883,5417],[8,-4],[3,-2],[38,-20],[16,-8],[11,-5]],[[7959,5378],[-11,-19]],[[7948,5359],[-9,-17],[-10,-21]],[[7968,5397],[-9,-19]],[[7902,5454],[9,-4],[2,-1],[55,-28],[2,-1],[8,-5]],[[7912,5473],[9,-4],[2,-1],[25,-13],[30,-15],[2,-2],[8,-4]],[[7922,5492],[9,-5],[2,-1],[54,-28],[3,-2],[2,-1],[6,-3]],[[7932,5511],[9,-5],[2,-1],[54,-28],[2,-1],[9,-5]],[[7942,5529],[8,-4],[9,-4],[10,18],[9,18],[2,4],[42,-22],[14,-7],[2,-3]],[[7982,5606],[17,-9],[50,-25],[9,-5]],[[8001,5642],[9,-5],[1,0],[65,-34]],[[8001,5642],[11,21],[3,6],[8,14]],[[8023,5683],[11,-6],[57,-29],[8,-4]],[[8023,5683],[10,20],[10,20],[11,20],[13,26]],[[8142,5727],[-12,-23],[-10,-20]],[[8120,5684],[-11,-20],[-10,-20]],[[8120,5684],[8,-4],[1,-1],[57,-29],[9,-5]],[[8195,5645],[-11,-19],[-10,-20]],[[8142,5727],[8,-4],[66,-37]],[[8216,5686],[-11,-21],[-10,-20]],[[8166,5772],[73,-42]],[[8239,5730],[-12,-22],[-11,-22]],[[8239,5730],[28,-16],[3,-2]],[[8270,5712],[-1,-6],[-2,-10],[-1,-8],[0,-3],[-1,-9],[-1,-3],[-1,-2],[-1,-7],[-1,-4],[-1,-2],[-1,-2],[-2,-6],[-1,-2],[-1,-2],[-3,-5],[-10,-20],[-4,-8],[-7,-11],[-6,-12],[-4,-8],[-8,-14],[-4,-7]],[[8166,5772],[7,19],[8,19]],[[8181,5810],[17,-9],[18,-11]],[[8216,5790],[39,-22],[27,-15],[2,-2]],[[8216,5790],[7,19],[3,5],[7,18],[2,5],[8,18],[2,5],[2,6],[-19,10],[-2,-3],[1,-3],[-5,-12],[-19,12]],[[8181,5810],[20,54],[2,6]],[[2386,3567],[-7,-7],[-9,-11],[-10,-9],[-8,-9],[-9,-13],[-2,-7],[-4,-8],[-3,-12],[-3,-10],[0,-11],[0,-23],[-1,-13],[2,-19],[0,-9],[-1,-8],[-2,-4],[-4,-12],[-8,-11],[-36,-14],[-9,-5],[-9,-9],[-5,-6],[-2,-7],[0,-12],[0,-9],[0,-3],[2,-4],[1,-29],[2,-11],[0,-15],[2,-19],[2,-7],[4,-8],[3,-4],[10,-12],[12,-7],[3,-7],[2,-6],[1,-3],[4,-3],[1,-3],[1,-7],[0,-20],[-3,-13],[-2,-3],[-5,-16],[-2,-4],[-3,-3],[-4,-1],[-10,-6],[-3,-3],[-2,-3],[-11,-15],[-3,-10],[-1,-9],[-4,-14],[-6,-5],[-5,-3],[-1,-2],[0,-4],[0,-9],[1,-18],[1,-3],[4,-6],[6,-3],[1,-1],[0,-2],[-1,-5],[-3,-5],[-1,-5],[-2,-4],[-4,-12],[-2,-5],[-1,-1],[-5,-4],[-7,-4],[-6,-5],[-4,0],[-8,1],[-5,-3],[-6,-9],[-10,-11],[-3,-6],[-5,-3],[-2,-7],[-2,-10],[-4,-6],[-6,-3],[-2,-2],[-5,-6],[-1,-3],[-3,-5],[0,-4],[-3,-4],[-2,-1]],[[2259,3137],[3,6],[2,5],[1,3],[1,8],[2,9],[1,2],[0,5],[1,5],[0,4],[1,6],[-1,2],[0,2],[-2,6],[-1,3],[0,2],[-1,2],[-1,2],[-2,3],[-8,12],[-4,8],[-2,4],[-1,4],[0,7],[1,3],[0,3],[1,3],[2,9],[1,7],[0,2],[1,3],[-1,3],[0,5],[0,6],[-1,8],[0,5],[-1,16]],[[2164,3320],[7,6],[1,0],[13,-19],[5,6],[4,5],[4,6],[2,2],[2,3],[1,2],[6,8],[6,10]],[[7883,4323],[-8,-15]],[[7875,4308],[-3,2],[-8,6],[-1,1],[-26,20]],[[7837,4337],[-79,61],[8,14]],[[7766,4412],[71,-53],[8,-7]],[[7682,4356],[4,6],[55,78]],[[7741,4440],[1,-1],[0,-1],[2,-2],[1,-7],[21,-17]],[[7837,4337],[-5,-9],[-5,-9],[-10,-18],[-14,-26]],[[7875,4308],[-11,-18],[-10,-19],[-14,-24]],[[7869,4225],[-10,7],[-11,8],[-8,7]],[[7872,4148],[-7,6],[-31,23],[-8,6],[-7,6],[-9,6]],[[7863,4133],[-7,5],[-32,24],[-7,5],[-7,6],[-8,6]],[[7850,4108],[-47,35],[-2,-3],[-13,11],[-2,1]],[[7447,4255],[-10,7],[-44,34],[-9,6]],[[7384,4302],[9,17]],[[7393,4319],[8,14]],[[7401,4333],[63,-47]],[[7464,4286],[-9,-14],[-8,-17]],[[7447,4255],[-10,-17],[-9,7],[-44,34],[-9,7]],[[7375,4286],[9,16]],[[7305,4338],[9,17]],[[7314,4355],[10,-7],[20,-15],[31,-24],[9,-7]],[[7375,4286],[-10,7],[-51,38],[-9,7]],[[7314,4355],[9,17]],[[7323,4372],[10,-7],[6,-5],[45,-34],[9,-7]],[[7323,4372],[9,14]],[[7332,4386],[7,13]],[[7339,4399],[50,-38],[19,-15]],[[7408,4346],[-7,-13]],[[7353,4424],[69,-53]],[[7422,4371],[-7,-13],[-7,-12]],[[7339,4399],[6,11],[8,14]],[[7353,4424],[-69,52]],[[7284,4476],[7,14],[7,11]],[[7298,4501],[68,-52]],[[7366,4449],[46,-34],[6,-5],[18,-14]],[[7436,4396],[-6,-11],[-8,-14]],[[7366,4449],[7,11],[6,11]],[[7379,4471],[6,12],[7,11]],[[7392,4494],[69,-52]],[[7461,4442],[-6,-11],[-6,-12],[-7,-12],[-6,-11]],[[7298,4501],[6,11],[6,11]],[[7310,4523],[69,-52]],[[7310,4523],[-37,27],[-18,14],[-2,2],[-1,1],[-1,2]],[[7251,4569],[1,4],[2,8],[5,12]],[[7259,4593],[64,-47]],[[7323,4546],[69,-52]],[[7323,4546],[7,11],[9,18],[7,12],[7,14]],[[7353,4601],[69,-52]],[[7422,4549],[-7,-13],[-7,-12],[-9,-18],[-7,-12]],[[9197,7781],[97,-26],[62,-16],[52,-15]],[[9408,7724],[52,-14]],[[9460,7710],[61,-17]],[[9019,7016],[-207,59],[-36,11]],[[8776,7086],[18,116],[4,22],[-218,166],[-2,2],[-17,11],[-3,3]],[[8558,7406],[-3,2],[-4,2],[-28,22],[-2,1],[-351,274]],[[8170,7707],[44,47],[3,4],[3,2]],[[8220,7760],[2,3],[18,20],[11,12],[38,41],[6,7],[30,32],[43,47],[5,5],[39,43],[21,23],[8,8],[2,1]],[[8615,8154],[3,-3],[3,-1],[10,8],[37,-30],[39,-29],[129,-99],[20,-14],[5,-4],[3,-2],[4,-3],[23,-18],[46,-34],[19,-13],[91,-68],[54,-41],[62,-17],[7,-2],[24,-2],[3,-1]],[[8776,7086],[-14,-61],[-68,22],[-4,-7],[-51,20],[-33,-49]],[[8606,7011],[-22,16],[-4,3],[-9,7]],[[8571,7037],[12,22],[1,11],[1,26],[4,7],[-12,9],[-5,3],[-3,2],[-5,3],[-6,4],[-4,20],[-35,23]],[[8379,7068],[1,2],[18,33],[10,19],[16,32],[9,16],[27,50],[22,43],[9,17],[11,19],[5,11],[4,7],[4,8],[40,75],[0,1],[1,0],[0,1],[2,4]],[[8571,7037],[-17,12],[-8,-15]],[[8606,7011],[-8,-14],[-7,-14]],[[8977,6880],[-2,1],[-41,16]],[[9430,7831],[-4,-22],[-5,-21],[-5,-24],[-5,-27],[-3,-13]],[[9197,7781],[14,62],[8,43],[5,23],[2,8],[2,13],[5,22]],[[9233,7952],[31,-8],[66,-18]],[[9330,7926],[-5,-21],[-4,-22],[-5,-22],[61,-16],[53,-14]],[[9430,7831],[53,-14]],[[9483,7817],[-5,-22]],[[9478,7795],[-4,-22],[-5,-24],[-6,-26],[-3,-13]],[[9430,7831],[5,22],[1,6],[3,15],[4,22],[5,22],[53,-14]],[[9501,7904],[-5,-22],[-4,-22],[-5,-21],[-4,-22]],[[9539,7779],[-61,16]],[[9501,7904],[2,10],[8,24],[2,3]],[[9330,7926],[4,22],[8,36],[0,3]],[[9342,7987],[51,-14]],[[9393,7973],[43,-11],[44,-12],[33,-9]],[[9393,7973],[4,21],[4,20]],[[9401,8014],[4,21],[4,23],[5,21]],[[9268,8006],[4,20],[4,20],[41,-11],[43,-10],[41,-11]],[[9342,7987],[-45,12],[-20,5],[-9,2]],[[6454,4165],[-1,-3],[-4,-11],[-1,-3],[-1,-2],[0,-1],[-1,-6],[0,-6],[3,-8],[12,-29],[2,-9],[2,-8],[1,-15],[-2,-20],[-5,-19],[-3,-13],[-3,-8],[-4,-13],[-8,-16],[-9,-24],[-2,-6],[-12,-32],[2,-1],[-1,-2],[-4,-11],[-1,-3],[-8,-20],[0,-2],[-20,-46],[-4,-10],[-5,-11],[-15,7],[-36,16],[-12,5],[-33,16],[-1,-4],[-12,-34],[2,-2],[23,-11],[1,-1],[0,-1],[0,-1],[-7,-18],[-1,-1],[-2,-1],[-2,1],[-19,9],[-4,0],[-9,-26]],[[6250,3761],[-23,-65],[-24,-69]],[[6203,3627],[-26,-75]],[[6153,3913],[0,7],[0,10]],[[6087,3914],[12,30]],[[6764,4366],[-2,-12]],[[6762,4354],[-9,4],[-24,12],[-30,9],[-6,-16],[-4,-11],[-3,-9]],[[6686,4343],[-6,-18]],[[6680,4325],[-78,35],[-5,3]],[[6680,4325],[-7,-18]],[[6673,4307],[-81,36],[-1,3],[3,9]],[[6673,4307],[-7,-19]],[[6748,4315],[-7,-18]],[[6741,4297],[-8,4],[-29,13],[-24,11]],[[6686,4343],[24,-11],[28,-13],[10,-4]],[[6755,4335],[-7,-20]],[[6762,4354],[-7,-19]],[[6718,3553],[33,50],[12,34]],[[6763,3637],[21,-11],[-10,-24],[24,-11],[-13,-24],[-11,-20],[-10,-20],[10,-9],[4,-3],[6,-4]],[[9346,8496],[-3,1],[-19,5],[3,18],[0,2],[-2,2],[-9,2],[7,32],[-1,3],[-2,1],[-15,4],[-18,5],[-6,-36],[-18,5],[-18,5],[7,35],[-18,4],[3,14],[-6,2],[-4,2],[-2,3],[-1,3],[0,4]],[[9224,8612],[27,34],[20,22],[6,5],[18,18],[-14,4],[19,16],[-2,3],[4,21]],[[9224,8612],[-7,-10],[-18,-21],[-20,-14],[-10,-6],[-9,-4],[-5,-2],[-6,-3],[-6,-3],[5,20],[3,17]],[[9151,8586],[1,13],[1,26],[1,21],[-2,30],[-2,14],[-6,42],[-3,26]],[[9141,8758],[7,-4],[6,-4],[7,-4],[1,1],[2,0],[2,0],[66,-18],[5,24],[65,-18]],[[9141,8758],[1,1],[0,2],[0,2],[0,3],[0,4],[-1,14],[0,5],[-1,9],[-1,17],[0,6],[-1,15],[-4,40],[-2,13],[0,9],[-1,9],[-1,16],[0,6],[6,3],[0,6],[1,9],[0,4]],[[7575,4830],[-48,37],[-3,-6],[-14,10],[-7,5]],[[7503,4876],[9,18]],[[7512,4894],[7,-6],[12,-9],[4,10],[1,4],[4,0],[5,2],[2,5],[1,4],[3,8],[48,-36]],[[7599,4876],[-6,-12],[-6,-11],[-6,-11],[-6,-12]],[[7575,4830],[-6,-12],[-7,-12]],[[7562,4806],[-46,36],[-15,11],[-7,5]],[[7494,4858],[9,18]],[[7553,4786],[-69,53]],[[7484,4839],[5,10],[5,9]],[[7562,4806],[-4,-10],[-5,-10]],[[7521,4729],[-54,40],[-5,4],[-11,8]],[[7451,4781],[6,11],[6,9],[5,9],[5,10]],[[7473,4820],[6,9],[5,10]],[[7553,4786],[-5,-10],[-6,-10]],[[7542,4766],[-5,-9],[-5,-9],[-5,-9],[-6,-10]],[[7498,4689],[-17,13],[-8,8],[-34,25],[-10,7]],[[7429,4742],[11,19]],[[7440,4761],[6,10],[5,10]],[[7521,4729],[-7,-11],[-5,-10],[-5,-10],[-6,-9]],[[7475,4645],[-10,7],[-51,37],[-9,7]],[[7405,4696],[14,26]],[[7419,4722],[10,20]],[[7498,4689],[-5,-10],[-5,-10]],[[7488,4669],[-7,-13],[-6,-11]],[[7461,4621],[-9,7],[-51,37],[-9,7]],[[7392,4672],[13,24]],[[7475,4645],[-14,-24]],[[7461,4621],[-13,-23]],[[7448,4598],[-9,6],[-51,37],[-9,7]],[[7379,4648],[13,24]],[[7448,4598],[-6,-13],[-6,-10]],[[7436,4575],[-63,46],[-6,5]],[[7367,4626],[6,10],[6,12]],[[7353,4601],[8,13],[6,12]],[[7436,4575],[-6,-12],[-8,-14]],[[7491,4498],[-69,51]],[[7436,4575],[60,-44],[9,-7]],[[7505,4524],[-6,-12],[-8,-14]],[[7491,4498],[-7,-13],[-7,-12],[-5,-11],[-4,-7],[-2,-3],[-5,-10]],[[7518,4547],[-6,-12],[-7,-11]],[[7448,4598],[11,-8],[50,-37],[9,-6]],[[7531,4571],[-13,-24]],[[7461,4621],[11,-7],[23,-17],[14,-10],[13,-10],[9,-6]],[[7475,4645],[10,-7],[50,-37],[9,-7]],[[7544,4594],[-13,-23]],[[7488,4669],[9,-8],[50,-38],[9,-7]],[[7556,4616],[-12,-22]],[[7498,4689],[69,-53]],[[7567,4636],[34,-27],[-5,-9],[-5,-10],[-23,17],[-12,9]],[[7521,4729],[68,-54]],[[7589,4675],[-6,-10],[-5,-10]],[[7578,4655],[-6,-10],[-5,-9]],[[7542,4766],[69,-53]],[[7611,4713],[-6,-9],[-5,-9]],[[7600,4695],[-5,-9],[-6,-11]],[[7553,4786],[68,-53]],[[7621,4733],[-5,-10],[-5,-10]],[[7562,4806],[69,-52]],[[7575,4830],[68,-53]],[[7599,4876],[68,-53]],[[7599,4876],[5,11],[6,12]],[[7610,4899],[6,11],[6,12]],[[7622,4922],[34,-27],[35,-27]],[[7259,4593],[4,13],[4,14],[2,6]],[[7269,4626],[3,7],[4,8],[2,5],[4,7]],[[7282,4653],[71,-52]],[[7282,4653],[8,13],[6,12]],[[7296,4678],[71,-52]],[[7296,4678],[6,10],[6,12]],[[7308,4700],[10,-8],[51,-37],[10,-7]],[[7308,4700],[13,24]],[[7321,4724],[10,-7],[51,-38],[10,-7]],[[7321,4724],[13,24]],[[7334,4748],[10,-7],[51,-38],[10,-7]],[[7334,4748],[9,16],[6,10]],[[7349,4774],[9,-7],[52,-38],[9,-7]],[[7349,4774],[10,20]],[[7359,4794],[61,-45],[9,-7]],[[7359,4794],[6,9],[5,11]],[[7370,4814],[7,-6],[63,-47]],[[7370,4814],[5,9],[6,11]],[[7381,4834],[70,-53]],[[7381,4834],[6,10],[5,10]],[[7392,4854],[5,9],[5,10]],[[7402,4873],[71,-53]],[[7402,4873],[6,10],[6,10]],[[7414,4893],[70,-54]],[[7414,4893],[4,9],[4,9]],[[7432,4928],[7,-5],[16,-12],[18,-13],[21,-16],[9,-6]],[[7461,4983],[8,-6],[53,-39],[9,-7]],[[7531,4931],[-10,-20],[-9,-17]],[[7541,4951],[-10,-20]],[[7482,5022],[8,-6],[30,-22],[16,-7],[17,-12]],[[7553,4975],[-12,-24]],[[7565,4997],[-6,-11],[-6,-11]],[[7446,5078],[8,-6],[31,-23],[8,-6],[10,20]],[[7503,5063],[8,-6],[18,-13],[-1,-3],[-4,-7],[-2,-4],[43,-33]],[[7503,5063],[11,19],[6,11],[6,11]],[[7526,5104],[39,-29],[12,-8],[18,-13]],[[7595,5054],[-6,-11],[-6,-12],[-6,-11]],[[7577,5020],[-6,-12],[-6,-11]],[[7636,4427],[6,11],[5,8]],[[7647,4446],[13,24]],[[7660,4470],[9,18],[2,6],[2,0],[9,-7],[29,-22],[30,-25]],[[7696,4593],[11,-9],[20,-15],[3,-1],[30,-23]],[[7760,4545],[33,-25]],[[7793,4520],[4,-3]],[[7797,4517],[-2,-2],[-19,-25]],[[7776,4490],[-11,-15],[-24,-35]],[[7660,4470],[-13,9],[-45,35],[-8,6]],[[7594,4520],[13,23]],[[7607,4543],[42,65],[-34,25],[-14,5],[-23,17]],[[7589,4675],[33,-25],[4,-3],[31,-24],[39,-30]],[[7696,4593],[4,8],[4,7]],[[7704,4608],[5,11],[6,12]],[[7715,4631],[36,-28],[8,-7],[7,-3]],[[7766,4593],[1,-22],[-2,-9],[-3,-13],[-2,-4]],[[7814,4558],[-8,6],[-27,21],[-7,5],[-6,3]],[[7715,4631],[4,7],[2,4],[1,1],[4,8]],[[7726,4651],[24,-17],[8,-7],[4,-3]],[[7762,4624],[1,-4],[6,-4],[8,-6],[38,-29],[8,-7],[-9,-16]],[[7793,4520],[2,3],[10,19],[9,16]],[[7762,4624],[-3,29],[20,-16],[12,-7],[2,-2]],[[7793,4628],[27,-20],[15,-12],[20,-15]],[[7855,4581],[-3,-2],[-19,-16],[-11,-11]],[[7822,4552],[-4,-5],[-21,-30]],[[7804,4647],[-6,-9],[-5,-10]],[[1616,411],[-3,-1],[-36,-16],[-25,-12],[-8,-4],[-33,-14],[-12,-6],[-12,-4],[-28,-10],[-6,27],[-25,-7],[-27,-9]],[[848,76],[6,21]],[[908,104],[10,4],[6,2],[3,1],[8,1],[4,-1],[19,-5],[0,4],[1,11],[1,20],[1,7],[-1,7],[0,6],[1,3],[2,2],[3,8],[1,19],[9,2],[7,2],[10,3],[10,4],[49,35],[29,21],[4,2],[5,0],[8,-1],[12,0]],[[1110,261],[5,-1],[4,0],[4,0],[9,2],[43,13],[10,2],[26,5]],[[1618,401],[-3,-2],[-4,-7],[-5,-9],[-9,-13],[-11,-22],[-9,-1],[-24,-23],[-8,-4],[-6,-4],[-1,-2],[-2,-5],[-8,-4],[-9,-2],[-15,1],[-3,1],[-16,4],[-31,0],[-21,2],[-8,1],[-4,2],[-13,0],[-6,-3],[-2,0],[-18,-8],[-1,3],[-11,-8],[-17,-5],[-4,-4],[-11,-7],[-7,-6],[-3,-1],[-9,-6],[-4,2],[-23,-14],[-15,-14],[-2,-4],[-8,-4],[-10,-9],[-13,-5],[-4,0],[-3,-5],[-2,-2],[-5,-7],[-2,-6],[-5,-6],[-4,-5],[-6,-2],[-13,-8],[-7,-2],[0,-13],[-1,0],[-1,13],[-2,0],[-4,4],[-6,2],[-11,1],[-6,-1],[-12,-8],[-5,-8],[-5,-14],[-3,-7],[-6,-13],[-2,-4],[-1,-11],[1,-32],[-8,-14],[-6,-6],[-2,-2],[0,-3],[-2,-4],[-4,-7],[-5,-3],[-2,0],[-2,2],[-7,5],[-9,3],[-5,-2],[-3,-3],[-1,-21],[-1,-3],[-2,-1],[-3,2],[-1,4],[5,0],[0,31],[-12,2],[-3,-31],[5,-1],[0,-4],[-10,1],[-1,1],[-1,2],[0,7],[-1,0],[-4,6],[-12,0],[-7,-1],[-3,6],[-2,3],[-3,0],[-5,-1],[-15,-5],[-4,-3],[-5,-10],[-2,-2],[-5,-2],[-11,0],[-1,2],[-1,13],[-3,2],[-3,-6],[-3,-2],[-6,0],[-13,1],[-9,3],[-4,3],[-4,4],[-3,5],[-9,6],[-4,13],[-1,4],[-3,3],[-8,0],[-3,-1],[-23,-1],[-10,-1],[-7,-2],[-3,-2],[-1,-1]],[[6421,5195],[-62,30]],[[6359,5225],[4,11],[4,11]],[[6367,5247],[4,11],[4,13],[9,24]],[[6397,5128],[-61,30]],[[6336,5158],[4,11],[3,11]],[[6343,5180],[5,12],[4,11],[3,11],[4,11]],[[6413,5173],[-4,-11],[-4,-11],[-4,-12],[-4,-11]],[[6319,5112],[4,12],[5,11],[4,12],[4,11]],[[6397,5128],[-4,-11],[-4,-11],[-4,-12],[-5,-13]],[[6258,5141],[4,13],[4,11],[4,11],[4,12]],[[6274,5188],[4,11],[4,11]],[[6282,5210],[61,-30]],[[6474,5143],[-4,-11],[-4,-11],[-4,-11],[-4,-12],[-4,-11],[-4,-11],[-4,-12],[-4,-12]],[[7053,6499],[15,13],[14,12],[14,13],[13,19],[-19,29],[14,13],[9,7],[14,13],[-13,22]],[[7180,6696],[19,-30]],[[7199,6666],[30,-46],[2,-3]],[[7511,6675],[-2,-1],[-21,-19],[-2,-2],[-14,-13],[65,-49]],[[7231,6617],[33,65],[3,6],[60,120],[13,26],[23,35],[25,33],[16,20],[28,-36],[14,13],[-5,21],[13,15]],[[6770,5704],[-4,3],[-33,22],[-8,6]],[[6725,5735],[10,21]],[[6797,5762],[-1,-2],[-8,-18],[-8,-17],[-10,-21]],[[6851,5547],[-58,43]],[[6820,5639],[6,11],[6,11],[6,11],[5,9],[5,9],[4,8],[3,7],[9,-6],[1,3]],[[6714,5593],[-5,3]],[[6709,5596],[11,21],[11,21],[-32,23],[-9,6]],[[6690,5667],[11,22],[12,24],[12,22]],[[6709,5596],[-32,23],[-9,6],[-8,6],[-42,28],[-8,6]],[[6610,5665],[10,20]],[[6620,5685],[9,-6],[41,-28],[8,-6],[12,22]],[[6620,5685],[11,23],[-50,34],[-8,6]],[[6573,5748],[11,22]],[[6584,5770],[12,23]],[[6610,5665],[-9,6],[-41,29],[-9,6]],[[6551,5706],[11,20],[11,22]],[[6590,5626],[-59,41]],[[6531,5667],[10,19],[10,20]],[[6610,5665],[-10,-20],[-10,-19]],[[6662,5490],[-4,4],[-42,28]],[[6616,5522],[9,18],[13,25],[1,3],[9,18],[-58,40]],[[7178,4851],[-30,22]],[[7148,4873],[-57,42]],[[7148,4873],[-9,-17],[-12,-22],[30,-23]],[[4805,3933],[-5,6],[-47,49]],[[4753,3988],[7,8],[-13,14],[-11,11],[-1,1],[0,1],[-1,1],[1,1],[5,7],[-13,14],[28,37],[6,-6],[7,-8],[4,-3]],[[4772,4066],[9,-11],[16,-16],[4,-2],[14,-15],[15,-15],[15,-15],[6,-7]],[[4851,3985],[-2,-3],[-44,-49]],[[4546,3539],[-4,6],[20,11],[11,8],[8,6],[3,6],[-2,-1],[-1,0],[-1,0],[-3,3],[-43,47],[17,19],[16,-18],[16,-16],[26,15],[1,1],[-1,2],[-39,41],[4,5],[0,2],[-1,2],[-13,13]],[[4560,3691],[13,20],[16,24],[9,15],[2,4],[7,14],[6,13],[3,8],[10,23],[7,15],[13,18],[12,17],[13,18],[14,18],[14,18],[8,10],[10,13],[11,11],[7,9],[18,29]],[[4805,3933],[133,-148],[2,-3],[4,-4],[2,-1]],[[4946,3777],[-89,-54],[-10,-5]],[[6846,4116],[-16,-46],[1,0],[12,-1],[11,-2],[10,-3],[3,-2],[8,-5],[7,-6],[4,-4],[3,-2],[6,-3],[-25,-68],[0,-3],[-6,-5],[-3,-4],[-3,-5],[-4,-9],[-1,-8],[0,-7],[-1,-8],[-2,-9],[-3,-8]],[[6847,3908],[-20,10],[-24,11]],[[6803,3929],[-20,9],[-20,10],[-19,10]],[[6891,4103],[76,-36]],[[6967,4067],[-1,-4],[-18,8],[-1,-4],[-18,-49],[-21,-62]],[[6908,3956],[-1,-3],[-13,-35],[0,-3],[0,-3],[1,-3],[2,-8],[-26,-12]],[[6871,3889],[-4,10],[-3,2],[-17,7]],[[6878,3872],[-5,12],[-2,5]],[[6908,3956],[18,-9],[18,-9],[14,-6],[4,-2],[2,-1]],[[6964,3929],[-1,-3],[0,-2],[-4,-10],[-3,-5],[-23,-64],[-19,9],[-18,9],[-18,9]],[[6903,3730],[-7,4],[-3,1],[-18,8],[-19,9],[-19,8]],[[6837,3760],[15,39],[26,73]],[[6964,3929],[33,-17],[36,-17],[1,0]],[[6837,3760],[-9,4],[-11,-27],[-3,-4]],[[6814,3733],[-6,3],[-20,10],[-2,2],[19,54],[-5,2],[-7,12],[-9,25],[-1,4]],[[6783,3845],[-5,13],[25,71]],[[6699,3803],[-6,13],[25,71],[26,71]],[[6783,3845],[-28,-14],[-28,-14],[-28,-14]],[[6814,3733],[-4,-13],[-16,7]],[[6794,3727],[-39,19],[-80,38]],[[6675,3784],[2,6],[1,4],[2,0],[1,0],[2,1],[16,8]],[[6675,3784],[-13,6]],[[6662,3790],[2,7],[1,3],[-5,3],[-6,3],[-1,0],[-2,0],[-8,22],[11,7],[3,2],[1,4],[22,64],[-20,10]],[[6660,3915],[24,70]],[[6662,3790],[-12,6]],[[6650,3796],[-65,31]],[[6585,3827],[1,5],[-20,9],[-19,9],[29,81]],[[6576,3931],[18,-9],[11,6],[3,1],[11,5],[20,-9],[21,-10]],[[6577,3711],[-4,9],[0,2],[0,3],[0,3],[9,27]],[[6582,3755],[19,55],[-19,9]],[[6582,3819],[3,8]],[[6650,3796],[1,-4],[-4,-14],[-3,-1],[-4,-2],[-2,-3],[-1,-2],[-9,-22],[-1,-3],[-4,-4],[-5,-4],[-9,-6],[-25,-15],[-4,-3],[-3,-2]],[[6630,3633],[-20,11],[-20,8],[-18,9]],[[6572,3661],[13,34],[-6,14],[-2,2]],[[6675,3784],[-3,-11],[-4,-18],[-7,-21],[-2,-9],[1,-27],[2,-19],[-4,0],[-14,-2],[0,-4],[-14,-40]],[[6650,3615],[-2,7],[-2,3],[-2,2],[-14,6]],[[6794,3727],[-3,-8],[-4,-14],[-24,-68]],[[6551,3599],[21,62]],[[8469,5496],[75,-40],[14,4],[4,0],[9,-4],[7,-4],[16,-8],[9,-6],[17,-11],[82,-46],[2,-1]],[[8704,5380],[-7,-23],[-4,-15],[-2,-4],[-2,-8],[-8,-24],[-7,-24]],[[8674,5282],[-3,2],[-14,8],[-6,3],[-14,8],[-32,17],[-3,-3],[-1,-8],[-14,-36]],[[8587,5273],[-9,-24],[-9,-24]],[[8569,5225],[-10,-26],[-10,-23]],[[8549,5176],[-31,-80]],[[8518,5096],[-10,-23],[-9,-23]],[[8499,5050],[-8,-21],[-3,-4]],[[8488,5025],[-6,4],[-50,27]],[[8435,5412],[6,14],[6,15],[2,5],[6,16],[14,34]],[[8334,5073],[-67,36],[-9,5]],[[8258,5114],[8,19],[1,6],[1,3]],[[8344,5102],[-1,-4],[-9,-25]],[[8313,5019],[-76,40]],[[8237,5059],[4,10],[4,10],[7,19]],[[8252,5098],[6,16]],[[8334,5073],[-6,-15]],[[8328,5058],[-8,-19],[-3,-10],[-4,-10]],[[8313,5019],[-4,-10],[-5,-13]],[[8304,4996],[-9,7],[-3,2],[-8,4],[-5,3],[-41,21],[-9,5]],[[8229,5038],[4,11],[4,10]],[[1110,261],[2,35],[2,34],[-43,5],[-32,3],[4,34],[-13,29]],[[848,76],[-2,-3],[-5,-3],[-5,-1],[-6,1],[-8,5],[-14,0],[-7,-2],[-19,-9],[-5,-5],[-5,-4],[-11,-4],[-6,-11],[-7,-7],[-4,-3],[-12,-3],[-11,-1],[-6,-2],[-26,-5],[-22,-7],[-5,-3]],[[662,9],[-5,19]],[[657,28],[-10,68],[-1,8],[-1,3],[4,-1],[-3,14],[-2,1],[-3,16],[-10,73]],[[631,210],[0,3],[-3,2],[-2,1],[-5,2],[-7,4],[-8,4]],[[606,226],[-2,2],[-13,118],[-23,37],[-36,103]],[[1019,1295],[22,13],[-2,11],[37,25],[-4,14],[132,53],[6,8],[195,119],[30,-60]],[[606,226],[-36,-15],[-36,-15],[-32,-16]],[[570,85],[-2,-2],[-15,-2],[-23,-4],[-1,21],[-13,-2],[-7,50],[0,3],[-1,8],[-1,3],[-1,4]],[[631,210],[-4,-1],[-4,-2],[-2,0],[-2,-1],[-2,-1],[-1,-1],[-31,-14],[4,-36],[1,-5],[2,-20],[2,-20],[2,-20],[-26,-4]],[[657,28],[-5,-3],[-15,-6],[-3,0],[-10,-1],[-5,0],[-8,1],[-15,1],[-17,-1],[-3,0],[-6,66]],[[662,9],[-4,-2],[-5,-1],[-4,-2],[-33,1],[-17,-1],[-1,6],[-1,0],[-1,-1],[-1,-5],[-14,-2],[-2,0],[0,2],[-1,2],[-1,-3],[-3,-3],[-4,1],[-2,0],[0,4],[-2,2],[-37,10],[-11,7],[-13,1],[-71,41],[-3,-7],[62,-37],[0,-3],[0,-2],[-7,4],[-45,26],[0,1],[-12,7],[-3,1],[-3,2]],[[1560,1505],[-9,19],[-9,44],[124,49],[25,17],[11,7],[10,4],[6,1]],[[3029,1685],[-25,40],[-28,46],[-17,-14],[-17,-14],[-15,-12],[-1,-2],[0,-2],[27,-44],[-9,-7],[-3,-2],[-2,-1],[-4,0],[-4,2]],[[2845,1617],[-8,-6]],[[2837,1611],[-43,71],[-33,59],[-15,25],[-26,42],[-2,3]],[[3084,1896],[5,-22],[10,-40]],[[3099,1834],[19,-75]],[[3118,1759],[-1,-1],[-2,-1],[-3,-3],[-53,-43],[-16,-14]],[[3127,1864],[-4,-4],[-1,-1],[-2,-3],[-2,-6],[-2,-3],[-2,-2],[-15,-11]],[[3249,2028],[10,-19],[1,-7],[-1,-39],[1,-4],[11,-20],[-20,-18]],[[3251,1921],[-39,-31],[-33,-28],[-12,19],[-7,11],[-17,-15],[-11,-9],[-5,-4]],[[7402,4873],[-69,50]],[[7392,4854],[-70,51]],[[7381,4834],[-69,51]],[[7370,4814],[-69,50]],[[8304,4996],[-13,-20]],[[8291,4976],[-10,8],[-7,6],[-5,2],[-4,2],[-35,19],[-9,4]],[[8221,5017],[8,21]],[[8233,4878],[-44,22],[-1,0],[-2,-1],[0,-1],[-1,-1],[-7,-18],[-1,-3]],[[8177,4876],[-15,6],[-4,3]],[[8158,4885],[8,20],[6,18],[4,11],[4,7],[5,11],[6,9],[11,17],[4,7],[5,11]],[[8211,4996],[5,10],[5,11]],[[8291,4976],[-12,-20]],[[8279,4956],[-13,-21]],[[8266,4935],[-12,-20],[-13,-20]],[[8241,4895],[-4,-7],[-4,-10]],[[8211,4996],[-2,1],[-10,6],[-48,24],[-9,5]],[[8142,5032],[8,22]],[[8150,5054],[8,22]],[[8158,5076],[9,-5],[52,-28],[8,-3],[2,-2]],[[8158,5076],[6,11],[5,8]],[[8169,5095],[66,-35],[2,-1]],[[8169,5095],[5,10],[5,9],[5,8],[6,9]],[[8190,5131],[60,-31],[2,-2]],[[8190,5131],[5,9],[3,6],[3,5],[3,6],[1,2],[4,10],[1,4]],[[8058,5280],[-2,1],[-7,4],[-25,13],[-10,5],[10,18]],[[8024,5321],[10,18],[9,19]],[[7948,5359],[8,-4],[3,-1],[54,-28],[3,-1],[8,-4]],[[8174,4331],[12,20],[14,24]],[[8200,4375],[9,-6],[30,-24],[9,-6]],[[8200,4375],[9,17]],[[8209,4392],[67,-52]],[[8209,4392],[10,17]],[[8219,4409],[60,-49]],[[8219,4409],[10,18],[12,19],[11,20]],[[8252,4466],[8,-6],[22,-15],[2,-2],[11,-8]],[[8219,4409],[-8,6],[-9,8],[-30,23],[-9,7]],[[8163,4453],[21,35],[-8,7],[-19,13],[-10,8],[-9,7]],[[8138,4523],[9,16]],[[8147,4539],[38,-27],[9,-6],[8,-6],[20,-14],[20,-14],[10,-6]],[[8209,4392],[-7,6],[-20,15],[-20,16],[-9,6]],[[8153,4435],[10,18]],[[8200,4375],[-16,12],[-8,-14],[-31,25],[-9,7]],[[8136,4405],[8,14]],[[8144,4419],[9,16]],[[8174,4331],[-56,44]],[[8118,4375],[6,10],[6,10],[6,10]],[[8062,4390],[11,20]],[[8073,4410],[9,-7],[36,-28]],[[8073,4410],[11,20]],[[8084,4430],[6,10]],[[8090,4440],[8,-7],[1,0],[28,-21],[8,14],[1,-2],[8,-5]],[[8090,4440],[5,9]],[[8095,4449],[3,5],[8,14]],[[8106,4468],[2,3]],[[8108,4471],[8,-6],[30,-24],[7,-6]],[[8108,4471],[10,17],[10,18],[10,17]],[[8106,4468],[-9,7],[-51,40],[-9,6]],[[8037,4521],[-18,15],[-9,7]],[[8010,4543],[11,19],[28,46]],[[8049,4608],[71,-50],[27,-19]],[[8095,4449],[-69,53]],[[8026,4502],[6,10],[5,9]],[[8084,4430],[-8,7],[-23,17],[-10,8],[-19,15],[-8,6]],[[8016,4483],[4,9],[1,1],[5,9]],[[8073,4410],[-69,54]],[[8004,4464],[6,10],[6,9]],[[8062,4390],[-9,7],[-40,31],[-20,16],[-9,-16]],[[7984,4428],[-9,6],[-12,9],[-8,7]],[[7955,4450],[9,16],[11,20]],[[7975,4486],[29,-22]],[[8052,4374],[-8,6],[-53,42],[-7,6]],[[8030,4336],[-7,6],[-2,1],[-51,39],[-9,7]],[[7961,4389],[9,15],[5,8],[9,16]],[[7919,4386],[13,25]],[[7932,4411],[9,-7],[11,-8],[9,-7]],[[7932,4411],[14,23],[9,16]],[[7932,4411],[-2,2],[-7,5],[-13,10]],[[7910,4428],[6,11],[2,2],[5,10],[-7,5],[-1,1],[-50,39],[-8,6],[9,16]],[[7866,4518],[8,-6],[26,-20],[24,-19],[8,-6]],[[7932,4467],[8,-6],[5,-4],[7,-6],[3,-1]],[[7869,4393],[-8,10],[11,19]],[[7872,4422],[14,24]],[[7886,4446],[9,-7],[9,-7],[6,-4]],[[7886,4446],[-42,33],[-17,12],[-11,10],[-7,5],[-4,5],[-8,6]],[[7822,4552],[3,-3],[32,-25],[9,-6]],[[6501,3793],[-7,-19],[-17,-41]],[[6477,3733],[-5,-9],[-3,-6],[-4,-5],[-6,-9],[-5,-6],[-7,-7]],[[6379,3781],[20,-10],[20,-10],[13,28],[14,17]],[[6446,3806],[2,-2],[3,-1],[4,0],[4,2],[2,3],[2,2],[19,-9],[10,-5],[9,-3]],[[6403,3841],[21,-11],[19,-10],[0,-4],[0,-2],[0,-3],[1,-2],[2,-3]],[[6582,3819],[-21,11],[-19,8],[-19,9],[-9,-22],[-13,-32]],[[6426,3903],[3,-1],[20,-10],[19,-9],[4,-2],[8,-4],[10,-5],[36,-17],[39,-18],[20,-10]],[[6523,3965],[1,-2],[2,-3],[1,-2],[0,-4],[12,-6],[18,-8],[19,-9]],[[6527,4004],[4,12],[4,9],[18,-9],[2,-1],[8,8],[7,5],[4,2],[4,1],[4,1],[7,0],[6,-2],[14,-6],[16,-8],[1,-2]],[[7359,4794],[-69,50]],[[7334,4748],[-36,26],[-4,-8],[-33,24]],[[7296,4678],[-35,26]],[[7269,4626],[-69,52]],[[7259,4593],[-40,31]],[[7219,4624],[-34,26],[-23,17]],[[7190,4582],[-8,4],[-15,8]],[[7167,4594],[2,8],[4,9],[7,13],[-29,22]],[[7219,4624],[-5,-10],[-6,-10],[-7,-13],[-11,-9]],[[7247,4555],[-6,3],[-44,21],[-7,3]],[[7251,4569],[-2,-6],[-2,-8]],[[7241,4535],[-7,4],[-7,3],[-5,2],[-39,19],[-23,11],[-35,17]],[[7133,4610],[34,-16]],[[7247,4555],[-3,-14],[-3,-6]],[[7234,4514],[-10,6],[-48,22]],[[7176,4542],[-58,29]],[[7241,4535],[-2,-6],[-3,-9],[-2,-6]],[[7162,4500],[-38,18],[-21,10]],[[7176,4542],[-4,-12],[-4,-11],[-3,-10],[-3,-9]],[[7162,4500],[-4,-10],[-4,-10],[-4,-11],[0,-2],[-4,-9]],[[7162,4500],[40,-20],[3,-1],[7,-4]],[[7212,4475],[-11,-19],[-16,-28]],[[7185,4428],[-7,-14],[-2,-1],[-1,-2]],[[7234,4514],[-12,-19],[0,-2],[-3,-4],[-7,-14]],[[7284,4476],[-50,38]],[[7332,4386],[-39,29]],[[7293,4415],[-9,7],[-9,6],[7,13],[-6,5],[-10,7]],[[7266,4453],[10,9],[8,14]],[[7305,4338],[-9,7],[-21,16],[-9,7],[-8,6],[-10,7]],[[7248,4381],[10,17]],[[7258,4398],[9,-7],[8,-6],[9,16],[9,14]],[[7283,4299],[-6,4]],[[7277,4303],[-3,3],[-21,15],[-9,7],[-8,6],[-10,8]],[[7226,4342],[6,11],[6,10],[7,11],[3,7]],[[7305,4338],[-10,-18],[-12,-21]],[[7215,4350],[11,-8]],[[7277,4303],[-6,-10],[-5,-9],[-5,-9],[-1,-2],[-5,-9],[-12,9]],[[7185,4428],[9,-6],[13,-10],[13,-10],[10,-7],[10,17],[9,-7],[9,-7]],[[7962,5097],[10,-5],[51,-26],[9,-4]],[[8032,5062],[-8,-20],[-7,-19]],[[7984,5141],[9,-5],[1,-1],[46,-24],[9,-5]],[[8049,5106],[-8,-22],[-9,-22]],[[8058,5129],[-9,-23]],[[8006,5182],[9,-4],[43,-23],[8,-5]],[[8066,5150],[-2,-4],[-6,-17]],[[8074,5170],[-8,-20]],[[8026,5219],[1,-1],[7,-3],[39,-21],[8,-5]],[[8081,5189],[-7,-19]],[[8089,5209],[-8,-20]],[[8099,5232],[-2,-3],[-8,-20]],[[8136,5160],[-8,-19]],[[8128,5141],[-9,4],[-37,20],[-8,5]],[[8089,5209],[9,-5],[8,-4],[21,-11],[8,-4],[9,-5]],[[8144,5180],[-8,-20]],[[8153,5203],[-1,-3],[-8,-20]],[[8190,5131],[-46,24],[-8,5]],[[8169,5095],[-40,22],[-8,4]],[[8121,5121],[7,20]],[[8150,5054],[-10,5],[-25,14],[-9,4]],[[8106,5077],[7,23]],[[8113,5100],[8,21]],[[7112,4117],[9,17]],[[7121,4134],[10,18]],[[7131,4152],[10,18],[-8,5],[-11,5],[-51,25],[-9,4]],[[7134,4264],[11,-4],[11,-7],[10,-10],[8,-11],[3,-7],[4,-10],[2,-15],[0,-4],[1,-17],[-2,-17]],[[6891,4103],[6,17]],[[6897,4120],[6,15]],[[6903,4135],[8,-5],[58,-27],[10,-5]],[[6903,4135],[6,17]],[[6909,4152],[9,-4],[57,-28],[10,-4]],[[6909,4152],[6,19]],[[6915,4171],[9,-5],[58,-28],[10,-4]],[[6915,4171],[7,18]],[[6922,4189],[66,-33],[10,-4]],[[6922,4189],[6,17]],[[6928,4206],[76,-36]],[[6928,4206],[7,18]],[[6935,4224],[9,-4],[57,-28],[9,-4]],[[6935,4224],[3,10],[4,10]],[[6942,4244],[75,-37]],[[6942,4244],[6,20]],[[6942,4244],[-63,31]],[[6935,4224],[-10,5],[-44,22],[-9,4]],[[6872,4255],[3,9],[4,11]],[[6928,4206],[-9,5],[-44,21],[-9,5]],[[6866,4237],[6,18]],[[6922,4189],[-9,4],[-18,9],[-27,12],[-9,4]],[[6859,4218],[7,19]],[[6909,4152],[-9,4],[-8,4],[-37,18],[-9,4]],[[6846,4182],[7,19],[6,17]],[[6897,4120],[-62,30]],[[6835,4150],[5,15]],[[6840,4165],[6,17]],[[6829,4133],[6,17]],[[6777,4195],[10,-5],[44,-21],[9,-4]],[[6790,4231],[7,18]],[[6797,4249],[9,-5],[44,-21],[9,-5]],[[6797,4249],[6,18]],[[6803,4267],[10,-5],[53,-25]],[[6803,4267],[2,7],[5,11],[6,20]],[[6816,4305],[-5,2],[-56,28]],[[6803,4267],[-8,4],[-45,22],[-9,4]],[[7965,4523],[-12,-19]],[[7953,4504],[-8,6],[-50,38],[-8,6]],[[7887,4554],[4,5],[3,4],[3,3],[5,6],[5,-3],[49,-39],[9,-7]],[[7866,4518],[9,17],[12,19]],[[7953,4504],[-11,-21],[-10,-16]],[[7959,4671],[3,-2],[7,-5],[4,-2],[27,-19],[26,-19],[2,-3],[6,-4]],[[8034,4617],[-32,6],[-33,1],[-21,-2],[-19,-5],[-5,-1],[-28,-10],[-17,-9],[-24,-16]],[[8225,4853],[-38,19],[-10,4]],[[8233,4878],[-7,-21],[-1,-4]],[[8284,4828],[-1,-4]],[[8283,4824],[-58,29]],[[8241,4895],[14,-12],[39,-32]],[[8294,4851],[-6,-11],[-4,-12]],[[8266,4935],[53,-44]],[[8319,4891],[-13,-20],[-12,-20]],[[8329,4803],[-4,5],[-41,20]],[[8319,4891],[15,-13],[4,-3],[14,-8]],[[8352,4867],[-7,-20],[-8,-23]],[[8362,4893],[-10,-26]],[[8279,4956],[18,-16],[35,-29]],[[8332,4911],[4,-4],[7,-4],[19,-10]],[[8304,4996],[18,-15],[17,-15],[-10,-17],[-1,-2],[1,-3],[15,-12],[-12,-21]],[[8313,5019],[79,-42]],[[8392,4977],[-3,-10],[-9,-25],[-18,-49]],[[8425,4960],[-11,5],[-6,4],[-16,8]],[[8328,5058],[9,-5],[69,-36],[8,-5],[1,0],[12,-7]],[[8427,5005],[-1,-22],[-1,-23]],[[8432,5056],[0,-5],[-2,-29]],[[8430,5022],[-1,-10],[-2,-7]],[[8479,4997],[-10,5],[-23,12],[-16,8]],[[8488,5025],[-1,-3],[-3,-11],[-5,-14]],[[7872,4422],[-15,12],[-55,42],[-2,-5]],[[7800,4471],[-16,12],[-8,7]],[[7869,4393],[-10,7],[-69,54],[6,11],[4,6]],[[7856,4371],[-9,7],[-70,54],[-5,-10],[-6,-10]],[[3424,1948],[-33,54],[-3,5]],[[3388,2007],[-3,4]],[[3385,2011],[17,14],[-10,16],[15,14],[1,1],[0,2],[-31,49],[17,14],[18,14],[13,12],[4,-1],[28,-46],[3,0],[16,13]],[[3385,2011],[-9,15],[-8,13],[-30,19],[-6,10],[-12,19]],[[3275,1912],[-24,9]],[[3388,2007],[-56,-48],[-57,-47]],[[3311,1854],[-24,38]],[[3287,1892],[-12,20]],[[3254,1652],[-17,29],[-5,8],[-12,21],[-4,5],[-13,19]],[[3203,1734],[4,4],[48,40],[-35,58],[17,14],[17,14],[17,14],[16,14]],[[8049,3664],[-24,19],[-6,4],[-11,8],[-9,7]],[[7999,3702],[4,9],[4,7],[5,10],[4,8],[4,7]],[[7999,3702],[-18,14],[4,8],[4,8],[-4,2],[-20,15],[4,8]],[[7969,3757],[4,9],[5,8]],[[7978,3774],[26,-18],[14,-11],[2,-2]],[[7999,3702],[-10,-18],[-7,-13]],[[7982,3671],[-11,-19],[-11,-20]],[[7874,3698],[28,51],[10,18]],[[7912,3767],[21,-15],[6,11],[6,11],[24,-17]],[[8032,3633],[-36,27],[-2,2],[-12,9]],[[7912,3767],[7,12],[5,10],[5,9],[5,9]],[[7934,3807],[20,-15],[8,-6],[16,-12]],[[7934,3807],[9,16],[8,15]],[[7951,3838],[28,-22],[8,15]],[[7987,3831],[39,-29],[0,-3],[-3,-6],[-3,-7],[16,-12]],[[7951,3838],[8,14]],[[7959,3852],[10,15],[3,7],[4,8]],[[7976,3882],[28,-21]],[[8004,3861],[-5,-8],[-3,-7],[-4,-6],[-5,-9]],[[8004,3861],[39,-29]],[[8043,3832],[7,-6],[9,-6]],[[7976,3882],[5,9],[4,7],[5,8],[4,8]],[[7994,3914],[66,-50],[-4,-8],[-5,-7],[-4,-8],[-4,-9]],[[7994,3914],[4,7],[6,11]],[[8004,3932],[-46,36]],[[7976,3882],[-46,35]],[[7930,3917],[5,9],[4,7],[8,15]],[[7947,3948],[5,8],[6,12]],[[7959,3852],[-13,10],[-33,25]],[[7913,3887],[9,15],[4,7],[4,8]],[[7913,3887],[-10,7],[8,15],[-37,29]],[[7874,3938],[4,7],[4,8],[5,9],[4,7]],[[7891,3969],[5,8],[4,7],[28,-21],[19,-15]],[[7888,3842],[-10,7],[-28,21],[-9,6]],[[7841,3876],[9,17],[4,8],[4,7],[3,6],[5,9]],[[7866,3923],[8,15]],[[7913,3887],[-8,-15],[-8,-14],[-9,-16]],[[7934,3807],[-46,35]],[[7912,3767],[-10,8],[-36,27]],[[7866,3802],[12,22]],[[7878,3824],[10,18]],[[7866,3802],[-11,-18],[-46,35],[10,18]],[[7819,3837],[6,11],[6,11],[47,-35]],[[7773,3871],[14,-10],[32,-24]],[[7794,3911],[47,-35]],[[7820,3958],[46,-35]],[[6582,3755],[-20,8],[-22,-59],[-21,9],[-21,10],[-21,10]],[[6203,3627],[19,-9],[50,-23],[7,23],[8,23],[8,23],[8,22],[7,21],[8,21],[-49,24],[-19,9]],[[7688,4681],[-5,-10],[-6,-11],[-48,37],[-9,10],[-9,6]],[[7704,4608],[-39,30],[-46,35],[-3,6],[-4,6],[-12,10]],[[7607,4543],[-11,9],[-9,8],[-32,26],[-11,8]],[[7594,4520],[-12,9],[-41,33],[-10,9]],[[8624,5710],[-47,26],[-9,5]],[[8568,5741],[13,31],[8,20],[8,20]],[[8653,5781],[-8,-20],[-8,-20],[-8,-20],[-5,-11]],[[8568,5741],[-2,2],[-9,4],[-53,29]],[[8480,5717],[8,19],[8,20]],[[8568,5741],[-8,-20],[-8,-20],[-7,-17],[-1,-3]],[[7853,5360],[-77,40]],[[7839,5334],[-9,5],[-2,1],[-65,33]],[[7827,5311],[-76,40]],[[7839,5334],[-12,-23]],[[7567,3823],[-35,26]],[[7557,3778],[-8,9],[-8,6],[-28,21]],[[8110,6557],[-3,2],[-3,2]],[[8057,6707],[10,19],[19,35],[2,3],[7,15],[6,11],[3,5],[1,2],[2,-2],[7,-7],[7,-8],[3,-4],[2,-2],[2,-2],[1,-2],[2,-2],[1,-1],[1,-2],[1,-2],[2,-2],[1,-2],[1,-1],[1,-2],[2,-3],[1,-2],[2,-2],[2,-4],[3,-3],[7,-12],[1,-2],[5,-6],[3,-4],[2,-2],[2,-3],[2,-2],[3,-3],[6,-6],[5,-3],[1,-1],[4,-3],[3,-2],[3,-1]],[[7054,6892],[-24,37]],[[7030,6929],[-12,20]],[[7018,6949],[44,38]],[[7062,6987],[13,-22],[11,-17]],[[7062,6987],[14,12]],[[7076,6999],[14,12]],[[7199,6666],[3,2],[2,0],[1,0],[15,-25],[3,-2],[2,2],[8,15],[-35,54],[-18,-16]],[[7176,6808],[23,13],[22,12],[48,27],[-2,3],[-15,23]],[[7367,6912],[5,3],[9,4],[9,6],[7,5],[6,5],[5,6],[7,7],[9,8],[6,6],[5,5],[6,4],[3,1],[6,3],[8,4],[13,5]],[[7049,4170],[8,-4],[55,-28],[2,-1],[7,-3]],[[7055,4189],[76,-37]],[[7225,4241],[86,-23],[13,-4],[1,0],[4,-3],[6,-3],[23,-15],[9,-4],[10,-1],[5,0],[28,0],[13,-2],[8,-2]],[[7283,4299],[17,-13],[34,-27],[9,-6],[9,-7]],[[7352,4246],[34,-25],[22,-17],[7,-4],[20,-15]],[[7375,4286],[-5,-9],[-5,-9],[-6,-10],[-7,-12]],[[7464,4286],[6,13],[7,12],[8,13]],[[7485,4324],[58,-44],[9,-7]],[[7485,4324],[7,14],[6,12]],[[7498,4350],[6,11],[7,11]],[[7643,5148],[-1,-3],[-12,-24],[-10,-18],[-9,-18],[-16,-31]],[[7698,5065],[-9,-19],[-24,12],[-13,-33]],[[7652,5025],[-17,9],[-2,1],[-15,7],[-10,5],[-13,7]],[[7643,5148],[10,-6],[6,-4],[51,-25],[10,-6]],[[7720,5107],[-12,-24],[-10,-18]],[[7646,4967],[-69,53]],[[7652,5025],[20,-10]],[[7672,5015],[-8,-15],[-6,-11]],[[7658,4989],[-6,-11],[-6,-11]],[[7622,4922],[-69,53]],[[7646,4967],[-6,-12],[-6,-11],[-6,-11],[-6,-11]],[[7610,4899],[-59,45],[-10,7]],[[7910,2498],[10,17],[11,17]],[[7931,2532],[10,18],[38,-31]],[[7866,2535],[14,13],[14,13]],[[7894,2561],[37,-29]],[[7821,2526],[8,19],[9,19],[8,19],[8,20],[9,19]],[[7863,2622],[13,-11],[9,-7],[15,-12],[33,30]],[[7933,2622],[12,-16],[-13,-11],[-17,-15],[-5,-6],[-16,-13]],[[7863,2622],[10,18],[11,18],[10,13],[14,14]],[[7908,2685],[15,15],[7,7],[2,2]],[[7956,2645],[-2,-3],[-21,-20]],[[7863,2622],[-43,34]],[[7856,2706],[4,4],[14,16]],[[7874,2726],[7,-8],[6,-7],[13,-16],[8,-10]],[[7874,2726],[14,16],[5,6],[15,17],[1,2],[1,1]],[[7765,2786],[20,35],[5,8]],[[7790,2829],[34,50],[3,4]],[[7911,2957],[-1,-3],[-8,-10],[-6,-8]],[[7790,2829],[-5,4],[-24,16]],[[7761,2849],[3,4],[31,47]],[[7761,2849],[-17,-18],[-13,-21],[-16,-23]],[[7646,4967],[69,-53]],[[7658,4989],[60,-46],[8,-7]],[[7672,5015],[21,-12],[55,-26]],[[7698,5065],[66,-33],[10,-5]],[[7720,5107],[12,24]],[[7732,5131],[10,-5],[2,-1],[53,-26],[3,-2],[8,-4]],[[7732,5131],[11,21]],[[7743,5152],[10,-5],[55,-28],[3,-1],[9,-5]],[[7743,5152],[13,22],[12,23]],[[7768,5197],[11,23]],[[7779,5220],[9,-5],[55,-28],[12,-6]],[[7743,5152],[-11,5],[-19,10],[-16,8],[-19,9],[-3,2],[-9,4]],[[7690,5236],[3,-1],[4,-3],[1,0],[17,-9],[3,-1],[13,-7],[27,-14],[10,-4]],[[7827,5311],[-12,-24],[-12,-23],[-24,-44]],[[7827,5311],[9,-5],[2,-1],[55,-27],[10,-6]],[[7434,2220],[-9,7],[-5,4],[-36,27],[-2,2],[-10,6],[-14,10],[-6,5]],[[7352,2281],[2,1],[21,18],[3,2],[2,2]],[[7380,2304],[1,1],[3,2],[0,1],[2,1],[15,14],[3,3],[3,2],[9,9],[2,1],[1,1]],[[7419,2339],[49,43],[24,22],[16,15]],[[7508,2419],[65,-42],[2,-1],[27,30],[5,5]],[[7607,2411],[-1,-4],[-2,-8],[-10,-39],[-2,-5]],[[7607,2411],[4,5],[16,19]],[[7627,2435],[14,-12],[4,-3],[7,-5],[16,-13],[5,-4],[30,-23],[3,-2]],[[7642,2313],[-55,-51],[-17,-26],[-7,-10],[-3,-2]],[[7647,2310],[-1,-5],[-17,-30],[-7,-14],[11,-8],[6,-5],[4,-3],[16,8],[-1,-11],[-2,-14]],[[7685,2519],[-5,-7],[-5,-7],[17,-17],[11,-12],[-13,-19],[19,-16],[14,10],[4,2],[15,11]],[[7328,1095],[5,23]],[[7436,1089],[-8,-8],[-10,-11],[-6,1],[-84,24]],[[7333,922],[-3,3],[-3,3]],[[7327,928],[-2,3],[-2,1]],[[7323,932],[14,16],[24,27],[21,23],[14,16],[7,10],[-13,3],[-42,12],[-4,2],[-5,2],[-5,1],[-5,0],[-11,3]],[[7318,1047],[5,23],[5,25]],[[7464,1065],[-39,-46],[-2,-2],[-43,-46],[-44,-46],[-3,-3]],[[7323,932],[-4,2],[-5,2],[-6,0],[-9,0],[-8,2],[-25,7],[-13,3]],[[7253,948],[10,12],[11,12],[-1,2],[-1,3],[-32,25],[10,18],[24,-20],[14,15],[30,32]],[[7318,1047],[-23,6],[-23,6],[-11,4],[6,23],[5,25],[5,24]],[[7253,948],[-36,9],[-12,4],[-10,2],[-7,0]],[[7053,764],[61,74],[-10,9],[-30,25]],[[7074,872],[21,21],[18,22]],[[7113,915],[3,4],[14,-19],[12,19],[19,32],[1,2],[1,3],[-1,3],[-8,4]],[[7253,948],[-4,-3],[-9,-10],[-5,-6],[-39,25],[-9,-17],[34,-23],[-2,-8],[50,-32],[13,14],[27,28],[1,1],[0,2],[1,3],[0,3],[1,-2],[0,-2],[0,-3],[-1,-4],[-1,-3],[-2,-3],[17,17],[2,3]],[[7333,922],[-3,-3],[-1,-2],[-101,-104],[-15,-17],[-47,-50],[-1,-1],[-12,-10],[-10,-8]],[[7845,4003],[9,-6],[1,-1],[36,-27]],[[2315,2374],[-2,-8],[0,-3],[15,-39],[1,-3],[2,-1],[3,0],[-20,-64],[-4,-11],[-8,-15],[-4,4],[-4,4],[-3,5],[-1,6],[1,6],[5,11],[-3,1],[-3,1],[-3,0],[-2,-1],[-19,-10],[-1,-2],[10,-27],[0,-3],[-1,-3],[-2,-3],[-3,-6],[-13,7],[-18,51]],[[2386,2333],[-17,-14],[-11,-9],[-4,-4],[-4,-5],[-3,-7],[-18,-56],[-7,-13],[-11,-21],[-12,-21],[-3,-8],[-12,-33]],[[2428,2260],[-37,-47]],[[2464,2222],[39,-63]],[[2503,2159],[-4,-4],[-5,-4],[-15,-15],[-27,-26],[-16,-15],[-3,-2],[-1,0],[-3,-1],[-1,0],[-8,0],[-3,1],[-3,0],[-3,0],[-3,0],[-3,-1],[-3,-2],[-2,-1],[-1,-1],[-2,-1],[-27,-26]],[[2434,2272],[30,-50]],[[6193,991],[0,1],[-6,3],[-7,0],[-7,-2],[-5,-4],[-4,-5],[-7,-4],[-10,-3],[-10,-1],[0,65],[-19,1],[-11,0],[0,45],[-18,0]],[[6089,1087],[1,75],[0,4]],[[6090,1166],[28,9]],[[6510,1298],[0,-1],[1,-4],[1,-1],[1,-3],[1,-4],[0,-2],[1,-3],[0,-3],[1,-13],[-1,-8],[-2,-4],[-3,-11],[-3,-9],[-3,-10],[-4,-14]],[[6500,1208],[-10,-10],[-31,-28],[-28,-21],[-21,-16],[-24,-15],[-25,-13],[-28,-18],[-20,-15],[-33,-25],[-17,-14],[-28,-17],[-15,-9],[-17,-11],[-10,-5]],[[6204,963],[0,9],[-2,7],[-4,7]],[[6198,986],[3,2],[7,2],[4,-2],[3,1]],[[6211,966],[-2,-1],[-5,-2]],[[6203,961],[8,4]],[[6209,957],[-3,-2],[-1,0],[-2,-1],[0,7]],[[6089,1087],[-18,0],[-18,1],[-22,0]],[[6031,1088],[1,55],[-19,-6],[-19,-6]],[[5994,1131],[-1,5],[78,24],[3,1],[16,5]],[[6031,1043],[0,45]],[[6089,1087],[1,-44],[-9,0],[0,-63]],[[6081,980],[-11,3],[-17,1],[-22,0],[0,59]],[[6031,1043],[-19,0],[1,45],[-19,0],[-20,1]],[[5975,1125],[19,6]],[[6081,980],[0,-10]],[[6081,970],[-21,1],[-6,1],[-23,4],[-14,3],[-43,5]],[[5974,986],[0,56],[0,5],[0,31]],[[5977,881],[27,-8],[22,-1],[25,4],[22,9],[7,3]],[[6080,888],[-2,-21]],[[6078,867],[-12,-6],[-21,-2],[-6,0],[-9,-3],[-7,0],[-4,-2],[-4,0],[-7,-6],[-11,-2],[-14,1],[-8,2]],[[5978,929],[3,-2],[77,-24],[22,12]],[[6080,915],[0,-4],[0,-2]],[[6080,909],[-14,-7],[-12,-5],[-12,1],[2,-3],[-1,0],[-11,1],[-21,0],[-12,1],[-12,4],[-5,2],[-4,3]],[[5975,979],[12,-4],[12,-1],[10,2],[7,0],[16,-3],[31,-7],[17,0]],[[6080,966],[0,-3],[0,-3]],[[6080,960],[-4,0],[-13,-3],[-17,-2],[-12,0],[-18,3],[-5,2],[-27,6],[-7,1],[-1,1]],[[6211,867],[-12,8],[-10,11],[-28,6],[-6,2],[-16,0],[-12,-4],[-11,-4],[-6,-4],[-1,-1],[-22,-11],[-9,-3]],[[6080,888],[5,2],[18,11],[27,16],[6,3],[6,4],[5,7],[-1,3],[3,1],[30,16],[19,6],[5,4]],[[6193,991],[-10,-5],[-26,-10],[-20,-5],[-18,0],[-22,-1],[-16,0]],[[6204,963],[-7,-1],[-8,3],[-15,-11],[-26,-15],[-3,-1],[0,1],[-10,1],[-55,-31]],[[6080,915],[59,32],[0,1],[7,4],[0,3],[16,9],[10,4],[15,10],[4,3],[3,4],[4,1]],[[6096,939],[-2,0],[-2,0],[0,3],[0,10],[6,5],[4,1],[2,3],[2,3],[4,2],[7,0],[2,1],[8,0],[5,0],[2,-8],[-3,-3],[-35,-17]],[[6080,966],[23,0],[-2,-4],[-4,0],[-17,-2]],[[4784,1039],[0,-13],[-2,-7],[-2,-9],[-8,-13],[-11,-10],[-7,-9],[-3,-17],[-3,-3],[-5,-3],[-11,-10],[-4,-2],[-8,0],[-5,-1],[-14,6],[-20,5],[-17,8],[-18,2],[-20,5],[-20,15],[-9,15],[1,8],[3,6],[4,8],[12,10],[9,13],[8,7],[4,1],[6,0],[14,-4],[15,-3],[29,3],[14,4],[17,1],[12,-4],[6,-3],[8,-3],[20,0],[5,-3]],[[8225,4853],[-8,-19]],[[8217,4834],[-17,8],[-9,-24],[-7,-19],[-14,6],[-5,-15]],[[8165,4790],[-10,5],[-26,13]],[[8129,4808],[14,37],[7,19]],[[8150,4864],[8,21]],[[8217,4834],[-16,-43],[66,-33]],[[8267,4758],[-13,-34],[-17,9],[-8,4],[-15,7],[-9,5],[-16,8],[-31,15]],[[8158,4772],[7,18]],[[8283,4824],[-7,-19],[-1,-6],[0,-17],[-8,-24]],[[8305,4738],[-22,12],[-16,8]],[[8292,4576],[-60,12],[-19,2],[-61,10],[-36,6],[-32,4],[-31,5]],[[8053,4615],[4,6],[6,11],[5,10],[6,16],[11,28],[12,33]],[[8097,4719],[1,-1],[5,-2],[4,7],[4,7],[4,9],[5,8],[4,7],[14,-7],[9,-5],[5,12],[6,18]],[[9689,9681],[2,4],[1,4],[0,3],[3,4],[5,5],[6,6],[7,7],[5,7],[1,7],[1,9],[-2,2],[-8,2],[-6,1],[-18,33]],[[9766,9812],[7,-15],[1,-6],[2,-6],[0,-3],[0,-11],[-1,-10],[-26,7],[-2,-3],[-5,-33],[-2,-9],[0,-6],[-1,-4],[-3,-6],[-6,-9],[-12,-15],[-4,-4],[-1,-2],[-2,-1],[-22,5]],[[8010,5802],[-12,-30],[-9,4],[-12,6],[-21,-39],[-15,7]],[[8504,5582],[-1,-3],[-3,-5],[-11,-28],[-12,-29],[-8,-21]],[[8703,5618],[-9,-21],[-3,-11],[-29,-91],[66,-36]],[[8728,5459],[-1,-3],[-19,-59],[0,-5],[-4,-12]],[[8544,5681],[6,-3],[1,-2],[49,-27],[4,11],[4,10]],[[8608,5670],[40,-22],[31,-17],[9,-5],[15,-8]],[[8624,5710],[-4,-10],[-4,-10],[-4,-10],[-4,-10]],[[8711,5638],[-8,-20]],[[8624,5710],[41,-22]],[[8665,5688],[31,-17],[9,-5],[14,-8]],[[8719,5658],[-8,-20]],[[8693,5758],[-8,-19],[-8,-20],[-8,-20],[-4,-11]],[[8732,5690],[-13,-32]],[[8748,5728],[-8,-19],[-8,-19]],[[8797,5653],[-9,5],[-1,1],[-21,12],[-8,4],[-17,9],[-9,6]],[[8748,5728],[9,-5],[47,-26],[9,-5]],[[8776,5602],[-40,21],[-16,10],[-9,5]],[[8797,5653],[-9,-21],[-4,-10],[-4,-10],[-4,-10]],[[8838,5592],[-13,7],[-5,-10],[-4,-10],[-40,23]],[[8845,5503],[-1,-3],[-33,-104],[-4,-12],[-4,-14],[-5,-16],[-7,-25],[-1,-3]],[[8790,5326],[-1,1],[-25,18],[-22,14],[-7,4],[-31,17]],[[8728,5459],[32,102],[4,11],[4,10],[4,10],[4,10]],[[9010,5560],[-8,-20],[8,-5],[52,-29],[10,-5],[1,-4]],[[8892,5625],[-4,-10],[-3,-10],[-4,-9],[-3,-10],[62,-35],[5,10],[3,9],[-3,1],[8,20]],[[4560,3691],[-5,-8],[-8,-8],[-11,-8],[-15,-10],[-9,-9],[-21,-19],[-8,-9],[-6,-7],[-9,-10],[-7,-8],[-10,-9],[-28,-19],[-45,-22],[-22,-16]],[[4292,3588],[10,4],[8,3],[7,3],[10,7],[6,6],[3,5],[4,8],[1,10],[3,1],[8,6],[3,4],[23,17],[6,3],[4,0],[15,-1],[14,-3],[7,-2],[0,-23],[-2,-5],[0,-1],[11,5],[8,5],[7,6],[5,3],[1,0],[3,0],[9,-4],[-1,14],[5,6],[5,0],[7,2],[7,10],[4,4],[13,14],[3,15],[2,22],[0,15],[7,20],[8,14],[8,11],[15,24],[4,5],[3,2],[11,-2],[2,2],[2,5],[9,2],[3,0],[1,-12],[2,-4],[6,4],[15,22],[18,28],[3,-3],[5,3],[8,10],[24,36],[7,20],[1,20],[6,9],[3,15],[6,15],[0,8],[2,14],[12,5],[13,6],[1,3]],[[4716,4029],[1,-5],[36,-36]],[[4404,3716],[-6,-1],[-4,5],[-5,9],[-1,9],[-4,20],[0,17],[4,7],[14,12],[6,9],[7,8],[29,19],[14,6],[8,5],[8,0],[6,-2],[5,-5],[0,-8],[0,-10],[-8,-26],[-1,-13],[-5,-29],[-4,-9],[-4,-6],[-6,-5],[-7,-10],[-5,-4],[-17,-1],[-24,3]],[[4412,3456],[-56,73]],[[9689,9681],[-1,-9],[-4,-19]],[[9684,9653],[-52,14],[-17,4],[-6,3],[-9,5]],[[9675,9602],[9,51]],[[7266,4453],[-9,-11],[-11,8],[-24,18],[-10,7]],[[8176,3051],[-3,4],[-10,8],[-2,1],[-2,2],[-3,1],[-1,1],[-4,3],[-12,10]],[[8142,5032],[-8,-21]],[[8134,5011],[-33,17],[-9,4]],[[8092,5032],[6,23],[8,22]],[[8092,5032],[-10,5],[-2,1],[-17,9],[-22,10],[-9,5]],[[8058,5129],[9,-5],[14,-7],[23,-12],[9,-5]],[[8079,4993],[-10,5],[-42,21],[-10,4]],[[8092,5032],[-7,-20],[-6,-19]],[[8066,4954],[-7,-19]],[[8079,4993],[-7,-20],[-6,-19]],[[8113,4932],[-9,4],[-28,14],[-10,4]],[[8134,5011],[-14,-39],[-7,-19],[0,-21]],[[8113,4882],[-14,6],[-39,20],[-9,4]],[[8113,4932],[0,-24],[0,-26]],[[8150,4864],[-2,1],[-28,13],[-7,4]],[[8129,4808],[-2,1],[-21,11],[-9,4]],[[8097,4824],[1,6],[1,4],[2,9],[4,10],[3,9],[-55,27],[-9,5]],[[8097,4824],[-9,5],[-48,23],[-9,5]],[[8090,4806],[-9,4],[-48,24],[-9,5]],[[8097,4824],[-7,-18]],[[8457,4942],[-32,18]],[[8479,4997],[-7,-16]],[[8472,4981],[-3,-9],[-4,-10],[-4,-10],[-4,-10]],[[8542,4944],[-10,5],[-60,32]],[[8488,5025],[10,-5],[59,-32]],[[8530,4904],[-49,26],[-24,12]],[[8503,4823],[-12,6],[-48,24],[-11,5],[-13,7]],[[8419,4865],[2,30],[1,26],[1,14],[2,25]],[[8493,4797],[-11,5],[-41,21],[-24,11]],[[8417,4834],[1,11],[0,6],[1,14]],[[8408,4789],[3,11],[2,6],[2,7],[1,4],[1,17]],[[3203,1734],[-34,59],[-4,7],[-12,21],[-26,43]],[[3167,1567],[-16,63]],[[3151,1630],[-33,129]],[[3151,1630],[-4,-1],[-9,5],[0,-3],[0,-2],[-2,-1],[-20,-8]],[[3116,1620],[-4,2],[-5,1],[-3,-2],[-9,-7]],[[3163,1566],[-8,-2],[-20,-18]],[[3135,1546],[-19,74]],[[3008,1441],[-17,-14]],[[2991,1427],[-7,28],[-7,26],[-24,-19],[-2,-2],[-2,0],[-2,1],[-8,14],[-2,3],[0,2],[2,3],[49,39]],[[3135,1546],[-19,-15],[-17,-15],[-18,-15],[-18,-14],[-17,-14],[-19,-17],[-19,-15]],[[3082,1349],[-18,-8],[-20,-9],[-16,68],[-6,12],[-4,7],[-6,9],[-4,13]],[[3193,1447],[-14,-5],[-30,-11],[-6,-4],[-4,12],[-16,-5],[-2,-2],[-1,-2],[9,-34],[-22,-10],[-10,-5],[-1,-2],[5,-22],[-19,-8]],[[3090,1320],[-3,6]],[[3087,1326],[-5,23]],[[3087,1326],[-55,-26],[-30,-12],[-9,34],[-23,-7],[-20,86],[-2,6],[4,7],[11,-7],[8,2],[20,18]],[[2757,1440],[60,-6]],[[2817,1434],[65,2],[-63,131],[30,23],[-12,21]],[[2817,1434],[-4,19]],[[2813,1453],[-6,23],[-5,16],[-1,8],[-1,9],[-2,15],[-1,9]],[[2797,1533],[-3,9],[-6,12],[-7,10],[13,11],[6,5],[7,5],[11,10],[3,3]],[[2821,1598],[3,2],[10,8],[3,3]],[[2813,1453],[-13,-4],[-35,0],[-21,0],[-37,0]],[[2707,1449],[-5,24],[-6,34],[-2,8],[-9,22],[-10,23]],[[2675,1560],[6,2],[9,3],[10,7],[25,21],[5,-7],[9,-11],[-33,-28],[-1,-2],[0,-2],[10,-19],[22,19],[1,1],[1,-1],[7,-6],[7,-10],[6,5],[7,1],[8,0],[23,0]],[[2675,1560],[-12,29]],[[2663,1589],[19,7],[14,6],[9,5],[11,9],[14,10],[12,-19],[19,17],[16,12],[11,10],[1,1],[1,0],[2,0],[1,-1],[0,-1],[28,-47]],[[2707,1449],[-20,0],[-1,1],[-1,1],[-6,32],[-1,2],[-2,0],[-18,1],[-1,-1],[-6,-9],[9,-9],[1,-3],[2,-10],[1,-4],[-1,-1],[-1,0],[-13,0],[-4,1],[-12,10],[-13,11],[-1,1],[-2,0],[-20,1],[-2,0],[-1,1],[0,1],[-1,2],[0,2],[1,17]],[[2594,1496],[0,22],[0,24],[0,17],[1,25],[21,0],[22,1],[11,1],[14,3]],[[2594,1496],[-74,0],[-20,1],[-1,26],[-17,0],[-1,0],[-1,1],[-1,3],[2,20],[-1,20],[1,3],[2,0],[15,0],[2,-2],[0,-2],[0,-23],[17,0],[3,0],[1,42],[-59,0],[-25,0],[-8,-1],[-4,-3],[-14,-10]],[[8245,3572],[-7,-14],[-13,-24],[-27,-52],[-6,-12],[-9,-17]],[[8083,4787],[-9,5],[-48,24],[-9,4]],[[8090,4806],[-7,-19]],[[8077,4769],[-10,4],[-48,24],[-9,5]],[[8083,4787],[-6,-18]],[[8102,4734],[-2,1],[-21,11],[-9,4],[-9,5],[-48,24],[-10,4]],[[8077,4769],[9,-5],[20,-10],[3,-2]],[[8109,4752],[-3,-9],[-4,-9]],[[8129,4808],[-3,-9],[-3,-10],[-4,-9],[-3,-9],[-7,-19]],[[8097,4719],[3,7],[2,8]],[[8053,4615],[-4,-7]],[[8049,4608],[-2,2],[-4,1],[-9,6]],[[7991,4747],[11,-11],[53,-27],[9,25],[-9,5],[-48,23],[-10,3]],[[8010,4543],[-12,-19]],[[7998,4524],[-2,2],[-8,6],[-5,4],[-8,6],[-10,-19]],[[7975,4486],[12,20],[11,18]],[[2944,3456],[-7,-2]],[[2937,3454],[-10,24],[-2,4],[-14,29]],[[2911,3511],[11,6],[4,1],[7,2],[7,1],[8,5],[10,6],[-6,12],[-3,6],[-8,19],[9,6],[4,3],[4,5],[5,8],[3,10],[1,7],[-1,10],[-2,7],[-13,29]],[[2951,3654],[32,-6],[34,-6],[18,-3],[3,1],[3,0]],[[2791,3388],[-15,24]],[[2776,3412],[20,11],[1,3],[-5,10],[-3,6],[-1,6],[0,6],[1,7],[1,5],[4,17],[0,9],[0,6],[-1,6],[-1,4],[-7,18],[-2,4]],[[2783,3530],[31,15],[8,5],[13,6],[11,4],[11,2],[10,1],[7,0]],[[2874,3563],[21,-5],[-1,-9],[0,-3],[8,-16],[9,-19]],[[2937,3454],[-15,-5],[-42,-10],[-31,-8],[-10,-3],[-21,-15],[-7,-6],[-20,-19]],[[2832,3313],[-14,29],[-11,22],[-16,24]],[[2978,3381],[-31,-14]],[[2947,3367],[-39,-18],[-47,-22],[-29,-14]],[[3146,3440],[-3,-3],[-5,9],[-31,-26],[-30,-22]],[[3077,3398],[-38,-27],[-27,-25],[-8,-5]],[[3004,3341],[-3,13],[-41,-17],[-12,27],[-1,3]],[[3114,3269],[-25,-12],[-11,-6],[-11,-10],[-10,-9],[-14,-18]],[[2977,3296],[-4,11],[-2,5]],[[2971,3312],[17,13],[16,16]],[[3077,3398],[6,-5],[8,-6],[-5,-10],[-3,-9],[-3,-15],[-5,-23],[8,-3],[7,-4],[5,-6],[6,-7],[4,-10],[2,-8],[7,-23]],[[3212,3327],[-3,-3],[-18,-13],[-12,-7],[-14,-11],[-13,-7],[-16,-7]],[[3136,3279],[-22,-10]],[[7576,2516],[0,11],[1,15],[-1,3],[0,4],[-2,3],[-1,3],[-3,2],[-9,8]],[[7561,2565],[-64,47]],[[7516,2500],[15,23],[14,19],[16,23]],[[7576,2516],[-3,-6],[-10,-13],[-15,-20],[-2,1],[-10,8],[-20,14]],[[7508,2419],[-10,11],[-4,1],[-2,2],[-11,8],[-3,4]],[[7478,2445],[22,32],[13,18],[3,5]],[[7478,2445],[-16,11],[-15,11],[-16,12],[-7,6],[-11,-12],[-10,3]],[[7453,2548],[33,-25],[30,-23]],[[7478,2445],[-12,-17],[-8,-12],[-61,45],[-2,3]],[[7419,2339],[-2,1],[-4,2],[-5,4],[-6,5],[-56,42]],[[7380,2304],[-5,4],[-16,12],[-8,6],[-13,9],[-22,17],[-1,1],[-4,3],[-1,1]],[[8352,4867],[10,-5],[41,-20],[3,-2],[11,-6]],[[8499,5050],[12,-7],[3,-1],[4,12],[33,-17],[4,11],[11,-6],[9,-5],[3,-1]],[[8518,5096],[11,-6],[46,-24],[9,-5],[3,-2]],[[8618,5139],[-31,-80]],[[8549,5176],[67,-36],[2,-1]],[[8569,5225],[10,-5],[48,-26],[8,-5],[3,-1]],[[8638,5188],[-10,-25],[-10,-24]],[[8587,5273],[10,-6],[48,-26],[8,-5],[3,-1]],[[8656,5235],[-9,-24],[-9,-23]],[[8674,5282],[-9,-24],[-9,-23]],[[8738,5162],[-24,13],[-9,-24],[-10,6],[-2,1],[-46,25],[-9,5]],[[8757,5065],[-41,22],[-1,0]],[[8715,5087],[8,25],[8,25]],[[8688,5005],[18,50],[9,32]],[[3733,2721],[-98,-76],[-2,-2],[-1,-1]],[[3581,2834],[10,10],[43,30],[17,11],[14,10],[-11,79]],[[3654,2974],[12,-19],[3,-15],[19,6],[-6,23],[-11,19],[17,13],[21,17]],[[3709,3018],[6,-10],[4,-26],[6,-25],[19,7],[9,-42],[3,-20],[1,-16]],[[4001,2937],[-43,-35],[-67,-54]],[[3820,2949],[18,0],[1,10],[4,10],[5,6],[27,21],[10,-17],[12,-19],[19,15],[42,34]],[[3958,3009],[32,-54],[11,-18]],[[3709,3018],[14,10],[13,2]],[[3736,3030],[21,2]],[[3757,3032],[5,1],[6,2],[8,5],[32,24],[10,-17],[10,-17],[9,-17],[3,-1],[21,17],[15,15],[14,18],[12,18]],[[3902,3080],[21,-19],[13,-15],[22,-37]],[[3757,3032],[-3,21],[77,61],[12,-16],[15,17]],[[3858,3115],[13,-13],[13,-10],[18,-12]],[[3736,3030],[-1,8],[-12,21],[-3,11],[-4,31]],[[3716,3101],[19,6],[11,6],[70,55]],[[3816,3168],[13,-12],[8,-11],[2,-4],[11,-16],[8,-10]],[[3711,3146],[6,2],[5,2],[6,4],[3,3]],[[3731,3157],[42,32],[18,13]],[[3791,3202],[7,-13],[8,-11],[10,-10]],[[3749,3291],[2,-2],[2,-4],[5,-51],[0,-3],[-2,-2],[-24,-19],[-1,-42],[0,-11]],[[3774,3298],[3,-35]],[[3777,3263],[3,-22],[3,-18],[8,-21]],[[3855,3198],[-39,-30]],[[3777,3263],[14,2],[64,-67]],[[3915,3234],[-44,-23],[-16,-13]],[[3826,3326],[-2,-2],[-16,-11],[-3,-2],[-5,0],[-1,-15],[17,-20],[50,-55],[35,24],[1,1],[0,-1],[7,-8],[6,-3]],[[7262,826],[76,80],[2,2],[2,2],[3,3],[3,4],[5,6]],[[7113,915],[-45,0],[5,21],[54,0],[9,14],[6,10],[2,4]],[[7074,872],[-36,-38]],[[7028,842],[27,93],[-19,1],[7,24],[1,5]],[[6616,5393],[12,28],[8,17],[17,33],[9,19]],[[6572,5425],[9,27],[2,4],[5,12],[9,18],[9,18]],[[6606,5504],[10,18]],[[6572,5425],[-4,3],[-35,24],[-16,11],[-3,2]],[[6514,5465],[7,23],[4,10],[5,10]],[[6530,5508],[9,18],[9,18]],[[6548,5544],[58,-40]],[[6548,5544],[10,19]],[[6558,5563],[9,17],[12,26],[2,3],[9,17]],[[6530,5508],[-58,40]],[[6472,5548],[9,18],[9,19],[9,18]],[[6499,5603],[59,-40]],[[6499,5603],[6,12],[3,6]],[[6508,5621],[2,4],[11,21],[2,3],[8,18]],[[6455,5505],[-46,32]],[[6409,5537],[10,22],[5,11],[4,8],[6,12],[12,25]],[[6446,5615],[12,23],[6,13]],[[6464,5651],[44,-30]],[[6472,5548],[-6,-9],[-3,-10],[-8,-24]],[[2503,2159],[29,-49]],[[2503,2159],[10,10],[0,3],[10,-18],[16,13],[65,56],[-12,19],[15,13]],[[2607,2255],[16,14],[17,14],[16,14],[18,-29],[11,-18],[62,54]],[[2747,2304],[51,44],[4,-4],[5,5],[15,13],[3,3]],[[2825,2365],[3,-4]],[[2464,2222],[11,13],[30,25],[10,-18],[6,5],[8,8],[10,14],[21,41]],[[2560,2310],[8,-5],[9,-7],[7,-8]],[[2584,2290],[12,-17],[11,-18]],[[2389,2380],[2,-3],[2,-4],[2,-3],[11,-18],[22,-37],[52,43],[16,14]],[[2496,2372],[17,-28],[5,-6],[8,-6],[17,-11],[17,-11]],[[2536,2504],[3,-5],[3,-6]],[[2542,2493],[-31,-26]],[[2511,2467],[-48,-40],[6,-11],[27,-44]],[[2511,2467],[10,-19],[11,-18],[11,-18],[-15,-13],[18,-30],[1,-2],[-10,-14],[-2,0],[-3,1],[-4,5],[-16,26],[-16,-13]],[[2542,2493],[12,9],[7,4],[9,-22],[17,-28],[5,-6],[20,-14],[4,-3],[4,-4],[6,-4],[7,-12],[13,-21],[6,-5],[4,-2]],[[2656,2385],[-6,-12],[-2,-8]],[[2648,2365],[-4,-19],[-2,-6],[-3,-3],[-55,-47]],[[2734,2450],[-13,-7],[-4,-3],[-33,-28],[-19,-15],[-6,-7],[-3,-5]],[[2760,2473],[-3,-3],[-23,-20]],[[2714,2357],[-32,-28],[-20,7],[3,13],[1,6],[1,5],[-19,5]],[[2734,2450],[19,-32],[12,-18],[-36,-30],[-15,-13]],[[2747,2304],[-11,18],[-11,17],[-11,18]],[[2760,2473],[65,-108]],[[2779,2488],[43,-69],[3,-4],[4,0],[18,15],[3,5],[8,20],[14,13],[-8,14],[21,17],[18,16]],[[2883,2571],[3,-6],[9,-15],[2,-12],[2,-12],[4,-11]],[[2923,2611],[16,21]],[[2852,2767],[8,-13],[7,-4],[27,-18],[-3,-7],[-9,-14],[-15,-16]],[[2920,2824],[11,-19],[-46,-40],[18,-12],[22,18],[3,-1],[13,-18],[8,-8],[8,-6],[18,-8],[20,-9]],[[8244,3448],[38,-30],[6,11],[-2,10],[8,14],[10,21],[-1,2],[-6,4],[-25,19],[-28,-51]],[[7803,1101],[-31,8]],[[7772,1109],[2,12],[4,23],[5,22],[3,23]],[[7786,1189],[73,-20],[14,20],[13,20],[9,12]],[[7934,1216],[-32,-44],[-37,-53],[-20,-28]],[[7845,1091],[-42,10]],[[7786,1189],[5,22],[4,23],[2,10]],[[7772,1109],[-64,17]],[[7708,1126],[2,12],[5,23],[4,22],[4,23],[4,22],[-38,10],[4,23],[-58,15],[-9,4]],[[7701,1092],[4,23],[3,11]],[[7803,1101],[-7,-10],[-10,-21],[-9,-17],[-6,-14],[-5,-7],[-42,11],[-31,8],[4,21],[4,20]],[[7566,1164],[142,-38]],[[7701,1092],[-71,19]],[[7554,1166],[3,8],[28,59],[15,39],[1,1],[4,7]],[[7590,1280],[-53,-106],[0,-2]],[[7716,979],[17,18],[16,18],[-99,26]],[[7845,1091],[-8,-11],[-20,-25],[-26,-29],[-16,-10],[-15,-19],[-10,-8],[-8,-6],[-5,-12]],[[8099,2087],[-4,-70]],[[8056,2451],[35,35],[43,45]],[[8031,2526],[9,13],[2,6],[1,8],[2,8],[7,8],[7,10],[7,12],[2,2]],[[8101,2562],[16,-15],[17,-16]],[[5497,3222],[4,6],[31,42]],[[5532,3270],[7,-9],[4,-5],[4,-11],[14,7],[2,3],[14,18],[2,0],[3,-1],[14,-14],[15,-15]],[[5529,3272],[3,-2]],[[5488,3325],[29,35],[13,-14],[-18,-25],[13,-15]],[[5525,3306],[-12,-18]],[[5569,3320],[-37,-50]],[[5525,3306],[26,32]],[[5551,3338],[16,-16]],[[5567,3322],[2,-2]],[[5490,3360],[23,30],[3,0],[39,-41],[1,-3],[-5,-8]],[[5476,3373],[33,45]],[[5509,3418],[61,-67],[-3,-29]],[[5489,3439],[20,-21]],[[5532,3446],[-23,-28]],[[5550,3518],[20,-22],[-38,-50]],[[5584,3482],[-38,-50]],[[5546,3432],[-14,14]],[[5614,3520],[-2,-3],[-17,-21],[-11,-14]],[[5584,3482],[14,-15],[-24,-33],[14,-14],[25,32],[14,-16]],[[5627,3436],[-15,-19],[-24,-30],[-42,45]],[[5627,3436],[28,37],[2,2]],[[5675,3458],[-3,-4],[-43,-56],[-38,-49]],[[5663,3327],[-22,-31]],[[5710,3422],[-3,-4],[-7,-9],[-23,-28],[-13,-18],[-3,-4],[-12,-17],[14,-15]],[[5748,3274],[-2,2],[-16,16],[-36,36],[-6,3],[-8,2],[-8,-3],[-9,-3]],[[7316,2249],[-2,5],[-53,39],[-3,2],[-11,9]],[[7352,2281],[-2,-2],[-15,-13],[-2,-2],[-17,-15]],[[7415,2207],[-10,7],[-35,27],[-2,1],[-9,7],[-8,-9],[-20,-25],[-14,-17]],[[7317,2198],[-14,-17],[-14,-17]],[[7289,2164],[-35,27],[-3,2]],[[7251,2193],[8,7],[8,7],[17,14],[17,15],[15,13]],[[7369,2159],[-8,6],[-11,8],[-23,17],[-10,8]],[[7307,2125],[-7,5],[-5,3],[-20,15]],[[7275,2148],[7,8],[7,8]],[[7154,2101],[18,15],[18,16],[32,-24],[4,-2],[9,-7],[13,18],[5,7],[8,9],[7,7],[7,8]],[[7246,2196],[17,15],[16,14],[-66,50]],[[4915,4124],[-9,-12],[-14,-10],[-17,-7],[-23,-10],[-18,-11],[-17,17],[-13,13],[-17,-21],[-15,-17]],[[4716,4029],[2,3],[2,7],[3,14],[1,14],[3,13],[4,8],[5,6],[7,8],[8,6],[7,0],[2,-1],[11,-11],[6,-1],[16,17],[26,27],[6,6],[6,15],[9,20],[9,16],[5,9],[16,19],[5,5],[13,-6],[8,0],[8,3],[8,7],[18,11],[7,5],[13,10],[9,10],[0,2],[-3,2],[-2,2],[-2,3],[-1,3],[4,7],[3,7],[5,1],[8,15],[4,1],[6,1]],[[4981,4313],[12,-15],[3,-4],[4,-3],[5,-4],[6,-3]],[[5011,4284],[2,-2],[13,-12],[2,-3],[13,-14],[11,-13],[4,-6],[3,-5]],[[5059,4229],[-10,-9],[-7,-8]],[[5042,4212],[-18,-9],[-13,-7],[-23,-12],[-29,-16],[-12,-6],[-2,-1],[-2,-1],[-4,-3],[-9,-10],[-15,-23]],[[5110,4308],[-9,-9],[-13,-19],[14,-14]],[[5102,4266],[-19,-30],[-12,13],[-12,-20]],[[5011,4284],[2,10],[-4,1],[5,28],[1,2],[2,2],[4,0],[4,-3],[4,-4],[4,-3],[14,-3],[2,1],[1,1],[8,11],[17,-17],[15,20],[20,-22]],[[5120,4314],[-10,-6]],[[4981,4313],[5,1],[5,1],[3,8],[1,10],[1,6],[3,17],[2,4],[6,6],[15,18],[13,17],[11,13]],[[5046,4414],[2,-4],[8,-9]],[[5056,4401],[50,-52],[28,-30],[-14,-5]],[[5120,4314],[25,-26]],[[5168,4263],[-15,-19],[-13,-18],[-38,40]],[[5056,4401],[16,20],[49,-52],[14,19],[-5,6],[12,18],[14,19],[48,-49],[5,6],[3,5],[3,5],[2,-2]],[[5046,4414],[17,20],[1,0],[34,25],[12,5],[10,6],[16,2],[8,1],[2,1],[5,2],[17,2],[13,0],[14,0],[1,-3],[-2,-8],[0,-7],[5,-17],[1,-5],[0,-3],[-3,-3],[-7,-6],[-3,-7],[-1,-2],[1,-8],[8,-4],[7,-1],[4,-1],[-3,10],[0,10],[0,9],[3,13],[0,10],[1,10],[1,5],[3,3],[2,4],[3,2],[0,2],[5,4],[6,0],[6,2],[6,4],[8,2],[5,4],[3,8],[8,6],[9,3],[5,3],[3,5],[6,6],[19,24],[3,4]],[[5308,4556],[8,-8],[7,-8],[3,-3]],[[5326,4537],[-3,-4],[-8,-13],[-16,-17],[-17,-17],[-14,-15]],[[5268,4471],[-15,-17],[-14,-15],[-5,-6],[-3,-5],[-2,-4],[-1,-2]],[[5177,4187],[-20,21],[-2,2],[-16,-21]],[[5139,4189],[-41,36],[-16,-22]],[[5082,4203],[-5,6],[-4,4],[-4,4],[-3,4],[-7,8]],[[6601,1293],[-5,-3],[-3,-2],[-7,-5],[-29,-23],[-33,-30],[0,-5],[-2,-1],[-2,-2],[-2,-1],[-2,-2],[-4,-3],[-8,-5],[-4,-3]],[[6461,1364],[7,14],[6,14]],[[6521,1212],[1,2]],[[5409,4205],[-44,-59],[-1,-2],[-12,-16]],[[5352,4128],[-40,41],[-3,0],[-3,-1],[-22,-28]],[[5304,4210],[11,-11],[8,-9],[44,59]],[[5367,4249],[42,-44]],[[5348,4270],[11,-12],[8,-9]],[[5359,4285],[12,16]],[[5371,4301],[62,-64]],[[5433,4237],[-13,-17],[-11,-15]],[[5371,4301],[14,17],[13,18],[13,16]],[[5411,4352],[13,18]],[[5424,4370],[62,-64]],[[5486,4306],[-14,-18]],[[5472,4288],[-12,-16],[-13,-18],[-14,-17]],[[5297,4350],[12,16],[13,18],[13,16],[9,3],[16,2],[32,-33],[19,-20]],[[5447,4399],[-10,-12],[-13,-17]],[[5268,4471],[40,-41],[12,16],[15,19],[32,-34],[16,19],[6,9],[7,8],[22,-6],[28,-28],[-14,-19],[15,-15]],[[5488,4445],[-4,-4],[-2,-2],[-13,-16],[-17,-19],[-5,-5]],[[5326,4537],[2,-2],[1,-1],[9,-9],[3,-3],[4,-3],[3,-2],[2,-2],[3,-2],[3,-2],[5,-4],[7,-4],[2,-1],[2,-1],[6,-3],[7,-3],[9,-3],[5,-2],[4,-2],[5,-1],[4,-1],[3,-1],[3,-1],[4,-1],[4,-2],[3,-1],[3,-1],[3,-1],[3,-1],[3,-1],[3,-2],[4,-1],[3,-2],[2,-2],[3,-1],[4,-2],[3,-2],[3,-2],[3,-2],[3,-2],[2,-1],[2,-2],[3,-3],[4,-3],[2,-2],[3,-2]],[[5482,4531],[22,-22],[19,-20],[1,-2]],[[5524,4487],[-19,-22],[-8,-10],[-9,-10]],[[5326,4537],[15,23]],[[5341,4560],[20,-21],[13,-12],[6,-6],[27,30],[14,13],[22,-21],[9,18],[15,-15],[15,-15]],[[5432,4607],[60,-62]],[[5492,4545],[-10,-14]],[[5341,4560],[12,18],[17,26],[23,19],[29,-29],[10,13]],[[5432,4607],[3,4],[4,5],[4,5],[9,12],[3,0],[3,0],[4,2],[1,2],[1,2],[56,-54]],[[5520,4585],[-2,-4],[-15,-21],[-11,-15]],[[5463,4686],[11,-10],[26,-15],[51,-30]],[[5551,4631],[-1,-3],[-11,-15],[-19,-28]],[[5308,4556],[1,2],[12,19],[9,15],[9,12],[3,11],[9,15],[14,15],[3,-3],[2,2],[-3,3],[2,3],[2,5],[2,7],[3,9],[4,16],[2,3],[4,5],[5,2],[5,0],[7,1],[7,9],[2,1],[14,0],[6,1],[3,2]],[[5620,4619],[-10,-22]],[[5610,4597],[-26,15],[-33,19]],[[5571,4675],[-10,-22],[59,-34]],[[5659,4720],[-8,-23],[0,-3],[-8,-21],[-2,-3],[-3,-7]],[[5638,4663],[-8,-21]],[[5630,4642],[-10,-23]],[[5627,4760],[-9,-23],[18,-10],[-8,-20],[12,-10],[4,-2],[2,3],[6,17],[3,4],[4,1]],[[5742,4702],[-9,-25],[-51,27],[-7,-18],[-4,-3],[-4,-1],[-10,6],[-2,3],[0,3],[6,17],[1,5],[-3,4]],[[5667,4740],[75,-38]],[[3044,2793],[-25,-21],[-8,-9],[-6,-12],[-3,-7]],[[2920,2824],[16,13]],[[7282,7043],[16,13],[31,26],[19,17],[14,7],[8,7],[11,10],[14,13]],[[7271,7060],[-32,51],[-11,16]],[[7228,7127],[26,22],[20,18],[30,26],[7,7],[6,5],[8,6],[15,13]],[[7212,7062],[-23,35]],[[7189,7097],[13,11]],[[7202,7108],[14,11],[2,0],[8,6],[2,2]],[[7202,7108],[-14,22]],[[7188,7130],[23,19],[2,2]],[[7213,7151],[15,13],[-44,70]],[[7213,7151],[-33,51]],[[7180,7202],[-11,19]],[[7188,7130],[-32,52]],[[7156,7182],[22,18],[2,2]],[[7189,7097],[-2,-3]],[[7187,7094],[-47,74]],[[7140,7168],[16,14]],[[9437,6162],[2,-8],[3,-1],[-21,-80],[-3,2],[-3,0],[-1,-4],[-2,-7],[-1,-4]],[[9221,5808],[-2,1],[-8,5],[-26,14],[-52,28],[-9,6],[-41,22],[-17,9],[8,21],[47,-26],[11,-6],[8,21],[89,-49],[11,-5],[2,-2]],[[5690,1018],[1,-12],[3,-1],[0,-4],[-1,-2],[-5,0],[-1,1],[-1,4],[0,8],[-1,6],[-13,1],[-6,-6],[-1,-2],[6,-2],[0,-2],[-12,2],[-1,-5],[-10,2],[-23,-10],[-1,3],[15,8],[-18,28],[-6,6],[-7,3],[-8,2],[-7,1],[-6,2],[-12,8],[-14,9],[-5,2],[-12,6],[-12,3],[-7,1],[-4,1],[-4,0],[-14,1],[-3,2],[-1,4],[-4,2],[-6,1],[-6,3],[-7,-3],[-9,5],[-3,0],[-8,4],[-5,-1],[-11,-6],[-2,0],[-11,1],[-6,-5],[-23,13],[-22,15],[-20,11],[-6,3],[-3,-1],[-10,0],[-3,-1],[-9,-3],[-10,1],[-6,1],[-8,3],[-10,4],[-12,0],[-3,2],[-3,1],[-16,7],[-5,6],[-9,15],[-6,5],[-6,0],[-14,4],[-3,2],[-4,2],[-25,7],[-46,16],[-14,2]],[[5122,1221],[2,1],[1,-1],[1,-1]],[[5126,1220],[9,-2],[17,1],[11,1],[11,-5],[10,-3],[12,-2]],[[5196,1210],[9,-2],[10,-4]],[[5215,1204],[13,-7],[6,-7],[8,-12],[9,-18],[6,-11],[8,-4],[25,-8],[12,-2],[20,-2]],[[5322,1133],[20,5],[9,3],[12,6],[11,5],[11,0]],[[5385,1152],[11,-3],[12,-6]],[[5408,1143],[2,-3],[0,-1],[3,-5],[2,-2],[3,-3],[2,-3],[4,-4],[5,-4],[17,-10],[-4,33],[21,3],[13,1],[11,2]],[[5408,1143],[-2,37],[26,3],[-8,108]],[[5424,1291],[26,-10],[27,-9]],[[5385,1152],[-13,159]],[[5372,1311],[23,-9],[29,-11]],[[5326,1327],[22,-8],[14,-4],[1,-1],[9,-3]],[[5322,1133],[-9,92],[-20,-2],[-6,85]],[[5287,1308],[20,0],[21,-1],[-2,20]],[[5215,1204],[1,3],[0,17],[-1,6],[-2,3],[3,2],[9,15],[3,9],[-1,12],[-4,24],[22,5],[19,6],[23,2]],[[5196,1210],[-13,64],[-18,99],[23,-9],[-3,16]],[[5185,1380],[23,-9],[26,-9],[12,-5],[18,-7],[19,-7],[21,-8],[22,-8]],[[5126,1220],[-1,8],[11,2],[-29,168],[0,4]],[[5107,1402],[10,-1],[3,3],[17,-6]],[[5137,1398],[25,-10],[23,-8]],[[5318,1421],[8,-94]],[[5137,1398],[2,2],[-3,14]],[[5136,1414],[20,4]],[[5156,1418],[11,3],[11,-1],[20,1],[23,-1],[13,1],[22,0],[21,-1],[20,1],[21,0]],[[5310,1509],[8,-88]],[[5156,1418],[-20,106],[12,0],[12,-10],[21,0],[21,0],[68,-3],[21,-1],[19,-1]],[[5438,1423],[-26,-2]],[[5412,1421],[-2,1],[-24,0],[-22,-1],[-24,1],[-22,-1]],[[5310,1509],[22,-1],[22,-2],[18,-1],[19,0],[20,-1],[20,-1],[3,-24],[4,-56]],[[5512,1502],[7,-83]],[[5519,1419],[-21,-2],[-19,2],[-20,5],[-21,-1]],[[5136,1414],[-18,88],[-1,3],[-4,22],[-1,6],[-1,4],[-1,4],[-2,4]],[[5108,1545],[0,5]],[[5424,1291],[-3,29],[-9,101]],[[5519,1419],[8,-100]],[[5107,1402],[-24,112],[1,15],[-1,5],[-2,4],[-1,3],[-2,6],[30,-2]],[[5107,1402],[-14,5]],[[5093,1407],[-4,15],[-8,40]],[[5081,1462],[-11,63],[0,1],[-1,1],[-1,1],[-36,1],[14,-76]],[[5046,1453],[6,-31]],[[5052,1422],[-43,16],[-5,2],[-18,6],[-18,7],[-5,2],[-71,26]],[[2859,3223],[3,4],[16,13],[9,5],[2,2],[48,38],[16,11],[18,16]],[[6514,5465],[-59,40]],[[6491,5396],[-20,14],[-18,12],[-20,15]],[[6433,5437],[6,16],[1,4],[7,20],[7,23],[1,5]],[[6514,5465],[-2,-4],[-7,-23],[-7,-21],[-7,-21]],[[6530,5369],[-20,13],[-19,14]],[[6408,5362],[9,25]],[[6417,5387],[16,50]],[[6417,5387],[-21,14],[-21,14],[-16,12]],[[6359,5427],[12,25],[9,21]],[[6380,5473],[15,-11],[13,-9],[5,-3],[20,-13]],[[6384,5295],[-9,5],[-43,20],[-9,5]],[[6323,5325],[8,23],[8,22],[7,22]],[[6346,5392],[13,35]],[[6346,5392],[-20,10],[-18,9]],[[6308,5411],[12,43]],[[6320,5454],[20,-13],[6,11],[17,33],[17,-12]],[[6323,5325],[-36,17]],[[6287,5342],[7,24],[7,22],[3,11],[4,12]],[[6287,5342],[-5,2],[-22,12],[-6,8],[-10,10]],[[6244,5374],[9,8],[3,2],[7,5],[6,5],[6,7],[6,22],[10,29],[0,1],[1,2],[1,2],[1,3],[1,4],[2,6]],[[6297,5470],[18,-13],[5,-3]],[[6244,5374],[-4,6],[-4,1]],[[6236,5381],[13,20],[4,8],[2,13],[4,29],[-4,11],[-2,22],[-2,12],[1,2],[5,7],[5,6],[5,6],[2,8],[3,13],[0,5],[0,6],[2,20],[0,1],[-1,4],[0,7],[-6,10],[5,4],[5,4],[4,6],[3,10],[-1,3],[-3,3]],[[6289,5624],[4,-4],[7,-5],[4,-4],[4,-3],[3,-3],[3,-2],[5,-3]],[[6319,5600],[-1,-5],[-1,-5],[-1,-9],[2,-15],[0,-8],[-2,-11],[0,-6],[-2,-23],[-6,-18]],[[6308,5500],[-5,-13],[-6,-17]],[[6319,5600],[4,-3],[13,-9],[16,-11],[2,-2],[3,-1]],[[6357,5574],[-1,-4],[-4,-13],[-9,-27],[-13,-43],[-5,3],[-17,10]],[[6357,5574],[12,-10],[21,-15],[19,-12]],[[6357,5574],[10,34],[7,24],[-4,2]],[[6370,5634],[8,28]],[[6378,5662],[5,-4],[63,-43]],[[2766,3246],[18,13],[3,-4],[14,-10],[30,24],[5,-8],[6,-10],[16,9],[14,5],[6,2],[6,0],[6,0],[5,1],[4,2],[43,33],[-4,9],[-2,4],[-3,7],[-1,1],[-1,0],[-1,0],[-7,-4],[-4,-2],[-4,10],[-1,2],[-2,0],[-23,-10],[-49,-24],[-7,13],[-1,4]],[[2757,3266],[11,7],[7,5],[15,10],[13,8],[12,8],[11,5],[6,4]],[[2693,3331],[20,8],[17,8],[16,9],[13,8],[10,6],[9,7],[7,5],[6,6]],[[2666,3320],[-9,19],[-6,16],[-2,7],[-2,9],[1,10],[1,8]],[[2649,3389],[6,13],[6,8],[6,6],[5,4],[6,3],[28,9],[4,1],[10,0],[4,1],[6,3],[7,2],[6,2],[7,0],[16,0]],[[2766,3441],[0,-6],[2,-6],[8,-17]],[[2608,3491],[18,-40],[2,-7],[2,-6],[0,-8],[1,-11],[1,-4],[2,-8],[4,-7],[4,-5],[7,-6]],[[2705,3480],[9,-19],[20,2],[10,2],[4,1],[10,7],[7,3],[4,0],[2,-4],[-4,-22],[-1,-9]],[[2591,3556],[20,0],[25,0],[4,-18],[8,3],[6,4],[11,-25],[8,-17],[8,-18],[7,-16],[17,11]],[[2705,3480],[-7,15],[-15,34],[-1,4],[0,5],[0,5],[1,5],[3,10],[1,3],[2,2],[3,1],[5,0],[19,0],[2,7],[2,6],[3,4],[4,4],[7,4]],[[2734,3589],[5,-11],[27,-59],[17,11]],[[2709,3645],[15,-33],[10,-23]],[[2633,3686],[0,-4],[0,-3],[2,-6],[2,-4],[5,-2],[4,-1],[4,0],[19,2],[5,0],[4,0],[2,0],[2,0],[2,-1],[4,-1],[7,-4],[6,-5],[4,-6],[4,-6]],[[2709,3645],[17,11],[9,-20],[15,7],[15,6],[14,3],[13,2],[16,1]],[[2808,3655],[17,-35],[9,-21],[16,9],[3,1],[21,-46]],[[2792,3704],[-5,-26],[9,1],[6,0],[7,-1]],[[2809,3678],[-2,-12],[-1,-5],[2,-6]],[[2809,3678],[20,-3],[-1,-13],[9,-19],[6,5],[2,1],[38,-7],[2,-2],[1,-2],[-3,-19],[0,-8],[0,-5],[1,-6],[3,-5],[3,-5],[5,-3],[6,-3],[6,-1],[7,1],[5,1],[19,12],[3,2],[3,5],[1,5],[0,3],[-8,18],[-2,2],[-2,1],[-24,4],[-2,1],[-2,3],[3,20],[43,-7]],[[6797,6703],[-2,3],[-5,7],[-5,8],[-35,55]],[[6750,6776],[2,15],[1,11],[0,3],[2,33],[0,6],[2,7],[5,16],[55,-88],[2,-3]],[[6819,6776],[11,-17]],[[6830,6759],[-17,-14],[-6,-5],[-4,-16],[-6,-21]],[[6841,6621],[-2,4],[-12,20],[-7,10],[-25,40]],[[6795,6695],[2,8]],[[6830,6759],[39,-63],[26,-40],[2,-4]],[[6791,6593],[-2,4],[-18,29],[4,13],[4,11],[8,22],[2,6],[6,17]],[[6841,6621],[-16,-9],[-16,-9],[-18,-10]],[[6710,6627],[2,3],[2,5],[4,13],[2,6],[1,5],[2,7],[3,9],[6,12],[1,4]],[[6791,6593],[-10,-6],[-7,-4],[-1,-1],[-8,-7],[-6,-5]],[[6859,6594],[-14,-12],[-15,-13],[-13,-12],[-1,-2],[1,-2],[15,-22],[20,-31]],[[5727,3208],[-18,18],[-16,18],[-13,-17],[-2,-2],[-20,20],[-14,16]],[[3136,3279],[9,-25],[4,-14],[2,-11],[4,-23],[6,-11],[-17,-13],[10,-17],[-41,-33],[0,-3],[9,-15],[12,-19]],[[3134,3095],[-7,-6],[-19,-8]],[[3267,3231],[-3,-2],[-32,-25],[-10,-9],[-5,-6],[-6,-9]],[[3211,3180],[-18,-29],[-5,-7],[-10,-12],[-9,-9],[-35,-28]],[[3346,3097],[-3,-2],[-23,-19]],[[3320,3076],[-12,21],[-17,28],[-10,18],[-44,-34],[-30,24]],[[3207,3133],[20,33],[-16,14]],[[3320,3076],[-37,-30],[-26,-20],[-4,-2],[-9,0]],[[3244,3024],[-4,1],[-23,2]],[[3217,3027],[1,13],[-10,18],[15,12],[15,12],[-17,14],[-23,18],[-1,3],[10,16]],[[3305,2980],[-6,3],[-5,0],[-5,-1],[-18,-14],[-8,-6],[-76,-61],[-12,21]],[[3175,2922],[-10,17],[56,46],[1,18],[19,-2],[3,23]],[[3385,3031],[-4,-2],[-26,-12],[-5,0],[-34,-27],[-11,-10]],[[3143,2978],[38,30],[21,18],[5,1],[10,0]],[[3175,2922],[-15,-13],[-40,-33],[-2,1],[-31,53],[-7,-3],[-9,-6],[-2,-2]],[[3305,2980],[42,-70],[29,-52],[8,-15],[7,-19],[2,-11],[1,-11],[-3,-44],[1,-11],[2,-8],[4,-11],[4,-9],[2,-3]],[[3385,3031],[19,-32],[15,-23],[10,-13],[21,-20],[18,-21]],[[3468,2922],[29,-47],[30,-51],[3,-4]],[[3487,3068],[-4,-9],[-1,-9],[-1,-8],[2,-9],[2,-9],[12,-30],[8,-22],[9,-23]],[[3514,2949],[-6,-1],[-9,-4],[-12,-7],[-19,-15]],[[3514,2949],[10,1],[7,-1],[6,2],[7,3],[19,16],[20,15],[7,8],[15,21]],[[3605,3014],[21,-35],[4,-6]],[[3630,2973],[2,-3],[4,-9]],[[3636,2961],[-2,-7],[-2,-6],[-2,-4],[-6,-4],[-8,-6],[-21,-17],[-16,-13],[-22,-16],[-5,-5]],[[3653,3081],[-7,-7],[-5,-7]],[[3641,3067],[-15,-22],[-21,-31]],[[3641,3067],[22,-21],[5,-6],[0,-3],[2,-1],[2,0],[5,-16],[-19,-20],[-18,-18],[-10,-9]],[[3654,2974],[-8,-7],[-10,-6]],[[7252,7640],[11,-18],[2,-1],[1,0],[6,5],[2,1],[2,-1],[36,-56],[2,-3]],[[7336,7636],[-6,-9],[-7,-6],[-12,-11],[15,-24],[2,-3],[-14,-16]],[[7350,7614],[-13,-15],[2,-3],[16,-26]],[[7382,7644],[12,-19],[10,-15],[3,-5],[4,-8],[6,5],[7,-4],[2,-1],[1,-2],[19,-29],[12,-19]],[[7413,7680],[11,-17],[65,-97]],[[7452,7720],[15,-18],[11,-18],[34,-51],[15,-23]],[[7488,7751],[2,-3],[17,-26],[53,-84]],[[3946,3282],[-1,-13],[-1,-6],[0,-3],[-1,-1]],[[3943,3259],[-2,-4],[-6,-6],[-19,-14],[-1,-1]],[[4021,3259],[-17,-18],[-3,-1],[-2,-2],[-4,2],[-10,15],[1,1],[1,2],[0,3],[-1,1],[-3,1],[-4,-1],[-1,2],[-13,12],[-2,2],[-3,1],[-3,2],[-4,0],[-7,1]],[[4067,3169],[-94,77],[-30,13]],[[4166,3063],[-35,-28],[-6,-5],[-3,-2],[-120,-88],[-1,-3]],[[3907,1823],[-3,14],[-13,51],[-5,6],[-2,33],[-3,8],[0,7],[-2,13],[-3,11],[-2,5],[0,6],[-6,13],[2,4],[-11,48],[-2,3],[-7,13],[-17,29]],[[3864,1825],[1,18],[0,24],[0,24],[-20,1],[-5,0],[-21,-7]],[[3819,1885],[-3,12],[-11,15],[-1,3],[-11,49],[-19,-6],[-20,-7],[-4,19],[16,15],[1,2],[-1,3],[-6,17],[-2,1],[-2,1],[-18,-14],[-8,-7],[-7,-5],[-21,-17],[-3,-28],[-10,2],[-8,-3]],[[3819,1885],[-19,-6],[-10,-3],[-9,-2],[-6,-2],[1,-12],[0,-9],[4,-14],[-46,-15],[-3,1],[-1,2],[-5,22],[-11,-3],[-5,-3],[-5,-5]],[[7893,7399],[48,53]],[[7941,7452],[37,43],[3,4],[51,58],[19,20],[19,21],[54,59],[33,35],[13,15]],[[7878,7584],[-12,-15],[15,-23],[3,-6],[5,-8],[8,-12],[17,-26],[24,-38],[3,-4]],[[7765,7647],[2,-3],[12,-20],[20,24],[10,-16],[2,-1],[2,1],[19,24],[12,-18],[18,-29],[16,-25]],[[7967,7659],[-44,-55],[-2,0],[-1,1],[-11,16],[-31,-37]],[[7805,7698],[2,-3],[13,-20],[12,15],[42,-66],[13,17]],[[7887,7641],[15,18],[15,19]],[[7917,7678],[16,-26],[21,26],[13,-19]],[[7861,7768],[2,-3],[12,-20],[13,-20]],[[7888,7725],[-16,-20],[-14,-18],[29,-46]],[[7888,7725],[13,16],[29,-46]],[[7930,7695],[-13,-17]],[[7958,7730],[-14,-18],[-14,-17]],[[7917,7839],[2,-3],[13,-20]],[[7932,7816],[-16,-20],[42,-66]],[[7958,7730],[16,19]],[[7974,7749],[16,-26],[11,-16],[0,-4],[-34,-44]],[[7989,7819],[-33,-42],[18,-28]],[[7932,7816],[12,-19],[32,40],[1,2],[-1,2],[-11,17],[14,16]],[[6340,5706],[-4,-13],[15,-9],[9,-8],[-9,-28],[2,-2],[17,-12]],[[6395,5712],[-3,-7],[-2,-5],[-4,-12],[-8,-26]],[[6403,5730],[5,-3],[8,-5],[2,-2],[45,-31]],[[6463,5689],[5,-2],[2,-1],[-1,-3],[-3,-20],[-2,-12]],[[6431,5791],[4,-4],[2,-2],[7,-5],[49,-34]],[[6493,5746],[-10,-20],[-3,-5],[-7,-14],[-2,-4],[-8,-14]],[[6493,5746],[8,-6],[42,-28],[8,-6]],[[6493,5746],[10,20],[11,23],[12,22]],[[6526,5811],[51,-36],[7,-5]],[[6450,5833],[5,9],[6,13]],[[6461,5855],[4,-3],[61,-41]],[[6461,5855],[9,20],[6,15]],[[2038,2561],[8,17],[8,12],[7,6],[9,12],[8,6],[5,2],[12,15],[4,1],[7,-7],[6,0],[1,4],[-3,8],[-1,23],[1,10],[3,14],[2,7],[8,9],[10,13],[2,2],[-2,8],[-5,6],[0,2],[-2,14],[1,7],[10,14],[5,-3],[1,-4],[1,-2],[-5,-17],[-3,-2],[-1,-4],[1,-4],[3,2],[9,9],[1,5],[1,5],[-2,8],[-2,4],[0,1],[-1,10],[7,12],[4,5],[6,4],[5,7],[5,3],[3,2],[3,1],[3,2]],[[2181,2810],[2,-3],[30,-39],[3,-1],[9,-12],[4,-6]],[[2181,2810],[3,3],[1,5],[7,5],[3,2],[3,6],[3,2],[5,3],[2,1],[3,-1],[9,-7],[10,-4],[5,0],[7,2],[14,13],[4,0],[4,0],[4,2],[6,0],[4,4],[5,7],[1,2],[19,11],[3,1],[9,0],[4,2],[3,2],[7,8]],[[2329,2879],[0,-1],[6,-13],[9,-23],[9,-15],[-7,-10]],[[2329,2879],[1,1],[9,2],[13,10],[9,11],[1,2],[3,5],[4,5],[0,4],[1,2],[3,0],[1,2],[9,27],[14,19],[8,14],[4,6],[3,7],[4,5],[4,9],[7,12],[5,9],[5,12],[1,5],[3,14],[5,9],[3,7]],[[7187,7094],[-15,-13]],[[7172,7081],[-47,74]],[[7125,7155],[15,13]],[[7109,7141],[16,14]],[[7172,7081],[-16,-14]],[[7156,7067],[-47,74]],[[7094,7129],[15,12]],[[7156,7067],[-14,-12]],[[7142,7055],[-48,74]],[[7094,7129],[-11,18]],[[7083,7147],[51,43],[32,28],[3,3]],[[7083,7147],[-11,17]],[[7072,7164],[16,15],[14,11]],[[7102,7190],[15,13]],[[7117,7203],[16,14]],[[7133,7217],[22,19],[2,2]],[[7133,7217],[-40,62]],[[7117,7203],[-39,60]],[[7102,7190],[-37,58]],[[7072,7164],[-33,51]],[[7083,7147],[-13,-11]],[[7070,7136],[-40,64],[-13,-20],[-12,19]],[[7005,7199],[23,34]],[[7070,7136],[-16,-13],[-15,-13],[-45,70]],[[6994,7180],[11,19]],[[6994,7180],[-11,-19]],[[7076,6999],[-47,75],[-14,-13],[-12,19]],[[7003,7080],[20,17],[-11,19],[-12,17],[-17,28]],[[7003,7080],[-29,-26],[-14,-13]],[[7018,6949],[-12,19]],[[7006,6968],[-24,37],[-22,36]],[[7006,6968],[-3,-2],[-16,-14],[-11,18],[-36,-31],[-11,17],[-19,9],[-7,-21]],[[6903,6944],[-19,8]],[[7030,6929],[-2,-2],[-15,-13],[-38,-32]],[[6975,6882],[-15,-13],[7,-12],[11,-18]],[[6978,6839],[-2,-2],[-19,-17],[-20,5],[-3,3],[-46,73],[8,24],[1,2],[2,2],[9,9],[3,2],[-2,1],[-6,3]],[[4974,3642],[-2,37],[-11,0],[-5,0],[-5,1],[-5,3],[-6,6],[-5,13],[-4,8],[-4,8],[1,4],[16,10],[12,-30],[2,-2],[18,2],[9,1],[5,1],[6,2],[6,4],[7,8],[41,54],[2,3]],[[5052,3775],[29,-29],[12,-13],[25,-27]],[[4946,3777],[62,39],[-11,11],[3,3]],[[5000,3830],[12,-13],[11,-11],[29,-31]],[[4954,3878],[14,-14],[13,-14],[2,-3]],[[4983,3847],[17,-17]],[[4851,3985],[7,-8],[-2,-2],[-22,-27],[-12,-14],[-1,-1],[1,-2],[27,-28],[15,-16],[22,29],[12,15],[2,3],[11,-12],[20,-20],[2,-2],[21,-22]],[[5034,3892],[-4,-2],[-5,-3],[-9,-5],[-7,-6],[-6,-4],[-3,-4],[-5,-5],[-12,-16]],[[4954,3878],[12,16],[-14,15],[-14,13],[-1,2],[1,1],[3,5],[11,13],[1,3],[0,2],[-40,41],[-23,25],[-8,7]],[[4882,4021],[7,9],[75,-80],[9,14],[34,52],[12,16]],[[5019,4032],[7,-9]],[[5026,4023],[-26,-35]],[[5000,3988],[-12,-17],[39,-41],[-13,-16],[7,-8],[11,-11],[2,-3]],[[4851,3985],[18,21],[13,15]],[[4955,4047],[-26,-42],[-38,39],[-15,-17],[6,-6]],[[4915,4124],[11,-13],[1,-6],[11,-11]],[[4938,4094],[-15,-14],[15,-15],[17,-18]],[[5012,4039],[7,-7]],[[4955,4047],[11,14],[5,-7],[7,-9],[22,-23],[12,17]],[[5030,4106],[-22,-14],[-21,-26],[25,-27]],[[4938,4094],[26,23],[9,10],[2,2],[2,0],[1,0],[1,0],[6,-5],[15,13],[14,-14],[16,-17]],[[5069,4101],[-50,-69]],[[5030,4106],[17,-16],[14,19],[8,-8]],[[5082,4120],[-13,-19]],[[5042,4212],[6,-12],[48,-51],[-18,-24],[4,-5]],[[8356,8290],[-53,86],[-2,-2]],[[8292,8241],[-1,3],[-50,78]],[[8217,8176],[13,12],[-2,2],[-5,10],[-43,68]],[[8350,8150],[-12,-11],[-17,-15],[-5,-4],[-28,-24],[-13,-11],[-45,71],[-13,20]],[[8217,8176],[-36,-31],[-2,-1],[-2,3],[-13,19],[-40,-35],[-23,36]],[[8101,8167],[15,13],[23,20],[2,1],[-13,22]],[[8101,8167],[-16,-14],[-16,-15],[-27,-22],[-13,-12],[-14,-12],[-2,-3]],[[7944,8196],[4,5],[15,20],[16,23],[21,-20],[-12,-17],[-1,-4],[1,-3],[10,-15],[15,13],[2,1],[2,-1],[4,-6],[41,35]],[[8220,7760],[-3,4],[-17,27],[-28,42],[-4,7],[-23,35],[-26,41],[-8,13],[-9,14],[-2,3]],[[5081,1462],[-35,-9]],[[5093,1407],[-7,3],[-34,12]],[[5148,4153],[-16,11],[-22,14],[-28,25]],[[5139,4189],[17,-17],[-8,-19]],[[5263,4080],[-30,-44],[-37,38],[-14,15],[-18,-11]],[[5164,4078],[-7,-10],[-63,62],[-12,-10]],[[5148,4153],[40,-24],[29,-19],[12,-7]],[[5352,4128],[-13,-17],[-12,-16]],[[5359,4062],[-32,33]],[[5352,4128],[52,-56]],[[5359,4062],[-3,-4],[-12,-11],[-3,-1],[-2,1],[-27,28]],[[5341,4014],[-42,44]],[[5156,3767],[-20,20],[-37,40],[-7,-1],[-11,-14],[-15,-19],[-14,-18]],[[5034,3892],[9,1],[12,0],[10,1],[6,2],[7,2],[7,4],[26,16]],[[5111,3918],[55,33],[4,1]],[[5170,3952],[9,4],[3,1],[3,2],[9,5]],[[5194,3964],[25,15],[2,1],[16,22],[2,3],[7,14],[3,6],[32,44]],[[5000,3988],[15,-14],[26,-27],[5,-5],[5,-2],[5,0],[6,1],[4,3],[3,3],[4,3],[10,12]],[[5083,3962],[8,-8],[6,-7],[5,-7],[7,-18],[2,-4]],[[5026,4023],[8,-10],[20,-20]],[[5054,3993],[14,-15],[15,-16]],[[5054,3993],[12,17],[24,34],[3,1],[2,-1],[11,-12]],[[5106,4032],[-26,-37],[25,-25],[1,-1],[1,0],[3,1],[17,10],[5,4],[3,2],[3,4],[2,1],[2,-3],[1,-1],[10,-11],[12,-12],[4,-8],[1,-4]],[[5069,4101],[6,-7],[15,-15],[28,-30],[-12,-17]],[[5164,4078],[8,-9],[-17,-22],[5,-7],[25,-26],[4,-3],[3,-3],[-6,-8],[-11,-13],[-1,-2],[0,-1],[1,-1],[1,-1],[7,-6],[8,-9],[3,-3]],[[5409,4205],[46,-49],[-22,-31],[14,-15]],[[9268,8006],[-23,6]],[[9245,8012],[5,22],[3,16],[5,22],[3,17],[3,13],[4,15]],[[9268,8117],[21,-5]],[[9289,8112],[41,-11],[42,-11]],[[9233,7952],[6,26],[6,31],[0,3]],[[9308,8311],[-1,-4],[-11,-55],[-4,-18],[-5,-23],[-5,-23],[-3,-18],[-11,-53]],[[8952,8419],[33,26],[26,21],[33,26],[20,15],[-1,1],[0,2],[0,2],[5,4],[24,22],[21,17],[16,13],[22,18]],[[9358,8298],[-1,-4],[-6,-31],[-5,-26],[-1,-3]],[[9345,8234],[-3,-19]],[[9342,8215],[-5,-6],[-9,-6],[-5,-4],[-10,-6],[-4,-3],[-4,-4],[-2,-5],[-2,-7],[-4,-21],[-4,-21],[-4,-20]],[[9342,8215],[56,-15],[2,0]],[[9345,8234],[39,-10],[3,14],[3,3],[2,11],[36,-9],[19,-5]],[[9358,8298],[117,-29]],[[9363,8328],[45,-11],[23,-7],[15,-4],[11,-3],[4,1],[8,4]],[[5950,4855],[-23,-11]],[[5927,4844],[-20,-12],[-21,-13]],[[5886,4819],[-13,-3],[-16,1],[-7,1],[-12,1],[-19,-3],[-5,-2],[-9,-2],[-5,-1],[-2,-1],[-25,-7],[-32,-4]],[[5736,4825],[6,1],[6,0],[5,3],[18,30],[8,9],[3,1],[4,3],[19,7],[7,1],[10,-2],[7,-4],[6,-3],[7,-6],[3,-1],[6,-2],[5,2],[3,1],[5,2],[3,1],[48,13],[6,2],[4,-1],[2,-1],[-2,-12],[11,-9],[5,-1],[0,4],[0,2],[0,8],[-1,6],[-1,3],[0,21],[7,12],[6,6],[7,9],[1,4],[8,14],[5,6],[11,20]],[[5998,4967],[13,-7],[25,-12]],[[6036,4948],[-11,-14],[-9,-11]],[[6016,4923],[-14,-17],[-7,-8],[-10,-9]],[[5985,4889],[-16,-17],[-8,-9],[-11,-8]],[[5875,4608],[6,4],[4,12],[6,20],[-84,49],[-113,59],[-27,-12]],[[5886,4819],[4,-3],[27,-14],[-8,-19],[62,-31]],[[5971,4752],[61,-31],[3,-2]],[[5927,4844],[5,-4],[61,-31],[-7,-19],[-7,-19],[-8,-19]],[[5950,4855],[111,-57],[4,-1]],[[5985,4889],[83,-42],[9,-5],[4,-2]],[[6016,4923],[62,-32],[14,-7],[4,-2]],[[6036,4948],[53,-27],[14,-7],[4,-2]],[[6036,5032],[21,-10],[-5,-16],[11,-6],[60,-30],[4,-1]],[[6054,5070],[23,-11],[3,-3],[61,-31],[3,-1]],[[8833,8678],[16,16],[-21,48],[-20,-12],[-8,19],[-37,80],[20,12],[-15,33],[-23,53],[-2,5],[-20,-13],[-23,-15]],[[8700,8904],[-7,14],[-3,5],[-9,22],[-8,-5],[-11,-5],[-7,-3],[-13,-7],[-42,-17],[-13,-4],[-25,-4],[-11,-1],[-5,0],[-3,0],[-6,1],[-12,2],[-8,0],[-6,-2]],[[8511,8900],[-4,-2],[-7,-3],[-3,-2],[-5,-4],[-8,-6],[-3,-3],[-5,-4],[-6,-7],[-12,-20],[17,-41],[-32,-18],[-1,-1],[0,-2],[7,-17],[4,-10],[12,-11],[3,-3]],[[8305,8694],[13,17],[9,6],[7,6],[1,2],[4,5],[6,5],[8,1],[6,6],[10,9],[8,9],[11,7],[18,16],[7,9],[6,11],[13,20],[7,7],[4,4],[4,3],[6,13],[9,12],[7,15],[22,19],[20,9],[21,1],[17,-1],[20,1],[12,2],[15,6],[13,7],[9,3],[3,3],[0,7],[1,1],[3,-2],[3,0],[7,6],[13,13],[10,8],[9,12],[9,8],[24,23],[6,9],[9,7],[10,10],[13,11],[24,24],[24,22],[9,10],[11,29],[5,9],[6,13],[4,13],[12,27],[4,13],[3,13],[12,20],[10,22],[9,14],[12,17],[9,10],[6,9],[20,28],[10,9],[6,7],[2,5],[8,6],[6,7],[4,8],[3,11],[12,23],[6,16],[0,7],[2,19],[4,8],[9,17],[24,48],[8,14],[9,10],[2,7],[8,14],[4,15],[4,9],[2,6],[9,13],[4,8],[4,13],[1,13],[4,13],[10,21],[6,6],[12,17],[2,0],[13,23],[12,4],[6,7],[12,10],[8,4],[6,4],[7,8],[1,1],[18,9],[8,2],[7,3],[7,5],[20,8],[5,0],[12,8],[14,10],[10,6],[16,4],[10,4],[11,4],[14,8],[16,10],[4,4],[2,0]],[[8795,8640],[-8,18],[-64,142],[-2,4],[-22,50],[0,4],[2,4],[14,8],[-14,31],[-1,2],[0,1]],[[8686,8525],[-2,4],[-2,2],[-3,6],[-3,5],[-2,2],[-11,23],[-20,47],[-13,31],[-16,35],[-30,69],[-33,78]],[[8551,8827],[-1,4],[-7,15],[-5,8],[-9,13],[-6,8],[-4,7],[-8,18]],[[8555,8562],[17,19],[14,17],[-9,11],[-4,9],[-22,51],[-2,2],[-17,-10],[-9,21],[-18,-10]],[[8468,8746],[6,8],[7,9],[9,9],[10,11],[11,10],[19,17],[18,15],[3,2]],[[7052,6851],[-5,9],[-12,18],[-37,-32],[-11,18],[-12,18]],[[7054,6811],[-37,-33],[-12,18],[-15,24],[-12,19]],[[6990,6704],[-3,4],[-44,68],[-7,12]],[[6936,6788],[-9,15],[-30,47]],[[6897,6850],[-31,49]],[[6830,6759],[10,8],[25,-40],[14,13],[14,12],[14,12],[14,12],[15,12]],[[6819,6776],[10,27]],[[6829,6803],[5,-7],[6,5],[13,11],[15,13],[14,12],[15,13]],[[6829,6803],[-2,3],[-9,13],[-7,11],[-16,26],[18,17],[16,14]],[[6829,6887],[18,-29],[2,-3],[8,21],[2,6],[7,17]],[[6829,6887],[-44,68],[1,5],[5,21]],[[6715,6834],[2,7],[8,19],[7,14],[5,12],[5,5],[35,82],[4,17]],[[7568,4477],[7,11],[5,9]],[[7580,4497],[9,-7],[45,-34],[13,-10]],[[7580,4497],[14,23]],[[7580,4497],[-11,8],[-42,33],[-9,9]],[[7568,4477],[-63,47]],[[7555,4451],[-19,14],[-37,27],[-8,6]],[[7523,4395],[-62,47]],[[7498,4350],[-62,46]],[[7485,4324],[-63,47]],[[5016,1281],[-46,1],[-3,21],[0,14],[1,6],[-4,20],[-18,-3],[-3,0],[-2,1],[-2,3],[-4,22],[-23,-5]],[[5016,1227],[-10,3],[-8,7],[-3,5],[-2,12],[1,19],[-3,-4],[-3,-9],[-1,-8],[2,-7],[2,-6],[4,-8],[6,-4],[9,-3],[6,-2]],[[5626,4344],[-6,6],[-47,50],[13,16],[12,17]],[[5608,4321],[-1,0],[-14,15],[-40,42],[-7,7]],[[5546,4385],[-26,27],[-19,20],[-3,3],[-3,3],[-4,4],[-2,2],[-1,1]],[[5524,4487],[5,5],[0,2],[17,20]],[[5546,4514],[31,-30],[33,-36]],[[5639,4489],[-17,-24],[-12,-17]],[[5546,4514],[19,22],[3,3]],[[5568,4539],[14,-12],[3,-3],[3,-2],[4,-1],[5,0],[5,1],[21,-19],[16,-14]],[[5568,4539],[21,26],[13,20],[6,9],[2,3]],[[5610,4597],[73,-44]],[[5683,4553],[-3,-4],[-2,-4],[-14,-19],[-14,-19],[-11,-18]],[[5568,4539],[-19,19],[-14,13],[-15,14]],[[5630,4642],[74,-41],[-11,-25],[-10,-23]],[[5748,4503],[-22,16],[-43,34]],[[5638,4663],[4,-2],[7,16],[20,-12],[26,-13],[2,-1],[13,-4],[79,-41]],[[5742,4702],[54,-28],[-9,-24],[30,-15],[29,-7],[0,-1],[-3,-11]],[[5546,4385],[-3,-5],[-5,-5],[-9,-12],[0,-3],[-2,-3],[-5,-6],[-4,-2],[-5,-7],[-14,-19],[-13,-17]],[[5534,4223],[-62,65]],[[5608,4321],[-3,-5],[-12,-16],[-2,0],[0,-1],[0,-1],[-8,-11],[-9,-11],[-13,-17],[-13,-18],[-14,-18]],[[5494,4172],[-61,65]],[[5534,4223],[-13,-16],[-13,-18]],[[6183,5178],[9,23],[10,22],[11,-6],[39,-19],[22,-10]],[[6160,5189],[10,23],[10,22],[7,22]],[[6187,5256],[19,-9],[5,-2],[9,-5],[32,-16],[30,-14]],[[6187,5256],[17,49]],[[6204,5305],[20,-10],[3,-2],[3,-4],[2,-2],[6,-3],[14,-7],[46,-22]],[[6298,5255],[-4,-12],[-4,-11],[-4,-11],[-4,-11]],[[6323,5325],[-9,-24],[-10,4],[-28,14]],[[6276,5319],[-5,3],[-31,14],[-24,2],[-6,-16],[-6,-17]],[[6079,5226],[9,15],[21,27],[12,18],[27,28],[13,16],[20,23],[3,2],[3,2],[15,0],[9,1],[6,3],[18,19],[1,1]],[[6276,5319],[-23,-15],[3,-2],[50,-25]],[[6306,5277],[-4,-11],[-4,-11]],[[6367,5247],[-44,21],[-17,9]]],"box":[-73.97639960366291,45.40212922961762,-73.47606597759493,45.70374747616739],"transform":{"scale":[0.000050038366443442794,0.000030164841139091116],"translate":[-73.97639960366291,45.40212922961762]}} diff --git a/test/memoryLimitCases/json/src/6.json b/test/memoryLimitCases/json/src/6.json new file mode 100644 index 00000000000..33726beae05 --- /dev/null +++ b/test/memoryLimitCases/json/src/6.json @@ -0,0 +1 @@ +{"type":"Topology","objects":{"da_polygons":{"type":"GeometryCollection","geometries":[{"type":"Polygon","arcs":[[0,1,2,3]],"properties":{"id":"24661006","dp":8931,"de":1335}},{"type":"Polygon","arcs":[[4,5,-3,6]],"properties":{"id":"24661007","dp":10647,"de":1878}},{"type":"Polygon","arcs":[[7,-5,8,9]],"properties":{"id":"24661008","dp":16943,"de":0}},{"type":"Polygon","arcs":[[10,11,12,13,-10,14]],"properties":{"id":"24661009","dp":12530,"de":0}},{"type":"Polygon","arcs":[[15,-12,16,17]],"properties":{"id":"24661010","dp":9438,"de":702}},{"type":"Polygon","arcs":[[-16,18,19,20,21]],"properties":{"id":"24661011","dp":8010,"de":0}},{"type":"Polygon","arcs":[[-13,-22,22,23,24]],"properties":{"id":"24661012","dp":11850,"de":2286}},{"type":"Polygon","arcs":[[-14,-25,25,26,27,-8]],"properties":{"id":"24661013","dp":14048,"de":0}},{"type":"Polygon","arcs":[[-28,28,29,30,-6]],"properties":{"id":"24661014","dp":13125,"de":937}},{"type":"Polygon","arcs":[[-4,-31,31,32]],"properties":{"id":"24661015","dp":9751,"de":0}},{"type":"Polygon","arcs":[[-33,33,34,35,36]],"properties":{"id":"24661016","dp":11366,"de":3096}},{"type":"Polygon","arcs":[[37,38,39,40,41,-36,42]],"properties":{"id":"24661017","dp":12016,"de":2796}},{"type":"Polygon","arcs":[[43,44,-39,45,46]],"properties":{"id":"24661018","dp":11687,"de":0}},{"type":"Polygon","arcs":[[-46,-38,47,48,49]],"properties":{"id":"24661019","dp":12350,"de":0}},{"type":"Polygon","arcs":[[50,-47,-50,51,52]],"properties":{"id":"24661020","dp":9967,"de":0}},{"type":"Polygon","arcs":[[-52,-49,53,54,55,56]],"properties":{"id":"24661021","dp":7994,"de":1432}},{"type":"Polygon","arcs":[[-56,57,58,59,60,61]],"properties":{"id":"24661022","dp":5211,"de":1785}},{"type":"Polygon","arcs":[[62,63,-57,-62,64]],"properties":{"id":"24661023","dp":6243,"de":582}},{"type":"Polygon","arcs":[[-65,-61,65,66,67,68]],"properties":{"id":"24661024","dp":5485,"de":0}},{"type":"Polygon","arcs":[[69,70,71,-66]],"properties":{"id":"24661025","dp":7364,"de":0}},{"type":"Polygon","arcs":[[-70,-60,72,73,74]],"properties":{"id":"24661026","dp":10337,"de":1466}},{"type":"Polygon","arcs":[[75,76,77,78,-71,-75]],"properties":{"id":"24661027","dp":12164,"de":1903}},{"type":"Polygon","arcs":[[79,80,-76,-74,81]],"properties":{"id":"24661028","dp":11862,"de":0}},{"type":"Polygon","arcs":[[82,83,-77,-81,84]],"properties":{"id":"24661029","dp":13911,"de":0}},{"type":"Polygon","arcs":[[85,86,87,-85,-80,88]],"properties":{"id":"24661030","dp":19910,"de":0}},{"type":"Polygon","arcs":[[-87,89,90]],"properties":{"id":"24661031","dp":19144,"de":0}},{"type":"Polygon","arcs":[[-83,-88,-91,91,92,93,94,95]],"properties":{"id":"24661032","dp":7816,"de":7672}},{"type":"Polygon","arcs":[[96,-92,-90,-86,97]],"properties":{"id":"24661033","dp":15840,"de":0}},{"type":"Polygon","arcs":[[98,-98,99,100]],"properties":{"id":"24661034","dp":14082,"de":0}},{"type":"Polygon","arcs":[[101,-93,-97,-99,102]],"properties":{"id":"24661035","dp":13138,"de":1666}},{"type":"Polygon","arcs":[[103,104,105,106]],"properties":{"id":"24660626","dp":11270,"de":0}},{"type":"Polygon","arcs":[[107,108,-104,109]],"properties":{"id":"24660627","dp":9435,"de":0}},{"type":"Polygon","arcs":[[110,-110,-107,111,112,113,114,115]],"properties":{"id":"24660628","dp":3679,"de":3326}},{"type":"Polygon","arcs":[[116,117,118,-111]],"properties":{"id":"24660629","dp":48819,"de":4658}},{"type":"Polygon","arcs":[[119,120,121,-118,122]],"properties":{"id":"24660630","dp":4054,"de":851}},{"type":"Polygon","arcs":[[123,124,125,-123,126,127]],"properties":{"id":"24660631","dp":6140,"de":1321}},{"type":"Polygon","arcs":[[128,129,-120,-126,130]],"properties":{"id":"24660632","dp":4964,"de":0}},{"type":"Polygon","arcs":[[131,-131,-125,132,133,134]],"properties":{"id":"24660633","dp":4795,"de":6787}},{"type":"Polygon","arcs":[[135,136,137,-132,138,139]],"properties":{"id":"24660634","dp":4116,"de":1223}},{"type":"Polygon","arcs":[[140,141,142,143,-136]],"properties":{"id":"24660635","dp":8631,"de":1131}},{"type":"Polygon","arcs":[[144,145,-141,146]],"properties":{"id":"24660636","dp":9930,"de":2797}},{"type":"Polygon","arcs":[[-147,-140,147,148]],"properties":{"id":"24660637","dp":12431,"de":0}},{"type":"Polygon","arcs":[[-148,-139,-135,149,150]],"properties":{"id":"24660638","dp":8941,"de":1274}},{"type":"Polygon","arcs":[[-150,-134,151,152]],"properties":{"id":"24660639","dp":10337,"de":1054}},{"type":"Polygon","arcs":[[153,-153,154,155]],"properties":{"id":"24660640","dp":7798,"de":3731}},{"type":"Polygon","arcs":[[-155,156,157,158]],"properties":{"id":"24660641","dp":11155,"de":3361}},{"type":"Polygon","arcs":[[-158,159,160,161,162]],"properties":{"id":"24660642","dp":10407,"de":4184}},{"type":"Polygon","arcs":[[-162,163,164,165,166]],"properties":{"id":"24660643","dp":12951,"de":8280}},{"type":"Polygon","arcs":[[167,168,-166,169,170]],"properties":{"id":"24660644","dp":9054,"de":2215}},{"type":"Polygon","arcs":[[-165,171,172,173,174,175,-170]],"properties":{"id":"24660645","dp":11651,"de":2816}},{"type":"Polygon","arcs":[[176,-171,-176,177,178,179,180,181,182]],"properties":{"id":"24660646","dp":6723,"de":3837}},{"type":"Polygon","arcs":[[183,184,185,186,-181,187,188]],"properties":{"id":"24660649","dp":9487,"de":1370}},{"type":"Polygon","arcs":[[-189,189,-179,190,191,192]],"properties":{"id":"24660650","dp":4420,"de":2155}},{"type":"Polygon","arcs":[[-192,193,194,195,196,197]],"properties":{"id":"24660652","dp":9408,"de":869}},{"type":"Polygon","arcs":[[198,199,-195,200]],"properties":{"id":"24660654","dp":3356,"de":0}},{"type":"Polygon","arcs":[[201,202,203,204,205,-199]],"properties":{"id":"24660655","dp":6279,"de":3761}},{"type":"Polygon","arcs":[[206,207,-196,-200,-206]],"properties":{"id":"24660656","dp":16096,"de":1470}},{"type":"Polygon","arcs":[[-205,208,209,210,211,-207]],"properties":{"id":"24660657","dp":14502,"de":974}},{"type":"Polygon","arcs":[[212,213,214,215,216]],"properties":{"id":"24661144","dp":17838,"de":1781}},{"type":"Polygon","arcs":[[-216,217,218]],"properties":{"id":"24661145","dp":14407,"de":0}},{"type":"Polygon","arcs":[[219,-219,220,221,222,223]],"properties":{"id":"24661146","dp":10811,"de":7711}},{"type":"Polygon","arcs":[[224,225,226,227]],"properties":{"id":"24663242","dp":135547,"de":31021}},{"type":"Polygon","arcs":[[-226,228,229,230]],"properties":{"id":"24663243","dp":74527,"de":15540}},{"type":"Polygon","arcs":[[231,-201,-194,-191]],"properties":{"id":"24663244","dp":15460,"de":1381}},{"type":"Polygon","arcs":[[232,233,234,235,236]],"properties":{"id":"24663245","dp":28870,"de":2258}},{"type":"Polygon","arcs":[[237,238,239,240,241,242,243]],"properties":{"id":"24663215","dp":11166,"de":5263}},{"type":"Polygon","arcs":[[244,245,246,247,248,249,250,251,252,253,254]],"properties":{"id":"24663216","dp":1357,"de":364}},{"type":"Polygon","arcs":[[255,256,257,258,-249,259]],"properties":{"id":"24663217","dp":5669,"de":873}},{"type":"Polygon","arcs":[[260,-260,-248,261]],"properties":{"id":"24663218","dp":4290,"de":1018}},{"type":"Polygon","arcs":[[-259,262,263,-250]],"properties":{"id":"24663219","dp":9313,"de":0}},{"type":"Polygon","arcs":[[-258,264,265,266,267,268,269,270,-263]],"properties":{"id":"24663220","dp":3197,"de":1020}},{"type":"Polygon","arcs":[[-264,-271,271,272,-251]],"properties":{"id":"24663221","dp":11214,"de":0}},{"type":"Polygon","arcs":[[-270,273,274,275,-272]],"properties":{"id":"24663222","dp":9621,"de":0}},{"type":"Polygon","arcs":[[-273,-276,276,277,278,-252]],"properties":{"id":"24663223","dp":11269,"de":0}},{"type":"Polygon","arcs":[[279,280,281,282,283,284,285,286]],"properties":{"id":"24663227","dp":3208,"de":243}},{"type":"Polygon","arcs":[[287,288,-284]],"properties":{"id":"24663228","dp":9806,"de":1320}},{"type":"Polygon","arcs":[[-285,-289,289,290,291,292,293]],"properties":{"id":"24663229","dp":2759,"de":1023}},{"type":"Polygon","arcs":[[294,295,296,-292]],"properties":{"id":"24663230","dp":8375,"de":1160}},{"type":"Polygon","arcs":[[297,298,299,300,-296]],"properties":{"id":"24663231","dp":10815,"de":998}},{"type":"Polygon","arcs":[[301,302,303,304,-298,305]],"properties":{"id":"24663232","dp":7492,"de":3592}},{"type":"Polygon","arcs":[[306,307,308,309,-300]],"properties":{"id":"24663233","dp":7652,"de":0}},{"type":"Polygon","arcs":[[-309,310,311,312,313]],"properties":{"id":"24663234","dp":9826,"de":1391}},{"type":"Polygon","arcs":[[-297,-301,-310,-314,314,315,316,317,318]],"properties":{"id":"24663235","dp":8550,"de":1062}},{"type":"Polygon","arcs":[[-286,319,320,321,-293,-319,322,323,324,325,326]],"properties":{"id":"24663236","dp":1908,"de":0}},{"type":"Polygon","arcs":[[327,-324]],"properties":{"id":"24663237","dp":12585,"de":0}},{"type":"Polygon","arcs":[[-321,328]],"properties":{"id":"24663238","dp":12077,"de":0}},{"type":"Polygon","arcs":[[-294,-322,-329,-320]],"properties":{"id":"24663239","dp":9419,"de":0}},{"type":"Polygon","arcs":[[329,330,331,332,333,334,335,336,337,338,339]],"properties":{"id":"24663241","dp":9132,"de":3526}},{"type":"Polygon","arcs":[[340,341,342,343,344]],"properties":{"id":"24663315","dp":6316,"de":663}},{"type":"Polygon","arcs":[[-345,345]],"properties":{"id":"24663316","dp":17073,"de":0}},{"type":"Polygon","arcs":[[346,347,348,-342,349]],"properties":{"id":"24663317","dp":6559,"de":940}},{"type":"Polygon","arcs":[[350,351,-347,352]],"properties":{"id":"24663318","dp":13324,"de":0}},{"type":"Polygon","arcs":[[-352,353,354,355,-348]],"properties":{"id":"24663319","dp":5197,"de":591}},{"type":"Polygon","arcs":[[356,-247,357,-356]],"properties":{"id":"24663320","dp":8801,"de":4778}},{"type":"Polygon","arcs":[[-349,-358,-246,358,-343]],"properties":{"id":"24663321","dp":4576,"de":2380}},{"type":"Polygon","arcs":[[359,360,361,362,363,364]],"properties":{"id":"24663322","dp":5794,"de":2158}},{"type":"Polygon","arcs":[[365,-361,366]],"properties":{"id":"24663323","dp":14574,"de":0}},{"type":"Polygon","arcs":[[367,368,369,-362,-366,370]],"properties":{"id":"24663324","dp":14421,"de":0}},{"type":"Polygon","arcs":[[371,372,-369,373]],"properties":{"id":"24663325","dp":15522,"de":0}},{"type":"Polygon","arcs":[[374,375,376,-374,-368,377]],"properties":{"id":"24663326","dp":10725,"de":1170}},{"type":"Polygon","arcs":[[-377,378,379,380,-372]],"properties":{"id":"24663327","dp":17213,"de":0}},{"type":"Polygon","arcs":[[-381,381,-363,-370,-373]],"properties":{"id":"24663328","dp":15796,"de":1851}},{"type":"Polygon","arcs":[[382,383,384,385,386,387,388,389,390,391,392,393,394,395,396]],"properties":{"id":"24663329","dp":0,"de":296}},{"type":"Polygon","arcs":[[397,398,399,400,401,402,403,404]],"properties":{"id":"24663330","dp":4436,"de":5953}},{"type":"Polygon","arcs":[[405,406,407,-399,408]],"properties":{"id":"24663331","dp":11992,"de":1562}},{"type":"Polygon","arcs":[[409,410,-406,411,412]],"properties":{"id":"24663332","dp":14081,"de":2551}},{"type":"Polygon","arcs":[[413,414,415,-410,416]],"properties":{"id":"24663333","dp":8329,"de":1540}},{"type":"Polygon","arcs":[[417,418,419,420,421,422,423,424,425]],"properties":{"id":"24660037","dp":6132,"de":0}},{"type":"Polygon","arcs":[[426,427,428,429,-419,430]],"properties":{"id":"24660038","dp":9844,"de":0}},{"type":"Polygon","arcs":[[431,-427,432]],"properties":{"id":"24660039","dp":11381,"de":0}},{"type":"Polygon","arcs":[[433,434,435,-428,-432]],"properties":{"id":"24660040","dp":4262,"de":404}},{"type":"Polygon","arcs":[[436,-434,-433,-431,-418,437,438]],"properties":{"id":"24660041","dp":3909,"de":348}},{"type":"Polygon","arcs":[[439,-438,-426,440]],"properties":{"id":"24660042","dp":9275,"de":0}},{"type":"Polygon","arcs":[[-425,441,-441]],"properties":{"id":"24660043","dp":10046,"de":0}},{"type":"Polygon","arcs":[[442,-440,-442,-424,443,444,445,446]],"properties":{"id":"24660044","dp":3139,"de":1321}},{"type":"Polygon","arcs":[[447,-446,448,449,450]],"properties":{"id":"24660045","dp":2288,"de":0}},{"type":"Polygon","arcs":[[-439,-443,451,452]],"properties":{"id":"24660046","dp":4770,"de":478}},{"type":"Polygon","arcs":[[453,454,455,456,457,-435,-437,-453,458]],"properties":{"id":"24660047","dp":2550,"de":2172}},{"type":"Polygon","arcs":[[459,460,461,-455,462]],"properties":{"id":"24660048","dp":6159,"de":1346}},{"type":"Polygon","arcs":[[463,464,465,-456,-462,466]],"properties":{"id":"24660049","dp":5493,"de":681}},{"type":"Polygon","arcs":[[467,-464,468]],"properties":{"id":"24660050","dp":9764,"de":0}},{"type":"Polygon","arcs":[[469,470,-469,-467,-461,471,472]],"properties":{"id":"24660051","dp":4193,"de":0}},{"type":"Polygon","arcs":[[473,474,-472,-460,475]],"properties":{"id":"24660052","dp":7412,"de":1105}},{"type":"Polygon","arcs":[[476,-473,-475,477]],"properties":{"id":"24660053","dp":6310,"de":0}},{"type":"Polygon","arcs":[[478,479,-478,-474,480,481,482]],"properties":{"id":"24660054","dp":4320,"de":724}},{"type":"Polygon","arcs":[[483,484,485,-479]],"properties":{"id":"24660055","dp":9536,"de":0}},{"type":"Polygon","arcs":[[486,-485,487]],"properties":{"id":"24660056","dp":4995,"de":0}},{"type":"Polygon","arcs":[[488,489,490,491,492,493,494,495,496,-488,-484,-483,497]],"properties":{"id":"24660057","dp":338,"de":536}},{"type":"Polygon","arcs":[[498,499,500,501]],"properties":{"id":"24660489","dp":8249,"de":6849}},{"type":"Polygon","arcs":[[502,503,504,-502]],"properties":{"id":"24660490","dp":8603,"de":3262}},{"type":"Polygon","arcs":[[-253,-279,505,506,507,508]],"properties":{"id":"24660141","dp":1836,"de":234}},{"type":"Polygon","arcs":[[509,510,-503,-501,511,512,513,514,515,516,517]],"properties":{"id":"24660491","dp":1351,"de":5936}},{"type":"Polygon","arcs":[[-517,518,519,520]],"properties":{"id":"24660492","dp":13313,"de":0}},{"type":"Polygon","arcs":[[-516,521,522,-519]],"properties":{"id":"24660493","dp":13219,"de":1570}},{"type":"Polygon","arcs":[[-523,523,524,525]],"properties":{"id":"24660494","dp":11926,"de":1361}},{"type":"Polygon","arcs":[[-525,526,527,528]],"properties":{"id":"24660495","dp":9387,"de":1348}},{"type":"Polygon","arcs":[[529,530,531,-527,-524]],"properties":{"id":"24660496","dp":11422,"de":1845}},{"type":"Polygon","arcs":[[-515,-530,-522]],"properties":{"id":"24660497","dp":14505,"de":1692}},{"type":"Polygon","arcs":[[-514,532,533,534,-531]],"properties":{"id":"24660498","dp":10225,"de":1503}},{"type":"Polygon","arcs":[[535,536,537,-534]],"properties":{"id":"24660499","dp":9676,"de":0}},{"type":"Polygon","arcs":[[-533,-513,538,539,540,541,542,543,-536]],"properties":{"id":"24660500","dp":3362,"de":7441}},{"type":"Polygon","arcs":[[-544,544,545,546,547,-537]],"properties":{"id":"24660501","dp":7888,"de":837}},{"type":"Polygon","arcs":[[548,549,-545,-543]],"properties":{"id":"24660502","dp":13405,"de":1811}},{"type":"Polygon","arcs":[[550,551,552,-549,-542]],"properties":{"id":"24660503","dp":7376,"de":874}},{"type":"Polygon","arcs":[[553,554,-551,-541]],"properties":{"id":"24660504","dp":5407,"de":1005}},{"type":"Polygon","arcs":[[555,556,557,-554,-540]],"properties":{"id":"24660505","dp":9900,"de":2490}},{"type":"Polygon","arcs":[[558,559,560,-557,561,562]],"properties":{"id":"24660506","dp":8935,"de":2987}},{"type":"Polygon","arcs":[[563,-563,564]],"properties":{"id":"24660507","dp":10570,"de":1027}},{"type":"Polygon","arcs":[[565,566,567,-559,-564,568]],"properties":{"id":"24660508","dp":6919,"de":1668}},{"type":"Polygon","arcs":[[569,570,-566,571]],"properties":{"id":"24660509","dp":8828,"de":0}},{"type":"Polygon","arcs":[[572,573,-572,-569,-565,-562,-556,-539,574,575]],"properties":{"id":"24660510","dp":1306,"de":8518}},{"type":"Polygon","arcs":[[576,577,578,579,-570,-574]],"properties":{"id":"24660511","dp":4287,"de":468}},{"type":"Polygon","arcs":[[-573,580,581,-577]],"properties":{"id":"24660512","dp":13997,"de":0}},{"type":"Polygon","arcs":[[582,583,584,585,586,587,-581]],"properties":{"id":"24660513","dp":10449,"de":1063}},{"type":"Polygon","arcs":[[588,589,-587]],"properties":{"id":"24660514","dp":9284,"de":0}},{"type":"Polygon","arcs":[[-586,590,591,-589]],"properties":{"id":"24660515","dp":39141,"de":3862}},{"type":"Polygon","arcs":[[-585,592,593,-591]],"properties":{"id":"24660516","dp":26174,"de":1912}},{"type":"Polygon","arcs":[[594,595,596,597,598,-593]],"properties":{"id":"24660517","dp":8932,"de":485}},{"type":"Polygon","arcs":[[599,600,601,602]],"properties":{"id":"24661004","dp":10054,"de":0}},{"type":"Polygon","arcs":[[-1,-37,-42,-601]],"properties":{"id":"24661005","dp":8535,"de":5063}},{"type":"Polygon","arcs":[[603,604,-254,-509,605,606,607,608]],"properties":{"id":"24660142","dp":3728,"de":2421}},{"type":"Polygon","arcs":[[609,610,-609]],"properties":{"id":"24660143","dp":10342,"de":0}},{"type":"Polygon","arcs":[[611,-610,-608,612,613,614]],"properties":{"id":"24660144","dp":15266,"de":722}},{"type":"Polygon","arcs":[[615,-604,-611,616]],"properties":{"id":"24660145","dp":12741,"de":0}},{"type":"Polygon","arcs":[[617,618,-617,-612,619,620,621,622]],"properties":{"id":"24660146","dp":7606,"de":1504}},{"type":"Polygon","arcs":[[-618,623]],"properties":{"id":"24660147","dp":20632,"de":1656}},{"type":"Polygon","arcs":[[624,-255,-605,-616,-619,-624,-623,625]],"properties":{"id":"24660148","dp":1454,"de":5705}},{"type":"Polygon","arcs":[[626,-626,627,628,629,630]],"properties":{"id":"24660149","dp":5561,"de":963}},{"type":"Polygon","arcs":[[631,632,-631,633,634]],"properties":{"id":"24660150","dp":3943,"de":1446}},{"type":"Polygon","arcs":[[635,-635,636,637,638]],"properties":{"id":"24660151","dp":4713,"de":0}},{"type":"Polygon","arcs":[[639,640,-637,-634,-630,641,642,643]],"properties":{"id":"24660152","dp":3337,"de":3856}},{"type":"Polygon","arcs":[[644,-640,645]],"properties":{"id":"24660153","dp":10086,"de":867}},{"type":"Polygon","arcs":[[646,-646,647,648]],"properties":{"id":"24660154","dp":6043,"de":699}},{"type":"Polygon","arcs":[[-649,649,650,651,652]],"properties":{"id":"24660155","dp":8086,"de":942}},{"type":"Polygon","arcs":[[653,-652,654,655,656]],"properties":{"id":"24660156","dp":11496,"de":2733}},{"type":"Polygon","arcs":[[657,-655,-651,658,659,660,661,662,663,664]],"properties":{"id":"24660157","dp":2446,"de":187}},{"type":"Polygon","arcs":[[-665,665,666,667]],"properties":{"id":"24660158","dp":9450,"de":1247}},{"type":"Polygon","arcs":[[668,669,-666,-664]],"properties":{"id":"24660159","dp":16040,"de":0}},{"type":"Polygon","arcs":[[-669,-663,670,671]],"properties":{"id":"24660160","dp":6754,"de":0}},{"type":"Polygon","arcs":[[-662,672,673,-671]],"properties":{"id":"24660161","dp":7033,"de":0}},{"type":"Polygon","arcs":[[-674,674,675]],"properties":{"id":"24660162","dp":9412,"de":0}},{"type":"Polygon","arcs":[[-675,-673,-661,676,677,678,679,680,681,682,683]],"properties":{"id":"24660163","dp":8293,"de":697}},{"type":"Polygon","arcs":[[684,685,-679,686]],"properties":{"id":"24660164","dp":9226,"de":3080}},{"type":"Polygon","arcs":[[687,688,689,690,-685]],"properties":{"id":"24660165","dp":9571,"de":0}},{"type":"Polygon","arcs":[[691,692,693,694]],"properties":{"id":"24660624","dp":17755,"de":2448}},{"type":"Polygon","arcs":[[-112,-106,695,-692]],"properties":{"id":"24660625","dp":16190,"de":1636}},{"type":"Polygon","arcs":[[696,697,698,699,700,701,702]],"properties":{"id":"24660877","dp":8154,"de":0}},{"type":"Polygon","arcs":[[703,704,-698,705]],"properties":{"id":"24660878","dp":13204,"de":0}},{"type":"Polygon","arcs":[[706,707,708,-699,-705]],"properties":{"id":"24660879","dp":14016,"de":0}},{"type":"Polygon","arcs":[[709,710,711,712,713,-707,-704,714]],"properties":{"id":"24660880","dp":5343,"de":1738}},{"type":"Polygon","arcs":[[715,716,-708,-714]],"properties":{"id":"24660881","dp":15212,"de":0}},{"type":"Polygon","arcs":[[-709,-717,717,718,719,-700]],"properties":{"id":"24660882","dp":13107,"de":0}},{"type":"Polygon","arcs":[[-718,-716,-713,720,721,722,723,724]],"properties":{"id":"24660883","dp":6469,"de":524}},{"type":"Polygon","arcs":[[725,726,727,-723]],"properties":{"id":"24660884","dp":8508,"de":732}},{"type":"Polygon","arcs":[[-728,728,729,730,731,-724]],"properties":{"id":"24660885","dp":6490,"de":3685}},{"type":"Polygon","arcs":[[-731,732,733,734,735,736,737]],"properties":{"id":"24660886","dp":11863,"de":2534}},{"type":"Polygon","arcs":[[-737,738,739,740,741]],"properties":{"id":"24660887","dp":15000,"de":0}},{"type":"Polygon","arcs":[[742,743,744,-739,-736]],"properties":{"id":"24660888","dp":15464,"de":0}},{"type":"Polygon","arcs":[[745,746,-743,-735]],"properties":{"id":"24660889","dp":15095,"de":0}},{"type":"Polygon","arcs":[[747,748,749,-744,-747]],"properties":{"id":"24660890","dp":15628,"de":0}},{"type":"Polygon","arcs":[[750,751,752,-748,-746,-734]],"properties":{"id":"24660891","dp":16444,"de":0}},{"type":"Polygon","arcs":[[753,-752]],"properties":{"id":"24660892","dp":12290,"de":0}},{"type":"Polygon","arcs":[[-751,-733,-730,754,755,756,757,758,759,760,761,762,763,-749,-753,-754]],"properties":{"id":"24660893","dp":480,"de":3413}},{"type":"Polygon","arcs":[[-745,-750,-764,764,-740]],"properties":{"id":"24660894","dp":15893,"de":957}},{"type":"Polygon","arcs":[[-741,-765,-763,765,766,767]],"properties":{"id":"24660895","dp":6906,"de":2126}},{"type":"Polygon","arcs":[[-766,-762,768,769]],"properties":{"id":"24660896","dp":13624,"de":0}},{"type":"Polygon","arcs":[[770,771,-767,-770,772]],"properties":{"id":"24660897","dp":17031,"de":0}},{"type":"Polygon","arcs":[[773,774,-771]],"properties":{"id":"24660898","dp":13979,"de":0}},{"type":"Polygon","arcs":[[775,-738,-742,-768,-772,-775,776]],"properties":{"id":"24660899","dp":5594,"de":4325}},{"type":"Polygon","arcs":[[777,-719,-725,-732,-776,778]],"properties":{"id":"24660900","dp":7907,"de":2759}},{"type":"Polygon","arcs":[[779,780,781,782,783,784,785]],"properties":{"id":"24661213","dp":5261,"de":5231}},{"type":"Polygon","arcs":[[-786,786,787,788,789,790,791,792,793]],"properties":{"id":"24661214","dp":6711,"de":933}},{"type":"Polygon","arcs":[[794,795,796,-788]],"properties":{"id":"24661215","dp":18148,"de":1851}},{"type":"Polygon","arcs":[[-797,797,798,-789]],"properties":{"id":"24661216","dp":19680,"de":3723}},{"type":"Polygon","arcs":[[-790,-799,799,800]],"properties":{"id":"24661217","dp":17804,"de":0}},{"type":"Polygon","arcs":[[-791,-801,801,802]],"properties":{"id":"24661218","dp":21421,"de":2696}},{"type":"Polygon","arcs":[[-792,-803,803,804]],"properties":{"id":"24661219","dp":11752,"de":2061}},{"type":"Polygon","arcs":[[-805,805,806,807]],"properties":{"id":"24661220","dp":11693,"de":3674}},{"type":"Polygon","arcs":[[-807,808,809]],"properties":{"id":"24661221","dp":13514,"de":2236}},{"type":"Polygon","arcs":[[-793,-808,-810,810,811,812,813,814]],"properties":{"id":"24661222","dp":8084,"de":3112}},{"type":"Polygon","arcs":[[815,-814,816,817,818,819,820]],"properties":{"id":"24661223","dp":2721,"de":1293}},{"type":"Polygon","arcs":[[821,822,823,824]],"properties":{"id":"24660715","dp":7667,"de":3137}},{"type":"Polygon","arcs":[[825,826,-822,827]],"properties":{"id":"24660716","dp":6704,"de":1787}},{"type":"Polygon","arcs":[[828,829,830,-826,831]],"properties":{"id":"24660717","dp":8223,"de":2919}},{"type":"Polygon","arcs":[[832,833,-830,834]],"properties":{"id":"24660718","dp":7019,"de":3425}},{"type":"Polygon","arcs":[[835,836,-185,-833,837]],"properties":{"id":"24660719","dp":6743,"de":3362}},{"type":"Polygon","arcs":[[838,-187,839,840]],"properties":{"id":"24660722","dp":14111,"de":2439}},{"type":"Polygon","arcs":[[841,842,-182,-839]],"properties":{"id":"24660723","dp":14735,"de":8730}},{"type":"Polygon","arcs":[[843,-183,-843,844]],"properties":{"id":"24660724","dp":13245,"de":1324}},{"type":"Polygon","arcs":[[-844,845,846,847,848,-168,-177]],"properties":{"id":"24660725","dp":6444,"de":2017}},{"type":"Polygon","arcs":[[849,850,-847,851,852,853]],"properties":{"id":"24660726","dp":4920,"de":3063}},{"type":"Polygon","arcs":[[854,855,856,857,858]],"properties":{"id":"24660749","dp":19316,"de":2278}},{"type":"Polygon","arcs":[[-859,859,860,861,862]],"properties":{"id":"24660750","dp":8036,"de":1740}},{"type":"Polygon","arcs":[[-143,863,-861,864]],"properties":{"id":"24660751","dp":11931,"de":956}},{"type":"Polygon","arcs":[[865,866,867,868]],"properties":{"id":"24662884","dp":4529,"de":0}},{"type":"MultiPolygon","arcs":[[[869,870,871,872,-866,873,874]],[[875]]],"properties":{"id":"24662885","dp":1894,"de":308}},{"type":"Polygon","arcs":[[876,877,-870,878]],"properties":{"id":"24662886","dp":7047,"de":0}},{"type":"Polygon","arcs":[[879,880,881,882,-877,883]],"properties":{"id":"24662887","dp":9032,"de":0}},{"type":"Polygon","arcs":[[884,885,886,887,888,889,890]],"properties":{"id":"24662888","dp":3292,"de":263}},{"type":"Polygon","arcs":[[891,892,-886,893]],"properties":{"id":"24662889","dp":6524,"de":0}},{"type":"Polygon","arcs":[[894,895,-894,-885]],"properties":{"id":"24662890","dp":6933,"de":0}},{"type":"Polygon","arcs":[[896,897,-892,-896,898,899]],"properties":{"id":"24662891","dp":7590,"de":0}},{"type":"Polygon","arcs":[[-900,900,901,902]],"properties":{"id":"24662892","dp":5797,"de":0}},{"type":"Polygon","arcs":[[903,-901,904,905,906]],"properties":{"id":"24662893","dp":4546,"de":0}},{"type":"Polygon","arcs":[[-899,-895,-891,907,-905]],"properties":{"id":"24662894","dp":4164,"de":0}},{"type":"Polygon","arcs":[[-908,908,909,910]],"properties":{"id":"24662895","dp":5343,"de":0}},{"type":"Polygon","arcs":[[-906,-911,911,912]],"properties":{"id":"24662896","dp":5953,"de":684}},{"type":"Polygon","arcs":[[913,914,915,916,917,918]],"properties":{"id":"24661583","dp":2600,"de":306}},{"type":"Polygon","arcs":[[919,920,-915,921]],"properties":{"id":"24661584","dp":2784,"de":451}},{"type":"Polygon","arcs":[[922,923,924,-922,-914]],"properties":{"id":"24661585","dp":4379,"de":948}},{"type":"Polygon","arcs":[[-920,-925,925,926,927]],"properties":{"id":"24661586","dp":2973,"de":0}},{"type":"Polygon","arcs":[[-924,928,929,930,931,932,-926]],"properties":{"id":"24661587","dp":3944,"de":657}},{"type":"Polygon","arcs":[[-927,-933,933,934,935]],"properties":{"id":"24661589","dp":2770,"de":840}},{"type":"Polygon","arcs":[[936,-928,-936,937,938,939]],"properties":{"id":"24661590","dp":2453,"de":284}},{"type":"Polygon","arcs":[[-938,-935,940,941,942,943,944,945]],"properties":{"id":"24661591","dp":3828,"de":3190}},{"type":"Polygon","arcs":[[946,947,948]],"properties":{"id":"24662549","dp":6190,"de":0}},{"type":"Polygon","arcs":[[949,950,951,952,-848,-851]],"properties":{"id":"24660727","dp":7519,"de":983}},{"type":"Polygon","arcs":[[953,954,955,956,957,-950,-850]],"properties":{"id":"24660728","dp":8488,"de":2785}},{"type":"Polygon","arcs":[[958,-954,959,960]],"properties":{"id":"24660729","dp":14304,"de":0}},{"type":"Polygon","arcs":[[961,-955,-959,962]],"properties":{"id":"24660730","dp":11732,"de":4385}},{"type":"Polygon","arcs":[[963,-956,-962,964]],"properties":{"id":"24660731","dp":14750,"de":3333}},{"type":"Polygon","arcs":[[965,966,-964,967]],"properties":{"id":"24660732","dp":11921,"de":2156}},{"type":"Polygon","arcs":[[968,969,-966,970]],"properties":{"id":"24660733","dp":8852,"de":2550}},{"type":"Polygon","arcs":[[971,972,973,-957,-967,-970]],"properties":{"id":"24660734","dp":12379,"de":3291}},{"type":"Polygon","arcs":[[974,975,976,-972,977,978]],"properties":{"id":"24660735","dp":9475,"de":846}},{"type":"Polygon","arcs":[[979,980,-978,-969]],"properties":{"id":"24660736","dp":22776,"de":0}},{"type":"Polygon","arcs":[[981,-979,-981]],"properties":{"id":"24660737","dp":21798,"de":1419}},{"type":"Polygon","arcs":[[982,983,984,-982,-980,-971,-968,-965,-963,-961,985,986,987]],"properties":{"id":"24660738","dp":8438,"de":1526}},{"type":"Polygon","arcs":[[988,989,990,991,992,-983,993]],"properties":{"id":"24660741","dp":26512,"de":3914}},{"type":"Polygon","arcs":[[994,995,-991]],"properties":{"id":"24660742","dp":14478,"de":0}},{"type":"Polygon","arcs":[[996,997,998,999,1000,-995,-990]],"properties":{"id":"24660743","dp":5183,"de":0}},{"type":"Polygon","arcs":[[1001,1002,1003]],"properties":{"id":"24661234","dp":9777,"de":0}},{"type":"Polygon","arcs":[[1004,1005,1006]],"properties":{"id":"24661237","dp":5723,"de":0}},{"type":"Polygon","arcs":[[1007,1008,1009,1010,1011,1012,1013]],"properties":{"id":"24661240","dp":3181,"de":8764}},{"type":"Polygon","arcs":[[-1013,1014]],"properties":{"id":"24661241","dp":7276,"de":0}},{"type":"Polygon","arcs":[[1015,-862,-864,-142,-146,1016]],"properties":{"id":"24660752","dp":4836,"de":653}},{"type":"Polygon","arcs":[[1017,1018,-1017,1019,1020]],"properties":{"id":"24660753","dp":4845,"de":1452}},{"type":"Polygon","arcs":[[1021,-1020,-145,1022,1023,-976]],"properties":{"id":"24660754","dp":6224,"de":1491}},{"type":"Polygon","arcs":[[1024,1025,-1021,-1022,-975,-985]],"properties":{"id":"24660755","dp":11419,"de":4481}},{"type":"Polygon","arcs":[[-977,-1024,1026,1027,-973]],"properties":{"id":"24660756","dp":7419,"de":1093}},{"type":"Polygon","arcs":[[-1023,-149,1028,-1027]],"properties":{"id":"24660757","dp":12898,"de":1759}},{"type":"Polygon","arcs":[[-1029,-151,-154,1029]],"properties":{"id":"24660758","dp":7137,"de":1982}},{"type":"Polygon","arcs":[[-974,-1028,-1030,-156,1030,-958]],"properties":{"id":"24660759","dp":5183,"de":3210}},{"type":"Polygon","arcs":[[-1031,-159,1031,-951]],"properties":{"id":"24660760","dp":7373,"de":3006}},{"type":"Polygon","arcs":[[-1032,-163,1032,-952]],"properties":{"id":"24660761","dp":8741,"de":2532}},{"type":"Polygon","arcs":[[-1033,-167,-169,-849,-953]],"properties":{"id":"24660762","dp":10111,"de":4306}},{"type":"Polygon","arcs":[[1033,1034,1035,-865]],"properties":{"id":"24660763","dp":10505,"de":0}},{"type":"Polygon","arcs":[[-1036,1036,1037,1038,-137,-144]],"properties":{"id":"24660764","dp":6917,"de":1820}},{"type":"Polygon","arcs":[[1039,1040,1041,1042,1043,-1037,-1035,1044]],"properties":{"id":"24660765","dp":12311,"de":6182}},{"type":"Polygon","arcs":[[-1044,1045,1046,-1038]],"properties":{"id":"24660766","dp":10347,"de":1544}},{"type":"Polygon","arcs":[[-1043,1047,1048,1049,1050,-1046]],"properties":{"id":"24660767","dp":4532,"de":0}},{"type":"Polygon","arcs":[[-1039,-1047,-1051,1051,1052,1053]],"properties":{"id":"24660768","dp":3583,"de":487}},{"type":"Polygon","arcs":[[-129,-138,-1054,1054,1055,1056]],"properties":{"id":"24660769","dp":4103,"de":612}},{"type":"Polygon","arcs":[[-130,-1057,1057,-121]],"properties":{"id":"24660770","dp":2805,"de":741}},{"type":"Polygon","arcs":[[-1058,-1056,1058,1059,1060,-108,-119,-122]],"properties":{"id":"24660771","dp":2493,"de":396}},{"type":"Polygon","arcs":[[-1061,1061,1062,-109]],"properties":{"id":"24660772","dp":9883,"de":773}},{"type":"Polygon","arcs":[[1063,1064,1065,-1062]],"properties":{"id":"24660773","dp":9652,"de":0}},{"type":"Polygon","arcs":[[-1066,1066,1067,1068]],"properties":{"id":"24660774","dp":15219,"de":1732}},{"type":"Polygon","arcs":[[1069,-1068,1070,1071,1072,1073,1074]],"properties":{"id":"24660775","dp":8818,"de":2140}},{"type":"Polygon","arcs":[[-1075,1075,1076,1077,1078]],"properties":{"id":"24660776","dp":9580,"de":1881}},{"type":"Polygon","arcs":[[-1074,1079,1080,-1076]],"properties":{"id":"24660777","dp":8269,"de":2884}},{"type":"Polygon","arcs":[[1081,-1079,1082,-693]],"properties":{"id":"24660778","dp":11621,"de":4223}},{"type":"Polygon","arcs":[[1083,1084,1085,1086,1087,1088,1089,1090,1091,1092]],"properties":{"id":"24661262","dp":10544,"de":11245}},{"type":"Polygon","arcs":[[-1093,1093,1094]],"properties":{"id":"24661263","dp":10688,"de":0}},{"type":"Polygon","arcs":[[-1092,1095,-1094]],"properties":{"id":"24661264","dp":14722,"de":599}},{"type":"Polygon","arcs":[[1096,1097,1098,1099,1100,-949,1101,1102,1103,1104,1105,1106]],"properties":{"id":"24662550","dp":5727,"de":546}},{"type":"Polygon","arcs":[[-1101,1107,1108,1109,-947]],"properties":{"id":"24662551","dp":8291,"de":0}},{"type":"Polygon","arcs":[[-1100,1110,1111,-1108]],"properties":{"id":"24662552","dp":10076,"de":0}},{"type":"Polygon","arcs":[[-1109,-1112,1112,1113,1114]],"properties":{"id":"24662553","dp":4893,"de":0}},{"type":"Polygon","arcs":[[1115,1116,-1113,-1111,-1099]],"properties":{"id":"24662554","dp":10898,"de":0}},{"type":"Polygon","arcs":[[-1114,-1117,1117,1118,1119]],"properties":{"id":"24662555","dp":9113,"de":0}},{"type":"Polygon","arcs":[[1120,1121,1122,1123,1124,1125,1126,1127,1128,1129]],"properties":{"id":"24662948","dp":453,"de":63}},{"type":"Polygon","arcs":[[1130,1131,1132,-1123,1133,1134]],"properties":{"id":"24662949","dp":1624,"de":1021}},{"type":"MultiPolygon","arcs":[[[1135,1136,1137,-1129,1138,1139,1140]],[[1141]]],"properties":{"id":"24662951","dp":1327,"de":0}},{"type":"Polygon","arcs":[[1142,1143,1144,1145,1146,1147]],"properties":{"id":"24662952","dp":4083,"de":0}},{"type":"Polygon","arcs":[[1148,1149,-1148,1150,1151,-430]],"properties":{"id":"24662953","dp":1585,"de":954}},{"type":"Polygon","arcs":[[-436,1152,1153,-1149,-429]],"properties":{"id":"24662954","dp":4192,"de":0}},{"type":"Polygon","arcs":[[1154,1155,-1154,1156]],"properties":{"id":"24662955","dp":6779,"de":0}},{"type":"Polygon","arcs":[[-1157,-1153,-458,1157]],"properties":{"id":"24662956","dp":4753,"de":0}},{"type":"Polygon","arcs":[[1158,1159,-1155,-1158,-457,-466]],"properties":{"id":"24662957","dp":4014,"de":0}},{"type":"Polygon","arcs":[[-1010,1160,1161,1162,1163,1164,1165,1166]],"properties":{"id":"24661224","dp":3673,"de":543}},{"type":"Polygon","arcs":[[-1163,1167]],"properties":{"id":"24661225","dp":8734,"de":4430}},{"type":"Polygon","arcs":[[1168,1169,-1164,-1168,-1162,1170]],"properties":{"id":"24661226","dp":6306,"de":1749}},{"type":"Polygon","arcs":[[1171,-1171,-1161,-1009]],"properties":{"id":"24661227","dp":7016,"de":665}},{"type":"Polygon","arcs":[[1172,1173,1174,-1169,-1172]],"properties":{"id":"24661228","dp":5756,"de":1204}},{"type":"Polygon","arcs":[[-1006,1175,-1003,1176,-1173,-1008]],"properties":{"id":"24661229","dp":12388,"de":530}},{"type":"Polygon","arcs":[[-1177,1177,1178,1179,1180,-1174]],"properties":{"id":"24661230","dp":5897,"de":482}},{"type":"Polygon","arcs":[[-1165,-1170,-1175,-1181]],"properties":{"id":"24661231","dp":5275,"de":0}},{"type":"Polygon","arcs":[[1181,1182,-1179,1183]],"properties":{"id":"24661232","dp":9961,"de":1413}},{"type":"Polygon","arcs":[[-1184,-1178,-1002,1184]],"properties":{"id":"24661233","dp":8900,"de":955}},{"type":"MultiPolygon","arcs":[[[1185,-821,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200]],[[1201,1202]]],"properties":{"id":"24661242","dp":258,"de":753}},{"type":"Polygon","arcs":[[1203,1204,-1193]],"properties":{"id":"24661243","dp":11314,"de":11896}},{"type":"Polygon","arcs":[[1205,1206,1207,-1194,-1205]],"properties":{"id":"24661244","dp":15228,"de":1428}},{"type":"Polygon","arcs":[[1208,-1084,-1095,-1096,-1091,1209,1210,1211]],"properties":{"id":"24661265","dp":4266,"de":28208}},{"type":"Polygon","arcs":[[1212,1213,1214,1215,1216,1217,1218]],"properties":{"id":"24660302","dp":1865,"de":2736}},{"type":"Polygon","arcs":[[1219,1220,1221,1222,-1213,1223]],"properties":{"id":"24660303","dp":3634,"de":3670}},{"type":"Polygon","arcs":[[1224,-1195,-1208]],"properties":{"id":"24661245","dp":9284,"de":994}},{"type":"Polygon","arcs":[[1225,-1196,-1225,-1207,1226]],"properties":{"id":"24661246","dp":11670,"de":1002}},{"type":"Polygon","arcs":[[1227,-1227,-1206,-1204,1228]],"properties":{"id":"24661247","dp":12923,"de":2769}},{"type":"Polygon","arcs":[[1229,-1229,-1192]],"properties":{"id":"24661248","dp":9450,"de":2094}},{"type":"Polygon","arcs":[[-1191,1230,1231,1232,-1228,-1230]],"properties":{"id":"24661249","dp":10381,"de":2359}},{"type":"Polygon","arcs":[[1233,1234,1235,1236,-1197,-1226,-1233]],"properties":{"id":"24661250","dp":9612,"de":862}},{"type":"Polygon","arcs":[[1237,1238,-1198,-1237]],"properties":{"id":"24661251","dp":12371,"de":1482}},{"type":"Polygon","arcs":[[-1239,1239,1240,1241,1242,1243,-1199]],"properties":{"id":"24661252","dp":4372,"de":11270}},{"type":"Polygon","arcs":[[1244,1245,1246]],"properties":{"id":"24661255","dp":8291,"de":32020}},{"type":"Polygon","arcs":[[-1247,1247,1248,1249,1250,1251,1252]],"properties":{"id":"24661256","dp":4213,"de":74639}},{"type":"Polygon","arcs":[[1253,-1252,1254,1255,1256]],"properties":{"id":"24661257","dp":4213,"de":39480}},{"type":"Polygon","arcs":[[1257,1258,1259,-1255]],"properties":{"id":"24661258","dp":5163,"de":5655}},{"type":"Polygon","arcs":[[-1260,1260,1261,1262,-1256]],"properties":{"id":"24661259","dp":3602,"de":49947}},{"type":"Polygon","arcs":[[1263,-1085,1264,-1261,-1259]],"properties":{"id":"24661260","dp":15390,"de":21335}},{"type":"Polygon","arcs":[[-1265,-1209,1265,-1262]],"properties":{"id":"24661261","dp":13935,"de":18783}},{"type":"Polygon","arcs":[[1266,1267,1268,1269,1270]],"properties":{"id":"24661269","dp":10143,"de":15503}},{"type":"Polygon","arcs":[[1271,1272,1273,-1268,1274]],"properties":{"id":"24661270","dp":25177,"de":24703}},{"type":"Polygon","arcs":[[1275,-1275,-1267,1276]],"properties":{"id":"24661271","dp":23439,"de":12698}},{"type":"Polygon","arcs":[[1277,1278,1279,-1272,-1276,1280]],"properties":{"id":"24661272","dp":23659,"de":14245}},{"type":"Polygon","arcs":[[1281,1282,-1279]],"properties":{"id":"24661273","dp":34525,"de":28212}},{"type":"Polygon","arcs":[[1283,1284,1285,1286,1287]],"properties":{"id":"24661276","dp":32985,"de":4228}},{"type":"Polygon","arcs":[[1288,1289,1290,-1285,1291,1292,1293]],"properties":{"id":"24661277","dp":19180,"de":1803}},{"type":"Polygon","arcs":[[1294,1295,1296,-1290,1297,1298]],"properties":{"id":"24661278","dp":19310,"de":3918}},{"type":"Polygon","arcs":[[-1298,-1289,1299]],"properties":{"id":"24661279","dp":23975,"de":0}},{"type":"Polygon","arcs":[[1300,-1300,1301,1302]],"properties":{"id":"24661280","dp":30720,"de":11261}},{"type":"Polygon","arcs":[[1303,-1302,-1294,1304]],"properties":{"id":"24661281","dp":39278,"de":6443}},{"type":"Polygon","arcs":[[1305,-1305,-1293,1306,-1278]],"properties":{"id":"24661282","dp":20572,"de":14583}},{"type":"Polygon","arcs":[[-1250,1307,1308,1309,1310,1311,-1303,-1304,-1306,1312,1313]],"properties":{"id":"24661283","dp":3006,"de":135078}},{"type":"Polygon","arcs":[[1314,1315,-1299,-1301,-1312]],"properties":{"id":"24661284","dp":5856,"de":10763}},{"type":"Polygon","arcs":[[-1316,1316,1317,-1295]],"properties":{"id":"24661285","dp":31428,"de":2747}},{"type":"Polygon","arcs":[[1318,1319,-1296,-1318]],"properties":{"id":"24661286","dp":19859,"de":4205}},{"type":"Polygon","arcs":[[1320,1321,1322,1323,1324,1325,1326,1327,1328,1329]],"properties":{"id":"24661299","dp":1509,"de":12065}},{"type":"Polygon","arcs":[[1330,1331,1332,-1327]],"properties":{"id":"24661300","dp":12480,"de":0}},{"type":"Polygon","arcs":[[1333,1334,1335,1336,-1331,-1326]],"properties":{"id":"24661301","dp":9872,"de":3200}},{"type":"Polygon","arcs":[[-1337,1337,1338,1339,-1332]],"properties":{"id":"24661302","dp":7579,"de":1460}},{"type":"Polygon","arcs":[[-1338,-1336,1340,1341,1342]],"properties":{"id":"24661303","dp":7226,"de":2176}},{"type":"Polygon","arcs":[[1343,1344,1345,-1342]],"properties":{"id":"24661304","dp":6115,"de":1652}},{"type":"Polygon","arcs":[[1346,-1345,1347,1348]],"properties":{"id":"24661305","dp":11550,"de":7219}},{"type":"Polygon","arcs":[[-1349,1349,1350,1351]],"properties":{"id":"24661306","dp":33834,"de":0}},{"type":"Polygon","arcs":[[1352,1353,-1351]],"properties":{"id":"24661308","dp":20664,"de":0}},{"type":"Polygon","arcs":[[-1350,-1348,1354,1355,1356,1357,-1353]],"properties":{"id":"24661309","dp":4461,"de":8568}},{"type":"Polygon","arcs":[[1358,1359,-1358]],"properties":{"id":"24661310","dp":20965,"de":0}},{"type":"Polygon","arcs":[[1360,1361,1362,1363,1364,1365]],"properties":{"id":"24660395","dp":10242,"de":0}},{"type":"Polygon","arcs":[[1366,1367,1368,1369,1370,-1363]],"properties":{"id":"24660396","dp":10130,"de":0}},{"type":"Polygon","arcs":[[-1366,1371,1372]],"properties":{"id":"24660397","dp":11880,"de":0}},{"type":"Polygon","arcs":[[1373,1374,-1361,-1373,1375,1376,1377,1378,1379,1380,1381]],"properties":{"id":"24660398","dp":3646,"de":2889}},{"type":"Polygon","arcs":[[1382,1383,1384,1385,1386]],"properties":{"id":"24660335","dp":6886,"de":2422}},{"type":"Polygon","arcs":[[1387,1388,1389,1390,1391,1392,-391]],"properties":{"id":"24662081","dp":10320,"de":2533}},{"type":"Polygon","arcs":[[1393,1394,1395,1396,1397]],"properties":{"id":"24660194","dp":6417,"de":1819}},{"type":"Polygon","arcs":[[1398,1399,1400]],"properties":{"id":"24660195","dp":6399,"de":2060}},{"type":"Polygon","arcs":[[1401,1402,1403,1404,-1395,1405,1406]],"properties":{"id":"24660196","dp":6960,"de":1062}},{"type":"Polygon","arcs":[[1407,1408,1409,-1403,1410]],"properties":{"id":"24660197","dp":8815,"de":877}},{"type":"Polygon","arcs":[[1411,1412,1413,-1408,1414,1415,1416]],"properties":{"id":"24660198","dp":5286,"de":423}},{"type":"Polygon","arcs":[[1417,1418,1419,1420,1421,1422,-1409,-1414,1423]],"properties":{"id":"24660199","dp":2222,"de":4573}},{"type":"Polygon","arcs":[[1424,1425,1426,1427,1428,-1214,-1223]],"properties":{"id":"24660304","dp":7336,"de":2680}},{"type":"Polygon","arcs":[[1429,1430,1431,-1425,-1222]],"properties":{"id":"24660305","dp":14721,"de":0}},{"type":"Polygon","arcs":[[1432,1433,-1426,-1432]],"properties":{"id":"24660306","dp":14441,"de":0}},{"type":"Polygon","arcs":[[1434,1435,-1427,-1434]],"properties":{"id":"24660307","dp":13449,"de":0}},{"type":"Polygon","arcs":[[-392,-1393,1436,1437]],"properties":{"id":"24662082","dp":32198,"de":0}},{"type":"Polygon","arcs":[[-393,-1438,1438]],"properties":{"id":"24662083","dp":16061,"de":0}},{"type":"Polygon","arcs":[[-1439,-1437,-1392,1439,1440,1441,1442,1443,-394]],"properties":{"id":"24662084","dp":3544,"de":786}},{"type":"Polygon","arcs":[[-1444,1444,1445,-395]],"properties":{"id":"24662085","dp":9063,"de":550}},{"type":"Polygon","arcs":[[1446,-1446,1447,1448,1449]],"properties":{"id":"24662086","dp":9446,"de":2551}},{"type":"Polygon","arcs":[[1450,1451,1452,1453,1454]],"properties":{"id":"24662087","dp":21285,"de":2428}},{"type":"Polygon","arcs":[[1455,1456,-1452,1457]],"properties":{"id":"24662088","dp":19668,"de":0}},{"type":"Polygon","arcs":[[1458,1459,1460,1461,1462,1463,1464,1465,1466,-1453,-1457,1467,1468,1469]],"properties":{"id":"24662089","dp":3893,"de":3973}},{"type":"Polygon","arcs":[[1470,1471,1472,1473,-1461]],"properties":{"id":"24662090","dp":7603,"de":1143}},{"type":"Polygon","arcs":[[1474,1475,-1471,-1460,1476,1477,1478]],"properties":{"id":"24662091","dp":4567,"de":2314}},{"type":"Polygon","arcs":[[1479,-1479,1480,1481,1482]],"properties":{"id":"24662092","dp":16334,"de":0}},{"type":"Polygon","arcs":[[1483,-1483,1484,1485]],"properties":{"id":"24662093","dp":17883,"de":0}},{"type":"Polygon","arcs":[[1486,1487,1488,1489,-1480,-1484]],"properties":{"id":"24662094","dp":16941,"de":0}},{"type":"Polygon","arcs":[[1490,1491,1492,1493]],"properties":{"id":"24662095","dp":10494,"de":3268}},{"type":"Polygon","arcs":[[1494,1495,1496,-1491,1497]],"properties":{"id":"24662096","dp":11922,"de":2375}},{"type":"Polygon","arcs":[[1498,1499,1500,-1496,1501]],"properties":{"id":"24662097","dp":14433,"de":1889}},{"type":"Polygon","arcs":[[1502,1503,1504]],"properties":{"id":"24662425","dp":2648,"de":227}},{"type":"Polygon","arcs":[[1505,1506,1507,1508,1509,-1505,1510,1511,1512]],"properties":{"id":"24662426","dp":2375,"de":642}},{"type":"Polygon","arcs":[[1513,1514,-1507,1515,1516]],"properties":{"id":"24662427","dp":2989,"de":0}},{"type":"Polygon","arcs":[[1517,-1516,-1506,1518]],"properties":{"id":"24662428","dp":3507,"de":0}},{"type":"Polygon","arcs":[[1519,1520,-1517,-1518]],"properties":{"id":"24662429","dp":2811,"de":0}},{"type":"Polygon","arcs":[[1521,1522,-1514,-1521,1523,1524]],"properties":{"id":"24662430","dp":3947,"de":3220}},{"type":"Polygon","arcs":[[1525,1526,-1525]],"properties":{"id":"24662431","dp":3490,"de":0}},{"type":"Polygon","arcs":[[1527,1528,1529,-1522,-1527,1530,1531,1532]],"properties":{"id":"24662432","dp":60,"de":3143}},{"type":"Polygon","arcs":[[1533,1534,1535,1536]],"properties":{"id":"24661691","dp":10052,"de":0}},{"type":"Polygon","arcs":[[1537,1538,1539,-1535]],"properties":{"id":"24661692","dp":12677,"de":1036}},{"type":"Polygon","arcs":[[1540,1541,1542,1543,1544,1545]],"properties":{"id":"24660275","dp":14750,"de":4621}},{"type":"Polygon","arcs":[[1546,1547,1548,1549,1550,1551]],"properties":{"id":"24660276","dp":4398,"de":1077}},{"type":"Polygon","arcs":[[1552,1553,-1549]],"properties":{"id":"24660277","dp":7535,"de":991}},{"type":"Polygon","arcs":[[-1548,1554,1555,1556,1557,-1553]],"properties":{"id":"24660278","dp":3608,"de":0}},{"type":"Polygon","arcs":[[1558,1559,-1557,1560,1561]],"properties":{"id":"24660279","dp":4084,"de":0}},{"type":"Polygon","arcs":[[-1561,-1556,1562,1563,1564,1565,1566,1567]],"properties":{"id":"24660280","dp":3697,"de":0}},{"type":"Polygon","arcs":[[1568,-1562,-1568,1569,1570]],"properties":{"id":"24660281","dp":6639,"de":3983}},{"type":"Polygon","arcs":[[-1571,-1430,-1221,1571,1572]],"properties":{"id":"24660282","dp":15441,"de":0}},{"type":"Polygon","arcs":[[-1559,-1569,-1573,1573,1574,1575]],"properties":{"id":"24660283","dp":8896,"de":2252}},{"type":"Polygon","arcs":[[-1574,-1572,-1220,1576,1577]],"properties":{"id":"24660284","dp":12043,"de":0}},{"type":"Polygon","arcs":[[-1575,-1578,1578,1579,1580]],"properties":{"id":"24660285","dp":12352,"de":1069}},{"type":"Polygon","arcs":[[1581,1582,-1580,1583]],"properties":{"id":"24660286","dp":11359,"de":0}},{"type":"Polygon","arcs":[[1584,1585,-1582,1586]],"properties":{"id":"24660287","dp":11125,"de":0}},{"type":"Polygon","arcs":[[-1550,-1554,-1558,-1560,-1576,-1581,-1583,-1586,1587]],"properties":{"id":"24660288","dp":2997,"de":572}},{"type":"Polygon","arcs":[[-1551,-1588,-1585,1588,1589]],"properties":{"id":"24660289","dp":4436,"de":3209}},{"type":"Polygon","arcs":[[-1589,-1587,-1584,-1579,-1577,-1224,-1219,1590,1591,1592,1593,1594]],"properties":{"id":"24660290","dp":881,"de":5260}},{"type":"Polygon","arcs":[[1595,1596,1597,-1593]],"properties":{"id":"24660291","dp":13029,"de":0}},{"type":"Polygon","arcs":[[-1597,1598,1599,1600,1601]],"properties":{"id":"24660292","dp":14340,"de":3085}},{"type":"Polygon","arcs":[[-1599,-1596,-1592,1602,1603]],"properties":{"id":"24660293","dp":9424,"de":0}},{"type":"Polygon","arcs":[[-1604,1604,1605,1606,1607,-1600]],"properties":{"id":"24660294","dp":7266,"de":0}},{"type":"Polygon","arcs":[[-1601,-1608,1608,1609,1610]],"properties":{"id":"24660295","dp":10255,"de":0}},{"type":"Polygon","arcs":[[-1607,1611,1612,1613,1614,-1609]],"properties":{"id":"24660296","dp":10027,"de":1426}},{"type":"Polygon","arcs":[[-1614,1615,1616]],"properties":{"id":"24660297","dp":8167,"de":0}},{"type":"Polygon","arcs":[[-1613,1617,1618,-1616]],"properties":{"id":"24660298","dp":6766,"de":0}},{"type":"Polygon","arcs":[[1619,1620,1621,-1618,-1612,-1606]],"properties":{"id":"24660299","dp":8714,"de":2254}},{"type":"Polygon","arcs":[[-1603,-1591,-1218,1622,-1620,-1605]],"properties":{"id":"24660300","dp":4604,"de":0}},{"type":"Polygon","arcs":[[-1217,1623,1624,1625,1626,-1621,-1623]],"properties":{"id":"24660301","dp":1470,"de":1672}},{"type":"Polygon","arcs":[[1627,1628,1629,-1428,-1436,1630]],"properties":{"id":"24660308","dp":11556,"de":0}},{"type":"Polygon","arcs":[[1631,1632,-1628,1633]],"properties":{"id":"24660309","dp":7460,"de":0}},{"type":"Polygon","arcs":[[1634,1635,1636,-1632]],"properties":{"id":"24660310","dp":14345,"de":0}},{"type":"Polygon","arcs":[[1637,1638,1639,1640,-1636,1641]],"properties":{"id":"24660311","dp":13577,"de":0}},{"type":"Polygon","arcs":[[1642,-1639]],"properties":{"id":"24660312","dp":11893,"de":0}},{"type":"Polygon","arcs":[[1643,1644,1645,1646,-1640,-1643,-1638]],"properties":{"id":"24660313","dp":4276,"de":3872}},{"type":"Polygon","arcs":[[1647,1648,1649,1650,1651,-1646,1652]],"properties":{"id":"24660314","dp":1610,"de":1587}},{"type":"Polygon","arcs":[[1653,1654,-1649,1655]],"properties":{"id":"24660315","dp":4853,"de":0}},{"type":"Polygon","arcs":[[1656,-1654,1657]],"properties":{"id":"24660316","dp":10881,"de":0}},{"type":"Polygon","arcs":[[1658,1659,1660]],"properties":{"id":"24660319","dp":15719,"de":0}},{"type":"Polygon","arcs":[[1661,1662,1663,-1659,1664]],"properties":{"id":"24660320","dp":17446,"de":0}},{"type":"Polygon","arcs":[[1665,-1665,1666,1667]],"properties":{"id":"24660321","dp":14506,"de":0}},{"type":"Polygon","arcs":[[1668,-1662,-1666,1669]],"properties":{"id":"24660322","dp":15473,"de":0}},{"type":"Polygon","arcs":[[1670,1671,1672,1673,-1663,-1669]],"properties":{"id":"24660323","dp":9120,"de":0}},{"type":"Polygon","arcs":[[1674,1675,1676,-1672]],"properties":{"id":"24660324","dp":14019,"de":1331}},{"type":"Polygon","arcs":[[-1673,-1677,1677,1678,1679]],"properties":{"id":"24660325","dp":18655,"de":0}},{"type":"Polygon","arcs":[[1680,-1679,1681,1682]],"properties":{"id":"24660326","dp":13955,"de":0}},{"type":"Polygon","arcs":[[1683,-1683,1684]],"properties":{"id":"24660327","dp":14862,"de":0}},{"type":"Polygon","arcs":[[1685,1686,1687,1688,-1685,-1682,1689]],"properties":{"id":"24660328","dp":15552,"de":1036}},{"type":"Polygon","arcs":[[1690,1691,1692,1693,-1688]],"properties":{"id":"24660329","dp":20916,"de":0}},{"type":"Polygon","arcs":[[1694,1695,1696,-1692,1697,1698]],"properties":{"id":"24660330","dp":15639,"de":1044}},{"type":"Polygon","arcs":[[1699,1700,-1696]],"properties":{"id":"24660331","dp":23619,"de":2941}},{"type":"Polygon","arcs":[[-1701,1701,1702,1703]],"properties":{"id":"24660332","dp":12557,"de":0}},{"type":"Polygon","arcs":[[-1703,1704,1705,1706]],"properties":{"id":"24660333","dp":26931,"de":0}},{"type":"Polygon","arcs":[[-1704,-1707,-1384,1707,-1693,-1697]],"properties":{"id":"24660334","dp":17231,"de":1612}},{"type":"Polygon","arcs":[[1708,1709,1710,1711,1712]],"properties":{"id":"24660840","dp":7241,"de":1239}},{"type":"Polygon","arcs":[[1713,-1712,1714,1715,1716]],"properties":{"id":"24660841","dp":11728,"de":793}},{"type":"Polygon","arcs":[[-1715,-1711,1717,1718,1719,1720]],"properties":{"id":"24660842","dp":15317,"de":2705}},{"type":"Polygon","arcs":[[1721,1722,1723,1724,1725]],"properties":{"id":"24660216","dp":12738,"de":0}},{"type":"Polygon","arcs":[[1726,1727,1728,-1723,1729]],"properties":{"id":"24660217","dp":20416,"de":3472}},{"type":"Polygon","arcs":[[1730,-1543,1731,-1728]],"properties":{"id":"24660218","dp":6618,"de":948}},{"type":"Polygon","arcs":[[-1544,-1731,-1727,1732,1733]],"properties":{"id":"24660219","dp":9982,"de":1158}},{"type":"Polygon","arcs":[[-1540,1734,1735]],"properties":{"id":"24661693","dp":10767,"de":0}},{"type":"Polygon","arcs":[[-1735,1736,1737,1738,1739,1740,1741]],"properties":{"id":"24661694","dp":4665,"de":18681}},{"type":"Polygon","arcs":[[-1740,1742,1743,1744]],"properties":{"id":"24661695","dp":10363,"de":0}},{"type":"Polygon","arcs":[[1745,-1741,-1745,1746,1747,1748,1749]],"properties":{"id":"24661696","dp":10017,"de":853}},{"type":"Polygon","arcs":[[1750,1751,-1747,-1744,1752,1753]],"properties":{"id":"24661697","dp":18777,"de":783}},{"type":"Polygon","arcs":[[-1748,-1752,1754,1755,1756]],"properties":{"id":"24661698","dp":9695,"de":0}},{"type":"Polygon","arcs":[[-1755,-1751,1757,1758,1759]],"properties":{"id":"24661699","dp":10851,"de":0}},{"type":"Polygon","arcs":[[-1754,1760,1761,1762,1763,1764,1765,-1758]],"properties":{"id":"24661700","dp":5499,"de":550}},{"type":"Polygon","arcs":[[1766,-1756,-1760,1767,1768,1769]],"properties":{"id":"24661701","dp":6071,"de":0}},{"type":"Polygon","arcs":[[1770,-1768]],"properties":{"id":"24661702","dp":12620,"de":0}},{"type":"MultiPolygon","arcs":[[[1771,1772,1773,1774,1775,1776,1777,1778,1779]],[[1780,1781]],[[1782,1783]],[[1784,1785]]],"properties":{"id":"24662193","dp":2677,"de":1628}},{"type":"Polygon","arcs":[[1786,1787,1788,1789,1790,-1776]],"properties":{"id":"24662194","dp":11546,"de":1251}},{"type":"Polygon","arcs":[[-1777,-1791,1791]],"properties":{"id":"24662195","dp":9233,"de":0}},{"type":"Polygon","arcs":[[1792,1793,-1789]],"properties":{"id":"24662196","dp":9212,"de":0}},{"type":"Polygon","arcs":[[1794,1795,1796,1797,-1790,-1794]],"properties":{"id":"24662197","dp":5282,"de":1479}},{"type":"Polygon","arcs":[[-1795,1798,1799,1800]],"properties":{"id":"24662198","dp":9160,"de":839}},{"type":"Polygon","arcs":[[1801,1802,1803,1804,1805,-1801]],"properties":{"id":"24662199","dp":11124,"de":1282}},{"type":"Polygon","arcs":[[1806,1807,1808,-1802]],"properties":{"id":"24662200","dp":26084,"de":0}},{"type":"Polygon","arcs":[[-1809,1809,1810,-1803]],"properties":{"id":"24662201","dp":18007,"de":0}},{"type":"Polygon","arcs":[[1811,1812,-1804,-1811]],"properties":{"id":"24662202","dp":14267,"de":0}},{"type":"Polygon","arcs":[[-1812,-1810,-1808,1813,1814,1815,1816]],"properties":{"id":"24662203","dp":16359,"de":963}},{"type":"Polygon","arcs":[[-1800,1817,-1814,-1807]],"properties":{"id":"24662204","dp":48198,"de":0}},{"type":"Polygon","arcs":[[1818,-1805,-1813,-1817,1819,1820],[1821]],"properties":{"id":"24662205","dp":7167,"de":0}},{"type":"Polygon","arcs":[[-1822]],"properties":{"id":"24662206","dp":8176,"de":828}},{"type":"Polygon","arcs":[[1822,-1385,-1706]],"properties":{"id":"24660336","dp":24911,"de":0}},{"type":"Polygon","arcs":[[1823,1824,1825,1826,1827,1828,1829,-1386,-1823,-1705,1830]],"properties":{"id":"24660337","dp":1429,"de":714}},{"type":"Polygon","arcs":[[1831,1832,-1824,1833]],"properties":{"id":"24660338","dp":26878,"de":0}},{"type":"Polygon","arcs":[[-1825,-1833,1834]],"properties":{"id":"24660339","dp":24393,"de":0}},{"type":"Polygon","arcs":[[-1826,-1835,-1832,1835,1836]],"properties":{"id":"24660340","dp":5519,"de":0}},{"type":"Polygon","arcs":[[-1836,1837,1838]],"properties":{"id":"24660341","dp":20785,"de":0}},{"type":"Polygon","arcs":[[1839,-1837,-1839,1840]],"properties":{"id":"24660342","dp":15495,"de":0}},{"type":"Polygon","arcs":[[-1840,1841,1842,1843,1844,1845,-1827]],"properties":{"id":"24660343","dp":7521,"de":2920}},{"type":"Polygon","arcs":[[-1841,1846,1847,1848,-1842]],"properties":{"id":"24660344","dp":21048,"de":0}},{"type":"Polygon","arcs":[[1849,-1843,-1849,1850,1851,1852,1853]],"properties":{"id":"24660345","dp":17427,"de":2624}},{"type":"Polygon","arcs":[[1854,1855,-1844,-1850,1856]],"properties":{"id":"24660346","dp":17276,"de":0}},{"type":"Polygon","arcs":[[1857,1858,-1855,1859]],"properties":{"id":"24660347","dp":14938,"de":2006}},{"type":"Polygon","arcs":[[-1860,-1857,1860,1861]],"properties":{"id":"24660348","dp":4517,"de":3622}},{"type":"Polygon","arcs":[[1862,1863,-1861,-1854,1864,1865,1866]],"properties":{"id":"24660349","dp":10616,"de":2312}},{"type":"Polygon","arcs":[[-1853,1867,1868,-1865]],"properties":{"id":"24660350","dp":29850,"de":2500}},{"type":"Polygon","arcs":[[-1852,1869,1870,-1868]],"properties":{"id":"24660351","dp":26300,"de":0}},{"type":"Polygon","arcs":[[-1870,1871]],"properties":{"id":"24660352","dp":26515,"de":0}},{"type":"Polygon","arcs":[[1872,1873,1874,-1871,-1872,-1851,-1848,1875,1876,1877,1878,1879,1880,1881]],"properties":{"id":"24660353","dp":504,"de":4974}},{"type":"Polygon","arcs":[[-1875,1882,-1866,-1869]],"properties":{"id":"24660354","dp":21788,"de":0}},{"type":"Polygon","arcs":[[1883,1884,1885,1886,-1867,-1883,-1874]],"properties":{"id":"24660355","dp":5610,"de":5052}},{"type":"Polygon","arcs":[[1887,1888,-1863,-1887,1889]],"properties":{"id":"24660356","dp":10344,"de":0}},{"type":"Polygon","arcs":[[1890,-1890,-1886,1891]],"properties":{"id":"24660357","dp":10936,"de":2224}},{"type":"Polygon","arcs":[[1892,1893,-1888,-1891,1894]],"properties":{"id":"24660358","dp":4829,"de":3930}},{"type":"Polygon","arcs":[[1895,1896,1897,1898,-1895,-1892,1899]],"properties":{"id":"24660359","dp":5068,"de":5425}},{"type":"Polygon","arcs":[[-1900,-1885,1900,1901]],"properties":{"id":"24660360","dp":9188,"de":4752}},{"type":"Polygon","arcs":[[1902,1903,-1896,-1902,1904,1905]],"properties":{"id":"24660361","dp":8870,"de":2419}},{"type":"Polygon","arcs":[[-1905,-1901,-1884,-1873,1906,1907,1908]],"properties":{"id":"24660362","dp":5838,"de":1838}},{"type":"Polygon","arcs":[[1909,1910,-1908]],"properties":{"id":"24660363","dp":21333,"de":0}},{"type":"Polygon","arcs":[[1911,1912,1913,1914,1915,-997,-989]],"properties":{"id":"24660870","dp":2283,"de":3942}},{"type":"Polygon","arcs":[[-1413,1916,1917,1918,1919,-1424]],"properties":{"id":"24660200","dp":5940,"de":1495}},{"type":"Polygon","arcs":[[1920,-1418,-1920]],"properties":{"id":"24660201","dp":15261,"de":0}},{"type":"Polygon","arcs":[[-1919,1921,1922,-1419,-1921]],"properties":{"id":"24660202","dp":14923,"de":0}},{"type":"Polygon","arcs":[[-621,1923,-614,1924,1925,1926,1927,1928,1929,1930,1931,-1422,1932]],"properties":{"id":"24660203","dp":1500,"de":6992}},{"type":"Polygon","arcs":[[-615,-1924,-620]],"properties":{"id":"24660204","dp":12657,"de":4931}},{"type":"Polygon","arcs":[[1933,1934,1935,1936,1937,1938,1939,1940,1941,1942]],"properties":{"id":"24660812","dp":1273,"de":772}},{"type":"Polygon","arcs":[[1943,1944,-1926]],"properties":{"id":"24660205","dp":20945,"de":1879}},{"type":"Polygon","arcs":[[-607,-1944,-1925,-613]],"properties":{"id":"24660206","dp":15395,"de":0}},{"type":"Polygon","arcs":[[1945,1946,1947,1948,1949,-1928],[1950]],"properties":{"id":"24660207","dp":3459,"de":1886}},{"type":"Polygon","arcs":[[-1951]],"properties":{"id":"24660208","dp":10092,"de":15797}},{"type":"Polygon","arcs":[[1951,1952,-1769,-1771,-1759,-1766,1953,1954,1955,-1595,-1929,-1950]],"properties":{"id":"24660209","dp":919,"de":4717}},{"type":"Polygon","arcs":[[-1765,1956,1957,-1954]],"properties":{"id":"24660210","dp":12107,"de":924}},{"type":"Polygon","arcs":[[1958,1959,-1957,-1764]],"properties":{"id":"24660211","dp":11984,"de":0}},{"type":"Polygon","arcs":[[-1960,1960,-1726,1961]],"properties":{"id":"24660212","dp":17538,"de":0}},{"type":"Polygon","arcs":[[-1962,1962,1963,-1955,-1958]],"properties":{"id":"24660213","dp":10966,"de":5098}},{"type":"Polygon","arcs":[[-1725,1964,-1963]],"properties":{"id":"24660214","dp":16655,"de":0}},{"type":"Polygon","arcs":[[-1965,-1724,-1729,-1732,-1542,-1552,-1590,-1956,-1964]],"properties":{"id":"24660215","dp":2931,"de":6869}},{"type":"Polygon","arcs":[[1965,1966,1967,1968,1969,1970,1971,1972]],"properties":{"id":"24660710","dp":1058,"de":289}},{"type":"Polygon","arcs":[[1973,1974,1975,1976,-1966,1977,1978]],"properties":{"id":"24660711","dp":2449,"de":1123}},{"type":"Polygon","arcs":[[1979,1980,-1974,1981,1982]],"properties":{"id":"24660712","dp":3549,"de":827}},{"type":"Polygon","arcs":[[1983,-1975,-1981,1984]],"properties":{"id":"24660713","dp":5000,"de":1076}},{"type":"Polygon","arcs":[[-1980,1985,1986,-823,-827,1987,1988,-1985]],"properties":{"id":"24660714","dp":2684,"de":481}},{"type":"Polygon","arcs":[[1989,1990,-1716,-1721]],"properties":{"id":"24660843","dp":9278,"de":2295}},{"type":"Polygon","arcs":[[-857,-1990,1991,1992]],"properties":{"id":"24660844","dp":19828,"de":0}},{"type":"Polygon","arcs":[[-858,-1993,1993,1994]],"properties":{"id":"24660845","dp":19557,"de":0}},{"type":"Polygon","arcs":[[-1995,1995,-1045,-1034,-860]],"properties":{"id":"24660846","dp":9328,"de":629}},{"type":"Polygon","arcs":[[-1994,1996,1997,-1040,-1996]],"properties":{"id":"24660847","dp":15994,"de":1771}},{"type":"Polygon","arcs":[[-1992,-1720,1998,1999,-1997]],"properties":{"id":"24660848","dp":20817,"de":0}},{"type":"Polygon","arcs":[[-2000,2000,2001,2002,-1041,-1998]],"properties":{"id":"24660849","dp":12334,"de":0}},{"type":"Polygon","arcs":[[2003,2004,-2001,-1999,-1719]],"properties":{"id":"24660850","dp":8991,"de":0}},{"type":"Polygon","arcs":[[2005,-2002,-2005,2006,2007,-1049]],"properties":{"id":"24660851","dp":3291,"de":663}},{"type":"Polygon","arcs":[[-2003,-2006,-1048,-1042]],"properties":{"id":"24660852","dp":15593,"de":0}},{"type":"Polygon","arcs":[[2008,2009,2010,2011,-1733,-1730,2012]],"properties":{"id":"24660220","dp":15119,"de":3030}},{"type":"Polygon","arcs":[[2013,2014,-2010]],"properties":{"id":"24660221","dp":9971,"de":0}},{"type":"Polygon","arcs":[[-1959,-1763,2015,-2013,-1722,-1961]],"properties":{"id":"24660222","dp":7621,"de":4405}},{"type":"Polygon","arcs":[[-2014,-2009,-2016,-1762,2016]],"properties":{"id":"24660223","dp":12115,"de":0}},{"type":"Polygon","arcs":[[2017,-2011,-2015,-2017,-1761,-1753]],"properties":{"id":"24660224","dp":7843,"de":2973}},{"type":"Polygon","arcs":[[-1739,2018,2019,2020,-2012,-2018,-1743]],"properties":{"id":"24660225","dp":10223,"de":1807}},{"type":"Polygon","arcs":[[2021,2022,2023,-2019,-1738]],"properties":{"id":"24660226","dp":10194,"de":0}},{"type":"Polygon","arcs":[[2024,2025,2026,-1939,2027,2028,2029,2030,2031,-1821,2032,2033,-1533,2034]],"properties":{"id":"24662433","dp":75,"de":1528}},{"type":"Polygon","arcs":[[2035,-2025,2036,2037,2038,2039,2040,2041,2042]],"properties":{"id":"24662434","dp":383,"de":566}},{"type":"Polygon","arcs":[[2043,2044,2045,2046,2047,2048,2049,2050,-2038,2051,2052]],"properties":{"id":"24662435","dp":1157,"de":196}},{"type":"Polygon","arcs":[[-2049,2053,2054]],"properties":{"id":"24662436","dp":4584,"de":978}},{"type":"Polygon","arcs":[[2055,2056,-2046,2057]],"properties":{"id":"24662439","dp":12768,"de":2066}},{"type":"Polygon","arcs":[[2058,-2047,-2057]],"properties":{"id":"24662440","dp":8561,"de":499}},{"type":"Polygon","arcs":[[2059,2060]],"properties":{"id":"24662442","dp":12774,"de":0}},{"type":"Polygon","arcs":[[2061,2062,2063,2064,2065]],"properties":{"id":"24662871","dp":4619,"de":469}},{"type":"Polygon","arcs":[[-2064,2066,2067,2068,-867,2069]],"properties":{"id":"24662872","dp":2712,"de":0}},{"type":"Polygon","arcs":[[2070,2071,-2068,2072,2073]],"properties":{"id":"24662873","dp":8395,"de":0}},{"type":"Polygon","arcs":[[2074,2075,-2073,-2067,-2063,2076,2077,2078]],"properties":{"id":"24662874","dp":5198,"de":676}},{"type":"Polygon","arcs":[[-2076,2079,2080,-2074]],"properties":{"id":"24662875","dp":8431,"de":1984}},{"type":"Polygon","arcs":[[2081,2082,-2071,-2081]],"properties":{"id":"24662876","dp":8885,"de":0}},{"type":"Polygon","arcs":[[2083,2084,-2080,-2075,2085]],"properties":{"id":"24662877","dp":4231,"de":614}},{"type":"Polygon","arcs":[[2086,-2086,-2079,2087,2088]],"properties":{"id":"24662878","dp":5278,"de":946}},{"type":"Polygon","arcs":[[2089,-2089,2090,2091]],"properties":{"id":"24662879","dp":5059,"de":0}},{"type":"Polygon","arcs":[[2092,-2092,2093,2094]],"properties":{"id":"24662880","dp":6737,"de":652}},{"type":"Polygon","arcs":[[-2094,-2091,-2088,-2078,2095,2096,2097,2098]],"properties":{"id":"24662881","dp":2813,"de":530}},{"type":"Polygon","arcs":[[2099,2100,2101,-2097]],"properties":{"id":"24662882","dp":8525,"de":0}},{"type":"Polygon","arcs":[[-2077,-2062,-2100,-2096]],"properties":{"id":"24662883","dp":6157,"de":0}},{"type":"Polygon","arcs":[[2102,-1935,2103,2104,2105]],"properties":{"id":"24660813","dp":12857,"de":0}},{"type":"Polygon","arcs":[[2106,-2104,-1934,2107]],"properties":{"id":"24660814","dp":6033,"de":791}},{"type":"Polygon","arcs":[[2108,2109,-2105,-2107,2110]],"properties":{"id":"24660815","dp":9108,"de":713}},{"type":"Polygon","arcs":[[-2111,-2108,-1943,2111,2112]],"properties":{"id":"24660816","dp":7492,"de":1253}},{"type":"Polygon","arcs":[[2113,-2109,-2113,2114,2115,2116]],"properties":{"id":"24660818","dp":1261,"de":1526}},{"type":"Polygon","arcs":[[-1942,2117,2118,2119,-2112]],"properties":{"id":"24660820","dp":2735,"de":1490}},{"type":"Polygon","arcs":[[-2120,2120,2121,-2115]],"properties":{"id":"24660821","dp":2075,"de":785}},{"type":"Polygon","arcs":[[2122,2123,2124,-2121,2125,2126]],"properties":{"id":"24660822","dp":3376,"de":2525}},{"type":"Polygon","arcs":[[-2119,2127,2128,2129,-2126]],"properties":{"id":"24660823","dp":13409,"de":0}},{"type":"Polygon","arcs":[[-2129,2130,2131,2132,2133,-1913]],"properties":{"id":"24660824","dp":28392,"de":2572}},{"type":"Polygon","arcs":[[2134,2135,2136,-2133]],"properties":{"id":"24660825","dp":5644,"de":613}},{"type":"Polygon","arcs":[[2137,2138,-1914,-2134,-2137,2139]],"properties":{"id":"24660826","dp":2385,"de":6142}},{"type":"Polygon","arcs":[[2140,2141,2142,2143,2144,-2140,-2136]],"properties":{"id":"24660827","dp":4237,"de":437}},{"type":"Polygon","arcs":[[2145,2146,-2141,-2135,-2132]],"properties":{"id":"24660828","dp":4457,"de":344}},{"type":"Polygon","arcs":[[-2146,2147,2148,2149,2150,2151]],"properties":{"id":"24660829","dp":5890,"de":650}},{"type":"Polygon","arcs":[[2152,-2150,2153]],"properties":{"id":"24660830","dp":6060,"de":1155}},{"type":"Polygon","arcs":[[-2154,-2149,2154]],"properties":{"id":"24660832","dp":4675,"de":3640}},{"type":"Polygon","arcs":[[-2152,2155,2156,2157]],"properties":{"id":"24660833","dp":6296,"de":1171}},{"type":"Polygon","arcs":[[-2158,2158,2159,2160,-2142,-2147]],"properties":{"id":"24660834","dp":6118,"de":0}},{"type":"Polygon","arcs":[[2161,2162,2163,2164,-2159]],"properties":{"id":"24660835","dp":8983,"de":2354}},{"type":"Polygon","arcs":[[-2160,-2165,2165,2166,2167]],"properties":{"id":"24660836","dp":6957,"de":582}},{"type":"Polygon","arcs":[[-2161,-2168,2168,-2143]],"properties":{"id":"24660837","dp":6714,"de":513}},{"type":"Polygon","arcs":[[-2144,-2169,-2167,2169,-1709,2170]],"properties":{"id":"24660838","dp":5546,"de":0}},{"type":"Polygon","arcs":[[-2171,-1713,-1714,2171]],"properties":{"id":"24660839","dp":9049,"de":0}},{"type":"Polygon","arcs":[[-2004,-1718,-1710,-2170,-2166,2172,2173,2174,2175,2176,-2007]],"properties":{"id":"24660853","dp":2741,"de":2439}},{"type":"Polygon","arcs":[[-2175,2177,2178,2179,2180,2181,2182,-2176]],"properties":{"id":"24660854","dp":3216,"de":1037}},{"type":"Polygon","arcs":[[-2181,2183]],"properties":{"id":"24660855","dp":5005,"de":728}},{"type":"Polygon","arcs":[[-2174,2184,2185,2186,2187,2188,2189,2190,-2178,2174,-2175]],"properties":{"id":"24660856","dp":7421,"de":1732}},{"type":"Polygon","arcs":[[2191,2192,-2179,-2191]],"properties":{"id":"24660857","dp":4775,"de":374}},{"type":"Polygon","arcs":[[-2190,2193,2194,2195,-2192]],"properties":{"id":"24660858","dp":3480,"de":1312}},{"type":"Polygon","arcs":[[-2173,-2164,2196,2197,-2185]],"properties":{"id":"24660859","dp":11472,"de":0}},{"type":"Polygon","arcs":[[2198,2199,-2186,-2198]],"properties":{"id":"24660860","dp":40687,"de":3439}},{"type":"Polygon","arcs":[[-2187,-2200,2200,2201]],"properties":{"id":"24660861","dp":51902,"de":2989}},{"type":"Polygon","arcs":[[2202,-2188,-2202,2203,2204]],"properties":{"id":"24660862","dp":19757,"de":3238}},{"type":"Polygon","arcs":[[-2205,2205,2206,2207]],"properties":{"id":"24660863","dp":23466,"de":0}},{"type":"Polygon","arcs":[[-2206,-2204,-2201,-2199,-2197,-2163,2208]],"properties":{"id":"24660864","dp":16176,"de":3008}},{"type":"Polygon","arcs":[[2209,2210,2211,-1717,-1991,-856]],"properties":{"id":"24660865","dp":10490,"de":481}},{"type":"Polygon","arcs":[[-2145,-2172,-2212,2212]],"properties":{"id":"24660866","dp":12103,"de":887}},{"type":"Polygon","arcs":[[2213,-1915,-2139,2214,2215,-999]],"properties":{"id":"24660868","dp":7760,"de":836}},{"type":"Polygon","arcs":[[-1916,-2214,-998]],"properties":{"id":"24660869","dp":13318,"de":2586}},{"type":"Polygon","arcs":[[2216,2217,-2020,-2024]],"properties":{"id":"24660227","dp":10606,"de":1590}},{"type":"Polygon","arcs":[[2218,-2217,-2023,2219]],"properties":{"id":"24660228","dp":10064,"de":0}},{"type":"Polygon","arcs":[[2220,2221,2222,-2220,-2022]],"properties":{"id":"24660229","dp":9885,"de":821}},{"type":"Polygon","arcs":[[2223,2224,2225,-2222,2226]],"properties":{"id":"24660230","dp":9353,"de":0}},{"type":"Polygon","arcs":[[2227,2228,-2224,2229,2230]],"properties":{"id":"24660231","dp":13943,"de":1132}},{"type":"Polygon","arcs":[[2231,2232,2233,-2228,2234]],"properties":{"id":"24660232","dp":12870,"de":4582}},{"type":"Polygon","arcs":[[2235,2236,2237,2238,2239,-2233]],"properties":{"id":"24660233","dp":12546,"de":936}},{"type":"Polygon","arcs":[[2240,2241,-2236,-2232,2242,2243]],"properties":{"id":"24660234","dp":10162,"de":1711}},{"type":"Polygon","arcs":[[2244,2245,2246,2247,-2237,-2242,2248]],"properties":{"id":"24660235","dp":5817,"de":2967}},{"type":"Polygon","arcs":[[2249,2250,-2246,2251]],"properties":{"id":"24660236","dp":15345,"de":1257}},{"type":"Polygon","arcs":[[2252,2253,2254]],"properties":{"id":"24660238","dp":20508,"de":0}},{"type":"Polygon","arcs":[[2255,2256,2257,-2254,2258]],"properties":{"id":"24660239","dp":17380,"de":0}},{"type":"Polygon","arcs":[[2259,2260,2261,-2238,-2248,2262]],"properties":{"id":"24660241","dp":6161,"de":4545}},{"type":"Polygon","arcs":[[2263,2264,2265,2266,2267,2268,-2260,2269]],"properties":{"id":"24660242","dp":5450,"de":702}},{"type":"Polygon","arcs":[[2270,2271,2272,-2265,2273,2274]],"properties":{"id":"24660243","dp":8307,"de":2451}},{"type":"Polygon","arcs":[[2275,2276,-2273,2277]],"properties":{"id":"24660244","dp":14548,"de":1315}},{"type":"Polygon","arcs":[[2278,2279,-2278,-2272,2280]],"properties":{"id":"24660245","dp":17713,"de":0}},{"type":"Polygon","arcs":[[2281,2282,-2276,-2280,2283]],"properties":{"id":"24660246","dp":16062,"de":2106}},{"type":"Polygon","arcs":[[2284,2285,-2284,-2279,2286,2287]],"properties":{"id":"24660247","dp":21906,"de":0}},{"type":"Polygon","arcs":[[2288,2289,2290,-2282,-2286]],"properties":{"id":"24660248","dp":18379,"de":0}},{"type":"Polygon","arcs":[[2291,2292,2293,2294,-2289,-2285]],"properties":{"id":"24660249","dp":13646,"de":1918}},{"type":"Polygon","arcs":[[-1001,2295,2296,-1018,-1026,-992,-996]],"properties":{"id":"24660744","dp":16730,"de":1026}},{"type":"Polygon","arcs":[[-2216,2297,2298,-2296,-1000]],"properties":{"id":"24660745","dp":6708,"de":1012}},{"type":"Polygon","arcs":[[-2299,2299,2300,2301,-1019,-2297]],"properties":{"id":"24660746","dp":5153,"de":2351}},{"type":"Polygon","arcs":[[2302,-855,-863,-1016,-2302]],"properties":{"id":"24660748","dp":9417,"de":2579}},{"type":"Polygon","arcs":[[-2124,2303,-2127,-2130,-1912,-994,-988,2304,2305,2306,2307,2308,2309,2310]],"properties":{"id":"24660871","dp":622,"de":2045}},{"type":"Polygon","arcs":[[-2304,-2123]],"properties":{"id":"24660872","dp":23146,"de":0}},{"type":"Polygon","arcs":[[2311,2312,2313,2314,-777,-774,-773,-769,-761,2315,2316]],"properties":{"id":"24660874","dp":228,"de":2471}},{"type":"Polygon","arcs":[[2317,-779,-2315,2318,2319,-702]],"properties":{"id":"24660876","dp":3867,"de":2463}},{"type":"Polygon","arcs":[[2320,2321,2322,2323,2324,2325,2326]],"properties":{"id":"24662209","dp":5617,"de":1367}},{"type":"Polygon","arcs":[[2327,2328,2329,-2324]],"properties":{"id":"24662210","dp":9661,"de":0}},{"type":"Polygon","arcs":[[2330,2331,-2328,2332,2333]],"properties":{"id":"24662211","dp":5038,"de":0}},{"type":"Polygon","arcs":[[2334,-2333,-2323,2335,2336]],"properties":{"id":"24662212","dp":5151,"de":1397}},{"type":"Polygon","arcs":[[-2336,-2322,2337,2338,2339]],"properties":{"id":"24662213","dp":4664,"de":559}},{"type":"Polygon","arcs":[[-2321,2340,-2338]],"properties":{"id":"24662214","dp":25404,"de":0}},{"type":"Polygon","arcs":[[2341,-2339,-2341,-2327,2342]],"properties":{"id":"24662215","dp":26156,"de":0}},{"type":"Polygon","arcs":[[-1787,-1775,2343,-2337,-2340,-2342,2344]],"properties":{"id":"24662216","dp":8094,"de":2005}},{"type":"Polygon","arcs":[[-1799,-1793,-1788,-2345,-2343,-2326,-1815,-1818]],"properties":{"id":"24662217","dp":4662,"de":4977}},{"type":"Polygon","arcs":[[2345,2346,2347,2348,2349,2350,2351,2352]],"properties":{"id":"24662528","dp":6375,"de":1910}},{"type":"Polygon","arcs":[[2353,2354,-2353,2355,2356,-546,-550,-553]],"properties":{"id":"24662529","dp":3087,"de":738}},{"type":"Polygon","arcs":[[2357,2358,2359,-2355,2360]],"properties":{"id":"24662530","dp":5897,"de":4387}},{"type":"Polygon","arcs":[[2361,2362,-2361,-2354,-552,-555,-558]],"properties":{"id":"24662531","dp":5424,"de":2358}},{"type":"Polygon","arcs":[[2363,2364,2365,-2358,-2363]],"properties":{"id":"24662532","dp":8260,"de":1482}},{"type":"Polygon","arcs":[[-2365,2366,2367,2368]],"properties":{"id":"24662533","dp":19497,"de":2261}},{"type":"Polygon","arcs":[[2369,2370,-2367,-2364,-2362,-561]],"properties":{"id":"24662534","dp":9025,"de":2481}},{"type":"Polygon","arcs":[[2371,2372,2373,2374,-2368,-2371,2375]],"properties":{"id":"24662535","dp":5193,"de":1570}},{"type":"Polygon","arcs":[[2376,-2376,-2370,-560,-568]],"properties":{"id":"24662536","dp":6181,"de":2325}},{"type":"Polygon","arcs":[[-580,2377,2378,-2377,-567,-571]],"properties":{"id":"24662537","dp":8931,"de":0}},{"type":"Polygon","arcs":[[2379,2380,2381,-2378,-579]],"properties":{"id":"24662538","dp":7771,"de":0}},{"type":"Polygon","arcs":[[2382,-2380,-578]],"properties":{"id":"24662539","dp":9813,"de":0}},{"type":"Polygon","arcs":[[-2381,-2383,-582,2383,2384,2385,2386]],"properties":{"id":"24662540","dp":7382,"de":0}},{"type":"Polygon","arcs":[[-2387,2387,2388,-2372,-2379,-2382]],"properties":{"id":"24662541","dp":6209,"de":3255}},{"type":"Polygon","arcs":[[-592,-594,2389,2390,2391,-2384,-588,-590]],"properties":{"id":"24662542","dp":6060,"de":5127}},{"type":"Polygon","arcs":[[2392,2393,2394,2395,2396,-2385,-2392]],"properties":{"id":"24662543","dp":2786,"de":4994}},{"type":"Polygon","arcs":[[2397,2398,-2393]],"properties":{"id":"24662544","dp":12186,"de":3422}},{"type":"Polygon","arcs":[[-2399,2399,-1103,2400,2401,2402,-2394]],"properties":{"id":"24662545","dp":2981,"de":193}},{"type":"Polygon","arcs":[[2403,-1104,-2400,-2398,-2391,2404,-598]],"properties":{"id":"24662546","dp":6713,"de":2941}},{"type":"Polygon","arcs":[[-2405,-2390,-599]],"properties":{"id":"24662547","dp":30883,"de":0}},{"type":"Polygon","arcs":[[-1110,-1115,2405,-2401,-1102,-948]],"properties":{"id":"24662548","dp":3129,"de":1403}},{"type":"MultiPolygon","arcs":[[[2406]],[[2407,2408,2409,2410,2411,2412,2413,2414,2415,2416]],[[2417]]],"properties":{"id":"24660981","dp":1087,"de":199}},{"type":"Polygon","arcs":[[2418,2419,-2411,2420]],"properties":{"id":"24660982","dp":16381,"de":0}},{"type":"Polygon","arcs":[[2421,2422,-2419,2423]],"properties":{"id":"24660983","dp":12144,"de":0}},{"type":"MultiPolygon","arcs":[[[2424,2425,2426,2427,2428,-2424,-2421,-2410]],[[2429]],[[-2408,2430]]],"properties":{"id":"24660984","dp":1590,"de":0}},{"type":"Polygon","arcs":[[2431,2432,2433,-2427]],"properties":{"id":"24660985","dp":2890,"de":0}},{"type":"Polygon","arcs":[[2434,2435,2436,-2433]],"properties":{"id":"24660986","dp":10024,"de":0}},{"type":"Polygon","arcs":[[2437,2438,2439,2440,-2436]],"properties":{"id":"24660987","dp":8861,"de":0}},{"type":"Polygon","arcs":[[-2415,2441,2442,2443]],"properties":{"id":"24660988","dp":9694,"de":0}},{"type":"Polygon","arcs":[[-2414,2444,2445,-2442]],"properties":{"id":"24660989","dp":8756,"de":1813}},{"type":"Polygon","arcs":[[2446,2447,-2446,2448,2449,2450]],"properties":{"id":"24660990","dp":6031,"de":694}},{"type":"Polygon","arcs":[[2451,2452,2453,2454,-2450,2455]],"properties":{"id":"24660991","dp":7671,"de":0}},{"type":"Polygon","arcs":[[2456,-2456,-2449,-2445,2457]],"properties":{"id":"24660992","dp":9300,"de":686}},{"type":"Polygon","arcs":[[2458,2459,2460,2461]],"properties":{"id":"24660929","dp":5500,"de":1386}},{"type":"Polygon","arcs":[[2462,2463,2464,2465,-2459,2466,2467]],"properties":{"id":"24660930","dp":3388,"de":0}},{"type":"Polygon","arcs":[[2468,2469,2470,2471,2472,2473,2474]],"properties":{"id":"24660931","dp":2322,"de":601}},{"type":"Polygon","arcs":[[2475,2476,2477,-2463,-2472,2478]],"properties":{"id":"24660932","dp":3414,"de":1386}},{"type":"Polygon","arcs":[[2479,2480,-2479,-2471,2481]],"properties":{"id":"24660933","dp":2989,"de":0}},{"type":"Polygon","arcs":[[-2476,-2481,2482]],"properties":{"id":"24660934","dp":7191,"de":1136}},{"type":"Polygon","arcs":[[2483,2484,2485]],"properties":{"id":"24660953","dp":9161,"de":0}},{"type":"Polygon","arcs":[[2486,2487,2488,-2485,2489,2490,2491]],"properties":{"id":"24660954","dp":3154,"de":632}},{"type":"Polygon","arcs":[[2492,2493,2494,2495,2496,2497]],"properties":{"id":"24660955","dp":2302,"de":4021}},{"type":"Polygon","arcs":[[2498,-2495,2499]],"properties":{"id":"24660956","dp":9854,"de":0}},{"type":"Polygon","arcs":[[-2500,-2494,2500,2501]],"properties":{"id":"24660957","dp":7941,"de":0}},{"type":"Polygon","arcs":[[-2501,-2493,2502,2503,2504]],"properties":{"id":"24660958","dp":5311,"de":1425}},{"type":"Polygon","arcs":[[-2504,2505,2506]],"properties":{"id":"24660959","dp":9409,"de":3935}},{"type":"Polygon","arcs":[[2507,2508,2509,-2506,2510,2511]],"properties":{"id":"24660960","dp":7666,"de":0}},{"type":"Polygon","arcs":[[-2508,2512,2513,2514]],"properties":{"id":"24660961","dp":7663,"de":0}},{"type":"Polygon","arcs":[[-2515,2515,2516,-2509]],"properties":{"id":"24660962","dp":10592,"de":0}},{"type":"Polygon","arcs":[[-2514,2517,2518,-2516]],"properties":{"id":"24660963","dp":17674,"de":0}},{"type":"Polygon","arcs":[[2519,-2510,-2517,-2519,2520,-2432,-2426,2521]],"properties":{"id":"24660964","dp":4929,"de":486}},{"type":"MultiPolygon","arcs":[[[-2502,-2505,-2507,-2520,2522,-2496,-2499]],[[2523,2524,2525]]],"properties":{"id":"24660965","dp":2729,"de":1049}},{"type":"Polygon","arcs":[[2526,2527,2528,2529,2530,2531,2532,2533,2534]],"properties":{"id":"24660993","dp":2196,"de":3472}},{"type":"Polygon","arcs":[[2535,2536,-2532]],"properties":{"id":"24660994","dp":13724,"de":0}},{"type":"Polygon","arcs":[[2537,2538,-2536,-2531]],"properties":{"id":"24660995","dp":10984,"de":0}},{"type":"Polygon","arcs":[[2539,-19,-18,2540,2541]],"properties":{"id":"24660997","dp":12708,"de":0}},{"type":"Polygon","arcs":[[-2541,-17,-11,2542,2543,2544]],"properties":{"id":"24660998","dp":11929,"de":0}},{"type":"Polygon","arcs":[[-2543,-15,-9,2545,2546]],"properties":{"id":"24660999","dp":11446,"de":0}},{"type":"Polygon","arcs":[[-2546,-7,-2,-600,2547,2548]],"properties":{"id":"24661000","dp":5922,"de":1085}},{"type":"Polygon","arcs":[[-2544,-2547,-2549,2549,2550]],"properties":{"id":"24661001","dp":13156,"de":0}},{"type":"Polygon","arcs":[[-2550,-2548,-603,2551,2552,2553,2554]],"properties":{"id":"24661002","dp":10699,"de":0}},{"type":"Polygon","arcs":[[2555,-2552,-602,-41,2556]],"properties":{"id":"24661003","dp":10741,"de":1235}},{"type":"Polygon","arcs":[[2557,2558,2559,2560]],"properties":{"id":"24661114","dp":11867,"de":1264}},{"type":"Polygon","arcs":[[2561,2562,-2558,2563]],"properties":{"id":"24661116","dp":17239,"de":0}},{"type":"Polygon","arcs":[[2564,-2564,2565,2566]],"properties":{"id":"24661117","dp":12894,"de":3728}},{"type":"Polygon","arcs":[[2567,2568,2569,2570,-2567,2571]],"properties":{"id":"24661118","dp":9790,"de":7714}},{"type":"Polygon","arcs":[[2572,2573,-2569,2574,2575]],"properties":{"id":"24661119","dp":9914,"de":5109}},{"type":"Polygon","arcs":[[-2575,-2568,2576,2577,2578]],"properties":{"id":"24661120","dp":9918,"de":1103}},{"type":"Polygon","arcs":[[-2572,2579,2580,2581,-2577]],"properties":{"id":"24661121","dp":8755,"de":5661}},{"type":"Polygon","arcs":[[-2566,-2561,2582,2583,-2580]],"properties":{"id":"24661122","dp":15967,"de":2188}},{"type":"Polygon","arcs":[[-2581,-2584,2584,2585]],"properties":{"id":"24661123","dp":17083,"de":0}},{"type":"Polygon","arcs":[[2586,-2578,-2582,-2586,2587,2588,2589]],"properties":{"id":"24661124","dp":4092,"de":4851}},{"type":"Polygon","arcs":[[2590,2591,2592,-1242,2593,2594]],"properties":{"id":"24661125","dp":5881,"de":3774}},{"type":"Polygon","arcs":[[-2594,-1241,2595]],"properties":{"id":"24661126","dp":9908,"de":1987}},{"type":"Polygon","arcs":[[2596,2597,-2596,-1240,-1238,-1236]],"properties":{"id":"24661127","dp":8756,"de":4166}},{"type":"Polygon","arcs":[[-2595,-2598,2598]],"properties":{"id":"24661128","dp":12551,"de":3497}},{"type":"Polygon","arcs":[[2599,2600,2601,-2599,-2597]],"properties":{"id":"24661129","dp":8860,"de":980}},{"type":"Polygon","arcs":[[2602,2603,-2600,-1235]],"properties":{"id":"24661130","dp":13182,"de":1629}},{"type":"Polygon","arcs":[[2604,2605,2606,-2603,-1234,-1232]],"properties":{"id":"24661131","dp":14178,"de":0}},{"type":"Polygon","arcs":[[2607,-2605,-1231,-1190]],"properties":{"id":"24661132","dp":11372,"de":1395}},{"type":"Polygon","arcs":[[-1189,2608,-2606,-2608]],"properties":{"id":"24661133","dp":10964,"de":1169}},{"type":"Polygon","arcs":[[-1188,2609,2610,2611,2612,-2604,-2607,-2609]],"properties":{"id":"24661134","dp":3930,"de":1008}},{"type":"Polygon","arcs":[[2613,2614,-2477,-2483,2615]],"properties":{"id":"24660935","dp":11908,"de":0}},{"type":"Polygon","arcs":[[-2616,2616,2617,2618,2619]],"properties":{"id":"24660936","dp":10886,"de":0}},{"type":"Polygon","arcs":[[-2618,2620,2621,2622,2623]],"properties":{"id":"24660937","dp":10815,"de":0}},{"type":"Polygon","arcs":[[-2622,2624,2625]],"properties":{"id":"24660938","dp":10205,"de":0}},{"type":"Polygon","arcs":[[-2621,-2617,-2480,2626,-2625]],"properties":{"id":"24660939","dp":7011,"de":1597}},{"type":"Polygon","arcs":[[2627,2628,-2623,-2626,-2627,-2482,-2470,2629,2630,2631]],"properties":{"id":"24660940","dp":1940,"de":3894}},{"type":"Polygon","arcs":[[-2629,2632,2633]],"properties":{"id":"24660941","dp":12602,"de":0}},{"type":"Polygon","arcs":[[2634,2635,2636,2637,-2633,-2628,2638]],"properties":{"id":"24660942","dp":11469,"de":0}},{"type":"Polygon","arcs":[[-2637,2639]],"properties":{"id":"24660943","dp":12692,"de":0}},{"type":"Polygon","arcs":[[-2636,2640,2641,2642,-2619,-2624,-2634,-2638,-2640]],"properties":{"id":"24660944","dp":2821,"de":1634}},{"type":"Polygon","arcs":[[2643,2644,-2642,2645]],"properties":{"id":"24660945","dp":6650,"de":0}},{"type":"Polygon","arcs":[[2646,-2614,-2620,-2643,-2645,2647,-2525]],"properties":{"id":"24660946","dp":5511,"de":0}},{"type":"Polygon","arcs":[[-2648,-2644,2648,2649]],"properties":{"id":"24660947","dp":9716,"de":0}},{"type":"Polygon","arcs":[[-2649,-2646,-2641,-2635,2650,2651]],"properties":{"id":"24660948","dp":9356,"de":737}},{"type":"Polygon","arcs":[[-2526,-2650,-2652,2652,-2487,2653]],"properties":{"id":"24660949","dp":10876,"de":493}},{"type":"Polygon","arcs":[[-2488,-2653,-2651,2654,2655]],"properties":{"id":"24660950","dp":9711,"de":679}},{"type":"Polygon","arcs":[[-2489,-2656,2656,-2486]],"properties":{"id":"24660951","dp":14016,"de":0}},{"type":"Polygon","arcs":[[2657,-103,2658,2659,-34]],"properties":{"id":"24661036","dp":9081,"de":3603}},{"type":"Polygon","arcs":[[2660,2661,2662,-2659,-101]],"properties":{"id":"24661037","dp":12683,"de":0}},{"type":"Polygon","arcs":[[2663,2664,-2660,-2663]],"properties":{"id":"24661038","dp":11284,"de":3142}},{"type":"Polygon","arcs":[[-54,-48,-43,-35,-2665,2665]],"properties":{"id":"24661039","dp":6049,"de":2821}},{"type":"Polygon","arcs":[[2666,-58,-55,-2666,-2664,-2662,2667]],"properties":{"id":"24661040","dp":7503,"de":2654}},{"type":"Polygon","arcs":[[2668,-82,-73,-59,-2667]],"properties":{"id":"24661041","dp":12472,"de":976}},{"type":"Polygon","arcs":[[-2661,-100,-89,-2669,-2668]],"properties":{"id":"24661042","dp":14666,"de":1466}},{"type":"Polygon","arcs":[[-30,2669,2670,-2658,-32]],"properties":{"id":"24661043","dp":13705,"de":797}},{"type":"Polygon","arcs":[[-27,2671,2672,-2670,-29]],"properties":{"id":"24661044","dp":13519,"de":0}},{"type":"Polygon","arcs":[[2673,-2672,-26,-24]],"properties":{"id":"24661045","dp":11781,"de":1224}},{"type":"Polygon","arcs":[[-23,-21,-2317,2674,-94,-102,-2671,-2673,-2674]],"properties":{"id":"24661046","dp":766,"de":510}},{"type":"Polygon","arcs":[[-2521,-2518,-2513,-2512,2675,2676,-2438,-2435]],"properties":{"id":"24660966","dp":2365,"de":909}},{"type":"MultiPolygon","arcs":[[[-2503,-2498,2677,2678,-2676,-2511]],[[2679,2680]]],"properties":{"id":"24660967","dp":3800,"de":740}},{"type":"Polygon","arcs":[[-2677,-2679,2681,2682,2683,-2439]],"properties":{"id":"24660968","dp":8178,"de":3130}},{"type":"Polygon","arcs":[[-2684,2684,2685,-2440]],"properties":{"id":"24660969","dp":14061,"de":2207}},{"type":"Polygon","arcs":[[2686,2687,-2685,2688,2689]],"properties":{"id":"24660970","dp":12500,"de":1190}},{"type":"Polygon","arcs":[[-2437,-2441,-2686,-2688,2690,-2434]],"properties":{"id":"24660971","dp":8921,"de":0}},{"type":"Polygon","arcs":[[-2691,-2687,2691,2692,-2428]],"properties":{"id":"24660972","dp":11556,"de":0}},{"type":"Polygon","arcs":[[-2692,-2690,2693,2694]],"properties":{"id":"24660973","dp":12628,"de":0}},{"type":"Polygon","arcs":[[-2695,2695,2696]],"properties":{"id":"24660974","dp":9657,"de":0}},{"type":"Polygon","arcs":[[-2693,-2697,2697,2698,-2422,-2429]],"properties":{"id":"24660975","dp":12725,"de":0}},{"type":"Polygon","arcs":[[-2699,2699,2700,2701,-2420,-2423]],"properties":{"id":"24660976","dp":5042,"de":2127}},{"type":"Polygon","arcs":[[-2701,2702,2703,2704]],"properties":{"id":"24660977","dp":9210,"de":771}},{"type":"Polygon","arcs":[[2705,-2703,2706,2707,-2452,-2457]],"properties":{"id":"24660978","dp":6021,"de":712}},{"type":"Polygon","arcs":[[2708,2709,2710,2711,2712]],"properties":{"id":"24661071","dp":6304,"de":980}},{"type":"Polygon","arcs":[[2713,-2712,2714,-1982,-1979,2715,2716]],"properties":{"id":"24661072","dp":3038,"de":1041}},{"type":"Polygon","arcs":[[2717,-2713,-2714,2718]],"properties":{"id":"24661073","dp":9224,"de":7613}},{"type":"Polygon","arcs":[[2719,2720,2721,2722]],"properties":{"id":"24661080","dp":106320,"de":7200}},{"type":"Polygon","arcs":[[2723,-2723,2724,2725]],"properties":{"id":"24661081","dp":36742,"de":6285}},{"type":"Polygon","arcs":[[2726,-2726,2727,2728]],"properties":{"id":"24661082","dp":65076,"de":19230}},{"type":"Polygon","arcs":[[2729,-2729,2730,2731,2732]],"properties":{"id":"24661083","dp":10943,"de":4716}},{"type":"Polygon","arcs":[[-2732,2733,2734]],"properties":{"id":"24661084","dp":34946,"de":8776}},{"type":"Polygon","arcs":[[2735,-2734,-2731,-2728,2736,2737]],"properties":{"id":"24661086","dp":1993,"de":14953}},{"type":"Polygon","arcs":[[-2725,2738,-228,2739,-2737]],"properties":{"id":"24661087","dp":14900,"de":24502}},{"type":"Polygon","arcs":[[2740,2741,-229,2742,-2721]],"properties":{"id":"24661093","dp":17007,"de":28346}},{"type":"Polygon","arcs":[[-2722,-2743,-225,-2739]],"properties":{"id":"24661094","dp":71875,"de":25390}},{"type":"Polygon","arcs":[[2743,2744,2745]],"properties":{"id":"24661099","dp":13087,"de":2631}},{"type":"Polygon","arcs":[[-2746,2746,2747,2748,2749,2750,2751,2752]],"properties":{"id":"24661100","dp":6033,"de":9406}},{"type":"Polygon","arcs":[[2753,2754,-2753,2755,2756]],"properties":{"id":"24661102","dp":12857,"de":5869}},{"type":"Polygon","arcs":[[2757,2758,-2754,2759]],"properties":{"id":"24661103","dp":19795,"de":6326}},{"type":"Polygon","arcs":[[2760,2761,2762,-2611]],"properties":{"id":"24661135","dp":9961,"de":701}},{"type":"Polygon","arcs":[[2763,2764,2765,-2762]],"properties":{"id":"24661136","dp":10724,"de":0}},{"type":"Polygon","arcs":[[2766,2767,-2764,-2761,-2610,-1187,-820]],"properties":{"id":"24661137","dp":15317,"de":941}},{"type":"Polygon","arcs":[[2768,-2765,-2768,2769]],"properties":{"id":"24661138","dp":14517,"de":0}},{"type":"Polygon","arcs":[[-215,2770,2771,-2770,-2767,-819,2772,-221,-218]],"properties":{"id":"24661139","dp":11507,"de":4767}},{"type":"Polygon","arcs":[[-2772,2773,2774,-2766,-2769]],"properties":{"id":"24661140","dp":12708,"de":925}},{"type":"Polygon","arcs":[[2775,2776,-2774,2777]],"properties":{"id":"24661141","dp":17060,"de":2027}},{"type":"Polygon","arcs":[[-2777,2778,-2763,-2775]],"properties":{"id":"24661142","dp":6130,"de":0}},{"type":"Polygon","arcs":[[2779,2780,-2778,-2771,-214]],"properties":{"id":"24661143","dp":17058,"de":0}},{"type":"Polygon","arcs":[[2781,2782,2783]],"properties":{"id":"24661318","dp":14343,"de":8838}},{"type":"Polygon","arcs":[[2784,-2783,2785,2786]],"properties":{"id":"24661319","dp":21226,"de":1915}},{"type":"Polygon","arcs":[[2787,2788,2789,-2785,2790,2791,2792]],"properties":{"id":"24661320","dp":6695,"de":9399}},{"type":"Polygon","arcs":[[2793,2794,-2789]],"properties":{"id":"24661321","dp":26318,"de":7692}},{"type":"Polygon","arcs":[[-1356,2795,2796,2797]],"properties":{"id":"24661322","dp":15896,"de":0}},{"type":"Polygon","arcs":[[2798,2799,2800,2801,-2796]],"properties":{"id":"24661323","dp":20628,"de":0}},{"type":"Polygon","arcs":[[2802,-2800,2803,2804]],"properties":{"id":"24661324","dp":10893,"de":0}},{"type":"Polygon","arcs":[[-2801,-2803,2805,2806,2807]],"properties":{"id":"24661325","dp":22913,"de":0}},{"type":"Polygon","arcs":[[2808,-2807,2809]],"properties":{"id":"24661326","dp":22238,"de":0}},{"type":"Polygon","arcs":[[-2810,2810,2811]],"properties":{"id":"24661327","dp":28231,"de":0}},{"type":"Polygon","arcs":[[2812,2813,2814,2815,-2812,2816]],"properties":{"id":"24661328","dp":28682,"de":5574}},{"type":"Polygon","arcs":[[-2816,2817,2818,2819,-2808,-2809]],"properties":{"id":"24661329","dp":20798,"de":6230}},{"type":"Polygon","arcs":[[2820,2821,-2802,-2820]],"properties":{"id":"24661330","dp":19015,"de":4166}},{"type":"Polygon","arcs":[[2822,-2797,-2822,2823,2824]],"properties":{"id":"24661331","dp":15550,"de":0}},{"type":"Polygon","arcs":[[2825,2826,2827,2828,-2824,-2821]],"properties":{"id":"24661332","dp":10467,"de":5632}},{"type":"Polygon","arcs":[[2829,-2826,-2819,2830]],"properties":{"id":"24661333","dp":19484,"de":5357}},{"type":"Polygon","arcs":[[2831,2832,2833,-2831,-2818,-2815]],"properties":{"id":"24661334","dp":1442,"de":44407}},{"type":"Polygon","arcs":[[-2817,-2811,-2806,-2805,2834,2835,2836]],"properties":{"id":"24661335","dp":5345,"de":44384}},{"type":"Polygon","arcs":[[2837,2838,-2837,2839,-1334]],"properties":{"id":"24661336","dp":4168,"de":10743}},{"type":"Polygon","arcs":[[2840,2841,2842,-1324]],"properties":{"id":"24661337","dp":6426,"de":2200}},{"type":"Polygon","arcs":[[-2840,-2836,2843,-1341,-1335]],"properties":{"id":"24661338","dp":11828,"de":0}},{"type":"Polygon","arcs":[[-2799,-1355,-1344,-2844,-2835,-2804]],"properties":{"id":"24661339","dp":14736,"de":827}},{"type":"Polygon","arcs":[[2844,2845,2846,2847]],"properties":{"id":"24661340","dp":10679,"de":2341}},{"type":"Polygon","arcs":[[-2845,2848,2849]],"properties":{"id":"24661341","dp":18819,"de":0}},{"type":"Polygon","arcs":[[-2850,2850,2851]],"properties":{"id":"24661342","dp":25999,"de":0}},{"type":"Polygon","arcs":[[-1360,-2851,2852,2853]],"properties":{"id":"24661343","dp":28256,"de":1153}},{"type":"Polygon","arcs":[[2854,2855,2856,-235,-2853]],"properties":{"id":"24661344","dp":11419,"de":0}},{"type":"Polygon","arcs":[[2857,-2855,-2849]],"properties":{"id":"24661345","dp":10982,"de":0}},{"type":"Polygon","arcs":[[2858,-2856,-2858,-2848,2859,2860,2861]],"properties":{"id":"24661346","dp":10621,"de":2118}},{"type":"Polygon","arcs":[[2862,-236,-2857,-2859,2863]],"properties":{"id":"24661347","dp":12509,"de":1636}},{"type":"Polygon","arcs":[[-2612,-2779,-2776,-2781,2864,2865,2866,2867,2868,-78,-84,-96,2869,2870,2871]],"properties":{"id":"24661047","dp":662,"de":1474}},{"type":"Polygon","arcs":[[2872,2873,2874,2875,2876,2877,2878]],"properties":{"id":"24661048","dp":10641,"de":1368}},{"type":"Polygon","arcs":[[2879,-2877,2880,2881]],"properties":{"id":"24661049","dp":15948,"de":0}},{"type":"Polygon","arcs":[[-2876,2882,2883,2884,-2881]],"properties":{"id":"24661050","dp":7888,"de":4583}},{"type":"Polygon","arcs":[[2885,2886,-2884,2887,2888,2889,2890,2891]],"properties":{"id":"24661051","dp":7705,"de":4329}},{"type":"Polygon","arcs":[[-2882,-2885,-2887,2892,2893]],"properties":{"id":"24661052","dp":10079,"de":1888}},{"type":"Polygon","arcs":[[-2893,-2886,2894,2895]],"properties":{"id":"24661053","dp":15918,"de":4373}},{"type":"Polygon","arcs":[[-2878,-2880,-2894,-2896,2896,2897]],"properties":{"id":"24661054","dp":4683,"de":3448}},{"type":"Polygon","arcs":[[-2897,2898,2899,2900,2901,2902,2903,-2573,2904]],"properties":{"id":"24661055","dp":5696,"de":7172}},{"type":"Polygon","arcs":[[2905,2906,2907,2908,2909,-2900,2910]],"properties":{"id":"24661058","dp":8016,"de":4474}},{"type":"Polygon","arcs":[[2911,-2908]],"properties":{"id":"24661059","dp":21576,"de":2717}},{"type":"Polygon","arcs":[[-2909,-2912,-2907,2912,2913,2914]],"properties":{"id":"24661060","dp":8331,"de":9517}},{"type":"Polygon","arcs":[[2915,2916,2917,2918]],"properties":{"id":"24660668","dp":18577,"de":0}},{"type":"Polygon","arcs":[[-2918,2919,2920,2921,2922]],"properties":{"id":"24660669","dp":10729,"de":5208}},{"type":"Polygon","arcs":[[2923,2924,-2921,2925]],"properties":{"id":"24660670","dp":32008,"de":0}},{"type":"Polygon","arcs":[[2926,2927,-2924,2928]],"properties":{"id":"24660671","dp":33656,"de":0}},{"type":"Polygon","arcs":[[2929,2930,-2927,2931]],"properties":{"id":"24660672","dp":20829,"de":2183}},{"type":"Polygon","arcs":[[2932,2933,-2930,2934]],"properties":{"id":"24660673","dp":19867,"de":0}},{"type":"Polygon","arcs":[[-2793,2935,2936,2937,2938,-929,-923,-919,2939,2940]],"properties":{"id":"24660676","dp":2074,"de":4783}},{"type":"Polygon","arcs":[[2941,-2934,2942,-2936,-2792]],"properties":{"id":"24660677","dp":7771,"de":3762}},{"type":"Polygon","arcs":[[-2942,-2791,2943,-2931]],"properties":{"id":"24660678","dp":41397,"de":0}},{"type":"Polygon","arcs":[[-2944,-2787,2944,-2928]],"properties":{"id":"24660679","dp":25133,"de":0}},{"type":"Polygon","arcs":[[-2925,-2945,2945]],"properties":{"id":"24660680","dp":17854,"de":0}},{"type":"Polygon","arcs":[[2946,-2922,-2946,-2786,2947,-2825,-2829]],"properties":{"id":"24660681","dp":12996,"de":1167}},{"type":"Polygon","arcs":[[-2923,-2947,-2828,2948]],"properties":{"id":"24660682","dp":8995,"de":0}},{"type":"Polygon","arcs":[[2949,-2919,-2949,-2827]],"properties":{"id":"24660683","dp":17903,"de":0}},{"type":"Polygon","arcs":[[2950,-2950,-2830,2951]],"properties":{"id":"24660684","dp":25898,"de":0}},{"type":"Polygon","arcs":[[2952,2953,-2952,-2834]],"properties":{"id":"24660685","dp":26000,"de":0}},{"type":"Polygon","arcs":[[2954,-231,-2760,-2757,2955,2956,2957,-1310,2958]],"properties":{"id":"24661104","dp":6626,"de":56553}},{"type":"Polygon","arcs":[[2959,-2740,-227,-2955]],"properties":{"id":"24661105","dp":14474,"de":80365}},{"type":"Polygon","arcs":[[2960,2961,-2738,-2960,-2959,-1309,2962,2963]],"properties":{"id":"24661106","dp":3120,"de":61103}},{"type":"Polygon","arcs":[[2964,2965,2966,2967]],"properties":{"id":"24661108","dp":11387,"de":1438}},{"type":"Polygon","arcs":[[-2589,2968,2969,-2965]],"properties":{"id":"24661109","dp":19050,"de":0}},{"type":"Polygon","arcs":[[-2583,2970,2971,-2969,-2588,-2585]],"properties":{"id":"24661110","dp":11532,"de":4125}},{"type":"Polygon","arcs":[[-2972,2972,2973]],"properties":{"id":"24661111","dp":18640,"de":3236}},{"type":"Polygon","arcs":[[2974,-242,2975,-175]],"properties":{"id":"24663212","dp":18537,"de":1679}},{"type":"Polygon","arcs":[[-178,-2976,2976,-202,-232]],"properties":{"id":"24663213","dp":8255,"de":0}},{"type":"Polygon","arcs":[[-241,2977,2978,-203,-2977]],"properties":{"id":"24663214","dp":12494,"de":4880}},{"type":"MultiPolygon","arcs":[[[2979,2980,2981,2982]],[[2983]],[[2984,2985,2986,2987,2988]]],"properties":{"id":"24663067","dp":259,"de":112}},{"type":"Polygon","arcs":[[-2953,-2833,2989,2990]],"properties":{"id":"24660686","dp":8668,"de":1815}},{"type":"Polygon","arcs":[[2991,2992,-2991,2993]],"properties":{"id":"24660687","dp":22923,"de":10073}},{"type":"Polygon","arcs":[[2994,2995,2996,-2990]],"properties":{"id":"24660688","dp":20687,"de":0}},{"type":"Polygon","arcs":[[2997,-2996,2998,2999]],"properties":{"id":"24660689","dp":29575,"de":0}},{"type":"Polygon","arcs":[[3000,-3000,3001,3002]],"properties":{"id":"24660690","dp":12919,"de":0}},{"type":"Polygon","arcs":[[-3003,3003,3004,3005,3006]],"properties":{"id":"24660691","dp":5439,"de":20443}},{"type":"Polygon","arcs":[[-3004,-3002,-2999,3007,3008]],"properties":{"id":"24660692","dp":11088,"de":3901}},{"type":"Polygon","arcs":[[-3008,-2995,-2832,3009]],"properties":{"id":"24660693","dp":22857,"de":14285}},{"type":"Polygon","arcs":[[3010,-3009,-3010,-2814,3011]],"properties":{"id":"24660694","dp":22350,"de":14035}},{"type":"Polygon","arcs":[[3012,-3012,-2813,-2839]],"properties":{"id":"24660695","dp":20388,"de":1124}},{"type":"Polygon","arcs":[[3013,-3005,-3011,-3013,3014,3015]],"properties":{"id":"24660696","dp":24400,"de":5555}},{"type":"Polygon","arcs":[[-3015,-2838,-1325,-2843]],"properties":{"id":"24660697","dp":15011,"de":4231}},{"type":"Polygon","arcs":[[3016,-3016,-2842]],"properties":{"id":"24660698","dp":21565,"de":10869}},{"type":"Polygon","arcs":[[3017,-3006,-3014,-3017,-2841,-1323,3018]],"properties":{"id":"24660699","dp":6191,"de":8508}},{"type":"Polygon","arcs":[[3019,-3019,-1322,3020,3021,3022]],"properties":{"id":"24660700","dp":15954,"de":22330}},{"type":"Polygon","arcs":[[-3022,3023,3024]],"properties":{"id":"24660701","dp":33450,"de":0}},{"type":"MultiPolygon","arcs":[[[3025,3026,3027,3028,3029,3030,-2866]],[[3031,-2868,3032]]],"properties":{"id":"24661184","dp":4169,"de":2953}},{"type":"Polygon","arcs":[[-3029,3033,3034]],"properties":{"id":"24661185","dp":12280,"de":1253}},{"type":"Polygon","arcs":[[-79,-2869,3035,-67,-72]],"properties":{"id":"24661187","dp":9794,"de":940}},{"type":"MultiPolygon","arcs":[[[3036,3037,3038,3039,3040,3041,3042]],[[3043,-69,3044,3045]]],"properties":{"id":"24661189","dp":6727,"de":727}},{"type":"MultiPolygon","arcs":[[[3046,3047,3048,3049,3050,-3037]],[[3051,-63,-3044,3052]]],"properties":{"id":"24661190","dp":8156,"de":1633}},{"type":"Polygon","arcs":[[3053,3054,3055,3056,3057]],"properties":{"id":"24663180","dp":2415,"de":686}},{"type":"Polygon","arcs":[[-3056,3058,3059,3060,3061,3062]],"properties":{"id":"24663181","dp":3183,"de":1018}},{"type":"Polygon","arcs":[[3063,3064,-1509,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074]],"properties":{"id":"24663182","dp":1077,"de":1517}},{"type":"Polygon","arcs":[[3075,-3075]],"properties":{"id":"24663183","dp":5428,"de":877}},{"type":"Polygon","arcs":[[3076,3077,3078,3079,3080,3081,3082]],"properties":{"id":"24663057","dp":593,"de":78}},{"type":"Polygon","arcs":[[3083,3084,3085,-3078]],"properties":{"id":"24663058","dp":2857,"de":312}},{"type":"Polygon","arcs":[[3086,3087,3088,3089,-3080,3090]],"properties":{"id":"24663059","dp":2379,"de":437}},{"type":"Polygon","arcs":[[3091,3092,-3088,3093]],"properties":{"id":"24663060","dp":2919,"de":0}},{"type":"Polygon","arcs":[[3094,-3089,-3093,3095]],"properties":{"id":"24663061","dp":3187,"de":250}},{"type":"Polygon","arcs":[[3096,3097,3098,-3090,-3095]],"properties":{"id":"24663062","dp":2804,"de":0}},{"type":"Polygon","arcs":[[3099,3100,-2986,3101,-2983,3102,3103]],"properties":{"id":"24663068","dp":126,"de":44}},{"type":"Polygon","arcs":[[-2538,-2530,3104,-703,-2320,3105,3106,-2312,-20,-2540,3107]],"properties":{"id":"24663306","dp":8248,"de":513}},{"type":"Polygon","arcs":[[3108,-1073,3109,3110,3111,3112,3113,-2053,3114,3115,3116,3117,3118,-930,-2939]],"properties":{"id":"24663311","dp":1255,"de":2169}},{"type":"Polygon","arcs":[[3119,-346,-344,-359,-245,-625,3120]],"properties":{"id":"24663314","dp":3789,"de":3877}},{"type":"Polygon","arcs":[[3121,3122,3123,3124,3125,3126,3127,3128]],"properties":{"id":"24663263","dp":4368,"de":4448}},{"type":"Polygon","arcs":[[3129,3130,3131,3132,3133]],"properties":{"id":"24663264","dp":14594,"de":900}},{"type":"Polygon","arcs":[[3134,3135,3136,3137]],"properties":{"id":"24663266","dp":11922,"de":0}},{"type":"Polygon","arcs":[[3138,3139,3140,3141,3142,-3098]],"properties":{"id":"24663063","dp":2789,"de":699}},{"type":"Polygon","arcs":[[3143,3144,-2987,-3101,3145,3146,-3141]],"properties":{"id":"24663064","dp":2965,"de":860}},{"type":"Polygon","arcs":[[-3144,-3140,3147]],"properties":{"id":"24663065","dp":5767,"de":0}},{"type":"Polygon","arcs":[[-2988,-3145,-3148,-3139,3148,3149]],"properties":{"id":"24663066","dp":1821,"de":738}},{"type":"Polygon","arcs":[[3150,-2980,-3102,-2985]],"properties":{"id":"24663069","dp":492,"de":40}},{"type":"Polygon","arcs":[[-3146,-3100,3151,3152,3153]],"properties":{"id":"24663070","dp":2795,"de":0}},{"type":"Polygon","arcs":[[-3154,3154,3155,-3142,-3147]],"properties":{"id":"24663071","dp":2994,"de":0}},{"type":"Polygon","arcs":[[-3153,3156,3157,-3155]],"properties":{"id":"24663072","dp":3381,"de":344}},{"type":"Polygon","arcs":[[-3143,-3156,-3158,3158,-3081,-3099]],"properties":{"id":"24663073","dp":2370,"de":1312}},{"type":"Polygon","arcs":[[-3082,-3159,-3157,-3152,-3104,3159,3160,3161]],"properties":{"id":"24663074","dp":338,"de":51}},{"type":"Polygon","arcs":[[3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,3177]],"properties":{"id":"24663334","dp":0,"de":983}},{"type":"Polygon","arcs":[[3178,3179,3180,3181]],"properties":{"id":"24660010","dp":3254,"de":395}},{"type":"Polygon","arcs":[[-2290,-2295,3182,3183,3184]],"properties":{"id":"24660250","dp":15885,"de":0}},{"type":"Polygon","arcs":[[-3185,3185,3186,-2291]],"properties":{"id":"24660251","dp":18471,"de":2159}},{"type":"Polygon","arcs":[[-3187,3187,3188,-2283]],"properties":{"id":"24660252","dp":12673,"de":1157}},{"type":"Polygon","arcs":[[-3188,-3186,-3184,3189,-1906,-1909,-1911,3190,3191]],"properties":{"id":"24660253","dp":4949,"de":2626}},{"type":"Polygon","arcs":[[-3192,3192,3193,3194]],"properties":{"id":"24660254","dp":12413,"de":2337}},{"type":"Polygon","arcs":[[-3189,-3195,-2266,-2277]],"properties":{"id":"24660255","dp":13650,"de":0}},{"type":"Polygon","arcs":[[3195,3196,-222,-2773,-818]],"properties":{"id":"24661147","dp":16692,"de":3359}},{"type":"Polygon","arcs":[[-813,3197,-3196,-817]],"properties":{"id":"24661148","dp":7286,"de":28963}},{"type":"Polygon","arcs":[[-223,-3197,-3198,3198]],"properties":{"id":"24661149","dp":12032,"de":5954}},{"type":"Polygon","arcs":[[3199,3200,3201,-224,-3199,-812]],"properties":{"id":"24661150","dp":8940,"de":10433}},{"type":"Polygon","arcs":[[3202,3203,-3200,-811]],"properties":{"id":"24661151","dp":10386,"de":2976}},{"type":"Polygon","arcs":[[3204,3205,-3203,-809]],"properties":{"id":"24661152","dp":16071,"de":1488}},{"type":"Polygon","arcs":[[3206,3207,-3205,-806]],"properties":{"id":"24661153","dp":15435,"de":4054}},{"type":"Polygon","arcs":[[3208,3209,3210,3211,-306,-295,-291,3212]],"properties":{"id":"24660082","dp":7922,"de":1243}},{"type":"Polygon","arcs":[[3213,-3213,-290,-288,-283]],"properties":{"id":"24660083","dp":7790,"de":843}},{"type":"Polygon","arcs":[[3214,3215,-3209,-3214,-282,3216]],"properties":{"id":"24660084","dp":8822,"de":0}},{"type":"Polygon","arcs":[[3217,3218,3219,3220,-3217,-281,3221]],"properties":{"id":"24660085","dp":9453,"de":1045}},{"type":"Polygon","arcs":[[3222,3223,3224,-3220]],"properties":{"id":"24660086","dp":12280,"de":0}},{"type":"Polygon","arcs":[[3225,-3223,-3219,3226]],"properties":{"id":"24660087","dp":20078,"de":0}},{"type":"Polygon","arcs":[[3227,-3224,-3226,3228,3229]],"properties":{"id":"24660088","dp":19234,"de":0}},{"type":"MultiPolygon","arcs":[[[3230,3231,3232,3233,3234,3235,3236,-3050,3237]],[[3238,3239,3240,3241,-3052,3242]]],"properties":{"id":"24661191","dp":5217,"de":395}},{"type":"Polygon","arcs":[[3243,-3231,3244,3245]],"properties":{"id":"24661192","dp":10329,"de":3047}},{"type":"Polygon","arcs":[[3246,-3232,-3244,3247]],"properties":{"id":"24661193","dp":14310,"de":2155}},{"type":"Polygon","arcs":[[3248,-3233,-3247,3249,3250]],"properties":{"id":"24661194","dp":10312,"de":780}},{"type":"Polygon","arcs":[[3251,-3234,-3249,3252,3253]],"properties":{"id":"24661195","dp":7338,"de":1778}},{"type":"Polygon","arcs":[[3254,3255,3256,-3235,-3252,3257]],"properties":{"id":"24661196","dp":6634,"de":437}},{"type":"Polygon","arcs":[[3258,3259,3260,3261,3262,-3256]],"properties":{"id":"24661197","dp":10199,"de":1268}},{"type":"Polygon","arcs":[[3263,3264,-3262,3265]],"properties":{"id":"24661198","dp":11922,"de":915}},{"type":"Polygon","arcs":[[3266,3267,-3266,-3261]],"properties":{"id":"24661199","dp":13511,"de":1272}},{"type":"Polygon","arcs":[[3268,3269,3270,3271,-3268,3272]],"properties":{"id":"24661200","dp":7638,"de":0}},{"type":"Polygon","arcs":[[3273,3274,-3271,3275]],"properties":{"id":"24661201","dp":12803,"de":0}},{"type":"Polygon","arcs":[[3276,-3264,-3272,-3275]],"properties":{"id":"24661202","dp":10665,"de":0}},{"type":"Polygon","arcs":[[3277,3278,-354,3279]],"properties":{"id":"24660108","dp":12724,"de":0}},{"type":"Polygon","arcs":[[-1988,-831,-834,-184,-193,3280,3281]],"properties":{"id":"24663184","dp":2621,"de":2323}},{"type":"Polygon","arcs":[[-3282,3282,-1976,-1984,-1989]],"properties":{"id":"24663185","dp":4750,"de":1246}},{"type":"Polygon","arcs":[[-3283,-3281,-198,3283,3284,3285,-1977]],"properties":{"id":"24663186","dp":4383,"de":757}},{"type":"Polygon","arcs":[[3286,3287,-1967,-3286]],"properties":{"id":"24663187","dp":2962,"de":1234}},{"type":"Polygon","arcs":[[3288,-3287,-3285,3289,3290]],"properties":{"id":"24663188","dp":4195,"de":394}},{"type":"Polygon","arcs":[[-3290,3291,3292]],"properties":{"id":"24663189","dp":14500,"de":0}},{"type":"Polygon","arcs":[[-3284,-197,-208,3293,-3292]],"properties":{"id":"24663190","dp":11452,"de":1085}},{"type":"Polygon","arcs":[[3294,3295,-3291]],"properties":{"id":"24663191","dp":16375,"de":0}},{"type":"Polygon","arcs":[[3296,3297,3298,3299,3300,3301,3302]],"properties":{"id":"24663194","dp":6012,"de":1831}},{"type":"Polygon","arcs":[[-3298,3303,3304,3305]],"properties":{"id":"24663195","dp":20000,"de":0}},{"type":"Polygon","arcs":[[3306,3307,3308,-3299,-3306,3309,3310]],"properties":{"id":"24663196","dp":6317,"de":5079}},{"type":"Polygon","arcs":[[3311,-3310,-3305,3312,-210]],"properties":{"id":"24663197","dp":8346,"de":0}},{"type":"Polygon","arcs":[[-204,-2979,3313,-3311,-3312,-209]],"properties":{"id":"24663198","dp":10715,"de":6769}},{"type":"Polygon","arcs":[[-3314,-2978,3314,-114,3315,-3307]],"properties":{"id":"24663199","dp":7392,"de":12541}},{"type":"Polygon","arcs":[[-113,-695,-3308,-3316]],"properties":{"id":"24663200","dp":12563,"de":2689}},{"type":"Polygon","arcs":[[3316,-115,-3315,-240]],"properties":{"id":"24663201","dp":6288,"de":8951}},{"type":"Polygon","arcs":[[3317,3318,-116,-3317,-239]],"properties":{"id":"24663202","dp":11703,"de":3548}},{"type":"Polygon","arcs":[[3319,-127,-117,-3319,3320]],"properties":{"id":"24663203","dp":34809,"de":4761}},{"type":"Polygon","arcs":[[-128,-3320,3321,3322,3323,3324]],"properties":{"id":"24663204","dp":9533,"de":0}},{"type":"Polygon","arcs":[[-3322,-3321,-3318,-238,3325,3326]],"properties":{"id":"24663205","dp":17491,"de":2920}},{"type":"Polygon","arcs":[[-3323,-3327,3327,3328]],"properties":{"id":"24663206","dp":26118,"de":7805}},{"type":"Polygon","arcs":[[3329,-3328,-3326,-244,3330,-173]],"properties":{"id":"24663207","dp":17308,"de":0}},{"type":"Polygon","arcs":[[-161,3331,3332,-3324,-3329,-3330,-172,-164]],"properties":{"id":"24663208","dp":11967,"de":1083}},{"type":"Polygon","arcs":[[-804,3333,3334,-3207]],"properties":{"id":"24661154","dp":13961,"de":2759}},{"type":"Polygon","arcs":[[-802,3335,3336,-3334]],"properties":{"id":"24661155","dp":21612,"de":2764}},{"type":"Polygon","arcs":[[-800,3337,3338,-3336]],"properties":{"id":"24661156","dp":22321,"de":4241}},{"type":"Polygon","arcs":[[3339,3340,-3338,-798]],"properties":{"id":"24661157","dp":19493,"de":0}},{"type":"Polygon","arcs":[[3341,3342,-3340,-796]],"properties":{"id":"24661158","dp":18669,"de":4935}},{"type":"Polygon","arcs":[[3343,3344,-3342,-795]],"properties":{"id":"24661159","dp":14922,"de":2519}},{"type":"Polygon","arcs":[[3345,3346,-3344,-787]],"properties":{"id":"24661160","dp":15663,"de":3763}},{"type":"Polygon","arcs":[[3347,3348,-3346,-785]],"properties":{"id":"24661161","dp":9785,"de":2412}},{"type":"Polygon","arcs":[[3349,3350,3351,-3348,-784]],"properties":{"id":"24661162","dp":13058,"de":1106}},{"type":"Polygon","arcs":[[3352,3353,3354,-3350,-783]],"properties":{"id":"24661163","dp":16531,"de":0}},{"type":"Polygon","arcs":[[3355,3356,-3353,-782,3357]],"properties":{"id":"24661164","dp":16909,"de":0}},{"type":"Polygon","arcs":[[3358,3359,-3356,3360]],"properties":{"id":"24661165","dp":10887,"de":1380}},{"type":"Polygon","arcs":[[3361,-3255,3362,-3361,-3358,-781,3363,3364]],"properties":{"id":"24661166","dp":5202,"de":1692}},{"type":"Polygon","arcs":[[-3258,3365,-3363]],"properties":{"id":"24661167","dp":15246,"de":0}},{"type":"Polygon","arcs":[[-3366,-3254,3366,-3359]],"properties":{"id":"24661168","dp":13460,"de":0}},{"type":"Polygon","arcs":[[-3367,-3253,-3251,3367,-3357,-3360]],"properties":{"id":"24661169","dp":15337,"de":1533}},{"type":"Polygon","arcs":[[-3368,-3250,3368,-3354]],"properties":{"id":"24661170","dp":23842,"de":0}},{"type":"Polygon","arcs":[[-3369,-3248,-3246,3369,-3351,-3355]],"properties":{"id":"24661171","dp":14472,"de":3140}},{"type":"Polygon","arcs":[[-3370,-3245,-3238,-3049,3370,-3349,-3352]],"properties":{"id":"24661172","dp":9834,"de":1731}},{"type":"Polygon","arcs":[[-3371,-3048,3371,-3347]],"properties":{"id":"24661173","dp":13832,"de":3310}},{"type":"Polygon","arcs":[[-3372,-3047,3372,-3345]],"properties":{"id":"24661174","dp":21274,"de":3861}},{"type":"Polygon","arcs":[[-3373,-3043,3373,-3343]],"properties":{"id":"24661175","dp":19230,"de":0}},{"type":"Polygon","arcs":[[-3374,-3042,3374,-3341]],"properties":{"id":"24661176","dp":21751,"de":0}},{"type":"Polygon","arcs":[[-3339,-3375,-3041,3375]],"properties":{"id":"24661177","dp":21036,"de":0}},{"type":"Polygon","arcs":[[-3376,-3040,3376,-3335,-3337]],"properties":{"id":"24661178","dp":6833,"de":3742}},{"type":"Polygon","arcs":[[-3377,3377,3378,-3206,-3208]],"properties":{"id":"24661179","dp":14724,"de":1862}},{"type":"Polygon","arcs":[[-3379,3379,3380,-3204]],"properties":{"id":"24661180","dp":23074,"de":0}},{"type":"Polygon","arcs":[[3381,3382,3383,3384,-3201,-3381]],"properties":{"id":"24661181","dp":18403,"de":2409}},{"type":"Polygon","arcs":[[3385,-3027,3386,-3384]],"properties":{"id":"24661182","dp":11259,"de":1358}},{"type":"Polygon","arcs":[[3387,-3034,-3028,-3386,-3383]],"properties":{"id":"24661183","dp":18908,"de":1649}},{"type":"Polygon","arcs":[[-2744,-2755,-2759,3388]],"properties":{"id":"24663246","dp":31756,"de":5620}},{"type":"Polygon","arcs":[[-1307,-1292,-1284,-1282]],"properties":{"id":"24663249","dp":47225,"de":5161}},{"type":"Polygon","arcs":[[3389,3390,3391,3392,3393]],"properties":{"id":"24663250","dp":12063,"de":3798}},{"type":"Polygon","arcs":[[3394,3395,3396,3397,3398]],"properties":{"id":"24663251","dp":11937,"de":0}},{"type":"Polygon","arcs":[[3399,-1105,-2404,-597,3400]],"properties":{"id":"24663252","dp":26443,"de":1408}},{"type":"Polygon","arcs":[[3401,3402,3403,3404,3405,3406,3407,3408,3409,3410]],"properties":{"id":"24663253","dp":13664,"de":1865}},{"type":"MultiPolygon","arcs":[[[-3274,3411,3412,3413,-3277]],[[3414,-2553,-2556,3415,3416]]],"properties":{"id":"24661203","dp":9063,"de":0}},{"type":"MultiPolygon","arcs":[[[3417,-3236,-3257,-3263,-3265,-3414]],[[3418,-3416,-3239]]],"properties":{"id":"24661204","dp":3052,"de":1081}},{"type":"Polygon","arcs":[[3419,-3240,-2557,-40,-45]],"properties":{"id":"24661205","dp":5939,"de":0}},{"type":"Polygon","arcs":[[-3420,-44,-51,3420,-3241]],"properties":{"id":"24661206","dp":6356,"de":550}},{"type":"Polygon","arcs":[[-53,-64,-3242,-3421]],"properties":{"id":"24661207","dp":10224,"de":0}},{"type":"MultiPolygon","arcs":[[[3421,3422,3423,3424,3425,-3412,-3276,-3270,3426]],[[3427,-2554,-3415,3428]]],"properties":{"id":"24661208","dp":295,"de":1732}},{"type":"Polygon","arcs":[[-3273,-3267,3429,3430,-3365,3431]],"properties":{"id":"24661209","dp":5475,"de":356}},{"type":"Polygon","arcs":[[-3260,3432,-3430]],"properties":{"id":"24661210","dp":15641,"de":0}},{"type":"Polygon","arcs":[[-3431,-3433,-3259,-3362]],"properties":{"id":"24661211","dp":12188,"de":4716}},{"type":"Polygon","arcs":[[3433,3434,-1166,-1180,-1183]],"properties":{"id":"24661212","dp":4038,"de":622}},{"type":"Polygon","arcs":[[3435,3436,3437,3438,3439,3440]],"properties":{"id":"24663269","dp":1061,"de":3255}},{"type":"Polygon","arcs":[[3441,3442,3443,3444,3445,3446,3447,3448,3449]],"properties":{"id":"24663270","dp":7341,"de":307}},{"type":"Polygon","arcs":[[-3408,3450,3451,3452,3453,3454,3455,3456,3457,3458]],"properties":{"id":"24663271","dp":2233,"de":11596}},{"type":"Polygon","arcs":[[-2933,3459,-2937,-2943]],"properties":{"id":"24663273","dp":19587,"de":976}},{"type":"Polygon","arcs":[[-1352,-1354,-2854,3460]],"properties":{"id":"24663274","dp":27500,"de":1973}},{"type":"Polygon","arcs":[[-3020,3461,-3295,-3293,-3294,-212,3462,3463,-3007,-3018]],"properties":{"id":"24663275","dp":4884,"de":10149}},{"type":"Polygon","arcs":[[3464,3465,3466]],"properties":{"id":"24663276","dp":12939,"de":0}},{"type":"Polygon","arcs":[[-152,3467,-3332,-160,-157]],"properties":{"id":"24663209","dp":9659,"de":810}},{"type":"Polygon","arcs":[[-133,-124,-3325,-3333,-3468]],"properties":{"id":"24663210","dp":10178,"de":1002}},{"type":"Polygon","arcs":[[-3331,-243,-2975,-174]],"properties":{"id":"24663211","dp":9648,"de":3079}},{"type":"Polygon","arcs":[[-2184,-2180,3468,3469,3470,3471]],"properties":{"id":"24663288","dp":4980,"de":1679}},{"type":"Polygon","arcs":[[-2895,-2892,3472,-2911,-2899]],"properties":{"id":"24663289","dp":8868,"de":2340}},{"type":"MultiPolygon","arcs":[[[3473,-3030,-3035,-3388,-3382,-3380,-3378,-3039]],[[-3045,-68,-3036,-3032,3474]]],"properties":{"id":"24663290","dp":6596,"de":3206}},{"type":"Polygon","arcs":[[3475,3476]],"properties":{"id":"24663291","dp":16843,"de":0}},{"type":"Polygon","arcs":[[3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488]],"properties":{"id":"24663292","dp":424,"de":759}},{"type":"Polygon","arcs":[[3489,3490,3491,3492,3493,3494,3495]],"properties":{"id":"24663293","dp":3039,"de":13093}},{"type":"Polygon","arcs":[[3496,3497,3498,3499,3500,3501]],"properties":{"id":"24663294","dp":3803,"de":0}},{"type":"Polygon","arcs":[[3502,3503,3504,3505]],"properties":{"id":"24663295","dp":3273,"de":1243}},{"type":"Polygon","arcs":[[3506,3507,3508,3509,3510,3511,3512]],"properties":{"id":"24663296","dp":10980,"de":0}},{"type":"Polygon","arcs":[[3513,3514,3515,3516,3517,3518,3519]],"properties":{"id":"24663297","dp":4062,"de":3647}},{"type":"Polygon","arcs":[[3520,-1611,3521,3522]],"properties":{"id":"24663298","dp":10290,"de":431}},{"type":"Polygon","arcs":[[-3134,3523,3524,3525]],"properties":{"id":"24663299","dp":20633,"de":2816}},{"type":"Polygon","arcs":[[3526,-1007,-1014,-1015,-1012,3527]],"properties":{"id":"24663254","dp":8178,"de":1468}},{"type":"Polygon","arcs":[[3528,-3434,-1182,-1185,-1004,-1176,-1005,-3527]],"properties":{"id":"24663255","dp":13213,"de":1348}},{"type":"Polygon","arcs":[[-2151,-2153,-2155,-2148,-2131,-2128,-2118,-1941,3529,3530,3531,-2156]],"properties":{"id":"24663256","dp":2761,"de":842}},{"type":"Polygon","arcs":[[-2914,3532,3533,3534,3535,3536,3537,3538,3539]],"properties":{"id":"24663257","dp":2943,"de":5095}},{"type":"Polygon","arcs":[[3540,3541,3542,3543,3544,-3537]],"properties":{"id":"24663258","dp":19200,"de":5619}},{"type":"Polygon","arcs":[[3545,-2054,-2048,-2059,-2056]],"properties":{"id":"24663259","dp":19775,"de":1810}},{"type":"Polygon","arcs":[[-1816,-2325,3546,3547,-2033,-1820]],"properties":{"id":"24663260","dp":5799,"de":302}},{"type":"Polygon","arcs":[[3548,-943,3549,3550,3551,3552,3553]],"properties":{"id":"24663261","dp":10430,"de":2822}},{"type":"Polygon","arcs":[[3554,3555,3556,3557,3558]],"properties":{"id":"24663262","dp":21363,"de":1420}},{"type":"Polygon","arcs":[[3559,3560,3561,3562]],"properties":{"id":"24663277","dp":11305,"de":1820}},{"type":"Polygon","arcs":[[-993,-1025,-984]],"properties":{"id":"24663278","dp":41141,"de":6974}},{"type":"Polygon","arcs":[[-3472,3563,3564,-2182]],"properties":{"id":"24663279","dp":24677,"de":2263}},{"type":"Polygon","arcs":[[3565,-3470,3566,-2039,-2051]],"properties":{"id":"24663280","dp":5196,"de":4803}},{"type":"Polygon","arcs":[[3567,3568,3569,3570,3571,3572,3573,3574]],"properties":{"id":"24663281","dp":12352,"de":5560}},{"type":"Polygon","arcs":[[3575,-1626,3576,3577,3578,3579,3580,3581,3582,3583]],"properties":{"id":"24663282","dp":403,"de":1720}},{"type":"Polygon","arcs":[[3584,-2255,-2258,-2270,-2263,-2247,-2251]],"properties":{"id":"24663283","dp":14097,"de":2115}},{"type":"Polygon","arcs":[[-1664,3585,3586,3587,-1650,-1655,-1657,3588,-1660]],"properties":{"id":"24663284","dp":5898,"de":454}},{"type":"Polygon","arcs":[[3589,3590,3591,3592,3593,3594,3595]],"properties":{"id":"24663285","dp":4915,"de":722}},{"type":"Polygon","arcs":[[-180,-190,-188]],"properties":{"id":"24663286","dp":14516,"de":3151}},{"type":"Polygon","arcs":[[-840,-186,-837,3596]],"properties":{"id":"24663287","dp":9080,"de":3738}},{"type":"Polygon","arcs":[[3597,-3526,3598,3599]],"properties":{"id":"24663300","dp":4306,"de":7142}},{"type":"Polygon","arcs":[[3600,3601,3602,3603,3604,3605,3606]],"properties":{"id":"24663301","dp":5000,"de":874}},{"type":"Polygon","arcs":[[-3598,3607,3608,-3603,3609,3610,3611,3612,-3130]],"properties":{"id":"24663302","dp":2740,"de":3662}},{"type":"Polygon","arcs":[[-2319,-2314,3613,-3106]],"properties":{"id":"24663304","dp":4222,"de":1674}},{"type":"Polygon","arcs":[[-3614,-2313,-3107]],"properties":{"id":"24663305","dp":11317,"de":0}},{"type":"Polygon","arcs":[[-3182,3614,3615,3616]],"properties":{"id":"24660011","dp":3302,"de":512}},{"type":"Polygon","arcs":[[3617,3618,3619,3620,3621,3622,-1126,3623,-1124,-1133,-3616]],"properties":{"id":"24660012","dp":1821,"de":144}},{"type":"Polygon","arcs":[[3624,-3618,3625]],"properties":{"id":"24660013","dp":5428,"de":0}},{"type":"Polygon","arcs":[[3626,-3621,3627,-3619,-3625]],"properties":{"id":"24660014","dp":4686,"de":0}},{"type":"Polygon","arcs":[[-3620,-3628]],"properties":{"id":"24660015","dp":16000,"de":0}},{"type":"Polygon","arcs":[[-1125,-3624]],"properties":{"id":"24660016","dp":7637,"de":0}},{"type":"Polygon","arcs":[[-3466,3628,-3622,-3627,3629,3630]],"properties":{"id":"24660017","dp":4391,"de":0}},{"type":"Polygon","arcs":[[3631,-3467,3632,3633,3634]],"properties":{"id":"24660020","dp":2240,"de":701}},{"type":"Polygon","arcs":[[3635,-3634,3636,3637]],"properties":{"id":"24660021","dp":11277,"de":0}},{"type":"Polygon","arcs":[[3638,3639,3640,-3638,3641,3642]],"properties":{"id":"24660022","dp":2906,"de":441}},{"type":"Polygon","arcs":[[-3637,-3633,-3631,3643,3644,-3642]],"properties":{"id":"24660023","dp":7629,"de":0}},{"type":"Polygon","arcs":[[-3643,-3645,3645,3646,3647]],"properties":{"id":"24660024","dp":6532,"de":636}},{"type":"Polygon","arcs":[[-3644,-3630,-3626,3648,-3646]],"properties":{"id":"24660025","dp":6474,"de":798}},{"type":"Polygon","arcs":[[-451,3649,-3647,-3649,-3615,-3181,3650]],"properties":{"id":"24660026","dp":3172,"de":5079}},{"type":"Polygon","arcs":[[3651,3652,-3639,-3648,-3650]],"properties":{"id":"24660027","dp":4713,"de":0}},{"type":"Polygon","arcs":[[3653,-3640,-3653,3654,3655]],"properties":{"id":"24660028","dp":5487,"de":0}},{"type":"Polygon","arcs":[[3656,-3656,3657]],"properties":{"id":"24660029","dp":7930,"de":0}},{"type":"MultiPolygon","arcs":[[[3658],[3659],[3660],[3661],[3662]],[[3663]],[[3664]],[[3665]],[[3666]],[[-1202,3667]]],"properties":{"id":"24663335","dp":0,"de":1576}},{"type":"Polygon","arcs":[[3668,3669,3670,3671,3672,3673,3674,3675,3676,3677]],"properties":{"id":"24663336","dp":1743,"de":12924}},{"type":"Polygon","arcs":[[3678,3679,-3675]],"properties":{"id":"24663337","dp":16604,"de":10074}},{"type":"Polygon","arcs":[[3680,3681,3682,3683,3684,3685,3686,-3394]],"properties":{"id":"24663340","dp":0,"de":454}},{"type":"Polygon","arcs":[[3687,3688,3689,3690,3691]],"properties":{"id":"24663341","dp":12943,"de":6012}},{"type":"Polygon","arcs":[[3692,3693,3694,3695,3696,3697,-3692,3698]],"properties":{"id":"24663342","dp":7561,"de":11140}},{"type":"Polygon","arcs":[[-3698,3699,-3688]],"properties":{"id":"24663343","dp":15903,"de":4819}},{"type":"Polygon","arcs":[[3700,3701,-3694,3702,3703]],"properties":{"id":"24663344","dp":13444,"de":19335}},{"type":"Polygon","arcs":[[-3703,-3693,3704,3705]],"properties":{"id":"24663345","dp":33611,"de":9444}},{"type":"Polygon","arcs":[[3706,3707,3708,3709,3710]],"properties":{"id":"24663346","dp":13606,"de":4566}},{"type":"Polygon","arcs":[[-1087,-1270,3711,3712,-3708,3713,3714]],"properties":{"id":"24663347","dp":8468,"de":33829}},{"type":"Polygon","arcs":[[-1089,3715,-3714,-3707,3716]],"properties":{"id":"24663348","dp":36692,"de":3846}},{"type":"Polygon","arcs":[[-3715,-3716,-1088]],"properties":{"id":"24663349","dp":45769,"de":3076}},{"type":"Polygon","arcs":[[-1090,-3717,-3711,3717,-1210]],"properties":{"id":"24663350","dp":15335,"de":17449}},{"type":"Polygon","arcs":[[-3179,3718,3719,3720,3721,3722,3723,3724,3725,3726,-1141,3727]],"properties":{"id":"24660001","dp":2047,"de":233}},{"type":"Polygon","arcs":[[3728,3729,3730,-3725]],"properties":{"id":"24660002","dp":5004,"de":0}},{"type":"Polygon","arcs":[[-3731,3731,-3726]],"properties":{"id":"24660003","dp":5058,"de":0}},{"type":"Polygon","arcs":[[-3724,3732,3733,-3729]],"properties":{"id":"24660004","dp":3438,"de":911}},{"type":"Polygon","arcs":[[3734,3735,-3733,-3723]],"properties":{"id":"24660005","dp":3742,"de":0}},{"type":"Polygon","arcs":[[3736,3737,-3735,-3722]],"properties":{"id":"24660006","dp":5415,"de":0}},{"type":"Polygon","arcs":[[-3730,-3734,-3736,-3738,3738,-1131,3739,-1136,-3727,-3732]],"properties":{"id":"24660007","dp":3336,"de":320}},{"type":"Polygon","arcs":[[-3719,-3617,-1132,-3739,-3737,-3721,3740]],"properties":{"id":"24660008","dp":4464,"de":418}},{"type":"Polygon","arcs":[[-3720,-3741]],"properties":{"id":"24660009","dp":4909,"de":0}},{"type":"Polygon","arcs":[[3741,3742,3743,-3230]],"properties":{"id":"24660089","dp":8651,"de":0}},{"type":"Polygon","arcs":[[3744,-3742,-3229,3745,3746]],"properties":{"id":"24660090","dp":15840,"de":0}},{"type":"Polygon","arcs":[[3747,-3746,-3227,-3218]],"properties":{"id":"24660091","dp":10712,"de":4502}},{"type":"Polygon","arcs":[[3748,3749,3750,-3747,-3748,-3222,-280]],"properties":{"id":"24660092","dp":1236,"de":585}},{"type":"Polygon","arcs":[[3751,3752,-3751,3753]],"properties":{"id":"24660093","dp":7496,"de":915}},{"type":"Polygon","arcs":[[3754,3755,-3745,-3753]],"properties":{"id":"24660094","dp":6199,"de":0}},{"type":"Polygon","arcs":[[-3755,-3752,3756,3757,3758,3759,3760,3761]],"properties":{"id":"24660095","dp":3070,"de":445}},{"type":"Polygon","arcs":[[-3762,3762,-3743,-3756]],"properties":{"id":"24660096","dp":6771,"de":0}},{"type":"Polygon","arcs":[[-3761,3763,3764,-3763]],"properties":{"id":"24660097","dp":8248,"de":0}},{"type":"Polygon","arcs":[[-3228,-3744,-3765,3765,-3215,-3221,-3225]],"properties":{"id":"24660098","dp":4304,"de":432}},{"type":"Polygon","arcs":[[-3766,-3764,3766,3767,3768,3769,3770,-3210,-3216]],"properties":{"id":"24660099","dp":9366,"de":477}},{"type":"Polygon","arcs":[[3771,3772,-3769]],"properties":{"id":"24660100","dp":22663,"de":0}},{"type":"Polygon","arcs":[[3773,3774,3775,3776,3777,3778,-3658,-3655,-3652,-450]],"properties":{"id":"24660030","dp":3590,"de":131}},{"type":"Polygon","arcs":[[-3775,3779]],"properties":{"id":"24660031","dp":6939,"de":0}},{"type":"Polygon","arcs":[[-445,3780,-3776,-3780,-3774,-449]],"properties":{"id":"24660032","dp":5086,"de":0}},{"type":"Polygon","arcs":[[3781,3782,-3777,-3781,-444,-423,3783,3784,3785]],"properties":{"id":"24660033","dp":4427,"de":0}},{"type":"Polygon","arcs":[[-3784,-422,3786]],"properties":{"id":"24660034","dp":4525,"de":0}},{"type":"Polygon","arcs":[[-3785,-3787,-421,3787]],"properties":{"id":"24660035","dp":4877,"de":0}},{"type":"Polygon","arcs":[[3788,-3786,-3788,-420,-1152]],"properties":{"id":"24660036","dp":7800,"de":0}},{"type":"Polygon","arcs":[[3789,3790,3791,3792,3793,3794,3795]],"properties":{"id":"24660458","dp":4152,"de":4725}},{"type":"Polygon","arcs":[[3796,3797,-3278,3798]],"properties":{"id":"24660109","dp":17802,"de":0}},{"type":"Polygon","arcs":[[3799,3800,3801,3802,3803,-3797]],"properties":{"id":"24660110","dp":22450,"de":0}},{"type":"Polygon","arcs":[[-339,3804,3805,-3802,3806]],"properties":{"id":"24660111","dp":18067,"de":0}},{"type":"Polygon","arcs":[[3807,-340,-3807,-3801]],"properties":{"id":"24660112","dp":18508,"de":0}},{"type":"Polygon","arcs":[[-338,3808,-3805]],"properties":{"id":"24660114","dp":23632,"de":0}},{"type":"Polygon","arcs":[[-3809,-337,3809,-3803,-3806]],"properties":{"id":"24660115","dp":16015,"de":0}},{"type":"Polygon","arcs":[[-3810,-336,3810,-262,-357,-355,-3279,-3798,-3804]],"properties":{"id":"24660117","dp":4462,"de":5461}},{"type":"Polygon","arcs":[[-335,3811,3812,-256,-261,-3811]],"properties":{"id":"24660118","dp":9364,"de":2931}},{"type":"Polygon","arcs":[[-334,3813,3814,-3812]],"properties":{"id":"24660119","dp":6607,"de":2031}},{"type":"Polygon","arcs":[[-3815,3815,3816,-265,-257,-3813]],"properties":{"id":"24660120","dp":6476,"de":0}},{"type":"Polygon","arcs":[[3817,3818,3819,-3816,3820,3821]],"properties":{"id":"24660121","dp":8339,"de":1797}},{"type":"Polygon","arcs":[[-3820,3822,3823,-266,-3817]],"properties":{"id":"24660122","dp":11481,"de":0}},{"type":"Polygon","arcs":[[-3819,3824,-3493,3825,3826,-3823]],"properties":{"id":"24660123","dp":3694,"de":0}},{"type":"Polygon","arcs":[[-3827,3827,3828,-267,-3824]],"properties":{"id":"24660124","dp":11609,"de":0}},{"type":"Polygon","arcs":[[-268,-3829,3829,3830,3831]],"properties":{"id":"24660125","dp":13209,"de":1131}},{"type":"Polygon","arcs":[[3832,3833,3834,-3830,-3828,-3826]],"properties":{"id":"24660126","dp":4189,"de":0}},{"type":"Polygon","arcs":[[-3835,3835,3836,3837,-3831]],"properties":{"id":"24660127","dp":6483,"de":773}},{"type":"Polygon","arcs":[[-3832,-3838,3838,-274,-269]],"properties":{"id":"24660128","dp":12889,"de":0}},{"type":"Polygon","arcs":[[-275,-3839,-3837,3839,3840,3841,-277]],"properties":{"id":"24660129","dp":10520,"de":1145}},{"type":"Polygon","arcs":[[-278,-3842,3842,-506]],"properties":{"id":"24660130","dp":9644,"de":3074}},{"type":"Polygon","arcs":[[-3841,3843,3844,3845,3846,-3843]],"properties":{"id":"24660131","dp":12089,"de":2665}},{"type":"Polygon","arcs":[[-3194,3847,3848,3849,3850,-2267]],"properties":{"id":"24660256","dp":4794,"de":1063}},{"type":"Polygon","arcs":[[-3851,3851,3852,-2268]],"properties":{"id":"24660257","dp":8399,"de":0}},{"type":"Polygon","arcs":[[-2269,-3853,3853,3854,3855,-2261]],"properties":{"id":"24660258","dp":4598,"de":2641}},{"type":"Polygon","arcs":[[-3855,3856]],"properties":{"id":"24660259","dp":15089,"de":0}},{"type":"Polygon","arcs":[[3857,3858,-2239,-2262,-3856,-3857,-3854,3859,-1382,3860]],"properties":{"id":"24660260","dp":2424,"de":2400}},{"type":"Polygon","arcs":[[3861,-3858]],"properties":{"id":"24660261","dp":11855,"de":1385}},{"type":"Polygon","arcs":[[3862,-2240,-3859,-3862,-3861,-1381,3863]],"properties":{"id":"24660262","dp":5335,"de":617}},{"type":"Polygon","arcs":[[-1380,3864,3865,-3864]],"properties":{"id":"24660263","dp":9710,"de":826}},{"type":"Polygon","arcs":[[-2229,-2234,-3863,-3866,3866,3867,3868,-2225]],"properties":{"id":"24660264","dp":7393,"de":4612}},{"type":"Polygon","arcs":[[3869,3870,3871,-3868]],"properties":{"id":"24660265","dp":10184,"de":0}},{"type":"Polygon","arcs":[[-2226,-3869,-3872,3872,3873,-1545,-1734,-2021,-2218,-2219,-2223]],"properties":{"id":"24660266","dp":4161,"de":2015}},{"type":"Polygon","arcs":[[3874,-3873,-3871]],"properties":{"id":"24660267","dp":9696,"de":0}},{"type":"Polygon","arcs":[[-3875,-3870,-3867,-3865,3875,-1546,-3874]],"properties":{"id":"24660268","dp":5985,"de":3475}},{"type":"Polygon","arcs":[[-1379,3876,3877,3878,-3876]],"properties":{"id":"24660269","dp":4919,"de":3068}},{"type":"Polygon","arcs":[[-1378,3879,3880,3881,3882,-3877]],"properties":{"id":"24660270","dp":9120,"de":1282}},{"type":"Polygon","arcs":[[3883,3884,-3881,3885]],"properties":{"id":"24660271","dp":9671,"de":0}},{"type":"Polygon","arcs":[[-3882,-3885,3886,3887,3888]],"properties":{"id":"24660272","dp":12573,"de":0}},{"type":"Polygon","arcs":[[-3878,-3883,-3889,3889,3890]],"properties":{"id":"24660273","dp":11016,"de":0}},{"type":"Polygon","arcs":[[-1541,-3879,-3891,3891,-1563,-1555,-1547]],"properties":{"id":"24660274","dp":2558,"de":1977}},{"type":"Polygon","arcs":[[-696,-105,-1063,-1069,-1070,-1082]],"properties":{"id":"24660779","dp":9027,"de":2188}},{"type":"Polygon","arcs":[[3892,3893,-1071,-1067,-1065]],"properties":{"id":"24660780","dp":7729,"de":0}},{"type":"Polygon","arcs":[[3894,3895,-3893,3896]],"properties":{"id":"24660781","dp":4710,"de":550}},{"type":"Polygon","arcs":[[3897,3898,3899,3900,-1052,3901,-3112,3902,-3895]],"properties":{"id":"24660783","dp":4526,"de":1025}},{"type":"Polygon","arcs":[[-326,3903,-489,3904,-481,3905,3906]],"properties":{"id":"24660058","dp":474,"de":381}},{"type":"Polygon","arcs":[[-3906,-476,-463,-454,3907]],"properties":{"id":"24660059","dp":4875,"de":1197}},{"type":"Polygon","arcs":[[-498,-482,-3905]],"properties":{"id":"24660060","dp":2995,"de":2623}},{"type":"Polygon","arcs":[[-328,-323,3908,-490,-3904,-325]],"properties":{"id":"24660061","dp":9766,"de":833}},{"type":"Polygon","arcs":[[3909,-491,-3909,-318]],"properties":{"id":"24660062","dp":7499,"de":0}},{"type":"Polygon","arcs":[[3910,-492,-3910,-317]],"properties":{"id":"24660063","dp":10650,"de":0}},{"type":"Polygon","arcs":[[3911,3912,-493,-3911,-316,3913]],"properties":{"id":"24660064","dp":8991,"de":0}},{"type":"Polygon","arcs":[[-313,3914,-3914,-315]],"properties":{"id":"24660065","dp":13836,"de":0}},{"type":"Polygon","arcs":[[3915,3916,3917,-3912,-3915,3918]],"properties":{"id":"24660066","dp":6968,"de":834}},{"type":"Polygon","arcs":[[3919,-494,-3913,-3918]],"properties":{"id":"24660067","dp":7838,"de":0}},{"type":"Polygon","arcs":[[3920,-495,-3920,-3917,3921]],"properties":{"id":"24660068","dp":8108,"de":844}},{"type":"Polygon","arcs":[[3922,3923,3924,-3922,-3916]],"properties":{"id":"24660069","dp":10914,"de":4850}},{"type":"Polygon","arcs":[[-312,3925,3926,3927,-3923,-3919]],"properties":{"id":"24660070","dp":11619,"de":1190}},{"type":"Polygon","arcs":[[-308,3928,3929,-3926,-311]],"properties":{"id":"24660071","dp":10212,"de":0}},{"type":"Polygon","arcs":[[-657,3930,-3927,-3930,3931]],"properties":{"id":"24660072","dp":10846,"de":1476}},{"type":"Polygon","arcs":[[-299,-305,3932,-654,-3932,-3929,-307]],"properties":{"id":"24660073","dp":4275,"de":574}},{"type":"Polygon","arcs":[[3933,3934,-653,-3933,-304]],"properties":{"id":"24660074","dp":8286,"de":1582}},{"type":"Polygon","arcs":[[3935,3936,3937,-3934,-303]],"properties":{"id":"24660075","dp":5793,"de":672}},{"type":"Polygon","arcs":[[3938,3939,-647,-3935,-3938]],"properties":{"id":"24660076","dp":6507,"de":902}},{"type":"Polygon","arcs":[[3940,-638,-641,-645,-3940,3941]],"properties":{"id":"24660077","dp":6005,"de":0}},{"type":"Polygon","arcs":[[3942,3943,-3942,-3939,-3937,3944]],"properties":{"id":"24660078","dp":6475,"de":0}},{"type":"Polygon","arcs":[[-3773,3945,-639,-3941,-3944,3946,-3770]],"properties":{"id":"24660079","dp":3312,"de":756}},{"type":"Polygon","arcs":[[-3947,-3943,3947,-3211,-3771]],"properties":{"id":"24660080","dp":9645,"de":0}},{"type":"Polygon","arcs":[[-3948,-3945,-3936,-302,-3212]],"properties":{"id":"24660081","dp":6897,"de":1705}},{"type":"Polygon","arcs":[[-3772,-3768,3948,3949,-632,-636,-3946]],"properties":{"id":"24660101","dp":3859,"de":1078}},{"type":"Polygon","arcs":[[-3121,-627,-633,-3950,3950]],"properties":{"id":"24660102","dp":3071,"de":604}},{"type":"Polygon","arcs":[[-3951,-3949,-3767,-3760,3951]],"properties":{"id":"24660103","dp":4091,"de":0}},{"type":"Polygon","arcs":[[-3759,3952,-3484,3953,3954,3955,3956,3957,3958,-353,-350,-341,-3120,-3952]],"properties":{"id":"24660104","dp":968,"de":1344}},{"type":"Polygon","arcs":[[3959,-3280,-351,-3959]],"properties":{"id":"24660107","dp":14011,"de":0}},{"type":"Polygon","arcs":[[3960,3961,3962,3963]],"properties":{"id":"24660564","dp":5572,"de":412}},{"type":"Polygon","arcs":[[3964,3965,-3964,3966,3967,3968,3969,3970]],"properties":{"id":"24660565","dp":5712,"de":0}},{"type":"Polygon","arcs":[[3971,3972,3973,3974,-3967,3975]],"properties":{"id":"24660566","dp":3902,"de":1012}},{"type":"Polygon","arcs":[[3976,-3968,-3975]],"properties":{"id":"24660567","dp":10783,"de":1546}},{"type":"Polygon","arcs":[[-3974,3977,3978,-3969,-3977]],"properties":{"id":"24660568","dp":10551,"de":0}},{"type":"Polygon","arcs":[[-3973,3979,3980,3981,-3978]],"properties":{"id":"24660569","dp":8966,"de":0}},{"type":"Polygon","arcs":[[-3845,3982,-1770,-1953,3983,3984]],"properties":{"id":"24660132","dp":12459,"de":0}},{"type":"Polygon","arcs":[[-3985,3985,-3846]],"properties":{"id":"24660133","dp":12254,"de":0}},{"type":"Polygon","arcs":[[-507,-3847,-3986,-3984,-1952,-1949,3986,3987]],"properties":{"id":"24660134","dp":2753,"de":849}},{"type":"Polygon","arcs":[[-3987,-1948,3988,3989]],"properties":{"id":"24660135","dp":10378,"de":0}},{"type":"Polygon","arcs":[[3990,-3989,-1947,3991]],"properties":{"id":"24660136","dp":13547,"de":0}},{"type":"Polygon","arcs":[[-3992,-1946,3992,3993]],"properties":{"id":"24660137","dp":12757,"de":0}},{"type":"Polygon","arcs":[[-3993,-1927,3994]],"properties":{"id":"24660138","dp":23147,"de":758}},{"type":"Polygon","arcs":[[3995,-3995,-1945,-606]],"properties":{"id":"24660139","dp":6485,"de":3954}},{"type":"Polygon","arcs":[[-508,-3988,-3990,-3991,-3994,-3996]],"properties":{"id":"24660140","dp":12885,"de":1179}},{"type":"Polygon","arcs":[[3996,3997,3998,3999,4000,4001]],"properties":{"id":"24660598","dp":4539,"de":2885}},{"type":"Polygon","arcs":[[-3191,-1910,-1907,-1882,4002,-3848,-3193]],"properties":{"id":"24660364","dp":5171,"de":4040}},{"type":"Polygon","arcs":[[-3849,-4003,-1881,4003]],"properties":{"id":"24660365","dp":12324,"de":3944}},{"type":"Polygon","arcs":[[-3850,-4004,-1880,4004,4005,-1374,-3860,-3852]],"properties":{"id":"24660366","dp":5486,"de":2006}},{"type":"Polygon","arcs":[[-1879,4006,4007,4008,4009,-4005]],"properties":{"id":"24660367","dp":12082,"de":879}},{"type":"Polygon","arcs":[[-4006,-4010,4010,4011,-1362,-1375]],"properties":{"id":"24660368","dp":13387,"de":1254}},{"type":"Polygon","arcs":[[4012,4013,-4011,-4009]],"properties":{"id":"24660369","dp":19425,"de":0}},{"type":"Polygon","arcs":[[4014,4015,-1367,-4012,-4014]],"properties":{"id":"24660370","dp":26294,"de":6696}},{"type":"Polygon","arcs":[[-4013,-4008,4016,4017,-4015]],"properties":{"id":"24660371","dp":15693,"de":0}},{"type":"Polygon","arcs":[[-4007,-1878,4018,4019,-4017]],"properties":{"id":"24660372","dp":12250,"de":833}},{"type":"Polygon","arcs":[[-4018,-4020,4020,4021,4022,-4016]],"properties":{"id":"24660373","dp":13591,"de":892}},{"type":"Polygon","arcs":[[-1368,-4023,4023,4024]],"properties":{"id":"24660374","dp":15451,"de":0}},{"type":"Polygon","arcs":[[4025,4026,4027,4028,-4024,-4022]],"properties":{"id":"24660375","dp":17118,"de":0}},{"type":"Polygon","arcs":[[-4025,-4029,4029,-1369]],"properties":{"id":"24660376","dp":10732,"de":0}},{"type":"Polygon","arcs":[[4030,4031,4032,-1370,-4030,4033]],"properties":{"id":"24660377","dp":16050,"de":0}},{"type":"Polygon","arcs":[[4034,4035,-4032,4036]],"properties":{"id":"24660378","dp":16162,"de":0}},{"type":"Polygon","arcs":[[-4035,4037,4038,4039]],"properties":{"id":"24660379","dp":13517,"de":0}},{"type":"Polygon","arcs":[[-4031,4040,4041,4042,-4038,-4037]],"properties":{"id":"24660380","dp":14898,"de":0}},{"type":"Polygon","arcs":[[-4039,-4043,4043,4044,4045]],"properties":{"id":"24660381","dp":14686,"de":1174}},{"type":"Polygon","arcs":[[-4042,4046,4047,4048,-4044]],"properties":{"id":"24660382","dp":10102,"de":0}},{"type":"Polygon","arcs":[[4049,4050,-4049,4051,4052]],"properties":{"id":"24660383","dp":9879,"de":1982}},{"type":"Polygon","arcs":[[-4053,4053,4054,4055]],"properties":{"id":"24660384","dp":10290,"de":0}},{"type":"Polygon","arcs":[[-4052,4056,-1668,4057,4058,4059,4060,-4054]],"properties":{"id":"24660385","dp":4564,"de":788}},{"type":"Polygon","arcs":[[4061,-4055,-4061,4062]],"properties":{"id":"24660386","dp":6116,"de":0}},{"type":"Polygon","arcs":[[-1565,4063,-4063,-4060,4064,4065]],"properties":{"id":"24660387","dp":3554,"de":0}},{"type":"Polygon","arcs":[[-4050,-4056,-4062,-4064,-1564,4066]],"properties":{"id":"24660388","dp":7447,"de":2180}},{"type":"Polygon","arcs":[[4067,4068,-4045,-4051,-4067,-3892,-3890,-3888,4069]],"properties":{"id":"24660389","dp":3721,"de":3940}},{"type":"Polygon","arcs":[[4070,4071,-4070,-3887,-3884]],"properties":{"id":"24660390","dp":9086,"de":0}},{"type":"Polygon","arcs":[[4072,-4068,-4072,4073]],"properties":{"id":"24660391","dp":9632,"de":0}},{"type":"Polygon","arcs":[[-3880,-1377,4074,4075,-4074,-4071,-3886]],"properties":{"id":"24660392","dp":5027,"de":3240}},{"type":"Polygon","arcs":[[-1372,-1365,4076,-4075,-1376]],"properties":{"id":"24660393","dp":9076,"de":1988}},{"type":"Polygon","arcs":[[-4076,-4077,-1364,-1371,-4033,-4036,-4040,-4046,-4069,-4073]],"properties":{"id":"24660394","dp":4090,"de":1463}},{"type":"Polygon","arcs":[[4077,4078,-689,4079,4080,4081]],"properties":{"id":"24660166","dp":5356,"de":515}},{"type":"Polygon","arcs":[[4082,4083,-4081,4084,4085]],"properties":{"id":"24660167","dp":16198,"de":1033}},{"type":"Polygon","arcs":[[4086,-4086,4087,4088]],"properties":{"id":"24660168","dp":4927,"de":671}},{"type":"Polygon","arcs":[[4089,4090,4091,-4088,4092,4093]],"properties":{"id":"24660169","dp":3152,"de":935}},{"type":"Polygon","arcs":[[-4085,-4080,-688,4094,4095,-4093]],"properties":{"id":"24660170","dp":7031,"de":0}},{"type":"Polygon","arcs":[[-1566,-4066,4096,-1653,-1645,4097]],"properties":{"id":"24660399","dp":3414,"de":0}},{"type":"Polygon","arcs":[[-1567,-4098,-1644,-1642,-1635,-1634,-1631,-1435,-1433,-1431,-1570]],"properties":{"id":"24660400","dp":2100,"de":575}},{"type":"Polygon","arcs":[[4098,4099,4100]],"properties":{"id":"24660423","dp":23730,"de":0}},{"type":"Polygon","arcs":[[4101,4102,4103,-4099,4104]],"properties":{"id":"24660424","dp":15945,"de":1718}},{"type":"Polygon","arcs":[[4105,4106,-4102,4107]],"properties":{"id":"24660425","dp":18770,"de":1495}},{"type":"Polygon","arcs":[[4108,4109,-4106,4110]],"properties":{"id":"24660426","dp":17269,"de":0}},{"type":"Polygon","arcs":[[4111,4112,4113,-4109]],"properties":{"id":"24660427","dp":17706,"de":0}},{"type":"Polygon","arcs":[[4114,4115,4116,-4113]],"properties":{"id":"24660428","dp":27773,"de":0}},{"type":"Polygon","arcs":[[4117,-4116,4118,4119]],"properties":{"id":"24660429","dp":23579,"de":0}},{"type":"Polygon","arcs":[[4120,-4120,4121,4122]],"properties":{"id":"24660430","dp":16882,"de":0}},{"type":"Polygon","arcs":[[-4123,4123,4124]],"properties":{"id":"24660431","dp":14984,"de":0}},{"type":"Polygon","arcs":[[4125,4126,4127,4128,-4124]],"properties":{"id":"24660432","dp":10350,"de":0}},{"type":"Polygon","arcs":[[4129,4130,-4128,4131]],"properties":{"id":"24660433","dp":17389,"de":1174}},{"type":"Polygon","arcs":[[4132,4133,-4130,4134]],"properties":{"id":"24660434","dp":16356,"de":0}},{"type":"Polygon","arcs":[[4135,4136,4137,-4133]],"properties":{"id":"24660435","dp":15329,"de":3708}},{"type":"Polygon","arcs":[[4138,4139,4140,4141,-4137,4142]],"properties":{"id":"24660436","dp":10709,"de":4233}},{"type":"Polygon","arcs":[[4143,4144,-4140,4145]],"properties":{"id":"24660437","dp":22179,"de":0}},{"type":"Polygon","arcs":[[4146,4147,-4144,4148]],"properties":{"id":"24660438","dp":25625,"de":3750}},{"type":"Polygon","arcs":[[4149,4150,-4147,4151]],"properties":{"id":"24660439","dp":20000,"de":6140}},{"type":"Polygon","arcs":[[4152,4153,-3792,4154,4155]],"properties":{"id":"24660459","dp":17007,"de":2068}},{"type":"Polygon","arcs":[[4156,4157,4158,-4153,4159]],"properties":{"id":"24660460","dp":18172,"de":0}},{"type":"Polygon","arcs":[[4160,4161,-4154,-4159]],"properties":{"id":"24660461","dp":15100,"de":1507}},{"type":"Polygon","arcs":[[4162,4163,4164,-4161,-4158,4165]],"properties":{"id":"24660462","dp":15151,"de":1377}},{"type":"Polygon","arcs":[[4166,4167,-4163,4168]],"properties":{"id":"24660463","dp":19042,"de":2816}},{"type":"Polygon","arcs":[[4169,4170,-4167,4171]],"properties":{"id":"24660464","dp":15386,"de":2743}},{"type":"Polygon","arcs":[[4172,4173,4174,-4170,4175]],"properties":{"id":"24660465","dp":13896,"de":1558}},{"type":"Polygon","arcs":[[4176,4177,-4173,4178]],"properties":{"id":"24660466","dp":14131,"de":3443}},{"type":"Polygon","arcs":[[4179,-4179,4180,4181]],"properties":{"id":"24660467","dp":11898,"de":7365}},{"type":"Polygon","arcs":[[-4181,-4176,4182,4183]],"properties":{"id":"24660468","dp":16944,"de":2146}},{"type":"Polygon","arcs":[[-4183,-4172,4184,4185]],"properties":{"id":"24660469","dp":12219,"de":2682}},{"type":"Polygon","arcs":[[-4185,-4169,4186,4187]],"properties":{"id":"24660470","dp":17717,"de":6929}},{"type":"Polygon","arcs":[[-4187,-4166,-4157,4188,4189]],"properties":{"id":"24660471","dp":14788,"de":2380}},{"type":"Polygon","arcs":[[4190,-4190,4191,4192,4193]],"properties":{"id":"24660472","dp":17818,"de":3541}},{"type":"Polygon","arcs":[[4194,-4188,-4191,4195,4196]],"properties":{"id":"24660473","dp":17999,"de":3150}},{"type":"Polygon","arcs":[[4197,-4186,-4195,4198,4199]],"properties":{"id":"24660474","dp":15870,"de":3233}},{"type":"Polygon","arcs":[[4200,-4184,-4198,4201]],"properties":{"id":"24660475","dp":12894,"de":3617}},{"type":"Polygon","arcs":[[-3683,-4182,-4201,4202]],"properties":{"id":"24660476","dp":17076,"de":7748}},{"type":"Polygon","arcs":[[4203,-4180,-3682]],"properties":{"id":"24660478","dp":4474,"de":4523}},{"type":"Polygon","arcs":[[-4177,-4204,-3681,4204,4205,4206,4207,4208,4209]],"properties":{"id":"24660479","dp":1370,"de":9509}},{"type":"Polygon","arcs":[[-4209,4210,4211,-504,-511,4212]],"properties":{"id":"24660480","dp":5733,"de":3267}},{"type":"Polygon","arcs":[[4213,4214,-4212]],"properties":{"id":"24660481","dp":12109,"de":1734}},{"type":"Polygon","arcs":[[4215,-4214,4216]],"properties":{"id":"24660482","dp":16749,"de":4489}},{"type":"Polygon","arcs":[[4217,4218,4219,-505,-4215,-4216,4220]],"properties":{"id":"24660483","dp":5110,"de":940}},{"type":"Polygon","arcs":[[-3898,-3897,-1064,-1060,4221]],"properties":{"id":"24660784","dp":3202,"de":407}},{"type":"Polygon","arcs":[[-1055,-1053,-3901,4222,-3899,-4222,-1059]],"properties":{"id":"24660785","dp":3121,"de":559}},{"type":"Polygon","arcs":[[-3900,-4223]],"properties":{"id":"24660786","dp":3672,"de":491}},{"type":"Polygon","arcs":[[-1050,-2008,-2177,4223,-3902]],"properties":{"id":"24660787","dp":3514,"de":355}},{"type":"Polygon","arcs":[[-4065,-4059,4224,-1656,-1648,-4097]],"properties":{"id":"24660401","dp":3324,"de":913}},{"type":"Polygon","arcs":[[-4225,-4058,-1667,-1661,-3589,-1658]],"properties":{"id":"24660402","dp":12199,"de":0}},{"type":"Polygon","arcs":[[-1675,-1671,-1670,-4057,-4048,4225]],"properties":{"id":"24660403","dp":3108,"de":1372}},{"type":"Polygon","arcs":[[-4028,4226,4227,-4226,-4047,-4041,-4034]],"properties":{"id":"24660404","dp":5442,"de":0}},{"type":"Polygon","arcs":[[4228,-1690,-1678,-1676,-4228,4229]],"properties":{"id":"24660405","dp":15799,"de":0}},{"type":"Polygon","arcs":[[4230,-4230,-4227,-4027]],"properties":{"id":"24660406","dp":10615,"de":1538}},{"type":"Polygon","arcs":[[-4026,4231,4232,-1686,-4229,-4231]],"properties":{"id":"24660407","dp":13564,"de":0}},{"type":"Polygon","arcs":[[4233,4234,4235,-1698,-1691,-1687,-4233]],"properties":{"id":"24660408","dp":18621,"de":0}},{"type":"Polygon","arcs":[[4236,4237,-4235,4238]],"properties":{"id":"24660409","dp":22556,"de":0}},{"type":"Polygon","arcs":[[-1877,-4239,-4234,-4232,-4021,-4019]],"properties":{"id":"24660410","dp":6211,"de":1941}},{"type":"Polygon","arcs":[[4239,-1699,-4236,-4238]],"properties":{"id":"24660411","dp":21674,"de":3167}},{"type":"Polygon","arcs":[[-1847,-1838,-1834,-1831,-1702,-1700,-1695,-4240,-4237,-1876]],"properties":{"id":"24660412","dp":1516,"de":947}},{"type":"Polygon","arcs":[[4240,4241,4242,4243,-1897,-1904,4244]],"properties":{"id":"24660413","dp":7629,"de":3237}},{"type":"Polygon","arcs":[[4245,4246,-1898,-4244]],"properties":{"id":"24660414","dp":13892,"de":0}},{"type":"Polygon","arcs":[[4247,4248,-1893,-1899,-4247,4249]],"properties":{"id":"24660415","dp":7452,"de":1071}},{"type":"Polygon","arcs":[[4250,4251,4252,4253,4254,-4248]],"properties":{"id":"24660416","dp":8088,"de":0}},{"type":"Polygon","arcs":[[4255,4256,4257,-4252,4258]],"properties":{"id":"24660417","dp":8397,"de":1217}},{"type":"Polygon","arcs":[[4259,4260,-4253,-4258]],"properties":{"id":"24660418","dp":7408,"de":0}},{"type":"Polygon","arcs":[[4261,4262,4263,4264,-4260,-4257]],"properties":{"id":"24660419","dp":4079,"de":789}},{"type":"Polygon","arcs":[[4265,4266,-4264,4267]],"properties":{"id":"24660420","dp":17323,"de":0}},{"type":"Polygon","arcs":[[4268,-4268,-4263,4269,4270]],"properties":{"id":"24660421","dp":16531,"de":1219}},{"type":"Polygon","arcs":[[4271,-4100,-4104,4272,-4269]],"properties":{"id":"24660422","dp":15726,"de":0}},{"type":"MultiPolygon","arcs":[[[4273,4274,-2460,-2466,4275,4276,4277,4278,4279,4280]],[[4281,4282]]],"properties":{"id":"24660926","dp":6773,"de":0}},{"type":"Polygon","arcs":[[4283,4284,-2461,-4275]],"properties":{"id":"24660927","dp":7585,"de":0}},{"type":"Polygon","arcs":[[4285,-2467,-2462,-4285]],"properties":{"id":"24660928","dp":8019,"de":0}},{"type":"Polygon","arcs":[[4286,-3401,-596,4287,-3477,4288,4289]],"properties":{"id":"24660518","dp":15000,"de":563}},{"type":"Polygon","arcs":[[4290,4291,4292,4293,4294,4295]],"properties":{"id":"24660525","dp":12410,"de":0}},{"type":"Polygon","arcs":[[4296,4297,-4150,4298]],"properties":{"id":"24660440","dp":14646,"de":0}},{"type":"Polygon","arcs":[[4299,4300,-4297,4301]],"properties":{"id":"24660441","dp":18742,"de":3459}},{"type":"Polygon","arcs":[[4302,4303,-4300,4304]],"properties":{"id":"24660442","dp":16552,"de":1709}},{"type":"Polygon","arcs":[[-3685,4305,-4303,4306]],"properties":{"id":"24660443","dp":15920,"de":4447}},{"type":"Polygon","arcs":[[-3684,-4203,4307,-4306]],"properties":{"id":"24660444","dp":14444,"de":7834}},{"type":"Polygon","arcs":[[-4308,-4202,4308,-4304]],"properties":{"id":"24660445","dp":16717,"de":2671}},{"type":"Polygon","arcs":[[-4309,-4200,4309,-4301]],"properties":{"id":"24660446","dp":17611,"de":0}},{"type":"Polygon","arcs":[[-4310,-4199,4310,-4298]],"properties":{"id":"24660447","dp":17577,"de":2863}},{"type":"Polygon","arcs":[[-4311,-4197,4311,-4151]],"properties":{"id":"24660448","dp":22538,"de":6735}},{"type":"Polygon","arcs":[[-4312,-4196,4312,-4148]],"properties":{"id":"24660449","dp":20333,"de":2500}},{"type":"Polygon","arcs":[[-4313,-4194,4313,-4141,-4145]],"properties":{"id":"24660450","dp":15549,"de":1126}},{"type":"Polygon","arcs":[[-4142,-4314,-4193,4314,4315]],"properties":{"id":"24660451","dp":14132,"de":2739}},{"type":"Polygon","arcs":[[-4316,4316,-4138]],"properties":{"id":"24660452","dp":13869,"de":1636}},{"type":"Polygon","arcs":[[-4134,-4317,4317,4318,4319]],"properties":{"id":"24660453","dp":8690,"de":1719}},{"type":"Polygon","arcs":[[-4192,4320,-4318,-4315]],"properties":{"id":"24660454","dp":13194,"de":4027}},{"type":"Polygon","arcs":[[-4189,-4160,4321,-4321]],"properties":{"id":"24660455","dp":11069,"de":3323}},{"type":"Polygon","arcs":[[-4322,-4156,4322,-3790,-4319]],"properties":{"id":"24660456","dp":15204,"de":1656}},{"type":"Polygon","arcs":[[-4155,-3791,-4323]],"properties":{"id":"24660457","dp":13793,"de":2387}},{"type":"Polygon","arcs":[[-2655,-2639,-2632,4323,4324,4325,-2490,-2484,-2657]],"properties":{"id":"24660952","dp":2107,"de":2644}},{"type":"Polygon","arcs":[[4326,4327,4328,-3982]],"properties":{"id":"24660570","dp":22280,"de":3947}},{"type":"Polygon","arcs":[[4329,4330,4331,-4327]],"properties":{"id":"24660571","dp":32237,"de":0}},{"type":"Polygon","arcs":[[4332,4333,4334,4335,4336,-4331,4337]],"properties":{"id":"24660572","dp":13214,"de":0}},{"type":"Polygon","arcs":[[4338,4339,4340,4341,4342]],"properties":{"id":"24660576","dp":15705,"de":0}},{"type":"Polygon","arcs":[[-4340,4343,4344]],"properties":{"id":"24660577","dp":7985,"de":0}},{"type":"Polygon","arcs":[[4345,4346,4347,-4342,4348,4349]],"properties":{"id":"24660578","dp":4970,"de":3345}},{"type":"Polygon","arcs":[[4350,4351,-4349]],"properties":{"id":"24660579","dp":14097,"de":4768}},{"type":"Polygon","arcs":[[4352,-4350,-4352,4353,4354]],"properties":{"id":"24660580","dp":4554,"de":1508}},{"type":"Polygon","arcs":[[4355,4356,4357,4358,4359,4360]],"properties":{"id":"24660581","dp":5580,"de":2961}},{"type":"Polygon","arcs":[[4361,4362,4363,-4356,4364]],"properties":{"id":"24660582","dp":11443,"de":1012}},{"type":"Polygon","arcs":[[4365,-4365,-4361,4366,4367]],"properties":{"id":"24660583","dp":10212,"de":5418}},{"type":"Polygon","arcs":[[4368,4369,4370,-4362,-4366,4371]],"properties":{"id":"24660584","dp":5052,"de":862}},{"type":"Polygon","arcs":[[4372,-4372,-4368,4373,4374,4375,4376]],"properties":{"id":"24660585","dp":4741,"de":2181}},{"type":"Polygon","arcs":[[4377,-4221,-4217,-4211,-4208]],"properties":{"id":"24660484","dp":10803,"de":2362}},{"type":"Polygon","arcs":[[-4207,4378,4379,-4218,-4378]],"properties":{"id":"24660485","dp":5224,"de":6205}},{"type":"Polygon","arcs":[[-575,-512,-500,4380,4381,-4380,4382]],"properties":{"id":"24660486","dp":1819,"de":13159}},{"type":"Polygon","arcs":[[-4382,4383,-4219]],"properties":{"id":"24660487","dp":15706,"de":2077}},{"type":"Polygon","arcs":[[-4384,-4381,-499,-4220]],"properties":{"id":"24660488","dp":12904,"de":919}},{"type":"Polygon","arcs":[[4384,-2704,-2706,-2458,-2413]],"properties":{"id":"24660979","dp":9222,"de":2208}},{"type":"Polygon","arcs":[[-2702,-2705,-4385,-2412]],"properties":{"id":"24660980","dp":10359,"de":0}},{"type":"Polygon","arcs":[[4385,4386,4387,-3999]],"properties":{"id":"24660599","dp":6274,"de":0}},{"type":"Polygon","arcs":[[-4388,4388,4389,4390,-4000]],"properties":{"id":"24660600","dp":5620,"de":5057}},{"type":"Polygon","arcs":[[-4390,4391,4392,-3123,4393]],"properties":{"id":"24660601","dp":7892,"de":2229}},{"type":"Polygon","arcs":[[4394,-4392,-4389,4395,4396,4397]],"properties":{"id":"24660602","dp":4270,"de":5729}},{"type":"Polygon","arcs":[[4398,4399,-4396,-4387,4400]],"properties":{"id":"24660603","dp":4420,"de":1462}},{"type":"Polygon","arcs":[[-4400,4401,4402,-4397]],"properties":{"id":"24660604","dp":6686,"de":0}},{"type":"Polygon","arcs":[[-4374,-4367,-4360,-4355,4403,4404,-4402,-4399,4405]],"properties":{"id":"24660605","dp":2946,"de":5468}},{"type":"Polygon","arcs":[[-4375,-4406,-4401,-4386,4406]],"properties":{"id":"24660606","dp":3811,"de":1411}},{"type":"Polygon","arcs":[[4407,-4001,-4391,-4394,-3122,4408,4409,4410]],"properties":{"id":"24660607","dp":2848,"de":7381}},{"type":"Polygon","arcs":[[4411,4412,-3116,4413,4414,-4411,-941,-934,-932]],"properties":{"id":"24660608","dp":463,"de":5260}},{"type":"Polygon","arcs":[[4415,4416,-4412,-931,-3119]],"properties":{"id":"24660609","dp":2641,"de":2531}},{"type":"Polygon","arcs":[[-3117,-4413,-4417,4417]],"properties":{"id":"24660610","dp":2666,"de":14393}},{"type":"Polygon","arcs":[[-4418,-4416,-3118]],"properties":{"id":"24660611","dp":16222,"de":7040}},{"type":"Polygon","arcs":[[4418,-1080,-3109,-2938,4419]],"properties":{"id":"24660613","dp":3786,"de":4147}},{"type":"Polygon","arcs":[[4420,-4419,4421]],"properties":{"id":"24660614","dp":12644,"de":8510}},{"type":"Polygon","arcs":[[-3460,4422,-4422,-4420]],"properties":{"id":"24660615","dp":27462,"de":0}},{"type":"Polygon","arcs":[[-4224,-2183,-3565,4423,-2061,4424,4425,-3113]],"properties":{"id":"24660788","dp":7484,"de":1600}},{"type":"Polygon","arcs":[[-2050,-2055,-3546,4426,-3564,-3471,-3566]],"properties":{"id":"24660794","dp":4439,"de":2791}},{"type":"Polygon","arcs":[[4427,-2040,-3567,4428]],"properties":{"id":"24660797","dp":5200,"de":1235}},{"type":"Polygon","arcs":[[4429,-4429,-3469,-2193]],"properties":{"id":"24660798","dp":6746,"de":0}},{"type":"Polygon","arcs":[[4430,4431,-4430,-2196]],"properties":{"id":"24660799","dp":7162,"de":0}},{"type":"Polygon","arcs":[[4432,-2041,-4428,-4432]],"properties":{"id":"24660800","dp":6923,"de":729}},{"type":"Polygon","arcs":[[4433,-2042,-4433,4434]],"properties":{"id":"24660801","dp":4749,"de":426}},{"type":"Polygon","arcs":[[4435,4436,-4435,-4431,-2195,4437]],"properties":{"id":"24660802","dp":4322,"de":481}},{"type":"Polygon","arcs":[[4438,-2043,-4434,-4437]],"properties":{"id":"24660803","dp":4712,"de":517}},{"type":"Polygon","arcs":[[4439,4440,-2026,-2036,-4439,-4436,4441]],"properties":{"id":"24660804","dp":745,"de":55}},{"type":"Polygon","arcs":[[4442,-4440,4443]],"properties":{"id":"24660805","dp":8888,"de":0}},{"type":"Polygon","arcs":[[-4444,-4442,-4438,-2194,4444]],"properties":{"id":"24660806","dp":4068,"de":648}},{"type":"Polygon","arcs":[[4445,4446,4447,-3530,-1940,-2027,-4441,-4443,-4445,-2189,-2203,-2208,4448]],"properties":{"id":"24660807","dp":3586,"de":559}},{"type":"Polygon","arcs":[[4449,-4446]],"properties":{"id":"24660808","dp":3833,"de":0}},{"type":"Polygon","arcs":[[-3532,4450,-4447,-4450,-4449,-2207,-2209,-2162,-2157]],"properties":{"id":"24660809","dp":5176,"de":880}},{"type":"Polygon","arcs":[[-4448,-4451,-3531]],"properties":{"id":"24660810","dp":4575,"de":0}},{"type":"Polygon","arcs":[[4451,4452,-1359]],"properties":{"id":"24661311","dp":32867,"de":0}},{"type":"Polygon","arcs":[[4453,4454,4455,-2852,-4453]],"properties":{"id":"24661312","dp":10645,"de":1794}},{"type":"Polygon","arcs":[[-2788,-2941,4456,4457,-2846,-4456,4458]],"properties":{"id":"24661313","dp":2863,"de":2616}},{"type":"Polygon","arcs":[[-4459,-4455,4459,-2794]],"properties":{"id":"24661314","dp":37951,"de":0}},{"type":"Polygon","arcs":[[4460,4461,-4460,-4454,-4452]],"properties":{"id":"24661315","dp":34814,"de":0}},{"type":"Polygon","arcs":[[-2784,-2790,-2795,-4462,4462]],"properties":{"id":"24661316","dp":22947,"de":4736}},{"type":"Polygon","arcs":[[-2948,-2782,-4463,-4461,-1357,-2798,-2823]],"properties":{"id":"24661317","dp":3828,"de":0}},{"type":"Polygon","arcs":[[-701,-720,-778,-2318]],"properties":{"id":"24660901","dp":10963,"de":0}},{"type":"Polygon","arcs":[[4463,4464,4465,4466,-755,-729,-727,4467]],"properties":{"id":"24660902","dp":5807,"de":6610}},{"type":"Polygon","arcs":[[4468,4469,-4464,4470]],"properties":{"id":"24660903","dp":12154,"de":0}},{"type":"Polygon","arcs":[[4471,4472,4473,-4465,-4470]],"properties":{"id":"24660904","dp":11378,"de":3372}},{"type":"Polygon","arcs":[[-4295,4474,4475,4476,4477]],"properties":{"id":"24660526","dp":10221,"de":968}},{"type":"Polygon","arcs":[[4478,4479,-4477,4480,4481]],"properties":{"id":"24660530","dp":11022,"de":936}},{"type":"Polygon","arcs":[[4482,4483,4484,-4479,4485,4486]],"properties":{"id":"24660533","dp":17837,"de":7939}},{"type":"Polygon","arcs":[[-3558,4487,4488,-4483,4489,4490,4491]],"properties":{"id":"24660536","dp":16698,"de":2226}},{"type":"Polygon","arcs":[[-4489,4492,4493,4494,-4484]],"properties":{"id":"24660537","dp":30743,"de":0}},{"type":"Polygon","arcs":[[4495,-4291,4496,-4494]],"properties":{"id":"24660538","dp":28089,"de":0}},{"type":"Polygon","arcs":[[-4497,-4296,-4478,-4480,-4485,-4495]],"properties":{"id":"24660539","dp":8857,"de":2124}},{"type":"Polygon","arcs":[[-4496,-4493,-4488,4497,4498,-4292]],"properties":{"id":"24660540","dp":9237,"de":5053}},{"type":"Polygon","arcs":[[-3557,4499,4500,4501,4502,4503,4504,-3965,-4498]],"properties":{"id":"24660541","dp":5923,"de":1763}},{"type":"Polygon","arcs":[[4505,-4503]],"properties":{"id":"24660542","dp":5433,"de":680}},{"type":"Polygon","arcs":[[4506,4507,4508,-4504,-4506,-4502]],"properties":{"id":"24660543","dp":6713,"de":0}},{"type":"Polygon","arcs":[[4509,4510,4511,-4508,4512]],"properties":{"id":"24660544","dp":6430,"de":0}},{"type":"Polygon","arcs":[[-4501,-3126,4513,4514,-4513,-4507]],"properties":{"id":"24660545","dp":7629,"de":1708}},{"type":"Polygon","arcs":[[4515,-3595,4516,-4515]],"properties":{"id":"24660546","dp":9042,"de":5953}},{"type":"Polygon","arcs":[[4517,-4516,-4514,-3125]],"properties":{"id":"24660547","dp":5863,"de":7096}},{"type":"Polygon","arcs":[[-4393,-4395,-3596,-4518,-3124]],"properties":{"id":"24660548","dp":9006,"de":1319}},{"type":"Polygon","arcs":[[-4403,-4405,-3138,4518,4519,-3590,-4398]],"properties":{"id":"24660550","dp":4107,"de":4395}},{"type":"Polygon","arcs":[[-3591,-4520,4520,4521]],"properties":{"id":"24660551","dp":19581,"de":0}},{"type":"Polygon","arcs":[[-4521,-4519,-3137,4522]],"properties":{"id":"24660552","dp":27578,"de":4882}},{"type":"Polygon","arcs":[[-4404,-4354,-4351,-4341,4523,-3135]],"properties":{"id":"24660555","dp":12644,"de":0}},{"type":"Polygon","arcs":[[-4524,-4345,4524,4525,4526,4527,-3136]],"properties":{"id":"24660556","dp":10140,"de":1358}},{"type":"Polygon","arcs":[[-4523,-4528,4528]],"properties":{"id":"24660557","dp":22720,"de":0}},{"type":"Polygon","arcs":[[-3592,-4522,-4529,-4527,4529,4530]],"properties":{"id":"24660558","dp":8979,"de":2312}},{"type":"Polygon","arcs":[[-4531,-3976,-3963,4531,-3593]],"properties":{"id":"24660560","dp":3900,"de":1036}},{"type":"Polygon","arcs":[[-3594,-4532,4532,-4510,-4517]],"properties":{"id":"24660561","dp":5533,"de":917}},{"type":"Polygon","arcs":[[-4533,-3962,4533,-4511]],"properties":{"id":"24660562","dp":12880,"de":0}},{"type":"Polygon","arcs":[[-4534,-3961,-3966,-4505,-4509,-4512]],"properties":{"id":"24660563","dp":4956,"de":1557}},{"type":"Polygon","arcs":[[4534,-4094,-4096,4535,4536]],"properties":{"id":"24660171","dp":10209,"de":0}},{"type":"Polygon","arcs":[[4537,-4536,-4095,-687,-678,4538]],"properties":{"id":"24660172","dp":12507,"de":0}},{"type":"Polygon","arcs":[[4539,-4539,-677,-660,4540]],"properties":{"id":"24660173","dp":10934,"de":0}},{"type":"Polygon","arcs":[[4541,4542,-4369,-4373,4543]],"properties":{"id":"24660586","dp":7473,"de":0}},{"type":"Polygon","arcs":[[4544,-4544,-4377,4545,4546,4547]],"properties":{"id":"24660587","dp":4432,"de":714}},{"type":"Polygon","arcs":[[4548,-3612,4549,4550,-4542,-4545,-3132]],"properties":{"id":"24660588","dp":3861,"de":0}},{"type":"Polygon","arcs":[[-3613,-4549,-3131]],"properties":{"id":"24660590","dp":4636,"de":0}},{"type":"Polygon","arcs":[[-3524,-3133,-4548,4551]],"properties":{"id":"24660594","dp":6326,"de":0}},{"type":"Polygon","arcs":[[-3599,-3525,-4552,-4547,4552,4553,-4002,-4408,-4415,4554]],"properties":{"id":"24660595","dp":3087,"de":2310}},{"type":"Polygon","arcs":[[-4546,-4376,-4407,-3998,4555,-4553]],"properties":{"id":"24660596","dp":9901,"de":0}},{"type":"Polygon","arcs":[[-4554,-4556,-3997]],"properties":{"id":"24660597","dp":12168,"de":1084}},{"type":"Polygon","arcs":[[4556,4557,4558,-3541,-3536]],"properties":{"id":"24661062","dp":17500,"de":6793}},{"type":"Polygon","arcs":[[4559,-3542,-4559]],"properties":{"id":"24661063","dp":31257,"de":0}},{"type":"Polygon","arcs":[[-3544,4560,4561,-2710,4562,4563]],"properties":{"id":"24661066","dp":7992,"de":2200}},{"type":"Polygon","arcs":[[4564,4565,-4561,-3543]],"properties":{"id":"24661067","dp":6868,"de":1124}},{"type":"Polygon","arcs":[[-4558,4566,4567,-4565,-4560]],"properties":{"id":"24661068","dp":7535,"de":2392}},{"type":"Polygon","arcs":[[-824,-1987,4568,-4562,-4566,-4568,4569]],"properties":{"id":"24661069","dp":6727,"de":4444}},{"type":"Polygon","arcs":[[-1986,-1983,-2715,-2711,-4569]],"properties":{"id":"24661070","dp":5254,"de":3708}},{"type":"Polygon","arcs":[[-1081,-4421,-4423,-2935,-2932,4570,4571]],"properties":{"id":"24660616","dp":10046,"de":1113}},{"type":"Polygon","arcs":[[-2929,4572,-4571]],"properties":{"id":"24660617","dp":18432,"de":0}},{"type":"Polygon","arcs":[[4573,4574,-4573,-2926,-2920]],"properties":{"id":"24660618","dp":10665,"de":6569}},{"type":"Polygon","arcs":[[-1077,-4572,-4575,4575]],"properties":{"id":"24660619","dp":10755,"de":2485}},{"type":"Polygon","arcs":[[4576,-1083,-1078,-4576,-4574,-2917,4577,4578,4579]],"properties":{"id":"24660620","dp":4651,"de":2549}},{"type":"Polygon","arcs":[[4580,-4580,4581]],"properties":{"id":"24660621","dp":22919,"de":0}},{"type":"Polygon","arcs":[[4582,-4581,4583,-3300]],"properties":{"id":"24660622","dp":17689,"de":0}},{"type":"Polygon","arcs":[[-4583,-3309,-694,-4577]],"properties":{"id":"24660623","dp":20567,"de":28723}},{"type":"Polygon","arcs":[[-2970,-2974,4584,4585]],"properties":{"id":"24661113","dp":17609,"de":3902}},{"type":"Polygon","arcs":[[4586,4587,4588,-4472,-4469,4589,4590,4591]],"properties":{"id":"24660905","dp":12702,"de":1621}},{"type":"Polygon","arcs":[[4592,4593,-4473,-4589,4594]],"properties":{"id":"24660906","dp":10153,"de":1282}},{"type":"Polygon","arcs":[[-4595,-4588,4595]],"properties":{"id":"24660907","dp":9488,"de":2555}},{"type":"Polygon","arcs":[[4596,4597,4598,-4593,-4596,-4587,4599,-4325,4600,4601,4602,-4467,4603]],"properties":{"id":"24660908","dp":6482,"de":1924}},{"type":"Polygon","arcs":[[-4599,4604,4605,-4604,-4466,-4474,-4594]],"properties":{"id":"24660909","dp":10358,"de":1793}},{"type":"Polygon","arcs":[[4606,-4605,-4598]],"properties":{"id":"24660910","dp":13546,"de":0}},{"type":"Polygon","arcs":[[-4607,-4597,-4606]],"properties":{"id":"24660911","dp":13955,"de":0}},{"type":"Polygon","arcs":[[-4324,4607,-4601]],"properties":{"id":"24660912","dp":12570,"de":2712}},{"type":"Polygon","arcs":[[-2631,4608,4609,4610,-4602,-4608]],"properties":{"id":"24660913","dp":6696,"de":10600}},{"type":"Polygon","arcs":[[-4611,4611,-756,-4603]],"properties":{"id":"24660914","dp":6847,"de":4130}},{"type":"Polygon","arcs":[[-4610,4612,4613,4614,4615,4616,-757,-4612]],"properties":{"id":"24660915","dp":6709,"de":1865}},{"type":"Polygon","arcs":[[4617,-758,-4617]],"properties":{"id":"24660916","dp":6732,"de":911}},{"type":"Polygon","arcs":[[-4616,4618,4619,4620,4621,4622,4623,4624,-759,-4618]],"properties":{"id":"24660917","dp":937,"de":2228}},{"type":"Polygon","arcs":[[-4615,4625,-4619]],"properties":{"id":"24660918","dp":7993,"de":1445}},{"type":"Polygon","arcs":[[4626,-4620,-4626,-4614]],"properties":{"id":"24660919","dp":3671,"de":2519}},{"type":"Polygon","arcs":[[-4613,-4609,-2630,-2469,4627,-4621,-4627]],"properties":{"id":"24660920","dp":2294,"de":2096}},{"type":"Polygon","arcs":[[-4628,-2475,4628,4629,4630,-4622]],"properties":{"id":"24660921","dp":4868,"de":0}},{"type":"Polygon","arcs":[[4631,-4630]],"properties":{"id":"24660922","dp":7716,"de":0}},{"type":"Polygon","arcs":[[-4631,-4632,-4629,-2474,4632,-4279,4633,4634,-4623]],"properties":{"id":"24660923","dp":3032,"de":1617}},{"type":"Polygon","arcs":[[-2473,-2468,-4286,-4284,-4274,4635,-4280,-4633]],"properties":{"id":"24660924","dp":2561,"de":291}},{"type":"Polygon","arcs":[[-4281,-4636]],"properties":{"id":"24660925","dp":19018,"de":1380}},{"type":"Polygon","arcs":[[-643,4636,-4537,-4538,-4540,4637]],"properties":{"id":"24660174","dp":9953,"de":0}},{"type":"Polygon","arcs":[[-648,-644,-4638,-4541,-659,-650]],"properties":{"id":"24660175","dp":7087,"de":0}},{"type":"Polygon","arcs":[[-4535,-4637,-642,-629,4638,-4090]],"properties":{"id":"24660176","dp":2965,"de":1467}},{"type":"Polygon","arcs":[[-4639,-628,-622,4639,-4091]],"properties":{"id":"24660177","dp":2979,"de":0}},{"type":"Polygon","arcs":[[-1933,-1421,4640,-4089,-4092,-4640]],"properties":{"id":"24660178","dp":2868,"de":1465}},{"type":"Polygon","arcs":[[4641,4642,4643,-4083,-4087,-4641]],"properties":{"id":"24660179","dp":3765,"de":321}},{"type":"Polygon","arcs":[[-4642,-1420,-1923,4644]],"properties":{"id":"24660180","dp":4749,"de":1354}},{"type":"Polygon","arcs":[[-4643,-4645,-1922,-1918,4645,4646,4647]],"properties":{"id":"24660181","dp":12371,"de":2291}},{"type":"Polygon","arcs":[[-1917,-1412,4648,-4646]],"properties":{"id":"24660182","dp":22071,"de":0}},{"type":"Polygon","arcs":[[4649,-4647,-4649,-1417,4650,4651,-4078]],"properties":{"id":"24660183","dp":7839,"de":1737}},{"type":"Polygon","arcs":[[-4648,-4650,-4082,-4084,-4644]],"properties":{"id":"24660184","dp":8692,"de":5130}},{"type":"Polygon","arcs":[[-4651,-1416,4652,4653]],"properties":{"id":"24660185","dp":10135,"de":0}},{"type":"Polygon","arcs":[[-4079,-4652,-4654,4654,4655,4656,-690]],"properties":{"id":"24660186","dp":12608,"de":1440}},{"type":"Polygon","arcs":[[-1415,-1411,-1402,-4655,-4653]],"properties":{"id":"24660187","dp":9391,"de":0}},{"type":"Polygon","arcs":[[-4656,-1407,4657,4658]],"properties":{"id":"24660188","dp":12819,"de":1101}},{"type":"Polygon","arcs":[[4659,-4658,-1406,4660]],"properties":{"id":"24660189","dp":23013,"de":0}},{"type":"Polygon","arcs":[[-691,-4657,-4659,-4660,-680,-686]],"properties":{"id":"24660190","dp":11042,"de":2055}},{"type":"Polygon","arcs":[[-681,-4661,-1394,4661]],"properties":{"id":"24660191","dp":20078,"de":0}},{"type":"Polygon","arcs":[[-4662,-1398,4662,-682]],"properties":{"id":"24660192","dp":16729,"de":0}},{"type":"Polygon","arcs":[[4663,-4663,-1397,4664,-1399,4665]],"properties":{"id":"24660193","dp":13200,"de":0}},{"type":"Polygon","arcs":[[-211,-3313,-3304,-3297,4666,-3463]],"properties":{"id":"24660659","dp":11496,"de":852}},{"type":"Polygon","arcs":[[-4667,-3303,4667,-3001,-3464]],"properties":{"id":"24660660","dp":12273,"de":1986}},{"type":"Polygon","arcs":[[4668,-2998,-4668,4669]],"properties":{"id":"24660661","dp":28965,"de":2681}},{"type":"Polygon","arcs":[[4670,-2994,-2997,-4669]],"properties":{"id":"24660662","dp":8566,"de":0}},{"type":"Polygon","arcs":[[4671,-4671,-4670,-3302]],"properties":{"id":"24660663","dp":30346,"de":2475}},{"type":"Polygon","arcs":[[-3301,-4584,4672,-2992,-4672]],"properties":{"id":"24660664","dp":30088,"de":0}},{"type":"Polygon","arcs":[[-4673,-4582,-4579,4673]],"properties":{"id":"24660665","dp":26808,"de":0}},{"type":"Polygon","arcs":[[4674,-2954,-2993,-4674]],"properties":{"id":"24660666","dp":34933,"de":2202}},{"type":"Polygon","arcs":[[-4578,-2916,-2951,-4675]],"properties":{"id":"24660667","dp":23824,"de":2534}},{"type":"Polygon","arcs":[[4675,4676,4677,4678]],"properties":{"id":"24663101","dp":2883,"de":305}},{"type":"Polygon","arcs":[[-3449,4679,-3447,4680,4681,4682,4683,4684,4685]],"properties":{"id":"24662988","dp":1403,"de":926}},{"type":"Polygon","arcs":[[4686,4687,4688,4689,4690,4691]],"properties":{"id":"24661358","dp":14773,"de":10933}},{"type":"Polygon","arcs":[[4692,4693,4694,4695,4696,4697,4698]],"properties":{"id":"24662589","dp":2389,"de":1641}},{"type":"Polygon","arcs":[[4699,-4698,4700,4701,4702]],"properties":{"id":"24662590","dp":7384,"de":736}},{"type":"Polygon","arcs":[[4703,4704,4705,-4699,-4700]],"properties":{"id":"24662591","dp":4921,"de":0}},{"type":"Polygon","arcs":[[4706,-4704,-4703,4707,4708]],"properties":{"id":"24662592","dp":7996,"de":0}},{"type":"Polygon","arcs":[[4709,-4692,4710,4711,4712,4713]],"properties":{"id":"24661359","dp":22229,"de":8188}},{"type":"Polygon","arcs":[[4714,-4712,4715,4716]],"properties":{"id":"24661360","dp":20497,"de":3167}},{"type":"Polygon","arcs":[[-4711,-4691,4717,-4716]],"properties":{"id":"24661361","dp":16989,"de":5510}},{"type":"Polygon","arcs":[[-4717,-4718,-4690,4718,4719,4720,4721]],"properties":{"id":"24661362","dp":6549,"de":2243}},{"type":"Polygon","arcs":[[4722,4723,-4719,4724]],"properties":{"id":"24661363","dp":10041,"de":5463}},{"type":"Polygon","arcs":[[4725,-4715,-4722,4726,4727,4728,4729,4730]],"properties":{"id":"24661364","dp":5086,"de":5761}},{"type":"Polygon","arcs":[[4731,4732,-4731]],"properties":{"id":"24661365","dp":28461,"de":0}},{"type":"Polygon","arcs":[[-4730,4733,4734,-4732]],"properties":{"id":"24661366","dp":31026,"de":2901}},{"type":"Polygon","arcs":[[4735,4736,-4734,-4729,4737,4738,4739]],"properties":{"id":"24661367","dp":18933,"de":3523}},{"type":"Polygon","arcs":[[-4740,4740,4741,4742]],"properties":{"id":"24661368","dp":19522,"de":4020}},{"type":"Polygon","arcs":[[4743,-4742,4744,4745]],"properties":{"id":"24661369","dp":17923,"de":4824}},{"type":"Polygon","arcs":[[4746,4747,-4746]],"properties":{"id":"24661370","dp":19392,"de":4153}},{"type":"Polygon","arcs":[[4748,-4747,-4745,-4741,-4739,4749,4750,4751,4752]],"properties":{"id":"24661371","dp":5503,"de":3788}},{"type":"Polygon","arcs":[[4753,-4749,4754,4755]],"properties":{"id":"24661372","dp":16048,"de":3024}},{"type":"Polygon","arcs":[[-4753,4756,4757,-4755]],"properties":{"id":"24661373","dp":16679,"de":1778}},{"type":"Polygon","arcs":[[-4752,4758,4759,-4757]],"properties":{"id":"24661374","dp":11866,"de":6888}},{"type":"Polygon","arcs":[[4760,4761,-4759,-4751,4762,4763,4764,4765]],"properties":{"id":"24661375","dp":4338,"de":21860}},{"type":"Polygon","arcs":[[4766,-4762,4767,4768]],"properties":{"id":"24661376","dp":11936,"de":55212}},{"type":"Polygon","arcs":[[-4760,-4767,4769,4770,4771]],"properties":{"id":"24661377","dp":13010,"de":13210}},{"type":"Polygon","arcs":[[-4758,-4772,4772,4773]],"properties":{"id":"24661378","dp":16306,"de":2552}},{"type":"Polygon","arcs":[[4774,-4756,-4774,4775]],"properties":{"id":"24661379","dp":15426,"de":3963}},{"type":"Polygon","arcs":[[4776,4777,4778,-4775,4779]],"properties":{"id":"24661380","dp":14057,"de":4472}},{"type":"Polygon","arcs":[[4780,4781,-4778,4782]],"properties":{"id":"24661381","dp":23529,"de":3287}},{"type":"Polygon","arcs":[[4783,-4781,4784,4785]],"properties":{"id":"24661382","dp":18792,"de":12640}},{"type":"Polygon","arcs":[[-1212,-3704,-3706,4786,4787,4788,4789,4790,4791]],"properties":{"id":"24661858","dp":4735,"de":20919}},{"type":"Polygon","arcs":[[4792,-4791,4793,4794,4795,4796,4797,4798]],"properties":{"id":"24661859","dp":8760,"de":65700}},{"type":"Polygon","arcs":[[4799,4800,-4795]],"properties":{"id":"24661860","dp":41379,"de":12068}},{"type":"Polygon","arcs":[[-3674,-4798,4801,4802,4803,-3679]],"properties":{"id":"24661861","dp":13040,"de":9684}},{"type":"Polygon","arcs":[[4804,4805,4806,-4803]],"properties":{"id":"24661862","dp":17269,"de":3212}},{"type":"Polygon","arcs":[[-4807,4807,4808,4809,4810]],"properties":{"id":"24661863","dp":17048,"de":2108}},{"type":"Polygon","arcs":[[-4804,-4811,4811,4812]],"properties":{"id":"24661864","dp":15515,"de":8520}},{"type":"Polygon","arcs":[[4813,-4812,-4810,4814,4815,4816,4817]],"properties":{"id":"24661865","dp":7883,"de":25525}},{"type":"Polygon","arcs":[[-3680,-4813,-4814,4818,-3676]],"properties":{"id":"24661866","dp":10557,"de":5268}},{"type":"Polygon","arcs":[[4819,4820,-4705,-4707,4821]],"properties":{"id":"24662593","dp":6048,"de":0}},{"type":"Polygon","arcs":[[4822,4823,4824,-4822]],"properties":{"id":"24662594","dp":6442,"de":0}},{"type":"Polygon","arcs":[[-4823,-4709,4825,-3397]],"properties":{"id":"24662595","dp":7840,"de":4466}},{"type":"Polygon","arcs":[[-3399,4826,4827]],"properties":{"id":"24662598","dp":8152,"de":0}},{"type":"Polygon","arcs":[[4828,4829,-3395,-4828,4830,4831]],"properties":{"id":"24662599","dp":9471,"de":0}},{"type":"Polygon","arcs":[[4832,-4829,4833]],"properties":{"id":"24662600","dp":12691,"de":0}},{"type":"Polygon","arcs":[[4834,-3794,4835,4836,4837,-4834,-4832,4838]],"properties":{"id":"24662601","dp":2907,"de":6314}},{"type":"Polygon","arcs":[[4839,-4824,-3396,-4830,-4833,-4838]],"properties":{"id":"24662602","dp":4897,"de":0}},{"type":"Polygon","arcs":[[4840,4841,-4840,-4837]],"properties":{"id":"24662603","dp":4293,"de":3968}},{"type":"Polygon","arcs":[[-4836,4842,4843,4844,4845,4846,4847,-4841]],"properties":{"id":"24662604","dp":4586,"de":0}},{"type":"Polygon","arcs":[[-4165,4848,-4843,-3793,-4162]],"properties":{"id":"24662605","dp":13399,"de":2272}},{"type":"Polygon","arcs":[[4849,-4844,-4849,-4164]],"properties":{"id":"24662606","dp":17614,"de":0}},{"type":"Polygon","arcs":[[4850,4851,4852,-4850,-4168]],"properties":{"id":"24662607","dp":10490,"de":5313}},{"type":"Polygon","arcs":[[4853,4854,-4851,-4171]],"properties":{"id":"24662608","dp":13543,"de":6526}},{"type":"Polygon","arcs":[[-4854,-4175,4855]],"properties":{"id":"24662609","dp":14225,"de":0}},{"type":"Polygon","arcs":[[-4210,-4213,-510,-4852,-4855,-4856,-4174,-4178]],"properties":{"id":"24662610","dp":9243,"de":6914}},{"type":"Polygon","arcs":[[-521,4856,-4845,-4853,-518]],"properties":{"id":"24662611","dp":10550,"de":13188}},{"type":"Polygon","arcs":[[-4857,4857,-4846]],"properties":{"id":"24662612","dp":11108,"de":10277}},{"type":"Polygon","arcs":[[-520,-526,4858,-4847,-4858]],"properties":{"id":"24662613","dp":9747,"de":2135}},{"type":"Polygon","arcs":[[4859,4860,4861,4862,4863,4864]],"properties":{"id":"24663010","dp":2137,"de":1450}},{"type":"Polygon","arcs":[[-4862,4865]],"properties":{"id":"24663011","dp":4900,"de":330}},{"type":"Polygon","arcs":[[4866,-4713,-4726,-4733,4867,4868]],"properties":{"id":"24661394","dp":27470,"de":7312}},{"type":"Polygon","arcs":[[4869,-4687,-4710,4870,4871]],"properties":{"id":"24661395","dp":8754,"de":3679}},{"type":"Polygon","arcs":[[4872,4873,-4870,4874]],"properties":{"id":"24661396","dp":9097,"de":1299}},{"type":"Polygon","arcs":[[-4873,4875,4876,4877,4878,4879]],"properties":{"id":"24661397","dp":3270,"de":1639}},{"type":"Polygon","arcs":[[4880,4881,4882,-4880]],"properties":{"id":"24661398","dp":8016,"de":901}},{"type":"Polygon","arcs":[[4883,4884]],"properties":{"id":"24662616","dp":9001,"de":0}},{"type":"Polygon","arcs":[[-4885,4885,4886,-4820,4887]],"properties":{"id":"24662617","dp":10181,"de":726}},{"type":"Polygon","arcs":[[-4887,-4693,-4706,-4821]],"properties":{"id":"24662618","dp":4851,"de":652}},{"type":"Polygon","arcs":[[4888,4889,4890,4891,4892,-3795,-4835,4893]],"properties":{"id":"24662619","dp":5920,"de":3944}},{"type":"Polygon","arcs":[[4894,-4890]],"properties":{"id":"24662620","dp":19502,"de":0}},{"type":"Polygon","arcs":[[4895,-4891,-4895,4896,-4110,-4114]],"properties":{"id":"24662621","dp":10958,"de":798}},{"type":"Polygon","arcs":[[-4897,-4889,4897,4898,-4107]],"properties":{"id":"24662622","dp":17121,"de":2424}},{"type":"Polygon","arcs":[[-4898,4899,4900,4901]],"properties":{"id":"24662623","dp":13792,"de":1458}},{"type":"Polygon","arcs":[[-4899,-4902,-4266,-4273,-4103]],"properties":{"id":"24662624","dp":13073,"de":2015}},{"type":"Polygon","arcs":[[-4901,4902,-4267]],"properties":{"id":"24662625","dp":16887,"de":0}},{"type":"Polygon","arcs":[[-4265,-4903,4903,4904,-4254,-4261]],"properties":{"id":"24662626","dp":11488,"de":0}},{"type":"Polygon","arcs":[[-4894,4905,-4904,-4900]],"properties":{"id":"24662627","dp":11148,"de":2153}},{"type":"Polygon","arcs":[[-1894,-4249,-4255,-4905,-4906,-4839,-4831,-4827,-3398,4906,4907,-1858,-1862,-1864,-1889]],"properties":{"id":"24662628","dp":472,"de":1388}},{"type":"Polygon","arcs":[[4908,4909,-4907,-4826,-4708,-4702,4910]],"properties":{"id":"24662629","dp":1060,"de":115}},{"type":"Polygon","arcs":[[-4910,4911,4912,4913,-4908]],"properties":{"id":"24662630","dp":11777,"de":1204}},{"type":"Polygon","arcs":[[-4914,4914,4915,4916,-1859]],"properties":{"id":"24662631","dp":15867,"de":1589}},{"type":"Polygon","arcs":[[-4917,4917,-1845,-1856]],"properties":{"id":"24662632","dp":15483,"de":2995}},{"type":"Polygon","arcs":[[4918,4919,-1846,-4918]],"properties":{"id":"24662633","dp":17894,"de":1372}},{"type":"Polygon","arcs":[[-4919,-4916,4920,4921]],"properties":{"id":"24662634","dp":20934,"de":0}},{"type":"Polygon","arcs":[[4922,4923,-4921,-4915,-4913]],"properties":{"id":"24662635","dp":11686,"de":2710}},{"type":"Polygon","arcs":[[4924,-4923,-4912,4925]],"properties":{"id":"24662636","dp":24550,"de":0}},{"type":"Polygon","arcs":[[4926,-4926,-4909]],"properties":{"id":"24662637","dp":23988,"de":0}},{"type":"Polygon","arcs":[[4927,4928,4929,4930,4931]],"properties":{"id":"24662638","dp":10316,"de":1399}},{"type":"Polygon","arcs":[[4932,4933,4934,-4929,4935]],"properties":{"id":"24662639","dp":9787,"de":1415}},{"type":"Polygon","arcs":[[4936,-4933,4937]],"properties":{"id":"24662640","dp":12450,"de":1214}},{"type":"Polygon","arcs":[[4938,4939,-4934,-4937]],"properties":{"id":"24662641","dp":9096,"de":0}},{"type":"Polygon","arcs":[[4940,4941,4942,4943,4944,4945,4946,4947]],"properties":{"id":"24663030","dp":2966,"de":382}},{"type":"Polygon","arcs":[[4948,4949,-4946,4950,4951,4952]],"properties":{"id":"24663031","dp":3616,"de":0}},{"type":"Polygon","arcs":[[4953,-3083,-3162,4954]],"properties":{"id":"24663075","dp":674,"de":79}},{"type":"Polygon","arcs":[[-3103,-2982,4955,-3160]],"properties":{"id":"24663076","dp":1076,"de":101}},{"type":"MultiPolygon","arcs":[[[4956,4957,4958,4959,4960,4961,4962]],[[4963,4964,4965,4966]]],"properties":{"id":"24663077","dp":282,"de":62}},{"type":"Polygon","arcs":[[4967,4968,4969]],"properties":{"id":"24663079","dp":7864,"de":0}},{"type":"Polygon","arcs":[[4970,4971,-4970,4972,4973,4974]],"properties":{"id":"24663080","dp":5606,"de":0}},{"type":"Polygon","arcs":[[4975,-4975,4976]],"properties":{"id":"24663081","dp":5152,"de":0}},{"type":"Polygon","arcs":[[4977,-4977,-4974,4978,4979,4980]],"properties":{"id":"24663082","dp":4933,"de":0}},{"type":"Polygon","arcs":[[4981,4982,4983,-4881,-4879,4984,4985,4986]],"properties":{"id":"24661399","dp":2976,"de":541}},{"type":"Polygon","arcs":[[4987,4988,4989,4990,-4984]],"properties":{"id":"24661400","dp":3899,"de":708}},{"type":"Polygon","arcs":[[-1343,-1346,4991,-4982,4992,-1339]],"properties":{"id":"24661401","dp":5107,"de":3163}},{"type":"Polygon","arcs":[[4993,-233,4994,-4988,-4983,-4992]],"properties":{"id":"24661402","dp":12976,"de":5402}},{"type":"Polygon","arcs":[[-4994,-1347,-3461,-234]],"properties":{"id":"24661405","dp":31666,"de":1570}},{"type":"Polygon","arcs":[[-1333,-1340,-4993,-4987,4995,4996,4997]],"properties":{"id":"24661407","dp":9731,"de":1788}},{"type":"Polygon","arcs":[[-4986,4998,-4996]],"properties":{"id":"24661408","dp":22746,"de":2331}},{"type":"Polygon","arcs":[[-1329,4999,-4997,-4999,-4985,-4878,5000,5001]],"properties":{"id":"24661409","dp":2728,"de":4005}},{"type":"Polygon","arcs":[[-4998,-5000,-1328]],"properties":{"id":"24661410","dp":24615,"de":5384}},{"type":"Polygon","arcs":[[5002,-5001,-4877,5003,5004]],"properties":{"id":"24661411","dp":3817,"de":566}},{"type":"Polygon","arcs":[[5005,-1330,-5002,-5003,5006,5007]],"properties":{"id":"24661412","dp":254,"de":260}},{"type":"Polygon","arcs":[[-5007,-5005,5008,5009,5010,5011,5012,5013]],"properties":{"id":"24661413","dp":3642,"de":721}},{"type":"Polygon","arcs":[[5014,-5011,5015,5016]],"properties":{"id":"24661414","dp":21659,"de":3526}},{"type":"Polygon","arcs":[[-5012,-5015,5017,5018,5019]],"properties":{"id":"24661415","dp":16468,"de":1984}},{"type":"Polygon","arcs":[[-5019,5020,5021,5022,5023,5024]],"properties":{"id":"24661416","dp":16285,"de":3650}},{"type":"Polygon","arcs":[[5025,5026,5027,-3173]],"properties":{"id":"24661893","dp":17329,"de":3125}},{"type":"Polygon","arcs":[[-5026,5028,5029,5030,5031,5032,5033]],"properties":{"id":"24661894","dp":5661,"de":8260}},{"type":"Polygon","arcs":[[-3172,5034,5035,5036,5037,-5029]],"properties":{"id":"24661895","dp":16720,"de":5600}},{"type":"Polygon","arcs":[[5038,-5035,-3171]],"properties":{"id":"24661896","dp":20169,"de":0}},{"type":"Polygon","arcs":[[-3170,5039,5040,-5036,-5039]],"properties":{"id":"24661897","dp":16994,"de":1554}},{"type":"Polygon","arcs":[[5041,5042,-5040,-3169]],"properties":{"id":"24661898","dp":14101,"de":6568}},{"type":"Polygon","arcs":[[5043,5044,-5042,-3168]],"properties":{"id":"24661899","dp":23580,"de":5626}},{"type":"Polygon","arcs":[[5045,5046,5047,5048,-5045]],"properties":{"id":"24661900","dp":15261,"de":8126}},{"type":"Polygon","arcs":[[-5049,5049,5050,-5043]],"properties":{"id":"24661901","dp":13506,"de":6944}},{"type":"Polygon","arcs":[[5051,5052,5053,5054,5055]],"properties":{"id":"24663084","dp":3793,"de":0}},{"type":"Polygon","arcs":[[-5054,5056,-4963,5057,-4965,5058]],"properties":{"id":"24663085","dp":3675,"de":0}},{"type":"Polygon","arcs":[[5059,-4980,5060,5061,5062,-4957,-5057]],"properties":{"id":"24663086","dp":5384,"de":0}},{"type":"Polygon","arcs":[[5063,5064,5065,5066]],"properties":{"id":"24661426","dp":21391,"de":2173}},{"type":"Polygon","arcs":[[5067,5068,5069,5070,-5065]],"properties":{"id":"24661427","dp":12930,"de":8255}},{"type":"Polygon","arcs":[[5071,5072,-5070,5073]],"properties":{"id":"24661428","dp":16936,"de":8274}},{"type":"Polygon","arcs":[[5074,-4773,-4771,5075,-5073]],"properties":{"id":"24661429","dp":10381,"de":14088}},{"type":"Polygon","arcs":[[5076,5077,-4780,-4776,-5075]],"properties":{"id":"24661430","dp":12173,"de":6956}},{"type":"Polygon","arcs":[[5078,5079,-5022,5080,-4785,-4783,-4777,-5078]],"properties":{"id":"24661431","dp":11167,"de":10583}},{"type":"Polygon","arcs":[[5081,5082,-5079,-5077,-5072,5083]],"properties":{"id":"24661432","dp":17155,"de":2245}},{"type":"Polygon","arcs":[[-5076,-4770,-4769,5084,5085,-5071]],"properties":{"id":"24661433","dp":10080,"de":7329}},{"type":"Polygon","arcs":[[-5085,-4768,-4761,5086,5087,5088]],"properties":{"id":"24661434","dp":12990,"de":11934}},{"type":"Polygon","arcs":[[-5086,-5089,5089,5090,5091,-5066]],"properties":{"id":"24661435","dp":14108,"de":11512}},{"type":"Polygon","arcs":[[-5088,5092,5093,-5090]],"properties":{"id":"24661436","dp":20194,"de":3721}},{"type":"Polygon","arcs":[[-5094,5094,5095,5096]],"properties":{"id":"24661437","dp":16964,"de":8333}},{"type":"Polygon","arcs":[[-5091,-5097,5097,5098,5099]],"properties":{"id":"24661438","dp":15305,"de":6845}},{"type":"Polygon","arcs":[[5100,-5098,5101,5102,5103]],"properties":{"id":"24661439","dp":14174,"de":7119}},{"type":"Polygon","arcs":[[-5096,5104,-5102]],"properties":{"id":"24661440","dp":17272,"de":3409}},{"type":"Polygon","arcs":[[5105,-5103,-5105,5106,5107,5108,5109]],"properties":{"id":"24661441","dp":8472,"de":1280}},{"type":"Polygon","arcs":[[5110,-4765,5111,-5107,-5095]],"properties":{"id":"24661442","dp":9494,"de":2853}},{"type":"Polygon","arcs":[[-5087,-4766,-5111,-5093]],"properties":{"id":"24661443","dp":19421,"de":2210}},{"type":"Polygon","arcs":[[5112,5113,-5112,5114,5115,5116,5117]],"properties":{"id":"24661444","dp":15638,"de":2543}},{"type":"Polygon","arcs":[[-5113,5118,5119]],"properties":{"id":"24661445","dp":13980,"de":3618}},{"type":"Polygon","arcs":[[-5118,5120,5121,-5119]],"properties":{"id":"24661446","dp":14249,"de":2544}},{"type":"Polygon","arcs":[[-5122,5122,5123,5124,5125]],"properties":{"id":"24661447","dp":14377,"de":3228}},{"type":"Polygon","arcs":[[5126,-1257,5127,5128,-3671]],"properties":{"id":"24661925","dp":10527,"de":8822}},{"type":"Polygon","arcs":[[5129,5130,5131,-3672,-5129]],"properties":{"id":"24661926","dp":8836,"de":5325}},{"type":"Polygon","arcs":[[-1263,5132,-5130,-5128]],"properties":{"id":"24661927","dp":9599,"de":8166}},{"type":"Polygon","arcs":[[-5131,-5133,-1266,-4792,-4793,5133]],"properties":{"id":"24661928","dp":7821,"de":17913}},{"type":"Polygon","arcs":[[-5134,-4799,-3673,-5132]],"properties":{"id":"24661929","dp":15569,"de":24683}},{"type":"Polygon","arcs":[[5134,-3695,-3702,5135]],"properties":{"id":"24661936","dp":14148,"de":8703}},{"type":"Polygon","arcs":[[-3718,-3710,5136,-5136,-3701,-1211]],"properties":{"id":"24661937","dp":11421,"de":7106}},{"type":"Polygon","arcs":[[5137,5138,5139,5140,5141,5142]],"properties":{"id":"24663123","dp":3014,"de":274}},{"type":"Polygon","arcs":[[-5143,5143,5144,5145]],"properties":{"id":"24663124","dp":426,"de":1169}},{"type":"Polygon","arcs":[[5146,5147,-5144,-5142,5148,-4961]],"properties":{"id":"24663125","dp":72,"de":62}},{"type":"Polygon","arcs":[[5149,5150]],"properties":{"id":"24663126","dp":3847,"de":308}},{"type":"Polygon","arcs":[[-5150,5151]],"properties":{"id":"24663127","dp":3074,"de":0}},{"type":"Polygon","arcs":[[-4680,-3448]],"properties":{"id":"24662989","dp":4683,"de":496}},{"type":"Polygon","arcs":[[5152,5153,5154,-3443]],"properties":{"id":"24662992","dp":8168,"de":0}},{"type":"Polygon","arcs":[[5155,-4681,-3446,5156]],"properties":{"id":"24662993","dp":7857,"de":2639}},{"type":"Polygon","arcs":[[-3445,5157,5158,5159,5160,5161,5162,-5157]],"properties":{"id":"24662994","dp":3402,"de":728}},{"type":"Polygon","arcs":[[5163,5164,5165,5166,5167]],"properties":{"id":"24663088","dp":3617,"de":225}},{"type":"Polygon","arcs":[[-5166,5168]],"properties":{"id":"24663089","dp":4119,"de":0}},{"type":"Polygon","arcs":[[5169,5170,5171,5172,5173,5174]],"properties":{"id":"24663090","dp":2782,"de":211}},{"type":"Polygon","arcs":[[-5175,5175,5176]],"properties":{"id":"24663091","dp":2875,"de":0}},{"type":"Polygon","arcs":[[-5170,-5177,5177]],"properties":{"id":"24663092","dp":3252,"de":0}},{"type":"Polygon","arcs":[[5178,5179]],"properties":{"id":"24663094","dp":3788,"de":0}},{"type":"Polygon","arcs":[[5180,5181,-5180,5182,5183,5184,5185]],"properties":{"id":"24663095","dp":2894,"de":362}},{"type":"Polygon","arcs":[[5186,5187,5188,5189,5190,5191,5192]],"properties":{"id":"24663096","dp":1854,"de":332}},{"type":"Polygon","arcs":[[5193,5194,5195,-5193,5196,5197]],"properties":{"id":"24663097","dp":2731,"de":255}},{"type":"Polygon","arcs":[[5198,-5187,-5196]],"properties":{"id":"24663098","dp":2882,"de":0}},{"type":"Polygon","arcs":[[-5195,5199,5200,5201,5202,5203,-5188,-5199]],"properties":{"id":"24663099","dp":804,"de":140}},{"type":"Polygon","arcs":[[5204,-5200,-5194,5205,-4677]],"properties":{"id":"24663100","dp":3489,"de":0}},{"type":"Polygon","arcs":[[5206,5207,5208,5209,5210,5211]],"properties":{"id":"24663369","dp":10290,"de":38854}},{"type":"Polygon","arcs":[[-4678,-5206,-5198,5212,5213,5214]],"properties":{"id":"24663102","dp":2151,"de":413}},{"type":"Polygon","arcs":[[5215,5216,5217,5218,5219,5220,5221]],"properties":{"id":"24663103","dp":1368,"de":279}},{"type":"Polygon","arcs":[[5222,-5220,5223]],"properties":{"id":"24663104","dp":2245,"de":0}},{"type":"Polygon","arcs":[[5224,-5221,-5223,5225]],"properties":{"id":"24663105","dp":2219,"de":179}},{"type":"MultiPolygon","arcs":[[[5226,-5225,5227,5228,5229,5230]],[[5231,5232,5233,5234,5235,5236,5237]]],"properties":{"id":"24663106","dp":1239,"de":485}},{"type":"Polygon","arcs":[[5238,5239,5240,5241,-5222,-5227,5242]],"properties":{"id":"24663107","dp":1383,"de":479}},{"type":"Polygon","arcs":[[5243,5244,-5216,-5242]],"properties":{"id":"24663108","dp":1929,"de":0}},{"type":"Polygon","arcs":[[-5244,-5241,5245,5246,5247]],"properties":{"id":"24663109","dp":1943,"de":163}},{"type":"Polygon","arcs":[[-5245,-5248,5248,-5202,-5217]],"properties":{"id":"24663110","dp":1462,"de":139}},{"type":"Polygon","arcs":[[-5247,5249,5250,5251,5252,5253,5254,-5203,-5249]],"properties":{"id":"24663111","dp":206,"de":1307}},{"type":"Polygon","arcs":[[5255,5256,5257,-5251]],"properties":{"id":"24663112","dp":1319,"de":168}},{"type":"Polygon","arcs":[[5258,-3498,5259]],"properties":{"id":"24663139","dp":8410,"de":0}},{"type":"Polygon","arcs":[[-5156,-5163,5260,-4682]],"properties":{"id":"24662995","dp":2103,"de":574}},{"type":"Polygon","arcs":[[5261,5262,5263,-5261]],"properties":{"id":"24662996","dp":2752,"de":0}},{"type":"Polygon","arcs":[[5264,-5262,-5162,5265,5266]],"properties":{"id":"24662997","dp":11611,"de":828}},{"type":"Polygon","arcs":[[-5266,-5161,5267,5268,5269,5270,5271,5272]],"properties":{"id":"24662998","dp":262,"de":0}},{"type":"Polygon","arcs":[[-5269,5273,5274]],"properties":{"id":"24662999","dp":6982,"de":0}},{"type":"Polygon","arcs":[[5275,5276,5277,5278,-5271]],"properties":{"id":"24663000","dp":3577,"de":0}},{"type":"Polygon","arcs":[[5279,5280,5281,5282,-5277]],"properties":{"id":"24663001","dp":2883,"de":0}},{"type":"Polygon","arcs":[[5283,5284,5285,5286,5287,-5272,-5279]],"properties":{"id":"24663002","dp":3145,"de":589}},{"type":"Polygon","arcs":[[-5267,-5273,-5288,5288,5289,5290,5291,5292,-4865,5293]],"properties":{"id":"24663003","dp":2185,"de":331}},{"type":"Polygon","arcs":[[5294,5295,5296,-5291]],"properties":{"id":"24663004","dp":2748,"de":0}},{"type":"Polygon","arcs":[[5297,5298,5299,-5296]],"properties":{"id":"24663005","dp":2154,"de":436}},{"type":"Polygon","arcs":[[-5295,-5290,5300,5301,5302,-5298]],"properties":{"id":"24663006","dp":2700,"de":513}},{"type":"Polygon","arcs":[[-5299,-5303,5303,5304,5305]],"properties":{"id":"24663007","dp":2390,"de":442}},{"type":"Polygon","arcs":[[-5292,-5297,-5300,-5306,5306,5307]],"properties":{"id":"24663008","dp":2340,"de":0}},{"type":"Polygon","arcs":[[-5293,-5308,5308,5309,5310,-4860]],"properties":{"id":"24663009","dp":3982,"de":369}},{"type":"Polygon","arcs":[[5311,5312,5313,5314,5315,5316,-3478,5317]],"properties":{"id":"24661728","dp":2231,"de":181}},{"type":"Polygon","arcs":[[-5316,5318,-360,5319]],"properties":{"id":"24661729","dp":8286,"de":7159}},{"type":"Polygon","arcs":[[-4819,-4818,5320,5321,-3677]],"properties":{"id":"24661867","dp":7988,"de":18450}},{"type":"Polygon","arcs":[[-5321,-4817,5322,5323]],"properties":{"id":"24661868","dp":21743,"de":4816}},{"type":"Polygon","arcs":[[-5323,-4816,5324,5325,5326,5327]],"properties":{"id":"24661869","dp":6918,"de":5238}},{"type":"Polygon","arcs":[[5328,5329,-3678,-5322,-5324,-5328,5330]],"properties":{"id":"24661870","dp":4383,"de":5790}},{"type":"Polygon","arcs":[[5331,-5237,5332,5333,5334,5335,5336]],"properties":{"id":"24663128","dp":1312,"de":1785}},{"type":"Polygon","arcs":[[5337,5338,5339,5340,-5333]],"properties":{"id":"24663129","dp":1128,"de":536}},{"type":"Polygon","arcs":[[-5341,5341,5342,-5334]],"properties":{"id":"24663130","dp":2422,"de":866}},{"type":"Polygon","arcs":[[5343,-5342,-5340,5344,5345]],"properties":{"id":"24663131","dp":3284,"de":945}},{"type":"Polygon","arcs":[[-5343,-5344,5346,5347,5348,-5335]],"properties":{"id":"24663132","dp":1831,"de":453}},{"type":"Polygon","arcs":[[-5347,-5346,5349]],"properties":{"id":"24663133","dp":2086,"de":0}},{"type":"Polygon","arcs":[[-5348,-5350,-5345,-5339,5350,5351,5352,-3067,5353,5354,5355]],"properties":{"id":"24663134","dp":1348,"de":312}},{"type":"Polygon","arcs":[[-5355,5356,5357]],"properties":{"id":"24663135","dp":1995,"de":0}},{"type":"Polygon","arcs":[[5358,5359,-5337,5360,-5358,5361,5362]],"properties":{"id":"24663136","dp":1330,"de":200}},{"type":"Polygon","arcs":[[-5349,-5356,-5361,-5336]],"properties":{"id":"24663137","dp":2671,"de":273}},{"type":"Polygon","arcs":[[-5259,5363,5364,5365,5366,5367,5368,-3499]],"properties":{"id":"24663138","dp":7577,"de":924}},{"type":"Polygon","arcs":[[-4683,-5264,5369,5370,5371]],"properties":{"id":"24663140","dp":2380,"de":0}},{"type":"Polygon","arcs":[[-5263,-5265,-5294,-4864,-5370]],"properties":{"id":"24663141","dp":3953,"de":467}},{"type":"Polygon","arcs":[[5372,-2031,5373]],"properties":{"id":"24663142","dp":25457,"de":0}},{"type":"Polygon","arcs":[[5374,-5374,-2030,5375,5376,5377,-1797]],"properties":{"id":"24663143","dp":4089,"de":1331}},{"type":"Polygon","arcs":[[-5375,-1796,-1806,-1819,-2032,-5373]],"properties":{"id":"24663144","dp":4815,"de":1012}},{"type":"Polygon","arcs":[[-5377,5378,5379,5380,5381]],"properties":{"id":"24663145","dp":7448,"de":576}},{"type":"Polygon","arcs":[[-5380,5382,5383,5384]],"properties":{"id":"24663146","dp":6888,"de":576}},{"type":"Polygon","arcs":[[-5381,-5385,5385,5386]],"properties":{"id":"24663147","dp":8625,"de":2031}},{"type":"Polygon","arcs":[[5387,5388,-5383]],"properties":{"id":"24663149","dp":5396,"de":1353}},{"type":"Polygon","arcs":[[-5376,-2029,5389,5390,-5388,-5379]],"properties":{"id":"24663150","dp":5796,"de":0}},{"type":"Polygon","arcs":[[5391,5392,5393,5394,5395,5396,5397,-3437,5398,-3441,5399,5400,5401,5402]],"properties":{"id":"24663151","dp":284,"de":2721}},{"type":"Polygon","arcs":[[5403,5404,5405,5406,5407,5408,5409,-5401]],"properties":{"id":"24663152","dp":718,"de":2931}},{"type":"Polygon","arcs":[[-5409,5410,5411,5412]],"properties":{"id":"24663153","dp":1498,"de":3607}},{"type":"Polygon","arcs":[[5413,5414,-5405,5415]],"properties":{"id":"24663154","dp":2620,"de":0}},{"type":"Polygon","arcs":[[5416,5417,5418,-5406,-5415]],"properties":{"id":"24663155","dp":3962,"de":0}},{"type":"Polygon","arcs":[[5419,5420,5421,5422,5423,-5418]],"properties":{"id":"24663156","dp":4107,"de":274}},{"type":"Polygon","arcs":[[-5417,5424,5425,5426,-5420]],"properties":{"id":"24663157","dp":4373,"de":0}},{"type":"Polygon","arcs":[[5427,-5425,-5414,5428]],"properties":{"id":"24663158","dp":2091,"de":0}},{"type":"Polygon","arcs":[[-5400,5429,5430,-5429,-5416,-5404]],"properties":{"id":"24663159","dp":2908,"de":392}},{"type":"Polygon","arcs":[[-5430,-3440,5431,5432,5433],[5434,5435]],"properties":{"id":"24663160","dp":1418,"de":512}},{"type":"Polygon","arcs":[[5436,5437,5438,5439,-4943]],"properties":{"id":"24663032","dp":4308,"de":297}},{"type":"Polygon","arcs":[[5440,5441,5442,5443,5444]],"properties":{"id":"24663169","dp":5649,"de":654}},{"type":"Polygon","arcs":[[5445,-5442,5446,5447,5448,5449]],"properties":{"id":"24663170","dp":2125,"de":1054}},{"type":"Polygon","arcs":[[5450,-5444,5451]],"properties":{"id":"24663171","dp":15617,"de":8707}},{"type":"Polygon","arcs":[[-3439,5452,5453,5454,5455,5456,-5432]],"properties":{"id":"24663172","dp":1321,"de":715}},{"type":"Polygon","arcs":[[5457,5458,-5456]],"properties":{"id":"24663173","dp":2771,"de":200}},{"type":"Polygon","arcs":[[-5455,5459,5460,5461,5462,-5458]],"properties":{"id":"24663174","dp":1629,"de":1407}},{"type":"Polygon","arcs":[[5463,-3054,5464,5465,-5463]],"properties":{"id":"24663175","dp":2280,"de":724}},{"type":"Polygon","arcs":[[5466,5467,5468,5469,-5464,-5462]],"properties":{"id":"24663176","dp":2022,"de":1603}},{"type":"Polygon","arcs":[[5470,5471,5472,-5468,5473]],"properties":{"id":"24663177","dp":3514,"de":0}},{"type":"Polygon","arcs":[[5474,5475,-5474,-5467,-5461,5476,5477]],"properties":{"id":"24663178","dp":1104,"de":1497}},{"type":"Polygon","arcs":[[5478,5479,-5471,-5476]],"properties":{"id":"24663179","dp":3160,"de":0}},{"type":"Polygon","arcs":[[-5067,-5092,5480,5481]],"properties":{"id":"24661834","dp":19267,"de":5860}},{"type":"Polygon","arcs":[[5482,5483,5484,5485,5486,5487]],"properties":{"id":"24661835","dp":13910,"de":10337}},{"type":"Polygon","arcs":[[5488,-5488,5489,5490]],"properties":{"id":"24661836","dp":11541,"de":9589}},{"type":"Polygon","arcs":[[-5490,-5487,5491,5492,5493,5494]],"properties":{"id":"24661837","dp":10114,"de":10665}},{"type":"Polygon","arcs":[[5495,-5491,-5495,5496,5497]],"properties":{"id":"24661838","dp":14367,"de":7806}},{"type":"Polygon","arcs":[[-5497,-5494,5498,5499,5500]],"properties":{"id":"24661839","dp":14441,"de":6472}},{"type":"Polygon","arcs":[[-5500,5501,-5044,5502]],"properties":{"id":"24661840","dp":10863,"de":7142}},{"type":"Polygon","arcs":[[5503,-5503,-3167,5504]],"properties":{"id":"24661841","dp":15344,"de":5603}},{"type":"Polygon","arcs":[[5505,-5501,-5504,5506,5507]],"properties":{"id":"24661842","dp":18575,"de":3166}},{"type":"Polygon","arcs":[[-5331,-5327,5508,5509,5510]],"properties":{"id":"24661871","dp":6399,"de":9697}},{"type":"Polygon","arcs":[[-5510,5511,5512]],"properties":{"id":"24661872","dp":13771,"de":13840}},{"type":"Polygon","arcs":[[5513,5514,-5512]],"properties":{"id":"24661873","dp":15744,"de":1566}},{"type":"Polygon","arcs":[[-5515,5515,-412,-409,-398,5516]],"properties":{"id":"24661874","dp":11193,"de":5645}},{"type":"Polygon","arcs":[[5517,5518,5519,5520,5521,-407,-411,-416]],"properties":{"id":"24661877","dp":4971,"de":5242}},{"type":"Polygon","arcs":[[5522,5523,5524,5525,5526,-5518,-415]],"properties":{"id":"24661879","dp":7276,"de":7811}},{"type":"Polygon","arcs":[[5527,5528,-5523,5529]],"properties":{"id":"24661880","dp":14052,"de":2236}},{"type":"Polygon","arcs":[[5530,5531,5532,5533,-5524,-5529]],"properties":{"id":"24661881","dp":19101,"de":3651}},{"type":"Polygon","arcs":[[5534,5535,5536,-5531,-5528,5537]],"properties":{"id":"24661882","dp":14992,"de":2623}},{"type":"Polygon","arcs":[[5538,5539,-3175,-5535,5540]],"properties":{"id":"24661883","dp":5861,"de":38564}},{"type":"Polygon","arcs":[[5541,-5541,5542,5543]],"properties":{"id":"24661884","dp":12598,"de":8352}},{"type":"Polygon","arcs":[[5544,-5543,-5538,-5530,-414,5545,-5325]],"properties":{"id":"24661885","dp":6272,"de":887}},{"type":"Polygon","arcs":[[-5326,-5546,-417,-413,-5516,-5514,-5509]],"properties":{"id":"24661886","dp":5636,"de":22045}},{"type":"Polygon","arcs":[[-4809,5546,-5544,-5545,-4815]],"properties":{"id":"24661887","dp":14227,"de":1328}},{"type":"Polygon","arcs":[[-5536,-3174,-5028,5547]],"properties":{"id":"24661889","dp":45392,"de":10535}},{"type":"Polygon","arcs":[[-5548,5548,5549,-5537]],"properties":{"id":"24661890","dp":22307,"de":4142}},{"type":"Polygon","arcs":[[-5550,5550,5551,-5532]],"properties":{"id":"24661891","dp":19068,"de":3105}},{"type":"Polygon","arcs":[[-5549,-5027,-5034,5552,-5551]],"properties":{"id":"24661892","dp":20722,"de":2208}},{"type":"Polygon","arcs":[[5553,5554,5555,-5235]],"properties":{"id":"24662308","dp":1893,"de":261}},{"type":"Polygon","arcs":[[-5554,-5234,5556,5557,5558,5559]],"properties":{"id":"24662309","dp":1331,"de":1818}},{"type":"Polygon","arcs":[[-5233,5560,5561,-5557]],"properties":{"id":"24662310","dp":2185,"de":325}},{"type":"Polygon","arcs":[[5562,5563,5564,5565,5566,5567,-4290,5568,-583,-576,-4383,-4379,5569]],"properties":{"id":"24663351","dp":0,"de":5176}},{"type":"Polygon","arcs":[[-4491,5570,5571,-5567,5572]],"properties":{"id":"24663352","dp":17255,"de":1583}},{"type":"Polygon","arcs":[[-4490,5573,-5571]],"properties":{"id":"24663353","dp":38342,"de":4285}},{"type":"Polygon","arcs":[[-5371,-4863,-4866,-4861,-5311,5574,5575]],"properties":{"id":"24663012","dp":3553,"de":0}},{"type":"Polygon","arcs":[[-5310,5576,5577,-5575]],"properties":{"id":"24663013","dp":4801,"de":1237}},{"type":"Polygon","arcs":[[-5577,-5309,-5307,-5305,5578,5579,5580,5581,5582,5583]],"properties":{"id":"24663014","dp":2146,"de":461}},{"type":"Polygon","arcs":[[-5581,5584,5585,5586,5587]],"properties":{"id":"24663015","dp":6630,"de":867}},{"type":"Polygon","arcs":[[5588,5589,5590,-5586]],"properties":{"id":"24663016","dp":6259,"de":797}},{"type":"Polygon","arcs":[[5591,5592,5593,5594,-5587,-5591,5595]],"properties":{"id":"24663017","dp":4788,"de":1934}},{"type":"Polygon","arcs":[[5596,-5594,5597]],"properties":{"id":"24663018","dp":12425,"de":1063}},{"type":"Polygon","arcs":[[-5582,-5588,-5595,-5597,5598,5599,5600]],"properties":{"id":"24663019","dp":8546,"de":0}},{"type":"Polygon","arcs":[[-5583,-5601,5601,5602,5603,5604]],"properties":{"id":"24663020","dp":3414,"de":88}},{"type":"Polygon","arcs":[[5605,5606,5607,5608,5609,-5604,5610,5611]],"properties":{"id":"24663021","dp":1716,"de":0}},{"type":"Polygon","arcs":[[5612,5613,5614,5615,-5607]],"properties":{"id":"24663022","dp":2784,"de":0}},{"type":"Polygon","arcs":[[5616,5617,5618,5619,-5608,-5616,5620]],"properties":{"id":"24663023","dp":2460,"de":0}},{"type":"Polygon","arcs":[[5621,-5621,-5615,5622,5623]],"properties":{"id":"24663024","dp":3356,"de":0}},{"type":"Polygon","arcs":[[5624,5625,-5624,5626,5627,5628]],"properties":{"id":"24663025","dp":2667,"de":277}},{"type":"Polygon","arcs":[[5629,5630,5631,-5617,-5622,-5626,5632]],"properties":{"id":"24663026","dp":8355,"de":0}},{"type":"Polygon","arcs":[[5633,-5633,-5625,5634,5635,5636]],"properties":{"id":"24663027","dp":2987,"de":288}},{"type":"Polygon","arcs":[[5637,-4944,-5440,5638,-5630,-5634]],"properties":{"id":"24663028","dp":4176,"de":0}},{"type":"Polygon","arcs":[[-4945,-5638,-5637,5639,-4951]],"properties":{"id":"24663029","dp":3170,"de":0}},{"type":"Polygon","arcs":[[5640,5641,5642,5643]],"properties":{"id":"24661758","dp":16156,"de":2135}},{"type":"Polygon","arcs":[[-5644,5644,5645,5646]],"properties":{"id":"24661759","dp":16996,"de":0}},{"type":"Polygon","arcs":[[-5646,5647,5648,5649]],"properties":{"id":"24661760","dp":16938,"de":2857}},{"type":"Polygon","arcs":[[5650,5651,-5368,5652,-5437,-4942,5653]],"properties":{"id":"24663033","dp":3425,"de":276}},{"type":"Polygon","arcs":[[-5367,5654,5655,-5438,-5653]],"properties":{"id":"24663034","dp":4851,"de":2227}},{"type":"Polygon","arcs":[[5656,5657,-5655,5658]],"properties":{"id":"24663035","dp":2814,"de":1185}},{"type":"Polygon","arcs":[[5659,5660,5661,5662,5663,-5658,5664]],"properties":{"id":"24663036","dp":4236,"de":1253}},{"type":"Polygon","arcs":[[5665,5666,5667,-5660]],"properties":{"id":"24663037","dp":2719,"de":477}},{"type":"Polygon","arcs":[[5668,5669,5670,5671,-5661,-5668]],"properties":{"id":"24663038","dp":3770,"de":0}},{"type":"Polygon","arcs":[[5672,5673,5674,5675,-5669,-5667]],"properties":{"id":"24663039","dp":3710,"de":0}},{"type":"Polygon","arcs":[[5676,-5673,-5666,-5665,-5657]],"properties":{"id":"24663040","dp":2819,"de":336}},{"type":"Polygon","arcs":[[-5676,5677,5678,-5670]],"properties":{"id":"24663041","dp":2945,"de":0}},{"type":"Polygon","arcs":[[-5675,5679,5680,5681,5682,5683,5684,-5678]],"properties":{"id":"24663042","dp":3268,"de":0}},{"type":"Polygon","arcs":[[5685,5686,5687,5688,-5684]],"properties":{"id":"24663043","dp":2853,"de":340}},{"type":"Polygon","arcs":[[-5671,-5679,-5685,-5689,5689,5690]],"properties":{"id":"24663044","dp":3365,"de":635}},{"type":"Polygon","arcs":[[-5691,5691,5692,5693,5694,-5662,-5672]],"properties":{"id":"24663045","dp":3039,"de":3211}},{"type":"Polygon","arcs":[[5695,5696,5697,-5693,5698]],"properties":{"id":"24663046","dp":3451,"de":1261}},{"type":"Polygon","arcs":[[5699,5700,5701,5702]],"properties":{"id":"24661791","dp":18706,"de":2097}},{"type":"Polygon","arcs":[[5703,-5703,5704,-5520]],"properties":{"id":"24661792","dp":17711,"de":0}},{"type":"Polygon","arcs":[[-5519,-5527,5705,5706,-5700,-5704]],"properties":{"id":"24661793","dp":13902,"de":5226}},{"type":"Polygon","arcs":[[5707,5708,5709,-5706,-5526]],"properties":{"id":"24661794","dp":18778,"de":0}},{"type":"Polygon","arcs":[[-5534,5710,-5708,-5525]],"properties":{"id":"24661795","dp":17990,"de":7191}},{"type":"Polygon","arcs":[[5711,5712,5713,-5711]],"properties":{"id":"24661796","dp":15874,"de":3321}},{"type":"Polygon","arcs":[[-5552,-5553,5714,5715,-5712,-5533]],"properties":{"id":"24661797","dp":11063,"de":7183}},{"type":"Polygon","arcs":[[5716,-5507,-5505,-3166,5717]],"properties":{"id":"24661843","dp":21604,"de":2389}},{"type":"Polygon","arcs":[[-3690,-5508,-5717,5718,5719]],"properties":{"id":"24661844","dp":17615,"de":3145}},{"type":"Polygon","arcs":[[-5719,-5718,-3165,5720]],"properties":{"id":"24661845","dp":17066,"de":2666}},{"type":"Polygon","arcs":[[5721,-5721,-3164,5722]],"properties":{"id":"24661846","dp":15626,"de":2924}},{"type":"Polygon","arcs":[[5723,-4787,-3705,-3699,-3691,-5720,-5722]],"properties":{"id":"24661847","dp":13139,"de":6744}},{"type":"Polygon","arcs":[[-4788,-5724,-5723,-3163,5724]],"properties":{"id":"24661848","dp":31371,"de":18805}},{"type":"Polygon","arcs":[[-4789,-5725,5725,5726]],"properties":{"id":"24661849","dp":17768,"de":4347}},{"type":"Polygon","arcs":[[-5726,-3178,5727,5728]],"properties":{"id":"24661850","dp":20327,"de":4754}},{"type":"Polygon","arcs":[[-5728,-3177,5729,5730]],"properties":{"id":"24661851","dp":17157,"de":4987}},{"type":"Polygon","arcs":[[-5730,-3176,-5540,5731]],"properties":{"id":"24661852","dp":12081,"de":5338}},{"type":"Polygon","arcs":[[-4806,5732,-5732,-5539,-5542,-5547,-4808]],"properties":{"id":"24661853","dp":11568,"de":4222}},{"type":"Polygon","arcs":[[5733,-5731,-5733,-4805]],"properties":{"id":"24661854","dp":16275,"de":3691}},{"type":"Polygon","arcs":[[-4797,5734,-5729,-5734,-4802]],"properties":{"id":"24661855","dp":14986,"de":4289}},{"type":"Polygon","arcs":[[5735,-5727,-5735,-4796,-4801]],"properties":{"id":"24661856","dp":12903,"de":2867}},{"type":"Polygon","arcs":[[-4790,-5736,-4800,-4794]],"properties":{"id":"24661857","dp":15374,"de":3524}},{"type":"Polygon","arcs":[[5736,5737,5738,-5477,5739,5740]],"properties":{"id":"24662291","dp":2363,"de":2620}},{"type":"Polygon","arcs":[[5741,5742,5743,-5738,5744]],"properties":{"id":"24662292","dp":3110,"de":249}},{"type":"Polygon","arcs":[[5745,5746,-5478,-5739,-5744,5747]],"properties":{"id":"24662293","dp":1729,"de":569}},{"type":"Polygon","arcs":[[5748,-5748,-5743,5749]],"properties":{"id":"24662294","dp":3013,"de":0}},{"type":"Polygon","arcs":[[5750,5751,-5750,-5742]],"properties":{"id":"24662295","dp":3863,"de":0}},{"type":"Polygon","arcs":[[5752,5753,5754,5755,5756,5757]],"properties":{"id":"24661972","dp":7154,"de":5237}},{"type":"Polygon","arcs":[[-1498,-1494,5758,-5754]],"properties":{"id":"24661973","dp":14735,"de":0}},{"type":"Polygon","arcs":[[-5759,-1493,5759,5760,-5755]],"properties":{"id":"24661974","dp":11199,"de":2828}},{"type":"Polygon","arcs":[[-5761,5761,5762,-5756]],"properties":{"id":"24661975","dp":12568,"de":1477}},{"type":"Polygon","arcs":[[-5763,5763,5764,5765,5766]],"properties":{"id":"24661976","dp":12302,"de":3386}},{"type":"Polygon","arcs":[[-5766,5767,5768,5769,5770]],"properties":{"id":"24661977","dp":12413,"de":3605}},{"type":"Polygon","arcs":[[-5765,5771,5772,5773,-5768]],"properties":{"id":"24661978","dp":9698,"de":3723}},{"type":"Polygon","arcs":[[-5774,5774,5775,5776]],"properties":{"id":"24661979","dp":10805,"de":1761}},{"type":"Polygon","arcs":[[5777,-5769,-5777,-1475,-1490,5778]],"properties":{"id":"24661980","dp":12658,"de":0}},{"type":"Polygon","arcs":[[-5572,-5574,-4487,5779,5780,5781,-4293,-4499,-3971,5782,-1106,-3400,-4287,-5568]],"properties":{"id":"24663354","dp":3628,"de":402}},{"type":"Polygon","arcs":[[-4294,-5782,-4475]],"properties":{"id":"24663355","dp":111302,"de":4166}},{"type":"Polygon","arcs":[[-5781,5783,-4481,-4476]],"properties":{"id":"24663356","dp":44790,"de":2958}},{"type":"Polygon","arcs":[[-4486,-4482,-5784,-5780]],"properties":{"id":"24663357","dp":30050,"de":1518}},{"type":"Polygon","arcs":[[-2958,5784,-2749,5785,-1319,-1317,-1315,-1311]],"properties":{"id":"24663358","dp":4498,"de":23309}},{"type":"Polygon","arcs":[[-2957,5786,5787,-2750,-5785]],"properties":{"id":"24663359","dp":24693,"de":8844}},{"type":"Polygon","arcs":[[-2751,-5788,5788]],"properties":{"id":"24663360","dp":43966,"de":6404}},{"type":"Polygon","arcs":[[-2956,-2756,-2752,-5789,-5787]],"properties":{"id":"24663361","dp":11578,"de":26430}},{"type":"Polygon","arcs":[[-1320,-5786,-2748,5789,5790,-1972,5791,-5008,-5014,5792,5793,5794,5795,-1286,-1291,-1297]],"properties":{"id":"24663362","dp":377,"de":1046}},{"type":"Polygon","arcs":[[5796,-5209,-2719,-2717,5797,-5790,-2747,-2745]],"properties":{"id":"24663363","dp":3285,"de":10361}},{"type":"Polygon","arcs":[[-1978,-1973,-5791,-5798,-2716]],"properties":{"id":"24663364","dp":3918,"de":1604}},{"type":"Polygon","arcs":[[-5797,-3389,-2758,-230,-2742,5798,5799,-5210]],"properties":{"id":"24663365","dp":5087,"de":3867}},{"type":"Polygon","arcs":[[5800,-5799,-2741,-2720,5801]],"properties":{"id":"24663366","dp":27344,"de":2074}},{"type":"Polygon","arcs":[[5802,5803,-5802,-2724]],"properties":{"id":"24663367","dp":45965,"de":30965}},{"type":"Polygon","arcs":[[-5211,-5800,-5801,-5804,5804]],"properties":{"id":"24663368","dp":39370,"de":14173}},{"type":"Polygon","arcs":[[5805,5806,5807,5808,-5050]],"properties":{"id":"24661902","dp":15724,"de":3621}},{"type":"Polygon","arcs":[[-5048,5809,5810,-5806]],"properties":{"id":"24661903","dp":17957,"de":4042}},{"type":"Polygon","arcs":[[-5047,5811,5812,-5810]],"properties":{"id":"24661904","dp":14102,"de":5769}},{"type":"Polygon","arcs":[[5813,5814,5815,-5812]],"properties":{"id":"24661905","dp":18581,"de":4181}},{"type":"Polygon","arcs":[[5816,5817,-5815,5818]],"properties":{"id":"24661906","dp":17101,"de":5253}},{"type":"Polygon","arcs":[[-5493,-5819,-5814,-5046,-5502,-5499]],"properties":{"id":"24661907","dp":14172,"de":6843}},{"type":"Polygon","arcs":[[-5808,5819,5820]],"properties":{"id":"24661908","dp":18148,"de":3086}},{"type":"Polygon","arcs":[[-5809,-5821,5821,5822,5823,5824]],"properties":{"id":"24661909","dp":12063,"de":9047}},{"type":"Polygon","arcs":[[5825,5826,5827,5828,-5822,-5820]],"properties":{"id":"24661910","dp":10776,"de":4223}},{"type":"Polygon","arcs":[[5829,5830,5831,5832,-5827]],"properties":{"id":"24661911","dp":17397,"de":3253}},{"type":"Polygon","arcs":[[5833,-5824,5834,-5030,-5038]],"properties":{"id":"24661912","dp":13715,"de":8823}},{"type":"Polygon","arcs":[[-5051,-5825,-5834,-5037,-5041]],"properties":{"id":"24661913","dp":15152,"de":9418}},{"type":"Polygon","arcs":[[-5329,-5511,-5513,-5517,-405,5835,5836]],"properties":{"id":"24661916","dp":2651,"de":334}},{"type":"Polygon","arcs":[[5837,-5836,-404,5838,5839,5840,5841]],"properties":{"id":"24661917","dp":2234,"de":4686}},{"type":"Polygon","arcs":[[5842,-5842,5843,5844,5845]],"properties":{"id":"24661918","dp":5145,"de":970}},{"type":"Polygon","arcs":[[5846,-5846,5847,5848,5849,5850,5851]],"properties":{"id":"24661919","dp":2671,"de":1380}},{"type":"Polygon","arcs":[[5852,-5852,5853,5854,5855]],"properties":{"id":"24661920","dp":2496,"de":1621}},{"type":"Polygon","arcs":[[5856,-5856,5857,5858,5859]],"properties":{"id":"24661921","dp":2077,"de":837}},{"type":"Polygon","arcs":[[-5312,5860,-5860,5861,5862,5863,5864,5865]],"properties":{"id":"24661922","dp":3886,"de":1209}},{"type":"Polygon","arcs":[[5866,5867,-5186,5868,-5469,-5473]],"properties":{"id":"24662322","dp":2640,"de":0}},{"type":"Polygon","arcs":[[-5185,5869,5870,5871,5872,5873,5874,-5869]],"properties":{"id":"24662323","dp":4678,"de":0}},{"type":"Polygon","arcs":[[-5872,5875,5876]],"properties":{"id":"24662324","dp":4533,"de":0}},{"type":"Polygon","arcs":[[-5871,5877,-5164,5878,-4971,-4976,5879,-5876]],"properties":{"id":"24662325","dp":3143,"de":348}},{"type":"Polygon","arcs":[[-5873,-5877,-5880,-4978,5880,5881]],"properties":{"id":"24662326","dp":3614,"de":0}},{"type":"Polygon","arcs":[[5882,-5874,-5882,5883,-5052,5884]],"properties":{"id":"24662327","dp":2698,"de":177}},{"type":"Polygon","arcs":[[5885,5886,-5779,-1489]],"properties":{"id":"24661981","dp":16081,"de":1520}},{"type":"Polygon","arcs":[[5887,-5770,-5778,-5887,5888]],"properties":{"id":"24661982","dp":15856,"de":1401}},{"type":"Polygon","arcs":[[5889,-5757,-5767,-5771,-5888,5890]],"properties":{"id":"24661983","dp":8888,"de":2923}},{"type":"Polygon","arcs":[[5891,-5891,-5889,5892,5893,5894,5895,5896,5897]],"properties":{"id":"24661984","dp":10451,"de":0}},{"type":"Polygon","arcs":[[5898,-5897]],"properties":{"id":"24661985","dp":29836,"de":0}},{"type":"Polygon","arcs":[[5899,-5898,-5899,-5896,5900,5901]],"properties":{"id":"24661986","dp":10344,"de":2323}},{"type":"Polygon","arcs":[[-5901,-5895,5902,5903]],"properties":{"id":"24661987","dp":21005,"de":2234}},{"type":"Polygon","arcs":[[-5903,-5894,5904,5905]],"properties":{"id":"24661988","dp":17865,"de":3370}},{"type":"Polygon","arcs":[[5906,-5905,-5893,-5886,-1488,5907]],"properties":{"id":"24661989","dp":16571,"de":2380}},{"type":"Polygon","arcs":[[5908,-5908,-1487,5909,5910]],"properties":{"id":"24661990","dp":12929,"de":3521}},{"type":"Polygon","arcs":[[5911,-5910,-1486,5912,5913]],"properties":{"id":"24661991","dp":16134,"de":3781}},{"type":"Polygon","arcs":[[5914,-5913,-1485,-1482,5915,5916]],"properties":{"id":"24661992","dp":16920,"de":3492}},{"type":"Polygon","arcs":[[5917,-5917,5918,5919,5920]],"properties":{"id":"24661993","dp":15101,"de":4949}},{"type":"Polygon","arcs":[[-5916,5921,-5919]],"properties":{"id":"24661994","dp":15261,"de":0}},{"type":"Polygon","arcs":[[5922,-5922,-1481,-1478,5923]],"properties":{"id":"24661995","dp":14195,"de":2545}},{"type":"Polygon","arcs":[[-5924,-1477,-1459,5924,5925]],"properties":{"id":"24661996","dp":9977,"de":0}},{"type":"Polygon","arcs":[[5926,5927,5928,5929,5930]],"properties":{"id":"24662366","dp":4026,"de":0}},{"type":"Polygon","arcs":[[-5929,5931,-4948,5932,5933,5934,5935,5936]],"properties":{"id":"24662367","dp":3485,"de":744}},{"type":"Polygon","arcs":[[-4947,-4950,5937,-5933]],"properties":{"id":"24662368","dp":3632,"de":284}},{"type":"Polygon","arcs":[[-5938,-4949,5938,5939,5940,-5934]],"properties":{"id":"24662369","dp":2238,"de":438}},{"type":"Polygon","arcs":[[5941,5942,5943,-5940]],"properties":{"id":"24662370","dp":3178,"de":317}},{"type":"Polygon","arcs":[[5944,-5062]],"properties":{"id":"24663408","dp":7381,"de":0}},{"type":"Polygon","arcs":[[-4979,-4973,5945,5946,-4958,-5063,-5945,-5061]],"properties":{"id":"24663409","dp":4978,"de":712}},{"type":"Polygon","arcs":[[-4969,5947,5948,-5946]],"properties":{"id":"24663410","dp":6406,"de":0}},{"type":"Polygon","arcs":[[-5949,5949,-4959,-5947]],"properties":{"id":"24663411","dp":4462,"de":0}},{"type":"Polygon","arcs":[[5950,-2044,-3114,-4426]],"properties":{"id":"24663412","dp":4522,"de":895}},{"type":"Polygon","arcs":[[-4425,-2060,-4424,-4427,-2058,-2045,-5951]],"properties":{"id":"24663413","dp":9115,"de":3651}},{"type":"Polygon","arcs":[[5951,5952,5953,-3511,5954,5955,-3608,-3600,-4555,-4414,-3115,-2052,-2037,-2035,-1532,5956,5957,5958,5959,5960,5961]],"properties":{"id":"24663419","dp":33,"de":2588}},{"type":"Polygon","arcs":[[5962,5963,5964,5965,5966,5967]],"properties":{"id":"24663420","dp":4244,"de":312}},{"type":"Polygon","arcs":[[-5964,5968]],"properties":{"id":"24663421","dp":4817,"de":400}},{"type":"Polygon","arcs":[[-5963,5969,5970]],"properties":{"id":"24663422","dp":4695,"de":428}},{"type":"Polygon","arcs":[[-5969,-5971,5971,-5958,5972,5973,5974,-5153,-3442,5975,5976,5977,5978,-5965]],"properties":{"id":"24663423","dp":110,"de":3086}},{"type":"Polygon","arcs":[[-5972,5979,5980,-5959]],"properties":{"id":"24663424","dp":4548,"de":989}},{"type":"Polygon","arcs":[[5981,-5960,-5981,5982,5983]],"properties":{"id":"24663425","dp":9652,"de":1159}},{"type":"Polygon","arcs":[[5984,-2210,-2303,-2301]],"properties":{"id":"24663426","dp":17381,"de":0}},{"type":"Polygon","arcs":[[-2138,-2213,-2211,-5985,-2300,-2298,-2215]],"properties":{"id":"24663428","dp":4996,"de":1087}},{"type":"Polygon","arcs":[[-5006,-5792,-1971,5985,5986,-3024,-3021,-1321]],"properties":{"id":"24663370","dp":3,"de":174}},{"type":"Polygon","arcs":[[5987,5988,-5986,-1970]],"properties":{"id":"24663371","dp":48581,"de":4391}},{"type":"Polygon","arcs":[[-1969,5989,-5988]],"properties":{"id":"24663372","dp":40918,"de":0}},{"type":"Polygon","arcs":[[-3288,-3289,-3296,-3462,-3023,-3025,-5987,-5989,-5990,-1968]],"properties":{"id":"24663373","dp":11791,"de":1515}},{"type":"Polygon","arcs":[[-4338,-4330,-3981,5990,5991]],"properties":{"id":"24663374","dp":10415,"de":1298}},{"type":"Polygon","arcs":[[5992,5993,5994,5995,5996,-4333,-5992,5997]],"properties":{"id":"24663375","dp":9598,"de":802}},{"type":"Polygon","arcs":[[5998,5999,-4347,6000,6001,-5994]],"properties":{"id":"24663376","dp":3970,"de":5338}},{"type":"Polygon","arcs":[[6002,-4343,-4348,-6000]],"properties":{"id":"24663377","dp":9555,"de":1420}},{"type":"Polygon","arcs":[[6003,-4525,-4344,-4339,-6003,-5999,-5993,6004]],"properties":{"id":"24663378","dp":4187,"de":1067}},{"type":"Polygon","arcs":[[-3972,-4530,-4526,-6004,6005]],"properties":{"id":"24663379","dp":14021,"de":0}},{"type":"Polygon","arcs":[[-6005,-5998,-5991,-3980,-6006]],"properties":{"id":"24663380","dp":5446,"de":0}},{"type":"Polygon","arcs":[[6006,6007,-2873,6008,-2116,-2122,-2125,-2311,6009]],"properties":{"id":"24663381","dp":2,"de":638}},{"type":"Polygon","arcs":[[-3108,-2542,-2545,-2551,-2555,-3428,6010,-2533,-2537,-2539]],"properties":{"id":"24663382","dp":5,"de":0}},{"type":"Polygon","arcs":[[6011,6012,6013,6014,6015,6016,-5390,-2028,-1938]],"properties":{"id":"24663383","dp":617,"de":1335}},{"type":"Polygon","arcs":[[6017,-6016,6018]],"properties":{"id":"24663384","dp":4514,"de":4583}},{"type":"Polygon","arcs":[[6019,6020,-6019,-6015,6021]],"properties":{"id":"24663385","dp":9437,"de":974}},{"type":"Polygon","arcs":[[-6021,6022,-5386,-5384,6023]],"properties":{"id":"24663386","dp":7647,"de":880}},{"type":"Polygon","arcs":[[-6024,-5389,-5391,-6017,-6018]],"properties":{"id":"24663387","dp":8240,"de":0}},{"type":"Polygon","arcs":[[6024,6025,-6023,-6020,6026]],"properties":{"id":"24663388","dp":9557,"de":766}},{"type":"Polygon","arcs":[[-6027,-6022,-6014,6027]],"properties":{"id":"24663389","dp":7300,"de":933}},{"type":"Polygon","arcs":[[6028,6029,6030,-5983,-5980,-5970,-5968,6031,6032,6033,-5995,-6002,6034]],"properties":{"id":"24663414","dp":3210,"de":1098}},{"type":"Polygon","arcs":[[-6029,6035]],"properties":{"id":"24663415","dp":8810,"de":0}},{"type":"Polygon","arcs":[[-4353,-4359,6036,-5962,6037,6038,-6030,-6036,-6035,-6001,-4346]],"properties":{"id":"24663416","dp":2317,"de":5462}},{"type":"Polygon","arcs":[[-5984,-6031,-6039,6039]],"properties":{"id":"24663417","dp":9046,"de":2798}},{"type":"Polygon","arcs":[[-5961,-5982,-6040,-6038]],"properties":{"id":"24663418","dp":10895,"de":0}},{"type":"Polygon","arcs":[[6040,-367,-5319,-5315]],"properties":{"id":"24661730","dp":16880,"de":0}},{"type":"Polygon","arcs":[[6041,-378,-371,-6041,-5314]],"properties":{"id":"24661731","dp":12441,"de":2597}},{"type":"Polygon","arcs":[[-5866,6042,-375,-6042,-5313]],"properties":{"id":"24661732","dp":16168,"de":3448}},{"type":"Polygon","arcs":[[-5865,6043,6044,-376,-6043]],"properties":{"id":"24661733","dp":17262,"de":0}},{"type":"Polygon","arcs":[[-5864,6045,6046,6047,-6044]],"properties":{"id":"24661734","dp":18052,"de":0}},{"type":"Polygon","arcs":[[6048,-6046,-5863,6049]],"properties":{"id":"24661735","dp":15244,"de":1152}},{"type":"Polygon","arcs":[[-5859,6050,6051,6052,-6050,-5862]],"properties":{"id":"24661736","dp":9780,"de":5118}},{"type":"Polygon","arcs":[[6053,-6051,-5858,-5855]],"properties":{"id":"24661737","dp":14640,"de":2877}},{"type":"Polygon","arcs":[[6054,6055,6056,6057,-6052,-6054,-5854]],"properties":{"id":"24661738","dp":10280,"de":2730}},{"type":"Polygon","arcs":[[6058,6059,-6055,-5851]],"properties":{"id":"24661739","dp":15628,"de":2428}},{"type":"Polygon","arcs":[[6060,6061,-6056,-6060]],"properties":{"id":"24661740","dp":12657,"de":1571}},{"type":"Polygon","arcs":[[6062,6063,-6061,6064]],"properties":{"id":"24661741","dp":17597,"de":0}},{"type":"Polygon","arcs":[[6065,-6065,-6059,-5850]],"properties":{"id":"24661742","dp":14510,"de":3115}},{"type":"Polygon","arcs":[[6066,6067,-6066,-5849]],"properties":{"id":"24661743","dp":15205,"de":74531}},{"type":"Polygon","arcs":[[6068,6069,-6067,-5848]],"properties":{"id":"24661744","dp":16950,"de":3571}},{"type":"Polygon","arcs":[[6070,6071,-6069,-5845]],"properties":{"id":"24661745","dp":16925,"de":1766}},{"type":"Polygon","arcs":[[6072,6073,6074,-6072]],"properties":{"id":"24661746","dp":20318,"de":1724}},{"type":"Polygon","arcs":[[-5841,6075,6076,-6073,-6071,-5844]],"properties":{"id":"24661747","dp":16655,"de":1535}},{"type":"Polygon","arcs":[[6077,6078,6079,6080,6081,6082,-6074,-6077,6083]],"properties":{"id":"24661748","dp":11237,"de":3669}},{"type":"Polygon","arcs":[[6084,6085,-6084,-6076,-5840]],"properties":{"id":"24661749","dp":17024,"de":0}},{"type":"Polygon","arcs":[[6086,6087,6088,-6078,-6086]],"properties":{"id":"24661750","dp":13285,"de":0}},{"type":"Polygon","arcs":[[-6085,-5839,-403,6089,-6087]],"properties":{"id":"24661751","dp":2890,"de":2701}},{"type":"Polygon","arcs":[[6090,6091,6092,-6088,-6090]],"properties":{"id":"24661752","dp":8127,"de":3802}},{"type":"Polygon","arcs":[[-6093,6093,6094,-6089]],"properties":{"id":"24661753","dp":21478,"de":0}},{"type":"Polygon","arcs":[[-6095,6095,6096,-6079]],"properties":{"id":"24661754","dp":17242,"de":2263}},{"type":"Polygon","arcs":[[-6080,-6097,6097,6098]],"properties":{"id":"24661755","dp":20180,"de":4279}},{"type":"Polygon","arcs":[[-6099,6099,6100,-6081]],"properties":{"id":"24661756","dp":18355,"de":2444}},{"type":"Polygon","arcs":[[-6101,6101,6102,-5642,-6082]],"properties":{"id":"24661757","dp":17674,"de":3386}},{"type":"MultiPolygon","arcs":[[[6103,6104,6105,6106,6107]],[[6108,6109,6110,6111]]],"properties":{"id":"24662238","dp":2261,"de":793}},{"type":"Polygon","arcs":[[-5189,-5204,6112,-5171,-5178,-5176,-5174,6113,6114]],"properties":{"id":"24663429","dp":2041,"de":2799}},{"type":"Polygon","arcs":[[-5179,-5182,6115,-5190,-6115,6116,-5183]],"properties":{"id":"24663430","dp":900,"de":1705}},{"type":"Polygon","arcs":[[-3896,6117,-3110,-1072,-3894]],"properties":{"id":"24663431","dp":5080,"de":6645}},{"type":"Polygon","arcs":[[-3111,-6118,-3903]],"properties":{"id":"24663432","dp":5280,"de":570}},{"type":"Polygon","arcs":[[-2560,6118,6119,-2961,-4585,-2973,-2971]],"properties":{"id":"24663434","dp":8464,"de":616}},{"type":"Polygon","arcs":[[6120,6121,6122,-6119,-2559,-2563]],"properties":{"id":"24663436","dp":10303,"de":1757}},{"type":"Polygon","arcs":[[6123,-2733,-2735,-2736,-2962,-6120]],"properties":{"id":"24663437","dp":9503,"de":20644}},{"type":"Polygon","arcs":[[-6124,-6123,6124,-5212,6125,6126]],"properties":{"id":"24663438","dp":6438,"de":2319}},{"type":"Polygon","arcs":[[-1201,6127,6128,-1245,-1253,-1254,-5127,-3670,6129]],"properties":{"id":"24663439","dp":625,"de":1190}},{"type":"Polygon","arcs":[[-1200,-1244,6130,6131,6132,-6128]],"properties":{"id":"24663441","dp":0,"de":2041}},{"type":"Polygon","arcs":[[-6129,6133,6134,-1248,-1246]],"properties":{"id":"24663442","dp":7644,"de":47537}},{"type":"Polygon","arcs":[[6135,6136,-6134,-6133]],"properties":{"id":"24663443","dp":9341,"de":8797}},{"type":"Polygon","arcs":[[-2967,6137,6138,6139]],"properties":{"id":"24663444","dp":23480,"de":0}},{"type":"Polygon","arcs":[[-6132,6140,-2590,-2968,-6140,-6136]],"properties":{"id":"24663445","dp":5663,"de":8789}},{"type":"Polygon","arcs":[[6141,6142,6143,-5751,6144]],"properties":{"id":"24662296","dp":2301,"de":0}},{"type":"Polygon","arcs":[[6145,6146,6147,-6142,6148]],"properties":{"id":"24662297","dp":1810,"de":391}},{"type":"Polygon","arcs":[[-6149,-6145,-5745,6149,6150]],"properties":{"id":"24662298","dp":1947,"de":0}},{"type":"Polygon","arcs":[[-6146,-6151,6151,6152,6153]],"properties":{"id":"24662299","dp":2278,"de":0}},{"type":"Polygon","arcs":[[6154,6155,-6147,-6154,6156,6157,6158,6159,6160]],"properties":{"id":"24662300","dp":1832,"de":1214}},{"type":"Polygon","arcs":[[6161,6162,-6157,-6153,6163,6164]],"properties":{"id":"24662301","dp":2556,"de":1063}},{"type":"Polygon","arcs":[[-6150,-5737,6165,-6164,-6152]],"properties":{"id":"24662302","dp":2085,"de":0}},{"type":"Polygon","arcs":[[6166,-6159,6167,6168,-6165,-6166,6169]],"properties":{"id":"24662303","dp":1580,"de":0}},{"type":"Polygon","arcs":[[-6162,-6169,6170]],"properties":{"id":"24662304","dp":2816,"de":348}},{"type":"Polygon","arcs":[[-6158,-6163,-6171,-6168]],"properties":{"id":"24662305","dp":2878,"de":384}},{"type":"Polygon","arcs":[[-5232,6171,-5230,6172,6173,-5561]],"properties":{"id":"24662311","dp":1553,"de":149}},{"type":"Polygon","arcs":[[-5229,6174,-6173]],"properties":{"id":"24662312","dp":1454,"de":1075}},{"type":"Polygon","arcs":[[-6174,-6175,-5228,-5226,-5224,-5219,6175,-6155,6176,-5558,-5562]],"properties":{"id":"24662313","dp":840,"de":142}},{"type":"Polygon","arcs":[[-5218,-5201,-5205,-4676,6177,6178,-6156,-6176]],"properties":{"id":"24662314","dp":3498,"de":0}},{"type":"Polygon","arcs":[[-6148,-6179,6179,6180]],"properties":{"id":"24662315","dp":2455,"de":527}},{"type":"Polygon","arcs":[[-6178,-4679,-5215,6181,-6180]],"properties":{"id":"24662316","dp":2888,"de":306}},{"type":"Polygon","arcs":[[-6181,-6182,-5214,6182,-6143]],"properties":{"id":"24662317","dp":2817,"de":0}},{"type":"Polygon","arcs":[[-5213,-5197,6183,-6144,-6183]],"properties":{"id":"24662318","dp":2925,"de":0}},{"type":"Polygon","arcs":[[-5752,-6184,-5192,6184,-5746,-5749]],"properties":{"id":"24662319","dp":1692,"de":360}},{"type":"Polygon","arcs":[[-6185,-5191,-6116,-5181,-5868,6185,-5479,-5475,-5747]],"properties":{"id":"24662320","dp":2385,"de":812}},{"type":"Polygon","arcs":[[-6186,-5867,-5472,-5480]],"properties":{"id":"24662321","dp":3259,"de":0}},{"type":"Polygon","arcs":[[6186,6187,6188]],"properties":{"id":"24662705","dp":41953,"de":0}},{"type":"Polygon","arcs":[[-6189,6189,6190,6191,6192]],"properties":{"id":"24662706","dp":13309,"de":1079}},{"type":"MultiPolygon","arcs":[[[6193,6194,6195,6196,6197,6198]],[[6199]],[[6200,6201,6202]],[[6203]]],"properties":{"id":"24662707","dp":1614,"de":0}},{"type":"Polygon","arcs":[[-5649,6204,6205,6206,6207]],"properties":{"id":"24661761","dp":15096,"de":5038}},{"type":"Polygon","arcs":[[6208,-5650,-6208,6209,6210,-6064]],"properties":{"id":"24661762","dp":12626,"de":4966}},{"type":"Polygon","arcs":[[-6068,-6070,-6075,-6083,-5641,-5647,-6209,-6063]],"properties":{"id":"24661763","dp":12583,"de":3149}},{"type":"Polygon","arcs":[[-6211,6211,6212,-6062]],"properties":{"id":"24661764","dp":13913,"de":7681}},{"type":"Polygon","arcs":[[-6210,-6207,6213,6214,6215,-6212]],"properties":{"id":"24661765","dp":12851,"de":21205}},{"type":"Polygon","arcs":[[-6213,-6216,6216,6217,6218,-6057]],"properties":{"id":"24661766","dp":11159,"de":8956}},{"type":"Polygon","arcs":[[-6215,6219,6220,6221,6222,-6217]],"properties":{"id":"24661767","dp":11887,"de":8657}},{"type":"Polygon","arcs":[[6223,6224,6225,-6220,-6214]],"properties":{"id":"24661768","dp":7238,"de":1791}},{"type":"Polygon","arcs":[[6226,6227,-6224,-6206]],"properties":{"id":"24661769","dp":16767,"de":0}},{"type":"Polygon","arcs":[[6228,6229,-6227,-6205,-5648,-5645]],"properties":{"id":"24661770","dp":7574,"de":2425}},{"type":"Polygon","arcs":[[-6103,6230,6231,6232,-6229,-5643]],"properties":{"id":"24661771","dp":16973,"de":2600}},{"type":"Polygon","arcs":[[-6102,6233,6234,-6231]],"properties":{"id":"24661772","dp":16303,"de":0}},{"type":"Polygon","arcs":[[6235,6236,6237,-6234,-6100,-6098,-6096]],"properties":{"id":"24661773","dp":10762,"de":1326}},{"type":"Polygon","arcs":[[6238,6239,6240,-6238]],"properties":{"id":"24661774","dp":19375,"de":0}},{"type":"Polygon","arcs":[[6241,6242,-6239,-6237]],"properties":{"id":"24661775","dp":11594,"de":1293}},{"type":"Polygon","arcs":[[6243,6244,6245,-6242,6246]],"properties":{"id":"24661776","dp":8608,"de":2355}},{"type":"Polygon","arcs":[[-6246,6247,6248,6249,6250,-6240,-6243]],"properties":{"id":"24661777","dp":6741,"de":1690}},{"type":"Polygon","arcs":[[6251,6252,-6248,-6245,6253]],"properties":{"id":"24661778","dp":8116,"de":4743}},{"type":"Polygon","arcs":[[-6254,-6244,6254,6255]],"properties":{"id":"24661779","dp":6321,"de":2008}},{"type":"Polygon","arcs":[[6256,6257,-6256,6258]],"properties":{"id":"24661780","dp":9661,"de":1224}},{"type":"Polygon","arcs":[[6259,-6259,6260,6261,6262]],"properties":{"id":"24661781","dp":9341,"de":1508}},{"type":"Polygon","arcs":[[-6261,-6255,-6247,-6236,-6094,-6092]],"properties":{"id":"24661782","dp":5055,"de":2746}},{"type":"Polygon","arcs":[[6263,-6262,-6091,-402]],"properties":{"id":"24661783","dp":14177,"de":1407}},{"type":"Polygon","arcs":[[-401,6264,6265,-6263,-6264]],"properties":{"id":"24661784","dp":14551,"de":1345}},{"type":"Polygon","arcs":[[6266,-6266,6267]],"properties":{"id":"24661785","dp":11036,"de":0}},{"type":"Polygon","arcs":[[-408,-5522,6268,-6268,-6265,-400]],"properties":{"id":"24661786","dp":8508,"de":2130}},{"type":"Polygon","arcs":[[-5521,-5705,6269,6270,-6269]],"properties":{"id":"24661787","dp":11700,"de":0}},{"type":"Polygon","arcs":[[-6271,6271,-6260,-6267]],"properties":{"id":"24661788","dp":14873,"de":0}},{"type":"Polygon","arcs":[[6272,6273,-6257,-6272]],"properties":{"id":"24661789","dp":15202,"de":0}},{"type":"Polygon","arcs":[[-5702,6274,-6273,-6270]],"properties":{"id":"24661790","dp":16011,"de":1123}},{"type":"Polygon","arcs":[[6275,6276,6277]],"properties":{"id":"24662255","dp":3737,"de":0}},{"type":"Polygon","arcs":[[6278,6279,6280,6281,-6278,6282]],"properties":{"id":"24662256","dp":2588,"de":430}},{"type":"Polygon","arcs":[[-5236,-5556,6283,-5559,-6177,-6161,-5351,-5338]],"properties":{"id":"24662306","dp":1249,"de":139}},{"type":"Polygon","arcs":[[-5555,-5560,-6284]],"properties":{"id":"24662307","dp":1959,"de":424}},{"type":"Polygon","arcs":[[6284,6285,6286,6287,-6194,6288,-6203,6289,6290]],"properties":{"id":"24662671","dp":2857,"de":348}},{"type":"Polygon","arcs":[[-6192,6291,6292,6293,-6291]],"properties":{"id":"24662672","dp":6882,"de":887}},{"type":"Polygon","arcs":[[6294,6295,-6292,-6191,6296]],"properties":{"id":"24662673","dp":7914,"de":1071}},{"type":"Polygon","arcs":[[6297,-6296,6298,6299]],"properties":{"id":"24662674","dp":13984,"de":957}},{"type":"Polygon","arcs":[[6300,-6293,-6298,6301,6302]],"properties":{"id":"24662675","dp":9869,"de":913}},{"type":"Polygon","arcs":[[6303,6304,6305,-6302,6306]],"properties":{"id":"24662676","dp":6731,"de":2977}},{"type":"Polygon","arcs":[[-6307,-6300,6307,6308,6309]],"properties":{"id":"24662677","dp":11051,"de":1860}},{"type":"Polygon","arcs":[[-6309,6310,6311]],"properties":{"id":"24662678","dp":11729,"de":947}},{"type":"Polygon","arcs":[[-5875,-5883,6312,-3059,-3055,-5470]],"properties":{"id":"24662328","dp":3185,"de":1033}},{"type":"Polygon","arcs":[[6313,-6313,-5885,-5056,6314]],"properties":{"id":"24662329","dp":3261,"de":438}},{"type":"Polygon","arcs":[[-3060,-6314,6315,6316]],"properties":{"id":"24662330","dp":3657,"de":1406}},{"type":"Polygon","arcs":[[-3061,-6317,6317,6318,6319,6320]],"properties":{"id":"24662331","dp":1606,"de":110}},{"type":"Polygon","arcs":[[-6316,6321,6322,6323,6324,-6318]],"properties":{"id":"24662332","dp":6775,"de":602}},{"type":"Polygon","arcs":[[-6315,-5055,6325,6326,-6322]],"properties":{"id":"24662333","dp":3983,"de":1212}},{"type":"Polygon","arcs":[[-5059,-4964,6327,-6326]],"properties":{"id":"24662334","dp":4472,"de":365}},{"type":"Polygon","arcs":[[-6327,-6328,-4967,6328,6329,6330,6331]],"properties":{"id":"24662335","dp":3950,"de":1421}},{"type":"Polygon","arcs":[[-6332,6332,6333,-6323]],"properties":{"id":"24662336","dp":9900,"de":931}},{"type":"Polygon","arcs":[[-6331,6334,-5696,6335,-6333]],"properties":{"id":"24662337","dp":7324,"de":0}},{"type":"Polygon","arcs":[[-5688,6336,6337,6338,-6324,-6334,-6336,-5699,-5692,-5690]],"properties":{"id":"24662338","dp":2305,"de":1478}},{"type":"Polygon","arcs":[[6339,6340,-6338]],"properties":{"id":"24662339","dp":4017,"de":0}},{"type":"Polygon","arcs":[[6341,-6320,6342,-6340,-6337,-5687,6343]],"properties":{"id":"24662340","dp":3325,"de":764}},{"type":"Polygon","arcs":[[-6343,-6319,-6325,-6339,-6341]],"properties":{"id":"24662341","dp":3875,"de":230}},{"type":"Polygon","arcs":[[6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,-1830]],"properties":{"id":"24662730","dp":1834,"de":2895}},{"type":"Polygon","arcs":[[-1674,6354,6355,-1387,-6354,6356,6357,-3586]],"properties":{"id":"24662731","dp":614,"de":2821}},{"type":"Polygon","arcs":[[-1680,-1681,6358,-6355]],"properties":{"id":"24662732","dp":7581,"de":0}},{"type":"Polygon","arcs":[[-1684,-1689,-1694,-1708,-1383,-6356,-6359]],"properties":{"id":"24662733","dp":9120,"de":685}},{"type":"Polygon","arcs":[[-6358,6359,6360,6361,6362,6363,-3587]],"properties":{"id":"24662734","dp":3022,"de":2329}},{"type":"Polygon","arcs":[[6364,6365,-6361]],"properties":{"id":"24662735","dp":9518,"de":0}},{"type":"Polygon","arcs":[[6366,6367,-6107,6368,6369,6370]],"properties":{"id":"24662239","dp":3567,"de":602}},{"type":"Polygon","arcs":[[6371,6372,-6369,-6106]],"properties":{"id":"24662240","dp":7881,"de":3268}},{"type":"Polygon","arcs":[[-6373,6373,6374,-6370]],"properties":{"id":"24662241","dp":3505,"de":1525}},{"type":"Polygon","arcs":[[6375,-6371,-6375,6376,6377]],"properties":{"id":"24662242","dp":3234,"de":1782}},{"type":"Polygon","arcs":[[6378,6379,6380,6381,6382,6383,-1529,6384,-6377]],"properties":{"id":"24662243","dp":1208,"de":2566}},{"type":"Polygon","arcs":[[-6374,6385,6386,6387,6388,-6379]],"properties":{"id":"24662244","dp":2557,"de":909}},{"type":"Polygon","arcs":[[-6389,6389,6390,6391,6392,-6380]],"properties":{"id":"24662245","dp":2398,"de":0}},{"type":"Polygon","arcs":[[6393,-6390,-6388,6394,-6386,-6372]],"properties":{"id":"24662246","dp":10977,"de":448}},{"type":"Polygon","arcs":[[-6387,-6395]],"properties":{"id":"24662247","dp":0,"de":0}},{"type":"Polygon","arcs":[[6395,6396,6397,-6391,-6394,-6105]],"properties":{"id":"24662248","dp":1504,"de":225}},{"type":"Polygon","arcs":[[-6279,6398,6399,6400,-6392,-6398]],"properties":{"id":"24662250","dp":1143,"de":762}},{"type":"Polygon","arcs":[[-6393,-6401,6401,6402,-6381]],"properties":{"id":"24662251","dp":2939,"de":744}},{"type":"Polygon","arcs":[[-6400,6403,6404,-6402]],"properties":{"id":"24662252","dp":3252,"de":0}},{"type":"Polygon","arcs":[[6405,-6382,-6403,-6405]],"properties":{"id":"24662253","dp":10107,"de":0}},{"type":"Polygon","arcs":[[-6283,-6277,-6383,-6406,-6404,-6399]],"properties":{"id":"24662254","dp":3446,"de":461}},{"type":"Polygon","arcs":[[6406,-4695,6407,6408,6409,6410,6411,6412]],"properties":{"id":"24662585","dp":4198,"de":409}},{"type":"Polygon","arcs":[[-6413,6413,6414,6415,6416,6417]],"properties":{"id":"24662586","dp":4531,"de":1060}},{"type":"Polygon","arcs":[[-6417,6418,6419,6420]],"properties":{"id":"24662587","dp":13375,"de":1380}},{"type":"Polygon","arcs":[[-6407,-6418,-6421,6421,6422,-4696]],"properties":{"id":"24662588","dp":8159,"de":0}},{"type":"Polygon","arcs":[[6423,-6281,6424]],"properties":{"id":"24662257","dp":3152,"de":0}},{"type":"Polygon","arcs":[[6425,-6304,-6310,-6312,6426,6427,6428,-6346]],"properties":{"id":"24662679","dp":5501,"de":2354}},{"type":"Polygon","arcs":[[-6429,6429,-6347]],"properties":{"id":"24662680","dp":9791,"de":2083}},{"type":"Polygon","arcs":[[-6428,6430,6431,-6348,-6430]],"properties":{"id":"24662681","dp":9580,"de":1904}},{"type":"Polygon","arcs":[[-6432,6432,6433,-6349]],"properties":{"id":"24662682","dp":9391,"de":2186}},{"type":"Polygon","arcs":[[6434,6435,6436,-6433]],"properties":{"id":"24662683","dp":14871,"de":0}},{"type":"Polygon","arcs":[[-6434,-6437,6437,6438,-6350]],"properties":{"id":"24662684","dp":11510,"de":0}},{"type":"Polygon","arcs":[[-6438,6439,6440,6441,6442]],"properties":{"id":"24662685","dp":10287,"de":1053}},{"type":"Polygon","arcs":[[-6440,-6436,6443,6444,6445]],"properties":{"id":"24662686","dp":12788,"de":0}},{"type":"Polygon","arcs":[[6446,6447,6448,-6446]],"properties":{"id":"24662687","dp":10598,"de":1028}},{"type":"Polygon","arcs":[[-6449,6449,6450,6451,-6441]],"properties":{"id":"24662688","dp":13352,"de":0}},{"type":"Polygon","arcs":[[-6442,-6452,6452,6453,6454,6455,6456]],"properties":{"id":"24662689","dp":5850,"de":1264}},{"type":"Polygon","arcs":[[-6451,6457,6458,6459,6460,-6453]],"properties":{"id":"24662690","dp":12312,"de":0}},{"type":"Polygon","arcs":[[-6461,6461,6462,6463,-6454]],"properties":{"id":"24662691","dp":6297,"de":749}},{"type":"Polygon","arcs":[[-6460,6464,-3571,6465,-6462]],"properties":{"id":"24662692","dp":5813,"de":1182}},{"type":"Polygon","arcs":[[6466,-3572,-6465,-6459,6467]],"properties":{"id":"24662693","dp":7787,"de":0}},{"type":"Polygon","arcs":[[6468,6469,-3573,-6467,6470]],"properties":{"id":"24662694","dp":7267,"de":910}},{"type":"Polygon","arcs":[[6471,-6471,-6468,-6458,-6450,-6448]],"properties":{"id":"24662695","dp":12815,"de":1958}},{"type":"Polygon","arcs":[[6472,6473,-6469,-6472,-6447,6474]],"properties":{"id":"24662696","dp":8731,"de":755}},{"type":"Polygon","arcs":[[6475,6476,6477,-6473,6478]],"properties":{"id":"24662697","dp":9029,"de":0}},{"type":"Polygon","arcs":[[6479,-3574,-6470,-6474,-6478]],"properties":{"id":"24662698","dp":5712,"de":6724}},{"type":"Polygon","arcs":[[6480,-3575,-6480,6481]],"properties":{"id":"24662699","dp":9426,"de":1946}},{"type":"Polygon","arcs":[[-6193,-6290,-6202,6482,-3568,6483,-6187]],"properties":{"id":"24662703","dp":7760,"de":673}},{"type":"Polygon","arcs":[[6484,-6190,-6188,-6484,-6481]],"properties":{"id":"24662704","dp":18992,"de":1162}},{"type":"Polygon","arcs":[[6485,-4995,-237,-2863]],"properties":{"id":"24661348","dp":9008,"de":969}},{"type":"Polygon","arcs":[[-4989,-6486,-2864,6486,6487]],"properties":{"id":"24661349","dp":6533,"de":0}},{"type":"Polygon","arcs":[[-4990,-6488,6488,6489]],"properties":{"id":"24661350","dp":7350,"de":964}},{"type":"Polygon","arcs":[[-6489,-6487,-2862,6490,6491]],"properties":{"id":"24661351","dp":13397,"de":3406}},{"type":"Polygon","arcs":[[6492,6493,-6195,-6288,6494]],"properties":{"id":"24662708","dp":12607,"de":1745}},{"type":"Polygon","arcs":[[-6297,-6485,-6482,-6477,6495]],"properties":{"id":"24662709","dp":6141,"de":964}},{"type":"Polygon","arcs":[[-6295,-6496,-6476,6496,6497]],"properties":{"id":"24662710","dp":8015,"de":591}},{"type":"Polygon","arcs":[[6498,-6497,-6479,-6475,-6445,6499]],"properties":{"id":"24662711","dp":6504,"de":0}},{"type":"Polygon","arcs":[[-6299,-6498,-6499,6500,-6311,-6308]],"properties":{"id":"24662712","dp":6907,"de":488}},{"type":"Polygon","arcs":[[-6427,-6501,-6500,-6444,-6435,-6431]],"properties":{"id":"24662713","dp":7611,"de":830}},{"type":"Polygon","arcs":[[6501,6502,6503,-3570,6504,6505,6506]],"properties":{"id":"24662714","dp":4649,"de":584}},{"type":"Polygon","arcs":[[-6466,-6504,6507,6508,6509]],"properties":{"id":"24662715","dp":5495,"de":0}},{"type":"Polygon","arcs":[[6510,-6508,-6503,6511,6512]],"properties":{"id":"24662716","dp":9445,"de":2103}},{"type":"Polygon","arcs":[[6513,6514,6515,6516,-6511,6517,6518]],"properties":{"id":"24662717","dp":7157,"de":2793}},{"type":"Polygon","arcs":[[-6517,6519,6520,-6509]],"properties":{"id":"24662718","dp":23720,"de":0}},{"type":"Polygon","arcs":[[-6463,-6510,-6521,6521]],"properties":{"id":"24662719","dp":18764,"de":0}},{"type":"Polygon","arcs":[[-6464,-6522,-6520,-6516,6522]],"properties":{"id":"24662720","dp":7496,"de":2034}},{"type":"Polygon","arcs":[[-6455,-6523,6523,6524]],"properties":{"id":"24662721","dp":6829,"de":2325}},{"type":"Polygon","arcs":[[6525,-6456,-6525,6526,6527,6528]],"properties":{"id":"24662722","dp":8355,"de":2088}},{"type":"Polygon","arcs":[[6529,-6527,6530,6531,6532]],"properties":{"id":"24662723","dp":10122,"de":1573}},{"type":"Polygon","arcs":[[6533,6534,-6528,-6530,6535]],"properties":{"id":"24662724","dp":8763,"de":0}},{"type":"Polygon","arcs":[[-6353,6536,6537,-6536,-6533,6538,6539,-6360,-6357]],"properties":{"id":"24662725","dp":2056,"de":2765}},{"type":"Polygon","arcs":[[6540,-6534,-6538]],"properties":{"id":"24662726","dp":8689,"de":3564}},{"type":"Polygon","arcs":[[-6535,-6541,-6537,-6352,6541,6542,-6529]],"properties":{"id":"24662727","dp":5662,"de":3899}},{"type":"Polygon","arcs":[[-6439,6543,-6542,-6351]],"properties":{"id":"24662728","dp":11821,"de":5000}},{"type":"Polygon","arcs":[[-6443,-6457,-6526,-6543,-6544]],"properties":{"id":"24662729","dp":9927,"de":1989}},{"type":"Polygon","arcs":[[-5081,-5021,6544,6545,6546,-4786]],"properties":{"id":"24661383","dp":15167,"de":14087}},{"type":"Polygon","arcs":[[6547,-6546,6548,6549]],"properties":{"id":"24661384","dp":19614,"de":4958}},{"type":"Polygon","arcs":[[6550,6551,6552,-6550,6553,6554]],"properties":{"id":"24661385","dp":9100,"de":2507}},{"type":"Polygon","arcs":[[6555,-4871,-4714,-4867,6556,-6552]],"properties":{"id":"24661386","dp":5555,"de":3917}},{"type":"Polygon","arcs":[[-4869,6557,-6553,-6557]],"properties":{"id":"24661387","dp":18056,"de":0}},{"type":"Polygon","arcs":[[6558,6559,-6548,-6558]],"properties":{"id":"24661388","dp":17000,"de":3269}},{"type":"Polygon","arcs":[[6560,-6547,-6560,-4736]],"properties":{"id":"24661389","dp":14501,"de":9965}},{"type":"Polygon","arcs":[[-4743,6561,-4784,-6561]],"properties":{"id":"24661390","dp":15266,"de":12099}},{"type":"Polygon","arcs":[[-4744,6562,-4782,-6562]],"properties":{"id":"24661391","dp":21659,"de":4148}},{"type":"Polygon","arcs":[[-4748,-4754,-4779,-6563]],"properties":{"id":"24661392","dp":19071,"de":5696}},{"type":"Polygon","arcs":[[-4735,-4737,-6559,-4868]],"properties":{"id":"24661393","dp":24794,"de":3082}},{"type":"Polygon","arcs":[[-6280,-6397,6563,-5359,6564,6565,-6425]],"properties":{"id":"24662258","dp":1732,"de":233}},{"type":"Polygon","arcs":[[-6282,-6424,-6566,6566,6567,6568,-1515,-1523,-1530,-6384,-6276]],"properties":{"id":"24662259","dp":1941,"de":140}},{"type":"Polygon","arcs":[[-6565,6569,-6567]],"properties":{"id":"24662260","dp":3077,"de":1065}},{"type":"Polygon","arcs":[[-6570,-5363,6570,-6568]],"properties":{"id":"24662261","dp":6716,"de":1198}},{"type":"Polygon","arcs":[[-5362,-5357,-5354,-3066,-1508,-6569,-6571]],"properties":{"id":"24662262","dp":1256,"de":114}},{"type":"Polygon","arcs":[[-1503,-1510,-3065,6571,6572,6573]],"properties":{"id":"24662263","dp":1981,"de":926}},{"type":"Polygon","arcs":[[-3076,6574,6575,-6572,-3064]],"properties":{"id":"24662264","dp":2928,"de":0}},{"type":"Polygon","arcs":[[-6575,-3074,6576,6577]],"properties":{"id":"24662265","dp":2289,"de":357}},{"type":"Polygon","arcs":[[6578,6579,-6573,-6576,-6578,6580,6581]],"properties":{"id":"24662266","dp":1534,"de":696}},{"type":"Polygon","arcs":[[-6581,-6577,-3073,6582,6583,6584,6585,6586]],"properties":{"id":"24662267","dp":1532,"de":188}},{"type":"Polygon","arcs":[[-6579,6587,6588,6589]],"properties":{"id":"24662268","dp":2975,"de":0}},{"type":"Polygon","arcs":[[6590,-6586,6591,6592,-5393]],"properties":{"id":"24662269","dp":5171,"de":199}},{"type":"Polygon","arcs":[[-6593,6593,6594,-5394]],"properties":{"id":"24662270","dp":4907,"de":0}},{"type":"Polygon","arcs":[[-4859,-529,6595,-4848]],"properties":{"id":"24662614","dp":9881,"de":0}},{"type":"Polygon","arcs":[[-4888,-4825,-4842,-6596,-528,-532,-535,6596,-6408,-4694,-4886,-4884]],"properties":{"id":"24662615","dp":1551,"de":3919}},{"type":"Polygon","arcs":[[6597,6598,-6365,-6540]],"properties":{"id":"24662736","dp":13797,"de":0}},{"type":"Polygon","arcs":[[6599,6600,6601,-6599]],"properties":{"id":"24662737","dp":9680,"de":1600}},{"type":"Polygon","arcs":[[-6602,6602,6603,-6362,-6366]],"properties":{"id":"24662738","dp":8241,"de":0}},{"type":"Polygon","arcs":[[-6492,6604,6605,6606,-4720,-4724,6607,6608]],"properties":{"id":"24661352","dp":3119,"de":1795}},{"type":"Polygon","arcs":[[-6490,-6609,6609,6610]],"properties":{"id":"24661353","dp":18231,"de":3231}},{"type":"Polygon","arcs":[[-6610,-6608,-4723,6611]],"properties":{"id":"24661354","dp":19464,"de":5351}},{"type":"Polygon","arcs":[[-4991,-6611,-6612,6612,-4882]],"properties":{"id":"24661355","dp":6644,"de":6469}},{"type":"Polygon","arcs":[[-6613,-4725,-4689,6613]],"properties":{"id":"24661356","dp":9520,"de":2309}},{"type":"Polygon","arcs":[[-4883,-6614,-4688,-4874]],"properties":{"id":"24661357","dp":13662,"de":1298}},{"type":"Polygon","arcs":[[-5884,-5881,-4981,-5060,-5053]],"properties":{"id":"24663083","dp":3712,"de":0}},{"type":"Polygon","arcs":[[6614,6615,6616,6617,-6603]],"properties":{"id":"24662739","dp":6662,"de":1395}},{"type":"Polygon","arcs":[[-6618,6618,6619,6620,6621]],"properties":{"id":"24662740","dp":10030,"de":1739}},{"type":"Polygon","arcs":[[6622,6623,6624,6625,-6619,-6617]],"properties":{"id":"24662741","dp":10694,"de":0}},{"type":"Polygon","arcs":[[-6626,6626,6627,6628,-6620]],"properties":{"id":"24662742","dp":11025,"de":870}},{"type":"Polygon","arcs":[[-6628,6629,6630,6631,6632]],"properties":{"id":"24662743","dp":15439,"de":0}},{"type":"Polygon","arcs":[[6633,-6621,-6629,-6633,6634,6635]],"properties":{"id":"24662744","dp":9313,"de":1991}},{"type":"Polygon","arcs":[[6636,-6636,6637]],"properties":{"id":"24662745","dp":13688,"de":825}},{"type":"Polygon","arcs":[[6638,-6638,-6635,-6632,6639,6640]],"properties":{"id":"24662746","dp":7690,"de":3548}},{"type":"Polygon","arcs":[[-6631,6641,6642,6643,-6640]],"properties":{"id":"24662747","dp":22567,"de":1234}},{"type":"Polygon","arcs":[[6644,6645,6646,6647,-6643]],"properties":{"id":"24662748","dp":11504,"de":0}},{"type":"Polygon","arcs":[[6648,6649,6650,-6644,-6648,6651,6652,6653]],"properties":{"id":"24662749","dp":10243,"de":6707}},{"type":"Polygon","arcs":[[-6654,6654,6655,6656,6657]],"properties":{"id":"24662750","dp":12246,"de":0}},{"type":"Polygon","arcs":[[-6649,-6658,6658,6659,6660]],"properties":{"id":"24662751","dp":13468,"de":0}},{"type":"Polygon","arcs":[[-6657,6661,6662,-6659]],"properties":{"id":"24662752","dp":12830,"de":0}},{"type":"Polygon","arcs":[[6663,6664,6665,-6660,-6663,6666,6667,6668]],"properties":{"id":"24662753","dp":4003,"de":2306}},{"type":"Polygon","arcs":[[-6669,6669,6670,6671,6672,6673,6674]],"properties":{"id":"24662754","dp":12857,"de":0}},{"type":"Polygon","arcs":[[6675,-6672,6676,6677]],"properties":{"id":"24662755","dp":12687,"de":0}},{"type":"Polygon","arcs":[[-6673,-6676,6678,6679,6680]],"properties":{"id":"24662756","dp":18873,"de":0}},{"type":"Polygon","arcs":[[6681,-6674,-6681,6682,6683]],"properties":{"id":"24662757","dp":15235,"de":0}},{"type":"Polygon","arcs":[[6684,-6664,-6675,-6682,6685]],"properties":{"id":"24662758","dp":13365,"de":1282}},{"type":"Polygon","arcs":[[6686,-6686,6687]],"properties":{"id":"24662759","dp":10279,"de":0}},{"type":"Polygon","arcs":[[-6688,-6684,6688,6689,6690]],"properties":{"id":"24662760","dp":17013,"de":767}},{"type":"Polygon","arcs":[[-6689,6691]],"properties":{"id":"24662761","dp":22232,"de":0}},{"type":"Polygon","arcs":[[6692,6693,-5023,-5080,-5083,6694]],"properties":{"id":"24661417","dp":13624,"de":7969}},{"type":"Polygon","arcs":[[-5794,6695,-5024,-6694]],"properties":{"id":"24661418","dp":14488,"de":4444}},{"type":"Polygon","arcs":[[-5020,-5025,-6696,-5793,-5013]],"properties":{"id":"24661419","dp":30000,"de":0}},{"type":"Polygon","arcs":[[-5082,6696,6697,-6695]],"properties":{"id":"24661420","dp":16448,"de":3877}},{"type":"Polygon","arcs":[[-5084,6698,6699,-6697]],"properties":{"id":"24661421","dp":17083,"de":3030}},{"type":"Polygon","arcs":[[-6699,-5074,6700,6701]],"properties":{"id":"24661422","dp":12876,"de":24315}},{"type":"Polygon","arcs":[[6702,-6701,-5069,6703,6704]],"properties":{"id":"24661423","dp":19588,"de":9264}},{"type":"Polygon","arcs":[[-6704,-5068,6705]],"properties":{"id":"24661424","dp":16603,"de":1904}},{"type":"Polygon","arcs":[[-6705,-6706,-5064,-5482,6706,-5483,6707,6708,6709]],"properties":{"id":"24661425","dp":10108,"de":8276}},{"type":"Polygon","arcs":[[6710,6711,6712,6713,6714]],"properties":{"id":"24662858","dp":6699,"de":1150}},{"type":"Polygon","arcs":[[-6714,6715,6716,6717]],"properties":{"id":"24662859","dp":6916,"de":967}},{"type":"Polygon","arcs":[[-6713,6718,6719,6720,6721,-6716]],"properties":{"id":"24662860","dp":8429,"de":0}},{"type":"Polygon","arcs":[[6722,-2095,-2099,6723,-6719]],"properties":{"id":"24662861","dp":5689,"de":438}},{"type":"Polygon","arcs":[[-2098,6724,6725,-6720,-6724]],"properties":{"id":"24662862","dp":4585,"de":308}},{"type":"Polygon","arcs":[[-2102,6726,6727,6728,-6725]],"properties":{"id":"24662863","dp":13131,"de":0}},{"type":"Polygon","arcs":[[-6726,-6729,6729,6730,-6721]],"properties":{"id":"24662864","dp":7819,"de":0}},{"type":"Polygon","arcs":[[6731,6732,6733,6734,-6730]],"properties":{"id":"24662865","dp":5207,"de":0}},{"type":"Polygon","arcs":[[6735,6736,-6733]],"properties":{"id":"24662866","dp":4979,"de":0}},{"type":"Polygon","arcs":[[-6728,6737,6738,6739,-6736,-6732]],"properties":{"id":"24662867","dp":4831,"de":0}},{"type":"Polygon","arcs":[[6740,-6739,6741]],"properties":{"id":"24662868","dp":3710,"de":0}},{"type":"Polygon","arcs":[[6742,6743,-5257,6744]],"properties":{"id":"24663113","dp":1103,"de":305}},{"type":"Polygon","arcs":[[-2072,-2083,6745,6746,6747,-868,-2069]],"properties":{"id":"24662830","dp":4737,"de":0}},{"type":"Polygon","arcs":[[6748,-6747,6749,6750]],"properties":{"id":"24662831","dp":5663,"de":0}},{"type":"Polygon","arcs":[[6751,-6751,6752,6753]],"properties":{"id":"24662832","dp":5790,"de":0}},{"type":"Polygon","arcs":[[6754,-6753,-6750,-6746,6755,6756]],"properties":{"id":"24662833","dp":8438,"de":0}},{"type":"Polygon","arcs":[[-2082,-2085,6757,6758,-6756]],"properties":{"id":"24662834","dp":13589,"de":0}},{"type":"Polygon","arcs":[[6759,-6757,-6759,6760,6761,6762]],"properties":{"id":"24662835","dp":6318,"de":803}},{"type":"Polygon","arcs":[[-6727,-2101,-2066,6763,-6742,-6738]],"properties":{"id":"24662869","dp":2880,"de":2304}},{"type":"Polygon","arcs":[[-2065,-2070,-873,6764,-888,-6734,-6737,-6740,-6741,-6764]],"properties":{"id":"24662870","dp":2654,"de":333}},{"type":"Polygon","arcs":[[6765,6766,6767,6768]],"properties":{"id":"24661557","dp":13272,"de":0}},{"type":"Polygon","arcs":[[6769,6770,6771,-6767]],"properties":{"id":"24661558","dp":24042,"de":2836}},{"type":"Polygon","arcs":[[6772,6773,-6771,6774]],"properties":{"id":"24661559","dp":24840,"de":0}},{"type":"Polygon","arcs":[[-6772,6775,6776,6777,6778,-6768]],"properties":{"id":"24661560","dp":18750,"de":2138}},{"type":"Polygon","arcs":[[6779,6780,-6777]],"properties":{"id":"24661561","dp":25255,"de":0}},{"type":"Polygon","arcs":[[6781,-6778,-6781,6782]],"properties":{"id":"24661562","dp":29653,"de":0}},{"type":"Polygon","arcs":[[6783,-6782,6784,6785,-5563,6786,6787,6788]],"properties":{"id":"24661563","dp":18218,"de":0}},{"type":"Polygon","arcs":[[6789,6790,-6785,-6783,-6780]],"properties":{"id":"24661564","dp":32313,"de":2313}},{"type":"Polygon","arcs":[[-6774,6791,-6790,-6776]],"properties":{"id":"24661566","dp":48333,"de":0}},{"type":"Polygon","arcs":[[6792,6793,6794,6795,6796,6797,6798,-3551,-5564,-6786,-6791,-6792,-6773]],"properties":{"id":"24661567","dp":1490,"de":5112}},{"type":"Polygon","arcs":[[6799,-6798,6800,6801]],"properties":{"id":"24661568","dp":2638,"de":303}},{"type":"Polygon","arcs":[[6802,-6801,-6797,6803]],"properties":{"id":"24661569","dp":2676,"de":254}},{"type":"Polygon","arcs":[[6804,6805,6806,6807,6808,6809,6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820]],"properties":{"id":"24662942","dp":540,"de":977}},{"type":"Polygon","arcs":[[6821,6822,6823,-6811]],"properties":{"id":"24662943","dp":5099,"de":0}},{"type":"Polygon","arcs":[[6824,6825,-6812,-6824]],"properties":{"id":"24662944","dp":5075,"de":0}},{"type":"Polygon","arcs":[[-6826,-6813]],"properties":{"id":"24662945","dp":7296,"de":0}},{"type":"Polygon","arcs":[[-6823,6826,6827,6828,-6814,-6825]],"properties":{"id":"24662946","dp":5824,"de":0}},{"type":"Polygon","arcs":[[-909,-890,6829,6830,-6828,6831]],"properties":{"id":"24662947","dp":2837,"de":439}},{"type":"Polygon","arcs":[[6832,6833,6834,-1466]],"properties":{"id":"24661672","dp":11859,"de":2743}},{"type":"Polygon","arcs":[[6835,-5436]],"properties":{"id":"24663161","dp":3638,"de":0}},{"type":"Polygon","arcs":[[-6836,-5435]],"properties":{"id":"24663162","dp":3481,"de":0}},{"type":"Polygon","arcs":[[-5656,-5664,6836,6837,6838,-5631,-5639,-5439]],"properties":{"id":"24663050","dp":1456,"de":2365}},{"type":"Polygon","arcs":[[-6839,6839,6840,-5618,-5632]],"properties":{"id":"24663051","dp":4317,"de":469}},{"type":"Polygon","arcs":[[-6841,6841,-5619]],"properties":{"id":"24663052","dp":2500,"de":0}},{"type":"MultiPolygon","arcs":[[[-6840,-6838,6842,6843,-5609,-5620,-6842]],[[6844]]],"properties":{"id":"24663053","dp":4247,"de":273}},{"type":"Polygon","arcs":[[6845,6846,-6623,-6616]],"properties":{"id":"24662802","dp":9247,"de":0}},{"type":"Polygon","arcs":[[6847,6848,6849,-6624,-6847]],"properties":{"id":"24662803","dp":9469,"de":0}},{"type":"Polygon","arcs":[[6850,-6514,6851,6852,-6615,-6601]],"properties":{"id":"24662804","dp":8281,"de":1615}},{"type":"Polygon","arcs":[[-6524,-6515,-6851,-6600,6853,-6531]],"properties":{"id":"24662805","dp":6032,"de":2526}},{"type":"Polygon","arcs":[[-6532,-6854,-6598,-6539]],"properties":{"id":"24662806","dp":14884,"de":1156}},{"type":"Polygon","arcs":[[6854,6855,6856,6857,6858,6859]],"properties":{"id":"24662807","dp":4530,"de":729}},{"type":"Polygon","arcs":[[6860,6861,6862,6863,-6860]],"properties":{"id":"24662808","dp":6016,"de":0}},{"type":"Polygon","arcs":[[6864,-6861,-6859,6865,6866]],"properties":{"id":"24662809","dp":3980,"de":717}},{"type":"Polygon","arcs":[[6867,-6866,6868,6869,6870]],"properties":{"id":"24662810","dp":3325,"de":1836}},{"type":"Polygon","arcs":[[-6870,6871,6872,6873]],"properties":{"id":"24662811","dp":6633,"de":685}},{"type":"Polygon","arcs":[[-6873,6874,6875,6876]],"properties":{"id":"24662812","dp":5492,"de":2710}},{"type":"Polygon","arcs":[[-6876,6877,-3560,6878,6879]],"properties":{"id":"24662813","dp":12181,"de":3454}},{"type":"Polygon","arcs":[[6880,-6877,-6880,6881,6882]],"properties":{"id":"24662814","dp":19191,"de":0}},{"type":"Polygon","arcs":[[6883,-6883,6884,6885,6886,6887,6888]],"properties":{"id":"24662815","dp":23152,"de":0}},{"type":"Polygon","arcs":[[6889,6890,6891,-6885,6892]],"properties":{"id":"24662816","dp":18819,"de":0}},{"type":"Polygon","arcs":[[6893,-6893,-6882,-6879,-3563,-3580]],"properties":{"id":"24662817","dp":3026,"de":2098}},{"type":"Polygon","arcs":[[-6858,6894,6895,-3561,-6878,-6875,-6872,-6869]],"properties":{"id":"24662819","dp":8716,"de":591}},{"type":"MultiPolygon","arcs":[[[-883,6896,6897,6898,-6896,6899,-871,-878]],[[6900]],[[6901]]],"properties":{"id":"24662821","dp":5191,"de":857}},{"type":"Polygon","arcs":[[6902,6903,-4241,6904,6905]],"properties":{"id":"24661485","dp":7704,"de":1130}},{"type":"Polygon","arcs":[[-3183,-2294,-6905,-4245,-1903,-3190]],"properties":{"id":"24661486","dp":12156,"de":3317}},{"type":"Polygon","arcs":[[6906,6907,-4242,-6904]],"properties":{"id":"24661487","dp":18454,"de":0}},{"type":"Polygon","arcs":[[6908,-6907,6909]],"properties":{"id":"24661488","dp":9503,"de":793}},{"type":"Polygon","arcs":[[6910,6911,-4259,-4251,-4250,-4246,-4243,-6908,-6909]],"properties":{"id":"24661489","dp":7408,"de":0}},{"type":"Polygon","arcs":[[6912,-4256,-6912,6913,6914]],"properties":{"id":"24661490","dp":11955,"de":0}},{"type":"Polygon","arcs":[[6915,-4262,-6913,6916]],"properties":{"id":"24661491","dp":5716,"de":1286}},{"type":"Polygon","arcs":[[6917,6918,-4270,-6916]],"properties":{"id":"24661492","dp":14933,"de":3833}},{"type":"Polygon","arcs":[[6919,-6762,6920,6921]],"properties":{"id":"24662836","dp":7163,"de":1242}},{"type":"Polygon","arcs":[[6922,-6763,-6920,6923]],"properties":{"id":"24662837","dp":6030,"de":0}},{"type":"Polygon","arcs":[[6924,6925,-6924]],"properties":{"id":"24662838","dp":3175,"de":0}},{"type":"Polygon","arcs":[[-3576,6926,6927,-6925,-6922,6928,6929]],"properties":{"id":"24662839","dp":1409,"de":1983}},{"type":"Polygon","arcs":[[6930,6931,6932,-6927]],"properties":{"id":"24662840","dp":9553,"de":0}},{"type":"Polygon","arcs":[[6933,6934,-6928,-6933,6935,6936,6937]],"properties":{"id":"24662841","dp":4500,"de":1416}},{"type":"Polygon","arcs":[[-6934,6938,6939]],"properties":{"id":"24662842","dp":9608,"de":0}},{"type":"Polygon","arcs":[[-6754,-6755,-6760,-6923,-6926,-6935,-6940,6940]],"properties":{"id":"24662843","dp":3677,"de":1180}},{"type":"Polygon","arcs":[[-6936,-6932,6941,6942,6943]],"properties":{"id":"24662844","dp":3318,"de":0}},{"type":"Polygon","arcs":[[6944,-6942,-6931,-3584]],"properties":{"id":"24662845","dp":5077,"de":0}},{"type":"Polygon","arcs":[[-3562,-6899,6945,-3581]],"properties":{"id":"24662848","dp":7466,"de":0}},{"type":"Polygon","arcs":[[6946,6947,6948,6949]],"properties":{"id":"24661519","dp":14224,"de":4176}},{"type":"Polygon","arcs":[[6950,6951,6952,6953,6954,-6947]],"properties":{"id":"24661520","dp":8110,"de":5381}},{"type":"Polygon","arcs":[[-3686,-4307,6955,6956,6957,-6948,-6955,6958]],"properties":{"id":"24661521","dp":7769,"de":14124}},{"type":"Polygon","arcs":[[6959,6960,-3390,-3687,-6959,6961]],"properties":{"id":"24661522","dp":9824,"de":6955}},{"type":"Polygon","arcs":[[6962,6963,6964,-6960,6965]],"properties":{"id":"24661523","dp":20044,"de":13053}},{"type":"Polygon","arcs":[[6966,6967,6968,6969,-6964,6970]],"properties":{"id":"24661524","dp":14770,"de":5045}},{"type":"Polygon","arcs":[[6971,6972,6973,6974,6975,-6968,6976,6977]],"properties":{"id":"24661525","dp":16561,"de":4731}},{"type":"Polygon","arcs":[[6978,6979,-6977,6980]],"properties":{"id":"24661526","dp":19583,"de":2604}},{"type":"Polygon","arcs":[[6981,6982,-6978,-6980]],"properties":{"id":"24661527","dp":21813,"de":0}},{"type":"Polygon","arcs":[[6983,6984,-6972,-6983]],"properties":{"id":"24661528","dp":27283,"de":2890}},{"type":"Polygon","arcs":[[6985,6986,-6985]],"properties":{"id":"24661529","dp":24125,"de":5312}},{"type":"Polygon","arcs":[[-6607,6987,6988,-6986,-6984,-6982,-6979,6989,-4721]],"properties":{"id":"24661530","dp":6718,"de":3696}},{"type":"Polygon","arcs":[[6990,6991,6992,-6973,-6987,-6989]],"properties":{"id":"24661531","dp":20208,"de":5555}},{"type":"Polygon","arcs":[[6993,6994,-3783,6995]],"properties":{"id":"24662928","dp":4422,"de":402}},{"type":"Polygon","arcs":[[6996,6997,-6994,6998,6999,7000]],"properties":{"id":"24662929","dp":3719,"de":5212}},{"type":"Polygon","arcs":[[-6995,-6998,7001,7002,-3778]],"properties":{"id":"24662930","dp":4861,"de":0}},{"type":"Polygon","arcs":[[-3779,-7003,7003,7004]],"properties":{"id":"24662931","dp":3678,"de":0}},{"type":"Polygon","arcs":[[-3657,-7005,7005,-3636,-3641,-3654]],"properties":{"id":"24662932","dp":6625,"de":0}},{"type":"Polygon","arcs":[[-6835,7006,-2256,7007,7008,7009]],"properties":{"id":"24661673","dp":15104,"de":2022}},{"type":"Polygon","arcs":[[7010,-7008,-2259,-2253,7011,-1390]],"properties":{"id":"24661674","dp":12972,"de":1380}},{"type":"Polygon","arcs":[[-1391,-7012,-3585,7012]],"properties":{"id":"24661675","dp":11932,"de":0}},{"type":"Polygon","arcs":[[-1440,-7013,-2250,7013]],"properties":{"id":"24661676","dp":18614,"de":2164}},{"type":"Polygon","arcs":[[-1441,-7014,-2252,7014]],"properties":{"id":"24661677","dp":17160,"de":0}},{"type":"Polygon","arcs":[[-1442,-7015,-2245,7015]],"properties":{"id":"24661678","dp":7049,"de":0}},{"type":"Polygon","arcs":[[-1443,-7016,-2249,-2241,7016]],"properties":{"id":"24661679","dp":3646,"de":0}},{"type":"Polygon","arcs":[[-7017,-2244,7017,-1445]],"properties":{"id":"24661680","dp":13592,"de":1219}},{"type":"Polygon","arcs":[[-7018,7018,7019,-1448]],"properties":{"id":"24661681","dp":11264,"de":1340}},{"type":"Polygon","arcs":[[-7020,7020,-1534,7021,7022]],"properties":{"id":"24661682","dp":5823,"de":608}},{"type":"Polygon","arcs":[[-1449,-7023,7023,7024]],"properties":{"id":"24661683","dp":10484,"de":2222}},{"type":"Polygon","arcs":[[-7024,-7022,7025,7026]],"properties":{"id":"24661684","dp":12403,"de":0}},{"type":"Polygon","arcs":[[-7026,-1537,7027,7028]],"properties":{"id":"24661685","dp":14946,"de":0}},{"type":"Polygon","arcs":[[-1450,-7025,-7027,-7029,7029,7030]],"properties":{"id":"24661686","dp":6037,"de":1596}},{"type":"Polygon","arcs":[[-7030,-7028,7031,7032,7033,-3491]],"properties":{"id":"24661687","dp":8422,"de":0}},{"type":"Polygon","arcs":[[-7034,7034,-1750,-3833,-3492]],"properties":{"id":"24661688","dp":3666,"de":1681}},{"type":"Polygon","arcs":[[-7033,7035,-7035]],"properties":{"id":"24661689","dp":11156,"de":0}},{"type":"Polygon","arcs":[[-1536,-1736,-1742,-1746,-7036,-7032]],"properties":{"id":"24661690","dp":4255,"de":2097}},{"type":"Polygon","arcs":[[7036,-3149,-3097,-3096,-3092,7037,-3084,-3077,-4954]],"properties":{"id":"24663054","dp":1808,"de":386}},{"type":"Polygon","arcs":[[-7038,-3094,-3087,7038,-3085]],"properties":{"id":"24663055","dp":2806,"de":0}},{"type":"Polygon","arcs":[[-3091,-3079,-3086,-7039]],"properties":{"id":"24663056","dp":3577,"de":0}},{"type":"Polygon","arcs":[[7039,7040,7041,7042,-5830]],"properties":{"id":"24661826","dp":17040,"de":3582}},{"type":"Polygon","arcs":[[-5109,7043,7044,-7042,7045]],"properties":{"id":"24661827","dp":5877,"de":1779}},{"type":"Polygon","arcs":[[-5110,-7046,-7041,7046]],"properties":{"id":"24661828","dp":14654,"de":4608}},{"type":"Polygon","arcs":[[7047,-7047,-7040,-5826,-5807,-5811,-5813]],"properties":{"id":"24661829","dp":11941,"de":5036}},{"type":"Polygon","arcs":[[7048,-5104,-5106,-7048,-5816,-5818]],"properties":{"id":"24661830","dp":13383,"de":6565}},{"type":"Polygon","arcs":[[-5492,-5486,7049,-5101,-7049,-5817]],"properties":{"id":"24661831","dp":14793,"de":3793}},{"type":"Polygon","arcs":[[7050,-5099,-7050,-5485]],"properties":{"id":"24661832","dp":19090,"de":3846}},{"type":"Polygon","arcs":[[-5484,-6707,-5481,-5100,-7051]],"properties":{"id":"24661833","dp":12399,"de":12526}},{"type":"Polygon","arcs":[[7051,7052,7053,7054,7055]],"properties":{"id":"24661457","dp":18027,"de":2916}},{"type":"Polygon","arcs":[[7056,7057,-7052]],"properties":{"id":"24661458","dp":18820,"de":3589}},{"type":"Polygon","arcs":[[7058,7059,-7058,7060]],"properties":{"id":"24661459","dp":16330,"de":4357}},{"type":"Polygon","arcs":[[7061,7062,-7053,-7060]],"properties":{"id":"24661460","dp":13878,"de":2803}},{"type":"Polygon","arcs":[[-7054,-7063,7063,7064,7065,7066]],"properties":{"id":"24661461","dp":17252,"de":2266}},{"type":"Polygon","arcs":[[7067,7068,-7066,7069]],"properties":{"id":"24661462","dp":14907,"de":2314}},{"type":"Polygon","arcs":[[-7068,7070,7071,7072,7073,7074]],"properties":{"id":"24661463","dp":11728,"de":6558}},{"type":"Polygon","arcs":[[-7074,7075,7076,7077,7078]],"properties":{"id":"24661464","dp":10497,"de":5231}},{"type":"Polygon","arcs":[[7079,7080,-7076,-7073]],"properties":{"id":"24661465","dp":12769,"de":1798}},{"type":"Polygon","arcs":[[-7081,7081,7082,7083,7084,-7077]],"properties":{"id":"24661466","dp":8604,"de":9660}},{"type":"Polygon","arcs":[[-7085,7085,7086,7087]],"properties":{"id":"24661467","dp":10199,"de":8890}},{"type":"Polygon","arcs":[[7088,7089,7090,-480,-486,-487,-497,7091,7092,7093,7094,7095,-6806,7096]],"properties":{"id":"24662905","dp":72,"de":354}},{"type":"Polygon","arcs":[[7097,7098,7099,-1400,-4665,-1396,-1405,7100,-7093]],"properties":{"id":"24662906","dp":853,"de":110}},{"type":"Polygon","arcs":[[7101,-4666,-1401,-7100]],"properties":{"id":"24662907","dp":5283,"de":0}},{"type":"Polygon","arcs":[[-683,-4664,-7102,-7099,7102]],"properties":{"id":"24662908","dp":18464,"de":0}},{"type":"Polygon","arcs":[[-3925,7103,-667,-670,-672,-676,-684,-7103,-7098,-7092,-496,-3921]],"properties":{"id":"24662909","dp":5218,"de":1097}},{"type":"Polygon","arcs":[[-656,-658,-668,-7104,-3924,-3928,-3931]],"properties":{"id":"24662910","dp":11536,"de":1696}},{"type":"Polygon","arcs":[[7104,-7089,7105,7106,7107]],"properties":{"id":"24662911","dp":1531,"de":846}},{"type":"Polygon","arcs":[[-7090,-7105,7108,7109,7110]],"properties":{"id":"24662912","dp":6269,"de":0}},{"type":"Polygon","arcs":[[-7109,7111,7112]],"properties":{"id":"24662913","dp":5594,"de":0}},{"type":"Polygon","arcs":[[7113,-7110,-7113,7114,-1159,-465,-468,-471]],"properties":{"id":"24662914","dp":4598,"de":655}},{"type":"Polygon","arcs":[[-7091,-7111,-7114,-470,-477]],"properties":{"id":"24662915","dp":6083,"de":979}},{"type":"Polygon","arcs":[[7115,7116,7117,-7115,-7112,-7108]],"properties":{"id":"24662916","dp":3201,"de":2302}},{"type":"Polygon","arcs":[[-1160,-7118,7118,7119,-1143,-1150,-1156]],"properties":{"id":"24662917","dp":3547,"de":1924}},{"type":"Polygon","arcs":[[7120,-7119,-7117,7121]],"properties":{"id":"24662918","dp":8833,"de":0}},{"type":"Polygon","arcs":[[7122,7123,7124,-4409,-3129,7125,-3559,-4492,-5573,-5566]],"properties":{"id":"24661603","dp":307,"de":4543}},{"type":"Polygon","arcs":[[-7126,-3128,7126,-3555]],"properties":{"id":"24661606","dp":27500,"de":0}},{"type":"Polygon","arcs":[[-7127,-3127,-4500,-3556]],"properties":{"id":"24661609","dp":18665,"de":0}},{"type":"Polygon","arcs":[[-4289,-3476,-4288,-595,-584,-5569]],"properties":{"id":"24661611","dp":7078,"de":5486}},{"type":"Polygon","arcs":[[7127,7128,7129,7130,-6787,-5570,-4206]],"properties":{"id":"24661614","dp":11031,"de":0}},{"type":"Polygon","arcs":[[7131,7132,-6788,-7131]],"properties":{"id":"24661615","dp":32801,"de":0}},{"type":"Polygon","arcs":[[7133,-6789,-7133]],"properties":{"id":"24661616","dp":27903,"de":3493}},{"type":"Polygon","arcs":[[7134,7135,-7130,7136]],"properties":{"id":"24661617","dp":18058,"de":0}},{"type":"Polygon","arcs":[[7137,-7137,-7129,7138]],"properties":{"id":"24661618","dp":27520,"de":1377}},{"type":"Polygon","arcs":[[-2940,-918,7139,7140,-4457]],"properties":{"id":"24661619","dp":4711,"de":1334}},{"type":"Polygon","arcs":[[-7004,-7002,7141,7142,-3635,-7006]],"properties":{"id":"24662933","dp":1588,"de":2410}},{"type":"Polygon","arcs":[[7143,7144,7145,-7143]],"properties":{"id":"24662934","dp":2106,"de":0}},{"type":"Polygon","arcs":[[7146,-1127,-3623,-3629,-3465,-3632,-7146]],"properties":{"id":"24662935","dp":982,"de":375}},{"type":"Polygon","arcs":[[7147,7148,7149,7150]],"properties":{"id":"24661636","dp":10835,"de":1284}},{"type":"Polygon","arcs":[[7151,7152,7153,-7148]],"properties":{"id":"24661637","dp":10254,"de":5090}},{"type":"Polygon","arcs":[[7154,7155,-7153,7156]],"properties":{"id":"24661638","dp":14758,"de":0}},{"type":"Polygon","arcs":[[7157,7158,7159,-7155,7160,7161]],"properties":{"id":"24661639","dp":10641,"de":2540}},{"type":"Polygon","arcs":[[7162,7163,7164,-7158,7165]],"properties":{"id":"24661640","dp":16422,"de":4743}},{"type":"Polygon","arcs":[[7166,7167,7168,-7163,7169,7170]],"properties":{"id":"24661641","dp":13275,"de":3658}},{"type":"Polygon","arcs":[[7171,7172,-7167,7173]],"properties":{"id":"24661642","dp":14177,"de":1973}},{"type":"Polygon","arcs":[[7174,7175,7176,-7172]],"properties":{"id":"24661643","dp":14590,"de":1803}},{"type":"Polygon","arcs":[[7177,7178,7179,-7176]],"properties":{"id":"24661644","dp":15390,"de":1950}},{"type":"Polygon","arcs":[[-7087,7180,-7179,7181]],"properties":{"id":"24661645","dp":19844,"de":3115}},{"type":"Polygon","arcs":[[7182,-7182,7183,7184]],"properties":{"id":"24661646","dp":11585,"de":2743}},{"type":"Polygon","arcs":[[-7078,-7088,-7183,7185]],"properties":{"id":"24661647","dp":12103,"de":5469}},{"type":"Polygon","arcs":[[7186,-7184,-7178,7187]],"properties":{"id":"24661648","dp":15555,"de":2083}},{"type":"Polygon","arcs":[[7188,-7188,-7175,7189]],"properties":{"id":"24661649","dp":13627,"de":6372}},{"type":"Polygon","arcs":[[-7190,-7174,7190,7191]],"properties":{"id":"24661650","dp":14983,"de":2786}},{"type":"Polygon","arcs":[[-7191,-7171,7192,7193]],"properties":{"id":"24661651","dp":16678,"de":1384}},{"type":"Polygon","arcs":[[-7193,-7170,7194,7195]],"properties":{"id":"24661652","dp":13893,"de":2666}},{"type":"Polygon","arcs":[[-7195,-7166,7196,7197,7198]],"properties":{"id":"24661653","dp":11914,"de":3710}},{"type":"Polygon","arcs":[[-7197,-7162,7199,7200,7201]],"properties":{"id":"24661654","dp":15430,"de":2049}},{"type":"Polygon","arcs":[[-7200,-7161,7202,7203]],"properties":{"id":"24661655","dp":15183,"de":0}},{"type":"Polygon","arcs":[[-1501,-7203,-7157,7204]],"properties":{"id":"24661656","dp":13046,"de":1562}},{"type":"Polygon","arcs":[[-7205,-7152,7205,-1497]],"properties":{"id":"24661657","dp":14362,"de":2684}},{"type":"Polygon","arcs":[[-7206,-7151,7206,-1492]],"properties":{"id":"24661658","dp":11503,"de":2534}},{"type":"Polygon","arcs":[[-7207,7207,7208,7209,-5762,-5760]],"properties":{"id":"24661659","dp":9249,"de":1657}},{"type":"Polygon","arcs":[[-7084,7210,7211,7212,-7086]],"properties":{"id":"24661468","dp":8863,"de":7410}},{"type":"Polygon","arcs":[[7213,7214,-7181,-7213]],"properties":{"id":"24661469","dp":14171,"de":4294}},{"type":"Polygon","arcs":[[-7180,-7215,7215,7216]],"properties":{"id":"24661470","dp":13006,"de":2972}},{"type":"Polygon","arcs":[[-7177,-7217,7217,7218]],"properties":{"id":"24661471","dp":12579,"de":3184}},{"type":"Polygon","arcs":[[-7219,7219,7220,-7173]],"properties":{"id":"24661472","dp":12709,"de":2580}},{"type":"Polygon","arcs":[[-7221,7221,7222,-7168]],"properties":{"id":"24661473","dp":9940,"de":6804}},{"type":"Polygon","arcs":[[-7169,-7223,7223,7224]],"properties":{"id":"24661474","dp":14274,"de":2745}},{"type":"Polygon","arcs":[[-7164,-7225,7225,7226]],"properties":{"id":"24661475","dp":13307,"de":3149}},{"type":"Polygon","arcs":[[-7165,-7227,7227,7228]],"properties":{"id":"24661476","dp":13065,"de":0}},{"type":"Polygon","arcs":[[-7229,7229,7230,7231,-7159]],"properties":{"id":"24661477","dp":14345,"de":2182}},{"type":"Polygon","arcs":[[-7232,7232,7233,-7160]],"properties":{"id":"24661478","dp":16908,"de":4389}},{"type":"Polygon","arcs":[[-7234,7234,-6918,7235,-7154,-7156]],"properties":{"id":"24661479","dp":14762,"de":1939}},{"type":"Polygon","arcs":[[-7149,-7236,-6917,7236,7237]],"properties":{"id":"24661480","dp":8243,"de":3399}},{"type":"Polygon","arcs":[[7238,-7237,-6915,7239,7240]],"properties":{"id":"24661481","dp":12135,"de":1941}},{"type":"Polygon","arcs":[[7241,-7240,-6914,-6911,7242,7243]],"properties":{"id":"24661482","dp":12693,"de":2552}},{"type":"Polygon","arcs":[[-7244,7244,7245,7246,7247]],"properties":{"id":"24661483","dp":8645,"de":1181}},{"type":"Polygon","arcs":[[-7243,-6910,-6903,-7245]],"properties":{"id":"24661484","dp":11379,"de":1819}},{"type":"Polygon","arcs":[[-5114,-5120,-5126,7248,7249,7250,-7044,-5108]],"properties":{"id":"24661966","dp":7873,"de":3232}},{"type":"Polygon","arcs":[[7251,7252,7253,7254,7255,-7251,7256,7257,7258,-7198,7259]],"properties":{"id":"24661967","dp":3177,"de":3564}},{"type":"Polygon","arcs":[[-7252,7260,7261,7262,7263]],"properties":{"id":"24661968","dp":13015,"de":2763}},{"type":"Polygon","arcs":[[7264,-7263,7265,7266,7267]],"properties":{"id":"24661969","dp":18865,"de":2835}},{"type":"Polygon","arcs":[[-7254,7268,-7268,7269,7270,7271,7272]],"properties":{"id":"24661970","dp":11617,"de":5024}},{"type":"Polygon","arcs":[[7273,-7270,-7267,-1502,-1495,-5753]],"properties":{"id":"24661971","dp":13829,"de":4255}},{"type":"Polygon","arcs":[[-6745,-5256,-5250,-5246,-5240,7274]],"properties":{"id":"24663114","dp":1217,"de":108}},{"type":"Polygon","arcs":[[7275,-5254,7276,7277,-6743,-7275,-5239,7278]],"properties":{"id":"24663115","dp":693,"de":123}},{"type":"Polygon","arcs":[[7279,7280,7281,-6414,-6412]],"properties":{"id":"24662579","dp":7222,"de":3378}},{"type":"Polygon","arcs":[[7282,7283,7284,-7280,-6411,7285]],"properties":{"id":"24662580","dp":8328,"de":3391}},{"type":"Polygon","arcs":[[-547,7286,-7283,7287]],"properties":{"id":"24662581","dp":11340,"de":1250}},{"type":"Polygon","arcs":[[-2357,7288,7289,7290,-7284,-7287]],"properties":{"id":"24662582","dp":10340,"de":2086}},{"type":"Polygon","arcs":[[-548,-7288,-7286,-6410,7291]],"properties":{"id":"24662583","dp":6255,"de":755}},{"type":"Polygon","arcs":[[-538,-7292,-6409,-6597]],"properties":{"id":"24662584","dp":9332,"de":1824}},{"type":"Polygon","arcs":[[-6364,7292,-6637,-6639,7293,7294,-1651,-3588]],"properties":{"id":"24662967","dp":1778,"de":3217}},{"type":"Polygon","arcs":[[-6363,-6604,-6622,-6634,-7293]],"properties":{"id":"24662968","dp":7128,"de":0}},{"type":"Polygon","arcs":[[-1216,7295,-1629,-1633,-1637,-1641,-1647,-1652,7296,-1624]],"properties":{"id":"24662969","dp":657,"de":2500}},{"type":"Polygon","arcs":[[-1630,-7296,-1215,-1429]],"properties":{"id":"24662970","dp":11054,"de":1318}},{"type":"Polygon","arcs":[[7297,7298,-6305,-6426,-6345,7299]],"properties":{"id":"24662971","dp":9022,"de":0}},{"type":"Polygon","arcs":[[-1828,-4920,-4922,-4924,-4925,-4927,7300,-4932,7301]],"properties":{"id":"24662972","dp":4122,"de":3140}},{"type":"Polygon","arcs":[[-7302,-4931,-7300,-1829]],"properties":{"id":"24662973","dp":6364,"de":1612}},{"type":"Polygon","arcs":[[7302,7303,7304,-7298,-4930]],"properties":{"id":"24662974","dp":9606,"de":0}},{"type":"Polygon","arcs":[[7305,7306,7307,-7304]],"properties":{"id":"24662975","dp":11605,"de":0}},{"type":"Polygon","arcs":[[-7308,7308,7309,7310,-6303,-6306,-7299,-7305]],"properties":{"id":"24662976","dp":2804,"de":0}},{"type":"Polygon","arcs":[[-7307,7311,7312,-7309]],"properties":{"id":"24662977","dp":8587,"de":0}},{"type":"Polygon","arcs":[[7313,7314,-7312,7315]],"properties":{"id":"24662978","dp":8765,"de":2839}},{"type":"Polygon","arcs":[[7316,7317,-7316,-7306,-7303,-4935,-4940]],"properties":{"id":"24662979","dp":5790,"de":604}},{"type":"Polygon","arcs":[[7318,7319,-4892,-4896,-4117,-4118]],"properties":{"id":"24662980","dp":13309,"de":0}},{"type":"Polygon","arcs":[[-4320,-3796,-4893,-7320,7320,-4129,-4131]],"properties":{"id":"24662981","dp":3753,"de":531}},{"type":"Polygon","arcs":[[-7321,-7319,-4121,-4125]],"properties":{"id":"24662982","dp":21013,"de":1843}},{"type":"Polygon","arcs":[[7321,7322,7323,7324]],"properties":{"id":"24662983","dp":4104,"de":0}},{"type":"Polygon","arcs":[[7325,7326,-7322,7327,7328,-5978]],"properties":{"id":"24662984","dp":694,"de":59}},{"type":"Polygon","arcs":[[7329,7330,7331,-6804,-6796]],"properties":{"id":"24661570","dp":1675,"de":646}},{"type":"Polygon","arcs":[[7332,7333,7334,7335,-7330,-6795]],"properties":{"id":"24661571","dp":3139,"de":419}},{"type":"Polygon","arcs":[[7336,-7335,7337,7338]],"properties":{"id":"24661572","dp":8257,"de":891}},{"type":"Polygon","arcs":[[-6605,-6491,-2861,7339,7340,-7339,7341]],"properties":{"id":"24661573","dp":4632,"de":2777}},{"type":"Polygon","arcs":[[7342,7343,7344,-7331,-7336,-7337,-7341]],"properties":{"id":"24661574","dp":3764,"de":329}},{"type":"Polygon","arcs":[[7345,-7332,-7345,7346]],"properties":{"id":"24661575","dp":6144,"de":652}},{"type":"Polygon","arcs":[[7347,7348,7349,-7347,-7344]],"properties":{"id":"24661576","dp":5741,"de":1770}},{"type":"Polygon","arcs":[[-7350,7350,7351,7352,-6803,-7346]],"properties":{"id":"24661577","dp":4896,"de":1349}},{"type":"Polygon","arcs":[[7353,7354,7355,7356,-7352]],"properties":{"id":"24661578","dp":3561,"de":2340}},{"type":"Polygon","arcs":[[7357,7358,7359,-7355,7360]],"properties":{"id":"24661579","dp":13350,"de":2094}},{"type":"Polygon","arcs":[[7361,7362,-7361,-7354,-7351,7363]],"properties":{"id":"24661580","dp":5877,"de":1084}},{"type":"Polygon","arcs":[[-917,7364,-7364,-7349,7365,-7140]],"properties":{"id":"24661581","dp":2279,"de":1302}},{"type":"Polygon","arcs":[[-921,-937,7366,-7362,-7365,-916]],"properties":{"id":"24661582","dp":3033,"de":380}},{"type":"Polygon","arcs":[[7367,7368,7369,7370,7371,7372,7373,7374,7375,-397,7376]],"properties":{"id":"24662067","dp":0,"de":4307}},{"type":"Polygon","arcs":[[7377,7378,-384,7379]],"properties":{"id":"24662069","dp":13885,"de":0}},{"type":"Polygon","arcs":[[7380,7381,7382,-7378,7383,7384]],"properties":{"id":"24662070","dp":13016,"de":0}},{"type":"Polygon","arcs":[[7385,7386,7387,-7381]],"properties":{"id":"24662071","dp":23709,"de":0}},{"type":"Polygon","arcs":[[-7278,7388,-5252,-5258,-6744]],"properties":{"id":"24663116","dp":1197,"de":230}},{"type":"Polygon","arcs":[[-7277,-5253,-7389]],"properties":{"id":"24663117","dp":1178,"de":0}},{"type":"Polygon","arcs":[[-6113,-5255,-7276,7389,7390,7391,7392,7393,-5145,-5148,7394,-5172],[-5151,-5152]],"properties":{"id":"24663118","dp":122,"de":297}},{"type":"Polygon","arcs":[[-5138,-5146,-7394,7395]],"properties":{"id":"24663119","dp":1488,"de":3982}},{"type":"Polygon","arcs":[[7396,-5139,-7396,-7393,7397]],"properties":{"id":"24663120","dp":3795,"de":596}},{"type":"Polygon","arcs":[[-7398,-7392,7398]],"properties":{"id":"24663121","dp":3712,"de":1164}},{"type":"Polygon","arcs":[[-7399,-7391,7399,-5140,-7397]],"properties":{"id":"24663122","dp":3883,"de":2478}},{"type":"Polygon","arcs":[[-6114,7400,-5167,-5169,-5165,-5878,-5870,-5184,-6117]],"properties":{"id":"24663407","dp":1668,"de":0}},{"type":"Polygon","arcs":[[-5399,-3436]],"properties":{"id":"24663164","dp":2687,"de":1734}},{"type":"Polygon","arcs":[[-5448,7401,-5445,-5451,7402,7403,-5453,-3438,-5398,7404,7405,7406]],"properties":{"id":"24663166","dp":1449,"de":3685}},{"type":"Polygon","arcs":[[7407,-7405,-5397,7408,7409]],"properties":{"id":"24663167","dp":2844,"de":0}},{"type":"Polygon","arcs":[[-5441,-7402,-5447]],"properties":{"id":"24663168","dp":3333,"de":542}},{"type":"Polygon","arcs":[[7410,-4272,-4271,-6919,-7235,-7233]],"properties":{"id":"24661493","dp":14917,"de":1543}},{"type":"Polygon","arcs":[[7411,-4101,-7411,-7231]],"properties":{"id":"24661494","dp":31176,"de":0}},{"type":"Polygon","arcs":[[7412,-4105,-7412,-7230]],"properties":{"id":"24661495","dp":16679,"de":3754}},{"type":"Polygon","arcs":[[7413,-4108,-7413,-7228]],"properties":{"id":"24661496","dp":13100,"de":2131}},{"type":"Polygon","arcs":[[7414,7415,7416,-7387]],"properties":{"id":"24662072","dp":24268,"de":0}},{"type":"Polygon","arcs":[[7417,7418,7419,7420,-7416,7421,7422,7423,7424]],"properties":{"id":"24662073","dp":10919,"de":4245}},{"type":"Polygon","arcs":[[7425,7426,7427,7428,-7417,-7421]],"properties":{"id":"24662074","dp":13825,"de":1663}},{"type":"Polygon","arcs":[[-7429,7429,7430,-7388]],"properties":{"id":"24662075","dp":20565,"de":0}},{"type":"Polygon","arcs":[[-7431,7431,7432,-7382]],"properties":{"id":"24662076","dp":15990,"de":0}},{"type":"Polygon","arcs":[[-7383,-7433,7433,-385,-7379]],"properties":{"id":"24662077","dp":12444,"de":0}},{"type":"Polygon","arcs":[[7434,7435,-1388,-390]],"properties":{"id":"24662078","dp":14730,"de":0}},{"type":"Polygon","arcs":[[-1454,-1467,-7010,7436,-7435,-389]],"properties":{"id":"24662079","dp":10897,"de":1201}},{"type":"Polygon","arcs":[[-7437,-7009,-7011,-1389,-7436]],"properties":{"id":"24662080","dp":11847,"de":2653}},{"type":"Polygon","arcs":[[-5713,-5716,7437,7438]],"properties":{"id":"24661798","dp":15497,"de":6544}},{"type":"Polygon","arcs":[[-5714,-7439,7439,7440,-5709]],"properties":{"id":"24661799","dp":23933,"de":3080}},{"type":"Polygon","arcs":[[-5710,-7441,7441,7442]],"properties":{"id":"24661800","dp":25858,"de":0}},{"type":"Polygon","arcs":[[-5707,-7443,7443,7444,-5701]],"properties":{"id":"24661801","dp":7223,"de":3251}},{"type":"Polygon","arcs":[[7445,7446,7447,7448,-7444]],"properties":{"id":"24661802","dp":8200,"de":2197}},{"type":"Polygon","arcs":[[-7446,-7442,7449,7450]],"properties":{"id":"24661803","dp":24945,"de":2472}},{"type":"Polygon","arcs":[[-7440,7451,7452,7453,-7450]],"properties":{"id":"24661804","dp":20105,"de":4577}},{"type":"Polygon","arcs":[[-7438,7454,7455,-7452]],"properties":{"id":"24661805","dp":17472,"de":2361}},{"type":"Polygon","arcs":[[-5715,-5033,7456,7457,-7455]],"properties":{"id":"24661806","dp":18461,"de":3974}},{"type":"Polygon","arcs":[[-7453,-7456,-7458,7458,7459,7460]],"properties":{"id":"24661807","dp":19787,"de":4416}},{"type":"Polygon","arcs":[[-7454,-7461,7461,7462,7463,7464]],"properties":{"id":"24661808","dp":18647,"de":4713}},{"type":"Polygon","arcs":[[-7451,-7465,7465,-7447]],"properties":{"id":"24661809","dp":10440,"de":2422}},{"type":"Polygon","arcs":[[-7464,7466,7467,7468,7469,-7448,-7466]],"properties":{"id":"24661810","dp":9196,"de":6551}},{"type":"Polygon","arcs":[[-7467,-7463,7470,7471]],"properties":{"id":"24661811","dp":18634,"de":3614}},{"type":"Polygon","arcs":[[-7471,-7462,-7460,7472,7473]],"properties":{"id":"24661812","dp":19173,"de":3512}},{"type":"Polygon","arcs":[[-7473,-7459,7474,7475]],"properties":{"id":"24661813","dp":15366,"de":8494}},{"type":"Polygon","arcs":[[-7475,-7457,7476,7477,7478,7479]],"properties":{"id":"24661814","dp":12566,"de":3318}},{"type":"Polygon","arcs":[[-5032,7480,-7477]],"properties":{"id":"24661815","dp":15734,"de":7109}},{"type":"Polygon","arcs":[[7481,7482,-7481,-5031]],"properties":{"id":"24661816","dp":11709,"de":7952}},{"type":"Polygon","arcs":[[-5835,-5823,-5829,7483,7484,-7482]],"properties":{"id":"24661817","dp":12057,"de":5199}},{"type":"Polygon","arcs":[[-7485,7485,-7478,-7483]],"properties":{"id":"24661818","dp":20765,"de":0}},{"type":"Polygon","arcs":[[7486,7487,7488,7489,-7486]],"properties":{"id":"24661819","dp":17472,"de":3296}},{"type":"Polygon","arcs":[[-5828,-5833,7490,7491,7492,-7487,-7484]],"properties":{"id":"24661820","dp":12617,"de":5679}},{"type":"Polygon","arcs":[[-7493,7493,-7273,7494,-7488]],"properties":{"id":"24661821","dp":11378,"de":4407}},{"type":"Polygon","arcs":[[7495,7496,-939,-946,7497,7498]],"properties":{"id":"24661592","dp":3003,"de":0}},{"type":"Polygon","arcs":[[-945,7499,-7498]],"properties":{"id":"24661593","dp":9223,"de":0}},{"type":"Polygon","arcs":[[-7360,7500,-7499,-7500,-944,-3549,7501]],"properties":{"id":"24661594","dp":5594,"de":471}},{"type":"Polygon","arcs":[[-7356,-7502,-3554,7502]],"properties":{"id":"24661595","dp":3869,"de":455}},{"type":"Polygon","arcs":[[-7353,-7357,-7503,-3553,7503,-6802]],"properties":{"id":"24661597","dp":3066,"de":400}},{"type":"Polygon","arcs":[[-7504,-3552,-6799,-6800]],"properties":{"id":"24661598","dp":3017,"de":361}},{"type":"Polygon","arcs":[[7504,-4111,-7414,-7226]],"properties":{"id":"24661497","dp":13043,"de":1976}},{"type":"Polygon","arcs":[[7505,-4119,-4115,-4112,-7505,-7224,-7222]],"properties":{"id":"24661498","dp":5474,"de":23734}},{"type":"Polygon","arcs":[[-7506,-7220,-7218,-7216,7506,-4126,-4122]],"properties":{"id":"24661499","dp":10355,"de":1601}},{"type":"Polygon","arcs":[[7507,-4135,-4132,-4127,-7507,-7214,-7212]],"properties":{"id":"24661500","dp":8146,"de":4517}},{"type":"Polygon","arcs":[[-7508,-7211,7508,7509,-4136]],"properties":{"id":"24661501","dp":12047,"de":6428}},{"type":"Polygon","arcs":[[7510,7511,-4143,-7510,7512]],"properties":{"id":"24661502","dp":13410,"de":1589}},{"type":"Polygon","arcs":[[7513,-7513,-7509,-7083,7514]],"properties":{"id":"24661503","dp":14649,"de":3184}},{"type":"Polygon","arcs":[[7515,-4149,7516,-7511,-7514,7517]],"properties":{"id":"24661504","dp":15988,"de":8720}},{"type":"Polygon","arcs":[[-7517,-4146,-4139,-7512]],"properties":{"id":"24661505","dp":18595,"de":0}},{"type":"Polygon","arcs":[[7518,7519,-4152,-7516,7520]],"properties":{"id":"24661506","dp":19589,"de":5479}},{"type":"Polygon","arcs":[[7521,-4302,-4299,-7520,7522]],"properties":{"id":"24661507","dp":14609,"de":4687}},{"type":"Polygon","arcs":[[-6956,-4305,-7522,7523]],"properties":{"id":"24661508","dp":12172,"de":1114}},{"type":"Polygon","arcs":[[-6957,-7524,7524,7525,7526]],"properties":{"id":"24661509","dp":12715,"de":5387}},{"type":"Polygon","arcs":[[-7525,-7523,-7519,7527]],"properties":{"id":"24661510","dp":15028,"de":3693}},{"type":"Polygon","arcs":[[7528,-7521,-7518,-7515,-7082,-7080,-7072]],"properties":{"id":"24661513","dp":11255,"de":36595}},{"type":"Polygon","arcs":[[-7065,7529,7530,7531,-7071,-7070]],"properties":{"id":"24661514","dp":11062,"de":6941}},{"type":"Polygon","arcs":[[-7062,-7059,7532,7533,7534,-7530,-7064]],"properties":{"id":"24661515","dp":11259,"de":3827}},{"type":"Polygon","arcs":[[7535,7536,7537,-7533,7538]],"properties":{"id":"24661516","dp":13723,"de":7040}},{"type":"Polygon","arcs":[[-6951,-6950,7539,-7537,7540]],"properties":{"id":"24661517","dp":13107,"de":6265}},{"type":"Polygon","arcs":[[-7534,-7538,-7540,-6949,-6958,-7527,7541]],"properties":{"id":"24661518","dp":10919,"de":11069}},{"type":"Polygon","arcs":[[-5925,-1470,7542,7543]],"properties":{"id":"24661997","dp":11583,"de":1583}},{"type":"Polygon","arcs":[[-7543,-1469,7544,7545]],"properties":{"id":"24661998","dp":14210,"de":0}},{"type":"Polygon","arcs":[[7546,-7545,-1468,-1456,7547,7548]],"properties":{"id":"24661999","dp":13684,"de":1258}},{"type":"Polygon","arcs":[[7549,-7548,-1458,-1451,7550,7551]],"properties":{"id":"24662000","dp":13549,"de":1267}},{"type":"Polygon","arcs":[[7552,-7551,-1455,-388,7553]],"properties":{"id":"24662001","dp":15687,"de":0}},{"type":"Polygon","arcs":[[7554,7555,-7552,-7553,7556,7557]],"properties":{"id":"24662002","dp":16578,"de":2359}},{"type":"Polygon","arcs":[[-7557,-7554,-387,7558]],"properties":{"id":"24662003","dp":13910,"de":0}},{"type":"Polygon","arcs":[[7559,-7558,-7559,-386,-7434]],"properties":{"id":"24662004","dp":13737,"de":2706}},{"type":"Polygon","arcs":[[7560,7561,-7555,-7560,-7432]],"properties":{"id":"24662005","dp":16012,"de":1446}},{"type":"Polygon","arcs":[[-7428,7562,7563,7564,-7561,-7430]],"properties":{"id":"24662006","dp":17889,"de":1623}},{"type":"Polygon","arcs":[[-4458,-7141,-7366,-7348,-7343,-7340,-2860,-2847]],"properties":{"id":"24661620","dp":4479,"de":445}},{"type":"Polygon","arcs":[[-6990,7565,7566,7567,-6966,-6962,-6954,7568,-4727]],"properties":{"id":"24661621","dp":7933,"de":23795}},{"type":"Polygon","arcs":[[-6606,-7342,-7338,-7334,-6991,-6988]],"properties":{"id":"24661532","dp":2209,"de":4562}},{"type":"Polygon","arcs":[[-7333,7569,7570,7571,-6992]],"properties":{"id":"24661533","dp":22113,"de":2303}},{"type":"Polygon","arcs":[[-6993,-7572,7572,7573]],"properties":{"id":"24661534","dp":20646,"de":2985}},{"type":"Polygon","arcs":[[-6974,-7574,7574,7575]],"properties":{"id":"24661535","dp":23657,"de":2777}},{"type":"Polygon","arcs":[[-6975,-7576,7576,7577]],"properties":{"id":"24661536","dp":23127,"de":2132}},{"type":"Polygon","arcs":[[-6976,-7578,7578,7579]],"properties":{"id":"24661537","dp":24251,"de":3140}},{"type":"Polygon","arcs":[[-6969,-7580,7580,7581]],"properties":{"id":"24661538","dp":20189,"de":2606}},{"type":"Polygon","arcs":[[-6970,-7582,7582,7583]],"properties":{"id":"24661539","dp":24692,"de":2192}},{"type":"Polygon","arcs":[[-6965,-7584,7584,-6961]],"properties":{"id":"24661540","dp":25922,"de":0}},{"type":"Polygon","arcs":[[-7585,7585,-3391]],"properties":{"id":"24661541","dp":26096,"de":2673}},{"type":"Polygon","arcs":[[7586,7587,-7586,-7583]],"properties":{"id":"24661542","dp":18052,"de":0}},{"type":"Polygon","arcs":[[-7581,7588,7589,-7587]],"properties":{"id":"24661543","dp":21771,"de":0}},{"type":"Polygon","arcs":[[-7579,7590,7591,-7589]],"properties":{"id":"24661544","dp":21511,"de":2616}},{"type":"Polygon","arcs":[[-7575,7592,7593,-7591,-7577]],"properties":{"id":"24661545","dp":17464,"de":1424}},{"type":"Polygon","arcs":[[-7571,7594,7595,7596,-7593,-7573]],"properties":{"id":"24661546","dp":15792,"de":0}},{"type":"Polygon","arcs":[[-7570,-6794,7597,-7595]],"properties":{"id":"24661547","dp":37974,"de":0}},{"type":"Polygon","arcs":[[-7598,-6793,-6775,-6770,7598,-7596]],"properties":{"id":"24661548","dp":18980,"de":0}},{"type":"Polygon","arcs":[[-7597,-7599,-6766,7599,7600,-7594]],"properties":{"id":"24661549","dp":11074,"de":2399}},{"type":"Polygon","arcs":[[-7601,7601,7602,-7592]],"properties":{"id":"24661550","dp":20568,"de":0}},{"type":"Polygon","arcs":[[-7590,-7603,7603,-3392,-7588]],"properties":{"id":"24661551","dp":13873,"de":2747}},{"type":"Polygon","arcs":[[7604,-7139,-7128,-4205,-3393]],"properties":{"id":"24661554","dp":9649,"de":2192}},{"type":"Polygon","arcs":[[7605,-7135,-7138,-7605,-7604]],"properties":{"id":"24661555","dp":19215,"de":1260}},{"type":"Polygon","arcs":[[-7600,-6769,-6779,-6784,-7134,-7132,-7136,-7606,-7602]],"properties":{"id":"24661556","dp":6867,"de":1040}},{"type":"Polygon","arcs":[[7606,7607,7608]],"properties":{"id":"24662030","dp":21111,"de":2263}},{"type":"Polygon","arcs":[[-7489,7609,-7608,7610]],"properties":{"id":"24662031","dp":15163,"de":3485}},{"type":"Polygon","arcs":[[-7271,-7274,-5758,-5890,-5892,-5900,7611,7612]],"properties":{"id":"24662032","dp":2764,"de":6921}},{"type":"Polygon","arcs":[[-7253,-7264,-7265,-7269]],"properties":{"id":"24662033","dp":14688,"de":2564}},{"type":"Polygon","arcs":[[7613,-7418,7614]],"properties":{"id":"24662034","dp":16629,"de":0}},{"type":"Polygon","arcs":[[7615,7616,-7615,-7425,7617,7618]],"properties":{"id":"24662035","dp":17830,"de":0}},{"type":"Polygon","arcs":[[-7618,-7424,7619,7620]],"properties":{"id":"24662036","dp":11662,"de":0}},{"type":"Polygon","arcs":[[-6250,7621,-7619,-7621,7622,7623]],"properties":{"id":"24662037","dp":13612,"de":1076}},{"type":"Polygon","arcs":[[7624,-7623,-7620,-7423,7625,7626]],"properties":{"id":"24662038","dp":12873,"de":0}},{"type":"Polygon","arcs":[[-7626,-7422,-7415,7627]],"properties":{"id":"24662039","dp":8935,"de":0}},{"type":"Polygon","arcs":[[-7627,-7628,-7386,7628,7629]],"properties":{"id":"24662040","dp":14587,"de":899}},{"type":"Polygon","arcs":[[7630,-7629,-7385,7631,7632]],"properties":{"id":"24662041","dp":12411,"de":1996}},{"type":"Polygon","arcs":[[-7632,-7384,-7380,-383,7633,7634]],"properties":{"id":"24662042","dp":8479,"de":1305}},{"type":"Polygon","arcs":[[7635,-7634,-7376,7636]],"properties":{"id":"24662043","dp":11617,"de":0}},{"type":"Polygon","arcs":[[-7492,7637,7638,-7255,-7494]],"properties":{"id":"24661822","dp":11670,"de":1354}},{"type":"Polygon","arcs":[[-7491,7639,-7638]],"properties":{"id":"24661823","dp":18630,"de":1712}},{"type":"Polygon","arcs":[[-5832,7640,-7045,-7256,-7639,-7640]],"properties":{"id":"24661824","dp":16313,"de":2120}},{"type":"Polygon","arcs":[[-7043,-7641,-5831]],"properties":{"id":"24661825","dp":16491,"de":3333}},{"type":"Polygon","arcs":[[-6594,-6592,-6585,7641,7642,7643]],"properties":{"id":"24662271","dp":3162,"de":370}},{"type":"Polygon","arcs":[[-6595,-7644,7644,-5395]],"properties":{"id":"24662272","dp":4295,"de":939}},{"type":"Polygon","arcs":[[7645,-7409,-5396,-7645,-7643,7646]],"properties":{"id":"24662273","dp":2869,"de":0}},{"type":"Polygon","arcs":[[7647,7648,-7647,-7642,-6584]],"properties":{"id":"24662274","dp":3347,"de":277}},{"type":"Polygon","arcs":[[-3072,7649,7650,-7648,-6583]],"properties":{"id":"24662275","dp":2304,"de":0}},{"type":"Polygon","arcs":[[7651,7652,-3712,-1269]],"properties":{"id":"24661940","dp":17157,"de":11710}},{"type":"Polygon","arcs":[[7653,7654,7655,-7653]],"properties":{"id":"24661941","dp":19380,"de":3925}},{"type":"Polygon","arcs":[[7656,7657,-1287,-5796,7658,7659,-7654]],"properties":{"id":"24661942","dp":2428,"de":18450}},{"type":"Polygon","arcs":[[7660,-7657,-7652,-1274]],"properties":{"id":"24661943","dp":16448,"de":13620}},{"type":"Polygon","arcs":[[-1280,-1283,-1288,-7658,-7661,-1273]],"properties":{"id":"24661944","dp":13028,"de":35981}},{"type":"Polygon","arcs":[[-7660,7661,7662,-7655]],"properties":{"id":"24661945","dp":16238,"de":4867}},{"type":"Polygon","arcs":[[-3713,-7656,-7663,7663,7664,7665]],"properties":{"id":"24661946","dp":10887,"de":15614}},{"type":"Polygon","arcs":[[-7665,7666,7667,7668,7669]],"properties":{"id":"24661947","dp":18826,"de":2826}},{"type":"Polygon","arcs":[[-7666,-7670,7670,7671,-3709]],"properties":{"id":"24661948","dp":14350,"de":6638}},{"type":"Polygon","arcs":[[-7671,-7669,7672,7673]],"properties":{"id":"24661949","dp":16658,"de":3367}},{"type":"Polygon","arcs":[[-7672,-7674,7674,-3696,-5135,-5137]],"properties":{"id":"24661950","dp":10156,"de":7702}},{"type":"Polygon","arcs":[[7675,-5498,-5506,-3689,-3700,-3697]],"properties":{"id":"24661953","dp":12183,"de":10204}},{"type":"Polygon","arcs":[[7676,7677,7678,-7676,-7675,-7673]],"properties":{"id":"24661954","dp":16651,"de":7683}},{"type":"Polygon","arcs":[[7679,7680,-7677,-7668]],"properties":{"id":"24661955","dp":18132,"de":2918}},{"type":"Polygon","arcs":[[7681,7682,7683,-7678,-7681]],"properties":{"id":"24661956","dp":9977,"de":3611}},{"type":"Polygon","arcs":[[7684,7685,7686,-7682,7687]],"properties":{"id":"24661957","dp":13908,"de":5456}},{"type":"Polygon","arcs":[[7688,-7688,-7680,-7667,-7664]],"properties":{"id":"24661958","dp":18788,"de":10695}},{"type":"Polygon","arcs":[[7689,7690,7691,-7689,-7662]],"properties":{"id":"24661959","dp":13929,"de":9824}},{"type":"Polygon","arcs":[[7692,7693,-7691]],"properties":{"id":"24661960","dp":16458,"de":4249}},{"type":"Polygon","arcs":[[-7690,-7659,-5795,-6693,-6698,-6700,7694,-7693]],"properties":{"id":"24661961","dp":3152,"de":1246}},{"type":"Polygon","arcs":[[-7692,-7694,-7695,-6702,7695,-7685]],"properties":{"id":"24661962","dp":8834,"de":37730}},{"type":"Polygon","arcs":[[-7696,-6703,-6710,7696,-7686]],"properties":{"id":"24661963","dp":18341,"de":4899}},{"type":"Polygon","arcs":[[7697,-7496,-7501,-7359]],"properties":{"id":"24661599","dp":4056,"de":0}},{"type":"Polygon","arcs":[[-7367,-940,-7497,-7698,-7358,-7363]],"properties":{"id":"24661600","dp":3124,"de":766}},{"type":"Polygon","arcs":[[-3550,-942,-4410,-7125,7698,-7123,-5565]],"properties":{"id":"24661601","dp":2188,"de":2150}},{"type":"Polygon","arcs":[[-7124,-7699]],"properties":{"id":"24661602","dp":4102,"de":0}},{"type":"Polygon","arcs":[[-7204,-1500,7699]],"properties":{"id":"24662098","dp":14023,"de":0}},{"type":"Polygon","arcs":[[-1499,-7266,-7262,7700,-7201,-7700]],"properties":{"id":"24662099","dp":10173,"de":1906}},{"type":"Polygon","arcs":[[-7260,-7202,-7701,-7261]],"properties":{"id":"24662100","dp":13190,"de":4605}},{"type":"Polygon","arcs":[[-7259,7701,-7194,-7196,-7199]],"properties":{"id":"24662101","dp":6017,"de":1857}},{"type":"Polygon","arcs":[[7702,-7192,-7702,-7258]],"properties":{"id":"24662102","dp":10739,"de":4225}},{"type":"Polygon","arcs":[[7703,7704,-333,7705]],"properties":{"id":"24662103","dp":6944,"de":1889}},{"type":"Polygon","arcs":[[7706,-3821,-3814,-7705]],"properties":{"id":"24662104","dp":8165,"de":2206}},{"type":"Polygon","arcs":[[-3495,7707,-3822,-7707,7708]],"properties":{"id":"24662105","dp":9480,"de":3003}},{"type":"Polygon","arcs":[[-3494,-3825,-3818,-7708]],"properties":{"id":"24662106","dp":9200,"de":0}},{"type":"Polygon","arcs":[[7709,-2264,-2257,-7007]],"properties":{"id":"24662108","dp":15333,"de":1770}},{"type":"Polygon","arcs":[[7710,-2274,-7710,-6834]],"properties":{"id":"24662109","dp":18228,"de":1351}},{"type":"Polygon","arcs":[[7711,-2275,-7711,7712]],"properties":{"id":"24662110","dp":15255,"de":0}},{"type":"Polygon","arcs":[[-5018,-5017,7713,-6554,-6549,-6545]],"properties":{"id":"24662111","dp":11775,"de":13054}},{"type":"Polygon","arcs":[[-5010,7714,-6555,-7714,-5016]],"properties":{"id":"24662112","dp":17245,"de":4918}},{"type":"Polygon","arcs":[[-6551,-7715,-5009,-5004,-4876,-4875,-4872,-6556]],"properties":{"id":"24662113","dp":3453,"de":442}},{"type":"Polygon","arcs":[[7715,-3523,7716,-1931]],"properties":{"id":"24662958","dp":3548,"de":461}},{"type":"Polygon","arcs":[[-1594,-1598,-1602,-3521,-7716,-1930]],"properties":{"id":"24662961","dp":7521,"de":1569}},{"type":"Polygon","arcs":[[-6653,7717,7718,7719,7720,-6655]],"properties":{"id":"24662962","dp":10448,"de":0}},{"type":"Polygon","arcs":[[-6656,-7721,7721,7722,-6667,-6662]],"properties":{"id":"24662963","dp":13293,"de":0}},{"type":"Polygon","arcs":[[-7295,7723,-6641,-6651,7724,-6665,-6685,-6687,-6691,7725,-1625,-7297]],"properties":{"id":"24662964","dp":941,"de":3834}},{"type":"Polygon","arcs":[[-6650,-6661,-6666,-7725]],"properties":{"id":"24662965","dp":13662,"de":4714}},{"type":"Polygon","arcs":[[-7294,-7724]],"properties":{"id":"24662966","dp":29845,"de":0}},{"type":"Polygon","arcs":[[-7566,-6981,-6967,7726]],"properties":{"id":"24661622","dp":19846,"de":2307}},{"type":"Polygon","arcs":[[-7567,-7727,-6971,7727]],"properties":{"id":"24661623","dp":23600,"de":2444}},{"type":"Polygon","arcs":[[-7728,-6963,-7568]],"properties":{"id":"24661624","dp":17574,"de":5106}},{"type":"Polygon","arcs":[[-4738,-4728,-7569,-6953,7728,-4750]],"properties":{"id":"24661625","dp":2091,"de":6686}},{"type":"Polygon","arcs":[[-4763,-7729,-6952,-7541,-7536,7729,7730]],"properties":{"id":"24661626","dp":6212,"de":10221}},{"type":"Polygon","arcs":[[-7730,-7539,-7061,7731]],"properties":{"id":"24661627","dp":17538,"de":5135}},{"type":"Polygon","arcs":[[-5115,-4764,-7731,-7732,-7057,-7056,7732,7733]],"properties":{"id":"24661628","dp":2730,"de":12672}},{"type":"Polygon","arcs":[[-7734,7734,7735,-5116]],"properties":{"id":"24661629","dp":10100,"de":8193}},{"type":"Polygon","arcs":[[-7246,-6906,-2293,7736]],"properties":{"id":"24661630","dp":6753,"de":2217}},{"type":"Polygon","arcs":[[7737,7738,-7737,7739,7740]],"properties":{"id":"24661631","dp":7161,"de":2380}},{"type":"Polygon","arcs":[[7741,-7247,-7739,7742,7743,7744]],"properties":{"id":"24661632","dp":11209,"de":756}},{"type":"Polygon","arcs":[[7745,-7242,-7248,-7742,7746]],"properties":{"id":"24661633","dp":11463,"de":958}},{"type":"Polygon","arcs":[[-7209,7747,-7241,-7746]],"properties":{"id":"24661634","dp":11827,"de":1724}},{"type":"Polygon","arcs":[[-7208,-7150,-7238,-7239,-7748]],"properties":{"id":"24661635","dp":12547,"de":2857}},{"type":"Polygon","arcs":[[7748,7749,-2903]],"properties":{"id":"24662131","dp":17239,"de":0}},{"type":"Polygon","arcs":[[7750,7751,-7749,-2902]],"properties":{"id":"24662132","dp":16117,"de":3324}},{"type":"Polygon","arcs":[[-7751,-2901,7752,7753,7754]],"properties":{"id":"24662133","dp":7219,"de":8005}},{"type":"Polygon","arcs":[[-7754,7755,7756,-2565,-2571,7757]],"properties":{"id":"24662134","dp":6560,"de":1864}},{"type":"Polygon","arcs":[[7758,-3540,7759,7760,-7756]],"properties":{"id":"24662135","dp":7688,"de":15667}},{"type":"Polygon","arcs":[[-2910,-2915,-7759,-7753]],"properties":{"id":"24662136","dp":21841,"de":2966}},{"type":"Polygon","arcs":[[-7761,7761,-6121,-2562,-7757]],"properties":{"id":"24662137","dp":10441,"de":8201}},{"type":"Polygon","arcs":[[-3539,7762,7763,-6125,-6122,-7762,-7760]],"properties":{"id":"24662138","dp":3353,"de":13807}},{"type":"Polygon","arcs":[[-5805,-5803,-2727,7764,-6126]],"properties":{"id":"24662140","dp":32804,"de":28048}},{"type":"Polygon","arcs":[[-6127,-7765,-2730]],"properties":{"id":"24662141","dp":31500,"de":2500}},{"type":"Polygon","arcs":[[7765,7766,-5207,-7764]],"properties":{"id":"24662142","dp":26520,"de":40878}},{"type":"Polygon","arcs":[[-4563,-2709,-2718,-5208,-7767,7767]],"properties":{"id":"24662143","dp":3505,"de":12207}},{"type":"Polygon","arcs":[[-3545,-4564,-7768,-7766,-7763,-3538]],"properties":{"id":"24662144","dp":13223,"de":28371}},{"type":"Polygon","arcs":[[-7210,-7747,7768,-5772,-5764]],"properties":{"id":"24661660","dp":10017,"de":1475}},{"type":"Polygon","arcs":[[-7769,-7745,7769,-5773]],"properties":{"id":"24661661","dp":14436,"de":0}},{"type":"Polygon","arcs":[[-7770,-7744,7770,-5775]],"properties":{"id":"24661662","dp":11105,"de":1442}},{"type":"Polygon","arcs":[[-1476,-5776,-7771,-7743,-7738,7771,-1472]],"properties":{"id":"24661663","dp":4123,"de":1231}},{"type":"Polygon","arcs":[[-7772,-7741,7772,7773,-1473]],"properties":{"id":"24661664","dp":8072,"de":2409}},{"type":"Polygon","arcs":[[-7774,7774,7775,-1462,-1474]],"properties":{"id":"24661665","dp":11469,"de":0}},{"type":"Polygon","arcs":[[-7776,7776,7777,7778,-1463]],"properties":{"id":"24661666","dp":8374,"de":643}},{"type":"Polygon","arcs":[[7779,-2288,7780,-7777]],"properties":{"id":"24661667","dp":7920,"de":1804}},{"type":"Polygon","arcs":[[-7773,-7740,-2292,-7780,-7775]],"properties":{"id":"24661668","dp":10695,"de":2139}},{"type":"Polygon","arcs":[[-7778,-7781,-2287,-2281,-2271,-7712,7781]],"properties":{"id":"24661669","dp":3545,"de":1232}},{"type":"Polygon","arcs":[[-7779,-7782,7782,-1464]],"properties":{"id":"24661670","dp":6715,"de":1863}},{"type":"Polygon","arcs":[[-7783,-7713,-6833,-1465]],"properties":{"id":"24661671","dp":15000,"de":1724}},{"type":"Polygon","arcs":[[-6010,-2310,7783,7784,7785,7786,7787,7788]],"properties":{"id":"24662162","dp":1682,"de":24676}},{"type":"Polygon","arcs":[[-6007,-7789,7789,7790,-2890,7791]],"properties":{"id":"24662163","dp":6950,"de":2593}},{"type":"Polygon","arcs":[[-2889,7792,-2874,-6008,-7792]],"properties":{"id":"24662164","dp":3200,"de":3169}},{"type":"Polygon","arcs":[[-7793,-2888,-2883,-2875]],"properties":{"id":"24662165","dp":13571,"de":0}},{"type":"Polygon","arcs":[[-3473,-2891,-7791,-3533,-2913,7793]],"properties":{"id":"24662167","dp":4663,"de":6351}},{"type":"Polygon","arcs":[[-2906,-7794]],"properties":{"id":"24662168","dp":23446,"de":0}},{"type":"Polygon","arcs":[[7794,-2528,7795]],"properties":{"id":"24662169","dp":10740,"de":0}},{"type":"Polygon","arcs":[[7796,7797,7798,7799,-7796,-2527,7800]],"properties":{"id":"24662170","dp":5975,"de":0}},{"type":"Polygon","arcs":[[7801,7802,-7799]],"properties":{"id":"24662171","dp":6305,"de":0}},{"type":"Polygon","arcs":[[-2529,-7795,-7800,7803]],"properties":{"id":"24662172","dp":8530,"de":884}},{"type":"Polygon","arcs":[[-7803,7804,-715,-706,-697,-3105,-7804]],"properties":{"id":"24662173","dp":3917,"de":770}},{"type":"Polygon","arcs":[[-2680,-2491,7805,7806,7807,-710,-7805,7808,-7797,7809]],"properties":{"id":"24662174","dp":2149,"de":185}},{"type":"Polygon","arcs":[[-7802,-7798,-7809]],"properties":{"id":"24662175","dp":10682,"de":741}},{"type":"Polygon","arcs":[[-7687,-7697,-6709,7810,-7683]],"properties":{"id":"24661964","dp":18611,"de":3213}},{"type":"Polygon","arcs":[[-7679,-7684,-7811,-6708,-5489,-5496]],"properties":{"id":"24661965","dp":12250,"de":13588}},{"type":"Polygon","arcs":[[-6344,-5686,7811]],"properties":{"id":"24662342","dp":4292,"de":0}},{"type":"Polygon","arcs":[[-3062,-6321,-6342,-7812,-5683,7812]],"properties":{"id":"24662343","dp":3632,"de":317}},{"type":"Polygon","arcs":[[-3057,-3063,-7813,-5682,7813]],"properties":{"id":"24662344","dp":3089,"de":0}},{"type":"Polygon","arcs":[[7814,7815,-5465,-3058,-7814,-5681,7816]],"properties":{"id":"24662345","dp":3383,"de":0}},{"type":"MultiPolygon","arcs":[[[7817,7818,7819,-6025,-6028,-6013,7820,7821]],[[7822,7823,-4282,7824]],[[7825,-4277,7826]]],"properties":{"id":"24663390","dp":694,"de":1243}},{"type":"Polygon","arcs":[[7827,7828,7829,-7819]],"properties":{"id":"24663391","dp":8240,"de":2423}},{"type":"Polygon","arcs":[[7830,-7828,7831,7832]],"properties":{"id":"24663392","dp":6712,"de":1909}},{"type":"Polygon","arcs":[[-7831,7833,-1778,7834,-7829]],"properties":{"id":"24663393","dp":8991,"de":2242}},{"type":"MultiPolygon","arcs":[[[-7833,7835,7836,-1772,7837,-1779,-7834]],[[-1781,7838,7839,7840]],[[-1786,7841,7842,7843]],[[-1783,7844,7845,7846]]],"properties":{"id":"24663394","dp":2124,"de":3179}},{"type":"MultiPolygon","arcs":[[[-7827,-4276,-2465,7847,-7840,7848]],[[7849,-7836,-7832,-7818]],[[7850,-7843,7851,-7823]],[[7852]],[[-7846,7853]]],"properties":{"id":"24663395","dp":3547,"de":470}},{"type":"Polygon","arcs":[[7854]],"properties":{"id":"24663396","dp":26,"de":0}},{"type":"Polygon","arcs":[[7855,7856,7857,7858,7859,-7419,-7614]],"properties":{"id":"24663397","dp":15008,"de":900}},{"type":"Polygon","arcs":[[7860,7861,7862,-7857]],"properties":{"id":"24663398","dp":10852,"de":0}},{"type":"Polygon","arcs":[[-7861,-7856,-7617,7863]],"properties":{"id":"24663399","dp":9401,"de":664}},{"type":"Polygon","arcs":[[7864,-7864,-7616,-7622,-6249]],"properties":{"id":"24663400","dp":12946,"de":4872}},{"type":"Polygon","arcs":[[7865,7866,7867,-7862,-7865,-6253]],"properties":{"id":"24663401","dp":2525,"de":7200}},{"type":"Polygon","arcs":[[7868,-1130,-1138,7869]],"properties":{"id":"24663402","dp":10158,"de":0}},{"type":"Polygon","arcs":[[-1749,-1757,-1767,-3983,-3844,-3840,-3836,-3834]],"properties":{"id":"24661703","dp":7376,"de":1388}},{"type":"Polygon","arcs":[[7870,-2230,-2227,-2221,-1737,-1539]],"properties":{"id":"24661704","dp":12107,"de":1789}},{"type":"Polygon","arcs":[[-7021,-7019,-2243,-2235,-2231,-7871,-1538]],"properties":{"id":"24661705","dp":4225,"de":15312}},{"type":"Polygon","arcs":[[7871,-7377,-396,-1447,-7031,-3490]],"properties":{"id":"24661708","dp":4721,"de":1518}},{"type":"Polygon","arcs":[[7872,7873,-7368,-7872,-3496,7874,7875]],"properties":{"id":"24661709","dp":2164,"de":5433}},{"type":"Polygon","arcs":[[-7709,-7704,7876,-7875]],"properties":{"id":"24661710","dp":8519,"de":3107}},{"type":"Polygon","arcs":[[7877,-7876,-7877,7878,7879,7880]],"properties":{"id":"24661711","dp":8349,"de":1225}},{"type":"Polygon","arcs":[[-7879,-7706,-332,7881]],"properties":{"id":"24661712","dp":8303,"de":0}},{"type":"Polygon","arcs":[[7882,-7880,-7882,-331,7883]],"properties":{"id":"24661713","dp":9049,"de":1311}},{"type":"Polygon","arcs":[[7884,-7884,7885,-3957]],"properties":{"id":"24661714","dp":11540,"de":0}},{"type":"Polygon","arcs":[[-3958,-7886,-330,-3808,-3800,-3799,-3960]],"properties":{"id":"24661715","dp":4304,"de":1828}},{"type":"Polygon","arcs":[[7886,-7881,-7883,-7885,7887]],"properties":{"id":"24661716","dp":9462,"de":833}},{"type":"Polygon","arcs":[[7888,-7888,-3956]],"properties":{"id":"24661717","dp":10787,"de":0}},{"type":"Polygon","arcs":[[7889,7890,-7874,7891,-7889,-3955]],"properties":{"id":"24661718","dp":1532,"de":1834}},{"type":"Polygon","arcs":[[-7873,-7878,-7887,-7892]],"properties":{"id":"24661719","dp":4314,"de":2983}},{"type":"Polygon","arcs":[[-3481,7892,-3479,-5317,-5320,-365,-7890,-3954,-3483,7893]],"properties":{"id":"24661720","dp":699,"de":878}},{"type":"Polygon","arcs":[[-3482,-7894]],"properties":{"id":"24661721","dp":12230,"de":0}},{"type":"MultiPolygon","arcs":[[[7894,-4685,7895,7896,-7327]],[[7897]]],"properties":{"id":"24662985","dp":777,"de":413}},{"type":"Polygon","arcs":[[-5977,7898,-7895,-7326]],"properties":{"id":"24662986","dp":1242,"de":153}},{"type":"Polygon","arcs":[[-3450,-4686,-7899,-5976]],"properties":{"id":"24662987","dp":974,"de":291}},{"type":"Polygon","arcs":[[-7869,7899,7900,-1121]],"properties":{"id":"24663403","dp":5476,"de":0}},{"type":"Polygon","arcs":[[-1135,7901,-7900,-7870,-1137,-3740]],"properties":{"id":"24663404","dp":7196,"de":0}},{"type":"Polygon","arcs":[[-7902,-1134,-1122,-7901]],"properties":{"id":"24663405","dp":6421,"de":0}},{"type":"Polygon","arcs":[[-5879,-5168,-7401,-5173,-7395,-5147,-4960,-5950,-5948,-4968,-4972]],"properties":{"id":"24663406","dp":686,"de":73}},{"type":"Polygon","arcs":[[7902,-7528,-7529,-7532]],"properties":{"id":"24663450","dp":14109,"de":2729}},{"type":"Polygon","arcs":[[-7531,-7535,-7542,-7526,-7903]],"properties":{"id":"24663451","dp":6708,"de":12304}},{"type":"Polygon","arcs":[[-6139,7903,-2963,-1308,-1249,-6135,-6137]],"properties":{"id":"24663452","dp":5953,"de":25994}},{"type":"Polygon","arcs":[[-4586,-2964,-7904,-6138,-2966]],"properties":{"id":"24663453","dp":12181,"de":2674}},{"type":"Polygon","arcs":[[7904,7905,7906,-7563,-7427]],"properties":{"id":"24662007","dp":19251,"de":0}},{"type":"Polygon","arcs":[[7907,-7546,-7547,7908,-7564,-7907]],"properties":{"id":"24662008","dp":8516,"de":1180}},{"type":"Polygon","arcs":[[-7565,-7909,-7549,-7550,-7556,-7562]],"properties":{"id":"24662009","dp":13447,"de":3561}},{"type":"Polygon","arcs":[[7909,-7544,-7908,7910]],"properties":{"id":"24662010","dp":15041,"de":2054}},{"type":"Polygon","arcs":[[7911,-5920,-5923,-5926,-7910,7912]],"properties":{"id":"24662011","dp":13357,"de":2828}},{"type":"Polygon","arcs":[[7913,-7913,-7911,-7906,7914]],"properties":{"id":"24662012","dp":12888,"de":3486}},{"type":"Polygon","arcs":[[7915,-5921,-7912,-7914,7916]],"properties":{"id":"24662013","dp":15308,"de":3089}},{"type":"Polygon","arcs":[[-7860,7917,-7917,-7915,-7905,-7426,-7420]],"properties":{"id":"24662014","dp":5970,"de":1146}},{"type":"Polygon","arcs":[[7918,7919,-5918,-7916,-7918,-7859]],"properties":{"id":"24662015","dp":7562,"de":3541}},{"type":"Polygon","arcs":[[7920,-5914,-5915,-7920]],"properties":{"id":"24662016","dp":15907,"de":4336}},{"type":"Polygon","arcs":[[7921,-5912,-7921,7922]],"properties":{"id":"24662017","dp":20319,"de":6914}},{"type":"Polygon","arcs":[[7923,-7633,-7635,-7636,7924,7925]],"properties":{"id":"24662044","dp":14034,"de":1136}},{"type":"Polygon","arcs":[[7926,-7925,-7637,7927,-6226]],"properties":{"id":"24662045","dp":13248,"de":2760}},{"type":"Polygon","arcs":[[7928,-7926,-7927,-6225,-6228]],"properties":{"id":"24662046","dp":17621,"de":1732}},{"type":"Polygon","arcs":[[7929,7930,-7924,-7929,-6230]],"properties":{"id":"24662047","dp":3978,"de":8507}},{"type":"Polygon","arcs":[[-6233,7931,7932,-7930]],"properties":{"id":"24662048","dp":15337,"de":1993}},{"type":"Polygon","arcs":[[-6235,-6241,7933,-7932,-6232]],"properties":{"id":"24662049","dp":14679,"de":1388}},{"type":"Polygon","arcs":[[7934,-7410,-7646,-7649,-7651]],"properties":{"id":"24662276","dp":2954,"de":0}},{"type":"Polygon","arcs":[[7935,7936,-7406,-7408,-7935,-7650,-3071]],"properties":{"id":"24662277","dp":2330,"de":1011}},{"type":"Polygon","arcs":[[7937,7938,-5449,-7407,-7937]],"properties":{"id":"24662278","dp":6876,"de":720}},{"type":"Polygon","arcs":[[-7936,-3070,7939,7940,-7938]],"properties":{"id":"24662279","dp":13111,"de":0}},{"type":"Polygon","arcs":[[7941,7942,-5450,-7939,-7941,7943]],"properties":{"id":"24662280","dp":2508,"de":224}},{"type":"Polygon","arcs":[[7944,-7944,-7940,-3069,7945]],"properties":{"id":"24662281","dp":1717,"de":148}},{"type":"Polygon","arcs":[[-3068,-5353,7946,7947,-7946]],"properties":{"id":"24662282","dp":4097,"de":0}},{"type":"Polygon","arcs":[[-7948,7948,-7942,-7945]],"properties":{"id":"24662283","dp":3343,"de":0}},{"type":"Polygon","arcs":[[-7943,-7949,-7947,-5352,-6160,-6167,7949,7950,-7403,-5452,-5443,-5446]],"properties":{"id":"24662284","dp":901,"de":2187}},{"type":"Polygon","arcs":[[7951,7952,7953,7954,-7951]],"properties":{"id":"24662285","dp":3759,"de":1181}},{"type":"Polygon","arcs":[[-7953,7955,7956,7957]],"properties":{"id":"24662286","dp":2763,"de":0}},{"type":"Polygon","arcs":[[-7958,7958,7959,-7954]],"properties":{"id":"24662287","dp":3685,"de":332}},{"type":"Polygon","arcs":[[7960,7961,-7959,-7957]],"properties":{"id":"24662288","dp":2965,"de":0}},{"type":"Polygon","arcs":[[-7955,-7960,-7962,7962,-5740,-5460,-5454,-7404]],"properties":{"id":"24662289","dp":856,"de":1771}},{"type":"Polygon","arcs":[[-1313,-1281,-1277,-1271,-1086,7963]],"properties":{"id":"24662114","dp":3221,"de":18847}},{"type":"Polygon","arcs":[[7964,-5911,-7922,7965]],"properties":{"id":"24662018","dp":21736,"de":6052}},{"type":"Polygon","arcs":[[7966,-5909,-7965,7967]],"properties":{"id":"24662019","dp":21354,"de":2343}},{"type":"Polygon","arcs":[[7968,-5907,-7967,7969,7970]],"properties":{"id":"24662020","dp":15658,"de":3202}},{"type":"Polygon","arcs":[[-7970,-7968,-7966,-7923,-7919,7971]],"properties":{"id":"24662021","dp":15519,"de":0}},{"type":"Polygon","arcs":[[7972,-7971,-7972,-7858,-7863,-7868]],"properties":{"id":"24662022","dp":14750,"de":0}},{"type":"Polygon","arcs":[[-7973,-7867,7973,7974,-7612,-5902,7975,-5906,-7969]],"properties":{"id":"24662024","dp":6894,"de":1088}},{"type":"Polygon","arcs":[[-5904,-7976]],"properties":{"id":"24662025","dp":28600,"de":4938}},{"type":"Polygon","arcs":[[-7445,-7449,-7470,-7974,-7866,-6252,-6258,-6274,-6275]],"properties":{"id":"24662026","dp":2804,"de":5234}},{"type":"Polygon","arcs":[[-7975,-7469,7976,7977,-7609,-7610,-7495,-7272,-7613]],"properties":{"id":"24662027","dp":3320,"de":6302}},{"type":"Polygon","arcs":[[-7480,7978,-7977,-7468,-7472,-7474,-7476]],"properties":{"id":"24662028","dp":13774,"de":2903}},{"type":"Polygon","arcs":[[-7490,-7611,-7607,-7978,-7979,-7479]],"properties":{"id":"24662029","dp":17312,"de":5000}},{"type":"Polygon","arcs":[[7979,7980,7981,7982,-5599,-5598,-5593]],"properties":{"id":"24662384","dp":1848,"de":652}},{"type":"Polygon","arcs":[[7983,7984,7985,7986,-7981,7987]],"properties":{"id":"24662385","dp":3341,"de":499}},{"type":"Polygon","arcs":[[7988,-7988,-7980,-5592,7989,7990]],"properties":{"id":"24662386","dp":4512,"de":406}},{"type":"Polygon","arcs":[[7991,7992,7993,-7990,-5596,-5590]],"properties":{"id":"24662387","dp":11225,"de":1092}},{"type":"Polygon","arcs":[[7994,-5943,7995,7996,-7993,7997]],"properties":{"id":"24662388","dp":3059,"de":0}},{"type":"Polygon","arcs":[[-5589,-5585,-5580,7998,7999,-7998,-7992]],"properties":{"id":"24662389","dp":2794,"de":1017}},{"type":"Polygon","arcs":[[8000,8001,-825,-4570,-4567,-4557,-3535]],"properties":{"id":"24662145","dp":2786,"de":2629}},{"type":"Polygon","arcs":[[8002,-8001,8003]],"properties":{"id":"24662147","dp":15989,"de":6951}},{"type":"Polygon","arcs":[[-7790,-7788,8004,8005,-8004,-3534]],"properties":{"id":"24662148","dp":5279,"de":5182}},{"type":"Polygon","arcs":[[8006,-835,-829,8007,-8006]],"properties":{"id":"24662149","dp":9821,"de":10425}},{"type":"Polygon","arcs":[[-8008,-832,-828,-8002,-8003]],"properties":{"id":"24662150","dp":7965,"de":2836}},{"type":"Polygon","arcs":[[-838,-8007,8008]],"properties":{"id":"24662151","dp":14970,"de":22058}},{"type":"Polygon","arcs":[[-7787,8009,-841,-3597,-836,-8009,-8005]],"properties":{"id":"24662152","dp":7012,"de":9674}},{"type":"Polygon","arcs":[[8010,-845,-842,-8010,-7786]],"properties":{"id":"24662153","dp":11924,"de":2405}},{"type":"Polygon","arcs":[[-6251,-7624,8011,-7934]],"properties":{"id":"24662050","dp":12577,"de":2333}},{"type":"Polygon","arcs":[[-8012,-7625,-7630,-7631,-7931,-7933]],"properties":{"id":"24662051","dp":8170,"de":24634}},{"type":"Polygon","arcs":[[-6221,-7928,-7375,8012]],"properties":{"id":"24662052","dp":12256,"de":2850}},{"type":"Polygon","arcs":[[-6222,-8013,-7374,8013]],"properties":{"id":"24662053","dp":16512,"de":1226}},{"type":"Polygon","arcs":[[8014,-8014,-7373,8015]],"properties":{"id":"24662054","dp":8411,"de":9371}},{"type":"Polygon","arcs":[[-8016,-7372,8016,8017]],"properties":{"id":"24662055","dp":18455,"de":2205}},{"type":"Polygon","arcs":[[-8017,-7371,8018,8019]],"properties":{"id":"24662056","dp":17165,"de":2330}},{"type":"Polygon","arcs":[[-8019,-7370,8020]],"properties":{"id":"24662057","dp":11772,"de":0}},{"type":"Polygon","arcs":[[8021,-8020,-8021,-7369,-7891,-364,-382]],"properties":{"id":"24662058","dp":3397,"de":3757}},{"type":"Polygon","arcs":[[-6045,-6048,8022,8023,-379]],"properties":{"id":"24662064","dp":14070,"de":2922}},{"type":"Polygon","arcs":[[-6058,-6219,8024,-8023,-6047,-6049,-6053]],"properties":{"id":"24662065","dp":5720,"de":3625}},{"type":"Polygon","arcs":[[-380,-8024,-8025,-6218,-6223,-8015,-8018,-8022]],"properties":{"id":"24662066","dp":5004,"de":3910}},{"type":"Polygon","arcs":[[-3504,8025,-5402,-5410,-5413,8026,8027,8028]],"properties":{"id":"24662405","dp":4160,"de":2203}},{"type":"Polygon","arcs":[[8029,-3506,8030,8031]],"properties":{"id":"24662408","dp":3040,"de":582}},{"type":"Polygon","arcs":[[-8031,-3505,-8029,8032,8033,8034,8035]],"properties":{"id":"24662409","dp":2358,"de":420}},{"type":"Polygon","arcs":[[-8035,8036,8037]],"properties":{"id":"24662410","dp":3768,"de":0}},{"type":"Polygon","arcs":[[-8037,-8034,8038,8039,8040]],"properties":{"id":"24662411","dp":9136,"de":0}},{"type":"Polygon","arcs":[[-5281,8041,8042,8043,-8040]],"properties":{"id":"24662412","dp":11314,"de":0}},{"type":"Polygon","arcs":[[8044,-8042,-5280,-5276,-5270]],"properties":{"id":"24662413","dp":6083,"de":0}},{"type":"Polygon","arcs":[[8045,8046,-8043,-8045,-5275]],"properties":{"id":"24662414","dp":10353,"de":0}},{"type":"Polygon","arcs":[[8047,-8044,-8047,8048]],"properties":{"id":"24662415","dp":9958,"de":0}},{"type":"Polygon","arcs":[[8049,-8049,-8046,-5274,-5268,-5160,8050]],"properties":{"id":"24662416","dp":8268,"de":0}},{"type":"Polygon","arcs":[[-2700,-2698,-2696,-2694,-2689,-2683,8051,-2707]],"properties":{"id":"24662176","dp":3281,"de":2157}},{"type":"Polygon","arcs":[[8052,-711,-7808]],"properties":{"id":"24662177","dp":10225,"de":0}},{"type":"Polygon","arcs":[[-7807,8053,-4591,8054,-721,-712,-8053]],"properties":{"id":"24662178","dp":10562,"de":672}},{"type":"Polygon","arcs":[[-8055,-4590,-4471,-4468,-726,-722]],"properties":{"id":"24662179","dp":8499,"de":1661}},{"type":"Polygon","arcs":[[-4326,-4600,-4592,-8054,-7806]],"properties":{"id":"24662180","dp":11991,"de":0}},{"type":"Polygon","arcs":[[-7961,-7956,-7952,-7950,-6170,-5741,-7963]],"properties":{"id":"24662290","dp":3018,"de":2519}},{"type":"Polygon","arcs":[[-4701,-4697,8055,-4939,-4938,-4936,-4928,-7301,-4911]],"properties":{"id":"24662642","dp":1972,"de":531}},{"type":"Polygon","arcs":[[-6423,8056,8057,-7317,-8056]],"properties":{"id":"24662643","dp":9678,"de":2506}},{"type":"Polygon","arcs":[[8058,8059,8060,8061,-8057]],"properties":{"id":"24662644","dp":7315,"de":1908}},{"type":"Polygon","arcs":[[-8058,-8062,8062,8063,-7318]],"properties":{"id":"24662645","dp":8890,"de":1239}},{"type":"Polygon","arcs":[[8064,8065,8066,-8063,-8061]],"properties":{"id":"24662646","dp":9131,"de":1595}},{"type":"Polygon","arcs":[[-8067,8067,8068,-7314,-8064]],"properties":{"id":"24662647","dp":5640,"de":15548}},{"type":"Polygon","arcs":[[8069,8070,8071,8072,-8068,-8066,8073]],"properties":{"id":"24662648","dp":5610,"de":2964}},{"type":"Polygon","arcs":[[-5459,-5466,-7816,8074,-5457]],"properties":{"id":"24662346","dp":2142,"de":0}},{"type":"Polygon","arcs":[[-8075,8075,8076,8077,8078,-5433]],"properties":{"id":"24662347","dp":2461,"de":0}},{"type":"Polygon","arcs":[[-7815,8079,8080,8081,-8076]],"properties":{"id":"24662348","dp":3249,"de":0}},{"type":"Polygon","arcs":[[-8080,-7817,-5680,8082,8083]],"properties":{"id":"24662349","dp":3082,"de":0}},{"type":"Polygon","arcs":[[-5674,8084,8085,8086,-8083]],"properties":{"id":"24662350","dp":3205,"de":0}},{"type":"Polygon","arcs":[[-8087,8087]],"properties":{"id":"24662351","dp":3520,"de":0}},{"type":"Polygon","arcs":[[-8081,-8084,-8088,-8086,8088,8089,8090]],"properties":{"id":"24662352","dp":2555,"de":0}},{"type":"Polygon","arcs":[[8091,-8089,-8085,-5677,-5659,-5366,8092]],"properties":{"id":"24662353","dp":4427,"de":724}},{"type":"Polygon","arcs":[[8093,-8090,-8092,8094]],"properties":{"id":"24662354","dp":3846,"de":0}},{"type":"Polygon","arcs":[[8095,-8095,-8093,8096,-8078]],"properties":{"id":"24662355","dp":4972,"de":2426}},{"type":"Polygon","arcs":[[-8077,-8082,-8091,-8094,-8096]],"properties":{"id":"24662356","dp":3809,"de":751}},{"type":"Polygon","arcs":[[-5431,-5434,-8079,-8097,-5365,8097,-5426,-5428]],"properties":{"id":"24662357","dp":3637,"de":1810}},{"type":"Polygon","arcs":[[-5364,-5260,-3497,8098,-8098]],"properties":{"id":"24662358","dp":8724,"de":358}},{"type":"Polygon","arcs":[[-8099,-3502,8099,-5421,-5427]],"properties":{"id":"24662359","dp":6330,"de":0}},{"type":"Polygon","arcs":[[-5369,-5652,8100,-3500]],"properties":{"id":"24662362","dp":3626,"de":0}},{"type":"Polygon","arcs":[[-5422,-8100,-3501,-8101,-5651,8101]],"properties":{"id":"24662363","dp":2313,"de":287}},{"type":"Polygon","arcs":[[-1251,-1314,-7964,-1264,-1258],[8102]],"properties":{"id":"24662115","dp":3939,"de":68855}},{"type":"Polygon","arcs":[[-8103]],"properties":{"id":"24662116","dp":16738,"de":73538}},{"type":"Polygon","arcs":[[8103,8104,8105,-3422,8106,8107]],"properties":{"id":"24662117","dp":2580,"de":0}},{"type":"Polygon","arcs":[[8108,-3423,-8106]],"properties":{"id":"24662118","dp":5803,"de":765}},{"type":"Polygon","arcs":[[-8105,8109,8110,-3424,-8109]],"properties":{"id":"24662119","dp":5864,"de":2286}},{"type":"Polygon","arcs":[[8111,-8110,-8104,8112]],"properties":{"id":"24662120","dp":5859,"de":0}},{"type":"Polygon","arcs":[[-2451,-2455,8113,-8112,8114]],"properties":{"id":"24662121","dp":7174,"de":0}},{"type":"MultiPolygon","arcs":[[[-8114,-2454,8115,-3425,-8111]],[[-2534,-6011,8116]]],"properties":{"id":"24662122","dp":2888,"de":196}},{"type":"Polygon","arcs":[[-2416,-2444,8117,-2447,-8115,-8113,-8108,8118]],"properties":{"id":"24662123","dp":3304,"de":512}},{"type":"Polygon","arcs":[[-2443,-2448,-8118]],"properties":{"id":"24662124","dp":10395,"de":0}},{"type":"Polygon","arcs":[[-3385,-3387,-3026,-2865,-2780,-213,8119]],"properties":{"id":"24662125","dp":15865,"de":2524}},{"type":"Polygon","arcs":[[-8120,-217,-220,-3202]],"properties":{"id":"24662126","dp":13625,"de":5500}},{"type":"Polygon","arcs":[[-2613,-2872,8120,-2601]],"properties":{"id":"24662127","dp":7707,"de":1115}},{"type":"Polygon","arcs":[[-2871,8121,-2592,8122,-8121]],"properties":{"id":"24662128","dp":8406,"de":2363}},{"type":"Polygon","arcs":[[-2602,-8123,-2591]],"properties":{"id":"24662129","dp":13488,"de":3685}},{"type":"Polygon","arcs":[[-7750,-7752,-7755,-7758,-2570,-2574,-2904]],"properties":{"id":"24662130","dp":5549,"de":9287}},{"type":"Polygon","arcs":[[-3609,-5956,8123,8124,-3604]],"properties":{"id":"24662444","dp":7695,"de":1810}},{"type":"Polygon","arcs":[[8125,-8124,-5955,-3510]],"properties":{"id":"24662445","dp":17926,"de":1295}},{"type":"Polygon","arcs":[[-3508,8126,8127]],"properties":{"id":"24662447","dp":12965,"de":0}},{"type":"Polygon","arcs":[[8128,-8126,-3509,-8128,8129,8130,8131]],"properties":{"id":"24662448","dp":22293,"de":0}},{"type":"Polygon","arcs":[[-8127,-3507,8132,-8130]],"properties":{"id":"24662449","dp":12234,"de":0}},{"type":"Polygon","arcs":[[-8131,-8133,-3513,8133,8134]],"properties":{"id":"24662450","dp":17622,"de":0}},{"type":"Polygon","arcs":[[-3512,-5954,8135,-8134]],"properties":{"id":"24662452","dp":27269,"de":0}},{"type":"Polygon","arcs":[[8136,-8136,-5953,8137]],"properties":{"id":"24662453","dp":24170,"de":2849}},{"type":"Polygon","arcs":[[8138,8139,-8138,-5952,-6037,-4358,8140]],"properties":{"id":"24662454","dp":12348,"de":910}},{"type":"Polygon","arcs":[[-8139,8141,8142]],"properties":{"id":"24662455","dp":11007,"de":0}},{"type":"Polygon","arcs":[[-3606,-8132,-8135,-8137,-8140,-8143,8143,-4363,8144]],"properties":{"id":"24662456","dp":7475,"de":1288}},{"type":"Polygon","arcs":[[-8142,-8141,-4357,-4364,-8144]],"properties":{"id":"24662457","dp":9683,"de":0}},{"type":"Polygon","arcs":[[8145,-3607,-8145,-4371,8146]],"properties":{"id":"24662458","dp":2625,"de":905}},{"type":"Polygon","arcs":[[8147,-8147,-4370,-4543,-4551]],"properties":{"id":"24662459","dp":3126,"de":0}},{"type":"Polygon","arcs":[[-7893,-3480]],"properties":{"id":"24661723","dp":14498,"de":1781}},{"type":"Polygon","arcs":[[8148,-852,-846,-8011,-7785,8149]],"properties":{"id":"24662154","dp":8850,"de":2331}},{"type":"Polygon","arcs":[[-2309,8150,8151,8152,8153,-8150,-7784]],"properties":{"id":"24662155","dp":13151,"de":2675}},{"type":"Polygon","arcs":[[8154,-8151,-2308]],"properties":{"id":"24662156","dp":5806,"de":1663}},{"type":"Polygon","arcs":[[8155,8156,-8152,-8155,-2307]],"properties":{"id":"24662157","dp":13811,"de":1647}},{"type":"Polygon","arcs":[[8157,-8156,-2306]],"properties":{"id":"24662158","dp":8404,"de":1033}},{"type":"Polygon","arcs":[[-2305,-987,-8153,-8157,-8158]],"properties":{"id":"24662159","dp":10089,"de":1485}},{"type":"Polygon","arcs":[[-986,8158,-853,-8149,-8154]],"properties":{"id":"24662160","dp":14163,"de":1951}},{"type":"Polygon","arcs":[[-960,-854,-8159]],"properties":{"id":"24662161","dp":14819,"de":2972}},{"type":"Polygon","arcs":[[8159,-7323,-7897,8160,8161,8162,8163,8164]],"properties":{"id":"24662475","dp":2046,"de":813}},{"type":"Polygon","arcs":[[8165,8166,-8163,8167]],"properties":{"id":"24662476","dp":11038,"de":5576}},{"type":"Polygon","arcs":[[8168,-8168,-8162,8169,8170,8171]],"properties":{"id":"24662477","dp":5435,"de":1136}},{"type":"Polygon","arcs":[[-8166,-8169,8172,-3452,8173]],"properties":{"id":"24662478","dp":17293,"de":2125}},{"type":"Polygon","arcs":[[-3453,-8173,-8172,8174]],"properties":{"id":"24662479","dp":3720,"de":3116}},{"type":"Polygon","arcs":[[-8175,-8171,8175,8176,8177,8178,-3454]],"properties":{"id":"24662480","dp":2279,"de":0}},{"type":"Polygon","arcs":[[-3407,8179,8180,8181,-8167,-8174,-3451]],"properties":{"id":"24662483","dp":10054,"de":1432}},{"type":"MultiPolygon","arcs":[[[-2114,8182,-7821,-6012,-1937,8183,-2106,-2110]],[[-4635,8184,-4624]]],"properties":{"id":"24662182","dp":2991,"de":455}},{"type":"Polygon","arcs":[[-1936,-2103,-8184]],"properties":{"id":"24662183","dp":9398,"de":0}},{"type":"Polygon","arcs":[[-5387,-6026,-7820,-7830,-7835,-1792,-1798,-5378,-5382]],"properties":{"id":"24662187","dp":2556,"de":5216}},{"type":"Polygon","arcs":[[-1780,-7838]],"properties":{"id":"24662192","dp":7263,"de":3092}},{"type":"Polygon","arcs":[[8185,8186,-3409,-3459,8187,8188]],"properties":{"id":"24662502","dp":13262,"de":658}},{"type":"Polygon","arcs":[[-3458,8189,-8188]],"properties":{"id":"24662503","dp":24772,"de":1893}},{"type":"Polygon","arcs":[[-8189,-8190,-3457,8190,8191,8192]],"properties":{"id":"24662504","dp":6754,"de":883}},{"type":"Polygon","arcs":[[-8192,8193,8194,8195,8196,8197]],"properties":{"id":"24662505","dp":4035,"de":1491}},{"type":"Polygon","arcs":[[-8191,-3456,8198,-8194]],"properties":{"id":"24662506","dp":4217,"de":1139}},{"type":"Polygon","arcs":[[8199,-8195,-8199,-3455,-8179,8200]],"properties":{"id":"24662507","dp":2845,"de":553}},{"type":"Polygon","arcs":[[8201,-8201,-8178,8202]],"properties":{"id":"24662508","dp":4187,"de":397}},{"type":"Polygon","arcs":[[8203,8204,-8203,8205,8206]],"properties":{"id":"24662509","dp":3635,"de":506}},{"type":"Polygon","arcs":[[8207,8208,-8207,8209]],"properties":{"id":"24662510","dp":5852,"de":0}},{"type":"Polygon","arcs":[[-8208,8210,8211]],"properties":{"id":"24662511","dp":10196,"de":0}},{"type":"Polygon","arcs":[[-3518,8212,8213,-8211,-8210,-8206,-8177,8214]],"properties":{"id":"24662512","dp":3717,"de":471}},{"type":"Polygon","arcs":[[8215,8216,-8213,-3517,8217]],"properties":{"id":"24662513","dp":6741,"de":561}},{"type":"Polygon","arcs":[[8218,8219,8220,-8218,-3516,8221]],"properties":{"id":"24662515","dp":5264,"de":1064}},{"type":"Polygon","arcs":[[8222,-8222,-3515,8223]],"properties":{"id":"24662516","dp":12660,"de":0}},{"type":"Polygon","arcs":[[8224,-5423,-8102,8225,-5927]],"properties":{"id":"24662364","dp":3878,"de":0}},{"type":"Polygon","arcs":[[-5928,-8226,-5654,-4941,-5932]],"properties":{"id":"24662365","dp":3614,"de":533}},{"type":"Polygon","arcs":[[-6690,-6692,-6683,8226,-3577,-7726]],"properties":{"id":"24662762","dp":1961,"de":5063}},{"type":"Polygon","arcs":[[-6680,8227,8228,-3578,-8227]],"properties":{"id":"24662763","dp":3052,"de":2800}},{"type":"Polygon","arcs":[[-6678,8229,8230,8231,-8228,-6679]],"properties":{"id":"24662764","dp":13112,"de":0}},{"type":"Polygon","arcs":[[8232,8233,8234,-6894,-3579,-8229,-8232]],"properties":{"id":"24662765","dp":3211,"de":601}},{"type":"Polygon","arcs":[[-8235,8235,8236,-6890]],"properties":{"id":"24662766","dp":21261,"de":0}},{"type":"Polygon","arcs":[[8237,8238,-8236,-8234]],"properties":{"id":"24662767","dp":21181,"de":0}},{"type":"Polygon","arcs":[[8239,8240,8241,-8238,-8233,-8231]],"properties":{"id":"24662768","dp":20216,"de":0}},{"type":"Polygon","arcs":[[8242,-3488,-3757,-3754,-3750]],"properties":{"id":"24661725","dp":2004,"de":984}},{"type":"Polygon","arcs":[[-3486,8243]],"properties":{"id":"24661726","dp":5105,"de":645}},{"type":"Polygon","arcs":[[-3487,-8244,-3485,-3953,-3758]],"properties":{"id":"24661727","dp":374,"de":2802}},{"type":"Polygon","arcs":[[-2344,-1774,8244,-6109,8245,8246,8247,8248,8249,8250,8251,-2334,-2335]],"properties":{"id":"24662218","dp":2745,"de":251}},{"type":"Polygon","arcs":[[8252,8253,-2331,-8252]],"properties":{"id":"24662219","dp":3553,"de":1027}},{"type":"Polygon","arcs":[[-8251,8254,8255,-8253]],"properties":{"id":"24662220","dp":7736,"de":2389}},{"type":"Polygon","arcs":[[8256,-8255,-8250,8257,8258]],"properties":{"id":"24662221","dp":3659,"de":615}},{"type":"Polygon","arcs":[[-8258,-8249,8259]],"properties":{"id":"24662222","dp":3714,"de":314}},{"type":"Polygon","arcs":[[-8259,-8260,-8248,8260,8261]],"properties":{"id":"24662223","dp":3242,"de":340}},{"type":"Polygon","arcs":[[-8261,-8247,8262,8263,8264]],"properties":{"id":"24662224","dp":3237,"de":0}},{"type":"Polygon","arcs":[[8265,-8262,-8265,8266,8267,8268]],"properties":{"id":"24662225","dp":3984,"de":580}},{"type":"Polygon","arcs":[[8269,-8269,8270]],"properties":{"id":"24662226","dp":2941,"de":514}},{"type":"Polygon","arcs":[[8271,8272,-8270,8273]],"properties":{"id":"24662227","dp":3996,"de":375}},{"type":"Polygon","arcs":[[-3548,8274,8275,-8274,-8271,-8268,8276,8277,-2034]],"properties":{"id":"24662228","dp":2285,"de":420}},{"type":"Polygon","arcs":[[-2332,-8254,8278,-8272,-8276,8279,-2329]],"properties":{"id":"24662229","dp":2847,"de":0}},{"type":"Polygon","arcs":[[-8256,-8257,-8266,-8273,-8279]],"properties":{"id":"24662230","dp":4047,"de":288}},{"type":"Polygon","arcs":[[-8280,-8275,-3547,-2330]],"properties":{"id":"24662231","dp":4144,"de":0}},{"type":"Polygon","arcs":[[8280,-8277,-8267,-8264]],"properties":{"id":"24662232","dp":8497,"de":0}},{"type":"Polygon","arcs":[[8281,8282,8283,8284,8285,-6378,-6385,-1528,-8278,-8281]],"properties":{"id":"24662233","dp":3857,"de":2193}},{"type":"Polygon","arcs":[[-5939,-4953,8286,-7996,-5942]],"properties":{"id":"24662371","dp":3734,"de":345}},{"type":"Polygon","arcs":[[8287,-8074,-8065,-8060]],"properties":{"id":"24662649","dp":14951,"de":4206}},{"type":"Polygon","arcs":[[8288,8289,-8288,8290]],"properties":{"id":"24662650","dp":6849,"de":940}},{"type":"Polygon","arcs":[[-6420,8291,-8291,-8059,-6422]],"properties":{"id":"24662651","dp":12148,"de":5177}},{"type":"Polygon","arcs":[[-6419,-6416,8292,8293,-8289,-8292]],"properties":{"id":"24662652","dp":6103,"de":878}},{"type":"Polygon","arcs":[[-8294,8294,8295,8296]],"properties":{"id":"24662653","dp":13477,"de":2954}},{"type":"Polygon","arcs":[[8297,8298,8299,-8295,-8293,-6415]],"properties":{"id":"24662654","dp":6030,"de":2576}},{"type":"Polygon","arcs":[[-8300,8300,8301,8302,-8296]],"properties":{"id":"24662655","dp":13144,"de":1417}},{"type":"Polygon","arcs":[[8303,8304,-8301,-8299]],"properties":{"id":"24662656","dp":12317,"de":0}},{"type":"Polygon","arcs":[[8305,8306,8307,-8302,-8305]],"properties":{"id":"24662657","dp":8948,"de":1091}},{"type":"Polygon","arcs":[[8308,8309,-6198,8310,8311,8312,-8307]],"properties":{"id":"24662658","dp":5459,"de":5550}},{"type":"Polygon","arcs":[[-8312,8313,8314]],"properties":{"id":"24662659","dp":18298,"de":1030}},{"type":"Polygon","arcs":[[-8297,-8303,-8308,-8313,-8315,8315,-8070,-8290]],"properties":{"id":"24662660","dp":3396,"de":3403}},{"type":"Polygon","arcs":[[-8316,8316,8317,8318,-8071]],"properties":{"id":"24662661","dp":6433,"de":1689}},{"type":"Polygon","arcs":[[-7997,-8287,-4952,-5640,-5636,8319,-7991,-7994]],"properties":{"id":"24662372","dp":3937,"de":493}},{"type":"Polygon","arcs":[[-5635,8320,-8320]],"properties":{"id":"24662373","dp":5025,"de":0}},{"type":"Polygon","arcs":[[-5629,8321,-7989,-8321]],"properties":{"id":"24662374","dp":3065,"de":963}},{"type":"Polygon","arcs":[[-5628,8322,8323,8324,-7984,-8322]],"properties":{"id":"24662375","dp":4733,"de":658}},{"type":"Polygon","arcs":[[-5623,-5614,8325,-8323,-5627]],"properties":{"id":"24662376","dp":2997,"de":581}},{"type":"Polygon","arcs":[[8326,-8324,-8326,-5613,-5606,8327]],"properties":{"id":"24662377","dp":3448,"de":446}},{"type":"Polygon","arcs":[[-7985,-8325,-8327,8328,8329]],"properties":{"id":"24662378","dp":3647,"de":0}},{"type":"Polygon","arcs":[[8330,-8329,-8328,-5612,8331]],"properties":{"id":"24662379","dp":3241,"de":0}},{"type":"Polygon","arcs":[[-7986,-8330,-8331,8332,8333]],"properties":{"id":"24662380","dp":3099,"de":0}},{"type":"Polygon","arcs":[[8334,8335,-8333,-8332,-5611,-5603]],"properties":{"id":"24662381","dp":4255,"de":0}},{"type":"Polygon","arcs":[[-7987,-8334,-8336,8336,-7982]],"properties":{"id":"24662382","dp":3573,"de":0}},{"type":"Polygon","arcs":[[-8335,-5602,-5600,-7983,-8337]],"properties":{"id":"24662383","dp":3995,"de":490}},{"type":"Polygon","arcs":[[8337,8338,8339,8340]],"properties":{"id":"24662795","dp":6055,"de":628}},{"type":"Polygon","arcs":[[8341,8342,-8341,8343,-6849]],"properties":{"id":"24662796","dp":5903,"de":2245}},{"type":"Polygon","arcs":[[8344,-8342,8345]],"properties":{"id":"24662797","dp":12400,"de":1473}},{"type":"Polygon","arcs":[[-6513,8346,-6507,-8338,-8343,-8345,8347,-6518]],"properties":{"id":"24662798","dp":7111,"de":1268}},{"type":"Polygon","arcs":[[-6512,-6502,-8347]],"properties":{"id":"24662799","dp":7366,"de":0}},{"type":"Polygon","arcs":[[-6519,-8348,-8346,-6848,8348,-6852]],"properties":{"id":"24662800","dp":6167,"de":623}},{"type":"Polygon","arcs":[[-8349,-6846,-6853]],"properties":{"id":"24662801","dp":10099,"de":2871}},{"type":"Polygon","arcs":[[-3611,8349,-3601,-8146,-8148,-4550]],"properties":{"id":"24662460","dp":3895,"de":1150}},{"type":"Polygon","arcs":[[-5935,-5941,-5944,-7995,-8000,8350,8351]],"properties":{"id":"24662390","dp":2804,"de":400}},{"type":"Polygon","arcs":[[-5304,-5302,8352,8353,-8351,-7999,-5579]],"properties":{"id":"24662391","dp":4464,"de":876}},{"type":"Polygon","arcs":[[-5287,8354,8355,8356,-8353,-5301,-5289]],"properties":{"id":"24662392","dp":5260,"de":660}},{"type":"Polygon","arcs":[[8357,8358,8359,-8356]],"properties":{"id":"24662393","dp":3702,"de":0}},{"type":"Polygon","arcs":[[8360,8361,-8358,-8355,-5286,8362]],"properties":{"id":"24662394","dp":4310,"de":282}},{"type":"Polygon","arcs":[[-5930,-5937,8363,-8359,-8362,8364]],"properties":{"id":"24662395","dp":3556,"de":466}},{"type":"Polygon","arcs":[[-5936,-8352,-8354,-8357,-8360,-8364]],"properties":{"id":"24662396","dp":3551,"de":0}},{"type":"Polygon","arcs":[[-5407,-5419,-5424,-8225,-5931,-8365,-8361,8365]],"properties":{"id":"24662397","dp":1083,"de":645}},{"type":"Polygon","arcs":[[-8366,-8363,8366,8367,-5408]],"properties":{"id":"24662398","dp":3300,"de":828}},{"type":"Polygon","arcs":[[-8367,-5285,8368,8369]],"properties":{"id":"24662399","dp":5645,"de":931}},{"type":"Polygon","arcs":[[-8368,-8370,8370,8371,8372,8373,-5411]],"properties":{"id":"24662400","dp":5122,"de":1226}},{"type":"Polygon","arcs":[[-8371,-8369,-5284,-5278,-5283,8374,8375]],"properties":{"id":"24662401","dp":3008,"de":531}},{"type":"Polygon","arcs":[[-8372,-8376,8376]],"properties":{"id":"24662402","dp":9081,"de":0}},{"type":"Polygon","arcs":[[-8028,8377,-8373,-8377,-8375,-5282,-8039,-8033]],"properties":{"id":"24662403","dp":6617,"de":0}},{"type":"Polygon","arcs":[[-5412,-8374,-8378,-8027]],"properties":{"id":"24662404","dp":9221,"de":0}},{"type":"Polygon","arcs":[[-3582,-6946,-6898,8378]],"properties":{"id":"24662822","dp":3355,"de":0}},{"type":"Polygon","arcs":[[-8379,-6897,-882,8379]],"properties":{"id":"24662823","dp":4159,"de":0}},{"type":"Polygon","arcs":[[-3583,-8380,-881,8380,-6943,-6945]],"properties":{"id":"24662824","dp":5738,"de":0}},{"type":"Polygon","arcs":[[-6937,-6944,-8381,-880,8381]],"properties":{"id":"24662825","dp":4732,"de":0}},{"type":"Polygon","arcs":[[-6938,-8382,-884,8382]],"properties":{"id":"24662826","dp":9033,"de":0}},{"type":"Polygon","arcs":[[-8383,-879,8383,-6939]],"properties":{"id":"24662827","dp":8535,"de":656}},{"type":"Polygon","arcs":[[-8384,-875,8384,-6941]],"properties":{"id":"24662828","dp":4735,"de":0}},{"type":"Polygon","arcs":[[-8385,-874,-869,-6748,-6749,-6752]],"properties":{"id":"24662829","dp":6797,"de":0}},{"type":"Polygon","arcs":[[8385,8386,-8051,-5159]],"properties":{"id":"24662417","dp":9238,"de":538}},{"type":"Polygon","arcs":[[-5155,8387,-5158,-3444]],"properties":{"id":"24662418","dp":8750,"de":0}},{"type":"Polygon","arcs":[[8388,-8386,-8388,-5154,-5975]],"properties":{"id":"24662419","dp":6129,"de":0}},{"type":"Polygon","arcs":[[-8032,-8036,-8038,-8041,-8048,-8050,-8387,-8389,-5974,8389]],"properties":{"id":"24662420","dp":539,"de":159}},{"type":"Polygon","arcs":[[-5957,-1531,-1526,-1524,-1520,-1519,-1513,8390,-5403,-8026,-3503,-8030,-8390,-5973]],"properties":{"id":"24662421","dp":93,"de":1414}},{"type":"Polygon","arcs":[[-1512,8391,8392,-6588,-6582,-6587,-6591,-5392,-8391]],"properties":{"id":"24662422","dp":1808,"de":351}},{"type":"Polygon","arcs":[[8393,-6589,-8393]],"properties":{"id":"24662423","dp":2362,"de":0}},{"type":"Polygon","arcs":[[-6574,-6580,-6590,-8394,-8392,-1511,-1504]],"properties":{"id":"24662424","dp":2937,"de":0}},{"type":"Polygon","arcs":[[-1932,-7717,-3522,-1610,-1615,-1617,-1619,-1622,-1627,-6930,8394,8395,-7094,-7101,-1404,-1410,-1423]],"properties":{"id":"24662849","dp":137,"de":2719}},{"type":"Polygon","arcs":[[8396,-8395,-6929,-6921,-6761,-6758,8397]],"properties":{"id":"24662850","dp":1660,"de":2564}},{"type":"Polygon","arcs":[[8398,-8398,-2084,8399,8400,8401]],"properties":{"id":"24662851","dp":6271,"de":2103}},{"type":"Polygon","arcs":[[-8400,-2087,-2090,8402,8403]],"properties":{"id":"24662852","dp":7329,"de":1475}},{"type":"Polygon","arcs":[[-8404,8404,8405,-8401]],"properties":{"id":"24662853","dp":8669,"de":0}},{"type":"Polygon","arcs":[[8406,-8405,-8403,-2093,8407,8408]],"properties":{"id":"24662854","dp":7892,"de":0}},{"type":"Polygon","arcs":[[-8402,-8406,-8407,8409,8410]],"properties":{"id":"24662855","dp":8326,"de":0}},{"type":"Polygon","arcs":[[8411,-8410,-8409,8412,-6711]],"properties":{"id":"24662856","dp":5615,"de":0}},{"type":"Polygon","arcs":[[-8408,-6723,-6712,-8413]],"properties":{"id":"24662857","dp":6407,"de":1388}},{"type":"Polygon","arcs":[[-8314,-8311,-6197,8413,-8317]],"properties":{"id":"24662662","dp":7637,"de":1026}},{"type":"Polygon","arcs":[[-8318,-8414,-6196,-6494,8414]],"properties":{"id":"24662663","dp":11495,"de":0}},{"type":"Polygon","arcs":[[-8319,-8415,-6493,8415,8416,-8072]],"properties":{"id":"24662664","dp":9173,"de":0}},{"type":"Polygon","arcs":[[-8416,-6495,8417,8418]],"properties":{"id":"24662665","dp":10692,"de":1207}},{"type":"Polygon","arcs":[[-8073,-8417,-8419,8419,-7315,-8069]],"properties":{"id":"24662666","dp":6614,"de":1566}},{"type":"Polygon","arcs":[[-8420,8420,8421,-7310,-7313]],"properties":{"id":"24662667","dp":7802,"de":1121}},{"type":"Polygon","arcs":[[-8418,-6287,8422,8423,-8421]],"properties":{"id":"24662668","dp":8275,"de":1793}},{"type":"Polygon","arcs":[[-7311,-8422,-8424,8424,-6285,-6294,-6301]],"properties":{"id":"24662669","dp":8402,"de":1341}},{"type":"Polygon","arcs":[[-6286,-8425,-8423]],"properties":{"id":"24662670","dp":7604,"de":0}},{"type":"Polygon","arcs":[[-6335,-6330,8425,8426,-5697]],"properties":{"id":"24663047","dp":2602,"de":2169}},{"type":"Polygon","arcs":[[-5694,-5698,-8427,8427,8428]],"properties":{"id":"24663048","dp":3553,"de":419}},{"type":"Polygon","arcs":[[-6843,-6837,-5663,-5695,-8429,8429]],"properties":{"id":"24663049","dp":4050,"de":746}},{"type":"Polygon","arcs":[[8430,8431,8432,-8241]],"properties":{"id":"24662769","dp":25506,"de":0}},{"type":"Polygon","arcs":[[8433,-8432,8434,8435]],"properties":{"id":"24662770","dp":21375,"de":0}},{"type":"Polygon","arcs":[[8436,-8436,8437,8438]],"properties":{"id":"24662771","dp":20604,"de":0}},{"type":"Polygon","arcs":[[-6671,-8438,-8435,-8431,-8240,-8230,-6677]],"properties":{"id":"24662772","dp":16165,"de":0}},{"type":"Polygon","arcs":[[-8437,8439,8440,-8237,-8239,-8242,-8433,-8434]],"properties":{"id":"24662773","dp":23203,"de":0}},{"type":"Polygon","arcs":[[8441,8442,8443,8444,8445,-6891,-8441]],"properties":{"id":"24662774","dp":23203,"de":0}},{"type":"Polygon","arcs":[[8446,-6886,-6892,-8446]],"properties":{"id":"24662775","dp":10721,"de":0}},{"type":"Polygon","arcs":[[-8445,8447,-6887,-8447]],"properties":{"id":"24662776","dp":19648,"de":0}},{"type":"Polygon","arcs":[[-8444,8448,-6888,-8448]],"properties":{"id":"24662777","dp":17637,"de":0}},{"type":"Polygon","arcs":[[8449,-6889,-8449,-8443]],"properties":{"id":"24662778","dp":17371,"de":1359}},{"type":"Polygon","arcs":[[-8450,-8442,8450,8451,8452,-6884]],"properties":{"id":"24662779","dp":16058,"de":0}},{"type":"Polygon","arcs":[[8453,8454,-8452]],"properties":{"id":"24662780","dp":11947,"de":0}},{"type":"Polygon","arcs":[[-8453,-8455,8455,-6871,-6874,-6881]],"properties":{"id":"24662781","dp":16317,"de":0}},{"type":"Polygon","arcs":[[-8454,-8451,-8440,-8439,-6670,-6668,-7723,8456,8457,-8456]],"properties":{"id":"24662782","dp":4226,"de":2476}},{"type":"Polygon","arcs":[[8458,-6867,-6868,-8458]],"properties":{"id":"24662783","dp":6920,"de":1739}},{"type":"Polygon","arcs":[[-7722,-7720,8459,8460,-8459,-8457]],"properties":{"id":"24662784","dp":6180,"de":431}},{"type":"Polygon","arcs":[[-8461,8461,8462,-6862,-6865]],"properties":{"id":"24662785","dp":6323,"de":0}},{"type":"Polygon","arcs":[[-7719,8463,8464,8465,-8462,-8460]],"properties":{"id":"24662786","dp":3458,"de":468}},{"type":"Polygon","arcs":[[-3610,-3602,-8350]],"properties":{"id":"24662461","dp":4240,"de":0}},{"type":"Polygon","arcs":[[-8125,-8129,-3605]],"properties":{"id":"24662463","dp":11983,"de":0}},{"type":"Polygon","arcs":[[-5967,8466,8467,-6032]],"properties":{"id":"24662465","dp":5102,"de":759}},{"type":"Polygon","arcs":[[-5966,-5979,-7329,8468,8469,-8467]],"properties":{"id":"24662466","dp":4620,"de":338}},{"type":"Polygon","arcs":[[8470,8471,-8469,-7328,-7325,8472]],"properties":{"id":"24662467","dp":2391,"de":0}},{"type":"Polygon","arcs":[[8473,-8471,8474,8475,8476,8477,8478]],"properties":{"id":"24662468","dp":4822,"de":559}},{"type":"Polygon","arcs":[[-8473,8479,-8475]],"properties":{"id":"24662469","dp":3556,"de":564}},{"type":"Polygon","arcs":[[8480,-8480,-7324,-8160,8481,8482]],"properties":{"id":"24662470","dp":3623,"de":279}},{"type":"Polygon","arcs":[[8483,-8476,-8481,8484]],"properties":{"id":"24662471","dp":7373,"de":0}},{"type":"Polygon","arcs":[[8485,-8485,-8483,8486]],"properties":{"id":"24662472","dp":5387,"de":0}},{"type":"Polygon","arcs":[[8487,-8484,-8486,8488]],"properties":{"id":"24662473","dp":12297,"de":0}},{"type":"Polygon","arcs":[[8489,-8489,-8487,-8482,-8165,8490]],"properties":{"id":"24662474","dp":4198,"de":270}},{"type":"Polygon","arcs":[[-6810,8491,-912,-910,-6832,-6827,-6822]],"properties":{"id":"24662897","dp":3813,"de":123}},{"type":"Polygon","arcs":[[8492,-913,-8492,-6809]],"properties":{"id":"24662898","dp":4568,"de":568}},{"type":"Polygon","arcs":[[8493,-907,-8493,-6808,8494]],"properties":{"id":"24662899","dp":2107,"de":1585}},{"type":"Polygon","arcs":[[8495,8496,-902,-904,-8494]],"properties":{"id":"24662900","dp":4924,"de":665}},{"type":"Polygon","arcs":[[-8497,8497,-6731,8498,-897,-903]],"properties":{"id":"24662901","dp":2928,"de":1075}},{"type":"Polygon","arcs":[[-898,-8499,-6735,-887,-893]],"properties":{"id":"24662902","dp":2286,"de":710}},{"type":"Polygon","arcs":[[-7096,8499,-6717,-6722,-8498,-8496,-8495,-6807]],"properties":{"id":"24662903","dp":521,"de":1841}},{"type":"Polygon","arcs":[[-8396,-8397,-8399,-8411,-8412,-6715,-6718,-8500,-7095]],"properties":{"id":"24662904","dp":812,"de":707}},{"type":"Polygon","arcs":[[8500,-8284]],"properties":{"id":"24662234","dp":14190,"de":0}},{"type":"Polygon","arcs":[[8501,-8285,-8501,-8283]],"properties":{"id":"24662235","dp":16380,"de":3095}},{"type":"Polygon","arcs":[[8502,-8181,8503]],"properties":{"id":"24662484","dp":19962,"de":1492}},{"type":"Polygon","arcs":[[8504,8505,-8491,-8164,-8182,-8503,8506,-3405]],"properties":{"id":"24662485","dp":5838,"de":1651}},{"type":"Polygon","arcs":[[-8507,-8504,-8180,-3406]],"properties":{"id":"24662486","dp":14878,"de":0}},{"type":"Polygon","arcs":[[-8187,8507,-3410]],"properties":{"id":"24662489","dp":9876,"de":2160}},{"type":"Polygon","arcs":[[8508,-8508,8509,-4335]],"properties":{"id":"24662490","dp":19199,"de":0}},{"type":"Polygon","arcs":[[-8509,8510,-3411]],"properties":{"id":"24662491","dp":34928,"de":0}},{"type":"Polygon","arcs":[[-3402,-8511,-4334,-5997,8511]],"properties":{"id":"24662492","dp":12140,"de":0}},{"type":"Polygon","arcs":[[8512,-8470,-8472,-8474,8513,8514,8515,8516,-3403,-8512,-5996,-6034]],"properties":{"id":"24662493","dp":1490,"de":1459}},{"type":"Polygon","arcs":[[-8468,-8513,-6033]],"properties":{"id":"24662494","dp":4528,"de":1570}},{"type":"Polygon","arcs":[[-8514,-8479,8517,8518]],"properties":{"id":"24662495","dp":9017,"de":0}},{"type":"Polygon","arcs":[[-8478,8519,8520,-8518]],"properties":{"id":"24662496","dp":8538,"de":0}},{"type":"Polygon","arcs":[[-8515,-8519,-8521,8521,8522]],"properties":{"id":"24662497","dp":7138,"de":0}},{"type":"Polygon","arcs":[[-8522,-8520,-8477,-8488,8523]],"properties":{"id":"24662498","dp":6698,"de":0}},{"type":"Polygon","arcs":[[8524,-8516,-8523,-8524,-8490,-8506]],"properties":{"id":"24662499","dp":2859,"de":0}},{"type":"Polygon","arcs":[[-8517,-8525,-8505,-3404]],"properties":{"id":"24662500","dp":5176,"de":1158}},{"type":"Polygon","arcs":[[-8510,-8186,8525,-4336]],"properties":{"id":"24662501","dp":7973,"de":460}},{"type":"Polygon","arcs":[[8526,8527,8528,8529,-1144,-7120,-7121]],"properties":{"id":"24662919","dp":3474,"de":1285}},{"type":"Polygon","arcs":[[8530,-8527,-7122,-7116,-7107]],"properties":{"id":"24662920","dp":5565,"de":1180}},{"type":"Polygon","arcs":[[-6997,8531,-8528,-8531,-7106,-7097,-6805,8532,-7144,-7142]],"properties":{"id":"24662921","dp":173,"de":1649}},{"type":"Polygon","arcs":[[-8529,-8532,-7001,8533,8534,8535]],"properties":{"id":"24662922","dp":6053,"de":1490}},{"type":"Polygon","arcs":[[-8530,-8536,8536,-1145]],"properties":{"id":"24662923","dp":3874,"de":0}},{"type":"Polygon","arcs":[[-8537,-8535,8537,-1146]],"properties":{"id":"24662924","dp":10460,"de":0}},{"type":"Polygon","arcs":[[-8534,8538,-1151,-1147,-8538]],"properties":{"id":"24662925","dp":8115,"de":687}},{"type":"Polygon","arcs":[[-8539,-7000,8539,-3789]],"properties":{"id":"24662926","dp":10821,"de":0}},{"type":"Polygon","arcs":[[-6999,-6996,-3782,-8540]],"properties":{"id":"24662927","dp":7975,"de":0}},{"type":"Polygon","arcs":[[8540,8541,8542,-3520,8543,-2349,8544,8545,8546,8547]],"properties":{"id":"24662518","dp":3065,"de":950}},{"type":"Polygon","arcs":[[-2386,-2397,8548,-3514,-8543,8549,8550,-2388]],"properties":{"id":"24662519","dp":1466,"de":1851}},{"type":"Polygon","arcs":[[-8550,-8542,8551]],"properties":{"id":"24662520","dp":6465,"de":0}},{"type":"Polygon","arcs":[[-8551,-8552,-8541,8552,-2373,-2389]],"properties":{"id":"24662521","dp":6449,"de":464}},{"type":"Polygon","arcs":[[-8553,-8548,8553,-2374]],"properties":{"id":"24662522","dp":7862,"de":703}},{"type":"Polygon","arcs":[[-8554,-8547,8554,-2375]],"properties":{"id":"24662523","dp":9225,"de":1320}},{"type":"Polygon","arcs":[[-8555,-8546,8555,-2369]],"properties":{"id":"24662524","dp":9885,"de":1575}},{"type":"Polygon","arcs":[[-8556,-8545,-2348,8556,-2366]],"properties":{"id":"24662525","dp":5619,"de":1733}},{"type":"Polygon","arcs":[[-8557,-2347,8557,-2359]],"properties":{"id":"24662526","dp":7254,"de":751}},{"type":"Polygon","arcs":[[-8558,-2346,-2360]],"properties":{"id":"24662527","dp":8389,"de":4424}},{"type":"Polygon","arcs":[[-7147,-7145,-8533,-6821,8558,8559,8560,-6815,-6829,-6831,8561,-1139,-1128]],"properties":{"id":"24662936","dp":292,"de":277}},{"type":"Polygon","arcs":[[-6820,8562,-8559]],"properties":{"id":"24662937","dp":3045,"de":0}},{"type":"Polygon","arcs":[[8563,8564,-8560,-8563,-6819]],"properties":{"id":"24662938","dp":626,"de":553}},{"type":"Polygon","arcs":[[-6818,8565,-6816,8566,-8564]],"properties":{"id":"24662939","dp":4716,"de":212}},{"type":"Polygon","arcs":[[-8561,-8565,-8567]],"properties":{"id":"24662940","dp":7082,"de":0}},{"type":"Polygon","arcs":[[-6817,-8566]],"properties":{"id":"24662941","dp":8629,"de":0}},{"type":"Polygon","arcs":[[-6647,8567,-8464,-7718,-6652]],"properties":{"id":"24662787","dp":10380,"de":0}},{"type":"Polygon","arcs":[[8568,-8465,-8568,-6646]],"properties":{"id":"24662788","dp":7279,"de":0}},{"type":"Polygon","arcs":[[-8569,-6645,-6642,-6630,8569,8570,8571,-6863,-8463,-8466]],"properties":{"id":"24662789","dp":3669,"de":1229}},{"type":"Polygon","arcs":[[-6625,-6850,-8344,8572,-8570,-6627]],"properties":{"id":"24662790","dp":4535,"de":608}},{"type":"Polygon","arcs":[[-8340,8573,8574,-8571,-8573]],"properties":{"id":"24662791","dp":7766,"de":431}},{"type":"Polygon","arcs":[[-8575,8575,8576,-8572]],"properties":{"id":"24662792","dp":7101,"de":0}},{"type":"Polygon","arcs":[[8577,-6855,-6864,-8577]],"properties":{"id":"24662793","dp":8053,"de":0}},{"type":"Polygon","arcs":[[-8574,-8339,-6506,8578,-6856,-8578,-8576]],"properties":{"id":"24662794","dp":4649,"de":521}},{"type":"Polygon","arcs":[[-7249,-5125,8579,8580]],"properties":{"id":"24661448","dp":19959,"de":1829}},{"type":"Polygon","arcs":[[-7250,-8581,8581,-7257]],"properties":{"id":"24661449","dp":16301,"de":2397}},{"type":"Polygon","arcs":[[-8582,8582,-7189,-7703]],"properties":{"id":"24661450","dp":14756,"de":2951}},{"type":"Polygon","arcs":[[-8580,8583,-7187,-8583]],"properties":{"id":"24661451","dp":16106,"de":2663}},{"type":"Polygon","arcs":[[8584,-7185,-8584,-5124]],"properties":{"id":"24661452","dp":12818,"de":5369}},{"type":"Polygon","arcs":[[8585,-7186,-8585,-5123,-5121]],"properties":{"id":"24661453","dp":11920,"de":6989}},{"type":"Polygon","arcs":[[8586,-7079,-8586,-5117,-7736]],"properties":{"id":"24661454","dp":11504,"de":7619}},{"type":"Polygon","arcs":[[-7075,-8587,-7735,8587]],"properties":{"id":"24661455","dp":12901,"de":4948}},{"type":"Polygon","arcs":[[-7055,-7067,-7069,-8588,-7733]],"properties":{"id":"24661456","dp":13718,"de":5895}},{"type":"Polygon","arcs":[[-8246,-6112,8588,-6367,-6376,-8286,-8502,-8282,-8263]],"properties":{"id":"24662236","dp":1511,"de":4086}},{"type":"Polygon","arcs":[[-6111,8589,-6108,-6368,-8589]],"properties":{"id":"24662237","dp":3294,"de":422}},{"type":"Polygon","arcs":[[-1098,8590,-1118,-1116]],"properties":{"id":"24662556","dp":11476,"de":0}},{"type":"Polygon","arcs":[[8591,8592,-8205,8593,8594,-1119,-8591,-1097]],"properties":{"id":"24662557","dp":4123,"de":3292}},{"type":"Polygon","arcs":[[8595,-8595,8596,8597]],"properties":{"id":"24662558","dp":8326,"de":0}},{"type":"Polygon","arcs":[[-8598,8598,8599,8600]],"properties":{"id":"24662559","dp":5288,"de":613}},{"type":"Polygon","arcs":[[8601,-8214,-8217,-8599]],"properties":{"id":"24662560","dp":12432,"de":720}},{"type":"Polygon","arcs":[[-8204,-8209,-8212,-8602,-8597,-8594]],"properties":{"id":"24662561","dp":9287,"de":2833}},{"type":"Polygon","arcs":[[-8600,-8216,-8221,8602]],"properties":{"id":"24662562","dp":8028,"de":976}},{"type":"Polygon","arcs":[[-2402,8603,-8603,-8220,8604]],"properties":{"id":"24662563","dp":8239,"de":4731}},{"type":"Polygon","arcs":[[-1120,-8596,-8601,-8604,-2406]],"properties":{"id":"24662564","dp":4582,"de":474}},{"type":"Polygon","arcs":[[-2395,-2403,-8605,-8219,-8223,8605]],"properties":{"id":"24662565","dp":3355,"de":610}},{"type":"Polygon","arcs":[[-2396,-8606,-8224,-8549]],"properties":{"id":"24662566","dp":3272,"de":0}},{"type":"Polygon","arcs":[[-8196,-8200,-8202,-8593,8606]],"properties":{"id":"24662567","dp":3434,"de":622}},{"type":"Polygon","arcs":[[8607,-8197,-8607,-8592,8608]],"properties":{"id":"24662568","dp":3493,"de":565}},{"type":"Polygon","arcs":[[-4328,8609,-8198,-8608,8610]],"properties":{"id":"24662569","dp":6037,"de":1204}},{"type":"Polygon","arcs":[[-3970,-3979,-4329,-8611,-8609,-1107,-5783]],"properties":{"id":"24662570","dp":2161,"de":753}},{"type":"Polygon","arcs":[[-4337,-8526,-8193,-8610,-4332]],"properties":{"id":"24662571","dp":8681,"de":0}},{"type":"Polygon","arcs":[[-2356,8611,-7289]],"properties":{"id":"24662572","dp":9447,"de":1142}},{"type":"Polygon","arcs":[[-8612,-2352,8612,8613,-7290]],"properties":{"id":"24662573","dp":9425,"de":2156}},{"type":"Polygon","arcs":[[-8614,8614,8615,8616]],"properties":{"id":"24662574","dp":7817,"de":7025}},{"type":"Polygon","arcs":[[8617,8618,-8615,-8613,-2351,8619,-8309,-8306,-8304]],"properties":{"id":"24662575","dp":2838,"de":1164}},{"type":"Polygon","arcs":[[-8616,-8619,8620,8621]],"properties":{"id":"24662576","dp":10968,"de":0}},{"type":"Polygon","arcs":[[-7282,8622,-8621,-8618,-8298]],"properties":{"id":"24662577","dp":9951,"de":1539}},{"type":"Polygon","arcs":[[-7291,-8617,-8622,-8623,-7281,-7285]],"properties":{"id":"24662578","dp":8510,"de":5229}}]}},"arcs":[[[7594,1708],[19,-83],[3,-12]],[[7616,1613],[-16,-5],[-10,-3]],[[7590,1605],[-3,12],[-2,11],[-6,28],[-7,33],[-3,12]],[[7569,1701],[25,7]],[[7554,1595],[-2,11],[-16,73],[-3,11]],[[7533,1690],[17,5],[19,6]],[[7590,1605],[-19,-6],[-17,-4]],[[7517,1685],[16,5]],[[7554,1595],[-18,-6]],[[7536,1589],[-2,12],[-15,73],[-2,11]],[[7518,1584],[-18,-5]],[[7500,1579],[-3,10],[-6,33],[-12,52]],[[7479,1674],[20,6]],[[7499,1680],[18,5]],[[7536,1589],[-18,-5]],[[7443,1562],[-2,10],[-7,31],[-2,12],[19,5],[-10,43],[19,6],[19,5]],[[7500,1579],[-19,-6]],[[7481,1573],[-19,-5],[-19,-6]],[[7443,1562],[-18,-5]],[[7425,1557],[-2,10],[-6,31],[-2,12],[-4,19],[-3,10],[-2,7],[-2,1]],[[7404,1647],[1,1],[10,20],[14,29],[2,3]],[[7431,1700],[16,-11],[24,7],[3,1],[5,-23]],[[7431,1700],[29,59],[-3,11]],[[7457,1770],[11,3],[11,3]],[[7479,1776],[3,-12],[15,-72],[2,-12]],[[7479,1776],[18,5]],[[7497,1781],[16,5]],[[7513,1786],[2,-12],[16,-72],[2,-12]],[[7513,1786],[17,5]],[[7530,1791],[19,5]],[[7549,1796],[2,-11],[16,-72],[2,-12]],[[7549,1796],[24,7]],[[7573,1803],[21,-95]],[[7573,1803],[22,7],[19,6]],[[7614,1816],[2,-11],[4,-17],[2,-10]],[[7622,1778],[6,-23],[2,-11],[3,-13],[2,-10]],[[7635,1721],[-18,-6],[-23,-7]],[[7662,1777],[4,-15],[2,-10],[2,-11],[2,-8]],[[7672,1733],[-9,-3],[-9,-3],[2,-11],[13,-56],[7,2],[2,0],[10,0]],[[7688,1662],[3,-12],[3,-12],[-9,-4],[-10,-3]],[[7675,1631],[-18,-5]],[[7657,1626],[-2,10],[-8,34],[-9,40],[-3,11]],[[7622,1778],[19,6],[2,-9],[7,2],[2,0],[10,0]],[[7735,1704],[-1,-22],[-1,-23]],[[7733,1659],[-11,1],[-34,2]],[[7672,1733],[1,-3],[63,-4]],[[7736,1726],[-1,-11],[0,-11]],[[7662,1777],[14,-1],[32,-2],[10,-1],[21,-1],[11,-1]],[[7750,1771],[1,-4]],[[7751,1767],[-1,-10],[-10,-6],[-3,-3],[-1,-11],[0,-11]],[[7808,1698],[-73,6]],[[7751,1767],[65,-4]],[[7816,1763],[-1,-20],[-5,0],[0,-11],[-1,-11],[-1,-11],[0,-12]],[[7750,1771],[1,17],[1,10]],[[7752,1798],[0,10]],[[7752,1808],[66,-4]],[[7818,1804],[-1,-21],[-1,-20]],[[7752,1808],[1,15],[0,6],[1,21],[1,6]],[[7755,1856],[1,17],[0,4],[1,20]],[[7757,1897],[4,-1],[36,-3],[15,-1],[11,-1]],[[7823,1891],[-2,-23],[-1,-23]],[[7820,1845],[-1,-21],[-1,-20]],[[7902,1819],[-8,-30],[-11,-32]],[[7883,1757],[-3,2],[-64,4]],[[7820,1845],[11,0],[38,-3],[9,-1],[-1,-20],[22,-2],[3,0]],[[7823,1891],[10,-1],[37,-2],[1,0],[10,-1],[1,27],[1,30],[1,15],[1,14]],[[7885,1973],[9,0],[10,-1],[3,0]],[[7907,1972],[4,-40],[1,-20]],[[7912,1912],[0,-8],[-2,-28],[-3,-28],[-5,-29]],[[7823,1891],[1,27],[2,30],[-11,0],[-6,1],[2,29]],[[7811,1978],[5,0],[10,-1]],[[7826,1977],[11,0],[5,-1],[9,0],[34,-3]],[[7757,1897],[1,21],[1,5],[0,16]],[[7759,1939],[1,14],[0,6],[2,24]],[[7762,1983],[9,-1],[1,0],[30,-3],[9,-1]],[[7762,1983],[1,29]],[[7763,2012],[2,29]],[[7765,2041],[11,-1],[5,0],[49,-4]],[[7830,2036],[-2,-29],[-2,-30]],[[7717,1942],[1,20],[1,23],[2,30]],[[7721,2015],[9,-1],[24,-1],[9,-1]],[[7759,1939],[-9,0],[-24,2],[-9,1]],[[7674,2018],[1,12],[0,17]],[[7675,2047],[48,-3],[38,-3],[4,0]],[[7721,2015],[-9,0],[-22,2],[-7,0],[-9,1]],[[7671,1945],[1,21]],[[7672,1966],[1,21]],[[7673,1987],[1,21],[0,10]],[[7717,1942],[-9,0],[-28,3],[-9,0]],[[7672,1966],[-9,0],[-70,6]],[[7593,1972],[-3,10],[-2,10],[75,-4],[1,0],[9,-1]],[[7593,1972],[-14,-5]],[[7579,1967],[-7,34]],[[7572,2001],[-3,11],[0,9],[-4,10]],[[7565,2031],[7,6],[23,22],[1,3],[-1,2],[2,7],[3,4],[7,8]],[[7607,2083],[6,-7],[4,-3],[23,-17],[9,-7],[26,-2]],[[7583,1952],[-4,15]],[[7671,1945],[-9,1],[-19,2],[-45,3],[-15,1]],[[7592,1912],[-2,10],[-7,30]],[[7671,1945],[-1,-20],[-2,-21]],[[7668,1904],[-8,1],[-50,3],[-3,8],[-15,-4]],[[7551,1899],[-2,5],[-7,35],[11,3],[11,4],[-11,49],[9,3],[10,3]],[[7592,1912],[-19,-6],[-11,-4],[-11,-3]],[[6769,2744],[-8,6],[-44,32],[-9,7]],[[6708,2789],[10,19],[6,11]],[[6724,2819],[20,-16],[21,-15],[6,11],[7,13]],[[6778,2812],[20,-16],[-12,-23],[-6,-11],[-7,-13],[-4,-5]],[[6744,2698],[-14,11],[-47,35]],[[6683,2744],[12,22],[13,23]],[[6769,2744],[-12,-24],[-6,-11],[-7,-11]],[[6818,2644],[-31,22],[-4,4],[-39,28]],[[6778,2812],[-7,7],[1,2],[1,2],[2,4]],[[6775,2827],[61,-45]],[[6836,2782],[40,-30]],[[6876,2752],[-1,-4],[-2,-3],[-8,-14],[-6,-13],[-13,-23]],[[6846,2695],[-16,-29],[-12,-22]],[[6818,2644],[-7,-13]],[[6811,2631],[-73,56]],[[6738,2687],[6,11]],[[6787,2558],[-23,-1],[-16,3]],[[6748,2560],[6,11],[3,15],[-23,5],[-23,6],[-22,15],[-20,14]],[[6669,2626],[9,13],[9,7],[18,6],[14,-1],[13,24],[6,12]],[[6811,2631],[-6,-11],[-12,-21],[-7,-15],[0,-14],[1,-12]],[[6872,2507],[-3,-1],[-24,-14]],[[6845,2492],[-20,-11],[-11,-3],[-8,-2],[-15,-1]],[[6791,2475],[-1,26],[0,3],[-2,26],[18,2],[5,2],[6,3],[7,6],[-18,13],[-5,2],[-5,1],[-9,-1]],[[6811,2631],[27,-20],[36,-27],[3,-2]],[[6877,2582],[-6,-10],[-12,-22],[-13,-24],[16,-12],[10,-7]],[[6736,2472],[-8,5],[-26,6],[-25,11]],[[6677,2494],[19,20],[2,2],[24,20],[16,11],[10,13]],[[6791,2475],[-28,-2],[-27,-1]],[[6864,2373],[-89,66],[-36,26],[-3,7]],[[6845,2492],[59,-43]],[[6904,2449],[-12,-23],[-13,-24]],[[6879,2402],[-13,-25],[-2,-4]],[[6831,2309],[-90,66]],[[6741,2375],[-59,44]],[[6682,2419],[17,18],[16,18],[16,16],[5,1]],[[6864,2373],[-11,-20]],[[6853,2353],[-12,-21],[-4,-10],[-6,-13]],[[6831,2309],[-11,-22],[-30,22],[-18,-17],[37,-26]],[[6809,2266],[-6,-10],[-11,-14]],[[6792,2242],[-15,11],[-5,-1],[-14,9],[-7,0],[-38,24]],[[6713,2285],[10,20],[2,13],[0,25],[4,10],[12,22]],[[6888,2268],[-11,-22],[-12,-21]],[[6865,2225],[-56,41]],[[6831,2309],[57,-41]],[[6853,2353],[45,-34],[11,-8]],[[6909,2311],[-11,-20],[-10,-23]],[[6879,2402],[56,-41]],[[6935,2361],[-13,-25],[-13,-25]],[[6904,2449],[56,-42]],[[6960,2407],[-12,-23],[-13,-23]],[[6999,2314],[-64,47]],[[6960,2407],[64,-48]],[[7024,2359],[-12,-22],[-13,-23]],[[6960,2407],[6,10],[5,11],[11,19]],[[6982,2447],[64,-48]],[[7046,2399],[-10,-20],[-6,-10],[-6,-10]],[[6982,2447],[11,19]],[[6993,2466],[11,20]],[[7004,2486],[64,-48]],[[7068,2438],[-11,-20],[-11,-19]],[[7004,2486],[10,20],[11,20]],[[7025,2526],[11,-7]],[[7036,2519],[53,-41]],[[7089,2478],[-10,-20],[-11,-20]],[[7167,2476],[-2,-2],[-2,2],[-1,0],[-1,0],[-2,-2],[-1,-4],[-17,-31]],[[7141,2439],[-18,13],[-16,13],[-18,13]],[[7036,2519],[9,19],[55,-41],[11,20],[5,10],[2,2],[2,5],[2,3],[2,4]],[[7124,2541],[5,-8],[10,-20],[5,-9],[1,0],[5,-8],[7,-9],[5,-5],[5,-6]],[[7025,2526],[-9,7],[-13,11],[-1,3]],[[7002,2547],[5,0],[14,4],[7,3],[5,2]],[[7033,2556],[5,4],[6,5],[4,3],[5,8]],[[7053,2576],[11,20],[3,4],[2,4],[1,3]],[[7070,2607],[5,-3],[6,-5],[7,-7],[5,-5],[9,-10],[5,-7],[4,-6],[2,-3],[7,-12],[4,-8]],[[7234,2415],[-4,3],[-11,9],[-8,8],[-10,8],[-6,7],[-7,7],[-18,16],[-3,3]],[[7070,2607],[2,4]],[[7072,2611],[8,-6],[11,-8],[14,-13],[26,-31],[12,-8]],[[7143,2545],[5,-4],[17,-13],[51,-38]],[[7216,2490],[41,-31]],[[7257,2459],[-9,-18],[-3,-6]],[[7245,2435],[-1,-1],[-6,-12],[-3,-5],[-1,-2]],[[7272,2574],[42,-32]],[[7314,2542],[-7,-9],[-16,-20]],[[7291,2513],[-13,-19],[-11,-18]],[[7267,2476],[-10,-17]],[[7216,2490],[9,17],[10,18]],[[7235,2525],[7,9],[7,10],[-34,26],[10,17],[2,5],[37,-27],[6,7],[2,2]],[[7235,2525],[-73,55],[-10,-18],[-5,-10],[-4,-7]],[[7072,2611],[2,4],[1,4],[4,6],[5,8],[29,35],[19,20],[14,8],[1,0],[14,2],[15,-2],[11,-2],[6,1],[9,2]],[[7202,2697],[16,10],[4,3]],[[7222,2710],[43,-31],[9,-8],[-15,-39],[-8,-16],[-5,-9],[-5,-10],[5,-4],[8,-6],[7,-5],[11,-8]],[[7202,2697],[-13,10],[-4,3],[-25,19],[-5,3],[-5,6],[0,6],[-11,-1],[-11,-15]],[[7128,2728],[2,10],[-1,7],[-3,7],[-4,11],[-8,8],[-24,17]],[[7090,2788],[-6,22],[2,13]],[[7086,2823],[94,-70],[4,-2]],[[7184,2751],[-6,-11],[27,-17],[17,-13]],[[7060,2684],[-2,7],[-14,56],[-8,36],[-7,15],[-9,8]],[[7020,2806],[6,9],[9,5],[13,0],[10,-8],[32,-24]],[[7128,2728],[-14,-20],[-4,-6],[-20,-26],[-15,-2],[-15,10]],[[7060,2684],[-32,25],[-5,4]],[[7023,2713],[-36,28],[-7,6],[-1,1],[-13,7]],[[6966,2755],[31,58]],[[6997,2813],[4,7]],[[7001,2820],[19,-14]],[[7001,2820],[26,47]],[[7027,2867],[59,-44]],[[6997,2813],[-18,13],[-17,13]],[[6962,2839],[-16,12]],[[6946,2851],[30,54]],[[6976,2905],[16,-12],[17,-12],[18,-14]],[[8099,2087],[4,74]],[[8103,2161],[21,-1]],[[8124,2160],[22,-2]],[[8146,2158],[-4,-74]],[[8142,2084],[-21,2],[-22,1]],[[8146,2158],[21,-1]],[[8167,2157],[-3,-75],[-22,2]],[[8138,2014],[4,70]],[[8167,2157],[10,-1],[1,0],[2,0],[9,-1]],[[8189,2155],[-4,-74]],[[8185,2081],[-4,-71]],[[8181,2010],[-21,3],[-22,1]],[[7911,3064],[-4,5],[-6,5],[-4,4],[-3,3]],[[7894,3081],[22,34]],[[7916,3115],[13,-9],[1,0],[7,-5]],[[7937,3101],[-11,-17],[-6,-8],[-2,-2],[-2,-3],[-5,-7]],[[7894,3081],[-11,11],[-11,11]],[[7872,3103],[15,28]],[[7887,3131],[29,-16]],[[7072,2611],[-2,1],[-16,13],[-15,11],[20,37],[1,11]],[[7078,3651],[-13,-25]],[[7065,3626],[-6,5],[-5,2],[-13,8],[-13,5],[-6,4],[-1,-1],[0,-2],[-4,5],[-31,-1]],[[6986,3651],[16,28]],[[7002,3679],[3,-2],[5,-1],[5,-1],[6,0],[6,0]],[[7027,3675],[4,1],[6,-1],[7,-2],[7,-2],[8,-6],[19,-14]],[[6939,2583],[-44,33]],[[6895,2616],[11,20],[6,10]],[[6912,2646],[13,23],[14,27],[2,3],[1,4]],[[6942,2703],[45,-33]],[[6987,2670],[-2,-4],[-2,-3],[-7,-13],[-7,-13]],[[6969,2637],[-13,-22]],[[6956,2615],[-6,-12],[-11,-20]],[[8730,6185],[-9,-28]],[[8721,6157],[-8,-21],[-7,-21],[-8,-21],[-7,-22],[-7,-19],[-5,-13]],[[8679,6040],[-18,-52]],[[8661,5988],[-3,2],[-3,1],[-9,5],[-9,4],[8,22],[-40,22],[-9,5],[-40,22],[-9,-21]],[[8547,6050],[-16,8]],[[8531,6058],[8,22],[-53,29]],[[8486,6109],[-47,25]],[[8439,6134],[-2,2]],[[8437,6136],[48,122]],[[8485,6258],[58,-28],[2,23]],[[8545,6253],[100,-39],[3,9],[45,-26],[8,0],[3,0],[6,-1],[17,-10],[3,-1]],[[8565,5953],[-7,-19]],[[8558,5934],[-45,25],[-18,10]],[[8495,5969],[7,18],[-16,9],[-15,9]],[[8471,6005],[8,23],[12,27],[16,-9],[7,18],[1,3],[16,-9]],[[8547,6050],[16,-9],[-1,-3],[-7,-18],[-21,-50],[31,-17]],[[8634,5915],[-2,2],[-12,6],[-9,5],[-16,8],[-30,17]],[[8661,5988],[-2,-3],[-17,-48],[-8,-22]],[[8471,6005],[-33,17],[10,23],[18,45],[1,3]],[[8467,6093],[10,-5],[9,21]],[[8495,5969],[-6,-14],[-4,-8],[-1,-3],[-11,-16],[-8,-9],[-5,-11],[-7,-17]],[[8453,5891],[-40,22]],[[8413,5913],[-53,29]],[[8360,5942],[17,40]],[[8377,5982],[8,20],[9,22]],[[8394,6024],[8,19]],[[8402,6043],[20,-11],[27,65],[1,2],[1,3],[10,-6],[6,-3]],[[8402,6043],[28,67],[1,3]],[[8431,6113],[8,21]],[[8394,6024],[-2,1],[-20,11]],[[8372,6036],[8,19]],[[8380,6055],[27,68],[1,3],[21,-12],[2,-1]],[[8380,6055],[-16,8],[-16,8]],[[8348,6071],[28,69],[1,3],[-15,8]],[[8362,6151],[8,20],[54,-29],[13,-6]],[[9365,6386],[-13,5],[-12,4],[-9,3],[-34,16],[-9,4]],[[9288,6418],[-5,30],[-5,3],[-9,4],[-6,4],[-10,5],[-10,4],[-19,10],[-10,4]],[[9214,6482],[-10,6],[-5,2]],[[9199,6490],[4,12],[5,14]],[[9208,6516],[9,-4],[55,-28],[8,-3],[-4,29],[-2,26],[-2,27]],[[9272,6563],[9,-4],[7,-4],[10,-5],[10,-4],[-1,32],[0,4],[0,4],[1,2],[0,17],[0,24]],[[9308,6629],[9,-5],[12,-4],[4,-2]],[[9333,6618],[0,-25],[-2,-5],[-1,-4],[4,-11],[1,-8],[0,-11],[3,-21],[1,-26],[2,-9],[1,-8],[1,-10],[2,-7],[1,-10],[2,-11],[1,-8],[1,-6],[14,-35],[0,-9],[1,-8]],[[9208,6516],[9,23],[7,22]],[[9224,6561],[8,22],[9,-5],[21,-10],[10,-5]],[[9224,6561],[-9,4],[-32,16],[-1,0],[-9,4],[-5,4]],[[9168,6589],[7,21]],[[9175,6610],[4,14],[16,57]],[[9195,6681],[9,-3]],[[9204,6678],[4,-1],[6,-3],[40,-19],[4,-2],[8,-4],[2,-1],[37,-19],[3,0]],[[9175,6610],[-4,2],[-9,5],[-2,0],[-19,10],[-8,4]],[[9133,6631],[8,21],[7,22],[2,8],[6,17],[4,9],[5,14],[1,3]],[[9166,6725],[2,-1],[7,-3],[16,-8],[9,-4],[-8,-27],[3,-1]],[[9133,6631],[-11,5],[-22,11],[-9,4]],[[9091,6651],[7,22]],[[9098,6673],[9,22],[8,24],[10,26]],[[9125,6745],[8,-4],[23,-11],[10,-5]],[[9117,6588],[-10,5],[-3,2],[-20,9],[-9,5],[-9,4],[-23,11],[-9,5]],[[9034,6629],[8,21],[-9,5],[-23,11],[-9,4]],[[9001,6670],[7,21]],[[9008,6691],[9,-4],[9,-4],[14,-7],[9,-4],[10,-5],[22,-11],[10,-5]],[[9133,6631],[-8,-22],[-8,-21]],[[9098,6673],[-9,4],[-23,12],[-9,4],[8,22],[3,7],[6,18]],[[9074,6740],[9,25],[7,21]],[[9090,6786],[41,-19]],[[9131,6767],[-6,-22]],[[9090,6786],[-32,15],[-9,4]],[[9049,6805],[3,11],[3,9],[11,38]],[[9066,6863],[11,-3],[8,-4],[-4,-17],[10,-5],[14,-6],[8,-4],[22,-9],[9,-4]],[[9144,6811],[-6,-22],[-7,-22]],[[9144,6811],[7,23],[5,18]],[[9156,6852],[6,18]],[[9162,6870],[9,-2],[23,-8],[9,-2]],[[9203,6858],[2,-1],[6,-2],[2,0],[18,-5],[10,-3],[5,16],[5,17],[7,21],[3,-1]],[[9261,6900],[-10,-32],[-1,-4],[-32,-109],[-2,-7],[-21,-67]],[[9308,6629],[1,2],[1,24],[1,16],[2,13],[3,24],[-1,2],[-2,1],[-9,5],[-18,8],[-3,1],[-10,5]],[[9273,6730],[-13,5],[-26,12],[-11,5],[-4,-12],[-2,-12],[-2,-11],[-4,-13]],[[9211,6704],[-7,-26]],[[9261,6900],[6,-2],[-6,-21]],[[9261,6877],[-6,-17],[-5,-16],[-4,-15],[-4,-14],[9,-2],[23,-8],[7,-3],[3,0],[3,14],[2,7],[2,9],[3,17],[4,16]],[[9298,6865],[10,-3],[12,-3],[2,-1],[9,-2],[5,22],[-9,3],[-3,1],[3,11],[3,15],[3,12],[1,6],[0,1]],[[9334,6927],[14,-5],[12,-5],[13,-1]],[[9373,6916],[1,-2],[5,1],[2,0],[-1,-2],[-3,-1],[-1,-2],[3,-7],[0,-4],[-5,-21],[-2,-13],[-6,-26],[-7,-24],[-5,-12],[-1,-6],[-1,-7],[-2,-16],[-5,-18],[-4,-22],[0,-12],[-3,-16],[0,-12],[-2,-17],[-1,-3],[-2,-2],[-1,-2],[2,-3],[1,-8],[-2,-7],[0,-12],[0,-22]],[[9261,6877],[7,-3],[2,0],[17,-5],[1,-1],[10,-3]],[[9273,6730],[-3,-27],[-1,-27],[-9,4],[-4,2],[-34,17],[-2,0],[-9,5]],[[8763,5769],[-15,-41]],[[8748,5728],[-9,5],[-37,20],[-9,5]],[[8693,5758],[-9,5],[-22,13],[-9,5]],[[8653,5781],[-9,5],[-38,21],[-9,5]],[[8597,5812],[15,40]],[[8612,5852],[15,44]],[[8627,5896],[21,-12]],[[8648,5884],[-8,-21]],[[8640,5863],[-9,-21],[9,-5],[53,-29],[8,-5],[8,-4]],[[8709,5799],[9,-5],[9,-5]],[[8727,5789],[9,-5],[9,-5],[8,-5],[10,-5]],[[8920,5998],[-8,-21]],[[8912,5977],[-10,6],[-37,20],[-9,4],[-70,39],[-11,6]],[[8775,6052],[9,21],[8,20],[8,21]],[[8800,6114],[80,-44]],[[8880,6070],[-8,-21],[-8,-20],[10,-6],[36,-20],[10,-5]],[[8880,6070],[10,-6],[37,-20],[9,-5],[-4,-11],[-4,-8],[0,-3],[-6,-15],[-2,-4]],[[8892,5924],[-11,6],[-36,20],[-9,5]],[[8836,5955],[12,31],[-10,6],[-61,33],[-10,5]],[[8767,6030],[8,22]],[[8912,5977],[-8,-21],[-8,-19],[-4,-13]],[[8881,5881],[-51,27],[-10,6]],[[8820,5914],[7,19],[9,22]],[[8892,5924],[-6,-23],[-4,-17],[-1,-3]],[[8820,5914],[-10,6],[-59,32],[-10,5]],[[8741,5957],[-9,6],[-22,12],[-3,1]],[[8707,5976],[8,17],[1,1],[1,0],[22,-12],[10,-5],[6,22],[4,12],[8,19]],[[8707,5976],[-2,1],[-12,6],[-20,2],[-10,3],[-2,0]],[[8679,6040],[19,-10],[13,31],[19,-10],[27,-15],[10,-6]],[[8721,6157],[10,-6],[69,-37]],[[8927,5255],[-1,-2],[-1,-2],[0,-2],[-1,-1],[0,-2],[-10,-24],[-5,-12]],[[8909,5210],[-9,5],[-20,11],[-9,5],[-9,-23],[-5,-11],[-4,-12]],[[8853,5185],[-10,5],[-21,12],[-10,5]],[[8812,5207],[-51,27],[0,1]],[[8761,5235],[1,4],[18,56],[9,29],[1,2]],[[8790,5326],[2,-1],[29,-16],[26,-15],[3,-1],[1,-1],[23,-12],[15,-7],[34,-17],[4,-1]],[[8891,5163],[-29,17],[-9,5]],[[8909,5210],[-9,-23],[-5,-12],[-4,-12]],[[8882,5140],[-28,16],[-10,5]],[[8844,5161],[-10,5],[-21,12],[-10,5]],[[8803,5183],[9,24]],[[8891,5163],[-7,-18],[-2,-5]],[[8826,5114],[-10,5],[-21,12],[-10,6]],[[8785,5137],[9,23],[9,23]],[[8844,5161],[-9,-23],[-9,-24]],[[8864,5093],[-9,-23]],[[8855,5070],[-10,5],[-18,10],[-11,6]],[[8816,5091],[10,23]],[[8882,5140],[-8,-20],[-1,-3],[-9,-24]],[[8816,5091],[-9,5],[-22,12],[-10,5],[-10,6],[-31,17],[-3,1]],[[8731,5137],[7,25]],[[8738,5162],[1,0],[35,-20],[11,-5]],[[8738,5162],[8,24],[7,24],[8,25]],[[8432,5056],[-4,2],[-4,2],[-40,21],[-40,21]],[[8344,5102],[-76,40]],[[8268,5142],[-58,31]],[[8210,5173],[-57,30]],[[8153,5203],[-54,29]],[[8099,5232],[-37,20],[-15,8]],[[8047,5260],[7,12],[4,8]],[[8058,5280],[10,18],[10,18],[10,19]],[[8088,5335],[10,19],[10,18]],[[8108,5372],[10,19]],[[8118,5391],[10,19],[10,19]],[[8138,5429],[22,41],[19,35]],[[8179,5505],[8,15],[10,17],[2,3]],[[8199,5540],[72,-39],[20,-11],[64,-35],[31,-16],[21,-12],[25,-13],[3,-2]],[[8435,5412],[-1,-4],[-2,-14],[-1,-5],[0,-11],[2,-53],[1,-55],[2,-58],[1,-36],[1,-44],[-1,-19],[-2,-36],[-3,-21]],[[8592,4282],[-59,38]],[[8533,4320],[-26,16],[-28,18],[-2,2]],[[8477,4356],[8,19],[8,20],[8,19]],[[8501,4414],[7,20],[8,19],[8,20]],[[8524,4473],[7,19],[3,5],[1,2],[9,23],[1,3]],[[8545,4525],[8,-5],[10,-10],[10,-15],[7,-14],[20,-41]],[[8600,4440],[33,-61],[4,-10],[1,-2],[1,-2],[2,-5],[2,-5],[25,-9]],[[8668,4346],[-7,-30],[-4,-19],[-4,-19],[-4,-18],[-27,2],[-30,20]],[[8499,4267],[-49,37]],[[8450,4304],[9,16]],[[8459,4320],[10,19],[7,14],[1,3]],[[8533,4320],[-10,-19],[-10,-19],[-4,2],[-5,-8],[-5,-9]],[[8470,4214],[-13,10],[-11,9],[-11,8],[12,18],[0,7],[1,2],[5,8],[-14,11]],[[8439,4287],[5,8],[6,9]],[[8499,4267],[-4,-9],[-5,-9]],[[8490,4249],[-5,-8],[-10,-17],[-5,-10]],[[8408,4151],[-23,18],[-8,6],[-3,0]],[[8374,4175],[12,21],[14,24],[19,33]],[[8419,4253],[17,28],[3,6]],[[8470,4214],[-6,-16],[-11,-19],[-22,-38],[-13,10],[-10,0]],[[9675,8212],[-4,2],[-4,1],[-2,1]],[[9665,8216],[-2,1],[-40,14],[-3,1]],[[9620,8232],[6,27],[5,28]],[[9631,8287],[4,22],[11,-3],[6,1],[2,5],[-1,15]],[[9653,8327],[-5,47]],[[9648,8374],[-1,14]],[[9647,8388],[10,-3],[51,-13],[6,-14],[5,-22],[4,-19],[1,-5]],[[9724,8312],[-7,-3],[-34,9],[-4,0],[-1,-2],[1,-7],[-13,-2],[4,-43]],[[9670,8264],[4,-34],[1,-11],[0,-7]],[[9669,8164],[-17,5],[-7,18],[-1,2],[-2,2],[-7,1],[-3,0],[-2,-2],[-7,-9],[-7,-12],[-4,-10],[-3,-11]],[[9609,8148],[-11,2],[-6,-1],[-14,-10],[-5,-6],[-1,-8],[1,-7],[-2,-13]],[[9571,8105],[-21,5],[5,27],[2,5],[6,11]],[[9563,8153],[7,5],[30,23],[7,8],[5,8],[3,8],[4,22],[1,5]],[[9665,8216],[0,-5],[4,-47]],[[9677,8082],[-11,-1],[-13,3],[3,16],[-4,34],[0,3],[-3,1],[-40,10]],[[9669,8164],[2,-23],[6,-59]],[[9677,8082],[2,-27],[0,-22],[1,-22]],[[9680,8011],[-61,15]],[[9619,8026],[5,21],[4,21],[-41,11],[4,21],[-20,5]],[[9690,8008],[-7,2],[-3,1]],[[9675,8212],[13,-4],[17,-5],[18,-4],[39,-10]],[[9762,8189],[0,-5],[-1,-10],[-2,-13],[-7,-26],[-19,-70],[-46,12],[1,-25],[1,-22],[1,-22]],[[9743,8257],[12,-29],[4,-20],[2,-8],[1,-11]],[[9670,8264],[13,2],[2,1],[1,1],[20,-5],[2,-1],[3,-2],[26,-6],[6,3]],[[9724,8312],[3,-13],[5,-12],[1,-5],[3,-6],[7,-19]],[[9775,8184],[-13,5]],[[9647,8388],[-1,10],[-2,22]],[[9644,8420],[5,-1],[16,-4],[18,-5],[10,-2]],[[9693,8408],[3,1],[35,-9],[3,0],[13,-1],[3,-1],[7,-1]],[[9757,8397],[2,-12],[7,-16],[3,-23],[3,-4],[3,-5],[2,-1],[1,0],[0,-1],[0,-2],[0,-1],[-3,-1],[-3,-3],[1,-9],[2,-8],[1,-8],[3,-23],[0,-2],[0,-11],[3,-12],[1,-28],[2,-5],[-1,-19],[2,-11],[-4,-4],[-7,-1],[0,-3]],[[9698,8655],[5,-5],[-1,-3],[2,-16],[2,-4],[5,-10],[0,-8],[3,-21],[5,-22],[2,-9],[3,-12],[3,-6],[1,-7],[2,-6],[3,-4],[3,-2],[7,-1],[0,-3],[-2,-4],[-3,-9],[-2,-2],[-2,-19],[1,-4],[6,-6],[2,-2],[3,-3],[1,-7],[-2,-10],[5,-20],[3,-21],[3,-10],[1,-2]],[[9693,8408],[-9,24],[-3,8],[-6,29],[-1,5],[-4,17],[-2,8]],[[9668,8499],[-3,23],[-2,10],[-6,40],[-5,39],[-4,29],[-4,28]],[[9644,8668],[31,-9],[3,1],[2,1],[1,1],[13,-6],[4,-1]],[[9775,8184],[0,-18],[-2,-30],[-2,-12],[-2,-7],[-1,-10],[-1,-8],[-4,-19],[-3,-8],[-2,-11],[-1,-7],[-6,-21],[-1,-9],[0,-24],[-1,-6]],[[9749,7994],[-24,5],[-9,2],[-26,7]],[[9774,7870],[-3,0],[-13,1],[1,2],[-21,5]],[[9738,7878],[-5,3],[-14,4],[-3,1],[-3,1],[-20,5],[-17,5]],[[9676,7897],[-5,1],[-3,1]],[[9668,7899],[4,25],[2,10],[1,10],[2,10],[1,11],[0,11],[1,13],[-64,16]],[[9615,8005],[4,21]],[[9749,7994],[0,-16],[-1,-2],[0,-8],[1,-9],[1,-2],[1,-3],[1,-21],[1,-4],[2,-4],[6,-6],[0,-4],[4,-9],[2,-8],[3,-10],[4,-8],[0,-10]],[[9679,7765],[-41,11]],[[9638,7776],[9,20],[10,21],[7,20]],[[9664,7837],[5,22],[1,3],[3,17],[2,15],[1,3]],[[9738,7878],[-3,-18],[-2,-16],[-5,-24],[-25,7],[-3,1],[-7,-21],[-7,-21],[-7,-21]],[[9652,7840],[-95,26]],[[9557,7866],[4,21],[8,36],[0,3]],[[9569,7926],[63,-17],[11,-3],[25,-7]],[[9664,7837],[-4,1],[-2,1],[-3,0],[-3,1]],[[9548,7822],[5,22],[4,22]],[[9652,7840],[-7,-20],[-4,-11],[-4,-10],[-89,23]],[[9534,7757],[2,8],[1,6],[2,8]],[[9539,7779],[4,22],[5,21]],[[9638,7776],[-11,-20],[-11,-21]],[[9616,7735],[-6,2],[-3,1],[-73,19]],[[9641,7660],[-58,16]],[[9583,7676],[7,12],[15,26],[11,21]],[[9679,7765],[-6,-21],[-6,-22],[-7,-24],[-4,-8],[-2,-5],[-6,-13],[-7,-12]],[[9521,7693],[3,14],[5,26],[5,24]],[[9583,7676],[-8,3],[-54,14]],[[9522,7584],[-22,6],[4,24],[5,23]],[[9509,7637],[5,23],[4,19],[3,14]],[[9641,7660],[-6,-9],[-13,-20],[-14,-21]],[[9608,7610],[-53,15],[-11,-22],[-12,-22]],[[9532,7581],[-6,1],[-4,2]],[[9522,7584],[-11,-20]],[[9511,7564],[-76,22]],[[9435,7586],[4,21],[5,23],[5,24],[60,-17]],[[9382,7601],[53,-15]],[[9511,7564],[-10,-18],[-10,-19],[-4,-8],[-6,-3],[-6,-2],[-4,0],[-6,0],[-7,1],[-39,10],[-53,16],[6,20],[5,19],[5,21]],[[9492,7435],[-13,-20],[-28,-40],[-12,-20],[-9,-16],[-8,-22],[-17,-49],[-12,-34],[-32,-95],[-11,-40],[-8,-28],[-4,-20],[-4,-15],[-16,-73],[-5,-24],[-1,-6]],[[9312,6933],[-32,9],[-5,2]],[[9275,6944],[-4,1],[-38,11],[-1,0]],[[9232,6956],[-42,12]],[[9190,6968],[-42,12]],[[9148,6980],[-43,10],[-42,12]],[[9063,7002],[-41,13]],[[9022,7015],[-3,1]],[[9019,7016],[0,1],[4,6],[37,117],[45,140],[15,71],[21,101],[5,13],[27,85],[13,42],[12,38],[2,8],[1,11],[6,20],[66,-17],[19,-5],[42,-12],[32,-9],[21,-5],[-5,-20]],[[9532,7581],[-11,-19],[-10,-18],[-34,-61],[-13,-23],[-8,-15],[36,-10]],[[6540,4618],[-62,30]],[[6478,4648],[7,19],[3,9],[4,11],[5,14],[6,17]],[[6503,4718],[61,-30]],[[6564,4688],[-6,-16],[-5,-14],[-3,-11],[-4,-9],[-6,-20]],[[6564,4688],[50,-24],[10,-3],[3,-1]],[[6627,4660],[-1,-3],[-6,-15],[-5,-14],[-3,-11],[-4,-9],[-3,-9],[-3,-10]],[[6602,4589],[-18,9],[-44,20]],[[8362,6151],[-1,-3],[-8,-20],[-27,14],[8,21],[1,3],[-22,12]],[[8313,6178],[8,21],[15,41],[31,82]],[[8367,6322],[4,11]],[[8371,6333],[114,-75]],[[6747,4747],[-10,-21],[-7,-12],[-2,-4],[-3,-8],[-7,-12],[0,-1],[-3,-7],[-5,-11],[-1,-3],[-1,-2],[-6,-17]],[[6702,4649],[0,1],[-1,0],[-2,1],[0,1],[-3,1],[-5,-2],[-7,-4],[-4,-3],[-4,-3],[-3,-1],[-2,0],[-4,1],[-18,9],[-22,10]],[[6503,4718],[-3,1],[-59,28],[-13,6],[-32,15]],[[6396,4768],[36,102],[6,17],[2,5],[1,3],[0,1],[5,14],[8,23]],[[6454,4933],[8,-4],[28,-13],[9,-4]],[[6499,4912],[-8,-23],[-3,-10],[-3,-9],[61,-29]],[[6546,4841],[61,-29]],[[6607,4812],[19,-9],[20,-9],[-4,-9],[-4,-13],[-4,-12],[22,-11]],[[6656,4749],[22,-10],[13,-6],[10,-5],[23,-11],[7,14],[5,9],[5,9],[1,-1],[2,0],[2,-1],[1,0]],[[6607,4812],[4,9],[3,10],[4,10],[3,9],[1,2]],[[6622,4852],[9,-4],[23,-11],[21,-10],[8,-4]],[[6683,4823],[-1,-2],[-3,-9],[-3,-10],[-4,-10],[-3,-9],[-4,-9],[-2,-7],[-2,-6],[-5,-12]],[[6546,4841],[3,9],[4,10],[3,10],[5,12]],[[6561,4882],[61,-30]],[[6561,4882],[5,17],[7,19],[6,18]],[[6579,4936],[62,-29]],[[6641,4907],[-7,-19],[-6,-19],[-1,-2],[-4,-13],[-1,-2]],[[6579,4936],[7,20],[4,11],[4,12]],[[6594,4979],[62,-28]],[[6656,4951],[-4,-13],[-4,-11],[-7,-20]],[[6561,4882],[-9,4],[-45,21],[-8,5]],[[6499,4912],[6,17],[6,19],[7,18],[6,19],[4,11],[5,13]],[[6533,5009],[61,-30]],[[6454,4933],[6,18]],[[6460,4951],[7,20],[4,11],[17,48]],[[6488,5030],[45,-21]],[[6460,4951],[-3,1],[-7,4],[-16,7],[-20,9],[2,6],[5,14],[3,9],[1,3]],[[6425,5004],[8,24],[5,12],[4,12]],[[6442,5052],[46,-22]],[[6396,4768],[-16,8],[-54,26]],[[6326,4802],[3,2],[2,3],[8,22],[1,3]],[[6340,4832],[10,25],[19,24],[3,4]],[[6372,4885],[15,18],[-2,4],[-57,28],[5,14],[4,12]],[[6337,4961],[5,12],[4,12],[4,12],[4,11],[8,23],[2,3]],[[6364,5034],[61,-30]],[[6364,5034],[-60,29],[-2,1]],[[6302,5064],[8,23],[9,25]],[[6319,5112],[11,-6],[50,-25]],[[6380,5081],[62,-29]],[[6337,4961],[-61,30]],[[6276,4991],[4,12],[5,12],[8,22],[7,22],[2,5]],[[6372,4885],[-3,1],[-22,11],[-22,11],[-13,6],[-54,27]],[[6258,4941],[9,23]],[[6267,4964],[5,14],[4,13]],[[6340,4832],[-3,2],[-50,25],[-34,17],[-16,8]],[[6237,4884],[9,25],[10,28],[2,4]],[[6326,4802],[-54,27]],[[6272,4829],[-19,10],[-27,13]],[[6226,4852],[6,17],[4,12],[1,3]],[[6253,4728],[-61,31]],[[6192,4759],[7,21],[8,22]],[[6207,4802],[8,21],[5,13],[6,16]],[[6272,4829],[-6,-16],[-5,-13]],[[6261,4800],[-8,-22],[5,-3],[10,-5],[-8,-21],[-7,-21]],[[6291,4708],[-7,3],[-1,1],[-30,16]],[[6261,4800],[54,-28],[-5,-13],[-4,-11],[-6,-16],[-1,-3],[-4,-11],[-4,-10]],[[6268,4661],[-14,7],[-20,10],[-61,30]],[[6173,4708],[2,7]],[[6175,4715],[8,22],[9,22]],[[6291,4708],[-1,-5],[-2,-7],[-8,-19],[-2,-3],[-10,-13]],[[6254,4623],[-1,0],[-95,46]],[[6158,4669],[3,8],[5,11],[2,8],[5,12]],[[6268,4661],[-7,-19],[-7,-19]],[[6225,4516],[3,22],[3,15],[3,12],[1,1],[3,10]],[[6238,4576],[5,14],[2,9],[8,20],[1,4]],[[6396,4768],[-3,-9],[-27,-75],[-16,-46],[-32,-93],[-2,-6],[-13,-38],[-2,-6]],[[6301,4495],[-2,0],[-18,5],[-28,8],[-8,2],[-20,6]],[[6238,4576],[-1,1],[-2,0],[-3,-10],[-8,4],[-5,3],[-43,21],[-16,7],[-5,-12],[-21,-25],[-14,4]],[[6120,4569],[12,32]],[[6132,4601],[5,11],[3,8],[6,19],[4,8],[4,11]],[[6154,4658],[4,11]],[[6225,4516],[-3,0],[-101,27],[-8,2]],[[6113,4545],[7,24]],[[6225,4516],[-3,-24],[-5,-38],[-4,-26]],[[6213,4428],[-4,1],[-17,0],[-13,-2],[-15,-5],[-14,-4]],[[6150,4418],[-2,13],[1,18]],[[6149,4449],[4,30]],[[6153,4479],[20,-5],[7,38],[-17,6],[-18,4],[-18,5],[-19,5]],[[6108,4532],[5,13]],[[6153,4479],[-20,9],[-17,8],[-17,9]],[[6099,4505],[-27,13],[-10,5],[-3,2],[0,2],[7,17],[42,-12]],[[6149,4449],[-55,27],[-5,2]],[[6089,4478],[10,27]],[[6150,4418],[-36,25],[-5,7],[-10,4],[-4,1],[-32,-5],[-26,-1],[-16,-7],[-5,10],[-12,24]],[[6004,4476],[14,-7],[2,0],[4,1],[3,1],[14,28],[1,1],[2,0],[31,-15],[14,-7]],[[6150,4418],[-50,-17],[1,-5]],[[6101,4396],[-18,-6],[-21,-7]],[[6062,4383],[-33,-10]],[[6029,4373],[-4,3],[-8,-3],[-1,2],[-5,16],[-7,13],[-24,17]],[[5980,4421],[13,26],[11,29]],[[7637,1518],[-21,95]],[[7616,1613],[22,7],[19,6]],[[7657,1626],[2,-11],[17,-74],[3,-11]],[[7679,1530],[-19,-6],[-11,-3],[-12,-3]],[[8505,6314],[9,-15],[1,-5],[-9,-21],[2,-4],[14,-8],[15,36],[1,2],[8,-12],[4,-5],[3,-2],[2,-1],[2,-3],[3,-1]],[[8560,6275],[-15,-22]],[[8371,6333],[10,28],[4,11],[10,24],[1,3]],[[8396,6399],[19,-10]],[[8415,6389],[49,-28]],[[8464,6361],[-1,-2],[-20,-51],[1,-3],[14,-8],[30,-18],[3,2],[6,16],[8,17]],[[8464,6361],[15,-8],[19,-10]],[[8498,6343],[-3,-3],[-6,-17],[16,-9]],[[8543,6376],[-4,-4],[-5,-6],[-4,-4],[-4,-3],[-3,-3],[-7,-4],[-14,-7],[-4,-2]],[[8415,6389],[17,34],[7,14],[2,3]],[[8441,6440],[52,-28],[5,-5],[4,4],[7,11]],[[8509,6422],[11,-8],[18,-10],[-8,-13],[0,-5],[13,-10]],[[8567,6293],[-7,-18]],[[8498,6343],[19,-11],[1,-1],[1,-1],[1,-2],[15,10],[23,-37],[3,-4],[3,-2],[3,-2]],[[8609,6408],[-14,-6],[-21,9],[-12,-31],[22,-13],[-4,-11],[7,-4]],[[8587,6352],[-13,-42],[-2,-4],[-5,-13]],[[8543,6376],[3,4],[7,12],[10,17],[13,22],[-45,31]],[[8531,6462],[2,2],[2,4],[2,4]],[[8537,6472],[0,-1],[4,-3],[3,-2],[6,-4],[4,-2],[5,-4],[4,-3],[41,-29],[9,-7],[1,0]],[[8614,6417],[-2,-4],[-2,-1],[-1,-4]],[[8609,6408],[14,-10],[-10,-26],[-2,-6],[1,-6],[3,-14],[1,-7],[-28,13],[-1,0]],[[8784,6337],[-1,-4],[-2,-6],[-5,-13],[-15,-43],[-6,-15],[-11,-33],[-12,-33],[-2,-5]],[[8614,6417],[7,-5],[7,-5],[3,-2],[9,-6],[6,-5],[10,-7],[10,-6],[7,-5],[8,-4],[7,-3],[7,-3],[7,-3],[13,-5],[7,-2],[3,-1],[2,0],[29,-9],[25,-8],[1,-1],[1,0],[1,0]],[[8786,6342],[-2,-5]],[[8614,6417],[1,7]],[[8615,6424],[2,-1],[24,-17],[8,-6],[7,-4],[9,-5],[18,44],[7,26],[2,10],[12,31]],[[8704,6502],[17,-9],[51,-26],[7,-3],[5,-2],[24,-13],[11,-5],[3,-1]],[[8822,6443],[-14,-39],[-6,-16],[-7,-21],[-1,-4],[-5,-12],[-3,-9]],[[8911,6419],[-6,-18]],[[8905,6401],[-17,8],[-19,-55],[16,-9],[-7,-20],[45,-23],[12,-7],[-10,3],[-8,4],[-16,7],[-19,5],[-44,13],[-8,3],[-37,10],[-7,2]],[[8822,6443],[7,18],[1,4],[21,57]],[[8851,6522],[9,-4],[10,-5],[-16,-43],[-2,-3],[-5,-15],[64,-33]],[[8918,6437],[-7,-18]],[[8851,6522],[8,22]],[[8859,6544],[9,-5],[32,-15],[41,-21]],[[8941,6503],[-8,-22],[-15,-44]],[[8802,6657],[-9,-25],[-8,-23],[36,-18],[5,-3],[8,24],[28,-14],[11,-5],[3,-2]],[[8876,6591],[-9,-23],[-8,-24]],[[8704,6502],[44,121],[4,12],[3,5],[5,11],[0,2]],[[8760,6653],[16,-11],[2,3],[4,-3],[7,17],[-1,4]],[[8788,6663],[5,-2],[9,-4]],[[8885,6616],[-9,-25]],[[8802,6657],[9,-5],[23,-11],[10,-5],[9,-4],[22,-11],[7,-3],[3,-2]],[[8911,6689],[-8,-23],[-9,-26],[-9,-24]],[[8802,6657],[8,24],[10,25]],[[8820,6706],[9,-4],[23,-11],[10,-5],[8,23],[9,-4],[19,-10],[3,-1],[7,-4],[3,-1]],[[8820,6706],[8,23],[8,22]],[[8836,6751],[8,21]],[[8844,6772],[9,-4],[23,-11],[9,-5],[9,-4],[23,-11],[7,-4],[3,-1]],[[8927,6732],[-8,-22],[-8,-21]],[[8934,6753],[-7,-21]],[[8844,6772],[8,22],[22,-11],[8,23],[8,22],[11,-5],[8,-4]],[[8909,6819],[8,-4],[11,-5],[11,-6],[9,-4],[2,-1]],[[8950,6799],[-8,-24],[-8,-22]],[[8921,6854],[-7,-19],[-5,-16]],[[8836,6751],[-30,14],[-10,5],[-23,12],[-16,13]],[[8757,6795],[-40,29],[-26,19]],[[8691,6843],[2,15],[4,17]],[[8697,6875],[5,20],[22,-8]],[[8724,6887],[37,-15]],[[8761,6872],[63,-24],[3,7],[1,2],[5,14]],[[8833,6871],[40,-18],[6,18],[32,-14],[10,-3]],[[8833,6871],[6,17]],[[8839,6888],[6,17],[6,20],[31,-10],[10,-3],[10,-3],[32,-12]],[[8934,6897],[-6,-24],[-7,-19]],[[8761,6872],[8,24],[5,19]],[[8774,6915],[10,-4],[45,-19],[10,-4]],[[8724,6887],[7,25],[7,24],[-60,23]],[[8678,6959],[7,24],[21,-9],[14,-6],[25,-8],[37,-13],[-1,-7],[-1,-8],[-4,-12],[-2,-5]],[[8697,6875],[-20,8]],[[8677,6883],[6,20],[-19,7],[7,25],[7,24]],[[8677,6883],[-19,9],[-11,4],[-34,22],[6,9],[8,24],[-6,9],[3,8],[-10,4],[-6,-1]],[[8608,6971],[3,15],[5,-3],[62,-24]],[[8691,6843],[4,-15],[10,-7],[-5,-8]],[[8700,6813],[-15,10],[-37,27]],[[8648,6850],[1,3],[4,13],[0,6],[-68,48]],[[8585,6920],[-71,51]],[[8514,6971],[10,20]],[[8524,6991],[8,15],[7,14]],[[8539,7020],[52,-37]],[[8591,6983],[0,-5],[13,-8],[4,1]],[[8631,6817],[-3,2],[-1,-3],[-35,26],[-36,25]],[[8556,6867],[2,3],[9,18],[8,14],[10,18]],[[8648,6850],[-1,-2],[-7,-13],[-9,-18]],[[8631,6817],[-2,-3],[-8,-17],[-7,-16],[-1,-3]],[[8613,6778],[-3,2],[-17,8],[-24,13],[-18,9],[-17,8],[-19,10],[-18,8],[-2,1],[-15,8]],[[8480,6845],[10,24],[10,22],[6,12]],[[8506,6903],[24,-17],[26,-19]],[[6775,2827],[-12,9],[-13,9],[-9,7]],[[6741,2852],[2,4],[8,18],[10,17]],[[6761,2891],[35,-26]],[[6796,2865],[-10,-17],[-9,-17],[-1,-2],[-1,-2]],[[6724,2819],[-21,15],[6,11],[3,5],[5,10],[20,-15],[2,4],[2,3]],[[7230,1149],[-6,-29],[-4,-21]],[[7220,1099],[-59,16],[-4,-23]],[[7157,1092],[-16,4]],[[7141,1096],[-2,1]],[[7139,1097],[4,21]],[[7143,1118],[9,20],[13,33]],[[7165,1171],[10,-7],[18,-6],[18,-5],[19,-4]],[[7210,1077],[-33,10]],[[7177,1087],[-18,4],[-2,1]],[[7220,1099],[-4,-12],[-6,-10]],[[7177,1087],[-7,-34],[25,-1],[-12,-21]],[[7183,1031],[-35,0],[-20,0]],[[7128,1031],[13,65]],[[7188,963],[-1,0],[-2,1],[-23,-1],[-8,0]],[[7154,963],[-10,1]],[[7144,964],[-49,1]],[[7095,965],[0,24],[11,0],[1,21]],[[7107,1010],[63,0],[13,21]],[[7210,1077],[37,-9],[-1,-5],[-58,-100]],[[7107,1010],[3,21]],[[7110,1031],[18,0]],[[7110,1031],[5,28],[4,20],[-51,11],[7,24]],[[7075,1114],[10,-3]],[[7085,1111],[39,-10],[15,-4]],[[7095,965],[-51,0]],[[7044,965],[-5,0],[-7,1],[-7,1]],[[7025,967],[6,23],[20,-1],[16,57],[-19,2],[-2,-8],[-11,3]],[[7035,1043],[2,7],[21,70]],[[7058,1120],[10,-4],[7,-2]],[[7025,967],[-17,6],[-24,10]],[[6984,983],[-17,7]],[[6967,990],[15,53],[3,5],[5,4],[8,3],[7,0],[13,-5],[17,-7]],[[6967,990],[-32,12],[-7,2],[-3,0]],[[6925,1004],[7,7],[6,7],[3,4],[7,12]],[[6948,1034],[67,103]],[[7015,1137],[2,-1],[24,-10],[9,-3],[8,-3]],[[6948,1034],[-2,2],[-24,20]],[[6922,1056],[-14,11]],[[6908,1067],[10,17],[11,18]],[[6929,1102],[11,16],[11,17]],[[6951,1135],[11,17],[14,-11],[12,17]],[[6988,1158],[24,-19],[3,-2]],[[6951,1135],[-44,33]],[[6907,1168],[9,17]],[[6916,1185],[19,-13],[10,17]],[[6945,1189],[43,-31]],[[6929,1102],[-41,30]],[[6888,1132],[9,18]],[[6897,1150],[10,18]],[[6908,1067],[-39,29]],[[6869,1096],[9,19],[10,17]],[[6869,1096],[-32,23]],[[6837,1119],[6,21],[5,20],[7,22]],[[6855,1182],[42,-32]],[[6922,1056],[-10,-16]],[[6912,1040],[-81,59]],[[6831,1099],[6,20]],[[6912,1040],[-14,-22],[-20,15],[-7,-12],[-52,39],[4,13],[8,26]],[[6925,1004],[-9,-8],[-10,-7],[-33,-20],[-23,-14],[-21,-12]],[[6829,943],[-2,2],[-8,13],[-12,16],[-8,12],[-4,3],[-10,17]],[[6785,1006],[-9,13],[-4,7]],[[6772,1026],[-4,4],[-7,12],[-5,8],[-8,12],[-3,5],[-5,7],[-38,57]],[[6702,1131],[-1,4],[-9,15],[-9,13],[-9,14],[-4,6],[-11,17],[-4,6],[-1,1],[-7,10],[-4,5],[-18,24],[-5,8],[-10,19],[-3,8],[-1,1]],[[6606,1282],[4,3],[6,2],[48,32],[23,17],[40,25],[54,36],[48,30]],[[6829,1427],[3,-5],[4,-3],[11,-9],[53,-41],[43,-31],[-12,-17]],[[6931,1321],[-11,-15],[-12,-16]],[[6908,1290],[-12,-15],[-12,-16],[-12,-15]],[[6872,1244],[-12,-16],[-13,-16],[13,-10],[-5,-20]],[[6872,1244],[38,-28],[-10,-19],[16,-12]],[[6908,1290],[51,-37]],[[6959,1253],[-10,-16],[-11,-17],[16,-12]],[[6954,1208],[-9,-19]],[[6931,1321],[48,-36]],[[6979,1285],[-10,-15],[-10,-17]],[[7009,1262],[-40,-64]],[[6969,1198],[-15,10]],[[6979,1285],[17,-12],[13,-11]],[[7009,1262],[16,-11]],[[7025,1251],[-41,-65],[-15,12]],[[7079,1236],[-29,-45],[-35,-54]],[[7025,1251],[16,-13],[10,19],[25,-19],[3,-2]],[[7111,1185],[-24,19],[-11,-18],[27,-20],[-15,-34],[-3,-21]],[[7079,1236],[9,-6],[32,-26],[-9,-19]],[[8252,1733],[-17,-43],[-3,-12],[-6,-11],[-4,-12],[-9,-19],[-4,-10]],[[8209,1626],[-34,1]],[[8175,1627],[-11,0],[-4,1]],[[8160,1628],[0,9],[1,11],[1,17]],[[8162,1665],[1,19],[2,25]],[[8165,1709],[1,29],[0,3]],[[8166,1741],[35,-2],[4,-3],[47,-3]],[[8166,1741],[2,25]],[[8168,1766],[56,-5],[12,22],[5,10],[3,11]],[[8244,1804],[5,18]],[[8249,1822],[4,20]],[[8253,1842],[1,19]],[[8254,1861],[2,27]],[[8256,1888],[54,-14],[1,1]],[[8311,1875],[-12,-28],[-7,-14],[-10,-26],[-5,-11],[-12,-29],[-3,-10],[-7,-13],[-3,-11]],[[8168,1766],[1,23]],[[8169,1789],[2,20]],[[8171,1809],[73,-5]],[[8171,1809],[0,19]],[[8171,1828],[78,-6]],[[8171,1828],[2,19]],[[8173,1847],[80,-5]],[[8173,1847],[0,20]],[[8173,1867],[81,-6]],[[8173,1867],[2,27]],[[8175,1894],[12,-1],[69,-5]],[[8175,1894],[1,29]],[[8176,1923],[12,-1],[70,-5]],[[8258,1917],[-2,-29]],[[8176,1923],[2,29]],[[8178,1952],[83,-7],[-3,-28]],[[8178,1952],[2,30]],[[8180,1982],[82,-6],[-10,30]],[[8252,2006],[7,0]],[[8259,2006],[1,-1],[7,-1],[1,-2],[2,-4],[51,1]],[[8321,1999],[0,-18],[-2,-39],[0,-31],[-4,-15],[-4,-21]],[[8380,2225],[-1,0],[-10,-3],[-12,-8],[-9,-5],[-4,-1],[-5,-8],[-7,-12],[-1,-39],[-2,-26],[-2,-26],[0,-16],[-4,-38],[-2,-15],[0,-29]],[[8259,2006],[1,2],[11,3],[1,4],[-1,7],[-1,4],[-1,6],[-4,29],[0,6],[0,9],[1,5],[1,6],[2,7],[3,12],[1,4],[1,5],[1,9],[-2,1],[-15,3],[-5,-9],[-4,0]],[[8249,2119],[1,11],[-3,6],[-3,5],[-3,5],[-34,15],[-3,1],[-3,0],[-4,-1],[-4,10],[-2,3]],[[8191,2174],[8,15],[2,1],[2,5]],[[8203,2195],[2,5],[6,14],[32,72],[6,12],[6,15],[5,8]],[[8260,2321],[1,-4],[37,-21],[10,-6],[3,-1],[68,-63],[1,-1]],[[7497,2612],[-92,70]],[[7405,2682],[1,2],[24,13],[27,12]],[[7457,2709],[72,-53]],[[7529,2656],[-15,-21],[-8,-11],[-9,-12]],[[7468,2570],[-91,68]],[[7377,2638],[12,22],[12,18],[4,4]],[[7497,2612],[-15,-22],[-14,-20]],[[7453,2548],[-17,-24]],[[7436,2524],[-28,22],[-27,20],[-17,12],[-13,11]],[[7351,2589],[14,25],[6,12],[6,12]],[[7468,2570],[-15,-22]],[[7403,2476],[-29,22],[-26,19],[-1,1],[-13,10],[-20,14]],[[7314,2542],[13,15],[12,16],[12,16]],[[7436,2524],[-21,-32],[-12,-16]],[[7395,2464],[-13,-20]],[[7382,2444],[-91,69]],[[7403,2476],[-8,-12]],[[7346,2393],[-89,66]],[[7267,2476],[90,-67]],[[7357,2409],[-11,-16]],[[7346,2393],[-9,-12],[-9,-8]],[[7328,2373],[-14,11],[-59,43],[-10,8]],[[7310,2357],[-3,3],[-16,12],[-14,10],[-16,12],[-10,8],[-9,6],[-8,7]],[[7328,2373],[-6,-6],[-2,-2],[-2,-2],[-2,-1],[-2,-1],[-4,-3],[0,-1]],[[7310,2357],[-3,-2],[-1,0],[0,-1],[-6,-5],[-17,-15]],[[7283,2334],[-11,7],[-47,35],[-9,7]],[[7216,2383],[-10,7],[-22,17],[-10,7]],[[7174,2414],[-33,25]],[[7179,2245],[-3,1],[-11,9],[-14,9]],[[7151,2264],[6,10],[6,11],[10,19],[11,20],[5,9],[5,10],[11,20],[11,20]],[[7283,2334],[-18,-15],[-18,-15]],[[7247,2304],[-8,-8],[-9,-7],[-17,-14]],[[7213,2275],[-17,-15],[-17,-15]],[[6740,2142],[-10,-22]],[[6730,2120],[-11,-5],[-56,36],[-17,-7]],[[6646,2144],[11,23]],[[6657,2167],[10,22]],[[6667,2189],[73,-47]],[[6667,2189],[9,19],[9,19],[9,19]],[[6694,2246],[74,-47]],[[6768,2199],[-10,-19]],[[6758,2180],[-9,-19],[-9,-19]],[[6792,2242],[-10,-12],[-5,-11],[-9,-20]],[[6694,2246],[10,20],[9,19]],[[7502,7769],[-14,21],[-21,35],[3,2],[14,13],[-22,33],[7,8],[9,10],[15,14],[11,12],[15,21],[9,12],[9,14]],[[7537,7964],[13,-10],[4,-5],[3,-4],[2,-5],[1,-6],[0,-10],[-2,-9],[11,-8],[5,-9],[-11,-21],[-1,-5],[1,-3],[6,-9]],[[7569,7860],[-3,-2],[-17,-15],[-22,-19],[-10,-8],[9,-14],[6,-8]],[[7532,7794],[-14,-12],[-16,-13]],[[7452,7720],[-2,3],[-50,77]],[[7400,7800],[-10,11]],[[7390,7811],[6,6],[24,27],[6,5],[21,27],[14,15],[10,8],[10,10],[5,6],[19,25],[11,18],[8,14],[4,5],[4,6],[3,6],[4,14],[1,2]],[[7540,8005],[-3,-41]],[[7502,7769],[3,-4],[-17,-14]],[[7488,7751],[-16,-14],[-18,-15],[-2,-2]],[[7427,7998],[5,-4],[4,0],[1,1],[3,4],[11,15],[11,12],[12,9],[10,3],[12,0],[7,5],[9,3],[-1,-8],[-10,-14],[-17,-18],[-10,-14],[-13,-9],[-9,-9],[-9,-12],[-23,-6],[-8,-9],[-8,-4],[-10,0],[-10,-2],[-9,-12],[0,-9],[7,-5],[14,3],[11,9],[11,7],[10,5],[4,0],[-1,-4],[3,1],[-2,-4],[-5,-7],[-5,-5],[-15,-13],[-22,-12],[-3,-5],[-5,-3],[-14,-1],[-15,3],[-12,7],[-2,4],[-3,5],[0,8],[3,7],[13,17],[12,8],[12,14],[5,10],[5,17],[7,2],[9,8],[5,13],[22,27],[25,22],[4,9],[7,10],[10,8],[5,6],[3,0],[2,-8],[-4,-6],[-16,-17],[-12,-16],[-18,-32],[-3,-14]],[[7413,7680],[-3,2],[-3,2],[-18,12],[-5,6],[-17,26]],[[7367,7728],[-11,19],[12,12],[6,7],[4,5],[11,14],[11,15]],[[7452,7720],[-2,-2],[-11,-10],[-11,-11],[-15,-17]],[[7382,7644],[-3,4],[-29,-34]],[[7350,7614],[-14,22]],[[7336,7636],[7,9],[7,8],[15,17],[-23,35],[3,3],[5,5]],[[7350,7713],[17,15]],[[7413,7680],[-3,-3],[-28,-33]],[[8063,8419],[-14,-13],[-26,41],[-2,4],[-2,6],[-9,15],[-18,-17]],[[7992,8455],[-50,-44],[-12,-9]],[[7930,8402],[-13,-10],[-22,-18],[-4,-5],[-14,-23],[-15,-24]],[[7862,8322],[-14,13]],[[7848,8335],[4,5],[8,10],[6,10],[12,10],[3,8],[2,3],[15,14],[16,5],[13,15],[12,5],[25,18],[9,10],[8,7],[3,7],[3,1],[6,1],[3,6],[7,10],[8,5],[8,11],[17,14],[5,8],[7,13],[2,7],[5,24],[5,7],[8,5],[18,2],[5,1],[3,1]],[[8094,8578],[1,-3],[4,-4],[4,-6],[14,-24],[-9,-6],[17,-26],[15,-25]],[[8140,8484],[-13,-11],[-22,-18],[-15,-13],[-14,-12],[-13,-11]],[[8030,8317],[-13,-18]],[[8017,8299],[-2,3],[-32,48],[-12,-13],[-1,2],[-16,24],[-2,10],[-10,14],[-7,7],[-5,8]],[[7992,8455],[40,-63],[-16,-14],[-17,-14],[29,-44],[2,-3]],[[8063,8419],[26,-40],[2,-3]],[[8091,8376],[-15,-13],[-16,-13],[-9,-8],[-8,-8],[-4,-5],[-5,-6],[-4,-6]],[[8076,8241],[-14,-14]],[[8062,8227],[-45,72]],[[8091,8376],[26,-41]],[[8117,8335],[-15,-13],[-17,-13],[-16,-15],[-17,-14],[24,-39]],[[8117,8335],[50,-79]],[[8167,8256],[-15,-13],[-17,-13],[-7,-7]],[[8128,8223],[-22,-20],[-3,0],[-2,1],[-10,15],[-14,21],[-1,1]],[[8180,8268],[-13,-12]],[[8117,8335],[13,11],[13,11],[16,14],[21,18],[12,11]],[[8192,8400],[49,-78]],[[8241,8322],[-12,-11],[-21,-18],[-15,-14],[-13,-11]],[[8140,8484],[24,-40],[3,-4],[25,-40]],[[8140,8484],[14,13],[15,12],[18,16],[13,11],[12,10],[24,-41],[2,-3]],[[8238,8502],[24,-41],[-8,-8]],[[8254,8453],[-14,-12],[-17,-15],[-16,-13],[-15,-13]],[[8254,8453],[47,-79]],[[8301,8374],[-12,-10],[-18,-16],[-15,-14],[-15,-12]],[[6673,3425],[-3,-2],[-12,6],[-23,11],[-19,9],[-21,10]],[[6595,3459],[13,37],[3,9]],[[6611,3505],[7,19],[13,37],[19,54]],[[6650,3615],[12,1],[3,0],[13,1],[45,-21],[-2,-5],[-2,-6],[-8,-14],[-6,-12],[13,-6]],[[6718,3553],[-20,-11],[-2,-17],[-2,-9],[-5,-15],[-3,-10],[-3,-4],[-3,-2],[-6,-1],[19,-10],[-18,-32],[1,-14],[0,-2]],[[6676,3426],[-3,-1]],[[6489,3426],[17,50],[0,6],[0,3],[7,6],[18,53]],[[6531,3544],[18,-9],[19,-10],[20,-9],[23,-11]],[[6595,3459],[-25,-70],[-2,0],[-20,11],[-20,9],[-19,8],[-20,9]],[[6673,3425],[2,-3],[3,-2],[-4,-6],[-4,-10],[-5,-9],[-13,-24],[-21,-38]],[[6631,3333],[-3,2],[-1,0],[-22,11],[-32,15],[-91,42]],[[6482,3403],[7,23]],[[6482,3403],[-22,10],[-20,9],[-25,11],[-25,12]],[[6390,3445],[35,98]],[[6425,3543],[24,-12],[5,-2],[4,-2],[4,-2],[4,-5],[5,-8],[19,52],[19,-10],[22,-10]],[[6631,3333],[-15,-27],[-6,-10]],[[6610,3296],[-89,76],[-34,17],[-5,-3]],[[6482,3386],[-88,-16],[-67,32],[-4,-14]],[[6323,3388],[-9,4],[6,22],[12,33],[16,-7],[1,11],[2,12]],[[6351,3463],[18,-9],[21,-9]],[[6351,3463],[-28,13],[-15,7]],[[6308,3483],[8,23],[8,24],[0,4],[0,5],[-1,3],[-2,2],[-3,6],[0,3],[0,2],[15,36],[4,9],[5,12],[4,0],[6,2],[3,1],[5,-3],[1,-4],[2,-3],[11,-24],[1,-3],[6,-13],[20,-10]],[[6401,3555],[24,-12]],[[6551,3599],[-20,-55]],[[6401,3555],[12,32],[-6,11],[-2,3],[-7,18],[0,2],[0,2],[1,2],[1,3],[-2,1],[-2,0],[-3,1],[-2,2],[-7,16]],[[6384,3648],[24,16],[20,12],[7,4],[4,4],[8,7]],[[6447,3691],[0,-5],[2,-6],[1,-3],[3,-4],[2,-3],[4,-3],[13,-7],[6,-12],[1,-3],[7,-14],[23,-12],[21,-10],[21,-10]],[[6308,3483],[-3,1],[-25,12],[-8,5],[-2,1],[-2,2]],[[6268,3504],[2,6],[4,12],[2,3],[1,4],[4,11],[2,4],[6,16],[1,2],[1,3],[7,17],[6,16],[8,22],[7,18],[24,62],[5,13],[1,3],[1,5],[1,2],[1,3],[2,4],[8,22],[13,31],[2,4],[6,15],[0,1],[14,33],[2,7],[13,31],[4,10],[5,12]],[[6421,3896],[1,-1]],[[6422,3895],[3,-1],[-9,-22],[-13,-31]],[[6403,3841],[-12,-27],[-12,-33]],[[6379,3781],[-13,-31],[-12,-33],[18,-9],[-25,-61],[-2,-7],[0,-8],[5,-1],[2,-3],[32,20]],[[5790,4258],[-10,12],[7,5],[18,10],[-11,19],[-12,19]],[[5782,4323],[19,15],[18,21],[-15,13],[12,16]],[[5816,4388],[62,-54],[-10,-18],[-8,-13],[-9,0],[-36,-35],[-1,-6],[-24,-4]],[[7151,2264],[-41,31]],[[7110,2295],[5,11],[6,10],[11,19]],[[7132,2335],[10,20],[11,19]],[[7153,2374],[11,20],[10,20]],[[7179,2245],[-16,-13]],[[7163,2232],[-4,-4],[-13,-10],[-11,-9],[-5,-5]],[[7130,2204],[-18,-14]],[[7112,2190],[-14,11],[-20,15],[-8,6]],[[7070,2222],[6,10],[8,15],[7,13],[7,13],[6,12],[6,10]],[[7230,2182],[-54,40],[-5,4],[-6,4],[-2,2]],[[7179,2245],[3,-1],[5,-4],[59,-44]],[[7246,2196],[-8,-7],[-8,-7]],[[7197,2154],[-4,4],[-51,37],[-5,3],[-7,6]],[[7230,2182],[-9,-7],[-8,-7],[-16,-14]],[[7180,2140],[-59,44],[-9,6]],[[7197,2154],[-7,-7],[-10,-7]],[[7160,2125],[-50,37],[-7,6],[-8,6]],[[7095,2174],[17,16]],[[7180,2140],[-7,-4],[-4,-3],[-9,-8]],[[7120,2091],[-65,48]],[[7055,2139],[22,19],[18,16]],[[7160,2125],[-10,-8],[-8,-7],[-22,-19]],[[7055,2139],[-21,16]],[[7034,2155],[13,25],[11,21]],[[7058,2201],[12,21]],[[7005,2096],[-46,33]],[[6959,2129],[11,21],[11,21],[12,21]],[[6993,2192],[5,-7],[3,-6],[33,-24]],[[7055,2139],[-15,-13],[-12,-11]],[[7028,2115],[-7,-6],[-7,-5],[-4,-3],[-5,-5]],[[7120,2091],[-27,-24]],[[7093,2067],[-65,48]],[[7093,2067],[-21,-21],[-67,50]],[[7016,1990],[-5,4]],[[7011,1994],[2,2],[42,36],[-23,16],[-9,-8],[-7,-6],[-18,14],[16,14],[-10,8],[-16,11]],[[6988,2081],[17,15]],[[7246,2196],[5,-3]],[[7251,2193],[-17,-14],[-33,-28],[-17,-15],[-15,-13],[-3,-2],[-17,-15],[-21,-18],[-2,-1]],[[7126,2087],[-27,-24],[-23,-20],[-17,-15],[-41,-36],[-2,-2]],[[6950,1933],[-6,3]],[[6944,1936],[16,15]],[[6960,1951],[18,14],[-68,44],[-4,0]],[[6906,2009],[37,33]],[[6943,2042],[7,-3],[10,-8],[14,-10],[4,-3],[2,-1],[11,-8],[20,-15]],[[7016,1990],[-3,-2],[-25,-22],[-38,-33]],[[6960,1951],[-69,45]],[[6891,1996],[15,13]],[[6944,1936],[-38,-33]],[[6906,1903],[-70,45]],[[6836,1948],[8,7]],[[6844,1955],[21,18],[9,8],[11,10]],[[6885,1991],[6,5]],[[8658,1867],[-4,5],[-21,28]],[[8633,1900],[10,11],[7,9]],[[8650,1920],[11,-9],[8,-4],[7,16],[6,15],[8,-3],[7,-4],[6,-6],[4,-2],[5,-2],[-4,-23],[-1,-8],[-6,-15],[-30,7],[-11,-12],[-2,-3]],[[8688,1948],[-25,10]],[[8663,1958],[12,57]],[[8675,2015],[10,-5],[8,-7],[-8,-44],[6,-2],[-3,-9]],[[8675,2015],[-31,9],[-1,3],[-3,1],[-3,-2],[-7,5],[-15,7]],[[8615,2038],[5,12],[4,11],[3,9],[2,7],[1,10],[-1,14],[1,4],[-1,0],[0,-1],[-1,0],[-1,0],[-1,0],[-1,0],[-1,1],[-1,1],[-1,2],[0,1],[0,2],[1,2],[0,1],[1,1],[-2,4],[-11,23],[-10,20],[-5,11],[-1,0],[-1,1],[-2,1],[-1,2],[-1,3]],[[8590,2180],[1,2],[0,1],[1,2],[2,1],[-2,12],[-1,3],[1,3],[0,3],[2,7],[3,10],[3,10],[3,7],[2,5],[4,7],[7,13],[2,3],[2,5],[1,0],[3,-1],[2,5],[17,33],[11,21],[4,9],[2,0],[12,27],[6,14],[3,8],[2,4]],[[8683,2394],[4,0],[7,2],[30,17],[8,1],[18,2],[3,3],[1,-4],[3,-8],[10,-7],[2,-2],[2,-8],[5,-12],[5,-8],[5,-12],[5,-12],[1,-6],[7,-8],[9,-12],[4,-12],[6,-11],[5,-14],[3,-11],[5,-7],[4,-3],[1,-5],[0,-6],[3,-6],[4,-2]],[[8843,2243],[-17,2],[0,-4],[1,-4],[-1,-8],[-1,-5],[-1,-5],[-3,-9],[-2,-6],[-4,-8],[-3,-4],[-5,-7],[-6,-5],[-5,-5]],[[8796,2175],[-10,-7],[-9,-4],[-12,-5],[-9,-4],[5,-14],[1,-8],[-1,-6],[0,-3],[-1,-3]],[[8760,2121],[-1,-4],[0,-2],[-2,-3],[-1,-4],[-8,-10],[-6,-6],[-10,15],[-6,18],[-24,-10],[3,-10],[15,-18],[6,-9],[-7,-6],[-5,-4],[-6,-6],[-14,-11],[-8,-11],[-7,-12],[-4,-13]],[[8796,2175],[4,-5],[11,-14],[15,-15],[0,-3],[-2,-4],[-8,-10],[-5,-4],[-2,-2],[-2,-2],[-2,-4],[-10,-15],[-3,-1],[-3,2],[-13,9],[-11,10],[-2,0],[-3,4]],[[6818,2142],[-60,38]],[[6865,2225],[-23,-40],[-14,-25],[-10,-18]],[[6878,2090],[-15,-27]],[[6863,2063],[-16,10],[16,29],[-14,15],[-14,14],[-17,11]],[[6865,2225],[62,-44],[-11,-21]],[[6916,2160],[-11,-20],[-27,-50]],[[6959,2129],[-43,31]],[[6888,2268],[62,-45]],[[6950,2223],[43,-31]],[[6988,2081],[-45,-39]],[[6943,2042],[-17,13],[-48,35]],[[6950,2223],[11,21],[11,20]],[[6972,2264],[86,-63]],[[6909,2311],[10,-7],[43,-32],[10,-8]],[[6999,2314],[-1,-3],[-12,-22],[-2,-3],[-12,-22]],[[7024,2359],[86,-64]],[[7046,2399],[86,-64]],[[7068,2438],[85,-64]],[[6694,2246],[-72,47]],[[6622,2293],[6,15],[3,5],[9,20]],[[6640,2333],[73,-48]],[[6640,2333],[-33,22]],[[6607,2355],[20,15],[3,4],[8,6]],[[6638,2380],[9,6],[4,4],[10,8],[3,3],[15,16],[3,2]],[[6603,2255],[-48,31],[-1,1]],[[6554,2287],[4,5]],[[6558,2292],[9,12],[13,17]],[[6580,2321],[19,24]],[[6599,2345],[8,10]],[[6622,2293],[-10,-19],[-9,-19]],[[6599,2345],[-2,3],[-58,43],[11,19],[8,16],[3,5]],[[6561,2431],[77,-51]],[[6580,2321],[1,5],[-54,41]],[[6527,2367],[-70,50]],[[6457,2417],[12,24],[11,19],[8,15],[4,8]],[[6492,2483],[69,-52]],[[6492,2483],[17,30]],[[6509,2513],[14,26]],[[6523,2539],[13,-10],[22,-17],[-3,-12],[-2,-11],[24,-3],[12,-3],[9,-4],[8,-6],[22,-18],[11,-5],[10,-8],[33,-23]],[[6523,2539],[37,68]],[[6560,2607],[34,-26]],[[6594,2581],[35,-25],[-2,-5],[-5,-8],[-5,-11],[21,-17],[24,-14],[15,-7]],[[6594,2581],[13,23],[13,24],[13,24],[36,-26]],[[6560,2607],[6,10],[4,8],[1,10],[-2,30],[0,2],[0,18]],[[6569,2685],[1,6],[2,5],[1,5],[2,3],[9,17],[13,24],[10,18],[1,2],[0,2],[13,23]],[[6621,2790],[62,-46]],[[6621,2790],[12,22],[13,24]],[[6646,2836],[23,-18],[30,-22],[9,-7]],[[6621,2790],[-62,47]],[[6559,2837],[12,22],[13,23]],[[6584,2882],[53,-40],[9,-6]],[[6584,2882],[10,19],[6,10]],[[6600,2911],[20,-15],[21,-16],[6,11],[3,6],[5,9],[21,-15]],[[6676,2891],[-5,-10],[-3,-5],[-6,-11],[-6,-10],[-10,-19]],[[6679,2898],[-2,-3],[-1,-4]],[[6600,2911],[-18,14],[-18,12],[-17,14]],[[6547,2951],[9,16],[4,7]],[[6560,2974],[2,2],[2,1],[3,3]],[[6567,2980],[6,-4],[18,-13],[10,-7],[1,-1],[5,-4],[9,-6]],[[6616,2945],[32,-23],[11,-9],[20,-15]],[[6616,2945],[2,4],[8,18],[10,18],[5,8],[11,9]],[[6652,3002],[24,-17],[19,-14],[18,-14]],[[6713,2957],[-9,-10],[-6,-9]],[[6698,2938],[-9,-18],[-9,-18],[-1,-4]],[[6567,2980],[1,1],[2,2],[10,18],[10,18],[12,21]],[[6602,3040],[40,-30],[10,-8]],[[6741,2852],[-1,1],[-61,45]],[[6698,2938],[63,-47]],[[8269,3639],[9,-6]],[[8278,3633],[-10,-19],[-3,-5],[-3,-6],[-8,-16],[-9,-15]],[[8245,3572],[-30,24],[-29,22],[-26,20],[-27,21]],[[8133,3659],[4,18]],[[8137,3677],[5,16]],[[8142,3693],[4,14]],[[8146,3707],[6,20]],[[8152,3727],[18,-14],[30,-22]],[[8200,3691],[-4,-22],[-6,-32],[34,-26]],[[8224,3611],[14,-11],[2,-2],[9,16],[1,1],[9,7],[2,2],[8,15]],[[8224,3611],[1,2],[23,42],[19,35]],[[8267,3690],[13,-11],[-10,-19],[-5,-17],[1,-1],[2,-1],[1,-2]],[[8200,3691],[9,42],[2,-1],[27,-21],[16,-12],[13,-9]],[[5608,4321],[12,16],[2,0],[1,1],[-1,1],[4,5]],[[5626,4344],[4,5]],[[5630,4349],[5,-5],[-11,-17],[33,-32],[8,18],[7,13]],[[5672,4326],[43,-45],[2,-2],[10,20]],[[5727,4299],[12,-13],[-3,-5],[-1,-4],[-2,-4],[-2,-3],[-1,-4],[-2,-4],[0,-3],[2,-1],[12,-2],[2,0],[2,5],[2,3],[1,3],[3,5],[16,-16],[22,2]],[[5816,4388],[11,17],[12,24],[2,4]],[[5841,4433],[51,-38],[13,-10],[3,-3]],[[5908,4382],[-1,-4]],[[5907,4378],[-7,-18],[-5,-12],[-29,-75]],[[5866,4273],[-4,-1],[-10,-4],[-19,-8],[-5,-1],[-3,-2],[-4,-1],[-4,-1]],[[5817,4255],[-5,-1],[-3,-1],[-4,-1],[-4,-1],[-5,-1],[-4,-1],[-3,0],[-4,-1],[-4,0],[-5,0],[-3,-1],[-6,0],[-5,0],[-7,0],[-7,1],[-6,0],[-6,1],[-4,1],[-4,0],[-4,1],[-5,1],[-5,2],[-4,1],[-4,1],[-10,3],[-4,2],[-4,1],[-6,3],[-5,2],[-4,3],[-4,2],[-4,2],[-3,2],[-8,4],[-4,4],[-4,2],[-3,2],[-3,3],[-3,2],[-3,3],[-3,3],[-3,2],[-10,10],[-10,10]],[[5727,4299],[3,8],[7,9],[5,4],[11,6]],[[5753,4326],[20,14]],[[5773,4340],[9,-17]],[[5672,4326],[9,20],[10,18]],[[5691,4364],[12,16],[29,-30],[18,-19],[2,-2],[1,-3]],[[5691,4364],[-13,14],[-15,14]],[[5663,4392],[47,61]],[[5710,4453],[13,-11],[15,-12],[31,-28],[-11,-17],[-12,-18],[23,-23],[2,-1],[2,-3]],[[5630,4349],[10,12],[12,16]],[[5652,4377],[11,15]],[[5652,4377],[-54,56]],[[5598,4433],[12,15]],[[5610,4448],[27,-28],[12,16],[19,27],[14,-12],[12,17],[16,-15]],[[9686,9775],[-1,-1],[-1,-1],[-36,-32],[-3,-2],[-2,-2],[-6,-6],[-7,-7],[-4,-5],[-5,-6],[-7,-10],[-6,-8],[-6,-11],[-2,-5]],[[9600,9679],[-4,-9],[-4,-10],[-4,-12],[-5,-26],[-1,-3],[-1,-6],[-7,-33]],[[9574,9580],[-6,-27],[-7,-25],[-4,-16],[-6,-28],[-16,-74],[-14,-65],[-10,-51]],[[9511,9294],[-10,-47],[-14,-67]],[[9487,9180],[-14,-68]],[[9473,9112],[-11,-50]],[[9462,9062],[-4,-1],[-8,-3],[-183,-67],[-130,-40]],[[9137,8951],[0,6],[1,6],[0,5],[1,6],[1,5],[0,5],[1,4],[1,9],[2,7],[2,12],[2,6],[1,6],[4,13],[6,23],[116,418],[29,103],[2,7],[22,78],[2,9],[1,4],[3,13],[2,7],[1,4],[1,9],[2,9],[0,4],[1,6],[1,4],[1,10],[0,6],[0,4],[1,3],[0,7],[0,41],[-3,0],[0,1],[0,12],[0,5],[0,6],[0,4]],[[9341,9838],[4,1],[6,2],[19,6],[6,2],[11,5],[8,3],[28,4],[5,-1],[4,-2],[2,-2],[3,-3],[2,-5],[2,-5],[3,-13],[5,-12],[2,-10],[1,-3],[1,-8],[5,-9],[10,-10],[14,-9],[11,-4],[9,0],[13,3],[13,-22],[2,-3],[9,-15],[3,-3],[2,0],[2,0],[32,13],[4,1],[-13,20],[11,9],[2,4],[-1,4],[-5,13],[14,3],[9,2],[9,3],[9,2],[5,0],[3,-1],[10,-2],[45,-12],[14,8],[1,0],[1,-1],[1,-1],[3,-4]],[[9700,9786],[-2,-2],[-10,-8],[-2,-1]],[[9673,9553],[-5,-24]],[[9668,9529],[-1,-3],[-1,-5],[-1,-11],[-2,-10],[-2,-17],[-2,-12],[-2,-12],[0,-9],[-7,-140]],[[9650,9310],[-30,-15],[-41,-6],[-36,1],[-32,4]],[[9574,9580],[37,-11],[1,9],[4,16],[5,23],[34,-9],[20,-6]],[[9675,9602],[-6,-33],[-3,-14],[7,-2]],[[9853,9901],[0,-3],[-1,-13],[-3,-13],[-6,-23],[-2,-5],[-1,-5],[-1,-6],[0,-3],[0,-2],[0,-1],[0,-1],[0,-1],[-1,-1],[-1,-1],[-1,-2],[-1,0],[-1,-1],[-1,0],[-1,1],[-1,0],[-1,1],[-1,2],[-1,1],[-1,0],[-2,0],[-2,1],[-2,0],[-2,-1],[-10,-2]],[[9809,9823],[-43,-11]],[[9766,9812],[-3,-1],[-11,-2],[-20,-6],[-14,-6],[-11,-6],[-5,-4],[-2,-1]],[[9341,9838],[0,1],[1,5],[0,5]],[[9342,9849],[3,0],[6,-1],[14,2],[12,4],[8,6],[9,3],[25,1],[8,2],[4,-1],[12,1],[15,-6],[8,2],[3,-1],[4,-4],[0,-5],[9,1],[4,-2],[4,-2],[3,-5],[2,-6],[6,-32],[2,-6],[1,-1],[4,-4],[8,-1],[3,0],[3,0],[4,0],[8,-4],[1,-4],[-4,-3],[-4,-1],[-4,0],[-4,-2],[-1,-1],[1,-1],[3,0],[2,0],[6,1],[11,5],[23,14],[8,2],[11,3],[5,4],[6,5],[4,1],[12,-1],[7,4],[14,13],[9,1],[8,4],[5,3],[8,8],[3,1],[6,2],[5,5],[7,2],[8,6],[5,1],[13,8],[16,10],[21,8],[9,10],[5,5],[3,0],[10,-2],[8,2],[8,4],[7,1],[8,4],[2,2],[6,6],[2,0],[8,-4],[5,1],[3,2],[5,6],[3,2],[8,1],[5,3]],[[9850,9931],[1,-16],[1,-5],[1,-9]],[[9667,9996],[2,-4],[4,0],[4,-1],[2,-3],[-3,-7],[1,-14],[-2,-9],[-4,-1],[-5,0],[-6,-3],[-15,-10],[-7,-7],[-6,-3],[-6,-10],[-12,-9],[-4,-4],[-4,-7],[-3,-5],[-6,0],[-1,2],[0,7],[-1,4],[-3,-1],[-1,-9],[-5,-19],[-3,-8],[-14,-13],[-6,-4],[-6,-1],[-14,3],[-22,9],[-2,4],[-1,4],[-1,4],[1,6],[1,4],[0,5],[1,5],[-2,7],[-2,5],[-1,7],[1,7],[5,2],[11,6],[5,6],[-1,5],[3,5],[7,1],[9,0],[9,2],[8,4],[6,4],[18,4],[19,8],[10,2],[6,5],[1,1],[13,12],[15,5],[4,0],[3,-3]],[[9455,8069],[-41,10]],[[9414,8079],[-42,11]],[[9372,8090],[5,21],[4,21],[4,21],[-24,6],[0,9],[-1,9],[8,1],[23,-6],[2,0],[1,2],[6,26]],[[9400,8200],[4,-1],[14,-7],[4,8],[7,12],[5,7],[6,6],[6,10],[1,3]],[[9447,8238],[20,-5]],[[9467,8233],[-4,-9],[-8,-12],[-9,-9],[-2,-3],[-4,-7],[15,-8],[1,-3],[-3,-5],[-3,-8],[-5,-28],[0,-3],[2,-1],[7,-2],[13,-1],[-1,-9],[-3,-15],[-4,-21],[-4,-20]],[[9563,8153],[-7,8],[-15,4],[-9,-47],[-1,-2],[-4,0],[-18,5],[-5,-21],[-4,-21],[-4,-21]],[[9496,8058],[-41,11]],[[9467,8233],[3,11],[1,8],[3,12],[1,5]],[[9475,8269],[22,-6],[15,-4],[18,-4],[15,-4],[49,-12],[24,-6],[2,-1]],[[9619,8026],[-41,11],[-41,11]],[[9537,8048],[-41,10]],[[9562,7952],[-42,11]],[[9520,7963],[-41,10],[4,20],[4,21],[5,23],[4,21]],[[9537,8048],[-4,-21],[-5,-24],[42,-10],[-4,-21],[-4,-20]],[[9615,8005],[-4,-23],[-4,-21],[-4,-19],[-41,10]],[[9569,7926],[-56,15]],[[9513,7941],[7,22]],[[8590,2180],[-19,-7],[-12,-5],[-11,-4],[-6,-4],[-4,-5],[-3,-3],[-3,-4]],[[8532,2148],[-14,-17],[-5,-4],[-10,-5],[-7,-2],[-6,0],[-15,2]],[[8475,2122],[-9,1],[-8,-2],[-11,-4],[-8,-8],[-4,-8],[-3,-10],[-1,-8],[1,-29],[0,-9],[0,-4],[0,-6]],[[8432,2035],[-2,-6],[-4,-16],[-8,-24],[0,-5],[-1,-9],[0,-5],[0,-3],[2,-1],[3,-2],[7,-4],[7,-1],[11,-1]],[[8447,1958],[0,-10],[-4,-7],[-6,-3],[-4,-4],[-2,-3],[-3,-4],[-2,-5],[-1,-4],[-2,-9],[1,-9],[-1,-10],[-3,-6],[-5,-6],[-1,-3],[-1,-3],[-1,-2],[-1,-3],[0,-3],[0,-8],[4,-8]],[[8415,1848],[-48,25]],[[8367,1873],[9,30],[4,12],[7,32],[3,60],[5,36],[1,42],[1,35],[5,12],[8,16],[4,6],[21,15],[3,0],[27,6],[9,2],[19,0],[2,2],[5,7],[13,16],[7,6],[27,24],[8,11],[3,4],[4,5],[0,8],[2,6],[4,2],[3,6],[2,5],[1,4],[7,7],[6,3],[6,8],[12,6],[21,11],[7,9],[3,11],[8,12],[3,7],[5,4],[8,8],[4,7],[1,4],[6,12],[4,5],[4,-2],[1,-1],[3,0]],[[8475,2122],[-3,-41],[-18,1],[-2,-25],[0,-17],[-1,-3],[-3,-3],[-4,0],[-12,1]],[[8489,1978],[2,-2],[1,-3],[-1,-17]],[[8491,1956],[-4,0],[-40,2]],[[8532,2148],[4,-7],[-2,-3],[-7,-7],[-3,-6],[2,-8],[2,-9],[3,-16],[2,-9],[13,-9],[-5,-8],[-3,0],[0,-1],[1,-2],[0,-1],[-1,-3],[-2,-1],[-2,-1],[-2,-2],[-3,-1],[-6,-2],[-12,-2],[-11,-2],[-2,-1],[-2,-1],[-5,-7],[0,-14],[-1,-18],[-12,0],[0,-6],[11,0],[0,-23]],[[8615,2038],[-12,-6],[-1,3],[-16,12],[-4,0],[-11,-19],[-7,-12],[-1,-4],[2,-13],[0,-4],[-3,-3],[-2,-2],[-16,-4],[-17,-5],[-10,-2],[-9,-1],[-19,0]],[[8615,2038],[-20,-48],[-2,-7],[0,-8],[0,-10],[5,-13],[6,-10],[3,-7],[1,-2]],[[8608,1933],[-7,8],[-4,3],[-4,3],[-9,3],[-4,2],[-5,1],[-4,2],[-6,1],[-5,0],[0,-3],[0,-8],[0,-9],[0,-1],[-3,-7],[-3,-5],[-3,-4],[-5,6],[-7,9],[-3,1],[-2,0],[-2,1],[-2,0],[-12,1],[-7,0],[-23,1]],[[8488,1938],[2,2],[1,16]],[[8663,1958],[-1,-5],[0,-5],[-5,-13],[-7,-15]],[[8633,1900],[-16,20],[-9,13]],[[8633,1900],[-4,-3],[-26,-30],[-9,-10]],[[8594,1857],[-5,7],[-27,-13],[-8,8],[-39,-31],[0,-6]],[[8515,1822],[-100,26]],[[8415,1848],[27,20],[12,8],[5,4],[5,4],[5,5],[11,-16],[2,-1],[2,0],[2,2],[7,9],[2,2],[-1,3],[-2,4],[-11,16],[2,6],[3,8],[1,8],[1,8]],[[8633,1765],[-26,-29],[-10,-17],[-11,-16]],[[8586,1703],[-3,3],[-18,21],[-10,12],[-25,31],[13,16],[-24,28],[-5,5],[1,3]],[[8594,1857],[5,-6],[-1,-33],[5,-17],[27,-33],[3,-3]],[[8658,1867],[3,-7],[3,-8],[2,-9],[1,-12],[0,-11],[-3,-11],[-3,-7],[-6,-11],[-9,-11],[-13,-15]],[[8741,2856],[7,-18],[4,-4],[6,-10],[10,-20],[6,-18],[3,-18],[0,-32],[-44,-209],[-13,-38],[-6,-1],[-2,0],[-4,-1],[-3,-1],[-5,-3],[-18,-18],[-14,-16],[-12,-14],[-7,-8],[-13,-9],[-34,-29],[-59,-44],[-61,-48],[0,-5],[-1,0],[-5,-4],[-13,-11],[-27,-15],[-31,-10],[-6,-2],[-6,0],[-9,1],[-47,39],[-3,0],[0,-3],[26,-22],[13,-12],[1,-2],[12,-7],[9,-1],[-2,-5],[-7,-8],[-6,-5]],[[8260,2321],[2,5]],[[8262,2326],[1,2],[1,3],[7,14]],[[8271,2345],[9,20]],[[8280,2365],[10,23],[12,25],[11,23]],[[8313,2436],[10,27]],[[8323,2463],[4,-3],[17,-9],[19,-11],[12,31],[15,39]],[[8390,2510],[1,-2],[18,0],[85,-4],[23,17],[5,6],[1,8],[1,19],[-36,0],[-29,1]],[[8459,2555],[0,23]],[[8459,2578],[0,22],[0,11],[0,12],[0,17],[0,1],[-1,1],[-59,1],[0,-18],[1,-1]],[[8400,2624],[-42,0],[-5,0]],[[8353,2624],[0,7],[1,13]],[[8354,2644],[1,15],[1,5],[2,7],[4,40],[1,5],[2,19]],[[8365,2735],[4,31],[5,49],[1,3],[0,3],[0,3]],[[8375,2824],[42,-6],[58,-10],[41,-6],[28,-4],[18,2],[12,2],[27,11],[4,1],[5,2],[5,1],[3,1],[2,1],[15,3],[16,4],[12,2],[12,3],[12,3],[6,2],[7,2],[8,5],[6,3],[3,2],[3,1],[1,1],[2,1]],[[8723,2851],[2,1],[3,-3],[13,7]],[[9137,3084],[1,1]],[[9138,3085],[2,-5],[-1,-2],[-1,1],[-1,5]],[[8390,2510],[5,12],[4,12]],[[8399,2534],[42,-1],[17,0],[1,22]],[[8399,2534],[0,11],[0,11]],[[8399,2556],[0,11],[0,12]],[[8399,2579],[32,-1],[28,0]],[[8312,3700],[-8,-17],[-8,-15],[-10,-20],[-8,-15]],[[8152,3727],[4,19]],[[8156,3746],[7,23],[5,21],[4,15]],[[8172,3805],[11,-8],[21,-16],[13,-9],[37,-28],[1,-1],[28,-21],[9,-7],[3,-2],[9,-7],[8,-6]],[[7761,6574],[-73,54],[-19,-32],[-22,-41],[-14,11]],[[7633,6566],[-16,12],[-22,17],[-21,18],[-2,2]],[[7572,6615],[-3,2],[-11,11],[-8,9],[-13,12],[-9,9],[-17,17]],[[7511,6675],[25,23],[10,9],[28,24],[24,17],[42,29],[13,11]],[[7653,6788],[5,-4],[17,-12],[67,-46]],[[7742,6726],[52,-35],[23,-16]],[[7817,6675],[-1,-3],[-10,-16],[-22,-42],[-23,-40]],[[7720,6501],[-1,-3],[-10,-18],[-14,11],[-4,-1],[-21,-40],[-17,13],[-11,-19]],[[7642,6444],[-8,-9]],[[7634,6435],[-14,16],[7,9],[10,14],[22,40],[-1,4],[-14,10]],[[7644,6528],[-18,14],[-2,1],[-1,2],[0,2],[1,3],[8,14],[1,2]],[[7761,6574],[-19,-33],[-22,-40]],[[8399,2579],[1,22],[0,23]],[[8345,2556],[3,23],[3,23],[2,22]],[[8399,2556],[-26,0],[-28,0]],[[8340,2511],[3,23],[2,22]],[[8390,2510],[-8,0],[-16,0],[-14,1],[-12,0]],[[8323,2463],[10,27],[7,21]],[[8313,2436],[-14,28],[-9,18]],[[8290,2482],[-8,16]],[[8282,2498],[14,17],[2,2],[9,40],[9,0],[10,0],[10,-1],[9,0]],[[8282,2498],[-10,19]],[[8272,2517],[-9,18],[-1,3],[-2,4]],[[8260,2542],[31,39],[18,21],[16,19]],[[8325,2621],[13,10],[16,13]],[[8325,2621],[2,6],[-15,13],[-14,13]],[[8298,2653],[25,37],[13,21],[4,6],[18,27],[7,-9]],[[8298,2653],[-11,16],[-7,9]],[[8280,2678],[-7,10],[-7,9],[-13,18],[-16,22],[-14,-14]],[[8223,2723],[-18,26],[-2,3]],[[8203,2752],[19,20],[11,11],[6,4],[26,24],[3,1],[26,25],[31,30],[47,41],[4,3]],[[8376,2911],[4,-26],[0,-6],[1,-6],[-3,-25],[-3,-24]],[[8446,3301],[8,-49],[2,-4],[4,-7],[1,-2],[1,-3],[2,-32]],[[8464,3204],[-4,0],[-24,14],[-12,7],[-27,15],[-8,5],[-11,6]],[[8378,3251],[19,34],[4,7],[7,21],[11,-5],[5,-3],[22,-4]],[[8378,3251],[-15,8],[-8,5],[-14,8],[-11,6]],[[8330,3278],[-15,9],[-26,15]],[[8289,3302],[8,16],[6,12],[5,9],[5,11]],[[8313,3350],[17,32],[5,10],[3,7],[8,14],[10,22],[14,24],[6,13]],[[8376,3472],[10,-6],[8,-6],[15,-10],[23,-14],[-4,-13],[-10,-28],[13,-6],[12,-5],[5,-2]],[[8448,3382],[-3,-15],[-1,-13],[1,-32],[1,-21]],[[8505,3564],[-7,-24],[-9,-26],[-6,-19],[-3,-6],[-1,-6],[-6,-16],[-9,-23],[-4,-12],[-2,-10],[-4,-13],[-6,-27]],[[8376,3472],[21,51],[4,5],[4,8]],[[8405,3536],[15,36],[3,8],[7,21],[3,8]],[[8433,3609],[12,-9],[10,-8],[16,-12],[3,-1],[19,-7],[0,-4],[9,-4],[3,0]],[[8376,3472],[-13,10],[-3,2],[-1,1],[-4,3],[-3,2],[-4,4],[-26,19]],[[8322,3513],[7,17],[13,28],[8,20]],[[8350,3578],[25,-18],[11,-9],[4,-3],[4,-3],[11,-9]],[[8350,3578],[-16,13],[-11,8]],[[8323,3599],[9,15],[10,18],[17,32]],[[8359,3664],[23,-17],[24,-18],[11,-8],[1,-1],[4,-3],[11,-8]],[[8322,3513],[-30,23],[-4,3],[-9,7],[-9,7],[-25,19]],[[8278,3633],[23,-18],[18,-13],[4,-3]],[[8312,3700],[26,-20],[18,-13],[3,-3]],[[8121,3613],[-15,11],[-8,5],[-5,3]],[[8093,3632],[-44,32]],[[8049,3664],[6,11],[1,2],[6,10],[4,8],[5,9]],[[8071,3704],[41,-29],[21,-16]],[[8133,3659],[-4,-17],[-8,-29]],[[8074,3602],[-2,1]],[[8072,3603],[-5,4],[-35,26]],[[8032,3633],[7,13],[10,18]],[[8093,3632],[-11,-19],[-4,-7],[-4,-4]],[[8111,3574],[-9,6],[-3,3],[-25,19]],[[8121,3613],[-6,-22],[-4,-17]],[[8096,3522],[-48,37]],[[8048,3559],[8,14],[6,10]],[[8062,3583],[5,10],[5,10]],[[8111,3574],[-5,-20],[-10,-32]],[[8048,3559],[-40,31]],[[8008,3590],[13,24],[41,-31]],[[8008,3590],[-11,-20]],[[7997,3570],[-18,13],[-22,17]],[[7957,3600],[-7,8],[-3,4]],[[7947,3612],[5,5],[6,11],[2,4]],[[7960,3632],[8,-7],[11,-10],[5,-6],[7,-5],[17,-14]],[[8027,3517],[-6,5],[-21,16],[-15,12]],[[7985,3550],[-18,14],[-20,15]],[[7947,3579],[1,3],[1,3],[3,2],[1,2],[1,3],[2,3],[1,5]],[[7997,3570],[10,-8],[26,-20],[4,-3]],[[8037,3539],[2,-2]],[[8039,3537],[-5,-9],[-7,-11]],[[8006,3479],[-10,8],[-7,6],[-17,13],[-9,7]],[[7963,3513],[7,12],[-20,15],[-8,6],[-9,7]],[[7933,3553],[12,22],[2,4]],[[7985,3550],[-6,-10],[-6,-10],[8,-6],[1,-1],[12,-10],[21,-17]],[[8015,3496],[-5,-9],[-4,-8]],[[8027,3517],[-12,-21]],[[8071,3451],[-12,9],[-9,8],[-14,11],[-14,11],[-7,6]],[[8027,3517],[20,-16],[18,-14],[4,-3],[11,-8]],[[8080,3476],[-4,-11],[-5,-14]],[[8088,3499],[-8,-23]],[[8039,3537],[37,-29],[12,-9]],[[8096,3522],[-8,-23]],[[8037,3539],[5,9],[6,11]],[[8289,3302],[-6,-12],[-3,-6],[-14,-28],[-2,-3],[-6,-12],[-2,-4],[-2,-2],[-1,-2],[-2,-2],[-1,-2],[-1,-1],[0,-1],[-30,-42],[-8,-10],[-10,-13],[-15,-20]],[[8186,3142],[-2,3],[-21,16],[-12,11],[-4,3],[-22,18],[-5,6],[-4,2],[-2,3],[-2,3],[-23,18],[-7,6],[-9,7],[-10,7]],[[8063,3245],[-9,7],[-1,2],[-25,20],[-24,20],[-3,1],[-7,6],[-4,5]],[[7990,3306],[14,22],[3,5],[9,16],[11,18],[13,22],[12,20]],[[8052,3409],[11,20],[7,18],[1,4]],[[8096,3522],[9,-7],[3,-2],[11,-9],[13,-11],[13,-10],[15,-11],[23,-19]],[[8183,3453],[10,-7],[33,-27],[3,-2],[7,-6],[13,-10],[19,-15],[18,-15],[3,1],[3,-2],[2,-2],[1,0],[1,-3],[1,-1],[16,-14]],[[8052,3409],[-59,48]],[[7993,3457],[13,22]],[[7993,3457],[-21,16],[-7,6],[-15,12]],[[7950,3491],[8,13],[5,9]],[[7950,3491],[-30,26]],[[7920,3517],[5,19],[2,1],[6,16]],[[7387,3495],[-118,-167],[-6,-12],[-20,-36],[-13,-29],[-12,-21],[-2,-3],[-6,-4],[-7,-5],[-5,-13],[-1,-10],[-1,-8],[-4,-9],[-5,-7],[-7,-6],[-6,-12],[-3,-7],[-1,-4],[0,-3],[-1,-4]],[[7169,3135],[-17,14]],[[7152,3149],[-27,23]],[[7125,3172],[39,74],[6,13],[2,31],[-3,10],[-9,32]],[[7160,3332],[-2,8],[-4,5],[-4,3],[-2,2],[-3,3]],[[7145,3353],[8,13],[0,1],[10,18],[4,7],[15,28],[-10,7]],[[7172,3427],[37,66]],[[7209,3493],[9,-7],[39,72],[2,5],[3,6],[3,3],[4,3],[3,2],[2,2],[5,3]],[[7279,3582],[10,-8]],[[7289,3574],[34,-25],[64,-54]],[[7172,3427],[-13,-25],[-10,7],[-6,4],[2,5]],[[7145,3418],[12,21],[11,22],[13,22],[12,21]],[[7193,3504],[5,-3],[10,-7],[1,-1]],[[7145,3353],[-17,13],[-5,-9],[-35,26],[-4,18]],[[7084,3401],[13,25]],[[7097,3426],[10,19]],[[7107,3445],[38,-27]],[[7107,3445],[12,21],[13,24],[11,21]],[[7143,3511],[12,22],[10,16]],[[7165,3549],[37,-27],[-9,-18]],[[7097,3426],[-42,31],[-5,11]],[[7050,3468],[33,62],[-15,21]],[[7068,3551],[12,-8],[21,2],[34,-26],[6,-4],[2,-4]],[[7050,3468],[-7,13],[-11,8],[-20,16]],[[7012,3505],[23,43],[6,23]],[[7041,3571],[27,-20]],[[7016,3593],[8,-9],[2,-2],[15,-11]],[[7012,3505],[-12,7],[-14,3],[-12,2]],[[6974,3517],[42,76]],[[6974,3517],[-19,8]],[[6955,3525],[13,4],[26,49],[10,15]],[[7004,3593],[12,0]],[[6955,3525],[-9,5],[-16,17]],[[6930,3547],[14,3],[18,34],[25,49],[2,-11],[15,-29]],[[7012,3505],[-11,-19],[-8,-8],[-4,-4],[-19,-17],[-6,-9],[-7,-21]],[[6957,3427],[-18,13]],[[6939,3440],[-36,25],[-4,3],[-13,10]],[[6886,3478],[7,12],[17,20],[20,37]],[[6886,3478],[0,20],[29,53],[-2,20]],[[6913,3571],[17,-24]],[[7481,5741],[-15,-10]],[[7466,5731],[-60,40]],[[7406,5771],[6,7],[12,5],[9,7]],[[7433,5790],[38,32]],[[7471,5822],[5,-8],[9,-8]],[[7485,5806],[14,-10],[-15,-28],[-12,-8],[9,-19]],[[7406,5771],[-56,40]],[[7350,5811],[5,8]],[[7355,5819],[9,14],[9,8],[19,15]],[[7392,5856],[11,-18]],[[7403,5838],[30,-48]],[[7485,5806],[17,15],[14,11],[4,0],[25,-19],[-10,-18],[-10,-18],[5,-5]],[[7530,5772],[-29,-55],[-4,-1],[-3,3],[-13,22]],[[7549,5614],[-2,2],[-4,2],[-52,38]],[[7491,5656],[14,26],[6,10],[3,5],[-48,34]],[[7530,5772],[16,-11],[29,55],[2,3],[10,17]],[[7587,5836],[13,26],[10,17],[11,18]],[[7621,5897],[15,-11]],[[7636,5886],[16,-13],[20,-14],[2,-2],[2,-1],[3,-3]],[[7679,5853],[-9,-18],[-10,-18]],[[7660,5817],[-1,-2],[-1,-2],[-3,-4],[-18,-34]],[[7637,5775],[-2,-3],[-1,-3],[-13,-23],[-14,-25],[-17,-32],[-23,-43],[-14,-25],[-4,-7]],[[7066,6051],[-10,-19]],[[7056,6032],[-11,13],[-8,-14],[-4,-8],[11,-8],[2,-1],[-4,-8],[-1,-1],[-4,-7]],[[7037,5998],[-7,5],[-7,5],[-7,5],[-6,4],[-20,-36],[-5,-9]],[[6985,5972],[-12,9],[-14,10],[-13,10]],[[6946,6001],[6,11],[2,5],[1,1],[1,3],[2,6],[8,15],[18,34],[1,4],[3,8],[2,11],[3,6],[4,-3],[69,-51]],[[8088,5335],[-3,1],[-7,4],[-2,1],[-22,12],[-3,1],[-8,4]],[[8043,5358],[-8,5],[-2,1],[-44,22],[-10,5],[-11,6]],[[7968,5397],[10,18]],[[7978,5415],[10,19]],[[7988,5434],[12,-6],[52,-27],[11,-5]],[[8063,5396],[11,-5],[24,-13],[8,-4],[2,-2]],[[8453,7042],[-11,-20]],[[8442,7022],[-59,43]],[[8383,7065],[11,20],[8,15],[7,14]],[[8409,7114],[59,-43]],[[8468,7071],[-7,-14],[-8,-15]],[[8475,7085],[-59,43]],[[8416,7128],[7,14],[41,77],[25,-19],[-3,-8],[33,-25]],[[8519,7167],[-10,-18],[-26,-50],[-8,-14]],[[8417,6967],[-5,3],[-11,8]],[[8401,6978],[-30,22],[-15,11],[-2,1],[-3,3]],[[8351,7015],[2,3],[6,12],[10,20],[10,18]],[[8379,7068],[4,-3]],[[8442,7022],[-9,-17]],[[8433,7005],[-8,-15],[-8,-15],[0,-4],[0,-4]],[[8360,6900],[-16,13],[-18,12]],[[8326,6925],[-13,10],[-6,-3]],[[8307,6932],[17,32],[4,8],[11,20],[1,2],[9,16],[2,5]],[[8401,6978],[-2,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-3],[-11,-21],[-15,-27],[-9,-23]],[[8384,6768],[-19,-1],[-15,0]],[[8350,6767],[1,2],[2,15],[1,3],[2,11],[0,3],[-3,0],[-15,4],[-2,2],[0,2],[1,7]],[[8337,6816],[6,22],[5,21],[7,21],[-23,17],[-15,11],[9,17]],[[8360,6900],[17,-12],[3,-2],[30,-20]],[[8410,6866],[1,-1],[16,-12]],[[8427,6853],[-6,-10],[-13,-54],[-17,-1],[-8,0],[1,-20]],[[8272,6779],[-7,-14],[-2,-10],[0,-13],[4,-14],[11,-16],[19,-27]],[[8297,6685],[9,-8],[13,-6],[17,-5],[3,-1]],[[8339,6665],[-1,-3],[-1,-4],[-1,-3],[-1,-3],[-4,-10],[-3,-9],[27,-19],[62,-45]],[[8417,6569],[-2,-4],[-2,-2]],[[8413,6563],[-24,18],[-18,13],[-13,9],[-4,3],[-4,3],[-4,2],[-3,3],[-4,3],[-19,14],[-3,3],[-10,8],[-7,6],[-14,11],[-4,4],[-3,3],[-3,3],[-4,4],[-2,2],[-3,3],[-9,9],[-5,5],[-3,3],[-1,1],[-5,4],[-5,6],[-23,23]],[[8216,6729],[0,2],[0,2],[0,1],[-1,2],[0,2],[1,2],[1,2],[1,1],[1,3],[1,1],[1,4],[2,4],[2,6],[2,7],[1,3],[2,4],[1,3],[2,5],[1,4],[1,4],[2,5],[2,5],[2,4],[1,3],[3,5],[3,6],[6,11],[4,9],[6,11],[5,9],[6,12],[5,8],[10,20],[17,33]],[[8337,6816],[-25,7],[-2,-5],[-12,8],[-5,-9],[-18,11],[-10,-19],[17,-12],[-10,-18]],[[7644,6528],[-13,-22]],[[7631,6506],[-32,24]],[[7599,6530],[-32,25],[-17,13]],[[7550,6568],[7,22],[3,10]],[[7560,6600],[10,12],[2,3]],[[7634,6435],[-15,-16]],[[7619,6419],[-5,8],[-9,11],[-12,12]],[[7593,6450],[5,9],[6,6],[8,8],[9,13],[10,20]],[[7593,6450],[-49,38]],[[7544,6488],[5,9],[3,8],[8,-3],[16,-12],[12,21],[11,19]],[[7544,6488],[-5,3],[-10,2]],[[7529,6493],[1,11],[16,51],[4,13]],[[8063,5396],[10,18]],[[8073,5414],[9,-4],[1,-1],[23,-11],[2,-1],[8,-4],[2,-2]],[[8073,5414],[10,19],[10,19],[8,-4],[7,-4],[5,11],[12,22],[13,-9],[-6,-13],[-10,-18],[3,-2],[11,-5],[2,-1]],[[7988,5434],[10,18]],[[7998,5452],[2,3],[8,16]],[[8008,5471],[10,19],[20,39]],[[8038,5529],[20,38]],[[8058,5567],[75,-39],[29,-15],[6,-3],[9,-4],[2,-1]],[[8058,5567],[8,15],[10,21]],[[8076,5603],[76,-39],[29,-15],[9,-4],[6,-3],[3,-2]],[[8209,5561],[-10,-21]],[[8076,5603],[7,11],[5,10],[11,20]],[[8099,5644],[11,-6],[55,-27],[9,-5]],[[8174,5606],[-11,-20],[12,-6],[32,-17],[2,-2]],[[8026,5219],[-4,-7]],[[8022,5212],[-3,1],[-9,5],[-5,2],[-18,9],[-9,5]],[[7978,5234],[12,23],[6,11],[6,11],[2,4]],[[8004,5283],[41,-22],[2,-1]],[[8047,5260],[-2,-3],[-10,-20],[-9,-18]],[[8006,5182],[-10,-20]],[[7996,5162],[-3,1],[-24,12],[-17,9],[14,26],[12,24]],[[8022,5212],[-6,-11],[-10,-19]],[[7942,5060],[-3,-6]],[[7939,5054],[-3,1],[-33,16],[-8,4]],[[7895,5075],[-31,15]],[[7864,5090],[-36,19],[-8,4]],[[7820,5113],[11,23],[12,22],[12,23]],[[7855,5181],[24,45],[12,23],[12,23]],[[7903,5272],[12,23]],[[7915,5295],[12,23],[2,3]],[[7929,5321],[75,-38]],[[7996,5162],[-12,-21]],[[7984,5141],[-11,-22],[-11,-22]],[[7962,5097],[-10,-19],[-10,-18]],[[7895,5075],[-11,-20],[-12,-23],[-12,-24],[-10,-18]],[[7850,4990],[-63,31],[-3,1],[-10,5]],[[7774,5027],[10,18],[12,25],[12,23]],[[7808,5093],[9,-5],[3,-1],[37,-18],[4,11],[3,10]],[[7866,4917],[-9,5],[-34,17]],[[7823,4939],[17,32],[10,19]],[[7939,5054],[-6,-12],[-5,-9],[-4,-8]],[[7924,5025],[-6,-11],[-3,-3],[-2,-4],[-11,-21],[-9,-18]],[[7893,4968],[-10,-18],[-8,-15],[-9,-18]],[[7913,4893],[-9,5],[-26,13],[-12,6]],[[7893,4968],[9,-4],[3,-1],[19,-10],[10,-4]],[[7934,4949],[-7,-19]],[[7927,4930],[-7,-17],[-7,-20]],[[7961,4869],[-9,5],[-30,15],[-9,4]],[[7927,4930],[9,-4],[30,-15],[9,-5]],[[7975,4906],[-7,-18],[-7,-19]],[[7961,4869],[-6,-18],[-7,-18]],[[7948,4833],[-9,5],[-30,14],[-9,5]],[[7900,4857],[6,18],[-9,5],[-26,13],[-5,3],[-3,1],[-7,2]],[[7856,4899],[6,10],[2,5],[2,3]],[[7711,4725],[-68,52]],[[7643,4777],[6,12],[6,11],[6,11],[6,12]],[[7667,4823],[68,-52]],[[7735,4771],[-6,-12],[-6,-11],[-6,-11],[-6,-12]],[[7749,4696],[-12,-25]],[[7737,4671],[-10,9],[-29,21],[-67,53]],[[7631,4754],[6,11],[6,12]],[[7711,4725],[29,-22],[9,-7]],[[7726,4651],[-38,30]],[[7688,4681],[-67,52]],[[7621,4733],[5,10],[5,11]],[[7737,4671],[-5,-10],[-6,-10]],[[3815,1681],[-46,-14],[-2,0],[-1,2],[-5,22],[-11,-3],[-4,-2],[-6,-6],[-18,-23],[-18,79]],[[3704,1736],[18,22],[6,7],[14,4],[50,16],[-3,12],[8,3],[11,4],[8,5],[7,3],[12,5],[20,5]],[[3855,1822],[6,-26],[1,-7],[3,-37],[2,-21],[-31,-10],[-8,-3],[-9,-2],[-8,-1],[0,-12],[1,-10],[3,-12]],[[3914,1792],[7,-27],[3,-16]],[[3924,1749],[-20,-6],[-23,-8],[3,-20],[2,-11],[1,-11],[3,-25],[2,-12],[4,-31],[1,-4],[3,-8],[4,-8],[10,-14],[2,-3],[2,-3],[0,-1]],[[3918,1584],[-37,1],[-3,0],[-5,1],[-10,0],[-66,1],[-49,-3],[-3,0],[-36,-5],[-16,-2]],[[3693,1577],[-2,8]],[[3691,1585],[25,5],[11,3],[9,6],[22,1],[16,2],[6,-1],[-1,12],[0,3],[0,6],[-2,8],[-2,10],[0,2],[2,2],[44,13],[-6,24]],[[3855,1822],[9,3]],[[3864,1825],[3,-2],[6,-1],[4,-1],[4,0],[13,-1],[13,3]],[[3907,1823],[3,-12],[4,-19]],[[4066,1586],[3,-5]],[[4069,1581],[-143,3],[-1,0],[-6,0],[-1,0]],[[3924,1749],[19,7],[3,0],[8,-33]],[[3954,1723],[19,-86],[3,-2],[3,0],[7,-3],[6,-3],[15,-11],[4,-30],[26,-1],[29,-1]],[[4037,1733],[-26,-7],[-2,-2],[-1,-4],[-17,-20],[-3,-4],[-5,8],[-6,7],[-8,6],[-10,4],[-3,0],[-2,2]],[[3914,1792],[61,48],[12,-22],[6,-10],[3,-13],[25,20],[16,-82]],[[4037,1733],[12,-59],[23,6]],[[4072,1680],[10,-46],[4,-25],[4,-23],[-24,0]],[[4204,1662],[15,-81],[-19,1],[3,-6]],[[4203,1576],[-95,4],[-39,1]],[[4072,1680],[26,9],[10,2]],[[4108,1691],[6,-34],[1,-2],[3,-1],[23,0],[29,-1],[16,4],[18,5]],[[4108,1691],[-6,30],[1,4],[21,17],[16,12],[26,7],[18,5],[22,6]],[[4206,1772],[3,-18],[3,-17],[3,-17],[4,-17],[3,-18],[4,-17],[-22,-6]],[[5108,1550],[-230,8],[-32,1],[-64,-2],[-93,2]],[[4689,1559],[-2,0],[-182,7],[-261,8]],[[4244,1574],[-6,0],[-35,2]],[[4206,1772],[17,5],[23,6],[-1,4],[-4,23],[-6,33],[-17,91],[147,186]],[[4365,2120],[155,-161],[188,239],[184,246],[127,167],[24,34],[10,4],[3,3],[1,-1],[-2,-4],[14,-10],[10,-8],[12,-9],[17,-12],[10,-7],[146,-147],[5,-6],[38,-39],[47,-50],[3,-3]],[[5357,2356],[-1,0],[-5,-7],[-26,-33],[-22,-26],[-1,-2],[-3,-3],[-26,-33],[-46,-57],[-32,-41],[-18,-22],[-12,-14],[-9,-12],[-6,-7],[-12,-15],[-5,-6],[-7,-8],[-22,-27],[-10,-13],[-37,-43],[-31,-37],[2,-3],[1,-2],[4,-9],[3,-9],[1,-3],[3,-14],[6,-32],[19,-101],[22,-114],[19,-105],[2,-8]],[[8142,5727],[-9,5],[-66,37]],[[8067,5769],[12,23],[12,22]],[[8091,5814],[63,-35],[12,-7]],[[8166,5772],[-12,-22],[-12,-23]],[[8067,5769],[-22,13],[-18,10],[-17,10]],[[8010,5802],[-7,3],[-2,1],[-9,5],[12,23],[12,23]],[[8016,5857],[75,-43]],[[7745,5975],[28,51],[2,4],[4,6],[15,29]],[[7794,6065],[3,-3]],[[7797,6062],[21,-16],[16,-11]],[[7834,6035],[31,-22],[15,-12],[3,-8]],[[7883,5993],[-4,-2],[-36,-21],[-11,-6],[-6,-3],[-8,-3],[-8,-2],[-5,0]],[[7805,5956],[-4,0],[-4,0],[-6,0],[-6,1],[-8,2],[-4,1],[-7,4],[-10,5],[-7,4],[-4,2]],[[7794,6065],[-4,1],[-6,-2],[-21,15],[-16,12],[-15,13]],[[7732,6104],[9,17]],[[7741,6121],[24,-17],[9,19],[6,-4],[7,5],[5,10],[-31,24],[11,21],[10,19]],[[7782,6198],[2,2],[12,22]],[[7796,6222],[53,-40],[3,-2],[3,-2]],[[7855,6178],[-6,-11],[-14,-27],[-7,-13],[-5,-9],[-16,-30],[-13,-23]],[[7741,6121],[-21,17],[-17,12],[31,57],[8,14]],[[7742,6221],[4,3],[36,-26]],[[7732,6104],[-56,42],[-16,12],[-28,21],[-16,12]],[[7616,6191],[15,29]],[[7631,6220],[12,22],[7,12],[3,8],[11,18]],[[7664,6280],[41,-31],[4,-4],[16,-11],[17,-13]],[[7660,6327],[4,-8],[9,-22]],[[7673,6297],[-9,-17]],[[7631,6220],[-17,12],[-8,6],[-11,25],[-18,14],[-14,11]],[[7563,6288],[23,14],[25,44],[15,9],[8,-19],[9,-19],[17,10]],[[7616,6191],[-21,-37],[-2,-3],[-4,-3],[-6,-4]],[[7583,6144],[-2,4],[-16,36]],[[7565,6184],[-10,23],[-10,19],[-19,34]],[[7526,6260],[-31,55]],[[7495,6315],[16,12],[16,9],[10,-17]],[[7537,6319],[10,-17],[10,-18],[6,4]],[[7645,6361],[15,-34]],[[7537,6319],[22,14],[19,35],[4,7],[1,9],[-2,9],[16,11],[22,15]],[[7619,6419],[8,-15],[18,-43]],[[7642,6444],[16,-12],[21,-52]],[[7679,6380],[-17,-9],[-17,-10]],[[7679,6380],[17,9]],[[7696,6389],[6,-6],[17,-12]],[[7719,6371],[-19,-33],[-12,-22],[-15,-19]],[[7720,6501],[17,-13]],[[7737,6488],[-1,-3],[-33,-60],[-4,-6],[-5,-5],[-7,-3],[9,-22]],[[7737,6488],[17,-13],[16,-12]],[[7770,6463],[-2,-2],[-23,-43],[-10,-18]],[[7735,6400],[-9,-18],[-7,-11]],[[7785,6364],[-17,11]],[[7768,6375],[-33,25]],[[7770,6463],[17,-12],[2,-2],[3,-2],[8,-5],[3,-2],[2,-2],[7,-3],[6,-2],[3,-2],[-1,-3],[-35,-64]],[[7862,6383],[-20,-35],[-15,-16],[-10,-18]],[[7817,6314],[-28,20],[-31,25],[10,16]],[[7785,6364],[15,-12],[10,18],[13,-11],[5,2],[17,33],[17,-11]],[[7817,6314],[-15,-28],[20,-15],[-5,-10],[-21,-39]],[[7862,6383],[10,18],[1,3],[17,-13],[17,-13],[32,-21],[6,-4],[1,-1],[6,-4],[4,-2],[3,-3]],[[7959,6343],[-3,-3],[-13,-14],[-4,-5],[-3,-4],[-4,-4],[-4,-6],[-3,-5],[-5,-6],[-1,-3],[-5,-7],[-1,-2],[-3,-5],[-2,-4],[-3,-5],[-19,-35],[-2,-4],[-3,-5],[-4,-8],[-5,-9],[-5,-10],[-3,-4],[-4,-7],[-4,-8],[-1,-2]],[[7817,6675],[38,-27]],[[7855,6648],[38,-28],[33,-23],[52,-41]],[[7978,6556],[53,-39]],[[8031,6517],[17,-14],[17,-15],[3,-3],[3,-2]],[[8071,6483],[-4,-8],[-5,-9],[-6,-8],[-4,-6],[-9,-12],[-6,-8],[-8,-9],[-17,-19],[-12,-13],[-23,-27],[-3,-3],[-3,-3],[-2,-3],[-2,-3],[-8,-9]],[[7978,6556],[3,8]],[[7981,6564],[13,24]],[[7994,6588],[54,-40],[-17,-31]],[[7981,6564],[-20,14],[-14,10],[-18,14],[11,24],[10,18]],[[7950,6644],[34,-24],[9,17],[1,2]],[[7994,6639],[20,-13]],[[8014,6626],[-2,-3],[-18,-35]],[[7855,6648],[21,22],[0,5],[-4,1],[9,17]],[[7881,6693],[42,-31],[27,-18]],[[7881,6693],[4,8],[3,11],[1,3]],[[7889,6715],[4,10],[4,7]],[[7897,6732],[17,-11],[16,-12],[16,-11],[16,-11]],[[7962,6687],[-9,-18],[41,-30]],[[7962,6687],[13,23],[6,12]],[[7981,6722],[44,-31],[17,-12]],[[8042,6679],[-19,-36],[-9,-17]],[[7897,6732],[12,24],[8,15]],[[7917,6771],[13,26]],[[7930,6797],[16,-12],[15,-11],[15,-10],[16,-12]],[[7992,6752],[-11,-30]],[[7930,6797],[10,18],[-37,28]],[[7903,6843],[10,18],[38,-27],[15,-12],[29,-20],[-10,-19],[17,-11],[-10,-20]],[[7917,6771],[-17,12],[-45,31],[-2,1],[-2,1],[-1,1],[1,1],[1,1],[2,0],[9,17]],[[7863,6836],[27,-19],[13,26]],[[7889,6715],[-25,18],[-24,18],[-11,8],[-6,4],[-29,20]],[[7794,6783],[50,49],[8,11]],[[7852,6843],[11,-7]],[[7742,6726],[6,10],[1,3],[11,12],[31,29],[3,3]],[[7653,6788],[-162,125],[-8,5],[-7,6],[-4,4],[-18,7]],[[7454,6935],[34,20],[-13,22],[-4,7]],[[7471,6984],[16,3],[12,3],[6,3],[10,4],[7,4],[7,5],[11,8],[3,2],[7,6],[3,2],[5,4],[17,15],[14,13],[13,14],[9,9],[3,4],[5,5],[7,8],[19,22]],[[7645,7118],[2,-2],[24,-17],[9,-12],[4,-13],[2,-10],[5,-8],[6,-7],[11,-8],[18,-11],[37,-20],[57,-32],[9,-6],[19,-12],[1,-1],[5,-5],[2,-3],[4,-9],[1,-5],[2,-7],[-27,-52],[25,-18],[-9,-17]],[[7509,6479],[3,29],[11,40]],[[7523,6548],[7,19],[7,24]],[[7537,6591],[6,22],[17,-13]],[[7529,6493],[-2,-17],[-18,3]],[[7490,6478],[3,19],[-56,43],[-1,4],[10,13],[12,16],[12,15]],[[7470,6588],[53,-40]],[[7509,6479],[-10,-1],[-9,0]],[[7490,6478],[-14,-5]],[[7476,6473],[-6,18],[-59,43],[0,4],[9,17],[35,44]],[[7455,6599],[15,-11]],[[7428,6417],[-17,12]],[[7411,6429],[11,17],[12,19],[8,11],[1,1],[1,7],[-44,33]],[[7400,6517],[-19,14],[9,15],[14,18]],[[7404,6564],[17,24],[19,23],[15,-12]],[[7476,6473],[-11,-6],[-7,-7],[-9,-10],[-14,-22],[-7,-11]],[[7411,6429],[-38,27],[7,21],[9,21],[11,19]],[[7428,6417],[-12,-18]],[[7416,6399],[-67,50]],[[7349,6449],[-12,9],[-9,8],[-3,2],[-2,3],[-6,7],[-4,5],[-5,6],[-6,9],[-5,8],[-5,11],[-7,16]],[[7285,6533],[9,15],[43,68],[34,-26],[33,-26]],[[7335,6358],[-16,12]],[[7319,6370],[1,2],[-16,12],[-43,31],[-16,12],[-6,-13]],[[7239,6414],[-57,41],[-23,16]],[[7159,6471],[55,111],[2,4],[13,27],[2,4]],[[7231,6617],[1,-2],[9,-13],[12,-15],[6,-7],[5,-8],[5,-7],[7,-12],[3,-8],[2,-4],[4,-8]],[[7349,6449],[-1,-4],[-8,-21],[35,-26],[0,-6],[-9,-1],[-8,-4],[-7,-4],[-6,-8],[-10,-17]],[[7294,6308],[-17,12],[-39,30],[-17,13]],[[7221,6363],[18,51]],[[7319,6370],[-7,-21],[-9,-24],[-9,-17]],[[7276,6266],[-72,53],[17,44]],[[7294,6308],[-6,-10],[-4,-11],[-3,-11],[-5,-10]],[[7300,6230],[-27,-49],[-15,12],[-16,11]],[[7242,6204],[1,3],[11,18],[10,19],[5,9]],[[7269,6253],[16,-12],[15,-11]],[[7294,6142],[-44,32]],[[7250,6174],[-17,13]],[[7233,6187],[9,17]],[[7300,6230],[14,-11],[-25,-48],[15,-12],[-10,-17]],[[7309,6130],[-15,12]],[[7300,6230],[12,23],[1,3],[2,0],[10,-8],[-1,-5],[3,-2],[21,-15],[4,-3],[5,-10]],[[7357,6213],[-6,-7],[-6,-9],[-27,-50],[-9,-17]],[[7293,6088],[-57,43],[-1,2],[-1,2],[0,2],[6,16],[4,10],[3,6],[1,3],[2,2]],[[7309,6130],[-1,-3],[-8,-18],[-7,-21]],[[7293,6088],[-5,-19],[-3,-16]],[[7285,6053],[-6,2],[-12,8],[-12,9],[-15,12],[-15,10],[-2,-2],[-15,-28]],[[7208,6064],[-23,17]],[[7185,6081],[7,11],[4,7],[9,18],[1,1],[7,17],[12,39],[6,10],[2,3]],[[7285,6053],[-2,-27],[-1,-25]],[[7282,6001],[-18,0]],[[7264,6001],[0,22],[-25,18],[-15,11],[-16,12]],[[7264,6001],[-18,-1]],[[7246,6000],[-1,11],[-72,54]],[[7173,6065],[12,16]],[[7159,6046],[7,12],[7,7]],[[7246,6000],[-18,1]],[[7228,6001],[-16,6],[-7,6],[-46,33]],[[7186,5977],[-47,34],[10,18],[10,17]],[[7228,6001],[0,-12],[0,-5],[-5,-9],[-27,19],[-10,-17]],[[7228,5945],[-8,-19],[-14,8],[-6,-12]],[[7200,5922],[-15,11]],[[7185,5933],[-16,12]],[[7169,5945],[6,12],[11,20]],[[7246,6000],[0,-14],[-1,-9],[-17,-32]],[[7185,5933],[-7,-15],[-14,10]],[[7164,5928],[-10,7],[-8,6],[-16,12],[-16,12]],[[7114,5965],[-14,10],[-13,9],[8,15]],[[7095,5999],[13,-9],[14,-11],[17,-12],[15,-11],[15,-11]],[[7134,5863],[-14,10],[-13,10]],[[7107,5883],[25,45],[-14,10],[-13,10]],[[7105,5948],[4,8],[5,9]],[[7164,5928],[1,-6],[-7,-14]],[[7158,5908],[-5,-8],[-19,-37]],[[7107,5883],[-13,9],[-13,10]],[[7081,5902],[24,46]],[[7081,5902],[-14,10],[-15,11],[-12,9],[-13,10]],[[7027,5942],[4,8],[8,13],[13,-9],[13,24]],[[7065,5978],[13,-10],[14,-10],[13,-10]],[[7027,5942],[-15,10]],[[7012,5952],[5,9],[20,37]],[[7037,5998],[8,-6],[6,-5],[7,-4],[7,-5]],[[7056,6032],[39,-33]],[[6510,2056],[-62,41]],[[6448,2097],[8,19],[4,10],[5,10],[13,28],[4,7],[10,10]],[[6492,2181],[59,-38]],[[6551,2143],[-11,-23]],[[6540,2120],[-11,-23],[-10,-22],[-9,-19]],[[6613,2074],[-73,46]],[[6551,2143],[11,23]],[[6562,2166],[63,-41],[10,-6]],[[6635,2119],[-11,-23],[-11,-22]],[[6492,2181],[7,7]],[[6499,2188],[11,11],[6,6],[3,5],[5,12]],[[6524,2222],[49,-31]],[[6573,2191],[-11,-25]],[[7962,6172],[-19,-42]],[[7943,6130],[-8,4],[-6,2],[-6,1],[-21,-2]],[[7902,6135],[-1,21],[1,5],[3,7],[10,-7],[10,0],[17,31],[8,15]],[[7950,6207],[19,-15]],[[7969,6192],[-7,-20]],[[7911,6055],[-14,11]],[[7897,6066],[16,40],[-15,11],[-15,11],[5,9]],[[7888,6137],[6,-2],[8,0]],[[7943,6130],[-15,-36],[-17,-39]],[[7897,6066],[-19,12],[-14,11],[-10,-17],[-8,-15],[-12,-22]],[[7797,6062],[2,2],[54,100],[27,-21],[8,-6]],[[7911,6055],[-4,-15],[-1,-14],[2,-24]],[[7908,6002],[-4,-1],[-8,-3],[-10,-3],[-3,-2]],[[8016,5857],[7,19],[8,19],[10,-6],[61,-34],[4,-3]],[[8106,5852],[-7,-19],[-8,-19]],[[8016,5857],[-29,17]],[[7987,5874],[12,16],[12,16],[31,54]],[[8042,5960],[13,-7]],[[8055,5953],[21,-11],[17,-10],[10,-5],[7,-4]],[[8110,5923],[17,-10]],[[8127,5913],[-6,-18],[-6,-19],[-2,-4],[-7,-20]],[[8055,5953],[14,35],[2,3]],[[8071,5991],[21,-12],[17,-9],[15,-9]],[[8124,5961],[-1,-3],[-6,-16],[-7,-19]],[[8203,5870],[-46,26],[-30,17]],[[8124,5961],[17,-8]],[[8141,5953],[13,-7],[15,-9]],[[8169,5937],[48,-26]],[[8217,5911],[0,-2],[-1,-2],[-13,-37]],[[8110,6073],[5,-3],[17,-6],[7,-3],[5,-5],[2,-8],[0,-8],[-3,-8],[-23,-42],[31,-18]],[[8151,5972],[-9,-16],[-1,-3]],[[8071,5991],[10,20],[16,29]],[[8097,6040],[13,33]],[[8151,5972],[10,19],[-11,8],[-1,5],[13,24],[4,2],[11,-8],[6,9],[7,13]],[[8190,6044],[13,11],[7,-19]],[[8210,6036],[12,-20],[-56,-71],[3,-8]],[[8110,6073],[9,19],[6,10],[8,13],[5,11],[6,16]],[[8144,6142],[14,-21]],[[8158,6121],[-3,-7],[-6,-17],[4,-3],[9,-14],[10,-15],[13,-19],[5,-2]],[[8097,6040],[-20,12]],[[8077,6052],[-17,10],[-34,20]],[[8026,6082],[10,18],[2,4],[17,31]],[[8055,6135],[10,17],[10,15],[15,17]],[[8090,6184],[15,15],[21,-30]],[[8126,6169],[18,-27]],[[8239,6072],[-29,-36]],[[8158,6121],[14,-20],[17,10],[17,9],[22,10],[-2,13],[-9,6],[-8,7],[-14,12],[-4,7]],[[8191,6175],[-9,25],[-19,8],[6,29]],[[8169,6237],[3,-1],[23,-61],[39,-33],[1,-45],[2,-14],[0,-6],[2,-5]],[[8158,6121],[8,22],[11,36],[14,-4]],[[5974,986],[0,-2]],[[5974,984],[-3,1],[-30,17],[-33,16],[-19,4],[-18,3],[-1,0],[-9,2],[-12,-10],[-11,-20],[-9,5],[-1,2],[1,5],[1,3],[7,10],[0,1],[-1,2],[-4,7],[-4,0],[-5,1],[-1,1],[-1,0],[-3,0],[-2,0],[-4,-15],[-3,2],[-7,4],[3,12],[-5,1],[-1,8],[-6,1],[0,2],[-4,1],[0,-4],[-1,0],[-1,0],[0,-7],[-3,0],[-1,7],[-5,0],[0,-4],[-3,-1],[0,-2],[-1,0],[-6,-1],[0,-3],[-3,0],[0,-2],[-31,-12],[-14,0],[-10,0],[0,-3],[0,-5],[0,-10],[8,-2],[0,-3],[-10,2],[-2,2],[0,8],[0,11],[-3,0],[-2,-2],[-11,-1]],[[5690,1018],[6,1],[2,19],[1,3]],[[5699,1041],[8,15],[5,18],[1,2],[7,10],[13,5],[21,7],[6,1],[8,0],[8,1],[18,2]],[[5794,1102],[15,3],[4,-1],[1,2],[46,2],[31,1],[13,1],[18,4]],[[5922,1114],[14,4],[21,7],[14,4],[1,0],[3,-4]],[[5975,1125],[-1,-36]],[[5974,1089],[0,-11]],[[5974,1078],[-10,0],[-9,1],[-18,3],[-19,3],[-17,2],[-3,-31],[-5,-32],[16,-4],[18,-7],[17,-10],[12,-8],[9,-5],[9,-4]],[[5977,881],[0,-10],[0,-16],[-2,-6]],[[5975,849],[-25,5],[-43,6],[-1,1],[-56,5],[-52,3],[-16,3],[-7,3],[-9,4],[-4,2],[-3,5],[-2,4],[0,6],[-1,2],[-67,27],[1,1],[1,3],[1,-1],[69,-28],[12,-5],[24,-4],[15,1],[14,3],[25,3],[13,3],[25,2],[20,-2],[30,-8],[16,-6],[22,-6]],[[5975,979],[1,-4],[0,-7]],[[5976,968],[-17,7],[-15,8],[-21,9],[-13,5],[-37,8],[-5,0],[-18,-4],[-1,5],[6,6],[8,6],[15,2],[6,0],[23,-8],[11,-4],[24,-12],[14,-10],[19,-7]],[[5978,906],[-2,1],[-6,8],[-15,14],[-7,2],[-27,6],[-22,2],[-4,0],[-11,-3],[-11,-1],[-11,0],[-4,1],[-2,2],[0,5],[0,7],[17,0],[4,2],[2,3],[1,0],[1,-3],[0,-3],[7,-2],[52,-7],[14,-3],[24,-8]],[[5978,929],[0,-6],[0,-17]],[[5794,1102],[-1,15]],[[5793,1117],[14,43],[4,12],[4,13]],[[5815,1185],[18,0],[27,1],[16,1],[-1,65]],[[5875,1252],[4,1],[12,0],[6,0],[22,1],[22,0]],[[5941,1254],[1,-66],[-21,-1],[1,-65],[0,-8]],[[5941,1254],[22,2],[2,-67],[0,-57],[10,3],[0,-5],[0,-5]],[[5815,1185],[-2,66]],[[5813,1251],[19,1],[43,0]],[[5813,1251],[-1,66]],[[5812,1317],[62,2],[22,0],[15,1],[7,0]],[[5918,1320],[8,0],[15,1]],[[5941,1321],[0,-67]],[[5813,1251],[-18,0],[-17,0],[0,-26],[-16,-2],[-3,27],[0,21],[-7,2],[0,24],[-11,0],[-43,1],[1,20]],[[5699,1318],[42,0],[32,-1]],[[5773,1317],[21,0],[18,0]],[[5773,1317],[0,26]],[[5773,1343],[-1,34]],[[5772,1377],[0,19],[0,19]],[[5772,1415],[20,0],[19,0]],[[5811,1415],[1,-98]],[[5773,1317],[-6,9],[-59,1],[-15,17]],[[5693,1344],[19,0]],[[5712,1344],[61,-1]],[[5712,1344],[-3,34]],[[5709,1378],[21,0],[7,2],[11,-1],[7,-2],[17,0]],[[5709,1378],[-2,19],[-1,20]],[[5706,1417],[17,0],[6,-1],[43,-1]],[[5693,1344],[-2,-4],[2,-22]],[[5693,1318],[-21,0]],[[5672,1318],[-5,64],[-1,18],[-1,11],[-1,6]],[[5664,1417],[1,5],[1,-3],[3,-1],[2,-1],[35,0]],[[5699,1318],[-6,0]],[[5810,1463],[1,-48]],[[5664,1417],[-1,20],[0,6],[0,8],[0,4],[0,27],[1,25],[0,3],[0,5],[0,4]],[[5664,1519],[11,0],[30,-2],[6,-1],[10,-1],[14,-1],[43,-5],[16,-2],[6,-1],[11,0],[0,-4],[0,-1],[-1,-5],[0,-33]],[[5683,1460],[-3,-20],[37,-1],[6,-1],[6,0],[5,0],[39,0],[0,19],[0,7],[0,20],[-87,2],[-2,-20],[-1,-6]],[[7012,5952],[-13,11],[-14,9]],[[6972,5772],[-49,36]],[[6923,5808],[-8,5],[-8,6],[-46,-86],[7,-6],[8,-5]],[[6876,5722],[49,-36]],[[6925,5686],[-4,-9],[-6,-11]],[[6915,5666],[-50,36]],[[6865,5702],[-6,5],[-5,3],[-4,5],[-4,4],[-7,10],[-3,4],[-5,5],[-4,3],[-4,4],[-11,7],[-15,10]],[[6797,5762],[33,60],[17,34],[1,3],[8,15],[8,16],[5,-3],[1,-3],[4,8],[11,24],[14,20],[9,14],[3,4],[2,4],[31,40],[2,3]],[[7027,5942],[-2,-4],[2,-5],[22,-17],[-20,-35],[-1,-2],[0,-1],[-56,-106]],[[6953,5737],[-49,36]],[[6904,5773],[9,17],[10,18]],[[6972,5772],[-9,-17],[-5,-9],[-5,-9]],[[6904,5773],[-10,-18],[-9,-16],[-9,-17]],[[6953,5737],[-5,-9],[-4,-8]],[[6944,5720],[-5,-9],[-4,-9],[-10,-16]],[[6953,5737],[60,-44],[-4,-9],[-5,-9]],[[7004,5675],[-60,45]],[[6995,5659],[-9,-17],[-61,44]],[[7004,5675],[-9,-16]],[[6995,5659],[36,-27],[2,-1],[8,-6],[19,-13],[1,-1],[6,-4]],[[7067,5607],[-3,-6],[-5,-8],[-2,-4],[-2,-3],[-9,-16]],[[7046,5570],[-12,9]],[[7034,5579],[-59,43]],[[6975,5622],[-60,44]],[[7004,5675],[36,-25],[30,-21],[7,-5]],[[7077,5624],[-1,-1],[-4,-8]],[[7072,5615],[-4,-7],[-1,-1]],[[7092,5536],[-46,34]],[[7072,5615],[45,-32]],[[7117,5583],[-4,-8],[-5,-7]],[[7108,5568],[-4,-7],[-4,-8]],[[7100,5553],[-7,-15],[-1,-2]],[[7072,5495],[-60,44]],[[7012,5539],[5,9],[5,9],[5,9],[5,10],[2,3]],[[7092,5536],[-1,-3],[0,-3],[-4,-8],[-5,-9],[-5,-9],[-5,-9]],[[7059,5470],[-20,15],[-4,-8],[-40,30]],[[6995,5507],[4,7],[4,8],[4,8],[5,9]],[[7072,5495],[-5,-9],[-8,-16]],[[7092,5536],[61,-44]],[[7153,5492],[-2,-3],[-5,-10],[-5,-10],[-5,-8],[-5,-9],[-13,-25],[-59,43]],[[7246,5424],[-33,24]],[[7213,5448],[-49,36],[-11,8]],[[7100,5553],[73,-53]],[[7173,5500],[63,-46],[18,-13]],[[7254,5441],[-4,-8],[-4,-9]],[[7108,5568],[73,-53]],[[7181,5515],[-4,-8],[-4,-7]],[[7117,5583],[73,-53]],[[7190,5530],[-5,-8],[-4,-7]],[[7117,5583],[4,7],[4,8],[72,-53],[-4,-8],[-3,-7]],[[7394,5476],[-9,-18],[-9,-17],[-12,-22]],[[7364,5419],[-18,13],[-6,5],[-5,3],[-2,0],[-3,4],[-8,9],[-6,5],[-5,5],[-32,23],[-7,-13],[-1,-2]],[[7271,5471],[-26,20],[-4,-8],[-4,-8],[-56,40]],[[7077,5624],[3,6],[2,4],[81,145],[2,3],[20,39],[2,3]],[[7187,5824],[55,-39]],[[7242,5785],[22,-17],[45,-33],[54,-39]],[[7363,5696],[54,-40],[28,-21],[26,-18]],[[7471,5617],[-2,-3],[-8,-14],[-2,-4]],[[7459,5596],[-9,-17],[-9,-17],[-9,-17]],[[7432,5545],[-9,-17],[-9,-17],[-12,-21],[-8,-14]],[[7271,5471],[-4,-8],[-5,-8],[-4,-7],[-4,-7]],[[7364,5419],[-7,-12]],[[7357,5407],[-10,-18],[-8,-16],[-7,-12]],[[7332,5361],[-25,18],[-5,5],[-30,21]],[[7272,5405],[-26,19]],[[7250,5365],[-59,43]],[[7191,5408],[5,9],[5,9],[5,9],[5,10],[2,3]],[[7272,5405],[-2,-3],[-10,-19],[-5,-9],[-5,-9]],[[7312,5324],[-8,5],[-54,36]],[[7332,5361],[-1,-3],[-11,-19],[-2,-3],[-6,-12]],[[7287,5277],[-12,-21]],[[7275,5256],[-86,63],[18,33],[-33,25],[3,7],[5,7],[4,8],[5,9]],[[7312,5324],[-2,-5],[-3,-5],[-9,-16],[-11,-21]],[[7400,5318],[6,-9],[2,-3],[2,-3],[3,-2],[10,-7],[5,-4],[20,-14]],[[7448,5276],[-2,-3],[-13,-22],[-8,7],[-42,30],[-1,4],[-5,-10],[-5,-9]],[[7372,5273],[-12,-20],[-14,-20]],[[7346,5233],[-3,2],[-2,2],[-3,2],[-2,1],[-1,1],[-48,36]],[[7332,5361],[28,-21],[4,-2],[4,-3],[4,-1],[9,-1],[3,-2],[5,-2],[2,-2],[2,-2],[1,0],[4,-4],[2,-3]],[[7357,5407],[52,-38],[1,-1],[3,-2],[2,-2],[2,-1],[3,-2]],[[7420,5361],[-10,-17],[-2,-5],[-5,-11],[0,-3],[-3,-7]],[[7491,5278],[-13,-24]],[[7478,5254],[-15,11],[-15,11]],[[7420,5361],[55,-40]],[[7475,5321],[-1,-14],[6,-11],[11,-18]],[[7394,5476],[28,-22],[24,-16],[3,-3],[3,-2],[4,-3]],[[7456,5430],[-9,-18],[-9,-17],[56,-41]],[[7494,5354],[-15,-13],[-4,-20]],[[7456,5430],[30,-22],[8,0],[6,-29]],[[7500,5379],[3,-17],[-9,-8]],[[6950,1933],[-103,-90],[-127,-106]],[[6720,1737],[-8,5],[29,47],[-22,15]],[[6719,1804],[5,11],[19,27],[35,50]],[[6778,1892],[2,3],[9,10],[4,5],[10,9],[12,11],[4,3]],[[6819,1933],[70,-44],[17,14]],[[8350,6767],[0,-4],[-2,-21],[-1,-5]],[[8347,6737],[0,-5],[-2,-22]],[[8345,6710],[-3,0],[-17,1],[2,28]],[[8327,6739],[1,20],[-16,1],[-11,2],[-13,5],[-16,12]],[[8327,6739],[-32,3],[-6,0],[-5,-2],[3,-7],[5,-8],[3,-3],[12,-3],[-2,-21],[-2,-7],[-6,-6]],[[8345,6710],[0,-4],[-1,-8],[-1,-7],[-1,-8],[-1,-9]],[[8341,6674],[-1,-2],[-1,-7]],[[8531,6462],[-10,-17],[-2,-5],[-10,-18]],[[8441,6440],[22,43],[-17,11],[-24,-45]],[[8422,6449],[-3,1],[-12,9],[-3,3],[-3,4],[0,3],[-1,5],[0,4],[2,6],[1,7],[0,6],[-1,7],[-2,3],[-3,2],[-34,25],[-16,-31],[-3,-6],[-2,-4],[-4,-8],[-1,-10],[0,-9],[1,-15],[-2,-8],[-4,-9]],[[8332,6434],[-7,3],[-40,17],[-26,14],[-2,-3],[-15,-39],[-1,-1],[-3,-5],[-4,-7]],[[8234,6413],[-5,-1],[-99,53],[-5,-14]],[[8125,6451],[-18,9],[-24,15],[-4,2],[-4,4],[-4,2]],[[8071,6483],[4,6],[34,65],[1,3]],[[8110,6557],[2,3],[13,26],[12,23],[3,6],[2,3],[4,8],[4,6],[8,12],[6,7],[9,12],[10,10],[6,8],[7,11]],[[8196,6692],[1,0],[4,8],[6,9],[4,8],[4,9],[1,3]],[[8413,6563],[4,-3],[4,-2],[3,-3],[4,-3],[18,-13],[34,-26],[42,-31],[4,-3],[8,-6],[3,-1]],[[6526,1502],[-10,-3],[-62,2],[-43,2],[-3,-3],[-3,-1],[4,-9],[2,-3],[0,-4]],[[6411,1483],[0,-23],[0,-28]],[[6411,1432],[0,-15],[0,-20],[50,-33]],[[6461,1364],[-4,-10]],[[6457,1354],[-35,21],[-6,2],[-12,6],[-1,52],[-3,1],[-3,2],[-2,1],[-3,1],[-101,53],[-2,1],[-6,4],[-5,4],[-27,18],[-15,9],[-42,44],[0,58],[0,7],[-60,19],[-23,7]],[[6111,1664],[-8,3],[-6,1],[-4,1],[-1,1],[-6,2]],[[6086,1672],[0,1],[1,2],[0,2],[2,6],[0,1],[4,7],[27,56],[1,8],[2,4],[4,5],[0,1],[5,7],[4,5],[7,7],[9,8],[6,14]],[[6158,1806],[191,-124],[41,-24],[11,-6],[2,-2],[3,-2],[23,-14],[6,-3],[25,-17],[13,-7],[1,-1],[82,-50]],[[6556,1556],[88,-41]],[[6644,1515],[-22,-5],[-4,-1],[-30,-7],[-4,-1],[-11,-1],[-7,0],[-5,1],[-2,1],[-14,9],[-11,7],[-8,-16]],[[8422,6449],[-26,-50]],[[8396,6399],[-3,2],[-4,2],[-5,2],[-5,3],[-28,16],[-5,2],[-4,3],[-5,3],[-5,2]],[[8234,6413],[-2,-3],[-3,-6],[-2,-6],[-9,-20]],[[8218,6378],[-7,-20]],[[8211,6358],[-9,-21],[-7,-20]],[[8195,6317],[-21,-51],[-4,-24]],[[8170,6242],[-24,97],[-9,51],[-12,61]],[[8182,6349],[3,-2],[17,39],[9,24],[-17,9],[-34,19],[-3,-10],[0,-2],[-1,-6],[2,-5],[13,-37],[8,-23],[3,-6]],[[8170,6242],[-1,-2]],[[8169,6240],[0,-3]],[[8126,6169],[7,7],[4,13],[-2,5],[-39,56],[-2,3],[0,3],[1,10],[1,3],[-33,12],[-3,1]],[[8060,6282],[-3,1],[-34,13],[-2,1]],[[8021,6297],[-14,10],[-4,3],[-15,12],[-18,13],[-9,7],[-2,1]],[[8090,6184],[-13,17],[-12,17],[-13,19]],[[8052,6237],[16,16],[-8,15],[-1,3],[0,2],[0,6],[1,3]],[[8055,6135],[-19,8],[-19,8],[-19,6]],[[7998,6157],[1,6],[8,13],[10,16],[10,15],[10,13],[15,17]],[[7998,6157],[-6,2],[-10,3],[-10,5],[-10,5]],[[7969,6192],[16,-8],[4,-1],[2,2],[7,15],[10,13],[15,21],[9,12],[8,8],[12,-17]],[[7969,6192],[22,50],[9,16]],[[8000,6258],[20,36],[1,3]],[[7950,6207],[15,25],[-18,12],[20,38],[17,-13],[16,-11]],[[7514,3024],[-1,0],[-7,-1],[-1,-4],[-7,-10],[3,-5],[1,-4],[-4,-9],[-3,-4],[-14,-14],[-13,-10],[-13,-12],[-26,-22],[-4,-4],[-56,-28],[-21,-16],[-29,-19],[-14,-5],[-14,-6],[-12,-2],[-16,0]],[[7263,2849],[-25,19],[-3,16],[4,12],[12,20],[-30,23],[10,20],[2,5],[-20,16]],[[7213,2980],[8,23],[5,10],[18,-12],[50,-33],[18,39],[14,23],[12,17]],[[7338,3047],[7,-7],[2,-1],[3,-2]],[[7350,3037],[10,-6],[19,23],[1,5],[6,31],[2,3]],[[7388,3093],[4,-2]],[[7392,3091],[5,-2],[6,-1],[15,-1],[2,0],[25,-2],[8,0],[6,0],[5,2]],[[7464,3087],[1,-7],[12,-14],[0,-1],[27,-11],[-3,-13],[7,-12],[6,-5]],[[7513,2895],[-9,5],[-6,-8],[-17,-3],[-20,-1],[-8,-3],[-37,-17],[-30,-15]],[[7386,2853],[-21,-14],[-20,-15],[-14,-8],[-11,-9],[-16,-18]],[[7304,2789],[-15,-15],[-17,-14]],[[7272,2760],[8,27],[4,16],[4,10],[7,11],[-25,21],[-7,4]],[[7514,3024],[9,-6],[10,-7],[20,-13],[2,-2],[24,-17]],[[7579,2979],[-12,-22],[-29,-51],[-4,-4],[-6,-3],[-15,-4]],[[7492,2773],[-5,7],[-5,4],[-5,1],[-5,4],[-4,7],[-8,5],[-4,0],[-7,2],[-8,11]],[[7441,2814],[-55,39]],[[7513,2895],[15,-11],[21,-16]],[[7549,2868],[-20,-37],[-17,-31],[-6,-14],[-14,-13]],[[7373,2736],[-69,53]],[[7441,2814],[-19,-17],[-18,-17],[-18,-24],[-13,-20]],[[7492,2773],[-5,-5],[37,-29]],[[7524,2739],[-28,-13],[-9,-4],[-30,-13]],[[7377,2638],[-41,31]],[[7336,2669],[12,22],[13,23],[12,22]],[[6573,2191],[63,-41],[10,-6]],[[6646,2144],[-11,-25]],[[6573,2191],[11,23]],[[6584,2214],[73,-47]],[[6584,2214],[10,22]],[[6594,2236],[73,-47]],[[6594,2236],[9,19]],[[6584,2214],[-54,34]],[[6530,2248],[3,6],[3,7],[0,1],[2,2],[4,6],[12,17]],[[6524,2222],[3,14]],[[6527,2236],[3,12]],[[6527,2236],[-2,1],[-2,1],[-28,19],[6,14],[-16,11]],[[6485,2282],[14,30],[9,18]],[[6508,2330],[29,-21],[19,-15],[2,-2]],[[6499,2188],[-2,1],[-43,28],[8,17]],[[6462,2234],[9,19],[14,29]],[[6527,2367],[-11,-21],[-2,-3],[-6,-13]],[[6462,2234],[-46,29],[0,24],[0,38],[0,24],[2,0],[1,1],[4,8],[1,2],[13,22],[2,-1],[-2,3],[0,3],[0,2],[1,2],[2,1],[1,1],[1,0],[7,-2],[-4,3],[2,3]],[[6447,2397],[0,2],[3,6],[2,3],[5,9]],[[7999,6097],[-8,-18]],[[7991,6079],[-19,10],[-18,10],[-22,-47],[-3,-11],[-2,-10],[22,2],[29,-2]],[[7978,6031],[-1,-24]],[[7977,6007],[-3,0],[-26,0],[-21,-1],[-15,-3],[-4,-1]],[[7943,6130],[21,-12],[16,-10],[19,-11]],[[7991,6079],[-8,-13]],[[7983,6066],[-4,-11],[-1,-24]],[[8026,6082],[-10,5],[-17,10]],[[8077,6052],[-18,-32],[-23,5],[-20,15],[-33,26]],[[8071,5991],[-14,6],[-9,4],[-9,2],[-14,2],[-45,2],[-3,0]],[[8042,5960],[-2,3],[-2,1],[-3,3],[-10,7],[-7,6],[-19,1],[-39,2]],[[7960,5983],[-17,0],[-13,-2],[-19,-3]],[[7911,5978],[-3,20],[0,4]],[[7987,5874],[-9,6]],[[7978,5880],[-14,13]],[[7964,5893],[13,16],[12,16],[7,8],[4,9],[-40,29],[0,12]],[[5871,2067],[-21,-122],[-1,-3]],[[5849,1942],[-3,-9],[-7,-22],[-8,-23],[-8,-22],[-20,-45],[0,-1],[-3,-8],[-19,-57],[14,-8],[2,-1],[1,0],[13,-6],[30,-14],[26,-12],[3,-2],[6,-2],[4,-2],[2,-1],[81,-39],[60,4]],[[6023,1672],[3,0],[22,0],[2,0],[10,0],[5,0],[8,0],[3,0],[3,0],[5,0],[2,0]],[[6111,1664],[0,-31],[0,-5],[0,-7],[-2,-98],[0,-14],[0,-2],[0,-1]],[[6109,1506],[-121,5],[-1,-8],[0,-4],[-1,-4],[-1,-13],[0,-30]],[[5985,1452],[-24,1]],[[5961,1453],[0,26],[-90,2],[0,-26]],[[5871,1455],[-13,1],[-10,-1],[-11,-1],[-9,4],[-6,6],[-12,-1]],[[5664,1519],[-4,0],[-2,0],[-71,3],[-2,0],[-2,0],[-72,2]],[[5511,1524],[0,2],[0,3],[0,9],[0,3],[-6,11],[-61,-7],[-7,0],[-5,1],[-22,-1],[-14,-2],[-27,-1],[-136,5],[-52,0],[-47,2],[-26,1]],[[5357,2356],[2,-2],[2,-2],[46,-49],[15,-12],[7,-5],[12,-9],[8,-7],[33,-35],[57,-64],[51,-59],[2,-3],[8,-9],[13,-14],[31,-37],[6,-6],[1,3],[2,17],[4,40],[7,50],[1,8],[0,7],[1,8],[6,49],[1,9],[1,7],[1,6],[1,5],[0,7],[1,3],[0,-1],[2,-1],[4,-4],[1,-2],[6,-5],[1,-1],[1,-1],[1,-1],[2,-1],[2,-3],[1,0],[2,-2],[2,-2],[1,-1],[2,-2],[2,-1],[2,-2],[0,-1],[1,-1],[1,0],[1,-2],[1,-1],[1,0],[3,-4],[6,-7],[2,-1],[0,-1],[1,0],[1,-1],[1,-1],[1,-1],[1,-1],[2,-1],[1,-1],[1,-2],[2,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-2],[2,-1],[1,-2],[1,-1],[1,-1],[2,-1],[1,-1],[1,-1],[1,-1],[1,-2],[1,-1],[2,-2],[1,-1],[1,-1],[1,-1],[1,-2],[1,-1],[7,-6],[3,-4],[2,-1],[1,-2],[2,-1],[1,-2],[1,-1],[2,-2],[1,-1],[1,-1],[2,-1],[0,-1],[7,-6],[9,-8],[24,-25],[1,-1],[3,-3],[16,-16],[0,-1],[4,-4],[2,-2],[1,-1],[3,-3],[1,-1],[1,-2],[2,-1],[3,-4],[7,-7],[1,-1]],[[5981,1916],[-16,-34],[-6,-7],[-24,15],[-13,10],[-2,2],[-1,1],[-2,1],[-2,2],[-1,1],[-1,1],[-1,0],[-1,1],[-3,2],[-1,1],[-1,1],[-1,0],[-1,1],[-1,1],[-1,1],[-2,1],[0,1],[-1,1],[-1,1],[-1,1],[-1,0],[-3,2],[-2,1],[-1,1],[-2,2],[-2,0],[-1,1],[-2,1],[0,1],[-2,1],[-1,0],[-1,2],[-1,1],[-2,1],[-1,1],[-1,0],[0,1],[-4,2],[-18,10],[-3,-7]],[[5871,2067],[13,73],[1,23],[2,9],[5,26],[2,9],[0,2],[40,237]],[[5934,2446],[10,-4],[12,-6],[17,-7],[11,-7],[8,-4],[4,-2],[16,-9],[7,-3],[13,-8],[4,-4],[108,-49]],[[6144,2343],[-20,-43],[-18,-36],[-6,-13],[-1,-5],[-5,-34]],[[6094,2212],[-6,-35],[0,-9]],[[6088,2168],[2,-34],[-1,-7],[-2,-4],[-24,-29],[-4,-10]],[[6059,2084],[-8,-18],[-8,-18],[-9,-18],[-8,-18],[-9,-19]],[[6017,1993],[-10,-20],[-9,-21],[-9,-18],[-33,21],[-4,-20],[29,-19]],[[6235,2626],[-9,-16],[-9,-21]],[[6217,2589],[-16,12],[-16,11],[-17,-33]],[[6168,2579],[-16,12],[17,32],[-17,13]],[[6152,2636],[8,17],[1,3],[-1,1],[-35,25],[-16,-21],[-6,-8],[-8,-5],[-6,-6],[-10,-18],[-3,-5],[-1,-8],[-9,-50],[51,-31]],[[6117,2530],[-10,-24]],[[6107,2506],[-4,-10],[-2,-11],[-15,-34],[17,-11],[18,-11],[18,-11],[26,-17]],[[6165,2401],[-4,-18],[-6,-17]],[[6155,2366],[-11,-23]],[[5934,2446],[25,152],[6,37]],[[5965,2635],[5,5],[39,44],[17,-20],[0,-1],[1,-1],[1,-1],[2,-2],[5,-7],[0,-1],[3,1],[21,10],[4,2],[0,1],[1,0],[1,1],[2,0],[0,1],[62,35],[66,-48],[40,-28]],[[6107,2506],[62,-41]],[[6169,2465],[-3,-22],[1,-27],[-2,-15]],[[6192,2521],[-41,29],[-9,7],[-5,4]],[[6137,2561],[-7,10],[-8,9],[30,56]],[[6168,2579],[16,-11],[23,-17],[-15,-30]],[[6137,2561],[-1,-5],[-4,1],[-1,0],[-1,0],[-2,-3],[-2,-4],[-9,-20]],[[6309,2476],[11,22],[-11,8],[-23,16],[-7,5],[-4,4],[2,4],[14,24],[36,-26],[7,-9]],[[6334,2524],[38,-27],[0,-52],[0,-2],[-16,0],[-3,1],[-3,2],[-4,3],[-37,27]],[[7738,7965],[-53,-45]],[[7685,7920],[-13,-12]],[[7672,7908],[-3,4],[-22,35],[-14,-12],[-49,77]],[[7584,8012],[13,13],[12,13],[51,-79],[18,15],[18,16],[17,15]],[[7713,8005],[23,-37],[2,-3]],[[7672,7908],[-15,-12],[-12,-10]],[[7645,7886],[-59,-52]],[[7586,7834],[-2,4],[-15,22]],[[7537,7964],[6,8],[5,5],[5,5],[2,1],[11,9],[3,3],[4,4],[11,13]],[[7640,7788],[-16,-14]],[[7624,7774],[-38,60]],[[7645,7886],[14,-22],[-14,-12],[11,-17]],[[7656,7835],[-30,-26],[14,-21]],[[7733,7779],[-11,-14]],[[7722,7765],[-26,41],[-14,-11],[-26,40]],[[7685,7920],[13,-21],[12,-18],[25,-40]],[[7735,7841],[24,-38]],[[7759,7803],[-13,-11],[-10,-9],[-3,-4]],[[7722,7765],[-4,-6],[-8,-7],[-15,-12],[-15,-14]],[[7680,7726],[-20,32],[12,11],[1,2],[-1,2],[-16,25],[-1,2],[-2,-1],[-13,-11]],[[7680,7726],[-16,-13]],[[7664,7713],[-40,61]],[[7805,7698],[-12,-15],[-10,-14],[-18,-22]],[[7765,7647],[-13,20],[-14,-18],[-4,-1],[-5,1],[-8,13],[-11,17],[-30,47]],[[7733,7779],[4,-7],[6,-11],[-8,-14],[10,-16],[2,-2],[1,-3],[11,-16],[10,9],[1,0],[1,-1],[10,-15],[12,15],[12,-20]],[[7831,7730],[-26,-32]],[[7759,7803],[17,14]],[[7776,7817],[42,-67],[13,-20]],[[7861,7768],[-30,-38]],[[7776,7817],[16,17],[11,11],[6,0],[5,-4],[34,-54]],[[7848,7787],[13,-19]],[[7917,7839],[-56,-71]],[[7848,7787],[20,26],[-29,44],[43,37]],[[7882,7894],[12,-18],[11,-17],[12,-20]],[[7735,7841],[9,9],[7,9],[14,21],[2,1],[15,13]],[[7782,7894],[8,-11],[3,-2],[4,0],[2,1],[11,9],[16,14],[-42,66],[16,14],[16,13]],[[7816,7998],[42,-65],[12,-20]],[[7870,7913],[12,-19]],[[7782,7894],[-30,49],[-14,22]],[[7738,7965],[65,55]],[[7803,8020],[13,-22]],[[6474,1392],[-63,40]],[[6411,1483],[20,-13],[12,-8],[12,-8],[38,-24]],[[6493,1430],[-5,-9]],[[6488,1421],[-4,-8],[-5,-11],[-5,-10]],[[6545,1440],[-10,-22],[-37,24],[-5,-12]],[[6526,1502],[10,-7],[11,-7],[16,-10],[-8,-18],[-10,-20]],[[6591,1409],[-16,-16],[-16,-17]],[[6559,1376],[-16,-16],[-39,26],[9,20],[-25,15]],[[6545,1440],[46,-31]],[[6644,1515],[8,0],[3,0],[4,1]],[[6659,1516],[0,-5],[-1,-11],[0,-8],[-2,-8],[-1,-4],[-3,-8],[-2,-2],[-24,-26],[-4,-3],[-14,-15],[-17,-17]],[[6601,1293],[-5,10],[-12,30],[-3,11],[-1,2],[-2,4],[-1,4],[-3,5],[-1,3],[-6,8],[-5,6],[-1,0],[-2,0]],[[6659,1516],[41,-1],[24,-16],[-1,-8],[2,-1],[1,0],[1,-1],[3,-1],[3,-2],[37,34],[14,13],[3,1],[3,2],[7,5],[1,0],[2,1],[5,2],[1,1],[7,4],[5,2],[4,2],[3,1],[2,2],[1,0],[2,1],[1,0],[4,2],[2,1],[1,1],[2,1],[1,0],[0,1],[2,0],[1,1],[7,5],[7,3],[5,2],[1,0],[1,1],[3,1],[3,2]],[[6871,1578],[2,-1],[7,-5],[20,-14],[35,-24],[3,-2]],[[6938,1532],[-14,-18],[-25,-20],[-27,-24],[-27,-18],[-54,-35],[-75,-47],[-110,-74],[-5,-3]],[[6556,1556],[3,8],[14,31],[9,19],[10,5],[9,6],[14,10],[15,13],[14,13],[2,2],[15,15],[16,14],[5,4],[3,1]],[[6685,1697],[46,-29]],[[6731,1668],[-8,-7],[-17,-14],[-3,-4],[-12,-10],[-27,-80],[-3,-9],[0,-6],[-1,-7],[-1,-9],[0,-6]],[[6731,1668],[85,-55],[1,0],[1,-1],[3,-2]],[[6821,1610],[2,-1],[31,-20],[1,-1],[16,-10]],[[6749,1741],[49,-32],[7,4],[7,3]],[[6812,1716],[35,-22],[11,8],[3,-2],[-31,-70]],[[6830,1630],[-9,-20]],[[6731,1668],[9,9],[9,7],[11,7],[18,8],[-15,10],[-8,5],[-21,14]],[[6734,1728],[8,7],[7,6]],[[6685,1697],[-5,5]],[[6680,1702],[40,35]],[[6720,1737],[5,-3],[4,-3],[5,-3]],[[6680,1702],[-9,4]],[[6671,1706],[6,12],[11,22]],[[6688,1740],[6,13],[2,5],[2,4],[10,21]],[[6708,1783],[11,21]],[[6688,1740],[-73,47],[-32,20],[10,22]],[[6593,1829],[10,21],[10,21]],[[6613,1871],[58,-37],[-10,-21],[36,-23],[11,-7]],[[6656,1963],[58,-38],[3,6]],[[6717,1931],[61,-39]],[[6613,1871],[9,20],[8,17],[9,18],[8,18],[9,19]],[[6593,1829],[-73,47]],[[6520,1876],[7,6],[6,12]],[[6533,1894],[10,22],[9,19],[8,18]],[[6560,1953],[17,36],[9,19]],[[6586,2008],[70,-45]],[[6671,1706],[-178,114]],[[6493,1820],[6,12],[11,23],[10,21]],[[6671,1706],[-5,-8]],[[6666,1698],[-73,47],[-8,-18]],[[6585,1727],[-59,37],[-8,-19],[-9,-19]],[[6509,1726],[-58,37]],[[6451,1763],[10,20],[8,18],[8,18],[13,-7],[3,8]],[[6532,1632],[-22,13],[-25,16],[-6,4],[10,23],[5,9],[4,5],[2,6],[9,18]],[[6585,1727],[-8,-19],[-9,-20],[-9,-18],[-7,5],[-9,-21],[-11,-22]],[[6666,1698],[-16,-14],[-15,-14],[-18,11],[-8,-20],[-1,-3],[-12,-9],[-3,-1],[-3,2],[-4,2],[-8,-16],[-2,-3],[-15,-6],[-17,-3],[-12,8]],[[6451,1763],[-9,-18],[-20,13],[-2,4],[0,21],[0,25],[-3,3]],[[6417,1811],[0,22],[0,24],[0,12]],[[6417,1869],[9,-4],[67,-45]],[[6417,1869],[6,12],[3,-2],[11,22],[10,22]],[[6447,1923],[10,20]],[[6457,1943],[70,-45],[6,-4]],[[6417,1869],[-16,8],[-10,7],[-1,1],[-28,16]],[[6362,1901],[10,5],[3,18],[2,14],[-6,29],[-2,6]],[[6369,1973],[5,6],[11,10],[19,18],[2,3],[1,3]],[[6407,2013],[1,-11],[8,-6],[0,-27],[1,-27],[30,-19]],[[6407,2013],[1,0],[5,12],[8,17]],[[6421,2042],[2,-2],[61,-38]],[[6484,2002],[-8,-18],[-9,-19],[-10,-22]],[[6484,2002],[9,17],[70,-45],[-9,-17],[6,-4]],[[6421,2042],[10,23],[8,13],[3,7],[6,12]],[[6510,2056],[70,-44],[6,-4]],[[6613,2074],[-10,-23],[-7,-14],[-1,-7],[0,-3],[-1,-3],[-8,-16]],[[6407,2013],[0,6],[-2,-6],[-3,-3],[0,-1]],[[6402,2009],[-1,26],[0,240]],[[6401,2275],[0,7]],[[6401,2282],[0,35],[1,44],[0,41],[0,4]],[[6402,2406],[4,0],[5,0],[9,0],[8,-1],[5,-1],[5,-2],[5,-2],[4,-3]],[[6401,2275],[-2,-23],[-2,-25],[-6,-29],[0,-1],[-7,-25],[-17,-42],[-13,-21]],[[6354,2109],[-14,8],[-38,25],[-31,20],[-15,9]],[[6256,2171],[13,60],[1,8],[3,9],[4,9],[4,-3]],[[6281,2254],[15,-9],[2,0],[2,2],[6,14],[17,-11],[-8,-16],[0,-1],[1,-2],[1,-1],[57,-37],[3,0],[1,2],[1,4],[1,12],[-1,8],[0,24],[0,19],[0,22],[0,2],[-2,1],[-29,18],[-17,12],[-3,3]],[[6328,2320],[0,17],[1,8],[4,11],[11,24],[6,13],[2,4],[2,8],[0,3],[-6,5],[-9,6],[2,3]],[[6341,2422],[9,-7],[7,-4],[7,-4],[4,-1],[6,0],[6,0],[7,0],[5,0],[9,0],[1,0]],[[6281,2254],[27,58],[3,7],[7,7],[6,-5],[4,-1]],[[6402,2009],[-3,1],[-19,-17],[-10,7],[-5,3],[12,24],[5,13],[-1,5],[-4,6],[-8,5],[-7,5],[-9,2],[-12,-1],[-6,-8],[-14,-22],[-21,-31]],[[6300,2001],[-15,-23]],[[6285,1978],[-25,-35]],[[6260,1943],[-15,-22]],[[6245,1921],[-11,7],[-4,3]],[[6230,1931],[71,99]],[[6301,2030],[24,35],[29,44]],[[6301,2030],[-12,12],[-57,35],[-17,10]],[[6215,2087],[8,17],[8,16],[6,10],[9,23],[10,18]],[[6230,1931],[-12,8],[10,15],[-57,37]],[[6171,1991],[8,18]],[[6179,2009],[8,18],[8,16],[9,20],[11,24]],[[6369,1973],[-3,2],[-11,7],[-8,5]],[[6347,1987],[-13,8],[-2,1],[-2,1],[-4,-1],[-9,-3],[-3,0],[-3,0],[-2,1],[-9,7]],[[6347,1987],[-31,-30]],[[6316,1957],[-17,12],[-14,9]],[[6316,1957],[-14,-14]],[[6302,1943],[-5,-4],[-3,-2],[-8,-6],[-3,0],[-4,0],[-3,2],[-16,10]],[[6281,1897],[-3,2],[-14,9],[-3,4],[-16,9]],[[6302,1943],[18,-13],[1,-3]],[[6321,1927],[-6,-4],[-18,-14],[-16,-12]],[[6321,1927],[21,-13],[-18,-15],[22,-15]],[[6346,1884],[-3,-4],[-11,-12],[-1,-3]],[[6331,1865],[-50,32]],[[6362,1901],[-5,-5],[-11,-12]],[[6730,2120],[-11,-23]],[[6719,2097],[-11,-24],[-11,-24],[-11,-22]],[[6686,2027],[-73,47]],[[6686,2027],[-11,-24],[-10,-21],[-9,-19]],[[6836,1948],[-12,-11],[-5,-4]],[[6717,1931],[6,14],[10,21],[11,23]],[[6744,1989],[61,-40],[12,24],[27,-18]],[[7964,5893],[-41,31],[-17,13]],[[7906,5937],[4,14],[1,10],[0,17]],[[7891,5897],[6,17],[9,23]],[[7978,5880],[-6,-9],[-14,-25],[-32,24],[-35,27]],[[7987,5874],[-27,-45],[8,-3],[9,-6],[-5,-10],[-5,-10],[-4,-7]],[[7963,5793],[-56,42],[-30,22]],[[7877,5857],[7,19],[7,21]],[[7944,5758],[-60,44],[-10,7],[-11,6]],[[7863,5815],[7,22]],[[7870,5837],[7,20]],[[7963,5793],[-5,-10],[-4,-8],[-7,-12],[-3,-5]],[[7925,5721],[-21,15],[-55,39]],[[7849,5775],[14,40]],[[7944,5758],[-3,-8]],[[7941,5750],[-5,-8],[-1,-3],[-9,-17],[-1,-1]],[[7908,5689],[-11,-22]],[[7897,5667],[-48,36],[-2,1],[-1,0],[-1,0],[-1,-1],[-8,-14],[-15,10]],[[7821,5699],[6,16],[4,12],[2,3],[4,13],[12,32]],[[7925,5721],[-7,-13],[-3,-6],[-7,-13]],[[7897,5667],[-7,-13]],[[7890,5654],[-9,-13],[-10,-5],[-24,-45],[2,-14],[-10,-19]],[[7839,5558],[-13,12],[-16,12],[-34,24]],[[7776,5606],[22,48]],[[7798,5654],[23,45]],[[7982,5606],[-18,9]],[[7964,5615],[-59,30],[-15,9]],[[7908,5689],[16,-8],[7,-3],[70,-36]],[[8001,5642],[-11,-21],[-8,-15]],[[7942,5529],[-10,-18]],[[7932,5511],[-9,4],[-3,2],[-54,27],[-2,1],[-9,5],[-10,-19],[-9,-19]],[[7836,5512],[-8,5],[-3,1],[-6,3]],[[7819,5521],[1,5],[7,15],[7,14],[5,3]],[[7964,5615],[-9,-19],[-9,-18],[-2,-3],[-10,-18],[-9,-18],[5,-3],[12,-7]],[[7922,5492],[-10,-19]],[[7912,5473],[-9,5],[-2,1],[-55,28],[-2,1],[-8,4]],[[7932,5511],[-10,-19]],[[7902,5454],[-9,-18]],[[7893,5436],[-10,5],[-2,1],[-25,13],[-29,15],[-2,1],[-9,5]],[[7816,5476],[10,18],[8,-4],[3,-2],[54,-28],[2,-1],[9,-5]],[[7883,5417],[-10,-19]],[[7873,5398],[-9,5],[-3,1],[-54,28],[-2,1],[-9,4]],[[7796,5437],[10,18],[0,1],[10,20]],[[7893,5436],[-10,-19]],[[7779,5446],[-62,45]],[[7717,5491],[3,6],[16,29],[1,2],[18,38],[10,21],[5,9]],[[7770,5596],[6,10]],[[7819,5521],[-10,-19],[-10,-18],[-10,-19],[-10,-19]],[[7796,5437],[-9,-17],[-11,-20]],[[7776,5400],[-23,11],[-2,1],[-2,2],[-11,7],[-42,31],[-2,-3],[-10,-18],[-9,-17],[-10,-16],[-9,-17]],[[7656,5381],[-49,36]],[[7607,5417],[9,17],[9,17],[2,4],[7,13]],[[7634,5468],[9,18],[2,3],[9,17],[8,15],[4,7]],[[7666,5528],[51,-37]],[[7779,5446],[6,-3],[3,-1],[8,-5]],[[7751,5351],[-13,-25]],[[7738,5326],[-10,5],[-1,1],[-14,8]],[[7713,5340],[-57,41]],[[7776,5400],[-1,-4],[-12,-23]],[[7763,5373],[-12,-22]],[[7685,5288],[-57,42]],[[7628,5330],[10,17],[9,17],[9,17]],[[7713,5340],[-10,-18],[-9,-17],[-5,-9],[-4,-8]],[[7702,5259],[-26,12]],[[7676,5271],[9,17]],[[7738,5326],[-12,-22],[-12,-24],[-12,-21]],[[7656,5236],[-56,41]],[[7600,5277],[9,18],[10,17],[9,18]],[[7676,5271],[-10,-18],[-10,-17]],[[7666,5190],[-8,4],[-4,3],[-14,7]],[[7640,5204],[7,14],[5,9],[4,9]],[[7702,5259],[-12,-23]],[[7690,5236],[-12,-23],[-12,-23]],[[7640,5204],[-2,-3]],[[7638,5201],[-57,42]],[[7581,5243],[9,17],[10,17]],[[7666,5190],[-10,-20],[-13,-22]],[[7643,5148],[-26,13],[-3,2],[-37,19],[-21,14]],[[7556,5196],[7,12],[9,17]],[[7572,5225],[42,-30],[14,-12],[10,18]],[[6885,1991],[-44,28]],[[6841,2019],[11,23],[7,13],[4,8]],[[6744,1989],[11,23],[11,24]],[[6766,2036],[63,-40],[12,23]],[[6766,2036],[11,24]],[[6777,2060],[11,24]],[[6788,2084],[11,20],[10,19],[9,19]],[[6788,2084],[-58,36]],[[6812,1716],[6,4],[10,4],[10,5],[-58,38],[-8,-8],[-7,-5],[-8,-7],[-8,-6]],[[7126,2087],[1,-1],[5,-4],[22,19]],[[7154,2101],[22,-16],[32,-24],[16,16],[7,7],[18,7],[19,5],[18,9],[4,5],[17,15]],[[7307,2125],[17,13],[22,10],[23,11]],[[7369,2159],[17,14],[29,34]],[[7415,2207],[19,13]],[[7434,2220],[5,5],[13,10],[4,5],[3,-3],[2,-1],[6,-7],[5,-6],[1,-1]],[[7473,2222],[-2,-3],[-3,-4],[-24,-26],[-71,-63],[-49,-40],[-52,-38],[-25,-18],[-1,0],[-49,-32],[-50,-31],[-48,-38],[-139,-160],[-7,-11],[-10,-15],[-37,-56],[-8,-10],[-10,-10],[-45,-39],[-4,-1],[-2,0],[-2,1],[-2,0],[-3,2]],[[7404,1647],[-9,-17],[-28,-56],[-10,-21],[-4,-10],[-5,-9],[-10,-13],[-6,-8],[-3,-3],[-8,-10],[-36,-48]],[[7285,1452],[-2,-2],[-39,-51],[-5,-7]],[[7239,1392],[-16,-18],[-38,-37],[-32,-30],[-8,-7]],[[7145,1300],[-24,-23],[-1,0],[-24,-23],[-9,-9],[-8,-9]],[[6829,1427],[24,16],[23,15],[21,17],[19,16],[26,25],[19,27],[16,28],[16,29],[31,37],[3,4],[3,4],[10,11],[25,29],[31,35],[25,20],[37,28],[91,67],[2,1]],[[7251,1836],[1,0],[2,-1],[4,-2],[119,-93],[5,-5],[4,-9],[16,-77],[2,-2]],[[7143,1118],[-18,4],[15,36],[-15,12],[-15,12],[1,3]],[[7145,1300],[10,-7],[49,-35]],[[7204,1258],[-25,-53],[-7,-18],[-7,-16]],[[5655,1209],[-29,15],[-2,21],[-22,-1],[3,-37]],[[5605,1207],[-24,13]],[[5581,1220],[-25,15]],[[5556,1235],[-1,6],[6,1],[11,1],[-6,77]],[[5566,1320],[19,0],[20,0],[4,0],[37,-1],[23,-1],[3,0]],[[5672,1318],[2,-20],[4,-44],[0,-7]],[[5678,1247],[-3,0],[-24,-1],[4,-37]],[[5556,1235],[-5,2],[-2,4],[-26,12]],[[5523,1253],[-1,10],[0,18],[4,19],[1,19]],[[5527,1319],[20,1],[19,0]],[[5487,1147],[-10,125]],[[5477,1272],[24,-9],[22,-10]],[[5556,1235],[1,-15],[4,-35],[-2,-14],[1,-14],[-34,-4]],[[5526,1153],[-14,-2],[-25,-4]],[[5584,1066],[-25,15],[-8,5],[-11,6],[-9,4],[-2,26],[0,6],[-3,25]],[[5581,1220],[5,-60],[5,-58]],[[5591,1102],[1,-16],[-8,-20]],[[5605,1207],[26,-15],[21,-11]],[[5652,1181],[3,-3]],[[5655,1178],[4,-58],[-22,-2],[4,-47],[-26,16],[-24,15]],[[5655,1209],[1,-18],[-4,-10]],[[5685,1161],[-3,1],[-7,3],[-8,6],[-12,7]],[[5678,1247],[2,-28],[4,-46],[1,-12]],[[5699,1041],[-16,3],[-5,-2],[-12,-9],[-7,-3],[-6,0],[-8,1],[-10,5],[-14,7],[-13,8],[-24,15]],[[5685,1161],[48,-25],[20,-8],[25,-8],[15,-3]],[[6161,5074],[-4,2],[-53,24],[-13,-21],[-35,17],[1,-5],[0,-4],[0,-2],[-1,-6],[-2,-9]],[[6054,5070],[-4,-14],[-14,-24]],[[6036,5032],[-25,-47],[-6,0],[-7,-18]],[[5998,4967],[-12,5],[-2,2]],[[5984,4974],[9,16],[8,18],[4,5],[4,4],[8,14],[2,7],[2,1],[7,11],[6,13],[8,16],[2,7],[1,8],[1,9],[0,25],[0,4],[2,16],[13,44],[7,15],[11,19]],[[6079,5226],[4,0],[7,-3],[70,-34]],[[6160,5189],[10,-5],[8,-4],[5,-2]],[[6183,5178],[-3,-5],[0,-3],[-1,-3],[0,-18],[0,-14],[-1,-11],[-2,-5],[-15,-45]],[[6267,4964],[-14,7],[-48,23]],[[6205,4994],[10,26],[4,13],[4,12],[-62,29]],[[6183,5178],[11,-6],[64,-31]],[[6258,5141],[61,-29]],[[6185,4939],[-58,30]],[[6127,4969],[9,30],[8,25]],[[6144,5024],[4,13],[4,13],[5,13],[4,11]],[[6205,4994],[-8,-23],[-2,-4],[-10,-28]],[[6226,4852],[-15,7],[-47,24]],[[6164,4883],[7,17],[4,11],[1,3],[4,12],[5,13]],[[6164,4883],[-14,7]],[[6150,4890],[-43,22]],[[6107,4912],[6,17],[4,11],[1,4],[4,11],[5,14]],[[6150,4890],[-11,-29]],[[6139,4861],[-43,21]],[[6096,4882],[5,14],[6,16]],[[6207,4802],[-61,30]],[[6146,4832],[8,22],[-15,7]],[[6115,4746],[-58,30]],[[6057,4776],[8,21]],[[6065,4797],[8,22],[8,21]],[[6081,4840],[7,21],[8,21]],[[6146,4832],[-8,-21],[-7,-21],[-8,-23],[-8,-21]],[[6175,4715],[-60,31]],[[6154,4658],[-61,31]],[[6093,4689],[7,19],[8,19],[7,19]],[[6132,4601],[-16,8],[-38,20],[-6,3]],[[6072,4632],[7,19]],[[6079,4651],[7,19],[7,19]],[[6120,4569],[-75,21],[17,47],[10,-5]],[[6113,4545],[0,1],[-130,33]],[[5983,4579],[2,5]],[[5985,4584],[11,29],[3,8],[5,16],[16,44]],[[6020,4681],[59,-30]],[[6020,4681],[8,19],[7,19]],[[6035,4719],[8,18],[7,20],[7,19]],[[6004,4476],[-21,10]],[[5983,4486],[-25,13],[-4,3]],[[5954,4502],[27,73],[2,4]],[[5954,4502],[-4,1],[-6,3]],[[5944,4506],[7,17],[-69,35],[-48,25]],[[5834,4583],[5,13],[5,13],[-1,7]],[[5843,4616],[1,0],[31,-8]],[[5875,4608],[104,-27],[2,4],[4,-1]],[[5954,4502],[-21,-54]],[[5933,4448],[-4,2],[-4,4],[-3,2],[-18,10],[0,3],[-16,7],[-15,8],[-15,9],[11,30],[7,18],[68,-35]],[[5933,4448],[-19,-48],[-6,-18]],[[5841,4433],[-3,2],[-64,48],[-26,20]],[[5748,4503],[6,9],[14,36],[7,20],[8,20],[6,18]],[[5789,4606],[45,-23]],[[6029,4373],[-4,-2],[-26,-9],[-9,-2],[-15,-2],[-9,1],[-7,0],[-6,0],[-11,2],[-9,4],[-13,5],[-13,8]],[[5983,4486],[-11,-29],[-11,-24],[19,-12]],[[5710,4453],[35,46],[3,4]],[[7848,608],[-11,0],[-8,4],[-5,6],[-17,28],[-10,13],[-6,19],[-1,22],[5,9],[5,6],[7,5],[10,9],[5,4],[8,7],[13,2],[11,-1],[15,-4],[5,-1],[17,1],[18,2],[20,5],[25,8],[16,7],[7,3],[12,4],[23,13],[11,5],[9,4],[9,3],[18,7],[10,-3],[4,0],[31,-10],[8,-1],[2,-12],[0,-8],[-4,-12],[0,-5],[-4,-17],[-4,-7],[-10,-9],[-10,-10],[-10,-12],[-7,-9],[-8,-11],[-12,-12],[-4,-2],[-9,-2],[-15,-8],[-28,-13],[-23,-3],[-25,-8],[-11,-2],[-14,-1],[-10,-4],[-19,-1],[-10,-1],[-29,-7]],[[7669,768],[-1,7]],[[7668,775],[4,5],[8,6],[3,7],[1,9],[-1,7],[-4,5],[-5,4],[-5,7],[-5,4],[-3,3],[-3,5],[-14,9],[-3,1],[-3,-2],[-1,-4],[-1,-2]],[[7636,839],[-12,10],[-6,1],[-4,1],[-2,1]],[[7612,852],[-65,17]],[[7547,869],[4,22],[4,21]],[[7555,912],[4,22],[4,20],[5,20]],[[7568,974],[65,-17]],[[7633,957],[51,-13]],[[7684,944],[38,12],[15,15]],[[7737,971],[-27,-27],[-9,-8],[-10,-10],[-7,-10],[-2,-7],[-1,-13],[1,-5],[4,-2],[4,0],[13,-4],[10,-6],[4,-6],[6,-13],[3,-3],[5,0],[8,4],[3,5],[11,13],[5,6],[2,0],[-1,-2],[-18,-25],[-10,-14],[0,-11],[-8,-4],[-4,-4],[-13,-20],[-3,-7],[-6,-9],[-6,-2],[-13,-11],[-9,-8]],[[7915,744],[-7,0],[-7,3],[-11,2],[-23,7],[-12,2],[-16,1],[-1,2],[4,3],[8,3],[21,11],[9,8],[32,20],[11,4],[6,2],[42,21],[13,6],[8,1],[12,-1],[18,-3],[27,-9],[13,-3],[27,-14],[6,-5],[0,-3],[-7,0],[-9,2],[-12,1],[-8,0],[-12,-2],[-12,-3],[-11,-5],[-18,-5],[-14,-5],[-13,-3],[-11,-4],[-18,-8],[-21,-6],[-9,-5],[-7,-1],[-2,-2],[2,-2],[5,-2],[2,-5],[-1,-2],[-4,-1]],[[7608,830],[-2,0],[-7,1],[-50,3],[-11,1]],[[7538,835],[4,14],[5,20]],[[7612,852],[-1,-7],[0,-4],[2,2],[-1,-4],[-4,-9]],[[7522,803],[4,8]],[[7526,811],[9,20],[1,2],[2,2]],[[7608,830],[-1,-3],[-9,-24],[-2,-4],[-3,-10],[-4,-11],[-9,-17],[-13,-13],[-14,-11],[-6,-5],[-11,20],[18,15],[11,11],[3,8],[-12,6],[-12,4],[-22,7]],[[7636,839],[-4,-4],[-3,-5],[-13,-27],[-34,-61],[-2,-3],[-7,-9],[-7,-12],[-13,-14],[-25,-35],[-11,-20],[-21,-30],[-15,-22],[-15,-18],[-9,-9],[-13,-11],[-19,-14],[-3,-2],[-14,-6],[-12,-4],[-12,-7],[-3,-2]],[[7381,524],[-1,6]],[[7380,530],[31,10],[49,37],[51,77],[5,9],[-22,13],[-25,15]],[[7469,691],[10,19],[15,32],[10,23]],[[7504,765],[8,17],[10,21]],[[7715,417],[-8,-8],[-9,-8],[-6,-7],[-18,-14],[-10,-4],[-19,1],[-8,2],[-11,10],[-10,12],[-4,9],[8,14],[9,6],[7,3],[3,2],[5,-1],[6,-2],[7,-4],[3,-1],[20,-3],[18,-2],[18,-2],[-1,-3]],[[7669,768],[-5,-5],[-8,-14],[-28,-30],[-11,-14],[-8,-12],[-6,-7],[-1,-1],[-1,0],[0,4],[6,11],[10,14],[22,26],[5,8],[15,15],[6,8],[3,4]],[[7380,530],[-9,14],[-9,19],[-16,35]],[[7346,598],[19,7],[18,8],[5,1],[14,6],[17,9],[2,1],[11,8],[2,2],[9,9],[4,4]],[[7447,653],[7,8],[7,12],[8,18]],[[7346,598],[-10,25]],[[7336,623],[67,28],[11,23]],[[7414,674],[16,-9],[17,-12]],[[7336,623],[-9,20],[-9,21]],[[7318,664],[17,6],[17,8]],[[7352,678],[25,9],[4,9]],[[7381,696],[17,-11],[16,-11]],[[7633,957],[4,21],[5,21]],[[7642,999],[74,-20]],[[7716,979],[-17,-17],[-15,-18]],[[7568,974],[3,22],[4,21]],[[7575,1017],[67,-18]],[[7630,1111],[-4,-21],[32,-7],[-8,-42]],[[7650,1041],[-4,-21],[-4,-21]],[[7575,1017],[5,21]],[[7580,1038],[3,20],[0,9],[-5,15],[-12,24],[-7,15],[0,9]],[[7559,1130],[71,-19]],[[7451,1007],[-13,5]],[[7438,1012],[39,41],[24,26],[10,12],[14,22],[28,52],[1,1]],[[7554,1166],[12,-2]],[[7566,1164],[-6,-11],[-3,-8],[2,-15]],[[7580,1038],[-66,18],[-5,-21],[-25,7],[-17,-18],[-16,-17]],[[7501,993],[-50,14]],[[7568,974],[-67,19]],[[6314,834],[-39,-1],[-2,-11],[-18,7],[-10,7],[-22,32],[-9,9]],[[6214,877],[0,47],[0,4],[17,0],[0,-34],[8,-8],[10,-13],[-1,55],[18,1],[0,9]],[[6266,938],[46,1]],[[6312,939],[1,-27],[1,-78]],[[6375,732],[-5,-17]],[[6370,715],[-11,11],[-5,9],[-14,17],[-2,4],[-17,17],[-3,3],[-35,24],[-8,11],[-1,1],[-10,4],[-5,0],[-8,5],[-3,4],[-11,14],[-2,3],[-7,7],[-17,18]],[[6211,867],[0,12]],[[6211,879],[3,-2]],[[6314,834],[20,0],[19,1]],[[6353,835],[20,0],[1,-80],[-5,-16],[3,-4],[3,-3]],[[6533,876],[-2,-8],[24,-6]],[[6555,862],[-22,-78],[-1,-6],[-4,-13]],[[6528,765],[-9,2],[-4,1],[-9,3],[-2,0],[-6,2],[-21,6]],[[6477,779],[-22,8],[-10,6],[-18,7],[-14,-46],[-14,-47],[-10,12],[-3,4],[-3,3],[-8,6]],[[6375,732],[1,6],[13,54],[1,3],[6,24],[3,17],[3,23],[1,5]],[[6403,864],[2,3],[1,2],[2,2],[2,4],[2,3],[1,2],[7,6],[12,5],[11,0],[17,-5],[5,-1],[19,-6],[45,-11],[2,8]],[[6531,876],[2,0]],[[6488,656],[-1,-2],[0,-4],[-1,-3],[-2,-6],[-2,-7],[-2,-5]],[[6480,629],[-3,-9]],[[6477,620],[-7,4],[-7,6],[-3,2],[-13,11],[-21,20],[-5,6],[-4,5],[-11,12],[-18,15],[-8,4],[-10,10]],[[6477,779],[-16,-53],[-5,-19],[-1,-7],[-5,-20],[17,-10],[7,-5],[1,-1],[13,-8]],[[6606,724],[-21,8],[-20,-74]],[[6565,658],[-51,33],[-6,4],[-1,-7],[-5,-16],[-6,-22],[-8,6]],[[6528,765],[6,-2],[11,-6],[13,-7],[32,-16],[3,-1],[14,-5],[-1,-4]],[[6565,658],[-7,-22],[-6,-22],[-7,-24],[-19,14],[-16,9],[-21,12],[-9,4]],[[6903,754],[18,-4],[17,-5],[19,-3]],[[6957,742],[-18,-64]],[[6939,678],[-9,-4],[-11,3],[-16,7],[-18,7],[18,63]],[[6940,607],[-2,4],[-2,-2],[-1,-1],[-3,-2],[-3,-1],[-4,0],[-3,1],[-4,1]],[[6918,607],[1,3],[6,21],[6,20]],[[6931,651],[6,20],[2,7]],[[6957,742],[18,-5],[20,-4],[20,1],[15,6],[7,4],[7,7],[7,11],[2,2]],[[7053,764],[4,-5],[4,-5],[3,-5],[14,-38],[1,-7],[1,-4],[3,-7]],[[7083,693],[-15,-8],[-37,-15],[-33,-16],[-18,-13],[-24,-20],[-16,-14]],[[7098,603],[-7,-20],[-14,-7],[-13,-4],[-7,-4]],[[7057,568],[-7,-2]],[[7050,566],[-16,44],[-8,19],[-30,-15],[-6,-3],[-15,-17],[1,-48]],[[6976,546],[-1,-59],[-1,-44],[-15,5],[-12,3],[-3,1],[-2,0],[-22,2],[-13,-2],[-5,0]],[[6902,452],[11,50],[12,46],[15,34],[18,25],[25,20],[29,21],[38,15],[33,14],[5,2]],[[7088,679],[3,-6],[2,-7],[2,-4],[2,-3],[3,-3],[2,-2],[14,-11],[-7,-13],[-7,-16],[-4,-11]],[[6993,546],[-17,0]],[[7050,566],[-20,-7],[-18,-7],[-19,-6]],[[7057,568],[-4,-31],[-1,-22],[-1,-4],[0,-23]],[[7051,488],[-22,0],[-21,0],[-15,58]],[[7098,603],[18,-8],[6,-14],[17,-45],[9,-20]],[[7148,516],[-15,-7],[-33,-13],[-9,-4]],[[7091,492],[-14,-3],[-26,-1]],[[7148,516],[15,-35],[8,-23]],[[7171,458],[-20,-8],[-37,-11],[-13,-3],[-8,22],[-2,34]],[[7194,535],[18,-43],[18,2]],[[7230,494],[19,1],[20,-1]],[[7269,494],[-4,-23],[-19,1],[-24,-4],[-29,-2],[-22,-8]],[[7148,516],[19,8],[9,4]],[[7176,528],[18,7]],[[7194,535],[17,8],[-19,44],[0,7],[2,8],[17,19],[13,10],[12,-14],[8,-15],[9,-20],[7,-19]],[[7260,563],[-16,-7],[8,-18]],[[7252,538],[-17,-7],[-17,-7],[12,-30]],[[7252,538],[16,6],[16,7],[21,-49]],[[7305,502],[-7,-7],[-9,-3],[-8,-1],[-12,3]],[[7260,563],[33,13]],[[7293,576],[26,-62],[-14,-12]],[[7175,450],[-4,8]],[[7293,576],[53,22]],[[7381,524],[-20,-14],[-8,-7],[-12,-8],[-18,-15],[-10,-6],[-12,-11],[-6,-4],[-4,-1],[-3,0],[-3,2],[-12,0],[-26,-4],[-16,-4],[-18,0],[-22,1],[-3,0],[-13,-3]],[[7175,450],[-16,-4],[-18,-6],[-10,-4],[-10,-7],[-8,-5],[-22,-3],[-11,1],[-5,3],[-8,3],[-21,2],[-35,0],[-26,-1],[-26,0],[-13,-2],[-8,1],[-1,-5],[-2,-2],[-7,-6],[-3,0],[-16,4],[-11,-2],[-4,1],[8,34]],[[6886,453],[-7,-32],[-23,4]],[[6856,425],[16,35]],[[6872,460],[3,-4],[4,-2],[3,-1],[4,0]],[[7464,1065],[-2,2],[-3,4],[-2,4],[-3,2],[-5,5],[-4,2],[-9,5]],[[7436,1089],[-9,3],[-16,5],[-78,21]],[[7333,1118],[-56,17]],[[7277,1135],[13,65]],[[7290,1200],[56,-15],[4,22]],[[7350,1207],[2,-1],[2,-1],[70,-17],[2,-2],[-1,-3],[-3,-17],[10,-3],[7,-3],[5,-2],[9,-4],[37,-9],[11,21],[2,3]],[[7503,1169],[17,1],[11,4],[4,-1]],[[7535,1173],[2,-1]],[[7537,1172],[-2,-3],[-24,-46],[-16,-23],[-10,-11],[-20,-24],[-1,0]],[[7350,1207],[4,12]],[[7354,1219],[95,-32],[54,-18]],[[7290,1200],[5,22],[2,12]],[[7297,1234],[57,-15]],[[7399,1492],[20,35],[6,30]],[[7481,1573],[2,-10],[7,-32],[0,-2],[8,-40],[-2,-11]],[[7496,1478],[-21,5],[-21,6],[-21,5],[-10,0],[-6,0],[-8,-1],[-10,-1]],[[7518,1584],[3,-10],[0,-2],[7,-35],[8,-37],[3,-11]],[[7539,1489],[2,-10],[-2,-12]],[[7539,1467],[-21,5],[-22,6]],[[7554,1595],[3,-12],[15,-72],[3,-12]],[[7575,1499],[-18,-5],[-18,-5]],[[7637,1518],[-27,-8]],[[7610,1510],[-19,-6],[-16,-5]],[[7610,1510],[3,-12],[9,-41],[-2,-11]],[[7620,1446],[-21,6],[-19,5],[-20,5],[-21,5]],[[7679,1530],[2,-10],[11,-48],[2,-2]],[[7694,1470],[-9,-16],[-5,-9]],[[7680,1445],[-2,-3],[-5,-9]],[[7673,1433],[-3,1],[-20,4],[-30,8]],[[7740,1546],[-18,-29],[-18,-30],[-10,-17]],[[7675,1631],[3,-10],[17,-75],[2,-10],[9,3],[9,3],[23,6],[2,-2]],[[7983,2761],[-12,16],[-9,10],[-7,7]],[[7955,2794],[26,32],[-7,8],[25,25]],[[7999,2859],[7,-8],[5,-5],[3,-3],[10,-12],[13,-17]],[[8037,2814],[-28,-27],[0,-1],[-26,-25]],[[7932,2709],[-8,21],[-4,11]],[[7920,2741],[8,11],[3,6],[24,36]],[[7983,2761],[-26,-27],[-10,-10],[-15,-15]],[[7949,2664],[-8,20],[-9,25]],[[7983,2761],[15,-20],[12,-15]],[[8010,2726],[-28,-29],[-33,-33]],[[8041,2683],[-25,-24]],[[8016,2659],[-7,10],[-23,-23],[-22,-22]],[[7964,2624],[-8,21]],[[7956,2645],[-7,19]],[[8010,2726],[10,-15],[2,-1],[11,-16],[8,-11]],[[8022,2541],[-5,7],[-6,8]],[[8011,2556],[-8,11],[-19,25],[-5,6],[-3,4],[0,4],[-12,18]],[[8016,2659],[7,-9],[11,-14],[4,-5],[12,-16],[12,-16],[1,-1]],[[8063,2598],[-13,-17],[-27,-38],[-1,-2]],[[8041,2683],[6,-9],[26,26],[13,11],[16,16]],[[8102,2727],[11,-16],[1,-3],[19,-15]],[[8133,2693],[-5,-7],[-19,-25],[-14,-20],[-7,-8],[-22,-32],[-3,-3]],[[8010,2726],[26,25],[27,28]],[[8063,2779],[11,-15],[12,-16]],[[8086,2748],[16,-21]],[[8037,2814],[9,-11],[6,-9]],[[8052,2794],[11,-15]],[[8052,2794],[17,18],[7,11]],[[8076,2823],[14,-12],[15,-12],[16,-12],[-8,-12],[-27,-27]],[[8285,2852],[-5,-5],[-3,5],[-10,-4],[6,-8],[-17,-17],[-6,9],[-7,-8],[3,-5],[-11,-6],[-9,-3],[-14,-3],[-11,-3],[-6,0],[-1,-3],[27,6],[6,0],[17,4],[-1,-3],[-10,-10],[-37,-37],[-2,-2],[-7,-3],[-9,-8],[-19,-22],[-6,-8],[-7,-9],[-5,-4],[0,-3],[-8,-9]],[[8076,2823],[13,22],[13,23],[27,48]],[[8129,2916],[23,-18],[12,-11],[14,29]],[[8178,2916],[16,-12],[24,-20],[36,-17],[31,-15]],[[8179,2575],[-13,18],[-1,1],[-14,19],[-50,-51]],[[8101,2562],[-13,12],[-8,7],[-12,12]],[[8068,2593],[5,7],[6,6],[6,7],[16,17],[5,2],[6,8],[15,20],[3,6],[5,4],[8,10],[9,11],[15,19],[33,35],[1,5],[2,2]],[[8223,2723],[-35,-36],[16,-20],[14,-19],[14,-19]],[[8232,2629],[-27,-27],[-26,-27]],[[8280,2678],[-18,-18],[-14,-14],[-16,-17]],[[8260,2542],[-5,11],[-10,19]],[[8245,2572],[14,21],[-12,16],[-15,20]],[[8245,2572],[-9,-11],[-27,-26],[-15,20],[-15,20]],[[8260,2542],[-31,-36],[-19,-19],[-13,-13]],[[8197,2474],[-3,3],[-3,1],[-10,10],[-15,14],[-13,12],[-19,17]],[[8134,2531],[45,44]],[[8272,2517],[-41,-74]],[[8231,2443],[-13,12],[-16,14],[-1,2],[-4,3]],[[8290,2482],[-33,-64]],[[8257,2418],[-14,13]],[[8243,2431],[-12,12]],[[8280,2365],[-21,12],[8,17],[5,11],[-15,13]],[[8271,2345],[-20,14],[-18,12],[-9,5],[-8,6],[6,11],[3,6],[13,22],[5,10]],[[8262,2326],[-20,13]],[[8242,2339],[-17,10],[-20,11],[-15,9],[-15,8],[-33,19],[-1,0],[-9,1],[-12,3]],[[8120,2400],[1,10],[0,4],[0,2],[0,5],[0,10],[0,6]],[[8121,2437],[22,6],[16,8],[16,9],[14,8],[7,5],[1,1]],[[6637,501],[-2,-12]],[[6635,489],[-23,26],[-11,12],[-16,12],[-16,19],[-5,7],[-31,25],[-18,9],[-10,3],[-15,10],[-13,8]],[[6565,658],[3,-67],[44,-43],[2,-22],[23,-25]],[[6565,658],[17,-7],[-6,-21]],[[6576,630],[-3,-14],[1,-7],[34,-36],[4,-5],[6,-4],[6,-3],[27,-10]],[[6651,551],[-8,-28]],[[6643,523],[-6,-22]],[[6576,630],[10,-6],[30,-30]],[[6616,594],[10,-11],[12,-5],[10,37]],[[6648,615],[19,-7]],[[6667,608],[-9,-31],[-7,-26]],[[6616,594],[10,13],[1,5],[-17,16],[-2,4],[0,3],[3,14],[5,21],[-16,7],[5,20]],[[6605,697],[60,-22],[-6,-20],[-11,-40]],[[6606,724],[5,-2],[-6,-25]],[[6691,692],[-9,-33]],[[6682,659],[-15,-51]],[[6555,862],[95,-24]],[[6650,838],[78,-17]],[[6728,821],[-27,-94],[-9,-31],[-1,-4]],[[6682,659],[18,-8],[17,-6]],[[6717,645],[-13,-48],[-3,-2],[-16,5],[-18,8]],[[6822,642],[-10,-33]],[[6812,609],[-42,16]],[[6770,625],[-17,6],[-17,7]],[[6736,638],[-16,6],[-3,1]],[[6691,692],[23,-9],[27,-10],[33,-13],[48,-18]],[[6770,625],[-13,-47],[-2,-3],[-4,0],[-13,5],[-16,6],[0,6],[14,46]],[[6812,609],[-15,-52]],[[6797,557],[-10,-33],[-11,-37]],[[6776,487],[-20,2],[-5,1],[-20,3],[-18,4],[-16,5],[-36,14],[-18,7]],[[6834,517],[2,-23],[-18,-3],[4,-33]],[[6822,458],[-26,-6],[-8,0],[-9,-1],[-13,2],[10,34]],[[6797,557],[20,-8],[9,-3],[4,0],[4,-29]],[[6856,425],[-81,14],[-9,-1],[-14,1],[-15,4],[-11,2],[-13,2],[-3,2],[-16,5],[-16,7],[-9,2],[-21,12],[-6,6],[-7,8]],[[6822,458],[31,5],[10,0],[5,-2],[4,-1]],[[6834,517],[11,2],[5,4],[2,4],[6,21]],[[6858,548],[19,-7],[-13,-45],[5,-1],[4,-1],[5,-1],[4,-2],[-10,-31]],[[6822,642],[52,-19]],[[6874,623],[-6,-24],[-2,-24],[-8,-27]],[[6874,623],[29,-11],[15,-5]],[[6940,607],[-4,-4],[-11,-19],[-17,-46],[-12,-43],[-10,-42]],[[6822,642],[1,4],[9,31],[28,-10],[3,11]],[[6863,678],[9,-4],[8,-3],[51,-20]],[[6863,678],[22,80],[18,-4]],[[7573,1803],[-22,96]],[[7592,1912],[3,-11],[4,-18],[1,-5]],[[7600,1878],[2,-11],[9,-40],[3,-11]],[[7668,1904],[-1,-20]],[[7667,1884],[-1,-21]],[[7666,1863],[-9,1],[-13,1],[-12,1],[-3,-1],[-6,-1],[-3,10],[-2,9],[-18,-5]],[[7666,1863],[-1,-20],[-1,-10],[0,-10]],[[7664,1823],[-22,1],[-10,-2],[-18,-6]],[[7664,1823],[17,-1],[29,-2],[-1,-20],[10,0],[23,-2],[10,0]],[[7714,1880],[-1,-21],[8,0],[25,-2],[9,-1]],[[7667,1884],[9,-1],[29,-2],[9,-1]],[[7714,1880],[1,21],[1,20],[1,21]],[[7530,1791],[-3,12],[-15,72],[-3,11]],[[7509,1886],[19,6],[23,7]],[[7497,1781],[-3,12],[-13,61],[-1,7],[0,2],[1,2]],[[7481,1865],[1,2],[1,11],[9,3],[17,5]],[[7457,1770],[-5,24],[-5,24],[-7,35],[11,3],[10,3],[20,6]],[[7251,1836],[25,14],[30,16],[35,19],[72,37],[123,85],[22,18],[3,3],[3,2],[1,1]],[[7176,528],[-9,21],[-1,5],[-8,17],[-1,5],[-8,18],[-3,8],[2,5],[15,17],[12,15],[17,17],[12,9],[15,9],[16,9],[-16,43],[14,16],[15,14]],[[7248,756],[34,-22],[5,-6],[7,-11],[24,-53]],[[7088,679],[20,8],[29,17],[38,29],[1,0],[47,51],[2,2]],[[7225,786],[0,-1],[5,-7],[5,-5],[13,-17]],[[7083,693],[36,18],[24,16]],[[7143,727],[-15,-12],[-45,-22]],[[7225,786],[37,40]],[[7262,826],[1,-1],[12,-9],[8,-6],[7,-4],[65,-42]],[[7355,764],[-6,-10],[-5,-8],[-2,-1],[-6,-6],[-8,-4],[12,-27],[12,-30]],[[7355,764],[33,-21],[11,-7]],[[7399,736],[-9,-20],[-9,-20]],[[7445,731],[-9,-19]],[[7436,712],[-37,24]],[[7355,764],[9,19],[17,-11],[15,-10],[10,19]],[[7406,781],[48,-30],[-9,-20]],[[7436,712],[13,-7],[20,-14]],[[7445,731],[18,-11],[25,55]],[[7488,775],[16,-10]],[[7406,781],[7,18]],[[7413,799],[49,-30],[9,17],[17,-11]],[[7413,799],[10,20]],[[7423,819],[23,-4],[36,-3],[23,-1],[-17,-36]],[[7423,819],[-17,9],[-17,11],[4,8],[5,9]],[[7398,856],[8,-4],[11,-6],[19,-7],[16,-4],[41,-2],[25,-1],[5,-2],[3,-3],[1,-2],[0,-2],[1,-2],[0,-3],[-1,-2],[-1,-5]],[[7398,856],[0,2],[1,1],[5,11],[7,16],[4,18]],[[7415,904],[66,-17]],[[7481,887],[66,-18]],[[7415,904],[4,21],[4,22],[5,21],[66,-18]],[[7494,950],[-4,-20]],[[7490,930],[-5,-22],[-4,-21]],[[7501,993],[-4,-21],[-3,-22]],[[7415,904],[-48,12],[-12,6],[-2,1]],[[7353,923],[14,13],[71,76]],[[7684,2843],[-14,-11],[-9,-7]],[[7661,2825],[-6,-2],[-11,-6],[-11,-9]],[[7633,2808],[-29,21],[-31,22],[-11,7],[-9,8]],[[7553,2866],[12,18],[19,-12],[4,-3],[21,3],[3,2],[2,4],[2,4],[4,5],[6,-1],[8,-6]],[[7634,2880],[50,-37]],[[7727,2937],[-5,-7],[-8,5],[-9,-1],[-11,-6],[-7,-9],[-6,-12],[-13,9],[-11,7],[-11,-22],[-12,-21]],[[7553,2866],[-4,2]],[[7579,2979],[13,-8],[9,14],[8,14]],[[7609,2999],[15,-8],[16,-8],[14,-7],[18,-10],[25,-13],[30,-16]],[[7745,2927],[-15,-22],[-16,-23],[-14,-20],[-16,-19]],[[7727,2937],[18,-10]],[[7866,3000],[-19,18]],[[7847,3018],[15,20],[8,11]],[[7870,3049],[12,-12],[3,-3],[3,-2]],[[7888,3032],[-8,-11],[-3,-5],[-4,-6],[-7,-10]],[[7891,2976],[-7,6],[-2,3],[-7,7],[-2,1],[-7,7]],[[7888,3032],[8,-9],[8,-7],[9,-10]],[[7913,3006],[-11,-15],[-11,-15]],[[7911,2957],[-20,19]],[[7913,3006],[10,-9],[2,-1],[7,-7]],[[7932,2989],[-1,-2],[-6,-10],[-8,-10],[-1,-1],[-4,-6],[-1,-3]],[[7952,2919],[-3,3],[-6,7],[-9,9],[-8,6],[-3,1],[-12,12]],[[7932,2989],[0,3],[7,8],[9,13],[6,10],[14,-14]],[[7968,3009],[-5,-7],[-2,-2],[-9,-13],[-6,-8],[-2,0],[-2,0],[4,-2],[24,-24],[1,-1],[1,-2]],[[7972,2950],[-1,-2],[-9,-15],[-10,-14]],[[7968,3009],[12,-11],[8,-7],[2,-2],[1,-1],[1,-2]],[[7992,2986],[-8,-16],[-12,-20]],[[8023,3038],[-16,-27],[-15,-25]],[[7913,3006],[24,34],[14,20],[14,20]],[[7965,3080],[11,-8],[5,-3],[23,-17],[4,-5],[7,-5],[5,-1],[3,-3]],[[7888,3032],[5,7],[10,13],[2,3],[0,1],[6,8]],[[7937,3101],[18,-14],[10,-7]],[[7847,3018],[-13,13]],[[7834,3031],[18,35],[20,37]],[[7894,3081],[-7,-9],[-17,-23]],[[7830,3205],[-10,-19],[-5,-11],[-4,-6],[-22,-45]],[[7789,3124],[-7,3],[-4,0],[-7,-2],[-5,-2],[-8,-6],[7,10],[4,6],[2,5],[33,70]],[[7804,3208],[3,-2],[6,11],[17,-12]],[[7804,3208],[4,17],[5,24],[2,7]],[[7815,3256],[32,71],[9,19],[12,23],[15,26]],[[7883,3395],[49,-39],[-2,-4],[-18,-22]],[[7912,3330],[-13,-21]],[[7899,3309],[-17,-24]],[[7882,3285],[-19,-27]],[[7863,3258],[-17,-27],[-16,-26]],[[7900,3152],[-29,22],[-6,5]],[[7865,3179],[-35,26]],[[7863,3258],[39,-30],[8,-7],[21,-16]],[[7931,3205],[-9,-16],[-8,-12],[-7,-12],[-7,-13]],[[7887,3131],[-25,-3],[-12,-2],[-13,-1]],[[7837,3125],[18,41],[2,0],[8,13]],[[7900,3152],[-13,-21]],[[8242,2339],[-19,-40]],[[8223,2299],[-17,10],[-11,7],[-36,24],[-2,0],[-4,-2],[-4,-1],[-7,-3],[-9,-5],[-2,-1]],[[8131,2328],[-10,27],[-3,8],[-1,3],[0,4],[2,21],[1,9]],[[8223,2299],[-11,-29]],[[8212,2270],[-4,1],[-31,2],[-9,-5],[-10,-4],[0,-2]],[[8158,2262],[-6,13],[0,1],[-14,34],[-4,10],[-2,5],[-1,3]],[[8203,2195],[-14,8],[-10,4]],[[8179,2207],[3,1],[17,29],[13,33]],[[8149,2209],[2,53],[7,0]],[[8179,2207],[-9,0],[-21,2]],[[8124,2160],[3,51]],[[8127,2211],[22,-2]],[[8191,2174],[-1,-4],[-1,-6],[0,-9]],[[8127,2211],[3,52],[-21,2]],[[8109,2265],[2,60],[0,2],[10,-1],[6,0],[2,1],[2,1]],[[8084,2214],[3,53]],[[8087,2267],[22,-2]],[[8127,2211],[-22,1],[-21,2]],[[8087,2267],[3,57],[0,5],[-7,9],[1,2],[-6,13],[-4,18],[-1,5],[-4,14],[3,3],[9,5],[9,0],[9,1],[21,1]],[[8103,2161],[-22,2]],[[8081,2163],[3,51]],[[6842,3392],[17,-12],[-33,-63],[-1,-4]],[[6825,3313],[-17,13]],[[6808,3326],[34,66]],[[6766,3248],[42,78]],[[6825,3313],[0,-4],[-41,-75]],[[6784,3234],[-18,14]],[[6752,3369],[17,-12]],[[6769,3357],[3,-3],[1,-2],[13,-10]],[[6786,3342],[2,-2],[2,-2],[1,0],[11,-8],[2,-2],[2,-2],[2,0]],[[6766,3248],[-19,13]],[[6747,3261],[-38,29],[-15,11]],[[6694,3301],[39,74],[16,-11],[2,3],[1,2]],[[6769,3357],[15,8],[39,73],[15,2]],[[6838,3440],[-52,-98]],[[6957,3427],[-9,-23],[-34,-65]],[[6914,3339],[-10,6],[-9,7]],[[6895,3352],[38,72],[6,16]],[[6957,3427],[21,-15],[4,0]],[[6982,3412],[-12,-22],[-12,-22],[-12,-22]],[[6946,3346],[-12,-23]],[[6934,3323],[-2,2],[-18,14]],[[6984,3317],[-38,29]],[[6982,3412],[21,1]],[[7003,3413],[-5,-16],[-11,-20],[21,-16],[-12,-22],[-12,-22]],[[6984,3317],[-11,-21]],[[6973,3296],[-17,13]],[[6956,3309],[-18,13],[-4,1]],[[6950,3253],[-15,11],[0,5],[19,37],[2,3]],[[6973,3296],[-1,-3],[-22,-40]],[[6973,3296],[21,-16]],[[6994,3280],[-1,-3],[-22,-40],[-21,16]],[[7010,3266],[-23,-42]],[[6987,3224],[-14,-24]],[[6973,3200],[-35,30]],[[6938,3230],[12,23]],[[6994,3280],[13,-9],[3,-5]],[[6938,3230],[-16,11]],[[6922,3241],[-18,13]],[[6904,3254],[5,13],[13,34],[12,22]],[[6904,3254],[-2,2],[-8,6],[-15,11]],[[6879,3273],[6,11],[29,55]],[[6861,3286],[1,3],[33,63]],[[6879,3273],[-15,11]],[[6864,3284],[-3,2]],[[6904,3254],[-41,-78]],[[6863,3176],[-3,2],[-8,6],[-10,7]],[[6842,3191],[-20,15]],[[6822,3206],[42,78]],[[6880,3163],[-17,13]],[[6922,3241],[-42,-78]],[[6973,3200],[-41,-76]],[[6932,3124],[-33,26]],[[6899,3150],[-19,13]],[[7003,3413],[17,1]],[[7020,3414],[20,-15],[4,-3],[26,-19]],[[7070,3377],[-25,-45],[-35,-66]],[[7145,3353],[-36,-67],[-37,-66]],[[7072,3220],[-13,10],[-49,36]],[[7070,3377],[14,24]],[[7125,3172],[-5,4],[-12,12],[-3,2]],[[7105,3190],[-15,15]],[[7090,3205],[38,68],[32,59]],[[7020,3414],[14,24],[16,30]],[[6939,3671],[-44,-81]],[[6895,3590],[-11,8],[-8,6],[-17,13],[-9,7],[-3,3]],[[6847,3627],[9,17],[21,39],[5,13],[2,2]],[[6884,3698],[2,-2],[9,-7],[2,-1],[2,-2],[6,-6],[11,-2],[23,-7]],[[6939,3671],[25,-7]],[[6964,3664],[-18,-6],[-9,-15],[-29,-51],[-13,-2]],[[6964,3664],[-7,-12],[-20,-37],[-24,-44]],[[6913,3571],[-7,11],[-11,8]],[[6964,3664],[10,-4],[12,-9]],[[6986,3651],[-7,-12],[-49,-92]],[[6964,3664],[9,17],[19,27],[15,27]],[[7007,3735],[12,21],[11,-7]],[[7030,3749],[6,-6],[-34,-64]],[[6939,3671],[17,30],[9,15],[10,13],[6,6],[4,5],[3,3],[4,1],[3,-1],[4,-2],[8,-6]],[[7035,3759],[-5,-10]],[[6884,3698],[19,32]],[[6903,3730],[13,-6],[20,-9],[7,-4],[14,24],[7,17],[19,31],[5,10]],[[6988,3793],[2,-2],[38,-26],[3,-2],[4,-4]],[[7070,3733],[-6,-11],[-2,2],[-5,-1],[-4,-3],[-4,-2],[-3,-4],[-3,-5],[-5,-9],[-3,-5],[-5,-8],[-3,-8],[0,-4]],[[7035,3759],[35,-26]],[[8081,2163],[-2,-35]],[[8079,2128],[-22,0],[-21,1],[-22,2],[3,44],[-41,3],[-4,-4],[-6,-7],[-20,2],[-4,-35],[-15,1]],[[7927,2135],[44,128],[29,53],[24,40],[-5,4],[-25,-41],[-28,-53],[-47,-130]],[[7919,2136],[-2,0],[0,-1],[-10,-38],[0,-1],[0,-2],[-1,-2],[0,-2],[0,-17],[0,-3],[0,-2],[-1,-3],[0,-4],[-1,-8],[-2,-19],[0,-2]],[[7902,2032],[-2,0],[-2,0],[-2,0],[-4,0],[-3,0],[-28,2],[-31,2]],[[7607,2083],[3,3],[4,3],[2,1],[2,2],[2,1],[4,3],[21,15],[20,14],[52,18],[5,1],[5,2],[44,32],[2,2],[2,0],[3,1],[4,3],[7,1],[7,3],[4,3],[5,4],[5,4],[9,7],[8,7],[6,6],[1,3],[-1,2],[1,3],[0,3],[5,4],[1,4],[3,2],[3,3],[2,3],[2,2],[13,18],[11,13],[2,3],[1,3],[2,1],[2,-2],[-1,-3],[2,-1],[2,1],[2,0],[16,25],[2,11],[5,10],[54,97],[5,8],[3,5],[0,3],[1,5],[3,5],[2,4],[2,3],[2,3],[1,2],[3,3],[3,1],[2,3],[19,27],[2,2],[20,28]],[[8031,2526],[7,-14],[3,-12],[9,-41],[6,-8]],[[8056,2451],[1,-11],[0,-2],[3,-13],[31,5],[30,7]],[[7613,2099],[-2,1],[-3,4]],[[7608,2104],[1,2],[27,24],[3,4],[1,2],[1,1],[1,5],[3,16],[2,10],[1,14],[1,4],[2,17],[2,10],[3,15]],[[7656,2228],[27,17],[15,10],[2,3],[6,10]],[[7706,2268],[17,-13]],[[7723,2255],[6,-5],[10,-8]],[[7739,2242],[11,-6],[1,-1],[1,-1],[1,-3],[13,-23],[6,-13]],[[7772,2195],[-3,-1],[-49,-33],[-3,-3],[-5,-4],[-27,-11],[-7,0],[-9,-3],[-18,-10],[-18,-12],[-17,-16],[-3,-3]],[[7790,2307],[-13,-23],[-8,7],[-23,-39],[-3,-6],[-3,-3],[-1,-1]],[[7723,2255],[6,10],[17,31],[18,31]],[[7764,2327],[9,-6],[9,-7],[8,-7]],[[7706,2268],[-4,2],[-6,5],[-2,2],[-6,5],[-9,7],[-9,6]],[[7670,2295],[24,41],[18,32],[17,-13],[9,-7],[9,-7]],[[7747,2341],[9,-7],[8,-7]],[[7794,2428],[-10,-18],[-5,-9],[-1,-1],[-4,-9]],[[7774,2391],[-10,-18],[-1,-3],[-4,-6],[-4,-8],[-8,-15]],[[7670,2295],[-7,4],[-5,3],[-11,8]],[[7647,2310],[-3,1],[-2,2]],[[7642,2313],[1,1],[45,42],[18,17]],[[7706,2373],[26,23],[5,4],[16,19],[18,21]],[[7771,2440],[5,-4],[10,-7],[8,-1]],[[7774,2391],[50,-38]],[[7824,2353],[13,-10],[-11,-18],[-13,10],[-5,-9],[-5,-8],[-8,-14],[-5,3]],[[7794,2428],[21,-17],[5,-3],[25,-19]],[[7845,2389],[-10,-18],[-6,-9],[-5,-9]],[[7845,2389],[20,-15],[8,-8],[20,-20],[6,-4]],[[7899,2342],[-2,-2],[-7,-11],[-1,-3],[-3,1],[-17,-31],[-19,-28],[-11,-12],[-32,-33],[-35,-27],[0,-1]],[[7845,2389],[11,18],[9,16],[-54,41],[4,8],[0,3],[5,9],[2,2],[4,9],[-17,12]],[[7809,2507],[12,19]],[[7821,2526],[18,-15],[9,8],[14,13],[4,3]],[[7866,2535],[9,-9],[-7,-11],[13,-18],[12,-12],[8,-2],[9,15]],[[7910,2498],[33,-26],[12,15],[11,16],[13,16]],[[7979,2519],[5,5],[3,4],[1,2],[8,10],[4,4],[11,12]],[[8022,2541],[-17,-23],[-4,-6],[-2,-2],[-8,-10],[-7,-10],[-8,-11],[-10,-19],[-2,-3],[-14,-24],[-32,-56],[-18,-32],[-1,-3]],[[7742,2464],[-14,13],[-14,14],[-9,9],[-20,19]],[[7685,2519],[6,8],[5,7]],[[7696,2534],[28,-27],[11,15],[11,15]],[[7746,2537],[17,24],[5,7]],[[7768,2568],[7,-6],[11,-8],[35,-28]],[[7809,2507],[-16,-13],[-13,-6],[-18,-11],[-20,-13]],[[7696,2534],[5,7],[3,5],[7,8],[6,7],[20,-16],[9,-8]],[[7685,2519],[-11,10]],[[7674,2529],[32,39],[43,49],[3,3],[2,2],[2,3],[7,8],[2,2],[2,2],[1,1],[25,27],[7,7],[11,-8],[5,-5],[4,-3]],[[7820,2656],[-11,-18],[-10,-18],[-5,-8],[-5,-9],[-10,-18],[-11,-17]],[[6826,3110],[-35,-67]],[[6791,3043],[-2,1],[-19,14]],[[6770,3058],[36,66]],[[6806,3124],[18,-13],[2,-1]],[[6770,3058],[-20,15],[-19,14]],[[6731,3087],[36,66]],[[6767,3153],[19,-14]],[[6786,3139],[20,-15]],[[6712,3101],[36,67]],[[6748,3168],[19,-15]],[[6731,3087],[-19,14]],[[6694,3114],[36,67]],[[6730,3181],[18,-13]],[[6712,3101],[-18,13]],[[6675,3128],[36,67]],[[6711,3195],[19,-14]],[[6694,3114],[-19,14]],[[6657,3142],[36,67]],[[6693,3209],[18,-14]],[[6675,3128],[-18,14]],[[6694,3301],[-8,-13],[-9,-8],[-23,-43]],[[6654,3237],[-34,-62],[19,-14],[-3,-4]],[[6636,3157],[-3,4],[-15,11],[-12,9],[-40,29],[-4,3]],[[6562,3213],[3,4],[0,1],[7,11],[5,5],[14,26],[19,36]],[[6676,3426],[1,-1],[2,-2],[3,-2],[11,-8],[9,-6],[18,-14]],[[6720,3393],[3,-2],[26,-20],[3,-2]],[[6747,3261],[-36,-66]],[[6693,3209],[-20,14],[-19,14]],[[6766,3248],[-36,-67]],[[6784,3234],[-36,-66]],[[6784,3234],[19,-14],[-36,-67]],[[6822,3206],[-36,-67]],[[6825,3313],[20,-15],[16,-12]],[[6842,3191],[-36,-67]],[[6863,3176],[-37,-66]],[[6844,3096],[-18,14]],[[6880,3163],[-36,-67]],[[6899,3150],[-36,-68]],[[6863,3082],[-19,14]],[[7981,3106],[-13,11],[-22,17],[-1,0],[-29,-19]],[[7931,3205],[3,5],[13,24],[15,25]],[[7962,3259],[14,23]],[[7976,3282],[14,24]],[[8063,3245],[-13,-23],[-14,-23],[-15,-25],[-13,-23],[-13,-21],[-14,-24]],[[7981,3106],[-16,-26]],[[8076,2997],[-2,2],[-3,2]],[[8071,3001],[-4,3],[-2,2],[-1,0],[-3,3],[-4,2],[-34,27]],[[8186,3142],[-4,-3],[-13,-17],[-1,-4],[-18,-22],[-11,-15]],[[8139,3081],[-19,-26],[-12,-16],[-2,-1],[-6,-10],[-6,-8],[-3,-4],[-15,-19]],[[8178,2916],[-11,10],[-45,34]],[[8122,2960],[15,26],[11,18],[11,19]],[[8159,3023],[21,-15],[17,-13],[-13,-24],[16,-12]],[[8200,2959],[-8,-16],[-14,-27]],[[8129,2916],[-23,16]],[[8106,2932],[16,28]],[[8037,2814],[17,25],[13,24],[13,22]],[[8080,2885],[8,16],[4,7],[14,24]],[[8080,2885],[-18,14],[-7,5],[-16,13],[-14,12],[15,20]],[[8040,2949],[13,-10],[4,-3],[18,-14],[5,10],[3,6],[5,9],[3,-3],[15,-12]],[[7053,2576],[-3,1],[-2,1],[-72,54],[-7,5]],[[6987,2670],[78,-58],[3,-3],[2,-2]],[[6987,2670],[1,2],[4,-1],[18,34],[13,8]],[[6942,2703],[2,3],[9,18],[6,13],[1,5]],[[6960,2742],[6,13]],[[1046,2541],[-5,-4],[-22,-21],[-5,-5],[-14,-15],[-2,-2],[-2,-2],[-2,-3],[-6,-6],[2,-10]],[[990,2473],[-17,21],[-4,1],[-2,0],[-13,-4],[-10,-5],[-3,-12],[-4,-2],[-7,10],[-1,13],[-8,10],[-4,6],[-2,1],[-2,0],[-3,1],[-9,-3],[-7,-1],[-10,-7],[0,-8],[-2,0],[-7,0],[-4,-7],[-1,-5],[-2,-7],[-5,-8],[-5,-11],[-9,2],[-7,4],[-9,3],[-7,5],[-9,0],[-18,-4],[-5,-2],[-3,-5],[-13,-5],[-4,-1],[-7,1],[-6,3],[-3,0],[-5,-2],[-4,1],[-13,-4],[-17,0],[-13,-6],[-3,-3],[-20,-6],[1,-4],[0,-2],[-12,2],[-7,-3],[-22,10],[-3,4],[-1,7],[1,5],[0,10],[15,41],[10,21],[5,7],[5,10],[7,9],[6,4],[9,5],[9,3],[2,-2],[4,-8],[3,1],[5,-2],[6,-5],[1,0],[4,4],[9,3],[5,5],[8,5],[3,5],[2,10],[3,20],[0,5],[-1,10],[-1,6],[-2,3],[-7,10],[-9,4],[-12,-5],[-9,-5],[0,-3],[-6,-1],[-5,1],[-4,8],[5,5],[4,8],[3,9],[0,10],[-5,16],[-1,4],[-10,11],[-10,1],[-5,-1],[-2,-1],[-3,-6],[-4,-17],[-2,-2],[-15,-6],[-5,1],[-3,4],[0,7],[3,5],[-1,8],[0,4],[2,5],[2,2],[6,3],[18,-3],[5,-1],[9,2],[6,1],[2,27],[2,10],[0,12],[-3,15],[1,11],[4,19],[9,21],[2,8],[3,4],[2,11],[0,25],[0,5],[5,18],[3,0],[12,20],[7,9],[7,5],[10,12],[6,5],[2,7],[4,7],[9,16],[3,1],[1,1],[1,-1],[1,-7],[2,-3],[5,1],[16,27],[3,8],[3,8],[2,12],[4,3],[2,2],[4,1],[3,0],[17,1],[4,1],[6,4],[4,4],[2,4],[3,3],[3,0],[1,-6],[2,-6],[3,-4],[5,-2],[14,0],[7,2],[2,2],[3,1],[15,5],[13,9],[5,2],[19,-4],[14,0],[8,2],[5,7],[9,16],[10,15],[16,36],[7,18],[6,16],[7,19],[10,17],[1,1],[7,15],[5,16],[7,15],[4,7],[3,3],[11,4],[14,5],[10,9],[12,6],[27,8],[10,11],[7,7],[4,0],[8,0],[6,-4],[12,-2],[5,0],[5,-6],[3,-1],[6,-1],[6,2],[16,12],[5,8],[9,21],[4,15],[3,19],[4,15],[1,7]],[[1274,3378],[9,-11],[23,-32],[4,-5]],[[1310,3330],[-15,-33],[-2,-4],[-7,-11],[-3,-6],[-6,-10],[-6,-10],[-3,-4],[-3,-3],[-3,-2],[-2,-2],[-3,-3],[-5,-2],[-7,-5],[-20,-12],[-9,-6],[-3,-2],[-3,-1],[-3,-1],[-1,-1],[-4,-1],[-8,-2],[-10,-3],[-2,3],[-5,7],[-18,28],[-1,2],[-1,1],[-1,0],[-2,0],[-1,1],[-1,0],[-7,-2],[-8,-1],[-1,-1],[-1,-1],[0,-1],[0,-1],[0,-1],[0,-1],[1,-2],[14,-21],[9,-14],[2,-3],[-2,-1],[-2,-1],[-2,-2],[-3,-2],[-3,-3],[-6,-5],[-5,-5],[-5,-5],[-14,-15],[-7,-7],[-4,-4],[-5,-8],[-3,-3],[-10,-12],[-10,-11],[-12,-12],[-7,-8],[-7,-9],[-6,-10],[-6,-9],[-13,-18],[-11,-14],[-13,-19],[-3,-4],[-6,-6],[-5,-5],[-7,-6],[-5,-4],[-7,-4],[-9,-5],[-17,-10],[-9,-4],[-11,-5],[-7,-3],[-10,-5],[-10,-5],[-13,-6],[-7,-3],[-21,-10],[-18,-8],[-5,-4],[-4,-3],[-7,-6],[-9,-10],[-4,-4],[-2,-2],[-2,-4],[-1,-3],[5,-8],[7,-13],[10,-15],[6,-9],[14,-20],[9,-14],[10,-14],[12,-18],[16,-24],[20,-29],[11,-17],[35,-46],[13,-17],[11,-13],[7,-11],[18,-26],[28,-40],[8,-12]],[[2002,2744],[4,-14],[4,3],[8,3],[8,-2],[7,-7],[0,-13],[-3,-10],[-12,-21],[0,-5],[1,-4],[3,-1],[2,3],[3,-1],[1,-5],[-8,-16],[-4,-1],[-4,1],[-10,-2],[-10,0],[-9,-8],[-2,4],[-6,12],[1,40],[1,10],[2,8],[4,10],[7,10],[5,7],[7,-1]],[[1961,2688],[-5,15],[1,6],[-4,1],[-2,2],[-2,1],[-1,1],[-1,2],[-4,4],[-2,4],[-2,2],[-2,3],[-3,5],[-3,4],[-1,2],[-2,2],[-2,2],[-3,3],[-2,2],[-7,8]],[[1914,2757],[7,7],[2,3],[8,8],[16,19]],[[1947,2794],[6,6]],[[1953,2800],[11,-16],[6,-9],[8,-8]],[[1978,2767],[-3,-10],[-3,-12],[0,-8],[0,-7],[-3,-6],[-8,-10],[-2,-9],[3,-10],[-1,-7]],[[6932,3124],[-36,-67]],[[6896,3057],[-4,3],[-29,22]],[[6860,2991],[-4,3],[-29,22]],[[6827,3016],[36,66]],[[6896,3057],[-5,-9],[-4,-8],[-5,-9],[-4,-7],[-5,-9],[-4,-8],[-4,-7],[-5,-9]],[[6932,3124],[24,-17]],[[6956,3107],[-36,-67]],[[6920,3040],[-24,17]],[[6941,3024],[-21,16]],[[6956,3107],[21,-15]],[[6977,3092],[-36,-68]],[[6978,2997],[-19,14],[-18,13]],[[6977,3092],[19,-15]],[[6996,3077],[19,-13],[-37,-67]],[[6996,3077],[40,76]],[[7036,3153],[19,-14]],[[7055,3139],[33,-24]],[[7088,3115],[-40,-75],[-26,-48],[-16,12],[-11,-19],[-17,12]],[[6956,3107],[40,76]],[[6996,3183],[22,-16],[18,-14]],[[6973,3200],[23,-17]],[[7050,3177],[-14,-24]],[[6987,3224],[63,-47]],[[7072,3220],[-22,-43]],[[7068,3164],[-13,-25]],[[7072,3220],[18,-15]],[[7090,3205],[-22,-41]],[[7105,3190],[-21,-38],[-16,12]],[[7119,3092],[-31,23]],[[7152,3149],[-8,-15],[-11,-18],[-14,-24]],[[7145,3082],[-3,1],[-3,1],[-7,2],[-13,6]],[[7169,3135],[3,-2],[9,-7]],[[7181,3126],[-18,-32],[12,-10]],[[7175,3084],[-10,-3],[-11,-1],[-2,0],[-7,2]],[[7181,3126],[18,-16],[19,-16]],[[7218,3094],[-12,0],[-15,-3],[-16,-7]],[[8079,2128],[-2,-39]],[[8077,2089],[-22,1],[-22,2]],[[8033,2092],[-21,2],[-22,1]],[[7990,2095],[-21,1],[-21,2],[-5,-70]],[[7943,2028],[-21,2],[-6,0]],[[7916,2030],[0,5],[4,65],[5,29],[2,6]],[[7908,2031],[-6,1]],[[7919,2136],[-2,-6],[-5,-25],[-2,-28],[-3,-38],[1,-4],[0,-4]],[[7990,2095],[-3,-70]],[[7987,2025],[-23,1],[-21,2]],[[7902,2032],[0,-18],[0,-12],[5,-30]],[[7997,1801],[-66,6],[-4,4],[0,8],[-11,0]],[[7916,1819],[5,34],[3,47],[-2,10],[0,1]],[[7922,1911],[17,0],[63,-5]],[[8002,1906],[-1,-27],[-1,-19]],[[8000,1860],[-1,-19]],[[7999,1841],[-2,-19]],[[7997,1822],[0,-21]],[[7906,1819],[-4,0]],[[7912,1912],[1,0]],[[7913,1912],[0,-3],[0,-2],[-3,-57],[-4,-31]],[[7997,1801],[-2,-23]],[[7995,1778],[0,-9],[-1,-18]],[[7994,1751],[-1,-9]],[[7993,1742],[-86,6],[-12,4]],[[7895,1752],[2,5],[5,12],[13,48],[1,2]],[[7886,1756],[-3,1]],[[7906,1819],[-1,-2],[-13,-47],[-6,-14]],[[2358,2080],[-34,-33],[-17,-16],[-30,-30],[2,-10],[0,-1],[-18,-17],[-20,-19],[-7,-7],[-18,-17],[-8,-8]],[[2208,1922],[-3,6],[-3,4],[-7,14],[-2,2],[-3,6],[-8,10]],[[2182,1964],[29,30],[56,50],[38,47],[14,25],[59,80]],[[2378,2196],[13,17]],[[2391,2213],[3,-3],[4,-4],[9,-9],[2,-1],[29,-40],[-15,-14],[-45,-44],[-1,0],[-1,0],[-1,0],[-1,0],[0,1],[-3,4],[-9,-5],[-10,-10],[6,-8]],[[2182,1964],[-4,4],[-2,3],[-5,6],[-9,9],[-12,10]],[[2150,1996],[5,5],[25,27]],[[2180,2028],[23,20],[14,14],[13,15],[7,10],[12,18],[4,8],[5,14],[9,27]],[[2267,2154],[17,-12]],[[2284,2142],[19,-15],[5,-5],[15,19],[13,17],[35,45],[7,-7]],[[3488,1518],[22,10],[19,8],[19,7],[20,7],[20,8],[13,6],[20,5]],[[3621,1569],[34,8],[36,8]],[[3693,1577],[-11,-2],[-2,-2],[-27,-5],[-34,-8],[-39,-12],[-36,-13],[-49,-20],[-4,-2],[-33,-16],[-4,-2],[-29,-15],[-30,-15],[-37,-20],[-1,-1],[-35,-15],[-17,-10],[-31,-15],[-26,-13],[-29,-15],[-4,-1]],[[3215,1375],[-3,-2]],[[3212,1373],[-2,7],[-17,67]],[[3193,1447],[-13,53],[-17,66]],[[3163,1566],[4,1]],[[3167,1567],[7,2],[3,0],[7,2],[6,3],[14,12],[41,34],[9,8],[0,14],[0,10]],[[3254,1652],[88,75]],[[3342,1727],[28,23],[26,22],[26,21]],[[3422,1793],[1,-5],[24,-100],[22,-89]],[[3469,1599],[-11,-4],[-2,-1],[-2,-2],[-1,-2],[-1,-3],[-4,-6],[-22,-13],[-2,-4],[-6,-4],[-28,-14],[-6,-3],[-6,-5],[-9,-8],[-2,-3],[5,-15],[4,-19],[1,-1],[2,-1],[1,0],[32,17],[9,-23],[3,2],[41,21],[9,4],[14,6]],[[3469,1599],[19,-81]],[[2331,3626],[5,-20],[-14,-7],[-13,-13],[-12,-8],[-9,-3],[-1,-4],[15,-24],[-4,-13]],[[2298,3534],[-7,11],[-6,9],[-1,0],[-1,0],[-1,-1],[-11,-10],[-12,-11],[-2,-2],[-8,-6],[-11,-9],[-6,-2],[-10,15],[-17,27],[2,11],[-1,12],[-1,10],[-5,4],[-2,1],[-12,3],[-11,-5],[-17,-20],[-1,-4],[-17,-11],[-19,-9],[-21,-7],[-8,-4],[-8,-5],[-5,-6],[-1,-5],[0,-6],[1,-11],[1,-8],[0,-1],[0,-2],[1,-3],[0,-2],[1,-4],[2,-3],[2,-4],[3,-4],[5,-3],[6,-3],[3,-1],[4,0],[7,0],[8,1],[10,0],[6,1],[17,-1],[4,0]],[[2159,3466],[-1,-8],[-1,-8],[-1,-10],[-1,-4],[-3,-5],[-2,-2],[-10,-10],[-19,-18],[-13,-12],[-10,-9],[-7,-6],[-1,-1],[-1,-2],[0,-1],[0,-1],[0,-1],[1,0],[14,-20]],[[2104,3348],[-28,0],[-19,-2],[-6,-23],[4,-6],[15,-9],[0,-20],[27,-42],[-17,-41],[-12,-35],[8,-27]],[[2076,3143],[-30,18],[1,1],[5,14],[3,6],[-25,14],[-6,3],[-4,2],[-3,1],[-3,1],[-2,0],[-2,0],[-3,0],[-19,-2]],[[1988,3201],[0,2],[-1,4],[0,13],[0,15],[-1,19],[-2,0],[-1,0],[0,1],[-1,1],[0,1],[0,1],[0,1],[1,0],[3,38],[6,14],[4,11],[-45,71],[-204,386]],[[1747,3779],[3,2],[3,1],[3,2],[17,12],[17,12],[14,9],[2,1],[3,3],[3,1],[2,2],[3,3],[2,2],[6,5],[22,21],[7,7],[3,2],[2,3],[4,2],[3,3],[7,6],[6,4],[10,6],[9,5],[2,1],[4,2],[3,2],[3,0],[4,1],[9,-1],[5,0],[8,0],[5,1],[23,-1],[0,-8],[1,-12],[0,-3],[1,-2],[1,-3],[18,-27],[11,-16],[6,-9],[4,-6],[19,-28],[1,-2],[1,0],[1,0],[1,-1],[2,0],[1,1],[1,1],[12,12],[16,14],[11,9],[6,6],[9,9],[6,6],[-2,3],[-6,9],[-3,4],[-3,4],[-5,7],[-2,5],[-1,1],[0,1],[-1,2],[-1,3],[-2,8],[-1,5],[6,-2],[8,-2],[10,-3],[5,-2],[5,-1],[2,-4],[5,-9],[4,-7],[6,-8],[5,-7],[4,-6],[14,-21],[4,-6],[6,-10],[5,-6],[12,12],[13,13],[8,7],[13,-20],[7,-11],[7,-9],[13,-18],[12,-17],[2,-2],[14,-17],[12,-19],[26,-37],[9,-12],[14,-20],[14,-21]],[[2298,3534],[5,-6],[9,-14],[5,-6],[3,-4],[3,-2],[6,-6],[-2,-3],[-2,-7],[-2,-4],[-3,-6],[-2,-5],[-2,-6],[-7,-15],[-1,-3],[-1,-3],[-1,-2],[-1,-3],[-2,-7],[0,-3],[-1,-1],[-1,-7],[0,-8],[-1,-4],[-1,-17],[-1,-6],[-1,-3],[-1,-3],[-1,-2],[-1,-2],[-2,-4],[-3,-3],[-5,-4],[-18,-10],[-1,-1],[-1,-1],[-2,-1],[-2,-2],[-2,-2],[-2,-2],[-1,-2],[-1,-2],[0,-2],[-1,-1],[0,-2],[-1,-3],[-1,-8],[0,-6]],[[2251,3320],[-7,0],[-2,0],[-1,0],[-2,1],[-1,1],[-1,1],[-11,16],[-2,3],[-2,1],[-3,3],[-4,3]],[[2215,3349],[2,5],[4,8],[4,6],[1,2],[1,1],[1,3],[10,10],[8,9],[-37,54],[-6,7],[-2,2],[-2,2],[-2,1],[-2,1],[-1,0],[-3,1],[-6,1],[-24,3],[-2,1]],[[2164,3320],[0,-1],[13,-20],[-8,-9],[-6,-6],[-9,-9],[-6,-6],[2,-10],[-8,-12],[-10,-14],[-2,-3],[8,-11],[11,4],[12,-6]],[[2161,3217],[-4,-10],[-1,-2],[0,-2],[-2,-5],[0,-1],[-1,-3],[0,-2],[-1,-7],[0,-4],[-1,-5],[-4,-9],[-3,-5],[-3,-5]],[[2141,3157],[-4,3],[-1,0],[-1,1],[-1,0],[-2,1],[-1,0],[-2,0],[-2,0],[-3,0],[-3,-1],[-2,0],[-2,-1],[-3,-2],[-1,-1],[-1,-1],[-1,-1],[0,-1],[-1,-1],[-1,-3],[-2,-3],[-4,-10],[-3,-7]],[[2100,3130],[-24,13]],[[2104,3348],[15,14],[7,-11],[1,-1],[2,-1],[24,-3],[-1,-6],[-2,-18],[14,-2]],[[2259,3137],[-6,-14],[-4,-8],[-9,-13],[-9,-12],[-8,-14],[-3,-3],[-3,-5],[-1,-3],[-4,-5],[-4,-6],[-9,-12],[-7,-7],[-6,-9],[-3,-2],[-5,-7]],[[2178,3017],[-10,14],[-12,18],[-14,20],[4,3],[5,6],[10,10],[5,7],[6,6],[4,4],[-9,13],[-4,5],[-5,9],[-7,9],[-5,7],[-1,1],[-4,8]],[[2161,3217],[10,-4],[3,-4],[2,-2],[0,-1],[0,-1],[-5,-14],[0,-1],[11,-16],[7,-10],[2,-2],[7,-4],[2,3],[1,2],[2,2],[1,2],[3,2],[1,1],[2,1],[2,1],[2,0],[3,1],[3,-1],[2,0],[2,0],[3,-1],[1,-1],[2,-1],[2,-2],[1,0],[1,-1],[1,-1],[1,-1],[2,-5],[1,-2],[5,-8],[2,-3],[4,-3],[9,-6]],[[2139,2977],[-3,5],[-12,16],[-7,-7],[-1,-1],[-3,-5],[-2,-3],[-1,-2],[-2,0],[-1,-1],[0,-1],[-1,0],[-1,0],[-1,0],[-1,0],[-1,0],[-2,0],[-1,0],[-2,0],[0,1],[-2,1],[-6,8],[-3,5],[-4,9],[-2,2],[-2,2],[-1,1],[0,1],[-1,0],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[1,0],[0,1],[4,3],[10,8],[-3,7],[0,2],[-1,4],[-1,7],[-2,21],[-1,6],[0,4],[1,6],[0,4],[1,3],[1,5],[1,4],[1,3],[4,8],[4,11],[4,9]],[[2178,3017],[-7,-7],[-5,-6],[-10,-9],[-10,-11],[-7,-7]],[[2139,2977],[-10,-11],[-6,-6],[-8,-8],[-12,-13],[-7,-7]],[[2096,2932],[-6,8],[-8,11],[-18,26],[-12,-10],[-7,-5],[-8,-7],[-7,-8],[-24,35],[-14,20],[-1,1],[-1,0],[-1,0],[-1,-1],[-13,-12],[-13,19]],[[1962,3009],[12,11],[2,2],[12,11],[2,2],[1,1],[2,2],[3,3],[7,6],[8,8],[6,5],[4,4],[8,8],[8,7],[10,12],[1,2],[2,2],[1,2],[2,3],[9,14],[2,3],[2,4],[5,11],[4,9],[1,2]],[[1767,3047],[13,-17],[14,-21],[6,-9],[7,-9],[6,-8],[15,-22],[27,-39],[7,-9]],[[1862,2913],[29,-40],[11,-15],[45,-64]],[[1914,2757],[-3,-4],[-9,-9],[-5,-7],[-3,-2],[-7,-7],[-6,-4],[-17,-15],[23,-33],[13,-19],[3,-3],[31,-45],[1,-1],[0,-1],[0,-2],[-1,-1],[-13,-12],[-18,26],[-5,6],[-18,26],[-15,21],[-16,23],[-10,-11],[-3,-3],[-4,-6],[-4,-6],[-4,-7],[-5,-8],[-6,-11],[-4,-8],[-2,-3],[6,-7],[47,-67],[0,-2],[0,-1],[-17,-15],[-53,77],[-18,-15],[38,-53],[-15,-14],[-39,56],[-21,-15],[-10,-7],[-8,-6],[-13,-7],[-16,-8],[-14,-6],[-12,-5],[-15,-7],[-24,-10],[-14,-6],[-36,-17],[-55,-26],[-13,-5],[-9,-3],[-12,-3],[-23,-6],[-30,-7],[-10,-2],[-5,-2],[-9,-3],[-9,-3],[-6,-2],[-4,-2],[-8,-4],[-7,-3],[-5,-3],[-4,-3],[-6,-4],[-6,-4],[-12,-8],[-10,-8],[-7,-4],[-6,-3],[-10,-3],[-5,-2],[-11,-3],[-8,-2],[-7,-2],[-7,0],[-25,0],[-8,-1],[-6,0],[-6,-2],[-5,-2],[-5,-3],[-6,-3],[-7,-5],[-4,-3],[-5,-1],[-4,0],[-4,0],[-6,2],[-5,3],[-4,3],[-11,15],[-21,31],[-39,56],[-16,23],[-31,45],[-5,7]],[[1310,3330],[17,-21],[-20,-25],[12,-29],[162,112],[15,56]],[[1496,3423],[20,-29],[13,-20],[25,-35],[17,-25],[12,-16],[18,-24],[20,-24],[16,-19],[8,-10],[1,-2],[7,-8],[7,-10],[8,-11],[5,-8],[10,-13],[17,-25],[7,-11],[24,-34],[12,-17],[20,-28],[4,-7]],[[7277,1135],[-14,4],[-14,4],[-19,6]],[[7204,1258],[16,18],[0,2],[-1,2],[-11,14],[0,3],[1,3],[11,11],[12,13],[1,1],[8,8],[32,34]],[[7273,1367],[27,-22],[2,-1],[2,0],[1,2],[2,6],[2,10],[6,13],[7,13],[5,9],[4,7],[1,2],[0,1],[-2,4],[-12,12],[-7,6],[-7,6],[-5,5],[-7,5],[-7,7]],[[7399,1492],[-3,-4],[-26,-40],[-50,-76],[-6,-15],[-12,-33],[-14,-54],[-5,-31],[14,-5]],[[6562,3213],[-1,-3],[-3,-5],[-4,-10],[-3,-7],[-19,-35],[-6,-8],[-3,-4],[-28,-37],[-20,-26],[-2,-5],[-6,-7],[-4,-6],[2,-3],[9,-9],[8,-7],[9,-8],[7,-5],[13,-10],[5,-3],[4,-3],[13,-9],[18,-13],[16,-10]],[[6560,2974],[-45,30],[-1,1],[-3,1],[-38,-72]],[[6473,2934],[-43,-74],[-14,-32],[-9,-29],[-5,-23],[-1,-13],[-1,-7],[-1,-26],[0,-3]],[[6399,2727],[2,-134],[0,-2],[0,-4],[0,-4],[0,-2],[0,-2],[0,-3],[0,-3],[0,-2],[0,-2],[0,-4],[0,-11]],[[6401,2554],[-4,3],[-3,2],[-31,22]],[[6363,2581],[-56,44],[-21,-35],[-30,22],[-21,14]],[[5965,2635],[6,39],[1,7],[5,29]],[[5977,2710],[42,255],[57,-64],[58,-57],[23,-33],[12,-14],[1,-2],[2,-2],[1,-1],[2,-2],[1,-1],[2,-2],[1,-2],[2,-2],[2,2],[1,2],[2,2],[1,2],[2,1],[1,1],[1,2],[7,8],[31,36],[5,5],[28,37],[8,10],[2,2],[11,14],[6,8],[9,11],[38,49],[35,45],[28,37],[-16,17]],[[6383,3074],[2,3],[22,28],[2,3],[3,4],[3,4],[14,19],[17,22]],[[6446,3157],[7,8],[33,43],[3,4],[3,4],[2,3],[2,1],[8,6],[13,5],[9,3],[4,1],[3,1],[3,-1],[2,-1],[-5,33],[-1,3],[-20,-5]],[[6512,3265],[-4,19],[-3,21],[-4,20],[-4,21],[-3,20],[-2,9],[-6,4],[-4,7]],[[9002,6235],[-3,-11],[-1,-5],[-2,-3],[-1,-4],[-1,-13],[1,-44],[-1,-29],[-1,-12],[-4,-16],[-5,-16],[-5,-12],[-5,-9],[-6,-9],[-8,-9],[-9,-9],[-13,-13],[-6,-4],[-12,-19]],[[8784,6337],[12,-4],[11,-3],[3,-1],[8,-3],[13,-4],[6,-2],[46,-14],[8,-3],[14,-4],[2,-1],[3,-1],[3,-1],[6,-2],[9,-3],[7,-3],[3,-2],[3,-1],[3,-2],[3,-2],[3,-1],[2,-2],[1,0],[12,-9],[6,-4],[5,-4],[3,-2],[4,-4],[12,-11],[7,-8],[0,-1]],[[6122,3588],[-8,6]],[[6114,3594],[-25,21],[-13,12],[-66,68]],[[6010,3695],[-21,22],[-4,4],[-15,15],[-3,3]],[[5967,3739],[6,8],[6,8],[9,-9],[9,-10],[9,8],[-9,12],[2,3],[30,36],[4,7],[3,15],[2,12],[0,12],[-1,12],[-4,11],[-15,19],[-9,10]],[[6009,3893],[27,33],[10,14],[2,3]],[[6048,3943],[9,-9],[5,-5],[10,-8],[8,-4],[7,-3]],[[6087,3914],[25,-1],[41,0]],[[6153,3913],[0,-4],[0,-15],[1,-36],[-1,-52],[-1,-27],[-2,-13],[-3,-28],[-5,-34],[-17,-99],[0,-6],[-1,-4],[-2,-7]],[[5910,3161],[-16,-2],[-30,-41],[-9,9],[15,19],[-14,15]],[[5856,3161],[29,37],[-1,4],[-11,12],[-3,0],[-14,-19],[-14,15]],[[5842,3210],[21,28],[8,10],[2,3]],[[5873,3251],[30,-32],[14,-14]],[[5917,3205],[-2,-3],[-13,-15],[10,-11],[-2,-15]],[[5778,3715],[-40,42],[-15,17]],[[5723,3774],[27,36],[15,17]],[[5765,3827],[55,-58]],[[5820,3769],[-13,-18],[-14,-18],[-15,-18]],[[2096,2932],[-6,-8],[-9,-9],[-2,-1],[-8,-8],[-7,-5],[-2,0],[-9,-4],[-12,-6]],[[2041,2891],[-9,-5],[-7,-5],[-8,-6],[-6,-7]],[[2011,2868],[-20,25],[-44,64],[-1,0],[-1,1],[-1,0],[-1,0],[-13,-12],[-13,19]],[[1917,2965],[20,21],[9,7]],[[1946,2993],[16,16]],[[2011,2868],[-7,-9],[-5,-6],[-2,-2]],[[1997,2851],[-9,-11],[-7,-7],[-18,-21],[-10,-12]],[[1862,2913],[8,8],[1,1],[23,22]],[[1894,2944],[8,8],[15,13]],[[2041,2891],[25,-34],[12,-18],[9,-11],[10,-8],[-7,-12],[-2,-3],[-4,-6],[-1,-4],[-1,-2],[-1,-2],[-1,-2],[-3,-4],[-3,-3],[-1,-1],[-1,0],[-1,1],[-1,1],[-6,5],[-10,1],[-12,2],[-1,0],[-1,1],[-1,1],[-30,42],[-9,12],[-3,4]],[[2096,2932],[8,-10],[45,-67],[2,-2]],[[2151,2853],[-3,-2],[-2,0],[-2,0],[-2,-1],[-10,-7],[-7,-8],[-8,-8],[-7,-7],[-1,-6],[-2,-4],[-4,-4],[-4,-11],[-13,-18],[-2,-7],[-6,-4],[-7,-4],[-9,13],[-21,6],[-7,-1],[-7,2],[-6,6],[-6,1],[-9,-3],[-4,8],[-3,1],[-4,-3],[-5,-11],[-3,-4],[-6,-5],[-3,-4],[0,-1]],[[1961,2688],[1,-8],[0,-21],[-3,-22],[-6,-8],[-6,-16],[-7,-4],[-1,-5],[-4,-11],[-5,-2],[-6,-6],[-5,0],[-9,-8],[-8,-8],[-6,-9],[-6,-10],[-4,-5],[-15,-2],[-9,-8],[-8,-10],[-6,-6],[-4,-5],[-17,-20],[-11,-14],[-13,-12],[-4,-3],[-6,-7],[-5,-7],[-3,-7],[-8,-11],[-2,-7],[-3,-5],[-6,-6],[-3,-4],[-1,-1],[-7,-15],[-2,-8],[-8,-24],[0,-9],[-4,-4],[-12,-10],[-5,-7],[-3,-2],[-6,-1],[-2,-1],[-2,-6],[-1,-3],[0,-3],[-2,-3],[-8,-7],[-6,-1],[-1,-1],[-3,-3],[-5,-2],[-12,2],[-12,3],[-8,4],[-6,4],[-10,1],[-13,4],[-5,-3],[-8,0],[-7,4],[-6,-3],[-7,-1],[-7,2],[-6,-5],[-17,0],[-6,2],[-2,-1],[-10,6],[-5,-1],[-5,-4],[-9,-11],[-10,-7],[-6,-2],[-4,-2],[-3,-4],[-1,-5],[-5,-13],[0,-2],[0,-2],[1,-2],[3,0],[1,2],[3,1],[2,-1],[4,-9],[10,-1],[7,-1],[7,5],[5,-13],[3,-4],[0,-2],[1,-2],[4,-2],[3,-4],[0,-5],[-3,-3],[-4,0],[-4,-2],[-4,-6],[-4,-7],[-5,-6],[-9,-9],[-7,-11],[-4,-3],[-5,-2],[-4,-4],[-7,-1],[-6,4],[-5,11],[0,5],[-2,5],[-5,6],[-10,8],[-5,8],[-8,9],[-8,5],[-5,0],[-6,-1],[-8,-2],[-19,0],[-6,-1],[-6,-3],[-14,-1],[-17,1],[-4,-4],[-8,-2],[-6,-4],[-8,0],[-7,-4],[-16,-14],[-4,-1],[-2,3],[-5,-1],[-2,-3],[-3,-3],[-5,0],[-3,-3],[-2,-3],[-5,-4],[-15,0],[-13,-4],[-6,0],[8,9],[7,4],[6,5],[4,6],[5,8],[3,7],[-2,10],[-9,1],[-10,-1],[-6,1],[-4,3],[-2,6],[-4,5],[-18,8],[-7,5],[-2,1],[-4,6],[-2,4],[-4,4],[-6,1],[-15,0],[-1,5],[-4,-5],[-4,1],[-4,-2],[-1,0],[-1,15],[-4,10],[-6,7],[-8,20],[-2,9],[-3,13],[-2,4],[-1,3],[-1,1],[-6,17],[-4,5],[-4,1],[-5,-3],[-3,3],[-7,3],[-15,-2],[-5,4],[-9,12],[-1,3],[-1,12],[-14,27],[-5,10],[-6,9],[-12,22],[-1,1],[-2,1],[-5,7],[-8,9],[-6,0],[-9,-3],[-6,-7],[-7,-5],[-6,-9],[-4,1]],[[1767,3047],[14,14],[2,1],[1,0],[1,0],[1,-1],[12,-16],[16,14],[-16,21],[-1,3],[0,3],[3,4],[2,4],[2,3],[3,7],[9,22]],[[1816,3126],[17,-22],[27,-38]],[[1860,3066],[6,-8],[1,-2],[2,-2],[1,-5],[3,-13],[1,-5],[1,-5],[0,-9],[-3,-22],[0,-10],[1,-4],[1,-4],[1,-4],[3,-6],[13,-19],[3,-4]],[[1860,3066],[5,4],[5,5],[3,5],[1,3],[0,3],[1,2],[26,26],[7,8],[1,1]],[[1909,3123],[1,-1],[29,-42],[15,-21],[1,-2],[0,-1],[1,-1],[-1,-1],[-7,-7],[-7,-6],[5,-6],[0,-1],[0,-1],[1,-1],[-1,-1],[-16,-16],[1,0],[11,-17],[4,-5]],[[1816,3126],[5,12],[3,7],[0,5],[1,4],[5,12],[3,8],[3,5],[2,4],[3,3],[4,2],[16,8],[4,2],[3,2],[2,0],[3,1],[4,0],[4,0],[13,0],[7,0],[5,0],[8,0],[20,0],[20,-1],[-1,-14],[1,-9],[0,-1],[0,-2]],[[1954,3174],[1,-7],[0,-9],[1,-3],[-15,-2],[-1,0],[-1,0],[-11,-11],[-19,-19]],[[1954,3174],[34,4],[0,16],[0,7]],[[1496,3423],[-14,19],[-11,16],[-12,17],[-1,3],[-3,6],[3,1],[4,2],[3,2],[5,5],[9,9],[5,5],[8,9],[2,2],[9,10],[5,5],[7,8],[5,5],[-51,82]],[[1469,3629],[0,5],[11,28],[3,28],[1,26],[-1,11],[-7,18],[-3,15],[2,3],[7,1],[11,0],[5,2],[5,18],[0,5],[-13,8],[-5,5],[-5,7],[1,7],[5,4],[3,2],[18,0],[17,-7],[10,-7],[5,-5],[4,-5],[10,-10],[7,-5],[15,0],[8,4],[6,6],[0,4],[-4,4],[6,7],[2,4],[5,6],[2,2],[14,8],[6,-5],[3,-1],[3,2],[2,3],[0,4],[3,1],[2,-2],[4,0],[3,5],[7,2],[4,-2],[7,4],[9,3],[11,12],[13,10],[2,1]],[[1693,3865],[4,-9],[51,-66],[-1,-11]],[[8210,3953],[-7,6],[-11,12],[-1,2]],[[8191,3973],[-3,3],[-43,32]],[[8145,4008],[-42,31]],[[8103,4039],[-28,22]],[[8075,4061],[-30,22],[-3,3],[0,2],[0,1],[-1,2],[-6,4]],[[8035,4095],[5,3],[12,22]],[[8052,4120],[11,18],[10,17],[9,15]],[[8082,4170],[11,19]],[[8093,4189],[13,22],[12,22]],[[8118,4233],[14,24]],[[8132,4257],[28,-21],[14,-11]],[[8174,4225],[12,-10],[7,-5],[18,-14],[32,-25]],[[8243,4171],[-6,-31],[-10,-55]],[[8227,4085],[-5,-24],[-5,-27]],[[8217,4034],[-4,-25],[-2,-16]],[[8211,3993],[0,-19],[-1,-21]],[[9697,9303],[30,-11]],[[9727,9292],[0,-2],[0,-2],[-2,-2],[0,-12],[-3,-8],[0,-10],[0,-4],[0,-7],[-1,-6],[-1,-19],[-1,-24],[-1,-4],[3,-11],[1,-2],[-2,-14],[-2,-9],[-2,-6],[0,-8],[-2,-10],[-2,-8],[-7,-33],[0,-25],[1,-4],[1,-8],[-1,-9],[-3,-5],[-2,-19],[0,-4],[-1,-2],[-2,-7],[-2,-35],[-2,-4],[-1,-7],[0,-1],[3,-11],[-2,-16],[0,-5],[1,-9],[-3,-13],[0,-6],[2,-2],[1,-8],[0,-1]],[[9695,8890],[-13,7]],[[9682,8897],[1,26],[-38,11],[4,25],[4,24],[3,21],[4,28],[1,11],[1,6],[1,11],[2,22],[-2,2],[-11,1],[-1,1],[-1,2],[1,5],[1,2],[2,1],[13,-3],[3,22],[1,8],[2,22],[2,20],[1,10],[2,14],[19,114]],[[7572,5225],[-40,29],[-8,1],[-3,18]],[[7521,5273],[10,7]],[[7531,5280],[50,-37]],[[7531,5280],[14,13],[4,21]],[[7549,5314],[51,-37]],[[7549,5314],[1,13],[16,5],[1,8],[13,25]],[[7580,5365],[30,-22],[18,-13]],[[7521,5273],[-11,1],[-19,4]],[[7500,5379],[6,6],[14,24]],[[7520,5409],[15,-10],[-20,-39],[18,-4],[17,31],[15,-11],[15,-11]],[[7520,5409],[9,17],[9,18],[5,11],[4,6]],[[7547,5461],[9,-6],[51,-38]],[[7607,5417],[-9,-17],[-9,-18],[-9,-17]],[[8249,2119],[-34,10],[-10,-3],[2,-12],[14,-36]],[[8221,2078],[-14,1],[-22,2]],[[8252,2006],[-22,49],[-9,23]],[[8252,2006],[-32,2],[-17,2],[-22,0]],[[8180,1982],[-87,6]],[[8093,1988],[2,29]],[[8095,2017],[22,-2],[21,-1]],[[8178,1952],[-86,6]],[[8092,1958],[1,30]],[[8176,1923],[-86,6]],[[8090,1929],[2,29]],[[8175,1894],[-87,6]],[[8088,1900],[2,29]],[[9146,6516],[-7,-25]],[[9139,6491],[-5,2]],[[9134,6493],[-10,5],[-25,12],[-8,4]],[[9091,6514],[9,25],[9,26],[8,23]],[[9168,6589],[-6,-22],[-16,-51]],[[9199,6490],[-38,19],[-9,5],[-6,2]],[[9196,6434],[-10,5],[-17,9],[-24,11],[-9,5],[-4,3]],[[9132,6467],[7,24]],[[9214,6482],[-9,-24],[-9,-24]],[[9293,6387],[-13,6],[-5,2],[-3,2],[-8,4]],[[9264,6401],[-9,4],[-10,5],[-3,1],[-7,4],[-9,5]],[[9226,6420],[-20,9],[-2,1]],[[9204,6430],[-8,4]],[[9288,6418],[2,-15],[3,-16]],[[9226,6420],[-14,-38],[-7,-19],[-3,-9]],[[9202,6354],[-32,16],[-3,2]],[[9167,6372],[-5,2],[4,11],[5,15],[1,2],[5,16],[19,-10],[4,11],[4,11]],[[9240,6335],[-4,2],[-18,9],[-16,8]],[[9264,6401],[-21,-57],[-1,-2],[-1,-4],[-1,-3]],[[9161,6350],[6,22]],[[9240,6335],[-7,-21]],[[9233,6314],[-54,27],[-18,9]],[[7992,1720],[-98,7],[-5,-11],[-4,-14],[-5,-19]],[[7880,1683],[-4,-15]],[[7876,1668],[-5,-21],[-4,-20]],[[7867,1627],[-4,-22]],[[7863,1605],[-47,3],[-18,-23],[-13,-21]],[[7785,1564],[-21,-9]],[[7764,1555],[3,6],[14,24],[21,29],[17,18],[27,31],[15,24],[2,3],[18,31],[14,31]],[[7993,1742],[-1,-22]],[[7746,1548],[-6,-2]],[[7740,1546],[38,61],[17,21]],[[7795,1628],[20,23],[19,22],[16,22]],[[7850,1695],[12,20],[12,21],[9,21]],[[7886,1756],[-1,-3],[-8,-16],[-24,-43],[-1,-2],[-16,-21],[-22,-26],[-10,-11],[-19,-24],[-28,-43],[-11,-19]],[[7989,1676],[-109,7]],[[7992,1720],[-2,-25]],[[7990,1695],[-1,-19]],[[7989,1660],[-113,8]],[[7989,1676],[0,-16]],[[7987,1618],[-120,9]],[[7989,1660],[-1,-20]],[[7988,1640],[-1,-22]],[[7984,1571],[-126,9],[5,25]],[[7987,1618],[-2,-21]],[[7985,1597],[-1,-26]],[[7983,1547],[-2,-20]],[[7981,1527],[-97,15],[-11,2],[1,5],[-21,3]],[[7853,1552],[-35,6],[-33,6]],[[7984,1571],[-1,-24]],[[7981,1527],[-1,-23]],[[7980,1504],[-1,-19]],[[7979,1485],[-39,8],[-7,2],[-8,7],[-5,5],[-4,5]],[[7916,1512],[-68,12]],[[7848,1524],[4,24],[1,4]],[[7906,1461],[-67,19]],[[7839,1480],[5,22],[4,22]],[[7916,1512],[-5,-28],[-5,-23]],[[7979,1485],[-1,-21],[-1,-24]],[[7977,1440],[-71,21]],[[8056,1383],[-3,-5],[-9,-9]],[[8044,1369],[-1,-2],[-55,13],[-17,-19],[3,32]],[[7974,1393],[1,24],[-74,21]],[[7901,1438],[5,23]],[[7977,1440],[46,-13],[8,-9],[14,-34],[11,-1]],[[7828,1424],[3,10]],[[7831,1434],[65,-19],[5,23]],[[7974,1393],[-9,-9],[-137,40]],[[7831,1434],[4,23],[4,23]],[[8807,5880],[-19,10],[-7,-16],[-17,9],[-18,11],[-13,8],[-12,6]],[[8721,5908],[11,26],[8,20],[1,3]],[[8820,5914],[-2,-3],[-11,-31]],[[7222,2710],[8,8]],[[7230,2718],[91,-70],[3,-3],[12,24]],[[7230,2718],[18,18],[19,18],[5,6]],[[7184,2751],[12,21]],[[7196,2772],[14,24]],[[7210,2796],[12,-9],[13,22],[12,21],[6,13],[5,4],[5,2]],[[7210,2796],[6,11],[-62,47],[0,9],[4,16],[5,15]],[[7163,2894],[11,21],[21,39],[15,21],[3,5]],[[7106,2931],[16,-12],[2,2],[39,-27]],[[7196,2772],[0,9],[-144,113],[-3,13]],[[7049,2907],[15,-11],[22,-18],[14,42],[6,11]],[[7196,2772],[-7,3],[-151,113]],[[7038,2888],[11,19]],[[7027,2867],[11,21]],[[7049,2907],[23,42],[3,6]],[[7075,2955],[15,-12],[16,-12]],[[6924,2944],[-30,-55]],[[6894,2889],[-26,-48]],[[6868,2841],[-18,14],[-43,32]],[[6807,2887],[7,19],[17,30]],[[6831,2936],[16,31]],[[6847,2967],[45,-34],[13,25]],[[6905,2958],[19,-14]],[[6894,2889],[19,-14]],[[6913,2875],[-26,-48]],[[6887,2827],[-19,14]],[[6896,2789],[-10,-16],[-20,16],[-19,13]],[[6847,2802],[-33,25],[9,17],[-27,21]],[[6796,2865],[11,22]],[[6887,2827],[16,-12],[-2,-13]],[[6901,2802],[-5,-13]],[[6962,2839],[-31,-59],[-16,12],[-14,10]],[[6913,2875],[16,-12],[17,-12]],[[6960,2742],[-64,47]],[[6942,2703],[-2,2],[-7,5],[-57,42]],[[6836,2782],[2,3],[9,17]],[[6912,2646],[-3,2],[-63,47]],[[6895,2616],[-12,-23]],[[6883,2593],[-2,2],[-63,49]],[[6908,2558],[-31,24]],[[6883,2593],[31,-23],[-1,-4],[-5,-8]],[[6908,2558],[-6,-10],[21,-15]],[[6923,2533],[10,-7]],[[6933,2526],[-14,-4]],[[6919,2522],[-25,-8],[-22,-7]],[[6939,2583],[6,-4]],[[6945,2579],[-4,-8],[-10,-19],[1,-3],[-9,-16]],[[6945,2579],[15,-11],[32,-23]],[[6992,2545],[-20,-7],[-24,-9],[-15,-3]],[[7002,2547],[-10,-2]],[[6956,2615],[8,-6],[66,-50],[2,-1],[1,-2]],[[6993,2466],[-9,7],[-47,36]],[[6937,2509],[-18,13]],[[8173,1867],[-86,6]],[[8087,1873],[1,27]],[[8173,1847],[-87,7]],[[8086,1854],[1,19]],[[8171,1828],[-86,6]],[[8085,1834],[1,20]],[[8171,1809],[-87,6]],[[8084,1815],[1,19]],[[8169,1789],[-86,6]],[[8083,1795],[1,20]],[[8168,1766],[-86,6]],[[8082,1772],[1,23]],[[8166,1741],[-41,3],[-45,4]],[[8080,1748],[2,24]],[[8165,1709],[-86,5]],[[8079,1714],[1,29],[0,5]],[[8162,1665],[-86,6]],[[8076,1671],[1,17]],[[8077,1688],[2,26]],[[8160,1628],[-86,6]],[[8074,1634],[1,20]],[[8075,1654],[1,17]],[[8159,1606],[-86,6]],[[8073,1612],[1,22]],[[8175,1627],[-1,-21],[-15,0]],[[8071,1565],[1,25]],[[8072,1590],[1,22]],[[8159,1606],[-5,-21],[-6,-26],[-77,6]],[[8067,1512],[-86,15]],[[7983,1547],[86,-7],[2,25]],[[8209,1626],[-10,-23],[-17,-32],[-15,-19],[-23,-37],[-2,-12],[2,-3],[-6,-5]],[[8138,1495],[-15,5],[-31,9],[-25,3]],[[7984,1571],[87,-6]],[[7985,1597],[87,-7]],[[7988,1640],[86,-6]],[[7989,1660],[86,-6]],[[7990,1695],[87,-7]],[[7994,1751],[4,1],[38,-2],[44,-2]],[[7995,1778],[87,-6]],[[7997,1801],[86,-6]],[[7997,1822],[87,-7]],[[7999,1841],[86,-7]],[[8000,1860],[86,-6]],[[8002,1906],[86,-6]],[[8002,1906],[2,30],[1,29]],[[8005,1965],[76,-6],[11,-1]],[[8005,1965],[2,29]],[[8007,1994],[42,-2],[44,-4]],[[8007,1994],[0,18],[0,11]],[[8007,2023],[23,-1]],[[8030,2022],[21,-2],[22,-1]],[[8073,2019],[22,-2]],[[8030,2022],[3,70]],[[8077,2089],[-4,-70]],[[8007,2023],[-20,2]],[[7837,3125],[-26,-3],[-11,-1],[-11,3]],[[6962,4312],[1,-7],[-1,-4],[-1,-3],[-5,-12],[-8,-22]],[[6948,4264],[-62,30],[-7,-19]],[[6879,4275],[-58,28],[-5,2]],[[6816,4305],[0,5],[13,35],[1,3]],[[6830,4348],[3,0],[4,-2],[83,-21],[4,-2],[6,-2],[20,-6],[12,-3]],[[6923,5101],[-10,-19]],[[6913,5082],[-54,39],[-18,13],[-28,20]],[[6813,5154],[4,7],[25,46],[2,5],[5,9],[1,2],[1,2]],[[6851,5225],[46,-33]],[[6897,5192],[-2,-3],[-6,-9],[-2,-1],[-18,-34],[0,-2],[0,-2],[14,-10],[24,-17],[16,-13]],[[6136,4314],[-12,5],[-4,2],[-5,1],[-5,2],[-4,1],[-5,1],[-5,1],[-4,1],[-6,1],[-6,1],[-3,0],[-4,1],[-5,0],[-7,1],[-5,0],[-4,0],[-5,0],[-3,0],[-3,-1],[-5,-2],[-11,-1],[-5,-1],[-4,0],[-5,-1],[-6,-1],[-6,-2],[-3,-1],[-4,-1],[-4,-1],[-4,-2],[-5,-1],[-5,-2],[-14,-6],[-28,-10],[-3,-1],[-40,-16],[-11,-4],[-7,-3],[-5,-2]],[[6062,4383],[5,-21],[-16,-22],[5,-2],[5,-1],[19,-2],[8,-1],[9,-2],[12,-4],[27,-14]],[[5312,4075],[-13,-17]],[[5299,4058],[-15,16],[-3,-5]],[[5281,4069],[-18,11]],[[5263,4080],[-5,4],[-2,3],[-19,11],[-8,5]],[[5229,4103],[9,14],[0,5],[-31,32],[-30,33]],[[5177,4187],[14,18],[14,18]],[[5205,4223],[10,-11],[15,-15],[8,-8],[28,-29]],[[5266,4160],[18,-20]],[[5284,4140],[43,-45]],[[5327,4095],[-15,-20]],[[7828,1424],[-94,22],[-7,22],[-25,-18]],[[7702,1450],[3,5],[8,17],[4,5],[17,27],[1,2]],[[7735,1506],[1,0],[9,1],[5,-1],[89,-26]],[[7685,1444],[-5,1]],[[7740,1546],[3,-2]],[[7743,1544],[-3,-6],[-9,-14],[-9,-17],[-15,-23],[-4,-6],[-11,-23],[-7,-11]],[[7735,1506],[29,49]],[[7746,1548],[-3,-4]],[[7733,1659],[-2,-23],[11,-1],[27,-2],[18,-1],[6,-1],[2,-3]],[[7808,1698],[39,-2],[3,-1]],[[7934,1216],[-39,5]],[[7895,1221],[-51,11],[-47,12]],[[7797,1244],[-63,18],[-88,26],[-20,-8]],[[7626,1280],[-21,0]],[[7605,1280],[6,13],[2,5],[10,15],[12,24],[15,26],[7,15],[25,38],[20,34]],[[8044,1369],[-3,-5],[-7,-9],[-16,-23],[-11,-21],[-11,-17],[-10,-5],[-11,-13],[-6,-12],[-11,-12],[-6,-12],[-18,-24]],[[7590,1280],[10,22],[46,84],[24,42],[3,5]],[[7685,1444],[-5,-9],[-29,-51],[-3,-5],[-11,-16],[-35,-62],[-12,-20],[0,-1]],[[7979,1485],[86,-19],[0,5],[1,17]],[[8066,1488],[1,24]],[[8138,1495],[-3,-2],[-6,-7],[-20,-30],[-4,-8],[-22,-32],[-13,-18],[-9,-9],[-5,-6]],[[7980,1504],[86,-16]],[[8586,1703],[2,-3],[4,-4],[3,-2],[11,-4],[4,-14],[3,-9],[4,-4]],[[8617,1663],[-2,-2],[-9,-9],[-7,-9],[-3,-5],[-2,-8],[0,-8],[-2,-11],[-1,-20],[-4,-11],[-9,-17],[-15,-20],[-5,-2],[-8,1],[-8,-1],[-13,0],[-4,0],[-9,-1],[-8,-4],[-5,-4],[-20,-11],[-7,-3],[-8,-2],[-4,-2],[-5,-3],[-7,-9],[-6,-5],[-5,-8],[0,-11],[-3,-8],[-4,-8],[-10,-7],[-6,-1],[-3,-5],[-1,-4],[-4,-1],[-3,2],[-2,3],[-1,0],[-1,-2],[-12,-1],[-5,-1],[-12,2],[-3,-1],[-1,-6],[-2,-3],[-2,-2],[-5,-1],[-5,2],[-3,7],[-3,-1],[-3,-3],[0,-5],[-1,-3],[-4,-2],[-3,-1],[-3,1],[-5,5],[-3,5],[-4,1],[-6,3],[-6,8],[-3,5],[-7,15],[-1,6],[-1,1],[-1,7],[-7,20],[-7,27],[-4,25],[11,41],[6,13],[3,8],[5,17],[4,18],[8,23],[4,16],[5,28],[3,22],[0,22],[8,16],[5,19],[5,13],[2,15],[4,16],[9,18],[4,11]],[[2899,2234],[-37,-32],[-7,10],[-1,0],[-3,0],[-19,-17],[1,-3],[5,-7],[2,-2],[1,-3],[10,-17],[-35,-32],[-18,30],[-2,0],[-2,0],[-6,-5],[-1,-2],[0,-3],[19,-28],[-17,-15],[-18,29],[-2,1],[-2,0],[-7,-5],[-1,-2],[1,-3],[19,-29],[-14,-11],[-8,6],[-4,5],[-8,13],[-2,2],[-3,0],[-24,-20],[-1,-4],[1,-3],[9,-15],[2,-3],[-2,-3],[-13,-12],[-15,23],[-2,0],[-12,-10],[-2,-2],[1,-4],[13,-20],[-16,-14],[-12,20],[-2,2],[-2,1],[-12,-10],[-1,-2],[1,-3],[6,-11],[1,-9],[14,0],[2,0],[2,1],[2,2],[10,-14],[-42,-36],[-1,-1],[0,-1],[1,-2],[8,-13],[2,-2],[2,0],[2,1],[40,34],[6,-9],[2,-3],[2,-3],[26,22],[27,23],[9,7],[5,6],[48,41],[33,29],[22,19],[6,5],[5,4],[49,42]],[[2940,2167],[24,-39],[15,-25],[11,-17],[2,3],[7,-12],[10,-16],[4,-6],[3,-5]],[[3016,2050],[-3,-3],[-42,-35],[-19,-16],[-35,-29],[-26,-22],[-25,-21],[-24,-20],[-22,-19],[-24,-20],[-8,-6],[-3,-3],[-5,-4],[-7,-5],[-10,-7],[-10,-7],[-10,-6],[-10,-5],[-7,-4],[-7,-3],[-1,-1],[-2,-1]],[[2716,1813],[-3,6],[-4,6],[-5,9],[-59,86],[-3,4],[-15,31],[-7,12],[-22,36]],[[2598,2003],[3,4],[3,5],[10,8],[272,237],[3,3]],[[2889,2260],[13,-23],[-3,-3]],[[4158,3361],[-66,-13],[-2,-2],[-18,-16],[7,-7],[15,-14]],[[4094,3309],[-7,-8],[-7,-5],[-6,-3],[-8,-3],[-18,-6],[-7,-4],[-4,-5]],[[4037,3275],[-5,6],[-2,4],[-5,13]],[[4025,3298],[-2,5],[-1,4],[-4,8],[-15,15],[-1,0],[-13,14]],[[3989,3344],[8,8],[3,3],[5,2],[8,6],[3,4],[0,2],[1,3],[0,2],[-1,3],[-2,2],[-32,34]],[[3982,3413],[11,8],[3,3]],[[3996,3424],[28,-30],[30,-32],[6,0],[16,4],[6,1],[4,2],[5,5],[4,5],[12,-13],[3,0],[10,15],[-3,5],[-5,4],[-7,8],[-11,12],[-22,23],[-5,5],[-22,23]],[[4045,3461],[17,13]],[[4062,3474],[80,-86],[7,-7],[-2,-3],[11,-17]],[[5205,4223],[-37,40]],[[5168,4263],[-4,4],[-3,3],[0,1],[-4,4],[-12,13]],[[5145,4288],[24,30],[-15,15],[6,5],[12,10],[16,15],[11,10],[11,12],[3,4],[4,7]],[[5217,4396],[7,17],[2,5],[2,4]],[[5228,4422],[69,-72]],[[5297,4350],[62,-65]],[[5359,4285],[-11,-15]],[[5348,4270],[-44,-60]],[[5304,4210],[-10,-12],[-28,-38]],[[6657,3142],[-21,15]],[[6986,3651],[11,-15],[9,-21],[10,-22]],[[7145,3082],[-3,-7],[-1,-2],[-7,-9],[-16,-28],[-12,-24],[-31,-57]],[[6976,2905],[-17,13],[-1,1],[-1,0],[-6,5],[-9,6]],[[6942,2930],[4,7],[32,60]],[[9331,8884],[7,32],[8,37],[88,-25]],[[9434,8928],[-5,-24],[-1,-8],[-3,-23],[-2,-13]],[[9423,8860],[-6,2],[-12,3],[-10,3],[-18,5],[-43,12],[-3,-1]],[[6904,2449],[12,21],[10,19],[5,10],[6,10]],[[6256,2171],[-18,12],[-43,27]],[[6195,2210],[10,20],[6,14],[20,42],[3,4],[6,11],[3,9],[1,10],[1,5]],[[6245,2325],[1,11],[2,7],[4,10],[7,15],[1,3]],[[6260,2371],[19,-12],[16,33],[17,-11],[-6,-13],[-9,-20],[12,-8],[5,-5],[5,-6],[6,-5],[3,-4]],[[7771,2440],[-24,17],[-5,7]],[[7922,1911],[1,26],[-6,61],[0,3],[-1,5],[0,24]],[[7908,2031],[0,-3],[-2,-4],[1,-19],[0,-3],[0,-4],[4,-27],[2,-34],[0,-25]],[[6126,4375],[6,2],[2,0],[12,1],[0,27],[1,1],[1,1],[13,4],[2,0],[1,-2],[1,-50],[-5,-14],[1,-2],[15,-7]],[[6176,4336],[-6,-18],[-2,-1],[-2,1],[-31,14],[-14,8],[-1,1],[-1,3],[9,23],[-2,8]],[[9040,5199],[-22,11],[-1,1],[-1,1],[-13,6]],[[9003,5218],[4,8],[5,10],[3,6],[4,10],[6,21],[1,9],[6,26],[4,18],[10,54],[5,18],[3,14],[8,35],[6,29],[1,4],[1,5],[3,12]],[[9073,5497],[2,5],[4,15],[1,3],[2,5],[6,15],[-2,1],[-9,6],[-51,28],[-9,4],[-7,-19]],[[9010,5560],[-9,5],[-39,21],[-9,5]],[[8953,5591],[-8,4],[-53,30]],[[8892,5625],[-6,3]],[[8886,5628],[2,7],[4,13],[32,95],[15,45],[14,42],[14,52]],[[8967,5882],[15,-8],[19,-10],[9,-5],[1,0],[34,-20],[16,-8],[50,-29],[52,-27],[30,-16],[2,-2],[1,3],[6,11],[5,9],[12,24],[2,4]],[[9221,5808],[11,20],[10,19]],[[9242,5847],[7,14],[3,5],[7,13],[7,13],[2,3],[16,31],[2,4],[20,36],[2,4],[1,2],[2,5],[5,10],[4,7],[2,4],[19,34],[6,11],[2,4],[4,9],[2,4],[2,8],[1,4],[2,6]],[[9360,6078],[47,-16],[4,-2]],[[9411,6060],[-1,-6],[-1,-4],[-1,-4],[1,-4],[1,-3],[2,-1],[16,-9],[-27,-111],[3,-1],[-65,-160],[-2,-2],[-36,-56],[-62,-104],[-99,-87],[-1,-6],[1,-2],[2,-2],[5,-2],[9,2],[26,3],[9,0],[3,-1],[6,-7],[5,-9],[4,2],[3,-4],[-22,-18],[-30,-25],[-65,-131],[-37,-75],[-18,-34]],[[8504,5582],[-1,1],[-2,1],[-12,7],[-35,18],[-9,5],[-34,18],[-41,22],[-1,-3],[-9,-23],[-9,-23],[-15,-36],[-6,1],[-9,18],[11,27],[-22,12],[-3,2],[-1,2],[0,2],[0,2],[4,4],[3,4],[3,5],[1,3],[1,8],[0,6],[1,3],[2,5],[1,4],[1,3],[-26,15],[-15,9],[-4,3],[-3,3],[-5,2]],[[8270,5712],[1,4],[6,16],[7,19]],[[8284,5751],[4,9],[8,20],[6,17],[6,16],[4,9],[8,21],[2,5],[1,2],[1,2]],[[8324,5852],[23,-13],[4,-2],[5,-5],[5,-6],[6,-9],[17,-27],[16,-26]],[[8400,5764],[2,-3],[5,-4],[3,-2],[29,-16],[41,-22]],[[8480,5717],[53,-30],[6,-3],[2,-1],[3,-2]],[[8544,5681],[-1,-3],[-1,-3],[-22,-53],[-2,-5],[-14,-35]],[[2883,2571],[-21,-11],[-5,-3]],[[2857,2557],[-4,5],[-24,23],[-12,13],[-5,5],[-4,7],[-6,4],[-21,11]],[[2781,2625],[3,9],[10,8],[18,-8],[5,17],[2,5]],[[2819,2656],[4,2],[44,37]],[[2867,2695],[11,-18],[11,-18],[20,-31],[14,-17]],[[2923,2611],[-9,-12],[-14,-16],[-17,-12]],[[3891,2848],[-153,-124],[-5,-3]],[[3733,2721],[-26,44],[43,35],[-1,5],[3,26],[-19,3],[-15,-6],[-6,-4],[-26,-21],[-3,1],[-10,17],[-10,18],[1,3],[38,30],[5,3],[-11,18],[1,2],[34,11],[3,0],[1,-3],[2,-18],[10,2],[10,-1]],[[3757,2886],[20,0],[0,5],[-2,22],[0,4],[1,3],[37,29],[3,0],[4,0]],[[3820,2949],[2,-20],[-28,-21],[0,-3],[1,-8],[1,-8],[6,1],[29,21],[8,-15],[0,-2],[-1,-2],[-34,-27],[-4,-1],[-6,1],[-2,-23],[6,-1],[4,1],[5,1],[4,3],[19,15],[19,15],[17,14],[25,-42]],[[5490,3360],[-15,-21],[13,-14]],[[5488,3325],[-11,-16],[14,-16],[14,-15],[8,10]],[[5513,3288],[2,-2],[14,-14]],[[5529,3272],[-38,-9],[-4,4],[0,1],[-13,13],[-4,4],[-13,13],[-25,25],[-30,-2]],[[5402,3321],[34,49]],[[5436,3370],[20,-20],[20,23]],[[5476,3373],[14,-13]],[[5741,4799],[-17,-9],[-4,-2],[-24,-13],[-3,-2],[-9,-4],[-3,-1],[-2,2],[-1,-4],[-2,-6],[-2,-3],[-7,-17]],[[5667,4740],[-40,20]],[[5627,4760],[-32,18],[-10,-2],[-13,-4],[-2,-1],[-10,-7],[-8,-7],[-12,-8],[50,-26],[-6,-14],[-6,-16],[-7,-18]],[[5571,4675],[-76,42],[-16,-16],[-16,-15]],[[5463,4686],[-5,12],[-15,10],[-4,1],[-4,2]],[[5435,4711],[0,1],[5,3],[10,11],[3,3],[7,3],[10,-6],[2,0],[2,2],[2,3],[1,2],[0,3],[-5,3],[-2,5],[1,5],[4,5],[3,7],[8,8],[9,1],[6,6],[9,12],[2,2],[3,1],[7,-3],[4,-1],[6,1],[2,2],[17,8],[7,3],[3,1],[6,-1],[2,0],[13,4],[17,6],[8,0],[19,5],[5,0],[16,-1],[10,1],[5,-2],[3,-2],[13,-2],[7,3],[10,-1],[17,5],[8,2],[5,3],[9,3],[2,0]],[[5736,4825],[0,-7],[5,-19]],[[8104,6561],[-34,25],[-16,11],[-40,29]],[[8042,6679],[14,26],[1,2]],[[8057,6707],[39,-28],[16,-11],[-1,-3],[-32,-62],[34,-24],[-5,-10],[-4,-8]],[[5917,3205],[27,37]],[[5944,3242],[14,-14],[9,-10]],[[5967,3218],[-25,-33],[-3,-2],[-1,-1],[-3,-1],[-8,-3],[-8,-7],[-9,-10]],[[8731,1930],[-11,5],[-32,13]],[[8843,2243],[4,-3],[2,-2],[4,-5],[3,-6],[5,-16],[10,-36],[4,-11],[3,-4],[3,-4],[1,-4],[0,-3],[-1,-1],[-2,-3],[-4,-2],[-16,1],[-5,-1],[-5,-7],[-15,-15],[-15,-13],[-8,-12],[-4,-5],[-7,-7],[-2,-2],[-8,-8],[-33,-37],[-17,-18],[0,-17],[-2,-14],[-1,-20],[-6,-38]],[[8731,1930],[-4,-25],[-4,-16],[-5,-14],[-13,-28],[-4,-11],[-8,-18],[-3,-10],[-7,-11],[-2,-5],[-11,-29],[-1,-3],[-9,-18],[-5,-10],[-11,-17],[-5,-9],[-6,-11],[-5,-12],[-5,-11],[-4,-6],[-2,-3]],[[6158,1806],[5,7]],[[6163,1813],[11,-6],[9,-6],[46,-30],[3,0],[7,16],[3,-2],[5,-2],[3,-3],[3,-4],[0,-17],[1,-3],[55,-34],[11,-8],[6,-2],[32,-20],[14,-9],[3,3],[0,78],[-8,7]],[[6367,1771],[8,12],[0,6],[0,22],[0,25],[27,-16],[15,-9]],[[7674,2529],[-28,-35],[-19,-59]],[[7627,2435],[-8,7],[-2,2],[-1,1],[-1,1],[-2,1],[-3,3],[-2,1],[-19,20],[-7,10],[-6,12],[-2,9],[2,14]],[[7576,2516],[1,1],[2,1],[3,0],[2,2],[2,1],[5,5],[6,7],[10,17],[3,4],[13,19]],[[7623,2573],[20,-20],[17,15],[2,1],[14,12],[-8,7],[29,36],[25,29],[2,3],[-26,24]],[[7698,2680],[6,8],[30,40],[4,5]],[[7738,2733],[13,28],[14,25]],[[7765,2786],[15,-11],[2,-1],[22,-20],[19,-17],[2,-2],[7,-6],[1,-1],[3,-3],[1,0],[2,-2],[17,-17]],[[7856,2706],[-14,-16],[-5,-7],[-7,-10],[-10,-17]],[[7698,2680],[-10,-14]],[[7688,2666],[-38,28]],[[7650,2694],[15,22],[17,24]],[[7682,2740],[15,21]],[[7697,2761],[41,-28]],[[6192,2521],[-1,-3],[-8,-17],[-9,-19],[-5,-17]],[[5566,1320],[-9,99],[-8,90],[-18,1],[-1,-4],[-6,-3],[-3,0],[-9,-1]],[[5512,1502],[-1,15],[0,2],[0,5]],[[6426,3903],[-4,-8]],[[6421,3896],[4,13],[22,56],[10,26],[8,24],[2,5],[2,5],[6,16],[3,10],[2,6],[2,5],[1,4],[2,3],[1,3],[1,4],[1,2],[2,6],[0,1],[2,7],[11,47],[2,9]],[[6505,4148],[6,-3],[2,0],[2,-1],[19,-9]],[[6534,4135],[-1,-3],[-8,-24],[-9,-23],[-7,-21],[-8,-23],[-7,-21],[33,-16]],[[6527,4004],[-1,-11],[0,-8],[0,-6],[-1,-7],[-2,-7]],[[6523,3965],[-3,0],[-3,-1],[-2,-1],[-2,-3],[-35,17],[-28,-80],[-20,9],[-3,2],[-1,-5]],[[6153,3930],[-19,-2],[0,3],[-2,1],[-9,1],[-24,11]],[[6099,3944],[3,9],[2,5],[1,4],[3,8],[5,14],[1,5],[0,5],[-2,8],[-4,10],[-2,5],[-3,4],[-4,2],[-16,8]],[[6083,4031],[11,29]],[[6094,4060],[12,-6],[28,-19],[18,-10]],[[6152,4025],[1,-48],[0,-11],[0,-13],[0,-14],[0,-1],[0,-8]],[[7062,7388],[-18,28]],[[7044,7416],[14,15],[6,7],[3,3],[3,4],[5,6],[6,7],[3,4],[6,7],[17,23],[4,5],[6,8],[1,1],[3,5],[7,8]],[[7128,7519],[58,-72],[8,-11],[3,-3]],[[7197,7433],[-8,-8],[-5,-5],[-14,-13],[-27,-23],[-6,-5],[-30,-25],[-1,2],[-30,46],[-14,-14]],[[6260,2371],[33,69],[0,1],[2,7],[1,3]],[[6296,2451],[45,-29]],[[6155,2366],[61,-39],[6,-2],[20,1],[3,-1]],[[6195,2210],[-6,4],[-11,7],[-38,-3],[-5,-1],[-4,-2],[-8,-1],[-29,-2]],[[6489,6147],[-16,25],[-1,-8]],[[6472,6164],[1,10],[2,13],[1,34],[1,9],[12,23],[11,17],[2,4],[8,13],[7,10],[4,11],[7,19],[1,6],[3,13],[3,5],[2,9],[2,9],[3,4],[3,4],[6,4],[5,10],[3,6],[3,3],[5,3],[6,11],[5,6],[14,21],[10,10],[4,7],[2,5],[3,7],[2,0],[0,15],[4,10],[1,3]],[[6618,6498],[1,-1],[3,-3],[3,-3],[3,-3],[3,-3],[2,-4],[2,-1]],[[6635,6480],[-2,-3],[-7,-20],[-8,-17],[-13,-17],[-13,-16]],[[6592,6407],[-11,-14],[-13,-14],[-4,-5],[-1,-3],[-2,-3],[-1,-11]],[[6560,6357],[-3,-26],[-3,-10],[-5,-14],[-9,-21]],[[6540,6286],[-14,-20],[-8,-14],[-7,-14],[-3,-5],[-2,-8],[-3,-10],[-2,-7]],[[6501,6208],[-6,-28],[-6,-33]],[[7493,7356],[12,-20],[49,-78],[50,-79],[4,-3],[2,-5],[30,-47],[3,-3],[1,-1],[1,-2]],[[7471,6984],[-2,2],[-5,11],[-45,101],[-10,16],[-14,22]],[[7395,7136],[-23,37],[-32,51]],[[7340,7224],[-2,3],[-71,102]],[[7267,7329],[-70,104]],[[7197,7433],[4,4],[22,26]],[[7223,7463],[28,31],[29,34],[17,20],[2,2],[15,17]],[[7314,7567],[13,-21],[50,-77]],[[7377,7469],[50,-78],[36,-56],[2,-3],[15,13],[13,11]],[[7912,5473],[-10,-19]],[[7233,6187],[-39,28],[-5,4],[-22,17],[-5,2],[-26,17],[-33,42],[-30,9]],[[7073,6306],[15,29],[24,46],[6,12]],[[7118,6393],[16,29],[13,25],[12,24]],[[7276,6266],[-7,-13]],[[5894,3747],[-3,3],[-2,12],[-4,5],[-8,9],[-29,29]],[[5848,3805],[-54,58]],[[5794,3863],[-56,59]],[[5738,3922],[12,14],[12,17],[14,17],[14,17]],[[5790,3987],[26,-28],[2,-2],[-6,-8],[-6,-7],[-2,-1],[28,-30],[23,-24]],[[5855,3887],[-13,-17],[15,-17],[17,-17],[9,-9],[3,-4],[36,-37],[3,-3]],[[5925,3783],[-11,-14],[-10,-11],[-10,-11]],[[7382,2444],[-13,-18],[-12,-17]],[[5710,3061],[-3,7],[22,5],[13,3],[13,1],[24,2],[23,1],[60,4],[15,0],[-3,4],[-3,4],[0,9],[0,2],[2,10],[37,48]],[[5967,3218],[16,-16],[50,-52],[2,-2],[3,-3]],[[6038,3145],[-7,-8],[-10,-10],[-10,-10],[-8,-6],[-9,-7],[-8,-5],[-10,-5],[-8,-3],[-9,-4],[-10,-3],[-5,-2],[-6,-1],[-10,-2],[-11,-1],[-16,-1],[-1,0],[-1,0],[-7,0],[-18,-1],[-20,-1],[-22,-1],[-13,0],[-12,-1],[-21,-1],[-17,-1],[-14,-2],[-7,0],[-4,-1],[-5,-1],[-6,-1],[-7,-1],[-5,-1],[-5,-2],[-6,-1]],[[5641,3296],[17,-17],[-14,-18]],[[5644,3261],[-5,-7],[-5,-8],[-3,-10],[-1,-9],[1,-9],[3,-7]],[[5634,3211],[-13,1],[-12,-18],[9,-12],[-17,-9]],[[5601,3173],[1,4],[-5,11],[-3,3],[11,15],[3,4],[3,6],[1,4],[0,7],[-1,7],[0,9]],[[5611,3243],[7,16],[9,12],[1,3],[-1,3],[-19,21],[-8,2],[-14,4],[-2,1],[-5,4],[-10,11]],[[5569,3320],[22,29]],[[5591,3349],[35,-37],[15,-16]],[[5710,3061],[-6,-1],[-5,-2],[-6,-2],[-6,-2],[-4,-1],[-4,-2],[-4,-1],[-7,-3],[-5,-2],[-2,-1],[-4,-2],[-11,-5],[-6,-3],[-4,-2],[-10,-6],[-11,-5],[-10,-5],[-2,-2],[-3,-1],[-2,2],[-3,4],[-2,2],[-10,10],[-14,15],[-13,15],[-6,10],[-2,6],[-3,7],[-3,9],[-3,13],[-2,12],[-6,25]],[[5531,3143],[42,16],[5,2],[20,8],[1,1],[1,1],[1,2]],[[5634,3211],[-8,-10],[-3,-4],[0,-2],[0,-2],[1,-3],[47,-48],[1,-1],[2,0],[2,0],[8,12],[1,3],[-1,13],[6,1],[6,2],[5,3],[5,5],[21,28]],[[5727,3208],[15,-15],[15,-16]],[[5757,3177],[17,-18]],[[5774,3159],[15,-16],[23,29],[14,-16],[-23,-31],[12,-13],[5,0],[36,49]],[[7239,1392],[7,-5],[27,-20]],[[9682,8897],[-40,12],[-2,-14],[-34,10],[-6,1]],[[9600,8906],[5,8],[1,9],[9,48],[1,5],[5,17],[0,8],[5,23],[9,46],[1,5],[10,96],[0,8],[-2,0],[-2,0],[-1,1],[3,10],[3,16],[1,61],[2,43]],[[9650,9310],[2,-1],[40,-11],[5,5]],[[9600,8906],[4,24],[4,21],[4,21],[5,20],[2,10],[-1,11],[-2,22],[-43,11]],[[9573,9046],[-65,18],[-2,-3]],[[9506,9061],[-7,-4],[-15,-5],[-2,-10],[-6,-8],[-12,-63],[20,-6],[2,-2]],[[9486,8963],[-5,-23]],[[9481,8940],[-36,9],[-6,2]],[[9439,8951],[23,111]],[[9473,9112],[6,-2],[18,-5],[-1,-7],[0,-3],[1,-3],[3,2],[20,7],[22,8],[20,7],[13,6],[10,6],[6,5],[7,6],[5,6],[2,7],[-39,11],[-18,5],[-18,5],[-18,5],[-19,1],[-6,1]],[[9547,8921],[5,24],[4,21],[4,21],[4,20],[5,19],[4,20]],[[9600,8906],[-20,6],[-5,1],[-28,8]],[[9547,8921],[-66,19]],[[9486,8963],[5,21],[4,21],[4,21],[4,19],[2,9],[1,7]],[[9434,8928],[5,23]],[[9547,8921],[-5,-23],[-5,-24],[-4,-22]],[[9533,8852],[-66,18],[-4,-21],[-27,7],[-13,4]],[[9302,8735],[5,25],[5,22],[8,53],[6,25],[5,24]],[[9423,8860],[0,-4],[-2,-17],[-1,-6],[-5,-24]],[[9415,8809],[-3,-16],[-12,-59],[-4,-11],[-4,-11],[0,-1]],[[9392,8711],[-5,1],[-19,5],[-30,9],[-15,3],[-21,6]],[[9432,8700],[-38,10],[-2,1]],[[9415,8809],[38,-10]],[[9453,8799],[-6,-29],[-1,-5],[-11,3],[-3,-14],[11,-3],[0,-3],[-5,-24],[-3,-17],[-3,-7]],[[9514,8759],[-10,-52]],[[9504,8707],[-5,-25]],[[9499,8682],[-67,18]],[[9453,8799],[4,24],[66,-19]],[[9523,8804],[-5,-24],[-4,-21]],[[9533,8852],[-4,-22]],[[9529,8830],[-1,-3],[-3,-15],[-2,-8]],[[9529,8830],[76,-21],[2,-1]],[[9607,8808],[0,-3],[3,-24]],[[9610,8781],[2,-26],[4,-45],[-25,7],[4,17],[-2,3],[-56,16],[-23,6]],[[9600,8906],[0,-24],[2,-25],[3,-25],[2,-24]],[[9644,8668],[-3,24],[-5,32],[0,7],[-3,20],[0,11],[0,13],[-23,6]],[[9695,8890],[-2,-4],[0,-6],[0,-16],[1,-5],[-2,-10],[0,-20],[2,-19],[-3,-6],[0,-9],[2,-10],[1,-7],[0,-1],[-2,-10],[-4,-10],[1,-25],[2,-7],[-1,-11],[4,-10],[0,-13],[-1,-9],[2,-7],[2,-10],[-1,-7],[2,-3]],[[9644,8668],[-19,5],[-5,2],[3,-27],[-59,16]],[[9564,8664],[5,25],[-42,11],[-23,7]],[[9490,8638],[4,20],[5,24]],[[9564,8664],[-5,-24],[-3,-19]],[[9556,8621],[-49,13],[-17,4]],[[9486,8616],[4,22]],[[9556,8621],[16,-5],[4,18],[3,1],[33,-9],[2,-1],[0,-2],[2,-19],[2,-18],[-1,-2],[-2,-1],[-64,17],[-65,16]],[[8996,3934],[12,-63],[1,-4],[53,-282],[38,-209],[4,1],[24,-132],[23,-100],[-27,-16],[0,-27],[2,-1],[-13,4],[-47,24],[-17,11],[-21,18],[-30,31],[-13,17],[-10,15],[-8,13],[-13,22],[-8,16],[-3,12],[-9,22],[-11,45],[-3,22],[-3,24],[-1,22],[1,23],[0,18],[4,20],[3,22],[1,4],[0,3],[0,1],[1,5],[5,9],[4,13],[6,19],[11,40],[6,44],[0,34],[0,6],[-3,66],[-8,103],[-7,97],[0,8],[0,5],[0,4],[3,6],[4,1],[10,-4],[4,0],[5,4],[12,7],[1,1],[-19,106],[1,9],[1,1],[5,-1],[25,-127],[5,-3],[2,-9],[1,-7],[-1,-1],[-3,-3],[0,-9]],[[9038,3405],[-1,6],[-11,1],[-11,1],[-1,-3],[-27,3],[-3,1],[-3,0],[0,32],[1,3],[0,3],[1,10],[2,7],[2,18],[2,7],[1,5],[2,3],[0,6],[2,4],[0,4],[0,6],[0,1],[10,33],[6,32],[-11,33],[-21,2],[-4,-31],[-4,-19],[-10,-37],[-1,-5],[-6,-29],[-2,-10],[-3,-21],[-1,-15],[-2,-26],[-1,-5],[0,-21],[0,-2],[0,-17],[12,0],[17,-1],[0,-31],[0,-2],[5,0],[0,-30],[-1,-1],[-3,-9],[-7,0],[-3,-1],[-2,-3],[0,-26],[1,-6],[2,-3],[2,-2],[2,0],[1,2],[0,6],[2,4],[2,3],[11,0],[1,0],[2,4],[2,13],[1,2],[2,1],[3,-2],[2,-4],[1,-4],[2,-8],[3,-22],[-2,-1],[0,-7],[-3,-3],[-5,-1],[-6,3],[-3,-1],[-2,-3],[3,-4],[1,-1],[1,-2],[5,-7],[3,-5],[2,-4],[0,8],[-1,8],[1,4],[3,4],[3,0],[3,-2],[3,-2],[0,-3],[2,-2],[-2,-7],[-2,-9],[3,-7],[3,-6],[4,-1],[2,-6],[0,-6],[4,-9],[2,-4],[4,-2],[1,-4],[2,-1],[4,-1],[6,1],[1,0],[5,6],[1,5],[-2,21],[1,9],[-2,7],[-5,12],[0,8],[4,10],[0,9],[-2,5],[0,9],[2,11],[0,11],[-4,20],[-3,37],[0,37],[-1,6]],[[8980,3810],[102,-565],[12,-65],[27,7],[-10,58],[-105,572],[-26,-7]],[[8960,3872],[1,-1],[1,1],[3,2],[3,4],[10,0],[5,-4],[3,0],[-1,15],[-1,3],[2,3],[-2,10],[-6,8],[-4,3],[-6,0],[-1,-1],[-9,-12],[1,-10],[1,-3],[-1,-3],[1,-15]],[[8953,3313],[0,1],[-2,0],[-1,3],[-4,4],[-4,0],[-1,-2],[0,-6],[1,-3],[3,-3],[3,0],[4,3],[1,1],[0,2]],[[8794,4165],[1,-13],[4,-1],[5,1],[3,-1],[8,-2],[8,-2],[9,-2],[4,-1],[3,-4],[3,-3],[1,-5],[1,-16],[1,-6],[3,0],[6,-1],[5,-3],[4,-3],[5,-3],[3,-3],[3,-3],[2,-1],[3,-3],[1,1],[0,3],[3,2],[1,0],[1,-4],[7,-139],[2,-13],[4,-44],[2,-14],[11,-37],[1,-19],[12,-90],[-1,-15],[-2,-6],[-3,-10],[0,-6],[-4,-8],[-1,-4],[-1,-12],[-3,-29],[-6,-40],[-14,-54],[-5,-21],[-3,-13],[-9,-37],[-2,-6],[-1,-5],[-1,-3],[-8,-9],[-3,-2],[-2,0],[-7,-1],[-6,0],[-4,1],[-5,2],[-7,8],[-14,25],[-2,6],[-26,51],[-6,25],[-19,90],[-9,37],[1,57],[6,62],[1,36],[0,3],[-1,2],[1,7],[-4,27],[-3,8],[-5,18],[-2,16],[-3,15],[0,1],[-2,20],[-1,3],[-4,9],[-1,11],[1,22],[4,17],[5,39],[6,20],[7,21],[19,47],[34,73],[3,4],[3,2],[6,12],[0,6],[5,8],[1,5],[5,7],[5,6],[3,3],[20,0],[8,-5],[3,-5],[3,-7],[2,-13],[3,-49],[-3,-6],[-6,-7],[-57,7],[-17,-31],[-2,-6]],[[8983,3495],[-1,-13],[-4,-21],[-1,-8],[0,-3],[1,-3],[-1,-14],[-2,-17],[-18,1],[-8,0],[0,12],[1,12],[2,15],[4,31],[10,-2],[1,9],[-9,2],[0,5],[1,5],[2,5],[-1,6],[3,3],[1,4],[0,6],[-1,3],[11,36],[7,30],[2,17],[15,-4],[8,-20],[-3,-14],[-13,-54],[-5,-10],[2,-5],[1,-3],[-2,-2],[-2,-6],[-1,-3]],[[8988,3410],[-1,-32],[17,-1],[-3,-27],[-1,-7],[-1,-2],[-5,-4],[-12,-1],[0,20],[-5,0],[1,38],[-12,1],[-1,-6],[-8,1],[-9,1],[0,11],[0,10],[9,0],[27,-1],[4,-1]],[[8879,4108],[-1,1],[-1,2],[-1,25],[-2,37],[2,8],[1,3],[3,-1],[3,-4],[1,-5],[-1,-16],[-2,-6],[2,-39],[-4,-5]],[[9137,3084],[-6,17],[2,-3],[5,-13]],[[8620,3881],[-23,-113],[1,-1],[-3,-12]],[[8595,3755],[-15,5],[-6,2]],[[8574,3762],[-40,11],[0,4],[0,1],[2,7],[2,2],[-8,1],[-2,0],[-6,-2],[-5,-3],[-7,-6],[-6,-6],[-2,-1],[-3,-4],[-3,-5],[-5,-8],[-3,-11]],[[8488,3742],[-5,3],[-1,1],[-4,3],[-4,4],[-22,16],[-25,19]],[[8427,3788],[-4,3],[-43,32]],[[8380,3823],[8,15],[8,15]],[[8396,3853],[46,-35],[11,13],[9,14]],[[8462,3845],[13,22],[10,20],[6,10]],[[8491,3897],[7,12],[12,22],[14,24]],[[8524,3955],[2,-3],[12,-15],[8,-5],[15,-9],[3,-1],[3,-2],[7,-5],[5,-1],[23,-18],[9,-4],[9,-11]],[[8396,3853],[8,15],[8,15]],[[8412,3883],[10,-7],[14,-11],[26,-20]],[[6830,4348],[17,49],[3,4],[12,35]],[[6862,4436],[29,85],[2,2],[3,10],[2,3]],[[6898,4536],[43,-21],[8,-4],[9,-4]],[[6958,4507],[62,-31]],[[7020,4476],[44,-20],[13,-7]],[[7077,4449],[-1,-3],[-4,-13],[-2,-5],[-36,-102],[-10,-27],[-1,-5]],[[7023,4294],[-61,18]],[[8089,3915],[6,13],[-66,50]],[[8029,3978],[7,12]],[[8036,3990],[43,-32],[23,-18]],[[8102,3940],[9,-7],[29,-22]],[[8140,3911],[-7,-12],[-6,-11],[-33,25],[-5,2]],[[8152,3903],[-14,-25]],[[8138,3878],[-2,-2],[-4,-4],[-17,-23]],[[8115,3849],[-29,22]],[[8086,3871],[-16,12],[-66,49]],[[8004,3932],[6,11],[4,8]],[[8014,3951],[59,-44],[3,-3],[5,-3],[8,14]],[[8140,3911],[12,-8]],[[8014,3951],[4,7],[5,8],[6,12]],[[8172,3805],[-10,8],[-14,11],[-3,2],[-10,8],[-6,5]],[[8129,3839],[-9,7],[-5,3]],[[8138,3878],[5,-1],[36,-27],[5,-3]],[[8184,3847],[-1,-4],[-1,-3],[-1,-4],[-9,-31]],[[8152,3903],[10,-8],[18,-14],[11,-8]],[[8191,3873],[-7,-26]],[[8094,3750],[-8,-15]],[[8086,3735],[-50,39]],[[8036,3774],[3,6],[4,9],[8,15],[3,7],[5,9]],[[8059,3820],[41,-32],[11,-8]],[[8111,3780],[-6,-10],[-3,-5],[-8,-15]],[[8071,3704],[-1,2],[-33,24],[-7,5],[-10,8]],[[8020,3743],[1,3],[7,13],[8,15]],[[8086,3735],[8,-6]],[[8094,3729],[-8,-14],[51,-38]],[[8142,3693],[-4,3],[-40,30],[-4,3]],[[8094,3750],[12,-11],[14,-11],[22,-19],[4,-2]],[[8111,3780],[6,-4],[10,-7],[19,-15],[10,-8]],[[9697,9303],[3,20],[1,5],[2,8],[1,6],[5,32]],[[9709,9374],[5,33],[2,7],[6,40],[1,7]],[[9723,9461],[4,24]],[[9727,9485],[41,-10],[20,21],[17,23],[11,15],[15,25]],[[9831,9559],[25,42],[7,11],[2,12]],[[9865,9624],[4,20],[-8,13],[-1,5],[2,12]],[[9862,9674],[4,22],[5,23],[7,38],[-14,3],[2,15],[14,-2],[4,23]],[[9884,9796],[1,6],[1,7],[8,33],[4,14],[12,48],[3,5],[5,12],[-15,-5],[-17,-5],[-25,-8]],[[9861,9903],[-8,-2]],[[9850,9931],[2,2],[2,-1],[2,-1],[2,-2],[10,0],[16,4],[8,3],[20,11],[3,1],[7,5],[6,3],[1,0],[7,-1],[6,-3],[6,2],[6,10],[6,5],[17,3],[4,4],[3,-1],[2,0],[4,4],[5,0],[4,-2],[0,-5],[-4,-7],[-2,-5],[-6,-14],[-11,-14],[-3,-6],[-4,-7],[-3,-1],[-6,-20],[-6,-3],[-3,-3],[-2,-12],[0,-10],[-3,-12],[-4,-5],[0,-13],[-1,-7],[-3,-4],[0,-2],[0,-1],[-6,-7],[-1,-8],[-3,-4],[-3,-8],[0,-3],[0,-5],[0,-11],[-3,-3],[-4,-9],[0,-11],[-2,-9],[-5,-22],[-2,-22],[-2,-8],[-6,-14],[-4,-19],[-5,-9],[-10,-27],[-4,-7],[-6,-4],[-2,-2],[-6,-10],[-5,-7],[-1,-6],[1,-6],[-8,-5],[-5,-10],[-6,-9],[-6,-6],[-7,-13],[-4,-5],[-5,-13],[-7,-6],[-2,-9],[4,-6],[1,-1],[-2,-3],[-5,-4],[0,-6],[-4,-2],[-9,1],[-6,0],[-10,-16],[-2,-11],[-6,-10],[-2,-4],[-1,-3],[-4,-6],[-6,-4],[-1,0],[-1,0],[-7,-14],[0,-7],[-1,-7],[0,-5],[-1,-3],[-3,-5],[-3,-12],[-1,-3],[-1,-10],[0,-4],[-1,-6],[-7,-13],[-1,-11],[0,-14],[-1,-6],[-1,-22]],[[9862,9674],[-28,6],[-13,4],[-9,2],[-9,8],[-8,8],[-19,20]],[[9776,9722],[10,6],[2,2],[5,6],[30,45],[15,23]],[[9838,9804],[46,-8]],[[9838,9804],[11,16],[5,10],[5,14],[4,15],[1,11],[0,10],[-3,23]],[[9865,9624],[-83,23],[-5,-25]],[[9777,9622],[-26,7],[4,26],[3,13],[1,5],[0,5],[3,16],[4,10],[4,8],[6,10]],[[9831,9559],[-22,6],[-25,6]],[[9784,9571],[4,24],[5,23],[-16,4]],[[9727,9485],[5,26]],[[9732,9511],[4,26],[4,24],[40,-10],[4,20]],[[9732,9511],[-4,3],[-60,15]],[[9673,9553],[0,4],[9,27],[9,23],[12,24],[4,7],[12,18],[17,21],[14,18],[13,18],[19,31],[7,15],[11,28],[9,36]],[[9723,9461],[-43,12],[-3,0],[-1,-3],[-3,-17],[-1,-17],[0,-8],[1,-6],[1,-10],[3,-13],[8,-24],[9,2],[15,-3]],[[9233,6314],[-7,-25],[-22,11],[-7,-23]],[[9197,6277],[-10,5],[-31,16],[-10,5]],[[9146,6303],[7,24],[8,23]],[[9274,6238],[-9,5],[-58,29],[-10,5]],[[9240,6335],[17,-9],[18,-8],[17,-9],[2,-1]],[[9294,6308],[-5,-18],[-5,-20],[-10,-32]],[[9293,6387],[21,-89],[-20,10]],[[9365,6386],[2,-11],[0,-11],[3,-6],[1,-12],[4,-11],[2,-19],[1,0],[6,-21],[2,-3],[9,2],[3,1],[4,0],[4,-3],[1,-1],[-1,5],[4,1],[27,-135]],[[9437,6162],[-43,20],[-3,2],[-5,1],[-4,2],[-35,17],[-8,1]],[[9339,6205],[-8,4],[-36,18],[-5,2],[-6,3],[-10,6]],[[9298,6153],[-45,23]],[[9253,6176],[3,7],[4,11],[8,21],[6,23]],[[9339,6205],[8,-30],[8,-30],[3,-12],[2,-12],[-26,13],[-36,19]],[[9253,6176],[-8,-15],[-72,36]],[[9173,6197],[5,16],[2,8],[4,12],[6,22],[7,22]],[[9298,6153],[-6,-16],[-4,-10],[-4,-10],[18,-10],[19,-4],[3,7],[4,9],[33,-18],[1,-2],[-1,-8],[-1,-11],[0,-2]],[[9360,6078],[-3,1],[-14,5],[-8,3],[-9,3],[-10,4],[-10,3],[-7,3],[-31,11],[-9,3],[-6,2],[-4,2],[-6,2],[-9,5],[-7,3],[-5,2],[-5,3],[-4,2],[-2,1],[-2,1],[-5,3],[-3,2],[-2,1],[-3,2],[-3,1],[-20,11],[-5,2],[11,-11],[-8,5],[-6,3],[-2,1],[-3,2],[-2,1],[-3,1],[-8,3],[-4,1],[-5,1],[-5,2],[-7,1],[-5,1],[-6,1],[-11,1],[-6,0],[-2,1],[-3,0],[-3,0],[-4,1],[-4,0],[-3,0],[-4,1],[-4,1],[-4,0],[-3,1],[-4,1],[-3,1],[-4,2],[-3,1],[-3,1],[-1,1]],[[9046,6184],[2,7]],[[9048,6191],[7,23],[2,7],[1,4],[3,10],[9,26],[14,48]],[[9084,6309],[5,-2],[-6,-23],[-6,-20],[-5,-16],[10,-6],[41,-20]],[[9123,6222],[-2,-11],[-3,-8],[14,-7],[12,-6],[24,-12],[5,19]],[[9123,6222],[2,17],[3,9],[4,11],[7,22],[7,22]],[[9084,6309],[7,23]],[[9091,6332],[5,-3],[10,-5],[31,-16],[9,-5]],[[9091,6332],[21,70],[20,65]],[[9084,6309],[-6,3],[-3,2],[-14,7],[-29,15]],[[9032,6336],[2,2],[7,22],[4,16]],[[9045,6376],[11,-6],[9,-4],[5,15],[8,27],[4,11],[4,12],[-13,7],[-7,4]],[[9066,6442],[2,5],[0,2],[1,1],[4,12],[2,4]],[[9075,6466],[7,-4],[28,-14],[10,-5],[7,24],[7,26]],[[9045,6376],[13,43]],[[9058,6419],[1,3],[3,9],[3,7],[1,4]],[[9668,8499],[-23,7],[-9,2]],[[9636,8508],[-96,24],[-1,0],[-1,-2],[-8,-38]],[[9530,8492],[-8,-40]],[[9522,8452],[-66,16]],[[9456,8468],[4,22],[12,59]],[[9472,8549],[14,67]],[[9636,8508],[2,-23],[-20,5],[4,-37],[-1,-4],[-4,0],[-70,18],[-2,1],[0,2],[3,17],[-18,5]],[[9644,8420],[-56,15],[-66,17]],[[9469,8308],[-16,25],[-12,20],[-4,16],[1,13]],[[9438,8382],[5,21],[5,23],[4,21],[4,21]],[[9648,8374],[-20,5],[-44,11],[-55,15],[-3,-1],[-2,-3],[-3,-18],[-5,-21]],[[9516,8362],[-11,2],[-3,-21],[-7,-34]],[[9495,8309],[-13,4],[-4,0],[-4,-2],[-5,-3]],[[9653,8327],[-77,19],[-60,16]],[[9631,8287],[-76,19],[-2,-12],[-19,5],[-20,5],[-19,5]],[[9475,8269],[2,12],[0,8],[-2,8],[-6,11]],[[7032,4840],[-4,3],[-4,3],[-21,15],[-21,16]],[[6982,4877],[-41,30],[-3,3],[-1,1],[-3,-2],[-7,-7],[-12,-11],[-7,-5],[-1,-3],[-8,-7]],[[6899,4876],[-8,-6],[-7,-7],[-7,-5],[-10,-7]],[[6867,4851],[-30,14],[-10,5],[-3,1],[0,1]],[[6824,4872],[5,4],[5,4],[4,3],[7,4],[4,3],[4,2],[9,3],[4,2],[4,2],[6,2],[6,1],[8,2],[10,3],[7,2],[7,3],[7,2],[6,3],[3,1],[2,1],[1,1],[3,1],[3,2],[4,3],[9,6],[3,2],[7,5],[10,9],[2,2],[11,10],[6,6]],[[6991,4966],[2,-4],[89,-65]],[[7082,4897],[-15,-19],[-18,-19],[-2,-3],[-5,-5],[-8,-10],[-2,-1]],[[8792,5843],[-9,5],[-62,34],[-8,4]],[[8713,5886],[3,10],[5,12]],[[8807,5880],[-15,-37]],[[8792,5843],[-8,-21]],[[8784,5822],[-9,5],[-9,5]],[[8766,5832],[-27,15],[-9,4],[-4,-9]],[[8726,5842],[-8,5],[-9,4],[-9,5]],[[8700,5856],[8,20],[5,10]],[[8709,5799],[9,22]],[[8718,5821],[4,10],[4,11]],[[8766,5832],[-4,-10],[-4,-10],[-9,5],[-9,5],[-13,-33]],[[8784,5822],[-21,-53]],[[8640,5863],[8,-5],[61,-33],[9,-4]],[[8648,5884],[9,-4],[35,-19],[8,-5]],[[8627,5896],[7,19]],[[8612,5852],[-3,2],[-11,6],[-31,17],[-14,8],[10,24],[-4,2],[1,3]],[[8560,5914],[6,15],[-8,5]],[[8597,5812],[-3,1],[-43,24],[-9,5],[-9,5]],[[8533,5847],[7,17],[-18,11],[20,49],[18,-10]],[[8533,5847],[-9,5],[-31,17]],[[8493,5869],[-21,12],[-19,10]],[[8496,5756],[-40,22]],[[8456,5778],[4,10],[4,11],[13,31],[8,20]],[[8485,5850],[8,19]],[[8533,5847],[-8,-20],[-8,-19],[-8,-21],[-5,-11]],[[8504,5776],[-4,-10],[-4,-10]],[[8485,5850],[-39,21],[-9,-19],[-40,21]],[[8397,5873],[8,20],[8,20]],[[8456,5778],[-41,23],[-8,-20],[-7,-17]],[[8324,5852],[11,26],[1,5]],[[8336,5883],[5,-2],[16,-9],[16,-9],[16,-9],[8,19]],[[8336,5883],[8,19]],[[8344,5902],[8,20],[8,20]],[[8344,5902],[-3,2],[-34,19],[-13,8],[8,19]],[[8302,5950],[8,20],[14,-8],[4,8],[2,2],[4,9]],[[8334,5981],[17,-9],[4,9],[2,2],[4,8],[14,-8],[2,-1]],[[8324,5852],[-3,1],[-31,17],[-73,41]],[[8217,5911],[7,18],[24,67],[18,48]],[[8266,6044],[17,-10],[-16,-40],[-8,-19],[43,-25]],[[8266,6044],[7,21]],[[8273,6065],[11,-7],[51,-28]],[[8335,6030],[-8,-20],[14,-8],[-4,-8],[1,-4],[-4,-9]],[[8335,6030],[9,22],[28,-16]],[[8273,6065],[3,7],[5,13]],[[8281,6085],[6,20]],[[8287,6105],[20,-12],[26,-14],[15,-8]],[[8287,6105],[5,14],[7,20],[13,36],[1,3]],[[8281,6085],[-3,2]],[[8278,6087],[-3,1],[-7,4],[-9,5],[-12,6],[0,10]],[[8247,6113],[7,20],[15,42],[15,-7],[7,18],[1,3]],[[8292,6189],[3,-1],[16,-9],[2,-1]],[[7547,5461],[-53,39],[-3,2],[-2,1],[-3,2],[-2,2],[-2,2]],[[7482,5509],[9,16],[9,17],[11,16],[3,3]],[[7514,5561],[3,7],[5,10],[2,3],[3,-2],[2,-2],[3,-2],[23,-16],[9,-9],[2,-3],[4,-3],[15,-11]],[[7585,5533],[-1,-3],[-10,-18],[60,-44]],[[7585,5533],[9,16],[8,16],[4,7]],[[7606,5572],[60,-44]],[[7606,5572],[5,8]],[[7611,5580],[9,-6],[19,36],[6,4],[6,-1],[8,-6],[15,-11],[21,-14],[10,18]],[[7705,5600],[50,5],[8,-4],[7,-5]],[[7611,5580],[-6,5],[12,22],[-2,9],[6,4],[10,11],[16,4],[10,0],[48,-35]],[[7729,5708],[1,-10],[-1,-5],[-18,-33],[23,-18],[12,13],[12,6],[12,4],[12,-3]],[[7782,5662],[10,-3],[6,-5]],[[7606,5572],[-53,39],[-4,3]],[[7637,5775],[3,-2],[7,-5],[36,-26],[3,-2],[2,-2],[2,-1],[8,-4],[3,-1],[3,0],[8,-1],[10,-1],[3,1],[2,0],[0,-3],[0,-3],[2,-17]],[[7729,5708],[13,1],[4,0],[42,-30],[-5,-10],[-1,-7]],[[7777,5747],[-2,-4],[-3,-5],[0,-2],[1,-1],[1,-1],[47,-35]],[[7660,5817],[3,-2],[3,-2],[49,-36],[39,-29],[2,-1],[1,-2],[1,-3],[2,1],[5,2],[3,1],[4,0],[5,1]],[[7679,5853],[3,-1],[2,-2],[27,-19]],[[7711,5831],[23,-18],[58,-41],[-10,-18],[-5,-7]],[[7711,5831],[1,4],[8,13],[9,16],[2,1],[3,-1],[30,-22],[7,5]],[[7771,5847],[6,-3],[4,-7],[16,-13],[11,8],[29,-21],[7,20],[4,11],[5,8]],[[7853,5850],[17,-13]],[[7771,5847],[1,17]],[[7772,5864],[7,0],[11,5],[5,6],[6,13]],[[7801,5888],[12,-9],[27,-20],[13,-9]],[[7801,5888],[-17,13],[-2,1],[10,18]],[[7792,5920],[9,18],[3,5],[2,4],[0,2],[0,3],[-1,4]],[[7772,5864],[-8,2],[-5,4],[-47,33],[5,9],[7,11],[7,8],[2,2],[3,2],[7,4],[24,7],[-1,-8],[26,-18]],[[7679,5853],[13,24],[16,29],[0,1],[19,34],[17,31],[1,3]],[[7636,5886],[22,41],[26,47],[-15,11]],[[7669,5985],[16,32],[2,3]],[[7687,6020],[10,-8],[1,-1],[29,-25],[4,-3],[3,-2],[5,-2],[3,-2],[3,-2]],[[7621,5897],[10,22],[-11,8],[-8,0]],[[7612,5927],[1,22],[3,10],[4,11],[3,9],[0,13]],[[7623,5992],[8,2],[7,-1]],[[7638,5993],[25,-18],[6,10]],[[7562,5946],[11,19],[9,16],[-1,5],[-14,10],[11,19],[9,19]],[[7587,6034],[21,-16],[9,-9],[1,-3],[5,-14]],[[7612,5927],[-17,0],[-7,1],[-4,1],[-22,17]],[[7587,6034],[-15,10]],[[7572,6044],[12,21],[13,13]],[[7597,6078],[9,-14],[1,-5],[-6,-5],[1,-5],[13,-10],[3,1],[3,4],[2,1],[13,-12],[14,-13],[1,-5],[-13,-22]],[[7597,6078],[14,13],[2,3]],[[7613,6094],[2,-3],[9,-12],[9,-10],[10,-11],[13,-13],[15,-13],[16,-12]],[[7613,6094],[-2,4],[-11,16],[-5,9],[-10,17],[-2,4]],[[6559,2837],[-53,39]],[[6506,2876],[11,22],[14,24],[10,18],[6,11]],[[6489,2725],[-19,5],[-10,7],[-6,9],[-2,10],[0,6],[3,7],[19,35],[12,22],[-11,8]],[[6475,2834],[13,20],[3,0],[0,5],[11,20],[4,-3]],[[6559,2837],[-12,-23],[-13,-23],[-15,-22],[-11,-18],[-15,-15],[-4,-11]],[[6489,2725],[-2,-8],[-2,-22]],[[6485,2695],[-18,-3],[-9,-6],[-10,-9],[-10,-16],[-4,-18],[0,-14]],[[6434,2629],[-9,0],[-11,-1],[1,-75],[4,-4],[5,-3],[58,-43],[4,0],[10,19]],[[6496,2522],[11,-8],[2,-1]],[[6492,2483],[-1,1],[-68,50],[-4,0],[-13,16],[-5,4]],[[6399,2727],[12,-4],[14,-9],[19,37],[-8,6],[39,77]],[[9334,6927],[-22,6]],[[9492,7435],[10,15],[12,18],[2,3],[10,16],[2,3],[20,30],[31,-10],[2,11],[5,13],[7,30],[-13,4],[14,20],[14,22]],[[9641,7660],[15,-3],[17,-6],[10,-3]],[[9683,7648],[-3,-6],[-3,-13],[1,-2],[0,-2],[-4,-4],[-1,-3],[1,-2],[11,-10],[21,35],[5,-2],[-36,-57],[-5,-7],[-3,3],[1,1],[-1,3],[-2,0],[-13,-10],[-5,-4],[-4,-5],[-12,-10],[-5,-2],[-5,-3],[0,-3],[-2,-7],[0,-2],[8,-4],[0,-1],[-4,-2],[-4,1],[-2,3],[-2,0],[-1,-1],[-3,-4],[-2,-2],[-1,-2],[1,-6],[2,-3],[8,-4],[1,-2],[1,-1],[-1,-1],[-2,0],[-2,0],[-5,4],[-2,0],[-1,-1],[-3,-3],[-1,-4],[0,-15],[-3,-3],[-5,-14],[2,-3],[7,-1],[4,4],[1,9],[3,-1],[0,-3],[2,-1],[2,-5],[5,9],[3,-2],[-36,-56],[-2,2],[-1,0],[-16,-9],[0,-3],[-1,-1],[-7,2],[0,1],[-1,0],[-31,-27],[-4,-9],[1,-8],[46,16],[1,-5],[-50,-17],[-2,-5],[-1,-6],[-2,-1],[-3,-2],[-10,-10],[-4,-18],[0,-1],[9,-5],[5,-7],[4,-4],[2,-5],[3,0],[14,22],[4,-3],[-19,-28],[-6,-9],[-30,-46],[-4,-10],[-34,-81],[-11,-26],[-3,-9],[-22,-92],[-22,-94],[-4,1],[1,2],[-4,0],[-3,-1],[0,-4],[-6,-1],[-2,0],[-1,-3],[0,-1]],[[9774,7870],[0,-4],[-1,-1],[0,-1],[-2,-10],[8,-8],[-4,0],[-4,3],[-4,2],[-2,0],[-2,-1],[-2,-1],[-8,-14],[-3,-5],[-3,-9],[-3,-5],[-9,-9],[-5,-7],[-8,-18],[-2,-8],[0,-4],[-6,-16],[0,-1],[-2,-12],[-5,-7],[-10,-8],[-4,-6],[-7,-14],[0,-4],[0,-7],[11,-8],[2,-5],[-1,-3],[-2,-2],[-6,-15],[-3,-3],[-4,-10],[0,-1]],[[9261,6900],[14,44]],[[9203,6858],[5,16],[5,17],[6,22],[7,25],[5,16],[1,2]],[[9162,6870],[4,16],[6,16],[6,22],[7,25],[5,19]],[[9116,6865],[5,17],[5,16],[5,16],[6,22]],[[9137,6936],[6,25],[5,19]],[[9156,6852],[-7,3],[-24,7],[-9,3]],[[9066,6863],[5,16],[9,-2],[36,-12]],[[9047,6869],[-11,4],[-11,4],[3,8],[3,7],[4,14]],[[9035,6906],[5,16]],[[9040,6922],[33,-9],[8,-2],[6,16],[6,22],[9,-3],[25,-7],[10,-3]],[[9066,6863],[-9,3],[-10,3]],[[9040,6922],[2,9],[2,8],[7,22],[7,23],[5,18]],[[8990,6920],[6,15],[4,13],[1,4],[1,2],[6,19],[8,24],[6,18]],[[9035,6906],[-9,3],[-28,8],[-8,3]],[[9047,6869],[-8,-25],[-11,4],[-11,5],[-8,-20],[-41,17]],[[8968,6850],[2,7],[7,23]],[[8977,6880],[7,19],[6,21]],[[9049,6805],[-3,-8],[-9,4],[-33,14]],[[9004,6815],[-41,18],[0,1]],[[8963,6834],[5,16]],[[9074,6740],[-32,15],[-9,5],[-8,4],[-33,16]],[[8992,6780],[6,17],[6,18]],[[8950,6799],[7,17],[6,18]],[[8992,6780],[-9,-25],[-8,-22],[-9,5],[-23,11],[-9,4]],[[9008,6691],[-9,5],[-23,11],[-9,5],[-9,4],[-23,11],[-8,5]],[[9001,6670],[-8,-21],[-9,5],[-23,11],[-9,4]],[[8952,6669],[-9,5],[-23,10],[-9,5]],[[9034,6629],[-8,-23],[-9,-26],[-9,-25]],[[9008,6555],[-10,5],[-22,11],[-9,5]],[[8967,6576],[9,24],[9,26],[-9,4],[-23,12],[-9,4],[8,23]],[[8967,6576],[-9,4],[-23,11],[-10,5]],[[8925,6596],[-9,4],[-23,12],[-8,4]],[[8990,6507],[-8,-24],[-9,5],[-23,11],[-9,4]],[[8925,6596],[-8,-25],[-8,-24],[31,-15],[10,-5],[8,-4],[23,-11],[9,-5]],[[9049,6535],[-9,-25]],[[9040,6510],[-9,5],[-23,11],[-9,5],[-9,-24]],[[9008,6555],[9,-4],[13,-6],[10,-5],[9,-5]],[[9058,6419],[-2,1],[-13,7],[-8,4],[-19,9],[-16,-45],[-35,18],[-47,24]],[[9040,6510],[-8,-23],[8,-5],[23,-11],[10,-4],[2,-1]],[[9049,6535],[9,-5],[23,-11],[10,-5]],[[9032,6336],[-7,-23]],[[9025,6313],[-45,24],[-37,18],[7,18],[1,4],[-46,24]],[[9025,6313],[-10,-34],[-6,-23],[-1,-4],[-3,-10],[-3,-7]],[[9048,6191],[-1,0],[-3,-2],[-2,-1],[-2,-1],[-1,0],[0,1],[-3,1],[-2,2],[-3,1],[-3,3],[-3,2],[-3,2],[-2,3],[-1,0],[-1,1],[0,2],[-3,8],[-2,6],[-5,8],[-6,8]],[[9046,6184],[-15,-53],[-32,-108],[-9,-33],[-10,-50],[-7,-29],[-6,-29]],[[8886,5628],[-7,-20],[-28,-87],[-6,-18]],[[8845,5503],[-7,3],[2,6],[4,9],[2,6],[0,1],[4,10],[2,5],[4,13],[4,13],[3,9],[-3,2],[-1,1],[-6,3],[-15,8]],[[8838,5592],[6,9],[5,8],[6,13],[-9,5],[-8,4],[-10,5],[-9,5],[-9,5],[-13,7]],[[8797,5653],[8,20],[8,19]],[[8813,5692],[4,11],[25,69],[0,1],[16,46],[14,38]],[[8872,5857],[7,19],[1,1],[0,2],[1,2]],[[8872,5857],[-14,8],[-10,6],[-11,-27],[-19,10],[6,17],[-17,9]],[[5886,4124],[-6,3],[-16,8],[-18,8],[-12,-35],[0,-1],[0,-1],[26,-28],[-12,-16],[-13,-16]],[[5835,4046],[-18,-23]],[[5817,4023],[-14,14],[-13,15],[-14,14],[-3,3],[-12,12]],[[5761,4081],[31,41],[5,7],[13,27],[1,4],[6,16],[73,-34],[1,-1],[0,-3],[-5,-14]],[[5913,4145],[-1,-5],[-8,-24]],[[5904,4116],[-18,8]],[[5761,4081],[-13,14],[-30,31],[-3,3],[-16,18]],[[5699,4147],[-27,27],[-3,8]],[[5669,4182],[-1,14]],[[5668,4196],[22,5],[28,2],[23,1],[26,-2],[11,-1],[10,-2]],[[5788,4199],[5,-2],[15,-5],[3,-1],[5,-2],[36,-14],[1,-1],[8,-4],[52,-24],[0,-1]],[[5682,3982],[-61,63]],[[5621,4045],[11,15],[13,17]],[[5645,4077],[11,13],[10,14],[6,7]],[[5672,4111],[5,7],[9,12],[2,2],[11,15]],[[5761,4081],[-14,-17],[-14,-18],[-13,-18],[-26,-33],[-6,-7],[-6,-6]],[[5672,4111],[-15,15],[-11,-15],[-2,-1],[-2,1],[-27,29],[-4,16],[18,9],[19,8],[21,9]],[[5645,4077],[-2,2],[-58,62],[-4,-2],[-13,-12],[-11,11],[-3,4]],[[5554,4142],[61,35],[23,10],[26,8],[4,1]],[[5621,4045],[-66,69]],[[5555,4114],[-13,15],[-6,2]],[[5536,4131],[18,11]],[[8278,6087],[-9,-6],[-5,1],[-25,-10]],[[8169,6240],[2,-1],[15,-5]],[[8186,6234],[-1,-3],[0,-5],[10,-28],[9,4],[33,-13],[-11,-30],[14,-12],[5,-4],[1,-2],[1,-3],[0,-5],[0,-20]],[[8186,6234],[72,-29],[3,-1],[2,-1],[16,-6],[11,-6],[2,-2]],[[8195,6317],[72,-40],[9,21]],[[8276,6298],[45,-25],[8,21],[7,20],[7,21],[10,-5],[11,-6],[3,-2]],[[8211,6358],[73,-40]],[[8284,6318],[-8,-20]],[[8292,6339],[-8,-21]],[[8218,6378],[74,-39]],[[8234,6413],[70,-43]],[[8304,6370],[-4,-11],[-8,-20]],[[8332,6434],[-1,-3],[-6,-14],[-8,-20],[35,-19],[-9,-18],[-34,18],[-5,-8]],[[8371,6333],[-3,2],[-64,35]],[[6019,3434],[-11,10],[-6,20],[-12,-13],[-13,13]],[[5977,3464],[-4,5],[-5,2],[-6,7]],[[5962,3478],[12,16],[13,17]],[[5987,3511],[18,24],[16,21],[2,2]],[[6023,3558],[7,-6],[5,-8],[17,-18],[5,-4],[8,-7],[4,-2],[5,-4]],[[6074,3509],[-2,-2],[-15,-26],[-31,-39],[-7,-8]],[[7432,5545],[50,-36]],[[7459,5596],[12,-8],[30,-22],[5,-5],[3,0],[5,0]],[[7471,5617],[9,17],[8,14],[1,4]],[[7489,5652],[2,4]],[[7363,5696],[10,17]],[[7373,5713],[9,17]],[[7382,5730],[54,-39]],[[7436,5691],[53,-39]],[[7436,5691],[10,20],[6,10],[-54,39]],[[7398,5760],[8,11]],[[7382,5730],[10,20]],[[7392,5750],[4,7],[2,3]],[[7392,5750],[-9,6],[-1,0],[-17,12],[-16,12],[-8,6],[-2,3]],[[7339,5789],[3,7],[8,15]],[[7373,5713],[-54,39],[9,17]],[[7328,5769],[11,20]],[[7242,5785],[9,17],[9,17]],[[7260,5819],[68,-50]],[[7260,5819],[12,22],[10,18]],[[7282,5859],[16,-11]],[[7298,5848],[52,-37]],[[7298,5848],[18,32],[9,18],[25,-18]],[[7350,5880],[-2,-6],[-1,-18],[-2,-14],[-6,-12],[16,-11]],[[7282,5859],[5,9]],[[7287,5868],[13,26],[18,33]],[[7318,5927],[26,-17],[16,-12]],[[7360,5898],[-10,-18]],[[7360,5898],[8,-8],[13,-16],[11,-18]],[[7366,5916],[8,-5],[6,-4]],[[7380,5907],[15,-18],[22,-38]],[[7417,5851],[-14,-13]],[[7360,5898],[4,9],[2,9]],[[7392,5923],[13,-15],[10,-16],[16,-27]],[[7431,5865],[-5,-7],[-9,-7]],[[7380,5907],[3,7],[1,10],[8,-1]],[[7392,5923],[19,34]],[[7411,5957],[22,-17],[16,-11]],[[7449,5929],[-4,-10],[-3,-12],[-1,-15],[-4,-16],[-6,-11]],[[7366,5916],[0,7],[-2,8],[0,6],[0,7],[2,6],[3,7]],[[7369,5957],[12,22]],[[7381,5979],[15,-11],[15,-11]],[[7381,5979],[22,42],[10,14],[9,7],[2,2]],[[7424,6044],[3,-2],[12,-10],[6,-6],[5,-7],[4,-6],[3,-8],[3,-10],[2,-16]],[[7462,5979],[3,-28],[1,-7],[2,-10],[1,-3],[-3,-1],[-6,-3],[-5,-1],[-6,3]],[[7369,5957],[-17,13],[10,19],[-1,5],[-18,14]],[[7343,6008],[14,9],[10,18],[9,17],[10,17],[1,2]],[[7387,6071],[16,-12],[18,-13],[3,-2]],[[7490,6111],[9,-20]],[[7499,6091],[-54,-34],[-21,-13]],[[7387,6071],[13,24]],[[7400,6095],[16,-13],[11,22],[5,8],[9,16],[4,1],[22,-16],[5,-13],[18,11]],[[7400,6095],[11,20],[-15,11],[14,26],[-1,5],[-13,9],[7,20]],[[7403,6186],[33,-25],[16,-12],[18,-13]],[[7470,6136],[12,-9],[8,-16]],[[7387,6071],[-78,59]],[[7357,6213],[11,8],[13,7],[12,6],[8,8]],[[7401,6242],[15,17],[15,16]],[[7431,6275],[6,-7],[2,-9],[-2,-12],[-24,-43]],[[7413,6204],[-10,-18]],[[7546,6172],[-48,-29],[-18,13],[-10,-20]],[[7413,6204],[17,-12],[16,-13],[29,53],[16,-12],[16,-13],[10,-7],[10,9],[10,-19],[9,-18]],[[7565,6184],[-3,-2],[-16,-10]],[[7431,6275],[29,32]],[[7460,6307],[7,7],[9,-11],[3,-7],[9,-16],[8,-12],[15,-20],[12,9],[3,3]],[[7583,6144],[-3,-2],[-16,-10],[-65,-41]],[[7520,5979],[-8,5],[-8,3],[-22,-5]],[[7482,5982],[-20,-3]],[[7572,6044],[-4,-5],[-7,-4],[-4,-3],[-9,-7],[-8,-9],[-9,-14],[-11,-23]],[[7562,5946],[-11,9]],[[7551,5955],[-17,12],[-14,12]],[[7534,5912],[-46,35],[-2,12],[-4,23]],[[7551,5955],[-11,-20],[-6,-23]],[[7587,5836],[-65,48]],[[7522,5884],[8,16],[4,12]],[[7471,5822],[31,25],[9,17],[1,2],[10,18]],[[8458,6764],[4,22],[6,20],[5,19]],[[8473,6825],[7,20]],[[8613,6778],[-1,-2],[-3,-9],[-1,-2],[0,-2],[-6,-22],[-1,-3]],[[8601,6738],[-2,1],[-36,9],[-35,7]],[[8528,6755],[-25,5],[-45,4]],[[8521,6693],[-17,2]],[[8504,6695],[2,33],[0,3],[2,0],[12,-1],[3,-1],[5,26]],[[8601,6738],[0,-2],[-4,-23]],[[8597,6713],[-3,0],[-32,8],[-3,1],[0,-3],[-2,-27],[-15,4],[-17,1],[-4,-4]],[[8513,6626],[5,25],[2,26],[1,16]],[[8597,6713],[0,-4],[-3,-35],[-1,-17],[-2,-14],[0,-3],[-1,-3],[-2,-13],[-4,-19]],[[8584,6605],[-2,0],[-17,5],[-17,5],[-18,6],[-17,5]],[[8736,6670],[-8,-11],[-50,38],[-16,-44],[55,-26],[0,-3],[0,-3],[2,-11],[-11,-24],[-38,15],[-38,20],[-12,-53],[3,-10]],[[8623,6558],[-3,1],[-7,3],[-2,1],[-6,3],[-9,2],[-2,0],[-17,6]],[[8577,6574],[4,16],[3,15]],[[8597,6713],[14,-4],[3,-1],[2,-1],[15,-4],[3,-2],[15,-5],[1,15],[3,17]],[[8653,6728],[16,-10],[18,-12],[18,-13],[17,-12],[14,-11]],[[8631,6817],[14,-10],[14,-11],[8,-6],[8,-5]],[[8675,6785],[-2,-3],[-7,-15],[-6,-14],[-3,-10],[-4,-15]],[[7460,6307],[-13,15],[-17,-18],[-13,10],[4,10],[8,8],[-46,34],[-5,3],[-7,0],[-6,-2],[-4,-4],[-4,-5],[-6,-11],[-16,11]],[[7416,6399],[17,-12],[15,-12],[2,-1],[10,-8],[5,-5],[5,-6],[4,-6],[6,-8],[2,-4],[2,-3],[11,-19]],[[7322,4905],[-56,41]],[[7266,4946],[5,9],[6,10],[56,-42]],[[7333,4923],[-6,-9],[-5,-9]],[[7312,4885],[-56,41],[-25,18]],[[7231,4944],[7,10],[5,9]],[[7243,4963],[23,-17]],[[7322,4905],[-4,-10],[-6,-10]],[[7301,4864],[-56,42],[-25,18]],[[7220,4924],[5,9],[6,11]],[[7312,4885],[-6,-11],[-5,-10]],[[7290,4844],[-56,42],[-25,18]],[[7209,4904],[6,10],[5,10]],[[7301,4864],[-5,-9],[-6,-11]],[[7290,4844],[-10,-18]],[[7280,4826],[-10,7],[-47,34],[-15,12],[-9,6]],[[7199,4885],[5,10],[5,9]],[[7280,4826],[-10,-19]],[[7270,4807],[-10,7],[-72,54]],[[7188,4868],[11,17]],[[7178,4851],[5,8],[5,9]],[[7270,4807],[-5,-8],[-4,-9]],[[7261,4790],[-83,61]],[[7169,4833],[5,10],[4,8]],[[7261,4790],[-5,-8],[-4,-9]],[[7252,4773],[-83,60]],[[7252,4773],[-6,-11],[-6,-11],[-51,37],[-32,23]],[[7157,4811],[6,12],[6,10]],[[7252,4773],[31,-24],[2,0],[-6,-12],[-7,-11],[-6,-11],[-5,-11]],[[7261,4704],[-33,25]],[[7228,4729],[-82,60]],[[7146,4789],[6,12],[5,10]],[[7214,4704],[-82,60]],[[7132,4764],[7,14],[7,11]],[[7228,4729],[-7,-12],[-7,-13]],[[7200,4678],[-63,46],[-19,14]],[[7118,4738],[14,26]],[[7214,4704],[-8,-14],[-6,-12]],[[7200,4678],[-9,-17],[-23,16],[-6,-10]],[[7162,4667],[-58,44]],[[7104,4711],[5,11],[9,16]],[[7151,4646],[-18,14],[-2,-4],[-2,-9],[-5,-13]],[[7124,4634],[-16,8],[-27,12],[-2,3]],[[7079,4657],[2,1],[5,17],[0,2]],[[7086,4677],[6,14],[6,11],[6,9]],[[7162,4667],[-5,-10],[-6,-11]],[[7133,4610],[-57,26]],[[7076,4636],[2,9],[1,8],[0,4]],[[7124,4634],[9,-4],[7,-4],[-4,-9],[-3,-7]],[[7125,4591],[-55,26]],[[7070,4617],[3,10],[3,9]],[[7133,4610],[-2,-3],[-3,-6],[-3,-10]],[[7118,4571],[-10,4],[-45,22]],[[7063,4597],[4,12],[3,8]],[[7125,4591],[-3,-9],[-4,-11]],[[6952,4806],[-42,23]],[[6910,4829],[-36,18],[-7,4]],[[6899,4876],[24,-13],[14,-7],[14,-8],[14,-7]],[[6965,4841],[-3,-9],[-3,-8],[-3,-9],[-4,-9]],[[6933,4749],[-21,10],[-9,4]],[[6903,4763],[-10,4],[-4,3]],[[6889,4770],[4,10],[3,9],[3,8],[3,9],[4,11],[4,12]],[[6952,4806],[-3,-9],[-4,-11],[-3,-8],[-3,-9],[-3,-9],[-3,-11]],[[6889,4770],[-38,18],[-5,2]],[[6846,4790],[4,10],[3,9],[3,9],[3,9],[4,11],[4,13]],[[6889,4724],[-9,5],[-43,20],[-9,5]],[[6828,4754],[7,19],[6,19]],[[6841,4792],[5,-2]],[[6903,4763],[-7,-19],[-7,-20]],[[6876,4687],[-61,29]],[[6815,4716],[4,11],[2,9],[7,18]],[[6889,4724],[-3,-10],[-3,-8],[-3,-8],[-4,-11]],[[6861,4644],[-61,29]],[[6800,4673],[3,10],[4,9],[3,11],[5,13]],[[6876,4687],[-4,-13],[-4,-12],[-4,-9],[-3,-9]],[[6846,4603],[-61,29]],[[6785,4632],[4,11],[4,10]],[[6793,4653],[3,10],[4,10]],[[6861,4644],[-4,-10],[-3,-10],[-4,-10],[-4,-11]],[[6834,4567],[-61,29]],[[6773,4596],[6,18],[3,9],[3,9]],[[6846,4603],[-3,-9],[-3,-9],[-6,-18]],[[6898,4536],[-2,1],[-62,30]],[[6846,4603],[64,-30]],[[6910,4573],[-4,-10],[-3,-8],[-2,-5],[1,-3],[-4,-11]],[[6861,4644],[32,-15],[31,-15]],[[6924,4614],[-4,-10],[-3,-10],[-3,-10],[-4,-11]],[[6876,4687],[63,-31]],[[6939,4656],[-5,-12],[-3,-11],[-4,-10],[-3,-9]],[[6889,4724],[10,-4],[45,-21],[9,-4]],[[6953,4695],[-4,-10],[-3,-8],[-3,-9],[-4,-12]],[[6933,4749],[26,-12],[10,-5]],[[6969,4732],[-9,-18],[-7,-19]],[[7014,4666],[-10,5],[-39,18],[-2,1],[-10,5]],[[6969,4732],[10,-5],[1,0],[18,-8],[19,-9]],[[7017,4710],[10,-5]],[[7027,4705],[-6,-20],[-7,-19]],[[7000,4627],[-61,29]],[[7014,4666],[-3,-10],[-4,-9]],[[7007,4647],[-3,-9],[-4,-11]],[[6985,4584],[-61,30]],[[7000,4627],[-4,-12],[-4,-12]],[[6992,4603],[-3,-9],[-4,-10]],[[6971,4543],[-23,11],[-16,8],[-22,11]],[[6985,4584],[-3,-9],[-4,-10],[-3,-10],[-4,-12]],[[6971,4543],[-3,-9],[-3,-8],[-7,-19]],[[6862,4436],[-64,30],[-4,3],[-17,9],[-38,18],[6,18],[6,18],[6,18],[6,18],[61,-30],[3,10],[6,15],[1,4]],[[6830,4348],[-66,18]],[[6764,4366],[-10,3],[-51,15],[-39,10],[-49,13],[-4,1],[-2,1]],[[6609,4409],[2,4]],[[6611,4413],[23,62],[13,32],[2,4],[3,8]],[[6652,4519],[15,41],[7,17],[10,27],[2,3],[0,1],[2,5],[12,31]],[[6700,4644],[1,-1],[2,-2],[1,-1],[2,-3],[3,-9],[1,-1],[1,-2],[2,-1],[2,-1],[1,-1],[3,0],[14,-7],[22,-10],[18,-9]],[[6652,4519],[-3,1],[-3,2]],[[6646,4522],[1,3],[6,18],[7,18],[-9,4],[-11,5],[-38,19]],[[6702,4649],[-1,-3],[-1,-2]],[[6646,4522],[-8,4],[-46,22],[-4,2]],[[6588,4550],[4,11],[3,9],[4,10],[3,9]],[[6575,4513],[3,9],[3,9],[4,10],[3,9]],[[6646,4522],[-8,-18],[-7,-18],[-7,3],[-2,1],[-43,20],[-4,3]],[[6568,4493],[-62,30]],[[6506,4523],[7,19],[6,19]],[[6519,4561],[7,18],[7,21],[7,18]],[[6575,4513],[-4,-10],[-3,-10]],[[6569,2685],[-2,0],[-35,5],[-47,5]],[[6496,2522],[-17,12],[17,31],[8,18],[2,15],[-1,18],[-20,-3],[-4,24],[-6,0],[-20,-3],[-21,-5]],[[6402,2406],[-1,148]],[[7401,6242],[-17,-2],[-90,68]],[[7343,6008],[-10,-4],[-15,-3],[-36,0]],[[7318,5927],[-12,10],[-10,12],[-5,7],[-4,10]],[[7287,5966],[-2,8],[-1,5],[-2,22]],[[7259,5922],[-15,11],[-16,12]],[[7287,5966],[-5,-1],[-23,-43]],[[7287,5868],[-23,17],[-1,6],[6,11],[6,8],[-16,12]],[[7282,5859],[-41,32],[-13,10]],[[7228,5901],[-14,11],[-14,10]],[[7228,5901],[-3,-7],[-4,-7],[-2,-3],[-2,-4],[-1,-4],[-4,-6]],[[7212,5870],[-14,9],[-13,10]],[[7185,5889],[-13,10],[-7,4],[-7,5]],[[7187,5824],[-13,10],[-13,10]],[[7161,5844],[4,8],[20,37]],[[7212,5870],[-6,-12],[-9,-17],[-10,-17]],[[7161,5844],[-13,9],[-14,10]],[[7532,5214],[1,-5],[-14,0],[-6,-11],[-12,-18],[-5,-10]],[[7496,5170],[-58,40],[-5,-8],[-4,-7],[-4,-8],[-4,-8]],[[7421,5179],[-20,14]],[[7401,5193],[13,21],[11,20],[-9,7],[-41,30],[-3,2]],[[7478,5254],[15,-11],[15,-11],[24,-18]],[[7401,5193],[-8,6],[-7,5]],[[7386,5204],[-33,25],[-7,4]],[[7354,5145],[-46,33],[10,20],[-5,3],[-4,3],[-2,2],[-1,1],[-3,2],[-38,28]],[[7265,5237],[10,19]],[[7386,5204],[-11,-21],[-11,-19],[-10,-19]],[[7354,5145],[-11,-21]],[[7343,5124],[-46,34]],[[7297,5158],[-9,6],[-5,5],[-4,4],[-1,2]],[[7278,5175],[-3,4]],[[7275,5179],[-1,3],[-2,2],[-1,2],[-2,2],[-3,3],[-6,5],[-8,6],[-5,1],[7,14],[11,20]],[[7389,5090],[-11,-19]],[[7378,5071],[-8,6],[-38,28],[-10,-20],[-46,34]],[[7276,5119],[11,19],[10,20]],[[7343,5124],[37,-28],[9,-6]],[[7276,5119],[-11,-20]],[[7265,5099],[-37,28],[-3,2],[-1,0],[-1,0],[4,7],[14,12],[17,12],[15,10],[0,3],[5,2]],[[7378,5071],[-10,-20],[-11,-19],[-9,-17],[-9,-18]],[[7339,4997],[-9,6],[-29,22],[-8,6]],[[7293,5031],[-9,6],[-29,21],[-8,6]],[[7247,5064],[9,18],[9,17]],[[7274,4996],[-43,31]],[[7231,5027],[5,9],[5,9],[-3,2],[9,17]],[[7293,5031],[-10,-18],[-4,-8],[-5,-9]],[[7344,4944],[-57,42],[-13,10]],[[7339,4997],[-10,-17],[9,-7],[15,-12]],[[7353,4961],[-4,-8],[-5,-9]],[[7344,4944],[-6,-10],[-5,-11]],[[7243,4963],[8,8],[7,7],[9,9],[7,9]],[[6352,1008],[-1,-19]],[[6351,989],[-19,0],[1,46],[-2,5],[-24,-16],[-20,-13],[-18,-14],[6,-9],[-1,-23],[-7,-1],[-1,-26]],[[6211,879],[-2,78]],[[6209,957],[2,8]],[[6211,965],[5,3],[15,11],[22,15],[19,14],[18,15],[22,15],[16,11],[19,18],[28,30],[30,23]],[[6405,1120],[0,-13]],[[6405,1107],[-5,-2],[-15,-23]],[[6385,1082],[-4,-4],[-29,-22],[0,-11],[0,-25],[0,-12]],[[6211,966],[4,23]],[[6215,989],[4,3],[2,-1],[1,-2],[1,-4],[0,-3],[-1,-3],[-2,-3],[-2,-3],[-3,-4],[-4,-3]],[[6351,989],[2,-77]],[[6353,912],[-20,0],[-1,41],[-16,0],[-2,-1],[-1,-1],[-1,-3],[0,-9]],[[6353,912],[0,-77]],[[6180,4293],[-2,1],[-1,1],[-41,19]],[[6101,4396],[7,-28],[18,7]],[[6176,4336],[7,17],[1,3],[-1,12],[18,-3],[3,0]],[[6204,4365],[-1,-8],[-3,-9],[-15,-42],[-5,-13]],[[6024,4170],[-8,-3]],[[6016,4167],[-36,-4],[-35,16],[-12,-3],[-7,4],[-2,1]],[[5924,4181],[3,8]],[[5927,4189],[8,23]],[[5935,4212],[3,-1],[17,-8],[17,-8],[1,1],[1,1],[4,9],[4,5],[5,6],[9,5],[12,5],[9,3],[8,-14]],[[6025,4216],[-5,-5],[-4,-6],[-4,-9],[-5,-16],[0,-2],[1,0],[16,-8]],[[7110,4547],[-9,4],[-47,22]],[[7054,4573],[5,12],[4,12]],[[7118,4571],[-5,-13],[-3,-11]],[[7103,4528],[-55,26]],[[7048,4554],[3,10],[3,9]],[[7110,4547],[-4,-10],[-3,-9]],[[7091,4486],[-18,8],[-40,20]],[[7033,4514],[4,11],[4,10],[4,10],[3,9]],[[7103,4528],[-3,-10],[-3,-10],[-3,-11],[-3,-11]],[[7020,4476],[4,11],[3,9],[3,9],[3,9]],[[7091,4486],[-7,-18],[-7,-19]],[[6971,4543],[62,-29]],[[6985,4584],[63,-30]],[[6992,4603],[62,-30]],[[7000,4627],[63,-30]],[[7007,4647],[63,-30]],[[7014,4666],[9,-5],[38,-17],[8,-4],[7,-4]],[[7027,4705],[9,-5],[38,-17],[12,-6]],[[7017,4710],[3,8],[4,9],[5,9],[5,8],[4,8]],[[7038,4752],[23,-16],[3,-1],[2,-2],[3,0],[8,-2],[2,-1],[10,-7],[15,-12]],[[7038,4752],[5,9],[4,8],[4,8],[4,7],[39,-28],[2,-1],[7,-5],[15,-12]],[[7038,4752],[-42,31]],[[6996,4783],[4,9],[5,8],[4,7],[4,9],[1,0],[2,3],[0,2],[1,3],[4,4],[6,6],[2,3],[3,3]],[[7032,4840],[2,-2],[3,-2],[75,-55],[5,-6],[15,-11]],[[6969,4732],[5,10],[4,8],[4,8],[5,9],[4,8],[5,8]],[[6952,4806],[44,-23]],[[6965,4841],[4,8],[3,9],[8,15],[2,4]],[[6728,821],[50,-10]],[[6778,811],[25,-6],[50,-12],[41,-9],[99,-23],[15,0],[7,2],[13,3],[7,3],[4,3],[1,2]],[[7040,774],[13,-10]],[[5536,4131],[-20,6],[-20,21],[-2,14]],[[5494,4172],[14,17]],[[5508,4189],[46,-47]],[[5536,4131],[-40,-24]],[[5496,4107],[-2,1],[-15,12],[-8,9],[14,9],[-3,17]],[[5482,4155],[12,17]],[[5382,4039],[-2,-1]],[[5380,4038],[-7,7],[-3,5],[-11,12]],[[5359,4062],[3,2],[4,-1],[8,-7],[3,-1],[9,6],[18,11]],[[5404,4072],[14,8],[15,12],[14,18]],[[5447,4110],[35,45]],[[5496,4107],[-2,-1],[-12,-7],[-13,-8],[-87,-52]],[[5585,3901],[8,8]],[[5593,3909],[20,-21],[40,-41],[16,-17]],[[5669,3830],[-15,-19]],[[5654,3811],[-77,81]],[[5577,3892],[8,9]],[[5593,3909],[9,7],[27,21]],[[5629,3937],[39,-40],[1,-3],[9,-47],[-1,-4],[-2,-5],[-6,-8]],[[5668,3680],[-3,3],[-43,45],[-23,24],[-20,20],[-53,54]],[[5526,3826],[4,3],[11,13],[13,17],[1,4]],[[5555,3863],[15,20],[7,9]],[[5654,3811],[-23,-30],[54,-58]],[[5685,3723],[7,-7],[1,-2],[-25,-34]],[[5654,3811],[54,-56]],[[5708,3755],[-23,-32]],[[5692,3654],[-24,26]],[[5708,3755],[56,-58]],[[5764,3697],[-13,-18],[-1,-2],[-3,-3],[-7,-8],[-48,-12]],[[5724,3527],[-15,16],[-3,5],[-26,26],[-12,-16],[-13,-16],[-13,-19],[-13,-18]],[[5629,3505],[-15,15]],[[5614,3520],[-13,14]],[[5601,3534],[89,117],[2,3]],[[5692,3654],[64,-66],[7,-7],[2,-3]],[[5765,3578],[-2,-2],[-14,-18],[-3,-1],[-10,-15],[-12,-15]],[[5689,3476],[-14,-18]],[[5675,3458],[-4,2],[-14,15]],[[5657,3475],[-28,30]],[[5724,3527],[0,-3],[-35,-48]],[[5756,3465],[-8,8],[-20,22],[-6,-19],[-13,-17],[-3,-1],[-17,18]],[[5765,3578],[12,-12],[7,-7],[25,-26]],[[5809,3533],[-2,-3],[-16,-20],[-11,-15],[-11,-15],[-13,-15]],[[5812,3408],[-11,-15],[-15,-18],[-14,-18]],[[5772,3357],[-14,15],[-15,15],[-33,35]],[[5710,3422],[-35,36]],[[5756,3465],[7,-7],[5,-5],[14,-14],[16,-15],[14,-16]],[[5866,3352],[-17,18],[-16,16],[-3,3],[-2,3],[-16,16]],[[5809,3533],[40,-42]],[[5849,3491],[33,-34],[15,-16],[11,-10],[10,-7],[2,-2]],[[5920,3422],[-2,-2],[-18,-23]],[[5900,3397],[-11,-14],[-12,-15],[-11,-16]],[[6611,4413],[-2,1],[-1,0],[-3,1],[-3,0],[0,1],[-1,2],[0,1],[0,2],[2,2],[2,3],[-52,26],[4,13],[4,9],[3,10],[4,9]],[[6609,4409],[-3,0],[-3,1],[-5,2],[-35,10],[-39,11],[-45,10]],[[6479,4443],[1,4],[3,10],[9,25],[4,12],[4,10],[3,10],[3,9]],[[6478,4648],[-3,-9],[-4,-9],[-7,-22],[-6,-17]],[[6458,4591],[-7,-18],[-6,-20],[61,-30]],[[6479,4443],[-40,7],[-29,7],[-3,1],[-63,22],[-34,12],[-9,3]],[[6458,4591],[61,-30]],[[7555,912],[-65,18]],[[5962,3478],[-36,37],[-33,33]],[[5893,3548],[13,17],[12,17],[20,23]],[[5938,3605],[31,-33],[-18,-24],[36,-37]],[[5938,3605],[16,21],[2,2],[14,17],[10,12]],[[5980,3657],[67,-69]],[[6047,3588],[-10,-12],[-14,-18]],[[5980,3657],[9,12]],[[5989,3669],[7,9],[14,17]],[[6114,3594],[-8,0],[-12,-17],[-15,-22],[-6,5],[-26,28]],[[5894,3747],[43,-46],[9,12],[43,-44]],[[5938,3605],[-42,43]],[[5896,3648],[-20,22],[-1,1],[-2,0],[-1,1],[-5,6]],[[5867,3678],[12,13],[2,5],[2,2],[3,2],[-16,17],[14,17],[10,13]],[[5865,3512],[-40,41],[14,19]],[[5839,3572],[14,18],[12,17],[13,17],[18,24]],[[5893,3548],[-15,-18],[-13,-18]],[[5839,3572],[-22,23],[14,18],[-3,2],[-5,6],[-14,15],[6,8],[7,9],[7,9]],[[5829,3662],[5,7],[18,24],[15,-15]],[[5764,3697],[14,18]],[[5778,3715],[49,-50],[2,-3]],[[5865,3512],[-12,-16],[-4,-5]],[[5962,3478],[-15,-19],[-14,-19],[-13,-18]],[[6222,3365],[-1,2],[-1,1],[-1,2],[-2,2],[-1,1],[-1,2],[-2,1],[-2,2],[-2,1],[0,1],[-3,2],[-1,1],[-1,0],[-2,1],[-1,1],[-2,1],[-2,1],[-2,0],[-5,4],[0,1],[-2,1],[-1,1],[-1,1],[-2,1],[-1,1],[-2,3],[-1,2],[-2,3],[-3,3],[-4,4],[-5,7],[-35,37],[-22,21],[-3,4],[-32,28]],[[6122,3588],[14,-12],[12,-9],[14,-7],[15,-8]],[[6177,3552],[34,-19],[13,-6],[16,-9],[19,-10],[3,-1],[2,-2],[4,-1]],[[6268,3504],[-3,-6],[-3,-10],[-8,-22],[-6,-18],[-12,-31],[0,-1],[-2,-4],[-1,-4],[-1,-1],[-1,-3],[-1,-3],[0,-1],[-2,-7],[-1,-2],[-1,-3],[-1,-6],[0,-1],[-1,-4],[0,-3],[-1,-5],[-1,-4]],[[6323,3388],[-4,-40],[-11,-24],[-22,-4],[-6,-11],[-1,-49],[5,-6]],[[6284,3254],[1,-6],[-1,-6],[1,-6],[2,-8],[-25,-25],[26,-26],[49,-54],[46,-49]],[[5977,2710],[-9,13],[-10,9],[-14,15],[-89,100],[-52,48],[-3,2],[3,2],[4,2],[5,3],[2,1],[5,3],[7,4],[3,2],[5,3],[20,10],[8,5],[3,2],[7,4],[3,2],[3,2],[1,1],[5,4],[1,1],[2,1],[7,6],[20,24],[8,11],[11,16],[8,10],[7,8],[13,17],[4,6],[8,9],[2,3],[11,14],[8,12],[21,26],[11,12],[10,10],[6,8],[2,2],[1,1],[0,2],[1,2],[0,3]],[[6046,3151],[15,20],[1,1],[11,14],[2,3],[34,44],[14,19],[12,15],[4,7],[4,6],[4,5],[1,1],[4,5],[5,6],[3,5],[4,5],[2,3],[2,1],[0,1],[3,4],[4,3],[4,3],[3,2],[2,1],[4,2],[2,1],[5,1],[4,1],[6,0],[1,0],[2,3],[2,3],[2,4],[1,0],[1,3],[2,3],[2,6],[2,4],[1,3],[1,4],[0,2]],[[6512,3265],[-25,-6],[-45,-11],[-14,-4],[-54,-13]],[[6374,3231],[-6,-2],[-19,-4],[-19,-6],[-10,-2],[-10,10],[-17,17],[-9,10]],[[6374,3231],[3,-3],[4,-3],[5,-6],[13,-15],[9,-9],[9,-8],[29,-30]],[[6607,3102],[-19,14],[-25,-46],[19,-14],[20,-16]],[[6636,3157],[-2,-4],[-27,-51]],[[6627,3087],[-25,-47]],[[6607,3102],[20,-15]],[[6657,3142],[-30,-55]],[[6296,2451],[13,25]],[[6334,2524],[13,24]],[[6347,2548],[0,1],[0,1],[0,1],[4,7],[4,7],[2,1],[1,-1],[1,-1],[-1,-2],[-3,-6],[7,2],[3,6],[-6,7],[4,10]],[[6192,2521],[6,-4],[52,-35],[16,-10],[4,-3],[26,-18]],[[6155,2125],[-67,43]],[[6195,2210],[-16,-36],[-8,-15],[-9,-17],[-7,-17]],[[6215,2087],[-60,38]],[[6179,2009],[-60,38]],[[6119,2047],[8,18],[8,18],[9,18],[11,24]],[[6119,2047],[-45,29],[-15,8]],[[6076,1955],[-59,38]],[[6119,2047],[-8,-18],[-9,-19],[-8,-18],[-9,-18],[-9,-19]],[[6117,1876],[-59,38]],[[6058,1914],[9,20],[9,21]],[[6171,1991],[-10,-20],[-8,-17],[-8,-18],[-9,-20],[-9,-19],[-10,-21]],[[6058,1914],[-9,-18],[-8,-18],[-60,38]],[[6108,1858],[-8,-19],[-9,-20],[-10,-22],[39,-26],[2,-3]],[[6122,1768],[-10,-14],[-14,-21],[-19,-21],[-18,-17],[-20,-14],[-17,-8],[-1,-1]],[[6117,1876],[-9,-18]],[[6170,1839],[-48,-71]],[[6108,1858],[43,-25],[11,15],[1,-3],[7,-6]],[[6230,1931],[-2,-3],[-1,-2],[-57,-87]],[[6301,1836],[-26,18],[-32,19],[-12,-8],[-14,-6],[-31,-14],[4,-4],[26,-17],[14,-9],[13,-9],[43,-28],[13,-8],[6,-3],[8,17],[8,16],[4,9],[1,1]],[[6326,1810],[27,-18],[9,-5],[-6,-9]],[[6356,1778],[-17,-30],[-5,-10],[-159,101],[-3,-10],[-9,-16]],[[6331,1865],[-1,-3],[-3,-6],[-3,-2],[-5,-3],[-4,0],[-14,-15]],[[6301,1836],[-4,-5],[-2,-2],[31,-19]],[[6367,1771],[-11,7]],[[6886,3478],[-19,13]],[[6867,3491],[20,33],[26,47]],[[6867,3491],[-18,-32]],[[6849,3459],[-19,14]],[[6830,3473],[65,117]],[[6720,3393],[56,101],[8,17]],[[6784,3511],[63,116]],[[6830,3473],[-10,-20],[-51,-96]],[[6849,3459],[-11,-19]],[[6886,3478],[-28,-53]],[[6858,3425],[-20,15]],[[6858,3425],[-16,-33]],[[6975,953],[-17,7],[-18,6]],[[6940,966],[-5,3],[-7,1],[-4,-3],[-4,-5],[-14,-49],[-13,-22]],[[6893,891],[-10,9],[-13,9],[-11,9],[-8,7]],[[6851,925],[-4,3],[-18,15]],[[6984,983],[-1,-4],[-8,-26]],[[6959,897],[-7,-21]],[[6952,876],[-15,12],[-16,13],[19,65]],[[6975,953],[-16,-56]],[[6952,876],[-13,-22]],[[6939,854],[-10,8],[-10,8]],[[6919,870],[-8,7],[-18,14]],[[5935,4212],[2,8],[2,4],[3,4],[4,7],[4,6],[2,3],[4,4],[6,6],[13,10]],[[5975,4264],[30,11],[19,4],[10,1],[12,1]],[[6046,4281],[0,-3],[0,-10],[3,-10],[6,-15]],[[6055,4243],[-16,-13],[-14,-14]],[[6124,4232],[-13,-36]],[[6111,4196],[-3,1],[-9,5],[-7,4],[-6,3],[-8,6],[-5,4],[-8,9],[-5,6],[-5,9]],[[6046,4281],[14,0],[4,0],[9,-1],[14,-3]],[[6087,4277],[12,-4],[13,-6],[7,-3],[3,-1],[2,-2],[2,-2],[1,-3],[1,-3],[1,-2],[-1,-5],[-4,-14]],[[6146,4200],[-1,-4],[-3,-9],[-5,-14],[-8,-21]],[[6129,4152],[-3,1],[-26,14]],[[6100,4167],[11,29]],[[6124,4232],[18,-8]],[[6142,4224],[1,-4],[7,3],[5,17],[4,2],[-15,-41],[2,-1]],[[6094,4060],[0,1],[11,29],[2,4]],[[6107,4094],[22,58]],[[6146,4200],[11,-6],[11,-5]],[[6168,4189],[22,-10]],[[6190,4179],[-1,-4],[-2,-6],[-9,-24],[-10,-31],[-8,-22],[-8,-27],[0,-40]],[[6107,4094],[-3,2],[-39,18]],[[6065,4114],[4,8],[3,5],[3,6],[7,8]],[[6082,4141],[15,20],[3,6]],[[6065,4114],[-2,1],[-47,52]],[[6024,4170],[36,-17],[16,-8],[3,-2],[3,-2]],[[6094,4060],[-2,1],[-8,3],[-117,55],[-37,18],[-17,8]],[[5913,4145],[6,23],[4,9],[1,4]],[[6083,4031],[-7,-19],[-14,-33],[0,-1],[-7,-18],[-7,-17]],[[6048,3943],[-4,1],[-42,44]],[[6002,3988],[11,15]],[[6013,4003],[11,15],[18,-18],[15,44],[5,16],[-2,2],[-79,37],[-35,16],[-1,0],[-1,-2],[-5,-14]],[[5939,4099],[-18,8]],[[5921,4107],[-17,9]],[[6013,4003],[-47,49],[-1,2],[0,2],[10,26],[-18,9],[-18,8]],[[6002,3988],[-12,-15]],[[5990,3973],[-57,60]],[[5933,4033],[-15,15],[-5,6],[-10,9],[5,6],[13,38]],[[5932,3902],[-15,16],[-6,7],[-8,7]],[[5903,3932],[19,25],[-14,15],[-13,14]],[[5895,3986],[7,7],[4,5],[2,2],[12,15],[13,18]],[[5990,3973],[-14,-16],[-14,-15],[-11,-14],[-19,-26]],[[6009,3893],[-14,-18],[-3,-5],[-13,-17]],[[5979,3853],[-3,3],[-30,32],[-14,14]],[[5979,3853],[-42,-54],[-12,-16]],[[5855,3887],[14,18],[15,-15],[15,-17],[9,13],[5,4],[4,2],[5,2],[5,2],[5,6]],[[5967,3739],[-23,24],[-9,9],[-10,11]],[[5820,3769],[15,20]],[[5835,3789],[13,16]],[[5835,3789],[-54,58]],[[5781,3847],[13,16]],[[5765,3827],[16,20]],[[5669,3830],[54,-56]],[[5629,3937],[10,9]],[[5639,3946],[8,6]],[[5647,3952],[63,-66]],[[5710,3886],[55,-59]],[[5710,3886],[15,19],[56,-58]],[[5647,3952],[20,18],[15,12]],[[5682,3982],[56,-60]],[[5817,4023],[-14,-18],[-13,-18]],[[5817,4023],[56,-59],[23,-24],[7,-8]],[[5835,4046],[29,-30],[28,-29],[3,-1]],[[8740,6667],[-4,3]],[[8675,6785],[15,-11]],[[8690,6774],[24,-16],[-2,-3],[-10,-19],[18,-14],[21,-15],[4,-5],[3,-7],[0,-4],[0,-5],[0,-4],[-2,-6],[-6,-9]],[[8696,6785],[-6,-11]],[[8700,6813],[-8,-16],[-4,-8],[8,-4]],[[8737,6756],[-41,29]],[[8757,6795],[-9,-17],[-7,-15],[-4,-7]],[[5826,3300],[-17,18],[-15,16]],[[5794,3334],[-2,2],[-20,21]],[[5866,3352],[-1,-3],[-1,-3],[-33,-43],[-2,-2],[-3,-1]],[[5873,3251],[-32,34],[-15,15]],[[5900,3397],[16,-16],[15,-16],[16,-16]],[[5947,3349],[-12,-15]],[[5935,3334],[-11,-15],[-13,-15],[-24,-34],[-14,-19]],[[5842,3210],[-16,16],[-9,-3],[-6,-2],[-8,1],[-8,2],[2,-6],[2,-15],[-1,-7],[-1,-8],[-8,-10],[-15,-19]],[[5757,3177],[17,21],[1,4],[1,4],[-1,4],[-12,11],[-14,16],[15,19],[-16,18]],[[5748,3274],[36,47],[8,9],[2,4]],[[5935,3334],[43,-45],[-12,-17],[-1,-2],[-10,-12],[-11,-16]],[[5947,3349],[30,38],[2,3]],[[5979,3390],[3,0],[1,3],[4,4],[3,1],[5,3],[3,6],[4,5],[17,22]],[[6046,3151],[-4,-5],[-2,-3],[-2,2]],[[5977,3464],[-23,-31],[5,-3],[8,-5],[-11,-23],[23,-12]],[[7623,2573],[4,6],[2,3],[7,10],[12,16],[5,8]],[[7653,2616],[19,26]],[[7672,2642],[5,8],[3,4],[2,3],[6,9]],[[7672,2642],[-20,15],[-18,14],[16,23]],[[7682,2740],[-64,46]],[[7618,2786],[15,22]],[[7661,2825],[2,-1],[52,-37]],[[7715,2787],[-18,-26]],[[7650,2694],[-64,46]],[[7586,2740],[10,14],[6,9],[8,10],[8,13]],[[7653,2616],[-39,27],[-45,35],[-16,12]],[[7553,2690],[17,27],[16,23]],[[7524,2739],[11,6],[11,9],[12,9],[10,9],[13,6],[16,5],[7,3],[7,6],[9,7],[13,9]],[[7553,2690],[-10,-11],[-14,-23]],[[6694,3114],[-30,-55],[19,-14]],[[6683,3045],[-16,-29],[-15,-14]],[[6712,3101],[-29,-56]],[[6770,3058],[-30,-56]],[[6740,3002],[-20,16],[-19,14],[-18,13]],[[6740,3002],[-18,-34],[-9,-11]],[[6772,2913],[-11,-22]],[[6791,3043],[17,-14]],[[6808,3029],[-29,-55]],[[6779,2974],[-26,-47],[19,-14]],[[6797,2960],[-25,-47]],[[6779,2974],[18,-14]],[[6807,2887],[-1,4],[-2,2],[-2,-2],[-30,22]],[[6797,2960],[29,-21],[5,-3]],[[8040,2949],[13,17],[8,11],[15,20]],[[8076,2997],[11,-9],[35,-28]],[[7006,800],[-13,11],[-8,7]],[[6985,818],[-7,5],[-8,7],[-8,6],[-8,6]],[[6954,842],[-8,7],[-7,5]],[[6959,897],[53,-42],[16,-13]],[[7028,842],[10,-8]],[[7038,834],[-15,-15],[-17,-19]],[[6915,794],[-18,4],[-18,5]],[[6879,803],[20,51],[7,-6],[12,20],[1,2]],[[6954,842],[-1,-2],[-9,-24],[-15,13],[-14,-35]],[[6985,818],[-1,-2],[-14,-35],[-18,4],[-18,5],[-19,4]],[[6839,901],[-11,-24],[-20,13],[-6,-20],[17,-11],[-3,-6],[-3,-12],[-16,9],[-7,-27],[17,-4],[18,-4]],[[6825,815],[18,-3],[18,-5]],[[6861,807],[18,-4]],[[7006,800],[9,-6],[9,-8],[16,-12]],[[6778,811],[27,95],[-15,-9]],[[6790,897],[-34,2]],[[6756,899],[42,25],[16,9],[12,8],[3,2]],[[6851,925],[-1,-2],[-11,-22]],[[6861,807],[7,26],[15,32],[-14,12],[-15,12]],[[6854,889],[-15,12]],[[6825,815],[10,35],[19,39]],[[6728,821],[0,1],[14,46],[19,-8],[4,14],[23,11],[2,12]],[[6650,838],[14,8],[10,7],[35,21],[11,6],[11,7],[2,2]],[[6733,889],[4,3],[6,3],[3,2]],[[6746,897],[1,-3],[9,5]],[[6746,897],[-3,5],[2,0],[13,10],[23,80],[4,14]],[[6733,889],[-11,4],[-2,-1],[-7,3],[-21,8],[-22,8]],[[6670,911],[24,83],[-4,1],[6,22]],[[6696,1017],[6,22]],[[6702,1039],[24,-10]],[[6726,1029],[-12,-43],[22,-8],[21,-8],[12,44],[3,12]],[[6726,1029],[-5,7],[3,17],[-1,5],[-5,10],[-28,43],[12,20]],[[6702,1039],[2,8],[-1,8],[-3,6],[-5,5],[-77,30],[-6,-24],[-6,-24]],[[6606,1048],[-4,-14],[-2,-8],[-22,-81]],[[6578,945],[-51,19],[-3,1]],[[6524,965],[-3,7],[-3,9],[-1,4],[-1,3],[0,3],[-1,3],[0,4],[0,5],[-1,5],[1,4],[0,4],[0,8],[1,5],[0,8],[1,5],[1,12]],[[6518,1054],[0,6],[1,21],[2,25],[2,16],[0,7],[1,13],[1,10],[0,3],[0,5],[0,3],[0,5],[0,7],[-1,5],[0,6],[-1,8],[0,5],[-1,5]],[[6522,1204],[0,1],[1,7],[-1,2]],[[6522,1214],[2,2],[3,0],[19,18],[41,35],[9,7],[3,1],[2,2],[5,3]],[[6696,1017],[-90,31]],[[6670,911],[-21,7],[-31,12],[-1,2],[-4,0],[-3,2],[-32,11]],[[6533,876],[1,6],[2,7],[1,7],[1,7],[0,4],[0,9],[-1,5],[0,5],[-2,7],[-2,6],[-1,4],[-3,8],[-5,14]],[[6531,876],[-20,5],[-26,5],[-25,6],[6,26],[-26,9],[-4,7],[-4,56],[2,9]],[[6434,999],[50,-19],[9,34],[5,16],[4,18],[3,11]],[[6505,1059],[10,-4],[3,-1]],[[6434,999],[-13,6],[6,38],[1,7],[4,9],[6,7],[16,17],[19,-11],[32,-13]],[[6403,864],[1,23],[0,8],[2,114],[-1,82],[0,16]],[[6405,1120],[7,6],[52,37],[20,13],[11,10],[19,18],[4,4],[1,2],[2,2]],[[6521,1212],[0,-1],[1,-7]],[[6352,1008],[21,1],[3,-1],[3,-1],[7,0],[5,1],[2,1],[0,3],[-1,3],[-2,4],[0,9],[0,6],[2,7],[1,1],[0,25],[-5,11],[-3,4]],[[8760,6653],[-2,1],[-18,13]],[[8737,6756],[31,-22],[-4,-18],[12,-3],[5,-18],[0,-16],[11,-4],[-4,-12]],[[8615,6424],[4,1],[24,77],[-6,3],[-7,3],[-9,38],[2,12]],[[8537,6472],[3,5],[12,27],[8,18],[1,2],[1,3],[8,24],[7,23]],[[8417,6569],[26,-21],[20,-15],[6,12],[2,9],[3,9],[3,6],[5,5],[-4,8],[-3,10],[7,3],[7,-2],[4,10],[2,7],[4,19],[14,-3]],[[8417,6569],[9,17],[9,23],[4,16],[5,21]],[[8444,6646],[6,34],[1,21]],[[8451,6701],[36,-3],[17,-3]],[[8341,6674],[31,-8],[3,21],[1,19],[4,4],[33,-1],[18,0],[-1,-27],[-4,-31],[18,-5]],[[8347,6737],[5,2],[19,1],[33,0],[30,-1]],[[8434,6739],[20,-1]],[[8454,6738],[0,-4],[-3,-33]],[[8384,6768],[50,-1],[0,-28]],[[8458,6764],[-4,-26]],[[8427,6853],[16,-12],[12,-8]],[[8455,6833],[6,-3],[12,-5]],[[8410,6866],[10,19],[10,19]],[[8430,6904],[41,-30],[-8,-20],[-8,-21]],[[8430,6904],[10,19],[-32,22],[8,16],[1,6]],[[8417,6967],[35,-25],[33,-24]],[[8485,6918],[21,-15]],[[8433,7005],[71,-52]],[[8504,6953],[-8,-15],[-9,-17],[-2,-3]],[[8514,6971],[-10,-18]],[[8442,7022],[72,-51]],[[8453,7042],[71,-51]],[[8468,7071],[71,-51]],[[8546,7034],[-7,-14]],[[8409,7114],[7,14]],[[8475,7085],[71,-51]],[[6924,2944],[18,-14]],[[6905,2958],[36,66]],[[6884,2974],[4,8],[5,8],[4,8],[4,8],[5,9],[4,7],[5,9],[5,9]],[[6905,2958],[-21,16]],[[6884,2974],[-24,17]],[[6847,2967],[13,24]],[[6797,2960],[30,56]],[[6808,3029],[19,-13]],[[6808,3029],[36,67]],[[2104,990],[-13,-3],[-18,-4],[-6,-3],[-6,-4],[-5,-4],[-16,-14]],[[2040,958],[-23,38],[-3,5],[-4,4],[-4,3],[-1,1]],[[2005,1009],[6,14],[-28,17],[-7,4],[-3,4],[-1,6],[-4,16],[3,2],[5,2],[7,4],[14,-19],[2,-1],[3,0],[1,2],[4,8],[6,8],[8,9],[9,8],[9,6],[4,2],[19,5],[4,-23],[8,2],[6,2],[4,1],[3,3],[6,5]],[[2093,1096],[13,-10],[-10,-24],[-1,4],[-3,-1],[-2,-2],[-1,-2],[0,-4],[2,-7],[8,-37],[5,-23]],[[4045,3461],[-16,-12],[-33,-25]],[[3982,3413],[-19,-15]],[[3963,3398],[-31,31],[-35,37],[-17,19],[-4,4],[-9,9],[-12,13],[-28,29],[-7,8],[-2,2],[-3,1],[-4,1],[-3,1],[-3,0],[-6,1],[-5,1],[-6,0],[-13,-6],[-7,-3],[-12,-2],[-5,-1],[-9,-1]],[[3742,3542],[0,6]],[[3742,3548],[16,1],[10,0],[14,7],[5,2],[5,1],[11,-1],[10,0],[5,-3],[7,-1],[8,5],[11,2],[11,1],[2,1],[6,0],[21,-5],[2,-1],[6,-4],[9,-5],[14,-7],[23,-5],[33,-6],[6,-1],[5,-1],[16,-2],[2,1],[17,0],[4,0],[14,2],[10,2],[28,5],[11,0],[26,16],[16,8],[20,0],[18,-2],[18,1],[46,7],[14,4],[7,1],[3,1],[6,4],[2,0],[3,1],[1,1],[11,5],[17,5]],[[4292,3588],[64,-59]],[[4356,3529],[-8,-5],[-9,-6],[-6,-7],[-10,-6],[-10,-4],[-2,-1],[-4,-1],[-3,-2],[-2,0],[-8,-3],[-10,0],[-11,1],[-22,-2],[-31,-2],[-18,-1],[-22,3],[-32,5],[-8,0],[-14,0],[-17,-3],[-24,-9],[-4,-2],[-19,-10]],[[7345,3904],[-13,-22]],[[7332,3882],[-19,15],[-18,13]],[[7295,3910],[-19,13],[-19,15],[-19,13]],[[7238,3951],[12,22]],[[7250,3973],[57,-42]],[[7307,3931],[38,-27]],[[6618,5223],[-22,-57]],[[6596,5166],[-4,2],[-43,21],[-4,2]],[[6545,5191],[11,30]],[[6556,5221],[52,149],[7,20],[1,3]],[[6616,5393],[10,-7],[8,-5],[38,-27],[3,-2]],[[6675,5352],[0,-2],[-1,-2],[-3,-6],[-28,-54]],[[6643,5288],[-10,-24],[-15,-41]],[[6732,5273],[-17,12],[-20,13],[-19,13],[-17,-34],[-16,11]],[[6675,5352],[36,-26],[17,-13]],[[6728,5313],[36,-25]],[[6764,5288],[-2,-4],[-3,-4],[-10,-21],[-17,14]],[[6732,5273],[-12,-22],[9,-17],[9,-17],[8,-8],[-9,-17]],[[6737,5192],[-11,9],[-13,23],[-16,-11]],[[6697,5213],[-9,16],[-20,15],[-17,13],[-17,-43],[-16,9]],[[6754,5179],[-17,13]],[[6764,5288],[33,-24]],[[6797,5264],[-2,-4],[-1,-6],[-40,-75]],[[7356,3926],[-11,-22]],[[7307,3931],[12,21]],[[7319,3952],[11,21]],[[7330,3973],[38,-26]],[[7368,3947],[-12,-21]],[[7273,4015],[57,-42]],[[7319,3952],[-58,42]],[[7261,3994],[12,21]],[[7250,3973],[-37,28],[11,21],[37,-28]],[[7238,3951],[-16,12],[-21,15],[-20,15]],[[7181,3993],[-61,47]],[[7120,4040],[31,59]],[[7151,4099],[80,-52],[5,-3],[37,-29]],[[7209,3897],[-36,28]],[[7173,3925],[11,22],[-20,15],[17,31]],[[7238,3951],[-15,-31],[-14,-23]],[[7339,3991],[-9,-18]],[[7151,4099],[8,15],[18,33],[5,15]],[[7182,4162],[8,-3],[37,-28],[26,-19],[19,-14],[4,-3]],[[7276,4095],[4,-2],[26,-19]],[[7306,4074],[-12,-22]],[[7294,4052],[-11,-20],[56,-41]],[[7294,4052],[57,-41]],[[7351,4011],[-12,-20]],[[7306,4074],[56,-41]],[[7362,4033],[-11,-22]],[[7412,4029],[-13,-24]],[[7399,4005],[-37,28]],[[7276,4095],[19,19],[2,2]],[[7297,4116],[4,-4],[1,-1],[16,-13]],[[7318,4098],[94,-69]],[[7318,4098],[7,12],[6,11]],[[7331,4121],[85,-62],[8,-6]],[[7424,4053],[-12,-24]],[[7435,4072],[-11,-19]],[[7331,4121],[5,9],[5,6],[5,4]],[[7346,4140],[89,-68]],[[7346,4140],[8,7],[9,8],[60,-47],[23,-17]],[[7446,4091],[-6,-10],[-5,-9]],[[7457,4112],[-6,-11],[-5,-10]],[[7297,4116],[26,23],[31,27],[13,8],[5,3],[15,5],[6,3],[22,0],[16,-1]],[[7431,4184],[12,-9],[4,-1],[5,-4],[3,-2],[1,-1],[8,-6],[12,-8],[3,-3]],[[7479,4150],[-5,-9],[-6,-9]],[[7468,4132],[-5,-10],[-6,-10]],[[7511,4041],[-65,50]],[[7457,4112],[66,-51]],[[7523,4061],[-6,-10],[-6,-10]],[[7468,4132],[35,-27],[12,-9],[17,-12],[2,-2]],[[7534,4082],[-5,-10],[-6,-11]],[[7479,4150],[6,-5],[40,-30],[8,-6],[11,-9]],[[7544,4100],[-5,-9],[-5,-9]],[[7654,4145],[-17,-31],[2,-2],[5,-4],[16,-12],[-9,-18],[-10,7],[-6,5],[-8,6]],[[7627,4096],[-15,11],[-35,27],[-11,9],[-10,-18],[-12,-21],[0,-4]],[[7431,4184],[4,1]],[[7435,4185],[12,-1],[16,0],[9,1],[6,1],[7,2],[5,1],[16,3],[16,5],[22,8],[16,9],[4,2],[19,14],[9,8],[2,3],[2,1]],[[7596,4242],[10,-7],[7,-5],[3,-3],[8,-6],[1,-2],[19,-15]],[[7644,4204],[-6,-12],[-5,-9],[-8,-15],[29,-23]],[[7604,4055],[-52,40],[-8,5]],[[7627,4096],[-10,-18]],[[7617,4078],[-6,-11],[-7,-12]],[[7604,4055],[25,-18],[3,-2]],[[7632,4035],[-5,-9],[-6,-10]],[[7621,4016],[-87,66]],[[7621,4016],[-5,-9],[-6,-11]],[[7610,3996],[-42,32],[-45,33]],[[7599,3976],[-18,13],[-25,18],[-45,34]],[[7610,3996],[-6,-10],[-4,-8],[-1,-2]],[[7594,3967],[-6,-10]],[[7588,3957],[-20,15],[-23,16],[-45,34]],[[7500,4022],[6,10],[5,9]],[[7599,3976],[-5,-9]],[[7578,3939],[-27,20],[-15,11],[-45,34]],[[7491,4004],[5,9],[4,9]],[[7588,3957],[-6,-12],[-4,-6]],[[7478,3981],[7,12],[6,11]],[[7578,3939],[-2,-5],[-7,-12]],[[7569,3922],[-10,5],[-8,2],[-8,4],[-19,14],[-46,34]],[[8191,3873],[8,29]],[[8199,3902],[1,5]],[[8200,3907],[34,-26],[14,-10]],[[8248,3871],[-6,-16]],[[8242,3855],[-6,-17],[39,-30],[26,-19],[14,-11],[28,-21]],[[8343,3757],[-8,-15],[-7,-12],[-3,-5],[-13,-25]],[[8360,3787],[-8,-15],[-9,-15]],[[8242,3855],[10,-8],[24,-18],[1,-1],[8,-6],[18,-13],[13,-10],[7,-5],[8,15],[-7,5],[-15,11]],[[8309,3825],[5,8],[21,-16],[8,13],[-45,34]],[[8298,3864],[8,15]],[[8306,3879],[45,-34]],[[8351,3845],[21,-16],[8,-6]],[[8380,3823],[-8,-15],[-12,-21]],[[8309,3825],[-16,12],[-7,6]],[[8286,3843],[7,14],[5,7]],[[8351,3845],[4,9],[4,7],[-7,5],[-37,29],[7,13]],[[8322,3908],[2,0],[43,-32],[9,15],[8,14]],[[8384,3905],[13,-10],[15,-12]],[[8322,3908],[7,12],[3,4],[8,15]],[[8340,3939],[16,-12]],[[8356,3927],[28,-22]],[[8356,3927],[7,13],[5,9],[11,19]],[[8379,3968],[12,22]],[[8391,3990],[29,-21],[-13,-22]],[[8407,3947],[-11,-20],[-7,-11],[-5,-11]],[[8407,3947],[18,-14],[11,-8]],[[8436,3925],[-11,-20],[-13,-22]],[[8442,3935],[-6,-10]],[[8391,3990],[12,22],[15,25]],[[8418,4037],[28,-21]],[[8446,4016],[19,-15],[9,-7]],[[8474,3994],[-13,-25],[-13,-23],[-6,-11]],[[8442,3935],[24,-18],[16,-13],[9,-7]],[[6717,5109],[-56,27]],[[6661,5136],[8,22],[6,20],[9,20],[13,15]],[[6754,5179],[-20,-37],[-16,-31],[-1,-2]],[[6754,5179],[21,-15],[32,-6],[6,-4]],[[6813,5154],[-36,-69],[-2,-3]],[[6775,5082],[-58,27]],[[6797,5264],[54,-39]],[[6897,5192],[54,-39],[17,-12]],[[6968,5141],[-2,-4],[-4,-9],[-10,-18],[-18,12],[-11,-21]],[[6972,5040],[-49,35]],[[6923,5075],[-10,7]],[[6968,5141],[31,-22]],[[6999,5119],[-1,-2],[-1,-3],[-1,-3],[10,-6],[-3,-6],[-10,-20],[-10,-19],[-11,-20]],[[6900,5033],[5,8],[6,13],[12,21]],[[6972,5040],[17,-13],[-19,-16],[-19,-17],[-11,10],[-9,7],[-13,9],[-18,13]],[[7103,5060],[-13,-9],[-3,-2],[-7,-5],[-5,-4],[-2,-2],[-4,-3],[-5,-4],[-6,-5],[-5,-5],[-6,-4],[-34,-32],[-13,-11],[-9,-8]],[[6824,4872],[-2,1],[-1,0],[-2,1],[-3,2]],[[6816,4876],[24,19],[9,5],[13,6],[13,5],[22,4],[9,2],[9,3],[12,6],[3,1],[-15,38],[-6,12],[-5,9],[-8,12],[-10,13]],[[6886,5011],[5,6],[6,11],[3,5]],[[6999,5119],[33,-24],[16,-11],[16,-12],[3,-1],[3,-1],[13,0],[4,-1],[5,-1],[3,-1],[3,-2],[3,-2],[1,-3],[1,0]],[[6886,5011],[-7,8],[-1,2],[-8,8],[-11,8],[-12,9],[-10,6],[-11,6],[-51,24]],[[6816,4876],[-5,2],[-2,3],[-5,2],[-4,1],[-17,8],[-13,5],[-20,10],[-31,14]],[[6719,4921],[8,22],[46,136],[2,3]],[[6824,4872],[-2,-2],[-2,-1],[-2,-2],[-4,-5],[-7,-7],[-2,-3],[-5,-7],[-3,-5],[-4,-7],[-5,-9],[-4,-6]],[[6784,4818],[-2,-6],[-8,-13],[-5,-10],[-3,-7]],[[6766,4782],[-1,1],[-2,1],[-4,2]],[[6759,4786],[9,16],[9,18],[-34,16],[-8,4],[-31,15],[-8,4]],[[6696,4859],[7,18]],[[6703,4877],[7,21],[4,11],[5,12]],[[6841,4792],[-9,5],[-36,16],[-7,4],[-5,1]],[[6828,4754],[-9,4],[-50,23],[-3,1]],[[6815,4716],[-52,24],[-2,1],[-10,5]],[[6751,4746],[-4,1]],[[6747,4747],[3,4],[7,15],[9,16]],[[6800,4673],[-57,28],[-3,1],[-7,3],[0,4]],[[6733,4709],[7,15],[11,22]],[[6793,4653],[-43,20],[-14,7],[-3,2],[-11,5],[11,22]],[[6683,4823],[9,-4],[31,-15],[8,-4],[14,-7],[14,-7]],[[6683,4823],[2,2],[5,15],[2,7],[4,12]],[[6641,4907],[62,-30]],[[3400,3543],[-4,3],[-54,21],[-23,24],[-5,5],[-3,2],[-3,5]],[[3308,3603],[7,1],[19,1],[7,0]],[[3341,3605],[8,0],[16,1],[9,0],[9,1],[2,0],[6,0],[13,-3]],[[3404,3604],[21,-7],[6,-3],[11,-6]],[[3442,3588],[3,-2],[20,-14],[63,-41]],[[3528,3531],[-12,-24],[-2,-5],[-44,16],[-70,25]],[[3341,3605],[-5,5],[-126,131],[4,4],[7,2],[13,3],[3,-1],[14,-15],[26,9],[127,-133],[0,-6]],[[7377,3964],[-9,-17]],[[7351,4011],[37,-28]],[[7388,3983],[-11,-19]],[[7399,3832],[-30,22],[-18,13],[-15,12],[-4,3]],[[7356,3926],[66,-51]],[[7422,3875],[-11,-21],[-12,-22]],[[7381,3799],[-12,-20],[-65,47]],[[7304,3826],[10,18],[2,4],[0,2],[16,32]],[[7399,3832],[-18,-33]],[[7381,3799],[22,-19],[4,-3],[2,-3],[8,-16]],[[7417,3758],[-7,-3],[-8,-3],[-7,-1],[-4,-1],[-7,-2],[-9,-3],[-23,-10],[-9,-4],[-6,-3]],[[7337,3728],[-7,-3],[-21,-9],[-5,-3],[-4,-2],[-3,-2],[-3,-2]],[[7294,3707],[0,2],[-1,2],[-1,1],[-36,27]],[[7256,3739],[12,22],[11,22],[2,2],[3,4],[8,13],[2,4],[10,20]],[[7256,3739],[-37,27]],[[7219,3766],[12,23],[11,22],[11,21],[2,3],[11,19]],[[7266,3854],[36,-26],[2,-2]],[[6677,5055],[-16,7],[-9,-22],[-5,2],[-1,0],[-3,0],[-5,3],[-33,16],[-2,1],[-2,2],[-4,2],[8,23]],[[6605,5089],[17,-8],[11,33],[1,3],[1,2],[1,0],[2,1],[1,-1],[1,0],[13,-6],[28,-13],[3,-3],[4,-6],[0,-4],[-1,-5],[-3,-6],[-7,-21]],[[6605,5089],[-33,16],[22,57],[2,4]],[[6596,5166],[65,-30]],[[6717,5109],[-1,-3],[-2,-2],[-19,-57],[-18,8]],[[7142,5009],[-6,-10],[-5,-10]],[[7131,4989],[-7,5],[-46,33],[-3,2],[-6,1],[-5,-5],[-9,-7],[59,-44],[6,-5]],[[7120,4969],[-9,-19]],[[7111,4950],[-10,-19],[-10,-16]],[[7091,4915],[-9,-18]],[[7103,5060],[1,-4],[1,-5],[-1,-7],[1,-4],[0,-2],[2,-2],[1,-1],[2,-2],[3,-1],[6,-3],[20,-16],[3,-4]],[[7131,4989],[-5,-10],[-6,-10]],[[7199,4885],[-32,24],[-56,41]],[[7131,4989],[57,-42],[32,-23]],[[7142,5009],[57,-41]],[[7199,4968],[32,-24]],[[7142,5009],[6,11],[5,9],[5,9],[5,10],[6,11],[5,9]],[[7174,5068],[57,-41]],[[7231,5027],[-5,-10],[-6,-11],[-5,-9],[-5,-10],[-5,-9],[-6,-10]],[[7174,5068],[5,10],[5,8],[5,2],[9,12],[40,-29],[9,-7]],[[7174,5068],[-24,19],[-2,4]],[[7148,5091],[1,0],[12,9],[4,3],[18,12],[15,10],[1,1],[2,1],[5,4],[20,14],[1,1],[24,16],[21,14],[3,3]],[[7103,5060],[11,8],[18,12],[4,3],[12,8]],[[6851,5225],[120,236],[4,8],[4,8]],[[6979,5477],[4,7],[4,8],[4,6],[4,9]],[[6851,5547],[60,-43],[4,8],[4,8]],[[6919,5520],[60,-43]],[[6728,5313],[114,216],[5,11],[4,7]],[[6919,5520],[4,8],[4,7]],[[6927,5535],[4,8],[5,8]],[[6936,5551],[51,-38],[8,-6]],[[6936,5551],[4,7],[4,8]],[[6944,5566],[4,7],[5,9]],[[6953,5582],[33,-24],[26,-19]],[[6953,5582],[5,9],[5,9],[4,9],[6,10],[2,3]],[[6953,5582],[-60,44]],[[6893,5626],[5,9],[5,9],[5,9],[5,10],[2,3]],[[6944,5566],[-60,43]],[[6884,5609],[4,8],[5,9]],[[6927,5535],[-59,44]],[[6868,5579],[4,7],[4,8],[8,15]],[[6860,5563],[4,8],[4,8]],[[6919,5520],[-59,43]],[[6851,5547],[5,9],[4,7]],[[6793,5590],[-9,-18]],[[6784,5572],[-38,26],[-9,6],[-10,-20],[-13,9]],[[6714,5593],[10,20],[11,21],[27,54],[8,16]],[[6770,5704],[7,-4],[6,-5],[-11,-23],[8,-6],[9,-6],[31,-21]],[[6820,5639],[-14,-26],[-5,-8],[-4,-7],[-2,-4],[-2,-4]],[[6784,5518],[-59,41],[-8,5],[-10,-19]],[[6707,5545],[-9,6],[-4,2]],[[6694,5553],[20,40]],[[6784,5572],[19,-13],[1,-2],[-1,-2],[-3,-7],[-6,-10],[-5,-10],[-5,-10]],[[6763,5479],[-65,48],[4,9],[5,9]],[[6784,5518],[-6,-10],[-6,-11],[-5,-9],[-4,-9]],[[6763,5479],[-9,-15],[-39,29],[-11,-19],[-5,-9],[-6,-12],[-3,-7],[-10,7],[-15,10],[10,19],[-13,8]],[[6662,5490],[9,18],[6,12],[17,33]],[[2967,2895],[-40,-34],[-3,-2],[-2,1],[-23,33],[-10,-8],[-4,-6],[-2,-3],[-5,4],[-5,3],[-26,14]],[[2847,2897],[-33,17],[-3,1],[-2,-4],[-6,-18],[-12,-29],[-3,-3],[-7,-7],[-17,-14],[-6,9],[-2,4],[-2,4],[-3,19]],[[2751,2876],[-1,5],[-9,15],[-21,36],[-12,19],[-8,13]],[[2700,2964],[17,14],[31,26]],[[2748,3004],[9,7],[7,5],[13,10],[3,3],[6,5],[16,13],[6,5],[2,3],[4,5],[3,3],[3,3],[3,2]],[[2823,3068],[6,5],[33,28]],[[2862,3101],[46,-78],[5,-10],[6,-27],[3,-9],[6,-14],[21,-35]],[[2949,2928],[18,-33]],[[2901,3123],[-20,-9]],[[2881,3114],[-19,-13]],[[2823,3068],[-40,64],[-4,28],[-10,12],[40,30]],[[2809,3202],[18,1],[29,20],[3,0]],[[2859,3223],[5,-11],[-25,-20],[11,-19],[22,-35],[2,-2],[3,0],[23,10],[1,-23]],[[2386,3567],[-23,7],[1,-3],[0,-3],[0,-2],[0,-3],[-1,-2],[0,-2],[0,-2],[-1,-2],[-1,-2],[-1,-1],[-1,-2],[-1,-1],[-2,-3],[-1,-2],[-8,9],[-16,24],[12,10],[5,6],[4,3],[2,-2],[3,2],[6,6],[1,0],[13,12],[1,1],[0,1],[6,4],[11,15],[-1,2],[0,1],[-1,2],[-1,4],[-1,4],[-2,9],[0,3],[-1,2],[-1,2],[-1,1],[-1,1],[-1,1],[-1,0],[-1,0],[-1,1],[-1,0],[-1,-1],[-2,0],[-1,-1],[-2,-1],[-2,-2],[-4,-3],[-3,-4],[-8,-7],[-15,-14],[-1,-1],[-6,-5],[-4,-3]],[[1693,3865],[4,2],[6,2],[11,0],[3,-2],[6,-4],[4,-6],[4,-4],[7,-5],[3,2],[7,6],[2,0],[5,-5],[1,-1],[5,-3],[6,-1],[3,2],[2,1],[2,7],[5,17],[3,8],[9,18],[6,8],[4,6],[10,9],[4,4],[11,5],[12,3],[10,1],[8,3],[10,1],[7,0],[3,-1],[10,-2],[17,-8],[11,-7],[26,-12],[11,-4],[6,0],[4,-1],[3,-1],[15,-1],[29,0],[44,-5],[8,-1],[30,-5],[10,0],[10,-2],[15,4],[15,-2],[3,-1],[7,-5],[4,-8],[4,-5],[6,-3],[7,-1],[7,2],[12,1],[6,2],[4,-1],[5,3],[18,8],[10,1],[13,1],[4,-1],[2,-1],[0,-5],[-2,-10],[-2,-4],[-8,-17],[2,-9],[0,-3],[1,-2],[11,-4],[17,-17],[17,-24],[21,-18],[40,-21],[10,-6],[9,-9],[7,-4],[5,-3],[0,-7],[5,-23],[-1,-3],[2,-3],[4,-5],[6,-9],[3,-10],[7,-20],[3,-4],[4,-4],[6,-1],[5,-6],[0,-1],[1,-5],[-1,-10],[-2,-9],[-2,-6],[-5,-7],[-11,-10],[-18,-17]],[[1274,3378],[2,27],[1,14],[-1,11],[1,8],[13,33],[6,10],[4,5],[7,4],[7,3],[8,4],[10,8],[4,14],[8,3],[21,-2],[5,3],[3,2],[2,0],[7,-7],[4,0],[13,3],[10,6],[12,10],[9,13],[9,12],[7,10],[12,11],[7,10],[3,13],[1,23]],[[1806,2151],[-14,-10],[-7,-4],[-17,-9]],[[1768,2128],[-12,-5],[-9,-3],[-10,-4],[-7,-6],[-10,-7],[-4,-3],[-22,-14],[-16,-11],[-12,-12]],[[1666,2063],[-10,-7],[-9,-4],[-17,-6],[-16,-6]],[[1614,2040],[-9,-3],[-8,-5],[-5,-3],[-34,-25],[-2,-2],[-5,-3],[-39,-29],[-16,-12],[-11,-9],[-15,-14],[-7,-4],[-5,-2],[-5,-1],[-9,2],[-11,1],[-11,2],[-15,3],[-13,1],[-18,-1],[-12,-1],[-1,8],[-2,4],[-7,13],[-1,1],[-1,1],[-1,0],[-2,0],[-4,-1],[-7,-1],[-2,-1],[-1,0],[-1,-1],[1,-13],[-1,0],[0,-1],[0,-1],[0,-2],[0,-2],[0,-2],[0,-2],[-16,-1],[-8,-1],[-11,-4],[-8,-2],[-10,-3],[-6,0],[-3,1],[-4,1],[-4,2],[-27,19],[-7,5],[-29,21],[-11,6],[-4,2],[-5,2],[-5,2],[-1,0],[-2,-1],[-2,0],[-2,-1],[-13,-8],[-25,-17],[-10,-6],[-3,-2],[-7,-4],[-27,-18],[-66,-43],[-59,-38],[-38,-24],[-55,-35],[-15,-9],[-19,-12],[-19,-11],[-7,-5],[-2,-6],[0,-5],[0,-5],[7,-18],[6,-18],[1,-6],[0,-5],[-1,-10],[-2,-4],[-10,-18],[-4,-7],[-3,-7],[-1,-5],[-2,-7],[-3,-16],[-2,-11]],[[790,1603],[-10,5]],[[780,1608],[5,4],[2,9],[0,11],[-1,5],[-4,5],[0,3],[4,7],[6,2],[11,14],[2,10],[0,9],[-2,5],[0,9],[-1,1],[-2,4],[-36,0],[-7,2],[-8,7],[4,8],[6,1],[0,9],[-3,9],[-7,5],[-7,3],[-5,8],[-8,9],[-7,12],[-5,3],[-5,2],[-25,0],[-3,2],[-9,9],[-7,-2],[-5,-3],[-7,2],[-7,11],[-8,17],[-7,16],[-1,11],[-3,7],[-4,2],[-3,-2],[-1,-2],[-1,-9],[-2,-6],[-6,-4],[-13,0],[-8,1],[-11,15],[-5,10],[-2,11],[0,10],[0,10],[2,7],[8,12],[1,0],[2,-5],[-6,-9],[-1,-5],[1,-3],[4,-1],[4,4],[3,0],[4,-2],[2,-6],[5,-2],[4,0],[9,9],[3,8],[12,12],[5,2],[4,-9],[7,-1],[7,2],[3,5],[6,-1],[2,2],[0,9],[3,8],[8,12],[5,7],[5,10],[4,9],[-1,10],[-1,7],[-3,7],[-3,6],[-5,6],[-6,0],[-3,1],[-5,3],[-5,2],[-10,-3],[-15,-8],[-9,-3],[-9,1],[-7,6],[0,4],[-2,7],[6,8],[5,9],[0,7],[-1,9],[-4,15],[-1,6],[4,9],[6,2],[6,1],[6,-1],[3,-4],[2,-9],[6,-5],[5,0],[8,1],[8,6],[10,10],[0,11],[1,10],[5,8],[5,12],[0,3],[-1,1],[0,5],[3,2],[3,0],[3,-6],[2,-1],[5,0],[2,4],[14,11],[11,0],[7,1],[3,1],[3,4],[-1,2],[-5,3],[-5,7],[-3,11],[-4,8],[0,5],[3,5],[6,2],[3,3],[3,7],[2,10],[-2,9],[-4,3],[-5,-6],[-6,-3],[-5,-2],[0,4],[1,1],[5,6],[3,18],[5,4],[1,9],[3,9],[5,3],[5,8],[10,12],[3,6],[3,12],[4,5],[5,4],[8,0],[6,5],[5,7],[9,8],[8,-1],[1,0],[3,1],[7,6],[9,17],[13,11],[2,-5],[6,-8],[6,-4],[7,1],[6,-7],[1,0],[5,4],[9,4],[1,2],[5,1],[12,15],[6,1],[12,0],[18,14],[10,0],[4,2],[9,0],[4,-4],[6,-1],[9,2],[5,5],[8,5],[8,2],[13,1],[1,-16],[7,-16],[2,-9],[2,-8],[2,-7],[8,-13],[2,-3],[4,-7],[8,-9],[8,-7],[5,-3],[4,-2],[18,-20],[-4,-11],[-4,-5],[-5,-7],[-3,-12],[9,-12],[4,-7],[6,-2],[7,3],[3,4],[6,-4],[2,-5],[0,-18],[-2,-8],[-7,-15],[-1,-4],[0,-1],[0,-8],[2,-13],[7,-14],[1,-4],[9,-15],[2,-24],[14,-30],[2,-7],[12,-23],[3,-10],[3,-1],[3,1],[2,0],[6,-11],[0,-6],[3,-4],[6,-3],[8,3],[8,-4],[7,-6],[13,-2],[7,1],[5,2],[7,-2],[10,-5],[4,-5],[1,-7],[5,-6],[12,-14],[5,-7],[5,-1],[3,-3],[1,-2],[2,-3],[10,0],[5,2],[6,4],[6,3],[7,1],[2,4],[3,2],[5,3],[6,24],[4,3],[6,-1],[16,0],[11,4],[4,3],[4,5],[2,2],[0,-3],[-3,-4],[-2,-2],[-1,-2],[1,-4],[2,-9],[4,-9],[9,-6],[13,-2],[27,1],[5,-12],[2,1],[8,0],[7,1],[6,-2],[10,5],[20,22],[7,10],[-3,12],[-1,12],[6,10],[7,5],[6,-3],[5,-7],[5,-5],[3,1],[6,1],[7,5],[9,12],[14,29],[3,5],[5,13],[11,20],[4,12],[4,6],[9,2],[11,3],[4,3],[-1,6],[-1,5],[1,3],[12,6],[3,-1],[6,4],[3,-2],[4,1],[2,-1],[2,-1],[5,4],[20,13],[2,0],[3,-3],[4,-4],[12,-4],[9,-1],[4,1],[5,8],[4,15],[2,8],[-1,17],[3,3],[7,0],[12,13],[7,3],[23,1],[8,3],[6,0],[3,-2],[4,-1],[6,4],[-2,5],[0,3],[11,10]],[[1787,2228],[-10,-8],[4,-16],[25,-53]],[[1955,2280],[-10,-6],[-6,-3],[-14,-10],[-11,22],[-6,-4],[-33,-21],[-1,-3],[0,-3],[11,-21],[3,-2]],[[1888,2229],[-15,-24],[-2,-2],[-19,41],[-2,1],[-13,-9],[-12,-7],[-2,0],[-6,11],[-3,11]],[[1814,2251],[4,6],[3,0],[3,-1],[1,-10],[4,-4],[5,-1],[4,7],[8,22],[2,3],[14,20],[0,6],[4,9],[4,4],[1,0],[5,-6],[17,16],[8,0],[8,-4],[5,-5],[7,-6],[2,2],[5,6],[1,10],[-1,3],[2,1],[2,2]],[[1932,2331],[0,-1],[23,-50]],[[1685,1876],[-5,9],[-9,19]],[[1671,1904],[86,54]],[[1757,1958],[21,-45],[-17,-12],[-33,-21],[-6,-8],[-12,11],[-4,10],[-11,-7],[-10,-10]],[[1808,1847],[-32,-20],[-19,-11],[-18,-12]],[[1739,1804],[-14,31],[-6,8],[-9,10],[-10,9],[-8,7],[-7,7]],[[1757,1958],[33,21]],[[1790,1979],[11,-24]],[[1801,1955],[-15,-9],[0,-3],[8,-17],[21,-47],[0,-2],[-2,-2],[-14,-9],[9,-19]],[[1892,1898],[-50,-31],[-34,-20]],[[1801,1955],[11,8],[5,3],[14,8],[2,0],[1,-1],[10,-22],[16,10],[22,-47],[10,-16]],[[1926,1919],[-34,-21]],[[1790,1979],[25,17],[2,1],[4,3],[5,3],[10,8]],[[1836,2011],[22,19],[26,29]],[[1884,2059],[12,-25],[-9,-7],[-8,-8],[37,-79],[10,-21]],[[7184,3585],[-31,26],[-4,10]],[[7149,3621],[14,27],[7,10],[-7,5]],[[7163,3663],[7,12],[12,24],[12,24],[13,22],[12,21]],[[7294,3707],[-14,-13],[-9,-8],[-11,-11],[-22,-18],[-17,-15],[-8,-8]],[[7213,3634],[-5,-4],[-3,-5],[-1,-3],[-7,-13]],[[7197,3609],[-10,-16],[-1,-4],[-2,-4]],[[7163,3663],[-56,42]],[[7107,3705],[6,11],[12,25],[13,24]],[[7138,3765],[11,22],[13,22]],[[7162,3809],[57,-43]],[[7041,3571],[73,17],[4,8],[31,25]],[[7184,3585],[-8,-15],[-3,-6],[-8,-15]],[[7041,3571],[3,15],[5,12],[15,26],[1,2]],[[7078,3651],[12,20],[12,23],[5,11]],[[7197,3609],[41,-30],[14,23],[1,1]],[[7253,3603],[4,-4],[1,-1],[3,-3]],[[7261,3595],[-8,-18],[-44,-84]],[[7213,3634],[34,-27],[1,-1],[5,-3]],[[7279,3582],[-18,13]],[[7337,3728],[1,-7],[1,-2],[1,-2],[3,-2],[39,-31],[23,-15]],[[7405,3669],[-15,-27],[-26,-16],[-24,-13],[-21,-10],[-18,-13],[-12,-16]],[[7467,3693],[-7,1],[-10,1],[-11,-4],[-4,-1],[-3,-2],[-6,-1],[-8,-2],[-6,-3],[-7,-13]],[[7417,3758],[11,3],[53,8],[19,2],[8,0]],[[7508,3771],[0,-7],[-13,-9],[1,-24],[5,-1],[11,-7],[-36,-26],[-9,-4]],[[7621,3366],[-86,59],[-6,-8],[-57,37],[-6,-12],[-79,53]],[[7467,3693],[3,-5],[27,-23],[4,-5],[21,-12],[16,28]],[[7538,3676],[34,8],[12,-13],[-3,-36],[17,-23],[23,-5],[29,-10],[-9,-13],[-2,-16],[50,-51],[-68,-151]],[[7508,3771],[35,5],[14,2]],[[7557,3778],[27,1]],[[7584,3779],[49,-8]],[[7633,3771],[4,0],[4,-1],[2,-1],[11,-3],[7,1],[23,11],[9,2]],[[7693,3780],[2,0],[2,0],[3,-1],[9,-6],[8,-5]],[[7717,3768],[-3,-8],[-1,-3],[-5,-9],[-2,-3],[-2,-2],[-8,-8],[-1,-1],[-2,-2],[-3,-2],[-3,-1],[-4,-1],[-9,1],[-53,3],[-33,-1],[-3,0],[-4,-1],[-3,-1],[-3,-2],[-4,-3],[-7,-7],[-3,-4],[-11,-18],[-12,-19]],[[7583,3811],[12,-9],[5,9],[39,-29],[-6,-11]],[[7584,3779],[2,7],[-13,9],[-3,1],[-12,9],[9,18]],[[7567,3823],[16,-12]],[[7583,3811],[20,41]],[[7603,3852],[14,-10],[39,-29]],[[7656,3813],[18,-12],[19,-21]],[[7603,3852],[13,22],[5,10]],[[7621,3884],[3,-2],[9,-7],[2,-2]],[[7635,3873],[10,-7],[20,-14],[9,-6]],[[7674,3846],[-6,-12],[-6,-11]],[[7662,3823],[-5,-9],[-1,-1]],[[8132,4257],[13,22]],[[8145,4279],[8,-6],[26,-20],[8,-6]],[[8187,4247],[-5,-8],[-8,-14]],[[8132,4257],[-11,9],[-36,27],[-9,7],[-7,6],[-2,2]],[[8067,4308],[-27,20],[-2,2],[-8,6]],[[8030,4336],[13,22],[9,16]],[[8052,4374],[10,16]],[[8062,4390],[8,-6],[27,-22],[2,-1],[8,-7],[56,-43]],[[8163,4311],[-9,-16],[-9,-16]],[[8118,4233],[-11,8],[-35,28],[-7,-11],[-6,-11]],[[8059,4247],[-9,7]],[[8050,4254],[-9,7]],[[8041,4261],[6,11],[6,11],[7,12],[7,13]],[[8093,4189],[-10,8],[6,11],[6,12],[-36,27]],[[8082,4170],[-10,8],[-28,21],[-8,6],[-9,7]],[[8027,4212],[11,20],[12,22]],[[8052,4120],[-9,7],[5,9],[5,9],[-45,34]],[[8008,4179],[5,10],[5,8],[9,15]],[[8035,4095],[-5,9],[-6,5],[-30,22],[-9,7]],[[7985,4138],[8,15],[5,9],[1,2],[4,7],[5,8]],[[7985,4138],[-10,7],[-28,21],[-9,7]],[[7938,4173],[13,24]],[[7951,4197],[11,18]],[[7962,4215],[7,-6],[39,-30]],[[7962,4215],[9,18],[9,15]],[[7980,4248],[10,-7],[1,-2],[22,-16],[5,-4],[9,-7]],[[2022,1996],[-6,1],[-32,-19],[-9,-7]],[[1975,1971],[-1,6],[-16,34],[-10,21],[-17,36],[-3,6],[-3,0],[-15,-20],[-9,19],[-1,5]],[[1900,2078],[18,23],[46,53]],[[1964,2154],[17,-20],[2,-2]],[[1983,2132],[13,-28],[11,-24],[-17,-14],[10,-23],[11,-24],[11,-23]],[[1900,2078],[-48,103],[-4,-3],[-13,-9],[-2,-1],[-12,-8],[-15,-9]],[[1787,2228],[5,4],[11,5],[5,6],[6,8]],[[1888,2229],[9,13],[11,-23],[-14,-19],[-1,-3],[31,-66],[33,34],[7,-11]],[[1900,2078],[-16,-19]],[[1836,2011],[-13,27]],[[1823,2038],[12,8],[7,7],[26,31],[2,2],[0,2],[0,3],[-3,7],[-6,11],[-25,-19],[-5,-4],[-2,-3],[-3,-4],[-13,12],[-4,4],[-3,3],[-8,14],[-2,2],[-18,-9]],[[1778,2105],[-10,23]],[[7785,4046],[-12,-22]],[[7773,4024],[-10,7],[-10,7],[-8,-15],[-1,-2],[-10,7],[-10,8]],[[7724,4036],[9,18],[12,22]],[[7745,4076],[30,-23],[10,-7]],[[7773,4024],[-8,-15],[-2,-3],[-8,-15],[-1,-2]],[[7754,3989],[-9,-16],[-10,-17]],[[7735,3956],[-39,29]],[[7696,3985],[10,17],[9,17],[9,17]],[[7713,3916],[-10,8],[-19,14],[-9,8]],[[7675,3946],[6,11],[6,11],[9,17]],[[7735,3956],[-10,-18],[-5,-10],[-7,-12]],[[7675,3946],[-3,2],[-8,7],[-9,6],[-1,1],[-9,7],[-9,8],[-9,7],[-17,12]],[[7632,4035],[24,-19],[11,-7],[27,-22],[2,-2]],[[7675,3946],[-14,-26]],[[7661,3920],[-3,1],[-2,0],[-8,6],[-9,7],[-9,7],[-19,13],[-17,13]],[[7661,3920],[-12,-22]],[[7649,3898],[-14,-25]],[[7621,3884],[-6,5],[-9,6],[-17,13],[-17,12],[-3,2]],[[7700,3892],[-12,-22]],[[7688,3870],[-10,7],[-1,1],[-18,13],[-9,7],[-1,0]],[[7713,3916],[-13,-24]],[[7617,4078],[14,-10],[9,-8],[-3,-6],[38,-29],[13,24],[5,11]],[[7693,4060],[10,-8],[9,-6],[9,-8],[3,-2]],[[7654,4145],[14,-11]],[[7668,4134],[36,-26],[10,-8]],[[7714,4100],[-4,-8],[-8,-15],[-4,-9],[-5,-8]],[[7714,4100],[8,15],[8,17],[2,6]],[[7732,4138],[23,-17],[8,-6],[2,-2]],[[7765,4113],[-7,-13],[-4,-9],[-9,-15]],[[7668,4134],[8,16],[5,10],[6,12]],[[7687,4172],[45,-34]],[[7687,4172],[9,19],[10,-7],[11,21],[-10,7],[7,13],[6,13]],[[7720,4238],[37,-28],[2,-1],[5,-2],[1,-1],[1,-1]],[[7766,4205],[-7,-15],[-6,-12],[-11,-22],[-10,-18]],[[7766,4205],[3,-2],[5,-4],[17,-12],[8,-6],[3,-2]],[[7802,4179],[-8,-14],[-8,-13]],[[7786,4152],[-11,-22],[-10,-17]],[[7810,4195],[-8,-16]],[[7766,4205],[9,16],[5,10],[5,10]],[[7785,4241],[7,12],[8,-7],[17,-13],[8,-6],[3,-2]],[[7828,4225],[-6,-11],[-12,-19]],[[7720,4238],[5,9],[5,8],[5,10],[6,10],[44,-34]],[[7840,4247],[-12,-22]],[[7720,4238],[-36,26],[-3,5],[-8,9],[-4,5],[-5,3],[-20,16]],[[7644,4302],[37,53],[1,1]],[[7682,4356],[8,-7],[8,-9],[19,-15],[86,-50]],[[7803,4275],[9,-7],[16,-13],[9,-7],[3,-1]],[[7687,4172],[-29,22],[-14,10]],[[7596,4242],[9,8],[6,8],[18,25],[13,17],[2,2]],[[7591,4344],[20,-15],[3,-1],[28,-21]],[[7642,4307],[-2,-3],[4,-2]],[[7596,4242],[-4,3],[-19,15],[-16,11],[-5,2]],[[7552,4273],[8,14],[6,11],[6,11],[6,11],[-67,52]],[[7511,4372],[6,12],[6,11]],[[7523,4395],[68,-51]],[[7591,4344],[6,10],[5,10],[6,12]],[[7608,4376],[33,-24],[22,-16],[-9,-12],[-6,-9],[-6,-8]],[[7523,4395],[6,10],[5,10],[7,11]],[[7541,4426],[39,-29],[28,-21]],[[7541,4426],[6,12],[8,13]],[[7555,4451],[7,14],[6,12]],[[7568,4477],[37,-27],[31,-23]],[[7636,4427],[-6,-12],[-8,-14],[-7,-13],[-7,-12]],[[8574,3762],[-30,-96],[-18,-58],[-9,-42],[-3,0],[-5,0],[-4,-2]],[[8433,3609],[13,36],[10,31],[8,18],[8,17]],[[8472,3711],[7,14],[7,14],[2,3]],[[8472,3711],[-6,5],[-4,3],[-5,4],[-2,2],[-12,10],[-8,5],[-16,-28],[-5,-9],[-24,18]],[[8390,3721],[20,38]],[[8410,3759],[8,14],[9,15]],[[8359,3664],[5,10],[7,12],[4,8],[7,12],[8,15]],[[8360,3787],[24,-18],[20,-15],[6,5]],[[8068,3836],[8,15],[4,8],[6,12]],[[8129,3839],[-11,-20],[-9,-15],[-8,7],[-25,19],[-8,6]],[[8059,3820],[5,8],[4,8]],[[533,371],[-1,-3],[-1,-6],[-3,-6],[-2,-4],[-5,-11],[-5,-9],[-2,-3],[-2,-5],[-2,-7],[-1,-3],[-1,-6],[-1,-5],[-1,-7],[0,-5],[0,-7],[0,-5],[0,-6],[1,-8],[2,-10],[1,-5],[2,-15],[0,-4],[0,-3],[0,-2],[-1,-4],[-1,-6],[-1,-3],[-3,-7],[-2,-6],[-1,-4],[0,-4],[-1,-5],[0,-7]],[[502,180],[0,-3],[3,-10],[1,-3]],[[506,164],[-2,-2],[-5,-3],[-10,-8],[-7,-6],[-7,-7],[-7,-8],[-10,-11],[-8,-10],[-6,-11],[-4,-6],[-8,-16],[-9,-18]],[[423,58],[-1,1],[-5,3],[-5,-4],[0,-4],[-3,2],[-18,14],[-23,19],[-30,17],[-6,1],[-1,3],[3,0],[33,-17],[26,-22],[2,5],[-15,16],[3,1],[23,-16],[16,-13],[2,5],[-15,9],[-17,14],[-19,30],[0,3],[4,4],[1,7],[-1,6],[3,10],[0,9],[6,14],[2,3],[1,7],[0,2],[-1,5],[-14,19]],[[374,211],[19,37]],[[393,248],[7,-11],[11,-16],[5,-8],[4,-6],[13,-19],[5,11],[21,39],[17,35],[18,33],[3,5],[14,25],[7,14],[9,17],[-1,6],[5,-4],[2,2]],[[393,248],[-2,3],[-4,6],[-6,14],[4,7],[9,16],[15,30],[18,34],[-24,17],[-24,18],[-21,16],[-3,2],[-70,53],[-1,0],[-1,0],[-2,-1],[-3,0],[-3,4],[-13,22],[-8,15],[-10,15],[-4,8],[-30,33],[-19,19],[-10,11],[-4,5],[-3,3],[-2,3],[-4,11],[-3,8],[-1,11],[0,2],[-1,3],[0,7],[5,1],[8,1],[21,3],[18,2],[10,1],[10,0],[10,0],[10,-1],[42,-5],[12,-2],[41,-5],[4,-1],[50,-6],[59,-8]],[[463,623],[4,-6],[64,-126],[1,-5]],[[532,486],[0,-2],[0,-6],[-1,-8],[0,-17],[1,-11],[3,-25],[1,-13],[1,-4],[0,-7],[-1,-8],[0,-3],[-1,-2],[-1,-5],[-1,-4]],[[790,1603],[48,-45],[181,-263]],[[1019,1295],[-32,-16],[-7,15],[-18,-11],[-70,-42],[8,-20],[-77,-58],[-12,20],[-35,-27],[-72,50],[-19,-33],[-37,-19],[-9,30],[-42,-26],[-5,-68],[-25,-15],[-4,-64],[-45,38],[-148,-241],[27,-17],[3,-8],[62,-154],[1,-6]],[[374,211],[-1,2],[-3,1],[-3,6],[-3,2],[-4,2],[-4,7],[-2,3],[-8,10],[-5,13],[-5,8],[-3,2],[-13,16],[-4,7],[-6,20],[-8,13],[-6,9],[-2,6],[-1,8],[-6,12],[-4,6],[-5,4],[-10,6],[-4,-2],[-8,-8],[-3,0],[-3,5],[-7,1],[-1,8],[-7,11],[-3,8],[-4,3],[-5,7],[-4,0],[-3,-5],[-3,-1],[0,3],[2,5],[2,14],[0,9],[2,5],[2,1],[0,2],[1,3],[2,-3],[8,1],[5,5],[5,7],[5,14],[0,12],[0,5],[-3,12],[-4,9],[-4,6],[-2,7],[-4,3],[-4,1],[-7,-3],[-11,-1],[-7,4],[-5,6],[-4,10],[-2,8],[-9,13],[-2,-1],[-2,-2],[-8,-11],[-3,-7],[-4,-10],[-1,-8],[-2,0],[-2,4],[3,10],[-2,9],[0,6],[-1,3],[-5,5],[-3,1],[-1,6],[2,4],[0,3],[-17,29],[-6,13],[-6,9],[-3,2],[-6,0],[-7,0],[-1,-1],[-3,-1],[-14,-3],[-3,-11],[0,-4],[-4,-4],[-9,1],[-5,-4],[-8,-4],[-3,4],[0,7],[0,5],[-1,4],[-2,2],[-3,1],[-4,-2],[-5,-4],[-6,-5],[-5,-4],[-3,-1],[-3,-2],[-1,1],[0,-3],[-3,1],[-1,2],[-9,2],[-2,-1],[0,-3],[-2,-2],[-3,0],[-2,12],[1,4],[19,3],[0,3],[0,2],[-2,2],[-5,-1],[-6,-1],[-4,-1],[0,3],[-1,4],[-2,6],[0,3],[5,2],[2,-1],[2,1],[2,6],[5,14],[2,8],[5,8],[3,4],[4,3],[4,5],[4,4],[11,0],[14,-7],[4,-4],[2,-11],[2,-7],[5,-8],[7,-4],[4,-1],[3,-3],[3,1],[6,0],[9,1],[4,1],[3,0],[0,2],[-3,5],[1,7],[4,7],[2,10],[4,10],[-3,6],[-3,2],[0,4],[2,4],[3,11],[0,8],[-3,12],[-10,10],[-8,9],[-5,3],[-11,3],[-3,3],[-1,3],[-3,0],[-5,1],[-6,7],[-15,1],[-4,-7],[-4,-1],[-5,2],[-5,9],[-3,10],[-2,9],[-6,14],[2,35],[0,13],[-1,3],[0,4],[-2,8],[5,13],[4,9],[4,12],[-5,5],[-2,3],[0,3],[2,1],[7,-3],[7,2],[3,15],[-1,5],[-10,12],[0,5],[3,8],[5,18],[2,11],[5,8],[3,9],[3,13],[1,15],[2,12],[2,15],[3,9],[1,18],[6,22],[1,6],[3,28],[0,1],[2,3],[1,2],[6,-6],[1,0],[2,-2],[-3,-6],[1,-1],[2,-1],[3,5],[2,-1],[5,12],[2,-1],[-3,-7],[2,-1],[6,12],[9,40],[13,15],[9,3],[6,6],[18,-7],[6,-3],[7,2],[5,8],[4,8],[2,10],[-1,7],[-4,7],[-4,13],[-9,36],[-2,11],[0,4],[1,10],[2,4],[1,1],[3,2],[3,2],[0,3],[2,2],[7,2],[1,3],[2,0],[1,-10],[-1,-10],[13,-7],[3,-14],[1,-4],[5,1],[7,5],[6,6],[2,3],[1,3],[1,3],[4,3],[6,2],[5,0],[6,-8],[0,-5],[4,-3],[3,-1],[4,4],[3,9],[3,3],[2,1],[3,0],[7,10],[2,1],[2,-1],[1,-1],[3,1],[3,1],[1,3],[-5,8],[2,2],[5,-8],[2,0],[2,2],[4,0],[3,-4],[3,2],[2,4],[2,2],[2,0],[1,4],[13,8],[4,0],[8,-4],[5,-1],[3,1],[8,4],[5,1],[7,5],[4,7],[3,10],[1,11],[-1,9],[-4,9],[-5,7],[-7,1],[-3,-1],[-5,0],[-24,14],[-6,8],[-2,7],[2,6],[6,5],[4,1],[27,-1],[8,1],[10,7],[11,3],[8,0],[7,-1],[5,-7],[4,-9],[6,-7],[9,-13],[8,-1],[9,3],[22,0],[12,-1],[5,1],[8,3],[8,5],[5,4],[-1,7],[-13,10],[-1,5],[22,-1],[-1,2],[-3,5],[-5,3],[-3,4],[5,0],[9,-4],[7,4],[12,4],[4,5],[3,11],[0,9],[-4,5],[-3,2],[-13,7],[-3,2],[-3,1],[-5,0],[-13,7],[1,7],[6,13],[6,5],[7,0],[4,0],[3,-4],[5,-1],[3,0],[4,5],[5,11],[2,4],[4,5],[5,7],[8,7],[11,10],[3,1],[3,-9],[1,-2],[12,1],[4,-4],[4,-6],[3,-2],[5,-1],[1,1],[1,5],[1,1],[2,0],[0,-7],[0,-4],[3,0],[2,3],[2,-3],[1,-2],[5,-1],[8,1],[-1,3],[4,6],[7,2],[2,-6],[6,-1],[9,-6],[6,-14],[21,-4],[11,-6],[9,-2],[7,-1],[6,7],[6,0],[9,-2],[6,4],[7,12],[15,12],[2,9],[7,3],[7,14],[6,-12],[9,-1],[1,2],[-6,4],[-1,3],[1,6]],[[919,1105],[19,9],[-8,23],[1,1],[18,10],[49,25],[5,2],[4,2],[11,2],[5,1]],[[1023,1180],[28,-74],[-18,-11],[-19,-12],[-15,-9],[-1,-1],[-1,-1],[0,-1],[-1,-1],[-1,-1],[0,-2],[-3,-9],[-13,-49],[-1,-2],[-1,-4],[0,-1],[-1,-2],[-1,-2],[-2,-1],[-2,-1],[-5,-3],[-4,-2],[-5,16],[-1,2],[0,2],[1,1],[0,2],[2,11],[-8,3],[-2,2],[-1,1],[-1,1],[-1,3],[-3,7],[-6,16],[-18,47]],[[919,1105],[-9,24],[-8,20],[-14,34],[0,3],[1,1],[17,9],[19,11],[-8,20],[-7,17],[0,2],[1,0],[0,1],[0,1],[58,30],[2,0],[2,0],[1,-1],[4,-8],[1,-3],[1,-4],[1,-1],[0,-1],[-1,-1],[-8,-4],[7,-21],[18,9],[26,-63]],[[4094,3309],[23,-28],[-33,-36],[6,-6]],[[4090,3239],[-20,-5],[-13,-16],[-5,-4],[-5,1],[-5,2],[-4,5],[-9,20],[-3,9],[-5,8]],[[4021,3259],[16,16]],[[3947,3388],[8,4],[8,6]],[[3989,3344],[-5,5],[-37,39]],[[4025,3298],[-17,-13],[-2,0],[-12,10],[-12,15],[-4,2],[-5,1],[-4,-2],[-5,-3],[-6,-1],[-10,-14],[-1,-2],[-1,-9]],[[3946,3282],[-24,2],[-7,2],[-22,25],[-9,7],[-36,13],[-6,1],[-2,0],[-4,-2],[-11,-7],[1,3]],[[3826,3326],[10,7],[3,12],[3,13],[-48,15]],[[3794,3373],[-3,1]],[[3791,3374],[3,9],[7,26]],[[3801,3409],[2,-1],[72,-25],[14,-3],[15,-1],[5,0],[6,1],[16,2],[10,3],[6,3]],[[1702,1781],[9,-20],[16,10],[3,0],[21,-47],[32,-68]],[[1783,1656],[8,-18],[-1,-3],[-15,-20],[-7,-8],[-11,-18]],[[1757,1589],[-8,7],[-4,1],[-19,-2],[-25,-10],[-10,-4],[-4,-3],[-5,-5],[-9,22]],[[1673,1595],[15,12],[33,13],[-3,26]],[[1718,1646],[0,4],[-2,9],[-5,12],[-7,-3],[-31,-17],[-12,-7],[-9,-5],[-3,-1],[-2,2],[-6,19],[-8,23],[-7,23],[-3,6],[-5,11],[-2,5],[2,2],[31,20],[12,8],[41,24]],[[1757,1589],[-6,-11],[-4,-4],[-29,-21],[-37,-28],[-4,-2],[-2,-2],[-8,-3],[-6,-1],[-2,26],[0,8],[-2,27],[1,4],[12,11],[3,2]],[[1515,1277],[-13,1],[-3,0],[-4,-2],[-17,39],[-2,5],[-30,-19],[-1,0],[0,-1],[3,-19],[0,-1],[1,-1],[1,0],[1,0],[13,7],[1,0],[1,0],[1,0],[1,-1],[1,-1],[8,-17],[2,-5],[1,-5],[4,-27],[1,-1],[5,2],[3,0],[4,0],[8,-1],[1,-5],[2,-14],[1,-9],[-2,-26]],[[1507,1176],[-9,1],[-11,1]],[[1487,1178],[-3,4],[2,34],[-10,5],[-11,51],[-11,-7],[-9,2],[-8,15],[-5,32],[-14,99],[26,13],[-9,52]],[[1435,1478],[45,25],[17,-37],[24,11],[-3,16],[42,12]],[[1560,1505],[5,-19]],[[1565,1486],[-4,-2],[-14,-6],[-9,-6],[-12,-6],[-42,-22],[6,-23],[7,-20],[6,-17],[4,-11],[3,-5],[5,-11],[5,-9],[4,-6],[1,-6],[1,-5],[-1,-6],[-2,-9],[-3,-15],[-5,-24]],[[1565,1486],[11,-56],[3,-18],[1,-9],[1,-5],[2,-13],[4,-22],[8,-45],[0,-20],[0,-10]],[[1595,1288],[-52,-11],[-11,-2],[-4,-1],[-13,3]],[[1595,1288],[2,-9],[6,-19],[8,-21],[-36,-19],[-4,-4],[-5,-3],[-7,-7],[-10,-12],[-3,-4],[-12,-23],[-4,3],[-9,3],[-5,2],[-3,1],[-6,0]],[[1832,1366],[-6,-5],[-12,-10],[-11,-8],[-4,-2],[-7,-3],[-2,-1],[-6,0],[-3,0],[-6,1],[-8,6],[-5,3],[-15,10],[-4,3],[-3,2],[-11,8],[3,4],[2,5],[1,4],[1,5],[2,5],[1,4],[0,6],[0,12],[4,0],[5,1],[2,1],[5,3],[4,2],[5,1],[3,1],[1,0],[2,2],[1,3],[5,-4],[2,0],[1,0],[1,0],[14,4],[1,0],[0,1],[0,1],[0,1],[-4,22],[-2,14],[-1,1],[0,1],[-1,1],[-14,2],[0,8],[1,16]],[[1774,1497],[8,-1],[2,0],[2,0],[1,1],[2,0],[2,1],[2,1],[2,2],[6,3],[18,11],[4,3],[2,-6],[2,-7],[1,-5],[0,-3],[0,-2],[-1,-1],[-1,-2],[4,-9],[1,-4],[14,-69],[1,-3],[0,-1],[-18,-13],[-2,-4],[0,-2],[0,-3],[2,-8],[0,-2],[4,-8]],[[1934,1567],[23,-37],[26,-44]],[[1983,1486],[-93,-74],[-2,-2],[-6,-6],[-3,-2],[-6,-5],[-15,-10],[-26,-21]],[[1774,1497],[-1,9],[-8,45],[1,6],[2,6],[13,19],[7,-6],[2,-2],[1,-2],[4,-7],[1,0],[1,0],[14,9],[1,1],[1,1],[0,1],[0,1],[0,1],[-8,18],[-2,3],[-6,6],[13,15],[3,1],[5,1],[-17,8]],[[1801,1631],[12,15]],[[1813,1646],[20,24],[22,2]],[[1855,1672],[1,-13],[5,0],[14,1],[13,1],[1,-1],[1,0],[0,-1],[1,0],[13,-29],[21,-45],[9,-18]],[[1861,1129],[-7,35],[-2,10],[-45,-6],[2,-12],[-15,-4]],[[1794,1152],[-162,-19],[-4,13]],[[1628,1146],[27,10],[6,2],[22,9],[19,9],[10,4],[16,8],[6,3],[-2,6],[-1,3],[-1,5]],[[1730,1205],[43,23],[5,3],[4,3],[6,-5],[16,9],[15,10],[12,9],[19,13],[23,17],[22,19],[23,18],[67,55],[21,17],[7,6],[14,11]],[[2027,1413],[3,-5]],[[2030,1408],[-22,-19],[1,-7],[14,-64]],[[2023,1318],[-11,-5],[-23,-8],[19,-95],[-31,-17],[-14,4],[-19,-2],[-14,51],[-19,-10],[-9,-9],[1,-3],[-14,-6],[16,-73],[-44,-16]],[[1956,1014],[-20,-6],[-16,-5],[-20,-6]],[[1900,997],[-2,11],[-1,5],[2,5],[3,5],[-9,11],[-1,3],[-1,4],[-3,14],[-9,42],[-5,23]],[[1874,1120],[-13,9]],[[2023,1318],[1,-3],[5,-25],[5,-23],[-19,-5],[3,-15],[0,-5],[-4,-10],[-1,-5],[2,-6],[3,-3],[6,-8],[2,-5],[2,-8]],[[2028,1197],[-15,-4],[-6,-2],[-4,-1],[-10,-7],[-6,-6],[-7,-5],[-10,-11],[-3,-3],[-4,-4],[-2,-1],[-5,-2],[-14,-6],[-6,-4],[-2,-2],[-2,-2],[-2,-3],[-3,-6],[-1,-3],[-2,-8],[-1,-7],[0,-11],[0,-13],[14,1],[3,-2],[1,-4],[1,-3],[14,-64]],[[1874,1120],[-22,-9],[6,-25],[5,-22],[2,-11],[1,-5],[0,-5],[-1,-9],[-1,-1],[-1,-1],[-1,-1],[-1,0],[-24,6],[-22,5],[1,10],[0,9],[0,9],[-5,21],[-6,27],[-6,27],[-2,0],[-1,1],[0,1],[0,1],[0,1],[1,0],[-3,3]],[[1900,997],[14,-65],[72,-11],[9,-12],[5,-4],[-2,-2]],[[1998,903],[-54,-16],[-40,-10],[-47,-12],[-45,-12],[1,-6]],[[1813,847],[-136,-37],[-38,-8],[-32,-9],[-54,-17]],[[1553,776],[-46,314],[-1,2]],[[1506,1092],[0,1],[7,3],[12,6],[16,8],[19,9],[19,8],[9,4],[16,6],[24,9]],[[2040,958],[4,-7],[4,-5],[10,-8],[3,-2],[3,-5],[3,-11],[-69,-17]],[[1956,1014],[8,2],[2,0],[1,0],[3,-2],[28,-22],[7,17]],[[7827,2883],[-1,2],[-31,15]],[[7795,2900],[-50,27]],[[7745,2927],[13,22],[3,1],[2,4],[3,3]],[[7766,2957],[2,4],[1,2],[7,10],[8,9]],[[7784,2982],[21,-21],[20,-19],[7,-7],[9,-9],[9,-9]],[[7850,2917],[-3,-5],[-14,-20],[-2,-3],[-4,-6]],[[2028,1197],[20,4],[21,4]],[[2069,1205],[13,3],[4,-1],[3,-2],[2,-5],[4,-35],[1,-24]],[[2096,1141],[3,-24],[0,-6],[0,-3],[-1,-4],[-1,-3],[-4,-5]],[[1830,564],[-15,90]],[[1815,654],[-23,137],[-2,10],[1,4],[2,1],[28,7],[-1,5],[-1,4],[-1,3],[-1,5],[-2,7],[-2,10]],[[1813,847],[66,16]],[[1879,863],[3,-17],[1,-4],[0,-3],[1,-4],[0,-3],[3,-2],[2,-7],[-1,-3]],[[1888,820],[3,-9],[5,-15],[5,-18],[21,-101]],[[1922,677],[18,-86]],[[1940,591],[-36,-9],[-42,-9],[-19,-4],[-13,-5]],[[2004,847],[5,-26],[12,-61],[0,-3],[0,-2],[-1,-1],[-1,-1],[-4,-3],[-5,-3],[-10,-3],[6,-29],[-19,-11],[-23,-12],[-9,-5],[-12,-4],[-21,-6]],[[1888,820],[25,7],[22,5],[34,9],[4,0],[5,-2],[6,-2],[5,1],[4,2],[6,4],[5,3]],[[2077,670],[-5,-3],[-30,-27],[-12,-10],[-11,-8],[-12,-8],[-17,-9],[-10,-4],[-18,-5],[-22,-5]],[[2004,847],[21,5],[43,11],[5,-23],[5,-22],[5,-24],[6,-29],[-17,-11],[-3,-1],[0,-3],[5,-21],[-18,-10],[-2,-3],[0,-4],[4,-20],[3,-1],[9,5],[7,-26]],[[1962,486],[-1,4],[0,17],[-4,9],[-4,10],[-13,65]],[[2077,670],[15,8],[14,5],[26,9],[4,1],[30,10],[16,5],[5,3],[4,2],[3,1],[5,3],[6,4],[5,4],[5,4]],[[2215,729],[4,5],[9,10]],[[2228,744],[35,-8],[37,-30]],[[2300,706],[-2,0],[-10,-1],[0,-2],[-15,-8],[7,-17],[-5,-2],[-8,12],[-2,-1],[-2,-1],[-1,-3],[-3,-5],[-4,-5],[-6,-10],[-8,-9],[-7,-3],[-7,-3],[-5,-3],[-16,-5],[-4,9],[-4,1],[-2,-2],[-2,-6],[-8,0],[0,-4],[-3,-2],[-5,1],[-1,3],[-2,0],[0,-5],[0,-2],[-2,-1],[-5,-1],[-2,4],[-1,1],[-4,0],[-17,-5],[-3,-1],[-5,-4],[-4,-2],[-8,-7],[-6,-5],[-2,-3],[1,-6],[0,-2],[-3,-2],[-2,0],[-3,1],[-14,0],[-2,0],[-1,-2],[0,-4],[-1,-2],[-1,-1],[-1,1],[-3,4],[-7,0],[-5,3],[-6,0],[-2,-3],[-13,-8],[-5,-11],[-6,-4],[-4,-5],[-3,-2],[-8,-6],[-6,-3],[-5,-5],[-4,-8],[-2,-10],[-3,-8],[-5,-8],[-4,-5],[-2,-4],[-2,-8],[-2,-3],[-16,-1],[-3,-2],[-7,-5],[-4,-4]],[[2537,873],[-28,28]],[[2509,901],[31,18]],[[2540,919],[68,41],[7,-27],[2,-12],[2,-3],[2,-1],[14,-3],[14,-4],[10,-3],[16,-8],[16,-10]],[[2691,889],[9,-5],[6,-4],[4,-4],[4,-2],[13,-10],[6,-6],[6,-2],[51,-24],[28,-13],[6,2],[5,3],[5,4],[4,7],[3,7],[1,8],[1,5],[0,1],[-1,4],[0,3],[3,1],[4,2],[5,3],[8,3]],[[2862,872],[11,3],[11,3],[5,2]],[[2889,880],[9,-7]],[[2898,873],[-4,-1],[-5,-5],[-12,-3],[-18,-8],[-2,-4],[0,-8],[-1,-5],[-1,0],[-3,1],[-4,-3],[-3,-2],[3,-3],[-2,-5],[5,-7],[-5,-6],[-4,3],[-7,-7],[-2,2],[-1,-2],[1,-2],[-4,-14],[-8,-7],[-10,-1],[-3,-4],[-4,-5],[-9,0],[-2,0],[1,20],[-3,13],[-1,1],[-3,-1],[-3,-3],[-2,1],[-7,5],[-1,1],[-7,1],[-3,1],[-2,2],[-7,4],[-7,2],[-9,4],[-4,4],[-3,0],[-2,2],[-2,2],[-3,9],[-1,11],[-2,5],[-6,3],[-6,5],[-5,-2],[-6,3],[-3,3],[-14,8],[-9,7],[0,1],[-1,1],[-7,1],[-5,1],[-14,8],[-6,2],[-4,3],[-11,4],[-10,5],[-3,0],[-7,-1],[-5,-3],[-9,-6],[-2,-2],[-9,-4],[-20,-9],[-8,-6],[-7,-2],[-6,-7],[-2,-1]],[[1618,401],[-2,10]],[[1616,411],[-4,21]],[[1612,432],[15,23],[11,13],[9,8],[12,8],[6,4]],[[1665,488],[6,-35],[6,-30],[10,3],[24,6],[18,5],[6,2],[6,2],[10,1],[-14,83],[28,12],[43,18],[22,9]],[[1962,486],[-10,-12],[0,-4],[2,-4],[2,-3],[4,-13],[0,-4],[-1,-7],[1,-11],[-3,-8],[-11,-13],[-4,-2],[-20,-2],[-2,-1],[-8,0],[-3,1],[-4,6],[-7,14],[-3,4],[-1,4],[-5,2],[-4,10],[-2,4],[-3,4],[-3,0],[-9,-4],[-2,0],[-8,-2],[-6,-2],[-8,-5],[-9,-2],[-5,-7],[-10,-11],[-7,-10],[-4,-4],[-18,0],[-7,5],[-4,4],[-10,4],[-8,4],[-5,1],[-7,1],[-8,-1],[-9,-2],[-14,-6],[-7,-5],[-10,-2],[-12,-5],[-17,-3],[-13,3],[-13,2],[-23,0],[-6,-3]],[[1665,488],[22,14],[12,8],[9,4],[1,3],[-4,22],[-3,15],[-1,9],[-12,74]],[[1689,637],[6,1],[5,0],[4,1],[14,4],[15,3],[12,2],[14,1],[33,3],[23,2]],[[1612,432],[-14,74],[-20,109]],[[1578,615],[-16,112]],[[1562,727],[9,3],[22,7],[21,6],[11,-65],[4,-25],[13,3],[1,-5],[4,-21],[19,4],[12,3],[11,0]],[[1562,727],[-4,21],[-1,5],[-4,23]],[[1578,615],[-12,-7],[-24,-14],[-4,-2],[-6,-3],[-11,-3],[-11,-2],[-16,-9],[-16,-9]],[[1478,566],[-5,34],[-8,47],[-26,-14],[-7,33],[-5,-2],[-8,-4],[-13,-4],[-6,-1],[-3,-1],[-15,-3],[-7,-4],[-19,-11],[-26,-16],[-43,-26],[-13,-8]],[[1274,586],[-31,-18],[-16,-9],[-12,-7],[-2,-3],[-1,-1],[-1,-3],[0,-1],[0,-4],[1,-12],[-1,-4],[-1,-3],[-3,-3],[-4,-2],[-3,0],[-3,0],[-3,0],[1,-12],[-34,-20],[-28,-17],[-7,-4],[-9,-5],[-11,-8],[-13,-9],[-3,-3],[-6,-4],[-2,-1],[-4,-2],[-48,-29],[0,-1]],[[1030,401],[-9,19],[-26,-16],[-40,-24],[-1,-1],[-1,-1],[0,-1],[-12,-118],[-28,3],[-12,-128],[0,-3],[0,-5],[2,-8],[5,-14]],[[908,104],[-9,-3],[-7,-2],[-7,-1],[-8,0],[-23,-1]],[[854,97],[4,44],[9,91],[3,33],[5,93],[-1,4],[21,226],[4,2],[7,3],[3,1],[4,2],[4,1],[1,1],[1,1],[5,2],[2,1],[2,2],[6,3],[2,1],[1,1],[1,0],[8,7],[4,2],[5,4],[8,7],[9,7],[1,1],[2,2],[4,4],[7,6],[1,1],[21,18],[19,17],[2,2],[3,3],[11,10],[24,21],[24,21],[1,1],[2,2],[19,17],[57,51],[14,12],[13,12],[4,3],[1,1],[1,1],[12,11],[12,11],[7,6],[8,7],[41,36],[35,31],[3,3],[5,4],[19,18],[24,21],[20,18],[9,8],[17,15],[7,6],[13,10],[16,12],[6,4],[5,4],[8,5],[5,3],[4,2],[5,3],[4,3],[6,3],[4,2],[8,4]],[[1478,566],[-24,-14],[-7,-5],[-14,-9],[-12,-5],[-25,-12],[-20,-8]],[[1376,513],[-12,-4],[-22,-15],[-24,-16],[-10,-7],[-11,-8],[-22,-10]],[[1275,453],[-2,3],[-1,15],[-1,14],[0,10],[0,8],[3,16],[2,11],[0,10],[0,10],[0,11],[-2,25]],[[2801,2509],[-8,14],[-43,35],[-3,3],[-21,35],[9,8],[3,6],[12,31],[20,-11],[11,-5]],[[2857,2557],[-5,-3],[-19,-17],[-32,-28]],[[3801,3409],[3,11],[2,-2],[8,-9],[3,0],[10,15],[10,-3],[4,-1],[2,0],[1,-1],[2,0],[2,7],[-2,5],[-26,26],[-59,63],[-13,-1],[-3,0],[-2,14],[-1,9]],[[3801,3409],[-36,12]],[[3765,3421],[-3,4],[-9,9],[-47,48],[-56,57],[-2,9]],[[3648,3548],[12,-2],[10,-3],[30,-6],[16,-2],[6,2],[10,4],[10,1]],[[3626,3472],[24,-11],[34,-12],[19,-6],[49,-18],[13,-4]],[[3791,3374],[-69,29]],[[3722,3403],[-59,23],[-37,46]],[[3794,3373],[-12,-48]],[[3782,3325],[-1,0],[-1,1],[-15,16],[6,8],[4,15],[-1,3],[-34,12],[-5,-7],[-6,-8],[-17,-14],[-2,-3],[0,-2],[10,-16],[17,-23],[12,-16]],[[3749,3291],[-16,-15],[-5,-6],[-6,-10],[-6,-16],[-3,-14]],[[3713,3230],[-18,5],[4,21],[4,16],[0,5],[-1,4],[-16,23]],[[3686,3304],[-6,9],[-7,10],[-71,-56],[-7,11]],[[3595,3278],[49,40],[61,74],[5,9],[12,2]],[[3782,3325],[-5,-20],[-3,-7]],[[3774,3298],[-7,-1],[-10,-1],[-8,-5]],[[3713,3230],[-1,-24]],[[3712,3206],[-35,11],[-10,2],[-11,-1],[-10,-2],[-2,-2],[0,-3],[1,-3],[17,-20],[2,-3],[-16,-10],[-19,23],[-3,9],[-3,1],[-16,-6],[-2,-3],[0,-3],[2,-3],[27,-31],[-16,-13]],[[3618,3149],[-15,17],[-14,17],[-7,14],[-5,12]],[[3577,3209],[16,10],[6,3],[17,7],[-5,15],[27,22],[16,12],[32,26]],[[3712,3206],[-1,-60]],[[3711,3146],[5,-45]],[[3716,3101],[-39,-6],[-11,-5],[-13,-9]],[[3653,3081],[-7,21],[-6,17],[-3,7],[-6,8],[-13,15]],[[3577,3209],[-16,-12],[-3,-4],[-10,-12],[-3,-7],[-4,-15],[-1,-10],[-2,-17],[-2,-10],[-6,-12],[-6,-9],[1,-1],[8,-15],[13,-24],[-1,-2],[-13,-10],[-10,18],[-13,24],[-10,-8],[-7,-6],[-5,-9]],[[3487,3068],[-10,5],[-11,3],[-13,0],[-9,-2],[-7,-3],[-9,-6],[-9,-7],[-16,-13],[-18,-14]],[[3385,3031],[-39,66]],[[3346,3097],[-25,44]],[[3321,3141],[18,14],[5,-10],[151,119],[27,-41],[73,55]],[[3321,3141],[-29,48]],[[3292,3189],[18,14],[20,16],[13,10]],[[3343,3229],[28,-47],[20,17],[20,16],[131,103],[1,2],[-1,4],[-12,20],[-14,23]],[[3516,3367],[22,16],[32,26],[26,21],[-94,34],[-79,30],[-12,21]],[[3411,3515],[-4,7],[-7,21]],[[3528,3531],[15,-10],[56,-35],[17,-9],[10,-5]],[[3343,3229],[11,9],[10,8],[20,16],[10,8]],[[3394,3270],[68,54],[21,16],[20,16]],[[3503,3356],[13,11]],[[3394,3270],[-14,23],[12,10],[-12,20],[-3,7],[-3,4],[-12,19],[-12,-9]],[[3350,3344],[-13,24],[68,54]],[[3405,3422],[20,18],[20,17],[23,-41],[12,-20],[12,-20],[11,-20]],[[3292,3189],[-25,42]],[[3267,3231],[-10,18]],[[3257,3249],[18,14],[-3,10],[-1,9],[1,9],[3,8],[11,18],[20,-16],[7,11],[6,6],[4,4],[27,22]],[[3257,3249],[-20,36],[13,10],[-6,11],[-13,-11],[-8,14],[-2,3]],[[3221,3312],[22,17],[-3,6],[-2,6],[0,21],[33,30],[5,5],[10,9],[15,14],[16,14],[22,-32],[17,13],[10,8],[16,12]],[[3382,3435],[11,8],[12,-21]],[[3382,3435],[-23,32],[-10,-9],[-18,20]],[[3331,3478],[-11,11],[13,18],[14,-15],[1,0],[2,0],[17,17],[10,11],[3,4],[3,0],[20,-7],[8,-2]],[[3331,3478],[-17,-16],[-48,49],[-54,56],[-25,25],[8,3],[7,4],[9,3],[13,2]],[[3224,3604],[17,-19],[29,-11],[68,-26],[-46,55]],[[3292,3603],[9,0],[7,0]],[[9039,4992],[-6,1],[-27,7],[-17,5],[-13,4],[-7,4],[-39,21],[-14,3],[-17,9]],[[8899,5046],[5,12],[4,11],[17,-9],[4,12],[5,12],[-17,9],[-9,5]],[[8908,5098],[8,24],[9,23]],[[8925,5145],[5,12],[4,12],[6,14],[0,3],[2,7]],[[8942,5193],[7,3],[6,1],[4,-1],[6,1],[5,0],[6,-1],[3,-1],[13,9],[1,0],[4,10],[3,5]],[[9000,5219],[3,-1]],[[9040,5199],[-24,-47],[4,-4],[-3,-9],[6,-5],[-2,-4],[19,-12],[5,12],[4,-2],[36,72],[-2,2],[25,45],[5,-3],[-18,-41],[4,-6],[1,-4],[-3,-10],[-3,-3],[-3,-6],[-3,-6],[-2,-5],[3,-5],[7,-11],[0,-3],[0,-3],[0,-3],[3,-3],[2,5],[38,59],[11,-9],[-75,-125],[-13,-25],[-23,-48]],[[8942,5193],[-9,4],[-15,8],[-9,5]],[[8927,5255],[60,-30],[3,-2],[10,-4]],[[8474,3994],[10,-7],[14,-12]],[[8498,3975],[26,-20]],[[8446,4016],[12,22],[8,-6],[13,-10],[8,-6]],[[8487,4016],[24,-19],[-13,-22]],[[8418,4037],[9,16],[3,6],[7,13],[9,14],[13,24]],[[8459,4110],[27,-21]],[[8486,4089],[10,-7],[18,-15]],[[8514,4067],[-6,-11],[-15,-28],[-6,-12]],[[8597,4005],[2,-1],[1,-1],[1,-1],[3,-3],[-2,-7],[5,-1],[3,-1],[12,-4],[12,-3]],[[8634,3983],[-13,-66],[6,-2],[-7,-34]],[[8514,4067],[17,-13],[16,-12],[10,-9],[4,-1],[5,-4],[19,-14],[6,-4],[6,-5]],[[3440,1055],[-2,1],[-17,26],[-5,3],[-5,3],[-6,-1],[-7,-3],[-8,-10],[-4,-8],[-3,-9],[-57,-8],[-6,-8],[-3,-2],[-2,-3],[-9,-6],[-1,-3],[-2,-1],[-4,-5],[-3,0],[-6,6],[-3,1],[-7,0],[-1,4],[-2,0],[-7,0],[-4,-2],[-12,-3],[-5,-1],[-10,0],[-5,-1],[-2,-3],[-3,-3],[-11,2],[-1,1],[-4,4],[-2,1],[-4,-1],[-10,-4],[-6,-5],[-3,-3],[-8,-5],[-6,-1],[1,-3],[-3,-4],[-7,-4],[-5,0],[-1,-1],[0,-2],[-1,-2],[0,-1],[2,-4],[0,-1],[-6,-14],[-1,-4],[1,-3],[17,-12],[-7,-7],[0,-5],[-4,-5],[-14,-6],[-6,-2],[-34,-20],[-5,-5],[-2,-3],[-10,-9],[-4,-7],[8,-11],[5,-7],[0,-4],[7,-4],[-1,-2],[7,-7],[2,2],[3,-2],[-6,-10],[-2,1],[-1,0],[2,-2],[1,-4],[-1,-2],[-14,-22],[-6,0],[-5,2],[-8,0],[-4,4],[-2,4],[-2,2],[-7,2],[-5,-2],[-9,-7],[-4,-1],[-12,-10],[-8,-9],[-3,-2],[1,-10],[3,-9],[1,-9],[0,-6],[-2,-4],[-4,-1],[-4,0],[-4,2],[-7,5],[-5,8],[-1,3],[0,4],[1,7],[6,11],[0,7],[-2,5],[-1,7],[-1,5],[1,7],[2,3],[-1,6],[-5,8],[-5,8],[-2,5],[-2,0],[-1,0],[-1,1],[-2,5],[-1,0],[-8,0],[-7,2],[-6,0],[-3,4],[-2,0],[-8,-2],[-4,0],[-4,5],[-9,4],[-4,-2],[-1,0],[-3,0],[-3,4],[-5,3],[-4,-3],[-6,-1],[-6,0],[-3,-1],[0,-1]],[[2889,880],[5,1],[12,4],[-5,22],[22,7],[8,-30],[10,-4],[5,-1],[7,-1],[-5,45],[5,1],[13,4],[20,7],[14,5],[21,7]],[[3021,947],[11,-49],[13,4],[4,3],[4,4],[4,4],[3,3],[15,8],[8,3],[26,7],[16,3],[6,2],[3,1],[3,3],[2,5],[5,10],[2,8],[1,11],[1,7],[4,9]],[[3152,993],[7,10],[6,6],[8,6],[9,6],[6,4],[8,3],[7,3],[6,1],[7,-1],[8,-1],[6,1],[3,0],[19,4],[5,1],[10,0],[14,-1],[8,-1],[8,2],[8,5],[15,18]],[[3320,1059],[22,26],[11,12],[19,21],[11,13],[6,7],[10,9],[8,6],[13,6]],[[3420,1159],[5,4],[20,-86],[-5,-22]],[[2889,880],[3,18],[-16,73],[-53,204],[-1,4]],[[2822,1179],[2,1],[9,4],[1,0],[34,16],[34,16],[20,9],[17,7],[14,6],[27,11],[1,-4],[1,-6],[2,-16]],[[2984,1223],[3,-19],[5,-32],[6,-23],[3,-13],[2,-9],[7,-22],[14,-55]],[[3024,1050],[16,-66],[8,-27],[-27,-10]],[[3024,1050],[19,8],[3,2],[23,7],[20,7],[20,7]],[[3109,1081],[4,-14],[9,-23],[4,-18],[3,-1],[3,-3],[20,-29]],[[3120,1129],[-6,-1],[-5,-2],[-2,-1],[-2,-3],[-1,-4],[0,-6],[5,-31]],[[2984,1223],[8,1],[4,-1],[14,-3],[9,-1],[13,-1]],[[3032,1218],[0,-2],[2,-10],[4,-17],[0,-2],[1,-2],[1,-1],[1,0],[20,-3],[7,0],[19,6],[4,1],[2,-3],[13,-17],[4,-6],[4,-6],[2,-6],[2,-7],[1,-9],[1,-5]],[[3120,1129],[2,2],[10,3],[32,10],[34,11]],[[3198,1155],[24,10],[11,8],[25,17],[17,11],[7,5],[17,11]],[[3299,1217],[1,-3],[2,-8],[0,-2],[1,-5],[0,-5],[-18,-12],[-1,-2],[0,-3],[0,-2],[16,-64],[5,-24],[4,-15],[2,-4],[9,-9]],[[3032,1218],[6,1],[14,4],[9,1],[8,0],[8,0],[3,1],[2,-1],[0,7],[3,10],[2,7],[4,5],[3,4],[22,16],[4,3],[5,10],[2,7],[33,10],[1,-1],[0,-1],[4,-15],[5,-20],[6,-22],[8,-33],[3,-12],[11,-44]],[[2822,1179],[0,1],[-5,18]],[[2817,1198],[114,52],[45,19],[45,20],[49,23],[20,8]],[[3090,1320],[27,11],[95,42]],[[3215,1375],[2,-11],[3,-13],[0,-1],[3,-13],[1,-3]],[[3224,1334],[1,-4],[23,7],[-2,-7],[0,-5],[1,-2],[10,-40],[6,-24],[6,-23],[23,8],[26,10],[7,4],[-5,21],[-6,23],[-11,48],[24,12],[39,22],[25,-104]],[[3391,1280],[-31,-21],[-61,-42]],[[3224,1334],[1,0],[3,1],[29,9],[5,2],[7,2],[14,5],[10,4],[10,4],[16,8],[9,5],[11,6],[8,4],[8,5],[12,8],[4,3],[12,7],[9,7],[11,8],[5,3],[13,8],[14,10],[7,5],[18,12],[13,9],[1,-4],[1,-3],[0,-2],[20,-81]],[[3495,1379],[-20,-19],[-4,-7],[-4,-7],[-3,-8],[-1,-8],[-2,-12],[-1,-18],[-15,1],[-12,-4],[-22,-7],[-9,-3],[-11,-7]],[[3948,1440],[2,-9]],[[3950,1431],[-5,0],[-2,1],[-3,5],[-3,8],[-9,5],[-2,3],[-10,9],[-6,4],[-4,4],[-3,2],[-15,5],[-3,3],[-4,0],[-14,0],[-8,6],[-3,2],[-7,4],[-24,15],[-5,2],[-11,3],[-8,1],[-2,-1],[-12,-8],[-13,1],[-3,7],[-4,3],[-10,3],[-2,3],[-3,1],[-13,4],[-36,-1],[-5,2],[-24,2],[-4,-5],[-1,-6],[-5,-1],[-4,3],[-8,0],[-11,-3],[-5,-7],[-5,0],[-2,1],[-7,0],[-10,-7],[0,-12],[-11,-10],[-16,-11],[-21,-20],[-2,-7],[2,-5],[2,-8],[-2,-3],[-2,-11],[-3,-8],[-5,-6],[-13,-12],[-5,-2],[-7,6],[-3,-2],[0,-3],[-13,-8],[-3,1],[-3,-2],[-19,-15],[-11,-12],[-8,-9],[-3,-8],[0,-6],[6,-2],[2,-8],[2,-12],[-4,-15],[-7,-22],[-4,-3],[-9,-20],[0,-4],[6,-20],[1,-7],[0,-9],[-2,-16],[-2,-5],[-2,-1],[-1,-1],[0,-3],[-4,-13],[-1,-9],[-1,-1],[3,-12],[0,-11],[0,-7],[6,-7],[5,-8],[12,-9],[1,-6],[1,-10],[-3,-1],[-4,0],[-3,-5],[0,-4],[-1,-6],[-6,-10],[-2,-6],[-4,0],[-4,-2],[-2,-4],[-5,3]],[[3420,1159],[-29,121]],[[3495,1379],[8,6],[9,5],[7,3],[4,2],[6,3],[6,6],[4,6],[5,10],[2,7],[2,8],[1,7],[1,7],[-1,6],[-1,5],[0,5],[1,6],[5,6],[4,3],[23,13],[5,3],[7,2],[4,3],[9,7],[5,3],[15,4],[5,3],[15,12],[5,2],[4,1],[3,-1],[5,0],[4,-1],[24,-1],[7,0],[6,1],[9,1],[2,0],[3,-1],[5,-1],[3,-1],[3,0]],[[3729,1529],[5,0],[4,-1],[9,-3],[12,-4],[3,-1],[6,-2],[6,-1],[3,1],[11,5],[5,1],[1,0],[4,-1],[1,0],[29,-12],[6,-3],[8,-7],[12,-7],[16,-7],[6,-2],[10,-2],[3,-1],[5,-2],[6,-2],[10,-6],[6,-5],[26,-21],[6,-6]],[[2801,2509],[-22,-21]],[[2779,2488],[-19,-15]],[[2760,2473],[-71,115]],[[2689,2588],[20,16],[7,8],[15,39]],[[2731,2651],[13,36],[4,7],[6,7],[5,5],[16,13]],[[2775,2719],[12,-20],[13,-24],[8,-13],[11,-6]],[[3648,3548],[-13,2],[-9,1],[-11,0],[-18,-2],[-16,1],[-16,2],[-4,11],[-4,3],[-14,4],[-2,2],[-5,19],[-14,-10],[-2,0],[-43,17],[2,8],[-2,3],[-35,35],[-17,-22],[6,-6],[17,-7],[-6,-21]],[[3442,3588],[-3,4],[-14,12],[-100,116],[-46,48]],[[3279,3768],[8,4],[15,4],[9,4],[10,1],[0,2],[1,1],[11,0],[6,0],[11,-1],[6,-2],[17,-7],[16,-8],[4,-4],[5,-7],[3,-8],[4,-7],[5,-3],[8,-2],[21,0],[2,2],[3,3],[1,1],[27,1],[33,-1],[8,-2],[8,-5],[3,-3],[1,-14],[4,-9],[4,-12],[0,-33],[3,-21],[3,-12],[3,-30],[2,-7],[5,-5],[7,-4],[5,-1],[6,-3],[2,-2],[11,-18],[3,-2],[3,-4],[3,0],[2,1],[3,1],[24,-2],[10,-1],[23,-2],[29,-6],[12,-1],[7,-2],[15,-2],[6,1],[8,4],[7,2],[7,1]],[[5918,1454],[-47,1]],[[5961,1453],[-43,1]],[[5918,1320],[0,8],[0,6],[0,120]],[[5985,1452],[0,-32]],[[5985,1420],[1,-99]],[[5986,1321],[-23,0],[-22,0]],[[5985,1420],[20,0],[20,0],[20,0]],[[6045,1420],[1,-99]],[[6046,1321],[-20,0]],[[6026,1321],[-21,0],[-19,0]],[[6045,1420],[20,0],[20,0],[20,1]],[[6105,1421],[0,-70],[0,-30]],[[6105,1321],[-19,0],[-21,0],[-19,0]],[[6105,1321],[1,-64]],[[6106,1257],[-14,4],[-6,0],[-20,-1],[-20,-1],[-20,-2],[0,64]],[[6045,1420],[-1,67],[21,0],[20,-2],[9,-2],[9,-2],[3,-1]],[[6106,1480],[-1,-59]],[[6109,1506],[-1,-16]],[[6108,1490],[-1,-4],[-1,-6]],[[3833,2087],[-15,-12],[-3,-3],[-13,-10],[-3,-1],[-7,-4],[-15,-3],[-9,-4],[-6,-4],[-59,-48]],[[3703,1998],[-11,19],[-32,53],[-3,1],[-8,-6],[-6,-3],[-16,-4],[-5,11],[-12,19],[-11,17],[-21,35],[-15,-13]],[[3563,2127],[-11,18],[-11,20],[-30,-24],[-11,18],[-5,9],[-33,-26]],[[3462,2142],[-31,83],[-17,-14],[-8,-8],[-6,-13],[-15,-42],[-5,-9],[-6,-7],[-15,-13],[-32,-27],[-7,-5]],[[3320,2087],[-26,-23],[-45,-36]],[[3249,2028],[-31,-27],[-23,-21],[-2,-2],[-1,-3],[-12,-9],[-16,-14],[-17,-14],[-15,-12],[-25,-21],[-4,-2],[-12,-5],[-2,0],[-5,-2]],[[3084,1896],[-6,22],[-7,26],[-5,15],[-2,8],[-3,6],[-7,14],[-11,18],[-7,12],[-17,27],[0,1],[-3,5]],[[2940,2167],[-2,3],[-39,64]],[[2889,2260],[325,267]],[[3214,2527],[9,-22],[13,-27],[24,-39],[2,-3],[3,-5],[215,154],[36,31],[51,35],[37,22],[4,6]],[[3608,2679],[1,1],[11,-17],[4,-7],[8,-14]],[[3632,2642],[14,-25],[14,-23],[4,-6],[3,-5],[2,-5],[1,-1],[15,-25],[15,-25],[10,-17],[8,-12],[12,-22],[5,-10],[2,-4],[15,-26],[7,-12],[8,-14],[9,-14],[14,-24],[13,-20],[35,-61],[54,-93],[6,-9],[5,-8],[16,-24],[-36,-29],[-50,-41]],[[3214,2527],[-2,3],[-6,10]],[[3206,2540],[-13,18],[-12,19],[-3,5],[-9,16],[-17,29]],[[3152,2627],[-15,28]],[[3137,2655],[18,14],[4,3],[18,14],[5,3],[17,15],[4,3],[5,2],[1,1],[5,0],[16,0],[10,0],[12,0],[1,-24],[-1,-14],[31,-4],[0,-7],[1,0],[4,0],[14,-2],[5,0],[4,0],[4,1],[11,3],[11,4],[9,4],[4,3],[54,42]],[[3404,2716],[49,38],[48,37],[26,26],[3,3]],[[3530,2820],[75,-130],[2,-3]],[[3607,2687],[-3,-2],[1,-2],[3,-4]],[[3530,2820],[14,15],[-2,3],[9,10],[-14,23],[15,12]],[[3552,2883],[5,-3],[12,-21],[12,-19],[0,-6]],[[3581,2834],[10,2],[34,26],[43,-73],[-29,-23],[-3,-3],[-3,-8],[-1,-5],[9,-4],[2,-2],[10,-17],[2,-3],[-18,-14],[-8,-6],[-22,-17]],[[3054,2513],[4,4],[5,7],[2,4],[-12,17],[-6,6]],[[3047,2551],[55,47],[11,7],[39,22]],[[3206,2540],[-55,-46],[-5,-4],[-6,-2],[-6,-2],[-10,0],[0,-9],[-1,-5],[-3,-5],[-23,-19],[-3,0],[-11,18],[-29,47]],[[3047,2551],[-3,2],[-27,45]],[[3017,2598],[55,47],[-11,19],[19,16],[18,15],[2,7]],[[3100,2702],[12,-5],[3,-3],[11,-21],[11,-18]],[[3017,2598],[-12,19],[-14,-12],[-13,-11],[-3,1],[-20,20]],[[2955,2615],[-16,17]],[[2939,2632],[41,53],[7,11],[8,25]],[[2995,2721],[7,23]],[[3002,2744],[98,-42]],[[3047,2551],[-113,-95]],[[2934,2456],[-11,23],[-11,19],[-9,17]],[[2903,2515],[11,0],[6,-10],[15,13],[23,19],[-11,18],[16,13],[-7,10],[-15,16],[0,3],[14,18]],[[2913,2339],[14,12],[4,4],[3,6],[2,5],[0,12],[1,22],[1,24],[1,24],[-5,8]],[[3054,2513],[-16,-14],[-15,-13],[-16,-13],[38,-62],[1,-3],[-1,-3],[-13,-11],[-49,-40],[-10,2],[-2,-12],[-1,-2],[-13,-11],[-9,-8],[-14,-12],[-3,0],[-18,28]],[[2889,2260],[-10,16],[-13,21]],[[2866,2297],[10,8],[7,9],[15,13],[15,12]],[[2598,2003],[-63,103],[-3,4]],[[2532,2110],[11,11],[17,12],[12,7],[21,19],[46,39],[54,48],[23,20],[69,59],[5,4],[19,17],[15,12],[4,3]],[[2828,2361],[37,-61],[1,-3]],[[2730,2218],[-21,11],[-4,-10],[-2,-3],[-4,-3],[-22,-20],[0,-2],[12,-19],[0,-3],[-1,-2],[-14,-12],[-24,-21],[-27,1],[-21,1],[-1,-19],[0,-32],[5,5],[46,-2],[7,2],[9,4],[7,5],[38,33],[24,20],[5,6],[7,9],[5,13],[8,22]],[[2762,2202],[9,-3],[8,0],[9,1],[8,4],[8,6],[53,46],[-12,19],[-25,38],[-2,1],[-1,0],[-74,-63],[-1,-3],[-4,-9],[-2,-4],[-6,-17]],[[2751,2876],[-47,-38]],[[2704,2838],[-12,16],[-34,-28],[-15,-12],[-22,36],[-13,21],[-5,8],[-2,4]],[[2601,2883],[70,57]],[[2671,2940],[29,24]],[[2931,1675],[-1,-5],[0,-5],[2,-4],[3,-2],[16,-9],[3,-3],[9,-16]],[[2963,1631],[-3,-4],[-4,-5],[-3,-7],[-3,-8],[-7,1],[-6,-2],[-5,-2],[-4,-3],[-39,-32],[-4,-4]],[[2885,1565],[-4,6],[-8,15]],[[2873,1586],[44,37],[-94,31]],[[2823,1654],[49,41],[5,3],[4,1],[4,-1],[4,-3],[13,-11],[4,-2],[16,-5],[9,-2]],[[2988,1522],[-13,22],[-14,-13],[-3,0],[-26,43],[-17,-14],[26,-43],[0,-2],[-1,-2],[-14,-10],[-2,0],[-1,1],[-25,41],[-13,20]],[[2963,1631],[15,12],[51,42]],[[3029,1685],[14,12]],[[3043,1697],[11,-20],[16,-23],[10,-15],[16,-23],[-1,-2]],[[3095,1614],[-17,-15],[-18,-15],[-18,-15],[-18,-15],[-36,-32]],[[2845,1617],[-22,37]],[[2873,1586],[-9,6],[-8,5],[-5,8],[-6,12]],[[2716,1813],[2,-2]],[[2718,1811],[-13,-4],[-22,-7],[-25,-9],[-2,-1],[-13,-4],[-14,-5],[-58,-21],[-45,-16],[-29,-10]],[[2497,1734],[-1,7],[-2,6],[-3,9],[-3,9],[-3,8],[-9,15],[-4,7],[-4,6],[-2,5],[-7,20]],[[2459,1826],[42,21],[32,16],[-1,5],[-11,17],[-5,9],[-2,3],[-25,41],[-3,9],[-1,8],[-1,9],[0,5],[0,5],[2,11],[3,17],[4,16],[3,12],[0,4],[8,24]],[[2504,2058],[1,-4],[2,-2],[6,-10],[5,-9],[0,-7],[7,5],[10,8],[17,14],[0,1],[0,1],[0,1],[-11,18],[-17,27],[4,4],[4,5]],[[2459,1826],[-2,4],[-7,20],[0,1],[0,2],[0,2],[1,3],[2,10],[-1,5],[-1,4],[-3,5],[-11,22],[-10,22],[-5,6],[0,3],[-3,6],[-1,1],[-1,1],[-1,-1],[-3,-2],[-5,-5],[-3,2],[-2,1],[-2,1],[-2,2],[-2,3],[-1,1],[-6,9]],[[2390,1954],[17,12],[-2,4],[-2,4],[-3,2],[-5,4],[-4,3],[-1,0],[0,1],[0,1],[0,1],[1,1],[13,12],[1,0],[1,0],[5,-3],[1,0],[2,0],[31,27],[0,1],[2,0],[1,0],[10,-4],[8,29],[3,3],[3,4],[14,12],[18,-10]],[[2497,1734],[-12,-4],[-19,-7],[-33,-11],[-11,-4],[-11,-5],[-8,-3],[-6,-3],[-5,-3],[-4,-2],[-9,-5],[-5,-3],[-5,-3],[-6,-4],[-6,-4],[-5,-4]],[[2352,1669],[-3,6],[-3,4],[-7,11],[-10,18],[-23,41],[-25,39]],[[2281,1788],[-13,24],[-19,33],[-2,3]],[[2247,1848],[13,9],[4,3],[1,1],[4,2],[2,1],[2,1],[4,0],[5,0],[2,1],[1,0],[1,1],[2,1],[-7,13],[19,16],[16,14],[1,0],[1,0],[1,0],[10,-5],[1,0],[1,0],[1,0],[10,9],[48,39]],[[2247,1848],[-19,37],[-1,2],[-4,8],[-8,15],[-7,12]],[[2358,2080],[3,-5],[9,-14]],[[2370,2061],[-13,-13],[-20,-19],[0,-1],[0,-1],[0,-1],[11,-16],[20,-33],[2,-4],[2,-2],[4,-6],[3,-3],[2,-2],[5,-2],[2,-2],[2,-2]],[[2281,1788],[-3,-2],[-17,-14]],[[2261,1772],[-11,18],[-5,9],[-5,9],[-1,0],[-11,-9],[-17,-14],[-17,-13],[-12,20],[-17,-14],[-40,-31],[-17,-14]],[[2108,1733],[-7,12],[-2,4],[-1,2],[-2,6],[-3,13],[-1,7],[-2,9],[-2,2],[-9,17],[-5,9]],[[2074,1814],[131,103],[3,5]],[[2188,1714],[-30,-24],[-17,-13]],[[2141,1677],[-21,36]],[[2120,1713],[-12,20]],[[2261,1772],[-12,-10],[-61,-48]],[[2143,1500],[-3,5],[-1,2],[-3,4],[-24,42],[-5,9]],[[2107,1562],[71,56],[3,2],[1,1],[1,2],[0,1],[1,2],[4,11],[2,6],[5,16],[0,1],[1,2],[1,1],[14,11],[-11,20],[-12,20]],[[2352,1669],[-2,-1],[-1,-1],[-7,-5],[-19,-16],[-44,-36],[-11,-9]],[[2268,1601],[-38,-31],[-35,-28],[-26,-21],[-8,-7],[-18,-14]],[[2107,1562],[-12,19],[-12,20],[-11,21]],[[2072,1622],[52,41],[17,14]],[[7765,4113],[9,-6],[28,-21],[3,-3]],[[7805,4083],[-7,-13],[-5,-9],[-8,-15]],[[7864,4039],[-37,27]],[[7827,4066],[6,11],[5,7],[3,8],[4,7],[5,9]],[[7850,4108],[5,10],[8,13],[0,2]],[[7863,4133],[8,-6],[20,-15],[9,-6]],[[7900,4106],[-5,-9],[-2,-3],[-1,-2],[-6,-11],[-4,-8]],[[7882,4073],[-8,-16],[-4,-7],[-6,-11]],[[7910,4004],[-39,29],[-7,6]],[[7882,4073],[16,-12],[2,-2],[29,-22]],[[7929,4037],[-4,-8],[-4,-7],[-5,-7],[-6,-11]],[[7900,4106],[9,15]],[[7909,4121],[8,-6],[30,-23],[9,-6]],[[7956,4086],[0,-3],[-5,-8],[-8,-15]],[[7943,4060],[-7,-12],[-6,-10],[-1,-1]],[[7958,3968],[-48,36]],[[7943,4060],[47,-36]],[[7990,4024],[-7,-12],[-6,-12],[-4,-7],[-5,-7],[-4,-8],[-6,-10]],[[7956,4086],[5,10],[5,9]],[[7966,4105],[10,-7],[30,-22],[9,-7]],[[8015,4069],[-6,-10],[-5,-10],[-6,-9],[-8,-16]],[[7966,4105],[7,11],[12,22]],[[8035,4095],[-7,-3],[-7,-12],[-6,-11]],[[8061,4034],[-17,12],[-20,16],[-9,7]],[[8075,4061],[-2,-4],[-6,-12],[-6,-11]],[[8036,3990],[-7,5],[-30,23],[-9,6]],[[8061,4034],[-6,-10],[-5,-10]],[[8050,4014],[-6,-9],[-8,-15]],[[8486,4089],[18,31],[8,14],[13,24],[1,2],[4,7]],[[8530,4167],[19,-14],[10,-8],[21,37]],[[8580,4182],[14,26],[10,-8],[6,-5],[7,-5],[6,14],[3,-2],[3,-1],[6,-3],[-9,-46],[-3,-10],[-3,-13],[-3,-17],[0,-2],[-1,-9],[-3,-52],[-2,-19],[-14,-25]],[[8530,4167],[21,37],[10,18],[10,19]],[[8571,4241],[8,-5],[5,-4],[-6,-13],[-4,-7],[-9,-18],[15,-12]],[[8530,4167],[-14,11],[-14,11],[6,10],[9,17],[5,9]],[[8522,4225],[10,18],[10,18],[7,-5],[1,-1],[13,-9],[8,-5]],[[8522,4225],[-6,5],[-9,6],[-17,13]],[[8592,4282],[-11,-22],[-10,-19]],[[8419,4253],[-10,8],[-9,8],[-20,14],[-31,24]],[[8349,4307],[12,22]],[[8361,4329],[6,10],[0,1],[5,9],[8,14],[5,9]],[[8385,4372],[2,-1],[5,-4],[2,-1]],[[8394,4366],[57,-40],[8,-6]],[[8374,4175],[-20,15],[-18,16],[-17,13]],[[8319,4219],[-14,10]],[[8305,4229],[6,11],[6,10],[13,25],[-27,21]],[[8303,4296],[8,14],[5,9],[5,9]],[[8321,4328],[10,-7],[18,-14]],[[8354,4139],[-38,30],[-18,14]],[[8298,4183],[4,8],[6,9],[4,8],[7,11]],[[8374,4175],[-10,-18],[-10,-18]],[[8298,4183],[-35,27],[-11,8]],[[8252,4218],[4,21]],[[8256,4239],[5,25]],[[8261,4264],[10,-7],[1,-1],[33,-27]],[[8333,4102],[-50,39],[-29,22],[-11,8]],[[8243,4171],[6,29]],[[8249,4200],[3,18]],[[8354,4139],[-8,-14],[-7,-13],[-6,-10]],[[8313,4051],[-9,-24]],[[8304,4027],[-67,50],[-10,8]],[[8333,4102],[-10,-28],[-10,-23]],[[8359,4015],[-46,36]],[[8333,4102],[11,-8],[15,-11],[12,-10],[2,-3],[12,-9]],[[8385,4061],[-14,-24],[-12,-22]],[[8418,4037],[-17,13],[-6,3],[-8,6],[-2,2]],[[8408,4151],[18,-14],[30,-23],[3,-4]],[[8379,3968],[-32,26],[12,21]],[[8187,4247],[7,-6],[43,-32],[12,-9]],[[8187,4247],[9,16]],[[8196,4263],[7,-6],[36,-28],[6,-6],[7,-5]],[[8196,4263],[9,15]],[[8205,4278],[7,-6],[16,-12],[17,-14],[9,-6],[2,-1]],[[8163,4311],[33,-26],[9,-7]],[[2691,889],[2,4],[0,5],[-3,4],[-6,5],[-13,49],[16,6],[7,0],[7,-2],[20,7]],[[2721,967],[23,7]],[[2744,974],[16,5],[6,1],[5,0],[6,0],[5,-1],[11,-3],[22,-7],[26,-6],[21,-91]],[[2540,919],[-7,23],[-3,10],[-1,6],[-2,8],[-3,11],[-2,8],[-1,13],[-2,8],[-2,8],[-3,11]],[[2514,1025],[11,5],[38,14],[17,7],[6,3],[2,1]],[[2588,1055],[7,3],[18,8],[8,4],[9,7],[4,2],[5,3],[24,10],[1,0],[1,0],[1,-1],[3,-12]],[[2669,1079],[21,-85],[1,-1],[0,-1],[1,-1],[2,0],[19,7],[8,-31]],[[2509,901],[4,-14],[1,-4],[-1,-1],[-1,-2],[-24,-22],[-14,-13],[-2,-1],[-2,-1],[-1,0],[-1,0],[-1,1],[-6,9],[-10,13],[-1,2],[12,8],[13,7],[-7,22],[-7,23],[-10,-4],[-9,-5],[-19,-13],[-5,-3],[-11,-4],[-5,-1],[-4,6],[-2,4],[-2,3],[-9,10],[-4,4],[-4,3],[-9,7]],[[2368,935],[23,33],[3,4],[4,2],[32,14],[34,15],[30,14],[20,8]],[[6592,4365],[-3,-7],[-4,-10],[-2,-5],[-6,-12],[-5,-14],[-8,-19],[-3,-9],[-1,-3],[-1,-2],[-1,-2],[-1,-4],[-3,-7],[-2,-5],[-3,-7],[-3,-7],[-1,-4],[-2,-4]],[[6543,4244],[-1,-2],[-2,-4],[-2,-4],[-6,-11],[-2,-4],[-5,-9],[-1,-1],[-1,-2],[-1,-2],[-1,-3],[-1,-2],[-1,-3],[-1,-2],[-1,-2],[-1,-2],[0,-2],[-1,-3],[-1,-2],[-2,-9],[-2,-8],[0,-1],[-2,-7],[-3,-11]],[[6505,4148],[-2,-2],[-3,-2],[-2,-1],[-2,-1],[-2,-1],[-2,0],[-2,-1],[-3,0],[-1,0],[-1,1],[-1,2],[-1,2],[-1,1],[-1,2],[-1,1],[-1,2],[-1,1],[-2,1],[-1,2],[-2,1],[-1,1],[-1,1],[-1,1],[-2,1],[-2,1],[-3,1],[-3,2],[-2,0],[-4,1]],[[6454,4165],[-4,1],[-4,-13],[-6,2],[-10,5],[-12,6],[-16,8],[-18,9],[-20,9],[-11,5],[-33,16],[-21,10],[-6,3],[-8,4],[-8,3],[-14,7],[-11,6],[-6,3],[-7,3],[-7,3],[-13,7]],[[6219,4262],[-42,20]],[[6177,4282],[2,7],[1,4]],[[6204,4365],[6,30],[1,14],[2,14],[0,5]],[[6609,4409],[-2,-6],[-4,-11],[-5,-12],[-4,-9],[-2,-6]],[[6168,4189],[11,19],[8,14],[2,7],[0,2],[-1,1],[-13,6],[-13,6]],[[6162,4244],[13,34],[2,4]],[[6219,4262],[-26,-76],[-3,-7]],[[6146,4200],[3,8],[13,36]],[[3292,3603],[-60,72],[-12,11],[-19,18],[-12,20]],[[3189,3724],[0,4],[1,12],[2,4],[8,8],[9,7],[11,3],[8,1],[5,-1],[4,-2],[3,-1],[10,0],[8,4],[6,2],[1,-1],[4,0],[6,2],[4,2]],[[3224,3604],[-65,68]],[[3159,3672],[4,4],[7,17],[3,9],[5,10],[7,5],[4,4],[0,3]],[[3221,3312],[0,5],[11,9],[-3,4],[-10,-9],[-3,5],[-4,1]],[[3212,3327],[-2,4]],[[3210,3331],[9,6],[-8,14],[6,9],[58,44],[-110,173]],[[3165,3577],[-32,48]],[[3133,3625],[-1,2],[-11,13],[-23,35]],[[3098,3675],[2,-2],[9,-5],[9,-5],[21,0],[12,3],[7,5],[1,1]],[[3210,3331],[-8,14],[-34,58]],[[3168,3403],[4,3],[9,7],[4,2],[5,1],[14,3],[4,2],[6,3],[11,8],[14,13],[-30,45],[-14,21],[-3,2],[-2,1],[-14,1],[-22,1]],[[3154,3516],[-1,15],[-4,17],[-8,13]],[[3141,3561],[9,5],[15,11]],[[3168,3403],[-22,37]],[[3146,3440],[-4,8],[-13,22]],[[3129,3470],[15,12],[4,5],[3,5],[2,5],[1,6],[0,13]],[[2978,3381],[-26,55],[-8,20]],[[2944,3456],[40,13],[17,6],[13,5],[6,3],[7,4],[16,9],[14,8],[21,15],[13,8],[3,3]],[[3094,3530],[32,21]],[[3126,3551],[15,10]],[[3129,3470],[-3,-2],[-13,-8],[-21,-17],[-7,-6],[-8,-5],[-5,-3],[-1,-1],[-6,-4],[-7,-4],[-20,-10],[-25,-12],[-22,49],[-3,2],[-5,-1],[-6,-4],[-3,-4],[0,-5],[22,-45],[-18,-9]],[[3049,3625],[7,5],[50,-17],[-1,-16],[1,-4],[10,-23],[10,-19]],[[3094,3530],[-19,40],[-26,55]],[[3049,3625],[-8,15]],[[3041,3640],[-8,18]],[[3033,3658],[6,-2],[54,-16],[40,-15]],[[3033,3658],[-4,1],[-9,3],[-12,3],[-60,12],[-156,27]],[[2792,3704],[-113,19],[-42,8]],[[2637,3731],[22,72]],[[2659,3803],[17,3],[8,4],[8,1],[8,0],[8,-2],[25,-2],[4,-2],[27,-1],[18,-5],[3,-2],[6,0],[12,-2],[6,-3],[17,-2],[8,-1],[19,0],[12,0],[10,-2],[2,-3],[2,0],[4,0],[2,3],[5,3],[4,4],[1,5],[3,2],[16,6],[9,1],[1,-1],[6,0],[11,-3],[17,-7],[15,-11],[4,-3],[11,-15],[6,-2],[5,0],[5,-4],[23,-3],[4,-13],[4,-5],[4,-3],[4,-6],[6,-7],[8,-5],[4,-5],[8,-5],[10,-2],[12,-5],[3,-2],[0,-3],[-4,-5],[-1,-4],[3,-6],[5,-7],[1,-1]],[[2591,3556],[0,-13],[2,-12],[2,-9]],[[2595,3522],[-12,-5],[-5,-3],[-3,9],[-2,9],[-1,5],[1,20],[0,20],[1,16],[-1,7],[-3,7],[-8,18],[-13,-8],[-11,-5],[-19,-7],[-5,-3],[-24,-25],[-1,-4],[25,-55],[-10,-6]],[[2504,3512],[-8,-2],[-11,-3],[-7,-4],[-13,-9],[-22,-13]],[[2443,3481],[-13,25],[-1,2]],[[2429,3508],[4,2],[4,4],[3,10],[7,12],[5,10],[5,8],[6,9],[6,7],[7,8],[3,6],[3,4],[4,0],[4,6],[10,17],[2,3],[1,1],[22,12],[10,8],[5,6],[5,4],[4,4],[0,3],[2,6],[-2,22],[1,6],[1,5],[1,4],[1,6],[12,23],[4,11],[14,32],[11,15],[8,8],[14,2],[11,3],[13,4],[19,4]],[[2637,3731],[-2,-28],[-2,-17]],[[2633,3686],[-4,0],[-4,1],[-4,-1],[-3,-2],[-2,-3],[-2,-3],[-7,-34],[-7,-29],[-5,-29],[-4,-30]],[[2595,3522],[5,-14],[8,-17]],[[2608,3491],[-18,-9],[-18,-4]],[[2572,3478],[-4,-1],[-3,-1],[-4,-3],[-6,-6],[-21,-15],[-3,-4],[-4,-6]],[[2527,3442],[-15,12],[10,17],[-9,20],[-9,21]],[[2577,3262],[-4,-7],[-3,-8]],[[2570,3247],[-4,2],[-3,3],[-4,8],[-2,3],[-2,1],[-2,0],[-2,-1],[-3,-2]],[[2548,3261],[-14,29],[-18,38],[-10,23],[-3,-2],[-4,-2],[-3,0],[-4,2],[-35,25],[-5,11],[-33,69]],[[2419,3454],[2,6],[2,5],[5,5],[15,11]],[[2527,3442],[9,-8],[-12,-21],[10,-22],[-17,-11],[19,-40],[25,-54],[6,-11],[10,-13]],[[2582,3267],[-5,-5]],[[2572,3478],[8,-19],[-16,-11],[25,-54],[1,-4],[1,-3],[-1,-4],[-2,-5],[-5,-8],[-5,-4],[-6,-5],[-3,-2],[12,-27],[20,-46]],[[2601,3286],[-19,-19]],[[2757,3266],[-8,-5],[-1,-3],[-13,-10],[-6,-5],[-10,-8],[-5,-4],[-26,-25],[-10,13],[-21,-20],[-13,-14],[-16,-17]],[[2628,3168],[-31,68],[-9,20],[-6,11]],[[2601,3286],[11,10],[10,5],[6,3],[20,8],[18,8]],[[2666,3320],[27,11]],[[2693,3331],[21,-49],[9,-20],[28,16],[6,-12]],[[2634,3148],[-38,-46]],[[2596,3102],[-12,27],[-21,43],[-12,7]],[[2551,3179],[3,11],[8,28],[6,24],[2,5]],[[2628,3168],[11,-15],[-5,-5]],[[2678,3129],[-20,-9],[-2,0],[-5,5],[-6,10],[-11,13]],[[2757,3266],[2,-3],[7,-17]],[[2766,3246],[5,-7],[21,-16],[8,-8]],[[2800,3215],[-2,0],[-14,-18],[-19,-21],[-7,-7],[-7,-6],[-16,-10],[-23,-10],[-25,-10],[-9,-4]],[[2678,3129],[7,-21],[5,2],[10,4],[2,-2],[8,-26],[-1,-2],[-40,-17],[7,-23],[28,-45],[3,0],[29,24],[12,-19]],[[2671,2940],[-10,22],[-9,20],[-10,21],[-6,12],[-10,22],[-4,9],[-5,12],[-9,20],[-12,24]],[[2800,3215],[9,-13]],[[8632,4758],[-10,-26]],[[8622,4732],[-11,6],[-47,23],[-11,6]],[[8553,4767],[10,26]],[[8563,4793],[11,-5],[47,-24],[11,-6]],[[8563,4793],[5,13],[4,13]],[[8572,4819],[11,-5],[48,-24],[11,-5]],[[8642,4785],[-10,-27]],[[8572,4819],[9,23]],[[8581,4842],[11,-6],[39,-19],[9,-5],[10,-5]],[[8650,4807],[-8,-22]],[[2920,2824],[-68,-57]],[[2852,2767],[-16,-14],[-7,-3],[-6,-3],[-16,-5],[-8,-3],[-7,-6],[-17,-14]],[[2731,2651],[-19,10],[-11,6],[-12,9],[-13,12],[-13,15],[-10,13],[-7,12],[-8,13],[-11,18],[6,6],[3,4],[6,13],[3,5],[4,6],[5,4],[29,24],[21,17]],[[2847,2897],[-8,-22],[-8,-22],[-4,-9],[-1,-17],[0,-3],[6,-3],[6,-1],[7,-4],[6,-5],[6,-10],[17,15],[17,14],[16,13],[13,-19]],[[2689,2588],[-18,29],[-45,75],[-3,5],[-11,17],[-14,23],[-44,76],[-9,19],[-1,4]],[[2544,2836],[57,47]],[[2582,2544],[16,13],[-1,3],[0,3],[5,4],[6,5],[-10,20],[-8,19],[-14,19],[-6,25],[-6,23],[-10,22]],[[2554,2700],[-17,42],[-14,36],[0,4],[1,2],[-10,19],[27,30],[3,3]],[[2689,2588],[-3,-2],[-20,-17],[-14,-5],[-16,-7],[-12,-10],[-20,-17],[-10,-5],[-12,19]],[[2506,2663],[-5,10],[-12,30],[-18,-10],[-6,-4],[-9,-5],[-4,-1],[-8,-2],[0,6],[-1,3],[-2,9],[-5,14],[-11,-8],[-3,-1],[-2,0],[-2,2],[-7,11],[-5,6],[-3,1],[-2,-1],[-8,-12]],[[2393,2711],[-16,16],[-32,-45]],[[2345,2682],[-12,31],[10,11],[7,10],[5,7],[5,7],[7,11],[5,9],[2,4]],[[2374,2772],[2,3],[2,6],[4,10],[3,6],[5,16],[9,28],[6,20],[6,17],[11,19],[12,19],[30,33],[11,12],[12,14],[2,2]],[[2489,2977],[14,-34],[24,-63],[17,-44]],[[2554,2700],[-17,-13],[-25,-19],[-6,-5]],[[2506,2663],[22,-55],[4,-12],[3,-8],[1,-11],[-1,-9],[-4,-10],[-8,2],[-3,-1],[-17,-8],[-6,-3],[-6,0],[-7,2]],[[2484,2550],[-5,3],[-4,0],[-4,-1],[-3,-1],[-9,23],[-11,29]],[[2448,2603],[-2,6],[-1,16],[0,22],[-14,0],[-2,2],[-6,13],[-6,10],[-6,8],[-9,9],[-14,15],[5,7]],[[2448,2603],[-73,-26]],[[2375,2577],[-5,12],[-14,-8],[-6,-5]],[[2350,2576],[-14,-13],[-8,22],[-12,29]],[[2316,2614],[1,3],[10,6],[4,4],[9,12],[13,17],[7,11],[-15,15]],[[2484,2550],[-1,-9],[-2,-5],[-7,-3],[16,-41],[5,-3],[6,0],[8,5],[7,7],[17,10],[3,-7]],[[2536,2504],[-147,-124]],[[2389,2380],[-6,11]],[[2383,2391],[38,27],[19,18],[33,29],[2,4],[0,5],[-6,15],[-17,-8],[-7,19],[-17,-8],[-27,71],[-19,-6],[-7,20]],[[2582,2544],[-46,-40]],[[2383,2391],[-38,92],[-9,23]],[[2336,2506],[4,1],[6,2],[9,5],[14,15],[0,2],[0,2],[-4,10],[-3,9],[-4,9],[-5,11],[-3,4]],[[2389,2380],[-9,-10],[54,-98]],[[2434,2272],[-6,-12]],[[2428,2260],[-6,11],[-36,62]],[[2386,2333],[-6,8],[-3,4],[-14,7],[-17,8],[-7,4],[-24,10]],[[2315,2374],[9,24],[7,22],[13,-6],[3,0],[3,1],[-12,30],[-3,8],[-1,3],[3,8],[-1,3],[-20,9],[-1,1],[-2,3],[-6,18],[-9,23],[8,4],[6,5],[4,4],[8,4]],[[2324,2538],[12,-32]],[[2315,2374],[-16,8]],[[2299,2382],[-23,11]],[[2276,2393],[8,24],[-6,3],[-6,5],[-3,4],[-3,4],[-2,5],[-20,55],[-8,21]],[[2236,2514],[19,10],[42,21],[2,2],[3,3],[5,5],[5,3],[4,2],[8,-22]],[[2236,2514],[-12,34],[-2,6],[16,17],[-9,21]],[[2229,2592],[14,15],[38,44],[2,2],[4,-14],[0,-2],[4,-10],[8,-22],[17,9]],[[2229,2592],[-2,3],[-15,39]],[[2212,2634],[10,14],[4,5],[13,17],[15,18],[7,7],[2,3]],[[2263,2698],[4,6],[39,54],[5,3],[3,1],[13,28],[19,27]],[[2346,2817],[14,-10],[-9,-18],[23,-17]],[[2095,2473],[-3,7],[-2,6],[-11,23],[-5,8],[-12,18]],[[2062,2535],[3,10],[3,7],[2,6],[2,5],[5,4],[5,4],[11,7],[5,2],[17,10],[1,1],[1,2],[1,1],[2,2],[4,11],[1,3],[4,11],[2,9],[3,16],[3,3],[29,27],[11,15],[1,2],[16,25],[6,6],[14,12],[13,11],[2,2]],[[2229,2749],[23,-33],[11,-17],[0,-1]],[[2212,2634],[-93,-136],[-24,-25]],[[8316,4362],[-21,16],[-11,8]],[[8284,4386],[6,26],[5,23]],[[8295,4435],[8,-6],[5,-3],[23,-16],[8,-6]],[[8339,4404],[-6,-10],[-6,-11],[-5,-10],[-6,-11]],[[8361,4329],[-18,13],[-27,20]],[[8339,4404],[35,-24],[11,-8]],[[8321,4328],[-17,13],[-14,11],[-11,8]],[[8279,4360],[5,26]],[[8303,4296],[-31,24]],[[8272,4320],[4,20]],[[8276,4340],[3,20]],[[8261,4264],[5,26],[4,19],[2,11]],[[8261,4264],[-11,9],[-34,25]],[[8216,4298],[7,12],[5,9],[6,-5],[14,25]],[[8248,4339],[9,-7],[7,-6],[8,-6]],[[8163,4311],[11,20]],[[8174,4331],[9,-7],[33,-26]],[[8093,3982],[-43,32]],[[8103,4039],[-2,-2],[-6,-13],[-6,-11],[15,-11],[-6,-10],[-5,-10]],[[8093,3982],[22,-17],[4,-3]],[[8119,3962],[-10,-6],[-6,-12],[-1,-4]],[[8145,4008],[-2,-3],[-7,-12],[-6,-11],[-5,-10],[-6,-10]],[[8176,3947],[-9,8],[-6,-11],[-6,-9],[-36,27]],[[8191,3973],[-3,-4],[-12,-22]],[[8176,3947],[-11,-19],[11,-9],[8,-6],[2,-1],[8,-6],[5,-4]],[[8210,3953],[0,-10],[-3,-10],[-7,-26]],[[8210,3953],[31,-23],[22,-17]],[[8263,3913],[-6,-17],[-4,-9],[-5,-16]],[[8211,3993],[63,-48]],[[8274,3945],[-5,-15],[-3,-8],[-3,-9]],[[8217,4034],[11,-8],[28,-22],[16,-12],[15,-12]],[[8287,3980],[-8,-21],[-5,-14]],[[8304,4027],[-8,-22],[-9,-25]],[[8340,3939],[-17,13],[-9,7],[-9,7],[-8,7],[-10,7]],[[8322,3908],[-48,37]],[[8306,3879],[-43,34]],[[8286,3843],[-38,28]],[[2488,1435],[-4,0],[-63,-53]],[[2421,1382],[-3,12],[2,2],[5,6],[1,3],[2,3],[1,3],[0,2],[0,4],[1,5],[0,7],[-1,3],[-1,7],[-1,7],[-2,5],[-1,4],[-1,4],[-3,5],[-6,10],[-6,11],[-5,6],[-5,6],[-5,4],[-3,2],[-5,1],[-7,0],[-6,-1],[-6,-3],[-6,-3],[-6,-5],[-6,-5],[-6,-8]],[[2342,1479],[-9,9],[-28,47],[-4,5],[-4,9],[-4,10],[-5,9],[-8,13],[-9,15],[-3,5]],[[2352,1669],[3,-4],[12,-20],[3,-5],[19,-33],[22,-36]],[[2411,1571],[33,-54],[2,-2],[20,-35],[8,-14],[7,-15],[7,-16]],[[2323,1305],[-2,8],[-1,5],[-3,20]],[[2317,1338],[17,3],[4,2],[-3,23],[-6,30],[-2,21],[-1,6]],[[2326,1423],[1,4],[0,5],[1,9],[2,11],[3,10],[4,8],[5,9]],[[2421,1382],[-92,-76],[-6,-1]],[[2202,1373],[-30,53],[-3,13],[-1,7],[-5,9],[-10,17],[-11,18],[-3,6]],[[2139,1496],[4,4]],[[2326,1423],[-19,-4],[-38,-7],[-18,-4],[-3,-1],[-17,-13],[-29,-21]],[[2194,1305],[-2,4],[-4,8],[-3,7],[-1,12],[1,11],[3,8],[5,9],[9,9]],[[2317,1338],[-7,-2],[-5,-2],[-7,-5],[-14,-17],[-9,16],[-8,15],[-1,0],[-1,0],[-1,0],[-1,0],[-35,-27],[-2,-2],[-3,-17],[-5,-23],[-6,5],[-1,1],[-3,3],[-9,15],[-5,7]],[[2323,1305],[-90,-81],[-47,74]],[[2186,1298],[8,7]],[[7804,4647],[-29,23],[-9,7],[3,3],[-9,7],[-1,1],[-10,8]],[[7749,4696],[6,11],[6,11],[6,11],[6,12]],[[7773,4741],[3,6],[3,5],[6,12]],[[7785,4764],[6,11],[6,11]],[[7797,4786],[10,-7],[8,-6],[3,-2],[8,-6],[8,-6],[24,-17]],[[7858,4742],[-10,-18],[-11,-18],[-28,-49],[-5,-10]],[[7735,4771],[38,-30]],[[7667,4823],[6,11],[6,11]],[[7679,4845],[68,-52],[38,-29]],[[7679,4845],[6,12],[6,11]],[[7691,4868],[67,-53],[39,-29]],[[7691,4868],[6,11],[6,12]],[[7703,4891],[10,-8],[57,-45]],[[7770,4838],[39,-29]],[[7809,4809],[-6,-12],[-6,-11]],[[7770,4838],[6,11],[6,12],[6,11],[6,11]],[[7794,4883],[29,-22],[1,-1],[9,-7]],[[7833,4853],[-3,-5],[-9,-17]],[[7821,4831],[-3,-5],[-3,-6],[-6,-11]],[[7703,4891],[5,11],[7,12]],[[7715,4914],[5,11],[6,11]],[[7726,4936],[39,-30],[29,-23]],[[7726,4936],[6,11],[6,11],[6,12],[4,7]],[[7748,4977],[28,-15],[47,-23]],[[7823,4939],[-5,-11],[-6,-11],[-6,-11],[-6,-11],[-6,-12]],[[7839,4866],[-6,-13]],[[7856,4899],[-8,-16],[-4,-7],[-5,-10]],[[6142,4224],[1,-1],[2,0],[1,1],[1,1],[9,30],[1,6],[-1,5],[-2,8],[-4,7],[-6,7],[-7,5],[-15,6],[-10,4],[-9,4],[-11,2]],[[6092,4309],[-23,4],[-4,0],[-10,1],[-8,0],[-11,0],[-21,-4],[-18,-4],[-18,-6],[-14,-6],[4,-14],[6,-16]],[[5975,4264],[-18,7],[-15,-12],[-9,-10],[-13,-29],[-6,-19],[13,-12]],[[5788,4199],[24,46],[2,3],[3,7]],[[6092,4309],[-5,-32]],[[7976,3282],[-12,10],[-32,25],[-9,4],[-11,9]],[[7883,3395],[16,26],[11,52],[1,8],[2,7],[5,22],[2,7]],[[7962,3259],[-6,5],[-7,5]],[[7949,3269],[-17,14],[-4,3],[-5,4],[-4,3],[-20,16]],[[7949,3269],[-7,-13],[-4,-7],[-19,7],[-37,29]],[[7815,3256],[-6,-5],[-32,-22],[-12,-12],[-11,-14],[-4,-5],[0,-1],[-14,-20],[-24,-52],[-20,-36],[-2,-4],[-1,-4]],[[7689,3081],[-27,1],[-12,2],[-10,3],[-18,4],[-22,0],[-21,2],[-10,1],[-3,1],[-10,1],[-9,1],[-33,1],[-17,0],[-7,-2],[-6,-2],[-20,-7]],[[7392,3091],[6,1],[21,5],[6,2],[3,2],[4,3],[50,79],[9,13],[21,31],[37,54],[23,23],[23,15],[9,5],[7,19],[2,3],[8,20]],[[7717,3768],[3,4],[6,11]],[[7726,3783],[10,17]],[[7736,3800],[4,0],[14,-10],[26,-20],[1,-2],[32,-25],[14,-10],[24,-18],[23,-17]],[[7874,3698],[7,-6],[54,-41],[1,-6],[0,-7],[1,0],[0,-3],[1,-3],[1,-6],[4,-7],[4,-7]],[[7789,3124],[-7,-8],[-9,-10],[-8,-8],[-10,-7],[-3,-2],[-1,-4],[0,-2],[1,-6],[1,-7],[2,-7],[-3,-8],[-9,-10],[-9,-12],[-6,-16],[0,-10],[1,-8],[6,-16],[12,-13],[3,-1],[3,-2],[4,-5],[6,-4],[3,-1]],[[7609,2999],[11,21],[-11,14],[3,7],[4,5],[3,2],[4,2],[34,8],[8,3],[7,4],[2,1],[5,2],[4,4],[3,4],[3,5]],[[7834,3031],[-27,-27]],[[7807,3004],[-23,-22]],[[7844,2969],[-20,18],[-17,17]],[[7866,3000],[-8,-10],[-7,-11],[-7,-10]],[[7891,2976],[-22,-32]],[[7869,2944],[-9,9],[-7,7],[-9,9]],[[7869,2944],[-1,-2],[-18,-25]],[[7962,4215],[-8,6],[-61,47]],[[7893,4268],[5,9],[5,8],[8,16]],[[7911,4301],[9,-7],[46,-35],[6,-4]],[[7972,4255],[8,-7]],[[7951,4197],[-7,6],[-61,46]],[[7883,4249],[5,10],[5,9]],[[7938,4173],[-9,7],[-51,38],[-9,7]],[[7869,4225],[8,15],[6,9]],[[7938,4173],[-12,-21]],[[7926,4152],[-9,7],[-51,38],[-9,7]],[[7857,4204],[12,21]],[[7909,4121],[-9,7],[-20,15],[-8,5]],[[7872,4148],[6,10],[5,10],[-23,17],[-10,7],[7,12]],[[7926,4152],[-7,-12],[-10,-19]],[[7911,4301],[12,-2],[8,14],[13,23]],[[7944,4336],[51,-40],[-12,-22],[-6,-10],[-5,-9]],[[7944,4336],[6,11],[6,11]],[[7956,4358],[51,-40],[9,-7]],[[8016,4311],[-12,-22]],[[8004,4289],[-13,-22],[-11,-19]],[[7911,4301],[-28,22]],[[7883,4323],[11,19],[12,22]],[[7906,4364],[13,22]],[[7919,4386],[8,-6],[11,-8],[9,-7],[9,-7]],[[7883,4323],[-2,2],[-10,8],[-2,1],[-14,11],[-10,7]],[[7845,4352],[11,19]],[[7856,4371],[13,22]],[[7869,4393],[9,-7],[18,-13],[8,-7],[2,-2]],[[8041,4261],[-26,20],[-2,1],[-9,7]],[[8016,4311],[14,25]],[[8668,4346],[15,-7],[14,-6]],[[8697,4333],[0,-1],[6,-2],[-22,-87],[0,-2],[6,-3],[-14,-42],[5,-2],[-14,-43],[6,-3],[-6,-19],[-8,-23],[6,-3],[-14,-41],[-9,-55],[-5,-24]],[[8790,4543],[-73,-117],[-20,-93]],[[8600,4440],[6,8],[3,7],[0,2],[1,2],[1,2],[1,2],[1,2],[0,1],[1,2],[1,1],[0,2],[1,1],[6,15],[12,31],[9,24]],[[8643,4542],[9,-5],[22,-11],[9,25],[8,21],[4,10],[1,2],[4,11]],[[8700,4595],[6,-3],[9,-4]],[[8715,4588],[9,-5],[10,-5],[4,-2],[13,-6],[20,-13],[4,-2],[11,-9],[4,-3]],[[8846,4618],[-16,-6],[0,-3],[-40,-66]],[[8715,4588],[8,21],[7,20]],[[8730,4629],[8,22],[7,19]],[[8745,4670],[11,-5],[19,-10],[16,-5],[17,-9],[1,-1],[1,0],[1,-1],[2,-1],[3,-2],[4,-3],[21,-13],[5,-2]],[[8944,4779],[-48,-16],[-20,-40],[0,-3],[65,21],[-7,-29],[-60,-20],[5,-12],[4,0],[1,-7],[-36,-12],[3,-15],[43,14],[0,-1],[0,-24],[-48,-17]],[[8745,4670],[10,27],[10,26]],[[8765,4723],[10,-5],[19,-10],[5,11],[4,12],[-19,10],[-11,5]],[[8773,4746],[10,25],[9,24]],[[8792,4795],[5,13],[5,16],[9,25],[1,4]],[[8812,4853],[9,-5],[28,-15],[3,-4],[2,-2],[7,-4],[28,-15],[3,1],[2,-1],[7,-4],[43,-25]],[[8978,4870],[-35,-70],[23,7],[6,-19],[-28,-9]],[[8812,4853],[5,13],[4,13],[-25,13],[-9,4],[9,24]],[[8796,4920],[11,-6],[13,-6],[9,-5],[24,-13],[7,-4],[5,12],[4,11]],[[8869,4909],[11,-6],[2,-1],[39,-21],[13,-7],[40,-4],[4,0]],[[9015,4945],[-37,-75]],[[8869,4909],[-31,17],[-22,11]],[[8816,4937],[5,12],[22,-11],[7,16],[11,28],[9,23]],[[8870,5005],[10,-5],[17,-9],[14,-7],[45,-21],[6,-3],[3,-1],[20,-6],[26,-8],[4,0]],[[9039,4992],[-24,-47]],[[8870,5005],[-11,6],[-12,6]],[[8847,5017],[-10,6]],[[8837,5023],[9,24]],[[8846,5047],[10,-5],[13,-7],[12,-6],[8,22]],[[8889,5051],[10,-5]],[[2120,1713],[-52,-40],[-10,18],[-1,2],[-1,1],[-1,0],[-1,0],[-10,0],[-18,-2],[-1,-1],[-1,-1],[-1,-1],[1,-22],[-42,-33],[-10,-8],[0,-1],[-1,0],[0,-1],[0,-1],[0,-1],[11,-17],[-18,-14],[-11,-10]],[[1953,1581],[-19,-14]],[[1855,1672],[44,3],[18,15],[157,124]],[[1813,1646],[-1,3],[-5,8],[-5,10]],[[1802,1667],[-19,41],[11,7],[8,4],[-10,20],[18,8],[20,5],[8,1],[11,4]],[[1849,1757],[18,-40],[13,-30],[7,1],[6,2],[7,4],[12,8],[6,6]],[[1918,1708],[94,73],[17,14]],[[2029,1795],[19,16],[19,15]],[[2067,1826],[7,-12]],[[1849,1757],[-1,1],[-13,30],[0,3],[43,26],[9,-20],[41,25],[-10,19]],[[1918,1841],[16,10],[3,-1],[33,-73],[-35,-29],[-27,-18],[10,-22]],[[1802,1667],[-19,-11]],[[1702,1781],[17,11],[20,12]],[[1892,1898],[9,-19],[8,-19],[9,-19]],[[1926,1919],[18,11],[18,12]],[[1962,1942],[17,-37],[20,-44],[10,-22],[20,-44]],[[2102,1961],[-11,-7],[-14,-9],[-6,-3],[-4,-1],[-10,-1],[-1,-20],[8,-15],[30,22],[10,-19],[-25,-19],[-15,-12],[0,-3],[10,-17],[11,-19],[-18,-12]],[[1962,1942],[9,6],[3,5],[1,7],[0,11]],[[2022,1996],[7,-3],[31,28],[7,-20],[4,-9],[11,8],[1,-1],[9,-17],[10,-21]],[[7900,4857],[-7,-19]],[[7893,4838],[-9,5],[-33,17],[-2,1],[-10,5]],[[7879,4801],[-8,5],[-37,19],[-2,1],[-11,5]],[[7893,4838],[-7,-18],[-7,-19]],[[7882,4725],[-24,17]],[[7879,4801],[-4,-12],[-3,-8],[26,-13],[-6,-17],[-10,-26]],[[7902,4711],[-20,14]],[[7893,4838],[9,-4],[30,-15],[9,-4]],[[7941,4815],[-7,-19]],[[7934,4796],[-6,-19]],[[7928,4777],[-8,-20]],[[7920,4757],[-7,-19]],[[7913,4738],[-5,-11],[-6,-16]],[[7920,4757],[11,-6],[9,-5],[7,-3],[7,-4],[1,-4],[-3,-9],[-4,-9],[-4,-1],[-6,4],[-7,4],[-7,6],[-7,5],[-4,3]],[[7959,4671],[-3,2],[-2,2],[-4,2],[-40,29],[-8,5]],[[7928,4777],[9,-4],[44,-22],[10,-4]],[[7991,4747],[-15,-40],[-5,-10],[0,-6],[-2,-5],[-10,-15]],[[7934,4796],[10,-4],[44,-23],[9,-4]],[[7997,4765],[-6,-18]],[[7941,4815],[9,-5],[44,-22],[9,-5]],[[8003,4783],[-6,-18]],[[8010,4802],[-7,-19]],[[7948,4833],[9,-5],[44,-22],[9,-4]],[[8017,4820],[-7,-18]],[[7961,4869],[9,-4],[45,-22],[9,-4]],[[8024,4839],[-7,-19]],[[8031,4857],[-7,-18]],[[7975,4906],[9,-4],[44,-22],[9,-5]],[[8037,4875],[-6,-18]],[[8044,4894],[-7,-19]],[[7934,4949],[9,-5],[26,-13],[3,-2],[10,-4]],[[7982,4925],[9,-5],[44,-22],[9,-4]],[[8051,4912],[-7,-18]],[[7982,4925],[6,18],[9,22]],[[7997,4965],[10,-4],[42,-21],[10,-5]],[[8059,4935],[-8,-23]],[[7934,4949],[6,18],[4,11],[4,12],[39,-20],[10,-5]],[[8004,4985],[-7,-20]],[[7924,5025],[10,-5],[61,-30],[9,-5]],[[7942,5060],[8,-4],[3,-1],[26,-13],[13,-6],[16,-8],[9,-5]],[[8017,5023],[-6,-19],[-7,-19]],[[3044,2793],[-31,52],[-16,-13],[-17,-15],[-21,-17],[-12,18],[-11,19]],[[2936,2837],[44,37]],[[2980,2874],[78,63]],[[3058,2937],[11,-18]],[[3069,2919],[10,-18],[22,-37],[-38,-29],[-14,-11],[13,-23],[-18,-8]],[[2980,2874],[-13,21]],[[2949,2928],[63,51],[14,11],[-15,25],[14,16],[37,-60],[3,0],[14,11],[-11,19],[-17,28],[0,3],[1,2],[14,17],[7,7],[13,12],[-8,21]],[[3078,3091],[20,15]],[[3098,3106],[10,-25]],[[3108,3081],[27,-80],[5,-15],[3,-8]],[[3143,2978],[-21,-16],[-10,-6],[-9,-2],[-7,0],[-12,-2],[-6,-2],[-7,-3],[-13,-10]],[[2881,3114],[4,-11],[8,-14],[40,-65],[2,0],[14,11],[18,15],[17,13],[43,35],[3,2],[3,-1],[9,-12],[11,-17],[25,21]],[[2901,3123],[19,6]],[[2920,3129],[12,2],[20,5],[16,5],[15,9],[11,8],[9,8],[8,7],[18,23]],[[3029,3196],[44,-52],[16,-21],[9,-17]],[[2920,3129],[0,25],[-1,40],[5,17],[7,18],[9,12],[12,12],[12,8],[20,11],[-7,24]],[[2977,3296],[19,8],[8,-22],[5,-18],[5,-11],[6,-10],[9,-11],[14,-18]],[[3043,3214],[-14,-18]],[[1823,2038],[-7,16],[-4,7],[-18,15],[-6,7],[-10,22]],[[1757,1958],[-2,3],[-10,21],[-10,21],[-11,24]],[[1724,2027],[-9,19],[-2,6],[-3,1],[-29,-22],[-15,32]],[[1671,1904],[-17,36]],[[1654,1940],[19,12],[10,-21],[2,0],[7,4],[7,6],[0,3],[-3,8],[-6,12],[-3,5],[-10,22],[18,13],[29,23]],[[1654,1940],[-9,21],[-19,41],[-4,16],[-5,18],[-3,4]],[[6347,2548],[-57,41],[-14,-20],[-11,-7],[-18,12],[-15,12],[-15,3]],[[5577,3559],[-3,-3],[-24,-38]],[[5550,3518],[-20,-25],[-22,-30],[-15,-20],[-4,-4]],[[5489,3439],[-18,-24],[-35,-45]],[[5402,3321],[42,-43],[3,-4],[16,-17],[4,-3],[21,-23],[6,-6],[3,-3]],[[5497,3222],[6,-5],[4,-5],[6,-9],[5,-9],[6,-15],[4,-19],[3,-17]],[[4365,2120],[-83,83],[-2,3],[-88,154],[-32,58],[41,62],[-121,125]],[[4080,2605],[22,17],[8,5],[8,3],[44,10],[3,-17],[2,-6],[3,-6],[6,-11],[3,-4],[4,-5],[21,-22],[36,-40],[5,-14],[72,16],[5,1],[77,19],[156,37],[10,0],[11,14],[17,22],[70,92],[38,51],[16,10],[27,-27],[28,36],[0,4],[-18,21],[32,38],[5,5],[6,4],[7,1],[7,0],[6,-1],[7,-4],[12,-7],[12,-5],[12,-7],[10,-6],[5,-2],[5,0],[2,0],[3,0],[2,0],[-9,12],[-12,16],[-2,3],[-3,4],[-3,3],[-3,4],[-4,4],[-4,5],[-2,3],[-5,5],[-6,7],[-6,6],[-7,8],[-4,3],[-5,5],[-2,2],[14,-1],[12,-1],[42,-4],[30,-3],[11,-1],[36,-4],[37,-3],[20,-2],[18,-2],[-2,6],[-3,9],[6,69],[2,3],[5,63],[2,12],[2,12],[2,4],[8,19],[2,3],[8,12],[11,14],[54,69],[41,52],[43,55],[66,86],[4,10],[3,2],[2,4],[2,5],[3,4],[7,10],[2,2]],[[5300,3421],[5,8],[14,18],[6,8],[5,8],[6,15],[4,13],[3,19],[0,12],[4,2],[3,9],[8,17],[3,6],[2,5],[1,5],[-1,26]],[[5363,3592],[15,2],[15,-15],[22,28]],[[5415,3607],[7,9],[14,19],[3,3],[2,-2],[38,-40],[11,14]],[[5490,3610],[6,8],[1,0],[1,0],[1,0],[1,-1],[11,-11],[5,0],[19,1],[-1,-1],[-1,-1],[-1,-1],[0,-2],[1,-23],[6,1],[8,0],[5,0],[4,-1],[3,-2],[14,-14],[4,-4]],[[5031,3567],[1,-25],[-34,-3],[-22,0],[-9,-1],[-13,-1],[2,-21],[6,-20],[-11,-3],[-8,-7],[-5,-7],[42,-44],[-1,-2],[-23,-33],[-17,-27]],[[4939,3373],[-17,18],[-13,14],[-6,6],[-14,14],[-15,16],[-8,4],[-6,2],[-6,2],[-5,3],[-8,8],[-1,3],[-1,5],[1,8],[2,4],[7,7],[6,4],[5,3],[3,3],[5,5],[10,12],[-17,18],[-1,3],[-15,16],[-10,12],[-3,0],[-4,3]],[[4828,3566],[41,50],[7,7],[4,4],[6,3],[5,2],[5,2],[16,3],[7,1]],[[4919,3638],[34,2],[21,2]],[[4974,3642],[19,0]],[[4993,3642],[0,-3],[1,-20],[1,-23],[1,-31],[35,2]],[[4939,3373],[-15,-17],[-26,-27],[-10,-10],[-67,68],[-71,76],[-4,4],[82,99]],[[5031,3567],[23,1],[6,0],[8,-2],[33,1],[16,1],[36,4],[6,0],[6,-10],[6,-7],[40,-42]],[[5211,3513],[-2,-3],[-63,-81],[-28,-37],[-4,-4],[-3,-2],[-11,-5],[-8,21],[-2,3],[-22,-10],[-26,-12],[-3,-1],[-1,0],[-3,2],[-35,36],[-12,-20],[-13,-17],[-13,-16],[-5,-7],[-3,-3],[-15,16]],[[5211,3513],[31,-33],[28,-27],[27,-29],[3,-3]],[[4080,2605],[-28,43],[1,0],[12,10],[97,81],[7,5],[12,36],[1,2],[1,0],[2,2],[11,4],[1,3],[8,4],[0,7],[1,4],[4,1],[-1,5],[3,2],[2,3],[-2,3],[0,3],[-4,1],[-4,0],[-4,-1],[-4,-1],[-3,1],[3,8],[-1,5],[-6,34],[4,4],[5,4],[-1,6],[0,1],[-2,8],[4,7],[8,6],[12,8],[16,14],[-7,17],[-9,19],[-26,49],[-27,50]],[[4166,3063],[-48,44],[-61,58],[10,4]],[[4067,3169],[42,48],[-19,22]],[[4158,3361],[36,-47],[23,30],[20,-20],[11,12],[65,-62],[31,40],[20,-24],[37,44],[5,0],[4,2],[1,5],[14,11],[23,-1],[33,29],[-26,28],[-1,1],[-42,47]],[[4412,3456],[31,18],[15,11],[0,1],[32,19],[8,5],[45,28],[3,1]],[[4546,3539],[7,5],[36,22],[69,39],[28,16],[125,75],[36,22]],[[4847,3718],[20,-11],[51,-58],[1,-11]],[[5211,3513],[15,21],[30,39],[24,32]],[[5280,3605],[15,-20],[5,6],[2,0],[3,-2],[3,-5],[-6,-9],[16,-17],[25,32],[6,1],[14,1]],[[5374,3648],[16,-17],[7,9],[8,-8],[0,-1],[-6,-8],[16,-16]],[[5280,3605],[18,24],[6,8],[12,16]],[[5316,3653],[8,-3],[12,-11],[21,28],[17,-19]],[[6777,2060],[-58,37]],[[7388,3093],[-11,5]],[[7377,3098],[-28,13],[-10,1],[-8,-1],[-7,-1],[-8,-3],[-38,-10],[-18,-3],[-26,0],[-16,0]],[[7350,3037],[3,8],[4,0],[2,7],[-4,6],[21,38]],[[7376,3096],[1,2]],[[7338,3047],[12,27],[5,9],[4,7],[17,6]],[[5555,4114],[-40,-28]],[[5515,4086],[-46,-34],[-46,-34],[-2,-4],[-11,-8],[-2,3],[-16,18],[-3,4],[-2,3],[-2,2],[-3,3]],[[5524,4010],[-20,-25]],[[5504,3985],[-13,14],[-4,4],[-14,14],[-14,-19],[-16,-20],[-29,-36]],[[5414,3942],[-16,14],[-10,10],[-4,4],[-9,10]],[[5375,3980],[-3,3],[-7,7],[-21,22],[-3,2]],[[5341,4014],[39,24]],[[5515,4086],[11,-22],[-11,-6],[-10,-7],[-8,-6],[7,-11],[8,-11],[6,-7],[6,-6]],[[5504,3985],[35,-37]],[[5539,3948],[-14,-19],[-36,38],[-14,-19],[36,-38],[44,-47]],[[5526,3826],[-34,36]],[[5492,3862],[-11,11],[-67,69]],[[5539,3948],[46,-47]],[[5610,4014],[8,0],[3,-1],[2,-4],[-2,-4],[-3,-2],[-5,-2],[0,-3],[0,-8],[-1,-8],[11,-3],[9,-5],[-5,-12],[0,-3],[2,-2],[3,-5],[7,-6]],[[5524,4010],[5,-5],[11,-8],[11,20],[11,18],[11,-8],[7,-6],[9,-6],[9,-5],[9,-3],[5,0],[-2,7]],[[5610,4014],[-1,3],[-3,7],[-3,7],[11,6],[2,2],[5,6]],[[7592,2355],[0,-1],[-1,-4],[-1,-3],[0,-2],[-4,-17],[-2,-7],[-1,-4],[-4,-17],[-3,-14],[-2,-9],[-1,-3],[-1,-3],[-11,-43],[-1,-4]],[[7560,2224],[-3,-11],[0,-1],[0,-1],[0,-1],[-1,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-2],[0,-1],[0,-1],[0,-2],[0,-2],[1,-5],[0,-2],[0,-1],[1,-1],[0,-2],[0,-1],[1,-1],[0,-2],[1,-1],[0,-1],[0,-1],[1,-3],[1,-1],[1,-2],[0,-1],[1,-1],[0,-2],[1,-1],[1,-1],[1,-2],[0,-1],[1,-2],[1,-1],[2,-2],[6,-9],[6,-7],[13,-18],[6,-9],[2,-2],[2,-2],[2,-2]],[[7613,2099],[-2,-2],[-2,-2],[-1,-1],[-5,-6],[-2,-2],[-40,-40],[-4,-4],[-2,-2],[-3,-3],[-34,-26],[-130,-88],[-4,-3],[-72,-34],[-42,-22],[-24,-13],[-96,-72],[-58,-45],[-38,-41],[-22,-27],[-8,-10],[-4,-4],[-4,-4],[-20,-25],[-18,-25],[-31,-53],[-9,-13]],[[7473,2222],[2,2],[12,16],[4,5],[3,4],[5,8],[27,40],[8,10],[9,7],[5,5],[41,36],[1,1],[2,-1]],[[7590,1280],[-53,-103],[-2,-4]],[[6457,1354],[28,-19],[5,-11],[2,-2],[3,-2],[1,-2],[2,-1],[0,-1],[3,-3],[2,-2],[3,-4],[1,-4],[2,-3],[1,-2]],[[6510,1298],[-12,-4],[-3,-1],[-91,-29],[-6,-2],[-38,-10],[-21,-6],[-75,-24],[-4,-2],[-6,-2]],[[6254,1218],[0,5],[-1,35],[-22,0],[-23,-1]],[[6208,1257],[0,65]],[[6208,1322],[22,0],[0,32],[15,36],[3,8],[1,4],[1,3],[-6,4],[-11,6],[-10,6],[-54,37],[-9,6],[-7,4]],[[6153,1468],[-1,1],[-7,4],[-4,3],[-6,3],[-7,3],[-7,3],[-6,3],[-7,2]],[[6153,1321],[-1,100],[0,37],[0,6],[1,4]],[[6208,1322],[-19,0],[-18,-1],[-18,0]],[[6172,1257],[-19,0]],[[6153,1257],[0,64]],[[6208,1257],[-19,0],[-17,0]],[[6153,1257],[-17,-1],[-18,0],[-12,1]],[[6105,1421],[12,0],[17,0],[1,-100],[18,0]],[[6137,1181],[-19,-6]],[[6118,1175],[0,5],[-8,12],[-5,57],[1,8]],[[6172,1257],[0,-60],[-18,-5],[-18,-6],[1,-5]],[[6254,1218],[-22,-7],[-95,-30]],[[5468,3830],[-27,27],[-2,1],[-2,-1],[-40,-52],[-39,-52],[15,-16],[13,-13]],[[5386,3724],[-13,-18]],[[5373,3706],[-13,13],[-16,16],[-3,-2],[-4,-6],[-18,-22],[-18,-24],[1,-12],[14,-16]],[[4993,3642],[21,2],[21,1],[22,1],[10,2],[8,2],[8,5],[8,8],[7,8],[10,17],[9,15],[1,3]],[[5118,3706],[12,19],[13,22],[13,20]],[[5156,3767],[13,19],[16,19],[14,17],[26,30],[11,9],[16,10],[7,5],[14,11],[42,41],[19,18],[6,4],[22,19],[10,9],[3,2]],[[5492,3862],[-3,-3],[-13,-17],[-8,-12]],[[5468,3830],[11,-12],[-14,-20],[-14,-18],[-3,2],[-10,9],[-13,-15],[-10,-15],[9,-13],[-1,-5],[-25,-32],[-12,13]],[[5601,3534],[-24,25]],[[5490,3610],[-26,28],[7,10],[-13,14],[-11,11],[-3,1],[-6,-6],[-2,-1],[-1,1],[-9,10],[-3,3],[-12,12],[-11,-15]],[[5400,3678],[-4,4],[-23,24]],[[5400,3678],[-4,-2],[-22,-28]],[[8925,5145],[-10,6],[-8,4],[-5,2],[-1,1],[-10,5]],[[8908,5098],[-10,-24],[-10,6],[-14,8],[-10,5]],[[8889,5051],[-10,5],[-14,8],[-10,6]],[[8846,5047],[-11,6],[-18,9],[-10,6]],[[8807,5068],[9,23]],[[8837,5023],[-11,6],[-19,10],[-10,5]],[[8797,5044],[-11,6],[-19,10],[-10,5]],[[8757,5065],[9,25],[10,-6],[20,-11],[11,-5]],[[8776,4996],[11,25],[10,23]],[[8847,5017],[-5,-11],[-4,-12],[-11,6],[-10,-26],[-41,22]],[[8816,4937],[-11,6],[-12,6]],[[8793,4949],[-29,16]],[[8764,4965],[5,12],[6,15],[1,4]],[[8796,4920],[-12,6],[5,12],[4,11]],[[8812,4853],[-10,5],[-16,8],[-9,6]],[[8777,4872],[-41,21]],[[8736,4893],[10,25],[4,12],[5,12],[-23,12],[1,2],[3,8],[5,13]],[[8741,4977],[23,-12]],[[8792,4795],[-11,5],[-31,17]],[[8750,4817],[6,11],[8,17],[11,23],[2,4]],[[8750,4817],[-38,21]],[[8712,4838],[5,11],[8,16],[6,14],[4,11],[1,3]],[[8728,4768],[-10,6],[-18,9],[-11,5]],[[8689,4788],[6,16],[6,11],[5,11],[6,12]],[[8750,4817],[-5,-11],[-6,-11],[-4,-10],[-1,-2],[-6,-15]],[[8773,4746],[-10,5],[-24,12],[-11,5]],[[8765,4723],[-11,5],[-24,12],[-10,5]],[[8720,4745],[8,23]],[[8745,4670],[-11,6],[-23,12],[-10,5]],[[8701,4693],[9,26],[10,26]],[[8730,4629],[-9,5],[-25,13],[-11,5]],[[8685,4652],[8,21],[8,20]],[[8685,4652],[-7,-21]],[[8678,4631],[-11,5],[-18,9],[-11,5],[8,19],[0,2],[9,22],[7,19]],[[8662,4712],[10,-5],[13,-6],[5,-3],[11,-5]],[[8700,4595],[-20,10],[-10,5]],[[8670,4610],[8,21]],[[8661,4587],[-36,19],[-4,1],[-39,19]],[[8582,4626],[5,11],[4,12]],[[8591,4649],[8,21]],[[8599,4670],[7,19],[1,2]],[[8607,4691],[8,22],[7,19]],[[8622,4732],[11,-5],[10,-5],[8,-4],[11,-6]],[[8670,4610],[-5,-11],[-4,-12]],[[8643,4542],[9,24]],[[8652,4566],[4,11],[5,10]],[[8652,4566],[-35,17],[-4,2],[-10,-24],[-2,1],[-7,4],[-20,10],[-10,5]],[[8564,4581],[10,24]],[[8574,4605],[8,21]],[[8545,4525],[10,29],[0,3],[9,24]],[[8545,4525],[-2,1],[-9,5],[-11,5],[-17,4],[-36,5]],[[8470,4545],[12,30],[6,15],[9,24],[5,14],[4,11]],[[8506,4639],[36,-19],[22,-10],[2,-1],[8,-4]],[[8506,4639],[4,10],[4,11]],[[8514,4660],[10,-5],[26,-13],[20,-10],[2,-1],[10,-5]],[[8514,4660],[4,12],[4,11]],[[8522,4683],[10,-5],[49,-24],[10,-5]],[[8522,4683],[8,21]],[[8530,4704],[9,-5],[2,0],[47,-24],[11,-5]],[[8530,4704],[8,21]],[[8538,4725],[11,-5],[47,-24],[11,-5]],[[8538,4725],[8,22]],[[8546,4747],[7,20]],[[5016,1222],[4,-1],[16,-1],[4,-5],[1,-11],[-2,-4],[-2,-2],[-4,-2],[-13,-4],[-8,-2],[-4,0],[-8,4],[-5,0],[-2,-1],[-4,-2],[-4,-6],[-2,-9],[-4,-6],[-8,-6],[-6,-4],[-3,-8],[-3,-3],[-15,-6],[-7,-4],[-12,-3],[-11,0],[-13,4],[-16,12],[-13,12],[-3,2],[-1,3],[-8,3],[-5,1],[-3,1],[-3,1],[-2,0],[-2,0],[-9,-3],[-9,-10],[-7,-1],[-6,-2],[-4,2],[-4,2],[-9,5],[-6,6],[-2,0],[-5,4],[-3,0],[-5,1],[-4,0],[-3,1],[-5,3],[-2,1],[-4,-1],[-2,-10],[-3,-4],[-9,2],[-2,2],[-1,0]],[[4741,1173],[-2,3],[1,20],[-2,4],[-5,2],[-2,20]],[[4731,1222],[11,-2],[3,0],[16,1],[4,0],[4,1],[11,4],[8,8],[2,0],[0,1],[1,2],[2,2],[2,2],[3,3],[4,4],[5,3],[13,8],[13,5]],[[4833,1264],[26,5],[11,2],[15,2],[20,6]],[[4905,1279],[4,1],[17,2],[19,0],[6,-30],[3,-25],[4,-24],[38,9],[8,1],[6,-3],[5,0],[1,9],[0,3]],[[5122,1221],[0,-4],[3,-15]],[[5125,1202],[-8,2],[-10,1],[-20,1],[-5,0],[-4,-1],[-18,-2],[-2,2],[-6,6],[-8,10],[-4,2],[-11,2],[-9,0],[-4,2]],[[5016,1227],[1,8],[17,0],[0,33],[-18,1],[0,12]],[[5016,1281],[11,0],[26,-1],[11,-2],[11,-7],[9,-8],[10,-12],[5,-9],[10,-10],[7,-7],[6,-4]],[[1506,1092],[-3,7],[-2,7],[-3,45],[-11,27]],[[1560,1505],[64,-17]],[[1624,1488],[14,-49],[22,-78],[23,-80],[29,-62],[4,-7],[2,-5],[3,-3],[4,0],[5,1]],[[1983,1486],[7,-12],[33,-54],[4,-7]],[[1624,1488],[2,-1],[26,11],[10,4],[2,4],[9,4],[5,-7],[6,8],[8,7],[7,7],[34,24],[3,3],[16,12],[9,11],[15,23],[12,16],[13,17]],[[6475,2834],[-8,6],[11,20],[0,17],[-12,8],[2,12],[4,14],[10,16],[-5,4],[-2,1],[-2,2]],[[7999,2859],[-7,9],[-7,7],[-5,4],[-2,3]],[[7978,2882],[3,3],[32,42],[2,2],[4,6],[8,10],[12,16],[0,1],[20,25],[5,7],[4,5],[3,2]],[[7920,2741],[-10,27]],[[7910,2768],[-8,17],[-1,2],[-1,4]],[[7900,2791],[15,15],[8,9],[15,17],[7,8],[11,14],[14,17],[8,11]],[[7978,2882],[-2,4],[-1,2],[-1,3],[-4,6],[-2,3],[-8,10],[-8,9]],[[7900,2791],[-1,1],[-1,3],[-3,5],[-2,6],[-2,3],[-2,5],[-4,5],[-8,11],[-15,19],[-2,3],[14,7],[-26,13],[-8,4],[-13,7]],[[7850,2917],[3,0],[2,-2],[1,-3],[4,-4],[8,-9],[8,10],[4,6],[2,3],[14,18]],[[7896,2936],[7,-6],[2,-1],[15,-12],[13,-10],[15,14],[3,-3],[1,1]],[[8723,2851],[-10,7],[-12,6],[-16,5],[-40,13],[-5,1],[-2,1],[-32,10],[-33,10],[-2,-1],[-4,1],[-21,7],[-4,2],[-3,2],[-7,2],[-10,4],[-13,7],[-13,10],[-7,7],[-4,3],[-10,12],[-7,10],[-6,9],[-5,11],[-3,9],[-1,2],[-3,11],[-2,6]],[[8448,3018],[7,2],[1,2],[1,6],[6,35],[3,22],[2,20],[0,2],[0,2],[-1,0],[-6,4],[-1,1],[2,5],[0,5],[0,9],[0,3],[2,23],[1,24],[-1,21]],[[8595,3755],[-7,-33],[-50,-139],[0,-2],[26,1],[27,75],[3,0],[3,15],[13,-16],[-22,-123],[8,-1],[-10,-57],[-89,-6],[-17,-47],[0,-1],[98,9],[-7,-30],[-97,-10],[-4,-25],[54,6],[0,-5],[-54,-6],[-4,-19],[97,13],[-6,-32],[-90,-12],[6,-49],[1,-11],[4,-26],[6,0],[0,-5],[4,-1],[5,20],[11,1],[-3,-27],[3,0],[2,8],[2,0],[4,15],[22,-3],[0,-13],[2,0],[-7,-113],[1,0],[0,-3],[-9,-131],[2,-5],[3,1],[0,-6],[6,0],[1,-2],[4,-1],[0,8],[6,-1],[7,103],[13,173],[1,2],[8,-1],[30,0],[-11,-169],[22,-2],[12,159],[3,41],[3,50],[0,7],[5,49],[3,18],[10,75],[3,27],[2,8],[3,2],[2,1],[3,-2],[5,-4],[-1,-102],[-1,-17],[1,-81],[1,-12],[-2,-19],[-1,-22],[0,-16],[0,-20],[0,-18],[8,-43],[0,-13],[1,-2],[7,-55],[14,-111],[3,-10],[6,-18],[7,-21],[16,-33],[13,-30],[2,-4]],[[8376,2911],[3,3],[31,28],[3,1],[8,-1],[7,0],[9,-1],[9,2],[7,1],[4,2],[6,-1],[5,0],[7,0],[0,3],[-6,6],[-2,3],[-3,6],[-4,5],[-3,5],[-4,6],[-3,5],[-1,4],[-2,4],[-3,6],[-8,-7],[-2,1],[2,21],[-7,0],[-4,-33],[-11,-10],[4,41],[-7,-1],[-6,-50],[-21,-20],[-5,-4]],[[8379,2936],[2,3],[7,29]],[[8388,2968],[4,21],[3,23],[14,2],[30,2],[2,0],[3,1],[4,1]],[[8448,3018],[-6,26],[-6,19],[-3,11],[-1,3],[-6,12],[-7,11],[-8,8],[-3,3],[-6,4],[-28,19],[-10,6],[-4,3],[-16,10],[-11,7],[-7,4],[-32,26]],[[8294,3190],[1,3],[1,2],[1,4],[20,46],[5,12],[4,9],[4,12]],[[8388,2968],[-29,17],[-2,2],[-40,25],[-8,-19],[-6,-12],[-31,5],[-11,2],[-11,3],[-9,6],[-6,4],[-3,4],[-6,6]],[[8226,3011],[12,23],[9,22],[15,37],[6,16],[1,4],[3,9],[2,6],[2,6],[5,15],[10,29],[1,5],[0,1],[1,2],[1,3],[0,1]],[[8159,3023],[17,28]],[[8176,3051],[50,-40]],[[8226,3011],[-12,-25],[-14,-27]],[[8379,2936],[-3,-4],[-3,-2],[-15,-12],[-32,-27],[-30,-28],[-8,-9],[-3,-2]],[[2357,1179],[-39,-11],[-36,-9],[-22,-6],[-35,-9]],[[2225,1144],[-10,35],[-1,4],[-25,84],[-4,7],[-10,19]],[[2175,1293],[10,5],[1,0]],[[2323,1305],[6,-15],[-1,-3],[1,-5],[2,-8],[6,-19],[1,-6],[3,-12],[3,-11],[6,-24],[7,-23]],[[2439,1152],[8,-30],[-9,-3],[-11,-4],[-9,-3],[-10,-4],[-10,-3],[-18,-7],[-2,0],[2,-9]],[[2380,1089],[-36,-13],[-48,-17],[0,-1],[0,-2],[0,-1],[18,-70],[-39,-11]],[[2275,974],[-2,7],[-2,6],[-9,32],[-7,26],[-30,99]],[[2357,1179],[3,-15],[3,-8],[50,12],[20,6],[3,-9],[3,-13]],[[2421,1382],[2,-8],[3,-10],[0,-3],[3,-10],[6,-24],[12,-48],[6,-24],[-11,-4],[3,-11],[3,-12],[4,-19],[2,-4]],[[2454,1205],[-1,-2],[11,-42],[-25,-9]],[[2454,1205],[58,20],[25,9],[4,2]],[[2541,1236],[10,-39]],[[2551,1197],[-3,-2],[8,-25],[-1,-5],[-1,-2],[-1,-2],[-2,-3],[-7,-2],[4,-18],[4,-16],[-6,-1],[-1,0],[-3,2],[-1,0],[-22,-7],[0,-1],[-1,-1],[0,-1],[10,-34],[-20,-9],[-32,-17],[-37,-17],[-40,-17],[-2,9],[-4,11],[-4,16],[-2,10],[-7,24]],[[2582,1092],[-3,-1],[-7,-3],[-1,-1],[-26,-12],[-56,-24],[-90,-41],[-55,-22],[-22,-7],[-38,-10],[-6,-2]],[[2278,969],[-3,5]],[[2551,1197],[13,-40],[5,-8],[3,-2],[2,0],[3,-1],[9,3],[15,6],[42,15],[-4,16]],[[2639,1186],[4,2],[45,15],[1,0],[1,-1],[5,-19],[0,-2],[0,-1],[-49,-22],[7,-28],[69,31],[48,22]],[[2770,1183],[46,21]],[[2816,1204],[1,-6]],[[2817,1198],[-2,-1],[-153,-69],[-74,-33],[-6,-3]],[[2607,1311],[3,-11],[1,-1],[13,0],[5,0],[9,2],[2,-11],[4,-13]],[[2644,1277],[-6,-2],[-3,0],[-13,0],[-1,-14],[0,-6],[3,-11],[11,-44],[4,-14]],[[2541,1236],[-30,118],[-5,16]],[[2506,1370],[13,4],[7,-24],[10,4],[3,0],[35,-7],[1,-1],[1,-2],[4,-17],[6,-20],[1,-3],[20,7]],[[2488,1435],[4,-9],[2,-9],[12,-47]],[[2757,1440],[59,-236]],[[2770,1183],[-5,22],[-1,1],[-2,1],[-7,-3],[-15,55],[-5,22],[-9,25],[-1,1],[-1,1],[-1,0],[-1,0],[-11,-4],[-7,-4]],[[2704,1300],[-5,17],[-2,8],[21,7],[1,1],[-4,17],[0,13],[-7,29],[-8,31],[-1,1],[-1,0],[-60,0],[-7,1],[-1,-1],[0,-1],[0,-4],[7,-25],[-20,-7],[-27,-9],[6,-24],[11,-43]],[[2488,1435],[22,3],[247,2]],[[2704,1300],[-13,-6],[-6,-3],[-20,-7],[-21,-7]],[[2537,873],[-2,-1],[-2,-2],[-12,-7],[-2,-3],[-13,-9],[-12,-13],[6,-11],[2,2],[1,-1],[-2,-3],[-4,-3],[-10,11],[-4,-3],[-11,-11],[-14,-16],[-3,-2],[-3,-1],[-4,-4],[-4,-6],[-5,-3],[-5,-6],[0,-2],[0,-2],[-15,-18],[-2,-3],[-1,-1],[-3,0],[-3,-1],[-2,-4],[-8,-4],[-13,-1],[-3,1],[-13,1],[-12,2],[-13,0],[-16,-4],[-2,-2],[-5,-5],[-3,-1],[-2,-1],[-1,-1],[-11,-5],[-6,-4],[7,-19],[-4,-3],[-4,10],[-1,0],[2,-8]],[[2228,744],[9,10],[9,8],[10,5],[16,7],[43,17],[23,9],[21,8],[-11,38],[-13,45],[0,2],[1,0],[1,1],[1,0],[4,-1],[6,-2],[6,-3],[5,-4],[22,7],[-2,3],[-4,5],[-4,5],[-6,4],[-7,4],[-9,4],[-10,2],[-11,0],[-1,1],[-7,23]],[[2320,942],[10,1],[13,-1],[8,-2],[5,-1],[12,-4]],[[2215,729],[-2,5],[-6,23],[-6,19],[2,4],[6,7],[1,3],[-1,2],[-1,3],[-7,8],[-29,101],[17,6],[5,1],[8,3],[22,6],[73,19],[10,2],[13,1]],[[1879,863],[27,8],[14,3],[32,8],[56,16],[46,12],[17,4],[70,20],[124,31],[13,4]],[[2582,1092],[3,-15],[1,-6],[0,-4],[2,-8],[0,-4]],[[2104,990],[13,2],[5,1],[5,3],[3,3],[4,5]],[[2134,1004],[4,-5],[4,-3],[11,-19],[1,-1],[1,0],[38,10],[20,6],[4,-10],[2,-9],[4,-12],[52,13]],[[2134,1004],[2,3],[2,7],[1,6],[0,8],[-1,7],[-5,23],[17,5],[0,2],[0,3],[-2,7],[-3,5],[-3,5],[-5,6],[-5,5],[-2,5],[-2,5],[-5,18],[20,5],[5,-18],[2,-5],[4,-3],[5,-2],[4,1],[20,7],[22,10],[-5,19]],[[2200,1138],[25,6]],[[2096,1141],[41,12],[-3,9],[1,4],[2,7],[2,6],[25,-1],[16,-1],[3,0],[4,1],[6,-20],[-4,-10],[6,-5],[5,-5]],[[2069,1205],[-4,19],[0,3],[1,2],[37,8],[-8,26],[-6,23],[16,6],[3,3],[7,-23],[41,14],[12,4],[7,3]],[[2023,1318],[25,12],[16,9],[5,2],[1,1],[26,-42],[12,11],[22,21],[30,18],[24,-49],[2,-3]],[[2030,1408],[6,4],[50,41],[36,29],[17,14]],[[1953,1581],[11,-19],[9,-15],[1,-3],[77,61],[21,17]],[[6461,6069],[4,24],[18,-5],[8,-1]],[[6491,6087],[1,-12],[-2,-13],[-1,-5]],[[6489,6057],[-1,-4],[-2,-9],[-25,25]],[[6489,6057],[26,-26],[4,-4]],[[6519,6027],[-1,-5],[-4,-13],[-2,-10],[-6,-28],[-2,-8]],[[6504,5963],[-4,3],[-4,1],[-24,19]],[[6472,5986],[2,6],[2,11],[5,22],[-25,19],[5,25]],[[6326,5854],[4,-2],[25,-26],[2,1],[2,0],[2,-3],[1,-3],[33,-23]],[[6395,5798],[-2,-6],[-3,-5],[-3,-2],[-5,-3],[-6,-5],[-3,-1],[-3,-4],[-12,-26],[-3,-6]],[[6355,5740],[-10,-23],[-5,-11]],[[6340,5706],[-16,8],[-4,-11],[-2,-14],[-11,-39],[-5,1],[-1,-10],[-5,-14],[-7,-3]],[[6289,5624],[-4,-1],[-5,-2]],[[6280,5621],[-14,15],[-18,23],[-3,6],[0,1],[-16,-8],[-5,4],[-6,6],[-5,7],[-5,9],[-4,9],[0,7],[5,15],[5,9],[2,4],[9,13],[3,9],[11,25],[5,10],[3,8],[5,8],[22,24],[5,5],[2,2],[1,3],[0,13],[12,16],[3,6],[0,10],[13,31],[5,7],[1,1],[5,4],[8,4],[8,8],[1,-2],[-5,-5],[5,0],[4,2],[9,9],[25,29],[0,2],[3,-1],[3,5],[4,10],[2,1],[0,-5],[-1,-10],[-4,-10],[-8,-14],[-7,-9],[-8,-6],[-7,-3],[-14,-13],[-10,-10],[-1,-1],[-5,-11],[-6,-13],[-4,-13],[-1,-5],[1,-1],[0,-3],[-4,-7],[-1,-5],[-3,-6],[0,-4],[-9,-12],[0,-23],[-2,-13],[-5,-15],[0,-4],[-1,-5],[-2,-7],[-1,-13],[2,-1],[2,3],[2,-1],[-3,-12],[7,-2],[2,3],[3,6],[5,13],[1,6],[2,9],[1,8],[-1,26],[1,16],[5,5],[6,6],[-1,4],[1,5],[3,12],[3,4]],[[6407,6036],[-3,-8],[-3,9],[-3,0],[-2,2],[0,10],[1,8],[5,23],[0,6],[3,9],[6,11],[1,1],[6,-3],[1,-9],[-2,-14],[-4,-19],[-4,-8],[-2,-6],[0,-12]],[[6428,5995],[1,7],[3,10],[4,5]],[[6436,6017],[3,-9]],[[6439,6008],[-11,-13]],[[6395,6005],[-1,0],[-3,3],[0,2],[2,0],[3,0],[0,-2],[0,-1],[-1,-2]],[[8581,4842],[7,19],[4,9]],[[8592,4870],[5,10],[4,10]],[[8601,4890],[44,-24],[16,-8],[10,-6]],[[8671,4852],[-9,-16],[-1,-2],[-5,-11],[-2,-4],[-4,-12]],[[8689,4788],[-8,-23],[-11,5],[-7,4],[-6,3],[-15,8]],[[8671,4852],[3,6]],[[8674,4858],[10,-6],[28,-14]],[[8674,4858],[6,12],[7,16],[9,24],[1,4]],[[8697,4914],[11,-6],[28,-15]],[[8601,4890],[7,18],[7,16],[5,12],[5,12],[1,3]],[[8626,4951],[34,-18]],[[8660,4933],[4,-2],[33,-17]],[[8660,4933],[10,25],[9,24]],[[8679,4982],[9,23]],[[8688,5005],[29,-15],[8,-5],[16,-8]],[[8626,4951],[-8,5],[-61,32]],[[8557,4988],[4,5],[7,19],[10,24]],[[8578,5036],[9,23]],[[8587,5059],[10,-5],[46,-24],[11,-7],[-9,-23],[34,-18]],[[8601,4890],[-42,22],[-23,12]],[[8536,4924],[3,10],[3,10]],[[8542,4944],[4,17],[10,24],[1,3]],[[8592,4870],[-62,34]],[[8530,4904],[3,10],[3,10]],[[8563,4793],[-11,5],[-40,20],[-9,5]],[[8503,4823],[9,26],[9,23],[6,21],[3,11]],[[8546,4747],[-11,6],[-39,20],[-10,4]],[[8486,4777],[7,20]],[[8493,4797],[10,26]],[[8538,4725],[-11,5],[-40,20],[-9,5]],[[8478,4755],[8,22]],[[8514,4660],[-12,6],[-38,19],[-10,5]],[[8454,4690],[8,23],[8,21]],[[8470,4734],[8,21]],[[8470,4734],[-11,5],[-45,23],[-13,6]],[[8401,4768],[7,21]],[[8408,4789],[13,-6],[45,-23],[12,-5]],[[8454,4690],[-12,6],[-5,2],[-37,18],[-13,7]],[[8387,4723],[7,24],[7,21]],[[8436,4644],[-10,5],[-42,21],[-12,6]],[[8372,4676],[7,25]],[[8379,4701],[8,22]],[[8454,4690],[-9,-22],[-9,-24]],[[8379,4701],[-74,37]],[[8305,4738],[8,22],[16,43]],[[8329,4803],[8,21]],[[8337,4824],[10,-4],[48,-24],[13,-7]],[[8337,4567],[-45,9]],[[8292,4576],[-1,13],[-2,30],[-2,38],[1,2],[0,6],[0,7],[-2,1],[0,5],[1,8],[1,5],[3,10],[5,12],[9,25]],[[8372,4676],[-3,-9],[-2,-6],[-3,-10],[-5,-15],[-9,-29],[-1,-3],[-8,-26],[-4,-11]],[[8436,4644],[-9,-24],[-5,-16],[-14,-38],[0,-2],[-3,-9]],[[8405,4555],[-3,1],[-65,11]],[[8378,4487],[-9,5],[-36,21],[-2,1],[-10,6]],[[8321,4520],[7,20],[7,20],[2,7]],[[8405,4555],[-3,-7],[-2,-2],[-8,-20],[-6,-17],[0,-3],[-8,-19]],[[8434,4454],[-9,5],[-6,4],[-34,19],[-7,5]],[[8405,4555],[65,-10]],[[8470,4545],[-5,-13],[-8,-20],[-8,-19]],[[8449,4493],[-8,-20],[-7,-19]],[[8524,4473],[-9,5],[0,-3],[-3,-7],[-4,-10],[-51,30],[-8,5]],[[8501,4414],[-12,7]],[[8489,4421],[-35,21],[-1,0],[-11,7],[-8,5]],[[8418,4414],[7,20],[9,20]],[[8489,4421],[-4,-10],[-4,-9],[0,-4],[-3,-7],[-4,-9],[-47,27],[-9,5]],[[8394,4366],[10,18],[7,14],[7,16]],[[8339,4404],[5,9],[6,10],[6,11],[5,14]],[[8361,4448],[8,-5],[14,-8],[18,-10],[8,-5],[9,-6]],[[8361,4448],[8,19],[9,20]],[[8361,4448],[-9,6],[-32,18],[-2,1],[-10,6]],[[8308,4479],[7,20],[6,21]],[[8295,4435],[6,21],[7,23]],[[4188,1444],[-4,25],[-6,25],[-4,24],[-5,31],[14,-2],[26,0],[17,-1],[24,-1]],[[4250,1545],[6,-30],[4,-19],[4,-18],[3,-17],[4,-17],[4,-17]],[[4275,1427],[-25,-1],[-17,0],[-21,-1],[-19,-5],[-5,24]],[[4296,1317],[4,-22],[6,-30]],[[4306,1265],[-4,2],[-4,2],[-5,2],[-12,4],[-9,2],[-4,0],[-6,1],[-8,36],[-19,-1],[-52,-3]],[[4183,1310],[-4,23],[-5,23],[-11,56]],[[4163,1412],[-5,24],[30,8]],[[4275,1427],[3,-18],[3,-17],[4,-19],[4,-19],[3,-17],[4,-20]],[[2744,974],[-8,32],[25,9],[9,3],[1,1],[2,1],[1,2],[4,8],[16,26],[16,30],[17,27],[-11,46],[0,1],[-1,1],[-1,0],[-20,-9],[-22,-10],[-25,-11],[-1,-1],[0,-1],[0,-1],[2,-10],[0,-1],[0,-1],[-11,-5],[-26,-12],[-21,-10],[-21,-10]],[[6481,5902],[-5,-12]],[[6476,5890],[-44,30],[-8,-14],[-4,-8],[-3,-9],[0,-1],[-1,-4],[-1,-3],[-5,-20],[36,-25],[4,-3]],[[6450,5833],[-10,-23],[-9,-19]],[[6431,5791],[-1,2],[-3,2],[-10,6],[-17,12],[-5,-15]],[[6326,5854],[2,3],[3,2],[2,1],[7,7],[2,7],[0,4],[6,8],[2,4],[3,3],[0,-4],[2,-5],[2,0],[1,2],[0,7],[1,6],[15,21],[8,11],[6,4],[7,3],[8,7],[6,5],[5,7],[6,11],[5,17],[3,10]],[[6439,6008],[33,-22]],[[6472,5986],[-6,-15],[28,-20],[3,-1],[-2,-7],[-5,-16],[-4,-11],[-5,-14]],[[6504,5963],[14,-11],[9,-7],[12,-4],[19,-13],[19,-15]],[[6577,5913],[-6,-12],[-11,-22],[-11,-23]],[[6549,5856],[-64,43],[-4,3]],[[6552,6028],[60,-67]],[[6612,5961],[-14,-17],[-2,-3],[-12,-18],[-7,-10]],[[6519,6027],[22,-23],[11,24]],[[6636,5872],[-22,15],[-37,26]],[[6612,5961],[58,-61]],[[6670,5900],[-6,-6],[-2,-2],[-3,-2],[-4,-3],[-2,-1],[-3,-1],[-9,-6],[-3,-3],[-2,-4]],[[6596,5793],[-9,6],[-16,12],[4,9],[-33,23],[7,13]],[[6636,5872],[-6,-12],[-11,-22]],[[6619,5838],[-12,-22],[-11,-23]],[[6714,5822],[4,-5],[6,-4],[7,-5],[11,-8],[11,-8]],[[6753,5792],[-1,-3],[-9,-16],[-8,-17]],[[6735,5756],[-9,5],[-46,32],[-3,3],[0,2],[-58,40]],[[6636,5872],[6,-6],[53,-34],[17,-13],[2,3]],[[6670,5900],[11,15],[7,7]],[[6688,5922],[38,-61],[5,-6],[5,-7]],[[6736,5848],[-9,-10],[-13,-16]],[[6688,5922],[13,11],[14,13]],[[6715,5946],[49,-74],[-15,-13],[-13,-11]],[[2102,1961],[17,11],[13,9],[12,10],[3,2],[1,1],[2,2]],[[2063,2107],[15,-34],[6,-11],[7,-11],[4,-5],[8,-10],[6,-7],[1,-2],[10,-9],[19,-14],[11,-8]],[[1983,2132],[10,12],[3,2],[3,0],[2,-1],[12,-27],[3,-6],[3,-4],[4,-4],[2,-5],[6,-14],[28,16],[1,3],[3,3]],[[2063,2107],[1,2],[10,4],[-9,19],[7,5],[7,3],[4,2]],[[2083,2142],[19,0],[9,-1],[0,-22],[7,0],[8,1],[7,3],[9,-19],[8,-18],[9,-19],[8,-20],[13,-19]],[[2083,2142],[0,20],[-9,0],[-11,25],[0,3],[7,18],[-14,8],[4,6],[7,15],[7,15],[6,12],[8,11],[7,9]],[[2095,2284],[10,-8],[2,-4],[3,-8],[13,-27],[17,10],[18,11],[18,11],[16,11],[17,11]],[[2209,2291],[11,-29]],[[2220,2262],[18,-51],[2,-5],[4,-4],[5,-4],[28,-16],[-2,-5],[-8,-23]],[[2063,2107],[-16,36],[-31,70],[-12,25],[-19,42]],[[1985,2280],[87,59],[28,17],[-14,41]],[[2086,2397],[5,19]],[[2091,2416],[6,-2],[3,-4],[23,-50],[-15,-9],[-9,-7],[-2,-2],[-1,-4],[-6,-22],[-3,-13],[0,-5],[1,-3],[7,-11]],[[1964,2154],[22,25],[-32,71],[3,1],[4,2],[4,0],[4,3],[19,11],[-5,11]],[[1983,2278],[2,2]],[[1955,2280],[7,-14],[21,12]],[[1932,2331],[2,1],[2,-5],[3,-3],[3,-1],[5,3],[2,1],[4,6],[1,2],[10,6],[6,1],[5,1],[5,7],[5,12],[-3,11],[3,12],[1,0],[3,2],[7,0],[4,1],[3,3],[1,2],[1,7],[-2,4],[1,6],[0,2],[0,21],[6,15],[5,9],[2,10],[0,18],[4,10],[3,19],[6,17],[5,22],[3,8]],[[2038,2561],[-2,-10],[21,-22],[2,-2]],[[2059,2527],[-5,-14],[-2,-5],[-9,-25],[-2,-6],[0,-2],[0,-6],[0,-6],[-1,-64]],[[2040,2399],[-2,-21],[-1,-7],[0,-5],[-2,-7],[-18,-20],[-11,-9],[-13,-10],[-6,-7],[-7,-13],[-2,-4],[6,-14],[1,-2]],[[2040,2399],[25,15],[9,6],[1,2]],[[2075,2422],[11,-25]],[[2059,2527],[3,8]],[[2095,2473],[-17,-24],[-8,-18],[5,-9]],[[2276,2393],[-37,17]],[[2239,2410],[1,8],[0,6],[0,5],[-2,6],[-2,6],[-7,17],[-2,1],[-2,-1],[-12,-6],[-7,19],[16,8],[-14,38],[-7,9],[-13,-14],[-12,-14],[-20,-22],[-15,19],[-15,-17],[-11,-16],[-9,-13]],[[2106,2449],[-9,-19],[-6,-14]],[[2239,2410],[-6,1],[-5,0],[-7,-1],[-5,-2],[-41,-21]],[[2175,2387],[-8,20],[-8,17],[-16,35],[-13,-18],[-12,-18],[-12,26]],[[2238,2271],[-18,-9]],[[2209,2291],[-15,32],[-4,5],[-6,4],[-7,4],[7,19],[4,11],[-6,5],[-3,6],[-4,10]],[[2299,2382],[-7,-19],[7,-18],[-10,-5],[-2,0],[-2,0],[-6,3],[-17,8],[-10,-29],[-26,-13],[-1,-3],[13,-35]],[[6797,5762],[-3,2]],[[6794,5764],[0,6],[1,5],[2,11],[1,6],[7,14],[10,17]],[[6815,5823],[10,19],[16,26],[-16,8],[-38,59]],[[6787,5935],[15,13]],[[6802,5948],[13,12],[14,12],[13,11],[-40,64]],[[6802,6047],[13,12],[15,12]],[[6830,6071],[41,35],[2,2]],[[6873,6108],[6,-9],[11,-16],[9,-14],[15,-24],[11,-17]],[[6925,6028],[2,-3],[2,-3]],[[6929,6022],[2,-3],[5,-7],[5,-5],[0,-1],[5,-5]],[[7185,6081],[-18,13],[-11,-15],[-4,0],[-32,23],[-11,-19],[-6,4]],[[7103,6087],[-16,11],[-5,-8],[-2,-2],[-8,-19],[-6,-18]],[[6929,6022],[120,237],[5,10],[7,13]],[[7061,6282],[12,24]],[[7159,6046],[-18,13],[-9,-18],[-9,-15],[-4,-1],[-30,23],[-1,1],[0,2],[0,2],[5,16],[10,18]],[[7061,6282],[-4,5],[-18,26],[-36,57]],[[7003,6370],[15,13],[17,13],[-36,57]],[[6999,6453],[16,13],[10,9],[14,13]],[[7039,6488],[14,11]],[[7053,6499],[36,-56],[26,-41],[3,-9]],[[7003,6370],[-35,56]],[[6968,6426],[15,13],[16,14]],[[4901,1424],[11,-63]],[[4912,1361],[-19,-5],[7,-49],[5,-28]],[[4833,1264],[-5,30]],[[4828,1294],[-3,22],[-3,17],[-2,4],[-2,2],[2,0],[2,1],[2,2],[4,10],[5,7],[7,5],[3,2],[1,2],[0,1],[-1,3],[0,1],[-1,2],[-4,0],[-3,2],[-4,3],[-2,5],[-3,8],[-3,13]],[[4823,1406],[-2,17],[0,8],[2,5],[2,4],[4,3],[4,-1],[3,-2],[3,-3],[2,-6],[5,-20],[19,5],[17,4],[19,4]],[[4731,1222],[-6,45],[0,3],[-1,2],[1,5],[-3,22]],[[4722,1299],[31,-3],[20,-2],[4,0],[24,-2],[14,0],[13,2]],[[4722,1299],[-2,19],[-10,64]],[[4710,1382],[31,6],[25,6],[39,8],[18,4]],[[4892,1481],[9,-57]],[[4710,1382],[-4,27],[-3,26],[-3,20],[0,5],[1,7],[1,1],[2,4],[6,7]],[[4710,1479],[3,3],[2,1],[2,2],[1,0],[8,5],[6,3],[13,6],[20,8],[12,3],[14,1],[7,0],[8,0],[4,-1],[4,0],[4,-2],[25,-9],[5,-1],[24,-9],[20,-8]],[[4710,1382],[-3,-1],[-60,-10],[-10,3],[-20,8],[-19,7],[-4,22],[-4,21],[-4,23],[-34,10],[4,-23],[4,-21],[3,-21]],[[4563,1400],[-33,10]],[[4530,1410],[-7,46],[-5,24],[-8,49],[-2,1],[-4,0],[-20,4],[-36,5],[-51,2]],[[4397,1541],[-96,3]],[[4301,1544],[-16,0],[-35,1]],[[4250,1545],[-1,6],[-1,5],[-1,5],[-3,13]],[[4689,1559],[-1,-3],[0,-4],[-1,-5],[0,-3],[0,-2],[0,-4],[0,-2],[1,-4],[0,-3],[1,-3],[1,-2],[1,-2],[1,-1],[1,-2],[1,-2],[1,-1],[3,-2],[3,-1],[4,-3],[4,-2],[3,-2],[1,-1],[1,-1],[1,-2],[0,-1],[1,-2],[0,-1],[1,-1],[0,-1],[0,-1],[0,-1],[0,-2],[0,-1],[-1,-2],[0,-1],[-1,-3],[-1,-1],[-2,-2],[-2,-3]],[[4722,1299],[-3,0],[-26,2]],[[4693,1301],[-26,2]],[[4667,1303],[-20,2],[-14,2],[-24,2]],[[4609,1309],[-31,2],[0,4],[-3,18],[-3,23],[-4,20],[-5,24]],[[4609,1309],[-1,-3],[13,-78],[1,-3],[0,-5]],[[4622,1220],[-16,9],[-3,2],[-5,2],[-5,2],[-17,7],[-4,1],[-7,3],[-5,1],[-3,1],[-3,1],[-5,0],[-5,0],[-25,-5]],[[4519,1244],[-4,25],[-1,1],[-2,1],[1,5],[-8,41],[-8,49],[-8,48]],[[4489,1414],[17,4],[4,-2],[17,-5],[3,-1]],[[4731,1222],[-13,-1],[-12,-3],[-11,-2],[-12,-1],[-11,-2],[-6,0],[-6,0],[-10,1],[-6,0],[-7,1],[-6,1],[-4,2],[-5,2]],[[4667,1303],[9,-44],[1,-2],[2,-1],[19,3],[2,4],[-7,38]],[[4741,1173],[-2,1],[-3,1],[-1,2],[1,5],[2,12],[-1,2],[-1,2],[-3,-1],[0,-7],[-11,-1],[-7,-1],[-12,-2],[-6,-2],[-9,0],[-16,2],[-14,6],[-18,-2],[-7,-3],[-2,0],[-5,-1],[-7,-6],[-7,-9],[-7,-7],[-7,-3],[-16,-4],[-4,-3],[-3,-8],[-7,-11],[-3,-9],[-5,-4],[-8,-5],[-6,-6],[-4,1],[-2,1],[-2,6],[0,14],[-1,6],[-3,6],[-5,8],[-4,7],[-10,9],[-12,8],[-10,4],[-4,2],[-7,1],[-6,-1],[-4,0],[-5,0],[-5,5],[-3,-3],[-4,-5],[-5,-7],[-7,-15],[-1,-1],[-2,-6],[-2,-1],[-9,-19],[12,-21],[44,-7],[0,-3],[-1,-3],[-38,5],[-1,0],[-6,2],[-13,24],[-11,14],[-9,18],[-9,13],[-6,10],[-9,12],[-7,6],[-4,12],[-3,6],[-3,1],[-10,2],[-16,8],[-27,9]],[[4312,1239],[-6,26]],[[4306,1265],[18,-14],[7,-4],[13,-9],[8,-6],[7,-5],[5,-3],[4,-2],[5,-1],[5,-1],[7,0],[21,5],[6,1],[9,0],[8,0],[7,-1],[5,0],[6,0],[7,0],[5,-1],[4,1],[7,1],[8,2],[4,1],[12,5],[18,8],[3,1],[4,1]],[[4296,1317],[19,1],[17,1],[-2,2],[0,2],[-6,22],[-3,18],[-4,19],[-4,18],[-4,18],[-3,16],[13,2],[6,0]],[[4325,1436],[30,-8],[46,-11]],[[4401,1417],[48,-12],[12,2],[2,0],[24,6],[2,1]],[[4401,1417],[0,6],[-1,6],[-1,5],[3,2],[5,2],[6,1],[5,-2],[7,-1],[8,1],[-4,28],[-5,32],[-2,1],[-1,0],[-1,0],[-3,-1],[-3,0],[-18,8],[1,5]],[[4397,1510],[2,8],[-2,23]],[[4325,1436],[2,8],[-13,63],[-1,6]],[[4313,1513],[84,-3]],[[4313,1513],[-4,4],[-3,2],[-2,7],[-3,18]],[[6550,5222],[6,-1]],[[6545,5191],[-1,-4],[-7,-22]],[[6537,5165],[-5,3],[-42,20],[-4,-12],[-4,-11],[-4,-11],[-4,-11]],[[6474,5143],[-61,30]],[[6413,5173],[4,11],[4,11]],[[6421,5195],[4,11],[4,11],[8,24],[9,25]],[[6446,5266],[61,-31],[9,-4],[16,-8],[18,-1]],[[6446,5266],[-52,25],[-10,4]],[[6384,5295],[8,23],[8,21],[8,23]],[[6408,5362],[9,-5],[13,-6],[19,-9],[20,-9],[42,-21]],[[6511,5312],[-8,-22],[20,-10],[21,-10]],[[6544,5270],[18,-9],[-7,-22],[-5,-17]],[[6511,5312],[19,57]],[[6530,5369],[10,-7],[9,-6]],[[6549,5356],[10,-8],[10,-5],[-4,-13],[-9,-22],[-5,-15],[-7,-23]],[[6549,5356],[14,41],[8,24],[1,4]],[[6572,5425],[44,-32]],[[4088,1402],[18,2],[19,2],[18,2],[9,2],[11,2]],[[4183,1310],[1,-6],[4,-17],[4,-24],[-9,0],[-4,0],[-3,1],[-7,4],[-25,18],[-3,1],[-3,1],[-3,1],[-3,0],[-10,-2],[-18,-4],[-7,-1],[-5,-2],[-6,30],[-3,0],[-12,6],[-12,8],[-3,4],[-6,31],[-2,6],[1,4],[3,8],[7,10],[5,6],[3,3],[1,4],[4,-1],[9,2],[7,1]],[[6794,5764],[-10,7],[-16,11],[-15,10]],[[6715,5946],[13,12]],[[6728,5958],[31,-47]],[[6759,5911],[18,-28],[38,-60]],[[6759,5911],[13,12],[15,12]],[[6728,5958],[3,15],[1,6],[0,6],[14,14],[15,12]],[[6761,6011],[41,-63]],[[6761,6011],[13,12],[14,12]],[[6788,6035],[14,12]],[[6761,6011],[-41,64]],[[6720,6075],[14,11],[13,12]],[[6747,6098],[41,-63]],[[6747,6098],[15,12],[13,12],[14,14]],[[6789,6136],[10,-17],[10,-14],[9,-15],[12,-19]],[[6747,6098],[-17,28],[13,12],[-5,8],[-13,-11],[-18,27]],[[6707,6162],[14,12],[13,11]],[[6734,6185],[15,13]],[[6749,6198],[40,-62]],[[6720,6075],[-14,-13]],[[6706,6062],[-41,63]],[[6665,6125],[15,13],[13,12],[14,12]],[[6665,6125],[-40,64]],[[6625,6189],[15,12],[13,12],[13,12]],[[6666,6225],[41,-63]],[[6666,6225],[14,12]],[[6680,6237],[14,12]],[[6694,6249],[40,-64]],[[6694,6249],[14,12]],[[6708,6261],[16,15],[-13,21],[24,21],[3,2]],[[6738,6320],[14,-21],[24,-38]],[[6776,6261],[16,-26]],[[6792,6235],[-2,-2],[-25,-21],[-16,-14]],[[6680,6237],[-54,86]],[[6626,6323],[9,18]],[[6635,6341],[9,20]],[[6644,6361],[36,-56],[28,-44]],[[6644,6361],[4,7],[9,17],[10,23],[5,9],[2,5]],[[6674,6422],[26,-42]],[[6700,6380],[38,-60]],[[6635,6341],[-3,5],[-40,61]],[[6635,6480],[1,-2],[2,-3],[2,-3],[3,-3],[2,-3],[2,-4],[2,-3],[2,-3],[2,-3],[2,-3],[2,-3],[2,-4],[1,-2],[4,-6],[5,-4],[3,-5],[2,-4]],[[6607,6285],[-3,5],[-44,67]],[[6626,6323],[-10,-19],[-9,-19]],[[6587,6247],[-9,-20]],[[6578,6227],[-3,5],[-35,54]],[[6607,6285],[-9,-18],[-11,-20]],[[6625,6189],[-34,52],[-4,6]],[[6635,6101],[-66,106]],[[6569,6207],[9,20]],[[6665,6125],[-14,-13],[-7,-4],[-9,-7]],[[6608,6078],[-13,-12]],[[6595,6066],[-43,68],[-5,7]],[[6547,6141],[7,22],[8,23],[7,21]],[[6635,6101],[-12,-11],[-15,-12]],[[6547,6141],[-3,5],[-40,60],[-3,2]],[[6532,6080],[-3,5],[-40,62]],[[6547,6141],[-7,-31],[-8,-30]],[[6436,6017],[3,3],[0,21],[3,8],[3,12],[5,15],[0,3],[-16,42],[-11,-5],[-6,-1],[-2,0],[0,3],[0,3],[4,2],[3,1],[0,3],[1,1],[5,2],[0,3],[-2,1],[-1,0],[8,2],[3,-5],[6,-19],[5,-7],[4,-5],[3,-3],[2,3],[5,20],[1,1],[5,8],[1,5],[1,13],[3,17]],[[6489,6147],[-3,-14],[-1,-8],[0,-5],[1,-5],[1,-5],[2,-11],[2,-12]],[[6532,6080],[-13,-53]],[[7070,3733],[37,-28]],[[7035,3759],[6,11],[13,26]],[[7054,3796],[34,-27],[13,23],[37,-27]],[[7054,3796],[13,22],[3,6],[7,6],[8,4],[27,-21],[13,23]],[[7125,3836],[37,-27]],[[6988,3793],[6,13],[4,10],[16,40],[18,34],[1,2]],[[7033,3892],[2,-1],[3,-1],[2,0],[7,-2],[17,-9],[14,-7],[9,-7],[3,-3],[3,-2],[32,-24]],[[6403,5730],[-8,-18]],[[6395,5712],[-10,8],[-9,6],[-11,7],[-10,7]],[[6431,5791],[-10,-23],[-9,-20],[-9,-18]],[[6595,6066],[-17,-15],[-17,-15],[-9,-8]],[[6608,6078],[45,-70]],[[6653,6008],[-13,-12],[-14,-17],[-14,-18]],[[6667,6020],[-14,-12]],[[6706,6062],[-15,-13],[-8,-6],[-6,-5],[4,-6],[-14,-12]],[[6667,6020],[48,-74]],[[6733,6691],[-3,3],[-34,53],[-3,3],[-1,-26],[-1,-9],[-3,-13],[-6,-16],[1,-3],[0,-2],[-4,-11],[-3,-11],[-2,-2],[9,-14],[19,-30]],[[6702,6613],[-5,-8],[-17,-25]],[[6680,6580],[-4,-5],[-6,-8],[-3,-6],[-1,-3],[-2,-3],[-5,-10],[-3,-7],[-7,-18],[-6,-18],[-8,-21],[0,-1]],[[6618,6498],[1,2],[2,5],[4,11],[8,30],[9,23],[7,16],[3,9],[0,13],[2,8],[0,2],[2,8],[1,16],[3,9],[7,20],[4,15],[2,5],[4,7],[2,6],[4,9],[2,9],[2,15],[2,8],[1,10],[1,7],[4,10],[1,7],[7,20],[4,8],[7,24],[1,4]],[[6715,6834],[4,-9],[2,-4],[29,-45]],[[6750,6776],[-4,-31],[-1,-8],[-2,-14],[-2,-12],[-2,-7],[-6,-13]],[[6680,6580],[36,-55],[2,-5],[2,-8]],[[6720,6512],[-2,-3],[-11,-21]],[[6707,6488],[-8,-16],[-8,-16],[-8,-16],[-9,-18]],[[6733,6538],[-13,-26]],[[6702,6613],[8,14]],[[6710,6627],[9,-6],[2,-3],[25,-37],[4,-5],[-6,-14],[-11,-24]],[[6836,6486],[37,-55]],[[6873,6431],[-15,-14],[-23,-18],[-29,-21]],[[6806,6378],[-11,18],[-10,15],[-16,25]],[[6769,6436],[-45,71],[-4,5]],[[6733,6538],[16,20],[6,8],[4,4]],[[6759,6570],[26,-40],[17,-26],[20,-30],[14,12]],[[6769,6436],[-14,-8],[-5,-5]],[[6750,6423],[-43,65]],[[6750,6423],[-13,-10],[-11,-11],[-12,-10],[-14,-12]],[[6806,6378],[-19,-15],[-23,-20],[-12,-10],[-14,-13]],[[6806,6378],[38,-58]],[[6844,6320],[-19,-16],[-12,-11],[-12,-10],[-12,-9],[-13,-13]],[[6804,6217],[-12,18]],[[6844,6320],[38,-58]],[[6882,6262],[-19,-17]],[[6863,6245],[-12,-11],[-12,-10],[-10,16],[-11,-11],[-14,-12]],[[6908,6285],[-26,-23]],[[6844,6320],[27,22],[24,19]],[[6895,6361],[35,-56]],[[6930,6305],[-22,-20]],[[6919,6203],[-18,-18]],[[6901,6185],[-38,60]],[[6908,6285],[27,-43],[10,-15],[-26,-24]],[[6925,6028],[18,34],[-19,28],[-9,15]],[[6915,6105],[12,11],[11,10],[20,17],[-39,60]],[[6930,6305],[15,14],[16,13]],[[6961,6332],[14,11],[14,14],[14,13]],[[6915,6105],[-10,16],[-19,29],[-9,15],[12,10],[12,10]],[[6873,6108],[-12,20],[-10,15],[-18,29]],[[6833,6172],[-9,14],[-10,15],[-10,16]],[[6789,6136],[17,13],[24,20],[3,3]],[[7603,3852],[-6,4],[-6,5],[-1,4],[-9,7],[-9,6],[-8,6],[-9,7]],[[7555,3891],[-90,65]],[[7465,3956],[6,12],[7,13]],[[7454,3935],[11,21]],[[7555,3891],[-11,-23]],[[7544,3868],[-90,67]],[[7513,3814],[-20,15],[-11,2],[-22,17]],[[7460,3848],[10,21],[10,18],[-38,27]],[[7442,3914],[12,21]],[[7544,3868],[-12,-19]],[[7532,3849],[-10,-18],[-9,-17]],[[7460,3848],[-38,27]],[[7377,3964],[65,-50]],[[7388,3983],[66,-48]],[[7388,3983],[11,22]],[[7399,4005],[66,-49]],[[7412,4029],[66,-48]],[[7424,4053],[6,-5],[48,-35],[13,-9]],[[7435,4072],[65,-50]],[[4312,1239],[-1,0],[-57,11],[-13,1],[-5,-6],[-13,-39],[-2,-7],[-1,-2],[-3,4],[-3,14],[-2,5],[-10,14],[-6,5],[-23,18],[-7,8],[-5,3],[-6,8],[-8,4],[-5,0],[-4,4],[-3,0],[-3,-2],[-3,-2],[-8,0],[-2,-1],[-7,-1],[-5,-2],[-5,-4],[-4,0],[-7,0],[-6,-2],[-5,-3],[-2,-3],[2,-7],[0,-2],[-3,-3],[-11,-5],[-10,-8],[-3,-5],[-7,1],[-8,-1],[-2,0],[-4,3],[0,6],[0,27],[-3,13],[-2,21],[-1,5],[-4,23],[-3,9],[-5,14],[-1,0],[-14,19],[-1,1],[-23,27],[-9,7],[-7,10],[-7,12],[-2,0]],[[3948,1440],[2,-3],[4,-4],[21,-20],[8,-7],[6,-7],[7,-9],[14,-15],[2,2],[2,3],[2,3],[1,2],[2,5],[2,6],[-1,3],[2,4],[3,5],[3,5],[4,4],[5,4],[2,2],[-1,5],[-3,10],[0,9],[2,11],[3,8],[4,5],[6,8],[1,1],[1,3]],[[4052,1483],[2,1],[17,6],[17,-88]],[[4052,1483],[-4,3],[-6,1],[-9,5],[-8,6],[-5,3],[-8,45],[1,4],[-2,2],[-18,1],[-6,2],[-10,0],[-24,1],[-7,-2],[-1,0],[-1,0],[-21,-4]],[[3923,1550],[-2,6],[-5,-1],[0,1],[3,4],[0,1],[1,2],[1,2]],[[3921,1565],[0,2],[0,3],[0,4],[0,2],[-1,3],[-1,3],[-1,2]],[[3948,1440],[-25,110]],[[3729,1529],[-4,21],[-26,1],[0,4],[0,4],[19,3],[2,0],[14,2],[7,1],[14,2],[16,1],[11,0],[10,1],[15,0],[11,0],[25,-1],[19,-1],[22,0],[21,-1],[16,-1]],[[3621,1569],[-26,106]],[[3595,1675],[17,7],[6,2],[35,32],[11,3],[19,6]],[[3683,1725],[14,6],[7,5]],[[3469,1599],[23,8],[8,2],[9,8],[18,16],[18,16],[18,16]],[[3563,1665],[5,2],[27,8]],[[3422,1793],[20,17]],[[3442,1810],[6,-24],[16,6],[21,18],[12,10],[3,1],[2,-1],[2,-1],[7,-29],[17,6],[3,3],[32,-134]],[[3627,1871],[19,-76],[19,6]],[[3665,1801],[18,-76]],[[3442,1810],[21,18],[32,27],[24,20],[24,20]],[[3543,1895],[15,-61],[37,13],[4,3],[9,14],[19,7]],[[3342,1727],[-17,28],[-17,29],[29,25],[-14,26],[-12,19]],[[3311,1854],[17,14],[10,-18],[3,0],[16,12],[46,38],[14,12],[1,4],[-11,18],[17,14]],[[3424,1948],[11,-18],[2,0],[16,13],[16,14],[17,14],[7,6],[10,9],[17,14],[17,13]],[[3537,2013],[16,-26],[37,-59]],[[3590,1928],[-26,-22],[-6,-3],[-9,-4],[-6,-4]],[[3627,1871],[-7,29],[0,3],[2,2],[5,1],[13,3],[9,4],[2,2],[3,3],[1,4],[5,1],[0,3],[0,5],[1,4],[3,4],[5,3],[10,2],[2,-7]],[[3681,1937],[23,-101]],[[3704,1836],[-18,-23],[-6,-6],[-15,-6]],[[3703,1998],[-22,-18],[-5,-2],[-16,-5],[-14,-4],[-10,-3],[-12,-5],[-2,-2],[-6,-5],[-6,-5],[-5,-6],[-4,-6],[-11,-9]],[[3537,2013],[-33,54],[-5,8]],[[3499,2075],[3,2],[14,12],[20,-33],[2,0],[14,12],[13,10],[1,2],[0,3],[-19,31],[16,13]],[[3499,2075],[-23,38]],[[3476,2113],[-8,15],[-6,14]],[[6656,4951],[63,-30]],[[6488,5030],[9,25],[21,60],[3,7],[16,43]],[[6961,6332],[-36,56]],[[6925,6388],[14,12],[15,13],[14,13]],[[6925,6388],[-37,56]],[[6888,6444],[15,13],[14,12],[15,13]],[[6932,6482],[36,-56]],[[6932,6482],[15,13],[17,14],[16,14],[9,9],[14,12]],[[7003,6544],[36,-56]],[[7033,3892],[1,3]],[[7034,3895],[1,1],[76,130]],[[7111,4026],[9,14]],[[7173,3925],[-12,-22],[-13,-23]],[[7148,3880],[-11,-22],[-12,-22]],[[7148,3880],[37,-27]],[[7185,3853],[-11,-21],[-12,-23]],[[7209,3897],[-12,-22],[-12,-22]],[[7209,3897],[57,-43]],[[7295,3910],[-17,-32],[-12,-24]],[[6932,6482],[-36,56]],[[6896,6538],[16,14],[16,14],[15,13]],[[6943,6579],[11,9],[6,7],[7,6]],[[6967,6601],[36,-57]],[[6967,6601],[14,12]],[[6981,6613],[15,13],[14,12],[14,13]],[[7024,6651],[37,-57]],[[7061,6594],[-15,-13],[-14,-12],[-14,-13],[-15,-12]],[[6943,6579],[-35,57]],[[6908,6636],[10,9],[13,12],[-7,11]],[[6924,6668],[17,9]],[[6941,6677],[40,-64]],[[6941,6677],[15,9],[17,9],[17,9]],[[6990,6704],[12,-18],[10,-16]],[[7012,6670],[12,-19]],[[6990,6704],[27,16],[21,11],[2,1]],[[7040,6732],[12,7]],[[7052,6739],[13,-22]],[[7065,6717],[-29,-26],[-24,-21]],[[7114,6640],[-28,-25],[-25,-21]],[[7065,6717],[13,-20]],[[7078,6697],[-14,-13],[20,-33],[3,-1],[13,12],[14,-22]],[[7162,6681],[-48,-41]],[[7078,6697],[20,15],[16,11],[18,-30],[4,-1],[12,11],[14,-22]],[[7180,6696],[-2,-2],[-5,-4],[-11,-9]],[[7052,6739],[44,25],[27,15],[3,1]],[[7126,6780],[7,-11],[14,-22],[33,-51]],[[7040,6732],[-1,4],[-9,20],[-2,4],[38,32]],[[7066,6792],[4,-6],[1,-1],[9,0],[2,1],[8,7],[15,13],[2,2]],[[7107,6808],[16,-24],[3,-4]],[[7066,6792],[-12,19]],[[7054,6811],[-11,18],[15,13],[-6,9]],[[7052,6851],[16,14],[2,2]],[[7070,6867],[37,-59]],[[7133,6876],[11,-18],[14,-21]],[[7158,6837],[16,-26],[2,-3]],[[7176,6808],[-23,-13],[-16,-9],[-11,-6]],[[7070,6867],[-16,25]],[[7054,6892],[15,13]],[[7069,6905],[12,-18],[12,-18],[11,-18],[29,25]],[[7069,6905],[-11,18],[28,25]],[[7086,6948],[9,-14],[3,-4]],[[7098,6930],[11,-18],[12,-18]],[[7121,6894],[12,-18]],[[7121,6894],[15,13],[13,11]],[[7149,6918],[41,-63]],[[7190,6855],[-16,-9],[-16,-9]],[[7098,6930],[15,12],[14,13]],[[7127,6955],[14,12],[23,-36],[-15,-13]],[[7220,6935],[11,-17]],[[7231,6918],[11,-17],[10,-15]],[[7252,6886],[-44,-22],[-18,-9]],[[7127,6955],[-37,56]],[[7090,7011],[14,13],[25,20]],[[7129,7044],[55,-86],[22,-34],[14,11]],[[7129,7044],[13,11]],[[7142,7055],[12,-18],[11,-17]],[[7165,7020],[10,-16],[11,-17]],[[7186,6987],[11,-17]],[[7197,6970],[12,-18]],[[7209,6952],[11,-17]],[[7247,7038],[-61,-51]],[[7165,7020],[34,30],[13,12]],[[7212,7062],[12,11],[12,-18],[11,-17]],[[7247,7038],[22,20],[2,2]],[[7271,7060],[11,-17]],[[7282,7043],[-2,-2],[-83,-71]],[[7287,6993],[-9,16],[-1,0],[-1,1],[-1,0],[-1,-1],[-65,-57]],[[7282,7043],[22,-34]],[[7304,7009],[-2,-3],[-15,-13]],[[7254,6938],[-23,-20]],[[7287,6993],[-14,-11],[-15,-13],[-15,-13],[11,-18]],[[7278,6900],[-2,3],[-11,17],[-11,18]],[[7287,6993],[41,-62],[-1,-4],[-15,-7],[-17,-9],[-17,-11]],[[7304,7009],[47,-72]],[[7351,6937],[13,-21],[3,-4]],[[7367,6912],[-4,-1],[-4,-2],[-29,-16],[-37,-20],[-2,4],[-12,21],[-1,2]],[[7304,7009],[16,13],[46,-72],[-15,-13]],[[7749,3826],[-13,-26]],[[7736,3800],[-12,9],[-19,14],[-22,15],[-9,8]],[[7688,3870],[9,-7],[41,-29],[11,-8]],[[7726,3783],[-8,7],[-17,12],[-8,-1],[-31,22]],[[7700,3892],[9,-7],[41,-29],[11,-9]],[[7761,3847],[-12,-21]],[[7713,3916],[9,-7],[41,-30],[10,-8]],[[7773,3871],[-10,-18],[-2,-6]],[[7735,3956],[19,-15],[31,-23],[9,-7]],[[7794,3911],[-1,-3],[-8,-15],[-12,-22]],[[7804,3927],[-10,-16]],[[7754,3989],[49,-37]],[[7803,3952],[-9,-17],[10,-8]],[[7773,4024],[30,-23],[19,-15],[-9,-17],[-5,-8],[-5,-9]],[[7805,4083],[22,-17]],[[7864,4039],[-6,-12],[-5,-8],[-8,-16]],[[7845,4003],[-8,-15],[-5,-9],[-3,-6],[-7,-11],[-2,-4]],[[7820,3958],[-7,-14],[-1,-2],[-4,-7],[-4,-8]],[[7989,7819],[7,9],[8,7],[-25,39]],[[7979,7874],[12,16],[13,18],[-12,20],[-2,2]],[[7990,7930],[34,44]],[[8024,7974],[2,-3],[13,-19],[-5,-8],[9,-15],[0,-5],[-2,-5],[-8,-8],[-1,-2],[1,-4],[20,-29]],[[8053,7876],[-18,-15],[7,-11],[-16,-14],[22,-35],[0,-2],[0,-1],[-11,-15],[-13,-15],[-9,14],[-20,-24],[-2,-1],[-2,2],[-9,14],[0,2],[1,3],[19,24],[-6,10],[-7,7]],[[8024,7974],[33,41],[2,3]],[[8059,8018],[2,-3],[9,-14],[4,-6],[5,-8],[10,-19],[9,-19],[2,-3]],[[8100,7946],[-3,-3],[2,-3],[9,-15],[-18,-15],[-16,-15],[-21,-19]],[[7990,7930],[-13,20],[-24,38]],[[7953,7988],[-20,32]],[[7933,8020],[15,12],[12,11],[13,11],[14,12],[23,20],[3,3]],[[8013,8089],[2,-3],[10,-16],[8,-12],[12,-19],[9,-14],[5,-7]],[[7990,7930],[-73,-91]],[[7870,7913],[19,16],[11,15],[6,5],[17,13],[14,13],[16,13]],[[7816,7998],[20,16],[24,22],[9,11],[12,17],[13,18]],[[7894,8082],[39,-62]],[[7803,8020],[17,15],[17,15],[7,7],[7,7],[5,7],[11,15]],[[7867,8086],[12,18]],[[7879,8104],[15,-22]],[[7879,8104],[22,31],[10,14],[12,17],[17,24],[2,3],[2,3]],[[7944,8196],[19,-29],[3,-6],[11,-17],[10,-15],[4,-7],[13,-20],[9,-13]],[[7879,8104],[-2,4],[-3,5],[-13,20]],[[7861,8133],[11,10],[4,5],[5,6],[1,4],[-10,15],[-2,3],[-1,2],[-11,17],[5,3],[11,10],[13,12],[-47,75]],[[7840,8295],[22,27]],[[7862,8322],[11,-18],[3,-4],[10,-16],[3,-4],[11,-16],[2,-5],[11,-17],[8,-9],[19,-30],[2,-4],[2,-3]],[[7861,8133],[-29,45],[-12,20],[-1,1],[-16,26],[-14,20]],[[7789,8245],[24,24],[14,11],[13,15]],[[7867,8086],[-3,3],[-8,12],[-14,-12],[-15,-12],[-14,22],[-11,18],[-13,21]],[[7789,8138],[5,8],[7,7],[15,12],[-22,34],[-20,31]],[[7774,8230],[15,15]],[[7719,8067],[-12,19],[-18,28],[14,14],[-14,20],[9,10],[11,10],[25,19],[7,7],[5,5],[15,16],[13,15]],[[7789,8138],[-11,-15],[-6,-9],[-7,-8],[-15,-12],[-15,-13],[-16,-14]],[[1401,355],[2,-11],[4,-16],[-6,-3],[-5,-3],[-5,-2],[-8,-4],[-15,-7],[-6,-2],[-9,-4],[-11,-7],[-4,-3],[-7,-4],[-4,-2],[-8,-5],[-10,-5],[-6,-4],[-7,-6],[-4,-2],[-6,-5],[-4,-4],[-6,-3],[-10,-5],[-13,-7],[-2,-2],[-35,-25],[-2,2],[1,10],[-2,22],[-2,34]],[[1211,282],[-7,103],[-3,32],[36,4],[9,2],[3,1],[3,2],[2,1],[2,3],[4,8],[3,7],[3,3],[9,5]],[[1376,513],[6,-34],[1,-20],[1,-10],[1,-7],[1,-8],[2,-7],[3,-12],[7,3],[3,2],[-2,-18],[-2,-16],[0,-6],[3,-18],[1,-7]],[[7664,7713],[-3,-3],[-17,-14]],[[7644,7696],[-35,54],[-8,13],[-2,2],[-2,-1],[-26,-23],[-13,-11],[-1,-4],[0,-3],[7,-11],[-16,-14]],[[7548,7698],[-22,34],[21,18],[1,2],[2,1],[18,16],[2,3],[-1,3],[-18,29],[-3,4],[-16,-14]],[[7577,7652],[-29,46]],[[7644,7696],[-15,-14]],[[7629,7682],[-13,-11],[-6,-3],[-14,-7],[-19,-9]],[[7560,7638],[13,11],[4,3]],[[7629,7682],[12,-18],[13,-22],[10,-14],[1,-4],[-2,-2],[-26,-25]],[[7637,7597],[-16,-14],[-16,-14],[-45,69]],[[7650,7576],[-13,21]],[[7664,7713],[35,-54]],[[7699,7659],[-4,-3],[-16,-14],[12,-19],[-22,-26],[-19,-21]],[[7765,7647],[-32,-41]],[[7733,7606],[-34,53]],[[7679,7533],[-2,2],[-14,22],[-13,19]],[[7733,7606],[1,-3]],[[7734,7603],[-2,-3],[-16,-20],[-9,-11]],[[7707,7569],[-26,-33],[-2,-3]],[[7713,8005],[-20,31],[0,6],[4,5],[22,20]],[[7540,8005],[7,8],[2,2],[11,13],[10,10],[22,24],[2,2],[2,3],[4,5],[13,13],[1,10],[5,8],[11,4],[5,0],[6,6],[2,5],[8,9],[15,21],[3,3],[2,6],[7,9],[9,1],[15,20],[19,27],[3,2],[2,2],[4,5],[4,9],[5,3],[6,3],[21,22],[7,8],[28,24],[15,11],[8,7],[10,8],[4,4],[6,7],[4,6]],[[6790,4231],[-7,-19],[-6,-17]],[[6777,4195],[-8,4],[-44,22],[-9,4]],[[6716,4225],[6,17]],[[6722,4242],[6,16],[27,-12],[8,-1],[19,-10],[8,-4]],[[6777,4195],[-5,-15]],[[6772,4180],[-53,25],[-8,5]],[[6711,4210],[5,15]],[[6766,4164],[-7,3],[-45,22],[-9,4]],[[6705,4193],[6,17]],[[6772,4180],[-6,-16]],[[6711,4210],[-62,29]],[[6649,4239],[5,15]],[[6654,4254],[7,17]],[[6661,4271],[61,-29]],[[6649,4239],[-58,28],[5,16]],[[6596,4283],[58,-29]],[[6594,4303],[58,-28],[9,-4]],[[6596,4283],[-8,4],[4,12],[2,4]],[[6666,4288],[-5,-17]],[[6594,4303],[-9,5],[-3,1],[-5,3],[-2,-3],[-2,-6],[-2,-6],[-1,-3],[-1,-5],[1,-4],[1,-5],[6,-18],[0,-4]],[[6577,4258],[-2,-3],[-2,-5],[-4,-1],[-4,-1],[-4,-3],[-5,-1],[-4,-2],[-1,0],[-1,0],[-3,0],[-3,1],[-1,1]],[[6592,4365],[2,-1],[3,-1]],[[6597,4363],[-3,-8]],[[6594,4355],[-2,-3],[-3,-5],[-7,-18],[6,-3],[78,-38]],[[6649,4239],[-6,-16]],[[6643,4223],[-56,26],[-4,3],[-4,3],[-2,3]],[[6705,4193],[-14,7],[-48,23]],[[6766,4164],[10,-5],[53,-26]],[[6829,4133],[62,-30]],[[6891,4103],[-1,-4],[-43,21],[-1,-4]],[[6846,4116],[-20,10],[-20,9]],[[6806,4135],[-19,9],[-20,10],[-20,9]],[[6747,4163],[-20,10],[-19,10],[-20,9],[-18,-50],[-7,-23],[-14,-39]],[[6649,4080],[-19,9],[-19,9],[-18,9],[-19,8],[-40,20]],[[6626,4014],[5,17],[17,46],[1,3]],[[6747,4163],[-17,-50],[-5,-13],[-17,-48],[-1,-3],[-18,-51],[-5,-13]],[[6684,3985],[-7,2],[-15,4],[-10,4],[-10,6],[-5,2],[-2,2],[-3,3],[-4,3],[-1,2],[-1,1]],[[6744,3958],[-11,5],[-8,5],[-3,2],[-13,10],[-2,2],[-1,2],[-22,1]],[[6806,4135],[-16,-46],[-15,-40],[-9,-25],[-1,-3],[-17,-51],[-4,-12]],[[8952,8419],[-76,-62],[-71,-58],[-6,-5],[-3,-1],[-10,-8],[-17,-14],[-32,-26],[-17,-15],[-15,-12],[-54,-36],[-25,-19],[-11,-9]],[[8615,8154],[-28,-23],[-9,-8],[-8,-9],[-11,-11],[-6,-7],[-7,-6],[-69,-57],[-3,-2],[-3,-3],[-18,-17],[-8,-7],[-2,-2]],[[8443,8002],[-1,2],[-1,1],[-8,13],[-34,54],[-31,51],[-18,27]],[[8350,8150],[-26,40],[-6,10],[-23,37],[-3,4]],[[8292,8241],[2,1],[4,3],[6,2],[4,2],[2,2],[15,12],[18,16],[13,11]],[[8356,8290],[14,17],[18,16],[21,16],[22,14]],[[8431,8353],[23,11],[8,6],[10,6],[35,23],[51,26],[22,15],[-7,14],[-2,5],[-3,5],[-6,9],[-1,1],[-4,7],[-5,5],[-8,7],[-3,2],[-8,4],[-10,5],[-2,1],[-1,0],[-8,3],[-12,4],[-2,1],[-11,4],[-6,2]],[[8481,8519],[-12,6],[-9,8],[-9,12],[-6,10],[-5,13]],[[8440,8568],[19,10],[18,10],[15,9],[15,8],[1,2],[0,3],[-24,57],[-1,1],[-3,0],[-14,-8],[-34,-19],[-18,-11]],[[8414,8630],[-12,29]],[[8402,8659],[3,3],[29,40],[20,26],[11,15],[3,3]],[[8468,8746],[20,-18],[-11,-16],[0,-2],[1,-2],[8,-7],[11,-15],[4,-5],[4,-9]],[[8505,8672],[22,-54],[16,-39],[2,-4],[4,-7],[6,-6]],[[8555,8562],[-12,-15],[-9,-12],[16,-13],[11,-2],[24,-2],[1,-9],[22,-53],[35,29],[41,38],[2,2]],[[8686,8525],[69,70],[7,7],[1,4],[5,7],[27,27]],[[8795,8640],[16,16],[20,20],[2,2]],[[8833,8678],[2,-3],[13,-29],[32,-70],[0,-4],[67,-144],[3,-6],[2,-3]],[[8431,8353],[0,5],[-2,6],[-40,93],[-36,88]],[[8353,8545],[20,11]],[[8373,8556],[37,-87],[19,11],[-7,18],[-1,3],[2,2],[19,11],[4,1],[2,-1],[7,-6],[5,-11],[16,10],[2,2],[3,10]],[[8373,8556],[20,11],[-11,27],[-1,2],[2,3],[13,15],[11,12],[7,4]],[[8414,8630],[26,-62]],[[8353,8545],[-6,13],[-8,20],[-3,7]],[[8336,8585],[-2,3],[-12,28],[-1,5],[1,3],[1,4],[2,4],[13,8],[-5,12],[-3,5],[-11,24],[-4,8]],[[8315,8689],[29,24],[26,25],[17,18],[21,21],[11,-26],[7,-15],[-15,-20],[-20,-28],[0,-1],[10,-24],[1,-4]],[[8094,8578],[17,5],[10,1],[25,3],[10,0],[20,7],[11,2],[1,1],[6,3],[7,7],[8,10],[3,1],[8,5],[10,3],[19,16],[1,4],[5,3],[4,6],[3,3],[5,3],[6,3],[5,3],[6,8],[8,12],[5,1],[8,6]],[[8305,8694],[4,5],[6,-10]],[[8336,8585],[-3,-2],[-7,-6],[-75,-65],[-13,-10]],[[7915,5295],[-11,6],[-53,27],[-2,1],[-10,5]],[[7839,5334],[12,23],[2,3]],[[7853,5360],[76,-39]],[[2762,2202],[-32,16]],[[2489,2977],[-10,27],[-10,32]],[[2469,3036],[9,14],[12,20],[7,16],[4,7]],[[2501,3093],[11,22],[8,15],[3,5],[3,5],[13,19],[3,4],[5,8],[4,8]],[[2501,3093],[-2,4],[-14,36],[-21,59],[-28,54]],[[2436,3246],[25,12],[8,5],[5,5],[5,9],[3,0],[2,-1],[13,-26],[12,17],[12,-26],[27,20]],[[2436,3246],[-25,51],[-1,4],[2,35],[1,23],[3,64],[0,23],[3,8]],[[2469,3036],[-3,-3],[-17,45]],[[2449,3078],[1,3],[6,11],[3,10],[2,10],[-2,10],[-1,1],[-1,5],[-3,6],[-2,3],[-1,7],[-2,4],[-4,8],[-3,4],[-2,2],[-4,4],[-1,3],[-1,0],[-1,11],[-2,16],[0,5],[-2,0],[-1,3],[-1,9],[0,3],[-3,4],[-4,4],[-3,5],[-6,7],[-3,0],[-2,1],[-14,-1],[-12,-2],[-7,-2],[-2,-2],[-4,0],[-5,0],[-7,9],[-4,9],[0,3],[-4,6],[-4,12],[-1,10],[1,9],[2,2],[6,7],[7,11],[2,3],[3,3],[1,0],[-2,7],[0,6],[0,8],[0,2],[8,13],[3,9],[5,11],[6,14],[0,8],[-1,12],[-2,12],[-1,8],[4,6],[6,4],[2,5],[2,5],[6,16],[6,19],[1,10],[1,7],[8,5],[13,7]],[[2385,3434],[-2,-1],[-1,1],[-1,3],[0,2],[0,3],[-4,5],[-3,2],[-7,8],[0,3],[-5,6],[-3,6],[-1,6],[3,2],[12,11],[16,13],[8,5],[5,3],[3,1],[3,-1],[1,-2],[0,-3],[-1,-3],[-2,-5],[-1,-6],[-1,-8],[1,-3],[-2,-8],[-2,-2],[-3,-7],[-3,-7],[-2,-7],[0,-3],[-5,-12],[-3,-2]],[[6896,6538],[-37,56]],[[6859,6594],[16,14],[16,13],[17,15]],[[6859,6594],[-18,27]],[[6841,6621],[19,11],[19,10],[18,10]],[[6897,6652],[11,7],[16,9]],[[6888,6444],[-15,-13]],[[6836,6486],[16,14]],[[6852,6500],[15,13],[14,13],[15,12]],[[6925,6388],[-16,-14],[-14,-13]],[[6842,6934],[-29,47],[-15,24],[-3,-9],[-4,-15]],[[6791,6981],[-10,9]],[[6781,6990],[28,110],[36,85],[1,13],[7,11]],[[6853,7209],[8,-17]],[[6861,7192],[-3,-5],[-5,-9],[-22,-52],[-1,-5],[-3,-7],[-1,-4],[7,-4],[19,-29],[11,-18]],[[6863,7059],[-6,-5],[-4,-16],[-7,-24],[-9,-33],[16,-25],[-5,-16],[-6,-6]],[[6863,7059],[17,-26],[5,0],[16,-21],[3,-3]],[[6904,7009],[-20,-57]],[[6884,6952],[-1,-2],[-17,-51]],[[6866,6899],[-3,3],[-5,9],[-16,23]],[[6960,7041],[-3,-3],[-15,-13],[-21,33],[-17,-49]],[[6861,7192],[7,-12],[12,-20],[39,-59],[9,-14],[2,-3]],[[6930,7084],[5,-6],[25,-37]],[[6983,7161],[-14,-29],[-11,16],[-3,4],[-15,-40],[-10,-28]],[[6861,7192],[18,32],[3,6],[4,6],[15,24],[1,2],[2,3],[17,21]],[[6921,7286],[6,-10],[2,-2],[7,-5],[27,-42],[-10,-20],[13,-20],[2,-4]],[[6968,7183],[15,-22]],[[6921,7286],[7,9],[8,11],[3,4],[3,3],[3,3],[6,6],[10,7]],[[6961,7329],[11,-17],[7,-2],[4,-7],[15,-24],[13,-20],[2,-3]],[[7013,7256],[-2,-3],[-7,-9],[-9,-14],[-13,-22],[-14,-25]],[[6961,7329],[10,8],[11,8],[4,3],[5,5],[4,3],[9,11],[11,12],[13,18]],[[7028,7397],[23,-35],[-36,-32],[23,-37],[2,-3]],[[7040,7290],[-13,-15],[-12,-15],[-2,-4]],[[7028,7397],[14,16],[2,3]],[[7062,7388],[28,-45],[2,-3]],[[7092,7340],[-2,-2],[-18,-15],[-10,-9],[-10,-11],[-12,-13]],[[7028,7233],[-15,23]],[[7092,7340],[14,-22]],[[7106,7318],[-2,-2],[-21,-18],[-15,-15],[-17,-21],[-23,-29]],[[7039,7215],[-11,18]],[[7106,7318],[12,-18]],[[7118,7300],[-2,-2],[-23,-19]],[[7093,7279],[-15,-16]],[[7078,7263],[-13,-15]],[[7065,7248],[-11,-14],[-15,-19]],[[7184,7234],[-15,-13]],[[7169,7221],[-12,17]],[[7157,7238],[-39,62]],[[7106,7318],[16,14],[62,-98]],[[7267,7329],[-58,-61],[-25,-34]],[[6853,7209],[6,10],[38,53],[5,10],[7,9],[4,6],[9,13],[22,28],[23,24],[4,6],[12,13],[17,24],[13,14],[18,24],[14,13],[5,6],[25,33],[20,29],[14,27]],[[7109,7551],[2,-5],[17,-27]],[[7350,7713],[-11,18],[-14,-13],[-6,-7],[-2,-2],[-7,-9],[-13,-18],[-8,-8],[-13,-12],[-15,-14],[-9,-8]],[[7252,7640],[-14,-13],[-1,0],[-3,-3],[-5,-4],[-4,-3],[-8,-7],[-14,-9],[-9,-9],[-30,-33]],[[7164,7559],[-32,-36],[-4,-4]],[[7109,7551],[1,3],[8,11],[1,4],[0,5],[3,4],[6,5],[4,3],[2,4],[6,12],[3,3],[17,7],[5,3],[10,-2],[14,3],[35,24],[3,3],[7,4],[3,6],[4,3],[11,8],[10,8],[8,7],[10,4],[6,7],[11,12],[8,13],[0,5],[-5,7],[0,3],[2,3],[3,0],[7,-6],[13,11],[3,7],[3,4],[9,11],[18,18],[16,20],[5,4],[6,4],[5,5]],[[7300,7735],[-4,-4],[-4,2],[-7,-9],[-4,-3],[-4,-1],[-18,-4],[-8,-1],[-5,1],[-3,3],[-2,3],[-2,7],[-1,7],[1,5],[12,16],[12,15],[8,9],[30,22],[5,3],[11,4],[2,2],[7,3],[22,8],[3,-1],[2,-4],[-1,-4],[-7,-12],[-10,-13],[-10,-11],[-11,-17],[-6,-6],[-5,-5],[-3,-5],[-1,-4],[1,-6]],[[7204,7708],[-2,0],[-3,3],[-4,14],[1,12],[-6,5],[-1,11],[11,23],[9,8],[18,9],[25,30],[14,13],[10,5],[3,-3],[1,-8],[-3,-10],[-6,-8],[-16,-21],[-9,-10],[-6,-8],[-6,-6],[-5,-7],[0,-6],[-6,-16],[-4,-11],[-2,-11],[-9,-8],[-4,0]],[[7526,5104],[-47,35]],[[7479,5139],[4,8],[1,1],[3,7],[3,5],[2,3],[4,7]],[[7532,5214],[24,-18]],[[7556,5196],[-2,-3],[-9,-18],[-4,-15],[1,-9],[-6,-24],[-6,-13],[-4,-10]],[[7479,5139],[-47,32]],[[7432,5171],[-11,8]],[[7446,5078],[-8,5],[-30,23],[-8,5],[10,19],[11,20],[11,21]],[[7479,5139],[-12,-22],[-11,-20],[-10,-19]],[[7446,5078],[-11,-22]],[[7435,5056],[-9,6],[-29,22],[-8,6]],[[7461,4983],[-10,7],[-28,21],[-9,6],[11,20],[-9,6],[-29,21],[-9,7]],[[7435,5056],[8,-6],[30,-21],[9,-7]],[[7482,5022],[-11,-20],[-10,-19]],[[7432,4928],[-9,7],[-31,22],[-8,6],[-8,7],[-29,21],[-8,6]],[[7461,4983],[-11,-20],[-9,-17],[-9,-18]],[[7432,4928],[-10,-17]],[[7422,4911],[-8,6],[-31,23],[-8,6],[-9,6],[-13,9]],[[7743,7476],[-36,56],[13,17],[-13,20]],[[7734,7603],[26,-40],[10,-14],[15,-20],[2,-2]],[[7787,7527],[-3,-3],[-2,-3],[-13,-14],[-13,-16],[-13,-15]],[[7658,7506],[2,3],[17,21],[2,3]],[[7743,7476],[-12,-15],[-13,-15],[-13,-15],[-20,33],[-15,23],[-12,19]],[[7743,7476],[14,-22],[-14,-12],[13,-21],[-12,-15],[-13,-16],[-13,-17],[-17,-16],[-26,42],[-16,-13],[-24,36],[-24,36]],[[7611,7458],[16,13],[7,8],[2,2],[2,2],[10,11],[8,10],[2,2]],[[7493,7356],[25,22],[27,22]],[[7545,7400],[30,27],[36,31]],[[7787,7527],[2,-2],[41,-49],[2,-2],[12,-15],[24,-29],[23,-28],[1,-1],[1,-2]],[[7893,7399],[-3,-3],[-50,-58],[-51,-57],[-31,-36],[-38,-43],[-39,-44],[-36,-40]],[[7493,7356],[-2,2],[-36,57]],[[7455,7415],[7,6],[18,14],[16,12]],[[7496,7447],[16,15],[5,-9],[4,-13],[4,-9],[18,-28],[2,-3]],[[7489,7566],[52,-81],[43,36]],[[7584,7521],[3,-6],[4,-9],[1,-9],[0,-4],[1,-5],[3,-5],[13,-22],[2,-3]],[[7496,7447],[-55,85]],[[7441,7532],[17,15]],[[7458,7547],[8,7],[7,4],[8,4],[5,2],[2,1],[1,1]],[[7489,7566],[6,6],[7,14],[5,7],[20,17]],[[7527,7610],[13,-21],[31,-48],[13,-20]],[[7527,7610],[17,14],[16,14]],[[7455,7415],[-50,78]],[[7405,7493],[-50,77]],[[7355,7570],[6,6],[8,9],[21,-34],[23,19],[2,1],[2,-1],[10,-16],[3,-4],[11,-18]],[[7377,7469],[16,13],[12,11]],[[7164,7559],[14,-23],[18,-29],[3,-3],[11,-18],[11,-19],[2,-4]],[[7204,4330],[-10,-18],[-8,6],[-44,32],[-7,6]],[[7135,4356],[10,18],[6,10],[5,9],[1,1],[1,2]],[[7158,4396],[4,-4],[4,-6],[6,-4],[13,-10],[13,-9],[10,-8],[7,-5]],[[7215,4350],[-5,-10],[-6,-10]],[[7204,4330],[7,-6],[1,-1],[7,-5],[-5,-11],[-5,-10],[25,-18],[9,-6]],[[7243,4273],[-10,-18],[-5,-9],[-3,-5]],[[7225,4241],[-91,23]],[[7134,4264],[-2,1],[-39,11]],[[7093,4276],[11,21],[1,4],[10,18],[10,19],[10,18]],[[7091,4486],[9,-4],[9,-5],[9,-4],[10,-5],[8,-4],[8,-4],[2,-2]],[[7146,4458],[-1,-3],[-8,-15],[9,-8],[22,-16],[7,-5]],[[7175,4411],[-9,-8],[-8,-5],[0,-2]],[[7093,4276],[-2,0],[-68,18]],[[7069,4228],[-38,18],[-6,-19]],[[7025,4227],[-67,33],[-10,4]],[[7093,4276],[-7,-11],[-10,-22],[-1,-3],[0,-2],[-3,-2],[-3,-8]],[[7062,4209],[-7,-20]],[[7055,4189],[-30,15],[-8,3]],[[7017,4207],[8,20]],[[7069,4228],[-5,-13],[1,-2],[-1,-3],[-2,-1]],[[7049,4170],[-7,-18]],[[7042,4152],[-16,7],[-8,4],[-5,2],[-9,5]],[[7004,4170],[6,18]],[[7010,4188],[7,19]],[[7055,4189],[-6,-19]],[[7029,4115],[-6,-17]],[[7023,4098],[-10,4],[-19,9],[-9,5]],[[6985,4116],[7,18]],[[6992,4134],[6,18]],[[6998,4152],[6,18]],[[7042,4152],[-6,-19]],[[7036,4133],[-7,-18]],[[7112,4117],[-9,-16]],[[7103,4101],[-9,4],[-50,24],[-8,4]],[[7042,4152],[8,-4],[52,-26],[2,0],[8,-5]],[[7103,4101],[-10,-17]],[[7093,4084],[-9,5],[-47,22],[-8,4]],[[7093,4084],[-9,-16]],[[7084,4068],[-9,4],[-44,22],[-8,4]],[[7084,4068],[-8,-16],[-51,24],[-8,4]],[[7017,4080],[6,18]],[[7111,4026],[-30,17],[-13,-24],[-9,4],[-12,6],[-5,2],[-11,5],[-18,8],[-3,2],[-4,2]],[[7006,4048],[5,17],[6,15]],[[7112,4117],[39,-18]],[[7006,4048],[-8,4],[-31,15]],[[6967,4067],[6,16],[6,15]],[[6979,4098],[6,18]],[[9369,8355],[0,8],[-4,16],[1,11],[7,31],[4,18],[2,4],[5,11],[2,10],[4,21]],[[9390,8485],[66,-17]],[[9438,8382],[-18,4],[-1,-18],[3,-20],[-6,-3],[-3,-1],[-5,1],[-39,10]],[[9308,8311],[7,34],[5,27],[6,28],[5,24],[5,21],[6,30],[4,21]],[[9346,8496],[44,-11]],[[9369,8355],[-6,-27]],[[9363,8328],[-5,-30]],[[9358,8298],[-21,6],[-6,1],[-23,6]],[[9346,8496],[7,31],[8,39]],[[9361,8566],[19,-5],[11,-2],[8,0],[1,-11],[0,-11],[-6,-31],[18,-4],[5,24],[2,12],[0,19],[0,4],[4,1],[31,-8],[18,-5]],[[9361,8566],[7,35],[8,41],[6,25]],[[9382,8667],[27,-7],[-5,-22],[82,-22]],[[9382,8667],[6,27],[1,8],[3,9]],[[7853,5360],[11,20],[9,18]],[[7883,5417],[8,-4],[3,-2],[38,-20],[16,-8],[11,-5]],[[7959,5378],[-11,-19]],[[7948,5359],[-9,-17],[-10,-21]],[[7968,5397],[-9,-19]],[[7902,5454],[9,-4],[2,-1],[55,-28],[2,-1],[8,-5]],[[7912,5473],[9,-4],[2,-1],[25,-13],[30,-15],[2,-2],[8,-4]],[[7922,5492],[9,-5],[2,-1],[54,-28],[3,-2],[2,-1],[6,-3]],[[7932,5511],[9,-5],[2,-1],[54,-28],[2,-1],[9,-5]],[[7942,5529],[8,-4],[9,-4],[10,18],[9,18],[2,4],[42,-22],[14,-7],[2,-3]],[[7982,5606],[17,-9],[50,-25],[9,-5]],[[8001,5642],[9,-5],[1,0],[65,-34]],[[8001,5642],[11,21],[3,6],[8,14]],[[8023,5683],[11,-6],[57,-29],[8,-4]],[[8023,5683],[10,20],[10,20],[11,20],[13,26]],[[8142,5727],[-12,-23],[-10,-20]],[[8120,5684],[-11,-20],[-10,-20]],[[8120,5684],[8,-4],[1,-1],[57,-29],[9,-5]],[[8195,5645],[-11,-19],[-10,-20]],[[8142,5727],[8,-4],[66,-37]],[[8216,5686],[-11,-21],[-10,-20]],[[8166,5772],[73,-42]],[[8239,5730],[-12,-22],[-11,-22]],[[8239,5730],[28,-16],[3,-2]],[[8270,5712],[-1,-6],[-2,-10],[-1,-8],[0,-3],[-1,-9],[-1,-3],[-1,-2],[-1,-7],[-1,-4],[-1,-2],[-1,-2],[-2,-6],[-1,-2],[-1,-2],[-3,-5],[-10,-20],[-4,-8],[-7,-11],[-6,-12],[-4,-8],[-8,-14],[-4,-7]],[[8166,5772],[7,19],[8,19]],[[8181,5810],[17,-9],[18,-11]],[[8216,5790],[39,-22],[27,-15],[2,-2]],[[8216,5790],[7,19],[3,5],[7,18],[2,5],[8,18],[2,5],[2,6],[-19,10],[-2,-3],[1,-3],[-5,-12],[-19,12]],[[8181,5810],[20,54],[2,6]],[[2386,3567],[-7,-7],[-9,-11],[-10,-9],[-8,-9],[-9,-13],[-2,-7],[-4,-8],[-3,-12],[-3,-10],[0,-11],[0,-23],[-1,-13],[2,-19],[0,-9],[-1,-8],[-2,-4],[-4,-12],[-8,-11],[-36,-14],[-9,-5],[-9,-9],[-5,-6],[-2,-7],[0,-12],[0,-9],[0,-3],[2,-4],[1,-29],[2,-11],[0,-15],[2,-19],[2,-7],[4,-8],[3,-4],[10,-12],[12,-7],[3,-7],[2,-6],[1,-3],[4,-3],[1,-3],[1,-7],[0,-20],[-3,-13],[-2,-3],[-5,-16],[-2,-4],[-3,-3],[-4,-1],[-10,-6],[-3,-3],[-2,-3],[-11,-15],[-3,-10],[-1,-9],[-4,-14],[-6,-5],[-5,-3],[-1,-2],[0,-4],[0,-9],[1,-18],[1,-3],[4,-6],[6,-3],[1,-1],[0,-2],[-1,-5],[-3,-5],[-1,-5],[-2,-4],[-4,-12],[-2,-5],[-1,-1],[-5,-4],[-7,-4],[-6,-5],[-4,0],[-8,1],[-5,-3],[-6,-9],[-10,-11],[-3,-6],[-5,-3],[-2,-7],[-2,-10],[-4,-6],[-6,-3],[-2,-2],[-5,-6],[-1,-3],[-3,-5],[0,-4],[-3,-4],[-2,-1]],[[2259,3137],[3,6],[2,5],[1,3],[1,8],[2,9],[1,2],[0,5],[1,5],[0,4],[1,6],[-1,2],[0,2],[-2,6],[-1,3],[0,2],[-1,2],[-1,2],[-2,3],[-8,12],[-4,8],[-2,4],[-1,4],[0,7],[1,3],[0,3],[1,3],[2,9],[1,7],[0,2],[1,3],[-1,3],[0,5],[0,6],[-1,8],[0,5],[-1,16]],[[2164,3320],[7,6],[1,0],[13,-19],[5,6],[4,5],[4,6],[2,2],[2,3],[1,2],[6,8],[6,10]],[[7883,4323],[-8,-15]],[[7875,4308],[-3,2],[-8,6],[-1,1],[-26,20]],[[7837,4337],[-79,61],[8,14]],[[7766,4412],[71,-53],[8,-7]],[[7682,4356],[4,6],[55,78]],[[7741,4440],[1,-1],[0,-1],[2,-2],[1,-7],[21,-17]],[[7837,4337],[-5,-9],[-5,-9],[-10,-18],[-14,-26]],[[7875,4308],[-11,-18],[-10,-19],[-14,-24]],[[7869,4225],[-10,7],[-11,8],[-8,7]],[[7872,4148],[-7,6],[-31,23],[-8,6],[-7,6],[-9,6]],[[7863,4133],[-7,5],[-32,24],[-7,5],[-7,6],[-8,6]],[[7850,4108],[-47,35],[-2,-3],[-13,11],[-2,1]],[[7447,4255],[-10,7],[-44,34],[-9,6]],[[7384,4302],[9,17]],[[7393,4319],[8,14]],[[7401,4333],[63,-47]],[[7464,4286],[-9,-14],[-8,-17]],[[7447,4255],[-10,-17],[-9,7],[-44,34],[-9,7]],[[7375,4286],[9,16]],[[7305,4338],[9,17]],[[7314,4355],[10,-7],[20,-15],[31,-24],[9,-7]],[[7375,4286],[-10,7],[-51,38],[-9,7]],[[7314,4355],[9,17]],[[7323,4372],[10,-7],[6,-5],[45,-34],[9,-7]],[[7323,4372],[9,14]],[[7332,4386],[7,13]],[[7339,4399],[50,-38],[19,-15]],[[7408,4346],[-7,-13]],[[7353,4424],[69,-53]],[[7422,4371],[-7,-13],[-7,-12]],[[7339,4399],[6,11],[8,14]],[[7353,4424],[-69,52]],[[7284,4476],[7,14],[7,11]],[[7298,4501],[68,-52]],[[7366,4449],[46,-34],[6,-5],[18,-14]],[[7436,4396],[-6,-11],[-8,-14]],[[7366,4449],[7,11],[6,11]],[[7379,4471],[6,12],[7,11]],[[7392,4494],[69,-52]],[[7461,4442],[-6,-11],[-6,-12],[-7,-12],[-6,-11]],[[7298,4501],[6,11],[6,11]],[[7310,4523],[69,-52]],[[7310,4523],[-37,27],[-18,14],[-2,2],[-1,1],[-1,2]],[[7251,4569],[1,4],[2,8],[5,12]],[[7259,4593],[64,-47]],[[7323,4546],[69,-52]],[[7323,4546],[7,11],[9,18],[7,12],[7,14]],[[7353,4601],[69,-52]],[[7422,4549],[-7,-13],[-7,-12],[-9,-18],[-7,-12]],[[9197,7781],[97,-26],[62,-16],[52,-15]],[[9408,7724],[52,-14]],[[9460,7710],[61,-17]],[[9019,7016],[-207,59],[-36,11]],[[8776,7086],[18,116],[4,22],[-218,166],[-2,2],[-17,11],[-3,3]],[[8558,7406],[-3,2],[-4,2],[-28,22],[-2,1],[-351,274]],[[8170,7707],[44,47],[3,4],[3,2]],[[8220,7760],[2,3],[18,20],[11,12],[38,41],[6,7],[30,32],[43,47],[5,5],[39,43],[21,23],[8,8],[2,1]],[[8615,8154],[3,-3],[3,-1],[10,8],[37,-30],[39,-29],[129,-99],[20,-14],[5,-4],[3,-2],[4,-3],[23,-18],[46,-34],[19,-13],[91,-68],[54,-41],[62,-17],[7,-2],[24,-2],[3,-1]],[[8776,7086],[-14,-61],[-68,22],[-4,-7],[-51,20],[-33,-49]],[[8606,7011],[-22,16],[-4,3],[-9,7]],[[8571,7037],[12,22],[1,11],[1,26],[4,7],[-12,9],[-5,3],[-3,2],[-5,3],[-6,4],[-4,20],[-35,23]],[[8379,7068],[1,2],[18,33],[10,19],[16,32],[9,16],[27,50],[22,43],[9,17],[11,19],[5,11],[4,7],[4,8],[40,75],[0,1],[1,0],[0,1],[2,4]],[[8571,7037],[-17,12],[-8,-15]],[[8606,7011],[-8,-14],[-7,-14]],[[8977,6880],[-2,1],[-41,16]],[[9430,7831],[-4,-22],[-5,-21],[-5,-24],[-5,-27],[-3,-13]],[[9197,7781],[14,62],[8,43],[5,23],[2,8],[2,13],[5,22]],[[9233,7952],[31,-8],[66,-18]],[[9330,7926],[-5,-21],[-4,-22],[-5,-22],[61,-16],[53,-14]],[[9430,7831],[53,-14]],[[9483,7817],[-5,-22]],[[9478,7795],[-4,-22],[-5,-24],[-6,-26],[-3,-13]],[[9430,7831],[5,22],[1,6],[3,15],[4,22],[5,22],[53,-14]],[[9501,7904],[-5,-22],[-4,-22],[-5,-21],[-4,-22]],[[9539,7779],[-61,16]],[[9501,7904],[2,10],[8,24],[2,3]],[[9330,7926],[4,22],[8,36],[0,3]],[[9342,7987],[51,-14]],[[9393,7973],[43,-11],[44,-12],[33,-9]],[[9393,7973],[4,21],[4,20]],[[9401,8014],[4,21],[4,23],[5,21]],[[9268,8006],[4,20],[4,20],[41,-11],[43,-10],[41,-11]],[[9342,7987],[-45,12],[-20,5],[-9,2]],[[6454,4165],[-1,-3],[-4,-11],[-1,-3],[-1,-2],[0,-1],[-1,-6],[0,-6],[3,-8],[12,-29],[2,-9],[2,-8],[1,-15],[-2,-20],[-5,-19],[-3,-13],[-3,-8],[-4,-13],[-8,-16],[-9,-24],[-2,-6],[-12,-32],[2,-1],[-1,-2],[-4,-11],[-1,-3],[-8,-20],[0,-2],[-20,-46],[-4,-10],[-5,-11],[-15,7],[-36,16],[-12,5],[-33,16],[-1,-4],[-12,-34],[2,-2],[23,-11],[1,-1],[0,-1],[0,-1],[-7,-18],[-1,-1],[-2,-1],[-2,1],[-19,9],[-4,0],[-9,-26]],[[6250,3761],[-23,-65],[-24,-69]],[[6203,3627],[-26,-75]],[[6153,3913],[0,7],[0,10]],[[6087,3914],[12,30]],[[6764,4366],[-2,-12]],[[6762,4354],[-9,4],[-24,12],[-30,9],[-6,-16],[-4,-11],[-3,-9]],[[6686,4343],[-6,-18]],[[6680,4325],[-78,35],[-5,3]],[[6680,4325],[-7,-18]],[[6673,4307],[-81,36],[-1,3],[3,9]],[[6673,4307],[-7,-19]],[[6748,4315],[-7,-18]],[[6741,4297],[-8,4],[-29,13],[-24,11]],[[6686,4343],[24,-11],[28,-13],[10,-4]],[[6755,4335],[-7,-20]],[[6762,4354],[-7,-19]],[[6718,3553],[33,50],[12,34]],[[6763,3637],[21,-11],[-10,-24],[24,-11],[-13,-24],[-11,-20],[-10,-20],[10,-9],[4,-3],[6,-4]],[[9346,8496],[-3,1],[-19,5],[3,18],[0,2],[-2,2],[-9,2],[7,32],[-1,3],[-2,1],[-15,4],[-18,5],[-6,-36],[-18,5],[-18,5],[7,35],[-18,4],[3,14],[-6,2],[-4,2],[-2,3],[-1,3],[0,4]],[[9224,8612],[27,34],[20,22],[6,5],[18,18],[-14,4],[19,16],[-2,3],[4,21]],[[9224,8612],[-7,-10],[-18,-21],[-20,-14],[-10,-6],[-9,-4],[-5,-2],[-6,-3],[-6,-3],[5,20],[3,17]],[[9151,8586],[1,13],[1,26],[1,21],[-2,30],[-2,14],[-6,42],[-3,26]],[[9141,8758],[7,-4],[6,-4],[7,-4],[1,1],[2,0],[2,0],[66,-18],[5,24],[65,-18]],[[9141,8758],[1,1],[0,2],[0,2],[0,3],[0,4],[-1,14],[0,5],[-1,9],[-1,17],[0,6],[-1,15],[-4,40],[-2,13],[0,9],[-1,9],[-1,16],[0,6],[6,3],[0,6],[1,9],[0,4]],[[7575,4830],[-48,37],[-3,-6],[-14,10],[-7,5]],[[7503,4876],[9,18]],[[7512,4894],[7,-6],[12,-9],[4,10],[1,4],[4,0],[5,2],[2,5],[1,4],[3,8],[48,-36]],[[7599,4876],[-6,-12],[-6,-11],[-6,-11],[-6,-12]],[[7575,4830],[-6,-12],[-7,-12]],[[7562,4806],[-46,36],[-15,11],[-7,5]],[[7494,4858],[9,18]],[[7553,4786],[-69,53]],[[7484,4839],[5,10],[5,9]],[[7562,4806],[-4,-10],[-5,-10]],[[7521,4729],[-54,40],[-5,4],[-11,8]],[[7451,4781],[6,11],[6,9],[5,9],[5,10]],[[7473,4820],[6,9],[5,10]],[[7553,4786],[-5,-10],[-6,-10]],[[7542,4766],[-5,-9],[-5,-9],[-5,-9],[-6,-10]],[[7498,4689],[-17,13],[-8,8],[-34,25],[-10,7]],[[7429,4742],[11,19]],[[7440,4761],[6,10],[5,10]],[[7521,4729],[-7,-11],[-5,-10],[-5,-10],[-6,-9]],[[7475,4645],[-10,7],[-51,37],[-9,7]],[[7405,4696],[14,26]],[[7419,4722],[10,20]],[[7498,4689],[-5,-10],[-5,-10]],[[7488,4669],[-7,-13],[-6,-11]],[[7461,4621],[-9,7],[-51,37],[-9,7]],[[7392,4672],[13,24]],[[7475,4645],[-14,-24]],[[7461,4621],[-13,-23]],[[7448,4598],[-9,6],[-51,37],[-9,7]],[[7379,4648],[13,24]],[[7448,4598],[-6,-13],[-6,-10]],[[7436,4575],[-63,46],[-6,5]],[[7367,4626],[6,10],[6,12]],[[7353,4601],[8,13],[6,12]],[[7436,4575],[-6,-12],[-8,-14]],[[7491,4498],[-69,51]],[[7436,4575],[60,-44],[9,-7]],[[7505,4524],[-6,-12],[-8,-14]],[[7491,4498],[-7,-13],[-7,-12],[-5,-11],[-4,-7],[-2,-3],[-5,-10]],[[7518,4547],[-6,-12],[-7,-11]],[[7448,4598],[11,-8],[50,-37],[9,-6]],[[7531,4571],[-13,-24]],[[7461,4621],[11,-7],[23,-17],[14,-10],[13,-10],[9,-6]],[[7475,4645],[10,-7],[50,-37],[9,-7]],[[7544,4594],[-13,-23]],[[7488,4669],[9,-8],[50,-38],[9,-7]],[[7556,4616],[-12,-22]],[[7498,4689],[69,-53]],[[7567,4636],[34,-27],[-5,-9],[-5,-10],[-23,17],[-12,9]],[[7521,4729],[68,-54]],[[7589,4675],[-6,-10],[-5,-10]],[[7578,4655],[-6,-10],[-5,-9]],[[7542,4766],[69,-53]],[[7611,4713],[-6,-9],[-5,-9]],[[7600,4695],[-5,-9],[-6,-11]],[[7553,4786],[68,-53]],[[7621,4733],[-5,-10],[-5,-10]],[[7562,4806],[69,-52]],[[7575,4830],[68,-53]],[[7599,4876],[68,-53]],[[7599,4876],[5,11],[6,12]],[[7610,4899],[6,11],[6,12]],[[7622,4922],[34,-27],[35,-27]],[[7259,4593],[4,13],[4,14],[2,6]],[[7269,4626],[3,7],[4,8],[2,5],[4,7]],[[7282,4653],[71,-52]],[[7282,4653],[8,13],[6,12]],[[7296,4678],[71,-52]],[[7296,4678],[6,10],[6,12]],[[7308,4700],[10,-8],[51,-37],[10,-7]],[[7308,4700],[13,24]],[[7321,4724],[10,-7],[51,-38],[10,-7]],[[7321,4724],[13,24]],[[7334,4748],[10,-7],[51,-38],[10,-7]],[[7334,4748],[9,16],[6,10]],[[7349,4774],[9,-7],[52,-38],[9,-7]],[[7349,4774],[10,20]],[[7359,4794],[61,-45],[9,-7]],[[7359,4794],[6,9],[5,11]],[[7370,4814],[7,-6],[63,-47]],[[7370,4814],[5,9],[6,11]],[[7381,4834],[70,-53]],[[7381,4834],[6,10],[5,10]],[[7392,4854],[5,9],[5,10]],[[7402,4873],[71,-53]],[[7402,4873],[6,10],[6,10]],[[7414,4893],[70,-54]],[[7414,4893],[4,9],[4,9]],[[7432,4928],[7,-5],[16,-12],[18,-13],[21,-16],[9,-6]],[[7461,4983],[8,-6],[53,-39],[9,-7]],[[7531,4931],[-10,-20],[-9,-17]],[[7541,4951],[-10,-20]],[[7482,5022],[8,-6],[30,-22],[16,-7],[17,-12]],[[7553,4975],[-12,-24]],[[7565,4997],[-6,-11],[-6,-11]],[[7446,5078],[8,-6],[31,-23],[8,-6],[10,20]],[[7503,5063],[8,-6],[18,-13],[-1,-3],[-4,-7],[-2,-4],[43,-33]],[[7503,5063],[11,19],[6,11],[6,11]],[[7526,5104],[39,-29],[12,-8],[18,-13]],[[7595,5054],[-6,-11],[-6,-12],[-6,-11]],[[7577,5020],[-6,-12],[-6,-11]],[[7636,4427],[6,11],[5,8]],[[7647,4446],[13,24]],[[7660,4470],[9,18],[2,6],[2,0],[9,-7],[29,-22],[30,-25]],[[7696,4593],[11,-9],[20,-15],[3,-1],[30,-23]],[[7760,4545],[33,-25]],[[7793,4520],[4,-3]],[[7797,4517],[-2,-2],[-19,-25]],[[7776,4490],[-11,-15],[-24,-35]],[[7660,4470],[-13,9],[-45,35],[-8,6]],[[7594,4520],[13,23]],[[7607,4543],[42,65],[-34,25],[-14,5],[-23,17]],[[7589,4675],[33,-25],[4,-3],[31,-24],[39,-30]],[[7696,4593],[4,8],[4,7]],[[7704,4608],[5,11],[6,12]],[[7715,4631],[36,-28],[8,-7],[7,-3]],[[7766,4593],[1,-22],[-2,-9],[-3,-13],[-2,-4]],[[7814,4558],[-8,6],[-27,21],[-7,5],[-6,3]],[[7715,4631],[4,7],[2,4],[1,1],[4,8]],[[7726,4651],[24,-17],[8,-7],[4,-3]],[[7762,4624],[1,-4],[6,-4],[8,-6],[38,-29],[8,-7],[-9,-16]],[[7793,4520],[2,3],[10,19],[9,16]],[[7762,4624],[-3,29],[20,-16],[12,-7],[2,-2]],[[7793,4628],[27,-20],[15,-12],[20,-15]],[[7855,4581],[-3,-2],[-19,-16],[-11,-11]],[[7822,4552],[-4,-5],[-21,-30]],[[7804,4647],[-6,-9],[-5,-10]],[[1616,411],[-3,-1],[-36,-16],[-25,-12],[-8,-4],[-33,-14],[-12,-6],[-12,-4],[-28,-10],[-6,27],[-25,-7],[-27,-9]],[[848,76],[6,21]],[[908,104],[10,4],[6,2],[3,1],[8,1],[4,-1],[19,-5],[0,4],[1,11],[1,20],[1,7],[-1,7],[0,6],[1,3],[2,2],[3,8],[1,19],[9,2],[7,2],[10,3],[10,4],[49,35],[29,21],[4,2],[5,0],[8,-1],[12,0]],[[1110,261],[5,-1],[4,0],[4,0],[9,2],[43,13],[10,2],[26,5]],[[1618,401],[-3,-2],[-4,-7],[-5,-9],[-9,-13],[-11,-22],[-9,-1],[-24,-23],[-8,-4],[-6,-4],[-1,-2],[-2,-5],[-8,-4],[-9,-2],[-15,1],[-3,1],[-16,4],[-31,0],[-21,2],[-8,1],[-4,2],[-13,0],[-6,-3],[-2,0],[-18,-8],[-1,3],[-11,-8],[-17,-5],[-4,-4],[-11,-7],[-7,-6],[-3,-1],[-9,-6],[-4,2],[-23,-14],[-15,-14],[-2,-4],[-8,-4],[-10,-9],[-13,-5],[-4,0],[-3,-5],[-2,-2],[-5,-7],[-2,-6],[-5,-6],[-4,-5],[-6,-2],[-13,-8],[-7,-2],[0,-13],[-1,0],[-1,13],[-2,0],[-4,4],[-6,2],[-11,1],[-6,-1],[-12,-8],[-5,-8],[-5,-14],[-3,-7],[-6,-13],[-2,-4],[-1,-11],[1,-32],[-8,-14],[-6,-6],[-2,-2],[0,-3],[-2,-4],[-4,-7],[-5,-3],[-2,0],[-2,2],[-7,5],[-9,3],[-5,-2],[-3,-3],[-1,-21],[-1,-3],[-2,-1],[-3,2],[-1,4],[5,0],[0,31],[-12,2],[-3,-31],[5,-1],[0,-4],[-10,1],[-1,1],[-1,2],[0,7],[-1,0],[-4,6],[-12,0],[-7,-1],[-3,6],[-2,3],[-3,0],[-5,-1],[-15,-5],[-4,-3],[-5,-10],[-2,-2],[-5,-2],[-11,0],[-1,2],[-1,13],[-3,2],[-3,-6],[-3,-2],[-6,0],[-13,1],[-9,3],[-4,3],[-4,4],[-3,5],[-9,6],[-4,13],[-1,4],[-3,3],[-8,0],[-3,-1],[-23,-1],[-10,-1],[-7,-2],[-3,-2],[-1,-1]],[[6421,5195],[-62,30]],[[6359,5225],[4,11],[4,11]],[[6367,5247],[4,11],[4,13],[9,24]],[[6397,5128],[-61,30]],[[6336,5158],[4,11],[3,11]],[[6343,5180],[5,12],[4,11],[3,11],[4,11]],[[6413,5173],[-4,-11],[-4,-11],[-4,-12],[-4,-11]],[[6319,5112],[4,12],[5,11],[4,12],[4,11]],[[6397,5128],[-4,-11],[-4,-11],[-4,-12],[-5,-13]],[[6258,5141],[4,13],[4,11],[4,11],[4,12]],[[6274,5188],[4,11],[4,11]],[[6282,5210],[61,-30]],[[6474,5143],[-4,-11],[-4,-11],[-4,-11],[-4,-12],[-4,-11],[-4,-11],[-4,-12],[-4,-12]],[[7053,6499],[15,13],[14,12],[14,13],[13,19],[-19,29],[14,13],[9,7],[14,13],[-13,22]],[[7180,6696],[19,-30]],[[7199,6666],[30,-46],[2,-3]],[[7511,6675],[-2,-1],[-21,-19],[-2,-2],[-14,-13],[65,-49]],[[7231,6617],[33,65],[3,6],[60,120],[13,26],[23,35],[25,33],[16,20],[28,-36],[14,13],[-5,21],[13,15]],[[6770,5704],[-4,3],[-33,22],[-8,6]],[[6725,5735],[10,21]],[[6797,5762],[-1,-2],[-8,-18],[-8,-17],[-10,-21]],[[6851,5547],[-58,43]],[[6820,5639],[6,11],[6,11],[6,11],[5,9],[5,9],[4,8],[3,7],[9,-6],[1,3]],[[6714,5593],[-5,3]],[[6709,5596],[11,21],[11,21],[-32,23],[-9,6]],[[6690,5667],[11,22],[12,24],[12,22]],[[6709,5596],[-32,23],[-9,6],[-8,6],[-42,28],[-8,6]],[[6610,5665],[10,20]],[[6620,5685],[9,-6],[41,-28],[8,-6],[12,22]],[[6620,5685],[11,23],[-50,34],[-8,6]],[[6573,5748],[11,22]],[[6584,5770],[12,23]],[[6610,5665],[-9,6],[-41,29],[-9,6]],[[6551,5706],[11,20],[11,22]],[[6590,5626],[-59,41]],[[6531,5667],[10,19],[10,20]],[[6610,5665],[-10,-20],[-10,-19]],[[6662,5490],[-4,4],[-42,28]],[[6616,5522],[9,18],[13,25],[1,3],[9,18],[-58,40]],[[7178,4851],[-30,22]],[[7148,4873],[-57,42]],[[7148,4873],[-9,-17],[-12,-22],[30,-23]],[[4805,3933],[-5,6],[-47,49]],[[4753,3988],[7,8],[-13,14],[-11,11],[-1,1],[0,1],[-1,1],[1,1],[5,7],[-13,14],[28,37],[6,-6],[7,-8],[4,-3]],[[4772,4066],[9,-11],[16,-16],[4,-2],[14,-15],[15,-15],[15,-15],[6,-7]],[[4851,3985],[-2,-3],[-44,-49]],[[4546,3539],[-4,6],[20,11],[11,8],[8,6],[3,6],[-2,-1],[-1,0],[-1,0],[-3,3],[-43,47],[17,19],[16,-18],[16,-16],[26,15],[1,1],[-1,2],[-39,41],[4,5],[0,2],[-1,2],[-13,13]],[[4560,3691],[13,20],[16,24],[9,15],[2,4],[7,14],[6,13],[3,8],[10,23],[7,15],[13,18],[12,17],[13,18],[14,18],[14,18],[8,10],[10,13],[11,11],[7,9],[18,29]],[[4805,3933],[133,-148],[2,-3],[4,-4],[2,-1]],[[4946,3777],[-89,-54],[-10,-5]],[[6846,4116],[-16,-46],[1,0],[12,-1],[11,-2],[10,-3],[3,-2],[8,-5],[7,-6],[4,-4],[3,-2],[6,-3],[-25,-68],[0,-3],[-6,-5],[-3,-4],[-3,-5],[-4,-9],[-1,-8],[0,-7],[-1,-8],[-2,-9],[-3,-8]],[[6847,3908],[-20,10],[-24,11]],[[6803,3929],[-20,9],[-20,10],[-19,10]],[[6891,4103],[76,-36]],[[6967,4067],[-1,-4],[-18,8],[-1,-4],[-18,-49],[-21,-62]],[[6908,3956],[-1,-3],[-13,-35],[0,-3],[0,-3],[1,-3],[2,-8],[-26,-12]],[[6871,3889],[-4,10],[-3,2],[-17,7]],[[6878,3872],[-5,12],[-2,5]],[[6908,3956],[18,-9],[18,-9],[14,-6],[4,-2],[2,-1]],[[6964,3929],[-1,-3],[0,-2],[-4,-10],[-3,-5],[-23,-64],[-19,9],[-18,9],[-18,9]],[[6903,3730],[-7,4],[-3,1],[-18,8],[-19,9],[-19,8]],[[6837,3760],[15,39],[26,73]],[[6964,3929],[33,-17],[36,-17],[1,0]],[[6837,3760],[-9,4],[-11,-27],[-3,-4]],[[6814,3733],[-6,3],[-20,10],[-2,2],[19,54],[-5,2],[-7,12],[-9,25],[-1,4]],[[6783,3845],[-5,13],[25,71]],[[6699,3803],[-6,13],[25,71],[26,71]],[[6783,3845],[-28,-14],[-28,-14],[-28,-14]],[[6814,3733],[-4,-13],[-16,7]],[[6794,3727],[-39,19],[-80,38]],[[6675,3784],[2,6],[1,4],[2,0],[1,0],[2,1],[16,8]],[[6675,3784],[-13,6]],[[6662,3790],[2,7],[1,3],[-5,3],[-6,3],[-1,0],[-2,0],[-8,22],[11,7],[3,2],[1,4],[22,64],[-20,10]],[[6660,3915],[24,70]],[[6662,3790],[-12,6]],[[6650,3796],[-65,31]],[[6585,3827],[1,5],[-20,9],[-19,9],[29,81]],[[6576,3931],[18,-9],[11,6],[3,1],[11,5],[20,-9],[21,-10]],[[6577,3711],[-4,9],[0,2],[0,3],[0,3],[9,27]],[[6582,3755],[19,55],[-19,9]],[[6582,3819],[3,8]],[[6650,3796],[1,-4],[-4,-14],[-3,-1],[-4,-2],[-2,-3],[-1,-2],[-9,-22],[-1,-3],[-4,-4],[-5,-4],[-9,-6],[-25,-15],[-4,-3],[-3,-2]],[[6630,3633],[-20,11],[-20,8],[-18,9]],[[6572,3661],[13,34],[-6,14],[-2,2]],[[6675,3784],[-3,-11],[-4,-18],[-7,-21],[-2,-9],[1,-27],[2,-19],[-4,0],[-14,-2],[0,-4],[-14,-40]],[[6650,3615],[-2,7],[-2,3],[-2,2],[-14,6]],[[6794,3727],[-3,-8],[-4,-14],[-24,-68]],[[6551,3599],[21,62]],[[8469,5496],[75,-40],[14,4],[4,0],[9,-4],[7,-4],[16,-8],[9,-6],[17,-11],[82,-46],[2,-1]],[[8704,5380],[-7,-23],[-4,-15],[-2,-4],[-2,-8],[-8,-24],[-7,-24]],[[8674,5282],[-3,2],[-14,8],[-6,3],[-14,8],[-32,17],[-3,-3],[-1,-8],[-14,-36]],[[8587,5273],[-9,-24],[-9,-24]],[[8569,5225],[-10,-26],[-10,-23]],[[8549,5176],[-31,-80]],[[8518,5096],[-10,-23],[-9,-23]],[[8499,5050],[-8,-21],[-3,-4]],[[8488,5025],[-6,4],[-50,27]],[[8435,5412],[6,14],[6,15],[2,5],[6,16],[14,34]],[[8334,5073],[-67,36],[-9,5]],[[8258,5114],[8,19],[1,6],[1,3]],[[8344,5102],[-1,-4],[-9,-25]],[[8313,5019],[-76,40]],[[8237,5059],[4,10],[4,10],[7,19]],[[8252,5098],[6,16]],[[8334,5073],[-6,-15]],[[8328,5058],[-8,-19],[-3,-10],[-4,-10]],[[8313,5019],[-4,-10],[-5,-13]],[[8304,4996],[-9,7],[-3,2],[-8,4],[-5,3],[-41,21],[-9,5]],[[8229,5038],[4,11],[4,10]],[[1110,261],[2,35],[2,34],[-43,5],[-32,3],[4,34],[-13,29]],[[848,76],[-2,-3],[-5,-3],[-5,-1],[-6,1],[-8,5],[-14,0],[-7,-2],[-19,-9],[-5,-5],[-5,-4],[-11,-4],[-6,-11],[-7,-7],[-4,-3],[-12,-3],[-11,-1],[-6,-2],[-26,-5],[-22,-7],[-5,-3]],[[662,9],[-5,19]],[[657,28],[-10,68],[-1,8],[-1,3],[4,-1],[-3,14],[-2,1],[-3,16],[-10,73]],[[631,210],[0,3],[-3,2],[-2,1],[-5,2],[-7,4],[-8,4]],[[606,226],[-2,2],[-13,118],[-23,37],[-36,103]],[[1019,1295],[22,13],[-2,11],[37,25],[-4,14],[132,53],[6,8],[195,119],[30,-60]],[[606,226],[-36,-15],[-36,-15],[-32,-16]],[[570,85],[-2,-2],[-15,-2],[-23,-4],[-1,21],[-13,-2],[-7,50],[0,3],[-1,8],[-1,3],[-1,4]],[[631,210],[-4,-1],[-4,-2],[-2,0],[-2,-1],[-2,-1],[-1,-1],[-31,-14],[4,-36],[1,-5],[2,-20],[2,-20],[2,-20],[-26,-4]],[[657,28],[-5,-3],[-15,-6],[-3,0],[-10,-1],[-5,0],[-8,1],[-15,1],[-17,-1],[-3,0],[-6,66]],[[662,9],[-4,-2],[-5,-1],[-4,-2],[-33,1],[-17,-1],[-1,6],[-1,0],[-1,-1],[-1,-5],[-14,-2],[-2,0],[0,2],[-1,2],[-1,-3],[-3,-3],[-4,1],[-2,0],[0,4],[-2,2],[-37,10],[-11,7],[-13,1],[-71,41],[-3,-7],[62,-37],[0,-3],[0,-2],[-7,4],[-45,26],[0,1],[-12,7],[-3,1],[-3,2]],[[1560,1505],[-9,19],[-9,44],[124,49],[25,17],[11,7],[10,4],[6,1]],[[3029,1685],[-25,40],[-28,46],[-17,-14],[-17,-14],[-15,-12],[-1,-2],[0,-2],[27,-44],[-9,-7],[-3,-2],[-2,-1],[-4,0],[-4,2]],[[2845,1617],[-8,-6]],[[2837,1611],[-43,71],[-33,59],[-15,25],[-26,42],[-2,3]],[[3084,1896],[5,-22],[10,-40]],[[3099,1834],[19,-75]],[[3118,1759],[-1,-1],[-2,-1],[-3,-3],[-53,-43],[-16,-14]],[[3127,1864],[-4,-4],[-1,-1],[-2,-3],[-2,-6],[-2,-3],[-2,-2],[-15,-11]],[[3249,2028],[10,-19],[1,-7],[-1,-39],[1,-4],[11,-20],[-20,-18]],[[3251,1921],[-39,-31],[-33,-28],[-12,19],[-7,11],[-17,-15],[-11,-9],[-5,-4]],[[7402,4873],[-69,50]],[[7392,4854],[-70,51]],[[7381,4834],[-69,51]],[[7370,4814],[-69,50]],[[8304,4996],[-13,-20]],[[8291,4976],[-10,8],[-7,6],[-5,2],[-4,2],[-35,19],[-9,4]],[[8221,5017],[8,21]],[[8233,4878],[-44,22],[-1,0],[-2,-1],[0,-1],[-1,-1],[-7,-18],[-1,-3]],[[8177,4876],[-15,6],[-4,3]],[[8158,4885],[8,20],[6,18],[4,11],[4,7],[5,11],[6,9],[11,17],[4,7],[5,11]],[[8211,4996],[5,10],[5,11]],[[8291,4976],[-12,-20]],[[8279,4956],[-13,-21]],[[8266,4935],[-12,-20],[-13,-20]],[[8241,4895],[-4,-7],[-4,-10]],[[8211,4996],[-2,1],[-10,6],[-48,24],[-9,5]],[[8142,5032],[8,22]],[[8150,5054],[8,22]],[[8158,5076],[9,-5],[52,-28],[8,-3],[2,-2]],[[8158,5076],[6,11],[5,8]],[[8169,5095],[66,-35],[2,-1]],[[8169,5095],[5,10],[5,9],[5,8],[6,9]],[[8190,5131],[60,-31],[2,-2]],[[8190,5131],[5,9],[3,6],[3,5],[3,6],[1,2],[4,10],[1,4]],[[8058,5280],[-2,1],[-7,4],[-25,13],[-10,5],[10,18]],[[8024,5321],[10,18],[9,19]],[[7948,5359],[8,-4],[3,-1],[54,-28],[3,-1],[8,-4]],[[8174,4331],[12,20],[14,24]],[[8200,4375],[9,-6],[30,-24],[9,-6]],[[8200,4375],[9,17]],[[8209,4392],[67,-52]],[[8209,4392],[10,17]],[[8219,4409],[60,-49]],[[8219,4409],[10,18],[12,19],[11,20]],[[8252,4466],[8,-6],[22,-15],[2,-2],[11,-8]],[[8219,4409],[-8,6],[-9,8],[-30,23],[-9,7]],[[8163,4453],[21,35],[-8,7],[-19,13],[-10,8],[-9,7]],[[8138,4523],[9,16]],[[8147,4539],[38,-27],[9,-6],[8,-6],[20,-14],[20,-14],[10,-6]],[[8209,4392],[-7,6],[-20,15],[-20,16],[-9,6]],[[8153,4435],[10,18]],[[8200,4375],[-16,12],[-8,-14],[-31,25],[-9,7]],[[8136,4405],[8,14]],[[8144,4419],[9,16]],[[8174,4331],[-56,44]],[[8118,4375],[6,10],[6,10],[6,10]],[[8062,4390],[11,20]],[[8073,4410],[9,-7],[36,-28]],[[8073,4410],[11,20]],[[8084,4430],[6,10]],[[8090,4440],[8,-7],[1,0],[28,-21],[8,14],[1,-2],[8,-5]],[[8090,4440],[5,9]],[[8095,4449],[3,5],[8,14]],[[8106,4468],[2,3]],[[8108,4471],[8,-6],[30,-24],[7,-6]],[[8108,4471],[10,17],[10,18],[10,17]],[[8106,4468],[-9,7],[-51,40],[-9,6]],[[8037,4521],[-18,15],[-9,7]],[[8010,4543],[11,19],[28,46]],[[8049,4608],[71,-50],[27,-19]],[[8095,4449],[-69,53]],[[8026,4502],[6,10],[5,9]],[[8084,4430],[-8,7],[-23,17],[-10,8],[-19,15],[-8,6]],[[8016,4483],[4,9],[1,1],[5,9]],[[8073,4410],[-69,54]],[[8004,4464],[6,10],[6,9]],[[8062,4390],[-9,7],[-40,31],[-20,16],[-9,-16]],[[7984,4428],[-9,6],[-12,9],[-8,7]],[[7955,4450],[9,16],[11,20]],[[7975,4486],[29,-22]],[[8052,4374],[-8,6],[-53,42],[-7,6]],[[8030,4336],[-7,6],[-2,1],[-51,39],[-9,7]],[[7961,4389],[9,15],[5,8],[9,16]],[[7919,4386],[13,25]],[[7932,4411],[9,-7],[11,-8],[9,-7]],[[7932,4411],[14,23],[9,16]],[[7932,4411],[-2,2],[-7,5],[-13,10]],[[7910,4428],[6,11],[2,2],[5,10],[-7,5],[-1,1],[-50,39],[-8,6],[9,16]],[[7866,4518],[8,-6],[26,-20],[24,-19],[8,-6]],[[7932,4467],[8,-6],[5,-4],[7,-6],[3,-1]],[[7869,4393],[-8,10],[11,19]],[[7872,4422],[14,24]],[[7886,4446],[9,-7],[9,-7],[6,-4]],[[7886,4446],[-42,33],[-17,12],[-11,10],[-7,5],[-4,5],[-8,6]],[[7822,4552],[3,-3],[32,-25],[9,-6]],[[6501,3793],[-7,-19],[-17,-41]],[[6477,3733],[-5,-9],[-3,-6],[-4,-5],[-6,-9],[-5,-6],[-7,-7]],[[6379,3781],[20,-10],[20,-10],[13,28],[14,17]],[[6446,3806],[2,-2],[3,-1],[4,0],[4,2],[2,3],[2,2],[19,-9],[10,-5],[9,-3]],[[6403,3841],[21,-11],[19,-10],[0,-4],[0,-2],[0,-3],[1,-2],[2,-3]],[[6582,3819],[-21,11],[-19,8],[-19,9],[-9,-22],[-13,-32]],[[6426,3903],[3,-1],[20,-10],[19,-9],[4,-2],[8,-4],[10,-5],[36,-17],[39,-18],[20,-10]],[[6523,3965],[1,-2],[2,-3],[1,-2],[0,-4],[12,-6],[18,-8],[19,-9]],[[6527,4004],[4,12],[4,9],[18,-9],[2,-1],[8,8],[7,5],[4,2],[4,1],[4,1],[7,0],[6,-2],[14,-6],[16,-8],[1,-2]],[[7359,4794],[-69,50]],[[7334,4748],[-36,26],[-4,-8],[-33,24]],[[7296,4678],[-35,26]],[[7269,4626],[-69,52]],[[7259,4593],[-40,31]],[[7219,4624],[-34,26],[-23,17]],[[7190,4582],[-8,4],[-15,8]],[[7167,4594],[2,8],[4,9],[7,13],[-29,22]],[[7219,4624],[-5,-10],[-6,-10],[-7,-13],[-11,-9]],[[7247,4555],[-6,3],[-44,21],[-7,3]],[[7251,4569],[-2,-6],[-2,-8]],[[7241,4535],[-7,4],[-7,3],[-5,2],[-39,19],[-23,11],[-35,17]],[[7133,4610],[34,-16]],[[7247,4555],[-3,-14],[-3,-6]],[[7234,4514],[-10,6],[-48,22]],[[7176,4542],[-58,29]],[[7241,4535],[-2,-6],[-3,-9],[-2,-6]],[[7162,4500],[-38,18],[-21,10]],[[7176,4542],[-4,-12],[-4,-11],[-3,-10],[-3,-9]],[[7162,4500],[-4,-10],[-4,-10],[-4,-11],[0,-2],[-4,-9]],[[7162,4500],[40,-20],[3,-1],[7,-4]],[[7212,4475],[-11,-19],[-16,-28]],[[7185,4428],[-7,-14],[-2,-1],[-1,-2]],[[7234,4514],[-12,-19],[0,-2],[-3,-4],[-7,-14]],[[7284,4476],[-50,38]],[[7332,4386],[-39,29]],[[7293,4415],[-9,7],[-9,6],[7,13],[-6,5],[-10,7]],[[7266,4453],[10,9],[8,14]],[[7305,4338],[-9,7],[-21,16],[-9,7],[-8,6],[-10,7]],[[7248,4381],[10,17]],[[7258,4398],[9,-7],[8,-6],[9,16],[9,14]],[[7283,4299],[-6,4]],[[7277,4303],[-3,3],[-21,15],[-9,7],[-8,6],[-10,8]],[[7226,4342],[6,11],[6,10],[7,11],[3,7]],[[7305,4338],[-10,-18],[-12,-21]],[[7215,4350],[11,-8]],[[7277,4303],[-6,-10],[-5,-9],[-5,-9],[-1,-2],[-5,-9],[-12,9]],[[7185,4428],[9,-6],[13,-10],[13,-10],[10,-7],[10,17],[9,-7],[9,-7]],[[7962,5097],[10,-5],[51,-26],[9,-4]],[[8032,5062],[-8,-20],[-7,-19]],[[7984,5141],[9,-5],[1,-1],[46,-24],[9,-5]],[[8049,5106],[-8,-22],[-9,-22]],[[8058,5129],[-9,-23]],[[8006,5182],[9,-4],[43,-23],[8,-5]],[[8066,5150],[-2,-4],[-6,-17]],[[8074,5170],[-8,-20]],[[8026,5219],[1,-1],[7,-3],[39,-21],[8,-5]],[[8081,5189],[-7,-19]],[[8089,5209],[-8,-20]],[[8099,5232],[-2,-3],[-8,-20]],[[8136,5160],[-8,-19]],[[8128,5141],[-9,4],[-37,20],[-8,5]],[[8089,5209],[9,-5],[8,-4],[21,-11],[8,-4],[9,-5]],[[8144,5180],[-8,-20]],[[8153,5203],[-1,-3],[-8,-20]],[[8190,5131],[-46,24],[-8,5]],[[8169,5095],[-40,22],[-8,4]],[[8121,5121],[7,20]],[[8150,5054],[-10,5],[-25,14],[-9,4]],[[8106,5077],[7,23]],[[8113,5100],[8,21]],[[7112,4117],[9,17]],[[7121,4134],[10,18]],[[7131,4152],[10,18],[-8,5],[-11,5],[-51,25],[-9,4]],[[7134,4264],[11,-4],[11,-7],[10,-10],[8,-11],[3,-7],[4,-10],[2,-15],[0,-4],[1,-17],[-2,-17]],[[6891,4103],[6,17]],[[6897,4120],[6,15]],[[6903,4135],[8,-5],[58,-27],[10,-5]],[[6903,4135],[6,17]],[[6909,4152],[9,-4],[57,-28],[10,-4]],[[6909,4152],[6,19]],[[6915,4171],[9,-5],[58,-28],[10,-4]],[[6915,4171],[7,18]],[[6922,4189],[66,-33],[10,-4]],[[6922,4189],[6,17]],[[6928,4206],[76,-36]],[[6928,4206],[7,18]],[[6935,4224],[9,-4],[57,-28],[9,-4]],[[6935,4224],[3,10],[4,10]],[[6942,4244],[75,-37]],[[6942,4244],[6,20]],[[6942,4244],[-63,31]],[[6935,4224],[-10,5],[-44,22],[-9,4]],[[6872,4255],[3,9],[4,11]],[[6928,4206],[-9,5],[-44,21],[-9,5]],[[6866,4237],[6,18]],[[6922,4189],[-9,4],[-18,9],[-27,12],[-9,4]],[[6859,4218],[7,19]],[[6909,4152],[-9,4],[-8,4],[-37,18],[-9,4]],[[6846,4182],[7,19],[6,17]],[[6897,4120],[-62,30]],[[6835,4150],[5,15]],[[6840,4165],[6,17]],[[6829,4133],[6,17]],[[6777,4195],[10,-5],[44,-21],[9,-4]],[[6790,4231],[7,18]],[[6797,4249],[9,-5],[44,-21],[9,-5]],[[6797,4249],[6,18]],[[6803,4267],[10,-5],[53,-25]],[[6803,4267],[2,7],[5,11],[6,20]],[[6816,4305],[-5,2],[-56,28]],[[6803,4267],[-8,4],[-45,22],[-9,4]],[[7965,4523],[-12,-19]],[[7953,4504],[-8,6],[-50,38],[-8,6]],[[7887,4554],[4,5],[3,4],[3,3],[5,6],[5,-3],[49,-39],[9,-7]],[[7866,4518],[9,17],[12,19]],[[7953,4504],[-11,-21],[-10,-16]],[[7959,4671],[3,-2],[7,-5],[4,-2],[27,-19],[26,-19],[2,-3],[6,-4]],[[8034,4617],[-32,6],[-33,1],[-21,-2],[-19,-5],[-5,-1],[-28,-10],[-17,-9],[-24,-16]],[[8225,4853],[-38,19],[-10,4]],[[8233,4878],[-7,-21],[-1,-4]],[[8284,4828],[-1,-4]],[[8283,4824],[-58,29]],[[8241,4895],[14,-12],[39,-32]],[[8294,4851],[-6,-11],[-4,-12]],[[8266,4935],[53,-44]],[[8319,4891],[-13,-20],[-12,-20]],[[8329,4803],[-4,5],[-41,20]],[[8319,4891],[15,-13],[4,-3],[14,-8]],[[8352,4867],[-7,-20],[-8,-23]],[[8362,4893],[-10,-26]],[[8279,4956],[18,-16],[35,-29]],[[8332,4911],[4,-4],[7,-4],[19,-10]],[[8304,4996],[18,-15],[17,-15],[-10,-17],[-1,-2],[1,-3],[15,-12],[-12,-21]],[[8313,5019],[79,-42]],[[8392,4977],[-3,-10],[-9,-25],[-18,-49]],[[8425,4960],[-11,5],[-6,4],[-16,8]],[[8328,5058],[9,-5],[69,-36],[8,-5],[1,0],[12,-7]],[[8427,5005],[-1,-22],[-1,-23]],[[8432,5056],[0,-5],[-2,-29]],[[8430,5022],[-1,-10],[-2,-7]],[[8479,4997],[-10,5],[-23,12],[-16,8]],[[8488,5025],[-1,-3],[-3,-11],[-5,-14]],[[7872,4422],[-15,12],[-55,42],[-2,-5]],[[7800,4471],[-16,12],[-8,7]],[[7869,4393],[-10,7],[-69,54],[6,11],[4,6]],[[7856,4371],[-9,7],[-70,54],[-5,-10],[-6,-10]],[[3424,1948],[-33,54],[-3,5]],[[3388,2007],[-3,4]],[[3385,2011],[17,14],[-10,16],[15,14],[1,1],[0,2],[-31,49],[17,14],[18,14],[13,12],[4,-1],[28,-46],[3,0],[16,13]],[[3385,2011],[-9,15],[-8,13],[-30,19],[-6,10],[-12,19]],[[3275,1912],[-24,9]],[[3388,2007],[-56,-48],[-57,-47]],[[3311,1854],[-24,38]],[[3287,1892],[-12,20]],[[3254,1652],[-17,29],[-5,8],[-12,21],[-4,5],[-13,19]],[[3203,1734],[4,4],[48,40],[-35,58],[17,14],[17,14],[17,14],[16,14]],[[8049,3664],[-24,19],[-6,4],[-11,8],[-9,7]],[[7999,3702],[4,9],[4,7],[5,10],[4,8],[4,7]],[[7999,3702],[-18,14],[4,8],[4,8],[-4,2],[-20,15],[4,8]],[[7969,3757],[4,9],[5,8]],[[7978,3774],[26,-18],[14,-11],[2,-2]],[[7999,3702],[-10,-18],[-7,-13]],[[7982,3671],[-11,-19],[-11,-20]],[[7874,3698],[28,51],[10,18]],[[7912,3767],[21,-15],[6,11],[6,11],[24,-17]],[[8032,3633],[-36,27],[-2,2],[-12,9]],[[7912,3767],[7,12],[5,10],[5,9],[5,9]],[[7934,3807],[20,-15],[8,-6],[16,-12]],[[7934,3807],[9,16],[8,15]],[[7951,3838],[28,-22],[8,15]],[[7987,3831],[39,-29],[0,-3],[-3,-6],[-3,-7],[16,-12]],[[7951,3838],[8,14]],[[7959,3852],[10,15],[3,7],[4,8]],[[7976,3882],[28,-21]],[[8004,3861],[-5,-8],[-3,-7],[-4,-6],[-5,-9]],[[8004,3861],[39,-29]],[[8043,3832],[7,-6],[9,-6]],[[7976,3882],[5,9],[4,7],[5,8],[4,8]],[[7994,3914],[66,-50],[-4,-8],[-5,-7],[-4,-8],[-4,-9]],[[7994,3914],[4,7],[6,11]],[[8004,3932],[-46,36]],[[7976,3882],[-46,35]],[[7930,3917],[5,9],[4,7],[8,15]],[[7947,3948],[5,8],[6,12]],[[7959,3852],[-13,10],[-33,25]],[[7913,3887],[9,15],[4,7],[4,8]],[[7913,3887],[-10,7],[8,15],[-37,29]],[[7874,3938],[4,7],[4,8],[5,9],[4,7]],[[7891,3969],[5,8],[4,7],[28,-21],[19,-15]],[[7888,3842],[-10,7],[-28,21],[-9,6]],[[7841,3876],[9,17],[4,8],[4,7],[3,6],[5,9]],[[7866,3923],[8,15]],[[7913,3887],[-8,-15],[-8,-14],[-9,-16]],[[7934,3807],[-46,35]],[[7912,3767],[-10,8],[-36,27]],[[7866,3802],[12,22]],[[7878,3824],[10,18]],[[7866,3802],[-11,-18],[-46,35],[10,18]],[[7819,3837],[6,11],[6,11],[47,-35]],[[7773,3871],[14,-10],[32,-24]],[[7794,3911],[47,-35]],[[7820,3958],[46,-35]],[[6582,3755],[-20,8],[-22,-59],[-21,9],[-21,10],[-21,10]],[[6203,3627],[19,-9],[50,-23],[7,23],[8,23],[8,23],[8,22],[7,21],[8,21],[-49,24],[-19,9]],[[7688,4681],[-5,-10],[-6,-11],[-48,37],[-9,10],[-9,6]],[[7704,4608],[-39,30],[-46,35],[-3,6],[-4,6],[-12,10]],[[7607,4543],[-11,9],[-9,8],[-32,26],[-11,8]],[[7594,4520],[-12,9],[-41,33],[-10,9]],[[8624,5710],[-47,26],[-9,5]],[[8568,5741],[13,31],[8,20],[8,20]],[[8653,5781],[-8,-20],[-8,-20],[-8,-20],[-5,-11]],[[8568,5741],[-2,2],[-9,4],[-53,29]],[[8480,5717],[8,19],[8,20]],[[8568,5741],[-8,-20],[-8,-20],[-7,-17],[-1,-3]],[[7853,5360],[-77,40]],[[7839,5334],[-9,5],[-2,1],[-65,33]],[[7827,5311],[-76,40]],[[7839,5334],[-12,-23]],[[7567,3823],[-35,26]],[[7557,3778],[-8,9],[-8,6],[-28,21]],[[8110,6557],[-3,2],[-3,2]],[[8057,6707],[10,19],[19,35],[2,3],[7,15],[6,11],[3,5],[1,2],[2,-2],[7,-7],[7,-8],[3,-4],[2,-2],[2,-2],[1,-2],[2,-2],[1,-1],[1,-2],[1,-2],[2,-2],[1,-2],[1,-1],[1,-2],[2,-3],[1,-2],[2,-2],[2,-4],[3,-3],[7,-12],[1,-2],[5,-6],[3,-4],[2,-2],[2,-3],[2,-2],[3,-3],[6,-6],[5,-3],[1,-1],[4,-3],[3,-2],[3,-1]],[[7054,6892],[-24,37]],[[7030,6929],[-12,20]],[[7018,6949],[44,38]],[[7062,6987],[13,-22],[11,-17]],[[7062,6987],[14,12]],[[7076,6999],[14,12]],[[7199,6666],[3,2],[2,0],[1,0],[15,-25],[3,-2],[2,2],[8,15],[-35,54],[-18,-16]],[[7176,6808],[23,13],[22,12],[48,27],[-2,3],[-15,23]],[[7367,6912],[5,3],[9,4],[9,6],[7,5],[6,5],[5,6],[7,7],[9,8],[6,6],[5,5],[6,4],[3,1],[6,3],[8,4],[13,5]],[[7049,4170],[8,-4],[55,-28],[2,-1],[7,-3]],[[7055,4189],[76,-37]],[[7225,4241],[86,-23],[13,-4],[1,0],[4,-3],[6,-3],[23,-15],[9,-4],[10,-1],[5,0],[28,0],[13,-2],[8,-2]],[[7283,4299],[17,-13],[34,-27],[9,-6],[9,-7]],[[7352,4246],[34,-25],[22,-17],[7,-4],[20,-15]],[[7375,4286],[-5,-9],[-5,-9],[-6,-10],[-7,-12]],[[7464,4286],[6,13],[7,12],[8,13]],[[7485,4324],[58,-44],[9,-7]],[[7485,4324],[7,14],[6,12]],[[7498,4350],[6,11],[7,11]],[[7643,5148],[-1,-3],[-12,-24],[-10,-18],[-9,-18],[-16,-31]],[[7698,5065],[-9,-19],[-24,12],[-13,-33]],[[7652,5025],[-17,9],[-2,1],[-15,7],[-10,5],[-13,7]],[[7643,5148],[10,-6],[6,-4],[51,-25],[10,-6]],[[7720,5107],[-12,-24],[-10,-18]],[[7646,4967],[-69,53]],[[7652,5025],[20,-10]],[[7672,5015],[-8,-15],[-6,-11]],[[7658,4989],[-6,-11],[-6,-11]],[[7622,4922],[-69,53]],[[7646,4967],[-6,-12],[-6,-11],[-6,-11],[-6,-11]],[[7610,4899],[-59,45],[-10,7]],[[7910,2498],[10,17],[11,17]],[[7931,2532],[10,18],[38,-31]],[[7866,2535],[14,13],[14,13]],[[7894,2561],[37,-29]],[[7821,2526],[8,19],[9,19],[8,19],[8,20],[9,19]],[[7863,2622],[13,-11],[9,-7],[15,-12],[33,30]],[[7933,2622],[12,-16],[-13,-11],[-17,-15],[-5,-6],[-16,-13]],[[7863,2622],[10,18],[11,18],[10,13],[14,14]],[[7908,2685],[15,15],[7,7],[2,2]],[[7956,2645],[-2,-3],[-21,-20]],[[7863,2622],[-43,34]],[[7856,2706],[4,4],[14,16]],[[7874,2726],[7,-8],[6,-7],[13,-16],[8,-10]],[[7874,2726],[14,16],[5,6],[15,17],[1,2],[1,1]],[[7765,2786],[20,35],[5,8]],[[7790,2829],[34,50],[3,4]],[[7911,2957],[-1,-3],[-8,-10],[-6,-8]],[[7790,2829],[-5,4],[-24,16]],[[7761,2849],[3,4],[31,47]],[[7761,2849],[-17,-18],[-13,-21],[-16,-23]],[[7646,4967],[69,-53]],[[7658,4989],[60,-46],[8,-7]],[[7672,5015],[21,-12],[55,-26]],[[7698,5065],[66,-33],[10,-5]],[[7720,5107],[12,24]],[[7732,5131],[10,-5],[2,-1],[53,-26],[3,-2],[8,-4]],[[7732,5131],[11,21]],[[7743,5152],[10,-5],[55,-28],[3,-1],[9,-5]],[[7743,5152],[13,22],[12,23]],[[7768,5197],[11,23]],[[7779,5220],[9,-5],[55,-28],[12,-6]],[[7743,5152],[-11,5],[-19,10],[-16,8],[-19,9],[-3,2],[-9,4]],[[7690,5236],[3,-1],[4,-3],[1,0],[17,-9],[3,-1],[13,-7],[27,-14],[10,-4]],[[7827,5311],[-12,-24],[-12,-23],[-24,-44]],[[7827,5311],[9,-5],[2,-1],[55,-27],[10,-6]],[[7434,2220],[-9,7],[-5,4],[-36,27],[-2,2],[-10,6],[-14,10],[-6,5]],[[7352,2281],[2,1],[21,18],[3,2],[2,2]],[[7380,2304],[1,1],[3,2],[0,1],[2,1],[15,14],[3,3],[3,2],[9,9],[2,1],[1,1]],[[7419,2339],[49,43],[24,22],[16,15]],[[7508,2419],[65,-42],[2,-1],[27,30],[5,5]],[[7607,2411],[-1,-4],[-2,-8],[-10,-39],[-2,-5]],[[7607,2411],[4,5],[16,19]],[[7627,2435],[14,-12],[4,-3],[7,-5],[16,-13],[5,-4],[30,-23],[3,-2]],[[7642,2313],[-55,-51],[-17,-26],[-7,-10],[-3,-2]],[[7647,2310],[-1,-5],[-17,-30],[-7,-14],[11,-8],[6,-5],[4,-3],[16,8],[-1,-11],[-2,-14]],[[7685,2519],[-5,-7],[-5,-7],[17,-17],[11,-12],[-13,-19],[19,-16],[14,10],[4,2],[15,11]],[[7328,1095],[5,23]],[[7436,1089],[-8,-8],[-10,-11],[-6,1],[-84,24]],[[7333,922],[-3,3],[-3,3]],[[7327,928],[-2,3],[-2,1]],[[7323,932],[14,16],[24,27],[21,23],[14,16],[7,10],[-13,3],[-42,12],[-4,2],[-5,2],[-5,1],[-5,0],[-11,3]],[[7318,1047],[5,23],[5,25]],[[7464,1065],[-39,-46],[-2,-2],[-43,-46],[-44,-46],[-3,-3]],[[7323,932],[-4,2],[-5,2],[-6,0],[-9,0],[-8,2],[-25,7],[-13,3]],[[7253,948],[10,12],[11,12],[-1,2],[-1,3],[-32,25],[10,18],[24,-20],[14,15],[30,32]],[[7318,1047],[-23,6],[-23,6],[-11,4],[6,23],[5,25],[5,24]],[[7253,948],[-36,9],[-12,4],[-10,2],[-7,0]],[[7053,764],[61,74],[-10,9],[-30,25]],[[7074,872],[21,21],[18,22]],[[7113,915],[3,4],[14,-19],[12,19],[19,32],[1,2],[1,3],[-1,3],[-8,4]],[[7253,948],[-4,-3],[-9,-10],[-5,-6],[-39,25],[-9,-17],[34,-23],[-2,-8],[50,-32],[13,14],[27,28],[1,1],[0,2],[1,3],[0,3],[1,-2],[0,-2],[0,-3],[-1,-4],[-1,-3],[-2,-3],[17,17],[2,3]],[[7333,922],[-3,-3],[-1,-2],[-101,-104],[-15,-17],[-47,-50],[-1,-1],[-12,-10],[-10,-8]],[[7845,4003],[9,-6],[1,-1],[36,-27]],[[2315,2374],[-2,-8],[0,-3],[15,-39],[1,-3],[2,-1],[3,0],[-20,-64],[-4,-11],[-8,-15],[-4,4],[-4,4],[-3,5],[-1,6],[1,6],[5,11],[-3,1],[-3,1],[-3,0],[-2,-1],[-19,-10],[-1,-2],[10,-27],[0,-3],[-1,-3],[-2,-3],[-3,-6],[-13,7],[-18,51]],[[2386,2333],[-17,-14],[-11,-9],[-4,-4],[-4,-5],[-3,-7],[-18,-56],[-7,-13],[-11,-21],[-12,-21],[-3,-8],[-12,-33]],[[2428,2260],[-37,-47]],[[2464,2222],[39,-63]],[[2503,2159],[-4,-4],[-5,-4],[-15,-15],[-27,-26],[-16,-15],[-3,-2],[-1,0],[-3,-1],[-1,0],[-8,0],[-3,1],[-3,0],[-3,0],[-3,0],[-3,-1],[-3,-2],[-2,-1],[-1,-1],[-2,-1],[-27,-26]],[[2434,2272],[30,-50]],[[6193,991],[0,1],[-6,3],[-7,0],[-7,-2],[-5,-4],[-4,-5],[-7,-4],[-10,-3],[-10,-1],[0,65],[-19,1],[-11,0],[0,45],[-18,0]],[[6089,1087],[1,75],[0,4]],[[6090,1166],[28,9]],[[6510,1298],[0,-1],[1,-4],[1,-1],[1,-3],[1,-4],[0,-2],[1,-3],[0,-3],[1,-13],[-1,-8],[-2,-4],[-3,-11],[-3,-9],[-3,-10],[-4,-14]],[[6500,1208],[-10,-10],[-31,-28],[-28,-21],[-21,-16],[-24,-15],[-25,-13],[-28,-18],[-20,-15],[-33,-25],[-17,-14],[-28,-17],[-15,-9],[-17,-11],[-10,-5]],[[6204,963],[0,9],[-2,7],[-4,7]],[[6198,986],[3,2],[7,2],[4,-2],[3,1]],[[6211,966],[-2,-1],[-5,-2]],[[6203,961],[8,4]],[[6209,957],[-3,-2],[-1,0],[-2,-1],[0,7]],[[6089,1087],[-18,0],[-18,1],[-22,0]],[[6031,1088],[1,55],[-19,-6],[-19,-6]],[[5994,1131],[-1,5],[78,24],[3,1],[16,5]],[[6031,1043],[0,45]],[[6089,1087],[1,-44],[-9,0],[0,-63]],[[6081,980],[-11,3],[-17,1],[-22,0],[0,59]],[[6031,1043],[-19,0],[1,45],[-19,0],[-20,1]],[[5975,1125],[19,6]],[[6081,980],[0,-10]],[[6081,970],[-21,1],[-6,1],[-23,4],[-14,3],[-43,5]],[[5974,986],[0,56],[0,5],[0,31]],[[5977,881],[27,-8],[22,-1],[25,4],[22,9],[7,3]],[[6080,888],[-2,-21]],[[6078,867],[-12,-6],[-21,-2],[-6,0],[-9,-3],[-7,0],[-4,-2],[-4,0],[-7,-6],[-11,-2],[-14,1],[-8,2]],[[5978,929],[3,-2],[77,-24],[22,12]],[[6080,915],[0,-4],[0,-2]],[[6080,909],[-14,-7],[-12,-5],[-12,1],[2,-3],[-1,0],[-11,1],[-21,0],[-12,1],[-12,4],[-5,2],[-4,3]],[[5975,979],[12,-4],[12,-1],[10,2],[7,0],[16,-3],[31,-7],[17,0]],[[6080,966],[0,-3],[0,-3]],[[6080,960],[-4,0],[-13,-3],[-17,-2],[-12,0],[-18,3],[-5,2],[-27,6],[-7,1],[-1,1]],[[6211,867],[-12,8],[-10,11],[-28,6],[-6,2],[-16,0],[-12,-4],[-11,-4],[-6,-4],[-1,-1],[-22,-11],[-9,-3]],[[6080,888],[5,2],[18,11],[27,16],[6,3],[6,4],[5,7],[-1,3],[3,1],[30,16],[19,6],[5,4]],[[6193,991],[-10,-5],[-26,-10],[-20,-5],[-18,0],[-22,-1],[-16,0]],[[6204,963],[-7,-1],[-8,3],[-15,-11],[-26,-15],[-3,-1],[0,1],[-10,1],[-55,-31]],[[6080,915],[59,32],[0,1],[7,4],[0,3],[16,9],[10,4],[15,10],[4,3],[3,4],[4,1]],[[6096,939],[-2,0],[-2,0],[0,3],[0,10],[6,5],[4,1],[2,3],[2,3],[4,2],[7,0],[2,1],[8,0],[5,0],[2,-8],[-3,-3],[-35,-17]],[[6080,966],[23,0],[-2,-4],[-4,0],[-17,-2]],[[4784,1039],[0,-13],[-2,-7],[-2,-9],[-8,-13],[-11,-10],[-7,-9],[-3,-17],[-3,-3],[-5,-3],[-11,-10],[-4,-2],[-8,0],[-5,-1],[-14,6],[-20,5],[-17,8],[-18,2],[-20,5],[-20,15],[-9,15],[1,8],[3,6],[4,8],[12,10],[9,13],[8,7],[4,1],[6,0],[14,-4],[15,-3],[29,3],[14,4],[17,1],[12,-4],[6,-3],[8,-3],[20,0],[5,-3]],[[8225,4853],[-8,-19]],[[8217,4834],[-17,8],[-9,-24],[-7,-19],[-14,6],[-5,-15]],[[8165,4790],[-10,5],[-26,13]],[[8129,4808],[14,37],[7,19]],[[8150,4864],[8,21]],[[8217,4834],[-16,-43],[66,-33]],[[8267,4758],[-13,-34],[-17,9],[-8,4],[-15,7],[-9,5],[-16,8],[-31,15]],[[8158,4772],[7,18]],[[8283,4824],[-7,-19],[-1,-6],[0,-17],[-8,-24]],[[8305,4738],[-22,12],[-16,8]],[[8292,4576],[-60,12],[-19,2],[-61,10],[-36,6],[-32,4],[-31,5]],[[8053,4615],[4,6],[6,11],[5,10],[6,16],[11,28],[12,33]],[[8097,4719],[1,-1],[5,-2],[4,7],[4,7],[4,9],[5,8],[4,7],[14,-7],[9,-5],[5,12],[6,18]],[[9689,9681],[2,4],[1,4],[0,3],[3,4],[5,5],[6,6],[7,7],[5,7],[1,7],[1,9],[-2,2],[-8,2],[-6,1],[-18,33]],[[9766,9812],[7,-15],[1,-6],[2,-6],[0,-3],[0,-11],[-1,-10],[-26,7],[-2,-3],[-5,-33],[-2,-9],[0,-6],[-1,-4],[-3,-6],[-6,-9],[-12,-15],[-4,-4],[-1,-2],[-2,-1],[-22,5]],[[8010,5802],[-12,-30],[-9,4],[-12,6],[-21,-39],[-15,7]],[[8504,5582],[-1,-3],[-3,-5],[-11,-28],[-12,-29],[-8,-21]],[[8703,5618],[-9,-21],[-3,-11],[-29,-91],[66,-36]],[[8728,5459],[-1,-3],[-19,-59],[0,-5],[-4,-12]],[[8544,5681],[6,-3],[1,-2],[49,-27],[4,11],[4,10]],[[8608,5670],[40,-22],[31,-17],[9,-5],[15,-8]],[[8624,5710],[-4,-10],[-4,-10],[-4,-10],[-4,-10]],[[8711,5638],[-8,-20]],[[8624,5710],[41,-22]],[[8665,5688],[31,-17],[9,-5],[14,-8]],[[8719,5658],[-8,-20]],[[8693,5758],[-8,-19],[-8,-20],[-8,-20],[-4,-11]],[[8732,5690],[-13,-32]],[[8748,5728],[-8,-19],[-8,-19]],[[8797,5653],[-9,5],[-1,1],[-21,12],[-8,4],[-17,9],[-9,6]],[[8748,5728],[9,-5],[47,-26],[9,-5]],[[8776,5602],[-40,21],[-16,10],[-9,5]],[[8797,5653],[-9,-21],[-4,-10],[-4,-10],[-4,-10]],[[8838,5592],[-13,7],[-5,-10],[-4,-10],[-40,23]],[[8845,5503],[-1,-3],[-33,-104],[-4,-12],[-4,-14],[-5,-16],[-7,-25],[-1,-3]],[[8790,5326],[-1,1],[-25,18],[-22,14],[-7,4],[-31,17]],[[8728,5459],[32,102],[4,11],[4,10],[4,10],[4,10]],[[9010,5560],[-8,-20],[8,-5],[52,-29],[10,-5],[1,-4]],[[8892,5625],[-4,-10],[-3,-10],[-4,-9],[-3,-10],[62,-35],[5,10],[3,9],[-3,1],[8,20]],[[4560,3691],[-5,-8],[-8,-8],[-11,-8],[-15,-10],[-9,-9],[-21,-19],[-8,-9],[-6,-7],[-9,-10],[-7,-8],[-10,-9],[-28,-19],[-45,-22],[-22,-16]],[[4292,3588],[10,4],[8,3],[7,3],[10,7],[6,6],[3,5],[4,8],[1,10],[3,1],[8,6],[3,4],[23,17],[6,3],[4,0],[15,-1],[14,-3],[7,-2],[0,-23],[-2,-5],[0,-1],[11,5],[8,5],[7,6],[5,3],[1,0],[3,0],[9,-4],[-1,14],[5,6],[5,0],[7,2],[7,10],[4,4],[13,14],[3,15],[2,22],[0,15],[7,20],[8,14],[8,11],[15,24],[4,5],[3,2],[11,-2],[2,2],[2,5],[9,2],[3,0],[1,-12],[2,-4],[6,4],[15,22],[18,28],[3,-3],[5,3],[8,10],[24,36],[7,20],[1,20],[6,9],[3,15],[6,15],[0,8],[2,14],[12,5],[13,6],[1,3]],[[4716,4029],[1,-5],[36,-36]],[[4404,3716],[-6,-1],[-4,5],[-5,9],[-1,9],[-4,20],[0,17],[4,7],[14,12],[6,9],[7,8],[29,19],[14,6],[8,5],[8,0],[6,-2],[5,-5],[0,-8],[0,-10],[-8,-26],[-1,-13],[-5,-29],[-4,-9],[-4,-6],[-6,-5],[-7,-10],[-5,-4],[-17,-1],[-24,3]],[[4412,3456],[-56,73]],[[9689,9681],[-1,-9],[-4,-19]],[[9684,9653],[-52,14],[-17,4],[-6,3],[-9,5]],[[9675,9602],[9,51]],[[7266,4453],[-9,-11],[-11,8],[-24,18],[-10,7]],[[8176,3051],[-3,4],[-10,8],[-2,1],[-2,2],[-3,1],[-1,1],[-4,3],[-12,10]],[[8142,5032],[-8,-21]],[[8134,5011],[-33,17],[-9,4]],[[8092,5032],[6,23],[8,22]],[[8092,5032],[-10,5],[-2,1],[-17,9],[-22,10],[-9,5]],[[8058,5129],[9,-5],[14,-7],[23,-12],[9,-5]],[[8079,4993],[-10,5],[-42,21],[-10,4]],[[8092,5032],[-7,-20],[-6,-19]],[[8066,4954],[-7,-19]],[[8079,4993],[-7,-20],[-6,-19]],[[8113,4932],[-9,4],[-28,14],[-10,4]],[[8134,5011],[-14,-39],[-7,-19],[0,-21]],[[8113,4882],[-14,6],[-39,20],[-9,4]],[[8113,4932],[0,-24],[0,-26]],[[8150,4864],[-2,1],[-28,13],[-7,4]],[[8129,4808],[-2,1],[-21,11],[-9,4]],[[8097,4824],[1,6],[1,4],[2,9],[4,10],[3,9],[-55,27],[-9,5]],[[8097,4824],[-9,5],[-48,23],[-9,5]],[[8090,4806],[-9,4],[-48,24],[-9,5]],[[8097,4824],[-7,-18]],[[8457,4942],[-32,18]],[[8479,4997],[-7,-16]],[[8472,4981],[-3,-9],[-4,-10],[-4,-10],[-4,-10]],[[8542,4944],[-10,5],[-60,32]],[[8488,5025],[10,-5],[59,-32]],[[8530,4904],[-49,26],[-24,12]],[[8503,4823],[-12,6],[-48,24],[-11,5],[-13,7]],[[8419,4865],[2,30],[1,26],[1,14],[2,25]],[[8493,4797],[-11,5],[-41,21],[-24,11]],[[8417,4834],[1,11],[0,6],[1,14]],[[8408,4789],[3,11],[2,6],[2,7],[1,4],[1,17]],[[3203,1734],[-34,59],[-4,7],[-12,21],[-26,43]],[[3167,1567],[-16,63]],[[3151,1630],[-33,129]],[[3151,1630],[-4,-1],[-9,5],[0,-3],[0,-2],[-2,-1],[-20,-8]],[[3116,1620],[-4,2],[-5,1],[-3,-2],[-9,-7]],[[3163,1566],[-8,-2],[-20,-18]],[[3135,1546],[-19,74]],[[3008,1441],[-17,-14]],[[2991,1427],[-7,28],[-7,26],[-24,-19],[-2,-2],[-2,0],[-2,1],[-8,14],[-2,3],[0,2],[2,3],[49,39]],[[3135,1546],[-19,-15],[-17,-15],[-18,-15],[-18,-14],[-17,-14],[-19,-17],[-19,-15]],[[3082,1349],[-18,-8],[-20,-9],[-16,68],[-6,12],[-4,7],[-6,9],[-4,13]],[[3193,1447],[-14,-5],[-30,-11],[-6,-4],[-4,12],[-16,-5],[-2,-2],[-1,-2],[9,-34],[-22,-10],[-10,-5],[-1,-2],[5,-22],[-19,-8]],[[3090,1320],[-3,6]],[[3087,1326],[-5,23]],[[3087,1326],[-55,-26],[-30,-12],[-9,34],[-23,-7],[-20,86],[-2,6],[4,7],[11,-7],[8,2],[20,18]],[[2757,1440],[60,-6]],[[2817,1434],[65,2],[-63,131],[30,23],[-12,21]],[[2817,1434],[-4,19]],[[2813,1453],[-6,23],[-5,16],[-1,8],[-1,9],[-2,15],[-1,9]],[[2797,1533],[-3,9],[-6,12],[-7,10],[13,11],[6,5],[7,5],[11,10],[3,3]],[[2821,1598],[3,2],[10,8],[3,3]],[[2813,1453],[-13,-4],[-35,0],[-21,0],[-37,0]],[[2707,1449],[-5,24],[-6,34],[-2,8],[-9,22],[-10,23]],[[2675,1560],[6,2],[9,3],[10,7],[25,21],[5,-7],[9,-11],[-33,-28],[-1,-2],[0,-2],[10,-19],[22,19],[1,1],[1,-1],[7,-6],[7,-10],[6,5],[7,1],[8,0],[23,0]],[[2675,1560],[-12,29]],[[2663,1589],[19,7],[14,6],[9,5],[11,9],[14,10],[12,-19],[19,17],[16,12],[11,10],[1,1],[1,0],[2,0],[1,-1],[0,-1],[28,-47]],[[2707,1449],[-20,0],[-1,1],[-1,1],[-6,32],[-1,2],[-2,0],[-18,1],[-1,-1],[-6,-9],[9,-9],[1,-3],[2,-10],[1,-4],[-1,-1],[-1,0],[-13,0],[-4,1],[-12,10],[-13,11],[-1,1],[-2,0],[-20,1],[-2,0],[-1,1],[0,1],[-1,2],[0,2],[1,17]],[[2594,1496],[0,22],[0,24],[0,17],[1,25],[21,0],[22,1],[11,1],[14,3]],[[2594,1496],[-74,0],[-20,1],[-1,26],[-17,0],[-1,0],[-1,1],[-1,3],[2,20],[-1,20],[1,3],[2,0],[15,0],[2,-2],[0,-2],[0,-23],[17,0],[3,0],[1,42],[-59,0],[-25,0],[-8,-1],[-4,-3],[-14,-10]],[[8245,3572],[-7,-14],[-13,-24],[-27,-52],[-6,-12],[-9,-17]],[[8083,4787],[-9,5],[-48,24],[-9,4]],[[8090,4806],[-7,-19]],[[8077,4769],[-10,4],[-48,24],[-9,5]],[[8083,4787],[-6,-18]],[[8102,4734],[-2,1],[-21,11],[-9,4],[-9,5],[-48,24],[-10,4]],[[8077,4769],[9,-5],[20,-10],[3,-2]],[[8109,4752],[-3,-9],[-4,-9]],[[8129,4808],[-3,-9],[-3,-10],[-4,-9],[-3,-9],[-7,-19]],[[8097,4719],[3,7],[2,8]],[[8053,4615],[-4,-7]],[[8049,4608],[-2,2],[-4,1],[-9,6]],[[7991,4747],[11,-11],[53,-27],[9,25],[-9,5],[-48,23],[-10,3]],[[8010,4543],[-12,-19]],[[7998,4524],[-2,2],[-8,6],[-5,4],[-8,6],[-10,-19]],[[7975,4486],[12,20],[11,18]],[[2944,3456],[-7,-2]],[[2937,3454],[-10,24],[-2,4],[-14,29]],[[2911,3511],[11,6],[4,1],[7,2],[7,1],[8,5],[10,6],[-6,12],[-3,6],[-8,19],[9,6],[4,3],[4,5],[5,8],[3,10],[1,7],[-1,10],[-2,7],[-13,29]],[[2951,3654],[32,-6],[34,-6],[18,-3],[3,1],[3,0]],[[2791,3388],[-15,24]],[[2776,3412],[20,11],[1,3],[-5,10],[-3,6],[-1,6],[0,6],[1,7],[1,5],[4,17],[0,9],[0,6],[-1,6],[-1,4],[-7,18],[-2,4]],[[2783,3530],[31,15],[8,5],[13,6],[11,4],[11,2],[10,1],[7,0]],[[2874,3563],[21,-5],[-1,-9],[0,-3],[8,-16],[9,-19]],[[2937,3454],[-15,-5],[-42,-10],[-31,-8],[-10,-3],[-21,-15],[-7,-6],[-20,-19]],[[2832,3313],[-14,29],[-11,22],[-16,24]],[[2978,3381],[-31,-14]],[[2947,3367],[-39,-18],[-47,-22],[-29,-14]],[[3146,3440],[-3,-3],[-5,9],[-31,-26],[-30,-22]],[[3077,3398],[-38,-27],[-27,-25],[-8,-5]],[[3004,3341],[-3,13],[-41,-17],[-12,27],[-1,3]],[[3114,3269],[-25,-12],[-11,-6],[-11,-10],[-10,-9],[-14,-18]],[[2977,3296],[-4,11],[-2,5]],[[2971,3312],[17,13],[16,16]],[[3077,3398],[6,-5],[8,-6],[-5,-10],[-3,-9],[-3,-15],[-5,-23],[8,-3],[7,-4],[5,-6],[6,-7],[4,-10],[2,-8],[7,-23]],[[3212,3327],[-3,-3],[-18,-13],[-12,-7],[-14,-11],[-13,-7],[-16,-7]],[[3136,3279],[-22,-10]],[[7576,2516],[0,11],[1,15],[-1,3],[0,4],[-2,3],[-1,3],[-3,2],[-9,8]],[[7561,2565],[-64,47]],[[7516,2500],[15,23],[14,19],[16,23]],[[7576,2516],[-3,-6],[-10,-13],[-15,-20],[-2,1],[-10,8],[-20,14]],[[7508,2419],[-10,11],[-4,1],[-2,2],[-11,8],[-3,4]],[[7478,2445],[22,32],[13,18],[3,5]],[[7478,2445],[-16,11],[-15,11],[-16,12],[-7,6],[-11,-12],[-10,3]],[[7453,2548],[33,-25],[30,-23]],[[7478,2445],[-12,-17],[-8,-12],[-61,45],[-2,3]],[[7419,2339],[-2,1],[-4,2],[-5,4],[-6,5],[-56,42]],[[7380,2304],[-5,4],[-16,12],[-8,6],[-13,9],[-22,17],[-1,1],[-4,3],[-1,1]],[[8352,4867],[10,-5],[41,-20],[3,-2],[11,-6]],[[8499,5050],[12,-7],[3,-1],[4,12],[33,-17],[4,11],[11,-6],[9,-5],[3,-1]],[[8518,5096],[11,-6],[46,-24],[9,-5],[3,-2]],[[8618,5139],[-31,-80]],[[8549,5176],[67,-36],[2,-1]],[[8569,5225],[10,-5],[48,-26],[8,-5],[3,-1]],[[8638,5188],[-10,-25],[-10,-24]],[[8587,5273],[10,-6],[48,-26],[8,-5],[3,-1]],[[8656,5235],[-9,-24],[-9,-23]],[[8674,5282],[-9,-24],[-9,-23]],[[8738,5162],[-24,13],[-9,-24],[-10,6],[-2,1],[-46,25],[-9,5]],[[8757,5065],[-41,22],[-1,0]],[[8715,5087],[8,25],[8,25]],[[8688,5005],[18,50],[9,32]],[[3733,2721],[-98,-76],[-2,-2],[-1,-1]],[[3581,2834],[10,10],[43,30],[17,11],[14,10],[-11,79]],[[3654,2974],[12,-19],[3,-15],[19,6],[-6,23],[-11,19],[17,13],[21,17]],[[3709,3018],[6,-10],[4,-26],[6,-25],[19,7],[9,-42],[3,-20],[1,-16]],[[4001,2937],[-43,-35],[-67,-54]],[[3820,2949],[18,0],[1,10],[4,10],[5,6],[27,21],[10,-17],[12,-19],[19,15],[42,34]],[[3958,3009],[32,-54],[11,-18]],[[3709,3018],[14,10],[13,2]],[[3736,3030],[21,2]],[[3757,3032],[5,1],[6,2],[8,5],[32,24],[10,-17],[10,-17],[9,-17],[3,-1],[21,17],[15,15],[14,18],[12,18]],[[3902,3080],[21,-19],[13,-15],[22,-37]],[[3757,3032],[-3,21],[77,61],[12,-16],[15,17]],[[3858,3115],[13,-13],[13,-10],[18,-12]],[[3736,3030],[-1,8],[-12,21],[-3,11],[-4,31]],[[3716,3101],[19,6],[11,6],[70,55]],[[3816,3168],[13,-12],[8,-11],[2,-4],[11,-16],[8,-10]],[[3711,3146],[6,2],[5,2],[6,4],[3,3]],[[3731,3157],[42,32],[18,13]],[[3791,3202],[7,-13],[8,-11],[10,-10]],[[3749,3291],[2,-2],[2,-4],[5,-51],[0,-3],[-2,-2],[-24,-19],[-1,-42],[0,-11]],[[3774,3298],[3,-35]],[[3777,3263],[3,-22],[3,-18],[8,-21]],[[3855,3198],[-39,-30]],[[3777,3263],[14,2],[64,-67]],[[3915,3234],[-44,-23],[-16,-13]],[[3826,3326],[-2,-2],[-16,-11],[-3,-2],[-5,0],[-1,-15],[17,-20],[50,-55],[35,24],[1,1],[0,-1],[7,-8],[6,-3]],[[7262,826],[76,80],[2,2],[2,2],[3,3],[3,4],[5,6]],[[7113,915],[-45,0],[5,21],[54,0],[9,14],[6,10],[2,4]],[[7074,872],[-36,-38]],[[7028,842],[27,93],[-19,1],[7,24],[1,5]],[[6616,5393],[12,28],[8,17],[17,33],[9,19]],[[6572,5425],[9,27],[2,4],[5,12],[9,18],[9,18]],[[6606,5504],[10,18]],[[6572,5425],[-4,3],[-35,24],[-16,11],[-3,2]],[[6514,5465],[7,23],[4,10],[5,10]],[[6530,5508],[9,18],[9,18]],[[6548,5544],[58,-40]],[[6548,5544],[10,19]],[[6558,5563],[9,17],[12,26],[2,3],[9,17]],[[6530,5508],[-58,40]],[[6472,5548],[9,18],[9,19],[9,18]],[[6499,5603],[59,-40]],[[6499,5603],[6,12],[3,6]],[[6508,5621],[2,4],[11,21],[2,3],[8,18]],[[6455,5505],[-46,32]],[[6409,5537],[10,22],[5,11],[4,8],[6,12],[12,25]],[[6446,5615],[12,23],[6,13]],[[6464,5651],[44,-30]],[[6472,5548],[-6,-9],[-3,-10],[-8,-24]],[[2503,2159],[29,-49]],[[2503,2159],[10,10],[0,3],[10,-18],[16,13],[65,56],[-12,19],[15,13]],[[2607,2255],[16,14],[17,14],[16,14],[18,-29],[11,-18],[62,54]],[[2747,2304],[51,44],[4,-4],[5,5],[15,13],[3,3]],[[2825,2365],[3,-4]],[[2464,2222],[11,13],[30,25],[10,-18],[6,5],[8,8],[10,14],[21,41]],[[2560,2310],[8,-5],[9,-7],[7,-8]],[[2584,2290],[12,-17],[11,-18]],[[2389,2380],[2,-3],[2,-4],[2,-3],[11,-18],[22,-37],[52,43],[16,14]],[[2496,2372],[17,-28],[5,-6],[8,-6],[17,-11],[17,-11]],[[2536,2504],[3,-5],[3,-6]],[[2542,2493],[-31,-26]],[[2511,2467],[-48,-40],[6,-11],[27,-44]],[[2511,2467],[10,-19],[11,-18],[11,-18],[-15,-13],[18,-30],[1,-2],[-10,-14],[-2,0],[-3,1],[-4,5],[-16,26],[-16,-13]],[[2542,2493],[12,9],[7,4],[9,-22],[17,-28],[5,-6],[20,-14],[4,-3],[4,-4],[6,-4],[7,-12],[13,-21],[6,-5],[4,-2]],[[2656,2385],[-6,-12],[-2,-8]],[[2648,2365],[-4,-19],[-2,-6],[-3,-3],[-55,-47]],[[2734,2450],[-13,-7],[-4,-3],[-33,-28],[-19,-15],[-6,-7],[-3,-5]],[[2760,2473],[-3,-3],[-23,-20]],[[2714,2357],[-32,-28],[-20,7],[3,13],[1,6],[1,5],[-19,5]],[[2734,2450],[19,-32],[12,-18],[-36,-30],[-15,-13]],[[2747,2304],[-11,18],[-11,17],[-11,18]],[[2760,2473],[65,-108]],[[2779,2488],[43,-69],[3,-4],[4,0],[18,15],[3,5],[8,20],[14,13],[-8,14],[21,17],[18,16]],[[2883,2571],[3,-6],[9,-15],[2,-12],[2,-12],[4,-11]],[[2923,2611],[16,21]],[[2852,2767],[8,-13],[7,-4],[27,-18],[-3,-7],[-9,-14],[-15,-16]],[[2920,2824],[11,-19],[-46,-40],[18,-12],[22,18],[3,-1],[13,-18],[8,-8],[8,-6],[18,-8],[20,-9]],[[8244,3448],[38,-30],[6,11],[-2,10],[8,14],[10,21],[-1,2],[-6,4],[-25,19],[-28,-51]],[[7803,1101],[-31,8]],[[7772,1109],[2,12],[4,23],[5,22],[3,23]],[[7786,1189],[73,-20],[14,20],[13,20],[9,12]],[[7934,1216],[-32,-44],[-37,-53],[-20,-28]],[[7845,1091],[-42,10]],[[7786,1189],[5,22],[4,23],[2,10]],[[7772,1109],[-64,17]],[[7708,1126],[2,12],[5,23],[4,22],[4,23],[4,22],[-38,10],[4,23],[-58,15],[-9,4]],[[7701,1092],[4,23],[3,11]],[[7803,1101],[-7,-10],[-10,-21],[-9,-17],[-6,-14],[-5,-7],[-42,11],[-31,8],[4,21],[4,20]],[[7566,1164],[142,-38]],[[7701,1092],[-71,19]],[[7554,1166],[3,8],[28,59],[15,39],[1,1],[4,7]],[[7590,1280],[-53,-106],[0,-2]],[[7716,979],[17,18],[16,18],[-99,26]],[[7845,1091],[-8,-11],[-20,-25],[-26,-29],[-16,-10],[-15,-19],[-10,-8],[-8,-6],[-5,-12]],[[8099,2087],[-4,-70]],[[8056,2451],[35,35],[43,45]],[[8031,2526],[9,13],[2,6],[1,8],[2,8],[7,8],[7,10],[7,12],[2,2]],[[8101,2562],[16,-15],[17,-16]],[[5497,3222],[4,6],[31,42]],[[5532,3270],[7,-9],[4,-5],[4,-11],[14,7],[2,3],[14,18],[2,0],[3,-1],[14,-14],[15,-15]],[[5529,3272],[3,-2]],[[5488,3325],[29,35],[13,-14],[-18,-25],[13,-15]],[[5525,3306],[-12,-18]],[[5569,3320],[-37,-50]],[[5525,3306],[26,32]],[[5551,3338],[16,-16]],[[5567,3322],[2,-2]],[[5490,3360],[23,30],[3,0],[39,-41],[1,-3],[-5,-8]],[[5476,3373],[33,45]],[[5509,3418],[61,-67],[-3,-29]],[[5489,3439],[20,-21]],[[5532,3446],[-23,-28]],[[5550,3518],[20,-22],[-38,-50]],[[5584,3482],[-38,-50]],[[5546,3432],[-14,14]],[[5614,3520],[-2,-3],[-17,-21],[-11,-14]],[[5584,3482],[14,-15],[-24,-33],[14,-14],[25,32],[14,-16]],[[5627,3436],[-15,-19],[-24,-30],[-42,45]],[[5627,3436],[28,37],[2,2]],[[5675,3458],[-3,-4],[-43,-56],[-38,-49]],[[5663,3327],[-22,-31]],[[5710,3422],[-3,-4],[-7,-9],[-23,-28],[-13,-18],[-3,-4],[-12,-17],[14,-15]],[[5748,3274],[-2,2],[-16,16],[-36,36],[-6,3],[-8,2],[-8,-3],[-9,-3]],[[7316,2249],[-2,5],[-53,39],[-3,2],[-11,9]],[[7352,2281],[-2,-2],[-15,-13],[-2,-2],[-17,-15]],[[7415,2207],[-10,7],[-35,27],[-2,1],[-9,7],[-8,-9],[-20,-25],[-14,-17]],[[7317,2198],[-14,-17],[-14,-17]],[[7289,2164],[-35,27],[-3,2]],[[7251,2193],[8,7],[8,7],[17,14],[17,15],[15,13]],[[7369,2159],[-8,6],[-11,8],[-23,17],[-10,8]],[[7307,2125],[-7,5],[-5,3],[-20,15]],[[7275,2148],[7,8],[7,8]],[[7154,2101],[18,15],[18,16],[32,-24],[4,-2],[9,-7],[13,18],[5,7],[8,9],[7,7],[7,8]],[[7246,2196],[17,15],[16,14],[-66,50]],[[4915,4124],[-9,-12],[-14,-10],[-17,-7],[-23,-10],[-18,-11],[-17,17],[-13,13],[-17,-21],[-15,-17]],[[4716,4029],[2,3],[2,7],[3,14],[1,14],[3,13],[4,8],[5,6],[7,8],[8,6],[7,0],[2,-1],[11,-11],[6,-1],[16,17],[26,27],[6,6],[6,15],[9,20],[9,16],[5,9],[16,19],[5,5],[13,-6],[8,0],[8,3],[8,7],[18,11],[7,5],[13,10],[9,10],[0,2],[-3,2],[-2,2],[-2,3],[-1,3],[4,7],[3,7],[5,1],[8,15],[4,1],[6,1]],[[4981,4313],[12,-15],[3,-4],[4,-3],[5,-4],[6,-3]],[[5011,4284],[2,-2],[13,-12],[2,-3],[13,-14],[11,-13],[4,-6],[3,-5]],[[5059,4229],[-10,-9],[-7,-8]],[[5042,4212],[-18,-9],[-13,-7],[-23,-12],[-29,-16],[-12,-6],[-2,-1],[-2,-1],[-4,-3],[-9,-10],[-15,-23]],[[5110,4308],[-9,-9],[-13,-19],[14,-14]],[[5102,4266],[-19,-30],[-12,13],[-12,-20]],[[5011,4284],[2,10],[-4,1],[5,28],[1,2],[2,2],[4,0],[4,-3],[4,-4],[4,-3],[14,-3],[2,1],[1,1],[8,11],[17,-17],[15,20],[20,-22]],[[5120,4314],[-10,-6]],[[4981,4313],[5,1],[5,1],[3,8],[1,10],[1,6],[3,17],[2,4],[6,6],[15,18],[13,17],[11,13]],[[5046,4414],[2,-4],[8,-9]],[[5056,4401],[50,-52],[28,-30],[-14,-5]],[[5120,4314],[25,-26]],[[5168,4263],[-15,-19],[-13,-18],[-38,40]],[[5056,4401],[16,20],[49,-52],[14,19],[-5,6],[12,18],[14,19],[48,-49],[5,6],[3,5],[3,5],[2,-2]],[[5046,4414],[17,20],[1,0],[34,25],[12,5],[10,6],[16,2],[8,1],[2,1],[5,2],[17,2],[13,0],[14,0],[1,-3],[-2,-8],[0,-7],[5,-17],[1,-5],[0,-3],[-3,-3],[-7,-6],[-3,-7],[-1,-2],[1,-8],[8,-4],[7,-1],[4,-1],[-3,10],[0,10],[0,9],[3,13],[0,10],[1,10],[1,5],[3,3],[2,4],[3,2],[0,2],[5,4],[6,0],[6,2],[6,4],[8,2],[5,4],[3,8],[8,6],[9,3],[5,3],[3,5],[6,6],[19,24],[3,4]],[[5308,4556],[8,-8],[7,-8],[3,-3]],[[5326,4537],[-3,-4],[-8,-13],[-16,-17],[-17,-17],[-14,-15]],[[5268,4471],[-15,-17],[-14,-15],[-5,-6],[-3,-5],[-2,-4],[-1,-2]],[[5177,4187],[-20,21],[-2,2],[-16,-21]],[[5139,4189],[-41,36],[-16,-22]],[[5082,4203],[-5,6],[-4,4],[-4,4],[-3,4],[-7,8]],[[6601,1293],[-5,-3],[-3,-2],[-7,-5],[-29,-23],[-33,-30],[0,-5],[-2,-1],[-2,-2],[-2,-1],[-2,-2],[-4,-3],[-8,-5],[-4,-3]],[[6461,1364],[7,14],[6,14]],[[6521,1212],[1,2]],[[5409,4205],[-44,-59],[-1,-2],[-12,-16]],[[5352,4128],[-40,41],[-3,0],[-3,-1],[-22,-28]],[[5304,4210],[11,-11],[8,-9],[44,59]],[[5367,4249],[42,-44]],[[5348,4270],[11,-12],[8,-9]],[[5359,4285],[12,16]],[[5371,4301],[62,-64]],[[5433,4237],[-13,-17],[-11,-15]],[[5371,4301],[14,17],[13,18],[13,16]],[[5411,4352],[13,18]],[[5424,4370],[62,-64]],[[5486,4306],[-14,-18]],[[5472,4288],[-12,-16],[-13,-18],[-14,-17]],[[5297,4350],[12,16],[13,18],[13,16],[9,3],[16,2],[32,-33],[19,-20]],[[5447,4399],[-10,-12],[-13,-17]],[[5268,4471],[40,-41],[12,16],[15,19],[32,-34],[16,19],[6,9],[7,8],[22,-6],[28,-28],[-14,-19],[15,-15]],[[5488,4445],[-4,-4],[-2,-2],[-13,-16],[-17,-19],[-5,-5]],[[5326,4537],[2,-2],[1,-1],[9,-9],[3,-3],[4,-3],[3,-2],[2,-2],[3,-2],[3,-2],[5,-4],[7,-4],[2,-1],[2,-1],[6,-3],[7,-3],[9,-3],[5,-2],[4,-2],[5,-1],[4,-1],[3,-1],[3,-1],[4,-1],[4,-2],[3,-1],[3,-1],[3,-1],[3,-1],[3,-1],[3,-2],[4,-1],[3,-2],[2,-2],[3,-1],[4,-2],[3,-2],[3,-2],[3,-2],[3,-2],[2,-1],[2,-2],[3,-3],[4,-3],[2,-2],[3,-2]],[[5482,4531],[22,-22],[19,-20],[1,-2]],[[5524,4487],[-19,-22],[-8,-10],[-9,-10]],[[5326,4537],[15,23]],[[5341,4560],[20,-21],[13,-12],[6,-6],[27,30],[14,13],[22,-21],[9,18],[15,-15],[15,-15]],[[5432,4607],[60,-62]],[[5492,4545],[-10,-14]],[[5341,4560],[12,18],[17,26],[23,19],[29,-29],[10,13]],[[5432,4607],[3,4],[4,5],[4,5],[9,12],[3,0],[3,0],[4,2],[1,2],[1,2],[56,-54]],[[5520,4585],[-2,-4],[-15,-21],[-11,-15]],[[5463,4686],[11,-10],[26,-15],[51,-30]],[[5551,4631],[-1,-3],[-11,-15],[-19,-28]],[[5308,4556],[1,2],[12,19],[9,15],[9,12],[3,11],[9,15],[14,15],[3,-3],[2,2],[-3,3],[2,3],[2,5],[2,7],[3,9],[4,16],[2,3],[4,5],[5,2],[5,0],[7,1],[7,9],[2,1],[14,0],[6,1],[3,2]],[[5620,4619],[-10,-22]],[[5610,4597],[-26,15],[-33,19]],[[5571,4675],[-10,-22],[59,-34]],[[5659,4720],[-8,-23],[0,-3],[-8,-21],[-2,-3],[-3,-7]],[[5638,4663],[-8,-21]],[[5630,4642],[-10,-23]],[[5627,4760],[-9,-23],[18,-10],[-8,-20],[12,-10],[4,-2],[2,3],[6,17],[3,4],[4,1]],[[5742,4702],[-9,-25],[-51,27],[-7,-18],[-4,-3],[-4,-1],[-10,6],[-2,3],[0,3],[6,17],[1,5],[-3,4]],[[5667,4740],[75,-38]],[[3044,2793],[-25,-21],[-8,-9],[-6,-12],[-3,-7]],[[2920,2824],[16,13]],[[7282,7043],[16,13],[31,26],[19,17],[14,7],[8,7],[11,10],[14,13]],[[7271,7060],[-32,51],[-11,16]],[[7228,7127],[26,22],[20,18],[30,26],[7,7],[6,5],[8,6],[15,13]],[[7212,7062],[-23,35]],[[7189,7097],[13,11]],[[7202,7108],[14,11],[2,0],[8,6],[2,2]],[[7202,7108],[-14,22]],[[7188,7130],[23,19],[2,2]],[[7213,7151],[15,13],[-44,70]],[[7213,7151],[-33,51]],[[7180,7202],[-11,19]],[[7188,7130],[-32,52]],[[7156,7182],[22,18],[2,2]],[[7189,7097],[-2,-3]],[[7187,7094],[-47,74]],[[7140,7168],[16,14]],[[9437,6162],[2,-8],[3,-1],[-21,-80],[-3,2],[-3,0],[-1,-4],[-2,-7],[-1,-4]],[[9221,5808],[-2,1],[-8,5],[-26,14],[-52,28],[-9,6],[-41,22],[-17,9],[8,21],[47,-26],[11,-6],[8,21],[89,-49],[11,-5],[2,-2]],[[5690,1018],[1,-12],[3,-1],[0,-4],[-1,-2],[-5,0],[-1,1],[-1,4],[0,8],[-1,6],[-13,1],[-6,-6],[-1,-2],[6,-2],[0,-2],[-12,2],[-1,-5],[-10,2],[-23,-10],[-1,3],[15,8],[-18,28],[-6,6],[-7,3],[-8,2],[-7,1],[-6,2],[-12,8],[-14,9],[-5,2],[-12,6],[-12,3],[-7,1],[-4,1],[-4,0],[-14,1],[-3,2],[-1,4],[-4,2],[-6,1],[-6,3],[-7,-3],[-9,5],[-3,0],[-8,4],[-5,-1],[-11,-6],[-2,0],[-11,1],[-6,-5],[-23,13],[-22,15],[-20,11],[-6,3],[-3,-1],[-10,0],[-3,-1],[-9,-3],[-10,1],[-6,1],[-8,3],[-10,4],[-12,0],[-3,2],[-3,1],[-16,7],[-5,6],[-9,15],[-6,5],[-6,0],[-14,4],[-3,2],[-4,2],[-25,7],[-46,16],[-14,2]],[[5122,1221],[2,1],[1,-1],[1,-1]],[[5126,1220],[9,-2],[17,1],[11,1],[11,-5],[10,-3],[12,-2]],[[5196,1210],[9,-2],[10,-4]],[[5215,1204],[13,-7],[6,-7],[8,-12],[9,-18],[6,-11],[8,-4],[25,-8],[12,-2],[20,-2]],[[5322,1133],[20,5],[9,3],[12,6],[11,5],[11,0]],[[5385,1152],[11,-3],[12,-6]],[[5408,1143],[2,-3],[0,-1],[3,-5],[2,-2],[3,-3],[2,-3],[4,-4],[5,-4],[17,-10],[-4,33],[21,3],[13,1],[11,2]],[[5408,1143],[-2,37],[26,3],[-8,108]],[[5424,1291],[26,-10],[27,-9]],[[5385,1152],[-13,159]],[[5372,1311],[23,-9],[29,-11]],[[5326,1327],[22,-8],[14,-4],[1,-1],[9,-3]],[[5322,1133],[-9,92],[-20,-2],[-6,85]],[[5287,1308],[20,0],[21,-1],[-2,20]],[[5215,1204],[1,3],[0,17],[-1,6],[-2,3],[3,2],[9,15],[3,9],[-1,12],[-4,24],[22,5],[19,6],[23,2]],[[5196,1210],[-13,64],[-18,99],[23,-9],[-3,16]],[[5185,1380],[23,-9],[26,-9],[12,-5],[18,-7],[19,-7],[21,-8],[22,-8]],[[5126,1220],[-1,8],[11,2],[-29,168],[0,4]],[[5107,1402],[10,-1],[3,3],[17,-6]],[[5137,1398],[25,-10],[23,-8]],[[5318,1421],[8,-94]],[[5137,1398],[2,2],[-3,14]],[[5136,1414],[20,4]],[[5156,1418],[11,3],[11,-1],[20,1],[23,-1],[13,1],[22,0],[21,-1],[20,1],[21,0]],[[5310,1509],[8,-88]],[[5156,1418],[-20,106],[12,0],[12,-10],[21,0],[21,0],[68,-3],[21,-1],[19,-1]],[[5438,1423],[-26,-2]],[[5412,1421],[-2,1],[-24,0],[-22,-1],[-24,1],[-22,-1]],[[5310,1509],[22,-1],[22,-2],[18,-1],[19,0],[20,-1],[20,-1],[3,-24],[4,-56]],[[5512,1502],[7,-83]],[[5519,1419],[-21,-2],[-19,2],[-20,5],[-21,-1]],[[5136,1414],[-18,88],[-1,3],[-4,22],[-1,6],[-1,4],[-1,4],[-2,4]],[[5108,1545],[0,5]],[[5424,1291],[-3,29],[-9,101]],[[5519,1419],[8,-100]],[[5107,1402],[-24,112],[1,15],[-1,5],[-2,4],[-1,3],[-2,6],[30,-2]],[[5107,1402],[-14,5]],[[5093,1407],[-4,15],[-8,40]],[[5081,1462],[-11,63],[0,1],[-1,1],[-1,1],[-36,1],[14,-76]],[[5046,1453],[6,-31]],[[5052,1422],[-43,16],[-5,2],[-18,6],[-18,7],[-5,2],[-71,26]],[[2859,3223],[3,4],[16,13],[9,5],[2,2],[48,38],[16,11],[18,16]],[[6514,5465],[-59,40]],[[6491,5396],[-20,14],[-18,12],[-20,15]],[[6433,5437],[6,16],[1,4],[7,20],[7,23],[1,5]],[[6514,5465],[-2,-4],[-7,-23],[-7,-21],[-7,-21]],[[6530,5369],[-20,13],[-19,14]],[[6408,5362],[9,25]],[[6417,5387],[16,50]],[[6417,5387],[-21,14],[-21,14],[-16,12]],[[6359,5427],[12,25],[9,21]],[[6380,5473],[15,-11],[13,-9],[5,-3],[20,-13]],[[6384,5295],[-9,5],[-43,20],[-9,5]],[[6323,5325],[8,23],[8,22],[7,22]],[[6346,5392],[13,35]],[[6346,5392],[-20,10],[-18,9]],[[6308,5411],[12,43]],[[6320,5454],[20,-13],[6,11],[17,33],[17,-12]],[[6323,5325],[-36,17]],[[6287,5342],[7,24],[7,22],[3,11],[4,12]],[[6287,5342],[-5,2],[-22,12],[-6,8],[-10,10]],[[6244,5374],[9,8],[3,2],[7,5],[6,5],[6,7],[6,22],[10,29],[0,1],[1,2],[1,2],[1,3],[1,4],[2,6]],[[6297,5470],[18,-13],[5,-3]],[[6244,5374],[-4,6],[-4,1]],[[6236,5381],[13,20],[4,8],[2,13],[4,29],[-4,11],[-2,22],[-2,12],[1,2],[5,7],[5,6],[5,6],[2,8],[3,13],[0,5],[0,6],[2,20],[0,1],[-1,4],[0,7],[-6,10],[5,4],[5,4],[4,6],[3,10],[-1,3],[-3,3]],[[6289,5624],[4,-4],[7,-5],[4,-4],[4,-3],[3,-3],[3,-2],[5,-3]],[[6319,5600],[-1,-5],[-1,-5],[-1,-9],[2,-15],[0,-8],[-2,-11],[0,-6],[-2,-23],[-6,-18]],[[6308,5500],[-5,-13],[-6,-17]],[[6319,5600],[4,-3],[13,-9],[16,-11],[2,-2],[3,-1]],[[6357,5574],[-1,-4],[-4,-13],[-9,-27],[-13,-43],[-5,3],[-17,10]],[[6357,5574],[12,-10],[21,-15],[19,-12]],[[6357,5574],[10,34],[7,24],[-4,2]],[[6370,5634],[8,28]],[[6378,5662],[5,-4],[63,-43]],[[2766,3246],[18,13],[3,-4],[14,-10],[30,24],[5,-8],[6,-10],[16,9],[14,5],[6,2],[6,0],[6,0],[5,1],[4,2],[43,33],[-4,9],[-2,4],[-3,7],[-1,1],[-1,0],[-1,0],[-7,-4],[-4,-2],[-4,10],[-1,2],[-2,0],[-23,-10],[-49,-24],[-7,13],[-1,4]],[[2757,3266],[11,7],[7,5],[15,10],[13,8],[12,8],[11,5],[6,4]],[[2693,3331],[20,8],[17,8],[16,9],[13,8],[10,6],[9,7],[7,5],[6,6]],[[2666,3320],[-9,19],[-6,16],[-2,7],[-2,9],[1,10],[1,8]],[[2649,3389],[6,13],[6,8],[6,6],[5,4],[6,3],[28,9],[4,1],[10,0],[4,1],[6,3],[7,2],[6,2],[7,0],[16,0]],[[2766,3441],[0,-6],[2,-6],[8,-17]],[[2608,3491],[18,-40],[2,-7],[2,-6],[0,-8],[1,-11],[1,-4],[2,-8],[4,-7],[4,-5],[7,-6]],[[2705,3480],[9,-19],[20,2],[10,2],[4,1],[10,7],[7,3],[4,0],[2,-4],[-4,-22],[-1,-9]],[[2591,3556],[20,0],[25,0],[4,-18],[8,3],[6,4],[11,-25],[8,-17],[8,-18],[7,-16],[17,11]],[[2705,3480],[-7,15],[-15,34],[-1,4],[0,5],[0,5],[1,5],[3,10],[1,3],[2,2],[3,1],[5,0],[19,0],[2,7],[2,6],[3,4],[4,4],[7,4]],[[2734,3589],[5,-11],[27,-59],[17,11]],[[2709,3645],[15,-33],[10,-23]],[[2633,3686],[0,-4],[0,-3],[2,-6],[2,-4],[5,-2],[4,-1],[4,0],[19,2],[5,0],[4,0],[2,0],[2,0],[2,-1],[4,-1],[7,-4],[6,-5],[4,-6],[4,-6]],[[2709,3645],[17,11],[9,-20],[15,7],[15,6],[14,3],[13,2],[16,1]],[[2808,3655],[17,-35],[9,-21],[16,9],[3,1],[21,-46]],[[2792,3704],[-5,-26],[9,1],[6,0],[7,-1]],[[2809,3678],[-2,-12],[-1,-5],[2,-6]],[[2809,3678],[20,-3],[-1,-13],[9,-19],[6,5],[2,1],[38,-7],[2,-2],[1,-2],[-3,-19],[0,-8],[0,-5],[1,-6],[3,-5],[3,-5],[5,-3],[6,-3],[6,-1],[7,1],[5,1],[19,12],[3,2],[3,5],[1,5],[0,3],[-8,18],[-2,2],[-2,1],[-24,4],[-2,1],[-2,3],[3,20],[43,-7]],[[6797,6703],[-2,3],[-5,7],[-5,8],[-35,55]],[[6750,6776],[2,15],[1,11],[0,3],[2,33],[0,6],[2,7],[5,16],[55,-88],[2,-3]],[[6819,6776],[11,-17]],[[6830,6759],[-17,-14],[-6,-5],[-4,-16],[-6,-21]],[[6841,6621],[-2,4],[-12,20],[-7,10],[-25,40]],[[6795,6695],[2,8]],[[6830,6759],[39,-63],[26,-40],[2,-4]],[[6791,6593],[-2,4],[-18,29],[4,13],[4,11],[8,22],[2,6],[6,17]],[[6841,6621],[-16,-9],[-16,-9],[-18,-10]],[[6710,6627],[2,3],[2,5],[4,13],[2,6],[1,5],[2,7],[3,9],[6,12],[1,4]],[[6791,6593],[-10,-6],[-7,-4],[-1,-1],[-8,-7],[-6,-5]],[[6859,6594],[-14,-12],[-15,-13],[-13,-12],[-1,-2],[1,-2],[15,-22],[20,-31]],[[5727,3208],[-18,18],[-16,18],[-13,-17],[-2,-2],[-20,20],[-14,16]],[[3136,3279],[9,-25],[4,-14],[2,-11],[4,-23],[6,-11],[-17,-13],[10,-17],[-41,-33],[0,-3],[9,-15],[12,-19]],[[3134,3095],[-7,-6],[-19,-8]],[[3267,3231],[-3,-2],[-32,-25],[-10,-9],[-5,-6],[-6,-9]],[[3211,3180],[-18,-29],[-5,-7],[-10,-12],[-9,-9],[-35,-28]],[[3346,3097],[-3,-2],[-23,-19]],[[3320,3076],[-12,21],[-17,28],[-10,18],[-44,-34],[-30,24]],[[3207,3133],[20,33],[-16,14]],[[3320,3076],[-37,-30],[-26,-20],[-4,-2],[-9,0]],[[3244,3024],[-4,1],[-23,2]],[[3217,3027],[1,13],[-10,18],[15,12],[15,12],[-17,14],[-23,18],[-1,3],[10,16]],[[3305,2980],[-6,3],[-5,0],[-5,-1],[-18,-14],[-8,-6],[-76,-61],[-12,21]],[[3175,2922],[-10,17],[56,46],[1,18],[19,-2],[3,23]],[[3385,3031],[-4,-2],[-26,-12],[-5,0],[-34,-27],[-11,-10]],[[3143,2978],[38,30],[21,18],[5,1],[10,0]],[[3175,2922],[-15,-13],[-40,-33],[-2,1],[-31,53],[-7,-3],[-9,-6],[-2,-2]],[[3305,2980],[42,-70],[29,-52],[8,-15],[7,-19],[2,-11],[1,-11],[-3,-44],[1,-11],[2,-8],[4,-11],[4,-9],[2,-3]],[[3385,3031],[19,-32],[15,-23],[10,-13],[21,-20],[18,-21]],[[3468,2922],[29,-47],[30,-51],[3,-4]],[[3487,3068],[-4,-9],[-1,-9],[-1,-8],[2,-9],[2,-9],[12,-30],[8,-22],[9,-23]],[[3514,2949],[-6,-1],[-9,-4],[-12,-7],[-19,-15]],[[3514,2949],[10,1],[7,-1],[6,2],[7,3],[19,16],[20,15],[7,8],[15,21]],[[3605,3014],[21,-35],[4,-6]],[[3630,2973],[2,-3],[4,-9]],[[3636,2961],[-2,-7],[-2,-6],[-2,-4],[-6,-4],[-8,-6],[-21,-17],[-16,-13],[-22,-16],[-5,-5]],[[3653,3081],[-7,-7],[-5,-7]],[[3641,3067],[-15,-22],[-21,-31]],[[3641,3067],[22,-21],[5,-6],[0,-3],[2,-1],[2,0],[5,-16],[-19,-20],[-18,-18],[-10,-9]],[[3654,2974],[-8,-7],[-10,-6]],[[7252,7640],[11,-18],[2,-1],[1,0],[6,5],[2,1],[2,-1],[36,-56],[2,-3]],[[7336,7636],[-6,-9],[-7,-6],[-12,-11],[15,-24],[2,-3],[-14,-16]],[[7350,7614],[-13,-15],[2,-3],[16,-26]],[[7382,7644],[12,-19],[10,-15],[3,-5],[4,-8],[6,5],[7,-4],[2,-1],[1,-2],[19,-29],[12,-19]],[[7413,7680],[11,-17],[65,-97]],[[7452,7720],[15,-18],[11,-18],[34,-51],[15,-23]],[[7488,7751],[2,-3],[17,-26],[53,-84]],[[3946,3282],[-1,-13],[-1,-6],[0,-3],[-1,-1]],[[3943,3259],[-2,-4],[-6,-6],[-19,-14],[-1,-1]],[[4021,3259],[-17,-18],[-3,-1],[-2,-2],[-4,2],[-10,15],[1,1],[1,2],[0,3],[-1,1],[-3,1],[-4,-1],[-1,2],[-13,12],[-2,2],[-3,1],[-3,2],[-4,0],[-7,1]],[[4067,3169],[-94,77],[-30,13]],[[4166,3063],[-35,-28],[-6,-5],[-3,-2],[-120,-88],[-1,-3]],[[3907,1823],[-3,14],[-13,51],[-5,6],[-2,33],[-3,8],[0,7],[-2,13],[-3,11],[-2,5],[0,6],[-6,13],[2,4],[-11,48],[-2,3],[-7,13],[-17,29]],[[3864,1825],[1,18],[0,24],[0,24],[-20,1],[-5,0],[-21,-7]],[[3819,1885],[-3,12],[-11,15],[-1,3],[-11,49],[-19,-6],[-20,-7],[-4,19],[16,15],[1,2],[-1,3],[-6,17],[-2,1],[-2,1],[-18,-14],[-8,-7],[-7,-5],[-21,-17],[-3,-28],[-10,2],[-8,-3]],[[3819,1885],[-19,-6],[-10,-3],[-9,-2],[-6,-2],[1,-12],[0,-9],[4,-14],[-46,-15],[-3,1],[-1,2],[-5,22],[-11,-3],[-5,-3],[-5,-5]],[[7893,7399],[48,53]],[[7941,7452],[37,43],[3,4],[51,58],[19,20],[19,21],[54,59],[33,35],[13,15]],[[7878,7584],[-12,-15],[15,-23],[3,-6],[5,-8],[8,-12],[17,-26],[24,-38],[3,-4]],[[7765,7647],[2,-3],[12,-20],[20,24],[10,-16],[2,-1],[2,1],[19,24],[12,-18],[18,-29],[16,-25]],[[7967,7659],[-44,-55],[-2,0],[-1,1],[-11,16],[-31,-37]],[[7805,7698],[2,-3],[13,-20],[12,15],[42,-66],[13,17]],[[7887,7641],[15,18],[15,19]],[[7917,7678],[16,-26],[21,26],[13,-19]],[[7861,7768],[2,-3],[12,-20],[13,-20]],[[7888,7725],[-16,-20],[-14,-18],[29,-46]],[[7888,7725],[13,16],[29,-46]],[[7930,7695],[-13,-17]],[[7958,7730],[-14,-18],[-14,-17]],[[7917,7839],[2,-3],[13,-20]],[[7932,7816],[-16,-20],[42,-66]],[[7958,7730],[16,19]],[[7974,7749],[16,-26],[11,-16],[0,-4],[-34,-44]],[[7989,7819],[-33,-42],[18,-28]],[[7932,7816],[12,-19],[32,40],[1,2],[-1,2],[-11,17],[14,16]],[[6340,5706],[-4,-13],[15,-9],[9,-8],[-9,-28],[2,-2],[17,-12]],[[6395,5712],[-3,-7],[-2,-5],[-4,-12],[-8,-26]],[[6403,5730],[5,-3],[8,-5],[2,-2],[45,-31]],[[6463,5689],[5,-2],[2,-1],[-1,-3],[-3,-20],[-2,-12]],[[6431,5791],[4,-4],[2,-2],[7,-5],[49,-34]],[[6493,5746],[-10,-20],[-3,-5],[-7,-14],[-2,-4],[-8,-14]],[[6493,5746],[8,-6],[42,-28],[8,-6]],[[6493,5746],[10,20],[11,23],[12,22]],[[6526,5811],[51,-36],[7,-5]],[[6450,5833],[5,9],[6,13]],[[6461,5855],[4,-3],[61,-41]],[[6461,5855],[9,20],[6,15]],[[2038,2561],[8,17],[8,12],[7,6],[9,12],[8,6],[5,2],[12,15],[4,1],[7,-7],[6,0],[1,4],[-3,8],[-1,23],[1,10],[3,14],[2,7],[8,9],[10,13],[2,2],[-2,8],[-5,6],[0,2],[-2,14],[1,7],[10,14],[5,-3],[1,-4],[1,-2],[-5,-17],[-3,-2],[-1,-4],[1,-4],[3,2],[9,9],[1,5],[1,5],[-2,8],[-2,4],[0,1],[-1,10],[7,12],[4,5],[6,4],[5,7],[5,3],[3,2],[3,1],[3,2]],[[2181,2810],[2,-3],[30,-39],[3,-1],[9,-12],[4,-6]],[[2181,2810],[3,3],[1,5],[7,5],[3,2],[3,6],[3,2],[5,3],[2,1],[3,-1],[9,-7],[10,-4],[5,0],[7,2],[14,13],[4,0],[4,0],[4,2],[6,0],[4,4],[5,7],[1,2],[19,11],[3,1],[9,0],[4,2],[3,2],[7,8]],[[2329,2879],[0,-1],[6,-13],[9,-23],[9,-15],[-7,-10]],[[2329,2879],[1,1],[9,2],[13,10],[9,11],[1,2],[3,5],[4,5],[0,4],[1,2],[3,0],[1,2],[9,27],[14,19],[8,14],[4,6],[3,7],[4,5],[4,9],[7,12],[5,9],[5,12],[1,5],[3,14],[5,9],[3,7]],[[7187,7094],[-15,-13]],[[7172,7081],[-47,74]],[[7125,7155],[15,13]],[[7109,7141],[16,14]],[[7172,7081],[-16,-14]],[[7156,7067],[-47,74]],[[7094,7129],[15,12]],[[7156,7067],[-14,-12]],[[7142,7055],[-48,74]],[[7094,7129],[-11,18]],[[7083,7147],[51,43],[32,28],[3,3]],[[7083,7147],[-11,17]],[[7072,7164],[16,15],[14,11]],[[7102,7190],[15,13]],[[7117,7203],[16,14]],[[7133,7217],[22,19],[2,2]],[[7133,7217],[-40,62]],[[7117,7203],[-39,60]],[[7102,7190],[-37,58]],[[7072,7164],[-33,51]],[[7083,7147],[-13,-11]],[[7070,7136],[-40,64],[-13,-20],[-12,19]],[[7005,7199],[23,34]],[[7070,7136],[-16,-13],[-15,-13],[-45,70]],[[6994,7180],[11,19]],[[6994,7180],[-11,-19]],[[7076,6999],[-47,75],[-14,-13],[-12,19]],[[7003,7080],[20,17],[-11,19],[-12,17],[-17,28]],[[7003,7080],[-29,-26],[-14,-13]],[[7018,6949],[-12,19]],[[7006,6968],[-24,37],[-22,36]],[[7006,6968],[-3,-2],[-16,-14],[-11,18],[-36,-31],[-11,17],[-19,9],[-7,-21]],[[6903,6944],[-19,8]],[[7030,6929],[-2,-2],[-15,-13],[-38,-32]],[[6975,6882],[-15,-13],[7,-12],[11,-18]],[[6978,6839],[-2,-2],[-19,-17],[-20,5],[-3,3],[-46,73],[8,24],[1,2],[2,2],[9,9],[3,2],[-2,1],[-6,3]],[[4974,3642],[-2,37],[-11,0],[-5,0],[-5,1],[-5,3],[-6,6],[-5,13],[-4,8],[-4,8],[1,4],[16,10],[12,-30],[2,-2],[18,2],[9,1],[5,1],[6,2],[6,4],[7,8],[41,54],[2,3]],[[5052,3775],[29,-29],[12,-13],[25,-27]],[[4946,3777],[62,39],[-11,11],[3,3]],[[5000,3830],[12,-13],[11,-11],[29,-31]],[[4954,3878],[14,-14],[13,-14],[2,-3]],[[4983,3847],[17,-17]],[[4851,3985],[7,-8],[-2,-2],[-22,-27],[-12,-14],[-1,-1],[1,-2],[27,-28],[15,-16],[22,29],[12,15],[2,3],[11,-12],[20,-20],[2,-2],[21,-22]],[[5034,3892],[-4,-2],[-5,-3],[-9,-5],[-7,-6],[-6,-4],[-3,-4],[-5,-5],[-12,-16]],[[4954,3878],[12,16],[-14,15],[-14,13],[-1,2],[1,1],[3,5],[11,13],[1,3],[0,2],[-40,41],[-23,25],[-8,7]],[[4882,4021],[7,9],[75,-80],[9,14],[34,52],[12,16]],[[5019,4032],[7,-9]],[[5026,4023],[-26,-35]],[[5000,3988],[-12,-17],[39,-41],[-13,-16],[7,-8],[11,-11],[2,-3]],[[4851,3985],[18,21],[13,15]],[[4955,4047],[-26,-42],[-38,39],[-15,-17],[6,-6]],[[4915,4124],[11,-13],[1,-6],[11,-11]],[[4938,4094],[-15,-14],[15,-15],[17,-18]],[[5012,4039],[7,-7]],[[4955,4047],[11,14],[5,-7],[7,-9],[22,-23],[12,17]],[[5030,4106],[-22,-14],[-21,-26],[25,-27]],[[4938,4094],[26,23],[9,10],[2,2],[2,0],[1,0],[1,0],[6,-5],[15,13],[14,-14],[16,-17]],[[5069,4101],[-50,-69]],[[5030,4106],[17,-16],[14,19],[8,-8]],[[5082,4120],[-13,-19]],[[5042,4212],[6,-12],[48,-51],[-18,-24],[4,-5]],[[8356,8290],[-53,86],[-2,-2]],[[8292,8241],[-1,3],[-50,78]],[[8217,8176],[13,12],[-2,2],[-5,10],[-43,68]],[[8350,8150],[-12,-11],[-17,-15],[-5,-4],[-28,-24],[-13,-11],[-45,71],[-13,20]],[[8217,8176],[-36,-31],[-2,-1],[-2,3],[-13,19],[-40,-35],[-23,36]],[[8101,8167],[15,13],[23,20],[2,1],[-13,22]],[[8101,8167],[-16,-14],[-16,-15],[-27,-22],[-13,-12],[-14,-12],[-2,-3]],[[7944,8196],[4,5],[15,20],[16,23],[21,-20],[-12,-17],[-1,-4],[1,-3],[10,-15],[15,13],[2,1],[2,-1],[4,-6],[41,35]],[[8220,7760],[-3,4],[-17,27],[-28,42],[-4,7],[-23,35],[-26,41],[-8,13],[-9,14],[-2,3]],[[5081,1462],[-35,-9]],[[5093,1407],[-7,3],[-34,12]],[[5148,4153],[-16,11],[-22,14],[-28,25]],[[5139,4189],[17,-17],[-8,-19]],[[5263,4080],[-30,-44],[-37,38],[-14,15],[-18,-11]],[[5164,4078],[-7,-10],[-63,62],[-12,-10]],[[5148,4153],[40,-24],[29,-19],[12,-7]],[[5352,4128],[-13,-17],[-12,-16]],[[5359,4062],[-32,33]],[[5352,4128],[52,-56]],[[5359,4062],[-3,-4],[-12,-11],[-3,-1],[-2,1],[-27,28]],[[5341,4014],[-42,44]],[[5156,3767],[-20,20],[-37,40],[-7,-1],[-11,-14],[-15,-19],[-14,-18]],[[5034,3892],[9,1],[12,0],[10,1],[6,2],[7,2],[7,4],[26,16]],[[5111,3918],[55,33],[4,1]],[[5170,3952],[9,4],[3,1],[3,2],[9,5]],[[5194,3964],[25,15],[2,1],[16,22],[2,3],[7,14],[3,6],[32,44]],[[5000,3988],[15,-14],[26,-27],[5,-5],[5,-2],[5,0],[6,1],[4,3],[3,3],[4,3],[10,12]],[[5083,3962],[8,-8],[6,-7],[5,-7],[7,-18],[2,-4]],[[5026,4023],[8,-10],[20,-20]],[[5054,3993],[14,-15],[15,-16]],[[5054,3993],[12,17],[24,34],[3,1],[2,-1],[11,-12]],[[5106,4032],[-26,-37],[25,-25],[1,-1],[1,0],[3,1],[17,10],[5,4],[3,2],[3,4],[2,1],[2,-3],[1,-1],[10,-11],[12,-12],[4,-8],[1,-4]],[[5069,4101],[6,-7],[15,-15],[28,-30],[-12,-17]],[[5164,4078],[8,-9],[-17,-22],[5,-7],[25,-26],[4,-3],[3,-3],[-6,-8],[-11,-13],[-1,-2],[0,-1],[1,-1],[1,-1],[7,-6],[8,-9],[3,-3]],[[5409,4205],[46,-49],[-22,-31],[14,-15]],[[9268,8006],[-23,6]],[[9245,8012],[5,22],[3,16],[5,22],[3,17],[3,13],[4,15]],[[9268,8117],[21,-5]],[[9289,8112],[41,-11],[42,-11]],[[9233,7952],[6,26],[6,31],[0,3]],[[9308,8311],[-1,-4],[-11,-55],[-4,-18],[-5,-23],[-5,-23],[-3,-18],[-11,-53]],[[8952,8419],[33,26],[26,21],[33,26],[20,15],[-1,1],[0,2],[0,2],[5,4],[24,22],[21,17],[16,13],[22,18]],[[9358,8298],[-1,-4],[-6,-31],[-5,-26],[-1,-3]],[[9345,8234],[-3,-19]],[[9342,8215],[-5,-6],[-9,-6],[-5,-4],[-10,-6],[-4,-3],[-4,-4],[-2,-5],[-2,-7],[-4,-21],[-4,-21],[-4,-20]],[[9342,8215],[56,-15],[2,0]],[[9345,8234],[39,-10],[3,14],[3,3],[2,11],[36,-9],[19,-5]],[[9358,8298],[117,-29]],[[9363,8328],[45,-11],[23,-7],[15,-4],[11,-3],[4,1],[8,4]],[[5950,4855],[-23,-11]],[[5927,4844],[-20,-12],[-21,-13]],[[5886,4819],[-13,-3],[-16,1],[-7,1],[-12,1],[-19,-3],[-5,-2],[-9,-2],[-5,-1],[-2,-1],[-25,-7],[-32,-4]],[[5736,4825],[6,1],[6,0],[5,3],[18,30],[8,9],[3,1],[4,3],[19,7],[7,1],[10,-2],[7,-4],[6,-3],[7,-6],[3,-1],[6,-2],[5,2],[3,1],[5,2],[3,1],[48,13],[6,2],[4,-1],[2,-1],[-2,-12],[11,-9],[5,-1],[0,4],[0,2],[0,8],[-1,6],[-1,3],[0,21],[7,12],[6,6],[7,9],[1,4],[8,14],[5,6],[11,20]],[[5998,4967],[13,-7],[25,-12]],[[6036,4948],[-11,-14],[-9,-11]],[[6016,4923],[-14,-17],[-7,-8],[-10,-9]],[[5985,4889],[-16,-17],[-8,-9],[-11,-8]],[[5875,4608],[6,4],[4,12],[6,20],[-84,49],[-113,59],[-27,-12]],[[5886,4819],[4,-3],[27,-14],[-8,-19],[62,-31]],[[5971,4752],[61,-31],[3,-2]],[[5927,4844],[5,-4],[61,-31],[-7,-19],[-7,-19],[-8,-19]],[[5950,4855],[111,-57],[4,-1]],[[5985,4889],[83,-42],[9,-5],[4,-2]],[[6016,4923],[62,-32],[14,-7],[4,-2]],[[6036,4948],[53,-27],[14,-7],[4,-2]],[[6036,5032],[21,-10],[-5,-16],[11,-6],[60,-30],[4,-1]],[[6054,5070],[23,-11],[3,-3],[61,-31],[3,-1]],[[8833,8678],[16,16],[-21,48],[-20,-12],[-8,19],[-37,80],[20,12],[-15,33],[-23,53],[-2,5],[-20,-13],[-23,-15]],[[8700,8904],[-7,14],[-3,5],[-9,22],[-8,-5],[-11,-5],[-7,-3],[-13,-7],[-42,-17],[-13,-4],[-25,-4],[-11,-1],[-5,0],[-3,0],[-6,1],[-12,2],[-8,0],[-6,-2]],[[8511,8900],[-4,-2],[-7,-3],[-3,-2],[-5,-4],[-8,-6],[-3,-3],[-5,-4],[-6,-7],[-12,-20],[17,-41],[-32,-18],[-1,-1],[0,-2],[7,-17],[4,-10],[12,-11],[3,-3]],[[8305,8694],[13,17],[9,6],[7,6],[1,2],[4,5],[6,5],[8,1],[6,6],[10,9],[8,9],[11,7],[18,16],[7,9],[6,11],[13,20],[7,7],[4,4],[4,3],[6,13],[9,12],[7,15],[22,19],[20,9],[21,1],[17,-1],[20,1],[12,2],[15,6],[13,7],[9,3],[3,3],[0,7],[1,1],[3,-2],[3,0],[7,6],[13,13],[10,8],[9,12],[9,8],[24,23],[6,9],[9,7],[10,10],[13,11],[24,24],[24,22],[9,10],[11,29],[5,9],[6,13],[4,13],[12,27],[4,13],[3,13],[12,20],[10,22],[9,14],[12,17],[9,10],[6,9],[20,28],[10,9],[6,7],[2,5],[8,6],[6,7],[4,8],[3,11],[12,23],[6,16],[0,7],[2,19],[4,8],[9,17],[24,48],[8,14],[9,10],[2,7],[8,14],[4,15],[4,9],[2,6],[9,13],[4,8],[4,13],[1,13],[4,13],[10,21],[6,6],[12,17],[2,0],[13,23],[12,4],[6,7],[12,10],[8,4],[6,4],[7,8],[1,1],[18,9],[8,2],[7,3],[7,5],[20,8],[5,0],[12,8],[14,10],[10,6],[16,4],[10,4],[11,4],[14,8],[16,10],[4,4],[2,0]],[[8795,8640],[-8,18],[-64,142],[-2,4],[-22,50],[0,4],[2,4],[14,8],[-14,31],[-1,2],[0,1]],[[8686,8525],[-2,4],[-2,2],[-3,6],[-3,5],[-2,2],[-11,23],[-20,47],[-13,31],[-16,35],[-30,69],[-33,78]],[[8551,8827],[-1,4],[-7,15],[-5,8],[-9,13],[-6,8],[-4,7],[-8,18]],[[8555,8562],[17,19],[14,17],[-9,11],[-4,9],[-22,51],[-2,2],[-17,-10],[-9,21],[-18,-10]],[[8468,8746],[6,8],[7,9],[9,9],[10,11],[11,10],[19,17],[18,15],[3,2]],[[7052,6851],[-5,9],[-12,18],[-37,-32],[-11,18],[-12,18]],[[7054,6811],[-37,-33],[-12,18],[-15,24],[-12,19]],[[6990,6704],[-3,4],[-44,68],[-7,12]],[[6936,6788],[-9,15],[-30,47]],[[6897,6850],[-31,49]],[[6830,6759],[10,8],[25,-40],[14,13],[14,12],[14,12],[14,12],[15,12]],[[6819,6776],[10,27]],[[6829,6803],[5,-7],[6,5],[13,11],[15,13],[14,12],[15,13]],[[6829,6803],[-2,3],[-9,13],[-7,11],[-16,26],[18,17],[16,14]],[[6829,6887],[18,-29],[2,-3],[8,21],[2,6],[7,17]],[[6829,6887],[-44,68],[1,5],[5,21]],[[6715,6834],[2,7],[8,19],[7,14],[5,12],[5,5],[35,82],[4,17]],[[7568,4477],[7,11],[5,9]],[[7580,4497],[9,-7],[45,-34],[13,-10]],[[7580,4497],[14,23]],[[7580,4497],[-11,8],[-42,33],[-9,9]],[[7568,4477],[-63,47]],[[7555,4451],[-19,14],[-37,27],[-8,6]],[[7523,4395],[-62,47]],[[7498,4350],[-62,46]],[[7485,4324],[-63,47]],[[5016,1281],[-46,1],[-3,21],[0,14],[1,6],[-4,20],[-18,-3],[-3,0],[-2,1],[-2,3],[-4,22],[-23,-5]],[[5016,1227],[-10,3],[-8,7],[-3,5],[-2,12],[1,19],[-3,-4],[-3,-9],[-1,-8],[2,-7],[2,-6],[4,-8],[6,-4],[9,-3],[6,-2]],[[5626,4344],[-6,6],[-47,50],[13,16],[12,17]],[[5608,4321],[-1,0],[-14,15],[-40,42],[-7,7]],[[5546,4385],[-26,27],[-19,20],[-3,3],[-3,3],[-4,4],[-2,2],[-1,1]],[[5524,4487],[5,5],[0,2],[17,20]],[[5546,4514],[31,-30],[33,-36]],[[5639,4489],[-17,-24],[-12,-17]],[[5546,4514],[19,22],[3,3]],[[5568,4539],[14,-12],[3,-3],[3,-2],[4,-1],[5,0],[5,1],[21,-19],[16,-14]],[[5568,4539],[21,26],[13,20],[6,9],[2,3]],[[5610,4597],[73,-44]],[[5683,4553],[-3,-4],[-2,-4],[-14,-19],[-14,-19],[-11,-18]],[[5568,4539],[-19,19],[-14,13],[-15,14]],[[5630,4642],[74,-41],[-11,-25],[-10,-23]],[[5748,4503],[-22,16],[-43,34]],[[5638,4663],[4,-2],[7,16],[20,-12],[26,-13],[2,-1],[13,-4],[79,-41]],[[5742,4702],[54,-28],[-9,-24],[30,-15],[29,-7],[0,-1],[-3,-11]],[[5546,4385],[-3,-5],[-5,-5],[-9,-12],[0,-3],[-2,-3],[-5,-6],[-4,-2],[-5,-7],[-14,-19],[-13,-17]],[[5534,4223],[-62,65]],[[5608,4321],[-3,-5],[-12,-16],[-2,0],[0,-1],[0,-1],[-8,-11],[-9,-11],[-13,-17],[-13,-18],[-14,-18]],[[5494,4172],[-61,65]],[[5534,4223],[-13,-16],[-13,-18]],[[6183,5178],[9,23],[10,22],[11,-6],[39,-19],[22,-10]],[[6160,5189],[10,23],[10,22],[7,22]],[[6187,5256],[19,-9],[5,-2],[9,-5],[32,-16],[30,-14]],[[6187,5256],[17,49]],[[6204,5305],[20,-10],[3,-2],[3,-4],[2,-2],[6,-3],[14,-7],[46,-22]],[[6298,5255],[-4,-12],[-4,-11],[-4,-11],[-4,-11]],[[6323,5325],[-9,-24],[-10,4],[-28,14]],[[6276,5319],[-5,3],[-31,14],[-24,2],[-6,-16],[-6,-17]],[[6079,5226],[9,15],[21,27],[12,18],[27,28],[13,16],[20,23],[3,2],[3,2],[15,0],[9,1],[6,3],[18,19],[1,1]],[[6276,5319],[-23,-15],[3,-2],[50,-25]],[[6306,5277],[-4,-11],[-4,-11]],[[6367,5247],[-44,21],[-17,9]]],"box":[-73.97639960366291,45.40212922961762,-73.47606597759493,45.70374747616739],"transform":{"scale":[0.000050038366443442794,0.000030164841139091116],"translate":[-73.97639960366291,45.40212922961762]}} diff --git a/test/memoryLimitCases/json/src/7.json b/test/memoryLimitCases/json/src/7.json new file mode 100644 index 00000000000..33726beae05 --- /dev/null +++ b/test/memoryLimitCases/json/src/7.json @@ -0,0 +1 @@ +{"type":"Topology","objects":{"da_polygons":{"type":"GeometryCollection","geometries":[{"type":"Polygon","arcs":[[0,1,2,3]],"properties":{"id":"24661006","dp":8931,"de":1335}},{"type":"Polygon","arcs":[[4,5,-3,6]],"properties":{"id":"24661007","dp":10647,"de":1878}},{"type":"Polygon","arcs":[[7,-5,8,9]],"properties":{"id":"24661008","dp":16943,"de":0}},{"type":"Polygon","arcs":[[10,11,12,13,-10,14]],"properties":{"id":"24661009","dp":12530,"de":0}},{"type":"Polygon","arcs":[[15,-12,16,17]],"properties":{"id":"24661010","dp":9438,"de":702}},{"type":"Polygon","arcs":[[-16,18,19,20,21]],"properties":{"id":"24661011","dp":8010,"de":0}},{"type":"Polygon","arcs":[[-13,-22,22,23,24]],"properties":{"id":"24661012","dp":11850,"de":2286}},{"type":"Polygon","arcs":[[-14,-25,25,26,27,-8]],"properties":{"id":"24661013","dp":14048,"de":0}},{"type":"Polygon","arcs":[[-28,28,29,30,-6]],"properties":{"id":"24661014","dp":13125,"de":937}},{"type":"Polygon","arcs":[[-4,-31,31,32]],"properties":{"id":"24661015","dp":9751,"de":0}},{"type":"Polygon","arcs":[[-33,33,34,35,36]],"properties":{"id":"24661016","dp":11366,"de":3096}},{"type":"Polygon","arcs":[[37,38,39,40,41,-36,42]],"properties":{"id":"24661017","dp":12016,"de":2796}},{"type":"Polygon","arcs":[[43,44,-39,45,46]],"properties":{"id":"24661018","dp":11687,"de":0}},{"type":"Polygon","arcs":[[-46,-38,47,48,49]],"properties":{"id":"24661019","dp":12350,"de":0}},{"type":"Polygon","arcs":[[50,-47,-50,51,52]],"properties":{"id":"24661020","dp":9967,"de":0}},{"type":"Polygon","arcs":[[-52,-49,53,54,55,56]],"properties":{"id":"24661021","dp":7994,"de":1432}},{"type":"Polygon","arcs":[[-56,57,58,59,60,61]],"properties":{"id":"24661022","dp":5211,"de":1785}},{"type":"Polygon","arcs":[[62,63,-57,-62,64]],"properties":{"id":"24661023","dp":6243,"de":582}},{"type":"Polygon","arcs":[[-65,-61,65,66,67,68]],"properties":{"id":"24661024","dp":5485,"de":0}},{"type":"Polygon","arcs":[[69,70,71,-66]],"properties":{"id":"24661025","dp":7364,"de":0}},{"type":"Polygon","arcs":[[-70,-60,72,73,74]],"properties":{"id":"24661026","dp":10337,"de":1466}},{"type":"Polygon","arcs":[[75,76,77,78,-71,-75]],"properties":{"id":"24661027","dp":12164,"de":1903}},{"type":"Polygon","arcs":[[79,80,-76,-74,81]],"properties":{"id":"24661028","dp":11862,"de":0}},{"type":"Polygon","arcs":[[82,83,-77,-81,84]],"properties":{"id":"24661029","dp":13911,"de":0}},{"type":"Polygon","arcs":[[85,86,87,-85,-80,88]],"properties":{"id":"24661030","dp":19910,"de":0}},{"type":"Polygon","arcs":[[-87,89,90]],"properties":{"id":"24661031","dp":19144,"de":0}},{"type":"Polygon","arcs":[[-83,-88,-91,91,92,93,94,95]],"properties":{"id":"24661032","dp":7816,"de":7672}},{"type":"Polygon","arcs":[[96,-92,-90,-86,97]],"properties":{"id":"24661033","dp":15840,"de":0}},{"type":"Polygon","arcs":[[98,-98,99,100]],"properties":{"id":"24661034","dp":14082,"de":0}},{"type":"Polygon","arcs":[[101,-93,-97,-99,102]],"properties":{"id":"24661035","dp":13138,"de":1666}},{"type":"Polygon","arcs":[[103,104,105,106]],"properties":{"id":"24660626","dp":11270,"de":0}},{"type":"Polygon","arcs":[[107,108,-104,109]],"properties":{"id":"24660627","dp":9435,"de":0}},{"type":"Polygon","arcs":[[110,-110,-107,111,112,113,114,115]],"properties":{"id":"24660628","dp":3679,"de":3326}},{"type":"Polygon","arcs":[[116,117,118,-111]],"properties":{"id":"24660629","dp":48819,"de":4658}},{"type":"Polygon","arcs":[[119,120,121,-118,122]],"properties":{"id":"24660630","dp":4054,"de":851}},{"type":"Polygon","arcs":[[123,124,125,-123,126,127]],"properties":{"id":"24660631","dp":6140,"de":1321}},{"type":"Polygon","arcs":[[128,129,-120,-126,130]],"properties":{"id":"24660632","dp":4964,"de":0}},{"type":"Polygon","arcs":[[131,-131,-125,132,133,134]],"properties":{"id":"24660633","dp":4795,"de":6787}},{"type":"Polygon","arcs":[[135,136,137,-132,138,139]],"properties":{"id":"24660634","dp":4116,"de":1223}},{"type":"Polygon","arcs":[[140,141,142,143,-136]],"properties":{"id":"24660635","dp":8631,"de":1131}},{"type":"Polygon","arcs":[[144,145,-141,146]],"properties":{"id":"24660636","dp":9930,"de":2797}},{"type":"Polygon","arcs":[[-147,-140,147,148]],"properties":{"id":"24660637","dp":12431,"de":0}},{"type":"Polygon","arcs":[[-148,-139,-135,149,150]],"properties":{"id":"24660638","dp":8941,"de":1274}},{"type":"Polygon","arcs":[[-150,-134,151,152]],"properties":{"id":"24660639","dp":10337,"de":1054}},{"type":"Polygon","arcs":[[153,-153,154,155]],"properties":{"id":"24660640","dp":7798,"de":3731}},{"type":"Polygon","arcs":[[-155,156,157,158]],"properties":{"id":"24660641","dp":11155,"de":3361}},{"type":"Polygon","arcs":[[-158,159,160,161,162]],"properties":{"id":"24660642","dp":10407,"de":4184}},{"type":"Polygon","arcs":[[-162,163,164,165,166]],"properties":{"id":"24660643","dp":12951,"de":8280}},{"type":"Polygon","arcs":[[167,168,-166,169,170]],"properties":{"id":"24660644","dp":9054,"de":2215}},{"type":"Polygon","arcs":[[-165,171,172,173,174,175,-170]],"properties":{"id":"24660645","dp":11651,"de":2816}},{"type":"Polygon","arcs":[[176,-171,-176,177,178,179,180,181,182]],"properties":{"id":"24660646","dp":6723,"de":3837}},{"type":"Polygon","arcs":[[183,184,185,186,-181,187,188]],"properties":{"id":"24660649","dp":9487,"de":1370}},{"type":"Polygon","arcs":[[-189,189,-179,190,191,192]],"properties":{"id":"24660650","dp":4420,"de":2155}},{"type":"Polygon","arcs":[[-192,193,194,195,196,197]],"properties":{"id":"24660652","dp":9408,"de":869}},{"type":"Polygon","arcs":[[198,199,-195,200]],"properties":{"id":"24660654","dp":3356,"de":0}},{"type":"Polygon","arcs":[[201,202,203,204,205,-199]],"properties":{"id":"24660655","dp":6279,"de":3761}},{"type":"Polygon","arcs":[[206,207,-196,-200,-206]],"properties":{"id":"24660656","dp":16096,"de":1470}},{"type":"Polygon","arcs":[[-205,208,209,210,211,-207]],"properties":{"id":"24660657","dp":14502,"de":974}},{"type":"Polygon","arcs":[[212,213,214,215,216]],"properties":{"id":"24661144","dp":17838,"de":1781}},{"type":"Polygon","arcs":[[-216,217,218]],"properties":{"id":"24661145","dp":14407,"de":0}},{"type":"Polygon","arcs":[[219,-219,220,221,222,223]],"properties":{"id":"24661146","dp":10811,"de":7711}},{"type":"Polygon","arcs":[[224,225,226,227]],"properties":{"id":"24663242","dp":135547,"de":31021}},{"type":"Polygon","arcs":[[-226,228,229,230]],"properties":{"id":"24663243","dp":74527,"de":15540}},{"type":"Polygon","arcs":[[231,-201,-194,-191]],"properties":{"id":"24663244","dp":15460,"de":1381}},{"type":"Polygon","arcs":[[232,233,234,235,236]],"properties":{"id":"24663245","dp":28870,"de":2258}},{"type":"Polygon","arcs":[[237,238,239,240,241,242,243]],"properties":{"id":"24663215","dp":11166,"de":5263}},{"type":"Polygon","arcs":[[244,245,246,247,248,249,250,251,252,253,254]],"properties":{"id":"24663216","dp":1357,"de":364}},{"type":"Polygon","arcs":[[255,256,257,258,-249,259]],"properties":{"id":"24663217","dp":5669,"de":873}},{"type":"Polygon","arcs":[[260,-260,-248,261]],"properties":{"id":"24663218","dp":4290,"de":1018}},{"type":"Polygon","arcs":[[-259,262,263,-250]],"properties":{"id":"24663219","dp":9313,"de":0}},{"type":"Polygon","arcs":[[-258,264,265,266,267,268,269,270,-263]],"properties":{"id":"24663220","dp":3197,"de":1020}},{"type":"Polygon","arcs":[[-264,-271,271,272,-251]],"properties":{"id":"24663221","dp":11214,"de":0}},{"type":"Polygon","arcs":[[-270,273,274,275,-272]],"properties":{"id":"24663222","dp":9621,"de":0}},{"type":"Polygon","arcs":[[-273,-276,276,277,278,-252]],"properties":{"id":"24663223","dp":11269,"de":0}},{"type":"Polygon","arcs":[[279,280,281,282,283,284,285,286]],"properties":{"id":"24663227","dp":3208,"de":243}},{"type":"Polygon","arcs":[[287,288,-284]],"properties":{"id":"24663228","dp":9806,"de":1320}},{"type":"Polygon","arcs":[[-285,-289,289,290,291,292,293]],"properties":{"id":"24663229","dp":2759,"de":1023}},{"type":"Polygon","arcs":[[294,295,296,-292]],"properties":{"id":"24663230","dp":8375,"de":1160}},{"type":"Polygon","arcs":[[297,298,299,300,-296]],"properties":{"id":"24663231","dp":10815,"de":998}},{"type":"Polygon","arcs":[[301,302,303,304,-298,305]],"properties":{"id":"24663232","dp":7492,"de":3592}},{"type":"Polygon","arcs":[[306,307,308,309,-300]],"properties":{"id":"24663233","dp":7652,"de":0}},{"type":"Polygon","arcs":[[-309,310,311,312,313]],"properties":{"id":"24663234","dp":9826,"de":1391}},{"type":"Polygon","arcs":[[-297,-301,-310,-314,314,315,316,317,318]],"properties":{"id":"24663235","dp":8550,"de":1062}},{"type":"Polygon","arcs":[[-286,319,320,321,-293,-319,322,323,324,325,326]],"properties":{"id":"24663236","dp":1908,"de":0}},{"type":"Polygon","arcs":[[327,-324]],"properties":{"id":"24663237","dp":12585,"de":0}},{"type":"Polygon","arcs":[[-321,328]],"properties":{"id":"24663238","dp":12077,"de":0}},{"type":"Polygon","arcs":[[-294,-322,-329,-320]],"properties":{"id":"24663239","dp":9419,"de":0}},{"type":"Polygon","arcs":[[329,330,331,332,333,334,335,336,337,338,339]],"properties":{"id":"24663241","dp":9132,"de":3526}},{"type":"Polygon","arcs":[[340,341,342,343,344]],"properties":{"id":"24663315","dp":6316,"de":663}},{"type":"Polygon","arcs":[[-345,345]],"properties":{"id":"24663316","dp":17073,"de":0}},{"type":"Polygon","arcs":[[346,347,348,-342,349]],"properties":{"id":"24663317","dp":6559,"de":940}},{"type":"Polygon","arcs":[[350,351,-347,352]],"properties":{"id":"24663318","dp":13324,"de":0}},{"type":"Polygon","arcs":[[-352,353,354,355,-348]],"properties":{"id":"24663319","dp":5197,"de":591}},{"type":"Polygon","arcs":[[356,-247,357,-356]],"properties":{"id":"24663320","dp":8801,"de":4778}},{"type":"Polygon","arcs":[[-349,-358,-246,358,-343]],"properties":{"id":"24663321","dp":4576,"de":2380}},{"type":"Polygon","arcs":[[359,360,361,362,363,364]],"properties":{"id":"24663322","dp":5794,"de":2158}},{"type":"Polygon","arcs":[[365,-361,366]],"properties":{"id":"24663323","dp":14574,"de":0}},{"type":"Polygon","arcs":[[367,368,369,-362,-366,370]],"properties":{"id":"24663324","dp":14421,"de":0}},{"type":"Polygon","arcs":[[371,372,-369,373]],"properties":{"id":"24663325","dp":15522,"de":0}},{"type":"Polygon","arcs":[[374,375,376,-374,-368,377]],"properties":{"id":"24663326","dp":10725,"de":1170}},{"type":"Polygon","arcs":[[-377,378,379,380,-372]],"properties":{"id":"24663327","dp":17213,"de":0}},{"type":"Polygon","arcs":[[-381,381,-363,-370,-373]],"properties":{"id":"24663328","dp":15796,"de":1851}},{"type":"Polygon","arcs":[[382,383,384,385,386,387,388,389,390,391,392,393,394,395,396]],"properties":{"id":"24663329","dp":0,"de":296}},{"type":"Polygon","arcs":[[397,398,399,400,401,402,403,404]],"properties":{"id":"24663330","dp":4436,"de":5953}},{"type":"Polygon","arcs":[[405,406,407,-399,408]],"properties":{"id":"24663331","dp":11992,"de":1562}},{"type":"Polygon","arcs":[[409,410,-406,411,412]],"properties":{"id":"24663332","dp":14081,"de":2551}},{"type":"Polygon","arcs":[[413,414,415,-410,416]],"properties":{"id":"24663333","dp":8329,"de":1540}},{"type":"Polygon","arcs":[[417,418,419,420,421,422,423,424,425]],"properties":{"id":"24660037","dp":6132,"de":0}},{"type":"Polygon","arcs":[[426,427,428,429,-419,430]],"properties":{"id":"24660038","dp":9844,"de":0}},{"type":"Polygon","arcs":[[431,-427,432]],"properties":{"id":"24660039","dp":11381,"de":0}},{"type":"Polygon","arcs":[[433,434,435,-428,-432]],"properties":{"id":"24660040","dp":4262,"de":404}},{"type":"Polygon","arcs":[[436,-434,-433,-431,-418,437,438]],"properties":{"id":"24660041","dp":3909,"de":348}},{"type":"Polygon","arcs":[[439,-438,-426,440]],"properties":{"id":"24660042","dp":9275,"de":0}},{"type":"Polygon","arcs":[[-425,441,-441]],"properties":{"id":"24660043","dp":10046,"de":0}},{"type":"Polygon","arcs":[[442,-440,-442,-424,443,444,445,446]],"properties":{"id":"24660044","dp":3139,"de":1321}},{"type":"Polygon","arcs":[[447,-446,448,449,450]],"properties":{"id":"24660045","dp":2288,"de":0}},{"type":"Polygon","arcs":[[-439,-443,451,452]],"properties":{"id":"24660046","dp":4770,"de":478}},{"type":"Polygon","arcs":[[453,454,455,456,457,-435,-437,-453,458]],"properties":{"id":"24660047","dp":2550,"de":2172}},{"type":"Polygon","arcs":[[459,460,461,-455,462]],"properties":{"id":"24660048","dp":6159,"de":1346}},{"type":"Polygon","arcs":[[463,464,465,-456,-462,466]],"properties":{"id":"24660049","dp":5493,"de":681}},{"type":"Polygon","arcs":[[467,-464,468]],"properties":{"id":"24660050","dp":9764,"de":0}},{"type":"Polygon","arcs":[[469,470,-469,-467,-461,471,472]],"properties":{"id":"24660051","dp":4193,"de":0}},{"type":"Polygon","arcs":[[473,474,-472,-460,475]],"properties":{"id":"24660052","dp":7412,"de":1105}},{"type":"Polygon","arcs":[[476,-473,-475,477]],"properties":{"id":"24660053","dp":6310,"de":0}},{"type":"Polygon","arcs":[[478,479,-478,-474,480,481,482]],"properties":{"id":"24660054","dp":4320,"de":724}},{"type":"Polygon","arcs":[[483,484,485,-479]],"properties":{"id":"24660055","dp":9536,"de":0}},{"type":"Polygon","arcs":[[486,-485,487]],"properties":{"id":"24660056","dp":4995,"de":0}},{"type":"Polygon","arcs":[[488,489,490,491,492,493,494,495,496,-488,-484,-483,497]],"properties":{"id":"24660057","dp":338,"de":536}},{"type":"Polygon","arcs":[[498,499,500,501]],"properties":{"id":"24660489","dp":8249,"de":6849}},{"type":"Polygon","arcs":[[502,503,504,-502]],"properties":{"id":"24660490","dp":8603,"de":3262}},{"type":"Polygon","arcs":[[-253,-279,505,506,507,508]],"properties":{"id":"24660141","dp":1836,"de":234}},{"type":"Polygon","arcs":[[509,510,-503,-501,511,512,513,514,515,516,517]],"properties":{"id":"24660491","dp":1351,"de":5936}},{"type":"Polygon","arcs":[[-517,518,519,520]],"properties":{"id":"24660492","dp":13313,"de":0}},{"type":"Polygon","arcs":[[-516,521,522,-519]],"properties":{"id":"24660493","dp":13219,"de":1570}},{"type":"Polygon","arcs":[[-523,523,524,525]],"properties":{"id":"24660494","dp":11926,"de":1361}},{"type":"Polygon","arcs":[[-525,526,527,528]],"properties":{"id":"24660495","dp":9387,"de":1348}},{"type":"Polygon","arcs":[[529,530,531,-527,-524]],"properties":{"id":"24660496","dp":11422,"de":1845}},{"type":"Polygon","arcs":[[-515,-530,-522]],"properties":{"id":"24660497","dp":14505,"de":1692}},{"type":"Polygon","arcs":[[-514,532,533,534,-531]],"properties":{"id":"24660498","dp":10225,"de":1503}},{"type":"Polygon","arcs":[[535,536,537,-534]],"properties":{"id":"24660499","dp":9676,"de":0}},{"type":"Polygon","arcs":[[-533,-513,538,539,540,541,542,543,-536]],"properties":{"id":"24660500","dp":3362,"de":7441}},{"type":"Polygon","arcs":[[-544,544,545,546,547,-537]],"properties":{"id":"24660501","dp":7888,"de":837}},{"type":"Polygon","arcs":[[548,549,-545,-543]],"properties":{"id":"24660502","dp":13405,"de":1811}},{"type":"Polygon","arcs":[[550,551,552,-549,-542]],"properties":{"id":"24660503","dp":7376,"de":874}},{"type":"Polygon","arcs":[[553,554,-551,-541]],"properties":{"id":"24660504","dp":5407,"de":1005}},{"type":"Polygon","arcs":[[555,556,557,-554,-540]],"properties":{"id":"24660505","dp":9900,"de":2490}},{"type":"Polygon","arcs":[[558,559,560,-557,561,562]],"properties":{"id":"24660506","dp":8935,"de":2987}},{"type":"Polygon","arcs":[[563,-563,564]],"properties":{"id":"24660507","dp":10570,"de":1027}},{"type":"Polygon","arcs":[[565,566,567,-559,-564,568]],"properties":{"id":"24660508","dp":6919,"de":1668}},{"type":"Polygon","arcs":[[569,570,-566,571]],"properties":{"id":"24660509","dp":8828,"de":0}},{"type":"Polygon","arcs":[[572,573,-572,-569,-565,-562,-556,-539,574,575]],"properties":{"id":"24660510","dp":1306,"de":8518}},{"type":"Polygon","arcs":[[576,577,578,579,-570,-574]],"properties":{"id":"24660511","dp":4287,"de":468}},{"type":"Polygon","arcs":[[-573,580,581,-577]],"properties":{"id":"24660512","dp":13997,"de":0}},{"type":"Polygon","arcs":[[582,583,584,585,586,587,-581]],"properties":{"id":"24660513","dp":10449,"de":1063}},{"type":"Polygon","arcs":[[588,589,-587]],"properties":{"id":"24660514","dp":9284,"de":0}},{"type":"Polygon","arcs":[[-586,590,591,-589]],"properties":{"id":"24660515","dp":39141,"de":3862}},{"type":"Polygon","arcs":[[-585,592,593,-591]],"properties":{"id":"24660516","dp":26174,"de":1912}},{"type":"Polygon","arcs":[[594,595,596,597,598,-593]],"properties":{"id":"24660517","dp":8932,"de":485}},{"type":"Polygon","arcs":[[599,600,601,602]],"properties":{"id":"24661004","dp":10054,"de":0}},{"type":"Polygon","arcs":[[-1,-37,-42,-601]],"properties":{"id":"24661005","dp":8535,"de":5063}},{"type":"Polygon","arcs":[[603,604,-254,-509,605,606,607,608]],"properties":{"id":"24660142","dp":3728,"de":2421}},{"type":"Polygon","arcs":[[609,610,-609]],"properties":{"id":"24660143","dp":10342,"de":0}},{"type":"Polygon","arcs":[[611,-610,-608,612,613,614]],"properties":{"id":"24660144","dp":15266,"de":722}},{"type":"Polygon","arcs":[[615,-604,-611,616]],"properties":{"id":"24660145","dp":12741,"de":0}},{"type":"Polygon","arcs":[[617,618,-617,-612,619,620,621,622]],"properties":{"id":"24660146","dp":7606,"de":1504}},{"type":"Polygon","arcs":[[-618,623]],"properties":{"id":"24660147","dp":20632,"de":1656}},{"type":"Polygon","arcs":[[624,-255,-605,-616,-619,-624,-623,625]],"properties":{"id":"24660148","dp":1454,"de":5705}},{"type":"Polygon","arcs":[[626,-626,627,628,629,630]],"properties":{"id":"24660149","dp":5561,"de":963}},{"type":"Polygon","arcs":[[631,632,-631,633,634]],"properties":{"id":"24660150","dp":3943,"de":1446}},{"type":"Polygon","arcs":[[635,-635,636,637,638]],"properties":{"id":"24660151","dp":4713,"de":0}},{"type":"Polygon","arcs":[[639,640,-637,-634,-630,641,642,643]],"properties":{"id":"24660152","dp":3337,"de":3856}},{"type":"Polygon","arcs":[[644,-640,645]],"properties":{"id":"24660153","dp":10086,"de":867}},{"type":"Polygon","arcs":[[646,-646,647,648]],"properties":{"id":"24660154","dp":6043,"de":699}},{"type":"Polygon","arcs":[[-649,649,650,651,652]],"properties":{"id":"24660155","dp":8086,"de":942}},{"type":"Polygon","arcs":[[653,-652,654,655,656]],"properties":{"id":"24660156","dp":11496,"de":2733}},{"type":"Polygon","arcs":[[657,-655,-651,658,659,660,661,662,663,664]],"properties":{"id":"24660157","dp":2446,"de":187}},{"type":"Polygon","arcs":[[-665,665,666,667]],"properties":{"id":"24660158","dp":9450,"de":1247}},{"type":"Polygon","arcs":[[668,669,-666,-664]],"properties":{"id":"24660159","dp":16040,"de":0}},{"type":"Polygon","arcs":[[-669,-663,670,671]],"properties":{"id":"24660160","dp":6754,"de":0}},{"type":"Polygon","arcs":[[-662,672,673,-671]],"properties":{"id":"24660161","dp":7033,"de":0}},{"type":"Polygon","arcs":[[-674,674,675]],"properties":{"id":"24660162","dp":9412,"de":0}},{"type":"Polygon","arcs":[[-675,-673,-661,676,677,678,679,680,681,682,683]],"properties":{"id":"24660163","dp":8293,"de":697}},{"type":"Polygon","arcs":[[684,685,-679,686]],"properties":{"id":"24660164","dp":9226,"de":3080}},{"type":"Polygon","arcs":[[687,688,689,690,-685]],"properties":{"id":"24660165","dp":9571,"de":0}},{"type":"Polygon","arcs":[[691,692,693,694]],"properties":{"id":"24660624","dp":17755,"de":2448}},{"type":"Polygon","arcs":[[-112,-106,695,-692]],"properties":{"id":"24660625","dp":16190,"de":1636}},{"type":"Polygon","arcs":[[696,697,698,699,700,701,702]],"properties":{"id":"24660877","dp":8154,"de":0}},{"type":"Polygon","arcs":[[703,704,-698,705]],"properties":{"id":"24660878","dp":13204,"de":0}},{"type":"Polygon","arcs":[[706,707,708,-699,-705]],"properties":{"id":"24660879","dp":14016,"de":0}},{"type":"Polygon","arcs":[[709,710,711,712,713,-707,-704,714]],"properties":{"id":"24660880","dp":5343,"de":1738}},{"type":"Polygon","arcs":[[715,716,-708,-714]],"properties":{"id":"24660881","dp":15212,"de":0}},{"type":"Polygon","arcs":[[-709,-717,717,718,719,-700]],"properties":{"id":"24660882","dp":13107,"de":0}},{"type":"Polygon","arcs":[[-718,-716,-713,720,721,722,723,724]],"properties":{"id":"24660883","dp":6469,"de":524}},{"type":"Polygon","arcs":[[725,726,727,-723]],"properties":{"id":"24660884","dp":8508,"de":732}},{"type":"Polygon","arcs":[[-728,728,729,730,731,-724]],"properties":{"id":"24660885","dp":6490,"de":3685}},{"type":"Polygon","arcs":[[-731,732,733,734,735,736,737]],"properties":{"id":"24660886","dp":11863,"de":2534}},{"type":"Polygon","arcs":[[-737,738,739,740,741]],"properties":{"id":"24660887","dp":15000,"de":0}},{"type":"Polygon","arcs":[[742,743,744,-739,-736]],"properties":{"id":"24660888","dp":15464,"de":0}},{"type":"Polygon","arcs":[[745,746,-743,-735]],"properties":{"id":"24660889","dp":15095,"de":0}},{"type":"Polygon","arcs":[[747,748,749,-744,-747]],"properties":{"id":"24660890","dp":15628,"de":0}},{"type":"Polygon","arcs":[[750,751,752,-748,-746,-734]],"properties":{"id":"24660891","dp":16444,"de":0}},{"type":"Polygon","arcs":[[753,-752]],"properties":{"id":"24660892","dp":12290,"de":0}},{"type":"Polygon","arcs":[[-751,-733,-730,754,755,756,757,758,759,760,761,762,763,-749,-753,-754]],"properties":{"id":"24660893","dp":480,"de":3413}},{"type":"Polygon","arcs":[[-745,-750,-764,764,-740]],"properties":{"id":"24660894","dp":15893,"de":957}},{"type":"Polygon","arcs":[[-741,-765,-763,765,766,767]],"properties":{"id":"24660895","dp":6906,"de":2126}},{"type":"Polygon","arcs":[[-766,-762,768,769]],"properties":{"id":"24660896","dp":13624,"de":0}},{"type":"Polygon","arcs":[[770,771,-767,-770,772]],"properties":{"id":"24660897","dp":17031,"de":0}},{"type":"Polygon","arcs":[[773,774,-771]],"properties":{"id":"24660898","dp":13979,"de":0}},{"type":"Polygon","arcs":[[775,-738,-742,-768,-772,-775,776]],"properties":{"id":"24660899","dp":5594,"de":4325}},{"type":"Polygon","arcs":[[777,-719,-725,-732,-776,778]],"properties":{"id":"24660900","dp":7907,"de":2759}},{"type":"Polygon","arcs":[[779,780,781,782,783,784,785]],"properties":{"id":"24661213","dp":5261,"de":5231}},{"type":"Polygon","arcs":[[-786,786,787,788,789,790,791,792,793]],"properties":{"id":"24661214","dp":6711,"de":933}},{"type":"Polygon","arcs":[[794,795,796,-788]],"properties":{"id":"24661215","dp":18148,"de":1851}},{"type":"Polygon","arcs":[[-797,797,798,-789]],"properties":{"id":"24661216","dp":19680,"de":3723}},{"type":"Polygon","arcs":[[-790,-799,799,800]],"properties":{"id":"24661217","dp":17804,"de":0}},{"type":"Polygon","arcs":[[-791,-801,801,802]],"properties":{"id":"24661218","dp":21421,"de":2696}},{"type":"Polygon","arcs":[[-792,-803,803,804]],"properties":{"id":"24661219","dp":11752,"de":2061}},{"type":"Polygon","arcs":[[-805,805,806,807]],"properties":{"id":"24661220","dp":11693,"de":3674}},{"type":"Polygon","arcs":[[-807,808,809]],"properties":{"id":"24661221","dp":13514,"de":2236}},{"type":"Polygon","arcs":[[-793,-808,-810,810,811,812,813,814]],"properties":{"id":"24661222","dp":8084,"de":3112}},{"type":"Polygon","arcs":[[815,-814,816,817,818,819,820]],"properties":{"id":"24661223","dp":2721,"de":1293}},{"type":"Polygon","arcs":[[821,822,823,824]],"properties":{"id":"24660715","dp":7667,"de":3137}},{"type":"Polygon","arcs":[[825,826,-822,827]],"properties":{"id":"24660716","dp":6704,"de":1787}},{"type":"Polygon","arcs":[[828,829,830,-826,831]],"properties":{"id":"24660717","dp":8223,"de":2919}},{"type":"Polygon","arcs":[[832,833,-830,834]],"properties":{"id":"24660718","dp":7019,"de":3425}},{"type":"Polygon","arcs":[[835,836,-185,-833,837]],"properties":{"id":"24660719","dp":6743,"de":3362}},{"type":"Polygon","arcs":[[838,-187,839,840]],"properties":{"id":"24660722","dp":14111,"de":2439}},{"type":"Polygon","arcs":[[841,842,-182,-839]],"properties":{"id":"24660723","dp":14735,"de":8730}},{"type":"Polygon","arcs":[[843,-183,-843,844]],"properties":{"id":"24660724","dp":13245,"de":1324}},{"type":"Polygon","arcs":[[-844,845,846,847,848,-168,-177]],"properties":{"id":"24660725","dp":6444,"de":2017}},{"type":"Polygon","arcs":[[849,850,-847,851,852,853]],"properties":{"id":"24660726","dp":4920,"de":3063}},{"type":"Polygon","arcs":[[854,855,856,857,858]],"properties":{"id":"24660749","dp":19316,"de":2278}},{"type":"Polygon","arcs":[[-859,859,860,861,862]],"properties":{"id":"24660750","dp":8036,"de":1740}},{"type":"Polygon","arcs":[[-143,863,-861,864]],"properties":{"id":"24660751","dp":11931,"de":956}},{"type":"Polygon","arcs":[[865,866,867,868]],"properties":{"id":"24662884","dp":4529,"de":0}},{"type":"MultiPolygon","arcs":[[[869,870,871,872,-866,873,874]],[[875]]],"properties":{"id":"24662885","dp":1894,"de":308}},{"type":"Polygon","arcs":[[876,877,-870,878]],"properties":{"id":"24662886","dp":7047,"de":0}},{"type":"Polygon","arcs":[[879,880,881,882,-877,883]],"properties":{"id":"24662887","dp":9032,"de":0}},{"type":"Polygon","arcs":[[884,885,886,887,888,889,890]],"properties":{"id":"24662888","dp":3292,"de":263}},{"type":"Polygon","arcs":[[891,892,-886,893]],"properties":{"id":"24662889","dp":6524,"de":0}},{"type":"Polygon","arcs":[[894,895,-894,-885]],"properties":{"id":"24662890","dp":6933,"de":0}},{"type":"Polygon","arcs":[[896,897,-892,-896,898,899]],"properties":{"id":"24662891","dp":7590,"de":0}},{"type":"Polygon","arcs":[[-900,900,901,902]],"properties":{"id":"24662892","dp":5797,"de":0}},{"type":"Polygon","arcs":[[903,-901,904,905,906]],"properties":{"id":"24662893","dp":4546,"de":0}},{"type":"Polygon","arcs":[[-899,-895,-891,907,-905]],"properties":{"id":"24662894","dp":4164,"de":0}},{"type":"Polygon","arcs":[[-908,908,909,910]],"properties":{"id":"24662895","dp":5343,"de":0}},{"type":"Polygon","arcs":[[-906,-911,911,912]],"properties":{"id":"24662896","dp":5953,"de":684}},{"type":"Polygon","arcs":[[913,914,915,916,917,918]],"properties":{"id":"24661583","dp":2600,"de":306}},{"type":"Polygon","arcs":[[919,920,-915,921]],"properties":{"id":"24661584","dp":2784,"de":451}},{"type":"Polygon","arcs":[[922,923,924,-922,-914]],"properties":{"id":"24661585","dp":4379,"de":948}},{"type":"Polygon","arcs":[[-920,-925,925,926,927]],"properties":{"id":"24661586","dp":2973,"de":0}},{"type":"Polygon","arcs":[[-924,928,929,930,931,932,-926]],"properties":{"id":"24661587","dp":3944,"de":657}},{"type":"Polygon","arcs":[[-927,-933,933,934,935]],"properties":{"id":"24661589","dp":2770,"de":840}},{"type":"Polygon","arcs":[[936,-928,-936,937,938,939]],"properties":{"id":"24661590","dp":2453,"de":284}},{"type":"Polygon","arcs":[[-938,-935,940,941,942,943,944,945]],"properties":{"id":"24661591","dp":3828,"de":3190}},{"type":"Polygon","arcs":[[946,947,948]],"properties":{"id":"24662549","dp":6190,"de":0}},{"type":"Polygon","arcs":[[949,950,951,952,-848,-851]],"properties":{"id":"24660727","dp":7519,"de":983}},{"type":"Polygon","arcs":[[953,954,955,956,957,-950,-850]],"properties":{"id":"24660728","dp":8488,"de":2785}},{"type":"Polygon","arcs":[[958,-954,959,960]],"properties":{"id":"24660729","dp":14304,"de":0}},{"type":"Polygon","arcs":[[961,-955,-959,962]],"properties":{"id":"24660730","dp":11732,"de":4385}},{"type":"Polygon","arcs":[[963,-956,-962,964]],"properties":{"id":"24660731","dp":14750,"de":3333}},{"type":"Polygon","arcs":[[965,966,-964,967]],"properties":{"id":"24660732","dp":11921,"de":2156}},{"type":"Polygon","arcs":[[968,969,-966,970]],"properties":{"id":"24660733","dp":8852,"de":2550}},{"type":"Polygon","arcs":[[971,972,973,-957,-967,-970]],"properties":{"id":"24660734","dp":12379,"de":3291}},{"type":"Polygon","arcs":[[974,975,976,-972,977,978]],"properties":{"id":"24660735","dp":9475,"de":846}},{"type":"Polygon","arcs":[[979,980,-978,-969]],"properties":{"id":"24660736","dp":22776,"de":0}},{"type":"Polygon","arcs":[[981,-979,-981]],"properties":{"id":"24660737","dp":21798,"de":1419}},{"type":"Polygon","arcs":[[982,983,984,-982,-980,-971,-968,-965,-963,-961,985,986,987]],"properties":{"id":"24660738","dp":8438,"de":1526}},{"type":"Polygon","arcs":[[988,989,990,991,992,-983,993]],"properties":{"id":"24660741","dp":26512,"de":3914}},{"type":"Polygon","arcs":[[994,995,-991]],"properties":{"id":"24660742","dp":14478,"de":0}},{"type":"Polygon","arcs":[[996,997,998,999,1000,-995,-990]],"properties":{"id":"24660743","dp":5183,"de":0}},{"type":"Polygon","arcs":[[1001,1002,1003]],"properties":{"id":"24661234","dp":9777,"de":0}},{"type":"Polygon","arcs":[[1004,1005,1006]],"properties":{"id":"24661237","dp":5723,"de":0}},{"type":"Polygon","arcs":[[1007,1008,1009,1010,1011,1012,1013]],"properties":{"id":"24661240","dp":3181,"de":8764}},{"type":"Polygon","arcs":[[-1013,1014]],"properties":{"id":"24661241","dp":7276,"de":0}},{"type":"Polygon","arcs":[[1015,-862,-864,-142,-146,1016]],"properties":{"id":"24660752","dp":4836,"de":653}},{"type":"Polygon","arcs":[[1017,1018,-1017,1019,1020]],"properties":{"id":"24660753","dp":4845,"de":1452}},{"type":"Polygon","arcs":[[1021,-1020,-145,1022,1023,-976]],"properties":{"id":"24660754","dp":6224,"de":1491}},{"type":"Polygon","arcs":[[1024,1025,-1021,-1022,-975,-985]],"properties":{"id":"24660755","dp":11419,"de":4481}},{"type":"Polygon","arcs":[[-977,-1024,1026,1027,-973]],"properties":{"id":"24660756","dp":7419,"de":1093}},{"type":"Polygon","arcs":[[-1023,-149,1028,-1027]],"properties":{"id":"24660757","dp":12898,"de":1759}},{"type":"Polygon","arcs":[[-1029,-151,-154,1029]],"properties":{"id":"24660758","dp":7137,"de":1982}},{"type":"Polygon","arcs":[[-974,-1028,-1030,-156,1030,-958]],"properties":{"id":"24660759","dp":5183,"de":3210}},{"type":"Polygon","arcs":[[-1031,-159,1031,-951]],"properties":{"id":"24660760","dp":7373,"de":3006}},{"type":"Polygon","arcs":[[-1032,-163,1032,-952]],"properties":{"id":"24660761","dp":8741,"de":2532}},{"type":"Polygon","arcs":[[-1033,-167,-169,-849,-953]],"properties":{"id":"24660762","dp":10111,"de":4306}},{"type":"Polygon","arcs":[[1033,1034,1035,-865]],"properties":{"id":"24660763","dp":10505,"de":0}},{"type":"Polygon","arcs":[[-1036,1036,1037,1038,-137,-144]],"properties":{"id":"24660764","dp":6917,"de":1820}},{"type":"Polygon","arcs":[[1039,1040,1041,1042,1043,-1037,-1035,1044]],"properties":{"id":"24660765","dp":12311,"de":6182}},{"type":"Polygon","arcs":[[-1044,1045,1046,-1038]],"properties":{"id":"24660766","dp":10347,"de":1544}},{"type":"Polygon","arcs":[[-1043,1047,1048,1049,1050,-1046]],"properties":{"id":"24660767","dp":4532,"de":0}},{"type":"Polygon","arcs":[[-1039,-1047,-1051,1051,1052,1053]],"properties":{"id":"24660768","dp":3583,"de":487}},{"type":"Polygon","arcs":[[-129,-138,-1054,1054,1055,1056]],"properties":{"id":"24660769","dp":4103,"de":612}},{"type":"Polygon","arcs":[[-130,-1057,1057,-121]],"properties":{"id":"24660770","dp":2805,"de":741}},{"type":"Polygon","arcs":[[-1058,-1056,1058,1059,1060,-108,-119,-122]],"properties":{"id":"24660771","dp":2493,"de":396}},{"type":"Polygon","arcs":[[-1061,1061,1062,-109]],"properties":{"id":"24660772","dp":9883,"de":773}},{"type":"Polygon","arcs":[[1063,1064,1065,-1062]],"properties":{"id":"24660773","dp":9652,"de":0}},{"type":"Polygon","arcs":[[-1066,1066,1067,1068]],"properties":{"id":"24660774","dp":15219,"de":1732}},{"type":"Polygon","arcs":[[1069,-1068,1070,1071,1072,1073,1074]],"properties":{"id":"24660775","dp":8818,"de":2140}},{"type":"Polygon","arcs":[[-1075,1075,1076,1077,1078]],"properties":{"id":"24660776","dp":9580,"de":1881}},{"type":"Polygon","arcs":[[-1074,1079,1080,-1076]],"properties":{"id":"24660777","dp":8269,"de":2884}},{"type":"Polygon","arcs":[[1081,-1079,1082,-693]],"properties":{"id":"24660778","dp":11621,"de":4223}},{"type":"Polygon","arcs":[[1083,1084,1085,1086,1087,1088,1089,1090,1091,1092]],"properties":{"id":"24661262","dp":10544,"de":11245}},{"type":"Polygon","arcs":[[-1093,1093,1094]],"properties":{"id":"24661263","dp":10688,"de":0}},{"type":"Polygon","arcs":[[-1092,1095,-1094]],"properties":{"id":"24661264","dp":14722,"de":599}},{"type":"Polygon","arcs":[[1096,1097,1098,1099,1100,-949,1101,1102,1103,1104,1105,1106]],"properties":{"id":"24662550","dp":5727,"de":546}},{"type":"Polygon","arcs":[[-1101,1107,1108,1109,-947]],"properties":{"id":"24662551","dp":8291,"de":0}},{"type":"Polygon","arcs":[[-1100,1110,1111,-1108]],"properties":{"id":"24662552","dp":10076,"de":0}},{"type":"Polygon","arcs":[[-1109,-1112,1112,1113,1114]],"properties":{"id":"24662553","dp":4893,"de":0}},{"type":"Polygon","arcs":[[1115,1116,-1113,-1111,-1099]],"properties":{"id":"24662554","dp":10898,"de":0}},{"type":"Polygon","arcs":[[-1114,-1117,1117,1118,1119]],"properties":{"id":"24662555","dp":9113,"de":0}},{"type":"Polygon","arcs":[[1120,1121,1122,1123,1124,1125,1126,1127,1128,1129]],"properties":{"id":"24662948","dp":453,"de":63}},{"type":"Polygon","arcs":[[1130,1131,1132,-1123,1133,1134]],"properties":{"id":"24662949","dp":1624,"de":1021}},{"type":"MultiPolygon","arcs":[[[1135,1136,1137,-1129,1138,1139,1140]],[[1141]]],"properties":{"id":"24662951","dp":1327,"de":0}},{"type":"Polygon","arcs":[[1142,1143,1144,1145,1146,1147]],"properties":{"id":"24662952","dp":4083,"de":0}},{"type":"Polygon","arcs":[[1148,1149,-1148,1150,1151,-430]],"properties":{"id":"24662953","dp":1585,"de":954}},{"type":"Polygon","arcs":[[-436,1152,1153,-1149,-429]],"properties":{"id":"24662954","dp":4192,"de":0}},{"type":"Polygon","arcs":[[1154,1155,-1154,1156]],"properties":{"id":"24662955","dp":6779,"de":0}},{"type":"Polygon","arcs":[[-1157,-1153,-458,1157]],"properties":{"id":"24662956","dp":4753,"de":0}},{"type":"Polygon","arcs":[[1158,1159,-1155,-1158,-457,-466]],"properties":{"id":"24662957","dp":4014,"de":0}},{"type":"Polygon","arcs":[[-1010,1160,1161,1162,1163,1164,1165,1166]],"properties":{"id":"24661224","dp":3673,"de":543}},{"type":"Polygon","arcs":[[-1163,1167]],"properties":{"id":"24661225","dp":8734,"de":4430}},{"type":"Polygon","arcs":[[1168,1169,-1164,-1168,-1162,1170]],"properties":{"id":"24661226","dp":6306,"de":1749}},{"type":"Polygon","arcs":[[1171,-1171,-1161,-1009]],"properties":{"id":"24661227","dp":7016,"de":665}},{"type":"Polygon","arcs":[[1172,1173,1174,-1169,-1172]],"properties":{"id":"24661228","dp":5756,"de":1204}},{"type":"Polygon","arcs":[[-1006,1175,-1003,1176,-1173,-1008]],"properties":{"id":"24661229","dp":12388,"de":530}},{"type":"Polygon","arcs":[[-1177,1177,1178,1179,1180,-1174]],"properties":{"id":"24661230","dp":5897,"de":482}},{"type":"Polygon","arcs":[[-1165,-1170,-1175,-1181]],"properties":{"id":"24661231","dp":5275,"de":0}},{"type":"Polygon","arcs":[[1181,1182,-1179,1183]],"properties":{"id":"24661232","dp":9961,"de":1413}},{"type":"Polygon","arcs":[[-1184,-1178,-1002,1184]],"properties":{"id":"24661233","dp":8900,"de":955}},{"type":"MultiPolygon","arcs":[[[1185,-821,1186,1187,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200]],[[1201,1202]]],"properties":{"id":"24661242","dp":258,"de":753}},{"type":"Polygon","arcs":[[1203,1204,-1193]],"properties":{"id":"24661243","dp":11314,"de":11896}},{"type":"Polygon","arcs":[[1205,1206,1207,-1194,-1205]],"properties":{"id":"24661244","dp":15228,"de":1428}},{"type":"Polygon","arcs":[[1208,-1084,-1095,-1096,-1091,1209,1210,1211]],"properties":{"id":"24661265","dp":4266,"de":28208}},{"type":"Polygon","arcs":[[1212,1213,1214,1215,1216,1217,1218]],"properties":{"id":"24660302","dp":1865,"de":2736}},{"type":"Polygon","arcs":[[1219,1220,1221,1222,-1213,1223]],"properties":{"id":"24660303","dp":3634,"de":3670}},{"type":"Polygon","arcs":[[1224,-1195,-1208]],"properties":{"id":"24661245","dp":9284,"de":994}},{"type":"Polygon","arcs":[[1225,-1196,-1225,-1207,1226]],"properties":{"id":"24661246","dp":11670,"de":1002}},{"type":"Polygon","arcs":[[1227,-1227,-1206,-1204,1228]],"properties":{"id":"24661247","dp":12923,"de":2769}},{"type":"Polygon","arcs":[[1229,-1229,-1192]],"properties":{"id":"24661248","dp":9450,"de":2094}},{"type":"Polygon","arcs":[[-1191,1230,1231,1232,-1228,-1230]],"properties":{"id":"24661249","dp":10381,"de":2359}},{"type":"Polygon","arcs":[[1233,1234,1235,1236,-1197,-1226,-1233]],"properties":{"id":"24661250","dp":9612,"de":862}},{"type":"Polygon","arcs":[[1237,1238,-1198,-1237]],"properties":{"id":"24661251","dp":12371,"de":1482}},{"type":"Polygon","arcs":[[-1239,1239,1240,1241,1242,1243,-1199]],"properties":{"id":"24661252","dp":4372,"de":11270}},{"type":"Polygon","arcs":[[1244,1245,1246]],"properties":{"id":"24661255","dp":8291,"de":32020}},{"type":"Polygon","arcs":[[-1247,1247,1248,1249,1250,1251,1252]],"properties":{"id":"24661256","dp":4213,"de":74639}},{"type":"Polygon","arcs":[[1253,-1252,1254,1255,1256]],"properties":{"id":"24661257","dp":4213,"de":39480}},{"type":"Polygon","arcs":[[1257,1258,1259,-1255]],"properties":{"id":"24661258","dp":5163,"de":5655}},{"type":"Polygon","arcs":[[-1260,1260,1261,1262,-1256]],"properties":{"id":"24661259","dp":3602,"de":49947}},{"type":"Polygon","arcs":[[1263,-1085,1264,-1261,-1259]],"properties":{"id":"24661260","dp":15390,"de":21335}},{"type":"Polygon","arcs":[[-1265,-1209,1265,-1262]],"properties":{"id":"24661261","dp":13935,"de":18783}},{"type":"Polygon","arcs":[[1266,1267,1268,1269,1270]],"properties":{"id":"24661269","dp":10143,"de":15503}},{"type":"Polygon","arcs":[[1271,1272,1273,-1268,1274]],"properties":{"id":"24661270","dp":25177,"de":24703}},{"type":"Polygon","arcs":[[1275,-1275,-1267,1276]],"properties":{"id":"24661271","dp":23439,"de":12698}},{"type":"Polygon","arcs":[[1277,1278,1279,-1272,-1276,1280]],"properties":{"id":"24661272","dp":23659,"de":14245}},{"type":"Polygon","arcs":[[1281,1282,-1279]],"properties":{"id":"24661273","dp":34525,"de":28212}},{"type":"Polygon","arcs":[[1283,1284,1285,1286,1287]],"properties":{"id":"24661276","dp":32985,"de":4228}},{"type":"Polygon","arcs":[[1288,1289,1290,-1285,1291,1292,1293]],"properties":{"id":"24661277","dp":19180,"de":1803}},{"type":"Polygon","arcs":[[1294,1295,1296,-1290,1297,1298]],"properties":{"id":"24661278","dp":19310,"de":3918}},{"type":"Polygon","arcs":[[-1298,-1289,1299]],"properties":{"id":"24661279","dp":23975,"de":0}},{"type":"Polygon","arcs":[[1300,-1300,1301,1302]],"properties":{"id":"24661280","dp":30720,"de":11261}},{"type":"Polygon","arcs":[[1303,-1302,-1294,1304]],"properties":{"id":"24661281","dp":39278,"de":6443}},{"type":"Polygon","arcs":[[1305,-1305,-1293,1306,-1278]],"properties":{"id":"24661282","dp":20572,"de":14583}},{"type":"Polygon","arcs":[[-1250,1307,1308,1309,1310,1311,-1303,-1304,-1306,1312,1313]],"properties":{"id":"24661283","dp":3006,"de":135078}},{"type":"Polygon","arcs":[[1314,1315,-1299,-1301,-1312]],"properties":{"id":"24661284","dp":5856,"de":10763}},{"type":"Polygon","arcs":[[-1316,1316,1317,-1295]],"properties":{"id":"24661285","dp":31428,"de":2747}},{"type":"Polygon","arcs":[[1318,1319,-1296,-1318]],"properties":{"id":"24661286","dp":19859,"de":4205}},{"type":"Polygon","arcs":[[1320,1321,1322,1323,1324,1325,1326,1327,1328,1329]],"properties":{"id":"24661299","dp":1509,"de":12065}},{"type":"Polygon","arcs":[[1330,1331,1332,-1327]],"properties":{"id":"24661300","dp":12480,"de":0}},{"type":"Polygon","arcs":[[1333,1334,1335,1336,-1331,-1326]],"properties":{"id":"24661301","dp":9872,"de":3200}},{"type":"Polygon","arcs":[[-1337,1337,1338,1339,-1332]],"properties":{"id":"24661302","dp":7579,"de":1460}},{"type":"Polygon","arcs":[[-1338,-1336,1340,1341,1342]],"properties":{"id":"24661303","dp":7226,"de":2176}},{"type":"Polygon","arcs":[[1343,1344,1345,-1342]],"properties":{"id":"24661304","dp":6115,"de":1652}},{"type":"Polygon","arcs":[[1346,-1345,1347,1348]],"properties":{"id":"24661305","dp":11550,"de":7219}},{"type":"Polygon","arcs":[[-1349,1349,1350,1351]],"properties":{"id":"24661306","dp":33834,"de":0}},{"type":"Polygon","arcs":[[1352,1353,-1351]],"properties":{"id":"24661308","dp":20664,"de":0}},{"type":"Polygon","arcs":[[-1350,-1348,1354,1355,1356,1357,-1353]],"properties":{"id":"24661309","dp":4461,"de":8568}},{"type":"Polygon","arcs":[[1358,1359,-1358]],"properties":{"id":"24661310","dp":20965,"de":0}},{"type":"Polygon","arcs":[[1360,1361,1362,1363,1364,1365]],"properties":{"id":"24660395","dp":10242,"de":0}},{"type":"Polygon","arcs":[[1366,1367,1368,1369,1370,-1363]],"properties":{"id":"24660396","dp":10130,"de":0}},{"type":"Polygon","arcs":[[-1366,1371,1372]],"properties":{"id":"24660397","dp":11880,"de":0}},{"type":"Polygon","arcs":[[1373,1374,-1361,-1373,1375,1376,1377,1378,1379,1380,1381]],"properties":{"id":"24660398","dp":3646,"de":2889}},{"type":"Polygon","arcs":[[1382,1383,1384,1385,1386]],"properties":{"id":"24660335","dp":6886,"de":2422}},{"type":"Polygon","arcs":[[1387,1388,1389,1390,1391,1392,-391]],"properties":{"id":"24662081","dp":10320,"de":2533}},{"type":"Polygon","arcs":[[1393,1394,1395,1396,1397]],"properties":{"id":"24660194","dp":6417,"de":1819}},{"type":"Polygon","arcs":[[1398,1399,1400]],"properties":{"id":"24660195","dp":6399,"de":2060}},{"type":"Polygon","arcs":[[1401,1402,1403,1404,-1395,1405,1406]],"properties":{"id":"24660196","dp":6960,"de":1062}},{"type":"Polygon","arcs":[[1407,1408,1409,-1403,1410]],"properties":{"id":"24660197","dp":8815,"de":877}},{"type":"Polygon","arcs":[[1411,1412,1413,-1408,1414,1415,1416]],"properties":{"id":"24660198","dp":5286,"de":423}},{"type":"Polygon","arcs":[[1417,1418,1419,1420,1421,1422,-1409,-1414,1423]],"properties":{"id":"24660199","dp":2222,"de":4573}},{"type":"Polygon","arcs":[[1424,1425,1426,1427,1428,-1214,-1223]],"properties":{"id":"24660304","dp":7336,"de":2680}},{"type":"Polygon","arcs":[[1429,1430,1431,-1425,-1222]],"properties":{"id":"24660305","dp":14721,"de":0}},{"type":"Polygon","arcs":[[1432,1433,-1426,-1432]],"properties":{"id":"24660306","dp":14441,"de":0}},{"type":"Polygon","arcs":[[1434,1435,-1427,-1434]],"properties":{"id":"24660307","dp":13449,"de":0}},{"type":"Polygon","arcs":[[-392,-1393,1436,1437]],"properties":{"id":"24662082","dp":32198,"de":0}},{"type":"Polygon","arcs":[[-393,-1438,1438]],"properties":{"id":"24662083","dp":16061,"de":0}},{"type":"Polygon","arcs":[[-1439,-1437,-1392,1439,1440,1441,1442,1443,-394]],"properties":{"id":"24662084","dp":3544,"de":786}},{"type":"Polygon","arcs":[[-1444,1444,1445,-395]],"properties":{"id":"24662085","dp":9063,"de":550}},{"type":"Polygon","arcs":[[1446,-1446,1447,1448,1449]],"properties":{"id":"24662086","dp":9446,"de":2551}},{"type":"Polygon","arcs":[[1450,1451,1452,1453,1454]],"properties":{"id":"24662087","dp":21285,"de":2428}},{"type":"Polygon","arcs":[[1455,1456,-1452,1457]],"properties":{"id":"24662088","dp":19668,"de":0}},{"type":"Polygon","arcs":[[1458,1459,1460,1461,1462,1463,1464,1465,1466,-1453,-1457,1467,1468,1469]],"properties":{"id":"24662089","dp":3893,"de":3973}},{"type":"Polygon","arcs":[[1470,1471,1472,1473,-1461]],"properties":{"id":"24662090","dp":7603,"de":1143}},{"type":"Polygon","arcs":[[1474,1475,-1471,-1460,1476,1477,1478]],"properties":{"id":"24662091","dp":4567,"de":2314}},{"type":"Polygon","arcs":[[1479,-1479,1480,1481,1482]],"properties":{"id":"24662092","dp":16334,"de":0}},{"type":"Polygon","arcs":[[1483,-1483,1484,1485]],"properties":{"id":"24662093","dp":17883,"de":0}},{"type":"Polygon","arcs":[[1486,1487,1488,1489,-1480,-1484]],"properties":{"id":"24662094","dp":16941,"de":0}},{"type":"Polygon","arcs":[[1490,1491,1492,1493]],"properties":{"id":"24662095","dp":10494,"de":3268}},{"type":"Polygon","arcs":[[1494,1495,1496,-1491,1497]],"properties":{"id":"24662096","dp":11922,"de":2375}},{"type":"Polygon","arcs":[[1498,1499,1500,-1496,1501]],"properties":{"id":"24662097","dp":14433,"de":1889}},{"type":"Polygon","arcs":[[1502,1503,1504]],"properties":{"id":"24662425","dp":2648,"de":227}},{"type":"Polygon","arcs":[[1505,1506,1507,1508,1509,-1505,1510,1511,1512]],"properties":{"id":"24662426","dp":2375,"de":642}},{"type":"Polygon","arcs":[[1513,1514,-1507,1515,1516]],"properties":{"id":"24662427","dp":2989,"de":0}},{"type":"Polygon","arcs":[[1517,-1516,-1506,1518]],"properties":{"id":"24662428","dp":3507,"de":0}},{"type":"Polygon","arcs":[[1519,1520,-1517,-1518]],"properties":{"id":"24662429","dp":2811,"de":0}},{"type":"Polygon","arcs":[[1521,1522,-1514,-1521,1523,1524]],"properties":{"id":"24662430","dp":3947,"de":3220}},{"type":"Polygon","arcs":[[1525,1526,-1525]],"properties":{"id":"24662431","dp":3490,"de":0}},{"type":"Polygon","arcs":[[1527,1528,1529,-1522,-1527,1530,1531,1532]],"properties":{"id":"24662432","dp":60,"de":3143}},{"type":"Polygon","arcs":[[1533,1534,1535,1536]],"properties":{"id":"24661691","dp":10052,"de":0}},{"type":"Polygon","arcs":[[1537,1538,1539,-1535]],"properties":{"id":"24661692","dp":12677,"de":1036}},{"type":"Polygon","arcs":[[1540,1541,1542,1543,1544,1545]],"properties":{"id":"24660275","dp":14750,"de":4621}},{"type":"Polygon","arcs":[[1546,1547,1548,1549,1550,1551]],"properties":{"id":"24660276","dp":4398,"de":1077}},{"type":"Polygon","arcs":[[1552,1553,-1549]],"properties":{"id":"24660277","dp":7535,"de":991}},{"type":"Polygon","arcs":[[-1548,1554,1555,1556,1557,-1553]],"properties":{"id":"24660278","dp":3608,"de":0}},{"type":"Polygon","arcs":[[1558,1559,-1557,1560,1561]],"properties":{"id":"24660279","dp":4084,"de":0}},{"type":"Polygon","arcs":[[-1561,-1556,1562,1563,1564,1565,1566,1567]],"properties":{"id":"24660280","dp":3697,"de":0}},{"type":"Polygon","arcs":[[1568,-1562,-1568,1569,1570]],"properties":{"id":"24660281","dp":6639,"de":3983}},{"type":"Polygon","arcs":[[-1571,-1430,-1221,1571,1572]],"properties":{"id":"24660282","dp":15441,"de":0}},{"type":"Polygon","arcs":[[-1559,-1569,-1573,1573,1574,1575]],"properties":{"id":"24660283","dp":8896,"de":2252}},{"type":"Polygon","arcs":[[-1574,-1572,-1220,1576,1577]],"properties":{"id":"24660284","dp":12043,"de":0}},{"type":"Polygon","arcs":[[-1575,-1578,1578,1579,1580]],"properties":{"id":"24660285","dp":12352,"de":1069}},{"type":"Polygon","arcs":[[1581,1582,-1580,1583]],"properties":{"id":"24660286","dp":11359,"de":0}},{"type":"Polygon","arcs":[[1584,1585,-1582,1586]],"properties":{"id":"24660287","dp":11125,"de":0}},{"type":"Polygon","arcs":[[-1550,-1554,-1558,-1560,-1576,-1581,-1583,-1586,1587]],"properties":{"id":"24660288","dp":2997,"de":572}},{"type":"Polygon","arcs":[[-1551,-1588,-1585,1588,1589]],"properties":{"id":"24660289","dp":4436,"de":3209}},{"type":"Polygon","arcs":[[-1589,-1587,-1584,-1579,-1577,-1224,-1219,1590,1591,1592,1593,1594]],"properties":{"id":"24660290","dp":881,"de":5260}},{"type":"Polygon","arcs":[[1595,1596,1597,-1593]],"properties":{"id":"24660291","dp":13029,"de":0}},{"type":"Polygon","arcs":[[-1597,1598,1599,1600,1601]],"properties":{"id":"24660292","dp":14340,"de":3085}},{"type":"Polygon","arcs":[[-1599,-1596,-1592,1602,1603]],"properties":{"id":"24660293","dp":9424,"de":0}},{"type":"Polygon","arcs":[[-1604,1604,1605,1606,1607,-1600]],"properties":{"id":"24660294","dp":7266,"de":0}},{"type":"Polygon","arcs":[[-1601,-1608,1608,1609,1610]],"properties":{"id":"24660295","dp":10255,"de":0}},{"type":"Polygon","arcs":[[-1607,1611,1612,1613,1614,-1609]],"properties":{"id":"24660296","dp":10027,"de":1426}},{"type":"Polygon","arcs":[[-1614,1615,1616]],"properties":{"id":"24660297","dp":8167,"de":0}},{"type":"Polygon","arcs":[[-1613,1617,1618,-1616]],"properties":{"id":"24660298","dp":6766,"de":0}},{"type":"Polygon","arcs":[[1619,1620,1621,-1618,-1612,-1606]],"properties":{"id":"24660299","dp":8714,"de":2254}},{"type":"Polygon","arcs":[[-1603,-1591,-1218,1622,-1620,-1605]],"properties":{"id":"24660300","dp":4604,"de":0}},{"type":"Polygon","arcs":[[-1217,1623,1624,1625,1626,-1621,-1623]],"properties":{"id":"24660301","dp":1470,"de":1672}},{"type":"Polygon","arcs":[[1627,1628,1629,-1428,-1436,1630]],"properties":{"id":"24660308","dp":11556,"de":0}},{"type":"Polygon","arcs":[[1631,1632,-1628,1633]],"properties":{"id":"24660309","dp":7460,"de":0}},{"type":"Polygon","arcs":[[1634,1635,1636,-1632]],"properties":{"id":"24660310","dp":14345,"de":0}},{"type":"Polygon","arcs":[[1637,1638,1639,1640,-1636,1641]],"properties":{"id":"24660311","dp":13577,"de":0}},{"type":"Polygon","arcs":[[1642,-1639]],"properties":{"id":"24660312","dp":11893,"de":0}},{"type":"Polygon","arcs":[[1643,1644,1645,1646,-1640,-1643,-1638]],"properties":{"id":"24660313","dp":4276,"de":3872}},{"type":"Polygon","arcs":[[1647,1648,1649,1650,1651,-1646,1652]],"properties":{"id":"24660314","dp":1610,"de":1587}},{"type":"Polygon","arcs":[[1653,1654,-1649,1655]],"properties":{"id":"24660315","dp":4853,"de":0}},{"type":"Polygon","arcs":[[1656,-1654,1657]],"properties":{"id":"24660316","dp":10881,"de":0}},{"type":"Polygon","arcs":[[1658,1659,1660]],"properties":{"id":"24660319","dp":15719,"de":0}},{"type":"Polygon","arcs":[[1661,1662,1663,-1659,1664]],"properties":{"id":"24660320","dp":17446,"de":0}},{"type":"Polygon","arcs":[[1665,-1665,1666,1667]],"properties":{"id":"24660321","dp":14506,"de":0}},{"type":"Polygon","arcs":[[1668,-1662,-1666,1669]],"properties":{"id":"24660322","dp":15473,"de":0}},{"type":"Polygon","arcs":[[1670,1671,1672,1673,-1663,-1669]],"properties":{"id":"24660323","dp":9120,"de":0}},{"type":"Polygon","arcs":[[1674,1675,1676,-1672]],"properties":{"id":"24660324","dp":14019,"de":1331}},{"type":"Polygon","arcs":[[-1673,-1677,1677,1678,1679]],"properties":{"id":"24660325","dp":18655,"de":0}},{"type":"Polygon","arcs":[[1680,-1679,1681,1682]],"properties":{"id":"24660326","dp":13955,"de":0}},{"type":"Polygon","arcs":[[1683,-1683,1684]],"properties":{"id":"24660327","dp":14862,"de":0}},{"type":"Polygon","arcs":[[1685,1686,1687,1688,-1685,-1682,1689]],"properties":{"id":"24660328","dp":15552,"de":1036}},{"type":"Polygon","arcs":[[1690,1691,1692,1693,-1688]],"properties":{"id":"24660329","dp":20916,"de":0}},{"type":"Polygon","arcs":[[1694,1695,1696,-1692,1697,1698]],"properties":{"id":"24660330","dp":15639,"de":1044}},{"type":"Polygon","arcs":[[1699,1700,-1696]],"properties":{"id":"24660331","dp":23619,"de":2941}},{"type":"Polygon","arcs":[[-1701,1701,1702,1703]],"properties":{"id":"24660332","dp":12557,"de":0}},{"type":"Polygon","arcs":[[-1703,1704,1705,1706]],"properties":{"id":"24660333","dp":26931,"de":0}},{"type":"Polygon","arcs":[[-1704,-1707,-1384,1707,-1693,-1697]],"properties":{"id":"24660334","dp":17231,"de":1612}},{"type":"Polygon","arcs":[[1708,1709,1710,1711,1712]],"properties":{"id":"24660840","dp":7241,"de":1239}},{"type":"Polygon","arcs":[[1713,-1712,1714,1715,1716]],"properties":{"id":"24660841","dp":11728,"de":793}},{"type":"Polygon","arcs":[[-1715,-1711,1717,1718,1719,1720]],"properties":{"id":"24660842","dp":15317,"de":2705}},{"type":"Polygon","arcs":[[1721,1722,1723,1724,1725]],"properties":{"id":"24660216","dp":12738,"de":0}},{"type":"Polygon","arcs":[[1726,1727,1728,-1723,1729]],"properties":{"id":"24660217","dp":20416,"de":3472}},{"type":"Polygon","arcs":[[1730,-1543,1731,-1728]],"properties":{"id":"24660218","dp":6618,"de":948}},{"type":"Polygon","arcs":[[-1544,-1731,-1727,1732,1733]],"properties":{"id":"24660219","dp":9982,"de":1158}},{"type":"Polygon","arcs":[[-1540,1734,1735]],"properties":{"id":"24661693","dp":10767,"de":0}},{"type":"Polygon","arcs":[[-1735,1736,1737,1738,1739,1740,1741]],"properties":{"id":"24661694","dp":4665,"de":18681}},{"type":"Polygon","arcs":[[-1740,1742,1743,1744]],"properties":{"id":"24661695","dp":10363,"de":0}},{"type":"Polygon","arcs":[[1745,-1741,-1745,1746,1747,1748,1749]],"properties":{"id":"24661696","dp":10017,"de":853}},{"type":"Polygon","arcs":[[1750,1751,-1747,-1744,1752,1753]],"properties":{"id":"24661697","dp":18777,"de":783}},{"type":"Polygon","arcs":[[-1748,-1752,1754,1755,1756]],"properties":{"id":"24661698","dp":9695,"de":0}},{"type":"Polygon","arcs":[[-1755,-1751,1757,1758,1759]],"properties":{"id":"24661699","dp":10851,"de":0}},{"type":"Polygon","arcs":[[-1754,1760,1761,1762,1763,1764,1765,-1758]],"properties":{"id":"24661700","dp":5499,"de":550}},{"type":"Polygon","arcs":[[1766,-1756,-1760,1767,1768,1769]],"properties":{"id":"24661701","dp":6071,"de":0}},{"type":"Polygon","arcs":[[1770,-1768]],"properties":{"id":"24661702","dp":12620,"de":0}},{"type":"MultiPolygon","arcs":[[[1771,1772,1773,1774,1775,1776,1777,1778,1779]],[[1780,1781]],[[1782,1783]],[[1784,1785]]],"properties":{"id":"24662193","dp":2677,"de":1628}},{"type":"Polygon","arcs":[[1786,1787,1788,1789,1790,-1776]],"properties":{"id":"24662194","dp":11546,"de":1251}},{"type":"Polygon","arcs":[[-1777,-1791,1791]],"properties":{"id":"24662195","dp":9233,"de":0}},{"type":"Polygon","arcs":[[1792,1793,-1789]],"properties":{"id":"24662196","dp":9212,"de":0}},{"type":"Polygon","arcs":[[1794,1795,1796,1797,-1790,-1794]],"properties":{"id":"24662197","dp":5282,"de":1479}},{"type":"Polygon","arcs":[[-1795,1798,1799,1800]],"properties":{"id":"24662198","dp":9160,"de":839}},{"type":"Polygon","arcs":[[1801,1802,1803,1804,1805,-1801]],"properties":{"id":"24662199","dp":11124,"de":1282}},{"type":"Polygon","arcs":[[1806,1807,1808,-1802]],"properties":{"id":"24662200","dp":26084,"de":0}},{"type":"Polygon","arcs":[[-1809,1809,1810,-1803]],"properties":{"id":"24662201","dp":18007,"de":0}},{"type":"Polygon","arcs":[[1811,1812,-1804,-1811]],"properties":{"id":"24662202","dp":14267,"de":0}},{"type":"Polygon","arcs":[[-1812,-1810,-1808,1813,1814,1815,1816]],"properties":{"id":"24662203","dp":16359,"de":963}},{"type":"Polygon","arcs":[[-1800,1817,-1814,-1807]],"properties":{"id":"24662204","dp":48198,"de":0}},{"type":"Polygon","arcs":[[1818,-1805,-1813,-1817,1819,1820],[1821]],"properties":{"id":"24662205","dp":7167,"de":0}},{"type":"Polygon","arcs":[[-1822]],"properties":{"id":"24662206","dp":8176,"de":828}},{"type":"Polygon","arcs":[[1822,-1385,-1706]],"properties":{"id":"24660336","dp":24911,"de":0}},{"type":"Polygon","arcs":[[1823,1824,1825,1826,1827,1828,1829,-1386,-1823,-1705,1830]],"properties":{"id":"24660337","dp":1429,"de":714}},{"type":"Polygon","arcs":[[1831,1832,-1824,1833]],"properties":{"id":"24660338","dp":26878,"de":0}},{"type":"Polygon","arcs":[[-1825,-1833,1834]],"properties":{"id":"24660339","dp":24393,"de":0}},{"type":"Polygon","arcs":[[-1826,-1835,-1832,1835,1836]],"properties":{"id":"24660340","dp":5519,"de":0}},{"type":"Polygon","arcs":[[-1836,1837,1838]],"properties":{"id":"24660341","dp":20785,"de":0}},{"type":"Polygon","arcs":[[1839,-1837,-1839,1840]],"properties":{"id":"24660342","dp":15495,"de":0}},{"type":"Polygon","arcs":[[-1840,1841,1842,1843,1844,1845,-1827]],"properties":{"id":"24660343","dp":7521,"de":2920}},{"type":"Polygon","arcs":[[-1841,1846,1847,1848,-1842]],"properties":{"id":"24660344","dp":21048,"de":0}},{"type":"Polygon","arcs":[[1849,-1843,-1849,1850,1851,1852,1853]],"properties":{"id":"24660345","dp":17427,"de":2624}},{"type":"Polygon","arcs":[[1854,1855,-1844,-1850,1856]],"properties":{"id":"24660346","dp":17276,"de":0}},{"type":"Polygon","arcs":[[1857,1858,-1855,1859]],"properties":{"id":"24660347","dp":14938,"de":2006}},{"type":"Polygon","arcs":[[-1860,-1857,1860,1861]],"properties":{"id":"24660348","dp":4517,"de":3622}},{"type":"Polygon","arcs":[[1862,1863,-1861,-1854,1864,1865,1866]],"properties":{"id":"24660349","dp":10616,"de":2312}},{"type":"Polygon","arcs":[[-1853,1867,1868,-1865]],"properties":{"id":"24660350","dp":29850,"de":2500}},{"type":"Polygon","arcs":[[-1852,1869,1870,-1868]],"properties":{"id":"24660351","dp":26300,"de":0}},{"type":"Polygon","arcs":[[-1870,1871]],"properties":{"id":"24660352","dp":26515,"de":0}},{"type":"Polygon","arcs":[[1872,1873,1874,-1871,-1872,-1851,-1848,1875,1876,1877,1878,1879,1880,1881]],"properties":{"id":"24660353","dp":504,"de":4974}},{"type":"Polygon","arcs":[[-1875,1882,-1866,-1869]],"properties":{"id":"24660354","dp":21788,"de":0}},{"type":"Polygon","arcs":[[1883,1884,1885,1886,-1867,-1883,-1874]],"properties":{"id":"24660355","dp":5610,"de":5052}},{"type":"Polygon","arcs":[[1887,1888,-1863,-1887,1889]],"properties":{"id":"24660356","dp":10344,"de":0}},{"type":"Polygon","arcs":[[1890,-1890,-1886,1891]],"properties":{"id":"24660357","dp":10936,"de":2224}},{"type":"Polygon","arcs":[[1892,1893,-1888,-1891,1894]],"properties":{"id":"24660358","dp":4829,"de":3930}},{"type":"Polygon","arcs":[[1895,1896,1897,1898,-1895,-1892,1899]],"properties":{"id":"24660359","dp":5068,"de":5425}},{"type":"Polygon","arcs":[[-1900,-1885,1900,1901]],"properties":{"id":"24660360","dp":9188,"de":4752}},{"type":"Polygon","arcs":[[1902,1903,-1896,-1902,1904,1905]],"properties":{"id":"24660361","dp":8870,"de":2419}},{"type":"Polygon","arcs":[[-1905,-1901,-1884,-1873,1906,1907,1908]],"properties":{"id":"24660362","dp":5838,"de":1838}},{"type":"Polygon","arcs":[[1909,1910,-1908]],"properties":{"id":"24660363","dp":21333,"de":0}},{"type":"Polygon","arcs":[[1911,1912,1913,1914,1915,-997,-989]],"properties":{"id":"24660870","dp":2283,"de":3942}},{"type":"Polygon","arcs":[[-1413,1916,1917,1918,1919,-1424]],"properties":{"id":"24660200","dp":5940,"de":1495}},{"type":"Polygon","arcs":[[1920,-1418,-1920]],"properties":{"id":"24660201","dp":15261,"de":0}},{"type":"Polygon","arcs":[[-1919,1921,1922,-1419,-1921]],"properties":{"id":"24660202","dp":14923,"de":0}},{"type":"Polygon","arcs":[[-621,1923,-614,1924,1925,1926,1927,1928,1929,1930,1931,-1422,1932]],"properties":{"id":"24660203","dp":1500,"de":6992}},{"type":"Polygon","arcs":[[-615,-1924,-620]],"properties":{"id":"24660204","dp":12657,"de":4931}},{"type":"Polygon","arcs":[[1933,1934,1935,1936,1937,1938,1939,1940,1941,1942]],"properties":{"id":"24660812","dp":1273,"de":772}},{"type":"Polygon","arcs":[[1943,1944,-1926]],"properties":{"id":"24660205","dp":20945,"de":1879}},{"type":"Polygon","arcs":[[-607,-1944,-1925,-613]],"properties":{"id":"24660206","dp":15395,"de":0}},{"type":"Polygon","arcs":[[1945,1946,1947,1948,1949,-1928],[1950]],"properties":{"id":"24660207","dp":3459,"de":1886}},{"type":"Polygon","arcs":[[-1951]],"properties":{"id":"24660208","dp":10092,"de":15797}},{"type":"Polygon","arcs":[[1951,1952,-1769,-1771,-1759,-1766,1953,1954,1955,-1595,-1929,-1950]],"properties":{"id":"24660209","dp":919,"de":4717}},{"type":"Polygon","arcs":[[-1765,1956,1957,-1954]],"properties":{"id":"24660210","dp":12107,"de":924}},{"type":"Polygon","arcs":[[1958,1959,-1957,-1764]],"properties":{"id":"24660211","dp":11984,"de":0}},{"type":"Polygon","arcs":[[-1960,1960,-1726,1961]],"properties":{"id":"24660212","dp":17538,"de":0}},{"type":"Polygon","arcs":[[-1962,1962,1963,-1955,-1958]],"properties":{"id":"24660213","dp":10966,"de":5098}},{"type":"Polygon","arcs":[[-1725,1964,-1963]],"properties":{"id":"24660214","dp":16655,"de":0}},{"type":"Polygon","arcs":[[-1965,-1724,-1729,-1732,-1542,-1552,-1590,-1956,-1964]],"properties":{"id":"24660215","dp":2931,"de":6869}},{"type":"Polygon","arcs":[[1965,1966,1967,1968,1969,1970,1971,1972]],"properties":{"id":"24660710","dp":1058,"de":289}},{"type":"Polygon","arcs":[[1973,1974,1975,1976,-1966,1977,1978]],"properties":{"id":"24660711","dp":2449,"de":1123}},{"type":"Polygon","arcs":[[1979,1980,-1974,1981,1982]],"properties":{"id":"24660712","dp":3549,"de":827}},{"type":"Polygon","arcs":[[1983,-1975,-1981,1984]],"properties":{"id":"24660713","dp":5000,"de":1076}},{"type":"Polygon","arcs":[[-1980,1985,1986,-823,-827,1987,1988,-1985]],"properties":{"id":"24660714","dp":2684,"de":481}},{"type":"Polygon","arcs":[[1989,1990,-1716,-1721]],"properties":{"id":"24660843","dp":9278,"de":2295}},{"type":"Polygon","arcs":[[-857,-1990,1991,1992]],"properties":{"id":"24660844","dp":19828,"de":0}},{"type":"Polygon","arcs":[[-858,-1993,1993,1994]],"properties":{"id":"24660845","dp":19557,"de":0}},{"type":"Polygon","arcs":[[-1995,1995,-1045,-1034,-860]],"properties":{"id":"24660846","dp":9328,"de":629}},{"type":"Polygon","arcs":[[-1994,1996,1997,-1040,-1996]],"properties":{"id":"24660847","dp":15994,"de":1771}},{"type":"Polygon","arcs":[[-1992,-1720,1998,1999,-1997]],"properties":{"id":"24660848","dp":20817,"de":0}},{"type":"Polygon","arcs":[[-2000,2000,2001,2002,-1041,-1998]],"properties":{"id":"24660849","dp":12334,"de":0}},{"type":"Polygon","arcs":[[2003,2004,-2001,-1999,-1719]],"properties":{"id":"24660850","dp":8991,"de":0}},{"type":"Polygon","arcs":[[2005,-2002,-2005,2006,2007,-1049]],"properties":{"id":"24660851","dp":3291,"de":663}},{"type":"Polygon","arcs":[[-2003,-2006,-1048,-1042]],"properties":{"id":"24660852","dp":15593,"de":0}},{"type":"Polygon","arcs":[[2008,2009,2010,2011,-1733,-1730,2012]],"properties":{"id":"24660220","dp":15119,"de":3030}},{"type":"Polygon","arcs":[[2013,2014,-2010]],"properties":{"id":"24660221","dp":9971,"de":0}},{"type":"Polygon","arcs":[[-1959,-1763,2015,-2013,-1722,-1961]],"properties":{"id":"24660222","dp":7621,"de":4405}},{"type":"Polygon","arcs":[[-2014,-2009,-2016,-1762,2016]],"properties":{"id":"24660223","dp":12115,"de":0}},{"type":"Polygon","arcs":[[2017,-2011,-2015,-2017,-1761,-1753]],"properties":{"id":"24660224","dp":7843,"de":2973}},{"type":"Polygon","arcs":[[-1739,2018,2019,2020,-2012,-2018,-1743]],"properties":{"id":"24660225","dp":10223,"de":1807}},{"type":"Polygon","arcs":[[2021,2022,2023,-2019,-1738]],"properties":{"id":"24660226","dp":10194,"de":0}},{"type":"Polygon","arcs":[[2024,2025,2026,-1939,2027,2028,2029,2030,2031,-1821,2032,2033,-1533,2034]],"properties":{"id":"24662433","dp":75,"de":1528}},{"type":"Polygon","arcs":[[2035,-2025,2036,2037,2038,2039,2040,2041,2042]],"properties":{"id":"24662434","dp":383,"de":566}},{"type":"Polygon","arcs":[[2043,2044,2045,2046,2047,2048,2049,2050,-2038,2051,2052]],"properties":{"id":"24662435","dp":1157,"de":196}},{"type":"Polygon","arcs":[[-2049,2053,2054]],"properties":{"id":"24662436","dp":4584,"de":978}},{"type":"Polygon","arcs":[[2055,2056,-2046,2057]],"properties":{"id":"24662439","dp":12768,"de":2066}},{"type":"Polygon","arcs":[[2058,-2047,-2057]],"properties":{"id":"24662440","dp":8561,"de":499}},{"type":"Polygon","arcs":[[2059,2060]],"properties":{"id":"24662442","dp":12774,"de":0}},{"type":"Polygon","arcs":[[2061,2062,2063,2064,2065]],"properties":{"id":"24662871","dp":4619,"de":469}},{"type":"Polygon","arcs":[[-2064,2066,2067,2068,-867,2069]],"properties":{"id":"24662872","dp":2712,"de":0}},{"type":"Polygon","arcs":[[2070,2071,-2068,2072,2073]],"properties":{"id":"24662873","dp":8395,"de":0}},{"type":"Polygon","arcs":[[2074,2075,-2073,-2067,-2063,2076,2077,2078]],"properties":{"id":"24662874","dp":5198,"de":676}},{"type":"Polygon","arcs":[[-2076,2079,2080,-2074]],"properties":{"id":"24662875","dp":8431,"de":1984}},{"type":"Polygon","arcs":[[2081,2082,-2071,-2081]],"properties":{"id":"24662876","dp":8885,"de":0}},{"type":"Polygon","arcs":[[2083,2084,-2080,-2075,2085]],"properties":{"id":"24662877","dp":4231,"de":614}},{"type":"Polygon","arcs":[[2086,-2086,-2079,2087,2088]],"properties":{"id":"24662878","dp":5278,"de":946}},{"type":"Polygon","arcs":[[2089,-2089,2090,2091]],"properties":{"id":"24662879","dp":5059,"de":0}},{"type":"Polygon","arcs":[[2092,-2092,2093,2094]],"properties":{"id":"24662880","dp":6737,"de":652}},{"type":"Polygon","arcs":[[-2094,-2091,-2088,-2078,2095,2096,2097,2098]],"properties":{"id":"24662881","dp":2813,"de":530}},{"type":"Polygon","arcs":[[2099,2100,2101,-2097]],"properties":{"id":"24662882","dp":8525,"de":0}},{"type":"Polygon","arcs":[[-2077,-2062,-2100,-2096]],"properties":{"id":"24662883","dp":6157,"de":0}},{"type":"Polygon","arcs":[[2102,-1935,2103,2104,2105]],"properties":{"id":"24660813","dp":12857,"de":0}},{"type":"Polygon","arcs":[[2106,-2104,-1934,2107]],"properties":{"id":"24660814","dp":6033,"de":791}},{"type":"Polygon","arcs":[[2108,2109,-2105,-2107,2110]],"properties":{"id":"24660815","dp":9108,"de":713}},{"type":"Polygon","arcs":[[-2111,-2108,-1943,2111,2112]],"properties":{"id":"24660816","dp":7492,"de":1253}},{"type":"Polygon","arcs":[[2113,-2109,-2113,2114,2115,2116]],"properties":{"id":"24660818","dp":1261,"de":1526}},{"type":"Polygon","arcs":[[-1942,2117,2118,2119,-2112]],"properties":{"id":"24660820","dp":2735,"de":1490}},{"type":"Polygon","arcs":[[-2120,2120,2121,-2115]],"properties":{"id":"24660821","dp":2075,"de":785}},{"type":"Polygon","arcs":[[2122,2123,2124,-2121,2125,2126]],"properties":{"id":"24660822","dp":3376,"de":2525}},{"type":"Polygon","arcs":[[-2119,2127,2128,2129,-2126]],"properties":{"id":"24660823","dp":13409,"de":0}},{"type":"Polygon","arcs":[[-2129,2130,2131,2132,2133,-1913]],"properties":{"id":"24660824","dp":28392,"de":2572}},{"type":"Polygon","arcs":[[2134,2135,2136,-2133]],"properties":{"id":"24660825","dp":5644,"de":613}},{"type":"Polygon","arcs":[[2137,2138,-1914,-2134,-2137,2139]],"properties":{"id":"24660826","dp":2385,"de":6142}},{"type":"Polygon","arcs":[[2140,2141,2142,2143,2144,-2140,-2136]],"properties":{"id":"24660827","dp":4237,"de":437}},{"type":"Polygon","arcs":[[2145,2146,-2141,-2135,-2132]],"properties":{"id":"24660828","dp":4457,"de":344}},{"type":"Polygon","arcs":[[-2146,2147,2148,2149,2150,2151]],"properties":{"id":"24660829","dp":5890,"de":650}},{"type":"Polygon","arcs":[[2152,-2150,2153]],"properties":{"id":"24660830","dp":6060,"de":1155}},{"type":"Polygon","arcs":[[-2154,-2149,2154]],"properties":{"id":"24660832","dp":4675,"de":3640}},{"type":"Polygon","arcs":[[-2152,2155,2156,2157]],"properties":{"id":"24660833","dp":6296,"de":1171}},{"type":"Polygon","arcs":[[-2158,2158,2159,2160,-2142,-2147]],"properties":{"id":"24660834","dp":6118,"de":0}},{"type":"Polygon","arcs":[[2161,2162,2163,2164,-2159]],"properties":{"id":"24660835","dp":8983,"de":2354}},{"type":"Polygon","arcs":[[-2160,-2165,2165,2166,2167]],"properties":{"id":"24660836","dp":6957,"de":582}},{"type":"Polygon","arcs":[[-2161,-2168,2168,-2143]],"properties":{"id":"24660837","dp":6714,"de":513}},{"type":"Polygon","arcs":[[-2144,-2169,-2167,2169,-1709,2170]],"properties":{"id":"24660838","dp":5546,"de":0}},{"type":"Polygon","arcs":[[-2171,-1713,-1714,2171]],"properties":{"id":"24660839","dp":9049,"de":0}},{"type":"Polygon","arcs":[[-2004,-1718,-1710,-2170,-2166,2172,2173,2174,2175,2176,-2007]],"properties":{"id":"24660853","dp":2741,"de":2439}},{"type":"Polygon","arcs":[[-2175,2177,2178,2179,2180,2181,2182,-2176]],"properties":{"id":"24660854","dp":3216,"de":1037}},{"type":"Polygon","arcs":[[-2181,2183]],"properties":{"id":"24660855","dp":5005,"de":728}},{"type":"Polygon","arcs":[[-2174,2184,2185,2186,2187,2188,2189,2190,-2178,2174,-2175]],"properties":{"id":"24660856","dp":7421,"de":1732}},{"type":"Polygon","arcs":[[2191,2192,-2179,-2191]],"properties":{"id":"24660857","dp":4775,"de":374}},{"type":"Polygon","arcs":[[-2190,2193,2194,2195,-2192]],"properties":{"id":"24660858","dp":3480,"de":1312}},{"type":"Polygon","arcs":[[-2173,-2164,2196,2197,-2185]],"properties":{"id":"24660859","dp":11472,"de":0}},{"type":"Polygon","arcs":[[2198,2199,-2186,-2198]],"properties":{"id":"24660860","dp":40687,"de":3439}},{"type":"Polygon","arcs":[[-2187,-2200,2200,2201]],"properties":{"id":"24660861","dp":51902,"de":2989}},{"type":"Polygon","arcs":[[2202,-2188,-2202,2203,2204]],"properties":{"id":"24660862","dp":19757,"de":3238}},{"type":"Polygon","arcs":[[-2205,2205,2206,2207]],"properties":{"id":"24660863","dp":23466,"de":0}},{"type":"Polygon","arcs":[[-2206,-2204,-2201,-2199,-2197,-2163,2208]],"properties":{"id":"24660864","dp":16176,"de":3008}},{"type":"Polygon","arcs":[[2209,2210,2211,-1717,-1991,-856]],"properties":{"id":"24660865","dp":10490,"de":481}},{"type":"Polygon","arcs":[[-2145,-2172,-2212,2212]],"properties":{"id":"24660866","dp":12103,"de":887}},{"type":"Polygon","arcs":[[2213,-1915,-2139,2214,2215,-999]],"properties":{"id":"24660868","dp":7760,"de":836}},{"type":"Polygon","arcs":[[-1916,-2214,-998]],"properties":{"id":"24660869","dp":13318,"de":2586}},{"type":"Polygon","arcs":[[2216,2217,-2020,-2024]],"properties":{"id":"24660227","dp":10606,"de":1590}},{"type":"Polygon","arcs":[[2218,-2217,-2023,2219]],"properties":{"id":"24660228","dp":10064,"de":0}},{"type":"Polygon","arcs":[[2220,2221,2222,-2220,-2022]],"properties":{"id":"24660229","dp":9885,"de":821}},{"type":"Polygon","arcs":[[2223,2224,2225,-2222,2226]],"properties":{"id":"24660230","dp":9353,"de":0}},{"type":"Polygon","arcs":[[2227,2228,-2224,2229,2230]],"properties":{"id":"24660231","dp":13943,"de":1132}},{"type":"Polygon","arcs":[[2231,2232,2233,-2228,2234]],"properties":{"id":"24660232","dp":12870,"de":4582}},{"type":"Polygon","arcs":[[2235,2236,2237,2238,2239,-2233]],"properties":{"id":"24660233","dp":12546,"de":936}},{"type":"Polygon","arcs":[[2240,2241,-2236,-2232,2242,2243]],"properties":{"id":"24660234","dp":10162,"de":1711}},{"type":"Polygon","arcs":[[2244,2245,2246,2247,-2237,-2242,2248]],"properties":{"id":"24660235","dp":5817,"de":2967}},{"type":"Polygon","arcs":[[2249,2250,-2246,2251]],"properties":{"id":"24660236","dp":15345,"de":1257}},{"type":"Polygon","arcs":[[2252,2253,2254]],"properties":{"id":"24660238","dp":20508,"de":0}},{"type":"Polygon","arcs":[[2255,2256,2257,-2254,2258]],"properties":{"id":"24660239","dp":17380,"de":0}},{"type":"Polygon","arcs":[[2259,2260,2261,-2238,-2248,2262]],"properties":{"id":"24660241","dp":6161,"de":4545}},{"type":"Polygon","arcs":[[2263,2264,2265,2266,2267,2268,-2260,2269]],"properties":{"id":"24660242","dp":5450,"de":702}},{"type":"Polygon","arcs":[[2270,2271,2272,-2265,2273,2274]],"properties":{"id":"24660243","dp":8307,"de":2451}},{"type":"Polygon","arcs":[[2275,2276,-2273,2277]],"properties":{"id":"24660244","dp":14548,"de":1315}},{"type":"Polygon","arcs":[[2278,2279,-2278,-2272,2280]],"properties":{"id":"24660245","dp":17713,"de":0}},{"type":"Polygon","arcs":[[2281,2282,-2276,-2280,2283]],"properties":{"id":"24660246","dp":16062,"de":2106}},{"type":"Polygon","arcs":[[2284,2285,-2284,-2279,2286,2287]],"properties":{"id":"24660247","dp":21906,"de":0}},{"type":"Polygon","arcs":[[2288,2289,2290,-2282,-2286]],"properties":{"id":"24660248","dp":18379,"de":0}},{"type":"Polygon","arcs":[[2291,2292,2293,2294,-2289,-2285]],"properties":{"id":"24660249","dp":13646,"de":1918}},{"type":"Polygon","arcs":[[-1001,2295,2296,-1018,-1026,-992,-996]],"properties":{"id":"24660744","dp":16730,"de":1026}},{"type":"Polygon","arcs":[[-2216,2297,2298,-2296,-1000]],"properties":{"id":"24660745","dp":6708,"de":1012}},{"type":"Polygon","arcs":[[-2299,2299,2300,2301,-1019,-2297]],"properties":{"id":"24660746","dp":5153,"de":2351}},{"type":"Polygon","arcs":[[2302,-855,-863,-1016,-2302]],"properties":{"id":"24660748","dp":9417,"de":2579}},{"type":"Polygon","arcs":[[-2124,2303,-2127,-2130,-1912,-994,-988,2304,2305,2306,2307,2308,2309,2310]],"properties":{"id":"24660871","dp":622,"de":2045}},{"type":"Polygon","arcs":[[-2304,-2123]],"properties":{"id":"24660872","dp":23146,"de":0}},{"type":"Polygon","arcs":[[2311,2312,2313,2314,-777,-774,-773,-769,-761,2315,2316]],"properties":{"id":"24660874","dp":228,"de":2471}},{"type":"Polygon","arcs":[[2317,-779,-2315,2318,2319,-702]],"properties":{"id":"24660876","dp":3867,"de":2463}},{"type":"Polygon","arcs":[[2320,2321,2322,2323,2324,2325,2326]],"properties":{"id":"24662209","dp":5617,"de":1367}},{"type":"Polygon","arcs":[[2327,2328,2329,-2324]],"properties":{"id":"24662210","dp":9661,"de":0}},{"type":"Polygon","arcs":[[2330,2331,-2328,2332,2333]],"properties":{"id":"24662211","dp":5038,"de":0}},{"type":"Polygon","arcs":[[2334,-2333,-2323,2335,2336]],"properties":{"id":"24662212","dp":5151,"de":1397}},{"type":"Polygon","arcs":[[-2336,-2322,2337,2338,2339]],"properties":{"id":"24662213","dp":4664,"de":559}},{"type":"Polygon","arcs":[[-2321,2340,-2338]],"properties":{"id":"24662214","dp":25404,"de":0}},{"type":"Polygon","arcs":[[2341,-2339,-2341,-2327,2342]],"properties":{"id":"24662215","dp":26156,"de":0}},{"type":"Polygon","arcs":[[-1787,-1775,2343,-2337,-2340,-2342,2344]],"properties":{"id":"24662216","dp":8094,"de":2005}},{"type":"Polygon","arcs":[[-1799,-1793,-1788,-2345,-2343,-2326,-1815,-1818]],"properties":{"id":"24662217","dp":4662,"de":4977}},{"type":"Polygon","arcs":[[2345,2346,2347,2348,2349,2350,2351,2352]],"properties":{"id":"24662528","dp":6375,"de":1910}},{"type":"Polygon","arcs":[[2353,2354,-2353,2355,2356,-546,-550,-553]],"properties":{"id":"24662529","dp":3087,"de":738}},{"type":"Polygon","arcs":[[2357,2358,2359,-2355,2360]],"properties":{"id":"24662530","dp":5897,"de":4387}},{"type":"Polygon","arcs":[[2361,2362,-2361,-2354,-552,-555,-558]],"properties":{"id":"24662531","dp":5424,"de":2358}},{"type":"Polygon","arcs":[[2363,2364,2365,-2358,-2363]],"properties":{"id":"24662532","dp":8260,"de":1482}},{"type":"Polygon","arcs":[[-2365,2366,2367,2368]],"properties":{"id":"24662533","dp":19497,"de":2261}},{"type":"Polygon","arcs":[[2369,2370,-2367,-2364,-2362,-561]],"properties":{"id":"24662534","dp":9025,"de":2481}},{"type":"Polygon","arcs":[[2371,2372,2373,2374,-2368,-2371,2375]],"properties":{"id":"24662535","dp":5193,"de":1570}},{"type":"Polygon","arcs":[[2376,-2376,-2370,-560,-568]],"properties":{"id":"24662536","dp":6181,"de":2325}},{"type":"Polygon","arcs":[[-580,2377,2378,-2377,-567,-571]],"properties":{"id":"24662537","dp":8931,"de":0}},{"type":"Polygon","arcs":[[2379,2380,2381,-2378,-579]],"properties":{"id":"24662538","dp":7771,"de":0}},{"type":"Polygon","arcs":[[2382,-2380,-578]],"properties":{"id":"24662539","dp":9813,"de":0}},{"type":"Polygon","arcs":[[-2381,-2383,-582,2383,2384,2385,2386]],"properties":{"id":"24662540","dp":7382,"de":0}},{"type":"Polygon","arcs":[[-2387,2387,2388,-2372,-2379,-2382]],"properties":{"id":"24662541","dp":6209,"de":3255}},{"type":"Polygon","arcs":[[-592,-594,2389,2390,2391,-2384,-588,-590]],"properties":{"id":"24662542","dp":6060,"de":5127}},{"type":"Polygon","arcs":[[2392,2393,2394,2395,2396,-2385,-2392]],"properties":{"id":"24662543","dp":2786,"de":4994}},{"type":"Polygon","arcs":[[2397,2398,-2393]],"properties":{"id":"24662544","dp":12186,"de":3422}},{"type":"Polygon","arcs":[[-2399,2399,-1103,2400,2401,2402,-2394]],"properties":{"id":"24662545","dp":2981,"de":193}},{"type":"Polygon","arcs":[[2403,-1104,-2400,-2398,-2391,2404,-598]],"properties":{"id":"24662546","dp":6713,"de":2941}},{"type":"Polygon","arcs":[[-2405,-2390,-599]],"properties":{"id":"24662547","dp":30883,"de":0}},{"type":"Polygon","arcs":[[-1110,-1115,2405,-2401,-1102,-948]],"properties":{"id":"24662548","dp":3129,"de":1403}},{"type":"MultiPolygon","arcs":[[[2406]],[[2407,2408,2409,2410,2411,2412,2413,2414,2415,2416]],[[2417]]],"properties":{"id":"24660981","dp":1087,"de":199}},{"type":"Polygon","arcs":[[2418,2419,-2411,2420]],"properties":{"id":"24660982","dp":16381,"de":0}},{"type":"Polygon","arcs":[[2421,2422,-2419,2423]],"properties":{"id":"24660983","dp":12144,"de":0}},{"type":"MultiPolygon","arcs":[[[2424,2425,2426,2427,2428,-2424,-2421,-2410]],[[2429]],[[-2408,2430]]],"properties":{"id":"24660984","dp":1590,"de":0}},{"type":"Polygon","arcs":[[2431,2432,2433,-2427]],"properties":{"id":"24660985","dp":2890,"de":0}},{"type":"Polygon","arcs":[[2434,2435,2436,-2433]],"properties":{"id":"24660986","dp":10024,"de":0}},{"type":"Polygon","arcs":[[2437,2438,2439,2440,-2436]],"properties":{"id":"24660987","dp":8861,"de":0}},{"type":"Polygon","arcs":[[-2415,2441,2442,2443]],"properties":{"id":"24660988","dp":9694,"de":0}},{"type":"Polygon","arcs":[[-2414,2444,2445,-2442]],"properties":{"id":"24660989","dp":8756,"de":1813}},{"type":"Polygon","arcs":[[2446,2447,-2446,2448,2449,2450]],"properties":{"id":"24660990","dp":6031,"de":694}},{"type":"Polygon","arcs":[[2451,2452,2453,2454,-2450,2455]],"properties":{"id":"24660991","dp":7671,"de":0}},{"type":"Polygon","arcs":[[2456,-2456,-2449,-2445,2457]],"properties":{"id":"24660992","dp":9300,"de":686}},{"type":"Polygon","arcs":[[2458,2459,2460,2461]],"properties":{"id":"24660929","dp":5500,"de":1386}},{"type":"Polygon","arcs":[[2462,2463,2464,2465,-2459,2466,2467]],"properties":{"id":"24660930","dp":3388,"de":0}},{"type":"Polygon","arcs":[[2468,2469,2470,2471,2472,2473,2474]],"properties":{"id":"24660931","dp":2322,"de":601}},{"type":"Polygon","arcs":[[2475,2476,2477,-2463,-2472,2478]],"properties":{"id":"24660932","dp":3414,"de":1386}},{"type":"Polygon","arcs":[[2479,2480,-2479,-2471,2481]],"properties":{"id":"24660933","dp":2989,"de":0}},{"type":"Polygon","arcs":[[-2476,-2481,2482]],"properties":{"id":"24660934","dp":7191,"de":1136}},{"type":"Polygon","arcs":[[2483,2484,2485]],"properties":{"id":"24660953","dp":9161,"de":0}},{"type":"Polygon","arcs":[[2486,2487,2488,-2485,2489,2490,2491]],"properties":{"id":"24660954","dp":3154,"de":632}},{"type":"Polygon","arcs":[[2492,2493,2494,2495,2496,2497]],"properties":{"id":"24660955","dp":2302,"de":4021}},{"type":"Polygon","arcs":[[2498,-2495,2499]],"properties":{"id":"24660956","dp":9854,"de":0}},{"type":"Polygon","arcs":[[-2500,-2494,2500,2501]],"properties":{"id":"24660957","dp":7941,"de":0}},{"type":"Polygon","arcs":[[-2501,-2493,2502,2503,2504]],"properties":{"id":"24660958","dp":5311,"de":1425}},{"type":"Polygon","arcs":[[-2504,2505,2506]],"properties":{"id":"24660959","dp":9409,"de":3935}},{"type":"Polygon","arcs":[[2507,2508,2509,-2506,2510,2511]],"properties":{"id":"24660960","dp":7666,"de":0}},{"type":"Polygon","arcs":[[-2508,2512,2513,2514]],"properties":{"id":"24660961","dp":7663,"de":0}},{"type":"Polygon","arcs":[[-2515,2515,2516,-2509]],"properties":{"id":"24660962","dp":10592,"de":0}},{"type":"Polygon","arcs":[[-2514,2517,2518,-2516]],"properties":{"id":"24660963","dp":17674,"de":0}},{"type":"Polygon","arcs":[[2519,-2510,-2517,-2519,2520,-2432,-2426,2521]],"properties":{"id":"24660964","dp":4929,"de":486}},{"type":"MultiPolygon","arcs":[[[-2502,-2505,-2507,-2520,2522,-2496,-2499]],[[2523,2524,2525]]],"properties":{"id":"24660965","dp":2729,"de":1049}},{"type":"Polygon","arcs":[[2526,2527,2528,2529,2530,2531,2532,2533,2534]],"properties":{"id":"24660993","dp":2196,"de":3472}},{"type":"Polygon","arcs":[[2535,2536,-2532]],"properties":{"id":"24660994","dp":13724,"de":0}},{"type":"Polygon","arcs":[[2537,2538,-2536,-2531]],"properties":{"id":"24660995","dp":10984,"de":0}},{"type":"Polygon","arcs":[[2539,-19,-18,2540,2541]],"properties":{"id":"24660997","dp":12708,"de":0}},{"type":"Polygon","arcs":[[-2541,-17,-11,2542,2543,2544]],"properties":{"id":"24660998","dp":11929,"de":0}},{"type":"Polygon","arcs":[[-2543,-15,-9,2545,2546]],"properties":{"id":"24660999","dp":11446,"de":0}},{"type":"Polygon","arcs":[[-2546,-7,-2,-600,2547,2548]],"properties":{"id":"24661000","dp":5922,"de":1085}},{"type":"Polygon","arcs":[[-2544,-2547,-2549,2549,2550]],"properties":{"id":"24661001","dp":13156,"de":0}},{"type":"Polygon","arcs":[[-2550,-2548,-603,2551,2552,2553,2554]],"properties":{"id":"24661002","dp":10699,"de":0}},{"type":"Polygon","arcs":[[2555,-2552,-602,-41,2556]],"properties":{"id":"24661003","dp":10741,"de":1235}},{"type":"Polygon","arcs":[[2557,2558,2559,2560]],"properties":{"id":"24661114","dp":11867,"de":1264}},{"type":"Polygon","arcs":[[2561,2562,-2558,2563]],"properties":{"id":"24661116","dp":17239,"de":0}},{"type":"Polygon","arcs":[[2564,-2564,2565,2566]],"properties":{"id":"24661117","dp":12894,"de":3728}},{"type":"Polygon","arcs":[[2567,2568,2569,2570,-2567,2571]],"properties":{"id":"24661118","dp":9790,"de":7714}},{"type":"Polygon","arcs":[[2572,2573,-2569,2574,2575]],"properties":{"id":"24661119","dp":9914,"de":5109}},{"type":"Polygon","arcs":[[-2575,-2568,2576,2577,2578]],"properties":{"id":"24661120","dp":9918,"de":1103}},{"type":"Polygon","arcs":[[-2572,2579,2580,2581,-2577]],"properties":{"id":"24661121","dp":8755,"de":5661}},{"type":"Polygon","arcs":[[-2566,-2561,2582,2583,-2580]],"properties":{"id":"24661122","dp":15967,"de":2188}},{"type":"Polygon","arcs":[[-2581,-2584,2584,2585]],"properties":{"id":"24661123","dp":17083,"de":0}},{"type":"Polygon","arcs":[[2586,-2578,-2582,-2586,2587,2588,2589]],"properties":{"id":"24661124","dp":4092,"de":4851}},{"type":"Polygon","arcs":[[2590,2591,2592,-1242,2593,2594]],"properties":{"id":"24661125","dp":5881,"de":3774}},{"type":"Polygon","arcs":[[-2594,-1241,2595]],"properties":{"id":"24661126","dp":9908,"de":1987}},{"type":"Polygon","arcs":[[2596,2597,-2596,-1240,-1238,-1236]],"properties":{"id":"24661127","dp":8756,"de":4166}},{"type":"Polygon","arcs":[[-2595,-2598,2598]],"properties":{"id":"24661128","dp":12551,"de":3497}},{"type":"Polygon","arcs":[[2599,2600,2601,-2599,-2597]],"properties":{"id":"24661129","dp":8860,"de":980}},{"type":"Polygon","arcs":[[2602,2603,-2600,-1235]],"properties":{"id":"24661130","dp":13182,"de":1629}},{"type":"Polygon","arcs":[[2604,2605,2606,-2603,-1234,-1232]],"properties":{"id":"24661131","dp":14178,"de":0}},{"type":"Polygon","arcs":[[2607,-2605,-1231,-1190]],"properties":{"id":"24661132","dp":11372,"de":1395}},{"type":"Polygon","arcs":[[-1189,2608,-2606,-2608]],"properties":{"id":"24661133","dp":10964,"de":1169}},{"type":"Polygon","arcs":[[-1188,2609,2610,2611,2612,-2604,-2607,-2609]],"properties":{"id":"24661134","dp":3930,"de":1008}},{"type":"Polygon","arcs":[[2613,2614,-2477,-2483,2615]],"properties":{"id":"24660935","dp":11908,"de":0}},{"type":"Polygon","arcs":[[-2616,2616,2617,2618,2619]],"properties":{"id":"24660936","dp":10886,"de":0}},{"type":"Polygon","arcs":[[-2618,2620,2621,2622,2623]],"properties":{"id":"24660937","dp":10815,"de":0}},{"type":"Polygon","arcs":[[-2622,2624,2625]],"properties":{"id":"24660938","dp":10205,"de":0}},{"type":"Polygon","arcs":[[-2621,-2617,-2480,2626,-2625]],"properties":{"id":"24660939","dp":7011,"de":1597}},{"type":"Polygon","arcs":[[2627,2628,-2623,-2626,-2627,-2482,-2470,2629,2630,2631]],"properties":{"id":"24660940","dp":1940,"de":3894}},{"type":"Polygon","arcs":[[-2629,2632,2633]],"properties":{"id":"24660941","dp":12602,"de":0}},{"type":"Polygon","arcs":[[2634,2635,2636,2637,-2633,-2628,2638]],"properties":{"id":"24660942","dp":11469,"de":0}},{"type":"Polygon","arcs":[[-2637,2639]],"properties":{"id":"24660943","dp":12692,"de":0}},{"type":"Polygon","arcs":[[-2636,2640,2641,2642,-2619,-2624,-2634,-2638,-2640]],"properties":{"id":"24660944","dp":2821,"de":1634}},{"type":"Polygon","arcs":[[2643,2644,-2642,2645]],"properties":{"id":"24660945","dp":6650,"de":0}},{"type":"Polygon","arcs":[[2646,-2614,-2620,-2643,-2645,2647,-2525]],"properties":{"id":"24660946","dp":5511,"de":0}},{"type":"Polygon","arcs":[[-2648,-2644,2648,2649]],"properties":{"id":"24660947","dp":9716,"de":0}},{"type":"Polygon","arcs":[[-2649,-2646,-2641,-2635,2650,2651]],"properties":{"id":"24660948","dp":9356,"de":737}},{"type":"Polygon","arcs":[[-2526,-2650,-2652,2652,-2487,2653]],"properties":{"id":"24660949","dp":10876,"de":493}},{"type":"Polygon","arcs":[[-2488,-2653,-2651,2654,2655]],"properties":{"id":"24660950","dp":9711,"de":679}},{"type":"Polygon","arcs":[[-2489,-2656,2656,-2486]],"properties":{"id":"24660951","dp":14016,"de":0}},{"type":"Polygon","arcs":[[2657,-103,2658,2659,-34]],"properties":{"id":"24661036","dp":9081,"de":3603}},{"type":"Polygon","arcs":[[2660,2661,2662,-2659,-101]],"properties":{"id":"24661037","dp":12683,"de":0}},{"type":"Polygon","arcs":[[2663,2664,-2660,-2663]],"properties":{"id":"24661038","dp":11284,"de":3142}},{"type":"Polygon","arcs":[[-54,-48,-43,-35,-2665,2665]],"properties":{"id":"24661039","dp":6049,"de":2821}},{"type":"Polygon","arcs":[[2666,-58,-55,-2666,-2664,-2662,2667]],"properties":{"id":"24661040","dp":7503,"de":2654}},{"type":"Polygon","arcs":[[2668,-82,-73,-59,-2667]],"properties":{"id":"24661041","dp":12472,"de":976}},{"type":"Polygon","arcs":[[-2661,-100,-89,-2669,-2668]],"properties":{"id":"24661042","dp":14666,"de":1466}},{"type":"Polygon","arcs":[[-30,2669,2670,-2658,-32]],"properties":{"id":"24661043","dp":13705,"de":797}},{"type":"Polygon","arcs":[[-27,2671,2672,-2670,-29]],"properties":{"id":"24661044","dp":13519,"de":0}},{"type":"Polygon","arcs":[[2673,-2672,-26,-24]],"properties":{"id":"24661045","dp":11781,"de":1224}},{"type":"Polygon","arcs":[[-23,-21,-2317,2674,-94,-102,-2671,-2673,-2674]],"properties":{"id":"24661046","dp":766,"de":510}},{"type":"Polygon","arcs":[[-2521,-2518,-2513,-2512,2675,2676,-2438,-2435]],"properties":{"id":"24660966","dp":2365,"de":909}},{"type":"MultiPolygon","arcs":[[[-2503,-2498,2677,2678,-2676,-2511]],[[2679,2680]]],"properties":{"id":"24660967","dp":3800,"de":740}},{"type":"Polygon","arcs":[[-2677,-2679,2681,2682,2683,-2439]],"properties":{"id":"24660968","dp":8178,"de":3130}},{"type":"Polygon","arcs":[[-2684,2684,2685,-2440]],"properties":{"id":"24660969","dp":14061,"de":2207}},{"type":"Polygon","arcs":[[2686,2687,-2685,2688,2689]],"properties":{"id":"24660970","dp":12500,"de":1190}},{"type":"Polygon","arcs":[[-2437,-2441,-2686,-2688,2690,-2434]],"properties":{"id":"24660971","dp":8921,"de":0}},{"type":"Polygon","arcs":[[-2691,-2687,2691,2692,-2428]],"properties":{"id":"24660972","dp":11556,"de":0}},{"type":"Polygon","arcs":[[-2692,-2690,2693,2694]],"properties":{"id":"24660973","dp":12628,"de":0}},{"type":"Polygon","arcs":[[-2695,2695,2696]],"properties":{"id":"24660974","dp":9657,"de":0}},{"type":"Polygon","arcs":[[-2693,-2697,2697,2698,-2422,-2429]],"properties":{"id":"24660975","dp":12725,"de":0}},{"type":"Polygon","arcs":[[-2699,2699,2700,2701,-2420,-2423]],"properties":{"id":"24660976","dp":5042,"de":2127}},{"type":"Polygon","arcs":[[-2701,2702,2703,2704]],"properties":{"id":"24660977","dp":9210,"de":771}},{"type":"Polygon","arcs":[[2705,-2703,2706,2707,-2452,-2457]],"properties":{"id":"24660978","dp":6021,"de":712}},{"type":"Polygon","arcs":[[2708,2709,2710,2711,2712]],"properties":{"id":"24661071","dp":6304,"de":980}},{"type":"Polygon","arcs":[[2713,-2712,2714,-1982,-1979,2715,2716]],"properties":{"id":"24661072","dp":3038,"de":1041}},{"type":"Polygon","arcs":[[2717,-2713,-2714,2718]],"properties":{"id":"24661073","dp":9224,"de":7613}},{"type":"Polygon","arcs":[[2719,2720,2721,2722]],"properties":{"id":"24661080","dp":106320,"de":7200}},{"type":"Polygon","arcs":[[2723,-2723,2724,2725]],"properties":{"id":"24661081","dp":36742,"de":6285}},{"type":"Polygon","arcs":[[2726,-2726,2727,2728]],"properties":{"id":"24661082","dp":65076,"de":19230}},{"type":"Polygon","arcs":[[2729,-2729,2730,2731,2732]],"properties":{"id":"24661083","dp":10943,"de":4716}},{"type":"Polygon","arcs":[[-2732,2733,2734]],"properties":{"id":"24661084","dp":34946,"de":8776}},{"type":"Polygon","arcs":[[2735,-2734,-2731,-2728,2736,2737]],"properties":{"id":"24661086","dp":1993,"de":14953}},{"type":"Polygon","arcs":[[-2725,2738,-228,2739,-2737]],"properties":{"id":"24661087","dp":14900,"de":24502}},{"type":"Polygon","arcs":[[2740,2741,-229,2742,-2721]],"properties":{"id":"24661093","dp":17007,"de":28346}},{"type":"Polygon","arcs":[[-2722,-2743,-225,-2739]],"properties":{"id":"24661094","dp":71875,"de":25390}},{"type":"Polygon","arcs":[[2743,2744,2745]],"properties":{"id":"24661099","dp":13087,"de":2631}},{"type":"Polygon","arcs":[[-2746,2746,2747,2748,2749,2750,2751,2752]],"properties":{"id":"24661100","dp":6033,"de":9406}},{"type":"Polygon","arcs":[[2753,2754,-2753,2755,2756]],"properties":{"id":"24661102","dp":12857,"de":5869}},{"type":"Polygon","arcs":[[2757,2758,-2754,2759]],"properties":{"id":"24661103","dp":19795,"de":6326}},{"type":"Polygon","arcs":[[2760,2761,2762,-2611]],"properties":{"id":"24661135","dp":9961,"de":701}},{"type":"Polygon","arcs":[[2763,2764,2765,-2762]],"properties":{"id":"24661136","dp":10724,"de":0}},{"type":"Polygon","arcs":[[2766,2767,-2764,-2761,-2610,-1187,-820]],"properties":{"id":"24661137","dp":15317,"de":941}},{"type":"Polygon","arcs":[[2768,-2765,-2768,2769]],"properties":{"id":"24661138","dp":14517,"de":0}},{"type":"Polygon","arcs":[[-215,2770,2771,-2770,-2767,-819,2772,-221,-218]],"properties":{"id":"24661139","dp":11507,"de":4767}},{"type":"Polygon","arcs":[[-2772,2773,2774,-2766,-2769]],"properties":{"id":"24661140","dp":12708,"de":925}},{"type":"Polygon","arcs":[[2775,2776,-2774,2777]],"properties":{"id":"24661141","dp":17060,"de":2027}},{"type":"Polygon","arcs":[[-2777,2778,-2763,-2775]],"properties":{"id":"24661142","dp":6130,"de":0}},{"type":"Polygon","arcs":[[2779,2780,-2778,-2771,-214]],"properties":{"id":"24661143","dp":17058,"de":0}},{"type":"Polygon","arcs":[[2781,2782,2783]],"properties":{"id":"24661318","dp":14343,"de":8838}},{"type":"Polygon","arcs":[[2784,-2783,2785,2786]],"properties":{"id":"24661319","dp":21226,"de":1915}},{"type":"Polygon","arcs":[[2787,2788,2789,-2785,2790,2791,2792]],"properties":{"id":"24661320","dp":6695,"de":9399}},{"type":"Polygon","arcs":[[2793,2794,-2789]],"properties":{"id":"24661321","dp":26318,"de":7692}},{"type":"Polygon","arcs":[[-1356,2795,2796,2797]],"properties":{"id":"24661322","dp":15896,"de":0}},{"type":"Polygon","arcs":[[2798,2799,2800,2801,-2796]],"properties":{"id":"24661323","dp":20628,"de":0}},{"type":"Polygon","arcs":[[2802,-2800,2803,2804]],"properties":{"id":"24661324","dp":10893,"de":0}},{"type":"Polygon","arcs":[[-2801,-2803,2805,2806,2807]],"properties":{"id":"24661325","dp":22913,"de":0}},{"type":"Polygon","arcs":[[2808,-2807,2809]],"properties":{"id":"24661326","dp":22238,"de":0}},{"type":"Polygon","arcs":[[-2810,2810,2811]],"properties":{"id":"24661327","dp":28231,"de":0}},{"type":"Polygon","arcs":[[2812,2813,2814,2815,-2812,2816]],"properties":{"id":"24661328","dp":28682,"de":5574}},{"type":"Polygon","arcs":[[-2816,2817,2818,2819,-2808,-2809]],"properties":{"id":"24661329","dp":20798,"de":6230}},{"type":"Polygon","arcs":[[2820,2821,-2802,-2820]],"properties":{"id":"24661330","dp":19015,"de":4166}},{"type":"Polygon","arcs":[[2822,-2797,-2822,2823,2824]],"properties":{"id":"24661331","dp":15550,"de":0}},{"type":"Polygon","arcs":[[2825,2826,2827,2828,-2824,-2821]],"properties":{"id":"24661332","dp":10467,"de":5632}},{"type":"Polygon","arcs":[[2829,-2826,-2819,2830]],"properties":{"id":"24661333","dp":19484,"de":5357}},{"type":"Polygon","arcs":[[2831,2832,2833,-2831,-2818,-2815]],"properties":{"id":"24661334","dp":1442,"de":44407}},{"type":"Polygon","arcs":[[-2817,-2811,-2806,-2805,2834,2835,2836]],"properties":{"id":"24661335","dp":5345,"de":44384}},{"type":"Polygon","arcs":[[2837,2838,-2837,2839,-1334]],"properties":{"id":"24661336","dp":4168,"de":10743}},{"type":"Polygon","arcs":[[2840,2841,2842,-1324]],"properties":{"id":"24661337","dp":6426,"de":2200}},{"type":"Polygon","arcs":[[-2840,-2836,2843,-1341,-1335]],"properties":{"id":"24661338","dp":11828,"de":0}},{"type":"Polygon","arcs":[[-2799,-1355,-1344,-2844,-2835,-2804]],"properties":{"id":"24661339","dp":14736,"de":827}},{"type":"Polygon","arcs":[[2844,2845,2846,2847]],"properties":{"id":"24661340","dp":10679,"de":2341}},{"type":"Polygon","arcs":[[-2845,2848,2849]],"properties":{"id":"24661341","dp":18819,"de":0}},{"type":"Polygon","arcs":[[-2850,2850,2851]],"properties":{"id":"24661342","dp":25999,"de":0}},{"type":"Polygon","arcs":[[-1360,-2851,2852,2853]],"properties":{"id":"24661343","dp":28256,"de":1153}},{"type":"Polygon","arcs":[[2854,2855,2856,-235,-2853]],"properties":{"id":"24661344","dp":11419,"de":0}},{"type":"Polygon","arcs":[[2857,-2855,-2849]],"properties":{"id":"24661345","dp":10982,"de":0}},{"type":"Polygon","arcs":[[2858,-2856,-2858,-2848,2859,2860,2861]],"properties":{"id":"24661346","dp":10621,"de":2118}},{"type":"Polygon","arcs":[[2862,-236,-2857,-2859,2863]],"properties":{"id":"24661347","dp":12509,"de":1636}},{"type":"Polygon","arcs":[[-2612,-2779,-2776,-2781,2864,2865,2866,2867,2868,-78,-84,-96,2869,2870,2871]],"properties":{"id":"24661047","dp":662,"de":1474}},{"type":"Polygon","arcs":[[2872,2873,2874,2875,2876,2877,2878]],"properties":{"id":"24661048","dp":10641,"de":1368}},{"type":"Polygon","arcs":[[2879,-2877,2880,2881]],"properties":{"id":"24661049","dp":15948,"de":0}},{"type":"Polygon","arcs":[[-2876,2882,2883,2884,-2881]],"properties":{"id":"24661050","dp":7888,"de":4583}},{"type":"Polygon","arcs":[[2885,2886,-2884,2887,2888,2889,2890,2891]],"properties":{"id":"24661051","dp":7705,"de":4329}},{"type":"Polygon","arcs":[[-2882,-2885,-2887,2892,2893]],"properties":{"id":"24661052","dp":10079,"de":1888}},{"type":"Polygon","arcs":[[-2893,-2886,2894,2895]],"properties":{"id":"24661053","dp":15918,"de":4373}},{"type":"Polygon","arcs":[[-2878,-2880,-2894,-2896,2896,2897]],"properties":{"id":"24661054","dp":4683,"de":3448}},{"type":"Polygon","arcs":[[-2897,2898,2899,2900,2901,2902,2903,-2573,2904]],"properties":{"id":"24661055","dp":5696,"de":7172}},{"type":"Polygon","arcs":[[2905,2906,2907,2908,2909,-2900,2910]],"properties":{"id":"24661058","dp":8016,"de":4474}},{"type":"Polygon","arcs":[[2911,-2908]],"properties":{"id":"24661059","dp":21576,"de":2717}},{"type":"Polygon","arcs":[[-2909,-2912,-2907,2912,2913,2914]],"properties":{"id":"24661060","dp":8331,"de":9517}},{"type":"Polygon","arcs":[[2915,2916,2917,2918]],"properties":{"id":"24660668","dp":18577,"de":0}},{"type":"Polygon","arcs":[[-2918,2919,2920,2921,2922]],"properties":{"id":"24660669","dp":10729,"de":5208}},{"type":"Polygon","arcs":[[2923,2924,-2921,2925]],"properties":{"id":"24660670","dp":32008,"de":0}},{"type":"Polygon","arcs":[[2926,2927,-2924,2928]],"properties":{"id":"24660671","dp":33656,"de":0}},{"type":"Polygon","arcs":[[2929,2930,-2927,2931]],"properties":{"id":"24660672","dp":20829,"de":2183}},{"type":"Polygon","arcs":[[2932,2933,-2930,2934]],"properties":{"id":"24660673","dp":19867,"de":0}},{"type":"Polygon","arcs":[[-2793,2935,2936,2937,2938,-929,-923,-919,2939,2940]],"properties":{"id":"24660676","dp":2074,"de":4783}},{"type":"Polygon","arcs":[[2941,-2934,2942,-2936,-2792]],"properties":{"id":"24660677","dp":7771,"de":3762}},{"type":"Polygon","arcs":[[-2942,-2791,2943,-2931]],"properties":{"id":"24660678","dp":41397,"de":0}},{"type":"Polygon","arcs":[[-2944,-2787,2944,-2928]],"properties":{"id":"24660679","dp":25133,"de":0}},{"type":"Polygon","arcs":[[-2925,-2945,2945]],"properties":{"id":"24660680","dp":17854,"de":0}},{"type":"Polygon","arcs":[[2946,-2922,-2946,-2786,2947,-2825,-2829]],"properties":{"id":"24660681","dp":12996,"de":1167}},{"type":"Polygon","arcs":[[-2923,-2947,-2828,2948]],"properties":{"id":"24660682","dp":8995,"de":0}},{"type":"Polygon","arcs":[[2949,-2919,-2949,-2827]],"properties":{"id":"24660683","dp":17903,"de":0}},{"type":"Polygon","arcs":[[2950,-2950,-2830,2951]],"properties":{"id":"24660684","dp":25898,"de":0}},{"type":"Polygon","arcs":[[2952,2953,-2952,-2834]],"properties":{"id":"24660685","dp":26000,"de":0}},{"type":"Polygon","arcs":[[2954,-231,-2760,-2757,2955,2956,2957,-1310,2958]],"properties":{"id":"24661104","dp":6626,"de":56553}},{"type":"Polygon","arcs":[[2959,-2740,-227,-2955]],"properties":{"id":"24661105","dp":14474,"de":80365}},{"type":"Polygon","arcs":[[2960,2961,-2738,-2960,-2959,-1309,2962,2963]],"properties":{"id":"24661106","dp":3120,"de":61103}},{"type":"Polygon","arcs":[[2964,2965,2966,2967]],"properties":{"id":"24661108","dp":11387,"de":1438}},{"type":"Polygon","arcs":[[-2589,2968,2969,-2965]],"properties":{"id":"24661109","dp":19050,"de":0}},{"type":"Polygon","arcs":[[-2583,2970,2971,-2969,-2588,-2585]],"properties":{"id":"24661110","dp":11532,"de":4125}},{"type":"Polygon","arcs":[[-2972,2972,2973]],"properties":{"id":"24661111","dp":18640,"de":3236}},{"type":"Polygon","arcs":[[2974,-242,2975,-175]],"properties":{"id":"24663212","dp":18537,"de":1679}},{"type":"Polygon","arcs":[[-178,-2976,2976,-202,-232]],"properties":{"id":"24663213","dp":8255,"de":0}},{"type":"Polygon","arcs":[[-241,2977,2978,-203,-2977]],"properties":{"id":"24663214","dp":12494,"de":4880}},{"type":"MultiPolygon","arcs":[[[2979,2980,2981,2982]],[[2983]],[[2984,2985,2986,2987,2988]]],"properties":{"id":"24663067","dp":259,"de":112}},{"type":"Polygon","arcs":[[-2953,-2833,2989,2990]],"properties":{"id":"24660686","dp":8668,"de":1815}},{"type":"Polygon","arcs":[[2991,2992,-2991,2993]],"properties":{"id":"24660687","dp":22923,"de":10073}},{"type":"Polygon","arcs":[[2994,2995,2996,-2990]],"properties":{"id":"24660688","dp":20687,"de":0}},{"type":"Polygon","arcs":[[2997,-2996,2998,2999]],"properties":{"id":"24660689","dp":29575,"de":0}},{"type":"Polygon","arcs":[[3000,-3000,3001,3002]],"properties":{"id":"24660690","dp":12919,"de":0}},{"type":"Polygon","arcs":[[-3003,3003,3004,3005,3006]],"properties":{"id":"24660691","dp":5439,"de":20443}},{"type":"Polygon","arcs":[[-3004,-3002,-2999,3007,3008]],"properties":{"id":"24660692","dp":11088,"de":3901}},{"type":"Polygon","arcs":[[-3008,-2995,-2832,3009]],"properties":{"id":"24660693","dp":22857,"de":14285}},{"type":"Polygon","arcs":[[3010,-3009,-3010,-2814,3011]],"properties":{"id":"24660694","dp":22350,"de":14035}},{"type":"Polygon","arcs":[[3012,-3012,-2813,-2839]],"properties":{"id":"24660695","dp":20388,"de":1124}},{"type":"Polygon","arcs":[[3013,-3005,-3011,-3013,3014,3015]],"properties":{"id":"24660696","dp":24400,"de":5555}},{"type":"Polygon","arcs":[[-3015,-2838,-1325,-2843]],"properties":{"id":"24660697","dp":15011,"de":4231}},{"type":"Polygon","arcs":[[3016,-3016,-2842]],"properties":{"id":"24660698","dp":21565,"de":10869}},{"type":"Polygon","arcs":[[3017,-3006,-3014,-3017,-2841,-1323,3018]],"properties":{"id":"24660699","dp":6191,"de":8508}},{"type":"Polygon","arcs":[[3019,-3019,-1322,3020,3021,3022]],"properties":{"id":"24660700","dp":15954,"de":22330}},{"type":"Polygon","arcs":[[-3022,3023,3024]],"properties":{"id":"24660701","dp":33450,"de":0}},{"type":"MultiPolygon","arcs":[[[3025,3026,3027,3028,3029,3030,-2866]],[[3031,-2868,3032]]],"properties":{"id":"24661184","dp":4169,"de":2953}},{"type":"Polygon","arcs":[[-3029,3033,3034]],"properties":{"id":"24661185","dp":12280,"de":1253}},{"type":"Polygon","arcs":[[-79,-2869,3035,-67,-72]],"properties":{"id":"24661187","dp":9794,"de":940}},{"type":"MultiPolygon","arcs":[[[3036,3037,3038,3039,3040,3041,3042]],[[3043,-69,3044,3045]]],"properties":{"id":"24661189","dp":6727,"de":727}},{"type":"MultiPolygon","arcs":[[[3046,3047,3048,3049,3050,-3037]],[[3051,-63,-3044,3052]]],"properties":{"id":"24661190","dp":8156,"de":1633}},{"type":"Polygon","arcs":[[3053,3054,3055,3056,3057]],"properties":{"id":"24663180","dp":2415,"de":686}},{"type":"Polygon","arcs":[[-3056,3058,3059,3060,3061,3062]],"properties":{"id":"24663181","dp":3183,"de":1018}},{"type":"Polygon","arcs":[[3063,3064,-1509,3065,3066,3067,3068,3069,3070,3071,3072,3073,3074]],"properties":{"id":"24663182","dp":1077,"de":1517}},{"type":"Polygon","arcs":[[3075,-3075]],"properties":{"id":"24663183","dp":5428,"de":877}},{"type":"Polygon","arcs":[[3076,3077,3078,3079,3080,3081,3082]],"properties":{"id":"24663057","dp":593,"de":78}},{"type":"Polygon","arcs":[[3083,3084,3085,-3078]],"properties":{"id":"24663058","dp":2857,"de":312}},{"type":"Polygon","arcs":[[3086,3087,3088,3089,-3080,3090]],"properties":{"id":"24663059","dp":2379,"de":437}},{"type":"Polygon","arcs":[[3091,3092,-3088,3093]],"properties":{"id":"24663060","dp":2919,"de":0}},{"type":"Polygon","arcs":[[3094,-3089,-3093,3095]],"properties":{"id":"24663061","dp":3187,"de":250}},{"type":"Polygon","arcs":[[3096,3097,3098,-3090,-3095]],"properties":{"id":"24663062","dp":2804,"de":0}},{"type":"Polygon","arcs":[[3099,3100,-2986,3101,-2983,3102,3103]],"properties":{"id":"24663068","dp":126,"de":44}},{"type":"Polygon","arcs":[[-2538,-2530,3104,-703,-2320,3105,3106,-2312,-20,-2540,3107]],"properties":{"id":"24663306","dp":8248,"de":513}},{"type":"Polygon","arcs":[[3108,-1073,3109,3110,3111,3112,3113,-2053,3114,3115,3116,3117,3118,-930,-2939]],"properties":{"id":"24663311","dp":1255,"de":2169}},{"type":"Polygon","arcs":[[3119,-346,-344,-359,-245,-625,3120]],"properties":{"id":"24663314","dp":3789,"de":3877}},{"type":"Polygon","arcs":[[3121,3122,3123,3124,3125,3126,3127,3128]],"properties":{"id":"24663263","dp":4368,"de":4448}},{"type":"Polygon","arcs":[[3129,3130,3131,3132,3133]],"properties":{"id":"24663264","dp":14594,"de":900}},{"type":"Polygon","arcs":[[3134,3135,3136,3137]],"properties":{"id":"24663266","dp":11922,"de":0}},{"type":"Polygon","arcs":[[3138,3139,3140,3141,3142,-3098]],"properties":{"id":"24663063","dp":2789,"de":699}},{"type":"Polygon","arcs":[[3143,3144,-2987,-3101,3145,3146,-3141]],"properties":{"id":"24663064","dp":2965,"de":860}},{"type":"Polygon","arcs":[[-3144,-3140,3147]],"properties":{"id":"24663065","dp":5767,"de":0}},{"type":"Polygon","arcs":[[-2988,-3145,-3148,-3139,3148,3149]],"properties":{"id":"24663066","dp":1821,"de":738}},{"type":"Polygon","arcs":[[3150,-2980,-3102,-2985]],"properties":{"id":"24663069","dp":492,"de":40}},{"type":"Polygon","arcs":[[-3146,-3100,3151,3152,3153]],"properties":{"id":"24663070","dp":2795,"de":0}},{"type":"Polygon","arcs":[[-3154,3154,3155,-3142,-3147]],"properties":{"id":"24663071","dp":2994,"de":0}},{"type":"Polygon","arcs":[[-3153,3156,3157,-3155]],"properties":{"id":"24663072","dp":3381,"de":344}},{"type":"Polygon","arcs":[[-3143,-3156,-3158,3158,-3081,-3099]],"properties":{"id":"24663073","dp":2370,"de":1312}},{"type":"Polygon","arcs":[[-3082,-3159,-3157,-3152,-3104,3159,3160,3161]],"properties":{"id":"24663074","dp":338,"de":51}},{"type":"Polygon","arcs":[[3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172,3173,3174,3175,3176,3177]],"properties":{"id":"24663334","dp":0,"de":983}},{"type":"Polygon","arcs":[[3178,3179,3180,3181]],"properties":{"id":"24660010","dp":3254,"de":395}},{"type":"Polygon","arcs":[[-2290,-2295,3182,3183,3184]],"properties":{"id":"24660250","dp":15885,"de":0}},{"type":"Polygon","arcs":[[-3185,3185,3186,-2291]],"properties":{"id":"24660251","dp":18471,"de":2159}},{"type":"Polygon","arcs":[[-3187,3187,3188,-2283]],"properties":{"id":"24660252","dp":12673,"de":1157}},{"type":"Polygon","arcs":[[-3188,-3186,-3184,3189,-1906,-1909,-1911,3190,3191]],"properties":{"id":"24660253","dp":4949,"de":2626}},{"type":"Polygon","arcs":[[-3192,3192,3193,3194]],"properties":{"id":"24660254","dp":12413,"de":2337}},{"type":"Polygon","arcs":[[-3189,-3195,-2266,-2277]],"properties":{"id":"24660255","dp":13650,"de":0}},{"type":"Polygon","arcs":[[3195,3196,-222,-2773,-818]],"properties":{"id":"24661147","dp":16692,"de":3359}},{"type":"Polygon","arcs":[[-813,3197,-3196,-817]],"properties":{"id":"24661148","dp":7286,"de":28963}},{"type":"Polygon","arcs":[[-223,-3197,-3198,3198]],"properties":{"id":"24661149","dp":12032,"de":5954}},{"type":"Polygon","arcs":[[3199,3200,3201,-224,-3199,-812]],"properties":{"id":"24661150","dp":8940,"de":10433}},{"type":"Polygon","arcs":[[3202,3203,-3200,-811]],"properties":{"id":"24661151","dp":10386,"de":2976}},{"type":"Polygon","arcs":[[3204,3205,-3203,-809]],"properties":{"id":"24661152","dp":16071,"de":1488}},{"type":"Polygon","arcs":[[3206,3207,-3205,-806]],"properties":{"id":"24661153","dp":15435,"de":4054}},{"type":"Polygon","arcs":[[3208,3209,3210,3211,-306,-295,-291,3212]],"properties":{"id":"24660082","dp":7922,"de":1243}},{"type":"Polygon","arcs":[[3213,-3213,-290,-288,-283]],"properties":{"id":"24660083","dp":7790,"de":843}},{"type":"Polygon","arcs":[[3214,3215,-3209,-3214,-282,3216]],"properties":{"id":"24660084","dp":8822,"de":0}},{"type":"Polygon","arcs":[[3217,3218,3219,3220,-3217,-281,3221]],"properties":{"id":"24660085","dp":9453,"de":1045}},{"type":"Polygon","arcs":[[3222,3223,3224,-3220]],"properties":{"id":"24660086","dp":12280,"de":0}},{"type":"Polygon","arcs":[[3225,-3223,-3219,3226]],"properties":{"id":"24660087","dp":20078,"de":0}},{"type":"Polygon","arcs":[[3227,-3224,-3226,3228,3229]],"properties":{"id":"24660088","dp":19234,"de":0}},{"type":"MultiPolygon","arcs":[[[3230,3231,3232,3233,3234,3235,3236,-3050,3237]],[[3238,3239,3240,3241,-3052,3242]]],"properties":{"id":"24661191","dp":5217,"de":395}},{"type":"Polygon","arcs":[[3243,-3231,3244,3245]],"properties":{"id":"24661192","dp":10329,"de":3047}},{"type":"Polygon","arcs":[[3246,-3232,-3244,3247]],"properties":{"id":"24661193","dp":14310,"de":2155}},{"type":"Polygon","arcs":[[3248,-3233,-3247,3249,3250]],"properties":{"id":"24661194","dp":10312,"de":780}},{"type":"Polygon","arcs":[[3251,-3234,-3249,3252,3253]],"properties":{"id":"24661195","dp":7338,"de":1778}},{"type":"Polygon","arcs":[[3254,3255,3256,-3235,-3252,3257]],"properties":{"id":"24661196","dp":6634,"de":437}},{"type":"Polygon","arcs":[[3258,3259,3260,3261,3262,-3256]],"properties":{"id":"24661197","dp":10199,"de":1268}},{"type":"Polygon","arcs":[[3263,3264,-3262,3265]],"properties":{"id":"24661198","dp":11922,"de":915}},{"type":"Polygon","arcs":[[3266,3267,-3266,-3261]],"properties":{"id":"24661199","dp":13511,"de":1272}},{"type":"Polygon","arcs":[[3268,3269,3270,3271,-3268,3272]],"properties":{"id":"24661200","dp":7638,"de":0}},{"type":"Polygon","arcs":[[3273,3274,-3271,3275]],"properties":{"id":"24661201","dp":12803,"de":0}},{"type":"Polygon","arcs":[[3276,-3264,-3272,-3275]],"properties":{"id":"24661202","dp":10665,"de":0}},{"type":"Polygon","arcs":[[3277,3278,-354,3279]],"properties":{"id":"24660108","dp":12724,"de":0}},{"type":"Polygon","arcs":[[-1988,-831,-834,-184,-193,3280,3281]],"properties":{"id":"24663184","dp":2621,"de":2323}},{"type":"Polygon","arcs":[[-3282,3282,-1976,-1984,-1989]],"properties":{"id":"24663185","dp":4750,"de":1246}},{"type":"Polygon","arcs":[[-3283,-3281,-198,3283,3284,3285,-1977]],"properties":{"id":"24663186","dp":4383,"de":757}},{"type":"Polygon","arcs":[[3286,3287,-1967,-3286]],"properties":{"id":"24663187","dp":2962,"de":1234}},{"type":"Polygon","arcs":[[3288,-3287,-3285,3289,3290]],"properties":{"id":"24663188","dp":4195,"de":394}},{"type":"Polygon","arcs":[[-3290,3291,3292]],"properties":{"id":"24663189","dp":14500,"de":0}},{"type":"Polygon","arcs":[[-3284,-197,-208,3293,-3292]],"properties":{"id":"24663190","dp":11452,"de":1085}},{"type":"Polygon","arcs":[[3294,3295,-3291]],"properties":{"id":"24663191","dp":16375,"de":0}},{"type":"Polygon","arcs":[[3296,3297,3298,3299,3300,3301,3302]],"properties":{"id":"24663194","dp":6012,"de":1831}},{"type":"Polygon","arcs":[[-3298,3303,3304,3305]],"properties":{"id":"24663195","dp":20000,"de":0}},{"type":"Polygon","arcs":[[3306,3307,3308,-3299,-3306,3309,3310]],"properties":{"id":"24663196","dp":6317,"de":5079}},{"type":"Polygon","arcs":[[3311,-3310,-3305,3312,-210]],"properties":{"id":"24663197","dp":8346,"de":0}},{"type":"Polygon","arcs":[[-204,-2979,3313,-3311,-3312,-209]],"properties":{"id":"24663198","dp":10715,"de":6769}},{"type":"Polygon","arcs":[[-3314,-2978,3314,-114,3315,-3307]],"properties":{"id":"24663199","dp":7392,"de":12541}},{"type":"Polygon","arcs":[[-113,-695,-3308,-3316]],"properties":{"id":"24663200","dp":12563,"de":2689}},{"type":"Polygon","arcs":[[3316,-115,-3315,-240]],"properties":{"id":"24663201","dp":6288,"de":8951}},{"type":"Polygon","arcs":[[3317,3318,-116,-3317,-239]],"properties":{"id":"24663202","dp":11703,"de":3548}},{"type":"Polygon","arcs":[[3319,-127,-117,-3319,3320]],"properties":{"id":"24663203","dp":34809,"de":4761}},{"type":"Polygon","arcs":[[-128,-3320,3321,3322,3323,3324]],"properties":{"id":"24663204","dp":9533,"de":0}},{"type":"Polygon","arcs":[[-3322,-3321,-3318,-238,3325,3326]],"properties":{"id":"24663205","dp":17491,"de":2920}},{"type":"Polygon","arcs":[[-3323,-3327,3327,3328]],"properties":{"id":"24663206","dp":26118,"de":7805}},{"type":"Polygon","arcs":[[3329,-3328,-3326,-244,3330,-173]],"properties":{"id":"24663207","dp":17308,"de":0}},{"type":"Polygon","arcs":[[-161,3331,3332,-3324,-3329,-3330,-172,-164]],"properties":{"id":"24663208","dp":11967,"de":1083}},{"type":"Polygon","arcs":[[-804,3333,3334,-3207]],"properties":{"id":"24661154","dp":13961,"de":2759}},{"type":"Polygon","arcs":[[-802,3335,3336,-3334]],"properties":{"id":"24661155","dp":21612,"de":2764}},{"type":"Polygon","arcs":[[-800,3337,3338,-3336]],"properties":{"id":"24661156","dp":22321,"de":4241}},{"type":"Polygon","arcs":[[3339,3340,-3338,-798]],"properties":{"id":"24661157","dp":19493,"de":0}},{"type":"Polygon","arcs":[[3341,3342,-3340,-796]],"properties":{"id":"24661158","dp":18669,"de":4935}},{"type":"Polygon","arcs":[[3343,3344,-3342,-795]],"properties":{"id":"24661159","dp":14922,"de":2519}},{"type":"Polygon","arcs":[[3345,3346,-3344,-787]],"properties":{"id":"24661160","dp":15663,"de":3763}},{"type":"Polygon","arcs":[[3347,3348,-3346,-785]],"properties":{"id":"24661161","dp":9785,"de":2412}},{"type":"Polygon","arcs":[[3349,3350,3351,-3348,-784]],"properties":{"id":"24661162","dp":13058,"de":1106}},{"type":"Polygon","arcs":[[3352,3353,3354,-3350,-783]],"properties":{"id":"24661163","dp":16531,"de":0}},{"type":"Polygon","arcs":[[3355,3356,-3353,-782,3357]],"properties":{"id":"24661164","dp":16909,"de":0}},{"type":"Polygon","arcs":[[3358,3359,-3356,3360]],"properties":{"id":"24661165","dp":10887,"de":1380}},{"type":"Polygon","arcs":[[3361,-3255,3362,-3361,-3358,-781,3363,3364]],"properties":{"id":"24661166","dp":5202,"de":1692}},{"type":"Polygon","arcs":[[-3258,3365,-3363]],"properties":{"id":"24661167","dp":15246,"de":0}},{"type":"Polygon","arcs":[[-3366,-3254,3366,-3359]],"properties":{"id":"24661168","dp":13460,"de":0}},{"type":"Polygon","arcs":[[-3367,-3253,-3251,3367,-3357,-3360]],"properties":{"id":"24661169","dp":15337,"de":1533}},{"type":"Polygon","arcs":[[-3368,-3250,3368,-3354]],"properties":{"id":"24661170","dp":23842,"de":0}},{"type":"Polygon","arcs":[[-3369,-3248,-3246,3369,-3351,-3355]],"properties":{"id":"24661171","dp":14472,"de":3140}},{"type":"Polygon","arcs":[[-3370,-3245,-3238,-3049,3370,-3349,-3352]],"properties":{"id":"24661172","dp":9834,"de":1731}},{"type":"Polygon","arcs":[[-3371,-3048,3371,-3347]],"properties":{"id":"24661173","dp":13832,"de":3310}},{"type":"Polygon","arcs":[[-3372,-3047,3372,-3345]],"properties":{"id":"24661174","dp":21274,"de":3861}},{"type":"Polygon","arcs":[[-3373,-3043,3373,-3343]],"properties":{"id":"24661175","dp":19230,"de":0}},{"type":"Polygon","arcs":[[-3374,-3042,3374,-3341]],"properties":{"id":"24661176","dp":21751,"de":0}},{"type":"Polygon","arcs":[[-3339,-3375,-3041,3375]],"properties":{"id":"24661177","dp":21036,"de":0}},{"type":"Polygon","arcs":[[-3376,-3040,3376,-3335,-3337]],"properties":{"id":"24661178","dp":6833,"de":3742}},{"type":"Polygon","arcs":[[-3377,3377,3378,-3206,-3208]],"properties":{"id":"24661179","dp":14724,"de":1862}},{"type":"Polygon","arcs":[[-3379,3379,3380,-3204]],"properties":{"id":"24661180","dp":23074,"de":0}},{"type":"Polygon","arcs":[[3381,3382,3383,3384,-3201,-3381]],"properties":{"id":"24661181","dp":18403,"de":2409}},{"type":"Polygon","arcs":[[3385,-3027,3386,-3384]],"properties":{"id":"24661182","dp":11259,"de":1358}},{"type":"Polygon","arcs":[[3387,-3034,-3028,-3386,-3383]],"properties":{"id":"24661183","dp":18908,"de":1649}},{"type":"Polygon","arcs":[[-2744,-2755,-2759,3388]],"properties":{"id":"24663246","dp":31756,"de":5620}},{"type":"Polygon","arcs":[[-1307,-1292,-1284,-1282]],"properties":{"id":"24663249","dp":47225,"de":5161}},{"type":"Polygon","arcs":[[3389,3390,3391,3392,3393]],"properties":{"id":"24663250","dp":12063,"de":3798}},{"type":"Polygon","arcs":[[3394,3395,3396,3397,3398]],"properties":{"id":"24663251","dp":11937,"de":0}},{"type":"Polygon","arcs":[[3399,-1105,-2404,-597,3400]],"properties":{"id":"24663252","dp":26443,"de":1408}},{"type":"Polygon","arcs":[[3401,3402,3403,3404,3405,3406,3407,3408,3409,3410]],"properties":{"id":"24663253","dp":13664,"de":1865}},{"type":"MultiPolygon","arcs":[[[-3274,3411,3412,3413,-3277]],[[3414,-2553,-2556,3415,3416]]],"properties":{"id":"24661203","dp":9063,"de":0}},{"type":"MultiPolygon","arcs":[[[3417,-3236,-3257,-3263,-3265,-3414]],[[3418,-3416,-3239]]],"properties":{"id":"24661204","dp":3052,"de":1081}},{"type":"Polygon","arcs":[[3419,-3240,-2557,-40,-45]],"properties":{"id":"24661205","dp":5939,"de":0}},{"type":"Polygon","arcs":[[-3420,-44,-51,3420,-3241]],"properties":{"id":"24661206","dp":6356,"de":550}},{"type":"Polygon","arcs":[[-53,-64,-3242,-3421]],"properties":{"id":"24661207","dp":10224,"de":0}},{"type":"MultiPolygon","arcs":[[[3421,3422,3423,3424,3425,-3412,-3276,-3270,3426]],[[3427,-2554,-3415,3428]]],"properties":{"id":"24661208","dp":295,"de":1732}},{"type":"Polygon","arcs":[[-3273,-3267,3429,3430,-3365,3431]],"properties":{"id":"24661209","dp":5475,"de":356}},{"type":"Polygon","arcs":[[-3260,3432,-3430]],"properties":{"id":"24661210","dp":15641,"de":0}},{"type":"Polygon","arcs":[[-3431,-3433,-3259,-3362]],"properties":{"id":"24661211","dp":12188,"de":4716}},{"type":"Polygon","arcs":[[3433,3434,-1166,-1180,-1183]],"properties":{"id":"24661212","dp":4038,"de":622}},{"type":"Polygon","arcs":[[3435,3436,3437,3438,3439,3440]],"properties":{"id":"24663269","dp":1061,"de":3255}},{"type":"Polygon","arcs":[[3441,3442,3443,3444,3445,3446,3447,3448,3449]],"properties":{"id":"24663270","dp":7341,"de":307}},{"type":"Polygon","arcs":[[-3408,3450,3451,3452,3453,3454,3455,3456,3457,3458]],"properties":{"id":"24663271","dp":2233,"de":11596}},{"type":"Polygon","arcs":[[-2933,3459,-2937,-2943]],"properties":{"id":"24663273","dp":19587,"de":976}},{"type":"Polygon","arcs":[[-1352,-1354,-2854,3460]],"properties":{"id":"24663274","dp":27500,"de":1973}},{"type":"Polygon","arcs":[[-3020,3461,-3295,-3293,-3294,-212,3462,3463,-3007,-3018]],"properties":{"id":"24663275","dp":4884,"de":10149}},{"type":"Polygon","arcs":[[3464,3465,3466]],"properties":{"id":"24663276","dp":12939,"de":0}},{"type":"Polygon","arcs":[[-152,3467,-3332,-160,-157]],"properties":{"id":"24663209","dp":9659,"de":810}},{"type":"Polygon","arcs":[[-133,-124,-3325,-3333,-3468]],"properties":{"id":"24663210","dp":10178,"de":1002}},{"type":"Polygon","arcs":[[-3331,-243,-2975,-174]],"properties":{"id":"24663211","dp":9648,"de":3079}},{"type":"Polygon","arcs":[[-2184,-2180,3468,3469,3470,3471]],"properties":{"id":"24663288","dp":4980,"de":1679}},{"type":"Polygon","arcs":[[-2895,-2892,3472,-2911,-2899]],"properties":{"id":"24663289","dp":8868,"de":2340}},{"type":"MultiPolygon","arcs":[[[3473,-3030,-3035,-3388,-3382,-3380,-3378,-3039]],[[-3045,-68,-3036,-3032,3474]]],"properties":{"id":"24663290","dp":6596,"de":3206}},{"type":"Polygon","arcs":[[3475,3476]],"properties":{"id":"24663291","dp":16843,"de":0}},{"type":"Polygon","arcs":[[3477,3478,3479,3480,3481,3482,3483,3484,3485,3486,3487,3488]],"properties":{"id":"24663292","dp":424,"de":759}},{"type":"Polygon","arcs":[[3489,3490,3491,3492,3493,3494,3495]],"properties":{"id":"24663293","dp":3039,"de":13093}},{"type":"Polygon","arcs":[[3496,3497,3498,3499,3500,3501]],"properties":{"id":"24663294","dp":3803,"de":0}},{"type":"Polygon","arcs":[[3502,3503,3504,3505]],"properties":{"id":"24663295","dp":3273,"de":1243}},{"type":"Polygon","arcs":[[3506,3507,3508,3509,3510,3511,3512]],"properties":{"id":"24663296","dp":10980,"de":0}},{"type":"Polygon","arcs":[[3513,3514,3515,3516,3517,3518,3519]],"properties":{"id":"24663297","dp":4062,"de":3647}},{"type":"Polygon","arcs":[[3520,-1611,3521,3522]],"properties":{"id":"24663298","dp":10290,"de":431}},{"type":"Polygon","arcs":[[-3134,3523,3524,3525]],"properties":{"id":"24663299","dp":20633,"de":2816}},{"type":"Polygon","arcs":[[3526,-1007,-1014,-1015,-1012,3527]],"properties":{"id":"24663254","dp":8178,"de":1468}},{"type":"Polygon","arcs":[[3528,-3434,-1182,-1185,-1004,-1176,-1005,-3527]],"properties":{"id":"24663255","dp":13213,"de":1348}},{"type":"Polygon","arcs":[[-2151,-2153,-2155,-2148,-2131,-2128,-2118,-1941,3529,3530,3531,-2156]],"properties":{"id":"24663256","dp":2761,"de":842}},{"type":"Polygon","arcs":[[-2914,3532,3533,3534,3535,3536,3537,3538,3539]],"properties":{"id":"24663257","dp":2943,"de":5095}},{"type":"Polygon","arcs":[[3540,3541,3542,3543,3544,-3537]],"properties":{"id":"24663258","dp":19200,"de":5619}},{"type":"Polygon","arcs":[[3545,-2054,-2048,-2059,-2056]],"properties":{"id":"24663259","dp":19775,"de":1810}},{"type":"Polygon","arcs":[[-1816,-2325,3546,3547,-2033,-1820]],"properties":{"id":"24663260","dp":5799,"de":302}},{"type":"Polygon","arcs":[[3548,-943,3549,3550,3551,3552,3553]],"properties":{"id":"24663261","dp":10430,"de":2822}},{"type":"Polygon","arcs":[[3554,3555,3556,3557,3558]],"properties":{"id":"24663262","dp":21363,"de":1420}},{"type":"Polygon","arcs":[[3559,3560,3561,3562]],"properties":{"id":"24663277","dp":11305,"de":1820}},{"type":"Polygon","arcs":[[-993,-1025,-984]],"properties":{"id":"24663278","dp":41141,"de":6974}},{"type":"Polygon","arcs":[[-3472,3563,3564,-2182]],"properties":{"id":"24663279","dp":24677,"de":2263}},{"type":"Polygon","arcs":[[3565,-3470,3566,-2039,-2051]],"properties":{"id":"24663280","dp":5196,"de":4803}},{"type":"Polygon","arcs":[[3567,3568,3569,3570,3571,3572,3573,3574]],"properties":{"id":"24663281","dp":12352,"de":5560}},{"type":"Polygon","arcs":[[3575,-1626,3576,3577,3578,3579,3580,3581,3582,3583]],"properties":{"id":"24663282","dp":403,"de":1720}},{"type":"Polygon","arcs":[[3584,-2255,-2258,-2270,-2263,-2247,-2251]],"properties":{"id":"24663283","dp":14097,"de":2115}},{"type":"Polygon","arcs":[[-1664,3585,3586,3587,-1650,-1655,-1657,3588,-1660]],"properties":{"id":"24663284","dp":5898,"de":454}},{"type":"Polygon","arcs":[[3589,3590,3591,3592,3593,3594,3595]],"properties":{"id":"24663285","dp":4915,"de":722}},{"type":"Polygon","arcs":[[-180,-190,-188]],"properties":{"id":"24663286","dp":14516,"de":3151}},{"type":"Polygon","arcs":[[-840,-186,-837,3596]],"properties":{"id":"24663287","dp":9080,"de":3738}},{"type":"Polygon","arcs":[[3597,-3526,3598,3599]],"properties":{"id":"24663300","dp":4306,"de":7142}},{"type":"Polygon","arcs":[[3600,3601,3602,3603,3604,3605,3606]],"properties":{"id":"24663301","dp":5000,"de":874}},{"type":"Polygon","arcs":[[-3598,3607,3608,-3603,3609,3610,3611,3612,-3130]],"properties":{"id":"24663302","dp":2740,"de":3662}},{"type":"Polygon","arcs":[[-2319,-2314,3613,-3106]],"properties":{"id":"24663304","dp":4222,"de":1674}},{"type":"Polygon","arcs":[[-3614,-2313,-3107]],"properties":{"id":"24663305","dp":11317,"de":0}},{"type":"Polygon","arcs":[[-3182,3614,3615,3616]],"properties":{"id":"24660011","dp":3302,"de":512}},{"type":"Polygon","arcs":[[3617,3618,3619,3620,3621,3622,-1126,3623,-1124,-1133,-3616]],"properties":{"id":"24660012","dp":1821,"de":144}},{"type":"Polygon","arcs":[[3624,-3618,3625]],"properties":{"id":"24660013","dp":5428,"de":0}},{"type":"Polygon","arcs":[[3626,-3621,3627,-3619,-3625]],"properties":{"id":"24660014","dp":4686,"de":0}},{"type":"Polygon","arcs":[[-3620,-3628]],"properties":{"id":"24660015","dp":16000,"de":0}},{"type":"Polygon","arcs":[[-1125,-3624]],"properties":{"id":"24660016","dp":7637,"de":0}},{"type":"Polygon","arcs":[[-3466,3628,-3622,-3627,3629,3630]],"properties":{"id":"24660017","dp":4391,"de":0}},{"type":"Polygon","arcs":[[3631,-3467,3632,3633,3634]],"properties":{"id":"24660020","dp":2240,"de":701}},{"type":"Polygon","arcs":[[3635,-3634,3636,3637]],"properties":{"id":"24660021","dp":11277,"de":0}},{"type":"Polygon","arcs":[[3638,3639,3640,-3638,3641,3642]],"properties":{"id":"24660022","dp":2906,"de":441}},{"type":"Polygon","arcs":[[-3637,-3633,-3631,3643,3644,-3642]],"properties":{"id":"24660023","dp":7629,"de":0}},{"type":"Polygon","arcs":[[-3643,-3645,3645,3646,3647]],"properties":{"id":"24660024","dp":6532,"de":636}},{"type":"Polygon","arcs":[[-3644,-3630,-3626,3648,-3646]],"properties":{"id":"24660025","dp":6474,"de":798}},{"type":"Polygon","arcs":[[-451,3649,-3647,-3649,-3615,-3181,3650]],"properties":{"id":"24660026","dp":3172,"de":5079}},{"type":"Polygon","arcs":[[3651,3652,-3639,-3648,-3650]],"properties":{"id":"24660027","dp":4713,"de":0}},{"type":"Polygon","arcs":[[3653,-3640,-3653,3654,3655]],"properties":{"id":"24660028","dp":5487,"de":0}},{"type":"Polygon","arcs":[[3656,-3656,3657]],"properties":{"id":"24660029","dp":7930,"de":0}},{"type":"MultiPolygon","arcs":[[[3658],[3659],[3660],[3661],[3662]],[[3663]],[[3664]],[[3665]],[[3666]],[[-1202,3667]]],"properties":{"id":"24663335","dp":0,"de":1576}},{"type":"Polygon","arcs":[[3668,3669,3670,3671,3672,3673,3674,3675,3676,3677]],"properties":{"id":"24663336","dp":1743,"de":12924}},{"type":"Polygon","arcs":[[3678,3679,-3675]],"properties":{"id":"24663337","dp":16604,"de":10074}},{"type":"Polygon","arcs":[[3680,3681,3682,3683,3684,3685,3686,-3394]],"properties":{"id":"24663340","dp":0,"de":454}},{"type":"Polygon","arcs":[[3687,3688,3689,3690,3691]],"properties":{"id":"24663341","dp":12943,"de":6012}},{"type":"Polygon","arcs":[[3692,3693,3694,3695,3696,3697,-3692,3698]],"properties":{"id":"24663342","dp":7561,"de":11140}},{"type":"Polygon","arcs":[[-3698,3699,-3688]],"properties":{"id":"24663343","dp":15903,"de":4819}},{"type":"Polygon","arcs":[[3700,3701,-3694,3702,3703]],"properties":{"id":"24663344","dp":13444,"de":19335}},{"type":"Polygon","arcs":[[-3703,-3693,3704,3705]],"properties":{"id":"24663345","dp":33611,"de":9444}},{"type":"Polygon","arcs":[[3706,3707,3708,3709,3710]],"properties":{"id":"24663346","dp":13606,"de":4566}},{"type":"Polygon","arcs":[[-1087,-1270,3711,3712,-3708,3713,3714]],"properties":{"id":"24663347","dp":8468,"de":33829}},{"type":"Polygon","arcs":[[-1089,3715,-3714,-3707,3716]],"properties":{"id":"24663348","dp":36692,"de":3846}},{"type":"Polygon","arcs":[[-3715,-3716,-1088]],"properties":{"id":"24663349","dp":45769,"de":3076}},{"type":"Polygon","arcs":[[-1090,-3717,-3711,3717,-1210]],"properties":{"id":"24663350","dp":15335,"de":17449}},{"type":"Polygon","arcs":[[-3179,3718,3719,3720,3721,3722,3723,3724,3725,3726,-1141,3727]],"properties":{"id":"24660001","dp":2047,"de":233}},{"type":"Polygon","arcs":[[3728,3729,3730,-3725]],"properties":{"id":"24660002","dp":5004,"de":0}},{"type":"Polygon","arcs":[[-3731,3731,-3726]],"properties":{"id":"24660003","dp":5058,"de":0}},{"type":"Polygon","arcs":[[-3724,3732,3733,-3729]],"properties":{"id":"24660004","dp":3438,"de":911}},{"type":"Polygon","arcs":[[3734,3735,-3733,-3723]],"properties":{"id":"24660005","dp":3742,"de":0}},{"type":"Polygon","arcs":[[3736,3737,-3735,-3722]],"properties":{"id":"24660006","dp":5415,"de":0}},{"type":"Polygon","arcs":[[-3730,-3734,-3736,-3738,3738,-1131,3739,-1136,-3727,-3732]],"properties":{"id":"24660007","dp":3336,"de":320}},{"type":"Polygon","arcs":[[-3719,-3617,-1132,-3739,-3737,-3721,3740]],"properties":{"id":"24660008","dp":4464,"de":418}},{"type":"Polygon","arcs":[[-3720,-3741]],"properties":{"id":"24660009","dp":4909,"de":0}},{"type":"Polygon","arcs":[[3741,3742,3743,-3230]],"properties":{"id":"24660089","dp":8651,"de":0}},{"type":"Polygon","arcs":[[3744,-3742,-3229,3745,3746]],"properties":{"id":"24660090","dp":15840,"de":0}},{"type":"Polygon","arcs":[[3747,-3746,-3227,-3218]],"properties":{"id":"24660091","dp":10712,"de":4502}},{"type":"Polygon","arcs":[[3748,3749,3750,-3747,-3748,-3222,-280]],"properties":{"id":"24660092","dp":1236,"de":585}},{"type":"Polygon","arcs":[[3751,3752,-3751,3753]],"properties":{"id":"24660093","dp":7496,"de":915}},{"type":"Polygon","arcs":[[3754,3755,-3745,-3753]],"properties":{"id":"24660094","dp":6199,"de":0}},{"type":"Polygon","arcs":[[-3755,-3752,3756,3757,3758,3759,3760,3761]],"properties":{"id":"24660095","dp":3070,"de":445}},{"type":"Polygon","arcs":[[-3762,3762,-3743,-3756]],"properties":{"id":"24660096","dp":6771,"de":0}},{"type":"Polygon","arcs":[[-3761,3763,3764,-3763]],"properties":{"id":"24660097","dp":8248,"de":0}},{"type":"Polygon","arcs":[[-3228,-3744,-3765,3765,-3215,-3221,-3225]],"properties":{"id":"24660098","dp":4304,"de":432}},{"type":"Polygon","arcs":[[-3766,-3764,3766,3767,3768,3769,3770,-3210,-3216]],"properties":{"id":"24660099","dp":9366,"de":477}},{"type":"Polygon","arcs":[[3771,3772,-3769]],"properties":{"id":"24660100","dp":22663,"de":0}},{"type":"Polygon","arcs":[[3773,3774,3775,3776,3777,3778,-3658,-3655,-3652,-450]],"properties":{"id":"24660030","dp":3590,"de":131}},{"type":"Polygon","arcs":[[-3775,3779]],"properties":{"id":"24660031","dp":6939,"de":0}},{"type":"Polygon","arcs":[[-445,3780,-3776,-3780,-3774,-449]],"properties":{"id":"24660032","dp":5086,"de":0}},{"type":"Polygon","arcs":[[3781,3782,-3777,-3781,-444,-423,3783,3784,3785]],"properties":{"id":"24660033","dp":4427,"de":0}},{"type":"Polygon","arcs":[[-3784,-422,3786]],"properties":{"id":"24660034","dp":4525,"de":0}},{"type":"Polygon","arcs":[[-3785,-3787,-421,3787]],"properties":{"id":"24660035","dp":4877,"de":0}},{"type":"Polygon","arcs":[[3788,-3786,-3788,-420,-1152]],"properties":{"id":"24660036","dp":7800,"de":0}},{"type":"Polygon","arcs":[[3789,3790,3791,3792,3793,3794,3795]],"properties":{"id":"24660458","dp":4152,"de":4725}},{"type":"Polygon","arcs":[[3796,3797,-3278,3798]],"properties":{"id":"24660109","dp":17802,"de":0}},{"type":"Polygon","arcs":[[3799,3800,3801,3802,3803,-3797]],"properties":{"id":"24660110","dp":22450,"de":0}},{"type":"Polygon","arcs":[[-339,3804,3805,-3802,3806]],"properties":{"id":"24660111","dp":18067,"de":0}},{"type":"Polygon","arcs":[[3807,-340,-3807,-3801]],"properties":{"id":"24660112","dp":18508,"de":0}},{"type":"Polygon","arcs":[[-338,3808,-3805]],"properties":{"id":"24660114","dp":23632,"de":0}},{"type":"Polygon","arcs":[[-3809,-337,3809,-3803,-3806]],"properties":{"id":"24660115","dp":16015,"de":0}},{"type":"Polygon","arcs":[[-3810,-336,3810,-262,-357,-355,-3279,-3798,-3804]],"properties":{"id":"24660117","dp":4462,"de":5461}},{"type":"Polygon","arcs":[[-335,3811,3812,-256,-261,-3811]],"properties":{"id":"24660118","dp":9364,"de":2931}},{"type":"Polygon","arcs":[[-334,3813,3814,-3812]],"properties":{"id":"24660119","dp":6607,"de":2031}},{"type":"Polygon","arcs":[[-3815,3815,3816,-265,-257,-3813]],"properties":{"id":"24660120","dp":6476,"de":0}},{"type":"Polygon","arcs":[[3817,3818,3819,-3816,3820,3821]],"properties":{"id":"24660121","dp":8339,"de":1797}},{"type":"Polygon","arcs":[[-3820,3822,3823,-266,-3817]],"properties":{"id":"24660122","dp":11481,"de":0}},{"type":"Polygon","arcs":[[-3819,3824,-3493,3825,3826,-3823]],"properties":{"id":"24660123","dp":3694,"de":0}},{"type":"Polygon","arcs":[[-3827,3827,3828,-267,-3824]],"properties":{"id":"24660124","dp":11609,"de":0}},{"type":"Polygon","arcs":[[-268,-3829,3829,3830,3831]],"properties":{"id":"24660125","dp":13209,"de":1131}},{"type":"Polygon","arcs":[[3832,3833,3834,-3830,-3828,-3826]],"properties":{"id":"24660126","dp":4189,"de":0}},{"type":"Polygon","arcs":[[-3835,3835,3836,3837,-3831]],"properties":{"id":"24660127","dp":6483,"de":773}},{"type":"Polygon","arcs":[[-3832,-3838,3838,-274,-269]],"properties":{"id":"24660128","dp":12889,"de":0}},{"type":"Polygon","arcs":[[-275,-3839,-3837,3839,3840,3841,-277]],"properties":{"id":"24660129","dp":10520,"de":1145}},{"type":"Polygon","arcs":[[-278,-3842,3842,-506]],"properties":{"id":"24660130","dp":9644,"de":3074}},{"type":"Polygon","arcs":[[-3841,3843,3844,3845,3846,-3843]],"properties":{"id":"24660131","dp":12089,"de":2665}},{"type":"Polygon","arcs":[[-3194,3847,3848,3849,3850,-2267]],"properties":{"id":"24660256","dp":4794,"de":1063}},{"type":"Polygon","arcs":[[-3851,3851,3852,-2268]],"properties":{"id":"24660257","dp":8399,"de":0}},{"type":"Polygon","arcs":[[-2269,-3853,3853,3854,3855,-2261]],"properties":{"id":"24660258","dp":4598,"de":2641}},{"type":"Polygon","arcs":[[-3855,3856]],"properties":{"id":"24660259","dp":15089,"de":0}},{"type":"Polygon","arcs":[[3857,3858,-2239,-2262,-3856,-3857,-3854,3859,-1382,3860]],"properties":{"id":"24660260","dp":2424,"de":2400}},{"type":"Polygon","arcs":[[3861,-3858]],"properties":{"id":"24660261","dp":11855,"de":1385}},{"type":"Polygon","arcs":[[3862,-2240,-3859,-3862,-3861,-1381,3863]],"properties":{"id":"24660262","dp":5335,"de":617}},{"type":"Polygon","arcs":[[-1380,3864,3865,-3864]],"properties":{"id":"24660263","dp":9710,"de":826}},{"type":"Polygon","arcs":[[-2229,-2234,-3863,-3866,3866,3867,3868,-2225]],"properties":{"id":"24660264","dp":7393,"de":4612}},{"type":"Polygon","arcs":[[3869,3870,3871,-3868]],"properties":{"id":"24660265","dp":10184,"de":0}},{"type":"Polygon","arcs":[[-2226,-3869,-3872,3872,3873,-1545,-1734,-2021,-2218,-2219,-2223]],"properties":{"id":"24660266","dp":4161,"de":2015}},{"type":"Polygon","arcs":[[3874,-3873,-3871]],"properties":{"id":"24660267","dp":9696,"de":0}},{"type":"Polygon","arcs":[[-3875,-3870,-3867,-3865,3875,-1546,-3874]],"properties":{"id":"24660268","dp":5985,"de":3475}},{"type":"Polygon","arcs":[[-1379,3876,3877,3878,-3876]],"properties":{"id":"24660269","dp":4919,"de":3068}},{"type":"Polygon","arcs":[[-1378,3879,3880,3881,3882,-3877]],"properties":{"id":"24660270","dp":9120,"de":1282}},{"type":"Polygon","arcs":[[3883,3884,-3881,3885]],"properties":{"id":"24660271","dp":9671,"de":0}},{"type":"Polygon","arcs":[[-3882,-3885,3886,3887,3888]],"properties":{"id":"24660272","dp":12573,"de":0}},{"type":"Polygon","arcs":[[-3878,-3883,-3889,3889,3890]],"properties":{"id":"24660273","dp":11016,"de":0}},{"type":"Polygon","arcs":[[-1541,-3879,-3891,3891,-1563,-1555,-1547]],"properties":{"id":"24660274","dp":2558,"de":1977}},{"type":"Polygon","arcs":[[-696,-105,-1063,-1069,-1070,-1082]],"properties":{"id":"24660779","dp":9027,"de":2188}},{"type":"Polygon","arcs":[[3892,3893,-1071,-1067,-1065]],"properties":{"id":"24660780","dp":7729,"de":0}},{"type":"Polygon","arcs":[[3894,3895,-3893,3896]],"properties":{"id":"24660781","dp":4710,"de":550}},{"type":"Polygon","arcs":[[3897,3898,3899,3900,-1052,3901,-3112,3902,-3895]],"properties":{"id":"24660783","dp":4526,"de":1025}},{"type":"Polygon","arcs":[[-326,3903,-489,3904,-481,3905,3906]],"properties":{"id":"24660058","dp":474,"de":381}},{"type":"Polygon","arcs":[[-3906,-476,-463,-454,3907]],"properties":{"id":"24660059","dp":4875,"de":1197}},{"type":"Polygon","arcs":[[-498,-482,-3905]],"properties":{"id":"24660060","dp":2995,"de":2623}},{"type":"Polygon","arcs":[[-328,-323,3908,-490,-3904,-325]],"properties":{"id":"24660061","dp":9766,"de":833}},{"type":"Polygon","arcs":[[3909,-491,-3909,-318]],"properties":{"id":"24660062","dp":7499,"de":0}},{"type":"Polygon","arcs":[[3910,-492,-3910,-317]],"properties":{"id":"24660063","dp":10650,"de":0}},{"type":"Polygon","arcs":[[3911,3912,-493,-3911,-316,3913]],"properties":{"id":"24660064","dp":8991,"de":0}},{"type":"Polygon","arcs":[[-313,3914,-3914,-315]],"properties":{"id":"24660065","dp":13836,"de":0}},{"type":"Polygon","arcs":[[3915,3916,3917,-3912,-3915,3918]],"properties":{"id":"24660066","dp":6968,"de":834}},{"type":"Polygon","arcs":[[3919,-494,-3913,-3918]],"properties":{"id":"24660067","dp":7838,"de":0}},{"type":"Polygon","arcs":[[3920,-495,-3920,-3917,3921]],"properties":{"id":"24660068","dp":8108,"de":844}},{"type":"Polygon","arcs":[[3922,3923,3924,-3922,-3916]],"properties":{"id":"24660069","dp":10914,"de":4850}},{"type":"Polygon","arcs":[[-312,3925,3926,3927,-3923,-3919]],"properties":{"id":"24660070","dp":11619,"de":1190}},{"type":"Polygon","arcs":[[-308,3928,3929,-3926,-311]],"properties":{"id":"24660071","dp":10212,"de":0}},{"type":"Polygon","arcs":[[-657,3930,-3927,-3930,3931]],"properties":{"id":"24660072","dp":10846,"de":1476}},{"type":"Polygon","arcs":[[-299,-305,3932,-654,-3932,-3929,-307]],"properties":{"id":"24660073","dp":4275,"de":574}},{"type":"Polygon","arcs":[[3933,3934,-653,-3933,-304]],"properties":{"id":"24660074","dp":8286,"de":1582}},{"type":"Polygon","arcs":[[3935,3936,3937,-3934,-303]],"properties":{"id":"24660075","dp":5793,"de":672}},{"type":"Polygon","arcs":[[3938,3939,-647,-3935,-3938]],"properties":{"id":"24660076","dp":6507,"de":902}},{"type":"Polygon","arcs":[[3940,-638,-641,-645,-3940,3941]],"properties":{"id":"24660077","dp":6005,"de":0}},{"type":"Polygon","arcs":[[3942,3943,-3942,-3939,-3937,3944]],"properties":{"id":"24660078","dp":6475,"de":0}},{"type":"Polygon","arcs":[[-3773,3945,-639,-3941,-3944,3946,-3770]],"properties":{"id":"24660079","dp":3312,"de":756}},{"type":"Polygon","arcs":[[-3947,-3943,3947,-3211,-3771]],"properties":{"id":"24660080","dp":9645,"de":0}},{"type":"Polygon","arcs":[[-3948,-3945,-3936,-302,-3212]],"properties":{"id":"24660081","dp":6897,"de":1705}},{"type":"Polygon","arcs":[[-3772,-3768,3948,3949,-632,-636,-3946]],"properties":{"id":"24660101","dp":3859,"de":1078}},{"type":"Polygon","arcs":[[-3121,-627,-633,-3950,3950]],"properties":{"id":"24660102","dp":3071,"de":604}},{"type":"Polygon","arcs":[[-3951,-3949,-3767,-3760,3951]],"properties":{"id":"24660103","dp":4091,"de":0}},{"type":"Polygon","arcs":[[-3759,3952,-3484,3953,3954,3955,3956,3957,3958,-353,-350,-341,-3120,-3952]],"properties":{"id":"24660104","dp":968,"de":1344}},{"type":"Polygon","arcs":[[3959,-3280,-351,-3959]],"properties":{"id":"24660107","dp":14011,"de":0}},{"type":"Polygon","arcs":[[3960,3961,3962,3963]],"properties":{"id":"24660564","dp":5572,"de":412}},{"type":"Polygon","arcs":[[3964,3965,-3964,3966,3967,3968,3969,3970]],"properties":{"id":"24660565","dp":5712,"de":0}},{"type":"Polygon","arcs":[[3971,3972,3973,3974,-3967,3975]],"properties":{"id":"24660566","dp":3902,"de":1012}},{"type":"Polygon","arcs":[[3976,-3968,-3975]],"properties":{"id":"24660567","dp":10783,"de":1546}},{"type":"Polygon","arcs":[[-3974,3977,3978,-3969,-3977]],"properties":{"id":"24660568","dp":10551,"de":0}},{"type":"Polygon","arcs":[[-3973,3979,3980,3981,-3978]],"properties":{"id":"24660569","dp":8966,"de":0}},{"type":"Polygon","arcs":[[-3845,3982,-1770,-1953,3983,3984]],"properties":{"id":"24660132","dp":12459,"de":0}},{"type":"Polygon","arcs":[[-3985,3985,-3846]],"properties":{"id":"24660133","dp":12254,"de":0}},{"type":"Polygon","arcs":[[-507,-3847,-3986,-3984,-1952,-1949,3986,3987]],"properties":{"id":"24660134","dp":2753,"de":849}},{"type":"Polygon","arcs":[[-3987,-1948,3988,3989]],"properties":{"id":"24660135","dp":10378,"de":0}},{"type":"Polygon","arcs":[[3990,-3989,-1947,3991]],"properties":{"id":"24660136","dp":13547,"de":0}},{"type":"Polygon","arcs":[[-3992,-1946,3992,3993]],"properties":{"id":"24660137","dp":12757,"de":0}},{"type":"Polygon","arcs":[[-3993,-1927,3994]],"properties":{"id":"24660138","dp":23147,"de":758}},{"type":"Polygon","arcs":[[3995,-3995,-1945,-606]],"properties":{"id":"24660139","dp":6485,"de":3954}},{"type":"Polygon","arcs":[[-508,-3988,-3990,-3991,-3994,-3996]],"properties":{"id":"24660140","dp":12885,"de":1179}},{"type":"Polygon","arcs":[[3996,3997,3998,3999,4000,4001]],"properties":{"id":"24660598","dp":4539,"de":2885}},{"type":"Polygon","arcs":[[-3191,-1910,-1907,-1882,4002,-3848,-3193]],"properties":{"id":"24660364","dp":5171,"de":4040}},{"type":"Polygon","arcs":[[-3849,-4003,-1881,4003]],"properties":{"id":"24660365","dp":12324,"de":3944}},{"type":"Polygon","arcs":[[-3850,-4004,-1880,4004,4005,-1374,-3860,-3852]],"properties":{"id":"24660366","dp":5486,"de":2006}},{"type":"Polygon","arcs":[[-1879,4006,4007,4008,4009,-4005]],"properties":{"id":"24660367","dp":12082,"de":879}},{"type":"Polygon","arcs":[[-4006,-4010,4010,4011,-1362,-1375]],"properties":{"id":"24660368","dp":13387,"de":1254}},{"type":"Polygon","arcs":[[4012,4013,-4011,-4009]],"properties":{"id":"24660369","dp":19425,"de":0}},{"type":"Polygon","arcs":[[4014,4015,-1367,-4012,-4014]],"properties":{"id":"24660370","dp":26294,"de":6696}},{"type":"Polygon","arcs":[[-4013,-4008,4016,4017,-4015]],"properties":{"id":"24660371","dp":15693,"de":0}},{"type":"Polygon","arcs":[[-4007,-1878,4018,4019,-4017]],"properties":{"id":"24660372","dp":12250,"de":833}},{"type":"Polygon","arcs":[[-4018,-4020,4020,4021,4022,-4016]],"properties":{"id":"24660373","dp":13591,"de":892}},{"type":"Polygon","arcs":[[-1368,-4023,4023,4024]],"properties":{"id":"24660374","dp":15451,"de":0}},{"type":"Polygon","arcs":[[4025,4026,4027,4028,-4024,-4022]],"properties":{"id":"24660375","dp":17118,"de":0}},{"type":"Polygon","arcs":[[-4025,-4029,4029,-1369]],"properties":{"id":"24660376","dp":10732,"de":0}},{"type":"Polygon","arcs":[[4030,4031,4032,-1370,-4030,4033]],"properties":{"id":"24660377","dp":16050,"de":0}},{"type":"Polygon","arcs":[[4034,4035,-4032,4036]],"properties":{"id":"24660378","dp":16162,"de":0}},{"type":"Polygon","arcs":[[-4035,4037,4038,4039]],"properties":{"id":"24660379","dp":13517,"de":0}},{"type":"Polygon","arcs":[[-4031,4040,4041,4042,-4038,-4037]],"properties":{"id":"24660380","dp":14898,"de":0}},{"type":"Polygon","arcs":[[-4039,-4043,4043,4044,4045]],"properties":{"id":"24660381","dp":14686,"de":1174}},{"type":"Polygon","arcs":[[-4042,4046,4047,4048,-4044]],"properties":{"id":"24660382","dp":10102,"de":0}},{"type":"Polygon","arcs":[[4049,4050,-4049,4051,4052]],"properties":{"id":"24660383","dp":9879,"de":1982}},{"type":"Polygon","arcs":[[-4053,4053,4054,4055]],"properties":{"id":"24660384","dp":10290,"de":0}},{"type":"Polygon","arcs":[[-4052,4056,-1668,4057,4058,4059,4060,-4054]],"properties":{"id":"24660385","dp":4564,"de":788}},{"type":"Polygon","arcs":[[4061,-4055,-4061,4062]],"properties":{"id":"24660386","dp":6116,"de":0}},{"type":"Polygon","arcs":[[-1565,4063,-4063,-4060,4064,4065]],"properties":{"id":"24660387","dp":3554,"de":0}},{"type":"Polygon","arcs":[[-4050,-4056,-4062,-4064,-1564,4066]],"properties":{"id":"24660388","dp":7447,"de":2180}},{"type":"Polygon","arcs":[[4067,4068,-4045,-4051,-4067,-3892,-3890,-3888,4069]],"properties":{"id":"24660389","dp":3721,"de":3940}},{"type":"Polygon","arcs":[[4070,4071,-4070,-3887,-3884]],"properties":{"id":"24660390","dp":9086,"de":0}},{"type":"Polygon","arcs":[[4072,-4068,-4072,4073]],"properties":{"id":"24660391","dp":9632,"de":0}},{"type":"Polygon","arcs":[[-3880,-1377,4074,4075,-4074,-4071,-3886]],"properties":{"id":"24660392","dp":5027,"de":3240}},{"type":"Polygon","arcs":[[-1372,-1365,4076,-4075,-1376]],"properties":{"id":"24660393","dp":9076,"de":1988}},{"type":"Polygon","arcs":[[-4076,-4077,-1364,-1371,-4033,-4036,-4040,-4046,-4069,-4073]],"properties":{"id":"24660394","dp":4090,"de":1463}},{"type":"Polygon","arcs":[[4077,4078,-689,4079,4080,4081]],"properties":{"id":"24660166","dp":5356,"de":515}},{"type":"Polygon","arcs":[[4082,4083,-4081,4084,4085]],"properties":{"id":"24660167","dp":16198,"de":1033}},{"type":"Polygon","arcs":[[4086,-4086,4087,4088]],"properties":{"id":"24660168","dp":4927,"de":671}},{"type":"Polygon","arcs":[[4089,4090,4091,-4088,4092,4093]],"properties":{"id":"24660169","dp":3152,"de":935}},{"type":"Polygon","arcs":[[-4085,-4080,-688,4094,4095,-4093]],"properties":{"id":"24660170","dp":7031,"de":0}},{"type":"Polygon","arcs":[[-1566,-4066,4096,-1653,-1645,4097]],"properties":{"id":"24660399","dp":3414,"de":0}},{"type":"Polygon","arcs":[[-1567,-4098,-1644,-1642,-1635,-1634,-1631,-1435,-1433,-1431,-1570]],"properties":{"id":"24660400","dp":2100,"de":575}},{"type":"Polygon","arcs":[[4098,4099,4100]],"properties":{"id":"24660423","dp":23730,"de":0}},{"type":"Polygon","arcs":[[4101,4102,4103,-4099,4104]],"properties":{"id":"24660424","dp":15945,"de":1718}},{"type":"Polygon","arcs":[[4105,4106,-4102,4107]],"properties":{"id":"24660425","dp":18770,"de":1495}},{"type":"Polygon","arcs":[[4108,4109,-4106,4110]],"properties":{"id":"24660426","dp":17269,"de":0}},{"type":"Polygon","arcs":[[4111,4112,4113,-4109]],"properties":{"id":"24660427","dp":17706,"de":0}},{"type":"Polygon","arcs":[[4114,4115,4116,-4113]],"properties":{"id":"24660428","dp":27773,"de":0}},{"type":"Polygon","arcs":[[4117,-4116,4118,4119]],"properties":{"id":"24660429","dp":23579,"de":0}},{"type":"Polygon","arcs":[[4120,-4120,4121,4122]],"properties":{"id":"24660430","dp":16882,"de":0}},{"type":"Polygon","arcs":[[-4123,4123,4124]],"properties":{"id":"24660431","dp":14984,"de":0}},{"type":"Polygon","arcs":[[4125,4126,4127,4128,-4124]],"properties":{"id":"24660432","dp":10350,"de":0}},{"type":"Polygon","arcs":[[4129,4130,-4128,4131]],"properties":{"id":"24660433","dp":17389,"de":1174}},{"type":"Polygon","arcs":[[4132,4133,-4130,4134]],"properties":{"id":"24660434","dp":16356,"de":0}},{"type":"Polygon","arcs":[[4135,4136,4137,-4133]],"properties":{"id":"24660435","dp":15329,"de":3708}},{"type":"Polygon","arcs":[[4138,4139,4140,4141,-4137,4142]],"properties":{"id":"24660436","dp":10709,"de":4233}},{"type":"Polygon","arcs":[[4143,4144,-4140,4145]],"properties":{"id":"24660437","dp":22179,"de":0}},{"type":"Polygon","arcs":[[4146,4147,-4144,4148]],"properties":{"id":"24660438","dp":25625,"de":3750}},{"type":"Polygon","arcs":[[4149,4150,-4147,4151]],"properties":{"id":"24660439","dp":20000,"de":6140}},{"type":"Polygon","arcs":[[4152,4153,-3792,4154,4155]],"properties":{"id":"24660459","dp":17007,"de":2068}},{"type":"Polygon","arcs":[[4156,4157,4158,-4153,4159]],"properties":{"id":"24660460","dp":18172,"de":0}},{"type":"Polygon","arcs":[[4160,4161,-4154,-4159]],"properties":{"id":"24660461","dp":15100,"de":1507}},{"type":"Polygon","arcs":[[4162,4163,4164,-4161,-4158,4165]],"properties":{"id":"24660462","dp":15151,"de":1377}},{"type":"Polygon","arcs":[[4166,4167,-4163,4168]],"properties":{"id":"24660463","dp":19042,"de":2816}},{"type":"Polygon","arcs":[[4169,4170,-4167,4171]],"properties":{"id":"24660464","dp":15386,"de":2743}},{"type":"Polygon","arcs":[[4172,4173,4174,-4170,4175]],"properties":{"id":"24660465","dp":13896,"de":1558}},{"type":"Polygon","arcs":[[4176,4177,-4173,4178]],"properties":{"id":"24660466","dp":14131,"de":3443}},{"type":"Polygon","arcs":[[4179,-4179,4180,4181]],"properties":{"id":"24660467","dp":11898,"de":7365}},{"type":"Polygon","arcs":[[-4181,-4176,4182,4183]],"properties":{"id":"24660468","dp":16944,"de":2146}},{"type":"Polygon","arcs":[[-4183,-4172,4184,4185]],"properties":{"id":"24660469","dp":12219,"de":2682}},{"type":"Polygon","arcs":[[-4185,-4169,4186,4187]],"properties":{"id":"24660470","dp":17717,"de":6929}},{"type":"Polygon","arcs":[[-4187,-4166,-4157,4188,4189]],"properties":{"id":"24660471","dp":14788,"de":2380}},{"type":"Polygon","arcs":[[4190,-4190,4191,4192,4193]],"properties":{"id":"24660472","dp":17818,"de":3541}},{"type":"Polygon","arcs":[[4194,-4188,-4191,4195,4196]],"properties":{"id":"24660473","dp":17999,"de":3150}},{"type":"Polygon","arcs":[[4197,-4186,-4195,4198,4199]],"properties":{"id":"24660474","dp":15870,"de":3233}},{"type":"Polygon","arcs":[[4200,-4184,-4198,4201]],"properties":{"id":"24660475","dp":12894,"de":3617}},{"type":"Polygon","arcs":[[-3683,-4182,-4201,4202]],"properties":{"id":"24660476","dp":17076,"de":7748}},{"type":"Polygon","arcs":[[4203,-4180,-3682]],"properties":{"id":"24660478","dp":4474,"de":4523}},{"type":"Polygon","arcs":[[-4177,-4204,-3681,4204,4205,4206,4207,4208,4209]],"properties":{"id":"24660479","dp":1370,"de":9509}},{"type":"Polygon","arcs":[[-4209,4210,4211,-504,-511,4212]],"properties":{"id":"24660480","dp":5733,"de":3267}},{"type":"Polygon","arcs":[[4213,4214,-4212]],"properties":{"id":"24660481","dp":12109,"de":1734}},{"type":"Polygon","arcs":[[4215,-4214,4216]],"properties":{"id":"24660482","dp":16749,"de":4489}},{"type":"Polygon","arcs":[[4217,4218,4219,-505,-4215,-4216,4220]],"properties":{"id":"24660483","dp":5110,"de":940}},{"type":"Polygon","arcs":[[-3898,-3897,-1064,-1060,4221]],"properties":{"id":"24660784","dp":3202,"de":407}},{"type":"Polygon","arcs":[[-1055,-1053,-3901,4222,-3899,-4222,-1059]],"properties":{"id":"24660785","dp":3121,"de":559}},{"type":"Polygon","arcs":[[-3900,-4223]],"properties":{"id":"24660786","dp":3672,"de":491}},{"type":"Polygon","arcs":[[-1050,-2008,-2177,4223,-3902]],"properties":{"id":"24660787","dp":3514,"de":355}},{"type":"Polygon","arcs":[[-4065,-4059,4224,-1656,-1648,-4097]],"properties":{"id":"24660401","dp":3324,"de":913}},{"type":"Polygon","arcs":[[-4225,-4058,-1667,-1661,-3589,-1658]],"properties":{"id":"24660402","dp":12199,"de":0}},{"type":"Polygon","arcs":[[-1675,-1671,-1670,-4057,-4048,4225]],"properties":{"id":"24660403","dp":3108,"de":1372}},{"type":"Polygon","arcs":[[-4028,4226,4227,-4226,-4047,-4041,-4034]],"properties":{"id":"24660404","dp":5442,"de":0}},{"type":"Polygon","arcs":[[4228,-1690,-1678,-1676,-4228,4229]],"properties":{"id":"24660405","dp":15799,"de":0}},{"type":"Polygon","arcs":[[4230,-4230,-4227,-4027]],"properties":{"id":"24660406","dp":10615,"de":1538}},{"type":"Polygon","arcs":[[-4026,4231,4232,-1686,-4229,-4231]],"properties":{"id":"24660407","dp":13564,"de":0}},{"type":"Polygon","arcs":[[4233,4234,4235,-1698,-1691,-1687,-4233]],"properties":{"id":"24660408","dp":18621,"de":0}},{"type":"Polygon","arcs":[[4236,4237,-4235,4238]],"properties":{"id":"24660409","dp":22556,"de":0}},{"type":"Polygon","arcs":[[-1877,-4239,-4234,-4232,-4021,-4019]],"properties":{"id":"24660410","dp":6211,"de":1941}},{"type":"Polygon","arcs":[[4239,-1699,-4236,-4238]],"properties":{"id":"24660411","dp":21674,"de":3167}},{"type":"Polygon","arcs":[[-1847,-1838,-1834,-1831,-1702,-1700,-1695,-4240,-4237,-1876]],"properties":{"id":"24660412","dp":1516,"de":947}},{"type":"Polygon","arcs":[[4240,4241,4242,4243,-1897,-1904,4244]],"properties":{"id":"24660413","dp":7629,"de":3237}},{"type":"Polygon","arcs":[[4245,4246,-1898,-4244]],"properties":{"id":"24660414","dp":13892,"de":0}},{"type":"Polygon","arcs":[[4247,4248,-1893,-1899,-4247,4249]],"properties":{"id":"24660415","dp":7452,"de":1071}},{"type":"Polygon","arcs":[[4250,4251,4252,4253,4254,-4248]],"properties":{"id":"24660416","dp":8088,"de":0}},{"type":"Polygon","arcs":[[4255,4256,4257,-4252,4258]],"properties":{"id":"24660417","dp":8397,"de":1217}},{"type":"Polygon","arcs":[[4259,4260,-4253,-4258]],"properties":{"id":"24660418","dp":7408,"de":0}},{"type":"Polygon","arcs":[[4261,4262,4263,4264,-4260,-4257]],"properties":{"id":"24660419","dp":4079,"de":789}},{"type":"Polygon","arcs":[[4265,4266,-4264,4267]],"properties":{"id":"24660420","dp":17323,"de":0}},{"type":"Polygon","arcs":[[4268,-4268,-4263,4269,4270]],"properties":{"id":"24660421","dp":16531,"de":1219}},{"type":"Polygon","arcs":[[4271,-4100,-4104,4272,-4269]],"properties":{"id":"24660422","dp":15726,"de":0}},{"type":"MultiPolygon","arcs":[[[4273,4274,-2460,-2466,4275,4276,4277,4278,4279,4280]],[[4281,4282]]],"properties":{"id":"24660926","dp":6773,"de":0}},{"type":"Polygon","arcs":[[4283,4284,-2461,-4275]],"properties":{"id":"24660927","dp":7585,"de":0}},{"type":"Polygon","arcs":[[4285,-2467,-2462,-4285]],"properties":{"id":"24660928","dp":8019,"de":0}},{"type":"Polygon","arcs":[[4286,-3401,-596,4287,-3477,4288,4289]],"properties":{"id":"24660518","dp":15000,"de":563}},{"type":"Polygon","arcs":[[4290,4291,4292,4293,4294,4295]],"properties":{"id":"24660525","dp":12410,"de":0}},{"type":"Polygon","arcs":[[4296,4297,-4150,4298]],"properties":{"id":"24660440","dp":14646,"de":0}},{"type":"Polygon","arcs":[[4299,4300,-4297,4301]],"properties":{"id":"24660441","dp":18742,"de":3459}},{"type":"Polygon","arcs":[[4302,4303,-4300,4304]],"properties":{"id":"24660442","dp":16552,"de":1709}},{"type":"Polygon","arcs":[[-3685,4305,-4303,4306]],"properties":{"id":"24660443","dp":15920,"de":4447}},{"type":"Polygon","arcs":[[-3684,-4203,4307,-4306]],"properties":{"id":"24660444","dp":14444,"de":7834}},{"type":"Polygon","arcs":[[-4308,-4202,4308,-4304]],"properties":{"id":"24660445","dp":16717,"de":2671}},{"type":"Polygon","arcs":[[-4309,-4200,4309,-4301]],"properties":{"id":"24660446","dp":17611,"de":0}},{"type":"Polygon","arcs":[[-4310,-4199,4310,-4298]],"properties":{"id":"24660447","dp":17577,"de":2863}},{"type":"Polygon","arcs":[[-4311,-4197,4311,-4151]],"properties":{"id":"24660448","dp":22538,"de":6735}},{"type":"Polygon","arcs":[[-4312,-4196,4312,-4148]],"properties":{"id":"24660449","dp":20333,"de":2500}},{"type":"Polygon","arcs":[[-4313,-4194,4313,-4141,-4145]],"properties":{"id":"24660450","dp":15549,"de":1126}},{"type":"Polygon","arcs":[[-4142,-4314,-4193,4314,4315]],"properties":{"id":"24660451","dp":14132,"de":2739}},{"type":"Polygon","arcs":[[-4316,4316,-4138]],"properties":{"id":"24660452","dp":13869,"de":1636}},{"type":"Polygon","arcs":[[-4134,-4317,4317,4318,4319]],"properties":{"id":"24660453","dp":8690,"de":1719}},{"type":"Polygon","arcs":[[-4192,4320,-4318,-4315]],"properties":{"id":"24660454","dp":13194,"de":4027}},{"type":"Polygon","arcs":[[-4189,-4160,4321,-4321]],"properties":{"id":"24660455","dp":11069,"de":3323}},{"type":"Polygon","arcs":[[-4322,-4156,4322,-3790,-4319]],"properties":{"id":"24660456","dp":15204,"de":1656}},{"type":"Polygon","arcs":[[-4155,-3791,-4323]],"properties":{"id":"24660457","dp":13793,"de":2387}},{"type":"Polygon","arcs":[[-2655,-2639,-2632,4323,4324,4325,-2490,-2484,-2657]],"properties":{"id":"24660952","dp":2107,"de":2644}},{"type":"Polygon","arcs":[[4326,4327,4328,-3982]],"properties":{"id":"24660570","dp":22280,"de":3947}},{"type":"Polygon","arcs":[[4329,4330,4331,-4327]],"properties":{"id":"24660571","dp":32237,"de":0}},{"type":"Polygon","arcs":[[4332,4333,4334,4335,4336,-4331,4337]],"properties":{"id":"24660572","dp":13214,"de":0}},{"type":"Polygon","arcs":[[4338,4339,4340,4341,4342]],"properties":{"id":"24660576","dp":15705,"de":0}},{"type":"Polygon","arcs":[[-4340,4343,4344]],"properties":{"id":"24660577","dp":7985,"de":0}},{"type":"Polygon","arcs":[[4345,4346,4347,-4342,4348,4349]],"properties":{"id":"24660578","dp":4970,"de":3345}},{"type":"Polygon","arcs":[[4350,4351,-4349]],"properties":{"id":"24660579","dp":14097,"de":4768}},{"type":"Polygon","arcs":[[4352,-4350,-4352,4353,4354]],"properties":{"id":"24660580","dp":4554,"de":1508}},{"type":"Polygon","arcs":[[4355,4356,4357,4358,4359,4360]],"properties":{"id":"24660581","dp":5580,"de":2961}},{"type":"Polygon","arcs":[[4361,4362,4363,-4356,4364]],"properties":{"id":"24660582","dp":11443,"de":1012}},{"type":"Polygon","arcs":[[4365,-4365,-4361,4366,4367]],"properties":{"id":"24660583","dp":10212,"de":5418}},{"type":"Polygon","arcs":[[4368,4369,4370,-4362,-4366,4371]],"properties":{"id":"24660584","dp":5052,"de":862}},{"type":"Polygon","arcs":[[4372,-4372,-4368,4373,4374,4375,4376]],"properties":{"id":"24660585","dp":4741,"de":2181}},{"type":"Polygon","arcs":[[4377,-4221,-4217,-4211,-4208]],"properties":{"id":"24660484","dp":10803,"de":2362}},{"type":"Polygon","arcs":[[-4207,4378,4379,-4218,-4378]],"properties":{"id":"24660485","dp":5224,"de":6205}},{"type":"Polygon","arcs":[[-575,-512,-500,4380,4381,-4380,4382]],"properties":{"id":"24660486","dp":1819,"de":13159}},{"type":"Polygon","arcs":[[-4382,4383,-4219]],"properties":{"id":"24660487","dp":15706,"de":2077}},{"type":"Polygon","arcs":[[-4384,-4381,-499,-4220]],"properties":{"id":"24660488","dp":12904,"de":919}},{"type":"Polygon","arcs":[[4384,-2704,-2706,-2458,-2413]],"properties":{"id":"24660979","dp":9222,"de":2208}},{"type":"Polygon","arcs":[[-2702,-2705,-4385,-2412]],"properties":{"id":"24660980","dp":10359,"de":0}},{"type":"Polygon","arcs":[[4385,4386,4387,-3999]],"properties":{"id":"24660599","dp":6274,"de":0}},{"type":"Polygon","arcs":[[-4388,4388,4389,4390,-4000]],"properties":{"id":"24660600","dp":5620,"de":5057}},{"type":"Polygon","arcs":[[-4390,4391,4392,-3123,4393]],"properties":{"id":"24660601","dp":7892,"de":2229}},{"type":"Polygon","arcs":[[4394,-4392,-4389,4395,4396,4397]],"properties":{"id":"24660602","dp":4270,"de":5729}},{"type":"Polygon","arcs":[[4398,4399,-4396,-4387,4400]],"properties":{"id":"24660603","dp":4420,"de":1462}},{"type":"Polygon","arcs":[[-4400,4401,4402,-4397]],"properties":{"id":"24660604","dp":6686,"de":0}},{"type":"Polygon","arcs":[[-4374,-4367,-4360,-4355,4403,4404,-4402,-4399,4405]],"properties":{"id":"24660605","dp":2946,"de":5468}},{"type":"Polygon","arcs":[[-4375,-4406,-4401,-4386,4406]],"properties":{"id":"24660606","dp":3811,"de":1411}},{"type":"Polygon","arcs":[[4407,-4001,-4391,-4394,-3122,4408,4409,4410]],"properties":{"id":"24660607","dp":2848,"de":7381}},{"type":"Polygon","arcs":[[4411,4412,-3116,4413,4414,-4411,-941,-934,-932]],"properties":{"id":"24660608","dp":463,"de":5260}},{"type":"Polygon","arcs":[[4415,4416,-4412,-931,-3119]],"properties":{"id":"24660609","dp":2641,"de":2531}},{"type":"Polygon","arcs":[[-3117,-4413,-4417,4417]],"properties":{"id":"24660610","dp":2666,"de":14393}},{"type":"Polygon","arcs":[[-4418,-4416,-3118]],"properties":{"id":"24660611","dp":16222,"de":7040}},{"type":"Polygon","arcs":[[4418,-1080,-3109,-2938,4419]],"properties":{"id":"24660613","dp":3786,"de":4147}},{"type":"Polygon","arcs":[[4420,-4419,4421]],"properties":{"id":"24660614","dp":12644,"de":8510}},{"type":"Polygon","arcs":[[-3460,4422,-4422,-4420]],"properties":{"id":"24660615","dp":27462,"de":0}},{"type":"Polygon","arcs":[[-4224,-2183,-3565,4423,-2061,4424,4425,-3113]],"properties":{"id":"24660788","dp":7484,"de":1600}},{"type":"Polygon","arcs":[[-2050,-2055,-3546,4426,-3564,-3471,-3566]],"properties":{"id":"24660794","dp":4439,"de":2791}},{"type":"Polygon","arcs":[[4427,-2040,-3567,4428]],"properties":{"id":"24660797","dp":5200,"de":1235}},{"type":"Polygon","arcs":[[4429,-4429,-3469,-2193]],"properties":{"id":"24660798","dp":6746,"de":0}},{"type":"Polygon","arcs":[[4430,4431,-4430,-2196]],"properties":{"id":"24660799","dp":7162,"de":0}},{"type":"Polygon","arcs":[[4432,-2041,-4428,-4432]],"properties":{"id":"24660800","dp":6923,"de":729}},{"type":"Polygon","arcs":[[4433,-2042,-4433,4434]],"properties":{"id":"24660801","dp":4749,"de":426}},{"type":"Polygon","arcs":[[4435,4436,-4435,-4431,-2195,4437]],"properties":{"id":"24660802","dp":4322,"de":481}},{"type":"Polygon","arcs":[[4438,-2043,-4434,-4437]],"properties":{"id":"24660803","dp":4712,"de":517}},{"type":"Polygon","arcs":[[4439,4440,-2026,-2036,-4439,-4436,4441]],"properties":{"id":"24660804","dp":745,"de":55}},{"type":"Polygon","arcs":[[4442,-4440,4443]],"properties":{"id":"24660805","dp":8888,"de":0}},{"type":"Polygon","arcs":[[-4444,-4442,-4438,-2194,4444]],"properties":{"id":"24660806","dp":4068,"de":648}},{"type":"Polygon","arcs":[[4445,4446,4447,-3530,-1940,-2027,-4441,-4443,-4445,-2189,-2203,-2208,4448]],"properties":{"id":"24660807","dp":3586,"de":559}},{"type":"Polygon","arcs":[[4449,-4446]],"properties":{"id":"24660808","dp":3833,"de":0}},{"type":"Polygon","arcs":[[-3532,4450,-4447,-4450,-4449,-2207,-2209,-2162,-2157]],"properties":{"id":"24660809","dp":5176,"de":880}},{"type":"Polygon","arcs":[[-4448,-4451,-3531]],"properties":{"id":"24660810","dp":4575,"de":0}},{"type":"Polygon","arcs":[[4451,4452,-1359]],"properties":{"id":"24661311","dp":32867,"de":0}},{"type":"Polygon","arcs":[[4453,4454,4455,-2852,-4453]],"properties":{"id":"24661312","dp":10645,"de":1794}},{"type":"Polygon","arcs":[[-2788,-2941,4456,4457,-2846,-4456,4458]],"properties":{"id":"24661313","dp":2863,"de":2616}},{"type":"Polygon","arcs":[[-4459,-4455,4459,-2794]],"properties":{"id":"24661314","dp":37951,"de":0}},{"type":"Polygon","arcs":[[4460,4461,-4460,-4454,-4452]],"properties":{"id":"24661315","dp":34814,"de":0}},{"type":"Polygon","arcs":[[-2784,-2790,-2795,-4462,4462]],"properties":{"id":"24661316","dp":22947,"de":4736}},{"type":"Polygon","arcs":[[-2948,-2782,-4463,-4461,-1357,-2798,-2823]],"properties":{"id":"24661317","dp":3828,"de":0}},{"type":"Polygon","arcs":[[-701,-720,-778,-2318]],"properties":{"id":"24660901","dp":10963,"de":0}},{"type":"Polygon","arcs":[[4463,4464,4465,4466,-755,-729,-727,4467]],"properties":{"id":"24660902","dp":5807,"de":6610}},{"type":"Polygon","arcs":[[4468,4469,-4464,4470]],"properties":{"id":"24660903","dp":12154,"de":0}},{"type":"Polygon","arcs":[[4471,4472,4473,-4465,-4470]],"properties":{"id":"24660904","dp":11378,"de":3372}},{"type":"Polygon","arcs":[[-4295,4474,4475,4476,4477]],"properties":{"id":"24660526","dp":10221,"de":968}},{"type":"Polygon","arcs":[[4478,4479,-4477,4480,4481]],"properties":{"id":"24660530","dp":11022,"de":936}},{"type":"Polygon","arcs":[[4482,4483,4484,-4479,4485,4486]],"properties":{"id":"24660533","dp":17837,"de":7939}},{"type":"Polygon","arcs":[[-3558,4487,4488,-4483,4489,4490,4491]],"properties":{"id":"24660536","dp":16698,"de":2226}},{"type":"Polygon","arcs":[[-4489,4492,4493,4494,-4484]],"properties":{"id":"24660537","dp":30743,"de":0}},{"type":"Polygon","arcs":[[4495,-4291,4496,-4494]],"properties":{"id":"24660538","dp":28089,"de":0}},{"type":"Polygon","arcs":[[-4497,-4296,-4478,-4480,-4485,-4495]],"properties":{"id":"24660539","dp":8857,"de":2124}},{"type":"Polygon","arcs":[[-4496,-4493,-4488,4497,4498,-4292]],"properties":{"id":"24660540","dp":9237,"de":5053}},{"type":"Polygon","arcs":[[-3557,4499,4500,4501,4502,4503,4504,-3965,-4498]],"properties":{"id":"24660541","dp":5923,"de":1763}},{"type":"Polygon","arcs":[[4505,-4503]],"properties":{"id":"24660542","dp":5433,"de":680}},{"type":"Polygon","arcs":[[4506,4507,4508,-4504,-4506,-4502]],"properties":{"id":"24660543","dp":6713,"de":0}},{"type":"Polygon","arcs":[[4509,4510,4511,-4508,4512]],"properties":{"id":"24660544","dp":6430,"de":0}},{"type":"Polygon","arcs":[[-4501,-3126,4513,4514,-4513,-4507]],"properties":{"id":"24660545","dp":7629,"de":1708}},{"type":"Polygon","arcs":[[4515,-3595,4516,-4515]],"properties":{"id":"24660546","dp":9042,"de":5953}},{"type":"Polygon","arcs":[[4517,-4516,-4514,-3125]],"properties":{"id":"24660547","dp":5863,"de":7096}},{"type":"Polygon","arcs":[[-4393,-4395,-3596,-4518,-3124]],"properties":{"id":"24660548","dp":9006,"de":1319}},{"type":"Polygon","arcs":[[-4403,-4405,-3138,4518,4519,-3590,-4398]],"properties":{"id":"24660550","dp":4107,"de":4395}},{"type":"Polygon","arcs":[[-3591,-4520,4520,4521]],"properties":{"id":"24660551","dp":19581,"de":0}},{"type":"Polygon","arcs":[[-4521,-4519,-3137,4522]],"properties":{"id":"24660552","dp":27578,"de":4882}},{"type":"Polygon","arcs":[[-4404,-4354,-4351,-4341,4523,-3135]],"properties":{"id":"24660555","dp":12644,"de":0}},{"type":"Polygon","arcs":[[-4524,-4345,4524,4525,4526,4527,-3136]],"properties":{"id":"24660556","dp":10140,"de":1358}},{"type":"Polygon","arcs":[[-4523,-4528,4528]],"properties":{"id":"24660557","dp":22720,"de":0}},{"type":"Polygon","arcs":[[-3592,-4522,-4529,-4527,4529,4530]],"properties":{"id":"24660558","dp":8979,"de":2312}},{"type":"Polygon","arcs":[[-4531,-3976,-3963,4531,-3593]],"properties":{"id":"24660560","dp":3900,"de":1036}},{"type":"Polygon","arcs":[[-3594,-4532,4532,-4510,-4517]],"properties":{"id":"24660561","dp":5533,"de":917}},{"type":"Polygon","arcs":[[-4533,-3962,4533,-4511]],"properties":{"id":"24660562","dp":12880,"de":0}},{"type":"Polygon","arcs":[[-4534,-3961,-3966,-4505,-4509,-4512]],"properties":{"id":"24660563","dp":4956,"de":1557}},{"type":"Polygon","arcs":[[4534,-4094,-4096,4535,4536]],"properties":{"id":"24660171","dp":10209,"de":0}},{"type":"Polygon","arcs":[[4537,-4536,-4095,-687,-678,4538]],"properties":{"id":"24660172","dp":12507,"de":0}},{"type":"Polygon","arcs":[[4539,-4539,-677,-660,4540]],"properties":{"id":"24660173","dp":10934,"de":0}},{"type":"Polygon","arcs":[[4541,4542,-4369,-4373,4543]],"properties":{"id":"24660586","dp":7473,"de":0}},{"type":"Polygon","arcs":[[4544,-4544,-4377,4545,4546,4547]],"properties":{"id":"24660587","dp":4432,"de":714}},{"type":"Polygon","arcs":[[4548,-3612,4549,4550,-4542,-4545,-3132]],"properties":{"id":"24660588","dp":3861,"de":0}},{"type":"Polygon","arcs":[[-3613,-4549,-3131]],"properties":{"id":"24660590","dp":4636,"de":0}},{"type":"Polygon","arcs":[[-3524,-3133,-4548,4551]],"properties":{"id":"24660594","dp":6326,"de":0}},{"type":"Polygon","arcs":[[-3599,-3525,-4552,-4547,4552,4553,-4002,-4408,-4415,4554]],"properties":{"id":"24660595","dp":3087,"de":2310}},{"type":"Polygon","arcs":[[-4546,-4376,-4407,-3998,4555,-4553]],"properties":{"id":"24660596","dp":9901,"de":0}},{"type":"Polygon","arcs":[[-4554,-4556,-3997]],"properties":{"id":"24660597","dp":12168,"de":1084}},{"type":"Polygon","arcs":[[4556,4557,4558,-3541,-3536]],"properties":{"id":"24661062","dp":17500,"de":6793}},{"type":"Polygon","arcs":[[4559,-3542,-4559]],"properties":{"id":"24661063","dp":31257,"de":0}},{"type":"Polygon","arcs":[[-3544,4560,4561,-2710,4562,4563]],"properties":{"id":"24661066","dp":7992,"de":2200}},{"type":"Polygon","arcs":[[4564,4565,-4561,-3543]],"properties":{"id":"24661067","dp":6868,"de":1124}},{"type":"Polygon","arcs":[[-4558,4566,4567,-4565,-4560]],"properties":{"id":"24661068","dp":7535,"de":2392}},{"type":"Polygon","arcs":[[-824,-1987,4568,-4562,-4566,-4568,4569]],"properties":{"id":"24661069","dp":6727,"de":4444}},{"type":"Polygon","arcs":[[-1986,-1983,-2715,-2711,-4569]],"properties":{"id":"24661070","dp":5254,"de":3708}},{"type":"Polygon","arcs":[[-1081,-4421,-4423,-2935,-2932,4570,4571]],"properties":{"id":"24660616","dp":10046,"de":1113}},{"type":"Polygon","arcs":[[-2929,4572,-4571]],"properties":{"id":"24660617","dp":18432,"de":0}},{"type":"Polygon","arcs":[[4573,4574,-4573,-2926,-2920]],"properties":{"id":"24660618","dp":10665,"de":6569}},{"type":"Polygon","arcs":[[-1077,-4572,-4575,4575]],"properties":{"id":"24660619","dp":10755,"de":2485}},{"type":"Polygon","arcs":[[4576,-1083,-1078,-4576,-4574,-2917,4577,4578,4579]],"properties":{"id":"24660620","dp":4651,"de":2549}},{"type":"Polygon","arcs":[[4580,-4580,4581]],"properties":{"id":"24660621","dp":22919,"de":0}},{"type":"Polygon","arcs":[[4582,-4581,4583,-3300]],"properties":{"id":"24660622","dp":17689,"de":0}},{"type":"Polygon","arcs":[[-4583,-3309,-694,-4577]],"properties":{"id":"24660623","dp":20567,"de":28723}},{"type":"Polygon","arcs":[[-2970,-2974,4584,4585]],"properties":{"id":"24661113","dp":17609,"de":3902}},{"type":"Polygon","arcs":[[4586,4587,4588,-4472,-4469,4589,4590,4591]],"properties":{"id":"24660905","dp":12702,"de":1621}},{"type":"Polygon","arcs":[[4592,4593,-4473,-4589,4594]],"properties":{"id":"24660906","dp":10153,"de":1282}},{"type":"Polygon","arcs":[[-4595,-4588,4595]],"properties":{"id":"24660907","dp":9488,"de":2555}},{"type":"Polygon","arcs":[[4596,4597,4598,-4593,-4596,-4587,4599,-4325,4600,4601,4602,-4467,4603]],"properties":{"id":"24660908","dp":6482,"de":1924}},{"type":"Polygon","arcs":[[-4599,4604,4605,-4604,-4466,-4474,-4594]],"properties":{"id":"24660909","dp":10358,"de":1793}},{"type":"Polygon","arcs":[[4606,-4605,-4598]],"properties":{"id":"24660910","dp":13546,"de":0}},{"type":"Polygon","arcs":[[-4607,-4597,-4606]],"properties":{"id":"24660911","dp":13955,"de":0}},{"type":"Polygon","arcs":[[-4324,4607,-4601]],"properties":{"id":"24660912","dp":12570,"de":2712}},{"type":"Polygon","arcs":[[-2631,4608,4609,4610,-4602,-4608]],"properties":{"id":"24660913","dp":6696,"de":10600}},{"type":"Polygon","arcs":[[-4611,4611,-756,-4603]],"properties":{"id":"24660914","dp":6847,"de":4130}},{"type":"Polygon","arcs":[[-4610,4612,4613,4614,4615,4616,-757,-4612]],"properties":{"id":"24660915","dp":6709,"de":1865}},{"type":"Polygon","arcs":[[4617,-758,-4617]],"properties":{"id":"24660916","dp":6732,"de":911}},{"type":"Polygon","arcs":[[-4616,4618,4619,4620,4621,4622,4623,4624,-759,-4618]],"properties":{"id":"24660917","dp":937,"de":2228}},{"type":"Polygon","arcs":[[-4615,4625,-4619]],"properties":{"id":"24660918","dp":7993,"de":1445}},{"type":"Polygon","arcs":[[4626,-4620,-4626,-4614]],"properties":{"id":"24660919","dp":3671,"de":2519}},{"type":"Polygon","arcs":[[-4613,-4609,-2630,-2469,4627,-4621,-4627]],"properties":{"id":"24660920","dp":2294,"de":2096}},{"type":"Polygon","arcs":[[-4628,-2475,4628,4629,4630,-4622]],"properties":{"id":"24660921","dp":4868,"de":0}},{"type":"Polygon","arcs":[[4631,-4630]],"properties":{"id":"24660922","dp":7716,"de":0}},{"type":"Polygon","arcs":[[-4631,-4632,-4629,-2474,4632,-4279,4633,4634,-4623]],"properties":{"id":"24660923","dp":3032,"de":1617}},{"type":"Polygon","arcs":[[-2473,-2468,-4286,-4284,-4274,4635,-4280,-4633]],"properties":{"id":"24660924","dp":2561,"de":291}},{"type":"Polygon","arcs":[[-4281,-4636]],"properties":{"id":"24660925","dp":19018,"de":1380}},{"type":"Polygon","arcs":[[-643,4636,-4537,-4538,-4540,4637]],"properties":{"id":"24660174","dp":9953,"de":0}},{"type":"Polygon","arcs":[[-648,-644,-4638,-4541,-659,-650]],"properties":{"id":"24660175","dp":7087,"de":0}},{"type":"Polygon","arcs":[[-4535,-4637,-642,-629,4638,-4090]],"properties":{"id":"24660176","dp":2965,"de":1467}},{"type":"Polygon","arcs":[[-4639,-628,-622,4639,-4091]],"properties":{"id":"24660177","dp":2979,"de":0}},{"type":"Polygon","arcs":[[-1933,-1421,4640,-4089,-4092,-4640]],"properties":{"id":"24660178","dp":2868,"de":1465}},{"type":"Polygon","arcs":[[4641,4642,4643,-4083,-4087,-4641]],"properties":{"id":"24660179","dp":3765,"de":321}},{"type":"Polygon","arcs":[[-4642,-1420,-1923,4644]],"properties":{"id":"24660180","dp":4749,"de":1354}},{"type":"Polygon","arcs":[[-4643,-4645,-1922,-1918,4645,4646,4647]],"properties":{"id":"24660181","dp":12371,"de":2291}},{"type":"Polygon","arcs":[[-1917,-1412,4648,-4646]],"properties":{"id":"24660182","dp":22071,"de":0}},{"type":"Polygon","arcs":[[4649,-4647,-4649,-1417,4650,4651,-4078]],"properties":{"id":"24660183","dp":7839,"de":1737}},{"type":"Polygon","arcs":[[-4648,-4650,-4082,-4084,-4644]],"properties":{"id":"24660184","dp":8692,"de":5130}},{"type":"Polygon","arcs":[[-4651,-1416,4652,4653]],"properties":{"id":"24660185","dp":10135,"de":0}},{"type":"Polygon","arcs":[[-4079,-4652,-4654,4654,4655,4656,-690]],"properties":{"id":"24660186","dp":12608,"de":1440}},{"type":"Polygon","arcs":[[-1415,-1411,-1402,-4655,-4653]],"properties":{"id":"24660187","dp":9391,"de":0}},{"type":"Polygon","arcs":[[-4656,-1407,4657,4658]],"properties":{"id":"24660188","dp":12819,"de":1101}},{"type":"Polygon","arcs":[[4659,-4658,-1406,4660]],"properties":{"id":"24660189","dp":23013,"de":0}},{"type":"Polygon","arcs":[[-691,-4657,-4659,-4660,-680,-686]],"properties":{"id":"24660190","dp":11042,"de":2055}},{"type":"Polygon","arcs":[[-681,-4661,-1394,4661]],"properties":{"id":"24660191","dp":20078,"de":0}},{"type":"Polygon","arcs":[[-4662,-1398,4662,-682]],"properties":{"id":"24660192","dp":16729,"de":0}},{"type":"Polygon","arcs":[[4663,-4663,-1397,4664,-1399,4665]],"properties":{"id":"24660193","dp":13200,"de":0}},{"type":"Polygon","arcs":[[-211,-3313,-3304,-3297,4666,-3463]],"properties":{"id":"24660659","dp":11496,"de":852}},{"type":"Polygon","arcs":[[-4667,-3303,4667,-3001,-3464]],"properties":{"id":"24660660","dp":12273,"de":1986}},{"type":"Polygon","arcs":[[4668,-2998,-4668,4669]],"properties":{"id":"24660661","dp":28965,"de":2681}},{"type":"Polygon","arcs":[[4670,-2994,-2997,-4669]],"properties":{"id":"24660662","dp":8566,"de":0}},{"type":"Polygon","arcs":[[4671,-4671,-4670,-3302]],"properties":{"id":"24660663","dp":30346,"de":2475}},{"type":"Polygon","arcs":[[-3301,-4584,4672,-2992,-4672]],"properties":{"id":"24660664","dp":30088,"de":0}},{"type":"Polygon","arcs":[[-4673,-4582,-4579,4673]],"properties":{"id":"24660665","dp":26808,"de":0}},{"type":"Polygon","arcs":[[4674,-2954,-2993,-4674]],"properties":{"id":"24660666","dp":34933,"de":2202}},{"type":"Polygon","arcs":[[-4578,-2916,-2951,-4675]],"properties":{"id":"24660667","dp":23824,"de":2534}},{"type":"Polygon","arcs":[[4675,4676,4677,4678]],"properties":{"id":"24663101","dp":2883,"de":305}},{"type":"Polygon","arcs":[[-3449,4679,-3447,4680,4681,4682,4683,4684,4685]],"properties":{"id":"24662988","dp":1403,"de":926}},{"type":"Polygon","arcs":[[4686,4687,4688,4689,4690,4691]],"properties":{"id":"24661358","dp":14773,"de":10933}},{"type":"Polygon","arcs":[[4692,4693,4694,4695,4696,4697,4698]],"properties":{"id":"24662589","dp":2389,"de":1641}},{"type":"Polygon","arcs":[[4699,-4698,4700,4701,4702]],"properties":{"id":"24662590","dp":7384,"de":736}},{"type":"Polygon","arcs":[[4703,4704,4705,-4699,-4700]],"properties":{"id":"24662591","dp":4921,"de":0}},{"type":"Polygon","arcs":[[4706,-4704,-4703,4707,4708]],"properties":{"id":"24662592","dp":7996,"de":0}},{"type":"Polygon","arcs":[[4709,-4692,4710,4711,4712,4713]],"properties":{"id":"24661359","dp":22229,"de":8188}},{"type":"Polygon","arcs":[[4714,-4712,4715,4716]],"properties":{"id":"24661360","dp":20497,"de":3167}},{"type":"Polygon","arcs":[[-4711,-4691,4717,-4716]],"properties":{"id":"24661361","dp":16989,"de":5510}},{"type":"Polygon","arcs":[[-4717,-4718,-4690,4718,4719,4720,4721]],"properties":{"id":"24661362","dp":6549,"de":2243}},{"type":"Polygon","arcs":[[4722,4723,-4719,4724]],"properties":{"id":"24661363","dp":10041,"de":5463}},{"type":"Polygon","arcs":[[4725,-4715,-4722,4726,4727,4728,4729,4730]],"properties":{"id":"24661364","dp":5086,"de":5761}},{"type":"Polygon","arcs":[[4731,4732,-4731]],"properties":{"id":"24661365","dp":28461,"de":0}},{"type":"Polygon","arcs":[[-4730,4733,4734,-4732]],"properties":{"id":"24661366","dp":31026,"de":2901}},{"type":"Polygon","arcs":[[4735,4736,-4734,-4729,4737,4738,4739]],"properties":{"id":"24661367","dp":18933,"de":3523}},{"type":"Polygon","arcs":[[-4740,4740,4741,4742]],"properties":{"id":"24661368","dp":19522,"de":4020}},{"type":"Polygon","arcs":[[4743,-4742,4744,4745]],"properties":{"id":"24661369","dp":17923,"de":4824}},{"type":"Polygon","arcs":[[4746,4747,-4746]],"properties":{"id":"24661370","dp":19392,"de":4153}},{"type":"Polygon","arcs":[[4748,-4747,-4745,-4741,-4739,4749,4750,4751,4752]],"properties":{"id":"24661371","dp":5503,"de":3788}},{"type":"Polygon","arcs":[[4753,-4749,4754,4755]],"properties":{"id":"24661372","dp":16048,"de":3024}},{"type":"Polygon","arcs":[[-4753,4756,4757,-4755]],"properties":{"id":"24661373","dp":16679,"de":1778}},{"type":"Polygon","arcs":[[-4752,4758,4759,-4757]],"properties":{"id":"24661374","dp":11866,"de":6888}},{"type":"Polygon","arcs":[[4760,4761,-4759,-4751,4762,4763,4764,4765]],"properties":{"id":"24661375","dp":4338,"de":21860}},{"type":"Polygon","arcs":[[4766,-4762,4767,4768]],"properties":{"id":"24661376","dp":11936,"de":55212}},{"type":"Polygon","arcs":[[-4760,-4767,4769,4770,4771]],"properties":{"id":"24661377","dp":13010,"de":13210}},{"type":"Polygon","arcs":[[-4758,-4772,4772,4773]],"properties":{"id":"24661378","dp":16306,"de":2552}},{"type":"Polygon","arcs":[[4774,-4756,-4774,4775]],"properties":{"id":"24661379","dp":15426,"de":3963}},{"type":"Polygon","arcs":[[4776,4777,4778,-4775,4779]],"properties":{"id":"24661380","dp":14057,"de":4472}},{"type":"Polygon","arcs":[[4780,4781,-4778,4782]],"properties":{"id":"24661381","dp":23529,"de":3287}},{"type":"Polygon","arcs":[[4783,-4781,4784,4785]],"properties":{"id":"24661382","dp":18792,"de":12640}},{"type":"Polygon","arcs":[[-1212,-3704,-3706,4786,4787,4788,4789,4790,4791]],"properties":{"id":"24661858","dp":4735,"de":20919}},{"type":"Polygon","arcs":[[4792,-4791,4793,4794,4795,4796,4797,4798]],"properties":{"id":"24661859","dp":8760,"de":65700}},{"type":"Polygon","arcs":[[4799,4800,-4795]],"properties":{"id":"24661860","dp":41379,"de":12068}},{"type":"Polygon","arcs":[[-3674,-4798,4801,4802,4803,-3679]],"properties":{"id":"24661861","dp":13040,"de":9684}},{"type":"Polygon","arcs":[[4804,4805,4806,-4803]],"properties":{"id":"24661862","dp":17269,"de":3212}},{"type":"Polygon","arcs":[[-4807,4807,4808,4809,4810]],"properties":{"id":"24661863","dp":17048,"de":2108}},{"type":"Polygon","arcs":[[-4804,-4811,4811,4812]],"properties":{"id":"24661864","dp":15515,"de":8520}},{"type":"Polygon","arcs":[[4813,-4812,-4810,4814,4815,4816,4817]],"properties":{"id":"24661865","dp":7883,"de":25525}},{"type":"Polygon","arcs":[[-3680,-4813,-4814,4818,-3676]],"properties":{"id":"24661866","dp":10557,"de":5268}},{"type":"Polygon","arcs":[[4819,4820,-4705,-4707,4821]],"properties":{"id":"24662593","dp":6048,"de":0}},{"type":"Polygon","arcs":[[4822,4823,4824,-4822]],"properties":{"id":"24662594","dp":6442,"de":0}},{"type":"Polygon","arcs":[[-4823,-4709,4825,-3397]],"properties":{"id":"24662595","dp":7840,"de":4466}},{"type":"Polygon","arcs":[[-3399,4826,4827]],"properties":{"id":"24662598","dp":8152,"de":0}},{"type":"Polygon","arcs":[[4828,4829,-3395,-4828,4830,4831]],"properties":{"id":"24662599","dp":9471,"de":0}},{"type":"Polygon","arcs":[[4832,-4829,4833]],"properties":{"id":"24662600","dp":12691,"de":0}},{"type":"Polygon","arcs":[[4834,-3794,4835,4836,4837,-4834,-4832,4838]],"properties":{"id":"24662601","dp":2907,"de":6314}},{"type":"Polygon","arcs":[[4839,-4824,-3396,-4830,-4833,-4838]],"properties":{"id":"24662602","dp":4897,"de":0}},{"type":"Polygon","arcs":[[4840,4841,-4840,-4837]],"properties":{"id":"24662603","dp":4293,"de":3968}},{"type":"Polygon","arcs":[[-4836,4842,4843,4844,4845,4846,4847,-4841]],"properties":{"id":"24662604","dp":4586,"de":0}},{"type":"Polygon","arcs":[[-4165,4848,-4843,-3793,-4162]],"properties":{"id":"24662605","dp":13399,"de":2272}},{"type":"Polygon","arcs":[[4849,-4844,-4849,-4164]],"properties":{"id":"24662606","dp":17614,"de":0}},{"type":"Polygon","arcs":[[4850,4851,4852,-4850,-4168]],"properties":{"id":"24662607","dp":10490,"de":5313}},{"type":"Polygon","arcs":[[4853,4854,-4851,-4171]],"properties":{"id":"24662608","dp":13543,"de":6526}},{"type":"Polygon","arcs":[[-4854,-4175,4855]],"properties":{"id":"24662609","dp":14225,"de":0}},{"type":"Polygon","arcs":[[-4210,-4213,-510,-4852,-4855,-4856,-4174,-4178]],"properties":{"id":"24662610","dp":9243,"de":6914}},{"type":"Polygon","arcs":[[-521,4856,-4845,-4853,-518]],"properties":{"id":"24662611","dp":10550,"de":13188}},{"type":"Polygon","arcs":[[-4857,4857,-4846]],"properties":{"id":"24662612","dp":11108,"de":10277}},{"type":"Polygon","arcs":[[-520,-526,4858,-4847,-4858]],"properties":{"id":"24662613","dp":9747,"de":2135}},{"type":"Polygon","arcs":[[4859,4860,4861,4862,4863,4864]],"properties":{"id":"24663010","dp":2137,"de":1450}},{"type":"Polygon","arcs":[[-4862,4865]],"properties":{"id":"24663011","dp":4900,"de":330}},{"type":"Polygon","arcs":[[4866,-4713,-4726,-4733,4867,4868]],"properties":{"id":"24661394","dp":27470,"de":7312}},{"type":"Polygon","arcs":[[4869,-4687,-4710,4870,4871]],"properties":{"id":"24661395","dp":8754,"de":3679}},{"type":"Polygon","arcs":[[4872,4873,-4870,4874]],"properties":{"id":"24661396","dp":9097,"de":1299}},{"type":"Polygon","arcs":[[-4873,4875,4876,4877,4878,4879]],"properties":{"id":"24661397","dp":3270,"de":1639}},{"type":"Polygon","arcs":[[4880,4881,4882,-4880]],"properties":{"id":"24661398","dp":8016,"de":901}},{"type":"Polygon","arcs":[[4883,4884]],"properties":{"id":"24662616","dp":9001,"de":0}},{"type":"Polygon","arcs":[[-4885,4885,4886,-4820,4887]],"properties":{"id":"24662617","dp":10181,"de":726}},{"type":"Polygon","arcs":[[-4887,-4693,-4706,-4821]],"properties":{"id":"24662618","dp":4851,"de":652}},{"type":"Polygon","arcs":[[4888,4889,4890,4891,4892,-3795,-4835,4893]],"properties":{"id":"24662619","dp":5920,"de":3944}},{"type":"Polygon","arcs":[[4894,-4890]],"properties":{"id":"24662620","dp":19502,"de":0}},{"type":"Polygon","arcs":[[4895,-4891,-4895,4896,-4110,-4114]],"properties":{"id":"24662621","dp":10958,"de":798}},{"type":"Polygon","arcs":[[-4897,-4889,4897,4898,-4107]],"properties":{"id":"24662622","dp":17121,"de":2424}},{"type":"Polygon","arcs":[[-4898,4899,4900,4901]],"properties":{"id":"24662623","dp":13792,"de":1458}},{"type":"Polygon","arcs":[[-4899,-4902,-4266,-4273,-4103]],"properties":{"id":"24662624","dp":13073,"de":2015}},{"type":"Polygon","arcs":[[-4901,4902,-4267]],"properties":{"id":"24662625","dp":16887,"de":0}},{"type":"Polygon","arcs":[[-4265,-4903,4903,4904,-4254,-4261]],"properties":{"id":"24662626","dp":11488,"de":0}},{"type":"Polygon","arcs":[[-4894,4905,-4904,-4900]],"properties":{"id":"24662627","dp":11148,"de":2153}},{"type":"Polygon","arcs":[[-1894,-4249,-4255,-4905,-4906,-4839,-4831,-4827,-3398,4906,4907,-1858,-1862,-1864,-1889]],"properties":{"id":"24662628","dp":472,"de":1388}},{"type":"Polygon","arcs":[[4908,4909,-4907,-4826,-4708,-4702,4910]],"properties":{"id":"24662629","dp":1060,"de":115}},{"type":"Polygon","arcs":[[-4910,4911,4912,4913,-4908]],"properties":{"id":"24662630","dp":11777,"de":1204}},{"type":"Polygon","arcs":[[-4914,4914,4915,4916,-1859]],"properties":{"id":"24662631","dp":15867,"de":1589}},{"type":"Polygon","arcs":[[-4917,4917,-1845,-1856]],"properties":{"id":"24662632","dp":15483,"de":2995}},{"type":"Polygon","arcs":[[4918,4919,-1846,-4918]],"properties":{"id":"24662633","dp":17894,"de":1372}},{"type":"Polygon","arcs":[[-4919,-4916,4920,4921]],"properties":{"id":"24662634","dp":20934,"de":0}},{"type":"Polygon","arcs":[[4922,4923,-4921,-4915,-4913]],"properties":{"id":"24662635","dp":11686,"de":2710}},{"type":"Polygon","arcs":[[4924,-4923,-4912,4925]],"properties":{"id":"24662636","dp":24550,"de":0}},{"type":"Polygon","arcs":[[4926,-4926,-4909]],"properties":{"id":"24662637","dp":23988,"de":0}},{"type":"Polygon","arcs":[[4927,4928,4929,4930,4931]],"properties":{"id":"24662638","dp":10316,"de":1399}},{"type":"Polygon","arcs":[[4932,4933,4934,-4929,4935]],"properties":{"id":"24662639","dp":9787,"de":1415}},{"type":"Polygon","arcs":[[4936,-4933,4937]],"properties":{"id":"24662640","dp":12450,"de":1214}},{"type":"Polygon","arcs":[[4938,4939,-4934,-4937]],"properties":{"id":"24662641","dp":9096,"de":0}},{"type":"Polygon","arcs":[[4940,4941,4942,4943,4944,4945,4946,4947]],"properties":{"id":"24663030","dp":2966,"de":382}},{"type":"Polygon","arcs":[[4948,4949,-4946,4950,4951,4952]],"properties":{"id":"24663031","dp":3616,"de":0}},{"type":"Polygon","arcs":[[4953,-3083,-3162,4954]],"properties":{"id":"24663075","dp":674,"de":79}},{"type":"Polygon","arcs":[[-3103,-2982,4955,-3160]],"properties":{"id":"24663076","dp":1076,"de":101}},{"type":"MultiPolygon","arcs":[[[4956,4957,4958,4959,4960,4961,4962]],[[4963,4964,4965,4966]]],"properties":{"id":"24663077","dp":282,"de":62}},{"type":"Polygon","arcs":[[4967,4968,4969]],"properties":{"id":"24663079","dp":7864,"de":0}},{"type":"Polygon","arcs":[[4970,4971,-4970,4972,4973,4974]],"properties":{"id":"24663080","dp":5606,"de":0}},{"type":"Polygon","arcs":[[4975,-4975,4976]],"properties":{"id":"24663081","dp":5152,"de":0}},{"type":"Polygon","arcs":[[4977,-4977,-4974,4978,4979,4980]],"properties":{"id":"24663082","dp":4933,"de":0}},{"type":"Polygon","arcs":[[4981,4982,4983,-4881,-4879,4984,4985,4986]],"properties":{"id":"24661399","dp":2976,"de":541}},{"type":"Polygon","arcs":[[4987,4988,4989,4990,-4984]],"properties":{"id":"24661400","dp":3899,"de":708}},{"type":"Polygon","arcs":[[-1343,-1346,4991,-4982,4992,-1339]],"properties":{"id":"24661401","dp":5107,"de":3163}},{"type":"Polygon","arcs":[[4993,-233,4994,-4988,-4983,-4992]],"properties":{"id":"24661402","dp":12976,"de":5402}},{"type":"Polygon","arcs":[[-4994,-1347,-3461,-234]],"properties":{"id":"24661405","dp":31666,"de":1570}},{"type":"Polygon","arcs":[[-1333,-1340,-4993,-4987,4995,4996,4997]],"properties":{"id":"24661407","dp":9731,"de":1788}},{"type":"Polygon","arcs":[[-4986,4998,-4996]],"properties":{"id":"24661408","dp":22746,"de":2331}},{"type":"Polygon","arcs":[[-1329,4999,-4997,-4999,-4985,-4878,5000,5001]],"properties":{"id":"24661409","dp":2728,"de":4005}},{"type":"Polygon","arcs":[[-4998,-5000,-1328]],"properties":{"id":"24661410","dp":24615,"de":5384}},{"type":"Polygon","arcs":[[5002,-5001,-4877,5003,5004]],"properties":{"id":"24661411","dp":3817,"de":566}},{"type":"Polygon","arcs":[[5005,-1330,-5002,-5003,5006,5007]],"properties":{"id":"24661412","dp":254,"de":260}},{"type":"Polygon","arcs":[[-5007,-5005,5008,5009,5010,5011,5012,5013]],"properties":{"id":"24661413","dp":3642,"de":721}},{"type":"Polygon","arcs":[[5014,-5011,5015,5016]],"properties":{"id":"24661414","dp":21659,"de":3526}},{"type":"Polygon","arcs":[[-5012,-5015,5017,5018,5019]],"properties":{"id":"24661415","dp":16468,"de":1984}},{"type":"Polygon","arcs":[[-5019,5020,5021,5022,5023,5024]],"properties":{"id":"24661416","dp":16285,"de":3650}},{"type":"Polygon","arcs":[[5025,5026,5027,-3173]],"properties":{"id":"24661893","dp":17329,"de":3125}},{"type":"Polygon","arcs":[[-5026,5028,5029,5030,5031,5032,5033]],"properties":{"id":"24661894","dp":5661,"de":8260}},{"type":"Polygon","arcs":[[-3172,5034,5035,5036,5037,-5029]],"properties":{"id":"24661895","dp":16720,"de":5600}},{"type":"Polygon","arcs":[[5038,-5035,-3171]],"properties":{"id":"24661896","dp":20169,"de":0}},{"type":"Polygon","arcs":[[-3170,5039,5040,-5036,-5039]],"properties":{"id":"24661897","dp":16994,"de":1554}},{"type":"Polygon","arcs":[[5041,5042,-5040,-3169]],"properties":{"id":"24661898","dp":14101,"de":6568}},{"type":"Polygon","arcs":[[5043,5044,-5042,-3168]],"properties":{"id":"24661899","dp":23580,"de":5626}},{"type":"Polygon","arcs":[[5045,5046,5047,5048,-5045]],"properties":{"id":"24661900","dp":15261,"de":8126}},{"type":"Polygon","arcs":[[-5049,5049,5050,-5043]],"properties":{"id":"24661901","dp":13506,"de":6944}},{"type":"Polygon","arcs":[[5051,5052,5053,5054,5055]],"properties":{"id":"24663084","dp":3793,"de":0}},{"type":"Polygon","arcs":[[-5054,5056,-4963,5057,-4965,5058]],"properties":{"id":"24663085","dp":3675,"de":0}},{"type":"Polygon","arcs":[[5059,-4980,5060,5061,5062,-4957,-5057]],"properties":{"id":"24663086","dp":5384,"de":0}},{"type":"Polygon","arcs":[[5063,5064,5065,5066]],"properties":{"id":"24661426","dp":21391,"de":2173}},{"type":"Polygon","arcs":[[5067,5068,5069,5070,-5065]],"properties":{"id":"24661427","dp":12930,"de":8255}},{"type":"Polygon","arcs":[[5071,5072,-5070,5073]],"properties":{"id":"24661428","dp":16936,"de":8274}},{"type":"Polygon","arcs":[[5074,-4773,-4771,5075,-5073]],"properties":{"id":"24661429","dp":10381,"de":14088}},{"type":"Polygon","arcs":[[5076,5077,-4780,-4776,-5075]],"properties":{"id":"24661430","dp":12173,"de":6956}},{"type":"Polygon","arcs":[[5078,5079,-5022,5080,-4785,-4783,-4777,-5078]],"properties":{"id":"24661431","dp":11167,"de":10583}},{"type":"Polygon","arcs":[[5081,5082,-5079,-5077,-5072,5083]],"properties":{"id":"24661432","dp":17155,"de":2245}},{"type":"Polygon","arcs":[[-5076,-4770,-4769,5084,5085,-5071]],"properties":{"id":"24661433","dp":10080,"de":7329}},{"type":"Polygon","arcs":[[-5085,-4768,-4761,5086,5087,5088]],"properties":{"id":"24661434","dp":12990,"de":11934}},{"type":"Polygon","arcs":[[-5086,-5089,5089,5090,5091,-5066]],"properties":{"id":"24661435","dp":14108,"de":11512}},{"type":"Polygon","arcs":[[-5088,5092,5093,-5090]],"properties":{"id":"24661436","dp":20194,"de":3721}},{"type":"Polygon","arcs":[[-5094,5094,5095,5096]],"properties":{"id":"24661437","dp":16964,"de":8333}},{"type":"Polygon","arcs":[[-5091,-5097,5097,5098,5099]],"properties":{"id":"24661438","dp":15305,"de":6845}},{"type":"Polygon","arcs":[[5100,-5098,5101,5102,5103]],"properties":{"id":"24661439","dp":14174,"de":7119}},{"type":"Polygon","arcs":[[-5096,5104,-5102]],"properties":{"id":"24661440","dp":17272,"de":3409}},{"type":"Polygon","arcs":[[5105,-5103,-5105,5106,5107,5108,5109]],"properties":{"id":"24661441","dp":8472,"de":1280}},{"type":"Polygon","arcs":[[5110,-4765,5111,-5107,-5095]],"properties":{"id":"24661442","dp":9494,"de":2853}},{"type":"Polygon","arcs":[[-5087,-4766,-5111,-5093]],"properties":{"id":"24661443","dp":19421,"de":2210}},{"type":"Polygon","arcs":[[5112,5113,-5112,5114,5115,5116,5117]],"properties":{"id":"24661444","dp":15638,"de":2543}},{"type":"Polygon","arcs":[[-5113,5118,5119]],"properties":{"id":"24661445","dp":13980,"de":3618}},{"type":"Polygon","arcs":[[-5118,5120,5121,-5119]],"properties":{"id":"24661446","dp":14249,"de":2544}},{"type":"Polygon","arcs":[[-5122,5122,5123,5124,5125]],"properties":{"id":"24661447","dp":14377,"de":3228}},{"type":"Polygon","arcs":[[5126,-1257,5127,5128,-3671]],"properties":{"id":"24661925","dp":10527,"de":8822}},{"type":"Polygon","arcs":[[5129,5130,5131,-3672,-5129]],"properties":{"id":"24661926","dp":8836,"de":5325}},{"type":"Polygon","arcs":[[-1263,5132,-5130,-5128]],"properties":{"id":"24661927","dp":9599,"de":8166}},{"type":"Polygon","arcs":[[-5131,-5133,-1266,-4792,-4793,5133]],"properties":{"id":"24661928","dp":7821,"de":17913}},{"type":"Polygon","arcs":[[-5134,-4799,-3673,-5132]],"properties":{"id":"24661929","dp":15569,"de":24683}},{"type":"Polygon","arcs":[[5134,-3695,-3702,5135]],"properties":{"id":"24661936","dp":14148,"de":8703}},{"type":"Polygon","arcs":[[-3718,-3710,5136,-5136,-3701,-1211]],"properties":{"id":"24661937","dp":11421,"de":7106}},{"type":"Polygon","arcs":[[5137,5138,5139,5140,5141,5142]],"properties":{"id":"24663123","dp":3014,"de":274}},{"type":"Polygon","arcs":[[-5143,5143,5144,5145]],"properties":{"id":"24663124","dp":426,"de":1169}},{"type":"Polygon","arcs":[[5146,5147,-5144,-5142,5148,-4961]],"properties":{"id":"24663125","dp":72,"de":62}},{"type":"Polygon","arcs":[[5149,5150]],"properties":{"id":"24663126","dp":3847,"de":308}},{"type":"Polygon","arcs":[[-5150,5151]],"properties":{"id":"24663127","dp":3074,"de":0}},{"type":"Polygon","arcs":[[-4680,-3448]],"properties":{"id":"24662989","dp":4683,"de":496}},{"type":"Polygon","arcs":[[5152,5153,5154,-3443]],"properties":{"id":"24662992","dp":8168,"de":0}},{"type":"Polygon","arcs":[[5155,-4681,-3446,5156]],"properties":{"id":"24662993","dp":7857,"de":2639}},{"type":"Polygon","arcs":[[-3445,5157,5158,5159,5160,5161,5162,-5157]],"properties":{"id":"24662994","dp":3402,"de":728}},{"type":"Polygon","arcs":[[5163,5164,5165,5166,5167]],"properties":{"id":"24663088","dp":3617,"de":225}},{"type":"Polygon","arcs":[[-5166,5168]],"properties":{"id":"24663089","dp":4119,"de":0}},{"type":"Polygon","arcs":[[5169,5170,5171,5172,5173,5174]],"properties":{"id":"24663090","dp":2782,"de":211}},{"type":"Polygon","arcs":[[-5175,5175,5176]],"properties":{"id":"24663091","dp":2875,"de":0}},{"type":"Polygon","arcs":[[-5170,-5177,5177]],"properties":{"id":"24663092","dp":3252,"de":0}},{"type":"Polygon","arcs":[[5178,5179]],"properties":{"id":"24663094","dp":3788,"de":0}},{"type":"Polygon","arcs":[[5180,5181,-5180,5182,5183,5184,5185]],"properties":{"id":"24663095","dp":2894,"de":362}},{"type":"Polygon","arcs":[[5186,5187,5188,5189,5190,5191,5192]],"properties":{"id":"24663096","dp":1854,"de":332}},{"type":"Polygon","arcs":[[5193,5194,5195,-5193,5196,5197]],"properties":{"id":"24663097","dp":2731,"de":255}},{"type":"Polygon","arcs":[[5198,-5187,-5196]],"properties":{"id":"24663098","dp":2882,"de":0}},{"type":"Polygon","arcs":[[-5195,5199,5200,5201,5202,5203,-5188,-5199]],"properties":{"id":"24663099","dp":804,"de":140}},{"type":"Polygon","arcs":[[5204,-5200,-5194,5205,-4677]],"properties":{"id":"24663100","dp":3489,"de":0}},{"type":"Polygon","arcs":[[5206,5207,5208,5209,5210,5211]],"properties":{"id":"24663369","dp":10290,"de":38854}},{"type":"Polygon","arcs":[[-4678,-5206,-5198,5212,5213,5214]],"properties":{"id":"24663102","dp":2151,"de":413}},{"type":"Polygon","arcs":[[5215,5216,5217,5218,5219,5220,5221]],"properties":{"id":"24663103","dp":1368,"de":279}},{"type":"Polygon","arcs":[[5222,-5220,5223]],"properties":{"id":"24663104","dp":2245,"de":0}},{"type":"Polygon","arcs":[[5224,-5221,-5223,5225]],"properties":{"id":"24663105","dp":2219,"de":179}},{"type":"MultiPolygon","arcs":[[[5226,-5225,5227,5228,5229,5230]],[[5231,5232,5233,5234,5235,5236,5237]]],"properties":{"id":"24663106","dp":1239,"de":485}},{"type":"Polygon","arcs":[[5238,5239,5240,5241,-5222,-5227,5242]],"properties":{"id":"24663107","dp":1383,"de":479}},{"type":"Polygon","arcs":[[5243,5244,-5216,-5242]],"properties":{"id":"24663108","dp":1929,"de":0}},{"type":"Polygon","arcs":[[-5244,-5241,5245,5246,5247]],"properties":{"id":"24663109","dp":1943,"de":163}},{"type":"Polygon","arcs":[[-5245,-5248,5248,-5202,-5217]],"properties":{"id":"24663110","dp":1462,"de":139}},{"type":"Polygon","arcs":[[-5247,5249,5250,5251,5252,5253,5254,-5203,-5249]],"properties":{"id":"24663111","dp":206,"de":1307}},{"type":"Polygon","arcs":[[5255,5256,5257,-5251]],"properties":{"id":"24663112","dp":1319,"de":168}},{"type":"Polygon","arcs":[[5258,-3498,5259]],"properties":{"id":"24663139","dp":8410,"de":0}},{"type":"Polygon","arcs":[[-5156,-5163,5260,-4682]],"properties":{"id":"24662995","dp":2103,"de":574}},{"type":"Polygon","arcs":[[5261,5262,5263,-5261]],"properties":{"id":"24662996","dp":2752,"de":0}},{"type":"Polygon","arcs":[[5264,-5262,-5162,5265,5266]],"properties":{"id":"24662997","dp":11611,"de":828}},{"type":"Polygon","arcs":[[-5266,-5161,5267,5268,5269,5270,5271,5272]],"properties":{"id":"24662998","dp":262,"de":0}},{"type":"Polygon","arcs":[[-5269,5273,5274]],"properties":{"id":"24662999","dp":6982,"de":0}},{"type":"Polygon","arcs":[[5275,5276,5277,5278,-5271]],"properties":{"id":"24663000","dp":3577,"de":0}},{"type":"Polygon","arcs":[[5279,5280,5281,5282,-5277]],"properties":{"id":"24663001","dp":2883,"de":0}},{"type":"Polygon","arcs":[[5283,5284,5285,5286,5287,-5272,-5279]],"properties":{"id":"24663002","dp":3145,"de":589}},{"type":"Polygon","arcs":[[-5267,-5273,-5288,5288,5289,5290,5291,5292,-4865,5293]],"properties":{"id":"24663003","dp":2185,"de":331}},{"type":"Polygon","arcs":[[5294,5295,5296,-5291]],"properties":{"id":"24663004","dp":2748,"de":0}},{"type":"Polygon","arcs":[[5297,5298,5299,-5296]],"properties":{"id":"24663005","dp":2154,"de":436}},{"type":"Polygon","arcs":[[-5295,-5290,5300,5301,5302,-5298]],"properties":{"id":"24663006","dp":2700,"de":513}},{"type":"Polygon","arcs":[[-5299,-5303,5303,5304,5305]],"properties":{"id":"24663007","dp":2390,"de":442}},{"type":"Polygon","arcs":[[-5292,-5297,-5300,-5306,5306,5307]],"properties":{"id":"24663008","dp":2340,"de":0}},{"type":"Polygon","arcs":[[-5293,-5308,5308,5309,5310,-4860]],"properties":{"id":"24663009","dp":3982,"de":369}},{"type":"Polygon","arcs":[[5311,5312,5313,5314,5315,5316,-3478,5317]],"properties":{"id":"24661728","dp":2231,"de":181}},{"type":"Polygon","arcs":[[-5316,5318,-360,5319]],"properties":{"id":"24661729","dp":8286,"de":7159}},{"type":"Polygon","arcs":[[-4819,-4818,5320,5321,-3677]],"properties":{"id":"24661867","dp":7988,"de":18450}},{"type":"Polygon","arcs":[[-5321,-4817,5322,5323]],"properties":{"id":"24661868","dp":21743,"de":4816}},{"type":"Polygon","arcs":[[-5323,-4816,5324,5325,5326,5327]],"properties":{"id":"24661869","dp":6918,"de":5238}},{"type":"Polygon","arcs":[[5328,5329,-3678,-5322,-5324,-5328,5330]],"properties":{"id":"24661870","dp":4383,"de":5790}},{"type":"Polygon","arcs":[[5331,-5237,5332,5333,5334,5335,5336]],"properties":{"id":"24663128","dp":1312,"de":1785}},{"type":"Polygon","arcs":[[5337,5338,5339,5340,-5333]],"properties":{"id":"24663129","dp":1128,"de":536}},{"type":"Polygon","arcs":[[-5341,5341,5342,-5334]],"properties":{"id":"24663130","dp":2422,"de":866}},{"type":"Polygon","arcs":[[5343,-5342,-5340,5344,5345]],"properties":{"id":"24663131","dp":3284,"de":945}},{"type":"Polygon","arcs":[[-5343,-5344,5346,5347,5348,-5335]],"properties":{"id":"24663132","dp":1831,"de":453}},{"type":"Polygon","arcs":[[-5347,-5346,5349]],"properties":{"id":"24663133","dp":2086,"de":0}},{"type":"Polygon","arcs":[[-5348,-5350,-5345,-5339,5350,5351,5352,-3067,5353,5354,5355]],"properties":{"id":"24663134","dp":1348,"de":312}},{"type":"Polygon","arcs":[[-5355,5356,5357]],"properties":{"id":"24663135","dp":1995,"de":0}},{"type":"Polygon","arcs":[[5358,5359,-5337,5360,-5358,5361,5362]],"properties":{"id":"24663136","dp":1330,"de":200}},{"type":"Polygon","arcs":[[-5349,-5356,-5361,-5336]],"properties":{"id":"24663137","dp":2671,"de":273}},{"type":"Polygon","arcs":[[-5259,5363,5364,5365,5366,5367,5368,-3499]],"properties":{"id":"24663138","dp":7577,"de":924}},{"type":"Polygon","arcs":[[-4683,-5264,5369,5370,5371]],"properties":{"id":"24663140","dp":2380,"de":0}},{"type":"Polygon","arcs":[[-5263,-5265,-5294,-4864,-5370]],"properties":{"id":"24663141","dp":3953,"de":467}},{"type":"Polygon","arcs":[[5372,-2031,5373]],"properties":{"id":"24663142","dp":25457,"de":0}},{"type":"Polygon","arcs":[[5374,-5374,-2030,5375,5376,5377,-1797]],"properties":{"id":"24663143","dp":4089,"de":1331}},{"type":"Polygon","arcs":[[-5375,-1796,-1806,-1819,-2032,-5373]],"properties":{"id":"24663144","dp":4815,"de":1012}},{"type":"Polygon","arcs":[[-5377,5378,5379,5380,5381]],"properties":{"id":"24663145","dp":7448,"de":576}},{"type":"Polygon","arcs":[[-5380,5382,5383,5384]],"properties":{"id":"24663146","dp":6888,"de":576}},{"type":"Polygon","arcs":[[-5381,-5385,5385,5386]],"properties":{"id":"24663147","dp":8625,"de":2031}},{"type":"Polygon","arcs":[[5387,5388,-5383]],"properties":{"id":"24663149","dp":5396,"de":1353}},{"type":"Polygon","arcs":[[-5376,-2029,5389,5390,-5388,-5379]],"properties":{"id":"24663150","dp":5796,"de":0}},{"type":"Polygon","arcs":[[5391,5392,5393,5394,5395,5396,5397,-3437,5398,-3441,5399,5400,5401,5402]],"properties":{"id":"24663151","dp":284,"de":2721}},{"type":"Polygon","arcs":[[5403,5404,5405,5406,5407,5408,5409,-5401]],"properties":{"id":"24663152","dp":718,"de":2931}},{"type":"Polygon","arcs":[[-5409,5410,5411,5412]],"properties":{"id":"24663153","dp":1498,"de":3607}},{"type":"Polygon","arcs":[[5413,5414,-5405,5415]],"properties":{"id":"24663154","dp":2620,"de":0}},{"type":"Polygon","arcs":[[5416,5417,5418,-5406,-5415]],"properties":{"id":"24663155","dp":3962,"de":0}},{"type":"Polygon","arcs":[[5419,5420,5421,5422,5423,-5418]],"properties":{"id":"24663156","dp":4107,"de":274}},{"type":"Polygon","arcs":[[-5417,5424,5425,5426,-5420]],"properties":{"id":"24663157","dp":4373,"de":0}},{"type":"Polygon","arcs":[[5427,-5425,-5414,5428]],"properties":{"id":"24663158","dp":2091,"de":0}},{"type":"Polygon","arcs":[[-5400,5429,5430,-5429,-5416,-5404]],"properties":{"id":"24663159","dp":2908,"de":392}},{"type":"Polygon","arcs":[[-5430,-3440,5431,5432,5433],[5434,5435]],"properties":{"id":"24663160","dp":1418,"de":512}},{"type":"Polygon","arcs":[[5436,5437,5438,5439,-4943]],"properties":{"id":"24663032","dp":4308,"de":297}},{"type":"Polygon","arcs":[[5440,5441,5442,5443,5444]],"properties":{"id":"24663169","dp":5649,"de":654}},{"type":"Polygon","arcs":[[5445,-5442,5446,5447,5448,5449]],"properties":{"id":"24663170","dp":2125,"de":1054}},{"type":"Polygon","arcs":[[5450,-5444,5451]],"properties":{"id":"24663171","dp":15617,"de":8707}},{"type":"Polygon","arcs":[[-3439,5452,5453,5454,5455,5456,-5432]],"properties":{"id":"24663172","dp":1321,"de":715}},{"type":"Polygon","arcs":[[5457,5458,-5456]],"properties":{"id":"24663173","dp":2771,"de":200}},{"type":"Polygon","arcs":[[-5455,5459,5460,5461,5462,-5458]],"properties":{"id":"24663174","dp":1629,"de":1407}},{"type":"Polygon","arcs":[[5463,-3054,5464,5465,-5463]],"properties":{"id":"24663175","dp":2280,"de":724}},{"type":"Polygon","arcs":[[5466,5467,5468,5469,-5464,-5462]],"properties":{"id":"24663176","dp":2022,"de":1603}},{"type":"Polygon","arcs":[[5470,5471,5472,-5468,5473]],"properties":{"id":"24663177","dp":3514,"de":0}},{"type":"Polygon","arcs":[[5474,5475,-5474,-5467,-5461,5476,5477]],"properties":{"id":"24663178","dp":1104,"de":1497}},{"type":"Polygon","arcs":[[5478,5479,-5471,-5476]],"properties":{"id":"24663179","dp":3160,"de":0}},{"type":"Polygon","arcs":[[-5067,-5092,5480,5481]],"properties":{"id":"24661834","dp":19267,"de":5860}},{"type":"Polygon","arcs":[[5482,5483,5484,5485,5486,5487]],"properties":{"id":"24661835","dp":13910,"de":10337}},{"type":"Polygon","arcs":[[5488,-5488,5489,5490]],"properties":{"id":"24661836","dp":11541,"de":9589}},{"type":"Polygon","arcs":[[-5490,-5487,5491,5492,5493,5494]],"properties":{"id":"24661837","dp":10114,"de":10665}},{"type":"Polygon","arcs":[[5495,-5491,-5495,5496,5497]],"properties":{"id":"24661838","dp":14367,"de":7806}},{"type":"Polygon","arcs":[[-5497,-5494,5498,5499,5500]],"properties":{"id":"24661839","dp":14441,"de":6472}},{"type":"Polygon","arcs":[[-5500,5501,-5044,5502]],"properties":{"id":"24661840","dp":10863,"de":7142}},{"type":"Polygon","arcs":[[5503,-5503,-3167,5504]],"properties":{"id":"24661841","dp":15344,"de":5603}},{"type":"Polygon","arcs":[[5505,-5501,-5504,5506,5507]],"properties":{"id":"24661842","dp":18575,"de":3166}},{"type":"Polygon","arcs":[[-5331,-5327,5508,5509,5510]],"properties":{"id":"24661871","dp":6399,"de":9697}},{"type":"Polygon","arcs":[[-5510,5511,5512]],"properties":{"id":"24661872","dp":13771,"de":13840}},{"type":"Polygon","arcs":[[5513,5514,-5512]],"properties":{"id":"24661873","dp":15744,"de":1566}},{"type":"Polygon","arcs":[[-5515,5515,-412,-409,-398,5516]],"properties":{"id":"24661874","dp":11193,"de":5645}},{"type":"Polygon","arcs":[[5517,5518,5519,5520,5521,-407,-411,-416]],"properties":{"id":"24661877","dp":4971,"de":5242}},{"type":"Polygon","arcs":[[5522,5523,5524,5525,5526,-5518,-415]],"properties":{"id":"24661879","dp":7276,"de":7811}},{"type":"Polygon","arcs":[[5527,5528,-5523,5529]],"properties":{"id":"24661880","dp":14052,"de":2236}},{"type":"Polygon","arcs":[[5530,5531,5532,5533,-5524,-5529]],"properties":{"id":"24661881","dp":19101,"de":3651}},{"type":"Polygon","arcs":[[5534,5535,5536,-5531,-5528,5537]],"properties":{"id":"24661882","dp":14992,"de":2623}},{"type":"Polygon","arcs":[[5538,5539,-3175,-5535,5540]],"properties":{"id":"24661883","dp":5861,"de":38564}},{"type":"Polygon","arcs":[[5541,-5541,5542,5543]],"properties":{"id":"24661884","dp":12598,"de":8352}},{"type":"Polygon","arcs":[[5544,-5543,-5538,-5530,-414,5545,-5325]],"properties":{"id":"24661885","dp":6272,"de":887}},{"type":"Polygon","arcs":[[-5326,-5546,-417,-413,-5516,-5514,-5509]],"properties":{"id":"24661886","dp":5636,"de":22045}},{"type":"Polygon","arcs":[[-4809,5546,-5544,-5545,-4815]],"properties":{"id":"24661887","dp":14227,"de":1328}},{"type":"Polygon","arcs":[[-5536,-3174,-5028,5547]],"properties":{"id":"24661889","dp":45392,"de":10535}},{"type":"Polygon","arcs":[[-5548,5548,5549,-5537]],"properties":{"id":"24661890","dp":22307,"de":4142}},{"type":"Polygon","arcs":[[-5550,5550,5551,-5532]],"properties":{"id":"24661891","dp":19068,"de":3105}},{"type":"Polygon","arcs":[[-5549,-5027,-5034,5552,-5551]],"properties":{"id":"24661892","dp":20722,"de":2208}},{"type":"Polygon","arcs":[[5553,5554,5555,-5235]],"properties":{"id":"24662308","dp":1893,"de":261}},{"type":"Polygon","arcs":[[-5554,-5234,5556,5557,5558,5559]],"properties":{"id":"24662309","dp":1331,"de":1818}},{"type":"Polygon","arcs":[[-5233,5560,5561,-5557]],"properties":{"id":"24662310","dp":2185,"de":325}},{"type":"Polygon","arcs":[[5562,5563,5564,5565,5566,5567,-4290,5568,-583,-576,-4383,-4379,5569]],"properties":{"id":"24663351","dp":0,"de":5176}},{"type":"Polygon","arcs":[[-4491,5570,5571,-5567,5572]],"properties":{"id":"24663352","dp":17255,"de":1583}},{"type":"Polygon","arcs":[[-4490,5573,-5571]],"properties":{"id":"24663353","dp":38342,"de":4285}},{"type":"Polygon","arcs":[[-5371,-4863,-4866,-4861,-5311,5574,5575]],"properties":{"id":"24663012","dp":3553,"de":0}},{"type":"Polygon","arcs":[[-5310,5576,5577,-5575]],"properties":{"id":"24663013","dp":4801,"de":1237}},{"type":"Polygon","arcs":[[-5577,-5309,-5307,-5305,5578,5579,5580,5581,5582,5583]],"properties":{"id":"24663014","dp":2146,"de":461}},{"type":"Polygon","arcs":[[-5581,5584,5585,5586,5587]],"properties":{"id":"24663015","dp":6630,"de":867}},{"type":"Polygon","arcs":[[5588,5589,5590,-5586]],"properties":{"id":"24663016","dp":6259,"de":797}},{"type":"Polygon","arcs":[[5591,5592,5593,5594,-5587,-5591,5595]],"properties":{"id":"24663017","dp":4788,"de":1934}},{"type":"Polygon","arcs":[[5596,-5594,5597]],"properties":{"id":"24663018","dp":12425,"de":1063}},{"type":"Polygon","arcs":[[-5582,-5588,-5595,-5597,5598,5599,5600]],"properties":{"id":"24663019","dp":8546,"de":0}},{"type":"Polygon","arcs":[[-5583,-5601,5601,5602,5603,5604]],"properties":{"id":"24663020","dp":3414,"de":88}},{"type":"Polygon","arcs":[[5605,5606,5607,5608,5609,-5604,5610,5611]],"properties":{"id":"24663021","dp":1716,"de":0}},{"type":"Polygon","arcs":[[5612,5613,5614,5615,-5607]],"properties":{"id":"24663022","dp":2784,"de":0}},{"type":"Polygon","arcs":[[5616,5617,5618,5619,-5608,-5616,5620]],"properties":{"id":"24663023","dp":2460,"de":0}},{"type":"Polygon","arcs":[[5621,-5621,-5615,5622,5623]],"properties":{"id":"24663024","dp":3356,"de":0}},{"type":"Polygon","arcs":[[5624,5625,-5624,5626,5627,5628]],"properties":{"id":"24663025","dp":2667,"de":277}},{"type":"Polygon","arcs":[[5629,5630,5631,-5617,-5622,-5626,5632]],"properties":{"id":"24663026","dp":8355,"de":0}},{"type":"Polygon","arcs":[[5633,-5633,-5625,5634,5635,5636]],"properties":{"id":"24663027","dp":2987,"de":288}},{"type":"Polygon","arcs":[[5637,-4944,-5440,5638,-5630,-5634]],"properties":{"id":"24663028","dp":4176,"de":0}},{"type":"Polygon","arcs":[[-4945,-5638,-5637,5639,-4951]],"properties":{"id":"24663029","dp":3170,"de":0}},{"type":"Polygon","arcs":[[5640,5641,5642,5643]],"properties":{"id":"24661758","dp":16156,"de":2135}},{"type":"Polygon","arcs":[[-5644,5644,5645,5646]],"properties":{"id":"24661759","dp":16996,"de":0}},{"type":"Polygon","arcs":[[-5646,5647,5648,5649]],"properties":{"id":"24661760","dp":16938,"de":2857}},{"type":"Polygon","arcs":[[5650,5651,-5368,5652,-5437,-4942,5653]],"properties":{"id":"24663033","dp":3425,"de":276}},{"type":"Polygon","arcs":[[-5367,5654,5655,-5438,-5653]],"properties":{"id":"24663034","dp":4851,"de":2227}},{"type":"Polygon","arcs":[[5656,5657,-5655,5658]],"properties":{"id":"24663035","dp":2814,"de":1185}},{"type":"Polygon","arcs":[[5659,5660,5661,5662,5663,-5658,5664]],"properties":{"id":"24663036","dp":4236,"de":1253}},{"type":"Polygon","arcs":[[5665,5666,5667,-5660]],"properties":{"id":"24663037","dp":2719,"de":477}},{"type":"Polygon","arcs":[[5668,5669,5670,5671,-5661,-5668]],"properties":{"id":"24663038","dp":3770,"de":0}},{"type":"Polygon","arcs":[[5672,5673,5674,5675,-5669,-5667]],"properties":{"id":"24663039","dp":3710,"de":0}},{"type":"Polygon","arcs":[[5676,-5673,-5666,-5665,-5657]],"properties":{"id":"24663040","dp":2819,"de":336}},{"type":"Polygon","arcs":[[-5676,5677,5678,-5670]],"properties":{"id":"24663041","dp":2945,"de":0}},{"type":"Polygon","arcs":[[-5675,5679,5680,5681,5682,5683,5684,-5678]],"properties":{"id":"24663042","dp":3268,"de":0}},{"type":"Polygon","arcs":[[5685,5686,5687,5688,-5684]],"properties":{"id":"24663043","dp":2853,"de":340}},{"type":"Polygon","arcs":[[-5671,-5679,-5685,-5689,5689,5690]],"properties":{"id":"24663044","dp":3365,"de":635}},{"type":"Polygon","arcs":[[-5691,5691,5692,5693,5694,-5662,-5672]],"properties":{"id":"24663045","dp":3039,"de":3211}},{"type":"Polygon","arcs":[[5695,5696,5697,-5693,5698]],"properties":{"id":"24663046","dp":3451,"de":1261}},{"type":"Polygon","arcs":[[5699,5700,5701,5702]],"properties":{"id":"24661791","dp":18706,"de":2097}},{"type":"Polygon","arcs":[[5703,-5703,5704,-5520]],"properties":{"id":"24661792","dp":17711,"de":0}},{"type":"Polygon","arcs":[[-5519,-5527,5705,5706,-5700,-5704]],"properties":{"id":"24661793","dp":13902,"de":5226}},{"type":"Polygon","arcs":[[5707,5708,5709,-5706,-5526]],"properties":{"id":"24661794","dp":18778,"de":0}},{"type":"Polygon","arcs":[[-5534,5710,-5708,-5525]],"properties":{"id":"24661795","dp":17990,"de":7191}},{"type":"Polygon","arcs":[[5711,5712,5713,-5711]],"properties":{"id":"24661796","dp":15874,"de":3321}},{"type":"Polygon","arcs":[[-5552,-5553,5714,5715,-5712,-5533]],"properties":{"id":"24661797","dp":11063,"de":7183}},{"type":"Polygon","arcs":[[5716,-5507,-5505,-3166,5717]],"properties":{"id":"24661843","dp":21604,"de":2389}},{"type":"Polygon","arcs":[[-3690,-5508,-5717,5718,5719]],"properties":{"id":"24661844","dp":17615,"de":3145}},{"type":"Polygon","arcs":[[-5719,-5718,-3165,5720]],"properties":{"id":"24661845","dp":17066,"de":2666}},{"type":"Polygon","arcs":[[5721,-5721,-3164,5722]],"properties":{"id":"24661846","dp":15626,"de":2924}},{"type":"Polygon","arcs":[[5723,-4787,-3705,-3699,-3691,-5720,-5722]],"properties":{"id":"24661847","dp":13139,"de":6744}},{"type":"Polygon","arcs":[[-4788,-5724,-5723,-3163,5724]],"properties":{"id":"24661848","dp":31371,"de":18805}},{"type":"Polygon","arcs":[[-4789,-5725,5725,5726]],"properties":{"id":"24661849","dp":17768,"de":4347}},{"type":"Polygon","arcs":[[-5726,-3178,5727,5728]],"properties":{"id":"24661850","dp":20327,"de":4754}},{"type":"Polygon","arcs":[[-5728,-3177,5729,5730]],"properties":{"id":"24661851","dp":17157,"de":4987}},{"type":"Polygon","arcs":[[-5730,-3176,-5540,5731]],"properties":{"id":"24661852","dp":12081,"de":5338}},{"type":"Polygon","arcs":[[-4806,5732,-5732,-5539,-5542,-5547,-4808]],"properties":{"id":"24661853","dp":11568,"de":4222}},{"type":"Polygon","arcs":[[5733,-5731,-5733,-4805]],"properties":{"id":"24661854","dp":16275,"de":3691}},{"type":"Polygon","arcs":[[-4797,5734,-5729,-5734,-4802]],"properties":{"id":"24661855","dp":14986,"de":4289}},{"type":"Polygon","arcs":[[5735,-5727,-5735,-4796,-4801]],"properties":{"id":"24661856","dp":12903,"de":2867}},{"type":"Polygon","arcs":[[-4790,-5736,-4800,-4794]],"properties":{"id":"24661857","dp":15374,"de":3524}},{"type":"Polygon","arcs":[[5736,5737,5738,-5477,5739,5740]],"properties":{"id":"24662291","dp":2363,"de":2620}},{"type":"Polygon","arcs":[[5741,5742,5743,-5738,5744]],"properties":{"id":"24662292","dp":3110,"de":249}},{"type":"Polygon","arcs":[[5745,5746,-5478,-5739,-5744,5747]],"properties":{"id":"24662293","dp":1729,"de":569}},{"type":"Polygon","arcs":[[5748,-5748,-5743,5749]],"properties":{"id":"24662294","dp":3013,"de":0}},{"type":"Polygon","arcs":[[5750,5751,-5750,-5742]],"properties":{"id":"24662295","dp":3863,"de":0}},{"type":"Polygon","arcs":[[5752,5753,5754,5755,5756,5757]],"properties":{"id":"24661972","dp":7154,"de":5237}},{"type":"Polygon","arcs":[[-1498,-1494,5758,-5754]],"properties":{"id":"24661973","dp":14735,"de":0}},{"type":"Polygon","arcs":[[-5759,-1493,5759,5760,-5755]],"properties":{"id":"24661974","dp":11199,"de":2828}},{"type":"Polygon","arcs":[[-5761,5761,5762,-5756]],"properties":{"id":"24661975","dp":12568,"de":1477}},{"type":"Polygon","arcs":[[-5763,5763,5764,5765,5766]],"properties":{"id":"24661976","dp":12302,"de":3386}},{"type":"Polygon","arcs":[[-5766,5767,5768,5769,5770]],"properties":{"id":"24661977","dp":12413,"de":3605}},{"type":"Polygon","arcs":[[-5765,5771,5772,5773,-5768]],"properties":{"id":"24661978","dp":9698,"de":3723}},{"type":"Polygon","arcs":[[-5774,5774,5775,5776]],"properties":{"id":"24661979","dp":10805,"de":1761}},{"type":"Polygon","arcs":[[5777,-5769,-5777,-1475,-1490,5778]],"properties":{"id":"24661980","dp":12658,"de":0}},{"type":"Polygon","arcs":[[-5572,-5574,-4487,5779,5780,5781,-4293,-4499,-3971,5782,-1106,-3400,-4287,-5568]],"properties":{"id":"24663354","dp":3628,"de":402}},{"type":"Polygon","arcs":[[-4294,-5782,-4475]],"properties":{"id":"24663355","dp":111302,"de":4166}},{"type":"Polygon","arcs":[[-5781,5783,-4481,-4476]],"properties":{"id":"24663356","dp":44790,"de":2958}},{"type":"Polygon","arcs":[[-4486,-4482,-5784,-5780]],"properties":{"id":"24663357","dp":30050,"de":1518}},{"type":"Polygon","arcs":[[-2958,5784,-2749,5785,-1319,-1317,-1315,-1311]],"properties":{"id":"24663358","dp":4498,"de":23309}},{"type":"Polygon","arcs":[[-2957,5786,5787,-2750,-5785]],"properties":{"id":"24663359","dp":24693,"de":8844}},{"type":"Polygon","arcs":[[-2751,-5788,5788]],"properties":{"id":"24663360","dp":43966,"de":6404}},{"type":"Polygon","arcs":[[-2956,-2756,-2752,-5789,-5787]],"properties":{"id":"24663361","dp":11578,"de":26430}},{"type":"Polygon","arcs":[[-1320,-5786,-2748,5789,5790,-1972,5791,-5008,-5014,5792,5793,5794,5795,-1286,-1291,-1297]],"properties":{"id":"24663362","dp":377,"de":1046}},{"type":"Polygon","arcs":[[5796,-5209,-2719,-2717,5797,-5790,-2747,-2745]],"properties":{"id":"24663363","dp":3285,"de":10361}},{"type":"Polygon","arcs":[[-1978,-1973,-5791,-5798,-2716]],"properties":{"id":"24663364","dp":3918,"de":1604}},{"type":"Polygon","arcs":[[-5797,-3389,-2758,-230,-2742,5798,5799,-5210]],"properties":{"id":"24663365","dp":5087,"de":3867}},{"type":"Polygon","arcs":[[5800,-5799,-2741,-2720,5801]],"properties":{"id":"24663366","dp":27344,"de":2074}},{"type":"Polygon","arcs":[[5802,5803,-5802,-2724]],"properties":{"id":"24663367","dp":45965,"de":30965}},{"type":"Polygon","arcs":[[-5211,-5800,-5801,-5804,5804]],"properties":{"id":"24663368","dp":39370,"de":14173}},{"type":"Polygon","arcs":[[5805,5806,5807,5808,-5050]],"properties":{"id":"24661902","dp":15724,"de":3621}},{"type":"Polygon","arcs":[[-5048,5809,5810,-5806]],"properties":{"id":"24661903","dp":17957,"de":4042}},{"type":"Polygon","arcs":[[-5047,5811,5812,-5810]],"properties":{"id":"24661904","dp":14102,"de":5769}},{"type":"Polygon","arcs":[[5813,5814,5815,-5812]],"properties":{"id":"24661905","dp":18581,"de":4181}},{"type":"Polygon","arcs":[[5816,5817,-5815,5818]],"properties":{"id":"24661906","dp":17101,"de":5253}},{"type":"Polygon","arcs":[[-5493,-5819,-5814,-5046,-5502,-5499]],"properties":{"id":"24661907","dp":14172,"de":6843}},{"type":"Polygon","arcs":[[-5808,5819,5820]],"properties":{"id":"24661908","dp":18148,"de":3086}},{"type":"Polygon","arcs":[[-5809,-5821,5821,5822,5823,5824]],"properties":{"id":"24661909","dp":12063,"de":9047}},{"type":"Polygon","arcs":[[5825,5826,5827,5828,-5822,-5820]],"properties":{"id":"24661910","dp":10776,"de":4223}},{"type":"Polygon","arcs":[[5829,5830,5831,5832,-5827]],"properties":{"id":"24661911","dp":17397,"de":3253}},{"type":"Polygon","arcs":[[5833,-5824,5834,-5030,-5038]],"properties":{"id":"24661912","dp":13715,"de":8823}},{"type":"Polygon","arcs":[[-5051,-5825,-5834,-5037,-5041]],"properties":{"id":"24661913","dp":15152,"de":9418}},{"type":"Polygon","arcs":[[-5329,-5511,-5513,-5517,-405,5835,5836]],"properties":{"id":"24661916","dp":2651,"de":334}},{"type":"Polygon","arcs":[[5837,-5836,-404,5838,5839,5840,5841]],"properties":{"id":"24661917","dp":2234,"de":4686}},{"type":"Polygon","arcs":[[5842,-5842,5843,5844,5845]],"properties":{"id":"24661918","dp":5145,"de":970}},{"type":"Polygon","arcs":[[5846,-5846,5847,5848,5849,5850,5851]],"properties":{"id":"24661919","dp":2671,"de":1380}},{"type":"Polygon","arcs":[[5852,-5852,5853,5854,5855]],"properties":{"id":"24661920","dp":2496,"de":1621}},{"type":"Polygon","arcs":[[5856,-5856,5857,5858,5859]],"properties":{"id":"24661921","dp":2077,"de":837}},{"type":"Polygon","arcs":[[-5312,5860,-5860,5861,5862,5863,5864,5865]],"properties":{"id":"24661922","dp":3886,"de":1209}},{"type":"Polygon","arcs":[[5866,5867,-5186,5868,-5469,-5473]],"properties":{"id":"24662322","dp":2640,"de":0}},{"type":"Polygon","arcs":[[-5185,5869,5870,5871,5872,5873,5874,-5869]],"properties":{"id":"24662323","dp":4678,"de":0}},{"type":"Polygon","arcs":[[-5872,5875,5876]],"properties":{"id":"24662324","dp":4533,"de":0}},{"type":"Polygon","arcs":[[-5871,5877,-5164,5878,-4971,-4976,5879,-5876]],"properties":{"id":"24662325","dp":3143,"de":348}},{"type":"Polygon","arcs":[[-5873,-5877,-5880,-4978,5880,5881]],"properties":{"id":"24662326","dp":3614,"de":0}},{"type":"Polygon","arcs":[[5882,-5874,-5882,5883,-5052,5884]],"properties":{"id":"24662327","dp":2698,"de":177}},{"type":"Polygon","arcs":[[5885,5886,-5779,-1489]],"properties":{"id":"24661981","dp":16081,"de":1520}},{"type":"Polygon","arcs":[[5887,-5770,-5778,-5887,5888]],"properties":{"id":"24661982","dp":15856,"de":1401}},{"type":"Polygon","arcs":[[5889,-5757,-5767,-5771,-5888,5890]],"properties":{"id":"24661983","dp":8888,"de":2923}},{"type":"Polygon","arcs":[[5891,-5891,-5889,5892,5893,5894,5895,5896,5897]],"properties":{"id":"24661984","dp":10451,"de":0}},{"type":"Polygon","arcs":[[5898,-5897]],"properties":{"id":"24661985","dp":29836,"de":0}},{"type":"Polygon","arcs":[[5899,-5898,-5899,-5896,5900,5901]],"properties":{"id":"24661986","dp":10344,"de":2323}},{"type":"Polygon","arcs":[[-5901,-5895,5902,5903]],"properties":{"id":"24661987","dp":21005,"de":2234}},{"type":"Polygon","arcs":[[-5903,-5894,5904,5905]],"properties":{"id":"24661988","dp":17865,"de":3370}},{"type":"Polygon","arcs":[[5906,-5905,-5893,-5886,-1488,5907]],"properties":{"id":"24661989","dp":16571,"de":2380}},{"type":"Polygon","arcs":[[5908,-5908,-1487,5909,5910]],"properties":{"id":"24661990","dp":12929,"de":3521}},{"type":"Polygon","arcs":[[5911,-5910,-1486,5912,5913]],"properties":{"id":"24661991","dp":16134,"de":3781}},{"type":"Polygon","arcs":[[5914,-5913,-1485,-1482,5915,5916]],"properties":{"id":"24661992","dp":16920,"de":3492}},{"type":"Polygon","arcs":[[5917,-5917,5918,5919,5920]],"properties":{"id":"24661993","dp":15101,"de":4949}},{"type":"Polygon","arcs":[[-5916,5921,-5919]],"properties":{"id":"24661994","dp":15261,"de":0}},{"type":"Polygon","arcs":[[5922,-5922,-1481,-1478,5923]],"properties":{"id":"24661995","dp":14195,"de":2545}},{"type":"Polygon","arcs":[[-5924,-1477,-1459,5924,5925]],"properties":{"id":"24661996","dp":9977,"de":0}},{"type":"Polygon","arcs":[[5926,5927,5928,5929,5930]],"properties":{"id":"24662366","dp":4026,"de":0}},{"type":"Polygon","arcs":[[-5929,5931,-4948,5932,5933,5934,5935,5936]],"properties":{"id":"24662367","dp":3485,"de":744}},{"type":"Polygon","arcs":[[-4947,-4950,5937,-5933]],"properties":{"id":"24662368","dp":3632,"de":284}},{"type":"Polygon","arcs":[[-5938,-4949,5938,5939,5940,-5934]],"properties":{"id":"24662369","dp":2238,"de":438}},{"type":"Polygon","arcs":[[5941,5942,5943,-5940]],"properties":{"id":"24662370","dp":3178,"de":317}},{"type":"Polygon","arcs":[[5944,-5062]],"properties":{"id":"24663408","dp":7381,"de":0}},{"type":"Polygon","arcs":[[-4979,-4973,5945,5946,-4958,-5063,-5945,-5061]],"properties":{"id":"24663409","dp":4978,"de":712}},{"type":"Polygon","arcs":[[-4969,5947,5948,-5946]],"properties":{"id":"24663410","dp":6406,"de":0}},{"type":"Polygon","arcs":[[-5949,5949,-4959,-5947]],"properties":{"id":"24663411","dp":4462,"de":0}},{"type":"Polygon","arcs":[[5950,-2044,-3114,-4426]],"properties":{"id":"24663412","dp":4522,"de":895}},{"type":"Polygon","arcs":[[-4425,-2060,-4424,-4427,-2058,-2045,-5951]],"properties":{"id":"24663413","dp":9115,"de":3651}},{"type":"Polygon","arcs":[[5951,5952,5953,-3511,5954,5955,-3608,-3600,-4555,-4414,-3115,-2052,-2037,-2035,-1532,5956,5957,5958,5959,5960,5961]],"properties":{"id":"24663419","dp":33,"de":2588}},{"type":"Polygon","arcs":[[5962,5963,5964,5965,5966,5967]],"properties":{"id":"24663420","dp":4244,"de":312}},{"type":"Polygon","arcs":[[-5964,5968]],"properties":{"id":"24663421","dp":4817,"de":400}},{"type":"Polygon","arcs":[[-5963,5969,5970]],"properties":{"id":"24663422","dp":4695,"de":428}},{"type":"Polygon","arcs":[[-5969,-5971,5971,-5958,5972,5973,5974,-5153,-3442,5975,5976,5977,5978,-5965]],"properties":{"id":"24663423","dp":110,"de":3086}},{"type":"Polygon","arcs":[[-5972,5979,5980,-5959]],"properties":{"id":"24663424","dp":4548,"de":989}},{"type":"Polygon","arcs":[[5981,-5960,-5981,5982,5983]],"properties":{"id":"24663425","dp":9652,"de":1159}},{"type":"Polygon","arcs":[[5984,-2210,-2303,-2301]],"properties":{"id":"24663426","dp":17381,"de":0}},{"type":"Polygon","arcs":[[-2138,-2213,-2211,-5985,-2300,-2298,-2215]],"properties":{"id":"24663428","dp":4996,"de":1087}},{"type":"Polygon","arcs":[[-5006,-5792,-1971,5985,5986,-3024,-3021,-1321]],"properties":{"id":"24663370","dp":3,"de":174}},{"type":"Polygon","arcs":[[5987,5988,-5986,-1970]],"properties":{"id":"24663371","dp":48581,"de":4391}},{"type":"Polygon","arcs":[[-1969,5989,-5988]],"properties":{"id":"24663372","dp":40918,"de":0}},{"type":"Polygon","arcs":[[-3288,-3289,-3296,-3462,-3023,-3025,-5987,-5989,-5990,-1968]],"properties":{"id":"24663373","dp":11791,"de":1515}},{"type":"Polygon","arcs":[[-4338,-4330,-3981,5990,5991]],"properties":{"id":"24663374","dp":10415,"de":1298}},{"type":"Polygon","arcs":[[5992,5993,5994,5995,5996,-4333,-5992,5997]],"properties":{"id":"24663375","dp":9598,"de":802}},{"type":"Polygon","arcs":[[5998,5999,-4347,6000,6001,-5994]],"properties":{"id":"24663376","dp":3970,"de":5338}},{"type":"Polygon","arcs":[[6002,-4343,-4348,-6000]],"properties":{"id":"24663377","dp":9555,"de":1420}},{"type":"Polygon","arcs":[[6003,-4525,-4344,-4339,-6003,-5999,-5993,6004]],"properties":{"id":"24663378","dp":4187,"de":1067}},{"type":"Polygon","arcs":[[-3972,-4530,-4526,-6004,6005]],"properties":{"id":"24663379","dp":14021,"de":0}},{"type":"Polygon","arcs":[[-6005,-5998,-5991,-3980,-6006]],"properties":{"id":"24663380","dp":5446,"de":0}},{"type":"Polygon","arcs":[[6006,6007,-2873,6008,-2116,-2122,-2125,-2311,6009]],"properties":{"id":"24663381","dp":2,"de":638}},{"type":"Polygon","arcs":[[-3108,-2542,-2545,-2551,-2555,-3428,6010,-2533,-2537,-2539]],"properties":{"id":"24663382","dp":5,"de":0}},{"type":"Polygon","arcs":[[6011,6012,6013,6014,6015,6016,-5390,-2028,-1938]],"properties":{"id":"24663383","dp":617,"de":1335}},{"type":"Polygon","arcs":[[6017,-6016,6018]],"properties":{"id":"24663384","dp":4514,"de":4583}},{"type":"Polygon","arcs":[[6019,6020,-6019,-6015,6021]],"properties":{"id":"24663385","dp":9437,"de":974}},{"type":"Polygon","arcs":[[-6021,6022,-5386,-5384,6023]],"properties":{"id":"24663386","dp":7647,"de":880}},{"type":"Polygon","arcs":[[-6024,-5389,-5391,-6017,-6018]],"properties":{"id":"24663387","dp":8240,"de":0}},{"type":"Polygon","arcs":[[6024,6025,-6023,-6020,6026]],"properties":{"id":"24663388","dp":9557,"de":766}},{"type":"Polygon","arcs":[[-6027,-6022,-6014,6027]],"properties":{"id":"24663389","dp":7300,"de":933}},{"type":"Polygon","arcs":[[6028,6029,6030,-5983,-5980,-5970,-5968,6031,6032,6033,-5995,-6002,6034]],"properties":{"id":"24663414","dp":3210,"de":1098}},{"type":"Polygon","arcs":[[-6029,6035]],"properties":{"id":"24663415","dp":8810,"de":0}},{"type":"Polygon","arcs":[[-4353,-4359,6036,-5962,6037,6038,-6030,-6036,-6035,-6001,-4346]],"properties":{"id":"24663416","dp":2317,"de":5462}},{"type":"Polygon","arcs":[[-5984,-6031,-6039,6039]],"properties":{"id":"24663417","dp":9046,"de":2798}},{"type":"Polygon","arcs":[[-5961,-5982,-6040,-6038]],"properties":{"id":"24663418","dp":10895,"de":0}},{"type":"Polygon","arcs":[[6040,-367,-5319,-5315]],"properties":{"id":"24661730","dp":16880,"de":0}},{"type":"Polygon","arcs":[[6041,-378,-371,-6041,-5314]],"properties":{"id":"24661731","dp":12441,"de":2597}},{"type":"Polygon","arcs":[[-5866,6042,-375,-6042,-5313]],"properties":{"id":"24661732","dp":16168,"de":3448}},{"type":"Polygon","arcs":[[-5865,6043,6044,-376,-6043]],"properties":{"id":"24661733","dp":17262,"de":0}},{"type":"Polygon","arcs":[[-5864,6045,6046,6047,-6044]],"properties":{"id":"24661734","dp":18052,"de":0}},{"type":"Polygon","arcs":[[6048,-6046,-5863,6049]],"properties":{"id":"24661735","dp":15244,"de":1152}},{"type":"Polygon","arcs":[[-5859,6050,6051,6052,-6050,-5862]],"properties":{"id":"24661736","dp":9780,"de":5118}},{"type":"Polygon","arcs":[[6053,-6051,-5858,-5855]],"properties":{"id":"24661737","dp":14640,"de":2877}},{"type":"Polygon","arcs":[[6054,6055,6056,6057,-6052,-6054,-5854]],"properties":{"id":"24661738","dp":10280,"de":2730}},{"type":"Polygon","arcs":[[6058,6059,-6055,-5851]],"properties":{"id":"24661739","dp":15628,"de":2428}},{"type":"Polygon","arcs":[[6060,6061,-6056,-6060]],"properties":{"id":"24661740","dp":12657,"de":1571}},{"type":"Polygon","arcs":[[6062,6063,-6061,6064]],"properties":{"id":"24661741","dp":17597,"de":0}},{"type":"Polygon","arcs":[[6065,-6065,-6059,-5850]],"properties":{"id":"24661742","dp":14510,"de":3115}},{"type":"Polygon","arcs":[[6066,6067,-6066,-5849]],"properties":{"id":"24661743","dp":15205,"de":74531}},{"type":"Polygon","arcs":[[6068,6069,-6067,-5848]],"properties":{"id":"24661744","dp":16950,"de":3571}},{"type":"Polygon","arcs":[[6070,6071,-6069,-5845]],"properties":{"id":"24661745","dp":16925,"de":1766}},{"type":"Polygon","arcs":[[6072,6073,6074,-6072]],"properties":{"id":"24661746","dp":20318,"de":1724}},{"type":"Polygon","arcs":[[-5841,6075,6076,-6073,-6071,-5844]],"properties":{"id":"24661747","dp":16655,"de":1535}},{"type":"Polygon","arcs":[[6077,6078,6079,6080,6081,6082,-6074,-6077,6083]],"properties":{"id":"24661748","dp":11237,"de":3669}},{"type":"Polygon","arcs":[[6084,6085,-6084,-6076,-5840]],"properties":{"id":"24661749","dp":17024,"de":0}},{"type":"Polygon","arcs":[[6086,6087,6088,-6078,-6086]],"properties":{"id":"24661750","dp":13285,"de":0}},{"type":"Polygon","arcs":[[-6085,-5839,-403,6089,-6087]],"properties":{"id":"24661751","dp":2890,"de":2701}},{"type":"Polygon","arcs":[[6090,6091,6092,-6088,-6090]],"properties":{"id":"24661752","dp":8127,"de":3802}},{"type":"Polygon","arcs":[[-6093,6093,6094,-6089]],"properties":{"id":"24661753","dp":21478,"de":0}},{"type":"Polygon","arcs":[[-6095,6095,6096,-6079]],"properties":{"id":"24661754","dp":17242,"de":2263}},{"type":"Polygon","arcs":[[-6080,-6097,6097,6098]],"properties":{"id":"24661755","dp":20180,"de":4279}},{"type":"Polygon","arcs":[[-6099,6099,6100,-6081]],"properties":{"id":"24661756","dp":18355,"de":2444}},{"type":"Polygon","arcs":[[-6101,6101,6102,-5642,-6082]],"properties":{"id":"24661757","dp":17674,"de":3386}},{"type":"MultiPolygon","arcs":[[[6103,6104,6105,6106,6107]],[[6108,6109,6110,6111]]],"properties":{"id":"24662238","dp":2261,"de":793}},{"type":"Polygon","arcs":[[-5189,-5204,6112,-5171,-5178,-5176,-5174,6113,6114]],"properties":{"id":"24663429","dp":2041,"de":2799}},{"type":"Polygon","arcs":[[-5179,-5182,6115,-5190,-6115,6116,-5183]],"properties":{"id":"24663430","dp":900,"de":1705}},{"type":"Polygon","arcs":[[-3896,6117,-3110,-1072,-3894]],"properties":{"id":"24663431","dp":5080,"de":6645}},{"type":"Polygon","arcs":[[-3111,-6118,-3903]],"properties":{"id":"24663432","dp":5280,"de":570}},{"type":"Polygon","arcs":[[-2560,6118,6119,-2961,-4585,-2973,-2971]],"properties":{"id":"24663434","dp":8464,"de":616}},{"type":"Polygon","arcs":[[6120,6121,6122,-6119,-2559,-2563]],"properties":{"id":"24663436","dp":10303,"de":1757}},{"type":"Polygon","arcs":[[6123,-2733,-2735,-2736,-2962,-6120]],"properties":{"id":"24663437","dp":9503,"de":20644}},{"type":"Polygon","arcs":[[-6124,-6123,6124,-5212,6125,6126]],"properties":{"id":"24663438","dp":6438,"de":2319}},{"type":"Polygon","arcs":[[-1201,6127,6128,-1245,-1253,-1254,-5127,-3670,6129]],"properties":{"id":"24663439","dp":625,"de":1190}},{"type":"Polygon","arcs":[[-1200,-1244,6130,6131,6132,-6128]],"properties":{"id":"24663441","dp":0,"de":2041}},{"type":"Polygon","arcs":[[-6129,6133,6134,-1248,-1246]],"properties":{"id":"24663442","dp":7644,"de":47537}},{"type":"Polygon","arcs":[[6135,6136,-6134,-6133]],"properties":{"id":"24663443","dp":9341,"de":8797}},{"type":"Polygon","arcs":[[-2967,6137,6138,6139]],"properties":{"id":"24663444","dp":23480,"de":0}},{"type":"Polygon","arcs":[[-6132,6140,-2590,-2968,-6140,-6136]],"properties":{"id":"24663445","dp":5663,"de":8789}},{"type":"Polygon","arcs":[[6141,6142,6143,-5751,6144]],"properties":{"id":"24662296","dp":2301,"de":0}},{"type":"Polygon","arcs":[[6145,6146,6147,-6142,6148]],"properties":{"id":"24662297","dp":1810,"de":391}},{"type":"Polygon","arcs":[[-6149,-6145,-5745,6149,6150]],"properties":{"id":"24662298","dp":1947,"de":0}},{"type":"Polygon","arcs":[[-6146,-6151,6151,6152,6153]],"properties":{"id":"24662299","dp":2278,"de":0}},{"type":"Polygon","arcs":[[6154,6155,-6147,-6154,6156,6157,6158,6159,6160]],"properties":{"id":"24662300","dp":1832,"de":1214}},{"type":"Polygon","arcs":[[6161,6162,-6157,-6153,6163,6164]],"properties":{"id":"24662301","dp":2556,"de":1063}},{"type":"Polygon","arcs":[[-6150,-5737,6165,-6164,-6152]],"properties":{"id":"24662302","dp":2085,"de":0}},{"type":"Polygon","arcs":[[6166,-6159,6167,6168,-6165,-6166,6169]],"properties":{"id":"24662303","dp":1580,"de":0}},{"type":"Polygon","arcs":[[-6162,-6169,6170]],"properties":{"id":"24662304","dp":2816,"de":348}},{"type":"Polygon","arcs":[[-6158,-6163,-6171,-6168]],"properties":{"id":"24662305","dp":2878,"de":384}},{"type":"Polygon","arcs":[[-5232,6171,-5230,6172,6173,-5561]],"properties":{"id":"24662311","dp":1553,"de":149}},{"type":"Polygon","arcs":[[-5229,6174,-6173]],"properties":{"id":"24662312","dp":1454,"de":1075}},{"type":"Polygon","arcs":[[-6174,-6175,-5228,-5226,-5224,-5219,6175,-6155,6176,-5558,-5562]],"properties":{"id":"24662313","dp":840,"de":142}},{"type":"Polygon","arcs":[[-5218,-5201,-5205,-4676,6177,6178,-6156,-6176]],"properties":{"id":"24662314","dp":3498,"de":0}},{"type":"Polygon","arcs":[[-6148,-6179,6179,6180]],"properties":{"id":"24662315","dp":2455,"de":527}},{"type":"Polygon","arcs":[[-6178,-4679,-5215,6181,-6180]],"properties":{"id":"24662316","dp":2888,"de":306}},{"type":"Polygon","arcs":[[-6181,-6182,-5214,6182,-6143]],"properties":{"id":"24662317","dp":2817,"de":0}},{"type":"Polygon","arcs":[[-5213,-5197,6183,-6144,-6183]],"properties":{"id":"24662318","dp":2925,"de":0}},{"type":"Polygon","arcs":[[-5752,-6184,-5192,6184,-5746,-5749]],"properties":{"id":"24662319","dp":1692,"de":360}},{"type":"Polygon","arcs":[[-6185,-5191,-6116,-5181,-5868,6185,-5479,-5475,-5747]],"properties":{"id":"24662320","dp":2385,"de":812}},{"type":"Polygon","arcs":[[-6186,-5867,-5472,-5480]],"properties":{"id":"24662321","dp":3259,"de":0}},{"type":"Polygon","arcs":[[6186,6187,6188]],"properties":{"id":"24662705","dp":41953,"de":0}},{"type":"Polygon","arcs":[[-6189,6189,6190,6191,6192]],"properties":{"id":"24662706","dp":13309,"de":1079}},{"type":"MultiPolygon","arcs":[[[6193,6194,6195,6196,6197,6198]],[[6199]],[[6200,6201,6202]],[[6203]]],"properties":{"id":"24662707","dp":1614,"de":0}},{"type":"Polygon","arcs":[[-5649,6204,6205,6206,6207]],"properties":{"id":"24661761","dp":15096,"de":5038}},{"type":"Polygon","arcs":[[6208,-5650,-6208,6209,6210,-6064]],"properties":{"id":"24661762","dp":12626,"de":4966}},{"type":"Polygon","arcs":[[-6068,-6070,-6075,-6083,-5641,-5647,-6209,-6063]],"properties":{"id":"24661763","dp":12583,"de":3149}},{"type":"Polygon","arcs":[[-6211,6211,6212,-6062]],"properties":{"id":"24661764","dp":13913,"de":7681}},{"type":"Polygon","arcs":[[-6210,-6207,6213,6214,6215,-6212]],"properties":{"id":"24661765","dp":12851,"de":21205}},{"type":"Polygon","arcs":[[-6213,-6216,6216,6217,6218,-6057]],"properties":{"id":"24661766","dp":11159,"de":8956}},{"type":"Polygon","arcs":[[-6215,6219,6220,6221,6222,-6217]],"properties":{"id":"24661767","dp":11887,"de":8657}},{"type":"Polygon","arcs":[[6223,6224,6225,-6220,-6214]],"properties":{"id":"24661768","dp":7238,"de":1791}},{"type":"Polygon","arcs":[[6226,6227,-6224,-6206]],"properties":{"id":"24661769","dp":16767,"de":0}},{"type":"Polygon","arcs":[[6228,6229,-6227,-6205,-5648,-5645]],"properties":{"id":"24661770","dp":7574,"de":2425}},{"type":"Polygon","arcs":[[-6103,6230,6231,6232,-6229,-5643]],"properties":{"id":"24661771","dp":16973,"de":2600}},{"type":"Polygon","arcs":[[-6102,6233,6234,-6231]],"properties":{"id":"24661772","dp":16303,"de":0}},{"type":"Polygon","arcs":[[6235,6236,6237,-6234,-6100,-6098,-6096]],"properties":{"id":"24661773","dp":10762,"de":1326}},{"type":"Polygon","arcs":[[6238,6239,6240,-6238]],"properties":{"id":"24661774","dp":19375,"de":0}},{"type":"Polygon","arcs":[[6241,6242,-6239,-6237]],"properties":{"id":"24661775","dp":11594,"de":1293}},{"type":"Polygon","arcs":[[6243,6244,6245,-6242,6246]],"properties":{"id":"24661776","dp":8608,"de":2355}},{"type":"Polygon","arcs":[[-6246,6247,6248,6249,6250,-6240,-6243]],"properties":{"id":"24661777","dp":6741,"de":1690}},{"type":"Polygon","arcs":[[6251,6252,-6248,-6245,6253]],"properties":{"id":"24661778","dp":8116,"de":4743}},{"type":"Polygon","arcs":[[-6254,-6244,6254,6255]],"properties":{"id":"24661779","dp":6321,"de":2008}},{"type":"Polygon","arcs":[[6256,6257,-6256,6258]],"properties":{"id":"24661780","dp":9661,"de":1224}},{"type":"Polygon","arcs":[[6259,-6259,6260,6261,6262]],"properties":{"id":"24661781","dp":9341,"de":1508}},{"type":"Polygon","arcs":[[-6261,-6255,-6247,-6236,-6094,-6092]],"properties":{"id":"24661782","dp":5055,"de":2746}},{"type":"Polygon","arcs":[[6263,-6262,-6091,-402]],"properties":{"id":"24661783","dp":14177,"de":1407}},{"type":"Polygon","arcs":[[-401,6264,6265,-6263,-6264]],"properties":{"id":"24661784","dp":14551,"de":1345}},{"type":"Polygon","arcs":[[6266,-6266,6267]],"properties":{"id":"24661785","dp":11036,"de":0}},{"type":"Polygon","arcs":[[-408,-5522,6268,-6268,-6265,-400]],"properties":{"id":"24661786","dp":8508,"de":2130}},{"type":"Polygon","arcs":[[-5521,-5705,6269,6270,-6269]],"properties":{"id":"24661787","dp":11700,"de":0}},{"type":"Polygon","arcs":[[-6271,6271,-6260,-6267]],"properties":{"id":"24661788","dp":14873,"de":0}},{"type":"Polygon","arcs":[[6272,6273,-6257,-6272]],"properties":{"id":"24661789","dp":15202,"de":0}},{"type":"Polygon","arcs":[[-5702,6274,-6273,-6270]],"properties":{"id":"24661790","dp":16011,"de":1123}},{"type":"Polygon","arcs":[[6275,6276,6277]],"properties":{"id":"24662255","dp":3737,"de":0}},{"type":"Polygon","arcs":[[6278,6279,6280,6281,-6278,6282]],"properties":{"id":"24662256","dp":2588,"de":430}},{"type":"Polygon","arcs":[[-5236,-5556,6283,-5559,-6177,-6161,-5351,-5338]],"properties":{"id":"24662306","dp":1249,"de":139}},{"type":"Polygon","arcs":[[-5555,-5560,-6284]],"properties":{"id":"24662307","dp":1959,"de":424}},{"type":"Polygon","arcs":[[6284,6285,6286,6287,-6194,6288,-6203,6289,6290]],"properties":{"id":"24662671","dp":2857,"de":348}},{"type":"Polygon","arcs":[[-6192,6291,6292,6293,-6291]],"properties":{"id":"24662672","dp":6882,"de":887}},{"type":"Polygon","arcs":[[6294,6295,-6292,-6191,6296]],"properties":{"id":"24662673","dp":7914,"de":1071}},{"type":"Polygon","arcs":[[6297,-6296,6298,6299]],"properties":{"id":"24662674","dp":13984,"de":957}},{"type":"Polygon","arcs":[[6300,-6293,-6298,6301,6302]],"properties":{"id":"24662675","dp":9869,"de":913}},{"type":"Polygon","arcs":[[6303,6304,6305,-6302,6306]],"properties":{"id":"24662676","dp":6731,"de":2977}},{"type":"Polygon","arcs":[[-6307,-6300,6307,6308,6309]],"properties":{"id":"24662677","dp":11051,"de":1860}},{"type":"Polygon","arcs":[[-6309,6310,6311]],"properties":{"id":"24662678","dp":11729,"de":947}},{"type":"Polygon","arcs":[[-5875,-5883,6312,-3059,-3055,-5470]],"properties":{"id":"24662328","dp":3185,"de":1033}},{"type":"Polygon","arcs":[[6313,-6313,-5885,-5056,6314]],"properties":{"id":"24662329","dp":3261,"de":438}},{"type":"Polygon","arcs":[[-3060,-6314,6315,6316]],"properties":{"id":"24662330","dp":3657,"de":1406}},{"type":"Polygon","arcs":[[-3061,-6317,6317,6318,6319,6320]],"properties":{"id":"24662331","dp":1606,"de":110}},{"type":"Polygon","arcs":[[-6316,6321,6322,6323,6324,-6318]],"properties":{"id":"24662332","dp":6775,"de":602}},{"type":"Polygon","arcs":[[-6315,-5055,6325,6326,-6322]],"properties":{"id":"24662333","dp":3983,"de":1212}},{"type":"Polygon","arcs":[[-5059,-4964,6327,-6326]],"properties":{"id":"24662334","dp":4472,"de":365}},{"type":"Polygon","arcs":[[-6327,-6328,-4967,6328,6329,6330,6331]],"properties":{"id":"24662335","dp":3950,"de":1421}},{"type":"Polygon","arcs":[[-6332,6332,6333,-6323]],"properties":{"id":"24662336","dp":9900,"de":931}},{"type":"Polygon","arcs":[[-6331,6334,-5696,6335,-6333]],"properties":{"id":"24662337","dp":7324,"de":0}},{"type":"Polygon","arcs":[[-5688,6336,6337,6338,-6324,-6334,-6336,-5699,-5692,-5690]],"properties":{"id":"24662338","dp":2305,"de":1478}},{"type":"Polygon","arcs":[[6339,6340,-6338]],"properties":{"id":"24662339","dp":4017,"de":0}},{"type":"Polygon","arcs":[[6341,-6320,6342,-6340,-6337,-5687,6343]],"properties":{"id":"24662340","dp":3325,"de":764}},{"type":"Polygon","arcs":[[-6343,-6319,-6325,-6339,-6341]],"properties":{"id":"24662341","dp":3875,"de":230}},{"type":"Polygon","arcs":[[6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,-1830]],"properties":{"id":"24662730","dp":1834,"de":2895}},{"type":"Polygon","arcs":[[-1674,6354,6355,-1387,-6354,6356,6357,-3586]],"properties":{"id":"24662731","dp":614,"de":2821}},{"type":"Polygon","arcs":[[-1680,-1681,6358,-6355]],"properties":{"id":"24662732","dp":7581,"de":0}},{"type":"Polygon","arcs":[[-1684,-1689,-1694,-1708,-1383,-6356,-6359]],"properties":{"id":"24662733","dp":9120,"de":685}},{"type":"Polygon","arcs":[[-6358,6359,6360,6361,6362,6363,-3587]],"properties":{"id":"24662734","dp":3022,"de":2329}},{"type":"Polygon","arcs":[[6364,6365,-6361]],"properties":{"id":"24662735","dp":9518,"de":0}},{"type":"Polygon","arcs":[[6366,6367,-6107,6368,6369,6370]],"properties":{"id":"24662239","dp":3567,"de":602}},{"type":"Polygon","arcs":[[6371,6372,-6369,-6106]],"properties":{"id":"24662240","dp":7881,"de":3268}},{"type":"Polygon","arcs":[[-6373,6373,6374,-6370]],"properties":{"id":"24662241","dp":3505,"de":1525}},{"type":"Polygon","arcs":[[6375,-6371,-6375,6376,6377]],"properties":{"id":"24662242","dp":3234,"de":1782}},{"type":"Polygon","arcs":[[6378,6379,6380,6381,6382,6383,-1529,6384,-6377]],"properties":{"id":"24662243","dp":1208,"de":2566}},{"type":"Polygon","arcs":[[-6374,6385,6386,6387,6388,-6379]],"properties":{"id":"24662244","dp":2557,"de":909}},{"type":"Polygon","arcs":[[-6389,6389,6390,6391,6392,-6380]],"properties":{"id":"24662245","dp":2398,"de":0}},{"type":"Polygon","arcs":[[6393,-6390,-6388,6394,-6386,-6372]],"properties":{"id":"24662246","dp":10977,"de":448}},{"type":"Polygon","arcs":[[-6387,-6395]],"properties":{"id":"24662247","dp":0,"de":0}},{"type":"Polygon","arcs":[[6395,6396,6397,-6391,-6394,-6105]],"properties":{"id":"24662248","dp":1504,"de":225}},{"type":"Polygon","arcs":[[-6279,6398,6399,6400,-6392,-6398]],"properties":{"id":"24662250","dp":1143,"de":762}},{"type":"Polygon","arcs":[[-6393,-6401,6401,6402,-6381]],"properties":{"id":"24662251","dp":2939,"de":744}},{"type":"Polygon","arcs":[[-6400,6403,6404,-6402]],"properties":{"id":"24662252","dp":3252,"de":0}},{"type":"Polygon","arcs":[[6405,-6382,-6403,-6405]],"properties":{"id":"24662253","dp":10107,"de":0}},{"type":"Polygon","arcs":[[-6283,-6277,-6383,-6406,-6404,-6399]],"properties":{"id":"24662254","dp":3446,"de":461}},{"type":"Polygon","arcs":[[6406,-4695,6407,6408,6409,6410,6411,6412]],"properties":{"id":"24662585","dp":4198,"de":409}},{"type":"Polygon","arcs":[[-6413,6413,6414,6415,6416,6417]],"properties":{"id":"24662586","dp":4531,"de":1060}},{"type":"Polygon","arcs":[[-6417,6418,6419,6420]],"properties":{"id":"24662587","dp":13375,"de":1380}},{"type":"Polygon","arcs":[[-6407,-6418,-6421,6421,6422,-4696]],"properties":{"id":"24662588","dp":8159,"de":0}},{"type":"Polygon","arcs":[[6423,-6281,6424]],"properties":{"id":"24662257","dp":3152,"de":0}},{"type":"Polygon","arcs":[[6425,-6304,-6310,-6312,6426,6427,6428,-6346]],"properties":{"id":"24662679","dp":5501,"de":2354}},{"type":"Polygon","arcs":[[-6429,6429,-6347]],"properties":{"id":"24662680","dp":9791,"de":2083}},{"type":"Polygon","arcs":[[-6428,6430,6431,-6348,-6430]],"properties":{"id":"24662681","dp":9580,"de":1904}},{"type":"Polygon","arcs":[[-6432,6432,6433,-6349]],"properties":{"id":"24662682","dp":9391,"de":2186}},{"type":"Polygon","arcs":[[6434,6435,6436,-6433]],"properties":{"id":"24662683","dp":14871,"de":0}},{"type":"Polygon","arcs":[[-6434,-6437,6437,6438,-6350]],"properties":{"id":"24662684","dp":11510,"de":0}},{"type":"Polygon","arcs":[[-6438,6439,6440,6441,6442]],"properties":{"id":"24662685","dp":10287,"de":1053}},{"type":"Polygon","arcs":[[-6440,-6436,6443,6444,6445]],"properties":{"id":"24662686","dp":12788,"de":0}},{"type":"Polygon","arcs":[[6446,6447,6448,-6446]],"properties":{"id":"24662687","dp":10598,"de":1028}},{"type":"Polygon","arcs":[[-6449,6449,6450,6451,-6441]],"properties":{"id":"24662688","dp":13352,"de":0}},{"type":"Polygon","arcs":[[-6442,-6452,6452,6453,6454,6455,6456]],"properties":{"id":"24662689","dp":5850,"de":1264}},{"type":"Polygon","arcs":[[-6451,6457,6458,6459,6460,-6453]],"properties":{"id":"24662690","dp":12312,"de":0}},{"type":"Polygon","arcs":[[-6461,6461,6462,6463,-6454]],"properties":{"id":"24662691","dp":6297,"de":749}},{"type":"Polygon","arcs":[[-6460,6464,-3571,6465,-6462]],"properties":{"id":"24662692","dp":5813,"de":1182}},{"type":"Polygon","arcs":[[6466,-3572,-6465,-6459,6467]],"properties":{"id":"24662693","dp":7787,"de":0}},{"type":"Polygon","arcs":[[6468,6469,-3573,-6467,6470]],"properties":{"id":"24662694","dp":7267,"de":910}},{"type":"Polygon","arcs":[[6471,-6471,-6468,-6458,-6450,-6448]],"properties":{"id":"24662695","dp":12815,"de":1958}},{"type":"Polygon","arcs":[[6472,6473,-6469,-6472,-6447,6474]],"properties":{"id":"24662696","dp":8731,"de":755}},{"type":"Polygon","arcs":[[6475,6476,6477,-6473,6478]],"properties":{"id":"24662697","dp":9029,"de":0}},{"type":"Polygon","arcs":[[6479,-3574,-6470,-6474,-6478]],"properties":{"id":"24662698","dp":5712,"de":6724}},{"type":"Polygon","arcs":[[6480,-3575,-6480,6481]],"properties":{"id":"24662699","dp":9426,"de":1946}},{"type":"Polygon","arcs":[[-6193,-6290,-6202,6482,-3568,6483,-6187]],"properties":{"id":"24662703","dp":7760,"de":673}},{"type":"Polygon","arcs":[[6484,-6190,-6188,-6484,-6481]],"properties":{"id":"24662704","dp":18992,"de":1162}},{"type":"Polygon","arcs":[[6485,-4995,-237,-2863]],"properties":{"id":"24661348","dp":9008,"de":969}},{"type":"Polygon","arcs":[[-4989,-6486,-2864,6486,6487]],"properties":{"id":"24661349","dp":6533,"de":0}},{"type":"Polygon","arcs":[[-4990,-6488,6488,6489]],"properties":{"id":"24661350","dp":7350,"de":964}},{"type":"Polygon","arcs":[[-6489,-6487,-2862,6490,6491]],"properties":{"id":"24661351","dp":13397,"de":3406}},{"type":"Polygon","arcs":[[6492,6493,-6195,-6288,6494]],"properties":{"id":"24662708","dp":12607,"de":1745}},{"type":"Polygon","arcs":[[-6297,-6485,-6482,-6477,6495]],"properties":{"id":"24662709","dp":6141,"de":964}},{"type":"Polygon","arcs":[[-6295,-6496,-6476,6496,6497]],"properties":{"id":"24662710","dp":8015,"de":591}},{"type":"Polygon","arcs":[[6498,-6497,-6479,-6475,-6445,6499]],"properties":{"id":"24662711","dp":6504,"de":0}},{"type":"Polygon","arcs":[[-6299,-6498,-6499,6500,-6311,-6308]],"properties":{"id":"24662712","dp":6907,"de":488}},{"type":"Polygon","arcs":[[-6427,-6501,-6500,-6444,-6435,-6431]],"properties":{"id":"24662713","dp":7611,"de":830}},{"type":"Polygon","arcs":[[6501,6502,6503,-3570,6504,6505,6506]],"properties":{"id":"24662714","dp":4649,"de":584}},{"type":"Polygon","arcs":[[-6466,-6504,6507,6508,6509]],"properties":{"id":"24662715","dp":5495,"de":0}},{"type":"Polygon","arcs":[[6510,-6508,-6503,6511,6512]],"properties":{"id":"24662716","dp":9445,"de":2103}},{"type":"Polygon","arcs":[[6513,6514,6515,6516,-6511,6517,6518]],"properties":{"id":"24662717","dp":7157,"de":2793}},{"type":"Polygon","arcs":[[-6517,6519,6520,-6509]],"properties":{"id":"24662718","dp":23720,"de":0}},{"type":"Polygon","arcs":[[-6463,-6510,-6521,6521]],"properties":{"id":"24662719","dp":18764,"de":0}},{"type":"Polygon","arcs":[[-6464,-6522,-6520,-6516,6522]],"properties":{"id":"24662720","dp":7496,"de":2034}},{"type":"Polygon","arcs":[[-6455,-6523,6523,6524]],"properties":{"id":"24662721","dp":6829,"de":2325}},{"type":"Polygon","arcs":[[6525,-6456,-6525,6526,6527,6528]],"properties":{"id":"24662722","dp":8355,"de":2088}},{"type":"Polygon","arcs":[[6529,-6527,6530,6531,6532]],"properties":{"id":"24662723","dp":10122,"de":1573}},{"type":"Polygon","arcs":[[6533,6534,-6528,-6530,6535]],"properties":{"id":"24662724","dp":8763,"de":0}},{"type":"Polygon","arcs":[[-6353,6536,6537,-6536,-6533,6538,6539,-6360,-6357]],"properties":{"id":"24662725","dp":2056,"de":2765}},{"type":"Polygon","arcs":[[6540,-6534,-6538]],"properties":{"id":"24662726","dp":8689,"de":3564}},{"type":"Polygon","arcs":[[-6535,-6541,-6537,-6352,6541,6542,-6529]],"properties":{"id":"24662727","dp":5662,"de":3899}},{"type":"Polygon","arcs":[[-6439,6543,-6542,-6351]],"properties":{"id":"24662728","dp":11821,"de":5000}},{"type":"Polygon","arcs":[[-6443,-6457,-6526,-6543,-6544]],"properties":{"id":"24662729","dp":9927,"de":1989}},{"type":"Polygon","arcs":[[-5081,-5021,6544,6545,6546,-4786]],"properties":{"id":"24661383","dp":15167,"de":14087}},{"type":"Polygon","arcs":[[6547,-6546,6548,6549]],"properties":{"id":"24661384","dp":19614,"de":4958}},{"type":"Polygon","arcs":[[6550,6551,6552,-6550,6553,6554]],"properties":{"id":"24661385","dp":9100,"de":2507}},{"type":"Polygon","arcs":[[6555,-4871,-4714,-4867,6556,-6552]],"properties":{"id":"24661386","dp":5555,"de":3917}},{"type":"Polygon","arcs":[[-4869,6557,-6553,-6557]],"properties":{"id":"24661387","dp":18056,"de":0}},{"type":"Polygon","arcs":[[6558,6559,-6548,-6558]],"properties":{"id":"24661388","dp":17000,"de":3269}},{"type":"Polygon","arcs":[[6560,-6547,-6560,-4736]],"properties":{"id":"24661389","dp":14501,"de":9965}},{"type":"Polygon","arcs":[[-4743,6561,-4784,-6561]],"properties":{"id":"24661390","dp":15266,"de":12099}},{"type":"Polygon","arcs":[[-4744,6562,-4782,-6562]],"properties":{"id":"24661391","dp":21659,"de":4148}},{"type":"Polygon","arcs":[[-4748,-4754,-4779,-6563]],"properties":{"id":"24661392","dp":19071,"de":5696}},{"type":"Polygon","arcs":[[-4735,-4737,-6559,-4868]],"properties":{"id":"24661393","dp":24794,"de":3082}},{"type":"Polygon","arcs":[[-6280,-6397,6563,-5359,6564,6565,-6425]],"properties":{"id":"24662258","dp":1732,"de":233}},{"type":"Polygon","arcs":[[-6282,-6424,-6566,6566,6567,6568,-1515,-1523,-1530,-6384,-6276]],"properties":{"id":"24662259","dp":1941,"de":140}},{"type":"Polygon","arcs":[[-6565,6569,-6567]],"properties":{"id":"24662260","dp":3077,"de":1065}},{"type":"Polygon","arcs":[[-6570,-5363,6570,-6568]],"properties":{"id":"24662261","dp":6716,"de":1198}},{"type":"Polygon","arcs":[[-5362,-5357,-5354,-3066,-1508,-6569,-6571]],"properties":{"id":"24662262","dp":1256,"de":114}},{"type":"Polygon","arcs":[[-1503,-1510,-3065,6571,6572,6573]],"properties":{"id":"24662263","dp":1981,"de":926}},{"type":"Polygon","arcs":[[-3076,6574,6575,-6572,-3064]],"properties":{"id":"24662264","dp":2928,"de":0}},{"type":"Polygon","arcs":[[-6575,-3074,6576,6577]],"properties":{"id":"24662265","dp":2289,"de":357}},{"type":"Polygon","arcs":[[6578,6579,-6573,-6576,-6578,6580,6581]],"properties":{"id":"24662266","dp":1534,"de":696}},{"type":"Polygon","arcs":[[-6581,-6577,-3073,6582,6583,6584,6585,6586]],"properties":{"id":"24662267","dp":1532,"de":188}},{"type":"Polygon","arcs":[[-6579,6587,6588,6589]],"properties":{"id":"24662268","dp":2975,"de":0}},{"type":"Polygon","arcs":[[6590,-6586,6591,6592,-5393]],"properties":{"id":"24662269","dp":5171,"de":199}},{"type":"Polygon","arcs":[[-6593,6593,6594,-5394]],"properties":{"id":"24662270","dp":4907,"de":0}},{"type":"Polygon","arcs":[[-4859,-529,6595,-4848]],"properties":{"id":"24662614","dp":9881,"de":0}},{"type":"Polygon","arcs":[[-4888,-4825,-4842,-6596,-528,-532,-535,6596,-6408,-4694,-4886,-4884]],"properties":{"id":"24662615","dp":1551,"de":3919}},{"type":"Polygon","arcs":[[6597,6598,-6365,-6540]],"properties":{"id":"24662736","dp":13797,"de":0}},{"type":"Polygon","arcs":[[6599,6600,6601,-6599]],"properties":{"id":"24662737","dp":9680,"de":1600}},{"type":"Polygon","arcs":[[-6602,6602,6603,-6362,-6366]],"properties":{"id":"24662738","dp":8241,"de":0}},{"type":"Polygon","arcs":[[-6492,6604,6605,6606,-4720,-4724,6607,6608]],"properties":{"id":"24661352","dp":3119,"de":1795}},{"type":"Polygon","arcs":[[-6490,-6609,6609,6610]],"properties":{"id":"24661353","dp":18231,"de":3231}},{"type":"Polygon","arcs":[[-6610,-6608,-4723,6611]],"properties":{"id":"24661354","dp":19464,"de":5351}},{"type":"Polygon","arcs":[[-4991,-6611,-6612,6612,-4882]],"properties":{"id":"24661355","dp":6644,"de":6469}},{"type":"Polygon","arcs":[[-6613,-4725,-4689,6613]],"properties":{"id":"24661356","dp":9520,"de":2309}},{"type":"Polygon","arcs":[[-4883,-6614,-4688,-4874]],"properties":{"id":"24661357","dp":13662,"de":1298}},{"type":"Polygon","arcs":[[-5884,-5881,-4981,-5060,-5053]],"properties":{"id":"24663083","dp":3712,"de":0}},{"type":"Polygon","arcs":[[6614,6615,6616,6617,-6603]],"properties":{"id":"24662739","dp":6662,"de":1395}},{"type":"Polygon","arcs":[[-6618,6618,6619,6620,6621]],"properties":{"id":"24662740","dp":10030,"de":1739}},{"type":"Polygon","arcs":[[6622,6623,6624,6625,-6619,-6617]],"properties":{"id":"24662741","dp":10694,"de":0}},{"type":"Polygon","arcs":[[-6626,6626,6627,6628,-6620]],"properties":{"id":"24662742","dp":11025,"de":870}},{"type":"Polygon","arcs":[[-6628,6629,6630,6631,6632]],"properties":{"id":"24662743","dp":15439,"de":0}},{"type":"Polygon","arcs":[[6633,-6621,-6629,-6633,6634,6635]],"properties":{"id":"24662744","dp":9313,"de":1991}},{"type":"Polygon","arcs":[[6636,-6636,6637]],"properties":{"id":"24662745","dp":13688,"de":825}},{"type":"Polygon","arcs":[[6638,-6638,-6635,-6632,6639,6640]],"properties":{"id":"24662746","dp":7690,"de":3548}},{"type":"Polygon","arcs":[[-6631,6641,6642,6643,-6640]],"properties":{"id":"24662747","dp":22567,"de":1234}},{"type":"Polygon","arcs":[[6644,6645,6646,6647,-6643]],"properties":{"id":"24662748","dp":11504,"de":0}},{"type":"Polygon","arcs":[[6648,6649,6650,-6644,-6648,6651,6652,6653]],"properties":{"id":"24662749","dp":10243,"de":6707}},{"type":"Polygon","arcs":[[-6654,6654,6655,6656,6657]],"properties":{"id":"24662750","dp":12246,"de":0}},{"type":"Polygon","arcs":[[-6649,-6658,6658,6659,6660]],"properties":{"id":"24662751","dp":13468,"de":0}},{"type":"Polygon","arcs":[[-6657,6661,6662,-6659]],"properties":{"id":"24662752","dp":12830,"de":0}},{"type":"Polygon","arcs":[[6663,6664,6665,-6660,-6663,6666,6667,6668]],"properties":{"id":"24662753","dp":4003,"de":2306}},{"type":"Polygon","arcs":[[-6669,6669,6670,6671,6672,6673,6674]],"properties":{"id":"24662754","dp":12857,"de":0}},{"type":"Polygon","arcs":[[6675,-6672,6676,6677]],"properties":{"id":"24662755","dp":12687,"de":0}},{"type":"Polygon","arcs":[[-6673,-6676,6678,6679,6680]],"properties":{"id":"24662756","dp":18873,"de":0}},{"type":"Polygon","arcs":[[6681,-6674,-6681,6682,6683]],"properties":{"id":"24662757","dp":15235,"de":0}},{"type":"Polygon","arcs":[[6684,-6664,-6675,-6682,6685]],"properties":{"id":"24662758","dp":13365,"de":1282}},{"type":"Polygon","arcs":[[6686,-6686,6687]],"properties":{"id":"24662759","dp":10279,"de":0}},{"type":"Polygon","arcs":[[-6688,-6684,6688,6689,6690]],"properties":{"id":"24662760","dp":17013,"de":767}},{"type":"Polygon","arcs":[[-6689,6691]],"properties":{"id":"24662761","dp":22232,"de":0}},{"type":"Polygon","arcs":[[6692,6693,-5023,-5080,-5083,6694]],"properties":{"id":"24661417","dp":13624,"de":7969}},{"type":"Polygon","arcs":[[-5794,6695,-5024,-6694]],"properties":{"id":"24661418","dp":14488,"de":4444}},{"type":"Polygon","arcs":[[-5020,-5025,-6696,-5793,-5013]],"properties":{"id":"24661419","dp":30000,"de":0}},{"type":"Polygon","arcs":[[-5082,6696,6697,-6695]],"properties":{"id":"24661420","dp":16448,"de":3877}},{"type":"Polygon","arcs":[[-5084,6698,6699,-6697]],"properties":{"id":"24661421","dp":17083,"de":3030}},{"type":"Polygon","arcs":[[-6699,-5074,6700,6701]],"properties":{"id":"24661422","dp":12876,"de":24315}},{"type":"Polygon","arcs":[[6702,-6701,-5069,6703,6704]],"properties":{"id":"24661423","dp":19588,"de":9264}},{"type":"Polygon","arcs":[[-6704,-5068,6705]],"properties":{"id":"24661424","dp":16603,"de":1904}},{"type":"Polygon","arcs":[[-6705,-6706,-5064,-5482,6706,-5483,6707,6708,6709]],"properties":{"id":"24661425","dp":10108,"de":8276}},{"type":"Polygon","arcs":[[6710,6711,6712,6713,6714]],"properties":{"id":"24662858","dp":6699,"de":1150}},{"type":"Polygon","arcs":[[-6714,6715,6716,6717]],"properties":{"id":"24662859","dp":6916,"de":967}},{"type":"Polygon","arcs":[[-6713,6718,6719,6720,6721,-6716]],"properties":{"id":"24662860","dp":8429,"de":0}},{"type":"Polygon","arcs":[[6722,-2095,-2099,6723,-6719]],"properties":{"id":"24662861","dp":5689,"de":438}},{"type":"Polygon","arcs":[[-2098,6724,6725,-6720,-6724]],"properties":{"id":"24662862","dp":4585,"de":308}},{"type":"Polygon","arcs":[[-2102,6726,6727,6728,-6725]],"properties":{"id":"24662863","dp":13131,"de":0}},{"type":"Polygon","arcs":[[-6726,-6729,6729,6730,-6721]],"properties":{"id":"24662864","dp":7819,"de":0}},{"type":"Polygon","arcs":[[6731,6732,6733,6734,-6730]],"properties":{"id":"24662865","dp":5207,"de":0}},{"type":"Polygon","arcs":[[6735,6736,-6733]],"properties":{"id":"24662866","dp":4979,"de":0}},{"type":"Polygon","arcs":[[-6728,6737,6738,6739,-6736,-6732]],"properties":{"id":"24662867","dp":4831,"de":0}},{"type":"Polygon","arcs":[[6740,-6739,6741]],"properties":{"id":"24662868","dp":3710,"de":0}},{"type":"Polygon","arcs":[[6742,6743,-5257,6744]],"properties":{"id":"24663113","dp":1103,"de":305}},{"type":"Polygon","arcs":[[-2072,-2083,6745,6746,6747,-868,-2069]],"properties":{"id":"24662830","dp":4737,"de":0}},{"type":"Polygon","arcs":[[6748,-6747,6749,6750]],"properties":{"id":"24662831","dp":5663,"de":0}},{"type":"Polygon","arcs":[[6751,-6751,6752,6753]],"properties":{"id":"24662832","dp":5790,"de":0}},{"type":"Polygon","arcs":[[6754,-6753,-6750,-6746,6755,6756]],"properties":{"id":"24662833","dp":8438,"de":0}},{"type":"Polygon","arcs":[[-2082,-2085,6757,6758,-6756]],"properties":{"id":"24662834","dp":13589,"de":0}},{"type":"Polygon","arcs":[[6759,-6757,-6759,6760,6761,6762]],"properties":{"id":"24662835","dp":6318,"de":803}},{"type":"Polygon","arcs":[[-6727,-2101,-2066,6763,-6742,-6738]],"properties":{"id":"24662869","dp":2880,"de":2304}},{"type":"Polygon","arcs":[[-2065,-2070,-873,6764,-888,-6734,-6737,-6740,-6741,-6764]],"properties":{"id":"24662870","dp":2654,"de":333}},{"type":"Polygon","arcs":[[6765,6766,6767,6768]],"properties":{"id":"24661557","dp":13272,"de":0}},{"type":"Polygon","arcs":[[6769,6770,6771,-6767]],"properties":{"id":"24661558","dp":24042,"de":2836}},{"type":"Polygon","arcs":[[6772,6773,-6771,6774]],"properties":{"id":"24661559","dp":24840,"de":0}},{"type":"Polygon","arcs":[[-6772,6775,6776,6777,6778,-6768]],"properties":{"id":"24661560","dp":18750,"de":2138}},{"type":"Polygon","arcs":[[6779,6780,-6777]],"properties":{"id":"24661561","dp":25255,"de":0}},{"type":"Polygon","arcs":[[6781,-6778,-6781,6782]],"properties":{"id":"24661562","dp":29653,"de":0}},{"type":"Polygon","arcs":[[6783,-6782,6784,6785,-5563,6786,6787,6788]],"properties":{"id":"24661563","dp":18218,"de":0}},{"type":"Polygon","arcs":[[6789,6790,-6785,-6783,-6780]],"properties":{"id":"24661564","dp":32313,"de":2313}},{"type":"Polygon","arcs":[[-6774,6791,-6790,-6776]],"properties":{"id":"24661566","dp":48333,"de":0}},{"type":"Polygon","arcs":[[6792,6793,6794,6795,6796,6797,6798,-3551,-5564,-6786,-6791,-6792,-6773]],"properties":{"id":"24661567","dp":1490,"de":5112}},{"type":"Polygon","arcs":[[6799,-6798,6800,6801]],"properties":{"id":"24661568","dp":2638,"de":303}},{"type":"Polygon","arcs":[[6802,-6801,-6797,6803]],"properties":{"id":"24661569","dp":2676,"de":254}},{"type":"Polygon","arcs":[[6804,6805,6806,6807,6808,6809,6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820]],"properties":{"id":"24662942","dp":540,"de":977}},{"type":"Polygon","arcs":[[6821,6822,6823,-6811]],"properties":{"id":"24662943","dp":5099,"de":0}},{"type":"Polygon","arcs":[[6824,6825,-6812,-6824]],"properties":{"id":"24662944","dp":5075,"de":0}},{"type":"Polygon","arcs":[[-6826,-6813]],"properties":{"id":"24662945","dp":7296,"de":0}},{"type":"Polygon","arcs":[[-6823,6826,6827,6828,-6814,-6825]],"properties":{"id":"24662946","dp":5824,"de":0}},{"type":"Polygon","arcs":[[-909,-890,6829,6830,-6828,6831]],"properties":{"id":"24662947","dp":2837,"de":439}},{"type":"Polygon","arcs":[[6832,6833,6834,-1466]],"properties":{"id":"24661672","dp":11859,"de":2743}},{"type":"Polygon","arcs":[[6835,-5436]],"properties":{"id":"24663161","dp":3638,"de":0}},{"type":"Polygon","arcs":[[-6836,-5435]],"properties":{"id":"24663162","dp":3481,"de":0}},{"type":"Polygon","arcs":[[-5656,-5664,6836,6837,6838,-5631,-5639,-5439]],"properties":{"id":"24663050","dp":1456,"de":2365}},{"type":"Polygon","arcs":[[-6839,6839,6840,-5618,-5632]],"properties":{"id":"24663051","dp":4317,"de":469}},{"type":"Polygon","arcs":[[-6841,6841,-5619]],"properties":{"id":"24663052","dp":2500,"de":0}},{"type":"MultiPolygon","arcs":[[[-6840,-6838,6842,6843,-5609,-5620,-6842]],[[6844]]],"properties":{"id":"24663053","dp":4247,"de":273}},{"type":"Polygon","arcs":[[6845,6846,-6623,-6616]],"properties":{"id":"24662802","dp":9247,"de":0}},{"type":"Polygon","arcs":[[6847,6848,6849,-6624,-6847]],"properties":{"id":"24662803","dp":9469,"de":0}},{"type":"Polygon","arcs":[[6850,-6514,6851,6852,-6615,-6601]],"properties":{"id":"24662804","dp":8281,"de":1615}},{"type":"Polygon","arcs":[[-6524,-6515,-6851,-6600,6853,-6531]],"properties":{"id":"24662805","dp":6032,"de":2526}},{"type":"Polygon","arcs":[[-6532,-6854,-6598,-6539]],"properties":{"id":"24662806","dp":14884,"de":1156}},{"type":"Polygon","arcs":[[6854,6855,6856,6857,6858,6859]],"properties":{"id":"24662807","dp":4530,"de":729}},{"type":"Polygon","arcs":[[6860,6861,6862,6863,-6860]],"properties":{"id":"24662808","dp":6016,"de":0}},{"type":"Polygon","arcs":[[6864,-6861,-6859,6865,6866]],"properties":{"id":"24662809","dp":3980,"de":717}},{"type":"Polygon","arcs":[[6867,-6866,6868,6869,6870]],"properties":{"id":"24662810","dp":3325,"de":1836}},{"type":"Polygon","arcs":[[-6870,6871,6872,6873]],"properties":{"id":"24662811","dp":6633,"de":685}},{"type":"Polygon","arcs":[[-6873,6874,6875,6876]],"properties":{"id":"24662812","dp":5492,"de":2710}},{"type":"Polygon","arcs":[[-6876,6877,-3560,6878,6879]],"properties":{"id":"24662813","dp":12181,"de":3454}},{"type":"Polygon","arcs":[[6880,-6877,-6880,6881,6882]],"properties":{"id":"24662814","dp":19191,"de":0}},{"type":"Polygon","arcs":[[6883,-6883,6884,6885,6886,6887,6888]],"properties":{"id":"24662815","dp":23152,"de":0}},{"type":"Polygon","arcs":[[6889,6890,6891,-6885,6892]],"properties":{"id":"24662816","dp":18819,"de":0}},{"type":"Polygon","arcs":[[6893,-6893,-6882,-6879,-3563,-3580]],"properties":{"id":"24662817","dp":3026,"de":2098}},{"type":"Polygon","arcs":[[-6858,6894,6895,-3561,-6878,-6875,-6872,-6869]],"properties":{"id":"24662819","dp":8716,"de":591}},{"type":"MultiPolygon","arcs":[[[-883,6896,6897,6898,-6896,6899,-871,-878]],[[6900]],[[6901]]],"properties":{"id":"24662821","dp":5191,"de":857}},{"type":"Polygon","arcs":[[6902,6903,-4241,6904,6905]],"properties":{"id":"24661485","dp":7704,"de":1130}},{"type":"Polygon","arcs":[[-3183,-2294,-6905,-4245,-1903,-3190]],"properties":{"id":"24661486","dp":12156,"de":3317}},{"type":"Polygon","arcs":[[6906,6907,-4242,-6904]],"properties":{"id":"24661487","dp":18454,"de":0}},{"type":"Polygon","arcs":[[6908,-6907,6909]],"properties":{"id":"24661488","dp":9503,"de":793}},{"type":"Polygon","arcs":[[6910,6911,-4259,-4251,-4250,-4246,-4243,-6908,-6909]],"properties":{"id":"24661489","dp":7408,"de":0}},{"type":"Polygon","arcs":[[6912,-4256,-6912,6913,6914]],"properties":{"id":"24661490","dp":11955,"de":0}},{"type":"Polygon","arcs":[[6915,-4262,-6913,6916]],"properties":{"id":"24661491","dp":5716,"de":1286}},{"type":"Polygon","arcs":[[6917,6918,-4270,-6916]],"properties":{"id":"24661492","dp":14933,"de":3833}},{"type":"Polygon","arcs":[[6919,-6762,6920,6921]],"properties":{"id":"24662836","dp":7163,"de":1242}},{"type":"Polygon","arcs":[[6922,-6763,-6920,6923]],"properties":{"id":"24662837","dp":6030,"de":0}},{"type":"Polygon","arcs":[[6924,6925,-6924]],"properties":{"id":"24662838","dp":3175,"de":0}},{"type":"Polygon","arcs":[[-3576,6926,6927,-6925,-6922,6928,6929]],"properties":{"id":"24662839","dp":1409,"de":1983}},{"type":"Polygon","arcs":[[6930,6931,6932,-6927]],"properties":{"id":"24662840","dp":9553,"de":0}},{"type":"Polygon","arcs":[[6933,6934,-6928,-6933,6935,6936,6937]],"properties":{"id":"24662841","dp":4500,"de":1416}},{"type":"Polygon","arcs":[[-6934,6938,6939]],"properties":{"id":"24662842","dp":9608,"de":0}},{"type":"Polygon","arcs":[[-6754,-6755,-6760,-6923,-6926,-6935,-6940,6940]],"properties":{"id":"24662843","dp":3677,"de":1180}},{"type":"Polygon","arcs":[[-6936,-6932,6941,6942,6943]],"properties":{"id":"24662844","dp":3318,"de":0}},{"type":"Polygon","arcs":[[6944,-6942,-6931,-3584]],"properties":{"id":"24662845","dp":5077,"de":0}},{"type":"Polygon","arcs":[[-3562,-6899,6945,-3581]],"properties":{"id":"24662848","dp":7466,"de":0}},{"type":"Polygon","arcs":[[6946,6947,6948,6949]],"properties":{"id":"24661519","dp":14224,"de":4176}},{"type":"Polygon","arcs":[[6950,6951,6952,6953,6954,-6947]],"properties":{"id":"24661520","dp":8110,"de":5381}},{"type":"Polygon","arcs":[[-3686,-4307,6955,6956,6957,-6948,-6955,6958]],"properties":{"id":"24661521","dp":7769,"de":14124}},{"type":"Polygon","arcs":[[6959,6960,-3390,-3687,-6959,6961]],"properties":{"id":"24661522","dp":9824,"de":6955}},{"type":"Polygon","arcs":[[6962,6963,6964,-6960,6965]],"properties":{"id":"24661523","dp":20044,"de":13053}},{"type":"Polygon","arcs":[[6966,6967,6968,6969,-6964,6970]],"properties":{"id":"24661524","dp":14770,"de":5045}},{"type":"Polygon","arcs":[[6971,6972,6973,6974,6975,-6968,6976,6977]],"properties":{"id":"24661525","dp":16561,"de":4731}},{"type":"Polygon","arcs":[[6978,6979,-6977,6980]],"properties":{"id":"24661526","dp":19583,"de":2604}},{"type":"Polygon","arcs":[[6981,6982,-6978,-6980]],"properties":{"id":"24661527","dp":21813,"de":0}},{"type":"Polygon","arcs":[[6983,6984,-6972,-6983]],"properties":{"id":"24661528","dp":27283,"de":2890}},{"type":"Polygon","arcs":[[6985,6986,-6985]],"properties":{"id":"24661529","dp":24125,"de":5312}},{"type":"Polygon","arcs":[[-6607,6987,6988,-6986,-6984,-6982,-6979,6989,-4721]],"properties":{"id":"24661530","dp":6718,"de":3696}},{"type":"Polygon","arcs":[[6990,6991,6992,-6973,-6987,-6989]],"properties":{"id":"24661531","dp":20208,"de":5555}},{"type":"Polygon","arcs":[[6993,6994,-3783,6995]],"properties":{"id":"24662928","dp":4422,"de":402}},{"type":"Polygon","arcs":[[6996,6997,-6994,6998,6999,7000]],"properties":{"id":"24662929","dp":3719,"de":5212}},{"type":"Polygon","arcs":[[-6995,-6998,7001,7002,-3778]],"properties":{"id":"24662930","dp":4861,"de":0}},{"type":"Polygon","arcs":[[-3779,-7003,7003,7004]],"properties":{"id":"24662931","dp":3678,"de":0}},{"type":"Polygon","arcs":[[-3657,-7005,7005,-3636,-3641,-3654]],"properties":{"id":"24662932","dp":6625,"de":0}},{"type":"Polygon","arcs":[[-6835,7006,-2256,7007,7008,7009]],"properties":{"id":"24661673","dp":15104,"de":2022}},{"type":"Polygon","arcs":[[7010,-7008,-2259,-2253,7011,-1390]],"properties":{"id":"24661674","dp":12972,"de":1380}},{"type":"Polygon","arcs":[[-1391,-7012,-3585,7012]],"properties":{"id":"24661675","dp":11932,"de":0}},{"type":"Polygon","arcs":[[-1440,-7013,-2250,7013]],"properties":{"id":"24661676","dp":18614,"de":2164}},{"type":"Polygon","arcs":[[-1441,-7014,-2252,7014]],"properties":{"id":"24661677","dp":17160,"de":0}},{"type":"Polygon","arcs":[[-1442,-7015,-2245,7015]],"properties":{"id":"24661678","dp":7049,"de":0}},{"type":"Polygon","arcs":[[-1443,-7016,-2249,-2241,7016]],"properties":{"id":"24661679","dp":3646,"de":0}},{"type":"Polygon","arcs":[[-7017,-2244,7017,-1445]],"properties":{"id":"24661680","dp":13592,"de":1219}},{"type":"Polygon","arcs":[[-7018,7018,7019,-1448]],"properties":{"id":"24661681","dp":11264,"de":1340}},{"type":"Polygon","arcs":[[-7020,7020,-1534,7021,7022]],"properties":{"id":"24661682","dp":5823,"de":608}},{"type":"Polygon","arcs":[[-1449,-7023,7023,7024]],"properties":{"id":"24661683","dp":10484,"de":2222}},{"type":"Polygon","arcs":[[-7024,-7022,7025,7026]],"properties":{"id":"24661684","dp":12403,"de":0}},{"type":"Polygon","arcs":[[-7026,-1537,7027,7028]],"properties":{"id":"24661685","dp":14946,"de":0}},{"type":"Polygon","arcs":[[-1450,-7025,-7027,-7029,7029,7030]],"properties":{"id":"24661686","dp":6037,"de":1596}},{"type":"Polygon","arcs":[[-7030,-7028,7031,7032,7033,-3491]],"properties":{"id":"24661687","dp":8422,"de":0}},{"type":"Polygon","arcs":[[-7034,7034,-1750,-3833,-3492]],"properties":{"id":"24661688","dp":3666,"de":1681}},{"type":"Polygon","arcs":[[-7033,7035,-7035]],"properties":{"id":"24661689","dp":11156,"de":0}},{"type":"Polygon","arcs":[[-1536,-1736,-1742,-1746,-7036,-7032]],"properties":{"id":"24661690","dp":4255,"de":2097}},{"type":"Polygon","arcs":[[7036,-3149,-3097,-3096,-3092,7037,-3084,-3077,-4954]],"properties":{"id":"24663054","dp":1808,"de":386}},{"type":"Polygon","arcs":[[-7038,-3094,-3087,7038,-3085]],"properties":{"id":"24663055","dp":2806,"de":0}},{"type":"Polygon","arcs":[[-3091,-3079,-3086,-7039]],"properties":{"id":"24663056","dp":3577,"de":0}},{"type":"Polygon","arcs":[[7039,7040,7041,7042,-5830]],"properties":{"id":"24661826","dp":17040,"de":3582}},{"type":"Polygon","arcs":[[-5109,7043,7044,-7042,7045]],"properties":{"id":"24661827","dp":5877,"de":1779}},{"type":"Polygon","arcs":[[-5110,-7046,-7041,7046]],"properties":{"id":"24661828","dp":14654,"de":4608}},{"type":"Polygon","arcs":[[7047,-7047,-7040,-5826,-5807,-5811,-5813]],"properties":{"id":"24661829","dp":11941,"de":5036}},{"type":"Polygon","arcs":[[7048,-5104,-5106,-7048,-5816,-5818]],"properties":{"id":"24661830","dp":13383,"de":6565}},{"type":"Polygon","arcs":[[-5492,-5486,7049,-5101,-7049,-5817]],"properties":{"id":"24661831","dp":14793,"de":3793}},{"type":"Polygon","arcs":[[7050,-5099,-7050,-5485]],"properties":{"id":"24661832","dp":19090,"de":3846}},{"type":"Polygon","arcs":[[-5484,-6707,-5481,-5100,-7051]],"properties":{"id":"24661833","dp":12399,"de":12526}},{"type":"Polygon","arcs":[[7051,7052,7053,7054,7055]],"properties":{"id":"24661457","dp":18027,"de":2916}},{"type":"Polygon","arcs":[[7056,7057,-7052]],"properties":{"id":"24661458","dp":18820,"de":3589}},{"type":"Polygon","arcs":[[7058,7059,-7058,7060]],"properties":{"id":"24661459","dp":16330,"de":4357}},{"type":"Polygon","arcs":[[7061,7062,-7053,-7060]],"properties":{"id":"24661460","dp":13878,"de":2803}},{"type":"Polygon","arcs":[[-7054,-7063,7063,7064,7065,7066]],"properties":{"id":"24661461","dp":17252,"de":2266}},{"type":"Polygon","arcs":[[7067,7068,-7066,7069]],"properties":{"id":"24661462","dp":14907,"de":2314}},{"type":"Polygon","arcs":[[-7068,7070,7071,7072,7073,7074]],"properties":{"id":"24661463","dp":11728,"de":6558}},{"type":"Polygon","arcs":[[-7074,7075,7076,7077,7078]],"properties":{"id":"24661464","dp":10497,"de":5231}},{"type":"Polygon","arcs":[[7079,7080,-7076,-7073]],"properties":{"id":"24661465","dp":12769,"de":1798}},{"type":"Polygon","arcs":[[-7081,7081,7082,7083,7084,-7077]],"properties":{"id":"24661466","dp":8604,"de":9660}},{"type":"Polygon","arcs":[[-7085,7085,7086,7087]],"properties":{"id":"24661467","dp":10199,"de":8890}},{"type":"Polygon","arcs":[[7088,7089,7090,-480,-486,-487,-497,7091,7092,7093,7094,7095,-6806,7096]],"properties":{"id":"24662905","dp":72,"de":354}},{"type":"Polygon","arcs":[[7097,7098,7099,-1400,-4665,-1396,-1405,7100,-7093]],"properties":{"id":"24662906","dp":853,"de":110}},{"type":"Polygon","arcs":[[7101,-4666,-1401,-7100]],"properties":{"id":"24662907","dp":5283,"de":0}},{"type":"Polygon","arcs":[[-683,-4664,-7102,-7099,7102]],"properties":{"id":"24662908","dp":18464,"de":0}},{"type":"Polygon","arcs":[[-3925,7103,-667,-670,-672,-676,-684,-7103,-7098,-7092,-496,-3921]],"properties":{"id":"24662909","dp":5218,"de":1097}},{"type":"Polygon","arcs":[[-656,-658,-668,-7104,-3924,-3928,-3931]],"properties":{"id":"24662910","dp":11536,"de":1696}},{"type":"Polygon","arcs":[[7104,-7089,7105,7106,7107]],"properties":{"id":"24662911","dp":1531,"de":846}},{"type":"Polygon","arcs":[[-7090,-7105,7108,7109,7110]],"properties":{"id":"24662912","dp":6269,"de":0}},{"type":"Polygon","arcs":[[-7109,7111,7112]],"properties":{"id":"24662913","dp":5594,"de":0}},{"type":"Polygon","arcs":[[7113,-7110,-7113,7114,-1159,-465,-468,-471]],"properties":{"id":"24662914","dp":4598,"de":655}},{"type":"Polygon","arcs":[[-7091,-7111,-7114,-470,-477]],"properties":{"id":"24662915","dp":6083,"de":979}},{"type":"Polygon","arcs":[[7115,7116,7117,-7115,-7112,-7108]],"properties":{"id":"24662916","dp":3201,"de":2302}},{"type":"Polygon","arcs":[[-1160,-7118,7118,7119,-1143,-1150,-1156]],"properties":{"id":"24662917","dp":3547,"de":1924}},{"type":"Polygon","arcs":[[7120,-7119,-7117,7121]],"properties":{"id":"24662918","dp":8833,"de":0}},{"type":"Polygon","arcs":[[7122,7123,7124,-4409,-3129,7125,-3559,-4492,-5573,-5566]],"properties":{"id":"24661603","dp":307,"de":4543}},{"type":"Polygon","arcs":[[-7126,-3128,7126,-3555]],"properties":{"id":"24661606","dp":27500,"de":0}},{"type":"Polygon","arcs":[[-7127,-3127,-4500,-3556]],"properties":{"id":"24661609","dp":18665,"de":0}},{"type":"Polygon","arcs":[[-4289,-3476,-4288,-595,-584,-5569]],"properties":{"id":"24661611","dp":7078,"de":5486}},{"type":"Polygon","arcs":[[7127,7128,7129,7130,-6787,-5570,-4206]],"properties":{"id":"24661614","dp":11031,"de":0}},{"type":"Polygon","arcs":[[7131,7132,-6788,-7131]],"properties":{"id":"24661615","dp":32801,"de":0}},{"type":"Polygon","arcs":[[7133,-6789,-7133]],"properties":{"id":"24661616","dp":27903,"de":3493}},{"type":"Polygon","arcs":[[7134,7135,-7130,7136]],"properties":{"id":"24661617","dp":18058,"de":0}},{"type":"Polygon","arcs":[[7137,-7137,-7129,7138]],"properties":{"id":"24661618","dp":27520,"de":1377}},{"type":"Polygon","arcs":[[-2940,-918,7139,7140,-4457]],"properties":{"id":"24661619","dp":4711,"de":1334}},{"type":"Polygon","arcs":[[-7004,-7002,7141,7142,-3635,-7006]],"properties":{"id":"24662933","dp":1588,"de":2410}},{"type":"Polygon","arcs":[[7143,7144,7145,-7143]],"properties":{"id":"24662934","dp":2106,"de":0}},{"type":"Polygon","arcs":[[7146,-1127,-3623,-3629,-3465,-3632,-7146]],"properties":{"id":"24662935","dp":982,"de":375}},{"type":"Polygon","arcs":[[7147,7148,7149,7150]],"properties":{"id":"24661636","dp":10835,"de":1284}},{"type":"Polygon","arcs":[[7151,7152,7153,-7148]],"properties":{"id":"24661637","dp":10254,"de":5090}},{"type":"Polygon","arcs":[[7154,7155,-7153,7156]],"properties":{"id":"24661638","dp":14758,"de":0}},{"type":"Polygon","arcs":[[7157,7158,7159,-7155,7160,7161]],"properties":{"id":"24661639","dp":10641,"de":2540}},{"type":"Polygon","arcs":[[7162,7163,7164,-7158,7165]],"properties":{"id":"24661640","dp":16422,"de":4743}},{"type":"Polygon","arcs":[[7166,7167,7168,-7163,7169,7170]],"properties":{"id":"24661641","dp":13275,"de":3658}},{"type":"Polygon","arcs":[[7171,7172,-7167,7173]],"properties":{"id":"24661642","dp":14177,"de":1973}},{"type":"Polygon","arcs":[[7174,7175,7176,-7172]],"properties":{"id":"24661643","dp":14590,"de":1803}},{"type":"Polygon","arcs":[[7177,7178,7179,-7176]],"properties":{"id":"24661644","dp":15390,"de":1950}},{"type":"Polygon","arcs":[[-7087,7180,-7179,7181]],"properties":{"id":"24661645","dp":19844,"de":3115}},{"type":"Polygon","arcs":[[7182,-7182,7183,7184]],"properties":{"id":"24661646","dp":11585,"de":2743}},{"type":"Polygon","arcs":[[-7078,-7088,-7183,7185]],"properties":{"id":"24661647","dp":12103,"de":5469}},{"type":"Polygon","arcs":[[7186,-7184,-7178,7187]],"properties":{"id":"24661648","dp":15555,"de":2083}},{"type":"Polygon","arcs":[[7188,-7188,-7175,7189]],"properties":{"id":"24661649","dp":13627,"de":6372}},{"type":"Polygon","arcs":[[-7190,-7174,7190,7191]],"properties":{"id":"24661650","dp":14983,"de":2786}},{"type":"Polygon","arcs":[[-7191,-7171,7192,7193]],"properties":{"id":"24661651","dp":16678,"de":1384}},{"type":"Polygon","arcs":[[-7193,-7170,7194,7195]],"properties":{"id":"24661652","dp":13893,"de":2666}},{"type":"Polygon","arcs":[[-7195,-7166,7196,7197,7198]],"properties":{"id":"24661653","dp":11914,"de":3710}},{"type":"Polygon","arcs":[[-7197,-7162,7199,7200,7201]],"properties":{"id":"24661654","dp":15430,"de":2049}},{"type":"Polygon","arcs":[[-7200,-7161,7202,7203]],"properties":{"id":"24661655","dp":15183,"de":0}},{"type":"Polygon","arcs":[[-1501,-7203,-7157,7204]],"properties":{"id":"24661656","dp":13046,"de":1562}},{"type":"Polygon","arcs":[[-7205,-7152,7205,-1497]],"properties":{"id":"24661657","dp":14362,"de":2684}},{"type":"Polygon","arcs":[[-7206,-7151,7206,-1492]],"properties":{"id":"24661658","dp":11503,"de":2534}},{"type":"Polygon","arcs":[[-7207,7207,7208,7209,-5762,-5760]],"properties":{"id":"24661659","dp":9249,"de":1657}},{"type":"Polygon","arcs":[[-7084,7210,7211,7212,-7086]],"properties":{"id":"24661468","dp":8863,"de":7410}},{"type":"Polygon","arcs":[[7213,7214,-7181,-7213]],"properties":{"id":"24661469","dp":14171,"de":4294}},{"type":"Polygon","arcs":[[-7180,-7215,7215,7216]],"properties":{"id":"24661470","dp":13006,"de":2972}},{"type":"Polygon","arcs":[[-7177,-7217,7217,7218]],"properties":{"id":"24661471","dp":12579,"de":3184}},{"type":"Polygon","arcs":[[-7219,7219,7220,-7173]],"properties":{"id":"24661472","dp":12709,"de":2580}},{"type":"Polygon","arcs":[[-7221,7221,7222,-7168]],"properties":{"id":"24661473","dp":9940,"de":6804}},{"type":"Polygon","arcs":[[-7169,-7223,7223,7224]],"properties":{"id":"24661474","dp":14274,"de":2745}},{"type":"Polygon","arcs":[[-7164,-7225,7225,7226]],"properties":{"id":"24661475","dp":13307,"de":3149}},{"type":"Polygon","arcs":[[-7165,-7227,7227,7228]],"properties":{"id":"24661476","dp":13065,"de":0}},{"type":"Polygon","arcs":[[-7229,7229,7230,7231,-7159]],"properties":{"id":"24661477","dp":14345,"de":2182}},{"type":"Polygon","arcs":[[-7232,7232,7233,-7160]],"properties":{"id":"24661478","dp":16908,"de":4389}},{"type":"Polygon","arcs":[[-7234,7234,-6918,7235,-7154,-7156]],"properties":{"id":"24661479","dp":14762,"de":1939}},{"type":"Polygon","arcs":[[-7149,-7236,-6917,7236,7237]],"properties":{"id":"24661480","dp":8243,"de":3399}},{"type":"Polygon","arcs":[[7238,-7237,-6915,7239,7240]],"properties":{"id":"24661481","dp":12135,"de":1941}},{"type":"Polygon","arcs":[[7241,-7240,-6914,-6911,7242,7243]],"properties":{"id":"24661482","dp":12693,"de":2552}},{"type":"Polygon","arcs":[[-7244,7244,7245,7246,7247]],"properties":{"id":"24661483","dp":8645,"de":1181}},{"type":"Polygon","arcs":[[-7243,-6910,-6903,-7245]],"properties":{"id":"24661484","dp":11379,"de":1819}},{"type":"Polygon","arcs":[[-5114,-5120,-5126,7248,7249,7250,-7044,-5108]],"properties":{"id":"24661966","dp":7873,"de":3232}},{"type":"Polygon","arcs":[[7251,7252,7253,7254,7255,-7251,7256,7257,7258,-7198,7259]],"properties":{"id":"24661967","dp":3177,"de":3564}},{"type":"Polygon","arcs":[[-7252,7260,7261,7262,7263]],"properties":{"id":"24661968","dp":13015,"de":2763}},{"type":"Polygon","arcs":[[7264,-7263,7265,7266,7267]],"properties":{"id":"24661969","dp":18865,"de":2835}},{"type":"Polygon","arcs":[[-7254,7268,-7268,7269,7270,7271,7272]],"properties":{"id":"24661970","dp":11617,"de":5024}},{"type":"Polygon","arcs":[[7273,-7270,-7267,-1502,-1495,-5753]],"properties":{"id":"24661971","dp":13829,"de":4255}},{"type":"Polygon","arcs":[[-6745,-5256,-5250,-5246,-5240,7274]],"properties":{"id":"24663114","dp":1217,"de":108}},{"type":"Polygon","arcs":[[7275,-5254,7276,7277,-6743,-7275,-5239,7278]],"properties":{"id":"24663115","dp":693,"de":123}},{"type":"Polygon","arcs":[[7279,7280,7281,-6414,-6412]],"properties":{"id":"24662579","dp":7222,"de":3378}},{"type":"Polygon","arcs":[[7282,7283,7284,-7280,-6411,7285]],"properties":{"id":"24662580","dp":8328,"de":3391}},{"type":"Polygon","arcs":[[-547,7286,-7283,7287]],"properties":{"id":"24662581","dp":11340,"de":1250}},{"type":"Polygon","arcs":[[-2357,7288,7289,7290,-7284,-7287]],"properties":{"id":"24662582","dp":10340,"de":2086}},{"type":"Polygon","arcs":[[-548,-7288,-7286,-6410,7291]],"properties":{"id":"24662583","dp":6255,"de":755}},{"type":"Polygon","arcs":[[-538,-7292,-6409,-6597]],"properties":{"id":"24662584","dp":9332,"de":1824}},{"type":"Polygon","arcs":[[-6364,7292,-6637,-6639,7293,7294,-1651,-3588]],"properties":{"id":"24662967","dp":1778,"de":3217}},{"type":"Polygon","arcs":[[-6363,-6604,-6622,-6634,-7293]],"properties":{"id":"24662968","dp":7128,"de":0}},{"type":"Polygon","arcs":[[-1216,7295,-1629,-1633,-1637,-1641,-1647,-1652,7296,-1624]],"properties":{"id":"24662969","dp":657,"de":2500}},{"type":"Polygon","arcs":[[-1630,-7296,-1215,-1429]],"properties":{"id":"24662970","dp":11054,"de":1318}},{"type":"Polygon","arcs":[[7297,7298,-6305,-6426,-6345,7299]],"properties":{"id":"24662971","dp":9022,"de":0}},{"type":"Polygon","arcs":[[-1828,-4920,-4922,-4924,-4925,-4927,7300,-4932,7301]],"properties":{"id":"24662972","dp":4122,"de":3140}},{"type":"Polygon","arcs":[[-7302,-4931,-7300,-1829]],"properties":{"id":"24662973","dp":6364,"de":1612}},{"type":"Polygon","arcs":[[7302,7303,7304,-7298,-4930]],"properties":{"id":"24662974","dp":9606,"de":0}},{"type":"Polygon","arcs":[[7305,7306,7307,-7304]],"properties":{"id":"24662975","dp":11605,"de":0}},{"type":"Polygon","arcs":[[-7308,7308,7309,7310,-6303,-6306,-7299,-7305]],"properties":{"id":"24662976","dp":2804,"de":0}},{"type":"Polygon","arcs":[[-7307,7311,7312,-7309]],"properties":{"id":"24662977","dp":8587,"de":0}},{"type":"Polygon","arcs":[[7313,7314,-7312,7315]],"properties":{"id":"24662978","dp":8765,"de":2839}},{"type":"Polygon","arcs":[[7316,7317,-7316,-7306,-7303,-4935,-4940]],"properties":{"id":"24662979","dp":5790,"de":604}},{"type":"Polygon","arcs":[[7318,7319,-4892,-4896,-4117,-4118]],"properties":{"id":"24662980","dp":13309,"de":0}},{"type":"Polygon","arcs":[[-4320,-3796,-4893,-7320,7320,-4129,-4131]],"properties":{"id":"24662981","dp":3753,"de":531}},{"type":"Polygon","arcs":[[-7321,-7319,-4121,-4125]],"properties":{"id":"24662982","dp":21013,"de":1843}},{"type":"Polygon","arcs":[[7321,7322,7323,7324]],"properties":{"id":"24662983","dp":4104,"de":0}},{"type":"Polygon","arcs":[[7325,7326,-7322,7327,7328,-5978]],"properties":{"id":"24662984","dp":694,"de":59}},{"type":"Polygon","arcs":[[7329,7330,7331,-6804,-6796]],"properties":{"id":"24661570","dp":1675,"de":646}},{"type":"Polygon","arcs":[[7332,7333,7334,7335,-7330,-6795]],"properties":{"id":"24661571","dp":3139,"de":419}},{"type":"Polygon","arcs":[[7336,-7335,7337,7338]],"properties":{"id":"24661572","dp":8257,"de":891}},{"type":"Polygon","arcs":[[-6605,-6491,-2861,7339,7340,-7339,7341]],"properties":{"id":"24661573","dp":4632,"de":2777}},{"type":"Polygon","arcs":[[7342,7343,7344,-7331,-7336,-7337,-7341]],"properties":{"id":"24661574","dp":3764,"de":329}},{"type":"Polygon","arcs":[[7345,-7332,-7345,7346]],"properties":{"id":"24661575","dp":6144,"de":652}},{"type":"Polygon","arcs":[[7347,7348,7349,-7347,-7344]],"properties":{"id":"24661576","dp":5741,"de":1770}},{"type":"Polygon","arcs":[[-7350,7350,7351,7352,-6803,-7346]],"properties":{"id":"24661577","dp":4896,"de":1349}},{"type":"Polygon","arcs":[[7353,7354,7355,7356,-7352]],"properties":{"id":"24661578","dp":3561,"de":2340}},{"type":"Polygon","arcs":[[7357,7358,7359,-7355,7360]],"properties":{"id":"24661579","dp":13350,"de":2094}},{"type":"Polygon","arcs":[[7361,7362,-7361,-7354,-7351,7363]],"properties":{"id":"24661580","dp":5877,"de":1084}},{"type":"Polygon","arcs":[[-917,7364,-7364,-7349,7365,-7140]],"properties":{"id":"24661581","dp":2279,"de":1302}},{"type":"Polygon","arcs":[[-921,-937,7366,-7362,-7365,-916]],"properties":{"id":"24661582","dp":3033,"de":380}},{"type":"Polygon","arcs":[[7367,7368,7369,7370,7371,7372,7373,7374,7375,-397,7376]],"properties":{"id":"24662067","dp":0,"de":4307}},{"type":"Polygon","arcs":[[7377,7378,-384,7379]],"properties":{"id":"24662069","dp":13885,"de":0}},{"type":"Polygon","arcs":[[7380,7381,7382,-7378,7383,7384]],"properties":{"id":"24662070","dp":13016,"de":0}},{"type":"Polygon","arcs":[[7385,7386,7387,-7381]],"properties":{"id":"24662071","dp":23709,"de":0}},{"type":"Polygon","arcs":[[-7278,7388,-5252,-5258,-6744]],"properties":{"id":"24663116","dp":1197,"de":230}},{"type":"Polygon","arcs":[[-7277,-5253,-7389]],"properties":{"id":"24663117","dp":1178,"de":0}},{"type":"Polygon","arcs":[[-6113,-5255,-7276,7389,7390,7391,7392,7393,-5145,-5148,7394,-5172],[-5151,-5152]],"properties":{"id":"24663118","dp":122,"de":297}},{"type":"Polygon","arcs":[[-5138,-5146,-7394,7395]],"properties":{"id":"24663119","dp":1488,"de":3982}},{"type":"Polygon","arcs":[[7396,-5139,-7396,-7393,7397]],"properties":{"id":"24663120","dp":3795,"de":596}},{"type":"Polygon","arcs":[[-7398,-7392,7398]],"properties":{"id":"24663121","dp":3712,"de":1164}},{"type":"Polygon","arcs":[[-7399,-7391,7399,-5140,-7397]],"properties":{"id":"24663122","dp":3883,"de":2478}},{"type":"Polygon","arcs":[[-6114,7400,-5167,-5169,-5165,-5878,-5870,-5184,-6117]],"properties":{"id":"24663407","dp":1668,"de":0}},{"type":"Polygon","arcs":[[-5399,-3436]],"properties":{"id":"24663164","dp":2687,"de":1734}},{"type":"Polygon","arcs":[[-5448,7401,-5445,-5451,7402,7403,-5453,-3438,-5398,7404,7405,7406]],"properties":{"id":"24663166","dp":1449,"de":3685}},{"type":"Polygon","arcs":[[7407,-7405,-5397,7408,7409]],"properties":{"id":"24663167","dp":2844,"de":0}},{"type":"Polygon","arcs":[[-5441,-7402,-5447]],"properties":{"id":"24663168","dp":3333,"de":542}},{"type":"Polygon","arcs":[[7410,-4272,-4271,-6919,-7235,-7233]],"properties":{"id":"24661493","dp":14917,"de":1543}},{"type":"Polygon","arcs":[[7411,-4101,-7411,-7231]],"properties":{"id":"24661494","dp":31176,"de":0}},{"type":"Polygon","arcs":[[7412,-4105,-7412,-7230]],"properties":{"id":"24661495","dp":16679,"de":3754}},{"type":"Polygon","arcs":[[7413,-4108,-7413,-7228]],"properties":{"id":"24661496","dp":13100,"de":2131}},{"type":"Polygon","arcs":[[7414,7415,7416,-7387]],"properties":{"id":"24662072","dp":24268,"de":0}},{"type":"Polygon","arcs":[[7417,7418,7419,7420,-7416,7421,7422,7423,7424]],"properties":{"id":"24662073","dp":10919,"de":4245}},{"type":"Polygon","arcs":[[7425,7426,7427,7428,-7417,-7421]],"properties":{"id":"24662074","dp":13825,"de":1663}},{"type":"Polygon","arcs":[[-7429,7429,7430,-7388]],"properties":{"id":"24662075","dp":20565,"de":0}},{"type":"Polygon","arcs":[[-7431,7431,7432,-7382]],"properties":{"id":"24662076","dp":15990,"de":0}},{"type":"Polygon","arcs":[[-7383,-7433,7433,-385,-7379]],"properties":{"id":"24662077","dp":12444,"de":0}},{"type":"Polygon","arcs":[[7434,7435,-1388,-390]],"properties":{"id":"24662078","dp":14730,"de":0}},{"type":"Polygon","arcs":[[-1454,-1467,-7010,7436,-7435,-389]],"properties":{"id":"24662079","dp":10897,"de":1201}},{"type":"Polygon","arcs":[[-7437,-7009,-7011,-1389,-7436]],"properties":{"id":"24662080","dp":11847,"de":2653}},{"type":"Polygon","arcs":[[-5713,-5716,7437,7438]],"properties":{"id":"24661798","dp":15497,"de":6544}},{"type":"Polygon","arcs":[[-5714,-7439,7439,7440,-5709]],"properties":{"id":"24661799","dp":23933,"de":3080}},{"type":"Polygon","arcs":[[-5710,-7441,7441,7442]],"properties":{"id":"24661800","dp":25858,"de":0}},{"type":"Polygon","arcs":[[-5707,-7443,7443,7444,-5701]],"properties":{"id":"24661801","dp":7223,"de":3251}},{"type":"Polygon","arcs":[[7445,7446,7447,7448,-7444]],"properties":{"id":"24661802","dp":8200,"de":2197}},{"type":"Polygon","arcs":[[-7446,-7442,7449,7450]],"properties":{"id":"24661803","dp":24945,"de":2472}},{"type":"Polygon","arcs":[[-7440,7451,7452,7453,-7450]],"properties":{"id":"24661804","dp":20105,"de":4577}},{"type":"Polygon","arcs":[[-7438,7454,7455,-7452]],"properties":{"id":"24661805","dp":17472,"de":2361}},{"type":"Polygon","arcs":[[-5715,-5033,7456,7457,-7455]],"properties":{"id":"24661806","dp":18461,"de":3974}},{"type":"Polygon","arcs":[[-7453,-7456,-7458,7458,7459,7460]],"properties":{"id":"24661807","dp":19787,"de":4416}},{"type":"Polygon","arcs":[[-7454,-7461,7461,7462,7463,7464]],"properties":{"id":"24661808","dp":18647,"de":4713}},{"type":"Polygon","arcs":[[-7451,-7465,7465,-7447]],"properties":{"id":"24661809","dp":10440,"de":2422}},{"type":"Polygon","arcs":[[-7464,7466,7467,7468,7469,-7448,-7466]],"properties":{"id":"24661810","dp":9196,"de":6551}},{"type":"Polygon","arcs":[[-7467,-7463,7470,7471]],"properties":{"id":"24661811","dp":18634,"de":3614}},{"type":"Polygon","arcs":[[-7471,-7462,-7460,7472,7473]],"properties":{"id":"24661812","dp":19173,"de":3512}},{"type":"Polygon","arcs":[[-7473,-7459,7474,7475]],"properties":{"id":"24661813","dp":15366,"de":8494}},{"type":"Polygon","arcs":[[-7475,-7457,7476,7477,7478,7479]],"properties":{"id":"24661814","dp":12566,"de":3318}},{"type":"Polygon","arcs":[[-5032,7480,-7477]],"properties":{"id":"24661815","dp":15734,"de":7109}},{"type":"Polygon","arcs":[[7481,7482,-7481,-5031]],"properties":{"id":"24661816","dp":11709,"de":7952}},{"type":"Polygon","arcs":[[-5835,-5823,-5829,7483,7484,-7482]],"properties":{"id":"24661817","dp":12057,"de":5199}},{"type":"Polygon","arcs":[[-7485,7485,-7478,-7483]],"properties":{"id":"24661818","dp":20765,"de":0}},{"type":"Polygon","arcs":[[7486,7487,7488,7489,-7486]],"properties":{"id":"24661819","dp":17472,"de":3296}},{"type":"Polygon","arcs":[[-5828,-5833,7490,7491,7492,-7487,-7484]],"properties":{"id":"24661820","dp":12617,"de":5679}},{"type":"Polygon","arcs":[[-7493,7493,-7273,7494,-7488]],"properties":{"id":"24661821","dp":11378,"de":4407}},{"type":"Polygon","arcs":[[7495,7496,-939,-946,7497,7498]],"properties":{"id":"24661592","dp":3003,"de":0}},{"type":"Polygon","arcs":[[-945,7499,-7498]],"properties":{"id":"24661593","dp":9223,"de":0}},{"type":"Polygon","arcs":[[-7360,7500,-7499,-7500,-944,-3549,7501]],"properties":{"id":"24661594","dp":5594,"de":471}},{"type":"Polygon","arcs":[[-7356,-7502,-3554,7502]],"properties":{"id":"24661595","dp":3869,"de":455}},{"type":"Polygon","arcs":[[-7353,-7357,-7503,-3553,7503,-6802]],"properties":{"id":"24661597","dp":3066,"de":400}},{"type":"Polygon","arcs":[[-7504,-3552,-6799,-6800]],"properties":{"id":"24661598","dp":3017,"de":361}},{"type":"Polygon","arcs":[[7504,-4111,-7414,-7226]],"properties":{"id":"24661497","dp":13043,"de":1976}},{"type":"Polygon","arcs":[[7505,-4119,-4115,-4112,-7505,-7224,-7222]],"properties":{"id":"24661498","dp":5474,"de":23734}},{"type":"Polygon","arcs":[[-7506,-7220,-7218,-7216,7506,-4126,-4122]],"properties":{"id":"24661499","dp":10355,"de":1601}},{"type":"Polygon","arcs":[[7507,-4135,-4132,-4127,-7507,-7214,-7212]],"properties":{"id":"24661500","dp":8146,"de":4517}},{"type":"Polygon","arcs":[[-7508,-7211,7508,7509,-4136]],"properties":{"id":"24661501","dp":12047,"de":6428}},{"type":"Polygon","arcs":[[7510,7511,-4143,-7510,7512]],"properties":{"id":"24661502","dp":13410,"de":1589}},{"type":"Polygon","arcs":[[7513,-7513,-7509,-7083,7514]],"properties":{"id":"24661503","dp":14649,"de":3184}},{"type":"Polygon","arcs":[[7515,-4149,7516,-7511,-7514,7517]],"properties":{"id":"24661504","dp":15988,"de":8720}},{"type":"Polygon","arcs":[[-7517,-4146,-4139,-7512]],"properties":{"id":"24661505","dp":18595,"de":0}},{"type":"Polygon","arcs":[[7518,7519,-4152,-7516,7520]],"properties":{"id":"24661506","dp":19589,"de":5479}},{"type":"Polygon","arcs":[[7521,-4302,-4299,-7520,7522]],"properties":{"id":"24661507","dp":14609,"de":4687}},{"type":"Polygon","arcs":[[-6956,-4305,-7522,7523]],"properties":{"id":"24661508","dp":12172,"de":1114}},{"type":"Polygon","arcs":[[-6957,-7524,7524,7525,7526]],"properties":{"id":"24661509","dp":12715,"de":5387}},{"type":"Polygon","arcs":[[-7525,-7523,-7519,7527]],"properties":{"id":"24661510","dp":15028,"de":3693}},{"type":"Polygon","arcs":[[7528,-7521,-7518,-7515,-7082,-7080,-7072]],"properties":{"id":"24661513","dp":11255,"de":36595}},{"type":"Polygon","arcs":[[-7065,7529,7530,7531,-7071,-7070]],"properties":{"id":"24661514","dp":11062,"de":6941}},{"type":"Polygon","arcs":[[-7062,-7059,7532,7533,7534,-7530,-7064]],"properties":{"id":"24661515","dp":11259,"de":3827}},{"type":"Polygon","arcs":[[7535,7536,7537,-7533,7538]],"properties":{"id":"24661516","dp":13723,"de":7040}},{"type":"Polygon","arcs":[[-6951,-6950,7539,-7537,7540]],"properties":{"id":"24661517","dp":13107,"de":6265}},{"type":"Polygon","arcs":[[-7534,-7538,-7540,-6949,-6958,-7527,7541]],"properties":{"id":"24661518","dp":10919,"de":11069}},{"type":"Polygon","arcs":[[-5925,-1470,7542,7543]],"properties":{"id":"24661997","dp":11583,"de":1583}},{"type":"Polygon","arcs":[[-7543,-1469,7544,7545]],"properties":{"id":"24661998","dp":14210,"de":0}},{"type":"Polygon","arcs":[[7546,-7545,-1468,-1456,7547,7548]],"properties":{"id":"24661999","dp":13684,"de":1258}},{"type":"Polygon","arcs":[[7549,-7548,-1458,-1451,7550,7551]],"properties":{"id":"24662000","dp":13549,"de":1267}},{"type":"Polygon","arcs":[[7552,-7551,-1455,-388,7553]],"properties":{"id":"24662001","dp":15687,"de":0}},{"type":"Polygon","arcs":[[7554,7555,-7552,-7553,7556,7557]],"properties":{"id":"24662002","dp":16578,"de":2359}},{"type":"Polygon","arcs":[[-7557,-7554,-387,7558]],"properties":{"id":"24662003","dp":13910,"de":0}},{"type":"Polygon","arcs":[[7559,-7558,-7559,-386,-7434]],"properties":{"id":"24662004","dp":13737,"de":2706}},{"type":"Polygon","arcs":[[7560,7561,-7555,-7560,-7432]],"properties":{"id":"24662005","dp":16012,"de":1446}},{"type":"Polygon","arcs":[[-7428,7562,7563,7564,-7561,-7430]],"properties":{"id":"24662006","dp":17889,"de":1623}},{"type":"Polygon","arcs":[[-4458,-7141,-7366,-7348,-7343,-7340,-2860,-2847]],"properties":{"id":"24661620","dp":4479,"de":445}},{"type":"Polygon","arcs":[[-6990,7565,7566,7567,-6966,-6962,-6954,7568,-4727]],"properties":{"id":"24661621","dp":7933,"de":23795}},{"type":"Polygon","arcs":[[-6606,-7342,-7338,-7334,-6991,-6988]],"properties":{"id":"24661532","dp":2209,"de":4562}},{"type":"Polygon","arcs":[[-7333,7569,7570,7571,-6992]],"properties":{"id":"24661533","dp":22113,"de":2303}},{"type":"Polygon","arcs":[[-6993,-7572,7572,7573]],"properties":{"id":"24661534","dp":20646,"de":2985}},{"type":"Polygon","arcs":[[-6974,-7574,7574,7575]],"properties":{"id":"24661535","dp":23657,"de":2777}},{"type":"Polygon","arcs":[[-6975,-7576,7576,7577]],"properties":{"id":"24661536","dp":23127,"de":2132}},{"type":"Polygon","arcs":[[-6976,-7578,7578,7579]],"properties":{"id":"24661537","dp":24251,"de":3140}},{"type":"Polygon","arcs":[[-6969,-7580,7580,7581]],"properties":{"id":"24661538","dp":20189,"de":2606}},{"type":"Polygon","arcs":[[-6970,-7582,7582,7583]],"properties":{"id":"24661539","dp":24692,"de":2192}},{"type":"Polygon","arcs":[[-6965,-7584,7584,-6961]],"properties":{"id":"24661540","dp":25922,"de":0}},{"type":"Polygon","arcs":[[-7585,7585,-3391]],"properties":{"id":"24661541","dp":26096,"de":2673}},{"type":"Polygon","arcs":[[7586,7587,-7586,-7583]],"properties":{"id":"24661542","dp":18052,"de":0}},{"type":"Polygon","arcs":[[-7581,7588,7589,-7587]],"properties":{"id":"24661543","dp":21771,"de":0}},{"type":"Polygon","arcs":[[-7579,7590,7591,-7589]],"properties":{"id":"24661544","dp":21511,"de":2616}},{"type":"Polygon","arcs":[[-7575,7592,7593,-7591,-7577]],"properties":{"id":"24661545","dp":17464,"de":1424}},{"type":"Polygon","arcs":[[-7571,7594,7595,7596,-7593,-7573]],"properties":{"id":"24661546","dp":15792,"de":0}},{"type":"Polygon","arcs":[[-7570,-6794,7597,-7595]],"properties":{"id":"24661547","dp":37974,"de":0}},{"type":"Polygon","arcs":[[-7598,-6793,-6775,-6770,7598,-7596]],"properties":{"id":"24661548","dp":18980,"de":0}},{"type":"Polygon","arcs":[[-7597,-7599,-6766,7599,7600,-7594]],"properties":{"id":"24661549","dp":11074,"de":2399}},{"type":"Polygon","arcs":[[-7601,7601,7602,-7592]],"properties":{"id":"24661550","dp":20568,"de":0}},{"type":"Polygon","arcs":[[-7590,-7603,7603,-3392,-7588]],"properties":{"id":"24661551","dp":13873,"de":2747}},{"type":"Polygon","arcs":[[7604,-7139,-7128,-4205,-3393]],"properties":{"id":"24661554","dp":9649,"de":2192}},{"type":"Polygon","arcs":[[7605,-7135,-7138,-7605,-7604]],"properties":{"id":"24661555","dp":19215,"de":1260}},{"type":"Polygon","arcs":[[-7600,-6769,-6779,-6784,-7134,-7132,-7136,-7606,-7602]],"properties":{"id":"24661556","dp":6867,"de":1040}},{"type":"Polygon","arcs":[[7606,7607,7608]],"properties":{"id":"24662030","dp":21111,"de":2263}},{"type":"Polygon","arcs":[[-7489,7609,-7608,7610]],"properties":{"id":"24662031","dp":15163,"de":3485}},{"type":"Polygon","arcs":[[-7271,-7274,-5758,-5890,-5892,-5900,7611,7612]],"properties":{"id":"24662032","dp":2764,"de":6921}},{"type":"Polygon","arcs":[[-7253,-7264,-7265,-7269]],"properties":{"id":"24662033","dp":14688,"de":2564}},{"type":"Polygon","arcs":[[7613,-7418,7614]],"properties":{"id":"24662034","dp":16629,"de":0}},{"type":"Polygon","arcs":[[7615,7616,-7615,-7425,7617,7618]],"properties":{"id":"24662035","dp":17830,"de":0}},{"type":"Polygon","arcs":[[-7618,-7424,7619,7620]],"properties":{"id":"24662036","dp":11662,"de":0}},{"type":"Polygon","arcs":[[-6250,7621,-7619,-7621,7622,7623]],"properties":{"id":"24662037","dp":13612,"de":1076}},{"type":"Polygon","arcs":[[7624,-7623,-7620,-7423,7625,7626]],"properties":{"id":"24662038","dp":12873,"de":0}},{"type":"Polygon","arcs":[[-7626,-7422,-7415,7627]],"properties":{"id":"24662039","dp":8935,"de":0}},{"type":"Polygon","arcs":[[-7627,-7628,-7386,7628,7629]],"properties":{"id":"24662040","dp":14587,"de":899}},{"type":"Polygon","arcs":[[7630,-7629,-7385,7631,7632]],"properties":{"id":"24662041","dp":12411,"de":1996}},{"type":"Polygon","arcs":[[-7632,-7384,-7380,-383,7633,7634]],"properties":{"id":"24662042","dp":8479,"de":1305}},{"type":"Polygon","arcs":[[7635,-7634,-7376,7636]],"properties":{"id":"24662043","dp":11617,"de":0}},{"type":"Polygon","arcs":[[-7492,7637,7638,-7255,-7494]],"properties":{"id":"24661822","dp":11670,"de":1354}},{"type":"Polygon","arcs":[[-7491,7639,-7638]],"properties":{"id":"24661823","dp":18630,"de":1712}},{"type":"Polygon","arcs":[[-5832,7640,-7045,-7256,-7639,-7640]],"properties":{"id":"24661824","dp":16313,"de":2120}},{"type":"Polygon","arcs":[[-7043,-7641,-5831]],"properties":{"id":"24661825","dp":16491,"de":3333}},{"type":"Polygon","arcs":[[-6594,-6592,-6585,7641,7642,7643]],"properties":{"id":"24662271","dp":3162,"de":370}},{"type":"Polygon","arcs":[[-6595,-7644,7644,-5395]],"properties":{"id":"24662272","dp":4295,"de":939}},{"type":"Polygon","arcs":[[7645,-7409,-5396,-7645,-7643,7646]],"properties":{"id":"24662273","dp":2869,"de":0}},{"type":"Polygon","arcs":[[7647,7648,-7647,-7642,-6584]],"properties":{"id":"24662274","dp":3347,"de":277}},{"type":"Polygon","arcs":[[-3072,7649,7650,-7648,-6583]],"properties":{"id":"24662275","dp":2304,"de":0}},{"type":"Polygon","arcs":[[7651,7652,-3712,-1269]],"properties":{"id":"24661940","dp":17157,"de":11710}},{"type":"Polygon","arcs":[[7653,7654,7655,-7653]],"properties":{"id":"24661941","dp":19380,"de":3925}},{"type":"Polygon","arcs":[[7656,7657,-1287,-5796,7658,7659,-7654]],"properties":{"id":"24661942","dp":2428,"de":18450}},{"type":"Polygon","arcs":[[7660,-7657,-7652,-1274]],"properties":{"id":"24661943","dp":16448,"de":13620}},{"type":"Polygon","arcs":[[-1280,-1283,-1288,-7658,-7661,-1273]],"properties":{"id":"24661944","dp":13028,"de":35981}},{"type":"Polygon","arcs":[[-7660,7661,7662,-7655]],"properties":{"id":"24661945","dp":16238,"de":4867}},{"type":"Polygon","arcs":[[-3713,-7656,-7663,7663,7664,7665]],"properties":{"id":"24661946","dp":10887,"de":15614}},{"type":"Polygon","arcs":[[-7665,7666,7667,7668,7669]],"properties":{"id":"24661947","dp":18826,"de":2826}},{"type":"Polygon","arcs":[[-7666,-7670,7670,7671,-3709]],"properties":{"id":"24661948","dp":14350,"de":6638}},{"type":"Polygon","arcs":[[-7671,-7669,7672,7673]],"properties":{"id":"24661949","dp":16658,"de":3367}},{"type":"Polygon","arcs":[[-7672,-7674,7674,-3696,-5135,-5137]],"properties":{"id":"24661950","dp":10156,"de":7702}},{"type":"Polygon","arcs":[[7675,-5498,-5506,-3689,-3700,-3697]],"properties":{"id":"24661953","dp":12183,"de":10204}},{"type":"Polygon","arcs":[[7676,7677,7678,-7676,-7675,-7673]],"properties":{"id":"24661954","dp":16651,"de":7683}},{"type":"Polygon","arcs":[[7679,7680,-7677,-7668]],"properties":{"id":"24661955","dp":18132,"de":2918}},{"type":"Polygon","arcs":[[7681,7682,7683,-7678,-7681]],"properties":{"id":"24661956","dp":9977,"de":3611}},{"type":"Polygon","arcs":[[7684,7685,7686,-7682,7687]],"properties":{"id":"24661957","dp":13908,"de":5456}},{"type":"Polygon","arcs":[[7688,-7688,-7680,-7667,-7664]],"properties":{"id":"24661958","dp":18788,"de":10695}},{"type":"Polygon","arcs":[[7689,7690,7691,-7689,-7662]],"properties":{"id":"24661959","dp":13929,"de":9824}},{"type":"Polygon","arcs":[[7692,7693,-7691]],"properties":{"id":"24661960","dp":16458,"de":4249}},{"type":"Polygon","arcs":[[-7690,-7659,-5795,-6693,-6698,-6700,7694,-7693]],"properties":{"id":"24661961","dp":3152,"de":1246}},{"type":"Polygon","arcs":[[-7692,-7694,-7695,-6702,7695,-7685]],"properties":{"id":"24661962","dp":8834,"de":37730}},{"type":"Polygon","arcs":[[-7696,-6703,-6710,7696,-7686]],"properties":{"id":"24661963","dp":18341,"de":4899}},{"type":"Polygon","arcs":[[7697,-7496,-7501,-7359]],"properties":{"id":"24661599","dp":4056,"de":0}},{"type":"Polygon","arcs":[[-7367,-940,-7497,-7698,-7358,-7363]],"properties":{"id":"24661600","dp":3124,"de":766}},{"type":"Polygon","arcs":[[-3550,-942,-4410,-7125,7698,-7123,-5565]],"properties":{"id":"24661601","dp":2188,"de":2150}},{"type":"Polygon","arcs":[[-7124,-7699]],"properties":{"id":"24661602","dp":4102,"de":0}},{"type":"Polygon","arcs":[[-7204,-1500,7699]],"properties":{"id":"24662098","dp":14023,"de":0}},{"type":"Polygon","arcs":[[-1499,-7266,-7262,7700,-7201,-7700]],"properties":{"id":"24662099","dp":10173,"de":1906}},{"type":"Polygon","arcs":[[-7260,-7202,-7701,-7261]],"properties":{"id":"24662100","dp":13190,"de":4605}},{"type":"Polygon","arcs":[[-7259,7701,-7194,-7196,-7199]],"properties":{"id":"24662101","dp":6017,"de":1857}},{"type":"Polygon","arcs":[[7702,-7192,-7702,-7258]],"properties":{"id":"24662102","dp":10739,"de":4225}},{"type":"Polygon","arcs":[[7703,7704,-333,7705]],"properties":{"id":"24662103","dp":6944,"de":1889}},{"type":"Polygon","arcs":[[7706,-3821,-3814,-7705]],"properties":{"id":"24662104","dp":8165,"de":2206}},{"type":"Polygon","arcs":[[-3495,7707,-3822,-7707,7708]],"properties":{"id":"24662105","dp":9480,"de":3003}},{"type":"Polygon","arcs":[[-3494,-3825,-3818,-7708]],"properties":{"id":"24662106","dp":9200,"de":0}},{"type":"Polygon","arcs":[[7709,-2264,-2257,-7007]],"properties":{"id":"24662108","dp":15333,"de":1770}},{"type":"Polygon","arcs":[[7710,-2274,-7710,-6834]],"properties":{"id":"24662109","dp":18228,"de":1351}},{"type":"Polygon","arcs":[[7711,-2275,-7711,7712]],"properties":{"id":"24662110","dp":15255,"de":0}},{"type":"Polygon","arcs":[[-5018,-5017,7713,-6554,-6549,-6545]],"properties":{"id":"24662111","dp":11775,"de":13054}},{"type":"Polygon","arcs":[[-5010,7714,-6555,-7714,-5016]],"properties":{"id":"24662112","dp":17245,"de":4918}},{"type":"Polygon","arcs":[[-6551,-7715,-5009,-5004,-4876,-4875,-4872,-6556]],"properties":{"id":"24662113","dp":3453,"de":442}},{"type":"Polygon","arcs":[[7715,-3523,7716,-1931]],"properties":{"id":"24662958","dp":3548,"de":461}},{"type":"Polygon","arcs":[[-1594,-1598,-1602,-3521,-7716,-1930]],"properties":{"id":"24662961","dp":7521,"de":1569}},{"type":"Polygon","arcs":[[-6653,7717,7718,7719,7720,-6655]],"properties":{"id":"24662962","dp":10448,"de":0}},{"type":"Polygon","arcs":[[-6656,-7721,7721,7722,-6667,-6662]],"properties":{"id":"24662963","dp":13293,"de":0}},{"type":"Polygon","arcs":[[-7295,7723,-6641,-6651,7724,-6665,-6685,-6687,-6691,7725,-1625,-7297]],"properties":{"id":"24662964","dp":941,"de":3834}},{"type":"Polygon","arcs":[[-6650,-6661,-6666,-7725]],"properties":{"id":"24662965","dp":13662,"de":4714}},{"type":"Polygon","arcs":[[-7294,-7724]],"properties":{"id":"24662966","dp":29845,"de":0}},{"type":"Polygon","arcs":[[-7566,-6981,-6967,7726]],"properties":{"id":"24661622","dp":19846,"de":2307}},{"type":"Polygon","arcs":[[-7567,-7727,-6971,7727]],"properties":{"id":"24661623","dp":23600,"de":2444}},{"type":"Polygon","arcs":[[-7728,-6963,-7568]],"properties":{"id":"24661624","dp":17574,"de":5106}},{"type":"Polygon","arcs":[[-4738,-4728,-7569,-6953,7728,-4750]],"properties":{"id":"24661625","dp":2091,"de":6686}},{"type":"Polygon","arcs":[[-4763,-7729,-6952,-7541,-7536,7729,7730]],"properties":{"id":"24661626","dp":6212,"de":10221}},{"type":"Polygon","arcs":[[-7730,-7539,-7061,7731]],"properties":{"id":"24661627","dp":17538,"de":5135}},{"type":"Polygon","arcs":[[-5115,-4764,-7731,-7732,-7057,-7056,7732,7733]],"properties":{"id":"24661628","dp":2730,"de":12672}},{"type":"Polygon","arcs":[[-7734,7734,7735,-5116]],"properties":{"id":"24661629","dp":10100,"de":8193}},{"type":"Polygon","arcs":[[-7246,-6906,-2293,7736]],"properties":{"id":"24661630","dp":6753,"de":2217}},{"type":"Polygon","arcs":[[7737,7738,-7737,7739,7740]],"properties":{"id":"24661631","dp":7161,"de":2380}},{"type":"Polygon","arcs":[[7741,-7247,-7739,7742,7743,7744]],"properties":{"id":"24661632","dp":11209,"de":756}},{"type":"Polygon","arcs":[[7745,-7242,-7248,-7742,7746]],"properties":{"id":"24661633","dp":11463,"de":958}},{"type":"Polygon","arcs":[[-7209,7747,-7241,-7746]],"properties":{"id":"24661634","dp":11827,"de":1724}},{"type":"Polygon","arcs":[[-7208,-7150,-7238,-7239,-7748]],"properties":{"id":"24661635","dp":12547,"de":2857}},{"type":"Polygon","arcs":[[7748,7749,-2903]],"properties":{"id":"24662131","dp":17239,"de":0}},{"type":"Polygon","arcs":[[7750,7751,-7749,-2902]],"properties":{"id":"24662132","dp":16117,"de":3324}},{"type":"Polygon","arcs":[[-7751,-2901,7752,7753,7754]],"properties":{"id":"24662133","dp":7219,"de":8005}},{"type":"Polygon","arcs":[[-7754,7755,7756,-2565,-2571,7757]],"properties":{"id":"24662134","dp":6560,"de":1864}},{"type":"Polygon","arcs":[[7758,-3540,7759,7760,-7756]],"properties":{"id":"24662135","dp":7688,"de":15667}},{"type":"Polygon","arcs":[[-2910,-2915,-7759,-7753]],"properties":{"id":"24662136","dp":21841,"de":2966}},{"type":"Polygon","arcs":[[-7761,7761,-6121,-2562,-7757]],"properties":{"id":"24662137","dp":10441,"de":8201}},{"type":"Polygon","arcs":[[-3539,7762,7763,-6125,-6122,-7762,-7760]],"properties":{"id":"24662138","dp":3353,"de":13807}},{"type":"Polygon","arcs":[[-5805,-5803,-2727,7764,-6126]],"properties":{"id":"24662140","dp":32804,"de":28048}},{"type":"Polygon","arcs":[[-6127,-7765,-2730]],"properties":{"id":"24662141","dp":31500,"de":2500}},{"type":"Polygon","arcs":[[7765,7766,-5207,-7764]],"properties":{"id":"24662142","dp":26520,"de":40878}},{"type":"Polygon","arcs":[[-4563,-2709,-2718,-5208,-7767,7767]],"properties":{"id":"24662143","dp":3505,"de":12207}},{"type":"Polygon","arcs":[[-3545,-4564,-7768,-7766,-7763,-3538]],"properties":{"id":"24662144","dp":13223,"de":28371}},{"type":"Polygon","arcs":[[-7210,-7747,7768,-5772,-5764]],"properties":{"id":"24661660","dp":10017,"de":1475}},{"type":"Polygon","arcs":[[-7769,-7745,7769,-5773]],"properties":{"id":"24661661","dp":14436,"de":0}},{"type":"Polygon","arcs":[[-7770,-7744,7770,-5775]],"properties":{"id":"24661662","dp":11105,"de":1442}},{"type":"Polygon","arcs":[[-1476,-5776,-7771,-7743,-7738,7771,-1472]],"properties":{"id":"24661663","dp":4123,"de":1231}},{"type":"Polygon","arcs":[[-7772,-7741,7772,7773,-1473]],"properties":{"id":"24661664","dp":8072,"de":2409}},{"type":"Polygon","arcs":[[-7774,7774,7775,-1462,-1474]],"properties":{"id":"24661665","dp":11469,"de":0}},{"type":"Polygon","arcs":[[-7776,7776,7777,7778,-1463]],"properties":{"id":"24661666","dp":8374,"de":643}},{"type":"Polygon","arcs":[[7779,-2288,7780,-7777]],"properties":{"id":"24661667","dp":7920,"de":1804}},{"type":"Polygon","arcs":[[-7773,-7740,-2292,-7780,-7775]],"properties":{"id":"24661668","dp":10695,"de":2139}},{"type":"Polygon","arcs":[[-7778,-7781,-2287,-2281,-2271,-7712,7781]],"properties":{"id":"24661669","dp":3545,"de":1232}},{"type":"Polygon","arcs":[[-7779,-7782,7782,-1464]],"properties":{"id":"24661670","dp":6715,"de":1863}},{"type":"Polygon","arcs":[[-7783,-7713,-6833,-1465]],"properties":{"id":"24661671","dp":15000,"de":1724}},{"type":"Polygon","arcs":[[-6010,-2310,7783,7784,7785,7786,7787,7788]],"properties":{"id":"24662162","dp":1682,"de":24676}},{"type":"Polygon","arcs":[[-6007,-7789,7789,7790,-2890,7791]],"properties":{"id":"24662163","dp":6950,"de":2593}},{"type":"Polygon","arcs":[[-2889,7792,-2874,-6008,-7792]],"properties":{"id":"24662164","dp":3200,"de":3169}},{"type":"Polygon","arcs":[[-7793,-2888,-2883,-2875]],"properties":{"id":"24662165","dp":13571,"de":0}},{"type":"Polygon","arcs":[[-3473,-2891,-7791,-3533,-2913,7793]],"properties":{"id":"24662167","dp":4663,"de":6351}},{"type":"Polygon","arcs":[[-2906,-7794]],"properties":{"id":"24662168","dp":23446,"de":0}},{"type":"Polygon","arcs":[[7794,-2528,7795]],"properties":{"id":"24662169","dp":10740,"de":0}},{"type":"Polygon","arcs":[[7796,7797,7798,7799,-7796,-2527,7800]],"properties":{"id":"24662170","dp":5975,"de":0}},{"type":"Polygon","arcs":[[7801,7802,-7799]],"properties":{"id":"24662171","dp":6305,"de":0}},{"type":"Polygon","arcs":[[-2529,-7795,-7800,7803]],"properties":{"id":"24662172","dp":8530,"de":884}},{"type":"Polygon","arcs":[[-7803,7804,-715,-706,-697,-3105,-7804]],"properties":{"id":"24662173","dp":3917,"de":770}},{"type":"Polygon","arcs":[[-2680,-2491,7805,7806,7807,-710,-7805,7808,-7797,7809]],"properties":{"id":"24662174","dp":2149,"de":185}},{"type":"Polygon","arcs":[[-7802,-7798,-7809]],"properties":{"id":"24662175","dp":10682,"de":741}},{"type":"Polygon","arcs":[[-7687,-7697,-6709,7810,-7683]],"properties":{"id":"24661964","dp":18611,"de":3213}},{"type":"Polygon","arcs":[[-7679,-7684,-7811,-6708,-5489,-5496]],"properties":{"id":"24661965","dp":12250,"de":13588}},{"type":"Polygon","arcs":[[-6344,-5686,7811]],"properties":{"id":"24662342","dp":4292,"de":0}},{"type":"Polygon","arcs":[[-3062,-6321,-6342,-7812,-5683,7812]],"properties":{"id":"24662343","dp":3632,"de":317}},{"type":"Polygon","arcs":[[-3057,-3063,-7813,-5682,7813]],"properties":{"id":"24662344","dp":3089,"de":0}},{"type":"Polygon","arcs":[[7814,7815,-5465,-3058,-7814,-5681,7816]],"properties":{"id":"24662345","dp":3383,"de":0}},{"type":"MultiPolygon","arcs":[[[7817,7818,7819,-6025,-6028,-6013,7820,7821]],[[7822,7823,-4282,7824]],[[7825,-4277,7826]]],"properties":{"id":"24663390","dp":694,"de":1243}},{"type":"Polygon","arcs":[[7827,7828,7829,-7819]],"properties":{"id":"24663391","dp":8240,"de":2423}},{"type":"Polygon","arcs":[[7830,-7828,7831,7832]],"properties":{"id":"24663392","dp":6712,"de":1909}},{"type":"Polygon","arcs":[[-7831,7833,-1778,7834,-7829]],"properties":{"id":"24663393","dp":8991,"de":2242}},{"type":"MultiPolygon","arcs":[[[-7833,7835,7836,-1772,7837,-1779,-7834]],[[-1781,7838,7839,7840]],[[-1786,7841,7842,7843]],[[-1783,7844,7845,7846]]],"properties":{"id":"24663394","dp":2124,"de":3179}},{"type":"MultiPolygon","arcs":[[[-7827,-4276,-2465,7847,-7840,7848]],[[7849,-7836,-7832,-7818]],[[7850,-7843,7851,-7823]],[[7852]],[[-7846,7853]]],"properties":{"id":"24663395","dp":3547,"de":470}},{"type":"Polygon","arcs":[[7854]],"properties":{"id":"24663396","dp":26,"de":0}},{"type":"Polygon","arcs":[[7855,7856,7857,7858,7859,-7419,-7614]],"properties":{"id":"24663397","dp":15008,"de":900}},{"type":"Polygon","arcs":[[7860,7861,7862,-7857]],"properties":{"id":"24663398","dp":10852,"de":0}},{"type":"Polygon","arcs":[[-7861,-7856,-7617,7863]],"properties":{"id":"24663399","dp":9401,"de":664}},{"type":"Polygon","arcs":[[7864,-7864,-7616,-7622,-6249]],"properties":{"id":"24663400","dp":12946,"de":4872}},{"type":"Polygon","arcs":[[7865,7866,7867,-7862,-7865,-6253]],"properties":{"id":"24663401","dp":2525,"de":7200}},{"type":"Polygon","arcs":[[7868,-1130,-1138,7869]],"properties":{"id":"24663402","dp":10158,"de":0}},{"type":"Polygon","arcs":[[-1749,-1757,-1767,-3983,-3844,-3840,-3836,-3834]],"properties":{"id":"24661703","dp":7376,"de":1388}},{"type":"Polygon","arcs":[[7870,-2230,-2227,-2221,-1737,-1539]],"properties":{"id":"24661704","dp":12107,"de":1789}},{"type":"Polygon","arcs":[[-7021,-7019,-2243,-2235,-2231,-7871,-1538]],"properties":{"id":"24661705","dp":4225,"de":15312}},{"type":"Polygon","arcs":[[7871,-7377,-396,-1447,-7031,-3490]],"properties":{"id":"24661708","dp":4721,"de":1518}},{"type":"Polygon","arcs":[[7872,7873,-7368,-7872,-3496,7874,7875]],"properties":{"id":"24661709","dp":2164,"de":5433}},{"type":"Polygon","arcs":[[-7709,-7704,7876,-7875]],"properties":{"id":"24661710","dp":8519,"de":3107}},{"type":"Polygon","arcs":[[7877,-7876,-7877,7878,7879,7880]],"properties":{"id":"24661711","dp":8349,"de":1225}},{"type":"Polygon","arcs":[[-7879,-7706,-332,7881]],"properties":{"id":"24661712","dp":8303,"de":0}},{"type":"Polygon","arcs":[[7882,-7880,-7882,-331,7883]],"properties":{"id":"24661713","dp":9049,"de":1311}},{"type":"Polygon","arcs":[[7884,-7884,7885,-3957]],"properties":{"id":"24661714","dp":11540,"de":0}},{"type":"Polygon","arcs":[[-3958,-7886,-330,-3808,-3800,-3799,-3960]],"properties":{"id":"24661715","dp":4304,"de":1828}},{"type":"Polygon","arcs":[[7886,-7881,-7883,-7885,7887]],"properties":{"id":"24661716","dp":9462,"de":833}},{"type":"Polygon","arcs":[[7888,-7888,-3956]],"properties":{"id":"24661717","dp":10787,"de":0}},{"type":"Polygon","arcs":[[7889,7890,-7874,7891,-7889,-3955]],"properties":{"id":"24661718","dp":1532,"de":1834}},{"type":"Polygon","arcs":[[-7873,-7878,-7887,-7892]],"properties":{"id":"24661719","dp":4314,"de":2983}},{"type":"Polygon","arcs":[[-3481,7892,-3479,-5317,-5320,-365,-7890,-3954,-3483,7893]],"properties":{"id":"24661720","dp":699,"de":878}},{"type":"Polygon","arcs":[[-3482,-7894]],"properties":{"id":"24661721","dp":12230,"de":0}},{"type":"MultiPolygon","arcs":[[[7894,-4685,7895,7896,-7327]],[[7897]]],"properties":{"id":"24662985","dp":777,"de":413}},{"type":"Polygon","arcs":[[-5977,7898,-7895,-7326]],"properties":{"id":"24662986","dp":1242,"de":153}},{"type":"Polygon","arcs":[[-3450,-4686,-7899,-5976]],"properties":{"id":"24662987","dp":974,"de":291}},{"type":"Polygon","arcs":[[-7869,7899,7900,-1121]],"properties":{"id":"24663403","dp":5476,"de":0}},{"type":"Polygon","arcs":[[-1135,7901,-7900,-7870,-1137,-3740]],"properties":{"id":"24663404","dp":7196,"de":0}},{"type":"Polygon","arcs":[[-7902,-1134,-1122,-7901]],"properties":{"id":"24663405","dp":6421,"de":0}},{"type":"Polygon","arcs":[[-5879,-5168,-7401,-5173,-7395,-5147,-4960,-5950,-5948,-4968,-4972]],"properties":{"id":"24663406","dp":686,"de":73}},{"type":"Polygon","arcs":[[7902,-7528,-7529,-7532]],"properties":{"id":"24663450","dp":14109,"de":2729}},{"type":"Polygon","arcs":[[-7531,-7535,-7542,-7526,-7903]],"properties":{"id":"24663451","dp":6708,"de":12304}},{"type":"Polygon","arcs":[[-6139,7903,-2963,-1308,-1249,-6135,-6137]],"properties":{"id":"24663452","dp":5953,"de":25994}},{"type":"Polygon","arcs":[[-4586,-2964,-7904,-6138,-2966]],"properties":{"id":"24663453","dp":12181,"de":2674}},{"type":"Polygon","arcs":[[7904,7905,7906,-7563,-7427]],"properties":{"id":"24662007","dp":19251,"de":0}},{"type":"Polygon","arcs":[[7907,-7546,-7547,7908,-7564,-7907]],"properties":{"id":"24662008","dp":8516,"de":1180}},{"type":"Polygon","arcs":[[-7565,-7909,-7549,-7550,-7556,-7562]],"properties":{"id":"24662009","dp":13447,"de":3561}},{"type":"Polygon","arcs":[[7909,-7544,-7908,7910]],"properties":{"id":"24662010","dp":15041,"de":2054}},{"type":"Polygon","arcs":[[7911,-5920,-5923,-5926,-7910,7912]],"properties":{"id":"24662011","dp":13357,"de":2828}},{"type":"Polygon","arcs":[[7913,-7913,-7911,-7906,7914]],"properties":{"id":"24662012","dp":12888,"de":3486}},{"type":"Polygon","arcs":[[7915,-5921,-7912,-7914,7916]],"properties":{"id":"24662013","dp":15308,"de":3089}},{"type":"Polygon","arcs":[[-7860,7917,-7917,-7915,-7905,-7426,-7420]],"properties":{"id":"24662014","dp":5970,"de":1146}},{"type":"Polygon","arcs":[[7918,7919,-5918,-7916,-7918,-7859]],"properties":{"id":"24662015","dp":7562,"de":3541}},{"type":"Polygon","arcs":[[7920,-5914,-5915,-7920]],"properties":{"id":"24662016","dp":15907,"de":4336}},{"type":"Polygon","arcs":[[7921,-5912,-7921,7922]],"properties":{"id":"24662017","dp":20319,"de":6914}},{"type":"Polygon","arcs":[[7923,-7633,-7635,-7636,7924,7925]],"properties":{"id":"24662044","dp":14034,"de":1136}},{"type":"Polygon","arcs":[[7926,-7925,-7637,7927,-6226]],"properties":{"id":"24662045","dp":13248,"de":2760}},{"type":"Polygon","arcs":[[7928,-7926,-7927,-6225,-6228]],"properties":{"id":"24662046","dp":17621,"de":1732}},{"type":"Polygon","arcs":[[7929,7930,-7924,-7929,-6230]],"properties":{"id":"24662047","dp":3978,"de":8507}},{"type":"Polygon","arcs":[[-6233,7931,7932,-7930]],"properties":{"id":"24662048","dp":15337,"de":1993}},{"type":"Polygon","arcs":[[-6235,-6241,7933,-7932,-6232]],"properties":{"id":"24662049","dp":14679,"de":1388}},{"type":"Polygon","arcs":[[7934,-7410,-7646,-7649,-7651]],"properties":{"id":"24662276","dp":2954,"de":0}},{"type":"Polygon","arcs":[[7935,7936,-7406,-7408,-7935,-7650,-3071]],"properties":{"id":"24662277","dp":2330,"de":1011}},{"type":"Polygon","arcs":[[7937,7938,-5449,-7407,-7937]],"properties":{"id":"24662278","dp":6876,"de":720}},{"type":"Polygon","arcs":[[-7936,-3070,7939,7940,-7938]],"properties":{"id":"24662279","dp":13111,"de":0}},{"type":"Polygon","arcs":[[7941,7942,-5450,-7939,-7941,7943]],"properties":{"id":"24662280","dp":2508,"de":224}},{"type":"Polygon","arcs":[[7944,-7944,-7940,-3069,7945]],"properties":{"id":"24662281","dp":1717,"de":148}},{"type":"Polygon","arcs":[[-3068,-5353,7946,7947,-7946]],"properties":{"id":"24662282","dp":4097,"de":0}},{"type":"Polygon","arcs":[[-7948,7948,-7942,-7945]],"properties":{"id":"24662283","dp":3343,"de":0}},{"type":"Polygon","arcs":[[-7943,-7949,-7947,-5352,-6160,-6167,7949,7950,-7403,-5452,-5443,-5446]],"properties":{"id":"24662284","dp":901,"de":2187}},{"type":"Polygon","arcs":[[7951,7952,7953,7954,-7951]],"properties":{"id":"24662285","dp":3759,"de":1181}},{"type":"Polygon","arcs":[[-7953,7955,7956,7957]],"properties":{"id":"24662286","dp":2763,"de":0}},{"type":"Polygon","arcs":[[-7958,7958,7959,-7954]],"properties":{"id":"24662287","dp":3685,"de":332}},{"type":"Polygon","arcs":[[7960,7961,-7959,-7957]],"properties":{"id":"24662288","dp":2965,"de":0}},{"type":"Polygon","arcs":[[-7955,-7960,-7962,7962,-5740,-5460,-5454,-7404]],"properties":{"id":"24662289","dp":856,"de":1771}},{"type":"Polygon","arcs":[[-1313,-1281,-1277,-1271,-1086,7963]],"properties":{"id":"24662114","dp":3221,"de":18847}},{"type":"Polygon","arcs":[[7964,-5911,-7922,7965]],"properties":{"id":"24662018","dp":21736,"de":6052}},{"type":"Polygon","arcs":[[7966,-5909,-7965,7967]],"properties":{"id":"24662019","dp":21354,"de":2343}},{"type":"Polygon","arcs":[[7968,-5907,-7967,7969,7970]],"properties":{"id":"24662020","dp":15658,"de":3202}},{"type":"Polygon","arcs":[[-7970,-7968,-7966,-7923,-7919,7971]],"properties":{"id":"24662021","dp":15519,"de":0}},{"type":"Polygon","arcs":[[7972,-7971,-7972,-7858,-7863,-7868]],"properties":{"id":"24662022","dp":14750,"de":0}},{"type":"Polygon","arcs":[[-7973,-7867,7973,7974,-7612,-5902,7975,-5906,-7969]],"properties":{"id":"24662024","dp":6894,"de":1088}},{"type":"Polygon","arcs":[[-5904,-7976]],"properties":{"id":"24662025","dp":28600,"de":4938}},{"type":"Polygon","arcs":[[-7445,-7449,-7470,-7974,-7866,-6252,-6258,-6274,-6275]],"properties":{"id":"24662026","dp":2804,"de":5234}},{"type":"Polygon","arcs":[[-7975,-7469,7976,7977,-7609,-7610,-7495,-7272,-7613]],"properties":{"id":"24662027","dp":3320,"de":6302}},{"type":"Polygon","arcs":[[-7480,7978,-7977,-7468,-7472,-7474,-7476]],"properties":{"id":"24662028","dp":13774,"de":2903}},{"type":"Polygon","arcs":[[-7490,-7611,-7607,-7978,-7979,-7479]],"properties":{"id":"24662029","dp":17312,"de":5000}},{"type":"Polygon","arcs":[[7979,7980,7981,7982,-5599,-5598,-5593]],"properties":{"id":"24662384","dp":1848,"de":652}},{"type":"Polygon","arcs":[[7983,7984,7985,7986,-7981,7987]],"properties":{"id":"24662385","dp":3341,"de":499}},{"type":"Polygon","arcs":[[7988,-7988,-7980,-5592,7989,7990]],"properties":{"id":"24662386","dp":4512,"de":406}},{"type":"Polygon","arcs":[[7991,7992,7993,-7990,-5596,-5590]],"properties":{"id":"24662387","dp":11225,"de":1092}},{"type":"Polygon","arcs":[[7994,-5943,7995,7996,-7993,7997]],"properties":{"id":"24662388","dp":3059,"de":0}},{"type":"Polygon","arcs":[[-5589,-5585,-5580,7998,7999,-7998,-7992]],"properties":{"id":"24662389","dp":2794,"de":1017}},{"type":"Polygon","arcs":[[8000,8001,-825,-4570,-4567,-4557,-3535]],"properties":{"id":"24662145","dp":2786,"de":2629}},{"type":"Polygon","arcs":[[8002,-8001,8003]],"properties":{"id":"24662147","dp":15989,"de":6951}},{"type":"Polygon","arcs":[[-7790,-7788,8004,8005,-8004,-3534]],"properties":{"id":"24662148","dp":5279,"de":5182}},{"type":"Polygon","arcs":[[8006,-835,-829,8007,-8006]],"properties":{"id":"24662149","dp":9821,"de":10425}},{"type":"Polygon","arcs":[[-8008,-832,-828,-8002,-8003]],"properties":{"id":"24662150","dp":7965,"de":2836}},{"type":"Polygon","arcs":[[-838,-8007,8008]],"properties":{"id":"24662151","dp":14970,"de":22058}},{"type":"Polygon","arcs":[[-7787,8009,-841,-3597,-836,-8009,-8005]],"properties":{"id":"24662152","dp":7012,"de":9674}},{"type":"Polygon","arcs":[[8010,-845,-842,-8010,-7786]],"properties":{"id":"24662153","dp":11924,"de":2405}},{"type":"Polygon","arcs":[[-6251,-7624,8011,-7934]],"properties":{"id":"24662050","dp":12577,"de":2333}},{"type":"Polygon","arcs":[[-8012,-7625,-7630,-7631,-7931,-7933]],"properties":{"id":"24662051","dp":8170,"de":24634}},{"type":"Polygon","arcs":[[-6221,-7928,-7375,8012]],"properties":{"id":"24662052","dp":12256,"de":2850}},{"type":"Polygon","arcs":[[-6222,-8013,-7374,8013]],"properties":{"id":"24662053","dp":16512,"de":1226}},{"type":"Polygon","arcs":[[8014,-8014,-7373,8015]],"properties":{"id":"24662054","dp":8411,"de":9371}},{"type":"Polygon","arcs":[[-8016,-7372,8016,8017]],"properties":{"id":"24662055","dp":18455,"de":2205}},{"type":"Polygon","arcs":[[-8017,-7371,8018,8019]],"properties":{"id":"24662056","dp":17165,"de":2330}},{"type":"Polygon","arcs":[[-8019,-7370,8020]],"properties":{"id":"24662057","dp":11772,"de":0}},{"type":"Polygon","arcs":[[8021,-8020,-8021,-7369,-7891,-364,-382]],"properties":{"id":"24662058","dp":3397,"de":3757}},{"type":"Polygon","arcs":[[-6045,-6048,8022,8023,-379]],"properties":{"id":"24662064","dp":14070,"de":2922}},{"type":"Polygon","arcs":[[-6058,-6219,8024,-8023,-6047,-6049,-6053]],"properties":{"id":"24662065","dp":5720,"de":3625}},{"type":"Polygon","arcs":[[-380,-8024,-8025,-6218,-6223,-8015,-8018,-8022]],"properties":{"id":"24662066","dp":5004,"de":3910}},{"type":"Polygon","arcs":[[-3504,8025,-5402,-5410,-5413,8026,8027,8028]],"properties":{"id":"24662405","dp":4160,"de":2203}},{"type":"Polygon","arcs":[[8029,-3506,8030,8031]],"properties":{"id":"24662408","dp":3040,"de":582}},{"type":"Polygon","arcs":[[-8031,-3505,-8029,8032,8033,8034,8035]],"properties":{"id":"24662409","dp":2358,"de":420}},{"type":"Polygon","arcs":[[-8035,8036,8037]],"properties":{"id":"24662410","dp":3768,"de":0}},{"type":"Polygon","arcs":[[-8037,-8034,8038,8039,8040]],"properties":{"id":"24662411","dp":9136,"de":0}},{"type":"Polygon","arcs":[[-5281,8041,8042,8043,-8040]],"properties":{"id":"24662412","dp":11314,"de":0}},{"type":"Polygon","arcs":[[8044,-8042,-5280,-5276,-5270]],"properties":{"id":"24662413","dp":6083,"de":0}},{"type":"Polygon","arcs":[[8045,8046,-8043,-8045,-5275]],"properties":{"id":"24662414","dp":10353,"de":0}},{"type":"Polygon","arcs":[[8047,-8044,-8047,8048]],"properties":{"id":"24662415","dp":9958,"de":0}},{"type":"Polygon","arcs":[[8049,-8049,-8046,-5274,-5268,-5160,8050]],"properties":{"id":"24662416","dp":8268,"de":0}},{"type":"Polygon","arcs":[[-2700,-2698,-2696,-2694,-2689,-2683,8051,-2707]],"properties":{"id":"24662176","dp":3281,"de":2157}},{"type":"Polygon","arcs":[[8052,-711,-7808]],"properties":{"id":"24662177","dp":10225,"de":0}},{"type":"Polygon","arcs":[[-7807,8053,-4591,8054,-721,-712,-8053]],"properties":{"id":"24662178","dp":10562,"de":672}},{"type":"Polygon","arcs":[[-8055,-4590,-4471,-4468,-726,-722]],"properties":{"id":"24662179","dp":8499,"de":1661}},{"type":"Polygon","arcs":[[-4326,-4600,-4592,-8054,-7806]],"properties":{"id":"24662180","dp":11991,"de":0}},{"type":"Polygon","arcs":[[-7961,-7956,-7952,-7950,-6170,-5741,-7963]],"properties":{"id":"24662290","dp":3018,"de":2519}},{"type":"Polygon","arcs":[[-4701,-4697,8055,-4939,-4938,-4936,-4928,-7301,-4911]],"properties":{"id":"24662642","dp":1972,"de":531}},{"type":"Polygon","arcs":[[-6423,8056,8057,-7317,-8056]],"properties":{"id":"24662643","dp":9678,"de":2506}},{"type":"Polygon","arcs":[[8058,8059,8060,8061,-8057]],"properties":{"id":"24662644","dp":7315,"de":1908}},{"type":"Polygon","arcs":[[-8058,-8062,8062,8063,-7318]],"properties":{"id":"24662645","dp":8890,"de":1239}},{"type":"Polygon","arcs":[[8064,8065,8066,-8063,-8061]],"properties":{"id":"24662646","dp":9131,"de":1595}},{"type":"Polygon","arcs":[[-8067,8067,8068,-7314,-8064]],"properties":{"id":"24662647","dp":5640,"de":15548}},{"type":"Polygon","arcs":[[8069,8070,8071,8072,-8068,-8066,8073]],"properties":{"id":"24662648","dp":5610,"de":2964}},{"type":"Polygon","arcs":[[-5459,-5466,-7816,8074,-5457]],"properties":{"id":"24662346","dp":2142,"de":0}},{"type":"Polygon","arcs":[[-8075,8075,8076,8077,8078,-5433]],"properties":{"id":"24662347","dp":2461,"de":0}},{"type":"Polygon","arcs":[[-7815,8079,8080,8081,-8076]],"properties":{"id":"24662348","dp":3249,"de":0}},{"type":"Polygon","arcs":[[-8080,-7817,-5680,8082,8083]],"properties":{"id":"24662349","dp":3082,"de":0}},{"type":"Polygon","arcs":[[-5674,8084,8085,8086,-8083]],"properties":{"id":"24662350","dp":3205,"de":0}},{"type":"Polygon","arcs":[[-8087,8087]],"properties":{"id":"24662351","dp":3520,"de":0}},{"type":"Polygon","arcs":[[-8081,-8084,-8088,-8086,8088,8089,8090]],"properties":{"id":"24662352","dp":2555,"de":0}},{"type":"Polygon","arcs":[[8091,-8089,-8085,-5677,-5659,-5366,8092]],"properties":{"id":"24662353","dp":4427,"de":724}},{"type":"Polygon","arcs":[[8093,-8090,-8092,8094]],"properties":{"id":"24662354","dp":3846,"de":0}},{"type":"Polygon","arcs":[[8095,-8095,-8093,8096,-8078]],"properties":{"id":"24662355","dp":4972,"de":2426}},{"type":"Polygon","arcs":[[-8077,-8082,-8091,-8094,-8096]],"properties":{"id":"24662356","dp":3809,"de":751}},{"type":"Polygon","arcs":[[-5431,-5434,-8079,-8097,-5365,8097,-5426,-5428]],"properties":{"id":"24662357","dp":3637,"de":1810}},{"type":"Polygon","arcs":[[-5364,-5260,-3497,8098,-8098]],"properties":{"id":"24662358","dp":8724,"de":358}},{"type":"Polygon","arcs":[[-8099,-3502,8099,-5421,-5427]],"properties":{"id":"24662359","dp":6330,"de":0}},{"type":"Polygon","arcs":[[-5369,-5652,8100,-3500]],"properties":{"id":"24662362","dp":3626,"de":0}},{"type":"Polygon","arcs":[[-5422,-8100,-3501,-8101,-5651,8101]],"properties":{"id":"24662363","dp":2313,"de":287}},{"type":"Polygon","arcs":[[-1251,-1314,-7964,-1264,-1258],[8102]],"properties":{"id":"24662115","dp":3939,"de":68855}},{"type":"Polygon","arcs":[[-8103]],"properties":{"id":"24662116","dp":16738,"de":73538}},{"type":"Polygon","arcs":[[8103,8104,8105,-3422,8106,8107]],"properties":{"id":"24662117","dp":2580,"de":0}},{"type":"Polygon","arcs":[[8108,-3423,-8106]],"properties":{"id":"24662118","dp":5803,"de":765}},{"type":"Polygon","arcs":[[-8105,8109,8110,-3424,-8109]],"properties":{"id":"24662119","dp":5864,"de":2286}},{"type":"Polygon","arcs":[[8111,-8110,-8104,8112]],"properties":{"id":"24662120","dp":5859,"de":0}},{"type":"Polygon","arcs":[[-2451,-2455,8113,-8112,8114]],"properties":{"id":"24662121","dp":7174,"de":0}},{"type":"MultiPolygon","arcs":[[[-8114,-2454,8115,-3425,-8111]],[[-2534,-6011,8116]]],"properties":{"id":"24662122","dp":2888,"de":196}},{"type":"Polygon","arcs":[[-2416,-2444,8117,-2447,-8115,-8113,-8108,8118]],"properties":{"id":"24662123","dp":3304,"de":512}},{"type":"Polygon","arcs":[[-2443,-2448,-8118]],"properties":{"id":"24662124","dp":10395,"de":0}},{"type":"Polygon","arcs":[[-3385,-3387,-3026,-2865,-2780,-213,8119]],"properties":{"id":"24662125","dp":15865,"de":2524}},{"type":"Polygon","arcs":[[-8120,-217,-220,-3202]],"properties":{"id":"24662126","dp":13625,"de":5500}},{"type":"Polygon","arcs":[[-2613,-2872,8120,-2601]],"properties":{"id":"24662127","dp":7707,"de":1115}},{"type":"Polygon","arcs":[[-2871,8121,-2592,8122,-8121]],"properties":{"id":"24662128","dp":8406,"de":2363}},{"type":"Polygon","arcs":[[-2602,-8123,-2591]],"properties":{"id":"24662129","dp":13488,"de":3685}},{"type":"Polygon","arcs":[[-7750,-7752,-7755,-7758,-2570,-2574,-2904]],"properties":{"id":"24662130","dp":5549,"de":9287}},{"type":"Polygon","arcs":[[-3609,-5956,8123,8124,-3604]],"properties":{"id":"24662444","dp":7695,"de":1810}},{"type":"Polygon","arcs":[[8125,-8124,-5955,-3510]],"properties":{"id":"24662445","dp":17926,"de":1295}},{"type":"Polygon","arcs":[[-3508,8126,8127]],"properties":{"id":"24662447","dp":12965,"de":0}},{"type":"Polygon","arcs":[[8128,-8126,-3509,-8128,8129,8130,8131]],"properties":{"id":"24662448","dp":22293,"de":0}},{"type":"Polygon","arcs":[[-8127,-3507,8132,-8130]],"properties":{"id":"24662449","dp":12234,"de":0}},{"type":"Polygon","arcs":[[-8131,-8133,-3513,8133,8134]],"properties":{"id":"24662450","dp":17622,"de":0}},{"type":"Polygon","arcs":[[-3512,-5954,8135,-8134]],"properties":{"id":"24662452","dp":27269,"de":0}},{"type":"Polygon","arcs":[[8136,-8136,-5953,8137]],"properties":{"id":"24662453","dp":24170,"de":2849}},{"type":"Polygon","arcs":[[8138,8139,-8138,-5952,-6037,-4358,8140]],"properties":{"id":"24662454","dp":12348,"de":910}},{"type":"Polygon","arcs":[[-8139,8141,8142]],"properties":{"id":"24662455","dp":11007,"de":0}},{"type":"Polygon","arcs":[[-3606,-8132,-8135,-8137,-8140,-8143,8143,-4363,8144]],"properties":{"id":"24662456","dp":7475,"de":1288}},{"type":"Polygon","arcs":[[-8142,-8141,-4357,-4364,-8144]],"properties":{"id":"24662457","dp":9683,"de":0}},{"type":"Polygon","arcs":[[8145,-3607,-8145,-4371,8146]],"properties":{"id":"24662458","dp":2625,"de":905}},{"type":"Polygon","arcs":[[8147,-8147,-4370,-4543,-4551]],"properties":{"id":"24662459","dp":3126,"de":0}},{"type":"Polygon","arcs":[[-7893,-3480]],"properties":{"id":"24661723","dp":14498,"de":1781}},{"type":"Polygon","arcs":[[8148,-852,-846,-8011,-7785,8149]],"properties":{"id":"24662154","dp":8850,"de":2331}},{"type":"Polygon","arcs":[[-2309,8150,8151,8152,8153,-8150,-7784]],"properties":{"id":"24662155","dp":13151,"de":2675}},{"type":"Polygon","arcs":[[8154,-8151,-2308]],"properties":{"id":"24662156","dp":5806,"de":1663}},{"type":"Polygon","arcs":[[8155,8156,-8152,-8155,-2307]],"properties":{"id":"24662157","dp":13811,"de":1647}},{"type":"Polygon","arcs":[[8157,-8156,-2306]],"properties":{"id":"24662158","dp":8404,"de":1033}},{"type":"Polygon","arcs":[[-2305,-987,-8153,-8157,-8158]],"properties":{"id":"24662159","dp":10089,"de":1485}},{"type":"Polygon","arcs":[[-986,8158,-853,-8149,-8154]],"properties":{"id":"24662160","dp":14163,"de":1951}},{"type":"Polygon","arcs":[[-960,-854,-8159]],"properties":{"id":"24662161","dp":14819,"de":2972}},{"type":"Polygon","arcs":[[8159,-7323,-7897,8160,8161,8162,8163,8164]],"properties":{"id":"24662475","dp":2046,"de":813}},{"type":"Polygon","arcs":[[8165,8166,-8163,8167]],"properties":{"id":"24662476","dp":11038,"de":5576}},{"type":"Polygon","arcs":[[8168,-8168,-8162,8169,8170,8171]],"properties":{"id":"24662477","dp":5435,"de":1136}},{"type":"Polygon","arcs":[[-8166,-8169,8172,-3452,8173]],"properties":{"id":"24662478","dp":17293,"de":2125}},{"type":"Polygon","arcs":[[-3453,-8173,-8172,8174]],"properties":{"id":"24662479","dp":3720,"de":3116}},{"type":"Polygon","arcs":[[-8175,-8171,8175,8176,8177,8178,-3454]],"properties":{"id":"24662480","dp":2279,"de":0}},{"type":"Polygon","arcs":[[-3407,8179,8180,8181,-8167,-8174,-3451]],"properties":{"id":"24662483","dp":10054,"de":1432}},{"type":"MultiPolygon","arcs":[[[-2114,8182,-7821,-6012,-1937,8183,-2106,-2110]],[[-4635,8184,-4624]]],"properties":{"id":"24662182","dp":2991,"de":455}},{"type":"Polygon","arcs":[[-1936,-2103,-8184]],"properties":{"id":"24662183","dp":9398,"de":0}},{"type":"Polygon","arcs":[[-5387,-6026,-7820,-7830,-7835,-1792,-1798,-5378,-5382]],"properties":{"id":"24662187","dp":2556,"de":5216}},{"type":"Polygon","arcs":[[-1780,-7838]],"properties":{"id":"24662192","dp":7263,"de":3092}},{"type":"Polygon","arcs":[[8185,8186,-3409,-3459,8187,8188]],"properties":{"id":"24662502","dp":13262,"de":658}},{"type":"Polygon","arcs":[[-3458,8189,-8188]],"properties":{"id":"24662503","dp":24772,"de":1893}},{"type":"Polygon","arcs":[[-8189,-8190,-3457,8190,8191,8192]],"properties":{"id":"24662504","dp":6754,"de":883}},{"type":"Polygon","arcs":[[-8192,8193,8194,8195,8196,8197]],"properties":{"id":"24662505","dp":4035,"de":1491}},{"type":"Polygon","arcs":[[-8191,-3456,8198,-8194]],"properties":{"id":"24662506","dp":4217,"de":1139}},{"type":"Polygon","arcs":[[8199,-8195,-8199,-3455,-8179,8200]],"properties":{"id":"24662507","dp":2845,"de":553}},{"type":"Polygon","arcs":[[8201,-8201,-8178,8202]],"properties":{"id":"24662508","dp":4187,"de":397}},{"type":"Polygon","arcs":[[8203,8204,-8203,8205,8206]],"properties":{"id":"24662509","dp":3635,"de":506}},{"type":"Polygon","arcs":[[8207,8208,-8207,8209]],"properties":{"id":"24662510","dp":5852,"de":0}},{"type":"Polygon","arcs":[[-8208,8210,8211]],"properties":{"id":"24662511","dp":10196,"de":0}},{"type":"Polygon","arcs":[[-3518,8212,8213,-8211,-8210,-8206,-8177,8214]],"properties":{"id":"24662512","dp":3717,"de":471}},{"type":"Polygon","arcs":[[8215,8216,-8213,-3517,8217]],"properties":{"id":"24662513","dp":6741,"de":561}},{"type":"Polygon","arcs":[[8218,8219,8220,-8218,-3516,8221]],"properties":{"id":"24662515","dp":5264,"de":1064}},{"type":"Polygon","arcs":[[8222,-8222,-3515,8223]],"properties":{"id":"24662516","dp":12660,"de":0}},{"type":"Polygon","arcs":[[8224,-5423,-8102,8225,-5927]],"properties":{"id":"24662364","dp":3878,"de":0}},{"type":"Polygon","arcs":[[-5928,-8226,-5654,-4941,-5932]],"properties":{"id":"24662365","dp":3614,"de":533}},{"type":"Polygon","arcs":[[-6690,-6692,-6683,8226,-3577,-7726]],"properties":{"id":"24662762","dp":1961,"de":5063}},{"type":"Polygon","arcs":[[-6680,8227,8228,-3578,-8227]],"properties":{"id":"24662763","dp":3052,"de":2800}},{"type":"Polygon","arcs":[[-6678,8229,8230,8231,-8228,-6679]],"properties":{"id":"24662764","dp":13112,"de":0}},{"type":"Polygon","arcs":[[8232,8233,8234,-6894,-3579,-8229,-8232]],"properties":{"id":"24662765","dp":3211,"de":601}},{"type":"Polygon","arcs":[[-8235,8235,8236,-6890]],"properties":{"id":"24662766","dp":21261,"de":0}},{"type":"Polygon","arcs":[[8237,8238,-8236,-8234]],"properties":{"id":"24662767","dp":21181,"de":0}},{"type":"Polygon","arcs":[[8239,8240,8241,-8238,-8233,-8231]],"properties":{"id":"24662768","dp":20216,"de":0}},{"type":"Polygon","arcs":[[8242,-3488,-3757,-3754,-3750]],"properties":{"id":"24661725","dp":2004,"de":984}},{"type":"Polygon","arcs":[[-3486,8243]],"properties":{"id":"24661726","dp":5105,"de":645}},{"type":"Polygon","arcs":[[-3487,-8244,-3485,-3953,-3758]],"properties":{"id":"24661727","dp":374,"de":2802}},{"type":"Polygon","arcs":[[-2344,-1774,8244,-6109,8245,8246,8247,8248,8249,8250,8251,-2334,-2335]],"properties":{"id":"24662218","dp":2745,"de":251}},{"type":"Polygon","arcs":[[8252,8253,-2331,-8252]],"properties":{"id":"24662219","dp":3553,"de":1027}},{"type":"Polygon","arcs":[[-8251,8254,8255,-8253]],"properties":{"id":"24662220","dp":7736,"de":2389}},{"type":"Polygon","arcs":[[8256,-8255,-8250,8257,8258]],"properties":{"id":"24662221","dp":3659,"de":615}},{"type":"Polygon","arcs":[[-8258,-8249,8259]],"properties":{"id":"24662222","dp":3714,"de":314}},{"type":"Polygon","arcs":[[-8259,-8260,-8248,8260,8261]],"properties":{"id":"24662223","dp":3242,"de":340}},{"type":"Polygon","arcs":[[-8261,-8247,8262,8263,8264]],"properties":{"id":"24662224","dp":3237,"de":0}},{"type":"Polygon","arcs":[[8265,-8262,-8265,8266,8267,8268]],"properties":{"id":"24662225","dp":3984,"de":580}},{"type":"Polygon","arcs":[[8269,-8269,8270]],"properties":{"id":"24662226","dp":2941,"de":514}},{"type":"Polygon","arcs":[[8271,8272,-8270,8273]],"properties":{"id":"24662227","dp":3996,"de":375}},{"type":"Polygon","arcs":[[-3548,8274,8275,-8274,-8271,-8268,8276,8277,-2034]],"properties":{"id":"24662228","dp":2285,"de":420}},{"type":"Polygon","arcs":[[-2332,-8254,8278,-8272,-8276,8279,-2329]],"properties":{"id":"24662229","dp":2847,"de":0}},{"type":"Polygon","arcs":[[-8256,-8257,-8266,-8273,-8279]],"properties":{"id":"24662230","dp":4047,"de":288}},{"type":"Polygon","arcs":[[-8280,-8275,-3547,-2330]],"properties":{"id":"24662231","dp":4144,"de":0}},{"type":"Polygon","arcs":[[8280,-8277,-8267,-8264]],"properties":{"id":"24662232","dp":8497,"de":0}},{"type":"Polygon","arcs":[[8281,8282,8283,8284,8285,-6378,-6385,-1528,-8278,-8281]],"properties":{"id":"24662233","dp":3857,"de":2193}},{"type":"Polygon","arcs":[[-5939,-4953,8286,-7996,-5942]],"properties":{"id":"24662371","dp":3734,"de":345}},{"type":"Polygon","arcs":[[8287,-8074,-8065,-8060]],"properties":{"id":"24662649","dp":14951,"de":4206}},{"type":"Polygon","arcs":[[8288,8289,-8288,8290]],"properties":{"id":"24662650","dp":6849,"de":940}},{"type":"Polygon","arcs":[[-6420,8291,-8291,-8059,-6422]],"properties":{"id":"24662651","dp":12148,"de":5177}},{"type":"Polygon","arcs":[[-6419,-6416,8292,8293,-8289,-8292]],"properties":{"id":"24662652","dp":6103,"de":878}},{"type":"Polygon","arcs":[[-8294,8294,8295,8296]],"properties":{"id":"24662653","dp":13477,"de":2954}},{"type":"Polygon","arcs":[[8297,8298,8299,-8295,-8293,-6415]],"properties":{"id":"24662654","dp":6030,"de":2576}},{"type":"Polygon","arcs":[[-8300,8300,8301,8302,-8296]],"properties":{"id":"24662655","dp":13144,"de":1417}},{"type":"Polygon","arcs":[[8303,8304,-8301,-8299]],"properties":{"id":"24662656","dp":12317,"de":0}},{"type":"Polygon","arcs":[[8305,8306,8307,-8302,-8305]],"properties":{"id":"24662657","dp":8948,"de":1091}},{"type":"Polygon","arcs":[[8308,8309,-6198,8310,8311,8312,-8307]],"properties":{"id":"24662658","dp":5459,"de":5550}},{"type":"Polygon","arcs":[[-8312,8313,8314]],"properties":{"id":"24662659","dp":18298,"de":1030}},{"type":"Polygon","arcs":[[-8297,-8303,-8308,-8313,-8315,8315,-8070,-8290]],"properties":{"id":"24662660","dp":3396,"de":3403}},{"type":"Polygon","arcs":[[-8316,8316,8317,8318,-8071]],"properties":{"id":"24662661","dp":6433,"de":1689}},{"type":"Polygon","arcs":[[-7997,-8287,-4952,-5640,-5636,8319,-7991,-7994]],"properties":{"id":"24662372","dp":3937,"de":493}},{"type":"Polygon","arcs":[[-5635,8320,-8320]],"properties":{"id":"24662373","dp":5025,"de":0}},{"type":"Polygon","arcs":[[-5629,8321,-7989,-8321]],"properties":{"id":"24662374","dp":3065,"de":963}},{"type":"Polygon","arcs":[[-5628,8322,8323,8324,-7984,-8322]],"properties":{"id":"24662375","dp":4733,"de":658}},{"type":"Polygon","arcs":[[-5623,-5614,8325,-8323,-5627]],"properties":{"id":"24662376","dp":2997,"de":581}},{"type":"Polygon","arcs":[[8326,-8324,-8326,-5613,-5606,8327]],"properties":{"id":"24662377","dp":3448,"de":446}},{"type":"Polygon","arcs":[[-7985,-8325,-8327,8328,8329]],"properties":{"id":"24662378","dp":3647,"de":0}},{"type":"Polygon","arcs":[[8330,-8329,-8328,-5612,8331]],"properties":{"id":"24662379","dp":3241,"de":0}},{"type":"Polygon","arcs":[[-7986,-8330,-8331,8332,8333]],"properties":{"id":"24662380","dp":3099,"de":0}},{"type":"Polygon","arcs":[[8334,8335,-8333,-8332,-5611,-5603]],"properties":{"id":"24662381","dp":4255,"de":0}},{"type":"Polygon","arcs":[[-7987,-8334,-8336,8336,-7982]],"properties":{"id":"24662382","dp":3573,"de":0}},{"type":"Polygon","arcs":[[-8335,-5602,-5600,-7983,-8337]],"properties":{"id":"24662383","dp":3995,"de":490}},{"type":"Polygon","arcs":[[8337,8338,8339,8340]],"properties":{"id":"24662795","dp":6055,"de":628}},{"type":"Polygon","arcs":[[8341,8342,-8341,8343,-6849]],"properties":{"id":"24662796","dp":5903,"de":2245}},{"type":"Polygon","arcs":[[8344,-8342,8345]],"properties":{"id":"24662797","dp":12400,"de":1473}},{"type":"Polygon","arcs":[[-6513,8346,-6507,-8338,-8343,-8345,8347,-6518]],"properties":{"id":"24662798","dp":7111,"de":1268}},{"type":"Polygon","arcs":[[-6512,-6502,-8347]],"properties":{"id":"24662799","dp":7366,"de":0}},{"type":"Polygon","arcs":[[-6519,-8348,-8346,-6848,8348,-6852]],"properties":{"id":"24662800","dp":6167,"de":623}},{"type":"Polygon","arcs":[[-8349,-6846,-6853]],"properties":{"id":"24662801","dp":10099,"de":2871}},{"type":"Polygon","arcs":[[-3611,8349,-3601,-8146,-8148,-4550]],"properties":{"id":"24662460","dp":3895,"de":1150}},{"type":"Polygon","arcs":[[-5935,-5941,-5944,-7995,-8000,8350,8351]],"properties":{"id":"24662390","dp":2804,"de":400}},{"type":"Polygon","arcs":[[-5304,-5302,8352,8353,-8351,-7999,-5579]],"properties":{"id":"24662391","dp":4464,"de":876}},{"type":"Polygon","arcs":[[-5287,8354,8355,8356,-8353,-5301,-5289]],"properties":{"id":"24662392","dp":5260,"de":660}},{"type":"Polygon","arcs":[[8357,8358,8359,-8356]],"properties":{"id":"24662393","dp":3702,"de":0}},{"type":"Polygon","arcs":[[8360,8361,-8358,-8355,-5286,8362]],"properties":{"id":"24662394","dp":4310,"de":282}},{"type":"Polygon","arcs":[[-5930,-5937,8363,-8359,-8362,8364]],"properties":{"id":"24662395","dp":3556,"de":466}},{"type":"Polygon","arcs":[[-5936,-8352,-8354,-8357,-8360,-8364]],"properties":{"id":"24662396","dp":3551,"de":0}},{"type":"Polygon","arcs":[[-5407,-5419,-5424,-8225,-5931,-8365,-8361,8365]],"properties":{"id":"24662397","dp":1083,"de":645}},{"type":"Polygon","arcs":[[-8366,-8363,8366,8367,-5408]],"properties":{"id":"24662398","dp":3300,"de":828}},{"type":"Polygon","arcs":[[-8367,-5285,8368,8369]],"properties":{"id":"24662399","dp":5645,"de":931}},{"type":"Polygon","arcs":[[-8368,-8370,8370,8371,8372,8373,-5411]],"properties":{"id":"24662400","dp":5122,"de":1226}},{"type":"Polygon","arcs":[[-8371,-8369,-5284,-5278,-5283,8374,8375]],"properties":{"id":"24662401","dp":3008,"de":531}},{"type":"Polygon","arcs":[[-8372,-8376,8376]],"properties":{"id":"24662402","dp":9081,"de":0}},{"type":"Polygon","arcs":[[-8028,8377,-8373,-8377,-8375,-5282,-8039,-8033]],"properties":{"id":"24662403","dp":6617,"de":0}},{"type":"Polygon","arcs":[[-5412,-8374,-8378,-8027]],"properties":{"id":"24662404","dp":9221,"de":0}},{"type":"Polygon","arcs":[[-3582,-6946,-6898,8378]],"properties":{"id":"24662822","dp":3355,"de":0}},{"type":"Polygon","arcs":[[-8379,-6897,-882,8379]],"properties":{"id":"24662823","dp":4159,"de":0}},{"type":"Polygon","arcs":[[-3583,-8380,-881,8380,-6943,-6945]],"properties":{"id":"24662824","dp":5738,"de":0}},{"type":"Polygon","arcs":[[-6937,-6944,-8381,-880,8381]],"properties":{"id":"24662825","dp":4732,"de":0}},{"type":"Polygon","arcs":[[-6938,-8382,-884,8382]],"properties":{"id":"24662826","dp":9033,"de":0}},{"type":"Polygon","arcs":[[-8383,-879,8383,-6939]],"properties":{"id":"24662827","dp":8535,"de":656}},{"type":"Polygon","arcs":[[-8384,-875,8384,-6941]],"properties":{"id":"24662828","dp":4735,"de":0}},{"type":"Polygon","arcs":[[-8385,-874,-869,-6748,-6749,-6752]],"properties":{"id":"24662829","dp":6797,"de":0}},{"type":"Polygon","arcs":[[8385,8386,-8051,-5159]],"properties":{"id":"24662417","dp":9238,"de":538}},{"type":"Polygon","arcs":[[-5155,8387,-5158,-3444]],"properties":{"id":"24662418","dp":8750,"de":0}},{"type":"Polygon","arcs":[[8388,-8386,-8388,-5154,-5975]],"properties":{"id":"24662419","dp":6129,"de":0}},{"type":"Polygon","arcs":[[-8032,-8036,-8038,-8041,-8048,-8050,-8387,-8389,-5974,8389]],"properties":{"id":"24662420","dp":539,"de":159}},{"type":"Polygon","arcs":[[-5957,-1531,-1526,-1524,-1520,-1519,-1513,8390,-5403,-8026,-3503,-8030,-8390,-5973]],"properties":{"id":"24662421","dp":93,"de":1414}},{"type":"Polygon","arcs":[[-1512,8391,8392,-6588,-6582,-6587,-6591,-5392,-8391]],"properties":{"id":"24662422","dp":1808,"de":351}},{"type":"Polygon","arcs":[[8393,-6589,-8393]],"properties":{"id":"24662423","dp":2362,"de":0}},{"type":"Polygon","arcs":[[-6574,-6580,-6590,-8394,-8392,-1511,-1504]],"properties":{"id":"24662424","dp":2937,"de":0}},{"type":"Polygon","arcs":[[-1932,-7717,-3522,-1610,-1615,-1617,-1619,-1622,-1627,-6930,8394,8395,-7094,-7101,-1404,-1410,-1423]],"properties":{"id":"24662849","dp":137,"de":2719}},{"type":"Polygon","arcs":[[8396,-8395,-6929,-6921,-6761,-6758,8397]],"properties":{"id":"24662850","dp":1660,"de":2564}},{"type":"Polygon","arcs":[[8398,-8398,-2084,8399,8400,8401]],"properties":{"id":"24662851","dp":6271,"de":2103}},{"type":"Polygon","arcs":[[-8400,-2087,-2090,8402,8403]],"properties":{"id":"24662852","dp":7329,"de":1475}},{"type":"Polygon","arcs":[[-8404,8404,8405,-8401]],"properties":{"id":"24662853","dp":8669,"de":0}},{"type":"Polygon","arcs":[[8406,-8405,-8403,-2093,8407,8408]],"properties":{"id":"24662854","dp":7892,"de":0}},{"type":"Polygon","arcs":[[-8402,-8406,-8407,8409,8410]],"properties":{"id":"24662855","dp":8326,"de":0}},{"type":"Polygon","arcs":[[8411,-8410,-8409,8412,-6711]],"properties":{"id":"24662856","dp":5615,"de":0}},{"type":"Polygon","arcs":[[-8408,-6723,-6712,-8413]],"properties":{"id":"24662857","dp":6407,"de":1388}},{"type":"Polygon","arcs":[[-8314,-8311,-6197,8413,-8317]],"properties":{"id":"24662662","dp":7637,"de":1026}},{"type":"Polygon","arcs":[[-8318,-8414,-6196,-6494,8414]],"properties":{"id":"24662663","dp":11495,"de":0}},{"type":"Polygon","arcs":[[-8319,-8415,-6493,8415,8416,-8072]],"properties":{"id":"24662664","dp":9173,"de":0}},{"type":"Polygon","arcs":[[-8416,-6495,8417,8418]],"properties":{"id":"24662665","dp":10692,"de":1207}},{"type":"Polygon","arcs":[[-8073,-8417,-8419,8419,-7315,-8069]],"properties":{"id":"24662666","dp":6614,"de":1566}},{"type":"Polygon","arcs":[[-8420,8420,8421,-7310,-7313]],"properties":{"id":"24662667","dp":7802,"de":1121}},{"type":"Polygon","arcs":[[-8418,-6287,8422,8423,-8421]],"properties":{"id":"24662668","dp":8275,"de":1793}},{"type":"Polygon","arcs":[[-7311,-8422,-8424,8424,-6285,-6294,-6301]],"properties":{"id":"24662669","dp":8402,"de":1341}},{"type":"Polygon","arcs":[[-6286,-8425,-8423]],"properties":{"id":"24662670","dp":7604,"de":0}},{"type":"Polygon","arcs":[[-6335,-6330,8425,8426,-5697]],"properties":{"id":"24663047","dp":2602,"de":2169}},{"type":"Polygon","arcs":[[-5694,-5698,-8427,8427,8428]],"properties":{"id":"24663048","dp":3553,"de":419}},{"type":"Polygon","arcs":[[-6843,-6837,-5663,-5695,-8429,8429]],"properties":{"id":"24663049","dp":4050,"de":746}},{"type":"Polygon","arcs":[[8430,8431,8432,-8241]],"properties":{"id":"24662769","dp":25506,"de":0}},{"type":"Polygon","arcs":[[8433,-8432,8434,8435]],"properties":{"id":"24662770","dp":21375,"de":0}},{"type":"Polygon","arcs":[[8436,-8436,8437,8438]],"properties":{"id":"24662771","dp":20604,"de":0}},{"type":"Polygon","arcs":[[-6671,-8438,-8435,-8431,-8240,-8230,-6677]],"properties":{"id":"24662772","dp":16165,"de":0}},{"type":"Polygon","arcs":[[-8437,8439,8440,-8237,-8239,-8242,-8433,-8434]],"properties":{"id":"24662773","dp":23203,"de":0}},{"type":"Polygon","arcs":[[8441,8442,8443,8444,8445,-6891,-8441]],"properties":{"id":"24662774","dp":23203,"de":0}},{"type":"Polygon","arcs":[[8446,-6886,-6892,-8446]],"properties":{"id":"24662775","dp":10721,"de":0}},{"type":"Polygon","arcs":[[-8445,8447,-6887,-8447]],"properties":{"id":"24662776","dp":19648,"de":0}},{"type":"Polygon","arcs":[[-8444,8448,-6888,-8448]],"properties":{"id":"24662777","dp":17637,"de":0}},{"type":"Polygon","arcs":[[8449,-6889,-8449,-8443]],"properties":{"id":"24662778","dp":17371,"de":1359}},{"type":"Polygon","arcs":[[-8450,-8442,8450,8451,8452,-6884]],"properties":{"id":"24662779","dp":16058,"de":0}},{"type":"Polygon","arcs":[[8453,8454,-8452]],"properties":{"id":"24662780","dp":11947,"de":0}},{"type":"Polygon","arcs":[[-8453,-8455,8455,-6871,-6874,-6881]],"properties":{"id":"24662781","dp":16317,"de":0}},{"type":"Polygon","arcs":[[-8454,-8451,-8440,-8439,-6670,-6668,-7723,8456,8457,-8456]],"properties":{"id":"24662782","dp":4226,"de":2476}},{"type":"Polygon","arcs":[[8458,-6867,-6868,-8458]],"properties":{"id":"24662783","dp":6920,"de":1739}},{"type":"Polygon","arcs":[[-7722,-7720,8459,8460,-8459,-8457]],"properties":{"id":"24662784","dp":6180,"de":431}},{"type":"Polygon","arcs":[[-8461,8461,8462,-6862,-6865]],"properties":{"id":"24662785","dp":6323,"de":0}},{"type":"Polygon","arcs":[[-7719,8463,8464,8465,-8462,-8460]],"properties":{"id":"24662786","dp":3458,"de":468}},{"type":"Polygon","arcs":[[-3610,-3602,-8350]],"properties":{"id":"24662461","dp":4240,"de":0}},{"type":"Polygon","arcs":[[-8125,-8129,-3605]],"properties":{"id":"24662463","dp":11983,"de":0}},{"type":"Polygon","arcs":[[-5967,8466,8467,-6032]],"properties":{"id":"24662465","dp":5102,"de":759}},{"type":"Polygon","arcs":[[-5966,-5979,-7329,8468,8469,-8467]],"properties":{"id":"24662466","dp":4620,"de":338}},{"type":"Polygon","arcs":[[8470,8471,-8469,-7328,-7325,8472]],"properties":{"id":"24662467","dp":2391,"de":0}},{"type":"Polygon","arcs":[[8473,-8471,8474,8475,8476,8477,8478]],"properties":{"id":"24662468","dp":4822,"de":559}},{"type":"Polygon","arcs":[[-8473,8479,-8475]],"properties":{"id":"24662469","dp":3556,"de":564}},{"type":"Polygon","arcs":[[8480,-8480,-7324,-8160,8481,8482]],"properties":{"id":"24662470","dp":3623,"de":279}},{"type":"Polygon","arcs":[[8483,-8476,-8481,8484]],"properties":{"id":"24662471","dp":7373,"de":0}},{"type":"Polygon","arcs":[[8485,-8485,-8483,8486]],"properties":{"id":"24662472","dp":5387,"de":0}},{"type":"Polygon","arcs":[[8487,-8484,-8486,8488]],"properties":{"id":"24662473","dp":12297,"de":0}},{"type":"Polygon","arcs":[[8489,-8489,-8487,-8482,-8165,8490]],"properties":{"id":"24662474","dp":4198,"de":270}},{"type":"Polygon","arcs":[[-6810,8491,-912,-910,-6832,-6827,-6822]],"properties":{"id":"24662897","dp":3813,"de":123}},{"type":"Polygon","arcs":[[8492,-913,-8492,-6809]],"properties":{"id":"24662898","dp":4568,"de":568}},{"type":"Polygon","arcs":[[8493,-907,-8493,-6808,8494]],"properties":{"id":"24662899","dp":2107,"de":1585}},{"type":"Polygon","arcs":[[8495,8496,-902,-904,-8494]],"properties":{"id":"24662900","dp":4924,"de":665}},{"type":"Polygon","arcs":[[-8497,8497,-6731,8498,-897,-903]],"properties":{"id":"24662901","dp":2928,"de":1075}},{"type":"Polygon","arcs":[[-898,-8499,-6735,-887,-893]],"properties":{"id":"24662902","dp":2286,"de":710}},{"type":"Polygon","arcs":[[-7096,8499,-6717,-6722,-8498,-8496,-8495,-6807]],"properties":{"id":"24662903","dp":521,"de":1841}},{"type":"Polygon","arcs":[[-8396,-8397,-8399,-8411,-8412,-6715,-6718,-8500,-7095]],"properties":{"id":"24662904","dp":812,"de":707}},{"type":"Polygon","arcs":[[8500,-8284]],"properties":{"id":"24662234","dp":14190,"de":0}},{"type":"Polygon","arcs":[[8501,-8285,-8501,-8283]],"properties":{"id":"24662235","dp":16380,"de":3095}},{"type":"Polygon","arcs":[[8502,-8181,8503]],"properties":{"id":"24662484","dp":19962,"de":1492}},{"type":"Polygon","arcs":[[8504,8505,-8491,-8164,-8182,-8503,8506,-3405]],"properties":{"id":"24662485","dp":5838,"de":1651}},{"type":"Polygon","arcs":[[-8507,-8504,-8180,-3406]],"properties":{"id":"24662486","dp":14878,"de":0}},{"type":"Polygon","arcs":[[-8187,8507,-3410]],"properties":{"id":"24662489","dp":9876,"de":2160}},{"type":"Polygon","arcs":[[8508,-8508,8509,-4335]],"properties":{"id":"24662490","dp":19199,"de":0}},{"type":"Polygon","arcs":[[-8509,8510,-3411]],"properties":{"id":"24662491","dp":34928,"de":0}},{"type":"Polygon","arcs":[[-3402,-8511,-4334,-5997,8511]],"properties":{"id":"24662492","dp":12140,"de":0}},{"type":"Polygon","arcs":[[8512,-8470,-8472,-8474,8513,8514,8515,8516,-3403,-8512,-5996,-6034]],"properties":{"id":"24662493","dp":1490,"de":1459}},{"type":"Polygon","arcs":[[-8468,-8513,-6033]],"properties":{"id":"24662494","dp":4528,"de":1570}},{"type":"Polygon","arcs":[[-8514,-8479,8517,8518]],"properties":{"id":"24662495","dp":9017,"de":0}},{"type":"Polygon","arcs":[[-8478,8519,8520,-8518]],"properties":{"id":"24662496","dp":8538,"de":0}},{"type":"Polygon","arcs":[[-8515,-8519,-8521,8521,8522]],"properties":{"id":"24662497","dp":7138,"de":0}},{"type":"Polygon","arcs":[[-8522,-8520,-8477,-8488,8523]],"properties":{"id":"24662498","dp":6698,"de":0}},{"type":"Polygon","arcs":[[8524,-8516,-8523,-8524,-8490,-8506]],"properties":{"id":"24662499","dp":2859,"de":0}},{"type":"Polygon","arcs":[[-8517,-8525,-8505,-3404]],"properties":{"id":"24662500","dp":5176,"de":1158}},{"type":"Polygon","arcs":[[-8510,-8186,8525,-4336]],"properties":{"id":"24662501","dp":7973,"de":460}},{"type":"Polygon","arcs":[[8526,8527,8528,8529,-1144,-7120,-7121]],"properties":{"id":"24662919","dp":3474,"de":1285}},{"type":"Polygon","arcs":[[8530,-8527,-7122,-7116,-7107]],"properties":{"id":"24662920","dp":5565,"de":1180}},{"type":"Polygon","arcs":[[-6997,8531,-8528,-8531,-7106,-7097,-6805,8532,-7144,-7142]],"properties":{"id":"24662921","dp":173,"de":1649}},{"type":"Polygon","arcs":[[-8529,-8532,-7001,8533,8534,8535]],"properties":{"id":"24662922","dp":6053,"de":1490}},{"type":"Polygon","arcs":[[-8530,-8536,8536,-1145]],"properties":{"id":"24662923","dp":3874,"de":0}},{"type":"Polygon","arcs":[[-8537,-8535,8537,-1146]],"properties":{"id":"24662924","dp":10460,"de":0}},{"type":"Polygon","arcs":[[-8534,8538,-1151,-1147,-8538]],"properties":{"id":"24662925","dp":8115,"de":687}},{"type":"Polygon","arcs":[[-8539,-7000,8539,-3789]],"properties":{"id":"24662926","dp":10821,"de":0}},{"type":"Polygon","arcs":[[-6999,-6996,-3782,-8540]],"properties":{"id":"24662927","dp":7975,"de":0}},{"type":"Polygon","arcs":[[8540,8541,8542,-3520,8543,-2349,8544,8545,8546,8547]],"properties":{"id":"24662518","dp":3065,"de":950}},{"type":"Polygon","arcs":[[-2386,-2397,8548,-3514,-8543,8549,8550,-2388]],"properties":{"id":"24662519","dp":1466,"de":1851}},{"type":"Polygon","arcs":[[-8550,-8542,8551]],"properties":{"id":"24662520","dp":6465,"de":0}},{"type":"Polygon","arcs":[[-8551,-8552,-8541,8552,-2373,-2389]],"properties":{"id":"24662521","dp":6449,"de":464}},{"type":"Polygon","arcs":[[-8553,-8548,8553,-2374]],"properties":{"id":"24662522","dp":7862,"de":703}},{"type":"Polygon","arcs":[[-8554,-8547,8554,-2375]],"properties":{"id":"24662523","dp":9225,"de":1320}},{"type":"Polygon","arcs":[[-8555,-8546,8555,-2369]],"properties":{"id":"24662524","dp":9885,"de":1575}},{"type":"Polygon","arcs":[[-8556,-8545,-2348,8556,-2366]],"properties":{"id":"24662525","dp":5619,"de":1733}},{"type":"Polygon","arcs":[[-8557,-2347,8557,-2359]],"properties":{"id":"24662526","dp":7254,"de":751}},{"type":"Polygon","arcs":[[-8558,-2346,-2360]],"properties":{"id":"24662527","dp":8389,"de":4424}},{"type":"Polygon","arcs":[[-7147,-7145,-8533,-6821,8558,8559,8560,-6815,-6829,-6831,8561,-1139,-1128]],"properties":{"id":"24662936","dp":292,"de":277}},{"type":"Polygon","arcs":[[-6820,8562,-8559]],"properties":{"id":"24662937","dp":3045,"de":0}},{"type":"Polygon","arcs":[[8563,8564,-8560,-8563,-6819]],"properties":{"id":"24662938","dp":626,"de":553}},{"type":"Polygon","arcs":[[-6818,8565,-6816,8566,-8564]],"properties":{"id":"24662939","dp":4716,"de":212}},{"type":"Polygon","arcs":[[-8561,-8565,-8567]],"properties":{"id":"24662940","dp":7082,"de":0}},{"type":"Polygon","arcs":[[-6817,-8566]],"properties":{"id":"24662941","dp":8629,"de":0}},{"type":"Polygon","arcs":[[-6647,8567,-8464,-7718,-6652]],"properties":{"id":"24662787","dp":10380,"de":0}},{"type":"Polygon","arcs":[[8568,-8465,-8568,-6646]],"properties":{"id":"24662788","dp":7279,"de":0}},{"type":"Polygon","arcs":[[-8569,-6645,-6642,-6630,8569,8570,8571,-6863,-8463,-8466]],"properties":{"id":"24662789","dp":3669,"de":1229}},{"type":"Polygon","arcs":[[-6625,-6850,-8344,8572,-8570,-6627]],"properties":{"id":"24662790","dp":4535,"de":608}},{"type":"Polygon","arcs":[[-8340,8573,8574,-8571,-8573]],"properties":{"id":"24662791","dp":7766,"de":431}},{"type":"Polygon","arcs":[[-8575,8575,8576,-8572]],"properties":{"id":"24662792","dp":7101,"de":0}},{"type":"Polygon","arcs":[[8577,-6855,-6864,-8577]],"properties":{"id":"24662793","dp":8053,"de":0}},{"type":"Polygon","arcs":[[-8574,-8339,-6506,8578,-6856,-8578,-8576]],"properties":{"id":"24662794","dp":4649,"de":521}},{"type":"Polygon","arcs":[[-7249,-5125,8579,8580]],"properties":{"id":"24661448","dp":19959,"de":1829}},{"type":"Polygon","arcs":[[-7250,-8581,8581,-7257]],"properties":{"id":"24661449","dp":16301,"de":2397}},{"type":"Polygon","arcs":[[-8582,8582,-7189,-7703]],"properties":{"id":"24661450","dp":14756,"de":2951}},{"type":"Polygon","arcs":[[-8580,8583,-7187,-8583]],"properties":{"id":"24661451","dp":16106,"de":2663}},{"type":"Polygon","arcs":[[8584,-7185,-8584,-5124]],"properties":{"id":"24661452","dp":12818,"de":5369}},{"type":"Polygon","arcs":[[8585,-7186,-8585,-5123,-5121]],"properties":{"id":"24661453","dp":11920,"de":6989}},{"type":"Polygon","arcs":[[8586,-7079,-8586,-5117,-7736]],"properties":{"id":"24661454","dp":11504,"de":7619}},{"type":"Polygon","arcs":[[-7075,-8587,-7735,8587]],"properties":{"id":"24661455","dp":12901,"de":4948}},{"type":"Polygon","arcs":[[-7055,-7067,-7069,-8588,-7733]],"properties":{"id":"24661456","dp":13718,"de":5895}},{"type":"Polygon","arcs":[[-8246,-6112,8588,-6367,-6376,-8286,-8502,-8282,-8263]],"properties":{"id":"24662236","dp":1511,"de":4086}},{"type":"Polygon","arcs":[[-6111,8589,-6108,-6368,-8589]],"properties":{"id":"24662237","dp":3294,"de":422}},{"type":"Polygon","arcs":[[-1098,8590,-1118,-1116]],"properties":{"id":"24662556","dp":11476,"de":0}},{"type":"Polygon","arcs":[[8591,8592,-8205,8593,8594,-1119,-8591,-1097]],"properties":{"id":"24662557","dp":4123,"de":3292}},{"type":"Polygon","arcs":[[8595,-8595,8596,8597]],"properties":{"id":"24662558","dp":8326,"de":0}},{"type":"Polygon","arcs":[[-8598,8598,8599,8600]],"properties":{"id":"24662559","dp":5288,"de":613}},{"type":"Polygon","arcs":[[8601,-8214,-8217,-8599]],"properties":{"id":"24662560","dp":12432,"de":720}},{"type":"Polygon","arcs":[[-8204,-8209,-8212,-8602,-8597,-8594]],"properties":{"id":"24662561","dp":9287,"de":2833}},{"type":"Polygon","arcs":[[-8600,-8216,-8221,8602]],"properties":{"id":"24662562","dp":8028,"de":976}},{"type":"Polygon","arcs":[[-2402,8603,-8603,-8220,8604]],"properties":{"id":"24662563","dp":8239,"de":4731}},{"type":"Polygon","arcs":[[-1120,-8596,-8601,-8604,-2406]],"properties":{"id":"24662564","dp":4582,"de":474}},{"type":"Polygon","arcs":[[-2395,-2403,-8605,-8219,-8223,8605]],"properties":{"id":"24662565","dp":3355,"de":610}},{"type":"Polygon","arcs":[[-2396,-8606,-8224,-8549]],"properties":{"id":"24662566","dp":3272,"de":0}},{"type":"Polygon","arcs":[[-8196,-8200,-8202,-8593,8606]],"properties":{"id":"24662567","dp":3434,"de":622}},{"type":"Polygon","arcs":[[8607,-8197,-8607,-8592,8608]],"properties":{"id":"24662568","dp":3493,"de":565}},{"type":"Polygon","arcs":[[-4328,8609,-8198,-8608,8610]],"properties":{"id":"24662569","dp":6037,"de":1204}},{"type":"Polygon","arcs":[[-3970,-3979,-4329,-8611,-8609,-1107,-5783]],"properties":{"id":"24662570","dp":2161,"de":753}},{"type":"Polygon","arcs":[[-4337,-8526,-8193,-8610,-4332]],"properties":{"id":"24662571","dp":8681,"de":0}},{"type":"Polygon","arcs":[[-2356,8611,-7289]],"properties":{"id":"24662572","dp":9447,"de":1142}},{"type":"Polygon","arcs":[[-8612,-2352,8612,8613,-7290]],"properties":{"id":"24662573","dp":9425,"de":2156}},{"type":"Polygon","arcs":[[-8614,8614,8615,8616]],"properties":{"id":"24662574","dp":7817,"de":7025}},{"type":"Polygon","arcs":[[8617,8618,-8615,-8613,-2351,8619,-8309,-8306,-8304]],"properties":{"id":"24662575","dp":2838,"de":1164}},{"type":"Polygon","arcs":[[-8616,-8619,8620,8621]],"properties":{"id":"24662576","dp":10968,"de":0}},{"type":"Polygon","arcs":[[-7282,8622,-8621,-8618,-8298]],"properties":{"id":"24662577","dp":9951,"de":1539}},{"type":"Polygon","arcs":[[-7291,-8617,-8622,-8623,-7281,-7285]],"properties":{"id":"24662578","dp":8510,"de":5229}}]}},"arcs":[[[7594,1708],[19,-83],[3,-12]],[[7616,1613],[-16,-5],[-10,-3]],[[7590,1605],[-3,12],[-2,11],[-6,28],[-7,33],[-3,12]],[[7569,1701],[25,7]],[[7554,1595],[-2,11],[-16,73],[-3,11]],[[7533,1690],[17,5],[19,6]],[[7590,1605],[-19,-6],[-17,-4]],[[7517,1685],[16,5]],[[7554,1595],[-18,-6]],[[7536,1589],[-2,12],[-15,73],[-2,11]],[[7518,1584],[-18,-5]],[[7500,1579],[-3,10],[-6,33],[-12,52]],[[7479,1674],[20,6]],[[7499,1680],[18,5]],[[7536,1589],[-18,-5]],[[7443,1562],[-2,10],[-7,31],[-2,12],[19,5],[-10,43],[19,6],[19,5]],[[7500,1579],[-19,-6]],[[7481,1573],[-19,-5],[-19,-6]],[[7443,1562],[-18,-5]],[[7425,1557],[-2,10],[-6,31],[-2,12],[-4,19],[-3,10],[-2,7],[-2,1]],[[7404,1647],[1,1],[10,20],[14,29],[2,3]],[[7431,1700],[16,-11],[24,7],[3,1],[5,-23]],[[7431,1700],[29,59],[-3,11]],[[7457,1770],[11,3],[11,3]],[[7479,1776],[3,-12],[15,-72],[2,-12]],[[7479,1776],[18,5]],[[7497,1781],[16,5]],[[7513,1786],[2,-12],[16,-72],[2,-12]],[[7513,1786],[17,5]],[[7530,1791],[19,5]],[[7549,1796],[2,-11],[16,-72],[2,-12]],[[7549,1796],[24,7]],[[7573,1803],[21,-95]],[[7573,1803],[22,7],[19,6]],[[7614,1816],[2,-11],[4,-17],[2,-10]],[[7622,1778],[6,-23],[2,-11],[3,-13],[2,-10]],[[7635,1721],[-18,-6],[-23,-7]],[[7662,1777],[4,-15],[2,-10],[2,-11],[2,-8]],[[7672,1733],[-9,-3],[-9,-3],[2,-11],[13,-56],[7,2],[2,0],[10,0]],[[7688,1662],[3,-12],[3,-12],[-9,-4],[-10,-3]],[[7675,1631],[-18,-5]],[[7657,1626],[-2,10],[-8,34],[-9,40],[-3,11]],[[7622,1778],[19,6],[2,-9],[7,2],[2,0],[10,0]],[[7735,1704],[-1,-22],[-1,-23]],[[7733,1659],[-11,1],[-34,2]],[[7672,1733],[1,-3],[63,-4]],[[7736,1726],[-1,-11],[0,-11]],[[7662,1777],[14,-1],[32,-2],[10,-1],[21,-1],[11,-1]],[[7750,1771],[1,-4]],[[7751,1767],[-1,-10],[-10,-6],[-3,-3],[-1,-11],[0,-11]],[[7808,1698],[-73,6]],[[7751,1767],[65,-4]],[[7816,1763],[-1,-20],[-5,0],[0,-11],[-1,-11],[-1,-11],[0,-12]],[[7750,1771],[1,17],[1,10]],[[7752,1798],[0,10]],[[7752,1808],[66,-4]],[[7818,1804],[-1,-21],[-1,-20]],[[7752,1808],[1,15],[0,6],[1,21],[1,6]],[[7755,1856],[1,17],[0,4],[1,20]],[[7757,1897],[4,-1],[36,-3],[15,-1],[11,-1]],[[7823,1891],[-2,-23],[-1,-23]],[[7820,1845],[-1,-21],[-1,-20]],[[7902,1819],[-8,-30],[-11,-32]],[[7883,1757],[-3,2],[-64,4]],[[7820,1845],[11,0],[38,-3],[9,-1],[-1,-20],[22,-2],[3,0]],[[7823,1891],[10,-1],[37,-2],[1,0],[10,-1],[1,27],[1,30],[1,15],[1,14]],[[7885,1973],[9,0],[10,-1],[3,0]],[[7907,1972],[4,-40],[1,-20]],[[7912,1912],[0,-8],[-2,-28],[-3,-28],[-5,-29]],[[7823,1891],[1,27],[2,30],[-11,0],[-6,1],[2,29]],[[7811,1978],[5,0],[10,-1]],[[7826,1977],[11,0],[5,-1],[9,0],[34,-3]],[[7757,1897],[1,21],[1,5],[0,16]],[[7759,1939],[1,14],[0,6],[2,24]],[[7762,1983],[9,-1],[1,0],[30,-3],[9,-1]],[[7762,1983],[1,29]],[[7763,2012],[2,29]],[[7765,2041],[11,-1],[5,0],[49,-4]],[[7830,2036],[-2,-29],[-2,-30]],[[7717,1942],[1,20],[1,23],[2,30]],[[7721,2015],[9,-1],[24,-1],[9,-1]],[[7759,1939],[-9,0],[-24,2],[-9,1]],[[7674,2018],[1,12],[0,17]],[[7675,2047],[48,-3],[38,-3],[4,0]],[[7721,2015],[-9,0],[-22,2],[-7,0],[-9,1]],[[7671,1945],[1,21]],[[7672,1966],[1,21]],[[7673,1987],[1,21],[0,10]],[[7717,1942],[-9,0],[-28,3],[-9,0]],[[7672,1966],[-9,0],[-70,6]],[[7593,1972],[-3,10],[-2,10],[75,-4],[1,0],[9,-1]],[[7593,1972],[-14,-5]],[[7579,1967],[-7,34]],[[7572,2001],[-3,11],[0,9],[-4,10]],[[7565,2031],[7,6],[23,22],[1,3],[-1,2],[2,7],[3,4],[7,8]],[[7607,2083],[6,-7],[4,-3],[23,-17],[9,-7],[26,-2]],[[7583,1952],[-4,15]],[[7671,1945],[-9,1],[-19,2],[-45,3],[-15,1]],[[7592,1912],[-2,10],[-7,30]],[[7671,1945],[-1,-20],[-2,-21]],[[7668,1904],[-8,1],[-50,3],[-3,8],[-15,-4]],[[7551,1899],[-2,5],[-7,35],[11,3],[11,4],[-11,49],[9,3],[10,3]],[[7592,1912],[-19,-6],[-11,-4],[-11,-3]],[[6769,2744],[-8,6],[-44,32],[-9,7]],[[6708,2789],[10,19],[6,11]],[[6724,2819],[20,-16],[21,-15],[6,11],[7,13]],[[6778,2812],[20,-16],[-12,-23],[-6,-11],[-7,-13],[-4,-5]],[[6744,2698],[-14,11],[-47,35]],[[6683,2744],[12,22],[13,23]],[[6769,2744],[-12,-24],[-6,-11],[-7,-11]],[[6818,2644],[-31,22],[-4,4],[-39,28]],[[6778,2812],[-7,7],[1,2],[1,2],[2,4]],[[6775,2827],[61,-45]],[[6836,2782],[40,-30]],[[6876,2752],[-1,-4],[-2,-3],[-8,-14],[-6,-13],[-13,-23]],[[6846,2695],[-16,-29],[-12,-22]],[[6818,2644],[-7,-13]],[[6811,2631],[-73,56]],[[6738,2687],[6,11]],[[6787,2558],[-23,-1],[-16,3]],[[6748,2560],[6,11],[3,15],[-23,5],[-23,6],[-22,15],[-20,14]],[[6669,2626],[9,13],[9,7],[18,6],[14,-1],[13,24],[6,12]],[[6811,2631],[-6,-11],[-12,-21],[-7,-15],[0,-14],[1,-12]],[[6872,2507],[-3,-1],[-24,-14]],[[6845,2492],[-20,-11],[-11,-3],[-8,-2],[-15,-1]],[[6791,2475],[-1,26],[0,3],[-2,26],[18,2],[5,2],[6,3],[7,6],[-18,13],[-5,2],[-5,1],[-9,-1]],[[6811,2631],[27,-20],[36,-27],[3,-2]],[[6877,2582],[-6,-10],[-12,-22],[-13,-24],[16,-12],[10,-7]],[[6736,2472],[-8,5],[-26,6],[-25,11]],[[6677,2494],[19,20],[2,2],[24,20],[16,11],[10,13]],[[6791,2475],[-28,-2],[-27,-1]],[[6864,2373],[-89,66],[-36,26],[-3,7]],[[6845,2492],[59,-43]],[[6904,2449],[-12,-23],[-13,-24]],[[6879,2402],[-13,-25],[-2,-4]],[[6831,2309],[-90,66]],[[6741,2375],[-59,44]],[[6682,2419],[17,18],[16,18],[16,16],[5,1]],[[6864,2373],[-11,-20]],[[6853,2353],[-12,-21],[-4,-10],[-6,-13]],[[6831,2309],[-11,-22],[-30,22],[-18,-17],[37,-26]],[[6809,2266],[-6,-10],[-11,-14]],[[6792,2242],[-15,11],[-5,-1],[-14,9],[-7,0],[-38,24]],[[6713,2285],[10,20],[2,13],[0,25],[4,10],[12,22]],[[6888,2268],[-11,-22],[-12,-21]],[[6865,2225],[-56,41]],[[6831,2309],[57,-41]],[[6853,2353],[45,-34],[11,-8]],[[6909,2311],[-11,-20],[-10,-23]],[[6879,2402],[56,-41]],[[6935,2361],[-13,-25],[-13,-25]],[[6904,2449],[56,-42]],[[6960,2407],[-12,-23],[-13,-23]],[[6999,2314],[-64,47]],[[6960,2407],[64,-48]],[[7024,2359],[-12,-22],[-13,-23]],[[6960,2407],[6,10],[5,11],[11,19]],[[6982,2447],[64,-48]],[[7046,2399],[-10,-20],[-6,-10],[-6,-10]],[[6982,2447],[11,19]],[[6993,2466],[11,20]],[[7004,2486],[64,-48]],[[7068,2438],[-11,-20],[-11,-19]],[[7004,2486],[10,20],[11,20]],[[7025,2526],[11,-7]],[[7036,2519],[53,-41]],[[7089,2478],[-10,-20],[-11,-20]],[[7167,2476],[-2,-2],[-2,2],[-1,0],[-1,0],[-2,-2],[-1,-4],[-17,-31]],[[7141,2439],[-18,13],[-16,13],[-18,13]],[[7036,2519],[9,19],[55,-41],[11,20],[5,10],[2,2],[2,5],[2,3],[2,4]],[[7124,2541],[5,-8],[10,-20],[5,-9],[1,0],[5,-8],[7,-9],[5,-5],[5,-6]],[[7025,2526],[-9,7],[-13,11],[-1,3]],[[7002,2547],[5,0],[14,4],[7,3],[5,2]],[[7033,2556],[5,4],[6,5],[4,3],[5,8]],[[7053,2576],[11,20],[3,4],[2,4],[1,3]],[[7070,2607],[5,-3],[6,-5],[7,-7],[5,-5],[9,-10],[5,-7],[4,-6],[2,-3],[7,-12],[4,-8]],[[7234,2415],[-4,3],[-11,9],[-8,8],[-10,8],[-6,7],[-7,7],[-18,16],[-3,3]],[[7070,2607],[2,4]],[[7072,2611],[8,-6],[11,-8],[14,-13],[26,-31],[12,-8]],[[7143,2545],[5,-4],[17,-13],[51,-38]],[[7216,2490],[41,-31]],[[7257,2459],[-9,-18],[-3,-6]],[[7245,2435],[-1,-1],[-6,-12],[-3,-5],[-1,-2]],[[7272,2574],[42,-32]],[[7314,2542],[-7,-9],[-16,-20]],[[7291,2513],[-13,-19],[-11,-18]],[[7267,2476],[-10,-17]],[[7216,2490],[9,17],[10,18]],[[7235,2525],[7,9],[7,10],[-34,26],[10,17],[2,5],[37,-27],[6,7],[2,2]],[[7235,2525],[-73,55],[-10,-18],[-5,-10],[-4,-7]],[[7072,2611],[2,4],[1,4],[4,6],[5,8],[29,35],[19,20],[14,8],[1,0],[14,2],[15,-2],[11,-2],[6,1],[9,2]],[[7202,2697],[16,10],[4,3]],[[7222,2710],[43,-31],[9,-8],[-15,-39],[-8,-16],[-5,-9],[-5,-10],[5,-4],[8,-6],[7,-5],[11,-8]],[[7202,2697],[-13,10],[-4,3],[-25,19],[-5,3],[-5,6],[0,6],[-11,-1],[-11,-15]],[[7128,2728],[2,10],[-1,7],[-3,7],[-4,11],[-8,8],[-24,17]],[[7090,2788],[-6,22],[2,13]],[[7086,2823],[94,-70],[4,-2]],[[7184,2751],[-6,-11],[27,-17],[17,-13]],[[7060,2684],[-2,7],[-14,56],[-8,36],[-7,15],[-9,8]],[[7020,2806],[6,9],[9,5],[13,0],[10,-8],[32,-24]],[[7128,2728],[-14,-20],[-4,-6],[-20,-26],[-15,-2],[-15,10]],[[7060,2684],[-32,25],[-5,4]],[[7023,2713],[-36,28],[-7,6],[-1,1],[-13,7]],[[6966,2755],[31,58]],[[6997,2813],[4,7]],[[7001,2820],[19,-14]],[[7001,2820],[26,47]],[[7027,2867],[59,-44]],[[6997,2813],[-18,13],[-17,13]],[[6962,2839],[-16,12]],[[6946,2851],[30,54]],[[6976,2905],[16,-12],[17,-12],[18,-14]],[[8099,2087],[4,74]],[[8103,2161],[21,-1]],[[8124,2160],[22,-2]],[[8146,2158],[-4,-74]],[[8142,2084],[-21,2],[-22,1]],[[8146,2158],[21,-1]],[[8167,2157],[-3,-75],[-22,2]],[[8138,2014],[4,70]],[[8167,2157],[10,-1],[1,0],[2,0],[9,-1]],[[8189,2155],[-4,-74]],[[8185,2081],[-4,-71]],[[8181,2010],[-21,3],[-22,1]],[[7911,3064],[-4,5],[-6,5],[-4,4],[-3,3]],[[7894,3081],[22,34]],[[7916,3115],[13,-9],[1,0],[7,-5]],[[7937,3101],[-11,-17],[-6,-8],[-2,-2],[-2,-3],[-5,-7]],[[7894,3081],[-11,11],[-11,11]],[[7872,3103],[15,28]],[[7887,3131],[29,-16]],[[7072,2611],[-2,1],[-16,13],[-15,11],[20,37],[1,11]],[[7078,3651],[-13,-25]],[[7065,3626],[-6,5],[-5,2],[-13,8],[-13,5],[-6,4],[-1,-1],[0,-2],[-4,5],[-31,-1]],[[6986,3651],[16,28]],[[7002,3679],[3,-2],[5,-1],[5,-1],[6,0],[6,0]],[[7027,3675],[4,1],[6,-1],[7,-2],[7,-2],[8,-6],[19,-14]],[[6939,2583],[-44,33]],[[6895,2616],[11,20],[6,10]],[[6912,2646],[13,23],[14,27],[2,3],[1,4]],[[6942,2703],[45,-33]],[[6987,2670],[-2,-4],[-2,-3],[-7,-13],[-7,-13]],[[6969,2637],[-13,-22]],[[6956,2615],[-6,-12],[-11,-20]],[[8730,6185],[-9,-28]],[[8721,6157],[-8,-21],[-7,-21],[-8,-21],[-7,-22],[-7,-19],[-5,-13]],[[8679,6040],[-18,-52]],[[8661,5988],[-3,2],[-3,1],[-9,5],[-9,4],[8,22],[-40,22],[-9,5],[-40,22],[-9,-21]],[[8547,6050],[-16,8]],[[8531,6058],[8,22],[-53,29]],[[8486,6109],[-47,25]],[[8439,6134],[-2,2]],[[8437,6136],[48,122]],[[8485,6258],[58,-28],[2,23]],[[8545,6253],[100,-39],[3,9],[45,-26],[8,0],[3,0],[6,-1],[17,-10],[3,-1]],[[8565,5953],[-7,-19]],[[8558,5934],[-45,25],[-18,10]],[[8495,5969],[7,18],[-16,9],[-15,9]],[[8471,6005],[8,23],[12,27],[16,-9],[7,18],[1,3],[16,-9]],[[8547,6050],[16,-9],[-1,-3],[-7,-18],[-21,-50],[31,-17]],[[8634,5915],[-2,2],[-12,6],[-9,5],[-16,8],[-30,17]],[[8661,5988],[-2,-3],[-17,-48],[-8,-22]],[[8471,6005],[-33,17],[10,23],[18,45],[1,3]],[[8467,6093],[10,-5],[9,21]],[[8495,5969],[-6,-14],[-4,-8],[-1,-3],[-11,-16],[-8,-9],[-5,-11],[-7,-17]],[[8453,5891],[-40,22]],[[8413,5913],[-53,29]],[[8360,5942],[17,40]],[[8377,5982],[8,20],[9,22]],[[8394,6024],[8,19]],[[8402,6043],[20,-11],[27,65],[1,2],[1,3],[10,-6],[6,-3]],[[8402,6043],[28,67],[1,3]],[[8431,6113],[8,21]],[[8394,6024],[-2,1],[-20,11]],[[8372,6036],[8,19]],[[8380,6055],[27,68],[1,3],[21,-12],[2,-1]],[[8380,6055],[-16,8],[-16,8]],[[8348,6071],[28,69],[1,3],[-15,8]],[[8362,6151],[8,20],[54,-29],[13,-6]],[[9365,6386],[-13,5],[-12,4],[-9,3],[-34,16],[-9,4]],[[9288,6418],[-5,30],[-5,3],[-9,4],[-6,4],[-10,5],[-10,4],[-19,10],[-10,4]],[[9214,6482],[-10,6],[-5,2]],[[9199,6490],[4,12],[5,14]],[[9208,6516],[9,-4],[55,-28],[8,-3],[-4,29],[-2,26],[-2,27]],[[9272,6563],[9,-4],[7,-4],[10,-5],[10,-4],[-1,32],[0,4],[0,4],[1,2],[0,17],[0,24]],[[9308,6629],[9,-5],[12,-4],[4,-2]],[[9333,6618],[0,-25],[-2,-5],[-1,-4],[4,-11],[1,-8],[0,-11],[3,-21],[1,-26],[2,-9],[1,-8],[1,-10],[2,-7],[1,-10],[2,-11],[1,-8],[1,-6],[14,-35],[0,-9],[1,-8]],[[9208,6516],[9,23],[7,22]],[[9224,6561],[8,22],[9,-5],[21,-10],[10,-5]],[[9224,6561],[-9,4],[-32,16],[-1,0],[-9,4],[-5,4]],[[9168,6589],[7,21]],[[9175,6610],[4,14],[16,57]],[[9195,6681],[9,-3]],[[9204,6678],[4,-1],[6,-3],[40,-19],[4,-2],[8,-4],[2,-1],[37,-19],[3,0]],[[9175,6610],[-4,2],[-9,5],[-2,0],[-19,10],[-8,4]],[[9133,6631],[8,21],[7,22],[2,8],[6,17],[4,9],[5,14],[1,3]],[[9166,6725],[2,-1],[7,-3],[16,-8],[9,-4],[-8,-27],[3,-1]],[[9133,6631],[-11,5],[-22,11],[-9,4]],[[9091,6651],[7,22]],[[9098,6673],[9,22],[8,24],[10,26]],[[9125,6745],[8,-4],[23,-11],[10,-5]],[[9117,6588],[-10,5],[-3,2],[-20,9],[-9,5],[-9,4],[-23,11],[-9,5]],[[9034,6629],[8,21],[-9,5],[-23,11],[-9,4]],[[9001,6670],[7,21]],[[9008,6691],[9,-4],[9,-4],[14,-7],[9,-4],[10,-5],[22,-11],[10,-5]],[[9133,6631],[-8,-22],[-8,-21]],[[9098,6673],[-9,4],[-23,12],[-9,4],[8,22],[3,7],[6,18]],[[9074,6740],[9,25],[7,21]],[[9090,6786],[41,-19]],[[9131,6767],[-6,-22]],[[9090,6786],[-32,15],[-9,4]],[[9049,6805],[3,11],[3,9],[11,38]],[[9066,6863],[11,-3],[8,-4],[-4,-17],[10,-5],[14,-6],[8,-4],[22,-9],[9,-4]],[[9144,6811],[-6,-22],[-7,-22]],[[9144,6811],[7,23],[5,18]],[[9156,6852],[6,18]],[[9162,6870],[9,-2],[23,-8],[9,-2]],[[9203,6858],[2,-1],[6,-2],[2,0],[18,-5],[10,-3],[5,16],[5,17],[7,21],[3,-1]],[[9261,6900],[-10,-32],[-1,-4],[-32,-109],[-2,-7],[-21,-67]],[[9308,6629],[1,2],[1,24],[1,16],[2,13],[3,24],[-1,2],[-2,1],[-9,5],[-18,8],[-3,1],[-10,5]],[[9273,6730],[-13,5],[-26,12],[-11,5],[-4,-12],[-2,-12],[-2,-11],[-4,-13]],[[9211,6704],[-7,-26]],[[9261,6900],[6,-2],[-6,-21]],[[9261,6877],[-6,-17],[-5,-16],[-4,-15],[-4,-14],[9,-2],[23,-8],[7,-3],[3,0],[3,14],[2,7],[2,9],[3,17],[4,16]],[[9298,6865],[10,-3],[12,-3],[2,-1],[9,-2],[5,22],[-9,3],[-3,1],[3,11],[3,15],[3,12],[1,6],[0,1]],[[9334,6927],[14,-5],[12,-5],[13,-1]],[[9373,6916],[1,-2],[5,1],[2,0],[-1,-2],[-3,-1],[-1,-2],[3,-7],[0,-4],[-5,-21],[-2,-13],[-6,-26],[-7,-24],[-5,-12],[-1,-6],[-1,-7],[-2,-16],[-5,-18],[-4,-22],[0,-12],[-3,-16],[0,-12],[-2,-17],[-1,-3],[-2,-2],[-1,-2],[2,-3],[1,-8],[-2,-7],[0,-12],[0,-22]],[[9261,6877],[7,-3],[2,0],[17,-5],[1,-1],[10,-3]],[[9273,6730],[-3,-27],[-1,-27],[-9,4],[-4,2],[-34,17],[-2,0],[-9,5]],[[8763,5769],[-15,-41]],[[8748,5728],[-9,5],[-37,20],[-9,5]],[[8693,5758],[-9,5],[-22,13],[-9,5]],[[8653,5781],[-9,5],[-38,21],[-9,5]],[[8597,5812],[15,40]],[[8612,5852],[15,44]],[[8627,5896],[21,-12]],[[8648,5884],[-8,-21]],[[8640,5863],[-9,-21],[9,-5],[53,-29],[8,-5],[8,-4]],[[8709,5799],[9,-5],[9,-5]],[[8727,5789],[9,-5],[9,-5],[8,-5],[10,-5]],[[8920,5998],[-8,-21]],[[8912,5977],[-10,6],[-37,20],[-9,4],[-70,39],[-11,6]],[[8775,6052],[9,21],[8,20],[8,21]],[[8800,6114],[80,-44]],[[8880,6070],[-8,-21],[-8,-20],[10,-6],[36,-20],[10,-5]],[[8880,6070],[10,-6],[37,-20],[9,-5],[-4,-11],[-4,-8],[0,-3],[-6,-15],[-2,-4]],[[8892,5924],[-11,6],[-36,20],[-9,5]],[[8836,5955],[12,31],[-10,6],[-61,33],[-10,5]],[[8767,6030],[8,22]],[[8912,5977],[-8,-21],[-8,-19],[-4,-13]],[[8881,5881],[-51,27],[-10,6]],[[8820,5914],[7,19],[9,22]],[[8892,5924],[-6,-23],[-4,-17],[-1,-3]],[[8820,5914],[-10,6],[-59,32],[-10,5]],[[8741,5957],[-9,6],[-22,12],[-3,1]],[[8707,5976],[8,17],[1,1],[1,0],[22,-12],[10,-5],[6,22],[4,12],[8,19]],[[8707,5976],[-2,1],[-12,6],[-20,2],[-10,3],[-2,0]],[[8679,6040],[19,-10],[13,31],[19,-10],[27,-15],[10,-6]],[[8721,6157],[10,-6],[69,-37]],[[8927,5255],[-1,-2],[-1,-2],[0,-2],[-1,-1],[0,-2],[-10,-24],[-5,-12]],[[8909,5210],[-9,5],[-20,11],[-9,5],[-9,-23],[-5,-11],[-4,-12]],[[8853,5185],[-10,5],[-21,12],[-10,5]],[[8812,5207],[-51,27],[0,1]],[[8761,5235],[1,4],[18,56],[9,29],[1,2]],[[8790,5326],[2,-1],[29,-16],[26,-15],[3,-1],[1,-1],[23,-12],[15,-7],[34,-17],[4,-1]],[[8891,5163],[-29,17],[-9,5]],[[8909,5210],[-9,-23],[-5,-12],[-4,-12]],[[8882,5140],[-28,16],[-10,5]],[[8844,5161],[-10,5],[-21,12],[-10,5]],[[8803,5183],[9,24]],[[8891,5163],[-7,-18],[-2,-5]],[[8826,5114],[-10,5],[-21,12],[-10,6]],[[8785,5137],[9,23],[9,23]],[[8844,5161],[-9,-23],[-9,-24]],[[8864,5093],[-9,-23]],[[8855,5070],[-10,5],[-18,10],[-11,6]],[[8816,5091],[10,23]],[[8882,5140],[-8,-20],[-1,-3],[-9,-24]],[[8816,5091],[-9,5],[-22,12],[-10,5],[-10,6],[-31,17],[-3,1]],[[8731,5137],[7,25]],[[8738,5162],[1,0],[35,-20],[11,-5]],[[8738,5162],[8,24],[7,24],[8,25]],[[8432,5056],[-4,2],[-4,2],[-40,21],[-40,21]],[[8344,5102],[-76,40]],[[8268,5142],[-58,31]],[[8210,5173],[-57,30]],[[8153,5203],[-54,29]],[[8099,5232],[-37,20],[-15,8]],[[8047,5260],[7,12],[4,8]],[[8058,5280],[10,18],[10,18],[10,19]],[[8088,5335],[10,19],[10,18]],[[8108,5372],[10,19]],[[8118,5391],[10,19],[10,19]],[[8138,5429],[22,41],[19,35]],[[8179,5505],[8,15],[10,17],[2,3]],[[8199,5540],[72,-39],[20,-11],[64,-35],[31,-16],[21,-12],[25,-13],[3,-2]],[[8435,5412],[-1,-4],[-2,-14],[-1,-5],[0,-11],[2,-53],[1,-55],[2,-58],[1,-36],[1,-44],[-1,-19],[-2,-36],[-3,-21]],[[8592,4282],[-59,38]],[[8533,4320],[-26,16],[-28,18],[-2,2]],[[8477,4356],[8,19],[8,20],[8,19]],[[8501,4414],[7,20],[8,19],[8,20]],[[8524,4473],[7,19],[3,5],[1,2],[9,23],[1,3]],[[8545,4525],[8,-5],[10,-10],[10,-15],[7,-14],[20,-41]],[[8600,4440],[33,-61],[4,-10],[1,-2],[1,-2],[2,-5],[2,-5],[25,-9]],[[8668,4346],[-7,-30],[-4,-19],[-4,-19],[-4,-18],[-27,2],[-30,20]],[[8499,4267],[-49,37]],[[8450,4304],[9,16]],[[8459,4320],[10,19],[7,14],[1,3]],[[8533,4320],[-10,-19],[-10,-19],[-4,2],[-5,-8],[-5,-9]],[[8470,4214],[-13,10],[-11,9],[-11,8],[12,18],[0,7],[1,2],[5,8],[-14,11]],[[8439,4287],[5,8],[6,9]],[[8499,4267],[-4,-9],[-5,-9]],[[8490,4249],[-5,-8],[-10,-17],[-5,-10]],[[8408,4151],[-23,18],[-8,6],[-3,0]],[[8374,4175],[12,21],[14,24],[19,33]],[[8419,4253],[17,28],[3,6]],[[8470,4214],[-6,-16],[-11,-19],[-22,-38],[-13,10],[-10,0]],[[9675,8212],[-4,2],[-4,1],[-2,1]],[[9665,8216],[-2,1],[-40,14],[-3,1]],[[9620,8232],[6,27],[5,28]],[[9631,8287],[4,22],[11,-3],[6,1],[2,5],[-1,15]],[[9653,8327],[-5,47]],[[9648,8374],[-1,14]],[[9647,8388],[10,-3],[51,-13],[6,-14],[5,-22],[4,-19],[1,-5]],[[9724,8312],[-7,-3],[-34,9],[-4,0],[-1,-2],[1,-7],[-13,-2],[4,-43]],[[9670,8264],[4,-34],[1,-11],[0,-7]],[[9669,8164],[-17,5],[-7,18],[-1,2],[-2,2],[-7,1],[-3,0],[-2,-2],[-7,-9],[-7,-12],[-4,-10],[-3,-11]],[[9609,8148],[-11,2],[-6,-1],[-14,-10],[-5,-6],[-1,-8],[1,-7],[-2,-13]],[[9571,8105],[-21,5],[5,27],[2,5],[6,11]],[[9563,8153],[7,5],[30,23],[7,8],[5,8],[3,8],[4,22],[1,5]],[[9665,8216],[0,-5],[4,-47]],[[9677,8082],[-11,-1],[-13,3],[3,16],[-4,34],[0,3],[-3,1],[-40,10]],[[9669,8164],[2,-23],[6,-59]],[[9677,8082],[2,-27],[0,-22],[1,-22]],[[9680,8011],[-61,15]],[[9619,8026],[5,21],[4,21],[-41,11],[4,21],[-20,5]],[[9690,8008],[-7,2],[-3,1]],[[9675,8212],[13,-4],[17,-5],[18,-4],[39,-10]],[[9762,8189],[0,-5],[-1,-10],[-2,-13],[-7,-26],[-19,-70],[-46,12],[1,-25],[1,-22],[1,-22]],[[9743,8257],[12,-29],[4,-20],[2,-8],[1,-11]],[[9670,8264],[13,2],[2,1],[1,1],[20,-5],[2,-1],[3,-2],[26,-6],[6,3]],[[9724,8312],[3,-13],[5,-12],[1,-5],[3,-6],[7,-19]],[[9775,8184],[-13,5]],[[9647,8388],[-1,10],[-2,22]],[[9644,8420],[5,-1],[16,-4],[18,-5],[10,-2]],[[9693,8408],[3,1],[35,-9],[3,0],[13,-1],[3,-1],[7,-1]],[[9757,8397],[2,-12],[7,-16],[3,-23],[3,-4],[3,-5],[2,-1],[1,0],[0,-1],[0,-2],[0,-1],[-3,-1],[-3,-3],[1,-9],[2,-8],[1,-8],[3,-23],[0,-2],[0,-11],[3,-12],[1,-28],[2,-5],[-1,-19],[2,-11],[-4,-4],[-7,-1],[0,-3]],[[9698,8655],[5,-5],[-1,-3],[2,-16],[2,-4],[5,-10],[0,-8],[3,-21],[5,-22],[2,-9],[3,-12],[3,-6],[1,-7],[2,-6],[3,-4],[3,-2],[7,-1],[0,-3],[-2,-4],[-3,-9],[-2,-2],[-2,-19],[1,-4],[6,-6],[2,-2],[3,-3],[1,-7],[-2,-10],[5,-20],[3,-21],[3,-10],[1,-2]],[[9693,8408],[-9,24],[-3,8],[-6,29],[-1,5],[-4,17],[-2,8]],[[9668,8499],[-3,23],[-2,10],[-6,40],[-5,39],[-4,29],[-4,28]],[[9644,8668],[31,-9],[3,1],[2,1],[1,1],[13,-6],[4,-1]],[[9775,8184],[0,-18],[-2,-30],[-2,-12],[-2,-7],[-1,-10],[-1,-8],[-4,-19],[-3,-8],[-2,-11],[-1,-7],[-6,-21],[-1,-9],[0,-24],[-1,-6]],[[9749,7994],[-24,5],[-9,2],[-26,7]],[[9774,7870],[-3,0],[-13,1],[1,2],[-21,5]],[[9738,7878],[-5,3],[-14,4],[-3,1],[-3,1],[-20,5],[-17,5]],[[9676,7897],[-5,1],[-3,1]],[[9668,7899],[4,25],[2,10],[1,10],[2,10],[1,11],[0,11],[1,13],[-64,16]],[[9615,8005],[4,21]],[[9749,7994],[0,-16],[-1,-2],[0,-8],[1,-9],[1,-2],[1,-3],[1,-21],[1,-4],[2,-4],[6,-6],[0,-4],[4,-9],[2,-8],[3,-10],[4,-8],[0,-10]],[[9679,7765],[-41,11]],[[9638,7776],[9,20],[10,21],[7,20]],[[9664,7837],[5,22],[1,3],[3,17],[2,15],[1,3]],[[9738,7878],[-3,-18],[-2,-16],[-5,-24],[-25,7],[-3,1],[-7,-21],[-7,-21],[-7,-21]],[[9652,7840],[-95,26]],[[9557,7866],[4,21],[8,36],[0,3]],[[9569,7926],[63,-17],[11,-3],[25,-7]],[[9664,7837],[-4,1],[-2,1],[-3,0],[-3,1]],[[9548,7822],[5,22],[4,22]],[[9652,7840],[-7,-20],[-4,-11],[-4,-10],[-89,23]],[[9534,7757],[2,8],[1,6],[2,8]],[[9539,7779],[4,22],[5,21]],[[9638,7776],[-11,-20],[-11,-21]],[[9616,7735],[-6,2],[-3,1],[-73,19]],[[9641,7660],[-58,16]],[[9583,7676],[7,12],[15,26],[11,21]],[[9679,7765],[-6,-21],[-6,-22],[-7,-24],[-4,-8],[-2,-5],[-6,-13],[-7,-12]],[[9521,7693],[3,14],[5,26],[5,24]],[[9583,7676],[-8,3],[-54,14]],[[9522,7584],[-22,6],[4,24],[5,23]],[[9509,7637],[5,23],[4,19],[3,14]],[[9641,7660],[-6,-9],[-13,-20],[-14,-21]],[[9608,7610],[-53,15],[-11,-22],[-12,-22]],[[9532,7581],[-6,1],[-4,2]],[[9522,7584],[-11,-20]],[[9511,7564],[-76,22]],[[9435,7586],[4,21],[5,23],[5,24],[60,-17]],[[9382,7601],[53,-15]],[[9511,7564],[-10,-18],[-10,-19],[-4,-8],[-6,-3],[-6,-2],[-4,0],[-6,0],[-7,1],[-39,10],[-53,16],[6,20],[5,19],[5,21]],[[9492,7435],[-13,-20],[-28,-40],[-12,-20],[-9,-16],[-8,-22],[-17,-49],[-12,-34],[-32,-95],[-11,-40],[-8,-28],[-4,-20],[-4,-15],[-16,-73],[-5,-24],[-1,-6]],[[9312,6933],[-32,9],[-5,2]],[[9275,6944],[-4,1],[-38,11],[-1,0]],[[9232,6956],[-42,12]],[[9190,6968],[-42,12]],[[9148,6980],[-43,10],[-42,12]],[[9063,7002],[-41,13]],[[9022,7015],[-3,1]],[[9019,7016],[0,1],[4,6],[37,117],[45,140],[15,71],[21,101],[5,13],[27,85],[13,42],[12,38],[2,8],[1,11],[6,20],[66,-17],[19,-5],[42,-12],[32,-9],[21,-5],[-5,-20]],[[9532,7581],[-11,-19],[-10,-18],[-34,-61],[-13,-23],[-8,-15],[36,-10]],[[6540,4618],[-62,30]],[[6478,4648],[7,19],[3,9],[4,11],[5,14],[6,17]],[[6503,4718],[61,-30]],[[6564,4688],[-6,-16],[-5,-14],[-3,-11],[-4,-9],[-6,-20]],[[6564,4688],[50,-24],[10,-3],[3,-1]],[[6627,4660],[-1,-3],[-6,-15],[-5,-14],[-3,-11],[-4,-9],[-3,-9],[-3,-10]],[[6602,4589],[-18,9],[-44,20]],[[8362,6151],[-1,-3],[-8,-20],[-27,14],[8,21],[1,3],[-22,12]],[[8313,6178],[8,21],[15,41],[31,82]],[[8367,6322],[4,11]],[[8371,6333],[114,-75]],[[6747,4747],[-10,-21],[-7,-12],[-2,-4],[-3,-8],[-7,-12],[0,-1],[-3,-7],[-5,-11],[-1,-3],[-1,-2],[-6,-17]],[[6702,4649],[0,1],[-1,0],[-2,1],[0,1],[-3,1],[-5,-2],[-7,-4],[-4,-3],[-4,-3],[-3,-1],[-2,0],[-4,1],[-18,9],[-22,10]],[[6503,4718],[-3,1],[-59,28],[-13,6],[-32,15]],[[6396,4768],[36,102],[6,17],[2,5],[1,3],[0,1],[5,14],[8,23]],[[6454,4933],[8,-4],[28,-13],[9,-4]],[[6499,4912],[-8,-23],[-3,-10],[-3,-9],[61,-29]],[[6546,4841],[61,-29]],[[6607,4812],[19,-9],[20,-9],[-4,-9],[-4,-13],[-4,-12],[22,-11]],[[6656,4749],[22,-10],[13,-6],[10,-5],[23,-11],[7,14],[5,9],[5,9],[1,-1],[2,0],[2,-1],[1,0]],[[6607,4812],[4,9],[3,10],[4,10],[3,9],[1,2]],[[6622,4852],[9,-4],[23,-11],[21,-10],[8,-4]],[[6683,4823],[-1,-2],[-3,-9],[-3,-10],[-4,-10],[-3,-9],[-4,-9],[-2,-7],[-2,-6],[-5,-12]],[[6546,4841],[3,9],[4,10],[3,10],[5,12]],[[6561,4882],[61,-30]],[[6561,4882],[5,17],[7,19],[6,18]],[[6579,4936],[62,-29]],[[6641,4907],[-7,-19],[-6,-19],[-1,-2],[-4,-13],[-1,-2]],[[6579,4936],[7,20],[4,11],[4,12]],[[6594,4979],[62,-28]],[[6656,4951],[-4,-13],[-4,-11],[-7,-20]],[[6561,4882],[-9,4],[-45,21],[-8,5]],[[6499,4912],[6,17],[6,19],[7,18],[6,19],[4,11],[5,13]],[[6533,5009],[61,-30]],[[6454,4933],[6,18]],[[6460,4951],[7,20],[4,11],[17,48]],[[6488,5030],[45,-21]],[[6460,4951],[-3,1],[-7,4],[-16,7],[-20,9],[2,6],[5,14],[3,9],[1,3]],[[6425,5004],[8,24],[5,12],[4,12]],[[6442,5052],[46,-22]],[[6396,4768],[-16,8],[-54,26]],[[6326,4802],[3,2],[2,3],[8,22],[1,3]],[[6340,4832],[10,25],[19,24],[3,4]],[[6372,4885],[15,18],[-2,4],[-57,28],[5,14],[4,12]],[[6337,4961],[5,12],[4,12],[4,12],[4,11],[8,23],[2,3]],[[6364,5034],[61,-30]],[[6364,5034],[-60,29],[-2,1]],[[6302,5064],[8,23],[9,25]],[[6319,5112],[11,-6],[50,-25]],[[6380,5081],[62,-29]],[[6337,4961],[-61,30]],[[6276,4991],[4,12],[5,12],[8,22],[7,22],[2,5]],[[6372,4885],[-3,1],[-22,11],[-22,11],[-13,6],[-54,27]],[[6258,4941],[9,23]],[[6267,4964],[5,14],[4,13]],[[6340,4832],[-3,2],[-50,25],[-34,17],[-16,8]],[[6237,4884],[9,25],[10,28],[2,4]],[[6326,4802],[-54,27]],[[6272,4829],[-19,10],[-27,13]],[[6226,4852],[6,17],[4,12],[1,3]],[[6253,4728],[-61,31]],[[6192,4759],[7,21],[8,22]],[[6207,4802],[8,21],[5,13],[6,16]],[[6272,4829],[-6,-16],[-5,-13]],[[6261,4800],[-8,-22],[5,-3],[10,-5],[-8,-21],[-7,-21]],[[6291,4708],[-7,3],[-1,1],[-30,16]],[[6261,4800],[54,-28],[-5,-13],[-4,-11],[-6,-16],[-1,-3],[-4,-11],[-4,-10]],[[6268,4661],[-14,7],[-20,10],[-61,30]],[[6173,4708],[2,7]],[[6175,4715],[8,22],[9,22]],[[6291,4708],[-1,-5],[-2,-7],[-8,-19],[-2,-3],[-10,-13]],[[6254,4623],[-1,0],[-95,46]],[[6158,4669],[3,8],[5,11],[2,8],[5,12]],[[6268,4661],[-7,-19],[-7,-19]],[[6225,4516],[3,22],[3,15],[3,12],[1,1],[3,10]],[[6238,4576],[5,14],[2,9],[8,20],[1,4]],[[6396,4768],[-3,-9],[-27,-75],[-16,-46],[-32,-93],[-2,-6],[-13,-38],[-2,-6]],[[6301,4495],[-2,0],[-18,5],[-28,8],[-8,2],[-20,6]],[[6238,4576],[-1,1],[-2,0],[-3,-10],[-8,4],[-5,3],[-43,21],[-16,7],[-5,-12],[-21,-25],[-14,4]],[[6120,4569],[12,32]],[[6132,4601],[5,11],[3,8],[6,19],[4,8],[4,11]],[[6154,4658],[4,11]],[[6225,4516],[-3,0],[-101,27],[-8,2]],[[6113,4545],[7,24]],[[6225,4516],[-3,-24],[-5,-38],[-4,-26]],[[6213,4428],[-4,1],[-17,0],[-13,-2],[-15,-5],[-14,-4]],[[6150,4418],[-2,13],[1,18]],[[6149,4449],[4,30]],[[6153,4479],[20,-5],[7,38],[-17,6],[-18,4],[-18,5],[-19,5]],[[6108,4532],[5,13]],[[6153,4479],[-20,9],[-17,8],[-17,9]],[[6099,4505],[-27,13],[-10,5],[-3,2],[0,2],[7,17],[42,-12]],[[6149,4449],[-55,27],[-5,2]],[[6089,4478],[10,27]],[[6150,4418],[-36,25],[-5,7],[-10,4],[-4,1],[-32,-5],[-26,-1],[-16,-7],[-5,10],[-12,24]],[[6004,4476],[14,-7],[2,0],[4,1],[3,1],[14,28],[1,1],[2,0],[31,-15],[14,-7]],[[6150,4418],[-50,-17],[1,-5]],[[6101,4396],[-18,-6],[-21,-7]],[[6062,4383],[-33,-10]],[[6029,4373],[-4,3],[-8,-3],[-1,2],[-5,16],[-7,13],[-24,17]],[[5980,4421],[13,26],[11,29]],[[7637,1518],[-21,95]],[[7616,1613],[22,7],[19,6]],[[7657,1626],[2,-11],[17,-74],[3,-11]],[[7679,1530],[-19,-6],[-11,-3],[-12,-3]],[[8505,6314],[9,-15],[1,-5],[-9,-21],[2,-4],[14,-8],[15,36],[1,2],[8,-12],[4,-5],[3,-2],[2,-1],[2,-3],[3,-1]],[[8560,6275],[-15,-22]],[[8371,6333],[10,28],[4,11],[10,24],[1,3]],[[8396,6399],[19,-10]],[[8415,6389],[49,-28]],[[8464,6361],[-1,-2],[-20,-51],[1,-3],[14,-8],[30,-18],[3,2],[6,16],[8,17]],[[8464,6361],[15,-8],[19,-10]],[[8498,6343],[-3,-3],[-6,-17],[16,-9]],[[8543,6376],[-4,-4],[-5,-6],[-4,-4],[-4,-3],[-3,-3],[-7,-4],[-14,-7],[-4,-2]],[[8415,6389],[17,34],[7,14],[2,3]],[[8441,6440],[52,-28],[5,-5],[4,4],[7,11]],[[8509,6422],[11,-8],[18,-10],[-8,-13],[0,-5],[13,-10]],[[8567,6293],[-7,-18]],[[8498,6343],[19,-11],[1,-1],[1,-1],[1,-2],[15,10],[23,-37],[3,-4],[3,-2],[3,-2]],[[8609,6408],[-14,-6],[-21,9],[-12,-31],[22,-13],[-4,-11],[7,-4]],[[8587,6352],[-13,-42],[-2,-4],[-5,-13]],[[8543,6376],[3,4],[7,12],[10,17],[13,22],[-45,31]],[[8531,6462],[2,2],[2,4],[2,4]],[[8537,6472],[0,-1],[4,-3],[3,-2],[6,-4],[4,-2],[5,-4],[4,-3],[41,-29],[9,-7],[1,0]],[[8614,6417],[-2,-4],[-2,-1],[-1,-4]],[[8609,6408],[14,-10],[-10,-26],[-2,-6],[1,-6],[3,-14],[1,-7],[-28,13],[-1,0]],[[8784,6337],[-1,-4],[-2,-6],[-5,-13],[-15,-43],[-6,-15],[-11,-33],[-12,-33],[-2,-5]],[[8614,6417],[7,-5],[7,-5],[3,-2],[9,-6],[6,-5],[10,-7],[10,-6],[7,-5],[8,-4],[7,-3],[7,-3],[7,-3],[13,-5],[7,-2],[3,-1],[2,0],[29,-9],[25,-8],[1,-1],[1,0],[1,0]],[[8786,6342],[-2,-5]],[[8614,6417],[1,7]],[[8615,6424],[2,-1],[24,-17],[8,-6],[7,-4],[9,-5],[18,44],[7,26],[2,10],[12,31]],[[8704,6502],[17,-9],[51,-26],[7,-3],[5,-2],[24,-13],[11,-5],[3,-1]],[[8822,6443],[-14,-39],[-6,-16],[-7,-21],[-1,-4],[-5,-12],[-3,-9]],[[8911,6419],[-6,-18]],[[8905,6401],[-17,8],[-19,-55],[16,-9],[-7,-20],[45,-23],[12,-7],[-10,3],[-8,4],[-16,7],[-19,5],[-44,13],[-8,3],[-37,10],[-7,2]],[[8822,6443],[7,18],[1,4],[21,57]],[[8851,6522],[9,-4],[10,-5],[-16,-43],[-2,-3],[-5,-15],[64,-33]],[[8918,6437],[-7,-18]],[[8851,6522],[8,22]],[[8859,6544],[9,-5],[32,-15],[41,-21]],[[8941,6503],[-8,-22],[-15,-44]],[[8802,6657],[-9,-25],[-8,-23],[36,-18],[5,-3],[8,24],[28,-14],[11,-5],[3,-2]],[[8876,6591],[-9,-23],[-8,-24]],[[8704,6502],[44,121],[4,12],[3,5],[5,11],[0,2]],[[8760,6653],[16,-11],[2,3],[4,-3],[7,17],[-1,4]],[[8788,6663],[5,-2],[9,-4]],[[8885,6616],[-9,-25]],[[8802,6657],[9,-5],[23,-11],[10,-5],[9,-4],[22,-11],[7,-3],[3,-2]],[[8911,6689],[-8,-23],[-9,-26],[-9,-24]],[[8802,6657],[8,24],[10,25]],[[8820,6706],[9,-4],[23,-11],[10,-5],[8,23],[9,-4],[19,-10],[3,-1],[7,-4],[3,-1]],[[8820,6706],[8,23],[8,22]],[[8836,6751],[8,21]],[[8844,6772],[9,-4],[23,-11],[9,-5],[9,-4],[23,-11],[7,-4],[3,-1]],[[8927,6732],[-8,-22],[-8,-21]],[[8934,6753],[-7,-21]],[[8844,6772],[8,22],[22,-11],[8,23],[8,22],[11,-5],[8,-4]],[[8909,6819],[8,-4],[11,-5],[11,-6],[9,-4],[2,-1]],[[8950,6799],[-8,-24],[-8,-22]],[[8921,6854],[-7,-19],[-5,-16]],[[8836,6751],[-30,14],[-10,5],[-23,12],[-16,13]],[[8757,6795],[-40,29],[-26,19]],[[8691,6843],[2,15],[4,17]],[[8697,6875],[5,20],[22,-8]],[[8724,6887],[37,-15]],[[8761,6872],[63,-24],[3,7],[1,2],[5,14]],[[8833,6871],[40,-18],[6,18],[32,-14],[10,-3]],[[8833,6871],[6,17]],[[8839,6888],[6,17],[6,20],[31,-10],[10,-3],[10,-3],[32,-12]],[[8934,6897],[-6,-24],[-7,-19]],[[8761,6872],[8,24],[5,19]],[[8774,6915],[10,-4],[45,-19],[10,-4]],[[8724,6887],[7,25],[7,24],[-60,23]],[[8678,6959],[7,24],[21,-9],[14,-6],[25,-8],[37,-13],[-1,-7],[-1,-8],[-4,-12],[-2,-5]],[[8697,6875],[-20,8]],[[8677,6883],[6,20],[-19,7],[7,25],[7,24]],[[8677,6883],[-19,9],[-11,4],[-34,22],[6,9],[8,24],[-6,9],[3,8],[-10,4],[-6,-1]],[[8608,6971],[3,15],[5,-3],[62,-24]],[[8691,6843],[4,-15],[10,-7],[-5,-8]],[[8700,6813],[-15,10],[-37,27]],[[8648,6850],[1,3],[4,13],[0,6],[-68,48]],[[8585,6920],[-71,51]],[[8514,6971],[10,20]],[[8524,6991],[8,15],[7,14]],[[8539,7020],[52,-37]],[[8591,6983],[0,-5],[13,-8],[4,1]],[[8631,6817],[-3,2],[-1,-3],[-35,26],[-36,25]],[[8556,6867],[2,3],[9,18],[8,14],[10,18]],[[8648,6850],[-1,-2],[-7,-13],[-9,-18]],[[8631,6817],[-2,-3],[-8,-17],[-7,-16],[-1,-3]],[[8613,6778],[-3,2],[-17,8],[-24,13],[-18,9],[-17,8],[-19,10],[-18,8],[-2,1],[-15,8]],[[8480,6845],[10,24],[10,22],[6,12]],[[8506,6903],[24,-17],[26,-19]],[[6775,2827],[-12,9],[-13,9],[-9,7]],[[6741,2852],[2,4],[8,18],[10,17]],[[6761,2891],[35,-26]],[[6796,2865],[-10,-17],[-9,-17],[-1,-2],[-1,-2]],[[6724,2819],[-21,15],[6,11],[3,5],[5,10],[20,-15],[2,4],[2,3]],[[7230,1149],[-6,-29],[-4,-21]],[[7220,1099],[-59,16],[-4,-23]],[[7157,1092],[-16,4]],[[7141,1096],[-2,1]],[[7139,1097],[4,21]],[[7143,1118],[9,20],[13,33]],[[7165,1171],[10,-7],[18,-6],[18,-5],[19,-4]],[[7210,1077],[-33,10]],[[7177,1087],[-18,4],[-2,1]],[[7220,1099],[-4,-12],[-6,-10]],[[7177,1087],[-7,-34],[25,-1],[-12,-21]],[[7183,1031],[-35,0],[-20,0]],[[7128,1031],[13,65]],[[7188,963],[-1,0],[-2,1],[-23,-1],[-8,0]],[[7154,963],[-10,1]],[[7144,964],[-49,1]],[[7095,965],[0,24],[11,0],[1,21]],[[7107,1010],[63,0],[13,21]],[[7210,1077],[37,-9],[-1,-5],[-58,-100]],[[7107,1010],[3,21]],[[7110,1031],[18,0]],[[7110,1031],[5,28],[4,20],[-51,11],[7,24]],[[7075,1114],[10,-3]],[[7085,1111],[39,-10],[15,-4]],[[7095,965],[-51,0]],[[7044,965],[-5,0],[-7,1],[-7,1]],[[7025,967],[6,23],[20,-1],[16,57],[-19,2],[-2,-8],[-11,3]],[[7035,1043],[2,7],[21,70]],[[7058,1120],[10,-4],[7,-2]],[[7025,967],[-17,6],[-24,10]],[[6984,983],[-17,7]],[[6967,990],[15,53],[3,5],[5,4],[8,3],[7,0],[13,-5],[17,-7]],[[6967,990],[-32,12],[-7,2],[-3,0]],[[6925,1004],[7,7],[6,7],[3,4],[7,12]],[[6948,1034],[67,103]],[[7015,1137],[2,-1],[24,-10],[9,-3],[8,-3]],[[6948,1034],[-2,2],[-24,20]],[[6922,1056],[-14,11]],[[6908,1067],[10,17],[11,18]],[[6929,1102],[11,16],[11,17]],[[6951,1135],[11,17],[14,-11],[12,17]],[[6988,1158],[24,-19],[3,-2]],[[6951,1135],[-44,33]],[[6907,1168],[9,17]],[[6916,1185],[19,-13],[10,17]],[[6945,1189],[43,-31]],[[6929,1102],[-41,30]],[[6888,1132],[9,18]],[[6897,1150],[10,18]],[[6908,1067],[-39,29]],[[6869,1096],[9,19],[10,17]],[[6869,1096],[-32,23]],[[6837,1119],[6,21],[5,20],[7,22]],[[6855,1182],[42,-32]],[[6922,1056],[-10,-16]],[[6912,1040],[-81,59]],[[6831,1099],[6,20]],[[6912,1040],[-14,-22],[-20,15],[-7,-12],[-52,39],[4,13],[8,26]],[[6925,1004],[-9,-8],[-10,-7],[-33,-20],[-23,-14],[-21,-12]],[[6829,943],[-2,2],[-8,13],[-12,16],[-8,12],[-4,3],[-10,17]],[[6785,1006],[-9,13],[-4,7]],[[6772,1026],[-4,4],[-7,12],[-5,8],[-8,12],[-3,5],[-5,7],[-38,57]],[[6702,1131],[-1,4],[-9,15],[-9,13],[-9,14],[-4,6],[-11,17],[-4,6],[-1,1],[-7,10],[-4,5],[-18,24],[-5,8],[-10,19],[-3,8],[-1,1]],[[6606,1282],[4,3],[6,2],[48,32],[23,17],[40,25],[54,36],[48,30]],[[6829,1427],[3,-5],[4,-3],[11,-9],[53,-41],[43,-31],[-12,-17]],[[6931,1321],[-11,-15],[-12,-16]],[[6908,1290],[-12,-15],[-12,-16],[-12,-15]],[[6872,1244],[-12,-16],[-13,-16],[13,-10],[-5,-20]],[[6872,1244],[38,-28],[-10,-19],[16,-12]],[[6908,1290],[51,-37]],[[6959,1253],[-10,-16],[-11,-17],[16,-12]],[[6954,1208],[-9,-19]],[[6931,1321],[48,-36]],[[6979,1285],[-10,-15],[-10,-17]],[[7009,1262],[-40,-64]],[[6969,1198],[-15,10]],[[6979,1285],[17,-12],[13,-11]],[[7009,1262],[16,-11]],[[7025,1251],[-41,-65],[-15,12]],[[7079,1236],[-29,-45],[-35,-54]],[[7025,1251],[16,-13],[10,19],[25,-19],[3,-2]],[[7111,1185],[-24,19],[-11,-18],[27,-20],[-15,-34],[-3,-21]],[[7079,1236],[9,-6],[32,-26],[-9,-19]],[[8252,1733],[-17,-43],[-3,-12],[-6,-11],[-4,-12],[-9,-19],[-4,-10]],[[8209,1626],[-34,1]],[[8175,1627],[-11,0],[-4,1]],[[8160,1628],[0,9],[1,11],[1,17]],[[8162,1665],[1,19],[2,25]],[[8165,1709],[1,29],[0,3]],[[8166,1741],[35,-2],[4,-3],[47,-3]],[[8166,1741],[2,25]],[[8168,1766],[56,-5],[12,22],[5,10],[3,11]],[[8244,1804],[5,18]],[[8249,1822],[4,20]],[[8253,1842],[1,19]],[[8254,1861],[2,27]],[[8256,1888],[54,-14],[1,1]],[[8311,1875],[-12,-28],[-7,-14],[-10,-26],[-5,-11],[-12,-29],[-3,-10],[-7,-13],[-3,-11]],[[8168,1766],[1,23]],[[8169,1789],[2,20]],[[8171,1809],[73,-5]],[[8171,1809],[0,19]],[[8171,1828],[78,-6]],[[8171,1828],[2,19]],[[8173,1847],[80,-5]],[[8173,1847],[0,20]],[[8173,1867],[81,-6]],[[8173,1867],[2,27]],[[8175,1894],[12,-1],[69,-5]],[[8175,1894],[1,29]],[[8176,1923],[12,-1],[70,-5]],[[8258,1917],[-2,-29]],[[8176,1923],[2,29]],[[8178,1952],[83,-7],[-3,-28]],[[8178,1952],[2,30]],[[8180,1982],[82,-6],[-10,30]],[[8252,2006],[7,0]],[[8259,2006],[1,-1],[7,-1],[1,-2],[2,-4],[51,1]],[[8321,1999],[0,-18],[-2,-39],[0,-31],[-4,-15],[-4,-21]],[[8380,2225],[-1,0],[-10,-3],[-12,-8],[-9,-5],[-4,-1],[-5,-8],[-7,-12],[-1,-39],[-2,-26],[-2,-26],[0,-16],[-4,-38],[-2,-15],[0,-29]],[[8259,2006],[1,2],[11,3],[1,4],[-1,7],[-1,4],[-1,6],[-4,29],[0,6],[0,9],[1,5],[1,6],[2,7],[3,12],[1,4],[1,5],[1,9],[-2,1],[-15,3],[-5,-9],[-4,0]],[[8249,2119],[1,11],[-3,6],[-3,5],[-3,5],[-34,15],[-3,1],[-3,0],[-4,-1],[-4,10],[-2,3]],[[8191,2174],[8,15],[2,1],[2,5]],[[8203,2195],[2,5],[6,14],[32,72],[6,12],[6,15],[5,8]],[[8260,2321],[1,-4],[37,-21],[10,-6],[3,-1],[68,-63],[1,-1]],[[7497,2612],[-92,70]],[[7405,2682],[1,2],[24,13],[27,12]],[[7457,2709],[72,-53]],[[7529,2656],[-15,-21],[-8,-11],[-9,-12]],[[7468,2570],[-91,68]],[[7377,2638],[12,22],[12,18],[4,4]],[[7497,2612],[-15,-22],[-14,-20]],[[7453,2548],[-17,-24]],[[7436,2524],[-28,22],[-27,20],[-17,12],[-13,11]],[[7351,2589],[14,25],[6,12],[6,12]],[[7468,2570],[-15,-22]],[[7403,2476],[-29,22],[-26,19],[-1,1],[-13,10],[-20,14]],[[7314,2542],[13,15],[12,16],[12,16]],[[7436,2524],[-21,-32],[-12,-16]],[[7395,2464],[-13,-20]],[[7382,2444],[-91,69]],[[7403,2476],[-8,-12]],[[7346,2393],[-89,66]],[[7267,2476],[90,-67]],[[7357,2409],[-11,-16]],[[7346,2393],[-9,-12],[-9,-8]],[[7328,2373],[-14,11],[-59,43],[-10,8]],[[7310,2357],[-3,3],[-16,12],[-14,10],[-16,12],[-10,8],[-9,6],[-8,7]],[[7328,2373],[-6,-6],[-2,-2],[-2,-2],[-2,-1],[-2,-1],[-4,-3],[0,-1]],[[7310,2357],[-3,-2],[-1,0],[0,-1],[-6,-5],[-17,-15]],[[7283,2334],[-11,7],[-47,35],[-9,7]],[[7216,2383],[-10,7],[-22,17],[-10,7]],[[7174,2414],[-33,25]],[[7179,2245],[-3,1],[-11,9],[-14,9]],[[7151,2264],[6,10],[6,11],[10,19],[11,20],[5,9],[5,10],[11,20],[11,20]],[[7283,2334],[-18,-15],[-18,-15]],[[7247,2304],[-8,-8],[-9,-7],[-17,-14]],[[7213,2275],[-17,-15],[-17,-15]],[[6740,2142],[-10,-22]],[[6730,2120],[-11,-5],[-56,36],[-17,-7]],[[6646,2144],[11,23]],[[6657,2167],[10,22]],[[6667,2189],[73,-47]],[[6667,2189],[9,19],[9,19],[9,19]],[[6694,2246],[74,-47]],[[6768,2199],[-10,-19]],[[6758,2180],[-9,-19],[-9,-19]],[[6792,2242],[-10,-12],[-5,-11],[-9,-20]],[[6694,2246],[10,20],[9,19]],[[7502,7769],[-14,21],[-21,35],[3,2],[14,13],[-22,33],[7,8],[9,10],[15,14],[11,12],[15,21],[9,12],[9,14]],[[7537,7964],[13,-10],[4,-5],[3,-4],[2,-5],[1,-6],[0,-10],[-2,-9],[11,-8],[5,-9],[-11,-21],[-1,-5],[1,-3],[6,-9]],[[7569,7860],[-3,-2],[-17,-15],[-22,-19],[-10,-8],[9,-14],[6,-8]],[[7532,7794],[-14,-12],[-16,-13]],[[7452,7720],[-2,3],[-50,77]],[[7400,7800],[-10,11]],[[7390,7811],[6,6],[24,27],[6,5],[21,27],[14,15],[10,8],[10,10],[5,6],[19,25],[11,18],[8,14],[4,5],[4,6],[3,6],[4,14],[1,2]],[[7540,8005],[-3,-41]],[[7502,7769],[3,-4],[-17,-14]],[[7488,7751],[-16,-14],[-18,-15],[-2,-2]],[[7427,7998],[5,-4],[4,0],[1,1],[3,4],[11,15],[11,12],[12,9],[10,3],[12,0],[7,5],[9,3],[-1,-8],[-10,-14],[-17,-18],[-10,-14],[-13,-9],[-9,-9],[-9,-12],[-23,-6],[-8,-9],[-8,-4],[-10,0],[-10,-2],[-9,-12],[0,-9],[7,-5],[14,3],[11,9],[11,7],[10,5],[4,0],[-1,-4],[3,1],[-2,-4],[-5,-7],[-5,-5],[-15,-13],[-22,-12],[-3,-5],[-5,-3],[-14,-1],[-15,3],[-12,7],[-2,4],[-3,5],[0,8],[3,7],[13,17],[12,8],[12,14],[5,10],[5,17],[7,2],[9,8],[5,13],[22,27],[25,22],[4,9],[7,10],[10,8],[5,6],[3,0],[2,-8],[-4,-6],[-16,-17],[-12,-16],[-18,-32],[-3,-14]],[[7413,7680],[-3,2],[-3,2],[-18,12],[-5,6],[-17,26]],[[7367,7728],[-11,19],[12,12],[6,7],[4,5],[11,14],[11,15]],[[7452,7720],[-2,-2],[-11,-10],[-11,-11],[-15,-17]],[[7382,7644],[-3,4],[-29,-34]],[[7350,7614],[-14,22]],[[7336,7636],[7,9],[7,8],[15,17],[-23,35],[3,3],[5,5]],[[7350,7713],[17,15]],[[7413,7680],[-3,-3],[-28,-33]],[[8063,8419],[-14,-13],[-26,41],[-2,4],[-2,6],[-9,15],[-18,-17]],[[7992,8455],[-50,-44],[-12,-9]],[[7930,8402],[-13,-10],[-22,-18],[-4,-5],[-14,-23],[-15,-24]],[[7862,8322],[-14,13]],[[7848,8335],[4,5],[8,10],[6,10],[12,10],[3,8],[2,3],[15,14],[16,5],[13,15],[12,5],[25,18],[9,10],[8,7],[3,7],[3,1],[6,1],[3,6],[7,10],[8,5],[8,11],[17,14],[5,8],[7,13],[2,7],[5,24],[5,7],[8,5],[18,2],[5,1],[3,1]],[[8094,8578],[1,-3],[4,-4],[4,-6],[14,-24],[-9,-6],[17,-26],[15,-25]],[[8140,8484],[-13,-11],[-22,-18],[-15,-13],[-14,-12],[-13,-11]],[[8030,8317],[-13,-18]],[[8017,8299],[-2,3],[-32,48],[-12,-13],[-1,2],[-16,24],[-2,10],[-10,14],[-7,7],[-5,8]],[[7992,8455],[40,-63],[-16,-14],[-17,-14],[29,-44],[2,-3]],[[8063,8419],[26,-40],[2,-3]],[[8091,8376],[-15,-13],[-16,-13],[-9,-8],[-8,-8],[-4,-5],[-5,-6],[-4,-6]],[[8076,8241],[-14,-14]],[[8062,8227],[-45,72]],[[8091,8376],[26,-41]],[[8117,8335],[-15,-13],[-17,-13],[-16,-15],[-17,-14],[24,-39]],[[8117,8335],[50,-79]],[[8167,8256],[-15,-13],[-17,-13],[-7,-7]],[[8128,8223],[-22,-20],[-3,0],[-2,1],[-10,15],[-14,21],[-1,1]],[[8180,8268],[-13,-12]],[[8117,8335],[13,11],[13,11],[16,14],[21,18],[12,11]],[[8192,8400],[49,-78]],[[8241,8322],[-12,-11],[-21,-18],[-15,-14],[-13,-11]],[[8140,8484],[24,-40],[3,-4],[25,-40]],[[8140,8484],[14,13],[15,12],[18,16],[13,11],[12,10],[24,-41],[2,-3]],[[8238,8502],[24,-41],[-8,-8]],[[8254,8453],[-14,-12],[-17,-15],[-16,-13],[-15,-13]],[[8254,8453],[47,-79]],[[8301,8374],[-12,-10],[-18,-16],[-15,-14],[-15,-12]],[[6673,3425],[-3,-2],[-12,6],[-23,11],[-19,9],[-21,10]],[[6595,3459],[13,37],[3,9]],[[6611,3505],[7,19],[13,37],[19,54]],[[6650,3615],[12,1],[3,0],[13,1],[45,-21],[-2,-5],[-2,-6],[-8,-14],[-6,-12],[13,-6]],[[6718,3553],[-20,-11],[-2,-17],[-2,-9],[-5,-15],[-3,-10],[-3,-4],[-3,-2],[-6,-1],[19,-10],[-18,-32],[1,-14],[0,-2]],[[6676,3426],[-3,-1]],[[6489,3426],[17,50],[0,6],[0,3],[7,6],[18,53]],[[6531,3544],[18,-9],[19,-10],[20,-9],[23,-11]],[[6595,3459],[-25,-70],[-2,0],[-20,11],[-20,9],[-19,8],[-20,9]],[[6673,3425],[2,-3],[3,-2],[-4,-6],[-4,-10],[-5,-9],[-13,-24],[-21,-38]],[[6631,3333],[-3,2],[-1,0],[-22,11],[-32,15],[-91,42]],[[6482,3403],[7,23]],[[6482,3403],[-22,10],[-20,9],[-25,11],[-25,12]],[[6390,3445],[35,98]],[[6425,3543],[24,-12],[5,-2],[4,-2],[4,-2],[4,-5],[5,-8],[19,52],[19,-10],[22,-10]],[[6631,3333],[-15,-27],[-6,-10]],[[6610,3296],[-89,76],[-34,17],[-5,-3]],[[6482,3386],[-88,-16],[-67,32],[-4,-14]],[[6323,3388],[-9,4],[6,22],[12,33],[16,-7],[1,11],[2,12]],[[6351,3463],[18,-9],[21,-9]],[[6351,3463],[-28,13],[-15,7]],[[6308,3483],[8,23],[8,24],[0,4],[0,5],[-1,3],[-2,2],[-3,6],[0,3],[0,2],[15,36],[4,9],[5,12],[4,0],[6,2],[3,1],[5,-3],[1,-4],[2,-3],[11,-24],[1,-3],[6,-13],[20,-10]],[[6401,3555],[24,-12]],[[6551,3599],[-20,-55]],[[6401,3555],[12,32],[-6,11],[-2,3],[-7,18],[0,2],[0,2],[1,2],[1,3],[-2,1],[-2,0],[-3,1],[-2,2],[-7,16]],[[6384,3648],[24,16],[20,12],[7,4],[4,4],[8,7]],[[6447,3691],[0,-5],[2,-6],[1,-3],[3,-4],[2,-3],[4,-3],[13,-7],[6,-12],[1,-3],[7,-14],[23,-12],[21,-10],[21,-10]],[[6308,3483],[-3,1],[-25,12],[-8,5],[-2,1],[-2,2]],[[6268,3504],[2,6],[4,12],[2,3],[1,4],[4,11],[2,4],[6,16],[1,2],[1,3],[7,17],[6,16],[8,22],[7,18],[24,62],[5,13],[1,3],[1,5],[1,2],[1,3],[2,4],[8,22],[13,31],[2,4],[6,15],[0,1],[14,33],[2,7],[13,31],[4,10],[5,12]],[[6421,3896],[1,-1]],[[6422,3895],[3,-1],[-9,-22],[-13,-31]],[[6403,3841],[-12,-27],[-12,-33]],[[6379,3781],[-13,-31],[-12,-33],[18,-9],[-25,-61],[-2,-7],[0,-8],[5,-1],[2,-3],[32,20]],[[5790,4258],[-10,12],[7,5],[18,10],[-11,19],[-12,19]],[[5782,4323],[19,15],[18,21],[-15,13],[12,16]],[[5816,4388],[62,-54],[-10,-18],[-8,-13],[-9,0],[-36,-35],[-1,-6],[-24,-4]],[[7151,2264],[-41,31]],[[7110,2295],[5,11],[6,10],[11,19]],[[7132,2335],[10,20],[11,19]],[[7153,2374],[11,20],[10,20]],[[7179,2245],[-16,-13]],[[7163,2232],[-4,-4],[-13,-10],[-11,-9],[-5,-5]],[[7130,2204],[-18,-14]],[[7112,2190],[-14,11],[-20,15],[-8,6]],[[7070,2222],[6,10],[8,15],[7,13],[7,13],[6,12],[6,10]],[[7230,2182],[-54,40],[-5,4],[-6,4],[-2,2]],[[7179,2245],[3,-1],[5,-4],[59,-44]],[[7246,2196],[-8,-7],[-8,-7]],[[7197,2154],[-4,4],[-51,37],[-5,3],[-7,6]],[[7230,2182],[-9,-7],[-8,-7],[-16,-14]],[[7180,2140],[-59,44],[-9,6]],[[7197,2154],[-7,-7],[-10,-7]],[[7160,2125],[-50,37],[-7,6],[-8,6]],[[7095,2174],[17,16]],[[7180,2140],[-7,-4],[-4,-3],[-9,-8]],[[7120,2091],[-65,48]],[[7055,2139],[22,19],[18,16]],[[7160,2125],[-10,-8],[-8,-7],[-22,-19]],[[7055,2139],[-21,16]],[[7034,2155],[13,25],[11,21]],[[7058,2201],[12,21]],[[7005,2096],[-46,33]],[[6959,2129],[11,21],[11,21],[12,21]],[[6993,2192],[5,-7],[3,-6],[33,-24]],[[7055,2139],[-15,-13],[-12,-11]],[[7028,2115],[-7,-6],[-7,-5],[-4,-3],[-5,-5]],[[7120,2091],[-27,-24]],[[7093,2067],[-65,48]],[[7093,2067],[-21,-21],[-67,50]],[[7016,1990],[-5,4]],[[7011,1994],[2,2],[42,36],[-23,16],[-9,-8],[-7,-6],[-18,14],[16,14],[-10,8],[-16,11]],[[6988,2081],[17,15]],[[7246,2196],[5,-3]],[[7251,2193],[-17,-14],[-33,-28],[-17,-15],[-15,-13],[-3,-2],[-17,-15],[-21,-18],[-2,-1]],[[7126,2087],[-27,-24],[-23,-20],[-17,-15],[-41,-36],[-2,-2]],[[6950,1933],[-6,3]],[[6944,1936],[16,15]],[[6960,1951],[18,14],[-68,44],[-4,0]],[[6906,2009],[37,33]],[[6943,2042],[7,-3],[10,-8],[14,-10],[4,-3],[2,-1],[11,-8],[20,-15]],[[7016,1990],[-3,-2],[-25,-22],[-38,-33]],[[6960,1951],[-69,45]],[[6891,1996],[15,13]],[[6944,1936],[-38,-33]],[[6906,1903],[-70,45]],[[6836,1948],[8,7]],[[6844,1955],[21,18],[9,8],[11,10]],[[6885,1991],[6,5]],[[8658,1867],[-4,5],[-21,28]],[[8633,1900],[10,11],[7,9]],[[8650,1920],[11,-9],[8,-4],[7,16],[6,15],[8,-3],[7,-4],[6,-6],[4,-2],[5,-2],[-4,-23],[-1,-8],[-6,-15],[-30,7],[-11,-12],[-2,-3]],[[8688,1948],[-25,10]],[[8663,1958],[12,57]],[[8675,2015],[10,-5],[8,-7],[-8,-44],[6,-2],[-3,-9]],[[8675,2015],[-31,9],[-1,3],[-3,1],[-3,-2],[-7,5],[-15,7]],[[8615,2038],[5,12],[4,11],[3,9],[2,7],[1,10],[-1,14],[1,4],[-1,0],[0,-1],[-1,0],[-1,0],[-1,0],[-1,0],[-1,1],[-1,1],[-1,2],[0,1],[0,2],[1,2],[0,1],[1,1],[-2,4],[-11,23],[-10,20],[-5,11],[-1,0],[-1,1],[-2,1],[-1,2],[-1,3]],[[8590,2180],[1,2],[0,1],[1,2],[2,1],[-2,12],[-1,3],[1,3],[0,3],[2,7],[3,10],[3,10],[3,7],[2,5],[4,7],[7,13],[2,3],[2,5],[1,0],[3,-1],[2,5],[17,33],[11,21],[4,9],[2,0],[12,27],[6,14],[3,8],[2,4]],[[8683,2394],[4,0],[7,2],[30,17],[8,1],[18,2],[3,3],[1,-4],[3,-8],[10,-7],[2,-2],[2,-8],[5,-12],[5,-8],[5,-12],[5,-12],[1,-6],[7,-8],[9,-12],[4,-12],[6,-11],[5,-14],[3,-11],[5,-7],[4,-3],[1,-5],[0,-6],[3,-6],[4,-2]],[[8843,2243],[-17,2],[0,-4],[1,-4],[-1,-8],[-1,-5],[-1,-5],[-3,-9],[-2,-6],[-4,-8],[-3,-4],[-5,-7],[-6,-5],[-5,-5]],[[8796,2175],[-10,-7],[-9,-4],[-12,-5],[-9,-4],[5,-14],[1,-8],[-1,-6],[0,-3],[-1,-3]],[[8760,2121],[-1,-4],[0,-2],[-2,-3],[-1,-4],[-8,-10],[-6,-6],[-10,15],[-6,18],[-24,-10],[3,-10],[15,-18],[6,-9],[-7,-6],[-5,-4],[-6,-6],[-14,-11],[-8,-11],[-7,-12],[-4,-13]],[[8796,2175],[4,-5],[11,-14],[15,-15],[0,-3],[-2,-4],[-8,-10],[-5,-4],[-2,-2],[-2,-2],[-2,-4],[-10,-15],[-3,-1],[-3,2],[-13,9],[-11,10],[-2,0],[-3,4]],[[6818,2142],[-60,38]],[[6865,2225],[-23,-40],[-14,-25],[-10,-18]],[[6878,2090],[-15,-27]],[[6863,2063],[-16,10],[16,29],[-14,15],[-14,14],[-17,11]],[[6865,2225],[62,-44],[-11,-21]],[[6916,2160],[-11,-20],[-27,-50]],[[6959,2129],[-43,31]],[[6888,2268],[62,-45]],[[6950,2223],[43,-31]],[[6988,2081],[-45,-39]],[[6943,2042],[-17,13],[-48,35]],[[6950,2223],[11,21],[11,20]],[[6972,2264],[86,-63]],[[6909,2311],[10,-7],[43,-32],[10,-8]],[[6999,2314],[-1,-3],[-12,-22],[-2,-3],[-12,-22]],[[7024,2359],[86,-64]],[[7046,2399],[86,-64]],[[7068,2438],[85,-64]],[[6694,2246],[-72,47]],[[6622,2293],[6,15],[3,5],[9,20]],[[6640,2333],[73,-48]],[[6640,2333],[-33,22]],[[6607,2355],[20,15],[3,4],[8,6]],[[6638,2380],[9,6],[4,4],[10,8],[3,3],[15,16],[3,2]],[[6603,2255],[-48,31],[-1,1]],[[6554,2287],[4,5]],[[6558,2292],[9,12],[13,17]],[[6580,2321],[19,24]],[[6599,2345],[8,10]],[[6622,2293],[-10,-19],[-9,-19]],[[6599,2345],[-2,3],[-58,43],[11,19],[8,16],[3,5]],[[6561,2431],[77,-51]],[[6580,2321],[1,5],[-54,41]],[[6527,2367],[-70,50]],[[6457,2417],[12,24],[11,19],[8,15],[4,8]],[[6492,2483],[69,-52]],[[6492,2483],[17,30]],[[6509,2513],[14,26]],[[6523,2539],[13,-10],[22,-17],[-3,-12],[-2,-11],[24,-3],[12,-3],[9,-4],[8,-6],[22,-18],[11,-5],[10,-8],[33,-23]],[[6523,2539],[37,68]],[[6560,2607],[34,-26]],[[6594,2581],[35,-25],[-2,-5],[-5,-8],[-5,-11],[21,-17],[24,-14],[15,-7]],[[6594,2581],[13,23],[13,24],[13,24],[36,-26]],[[6560,2607],[6,10],[4,8],[1,10],[-2,30],[0,2],[0,18]],[[6569,2685],[1,6],[2,5],[1,5],[2,3],[9,17],[13,24],[10,18],[1,2],[0,2],[13,23]],[[6621,2790],[62,-46]],[[6621,2790],[12,22],[13,24]],[[6646,2836],[23,-18],[30,-22],[9,-7]],[[6621,2790],[-62,47]],[[6559,2837],[12,22],[13,23]],[[6584,2882],[53,-40],[9,-6]],[[6584,2882],[10,19],[6,10]],[[6600,2911],[20,-15],[21,-16],[6,11],[3,6],[5,9],[21,-15]],[[6676,2891],[-5,-10],[-3,-5],[-6,-11],[-6,-10],[-10,-19]],[[6679,2898],[-2,-3],[-1,-4]],[[6600,2911],[-18,14],[-18,12],[-17,14]],[[6547,2951],[9,16],[4,7]],[[6560,2974],[2,2],[2,1],[3,3]],[[6567,2980],[6,-4],[18,-13],[10,-7],[1,-1],[5,-4],[9,-6]],[[6616,2945],[32,-23],[11,-9],[20,-15]],[[6616,2945],[2,4],[8,18],[10,18],[5,8],[11,9]],[[6652,3002],[24,-17],[19,-14],[18,-14]],[[6713,2957],[-9,-10],[-6,-9]],[[6698,2938],[-9,-18],[-9,-18],[-1,-4]],[[6567,2980],[1,1],[2,2],[10,18],[10,18],[12,21]],[[6602,3040],[40,-30],[10,-8]],[[6741,2852],[-1,1],[-61,45]],[[6698,2938],[63,-47]],[[8269,3639],[9,-6]],[[8278,3633],[-10,-19],[-3,-5],[-3,-6],[-8,-16],[-9,-15]],[[8245,3572],[-30,24],[-29,22],[-26,20],[-27,21]],[[8133,3659],[4,18]],[[8137,3677],[5,16]],[[8142,3693],[4,14]],[[8146,3707],[6,20]],[[8152,3727],[18,-14],[30,-22]],[[8200,3691],[-4,-22],[-6,-32],[34,-26]],[[8224,3611],[14,-11],[2,-2],[9,16],[1,1],[9,7],[2,2],[8,15]],[[8224,3611],[1,2],[23,42],[19,35]],[[8267,3690],[13,-11],[-10,-19],[-5,-17],[1,-1],[2,-1],[1,-2]],[[8200,3691],[9,42],[2,-1],[27,-21],[16,-12],[13,-9]],[[5608,4321],[12,16],[2,0],[1,1],[-1,1],[4,5]],[[5626,4344],[4,5]],[[5630,4349],[5,-5],[-11,-17],[33,-32],[8,18],[7,13]],[[5672,4326],[43,-45],[2,-2],[10,20]],[[5727,4299],[12,-13],[-3,-5],[-1,-4],[-2,-4],[-2,-3],[-1,-4],[-2,-4],[0,-3],[2,-1],[12,-2],[2,0],[2,5],[2,3],[1,3],[3,5],[16,-16],[22,2]],[[5816,4388],[11,17],[12,24],[2,4]],[[5841,4433],[51,-38],[13,-10],[3,-3]],[[5908,4382],[-1,-4]],[[5907,4378],[-7,-18],[-5,-12],[-29,-75]],[[5866,4273],[-4,-1],[-10,-4],[-19,-8],[-5,-1],[-3,-2],[-4,-1],[-4,-1]],[[5817,4255],[-5,-1],[-3,-1],[-4,-1],[-4,-1],[-5,-1],[-4,-1],[-3,0],[-4,-1],[-4,0],[-5,0],[-3,-1],[-6,0],[-5,0],[-7,0],[-7,1],[-6,0],[-6,1],[-4,1],[-4,0],[-4,1],[-5,1],[-5,2],[-4,1],[-4,1],[-10,3],[-4,2],[-4,1],[-6,3],[-5,2],[-4,3],[-4,2],[-4,2],[-3,2],[-8,4],[-4,4],[-4,2],[-3,2],[-3,3],[-3,2],[-3,3],[-3,3],[-3,2],[-10,10],[-10,10]],[[5727,4299],[3,8],[7,9],[5,4],[11,6]],[[5753,4326],[20,14]],[[5773,4340],[9,-17]],[[5672,4326],[9,20],[10,18]],[[5691,4364],[12,16],[29,-30],[18,-19],[2,-2],[1,-3]],[[5691,4364],[-13,14],[-15,14]],[[5663,4392],[47,61]],[[5710,4453],[13,-11],[15,-12],[31,-28],[-11,-17],[-12,-18],[23,-23],[2,-1],[2,-3]],[[5630,4349],[10,12],[12,16]],[[5652,4377],[11,15]],[[5652,4377],[-54,56]],[[5598,4433],[12,15]],[[5610,4448],[27,-28],[12,16],[19,27],[14,-12],[12,17],[16,-15]],[[9686,9775],[-1,-1],[-1,-1],[-36,-32],[-3,-2],[-2,-2],[-6,-6],[-7,-7],[-4,-5],[-5,-6],[-7,-10],[-6,-8],[-6,-11],[-2,-5]],[[9600,9679],[-4,-9],[-4,-10],[-4,-12],[-5,-26],[-1,-3],[-1,-6],[-7,-33]],[[9574,9580],[-6,-27],[-7,-25],[-4,-16],[-6,-28],[-16,-74],[-14,-65],[-10,-51]],[[9511,9294],[-10,-47],[-14,-67]],[[9487,9180],[-14,-68]],[[9473,9112],[-11,-50]],[[9462,9062],[-4,-1],[-8,-3],[-183,-67],[-130,-40]],[[9137,8951],[0,6],[1,6],[0,5],[1,6],[1,5],[0,5],[1,4],[1,9],[2,7],[2,12],[2,6],[1,6],[4,13],[6,23],[116,418],[29,103],[2,7],[22,78],[2,9],[1,4],[3,13],[2,7],[1,4],[1,9],[2,9],[0,4],[1,6],[1,4],[1,10],[0,6],[0,4],[1,3],[0,7],[0,41],[-3,0],[0,1],[0,12],[0,5],[0,6],[0,4]],[[9341,9838],[4,1],[6,2],[19,6],[6,2],[11,5],[8,3],[28,4],[5,-1],[4,-2],[2,-2],[3,-3],[2,-5],[2,-5],[3,-13],[5,-12],[2,-10],[1,-3],[1,-8],[5,-9],[10,-10],[14,-9],[11,-4],[9,0],[13,3],[13,-22],[2,-3],[9,-15],[3,-3],[2,0],[2,0],[32,13],[4,1],[-13,20],[11,9],[2,4],[-1,4],[-5,13],[14,3],[9,2],[9,3],[9,2],[5,0],[3,-1],[10,-2],[45,-12],[14,8],[1,0],[1,-1],[1,-1],[3,-4]],[[9700,9786],[-2,-2],[-10,-8],[-2,-1]],[[9673,9553],[-5,-24]],[[9668,9529],[-1,-3],[-1,-5],[-1,-11],[-2,-10],[-2,-17],[-2,-12],[-2,-12],[0,-9],[-7,-140]],[[9650,9310],[-30,-15],[-41,-6],[-36,1],[-32,4]],[[9574,9580],[37,-11],[1,9],[4,16],[5,23],[34,-9],[20,-6]],[[9675,9602],[-6,-33],[-3,-14],[7,-2]],[[9853,9901],[0,-3],[-1,-13],[-3,-13],[-6,-23],[-2,-5],[-1,-5],[-1,-6],[0,-3],[0,-2],[0,-1],[0,-1],[0,-1],[-1,-1],[-1,-1],[-1,-2],[-1,0],[-1,-1],[-1,0],[-1,1],[-1,0],[-1,1],[-1,2],[-1,1],[-1,0],[-2,0],[-2,1],[-2,0],[-2,-1],[-10,-2]],[[9809,9823],[-43,-11]],[[9766,9812],[-3,-1],[-11,-2],[-20,-6],[-14,-6],[-11,-6],[-5,-4],[-2,-1]],[[9341,9838],[0,1],[1,5],[0,5]],[[9342,9849],[3,0],[6,-1],[14,2],[12,4],[8,6],[9,3],[25,1],[8,2],[4,-1],[12,1],[15,-6],[8,2],[3,-1],[4,-4],[0,-5],[9,1],[4,-2],[4,-2],[3,-5],[2,-6],[6,-32],[2,-6],[1,-1],[4,-4],[8,-1],[3,0],[3,0],[4,0],[8,-4],[1,-4],[-4,-3],[-4,-1],[-4,0],[-4,-2],[-1,-1],[1,-1],[3,0],[2,0],[6,1],[11,5],[23,14],[8,2],[11,3],[5,4],[6,5],[4,1],[12,-1],[7,4],[14,13],[9,1],[8,4],[5,3],[8,8],[3,1],[6,2],[5,5],[7,2],[8,6],[5,1],[13,8],[16,10],[21,8],[9,10],[5,5],[3,0],[10,-2],[8,2],[8,4],[7,1],[8,4],[2,2],[6,6],[2,0],[8,-4],[5,1],[3,2],[5,6],[3,2],[8,1],[5,3]],[[9850,9931],[1,-16],[1,-5],[1,-9]],[[9667,9996],[2,-4],[4,0],[4,-1],[2,-3],[-3,-7],[1,-14],[-2,-9],[-4,-1],[-5,0],[-6,-3],[-15,-10],[-7,-7],[-6,-3],[-6,-10],[-12,-9],[-4,-4],[-4,-7],[-3,-5],[-6,0],[-1,2],[0,7],[-1,4],[-3,-1],[-1,-9],[-5,-19],[-3,-8],[-14,-13],[-6,-4],[-6,-1],[-14,3],[-22,9],[-2,4],[-1,4],[-1,4],[1,6],[1,4],[0,5],[1,5],[-2,7],[-2,5],[-1,7],[1,7],[5,2],[11,6],[5,6],[-1,5],[3,5],[7,1],[9,0],[9,2],[8,4],[6,4],[18,4],[19,8],[10,2],[6,5],[1,1],[13,12],[15,5],[4,0],[3,-3]],[[9455,8069],[-41,10]],[[9414,8079],[-42,11]],[[9372,8090],[5,21],[4,21],[4,21],[-24,6],[0,9],[-1,9],[8,1],[23,-6],[2,0],[1,2],[6,26]],[[9400,8200],[4,-1],[14,-7],[4,8],[7,12],[5,7],[6,6],[6,10],[1,3]],[[9447,8238],[20,-5]],[[9467,8233],[-4,-9],[-8,-12],[-9,-9],[-2,-3],[-4,-7],[15,-8],[1,-3],[-3,-5],[-3,-8],[-5,-28],[0,-3],[2,-1],[7,-2],[13,-1],[-1,-9],[-3,-15],[-4,-21],[-4,-20]],[[9563,8153],[-7,8],[-15,4],[-9,-47],[-1,-2],[-4,0],[-18,5],[-5,-21],[-4,-21],[-4,-21]],[[9496,8058],[-41,11]],[[9467,8233],[3,11],[1,8],[3,12],[1,5]],[[9475,8269],[22,-6],[15,-4],[18,-4],[15,-4],[49,-12],[24,-6],[2,-1]],[[9619,8026],[-41,11],[-41,11]],[[9537,8048],[-41,10]],[[9562,7952],[-42,11]],[[9520,7963],[-41,10],[4,20],[4,21],[5,23],[4,21]],[[9537,8048],[-4,-21],[-5,-24],[42,-10],[-4,-21],[-4,-20]],[[9615,8005],[-4,-23],[-4,-21],[-4,-19],[-41,10]],[[9569,7926],[-56,15]],[[9513,7941],[7,22]],[[8590,2180],[-19,-7],[-12,-5],[-11,-4],[-6,-4],[-4,-5],[-3,-3],[-3,-4]],[[8532,2148],[-14,-17],[-5,-4],[-10,-5],[-7,-2],[-6,0],[-15,2]],[[8475,2122],[-9,1],[-8,-2],[-11,-4],[-8,-8],[-4,-8],[-3,-10],[-1,-8],[1,-29],[0,-9],[0,-4],[0,-6]],[[8432,2035],[-2,-6],[-4,-16],[-8,-24],[0,-5],[-1,-9],[0,-5],[0,-3],[2,-1],[3,-2],[7,-4],[7,-1],[11,-1]],[[8447,1958],[0,-10],[-4,-7],[-6,-3],[-4,-4],[-2,-3],[-3,-4],[-2,-5],[-1,-4],[-2,-9],[1,-9],[-1,-10],[-3,-6],[-5,-6],[-1,-3],[-1,-3],[-1,-2],[-1,-3],[0,-3],[0,-8],[4,-8]],[[8415,1848],[-48,25]],[[8367,1873],[9,30],[4,12],[7,32],[3,60],[5,36],[1,42],[1,35],[5,12],[8,16],[4,6],[21,15],[3,0],[27,6],[9,2],[19,0],[2,2],[5,7],[13,16],[7,6],[27,24],[8,11],[3,4],[4,5],[0,8],[2,6],[4,2],[3,6],[2,5],[1,4],[7,7],[6,3],[6,8],[12,6],[21,11],[7,9],[3,11],[8,12],[3,7],[5,4],[8,8],[4,7],[1,4],[6,12],[4,5],[4,-2],[1,-1],[3,0]],[[8475,2122],[-3,-41],[-18,1],[-2,-25],[0,-17],[-1,-3],[-3,-3],[-4,0],[-12,1]],[[8489,1978],[2,-2],[1,-3],[-1,-17]],[[8491,1956],[-4,0],[-40,2]],[[8532,2148],[4,-7],[-2,-3],[-7,-7],[-3,-6],[2,-8],[2,-9],[3,-16],[2,-9],[13,-9],[-5,-8],[-3,0],[0,-1],[1,-2],[0,-1],[-1,-3],[-2,-1],[-2,-1],[-2,-2],[-3,-1],[-6,-2],[-12,-2],[-11,-2],[-2,-1],[-2,-1],[-5,-7],[0,-14],[-1,-18],[-12,0],[0,-6],[11,0],[0,-23]],[[8615,2038],[-12,-6],[-1,3],[-16,12],[-4,0],[-11,-19],[-7,-12],[-1,-4],[2,-13],[0,-4],[-3,-3],[-2,-2],[-16,-4],[-17,-5],[-10,-2],[-9,-1],[-19,0]],[[8615,2038],[-20,-48],[-2,-7],[0,-8],[0,-10],[5,-13],[6,-10],[3,-7],[1,-2]],[[8608,1933],[-7,8],[-4,3],[-4,3],[-9,3],[-4,2],[-5,1],[-4,2],[-6,1],[-5,0],[0,-3],[0,-8],[0,-9],[0,-1],[-3,-7],[-3,-5],[-3,-4],[-5,6],[-7,9],[-3,1],[-2,0],[-2,1],[-2,0],[-12,1],[-7,0],[-23,1]],[[8488,1938],[2,2],[1,16]],[[8663,1958],[-1,-5],[0,-5],[-5,-13],[-7,-15]],[[8633,1900],[-16,20],[-9,13]],[[8633,1900],[-4,-3],[-26,-30],[-9,-10]],[[8594,1857],[-5,7],[-27,-13],[-8,8],[-39,-31],[0,-6]],[[8515,1822],[-100,26]],[[8415,1848],[27,20],[12,8],[5,4],[5,4],[5,5],[11,-16],[2,-1],[2,0],[2,2],[7,9],[2,2],[-1,3],[-2,4],[-11,16],[2,6],[3,8],[1,8],[1,8]],[[8633,1765],[-26,-29],[-10,-17],[-11,-16]],[[8586,1703],[-3,3],[-18,21],[-10,12],[-25,31],[13,16],[-24,28],[-5,5],[1,3]],[[8594,1857],[5,-6],[-1,-33],[5,-17],[27,-33],[3,-3]],[[8658,1867],[3,-7],[3,-8],[2,-9],[1,-12],[0,-11],[-3,-11],[-3,-7],[-6,-11],[-9,-11],[-13,-15]],[[8741,2856],[7,-18],[4,-4],[6,-10],[10,-20],[6,-18],[3,-18],[0,-32],[-44,-209],[-13,-38],[-6,-1],[-2,0],[-4,-1],[-3,-1],[-5,-3],[-18,-18],[-14,-16],[-12,-14],[-7,-8],[-13,-9],[-34,-29],[-59,-44],[-61,-48],[0,-5],[-1,0],[-5,-4],[-13,-11],[-27,-15],[-31,-10],[-6,-2],[-6,0],[-9,1],[-47,39],[-3,0],[0,-3],[26,-22],[13,-12],[1,-2],[12,-7],[9,-1],[-2,-5],[-7,-8],[-6,-5]],[[8260,2321],[2,5]],[[8262,2326],[1,2],[1,3],[7,14]],[[8271,2345],[9,20]],[[8280,2365],[10,23],[12,25],[11,23]],[[8313,2436],[10,27]],[[8323,2463],[4,-3],[17,-9],[19,-11],[12,31],[15,39]],[[8390,2510],[1,-2],[18,0],[85,-4],[23,17],[5,6],[1,8],[1,19],[-36,0],[-29,1]],[[8459,2555],[0,23]],[[8459,2578],[0,22],[0,11],[0,12],[0,17],[0,1],[-1,1],[-59,1],[0,-18],[1,-1]],[[8400,2624],[-42,0],[-5,0]],[[8353,2624],[0,7],[1,13]],[[8354,2644],[1,15],[1,5],[2,7],[4,40],[1,5],[2,19]],[[8365,2735],[4,31],[5,49],[1,3],[0,3],[0,3]],[[8375,2824],[42,-6],[58,-10],[41,-6],[28,-4],[18,2],[12,2],[27,11],[4,1],[5,2],[5,1],[3,1],[2,1],[15,3],[16,4],[12,2],[12,3],[12,3],[6,2],[7,2],[8,5],[6,3],[3,2],[3,1],[1,1],[2,1]],[[8723,2851],[2,1],[3,-3],[13,7]],[[9137,3084],[1,1]],[[9138,3085],[2,-5],[-1,-2],[-1,1],[-1,5]],[[8390,2510],[5,12],[4,12]],[[8399,2534],[42,-1],[17,0],[1,22]],[[8399,2534],[0,11],[0,11]],[[8399,2556],[0,11],[0,12]],[[8399,2579],[32,-1],[28,0]],[[8312,3700],[-8,-17],[-8,-15],[-10,-20],[-8,-15]],[[8152,3727],[4,19]],[[8156,3746],[7,23],[5,21],[4,15]],[[8172,3805],[11,-8],[21,-16],[13,-9],[37,-28],[1,-1],[28,-21],[9,-7],[3,-2],[9,-7],[8,-6]],[[7761,6574],[-73,54],[-19,-32],[-22,-41],[-14,11]],[[7633,6566],[-16,12],[-22,17],[-21,18],[-2,2]],[[7572,6615],[-3,2],[-11,11],[-8,9],[-13,12],[-9,9],[-17,17]],[[7511,6675],[25,23],[10,9],[28,24],[24,17],[42,29],[13,11]],[[7653,6788],[5,-4],[17,-12],[67,-46]],[[7742,6726],[52,-35],[23,-16]],[[7817,6675],[-1,-3],[-10,-16],[-22,-42],[-23,-40]],[[7720,6501],[-1,-3],[-10,-18],[-14,11],[-4,-1],[-21,-40],[-17,13],[-11,-19]],[[7642,6444],[-8,-9]],[[7634,6435],[-14,16],[7,9],[10,14],[22,40],[-1,4],[-14,10]],[[7644,6528],[-18,14],[-2,1],[-1,2],[0,2],[1,3],[8,14],[1,2]],[[7761,6574],[-19,-33],[-22,-40]],[[8399,2579],[1,22],[0,23]],[[8345,2556],[3,23],[3,23],[2,22]],[[8399,2556],[-26,0],[-28,0]],[[8340,2511],[3,23],[2,22]],[[8390,2510],[-8,0],[-16,0],[-14,1],[-12,0]],[[8323,2463],[10,27],[7,21]],[[8313,2436],[-14,28],[-9,18]],[[8290,2482],[-8,16]],[[8282,2498],[14,17],[2,2],[9,40],[9,0],[10,0],[10,-1],[9,0]],[[8282,2498],[-10,19]],[[8272,2517],[-9,18],[-1,3],[-2,4]],[[8260,2542],[31,39],[18,21],[16,19]],[[8325,2621],[13,10],[16,13]],[[8325,2621],[2,6],[-15,13],[-14,13]],[[8298,2653],[25,37],[13,21],[4,6],[18,27],[7,-9]],[[8298,2653],[-11,16],[-7,9]],[[8280,2678],[-7,10],[-7,9],[-13,18],[-16,22],[-14,-14]],[[8223,2723],[-18,26],[-2,3]],[[8203,2752],[19,20],[11,11],[6,4],[26,24],[3,1],[26,25],[31,30],[47,41],[4,3]],[[8376,2911],[4,-26],[0,-6],[1,-6],[-3,-25],[-3,-24]],[[8446,3301],[8,-49],[2,-4],[4,-7],[1,-2],[1,-3],[2,-32]],[[8464,3204],[-4,0],[-24,14],[-12,7],[-27,15],[-8,5],[-11,6]],[[8378,3251],[19,34],[4,7],[7,21],[11,-5],[5,-3],[22,-4]],[[8378,3251],[-15,8],[-8,5],[-14,8],[-11,6]],[[8330,3278],[-15,9],[-26,15]],[[8289,3302],[8,16],[6,12],[5,9],[5,11]],[[8313,3350],[17,32],[5,10],[3,7],[8,14],[10,22],[14,24],[6,13]],[[8376,3472],[10,-6],[8,-6],[15,-10],[23,-14],[-4,-13],[-10,-28],[13,-6],[12,-5],[5,-2]],[[8448,3382],[-3,-15],[-1,-13],[1,-32],[1,-21]],[[8505,3564],[-7,-24],[-9,-26],[-6,-19],[-3,-6],[-1,-6],[-6,-16],[-9,-23],[-4,-12],[-2,-10],[-4,-13],[-6,-27]],[[8376,3472],[21,51],[4,5],[4,8]],[[8405,3536],[15,36],[3,8],[7,21],[3,8]],[[8433,3609],[12,-9],[10,-8],[16,-12],[3,-1],[19,-7],[0,-4],[9,-4],[3,0]],[[8376,3472],[-13,10],[-3,2],[-1,1],[-4,3],[-3,2],[-4,4],[-26,19]],[[8322,3513],[7,17],[13,28],[8,20]],[[8350,3578],[25,-18],[11,-9],[4,-3],[4,-3],[11,-9]],[[8350,3578],[-16,13],[-11,8]],[[8323,3599],[9,15],[10,18],[17,32]],[[8359,3664],[23,-17],[24,-18],[11,-8],[1,-1],[4,-3],[11,-8]],[[8322,3513],[-30,23],[-4,3],[-9,7],[-9,7],[-25,19]],[[8278,3633],[23,-18],[18,-13],[4,-3]],[[8312,3700],[26,-20],[18,-13],[3,-3]],[[8121,3613],[-15,11],[-8,5],[-5,3]],[[8093,3632],[-44,32]],[[8049,3664],[6,11],[1,2],[6,10],[4,8],[5,9]],[[8071,3704],[41,-29],[21,-16]],[[8133,3659],[-4,-17],[-8,-29]],[[8074,3602],[-2,1]],[[8072,3603],[-5,4],[-35,26]],[[8032,3633],[7,13],[10,18]],[[8093,3632],[-11,-19],[-4,-7],[-4,-4]],[[8111,3574],[-9,6],[-3,3],[-25,19]],[[8121,3613],[-6,-22],[-4,-17]],[[8096,3522],[-48,37]],[[8048,3559],[8,14],[6,10]],[[8062,3583],[5,10],[5,10]],[[8111,3574],[-5,-20],[-10,-32]],[[8048,3559],[-40,31]],[[8008,3590],[13,24],[41,-31]],[[8008,3590],[-11,-20]],[[7997,3570],[-18,13],[-22,17]],[[7957,3600],[-7,8],[-3,4]],[[7947,3612],[5,5],[6,11],[2,4]],[[7960,3632],[8,-7],[11,-10],[5,-6],[7,-5],[17,-14]],[[8027,3517],[-6,5],[-21,16],[-15,12]],[[7985,3550],[-18,14],[-20,15]],[[7947,3579],[1,3],[1,3],[3,2],[1,2],[1,3],[2,3],[1,5]],[[7997,3570],[10,-8],[26,-20],[4,-3]],[[8037,3539],[2,-2]],[[8039,3537],[-5,-9],[-7,-11]],[[8006,3479],[-10,8],[-7,6],[-17,13],[-9,7]],[[7963,3513],[7,12],[-20,15],[-8,6],[-9,7]],[[7933,3553],[12,22],[2,4]],[[7985,3550],[-6,-10],[-6,-10],[8,-6],[1,-1],[12,-10],[21,-17]],[[8015,3496],[-5,-9],[-4,-8]],[[8027,3517],[-12,-21]],[[8071,3451],[-12,9],[-9,8],[-14,11],[-14,11],[-7,6]],[[8027,3517],[20,-16],[18,-14],[4,-3],[11,-8]],[[8080,3476],[-4,-11],[-5,-14]],[[8088,3499],[-8,-23]],[[8039,3537],[37,-29],[12,-9]],[[8096,3522],[-8,-23]],[[8037,3539],[5,9],[6,11]],[[8289,3302],[-6,-12],[-3,-6],[-14,-28],[-2,-3],[-6,-12],[-2,-4],[-2,-2],[-1,-2],[-2,-2],[-1,-2],[-1,-1],[0,-1],[-30,-42],[-8,-10],[-10,-13],[-15,-20]],[[8186,3142],[-2,3],[-21,16],[-12,11],[-4,3],[-22,18],[-5,6],[-4,2],[-2,3],[-2,3],[-23,18],[-7,6],[-9,7],[-10,7]],[[8063,3245],[-9,7],[-1,2],[-25,20],[-24,20],[-3,1],[-7,6],[-4,5]],[[7990,3306],[14,22],[3,5],[9,16],[11,18],[13,22],[12,20]],[[8052,3409],[11,20],[7,18],[1,4]],[[8096,3522],[9,-7],[3,-2],[11,-9],[13,-11],[13,-10],[15,-11],[23,-19]],[[8183,3453],[10,-7],[33,-27],[3,-2],[7,-6],[13,-10],[19,-15],[18,-15],[3,1],[3,-2],[2,-2],[1,0],[1,-3],[1,-1],[16,-14]],[[8052,3409],[-59,48]],[[7993,3457],[13,22]],[[7993,3457],[-21,16],[-7,6],[-15,12]],[[7950,3491],[8,13],[5,9]],[[7950,3491],[-30,26]],[[7920,3517],[5,19],[2,1],[6,16]],[[7387,3495],[-118,-167],[-6,-12],[-20,-36],[-13,-29],[-12,-21],[-2,-3],[-6,-4],[-7,-5],[-5,-13],[-1,-10],[-1,-8],[-4,-9],[-5,-7],[-7,-6],[-6,-12],[-3,-7],[-1,-4],[0,-3],[-1,-4]],[[7169,3135],[-17,14]],[[7152,3149],[-27,23]],[[7125,3172],[39,74],[6,13],[2,31],[-3,10],[-9,32]],[[7160,3332],[-2,8],[-4,5],[-4,3],[-2,2],[-3,3]],[[7145,3353],[8,13],[0,1],[10,18],[4,7],[15,28],[-10,7]],[[7172,3427],[37,66]],[[7209,3493],[9,-7],[39,72],[2,5],[3,6],[3,3],[4,3],[3,2],[2,2],[5,3]],[[7279,3582],[10,-8]],[[7289,3574],[34,-25],[64,-54]],[[7172,3427],[-13,-25],[-10,7],[-6,4],[2,5]],[[7145,3418],[12,21],[11,22],[13,22],[12,21]],[[7193,3504],[5,-3],[10,-7],[1,-1]],[[7145,3353],[-17,13],[-5,-9],[-35,26],[-4,18]],[[7084,3401],[13,25]],[[7097,3426],[10,19]],[[7107,3445],[38,-27]],[[7107,3445],[12,21],[13,24],[11,21]],[[7143,3511],[12,22],[10,16]],[[7165,3549],[37,-27],[-9,-18]],[[7097,3426],[-42,31],[-5,11]],[[7050,3468],[33,62],[-15,21]],[[7068,3551],[12,-8],[21,2],[34,-26],[6,-4],[2,-4]],[[7050,3468],[-7,13],[-11,8],[-20,16]],[[7012,3505],[23,43],[6,23]],[[7041,3571],[27,-20]],[[7016,3593],[8,-9],[2,-2],[15,-11]],[[7012,3505],[-12,7],[-14,3],[-12,2]],[[6974,3517],[42,76]],[[6974,3517],[-19,8]],[[6955,3525],[13,4],[26,49],[10,15]],[[7004,3593],[12,0]],[[6955,3525],[-9,5],[-16,17]],[[6930,3547],[14,3],[18,34],[25,49],[2,-11],[15,-29]],[[7012,3505],[-11,-19],[-8,-8],[-4,-4],[-19,-17],[-6,-9],[-7,-21]],[[6957,3427],[-18,13]],[[6939,3440],[-36,25],[-4,3],[-13,10]],[[6886,3478],[7,12],[17,20],[20,37]],[[6886,3478],[0,20],[29,53],[-2,20]],[[6913,3571],[17,-24]],[[7481,5741],[-15,-10]],[[7466,5731],[-60,40]],[[7406,5771],[6,7],[12,5],[9,7]],[[7433,5790],[38,32]],[[7471,5822],[5,-8],[9,-8]],[[7485,5806],[14,-10],[-15,-28],[-12,-8],[9,-19]],[[7406,5771],[-56,40]],[[7350,5811],[5,8]],[[7355,5819],[9,14],[9,8],[19,15]],[[7392,5856],[11,-18]],[[7403,5838],[30,-48]],[[7485,5806],[17,15],[14,11],[4,0],[25,-19],[-10,-18],[-10,-18],[5,-5]],[[7530,5772],[-29,-55],[-4,-1],[-3,3],[-13,22]],[[7549,5614],[-2,2],[-4,2],[-52,38]],[[7491,5656],[14,26],[6,10],[3,5],[-48,34]],[[7530,5772],[16,-11],[29,55],[2,3],[10,17]],[[7587,5836],[13,26],[10,17],[11,18]],[[7621,5897],[15,-11]],[[7636,5886],[16,-13],[20,-14],[2,-2],[2,-1],[3,-3]],[[7679,5853],[-9,-18],[-10,-18]],[[7660,5817],[-1,-2],[-1,-2],[-3,-4],[-18,-34]],[[7637,5775],[-2,-3],[-1,-3],[-13,-23],[-14,-25],[-17,-32],[-23,-43],[-14,-25],[-4,-7]],[[7066,6051],[-10,-19]],[[7056,6032],[-11,13],[-8,-14],[-4,-8],[11,-8],[2,-1],[-4,-8],[-1,-1],[-4,-7]],[[7037,5998],[-7,5],[-7,5],[-7,5],[-6,4],[-20,-36],[-5,-9]],[[6985,5972],[-12,9],[-14,10],[-13,10]],[[6946,6001],[6,11],[2,5],[1,1],[1,3],[2,6],[8,15],[18,34],[1,4],[3,8],[2,11],[3,6],[4,-3],[69,-51]],[[8088,5335],[-3,1],[-7,4],[-2,1],[-22,12],[-3,1],[-8,4]],[[8043,5358],[-8,5],[-2,1],[-44,22],[-10,5],[-11,6]],[[7968,5397],[10,18]],[[7978,5415],[10,19]],[[7988,5434],[12,-6],[52,-27],[11,-5]],[[8063,5396],[11,-5],[24,-13],[8,-4],[2,-2]],[[8453,7042],[-11,-20]],[[8442,7022],[-59,43]],[[8383,7065],[11,20],[8,15],[7,14]],[[8409,7114],[59,-43]],[[8468,7071],[-7,-14],[-8,-15]],[[8475,7085],[-59,43]],[[8416,7128],[7,14],[41,77],[25,-19],[-3,-8],[33,-25]],[[8519,7167],[-10,-18],[-26,-50],[-8,-14]],[[8417,6967],[-5,3],[-11,8]],[[8401,6978],[-30,22],[-15,11],[-2,1],[-3,3]],[[8351,7015],[2,3],[6,12],[10,20],[10,18]],[[8379,7068],[4,-3]],[[8442,7022],[-9,-17]],[[8433,7005],[-8,-15],[-8,-15],[0,-4],[0,-4]],[[8360,6900],[-16,13],[-18,12]],[[8326,6925],[-13,10],[-6,-3]],[[8307,6932],[17,32],[4,8],[11,20],[1,2],[9,16],[2,5]],[[8401,6978],[-2,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-3],[-11,-21],[-15,-27],[-9,-23]],[[8384,6768],[-19,-1],[-15,0]],[[8350,6767],[1,2],[2,15],[1,3],[2,11],[0,3],[-3,0],[-15,4],[-2,2],[0,2],[1,7]],[[8337,6816],[6,22],[5,21],[7,21],[-23,17],[-15,11],[9,17]],[[8360,6900],[17,-12],[3,-2],[30,-20]],[[8410,6866],[1,-1],[16,-12]],[[8427,6853],[-6,-10],[-13,-54],[-17,-1],[-8,0],[1,-20]],[[8272,6779],[-7,-14],[-2,-10],[0,-13],[4,-14],[11,-16],[19,-27]],[[8297,6685],[9,-8],[13,-6],[17,-5],[3,-1]],[[8339,6665],[-1,-3],[-1,-4],[-1,-3],[-1,-3],[-4,-10],[-3,-9],[27,-19],[62,-45]],[[8417,6569],[-2,-4],[-2,-2]],[[8413,6563],[-24,18],[-18,13],[-13,9],[-4,3],[-4,3],[-4,2],[-3,3],[-4,3],[-19,14],[-3,3],[-10,8],[-7,6],[-14,11],[-4,4],[-3,3],[-3,3],[-4,4],[-2,2],[-3,3],[-9,9],[-5,5],[-3,3],[-1,1],[-5,4],[-5,6],[-23,23]],[[8216,6729],[0,2],[0,2],[0,1],[-1,2],[0,2],[1,2],[1,2],[1,1],[1,3],[1,1],[1,4],[2,4],[2,6],[2,7],[1,3],[2,4],[1,3],[2,5],[1,4],[1,4],[2,5],[2,5],[2,4],[1,3],[3,5],[3,6],[6,11],[4,9],[6,11],[5,9],[6,12],[5,8],[10,20],[17,33]],[[8337,6816],[-25,7],[-2,-5],[-12,8],[-5,-9],[-18,11],[-10,-19],[17,-12],[-10,-18]],[[7644,6528],[-13,-22]],[[7631,6506],[-32,24]],[[7599,6530],[-32,25],[-17,13]],[[7550,6568],[7,22],[3,10]],[[7560,6600],[10,12],[2,3]],[[7634,6435],[-15,-16]],[[7619,6419],[-5,8],[-9,11],[-12,12]],[[7593,6450],[5,9],[6,6],[8,8],[9,13],[10,20]],[[7593,6450],[-49,38]],[[7544,6488],[5,9],[3,8],[8,-3],[16,-12],[12,21],[11,19]],[[7544,6488],[-5,3],[-10,2]],[[7529,6493],[1,11],[16,51],[4,13]],[[8063,5396],[10,18]],[[8073,5414],[9,-4],[1,-1],[23,-11],[2,-1],[8,-4],[2,-2]],[[8073,5414],[10,19],[10,19],[8,-4],[7,-4],[5,11],[12,22],[13,-9],[-6,-13],[-10,-18],[3,-2],[11,-5],[2,-1]],[[7988,5434],[10,18]],[[7998,5452],[2,3],[8,16]],[[8008,5471],[10,19],[20,39]],[[8038,5529],[20,38]],[[8058,5567],[75,-39],[29,-15],[6,-3],[9,-4],[2,-1]],[[8058,5567],[8,15],[10,21]],[[8076,5603],[76,-39],[29,-15],[9,-4],[6,-3],[3,-2]],[[8209,5561],[-10,-21]],[[8076,5603],[7,11],[5,10],[11,20]],[[8099,5644],[11,-6],[55,-27],[9,-5]],[[8174,5606],[-11,-20],[12,-6],[32,-17],[2,-2]],[[8026,5219],[-4,-7]],[[8022,5212],[-3,1],[-9,5],[-5,2],[-18,9],[-9,5]],[[7978,5234],[12,23],[6,11],[6,11],[2,4]],[[8004,5283],[41,-22],[2,-1]],[[8047,5260],[-2,-3],[-10,-20],[-9,-18]],[[8006,5182],[-10,-20]],[[7996,5162],[-3,1],[-24,12],[-17,9],[14,26],[12,24]],[[8022,5212],[-6,-11],[-10,-19]],[[7942,5060],[-3,-6]],[[7939,5054],[-3,1],[-33,16],[-8,4]],[[7895,5075],[-31,15]],[[7864,5090],[-36,19],[-8,4]],[[7820,5113],[11,23],[12,22],[12,23]],[[7855,5181],[24,45],[12,23],[12,23]],[[7903,5272],[12,23]],[[7915,5295],[12,23],[2,3]],[[7929,5321],[75,-38]],[[7996,5162],[-12,-21]],[[7984,5141],[-11,-22],[-11,-22]],[[7962,5097],[-10,-19],[-10,-18]],[[7895,5075],[-11,-20],[-12,-23],[-12,-24],[-10,-18]],[[7850,4990],[-63,31],[-3,1],[-10,5]],[[7774,5027],[10,18],[12,25],[12,23]],[[7808,5093],[9,-5],[3,-1],[37,-18],[4,11],[3,10]],[[7866,4917],[-9,5],[-34,17]],[[7823,4939],[17,32],[10,19]],[[7939,5054],[-6,-12],[-5,-9],[-4,-8]],[[7924,5025],[-6,-11],[-3,-3],[-2,-4],[-11,-21],[-9,-18]],[[7893,4968],[-10,-18],[-8,-15],[-9,-18]],[[7913,4893],[-9,5],[-26,13],[-12,6]],[[7893,4968],[9,-4],[3,-1],[19,-10],[10,-4]],[[7934,4949],[-7,-19]],[[7927,4930],[-7,-17],[-7,-20]],[[7961,4869],[-9,5],[-30,15],[-9,4]],[[7927,4930],[9,-4],[30,-15],[9,-5]],[[7975,4906],[-7,-18],[-7,-19]],[[7961,4869],[-6,-18],[-7,-18]],[[7948,4833],[-9,5],[-30,14],[-9,5]],[[7900,4857],[6,18],[-9,5],[-26,13],[-5,3],[-3,1],[-7,2]],[[7856,4899],[6,10],[2,5],[2,3]],[[7711,4725],[-68,52]],[[7643,4777],[6,12],[6,11],[6,11],[6,12]],[[7667,4823],[68,-52]],[[7735,4771],[-6,-12],[-6,-11],[-6,-11],[-6,-12]],[[7749,4696],[-12,-25]],[[7737,4671],[-10,9],[-29,21],[-67,53]],[[7631,4754],[6,11],[6,12]],[[7711,4725],[29,-22],[9,-7]],[[7726,4651],[-38,30]],[[7688,4681],[-67,52]],[[7621,4733],[5,10],[5,11]],[[7737,4671],[-5,-10],[-6,-10]],[[3815,1681],[-46,-14],[-2,0],[-1,2],[-5,22],[-11,-3],[-4,-2],[-6,-6],[-18,-23],[-18,79]],[[3704,1736],[18,22],[6,7],[14,4],[50,16],[-3,12],[8,3],[11,4],[8,5],[7,3],[12,5],[20,5]],[[3855,1822],[6,-26],[1,-7],[3,-37],[2,-21],[-31,-10],[-8,-3],[-9,-2],[-8,-1],[0,-12],[1,-10],[3,-12]],[[3914,1792],[7,-27],[3,-16]],[[3924,1749],[-20,-6],[-23,-8],[3,-20],[2,-11],[1,-11],[3,-25],[2,-12],[4,-31],[1,-4],[3,-8],[4,-8],[10,-14],[2,-3],[2,-3],[0,-1]],[[3918,1584],[-37,1],[-3,0],[-5,1],[-10,0],[-66,1],[-49,-3],[-3,0],[-36,-5],[-16,-2]],[[3693,1577],[-2,8]],[[3691,1585],[25,5],[11,3],[9,6],[22,1],[16,2],[6,-1],[-1,12],[0,3],[0,6],[-2,8],[-2,10],[0,2],[2,2],[44,13],[-6,24]],[[3855,1822],[9,3]],[[3864,1825],[3,-2],[6,-1],[4,-1],[4,0],[13,-1],[13,3]],[[3907,1823],[3,-12],[4,-19]],[[4066,1586],[3,-5]],[[4069,1581],[-143,3],[-1,0],[-6,0],[-1,0]],[[3924,1749],[19,7],[3,0],[8,-33]],[[3954,1723],[19,-86],[3,-2],[3,0],[7,-3],[6,-3],[15,-11],[4,-30],[26,-1],[29,-1]],[[4037,1733],[-26,-7],[-2,-2],[-1,-4],[-17,-20],[-3,-4],[-5,8],[-6,7],[-8,6],[-10,4],[-3,0],[-2,2]],[[3914,1792],[61,48],[12,-22],[6,-10],[3,-13],[25,20],[16,-82]],[[4037,1733],[12,-59],[23,6]],[[4072,1680],[10,-46],[4,-25],[4,-23],[-24,0]],[[4204,1662],[15,-81],[-19,1],[3,-6]],[[4203,1576],[-95,4],[-39,1]],[[4072,1680],[26,9],[10,2]],[[4108,1691],[6,-34],[1,-2],[3,-1],[23,0],[29,-1],[16,4],[18,5]],[[4108,1691],[-6,30],[1,4],[21,17],[16,12],[26,7],[18,5],[22,6]],[[4206,1772],[3,-18],[3,-17],[3,-17],[4,-17],[3,-18],[4,-17],[-22,-6]],[[5108,1550],[-230,8],[-32,1],[-64,-2],[-93,2]],[[4689,1559],[-2,0],[-182,7],[-261,8]],[[4244,1574],[-6,0],[-35,2]],[[4206,1772],[17,5],[23,6],[-1,4],[-4,23],[-6,33],[-17,91],[147,186]],[[4365,2120],[155,-161],[188,239],[184,246],[127,167],[24,34],[10,4],[3,3],[1,-1],[-2,-4],[14,-10],[10,-8],[12,-9],[17,-12],[10,-7],[146,-147],[5,-6],[38,-39],[47,-50],[3,-3]],[[5357,2356],[-1,0],[-5,-7],[-26,-33],[-22,-26],[-1,-2],[-3,-3],[-26,-33],[-46,-57],[-32,-41],[-18,-22],[-12,-14],[-9,-12],[-6,-7],[-12,-15],[-5,-6],[-7,-8],[-22,-27],[-10,-13],[-37,-43],[-31,-37],[2,-3],[1,-2],[4,-9],[3,-9],[1,-3],[3,-14],[6,-32],[19,-101],[22,-114],[19,-105],[2,-8]],[[8142,5727],[-9,5],[-66,37]],[[8067,5769],[12,23],[12,22]],[[8091,5814],[63,-35],[12,-7]],[[8166,5772],[-12,-22],[-12,-23]],[[8067,5769],[-22,13],[-18,10],[-17,10]],[[8010,5802],[-7,3],[-2,1],[-9,5],[12,23],[12,23]],[[8016,5857],[75,-43]],[[7745,5975],[28,51],[2,4],[4,6],[15,29]],[[7794,6065],[3,-3]],[[7797,6062],[21,-16],[16,-11]],[[7834,6035],[31,-22],[15,-12],[3,-8]],[[7883,5993],[-4,-2],[-36,-21],[-11,-6],[-6,-3],[-8,-3],[-8,-2],[-5,0]],[[7805,5956],[-4,0],[-4,0],[-6,0],[-6,1],[-8,2],[-4,1],[-7,4],[-10,5],[-7,4],[-4,2]],[[7794,6065],[-4,1],[-6,-2],[-21,15],[-16,12],[-15,13]],[[7732,6104],[9,17]],[[7741,6121],[24,-17],[9,19],[6,-4],[7,5],[5,10],[-31,24],[11,21],[10,19]],[[7782,6198],[2,2],[12,22]],[[7796,6222],[53,-40],[3,-2],[3,-2]],[[7855,6178],[-6,-11],[-14,-27],[-7,-13],[-5,-9],[-16,-30],[-13,-23]],[[7741,6121],[-21,17],[-17,12],[31,57],[8,14]],[[7742,6221],[4,3],[36,-26]],[[7732,6104],[-56,42],[-16,12],[-28,21],[-16,12]],[[7616,6191],[15,29]],[[7631,6220],[12,22],[7,12],[3,8],[11,18]],[[7664,6280],[41,-31],[4,-4],[16,-11],[17,-13]],[[7660,6327],[4,-8],[9,-22]],[[7673,6297],[-9,-17]],[[7631,6220],[-17,12],[-8,6],[-11,25],[-18,14],[-14,11]],[[7563,6288],[23,14],[25,44],[15,9],[8,-19],[9,-19],[17,10]],[[7616,6191],[-21,-37],[-2,-3],[-4,-3],[-6,-4]],[[7583,6144],[-2,4],[-16,36]],[[7565,6184],[-10,23],[-10,19],[-19,34]],[[7526,6260],[-31,55]],[[7495,6315],[16,12],[16,9],[10,-17]],[[7537,6319],[10,-17],[10,-18],[6,4]],[[7645,6361],[15,-34]],[[7537,6319],[22,14],[19,35],[4,7],[1,9],[-2,9],[16,11],[22,15]],[[7619,6419],[8,-15],[18,-43]],[[7642,6444],[16,-12],[21,-52]],[[7679,6380],[-17,-9],[-17,-10]],[[7679,6380],[17,9]],[[7696,6389],[6,-6],[17,-12]],[[7719,6371],[-19,-33],[-12,-22],[-15,-19]],[[7720,6501],[17,-13]],[[7737,6488],[-1,-3],[-33,-60],[-4,-6],[-5,-5],[-7,-3],[9,-22]],[[7737,6488],[17,-13],[16,-12]],[[7770,6463],[-2,-2],[-23,-43],[-10,-18]],[[7735,6400],[-9,-18],[-7,-11]],[[7785,6364],[-17,11]],[[7768,6375],[-33,25]],[[7770,6463],[17,-12],[2,-2],[3,-2],[8,-5],[3,-2],[2,-2],[7,-3],[6,-2],[3,-2],[-1,-3],[-35,-64]],[[7862,6383],[-20,-35],[-15,-16],[-10,-18]],[[7817,6314],[-28,20],[-31,25],[10,16]],[[7785,6364],[15,-12],[10,18],[13,-11],[5,2],[17,33],[17,-11]],[[7817,6314],[-15,-28],[20,-15],[-5,-10],[-21,-39]],[[7862,6383],[10,18],[1,3],[17,-13],[17,-13],[32,-21],[6,-4],[1,-1],[6,-4],[4,-2],[3,-3]],[[7959,6343],[-3,-3],[-13,-14],[-4,-5],[-3,-4],[-4,-4],[-4,-6],[-3,-5],[-5,-6],[-1,-3],[-5,-7],[-1,-2],[-3,-5],[-2,-4],[-3,-5],[-19,-35],[-2,-4],[-3,-5],[-4,-8],[-5,-9],[-5,-10],[-3,-4],[-4,-7],[-4,-8],[-1,-2]],[[7817,6675],[38,-27]],[[7855,6648],[38,-28],[33,-23],[52,-41]],[[7978,6556],[53,-39]],[[8031,6517],[17,-14],[17,-15],[3,-3],[3,-2]],[[8071,6483],[-4,-8],[-5,-9],[-6,-8],[-4,-6],[-9,-12],[-6,-8],[-8,-9],[-17,-19],[-12,-13],[-23,-27],[-3,-3],[-3,-3],[-2,-3],[-2,-3],[-8,-9]],[[7978,6556],[3,8]],[[7981,6564],[13,24]],[[7994,6588],[54,-40],[-17,-31]],[[7981,6564],[-20,14],[-14,10],[-18,14],[11,24],[10,18]],[[7950,6644],[34,-24],[9,17],[1,2]],[[7994,6639],[20,-13]],[[8014,6626],[-2,-3],[-18,-35]],[[7855,6648],[21,22],[0,5],[-4,1],[9,17]],[[7881,6693],[42,-31],[27,-18]],[[7881,6693],[4,8],[3,11],[1,3]],[[7889,6715],[4,10],[4,7]],[[7897,6732],[17,-11],[16,-12],[16,-11],[16,-11]],[[7962,6687],[-9,-18],[41,-30]],[[7962,6687],[13,23],[6,12]],[[7981,6722],[44,-31],[17,-12]],[[8042,6679],[-19,-36],[-9,-17]],[[7897,6732],[12,24],[8,15]],[[7917,6771],[13,26]],[[7930,6797],[16,-12],[15,-11],[15,-10],[16,-12]],[[7992,6752],[-11,-30]],[[7930,6797],[10,18],[-37,28]],[[7903,6843],[10,18],[38,-27],[15,-12],[29,-20],[-10,-19],[17,-11],[-10,-20]],[[7917,6771],[-17,12],[-45,31],[-2,1],[-2,1],[-1,1],[1,1],[1,1],[2,0],[9,17]],[[7863,6836],[27,-19],[13,26]],[[7889,6715],[-25,18],[-24,18],[-11,8],[-6,4],[-29,20]],[[7794,6783],[50,49],[8,11]],[[7852,6843],[11,-7]],[[7742,6726],[6,10],[1,3],[11,12],[31,29],[3,3]],[[7653,6788],[-162,125],[-8,5],[-7,6],[-4,4],[-18,7]],[[7454,6935],[34,20],[-13,22],[-4,7]],[[7471,6984],[16,3],[12,3],[6,3],[10,4],[7,4],[7,5],[11,8],[3,2],[7,6],[3,2],[5,4],[17,15],[14,13],[13,14],[9,9],[3,4],[5,5],[7,8],[19,22]],[[7645,7118],[2,-2],[24,-17],[9,-12],[4,-13],[2,-10],[5,-8],[6,-7],[11,-8],[18,-11],[37,-20],[57,-32],[9,-6],[19,-12],[1,-1],[5,-5],[2,-3],[4,-9],[1,-5],[2,-7],[-27,-52],[25,-18],[-9,-17]],[[7509,6479],[3,29],[11,40]],[[7523,6548],[7,19],[7,24]],[[7537,6591],[6,22],[17,-13]],[[7529,6493],[-2,-17],[-18,3]],[[7490,6478],[3,19],[-56,43],[-1,4],[10,13],[12,16],[12,15]],[[7470,6588],[53,-40]],[[7509,6479],[-10,-1],[-9,0]],[[7490,6478],[-14,-5]],[[7476,6473],[-6,18],[-59,43],[0,4],[9,17],[35,44]],[[7455,6599],[15,-11]],[[7428,6417],[-17,12]],[[7411,6429],[11,17],[12,19],[8,11],[1,1],[1,7],[-44,33]],[[7400,6517],[-19,14],[9,15],[14,18]],[[7404,6564],[17,24],[19,23],[15,-12]],[[7476,6473],[-11,-6],[-7,-7],[-9,-10],[-14,-22],[-7,-11]],[[7411,6429],[-38,27],[7,21],[9,21],[11,19]],[[7428,6417],[-12,-18]],[[7416,6399],[-67,50]],[[7349,6449],[-12,9],[-9,8],[-3,2],[-2,3],[-6,7],[-4,5],[-5,6],[-6,9],[-5,8],[-5,11],[-7,16]],[[7285,6533],[9,15],[43,68],[34,-26],[33,-26]],[[7335,6358],[-16,12]],[[7319,6370],[1,2],[-16,12],[-43,31],[-16,12],[-6,-13]],[[7239,6414],[-57,41],[-23,16]],[[7159,6471],[55,111],[2,4],[13,27],[2,4]],[[7231,6617],[1,-2],[9,-13],[12,-15],[6,-7],[5,-8],[5,-7],[7,-12],[3,-8],[2,-4],[4,-8]],[[7349,6449],[-1,-4],[-8,-21],[35,-26],[0,-6],[-9,-1],[-8,-4],[-7,-4],[-6,-8],[-10,-17]],[[7294,6308],[-17,12],[-39,30],[-17,13]],[[7221,6363],[18,51]],[[7319,6370],[-7,-21],[-9,-24],[-9,-17]],[[7276,6266],[-72,53],[17,44]],[[7294,6308],[-6,-10],[-4,-11],[-3,-11],[-5,-10]],[[7300,6230],[-27,-49],[-15,12],[-16,11]],[[7242,6204],[1,3],[11,18],[10,19],[5,9]],[[7269,6253],[16,-12],[15,-11]],[[7294,6142],[-44,32]],[[7250,6174],[-17,13]],[[7233,6187],[9,17]],[[7300,6230],[14,-11],[-25,-48],[15,-12],[-10,-17]],[[7309,6130],[-15,12]],[[7300,6230],[12,23],[1,3],[2,0],[10,-8],[-1,-5],[3,-2],[21,-15],[4,-3],[5,-10]],[[7357,6213],[-6,-7],[-6,-9],[-27,-50],[-9,-17]],[[7293,6088],[-57,43],[-1,2],[-1,2],[0,2],[6,16],[4,10],[3,6],[1,3],[2,2]],[[7309,6130],[-1,-3],[-8,-18],[-7,-21]],[[7293,6088],[-5,-19],[-3,-16]],[[7285,6053],[-6,2],[-12,8],[-12,9],[-15,12],[-15,10],[-2,-2],[-15,-28]],[[7208,6064],[-23,17]],[[7185,6081],[7,11],[4,7],[9,18],[1,1],[7,17],[12,39],[6,10],[2,3]],[[7285,6053],[-2,-27],[-1,-25]],[[7282,6001],[-18,0]],[[7264,6001],[0,22],[-25,18],[-15,11],[-16,12]],[[7264,6001],[-18,-1]],[[7246,6000],[-1,11],[-72,54]],[[7173,6065],[12,16]],[[7159,6046],[7,12],[7,7]],[[7246,6000],[-18,1]],[[7228,6001],[-16,6],[-7,6],[-46,33]],[[7186,5977],[-47,34],[10,18],[10,17]],[[7228,6001],[0,-12],[0,-5],[-5,-9],[-27,19],[-10,-17]],[[7228,5945],[-8,-19],[-14,8],[-6,-12]],[[7200,5922],[-15,11]],[[7185,5933],[-16,12]],[[7169,5945],[6,12],[11,20]],[[7246,6000],[0,-14],[-1,-9],[-17,-32]],[[7185,5933],[-7,-15],[-14,10]],[[7164,5928],[-10,7],[-8,6],[-16,12],[-16,12]],[[7114,5965],[-14,10],[-13,9],[8,15]],[[7095,5999],[13,-9],[14,-11],[17,-12],[15,-11],[15,-11]],[[7134,5863],[-14,10],[-13,10]],[[7107,5883],[25,45],[-14,10],[-13,10]],[[7105,5948],[4,8],[5,9]],[[7164,5928],[1,-6],[-7,-14]],[[7158,5908],[-5,-8],[-19,-37]],[[7107,5883],[-13,9],[-13,10]],[[7081,5902],[24,46]],[[7081,5902],[-14,10],[-15,11],[-12,9],[-13,10]],[[7027,5942],[4,8],[8,13],[13,-9],[13,24]],[[7065,5978],[13,-10],[14,-10],[13,-10]],[[7027,5942],[-15,10]],[[7012,5952],[5,9],[20,37]],[[7037,5998],[8,-6],[6,-5],[7,-4],[7,-5]],[[7056,6032],[39,-33]],[[6510,2056],[-62,41]],[[6448,2097],[8,19],[4,10],[5,10],[13,28],[4,7],[10,10]],[[6492,2181],[59,-38]],[[6551,2143],[-11,-23]],[[6540,2120],[-11,-23],[-10,-22],[-9,-19]],[[6613,2074],[-73,46]],[[6551,2143],[11,23]],[[6562,2166],[63,-41],[10,-6]],[[6635,2119],[-11,-23],[-11,-22]],[[6492,2181],[7,7]],[[6499,2188],[11,11],[6,6],[3,5],[5,12]],[[6524,2222],[49,-31]],[[6573,2191],[-11,-25]],[[7962,6172],[-19,-42]],[[7943,6130],[-8,4],[-6,2],[-6,1],[-21,-2]],[[7902,6135],[-1,21],[1,5],[3,7],[10,-7],[10,0],[17,31],[8,15]],[[7950,6207],[19,-15]],[[7969,6192],[-7,-20]],[[7911,6055],[-14,11]],[[7897,6066],[16,40],[-15,11],[-15,11],[5,9]],[[7888,6137],[6,-2],[8,0]],[[7943,6130],[-15,-36],[-17,-39]],[[7897,6066],[-19,12],[-14,11],[-10,-17],[-8,-15],[-12,-22]],[[7797,6062],[2,2],[54,100],[27,-21],[8,-6]],[[7911,6055],[-4,-15],[-1,-14],[2,-24]],[[7908,6002],[-4,-1],[-8,-3],[-10,-3],[-3,-2]],[[8016,5857],[7,19],[8,19],[10,-6],[61,-34],[4,-3]],[[8106,5852],[-7,-19],[-8,-19]],[[8016,5857],[-29,17]],[[7987,5874],[12,16],[12,16],[31,54]],[[8042,5960],[13,-7]],[[8055,5953],[21,-11],[17,-10],[10,-5],[7,-4]],[[8110,5923],[17,-10]],[[8127,5913],[-6,-18],[-6,-19],[-2,-4],[-7,-20]],[[8055,5953],[14,35],[2,3]],[[8071,5991],[21,-12],[17,-9],[15,-9]],[[8124,5961],[-1,-3],[-6,-16],[-7,-19]],[[8203,5870],[-46,26],[-30,17]],[[8124,5961],[17,-8]],[[8141,5953],[13,-7],[15,-9]],[[8169,5937],[48,-26]],[[8217,5911],[0,-2],[-1,-2],[-13,-37]],[[8110,6073],[5,-3],[17,-6],[7,-3],[5,-5],[2,-8],[0,-8],[-3,-8],[-23,-42],[31,-18]],[[8151,5972],[-9,-16],[-1,-3]],[[8071,5991],[10,20],[16,29]],[[8097,6040],[13,33]],[[8151,5972],[10,19],[-11,8],[-1,5],[13,24],[4,2],[11,-8],[6,9],[7,13]],[[8190,6044],[13,11],[7,-19]],[[8210,6036],[12,-20],[-56,-71],[3,-8]],[[8110,6073],[9,19],[6,10],[8,13],[5,11],[6,16]],[[8144,6142],[14,-21]],[[8158,6121],[-3,-7],[-6,-17],[4,-3],[9,-14],[10,-15],[13,-19],[5,-2]],[[8097,6040],[-20,12]],[[8077,6052],[-17,10],[-34,20]],[[8026,6082],[10,18],[2,4],[17,31]],[[8055,6135],[10,17],[10,15],[15,17]],[[8090,6184],[15,15],[21,-30]],[[8126,6169],[18,-27]],[[8239,6072],[-29,-36]],[[8158,6121],[14,-20],[17,10],[17,9],[22,10],[-2,13],[-9,6],[-8,7],[-14,12],[-4,7]],[[8191,6175],[-9,25],[-19,8],[6,29]],[[8169,6237],[3,-1],[23,-61],[39,-33],[1,-45],[2,-14],[0,-6],[2,-5]],[[8158,6121],[8,22],[11,36],[14,-4]],[[5974,986],[0,-2]],[[5974,984],[-3,1],[-30,17],[-33,16],[-19,4],[-18,3],[-1,0],[-9,2],[-12,-10],[-11,-20],[-9,5],[-1,2],[1,5],[1,3],[7,10],[0,1],[-1,2],[-4,7],[-4,0],[-5,1],[-1,1],[-1,0],[-3,0],[-2,0],[-4,-15],[-3,2],[-7,4],[3,12],[-5,1],[-1,8],[-6,1],[0,2],[-4,1],[0,-4],[-1,0],[-1,0],[0,-7],[-3,0],[-1,7],[-5,0],[0,-4],[-3,-1],[0,-2],[-1,0],[-6,-1],[0,-3],[-3,0],[0,-2],[-31,-12],[-14,0],[-10,0],[0,-3],[0,-5],[0,-10],[8,-2],[0,-3],[-10,2],[-2,2],[0,8],[0,11],[-3,0],[-2,-2],[-11,-1]],[[5690,1018],[6,1],[2,19],[1,3]],[[5699,1041],[8,15],[5,18],[1,2],[7,10],[13,5],[21,7],[6,1],[8,0],[8,1],[18,2]],[[5794,1102],[15,3],[4,-1],[1,2],[46,2],[31,1],[13,1],[18,4]],[[5922,1114],[14,4],[21,7],[14,4],[1,0],[3,-4]],[[5975,1125],[-1,-36]],[[5974,1089],[0,-11]],[[5974,1078],[-10,0],[-9,1],[-18,3],[-19,3],[-17,2],[-3,-31],[-5,-32],[16,-4],[18,-7],[17,-10],[12,-8],[9,-5],[9,-4]],[[5977,881],[0,-10],[0,-16],[-2,-6]],[[5975,849],[-25,5],[-43,6],[-1,1],[-56,5],[-52,3],[-16,3],[-7,3],[-9,4],[-4,2],[-3,5],[-2,4],[0,6],[-1,2],[-67,27],[1,1],[1,3],[1,-1],[69,-28],[12,-5],[24,-4],[15,1],[14,3],[25,3],[13,3],[25,2],[20,-2],[30,-8],[16,-6],[22,-6]],[[5975,979],[1,-4],[0,-7]],[[5976,968],[-17,7],[-15,8],[-21,9],[-13,5],[-37,8],[-5,0],[-18,-4],[-1,5],[6,6],[8,6],[15,2],[6,0],[23,-8],[11,-4],[24,-12],[14,-10],[19,-7]],[[5978,906],[-2,1],[-6,8],[-15,14],[-7,2],[-27,6],[-22,2],[-4,0],[-11,-3],[-11,-1],[-11,0],[-4,1],[-2,2],[0,5],[0,7],[17,0],[4,2],[2,3],[1,0],[1,-3],[0,-3],[7,-2],[52,-7],[14,-3],[24,-8]],[[5978,929],[0,-6],[0,-17]],[[5794,1102],[-1,15]],[[5793,1117],[14,43],[4,12],[4,13]],[[5815,1185],[18,0],[27,1],[16,1],[-1,65]],[[5875,1252],[4,1],[12,0],[6,0],[22,1],[22,0]],[[5941,1254],[1,-66],[-21,-1],[1,-65],[0,-8]],[[5941,1254],[22,2],[2,-67],[0,-57],[10,3],[0,-5],[0,-5]],[[5815,1185],[-2,66]],[[5813,1251],[19,1],[43,0]],[[5813,1251],[-1,66]],[[5812,1317],[62,2],[22,0],[15,1],[7,0]],[[5918,1320],[8,0],[15,1]],[[5941,1321],[0,-67]],[[5813,1251],[-18,0],[-17,0],[0,-26],[-16,-2],[-3,27],[0,21],[-7,2],[0,24],[-11,0],[-43,1],[1,20]],[[5699,1318],[42,0],[32,-1]],[[5773,1317],[21,0],[18,0]],[[5773,1317],[0,26]],[[5773,1343],[-1,34]],[[5772,1377],[0,19],[0,19]],[[5772,1415],[20,0],[19,0]],[[5811,1415],[1,-98]],[[5773,1317],[-6,9],[-59,1],[-15,17]],[[5693,1344],[19,0]],[[5712,1344],[61,-1]],[[5712,1344],[-3,34]],[[5709,1378],[21,0],[7,2],[11,-1],[7,-2],[17,0]],[[5709,1378],[-2,19],[-1,20]],[[5706,1417],[17,0],[6,-1],[43,-1]],[[5693,1344],[-2,-4],[2,-22]],[[5693,1318],[-21,0]],[[5672,1318],[-5,64],[-1,18],[-1,11],[-1,6]],[[5664,1417],[1,5],[1,-3],[3,-1],[2,-1],[35,0]],[[5699,1318],[-6,0]],[[5810,1463],[1,-48]],[[5664,1417],[-1,20],[0,6],[0,8],[0,4],[0,27],[1,25],[0,3],[0,5],[0,4]],[[5664,1519],[11,0],[30,-2],[6,-1],[10,-1],[14,-1],[43,-5],[16,-2],[6,-1],[11,0],[0,-4],[0,-1],[-1,-5],[0,-33]],[[5683,1460],[-3,-20],[37,-1],[6,-1],[6,0],[5,0],[39,0],[0,19],[0,7],[0,20],[-87,2],[-2,-20],[-1,-6]],[[7012,5952],[-13,11],[-14,9]],[[6972,5772],[-49,36]],[[6923,5808],[-8,5],[-8,6],[-46,-86],[7,-6],[8,-5]],[[6876,5722],[49,-36]],[[6925,5686],[-4,-9],[-6,-11]],[[6915,5666],[-50,36]],[[6865,5702],[-6,5],[-5,3],[-4,5],[-4,4],[-7,10],[-3,4],[-5,5],[-4,3],[-4,4],[-11,7],[-15,10]],[[6797,5762],[33,60],[17,34],[1,3],[8,15],[8,16],[5,-3],[1,-3],[4,8],[11,24],[14,20],[9,14],[3,4],[2,4],[31,40],[2,3]],[[7027,5942],[-2,-4],[2,-5],[22,-17],[-20,-35],[-1,-2],[0,-1],[-56,-106]],[[6953,5737],[-49,36]],[[6904,5773],[9,17],[10,18]],[[6972,5772],[-9,-17],[-5,-9],[-5,-9]],[[6904,5773],[-10,-18],[-9,-16],[-9,-17]],[[6953,5737],[-5,-9],[-4,-8]],[[6944,5720],[-5,-9],[-4,-9],[-10,-16]],[[6953,5737],[60,-44],[-4,-9],[-5,-9]],[[7004,5675],[-60,45]],[[6995,5659],[-9,-17],[-61,44]],[[7004,5675],[-9,-16]],[[6995,5659],[36,-27],[2,-1],[8,-6],[19,-13],[1,-1],[6,-4]],[[7067,5607],[-3,-6],[-5,-8],[-2,-4],[-2,-3],[-9,-16]],[[7046,5570],[-12,9]],[[7034,5579],[-59,43]],[[6975,5622],[-60,44]],[[7004,5675],[36,-25],[30,-21],[7,-5]],[[7077,5624],[-1,-1],[-4,-8]],[[7072,5615],[-4,-7],[-1,-1]],[[7092,5536],[-46,34]],[[7072,5615],[45,-32]],[[7117,5583],[-4,-8],[-5,-7]],[[7108,5568],[-4,-7],[-4,-8]],[[7100,5553],[-7,-15],[-1,-2]],[[7072,5495],[-60,44]],[[7012,5539],[5,9],[5,9],[5,9],[5,10],[2,3]],[[7092,5536],[-1,-3],[0,-3],[-4,-8],[-5,-9],[-5,-9],[-5,-9]],[[7059,5470],[-20,15],[-4,-8],[-40,30]],[[6995,5507],[4,7],[4,8],[4,8],[5,9]],[[7072,5495],[-5,-9],[-8,-16]],[[7092,5536],[61,-44]],[[7153,5492],[-2,-3],[-5,-10],[-5,-10],[-5,-8],[-5,-9],[-13,-25],[-59,43]],[[7246,5424],[-33,24]],[[7213,5448],[-49,36],[-11,8]],[[7100,5553],[73,-53]],[[7173,5500],[63,-46],[18,-13]],[[7254,5441],[-4,-8],[-4,-9]],[[7108,5568],[73,-53]],[[7181,5515],[-4,-8],[-4,-7]],[[7117,5583],[73,-53]],[[7190,5530],[-5,-8],[-4,-7]],[[7117,5583],[4,7],[4,8],[72,-53],[-4,-8],[-3,-7]],[[7394,5476],[-9,-18],[-9,-17],[-12,-22]],[[7364,5419],[-18,13],[-6,5],[-5,3],[-2,0],[-3,4],[-8,9],[-6,5],[-5,5],[-32,23],[-7,-13],[-1,-2]],[[7271,5471],[-26,20],[-4,-8],[-4,-8],[-56,40]],[[7077,5624],[3,6],[2,4],[81,145],[2,3],[20,39],[2,3]],[[7187,5824],[55,-39]],[[7242,5785],[22,-17],[45,-33],[54,-39]],[[7363,5696],[54,-40],[28,-21],[26,-18]],[[7471,5617],[-2,-3],[-8,-14],[-2,-4]],[[7459,5596],[-9,-17],[-9,-17],[-9,-17]],[[7432,5545],[-9,-17],[-9,-17],[-12,-21],[-8,-14]],[[7271,5471],[-4,-8],[-5,-8],[-4,-7],[-4,-7]],[[7364,5419],[-7,-12]],[[7357,5407],[-10,-18],[-8,-16],[-7,-12]],[[7332,5361],[-25,18],[-5,5],[-30,21]],[[7272,5405],[-26,19]],[[7250,5365],[-59,43]],[[7191,5408],[5,9],[5,9],[5,9],[5,10],[2,3]],[[7272,5405],[-2,-3],[-10,-19],[-5,-9],[-5,-9]],[[7312,5324],[-8,5],[-54,36]],[[7332,5361],[-1,-3],[-11,-19],[-2,-3],[-6,-12]],[[7287,5277],[-12,-21]],[[7275,5256],[-86,63],[18,33],[-33,25],[3,7],[5,7],[4,8],[5,9]],[[7312,5324],[-2,-5],[-3,-5],[-9,-16],[-11,-21]],[[7400,5318],[6,-9],[2,-3],[2,-3],[3,-2],[10,-7],[5,-4],[20,-14]],[[7448,5276],[-2,-3],[-13,-22],[-8,7],[-42,30],[-1,4],[-5,-10],[-5,-9]],[[7372,5273],[-12,-20],[-14,-20]],[[7346,5233],[-3,2],[-2,2],[-3,2],[-2,1],[-1,1],[-48,36]],[[7332,5361],[28,-21],[4,-2],[4,-3],[4,-1],[9,-1],[3,-2],[5,-2],[2,-2],[2,-2],[1,0],[4,-4],[2,-3]],[[7357,5407],[52,-38],[1,-1],[3,-2],[2,-2],[2,-1],[3,-2]],[[7420,5361],[-10,-17],[-2,-5],[-5,-11],[0,-3],[-3,-7]],[[7491,5278],[-13,-24]],[[7478,5254],[-15,11],[-15,11]],[[7420,5361],[55,-40]],[[7475,5321],[-1,-14],[6,-11],[11,-18]],[[7394,5476],[28,-22],[24,-16],[3,-3],[3,-2],[4,-3]],[[7456,5430],[-9,-18],[-9,-17],[56,-41]],[[7494,5354],[-15,-13],[-4,-20]],[[7456,5430],[30,-22],[8,0],[6,-29]],[[7500,5379],[3,-17],[-9,-8]],[[6950,1933],[-103,-90],[-127,-106]],[[6720,1737],[-8,5],[29,47],[-22,15]],[[6719,1804],[5,11],[19,27],[35,50]],[[6778,1892],[2,3],[9,10],[4,5],[10,9],[12,11],[4,3]],[[6819,1933],[70,-44],[17,14]],[[8350,6767],[0,-4],[-2,-21],[-1,-5]],[[8347,6737],[0,-5],[-2,-22]],[[8345,6710],[-3,0],[-17,1],[2,28]],[[8327,6739],[1,20],[-16,1],[-11,2],[-13,5],[-16,12]],[[8327,6739],[-32,3],[-6,0],[-5,-2],[3,-7],[5,-8],[3,-3],[12,-3],[-2,-21],[-2,-7],[-6,-6]],[[8345,6710],[0,-4],[-1,-8],[-1,-7],[-1,-8],[-1,-9]],[[8341,6674],[-1,-2],[-1,-7]],[[8531,6462],[-10,-17],[-2,-5],[-10,-18]],[[8441,6440],[22,43],[-17,11],[-24,-45]],[[8422,6449],[-3,1],[-12,9],[-3,3],[-3,4],[0,3],[-1,5],[0,4],[2,6],[1,7],[0,6],[-1,7],[-2,3],[-3,2],[-34,25],[-16,-31],[-3,-6],[-2,-4],[-4,-8],[-1,-10],[0,-9],[1,-15],[-2,-8],[-4,-9]],[[8332,6434],[-7,3],[-40,17],[-26,14],[-2,-3],[-15,-39],[-1,-1],[-3,-5],[-4,-7]],[[8234,6413],[-5,-1],[-99,53],[-5,-14]],[[8125,6451],[-18,9],[-24,15],[-4,2],[-4,4],[-4,2]],[[8071,6483],[4,6],[34,65],[1,3]],[[8110,6557],[2,3],[13,26],[12,23],[3,6],[2,3],[4,8],[4,6],[8,12],[6,7],[9,12],[10,10],[6,8],[7,11]],[[8196,6692],[1,0],[4,8],[6,9],[4,8],[4,9],[1,3]],[[8413,6563],[4,-3],[4,-2],[3,-3],[4,-3],[18,-13],[34,-26],[42,-31],[4,-3],[8,-6],[3,-1]],[[6526,1502],[-10,-3],[-62,2],[-43,2],[-3,-3],[-3,-1],[4,-9],[2,-3],[0,-4]],[[6411,1483],[0,-23],[0,-28]],[[6411,1432],[0,-15],[0,-20],[50,-33]],[[6461,1364],[-4,-10]],[[6457,1354],[-35,21],[-6,2],[-12,6],[-1,52],[-3,1],[-3,2],[-2,1],[-3,1],[-101,53],[-2,1],[-6,4],[-5,4],[-27,18],[-15,9],[-42,44],[0,58],[0,7],[-60,19],[-23,7]],[[6111,1664],[-8,3],[-6,1],[-4,1],[-1,1],[-6,2]],[[6086,1672],[0,1],[1,2],[0,2],[2,6],[0,1],[4,7],[27,56],[1,8],[2,4],[4,5],[0,1],[5,7],[4,5],[7,7],[9,8],[6,14]],[[6158,1806],[191,-124],[41,-24],[11,-6],[2,-2],[3,-2],[23,-14],[6,-3],[25,-17],[13,-7],[1,-1],[82,-50]],[[6556,1556],[88,-41]],[[6644,1515],[-22,-5],[-4,-1],[-30,-7],[-4,-1],[-11,-1],[-7,0],[-5,1],[-2,1],[-14,9],[-11,7],[-8,-16]],[[8422,6449],[-26,-50]],[[8396,6399],[-3,2],[-4,2],[-5,2],[-5,3],[-28,16],[-5,2],[-4,3],[-5,3],[-5,2]],[[8234,6413],[-2,-3],[-3,-6],[-2,-6],[-9,-20]],[[8218,6378],[-7,-20]],[[8211,6358],[-9,-21],[-7,-20]],[[8195,6317],[-21,-51],[-4,-24]],[[8170,6242],[-24,97],[-9,51],[-12,61]],[[8182,6349],[3,-2],[17,39],[9,24],[-17,9],[-34,19],[-3,-10],[0,-2],[-1,-6],[2,-5],[13,-37],[8,-23],[3,-6]],[[8170,6242],[-1,-2]],[[8169,6240],[0,-3]],[[8126,6169],[7,7],[4,13],[-2,5],[-39,56],[-2,3],[0,3],[1,10],[1,3],[-33,12],[-3,1]],[[8060,6282],[-3,1],[-34,13],[-2,1]],[[8021,6297],[-14,10],[-4,3],[-15,12],[-18,13],[-9,7],[-2,1]],[[8090,6184],[-13,17],[-12,17],[-13,19]],[[8052,6237],[16,16],[-8,15],[-1,3],[0,2],[0,6],[1,3]],[[8055,6135],[-19,8],[-19,8],[-19,6]],[[7998,6157],[1,6],[8,13],[10,16],[10,15],[10,13],[15,17]],[[7998,6157],[-6,2],[-10,3],[-10,5],[-10,5]],[[7969,6192],[16,-8],[4,-1],[2,2],[7,15],[10,13],[15,21],[9,12],[8,8],[12,-17]],[[7969,6192],[22,50],[9,16]],[[8000,6258],[20,36],[1,3]],[[7950,6207],[15,25],[-18,12],[20,38],[17,-13],[16,-11]],[[7514,3024],[-1,0],[-7,-1],[-1,-4],[-7,-10],[3,-5],[1,-4],[-4,-9],[-3,-4],[-14,-14],[-13,-10],[-13,-12],[-26,-22],[-4,-4],[-56,-28],[-21,-16],[-29,-19],[-14,-5],[-14,-6],[-12,-2],[-16,0]],[[7263,2849],[-25,19],[-3,16],[4,12],[12,20],[-30,23],[10,20],[2,5],[-20,16]],[[7213,2980],[8,23],[5,10],[18,-12],[50,-33],[18,39],[14,23],[12,17]],[[7338,3047],[7,-7],[2,-1],[3,-2]],[[7350,3037],[10,-6],[19,23],[1,5],[6,31],[2,3]],[[7388,3093],[4,-2]],[[7392,3091],[5,-2],[6,-1],[15,-1],[2,0],[25,-2],[8,0],[6,0],[5,2]],[[7464,3087],[1,-7],[12,-14],[0,-1],[27,-11],[-3,-13],[7,-12],[6,-5]],[[7513,2895],[-9,5],[-6,-8],[-17,-3],[-20,-1],[-8,-3],[-37,-17],[-30,-15]],[[7386,2853],[-21,-14],[-20,-15],[-14,-8],[-11,-9],[-16,-18]],[[7304,2789],[-15,-15],[-17,-14]],[[7272,2760],[8,27],[4,16],[4,10],[7,11],[-25,21],[-7,4]],[[7514,3024],[9,-6],[10,-7],[20,-13],[2,-2],[24,-17]],[[7579,2979],[-12,-22],[-29,-51],[-4,-4],[-6,-3],[-15,-4]],[[7492,2773],[-5,7],[-5,4],[-5,1],[-5,4],[-4,7],[-8,5],[-4,0],[-7,2],[-8,11]],[[7441,2814],[-55,39]],[[7513,2895],[15,-11],[21,-16]],[[7549,2868],[-20,-37],[-17,-31],[-6,-14],[-14,-13]],[[7373,2736],[-69,53]],[[7441,2814],[-19,-17],[-18,-17],[-18,-24],[-13,-20]],[[7492,2773],[-5,-5],[37,-29]],[[7524,2739],[-28,-13],[-9,-4],[-30,-13]],[[7377,2638],[-41,31]],[[7336,2669],[12,22],[13,23],[12,22]],[[6573,2191],[63,-41],[10,-6]],[[6646,2144],[-11,-25]],[[6573,2191],[11,23]],[[6584,2214],[73,-47]],[[6584,2214],[10,22]],[[6594,2236],[73,-47]],[[6594,2236],[9,19]],[[6584,2214],[-54,34]],[[6530,2248],[3,6],[3,7],[0,1],[2,2],[4,6],[12,17]],[[6524,2222],[3,14]],[[6527,2236],[3,12]],[[6527,2236],[-2,1],[-2,1],[-28,19],[6,14],[-16,11]],[[6485,2282],[14,30],[9,18]],[[6508,2330],[29,-21],[19,-15],[2,-2]],[[6499,2188],[-2,1],[-43,28],[8,17]],[[6462,2234],[9,19],[14,29]],[[6527,2367],[-11,-21],[-2,-3],[-6,-13]],[[6462,2234],[-46,29],[0,24],[0,38],[0,24],[2,0],[1,1],[4,8],[1,2],[13,22],[2,-1],[-2,3],[0,3],[0,2],[1,2],[2,1],[1,1],[1,0],[7,-2],[-4,3],[2,3]],[[6447,2397],[0,2],[3,6],[2,3],[5,9]],[[7999,6097],[-8,-18]],[[7991,6079],[-19,10],[-18,10],[-22,-47],[-3,-11],[-2,-10],[22,2],[29,-2]],[[7978,6031],[-1,-24]],[[7977,6007],[-3,0],[-26,0],[-21,-1],[-15,-3],[-4,-1]],[[7943,6130],[21,-12],[16,-10],[19,-11]],[[7991,6079],[-8,-13]],[[7983,6066],[-4,-11],[-1,-24]],[[8026,6082],[-10,5],[-17,10]],[[8077,6052],[-18,-32],[-23,5],[-20,15],[-33,26]],[[8071,5991],[-14,6],[-9,4],[-9,2],[-14,2],[-45,2],[-3,0]],[[8042,5960],[-2,3],[-2,1],[-3,3],[-10,7],[-7,6],[-19,1],[-39,2]],[[7960,5983],[-17,0],[-13,-2],[-19,-3]],[[7911,5978],[-3,20],[0,4]],[[7987,5874],[-9,6]],[[7978,5880],[-14,13]],[[7964,5893],[13,16],[12,16],[7,8],[4,9],[-40,29],[0,12]],[[5871,2067],[-21,-122],[-1,-3]],[[5849,1942],[-3,-9],[-7,-22],[-8,-23],[-8,-22],[-20,-45],[0,-1],[-3,-8],[-19,-57],[14,-8],[2,-1],[1,0],[13,-6],[30,-14],[26,-12],[3,-2],[6,-2],[4,-2],[2,-1],[81,-39],[60,4]],[[6023,1672],[3,0],[22,0],[2,0],[10,0],[5,0],[8,0],[3,0],[3,0],[5,0],[2,0]],[[6111,1664],[0,-31],[0,-5],[0,-7],[-2,-98],[0,-14],[0,-2],[0,-1]],[[6109,1506],[-121,5],[-1,-8],[0,-4],[-1,-4],[-1,-13],[0,-30]],[[5985,1452],[-24,1]],[[5961,1453],[0,26],[-90,2],[0,-26]],[[5871,1455],[-13,1],[-10,-1],[-11,-1],[-9,4],[-6,6],[-12,-1]],[[5664,1519],[-4,0],[-2,0],[-71,3],[-2,0],[-2,0],[-72,2]],[[5511,1524],[0,2],[0,3],[0,9],[0,3],[-6,11],[-61,-7],[-7,0],[-5,1],[-22,-1],[-14,-2],[-27,-1],[-136,5],[-52,0],[-47,2],[-26,1]],[[5357,2356],[2,-2],[2,-2],[46,-49],[15,-12],[7,-5],[12,-9],[8,-7],[33,-35],[57,-64],[51,-59],[2,-3],[8,-9],[13,-14],[31,-37],[6,-6],[1,3],[2,17],[4,40],[7,50],[1,8],[0,7],[1,8],[6,49],[1,9],[1,7],[1,6],[1,5],[0,7],[1,3],[0,-1],[2,-1],[4,-4],[1,-2],[6,-5],[1,-1],[1,-1],[1,-1],[2,-1],[2,-3],[1,0],[2,-2],[2,-2],[1,-1],[2,-2],[2,-1],[2,-2],[0,-1],[1,-1],[1,0],[1,-2],[1,-1],[1,0],[3,-4],[6,-7],[2,-1],[0,-1],[1,0],[1,-1],[1,-1],[1,-1],[1,-1],[2,-1],[1,-1],[1,-2],[2,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-1],[1,-2],[2,-1],[1,-2],[1,-1],[1,-1],[2,-1],[1,-1],[1,-1],[1,-1],[1,-2],[1,-1],[2,-2],[1,-1],[1,-1],[1,-1],[1,-2],[1,-1],[7,-6],[3,-4],[2,-1],[1,-2],[2,-1],[1,-2],[1,-1],[2,-2],[1,-1],[1,-1],[2,-1],[0,-1],[7,-6],[9,-8],[24,-25],[1,-1],[3,-3],[16,-16],[0,-1],[4,-4],[2,-2],[1,-1],[3,-3],[1,-1],[1,-2],[2,-1],[3,-4],[7,-7],[1,-1]],[[5981,1916],[-16,-34],[-6,-7],[-24,15],[-13,10],[-2,2],[-1,1],[-2,1],[-2,2],[-1,1],[-1,1],[-1,0],[-1,1],[-3,2],[-1,1],[-1,1],[-1,0],[-1,1],[-1,1],[-1,1],[-2,1],[0,1],[-1,1],[-1,1],[-1,1],[-1,0],[-3,2],[-2,1],[-1,1],[-2,2],[-2,0],[-1,1],[-2,1],[0,1],[-2,1],[-1,0],[-1,2],[-1,1],[-2,1],[-1,1],[-1,0],[0,1],[-4,2],[-18,10],[-3,-7]],[[5871,2067],[13,73],[1,23],[2,9],[5,26],[2,9],[0,2],[40,237]],[[5934,2446],[10,-4],[12,-6],[17,-7],[11,-7],[8,-4],[4,-2],[16,-9],[7,-3],[13,-8],[4,-4],[108,-49]],[[6144,2343],[-20,-43],[-18,-36],[-6,-13],[-1,-5],[-5,-34]],[[6094,2212],[-6,-35],[0,-9]],[[6088,2168],[2,-34],[-1,-7],[-2,-4],[-24,-29],[-4,-10]],[[6059,2084],[-8,-18],[-8,-18],[-9,-18],[-8,-18],[-9,-19]],[[6017,1993],[-10,-20],[-9,-21],[-9,-18],[-33,21],[-4,-20],[29,-19]],[[6235,2626],[-9,-16],[-9,-21]],[[6217,2589],[-16,12],[-16,11],[-17,-33]],[[6168,2579],[-16,12],[17,32],[-17,13]],[[6152,2636],[8,17],[1,3],[-1,1],[-35,25],[-16,-21],[-6,-8],[-8,-5],[-6,-6],[-10,-18],[-3,-5],[-1,-8],[-9,-50],[51,-31]],[[6117,2530],[-10,-24]],[[6107,2506],[-4,-10],[-2,-11],[-15,-34],[17,-11],[18,-11],[18,-11],[26,-17]],[[6165,2401],[-4,-18],[-6,-17]],[[6155,2366],[-11,-23]],[[5934,2446],[25,152],[6,37]],[[5965,2635],[5,5],[39,44],[17,-20],[0,-1],[1,-1],[1,-1],[2,-2],[5,-7],[0,-1],[3,1],[21,10],[4,2],[0,1],[1,0],[1,1],[2,0],[0,1],[62,35],[66,-48],[40,-28]],[[6107,2506],[62,-41]],[[6169,2465],[-3,-22],[1,-27],[-2,-15]],[[6192,2521],[-41,29],[-9,7],[-5,4]],[[6137,2561],[-7,10],[-8,9],[30,56]],[[6168,2579],[16,-11],[23,-17],[-15,-30]],[[6137,2561],[-1,-5],[-4,1],[-1,0],[-1,0],[-2,-3],[-2,-4],[-9,-20]],[[6309,2476],[11,22],[-11,8],[-23,16],[-7,5],[-4,4],[2,4],[14,24],[36,-26],[7,-9]],[[6334,2524],[38,-27],[0,-52],[0,-2],[-16,0],[-3,1],[-3,2],[-4,3],[-37,27]],[[7738,7965],[-53,-45]],[[7685,7920],[-13,-12]],[[7672,7908],[-3,4],[-22,35],[-14,-12],[-49,77]],[[7584,8012],[13,13],[12,13],[51,-79],[18,15],[18,16],[17,15]],[[7713,8005],[23,-37],[2,-3]],[[7672,7908],[-15,-12],[-12,-10]],[[7645,7886],[-59,-52]],[[7586,7834],[-2,4],[-15,22]],[[7537,7964],[6,8],[5,5],[5,5],[2,1],[11,9],[3,3],[4,4],[11,13]],[[7640,7788],[-16,-14]],[[7624,7774],[-38,60]],[[7645,7886],[14,-22],[-14,-12],[11,-17]],[[7656,7835],[-30,-26],[14,-21]],[[7733,7779],[-11,-14]],[[7722,7765],[-26,41],[-14,-11],[-26,40]],[[7685,7920],[13,-21],[12,-18],[25,-40]],[[7735,7841],[24,-38]],[[7759,7803],[-13,-11],[-10,-9],[-3,-4]],[[7722,7765],[-4,-6],[-8,-7],[-15,-12],[-15,-14]],[[7680,7726],[-20,32],[12,11],[1,2],[-1,2],[-16,25],[-1,2],[-2,-1],[-13,-11]],[[7680,7726],[-16,-13]],[[7664,7713],[-40,61]],[[7805,7698],[-12,-15],[-10,-14],[-18,-22]],[[7765,7647],[-13,20],[-14,-18],[-4,-1],[-5,1],[-8,13],[-11,17],[-30,47]],[[7733,7779],[4,-7],[6,-11],[-8,-14],[10,-16],[2,-2],[1,-3],[11,-16],[10,9],[1,0],[1,-1],[10,-15],[12,15],[12,-20]],[[7831,7730],[-26,-32]],[[7759,7803],[17,14]],[[7776,7817],[42,-67],[13,-20]],[[7861,7768],[-30,-38]],[[7776,7817],[16,17],[11,11],[6,0],[5,-4],[34,-54]],[[7848,7787],[13,-19]],[[7917,7839],[-56,-71]],[[7848,7787],[20,26],[-29,44],[43,37]],[[7882,7894],[12,-18],[11,-17],[12,-20]],[[7735,7841],[9,9],[7,9],[14,21],[2,1],[15,13]],[[7782,7894],[8,-11],[3,-2],[4,0],[2,1],[11,9],[16,14],[-42,66],[16,14],[16,13]],[[7816,7998],[42,-65],[12,-20]],[[7870,7913],[12,-19]],[[7782,7894],[-30,49],[-14,22]],[[7738,7965],[65,55]],[[7803,8020],[13,-22]],[[6474,1392],[-63,40]],[[6411,1483],[20,-13],[12,-8],[12,-8],[38,-24]],[[6493,1430],[-5,-9]],[[6488,1421],[-4,-8],[-5,-11],[-5,-10]],[[6545,1440],[-10,-22],[-37,24],[-5,-12]],[[6526,1502],[10,-7],[11,-7],[16,-10],[-8,-18],[-10,-20]],[[6591,1409],[-16,-16],[-16,-17]],[[6559,1376],[-16,-16],[-39,26],[9,20],[-25,15]],[[6545,1440],[46,-31]],[[6644,1515],[8,0],[3,0],[4,1]],[[6659,1516],[0,-5],[-1,-11],[0,-8],[-2,-8],[-1,-4],[-3,-8],[-2,-2],[-24,-26],[-4,-3],[-14,-15],[-17,-17]],[[6601,1293],[-5,10],[-12,30],[-3,11],[-1,2],[-2,4],[-1,4],[-3,5],[-1,3],[-6,8],[-5,6],[-1,0],[-2,0]],[[6659,1516],[41,-1],[24,-16],[-1,-8],[2,-1],[1,0],[1,-1],[3,-1],[3,-2],[37,34],[14,13],[3,1],[3,2],[7,5],[1,0],[2,1],[5,2],[1,1],[7,4],[5,2],[4,2],[3,1],[2,2],[1,0],[2,1],[1,0],[4,2],[2,1],[1,1],[2,1],[1,0],[0,1],[2,0],[1,1],[7,5],[7,3],[5,2],[1,0],[1,1],[3,1],[3,2]],[[6871,1578],[2,-1],[7,-5],[20,-14],[35,-24],[3,-2]],[[6938,1532],[-14,-18],[-25,-20],[-27,-24],[-27,-18],[-54,-35],[-75,-47],[-110,-74],[-5,-3]],[[6556,1556],[3,8],[14,31],[9,19],[10,5],[9,6],[14,10],[15,13],[14,13],[2,2],[15,15],[16,14],[5,4],[3,1]],[[6685,1697],[46,-29]],[[6731,1668],[-8,-7],[-17,-14],[-3,-4],[-12,-10],[-27,-80],[-3,-9],[0,-6],[-1,-7],[-1,-9],[0,-6]],[[6731,1668],[85,-55],[1,0],[1,-1],[3,-2]],[[6821,1610],[2,-1],[31,-20],[1,-1],[16,-10]],[[6749,1741],[49,-32],[7,4],[7,3]],[[6812,1716],[35,-22],[11,8],[3,-2],[-31,-70]],[[6830,1630],[-9,-20]],[[6731,1668],[9,9],[9,7],[11,7],[18,8],[-15,10],[-8,5],[-21,14]],[[6734,1728],[8,7],[7,6]],[[6685,1697],[-5,5]],[[6680,1702],[40,35]],[[6720,1737],[5,-3],[4,-3],[5,-3]],[[6680,1702],[-9,4]],[[6671,1706],[6,12],[11,22]],[[6688,1740],[6,13],[2,5],[2,4],[10,21]],[[6708,1783],[11,21]],[[6688,1740],[-73,47],[-32,20],[10,22]],[[6593,1829],[10,21],[10,21]],[[6613,1871],[58,-37],[-10,-21],[36,-23],[11,-7]],[[6656,1963],[58,-38],[3,6]],[[6717,1931],[61,-39]],[[6613,1871],[9,20],[8,17],[9,18],[8,18],[9,19]],[[6593,1829],[-73,47]],[[6520,1876],[7,6],[6,12]],[[6533,1894],[10,22],[9,19],[8,18]],[[6560,1953],[17,36],[9,19]],[[6586,2008],[70,-45]],[[6671,1706],[-178,114]],[[6493,1820],[6,12],[11,23],[10,21]],[[6671,1706],[-5,-8]],[[6666,1698],[-73,47],[-8,-18]],[[6585,1727],[-59,37],[-8,-19],[-9,-19]],[[6509,1726],[-58,37]],[[6451,1763],[10,20],[8,18],[8,18],[13,-7],[3,8]],[[6532,1632],[-22,13],[-25,16],[-6,4],[10,23],[5,9],[4,5],[2,6],[9,18]],[[6585,1727],[-8,-19],[-9,-20],[-9,-18],[-7,5],[-9,-21],[-11,-22]],[[6666,1698],[-16,-14],[-15,-14],[-18,11],[-8,-20],[-1,-3],[-12,-9],[-3,-1],[-3,2],[-4,2],[-8,-16],[-2,-3],[-15,-6],[-17,-3],[-12,8]],[[6451,1763],[-9,-18],[-20,13],[-2,4],[0,21],[0,25],[-3,3]],[[6417,1811],[0,22],[0,24],[0,12]],[[6417,1869],[9,-4],[67,-45]],[[6417,1869],[6,12],[3,-2],[11,22],[10,22]],[[6447,1923],[10,20]],[[6457,1943],[70,-45],[6,-4]],[[6417,1869],[-16,8],[-10,7],[-1,1],[-28,16]],[[6362,1901],[10,5],[3,18],[2,14],[-6,29],[-2,6]],[[6369,1973],[5,6],[11,10],[19,18],[2,3],[1,3]],[[6407,2013],[1,-11],[8,-6],[0,-27],[1,-27],[30,-19]],[[6407,2013],[1,0],[5,12],[8,17]],[[6421,2042],[2,-2],[61,-38]],[[6484,2002],[-8,-18],[-9,-19],[-10,-22]],[[6484,2002],[9,17],[70,-45],[-9,-17],[6,-4]],[[6421,2042],[10,23],[8,13],[3,7],[6,12]],[[6510,2056],[70,-44],[6,-4]],[[6613,2074],[-10,-23],[-7,-14],[-1,-7],[0,-3],[-1,-3],[-8,-16]],[[6407,2013],[0,6],[-2,-6],[-3,-3],[0,-1]],[[6402,2009],[-1,26],[0,240]],[[6401,2275],[0,7]],[[6401,2282],[0,35],[1,44],[0,41],[0,4]],[[6402,2406],[4,0],[5,0],[9,0],[8,-1],[5,-1],[5,-2],[5,-2],[4,-3]],[[6401,2275],[-2,-23],[-2,-25],[-6,-29],[0,-1],[-7,-25],[-17,-42],[-13,-21]],[[6354,2109],[-14,8],[-38,25],[-31,20],[-15,9]],[[6256,2171],[13,60],[1,8],[3,9],[4,9],[4,-3]],[[6281,2254],[15,-9],[2,0],[2,2],[6,14],[17,-11],[-8,-16],[0,-1],[1,-2],[1,-1],[57,-37],[3,0],[1,2],[1,4],[1,12],[-1,8],[0,24],[0,19],[0,22],[0,2],[-2,1],[-29,18],[-17,12],[-3,3]],[[6328,2320],[0,17],[1,8],[4,11],[11,24],[6,13],[2,4],[2,8],[0,3],[-6,5],[-9,6],[2,3]],[[6341,2422],[9,-7],[7,-4],[7,-4],[4,-1],[6,0],[6,0],[7,0],[5,0],[9,0],[1,0]],[[6281,2254],[27,58],[3,7],[7,7],[6,-5],[4,-1]],[[6402,2009],[-3,1],[-19,-17],[-10,7],[-5,3],[12,24],[5,13],[-1,5],[-4,6],[-8,5],[-7,5],[-9,2],[-12,-1],[-6,-8],[-14,-22],[-21,-31]],[[6300,2001],[-15,-23]],[[6285,1978],[-25,-35]],[[6260,1943],[-15,-22]],[[6245,1921],[-11,7],[-4,3]],[[6230,1931],[71,99]],[[6301,2030],[24,35],[29,44]],[[6301,2030],[-12,12],[-57,35],[-17,10]],[[6215,2087],[8,17],[8,16],[6,10],[9,23],[10,18]],[[6230,1931],[-12,8],[10,15],[-57,37]],[[6171,1991],[8,18]],[[6179,2009],[8,18],[8,16],[9,20],[11,24]],[[6369,1973],[-3,2],[-11,7],[-8,5]],[[6347,1987],[-13,8],[-2,1],[-2,1],[-4,-1],[-9,-3],[-3,0],[-3,0],[-2,1],[-9,7]],[[6347,1987],[-31,-30]],[[6316,1957],[-17,12],[-14,9]],[[6316,1957],[-14,-14]],[[6302,1943],[-5,-4],[-3,-2],[-8,-6],[-3,0],[-4,0],[-3,2],[-16,10]],[[6281,1897],[-3,2],[-14,9],[-3,4],[-16,9]],[[6302,1943],[18,-13],[1,-3]],[[6321,1927],[-6,-4],[-18,-14],[-16,-12]],[[6321,1927],[21,-13],[-18,-15],[22,-15]],[[6346,1884],[-3,-4],[-11,-12],[-1,-3]],[[6331,1865],[-50,32]],[[6362,1901],[-5,-5],[-11,-12]],[[6730,2120],[-11,-23]],[[6719,2097],[-11,-24],[-11,-24],[-11,-22]],[[6686,2027],[-73,47]],[[6686,2027],[-11,-24],[-10,-21],[-9,-19]],[[6836,1948],[-12,-11],[-5,-4]],[[6717,1931],[6,14],[10,21],[11,23]],[[6744,1989],[61,-40],[12,24],[27,-18]],[[7964,5893],[-41,31],[-17,13]],[[7906,5937],[4,14],[1,10],[0,17]],[[7891,5897],[6,17],[9,23]],[[7978,5880],[-6,-9],[-14,-25],[-32,24],[-35,27]],[[7987,5874],[-27,-45],[8,-3],[9,-6],[-5,-10],[-5,-10],[-4,-7]],[[7963,5793],[-56,42],[-30,22]],[[7877,5857],[7,19],[7,21]],[[7944,5758],[-60,44],[-10,7],[-11,6]],[[7863,5815],[7,22]],[[7870,5837],[7,20]],[[7963,5793],[-5,-10],[-4,-8],[-7,-12],[-3,-5]],[[7925,5721],[-21,15],[-55,39]],[[7849,5775],[14,40]],[[7944,5758],[-3,-8]],[[7941,5750],[-5,-8],[-1,-3],[-9,-17],[-1,-1]],[[7908,5689],[-11,-22]],[[7897,5667],[-48,36],[-2,1],[-1,0],[-1,0],[-1,-1],[-8,-14],[-15,10]],[[7821,5699],[6,16],[4,12],[2,3],[4,13],[12,32]],[[7925,5721],[-7,-13],[-3,-6],[-7,-13]],[[7897,5667],[-7,-13]],[[7890,5654],[-9,-13],[-10,-5],[-24,-45],[2,-14],[-10,-19]],[[7839,5558],[-13,12],[-16,12],[-34,24]],[[7776,5606],[22,48]],[[7798,5654],[23,45]],[[7982,5606],[-18,9]],[[7964,5615],[-59,30],[-15,9]],[[7908,5689],[16,-8],[7,-3],[70,-36]],[[8001,5642],[-11,-21],[-8,-15]],[[7942,5529],[-10,-18]],[[7932,5511],[-9,4],[-3,2],[-54,27],[-2,1],[-9,5],[-10,-19],[-9,-19]],[[7836,5512],[-8,5],[-3,1],[-6,3]],[[7819,5521],[1,5],[7,15],[7,14],[5,3]],[[7964,5615],[-9,-19],[-9,-18],[-2,-3],[-10,-18],[-9,-18],[5,-3],[12,-7]],[[7922,5492],[-10,-19]],[[7912,5473],[-9,5],[-2,1],[-55,28],[-2,1],[-8,4]],[[7932,5511],[-10,-19]],[[7902,5454],[-9,-18]],[[7893,5436],[-10,5],[-2,1],[-25,13],[-29,15],[-2,1],[-9,5]],[[7816,5476],[10,18],[8,-4],[3,-2],[54,-28],[2,-1],[9,-5]],[[7883,5417],[-10,-19]],[[7873,5398],[-9,5],[-3,1],[-54,28],[-2,1],[-9,4]],[[7796,5437],[10,18],[0,1],[10,20]],[[7893,5436],[-10,-19]],[[7779,5446],[-62,45]],[[7717,5491],[3,6],[16,29],[1,2],[18,38],[10,21],[5,9]],[[7770,5596],[6,10]],[[7819,5521],[-10,-19],[-10,-18],[-10,-19],[-10,-19]],[[7796,5437],[-9,-17],[-11,-20]],[[7776,5400],[-23,11],[-2,1],[-2,2],[-11,7],[-42,31],[-2,-3],[-10,-18],[-9,-17],[-10,-16],[-9,-17]],[[7656,5381],[-49,36]],[[7607,5417],[9,17],[9,17],[2,4],[7,13]],[[7634,5468],[9,18],[2,3],[9,17],[8,15],[4,7]],[[7666,5528],[51,-37]],[[7779,5446],[6,-3],[3,-1],[8,-5]],[[7751,5351],[-13,-25]],[[7738,5326],[-10,5],[-1,1],[-14,8]],[[7713,5340],[-57,41]],[[7776,5400],[-1,-4],[-12,-23]],[[7763,5373],[-12,-22]],[[7685,5288],[-57,42]],[[7628,5330],[10,17],[9,17],[9,17]],[[7713,5340],[-10,-18],[-9,-17],[-5,-9],[-4,-8]],[[7702,5259],[-26,12]],[[7676,5271],[9,17]],[[7738,5326],[-12,-22],[-12,-24],[-12,-21]],[[7656,5236],[-56,41]],[[7600,5277],[9,18],[10,17],[9,18]],[[7676,5271],[-10,-18],[-10,-17]],[[7666,5190],[-8,4],[-4,3],[-14,7]],[[7640,5204],[7,14],[5,9],[4,9]],[[7702,5259],[-12,-23]],[[7690,5236],[-12,-23],[-12,-23]],[[7640,5204],[-2,-3]],[[7638,5201],[-57,42]],[[7581,5243],[9,17],[10,17]],[[7666,5190],[-10,-20],[-13,-22]],[[7643,5148],[-26,13],[-3,2],[-37,19],[-21,14]],[[7556,5196],[7,12],[9,17]],[[7572,5225],[42,-30],[14,-12],[10,18]],[[6885,1991],[-44,28]],[[6841,2019],[11,23],[7,13],[4,8]],[[6744,1989],[11,23],[11,24]],[[6766,2036],[63,-40],[12,23]],[[6766,2036],[11,24]],[[6777,2060],[11,24]],[[6788,2084],[11,20],[10,19],[9,19]],[[6788,2084],[-58,36]],[[6812,1716],[6,4],[10,4],[10,5],[-58,38],[-8,-8],[-7,-5],[-8,-7],[-8,-6]],[[7126,2087],[1,-1],[5,-4],[22,19]],[[7154,2101],[22,-16],[32,-24],[16,16],[7,7],[18,7],[19,5],[18,9],[4,5],[17,15]],[[7307,2125],[17,13],[22,10],[23,11]],[[7369,2159],[17,14],[29,34]],[[7415,2207],[19,13]],[[7434,2220],[5,5],[13,10],[4,5],[3,-3],[2,-1],[6,-7],[5,-6],[1,-1]],[[7473,2222],[-2,-3],[-3,-4],[-24,-26],[-71,-63],[-49,-40],[-52,-38],[-25,-18],[-1,0],[-49,-32],[-50,-31],[-48,-38],[-139,-160],[-7,-11],[-10,-15],[-37,-56],[-8,-10],[-10,-10],[-45,-39],[-4,-1],[-2,0],[-2,1],[-2,0],[-3,2]],[[7404,1647],[-9,-17],[-28,-56],[-10,-21],[-4,-10],[-5,-9],[-10,-13],[-6,-8],[-3,-3],[-8,-10],[-36,-48]],[[7285,1452],[-2,-2],[-39,-51],[-5,-7]],[[7239,1392],[-16,-18],[-38,-37],[-32,-30],[-8,-7]],[[7145,1300],[-24,-23],[-1,0],[-24,-23],[-9,-9],[-8,-9]],[[6829,1427],[24,16],[23,15],[21,17],[19,16],[26,25],[19,27],[16,28],[16,29],[31,37],[3,4],[3,4],[10,11],[25,29],[31,35],[25,20],[37,28],[91,67],[2,1]],[[7251,1836],[1,0],[2,-1],[4,-2],[119,-93],[5,-5],[4,-9],[16,-77],[2,-2]],[[7143,1118],[-18,4],[15,36],[-15,12],[-15,12],[1,3]],[[7145,1300],[10,-7],[49,-35]],[[7204,1258],[-25,-53],[-7,-18],[-7,-16]],[[5655,1209],[-29,15],[-2,21],[-22,-1],[3,-37]],[[5605,1207],[-24,13]],[[5581,1220],[-25,15]],[[5556,1235],[-1,6],[6,1],[11,1],[-6,77]],[[5566,1320],[19,0],[20,0],[4,0],[37,-1],[23,-1],[3,0]],[[5672,1318],[2,-20],[4,-44],[0,-7]],[[5678,1247],[-3,0],[-24,-1],[4,-37]],[[5556,1235],[-5,2],[-2,4],[-26,12]],[[5523,1253],[-1,10],[0,18],[4,19],[1,19]],[[5527,1319],[20,1],[19,0]],[[5487,1147],[-10,125]],[[5477,1272],[24,-9],[22,-10]],[[5556,1235],[1,-15],[4,-35],[-2,-14],[1,-14],[-34,-4]],[[5526,1153],[-14,-2],[-25,-4]],[[5584,1066],[-25,15],[-8,5],[-11,6],[-9,4],[-2,26],[0,6],[-3,25]],[[5581,1220],[5,-60],[5,-58]],[[5591,1102],[1,-16],[-8,-20]],[[5605,1207],[26,-15],[21,-11]],[[5652,1181],[3,-3]],[[5655,1178],[4,-58],[-22,-2],[4,-47],[-26,16],[-24,15]],[[5655,1209],[1,-18],[-4,-10]],[[5685,1161],[-3,1],[-7,3],[-8,6],[-12,7]],[[5678,1247],[2,-28],[4,-46],[1,-12]],[[5699,1041],[-16,3],[-5,-2],[-12,-9],[-7,-3],[-6,0],[-8,1],[-10,5],[-14,7],[-13,8],[-24,15]],[[5685,1161],[48,-25],[20,-8],[25,-8],[15,-3]],[[6161,5074],[-4,2],[-53,24],[-13,-21],[-35,17],[1,-5],[0,-4],[0,-2],[-1,-6],[-2,-9]],[[6054,5070],[-4,-14],[-14,-24]],[[6036,5032],[-25,-47],[-6,0],[-7,-18]],[[5998,4967],[-12,5],[-2,2]],[[5984,4974],[9,16],[8,18],[4,5],[4,4],[8,14],[2,7],[2,1],[7,11],[6,13],[8,16],[2,7],[1,8],[1,9],[0,25],[0,4],[2,16],[13,44],[7,15],[11,19]],[[6079,5226],[4,0],[7,-3],[70,-34]],[[6160,5189],[10,-5],[8,-4],[5,-2]],[[6183,5178],[-3,-5],[0,-3],[-1,-3],[0,-18],[0,-14],[-1,-11],[-2,-5],[-15,-45]],[[6267,4964],[-14,7],[-48,23]],[[6205,4994],[10,26],[4,13],[4,12],[-62,29]],[[6183,5178],[11,-6],[64,-31]],[[6258,5141],[61,-29]],[[6185,4939],[-58,30]],[[6127,4969],[9,30],[8,25]],[[6144,5024],[4,13],[4,13],[5,13],[4,11]],[[6205,4994],[-8,-23],[-2,-4],[-10,-28]],[[6226,4852],[-15,7],[-47,24]],[[6164,4883],[7,17],[4,11],[1,3],[4,12],[5,13]],[[6164,4883],[-14,7]],[[6150,4890],[-43,22]],[[6107,4912],[6,17],[4,11],[1,4],[4,11],[5,14]],[[6150,4890],[-11,-29]],[[6139,4861],[-43,21]],[[6096,4882],[5,14],[6,16]],[[6207,4802],[-61,30]],[[6146,4832],[8,22],[-15,7]],[[6115,4746],[-58,30]],[[6057,4776],[8,21]],[[6065,4797],[8,22],[8,21]],[[6081,4840],[7,21],[8,21]],[[6146,4832],[-8,-21],[-7,-21],[-8,-23],[-8,-21]],[[6175,4715],[-60,31]],[[6154,4658],[-61,31]],[[6093,4689],[7,19],[8,19],[7,19]],[[6132,4601],[-16,8],[-38,20],[-6,3]],[[6072,4632],[7,19]],[[6079,4651],[7,19],[7,19]],[[6120,4569],[-75,21],[17,47],[10,-5]],[[6113,4545],[0,1],[-130,33]],[[5983,4579],[2,5]],[[5985,4584],[11,29],[3,8],[5,16],[16,44]],[[6020,4681],[59,-30]],[[6020,4681],[8,19],[7,19]],[[6035,4719],[8,18],[7,20],[7,19]],[[6004,4476],[-21,10]],[[5983,4486],[-25,13],[-4,3]],[[5954,4502],[27,73],[2,4]],[[5954,4502],[-4,1],[-6,3]],[[5944,4506],[7,17],[-69,35],[-48,25]],[[5834,4583],[5,13],[5,13],[-1,7]],[[5843,4616],[1,0],[31,-8]],[[5875,4608],[104,-27],[2,4],[4,-1]],[[5954,4502],[-21,-54]],[[5933,4448],[-4,2],[-4,4],[-3,2],[-18,10],[0,3],[-16,7],[-15,8],[-15,9],[11,30],[7,18],[68,-35]],[[5933,4448],[-19,-48],[-6,-18]],[[5841,4433],[-3,2],[-64,48],[-26,20]],[[5748,4503],[6,9],[14,36],[7,20],[8,20],[6,18]],[[5789,4606],[45,-23]],[[6029,4373],[-4,-2],[-26,-9],[-9,-2],[-15,-2],[-9,1],[-7,0],[-6,0],[-11,2],[-9,4],[-13,5],[-13,8]],[[5983,4486],[-11,-29],[-11,-24],[19,-12]],[[5710,4453],[35,46],[3,4]],[[7848,608],[-11,0],[-8,4],[-5,6],[-17,28],[-10,13],[-6,19],[-1,22],[5,9],[5,6],[7,5],[10,9],[5,4],[8,7],[13,2],[11,-1],[15,-4],[5,-1],[17,1],[18,2],[20,5],[25,8],[16,7],[7,3],[12,4],[23,13],[11,5],[9,4],[9,3],[18,7],[10,-3],[4,0],[31,-10],[8,-1],[2,-12],[0,-8],[-4,-12],[0,-5],[-4,-17],[-4,-7],[-10,-9],[-10,-10],[-10,-12],[-7,-9],[-8,-11],[-12,-12],[-4,-2],[-9,-2],[-15,-8],[-28,-13],[-23,-3],[-25,-8],[-11,-2],[-14,-1],[-10,-4],[-19,-1],[-10,-1],[-29,-7]],[[7669,768],[-1,7]],[[7668,775],[4,5],[8,6],[3,7],[1,9],[-1,7],[-4,5],[-5,4],[-5,7],[-5,4],[-3,3],[-3,5],[-14,9],[-3,1],[-3,-2],[-1,-4],[-1,-2]],[[7636,839],[-12,10],[-6,1],[-4,1],[-2,1]],[[7612,852],[-65,17]],[[7547,869],[4,22],[4,21]],[[7555,912],[4,22],[4,20],[5,20]],[[7568,974],[65,-17]],[[7633,957],[51,-13]],[[7684,944],[38,12],[15,15]],[[7737,971],[-27,-27],[-9,-8],[-10,-10],[-7,-10],[-2,-7],[-1,-13],[1,-5],[4,-2],[4,0],[13,-4],[10,-6],[4,-6],[6,-13],[3,-3],[5,0],[8,4],[3,5],[11,13],[5,6],[2,0],[-1,-2],[-18,-25],[-10,-14],[0,-11],[-8,-4],[-4,-4],[-13,-20],[-3,-7],[-6,-9],[-6,-2],[-13,-11],[-9,-8]],[[7915,744],[-7,0],[-7,3],[-11,2],[-23,7],[-12,2],[-16,1],[-1,2],[4,3],[8,3],[21,11],[9,8],[32,20],[11,4],[6,2],[42,21],[13,6],[8,1],[12,-1],[18,-3],[27,-9],[13,-3],[27,-14],[6,-5],[0,-3],[-7,0],[-9,2],[-12,1],[-8,0],[-12,-2],[-12,-3],[-11,-5],[-18,-5],[-14,-5],[-13,-3],[-11,-4],[-18,-8],[-21,-6],[-9,-5],[-7,-1],[-2,-2],[2,-2],[5,-2],[2,-5],[-1,-2],[-4,-1]],[[7608,830],[-2,0],[-7,1],[-50,3],[-11,1]],[[7538,835],[4,14],[5,20]],[[7612,852],[-1,-7],[0,-4],[2,2],[-1,-4],[-4,-9]],[[7522,803],[4,8]],[[7526,811],[9,20],[1,2],[2,2]],[[7608,830],[-1,-3],[-9,-24],[-2,-4],[-3,-10],[-4,-11],[-9,-17],[-13,-13],[-14,-11],[-6,-5],[-11,20],[18,15],[11,11],[3,8],[-12,6],[-12,4],[-22,7]],[[7636,839],[-4,-4],[-3,-5],[-13,-27],[-34,-61],[-2,-3],[-7,-9],[-7,-12],[-13,-14],[-25,-35],[-11,-20],[-21,-30],[-15,-22],[-15,-18],[-9,-9],[-13,-11],[-19,-14],[-3,-2],[-14,-6],[-12,-4],[-12,-7],[-3,-2]],[[7381,524],[-1,6]],[[7380,530],[31,10],[49,37],[51,77],[5,9],[-22,13],[-25,15]],[[7469,691],[10,19],[15,32],[10,23]],[[7504,765],[8,17],[10,21]],[[7715,417],[-8,-8],[-9,-8],[-6,-7],[-18,-14],[-10,-4],[-19,1],[-8,2],[-11,10],[-10,12],[-4,9],[8,14],[9,6],[7,3],[3,2],[5,-1],[6,-2],[7,-4],[3,-1],[20,-3],[18,-2],[18,-2],[-1,-3]],[[7669,768],[-5,-5],[-8,-14],[-28,-30],[-11,-14],[-8,-12],[-6,-7],[-1,-1],[-1,0],[0,4],[6,11],[10,14],[22,26],[5,8],[15,15],[6,8],[3,4]],[[7380,530],[-9,14],[-9,19],[-16,35]],[[7346,598],[19,7],[18,8],[5,1],[14,6],[17,9],[2,1],[11,8],[2,2],[9,9],[4,4]],[[7447,653],[7,8],[7,12],[8,18]],[[7346,598],[-10,25]],[[7336,623],[67,28],[11,23]],[[7414,674],[16,-9],[17,-12]],[[7336,623],[-9,20],[-9,21]],[[7318,664],[17,6],[17,8]],[[7352,678],[25,9],[4,9]],[[7381,696],[17,-11],[16,-11]],[[7633,957],[4,21],[5,21]],[[7642,999],[74,-20]],[[7716,979],[-17,-17],[-15,-18]],[[7568,974],[3,22],[4,21]],[[7575,1017],[67,-18]],[[7630,1111],[-4,-21],[32,-7],[-8,-42]],[[7650,1041],[-4,-21],[-4,-21]],[[7575,1017],[5,21]],[[7580,1038],[3,20],[0,9],[-5,15],[-12,24],[-7,15],[0,9]],[[7559,1130],[71,-19]],[[7451,1007],[-13,5]],[[7438,1012],[39,41],[24,26],[10,12],[14,22],[28,52],[1,1]],[[7554,1166],[12,-2]],[[7566,1164],[-6,-11],[-3,-8],[2,-15]],[[7580,1038],[-66,18],[-5,-21],[-25,7],[-17,-18],[-16,-17]],[[7501,993],[-50,14]],[[7568,974],[-67,19]],[[6314,834],[-39,-1],[-2,-11],[-18,7],[-10,7],[-22,32],[-9,9]],[[6214,877],[0,47],[0,4],[17,0],[0,-34],[8,-8],[10,-13],[-1,55],[18,1],[0,9]],[[6266,938],[46,1]],[[6312,939],[1,-27],[1,-78]],[[6375,732],[-5,-17]],[[6370,715],[-11,11],[-5,9],[-14,17],[-2,4],[-17,17],[-3,3],[-35,24],[-8,11],[-1,1],[-10,4],[-5,0],[-8,5],[-3,4],[-11,14],[-2,3],[-7,7],[-17,18]],[[6211,867],[0,12]],[[6211,879],[3,-2]],[[6314,834],[20,0],[19,1]],[[6353,835],[20,0],[1,-80],[-5,-16],[3,-4],[3,-3]],[[6533,876],[-2,-8],[24,-6]],[[6555,862],[-22,-78],[-1,-6],[-4,-13]],[[6528,765],[-9,2],[-4,1],[-9,3],[-2,0],[-6,2],[-21,6]],[[6477,779],[-22,8],[-10,6],[-18,7],[-14,-46],[-14,-47],[-10,12],[-3,4],[-3,3],[-8,6]],[[6375,732],[1,6],[13,54],[1,3],[6,24],[3,17],[3,23],[1,5]],[[6403,864],[2,3],[1,2],[2,2],[2,4],[2,3],[1,2],[7,6],[12,5],[11,0],[17,-5],[5,-1],[19,-6],[45,-11],[2,8]],[[6531,876],[2,0]],[[6488,656],[-1,-2],[0,-4],[-1,-3],[-2,-6],[-2,-7],[-2,-5]],[[6480,629],[-3,-9]],[[6477,620],[-7,4],[-7,6],[-3,2],[-13,11],[-21,20],[-5,6],[-4,5],[-11,12],[-18,15],[-8,4],[-10,10]],[[6477,779],[-16,-53],[-5,-19],[-1,-7],[-5,-20],[17,-10],[7,-5],[1,-1],[13,-8]],[[6606,724],[-21,8],[-20,-74]],[[6565,658],[-51,33],[-6,4],[-1,-7],[-5,-16],[-6,-22],[-8,6]],[[6528,765],[6,-2],[11,-6],[13,-7],[32,-16],[3,-1],[14,-5],[-1,-4]],[[6565,658],[-7,-22],[-6,-22],[-7,-24],[-19,14],[-16,9],[-21,12],[-9,4]],[[6903,754],[18,-4],[17,-5],[19,-3]],[[6957,742],[-18,-64]],[[6939,678],[-9,-4],[-11,3],[-16,7],[-18,7],[18,63]],[[6940,607],[-2,4],[-2,-2],[-1,-1],[-3,-2],[-3,-1],[-4,0],[-3,1],[-4,1]],[[6918,607],[1,3],[6,21],[6,20]],[[6931,651],[6,20],[2,7]],[[6957,742],[18,-5],[20,-4],[20,1],[15,6],[7,4],[7,7],[7,11],[2,2]],[[7053,764],[4,-5],[4,-5],[3,-5],[14,-38],[1,-7],[1,-4],[3,-7]],[[7083,693],[-15,-8],[-37,-15],[-33,-16],[-18,-13],[-24,-20],[-16,-14]],[[7098,603],[-7,-20],[-14,-7],[-13,-4],[-7,-4]],[[7057,568],[-7,-2]],[[7050,566],[-16,44],[-8,19],[-30,-15],[-6,-3],[-15,-17],[1,-48]],[[6976,546],[-1,-59],[-1,-44],[-15,5],[-12,3],[-3,1],[-2,0],[-22,2],[-13,-2],[-5,0]],[[6902,452],[11,50],[12,46],[15,34],[18,25],[25,20],[29,21],[38,15],[33,14],[5,2]],[[7088,679],[3,-6],[2,-7],[2,-4],[2,-3],[3,-3],[2,-2],[14,-11],[-7,-13],[-7,-16],[-4,-11]],[[6993,546],[-17,0]],[[7050,566],[-20,-7],[-18,-7],[-19,-6]],[[7057,568],[-4,-31],[-1,-22],[-1,-4],[0,-23]],[[7051,488],[-22,0],[-21,0],[-15,58]],[[7098,603],[18,-8],[6,-14],[17,-45],[9,-20]],[[7148,516],[-15,-7],[-33,-13],[-9,-4]],[[7091,492],[-14,-3],[-26,-1]],[[7148,516],[15,-35],[8,-23]],[[7171,458],[-20,-8],[-37,-11],[-13,-3],[-8,22],[-2,34]],[[7194,535],[18,-43],[18,2]],[[7230,494],[19,1],[20,-1]],[[7269,494],[-4,-23],[-19,1],[-24,-4],[-29,-2],[-22,-8]],[[7148,516],[19,8],[9,4]],[[7176,528],[18,7]],[[7194,535],[17,8],[-19,44],[0,7],[2,8],[17,19],[13,10],[12,-14],[8,-15],[9,-20],[7,-19]],[[7260,563],[-16,-7],[8,-18]],[[7252,538],[-17,-7],[-17,-7],[12,-30]],[[7252,538],[16,6],[16,7],[21,-49]],[[7305,502],[-7,-7],[-9,-3],[-8,-1],[-12,3]],[[7260,563],[33,13]],[[7293,576],[26,-62],[-14,-12]],[[7175,450],[-4,8]],[[7293,576],[53,22]],[[7381,524],[-20,-14],[-8,-7],[-12,-8],[-18,-15],[-10,-6],[-12,-11],[-6,-4],[-4,-1],[-3,0],[-3,2],[-12,0],[-26,-4],[-16,-4],[-18,0],[-22,1],[-3,0],[-13,-3]],[[7175,450],[-16,-4],[-18,-6],[-10,-4],[-10,-7],[-8,-5],[-22,-3],[-11,1],[-5,3],[-8,3],[-21,2],[-35,0],[-26,-1],[-26,0],[-13,-2],[-8,1],[-1,-5],[-2,-2],[-7,-6],[-3,0],[-16,4],[-11,-2],[-4,1],[8,34]],[[6886,453],[-7,-32],[-23,4]],[[6856,425],[16,35]],[[6872,460],[3,-4],[4,-2],[3,-1],[4,0]],[[7464,1065],[-2,2],[-3,4],[-2,4],[-3,2],[-5,5],[-4,2],[-9,5]],[[7436,1089],[-9,3],[-16,5],[-78,21]],[[7333,1118],[-56,17]],[[7277,1135],[13,65]],[[7290,1200],[56,-15],[4,22]],[[7350,1207],[2,-1],[2,-1],[70,-17],[2,-2],[-1,-3],[-3,-17],[10,-3],[7,-3],[5,-2],[9,-4],[37,-9],[11,21],[2,3]],[[7503,1169],[17,1],[11,4],[4,-1]],[[7535,1173],[2,-1]],[[7537,1172],[-2,-3],[-24,-46],[-16,-23],[-10,-11],[-20,-24],[-1,0]],[[7350,1207],[4,12]],[[7354,1219],[95,-32],[54,-18]],[[7290,1200],[5,22],[2,12]],[[7297,1234],[57,-15]],[[7399,1492],[20,35],[6,30]],[[7481,1573],[2,-10],[7,-32],[0,-2],[8,-40],[-2,-11]],[[7496,1478],[-21,5],[-21,6],[-21,5],[-10,0],[-6,0],[-8,-1],[-10,-1]],[[7518,1584],[3,-10],[0,-2],[7,-35],[8,-37],[3,-11]],[[7539,1489],[2,-10],[-2,-12]],[[7539,1467],[-21,5],[-22,6]],[[7554,1595],[3,-12],[15,-72],[3,-12]],[[7575,1499],[-18,-5],[-18,-5]],[[7637,1518],[-27,-8]],[[7610,1510],[-19,-6],[-16,-5]],[[7610,1510],[3,-12],[9,-41],[-2,-11]],[[7620,1446],[-21,6],[-19,5],[-20,5],[-21,5]],[[7679,1530],[2,-10],[11,-48],[2,-2]],[[7694,1470],[-9,-16],[-5,-9]],[[7680,1445],[-2,-3],[-5,-9]],[[7673,1433],[-3,1],[-20,4],[-30,8]],[[7740,1546],[-18,-29],[-18,-30],[-10,-17]],[[7675,1631],[3,-10],[17,-75],[2,-10],[9,3],[9,3],[23,6],[2,-2]],[[7983,2761],[-12,16],[-9,10],[-7,7]],[[7955,2794],[26,32],[-7,8],[25,25]],[[7999,2859],[7,-8],[5,-5],[3,-3],[10,-12],[13,-17]],[[8037,2814],[-28,-27],[0,-1],[-26,-25]],[[7932,2709],[-8,21],[-4,11]],[[7920,2741],[8,11],[3,6],[24,36]],[[7983,2761],[-26,-27],[-10,-10],[-15,-15]],[[7949,2664],[-8,20],[-9,25]],[[7983,2761],[15,-20],[12,-15]],[[8010,2726],[-28,-29],[-33,-33]],[[8041,2683],[-25,-24]],[[8016,2659],[-7,10],[-23,-23],[-22,-22]],[[7964,2624],[-8,21]],[[7956,2645],[-7,19]],[[8010,2726],[10,-15],[2,-1],[11,-16],[8,-11]],[[8022,2541],[-5,7],[-6,8]],[[8011,2556],[-8,11],[-19,25],[-5,6],[-3,4],[0,4],[-12,18]],[[8016,2659],[7,-9],[11,-14],[4,-5],[12,-16],[12,-16],[1,-1]],[[8063,2598],[-13,-17],[-27,-38],[-1,-2]],[[8041,2683],[6,-9],[26,26],[13,11],[16,16]],[[8102,2727],[11,-16],[1,-3],[19,-15]],[[8133,2693],[-5,-7],[-19,-25],[-14,-20],[-7,-8],[-22,-32],[-3,-3]],[[8010,2726],[26,25],[27,28]],[[8063,2779],[11,-15],[12,-16]],[[8086,2748],[16,-21]],[[8037,2814],[9,-11],[6,-9]],[[8052,2794],[11,-15]],[[8052,2794],[17,18],[7,11]],[[8076,2823],[14,-12],[15,-12],[16,-12],[-8,-12],[-27,-27]],[[8285,2852],[-5,-5],[-3,5],[-10,-4],[6,-8],[-17,-17],[-6,9],[-7,-8],[3,-5],[-11,-6],[-9,-3],[-14,-3],[-11,-3],[-6,0],[-1,-3],[27,6],[6,0],[17,4],[-1,-3],[-10,-10],[-37,-37],[-2,-2],[-7,-3],[-9,-8],[-19,-22],[-6,-8],[-7,-9],[-5,-4],[0,-3],[-8,-9]],[[8076,2823],[13,22],[13,23],[27,48]],[[8129,2916],[23,-18],[12,-11],[14,29]],[[8178,2916],[16,-12],[24,-20],[36,-17],[31,-15]],[[8179,2575],[-13,18],[-1,1],[-14,19],[-50,-51]],[[8101,2562],[-13,12],[-8,7],[-12,12]],[[8068,2593],[5,7],[6,6],[6,7],[16,17],[5,2],[6,8],[15,20],[3,6],[5,4],[8,10],[9,11],[15,19],[33,35],[1,5],[2,2]],[[8223,2723],[-35,-36],[16,-20],[14,-19],[14,-19]],[[8232,2629],[-27,-27],[-26,-27]],[[8280,2678],[-18,-18],[-14,-14],[-16,-17]],[[8260,2542],[-5,11],[-10,19]],[[8245,2572],[14,21],[-12,16],[-15,20]],[[8245,2572],[-9,-11],[-27,-26],[-15,20],[-15,20]],[[8260,2542],[-31,-36],[-19,-19],[-13,-13]],[[8197,2474],[-3,3],[-3,1],[-10,10],[-15,14],[-13,12],[-19,17]],[[8134,2531],[45,44]],[[8272,2517],[-41,-74]],[[8231,2443],[-13,12],[-16,14],[-1,2],[-4,3]],[[8290,2482],[-33,-64]],[[8257,2418],[-14,13]],[[8243,2431],[-12,12]],[[8280,2365],[-21,12],[8,17],[5,11],[-15,13]],[[8271,2345],[-20,14],[-18,12],[-9,5],[-8,6],[6,11],[3,6],[13,22],[5,10]],[[8262,2326],[-20,13]],[[8242,2339],[-17,10],[-20,11],[-15,9],[-15,8],[-33,19],[-1,0],[-9,1],[-12,3]],[[8120,2400],[1,10],[0,4],[0,2],[0,5],[0,10],[0,6]],[[8121,2437],[22,6],[16,8],[16,9],[14,8],[7,5],[1,1]],[[6637,501],[-2,-12]],[[6635,489],[-23,26],[-11,12],[-16,12],[-16,19],[-5,7],[-31,25],[-18,9],[-10,3],[-15,10],[-13,8]],[[6565,658],[3,-67],[44,-43],[2,-22],[23,-25]],[[6565,658],[17,-7],[-6,-21]],[[6576,630],[-3,-14],[1,-7],[34,-36],[4,-5],[6,-4],[6,-3],[27,-10]],[[6651,551],[-8,-28]],[[6643,523],[-6,-22]],[[6576,630],[10,-6],[30,-30]],[[6616,594],[10,-11],[12,-5],[10,37]],[[6648,615],[19,-7]],[[6667,608],[-9,-31],[-7,-26]],[[6616,594],[10,13],[1,5],[-17,16],[-2,4],[0,3],[3,14],[5,21],[-16,7],[5,20]],[[6605,697],[60,-22],[-6,-20],[-11,-40]],[[6606,724],[5,-2],[-6,-25]],[[6691,692],[-9,-33]],[[6682,659],[-15,-51]],[[6555,862],[95,-24]],[[6650,838],[78,-17]],[[6728,821],[-27,-94],[-9,-31],[-1,-4]],[[6682,659],[18,-8],[17,-6]],[[6717,645],[-13,-48],[-3,-2],[-16,5],[-18,8]],[[6822,642],[-10,-33]],[[6812,609],[-42,16]],[[6770,625],[-17,6],[-17,7]],[[6736,638],[-16,6],[-3,1]],[[6691,692],[23,-9],[27,-10],[33,-13],[48,-18]],[[6770,625],[-13,-47],[-2,-3],[-4,0],[-13,5],[-16,6],[0,6],[14,46]],[[6812,609],[-15,-52]],[[6797,557],[-10,-33],[-11,-37]],[[6776,487],[-20,2],[-5,1],[-20,3],[-18,4],[-16,5],[-36,14],[-18,7]],[[6834,517],[2,-23],[-18,-3],[4,-33]],[[6822,458],[-26,-6],[-8,0],[-9,-1],[-13,2],[10,34]],[[6797,557],[20,-8],[9,-3],[4,0],[4,-29]],[[6856,425],[-81,14],[-9,-1],[-14,1],[-15,4],[-11,2],[-13,2],[-3,2],[-16,5],[-16,7],[-9,2],[-21,12],[-6,6],[-7,8]],[[6822,458],[31,5],[10,0],[5,-2],[4,-1]],[[6834,517],[11,2],[5,4],[2,4],[6,21]],[[6858,548],[19,-7],[-13,-45],[5,-1],[4,-1],[5,-1],[4,-2],[-10,-31]],[[6822,642],[52,-19]],[[6874,623],[-6,-24],[-2,-24],[-8,-27]],[[6874,623],[29,-11],[15,-5]],[[6940,607],[-4,-4],[-11,-19],[-17,-46],[-12,-43],[-10,-42]],[[6822,642],[1,4],[9,31],[28,-10],[3,11]],[[6863,678],[9,-4],[8,-3],[51,-20]],[[6863,678],[22,80],[18,-4]],[[7573,1803],[-22,96]],[[7592,1912],[3,-11],[4,-18],[1,-5]],[[7600,1878],[2,-11],[9,-40],[3,-11]],[[7668,1904],[-1,-20]],[[7667,1884],[-1,-21]],[[7666,1863],[-9,1],[-13,1],[-12,1],[-3,-1],[-6,-1],[-3,10],[-2,9],[-18,-5]],[[7666,1863],[-1,-20],[-1,-10],[0,-10]],[[7664,1823],[-22,1],[-10,-2],[-18,-6]],[[7664,1823],[17,-1],[29,-2],[-1,-20],[10,0],[23,-2],[10,0]],[[7714,1880],[-1,-21],[8,0],[25,-2],[9,-1]],[[7667,1884],[9,-1],[29,-2],[9,-1]],[[7714,1880],[1,21],[1,20],[1,21]],[[7530,1791],[-3,12],[-15,72],[-3,11]],[[7509,1886],[19,6],[23,7]],[[7497,1781],[-3,12],[-13,61],[-1,7],[0,2],[1,2]],[[7481,1865],[1,2],[1,11],[9,3],[17,5]],[[7457,1770],[-5,24],[-5,24],[-7,35],[11,3],[10,3],[20,6]],[[7251,1836],[25,14],[30,16],[35,19],[72,37],[123,85],[22,18],[3,3],[3,2],[1,1]],[[7176,528],[-9,21],[-1,5],[-8,17],[-1,5],[-8,18],[-3,8],[2,5],[15,17],[12,15],[17,17],[12,9],[15,9],[16,9],[-16,43],[14,16],[15,14]],[[7248,756],[34,-22],[5,-6],[7,-11],[24,-53]],[[7088,679],[20,8],[29,17],[38,29],[1,0],[47,51],[2,2]],[[7225,786],[0,-1],[5,-7],[5,-5],[13,-17]],[[7083,693],[36,18],[24,16]],[[7143,727],[-15,-12],[-45,-22]],[[7225,786],[37,40]],[[7262,826],[1,-1],[12,-9],[8,-6],[7,-4],[65,-42]],[[7355,764],[-6,-10],[-5,-8],[-2,-1],[-6,-6],[-8,-4],[12,-27],[12,-30]],[[7355,764],[33,-21],[11,-7]],[[7399,736],[-9,-20],[-9,-20]],[[7445,731],[-9,-19]],[[7436,712],[-37,24]],[[7355,764],[9,19],[17,-11],[15,-10],[10,19]],[[7406,781],[48,-30],[-9,-20]],[[7436,712],[13,-7],[20,-14]],[[7445,731],[18,-11],[25,55]],[[7488,775],[16,-10]],[[7406,781],[7,18]],[[7413,799],[49,-30],[9,17],[17,-11]],[[7413,799],[10,20]],[[7423,819],[23,-4],[36,-3],[23,-1],[-17,-36]],[[7423,819],[-17,9],[-17,11],[4,8],[5,9]],[[7398,856],[8,-4],[11,-6],[19,-7],[16,-4],[41,-2],[25,-1],[5,-2],[3,-3],[1,-2],[0,-2],[1,-2],[0,-3],[-1,-2],[-1,-5]],[[7398,856],[0,2],[1,1],[5,11],[7,16],[4,18]],[[7415,904],[66,-17]],[[7481,887],[66,-18]],[[7415,904],[4,21],[4,22],[5,21],[66,-18]],[[7494,950],[-4,-20]],[[7490,930],[-5,-22],[-4,-21]],[[7501,993],[-4,-21],[-3,-22]],[[7415,904],[-48,12],[-12,6],[-2,1]],[[7353,923],[14,13],[71,76]],[[7684,2843],[-14,-11],[-9,-7]],[[7661,2825],[-6,-2],[-11,-6],[-11,-9]],[[7633,2808],[-29,21],[-31,22],[-11,7],[-9,8]],[[7553,2866],[12,18],[19,-12],[4,-3],[21,3],[3,2],[2,4],[2,4],[4,5],[6,-1],[8,-6]],[[7634,2880],[50,-37]],[[7727,2937],[-5,-7],[-8,5],[-9,-1],[-11,-6],[-7,-9],[-6,-12],[-13,9],[-11,7],[-11,-22],[-12,-21]],[[7553,2866],[-4,2]],[[7579,2979],[13,-8],[9,14],[8,14]],[[7609,2999],[15,-8],[16,-8],[14,-7],[18,-10],[25,-13],[30,-16]],[[7745,2927],[-15,-22],[-16,-23],[-14,-20],[-16,-19]],[[7727,2937],[18,-10]],[[7866,3000],[-19,18]],[[7847,3018],[15,20],[8,11]],[[7870,3049],[12,-12],[3,-3],[3,-2]],[[7888,3032],[-8,-11],[-3,-5],[-4,-6],[-7,-10]],[[7891,2976],[-7,6],[-2,3],[-7,7],[-2,1],[-7,7]],[[7888,3032],[8,-9],[8,-7],[9,-10]],[[7913,3006],[-11,-15],[-11,-15]],[[7911,2957],[-20,19]],[[7913,3006],[10,-9],[2,-1],[7,-7]],[[7932,2989],[-1,-2],[-6,-10],[-8,-10],[-1,-1],[-4,-6],[-1,-3]],[[7952,2919],[-3,3],[-6,7],[-9,9],[-8,6],[-3,1],[-12,12]],[[7932,2989],[0,3],[7,8],[9,13],[6,10],[14,-14]],[[7968,3009],[-5,-7],[-2,-2],[-9,-13],[-6,-8],[-2,0],[-2,0],[4,-2],[24,-24],[1,-1],[1,-2]],[[7972,2950],[-1,-2],[-9,-15],[-10,-14]],[[7968,3009],[12,-11],[8,-7],[2,-2],[1,-1],[1,-2]],[[7992,2986],[-8,-16],[-12,-20]],[[8023,3038],[-16,-27],[-15,-25]],[[7913,3006],[24,34],[14,20],[14,20]],[[7965,3080],[11,-8],[5,-3],[23,-17],[4,-5],[7,-5],[5,-1],[3,-3]],[[7888,3032],[5,7],[10,13],[2,3],[0,1],[6,8]],[[7937,3101],[18,-14],[10,-7]],[[7847,3018],[-13,13]],[[7834,3031],[18,35],[20,37]],[[7894,3081],[-7,-9],[-17,-23]],[[7830,3205],[-10,-19],[-5,-11],[-4,-6],[-22,-45]],[[7789,3124],[-7,3],[-4,0],[-7,-2],[-5,-2],[-8,-6],[7,10],[4,6],[2,5],[33,70]],[[7804,3208],[3,-2],[6,11],[17,-12]],[[7804,3208],[4,17],[5,24],[2,7]],[[7815,3256],[32,71],[9,19],[12,23],[15,26]],[[7883,3395],[49,-39],[-2,-4],[-18,-22]],[[7912,3330],[-13,-21]],[[7899,3309],[-17,-24]],[[7882,3285],[-19,-27]],[[7863,3258],[-17,-27],[-16,-26]],[[7900,3152],[-29,22],[-6,5]],[[7865,3179],[-35,26]],[[7863,3258],[39,-30],[8,-7],[21,-16]],[[7931,3205],[-9,-16],[-8,-12],[-7,-12],[-7,-13]],[[7887,3131],[-25,-3],[-12,-2],[-13,-1]],[[7837,3125],[18,41],[2,0],[8,13]],[[7900,3152],[-13,-21]],[[8242,2339],[-19,-40]],[[8223,2299],[-17,10],[-11,7],[-36,24],[-2,0],[-4,-2],[-4,-1],[-7,-3],[-9,-5],[-2,-1]],[[8131,2328],[-10,27],[-3,8],[-1,3],[0,4],[2,21],[1,9]],[[8223,2299],[-11,-29]],[[8212,2270],[-4,1],[-31,2],[-9,-5],[-10,-4],[0,-2]],[[8158,2262],[-6,13],[0,1],[-14,34],[-4,10],[-2,5],[-1,3]],[[8203,2195],[-14,8],[-10,4]],[[8179,2207],[3,1],[17,29],[13,33]],[[8149,2209],[2,53],[7,0]],[[8179,2207],[-9,0],[-21,2]],[[8124,2160],[3,51]],[[8127,2211],[22,-2]],[[8191,2174],[-1,-4],[-1,-6],[0,-9]],[[8127,2211],[3,52],[-21,2]],[[8109,2265],[2,60],[0,2],[10,-1],[6,0],[2,1],[2,1]],[[8084,2214],[3,53]],[[8087,2267],[22,-2]],[[8127,2211],[-22,1],[-21,2]],[[8087,2267],[3,57],[0,5],[-7,9],[1,2],[-6,13],[-4,18],[-1,5],[-4,14],[3,3],[9,5],[9,0],[9,1],[21,1]],[[8103,2161],[-22,2]],[[8081,2163],[3,51]],[[6842,3392],[17,-12],[-33,-63],[-1,-4]],[[6825,3313],[-17,13]],[[6808,3326],[34,66]],[[6766,3248],[42,78]],[[6825,3313],[0,-4],[-41,-75]],[[6784,3234],[-18,14]],[[6752,3369],[17,-12]],[[6769,3357],[3,-3],[1,-2],[13,-10]],[[6786,3342],[2,-2],[2,-2],[1,0],[11,-8],[2,-2],[2,-2],[2,0]],[[6766,3248],[-19,13]],[[6747,3261],[-38,29],[-15,11]],[[6694,3301],[39,74],[16,-11],[2,3],[1,2]],[[6769,3357],[15,8],[39,73],[15,2]],[[6838,3440],[-52,-98]],[[6957,3427],[-9,-23],[-34,-65]],[[6914,3339],[-10,6],[-9,7]],[[6895,3352],[38,72],[6,16]],[[6957,3427],[21,-15],[4,0]],[[6982,3412],[-12,-22],[-12,-22],[-12,-22]],[[6946,3346],[-12,-23]],[[6934,3323],[-2,2],[-18,14]],[[6984,3317],[-38,29]],[[6982,3412],[21,1]],[[7003,3413],[-5,-16],[-11,-20],[21,-16],[-12,-22],[-12,-22]],[[6984,3317],[-11,-21]],[[6973,3296],[-17,13]],[[6956,3309],[-18,13],[-4,1]],[[6950,3253],[-15,11],[0,5],[19,37],[2,3]],[[6973,3296],[-1,-3],[-22,-40]],[[6973,3296],[21,-16]],[[6994,3280],[-1,-3],[-22,-40],[-21,16]],[[7010,3266],[-23,-42]],[[6987,3224],[-14,-24]],[[6973,3200],[-35,30]],[[6938,3230],[12,23]],[[6994,3280],[13,-9],[3,-5]],[[6938,3230],[-16,11]],[[6922,3241],[-18,13]],[[6904,3254],[5,13],[13,34],[12,22]],[[6904,3254],[-2,2],[-8,6],[-15,11]],[[6879,3273],[6,11],[29,55]],[[6861,3286],[1,3],[33,63]],[[6879,3273],[-15,11]],[[6864,3284],[-3,2]],[[6904,3254],[-41,-78]],[[6863,3176],[-3,2],[-8,6],[-10,7]],[[6842,3191],[-20,15]],[[6822,3206],[42,78]],[[6880,3163],[-17,13]],[[6922,3241],[-42,-78]],[[6973,3200],[-41,-76]],[[6932,3124],[-33,26]],[[6899,3150],[-19,13]],[[7003,3413],[17,1]],[[7020,3414],[20,-15],[4,-3],[26,-19]],[[7070,3377],[-25,-45],[-35,-66]],[[7145,3353],[-36,-67],[-37,-66]],[[7072,3220],[-13,10],[-49,36]],[[7070,3377],[14,24]],[[7125,3172],[-5,4],[-12,12],[-3,2]],[[7105,3190],[-15,15]],[[7090,3205],[38,68],[32,59]],[[7020,3414],[14,24],[16,30]],[[6939,3671],[-44,-81]],[[6895,3590],[-11,8],[-8,6],[-17,13],[-9,7],[-3,3]],[[6847,3627],[9,17],[21,39],[5,13],[2,2]],[[6884,3698],[2,-2],[9,-7],[2,-1],[2,-2],[6,-6],[11,-2],[23,-7]],[[6939,3671],[25,-7]],[[6964,3664],[-18,-6],[-9,-15],[-29,-51],[-13,-2]],[[6964,3664],[-7,-12],[-20,-37],[-24,-44]],[[6913,3571],[-7,11],[-11,8]],[[6964,3664],[10,-4],[12,-9]],[[6986,3651],[-7,-12],[-49,-92]],[[6964,3664],[9,17],[19,27],[15,27]],[[7007,3735],[12,21],[11,-7]],[[7030,3749],[6,-6],[-34,-64]],[[6939,3671],[17,30],[9,15],[10,13],[6,6],[4,5],[3,3],[4,1],[3,-1],[4,-2],[8,-6]],[[7035,3759],[-5,-10]],[[6884,3698],[19,32]],[[6903,3730],[13,-6],[20,-9],[7,-4],[14,24],[7,17],[19,31],[5,10]],[[6988,3793],[2,-2],[38,-26],[3,-2],[4,-4]],[[7070,3733],[-6,-11],[-2,2],[-5,-1],[-4,-3],[-4,-2],[-3,-4],[-3,-5],[-5,-9],[-3,-5],[-5,-8],[-3,-8],[0,-4]],[[7035,3759],[35,-26]],[[8081,2163],[-2,-35]],[[8079,2128],[-22,0],[-21,1],[-22,2],[3,44],[-41,3],[-4,-4],[-6,-7],[-20,2],[-4,-35],[-15,1]],[[7927,2135],[44,128],[29,53],[24,40],[-5,4],[-25,-41],[-28,-53],[-47,-130]],[[7919,2136],[-2,0],[0,-1],[-10,-38],[0,-1],[0,-2],[-1,-2],[0,-2],[0,-17],[0,-3],[0,-2],[-1,-3],[0,-4],[-1,-8],[-2,-19],[0,-2]],[[7902,2032],[-2,0],[-2,0],[-2,0],[-4,0],[-3,0],[-28,2],[-31,2]],[[7607,2083],[3,3],[4,3],[2,1],[2,2],[2,1],[4,3],[21,15],[20,14],[52,18],[5,1],[5,2],[44,32],[2,2],[2,0],[3,1],[4,3],[7,1],[7,3],[4,3],[5,4],[5,4],[9,7],[8,7],[6,6],[1,3],[-1,2],[1,3],[0,3],[5,4],[1,4],[3,2],[3,3],[2,3],[2,2],[13,18],[11,13],[2,3],[1,3],[2,1],[2,-2],[-1,-3],[2,-1],[2,1],[2,0],[16,25],[2,11],[5,10],[54,97],[5,8],[3,5],[0,3],[1,5],[3,5],[2,4],[2,3],[2,3],[1,2],[3,3],[3,1],[2,3],[19,27],[2,2],[20,28]],[[8031,2526],[7,-14],[3,-12],[9,-41],[6,-8]],[[8056,2451],[1,-11],[0,-2],[3,-13],[31,5],[30,7]],[[7613,2099],[-2,1],[-3,4]],[[7608,2104],[1,2],[27,24],[3,4],[1,2],[1,1],[1,5],[3,16],[2,10],[1,14],[1,4],[2,17],[2,10],[3,15]],[[7656,2228],[27,17],[15,10],[2,3],[6,10]],[[7706,2268],[17,-13]],[[7723,2255],[6,-5],[10,-8]],[[7739,2242],[11,-6],[1,-1],[1,-1],[1,-3],[13,-23],[6,-13]],[[7772,2195],[-3,-1],[-49,-33],[-3,-3],[-5,-4],[-27,-11],[-7,0],[-9,-3],[-18,-10],[-18,-12],[-17,-16],[-3,-3]],[[7790,2307],[-13,-23],[-8,7],[-23,-39],[-3,-6],[-3,-3],[-1,-1]],[[7723,2255],[6,10],[17,31],[18,31]],[[7764,2327],[9,-6],[9,-7],[8,-7]],[[7706,2268],[-4,2],[-6,5],[-2,2],[-6,5],[-9,7],[-9,6]],[[7670,2295],[24,41],[18,32],[17,-13],[9,-7],[9,-7]],[[7747,2341],[9,-7],[8,-7]],[[7794,2428],[-10,-18],[-5,-9],[-1,-1],[-4,-9]],[[7774,2391],[-10,-18],[-1,-3],[-4,-6],[-4,-8],[-8,-15]],[[7670,2295],[-7,4],[-5,3],[-11,8]],[[7647,2310],[-3,1],[-2,2]],[[7642,2313],[1,1],[45,42],[18,17]],[[7706,2373],[26,23],[5,4],[16,19],[18,21]],[[7771,2440],[5,-4],[10,-7],[8,-1]],[[7774,2391],[50,-38]],[[7824,2353],[13,-10],[-11,-18],[-13,10],[-5,-9],[-5,-8],[-8,-14],[-5,3]],[[7794,2428],[21,-17],[5,-3],[25,-19]],[[7845,2389],[-10,-18],[-6,-9],[-5,-9]],[[7845,2389],[20,-15],[8,-8],[20,-20],[6,-4]],[[7899,2342],[-2,-2],[-7,-11],[-1,-3],[-3,1],[-17,-31],[-19,-28],[-11,-12],[-32,-33],[-35,-27],[0,-1]],[[7845,2389],[11,18],[9,16],[-54,41],[4,8],[0,3],[5,9],[2,2],[4,9],[-17,12]],[[7809,2507],[12,19]],[[7821,2526],[18,-15],[9,8],[14,13],[4,3]],[[7866,2535],[9,-9],[-7,-11],[13,-18],[12,-12],[8,-2],[9,15]],[[7910,2498],[33,-26],[12,15],[11,16],[13,16]],[[7979,2519],[5,5],[3,4],[1,2],[8,10],[4,4],[11,12]],[[8022,2541],[-17,-23],[-4,-6],[-2,-2],[-8,-10],[-7,-10],[-8,-11],[-10,-19],[-2,-3],[-14,-24],[-32,-56],[-18,-32],[-1,-3]],[[7742,2464],[-14,13],[-14,14],[-9,9],[-20,19]],[[7685,2519],[6,8],[5,7]],[[7696,2534],[28,-27],[11,15],[11,15]],[[7746,2537],[17,24],[5,7]],[[7768,2568],[7,-6],[11,-8],[35,-28]],[[7809,2507],[-16,-13],[-13,-6],[-18,-11],[-20,-13]],[[7696,2534],[5,7],[3,5],[7,8],[6,7],[20,-16],[9,-8]],[[7685,2519],[-11,10]],[[7674,2529],[32,39],[43,49],[3,3],[2,2],[2,3],[7,8],[2,2],[2,2],[1,1],[25,27],[7,7],[11,-8],[5,-5],[4,-3]],[[7820,2656],[-11,-18],[-10,-18],[-5,-8],[-5,-9],[-10,-18],[-11,-17]],[[6826,3110],[-35,-67]],[[6791,3043],[-2,1],[-19,14]],[[6770,3058],[36,66]],[[6806,3124],[18,-13],[2,-1]],[[6770,3058],[-20,15],[-19,14]],[[6731,3087],[36,66]],[[6767,3153],[19,-14]],[[6786,3139],[20,-15]],[[6712,3101],[36,67]],[[6748,3168],[19,-15]],[[6731,3087],[-19,14]],[[6694,3114],[36,67]],[[6730,3181],[18,-13]],[[6712,3101],[-18,13]],[[6675,3128],[36,67]],[[6711,3195],[19,-14]],[[6694,3114],[-19,14]],[[6657,3142],[36,67]],[[6693,3209],[18,-14]],[[6675,3128],[-18,14]],[[6694,3301],[-8,-13],[-9,-8],[-23,-43]],[[6654,3237],[-34,-62],[19,-14],[-3,-4]],[[6636,3157],[-3,4],[-15,11],[-12,9],[-40,29],[-4,3]],[[6562,3213],[3,4],[0,1],[7,11],[5,5],[14,26],[19,36]],[[6676,3426],[1,-1],[2,-2],[3,-2],[11,-8],[9,-6],[18,-14]],[[6720,3393],[3,-2],[26,-20],[3,-2]],[[6747,3261],[-36,-66]],[[6693,3209],[-20,14],[-19,14]],[[6766,3248],[-36,-67]],[[6784,3234],[-36,-66]],[[6784,3234],[19,-14],[-36,-67]],[[6822,3206],[-36,-67]],[[6825,3313],[20,-15],[16,-12]],[[6842,3191],[-36,-67]],[[6863,3176],[-37,-66]],[[6844,3096],[-18,14]],[[6880,3163],[-36,-67]],[[6899,3150],[-36,-68]],[[6863,3082],[-19,14]],[[7981,3106],[-13,11],[-22,17],[-1,0],[-29,-19]],[[7931,3205],[3,5],[13,24],[15,25]],[[7962,3259],[14,23]],[[7976,3282],[14,24]],[[8063,3245],[-13,-23],[-14,-23],[-15,-25],[-13,-23],[-13,-21],[-14,-24]],[[7981,3106],[-16,-26]],[[8076,2997],[-2,2],[-3,2]],[[8071,3001],[-4,3],[-2,2],[-1,0],[-3,3],[-4,2],[-34,27]],[[8186,3142],[-4,-3],[-13,-17],[-1,-4],[-18,-22],[-11,-15]],[[8139,3081],[-19,-26],[-12,-16],[-2,-1],[-6,-10],[-6,-8],[-3,-4],[-15,-19]],[[8178,2916],[-11,10],[-45,34]],[[8122,2960],[15,26],[11,18],[11,19]],[[8159,3023],[21,-15],[17,-13],[-13,-24],[16,-12]],[[8200,2959],[-8,-16],[-14,-27]],[[8129,2916],[-23,16]],[[8106,2932],[16,28]],[[8037,2814],[17,25],[13,24],[13,22]],[[8080,2885],[8,16],[4,7],[14,24]],[[8080,2885],[-18,14],[-7,5],[-16,13],[-14,12],[15,20]],[[8040,2949],[13,-10],[4,-3],[18,-14],[5,10],[3,6],[5,9],[3,-3],[15,-12]],[[7053,2576],[-3,1],[-2,1],[-72,54],[-7,5]],[[6987,2670],[78,-58],[3,-3],[2,-2]],[[6987,2670],[1,2],[4,-1],[18,34],[13,8]],[[6942,2703],[2,3],[9,18],[6,13],[1,5]],[[6960,2742],[6,13]],[[1046,2541],[-5,-4],[-22,-21],[-5,-5],[-14,-15],[-2,-2],[-2,-2],[-2,-3],[-6,-6],[2,-10]],[[990,2473],[-17,21],[-4,1],[-2,0],[-13,-4],[-10,-5],[-3,-12],[-4,-2],[-7,10],[-1,13],[-8,10],[-4,6],[-2,1],[-2,0],[-3,1],[-9,-3],[-7,-1],[-10,-7],[0,-8],[-2,0],[-7,0],[-4,-7],[-1,-5],[-2,-7],[-5,-8],[-5,-11],[-9,2],[-7,4],[-9,3],[-7,5],[-9,0],[-18,-4],[-5,-2],[-3,-5],[-13,-5],[-4,-1],[-7,1],[-6,3],[-3,0],[-5,-2],[-4,1],[-13,-4],[-17,0],[-13,-6],[-3,-3],[-20,-6],[1,-4],[0,-2],[-12,2],[-7,-3],[-22,10],[-3,4],[-1,7],[1,5],[0,10],[15,41],[10,21],[5,7],[5,10],[7,9],[6,4],[9,5],[9,3],[2,-2],[4,-8],[3,1],[5,-2],[6,-5],[1,0],[4,4],[9,3],[5,5],[8,5],[3,5],[2,10],[3,20],[0,5],[-1,10],[-1,6],[-2,3],[-7,10],[-9,4],[-12,-5],[-9,-5],[0,-3],[-6,-1],[-5,1],[-4,8],[5,5],[4,8],[3,9],[0,10],[-5,16],[-1,4],[-10,11],[-10,1],[-5,-1],[-2,-1],[-3,-6],[-4,-17],[-2,-2],[-15,-6],[-5,1],[-3,4],[0,7],[3,5],[-1,8],[0,4],[2,5],[2,2],[6,3],[18,-3],[5,-1],[9,2],[6,1],[2,27],[2,10],[0,12],[-3,15],[1,11],[4,19],[9,21],[2,8],[3,4],[2,11],[0,25],[0,5],[5,18],[3,0],[12,20],[7,9],[7,5],[10,12],[6,5],[2,7],[4,7],[9,16],[3,1],[1,1],[1,-1],[1,-7],[2,-3],[5,1],[16,27],[3,8],[3,8],[2,12],[4,3],[2,2],[4,1],[3,0],[17,1],[4,1],[6,4],[4,4],[2,4],[3,3],[3,0],[1,-6],[2,-6],[3,-4],[5,-2],[14,0],[7,2],[2,2],[3,1],[15,5],[13,9],[5,2],[19,-4],[14,0],[8,2],[5,7],[9,16],[10,15],[16,36],[7,18],[6,16],[7,19],[10,17],[1,1],[7,15],[5,16],[7,15],[4,7],[3,3],[11,4],[14,5],[10,9],[12,6],[27,8],[10,11],[7,7],[4,0],[8,0],[6,-4],[12,-2],[5,0],[5,-6],[3,-1],[6,-1],[6,2],[16,12],[5,8],[9,21],[4,15],[3,19],[4,15],[1,7]],[[1274,3378],[9,-11],[23,-32],[4,-5]],[[1310,3330],[-15,-33],[-2,-4],[-7,-11],[-3,-6],[-6,-10],[-6,-10],[-3,-4],[-3,-3],[-3,-2],[-2,-2],[-3,-3],[-5,-2],[-7,-5],[-20,-12],[-9,-6],[-3,-2],[-3,-1],[-3,-1],[-1,-1],[-4,-1],[-8,-2],[-10,-3],[-2,3],[-5,7],[-18,28],[-1,2],[-1,1],[-1,0],[-2,0],[-1,1],[-1,0],[-7,-2],[-8,-1],[-1,-1],[-1,-1],[0,-1],[0,-1],[0,-1],[0,-1],[1,-2],[14,-21],[9,-14],[2,-3],[-2,-1],[-2,-1],[-2,-2],[-3,-2],[-3,-3],[-6,-5],[-5,-5],[-5,-5],[-14,-15],[-7,-7],[-4,-4],[-5,-8],[-3,-3],[-10,-12],[-10,-11],[-12,-12],[-7,-8],[-7,-9],[-6,-10],[-6,-9],[-13,-18],[-11,-14],[-13,-19],[-3,-4],[-6,-6],[-5,-5],[-7,-6],[-5,-4],[-7,-4],[-9,-5],[-17,-10],[-9,-4],[-11,-5],[-7,-3],[-10,-5],[-10,-5],[-13,-6],[-7,-3],[-21,-10],[-18,-8],[-5,-4],[-4,-3],[-7,-6],[-9,-10],[-4,-4],[-2,-2],[-2,-4],[-1,-3],[5,-8],[7,-13],[10,-15],[6,-9],[14,-20],[9,-14],[10,-14],[12,-18],[16,-24],[20,-29],[11,-17],[35,-46],[13,-17],[11,-13],[7,-11],[18,-26],[28,-40],[8,-12]],[[2002,2744],[4,-14],[4,3],[8,3],[8,-2],[7,-7],[0,-13],[-3,-10],[-12,-21],[0,-5],[1,-4],[3,-1],[2,3],[3,-1],[1,-5],[-8,-16],[-4,-1],[-4,1],[-10,-2],[-10,0],[-9,-8],[-2,4],[-6,12],[1,40],[1,10],[2,8],[4,10],[7,10],[5,7],[7,-1]],[[1961,2688],[-5,15],[1,6],[-4,1],[-2,2],[-2,1],[-1,1],[-1,2],[-4,4],[-2,4],[-2,2],[-2,3],[-3,5],[-3,4],[-1,2],[-2,2],[-2,2],[-3,3],[-2,2],[-7,8]],[[1914,2757],[7,7],[2,3],[8,8],[16,19]],[[1947,2794],[6,6]],[[1953,2800],[11,-16],[6,-9],[8,-8]],[[1978,2767],[-3,-10],[-3,-12],[0,-8],[0,-7],[-3,-6],[-8,-10],[-2,-9],[3,-10],[-1,-7]],[[6932,3124],[-36,-67]],[[6896,3057],[-4,3],[-29,22]],[[6860,2991],[-4,3],[-29,22]],[[6827,3016],[36,66]],[[6896,3057],[-5,-9],[-4,-8],[-5,-9],[-4,-7],[-5,-9],[-4,-8],[-4,-7],[-5,-9]],[[6932,3124],[24,-17]],[[6956,3107],[-36,-67]],[[6920,3040],[-24,17]],[[6941,3024],[-21,16]],[[6956,3107],[21,-15]],[[6977,3092],[-36,-68]],[[6978,2997],[-19,14],[-18,13]],[[6977,3092],[19,-15]],[[6996,3077],[19,-13],[-37,-67]],[[6996,3077],[40,76]],[[7036,3153],[19,-14]],[[7055,3139],[33,-24]],[[7088,3115],[-40,-75],[-26,-48],[-16,12],[-11,-19],[-17,12]],[[6956,3107],[40,76]],[[6996,3183],[22,-16],[18,-14]],[[6973,3200],[23,-17]],[[7050,3177],[-14,-24]],[[6987,3224],[63,-47]],[[7072,3220],[-22,-43]],[[7068,3164],[-13,-25]],[[7072,3220],[18,-15]],[[7090,3205],[-22,-41]],[[7105,3190],[-21,-38],[-16,12]],[[7119,3092],[-31,23]],[[7152,3149],[-8,-15],[-11,-18],[-14,-24]],[[7145,3082],[-3,1],[-3,1],[-7,2],[-13,6]],[[7169,3135],[3,-2],[9,-7]],[[7181,3126],[-18,-32],[12,-10]],[[7175,3084],[-10,-3],[-11,-1],[-2,0],[-7,2]],[[7181,3126],[18,-16],[19,-16]],[[7218,3094],[-12,0],[-15,-3],[-16,-7]],[[8079,2128],[-2,-39]],[[8077,2089],[-22,1],[-22,2]],[[8033,2092],[-21,2],[-22,1]],[[7990,2095],[-21,1],[-21,2],[-5,-70]],[[7943,2028],[-21,2],[-6,0]],[[7916,2030],[0,5],[4,65],[5,29],[2,6]],[[7908,2031],[-6,1]],[[7919,2136],[-2,-6],[-5,-25],[-2,-28],[-3,-38],[1,-4],[0,-4]],[[7990,2095],[-3,-70]],[[7987,2025],[-23,1],[-21,2]],[[7902,2032],[0,-18],[0,-12],[5,-30]],[[7997,1801],[-66,6],[-4,4],[0,8],[-11,0]],[[7916,1819],[5,34],[3,47],[-2,10],[0,1]],[[7922,1911],[17,0],[63,-5]],[[8002,1906],[-1,-27],[-1,-19]],[[8000,1860],[-1,-19]],[[7999,1841],[-2,-19]],[[7997,1822],[0,-21]],[[7906,1819],[-4,0]],[[7912,1912],[1,0]],[[7913,1912],[0,-3],[0,-2],[-3,-57],[-4,-31]],[[7997,1801],[-2,-23]],[[7995,1778],[0,-9],[-1,-18]],[[7994,1751],[-1,-9]],[[7993,1742],[-86,6],[-12,4]],[[7895,1752],[2,5],[5,12],[13,48],[1,2]],[[7886,1756],[-3,1]],[[7906,1819],[-1,-2],[-13,-47],[-6,-14]],[[2358,2080],[-34,-33],[-17,-16],[-30,-30],[2,-10],[0,-1],[-18,-17],[-20,-19],[-7,-7],[-18,-17],[-8,-8]],[[2208,1922],[-3,6],[-3,4],[-7,14],[-2,2],[-3,6],[-8,10]],[[2182,1964],[29,30],[56,50],[38,47],[14,25],[59,80]],[[2378,2196],[13,17]],[[2391,2213],[3,-3],[4,-4],[9,-9],[2,-1],[29,-40],[-15,-14],[-45,-44],[-1,0],[-1,0],[-1,0],[-1,0],[0,1],[-3,4],[-9,-5],[-10,-10],[6,-8]],[[2182,1964],[-4,4],[-2,3],[-5,6],[-9,9],[-12,10]],[[2150,1996],[5,5],[25,27]],[[2180,2028],[23,20],[14,14],[13,15],[7,10],[12,18],[4,8],[5,14],[9,27]],[[2267,2154],[17,-12]],[[2284,2142],[19,-15],[5,-5],[15,19],[13,17],[35,45],[7,-7]],[[3488,1518],[22,10],[19,8],[19,7],[20,7],[20,8],[13,6],[20,5]],[[3621,1569],[34,8],[36,8]],[[3693,1577],[-11,-2],[-2,-2],[-27,-5],[-34,-8],[-39,-12],[-36,-13],[-49,-20],[-4,-2],[-33,-16],[-4,-2],[-29,-15],[-30,-15],[-37,-20],[-1,-1],[-35,-15],[-17,-10],[-31,-15],[-26,-13],[-29,-15],[-4,-1]],[[3215,1375],[-3,-2]],[[3212,1373],[-2,7],[-17,67]],[[3193,1447],[-13,53],[-17,66]],[[3163,1566],[4,1]],[[3167,1567],[7,2],[3,0],[7,2],[6,3],[14,12],[41,34],[9,8],[0,14],[0,10]],[[3254,1652],[88,75]],[[3342,1727],[28,23],[26,22],[26,21]],[[3422,1793],[1,-5],[24,-100],[22,-89]],[[3469,1599],[-11,-4],[-2,-1],[-2,-2],[-1,-2],[-1,-3],[-4,-6],[-22,-13],[-2,-4],[-6,-4],[-28,-14],[-6,-3],[-6,-5],[-9,-8],[-2,-3],[5,-15],[4,-19],[1,-1],[2,-1],[1,0],[32,17],[9,-23],[3,2],[41,21],[9,4],[14,6]],[[3469,1599],[19,-81]],[[2331,3626],[5,-20],[-14,-7],[-13,-13],[-12,-8],[-9,-3],[-1,-4],[15,-24],[-4,-13]],[[2298,3534],[-7,11],[-6,9],[-1,0],[-1,0],[-1,-1],[-11,-10],[-12,-11],[-2,-2],[-8,-6],[-11,-9],[-6,-2],[-10,15],[-17,27],[2,11],[-1,12],[-1,10],[-5,4],[-2,1],[-12,3],[-11,-5],[-17,-20],[-1,-4],[-17,-11],[-19,-9],[-21,-7],[-8,-4],[-8,-5],[-5,-6],[-1,-5],[0,-6],[1,-11],[1,-8],[0,-1],[0,-2],[1,-3],[0,-2],[1,-4],[2,-3],[2,-4],[3,-4],[5,-3],[6,-3],[3,-1],[4,0],[7,0],[8,1],[10,0],[6,1],[17,-1],[4,0]],[[2159,3466],[-1,-8],[-1,-8],[-1,-10],[-1,-4],[-3,-5],[-2,-2],[-10,-10],[-19,-18],[-13,-12],[-10,-9],[-7,-6],[-1,-1],[-1,-2],[0,-1],[0,-1],[0,-1],[1,0],[14,-20]],[[2104,3348],[-28,0],[-19,-2],[-6,-23],[4,-6],[15,-9],[0,-20],[27,-42],[-17,-41],[-12,-35],[8,-27]],[[2076,3143],[-30,18],[1,1],[5,14],[3,6],[-25,14],[-6,3],[-4,2],[-3,1],[-3,1],[-2,0],[-2,0],[-3,0],[-19,-2]],[[1988,3201],[0,2],[-1,4],[0,13],[0,15],[-1,19],[-2,0],[-1,0],[0,1],[-1,1],[0,1],[0,1],[0,1],[1,0],[3,38],[6,14],[4,11],[-45,71],[-204,386]],[[1747,3779],[3,2],[3,1],[3,2],[17,12],[17,12],[14,9],[2,1],[3,3],[3,1],[2,2],[3,3],[2,2],[6,5],[22,21],[7,7],[3,2],[2,3],[4,2],[3,3],[7,6],[6,4],[10,6],[9,5],[2,1],[4,2],[3,2],[3,0],[4,1],[9,-1],[5,0],[8,0],[5,1],[23,-1],[0,-8],[1,-12],[0,-3],[1,-2],[1,-3],[18,-27],[11,-16],[6,-9],[4,-6],[19,-28],[1,-2],[1,0],[1,0],[1,-1],[2,0],[1,1],[1,1],[12,12],[16,14],[11,9],[6,6],[9,9],[6,6],[-2,3],[-6,9],[-3,4],[-3,4],[-5,7],[-2,5],[-1,1],[0,1],[-1,2],[-1,3],[-2,8],[-1,5],[6,-2],[8,-2],[10,-3],[5,-2],[5,-1],[2,-4],[5,-9],[4,-7],[6,-8],[5,-7],[4,-6],[14,-21],[4,-6],[6,-10],[5,-6],[12,12],[13,13],[8,7],[13,-20],[7,-11],[7,-9],[13,-18],[12,-17],[2,-2],[14,-17],[12,-19],[26,-37],[9,-12],[14,-20],[14,-21]],[[2298,3534],[5,-6],[9,-14],[5,-6],[3,-4],[3,-2],[6,-6],[-2,-3],[-2,-7],[-2,-4],[-3,-6],[-2,-5],[-2,-6],[-7,-15],[-1,-3],[-1,-3],[-1,-2],[-1,-3],[-2,-7],[0,-3],[-1,-1],[-1,-7],[0,-8],[-1,-4],[-1,-17],[-1,-6],[-1,-3],[-1,-3],[-1,-2],[-1,-2],[-2,-4],[-3,-3],[-5,-4],[-18,-10],[-1,-1],[-1,-1],[-2,-1],[-2,-2],[-2,-2],[-2,-2],[-1,-2],[-1,-2],[0,-2],[-1,-1],[0,-2],[-1,-3],[-1,-8],[0,-6]],[[2251,3320],[-7,0],[-2,0],[-1,0],[-2,1],[-1,1],[-1,1],[-11,16],[-2,3],[-2,1],[-3,3],[-4,3]],[[2215,3349],[2,5],[4,8],[4,6],[1,2],[1,1],[1,3],[10,10],[8,9],[-37,54],[-6,7],[-2,2],[-2,2],[-2,1],[-2,1],[-1,0],[-3,1],[-6,1],[-24,3],[-2,1]],[[2164,3320],[0,-1],[13,-20],[-8,-9],[-6,-6],[-9,-9],[-6,-6],[2,-10],[-8,-12],[-10,-14],[-2,-3],[8,-11],[11,4],[12,-6]],[[2161,3217],[-4,-10],[-1,-2],[0,-2],[-2,-5],[0,-1],[-1,-3],[0,-2],[-1,-7],[0,-4],[-1,-5],[-4,-9],[-3,-5],[-3,-5]],[[2141,3157],[-4,3],[-1,0],[-1,1],[-1,0],[-2,1],[-1,0],[-2,0],[-2,0],[-3,0],[-3,-1],[-2,0],[-2,-1],[-3,-2],[-1,-1],[-1,-1],[-1,-1],[0,-1],[-1,-1],[-1,-3],[-2,-3],[-4,-10],[-3,-7]],[[2100,3130],[-24,13]],[[2104,3348],[15,14],[7,-11],[1,-1],[2,-1],[24,-3],[-1,-6],[-2,-18],[14,-2]],[[2259,3137],[-6,-14],[-4,-8],[-9,-13],[-9,-12],[-8,-14],[-3,-3],[-3,-5],[-1,-3],[-4,-5],[-4,-6],[-9,-12],[-7,-7],[-6,-9],[-3,-2],[-5,-7]],[[2178,3017],[-10,14],[-12,18],[-14,20],[4,3],[5,6],[10,10],[5,7],[6,6],[4,4],[-9,13],[-4,5],[-5,9],[-7,9],[-5,7],[-1,1],[-4,8]],[[2161,3217],[10,-4],[3,-4],[2,-2],[0,-1],[0,-1],[-5,-14],[0,-1],[11,-16],[7,-10],[2,-2],[7,-4],[2,3],[1,2],[2,2],[1,2],[3,2],[1,1],[2,1],[2,1],[2,0],[3,1],[3,-1],[2,0],[2,0],[3,-1],[1,-1],[2,-1],[2,-2],[1,0],[1,-1],[1,-1],[1,-1],[2,-5],[1,-2],[5,-8],[2,-3],[4,-3],[9,-6]],[[2139,2977],[-3,5],[-12,16],[-7,-7],[-1,-1],[-3,-5],[-2,-3],[-1,-2],[-2,0],[-1,-1],[0,-1],[-1,0],[-1,0],[-1,0],[-1,0],[-1,0],[-2,0],[-1,0],[-2,0],[0,1],[-2,1],[-6,8],[-3,5],[-4,9],[-2,2],[-2,2],[-1,1],[0,1],[-1,0],[0,1],[0,1],[0,1],[0,1],[0,1],[0,1],[1,0],[0,1],[4,3],[10,8],[-3,7],[0,2],[-1,4],[-1,7],[-2,21],[-1,6],[0,4],[1,6],[0,4],[1,3],[1,5],[1,4],[1,3],[4,8],[4,11],[4,9]],[[2178,3017],[-7,-7],[-5,-6],[-10,-9],[-10,-11],[-7,-7]],[[2139,2977],[-10,-11],[-6,-6],[-8,-8],[-12,-13],[-7,-7]],[[2096,2932],[-6,8],[-8,11],[-18,26],[-12,-10],[-7,-5],[-8,-7],[-7,-8],[-24,35],[-14,20],[-1,1],[-1,0],[-1,0],[-1,-1],[-13,-12],[-13,19]],[[1962,3009],[12,11],[2,2],[12,11],[2,2],[1,1],[2,2],[3,3],[7,6],[8,8],[6,5],[4,4],[8,8],[8,7],[10,12],[1,2],[2,2],[1,2],[2,3],[9,14],[2,3],[2,4],[5,11],[4,9],[1,2]],[[1767,3047],[13,-17],[14,-21],[6,-9],[7,-9],[6,-8],[15,-22],[27,-39],[7,-9]],[[1862,2913],[29,-40],[11,-15],[45,-64]],[[1914,2757],[-3,-4],[-9,-9],[-5,-7],[-3,-2],[-7,-7],[-6,-4],[-17,-15],[23,-33],[13,-19],[3,-3],[31,-45],[1,-1],[0,-1],[0,-2],[-1,-1],[-13,-12],[-18,26],[-5,6],[-18,26],[-15,21],[-16,23],[-10,-11],[-3,-3],[-4,-6],[-4,-6],[-4,-7],[-5,-8],[-6,-11],[-4,-8],[-2,-3],[6,-7],[47,-67],[0,-2],[0,-1],[-17,-15],[-53,77],[-18,-15],[38,-53],[-15,-14],[-39,56],[-21,-15],[-10,-7],[-8,-6],[-13,-7],[-16,-8],[-14,-6],[-12,-5],[-15,-7],[-24,-10],[-14,-6],[-36,-17],[-55,-26],[-13,-5],[-9,-3],[-12,-3],[-23,-6],[-30,-7],[-10,-2],[-5,-2],[-9,-3],[-9,-3],[-6,-2],[-4,-2],[-8,-4],[-7,-3],[-5,-3],[-4,-3],[-6,-4],[-6,-4],[-12,-8],[-10,-8],[-7,-4],[-6,-3],[-10,-3],[-5,-2],[-11,-3],[-8,-2],[-7,-2],[-7,0],[-25,0],[-8,-1],[-6,0],[-6,-2],[-5,-2],[-5,-3],[-6,-3],[-7,-5],[-4,-3],[-5,-1],[-4,0],[-4,0],[-6,2],[-5,3],[-4,3],[-11,15],[-21,31],[-39,56],[-16,23],[-31,45],[-5,7]],[[1310,3330],[17,-21],[-20,-25],[12,-29],[162,112],[15,56]],[[1496,3423],[20,-29],[13,-20],[25,-35],[17,-25],[12,-16],[18,-24],[20,-24],[16,-19],[8,-10],[1,-2],[7,-8],[7,-10],[8,-11],[5,-8],[10,-13],[17,-25],[7,-11],[24,-34],[12,-17],[20,-28],[4,-7]],[[7277,1135],[-14,4],[-14,4],[-19,6]],[[7204,1258],[16,18],[0,2],[-1,2],[-11,14],[0,3],[1,3],[11,11],[12,13],[1,1],[8,8],[32,34]],[[7273,1367],[27,-22],[2,-1],[2,0],[1,2],[2,6],[2,10],[6,13],[7,13],[5,9],[4,7],[1,2],[0,1],[-2,4],[-12,12],[-7,6],[-7,6],[-5,5],[-7,5],[-7,7]],[[7399,1492],[-3,-4],[-26,-40],[-50,-76],[-6,-15],[-12,-33],[-14,-54],[-5,-31],[14,-5]],[[6562,3213],[-1,-3],[-3,-5],[-4,-10],[-3,-7],[-19,-35],[-6,-8],[-3,-4],[-28,-37],[-20,-26],[-2,-5],[-6,-7],[-4,-6],[2,-3],[9,-9],[8,-7],[9,-8],[7,-5],[13,-10],[5,-3],[4,-3],[13,-9],[18,-13],[16,-10]],[[6560,2974],[-45,30],[-1,1],[-3,1],[-38,-72]],[[6473,2934],[-43,-74],[-14,-32],[-9,-29],[-5,-23],[-1,-13],[-1,-7],[-1,-26],[0,-3]],[[6399,2727],[2,-134],[0,-2],[0,-4],[0,-4],[0,-2],[0,-2],[0,-3],[0,-3],[0,-2],[0,-2],[0,-4],[0,-11]],[[6401,2554],[-4,3],[-3,2],[-31,22]],[[6363,2581],[-56,44],[-21,-35],[-30,22],[-21,14]],[[5965,2635],[6,39],[1,7],[5,29]],[[5977,2710],[42,255],[57,-64],[58,-57],[23,-33],[12,-14],[1,-2],[2,-2],[1,-1],[2,-2],[1,-1],[2,-2],[1,-2],[2,-2],[2,2],[1,2],[2,2],[1,2],[2,1],[1,1],[1,2],[7,8],[31,36],[5,5],[28,37],[8,10],[2,2],[11,14],[6,8],[9,11],[38,49],[35,45],[28,37],[-16,17]],[[6383,3074],[2,3],[22,28],[2,3],[3,4],[3,4],[14,19],[17,22]],[[6446,3157],[7,8],[33,43],[3,4],[3,4],[2,3],[2,1],[8,6],[13,5],[9,3],[4,1],[3,1],[3,-1],[2,-1],[-5,33],[-1,3],[-20,-5]],[[6512,3265],[-4,19],[-3,21],[-4,20],[-4,21],[-3,20],[-2,9],[-6,4],[-4,7]],[[9002,6235],[-3,-11],[-1,-5],[-2,-3],[-1,-4],[-1,-13],[1,-44],[-1,-29],[-1,-12],[-4,-16],[-5,-16],[-5,-12],[-5,-9],[-6,-9],[-8,-9],[-9,-9],[-13,-13],[-6,-4],[-12,-19]],[[8784,6337],[12,-4],[11,-3],[3,-1],[8,-3],[13,-4],[6,-2],[46,-14],[8,-3],[14,-4],[2,-1],[3,-1],[3,-1],[6,-2],[9,-3],[7,-3],[3,-2],[3,-1],[3,-2],[3,-2],[3,-1],[2,-2],[1,0],[12,-9],[6,-4],[5,-4],[3,-2],[4,-4],[12,-11],[7,-8],[0,-1]],[[6122,3588],[-8,6]],[[6114,3594],[-25,21],[-13,12],[-66,68]],[[6010,3695],[-21,22],[-4,4],[-15,15],[-3,3]],[[5967,3739],[6,8],[6,8],[9,-9],[9,-10],[9,8],[-9,12],[2,3],[30,36],[4,7],[3,15],[2,12],[0,12],[-1,12],[-4,11],[-15,19],[-9,10]],[[6009,3893],[27,33],[10,14],[2,3]],[[6048,3943],[9,-9],[5,-5],[10,-8],[8,-4],[7,-3]],[[6087,3914],[25,-1],[41,0]],[[6153,3913],[0,-4],[0,-15],[1,-36],[-1,-52],[-1,-27],[-2,-13],[-3,-28],[-5,-34],[-17,-99],[0,-6],[-1,-4],[-2,-7]],[[5910,3161],[-16,-2],[-30,-41],[-9,9],[15,19],[-14,15]],[[5856,3161],[29,37],[-1,4],[-11,12],[-3,0],[-14,-19],[-14,15]],[[5842,3210],[21,28],[8,10],[2,3]],[[5873,3251],[30,-32],[14,-14]],[[5917,3205],[-2,-3],[-13,-15],[10,-11],[-2,-15]],[[5778,3715],[-40,42],[-15,17]],[[5723,3774],[27,36],[15,17]],[[5765,3827],[55,-58]],[[5820,3769],[-13,-18],[-14,-18],[-15,-18]],[[2096,2932],[-6,-8],[-9,-9],[-2,-1],[-8,-8],[-7,-5],[-2,0],[-9,-4],[-12,-6]],[[2041,2891],[-9,-5],[-7,-5],[-8,-6],[-6,-7]],[[2011,2868],[-20,25],[-44,64],[-1,0],[-1,1],[-1,0],[-1,0],[-13,-12],[-13,19]],[[1917,2965],[20,21],[9,7]],[[1946,2993],[16,16]],[[2011,2868],[-7,-9],[-5,-6],[-2,-2]],[[1997,2851],[-9,-11],[-7,-7],[-18,-21],[-10,-12]],[[1862,2913],[8,8],[1,1],[23,22]],[[1894,2944],[8,8],[15,13]],[[2041,2891],[25,-34],[12,-18],[9,-11],[10,-8],[-7,-12],[-2,-3],[-4,-6],[-1,-4],[-1,-2],[-1,-2],[-1,-2],[-3,-4],[-3,-3],[-1,-1],[-1,0],[-1,1],[-1,1],[-6,5],[-10,1],[-12,2],[-1,0],[-1,1],[-1,1],[-30,42],[-9,12],[-3,4]],[[2096,2932],[8,-10],[45,-67],[2,-2]],[[2151,2853],[-3,-2],[-2,0],[-2,0],[-2,-1],[-10,-7],[-7,-8],[-8,-8],[-7,-7],[-1,-6],[-2,-4],[-4,-4],[-4,-11],[-13,-18],[-2,-7],[-6,-4],[-7,-4],[-9,13],[-21,6],[-7,-1],[-7,2],[-6,6],[-6,1],[-9,-3],[-4,8],[-3,1],[-4,-3],[-5,-11],[-3,-4],[-6,-5],[-3,-4],[0,-1]],[[1961,2688],[1,-8],[0,-21],[-3,-22],[-6,-8],[-6,-16],[-7,-4],[-1,-5],[-4,-11],[-5,-2],[-6,-6],[-5,0],[-9,-8],[-8,-8],[-6,-9],[-6,-10],[-4,-5],[-15,-2],[-9,-8],[-8,-10],[-6,-6],[-4,-5],[-17,-20],[-11,-14],[-13,-12],[-4,-3],[-6,-7],[-5,-7],[-3,-7],[-8,-11],[-2,-7],[-3,-5],[-6,-6],[-3,-4],[-1,-1],[-7,-15],[-2,-8],[-8,-24],[0,-9],[-4,-4],[-12,-10],[-5,-7],[-3,-2],[-6,-1],[-2,-1],[-2,-6],[-1,-3],[0,-3],[-2,-3],[-8,-7],[-6,-1],[-1,-1],[-3,-3],[-5,-2],[-12,2],[-12,3],[-8,4],[-6,4],[-10,1],[-13,4],[-5,-3],[-8,0],[-7,4],[-6,-3],[-7,-1],[-7,2],[-6,-5],[-17,0],[-6,2],[-2,-1],[-10,6],[-5,-1],[-5,-4],[-9,-11],[-10,-7],[-6,-2],[-4,-2],[-3,-4],[-1,-5],[-5,-13],[0,-2],[0,-2],[1,-2],[3,0],[1,2],[3,1],[2,-1],[4,-9],[10,-1],[7,-1],[7,5],[5,-13],[3,-4],[0,-2],[1,-2],[4,-2],[3,-4],[0,-5],[-3,-3],[-4,0],[-4,-2],[-4,-6],[-4,-7],[-5,-6],[-9,-9],[-7,-11],[-4,-3],[-5,-2],[-4,-4],[-7,-1],[-6,4],[-5,11],[0,5],[-2,5],[-5,6],[-10,8],[-5,8],[-8,9],[-8,5],[-5,0],[-6,-1],[-8,-2],[-19,0],[-6,-1],[-6,-3],[-14,-1],[-17,1],[-4,-4],[-8,-2],[-6,-4],[-8,0],[-7,-4],[-16,-14],[-4,-1],[-2,3],[-5,-1],[-2,-3],[-3,-3],[-5,0],[-3,-3],[-2,-3],[-5,-4],[-15,0],[-13,-4],[-6,0],[8,9],[7,4],[6,5],[4,6],[5,8],[3,7],[-2,10],[-9,1],[-10,-1],[-6,1],[-4,3],[-2,6],[-4,5],[-18,8],[-7,5],[-2,1],[-4,6],[-2,4],[-4,4],[-6,1],[-15,0],[-1,5],[-4,-5],[-4,1],[-4,-2],[-1,0],[-1,15],[-4,10],[-6,7],[-8,20],[-2,9],[-3,13],[-2,4],[-1,3],[-1,1],[-6,17],[-4,5],[-4,1],[-5,-3],[-3,3],[-7,3],[-15,-2],[-5,4],[-9,12],[-1,3],[-1,12],[-14,27],[-5,10],[-6,9],[-12,22],[-1,1],[-2,1],[-5,7],[-8,9],[-6,0],[-9,-3],[-6,-7],[-7,-5],[-6,-9],[-4,1]],[[1767,3047],[14,14],[2,1],[1,0],[1,0],[1,-1],[12,-16],[16,14],[-16,21],[-1,3],[0,3],[3,4],[2,4],[2,3],[3,7],[9,22]],[[1816,3126],[17,-22],[27,-38]],[[1860,3066],[6,-8],[1,-2],[2,-2],[1,-5],[3,-13],[1,-5],[1,-5],[0,-9],[-3,-22],[0,-10],[1,-4],[1,-4],[1,-4],[3,-6],[13,-19],[3,-4]],[[1860,3066],[5,4],[5,5],[3,5],[1,3],[0,3],[1,2],[26,26],[7,8],[1,1]],[[1909,3123],[1,-1],[29,-42],[15,-21],[1,-2],[0,-1],[1,-1],[-1,-1],[-7,-7],[-7,-6],[5,-6],[0,-1],[0,-1],[1,-1],[-1,-1],[-16,-16],[1,0],[11,-17],[4,-5]],[[1816,3126],[5,12],[3,7],[0,5],[1,4],[5,12],[3,8],[3,5],[2,4],[3,3],[4,2],[16,8],[4,2],[3,2],[2,0],[3,1],[4,0],[4,0],[13,0],[7,0],[5,0],[8,0],[20,0],[20,-1],[-1,-14],[1,-9],[0,-1],[0,-2]],[[1954,3174],[1,-7],[0,-9],[1,-3],[-15,-2],[-1,0],[-1,0],[-11,-11],[-19,-19]],[[1954,3174],[34,4],[0,16],[0,7]],[[1496,3423],[-14,19],[-11,16],[-12,17],[-1,3],[-3,6],[3,1],[4,2],[3,2],[5,5],[9,9],[5,5],[8,9],[2,2],[9,10],[5,5],[7,8],[5,5],[-51,82]],[[1469,3629],[0,5],[11,28],[3,28],[1,26],[-1,11],[-7,18],[-3,15],[2,3],[7,1],[11,0],[5,2],[5,18],[0,5],[-13,8],[-5,5],[-5,7],[1,7],[5,4],[3,2],[18,0],[17,-7],[10,-7],[5,-5],[4,-5],[10,-10],[7,-5],[15,0],[8,4],[6,6],[0,4],[-4,4],[6,7],[2,4],[5,6],[2,2],[14,8],[6,-5],[3,-1],[3,2],[2,3],[0,4],[3,1],[2,-2],[4,0],[3,5],[7,2],[4,-2],[7,4],[9,3],[11,12],[13,10],[2,1]],[[1693,3865],[4,-9],[51,-66],[-1,-11]],[[8210,3953],[-7,6],[-11,12],[-1,2]],[[8191,3973],[-3,3],[-43,32]],[[8145,4008],[-42,31]],[[8103,4039],[-28,22]],[[8075,4061],[-30,22],[-3,3],[0,2],[0,1],[-1,2],[-6,4]],[[8035,4095],[5,3],[12,22]],[[8052,4120],[11,18],[10,17],[9,15]],[[8082,4170],[11,19]],[[8093,4189],[13,22],[12,22]],[[8118,4233],[14,24]],[[8132,4257],[28,-21],[14,-11]],[[8174,4225],[12,-10],[7,-5],[18,-14],[32,-25]],[[8243,4171],[-6,-31],[-10,-55]],[[8227,4085],[-5,-24],[-5,-27]],[[8217,4034],[-4,-25],[-2,-16]],[[8211,3993],[0,-19],[-1,-21]],[[9697,9303],[30,-11]],[[9727,9292],[0,-2],[0,-2],[-2,-2],[0,-12],[-3,-8],[0,-10],[0,-4],[0,-7],[-1,-6],[-1,-19],[-1,-24],[-1,-4],[3,-11],[1,-2],[-2,-14],[-2,-9],[-2,-6],[0,-8],[-2,-10],[-2,-8],[-7,-33],[0,-25],[1,-4],[1,-8],[-1,-9],[-3,-5],[-2,-19],[0,-4],[-1,-2],[-2,-7],[-2,-35],[-2,-4],[-1,-7],[0,-1],[3,-11],[-2,-16],[0,-5],[1,-9],[-3,-13],[0,-6],[2,-2],[1,-8],[0,-1]],[[9695,8890],[-13,7]],[[9682,8897],[1,26],[-38,11],[4,25],[4,24],[3,21],[4,28],[1,11],[1,6],[1,11],[2,22],[-2,2],[-11,1],[-1,1],[-1,2],[1,5],[1,2],[2,1],[13,-3],[3,22],[1,8],[2,22],[2,20],[1,10],[2,14],[19,114]],[[7572,5225],[-40,29],[-8,1],[-3,18]],[[7521,5273],[10,7]],[[7531,5280],[50,-37]],[[7531,5280],[14,13],[4,21]],[[7549,5314],[51,-37]],[[7549,5314],[1,13],[16,5],[1,8],[13,25]],[[7580,5365],[30,-22],[18,-13]],[[7521,5273],[-11,1],[-19,4]],[[7500,5379],[6,6],[14,24]],[[7520,5409],[15,-10],[-20,-39],[18,-4],[17,31],[15,-11],[15,-11]],[[7520,5409],[9,17],[9,18],[5,11],[4,6]],[[7547,5461],[9,-6],[51,-38]],[[7607,5417],[-9,-17],[-9,-18],[-9,-17]],[[8249,2119],[-34,10],[-10,-3],[2,-12],[14,-36]],[[8221,2078],[-14,1],[-22,2]],[[8252,2006],[-22,49],[-9,23]],[[8252,2006],[-32,2],[-17,2],[-22,0]],[[8180,1982],[-87,6]],[[8093,1988],[2,29]],[[8095,2017],[22,-2],[21,-1]],[[8178,1952],[-86,6]],[[8092,1958],[1,30]],[[8176,1923],[-86,6]],[[8090,1929],[2,29]],[[8175,1894],[-87,6]],[[8088,1900],[2,29]],[[9146,6516],[-7,-25]],[[9139,6491],[-5,2]],[[9134,6493],[-10,5],[-25,12],[-8,4]],[[9091,6514],[9,25],[9,26],[8,23]],[[9168,6589],[-6,-22],[-16,-51]],[[9199,6490],[-38,19],[-9,5],[-6,2]],[[9196,6434],[-10,5],[-17,9],[-24,11],[-9,5],[-4,3]],[[9132,6467],[7,24]],[[9214,6482],[-9,-24],[-9,-24]],[[9293,6387],[-13,6],[-5,2],[-3,2],[-8,4]],[[9264,6401],[-9,4],[-10,5],[-3,1],[-7,4],[-9,5]],[[9226,6420],[-20,9],[-2,1]],[[9204,6430],[-8,4]],[[9288,6418],[2,-15],[3,-16]],[[9226,6420],[-14,-38],[-7,-19],[-3,-9]],[[9202,6354],[-32,16],[-3,2]],[[9167,6372],[-5,2],[4,11],[5,15],[1,2],[5,16],[19,-10],[4,11],[4,11]],[[9240,6335],[-4,2],[-18,9],[-16,8]],[[9264,6401],[-21,-57],[-1,-2],[-1,-4],[-1,-3]],[[9161,6350],[6,22]],[[9240,6335],[-7,-21]],[[9233,6314],[-54,27],[-18,9]],[[7992,1720],[-98,7],[-5,-11],[-4,-14],[-5,-19]],[[7880,1683],[-4,-15]],[[7876,1668],[-5,-21],[-4,-20]],[[7867,1627],[-4,-22]],[[7863,1605],[-47,3],[-18,-23],[-13,-21]],[[7785,1564],[-21,-9]],[[7764,1555],[3,6],[14,24],[21,29],[17,18],[27,31],[15,24],[2,3],[18,31],[14,31]],[[7993,1742],[-1,-22]],[[7746,1548],[-6,-2]],[[7740,1546],[38,61],[17,21]],[[7795,1628],[20,23],[19,22],[16,22]],[[7850,1695],[12,20],[12,21],[9,21]],[[7886,1756],[-1,-3],[-8,-16],[-24,-43],[-1,-2],[-16,-21],[-22,-26],[-10,-11],[-19,-24],[-28,-43],[-11,-19]],[[7989,1676],[-109,7]],[[7992,1720],[-2,-25]],[[7990,1695],[-1,-19]],[[7989,1660],[-113,8]],[[7989,1676],[0,-16]],[[7987,1618],[-120,9]],[[7989,1660],[-1,-20]],[[7988,1640],[-1,-22]],[[7984,1571],[-126,9],[5,25]],[[7987,1618],[-2,-21]],[[7985,1597],[-1,-26]],[[7983,1547],[-2,-20]],[[7981,1527],[-97,15],[-11,2],[1,5],[-21,3]],[[7853,1552],[-35,6],[-33,6]],[[7984,1571],[-1,-24]],[[7981,1527],[-1,-23]],[[7980,1504],[-1,-19]],[[7979,1485],[-39,8],[-7,2],[-8,7],[-5,5],[-4,5]],[[7916,1512],[-68,12]],[[7848,1524],[4,24],[1,4]],[[7906,1461],[-67,19]],[[7839,1480],[5,22],[4,22]],[[7916,1512],[-5,-28],[-5,-23]],[[7979,1485],[-1,-21],[-1,-24]],[[7977,1440],[-71,21]],[[8056,1383],[-3,-5],[-9,-9]],[[8044,1369],[-1,-2],[-55,13],[-17,-19],[3,32]],[[7974,1393],[1,24],[-74,21]],[[7901,1438],[5,23]],[[7977,1440],[46,-13],[8,-9],[14,-34],[11,-1]],[[7828,1424],[3,10]],[[7831,1434],[65,-19],[5,23]],[[7974,1393],[-9,-9],[-137,40]],[[7831,1434],[4,23],[4,23]],[[8807,5880],[-19,10],[-7,-16],[-17,9],[-18,11],[-13,8],[-12,6]],[[8721,5908],[11,26],[8,20],[1,3]],[[8820,5914],[-2,-3],[-11,-31]],[[7222,2710],[8,8]],[[7230,2718],[91,-70],[3,-3],[12,24]],[[7230,2718],[18,18],[19,18],[5,6]],[[7184,2751],[12,21]],[[7196,2772],[14,24]],[[7210,2796],[12,-9],[13,22],[12,21],[6,13],[5,4],[5,2]],[[7210,2796],[6,11],[-62,47],[0,9],[4,16],[5,15]],[[7163,2894],[11,21],[21,39],[15,21],[3,5]],[[7106,2931],[16,-12],[2,2],[39,-27]],[[7196,2772],[0,9],[-144,113],[-3,13]],[[7049,2907],[15,-11],[22,-18],[14,42],[6,11]],[[7196,2772],[-7,3],[-151,113]],[[7038,2888],[11,19]],[[7027,2867],[11,21]],[[7049,2907],[23,42],[3,6]],[[7075,2955],[15,-12],[16,-12]],[[6924,2944],[-30,-55]],[[6894,2889],[-26,-48]],[[6868,2841],[-18,14],[-43,32]],[[6807,2887],[7,19],[17,30]],[[6831,2936],[16,31]],[[6847,2967],[45,-34],[13,25]],[[6905,2958],[19,-14]],[[6894,2889],[19,-14]],[[6913,2875],[-26,-48]],[[6887,2827],[-19,14]],[[6896,2789],[-10,-16],[-20,16],[-19,13]],[[6847,2802],[-33,25],[9,17],[-27,21]],[[6796,2865],[11,22]],[[6887,2827],[16,-12],[-2,-13]],[[6901,2802],[-5,-13]],[[6962,2839],[-31,-59],[-16,12],[-14,10]],[[6913,2875],[16,-12],[17,-12]],[[6960,2742],[-64,47]],[[6942,2703],[-2,2],[-7,5],[-57,42]],[[6836,2782],[2,3],[9,17]],[[6912,2646],[-3,2],[-63,47]],[[6895,2616],[-12,-23]],[[6883,2593],[-2,2],[-63,49]],[[6908,2558],[-31,24]],[[6883,2593],[31,-23],[-1,-4],[-5,-8]],[[6908,2558],[-6,-10],[21,-15]],[[6923,2533],[10,-7]],[[6933,2526],[-14,-4]],[[6919,2522],[-25,-8],[-22,-7]],[[6939,2583],[6,-4]],[[6945,2579],[-4,-8],[-10,-19],[1,-3],[-9,-16]],[[6945,2579],[15,-11],[32,-23]],[[6992,2545],[-20,-7],[-24,-9],[-15,-3]],[[7002,2547],[-10,-2]],[[6956,2615],[8,-6],[66,-50],[2,-1],[1,-2]],[[6993,2466],[-9,7],[-47,36]],[[6937,2509],[-18,13]],[[8173,1867],[-86,6]],[[8087,1873],[1,27]],[[8173,1847],[-87,7]],[[8086,1854],[1,19]],[[8171,1828],[-86,6]],[[8085,1834],[1,20]],[[8171,1809],[-87,6]],[[8084,1815],[1,19]],[[8169,1789],[-86,6]],[[8083,1795],[1,20]],[[8168,1766],[-86,6]],[[8082,1772],[1,23]],[[8166,1741],[-41,3],[-45,4]],[[8080,1748],[2,24]],[[8165,1709],[-86,5]],[[8079,1714],[1,29],[0,5]],[[8162,1665],[-86,6]],[[8076,1671],[1,17]],[[8077,1688],[2,26]],[[8160,1628],[-86,6]],[[8074,1634],[1,20]],[[8075,1654],[1,17]],[[8159,1606],[-86,6]],[[8073,1612],[1,22]],[[8175,1627],[-1,-21],[-15,0]],[[8071,1565],[1,25]],[[8072,1590],[1,22]],[[8159,1606],[-5,-21],[-6,-26],[-77,6]],[[8067,1512],[-86,15]],[[7983,1547],[86,-7],[2,25]],[[8209,1626],[-10,-23],[-17,-32],[-15,-19],[-23,-37],[-2,-12],[2,-3],[-6,-5]],[[8138,1495],[-15,5],[-31,9],[-25,3]],[[7984,1571],[87,-6]],[[7985,1597],[87,-7]],[[7988,1640],[86,-6]],[[7989,1660],[86,-6]],[[7990,1695],[87,-7]],[[7994,1751],[4,1],[38,-2],[44,-2]],[[7995,1778],[87,-6]],[[7997,1801],[86,-6]],[[7997,1822],[87,-7]],[[7999,1841],[86,-7]],[[8000,1860],[86,-6]],[[8002,1906],[86,-6]],[[8002,1906],[2,30],[1,29]],[[8005,1965],[76,-6],[11,-1]],[[8005,1965],[2,29]],[[8007,1994],[42,-2],[44,-4]],[[8007,1994],[0,18],[0,11]],[[8007,2023],[23,-1]],[[8030,2022],[21,-2],[22,-1]],[[8073,2019],[22,-2]],[[8030,2022],[3,70]],[[8077,2089],[-4,-70]],[[8007,2023],[-20,2]],[[7837,3125],[-26,-3],[-11,-1],[-11,3]],[[6962,4312],[1,-7],[-1,-4],[-1,-3],[-5,-12],[-8,-22]],[[6948,4264],[-62,30],[-7,-19]],[[6879,4275],[-58,28],[-5,2]],[[6816,4305],[0,5],[13,35],[1,3]],[[6830,4348],[3,0],[4,-2],[83,-21],[4,-2],[6,-2],[20,-6],[12,-3]],[[6923,5101],[-10,-19]],[[6913,5082],[-54,39],[-18,13],[-28,20]],[[6813,5154],[4,7],[25,46],[2,5],[5,9],[1,2],[1,2]],[[6851,5225],[46,-33]],[[6897,5192],[-2,-3],[-6,-9],[-2,-1],[-18,-34],[0,-2],[0,-2],[14,-10],[24,-17],[16,-13]],[[6136,4314],[-12,5],[-4,2],[-5,1],[-5,2],[-4,1],[-5,1],[-5,1],[-4,1],[-6,1],[-6,1],[-3,0],[-4,1],[-5,0],[-7,1],[-5,0],[-4,0],[-5,0],[-3,0],[-3,-1],[-5,-2],[-11,-1],[-5,-1],[-4,0],[-5,-1],[-6,-1],[-6,-2],[-3,-1],[-4,-1],[-4,-1],[-4,-2],[-5,-1],[-5,-2],[-14,-6],[-28,-10],[-3,-1],[-40,-16],[-11,-4],[-7,-3],[-5,-2]],[[6062,4383],[5,-21],[-16,-22],[5,-2],[5,-1],[19,-2],[8,-1],[9,-2],[12,-4],[27,-14]],[[5312,4075],[-13,-17]],[[5299,4058],[-15,16],[-3,-5]],[[5281,4069],[-18,11]],[[5263,4080],[-5,4],[-2,3],[-19,11],[-8,5]],[[5229,4103],[9,14],[0,5],[-31,32],[-30,33]],[[5177,4187],[14,18],[14,18]],[[5205,4223],[10,-11],[15,-15],[8,-8],[28,-29]],[[5266,4160],[18,-20]],[[5284,4140],[43,-45]],[[5327,4095],[-15,-20]],[[7828,1424],[-94,22],[-7,22],[-25,-18]],[[7702,1450],[3,5],[8,17],[4,5],[17,27],[1,2]],[[7735,1506],[1,0],[9,1],[5,-1],[89,-26]],[[7685,1444],[-5,1]],[[7740,1546],[3,-2]],[[7743,1544],[-3,-6],[-9,-14],[-9,-17],[-15,-23],[-4,-6],[-11,-23],[-7,-11]],[[7735,1506],[29,49]],[[7746,1548],[-3,-4]],[[7733,1659],[-2,-23],[11,-1],[27,-2],[18,-1],[6,-1],[2,-3]],[[7808,1698],[39,-2],[3,-1]],[[7934,1216],[-39,5]],[[7895,1221],[-51,11],[-47,12]],[[7797,1244],[-63,18],[-88,26],[-20,-8]],[[7626,1280],[-21,0]],[[7605,1280],[6,13],[2,5],[10,15],[12,24],[15,26],[7,15],[25,38],[20,34]],[[8044,1369],[-3,-5],[-7,-9],[-16,-23],[-11,-21],[-11,-17],[-10,-5],[-11,-13],[-6,-12],[-11,-12],[-6,-12],[-18,-24]],[[7590,1280],[10,22],[46,84],[24,42],[3,5]],[[7685,1444],[-5,-9],[-29,-51],[-3,-5],[-11,-16],[-35,-62],[-12,-20],[0,-1]],[[7979,1485],[86,-19],[0,5],[1,17]],[[8066,1488],[1,24]],[[8138,1495],[-3,-2],[-6,-7],[-20,-30],[-4,-8],[-22,-32],[-13,-18],[-9,-9],[-5,-6]],[[7980,1504],[86,-16]],[[8586,1703],[2,-3],[4,-4],[3,-2],[11,-4],[4,-14],[3,-9],[4,-4]],[[8617,1663],[-2,-2],[-9,-9],[-7,-9],[-3,-5],[-2,-8],[0,-8],[-2,-11],[-1,-20],[-4,-11],[-9,-17],[-15,-20],[-5,-2],[-8,1],[-8,-1],[-13,0],[-4,0],[-9,-1],[-8,-4],[-5,-4],[-20,-11],[-7,-3],[-8,-2],[-4,-2],[-5,-3],[-7,-9],[-6,-5],[-5,-8],[0,-11],[-3,-8],[-4,-8],[-10,-7],[-6,-1],[-3,-5],[-1,-4],[-4,-1],[-3,2],[-2,3],[-1,0],[-1,-2],[-12,-1],[-5,-1],[-12,2],[-3,-1],[-1,-6],[-2,-3],[-2,-2],[-5,-1],[-5,2],[-3,7],[-3,-1],[-3,-3],[0,-5],[-1,-3],[-4,-2],[-3,-1],[-3,1],[-5,5],[-3,5],[-4,1],[-6,3],[-6,8],[-3,5],[-7,15],[-1,6],[-1,1],[-1,7],[-7,20],[-7,27],[-4,25],[11,41],[6,13],[3,8],[5,17],[4,18],[8,23],[4,16],[5,28],[3,22],[0,22],[8,16],[5,19],[5,13],[2,15],[4,16],[9,18],[4,11]],[[2899,2234],[-37,-32],[-7,10],[-1,0],[-3,0],[-19,-17],[1,-3],[5,-7],[2,-2],[1,-3],[10,-17],[-35,-32],[-18,30],[-2,0],[-2,0],[-6,-5],[-1,-2],[0,-3],[19,-28],[-17,-15],[-18,29],[-2,1],[-2,0],[-7,-5],[-1,-2],[1,-3],[19,-29],[-14,-11],[-8,6],[-4,5],[-8,13],[-2,2],[-3,0],[-24,-20],[-1,-4],[1,-3],[9,-15],[2,-3],[-2,-3],[-13,-12],[-15,23],[-2,0],[-12,-10],[-2,-2],[1,-4],[13,-20],[-16,-14],[-12,20],[-2,2],[-2,1],[-12,-10],[-1,-2],[1,-3],[6,-11],[1,-9],[14,0],[2,0],[2,1],[2,2],[10,-14],[-42,-36],[-1,-1],[0,-1],[1,-2],[8,-13],[2,-2],[2,0],[2,1],[40,34],[6,-9],[2,-3],[2,-3],[26,22],[27,23],[9,7],[5,6],[48,41],[33,29],[22,19],[6,5],[5,4],[49,42]],[[2940,2167],[24,-39],[15,-25],[11,-17],[2,3],[7,-12],[10,-16],[4,-6],[3,-5]],[[3016,2050],[-3,-3],[-42,-35],[-19,-16],[-35,-29],[-26,-22],[-25,-21],[-24,-20],[-22,-19],[-24,-20],[-8,-6],[-3,-3],[-5,-4],[-7,-5],[-10,-7],[-10,-7],[-10,-6],[-10,-5],[-7,-4],[-7,-3],[-1,-1],[-2,-1]],[[2716,1813],[-3,6],[-4,6],[-5,9],[-59,86],[-3,4],[-15,31],[-7,12],[-22,36]],[[2598,2003],[3,4],[3,5],[10,8],[272,237],[3,3]],[[2889,2260],[13,-23],[-3,-3]],[[4158,3361],[-66,-13],[-2,-2],[-18,-16],[7,-7],[15,-14]],[[4094,3309],[-7,-8],[-7,-5],[-6,-3],[-8,-3],[-18,-6],[-7,-4],[-4,-5]],[[4037,3275],[-5,6],[-2,4],[-5,13]],[[4025,3298],[-2,5],[-1,4],[-4,8],[-15,15],[-1,0],[-13,14]],[[3989,3344],[8,8],[3,3],[5,2],[8,6],[3,4],[0,2],[1,3],[0,2],[-1,3],[-2,2],[-32,34]],[[3982,3413],[11,8],[3,3]],[[3996,3424],[28,-30],[30,-32],[6,0],[16,4],[6,1],[4,2],[5,5],[4,5],[12,-13],[3,0],[10,15],[-3,5],[-5,4],[-7,8],[-11,12],[-22,23],[-5,5],[-22,23]],[[4045,3461],[17,13]],[[4062,3474],[80,-86],[7,-7],[-2,-3],[11,-17]],[[5205,4223],[-37,40]],[[5168,4263],[-4,4],[-3,3],[0,1],[-4,4],[-12,13]],[[5145,4288],[24,30],[-15,15],[6,5],[12,10],[16,15],[11,10],[11,12],[3,4],[4,7]],[[5217,4396],[7,17],[2,5],[2,4]],[[5228,4422],[69,-72]],[[5297,4350],[62,-65]],[[5359,4285],[-11,-15]],[[5348,4270],[-44,-60]],[[5304,4210],[-10,-12],[-28,-38]],[[6657,3142],[-21,15]],[[6986,3651],[11,-15],[9,-21],[10,-22]],[[7145,3082],[-3,-7],[-1,-2],[-7,-9],[-16,-28],[-12,-24],[-31,-57]],[[6976,2905],[-17,13],[-1,1],[-1,0],[-6,5],[-9,6]],[[6942,2930],[4,7],[32,60]],[[9331,8884],[7,32],[8,37],[88,-25]],[[9434,8928],[-5,-24],[-1,-8],[-3,-23],[-2,-13]],[[9423,8860],[-6,2],[-12,3],[-10,3],[-18,5],[-43,12],[-3,-1]],[[6904,2449],[12,21],[10,19],[5,10],[6,10]],[[6256,2171],[-18,12],[-43,27]],[[6195,2210],[10,20],[6,14],[20,42],[3,4],[6,11],[3,9],[1,10],[1,5]],[[6245,2325],[1,11],[2,7],[4,10],[7,15],[1,3]],[[6260,2371],[19,-12],[16,33],[17,-11],[-6,-13],[-9,-20],[12,-8],[5,-5],[5,-6],[6,-5],[3,-4]],[[7771,2440],[-24,17],[-5,7]],[[7922,1911],[1,26],[-6,61],[0,3],[-1,5],[0,24]],[[7908,2031],[0,-3],[-2,-4],[1,-19],[0,-3],[0,-4],[4,-27],[2,-34],[0,-25]],[[6126,4375],[6,2],[2,0],[12,1],[0,27],[1,1],[1,1],[13,4],[2,0],[1,-2],[1,-50],[-5,-14],[1,-2],[15,-7]],[[6176,4336],[-6,-18],[-2,-1],[-2,1],[-31,14],[-14,8],[-1,1],[-1,3],[9,23],[-2,8]],[[9040,5199],[-22,11],[-1,1],[-1,1],[-13,6]],[[9003,5218],[4,8],[5,10],[3,6],[4,10],[6,21],[1,9],[6,26],[4,18],[10,54],[5,18],[3,14],[8,35],[6,29],[1,4],[1,5],[3,12]],[[9073,5497],[2,5],[4,15],[1,3],[2,5],[6,15],[-2,1],[-9,6],[-51,28],[-9,4],[-7,-19]],[[9010,5560],[-9,5],[-39,21],[-9,5]],[[8953,5591],[-8,4],[-53,30]],[[8892,5625],[-6,3]],[[8886,5628],[2,7],[4,13],[32,95],[15,45],[14,42],[14,52]],[[8967,5882],[15,-8],[19,-10],[9,-5],[1,0],[34,-20],[16,-8],[50,-29],[52,-27],[30,-16],[2,-2],[1,3],[6,11],[5,9],[12,24],[2,4]],[[9221,5808],[11,20],[10,19]],[[9242,5847],[7,14],[3,5],[7,13],[7,13],[2,3],[16,31],[2,4],[20,36],[2,4],[1,2],[2,5],[5,10],[4,7],[2,4],[19,34],[6,11],[2,4],[4,9],[2,4],[2,8],[1,4],[2,6]],[[9360,6078],[47,-16],[4,-2]],[[9411,6060],[-1,-6],[-1,-4],[-1,-4],[1,-4],[1,-3],[2,-1],[16,-9],[-27,-111],[3,-1],[-65,-160],[-2,-2],[-36,-56],[-62,-104],[-99,-87],[-1,-6],[1,-2],[2,-2],[5,-2],[9,2],[26,3],[9,0],[3,-1],[6,-7],[5,-9],[4,2],[3,-4],[-22,-18],[-30,-25],[-65,-131],[-37,-75],[-18,-34]],[[8504,5582],[-1,1],[-2,1],[-12,7],[-35,18],[-9,5],[-34,18],[-41,22],[-1,-3],[-9,-23],[-9,-23],[-15,-36],[-6,1],[-9,18],[11,27],[-22,12],[-3,2],[-1,2],[0,2],[0,2],[4,4],[3,4],[3,5],[1,3],[1,8],[0,6],[1,3],[2,5],[1,4],[1,3],[-26,15],[-15,9],[-4,3],[-3,3],[-5,2]],[[8270,5712],[1,4],[6,16],[7,19]],[[8284,5751],[4,9],[8,20],[6,17],[6,16],[4,9],[8,21],[2,5],[1,2],[1,2]],[[8324,5852],[23,-13],[4,-2],[5,-5],[5,-6],[6,-9],[17,-27],[16,-26]],[[8400,5764],[2,-3],[5,-4],[3,-2],[29,-16],[41,-22]],[[8480,5717],[53,-30],[6,-3],[2,-1],[3,-2]],[[8544,5681],[-1,-3],[-1,-3],[-22,-53],[-2,-5],[-14,-35]],[[2883,2571],[-21,-11],[-5,-3]],[[2857,2557],[-4,5],[-24,23],[-12,13],[-5,5],[-4,7],[-6,4],[-21,11]],[[2781,2625],[3,9],[10,8],[18,-8],[5,17],[2,5]],[[2819,2656],[4,2],[44,37]],[[2867,2695],[11,-18],[11,-18],[20,-31],[14,-17]],[[2923,2611],[-9,-12],[-14,-16],[-17,-12]],[[3891,2848],[-153,-124],[-5,-3]],[[3733,2721],[-26,44],[43,35],[-1,5],[3,26],[-19,3],[-15,-6],[-6,-4],[-26,-21],[-3,1],[-10,17],[-10,18],[1,3],[38,30],[5,3],[-11,18],[1,2],[34,11],[3,0],[1,-3],[2,-18],[10,2],[10,-1]],[[3757,2886],[20,0],[0,5],[-2,22],[0,4],[1,3],[37,29],[3,0],[4,0]],[[3820,2949],[2,-20],[-28,-21],[0,-3],[1,-8],[1,-8],[6,1],[29,21],[8,-15],[0,-2],[-1,-2],[-34,-27],[-4,-1],[-6,1],[-2,-23],[6,-1],[4,1],[5,1],[4,3],[19,15],[19,15],[17,14],[25,-42]],[[5490,3360],[-15,-21],[13,-14]],[[5488,3325],[-11,-16],[14,-16],[14,-15],[8,10]],[[5513,3288],[2,-2],[14,-14]],[[5529,3272],[-38,-9],[-4,4],[0,1],[-13,13],[-4,4],[-13,13],[-25,25],[-30,-2]],[[5402,3321],[34,49]],[[5436,3370],[20,-20],[20,23]],[[5476,3373],[14,-13]],[[5741,4799],[-17,-9],[-4,-2],[-24,-13],[-3,-2],[-9,-4],[-3,-1],[-2,2],[-1,-4],[-2,-6],[-2,-3],[-7,-17]],[[5667,4740],[-40,20]],[[5627,4760],[-32,18],[-10,-2],[-13,-4],[-2,-1],[-10,-7],[-8,-7],[-12,-8],[50,-26],[-6,-14],[-6,-16],[-7,-18]],[[5571,4675],[-76,42],[-16,-16],[-16,-15]],[[5463,4686],[-5,12],[-15,10],[-4,1],[-4,2]],[[5435,4711],[0,1],[5,3],[10,11],[3,3],[7,3],[10,-6],[2,0],[2,2],[2,3],[1,2],[0,3],[-5,3],[-2,5],[1,5],[4,5],[3,7],[8,8],[9,1],[6,6],[9,12],[2,2],[3,1],[7,-3],[4,-1],[6,1],[2,2],[17,8],[7,3],[3,1],[6,-1],[2,0],[13,4],[17,6],[8,0],[19,5],[5,0],[16,-1],[10,1],[5,-2],[3,-2],[13,-2],[7,3],[10,-1],[17,5],[8,2],[5,3],[9,3],[2,0]],[[5736,4825],[0,-7],[5,-19]],[[8104,6561],[-34,25],[-16,11],[-40,29]],[[8042,6679],[14,26],[1,2]],[[8057,6707],[39,-28],[16,-11],[-1,-3],[-32,-62],[34,-24],[-5,-10],[-4,-8]],[[5917,3205],[27,37]],[[5944,3242],[14,-14],[9,-10]],[[5967,3218],[-25,-33],[-3,-2],[-1,-1],[-3,-1],[-8,-3],[-8,-7],[-9,-10]],[[8731,1930],[-11,5],[-32,13]],[[8843,2243],[4,-3],[2,-2],[4,-5],[3,-6],[5,-16],[10,-36],[4,-11],[3,-4],[3,-4],[1,-4],[0,-3],[-1,-1],[-2,-3],[-4,-2],[-16,1],[-5,-1],[-5,-7],[-15,-15],[-15,-13],[-8,-12],[-4,-5],[-7,-7],[-2,-2],[-8,-8],[-33,-37],[-17,-18],[0,-17],[-2,-14],[-1,-20],[-6,-38]],[[8731,1930],[-4,-25],[-4,-16],[-5,-14],[-13,-28],[-4,-11],[-8,-18],[-3,-10],[-7,-11],[-2,-5],[-11,-29],[-1,-3],[-9,-18],[-5,-10],[-11,-17],[-5,-9],[-6,-11],[-5,-12],[-5,-11],[-4,-6],[-2,-3]],[[6158,1806],[5,7]],[[6163,1813],[11,-6],[9,-6],[46,-30],[3,0],[7,16],[3,-2],[5,-2],[3,-3],[3,-4],[0,-17],[1,-3],[55,-34],[11,-8],[6,-2],[32,-20],[14,-9],[3,3],[0,78],[-8,7]],[[6367,1771],[8,12],[0,6],[0,22],[0,25],[27,-16],[15,-9]],[[7674,2529],[-28,-35],[-19,-59]],[[7627,2435],[-8,7],[-2,2],[-1,1],[-1,1],[-2,1],[-3,3],[-2,1],[-19,20],[-7,10],[-6,12],[-2,9],[2,14]],[[7576,2516],[1,1],[2,1],[3,0],[2,2],[2,1],[5,5],[6,7],[10,17],[3,4],[13,19]],[[7623,2573],[20,-20],[17,15],[2,1],[14,12],[-8,7],[29,36],[25,29],[2,3],[-26,24]],[[7698,2680],[6,8],[30,40],[4,5]],[[7738,2733],[13,28],[14,25]],[[7765,2786],[15,-11],[2,-1],[22,-20],[19,-17],[2,-2],[7,-6],[1,-1],[3,-3],[1,0],[2,-2],[17,-17]],[[7856,2706],[-14,-16],[-5,-7],[-7,-10],[-10,-17]],[[7698,2680],[-10,-14]],[[7688,2666],[-38,28]],[[7650,2694],[15,22],[17,24]],[[7682,2740],[15,21]],[[7697,2761],[41,-28]],[[6192,2521],[-1,-3],[-8,-17],[-9,-19],[-5,-17]],[[5566,1320],[-9,99],[-8,90],[-18,1],[-1,-4],[-6,-3],[-3,0],[-9,-1]],[[5512,1502],[-1,15],[0,2],[0,5]],[[6426,3903],[-4,-8]],[[6421,3896],[4,13],[22,56],[10,26],[8,24],[2,5],[2,5],[6,16],[3,10],[2,6],[2,5],[1,4],[2,3],[1,3],[1,4],[1,2],[2,6],[0,1],[2,7],[11,47],[2,9]],[[6505,4148],[6,-3],[2,0],[2,-1],[19,-9]],[[6534,4135],[-1,-3],[-8,-24],[-9,-23],[-7,-21],[-8,-23],[-7,-21],[33,-16]],[[6527,4004],[-1,-11],[0,-8],[0,-6],[-1,-7],[-2,-7]],[[6523,3965],[-3,0],[-3,-1],[-2,-1],[-2,-3],[-35,17],[-28,-80],[-20,9],[-3,2],[-1,-5]],[[6153,3930],[-19,-2],[0,3],[-2,1],[-9,1],[-24,11]],[[6099,3944],[3,9],[2,5],[1,4],[3,8],[5,14],[1,5],[0,5],[-2,8],[-4,10],[-2,5],[-3,4],[-4,2],[-16,8]],[[6083,4031],[11,29]],[[6094,4060],[12,-6],[28,-19],[18,-10]],[[6152,4025],[1,-48],[0,-11],[0,-13],[0,-14],[0,-1],[0,-8]],[[7062,7388],[-18,28]],[[7044,7416],[14,15],[6,7],[3,3],[3,4],[5,6],[6,7],[3,4],[6,7],[17,23],[4,5],[6,8],[1,1],[3,5],[7,8]],[[7128,7519],[58,-72],[8,-11],[3,-3]],[[7197,7433],[-8,-8],[-5,-5],[-14,-13],[-27,-23],[-6,-5],[-30,-25],[-1,2],[-30,46],[-14,-14]],[[6260,2371],[33,69],[0,1],[2,7],[1,3]],[[6296,2451],[45,-29]],[[6155,2366],[61,-39],[6,-2],[20,1],[3,-1]],[[6195,2210],[-6,4],[-11,7],[-38,-3],[-5,-1],[-4,-2],[-8,-1],[-29,-2]],[[6489,6147],[-16,25],[-1,-8]],[[6472,6164],[1,10],[2,13],[1,34],[1,9],[12,23],[11,17],[2,4],[8,13],[7,10],[4,11],[7,19],[1,6],[3,13],[3,5],[2,9],[2,9],[3,4],[3,4],[6,4],[5,10],[3,6],[3,3],[5,3],[6,11],[5,6],[14,21],[10,10],[4,7],[2,5],[3,7],[2,0],[0,15],[4,10],[1,3]],[[6618,6498],[1,-1],[3,-3],[3,-3],[3,-3],[3,-3],[2,-4],[2,-1]],[[6635,6480],[-2,-3],[-7,-20],[-8,-17],[-13,-17],[-13,-16]],[[6592,6407],[-11,-14],[-13,-14],[-4,-5],[-1,-3],[-2,-3],[-1,-11]],[[6560,6357],[-3,-26],[-3,-10],[-5,-14],[-9,-21]],[[6540,6286],[-14,-20],[-8,-14],[-7,-14],[-3,-5],[-2,-8],[-3,-10],[-2,-7]],[[6501,6208],[-6,-28],[-6,-33]],[[7493,7356],[12,-20],[49,-78],[50,-79],[4,-3],[2,-5],[30,-47],[3,-3],[1,-1],[1,-2]],[[7471,6984],[-2,2],[-5,11],[-45,101],[-10,16],[-14,22]],[[7395,7136],[-23,37],[-32,51]],[[7340,7224],[-2,3],[-71,102]],[[7267,7329],[-70,104]],[[7197,7433],[4,4],[22,26]],[[7223,7463],[28,31],[29,34],[17,20],[2,2],[15,17]],[[7314,7567],[13,-21],[50,-77]],[[7377,7469],[50,-78],[36,-56],[2,-3],[15,13],[13,11]],[[7912,5473],[-10,-19]],[[7233,6187],[-39,28],[-5,4],[-22,17],[-5,2],[-26,17],[-33,42],[-30,9]],[[7073,6306],[15,29],[24,46],[6,12]],[[7118,6393],[16,29],[13,25],[12,24]],[[7276,6266],[-7,-13]],[[5894,3747],[-3,3],[-2,12],[-4,5],[-8,9],[-29,29]],[[5848,3805],[-54,58]],[[5794,3863],[-56,59]],[[5738,3922],[12,14],[12,17],[14,17],[14,17]],[[5790,3987],[26,-28],[2,-2],[-6,-8],[-6,-7],[-2,-1],[28,-30],[23,-24]],[[5855,3887],[-13,-17],[15,-17],[17,-17],[9,-9],[3,-4],[36,-37],[3,-3]],[[5925,3783],[-11,-14],[-10,-11],[-10,-11]],[[7382,2444],[-13,-18],[-12,-17]],[[5710,3061],[-3,7],[22,5],[13,3],[13,1],[24,2],[23,1],[60,4],[15,0],[-3,4],[-3,4],[0,9],[0,2],[2,10],[37,48]],[[5967,3218],[16,-16],[50,-52],[2,-2],[3,-3]],[[6038,3145],[-7,-8],[-10,-10],[-10,-10],[-8,-6],[-9,-7],[-8,-5],[-10,-5],[-8,-3],[-9,-4],[-10,-3],[-5,-2],[-6,-1],[-10,-2],[-11,-1],[-16,-1],[-1,0],[-1,0],[-7,0],[-18,-1],[-20,-1],[-22,-1],[-13,0],[-12,-1],[-21,-1],[-17,-1],[-14,-2],[-7,0],[-4,-1],[-5,-1],[-6,-1],[-7,-1],[-5,-1],[-5,-2],[-6,-1]],[[5641,3296],[17,-17],[-14,-18]],[[5644,3261],[-5,-7],[-5,-8],[-3,-10],[-1,-9],[1,-9],[3,-7]],[[5634,3211],[-13,1],[-12,-18],[9,-12],[-17,-9]],[[5601,3173],[1,4],[-5,11],[-3,3],[11,15],[3,4],[3,6],[1,4],[0,7],[-1,7],[0,9]],[[5611,3243],[7,16],[9,12],[1,3],[-1,3],[-19,21],[-8,2],[-14,4],[-2,1],[-5,4],[-10,11]],[[5569,3320],[22,29]],[[5591,3349],[35,-37],[15,-16]],[[5710,3061],[-6,-1],[-5,-2],[-6,-2],[-6,-2],[-4,-1],[-4,-2],[-4,-1],[-7,-3],[-5,-2],[-2,-1],[-4,-2],[-11,-5],[-6,-3],[-4,-2],[-10,-6],[-11,-5],[-10,-5],[-2,-2],[-3,-1],[-2,2],[-3,4],[-2,2],[-10,10],[-14,15],[-13,15],[-6,10],[-2,6],[-3,7],[-3,9],[-3,13],[-2,12],[-6,25]],[[5531,3143],[42,16],[5,2],[20,8],[1,1],[1,1],[1,2]],[[5634,3211],[-8,-10],[-3,-4],[0,-2],[0,-2],[1,-3],[47,-48],[1,-1],[2,0],[2,0],[8,12],[1,3],[-1,13],[6,1],[6,2],[5,3],[5,5],[21,28]],[[5727,3208],[15,-15],[15,-16]],[[5757,3177],[17,-18]],[[5774,3159],[15,-16],[23,29],[14,-16],[-23,-31],[12,-13],[5,0],[36,49]],[[7239,1392],[7,-5],[27,-20]],[[9682,8897],[-40,12],[-2,-14],[-34,10],[-6,1]],[[9600,8906],[5,8],[1,9],[9,48],[1,5],[5,17],[0,8],[5,23],[9,46],[1,5],[10,96],[0,8],[-2,0],[-2,0],[-1,1],[3,10],[3,16],[1,61],[2,43]],[[9650,9310],[2,-1],[40,-11],[5,5]],[[9600,8906],[4,24],[4,21],[4,21],[5,20],[2,10],[-1,11],[-2,22],[-43,11]],[[9573,9046],[-65,18],[-2,-3]],[[9506,9061],[-7,-4],[-15,-5],[-2,-10],[-6,-8],[-12,-63],[20,-6],[2,-2]],[[9486,8963],[-5,-23]],[[9481,8940],[-36,9],[-6,2]],[[9439,8951],[23,111]],[[9473,9112],[6,-2],[18,-5],[-1,-7],[0,-3],[1,-3],[3,2],[20,7],[22,8],[20,7],[13,6],[10,6],[6,5],[7,6],[5,6],[2,7],[-39,11],[-18,5],[-18,5],[-18,5],[-19,1],[-6,1]],[[9547,8921],[5,24],[4,21],[4,21],[4,20],[5,19],[4,20]],[[9600,8906],[-20,6],[-5,1],[-28,8]],[[9547,8921],[-66,19]],[[9486,8963],[5,21],[4,21],[4,21],[4,19],[2,9],[1,7]],[[9434,8928],[5,23]],[[9547,8921],[-5,-23],[-5,-24],[-4,-22]],[[9533,8852],[-66,18],[-4,-21],[-27,7],[-13,4]],[[9302,8735],[5,25],[5,22],[8,53],[6,25],[5,24]],[[9423,8860],[0,-4],[-2,-17],[-1,-6],[-5,-24]],[[9415,8809],[-3,-16],[-12,-59],[-4,-11],[-4,-11],[0,-1]],[[9392,8711],[-5,1],[-19,5],[-30,9],[-15,3],[-21,6]],[[9432,8700],[-38,10],[-2,1]],[[9415,8809],[38,-10]],[[9453,8799],[-6,-29],[-1,-5],[-11,3],[-3,-14],[11,-3],[0,-3],[-5,-24],[-3,-17],[-3,-7]],[[9514,8759],[-10,-52]],[[9504,8707],[-5,-25]],[[9499,8682],[-67,18]],[[9453,8799],[4,24],[66,-19]],[[9523,8804],[-5,-24],[-4,-21]],[[9533,8852],[-4,-22]],[[9529,8830],[-1,-3],[-3,-15],[-2,-8]],[[9529,8830],[76,-21],[2,-1]],[[9607,8808],[0,-3],[3,-24]],[[9610,8781],[2,-26],[4,-45],[-25,7],[4,17],[-2,3],[-56,16],[-23,6]],[[9600,8906],[0,-24],[2,-25],[3,-25],[2,-24]],[[9644,8668],[-3,24],[-5,32],[0,7],[-3,20],[0,11],[0,13],[-23,6]],[[9695,8890],[-2,-4],[0,-6],[0,-16],[1,-5],[-2,-10],[0,-20],[2,-19],[-3,-6],[0,-9],[2,-10],[1,-7],[0,-1],[-2,-10],[-4,-10],[1,-25],[2,-7],[-1,-11],[4,-10],[0,-13],[-1,-9],[2,-7],[2,-10],[-1,-7],[2,-3]],[[9644,8668],[-19,5],[-5,2],[3,-27],[-59,16]],[[9564,8664],[5,25],[-42,11],[-23,7]],[[9490,8638],[4,20],[5,24]],[[9564,8664],[-5,-24],[-3,-19]],[[9556,8621],[-49,13],[-17,4]],[[9486,8616],[4,22]],[[9556,8621],[16,-5],[4,18],[3,1],[33,-9],[2,-1],[0,-2],[2,-19],[2,-18],[-1,-2],[-2,-1],[-64,17],[-65,16]],[[8996,3934],[12,-63],[1,-4],[53,-282],[38,-209],[4,1],[24,-132],[23,-100],[-27,-16],[0,-27],[2,-1],[-13,4],[-47,24],[-17,11],[-21,18],[-30,31],[-13,17],[-10,15],[-8,13],[-13,22],[-8,16],[-3,12],[-9,22],[-11,45],[-3,22],[-3,24],[-1,22],[1,23],[0,18],[4,20],[3,22],[1,4],[0,3],[0,1],[1,5],[5,9],[4,13],[6,19],[11,40],[6,44],[0,34],[0,6],[-3,66],[-8,103],[-7,97],[0,8],[0,5],[0,4],[3,6],[4,1],[10,-4],[4,0],[5,4],[12,7],[1,1],[-19,106],[1,9],[1,1],[5,-1],[25,-127],[5,-3],[2,-9],[1,-7],[-1,-1],[-3,-3],[0,-9]],[[9038,3405],[-1,6],[-11,1],[-11,1],[-1,-3],[-27,3],[-3,1],[-3,0],[0,32],[1,3],[0,3],[1,10],[2,7],[2,18],[2,7],[1,5],[2,3],[0,6],[2,4],[0,4],[0,6],[0,1],[10,33],[6,32],[-11,33],[-21,2],[-4,-31],[-4,-19],[-10,-37],[-1,-5],[-6,-29],[-2,-10],[-3,-21],[-1,-15],[-2,-26],[-1,-5],[0,-21],[0,-2],[0,-17],[12,0],[17,-1],[0,-31],[0,-2],[5,0],[0,-30],[-1,-1],[-3,-9],[-7,0],[-3,-1],[-2,-3],[0,-26],[1,-6],[2,-3],[2,-2],[2,0],[1,2],[0,6],[2,4],[2,3],[11,0],[1,0],[2,4],[2,13],[1,2],[2,1],[3,-2],[2,-4],[1,-4],[2,-8],[3,-22],[-2,-1],[0,-7],[-3,-3],[-5,-1],[-6,3],[-3,-1],[-2,-3],[3,-4],[1,-1],[1,-2],[5,-7],[3,-5],[2,-4],[0,8],[-1,8],[1,4],[3,4],[3,0],[3,-2],[3,-2],[0,-3],[2,-2],[-2,-7],[-2,-9],[3,-7],[3,-6],[4,-1],[2,-6],[0,-6],[4,-9],[2,-4],[4,-2],[1,-4],[2,-1],[4,-1],[6,1],[1,0],[5,6],[1,5],[-2,21],[1,9],[-2,7],[-5,12],[0,8],[4,10],[0,9],[-2,5],[0,9],[2,11],[0,11],[-4,20],[-3,37],[0,37],[-1,6]],[[8980,3810],[102,-565],[12,-65],[27,7],[-10,58],[-105,572],[-26,-7]],[[8960,3872],[1,-1],[1,1],[3,2],[3,4],[10,0],[5,-4],[3,0],[-1,15],[-1,3],[2,3],[-2,10],[-6,8],[-4,3],[-6,0],[-1,-1],[-9,-12],[1,-10],[1,-3],[-1,-3],[1,-15]],[[8953,3313],[0,1],[-2,0],[-1,3],[-4,4],[-4,0],[-1,-2],[0,-6],[1,-3],[3,-3],[3,0],[4,3],[1,1],[0,2]],[[8794,4165],[1,-13],[4,-1],[5,1],[3,-1],[8,-2],[8,-2],[9,-2],[4,-1],[3,-4],[3,-3],[1,-5],[1,-16],[1,-6],[3,0],[6,-1],[5,-3],[4,-3],[5,-3],[3,-3],[3,-3],[2,-1],[3,-3],[1,1],[0,3],[3,2],[1,0],[1,-4],[7,-139],[2,-13],[4,-44],[2,-14],[11,-37],[1,-19],[12,-90],[-1,-15],[-2,-6],[-3,-10],[0,-6],[-4,-8],[-1,-4],[-1,-12],[-3,-29],[-6,-40],[-14,-54],[-5,-21],[-3,-13],[-9,-37],[-2,-6],[-1,-5],[-1,-3],[-8,-9],[-3,-2],[-2,0],[-7,-1],[-6,0],[-4,1],[-5,2],[-7,8],[-14,25],[-2,6],[-26,51],[-6,25],[-19,90],[-9,37],[1,57],[6,62],[1,36],[0,3],[-1,2],[1,7],[-4,27],[-3,8],[-5,18],[-2,16],[-3,15],[0,1],[-2,20],[-1,3],[-4,9],[-1,11],[1,22],[4,17],[5,39],[6,20],[7,21],[19,47],[34,73],[3,4],[3,2],[6,12],[0,6],[5,8],[1,5],[5,7],[5,6],[3,3],[20,0],[8,-5],[3,-5],[3,-7],[2,-13],[3,-49],[-3,-6],[-6,-7],[-57,7],[-17,-31],[-2,-6]],[[8983,3495],[-1,-13],[-4,-21],[-1,-8],[0,-3],[1,-3],[-1,-14],[-2,-17],[-18,1],[-8,0],[0,12],[1,12],[2,15],[4,31],[10,-2],[1,9],[-9,2],[0,5],[1,5],[2,5],[-1,6],[3,3],[1,4],[0,6],[-1,3],[11,36],[7,30],[2,17],[15,-4],[8,-20],[-3,-14],[-13,-54],[-5,-10],[2,-5],[1,-3],[-2,-2],[-2,-6],[-1,-3]],[[8988,3410],[-1,-32],[17,-1],[-3,-27],[-1,-7],[-1,-2],[-5,-4],[-12,-1],[0,20],[-5,0],[1,38],[-12,1],[-1,-6],[-8,1],[-9,1],[0,11],[0,10],[9,0],[27,-1],[4,-1]],[[8879,4108],[-1,1],[-1,2],[-1,25],[-2,37],[2,8],[1,3],[3,-1],[3,-4],[1,-5],[-1,-16],[-2,-6],[2,-39],[-4,-5]],[[9137,3084],[-6,17],[2,-3],[5,-13]],[[8620,3881],[-23,-113],[1,-1],[-3,-12]],[[8595,3755],[-15,5],[-6,2]],[[8574,3762],[-40,11],[0,4],[0,1],[2,7],[2,2],[-8,1],[-2,0],[-6,-2],[-5,-3],[-7,-6],[-6,-6],[-2,-1],[-3,-4],[-3,-5],[-5,-8],[-3,-11]],[[8488,3742],[-5,3],[-1,1],[-4,3],[-4,4],[-22,16],[-25,19]],[[8427,3788],[-4,3],[-43,32]],[[8380,3823],[8,15],[8,15]],[[8396,3853],[46,-35],[11,13],[9,14]],[[8462,3845],[13,22],[10,20],[6,10]],[[8491,3897],[7,12],[12,22],[14,24]],[[8524,3955],[2,-3],[12,-15],[8,-5],[15,-9],[3,-1],[3,-2],[7,-5],[5,-1],[23,-18],[9,-4],[9,-11]],[[8396,3853],[8,15],[8,15]],[[8412,3883],[10,-7],[14,-11],[26,-20]],[[6830,4348],[17,49],[3,4],[12,35]],[[6862,4436],[29,85],[2,2],[3,10],[2,3]],[[6898,4536],[43,-21],[8,-4],[9,-4]],[[6958,4507],[62,-31]],[[7020,4476],[44,-20],[13,-7]],[[7077,4449],[-1,-3],[-4,-13],[-2,-5],[-36,-102],[-10,-27],[-1,-5]],[[7023,4294],[-61,18]],[[8089,3915],[6,13],[-66,50]],[[8029,3978],[7,12]],[[8036,3990],[43,-32],[23,-18]],[[8102,3940],[9,-7],[29,-22]],[[8140,3911],[-7,-12],[-6,-11],[-33,25],[-5,2]],[[8152,3903],[-14,-25]],[[8138,3878],[-2,-2],[-4,-4],[-17,-23]],[[8115,3849],[-29,22]],[[8086,3871],[-16,12],[-66,49]],[[8004,3932],[6,11],[4,8]],[[8014,3951],[59,-44],[3,-3],[5,-3],[8,14]],[[8140,3911],[12,-8]],[[8014,3951],[4,7],[5,8],[6,12]],[[8172,3805],[-10,8],[-14,11],[-3,2],[-10,8],[-6,5]],[[8129,3839],[-9,7],[-5,3]],[[8138,3878],[5,-1],[36,-27],[5,-3]],[[8184,3847],[-1,-4],[-1,-3],[-1,-4],[-9,-31]],[[8152,3903],[10,-8],[18,-14],[11,-8]],[[8191,3873],[-7,-26]],[[8094,3750],[-8,-15]],[[8086,3735],[-50,39]],[[8036,3774],[3,6],[4,9],[8,15],[3,7],[5,9]],[[8059,3820],[41,-32],[11,-8]],[[8111,3780],[-6,-10],[-3,-5],[-8,-15]],[[8071,3704],[-1,2],[-33,24],[-7,5],[-10,8]],[[8020,3743],[1,3],[7,13],[8,15]],[[8086,3735],[8,-6]],[[8094,3729],[-8,-14],[51,-38]],[[8142,3693],[-4,3],[-40,30],[-4,3]],[[8094,3750],[12,-11],[14,-11],[22,-19],[4,-2]],[[8111,3780],[6,-4],[10,-7],[19,-15],[10,-8]],[[9697,9303],[3,20],[1,5],[2,8],[1,6],[5,32]],[[9709,9374],[5,33],[2,7],[6,40],[1,7]],[[9723,9461],[4,24]],[[9727,9485],[41,-10],[20,21],[17,23],[11,15],[15,25]],[[9831,9559],[25,42],[7,11],[2,12]],[[9865,9624],[4,20],[-8,13],[-1,5],[2,12]],[[9862,9674],[4,22],[5,23],[7,38],[-14,3],[2,15],[14,-2],[4,23]],[[9884,9796],[1,6],[1,7],[8,33],[4,14],[12,48],[3,5],[5,12],[-15,-5],[-17,-5],[-25,-8]],[[9861,9903],[-8,-2]],[[9850,9931],[2,2],[2,-1],[2,-1],[2,-2],[10,0],[16,4],[8,3],[20,11],[3,1],[7,5],[6,3],[1,0],[7,-1],[6,-3],[6,2],[6,10],[6,5],[17,3],[4,4],[3,-1],[2,0],[4,4],[5,0],[4,-2],[0,-5],[-4,-7],[-2,-5],[-6,-14],[-11,-14],[-3,-6],[-4,-7],[-3,-1],[-6,-20],[-6,-3],[-3,-3],[-2,-12],[0,-10],[-3,-12],[-4,-5],[0,-13],[-1,-7],[-3,-4],[0,-2],[0,-1],[-6,-7],[-1,-8],[-3,-4],[-3,-8],[0,-3],[0,-5],[0,-11],[-3,-3],[-4,-9],[0,-11],[-2,-9],[-5,-22],[-2,-22],[-2,-8],[-6,-14],[-4,-19],[-5,-9],[-10,-27],[-4,-7],[-6,-4],[-2,-2],[-6,-10],[-5,-7],[-1,-6],[1,-6],[-8,-5],[-5,-10],[-6,-9],[-6,-6],[-7,-13],[-4,-5],[-5,-13],[-7,-6],[-2,-9],[4,-6],[1,-1],[-2,-3],[-5,-4],[0,-6],[-4,-2],[-9,1],[-6,0],[-10,-16],[-2,-11],[-6,-10],[-2,-4],[-1,-3],[-4,-6],[-6,-4],[-1,0],[-1,0],[-7,-14],[0,-7],[-1,-7],[0,-5],[-1,-3],[-3,-5],[-3,-12],[-1,-3],[-1,-10],[0,-4],[-1,-6],[-7,-13],[-1,-11],[0,-14],[-1,-6],[-1,-22]],[[9862,9674],[-28,6],[-13,4],[-9,2],[-9,8],[-8,8],[-19,20]],[[9776,9722],[10,6],[2,2],[5,6],[30,45],[15,23]],[[9838,9804],[46,-8]],[[9838,9804],[11,16],[5,10],[5,14],[4,15],[1,11],[0,10],[-3,23]],[[9865,9624],[-83,23],[-5,-25]],[[9777,9622],[-26,7],[4,26],[3,13],[1,5],[0,5],[3,16],[4,10],[4,8],[6,10]],[[9831,9559],[-22,6],[-25,6]],[[9784,9571],[4,24],[5,23],[-16,4]],[[9727,9485],[5,26]],[[9732,9511],[4,26],[4,24],[40,-10],[4,20]],[[9732,9511],[-4,3],[-60,15]],[[9673,9553],[0,4],[9,27],[9,23],[12,24],[4,7],[12,18],[17,21],[14,18],[13,18],[19,31],[7,15],[11,28],[9,36]],[[9723,9461],[-43,12],[-3,0],[-1,-3],[-3,-17],[-1,-17],[0,-8],[1,-6],[1,-10],[3,-13],[8,-24],[9,2],[15,-3]],[[9233,6314],[-7,-25],[-22,11],[-7,-23]],[[9197,6277],[-10,5],[-31,16],[-10,5]],[[9146,6303],[7,24],[8,23]],[[9274,6238],[-9,5],[-58,29],[-10,5]],[[9240,6335],[17,-9],[18,-8],[17,-9],[2,-1]],[[9294,6308],[-5,-18],[-5,-20],[-10,-32]],[[9293,6387],[21,-89],[-20,10]],[[9365,6386],[2,-11],[0,-11],[3,-6],[1,-12],[4,-11],[2,-19],[1,0],[6,-21],[2,-3],[9,2],[3,1],[4,0],[4,-3],[1,-1],[-1,5],[4,1],[27,-135]],[[9437,6162],[-43,20],[-3,2],[-5,1],[-4,2],[-35,17],[-8,1]],[[9339,6205],[-8,4],[-36,18],[-5,2],[-6,3],[-10,6]],[[9298,6153],[-45,23]],[[9253,6176],[3,7],[4,11],[8,21],[6,23]],[[9339,6205],[8,-30],[8,-30],[3,-12],[2,-12],[-26,13],[-36,19]],[[9253,6176],[-8,-15],[-72,36]],[[9173,6197],[5,16],[2,8],[4,12],[6,22],[7,22]],[[9298,6153],[-6,-16],[-4,-10],[-4,-10],[18,-10],[19,-4],[3,7],[4,9],[33,-18],[1,-2],[-1,-8],[-1,-11],[0,-2]],[[9360,6078],[-3,1],[-14,5],[-8,3],[-9,3],[-10,4],[-10,3],[-7,3],[-31,11],[-9,3],[-6,2],[-4,2],[-6,2],[-9,5],[-7,3],[-5,2],[-5,3],[-4,2],[-2,1],[-2,1],[-5,3],[-3,2],[-2,1],[-3,2],[-3,1],[-20,11],[-5,2],[11,-11],[-8,5],[-6,3],[-2,1],[-3,2],[-2,1],[-3,1],[-8,3],[-4,1],[-5,1],[-5,2],[-7,1],[-5,1],[-6,1],[-11,1],[-6,0],[-2,1],[-3,0],[-3,0],[-4,1],[-4,0],[-3,0],[-4,1],[-4,1],[-4,0],[-3,1],[-4,1],[-3,1],[-4,2],[-3,1],[-3,1],[-1,1]],[[9046,6184],[2,7]],[[9048,6191],[7,23],[2,7],[1,4],[3,10],[9,26],[14,48]],[[9084,6309],[5,-2],[-6,-23],[-6,-20],[-5,-16],[10,-6],[41,-20]],[[9123,6222],[-2,-11],[-3,-8],[14,-7],[12,-6],[24,-12],[5,19]],[[9123,6222],[2,17],[3,9],[4,11],[7,22],[7,22]],[[9084,6309],[7,23]],[[9091,6332],[5,-3],[10,-5],[31,-16],[9,-5]],[[9091,6332],[21,70],[20,65]],[[9084,6309],[-6,3],[-3,2],[-14,7],[-29,15]],[[9032,6336],[2,2],[7,22],[4,16]],[[9045,6376],[11,-6],[9,-4],[5,15],[8,27],[4,11],[4,12],[-13,7],[-7,4]],[[9066,6442],[2,5],[0,2],[1,1],[4,12],[2,4]],[[9075,6466],[7,-4],[28,-14],[10,-5],[7,24],[7,26]],[[9045,6376],[13,43]],[[9058,6419],[1,3],[3,9],[3,7],[1,4]],[[9668,8499],[-23,7],[-9,2]],[[9636,8508],[-96,24],[-1,0],[-1,-2],[-8,-38]],[[9530,8492],[-8,-40]],[[9522,8452],[-66,16]],[[9456,8468],[4,22],[12,59]],[[9472,8549],[14,67]],[[9636,8508],[2,-23],[-20,5],[4,-37],[-1,-4],[-4,0],[-70,18],[-2,1],[0,2],[3,17],[-18,5]],[[9644,8420],[-56,15],[-66,17]],[[9469,8308],[-16,25],[-12,20],[-4,16],[1,13]],[[9438,8382],[5,21],[5,23],[4,21],[4,21]],[[9648,8374],[-20,5],[-44,11],[-55,15],[-3,-1],[-2,-3],[-3,-18],[-5,-21]],[[9516,8362],[-11,2],[-3,-21],[-7,-34]],[[9495,8309],[-13,4],[-4,0],[-4,-2],[-5,-3]],[[9653,8327],[-77,19],[-60,16]],[[9631,8287],[-76,19],[-2,-12],[-19,5],[-20,5],[-19,5]],[[9475,8269],[2,12],[0,8],[-2,8],[-6,11]],[[7032,4840],[-4,3],[-4,3],[-21,15],[-21,16]],[[6982,4877],[-41,30],[-3,3],[-1,1],[-3,-2],[-7,-7],[-12,-11],[-7,-5],[-1,-3],[-8,-7]],[[6899,4876],[-8,-6],[-7,-7],[-7,-5],[-10,-7]],[[6867,4851],[-30,14],[-10,5],[-3,1],[0,1]],[[6824,4872],[5,4],[5,4],[4,3],[7,4],[4,3],[4,2],[9,3],[4,2],[4,2],[6,2],[6,1],[8,2],[10,3],[7,2],[7,3],[7,2],[6,3],[3,1],[2,1],[1,1],[3,1],[3,2],[4,3],[9,6],[3,2],[7,5],[10,9],[2,2],[11,10],[6,6]],[[6991,4966],[2,-4],[89,-65]],[[7082,4897],[-15,-19],[-18,-19],[-2,-3],[-5,-5],[-8,-10],[-2,-1]],[[8792,5843],[-9,5],[-62,34],[-8,4]],[[8713,5886],[3,10],[5,12]],[[8807,5880],[-15,-37]],[[8792,5843],[-8,-21]],[[8784,5822],[-9,5],[-9,5]],[[8766,5832],[-27,15],[-9,4],[-4,-9]],[[8726,5842],[-8,5],[-9,4],[-9,5]],[[8700,5856],[8,20],[5,10]],[[8709,5799],[9,22]],[[8718,5821],[4,10],[4,11]],[[8766,5832],[-4,-10],[-4,-10],[-9,5],[-9,5],[-13,-33]],[[8784,5822],[-21,-53]],[[8640,5863],[8,-5],[61,-33],[9,-4]],[[8648,5884],[9,-4],[35,-19],[8,-5]],[[8627,5896],[7,19]],[[8612,5852],[-3,2],[-11,6],[-31,17],[-14,8],[10,24],[-4,2],[1,3]],[[8560,5914],[6,15],[-8,5]],[[8597,5812],[-3,1],[-43,24],[-9,5],[-9,5]],[[8533,5847],[7,17],[-18,11],[20,49],[18,-10]],[[8533,5847],[-9,5],[-31,17]],[[8493,5869],[-21,12],[-19,10]],[[8496,5756],[-40,22]],[[8456,5778],[4,10],[4,11],[13,31],[8,20]],[[8485,5850],[8,19]],[[8533,5847],[-8,-20],[-8,-19],[-8,-21],[-5,-11]],[[8504,5776],[-4,-10],[-4,-10]],[[8485,5850],[-39,21],[-9,-19],[-40,21]],[[8397,5873],[8,20],[8,20]],[[8456,5778],[-41,23],[-8,-20],[-7,-17]],[[8324,5852],[11,26],[1,5]],[[8336,5883],[5,-2],[16,-9],[16,-9],[16,-9],[8,19]],[[8336,5883],[8,19]],[[8344,5902],[8,20],[8,20]],[[8344,5902],[-3,2],[-34,19],[-13,8],[8,19]],[[8302,5950],[8,20],[14,-8],[4,8],[2,2],[4,9]],[[8334,5981],[17,-9],[4,9],[2,2],[4,8],[14,-8],[2,-1]],[[8324,5852],[-3,1],[-31,17],[-73,41]],[[8217,5911],[7,18],[24,67],[18,48]],[[8266,6044],[17,-10],[-16,-40],[-8,-19],[43,-25]],[[8266,6044],[7,21]],[[8273,6065],[11,-7],[51,-28]],[[8335,6030],[-8,-20],[14,-8],[-4,-8],[1,-4],[-4,-9]],[[8335,6030],[9,22],[28,-16]],[[8273,6065],[3,7],[5,13]],[[8281,6085],[6,20]],[[8287,6105],[20,-12],[26,-14],[15,-8]],[[8287,6105],[5,14],[7,20],[13,36],[1,3]],[[8281,6085],[-3,2]],[[8278,6087],[-3,1],[-7,4],[-9,5],[-12,6],[0,10]],[[8247,6113],[7,20],[15,42],[15,-7],[7,18],[1,3]],[[8292,6189],[3,-1],[16,-9],[2,-1]],[[7547,5461],[-53,39],[-3,2],[-2,1],[-3,2],[-2,2],[-2,2]],[[7482,5509],[9,16],[9,17],[11,16],[3,3]],[[7514,5561],[3,7],[5,10],[2,3],[3,-2],[2,-2],[3,-2],[23,-16],[9,-9],[2,-3],[4,-3],[15,-11]],[[7585,5533],[-1,-3],[-10,-18],[60,-44]],[[7585,5533],[9,16],[8,16],[4,7]],[[7606,5572],[60,-44]],[[7606,5572],[5,8]],[[7611,5580],[9,-6],[19,36],[6,4],[6,-1],[8,-6],[15,-11],[21,-14],[10,18]],[[7705,5600],[50,5],[8,-4],[7,-5]],[[7611,5580],[-6,5],[12,22],[-2,9],[6,4],[10,11],[16,4],[10,0],[48,-35]],[[7729,5708],[1,-10],[-1,-5],[-18,-33],[23,-18],[12,13],[12,6],[12,4],[12,-3]],[[7782,5662],[10,-3],[6,-5]],[[7606,5572],[-53,39],[-4,3]],[[7637,5775],[3,-2],[7,-5],[36,-26],[3,-2],[2,-2],[2,-1],[8,-4],[3,-1],[3,0],[8,-1],[10,-1],[3,1],[2,0],[0,-3],[0,-3],[2,-17]],[[7729,5708],[13,1],[4,0],[42,-30],[-5,-10],[-1,-7]],[[7777,5747],[-2,-4],[-3,-5],[0,-2],[1,-1],[1,-1],[47,-35]],[[7660,5817],[3,-2],[3,-2],[49,-36],[39,-29],[2,-1],[1,-2],[1,-3],[2,1],[5,2],[3,1],[4,0],[5,1]],[[7679,5853],[3,-1],[2,-2],[27,-19]],[[7711,5831],[23,-18],[58,-41],[-10,-18],[-5,-7]],[[7711,5831],[1,4],[8,13],[9,16],[2,1],[3,-1],[30,-22],[7,5]],[[7771,5847],[6,-3],[4,-7],[16,-13],[11,8],[29,-21],[7,20],[4,11],[5,8]],[[7853,5850],[17,-13]],[[7771,5847],[1,17]],[[7772,5864],[7,0],[11,5],[5,6],[6,13]],[[7801,5888],[12,-9],[27,-20],[13,-9]],[[7801,5888],[-17,13],[-2,1],[10,18]],[[7792,5920],[9,18],[3,5],[2,4],[0,2],[0,3],[-1,4]],[[7772,5864],[-8,2],[-5,4],[-47,33],[5,9],[7,11],[7,8],[2,2],[3,2],[7,4],[24,7],[-1,-8],[26,-18]],[[7679,5853],[13,24],[16,29],[0,1],[19,34],[17,31],[1,3]],[[7636,5886],[22,41],[26,47],[-15,11]],[[7669,5985],[16,32],[2,3]],[[7687,6020],[10,-8],[1,-1],[29,-25],[4,-3],[3,-2],[5,-2],[3,-2],[3,-2]],[[7621,5897],[10,22],[-11,8],[-8,0]],[[7612,5927],[1,22],[3,10],[4,11],[3,9],[0,13]],[[7623,5992],[8,2],[7,-1]],[[7638,5993],[25,-18],[6,10]],[[7562,5946],[11,19],[9,16],[-1,5],[-14,10],[11,19],[9,19]],[[7587,6034],[21,-16],[9,-9],[1,-3],[5,-14]],[[7612,5927],[-17,0],[-7,1],[-4,1],[-22,17]],[[7587,6034],[-15,10]],[[7572,6044],[12,21],[13,13]],[[7597,6078],[9,-14],[1,-5],[-6,-5],[1,-5],[13,-10],[3,1],[3,4],[2,1],[13,-12],[14,-13],[1,-5],[-13,-22]],[[7597,6078],[14,13],[2,3]],[[7613,6094],[2,-3],[9,-12],[9,-10],[10,-11],[13,-13],[15,-13],[16,-12]],[[7613,6094],[-2,4],[-11,16],[-5,9],[-10,17],[-2,4]],[[6559,2837],[-53,39]],[[6506,2876],[11,22],[14,24],[10,18],[6,11]],[[6489,2725],[-19,5],[-10,7],[-6,9],[-2,10],[0,6],[3,7],[19,35],[12,22],[-11,8]],[[6475,2834],[13,20],[3,0],[0,5],[11,20],[4,-3]],[[6559,2837],[-12,-23],[-13,-23],[-15,-22],[-11,-18],[-15,-15],[-4,-11]],[[6489,2725],[-2,-8],[-2,-22]],[[6485,2695],[-18,-3],[-9,-6],[-10,-9],[-10,-16],[-4,-18],[0,-14]],[[6434,2629],[-9,0],[-11,-1],[1,-75],[4,-4],[5,-3],[58,-43],[4,0],[10,19]],[[6496,2522],[11,-8],[2,-1]],[[6492,2483],[-1,1],[-68,50],[-4,0],[-13,16],[-5,4]],[[6399,2727],[12,-4],[14,-9],[19,37],[-8,6],[39,77]],[[9334,6927],[-22,6]],[[9492,7435],[10,15],[12,18],[2,3],[10,16],[2,3],[20,30],[31,-10],[2,11],[5,13],[7,30],[-13,4],[14,20],[14,22]],[[9641,7660],[15,-3],[17,-6],[10,-3]],[[9683,7648],[-3,-6],[-3,-13],[1,-2],[0,-2],[-4,-4],[-1,-3],[1,-2],[11,-10],[21,35],[5,-2],[-36,-57],[-5,-7],[-3,3],[1,1],[-1,3],[-2,0],[-13,-10],[-5,-4],[-4,-5],[-12,-10],[-5,-2],[-5,-3],[0,-3],[-2,-7],[0,-2],[8,-4],[0,-1],[-4,-2],[-4,1],[-2,3],[-2,0],[-1,-1],[-3,-4],[-2,-2],[-1,-2],[1,-6],[2,-3],[8,-4],[1,-2],[1,-1],[-1,-1],[-2,0],[-2,0],[-5,4],[-2,0],[-1,-1],[-3,-3],[-1,-4],[0,-15],[-3,-3],[-5,-14],[2,-3],[7,-1],[4,4],[1,9],[3,-1],[0,-3],[2,-1],[2,-5],[5,9],[3,-2],[-36,-56],[-2,2],[-1,0],[-16,-9],[0,-3],[-1,-1],[-7,2],[0,1],[-1,0],[-31,-27],[-4,-9],[1,-8],[46,16],[1,-5],[-50,-17],[-2,-5],[-1,-6],[-2,-1],[-3,-2],[-10,-10],[-4,-18],[0,-1],[9,-5],[5,-7],[4,-4],[2,-5],[3,0],[14,22],[4,-3],[-19,-28],[-6,-9],[-30,-46],[-4,-10],[-34,-81],[-11,-26],[-3,-9],[-22,-92],[-22,-94],[-4,1],[1,2],[-4,0],[-3,-1],[0,-4],[-6,-1],[-2,0],[-1,-3],[0,-1]],[[9774,7870],[0,-4],[-1,-1],[0,-1],[-2,-10],[8,-8],[-4,0],[-4,3],[-4,2],[-2,0],[-2,-1],[-2,-1],[-8,-14],[-3,-5],[-3,-9],[-3,-5],[-9,-9],[-5,-7],[-8,-18],[-2,-8],[0,-4],[-6,-16],[0,-1],[-2,-12],[-5,-7],[-10,-8],[-4,-6],[-7,-14],[0,-4],[0,-7],[11,-8],[2,-5],[-1,-3],[-2,-2],[-6,-15],[-3,-3],[-4,-10],[0,-1]],[[9261,6900],[14,44]],[[9203,6858],[5,16],[5,17],[6,22],[7,25],[5,16],[1,2]],[[9162,6870],[4,16],[6,16],[6,22],[7,25],[5,19]],[[9116,6865],[5,17],[5,16],[5,16],[6,22]],[[9137,6936],[6,25],[5,19]],[[9156,6852],[-7,3],[-24,7],[-9,3]],[[9066,6863],[5,16],[9,-2],[36,-12]],[[9047,6869],[-11,4],[-11,4],[3,8],[3,7],[4,14]],[[9035,6906],[5,16]],[[9040,6922],[33,-9],[8,-2],[6,16],[6,22],[9,-3],[25,-7],[10,-3]],[[9066,6863],[-9,3],[-10,3]],[[9040,6922],[2,9],[2,8],[7,22],[7,23],[5,18]],[[8990,6920],[6,15],[4,13],[1,4],[1,2],[6,19],[8,24],[6,18]],[[9035,6906],[-9,3],[-28,8],[-8,3]],[[9047,6869],[-8,-25],[-11,4],[-11,5],[-8,-20],[-41,17]],[[8968,6850],[2,7],[7,23]],[[8977,6880],[7,19],[6,21]],[[9049,6805],[-3,-8],[-9,4],[-33,14]],[[9004,6815],[-41,18],[0,1]],[[8963,6834],[5,16]],[[9074,6740],[-32,15],[-9,5],[-8,4],[-33,16]],[[8992,6780],[6,17],[6,18]],[[8950,6799],[7,17],[6,18]],[[8992,6780],[-9,-25],[-8,-22],[-9,5],[-23,11],[-9,4]],[[9008,6691],[-9,5],[-23,11],[-9,5],[-9,4],[-23,11],[-8,5]],[[9001,6670],[-8,-21],[-9,5],[-23,11],[-9,4]],[[8952,6669],[-9,5],[-23,10],[-9,5]],[[9034,6629],[-8,-23],[-9,-26],[-9,-25]],[[9008,6555],[-10,5],[-22,11],[-9,5]],[[8967,6576],[9,24],[9,26],[-9,4],[-23,12],[-9,4],[8,23]],[[8967,6576],[-9,4],[-23,11],[-10,5]],[[8925,6596],[-9,4],[-23,12],[-8,4]],[[8990,6507],[-8,-24],[-9,5],[-23,11],[-9,4]],[[8925,6596],[-8,-25],[-8,-24],[31,-15],[10,-5],[8,-4],[23,-11],[9,-5]],[[9049,6535],[-9,-25]],[[9040,6510],[-9,5],[-23,11],[-9,5],[-9,-24]],[[9008,6555],[9,-4],[13,-6],[10,-5],[9,-5]],[[9058,6419],[-2,1],[-13,7],[-8,4],[-19,9],[-16,-45],[-35,18],[-47,24]],[[9040,6510],[-8,-23],[8,-5],[23,-11],[10,-4],[2,-1]],[[9049,6535],[9,-5],[23,-11],[10,-5]],[[9032,6336],[-7,-23]],[[9025,6313],[-45,24],[-37,18],[7,18],[1,4],[-46,24]],[[9025,6313],[-10,-34],[-6,-23],[-1,-4],[-3,-10],[-3,-7]],[[9048,6191],[-1,0],[-3,-2],[-2,-1],[-2,-1],[-1,0],[0,1],[-3,1],[-2,2],[-3,1],[-3,3],[-3,2],[-3,2],[-2,3],[-1,0],[-1,1],[0,2],[-3,8],[-2,6],[-5,8],[-6,8]],[[9046,6184],[-15,-53],[-32,-108],[-9,-33],[-10,-50],[-7,-29],[-6,-29]],[[8886,5628],[-7,-20],[-28,-87],[-6,-18]],[[8845,5503],[-7,3],[2,6],[4,9],[2,6],[0,1],[4,10],[2,5],[4,13],[4,13],[3,9],[-3,2],[-1,1],[-6,3],[-15,8]],[[8838,5592],[6,9],[5,8],[6,13],[-9,5],[-8,4],[-10,5],[-9,5],[-9,5],[-13,7]],[[8797,5653],[8,20],[8,19]],[[8813,5692],[4,11],[25,69],[0,1],[16,46],[14,38]],[[8872,5857],[7,19],[1,1],[0,2],[1,2]],[[8872,5857],[-14,8],[-10,6],[-11,-27],[-19,10],[6,17],[-17,9]],[[5886,4124],[-6,3],[-16,8],[-18,8],[-12,-35],[0,-1],[0,-1],[26,-28],[-12,-16],[-13,-16]],[[5835,4046],[-18,-23]],[[5817,4023],[-14,14],[-13,15],[-14,14],[-3,3],[-12,12]],[[5761,4081],[31,41],[5,7],[13,27],[1,4],[6,16],[73,-34],[1,-1],[0,-3],[-5,-14]],[[5913,4145],[-1,-5],[-8,-24]],[[5904,4116],[-18,8]],[[5761,4081],[-13,14],[-30,31],[-3,3],[-16,18]],[[5699,4147],[-27,27],[-3,8]],[[5669,4182],[-1,14]],[[5668,4196],[22,5],[28,2],[23,1],[26,-2],[11,-1],[10,-2]],[[5788,4199],[5,-2],[15,-5],[3,-1],[5,-2],[36,-14],[1,-1],[8,-4],[52,-24],[0,-1]],[[5682,3982],[-61,63]],[[5621,4045],[11,15],[13,17]],[[5645,4077],[11,13],[10,14],[6,7]],[[5672,4111],[5,7],[9,12],[2,2],[11,15]],[[5761,4081],[-14,-17],[-14,-18],[-13,-18],[-26,-33],[-6,-7],[-6,-6]],[[5672,4111],[-15,15],[-11,-15],[-2,-1],[-2,1],[-27,29],[-4,16],[18,9],[19,8],[21,9]],[[5645,4077],[-2,2],[-58,62],[-4,-2],[-13,-12],[-11,11],[-3,4]],[[5554,4142],[61,35],[23,10],[26,8],[4,1]],[[5621,4045],[-66,69]],[[5555,4114],[-13,15],[-6,2]],[[5536,4131],[18,11]],[[8278,6087],[-9,-6],[-5,1],[-25,-10]],[[8169,6240],[2,-1],[15,-5]],[[8186,6234],[-1,-3],[0,-5],[10,-28],[9,4],[33,-13],[-11,-30],[14,-12],[5,-4],[1,-2],[1,-3],[0,-5],[0,-20]],[[8186,6234],[72,-29],[3,-1],[2,-1],[16,-6],[11,-6],[2,-2]],[[8195,6317],[72,-40],[9,21]],[[8276,6298],[45,-25],[8,21],[7,20],[7,21],[10,-5],[11,-6],[3,-2]],[[8211,6358],[73,-40]],[[8284,6318],[-8,-20]],[[8292,6339],[-8,-21]],[[8218,6378],[74,-39]],[[8234,6413],[70,-43]],[[8304,6370],[-4,-11],[-8,-20]],[[8332,6434],[-1,-3],[-6,-14],[-8,-20],[35,-19],[-9,-18],[-34,18],[-5,-8]],[[8371,6333],[-3,2],[-64,35]],[[6019,3434],[-11,10],[-6,20],[-12,-13],[-13,13]],[[5977,3464],[-4,5],[-5,2],[-6,7]],[[5962,3478],[12,16],[13,17]],[[5987,3511],[18,24],[16,21],[2,2]],[[6023,3558],[7,-6],[5,-8],[17,-18],[5,-4],[8,-7],[4,-2],[5,-4]],[[6074,3509],[-2,-2],[-15,-26],[-31,-39],[-7,-8]],[[7432,5545],[50,-36]],[[7459,5596],[12,-8],[30,-22],[5,-5],[3,0],[5,0]],[[7471,5617],[9,17],[8,14],[1,4]],[[7489,5652],[2,4]],[[7363,5696],[10,17]],[[7373,5713],[9,17]],[[7382,5730],[54,-39]],[[7436,5691],[53,-39]],[[7436,5691],[10,20],[6,10],[-54,39]],[[7398,5760],[8,11]],[[7382,5730],[10,20]],[[7392,5750],[4,7],[2,3]],[[7392,5750],[-9,6],[-1,0],[-17,12],[-16,12],[-8,6],[-2,3]],[[7339,5789],[3,7],[8,15]],[[7373,5713],[-54,39],[9,17]],[[7328,5769],[11,20]],[[7242,5785],[9,17],[9,17]],[[7260,5819],[68,-50]],[[7260,5819],[12,22],[10,18]],[[7282,5859],[16,-11]],[[7298,5848],[52,-37]],[[7298,5848],[18,32],[9,18],[25,-18]],[[7350,5880],[-2,-6],[-1,-18],[-2,-14],[-6,-12],[16,-11]],[[7282,5859],[5,9]],[[7287,5868],[13,26],[18,33]],[[7318,5927],[26,-17],[16,-12]],[[7360,5898],[-10,-18]],[[7360,5898],[8,-8],[13,-16],[11,-18]],[[7366,5916],[8,-5],[6,-4]],[[7380,5907],[15,-18],[22,-38]],[[7417,5851],[-14,-13]],[[7360,5898],[4,9],[2,9]],[[7392,5923],[13,-15],[10,-16],[16,-27]],[[7431,5865],[-5,-7],[-9,-7]],[[7380,5907],[3,7],[1,10],[8,-1]],[[7392,5923],[19,34]],[[7411,5957],[22,-17],[16,-11]],[[7449,5929],[-4,-10],[-3,-12],[-1,-15],[-4,-16],[-6,-11]],[[7366,5916],[0,7],[-2,8],[0,6],[0,7],[2,6],[3,7]],[[7369,5957],[12,22]],[[7381,5979],[15,-11],[15,-11]],[[7381,5979],[22,42],[10,14],[9,7],[2,2]],[[7424,6044],[3,-2],[12,-10],[6,-6],[5,-7],[4,-6],[3,-8],[3,-10],[2,-16]],[[7462,5979],[3,-28],[1,-7],[2,-10],[1,-3],[-3,-1],[-6,-3],[-5,-1],[-6,3]],[[7369,5957],[-17,13],[10,19],[-1,5],[-18,14]],[[7343,6008],[14,9],[10,18],[9,17],[10,17],[1,2]],[[7387,6071],[16,-12],[18,-13],[3,-2]],[[7490,6111],[9,-20]],[[7499,6091],[-54,-34],[-21,-13]],[[7387,6071],[13,24]],[[7400,6095],[16,-13],[11,22],[5,8],[9,16],[4,1],[22,-16],[5,-13],[18,11]],[[7400,6095],[11,20],[-15,11],[14,26],[-1,5],[-13,9],[7,20]],[[7403,6186],[33,-25],[16,-12],[18,-13]],[[7470,6136],[12,-9],[8,-16]],[[7387,6071],[-78,59]],[[7357,6213],[11,8],[13,7],[12,6],[8,8]],[[7401,6242],[15,17],[15,16]],[[7431,6275],[6,-7],[2,-9],[-2,-12],[-24,-43]],[[7413,6204],[-10,-18]],[[7546,6172],[-48,-29],[-18,13],[-10,-20]],[[7413,6204],[17,-12],[16,-13],[29,53],[16,-12],[16,-13],[10,-7],[10,9],[10,-19],[9,-18]],[[7565,6184],[-3,-2],[-16,-10]],[[7431,6275],[29,32]],[[7460,6307],[7,7],[9,-11],[3,-7],[9,-16],[8,-12],[15,-20],[12,9],[3,3]],[[7583,6144],[-3,-2],[-16,-10],[-65,-41]],[[7520,5979],[-8,5],[-8,3],[-22,-5]],[[7482,5982],[-20,-3]],[[7572,6044],[-4,-5],[-7,-4],[-4,-3],[-9,-7],[-8,-9],[-9,-14],[-11,-23]],[[7562,5946],[-11,9]],[[7551,5955],[-17,12],[-14,12]],[[7534,5912],[-46,35],[-2,12],[-4,23]],[[7551,5955],[-11,-20],[-6,-23]],[[7587,5836],[-65,48]],[[7522,5884],[8,16],[4,12]],[[7471,5822],[31,25],[9,17],[1,2],[10,18]],[[8458,6764],[4,22],[6,20],[5,19]],[[8473,6825],[7,20]],[[8613,6778],[-1,-2],[-3,-9],[-1,-2],[0,-2],[-6,-22],[-1,-3]],[[8601,6738],[-2,1],[-36,9],[-35,7]],[[8528,6755],[-25,5],[-45,4]],[[8521,6693],[-17,2]],[[8504,6695],[2,33],[0,3],[2,0],[12,-1],[3,-1],[5,26]],[[8601,6738],[0,-2],[-4,-23]],[[8597,6713],[-3,0],[-32,8],[-3,1],[0,-3],[-2,-27],[-15,4],[-17,1],[-4,-4]],[[8513,6626],[5,25],[2,26],[1,16]],[[8597,6713],[0,-4],[-3,-35],[-1,-17],[-2,-14],[0,-3],[-1,-3],[-2,-13],[-4,-19]],[[8584,6605],[-2,0],[-17,5],[-17,5],[-18,6],[-17,5]],[[8736,6670],[-8,-11],[-50,38],[-16,-44],[55,-26],[0,-3],[0,-3],[2,-11],[-11,-24],[-38,15],[-38,20],[-12,-53],[3,-10]],[[8623,6558],[-3,1],[-7,3],[-2,1],[-6,3],[-9,2],[-2,0],[-17,6]],[[8577,6574],[4,16],[3,15]],[[8597,6713],[14,-4],[3,-1],[2,-1],[15,-4],[3,-2],[15,-5],[1,15],[3,17]],[[8653,6728],[16,-10],[18,-12],[18,-13],[17,-12],[14,-11]],[[8631,6817],[14,-10],[14,-11],[8,-6],[8,-5]],[[8675,6785],[-2,-3],[-7,-15],[-6,-14],[-3,-10],[-4,-15]],[[7460,6307],[-13,15],[-17,-18],[-13,10],[4,10],[8,8],[-46,34],[-5,3],[-7,0],[-6,-2],[-4,-4],[-4,-5],[-6,-11],[-16,11]],[[7416,6399],[17,-12],[15,-12],[2,-1],[10,-8],[5,-5],[5,-6],[4,-6],[6,-8],[2,-4],[2,-3],[11,-19]],[[7322,4905],[-56,41]],[[7266,4946],[5,9],[6,10],[56,-42]],[[7333,4923],[-6,-9],[-5,-9]],[[7312,4885],[-56,41],[-25,18]],[[7231,4944],[7,10],[5,9]],[[7243,4963],[23,-17]],[[7322,4905],[-4,-10],[-6,-10]],[[7301,4864],[-56,42],[-25,18]],[[7220,4924],[5,9],[6,11]],[[7312,4885],[-6,-11],[-5,-10]],[[7290,4844],[-56,42],[-25,18]],[[7209,4904],[6,10],[5,10]],[[7301,4864],[-5,-9],[-6,-11]],[[7290,4844],[-10,-18]],[[7280,4826],[-10,7],[-47,34],[-15,12],[-9,6]],[[7199,4885],[5,10],[5,9]],[[7280,4826],[-10,-19]],[[7270,4807],[-10,7],[-72,54]],[[7188,4868],[11,17]],[[7178,4851],[5,8],[5,9]],[[7270,4807],[-5,-8],[-4,-9]],[[7261,4790],[-83,61]],[[7169,4833],[5,10],[4,8]],[[7261,4790],[-5,-8],[-4,-9]],[[7252,4773],[-83,60]],[[7252,4773],[-6,-11],[-6,-11],[-51,37],[-32,23]],[[7157,4811],[6,12],[6,10]],[[7252,4773],[31,-24],[2,0],[-6,-12],[-7,-11],[-6,-11],[-5,-11]],[[7261,4704],[-33,25]],[[7228,4729],[-82,60]],[[7146,4789],[6,12],[5,10]],[[7214,4704],[-82,60]],[[7132,4764],[7,14],[7,11]],[[7228,4729],[-7,-12],[-7,-13]],[[7200,4678],[-63,46],[-19,14]],[[7118,4738],[14,26]],[[7214,4704],[-8,-14],[-6,-12]],[[7200,4678],[-9,-17],[-23,16],[-6,-10]],[[7162,4667],[-58,44]],[[7104,4711],[5,11],[9,16]],[[7151,4646],[-18,14],[-2,-4],[-2,-9],[-5,-13]],[[7124,4634],[-16,8],[-27,12],[-2,3]],[[7079,4657],[2,1],[5,17],[0,2]],[[7086,4677],[6,14],[6,11],[6,9]],[[7162,4667],[-5,-10],[-6,-11]],[[7133,4610],[-57,26]],[[7076,4636],[2,9],[1,8],[0,4]],[[7124,4634],[9,-4],[7,-4],[-4,-9],[-3,-7]],[[7125,4591],[-55,26]],[[7070,4617],[3,10],[3,9]],[[7133,4610],[-2,-3],[-3,-6],[-3,-10]],[[7118,4571],[-10,4],[-45,22]],[[7063,4597],[4,12],[3,8]],[[7125,4591],[-3,-9],[-4,-11]],[[6952,4806],[-42,23]],[[6910,4829],[-36,18],[-7,4]],[[6899,4876],[24,-13],[14,-7],[14,-8],[14,-7]],[[6965,4841],[-3,-9],[-3,-8],[-3,-9],[-4,-9]],[[6933,4749],[-21,10],[-9,4]],[[6903,4763],[-10,4],[-4,3]],[[6889,4770],[4,10],[3,9],[3,8],[3,9],[4,11],[4,12]],[[6952,4806],[-3,-9],[-4,-11],[-3,-8],[-3,-9],[-3,-9],[-3,-11]],[[6889,4770],[-38,18],[-5,2]],[[6846,4790],[4,10],[3,9],[3,9],[3,9],[4,11],[4,13]],[[6889,4724],[-9,5],[-43,20],[-9,5]],[[6828,4754],[7,19],[6,19]],[[6841,4792],[5,-2]],[[6903,4763],[-7,-19],[-7,-20]],[[6876,4687],[-61,29]],[[6815,4716],[4,11],[2,9],[7,18]],[[6889,4724],[-3,-10],[-3,-8],[-3,-8],[-4,-11]],[[6861,4644],[-61,29]],[[6800,4673],[3,10],[4,9],[3,11],[5,13]],[[6876,4687],[-4,-13],[-4,-12],[-4,-9],[-3,-9]],[[6846,4603],[-61,29]],[[6785,4632],[4,11],[4,10]],[[6793,4653],[3,10],[4,10]],[[6861,4644],[-4,-10],[-3,-10],[-4,-10],[-4,-11]],[[6834,4567],[-61,29]],[[6773,4596],[6,18],[3,9],[3,9]],[[6846,4603],[-3,-9],[-3,-9],[-6,-18]],[[6898,4536],[-2,1],[-62,30]],[[6846,4603],[64,-30]],[[6910,4573],[-4,-10],[-3,-8],[-2,-5],[1,-3],[-4,-11]],[[6861,4644],[32,-15],[31,-15]],[[6924,4614],[-4,-10],[-3,-10],[-3,-10],[-4,-11]],[[6876,4687],[63,-31]],[[6939,4656],[-5,-12],[-3,-11],[-4,-10],[-3,-9]],[[6889,4724],[10,-4],[45,-21],[9,-4]],[[6953,4695],[-4,-10],[-3,-8],[-3,-9],[-4,-12]],[[6933,4749],[26,-12],[10,-5]],[[6969,4732],[-9,-18],[-7,-19]],[[7014,4666],[-10,5],[-39,18],[-2,1],[-10,5]],[[6969,4732],[10,-5],[1,0],[18,-8],[19,-9]],[[7017,4710],[10,-5]],[[7027,4705],[-6,-20],[-7,-19]],[[7000,4627],[-61,29]],[[7014,4666],[-3,-10],[-4,-9]],[[7007,4647],[-3,-9],[-4,-11]],[[6985,4584],[-61,30]],[[7000,4627],[-4,-12],[-4,-12]],[[6992,4603],[-3,-9],[-4,-10]],[[6971,4543],[-23,11],[-16,8],[-22,11]],[[6985,4584],[-3,-9],[-4,-10],[-3,-10],[-4,-12]],[[6971,4543],[-3,-9],[-3,-8],[-7,-19]],[[6862,4436],[-64,30],[-4,3],[-17,9],[-38,18],[6,18],[6,18],[6,18],[6,18],[61,-30],[3,10],[6,15],[1,4]],[[6830,4348],[-66,18]],[[6764,4366],[-10,3],[-51,15],[-39,10],[-49,13],[-4,1],[-2,1]],[[6609,4409],[2,4]],[[6611,4413],[23,62],[13,32],[2,4],[3,8]],[[6652,4519],[15,41],[7,17],[10,27],[2,3],[0,1],[2,5],[12,31]],[[6700,4644],[1,-1],[2,-2],[1,-1],[2,-3],[3,-9],[1,-1],[1,-2],[2,-1],[2,-1],[1,-1],[3,0],[14,-7],[22,-10],[18,-9]],[[6652,4519],[-3,1],[-3,2]],[[6646,4522],[1,3],[6,18],[7,18],[-9,4],[-11,5],[-38,19]],[[6702,4649],[-1,-3],[-1,-2]],[[6646,4522],[-8,4],[-46,22],[-4,2]],[[6588,4550],[4,11],[3,9],[4,10],[3,9]],[[6575,4513],[3,9],[3,9],[4,10],[3,9]],[[6646,4522],[-8,-18],[-7,-18],[-7,3],[-2,1],[-43,20],[-4,3]],[[6568,4493],[-62,30]],[[6506,4523],[7,19],[6,19]],[[6519,4561],[7,18],[7,21],[7,18]],[[6575,4513],[-4,-10],[-3,-10]],[[6569,2685],[-2,0],[-35,5],[-47,5]],[[6496,2522],[-17,12],[17,31],[8,18],[2,15],[-1,18],[-20,-3],[-4,24],[-6,0],[-20,-3],[-21,-5]],[[6402,2406],[-1,148]],[[7401,6242],[-17,-2],[-90,68]],[[7343,6008],[-10,-4],[-15,-3],[-36,0]],[[7318,5927],[-12,10],[-10,12],[-5,7],[-4,10]],[[7287,5966],[-2,8],[-1,5],[-2,22]],[[7259,5922],[-15,11],[-16,12]],[[7287,5966],[-5,-1],[-23,-43]],[[7287,5868],[-23,17],[-1,6],[6,11],[6,8],[-16,12]],[[7282,5859],[-41,32],[-13,10]],[[7228,5901],[-14,11],[-14,10]],[[7228,5901],[-3,-7],[-4,-7],[-2,-3],[-2,-4],[-1,-4],[-4,-6]],[[7212,5870],[-14,9],[-13,10]],[[7185,5889],[-13,10],[-7,4],[-7,5]],[[7187,5824],[-13,10],[-13,10]],[[7161,5844],[4,8],[20,37]],[[7212,5870],[-6,-12],[-9,-17],[-10,-17]],[[7161,5844],[-13,9],[-14,10]],[[7532,5214],[1,-5],[-14,0],[-6,-11],[-12,-18],[-5,-10]],[[7496,5170],[-58,40],[-5,-8],[-4,-7],[-4,-8],[-4,-8]],[[7421,5179],[-20,14]],[[7401,5193],[13,21],[11,20],[-9,7],[-41,30],[-3,2]],[[7478,5254],[15,-11],[15,-11],[24,-18]],[[7401,5193],[-8,6],[-7,5]],[[7386,5204],[-33,25],[-7,4]],[[7354,5145],[-46,33],[10,20],[-5,3],[-4,3],[-2,2],[-1,1],[-3,2],[-38,28]],[[7265,5237],[10,19]],[[7386,5204],[-11,-21],[-11,-19],[-10,-19]],[[7354,5145],[-11,-21]],[[7343,5124],[-46,34]],[[7297,5158],[-9,6],[-5,5],[-4,4],[-1,2]],[[7278,5175],[-3,4]],[[7275,5179],[-1,3],[-2,2],[-1,2],[-2,2],[-3,3],[-6,5],[-8,6],[-5,1],[7,14],[11,20]],[[7389,5090],[-11,-19]],[[7378,5071],[-8,6],[-38,28],[-10,-20],[-46,34]],[[7276,5119],[11,19],[10,20]],[[7343,5124],[37,-28],[9,-6]],[[7276,5119],[-11,-20]],[[7265,5099],[-37,28],[-3,2],[-1,0],[-1,0],[4,7],[14,12],[17,12],[15,10],[0,3],[5,2]],[[7378,5071],[-10,-20],[-11,-19],[-9,-17],[-9,-18]],[[7339,4997],[-9,6],[-29,22],[-8,6]],[[7293,5031],[-9,6],[-29,21],[-8,6]],[[7247,5064],[9,18],[9,17]],[[7274,4996],[-43,31]],[[7231,5027],[5,9],[5,9],[-3,2],[9,17]],[[7293,5031],[-10,-18],[-4,-8],[-5,-9]],[[7344,4944],[-57,42],[-13,10]],[[7339,4997],[-10,-17],[9,-7],[15,-12]],[[7353,4961],[-4,-8],[-5,-9]],[[7344,4944],[-6,-10],[-5,-11]],[[7243,4963],[8,8],[7,7],[9,9],[7,9]],[[6352,1008],[-1,-19]],[[6351,989],[-19,0],[1,46],[-2,5],[-24,-16],[-20,-13],[-18,-14],[6,-9],[-1,-23],[-7,-1],[-1,-26]],[[6211,879],[-2,78]],[[6209,957],[2,8]],[[6211,965],[5,3],[15,11],[22,15],[19,14],[18,15],[22,15],[16,11],[19,18],[28,30],[30,23]],[[6405,1120],[0,-13]],[[6405,1107],[-5,-2],[-15,-23]],[[6385,1082],[-4,-4],[-29,-22],[0,-11],[0,-25],[0,-12]],[[6211,966],[4,23]],[[6215,989],[4,3],[2,-1],[1,-2],[1,-4],[0,-3],[-1,-3],[-2,-3],[-2,-3],[-3,-4],[-4,-3]],[[6351,989],[2,-77]],[[6353,912],[-20,0],[-1,41],[-16,0],[-2,-1],[-1,-1],[-1,-3],[0,-9]],[[6353,912],[0,-77]],[[6180,4293],[-2,1],[-1,1],[-41,19]],[[6101,4396],[7,-28],[18,7]],[[6176,4336],[7,17],[1,3],[-1,12],[18,-3],[3,0]],[[6204,4365],[-1,-8],[-3,-9],[-15,-42],[-5,-13]],[[6024,4170],[-8,-3]],[[6016,4167],[-36,-4],[-35,16],[-12,-3],[-7,4],[-2,1]],[[5924,4181],[3,8]],[[5927,4189],[8,23]],[[5935,4212],[3,-1],[17,-8],[17,-8],[1,1],[1,1],[4,9],[4,5],[5,6],[9,5],[12,5],[9,3],[8,-14]],[[6025,4216],[-5,-5],[-4,-6],[-4,-9],[-5,-16],[0,-2],[1,0],[16,-8]],[[7110,4547],[-9,4],[-47,22]],[[7054,4573],[5,12],[4,12]],[[7118,4571],[-5,-13],[-3,-11]],[[7103,4528],[-55,26]],[[7048,4554],[3,10],[3,9]],[[7110,4547],[-4,-10],[-3,-9]],[[7091,4486],[-18,8],[-40,20]],[[7033,4514],[4,11],[4,10],[4,10],[3,9]],[[7103,4528],[-3,-10],[-3,-10],[-3,-11],[-3,-11]],[[7020,4476],[4,11],[3,9],[3,9],[3,9]],[[7091,4486],[-7,-18],[-7,-19]],[[6971,4543],[62,-29]],[[6985,4584],[63,-30]],[[6992,4603],[62,-30]],[[7000,4627],[63,-30]],[[7007,4647],[63,-30]],[[7014,4666],[9,-5],[38,-17],[8,-4],[7,-4]],[[7027,4705],[9,-5],[38,-17],[12,-6]],[[7017,4710],[3,8],[4,9],[5,9],[5,8],[4,8]],[[7038,4752],[23,-16],[3,-1],[2,-2],[3,0],[8,-2],[2,-1],[10,-7],[15,-12]],[[7038,4752],[5,9],[4,8],[4,8],[4,7],[39,-28],[2,-1],[7,-5],[15,-12]],[[7038,4752],[-42,31]],[[6996,4783],[4,9],[5,8],[4,7],[4,9],[1,0],[2,3],[0,2],[1,3],[4,4],[6,6],[2,3],[3,3]],[[7032,4840],[2,-2],[3,-2],[75,-55],[5,-6],[15,-11]],[[6969,4732],[5,10],[4,8],[4,8],[5,9],[4,8],[5,8]],[[6952,4806],[44,-23]],[[6965,4841],[4,8],[3,9],[8,15],[2,4]],[[6728,821],[50,-10]],[[6778,811],[25,-6],[50,-12],[41,-9],[99,-23],[15,0],[7,2],[13,3],[7,3],[4,3],[1,2]],[[7040,774],[13,-10]],[[5536,4131],[-20,6],[-20,21],[-2,14]],[[5494,4172],[14,17]],[[5508,4189],[46,-47]],[[5536,4131],[-40,-24]],[[5496,4107],[-2,1],[-15,12],[-8,9],[14,9],[-3,17]],[[5482,4155],[12,17]],[[5382,4039],[-2,-1]],[[5380,4038],[-7,7],[-3,5],[-11,12]],[[5359,4062],[3,2],[4,-1],[8,-7],[3,-1],[9,6],[18,11]],[[5404,4072],[14,8],[15,12],[14,18]],[[5447,4110],[35,45]],[[5496,4107],[-2,-1],[-12,-7],[-13,-8],[-87,-52]],[[5585,3901],[8,8]],[[5593,3909],[20,-21],[40,-41],[16,-17]],[[5669,3830],[-15,-19]],[[5654,3811],[-77,81]],[[5577,3892],[8,9]],[[5593,3909],[9,7],[27,21]],[[5629,3937],[39,-40],[1,-3],[9,-47],[-1,-4],[-2,-5],[-6,-8]],[[5668,3680],[-3,3],[-43,45],[-23,24],[-20,20],[-53,54]],[[5526,3826],[4,3],[11,13],[13,17],[1,4]],[[5555,3863],[15,20],[7,9]],[[5654,3811],[-23,-30],[54,-58]],[[5685,3723],[7,-7],[1,-2],[-25,-34]],[[5654,3811],[54,-56]],[[5708,3755],[-23,-32]],[[5692,3654],[-24,26]],[[5708,3755],[56,-58]],[[5764,3697],[-13,-18],[-1,-2],[-3,-3],[-7,-8],[-48,-12]],[[5724,3527],[-15,16],[-3,5],[-26,26],[-12,-16],[-13,-16],[-13,-19],[-13,-18]],[[5629,3505],[-15,15]],[[5614,3520],[-13,14]],[[5601,3534],[89,117],[2,3]],[[5692,3654],[64,-66],[7,-7],[2,-3]],[[5765,3578],[-2,-2],[-14,-18],[-3,-1],[-10,-15],[-12,-15]],[[5689,3476],[-14,-18]],[[5675,3458],[-4,2],[-14,15]],[[5657,3475],[-28,30]],[[5724,3527],[0,-3],[-35,-48]],[[5756,3465],[-8,8],[-20,22],[-6,-19],[-13,-17],[-3,-1],[-17,18]],[[5765,3578],[12,-12],[7,-7],[25,-26]],[[5809,3533],[-2,-3],[-16,-20],[-11,-15],[-11,-15],[-13,-15]],[[5812,3408],[-11,-15],[-15,-18],[-14,-18]],[[5772,3357],[-14,15],[-15,15],[-33,35]],[[5710,3422],[-35,36]],[[5756,3465],[7,-7],[5,-5],[14,-14],[16,-15],[14,-16]],[[5866,3352],[-17,18],[-16,16],[-3,3],[-2,3],[-16,16]],[[5809,3533],[40,-42]],[[5849,3491],[33,-34],[15,-16],[11,-10],[10,-7],[2,-2]],[[5920,3422],[-2,-2],[-18,-23]],[[5900,3397],[-11,-14],[-12,-15],[-11,-16]],[[6611,4413],[-2,1],[-1,0],[-3,1],[-3,0],[0,1],[-1,2],[0,1],[0,2],[2,2],[2,3],[-52,26],[4,13],[4,9],[3,10],[4,9]],[[6609,4409],[-3,0],[-3,1],[-5,2],[-35,10],[-39,11],[-45,10]],[[6479,4443],[1,4],[3,10],[9,25],[4,12],[4,10],[3,10],[3,9]],[[6478,4648],[-3,-9],[-4,-9],[-7,-22],[-6,-17]],[[6458,4591],[-7,-18],[-6,-20],[61,-30]],[[6479,4443],[-40,7],[-29,7],[-3,1],[-63,22],[-34,12],[-9,3]],[[6458,4591],[61,-30]],[[7555,912],[-65,18]],[[5962,3478],[-36,37],[-33,33]],[[5893,3548],[13,17],[12,17],[20,23]],[[5938,3605],[31,-33],[-18,-24],[36,-37]],[[5938,3605],[16,21],[2,2],[14,17],[10,12]],[[5980,3657],[67,-69]],[[6047,3588],[-10,-12],[-14,-18]],[[5980,3657],[9,12]],[[5989,3669],[7,9],[14,17]],[[6114,3594],[-8,0],[-12,-17],[-15,-22],[-6,5],[-26,28]],[[5894,3747],[43,-46],[9,12],[43,-44]],[[5938,3605],[-42,43]],[[5896,3648],[-20,22],[-1,1],[-2,0],[-1,1],[-5,6]],[[5867,3678],[12,13],[2,5],[2,2],[3,2],[-16,17],[14,17],[10,13]],[[5865,3512],[-40,41],[14,19]],[[5839,3572],[14,18],[12,17],[13,17],[18,24]],[[5893,3548],[-15,-18],[-13,-18]],[[5839,3572],[-22,23],[14,18],[-3,2],[-5,6],[-14,15],[6,8],[7,9],[7,9]],[[5829,3662],[5,7],[18,24],[15,-15]],[[5764,3697],[14,18]],[[5778,3715],[49,-50],[2,-3]],[[5865,3512],[-12,-16],[-4,-5]],[[5962,3478],[-15,-19],[-14,-19],[-13,-18]],[[6222,3365],[-1,2],[-1,1],[-1,2],[-2,2],[-1,1],[-1,2],[-2,1],[-2,2],[-2,1],[0,1],[-3,2],[-1,1],[-1,0],[-2,1],[-1,1],[-2,1],[-2,1],[-2,0],[-5,4],[0,1],[-2,1],[-1,1],[-1,1],[-2,1],[-1,1],[-2,3],[-1,2],[-2,3],[-3,3],[-4,4],[-5,7],[-35,37],[-22,21],[-3,4],[-32,28]],[[6122,3588],[14,-12],[12,-9],[14,-7],[15,-8]],[[6177,3552],[34,-19],[13,-6],[16,-9],[19,-10],[3,-1],[2,-2],[4,-1]],[[6268,3504],[-3,-6],[-3,-10],[-8,-22],[-6,-18],[-12,-31],[0,-1],[-2,-4],[-1,-4],[-1,-1],[-1,-3],[-1,-3],[0,-1],[-2,-7],[-1,-2],[-1,-3],[-1,-6],[0,-1],[-1,-4],[0,-3],[-1,-5],[-1,-4]],[[6323,3388],[-4,-40],[-11,-24],[-22,-4],[-6,-11],[-1,-49],[5,-6]],[[6284,3254],[1,-6],[-1,-6],[1,-6],[2,-8],[-25,-25],[26,-26],[49,-54],[46,-49]],[[5977,2710],[-9,13],[-10,9],[-14,15],[-89,100],[-52,48],[-3,2],[3,2],[4,2],[5,3],[2,1],[5,3],[7,4],[3,2],[5,3],[20,10],[8,5],[3,2],[7,4],[3,2],[3,2],[1,1],[5,4],[1,1],[2,1],[7,6],[20,24],[8,11],[11,16],[8,10],[7,8],[13,17],[4,6],[8,9],[2,3],[11,14],[8,12],[21,26],[11,12],[10,10],[6,8],[2,2],[1,1],[0,2],[1,2],[0,3]],[[6046,3151],[15,20],[1,1],[11,14],[2,3],[34,44],[14,19],[12,15],[4,7],[4,6],[4,5],[1,1],[4,5],[5,6],[3,5],[4,5],[2,3],[2,1],[0,1],[3,4],[4,3],[4,3],[3,2],[2,1],[4,2],[2,1],[5,1],[4,1],[6,0],[1,0],[2,3],[2,3],[2,4],[1,0],[1,3],[2,3],[2,6],[2,4],[1,3],[1,4],[0,2]],[[6512,3265],[-25,-6],[-45,-11],[-14,-4],[-54,-13]],[[6374,3231],[-6,-2],[-19,-4],[-19,-6],[-10,-2],[-10,10],[-17,17],[-9,10]],[[6374,3231],[3,-3],[4,-3],[5,-6],[13,-15],[9,-9],[9,-8],[29,-30]],[[6607,3102],[-19,14],[-25,-46],[19,-14],[20,-16]],[[6636,3157],[-2,-4],[-27,-51]],[[6627,3087],[-25,-47]],[[6607,3102],[20,-15]],[[6657,3142],[-30,-55]],[[6296,2451],[13,25]],[[6334,2524],[13,24]],[[6347,2548],[0,1],[0,1],[0,1],[4,7],[4,7],[2,1],[1,-1],[1,-1],[-1,-2],[-3,-6],[7,2],[3,6],[-6,7],[4,10]],[[6192,2521],[6,-4],[52,-35],[16,-10],[4,-3],[26,-18]],[[6155,2125],[-67,43]],[[6195,2210],[-16,-36],[-8,-15],[-9,-17],[-7,-17]],[[6215,2087],[-60,38]],[[6179,2009],[-60,38]],[[6119,2047],[8,18],[8,18],[9,18],[11,24]],[[6119,2047],[-45,29],[-15,8]],[[6076,1955],[-59,38]],[[6119,2047],[-8,-18],[-9,-19],[-8,-18],[-9,-18],[-9,-19]],[[6117,1876],[-59,38]],[[6058,1914],[9,20],[9,21]],[[6171,1991],[-10,-20],[-8,-17],[-8,-18],[-9,-20],[-9,-19],[-10,-21]],[[6058,1914],[-9,-18],[-8,-18],[-60,38]],[[6108,1858],[-8,-19],[-9,-20],[-10,-22],[39,-26],[2,-3]],[[6122,1768],[-10,-14],[-14,-21],[-19,-21],[-18,-17],[-20,-14],[-17,-8],[-1,-1]],[[6117,1876],[-9,-18]],[[6170,1839],[-48,-71]],[[6108,1858],[43,-25],[11,15],[1,-3],[7,-6]],[[6230,1931],[-2,-3],[-1,-2],[-57,-87]],[[6301,1836],[-26,18],[-32,19],[-12,-8],[-14,-6],[-31,-14],[4,-4],[26,-17],[14,-9],[13,-9],[43,-28],[13,-8],[6,-3],[8,17],[8,16],[4,9],[1,1]],[[6326,1810],[27,-18],[9,-5],[-6,-9]],[[6356,1778],[-17,-30],[-5,-10],[-159,101],[-3,-10],[-9,-16]],[[6331,1865],[-1,-3],[-3,-6],[-3,-2],[-5,-3],[-4,0],[-14,-15]],[[6301,1836],[-4,-5],[-2,-2],[31,-19]],[[6367,1771],[-11,7]],[[6886,3478],[-19,13]],[[6867,3491],[20,33],[26,47]],[[6867,3491],[-18,-32]],[[6849,3459],[-19,14]],[[6830,3473],[65,117]],[[6720,3393],[56,101],[8,17]],[[6784,3511],[63,116]],[[6830,3473],[-10,-20],[-51,-96]],[[6849,3459],[-11,-19]],[[6886,3478],[-28,-53]],[[6858,3425],[-20,15]],[[6858,3425],[-16,-33]],[[6975,953],[-17,7],[-18,6]],[[6940,966],[-5,3],[-7,1],[-4,-3],[-4,-5],[-14,-49],[-13,-22]],[[6893,891],[-10,9],[-13,9],[-11,9],[-8,7]],[[6851,925],[-4,3],[-18,15]],[[6984,983],[-1,-4],[-8,-26]],[[6959,897],[-7,-21]],[[6952,876],[-15,12],[-16,13],[19,65]],[[6975,953],[-16,-56]],[[6952,876],[-13,-22]],[[6939,854],[-10,8],[-10,8]],[[6919,870],[-8,7],[-18,14]],[[5935,4212],[2,8],[2,4],[3,4],[4,7],[4,6],[2,3],[4,4],[6,6],[13,10]],[[5975,4264],[30,11],[19,4],[10,1],[12,1]],[[6046,4281],[0,-3],[0,-10],[3,-10],[6,-15]],[[6055,4243],[-16,-13],[-14,-14]],[[6124,4232],[-13,-36]],[[6111,4196],[-3,1],[-9,5],[-7,4],[-6,3],[-8,6],[-5,4],[-8,9],[-5,6],[-5,9]],[[6046,4281],[14,0],[4,0],[9,-1],[14,-3]],[[6087,4277],[12,-4],[13,-6],[7,-3],[3,-1],[2,-2],[2,-2],[1,-3],[1,-3],[1,-2],[-1,-5],[-4,-14]],[[6146,4200],[-1,-4],[-3,-9],[-5,-14],[-8,-21]],[[6129,4152],[-3,1],[-26,14]],[[6100,4167],[11,29]],[[6124,4232],[18,-8]],[[6142,4224],[1,-4],[7,3],[5,17],[4,2],[-15,-41],[2,-1]],[[6094,4060],[0,1],[11,29],[2,4]],[[6107,4094],[22,58]],[[6146,4200],[11,-6],[11,-5]],[[6168,4189],[22,-10]],[[6190,4179],[-1,-4],[-2,-6],[-9,-24],[-10,-31],[-8,-22],[-8,-27],[0,-40]],[[6107,4094],[-3,2],[-39,18]],[[6065,4114],[4,8],[3,5],[3,6],[7,8]],[[6082,4141],[15,20],[3,6]],[[6065,4114],[-2,1],[-47,52]],[[6024,4170],[36,-17],[16,-8],[3,-2],[3,-2]],[[6094,4060],[-2,1],[-8,3],[-117,55],[-37,18],[-17,8]],[[5913,4145],[6,23],[4,9],[1,4]],[[6083,4031],[-7,-19],[-14,-33],[0,-1],[-7,-18],[-7,-17]],[[6048,3943],[-4,1],[-42,44]],[[6002,3988],[11,15]],[[6013,4003],[11,15],[18,-18],[15,44],[5,16],[-2,2],[-79,37],[-35,16],[-1,0],[-1,-2],[-5,-14]],[[5939,4099],[-18,8]],[[5921,4107],[-17,9]],[[6013,4003],[-47,49],[-1,2],[0,2],[10,26],[-18,9],[-18,8]],[[6002,3988],[-12,-15]],[[5990,3973],[-57,60]],[[5933,4033],[-15,15],[-5,6],[-10,9],[5,6],[13,38]],[[5932,3902],[-15,16],[-6,7],[-8,7]],[[5903,3932],[19,25],[-14,15],[-13,14]],[[5895,3986],[7,7],[4,5],[2,2],[12,15],[13,18]],[[5990,3973],[-14,-16],[-14,-15],[-11,-14],[-19,-26]],[[6009,3893],[-14,-18],[-3,-5],[-13,-17]],[[5979,3853],[-3,3],[-30,32],[-14,14]],[[5979,3853],[-42,-54],[-12,-16]],[[5855,3887],[14,18],[15,-15],[15,-17],[9,13],[5,4],[4,2],[5,2],[5,2],[5,6]],[[5967,3739],[-23,24],[-9,9],[-10,11]],[[5820,3769],[15,20]],[[5835,3789],[13,16]],[[5835,3789],[-54,58]],[[5781,3847],[13,16]],[[5765,3827],[16,20]],[[5669,3830],[54,-56]],[[5629,3937],[10,9]],[[5639,3946],[8,6]],[[5647,3952],[63,-66]],[[5710,3886],[55,-59]],[[5710,3886],[15,19],[56,-58]],[[5647,3952],[20,18],[15,12]],[[5682,3982],[56,-60]],[[5817,4023],[-14,-18],[-13,-18]],[[5817,4023],[56,-59],[23,-24],[7,-8]],[[5835,4046],[29,-30],[28,-29],[3,-1]],[[8740,6667],[-4,3]],[[8675,6785],[15,-11]],[[8690,6774],[24,-16],[-2,-3],[-10,-19],[18,-14],[21,-15],[4,-5],[3,-7],[0,-4],[0,-5],[0,-4],[-2,-6],[-6,-9]],[[8696,6785],[-6,-11]],[[8700,6813],[-8,-16],[-4,-8],[8,-4]],[[8737,6756],[-41,29]],[[8757,6795],[-9,-17],[-7,-15],[-4,-7]],[[5826,3300],[-17,18],[-15,16]],[[5794,3334],[-2,2],[-20,21]],[[5866,3352],[-1,-3],[-1,-3],[-33,-43],[-2,-2],[-3,-1]],[[5873,3251],[-32,34],[-15,15]],[[5900,3397],[16,-16],[15,-16],[16,-16]],[[5947,3349],[-12,-15]],[[5935,3334],[-11,-15],[-13,-15],[-24,-34],[-14,-19]],[[5842,3210],[-16,16],[-9,-3],[-6,-2],[-8,1],[-8,2],[2,-6],[2,-15],[-1,-7],[-1,-8],[-8,-10],[-15,-19]],[[5757,3177],[17,21],[1,4],[1,4],[-1,4],[-12,11],[-14,16],[15,19],[-16,18]],[[5748,3274],[36,47],[8,9],[2,4]],[[5935,3334],[43,-45],[-12,-17],[-1,-2],[-10,-12],[-11,-16]],[[5947,3349],[30,38],[2,3]],[[5979,3390],[3,0],[1,3],[4,4],[3,1],[5,3],[3,6],[4,5],[17,22]],[[6046,3151],[-4,-5],[-2,-3],[-2,2]],[[5977,3464],[-23,-31],[5,-3],[8,-5],[-11,-23],[23,-12]],[[7623,2573],[4,6],[2,3],[7,10],[12,16],[5,8]],[[7653,2616],[19,26]],[[7672,2642],[5,8],[3,4],[2,3],[6,9]],[[7672,2642],[-20,15],[-18,14],[16,23]],[[7682,2740],[-64,46]],[[7618,2786],[15,22]],[[7661,2825],[2,-1],[52,-37]],[[7715,2787],[-18,-26]],[[7650,2694],[-64,46]],[[7586,2740],[10,14],[6,9],[8,10],[8,13]],[[7653,2616],[-39,27],[-45,35],[-16,12]],[[7553,2690],[17,27],[16,23]],[[7524,2739],[11,6],[11,9],[12,9],[10,9],[13,6],[16,5],[7,3],[7,6],[9,7],[13,9]],[[7553,2690],[-10,-11],[-14,-23]],[[6694,3114],[-30,-55],[19,-14]],[[6683,3045],[-16,-29],[-15,-14]],[[6712,3101],[-29,-56]],[[6770,3058],[-30,-56]],[[6740,3002],[-20,16],[-19,14],[-18,13]],[[6740,3002],[-18,-34],[-9,-11]],[[6772,2913],[-11,-22]],[[6791,3043],[17,-14]],[[6808,3029],[-29,-55]],[[6779,2974],[-26,-47],[19,-14]],[[6797,2960],[-25,-47]],[[6779,2974],[18,-14]],[[6807,2887],[-1,4],[-2,2],[-2,-2],[-30,22]],[[6797,2960],[29,-21],[5,-3]],[[8040,2949],[13,17],[8,11],[15,20]],[[8076,2997],[11,-9],[35,-28]],[[7006,800],[-13,11],[-8,7]],[[6985,818],[-7,5],[-8,7],[-8,6],[-8,6]],[[6954,842],[-8,7],[-7,5]],[[6959,897],[53,-42],[16,-13]],[[7028,842],[10,-8]],[[7038,834],[-15,-15],[-17,-19]],[[6915,794],[-18,4],[-18,5]],[[6879,803],[20,51],[7,-6],[12,20],[1,2]],[[6954,842],[-1,-2],[-9,-24],[-15,13],[-14,-35]],[[6985,818],[-1,-2],[-14,-35],[-18,4],[-18,5],[-19,4]],[[6839,901],[-11,-24],[-20,13],[-6,-20],[17,-11],[-3,-6],[-3,-12],[-16,9],[-7,-27],[17,-4],[18,-4]],[[6825,815],[18,-3],[18,-5]],[[6861,807],[18,-4]],[[7006,800],[9,-6],[9,-8],[16,-12]],[[6778,811],[27,95],[-15,-9]],[[6790,897],[-34,2]],[[6756,899],[42,25],[16,9],[12,8],[3,2]],[[6851,925],[-1,-2],[-11,-22]],[[6861,807],[7,26],[15,32],[-14,12],[-15,12]],[[6854,889],[-15,12]],[[6825,815],[10,35],[19,39]],[[6728,821],[0,1],[14,46],[19,-8],[4,14],[23,11],[2,12]],[[6650,838],[14,8],[10,7],[35,21],[11,6],[11,7],[2,2]],[[6733,889],[4,3],[6,3],[3,2]],[[6746,897],[1,-3],[9,5]],[[6746,897],[-3,5],[2,0],[13,10],[23,80],[4,14]],[[6733,889],[-11,4],[-2,-1],[-7,3],[-21,8],[-22,8]],[[6670,911],[24,83],[-4,1],[6,22]],[[6696,1017],[6,22]],[[6702,1039],[24,-10]],[[6726,1029],[-12,-43],[22,-8],[21,-8],[12,44],[3,12]],[[6726,1029],[-5,7],[3,17],[-1,5],[-5,10],[-28,43],[12,20]],[[6702,1039],[2,8],[-1,8],[-3,6],[-5,5],[-77,30],[-6,-24],[-6,-24]],[[6606,1048],[-4,-14],[-2,-8],[-22,-81]],[[6578,945],[-51,19],[-3,1]],[[6524,965],[-3,7],[-3,9],[-1,4],[-1,3],[0,3],[-1,3],[0,4],[0,5],[-1,5],[1,4],[0,4],[0,8],[1,5],[0,8],[1,5],[1,12]],[[6518,1054],[0,6],[1,21],[2,25],[2,16],[0,7],[1,13],[1,10],[0,3],[0,5],[0,3],[0,5],[0,7],[-1,5],[0,6],[-1,8],[0,5],[-1,5]],[[6522,1204],[0,1],[1,7],[-1,2]],[[6522,1214],[2,2],[3,0],[19,18],[41,35],[9,7],[3,1],[2,2],[5,3]],[[6696,1017],[-90,31]],[[6670,911],[-21,7],[-31,12],[-1,2],[-4,0],[-3,2],[-32,11]],[[6533,876],[1,6],[2,7],[1,7],[1,7],[0,4],[0,9],[-1,5],[0,5],[-2,7],[-2,6],[-1,4],[-3,8],[-5,14]],[[6531,876],[-20,5],[-26,5],[-25,6],[6,26],[-26,9],[-4,7],[-4,56],[2,9]],[[6434,999],[50,-19],[9,34],[5,16],[4,18],[3,11]],[[6505,1059],[10,-4],[3,-1]],[[6434,999],[-13,6],[6,38],[1,7],[4,9],[6,7],[16,17],[19,-11],[32,-13]],[[6403,864],[1,23],[0,8],[2,114],[-1,82],[0,16]],[[6405,1120],[7,6],[52,37],[20,13],[11,10],[19,18],[4,4],[1,2],[2,2]],[[6521,1212],[0,-1],[1,-7]],[[6352,1008],[21,1],[3,-1],[3,-1],[7,0],[5,1],[2,1],[0,3],[-1,3],[-2,4],[0,9],[0,6],[2,7],[1,1],[0,25],[-5,11],[-3,4]],[[8760,6653],[-2,1],[-18,13]],[[8737,6756],[31,-22],[-4,-18],[12,-3],[5,-18],[0,-16],[11,-4],[-4,-12]],[[8615,6424],[4,1],[24,77],[-6,3],[-7,3],[-9,38],[2,12]],[[8537,6472],[3,5],[12,27],[8,18],[1,2],[1,3],[8,24],[7,23]],[[8417,6569],[26,-21],[20,-15],[6,12],[2,9],[3,9],[3,6],[5,5],[-4,8],[-3,10],[7,3],[7,-2],[4,10],[2,7],[4,19],[14,-3]],[[8417,6569],[9,17],[9,23],[4,16],[5,21]],[[8444,6646],[6,34],[1,21]],[[8451,6701],[36,-3],[17,-3]],[[8341,6674],[31,-8],[3,21],[1,19],[4,4],[33,-1],[18,0],[-1,-27],[-4,-31],[18,-5]],[[8347,6737],[5,2],[19,1],[33,0],[30,-1]],[[8434,6739],[20,-1]],[[8454,6738],[0,-4],[-3,-33]],[[8384,6768],[50,-1],[0,-28]],[[8458,6764],[-4,-26]],[[8427,6853],[16,-12],[12,-8]],[[8455,6833],[6,-3],[12,-5]],[[8410,6866],[10,19],[10,19]],[[8430,6904],[41,-30],[-8,-20],[-8,-21]],[[8430,6904],[10,19],[-32,22],[8,16],[1,6]],[[8417,6967],[35,-25],[33,-24]],[[8485,6918],[21,-15]],[[8433,7005],[71,-52]],[[8504,6953],[-8,-15],[-9,-17],[-2,-3]],[[8514,6971],[-10,-18]],[[8442,7022],[72,-51]],[[8453,7042],[71,-51]],[[8468,7071],[71,-51]],[[8546,7034],[-7,-14]],[[8409,7114],[7,14]],[[8475,7085],[71,-51]],[[6924,2944],[18,-14]],[[6905,2958],[36,66]],[[6884,2974],[4,8],[5,8],[4,8],[4,8],[5,9],[4,7],[5,9],[5,9]],[[6905,2958],[-21,16]],[[6884,2974],[-24,17]],[[6847,2967],[13,24]],[[6797,2960],[30,56]],[[6808,3029],[19,-13]],[[6808,3029],[36,67]],[[2104,990],[-13,-3],[-18,-4],[-6,-3],[-6,-4],[-5,-4],[-16,-14]],[[2040,958],[-23,38],[-3,5],[-4,4],[-4,3],[-1,1]],[[2005,1009],[6,14],[-28,17],[-7,4],[-3,4],[-1,6],[-4,16],[3,2],[5,2],[7,4],[14,-19],[2,-1],[3,0],[1,2],[4,8],[6,8],[8,9],[9,8],[9,6],[4,2],[19,5],[4,-23],[8,2],[6,2],[4,1],[3,3],[6,5]],[[2093,1096],[13,-10],[-10,-24],[-1,4],[-3,-1],[-2,-2],[-1,-2],[0,-4],[2,-7],[8,-37],[5,-23]],[[4045,3461],[-16,-12],[-33,-25]],[[3982,3413],[-19,-15]],[[3963,3398],[-31,31],[-35,37],[-17,19],[-4,4],[-9,9],[-12,13],[-28,29],[-7,8],[-2,2],[-3,1],[-4,1],[-3,1],[-3,0],[-6,1],[-5,1],[-6,0],[-13,-6],[-7,-3],[-12,-2],[-5,-1],[-9,-1]],[[3742,3542],[0,6]],[[3742,3548],[16,1],[10,0],[14,7],[5,2],[5,1],[11,-1],[10,0],[5,-3],[7,-1],[8,5],[11,2],[11,1],[2,1],[6,0],[21,-5],[2,-1],[6,-4],[9,-5],[14,-7],[23,-5],[33,-6],[6,-1],[5,-1],[16,-2],[2,1],[17,0],[4,0],[14,2],[10,2],[28,5],[11,0],[26,16],[16,8],[20,0],[18,-2],[18,1],[46,7],[14,4],[7,1],[3,1],[6,4],[2,0],[3,1],[1,1],[11,5],[17,5]],[[4292,3588],[64,-59]],[[4356,3529],[-8,-5],[-9,-6],[-6,-7],[-10,-6],[-10,-4],[-2,-1],[-4,-1],[-3,-2],[-2,0],[-8,-3],[-10,0],[-11,1],[-22,-2],[-31,-2],[-18,-1],[-22,3],[-32,5],[-8,0],[-14,0],[-17,-3],[-24,-9],[-4,-2],[-19,-10]],[[7345,3904],[-13,-22]],[[7332,3882],[-19,15],[-18,13]],[[7295,3910],[-19,13],[-19,15],[-19,13]],[[7238,3951],[12,22]],[[7250,3973],[57,-42]],[[7307,3931],[38,-27]],[[6618,5223],[-22,-57]],[[6596,5166],[-4,2],[-43,21],[-4,2]],[[6545,5191],[11,30]],[[6556,5221],[52,149],[7,20],[1,3]],[[6616,5393],[10,-7],[8,-5],[38,-27],[3,-2]],[[6675,5352],[0,-2],[-1,-2],[-3,-6],[-28,-54]],[[6643,5288],[-10,-24],[-15,-41]],[[6732,5273],[-17,12],[-20,13],[-19,13],[-17,-34],[-16,11]],[[6675,5352],[36,-26],[17,-13]],[[6728,5313],[36,-25]],[[6764,5288],[-2,-4],[-3,-4],[-10,-21],[-17,14]],[[6732,5273],[-12,-22],[9,-17],[9,-17],[8,-8],[-9,-17]],[[6737,5192],[-11,9],[-13,23],[-16,-11]],[[6697,5213],[-9,16],[-20,15],[-17,13],[-17,-43],[-16,9]],[[6754,5179],[-17,13]],[[6764,5288],[33,-24]],[[6797,5264],[-2,-4],[-1,-6],[-40,-75]],[[7356,3926],[-11,-22]],[[7307,3931],[12,21]],[[7319,3952],[11,21]],[[7330,3973],[38,-26]],[[7368,3947],[-12,-21]],[[7273,4015],[57,-42]],[[7319,3952],[-58,42]],[[7261,3994],[12,21]],[[7250,3973],[-37,28],[11,21],[37,-28]],[[7238,3951],[-16,12],[-21,15],[-20,15]],[[7181,3993],[-61,47]],[[7120,4040],[31,59]],[[7151,4099],[80,-52],[5,-3],[37,-29]],[[7209,3897],[-36,28]],[[7173,3925],[11,22],[-20,15],[17,31]],[[7238,3951],[-15,-31],[-14,-23]],[[7339,3991],[-9,-18]],[[7151,4099],[8,15],[18,33],[5,15]],[[7182,4162],[8,-3],[37,-28],[26,-19],[19,-14],[4,-3]],[[7276,4095],[4,-2],[26,-19]],[[7306,4074],[-12,-22]],[[7294,4052],[-11,-20],[56,-41]],[[7294,4052],[57,-41]],[[7351,4011],[-12,-20]],[[7306,4074],[56,-41]],[[7362,4033],[-11,-22]],[[7412,4029],[-13,-24]],[[7399,4005],[-37,28]],[[7276,4095],[19,19],[2,2]],[[7297,4116],[4,-4],[1,-1],[16,-13]],[[7318,4098],[94,-69]],[[7318,4098],[7,12],[6,11]],[[7331,4121],[85,-62],[8,-6]],[[7424,4053],[-12,-24]],[[7435,4072],[-11,-19]],[[7331,4121],[5,9],[5,6],[5,4]],[[7346,4140],[89,-68]],[[7346,4140],[8,7],[9,8],[60,-47],[23,-17]],[[7446,4091],[-6,-10],[-5,-9]],[[7457,4112],[-6,-11],[-5,-10]],[[7297,4116],[26,23],[31,27],[13,8],[5,3],[15,5],[6,3],[22,0],[16,-1]],[[7431,4184],[12,-9],[4,-1],[5,-4],[3,-2],[1,-1],[8,-6],[12,-8],[3,-3]],[[7479,4150],[-5,-9],[-6,-9]],[[7468,4132],[-5,-10],[-6,-10]],[[7511,4041],[-65,50]],[[7457,4112],[66,-51]],[[7523,4061],[-6,-10],[-6,-10]],[[7468,4132],[35,-27],[12,-9],[17,-12],[2,-2]],[[7534,4082],[-5,-10],[-6,-11]],[[7479,4150],[6,-5],[40,-30],[8,-6],[11,-9]],[[7544,4100],[-5,-9],[-5,-9]],[[7654,4145],[-17,-31],[2,-2],[5,-4],[16,-12],[-9,-18],[-10,7],[-6,5],[-8,6]],[[7627,4096],[-15,11],[-35,27],[-11,9],[-10,-18],[-12,-21],[0,-4]],[[7431,4184],[4,1]],[[7435,4185],[12,-1],[16,0],[9,1],[6,1],[7,2],[5,1],[16,3],[16,5],[22,8],[16,9],[4,2],[19,14],[9,8],[2,3],[2,1]],[[7596,4242],[10,-7],[7,-5],[3,-3],[8,-6],[1,-2],[19,-15]],[[7644,4204],[-6,-12],[-5,-9],[-8,-15],[29,-23]],[[7604,4055],[-52,40],[-8,5]],[[7627,4096],[-10,-18]],[[7617,4078],[-6,-11],[-7,-12]],[[7604,4055],[25,-18],[3,-2]],[[7632,4035],[-5,-9],[-6,-10]],[[7621,4016],[-87,66]],[[7621,4016],[-5,-9],[-6,-11]],[[7610,3996],[-42,32],[-45,33]],[[7599,3976],[-18,13],[-25,18],[-45,34]],[[7610,3996],[-6,-10],[-4,-8],[-1,-2]],[[7594,3967],[-6,-10]],[[7588,3957],[-20,15],[-23,16],[-45,34]],[[7500,4022],[6,10],[5,9]],[[7599,3976],[-5,-9]],[[7578,3939],[-27,20],[-15,11],[-45,34]],[[7491,4004],[5,9],[4,9]],[[7588,3957],[-6,-12],[-4,-6]],[[7478,3981],[7,12],[6,11]],[[7578,3939],[-2,-5],[-7,-12]],[[7569,3922],[-10,5],[-8,2],[-8,4],[-19,14],[-46,34]],[[8191,3873],[8,29]],[[8199,3902],[1,5]],[[8200,3907],[34,-26],[14,-10]],[[8248,3871],[-6,-16]],[[8242,3855],[-6,-17],[39,-30],[26,-19],[14,-11],[28,-21]],[[8343,3757],[-8,-15],[-7,-12],[-3,-5],[-13,-25]],[[8360,3787],[-8,-15],[-9,-15]],[[8242,3855],[10,-8],[24,-18],[1,-1],[8,-6],[18,-13],[13,-10],[7,-5],[8,15],[-7,5],[-15,11]],[[8309,3825],[5,8],[21,-16],[8,13],[-45,34]],[[8298,3864],[8,15]],[[8306,3879],[45,-34]],[[8351,3845],[21,-16],[8,-6]],[[8380,3823],[-8,-15],[-12,-21]],[[8309,3825],[-16,12],[-7,6]],[[8286,3843],[7,14],[5,7]],[[8351,3845],[4,9],[4,7],[-7,5],[-37,29],[7,13]],[[8322,3908],[2,0],[43,-32],[9,15],[8,14]],[[8384,3905],[13,-10],[15,-12]],[[8322,3908],[7,12],[3,4],[8,15]],[[8340,3939],[16,-12]],[[8356,3927],[28,-22]],[[8356,3927],[7,13],[5,9],[11,19]],[[8379,3968],[12,22]],[[8391,3990],[29,-21],[-13,-22]],[[8407,3947],[-11,-20],[-7,-11],[-5,-11]],[[8407,3947],[18,-14],[11,-8]],[[8436,3925],[-11,-20],[-13,-22]],[[8442,3935],[-6,-10]],[[8391,3990],[12,22],[15,25]],[[8418,4037],[28,-21]],[[8446,4016],[19,-15],[9,-7]],[[8474,3994],[-13,-25],[-13,-23],[-6,-11]],[[8442,3935],[24,-18],[16,-13],[9,-7]],[[6717,5109],[-56,27]],[[6661,5136],[8,22],[6,20],[9,20],[13,15]],[[6754,5179],[-20,-37],[-16,-31],[-1,-2]],[[6754,5179],[21,-15],[32,-6],[6,-4]],[[6813,5154],[-36,-69],[-2,-3]],[[6775,5082],[-58,27]],[[6797,5264],[54,-39]],[[6897,5192],[54,-39],[17,-12]],[[6968,5141],[-2,-4],[-4,-9],[-10,-18],[-18,12],[-11,-21]],[[6972,5040],[-49,35]],[[6923,5075],[-10,7]],[[6968,5141],[31,-22]],[[6999,5119],[-1,-2],[-1,-3],[-1,-3],[10,-6],[-3,-6],[-10,-20],[-10,-19],[-11,-20]],[[6900,5033],[5,8],[6,13],[12,21]],[[6972,5040],[17,-13],[-19,-16],[-19,-17],[-11,10],[-9,7],[-13,9],[-18,13]],[[7103,5060],[-13,-9],[-3,-2],[-7,-5],[-5,-4],[-2,-2],[-4,-3],[-5,-4],[-6,-5],[-5,-5],[-6,-4],[-34,-32],[-13,-11],[-9,-8]],[[6824,4872],[-2,1],[-1,0],[-2,1],[-3,2]],[[6816,4876],[24,19],[9,5],[13,6],[13,5],[22,4],[9,2],[9,3],[12,6],[3,1],[-15,38],[-6,12],[-5,9],[-8,12],[-10,13]],[[6886,5011],[5,6],[6,11],[3,5]],[[6999,5119],[33,-24],[16,-11],[16,-12],[3,-1],[3,-1],[13,0],[4,-1],[5,-1],[3,-1],[3,-2],[3,-2],[1,-3],[1,0]],[[6886,5011],[-7,8],[-1,2],[-8,8],[-11,8],[-12,9],[-10,6],[-11,6],[-51,24]],[[6816,4876],[-5,2],[-2,3],[-5,2],[-4,1],[-17,8],[-13,5],[-20,10],[-31,14]],[[6719,4921],[8,22],[46,136],[2,3]],[[6824,4872],[-2,-2],[-2,-1],[-2,-2],[-4,-5],[-7,-7],[-2,-3],[-5,-7],[-3,-5],[-4,-7],[-5,-9],[-4,-6]],[[6784,4818],[-2,-6],[-8,-13],[-5,-10],[-3,-7]],[[6766,4782],[-1,1],[-2,1],[-4,2]],[[6759,4786],[9,16],[9,18],[-34,16],[-8,4],[-31,15],[-8,4]],[[6696,4859],[7,18]],[[6703,4877],[7,21],[4,11],[5,12]],[[6841,4792],[-9,5],[-36,16],[-7,4],[-5,1]],[[6828,4754],[-9,4],[-50,23],[-3,1]],[[6815,4716],[-52,24],[-2,1],[-10,5]],[[6751,4746],[-4,1]],[[6747,4747],[3,4],[7,15],[9,16]],[[6800,4673],[-57,28],[-3,1],[-7,3],[0,4]],[[6733,4709],[7,15],[11,22]],[[6793,4653],[-43,20],[-14,7],[-3,2],[-11,5],[11,22]],[[6683,4823],[9,-4],[31,-15],[8,-4],[14,-7],[14,-7]],[[6683,4823],[2,2],[5,15],[2,7],[4,12]],[[6641,4907],[62,-30]],[[3400,3543],[-4,3],[-54,21],[-23,24],[-5,5],[-3,2],[-3,5]],[[3308,3603],[7,1],[19,1],[7,0]],[[3341,3605],[8,0],[16,1],[9,0],[9,1],[2,0],[6,0],[13,-3]],[[3404,3604],[21,-7],[6,-3],[11,-6]],[[3442,3588],[3,-2],[20,-14],[63,-41]],[[3528,3531],[-12,-24],[-2,-5],[-44,16],[-70,25]],[[3341,3605],[-5,5],[-126,131],[4,4],[7,2],[13,3],[3,-1],[14,-15],[26,9],[127,-133],[0,-6]],[[7377,3964],[-9,-17]],[[7351,4011],[37,-28]],[[7388,3983],[-11,-19]],[[7399,3832],[-30,22],[-18,13],[-15,12],[-4,3]],[[7356,3926],[66,-51]],[[7422,3875],[-11,-21],[-12,-22]],[[7381,3799],[-12,-20],[-65,47]],[[7304,3826],[10,18],[2,4],[0,2],[16,32]],[[7399,3832],[-18,-33]],[[7381,3799],[22,-19],[4,-3],[2,-3],[8,-16]],[[7417,3758],[-7,-3],[-8,-3],[-7,-1],[-4,-1],[-7,-2],[-9,-3],[-23,-10],[-9,-4],[-6,-3]],[[7337,3728],[-7,-3],[-21,-9],[-5,-3],[-4,-2],[-3,-2],[-3,-2]],[[7294,3707],[0,2],[-1,2],[-1,1],[-36,27]],[[7256,3739],[12,22],[11,22],[2,2],[3,4],[8,13],[2,4],[10,20]],[[7256,3739],[-37,27]],[[7219,3766],[12,23],[11,22],[11,21],[2,3],[11,19]],[[7266,3854],[36,-26],[2,-2]],[[6677,5055],[-16,7],[-9,-22],[-5,2],[-1,0],[-3,0],[-5,3],[-33,16],[-2,1],[-2,2],[-4,2],[8,23]],[[6605,5089],[17,-8],[11,33],[1,3],[1,2],[1,0],[2,1],[1,-1],[1,0],[13,-6],[28,-13],[3,-3],[4,-6],[0,-4],[-1,-5],[-3,-6],[-7,-21]],[[6605,5089],[-33,16],[22,57],[2,4]],[[6596,5166],[65,-30]],[[6717,5109],[-1,-3],[-2,-2],[-19,-57],[-18,8]],[[7142,5009],[-6,-10],[-5,-10]],[[7131,4989],[-7,5],[-46,33],[-3,2],[-6,1],[-5,-5],[-9,-7],[59,-44],[6,-5]],[[7120,4969],[-9,-19]],[[7111,4950],[-10,-19],[-10,-16]],[[7091,4915],[-9,-18]],[[7103,5060],[1,-4],[1,-5],[-1,-7],[1,-4],[0,-2],[2,-2],[1,-1],[2,-2],[3,-1],[6,-3],[20,-16],[3,-4]],[[7131,4989],[-5,-10],[-6,-10]],[[7199,4885],[-32,24],[-56,41]],[[7131,4989],[57,-42],[32,-23]],[[7142,5009],[57,-41]],[[7199,4968],[32,-24]],[[7142,5009],[6,11],[5,9],[5,9],[5,10],[6,11],[5,9]],[[7174,5068],[57,-41]],[[7231,5027],[-5,-10],[-6,-11],[-5,-9],[-5,-10],[-5,-9],[-6,-10]],[[7174,5068],[5,10],[5,8],[5,2],[9,12],[40,-29],[9,-7]],[[7174,5068],[-24,19],[-2,4]],[[7148,5091],[1,0],[12,9],[4,3],[18,12],[15,10],[1,1],[2,1],[5,4],[20,14],[1,1],[24,16],[21,14],[3,3]],[[7103,5060],[11,8],[18,12],[4,3],[12,8]],[[6851,5225],[120,236],[4,8],[4,8]],[[6979,5477],[4,7],[4,8],[4,6],[4,9]],[[6851,5547],[60,-43],[4,8],[4,8]],[[6919,5520],[60,-43]],[[6728,5313],[114,216],[5,11],[4,7]],[[6919,5520],[4,8],[4,7]],[[6927,5535],[4,8],[5,8]],[[6936,5551],[51,-38],[8,-6]],[[6936,5551],[4,7],[4,8]],[[6944,5566],[4,7],[5,9]],[[6953,5582],[33,-24],[26,-19]],[[6953,5582],[5,9],[5,9],[4,9],[6,10],[2,3]],[[6953,5582],[-60,44]],[[6893,5626],[5,9],[5,9],[5,9],[5,10],[2,3]],[[6944,5566],[-60,43]],[[6884,5609],[4,8],[5,9]],[[6927,5535],[-59,44]],[[6868,5579],[4,7],[4,8],[8,15]],[[6860,5563],[4,8],[4,8]],[[6919,5520],[-59,43]],[[6851,5547],[5,9],[4,7]],[[6793,5590],[-9,-18]],[[6784,5572],[-38,26],[-9,6],[-10,-20],[-13,9]],[[6714,5593],[10,20],[11,21],[27,54],[8,16]],[[6770,5704],[7,-4],[6,-5],[-11,-23],[8,-6],[9,-6],[31,-21]],[[6820,5639],[-14,-26],[-5,-8],[-4,-7],[-2,-4],[-2,-4]],[[6784,5518],[-59,41],[-8,5],[-10,-19]],[[6707,5545],[-9,6],[-4,2]],[[6694,5553],[20,40]],[[6784,5572],[19,-13],[1,-2],[-1,-2],[-3,-7],[-6,-10],[-5,-10],[-5,-10]],[[6763,5479],[-65,48],[4,9],[5,9]],[[6784,5518],[-6,-10],[-6,-11],[-5,-9],[-4,-9]],[[6763,5479],[-9,-15],[-39,29],[-11,-19],[-5,-9],[-6,-12],[-3,-7],[-10,7],[-15,10],[10,19],[-13,8]],[[6662,5490],[9,18],[6,12],[17,33]],[[2967,2895],[-40,-34],[-3,-2],[-2,1],[-23,33],[-10,-8],[-4,-6],[-2,-3],[-5,4],[-5,3],[-26,14]],[[2847,2897],[-33,17],[-3,1],[-2,-4],[-6,-18],[-12,-29],[-3,-3],[-7,-7],[-17,-14],[-6,9],[-2,4],[-2,4],[-3,19]],[[2751,2876],[-1,5],[-9,15],[-21,36],[-12,19],[-8,13]],[[2700,2964],[17,14],[31,26]],[[2748,3004],[9,7],[7,5],[13,10],[3,3],[6,5],[16,13],[6,5],[2,3],[4,5],[3,3],[3,3],[3,2]],[[2823,3068],[6,5],[33,28]],[[2862,3101],[46,-78],[5,-10],[6,-27],[3,-9],[6,-14],[21,-35]],[[2949,2928],[18,-33]],[[2901,3123],[-20,-9]],[[2881,3114],[-19,-13]],[[2823,3068],[-40,64],[-4,28],[-10,12],[40,30]],[[2809,3202],[18,1],[29,20],[3,0]],[[2859,3223],[5,-11],[-25,-20],[11,-19],[22,-35],[2,-2],[3,0],[23,10],[1,-23]],[[2386,3567],[-23,7],[1,-3],[0,-3],[0,-2],[0,-3],[-1,-2],[0,-2],[0,-2],[-1,-2],[-1,-2],[-1,-1],[-1,-2],[-1,-1],[-2,-3],[-1,-2],[-8,9],[-16,24],[12,10],[5,6],[4,3],[2,-2],[3,2],[6,6],[1,0],[13,12],[1,1],[0,1],[6,4],[11,15],[-1,2],[0,1],[-1,2],[-1,4],[-1,4],[-2,9],[0,3],[-1,2],[-1,2],[-1,1],[-1,1],[-1,1],[-1,0],[-1,0],[-1,1],[-1,0],[-1,-1],[-2,0],[-1,-1],[-2,-1],[-2,-2],[-4,-3],[-3,-4],[-8,-7],[-15,-14],[-1,-1],[-6,-5],[-4,-3]],[[1693,3865],[4,2],[6,2],[11,0],[3,-2],[6,-4],[4,-6],[4,-4],[7,-5],[3,2],[7,6],[2,0],[5,-5],[1,-1],[5,-3],[6,-1],[3,2],[2,1],[2,7],[5,17],[3,8],[9,18],[6,8],[4,6],[10,9],[4,4],[11,5],[12,3],[10,1],[8,3],[10,1],[7,0],[3,-1],[10,-2],[17,-8],[11,-7],[26,-12],[11,-4],[6,0],[4,-1],[3,-1],[15,-1],[29,0],[44,-5],[8,-1],[30,-5],[10,0],[10,-2],[15,4],[15,-2],[3,-1],[7,-5],[4,-8],[4,-5],[6,-3],[7,-1],[7,2],[12,1],[6,2],[4,-1],[5,3],[18,8],[10,1],[13,1],[4,-1],[2,-1],[0,-5],[-2,-10],[-2,-4],[-8,-17],[2,-9],[0,-3],[1,-2],[11,-4],[17,-17],[17,-24],[21,-18],[40,-21],[10,-6],[9,-9],[7,-4],[5,-3],[0,-7],[5,-23],[-1,-3],[2,-3],[4,-5],[6,-9],[3,-10],[7,-20],[3,-4],[4,-4],[6,-1],[5,-6],[0,-1],[1,-5],[-1,-10],[-2,-9],[-2,-6],[-5,-7],[-11,-10],[-18,-17]],[[1274,3378],[2,27],[1,14],[-1,11],[1,8],[13,33],[6,10],[4,5],[7,4],[7,3],[8,4],[10,8],[4,14],[8,3],[21,-2],[5,3],[3,2],[2,0],[7,-7],[4,0],[13,3],[10,6],[12,10],[9,13],[9,12],[7,10],[12,11],[7,10],[3,13],[1,23]],[[1806,2151],[-14,-10],[-7,-4],[-17,-9]],[[1768,2128],[-12,-5],[-9,-3],[-10,-4],[-7,-6],[-10,-7],[-4,-3],[-22,-14],[-16,-11],[-12,-12]],[[1666,2063],[-10,-7],[-9,-4],[-17,-6],[-16,-6]],[[1614,2040],[-9,-3],[-8,-5],[-5,-3],[-34,-25],[-2,-2],[-5,-3],[-39,-29],[-16,-12],[-11,-9],[-15,-14],[-7,-4],[-5,-2],[-5,-1],[-9,2],[-11,1],[-11,2],[-15,3],[-13,1],[-18,-1],[-12,-1],[-1,8],[-2,4],[-7,13],[-1,1],[-1,1],[-1,0],[-2,0],[-4,-1],[-7,-1],[-2,-1],[-1,0],[-1,-1],[1,-13],[-1,0],[0,-1],[0,-1],[0,-2],[0,-2],[0,-2],[0,-2],[-16,-1],[-8,-1],[-11,-4],[-8,-2],[-10,-3],[-6,0],[-3,1],[-4,1],[-4,2],[-27,19],[-7,5],[-29,21],[-11,6],[-4,2],[-5,2],[-5,2],[-1,0],[-2,-1],[-2,0],[-2,-1],[-13,-8],[-25,-17],[-10,-6],[-3,-2],[-7,-4],[-27,-18],[-66,-43],[-59,-38],[-38,-24],[-55,-35],[-15,-9],[-19,-12],[-19,-11],[-7,-5],[-2,-6],[0,-5],[0,-5],[7,-18],[6,-18],[1,-6],[0,-5],[-1,-10],[-2,-4],[-10,-18],[-4,-7],[-3,-7],[-1,-5],[-2,-7],[-3,-16],[-2,-11]],[[790,1603],[-10,5]],[[780,1608],[5,4],[2,9],[0,11],[-1,5],[-4,5],[0,3],[4,7],[6,2],[11,14],[2,10],[0,9],[-2,5],[0,9],[-1,1],[-2,4],[-36,0],[-7,2],[-8,7],[4,8],[6,1],[0,9],[-3,9],[-7,5],[-7,3],[-5,8],[-8,9],[-7,12],[-5,3],[-5,2],[-25,0],[-3,2],[-9,9],[-7,-2],[-5,-3],[-7,2],[-7,11],[-8,17],[-7,16],[-1,11],[-3,7],[-4,2],[-3,-2],[-1,-2],[-1,-9],[-2,-6],[-6,-4],[-13,0],[-8,1],[-11,15],[-5,10],[-2,11],[0,10],[0,10],[2,7],[8,12],[1,0],[2,-5],[-6,-9],[-1,-5],[1,-3],[4,-1],[4,4],[3,0],[4,-2],[2,-6],[5,-2],[4,0],[9,9],[3,8],[12,12],[5,2],[4,-9],[7,-1],[7,2],[3,5],[6,-1],[2,2],[0,9],[3,8],[8,12],[5,7],[5,10],[4,9],[-1,10],[-1,7],[-3,7],[-3,6],[-5,6],[-6,0],[-3,1],[-5,3],[-5,2],[-10,-3],[-15,-8],[-9,-3],[-9,1],[-7,6],[0,4],[-2,7],[6,8],[5,9],[0,7],[-1,9],[-4,15],[-1,6],[4,9],[6,2],[6,1],[6,-1],[3,-4],[2,-9],[6,-5],[5,0],[8,1],[8,6],[10,10],[0,11],[1,10],[5,8],[5,12],[0,3],[-1,1],[0,5],[3,2],[3,0],[3,-6],[2,-1],[5,0],[2,4],[14,11],[11,0],[7,1],[3,1],[3,4],[-1,2],[-5,3],[-5,7],[-3,11],[-4,8],[0,5],[3,5],[6,2],[3,3],[3,7],[2,10],[-2,9],[-4,3],[-5,-6],[-6,-3],[-5,-2],[0,4],[1,1],[5,6],[3,18],[5,4],[1,9],[3,9],[5,3],[5,8],[10,12],[3,6],[3,12],[4,5],[5,4],[8,0],[6,5],[5,7],[9,8],[8,-1],[1,0],[3,1],[7,6],[9,17],[13,11],[2,-5],[6,-8],[6,-4],[7,1],[6,-7],[1,0],[5,4],[9,4],[1,2],[5,1],[12,15],[6,1],[12,0],[18,14],[10,0],[4,2],[9,0],[4,-4],[6,-1],[9,2],[5,5],[8,5],[8,2],[13,1],[1,-16],[7,-16],[2,-9],[2,-8],[2,-7],[8,-13],[2,-3],[4,-7],[8,-9],[8,-7],[5,-3],[4,-2],[18,-20],[-4,-11],[-4,-5],[-5,-7],[-3,-12],[9,-12],[4,-7],[6,-2],[7,3],[3,4],[6,-4],[2,-5],[0,-18],[-2,-8],[-7,-15],[-1,-4],[0,-1],[0,-8],[2,-13],[7,-14],[1,-4],[9,-15],[2,-24],[14,-30],[2,-7],[12,-23],[3,-10],[3,-1],[3,1],[2,0],[6,-11],[0,-6],[3,-4],[6,-3],[8,3],[8,-4],[7,-6],[13,-2],[7,1],[5,2],[7,-2],[10,-5],[4,-5],[1,-7],[5,-6],[12,-14],[5,-7],[5,-1],[3,-3],[1,-2],[2,-3],[10,0],[5,2],[6,4],[6,3],[7,1],[2,4],[3,2],[5,3],[6,24],[4,3],[6,-1],[16,0],[11,4],[4,3],[4,5],[2,2],[0,-3],[-3,-4],[-2,-2],[-1,-2],[1,-4],[2,-9],[4,-9],[9,-6],[13,-2],[27,1],[5,-12],[2,1],[8,0],[7,1],[6,-2],[10,5],[20,22],[7,10],[-3,12],[-1,12],[6,10],[7,5],[6,-3],[5,-7],[5,-5],[3,1],[6,1],[7,5],[9,12],[14,29],[3,5],[5,13],[11,20],[4,12],[4,6],[9,2],[11,3],[4,3],[-1,6],[-1,5],[1,3],[12,6],[3,-1],[6,4],[3,-2],[4,1],[2,-1],[2,-1],[5,4],[20,13],[2,0],[3,-3],[4,-4],[12,-4],[9,-1],[4,1],[5,8],[4,15],[2,8],[-1,17],[3,3],[7,0],[12,13],[7,3],[23,1],[8,3],[6,0],[3,-2],[4,-1],[6,4],[-2,5],[0,3],[11,10]],[[1787,2228],[-10,-8],[4,-16],[25,-53]],[[1955,2280],[-10,-6],[-6,-3],[-14,-10],[-11,22],[-6,-4],[-33,-21],[-1,-3],[0,-3],[11,-21],[3,-2]],[[1888,2229],[-15,-24],[-2,-2],[-19,41],[-2,1],[-13,-9],[-12,-7],[-2,0],[-6,11],[-3,11]],[[1814,2251],[4,6],[3,0],[3,-1],[1,-10],[4,-4],[5,-1],[4,7],[8,22],[2,3],[14,20],[0,6],[4,9],[4,4],[1,0],[5,-6],[17,16],[8,0],[8,-4],[5,-5],[7,-6],[2,2],[5,6],[1,10],[-1,3],[2,1],[2,2]],[[1932,2331],[0,-1],[23,-50]],[[1685,1876],[-5,9],[-9,19]],[[1671,1904],[86,54]],[[1757,1958],[21,-45],[-17,-12],[-33,-21],[-6,-8],[-12,11],[-4,10],[-11,-7],[-10,-10]],[[1808,1847],[-32,-20],[-19,-11],[-18,-12]],[[1739,1804],[-14,31],[-6,8],[-9,10],[-10,9],[-8,7],[-7,7]],[[1757,1958],[33,21]],[[1790,1979],[11,-24]],[[1801,1955],[-15,-9],[0,-3],[8,-17],[21,-47],[0,-2],[-2,-2],[-14,-9],[9,-19]],[[1892,1898],[-50,-31],[-34,-20]],[[1801,1955],[11,8],[5,3],[14,8],[2,0],[1,-1],[10,-22],[16,10],[22,-47],[10,-16]],[[1926,1919],[-34,-21]],[[1790,1979],[25,17],[2,1],[4,3],[5,3],[10,8]],[[1836,2011],[22,19],[26,29]],[[1884,2059],[12,-25],[-9,-7],[-8,-8],[37,-79],[10,-21]],[[7184,3585],[-31,26],[-4,10]],[[7149,3621],[14,27],[7,10],[-7,5]],[[7163,3663],[7,12],[12,24],[12,24],[13,22],[12,21]],[[7294,3707],[-14,-13],[-9,-8],[-11,-11],[-22,-18],[-17,-15],[-8,-8]],[[7213,3634],[-5,-4],[-3,-5],[-1,-3],[-7,-13]],[[7197,3609],[-10,-16],[-1,-4],[-2,-4]],[[7163,3663],[-56,42]],[[7107,3705],[6,11],[12,25],[13,24]],[[7138,3765],[11,22],[13,22]],[[7162,3809],[57,-43]],[[7041,3571],[73,17],[4,8],[31,25]],[[7184,3585],[-8,-15],[-3,-6],[-8,-15]],[[7041,3571],[3,15],[5,12],[15,26],[1,2]],[[7078,3651],[12,20],[12,23],[5,11]],[[7197,3609],[41,-30],[14,23],[1,1]],[[7253,3603],[4,-4],[1,-1],[3,-3]],[[7261,3595],[-8,-18],[-44,-84]],[[7213,3634],[34,-27],[1,-1],[5,-3]],[[7279,3582],[-18,13]],[[7337,3728],[1,-7],[1,-2],[1,-2],[3,-2],[39,-31],[23,-15]],[[7405,3669],[-15,-27],[-26,-16],[-24,-13],[-21,-10],[-18,-13],[-12,-16]],[[7467,3693],[-7,1],[-10,1],[-11,-4],[-4,-1],[-3,-2],[-6,-1],[-8,-2],[-6,-3],[-7,-13]],[[7417,3758],[11,3],[53,8],[19,2],[8,0]],[[7508,3771],[0,-7],[-13,-9],[1,-24],[5,-1],[11,-7],[-36,-26],[-9,-4]],[[7621,3366],[-86,59],[-6,-8],[-57,37],[-6,-12],[-79,53]],[[7467,3693],[3,-5],[27,-23],[4,-5],[21,-12],[16,28]],[[7538,3676],[34,8],[12,-13],[-3,-36],[17,-23],[23,-5],[29,-10],[-9,-13],[-2,-16],[50,-51],[-68,-151]],[[7508,3771],[35,5],[14,2]],[[7557,3778],[27,1]],[[7584,3779],[49,-8]],[[7633,3771],[4,0],[4,-1],[2,-1],[11,-3],[7,1],[23,11],[9,2]],[[7693,3780],[2,0],[2,0],[3,-1],[9,-6],[8,-5]],[[7717,3768],[-3,-8],[-1,-3],[-5,-9],[-2,-3],[-2,-2],[-8,-8],[-1,-1],[-2,-2],[-3,-2],[-3,-1],[-4,-1],[-9,1],[-53,3],[-33,-1],[-3,0],[-4,-1],[-3,-1],[-3,-2],[-4,-3],[-7,-7],[-3,-4],[-11,-18],[-12,-19]],[[7583,3811],[12,-9],[5,9],[39,-29],[-6,-11]],[[7584,3779],[2,7],[-13,9],[-3,1],[-12,9],[9,18]],[[7567,3823],[16,-12]],[[7583,3811],[20,41]],[[7603,3852],[14,-10],[39,-29]],[[7656,3813],[18,-12],[19,-21]],[[7603,3852],[13,22],[5,10]],[[7621,3884],[3,-2],[9,-7],[2,-2]],[[7635,3873],[10,-7],[20,-14],[9,-6]],[[7674,3846],[-6,-12],[-6,-11]],[[7662,3823],[-5,-9],[-1,-1]],[[8132,4257],[13,22]],[[8145,4279],[8,-6],[26,-20],[8,-6]],[[8187,4247],[-5,-8],[-8,-14]],[[8132,4257],[-11,9],[-36,27],[-9,7],[-7,6],[-2,2]],[[8067,4308],[-27,20],[-2,2],[-8,6]],[[8030,4336],[13,22],[9,16]],[[8052,4374],[10,16]],[[8062,4390],[8,-6],[27,-22],[2,-1],[8,-7],[56,-43]],[[8163,4311],[-9,-16],[-9,-16]],[[8118,4233],[-11,8],[-35,28],[-7,-11],[-6,-11]],[[8059,4247],[-9,7]],[[8050,4254],[-9,7]],[[8041,4261],[6,11],[6,11],[7,12],[7,13]],[[8093,4189],[-10,8],[6,11],[6,12],[-36,27]],[[8082,4170],[-10,8],[-28,21],[-8,6],[-9,7]],[[8027,4212],[11,20],[12,22]],[[8052,4120],[-9,7],[5,9],[5,9],[-45,34]],[[8008,4179],[5,10],[5,8],[9,15]],[[8035,4095],[-5,9],[-6,5],[-30,22],[-9,7]],[[7985,4138],[8,15],[5,9],[1,2],[4,7],[5,8]],[[7985,4138],[-10,7],[-28,21],[-9,7]],[[7938,4173],[13,24]],[[7951,4197],[11,18]],[[7962,4215],[7,-6],[39,-30]],[[7962,4215],[9,18],[9,15]],[[7980,4248],[10,-7],[1,-2],[22,-16],[5,-4],[9,-7]],[[2022,1996],[-6,1],[-32,-19],[-9,-7]],[[1975,1971],[-1,6],[-16,34],[-10,21],[-17,36],[-3,6],[-3,0],[-15,-20],[-9,19],[-1,5]],[[1900,2078],[18,23],[46,53]],[[1964,2154],[17,-20],[2,-2]],[[1983,2132],[13,-28],[11,-24],[-17,-14],[10,-23],[11,-24],[11,-23]],[[1900,2078],[-48,103],[-4,-3],[-13,-9],[-2,-1],[-12,-8],[-15,-9]],[[1787,2228],[5,4],[11,5],[5,6],[6,8]],[[1888,2229],[9,13],[11,-23],[-14,-19],[-1,-3],[31,-66],[33,34],[7,-11]],[[1900,2078],[-16,-19]],[[1836,2011],[-13,27]],[[1823,2038],[12,8],[7,7],[26,31],[2,2],[0,2],[0,3],[-3,7],[-6,11],[-25,-19],[-5,-4],[-2,-3],[-3,-4],[-13,12],[-4,4],[-3,3],[-8,14],[-2,2],[-18,-9]],[[1778,2105],[-10,23]],[[7785,4046],[-12,-22]],[[7773,4024],[-10,7],[-10,7],[-8,-15],[-1,-2],[-10,7],[-10,8]],[[7724,4036],[9,18],[12,22]],[[7745,4076],[30,-23],[10,-7]],[[7773,4024],[-8,-15],[-2,-3],[-8,-15],[-1,-2]],[[7754,3989],[-9,-16],[-10,-17]],[[7735,3956],[-39,29]],[[7696,3985],[10,17],[9,17],[9,17]],[[7713,3916],[-10,8],[-19,14],[-9,8]],[[7675,3946],[6,11],[6,11],[9,17]],[[7735,3956],[-10,-18],[-5,-10],[-7,-12]],[[7675,3946],[-3,2],[-8,7],[-9,6],[-1,1],[-9,7],[-9,8],[-9,7],[-17,12]],[[7632,4035],[24,-19],[11,-7],[27,-22],[2,-2]],[[7675,3946],[-14,-26]],[[7661,3920],[-3,1],[-2,0],[-8,6],[-9,7],[-9,7],[-19,13],[-17,13]],[[7661,3920],[-12,-22]],[[7649,3898],[-14,-25]],[[7621,3884],[-6,5],[-9,6],[-17,13],[-17,12],[-3,2]],[[7700,3892],[-12,-22]],[[7688,3870],[-10,7],[-1,1],[-18,13],[-9,7],[-1,0]],[[7713,3916],[-13,-24]],[[7617,4078],[14,-10],[9,-8],[-3,-6],[38,-29],[13,24],[5,11]],[[7693,4060],[10,-8],[9,-6],[9,-8],[3,-2]],[[7654,4145],[14,-11]],[[7668,4134],[36,-26],[10,-8]],[[7714,4100],[-4,-8],[-8,-15],[-4,-9],[-5,-8]],[[7714,4100],[8,15],[8,17],[2,6]],[[7732,4138],[23,-17],[8,-6],[2,-2]],[[7765,4113],[-7,-13],[-4,-9],[-9,-15]],[[7668,4134],[8,16],[5,10],[6,12]],[[7687,4172],[45,-34]],[[7687,4172],[9,19],[10,-7],[11,21],[-10,7],[7,13],[6,13]],[[7720,4238],[37,-28],[2,-1],[5,-2],[1,-1],[1,-1]],[[7766,4205],[-7,-15],[-6,-12],[-11,-22],[-10,-18]],[[7766,4205],[3,-2],[5,-4],[17,-12],[8,-6],[3,-2]],[[7802,4179],[-8,-14],[-8,-13]],[[7786,4152],[-11,-22],[-10,-17]],[[7810,4195],[-8,-16]],[[7766,4205],[9,16],[5,10],[5,10]],[[7785,4241],[7,12],[8,-7],[17,-13],[8,-6],[3,-2]],[[7828,4225],[-6,-11],[-12,-19]],[[7720,4238],[5,9],[5,8],[5,10],[6,10],[44,-34]],[[7840,4247],[-12,-22]],[[7720,4238],[-36,26],[-3,5],[-8,9],[-4,5],[-5,3],[-20,16]],[[7644,4302],[37,53],[1,1]],[[7682,4356],[8,-7],[8,-9],[19,-15],[86,-50]],[[7803,4275],[9,-7],[16,-13],[9,-7],[3,-1]],[[7687,4172],[-29,22],[-14,10]],[[7596,4242],[9,8],[6,8],[18,25],[13,17],[2,2]],[[7591,4344],[20,-15],[3,-1],[28,-21]],[[7642,4307],[-2,-3],[4,-2]],[[7596,4242],[-4,3],[-19,15],[-16,11],[-5,2]],[[7552,4273],[8,14],[6,11],[6,11],[6,11],[-67,52]],[[7511,4372],[6,12],[6,11]],[[7523,4395],[68,-51]],[[7591,4344],[6,10],[5,10],[6,12]],[[7608,4376],[33,-24],[22,-16],[-9,-12],[-6,-9],[-6,-8]],[[7523,4395],[6,10],[5,10],[7,11]],[[7541,4426],[39,-29],[28,-21]],[[7541,4426],[6,12],[8,13]],[[7555,4451],[7,14],[6,12]],[[7568,4477],[37,-27],[31,-23]],[[7636,4427],[-6,-12],[-8,-14],[-7,-13],[-7,-12]],[[8574,3762],[-30,-96],[-18,-58],[-9,-42],[-3,0],[-5,0],[-4,-2]],[[8433,3609],[13,36],[10,31],[8,18],[8,17]],[[8472,3711],[7,14],[7,14],[2,3]],[[8472,3711],[-6,5],[-4,3],[-5,4],[-2,2],[-12,10],[-8,5],[-16,-28],[-5,-9],[-24,18]],[[8390,3721],[20,38]],[[8410,3759],[8,14],[9,15]],[[8359,3664],[5,10],[7,12],[4,8],[7,12],[8,15]],[[8360,3787],[24,-18],[20,-15],[6,5]],[[8068,3836],[8,15],[4,8],[6,12]],[[8129,3839],[-11,-20],[-9,-15],[-8,7],[-25,19],[-8,6]],[[8059,3820],[5,8],[4,8]],[[533,371],[-1,-3],[-1,-6],[-3,-6],[-2,-4],[-5,-11],[-5,-9],[-2,-3],[-2,-5],[-2,-7],[-1,-3],[-1,-6],[-1,-5],[-1,-7],[0,-5],[0,-7],[0,-5],[0,-6],[1,-8],[2,-10],[1,-5],[2,-15],[0,-4],[0,-3],[0,-2],[-1,-4],[-1,-6],[-1,-3],[-3,-7],[-2,-6],[-1,-4],[0,-4],[-1,-5],[0,-7]],[[502,180],[0,-3],[3,-10],[1,-3]],[[506,164],[-2,-2],[-5,-3],[-10,-8],[-7,-6],[-7,-7],[-7,-8],[-10,-11],[-8,-10],[-6,-11],[-4,-6],[-8,-16],[-9,-18]],[[423,58],[-1,1],[-5,3],[-5,-4],[0,-4],[-3,2],[-18,14],[-23,19],[-30,17],[-6,1],[-1,3],[3,0],[33,-17],[26,-22],[2,5],[-15,16],[3,1],[23,-16],[16,-13],[2,5],[-15,9],[-17,14],[-19,30],[0,3],[4,4],[1,7],[-1,6],[3,10],[0,9],[6,14],[2,3],[1,7],[0,2],[-1,5],[-14,19]],[[374,211],[19,37]],[[393,248],[7,-11],[11,-16],[5,-8],[4,-6],[13,-19],[5,11],[21,39],[17,35],[18,33],[3,5],[14,25],[7,14],[9,17],[-1,6],[5,-4],[2,2]],[[393,248],[-2,3],[-4,6],[-6,14],[4,7],[9,16],[15,30],[18,34],[-24,17],[-24,18],[-21,16],[-3,2],[-70,53],[-1,0],[-1,0],[-2,-1],[-3,0],[-3,4],[-13,22],[-8,15],[-10,15],[-4,8],[-30,33],[-19,19],[-10,11],[-4,5],[-3,3],[-2,3],[-4,11],[-3,8],[-1,11],[0,2],[-1,3],[0,7],[5,1],[8,1],[21,3],[18,2],[10,1],[10,0],[10,0],[10,-1],[42,-5],[12,-2],[41,-5],[4,-1],[50,-6],[59,-8]],[[463,623],[4,-6],[64,-126],[1,-5]],[[532,486],[0,-2],[0,-6],[-1,-8],[0,-17],[1,-11],[3,-25],[1,-13],[1,-4],[0,-7],[-1,-8],[0,-3],[-1,-2],[-1,-5],[-1,-4]],[[790,1603],[48,-45],[181,-263]],[[1019,1295],[-32,-16],[-7,15],[-18,-11],[-70,-42],[8,-20],[-77,-58],[-12,20],[-35,-27],[-72,50],[-19,-33],[-37,-19],[-9,30],[-42,-26],[-5,-68],[-25,-15],[-4,-64],[-45,38],[-148,-241],[27,-17],[3,-8],[62,-154],[1,-6]],[[374,211],[-1,2],[-3,1],[-3,6],[-3,2],[-4,2],[-4,7],[-2,3],[-8,10],[-5,13],[-5,8],[-3,2],[-13,16],[-4,7],[-6,20],[-8,13],[-6,9],[-2,6],[-1,8],[-6,12],[-4,6],[-5,4],[-10,6],[-4,-2],[-8,-8],[-3,0],[-3,5],[-7,1],[-1,8],[-7,11],[-3,8],[-4,3],[-5,7],[-4,0],[-3,-5],[-3,-1],[0,3],[2,5],[2,14],[0,9],[2,5],[2,1],[0,2],[1,3],[2,-3],[8,1],[5,5],[5,7],[5,14],[0,12],[0,5],[-3,12],[-4,9],[-4,6],[-2,7],[-4,3],[-4,1],[-7,-3],[-11,-1],[-7,4],[-5,6],[-4,10],[-2,8],[-9,13],[-2,-1],[-2,-2],[-8,-11],[-3,-7],[-4,-10],[-1,-8],[-2,0],[-2,4],[3,10],[-2,9],[0,6],[-1,3],[-5,5],[-3,1],[-1,6],[2,4],[0,3],[-17,29],[-6,13],[-6,9],[-3,2],[-6,0],[-7,0],[-1,-1],[-3,-1],[-14,-3],[-3,-11],[0,-4],[-4,-4],[-9,1],[-5,-4],[-8,-4],[-3,4],[0,7],[0,5],[-1,4],[-2,2],[-3,1],[-4,-2],[-5,-4],[-6,-5],[-5,-4],[-3,-1],[-3,-2],[-1,1],[0,-3],[-3,1],[-1,2],[-9,2],[-2,-1],[0,-3],[-2,-2],[-3,0],[-2,12],[1,4],[19,3],[0,3],[0,2],[-2,2],[-5,-1],[-6,-1],[-4,-1],[0,3],[-1,4],[-2,6],[0,3],[5,2],[2,-1],[2,1],[2,6],[5,14],[2,8],[5,8],[3,4],[4,3],[4,5],[4,4],[11,0],[14,-7],[4,-4],[2,-11],[2,-7],[5,-8],[7,-4],[4,-1],[3,-3],[3,1],[6,0],[9,1],[4,1],[3,0],[0,2],[-3,5],[1,7],[4,7],[2,10],[4,10],[-3,6],[-3,2],[0,4],[2,4],[3,11],[0,8],[-3,12],[-10,10],[-8,9],[-5,3],[-11,3],[-3,3],[-1,3],[-3,0],[-5,1],[-6,7],[-15,1],[-4,-7],[-4,-1],[-5,2],[-5,9],[-3,10],[-2,9],[-6,14],[2,35],[0,13],[-1,3],[0,4],[-2,8],[5,13],[4,9],[4,12],[-5,5],[-2,3],[0,3],[2,1],[7,-3],[7,2],[3,15],[-1,5],[-10,12],[0,5],[3,8],[5,18],[2,11],[5,8],[3,9],[3,13],[1,15],[2,12],[2,15],[3,9],[1,18],[6,22],[1,6],[3,28],[0,1],[2,3],[1,2],[6,-6],[1,0],[2,-2],[-3,-6],[1,-1],[2,-1],[3,5],[2,-1],[5,12],[2,-1],[-3,-7],[2,-1],[6,12],[9,40],[13,15],[9,3],[6,6],[18,-7],[6,-3],[7,2],[5,8],[4,8],[2,10],[-1,7],[-4,7],[-4,13],[-9,36],[-2,11],[0,4],[1,10],[2,4],[1,1],[3,2],[3,2],[0,3],[2,2],[7,2],[1,3],[2,0],[1,-10],[-1,-10],[13,-7],[3,-14],[1,-4],[5,1],[7,5],[6,6],[2,3],[1,3],[1,3],[4,3],[6,2],[5,0],[6,-8],[0,-5],[4,-3],[3,-1],[4,4],[3,9],[3,3],[2,1],[3,0],[7,10],[2,1],[2,-1],[1,-1],[3,1],[3,1],[1,3],[-5,8],[2,2],[5,-8],[2,0],[2,2],[4,0],[3,-4],[3,2],[2,4],[2,2],[2,0],[1,4],[13,8],[4,0],[8,-4],[5,-1],[3,1],[8,4],[5,1],[7,5],[4,7],[3,10],[1,11],[-1,9],[-4,9],[-5,7],[-7,1],[-3,-1],[-5,0],[-24,14],[-6,8],[-2,7],[2,6],[6,5],[4,1],[27,-1],[8,1],[10,7],[11,3],[8,0],[7,-1],[5,-7],[4,-9],[6,-7],[9,-13],[8,-1],[9,3],[22,0],[12,-1],[5,1],[8,3],[8,5],[5,4],[-1,7],[-13,10],[-1,5],[22,-1],[-1,2],[-3,5],[-5,3],[-3,4],[5,0],[9,-4],[7,4],[12,4],[4,5],[3,11],[0,9],[-4,5],[-3,2],[-13,7],[-3,2],[-3,1],[-5,0],[-13,7],[1,7],[6,13],[6,5],[7,0],[4,0],[3,-4],[5,-1],[3,0],[4,5],[5,11],[2,4],[4,5],[5,7],[8,7],[11,10],[3,1],[3,-9],[1,-2],[12,1],[4,-4],[4,-6],[3,-2],[5,-1],[1,1],[1,5],[1,1],[2,0],[0,-7],[0,-4],[3,0],[2,3],[2,-3],[1,-2],[5,-1],[8,1],[-1,3],[4,6],[7,2],[2,-6],[6,-1],[9,-6],[6,-14],[21,-4],[11,-6],[9,-2],[7,-1],[6,7],[6,0],[9,-2],[6,4],[7,12],[15,12],[2,9],[7,3],[7,14],[6,-12],[9,-1],[1,2],[-6,4],[-1,3],[1,6]],[[919,1105],[19,9],[-8,23],[1,1],[18,10],[49,25],[5,2],[4,2],[11,2],[5,1]],[[1023,1180],[28,-74],[-18,-11],[-19,-12],[-15,-9],[-1,-1],[-1,-1],[0,-1],[-1,-1],[-1,-1],[0,-2],[-3,-9],[-13,-49],[-1,-2],[-1,-4],[0,-1],[-1,-2],[-1,-2],[-2,-1],[-2,-1],[-5,-3],[-4,-2],[-5,16],[-1,2],[0,2],[1,1],[0,2],[2,11],[-8,3],[-2,2],[-1,1],[-1,1],[-1,3],[-3,7],[-6,16],[-18,47]],[[919,1105],[-9,24],[-8,20],[-14,34],[0,3],[1,1],[17,9],[19,11],[-8,20],[-7,17],[0,2],[1,0],[0,1],[0,1],[58,30],[2,0],[2,0],[1,-1],[4,-8],[1,-3],[1,-4],[1,-1],[0,-1],[-1,-1],[-8,-4],[7,-21],[18,9],[26,-63]],[[4094,3309],[23,-28],[-33,-36],[6,-6]],[[4090,3239],[-20,-5],[-13,-16],[-5,-4],[-5,1],[-5,2],[-4,5],[-9,20],[-3,9],[-5,8]],[[4021,3259],[16,16]],[[3947,3388],[8,4],[8,6]],[[3989,3344],[-5,5],[-37,39]],[[4025,3298],[-17,-13],[-2,0],[-12,10],[-12,15],[-4,2],[-5,1],[-4,-2],[-5,-3],[-6,-1],[-10,-14],[-1,-2],[-1,-9]],[[3946,3282],[-24,2],[-7,2],[-22,25],[-9,7],[-36,13],[-6,1],[-2,0],[-4,-2],[-11,-7],[1,3]],[[3826,3326],[10,7],[3,12],[3,13],[-48,15]],[[3794,3373],[-3,1]],[[3791,3374],[3,9],[7,26]],[[3801,3409],[2,-1],[72,-25],[14,-3],[15,-1],[5,0],[6,1],[16,2],[10,3],[6,3]],[[1702,1781],[9,-20],[16,10],[3,0],[21,-47],[32,-68]],[[1783,1656],[8,-18],[-1,-3],[-15,-20],[-7,-8],[-11,-18]],[[1757,1589],[-8,7],[-4,1],[-19,-2],[-25,-10],[-10,-4],[-4,-3],[-5,-5],[-9,22]],[[1673,1595],[15,12],[33,13],[-3,26]],[[1718,1646],[0,4],[-2,9],[-5,12],[-7,-3],[-31,-17],[-12,-7],[-9,-5],[-3,-1],[-2,2],[-6,19],[-8,23],[-7,23],[-3,6],[-5,11],[-2,5],[2,2],[31,20],[12,8],[41,24]],[[1757,1589],[-6,-11],[-4,-4],[-29,-21],[-37,-28],[-4,-2],[-2,-2],[-8,-3],[-6,-1],[-2,26],[0,8],[-2,27],[1,4],[12,11],[3,2]],[[1515,1277],[-13,1],[-3,0],[-4,-2],[-17,39],[-2,5],[-30,-19],[-1,0],[0,-1],[3,-19],[0,-1],[1,-1],[1,0],[1,0],[13,7],[1,0],[1,0],[1,0],[1,-1],[1,-1],[8,-17],[2,-5],[1,-5],[4,-27],[1,-1],[5,2],[3,0],[4,0],[8,-1],[1,-5],[2,-14],[1,-9],[-2,-26]],[[1507,1176],[-9,1],[-11,1]],[[1487,1178],[-3,4],[2,34],[-10,5],[-11,51],[-11,-7],[-9,2],[-8,15],[-5,32],[-14,99],[26,13],[-9,52]],[[1435,1478],[45,25],[17,-37],[24,11],[-3,16],[42,12]],[[1560,1505],[5,-19]],[[1565,1486],[-4,-2],[-14,-6],[-9,-6],[-12,-6],[-42,-22],[6,-23],[7,-20],[6,-17],[4,-11],[3,-5],[5,-11],[5,-9],[4,-6],[1,-6],[1,-5],[-1,-6],[-2,-9],[-3,-15],[-5,-24]],[[1565,1486],[11,-56],[3,-18],[1,-9],[1,-5],[2,-13],[4,-22],[8,-45],[0,-20],[0,-10]],[[1595,1288],[-52,-11],[-11,-2],[-4,-1],[-13,3]],[[1595,1288],[2,-9],[6,-19],[8,-21],[-36,-19],[-4,-4],[-5,-3],[-7,-7],[-10,-12],[-3,-4],[-12,-23],[-4,3],[-9,3],[-5,2],[-3,1],[-6,0]],[[1832,1366],[-6,-5],[-12,-10],[-11,-8],[-4,-2],[-7,-3],[-2,-1],[-6,0],[-3,0],[-6,1],[-8,6],[-5,3],[-15,10],[-4,3],[-3,2],[-11,8],[3,4],[2,5],[1,4],[1,5],[2,5],[1,4],[0,6],[0,12],[4,0],[5,1],[2,1],[5,3],[4,2],[5,1],[3,1],[1,0],[2,2],[1,3],[5,-4],[2,0],[1,0],[1,0],[14,4],[1,0],[0,1],[0,1],[0,1],[-4,22],[-2,14],[-1,1],[0,1],[-1,1],[-14,2],[0,8],[1,16]],[[1774,1497],[8,-1],[2,0],[2,0],[1,1],[2,0],[2,1],[2,1],[2,2],[6,3],[18,11],[4,3],[2,-6],[2,-7],[1,-5],[0,-3],[0,-2],[-1,-1],[-1,-2],[4,-9],[1,-4],[14,-69],[1,-3],[0,-1],[-18,-13],[-2,-4],[0,-2],[0,-3],[2,-8],[0,-2],[4,-8]],[[1934,1567],[23,-37],[26,-44]],[[1983,1486],[-93,-74],[-2,-2],[-6,-6],[-3,-2],[-6,-5],[-15,-10],[-26,-21]],[[1774,1497],[-1,9],[-8,45],[1,6],[2,6],[13,19],[7,-6],[2,-2],[1,-2],[4,-7],[1,0],[1,0],[14,9],[1,1],[1,1],[0,1],[0,1],[0,1],[-8,18],[-2,3],[-6,6],[13,15],[3,1],[5,1],[-17,8]],[[1801,1631],[12,15]],[[1813,1646],[20,24],[22,2]],[[1855,1672],[1,-13],[5,0],[14,1],[13,1],[1,-1],[1,0],[0,-1],[1,0],[13,-29],[21,-45],[9,-18]],[[1861,1129],[-7,35],[-2,10],[-45,-6],[2,-12],[-15,-4]],[[1794,1152],[-162,-19],[-4,13]],[[1628,1146],[27,10],[6,2],[22,9],[19,9],[10,4],[16,8],[6,3],[-2,6],[-1,3],[-1,5]],[[1730,1205],[43,23],[5,3],[4,3],[6,-5],[16,9],[15,10],[12,9],[19,13],[23,17],[22,19],[23,18],[67,55],[21,17],[7,6],[14,11]],[[2027,1413],[3,-5]],[[2030,1408],[-22,-19],[1,-7],[14,-64]],[[2023,1318],[-11,-5],[-23,-8],[19,-95],[-31,-17],[-14,4],[-19,-2],[-14,51],[-19,-10],[-9,-9],[1,-3],[-14,-6],[16,-73],[-44,-16]],[[1956,1014],[-20,-6],[-16,-5],[-20,-6]],[[1900,997],[-2,11],[-1,5],[2,5],[3,5],[-9,11],[-1,3],[-1,4],[-3,14],[-9,42],[-5,23]],[[1874,1120],[-13,9]],[[2023,1318],[1,-3],[5,-25],[5,-23],[-19,-5],[3,-15],[0,-5],[-4,-10],[-1,-5],[2,-6],[3,-3],[6,-8],[2,-5],[2,-8]],[[2028,1197],[-15,-4],[-6,-2],[-4,-1],[-10,-7],[-6,-6],[-7,-5],[-10,-11],[-3,-3],[-4,-4],[-2,-1],[-5,-2],[-14,-6],[-6,-4],[-2,-2],[-2,-2],[-2,-3],[-3,-6],[-1,-3],[-2,-8],[-1,-7],[0,-11],[0,-13],[14,1],[3,-2],[1,-4],[1,-3],[14,-64]],[[1874,1120],[-22,-9],[6,-25],[5,-22],[2,-11],[1,-5],[0,-5],[-1,-9],[-1,-1],[-1,-1],[-1,-1],[-1,0],[-24,6],[-22,5],[1,10],[0,9],[0,9],[-5,21],[-6,27],[-6,27],[-2,0],[-1,1],[0,1],[0,1],[0,1],[1,0],[-3,3]],[[1900,997],[14,-65],[72,-11],[9,-12],[5,-4],[-2,-2]],[[1998,903],[-54,-16],[-40,-10],[-47,-12],[-45,-12],[1,-6]],[[1813,847],[-136,-37],[-38,-8],[-32,-9],[-54,-17]],[[1553,776],[-46,314],[-1,2]],[[1506,1092],[0,1],[7,3],[12,6],[16,8],[19,9],[19,8],[9,4],[16,6],[24,9]],[[2040,958],[4,-7],[4,-5],[10,-8],[3,-2],[3,-5],[3,-11],[-69,-17]],[[1956,1014],[8,2],[2,0],[1,0],[3,-2],[28,-22],[7,17]],[[7827,2883],[-1,2],[-31,15]],[[7795,2900],[-50,27]],[[7745,2927],[13,22],[3,1],[2,4],[3,3]],[[7766,2957],[2,4],[1,2],[7,10],[8,9]],[[7784,2982],[21,-21],[20,-19],[7,-7],[9,-9],[9,-9]],[[7850,2917],[-3,-5],[-14,-20],[-2,-3],[-4,-6]],[[2028,1197],[20,4],[21,4]],[[2069,1205],[13,3],[4,-1],[3,-2],[2,-5],[4,-35],[1,-24]],[[2096,1141],[3,-24],[0,-6],[0,-3],[-1,-4],[-1,-3],[-4,-5]],[[1830,564],[-15,90]],[[1815,654],[-23,137],[-2,10],[1,4],[2,1],[28,7],[-1,5],[-1,4],[-1,3],[-1,5],[-2,7],[-2,10]],[[1813,847],[66,16]],[[1879,863],[3,-17],[1,-4],[0,-3],[1,-4],[0,-3],[3,-2],[2,-7],[-1,-3]],[[1888,820],[3,-9],[5,-15],[5,-18],[21,-101]],[[1922,677],[18,-86]],[[1940,591],[-36,-9],[-42,-9],[-19,-4],[-13,-5]],[[2004,847],[5,-26],[12,-61],[0,-3],[0,-2],[-1,-1],[-1,-1],[-4,-3],[-5,-3],[-10,-3],[6,-29],[-19,-11],[-23,-12],[-9,-5],[-12,-4],[-21,-6]],[[1888,820],[25,7],[22,5],[34,9],[4,0],[5,-2],[6,-2],[5,1],[4,2],[6,4],[5,3]],[[2077,670],[-5,-3],[-30,-27],[-12,-10],[-11,-8],[-12,-8],[-17,-9],[-10,-4],[-18,-5],[-22,-5]],[[2004,847],[21,5],[43,11],[5,-23],[5,-22],[5,-24],[6,-29],[-17,-11],[-3,-1],[0,-3],[5,-21],[-18,-10],[-2,-3],[0,-4],[4,-20],[3,-1],[9,5],[7,-26]],[[1962,486],[-1,4],[0,17],[-4,9],[-4,10],[-13,65]],[[2077,670],[15,8],[14,5],[26,9],[4,1],[30,10],[16,5],[5,3],[4,2],[3,1],[5,3],[6,4],[5,4],[5,4]],[[2215,729],[4,5],[9,10]],[[2228,744],[35,-8],[37,-30]],[[2300,706],[-2,0],[-10,-1],[0,-2],[-15,-8],[7,-17],[-5,-2],[-8,12],[-2,-1],[-2,-1],[-1,-3],[-3,-5],[-4,-5],[-6,-10],[-8,-9],[-7,-3],[-7,-3],[-5,-3],[-16,-5],[-4,9],[-4,1],[-2,-2],[-2,-6],[-8,0],[0,-4],[-3,-2],[-5,1],[-1,3],[-2,0],[0,-5],[0,-2],[-2,-1],[-5,-1],[-2,4],[-1,1],[-4,0],[-17,-5],[-3,-1],[-5,-4],[-4,-2],[-8,-7],[-6,-5],[-2,-3],[1,-6],[0,-2],[-3,-2],[-2,0],[-3,1],[-14,0],[-2,0],[-1,-2],[0,-4],[-1,-2],[-1,-1],[-1,1],[-3,4],[-7,0],[-5,3],[-6,0],[-2,-3],[-13,-8],[-5,-11],[-6,-4],[-4,-5],[-3,-2],[-8,-6],[-6,-3],[-5,-5],[-4,-8],[-2,-10],[-3,-8],[-5,-8],[-4,-5],[-2,-4],[-2,-8],[-2,-3],[-16,-1],[-3,-2],[-7,-5],[-4,-4]],[[2537,873],[-28,28]],[[2509,901],[31,18]],[[2540,919],[68,41],[7,-27],[2,-12],[2,-3],[2,-1],[14,-3],[14,-4],[10,-3],[16,-8],[16,-10]],[[2691,889],[9,-5],[6,-4],[4,-4],[4,-2],[13,-10],[6,-6],[6,-2],[51,-24],[28,-13],[6,2],[5,3],[5,4],[4,7],[3,7],[1,8],[1,5],[0,1],[-1,4],[0,3],[3,1],[4,2],[5,3],[8,3]],[[2862,872],[11,3],[11,3],[5,2]],[[2889,880],[9,-7]],[[2898,873],[-4,-1],[-5,-5],[-12,-3],[-18,-8],[-2,-4],[0,-8],[-1,-5],[-1,0],[-3,1],[-4,-3],[-3,-2],[3,-3],[-2,-5],[5,-7],[-5,-6],[-4,3],[-7,-7],[-2,2],[-1,-2],[1,-2],[-4,-14],[-8,-7],[-10,-1],[-3,-4],[-4,-5],[-9,0],[-2,0],[1,20],[-3,13],[-1,1],[-3,-1],[-3,-3],[-2,1],[-7,5],[-1,1],[-7,1],[-3,1],[-2,2],[-7,4],[-7,2],[-9,4],[-4,4],[-3,0],[-2,2],[-2,2],[-3,9],[-1,11],[-2,5],[-6,3],[-6,5],[-5,-2],[-6,3],[-3,3],[-14,8],[-9,7],[0,1],[-1,1],[-7,1],[-5,1],[-14,8],[-6,2],[-4,3],[-11,4],[-10,5],[-3,0],[-7,-1],[-5,-3],[-9,-6],[-2,-2],[-9,-4],[-20,-9],[-8,-6],[-7,-2],[-6,-7],[-2,-1]],[[1618,401],[-2,10]],[[1616,411],[-4,21]],[[1612,432],[15,23],[11,13],[9,8],[12,8],[6,4]],[[1665,488],[6,-35],[6,-30],[10,3],[24,6],[18,5],[6,2],[6,2],[10,1],[-14,83],[28,12],[43,18],[22,9]],[[1962,486],[-10,-12],[0,-4],[2,-4],[2,-3],[4,-13],[0,-4],[-1,-7],[1,-11],[-3,-8],[-11,-13],[-4,-2],[-20,-2],[-2,-1],[-8,0],[-3,1],[-4,6],[-7,14],[-3,4],[-1,4],[-5,2],[-4,10],[-2,4],[-3,4],[-3,0],[-9,-4],[-2,0],[-8,-2],[-6,-2],[-8,-5],[-9,-2],[-5,-7],[-10,-11],[-7,-10],[-4,-4],[-18,0],[-7,5],[-4,4],[-10,4],[-8,4],[-5,1],[-7,1],[-8,-1],[-9,-2],[-14,-6],[-7,-5],[-10,-2],[-12,-5],[-17,-3],[-13,3],[-13,2],[-23,0],[-6,-3]],[[1665,488],[22,14],[12,8],[9,4],[1,3],[-4,22],[-3,15],[-1,9],[-12,74]],[[1689,637],[6,1],[5,0],[4,1],[14,4],[15,3],[12,2],[14,1],[33,3],[23,2]],[[1612,432],[-14,74],[-20,109]],[[1578,615],[-16,112]],[[1562,727],[9,3],[22,7],[21,6],[11,-65],[4,-25],[13,3],[1,-5],[4,-21],[19,4],[12,3],[11,0]],[[1562,727],[-4,21],[-1,5],[-4,23]],[[1578,615],[-12,-7],[-24,-14],[-4,-2],[-6,-3],[-11,-3],[-11,-2],[-16,-9],[-16,-9]],[[1478,566],[-5,34],[-8,47],[-26,-14],[-7,33],[-5,-2],[-8,-4],[-13,-4],[-6,-1],[-3,-1],[-15,-3],[-7,-4],[-19,-11],[-26,-16],[-43,-26],[-13,-8]],[[1274,586],[-31,-18],[-16,-9],[-12,-7],[-2,-3],[-1,-1],[-1,-3],[0,-1],[0,-4],[1,-12],[-1,-4],[-1,-3],[-3,-3],[-4,-2],[-3,0],[-3,0],[-3,0],[1,-12],[-34,-20],[-28,-17],[-7,-4],[-9,-5],[-11,-8],[-13,-9],[-3,-3],[-6,-4],[-2,-1],[-4,-2],[-48,-29],[0,-1]],[[1030,401],[-9,19],[-26,-16],[-40,-24],[-1,-1],[-1,-1],[0,-1],[-12,-118],[-28,3],[-12,-128],[0,-3],[0,-5],[2,-8],[5,-14]],[[908,104],[-9,-3],[-7,-2],[-7,-1],[-8,0],[-23,-1]],[[854,97],[4,44],[9,91],[3,33],[5,93],[-1,4],[21,226],[4,2],[7,3],[3,1],[4,2],[4,1],[1,1],[1,1],[5,2],[2,1],[2,2],[6,3],[2,1],[1,1],[1,0],[8,7],[4,2],[5,4],[8,7],[9,7],[1,1],[2,2],[4,4],[7,6],[1,1],[21,18],[19,17],[2,2],[3,3],[11,10],[24,21],[24,21],[1,1],[2,2],[19,17],[57,51],[14,12],[13,12],[4,3],[1,1],[1,1],[12,11],[12,11],[7,6],[8,7],[41,36],[35,31],[3,3],[5,4],[19,18],[24,21],[20,18],[9,8],[17,15],[7,6],[13,10],[16,12],[6,4],[5,4],[8,5],[5,3],[4,2],[5,3],[4,3],[6,3],[4,2],[8,4]],[[1478,566],[-24,-14],[-7,-5],[-14,-9],[-12,-5],[-25,-12],[-20,-8]],[[1376,513],[-12,-4],[-22,-15],[-24,-16],[-10,-7],[-11,-8],[-22,-10]],[[1275,453],[-2,3],[-1,15],[-1,14],[0,10],[0,8],[3,16],[2,11],[0,10],[0,10],[0,11],[-2,25]],[[2801,2509],[-8,14],[-43,35],[-3,3],[-21,35],[9,8],[3,6],[12,31],[20,-11],[11,-5]],[[2857,2557],[-5,-3],[-19,-17],[-32,-28]],[[3801,3409],[3,11],[2,-2],[8,-9],[3,0],[10,15],[10,-3],[4,-1],[2,0],[1,-1],[2,0],[2,7],[-2,5],[-26,26],[-59,63],[-13,-1],[-3,0],[-2,14],[-1,9]],[[3801,3409],[-36,12]],[[3765,3421],[-3,4],[-9,9],[-47,48],[-56,57],[-2,9]],[[3648,3548],[12,-2],[10,-3],[30,-6],[16,-2],[6,2],[10,4],[10,1]],[[3626,3472],[24,-11],[34,-12],[19,-6],[49,-18],[13,-4]],[[3791,3374],[-69,29]],[[3722,3403],[-59,23],[-37,46]],[[3794,3373],[-12,-48]],[[3782,3325],[-1,0],[-1,1],[-15,16],[6,8],[4,15],[-1,3],[-34,12],[-5,-7],[-6,-8],[-17,-14],[-2,-3],[0,-2],[10,-16],[17,-23],[12,-16]],[[3749,3291],[-16,-15],[-5,-6],[-6,-10],[-6,-16],[-3,-14]],[[3713,3230],[-18,5],[4,21],[4,16],[0,5],[-1,4],[-16,23]],[[3686,3304],[-6,9],[-7,10],[-71,-56],[-7,11]],[[3595,3278],[49,40],[61,74],[5,9],[12,2]],[[3782,3325],[-5,-20],[-3,-7]],[[3774,3298],[-7,-1],[-10,-1],[-8,-5]],[[3713,3230],[-1,-24]],[[3712,3206],[-35,11],[-10,2],[-11,-1],[-10,-2],[-2,-2],[0,-3],[1,-3],[17,-20],[2,-3],[-16,-10],[-19,23],[-3,9],[-3,1],[-16,-6],[-2,-3],[0,-3],[2,-3],[27,-31],[-16,-13]],[[3618,3149],[-15,17],[-14,17],[-7,14],[-5,12]],[[3577,3209],[16,10],[6,3],[17,7],[-5,15],[27,22],[16,12],[32,26]],[[3712,3206],[-1,-60]],[[3711,3146],[5,-45]],[[3716,3101],[-39,-6],[-11,-5],[-13,-9]],[[3653,3081],[-7,21],[-6,17],[-3,7],[-6,8],[-13,15]],[[3577,3209],[-16,-12],[-3,-4],[-10,-12],[-3,-7],[-4,-15],[-1,-10],[-2,-17],[-2,-10],[-6,-12],[-6,-9],[1,-1],[8,-15],[13,-24],[-1,-2],[-13,-10],[-10,18],[-13,24],[-10,-8],[-7,-6],[-5,-9]],[[3487,3068],[-10,5],[-11,3],[-13,0],[-9,-2],[-7,-3],[-9,-6],[-9,-7],[-16,-13],[-18,-14]],[[3385,3031],[-39,66]],[[3346,3097],[-25,44]],[[3321,3141],[18,14],[5,-10],[151,119],[27,-41],[73,55]],[[3321,3141],[-29,48]],[[3292,3189],[18,14],[20,16],[13,10]],[[3343,3229],[28,-47],[20,17],[20,16],[131,103],[1,2],[-1,4],[-12,20],[-14,23]],[[3516,3367],[22,16],[32,26],[26,21],[-94,34],[-79,30],[-12,21]],[[3411,3515],[-4,7],[-7,21]],[[3528,3531],[15,-10],[56,-35],[17,-9],[10,-5]],[[3343,3229],[11,9],[10,8],[20,16],[10,8]],[[3394,3270],[68,54],[21,16],[20,16]],[[3503,3356],[13,11]],[[3394,3270],[-14,23],[12,10],[-12,20],[-3,7],[-3,4],[-12,19],[-12,-9]],[[3350,3344],[-13,24],[68,54]],[[3405,3422],[20,18],[20,17],[23,-41],[12,-20],[12,-20],[11,-20]],[[3292,3189],[-25,42]],[[3267,3231],[-10,18]],[[3257,3249],[18,14],[-3,10],[-1,9],[1,9],[3,8],[11,18],[20,-16],[7,11],[6,6],[4,4],[27,22]],[[3257,3249],[-20,36],[13,10],[-6,11],[-13,-11],[-8,14],[-2,3]],[[3221,3312],[22,17],[-3,6],[-2,6],[0,21],[33,30],[5,5],[10,9],[15,14],[16,14],[22,-32],[17,13],[10,8],[16,12]],[[3382,3435],[11,8],[12,-21]],[[3382,3435],[-23,32],[-10,-9],[-18,20]],[[3331,3478],[-11,11],[13,18],[14,-15],[1,0],[2,0],[17,17],[10,11],[3,4],[3,0],[20,-7],[8,-2]],[[3331,3478],[-17,-16],[-48,49],[-54,56],[-25,25],[8,3],[7,4],[9,3],[13,2]],[[3224,3604],[17,-19],[29,-11],[68,-26],[-46,55]],[[3292,3603],[9,0],[7,0]],[[9039,4992],[-6,1],[-27,7],[-17,5],[-13,4],[-7,4],[-39,21],[-14,3],[-17,9]],[[8899,5046],[5,12],[4,11],[17,-9],[4,12],[5,12],[-17,9],[-9,5]],[[8908,5098],[8,24],[9,23]],[[8925,5145],[5,12],[4,12],[6,14],[0,3],[2,7]],[[8942,5193],[7,3],[6,1],[4,-1],[6,1],[5,0],[6,-1],[3,-1],[13,9],[1,0],[4,10],[3,5]],[[9000,5219],[3,-1]],[[9040,5199],[-24,-47],[4,-4],[-3,-9],[6,-5],[-2,-4],[19,-12],[5,12],[4,-2],[36,72],[-2,2],[25,45],[5,-3],[-18,-41],[4,-6],[1,-4],[-3,-10],[-3,-3],[-3,-6],[-3,-6],[-2,-5],[3,-5],[7,-11],[0,-3],[0,-3],[0,-3],[3,-3],[2,5],[38,59],[11,-9],[-75,-125],[-13,-25],[-23,-48]],[[8942,5193],[-9,4],[-15,8],[-9,5]],[[8927,5255],[60,-30],[3,-2],[10,-4]],[[8474,3994],[10,-7],[14,-12]],[[8498,3975],[26,-20]],[[8446,4016],[12,22],[8,-6],[13,-10],[8,-6]],[[8487,4016],[24,-19],[-13,-22]],[[8418,4037],[9,16],[3,6],[7,13],[9,14],[13,24]],[[8459,4110],[27,-21]],[[8486,4089],[10,-7],[18,-15]],[[8514,4067],[-6,-11],[-15,-28],[-6,-12]],[[8597,4005],[2,-1],[1,-1],[1,-1],[3,-3],[-2,-7],[5,-1],[3,-1],[12,-4],[12,-3]],[[8634,3983],[-13,-66],[6,-2],[-7,-34]],[[8514,4067],[17,-13],[16,-12],[10,-9],[4,-1],[5,-4],[19,-14],[6,-4],[6,-5]],[[3440,1055],[-2,1],[-17,26],[-5,3],[-5,3],[-6,-1],[-7,-3],[-8,-10],[-4,-8],[-3,-9],[-57,-8],[-6,-8],[-3,-2],[-2,-3],[-9,-6],[-1,-3],[-2,-1],[-4,-5],[-3,0],[-6,6],[-3,1],[-7,0],[-1,4],[-2,0],[-7,0],[-4,-2],[-12,-3],[-5,-1],[-10,0],[-5,-1],[-2,-3],[-3,-3],[-11,2],[-1,1],[-4,4],[-2,1],[-4,-1],[-10,-4],[-6,-5],[-3,-3],[-8,-5],[-6,-1],[1,-3],[-3,-4],[-7,-4],[-5,0],[-1,-1],[0,-2],[-1,-2],[0,-1],[2,-4],[0,-1],[-6,-14],[-1,-4],[1,-3],[17,-12],[-7,-7],[0,-5],[-4,-5],[-14,-6],[-6,-2],[-34,-20],[-5,-5],[-2,-3],[-10,-9],[-4,-7],[8,-11],[5,-7],[0,-4],[7,-4],[-1,-2],[7,-7],[2,2],[3,-2],[-6,-10],[-2,1],[-1,0],[2,-2],[1,-4],[-1,-2],[-14,-22],[-6,0],[-5,2],[-8,0],[-4,4],[-2,4],[-2,2],[-7,2],[-5,-2],[-9,-7],[-4,-1],[-12,-10],[-8,-9],[-3,-2],[1,-10],[3,-9],[1,-9],[0,-6],[-2,-4],[-4,-1],[-4,0],[-4,2],[-7,5],[-5,8],[-1,3],[0,4],[1,7],[6,11],[0,7],[-2,5],[-1,7],[-1,5],[1,7],[2,3],[-1,6],[-5,8],[-5,8],[-2,5],[-2,0],[-1,0],[-1,1],[-2,5],[-1,0],[-8,0],[-7,2],[-6,0],[-3,4],[-2,0],[-8,-2],[-4,0],[-4,5],[-9,4],[-4,-2],[-1,0],[-3,0],[-3,4],[-5,3],[-4,-3],[-6,-1],[-6,0],[-3,-1],[0,-1]],[[2889,880],[5,1],[12,4],[-5,22],[22,7],[8,-30],[10,-4],[5,-1],[7,-1],[-5,45],[5,1],[13,4],[20,7],[14,5],[21,7]],[[3021,947],[11,-49],[13,4],[4,3],[4,4],[4,4],[3,3],[15,8],[8,3],[26,7],[16,3],[6,2],[3,1],[3,3],[2,5],[5,10],[2,8],[1,11],[1,7],[4,9]],[[3152,993],[7,10],[6,6],[8,6],[9,6],[6,4],[8,3],[7,3],[6,1],[7,-1],[8,-1],[6,1],[3,0],[19,4],[5,1],[10,0],[14,-1],[8,-1],[8,2],[8,5],[15,18]],[[3320,1059],[22,26],[11,12],[19,21],[11,13],[6,7],[10,9],[8,6],[13,6]],[[3420,1159],[5,4],[20,-86],[-5,-22]],[[2889,880],[3,18],[-16,73],[-53,204],[-1,4]],[[2822,1179],[2,1],[9,4],[1,0],[34,16],[34,16],[20,9],[17,7],[14,6],[27,11],[1,-4],[1,-6],[2,-16]],[[2984,1223],[3,-19],[5,-32],[6,-23],[3,-13],[2,-9],[7,-22],[14,-55]],[[3024,1050],[16,-66],[8,-27],[-27,-10]],[[3024,1050],[19,8],[3,2],[23,7],[20,7],[20,7]],[[3109,1081],[4,-14],[9,-23],[4,-18],[3,-1],[3,-3],[20,-29]],[[3120,1129],[-6,-1],[-5,-2],[-2,-1],[-2,-3],[-1,-4],[0,-6],[5,-31]],[[2984,1223],[8,1],[4,-1],[14,-3],[9,-1],[13,-1]],[[3032,1218],[0,-2],[2,-10],[4,-17],[0,-2],[1,-2],[1,-1],[1,0],[20,-3],[7,0],[19,6],[4,1],[2,-3],[13,-17],[4,-6],[4,-6],[2,-6],[2,-7],[1,-9],[1,-5]],[[3120,1129],[2,2],[10,3],[32,10],[34,11]],[[3198,1155],[24,10],[11,8],[25,17],[17,11],[7,5],[17,11]],[[3299,1217],[1,-3],[2,-8],[0,-2],[1,-5],[0,-5],[-18,-12],[-1,-2],[0,-3],[0,-2],[16,-64],[5,-24],[4,-15],[2,-4],[9,-9]],[[3032,1218],[6,1],[14,4],[9,1],[8,0],[8,0],[3,1],[2,-1],[0,7],[3,10],[2,7],[4,5],[3,4],[22,16],[4,3],[5,10],[2,7],[33,10],[1,-1],[0,-1],[4,-15],[5,-20],[6,-22],[8,-33],[3,-12],[11,-44]],[[2822,1179],[0,1],[-5,18]],[[2817,1198],[114,52],[45,19],[45,20],[49,23],[20,8]],[[3090,1320],[27,11],[95,42]],[[3215,1375],[2,-11],[3,-13],[0,-1],[3,-13],[1,-3]],[[3224,1334],[1,-4],[23,7],[-2,-7],[0,-5],[1,-2],[10,-40],[6,-24],[6,-23],[23,8],[26,10],[7,4],[-5,21],[-6,23],[-11,48],[24,12],[39,22],[25,-104]],[[3391,1280],[-31,-21],[-61,-42]],[[3224,1334],[1,0],[3,1],[29,9],[5,2],[7,2],[14,5],[10,4],[10,4],[16,8],[9,5],[11,6],[8,4],[8,5],[12,8],[4,3],[12,7],[9,7],[11,8],[5,3],[13,8],[14,10],[7,5],[18,12],[13,9],[1,-4],[1,-3],[0,-2],[20,-81]],[[3495,1379],[-20,-19],[-4,-7],[-4,-7],[-3,-8],[-1,-8],[-2,-12],[-1,-18],[-15,1],[-12,-4],[-22,-7],[-9,-3],[-11,-7]],[[3948,1440],[2,-9]],[[3950,1431],[-5,0],[-2,1],[-3,5],[-3,8],[-9,5],[-2,3],[-10,9],[-6,4],[-4,4],[-3,2],[-15,5],[-3,3],[-4,0],[-14,0],[-8,6],[-3,2],[-7,4],[-24,15],[-5,2],[-11,3],[-8,1],[-2,-1],[-12,-8],[-13,1],[-3,7],[-4,3],[-10,3],[-2,3],[-3,1],[-13,4],[-36,-1],[-5,2],[-24,2],[-4,-5],[-1,-6],[-5,-1],[-4,3],[-8,0],[-11,-3],[-5,-7],[-5,0],[-2,1],[-7,0],[-10,-7],[0,-12],[-11,-10],[-16,-11],[-21,-20],[-2,-7],[2,-5],[2,-8],[-2,-3],[-2,-11],[-3,-8],[-5,-6],[-13,-12],[-5,-2],[-7,6],[-3,-2],[0,-3],[-13,-8],[-3,1],[-3,-2],[-19,-15],[-11,-12],[-8,-9],[-3,-8],[0,-6],[6,-2],[2,-8],[2,-12],[-4,-15],[-7,-22],[-4,-3],[-9,-20],[0,-4],[6,-20],[1,-7],[0,-9],[-2,-16],[-2,-5],[-2,-1],[-1,-1],[0,-3],[-4,-13],[-1,-9],[-1,-1],[3,-12],[0,-11],[0,-7],[6,-7],[5,-8],[12,-9],[1,-6],[1,-10],[-3,-1],[-4,0],[-3,-5],[0,-4],[-1,-6],[-6,-10],[-2,-6],[-4,0],[-4,-2],[-2,-4],[-5,3]],[[3420,1159],[-29,121]],[[3495,1379],[8,6],[9,5],[7,3],[4,2],[6,3],[6,6],[4,6],[5,10],[2,7],[2,8],[1,7],[1,7],[-1,6],[-1,5],[0,5],[1,6],[5,6],[4,3],[23,13],[5,3],[7,2],[4,3],[9,7],[5,3],[15,4],[5,3],[15,12],[5,2],[4,1],[3,-1],[5,0],[4,-1],[24,-1],[7,0],[6,1],[9,1],[2,0],[3,-1],[5,-1],[3,-1],[3,0]],[[3729,1529],[5,0],[4,-1],[9,-3],[12,-4],[3,-1],[6,-2],[6,-1],[3,1],[11,5],[5,1],[1,0],[4,-1],[1,0],[29,-12],[6,-3],[8,-7],[12,-7],[16,-7],[6,-2],[10,-2],[3,-1],[5,-2],[6,-2],[10,-6],[6,-5],[26,-21],[6,-6]],[[2801,2509],[-22,-21]],[[2779,2488],[-19,-15]],[[2760,2473],[-71,115]],[[2689,2588],[20,16],[7,8],[15,39]],[[2731,2651],[13,36],[4,7],[6,7],[5,5],[16,13]],[[2775,2719],[12,-20],[13,-24],[8,-13],[11,-6]],[[3648,3548],[-13,2],[-9,1],[-11,0],[-18,-2],[-16,1],[-16,2],[-4,11],[-4,3],[-14,4],[-2,2],[-5,19],[-14,-10],[-2,0],[-43,17],[2,8],[-2,3],[-35,35],[-17,-22],[6,-6],[17,-7],[-6,-21]],[[3442,3588],[-3,4],[-14,12],[-100,116],[-46,48]],[[3279,3768],[8,4],[15,4],[9,4],[10,1],[0,2],[1,1],[11,0],[6,0],[11,-1],[6,-2],[17,-7],[16,-8],[4,-4],[5,-7],[3,-8],[4,-7],[5,-3],[8,-2],[21,0],[2,2],[3,3],[1,1],[27,1],[33,-1],[8,-2],[8,-5],[3,-3],[1,-14],[4,-9],[4,-12],[0,-33],[3,-21],[3,-12],[3,-30],[2,-7],[5,-5],[7,-4],[5,-1],[6,-3],[2,-2],[11,-18],[3,-2],[3,-4],[3,0],[2,1],[3,1],[24,-2],[10,-1],[23,-2],[29,-6],[12,-1],[7,-2],[15,-2],[6,1],[8,4],[7,2],[7,1]],[[5918,1454],[-47,1]],[[5961,1453],[-43,1]],[[5918,1320],[0,8],[0,6],[0,120]],[[5985,1452],[0,-32]],[[5985,1420],[1,-99]],[[5986,1321],[-23,0],[-22,0]],[[5985,1420],[20,0],[20,0],[20,0]],[[6045,1420],[1,-99]],[[6046,1321],[-20,0]],[[6026,1321],[-21,0],[-19,0]],[[6045,1420],[20,0],[20,0],[20,1]],[[6105,1421],[0,-70],[0,-30]],[[6105,1321],[-19,0],[-21,0],[-19,0]],[[6105,1321],[1,-64]],[[6106,1257],[-14,4],[-6,0],[-20,-1],[-20,-1],[-20,-2],[0,64]],[[6045,1420],[-1,67],[21,0],[20,-2],[9,-2],[9,-2],[3,-1]],[[6106,1480],[-1,-59]],[[6109,1506],[-1,-16]],[[6108,1490],[-1,-4],[-1,-6]],[[3833,2087],[-15,-12],[-3,-3],[-13,-10],[-3,-1],[-7,-4],[-15,-3],[-9,-4],[-6,-4],[-59,-48]],[[3703,1998],[-11,19],[-32,53],[-3,1],[-8,-6],[-6,-3],[-16,-4],[-5,11],[-12,19],[-11,17],[-21,35],[-15,-13]],[[3563,2127],[-11,18],[-11,20],[-30,-24],[-11,18],[-5,9],[-33,-26]],[[3462,2142],[-31,83],[-17,-14],[-8,-8],[-6,-13],[-15,-42],[-5,-9],[-6,-7],[-15,-13],[-32,-27],[-7,-5]],[[3320,2087],[-26,-23],[-45,-36]],[[3249,2028],[-31,-27],[-23,-21],[-2,-2],[-1,-3],[-12,-9],[-16,-14],[-17,-14],[-15,-12],[-25,-21],[-4,-2],[-12,-5],[-2,0],[-5,-2]],[[3084,1896],[-6,22],[-7,26],[-5,15],[-2,8],[-3,6],[-7,14],[-11,18],[-7,12],[-17,27],[0,1],[-3,5]],[[2940,2167],[-2,3],[-39,64]],[[2889,2260],[325,267]],[[3214,2527],[9,-22],[13,-27],[24,-39],[2,-3],[3,-5],[215,154],[36,31],[51,35],[37,22],[4,6]],[[3608,2679],[1,1],[11,-17],[4,-7],[8,-14]],[[3632,2642],[14,-25],[14,-23],[4,-6],[3,-5],[2,-5],[1,-1],[15,-25],[15,-25],[10,-17],[8,-12],[12,-22],[5,-10],[2,-4],[15,-26],[7,-12],[8,-14],[9,-14],[14,-24],[13,-20],[35,-61],[54,-93],[6,-9],[5,-8],[16,-24],[-36,-29],[-50,-41]],[[3214,2527],[-2,3],[-6,10]],[[3206,2540],[-13,18],[-12,19],[-3,5],[-9,16],[-17,29]],[[3152,2627],[-15,28]],[[3137,2655],[18,14],[4,3],[18,14],[5,3],[17,15],[4,3],[5,2],[1,1],[5,0],[16,0],[10,0],[12,0],[1,-24],[-1,-14],[31,-4],[0,-7],[1,0],[4,0],[14,-2],[5,0],[4,0],[4,1],[11,3],[11,4],[9,4],[4,3],[54,42]],[[3404,2716],[49,38],[48,37],[26,26],[3,3]],[[3530,2820],[75,-130],[2,-3]],[[3607,2687],[-3,-2],[1,-2],[3,-4]],[[3530,2820],[14,15],[-2,3],[9,10],[-14,23],[15,12]],[[3552,2883],[5,-3],[12,-21],[12,-19],[0,-6]],[[3581,2834],[10,2],[34,26],[43,-73],[-29,-23],[-3,-3],[-3,-8],[-1,-5],[9,-4],[2,-2],[10,-17],[2,-3],[-18,-14],[-8,-6],[-22,-17]],[[3054,2513],[4,4],[5,7],[2,4],[-12,17],[-6,6]],[[3047,2551],[55,47],[11,7],[39,22]],[[3206,2540],[-55,-46],[-5,-4],[-6,-2],[-6,-2],[-10,0],[0,-9],[-1,-5],[-3,-5],[-23,-19],[-3,0],[-11,18],[-29,47]],[[3047,2551],[-3,2],[-27,45]],[[3017,2598],[55,47],[-11,19],[19,16],[18,15],[2,7]],[[3100,2702],[12,-5],[3,-3],[11,-21],[11,-18]],[[3017,2598],[-12,19],[-14,-12],[-13,-11],[-3,1],[-20,20]],[[2955,2615],[-16,17]],[[2939,2632],[41,53],[7,11],[8,25]],[[2995,2721],[7,23]],[[3002,2744],[98,-42]],[[3047,2551],[-113,-95]],[[2934,2456],[-11,23],[-11,19],[-9,17]],[[2903,2515],[11,0],[6,-10],[15,13],[23,19],[-11,18],[16,13],[-7,10],[-15,16],[0,3],[14,18]],[[2913,2339],[14,12],[4,4],[3,6],[2,5],[0,12],[1,22],[1,24],[1,24],[-5,8]],[[3054,2513],[-16,-14],[-15,-13],[-16,-13],[38,-62],[1,-3],[-1,-3],[-13,-11],[-49,-40],[-10,2],[-2,-12],[-1,-2],[-13,-11],[-9,-8],[-14,-12],[-3,0],[-18,28]],[[2889,2260],[-10,16],[-13,21]],[[2866,2297],[10,8],[7,9],[15,13],[15,12]],[[2598,2003],[-63,103],[-3,4]],[[2532,2110],[11,11],[17,12],[12,7],[21,19],[46,39],[54,48],[23,20],[69,59],[5,4],[19,17],[15,12],[4,3]],[[2828,2361],[37,-61],[1,-3]],[[2730,2218],[-21,11],[-4,-10],[-2,-3],[-4,-3],[-22,-20],[0,-2],[12,-19],[0,-3],[-1,-2],[-14,-12],[-24,-21],[-27,1],[-21,1],[-1,-19],[0,-32],[5,5],[46,-2],[7,2],[9,4],[7,5],[38,33],[24,20],[5,6],[7,9],[5,13],[8,22]],[[2762,2202],[9,-3],[8,0],[9,1],[8,4],[8,6],[53,46],[-12,19],[-25,38],[-2,1],[-1,0],[-74,-63],[-1,-3],[-4,-9],[-2,-4],[-6,-17]],[[2751,2876],[-47,-38]],[[2704,2838],[-12,16],[-34,-28],[-15,-12],[-22,36],[-13,21],[-5,8],[-2,4]],[[2601,2883],[70,57]],[[2671,2940],[29,24]],[[2931,1675],[-1,-5],[0,-5],[2,-4],[3,-2],[16,-9],[3,-3],[9,-16]],[[2963,1631],[-3,-4],[-4,-5],[-3,-7],[-3,-8],[-7,1],[-6,-2],[-5,-2],[-4,-3],[-39,-32],[-4,-4]],[[2885,1565],[-4,6],[-8,15]],[[2873,1586],[44,37],[-94,31]],[[2823,1654],[49,41],[5,3],[4,1],[4,-1],[4,-3],[13,-11],[4,-2],[16,-5],[9,-2]],[[2988,1522],[-13,22],[-14,-13],[-3,0],[-26,43],[-17,-14],[26,-43],[0,-2],[-1,-2],[-14,-10],[-2,0],[-1,1],[-25,41],[-13,20]],[[2963,1631],[15,12],[51,42]],[[3029,1685],[14,12]],[[3043,1697],[11,-20],[16,-23],[10,-15],[16,-23],[-1,-2]],[[3095,1614],[-17,-15],[-18,-15],[-18,-15],[-18,-15],[-36,-32]],[[2845,1617],[-22,37]],[[2873,1586],[-9,6],[-8,5],[-5,8],[-6,12]],[[2716,1813],[2,-2]],[[2718,1811],[-13,-4],[-22,-7],[-25,-9],[-2,-1],[-13,-4],[-14,-5],[-58,-21],[-45,-16],[-29,-10]],[[2497,1734],[-1,7],[-2,6],[-3,9],[-3,9],[-3,8],[-9,15],[-4,7],[-4,6],[-2,5],[-7,20]],[[2459,1826],[42,21],[32,16],[-1,5],[-11,17],[-5,9],[-2,3],[-25,41],[-3,9],[-1,8],[-1,9],[0,5],[0,5],[2,11],[3,17],[4,16],[3,12],[0,4],[8,24]],[[2504,2058],[1,-4],[2,-2],[6,-10],[5,-9],[0,-7],[7,5],[10,8],[17,14],[0,1],[0,1],[0,1],[-11,18],[-17,27],[4,4],[4,5]],[[2459,1826],[-2,4],[-7,20],[0,1],[0,2],[0,2],[1,3],[2,10],[-1,5],[-1,4],[-3,5],[-11,22],[-10,22],[-5,6],[0,3],[-3,6],[-1,1],[-1,1],[-1,-1],[-3,-2],[-5,-5],[-3,2],[-2,1],[-2,1],[-2,2],[-2,3],[-1,1],[-6,9]],[[2390,1954],[17,12],[-2,4],[-2,4],[-3,2],[-5,4],[-4,3],[-1,0],[0,1],[0,1],[0,1],[1,1],[13,12],[1,0],[1,0],[5,-3],[1,0],[2,0],[31,27],[0,1],[2,0],[1,0],[10,-4],[8,29],[3,3],[3,4],[14,12],[18,-10]],[[2497,1734],[-12,-4],[-19,-7],[-33,-11],[-11,-4],[-11,-5],[-8,-3],[-6,-3],[-5,-3],[-4,-2],[-9,-5],[-5,-3],[-5,-3],[-6,-4],[-6,-4],[-5,-4]],[[2352,1669],[-3,6],[-3,4],[-7,11],[-10,18],[-23,41],[-25,39]],[[2281,1788],[-13,24],[-19,33],[-2,3]],[[2247,1848],[13,9],[4,3],[1,1],[4,2],[2,1],[2,1],[4,0],[5,0],[2,1],[1,0],[1,1],[2,1],[-7,13],[19,16],[16,14],[1,0],[1,0],[1,0],[10,-5],[1,0],[1,0],[1,0],[10,9],[48,39]],[[2247,1848],[-19,37],[-1,2],[-4,8],[-8,15],[-7,12]],[[2358,2080],[3,-5],[9,-14]],[[2370,2061],[-13,-13],[-20,-19],[0,-1],[0,-1],[0,-1],[11,-16],[20,-33],[2,-4],[2,-2],[4,-6],[3,-3],[2,-2],[5,-2],[2,-2],[2,-2]],[[2281,1788],[-3,-2],[-17,-14]],[[2261,1772],[-11,18],[-5,9],[-5,9],[-1,0],[-11,-9],[-17,-14],[-17,-13],[-12,20],[-17,-14],[-40,-31],[-17,-14]],[[2108,1733],[-7,12],[-2,4],[-1,2],[-2,6],[-3,13],[-1,7],[-2,9],[-2,2],[-9,17],[-5,9]],[[2074,1814],[131,103],[3,5]],[[2188,1714],[-30,-24],[-17,-13]],[[2141,1677],[-21,36]],[[2120,1713],[-12,20]],[[2261,1772],[-12,-10],[-61,-48]],[[2143,1500],[-3,5],[-1,2],[-3,4],[-24,42],[-5,9]],[[2107,1562],[71,56],[3,2],[1,1],[1,2],[0,1],[1,2],[4,11],[2,6],[5,16],[0,1],[1,2],[1,1],[14,11],[-11,20],[-12,20]],[[2352,1669],[-2,-1],[-1,-1],[-7,-5],[-19,-16],[-44,-36],[-11,-9]],[[2268,1601],[-38,-31],[-35,-28],[-26,-21],[-8,-7],[-18,-14]],[[2107,1562],[-12,19],[-12,20],[-11,21]],[[2072,1622],[52,41],[17,14]],[[7765,4113],[9,-6],[28,-21],[3,-3]],[[7805,4083],[-7,-13],[-5,-9],[-8,-15]],[[7864,4039],[-37,27]],[[7827,4066],[6,11],[5,7],[3,8],[4,7],[5,9]],[[7850,4108],[5,10],[8,13],[0,2]],[[7863,4133],[8,-6],[20,-15],[9,-6]],[[7900,4106],[-5,-9],[-2,-3],[-1,-2],[-6,-11],[-4,-8]],[[7882,4073],[-8,-16],[-4,-7],[-6,-11]],[[7910,4004],[-39,29],[-7,6]],[[7882,4073],[16,-12],[2,-2],[29,-22]],[[7929,4037],[-4,-8],[-4,-7],[-5,-7],[-6,-11]],[[7900,4106],[9,15]],[[7909,4121],[8,-6],[30,-23],[9,-6]],[[7956,4086],[0,-3],[-5,-8],[-8,-15]],[[7943,4060],[-7,-12],[-6,-10],[-1,-1]],[[7958,3968],[-48,36]],[[7943,4060],[47,-36]],[[7990,4024],[-7,-12],[-6,-12],[-4,-7],[-5,-7],[-4,-8],[-6,-10]],[[7956,4086],[5,10],[5,9]],[[7966,4105],[10,-7],[30,-22],[9,-7]],[[8015,4069],[-6,-10],[-5,-10],[-6,-9],[-8,-16]],[[7966,4105],[7,11],[12,22]],[[8035,4095],[-7,-3],[-7,-12],[-6,-11]],[[8061,4034],[-17,12],[-20,16],[-9,7]],[[8075,4061],[-2,-4],[-6,-12],[-6,-11]],[[8036,3990],[-7,5],[-30,23],[-9,6]],[[8061,4034],[-6,-10],[-5,-10]],[[8050,4014],[-6,-9],[-8,-15]],[[8486,4089],[18,31],[8,14],[13,24],[1,2],[4,7]],[[8530,4167],[19,-14],[10,-8],[21,37]],[[8580,4182],[14,26],[10,-8],[6,-5],[7,-5],[6,14],[3,-2],[3,-1],[6,-3],[-9,-46],[-3,-10],[-3,-13],[-3,-17],[0,-2],[-1,-9],[-3,-52],[-2,-19],[-14,-25]],[[8530,4167],[21,37],[10,18],[10,19]],[[8571,4241],[8,-5],[5,-4],[-6,-13],[-4,-7],[-9,-18],[15,-12]],[[8530,4167],[-14,11],[-14,11],[6,10],[9,17],[5,9]],[[8522,4225],[10,18],[10,18],[7,-5],[1,-1],[13,-9],[8,-5]],[[8522,4225],[-6,5],[-9,6],[-17,13]],[[8592,4282],[-11,-22],[-10,-19]],[[8419,4253],[-10,8],[-9,8],[-20,14],[-31,24]],[[8349,4307],[12,22]],[[8361,4329],[6,10],[0,1],[5,9],[8,14],[5,9]],[[8385,4372],[2,-1],[5,-4],[2,-1]],[[8394,4366],[57,-40],[8,-6]],[[8374,4175],[-20,15],[-18,16],[-17,13]],[[8319,4219],[-14,10]],[[8305,4229],[6,11],[6,10],[13,25],[-27,21]],[[8303,4296],[8,14],[5,9],[5,9]],[[8321,4328],[10,-7],[18,-14]],[[8354,4139],[-38,30],[-18,14]],[[8298,4183],[4,8],[6,9],[4,8],[7,11]],[[8374,4175],[-10,-18],[-10,-18]],[[8298,4183],[-35,27],[-11,8]],[[8252,4218],[4,21]],[[8256,4239],[5,25]],[[8261,4264],[10,-7],[1,-1],[33,-27]],[[8333,4102],[-50,39],[-29,22],[-11,8]],[[8243,4171],[6,29]],[[8249,4200],[3,18]],[[8354,4139],[-8,-14],[-7,-13],[-6,-10]],[[8313,4051],[-9,-24]],[[8304,4027],[-67,50],[-10,8]],[[8333,4102],[-10,-28],[-10,-23]],[[8359,4015],[-46,36]],[[8333,4102],[11,-8],[15,-11],[12,-10],[2,-3],[12,-9]],[[8385,4061],[-14,-24],[-12,-22]],[[8418,4037],[-17,13],[-6,3],[-8,6],[-2,2]],[[8408,4151],[18,-14],[30,-23],[3,-4]],[[8379,3968],[-32,26],[12,21]],[[8187,4247],[7,-6],[43,-32],[12,-9]],[[8187,4247],[9,16]],[[8196,4263],[7,-6],[36,-28],[6,-6],[7,-5]],[[8196,4263],[9,15]],[[8205,4278],[7,-6],[16,-12],[17,-14],[9,-6],[2,-1]],[[8163,4311],[33,-26],[9,-7]],[[2691,889],[2,4],[0,5],[-3,4],[-6,5],[-13,49],[16,6],[7,0],[7,-2],[20,7]],[[2721,967],[23,7]],[[2744,974],[16,5],[6,1],[5,0],[6,0],[5,-1],[11,-3],[22,-7],[26,-6],[21,-91]],[[2540,919],[-7,23],[-3,10],[-1,6],[-2,8],[-3,11],[-2,8],[-1,13],[-2,8],[-2,8],[-3,11]],[[2514,1025],[11,5],[38,14],[17,7],[6,3],[2,1]],[[2588,1055],[7,3],[18,8],[8,4],[9,7],[4,2],[5,3],[24,10],[1,0],[1,0],[1,-1],[3,-12]],[[2669,1079],[21,-85],[1,-1],[0,-1],[1,-1],[2,0],[19,7],[8,-31]],[[2509,901],[4,-14],[1,-4],[-1,-1],[-1,-2],[-24,-22],[-14,-13],[-2,-1],[-2,-1],[-1,0],[-1,0],[-1,1],[-6,9],[-10,13],[-1,2],[12,8],[13,7],[-7,22],[-7,23],[-10,-4],[-9,-5],[-19,-13],[-5,-3],[-11,-4],[-5,-1],[-4,6],[-2,4],[-2,3],[-9,10],[-4,4],[-4,3],[-9,7]],[[2368,935],[23,33],[3,4],[4,2],[32,14],[34,15],[30,14],[20,8]],[[6592,4365],[-3,-7],[-4,-10],[-2,-5],[-6,-12],[-5,-14],[-8,-19],[-3,-9],[-1,-3],[-1,-2],[-1,-2],[-1,-4],[-3,-7],[-2,-5],[-3,-7],[-3,-7],[-1,-4],[-2,-4]],[[6543,4244],[-1,-2],[-2,-4],[-2,-4],[-6,-11],[-2,-4],[-5,-9],[-1,-1],[-1,-2],[-1,-2],[-1,-3],[-1,-2],[-1,-3],[-1,-2],[-1,-2],[-1,-2],[0,-2],[-1,-3],[-1,-2],[-2,-9],[-2,-8],[0,-1],[-2,-7],[-3,-11]],[[6505,4148],[-2,-2],[-3,-2],[-2,-1],[-2,-1],[-2,-1],[-2,0],[-2,-1],[-3,0],[-1,0],[-1,1],[-1,2],[-1,2],[-1,1],[-1,2],[-1,1],[-1,2],[-1,1],[-2,1],[-1,2],[-2,1],[-1,1],[-1,1],[-1,1],[-2,1],[-2,1],[-3,1],[-3,2],[-2,0],[-4,1]],[[6454,4165],[-4,1],[-4,-13],[-6,2],[-10,5],[-12,6],[-16,8],[-18,9],[-20,9],[-11,5],[-33,16],[-21,10],[-6,3],[-8,4],[-8,3],[-14,7],[-11,6],[-6,3],[-7,3],[-7,3],[-13,7]],[[6219,4262],[-42,20]],[[6177,4282],[2,7],[1,4]],[[6204,4365],[6,30],[1,14],[2,14],[0,5]],[[6609,4409],[-2,-6],[-4,-11],[-5,-12],[-4,-9],[-2,-6]],[[6168,4189],[11,19],[8,14],[2,7],[0,2],[-1,1],[-13,6],[-13,6]],[[6162,4244],[13,34],[2,4]],[[6219,4262],[-26,-76],[-3,-7]],[[6146,4200],[3,8],[13,36]],[[3292,3603],[-60,72],[-12,11],[-19,18],[-12,20]],[[3189,3724],[0,4],[1,12],[2,4],[8,8],[9,7],[11,3],[8,1],[5,-1],[4,-2],[3,-1],[10,0],[8,4],[6,2],[1,-1],[4,0],[6,2],[4,2]],[[3224,3604],[-65,68]],[[3159,3672],[4,4],[7,17],[3,9],[5,10],[7,5],[4,4],[0,3]],[[3221,3312],[0,5],[11,9],[-3,4],[-10,-9],[-3,5],[-4,1]],[[3212,3327],[-2,4]],[[3210,3331],[9,6],[-8,14],[6,9],[58,44],[-110,173]],[[3165,3577],[-32,48]],[[3133,3625],[-1,2],[-11,13],[-23,35]],[[3098,3675],[2,-2],[9,-5],[9,-5],[21,0],[12,3],[7,5],[1,1]],[[3210,3331],[-8,14],[-34,58]],[[3168,3403],[4,3],[9,7],[4,2],[5,1],[14,3],[4,2],[6,3],[11,8],[14,13],[-30,45],[-14,21],[-3,2],[-2,1],[-14,1],[-22,1]],[[3154,3516],[-1,15],[-4,17],[-8,13]],[[3141,3561],[9,5],[15,11]],[[3168,3403],[-22,37]],[[3146,3440],[-4,8],[-13,22]],[[3129,3470],[15,12],[4,5],[3,5],[2,5],[1,6],[0,13]],[[2978,3381],[-26,55],[-8,20]],[[2944,3456],[40,13],[17,6],[13,5],[6,3],[7,4],[16,9],[14,8],[21,15],[13,8],[3,3]],[[3094,3530],[32,21]],[[3126,3551],[15,10]],[[3129,3470],[-3,-2],[-13,-8],[-21,-17],[-7,-6],[-8,-5],[-5,-3],[-1,-1],[-6,-4],[-7,-4],[-20,-10],[-25,-12],[-22,49],[-3,2],[-5,-1],[-6,-4],[-3,-4],[0,-5],[22,-45],[-18,-9]],[[3049,3625],[7,5],[50,-17],[-1,-16],[1,-4],[10,-23],[10,-19]],[[3094,3530],[-19,40],[-26,55]],[[3049,3625],[-8,15]],[[3041,3640],[-8,18]],[[3033,3658],[6,-2],[54,-16],[40,-15]],[[3033,3658],[-4,1],[-9,3],[-12,3],[-60,12],[-156,27]],[[2792,3704],[-113,19],[-42,8]],[[2637,3731],[22,72]],[[2659,3803],[17,3],[8,4],[8,1],[8,0],[8,-2],[25,-2],[4,-2],[27,-1],[18,-5],[3,-2],[6,0],[12,-2],[6,-3],[17,-2],[8,-1],[19,0],[12,0],[10,-2],[2,-3],[2,0],[4,0],[2,3],[5,3],[4,4],[1,5],[3,2],[16,6],[9,1],[1,-1],[6,0],[11,-3],[17,-7],[15,-11],[4,-3],[11,-15],[6,-2],[5,0],[5,-4],[23,-3],[4,-13],[4,-5],[4,-3],[4,-6],[6,-7],[8,-5],[4,-5],[8,-5],[10,-2],[12,-5],[3,-2],[0,-3],[-4,-5],[-1,-4],[3,-6],[5,-7],[1,-1]],[[2591,3556],[0,-13],[2,-12],[2,-9]],[[2595,3522],[-12,-5],[-5,-3],[-3,9],[-2,9],[-1,5],[1,20],[0,20],[1,16],[-1,7],[-3,7],[-8,18],[-13,-8],[-11,-5],[-19,-7],[-5,-3],[-24,-25],[-1,-4],[25,-55],[-10,-6]],[[2504,3512],[-8,-2],[-11,-3],[-7,-4],[-13,-9],[-22,-13]],[[2443,3481],[-13,25],[-1,2]],[[2429,3508],[4,2],[4,4],[3,10],[7,12],[5,10],[5,8],[6,9],[6,7],[7,8],[3,6],[3,4],[4,0],[4,6],[10,17],[2,3],[1,1],[22,12],[10,8],[5,6],[5,4],[4,4],[0,3],[2,6],[-2,22],[1,6],[1,5],[1,4],[1,6],[12,23],[4,11],[14,32],[11,15],[8,8],[14,2],[11,3],[13,4],[19,4]],[[2637,3731],[-2,-28],[-2,-17]],[[2633,3686],[-4,0],[-4,1],[-4,-1],[-3,-2],[-2,-3],[-2,-3],[-7,-34],[-7,-29],[-5,-29],[-4,-30]],[[2595,3522],[5,-14],[8,-17]],[[2608,3491],[-18,-9],[-18,-4]],[[2572,3478],[-4,-1],[-3,-1],[-4,-3],[-6,-6],[-21,-15],[-3,-4],[-4,-6]],[[2527,3442],[-15,12],[10,17],[-9,20],[-9,21]],[[2577,3262],[-4,-7],[-3,-8]],[[2570,3247],[-4,2],[-3,3],[-4,8],[-2,3],[-2,1],[-2,0],[-2,-1],[-3,-2]],[[2548,3261],[-14,29],[-18,38],[-10,23],[-3,-2],[-4,-2],[-3,0],[-4,2],[-35,25],[-5,11],[-33,69]],[[2419,3454],[2,6],[2,5],[5,5],[15,11]],[[2527,3442],[9,-8],[-12,-21],[10,-22],[-17,-11],[19,-40],[25,-54],[6,-11],[10,-13]],[[2582,3267],[-5,-5]],[[2572,3478],[8,-19],[-16,-11],[25,-54],[1,-4],[1,-3],[-1,-4],[-2,-5],[-5,-8],[-5,-4],[-6,-5],[-3,-2],[12,-27],[20,-46]],[[2601,3286],[-19,-19]],[[2757,3266],[-8,-5],[-1,-3],[-13,-10],[-6,-5],[-10,-8],[-5,-4],[-26,-25],[-10,13],[-21,-20],[-13,-14],[-16,-17]],[[2628,3168],[-31,68],[-9,20],[-6,11]],[[2601,3286],[11,10],[10,5],[6,3],[20,8],[18,8]],[[2666,3320],[27,11]],[[2693,3331],[21,-49],[9,-20],[28,16],[6,-12]],[[2634,3148],[-38,-46]],[[2596,3102],[-12,27],[-21,43],[-12,7]],[[2551,3179],[3,11],[8,28],[6,24],[2,5]],[[2628,3168],[11,-15],[-5,-5]],[[2678,3129],[-20,-9],[-2,0],[-5,5],[-6,10],[-11,13]],[[2757,3266],[2,-3],[7,-17]],[[2766,3246],[5,-7],[21,-16],[8,-8]],[[2800,3215],[-2,0],[-14,-18],[-19,-21],[-7,-7],[-7,-6],[-16,-10],[-23,-10],[-25,-10],[-9,-4]],[[2678,3129],[7,-21],[5,2],[10,4],[2,-2],[8,-26],[-1,-2],[-40,-17],[7,-23],[28,-45],[3,0],[29,24],[12,-19]],[[2671,2940],[-10,22],[-9,20],[-10,21],[-6,12],[-10,22],[-4,9],[-5,12],[-9,20],[-12,24]],[[2800,3215],[9,-13]],[[8632,4758],[-10,-26]],[[8622,4732],[-11,6],[-47,23],[-11,6]],[[8553,4767],[10,26]],[[8563,4793],[11,-5],[47,-24],[11,-6]],[[8563,4793],[5,13],[4,13]],[[8572,4819],[11,-5],[48,-24],[11,-5]],[[8642,4785],[-10,-27]],[[8572,4819],[9,23]],[[8581,4842],[11,-6],[39,-19],[9,-5],[10,-5]],[[8650,4807],[-8,-22]],[[2920,2824],[-68,-57]],[[2852,2767],[-16,-14],[-7,-3],[-6,-3],[-16,-5],[-8,-3],[-7,-6],[-17,-14]],[[2731,2651],[-19,10],[-11,6],[-12,9],[-13,12],[-13,15],[-10,13],[-7,12],[-8,13],[-11,18],[6,6],[3,4],[6,13],[3,5],[4,6],[5,4],[29,24],[21,17]],[[2847,2897],[-8,-22],[-8,-22],[-4,-9],[-1,-17],[0,-3],[6,-3],[6,-1],[7,-4],[6,-5],[6,-10],[17,15],[17,14],[16,13],[13,-19]],[[2689,2588],[-18,29],[-45,75],[-3,5],[-11,17],[-14,23],[-44,76],[-9,19],[-1,4]],[[2544,2836],[57,47]],[[2582,2544],[16,13],[-1,3],[0,3],[5,4],[6,5],[-10,20],[-8,19],[-14,19],[-6,25],[-6,23],[-10,22]],[[2554,2700],[-17,42],[-14,36],[0,4],[1,2],[-10,19],[27,30],[3,3]],[[2689,2588],[-3,-2],[-20,-17],[-14,-5],[-16,-7],[-12,-10],[-20,-17],[-10,-5],[-12,19]],[[2506,2663],[-5,10],[-12,30],[-18,-10],[-6,-4],[-9,-5],[-4,-1],[-8,-2],[0,6],[-1,3],[-2,9],[-5,14],[-11,-8],[-3,-1],[-2,0],[-2,2],[-7,11],[-5,6],[-3,1],[-2,-1],[-8,-12]],[[2393,2711],[-16,16],[-32,-45]],[[2345,2682],[-12,31],[10,11],[7,10],[5,7],[5,7],[7,11],[5,9],[2,4]],[[2374,2772],[2,3],[2,6],[4,10],[3,6],[5,16],[9,28],[6,20],[6,17],[11,19],[12,19],[30,33],[11,12],[12,14],[2,2]],[[2489,2977],[14,-34],[24,-63],[17,-44]],[[2554,2700],[-17,-13],[-25,-19],[-6,-5]],[[2506,2663],[22,-55],[4,-12],[3,-8],[1,-11],[-1,-9],[-4,-10],[-8,2],[-3,-1],[-17,-8],[-6,-3],[-6,0],[-7,2]],[[2484,2550],[-5,3],[-4,0],[-4,-1],[-3,-1],[-9,23],[-11,29]],[[2448,2603],[-2,6],[-1,16],[0,22],[-14,0],[-2,2],[-6,13],[-6,10],[-6,8],[-9,9],[-14,15],[5,7]],[[2448,2603],[-73,-26]],[[2375,2577],[-5,12],[-14,-8],[-6,-5]],[[2350,2576],[-14,-13],[-8,22],[-12,29]],[[2316,2614],[1,3],[10,6],[4,4],[9,12],[13,17],[7,11],[-15,15]],[[2484,2550],[-1,-9],[-2,-5],[-7,-3],[16,-41],[5,-3],[6,0],[8,5],[7,7],[17,10],[3,-7]],[[2536,2504],[-147,-124]],[[2389,2380],[-6,11]],[[2383,2391],[38,27],[19,18],[33,29],[2,4],[0,5],[-6,15],[-17,-8],[-7,19],[-17,-8],[-27,71],[-19,-6],[-7,20]],[[2582,2544],[-46,-40]],[[2383,2391],[-38,92],[-9,23]],[[2336,2506],[4,1],[6,2],[9,5],[14,15],[0,2],[0,2],[-4,10],[-3,9],[-4,9],[-5,11],[-3,4]],[[2389,2380],[-9,-10],[54,-98]],[[2434,2272],[-6,-12]],[[2428,2260],[-6,11],[-36,62]],[[2386,2333],[-6,8],[-3,4],[-14,7],[-17,8],[-7,4],[-24,10]],[[2315,2374],[9,24],[7,22],[13,-6],[3,0],[3,1],[-12,30],[-3,8],[-1,3],[3,8],[-1,3],[-20,9],[-1,1],[-2,3],[-6,18],[-9,23],[8,4],[6,5],[4,4],[8,4]],[[2324,2538],[12,-32]],[[2315,2374],[-16,8]],[[2299,2382],[-23,11]],[[2276,2393],[8,24],[-6,3],[-6,5],[-3,4],[-3,4],[-2,5],[-20,55],[-8,21]],[[2236,2514],[19,10],[42,21],[2,2],[3,3],[5,5],[5,3],[4,2],[8,-22]],[[2236,2514],[-12,34],[-2,6],[16,17],[-9,21]],[[2229,2592],[14,15],[38,44],[2,2],[4,-14],[0,-2],[4,-10],[8,-22],[17,9]],[[2229,2592],[-2,3],[-15,39]],[[2212,2634],[10,14],[4,5],[13,17],[15,18],[7,7],[2,3]],[[2263,2698],[4,6],[39,54],[5,3],[3,1],[13,28],[19,27]],[[2346,2817],[14,-10],[-9,-18],[23,-17]],[[2095,2473],[-3,7],[-2,6],[-11,23],[-5,8],[-12,18]],[[2062,2535],[3,10],[3,7],[2,6],[2,5],[5,4],[5,4],[11,7],[5,2],[17,10],[1,1],[1,2],[1,1],[2,2],[4,11],[1,3],[4,11],[2,9],[3,16],[3,3],[29,27],[11,15],[1,2],[16,25],[6,6],[14,12],[13,11],[2,2]],[[2229,2749],[23,-33],[11,-17],[0,-1]],[[2212,2634],[-93,-136],[-24,-25]],[[8316,4362],[-21,16],[-11,8]],[[8284,4386],[6,26],[5,23]],[[8295,4435],[8,-6],[5,-3],[23,-16],[8,-6]],[[8339,4404],[-6,-10],[-6,-11],[-5,-10],[-6,-11]],[[8361,4329],[-18,13],[-27,20]],[[8339,4404],[35,-24],[11,-8]],[[8321,4328],[-17,13],[-14,11],[-11,8]],[[8279,4360],[5,26]],[[8303,4296],[-31,24]],[[8272,4320],[4,20]],[[8276,4340],[3,20]],[[8261,4264],[5,26],[4,19],[2,11]],[[8261,4264],[-11,9],[-34,25]],[[8216,4298],[7,12],[5,9],[6,-5],[14,25]],[[8248,4339],[9,-7],[7,-6],[8,-6]],[[8163,4311],[11,20]],[[8174,4331],[9,-7],[33,-26]],[[8093,3982],[-43,32]],[[8103,4039],[-2,-2],[-6,-13],[-6,-11],[15,-11],[-6,-10],[-5,-10]],[[8093,3982],[22,-17],[4,-3]],[[8119,3962],[-10,-6],[-6,-12],[-1,-4]],[[8145,4008],[-2,-3],[-7,-12],[-6,-11],[-5,-10],[-6,-10]],[[8176,3947],[-9,8],[-6,-11],[-6,-9],[-36,27]],[[8191,3973],[-3,-4],[-12,-22]],[[8176,3947],[-11,-19],[11,-9],[8,-6],[2,-1],[8,-6],[5,-4]],[[8210,3953],[0,-10],[-3,-10],[-7,-26]],[[8210,3953],[31,-23],[22,-17]],[[8263,3913],[-6,-17],[-4,-9],[-5,-16]],[[8211,3993],[63,-48]],[[8274,3945],[-5,-15],[-3,-8],[-3,-9]],[[8217,4034],[11,-8],[28,-22],[16,-12],[15,-12]],[[8287,3980],[-8,-21],[-5,-14]],[[8304,4027],[-8,-22],[-9,-25]],[[8340,3939],[-17,13],[-9,7],[-9,7],[-8,7],[-10,7]],[[8322,3908],[-48,37]],[[8306,3879],[-43,34]],[[8286,3843],[-38,28]],[[2488,1435],[-4,0],[-63,-53]],[[2421,1382],[-3,12],[2,2],[5,6],[1,3],[2,3],[1,3],[0,2],[0,4],[1,5],[0,7],[-1,3],[-1,7],[-1,7],[-2,5],[-1,4],[-1,4],[-3,5],[-6,10],[-6,11],[-5,6],[-5,6],[-5,4],[-3,2],[-5,1],[-7,0],[-6,-1],[-6,-3],[-6,-3],[-6,-5],[-6,-5],[-6,-8]],[[2342,1479],[-9,9],[-28,47],[-4,5],[-4,9],[-4,10],[-5,9],[-8,13],[-9,15],[-3,5]],[[2352,1669],[3,-4],[12,-20],[3,-5],[19,-33],[22,-36]],[[2411,1571],[33,-54],[2,-2],[20,-35],[8,-14],[7,-15],[7,-16]],[[2323,1305],[-2,8],[-1,5],[-3,20]],[[2317,1338],[17,3],[4,2],[-3,23],[-6,30],[-2,21],[-1,6]],[[2326,1423],[1,4],[0,5],[1,9],[2,11],[3,10],[4,8],[5,9]],[[2421,1382],[-92,-76],[-6,-1]],[[2202,1373],[-30,53],[-3,13],[-1,7],[-5,9],[-10,17],[-11,18],[-3,6]],[[2139,1496],[4,4]],[[2326,1423],[-19,-4],[-38,-7],[-18,-4],[-3,-1],[-17,-13],[-29,-21]],[[2194,1305],[-2,4],[-4,8],[-3,7],[-1,12],[1,11],[3,8],[5,9],[9,9]],[[2317,1338],[-7,-2],[-5,-2],[-7,-5],[-14,-17],[-9,16],[-8,15],[-1,0],[-1,0],[-1,0],[-1,0],[-35,-27],[-2,-2],[-3,-17],[-5,-23],[-6,5],[-1,1],[-3,3],[-9,15],[-5,7]],[[2323,1305],[-90,-81],[-47,74]],[[2186,1298],[8,7]],[[7804,4647],[-29,23],[-9,7],[3,3],[-9,7],[-1,1],[-10,8]],[[7749,4696],[6,11],[6,11],[6,11],[6,12]],[[7773,4741],[3,6],[3,5],[6,12]],[[7785,4764],[6,11],[6,11]],[[7797,4786],[10,-7],[8,-6],[3,-2],[8,-6],[8,-6],[24,-17]],[[7858,4742],[-10,-18],[-11,-18],[-28,-49],[-5,-10]],[[7735,4771],[38,-30]],[[7667,4823],[6,11],[6,11]],[[7679,4845],[68,-52],[38,-29]],[[7679,4845],[6,12],[6,11]],[[7691,4868],[67,-53],[39,-29]],[[7691,4868],[6,11],[6,12]],[[7703,4891],[10,-8],[57,-45]],[[7770,4838],[39,-29]],[[7809,4809],[-6,-12],[-6,-11]],[[7770,4838],[6,11],[6,12],[6,11],[6,11]],[[7794,4883],[29,-22],[1,-1],[9,-7]],[[7833,4853],[-3,-5],[-9,-17]],[[7821,4831],[-3,-5],[-3,-6],[-6,-11]],[[7703,4891],[5,11],[7,12]],[[7715,4914],[5,11],[6,11]],[[7726,4936],[39,-30],[29,-23]],[[7726,4936],[6,11],[6,11],[6,12],[4,7]],[[7748,4977],[28,-15],[47,-23]],[[7823,4939],[-5,-11],[-6,-11],[-6,-11],[-6,-11],[-6,-12]],[[7839,4866],[-6,-13]],[[7856,4899],[-8,-16],[-4,-7],[-5,-10]],[[6142,4224],[1,-1],[2,0],[1,1],[1,1],[9,30],[1,6],[-1,5],[-2,8],[-4,7],[-6,7],[-7,5],[-15,6],[-10,4],[-9,4],[-11,2]],[[6092,4309],[-23,4],[-4,0],[-10,1],[-8,0],[-11,0],[-21,-4],[-18,-4],[-18,-6],[-14,-6],[4,-14],[6,-16]],[[5975,4264],[-18,7],[-15,-12],[-9,-10],[-13,-29],[-6,-19],[13,-12]],[[5788,4199],[24,46],[2,3],[3,7]],[[6092,4309],[-5,-32]],[[7976,3282],[-12,10],[-32,25],[-9,4],[-11,9]],[[7883,3395],[16,26],[11,52],[1,8],[2,7],[5,22],[2,7]],[[7962,3259],[-6,5],[-7,5]],[[7949,3269],[-17,14],[-4,3],[-5,4],[-4,3],[-20,16]],[[7949,3269],[-7,-13],[-4,-7],[-19,7],[-37,29]],[[7815,3256],[-6,-5],[-32,-22],[-12,-12],[-11,-14],[-4,-5],[0,-1],[-14,-20],[-24,-52],[-20,-36],[-2,-4],[-1,-4]],[[7689,3081],[-27,1],[-12,2],[-10,3],[-18,4],[-22,0],[-21,2],[-10,1],[-3,1],[-10,1],[-9,1],[-33,1],[-17,0],[-7,-2],[-6,-2],[-20,-7]],[[7392,3091],[6,1],[21,5],[6,2],[3,2],[4,3],[50,79],[9,13],[21,31],[37,54],[23,23],[23,15],[9,5],[7,19],[2,3],[8,20]],[[7717,3768],[3,4],[6,11]],[[7726,3783],[10,17]],[[7736,3800],[4,0],[14,-10],[26,-20],[1,-2],[32,-25],[14,-10],[24,-18],[23,-17]],[[7874,3698],[7,-6],[54,-41],[1,-6],[0,-7],[1,0],[0,-3],[1,-3],[1,-6],[4,-7],[4,-7]],[[7789,3124],[-7,-8],[-9,-10],[-8,-8],[-10,-7],[-3,-2],[-1,-4],[0,-2],[1,-6],[1,-7],[2,-7],[-3,-8],[-9,-10],[-9,-12],[-6,-16],[0,-10],[1,-8],[6,-16],[12,-13],[3,-1],[3,-2],[4,-5],[6,-4],[3,-1]],[[7609,2999],[11,21],[-11,14],[3,7],[4,5],[3,2],[4,2],[34,8],[8,3],[7,4],[2,1],[5,2],[4,4],[3,4],[3,5]],[[7834,3031],[-27,-27]],[[7807,3004],[-23,-22]],[[7844,2969],[-20,18],[-17,17]],[[7866,3000],[-8,-10],[-7,-11],[-7,-10]],[[7891,2976],[-22,-32]],[[7869,2944],[-9,9],[-7,7],[-9,9]],[[7869,2944],[-1,-2],[-18,-25]],[[7962,4215],[-8,6],[-61,47]],[[7893,4268],[5,9],[5,8],[8,16]],[[7911,4301],[9,-7],[46,-35],[6,-4]],[[7972,4255],[8,-7]],[[7951,4197],[-7,6],[-61,46]],[[7883,4249],[5,10],[5,9]],[[7938,4173],[-9,7],[-51,38],[-9,7]],[[7869,4225],[8,15],[6,9]],[[7938,4173],[-12,-21]],[[7926,4152],[-9,7],[-51,38],[-9,7]],[[7857,4204],[12,21]],[[7909,4121],[-9,7],[-20,15],[-8,5]],[[7872,4148],[6,10],[5,10],[-23,17],[-10,7],[7,12]],[[7926,4152],[-7,-12],[-10,-19]],[[7911,4301],[12,-2],[8,14],[13,23]],[[7944,4336],[51,-40],[-12,-22],[-6,-10],[-5,-9]],[[7944,4336],[6,11],[6,11]],[[7956,4358],[51,-40],[9,-7]],[[8016,4311],[-12,-22]],[[8004,4289],[-13,-22],[-11,-19]],[[7911,4301],[-28,22]],[[7883,4323],[11,19],[12,22]],[[7906,4364],[13,22]],[[7919,4386],[8,-6],[11,-8],[9,-7],[9,-7]],[[7883,4323],[-2,2],[-10,8],[-2,1],[-14,11],[-10,7]],[[7845,4352],[11,19]],[[7856,4371],[13,22]],[[7869,4393],[9,-7],[18,-13],[8,-7],[2,-2]],[[8041,4261],[-26,20],[-2,1],[-9,7]],[[8016,4311],[14,25]],[[8668,4346],[15,-7],[14,-6]],[[8697,4333],[0,-1],[6,-2],[-22,-87],[0,-2],[6,-3],[-14,-42],[5,-2],[-14,-43],[6,-3],[-6,-19],[-8,-23],[6,-3],[-14,-41],[-9,-55],[-5,-24]],[[8790,4543],[-73,-117],[-20,-93]],[[8600,4440],[6,8],[3,7],[0,2],[1,2],[1,2],[1,2],[1,2],[0,1],[1,2],[1,1],[0,2],[1,1],[6,15],[12,31],[9,24]],[[8643,4542],[9,-5],[22,-11],[9,25],[8,21],[4,10],[1,2],[4,11]],[[8700,4595],[6,-3],[9,-4]],[[8715,4588],[9,-5],[10,-5],[4,-2],[13,-6],[20,-13],[4,-2],[11,-9],[4,-3]],[[8846,4618],[-16,-6],[0,-3],[-40,-66]],[[8715,4588],[8,21],[7,20]],[[8730,4629],[8,22],[7,19]],[[8745,4670],[11,-5],[19,-10],[16,-5],[17,-9],[1,-1],[1,0],[1,-1],[2,-1],[3,-2],[4,-3],[21,-13],[5,-2]],[[8944,4779],[-48,-16],[-20,-40],[0,-3],[65,21],[-7,-29],[-60,-20],[5,-12],[4,0],[1,-7],[-36,-12],[3,-15],[43,14],[0,-1],[0,-24],[-48,-17]],[[8745,4670],[10,27],[10,26]],[[8765,4723],[10,-5],[19,-10],[5,11],[4,12],[-19,10],[-11,5]],[[8773,4746],[10,25],[9,24]],[[8792,4795],[5,13],[5,16],[9,25],[1,4]],[[8812,4853],[9,-5],[28,-15],[3,-4],[2,-2],[7,-4],[28,-15],[3,1],[2,-1],[7,-4],[43,-25]],[[8978,4870],[-35,-70],[23,7],[6,-19],[-28,-9]],[[8812,4853],[5,13],[4,13],[-25,13],[-9,4],[9,24]],[[8796,4920],[11,-6],[13,-6],[9,-5],[24,-13],[7,-4],[5,12],[4,11]],[[8869,4909],[11,-6],[2,-1],[39,-21],[13,-7],[40,-4],[4,0]],[[9015,4945],[-37,-75]],[[8869,4909],[-31,17],[-22,11]],[[8816,4937],[5,12],[22,-11],[7,16],[11,28],[9,23]],[[8870,5005],[10,-5],[17,-9],[14,-7],[45,-21],[6,-3],[3,-1],[20,-6],[26,-8],[4,0]],[[9039,4992],[-24,-47]],[[8870,5005],[-11,6],[-12,6]],[[8847,5017],[-10,6]],[[8837,5023],[9,24]],[[8846,5047],[10,-5],[13,-7],[12,-6],[8,22]],[[8889,5051],[10,-5]],[[2120,1713],[-52,-40],[-10,18],[-1,2],[-1,1],[-1,0],[-1,0],[-10,0],[-18,-2],[-1,-1],[-1,-1],[-1,-1],[1,-22],[-42,-33],[-10,-8],[0,-1],[-1,0],[0,-1],[0,-1],[0,-1],[11,-17],[-18,-14],[-11,-10]],[[1953,1581],[-19,-14]],[[1855,1672],[44,3],[18,15],[157,124]],[[1813,1646],[-1,3],[-5,8],[-5,10]],[[1802,1667],[-19,41],[11,7],[8,4],[-10,20],[18,8],[20,5],[8,1],[11,4]],[[1849,1757],[18,-40],[13,-30],[7,1],[6,2],[7,4],[12,8],[6,6]],[[1918,1708],[94,73],[17,14]],[[2029,1795],[19,16],[19,15]],[[2067,1826],[7,-12]],[[1849,1757],[-1,1],[-13,30],[0,3],[43,26],[9,-20],[41,25],[-10,19]],[[1918,1841],[16,10],[3,-1],[33,-73],[-35,-29],[-27,-18],[10,-22]],[[1802,1667],[-19,-11]],[[1702,1781],[17,11],[20,12]],[[1892,1898],[9,-19],[8,-19],[9,-19]],[[1926,1919],[18,11],[18,12]],[[1962,1942],[17,-37],[20,-44],[10,-22],[20,-44]],[[2102,1961],[-11,-7],[-14,-9],[-6,-3],[-4,-1],[-10,-1],[-1,-20],[8,-15],[30,22],[10,-19],[-25,-19],[-15,-12],[0,-3],[10,-17],[11,-19],[-18,-12]],[[1962,1942],[9,6],[3,5],[1,7],[0,11]],[[2022,1996],[7,-3],[31,28],[7,-20],[4,-9],[11,8],[1,-1],[9,-17],[10,-21]],[[7900,4857],[-7,-19]],[[7893,4838],[-9,5],[-33,17],[-2,1],[-10,5]],[[7879,4801],[-8,5],[-37,19],[-2,1],[-11,5]],[[7893,4838],[-7,-18],[-7,-19]],[[7882,4725],[-24,17]],[[7879,4801],[-4,-12],[-3,-8],[26,-13],[-6,-17],[-10,-26]],[[7902,4711],[-20,14]],[[7893,4838],[9,-4],[30,-15],[9,-4]],[[7941,4815],[-7,-19]],[[7934,4796],[-6,-19]],[[7928,4777],[-8,-20]],[[7920,4757],[-7,-19]],[[7913,4738],[-5,-11],[-6,-16]],[[7920,4757],[11,-6],[9,-5],[7,-3],[7,-4],[1,-4],[-3,-9],[-4,-9],[-4,-1],[-6,4],[-7,4],[-7,6],[-7,5],[-4,3]],[[7959,4671],[-3,2],[-2,2],[-4,2],[-40,29],[-8,5]],[[7928,4777],[9,-4],[44,-22],[10,-4]],[[7991,4747],[-15,-40],[-5,-10],[0,-6],[-2,-5],[-10,-15]],[[7934,4796],[10,-4],[44,-23],[9,-4]],[[7997,4765],[-6,-18]],[[7941,4815],[9,-5],[44,-22],[9,-5]],[[8003,4783],[-6,-18]],[[8010,4802],[-7,-19]],[[7948,4833],[9,-5],[44,-22],[9,-4]],[[8017,4820],[-7,-18]],[[7961,4869],[9,-4],[45,-22],[9,-4]],[[8024,4839],[-7,-19]],[[8031,4857],[-7,-18]],[[7975,4906],[9,-4],[44,-22],[9,-5]],[[8037,4875],[-6,-18]],[[8044,4894],[-7,-19]],[[7934,4949],[9,-5],[26,-13],[3,-2],[10,-4]],[[7982,4925],[9,-5],[44,-22],[9,-4]],[[8051,4912],[-7,-18]],[[7982,4925],[6,18],[9,22]],[[7997,4965],[10,-4],[42,-21],[10,-5]],[[8059,4935],[-8,-23]],[[7934,4949],[6,18],[4,11],[4,12],[39,-20],[10,-5]],[[8004,4985],[-7,-20]],[[7924,5025],[10,-5],[61,-30],[9,-5]],[[7942,5060],[8,-4],[3,-1],[26,-13],[13,-6],[16,-8],[9,-5]],[[8017,5023],[-6,-19],[-7,-19]],[[3044,2793],[-31,52],[-16,-13],[-17,-15],[-21,-17],[-12,18],[-11,19]],[[2936,2837],[44,37]],[[2980,2874],[78,63]],[[3058,2937],[11,-18]],[[3069,2919],[10,-18],[22,-37],[-38,-29],[-14,-11],[13,-23],[-18,-8]],[[2980,2874],[-13,21]],[[2949,2928],[63,51],[14,11],[-15,25],[14,16],[37,-60],[3,0],[14,11],[-11,19],[-17,28],[0,3],[1,2],[14,17],[7,7],[13,12],[-8,21]],[[3078,3091],[20,15]],[[3098,3106],[10,-25]],[[3108,3081],[27,-80],[5,-15],[3,-8]],[[3143,2978],[-21,-16],[-10,-6],[-9,-2],[-7,0],[-12,-2],[-6,-2],[-7,-3],[-13,-10]],[[2881,3114],[4,-11],[8,-14],[40,-65],[2,0],[14,11],[18,15],[17,13],[43,35],[3,2],[3,-1],[9,-12],[11,-17],[25,21]],[[2901,3123],[19,6]],[[2920,3129],[12,2],[20,5],[16,5],[15,9],[11,8],[9,8],[8,7],[18,23]],[[3029,3196],[44,-52],[16,-21],[9,-17]],[[2920,3129],[0,25],[-1,40],[5,17],[7,18],[9,12],[12,12],[12,8],[20,11],[-7,24]],[[2977,3296],[19,8],[8,-22],[5,-18],[5,-11],[6,-10],[9,-11],[14,-18]],[[3043,3214],[-14,-18]],[[1823,2038],[-7,16],[-4,7],[-18,15],[-6,7],[-10,22]],[[1757,1958],[-2,3],[-10,21],[-10,21],[-11,24]],[[1724,2027],[-9,19],[-2,6],[-3,1],[-29,-22],[-15,32]],[[1671,1904],[-17,36]],[[1654,1940],[19,12],[10,-21],[2,0],[7,4],[7,6],[0,3],[-3,8],[-6,12],[-3,5],[-10,22],[18,13],[29,23]],[[1654,1940],[-9,21],[-19,41],[-4,16],[-5,18],[-3,4]],[[6347,2548],[-57,41],[-14,-20],[-11,-7],[-18,12],[-15,12],[-15,3]],[[5577,3559],[-3,-3],[-24,-38]],[[5550,3518],[-20,-25],[-22,-30],[-15,-20],[-4,-4]],[[5489,3439],[-18,-24],[-35,-45]],[[5402,3321],[42,-43],[3,-4],[16,-17],[4,-3],[21,-23],[6,-6],[3,-3]],[[5497,3222],[6,-5],[4,-5],[6,-9],[5,-9],[6,-15],[4,-19],[3,-17]],[[4365,2120],[-83,83],[-2,3],[-88,154],[-32,58],[41,62],[-121,125]],[[4080,2605],[22,17],[8,5],[8,3],[44,10],[3,-17],[2,-6],[3,-6],[6,-11],[3,-4],[4,-5],[21,-22],[36,-40],[5,-14],[72,16],[5,1],[77,19],[156,37],[10,0],[11,14],[17,22],[70,92],[38,51],[16,10],[27,-27],[28,36],[0,4],[-18,21],[32,38],[5,5],[6,4],[7,1],[7,0],[6,-1],[7,-4],[12,-7],[12,-5],[12,-7],[10,-6],[5,-2],[5,0],[2,0],[3,0],[2,0],[-9,12],[-12,16],[-2,3],[-3,4],[-3,3],[-3,4],[-4,4],[-4,5],[-2,3],[-5,5],[-6,7],[-6,6],[-7,8],[-4,3],[-5,5],[-2,2],[14,-1],[12,-1],[42,-4],[30,-3],[11,-1],[36,-4],[37,-3],[20,-2],[18,-2],[-2,6],[-3,9],[6,69],[2,3],[5,63],[2,12],[2,12],[2,4],[8,19],[2,3],[8,12],[11,14],[54,69],[41,52],[43,55],[66,86],[4,10],[3,2],[2,4],[2,5],[3,4],[7,10],[2,2]],[[5300,3421],[5,8],[14,18],[6,8],[5,8],[6,15],[4,13],[3,19],[0,12],[4,2],[3,9],[8,17],[3,6],[2,5],[1,5],[-1,26]],[[5363,3592],[15,2],[15,-15],[22,28]],[[5415,3607],[7,9],[14,19],[3,3],[2,-2],[38,-40],[11,14]],[[5490,3610],[6,8],[1,0],[1,0],[1,0],[1,-1],[11,-11],[5,0],[19,1],[-1,-1],[-1,-1],[-1,-1],[0,-2],[1,-23],[6,1],[8,0],[5,0],[4,-1],[3,-2],[14,-14],[4,-4]],[[5031,3567],[1,-25],[-34,-3],[-22,0],[-9,-1],[-13,-1],[2,-21],[6,-20],[-11,-3],[-8,-7],[-5,-7],[42,-44],[-1,-2],[-23,-33],[-17,-27]],[[4939,3373],[-17,18],[-13,14],[-6,6],[-14,14],[-15,16],[-8,4],[-6,2],[-6,2],[-5,3],[-8,8],[-1,3],[-1,5],[1,8],[2,4],[7,7],[6,4],[5,3],[3,3],[5,5],[10,12],[-17,18],[-1,3],[-15,16],[-10,12],[-3,0],[-4,3]],[[4828,3566],[41,50],[7,7],[4,4],[6,3],[5,2],[5,2],[16,3],[7,1]],[[4919,3638],[34,2],[21,2]],[[4974,3642],[19,0]],[[4993,3642],[0,-3],[1,-20],[1,-23],[1,-31],[35,2]],[[4939,3373],[-15,-17],[-26,-27],[-10,-10],[-67,68],[-71,76],[-4,4],[82,99]],[[5031,3567],[23,1],[6,0],[8,-2],[33,1],[16,1],[36,4],[6,0],[6,-10],[6,-7],[40,-42]],[[5211,3513],[-2,-3],[-63,-81],[-28,-37],[-4,-4],[-3,-2],[-11,-5],[-8,21],[-2,3],[-22,-10],[-26,-12],[-3,-1],[-1,0],[-3,2],[-35,36],[-12,-20],[-13,-17],[-13,-16],[-5,-7],[-3,-3],[-15,16]],[[5211,3513],[31,-33],[28,-27],[27,-29],[3,-3]],[[4080,2605],[-28,43],[1,0],[12,10],[97,81],[7,5],[12,36],[1,2],[1,0],[2,2],[11,4],[1,3],[8,4],[0,7],[1,4],[4,1],[-1,5],[3,2],[2,3],[-2,3],[0,3],[-4,1],[-4,0],[-4,-1],[-4,-1],[-3,1],[3,8],[-1,5],[-6,34],[4,4],[5,4],[-1,6],[0,1],[-2,8],[4,7],[8,6],[12,8],[16,14],[-7,17],[-9,19],[-26,49],[-27,50]],[[4166,3063],[-48,44],[-61,58],[10,4]],[[4067,3169],[42,48],[-19,22]],[[4158,3361],[36,-47],[23,30],[20,-20],[11,12],[65,-62],[31,40],[20,-24],[37,44],[5,0],[4,2],[1,5],[14,11],[23,-1],[33,29],[-26,28],[-1,1],[-42,47]],[[4412,3456],[31,18],[15,11],[0,1],[32,19],[8,5],[45,28],[3,1]],[[4546,3539],[7,5],[36,22],[69,39],[28,16],[125,75],[36,22]],[[4847,3718],[20,-11],[51,-58],[1,-11]],[[5211,3513],[15,21],[30,39],[24,32]],[[5280,3605],[15,-20],[5,6],[2,0],[3,-2],[3,-5],[-6,-9],[16,-17],[25,32],[6,1],[14,1]],[[5374,3648],[16,-17],[7,9],[8,-8],[0,-1],[-6,-8],[16,-16]],[[5280,3605],[18,24],[6,8],[12,16]],[[5316,3653],[8,-3],[12,-11],[21,28],[17,-19]],[[6777,2060],[-58,37]],[[7388,3093],[-11,5]],[[7377,3098],[-28,13],[-10,1],[-8,-1],[-7,-1],[-8,-3],[-38,-10],[-18,-3],[-26,0],[-16,0]],[[7350,3037],[3,8],[4,0],[2,7],[-4,6],[21,38]],[[7376,3096],[1,2]],[[7338,3047],[12,27],[5,9],[4,7],[17,6]],[[5555,4114],[-40,-28]],[[5515,4086],[-46,-34],[-46,-34],[-2,-4],[-11,-8],[-2,3],[-16,18],[-3,4],[-2,3],[-2,2],[-3,3]],[[5524,4010],[-20,-25]],[[5504,3985],[-13,14],[-4,4],[-14,14],[-14,-19],[-16,-20],[-29,-36]],[[5414,3942],[-16,14],[-10,10],[-4,4],[-9,10]],[[5375,3980],[-3,3],[-7,7],[-21,22],[-3,2]],[[5341,4014],[39,24]],[[5515,4086],[11,-22],[-11,-6],[-10,-7],[-8,-6],[7,-11],[8,-11],[6,-7],[6,-6]],[[5504,3985],[35,-37]],[[5539,3948],[-14,-19],[-36,38],[-14,-19],[36,-38],[44,-47]],[[5526,3826],[-34,36]],[[5492,3862],[-11,11],[-67,69]],[[5539,3948],[46,-47]],[[5610,4014],[8,0],[3,-1],[2,-4],[-2,-4],[-3,-2],[-5,-2],[0,-3],[0,-8],[-1,-8],[11,-3],[9,-5],[-5,-12],[0,-3],[2,-2],[3,-5],[7,-6]],[[5524,4010],[5,-5],[11,-8],[11,20],[11,18],[11,-8],[7,-6],[9,-6],[9,-5],[9,-3],[5,0],[-2,7]],[[5610,4014],[-1,3],[-3,7],[-3,7],[11,6],[2,2],[5,6]],[[7592,2355],[0,-1],[-1,-4],[-1,-3],[0,-2],[-4,-17],[-2,-7],[-1,-4],[-4,-17],[-3,-14],[-2,-9],[-1,-3],[-1,-3],[-11,-43],[-1,-4]],[[7560,2224],[-3,-11],[0,-1],[0,-1],[0,-1],[-1,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-1],[0,-2],[0,-1],[0,-1],[0,-2],[0,-2],[1,-5],[0,-2],[0,-1],[1,-1],[0,-2],[0,-1],[1,-1],[0,-2],[1,-1],[0,-1],[0,-1],[1,-3],[1,-1],[1,-2],[0,-1],[1,-1],[0,-2],[1,-1],[1,-1],[1,-2],[0,-1],[1,-2],[1,-1],[2,-2],[6,-9],[6,-7],[13,-18],[6,-9],[2,-2],[2,-2],[2,-2]],[[7613,2099],[-2,-2],[-2,-2],[-1,-1],[-5,-6],[-2,-2],[-40,-40],[-4,-4],[-2,-2],[-3,-3],[-34,-26],[-130,-88],[-4,-3],[-72,-34],[-42,-22],[-24,-13],[-96,-72],[-58,-45],[-38,-41],[-22,-27],[-8,-10],[-4,-4],[-4,-4],[-20,-25],[-18,-25],[-31,-53],[-9,-13]],[[7473,2222],[2,2],[12,16],[4,5],[3,4],[5,8],[27,40],[8,10],[9,7],[5,5],[41,36],[1,1],[2,-1]],[[7590,1280],[-53,-103],[-2,-4]],[[6457,1354],[28,-19],[5,-11],[2,-2],[3,-2],[1,-2],[2,-1],[0,-1],[3,-3],[2,-2],[3,-4],[1,-4],[2,-3],[1,-2]],[[6510,1298],[-12,-4],[-3,-1],[-91,-29],[-6,-2],[-38,-10],[-21,-6],[-75,-24],[-4,-2],[-6,-2]],[[6254,1218],[0,5],[-1,35],[-22,0],[-23,-1]],[[6208,1257],[0,65]],[[6208,1322],[22,0],[0,32],[15,36],[3,8],[1,4],[1,3],[-6,4],[-11,6],[-10,6],[-54,37],[-9,6],[-7,4]],[[6153,1468],[-1,1],[-7,4],[-4,3],[-6,3],[-7,3],[-7,3],[-6,3],[-7,2]],[[6153,1321],[-1,100],[0,37],[0,6],[1,4]],[[6208,1322],[-19,0],[-18,-1],[-18,0]],[[6172,1257],[-19,0]],[[6153,1257],[0,64]],[[6208,1257],[-19,0],[-17,0]],[[6153,1257],[-17,-1],[-18,0],[-12,1]],[[6105,1421],[12,0],[17,0],[1,-100],[18,0]],[[6137,1181],[-19,-6]],[[6118,1175],[0,5],[-8,12],[-5,57],[1,8]],[[6172,1257],[0,-60],[-18,-5],[-18,-6],[1,-5]],[[6254,1218],[-22,-7],[-95,-30]],[[5468,3830],[-27,27],[-2,1],[-2,-1],[-40,-52],[-39,-52],[15,-16],[13,-13]],[[5386,3724],[-13,-18]],[[5373,3706],[-13,13],[-16,16],[-3,-2],[-4,-6],[-18,-22],[-18,-24],[1,-12],[14,-16]],[[4993,3642],[21,2],[21,1],[22,1],[10,2],[8,2],[8,5],[8,8],[7,8],[10,17],[9,15],[1,3]],[[5118,3706],[12,19],[13,22],[13,20]],[[5156,3767],[13,19],[16,19],[14,17],[26,30],[11,9],[16,10],[7,5],[14,11],[42,41],[19,18],[6,4],[22,19],[10,9],[3,2]],[[5492,3862],[-3,-3],[-13,-17],[-8,-12]],[[5468,3830],[11,-12],[-14,-20],[-14,-18],[-3,2],[-10,9],[-13,-15],[-10,-15],[9,-13],[-1,-5],[-25,-32],[-12,13]],[[5601,3534],[-24,25]],[[5490,3610],[-26,28],[7,10],[-13,14],[-11,11],[-3,1],[-6,-6],[-2,-1],[-1,1],[-9,10],[-3,3],[-12,12],[-11,-15]],[[5400,3678],[-4,4],[-23,24]],[[5400,3678],[-4,-2],[-22,-28]],[[8925,5145],[-10,6],[-8,4],[-5,2],[-1,1],[-10,5]],[[8908,5098],[-10,-24],[-10,6],[-14,8],[-10,5]],[[8889,5051],[-10,5],[-14,8],[-10,6]],[[8846,5047],[-11,6],[-18,9],[-10,6]],[[8807,5068],[9,23]],[[8837,5023],[-11,6],[-19,10],[-10,5]],[[8797,5044],[-11,6],[-19,10],[-10,5]],[[8757,5065],[9,25],[10,-6],[20,-11],[11,-5]],[[8776,4996],[11,25],[10,23]],[[8847,5017],[-5,-11],[-4,-12],[-11,6],[-10,-26],[-41,22]],[[8816,4937],[-11,6],[-12,6]],[[8793,4949],[-29,16]],[[8764,4965],[5,12],[6,15],[1,4]],[[8796,4920],[-12,6],[5,12],[4,11]],[[8812,4853],[-10,5],[-16,8],[-9,6]],[[8777,4872],[-41,21]],[[8736,4893],[10,25],[4,12],[5,12],[-23,12],[1,2],[3,8],[5,13]],[[8741,4977],[23,-12]],[[8792,4795],[-11,5],[-31,17]],[[8750,4817],[6,11],[8,17],[11,23],[2,4]],[[8750,4817],[-38,21]],[[8712,4838],[5,11],[8,16],[6,14],[4,11],[1,3]],[[8728,4768],[-10,6],[-18,9],[-11,5]],[[8689,4788],[6,16],[6,11],[5,11],[6,12]],[[8750,4817],[-5,-11],[-6,-11],[-4,-10],[-1,-2],[-6,-15]],[[8773,4746],[-10,5],[-24,12],[-11,5]],[[8765,4723],[-11,5],[-24,12],[-10,5]],[[8720,4745],[8,23]],[[8745,4670],[-11,6],[-23,12],[-10,5]],[[8701,4693],[9,26],[10,26]],[[8730,4629],[-9,5],[-25,13],[-11,5]],[[8685,4652],[8,21],[8,20]],[[8685,4652],[-7,-21]],[[8678,4631],[-11,5],[-18,9],[-11,5],[8,19],[0,2],[9,22],[7,19]],[[8662,4712],[10,-5],[13,-6],[5,-3],[11,-5]],[[8700,4595],[-20,10],[-10,5]],[[8670,4610],[8,21]],[[8661,4587],[-36,19],[-4,1],[-39,19]],[[8582,4626],[5,11],[4,12]],[[8591,4649],[8,21]],[[8599,4670],[7,19],[1,2]],[[8607,4691],[8,22],[7,19]],[[8622,4732],[11,-5],[10,-5],[8,-4],[11,-6]],[[8670,4610],[-5,-11],[-4,-12]],[[8643,4542],[9,24]],[[8652,4566],[4,11],[5,10]],[[8652,4566],[-35,17],[-4,2],[-10,-24],[-2,1],[-7,4],[-20,10],[-10,5]],[[8564,4581],[10,24]],[[8574,4605],[8,21]],[[8545,4525],[10,29],[0,3],[9,24]],[[8545,4525],[-2,1],[-9,5],[-11,5],[-17,4],[-36,5]],[[8470,4545],[12,30],[6,15],[9,24],[5,14],[4,11]],[[8506,4639],[36,-19],[22,-10],[2,-1],[8,-4]],[[8506,4639],[4,10],[4,11]],[[8514,4660],[10,-5],[26,-13],[20,-10],[2,-1],[10,-5]],[[8514,4660],[4,12],[4,11]],[[8522,4683],[10,-5],[49,-24],[10,-5]],[[8522,4683],[8,21]],[[8530,4704],[9,-5],[2,0],[47,-24],[11,-5]],[[8530,4704],[8,21]],[[8538,4725],[11,-5],[47,-24],[11,-5]],[[8538,4725],[8,22]],[[8546,4747],[7,20]],[[5016,1222],[4,-1],[16,-1],[4,-5],[1,-11],[-2,-4],[-2,-2],[-4,-2],[-13,-4],[-8,-2],[-4,0],[-8,4],[-5,0],[-2,-1],[-4,-2],[-4,-6],[-2,-9],[-4,-6],[-8,-6],[-6,-4],[-3,-8],[-3,-3],[-15,-6],[-7,-4],[-12,-3],[-11,0],[-13,4],[-16,12],[-13,12],[-3,2],[-1,3],[-8,3],[-5,1],[-3,1],[-3,1],[-2,0],[-2,0],[-9,-3],[-9,-10],[-7,-1],[-6,-2],[-4,2],[-4,2],[-9,5],[-6,6],[-2,0],[-5,4],[-3,0],[-5,1],[-4,0],[-3,1],[-5,3],[-2,1],[-4,-1],[-2,-10],[-3,-4],[-9,2],[-2,2],[-1,0]],[[4741,1173],[-2,3],[1,20],[-2,4],[-5,2],[-2,20]],[[4731,1222],[11,-2],[3,0],[16,1],[4,0],[4,1],[11,4],[8,8],[2,0],[0,1],[1,2],[2,2],[2,2],[3,3],[4,4],[5,3],[13,8],[13,5]],[[4833,1264],[26,5],[11,2],[15,2],[20,6]],[[4905,1279],[4,1],[17,2],[19,0],[6,-30],[3,-25],[4,-24],[38,9],[8,1],[6,-3],[5,0],[1,9],[0,3]],[[5122,1221],[0,-4],[3,-15]],[[5125,1202],[-8,2],[-10,1],[-20,1],[-5,0],[-4,-1],[-18,-2],[-2,2],[-6,6],[-8,10],[-4,2],[-11,2],[-9,0],[-4,2]],[[5016,1227],[1,8],[17,0],[0,33],[-18,1],[0,12]],[[5016,1281],[11,0],[26,-1],[11,-2],[11,-7],[9,-8],[10,-12],[5,-9],[10,-10],[7,-7],[6,-4]],[[1506,1092],[-3,7],[-2,7],[-3,45],[-11,27]],[[1560,1505],[64,-17]],[[1624,1488],[14,-49],[22,-78],[23,-80],[29,-62],[4,-7],[2,-5],[3,-3],[4,0],[5,1]],[[1983,1486],[7,-12],[33,-54],[4,-7]],[[1624,1488],[2,-1],[26,11],[10,4],[2,4],[9,4],[5,-7],[6,8],[8,7],[7,7],[34,24],[3,3],[16,12],[9,11],[15,23],[12,16],[13,17]],[[6475,2834],[-8,6],[11,20],[0,17],[-12,8],[2,12],[4,14],[10,16],[-5,4],[-2,1],[-2,2]],[[7999,2859],[-7,9],[-7,7],[-5,4],[-2,3]],[[7978,2882],[3,3],[32,42],[2,2],[4,6],[8,10],[12,16],[0,1],[20,25],[5,7],[4,5],[3,2]],[[7920,2741],[-10,27]],[[7910,2768],[-8,17],[-1,2],[-1,4]],[[7900,2791],[15,15],[8,9],[15,17],[7,8],[11,14],[14,17],[8,11]],[[7978,2882],[-2,4],[-1,2],[-1,3],[-4,6],[-2,3],[-8,10],[-8,9]],[[7900,2791],[-1,1],[-1,3],[-3,5],[-2,6],[-2,3],[-2,5],[-4,5],[-8,11],[-15,19],[-2,3],[14,7],[-26,13],[-8,4],[-13,7]],[[7850,2917],[3,0],[2,-2],[1,-3],[4,-4],[8,-9],[8,10],[4,6],[2,3],[14,18]],[[7896,2936],[7,-6],[2,-1],[15,-12],[13,-10],[15,14],[3,-3],[1,1]],[[8723,2851],[-10,7],[-12,6],[-16,5],[-40,13],[-5,1],[-2,1],[-32,10],[-33,10],[-2,-1],[-4,1],[-21,7],[-4,2],[-3,2],[-7,2],[-10,4],[-13,7],[-13,10],[-7,7],[-4,3],[-10,12],[-7,10],[-6,9],[-5,11],[-3,9],[-1,2],[-3,11],[-2,6]],[[8448,3018],[7,2],[1,2],[1,6],[6,35],[3,22],[2,20],[0,2],[0,2],[-1,0],[-6,4],[-1,1],[2,5],[0,5],[0,9],[0,3],[2,23],[1,24],[-1,21]],[[8595,3755],[-7,-33],[-50,-139],[0,-2],[26,1],[27,75],[3,0],[3,15],[13,-16],[-22,-123],[8,-1],[-10,-57],[-89,-6],[-17,-47],[0,-1],[98,9],[-7,-30],[-97,-10],[-4,-25],[54,6],[0,-5],[-54,-6],[-4,-19],[97,13],[-6,-32],[-90,-12],[6,-49],[1,-11],[4,-26],[6,0],[0,-5],[4,-1],[5,20],[11,1],[-3,-27],[3,0],[2,8],[2,0],[4,15],[22,-3],[0,-13],[2,0],[-7,-113],[1,0],[0,-3],[-9,-131],[2,-5],[3,1],[0,-6],[6,0],[1,-2],[4,-1],[0,8],[6,-1],[7,103],[13,173],[1,2],[8,-1],[30,0],[-11,-169],[22,-2],[12,159],[3,41],[3,50],[0,7],[5,49],[3,18],[10,75],[3,27],[2,8],[3,2],[2,1],[3,-2],[5,-4],[-1,-102],[-1,-17],[1,-81],[1,-12],[-2,-19],[-1,-22],[0,-16],[0,-20],[0,-18],[8,-43],[0,-13],[1,-2],[7,-55],[14,-111],[3,-10],[6,-18],[7,-21],[16,-33],[13,-30],[2,-4]],[[8376,2911],[3,3],[31,28],[3,1],[8,-1],[7,0],[9,-1],[9,2],[7,1],[4,2],[6,-1],[5,0],[7,0],[0,3],[-6,6],[-2,3],[-3,6],[-4,5],[-3,5],[-4,6],[-3,5],[-1,4],[-2,4],[-3,6],[-8,-7],[-2,1],[2,21],[-7,0],[-4,-33],[-11,-10],[4,41],[-7,-1],[-6,-50],[-21,-20],[-5,-4]],[[8379,2936],[2,3],[7,29]],[[8388,2968],[4,21],[3,23],[14,2],[30,2],[2,0],[3,1],[4,1]],[[8448,3018],[-6,26],[-6,19],[-3,11],[-1,3],[-6,12],[-7,11],[-8,8],[-3,3],[-6,4],[-28,19],[-10,6],[-4,3],[-16,10],[-11,7],[-7,4],[-32,26]],[[8294,3190],[1,3],[1,2],[1,4],[20,46],[5,12],[4,9],[4,12]],[[8388,2968],[-29,17],[-2,2],[-40,25],[-8,-19],[-6,-12],[-31,5],[-11,2],[-11,3],[-9,6],[-6,4],[-3,4],[-6,6]],[[8226,3011],[12,23],[9,22],[15,37],[6,16],[1,4],[3,9],[2,6],[2,6],[5,15],[10,29],[1,5],[0,1],[1,2],[1,3],[0,1]],[[8159,3023],[17,28]],[[8176,3051],[50,-40]],[[8226,3011],[-12,-25],[-14,-27]],[[8379,2936],[-3,-4],[-3,-2],[-15,-12],[-32,-27],[-30,-28],[-8,-9],[-3,-2]],[[2357,1179],[-39,-11],[-36,-9],[-22,-6],[-35,-9]],[[2225,1144],[-10,35],[-1,4],[-25,84],[-4,7],[-10,19]],[[2175,1293],[10,5],[1,0]],[[2323,1305],[6,-15],[-1,-3],[1,-5],[2,-8],[6,-19],[1,-6],[3,-12],[3,-11],[6,-24],[7,-23]],[[2439,1152],[8,-30],[-9,-3],[-11,-4],[-9,-3],[-10,-4],[-10,-3],[-18,-7],[-2,0],[2,-9]],[[2380,1089],[-36,-13],[-48,-17],[0,-1],[0,-2],[0,-1],[18,-70],[-39,-11]],[[2275,974],[-2,7],[-2,6],[-9,32],[-7,26],[-30,99]],[[2357,1179],[3,-15],[3,-8],[50,12],[20,6],[3,-9],[3,-13]],[[2421,1382],[2,-8],[3,-10],[0,-3],[3,-10],[6,-24],[12,-48],[6,-24],[-11,-4],[3,-11],[3,-12],[4,-19],[2,-4]],[[2454,1205],[-1,-2],[11,-42],[-25,-9]],[[2454,1205],[58,20],[25,9],[4,2]],[[2541,1236],[10,-39]],[[2551,1197],[-3,-2],[8,-25],[-1,-5],[-1,-2],[-1,-2],[-2,-3],[-7,-2],[4,-18],[4,-16],[-6,-1],[-1,0],[-3,2],[-1,0],[-22,-7],[0,-1],[-1,-1],[0,-1],[10,-34],[-20,-9],[-32,-17],[-37,-17],[-40,-17],[-2,9],[-4,11],[-4,16],[-2,10],[-7,24]],[[2582,1092],[-3,-1],[-7,-3],[-1,-1],[-26,-12],[-56,-24],[-90,-41],[-55,-22],[-22,-7],[-38,-10],[-6,-2]],[[2278,969],[-3,5]],[[2551,1197],[13,-40],[5,-8],[3,-2],[2,0],[3,-1],[9,3],[15,6],[42,15],[-4,16]],[[2639,1186],[4,2],[45,15],[1,0],[1,-1],[5,-19],[0,-2],[0,-1],[-49,-22],[7,-28],[69,31],[48,22]],[[2770,1183],[46,21]],[[2816,1204],[1,-6]],[[2817,1198],[-2,-1],[-153,-69],[-74,-33],[-6,-3]],[[2607,1311],[3,-11],[1,-1],[13,0],[5,0],[9,2],[2,-11],[4,-13]],[[2644,1277],[-6,-2],[-3,0],[-13,0],[-1,-14],[0,-6],[3,-11],[11,-44],[4,-14]],[[2541,1236],[-30,118],[-5,16]],[[2506,1370],[13,4],[7,-24],[10,4],[3,0],[35,-7],[1,-1],[1,-2],[4,-17],[6,-20],[1,-3],[20,7]],[[2488,1435],[4,-9],[2,-9],[12,-47]],[[2757,1440],[59,-236]],[[2770,1183],[-5,22],[-1,1],[-2,1],[-7,-3],[-15,55],[-5,22],[-9,25],[-1,1],[-1,1],[-1,0],[-1,0],[-11,-4],[-7,-4]],[[2704,1300],[-5,17],[-2,8],[21,7],[1,1],[-4,17],[0,13],[-7,29],[-8,31],[-1,1],[-1,0],[-60,0],[-7,1],[-1,-1],[0,-1],[0,-4],[7,-25],[-20,-7],[-27,-9],[6,-24],[11,-43]],[[2488,1435],[22,3],[247,2]],[[2704,1300],[-13,-6],[-6,-3],[-20,-7],[-21,-7]],[[2537,873],[-2,-1],[-2,-2],[-12,-7],[-2,-3],[-13,-9],[-12,-13],[6,-11],[2,2],[1,-1],[-2,-3],[-4,-3],[-10,11],[-4,-3],[-11,-11],[-14,-16],[-3,-2],[-3,-1],[-4,-4],[-4,-6],[-5,-3],[-5,-6],[0,-2],[0,-2],[-15,-18],[-2,-3],[-1,-1],[-3,0],[-3,-1],[-2,-4],[-8,-4],[-13,-1],[-3,1],[-13,1],[-12,2],[-13,0],[-16,-4],[-2,-2],[-5,-5],[-3,-1],[-2,-1],[-1,-1],[-11,-5],[-6,-4],[7,-19],[-4,-3],[-4,10],[-1,0],[2,-8]],[[2228,744],[9,10],[9,8],[10,5],[16,7],[43,17],[23,9],[21,8],[-11,38],[-13,45],[0,2],[1,0],[1,1],[1,0],[4,-1],[6,-2],[6,-3],[5,-4],[22,7],[-2,3],[-4,5],[-4,5],[-6,4],[-7,4],[-9,4],[-10,2],[-11,0],[-1,1],[-7,23]],[[2320,942],[10,1],[13,-1],[8,-2],[5,-1],[12,-4]],[[2215,729],[-2,5],[-6,23],[-6,19],[2,4],[6,7],[1,3],[-1,2],[-1,3],[-7,8],[-29,101],[17,6],[5,1],[8,3],[22,6],[73,19],[10,2],[13,1]],[[1879,863],[27,8],[14,3],[32,8],[56,16],[46,12],[17,4],[70,20],[124,31],[13,4]],[[2582,1092],[3,-15],[1,-6],[0,-4],[2,-8],[0,-4]],[[2104,990],[13,2],[5,1],[5,3],[3,3],[4,5]],[[2134,1004],[4,-5],[4,-3],[11,-19],[1,-1],[1,0],[38,10],[20,6],[4,-10],[2,-9],[4,-12],[52,13]],[[2134,1004],[2,3],[2,7],[1,6],[0,8],[-1,7],[-5,23],[17,5],[0,2],[0,3],[-2,7],[-3,5],[-3,5],[-5,6],[-5,5],[-2,5],[-2,5],[-5,18],[20,5],[5,-18],[2,-5],[4,-3],[5,-2],[4,1],[20,7],[22,10],[-5,19]],[[2200,1138],[25,6]],[[2096,1141],[41,12],[-3,9],[1,4],[2,7],[2,6],[25,-1],[16,-1],[3,0],[4,1],[6,-20],[-4,-10],[6,-5],[5,-5]],[[2069,1205],[-4,19],[0,3],[1,2],[37,8],[-8,26],[-6,23],[16,6],[3,3],[7,-23],[41,14],[12,4],[7,3]],[[2023,1318],[25,12],[16,9],[5,2],[1,1],[26,-42],[12,11],[22,21],[30,18],[24,-49],[2,-3]],[[2030,1408],[6,4],[50,41],[36,29],[17,14]],[[1953,1581],[11,-19],[9,-15],[1,-3],[77,61],[21,17]],[[6461,6069],[4,24],[18,-5],[8,-1]],[[6491,6087],[1,-12],[-2,-13],[-1,-5]],[[6489,6057],[-1,-4],[-2,-9],[-25,25]],[[6489,6057],[26,-26],[4,-4]],[[6519,6027],[-1,-5],[-4,-13],[-2,-10],[-6,-28],[-2,-8]],[[6504,5963],[-4,3],[-4,1],[-24,19]],[[6472,5986],[2,6],[2,11],[5,22],[-25,19],[5,25]],[[6326,5854],[4,-2],[25,-26],[2,1],[2,0],[2,-3],[1,-3],[33,-23]],[[6395,5798],[-2,-6],[-3,-5],[-3,-2],[-5,-3],[-6,-5],[-3,-1],[-3,-4],[-12,-26],[-3,-6]],[[6355,5740],[-10,-23],[-5,-11]],[[6340,5706],[-16,8],[-4,-11],[-2,-14],[-11,-39],[-5,1],[-1,-10],[-5,-14],[-7,-3]],[[6289,5624],[-4,-1],[-5,-2]],[[6280,5621],[-14,15],[-18,23],[-3,6],[0,1],[-16,-8],[-5,4],[-6,6],[-5,7],[-5,9],[-4,9],[0,7],[5,15],[5,9],[2,4],[9,13],[3,9],[11,25],[5,10],[3,8],[5,8],[22,24],[5,5],[2,2],[1,3],[0,13],[12,16],[3,6],[0,10],[13,31],[5,7],[1,1],[5,4],[8,4],[8,8],[1,-2],[-5,-5],[5,0],[4,2],[9,9],[25,29],[0,2],[3,-1],[3,5],[4,10],[2,1],[0,-5],[-1,-10],[-4,-10],[-8,-14],[-7,-9],[-8,-6],[-7,-3],[-14,-13],[-10,-10],[-1,-1],[-5,-11],[-6,-13],[-4,-13],[-1,-5],[1,-1],[0,-3],[-4,-7],[-1,-5],[-3,-6],[0,-4],[-9,-12],[0,-23],[-2,-13],[-5,-15],[0,-4],[-1,-5],[-2,-7],[-1,-13],[2,-1],[2,3],[2,-1],[-3,-12],[7,-2],[2,3],[3,6],[5,13],[1,6],[2,9],[1,8],[-1,26],[1,16],[5,5],[6,6],[-1,4],[1,5],[3,12],[3,4]],[[6407,6036],[-3,-8],[-3,9],[-3,0],[-2,2],[0,10],[1,8],[5,23],[0,6],[3,9],[6,11],[1,1],[6,-3],[1,-9],[-2,-14],[-4,-19],[-4,-8],[-2,-6],[0,-12]],[[6428,5995],[1,7],[3,10],[4,5]],[[6436,6017],[3,-9]],[[6439,6008],[-11,-13]],[[6395,6005],[-1,0],[-3,3],[0,2],[2,0],[3,0],[0,-2],[0,-1],[-1,-2]],[[8581,4842],[7,19],[4,9]],[[8592,4870],[5,10],[4,10]],[[8601,4890],[44,-24],[16,-8],[10,-6]],[[8671,4852],[-9,-16],[-1,-2],[-5,-11],[-2,-4],[-4,-12]],[[8689,4788],[-8,-23],[-11,5],[-7,4],[-6,3],[-15,8]],[[8671,4852],[3,6]],[[8674,4858],[10,-6],[28,-14]],[[8674,4858],[6,12],[7,16],[9,24],[1,4]],[[8697,4914],[11,-6],[28,-15]],[[8601,4890],[7,18],[7,16],[5,12],[5,12],[1,3]],[[8626,4951],[34,-18]],[[8660,4933],[4,-2],[33,-17]],[[8660,4933],[10,25],[9,24]],[[8679,4982],[9,23]],[[8688,5005],[29,-15],[8,-5],[16,-8]],[[8626,4951],[-8,5],[-61,32]],[[8557,4988],[4,5],[7,19],[10,24]],[[8578,5036],[9,23]],[[8587,5059],[10,-5],[46,-24],[11,-7],[-9,-23],[34,-18]],[[8601,4890],[-42,22],[-23,12]],[[8536,4924],[3,10],[3,10]],[[8542,4944],[4,17],[10,24],[1,3]],[[8592,4870],[-62,34]],[[8530,4904],[3,10],[3,10]],[[8563,4793],[-11,5],[-40,20],[-9,5]],[[8503,4823],[9,26],[9,23],[6,21],[3,11]],[[8546,4747],[-11,6],[-39,20],[-10,4]],[[8486,4777],[7,20]],[[8493,4797],[10,26]],[[8538,4725],[-11,5],[-40,20],[-9,5]],[[8478,4755],[8,22]],[[8514,4660],[-12,6],[-38,19],[-10,5]],[[8454,4690],[8,23],[8,21]],[[8470,4734],[8,21]],[[8470,4734],[-11,5],[-45,23],[-13,6]],[[8401,4768],[7,21]],[[8408,4789],[13,-6],[45,-23],[12,-5]],[[8454,4690],[-12,6],[-5,2],[-37,18],[-13,7]],[[8387,4723],[7,24],[7,21]],[[8436,4644],[-10,5],[-42,21],[-12,6]],[[8372,4676],[7,25]],[[8379,4701],[8,22]],[[8454,4690],[-9,-22],[-9,-24]],[[8379,4701],[-74,37]],[[8305,4738],[8,22],[16,43]],[[8329,4803],[8,21]],[[8337,4824],[10,-4],[48,-24],[13,-7]],[[8337,4567],[-45,9]],[[8292,4576],[-1,13],[-2,30],[-2,38],[1,2],[0,6],[0,7],[-2,1],[0,5],[1,8],[1,5],[3,10],[5,12],[9,25]],[[8372,4676],[-3,-9],[-2,-6],[-3,-10],[-5,-15],[-9,-29],[-1,-3],[-8,-26],[-4,-11]],[[8436,4644],[-9,-24],[-5,-16],[-14,-38],[0,-2],[-3,-9]],[[8405,4555],[-3,1],[-65,11]],[[8378,4487],[-9,5],[-36,21],[-2,1],[-10,6]],[[8321,4520],[7,20],[7,20],[2,7]],[[8405,4555],[-3,-7],[-2,-2],[-8,-20],[-6,-17],[0,-3],[-8,-19]],[[8434,4454],[-9,5],[-6,4],[-34,19],[-7,5]],[[8405,4555],[65,-10]],[[8470,4545],[-5,-13],[-8,-20],[-8,-19]],[[8449,4493],[-8,-20],[-7,-19]],[[8524,4473],[-9,5],[0,-3],[-3,-7],[-4,-10],[-51,30],[-8,5]],[[8501,4414],[-12,7]],[[8489,4421],[-35,21],[-1,0],[-11,7],[-8,5]],[[8418,4414],[7,20],[9,20]],[[8489,4421],[-4,-10],[-4,-9],[0,-4],[-3,-7],[-4,-9],[-47,27],[-9,5]],[[8394,4366],[10,18],[7,14],[7,16]],[[8339,4404],[5,9],[6,10],[6,11],[5,14]],[[8361,4448],[8,-5],[14,-8],[18,-10],[8,-5],[9,-6]],[[8361,4448],[8,19],[9,20]],[[8361,4448],[-9,6],[-32,18],[-2,1],[-10,6]],[[8308,4479],[7,20],[6,21]],[[8295,4435],[6,21],[7,23]],[[4188,1444],[-4,25],[-6,25],[-4,24],[-5,31],[14,-2],[26,0],[17,-1],[24,-1]],[[4250,1545],[6,-30],[4,-19],[4,-18],[3,-17],[4,-17],[4,-17]],[[4275,1427],[-25,-1],[-17,0],[-21,-1],[-19,-5],[-5,24]],[[4296,1317],[4,-22],[6,-30]],[[4306,1265],[-4,2],[-4,2],[-5,2],[-12,4],[-9,2],[-4,0],[-6,1],[-8,36],[-19,-1],[-52,-3]],[[4183,1310],[-4,23],[-5,23],[-11,56]],[[4163,1412],[-5,24],[30,8]],[[4275,1427],[3,-18],[3,-17],[4,-19],[4,-19],[3,-17],[4,-20]],[[2744,974],[-8,32],[25,9],[9,3],[1,1],[2,1],[1,2],[4,8],[16,26],[16,30],[17,27],[-11,46],[0,1],[-1,1],[-1,0],[-20,-9],[-22,-10],[-25,-11],[-1,-1],[0,-1],[0,-1],[2,-10],[0,-1],[0,-1],[-11,-5],[-26,-12],[-21,-10],[-21,-10]],[[6481,5902],[-5,-12]],[[6476,5890],[-44,30],[-8,-14],[-4,-8],[-3,-9],[0,-1],[-1,-4],[-1,-3],[-5,-20],[36,-25],[4,-3]],[[6450,5833],[-10,-23],[-9,-19]],[[6431,5791],[-1,2],[-3,2],[-10,6],[-17,12],[-5,-15]],[[6326,5854],[2,3],[3,2],[2,1],[7,7],[2,7],[0,4],[6,8],[2,4],[3,3],[0,-4],[2,-5],[2,0],[1,2],[0,7],[1,6],[15,21],[8,11],[6,4],[7,3],[8,7],[6,5],[5,7],[6,11],[5,17],[3,10]],[[6439,6008],[33,-22]],[[6472,5986],[-6,-15],[28,-20],[3,-1],[-2,-7],[-5,-16],[-4,-11],[-5,-14]],[[6504,5963],[14,-11],[9,-7],[12,-4],[19,-13],[19,-15]],[[6577,5913],[-6,-12],[-11,-22],[-11,-23]],[[6549,5856],[-64,43],[-4,3]],[[6552,6028],[60,-67]],[[6612,5961],[-14,-17],[-2,-3],[-12,-18],[-7,-10]],[[6519,6027],[22,-23],[11,24]],[[6636,5872],[-22,15],[-37,26]],[[6612,5961],[58,-61]],[[6670,5900],[-6,-6],[-2,-2],[-3,-2],[-4,-3],[-2,-1],[-3,-1],[-9,-6],[-3,-3],[-2,-4]],[[6596,5793],[-9,6],[-16,12],[4,9],[-33,23],[7,13]],[[6636,5872],[-6,-12],[-11,-22]],[[6619,5838],[-12,-22],[-11,-23]],[[6714,5822],[4,-5],[6,-4],[7,-5],[11,-8],[11,-8]],[[6753,5792],[-1,-3],[-9,-16],[-8,-17]],[[6735,5756],[-9,5],[-46,32],[-3,3],[0,2],[-58,40]],[[6636,5872],[6,-6],[53,-34],[17,-13],[2,3]],[[6670,5900],[11,15],[7,7]],[[6688,5922],[38,-61],[5,-6],[5,-7]],[[6736,5848],[-9,-10],[-13,-16]],[[6688,5922],[13,11],[14,13]],[[6715,5946],[49,-74],[-15,-13],[-13,-11]],[[2102,1961],[17,11],[13,9],[12,10],[3,2],[1,1],[2,2]],[[2063,2107],[15,-34],[6,-11],[7,-11],[4,-5],[8,-10],[6,-7],[1,-2],[10,-9],[19,-14],[11,-8]],[[1983,2132],[10,12],[3,2],[3,0],[2,-1],[12,-27],[3,-6],[3,-4],[4,-4],[2,-5],[6,-14],[28,16],[1,3],[3,3]],[[2063,2107],[1,2],[10,4],[-9,19],[7,5],[7,3],[4,2]],[[2083,2142],[19,0],[9,-1],[0,-22],[7,0],[8,1],[7,3],[9,-19],[8,-18],[9,-19],[8,-20],[13,-19]],[[2083,2142],[0,20],[-9,0],[-11,25],[0,3],[7,18],[-14,8],[4,6],[7,15],[7,15],[6,12],[8,11],[7,9]],[[2095,2284],[10,-8],[2,-4],[3,-8],[13,-27],[17,10],[18,11],[18,11],[16,11],[17,11]],[[2209,2291],[11,-29]],[[2220,2262],[18,-51],[2,-5],[4,-4],[5,-4],[28,-16],[-2,-5],[-8,-23]],[[2063,2107],[-16,36],[-31,70],[-12,25],[-19,42]],[[1985,2280],[87,59],[28,17],[-14,41]],[[2086,2397],[5,19]],[[2091,2416],[6,-2],[3,-4],[23,-50],[-15,-9],[-9,-7],[-2,-2],[-1,-4],[-6,-22],[-3,-13],[0,-5],[1,-3],[7,-11]],[[1964,2154],[22,25],[-32,71],[3,1],[4,2],[4,0],[4,3],[19,11],[-5,11]],[[1983,2278],[2,2]],[[1955,2280],[7,-14],[21,12]],[[1932,2331],[2,1],[2,-5],[3,-3],[3,-1],[5,3],[2,1],[4,6],[1,2],[10,6],[6,1],[5,1],[5,7],[5,12],[-3,11],[3,12],[1,0],[3,2],[7,0],[4,1],[3,3],[1,2],[1,7],[-2,4],[1,6],[0,2],[0,21],[6,15],[5,9],[2,10],[0,18],[4,10],[3,19],[6,17],[5,22],[3,8]],[[2038,2561],[-2,-10],[21,-22],[2,-2]],[[2059,2527],[-5,-14],[-2,-5],[-9,-25],[-2,-6],[0,-2],[0,-6],[0,-6],[-1,-64]],[[2040,2399],[-2,-21],[-1,-7],[0,-5],[-2,-7],[-18,-20],[-11,-9],[-13,-10],[-6,-7],[-7,-13],[-2,-4],[6,-14],[1,-2]],[[2040,2399],[25,15],[9,6],[1,2]],[[2075,2422],[11,-25]],[[2059,2527],[3,8]],[[2095,2473],[-17,-24],[-8,-18],[5,-9]],[[2276,2393],[-37,17]],[[2239,2410],[1,8],[0,6],[0,5],[-2,6],[-2,6],[-7,17],[-2,1],[-2,-1],[-12,-6],[-7,19],[16,8],[-14,38],[-7,9],[-13,-14],[-12,-14],[-20,-22],[-15,19],[-15,-17],[-11,-16],[-9,-13]],[[2106,2449],[-9,-19],[-6,-14]],[[2239,2410],[-6,1],[-5,0],[-7,-1],[-5,-2],[-41,-21]],[[2175,2387],[-8,20],[-8,17],[-16,35],[-13,-18],[-12,-18],[-12,26]],[[2238,2271],[-18,-9]],[[2209,2291],[-15,32],[-4,5],[-6,4],[-7,4],[7,19],[4,11],[-6,5],[-3,6],[-4,10]],[[2299,2382],[-7,-19],[7,-18],[-10,-5],[-2,0],[-2,0],[-6,3],[-17,8],[-10,-29],[-26,-13],[-1,-3],[13,-35]],[[6797,5762],[-3,2]],[[6794,5764],[0,6],[1,5],[2,11],[1,6],[7,14],[10,17]],[[6815,5823],[10,19],[16,26],[-16,8],[-38,59]],[[6787,5935],[15,13]],[[6802,5948],[13,12],[14,12],[13,11],[-40,64]],[[6802,6047],[13,12],[15,12]],[[6830,6071],[41,35],[2,2]],[[6873,6108],[6,-9],[11,-16],[9,-14],[15,-24],[11,-17]],[[6925,6028],[2,-3],[2,-3]],[[6929,6022],[2,-3],[5,-7],[5,-5],[0,-1],[5,-5]],[[7185,6081],[-18,13],[-11,-15],[-4,0],[-32,23],[-11,-19],[-6,4]],[[7103,6087],[-16,11],[-5,-8],[-2,-2],[-8,-19],[-6,-18]],[[6929,6022],[120,237],[5,10],[7,13]],[[7061,6282],[12,24]],[[7159,6046],[-18,13],[-9,-18],[-9,-15],[-4,-1],[-30,23],[-1,1],[0,2],[0,2],[5,16],[10,18]],[[7061,6282],[-4,5],[-18,26],[-36,57]],[[7003,6370],[15,13],[17,13],[-36,57]],[[6999,6453],[16,13],[10,9],[14,13]],[[7039,6488],[14,11]],[[7053,6499],[36,-56],[26,-41],[3,-9]],[[7003,6370],[-35,56]],[[6968,6426],[15,13],[16,14]],[[4901,1424],[11,-63]],[[4912,1361],[-19,-5],[7,-49],[5,-28]],[[4833,1264],[-5,30]],[[4828,1294],[-3,22],[-3,17],[-2,4],[-2,2],[2,0],[2,1],[2,2],[4,10],[5,7],[7,5],[3,2],[1,2],[0,1],[-1,3],[0,1],[-1,2],[-4,0],[-3,2],[-4,3],[-2,5],[-3,8],[-3,13]],[[4823,1406],[-2,17],[0,8],[2,5],[2,4],[4,3],[4,-1],[3,-2],[3,-3],[2,-6],[5,-20],[19,5],[17,4],[19,4]],[[4731,1222],[-6,45],[0,3],[-1,2],[1,5],[-3,22]],[[4722,1299],[31,-3],[20,-2],[4,0],[24,-2],[14,0],[13,2]],[[4722,1299],[-2,19],[-10,64]],[[4710,1382],[31,6],[25,6],[39,8],[18,4]],[[4892,1481],[9,-57]],[[4710,1382],[-4,27],[-3,26],[-3,20],[0,5],[1,7],[1,1],[2,4],[6,7]],[[4710,1479],[3,3],[2,1],[2,2],[1,0],[8,5],[6,3],[13,6],[20,8],[12,3],[14,1],[7,0],[8,0],[4,-1],[4,0],[4,-2],[25,-9],[5,-1],[24,-9],[20,-8]],[[4710,1382],[-3,-1],[-60,-10],[-10,3],[-20,8],[-19,7],[-4,22],[-4,21],[-4,23],[-34,10],[4,-23],[4,-21],[3,-21]],[[4563,1400],[-33,10]],[[4530,1410],[-7,46],[-5,24],[-8,49],[-2,1],[-4,0],[-20,4],[-36,5],[-51,2]],[[4397,1541],[-96,3]],[[4301,1544],[-16,0],[-35,1]],[[4250,1545],[-1,6],[-1,5],[-1,5],[-3,13]],[[4689,1559],[-1,-3],[0,-4],[-1,-5],[0,-3],[0,-2],[0,-4],[0,-2],[1,-4],[0,-3],[1,-3],[1,-2],[1,-2],[1,-1],[1,-2],[1,-2],[1,-1],[3,-2],[3,-1],[4,-3],[4,-2],[3,-2],[1,-1],[1,-1],[1,-2],[0,-1],[1,-2],[0,-1],[1,-1],[0,-1],[0,-1],[0,-1],[0,-2],[0,-1],[-1,-2],[0,-1],[-1,-3],[-1,-1],[-2,-2],[-2,-3]],[[4722,1299],[-3,0],[-26,2]],[[4693,1301],[-26,2]],[[4667,1303],[-20,2],[-14,2],[-24,2]],[[4609,1309],[-31,2],[0,4],[-3,18],[-3,23],[-4,20],[-5,24]],[[4609,1309],[-1,-3],[13,-78],[1,-3],[0,-5]],[[4622,1220],[-16,9],[-3,2],[-5,2],[-5,2],[-17,7],[-4,1],[-7,3],[-5,1],[-3,1],[-3,1],[-5,0],[-5,0],[-25,-5]],[[4519,1244],[-4,25],[-1,1],[-2,1],[1,5],[-8,41],[-8,49],[-8,48]],[[4489,1414],[17,4],[4,-2],[17,-5],[3,-1]],[[4731,1222],[-13,-1],[-12,-3],[-11,-2],[-12,-1],[-11,-2],[-6,0],[-6,0],[-10,1],[-6,0],[-7,1],[-6,1],[-4,2],[-5,2]],[[4667,1303],[9,-44],[1,-2],[2,-1],[19,3],[2,4],[-7,38]],[[4741,1173],[-2,1],[-3,1],[-1,2],[1,5],[2,12],[-1,2],[-1,2],[-3,-1],[0,-7],[-11,-1],[-7,-1],[-12,-2],[-6,-2],[-9,0],[-16,2],[-14,6],[-18,-2],[-7,-3],[-2,0],[-5,-1],[-7,-6],[-7,-9],[-7,-7],[-7,-3],[-16,-4],[-4,-3],[-3,-8],[-7,-11],[-3,-9],[-5,-4],[-8,-5],[-6,-6],[-4,1],[-2,1],[-2,6],[0,14],[-1,6],[-3,6],[-5,8],[-4,7],[-10,9],[-12,8],[-10,4],[-4,2],[-7,1],[-6,-1],[-4,0],[-5,0],[-5,5],[-3,-3],[-4,-5],[-5,-7],[-7,-15],[-1,-1],[-2,-6],[-2,-1],[-9,-19],[12,-21],[44,-7],[0,-3],[-1,-3],[-38,5],[-1,0],[-6,2],[-13,24],[-11,14],[-9,18],[-9,13],[-6,10],[-9,12],[-7,6],[-4,12],[-3,6],[-3,1],[-10,2],[-16,8],[-27,9]],[[4312,1239],[-6,26]],[[4306,1265],[18,-14],[7,-4],[13,-9],[8,-6],[7,-5],[5,-3],[4,-2],[5,-1],[5,-1],[7,0],[21,5],[6,1],[9,0],[8,0],[7,-1],[5,0],[6,0],[7,0],[5,-1],[4,1],[7,1],[8,2],[4,1],[12,5],[18,8],[3,1],[4,1]],[[4296,1317],[19,1],[17,1],[-2,2],[0,2],[-6,22],[-3,18],[-4,19],[-4,18],[-4,18],[-3,16],[13,2],[6,0]],[[4325,1436],[30,-8],[46,-11]],[[4401,1417],[48,-12],[12,2],[2,0],[24,6],[2,1]],[[4401,1417],[0,6],[-1,6],[-1,5],[3,2],[5,2],[6,1],[5,-2],[7,-1],[8,1],[-4,28],[-5,32],[-2,1],[-1,0],[-1,0],[-3,-1],[-3,0],[-18,8],[1,5]],[[4397,1510],[2,8],[-2,23]],[[4325,1436],[2,8],[-13,63],[-1,6]],[[4313,1513],[84,-3]],[[4313,1513],[-4,4],[-3,2],[-2,7],[-3,18]],[[6550,5222],[6,-1]],[[6545,5191],[-1,-4],[-7,-22]],[[6537,5165],[-5,3],[-42,20],[-4,-12],[-4,-11],[-4,-11],[-4,-11]],[[6474,5143],[-61,30]],[[6413,5173],[4,11],[4,11]],[[6421,5195],[4,11],[4,11],[8,24],[9,25]],[[6446,5266],[61,-31],[9,-4],[16,-8],[18,-1]],[[6446,5266],[-52,25],[-10,4]],[[6384,5295],[8,23],[8,21],[8,23]],[[6408,5362],[9,-5],[13,-6],[19,-9],[20,-9],[42,-21]],[[6511,5312],[-8,-22],[20,-10],[21,-10]],[[6544,5270],[18,-9],[-7,-22],[-5,-17]],[[6511,5312],[19,57]],[[6530,5369],[10,-7],[9,-6]],[[6549,5356],[10,-8],[10,-5],[-4,-13],[-9,-22],[-5,-15],[-7,-23]],[[6549,5356],[14,41],[8,24],[1,4]],[[6572,5425],[44,-32]],[[4088,1402],[18,2],[19,2],[18,2],[9,2],[11,2]],[[4183,1310],[1,-6],[4,-17],[4,-24],[-9,0],[-4,0],[-3,1],[-7,4],[-25,18],[-3,1],[-3,1],[-3,1],[-3,0],[-10,-2],[-18,-4],[-7,-1],[-5,-2],[-6,30],[-3,0],[-12,6],[-12,8],[-3,4],[-6,31],[-2,6],[1,4],[3,8],[7,10],[5,6],[3,3],[1,4],[4,-1],[9,2],[7,1]],[[6794,5764],[-10,7],[-16,11],[-15,10]],[[6715,5946],[13,12]],[[6728,5958],[31,-47]],[[6759,5911],[18,-28],[38,-60]],[[6759,5911],[13,12],[15,12]],[[6728,5958],[3,15],[1,6],[0,6],[14,14],[15,12]],[[6761,6011],[41,-63]],[[6761,6011],[13,12],[14,12]],[[6788,6035],[14,12]],[[6761,6011],[-41,64]],[[6720,6075],[14,11],[13,12]],[[6747,6098],[41,-63]],[[6747,6098],[15,12],[13,12],[14,14]],[[6789,6136],[10,-17],[10,-14],[9,-15],[12,-19]],[[6747,6098],[-17,28],[13,12],[-5,8],[-13,-11],[-18,27]],[[6707,6162],[14,12],[13,11]],[[6734,6185],[15,13]],[[6749,6198],[40,-62]],[[6720,6075],[-14,-13]],[[6706,6062],[-41,63]],[[6665,6125],[15,13],[13,12],[14,12]],[[6665,6125],[-40,64]],[[6625,6189],[15,12],[13,12],[13,12]],[[6666,6225],[41,-63]],[[6666,6225],[14,12]],[[6680,6237],[14,12]],[[6694,6249],[40,-64]],[[6694,6249],[14,12]],[[6708,6261],[16,15],[-13,21],[24,21],[3,2]],[[6738,6320],[14,-21],[24,-38]],[[6776,6261],[16,-26]],[[6792,6235],[-2,-2],[-25,-21],[-16,-14]],[[6680,6237],[-54,86]],[[6626,6323],[9,18]],[[6635,6341],[9,20]],[[6644,6361],[36,-56],[28,-44]],[[6644,6361],[4,7],[9,17],[10,23],[5,9],[2,5]],[[6674,6422],[26,-42]],[[6700,6380],[38,-60]],[[6635,6341],[-3,5],[-40,61]],[[6635,6480],[1,-2],[2,-3],[2,-3],[3,-3],[2,-3],[2,-4],[2,-3],[2,-3],[2,-3],[2,-3],[2,-3],[2,-4],[1,-2],[4,-6],[5,-4],[3,-5],[2,-4]],[[6607,6285],[-3,5],[-44,67]],[[6626,6323],[-10,-19],[-9,-19]],[[6587,6247],[-9,-20]],[[6578,6227],[-3,5],[-35,54]],[[6607,6285],[-9,-18],[-11,-20]],[[6625,6189],[-34,52],[-4,6]],[[6635,6101],[-66,106]],[[6569,6207],[9,20]],[[6665,6125],[-14,-13],[-7,-4],[-9,-7]],[[6608,6078],[-13,-12]],[[6595,6066],[-43,68],[-5,7]],[[6547,6141],[7,22],[8,23],[7,21]],[[6635,6101],[-12,-11],[-15,-12]],[[6547,6141],[-3,5],[-40,60],[-3,2]],[[6532,6080],[-3,5],[-40,62]],[[6547,6141],[-7,-31],[-8,-30]],[[6436,6017],[3,3],[0,21],[3,8],[3,12],[5,15],[0,3],[-16,42],[-11,-5],[-6,-1],[-2,0],[0,3],[0,3],[4,2],[3,1],[0,3],[1,1],[5,2],[0,3],[-2,1],[-1,0],[8,2],[3,-5],[6,-19],[5,-7],[4,-5],[3,-3],[2,3],[5,20],[1,1],[5,8],[1,5],[1,13],[3,17]],[[6489,6147],[-3,-14],[-1,-8],[0,-5],[1,-5],[1,-5],[2,-11],[2,-12]],[[6532,6080],[-13,-53]],[[7070,3733],[37,-28]],[[7035,3759],[6,11],[13,26]],[[7054,3796],[34,-27],[13,23],[37,-27]],[[7054,3796],[13,22],[3,6],[7,6],[8,4],[27,-21],[13,23]],[[7125,3836],[37,-27]],[[6988,3793],[6,13],[4,10],[16,40],[18,34],[1,2]],[[7033,3892],[2,-1],[3,-1],[2,0],[7,-2],[17,-9],[14,-7],[9,-7],[3,-3],[3,-2],[32,-24]],[[6403,5730],[-8,-18]],[[6395,5712],[-10,8],[-9,6],[-11,7],[-10,7]],[[6431,5791],[-10,-23],[-9,-20],[-9,-18]],[[6595,6066],[-17,-15],[-17,-15],[-9,-8]],[[6608,6078],[45,-70]],[[6653,6008],[-13,-12],[-14,-17],[-14,-18]],[[6667,6020],[-14,-12]],[[6706,6062],[-15,-13],[-8,-6],[-6,-5],[4,-6],[-14,-12]],[[6667,6020],[48,-74]],[[6733,6691],[-3,3],[-34,53],[-3,3],[-1,-26],[-1,-9],[-3,-13],[-6,-16],[1,-3],[0,-2],[-4,-11],[-3,-11],[-2,-2],[9,-14],[19,-30]],[[6702,6613],[-5,-8],[-17,-25]],[[6680,6580],[-4,-5],[-6,-8],[-3,-6],[-1,-3],[-2,-3],[-5,-10],[-3,-7],[-7,-18],[-6,-18],[-8,-21],[0,-1]],[[6618,6498],[1,2],[2,5],[4,11],[8,30],[9,23],[7,16],[3,9],[0,13],[2,8],[0,2],[2,8],[1,16],[3,9],[7,20],[4,15],[2,5],[4,7],[2,6],[4,9],[2,9],[2,15],[2,8],[1,10],[1,7],[4,10],[1,7],[7,20],[4,8],[7,24],[1,4]],[[6715,6834],[4,-9],[2,-4],[29,-45]],[[6750,6776],[-4,-31],[-1,-8],[-2,-14],[-2,-12],[-2,-7],[-6,-13]],[[6680,6580],[36,-55],[2,-5],[2,-8]],[[6720,6512],[-2,-3],[-11,-21]],[[6707,6488],[-8,-16],[-8,-16],[-8,-16],[-9,-18]],[[6733,6538],[-13,-26]],[[6702,6613],[8,14]],[[6710,6627],[9,-6],[2,-3],[25,-37],[4,-5],[-6,-14],[-11,-24]],[[6836,6486],[37,-55]],[[6873,6431],[-15,-14],[-23,-18],[-29,-21]],[[6806,6378],[-11,18],[-10,15],[-16,25]],[[6769,6436],[-45,71],[-4,5]],[[6733,6538],[16,20],[6,8],[4,4]],[[6759,6570],[26,-40],[17,-26],[20,-30],[14,12]],[[6769,6436],[-14,-8],[-5,-5]],[[6750,6423],[-43,65]],[[6750,6423],[-13,-10],[-11,-11],[-12,-10],[-14,-12]],[[6806,6378],[-19,-15],[-23,-20],[-12,-10],[-14,-13]],[[6806,6378],[38,-58]],[[6844,6320],[-19,-16],[-12,-11],[-12,-10],[-12,-9],[-13,-13]],[[6804,6217],[-12,18]],[[6844,6320],[38,-58]],[[6882,6262],[-19,-17]],[[6863,6245],[-12,-11],[-12,-10],[-10,16],[-11,-11],[-14,-12]],[[6908,6285],[-26,-23]],[[6844,6320],[27,22],[24,19]],[[6895,6361],[35,-56]],[[6930,6305],[-22,-20]],[[6919,6203],[-18,-18]],[[6901,6185],[-38,60]],[[6908,6285],[27,-43],[10,-15],[-26,-24]],[[6925,6028],[18,34],[-19,28],[-9,15]],[[6915,6105],[12,11],[11,10],[20,17],[-39,60]],[[6930,6305],[15,14],[16,13]],[[6961,6332],[14,11],[14,14],[14,13]],[[6915,6105],[-10,16],[-19,29],[-9,15],[12,10],[12,10]],[[6873,6108],[-12,20],[-10,15],[-18,29]],[[6833,6172],[-9,14],[-10,15],[-10,16]],[[6789,6136],[17,13],[24,20],[3,3]],[[7603,3852],[-6,4],[-6,5],[-1,4],[-9,7],[-9,6],[-8,6],[-9,7]],[[7555,3891],[-90,65]],[[7465,3956],[6,12],[7,13]],[[7454,3935],[11,21]],[[7555,3891],[-11,-23]],[[7544,3868],[-90,67]],[[7513,3814],[-20,15],[-11,2],[-22,17]],[[7460,3848],[10,21],[10,18],[-38,27]],[[7442,3914],[12,21]],[[7544,3868],[-12,-19]],[[7532,3849],[-10,-18],[-9,-17]],[[7460,3848],[-38,27]],[[7377,3964],[65,-50]],[[7388,3983],[66,-48]],[[7388,3983],[11,22]],[[7399,4005],[66,-49]],[[7412,4029],[66,-48]],[[7424,4053],[6,-5],[48,-35],[13,-9]],[[7435,4072],[65,-50]],[[4312,1239],[-1,0],[-57,11],[-13,1],[-5,-6],[-13,-39],[-2,-7],[-1,-2],[-3,4],[-3,14],[-2,5],[-10,14],[-6,5],[-23,18],[-7,8],[-5,3],[-6,8],[-8,4],[-5,0],[-4,4],[-3,0],[-3,-2],[-3,-2],[-8,0],[-2,-1],[-7,-1],[-5,-2],[-5,-4],[-4,0],[-7,0],[-6,-2],[-5,-3],[-2,-3],[2,-7],[0,-2],[-3,-3],[-11,-5],[-10,-8],[-3,-5],[-7,1],[-8,-1],[-2,0],[-4,3],[0,6],[0,27],[-3,13],[-2,21],[-1,5],[-4,23],[-3,9],[-5,14],[-1,0],[-14,19],[-1,1],[-23,27],[-9,7],[-7,10],[-7,12],[-2,0]],[[3948,1440],[2,-3],[4,-4],[21,-20],[8,-7],[6,-7],[7,-9],[14,-15],[2,2],[2,3],[2,3],[1,2],[2,5],[2,6],[-1,3],[2,4],[3,5],[3,5],[4,4],[5,4],[2,2],[-1,5],[-3,10],[0,9],[2,11],[3,8],[4,5],[6,8],[1,1],[1,3]],[[4052,1483],[2,1],[17,6],[17,-88]],[[4052,1483],[-4,3],[-6,1],[-9,5],[-8,6],[-5,3],[-8,45],[1,4],[-2,2],[-18,1],[-6,2],[-10,0],[-24,1],[-7,-2],[-1,0],[-1,0],[-21,-4]],[[3923,1550],[-2,6],[-5,-1],[0,1],[3,4],[0,1],[1,2],[1,2]],[[3921,1565],[0,2],[0,3],[0,4],[0,2],[-1,3],[-1,3],[-1,2]],[[3948,1440],[-25,110]],[[3729,1529],[-4,21],[-26,1],[0,4],[0,4],[19,3],[2,0],[14,2],[7,1],[14,2],[16,1],[11,0],[10,1],[15,0],[11,0],[25,-1],[19,-1],[22,0],[21,-1],[16,-1]],[[3621,1569],[-26,106]],[[3595,1675],[17,7],[6,2],[35,32],[11,3],[19,6]],[[3683,1725],[14,6],[7,5]],[[3469,1599],[23,8],[8,2],[9,8],[18,16],[18,16],[18,16]],[[3563,1665],[5,2],[27,8]],[[3422,1793],[20,17]],[[3442,1810],[6,-24],[16,6],[21,18],[12,10],[3,1],[2,-1],[2,-1],[7,-29],[17,6],[3,3],[32,-134]],[[3627,1871],[19,-76],[19,6]],[[3665,1801],[18,-76]],[[3442,1810],[21,18],[32,27],[24,20],[24,20]],[[3543,1895],[15,-61],[37,13],[4,3],[9,14],[19,7]],[[3342,1727],[-17,28],[-17,29],[29,25],[-14,26],[-12,19]],[[3311,1854],[17,14],[10,-18],[3,0],[16,12],[46,38],[14,12],[1,4],[-11,18],[17,14]],[[3424,1948],[11,-18],[2,0],[16,13],[16,14],[17,14],[7,6],[10,9],[17,14],[17,13]],[[3537,2013],[16,-26],[37,-59]],[[3590,1928],[-26,-22],[-6,-3],[-9,-4],[-6,-4]],[[3627,1871],[-7,29],[0,3],[2,2],[5,1],[13,3],[9,4],[2,2],[3,3],[1,4],[5,1],[0,3],[0,5],[1,4],[3,4],[5,3],[10,2],[2,-7]],[[3681,1937],[23,-101]],[[3704,1836],[-18,-23],[-6,-6],[-15,-6]],[[3703,1998],[-22,-18],[-5,-2],[-16,-5],[-14,-4],[-10,-3],[-12,-5],[-2,-2],[-6,-5],[-6,-5],[-5,-6],[-4,-6],[-11,-9]],[[3537,2013],[-33,54],[-5,8]],[[3499,2075],[3,2],[14,12],[20,-33],[2,0],[14,12],[13,10],[1,2],[0,3],[-19,31],[16,13]],[[3499,2075],[-23,38]],[[3476,2113],[-8,15],[-6,14]],[[6656,4951],[63,-30]],[[6488,5030],[9,25],[21,60],[3,7],[16,43]],[[6961,6332],[-36,56]],[[6925,6388],[14,12],[15,13],[14,13]],[[6925,6388],[-37,56]],[[6888,6444],[15,13],[14,12],[15,13]],[[6932,6482],[36,-56]],[[6932,6482],[15,13],[17,14],[16,14],[9,9],[14,12]],[[7003,6544],[36,-56]],[[7033,3892],[1,3]],[[7034,3895],[1,1],[76,130]],[[7111,4026],[9,14]],[[7173,3925],[-12,-22],[-13,-23]],[[7148,3880],[-11,-22],[-12,-22]],[[7148,3880],[37,-27]],[[7185,3853],[-11,-21],[-12,-23]],[[7209,3897],[-12,-22],[-12,-22]],[[7209,3897],[57,-43]],[[7295,3910],[-17,-32],[-12,-24]],[[6932,6482],[-36,56]],[[6896,6538],[16,14],[16,14],[15,13]],[[6943,6579],[11,9],[6,7],[7,6]],[[6967,6601],[36,-57]],[[6967,6601],[14,12]],[[6981,6613],[15,13],[14,12],[14,13]],[[7024,6651],[37,-57]],[[7061,6594],[-15,-13],[-14,-12],[-14,-13],[-15,-12]],[[6943,6579],[-35,57]],[[6908,6636],[10,9],[13,12],[-7,11]],[[6924,6668],[17,9]],[[6941,6677],[40,-64]],[[6941,6677],[15,9],[17,9],[17,9]],[[6990,6704],[12,-18],[10,-16]],[[7012,6670],[12,-19]],[[6990,6704],[27,16],[21,11],[2,1]],[[7040,6732],[12,7]],[[7052,6739],[13,-22]],[[7065,6717],[-29,-26],[-24,-21]],[[7114,6640],[-28,-25],[-25,-21]],[[7065,6717],[13,-20]],[[7078,6697],[-14,-13],[20,-33],[3,-1],[13,12],[14,-22]],[[7162,6681],[-48,-41]],[[7078,6697],[20,15],[16,11],[18,-30],[4,-1],[12,11],[14,-22]],[[7180,6696],[-2,-2],[-5,-4],[-11,-9]],[[7052,6739],[44,25],[27,15],[3,1]],[[7126,6780],[7,-11],[14,-22],[33,-51]],[[7040,6732],[-1,4],[-9,20],[-2,4],[38,32]],[[7066,6792],[4,-6],[1,-1],[9,0],[2,1],[8,7],[15,13],[2,2]],[[7107,6808],[16,-24],[3,-4]],[[7066,6792],[-12,19]],[[7054,6811],[-11,18],[15,13],[-6,9]],[[7052,6851],[16,14],[2,2]],[[7070,6867],[37,-59]],[[7133,6876],[11,-18],[14,-21]],[[7158,6837],[16,-26],[2,-3]],[[7176,6808],[-23,-13],[-16,-9],[-11,-6]],[[7070,6867],[-16,25]],[[7054,6892],[15,13]],[[7069,6905],[12,-18],[12,-18],[11,-18],[29,25]],[[7069,6905],[-11,18],[28,25]],[[7086,6948],[9,-14],[3,-4]],[[7098,6930],[11,-18],[12,-18]],[[7121,6894],[12,-18]],[[7121,6894],[15,13],[13,11]],[[7149,6918],[41,-63]],[[7190,6855],[-16,-9],[-16,-9]],[[7098,6930],[15,12],[14,13]],[[7127,6955],[14,12],[23,-36],[-15,-13]],[[7220,6935],[11,-17]],[[7231,6918],[11,-17],[10,-15]],[[7252,6886],[-44,-22],[-18,-9]],[[7127,6955],[-37,56]],[[7090,7011],[14,13],[25,20]],[[7129,7044],[55,-86],[22,-34],[14,11]],[[7129,7044],[13,11]],[[7142,7055],[12,-18],[11,-17]],[[7165,7020],[10,-16],[11,-17]],[[7186,6987],[11,-17]],[[7197,6970],[12,-18]],[[7209,6952],[11,-17]],[[7247,7038],[-61,-51]],[[7165,7020],[34,30],[13,12]],[[7212,7062],[12,11],[12,-18],[11,-17]],[[7247,7038],[22,20],[2,2]],[[7271,7060],[11,-17]],[[7282,7043],[-2,-2],[-83,-71]],[[7287,6993],[-9,16],[-1,0],[-1,1],[-1,0],[-1,-1],[-65,-57]],[[7282,7043],[22,-34]],[[7304,7009],[-2,-3],[-15,-13]],[[7254,6938],[-23,-20]],[[7287,6993],[-14,-11],[-15,-13],[-15,-13],[11,-18]],[[7278,6900],[-2,3],[-11,17],[-11,18]],[[7287,6993],[41,-62],[-1,-4],[-15,-7],[-17,-9],[-17,-11]],[[7304,7009],[47,-72]],[[7351,6937],[13,-21],[3,-4]],[[7367,6912],[-4,-1],[-4,-2],[-29,-16],[-37,-20],[-2,4],[-12,21],[-1,2]],[[7304,7009],[16,13],[46,-72],[-15,-13]],[[7749,3826],[-13,-26]],[[7736,3800],[-12,9],[-19,14],[-22,15],[-9,8]],[[7688,3870],[9,-7],[41,-29],[11,-8]],[[7726,3783],[-8,7],[-17,12],[-8,-1],[-31,22]],[[7700,3892],[9,-7],[41,-29],[11,-9]],[[7761,3847],[-12,-21]],[[7713,3916],[9,-7],[41,-30],[10,-8]],[[7773,3871],[-10,-18],[-2,-6]],[[7735,3956],[19,-15],[31,-23],[9,-7]],[[7794,3911],[-1,-3],[-8,-15],[-12,-22]],[[7804,3927],[-10,-16]],[[7754,3989],[49,-37]],[[7803,3952],[-9,-17],[10,-8]],[[7773,4024],[30,-23],[19,-15],[-9,-17],[-5,-8],[-5,-9]],[[7805,4083],[22,-17]],[[7864,4039],[-6,-12],[-5,-8],[-8,-16]],[[7845,4003],[-8,-15],[-5,-9],[-3,-6],[-7,-11],[-2,-4]],[[7820,3958],[-7,-14],[-1,-2],[-4,-7],[-4,-8]],[[7989,7819],[7,9],[8,7],[-25,39]],[[7979,7874],[12,16],[13,18],[-12,20],[-2,2]],[[7990,7930],[34,44]],[[8024,7974],[2,-3],[13,-19],[-5,-8],[9,-15],[0,-5],[-2,-5],[-8,-8],[-1,-2],[1,-4],[20,-29]],[[8053,7876],[-18,-15],[7,-11],[-16,-14],[22,-35],[0,-2],[0,-1],[-11,-15],[-13,-15],[-9,14],[-20,-24],[-2,-1],[-2,2],[-9,14],[0,2],[1,3],[19,24],[-6,10],[-7,7]],[[8024,7974],[33,41],[2,3]],[[8059,8018],[2,-3],[9,-14],[4,-6],[5,-8],[10,-19],[9,-19],[2,-3]],[[8100,7946],[-3,-3],[2,-3],[9,-15],[-18,-15],[-16,-15],[-21,-19]],[[7990,7930],[-13,20],[-24,38]],[[7953,7988],[-20,32]],[[7933,8020],[15,12],[12,11],[13,11],[14,12],[23,20],[3,3]],[[8013,8089],[2,-3],[10,-16],[8,-12],[12,-19],[9,-14],[5,-7]],[[7990,7930],[-73,-91]],[[7870,7913],[19,16],[11,15],[6,5],[17,13],[14,13],[16,13]],[[7816,7998],[20,16],[24,22],[9,11],[12,17],[13,18]],[[7894,8082],[39,-62]],[[7803,8020],[17,15],[17,15],[7,7],[7,7],[5,7],[11,15]],[[7867,8086],[12,18]],[[7879,8104],[15,-22]],[[7879,8104],[22,31],[10,14],[12,17],[17,24],[2,3],[2,3]],[[7944,8196],[19,-29],[3,-6],[11,-17],[10,-15],[4,-7],[13,-20],[9,-13]],[[7879,8104],[-2,4],[-3,5],[-13,20]],[[7861,8133],[11,10],[4,5],[5,6],[1,4],[-10,15],[-2,3],[-1,2],[-11,17],[5,3],[11,10],[13,12],[-47,75]],[[7840,8295],[22,27]],[[7862,8322],[11,-18],[3,-4],[10,-16],[3,-4],[11,-16],[2,-5],[11,-17],[8,-9],[19,-30],[2,-4],[2,-3]],[[7861,8133],[-29,45],[-12,20],[-1,1],[-16,26],[-14,20]],[[7789,8245],[24,24],[14,11],[13,15]],[[7867,8086],[-3,3],[-8,12],[-14,-12],[-15,-12],[-14,22],[-11,18],[-13,21]],[[7789,8138],[5,8],[7,7],[15,12],[-22,34],[-20,31]],[[7774,8230],[15,15]],[[7719,8067],[-12,19],[-18,28],[14,14],[-14,20],[9,10],[11,10],[25,19],[7,7],[5,5],[15,16],[13,15]],[[7789,8138],[-11,-15],[-6,-9],[-7,-8],[-15,-12],[-15,-13],[-16,-14]],[[1401,355],[2,-11],[4,-16],[-6,-3],[-5,-3],[-5,-2],[-8,-4],[-15,-7],[-6,-2],[-9,-4],[-11,-7],[-4,-3],[-7,-4],[-4,-2],[-8,-5],[-10,-5],[-6,-4],[-7,-6],[-4,-2],[-6,-5],[-4,-4],[-6,-3],[-10,-5],[-13,-7],[-2,-2],[-35,-25],[-2,2],[1,10],[-2,22],[-2,34]],[[1211,282],[-7,103],[-3,32],[36,4],[9,2],[3,1],[3,2],[2,1],[2,3],[4,8],[3,7],[3,3],[9,5]],[[1376,513],[6,-34],[1,-20],[1,-10],[1,-7],[1,-8],[2,-7],[3,-12],[7,3],[3,2],[-2,-18],[-2,-16],[0,-6],[3,-18],[1,-7]],[[7664,7713],[-3,-3],[-17,-14]],[[7644,7696],[-35,54],[-8,13],[-2,2],[-2,-1],[-26,-23],[-13,-11],[-1,-4],[0,-3],[7,-11],[-16,-14]],[[7548,7698],[-22,34],[21,18],[1,2],[2,1],[18,16],[2,3],[-1,3],[-18,29],[-3,4],[-16,-14]],[[7577,7652],[-29,46]],[[7644,7696],[-15,-14]],[[7629,7682],[-13,-11],[-6,-3],[-14,-7],[-19,-9]],[[7560,7638],[13,11],[4,3]],[[7629,7682],[12,-18],[13,-22],[10,-14],[1,-4],[-2,-2],[-26,-25]],[[7637,7597],[-16,-14],[-16,-14],[-45,69]],[[7650,7576],[-13,21]],[[7664,7713],[35,-54]],[[7699,7659],[-4,-3],[-16,-14],[12,-19],[-22,-26],[-19,-21]],[[7765,7647],[-32,-41]],[[7733,7606],[-34,53]],[[7679,7533],[-2,2],[-14,22],[-13,19]],[[7733,7606],[1,-3]],[[7734,7603],[-2,-3],[-16,-20],[-9,-11]],[[7707,7569],[-26,-33],[-2,-3]],[[7713,8005],[-20,31],[0,6],[4,5],[22,20]],[[7540,8005],[7,8],[2,2],[11,13],[10,10],[22,24],[2,2],[2,3],[4,5],[13,13],[1,10],[5,8],[11,4],[5,0],[6,6],[2,5],[8,9],[15,21],[3,3],[2,6],[7,9],[9,1],[15,20],[19,27],[3,2],[2,2],[4,5],[4,9],[5,3],[6,3],[21,22],[7,8],[28,24],[15,11],[8,7],[10,8],[4,4],[6,7],[4,6]],[[6790,4231],[-7,-19],[-6,-17]],[[6777,4195],[-8,4],[-44,22],[-9,4]],[[6716,4225],[6,17]],[[6722,4242],[6,16],[27,-12],[8,-1],[19,-10],[8,-4]],[[6777,4195],[-5,-15]],[[6772,4180],[-53,25],[-8,5]],[[6711,4210],[5,15]],[[6766,4164],[-7,3],[-45,22],[-9,4]],[[6705,4193],[6,17]],[[6772,4180],[-6,-16]],[[6711,4210],[-62,29]],[[6649,4239],[5,15]],[[6654,4254],[7,17]],[[6661,4271],[61,-29]],[[6649,4239],[-58,28],[5,16]],[[6596,4283],[58,-29]],[[6594,4303],[58,-28],[9,-4]],[[6596,4283],[-8,4],[4,12],[2,4]],[[6666,4288],[-5,-17]],[[6594,4303],[-9,5],[-3,1],[-5,3],[-2,-3],[-2,-6],[-2,-6],[-1,-3],[-1,-5],[1,-4],[1,-5],[6,-18],[0,-4]],[[6577,4258],[-2,-3],[-2,-5],[-4,-1],[-4,-1],[-4,-3],[-5,-1],[-4,-2],[-1,0],[-1,0],[-3,0],[-3,1],[-1,1]],[[6592,4365],[2,-1],[3,-1]],[[6597,4363],[-3,-8]],[[6594,4355],[-2,-3],[-3,-5],[-7,-18],[6,-3],[78,-38]],[[6649,4239],[-6,-16]],[[6643,4223],[-56,26],[-4,3],[-4,3],[-2,3]],[[6705,4193],[-14,7],[-48,23]],[[6766,4164],[10,-5],[53,-26]],[[6829,4133],[62,-30]],[[6891,4103],[-1,-4],[-43,21],[-1,-4]],[[6846,4116],[-20,10],[-20,9]],[[6806,4135],[-19,9],[-20,10],[-20,9]],[[6747,4163],[-20,10],[-19,10],[-20,9],[-18,-50],[-7,-23],[-14,-39]],[[6649,4080],[-19,9],[-19,9],[-18,9],[-19,8],[-40,20]],[[6626,4014],[5,17],[17,46],[1,3]],[[6747,4163],[-17,-50],[-5,-13],[-17,-48],[-1,-3],[-18,-51],[-5,-13]],[[6684,3985],[-7,2],[-15,4],[-10,4],[-10,6],[-5,2],[-2,2],[-3,3],[-4,3],[-1,2],[-1,1]],[[6744,3958],[-11,5],[-8,5],[-3,2],[-13,10],[-2,2],[-1,2],[-22,1]],[[6806,4135],[-16,-46],[-15,-40],[-9,-25],[-1,-3],[-17,-51],[-4,-12]],[[8952,8419],[-76,-62],[-71,-58],[-6,-5],[-3,-1],[-10,-8],[-17,-14],[-32,-26],[-17,-15],[-15,-12],[-54,-36],[-25,-19],[-11,-9]],[[8615,8154],[-28,-23],[-9,-8],[-8,-9],[-11,-11],[-6,-7],[-7,-6],[-69,-57],[-3,-2],[-3,-3],[-18,-17],[-8,-7],[-2,-2]],[[8443,8002],[-1,2],[-1,1],[-8,13],[-34,54],[-31,51],[-18,27]],[[8350,8150],[-26,40],[-6,10],[-23,37],[-3,4]],[[8292,8241],[2,1],[4,3],[6,2],[4,2],[2,2],[15,12],[18,16],[13,11]],[[8356,8290],[14,17],[18,16],[21,16],[22,14]],[[8431,8353],[23,11],[8,6],[10,6],[35,23],[51,26],[22,15],[-7,14],[-2,5],[-3,5],[-6,9],[-1,1],[-4,7],[-5,5],[-8,7],[-3,2],[-8,4],[-10,5],[-2,1],[-1,0],[-8,3],[-12,4],[-2,1],[-11,4],[-6,2]],[[8481,8519],[-12,6],[-9,8],[-9,12],[-6,10],[-5,13]],[[8440,8568],[19,10],[18,10],[15,9],[15,8],[1,2],[0,3],[-24,57],[-1,1],[-3,0],[-14,-8],[-34,-19],[-18,-11]],[[8414,8630],[-12,29]],[[8402,8659],[3,3],[29,40],[20,26],[11,15],[3,3]],[[8468,8746],[20,-18],[-11,-16],[0,-2],[1,-2],[8,-7],[11,-15],[4,-5],[4,-9]],[[8505,8672],[22,-54],[16,-39],[2,-4],[4,-7],[6,-6]],[[8555,8562],[-12,-15],[-9,-12],[16,-13],[11,-2],[24,-2],[1,-9],[22,-53],[35,29],[41,38],[2,2]],[[8686,8525],[69,70],[7,7],[1,4],[5,7],[27,27]],[[8795,8640],[16,16],[20,20],[2,2]],[[8833,8678],[2,-3],[13,-29],[32,-70],[0,-4],[67,-144],[3,-6],[2,-3]],[[8431,8353],[0,5],[-2,6],[-40,93],[-36,88]],[[8353,8545],[20,11]],[[8373,8556],[37,-87],[19,11],[-7,18],[-1,3],[2,2],[19,11],[4,1],[2,-1],[7,-6],[5,-11],[16,10],[2,2],[3,10]],[[8373,8556],[20,11],[-11,27],[-1,2],[2,3],[13,15],[11,12],[7,4]],[[8414,8630],[26,-62]],[[8353,8545],[-6,13],[-8,20],[-3,7]],[[8336,8585],[-2,3],[-12,28],[-1,5],[1,3],[1,4],[2,4],[13,8],[-5,12],[-3,5],[-11,24],[-4,8]],[[8315,8689],[29,24],[26,25],[17,18],[21,21],[11,-26],[7,-15],[-15,-20],[-20,-28],[0,-1],[10,-24],[1,-4]],[[8094,8578],[17,5],[10,1],[25,3],[10,0],[20,7],[11,2],[1,1],[6,3],[7,7],[8,10],[3,1],[8,5],[10,3],[19,16],[1,4],[5,3],[4,6],[3,3],[5,3],[6,3],[5,3],[6,8],[8,12],[5,1],[8,6]],[[8305,8694],[4,5],[6,-10]],[[8336,8585],[-3,-2],[-7,-6],[-75,-65],[-13,-10]],[[7915,5295],[-11,6],[-53,27],[-2,1],[-10,5]],[[7839,5334],[12,23],[2,3]],[[7853,5360],[76,-39]],[[2762,2202],[-32,16]],[[2489,2977],[-10,27],[-10,32]],[[2469,3036],[9,14],[12,20],[7,16],[4,7]],[[2501,3093],[11,22],[8,15],[3,5],[3,5],[13,19],[3,4],[5,8],[4,8]],[[2501,3093],[-2,4],[-14,36],[-21,59],[-28,54]],[[2436,3246],[25,12],[8,5],[5,5],[5,9],[3,0],[2,-1],[13,-26],[12,17],[12,-26],[27,20]],[[2436,3246],[-25,51],[-1,4],[2,35],[1,23],[3,64],[0,23],[3,8]],[[2469,3036],[-3,-3],[-17,45]],[[2449,3078],[1,3],[6,11],[3,10],[2,10],[-2,10],[-1,1],[-1,5],[-3,6],[-2,3],[-1,7],[-2,4],[-4,8],[-3,4],[-2,2],[-4,4],[-1,3],[-1,0],[-1,11],[-2,16],[0,5],[-2,0],[-1,3],[-1,9],[0,3],[-3,4],[-4,4],[-3,5],[-6,7],[-3,0],[-2,1],[-14,-1],[-12,-2],[-7,-2],[-2,-2],[-4,0],[-5,0],[-7,9],[-4,9],[0,3],[-4,6],[-4,12],[-1,10],[1,9],[2,2],[6,7],[7,11],[2,3],[3,3],[1,0],[-2,7],[0,6],[0,8],[0,2],[8,13],[3,9],[5,11],[6,14],[0,8],[-1,12],[-2,12],[-1,8],[4,6],[6,4],[2,5],[2,5],[6,16],[6,19],[1,10],[1,7],[8,5],[13,7]],[[2385,3434],[-2,-1],[-1,1],[-1,3],[0,2],[0,3],[-4,5],[-3,2],[-7,8],[0,3],[-5,6],[-3,6],[-1,6],[3,2],[12,11],[16,13],[8,5],[5,3],[3,1],[3,-1],[1,-2],[0,-3],[-1,-3],[-2,-5],[-1,-6],[-1,-8],[1,-3],[-2,-8],[-2,-2],[-3,-7],[-3,-7],[-2,-7],[0,-3],[-5,-12],[-3,-2]],[[6896,6538],[-37,56]],[[6859,6594],[16,14],[16,13],[17,15]],[[6859,6594],[-18,27]],[[6841,6621],[19,11],[19,10],[18,10]],[[6897,6652],[11,7],[16,9]],[[6888,6444],[-15,-13]],[[6836,6486],[16,14]],[[6852,6500],[15,13],[14,13],[15,12]],[[6925,6388],[-16,-14],[-14,-13]],[[6842,6934],[-29,47],[-15,24],[-3,-9],[-4,-15]],[[6791,6981],[-10,9]],[[6781,6990],[28,110],[36,85],[1,13],[7,11]],[[6853,7209],[8,-17]],[[6861,7192],[-3,-5],[-5,-9],[-22,-52],[-1,-5],[-3,-7],[-1,-4],[7,-4],[19,-29],[11,-18]],[[6863,7059],[-6,-5],[-4,-16],[-7,-24],[-9,-33],[16,-25],[-5,-16],[-6,-6]],[[6863,7059],[17,-26],[5,0],[16,-21],[3,-3]],[[6904,7009],[-20,-57]],[[6884,6952],[-1,-2],[-17,-51]],[[6866,6899],[-3,3],[-5,9],[-16,23]],[[6960,7041],[-3,-3],[-15,-13],[-21,33],[-17,-49]],[[6861,7192],[7,-12],[12,-20],[39,-59],[9,-14],[2,-3]],[[6930,7084],[5,-6],[25,-37]],[[6983,7161],[-14,-29],[-11,16],[-3,4],[-15,-40],[-10,-28]],[[6861,7192],[18,32],[3,6],[4,6],[15,24],[1,2],[2,3],[17,21]],[[6921,7286],[6,-10],[2,-2],[7,-5],[27,-42],[-10,-20],[13,-20],[2,-4]],[[6968,7183],[15,-22]],[[6921,7286],[7,9],[8,11],[3,4],[3,3],[3,3],[6,6],[10,7]],[[6961,7329],[11,-17],[7,-2],[4,-7],[15,-24],[13,-20],[2,-3]],[[7013,7256],[-2,-3],[-7,-9],[-9,-14],[-13,-22],[-14,-25]],[[6961,7329],[10,8],[11,8],[4,3],[5,5],[4,3],[9,11],[11,12],[13,18]],[[7028,7397],[23,-35],[-36,-32],[23,-37],[2,-3]],[[7040,7290],[-13,-15],[-12,-15],[-2,-4]],[[7028,7397],[14,16],[2,3]],[[7062,7388],[28,-45],[2,-3]],[[7092,7340],[-2,-2],[-18,-15],[-10,-9],[-10,-11],[-12,-13]],[[7028,7233],[-15,23]],[[7092,7340],[14,-22]],[[7106,7318],[-2,-2],[-21,-18],[-15,-15],[-17,-21],[-23,-29]],[[7039,7215],[-11,18]],[[7106,7318],[12,-18]],[[7118,7300],[-2,-2],[-23,-19]],[[7093,7279],[-15,-16]],[[7078,7263],[-13,-15]],[[7065,7248],[-11,-14],[-15,-19]],[[7184,7234],[-15,-13]],[[7169,7221],[-12,17]],[[7157,7238],[-39,62]],[[7106,7318],[16,14],[62,-98]],[[7267,7329],[-58,-61],[-25,-34]],[[6853,7209],[6,10],[38,53],[5,10],[7,9],[4,6],[9,13],[22,28],[23,24],[4,6],[12,13],[17,24],[13,14],[18,24],[14,13],[5,6],[25,33],[20,29],[14,27]],[[7109,7551],[2,-5],[17,-27]],[[7350,7713],[-11,18],[-14,-13],[-6,-7],[-2,-2],[-7,-9],[-13,-18],[-8,-8],[-13,-12],[-15,-14],[-9,-8]],[[7252,7640],[-14,-13],[-1,0],[-3,-3],[-5,-4],[-4,-3],[-8,-7],[-14,-9],[-9,-9],[-30,-33]],[[7164,7559],[-32,-36],[-4,-4]],[[7109,7551],[1,3],[8,11],[1,4],[0,5],[3,4],[6,5],[4,3],[2,4],[6,12],[3,3],[17,7],[5,3],[10,-2],[14,3],[35,24],[3,3],[7,4],[3,6],[4,3],[11,8],[10,8],[8,7],[10,4],[6,7],[11,12],[8,13],[0,5],[-5,7],[0,3],[2,3],[3,0],[7,-6],[13,11],[3,7],[3,4],[9,11],[18,18],[16,20],[5,4],[6,4],[5,5]],[[7300,7735],[-4,-4],[-4,2],[-7,-9],[-4,-3],[-4,-1],[-18,-4],[-8,-1],[-5,1],[-3,3],[-2,3],[-2,7],[-1,7],[1,5],[12,16],[12,15],[8,9],[30,22],[5,3],[11,4],[2,2],[7,3],[22,8],[3,-1],[2,-4],[-1,-4],[-7,-12],[-10,-13],[-10,-11],[-11,-17],[-6,-6],[-5,-5],[-3,-5],[-1,-4],[1,-6]],[[7204,7708],[-2,0],[-3,3],[-4,14],[1,12],[-6,5],[-1,11],[11,23],[9,8],[18,9],[25,30],[14,13],[10,5],[3,-3],[1,-8],[-3,-10],[-6,-8],[-16,-21],[-9,-10],[-6,-8],[-6,-6],[-5,-7],[0,-6],[-6,-16],[-4,-11],[-2,-11],[-9,-8],[-4,0]],[[7526,5104],[-47,35]],[[7479,5139],[4,8],[1,1],[3,7],[3,5],[2,3],[4,7]],[[7532,5214],[24,-18]],[[7556,5196],[-2,-3],[-9,-18],[-4,-15],[1,-9],[-6,-24],[-6,-13],[-4,-10]],[[7479,5139],[-47,32]],[[7432,5171],[-11,8]],[[7446,5078],[-8,5],[-30,23],[-8,5],[10,19],[11,20],[11,21]],[[7479,5139],[-12,-22],[-11,-20],[-10,-19]],[[7446,5078],[-11,-22]],[[7435,5056],[-9,6],[-29,22],[-8,6]],[[7461,4983],[-10,7],[-28,21],[-9,6],[11,20],[-9,6],[-29,21],[-9,7]],[[7435,5056],[8,-6],[30,-21],[9,-7]],[[7482,5022],[-11,-20],[-10,-19]],[[7432,4928],[-9,7],[-31,22],[-8,6],[-8,7],[-29,21],[-8,6]],[[7461,4983],[-11,-20],[-9,-17],[-9,-18]],[[7432,4928],[-10,-17]],[[7422,4911],[-8,6],[-31,23],[-8,6],[-9,6],[-13,9]],[[7743,7476],[-36,56],[13,17],[-13,20]],[[7734,7603],[26,-40],[10,-14],[15,-20],[2,-2]],[[7787,7527],[-3,-3],[-2,-3],[-13,-14],[-13,-16],[-13,-15]],[[7658,7506],[2,3],[17,21],[2,3]],[[7743,7476],[-12,-15],[-13,-15],[-13,-15],[-20,33],[-15,23],[-12,19]],[[7743,7476],[14,-22],[-14,-12],[13,-21],[-12,-15],[-13,-16],[-13,-17],[-17,-16],[-26,42],[-16,-13],[-24,36],[-24,36]],[[7611,7458],[16,13],[7,8],[2,2],[2,2],[10,11],[8,10],[2,2]],[[7493,7356],[25,22],[27,22]],[[7545,7400],[30,27],[36,31]],[[7787,7527],[2,-2],[41,-49],[2,-2],[12,-15],[24,-29],[23,-28],[1,-1],[1,-2]],[[7893,7399],[-3,-3],[-50,-58],[-51,-57],[-31,-36],[-38,-43],[-39,-44],[-36,-40]],[[7493,7356],[-2,2],[-36,57]],[[7455,7415],[7,6],[18,14],[16,12]],[[7496,7447],[16,15],[5,-9],[4,-13],[4,-9],[18,-28],[2,-3]],[[7489,7566],[52,-81],[43,36]],[[7584,7521],[3,-6],[4,-9],[1,-9],[0,-4],[1,-5],[3,-5],[13,-22],[2,-3]],[[7496,7447],[-55,85]],[[7441,7532],[17,15]],[[7458,7547],[8,7],[7,4],[8,4],[5,2],[2,1],[1,1]],[[7489,7566],[6,6],[7,14],[5,7],[20,17]],[[7527,7610],[13,-21],[31,-48],[13,-20]],[[7527,7610],[17,14],[16,14]],[[7455,7415],[-50,78]],[[7405,7493],[-50,77]],[[7355,7570],[6,6],[8,9],[21,-34],[23,19],[2,1],[2,-1],[10,-16],[3,-4],[11,-18]],[[7377,7469],[16,13],[12,11]],[[7164,7559],[14,-23],[18,-29],[3,-3],[11,-18],[11,-19],[2,-4]],[[7204,4330],[-10,-18],[-8,6],[-44,32],[-7,6]],[[7135,4356],[10,18],[6,10],[5,9],[1,1],[1,2]],[[7158,4396],[4,-4],[4,-6],[6,-4],[13,-10],[13,-9],[10,-8],[7,-5]],[[7215,4350],[-5,-10],[-6,-10]],[[7204,4330],[7,-6],[1,-1],[7,-5],[-5,-11],[-5,-10],[25,-18],[9,-6]],[[7243,4273],[-10,-18],[-5,-9],[-3,-5]],[[7225,4241],[-91,23]],[[7134,4264],[-2,1],[-39,11]],[[7093,4276],[11,21],[1,4],[10,18],[10,19],[10,18]],[[7091,4486],[9,-4],[9,-5],[9,-4],[10,-5],[8,-4],[8,-4],[2,-2]],[[7146,4458],[-1,-3],[-8,-15],[9,-8],[22,-16],[7,-5]],[[7175,4411],[-9,-8],[-8,-5],[0,-2]],[[7093,4276],[-2,0],[-68,18]],[[7069,4228],[-38,18],[-6,-19]],[[7025,4227],[-67,33],[-10,4]],[[7093,4276],[-7,-11],[-10,-22],[-1,-3],[0,-2],[-3,-2],[-3,-8]],[[7062,4209],[-7,-20]],[[7055,4189],[-30,15],[-8,3]],[[7017,4207],[8,20]],[[7069,4228],[-5,-13],[1,-2],[-1,-3],[-2,-1]],[[7049,4170],[-7,-18]],[[7042,4152],[-16,7],[-8,4],[-5,2],[-9,5]],[[7004,4170],[6,18]],[[7010,4188],[7,19]],[[7055,4189],[-6,-19]],[[7029,4115],[-6,-17]],[[7023,4098],[-10,4],[-19,9],[-9,5]],[[6985,4116],[7,18]],[[6992,4134],[6,18]],[[6998,4152],[6,18]],[[7042,4152],[-6,-19]],[[7036,4133],[-7,-18]],[[7112,4117],[-9,-16]],[[7103,4101],[-9,4],[-50,24],[-8,4]],[[7042,4152],[8,-4],[52,-26],[2,0],[8,-5]],[[7103,4101],[-10,-17]],[[7093,4084],[-9,5],[-47,22],[-8,4]],[[7093,4084],[-9,-16]],[[7084,4068],[-9,4],[-44,22],[-8,4]],[[7084,4068],[-8,-16],[-51,24],[-8,4]],[[7017,4080],[6,18]],[[7111,4026],[-30,17],[-13,-24],[-9,4],[-12,6],[-5,2],[-11,5],[-18,8],[-3,2],[-4,2]],[[7006,4048],[5,17],[6,15]],[[7112,4117],[39,-18]],[[7006,4048],[-8,4],[-31,15]],[[6967,4067],[6,16],[6,15]],[[6979,4098],[6,18]],[[9369,8355],[0,8],[-4,16],[1,11],[7,31],[4,18],[2,4],[5,11],[2,10],[4,21]],[[9390,8485],[66,-17]],[[9438,8382],[-18,4],[-1,-18],[3,-20],[-6,-3],[-3,-1],[-5,1],[-39,10]],[[9308,8311],[7,34],[5,27],[6,28],[5,24],[5,21],[6,30],[4,21]],[[9346,8496],[44,-11]],[[9369,8355],[-6,-27]],[[9363,8328],[-5,-30]],[[9358,8298],[-21,6],[-6,1],[-23,6]],[[9346,8496],[7,31],[8,39]],[[9361,8566],[19,-5],[11,-2],[8,0],[1,-11],[0,-11],[-6,-31],[18,-4],[5,24],[2,12],[0,19],[0,4],[4,1],[31,-8],[18,-5]],[[9361,8566],[7,35],[8,41],[6,25]],[[9382,8667],[27,-7],[-5,-22],[82,-22]],[[9382,8667],[6,27],[1,8],[3,9]],[[7853,5360],[11,20],[9,18]],[[7883,5417],[8,-4],[3,-2],[38,-20],[16,-8],[11,-5]],[[7959,5378],[-11,-19]],[[7948,5359],[-9,-17],[-10,-21]],[[7968,5397],[-9,-19]],[[7902,5454],[9,-4],[2,-1],[55,-28],[2,-1],[8,-5]],[[7912,5473],[9,-4],[2,-1],[25,-13],[30,-15],[2,-2],[8,-4]],[[7922,5492],[9,-5],[2,-1],[54,-28],[3,-2],[2,-1],[6,-3]],[[7932,5511],[9,-5],[2,-1],[54,-28],[2,-1],[9,-5]],[[7942,5529],[8,-4],[9,-4],[10,18],[9,18],[2,4],[42,-22],[14,-7],[2,-3]],[[7982,5606],[17,-9],[50,-25],[9,-5]],[[8001,5642],[9,-5],[1,0],[65,-34]],[[8001,5642],[11,21],[3,6],[8,14]],[[8023,5683],[11,-6],[57,-29],[8,-4]],[[8023,5683],[10,20],[10,20],[11,20],[13,26]],[[8142,5727],[-12,-23],[-10,-20]],[[8120,5684],[-11,-20],[-10,-20]],[[8120,5684],[8,-4],[1,-1],[57,-29],[9,-5]],[[8195,5645],[-11,-19],[-10,-20]],[[8142,5727],[8,-4],[66,-37]],[[8216,5686],[-11,-21],[-10,-20]],[[8166,5772],[73,-42]],[[8239,5730],[-12,-22],[-11,-22]],[[8239,5730],[28,-16],[3,-2]],[[8270,5712],[-1,-6],[-2,-10],[-1,-8],[0,-3],[-1,-9],[-1,-3],[-1,-2],[-1,-7],[-1,-4],[-1,-2],[-1,-2],[-2,-6],[-1,-2],[-1,-2],[-3,-5],[-10,-20],[-4,-8],[-7,-11],[-6,-12],[-4,-8],[-8,-14],[-4,-7]],[[8166,5772],[7,19],[8,19]],[[8181,5810],[17,-9],[18,-11]],[[8216,5790],[39,-22],[27,-15],[2,-2]],[[8216,5790],[7,19],[3,5],[7,18],[2,5],[8,18],[2,5],[2,6],[-19,10],[-2,-3],[1,-3],[-5,-12],[-19,12]],[[8181,5810],[20,54],[2,6]],[[2386,3567],[-7,-7],[-9,-11],[-10,-9],[-8,-9],[-9,-13],[-2,-7],[-4,-8],[-3,-12],[-3,-10],[0,-11],[0,-23],[-1,-13],[2,-19],[0,-9],[-1,-8],[-2,-4],[-4,-12],[-8,-11],[-36,-14],[-9,-5],[-9,-9],[-5,-6],[-2,-7],[0,-12],[0,-9],[0,-3],[2,-4],[1,-29],[2,-11],[0,-15],[2,-19],[2,-7],[4,-8],[3,-4],[10,-12],[12,-7],[3,-7],[2,-6],[1,-3],[4,-3],[1,-3],[1,-7],[0,-20],[-3,-13],[-2,-3],[-5,-16],[-2,-4],[-3,-3],[-4,-1],[-10,-6],[-3,-3],[-2,-3],[-11,-15],[-3,-10],[-1,-9],[-4,-14],[-6,-5],[-5,-3],[-1,-2],[0,-4],[0,-9],[1,-18],[1,-3],[4,-6],[6,-3],[1,-1],[0,-2],[-1,-5],[-3,-5],[-1,-5],[-2,-4],[-4,-12],[-2,-5],[-1,-1],[-5,-4],[-7,-4],[-6,-5],[-4,0],[-8,1],[-5,-3],[-6,-9],[-10,-11],[-3,-6],[-5,-3],[-2,-7],[-2,-10],[-4,-6],[-6,-3],[-2,-2],[-5,-6],[-1,-3],[-3,-5],[0,-4],[-3,-4],[-2,-1]],[[2259,3137],[3,6],[2,5],[1,3],[1,8],[2,9],[1,2],[0,5],[1,5],[0,4],[1,6],[-1,2],[0,2],[-2,6],[-1,3],[0,2],[-1,2],[-1,2],[-2,3],[-8,12],[-4,8],[-2,4],[-1,4],[0,7],[1,3],[0,3],[1,3],[2,9],[1,7],[0,2],[1,3],[-1,3],[0,5],[0,6],[-1,8],[0,5],[-1,16]],[[2164,3320],[7,6],[1,0],[13,-19],[5,6],[4,5],[4,6],[2,2],[2,3],[1,2],[6,8],[6,10]],[[7883,4323],[-8,-15]],[[7875,4308],[-3,2],[-8,6],[-1,1],[-26,20]],[[7837,4337],[-79,61],[8,14]],[[7766,4412],[71,-53],[8,-7]],[[7682,4356],[4,6],[55,78]],[[7741,4440],[1,-1],[0,-1],[2,-2],[1,-7],[21,-17]],[[7837,4337],[-5,-9],[-5,-9],[-10,-18],[-14,-26]],[[7875,4308],[-11,-18],[-10,-19],[-14,-24]],[[7869,4225],[-10,7],[-11,8],[-8,7]],[[7872,4148],[-7,6],[-31,23],[-8,6],[-7,6],[-9,6]],[[7863,4133],[-7,5],[-32,24],[-7,5],[-7,6],[-8,6]],[[7850,4108],[-47,35],[-2,-3],[-13,11],[-2,1]],[[7447,4255],[-10,7],[-44,34],[-9,6]],[[7384,4302],[9,17]],[[7393,4319],[8,14]],[[7401,4333],[63,-47]],[[7464,4286],[-9,-14],[-8,-17]],[[7447,4255],[-10,-17],[-9,7],[-44,34],[-9,7]],[[7375,4286],[9,16]],[[7305,4338],[9,17]],[[7314,4355],[10,-7],[20,-15],[31,-24],[9,-7]],[[7375,4286],[-10,7],[-51,38],[-9,7]],[[7314,4355],[9,17]],[[7323,4372],[10,-7],[6,-5],[45,-34],[9,-7]],[[7323,4372],[9,14]],[[7332,4386],[7,13]],[[7339,4399],[50,-38],[19,-15]],[[7408,4346],[-7,-13]],[[7353,4424],[69,-53]],[[7422,4371],[-7,-13],[-7,-12]],[[7339,4399],[6,11],[8,14]],[[7353,4424],[-69,52]],[[7284,4476],[7,14],[7,11]],[[7298,4501],[68,-52]],[[7366,4449],[46,-34],[6,-5],[18,-14]],[[7436,4396],[-6,-11],[-8,-14]],[[7366,4449],[7,11],[6,11]],[[7379,4471],[6,12],[7,11]],[[7392,4494],[69,-52]],[[7461,4442],[-6,-11],[-6,-12],[-7,-12],[-6,-11]],[[7298,4501],[6,11],[6,11]],[[7310,4523],[69,-52]],[[7310,4523],[-37,27],[-18,14],[-2,2],[-1,1],[-1,2]],[[7251,4569],[1,4],[2,8],[5,12]],[[7259,4593],[64,-47]],[[7323,4546],[69,-52]],[[7323,4546],[7,11],[9,18],[7,12],[7,14]],[[7353,4601],[69,-52]],[[7422,4549],[-7,-13],[-7,-12],[-9,-18],[-7,-12]],[[9197,7781],[97,-26],[62,-16],[52,-15]],[[9408,7724],[52,-14]],[[9460,7710],[61,-17]],[[9019,7016],[-207,59],[-36,11]],[[8776,7086],[18,116],[4,22],[-218,166],[-2,2],[-17,11],[-3,3]],[[8558,7406],[-3,2],[-4,2],[-28,22],[-2,1],[-351,274]],[[8170,7707],[44,47],[3,4],[3,2]],[[8220,7760],[2,3],[18,20],[11,12],[38,41],[6,7],[30,32],[43,47],[5,5],[39,43],[21,23],[8,8],[2,1]],[[8615,8154],[3,-3],[3,-1],[10,8],[37,-30],[39,-29],[129,-99],[20,-14],[5,-4],[3,-2],[4,-3],[23,-18],[46,-34],[19,-13],[91,-68],[54,-41],[62,-17],[7,-2],[24,-2],[3,-1]],[[8776,7086],[-14,-61],[-68,22],[-4,-7],[-51,20],[-33,-49]],[[8606,7011],[-22,16],[-4,3],[-9,7]],[[8571,7037],[12,22],[1,11],[1,26],[4,7],[-12,9],[-5,3],[-3,2],[-5,3],[-6,4],[-4,20],[-35,23]],[[8379,7068],[1,2],[18,33],[10,19],[16,32],[9,16],[27,50],[22,43],[9,17],[11,19],[5,11],[4,7],[4,8],[40,75],[0,1],[1,0],[0,1],[2,4]],[[8571,7037],[-17,12],[-8,-15]],[[8606,7011],[-8,-14],[-7,-14]],[[8977,6880],[-2,1],[-41,16]],[[9430,7831],[-4,-22],[-5,-21],[-5,-24],[-5,-27],[-3,-13]],[[9197,7781],[14,62],[8,43],[5,23],[2,8],[2,13],[5,22]],[[9233,7952],[31,-8],[66,-18]],[[9330,7926],[-5,-21],[-4,-22],[-5,-22],[61,-16],[53,-14]],[[9430,7831],[53,-14]],[[9483,7817],[-5,-22]],[[9478,7795],[-4,-22],[-5,-24],[-6,-26],[-3,-13]],[[9430,7831],[5,22],[1,6],[3,15],[4,22],[5,22],[53,-14]],[[9501,7904],[-5,-22],[-4,-22],[-5,-21],[-4,-22]],[[9539,7779],[-61,16]],[[9501,7904],[2,10],[8,24],[2,3]],[[9330,7926],[4,22],[8,36],[0,3]],[[9342,7987],[51,-14]],[[9393,7973],[43,-11],[44,-12],[33,-9]],[[9393,7973],[4,21],[4,20]],[[9401,8014],[4,21],[4,23],[5,21]],[[9268,8006],[4,20],[4,20],[41,-11],[43,-10],[41,-11]],[[9342,7987],[-45,12],[-20,5],[-9,2]],[[6454,4165],[-1,-3],[-4,-11],[-1,-3],[-1,-2],[0,-1],[-1,-6],[0,-6],[3,-8],[12,-29],[2,-9],[2,-8],[1,-15],[-2,-20],[-5,-19],[-3,-13],[-3,-8],[-4,-13],[-8,-16],[-9,-24],[-2,-6],[-12,-32],[2,-1],[-1,-2],[-4,-11],[-1,-3],[-8,-20],[0,-2],[-20,-46],[-4,-10],[-5,-11],[-15,7],[-36,16],[-12,5],[-33,16],[-1,-4],[-12,-34],[2,-2],[23,-11],[1,-1],[0,-1],[0,-1],[-7,-18],[-1,-1],[-2,-1],[-2,1],[-19,9],[-4,0],[-9,-26]],[[6250,3761],[-23,-65],[-24,-69]],[[6203,3627],[-26,-75]],[[6153,3913],[0,7],[0,10]],[[6087,3914],[12,30]],[[6764,4366],[-2,-12]],[[6762,4354],[-9,4],[-24,12],[-30,9],[-6,-16],[-4,-11],[-3,-9]],[[6686,4343],[-6,-18]],[[6680,4325],[-78,35],[-5,3]],[[6680,4325],[-7,-18]],[[6673,4307],[-81,36],[-1,3],[3,9]],[[6673,4307],[-7,-19]],[[6748,4315],[-7,-18]],[[6741,4297],[-8,4],[-29,13],[-24,11]],[[6686,4343],[24,-11],[28,-13],[10,-4]],[[6755,4335],[-7,-20]],[[6762,4354],[-7,-19]],[[6718,3553],[33,50],[12,34]],[[6763,3637],[21,-11],[-10,-24],[24,-11],[-13,-24],[-11,-20],[-10,-20],[10,-9],[4,-3],[6,-4]],[[9346,8496],[-3,1],[-19,5],[3,18],[0,2],[-2,2],[-9,2],[7,32],[-1,3],[-2,1],[-15,4],[-18,5],[-6,-36],[-18,5],[-18,5],[7,35],[-18,4],[3,14],[-6,2],[-4,2],[-2,3],[-1,3],[0,4]],[[9224,8612],[27,34],[20,22],[6,5],[18,18],[-14,4],[19,16],[-2,3],[4,21]],[[9224,8612],[-7,-10],[-18,-21],[-20,-14],[-10,-6],[-9,-4],[-5,-2],[-6,-3],[-6,-3],[5,20],[3,17]],[[9151,8586],[1,13],[1,26],[1,21],[-2,30],[-2,14],[-6,42],[-3,26]],[[9141,8758],[7,-4],[6,-4],[7,-4],[1,1],[2,0],[2,0],[66,-18],[5,24],[65,-18]],[[9141,8758],[1,1],[0,2],[0,2],[0,3],[0,4],[-1,14],[0,5],[-1,9],[-1,17],[0,6],[-1,15],[-4,40],[-2,13],[0,9],[-1,9],[-1,16],[0,6],[6,3],[0,6],[1,9],[0,4]],[[7575,4830],[-48,37],[-3,-6],[-14,10],[-7,5]],[[7503,4876],[9,18]],[[7512,4894],[7,-6],[12,-9],[4,10],[1,4],[4,0],[5,2],[2,5],[1,4],[3,8],[48,-36]],[[7599,4876],[-6,-12],[-6,-11],[-6,-11],[-6,-12]],[[7575,4830],[-6,-12],[-7,-12]],[[7562,4806],[-46,36],[-15,11],[-7,5]],[[7494,4858],[9,18]],[[7553,4786],[-69,53]],[[7484,4839],[5,10],[5,9]],[[7562,4806],[-4,-10],[-5,-10]],[[7521,4729],[-54,40],[-5,4],[-11,8]],[[7451,4781],[6,11],[6,9],[5,9],[5,10]],[[7473,4820],[6,9],[5,10]],[[7553,4786],[-5,-10],[-6,-10]],[[7542,4766],[-5,-9],[-5,-9],[-5,-9],[-6,-10]],[[7498,4689],[-17,13],[-8,8],[-34,25],[-10,7]],[[7429,4742],[11,19]],[[7440,4761],[6,10],[5,10]],[[7521,4729],[-7,-11],[-5,-10],[-5,-10],[-6,-9]],[[7475,4645],[-10,7],[-51,37],[-9,7]],[[7405,4696],[14,26]],[[7419,4722],[10,20]],[[7498,4689],[-5,-10],[-5,-10]],[[7488,4669],[-7,-13],[-6,-11]],[[7461,4621],[-9,7],[-51,37],[-9,7]],[[7392,4672],[13,24]],[[7475,4645],[-14,-24]],[[7461,4621],[-13,-23]],[[7448,4598],[-9,6],[-51,37],[-9,7]],[[7379,4648],[13,24]],[[7448,4598],[-6,-13],[-6,-10]],[[7436,4575],[-63,46],[-6,5]],[[7367,4626],[6,10],[6,12]],[[7353,4601],[8,13],[6,12]],[[7436,4575],[-6,-12],[-8,-14]],[[7491,4498],[-69,51]],[[7436,4575],[60,-44],[9,-7]],[[7505,4524],[-6,-12],[-8,-14]],[[7491,4498],[-7,-13],[-7,-12],[-5,-11],[-4,-7],[-2,-3],[-5,-10]],[[7518,4547],[-6,-12],[-7,-11]],[[7448,4598],[11,-8],[50,-37],[9,-6]],[[7531,4571],[-13,-24]],[[7461,4621],[11,-7],[23,-17],[14,-10],[13,-10],[9,-6]],[[7475,4645],[10,-7],[50,-37],[9,-7]],[[7544,4594],[-13,-23]],[[7488,4669],[9,-8],[50,-38],[9,-7]],[[7556,4616],[-12,-22]],[[7498,4689],[69,-53]],[[7567,4636],[34,-27],[-5,-9],[-5,-10],[-23,17],[-12,9]],[[7521,4729],[68,-54]],[[7589,4675],[-6,-10],[-5,-10]],[[7578,4655],[-6,-10],[-5,-9]],[[7542,4766],[69,-53]],[[7611,4713],[-6,-9],[-5,-9]],[[7600,4695],[-5,-9],[-6,-11]],[[7553,4786],[68,-53]],[[7621,4733],[-5,-10],[-5,-10]],[[7562,4806],[69,-52]],[[7575,4830],[68,-53]],[[7599,4876],[68,-53]],[[7599,4876],[5,11],[6,12]],[[7610,4899],[6,11],[6,12]],[[7622,4922],[34,-27],[35,-27]],[[7259,4593],[4,13],[4,14],[2,6]],[[7269,4626],[3,7],[4,8],[2,5],[4,7]],[[7282,4653],[71,-52]],[[7282,4653],[8,13],[6,12]],[[7296,4678],[71,-52]],[[7296,4678],[6,10],[6,12]],[[7308,4700],[10,-8],[51,-37],[10,-7]],[[7308,4700],[13,24]],[[7321,4724],[10,-7],[51,-38],[10,-7]],[[7321,4724],[13,24]],[[7334,4748],[10,-7],[51,-38],[10,-7]],[[7334,4748],[9,16],[6,10]],[[7349,4774],[9,-7],[52,-38],[9,-7]],[[7349,4774],[10,20]],[[7359,4794],[61,-45],[9,-7]],[[7359,4794],[6,9],[5,11]],[[7370,4814],[7,-6],[63,-47]],[[7370,4814],[5,9],[6,11]],[[7381,4834],[70,-53]],[[7381,4834],[6,10],[5,10]],[[7392,4854],[5,9],[5,10]],[[7402,4873],[71,-53]],[[7402,4873],[6,10],[6,10]],[[7414,4893],[70,-54]],[[7414,4893],[4,9],[4,9]],[[7432,4928],[7,-5],[16,-12],[18,-13],[21,-16],[9,-6]],[[7461,4983],[8,-6],[53,-39],[9,-7]],[[7531,4931],[-10,-20],[-9,-17]],[[7541,4951],[-10,-20]],[[7482,5022],[8,-6],[30,-22],[16,-7],[17,-12]],[[7553,4975],[-12,-24]],[[7565,4997],[-6,-11],[-6,-11]],[[7446,5078],[8,-6],[31,-23],[8,-6],[10,20]],[[7503,5063],[8,-6],[18,-13],[-1,-3],[-4,-7],[-2,-4],[43,-33]],[[7503,5063],[11,19],[6,11],[6,11]],[[7526,5104],[39,-29],[12,-8],[18,-13]],[[7595,5054],[-6,-11],[-6,-12],[-6,-11]],[[7577,5020],[-6,-12],[-6,-11]],[[7636,4427],[6,11],[5,8]],[[7647,4446],[13,24]],[[7660,4470],[9,18],[2,6],[2,0],[9,-7],[29,-22],[30,-25]],[[7696,4593],[11,-9],[20,-15],[3,-1],[30,-23]],[[7760,4545],[33,-25]],[[7793,4520],[4,-3]],[[7797,4517],[-2,-2],[-19,-25]],[[7776,4490],[-11,-15],[-24,-35]],[[7660,4470],[-13,9],[-45,35],[-8,6]],[[7594,4520],[13,23]],[[7607,4543],[42,65],[-34,25],[-14,5],[-23,17]],[[7589,4675],[33,-25],[4,-3],[31,-24],[39,-30]],[[7696,4593],[4,8],[4,7]],[[7704,4608],[5,11],[6,12]],[[7715,4631],[36,-28],[8,-7],[7,-3]],[[7766,4593],[1,-22],[-2,-9],[-3,-13],[-2,-4]],[[7814,4558],[-8,6],[-27,21],[-7,5],[-6,3]],[[7715,4631],[4,7],[2,4],[1,1],[4,8]],[[7726,4651],[24,-17],[8,-7],[4,-3]],[[7762,4624],[1,-4],[6,-4],[8,-6],[38,-29],[8,-7],[-9,-16]],[[7793,4520],[2,3],[10,19],[9,16]],[[7762,4624],[-3,29],[20,-16],[12,-7],[2,-2]],[[7793,4628],[27,-20],[15,-12],[20,-15]],[[7855,4581],[-3,-2],[-19,-16],[-11,-11]],[[7822,4552],[-4,-5],[-21,-30]],[[7804,4647],[-6,-9],[-5,-10]],[[1616,411],[-3,-1],[-36,-16],[-25,-12],[-8,-4],[-33,-14],[-12,-6],[-12,-4],[-28,-10],[-6,27],[-25,-7],[-27,-9]],[[848,76],[6,21]],[[908,104],[10,4],[6,2],[3,1],[8,1],[4,-1],[19,-5],[0,4],[1,11],[1,20],[1,7],[-1,7],[0,6],[1,3],[2,2],[3,8],[1,19],[9,2],[7,2],[10,3],[10,4],[49,35],[29,21],[4,2],[5,0],[8,-1],[12,0]],[[1110,261],[5,-1],[4,0],[4,0],[9,2],[43,13],[10,2],[26,5]],[[1618,401],[-3,-2],[-4,-7],[-5,-9],[-9,-13],[-11,-22],[-9,-1],[-24,-23],[-8,-4],[-6,-4],[-1,-2],[-2,-5],[-8,-4],[-9,-2],[-15,1],[-3,1],[-16,4],[-31,0],[-21,2],[-8,1],[-4,2],[-13,0],[-6,-3],[-2,0],[-18,-8],[-1,3],[-11,-8],[-17,-5],[-4,-4],[-11,-7],[-7,-6],[-3,-1],[-9,-6],[-4,2],[-23,-14],[-15,-14],[-2,-4],[-8,-4],[-10,-9],[-13,-5],[-4,0],[-3,-5],[-2,-2],[-5,-7],[-2,-6],[-5,-6],[-4,-5],[-6,-2],[-13,-8],[-7,-2],[0,-13],[-1,0],[-1,13],[-2,0],[-4,4],[-6,2],[-11,1],[-6,-1],[-12,-8],[-5,-8],[-5,-14],[-3,-7],[-6,-13],[-2,-4],[-1,-11],[1,-32],[-8,-14],[-6,-6],[-2,-2],[0,-3],[-2,-4],[-4,-7],[-5,-3],[-2,0],[-2,2],[-7,5],[-9,3],[-5,-2],[-3,-3],[-1,-21],[-1,-3],[-2,-1],[-3,2],[-1,4],[5,0],[0,31],[-12,2],[-3,-31],[5,-1],[0,-4],[-10,1],[-1,1],[-1,2],[0,7],[-1,0],[-4,6],[-12,0],[-7,-1],[-3,6],[-2,3],[-3,0],[-5,-1],[-15,-5],[-4,-3],[-5,-10],[-2,-2],[-5,-2],[-11,0],[-1,2],[-1,13],[-3,2],[-3,-6],[-3,-2],[-6,0],[-13,1],[-9,3],[-4,3],[-4,4],[-3,5],[-9,6],[-4,13],[-1,4],[-3,3],[-8,0],[-3,-1],[-23,-1],[-10,-1],[-7,-2],[-3,-2],[-1,-1]],[[6421,5195],[-62,30]],[[6359,5225],[4,11],[4,11]],[[6367,5247],[4,11],[4,13],[9,24]],[[6397,5128],[-61,30]],[[6336,5158],[4,11],[3,11]],[[6343,5180],[5,12],[4,11],[3,11],[4,11]],[[6413,5173],[-4,-11],[-4,-11],[-4,-12],[-4,-11]],[[6319,5112],[4,12],[5,11],[4,12],[4,11]],[[6397,5128],[-4,-11],[-4,-11],[-4,-12],[-5,-13]],[[6258,5141],[4,13],[4,11],[4,11],[4,12]],[[6274,5188],[4,11],[4,11]],[[6282,5210],[61,-30]],[[6474,5143],[-4,-11],[-4,-11],[-4,-11],[-4,-12],[-4,-11],[-4,-11],[-4,-12],[-4,-12]],[[7053,6499],[15,13],[14,12],[14,13],[13,19],[-19,29],[14,13],[9,7],[14,13],[-13,22]],[[7180,6696],[19,-30]],[[7199,6666],[30,-46],[2,-3]],[[7511,6675],[-2,-1],[-21,-19],[-2,-2],[-14,-13],[65,-49]],[[7231,6617],[33,65],[3,6],[60,120],[13,26],[23,35],[25,33],[16,20],[28,-36],[14,13],[-5,21],[13,15]],[[6770,5704],[-4,3],[-33,22],[-8,6]],[[6725,5735],[10,21]],[[6797,5762],[-1,-2],[-8,-18],[-8,-17],[-10,-21]],[[6851,5547],[-58,43]],[[6820,5639],[6,11],[6,11],[6,11],[5,9],[5,9],[4,8],[3,7],[9,-6],[1,3]],[[6714,5593],[-5,3]],[[6709,5596],[11,21],[11,21],[-32,23],[-9,6]],[[6690,5667],[11,22],[12,24],[12,22]],[[6709,5596],[-32,23],[-9,6],[-8,6],[-42,28],[-8,6]],[[6610,5665],[10,20]],[[6620,5685],[9,-6],[41,-28],[8,-6],[12,22]],[[6620,5685],[11,23],[-50,34],[-8,6]],[[6573,5748],[11,22]],[[6584,5770],[12,23]],[[6610,5665],[-9,6],[-41,29],[-9,6]],[[6551,5706],[11,20],[11,22]],[[6590,5626],[-59,41]],[[6531,5667],[10,19],[10,20]],[[6610,5665],[-10,-20],[-10,-19]],[[6662,5490],[-4,4],[-42,28]],[[6616,5522],[9,18],[13,25],[1,3],[9,18],[-58,40]],[[7178,4851],[-30,22]],[[7148,4873],[-57,42]],[[7148,4873],[-9,-17],[-12,-22],[30,-23]],[[4805,3933],[-5,6],[-47,49]],[[4753,3988],[7,8],[-13,14],[-11,11],[-1,1],[0,1],[-1,1],[1,1],[5,7],[-13,14],[28,37],[6,-6],[7,-8],[4,-3]],[[4772,4066],[9,-11],[16,-16],[4,-2],[14,-15],[15,-15],[15,-15],[6,-7]],[[4851,3985],[-2,-3],[-44,-49]],[[4546,3539],[-4,6],[20,11],[11,8],[8,6],[3,6],[-2,-1],[-1,0],[-1,0],[-3,3],[-43,47],[17,19],[16,-18],[16,-16],[26,15],[1,1],[-1,2],[-39,41],[4,5],[0,2],[-1,2],[-13,13]],[[4560,3691],[13,20],[16,24],[9,15],[2,4],[7,14],[6,13],[3,8],[10,23],[7,15],[13,18],[12,17],[13,18],[14,18],[14,18],[8,10],[10,13],[11,11],[7,9],[18,29]],[[4805,3933],[133,-148],[2,-3],[4,-4],[2,-1]],[[4946,3777],[-89,-54],[-10,-5]],[[6846,4116],[-16,-46],[1,0],[12,-1],[11,-2],[10,-3],[3,-2],[8,-5],[7,-6],[4,-4],[3,-2],[6,-3],[-25,-68],[0,-3],[-6,-5],[-3,-4],[-3,-5],[-4,-9],[-1,-8],[0,-7],[-1,-8],[-2,-9],[-3,-8]],[[6847,3908],[-20,10],[-24,11]],[[6803,3929],[-20,9],[-20,10],[-19,10]],[[6891,4103],[76,-36]],[[6967,4067],[-1,-4],[-18,8],[-1,-4],[-18,-49],[-21,-62]],[[6908,3956],[-1,-3],[-13,-35],[0,-3],[0,-3],[1,-3],[2,-8],[-26,-12]],[[6871,3889],[-4,10],[-3,2],[-17,7]],[[6878,3872],[-5,12],[-2,5]],[[6908,3956],[18,-9],[18,-9],[14,-6],[4,-2],[2,-1]],[[6964,3929],[-1,-3],[0,-2],[-4,-10],[-3,-5],[-23,-64],[-19,9],[-18,9],[-18,9]],[[6903,3730],[-7,4],[-3,1],[-18,8],[-19,9],[-19,8]],[[6837,3760],[15,39],[26,73]],[[6964,3929],[33,-17],[36,-17],[1,0]],[[6837,3760],[-9,4],[-11,-27],[-3,-4]],[[6814,3733],[-6,3],[-20,10],[-2,2],[19,54],[-5,2],[-7,12],[-9,25],[-1,4]],[[6783,3845],[-5,13],[25,71]],[[6699,3803],[-6,13],[25,71],[26,71]],[[6783,3845],[-28,-14],[-28,-14],[-28,-14]],[[6814,3733],[-4,-13],[-16,7]],[[6794,3727],[-39,19],[-80,38]],[[6675,3784],[2,6],[1,4],[2,0],[1,0],[2,1],[16,8]],[[6675,3784],[-13,6]],[[6662,3790],[2,7],[1,3],[-5,3],[-6,3],[-1,0],[-2,0],[-8,22],[11,7],[3,2],[1,4],[22,64],[-20,10]],[[6660,3915],[24,70]],[[6662,3790],[-12,6]],[[6650,3796],[-65,31]],[[6585,3827],[1,5],[-20,9],[-19,9],[29,81]],[[6576,3931],[18,-9],[11,6],[3,1],[11,5],[20,-9],[21,-10]],[[6577,3711],[-4,9],[0,2],[0,3],[0,3],[9,27]],[[6582,3755],[19,55],[-19,9]],[[6582,3819],[3,8]],[[6650,3796],[1,-4],[-4,-14],[-3,-1],[-4,-2],[-2,-3],[-1,-2],[-9,-22],[-1,-3],[-4,-4],[-5,-4],[-9,-6],[-25,-15],[-4,-3],[-3,-2]],[[6630,3633],[-20,11],[-20,8],[-18,9]],[[6572,3661],[13,34],[-6,14],[-2,2]],[[6675,3784],[-3,-11],[-4,-18],[-7,-21],[-2,-9],[1,-27],[2,-19],[-4,0],[-14,-2],[0,-4],[-14,-40]],[[6650,3615],[-2,7],[-2,3],[-2,2],[-14,6]],[[6794,3727],[-3,-8],[-4,-14],[-24,-68]],[[6551,3599],[21,62]],[[8469,5496],[75,-40],[14,4],[4,0],[9,-4],[7,-4],[16,-8],[9,-6],[17,-11],[82,-46],[2,-1]],[[8704,5380],[-7,-23],[-4,-15],[-2,-4],[-2,-8],[-8,-24],[-7,-24]],[[8674,5282],[-3,2],[-14,8],[-6,3],[-14,8],[-32,17],[-3,-3],[-1,-8],[-14,-36]],[[8587,5273],[-9,-24],[-9,-24]],[[8569,5225],[-10,-26],[-10,-23]],[[8549,5176],[-31,-80]],[[8518,5096],[-10,-23],[-9,-23]],[[8499,5050],[-8,-21],[-3,-4]],[[8488,5025],[-6,4],[-50,27]],[[8435,5412],[6,14],[6,15],[2,5],[6,16],[14,34]],[[8334,5073],[-67,36],[-9,5]],[[8258,5114],[8,19],[1,6],[1,3]],[[8344,5102],[-1,-4],[-9,-25]],[[8313,5019],[-76,40]],[[8237,5059],[4,10],[4,10],[7,19]],[[8252,5098],[6,16]],[[8334,5073],[-6,-15]],[[8328,5058],[-8,-19],[-3,-10],[-4,-10]],[[8313,5019],[-4,-10],[-5,-13]],[[8304,4996],[-9,7],[-3,2],[-8,4],[-5,3],[-41,21],[-9,5]],[[8229,5038],[4,11],[4,10]],[[1110,261],[2,35],[2,34],[-43,5],[-32,3],[4,34],[-13,29]],[[848,76],[-2,-3],[-5,-3],[-5,-1],[-6,1],[-8,5],[-14,0],[-7,-2],[-19,-9],[-5,-5],[-5,-4],[-11,-4],[-6,-11],[-7,-7],[-4,-3],[-12,-3],[-11,-1],[-6,-2],[-26,-5],[-22,-7],[-5,-3]],[[662,9],[-5,19]],[[657,28],[-10,68],[-1,8],[-1,3],[4,-1],[-3,14],[-2,1],[-3,16],[-10,73]],[[631,210],[0,3],[-3,2],[-2,1],[-5,2],[-7,4],[-8,4]],[[606,226],[-2,2],[-13,118],[-23,37],[-36,103]],[[1019,1295],[22,13],[-2,11],[37,25],[-4,14],[132,53],[6,8],[195,119],[30,-60]],[[606,226],[-36,-15],[-36,-15],[-32,-16]],[[570,85],[-2,-2],[-15,-2],[-23,-4],[-1,21],[-13,-2],[-7,50],[0,3],[-1,8],[-1,3],[-1,4]],[[631,210],[-4,-1],[-4,-2],[-2,0],[-2,-1],[-2,-1],[-1,-1],[-31,-14],[4,-36],[1,-5],[2,-20],[2,-20],[2,-20],[-26,-4]],[[657,28],[-5,-3],[-15,-6],[-3,0],[-10,-1],[-5,0],[-8,1],[-15,1],[-17,-1],[-3,0],[-6,66]],[[662,9],[-4,-2],[-5,-1],[-4,-2],[-33,1],[-17,-1],[-1,6],[-1,0],[-1,-1],[-1,-5],[-14,-2],[-2,0],[0,2],[-1,2],[-1,-3],[-3,-3],[-4,1],[-2,0],[0,4],[-2,2],[-37,10],[-11,7],[-13,1],[-71,41],[-3,-7],[62,-37],[0,-3],[0,-2],[-7,4],[-45,26],[0,1],[-12,7],[-3,1],[-3,2]],[[1560,1505],[-9,19],[-9,44],[124,49],[25,17],[11,7],[10,4],[6,1]],[[3029,1685],[-25,40],[-28,46],[-17,-14],[-17,-14],[-15,-12],[-1,-2],[0,-2],[27,-44],[-9,-7],[-3,-2],[-2,-1],[-4,0],[-4,2]],[[2845,1617],[-8,-6]],[[2837,1611],[-43,71],[-33,59],[-15,25],[-26,42],[-2,3]],[[3084,1896],[5,-22],[10,-40]],[[3099,1834],[19,-75]],[[3118,1759],[-1,-1],[-2,-1],[-3,-3],[-53,-43],[-16,-14]],[[3127,1864],[-4,-4],[-1,-1],[-2,-3],[-2,-6],[-2,-3],[-2,-2],[-15,-11]],[[3249,2028],[10,-19],[1,-7],[-1,-39],[1,-4],[11,-20],[-20,-18]],[[3251,1921],[-39,-31],[-33,-28],[-12,19],[-7,11],[-17,-15],[-11,-9],[-5,-4]],[[7402,4873],[-69,50]],[[7392,4854],[-70,51]],[[7381,4834],[-69,51]],[[7370,4814],[-69,50]],[[8304,4996],[-13,-20]],[[8291,4976],[-10,8],[-7,6],[-5,2],[-4,2],[-35,19],[-9,4]],[[8221,5017],[8,21]],[[8233,4878],[-44,22],[-1,0],[-2,-1],[0,-1],[-1,-1],[-7,-18],[-1,-3]],[[8177,4876],[-15,6],[-4,3]],[[8158,4885],[8,20],[6,18],[4,11],[4,7],[5,11],[6,9],[11,17],[4,7],[5,11]],[[8211,4996],[5,10],[5,11]],[[8291,4976],[-12,-20]],[[8279,4956],[-13,-21]],[[8266,4935],[-12,-20],[-13,-20]],[[8241,4895],[-4,-7],[-4,-10]],[[8211,4996],[-2,1],[-10,6],[-48,24],[-9,5]],[[8142,5032],[8,22]],[[8150,5054],[8,22]],[[8158,5076],[9,-5],[52,-28],[8,-3],[2,-2]],[[8158,5076],[6,11],[5,8]],[[8169,5095],[66,-35],[2,-1]],[[8169,5095],[5,10],[5,9],[5,8],[6,9]],[[8190,5131],[60,-31],[2,-2]],[[8190,5131],[5,9],[3,6],[3,5],[3,6],[1,2],[4,10],[1,4]],[[8058,5280],[-2,1],[-7,4],[-25,13],[-10,5],[10,18]],[[8024,5321],[10,18],[9,19]],[[7948,5359],[8,-4],[3,-1],[54,-28],[3,-1],[8,-4]],[[8174,4331],[12,20],[14,24]],[[8200,4375],[9,-6],[30,-24],[9,-6]],[[8200,4375],[9,17]],[[8209,4392],[67,-52]],[[8209,4392],[10,17]],[[8219,4409],[60,-49]],[[8219,4409],[10,18],[12,19],[11,20]],[[8252,4466],[8,-6],[22,-15],[2,-2],[11,-8]],[[8219,4409],[-8,6],[-9,8],[-30,23],[-9,7]],[[8163,4453],[21,35],[-8,7],[-19,13],[-10,8],[-9,7]],[[8138,4523],[9,16]],[[8147,4539],[38,-27],[9,-6],[8,-6],[20,-14],[20,-14],[10,-6]],[[8209,4392],[-7,6],[-20,15],[-20,16],[-9,6]],[[8153,4435],[10,18]],[[8200,4375],[-16,12],[-8,-14],[-31,25],[-9,7]],[[8136,4405],[8,14]],[[8144,4419],[9,16]],[[8174,4331],[-56,44]],[[8118,4375],[6,10],[6,10],[6,10]],[[8062,4390],[11,20]],[[8073,4410],[9,-7],[36,-28]],[[8073,4410],[11,20]],[[8084,4430],[6,10]],[[8090,4440],[8,-7],[1,0],[28,-21],[8,14],[1,-2],[8,-5]],[[8090,4440],[5,9]],[[8095,4449],[3,5],[8,14]],[[8106,4468],[2,3]],[[8108,4471],[8,-6],[30,-24],[7,-6]],[[8108,4471],[10,17],[10,18],[10,17]],[[8106,4468],[-9,7],[-51,40],[-9,6]],[[8037,4521],[-18,15],[-9,7]],[[8010,4543],[11,19],[28,46]],[[8049,4608],[71,-50],[27,-19]],[[8095,4449],[-69,53]],[[8026,4502],[6,10],[5,9]],[[8084,4430],[-8,7],[-23,17],[-10,8],[-19,15],[-8,6]],[[8016,4483],[4,9],[1,1],[5,9]],[[8073,4410],[-69,54]],[[8004,4464],[6,10],[6,9]],[[8062,4390],[-9,7],[-40,31],[-20,16],[-9,-16]],[[7984,4428],[-9,6],[-12,9],[-8,7]],[[7955,4450],[9,16],[11,20]],[[7975,4486],[29,-22]],[[8052,4374],[-8,6],[-53,42],[-7,6]],[[8030,4336],[-7,6],[-2,1],[-51,39],[-9,7]],[[7961,4389],[9,15],[5,8],[9,16]],[[7919,4386],[13,25]],[[7932,4411],[9,-7],[11,-8],[9,-7]],[[7932,4411],[14,23],[9,16]],[[7932,4411],[-2,2],[-7,5],[-13,10]],[[7910,4428],[6,11],[2,2],[5,10],[-7,5],[-1,1],[-50,39],[-8,6],[9,16]],[[7866,4518],[8,-6],[26,-20],[24,-19],[8,-6]],[[7932,4467],[8,-6],[5,-4],[7,-6],[3,-1]],[[7869,4393],[-8,10],[11,19]],[[7872,4422],[14,24]],[[7886,4446],[9,-7],[9,-7],[6,-4]],[[7886,4446],[-42,33],[-17,12],[-11,10],[-7,5],[-4,5],[-8,6]],[[7822,4552],[3,-3],[32,-25],[9,-6]],[[6501,3793],[-7,-19],[-17,-41]],[[6477,3733],[-5,-9],[-3,-6],[-4,-5],[-6,-9],[-5,-6],[-7,-7]],[[6379,3781],[20,-10],[20,-10],[13,28],[14,17]],[[6446,3806],[2,-2],[3,-1],[4,0],[4,2],[2,3],[2,2],[19,-9],[10,-5],[9,-3]],[[6403,3841],[21,-11],[19,-10],[0,-4],[0,-2],[0,-3],[1,-2],[2,-3]],[[6582,3819],[-21,11],[-19,8],[-19,9],[-9,-22],[-13,-32]],[[6426,3903],[3,-1],[20,-10],[19,-9],[4,-2],[8,-4],[10,-5],[36,-17],[39,-18],[20,-10]],[[6523,3965],[1,-2],[2,-3],[1,-2],[0,-4],[12,-6],[18,-8],[19,-9]],[[6527,4004],[4,12],[4,9],[18,-9],[2,-1],[8,8],[7,5],[4,2],[4,1],[4,1],[7,0],[6,-2],[14,-6],[16,-8],[1,-2]],[[7359,4794],[-69,50]],[[7334,4748],[-36,26],[-4,-8],[-33,24]],[[7296,4678],[-35,26]],[[7269,4626],[-69,52]],[[7259,4593],[-40,31]],[[7219,4624],[-34,26],[-23,17]],[[7190,4582],[-8,4],[-15,8]],[[7167,4594],[2,8],[4,9],[7,13],[-29,22]],[[7219,4624],[-5,-10],[-6,-10],[-7,-13],[-11,-9]],[[7247,4555],[-6,3],[-44,21],[-7,3]],[[7251,4569],[-2,-6],[-2,-8]],[[7241,4535],[-7,4],[-7,3],[-5,2],[-39,19],[-23,11],[-35,17]],[[7133,4610],[34,-16]],[[7247,4555],[-3,-14],[-3,-6]],[[7234,4514],[-10,6],[-48,22]],[[7176,4542],[-58,29]],[[7241,4535],[-2,-6],[-3,-9],[-2,-6]],[[7162,4500],[-38,18],[-21,10]],[[7176,4542],[-4,-12],[-4,-11],[-3,-10],[-3,-9]],[[7162,4500],[-4,-10],[-4,-10],[-4,-11],[0,-2],[-4,-9]],[[7162,4500],[40,-20],[3,-1],[7,-4]],[[7212,4475],[-11,-19],[-16,-28]],[[7185,4428],[-7,-14],[-2,-1],[-1,-2]],[[7234,4514],[-12,-19],[0,-2],[-3,-4],[-7,-14]],[[7284,4476],[-50,38]],[[7332,4386],[-39,29]],[[7293,4415],[-9,7],[-9,6],[7,13],[-6,5],[-10,7]],[[7266,4453],[10,9],[8,14]],[[7305,4338],[-9,7],[-21,16],[-9,7],[-8,6],[-10,7]],[[7248,4381],[10,17]],[[7258,4398],[9,-7],[8,-6],[9,16],[9,14]],[[7283,4299],[-6,4]],[[7277,4303],[-3,3],[-21,15],[-9,7],[-8,6],[-10,8]],[[7226,4342],[6,11],[6,10],[7,11],[3,7]],[[7305,4338],[-10,-18],[-12,-21]],[[7215,4350],[11,-8]],[[7277,4303],[-6,-10],[-5,-9],[-5,-9],[-1,-2],[-5,-9],[-12,9]],[[7185,4428],[9,-6],[13,-10],[13,-10],[10,-7],[10,17],[9,-7],[9,-7]],[[7962,5097],[10,-5],[51,-26],[9,-4]],[[8032,5062],[-8,-20],[-7,-19]],[[7984,5141],[9,-5],[1,-1],[46,-24],[9,-5]],[[8049,5106],[-8,-22],[-9,-22]],[[8058,5129],[-9,-23]],[[8006,5182],[9,-4],[43,-23],[8,-5]],[[8066,5150],[-2,-4],[-6,-17]],[[8074,5170],[-8,-20]],[[8026,5219],[1,-1],[7,-3],[39,-21],[8,-5]],[[8081,5189],[-7,-19]],[[8089,5209],[-8,-20]],[[8099,5232],[-2,-3],[-8,-20]],[[8136,5160],[-8,-19]],[[8128,5141],[-9,4],[-37,20],[-8,5]],[[8089,5209],[9,-5],[8,-4],[21,-11],[8,-4],[9,-5]],[[8144,5180],[-8,-20]],[[8153,5203],[-1,-3],[-8,-20]],[[8190,5131],[-46,24],[-8,5]],[[8169,5095],[-40,22],[-8,4]],[[8121,5121],[7,20]],[[8150,5054],[-10,5],[-25,14],[-9,4]],[[8106,5077],[7,23]],[[8113,5100],[8,21]],[[7112,4117],[9,17]],[[7121,4134],[10,18]],[[7131,4152],[10,18],[-8,5],[-11,5],[-51,25],[-9,4]],[[7134,4264],[11,-4],[11,-7],[10,-10],[8,-11],[3,-7],[4,-10],[2,-15],[0,-4],[1,-17],[-2,-17]],[[6891,4103],[6,17]],[[6897,4120],[6,15]],[[6903,4135],[8,-5],[58,-27],[10,-5]],[[6903,4135],[6,17]],[[6909,4152],[9,-4],[57,-28],[10,-4]],[[6909,4152],[6,19]],[[6915,4171],[9,-5],[58,-28],[10,-4]],[[6915,4171],[7,18]],[[6922,4189],[66,-33],[10,-4]],[[6922,4189],[6,17]],[[6928,4206],[76,-36]],[[6928,4206],[7,18]],[[6935,4224],[9,-4],[57,-28],[9,-4]],[[6935,4224],[3,10],[4,10]],[[6942,4244],[75,-37]],[[6942,4244],[6,20]],[[6942,4244],[-63,31]],[[6935,4224],[-10,5],[-44,22],[-9,4]],[[6872,4255],[3,9],[4,11]],[[6928,4206],[-9,5],[-44,21],[-9,5]],[[6866,4237],[6,18]],[[6922,4189],[-9,4],[-18,9],[-27,12],[-9,4]],[[6859,4218],[7,19]],[[6909,4152],[-9,4],[-8,4],[-37,18],[-9,4]],[[6846,4182],[7,19],[6,17]],[[6897,4120],[-62,30]],[[6835,4150],[5,15]],[[6840,4165],[6,17]],[[6829,4133],[6,17]],[[6777,4195],[10,-5],[44,-21],[9,-4]],[[6790,4231],[7,18]],[[6797,4249],[9,-5],[44,-21],[9,-5]],[[6797,4249],[6,18]],[[6803,4267],[10,-5],[53,-25]],[[6803,4267],[2,7],[5,11],[6,20]],[[6816,4305],[-5,2],[-56,28]],[[6803,4267],[-8,4],[-45,22],[-9,4]],[[7965,4523],[-12,-19]],[[7953,4504],[-8,6],[-50,38],[-8,6]],[[7887,4554],[4,5],[3,4],[3,3],[5,6],[5,-3],[49,-39],[9,-7]],[[7866,4518],[9,17],[12,19]],[[7953,4504],[-11,-21],[-10,-16]],[[7959,4671],[3,-2],[7,-5],[4,-2],[27,-19],[26,-19],[2,-3],[6,-4]],[[8034,4617],[-32,6],[-33,1],[-21,-2],[-19,-5],[-5,-1],[-28,-10],[-17,-9],[-24,-16]],[[8225,4853],[-38,19],[-10,4]],[[8233,4878],[-7,-21],[-1,-4]],[[8284,4828],[-1,-4]],[[8283,4824],[-58,29]],[[8241,4895],[14,-12],[39,-32]],[[8294,4851],[-6,-11],[-4,-12]],[[8266,4935],[53,-44]],[[8319,4891],[-13,-20],[-12,-20]],[[8329,4803],[-4,5],[-41,20]],[[8319,4891],[15,-13],[4,-3],[14,-8]],[[8352,4867],[-7,-20],[-8,-23]],[[8362,4893],[-10,-26]],[[8279,4956],[18,-16],[35,-29]],[[8332,4911],[4,-4],[7,-4],[19,-10]],[[8304,4996],[18,-15],[17,-15],[-10,-17],[-1,-2],[1,-3],[15,-12],[-12,-21]],[[8313,5019],[79,-42]],[[8392,4977],[-3,-10],[-9,-25],[-18,-49]],[[8425,4960],[-11,5],[-6,4],[-16,8]],[[8328,5058],[9,-5],[69,-36],[8,-5],[1,0],[12,-7]],[[8427,5005],[-1,-22],[-1,-23]],[[8432,5056],[0,-5],[-2,-29]],[[8430,5022],[-1,-10],[-2,-7]],[[8479,4997],[-10,5],[-23,12],[-16,8]],[[8488,5025],[-1,-3],[-3,-11],[-5,-14]],[[7872,4422],[-15,12],[-55,42],[-2,-5]],[[7800,4471],[-16,12],[-8,7]],[[7869,4393],[-10,7],[-69,54],[6,11],[4,6]],[[7856,4371],[-9,7],[-70,54],[-5,-10],[-6,-10]],[[3424,1948],[-33,54],[-3,5]],[[3388,2007],[-3,4]],[[3385,2011],[17,14],[-10,16],[15,14],[1,1],[0,2],[-31,49],[17,14],[18,14],[13,12],[4,-1],[28,-46],[3,0],[16,13]],[[3385,2011],[-9,15],[-8,13],[-30,19],[-6,10],[-12,19]],[[3275,1912],[-24,9]],[[3388,2007],[-56,-48],[-57,-47]],[[3311,1854],[-24,38]],[[3287,1892],[-12,20]],[[3254,1652],[-17,29],[-5,8],[-12,21],[-4,5],[-13,19]],[[3203,1734],[4,4],[48,40],[-35,58],[17,14],[17,14],[17,14],[16,14]],[[8049,3664],[-24,19],[-6,4],[-11,8],[-9,7]],[[7999,3702],[4,9],[4,7],[5,10],[4,8],[4,7]],[[7999,3702],[-18,14],[4,8],[4,8],[-4,2],[-20,15],[4,8]],[[7969,3757],[4,9],[5,8]],[[7978,3774],[26,-18],[14,-11],[2,-2]],[[7999,3702],[-10,-18],[-7,-13]],[[7982,3671],[-11,-19],[-11,-20]],[[7874,3698],[28,51],[10,18]],[[7912,3767],[21,-15],[6,11],[6,11],[24,-17]],[[8032,3633],[-36,27],[-2,2],[-12,9]],[[7912,3767],[7,12],[5,10],[5,9],[5,9]],[[7934,3807],[20,-15],[8,-6],[16,-12]],[[7934,3807],[9,16],[8,15]],[[7951,3838],[28,-22],[8,15]],[[7987,3831],[39,-29],[0,-3],[-3,-6],[-3,-7],[16,-12]],[[7951,3838],[8,14]],[[7959,3852],[10,15],[3,7],[4,8]],[[7976,3882],[28,-21]],[[8004,3861],[-5,-8],[-3,-7],[-4,-6],[-5,-9]],[[8004,3861],[39,-29]],[[8043,3832],[7,-6],[9,-6]],[[7976,3882],[5,9],[4,7],[5,8],[4,8]],[[7994,3914],[66,-50],[-4,-8],[-5,-7],[-4,-8],[-4,-9]],[[7994,3914],[4,7],[6,11]],[[8004,3932],[-46,36]],[[7976,3882],[-46,35]],[[7930,3917],[5,9],[4,7],[8,15]],[[7947,3948],[5,8],[6,12]],[[7959,3852],[-13,10],[-33,25]],[[7913,3887],[9,15],[4,7],[4,8]],[[7913,3887],[-10,7],[8,15],[-37,29]],[[7874,3938],[4,7],[4,8],[5,9],[4,7]],[[7891,3969],[5,8],[4,7],[28,-21],[19,-15]],[[7888,3842],[-10,7],[-28,21],[-9,6]],[[7841,3876],[9,17],[4,8],[4,7],[3,6],[5,9]],[[7866,3923],[8,15]],[[7913,3887],[-8,-15],[-8,-14],[-9,-16]],[[7934,3807],[-46,35]],[[7912,3767],[-10,8],[-36,27]],[[7866,3802],[12,22]],[[7878,3824],[10,18]],[[7866,3802],[-11,-18],[-46,35],[10,18]],[[7819,3837],[6,11],[6,11],[47,-35]],[[7773,3871],[14,-10],[32,-24]],[[7794,3911],[47,-35]],[[7820,3958],[46,-35]],[[6582,3755],[-20,8],[-22,-59],[-21,9],[-21,10],[-21,10]],[[6203,3627],[19,-9],[50,-23],[7,23],[8,23],[8,23],[8,22],[7,21],[8,21],[-49,24],[-19,9]],[[7688,4681],[-5,-10],[-6,-11],[-48,37],[-9,10],[-9,6]],[[7704,4608],[-39,30],[-46,35],[-3,6],[-4,6],[-12,10]],[[7607,4543],[-11,9],[-9,8],[-32,26],[-11,8]],[[7594,4520],[-12,9],[-41,33],[-10,9]],[[8624,5710],[-47,26],[-9,5]],[[8568,5741],[13,31],[8,20],[8,20]],[[8653,5781],[-8,-20],[-8,-20],[-8,-20],[-5,-11]],[[8568,5741],[-2,2],[-9,4],[-53,29]],[[8480,5717],[8,19],[8,20]],[[8568,5741],[-8,-20],[-8,-20],[-7,-17],[-1,-3]],[[7853,5360],[-77,40]],[[7839,5334],[-9,5],[-2,1],[-65,33]],[[7827,5311],[-76,40]],[[7839,5334],[-12,-23]],[[7567,3823],[-35,26]],[[7557,3778],[-8,9],[-8,6],[-28,21]],[[8110,6557],[-3,2],[-3,2]],[[8057,6707],[10,19],[19,35],[2,3],[7,15],[6,11],[3,5],[1,2],[2,-2],[7,-7],[7,-8],[3,-4],[2,-2],[2,-2],[1,-2],[2,-2],[1,-1],[1,-2],[1,-2],[2,-2],[1,-2],[1,-1],[1,-2],[2,-3],[1,-2],[2,-2],[2,-4],[3,-3],[7,-12],[1,-2],[5,-6],[3,-4],[2,-2],[2,-3],[2,-2],[3,-3],[6,-6],[5,-3],[1,-1],[4,-3],[3,-2],[3,-1]],[[7054,6892],[-24,37]],[[7030,6929],[-12,20]],[[7018,6949],[44,38]],[[7062,6987],[13,-22],[11,-17]],[[7062,6987],[14,12]],[[7076,6999],[14,12]],[[7199,6666],[3,2],[2,0],[1,0],[15,-25],[3,-2],[2,2],[8,15],[-35,54],[-18,-16]],[[7176,6808],[23,13],[22,12],[48,27],[-2,3],[-15,23]],[[7367,6912],[5,3],[9,4],[9,6],[7,5],[6,5],[5,6],[7,7],[9,8],[6,6],[5,5],[6,4],[3,1],[6,3],[8,4],[13,5]],[[7049,4170],[8,-4],[55,-28],[2,-1],[7,-3]],[[7055,4189],[76,-37]],[[7225,4241],[86,-23],[13,-4],[1,0],[4,-3],[6,-3],[23,-15],[9,-4],[10,-1],[5,0],[28,0],[13,-2],[8,-2]],[[7283,4299],[17,-13],[34,-27],[9,-6],[9,-7]],[[7352,4246],[34,-25],[22,-17],[7,-4],[20,-15]],[[7375,4286],[-5,-9],[-5,-9],[-6,-10],[-7,-12]],[[7464,4286],[6,13],[7,12],[8,13]],[[7485,4324],[58,-44],[9,-7]],[[7485,4324],[7,14],[6,12]],[[7498,4350],[6,11],[7,11]],[[7643,5148],[-1,-3],[-12,-24],[-10,-18],[-9,-18],[-16,-31]],[[7698,5065],[-9,-19],[-24,12],[-13,-33]],[[7652,5025],[-17,9],[-2,1],[-15,7],[-10,5],[-13,7]],[[7643,5148],[10,-6],[6,-4],[51,-25],[10,-6]],[[7720,5107],[-12,-24],[-10,-18]],[[7646,4967],[-69,53]],[[7652,5025],[20,-10]],[[7672,5015],[-8,-15],[-6,-11]],[[7658,4989],[-6,-11],[-6,-11]],[[7622,4922],[-69,53]],[[7646,4967],[-6,-12],[-6,-11],[-6,-11],[-6,-11]],[[7610,4899],[-59,45],[-10,7]],[[7910,2498],[10,17],[11,17]],[[7931,2532],[10,18],[38,-31]],[[7866,2535],[14,13],[14,13]],[[7894,2561],[37,-29]],[[7821,2526],[8,19],[9,19],[8,19],[8,20],[9,19]],[[7863,2622],[13,-11],[9,-7],[15,-12],[33,30]],[[7933,2622],[12,-16],[-13,-11],[-17,-15],[-5,-6],[-16,-13]],[[7863,2622],[10,18],[11,18],[10,13],[14,14]],[[7908,2685],[15,15],[7,7],[2,2]],[[7956,2645],[-2,-3],[-21,-20]],[[7863,2622],[-43,34]],[[7856,2706],[4,4],[14,16]],[[7874,2726],[7,-8],[6,-7],[13,-16],[8,-10]],[[7874,2726],[14,16],[5,6],[15,17],[1,2],[1,1]],[[7765,2786],[20,35],[5,8]],[[7790,2829],[34,50],[3,4]],[[7911,2957],[-1,-3],[-8,-10],[-6,-8]],[[7790,2829],[-5,4],[-24,16]],[[7761,2849],[3,4],[31,47]],[[7761,2849],[-17,-18],[-13,-21],[-16,-23]],[[7646,4967],[69,-53]],[[7658,4989],[60,-46],[8,-7]],[[7672,5015],[21,-12],[55,-26]],[[7698,5065],[66,-33],[10,-5]],[[7720,5107],[12,24]],[[7732,5131],[10,-5],[2,-1],[53,-26],[3,-2],[8,-4]],[[7732,5131],[11,21]],[[7743,5152],[10,-5],[55,-28],[3,-1],[9,-5]],[[7743,5152],[13,22],[12,23]],[[7768,5197],[11,23]],[[7779,5220],[9,-5],[55,-28],[12,-6]],[[7743,5152],[-11,5],[-19,10],[-16,8],[-19,9],[-3,2],[-9,4]],[[7690,5236],[3,-1],[4,-3],[1,0],[17,-9],[3,-1],[13,-7],[27,-14],[10,-4]],[[7827,5311],[-12,-24],[-12,-23],[-24,-44]],[[7827,5311],[9,-5],[2,-1],[55,-27],[10,-6]],[[7434,2220],[-9,7],[-5,4],[-36,27],[-2,2],[-10,6],[-14,10],[-6,5]],[[7352,2281],[2,1],[21,18],[3,2],[2,2]],[[7380,2304],[1,1],[3,2],[0,1],[2,1],[15,14],[3,3],[3,2],[9,9],[2,1],[1,1]],[[7419,2339],[49,43],[24,22],[16,15]],[[7508,2419],[65,-42],[2,-1],[27,30],[5,5]],[[7607,2411],[-1,-4],[-2,-8],[-10,-39],[-2,-5]],[[7607,2411],[4,5],[16,19]],[[7627,2435],[14,-12],[4,-3],[7,-5],[16,-13],[5,-4],[30,-23],[3,-2]],[[7642,2313],[-55,-51],[-17,-26],[-7,-10],[-3,-2]],[[7647,2310],[-1,-5],[-17,-30],[-7,-14],[11,-8],[6,-5],[4,-3],[16,8],[-1,-11],[-2,-14]],[[7685,2519],[-5,-7],[-5,-7],[17,-17],[11,-12],[-13,-19],[19,-16],[14,10],[4,2],[15,11]],[[7328,1095],[5,23]],[[7436,1089],[-8,-8],[-10,-11],[-6,1],[-84,24]],[[7333,922],[-3,3],[-3,3]],[[7327,928],[-2,3],[-2,1]],[[7323,932],[14,16],[24,27],[21,23],[14,16],[7,10],[-13,3],[-42,12],[-4,2],[-5,2],[-5,1],[-5,0],[-11,3]],[[7318,1047],[5,23],[5,25]],[[7464,1065],[-39,-46],[-2,-2],[-43,-46],[-44,-46],[-3,-3]],[[7323,932],[-4,2],[-5,2],[-6,0],[-9,0],[-8,2],[-25,7],[-13,3]],[[7253,948],[10,12],[11,12],[-1,2],[-1,3],[-32,25],[10,18],[24,-20],[14,15],[30,32]],[[7318,1047],[-23,6],[-23,6],[-11,4],[6,23],[5,25],[5,24]],[[7253,948],[-36,9],[-12,4],[-10,2],[-7,0]],[[7053,764],[61,74],[-10,9],[-30,25]],[[7074,872],[21,21],[18,22]],[[7113,915],[3,4],[14,-19],[12,19],[19,32],[1,2],[1,3],[-1,3],[-8,4]],[[7253,948],[-4,-3],[-9,-10],[-5,-6],[-39,25],[-9,-17],[34,-23],[-2,-8],[50,-32],[13,14],[27,28],[1,1],[0,2],[1,3],[0,3],[1,-2],[0,-2],[0,-3],[-1,-4],[-1,-3],[-2,-3],[17,17],[2,3]],[[7333,922],[-3,-3],[-1,-2],[-101,-104],[-15,-17],[-47,-50],[-1,-1],[-12,-10],[-10,-8]],[[7845,4003],[9,-6],[1,-1],[36,-27]],[[2315,2374],[-2,-8],[0,-3],[15,-39],[1,-3],[2,-1],[3,0],[-20,-64],[-4,-11],[-8,-15],[-4,4],[-4,4],[-3,5],[-1,6],[1,6],[5,11],[-3,1],[-3,1],[-3,0],[-2,-1],[-19,-10],[-1,-2],[10,-27],[0,-3],[-1,-3],[-2,-3],[-3,-6],[-13,7],[-18,51]],[[2386,2333],[-17,-14],[-11,-9],[-4,-4],[-4,-5],[-3,-7],[-18,-56],[-7,-13],[-11,-21],[-12,-21],[-3,-8],[-12,-33]],[[2428,2260],[-37,-47]],[[2464,2222],[39,-63]],[[2503,2159],[-4,-4],[-5,-4],[-15,-15],[-27,-26],[-16,-15],[-3,-2],[-1,0],[-3,-1],[-1,0],[-8,0],[-3,1],[-3,0],[-3,0],[-3,0],[-3,-1],[-3,-2],[-2,-1],[-1,-1],[-2,-1],[-27,-26]],[[2434,2272],[30,-50]],[[6193,991],[0,1],[-6,3],[-7,0],[-7,-2],[-5,-4],[-4,-5],[-7,-4],[-10,-3],[-10,-1],[0,65],[-19,1],[-11,0],[0,45],[-18,0]],[[6089,1087],[1,75],[0,4]],[[6090,1166],[28,9]],[[6510,1298],[0,-1],[1,-4],[1,-1],[1,-3],[1,-4],[0,-2],[1,-3],[0,-3],[1,-13],[-1,-8],[-2,-4],[-3,-11],[-3,-9],[-3,-10],[-4,-14]],[[6500,1208],[-10,-10],[-31,-28],[-28,-21],[-21,-16],[-24,-15],[-25,-13],[-28,-18],[-20,-15],[-33,-25],[-17,-14],[-28,-17],[-15,-9],[-17,-11],[-10,-5]],[[6204,963],[0,9],[-2,7],[-4,7]],[[6198,986],[3,2],[7,2],[4,-2],[3,1]],[[6211,966],[-2,-1],[-5,-2]],[[6203,961],[8,4]],[[6209,957],[-3,-2],[-1,0],[-2,-1],[0,7]],[[6089,1087],[-18,0],[-18,1],[-22,0]],[[6031,1088],[1,55],[-19,-6],[-19,-6]],[[5994,1131],[-1,5],[78,24],[3,1],[16,5]],[[6031,1043],[0,45]],[[6089,1087],[1,-44],[-9,0],[0,-63]],[[6081,980],[-11,3],[-17,1],[-22,0],[0,59]],[[6031,1043],[-19,0],[1,45],[-19,0],[-20,1]],[[5975,1125],[19,6]],[[6081,980],[0,-10]],[[6081,970],[-21,1],[-6,1],[-23,4],[-14,3],[-43,5]],[[5974,986],[0,56],[0,5],[0,31]],[[5977,881],[27,-8],[22,-1],[25,4],[22,9],[7,3]],[[6080,888],[-2,-21]],[[6078,867],[-12,-6],[-21,-2],[-6,0],[-9,-3],[-7,0],[-4,-2],[-4,0],[-7,-6],[-11,-2],[-14,1],[-8,2]],[[5978,929],[3,-2],[77,-24],[22,12]],[[6080,915],[0,-4],[0,-2]],[[6080,909],[-14,-7],[-12,-5],[-12,1],[2,-3],[-1,0],[-11,1],[-21,0],[-12,1],[-12,4],[-5,2],[-4,3]],[[5975,979],[12,-4],[12,-1],[10,2],[7,0],[16,-3],[31,-7],[17,0]],[[6080,966],[0,-3],[0,-3]],[[6080,960],[-4,0],[-13,-3],[-17,-2],[-12,0],[-18,3],[-5,2],[-27,6],[-7,1],[-1,1]],[[6211,867],[-12,8],[-10,11],[-28,6],[-6,2],[-16,0],[-12,-4],[-11,-4],[-6,-4],[-1,-1],[-22,-11],[-9,-3]],[[6080,888],[5,2],[18,11],[27,16],[6,3],[6,4],[5,7],[-1,3],[3,1],[30,16],[19,6],[5,4]],[[6193,991],[-10,-5],[-26,-10],[-20,-5],[-18,0],[-22,-1],[-16,0]],[[6204,963],[-7,-1],[-8,3],[-15,-11],[-26,-15],[-3,-1],[0,1],[-10,1],[-55,-31]],[[6080,915],[59,32],[0,1],[7,4],[0,3],[16,9],[10,4],[15,10],[4,3],[3,4],[4,1]],[[6096,939],[-2,0],[-2,0],[0,3],[0,10],[6,5],[4,1],[2,3],[2,3],[4,2],[7,0],[2,1],[8,0],[5,0],[2,-8],[-3,-3],[-35,-17]],[[6080,966],[23,0],[-2,-4],[-4,0],[-17,-2]],[[4784,1039],[0,-13],[-2,-7],[-2,-9],[-8,-13],[-11,-10],[-7,-9],[-3,-17],[-3,-3],[-5,-3],[-11,-10],[-4,-2],[-8,0],[-5,-1],[-14,6],[-20,5],[-17,8],[-18,2],[-20,5],[-20,15],[-9,15],[1,8],[3,6],[4,8],[12,10],[9,13],[8,7],[4,1],[6,0],[14,-4],[15,-3],[29,3],[14,4],[17,1],[12,-4],[6,-3],[8,-3],[20,0],[5,-3]],[[8225,4853],[-8,-19]],[[8217,4834],[-17,8],[-9,-24],[-7,-19],[-14,6],[-5,-15]],[[8165,4790],[-10,5],[-26,13]],[[8129,4808],[14,37],[7,19]],[[8150,4864],[8,21]],[[8217,4834],[-16,-43],[66,-33]],[[8267,4758],[-13,-34],[-17,9],[-8,4],[-15,7],[-9,5],[-16,8],[-31,15]],[[8158,4772],[7,18]],[[8283,4824],[-7,-19],[-1,-6],[0,-17],[-8,-24]],[[8305,4738],[-22,12],[-16,8]],[[8292,4576],[-60,12],[-19,2],[-61,10],[-36,6],[-32,4],[-31,5]],[[8053,4615],[4,6],[6,11],[5,10],[6,16],[11,28],[12,33]],[[8097,4719],[1,-1],[5,-2],[4,7],[4,7],[4,9],[5,8],[4,7],[14,-7],[9,-5],[5,12],[6,18]],[[9689,9681],[2,4],[1,4],[0,3],[3,4],[5,5],[6,6],[7,7],[5,7],[1,7],[1,9],[-2,2],[-8,2],[-6,1],[-18,33]],[[9766,9812],[7,-15],[1,-6],[2,-6],[0,-3],[0,-11],[-1,-10],[-26,7],[-2,-3],[-5,-33],[-2,-9],[0,-6],[-1,-4],[-3,-6],[-6,-9],[-12,-15],[-4,-4],[-1,-2],[-2,-1],[-22,5]],[[8010,5802],[-12,-30],[-9,4],[-12,6],[-21,-39],[-15,7]],[[8504,5582],[-1,-3],[-3,-5],[-11,-28],[-12,-29],[-8,-21]],[[8703,5618],[-9,-21],[-3,-11],[-29,-91],[66,-36]],[[8728,5459],[-1,-3],[-19,-59],[0,-5],[-4,-12]],[[8544,5681],[6,-3],[1,-2],[49,-27],[4,11],[4,10]],[[8608,5670],[40,-22],[31,-17],[9,-5],[15,-8]],[[8624,5710],[-4,-10],[-4,-10],[-4,-10],[-4,-10]],[[8711,5638],[-8,-20]],[[8624,5710],[41,-22]],[[8665,5688],[31,-17],[9,-5],[14,-8]],[[8719,5658],[-8,-20]],[[8693,5758],[-8,-19],[-8,-20],[-8,-20],[-4,-11]],[[8732,5690],[-13,-32]],[[8748,5728],[-8,-19],[-8,-19]],[[8797,5653],[-9,5],[-1,1],[-21,12],[-8,4],[-17,9],[-9,6]],[[8748,5728],[9,-5],[47,-26],[9,-5]],[[8776,5602],[-40,21],[-16,10],[-9,5]],[[8797,5653],[-9,-21],[-4,-10],[-4,-10],[-4,-10]],[[8838,5592],[-13,7],[-5,-10],[-4,-10],[-40,23]],[[8845,5503],[-1,-3],[-33,-104],[-4,-12],[-4,-14],[-5,-16],[-7,-25],[-1,-3]],[[8790,5326],[-1,1],[-25,18],[-22,14],[-7,4],[-31,17]],[[8728,5459],[32,102],[4,11],[4,10],[4,10],[4,10]],[[9010,5560],[-8,-20],[8,-5],[52,-29],[10,-5],[1,-4]],[[8892,5625],[-4,-10],[-3,-10],[-4,-9],[-3,-10],[62,-35],[5,10],[3,9],[-3,1],[8,20]],[[4560,3691],[-5,-8],[-8,-8],[-11,-8],[-15,-10],[-9,-9],[-21,-19],[-8,-9],[-6,-7],[-9,-10],[-7,-8],[-10,-9],[-28,-19],[-45,-22],[-22,-16]],[[4292,3588],[10,4],[8,3],[7,3],[10,7],[6,6],[3,5],[4,8],[1,10],[3,1],[8,6],[3,4],[23,17],[6,3],[4,0],[15,-1],[14,-3],[7,-2],[0,-23],[-2,-5],[0,-1],[11,5],[8,5],[7,6],[5,3],[1,0],[3,0],[9,-4],[-1,14],[5,6],[5,0],[7,2],[7,10],[4,4],[13,14],[3,15],[2,22],[0,15],[7,20],[8,14],[8,11],[15,24],[4,5],[3,2],[11,-2],[2,2],[2,5],[9,2],[3,0],[1,-12],[2,-4],[6,4],[15,22],[18,28],[3,-3],[5,3],[8,10],[24,36],[7,20],[1,20],[6,9],[3,15],[6,15],[0,8],[2,14],[12,5],[13,6],[1,3]],[[4716,4029],[1,-5],[36,-36]],[[4404,3716],[-6,-1],[-4,5],[-5,9],[-1,9],[-4,20],[0,17],[4,7],[14,12],[6,9],[7,8],[29,19],[14,6],[8,5],[8,0],[6,-2],[5,-5],[0,-8],[0,-10],[-8,-26],[-1,-13],[-5,-29],[-4,-9],[-4,-6],[-6,-5],[-7,-10],[-5,-4],[-17,-1],[-24,3]],[[4412,3456],[-56,73]],[[9689,9681],[-1,-9],[-4,-19]],[[9684,9653],[-52,14],[-17,4],[-6,3],[-9,5]],[[9675,9602],[9,51]],[[7266,4453],[-9,-11],[-11,8],[-24,18],[-10,7]],[[8176,3051],[-3,4],[-10,8],[-2,1],[-2,2],[-3,1],[-1,1],[-4,3],[-12,10]],[[8142,5032],[-8,-21]],[[8134,5011],[-33,17],[-9,4]],[[8092,5032],[6,23],[8,22]],[[8092,5032],[-10,5],[-2,1],[-17,9],[-22,10],[-9,5]],[[8058,5129],[9,-5],[14,-7],[23,-12],[9,-5]],[[8079,4993],[-10,5],[-42,21],[-10,4]],[[8092,5032],[-7,-20],[-6,-19]],[[8066,4954],[-7,-19]],[[8079,4993],[-7,-20],[-6,-19]],[[8113,4932],[-9,4],[-28,14],[-10,4]],[[8134,5011],[-14,-39],[-7,-19],[0,-21]],[[8113,4882],[-14,6],[-39,20],[-9,4]],[[8113,4932],[0,-24],[0,-26]],[[8150,4864],[-2,1],[-28,13],[-7,4]],[[8129,4808],[-2,1],[-21,11],[-9,4]],[[8097,4824],[1,6],[1,4],[2,9],[4,10],[3,9],[-55,27],[-9,5]],[[8097,4824],[-9,5],[-48,23],[-9,5]],[[8090,4806],[-9,4],[-48,24],[-9,5]],[[8097,4824],[-7,-18]],[[8457,4942],[-32,18]],[[8479,4997],[-7,-16]],[[8472,4981],[-3,-9],[-4,-10],[-4,-10],[-4,-10]],[[8542,4944],[-10,5],[-60,32]],[[8488,5025],[10,-5],[59,-32]],[[8530,4904],[-49,26],[-24,12]],[[8503,4823],[-12,6],[-48,24],[-11,5],[-13,7]],[[8419,4865],[2,30],[1,26],[1,14],[2,25]],[[8493,4797],[-11,5],[-41,21],[-24,11]],[[8417,4834],[1,11],[0,6],[1,14]],[[8408,4789],[3,11],[2,6],[2,7],[1,4],[1,17]],[[3203,1734],[-34,59],[-4,7],[-12,21],[-26,43]],[[3167,1567],[-16,63]],[[3151,1630],[-33,129]],[[3151,1630],[-4,-1],[-9,5],[0,-3],[0,-2],[-2,-1],[-20,-8]],[[3116,1620],[-4,2],[-5,1],[-3,-2],[-9,-7]],[[3163,1566],[-8,-2],[-20,-18]],[[3135,1546],[-19,74]],[[3008,1441],[-17,-14]],[[2991,1427],[-7,28],[-7,26],[-24,-19],[-2,-2],[-2,0],[-2,1],[-8,14],[-2,3],[0,2],[2,3],[49,39]],[[3135,1546],[-19,-15],[-17,-15],[-18,-15],[-18,-14],[-17,-14],[-19,-17],[-19,-15]],[[3082,1349],[-18,-8],[-20,-9],[-16,68],[-6,12],[-4,7],[-6,9],[-4,13]],[[3193,1447],[-14,-5],[-30,-11],[-6,-4],[-4,12],[-16,-5],[-2,-2],[-1,-2],[9,-34],[-22,-10],[-10,-5],[-1,-2],[5,-22],[-19,-8]],[[3090,1320],[-3,6]],[[3087,1326],[-5,23]],[[3087,1326],[-55,-26],[-30,-12],[-9,34],[-23,-7],[-20,86],[-2,6],[4,7],[11,-7],[8,2],[20,18]],[[2757,1440],[60,-6]],[[2817,1434],[65,2],[-63,131],[30,23],[-12,21]],[[2817,1434],[-4,19]],[[2813,1453],[-6,23],[-5,16],[-1,8],[-1,9],[-2,15],[-1,9]],[[2797,1533],[-3,9],[-6,12],[-7,10],[13,11],[6,5],[7,5],[11,10],[3,3]],[[2821,1598],[3,2],[10,8],[3,3]],[[2813,1453],[-13,-4],[-35,0],[-21,0],[-37,0]],[[2707,1449],[-5,24],[-6,34],[-2,8],[-9,22],[-10,23]],[[2675,1560],[6,2],[9,3],[10,7],[25,21],[5,-7],[9,-11],[-33,-28],[-1,-2],[0,-2],[10,-19],[22,19],[1,1],[1,-1],[7,-6],[7,-10],[6,5],[7,1],[8,0],[23,0]],[[2675,1560],[-12,29]],[[2663,1589],[19,7],[14,6],[9,5],[11,9],[14,10],[12,-19],[19,17],[16,12],[11,10],[1,1],[1,0],[2,0],[1,-1],[0,-1],[28,-47]],[[2707,1449],[-20,0],[-1,1],[-1,1],[-6,32],[-1,2],[-2,0],[-18,1],[-1,-1],[-6,-9],[9,-9],[1,-3],[2,-10],[1,-4],[-1,-1],[-1,0],[-13,0],[-4,1],[-12,10],[-13,11],[-1,1],[-2,0],[-20,1],[-2,0],[-1,1],[0,1],[-1,2],[0,2],[1,17]],[[2594,1496],[0,22],[0,24],[0,17],[1,25],[21,0],[22,1],[11,1],[14,3]],[[2594,1496],[-74,0],[-20,1],[-1,26],[-17,0],[-1,0],[-1,1],[-1,3],[2,20],[-1,20],[1,3],[2,0],[15,0],[2,-2],[0,-2],[0,-23],[17,0],[3,0],[1,42],[-59,0],[-25,0],[-8,-1],[-4,-3],[-14,-10]],[[8245,3572],[-7,-14],[-13,-24],[-27,-52],[-6,-12],[-9,-17]],[[8083,4787],[-9,5],[-48,24],[-9,4]],[[8090,4806],[-7,-19]],[[8077,4769],[-10,4],[-48,24],[-9,5]],[[8083,4787],[-6,-18]],[[8102,4734],[-2,1],[-21,11],[-9,4],[-9,5],[-48,24],[-10,4]],[[8077,4769],[9,-5],[20,-10],[3,-2]],[[8109,4752],[-3,-9],[-4,-9]],[[8129,4808],[-3,-9],[-3,-10],[-4,-9],[-3,-9],[-7,-19]],[[8097,4719],[3,7],[2,8]],[[8053,4615],[-4,-7]],[[8049,4608],[-2,2],[-4,1],[-9,6]],[[7991,4747],[11,-11],[53,-27],[9,25],[-9,5],[-48,23],[-10,3]],[[8010,4543],[-12,-19]],[[7998,4524],[-2,2],[-8,6],[-5,4],[-8,6],[-10,-19]],[[7975,4486],[12,20],[11,18]],[[2944,3456],[-7,-2]],[[2937,3454],[-10,24],[-2,4],[-14,29]],[[2911,3511],[11,6],[4,1],[7,2],[7,1],[8,5],[10,6],[-6,12],[-3,6],[-8,19],[9,6],[4,3],[4,5],[5,8],[3,10],[1,7],[-1,10],[-2,7],[-13,29]],[[2951,3654],[32,-6],[34,-6],[18,-3],[3,1],[3,0]],[[2791,3388],[-15,24]],[[2776,3412],[20,11],[1,3],[-5,10],[-3,6],[-1,6],[0,6],[1,7],[1,5],[4,17],[0,9],[0,6],[-1,6],[-1,4],[-7,18],[-2,4]],[[2783,3530],[31,15],[8,5],[13,6],[11,4],[11,2],[10,1],[7,0]],[[2874,3563],[21,-5],[-1,-9],[0,-3],[8,-16],[9,-19]],[[2937,3454],[-15,-5],[-42,-10],[-31,-8],[-10,-3],[-21,-15],[-7,-6],[-20,-19]],[[2832,3313],[-14,29],[-11,22],[-16,24]],[[2978,3381],[-31,-14]],[[2947,3367],[-39,-18],[-47,-22],[-29,-14]],[[3146,3440],[-3,-3],[-5,9],[-31,-26],[-30,-22]],[[3077,3398],[-38,-27],[-27,-25],[-8,-5]],[[3004,3341],[-3,13],[-41,-17],[-12,27],[-1,3]],[[3114,3269],[-25,-12],[-11,-6],[-11,-10],[-10,-9],[-14,-18]],[[2977,3296],[-4,11],[-2,5]],[[2971,3312],[17,13],[16,16]],[[3077,3398],[6,-5],[8,-6],[-5,-10],[-3,-9],[-3,-15],[-5,-23],[8,-3],[7,-4],[5,-6],[6,-7],[4,-10],[2,-8],[7,-23]],[[3212,3327],[-3,-3],[-18,-13],[-12,-7],[-14,-11],[-13,-7],[-16,-7]],[[3136,3279],[-22,-10]],[[7576,2516],[0,11],[1,15],[-1,3],[0,4],[-2,3],[-1,3],[-3,2],[-9,8]],[[7561,2565],[-64,47]],[[7516,2500],[15,23],[14,19],[16,23]],[[7576,2516],[-3,-6],[-10,-13],[-15,-20],[-2,1],[-10,8],[-20,14]],[[7508,2419],[-10,11],[-4,1],[-2,2],[-11,8],[-3,4]],[[7478,2445],[22,32],[13,18],[3,5]],[[7478,2445],[-16,11],[-15,11],[-16,12],[-7,6],[-11,-12],[-10,3]],[[7453,2548],[33,-25],[30,-23]],[[7478,2445],[-12,-17],[-8,-12],[-61,45],[-2,3]],[[7419,2339],[-2,1],[-4,2],[-5,4],[-6,5],[-56,42]],[[7380,2304],[-5,4],[-16,12],[-8,6],[-13,9],[-22,17],[-1,1],[-4,3],[-1,1]],[[8352,4867],[10,-5],[41,-20],[3,-2],[11,-6]],[[8499,5050],[12,-7],[3,-1],[4,12],[33,-17],[4,11],[11,-6],[9,-5],[3,-1]],[[8518,5096],[11,-6],[46,-24],[9,-5],[3,-2]],[[8618,5139],[-31,-80]],[[8549,5176],[67,-36],[2,-1]],[[8569,5225],[10,-5],[48,-26],[8,-5],[3,-1]],[[8638,5188],[-10,-25],[-10,-24]],[[8587,5273],[10,-6],[48,-26],[8,-5],[3,-1]],[[8656,5235],[-9,-24],[-9,-23]],[[8674,5282],[-9,-24],[-9,-23]],[[8738,5162],[-24,13],[-9,-24],[-10,6],[-2,1],[-46,25],[-9,5]],[[8757,5065],[-41,22],[-1,0]],[[8715,5087],[8,25],[8,25]],[[8688,5005],[18,50],[9,32]],[[3733,2721],[-98,-76],[-2,-2],[-1,-1]],[[3581,2834],[10,10],[43,30],[17,11],[14,10],[-11,79]],[[3654,2974],[12,-19],[3,-15],[19,6],[-6,23],[-11,19],[17,13],[21,17]],[[3709,3018],[6,-10],[4,-26],[6,-25],[19,7],[9,-42],[3,-20],[1,-16]],[[4001,2937],[-43,-35],[-67,-54]],[[3820,2949],[18,0],[1,10],[4,10],[5,6],[27,21],[10,-17],[12,-19],[19,15],[42,34]],[[3958,3009],[32,-54],[11,-18]],[[3709,3018],[14,10],[13,2]],[[3736,3030],[21,2]],[[3757,3032],[5,1],[6,2],[8,5],[32,24],[10,-17],[10,-17],[9,-17],[3,-1],[21,17],[15,15],[14,18],[12,18]],[[3902,3080],[21,-19],[13,-15],[22,-37]],[[3757,3032],[-3,21],[77,61],[12,-16],[15,17]],[[3858,3115],[13,-13],[13,-10],[18,-12]],[[3736,3030],[-1,8],[-12,21],[-3,11],[-4,31]],[[3716,3101],[19,6],[11,6],[70,55]],[[3816,3168],[13,-12],[8,-11],[2,-4],[11,-16],[8,-10]],[[3711,3146],[6,2],[5,2],[6,4],[3,3]],[[3731,3157],[42,32],[18,13]],[[3791,3202],[7,-13],[8,-11],[10,-10]],[[3749,3291],[2,-2],[2,-4],[5,-51],[0,-3],[-2,-2],[-24,-19],[-1,-42],[0,-11]],[[3774,3298],[3,-35]],[[3777,3263],[3,-22],[3,-18],[8,-21]],[[3855,3198],[-39,-30]],[[3777,3263],[14,2],[64,-67]],[[3915,3234],[-44,-23],[-16,-13]],[[3826,3326],[-2,-2],[-16,-11],[-3,-2],[-5,0],[-1,-15],[17,-20],[50,-55],[35,24],[1,1],[0,-1],[7,-8],[6,-3]],[[7262,826],[76,80],[2,2],[2,2],[3,3],[3,4],[5,6]],[[7113,915],[-45,0],[5,21],[54,0],[9,14],[6,10],[2,4]],[[7074,872],[-36,-38]],[[7028,842],[27,93],[-19,1],[7,24],[1,5]],[[6616,5393],[12,28],[8,17],[17,33],[9,19]],[[6572,5425],[9,27],[2,4],[5,12],[9,18],[9,18]],[[6606,5504],[10,18]],[[6572,5425],[-4,3],[-35,24],[-16,11],[-3,2]],[[6514,5465],[7,23],[4,10],[5,10]],[[6530,5508],[9,18],[9,18]],[[6548,5544],[58,-40]],[[6548,5544],[10,19]],[[6558,5563],[9,17],[12,26],[2,3],[9,17]],[[6530,5508],[-58,40]],[[6472,5548],[9,18],[9,19],[9,18]],[[6499,5603],[59,-40]],[[6499,5603],[6,12],[3,6]],[[6508,5621],[2,4],[11,21],[2,3],[8,18]],[[6455,5505],[-46,32]],[[6409,5537],[10,22],[5,11],[4,8],[6,12],[12,25]],[[6446,5615],[12,23],[6,13]],[[6464,5651],[44,-30]],[[6472,5548],[-6,-9],[-3,-10],[-8,-24]],[[2503,2159],[29,-49]],[[2503,2159],[10,10],[0,3],[10,-18],[16,13],[65,56],[-12,19],[15,13]],[[2607,2255],[16,14],[17,14],[16,14],[18,-29],[11,-18],[62,54]],[[2747,2304],[51,44],[4,-4],[5,5],[15,13],[3,3]],[[2825,2365],[3,-4]],[[2464,2222],[11,13],[30,25],[10,-18],[6,5],[8,8],[10,14],[21,41]],[[2560,2310],[8,-5],[9,-7],[7,-8]],[[2584,2290],[12,-17],[11,-18]],[[2389,2380],[2,-3],[2,-4],[2,-3],[11,-18],[22,-37],[52,43],[16,14]],[[2496,2372],[17,-28],[5,-6],[8,-6],[17,-11],[17,-11]],[[2536,2504],[3,-5],[3,-6]],[[2542,2493],[-31,-26]],[[2511,2467],[-48,-40],[6,-11],[27,-44]],[[2511,2467],[10,-19],[11,-18],[11,-18],[-15,-13],[18,-30],[1,-2],[-10,-14],[-2,0],[-3,1],[-4,5],[-16,26],[-16,-13]],[[2542,2493],[12,9],[7,4],[9,-22],[17,-28],[5,-6],[20,-14],[4,-3],[4,-4],[6,-4],[7,-12],[13,-21],[6,-5],[4,-2]],[[2656,2385],[-6,-12],[-2,-8]],[[2648,2365],[-4,-19],[-2,-6],[-3,-3],[-55,-47]],[[2734,2450],[-13,-7],[-4,-3],[-33,-28],[-19,-15],[-6,-7],[-3,-5]],[[2760,2473],[-3,-3],[-23,-20]],[[2714,2357],[-32,-28],[-20,7],[3,13],[1,6],[1,5],[-19,5]],[[2734,2450],[19,-32],[12,-18],[-36,-30],[-15,-13]],[[2747,2304],[-11,18],[-11,17],[-11,18]],[[2760,2473],[65,-108]],[[2779,2488],[43,-69],[3,-4],[4,0],[18,15],[3,5],[8,20],[14,13],[-8,14],[21,17],[18,16]],[[2883,2571],[3,-6],[9,-15],[2,-12],[2,-12],[4,-11]],[[2923,2611],[16,21]],[[2852,2767],[8,-13],[7,-4],[27,-18],[-3,-7],[-9,-14],[-15,-16]],[[2920,2824],[11,-19],[-46,-40],[18,-12],[22,18],[3,-1],[13,-18],[8,-8],[8,-6],[18,-8],[20,-9]],[[8244,3448],[38,-30],[6,11],[-2,10],[8,14],[10,21],[-1,2],[-6,4],[-25,19],[-28,-51]],[[7803,1101],[-31,8]],[[7772,1109],[2,12],[4,23],[5,22],[3,23]],[[7786,1189],[73,-20],[14,20],[13,20],[9,12]],[[7934,1216],[-32,-44],[-37,-53],[-20,-28]],[[7845,1091],[-42,10]],[[7786,1189],[5,22],[4,23],[2,10]],[[7772,1109],[-64,17]],[[7708,1126],[2,12],[5,23],[4,22],[4,23],[4,22],[-38,10],[4,23],[-58,15],[-9,4]],[[7701,1092],[4,23],[3,11]],[[7803,1101],[-7,-10],[-10,-21],[-9,-17],[-6,-14],[-5,-7],[-42,11],[-31,8],[4,21],[4,20]],[[7566,1164],[142,-38]],[[7701,1092],[-71,19]],[[7554,1166],[3,8],[28,59],[15,39],[1,1],[4,7]],[[7590,1280],[-53,-106],[0,-2]],[[7716,979],[17,18],[16,18],[-99,26]],[[7845,1091],[-8,-11],[-20,-25],[-26,-29],[-16,-10],[-15,-19],[-10,-8],[-8,-6],[-5,-12]],[[8099,2087],[-4,-70]],[[8056,2451],[35,35],[43,45]],[[8031,2526],[9,13],[2,6],[1,8],[2,8],[7,8],[7,10],[7,12],[2,2]],[[8101,2562],[16,-15],[17,-16]],[[5497,3222],[4,6],[31,42]],[[5532,3270],[7,-9],[4,-5],[4,-11],[14,7],[2,3],[14,18],[2,0],[3,-1],[14,-14],[15,-15]],[[5529,3272],[3,-2]],[[5488,3325],[29,35],[13,-14],[-18,-25],[13,-15]],[[5525,3306],[-12,-18]],[[5569,3320],[-37,-50]],[[5525,3306],[26,32]],[[5551,3338],[16,-16]],[[5567,3322],[2,-2]],[[5490,3360],[23,30],[3,0],[39,-41],[1,-3],[-5,-8]],[[5476,3373],[33,45]],[[5509,3418],[61,-67],[-3,-29]],[[5489,3439],[20,-21]],[[5532,3446],[-23,-28]],[[5550,3518],[20,-22],[-38,-50]],[[5584,3482],[-38,-50]],[[5546,3432],[-14,14]],[[5614,3520],[-2,-3],[-17,-21],[-11,-14]],[[5584,3482],[14,-15],[-24,-33],[14,-14],[25,32],[14,-16]],[[5627,3436],[-15,-19],[-24,-30],[-42,45]],[[5627,3436],[28,37],[2,2]],[[5675,3458],[-3,-4],[-43,-56],[-38,-49]],[[5663,3327],[-22,-31]],[[5710,3422],[-3,-4],[-7,-9],[-23,-28],[-13,-18],[-3,-4],[-12,-17],[14,-15]],[[5748,3274],[-2,2],[-16,16],[-36,36],[-6,3],[-8,2],[-8,-3],[-9,-3]],[[7316,2249],[-2,5],[-53,39],[-3,2],[-11,9]],[[7352,2281],[-2,-2],[-15,-13],[-2,-2],[-17,-15]],[[7415,2207],[-10,7],[-35,27],[-2,1],[-9,7],[-8,-9],[-20,-25],[-14,-17]],[[7317,2198],[-14,-17],[-14,-17]],[[7289,2164],[-35,27],[-3,2]],[[7251,2193],[8,7],[8,7],[17,14],[17,15],[15,13]],[[7369,2159],[-8,6],[-11,8],[-23,17],[-10,8]],[[7307,2125],[-7,5],[-5,3],[-20,15]],[[7275,2148],[7,8],[7,8]],[[7154,2101],[18,15],[18,16],[32,-24],[4,-2],[9,-7],[13,18],[5,7],[8,9],[7,7],[7,8]],[[7246,2196],[17,15],[16,14],[-66,50]],[[4915,4124],[-9,-12],[-14,-10],[-17,-7],[-23,-10],[-18,-11],[-17,17],[-13,13],[-17,-21],[-15,-17]],[[4716,4029],[2,3],[2,7],[3,14],[1,14],[3,13],[4,8],[5,6],[7,8],[8,6],[7,0],[2,-1],[11,-11],[6,-1],[16,17],[26,27],[6,6],[6,15],[9,20],[9,16],[5,9],[16,19],[5,5],[13,-6],[8,0],[8,3],[8,7],[18,11],[7,5],[13,10],[9,10],[0,2],[-3,2],[-2,2],[-2,3],[-1,3],[4,7],[3,7],[5,1],[8,15],[4,1],[6,1]],[[4981,4313],[12,-15],[3,-4],[4,-3],[5,-4],[6,-3]],[[5011,4284],[2,-2],[13,-12],[2,-3],[13,-14],[11,-13],[4,-6],[3,-5]],[[5059,4229],[-10,-9],[-7,-8]],[[5042,4212],[-18,-9],[-13,-7],[-23,-12],[-29,-16],[-12,-6],[-2,-1],[-2,-1],[-4,-3],[-9,-10],[-15,-23]],[[5110,4308],[-9,-9],[-13,-19],[14,-14]],[[5102,4266],[-19,-30],[-12,13],[-12,-20]],[[5011,4284],[2,10],[-4,1],[5,28],[1,2],[2,2],[4,0],[4,-3],[4,-4],[4,-3],[14,-3],[2,1],[1,1],[8,11],[17,-17],[15,20],[20,-22]],[[5120,4314],[-10,-6]],[[4981,4313],[5,1],[5,1],[3,8],[1,10],[1,6],[3,17],[2,4],[6,6],[15,18],[13,17],[11,13]],[[5046,4414],[2,-4],[8,-9]],[[5056,4401],[50,-52],[28,-30],[-14,-5]],[[5120,4314],[25,-26]],[[5168,4263],[-15,-19],[-13,-18],[-38,40]],[[5056,4401],[16,20],[49,-52],[14,19],[-5,6],[12,18],[14,19],[48,-49],[5,6],[3,5],[3,5],[2,-2]],[[5046,4414],[17,20],[1,0],[34,25],[12,5],[10,6],[16,2],[8,1],[2,1],[5,2],[17,2],[13,0],[14,0],[1,-3],[-2,-8],[0,-7],[5,-17],[1,-5],[0,-3],[-3,-3],[-7,-6],[-3,-7],[-1,-2],[1,-8],[8,-4],[7,-1],[4,-1],[-3,10],[0,10],[0,9],[3,13],[0,10],[1,10],[1,5],[3,3],[2,4],[3,2],[0,2],[5,4],[6,0],[6,2],[6,4],[8,2],[5,4],[3,8],[8,6],[9,3],[5,3],[3,5],[6,6],[19,24],[3,4]],[[5308,4556],[8,-8],[7,-8],[3,-3]],[[5326,4537],[-3,-4],[-8,-13],[-16,-17],[-17,-17],[-14,-15]],[[5268,4471],[-15,-17],[-14,-15],[-5,-6],[-3,-5],[-2,-4],[-1,-2]],[[5177,4187],[-20,21],[-2,2],[-16,-21]],[[5139,4189],[-41,36],[-16,-22]],[[5082,4203],[-5,6],[-4,4],[-4,4],[-3,4],[-7,8]],[[6601,1293],[-5,-3],[-3,-2],[-7,-5],[-29,-23],[-33,-30],[0,-5],[-2,-1],[-2,-2],[-2,-1],[-2,-2],[-4,-3],[-8,-5],[-4,-3]],[[6461,1364],[7,14],[6,14]],[[6521,1212],[1,2]],[[5409,4205],[-44,-59],[-1,-2],[-12,-16]],[[5352,4128],[-40,41],[-3,0],[-3,-1],[-22,-28]],[[5304,4210],[11,-11],[8,-9],[44,59]],[[5367,4249],[42,-44]],[[5348,4270],[11,-12],[8,-9]],[[5359,4285],[12,16]],[[5371,4301],[62,-64]],[[5433,4237],[-13,-17],[-11,-15]],[[5371,4301],[14,17],[13,18],[13,16]],[[5411,4352],[13,18]],[[5424,4370],[62,-64]],[[5486,4306],[-14,-18]],[[5472,4288],[-12,-16],[-13,-18],[-14,-17]],[[5297,4350],[12,16],[13,18],[13,16],[9,3],[16,2],[32,-33],[19,-20]],[[5447,4399],[-10,-12],[-13,-17]],[[5268,4471],[40,-41],[12,16],[15,19],[32,-34],[16,19],[6,9],[7,8],[22,-6],[28,-28],[-14,-19],[15,-15]],[[5488,4445],[-4,-4],[-2,-2],[-13,-16],[-17,-19],[-5,-5]],[[5326,4537],[2,-2],[1,-1],[9,-9],[3,-3],[4,-3],[3,-2],[2,-2],[3,-2],[3,-2],[5,-4],[7,-4],[2,-1],[2,-1],[6,-3],[7,-3],[9,-3],[5,-2],[4,-2],[5,-1],[4,-1],[3,-1],[3,-1],[4,-1],[4,-2],[3,-1],[3,-1],[3,-1],[3,-1],[3,-1],[3,-2],[4,-1],[3,-2],[2,-2],[3,-1],[4,-2],[3,-2],[3,-2],[3,-2],[3,-2],[2,-1],[2,-2],[3,-3],[4,-3],[2,-2],[3,-2]],[[5482,4531],[22,-22],[19,-20],[1,-2]],[[5524,4487],[-19,-22],[-8,-10],[-9,-10]],[[5326,4537],[15,23]],[[5341,4560],[20,-21],[13,-12],[6,-6],[27,30],[14,13],[22,-21],[9,18],[15,-15],[15,-15]],[[5432,4607],[60,-62]],[[5492,4545],[-10,-14]],[[5341,4560],[12,18],[17,26],[23,19],[29,-29],[10,13]],[[5432,4607],[3,4],[4,5],[4,5],[9,12],[3,0],[3,0],[4,2],[1,2],[1,2],[56,-54]],[[5520,4585],[-2,-4],[-15,-21],[-11,-15]],[[5463,4686],[11,-10],[26,-15],[51,-30]],[[5551,4631],[-1,-3],[-11,-15],[-19,-28]],[[5308,4556],[1,2],[12,19],[9,15],[9,12],[3,11],[9,15],[14,15],[3,-3],[2,2],[-3,3],[2,3],[2,5],[2,7],[3,9],[4,16],[2,3],[4,5],[5,2],[5,0],[7,1],[7,9],[2,1],[14,0],[6,1],[3,2]],[[5620,4619],[-10,-22]],[[5610,4597],[-26,15],[-33,19]],[[5571,4675],[-10,-22],[59,-34]],[[5659,4720],[-8,-23],[0,-3],[-8,-21],[-2,-3],[-3,-7]],[[5638,4663],[-8,-21]],[[5630,4642],[-10,-23]],[[5627,4760],[-9,-23],[18,-10],[-8,-20],[12,-10],[4,-2],[2,3],[6,17],[3,4],[4,1]],[[5742,4702],[-9,-25],[-51,27],[-7,-18],[-4,-3],[-4,-1],[-10,6],[-2,3],[0,3],[6,17],[1,5],[-3,4]],[[5667,4740],[75,-38]],[[3044,2793],[-25,-21],[-8,-9],[-6,-12],[-3,-7]],[[2920,2824],[16,13]],[[7282,7043],[16,13],[31,26],[19,17],[14,7],[8,7],[11,10],[14,13]],[[7271,7060],[-32,51],[-11,16]],[[7228,7127],[26,22],[20,18],[30,26],[7,7],[6,5],[8,6],[15,13]],[[7212,7062],[-23,35]],[[7189,7097],[13,11]],[[7202,7108],[14,11],[2,0],[8,6],[2,2]],[[7202,7108],[-14,22]],[[7188,7130],[23,19],[2,2]],[[7213,7151],[15,13],[-44,70]],[[7213,7151],[-33,51]],[[7180,7202],[-11,19]],[[7188,7130],[-32,52]],[[7156,7182],[22,18],[2,2]],[[7189,7097],[-2,-3]],[[7187,7094],[-47,74]],[[7140,7168],[16,14]],[[9437,6162],[2,-8],[3,-1],[-21,-80],[-3,2],[-3,0],[-1,-4],[-2,-7],[-1,-4]],[[9221,5808],[-2,1],[-8,5],[-26,14],[-52,28],[-9,6],[-41,22],[-17,9],[8,21],[47,-26],[11,-6],[8,21],[89,-49],[11,-5],[2,-2]],[[5690,1018],[1,-12],[3,-1],[0,-4],[-1,-2],[-5,0],[-1,1],[-1,4],[0,8],[-1,6],[-13,1],[-6,-6],[-1,-2],[6,-2],[0,-2],[-12,2],[-1,-5],[-10,2],[-23,-10],[-1,3],[15,8],[-18,28],[-6,6],[-7,3],[-8,2],[-7,1],[-6,2],[-12,8],[-14,9],[-5,2],[-12,6],[-12,3],[-7,1],[-4,1],[-4,0],[-14,1],[-3,2],[-1,4],[-4,2],[-6,1],[-6,3],[-7,-3],[-9,5],[-3,0],[-8,4],[-5,-1],[-11,-6],[-2,0],[-11,1],[-6,-5],[-23,13],[-22,15],[-20,11],[-6,3],[-3,-1],[-10,0],[-3,-1],[-9,-3],[-10,1],[-6,1],[-8,3],[-10,4],[-12,0],[-3,2],[-3,1],[-16,7],[-5,6],[-9,15],[-6,5],[-6,0],[-14,4],[-3,2],[-4,2],[-25,7],[-46,16],[-14,2]],[[5122,1221],[2,1],[1,-1],[1,-1]],[[5126,1220],[9,-2],[17,1],[11,1],[11,-5],[10,-3],[12,-2]],[[5196,1210],[9,-2],[10,-4]],[[5215,1204],[13,-7],[6,-7],[8,-12],[9,-18],[6,-11],[8,-4],[25,-8],[12,-2],[20,-2]],[[5322,1133],[20,5],[9,3],[12,6],[11,5],[11,0]],[[5385,1152],[11,-3],[12,-6]],[[5408,1143],[2,-3],[0,-1],[3,-5],[2,-2],[3,-3],[2,-3],[4,-4],[5,-4],[17,-10],[-4,33],[21,3],[13,1],[11,2]],[[5408,1143],[-2,37],[26,3],[-8,108]],[[5424,1291],[26,-10],[27,-9]],[[5385,1152],[-13,159]],[[5372,1311],[23,-9],[29,-11]],[[5326,1327],[22,-8],[14,-4],[1,-1],[9,-3]],[[5322,1133],[-9,92],[-20,-2],[-6,85]],[[5287,1308],[20,0],[21,-1],[-2,20]],[[5215,1204],[1,3],[0,17],[-1,6],[-2,3],[3,2],[9,15],[3,9],[-1,12],[-4,24],[22,5],[19,6],[23,2]],[[5196,1210],[-13,64],[-18,99],[23,-9],[-3,16]],[[5185,1380],[23,-9],[26,-9],[12,-5],[18,-7],[19,-7],[21,-8],[22,-8]],[[5126,1220],[-1,8],[11,2],[-29,168],[0,4]],[[5107,1402],[10,-1],[3,3],[17,-6]],[[5137,1398],[25,-10],[23,-8]],[[5318,1421],[8,-94]],[[5137,1398],[2,2],[-3,14]],[[5136,1414],[20,4]],[[5156,1418],[11,3],[11,-1],[20,1],[23,-1],[13,1],[22,0],[21,-1],[20,1],[21,0]],[[5310,1509],[8,-88]],[[5156,1418],[-20,106],[12,0],[12,-10],[21,0],[21,0],[68,-3],[21,-1],[19,-1]],[[5438,1423],[-26,-2]],[[5412,1421],[-2,1],[-24,0],[-22,-1],[-24,1],[-22,-1]],[[5310,1509],[22,-1],[22,-2],[18,-1],[19,0],[20,-1],[20,-1],[3,-24],[4,-56]],[[5512,1502],[7,-83]],[[5519,1419],[-21,-2],[-19,2],[-20,5],[-21,-1]],[[5136,1414],[-18,88],[-1,3],[-4,22],[-1,6],[-1,4],[-1,4],[-2,4]],[[5108,1545],[0,5]],[[5424,1291],[-3,29],[-9,101]],[[5519,1419],[8,-100]],[[5107,1402],[-24,112],[1,15],[-1,5],[-2,4],[-1,3],[-2,6],[30,-2]],[[5107,1402],[-14,5]],[[5093,1407],[-4,15],[-8,40]],[[5081,1462],[-11,63],[0,1],[-1,1],[-1,1],[-36,1],[14,-76]],[[5046,1453],[6,-31]],[[5052,1422],[-43,16],[-5,2],[-18,6],[-18,7],[-5,2],[-71,26]],[[2859,3223],[3,4],[16,13],[9,5],[2,2],[48,38],[16,11],[18,16]],[[6514,5465],[-59,40]],[[6491,5396],[-20,14],[-18,12],[-20,15]],[[6433,5437],[6,16],[1,4],[7,20],[7,23],[1,5]],[[6514,5465],[-2,-4],[-7,-23],[-7,-21],[-7,-21]],[[6530,5369],[-20,13],[-19,14]],[[6408,5362],[9,25]],[[6417,5387],[16,50]],[[6417,5387],[-21,14],[-21,14],[-16,12]],[[6359,5427],[12,25],[9,21]],[[6380,5473],[15,-11],[13,-9],[5,-3],[20,-13]],[[6384,5295],[-9,5],[-43,20],[-9,5]],[[6323,5325],[8,23],[8,22],[7,22]],[[6346,5392],[13,35]],[[6346,5392],[-20,10],[-18,9]],[[6308,5411],[12,43]],[[6320,5454],[20,-13],[6,11],[17,33],[17,-12]],[[6323,5325],[-36,17]],[[6287,5342],[7,24],[7,22],[3,11],[4,12]],[[6287,5342],[-5,2],[-22,12],[-6,8],[-10,10]],[[6244,5374],[9,8],[3,2],[7,5],[6,5],[6,7],[6,22],[10,29],[0,1],[1,2],[1,2],[1,3],[1,4],[2,6]],[[6297,5470],[18,-13],[5,-3]],[[6244,5374],[-4,6],[-4,1]],[[6236,5381],[13,20],[4,8],[2,13],[4,29],[-4,11],[-2,22],[-2,12],[1,2],[5,7],[5,6],[5,6],[2,8],[3,13],[0,5],[0,6],[2,20],[0,1],[-1,4],[0,7],[-6,10],[5,4],[5,4],[4,6],[3,10],[-1,3],[-3,3]],[[6289,5624],[4,-4],[7,-5],[4,-4],[4,-3],[3,-3],[3,-2],[5,-3]],[[6319,5600],[-1,-5],[-1,-5],[-1,-9],[2,-15],[0,-8],[-2,-11],[0,-6],[-2,-23],[-6,-18]],[[6308,5500],[-5,-13],[-6,-17]],[[6319,5600],[4,-3],[13,-9],[16,-11],[2,-2],[3,-1]],[[6357,5574],[-1,-4],[-4,-13],[-9,-27],[-13,-43],[-5,3],[-17,10]],[[6357,5574],[12,-10],[21,-15],[19,-12]],[[6357,5574],[10,34],[7,24],[-4,2]],[[6370,5634],[8,28]],[[6378,5662],[5,-4],[63,-43]],[[2766,3246],[18,13],[3,-4],[14,-10],[30,24],[5,-8],[6,-10],[16,9],[14,5],[6,2],[6,0],[6,0],[5,1],[4,2],[43,33],[-4,9],[-2,4],[-3,7],[-1,1],[-1,0],[-1,0],[-7,-4],[-4,-2],[-4,10],[-1,2],[-2,0],[-23,-10],[-49,-24],[-7,13],[-1,4]],[[2757,3266],[11,7],[7,5],[15,10],[13,8],[12,8],[11,5],[6,4]],[[2693,3331],[20,8],[17,8],[16,9],[13,8],[10,6],[9,7],[7,5],[6,6]],[[2666,3320],[-9,19],[-6,16],[-2,7],[-2,9],[1,10],[1,8]],[[2649,3389],[6,13],[6,8],[6,6],[5,4],[6,3],[28,9],[4,1],[10,0],[4,1],[6,3],[7,2],[6,2],[7,0],[16,0]],[[2766,3441],[0,-6],[2,-6],[8,-17]],[[2608,3491],[18,-40],[2,-7],[2,-6],[0,-8],[1,-11],[1,-4],[2,-8],[4,-7],[4,-5],[7,-6]],[[2705,3480],[9,-19],[20,2],[10,2],[4,1],[10,7],[7,3],[4,0],[2,-4],[-4,-22],[-1,-9]],[[2591,3556],[20,0],[25,0],[4,-18],[8,3],[6,4],[11,-25],[8,-17],[8,-18],[7,-16],[17,11]],[[2705,3480],[-7,15],[-15,34],[-1,4],[0,5],[0,5],[1,5],[3,10],[1,3],[2,2],[3,1],[5,0],[19,0],[2,7],[2,6],[3,4],[4,4],[7,4]],[[2734,3589],[5,-11],[27,-59],[17,11]],[[2709,3645],[15,-33],[10,-23]],[[2633,3686],[0,-4],[0,-3],[2,-6],[2,-4],[5,-2],[4,-1],[4,0],[19,2],[5,0],[4,0],[2,0],[2,0],[2,-1],[4,-1],[7,-4],[6,-5],[4,-6],[4,-6]],[[2709,3645],[17,11],[9,-20],[15,7],[15,6],[14,3],[13,2],[16,1]],[[2808,3655],[17,-35],[9,-21],[16,9],[3,1],[21,-46]],[[2792,3704],[-5,-26],[9,1],[6,0],[7,-1]],[[2809,3678],[-2,-12],[-1,-5],[2,-6]],[[2809,3678],[20,-3],[-1,-13],[9,-19],[6,5],[2,1],[38,-7],[2,-2],[1,-2],[-3,-19],[0,-8],[0,-5],[1,-6],[3,-5],[3,-5],[5,-3],[6,-3],[6,-1],[7,1],[5,1],[19,12],[3,2],[3,5],[1,5],[0,3],[-8,18],[-2,2],[-2,1],[-24,4],[-2,1],[-2,3],[3,20],[43,-7]],[[6797,6703],[-2,3],[-5,7],[-5,8],[-35,55]],[[6750,6776],[2,15],[1,11],[0,3],[2,33],[0,6],[2,7],[5,16],[55,-88],[2,-3]],[[6819,6776],[11,-17]],[[6830,6759],[-17,-14],[-6,-5],[-4,-16],[-6,-21]],[[6841,6621],[-2,4],[-12,20],[-7,10],[-25,40]],[[6795,6695],[2,8]],[[6830,6759],[39,-63],[26,-40],[2,-4]],[[6791,6593],[-2,4],[-18,29],[4,13],[4,11],[8,22],[2,6],[6,17]],[[6841,6621],[-16,-9],[-16,-9],[-18,-10]],[[6710,6627],[2,3],[2,5],[4,13],[2,6],[1,5],[2,7],[3,9],[6,12],[1,4]],[[6791,6593],[-10,-6],[-7,-4],[-1,-1],[-8,-7],[-6,-5]],[[6859,6594],[-14,-12],[-15,-13],[-13,-12],[-1,-2],[1,-2],[15,-22],[20,-31]],[[5727,3208],[-18,18],[-16,18],[-13,-17],[-2,-2],[-20,20],[-14,16]],[[3136,3279],[9,-25],[4,-14],[2,-11],[4,-23],[6,-11],[-17,-13],[10,-17],[-41,-33],[0,-3],[9,-15],[12,-19]],[[3134,3095],[-7,-6],[-19,-8]],[[3267,3231],[-3,-2],[-32,-25],[-10,-9],[-5,-6],[-6,-9]],[[3211,3180],[-18,-29],[-5,-7],[-10,-12],[-9,-9],[-35,-28]],[[3346,3097],[-3,-2],[-23,-19]],[[3320,3076],[-12,21],[-17,28],[-10,18],[-44,-34],[-30,24]],[[3207,3133],[20,33],[-16,14]],[[3320,3076],[-37,-30],[-26,-20],[-4,-2],[-9,0]],[[3244,3024],[-4,1],[-23,2]],[[3217,3027],[1,13],[-10,18],[15,12],[15,12],[-17,14],[-23,18],[-1,3],[10,16]],[[3305,2980],[-6,3],[-5,0],[-5,-1],[-18,-14],[-8,-6],[-76,-61],[-12,21]],[[3175,2922],[-10,17],[56,46],[1,18],[19,-2],[3,23]],[[3385,3031],[-4,-2],[-26,-12],[-5,0],[-34,-27],[-11,-10]],[[3143,2978],[38,30],[21,18],[5,1],[10,0]],[[3175,2922],[-15,-13],[-40,-33],[-2,1],[-31,53],[-7,-3],[-9,-6],[-2,-2]],[[3305,2980],[42,-70],[29,-52],[8,-15],[7,-19],[2,-11],[1,-11],[-3,-44],[1,-11],[2,-8],[4,-11],[4,-9],[2,-3]],[[3385,3031],[19,-32],[15,-23],[10,-13],[21,-20],[18,-21]],[[3468,2922],[29,-47],[30,-51],[3,-4]],[[3487,3068],[-4,-9],[-1,-9],[-1,-8],[2,-9],[2,-9],[12,-30],[8,-22],[9,-23]],[[3514,2949],[-6,-1],[-9,-4],[-12,-7],[-19,-15]],[[3514,2949],[10,1],[7,-1],[6,2],[7,3],[19,16],[20,15],[7,8],[15,21]],[[3605,3014],[21,-35],[4,-6]],[[3630,2973],[2,-3],[4,-9]],[[3636,2961],[-2,-7],[-2,-6],[-2,-4],[-6,-4],[-8,-6],[-21,-17],[-16,-13],[-22,-16],[-5,-5]],[[3653,3081],[-7,-7],[-5,-7]],[[3641,3067],[-15,-22],[-21,-31]],[[3641,3067],[22,-21],[5,-6],[0,-3],[2,-1],[2,0],[5,-16],[-19,-20],[-18,-18],[-10,-9]],[[3654,2974],[-8,-7],[-10,-6]],[[7252,7640],[11,-18],[2,-1],[1,0],[6,5],[2,1],[2,-1],[36,-56],[2,-3]],[[7336,7636],[-6,-9],[-7,-6],[-12,-11],[15,-24],[2,-3],[-14,-16]],[[7350,7614],[-13,-15],[2,-3],[16,-26]],[[7382,7644],[12,-19],[10,-15],[3,-5],[4,-8],[6,5],[7,-4],[2,-1],[1,-2],[19,-29],[12,-19]],[[7413,7680],[11,-17],[65,-97]],[[7452,7720],[15,-18],[11,-18],[34,-51],[15,-23]],[[7488,7751],[2,-3],[17,-26],[53,-84]],[[3946,3282],[-1,-13],[-1,-6],[0,-3],[-1,-1]],[[3943,3259],[-2,-4],[-6,-6],[-19,-14],[-1,-1]],[[4021,3259],[-17,-18],[-3,-1],[-2,-2],[-4,2],[-10,15],[1,1],[1,2],[0,3],[-1,1],[-3,1],[-4,-1],[-1,2],[-13,12],[-2,2],[-3,1],[-3,2],[-4,0],[-7,1]],[[4067,3169],[-94,77],[-30,13]],[[4166,3063],[-35,-28],[-6,-5],[-3,-2],[-120,-88],[-1,-3]],[[3907,1823],[-3,14],[-13,51],[-5,6],[-2,33],[-3,8],[0,7],[-2,13],[-3,11],[-2,5],[0,6],[-6,13],[2,4],[-11,48],[-2,3],[-7,13],[-17,29]],[[3864,1825],[1,18],[0,24],[0,24],[-20,1],[-5,0],[-21,-7]],[[3819,1885],[-3,12],[-11,15],[-1,3],[-11,49],[-19,-6],[-20,-7],[-4,19],[16,15],[1,2],[-1,3],[-6,17],[-2,1],[-2,1],[-18,-14],[-8,-7],[-7,-5],[-21,-17],[-3,-28],[-10,2],[-8,-3]],[[3819,1885],[-19,-6],[-10,-3],[-9,-2],[-6,-2],[1,-12],[0,-9],[4,-14],[-46,-15],[-3,1],[-1,2],[-5,22],[-11,-3],[-5,-3],[-5,-5]],[[7893,7399],[48,53]],[[7941,7452],[37,43],[3,4],[51,58],[19,20],[19,21],[54,59],[33,35],[13,15]],[[7878,7584],[-12,-15],[15,-23],[3,-6],[5,-8],[8,-12],[17,-26],[24,-38],[3,-4]],[[7765,7647],[2,-3],[12,-20],[20,24],[10,-16],[2,-1],[2,1],[19,24],[12,-18],[18,-29],[16,-25]],[[7967,7659],[-44,-55],[-2,0],[-1,1],[-11,16],[-31,-37]],[[7805,7698],[2,-3],[13,-20],[12,15],[42,-66],[13,17]],[[7887,7641],[15,18],[15,19]],[[7917,7678],[16,-26],[21,26],[13,-19]],[[7861,7768],[2,-3],[12,-20],[13,-20]],[[7888,7725],[-16,-20],[-14,-18],[29,-46]],[[7888,7725],[13,16],[29,-46]],[[7930,7695],[-13,-17]],[[7958,7730],[-14,-18],[-14,-17]],[[7917,7839],[2,-3],[13,-20]],[[7932,7816],[-16,-20],[42,-66]],[[7958,7730],[16,19]],[[7974,7749],[16,-26],[11,-16],[0,-4],[-34,-44]],[[7989,7819],[-33,-42],[18,-28]],[[7932,7816],[12,-19],[32,40],[1,2],[-1,2],[-11,17],[14,16]],[[6340,5706],[-4,-13],[15,-9],[9,-8],[-9,-28],[2,-2],[17,-12]],[[6395,5712],[-3,-7],[-2,-5],[-4,-12],[-8,-26]],[[6403,5730],[5,-3],[8,-5],[2,-2],[45,-31]],[[6463,5689],[5,-2],[2,-1],[-1,-3],[-3,-20],[-2,-12]],[[6431,5791],[4,-4],[2,-2],[7,-5],[49,-34]],[[6493,5746],[-10,-20],[-3,-5],[-7,-14],[-2,-4],[-8,-14]],[[6493,5746],[8,-6],[42,-28],[8,-6]],[[6493,5746],[10,20],[11,23],[12,22]],[[6526,5811],[51,-36],[7,-5]],[[6450,5833],[5,9],[6,13]],[[6461,5855],[4,-3],[61,-41]],[[6461,5855],[9,20],[6,15]],[[2038,2561],[8,17],[8,12],[7,6],[9,12],[8,6],[5,2],[12,15],[4,1],[7,-7],[6,0],[1,4],[-3,8],[-1,23],[1,10],[3,14],[2,7],[8,9],[10,13],[2,2],[-2,8],[-5,6],[0,2],[-2,14],[1,7],[10,14],[5,-3],[1,-4],[1,-2],[-5,-17],[-3,-2],[-1,-4],[1,-4],[3,2],[9,9],[1,5],[1,5],[-2,8],[-2,4],[0,1],[-1,10],[7,12],[4,5],[6,4],[5,7],[5,3],[3,2],[3,1],[3,2]],[[2181,2810],[2,-3],[30,-39],[3,-1],[9,-12],[4,-6]],[[2181,2810],[3,3],[1,5],[7,5],[3,2],[3,6],[3,2],[5,3],[2,1],[3,-1],[9,-7],[10,-4],[5,0],[7,2],[14,13],[4,0],[4,0],[4,2],[6,0],[4,4],[5,7],[1,2],[19,11],[3,1],[9,0],[4,2],[3,2],[7,8]],[[2329,2879],[0,-1],[6,-13],[9,-23],[9,-15],[-7,-10]],[[2329,2879],[1,1],[9,2],[13,10],[9,11],[1,2],[3,5],[4,5],[0,4],[1,2],[3,0],[1,2],[9,27],[14,19],[8,14],[4,6],[3,7],[4,5],[4,9],[7,12],[5,9],[5,12],[1,5],[3,14],[5,9],[3,7]],[[7187,7094],[-15,-13]],[[7172,7081],[-47,74]],[[7125,7155],[15,13]],[[7109,7141],[16,14]],[[7172,7081],[-16,-14]],[[7156,7067],[-47,74]],[[7094,7129],[15,12]],[[7156,7067],[-14,-12]],[[7142,7055],[-48,74]],[[7094,7129],[-11,18]],[[7083,7147],[51,43],[32,28],[3,3]],[[7083,7147],[-11,17]],[[7072,7164],[16,15],[14,11]],[[7102,7190],[15,13]],[[7117,7203],[16,14]],[[7133,7217],[22,19],[2,2]],[[7133,7217],[-40,62]],[[7117,7203],[-39,60]],[[7102,7190],[-37,58]],[[7072,7164],[-33,51]],[[7083,7147],[-13,-11]],[[7070,7136],[-40,64],[-13,-20],[-12,19]],[[7005,7199],[23,34]],[[7070,7136],[-16,-13],[-15,-13],[-45,70]],[[6994,7180],[11,19]],[[6994,7180],[-11,-19]],[[7076,6999],[-47,75],[-14,-13],[-12,19]],[[7003,7080],[20,17],[-11,19],[-12,17],[-17,28]],[[7003,7080],[-29,-26],[-14,-13]],[[7018,6949],[-12,19]],[[7006,6968],[-24,37],[-22,36]],[[7006,6968],[-3,-2],[-16,-14],[-11,18],[-36,-31],[-11,17],[-19,9],[-7,-21]],[[6903,6944],[-19,8]],[[7030,6929],[-2,-2],[-15,-13],[-38,-32]],[[6975,6882],[-15,-13],[7,-12],[11,-18]],[[6978,6839],[-2,-2],[-19,-17],[-20,5],[-3,3],[-46,73],[8,24],[1,2],[2,2],[9,9],[3,2],[-2,1],[-6,3]],[[4974,3642],[-2,37],[-11,0],[-5,0],[-5,1],[-5,3],[-6,6],[-5,13],[-4,8],[-4,8],[1,4],[16,10],[12,-30],[2,-2],[18,2],[9,1],[5,1],[6,2],[6,4],[7,8],[41,54],[2,3]],[[5052,3775],[29,-29],[12,-13],[25,-27]],[[4946,3777],[62,39],[-11,11],[3,3]],[[5000,3830],[12,-13],[11,-11],[29,-31]],[[4954,3878],[14,-14],[13,-14],[2,-3]],[[4983,3847],[17,-17]],[[4851,3985],[7,-8],[-2,-2],[-22,-27],[-12,-14],[-1,-1],[1,-2],[27,-28],[15,-16],[22,29],[12,15],[2,3],[11,-12],[20,-20],[2,-2],[21,-22]],[[5034,3892],[-4,-2],[-5,-3],[-9,-5],[-7,-6],[-6,-4],[-3,-4],[-5,-5],[-12,-16]],[[4954,3878],[12,16],[-14,15],[-14,13],[-1,2],[1,1],[3,5],[11,13],[1,3],[0,2],[-40,41],[-23,25],[-8,7]],[[4882,4021],[7,9],[75,-80],[9,14],[34,52],[12,16]],[[5019,4032],[7,-9]],[[5026,4023],[-26,-35]],[[5000,3988],[-12,-17],[39,-41],[-13,-16],[7,-8],[11,-11],[2,-3]],[[4851,3985],[18,21],[13,15]],[[4955,4047],[-26,-42],[-38,39],[-15,-17],[6,-6]],[[4915,4124],[11,-13],[1,-6],[11,-11]],[[4938,4094],[-15,-14],[15,-15],[17,-18]],[[5012,4039],[7,-7]],[[4955,4047],[11,14],[5,-7],[7,-9],[22,-23],[12,17]],[[5030,4106],[-22,-14],[-21,-26],[25,-27]],[[4938,4094],[26,23],[9,10],[2,2],[2,0],[1,0],[1,0],[6,-5],[15,13],[14,-14],[16,-17]],[[5069,4101],[-50,-69]],[[5030,4106],[17,-16],[14,19],[8,-8]],[[5082,4120],[-13,-19]],[[5042,4212],[6,-12],[48,-51],[-18,-24],[4,-5]],[[8356,8290],[-53,86],[-2,-2]],[[8292,8241],[-1,3],[-50,78]],[[8217,8176],[13,12],[-2,2],[-5,10],[-43,68]],[[8350,8150],[-12,-11],[-17,-15],[-5,-4],[-28,-24],[-13,-11],[-45,71],[-13,20]],[[8217,8176],[-36,-31],[-2,-1],[-2,3],[-13,19],[-40,-35],[-23,36]],[[8101,8167],[15,13],[23,20],[2,1],[-13,22]],[[8101,8167],[-16,-14],[-16,-15],[-27,-22],[-13,-12],[-14,-12],[-2,-3]],[[7944,8196],[4,5],[15,20],[16,23],[21,-20],[-12,-17],[-1,-4],[1,-3],[10,-15],[15,13],[2,1],[2,-1],[4,-6],[41,35]],[[8220,7760],[-3,4],[-17,27],[-28,42],[-4,7],[-23,35],[-26,41],[-8,13],[-9,14],[-2,3]],[[5081,1462],[-35,-9]],[[5093,1407],[-7,3],[-34,12]],[[5148,4153],[-16,11],[-22,14],[-28,25]],[[5139,4189],[17,-17],[-8,-19]],[[5263,4080],[-30,-44],[-37,38],[-14,15],[-18,-11]],[[5164,4078],[-7,-10],[-63,62],[-12,-10]],[[5148,4153],[40,-24],[29,-19],[12,-7]],[[5352,4128],[-13,-17],[-12,-16]],[[5359,4062],[-32,33]],[[5352,4128],[52,-56]],[[5359,4062],[-3,-4],[-12,-11],[-3,-1],[-2,1],[-27,28]],[[5341,4014],[-42,44]],[[5156,3767],[-20,20],[-37,40],[-7,-1],[-11,-14],[-15,-19],[-14,-18]],[[5034,3892],[9,1],[12,0],[10,1],[6,2],[7,2],[7,4],[26,16]],[[5111,3918],[55,33],[4,1]],[[5170,3952],[9,4],[3,1],[3,2],[9,5]],[[5194,3964],[25,15],[2,1],[16,22],[2,3],[7,14],[3,6],[32,44]],[[5000,3988],[15,-14],[26,-27],[5,-5],[5,-2],[5,0],[6,1],[4,3],[3,3],[4,3],[10,12]],[[5083,3962],[8,-8],[6,-7],[5,-7],[7,-18],[2,-4]],[[5026,4023],[8,-10],[20,-20]],[[5054,3993],[14,-15],[15,-16]],[[5054,3993],[12,17],[24,34],[3,1],[2,-1],[11,-12]],[[5106,4032],[-26,-37],[25,-25],[1,-1],[1,0],[3,1],[17,10],[5,4],[3,2],[3,4],[2,1],[2,-3],[1,-1],[10,-11],[12,-12],[4,-8],[1,-4]],[[5069,4101],[6,-7],[15,-15],[28,-30],[-12,-17]],[[5164,4078],[8,-9],[-17,-22],[5,-7],[25,-26],[4,-3],[3,-3],[-6,-8],[-11,-13],[-1,-2],[0,-1],[1,-1],[1,-1],[7,-6],[8,-9],[3,-3]],[[5409,4205],[46,-49],[-22,-31],[14,-15]],[[9268,8006],[-23,6]],[[9245,8012],[5,22],[3,16],[5,22],[3,17],[3,13],[4,15]],[[9268,8117],[21,-5]],[[9289,8112],[41,-11],[42,-11]],[[9233,7952],[6,26],[6,31],[0,3]],[[9308,8311],[-1,-4],[-11,-55],[-4,-18],[-5,-23],[-5,-23],[-3,-18],[-11,-53]],[[8952,8419],[33,26],[26,21],[33,26],[20,15],[-1,1],[0,2],[0,2],[5,4],[24,22],[21,17],[16,13],[22,18]],[[9358,8298],[-1,-4],[-6,-31],[-5,-26],[-1,-3]],[[9345,8234],[-3,-19]],[[9342,8215],[-5,-6],[-9,-6],[-5,-4],[-10,-6],[-4,-3],[-4,-4],[-2,-5],[-2,-7],[-4,-21],[-4,-21],[-4,-20]],[[9342,8215],[56,-15],[2,0]],[[9345,8234],[39,-10],[3,14],[3,3],[2,11],[36,-9],[19,-5]],[[9358,8298],[117,-29]],[[9363,8328],[45,-11],[23,-7],[15,-4],[11,-3],[4,1],[8,4]],[[5950,4855],[-23,-11]],[[5927,4844],[-20,-12],[-21,-13]],[[5886,4819],[-13,-3],[-16,1],[-7,1],[-12,1],[-19,-3],[-5,-2],[-9,-2],[-5,-1],[-2,-1],[-25,-7],[-32,-4]],[[5736,4825],[6,1],[6,0],[5,3],[18,30],[8,9],[3,1],[4,3],[19,7],[7,1],[10,-2],[7,-4],[6,-3],[7,-6],[3,-1],[6,-2],[5,2],[3,1],[5,2],[3,1],[48,13],[6,2],[4,-1],[2,-1],[-2,-12],[11,-9],[5,-1],[0,4],[0,2],[0,8],[-1,6],[-1,3],[0,21],[7,12],[6,6],[7,9],[1,4],[8,14],[5,6],[11,20]],[[5998,4967],[13,-7],[25,-12]],[[6036,4948],[-11,-14],[-9,-11]],[[6016,4923],[-14,-17],[-7,-8],[-10,-9]],[[5985,4889],[-16,-17],[-8,-9],[-11,-8]],[[5875,4608],[6,4],[4,12],[6,20],[-84,49],[-113,59],[-27,-12]],[[5886,4819],[4,-3],[27,-14],[-8,-19],[62,-31]],[[5971,4752],[61,-31],[3,-2]],[[5927,4844],[5,-4],[61,-31],[-7,-19],[-7,-19],[-8,-19]],[[5950,4855],[111,-57],[4,-1]],[[5985,4889],[83,-42],[9,-5],[4,-2]],[[6016,4923],[62,-32],[14,-7],[4,-2]],[[6036,4948],[53,-27],[14,-7],[4,-2]],[[6036,5032],[21,-10],[-5,-16],[11,-6],[60,-30],[4,-1]],[[6054,5070],[23,-11],[3,-3],[61,-31],[3,-1]],[[8833,8678],[16,16],[-21,48],[-20,-12],[-8,19],[-37,80],[20,12],[-15,33],[-23,53],[-2,5],[-20,-13],[-23,-15]],[[8700,8904],[-7,14],[-3,5],[-9,22],[-8,-5],[-11,-5],[-7,-3],[-13,-7],[-42,-17],[-13,-4],[-25,-4],[-11,-1],[-5,0],[-3,0],[-6,1],[-12,2],[-8,0],[-6,-2]],[[8511,8900],[-4,-2],[-7,-3],[-3,-2],[-5,-4],[-8,-6],[-3,-3],[-5,-4],[-6,-7],[-12,-20],[17,-41],[-32,-18],[-1,-1],[0,-2],[7,-17],[4,-10],[12,-11],[3,-3]],[[8305,8694],[13,17],[9,6],[7,6],[1,2],[4,5],[6,5],[8,1],[6,6],[10,9],[8,9],[11,7],[18,16],[7,9],[6,11],[13,20],[7,7],[4,4],[4,3],[6,13],[9,12],[7,15],[22,19],[20,9],[21,1],[17,-1],[20,1],[12,2],[15,6],[13,7],[9,3],[3,3],[0,7],[1,1],[3,-2],[3,0],[7,6],[13,13],[10,8],[9,12],[9,8],[24,23],[6,9],[9,7],[10,10],[13,11],[24,24],[24,22],[9,10],[11,29],[5,9],[6,13],[4,13],[12,27],[4,13],[3,13],[12,20],[10,22],[9,14],[12,17],[9,10],[6,9],[20,28],[10,9],[6,7],[2,5],[8,6],[6,7],[4,8],[3,11],[12,23],[6,16],[0,7],[2,19],[4,8],[9,17],[24,48],[8,14],[9,10],[2,7],[8,14],[4,15],[4,9],[2,6],[9,13],[4,8],[4,13],[1,13],[4,13],[10,21],[6,6],[12,17],[2,0],[13,23],[12,4],[6,7],[12,10],[8,4],[6,4],[7,8],[1,1],[18,9],[8,2],[7,3],[7,5],[20,8],[5,0],[12,8],[14,10],[10,6],[16,4],[10,4],[11,4],[14,8],[16,10],[4,4],[2,0]],[[8795,8640],[-8,18],[-64,142],[-2,4],[-22,50],[0,4],[2,4],[14,8],[-14,31],[-1,2],[0,1]],[[8686,8525],[-2,4],[-2,2],[-3,6],[-3,5],[-2,2],[-11,23],[-20,47],[-13,31],[-16,35],[-30,69],[-33,78]],[[8551,8827],[-1,4],[-7,15],[-5,8],[-9,13],[-6,8],[-4,7],[-8,18]],[[8555,8562],[17,19],[14,17],[-9,11],[-4,9],[-22,51],[-2,2],[-17,-10],[-9,21],[-18,-10]],[[8468,8746],[6,8],[7,9],[9,9],[10,11],[11,10],[19,17],[18,15],[3,2]],[[7052,6851],[-5,9],[-12,18],[-37,-32],[-11,18],[-12,18]],[[7054,6811],[-37,-33],[-12,18],[-15,24],[-12,19]],[[6990,6704],[-3,4],[-44,68],[-7,12]],[[6936,6788],[-9,15],[-30,47]],[[6897,6850],[-31,49]],[[6830,6759],[10,8],[25,-40],[14,13],[14,12],[14,12],[14,12],[15,12]],[[6819,6776],[10,27]],[[6829,6803],[5,-7],[6,5],[13,11],[15,13],[14,12],[15,13]],[[6829,6803],[-2,3],[-9,13],[-7,11],[-16,26],[18,17],[16,14]],[[6829,6887],[18,-29],[2,-3],[8,21],[2,6],[7,17]],[[6829,6887],[-44,68],[1,5],[5,21]],[[6715,6834],[2,7],[8,19],[7,14],[5,12],[5,5],[35,82],[4,17]],[[7568,4477],[7,11],[5,9]],[[7580,4497],[9,-7],[45,-34],[13,-10]],[[7580,4497],[14,23]],[[7580,4497],[-11,8],[-42,33],[-9,9]],[[7568,4477],[-63,47]],[[7555,4451],[-19,14],[-37,27],[-8,6]],[[7523,4395],[-62,47]],[[7498,4350],[-62,46]],[[7485,4324],[-63,47]],[[5016,1281],[-46,1],[-3,21],[0,14],[1,6],[-4,20],[-18,-3],[-3,0],[-2,1],[-2,3],[-4,22],[-23,-5]],[[5016,1227],[-10,3],[-8,7],[-3,5],[-2,12],[1,19],[-3,-4],[-3,-9],[-1,-8],[2,-7],[2,-6],[4,-8],[6,-4],[9,-3],[6,-2]],[[5626,4344],[-6,6],[-47,50],[13,16],[12,17]],[[5608,4321],[-1,0],[-14,15],[-40,42],[-7,7]],[[5546,4385],[-26,27],[-19,20],[-3,3],[-3,3],[-4,4],[-2,2],[-1,1]],[[5524,4487],[5,5],[0,2],[17,20]],[[5546,4514],[31,-30],[33,-36]],[[5639,4489],[-17,-24],[-12,-17]],[[5546,4514],[19,22],[3,3]],[[5568,4539],[14,-12],[3,-3],[3,-2],[4,-1],[5,0],[5,1],[21,-19],[16,-14]],[[5568,4539],[21,26],[13,20],[6,9],[2,3]],[[5610,4597],[73,-44]],[[5683,4553],[-3,-4],[-2,-4],[-14,-19],[-14,-19],[-11,-18]],[[5568,4539],[-19,19],[-14,13],[-15,14]],[[5630,4642],[74,-41],[-11,-25],[-10,-23]],[[5748,4503],[-22,16],[-43,34]],[[5638,4663],[4,-2],[7,16],[20,-12],[26,-13],[2,-1],[13,-4],[79,-41]],[[5742,4702],[54,-28],[-9,-24],[30,-15],[29,-7],[0,-1],[-3,-11]],[[5546,4385],[-3,-5],[-5,-5],[-9,-12],[0,-3],[-2,-3],[-5,-6],[-4,-2],[-5,-7],[-14,-19],[-13,-17]],[[5534,4223],[-62,65]],[[5608,4321],[-3,-5],[-12,-16],[-2,0],[0,-1],[0,-1],[-8,-11],[-9,-11],[-13,-17],[-13,-18],[-14,-18]],[[5494,4172],[-61,65]],[[5534,4223],[-13,-16],[-13,-18]],[[6183,5178],[9,23],[10,22],[11,-6],[39,-19],[22,-10]],[[6160,5189],[10,23],[10,22],[7,22]],[[6187,5256],[19,-9],[5,-2],[9,-5],[32,-16],[30,-14]],[[6187,5256],[17,49]],[[6204,5305],[20,-10],[3,-2],[3,-4],[2,-2],[6,-3],[14,-7],[46,-22]],[[6298,5255],[-4,-12],[-4,-11],[-4,-11],[-4,-11]],[[6323,5325],[-9,-24],[-10,4],[-28,14]],[[6276,5319],[-5,3],[-31,14],[-24,2],[-6,-16],[-6,-17]],[[6079,5226],[9,15],[21,27],[12,18],[27,28],[13,16],[20,23],[3,2],[3,2],[15,0],[9,1],[6,3],[18,19],[1,1]],[[6276,5319],[-23,-15],[3,-2],[50,-25]],[[6306,5277],[-4,-11],[-4,-11]],[[6367,5247],[-44,21],[-17,9]]],"box":[-73.97639960366291,45.40212922961762,-73.47606597759493,45.70374747616739],"transform":{"scale":[0.000050038366443442794,0.000030164841139091116],"translate":[-73.97639960366291,45.40212922961762]}} diff --git a/test/nonNumericOnlyHash.unittest.js b/test/nonNumericOnlyHash.unittest.js new file mode 100644 index 00000000000..00002648b85 --- /dev/null +++ b/test/nonNumericOnlyHash.unittest.js @@ -0,0 +1,31 @@ +"use strict"; + +const nonNumericOnlyHash = require("../lib/util/nonNumericOnlyHash"); + +it("hashLength=0", () => { + expect(nonNumericOnlyHash("111", 0)).toBe(""); +}); + +it("abc", () => { + expect(nonNumericOnlyHash("abc", 10)).toBe("abc"); +}); + +it("abc1", () => { + expect(nonNumericOnlyHash("abc1", 3)).toBe("abc"); +}); + +it("ab11", () => { + expect(nonNumericOnlyHash("ab11", 3)).toBe("ab1"); +}); + +it("0111", () => { + expect(nonNumericOnlyHash("0111", 3)).toBe("a11"); +}); + +it("911a", () => { + expect(nonNumericOnlyHash("911a", 3)).toBe("d11"); +}); + +it("511a", () => { + expect(nonNumericOnlyHash("511a", 3)).toBe("f11"); +}); diff --git a/test/numberHash.unittest.js b/test/numberHash.unittest.js new file mode 100644 index 00000000000..ea059297dd1 --- /dev/null +++ b/test/numberHash.unittest.js @@ -0,0 +1,15 @@ +const numberHash = require("../lib/util/numberHash"); +const { numberToIdentifier } = require("../lib/Template"); + +describe("numberHash", () => { + for (const n of [10, 100, 1000, 10000]) { + it("should eventually fill nearly the complete range up to n", () => { + const set = new Set(); + for (let i = 0; i < n * 200; i++) { + set.add(numberHash(numberToIdentifier(i), n)); + if (set.size >= n - 1) break; + } + expect(set.size).toBeGreaterThanOrEqual(n - 1); + }); + } +}); diff --git a/test/objectToMap.unittest.js b/test/objectToMap.unittest.js index 3b8f70e8bc6..c8adfc3858b 100644 --- a/test/objectToMap.unittest.js +++ b/test/objectToMap.unittest.js @@ -1,6 +1,6 @@ -/* globals describe it */ +"use strict"; -var objectToMap = require("../lib/util/objectToMap"); +const objectToMap = require("../lib/util/objectToMap"); describe("objectToMap", () => { it("should convert a plain object into a Map successfully", () => { diff --git a/test/patch-node-env.js b/test/patch-node-env.js new file mode 100644 index 00000000000..36f335ab88c --- /dev/null +++ b/test/patch-node-env.js @@ -0,0 +1,20 @@ +const NodeEnvironment = + // For jest@29 + require("jest-environment-node").TestEnvironment || + // For jest@27 + require("jest-environment-node"); + +class CustomEnvironment extends NodeEnvironment { + constructor(config, context) { + super(config, context); + } + + // Workaround for `Symbol('JEST_STATE_SYMBOL')` + async handleTestEvent(event, state) { + if (!this.global.JEST_STATE_SYMBOL) { + this.global.JEST_STATE_SYMBOL = state; + } + } +} + +module.exports = CustomEnvironment; diff --git a/test/propertyAccess.unittest.js b/test/propertyAccess.unittest.js new file mode 100644 index 00000000000..51f33979744 --- /dev/null +++ b/test/propertyAccess.unittest.js @@ -0,0 +1,26 @@ +const propertyAccess = require("../lib/util/propertyAccess"); + +describe("propertyAccess", () => { + it("brackets but does not quote numbers", () => { + expect(propertyAccess(["12"])).toBe("[12]"); + }); + + it("brackets and quotes special cases", () => { + expect(propertyAccess(["class"])).toBe('["class"]'); + expect(propertyAccess(["white space"])).toBe('["white space"]'); + expect(propertyAccess(["3cc"])).toBe('["3cc"]'); + }); + + it("uses dot notation on all other cases", () => { + expect(propertyAccess(["a"])).toBe(".a"); + expect(propertyAccess(["_xyz"])).toBe("._xyz"); + expect(propertyAccess(["cc3"])).toBe(".cc3"); + }); + + it("handles multiple levels", () => { + expect(propertyAccess(["a", "b", "c"])).toBe(".a.b.c"); + expect(propertyAccess(["null", "await", "if"])).toBe( + '["null"]["await"]["if"]' + ); + }); +}); diff --git a/test/propertyName.unittest.js b/test/propertyName.unittest.js new file mode 100644 index 00000000000..72a1cff7a29 --- /dev/null +++ b/test/propertyName.unittest.js @@ -0,0 +1,15 @@ +const { propertyName } = require("../lib/util/propertyName"); + +describe("propertyName", () => { + it("quotes special cases", () => { + expect(propertyName("class")).toBe('"class"'); + expect(propertyName("white space")).toBe('"white space"'); + expect(propertyName("3cc")).toBe('"3cc"'); + }); + + it("passes non-special cases through", () => { + expect(propertyName("a")).toBe("a"); + expect(propertyName("_xyz")).toBe("_xyz"); + expect(propertyName("cc3")).toBe("cc3"); + }); +}); diff --git a/test/setupTestFramework.js b/test/setupTestFramework.js index f0133cd12b1..a0a98312435 100644 --- a/test/setupTestFramework.js +++ b/test/setupTestFramework.js @@ -1,4 +1,3 @@ -/* globals expect */ expect.extend({ toBeTypeOf(received, expected) { const objType = typeof received; @@ -6,20 +5,37 @@ expect.extend({ const message = pass ? () => - this.utils.matcherHint(".not.toBeTypeOf") + - "\n\n" + + `${this.utils.matcherHint(".not.toBeTypeOf")}\n\n` + "Expected value to not be (using typeof):\n" + ` ${this.utils.printExpected(expected)}\n` + "Received:\n" + ` ${this.utils.printReceived(objType)}` : () => - this.utils.matcherHint(".toBeTypeOf") + - "\n\n" + + `${this.utils.matcherHint(".toBeTypeOf")}\n\n` + "Expected value to be (using typeof):\n" + ` ${this.utils.printExpected(expected)}\n` + "Received:\n" + ` ${this.utils.printReceived(objType)}`; + return { message, pass }; + }, + toEndWith(received, expected) { + const pass = typeof received === "string" && received.endsWith(expected); + + const message = pass + ? () => + `${this.utils.matcherHint(".not.toEndWith")}\n\n` + + "Expected value to not end with:\n" + + ` ${this.utils.printExpected(expected)}\n` + + "Received:\n" + + ` ${this.utils.printReceived(received)}` + : () => + `${this.utils.matcherHint(".toEndWith")}\n\n` + + "Expected value to end with:\n" + + ` ${this.utils.printExpected(expected)}\n` + + "Received:\n" + + ` ${this.utils.printReceived(received)}`; + return { message, pass }; } }); @@ -27,7 +43,7 @@ expect.extend({ if (process.env.ALTERNATIVE_SORT) { const oldSort = Array.prototype.sort; - Array.prototype.sort = function(cmp) { + Array.prototype.sort = function (cmp) { oldSort.call(this, cmp); if (cmp) { for (let i = 1; i < this.length; i++) { @@ -50,3 +66,64 @@ if (process.env.ALTERNATIVE_SORT) { return this; }; } + +// Setup debugging info for tests +if (process.env.DEBUG_INFO) { + const addDebugInfo = it => (name, fn, timeout) => { + if (fn.length === 0) { + it( + name, + () => { + process.stdout.write(`START1 ${name}\n`); + try { + const promise = fn(); + if (promise && promise.then) { + return promise.then( + r => { + process.stdout.write(`DONE OK ${name}\n`); + return r; + }, + err => { + process.stdout.write(`DONE FAIL ${name}\n`); + throw err; + } + ); + } + + process.stdout.write(`DONE OK ${name}\n`); + } catch (err) { + process.stdout.write(`DONE FAIL ${name}\n`); + throw err; + } + }, + timeout + ); + } else { + it( + name, + done => { + process.stdout.write(`START2 ${name}\n`); + return fn(err => { + if (err) { + process.stdout.write(`DONE FAIL ${name}\n`); + } else { + process.stdout.write(`DONE OK ${name}\n`); + } + return done(err); + }); + }, + timeout + ); + } + }; + // eslint-disable-next-line no-global-assign + it = addDebugInfo(it); +} + +// cspell:word wabt +// Workaround for a memory leak in wabt +// It leaks an Error object on construction +// so it leaks the whole stack trace +require("wast-loader"); +process.removeAllListeners("uncaughtException"); +process.removeAllListeners("unhandledRejection"); diff --git a/test/smartGrouping.unittest.js b/test/smartGrouping.unittest.js new file mode 100644 index 00000000000..44f43cbeb43 --- /dev/null +++ b/test/smartGrouping.unittest.js @@ -0,0 +1,84 @@ +"use strict"; + +const smartGrouping = require("../lib/util/smartGrouping"); + +describe("util/smartGrouping", () => { + it("should group correctly", () => { + const groupConfigs = [ + { + getKeys(item) { + return item.match(/\d+/g); + }, + createGroup(key, items) { + return { + name: `has number ${key}`, + items + }; + } + }, + { + getKeys(item) { + return item.match(/\w+/g); + }, + createGroup(key, items) { + return { + name: `has word ${key}`, + items + }; + } + } + ]; + expect( + smartGrouping( + [ + "hello world a", + "hello world b 2", + "hello world c", + "hello world d", + "hello test", + "hello more test", + "more test", + "more tests", + "1 2 3", + "2 3 4", + "3 4 5" + ], + groupConfigs + ) + ).toMatchInlineSnapshot(` + Array [ + Object { + "items": Array [ + Object { + "items": Array [ + "hello world a", + "hello world b 2", + "hello world c", + "hello world d", + ], + "name": "has word world", + }, + Object { + "items": Array [ + "hello test", + "hello more test", + ], + "name": "has word test", + }, + ], + "name": "has word hello", + }, + Object { + "items": Array [ + "1 2 3", + "2 3 4", + "3 4 5", + ], + "name": "has number 3", + }, + "more test", + "more tests", + ] + `); + }); +}); diff --git a/test/statsCases/aggressive-splitting-entry/webpack.config.js b/test/statsCases/aggressive-splitting-entry/webpack.config.js index f5764ddd651..c4c2b11446c 100644 --- a/test/statsCases/aggressive-splitting-entry/webpack.config.js +++ b/test/statsCases/aggressive-splitting-entry/webpack.config.js @@ -1,12 +1,14 @@ -var webpack = require("../../../"); +const webpack = require("../../../"); + +/** @type {import("../../../").Configuration[]} */ module.exports = ["fitting", "content-change"].map(type => ({ name: type, mode: "production", cache: true, // AggressiveSplittingPlugin rebuilds multiple times, we need to cache the assets entry: "./index", output: { - filename: "[chunkhash].js", - chunkFilename: "[chunkhash].js" + filename: `${type}-[chunkhash].js`, + chunkFilename: `${type}-[chunkhash].js` }, plugins: [ new webpack.optimize.AggressiveSplittingPlugin({ @@ -16,11 +18,12 @@ module.exports = ["fitting", "content-change"].map(type => ({ maxSize: 2500 }) ], - recordsInputPath: __dirname + `/input-records-${type}.json`, - //recordsOutputPath: __dirname + `/records-${type}.json`, + recordsInputPath: `${__dirname}/input-records-${type}.json`, + // recordsOutputPath: __dirname + `/records-${type}.json`, stats: { chunks: true, chunkModules: true, + dependentModules: true, chunkOrigins: true, entrypoints: true, modules: false, diff --git a/test/statsCases/aggressive-splitting-on-demand/webpack.config.js b/test/statsCases/aggressive-splitting-on-demand/webpack.config.js index 0abc3b5bfc4..7c3cc713f81 100644 --- a/test/statsCases/aggressive-splitting-on-demand/webpack.config.js +++ b/test/statsCases/aggressive-splitting-on-demand/webpack.config.js @@ -1,4 +1,6 @@ -var webpack = require("../../../"); +const webpack = require("../../../"); + +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", @@ -13,11 +15,12 @@ module.exports = { maxSize: 2500 }) ], - recordsInputPath: __dirname + "/input-records.json", - //recordsOutputPath: __dirname + "/records.json", + recordsInputPath: `${__dirname}/input-records.json`, + // recordsOutputPath: __dirname + "/records.json", stats: { chunks: true, chunkModules: true, + dependentModules: true, chunkOrigins: true, entrypoints: true, modules: false, diff --git a/test/statsCases/all-stats/index.js b/test/statsCases/all-stats/index.js new file mode 100644 index 00000000000..4688b235ec1 --- /dev/null +++ b/test/statsCases/all-stats/index.js @@ -0,0 +1 @@ +import text1 from "data:text/plain;base64,szsaAAdsadasdfafasfasAADas123aasdasd==" diff --git a/test/statsCases/all-stats/webpack.config.js b/test/statsCases/all-stats/webpack.config.js new file mode 100644 index 00000000000..bf88460981f --- /dev/null +++ b/test/statsCases/all-stats/webpack.config.js @@ -0,0 +1,17 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + mode: "development", + entry: "./index.js", + output: { + filename: "bundle.js" + }, + module: { + rules: [ + { + mimetype: "text/plain", + type: "asset" + } + ] + }, + stats: { all: true } +}; diff --git a/test/statsCases/asset-concat/a.css b/test/statsCases/asset-concat/a.css new file mode 100644 index 00000000000..3b16b0a1e30 --- /dev/null +++ b/test/statsCases/asset-concat/a.css @@ -0,0 +1 @@ +a{} diff --git a/test/statsCases/asset-concat/a.source.js b/test/statsCases/asset-concat/a.source.js new file mode 100644 index 00000000000..55ba8379a10 --- /dev/null +++ b/test/statsCases/asset-concat/a.source.js @@ -0,0 +1 @@ +const b = 1; diff --git a/test/statsCases/asset-concat/images/file.jpg b/test/statsCases/asset-concat/images/file.jpg new file mode 100644 index 00000000000..fe5c6eefa79 Binary files /dev/null and b/test/statsCases/asset-concat/images/file.jpg differ diff --git a/test/statsCases/asset-concat/images/file.png b/test/statsCases/asset-concat/images/file.png new file mode 100644 index 00000000000..fb53b9dedd3 Binary files /dev/null and b/test/statsCases/asset-concat/images/file.png differ diff --git a/test/statsCases/asset-concat/images/file.svg b/test/statsCases/asset-concat/images/file.svg new file mode 100644 index 00000000000..d7b7e40b4f8 --- /dev/null +++ b/test/statsCases/asset-concat/images/file.svg @@ -0,0 +1 @@ +icon-square-small diff --git a/test/statsCases/asset-concat/index.js b/test/statsCases/asset-concat/index.js new file mode 100644 index 00000000000..d1500102e97 --- /dev/null +++ b/test/statsCases/asset-concat/index.js @@ -0,0 +1,9 @@ +import png from "./images/file.png"; +import svg from "./images/file.svg"; +import jpg from "./images/file.jpg"; +import html from "./static/file.html"; +import text1 from "data:text/plain;base64,szsaAAdsadasdfafasfasAADas123aasdasd==" +import text2 from "data:text/plain,asd=" +import text3 from "data:text/plain,XXXXXXXXXXXXXXXXX" // 17 chars +import css from "./a.css"; +import source from "./a.source"; diff --git a/test/statsCases/asset-concat/static/file.html b/test/statsCases/asset-concat/static/file.html new file mode 100644 index 00000000000..7c89b545c5a --- /dev/null +++ b/test/statsCases/asset-concat/static/file.html @@ -0,0 +1 @@ +
    diff --git a/test/statsCases/asset-concat/webpack.config.js b/test/statsCases/asset-concat/webpack.config.js new file mode 100644 index 00000000000..67951bc27c2 --- /dev/null +++ b/test/statsCases/asset-concat/webpack.config.js @@ -0,0 +1,35 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + mode: "production", + entry: "./index.js", + module: { + rules: [ + { + test: /\.(png|jpg|svg)$/, + type: "asset" + }, + { + test: /\.html$/, + type: "asset/resource", + generator: { + filename: "static/[name][ext]" + } + }, + { + test: /\.css$/, + type: "asset/inline" + }, + { + test: /\.source\.js$/, + type: "asset/source" + }, + { + mimetype: "text/plain", + type: "asset" + } + ] + }, + output: { + filename: "bundle.js" + } +}; diff --git a/test/statsCases/asset/a.css b/test/statsCases/asset/a.css new file mode 100644 index 00000000000..3b16b0a1e30 --- /dev/null +++ b/test/statsCases/asset/a.css @@ -0,0 +1 @@ +a{} diff --git a/test/statsCases/asset/a.source.js b/test/statsCases/asset/a.source.js new file mode 100644 index 00000000000..55ba8379a10 --- /dev/null +++ b/test/statsCases/asset/a.source.js @@ -0,0 +1 @@ +const b = 1; diff --git a/test/statsCases/asset/images/file.jpg b/test/statsCases/asset/images/file.jpg new file mode 100644 index 00000000000..fe5c6eefa79 Binary files /dev/null and b/test/statsCases/asset/images/file.jpg differ diff --git a/test/statsCases/asset/images/file.png b/test/statsCases/asset/images/file.png new file mode 100644 index 00000000000..fb53b9dedd3 Binary files /dev/null and b/test/statsCases/asset/images/file.png differ diff --git a/test/statsCases/asset/images/file.svg b/test/statsCases/asset/images/file.svg new file mode 100644 index 00000000000..d7b7e40b4f8 --- /dev/null +++ b/test/statsCases/asset/images/file.svg @@ -0,0 +1 @@ +icon-square-small diff --git a/test/statsCases/asset/index.js b/test/statsCases/asset/index.js new file mode 100644 index 00000000000..467ff94c57e --- /dev/null +++ b/test/statsCases/asset/index.js @@ -0,0 +1,9 @@ +import png from "./images/file.png"; +import svg from "./images/file.svg"; +import jpg from "./images/file.jpg"; +import html from "./static/file.html"; +import text1 from "data:text/plain;base64,szsaAAdsadasdfafasfasAADas123aasdasd=="; +import text2 from "data:text/plain,asd="; +import text3 from "data:text/plain,XXXXXXXXXXXXXXXXX"; // 17 chars +import css from "./a.css"; +import source from "./a.source"; diff --git a/test/statsCases/asset/static/file.html b/test/statsCases/asset/static/file.html new file mode 100644 index 00000000000..7c89b545c5a --- /dev/null +++ b/test/statsCases/asset/static/file.html @@ -0,0 +1 @@ +
    diff --git a/test/statsCases/asset/webpack.config.js b/test/statsCases/asset/webpack.config.js new file mode 100644 index 00000000000..6f5d1756efe --- /dev/null +++ b/test/statsCases/asset/webpack.config.js @@ -0,0 +1,38 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + mode: "production", + entry: "./index.js", + module: { + rules: [ + { + test: /\.(png|jpg|svg)$/, + type: "asset" + }, + { + test: /\.html$/, + type: "asset/resource", + generator: { + filename: "static/[name][ext]" + } + }, + { + test: /\.css$/, + type: "asset/inline" + }, + { + test: /\.source\.js$/, + type: "asset/source" + }, + { + mimetype: "text/plain", + type: "asset" + } + ] + }, + optimization: { + concatenateModules: false + }, + output: { + filename: "bundle.js" + } +}; diff --git a/test/statsCases/async-commons-chunk-auto/a.js b/test/statsCases/async-commons-chunk-auto/a.js index 8f888da4986..bcead2ab1f7 100644 --- a/test/statsCases/async-commons-chunk-auto/a.js +++ b/test/statsCases/async-commons-chunk-auto/a.js @@ -1,6 +1,6 @@ -import "./d"; -import "./e"; -import "x"; -import "y"; -export default "a"; +import d from "./d"; +import e from "./e"; +import x from "x"; +import y from "y"; +export default "a" + d + e + x + y; import(/* webpackChunkName: "async-g" */ "./g"); diff --git a/test/statsCases/async-commons-chunk-auto/b.js b/test/statsCases/async-commons-chunk-auto/b.js index fd909a7b63b..c4a9482e683 100644 --- a/test/statsCases/async-commons-chunk-auto/b.js +++ b/test/statsCases/async-commons-chunk-auto/b.js @@ -1,5 +1,5 @@ -import "./d"; -import "./f"; -import "x"; -import "y"; -export default "b"; +import d from "./d"; +import f from "./f"; +import x from "x"; +import y from "y"; +export default "b" + d + f + x + y; diff --git a/test/statsCases/async-commons-chunk-auto/c.js b/test/statsCases/async-commons-chunk-auto/c.js index 6bbf24bfe50..975020ec2ea 100644 --- a/test/statsCases/async-commons-chunk-auto/c.js +++ b/test/statsCases/async-commons-chunk-auto/c.js @@ -1,5 +1,5 @@ -import "./d"; -import "./f"; -import "x"; -import "z"; -export default "c"; +import d from "./d"; +import f from "./f"; +import x from "x"; +import z from "z"; +export default "c" + d + f + x + z; diff --git a/test/statsCases/async-commons-chunk-auto/g.js b/test/statsCases/async-commons-chunk-auto/g.js index 45be0e69101..c9ff5a60bac 100644 --- a/test/statsCases/async-commons-chunk-auto/g.js +++ b/test/statsCases/async-commons-chunk-auto/g.js @@ -1,2 +1,2 @@ -import "./f"; -export default "g"; +import f from "./f"; +export default "g" + f; diff --git a/test/statsCases/async-commons-chunk-auto/webpack.config.js b/test/statsCases/async-commons-chunk-auto/webpack.config.js index ecf8df0e7de..048405c3017 100644 --- a/test/statsCases/async-commons-chunk-auto/webpack.config.js +++ b/test/statsCases/async-commons-chunk-auto/webpack.config.js @@ -6,9 +6,10 @@ const stats = { assets: false, chunks: true, chunkOrigins: true, - entrypoints: true, modules: false }; + +/** @type {import("../../../").Configuration[]} */ module.exports = [ { name: "disabled", @@ -92,12 +93,12 @@ module.exports = [ chunks: "all", cacheGroups: { libs: module => { - if (!module.nameForCondition) return; const name = module.nameForCondition(); + if (!name) return; const match = /[\\/](xyz|x)\.js/.exec(name); if (match) return { - name: "libs-" + match[1], + name: `libs-${match[1]}`, enforce: true }; }, diff --git a/test/statsCases/async-commons-chunk/webpack.config.js b/test/statsCases/async-commons-chunk/webpack.config.js index a1ffaa9d91d..aee3af00445 100644 --- a/test/statsCases/async-commons-chunk/webpack.config.js +++ b/test/statsCases/async-commons-chunk/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./", @@ -12,6 +13,7 @@ module.exports = { builtAt: false, assets: false, chunks: true, + chunkRelations: true, chunkOrigins: true, modules: false } diff --git a/test/statsCases/cause-error/index.js b/test/statsCases/cause-error/index.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/statsCases/cause-error/webpack.config.js b/test/statsCases/cause-error/webpack.config.js new file mode 100644 index 00000000000..c12cd076fd6 --- /dev/null +++ b/test/statsCases/cause-error/webpack.config.js @@ -0,0 +1,132 @@ +const WebpackError = require("../../../lib/WebpackError"); + +/** @typedef {Error & { cause?: unknown }} ErrorWithCause */ + +/** + * @param {string} message message + * @param {{ cause: unknown }} options options + * @returns {ErrorWithCause} error with cause + */ +function createErrorWithCause(message, options) { + // @ts-expect-error for tests + const error = new Error(message, options); + + if (typeof (/** @type {ErrorWithCause} */ (error).cause) === "undefined") { + /** @type {ErrorWithCause} */ + (error).cause = options.cause; + } + + return error; +} + +/** @typedef {WebpackError & { cause?: unknown }} WebpackErrorWithCause */ + +/** + * @param {string} message message + * @param {{ cause: unknown }} options options + * @returns {WebpackErrorWithCause} error with cause + */ +function createWebpackErrorWithCause(message, options) { + const error = new WebpackError(message, options); + + if (typeof error.cause === "undefined") { + /** @type {WebpackErrorWithCause} */ + (error).cause = options.cause; + } + + return error; +} + +/** @typedef {Error & { cause?: unknown, errors: EXPECTED_ANY[] }} AggregateError */ + +/** + * @param {EXPECTED_ANY[]} errors errors + * @param {string} message message + * @param {{ cause?: unknown }=} options options + * @returns {AggregateError} error with errors and cause + */ +function createAggregateError(errors, message, options = {}) { + // @ts-expect-error for tests + if (typeof AggregateError === "undefined") { + const error = new Error(message); + + if (options.cause) { + /** @type {AggregateError} */ + (error).cause = options.cause; + } + + /** @type {AggregateError} */ + (error).errors = errors; + + return /** @type {AggregateError} */ (error); + } + + // @ts-expect-error for tests + return new AggregateError(errors, message, options); +} + +/** @type {import("../../../").Configuration} */ +module.exports = { + name: `error cause`, + mode: "development", + entry: "./index.js", + plugins: [ + compiler => { + compiler.hooks.compilation.tap("Test", compilation => { + const errCauseErr = createErrorWithCause("error with case", { + cause: new Error("error case") + }); + compilation.errors.push(errCauseErr); + compilation.warnings.push(errCauseErr); + const errCauseErrCauseErr = createErrorWithCause( + "error with nested error case", + { + cause: createErrorWithCause("test", { + cause: new Error("nested case") + }) + } + ); + compilation.errors.push(errCauseErrCauseErr); + compilation.warnings.push(errCauseErrCauseErr); + const errCauseStr = createErrorWithCause("error with string case", { + cause: "string case" + }); + compilation.errors.push(errCauseStr); + compilation.warnings.push(errCauseStr); + const aggregateError = createAggregateError( + [ + createErrorWithCause("first error", { + cause: createErrorWithCause("cause", { + cause: new Error("nested cause in errors") + }) + }), + "second string error", + createAggregateError( + [new Error("nested first"), new Error("nested second")], + "third nested aggregate error" + ) + ], + "aggregate error", + { + cause: createErrorWithCause("cause\ncause\ncause", { + cause: "nested string cause" + }) + } + ); + compilation.errors.push(aggregateError); + compilation.warnings.push(aggregateError); + const webpackError = new WebpackError("webpack error"); + compilation.errors.push(webpackError); + compilation.warnings.push(webpackError); + const webpackErrorCause = createWebpackErrorWithCause( + "webpack error with case", + { + cause: new Error("cause") + } + ); + compilation.errors.push(webpackErrorCause); + compilation.warnings.push(webpackErrorCause); + }); + } + ] +}; diff --git a/test/statsCases/child-compiler-apply-entry-option/TestApplyEntryOptionPlugin.js b/test/statsCases/child-compiler-apply-entry-option/TestApplyEntryOptionPlugin.js new file mode 100644 index 00000000000..2b86c7a16a5 --- /dev/null +++ b/test/statsCases/child-compiler-apply-entry-option/TestApplyEntryOptionPlugin.js @@ -0,0 +1,34 @@ +"use strict"; + +/** @typedef {import("../../../").Configuration} Configuration */ +/** @typedef {import("../../../").Compiler} Compiler */ + +var EntryOptionPlugin = require("../../../").EntryOptionPlugin; +var getNormalizedWebpackOptions = require("../../../").config.getNormalizedWebpackOptions; + +/** + * Use the static method in EntryOptionPlugin to + * apply entry option for the child compiler. + */ +module.exports = class TestApplyEntryOptionPlugin { + /** + * @param {Configuration} options options + */ + constructor(options) { + this.options = getNormalizedWebpackOptions(options); + } + + /** + * @param {Compiler} compiler compiler + */ + apply(compiler) { + compiler.hooks.make.tapAsync( + "TestApplyEntryOptionPlugin", + (compilation, cb) => { + const child = compilation.createChildCompiler("TestApplyEntryOptionPlugin"); + EntryOptionPlugin.applyEntryOption(child, compilation.compiler.context, this.options.entry); + child.runAsChild(/** @type {EXPECTED_ANY} */ (cb)) + } + ) + } +} diff --git a/test/statsCases/child-compiler-apply-entry-option/child.js b/test/statsCases/child-compiler-apply-entry-option/child.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/statsCases/child-compiler-apply-entry-option/parent.js b/test/statsCases/child-compiler-apply-entry-option/parent.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/statsCases/child-compiler-apply-entry-option/webpack.config.js b/test/statsCases/child-compiler-apply-entry-option/webpack.config.js new file mode 100644 index 00000000000..6af34e475cf --- /dev/null +++ b/test/statsCases/child-compiler-apply-entry-option/webpack.config.js @@ -0,0 +1,24 @@ +"use strict"; + +const TestApplyEntryOptionPlugin = require("./TestApplyEntryOptionPlugin"); + +/** @type {import("../../../").Configuration} */ +module.exports = { + entry: { + parent: "./parent" + }, + output: { + filename: "[name].js" + }, + plugins: [ + new TestApplyEntryOptionPlugin({ + entry: { + child: "./child" + } + }) + ], + stats: { + children: true, + entrypoints: true + } +}; diff --git a/test/statsCases/chunk-module-id-range/main1.js b/test/statsCases/chunk-module-id-range/main1.js index e1fd20493ca..5d6a58ab672 100644 --- a/test/statsCases/chunk-module-id-range/main1.js +++ b/test/statsCases/chunk-module-id-range/main1.js @@ -1,4 +1,5 @@ -import "./a"; -import "./b"; -import "./c"; -import "./d"; +import a from "./a"; +import b from "./b"; +import c from "./c"; +import d from "./d"; +console.log(a, b, c, d); diff --git a/test/statsCases/chunk-module-id-range/main2.js b/test/statsCases/chunk-module-id-range/main2.js index 4b63b624398..12605f9f94e 100644 --- a/test/statsCases/chunk-module-id-range/main2.js +++ b/test/statsCases/chunk-module-id-range/main2.js @@ -1,4 +1,5 @@ -import "./a"; -import "./d"; -import "./e"; -import "./f"; +import a from "./a"; +import d from "./d"; +import e from "./e"; +import f from "./f"; +console.log(a, d, e, f); diff --git a/test/statsCases/chunk-module-id-range/webpack.config.js b/test/statsCases/chunk-module-id-range/webpack.config.js index 621d9df4426..535f66f9656 100644 --- a/test/statsCases/chunk-module-id-range/webpack.config.js +++ b/test/statsCases/chunk-module-id-range/webpack.config.js @@ -1,5 +1,6 @@ const webpack = require("../../../"); +/** @type {import("../../../").Configuration} */ module.exports = { mode: "none", entry: { @@ -7,19 +8,20 @@ module.exports = { main2: "./main2" }, plugins: [ - new webpack.optimize.ChunkModuleIdRangePlugin({ + new webpack.ids.ChunkModuleIdRangePlugin({ name: "main1", start: 100, end: 102 }), - new webpack.optimize.ChunkModuleIdRangePlugin({ + new webpack.ids.ChunkModuleIdRangePlugin({ name: "main2", - order: "index2" + order: "postOrderIndex" }) ], stats: { chunks: true, chunkModules: true, + dependentModules: true, chunkOrigins: true, entrypoints: true, modules: false, diff --git a/test/statsCases/chunks-development/webpack.config.js b/test/statsCases/chunks-development/webpack.config.js index 9238988b4a3..655e7e2fa67 100644 --- a/test/statsCases/chunks-development/webpack.config.js +++ b/test/statsCases/chunks-development/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "development", entry: "./index", @@ -9,6 +10,8 @@ module.exports = { reasons: true, chunks: true, chunkModules: true, + dependentModules: true, + chunkRelations: true, chunkOrigins: true, modules: false, publicPath: true diff --git a/test/statsCases/chunks/webpack.config.js b/test/statsCases/chunks/webpack.config.js index d8fe054d800..7eb0b143658 100644 --- a/test/statsCases/chunks/webpack.config.js +++ b/test/statsCases/chunks/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", @@ -9,6 +10,8 @@ module.exports = { reasons: true, chunks: true, chunkModules: true, + dependentModules: true, + chunkRelations: true, chunkOrigins: true, modules: false, publicPath: true diff --git a/test/statsCases/circular-correctness/webpack.config.js b/test/statsCases/circular-correctness/webpack.config.js index 8be75aa1e72..4322ee12726 100644 --- a/test/statsCases/circular-correctness/webpack.config.js +++ b/test/statsCases/circular-correctness/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", @@ -10,7 +11,9 @@ module.exports = { builtAt: false, assets: false, chunks: true, + chunkRelations: true, chunkModules: true, + dependentModules: true, modules: false } }; diff --git a/test/statsCases/color-disabled/webpack.config.js b/test/statsCases/color-disabled/webpack.config.js index 1ef4d9dca70..5d137823375 100644 --- a/test/statsCases/color-disabled/webpack.config.js +++ b/test/statsCases/color-disabled/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", diff --git a/test/statsCases/color-enabled-custom/webpack.config.js b/test/statsCases/color-enabled-custom/webpack.config.js index 92a8a2296f6..346b1c20df4 100644 --- a/test/statsCases/color-enabled-custom/webpack.config.js +++ b/test/statsCases/color-enabled-custom/webpack.config.js @@ -1,10 +1,11 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", stats: { colors: { - yellow: "\u001b[33m", - green: "\u001b[32m" + yellow: "\u001B[33m", + green: "\u001B[32m" } } }; diff --git a/test/statsCases/color-enabled/webpack.config.js b/test/statsCases/color-enabled/webpack.config.js index e2970eccae9..8db94e7367b 100644 --- a/test/statsCases/color-enabled/webpack.config.js +++ b/test/statsCases/color-enabled/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", diff --git a/test/statsCases/common-libs/react.js b/test/statsCases/common-libs/react.js new file mode 100644 index 00000000000..bb4067571b5 --- /dev/null +++ b/test/statsCases/common-libs/react.js @@ -0,0 +1,3 @@ +import * as React from "react"; + +console.log(React.createElement("div")); diff --git a/test/statsCases/common-libs/webpack.config.js b/test/statsCases/common-libs/webpack.config.js new file mode 100644 index 00000000000..d5049a1bdde --- /dev/null +++ b/test/statsCases/common-libs/webpack.config.js @@ -0,0 +1,11 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + mode: "production", + entry: { + react: "./react" + }, + optimization: { + minimize: true, + chunkIds: "named" + } +}; diff --git a/test/statsCases/commons-chunk-min-size-0/webpack.config.js b/test/statsCases/commons-chunk-min-size-0/webpack.config.js index 7a7759a70b5..a68deca161b 100644 --- a/test/statsCases/commons-chunk-min-size-0/webpack.config.js +++ b/test/statsCases/commons-chunk-min-size-0/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: { diff --git a/test/statsCases/commons-chunk-min-size-Infinity/webpack.config.js b/test/statsCases/commons-chunk-min-size-Infinity/webpack.config.js index 38d753566a7..b4b0364a3af 100644 --- a/test/statsCases/commons-chunk-min-size-Infinity/webpack.config.js +++ b/test/statsCases/commons-chunk-min-size-Infinity/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: { diff --git a/test/statsCases/commons-plugin-issue-4980/webpack.config.js b/test/statsCases/commons-plugin-issue-4980/webpack.config.js index ae2b553f564..eac99f48beb 100644 --- a/test/statsCases/commons-plugin-issue-4980/webpack.config.js +++ b/test/statsCases/commons-plugin-issue-4980/webpack.config.js @@ -1,9 +1,10 @@ // should generate vendor chunk with the same chunkhash for both entries +/** @type {import("../../../").Configuration[]} */ module.exports = [ { mode: "production", output: { - chunkFilename: "[name].[chunkhash].js" + filename: "[name].[chunkhash]-1.js" }, entry: { app: "./entry-1.js" @@ -18,14 +19,13 @@ module.exports = [ test: /constants/ } } - }, - namedModules: true + } } }, { mode: "production", output: { - chunkFilename: "[name].[chunkhash].js" + filename: "[name].[chunkhash]-2.js" }, entry: { app: "./entry-2.js" @@ -40,8 +40,7 @@ module.exports = [ test: /constants/ } } - }, - namedModules: true + } } } ]; diff --git a/test/statsCases/concat-and-sideeffects/webpack.config.js b/test/statsCases/concat-and-sideeffects/webpack.config.js index 54bafcedcac..14ef0be999d 100644 --- a/test/statsCases/concat-and-sideeffects/webpack.config.js +++ b/test/statsCases/concat-and-sideeffects/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", @@ -5,6 +6,7 @@ module.exports = { all: false, modules: true, nestedModules: true, + orphanModules: true, optimizationBailout: true } }; diff --git a/test/statsCases/context-independence/a/c/a.js b/test/statsCases/context-independence/a/c/a.js new file mode 100644 index 00000000000..842e368a0a2 --- /dev/null +++ b/test/statsCases/context-independence/a/c/a.js @@ -0,0 +1 @@ +export default 2; diff --git a/test/statsCases/context-independence/a/cc/b.js b/test/statsCases/context-independence/a/cc/b.js new file mode 100644 index 00000000000..aef22247d75 --- /dev/null +++ b/test/statsCases/context-independence/a/cc/b.js @@ -0,0 +1 @@ +export default 1; diff --git a/test/statsCases/context-independence/a/chunk.js b/test/statsCases/context-independence/a/chunk.js new file mode 100644 index 00000000000..a1aa81e2f5b --- /dev/null +++ b/test/statsCases/context-independence/a/chunk.js @@ -0,0 +1,2 @@ +import test from "./module"; +console.log(test); diff --git a/test/statsCases/context-independence/a/index.js b/test/statsCases/context-independence/a/index.js new file mode 100644 index 00000000000..82c137c9a63 --- /dev/null +++ b/test/statsCases/context-independence/a/index.js @@ -0,0 +1,4 @@ +console.log("test"); +import("./chunk"); +const module = Math.round(Math.random() * 100) % 2 === 0 ? "a" : "b"; +import(/* webpackMode: "eager" */`c/${module}`).then(({ default: d }) => console.log(d)); diff --git a/test/statsCases/context-independence/a/module.js b/test/statsCases/context-independence/a/module.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/statsCases/context-independence/a/module.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/statsCases/context-independence/b/c/a.js b/test/statsCases/context-independence/b/c/a.js new file mode 100644 index 00000000000..842e368a0a2 --- /dev/null +++ b/test/statsCases/context-independence/b/c/a.js @@ -0,0 +1 @@ +export default 2; diff --git a/test/statsCases/context-independence/b/cc/b.js b/test/statsCases/context-independence/b/cc/b.js new file mode 100644 index 00000000000..aef22247d75 --- /dev/null +++ b/test/statsCases/context-independence/b/cc/b.js @@ -0,0 +1 @@ +export default 1; diff --git a/test/statsCases/context-independence/b/chunk.js b/test/statsCases/context-independence/b/chunk.js new file mode 100644 index 00000000000..a1aa81e2f5b --- /dev/null +++ b/test/statsCases/context-independence/b/chunk.js @@ -0,0 +1,2 @@ +import test from "./module"; +console.log(test); diff --git a/test/statsCases/context-independence/b/index.js b/test/statsCases/context-independence/b/index.js new file mode 100644 index 00000000000..82c137c9a63 --- /dev/null +++ b/test/statsCases/context-independence/b/index.js @@ -0,0 +1,4 @@ +console.log("test"); +import("./chunk"); +const module = Math.round(Math.random() * 100) % 2 === 0 ? "a" : "b"; +import(/* webpackMode: "eager" */`c/${module}`).then(({ default: d }) => console.log(d)); diff --git a/test/statsCases/context-independence/b/module.js b/test/statsCases/context-independence/b/module.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/statsCases/context-independence/b/module.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/statsCases/context-independence/test.config.js b/test/statsCases/context-independence/test.config.js new file mode 100644 index 00000000000..305c9bb3133 --- /dev/null +++ b/test/statsCases/context-independence/test.config.js @@ -0,0 +1,9 @@ +module.exports = { + validate(stats) { + for (let i = 0; i < stats.stats.length; i += 2) { + const a = stats.stats[i].compilation.hash; + const b = stats.stats[i + 1].compilation.hash; + expect(a).toBe(b); + } + } +}; diff --git a/test/statsCases/context-independence/webpack.config.js b/test/statsCases/context-independence/webpack.config.js new file mode 100644 index 00000000000..87a0ba0fe9f --- /dev/null +++ b/test/statsCases/context-independence/webpack.config.js @@ -0,0 +1,58 @@ +const path = require("path"); + +/** + * @param {string} name name + * @param {string} devtool devtool + * @returns {import("../../../").Configuration} configuration + */ +const base = (name, devtool) => ({ + mode: "production", + devtool, + module: { + rules: [ + { + test: /chunk/, + loader: "babel-loader", + options: {} + } + ] + }, + stats: { + relatedAssets: true + }, + experiments: { + layers: true + }, + entry: { + main: { + import: "./index", + layer: "my-layer" + } + }, + context: path.resolve(__dirname, name), + output: { + path: path.resolve( + __dirname, + `../../js/stats/context-independence/${devtool}-${name}` + ), + filename: "[name]-[chunkhash].js" + }, + resolve: { + alias: { + c: [ + path.resolve(__dirname, name, "c"), + path.resolve(__dirname, name, "cc") + ] + } + } +}); + +/** @type {import("../../../").Configuration[]} */ +module.exports = [ + base("a", "source-map"), + base("b", "source-map"), + base("a", "eval-source-map"), + base("b", "eval-source-map"), + base("a", "eval"), + base("b", "eval") +]; diff --git a/test/statsCases/custom-terser/a.js b/test/statsCases/custom-terser/a.js new file mode 100644 index 00000000000..df03320b17d --- /dev/null +++ b/test/statsCases/custom-terser/a.js @@ -0,0 +1 @@ +module.exports = function someUsedFunction() {}; diff --git a/test/statsCases/custom-terser/index.js b/test/statsCases/custom-terser/index.js new file mode 100644 index 00000000000..6a3edce707e --- /dev/null +++ b/test/statsCases/custom-terser/index.js @@ -0,0 +1,6 @@ +var someRequiredUsedFunction = require("./a"); + +function someUsedFunction() {} + +someRequiredUsedFunction(); +someUsedFunction(); diff --git a/test/statsCases/custom-terser/webpack.config.js b/test/statsCases/custom-terser/webpack.config.js new file mode 100644 index 00000000000..1216f81decc --- /dev/null +++ b/test/statsCases/custom-terser/webpack.config.js @@ -0,0 +1,29 @@ +const TerserPlugin = require("terser-webpack-plugin"); +/** @type {import("../../../").Configuration} */ +module.exports = { + mode: "production", + entry: "./index", + output: { + filename: "bundle.js" + }, + optimization: { + minimize: true, + minimizer: [ + new TerserPlugin({ + terserOptions: { + mangle: false, + output: { + beautify: true, + comments: false + } + } + }) + ] + }, + stats: { + chunkModules: false, + modules: true, + providedExports: true, + usedExports: true + } +}; diff --git a/test/statsCases/define-plugin/webpack.config.js b/test/statsCases/define-plugin/webpack.config.js index e5b72f1d595..b8f31259557 100644 --- a/test/statsCases/define-plugin/webpack.config.js +++ b/test/statsCases/define-plugin/webpack.config.js @@ -1,17 +1,25 @@ -var webpack = require("../../../"); -var fs = require("fs"); -var join = require("path").join; +const webpack = require("../../../"); +const fs = require("fs"); +const join = require("path").join; +/** + * @param {string} path path + * @returns {string} JSON content of a file + */ function read(path) { return JSON.stringify( - fs.readFileSync(join(__dirname, path), "utf8").replace(/\r\n/g, "\n") + fs.readFileSync(join(__dirname, path), "utf8").replace(/\r\n?/g, "\n") ); } +/** @type {import("../../../").Configuration[]} */ module.exports = [ { mode: "production", entry: "./index", + output: { + filename: "123.js" + }, plugins: [ new webpack.DefinePlugin({ VALUE: "123" @@ -22,6 +30,9 @@ module.exports = [ { mode: "production", entry: "./index", + output: { + filename: "321.js" + }, plugins: [ new webpack.DefinePlugin({ VALUE: "321" @@ -32,16 +43,42 @@ module.exports = [ { mode: "production", entry: "./index", + output: { + filename: "both.js" + }, plugins: [ new webpack.DefinePlugin({ - VALUE: webpack.DefinePlugin.runtimeValue(() => read("123.txt"), [ - "./123.txt" - ]) + VALUE: webpack.DefinePlugin.runtimeValue( + () => read("123.txt"), + [join(__dirname, "./123.txt")] + ) }), new webpack.DefinePlugin({ - VALUE: webpack.DefinePlugin.runtimeValue(() => read("321.txt"), [ - "./321.txt" - ]) + VALUE: webpack.DefinePlugin.runtimeValue( + () => read("321.txt"), + [join(__dirname, "./321.txt")] + ) + }) + ] + }, + + { + mode: "production", + entry: "./index", + output: { + filename: "log.js" + }, + infrastructureLogging: { + debug: /DefinePlugin/, + level: "none" + }, + stats: { + loggingDebug: /DefinePlugin/, + logging: "none" + }, + plugins: [ + new webpack.DefinePlugin({ + VALUE: "123" }) ] } diff --git a/test/statsCases/details-error/index.js b/test/statsCases/details-error/index.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/statsCases/details-error/webpack.config.js b/test/statsCases/details-error/webpack.config.js new file mode 100644 index 00000000000..5196ef59a00 --- /dev/null +++ b/test/statsCases/details-error/webpack.config.js @@ -0,0 +1,21 @@ +const { WebpackError } = require("../../../"); + +/** @type {import("../../../").Configuration[]} */ +module.exports = [0, 1, 10, 2, 20, 11, 12, 13, 3, 30].map(n => ({ + name: `${n % 10} errors ${(n / 10) | 0} warnings`, + mode: "development", + output: { + filename: `${n}.js` + }, + entry: "./index.js", + plugins: [ + compiler => { + compiler.hooks.compilation.tap("Test", compilation => { + const err = new WebpackError("Test"); + err.details = "Error details"; + for (let i = n % 10; i > 0; i--) compilation.errors.push(err); + for (let i = (n / 10) | 0; i > 0; i--) compilation.warnings.push(err); + }); + } + ] +})); diff --git a/test/statsCases/dll-reference-plugin-issue-7624-error/webpack.config.js b/test/statsCases/dll-reference-plugin-issue-7624-error/webpack.config.js index aa0403c269b..72ca2fa1371 100644 --- a/test/statsCases/dll-reference-plugin-issue-7624-error/webpack.config.js +++ b/test/statsCases/dll-reference-plugin-issue-7624-error/webpack.config.js @@ -1,5 +1,6 @@ -var webpack = require("../../../"); +const webpack = require("../../../"); +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./entry.js", @@ -8,7 +9,7 @@ module.exports = { }, plugins: [ new webpack.DllReferencePlugin({ - manifest: __dirname + "/blank-manifest.json", + manifest: `${__dirname}/blank-manifest.json`, name: "blank-manifest" }) ] diff --git a/test/statsCases/dll-reference-plugin-issue-7624/webpack.config.js b/test/statsCases/dll-reference-plugin-issue-7624/webpack.config.js index cfd2bfe9301..18e1b93235f 100644 --- a/test/statsCases/dll-reference-plugin-issue-7624/webpack.config.js +++ b/test/statsCases/dll-reference-plugin-issue-7624/webpack.config.js @@ -1,5 +1,6 @@ -var webpack = require("../../../"); +const webpack = require("../../../"); +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./entry.js", @@ -8,7 +9,7 @@ module.exports = { }, plugins: [ new webpack.DllReferencePlugin({ - manifest: __dirname + "/non-blank-manifest.json", + manifest: `${__dirname}/non-blank-manifest.json`, name: "non-blank-manifest" }) ] diff --git a/test/statsCases/dynamic-chunk-name-error/dynamic.js b/test/statsCases/dynamic-chunk-name-error/dynamic.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/statsCases/dynamic-chunk-name-error/entry-1.js b/test/statsCases/dynamic-chunk-name-error/entry-1.js new file mode 100644 index 00000000000..3f3ecf41b39 --- /dev/null +++ b/test/statsCases/dynamic-chunk-name-error/entry-1.js @@ -0,0 +1 @@ +(() => import(/* webpackChunkName: "entry2" */"./dynamic"))(); diff --git a/test/statsCases/dynamic-chunk-name-error/entry-2.js b/test/statsCases/dynamic-chunk-name-error/entry-2.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/statsCases/dynamic-chunk-name-error/entry-3.js b/test/statsCases/dynamic-chunk-name-error/entry-3.js new file mode 100644 index 00000000000..130f70d2aab --- /dev/null +++ b/test/statsCases/dynamic-chunk-name-error/entry-3.js @@ -0,0 +1 @@ +(() => import(/* webpackChunkName: "entry3" */"./dynamic"))(); diff --git a/test/statsCases/dynamic-chunk-name-error/webpack.config.js b/test/statsCases/dynamic-chunk-name-error/webpack.config.js new file mode 100644 index 00000000000..ac1c74fe1f0 --- /dev/null +++ b/test/statsCases/dynamic-chunk-name-error/webpack.config.js @@ -0,0 +1,9 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + mode: "production", + entry: { + entry1: "./entry-1.js", + entry2: "./entry-2.js", + entry3: "./entry-3.js" + } +}; diff --git a/test/statsCases/dynamic-import/babel.config.js b/test/statsCases/dynamic-import/babel.config.js new file mode 100644 index 00000000000..edc34867946 --- /dev/null +++ b/test/statsCases/dynamic-import/babel.config.js @@ -0,0 +1,6 @@ +module.exports = { + presets: [ + ['@babel/preset-react', { runtime: 'automatic' }], + ], + sourceType: 'unambiguous' +}; diff --git a/test/statsCases/dynamic-import/src/index.js b/test/statsCases/dynamic-import/src/index.js new file mode 100644 index 00000000000..e67e03b84b1 --- /dev/null +++ b/test/statsCases/dynamic-import/src/index.js @@ -0,0 +1,25 @@ +import React from 'react' +import { createRoot } from 'react-dom/client' + +const Loading = () => 'Loading...' + +class AsyncComponent extends React.Component { + + state = { Component: Loading } + + constructor(props) { + super(props) + import(/* webpackChunkName: 'pages/[request]' */ `./pages/${props.page}`) + .then(({ default: Component }) => this.setState({ Component })) + } + + render() { + const { state: { Component } } = this + return + } +} + +const App = () => +const root = createRoot(document.getElementById('app')) + +root.render() diff --git a/test/statsCases/dynamic-import/src/pages/home.js b/test/statsCases/dynamic-import/src/pages/home.js new file mode 100644 index 00000000000..85a85369497 --- /dev/null +++ b/test/statsCases/dynamic-import/src/pages/home.js @@ -0,0 +1,29 @@ + +const paths = [ + '1111 1111111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 11 111 11 111 11 111 11 111 11 11111 111111 111 11 111 11 111 111 11 111 11 111 11 111 111 111 111 111 111 1111 111 1111 111 1111 111 111 111 111 111 111 111 1111 111 111 111 111 111 111 111 111 1111', + '1111 1111111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 11 111 11 111 11 111 11 111 11 111 11 111 11 111 11 111 11 111 11 111 11 111 11 111 11 111 11 111 11 11111 111111 111 11 111 11 111 111 11 111 11 111 11 111 111 111 111 111 111 1111 111 1111 111 1111 111 111 111 111 111 111 111 1111 111 111 111 111 111 111 111 111 1111', + '1111 1111111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 11 111 11 111 11 111 1 11111 11111 11111 11111 11111 11111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 1111', + '1111 1111111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 11 111 11 111 11 111 11 111 11 111 11 111 11 11111 11111 11111 11111 11111 11111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 1111', + '1111 1111111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 11 111 11 111 11 111 11 111 11 111 11 111 11 111 11 111 11 111 11 111 11 111 11 111 11 111 11 111 11 111 1 11111 11111 11111 11111 11111 11111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 111 1111', + '1111 11111111 1111 111111111111 11111111111 11 111 111 111 111 111 111111 111 11 111 11 11 11 1111 1111 1111 1111 11 1 1111 1111 11 1 11 11 11 1 1111 11 1 11 11 11 11 111 1 11111 1111111111111111111111 11 11 11 11 11 11 1 11 1111 1111 11111 111111 1111 11 1111 11111 11111 11111 11 1 11 1 11 11 11111111111111111111111111 11111 11111111111111111 1111 1111 11111 11111 11111 11111 11111 11111 11 1 11 11 1 111 1 11111 11111 1111 1111 11 11 11 11 11 1 11 11 111 1 11 1 11111 1111 1111111111 1 11 11 11 11 11 1 11 111 11111 11111 11111 11 1111 11111 11111 11111 11 1 11 11 11 1 11111111111111111111111111111 1111 111111 11111111111111 1111 11111111 111 111 111 111 1111', + '1111 11111111 1111 111111111111 11111111111 111 111 111 111 111 111 111111 111 11 111 11 11 11 11111 11111 11111 11111 11 1 1111 1111 11 1 11 11 11 11 1111 11 1 11 11 11 11 11111 11111 1111111111111111111111 11 11 11 11 11 11 1 11 1111 1111 11111 111111 1111 11 1111 11111 11111 11111 11 1 11 1 11 11 111111111111111111 1111111 1111 11111111111111111 111111111 11111 11111 11111 11111 11111 11111 11 1 11 11111 111111 11111 11111 1111 11 1 11 11 11 11 11 1 11 11 111 11 11 11 11111 1111 1111111111 1 11 11 11 11 11 1 11 111 11111 11111 11111 11 1111 11111 11111 11111 11 1 11 11 11 1 1111111111111111111111111111111111111111111111111111111111 1111111111111 111 111 111 111 1111', + '1111 11111 1111111111111111 1111 11111 111111 111 1 11 1 1111 111 11 1 1 1 1111 1111 11 11 11 11 1111 1111 11 1 11 1 1111 1111 11111 1111 11 1111 11 11111 11111 11111111111 1111 11111 11 11111 111111111111111111111111111v111h111V1111111 11111 11111 11111 1111 11111 111 1 11 1 11111 11111 11 11 11 11 11111 111111 111 11 11 11 11 11111 11 1111 11111 1111111111 1111 11111 11 11111 1111111111111111 1111 1111V1111', + '1111 11111 1111111111111111 1111 11111 11111 111111 11111 1111 111 11 1 1 1 1111 1111 11 11 11 11 1111 1111 11 11 11 1 11 1 11 1 1111 11 1 11 1111 11 11111 11111 11111111111 1111 11111 11 11111 111111111111111111111111111v111h111V1111111 11111 11111 11111 11111 11111 11 1 11 1 11111 1111 11 11 11 11 11 1 111 1 111 11 11 11 11 11111 11 1111 11111 1111111111 1111 11111 11 11111 1111111111111111 1111 1111V1111', + '1111 11111 1111111111111111 1111 11111 11111 111111 11111 1111 111 11 1 1 1 1111 1111 11 11 11 11 1111 1111 11 11 11 1 11 1 11 1 1111 11 1 11 1111 11 11111 11111 11111111111 1111 11111 11 11111 111111111111111111111111111v111h111V1111111 11111 11111 11111 11111 11111 11 1 11 1 11111 1111 11 11 11 11 11 1 111 1 111 11 11 11 11 11111 11 1111 11111 1111111111 1111 11111 11 11111 1111111111111111 1111 1111V1111', + '1111 11111 1111111111111111 1111 11111 11111 111111 11111 1111 111 11 1 1 1 1111 1111 11 11 11 11 1111 1111 11 11 11 1 11 1 11 1 1111 11 1 11 1111 11 11111 11111 11111111111 1111 11111 11 11111 111111111111111111111111111v111h111V1111111 11111 11111 11111 11111 11111 11 1 11 1 11111 1111 11 11 11 11 11 1 111 1 111 11 11 11 11 11111 11 1111 11111 1111111111 1111 11111 11 11111 1111111111111111 1111 1111V1111', + '1111 11111 1111111111111111 1111 11111 11111 111111 11111 1111 111 11 1 1 1 1111 1111 11 11 11 11 1111 1111 11 11 11 1 11 1 11 1 1111 11 1 11 1111 11 11111 11111 11111111111 1111 11111 11 11111 111111111111111111111111111v111h111V1111111 11111 11111 11111 11111 11111 11 1 11 1 11111 1111 11 11 11 11 11 1 111 1 111 11 11 11 11 11111 11 1111 11111 1111111111 1111 11111 11 11111 1111111111111111 1111 1111V1111', + '1111 11111 1111111111111111 1111 11111 11111 111111 11111 1111 111 11 1 1 1 1111 1111 11 11 11 11 1111 1111 11 11 11 1 11 1 11 1 1111 11 1 11 1111 11 11111 11111 11111111111 1111 11111 11 11111 111111111111111111111111111v111h111V1111111 11111 11111 11111 11111 11111 11 1 11 1 11111 1111 11 11 11 11 11 1 111 1 111 11 11 11 11 11111 11 1111 11111 1111111111 1111 11111 11 11111 1111111111111111 1111 1111V1111', + '1111 11111 1111111111111111 1111 11111 11111 111111 11111 1111 111 11 1 1 1 1111 1111 11 11 11 11 1111 1111 11 11 11 1 11 1 11 1 1111 11 1 11 1111 11 11111 11111 11111111111 1111 11111 11 11111 111111111111111111111111111v111h111V1111111 11111 11111 11111 11111 11111 11 1 11 1 11111 1111 11 11 11 11 11 1 111 1 111 11 11 11 11 11111 11 1111 11111 1111111111 1111 11111 11 11111 1111111111111111 1111 1111V1111', + '1111 11111 1111111111111111 1111 11111 11111 111111 11111 1111 111 11 1 1 1 1111 1111 11 11 11 11 1111 1111 11 11 11 1 11 1 11 1 1111 11 1 11 1111 11 11111 11111 11111111111 1111 11111 11 11111 111111111111111111111111111v111h111V1111111 11111 11111 11111 11111 11111 11 1 11 1 11111 1111 11 11 11 11 11 1 111 1 111 11 11 11 11 11111 11 1111 11111 1111111111 1111 11111 11 11111 1111111111111111 1111 1111V1111', + '1111 11111 1111111111111111 1111 11111 11111 111111 11111 1111 111 11 1 1 1 1111 1111 11 11 11 11 1111 1111 11 11 11 1 11 1 11 1 1111 11 1 11 1111 11 11111 11111 11111111111 1111 11111 11 11111 111111111111111111111111111v111h111V1111111 11111 11111 11111 11111 11111 11 1 11 1 11111 1111 11 11 11 11 11 1 111 1 111 11 11 11 11 11111 11 1111 11111 1111111111 1111 11111 11 11111 1111111111111111 1111 1111V1111', + '1111 11111 1111111111111111 1111 11111 11111 111111 11111 1111 111 11 1 1 1 1111 1111 11 11 11 11 1111 1111 11 11 11 1 11 1 11 1 1111 11 1 11 1111 11 11111 11111 11111111111 1111 11111 11 11111 111111111111111111111111111v111h111V1111111 11111 11111 11111 11111 11111 11 1 11 1 11111 1111 11 11 11 11 11 1 111 1 111 11 11 11 11 11111 11 1111 11111 1111111111 1111 11111 11 11111 1111111111111111 1111 1111V1111', + '1111 11111 1111111111111111 1111 11111 11111 111111 11111 1111 111 11 1 1 1 1111 1111 11 11 11 11 1111 1111 11 11 11 1 11 1 11 1 1111 11 1 11 1111 11 11111 11111 11111111111 1111 11111 11 11111 111111111111111111111111111v111h111V1111111 11111 11111 11111 11111 11111 11 1 11 1 11111 1111 11 11 11 11 11 1 111 1 111 11 11 11 11 11111 11 1111 11111 1111111111 1111 11111 11 11111 1111111111111111 1111 1111V1111', + '1111 11111 1111111111111111 1111 11111 11111 111111 11111 1111 111 11 1 1 1 1111 1111 11 11 11 11 1111 1111 11 11 11 1 11 1 11 1 1111 11 1 11 1111 11 11111 11111 11111111111 1111 11111 11 11111 111111111111111111111111111v111h111V1111111 11111 11111 11111 11111 11111 11 1 11 1 11111 1111 11 11 11 11 11 1 111 1 111 11 11 11 11 11111 11 1111 11111 1111111111 1111 11111 11 11111 1111111111111111 1111 1111V1111', + '1111 11111 1111111111111111 1111 11111 11111 111111 11111 1111 111 11 1 1 1 1111 1111 11 11 11 11 1111 1111 11 11 11 1 11 1 11 1 1111 11 1 11 1111 11 11111 11111 11111111111 1111 11111 11 11111 111111111111111111111111111v111h111V1111111 11111 11111 11111 11111 11111 11 1 11 1 11111 1111 11 11 11 11 11 1 111 1 111 11 11 11 11 11111 11 1111 11111 1111111111 1111 11111 11 11111 1111111111111111 1111 1111V1111', + '1111 11111 1111111111111111 1111 11111 11111 111111 11111 1111 111 11 1 1 1 1111 1111 11 11 11 11 1111 1111 11 11 11 1 11 1 11 1 1111 11 1 11 1111 11 11111 11111 11111111111 1111 11111 11 11111 111111111111111111111111111v111h111V1111111 11111 11111 11111 11111 11111 11 1 11 1 11111 1111 11 11 11 11 11 1 111 1 111 11 11 11 11 11111 11 1111 11111 1111111111 1111 11111 11 11111 1111111111111111 1111 1111V1111', + '1111 11111 1111111111111111 1111 11111 11111 111111 11111 1111 111 11 1 1 1 1111 1111 11 11 11 11 1111 111', +] + +const Home = () =>

    Home

    + +export default Home diff --git a/test/statsCases/dynamic-import/webpack.config.js b/test/statsCases/dynamic-import/webpack.config.js new file mode 100644 index 00000000000..dccb55d1300 --- /dev/null +++ b/test/statsCases/dynamic-import/webpack.config.js @@ -0,0 +1,24 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + devtool: false, + mode: "development", + module: { + rules: [ + { + exclude: /node_modules/, + test: /\.[cm]?js$/, + use: { + loader: "babel-loader", + options: { + presets: [["@babel/preset-react", { runtime: "automatic" }]], + sourceType: "unambiguous" + } + } + } + ] + }, + optimization: { + runtimeChunk: "single", + splitChunks: { chunks: "all", name: "common" } + } +}; diff --git a/test/statsCases/entry-filename/a.js b/test/statsCases/entry-filename/a.js new file mode 100644 index 00000000000..6cd1d0075d4 --- /dev/null +++ b/test/statsCases/entry-filename/a.js @@ -0,0 +1 @@ +module.exports = "a"; diff --git a/test/statsCases/entry-filename/b.js b/test/statsCases/entry-filename/b.js new file mode 100644 index 00000000000..dfbbeb621fa --- /dev/null +++ b/test/statsCases/entry-filename/b.js @@ -0,0 +1 @@ +module.exports = "b"; diff --git a/test/statsCases/entry-filename/webpack.config.js b/test/statsCases/entry-filename/webpack.config.js new file mode 100644 index 00000000000..5efaf0330d3 --- /dev/null +++ b/test/statsCases/entry-filename/webpack.config.js @@ -0,0 +1,19 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + mode: "production", + entry: { + a: "./a.js", + b: { import: "./b.js", filename: "c.js" } + }, + profile: true, + stats: { + reasons: true, + chunks: true, + chunkModules: true, + dependentModules: true, + chunkRelations: true, + chunkOrigins: true, + modules: false, + publicPath: true + } +}; diff --git a/test/statsCases/errors-space-error/index.js b/test/statsCases/errors-space-error/index.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/statsCases/errors-space-error/loader.js b/test/statsCases/errors-space-error/loader.js new file mode 100644 index 00000000000..eb535791a3c --- /dev/null +++ b/test/statsCases/errors-space-error/loader.js @@ -0,0 +1,11 @@ +"use strict"; + +module.exports = function (content) { + let error = new Error("loader error1"); + error.stack = "stack1\nstack2\nstack3"; + this.emitError(error); + error = new Error("loader error2"); + error.stack = "stack1\nstack2"; + this.emitError(error); + return content; +} diff --git a/test/statsCases/errors-space-error/webpack.config.js b/test/statsCases/errors-space-error/webpack.config.js new file mode 100644 index 00000000000..4ea95efae2e --- /dev/null +++ b/test/statsCases/errors-space-error/webpack.config.js @@ -0,0 +1,51 @@ +/** @type {import("../../../").Configuration[]} */ +module.exports = [ + { + entry: "./loader!./index.js", + mode: "production", + stats: { + errorsSpace: 0, + errors: true + } + }, + { + entry: "./loader!./index.js", + mode: "production", + stats: { + errorsSpace: 2, // 2 errors (2 errors without details) + errors: true + } + }, + { + entry: "./loader!./index.js", + mode: "production", + stats: { + errorsSpace: 3, // 2 errors (2 errors without details) + errors: true + } + }, + { + entry: "./loader!./index.js", + mode: "production", + stats: { + errorsSpace: 4, // 2 errors + 2 lines (2 errors, one with partial details) + errors: true + } + }, + { + entry: "./loader!./index.js", + mode: "production", + stats: { + errorsSpace: 5, // 2 errors + 3 lines (2 errors, one full details) + errors: true + } + }, + { + entry: "./loader!./index.js", + mode: "production", + stats: { + errorsSpace: 100, + errors: true + } + } +]; diff --git a/test/statsCases/exclude-with-loader/webpack.config.js b/test/statsCases/exclude-with-loader/webpack.config.js index 46ce565d5a6..725e0252c5c 100644 --- a/test/statsCases/exclude-with-loader/webpack.config.js +++ b/test/statsCases/exclude-with-loader/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", @@ -17,6 +18,9 @@ module.exports = { { test: /\.json/, loader: "file-loader", + options: { + name: "[sha256:hash:8].[ext]" + }, type: "javascript/auto" } ] diff --git a/test/statsCases/external/webpack.config.js b/test/statsCases/external/webpack.config.js index 24daca96b94..9dcff537b42 100644 --- a/test/statsCases/external/webpack.config.js +++ b/test/statsCases/external/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", diff --git a/test/statsCases/filter-warnings/a.js b/test/statsCases/filter-warnings/a.js deleted file mode 100644 index c5264c9c2a8..00000000000 --- a/test/statsCases/filter-warnings/a.js +++ /dev/null @@ -1,7 +0,0 @@ -module.export = function someUsedFunction() {}; - -function someRemoteUnUsedFunction1() {} -function someRemoteUnUsedFunction2() {} -function someRemoteUnUsedFunction3() {} -function someRemoteUnUsedFunction4() {} -function someRemoteUnUsedFunction5() {} diff --git a/test/statsCases/filter-warnings/index.js b/test/statsCases/filter-warnings/index.js deleted file mode 100644 index e0b5278ba9c..00000000000 --- a/test/statsCases/filter-warnings/index.js +++ /dev/null @@ -1,12 +0,0 @@ -var someRequiredUsedFunction = require("./a"); - -function someUsedFunction() {} - -someRequiredUsedFunction(); -someUsedFunction(); - -function someUnUsedFunction1() {} -function someUnUsedFunction2() {} -function someUnUsedFunction3() {} -function someUnUsedFunction4() {} -function someUnUsedFunction5() {} diff --git a/test/statsCases/filter-warnings/webpack.config.js b/test/statsCases/filter-warnings/webpack.config.js deleted file mode 100644 index a6d75daffb5..00000000000 --- a/test/statsCases/filter-warnings/webpack.config.js +++ /dev/null @@ -1,56 +0,0 @@ -const TerserPlugin = require("terser-webpack-plugin"); -const baseConfig = { - mode: "production", - entry: "./index", - output: { - filename: "bundle.js" - }, - optimization: { - minimize: true, - minimizer: [ - new TerserPlugin({ - sourceMap: true, - terserOptions: { - compress: { - warnings: true - }, - mangle: false, - output: { - beautify: true, - comments: false - }, - warnings: true - } - }) - ] - }, - stats: { - chunkModules: false, - modules: false, - providedExports: false, - usedExports: false - } -}; - -module.exports = [ - undefined, - "Terser", - /Terser/, - warnings => true, - ["Terser"], - [/Terser/], - [warnings => true], - "should not filter", - /should not filter/, - warnings => false, - ["should not filter"], - [/should not filter/], - [warnings => false] -].map(filter => - Object.assign({}, baseConfig, { - name: Array.isArray(filter) ? `[${filter}]` : `${filter}`, - stats: Object.assign({}, baseConfig.stats, { - warningsFilter: filter - }) - }) -); diff --git a/test/statsCases/graph-correctness-entries/webpack.config.js b/test/statsCases/graph-correctness-entries/webpack.config.js index f6f18dc87d3..b47eedfe1de 100644 --- a/test/statsCases/graph-correctness-entries/webpack.config.js +++ b/test/statsCases/graph-correctness-entries/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: { @@ -13,7 +14,9 @@ module.exports = { builtAt: false, assets: false, chunks: true, + chunkRelations: true, chunkModules: true, + dependentModules: true, modules: false, reasons: true } diff --git a/test/statsCases/graph-correctness-modules/webpack.config.js b/test/statsCases/graph-correctness-modules/webpack.config.js index f6f18dc87d3..b47eedfe1de 100644 --- a/test/statsCases/graph-correctness-modules/webpack.config.js +++ b/test/statsCases/graph-correctness-modules/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: { @@ -13,7 +14,9 @@ module.exports = { builtAt: false, assets: false, chunks: true, + chunkRelations: true, chunkModules: true, + dependentModules: true, modules: false, reasons: true } diff --git a/test/statsCases/graph-roots/cycle/a.js b/test/statsCases/graph-roots/cycle/a.js new file mode 100644 index 00000000000..9c6c66302ee --- /dev/null +++ b/test/statsCases/graph-roots/cycle/a.js @@ -0,0 +1,2 @@ +import a from "./b"; +export default a; diff --git a/test/statsCases/graph-roots/cycle/b.js b/test/statsCases/graph-roots/cycle/b.js new file mode 100644 index 00000000000..208cd1110c1 --- /dev/null +++ b/test/statsCases/graph-roots/cycle/b.js @@ -0,0 +1,2 @@ +import c from "./c"; +export default c; diff --git a/test/statsCases/graph-roots/cycle/c.js b/test/statsCases/graph-roots/cycle/c.js new file mode 100644 index 00000000000..ec10282253f --- /dev/null +++ b/test/statsCases/graph-roots/cycle/c.js @@ -0,0 +1,2 @@ +import index from "./index"; +export default index; diff --git a/test/statsCases/graph-roots/cycle/index.js b/test/statsCases/graph-roots/cycle/index.js new file mode 100644 index 00000000000..b03f31d5d7e --- /dev/null +++ b/test/statsCases/graph-roots/cycle/index.js @@ -0,0 +1,2 @@ +import a from "./a"; +export default a; diff --git a/test/statsCases/graph-roots/cycle2/a.js b/test/statsCases/graph-roots/cycle2/a.js new file mode 100644 index 00000000000..112389178f1 --- /dev/null +++ b/test/statsCases/graph-roots/cycle2/a.js @@ -0,0 +1,2 @@ +import b from "./b"; +export default b; diff --git a/test/statsCases/graph-roots/cycle2/b.js b/test/statsCases/graph-roots/cycle2/b.js new file mode 100644 index 00000000000..e2cdc188927 --- /dev/null +++ b/test/statsCases/graph-roots/cycle2/b.js @@ -0,0 +1,3 @@ +import c from "./c"; +import index from "./index"; +export default c + index; diff --git a/test/statsCases/graph-roots/cycle2/c.js b/test/statsCases/graph-roots/cycle2/c.js new file mode 100644 index 00000000000..ec10282253f --- /dev/null +++ b/test/statsCases/graph-roots/cycle2/c.js @@ -0,0 +1,2 @@ +import index from "./index"; +export default index; diff --git a/test/statsCases/graph-roots/cycle2/index.js b/test/statsCases/graph-roots/cycle2/index.js new file mode 100644 index 00000000000..b03f31d5d7e --- /dev/null +++ b/test/statsCases/graph-roots/cycle2/index.js @@ -0,0 +1,2 @@ +import a from "./a"; +export default a; diff --git a/test/statsCases/graph-roots/cycles/1/a.js b/test/statsCases/graph-roots/cycles/1/a.js new file mode 100644 index 00000000000..d50a9cdd03d --- /dev/null +++ b/test/statsCases/graph-roots/cycles/1/a.js @@ -0,0 +1,3 @@ +import index from "./index"; +import b from "./b"; +export default index + b; diff --git a/test/statsCases/graph-roots/cycles/1/b.js b/test/statsCases/graph-roots/cycles/1/b.js new file mode 100644 index 00000000000..208cd1110c1 --- /dev/null +++ b/test/statsCases/graph-roots/cycles/1/b.js @@ -0,0 +1,2 @@ +import c from "./c"; +export default c; diff --git a/test/statsCases/graph-roots/cycles/1/c.js b/test/statsCases/graph-roots/cycles/1/c.js new file mode 100644 index 00000000000..ec10282253f --- /dev/null +++ b/test/statsCases/graph-roots/cycles/1/c.js @@ -0,0 +1,2 @@ +import index from "./index"; +export default index; diff --git a/test/statsCases/graph-roots/cycles/1/index.js b/test/statsCases/graph-roots/cycles/1/index.js new file mode 100644 index 00000000000..b03f31d5d7e --- /dev/null +++ b/test/statsCases/graph-roots/cycles/1/index.js @@ -0,0 +1,2 @@ +import a from "./a"; +export default a; diff --git a/test/statsCases/graph-roots/cycles/2/a.js b/test/statsCases/graph-roots/cycles/2/a.js new file mode 100644 index 00000000000..112389178f1 --- /dev/null +++ b/test/statsCases/graph-roots/cycles/2/a.js @@ -0,0 +1,2 @@ +import b from "./b"; +export default b; diff --git a/test/statsCases/graph-roots/cycles/2/b.js b/test/statsCases/graph-roots/cycles/2/b.js new file mode 100644 index 00000000000..e2cdc188927 --- /dev/null +++ b/test/statsCases/graph-roots/cycles/2/b.js @@ -0,0 +1,3 @@ +import c from "./c"; +import index from "./index"; +export default c + index; diff --git a/test/statsCases/graph-roots/cycles/2/c.js b/test/statsCases/graph-roots/cycles/2/c.js new file mode 100644 index 00000000000..ec10282253f --- /dev/null +++ b/test/statsCases/graph-roots/cycles/2/c.js @@ -0,0 +1,2 @@ +import index from "./index"; +export default index; diff --git a/test/statsCases/graph-roots/cycles/2/index.js b/test/statsCases/graph-roots/cycles/2/index.js new file mode 100644 index 00000000000..b03f31d5d7e --- /dev/null +++ b/test/statsCases/graph-roots/cycles/2/index.js @@ -0,0 +1,2 @@ +import a from "./a"; +export default a; diff --git a/test/statsCases/graph-roots/id-equals-name.js b/test/statsCases/graph-roots/id-equals-name.js new file mode 100644 index 00000000000..16a7597613f --- /dev/null +++ b/test/statsCases/graph-roots/id-equals-name.js @@ -0,0 +1 @@ +export default "id"; diff --git a/test/statsCases/graph-roots/index.js b/test/statsCases/graph-roots/index.js new file mode 100644 index 00000000000..ba76b5340f0 --- /dev/null +++ b/test/statsCases/graph-roots/index.js @@ -0,0 +1,17 @@ +import(/* webpackChunkName: "tree" */ "./tree"); + +import(/* webpackChunkName: "trees" */ "./trees/1"); +import(/* webpackChunkName: "trees" */ "./trees/2"); +import(/* webpackChunkName: "trees" */ "./trees/3"); + +import(/* webpackChunkName: "cycle" */ "./cycle"); + +import(/* webpackChunkName: "cycle2" */ "./cycle2"); + +import(/* webpackChunkName: "cycles" */ "./cycles/1"); +import(/* webpackChunkName: "cycles" */ "./cycles/2"); + +import("./id-equals-name"); +import(/* webpackChunkName: "id-equals-name_js" */ "./id-equals-name?1"); +import(/* webpackChunkName: "id-equals-name_js-_70e2" */ "./id-equals-name?2"); +import("./id-equals-name?3"); diff --git a/test/statsCases/graph-roots/tree/a.js b/test/statsCases/graph-roots/tree/a.js new file mode 100644 index 00000000000..112389178f1 --- /dev/null +++ b/test/statsCases/graph-roots/tree/a.js @@ -0,0 +1,2 @@ +import b from "./b"; +export default b; diff --git a/test/statsCases/graph-roots/tree/b.js b/test/statsCases/graph-roots/tree/b.js new file mode 100644 index 00000000000..208cd1110c1 --- /dev/null +++ b/test/statsCases/graph-roots/tree/b.js @@ -0,0 +1,2 @@ +import c from "./c"; +export default c; diff --git a/test/statsCases/graph-roots/tree/c.js b/test/statsCases/graph-roots/tree/c.js new file mode 100644 index 00000000000..5d50db5bc15 --- /dev/null +++ b/test/statsCases/graph-roots/tree/c.js @@ -0,0 +1 @@ +export default "c"; diff --git a/test/statsCases/graph-roots/tree/index.js b/test/statsCases/graph-roots/tree/index.js new file mode 100644 index 00000000000..b03f31d5d7e --- /dev/null +++ b/test/statsCases/graph-roots/tree/index.js @@ -0,0 +1,2 @@ +import a from "./a"; +export default a; diff --git a/test/statsCases/graph-roots/trees/1.js b/test/statsCases/graph-roots/trees/1.js new file mode 100644 index 00000000000..b03f31d5d7e --- /dev/null +++ b/test/statsCases/graph-roots/trees/1.js @@ -0,0 +1,2 @@ +import a from "./a"; +export default a; diff --git a/test/statsCases/graph-roots/trees/2.js b/test/statsCases/graph-roots/trees/2.js new file mode 100644 index 00000000000..b03f31d5d7e --- /dev/null +++ b/test/statsCases/graph-roots/trees/2.js @@ -0,0 +1,2 @@ +import a from "./a"; +export default a; diff --git a/test/statsCases/graph-roots/trees/3.js b/test/statsCases/graph-roots/trees/3.js new file mode 100644 index 00000000000..112389178f1 --- /dev/null +++ b/test/statsCases/graph-roots/trees/3.js @@ -0,0 +1,2 @@ +import b from "./b"; +export default b; diff --git a/test/statsCases/graph-roots/trees/a.js b/test/statsCases/graph-roots/trees/a.js new file mode 100644 index 00000000000..112389178f1 --- /dev/null +++ b/test/statsCases/graph-roots/trees/a.js @@ -0,0 +1,2 @@ +import b from "./b"; +export default b; diff --git a/test/statsCases/graph-roots/trees/b.js b/test/statsCases/graph-roots/trees/b.js new file mode 100644 index 00000000000..208cd1110c1 --- /dev/null +++ b/test/statsCases/graph-roots/trees/b.js @@ -0,0 +1,2 @@ +import c from "./c"; +export default c; diff --git a/test/statsCases/graph-roots/trees/c.js b/test/statsCases/graph-roots/trees/c.js new file mode 100644 index 00000000000..5d50db5bc15 --- /dev/null +++ b/test/statsCases/graph-roots/trees/c.js @@ -0,0 +1 @@ +export default "c"; diff --git a/test/statsCases/graph-roots/webpack.config.js b/test/statsCases/graph-roots/webpack.config.js new file mode 100644 index 00000000000..f6b9e638b1b --- /dev/null +++ b/test/statsCases/graph-roots/webpack.config.js @@ -0,0 +1,14 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + mode: "development", + entry: "./index.js", + optimization: { + splitChunks: false + }, + stats: { + all: false, + chunks: true, + chunkModules: true, + dependentModules: false + } +}; diff --git a/test/statsCases/ignore-warnings/index.js b/test/statsCases/ignore-warnings/index.js new file mode 100644 index 00000000000..ec68c28db7b --- /dev/null +++ b/test/statsCases/ignore-warnings/index.js @@ -0,0 +1,9 @@ +import "./module?1"; +import "./module?2"; +import "./module?3"; +import "./module?4"; + +import "./module2?1"; +import "./module2?2"; +import "./module2?3"; +import "./module2?4"; diff --git a/test/statsCases/ignore-warnings/module.js b/test/statsCases/ignore-warnings/module.js new file mode 100644 index 00000000000..61c4c024759 --- /dev/null +++ b/test/statsCases/ignore-warnings/module.js @@ -0,0 +1,3 @@ +import { homepage } from "./package.json"; + +console.log(homepage); diff --git a/test/statsCases/ignore-warnings/module2.js b/test/statsCases/ignore-warnings/module2.js new file mode 100644 index 00000000000..d27e81e6137 --- /dev/null +++ b/test/statsCases/ignore-warnings/module2.js @@ -0,0 +1,3 @@ +import { name } from "./package.json"; + +console.log(name); diff --git a/test/statsCases/ignore-warnings/package.json b/test/statsCases/ignore-warnings/package.json new file mode 100644 index 00000000000..f8098621ffe --- /dev/null +++ b/test/statsCases/ignore-warnings/package.json @@ -0,0 +1,5 @@ +{ + "name": "webpack-test-ignore-warnings", + "license": "MIT", + "homepage": "https://github.com/webpack/webpack" +} diff --git a/test/statsCases/ignore-warnings/webpack.config.js b/test/statsCases/ignore-warnings/webpack.config.js new file mode 100644 index 00000000000..8d203f8ef9d --- /dev/null +++ b/test/statsCases/ignore-warnings/webpack.config.js @@ -0,0 +1,20 @@ +/** @typedef {import("../../../").Module} Module */ +/** @typedef {import("../../../").WebpackError} WebpackError */ + +/** @type {import("../../../").Configuration} */ +module.exports = { + entry: "./index.js", + ignoreWarnings: [ + { + module: /module2\.js\?[34]/ + }, + { + module: /[13]/, + message: /homepage/ + }, + /The 'mode' option has not been set/, + warning => + /** @type {Module} */ + (/** @type {WebpackError} */ (warning).module).identifier().endsWith("?2") + ] +}; diff --git a/test/statsCases/immutable/chunk.js b/test/statsCases/immutable/chunk.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/statsCases/immutable/index.js b/test/statsCases/immutable/index.js new file mode 100644 index 00000000000..d7401296bb3 --- /dev/null +++ b/test/statsCases/immutable/index.js @@ -0,0 +1 @@ +import("./chunk"); diff --git a/test/statsCases/immutable/webpack.config.js b/test/statsCases/immutable/webpack.config.js new file mode 100644 index 00000000000..2bbf3aa2caf --- /dev/null +++ b/test/statsCases/immutable/webpack.config.js @@ -0,0 +1,12 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + mode: "development", + entry: "./index.js", + output: { + filename: "[contenthash].js" + }, + stats: { + all: false, + assets: true + } +}; diff --git a/test/statsCases/import-context-filter/webpack.config.js b/test/statsCases/import-context-filter/webpack.config.js index 070e4302853..250f8f5e63a 100644 --- a/test/statsCases/import-context-filter/webpack.config.js +++ b/test/statsCases/import-context-filter/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: { diff --git a/test/statsCases/import-weak-parser-option/entry.js b/test/statsCases/import-weak-parser-option/entry.js new file mode 100644 index 00000000000..410e6d26e60 --- /dev/null +++ b/test/statsCases/import-weak-parser-option/entry.js @@ -0,0 +1,3 @@ +import("./modules/a"); +import("./modules/b"); +import(/* webpackMode: "lazy" */"./modules/b"); diff --git a/test/statsCases/import-weak-parser-option/modules/a.js b/test/statsCases/import-weak-parser-option/modules/a.js new file mode 100644 index 00000000000..d0b86a774ff --- /dev/null +++ b/test/statsCases/import-weak-parser-option/modules/a.js @@ -0,0 +1,2 @@ +import("./b"); +module.exports = "a"; diff --git a/test/statsCases/import-weak-parser-option/modules/b.js b/test/statsCases/import-weak-parser-option/modules/b.js new file mode 100644 index 00000000000..dfbbeb621fa --- /dev/null +++ b/test/statsCases/import-weak-parser-option/modules/b.js @@ -0,0 +1 @@ +module.exports = "b"; diff --git a/test/statsCases/import-weak-parser-option/webpack.config.js b/test/statsCases/import-weak-parser-option/webpack.config.js new file mode 100644 index 00000000000..dc55f04d88c --- /dev/null +++ b/test/statsCases/import-weak-parser-option/webpack.config.js @@ -0,0 +1,14 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + mode: "production", + entry: { + entry: "./entry" + }, + module: { + parser: { + javascript: { + dynamicImportMode: "weak" + } + } + } +}; diff --git a/test/statsCases/import-weak/webpack.config.js b/test/statsCases/import-weak/webpack.config.js index 070e4302853..250f8f5e63a 100644 --- a/test/statsCases/import-weak/webpack.config.js +++ b/test/statsCases/import-weak/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: { diff --git a/test/statsCases/import-with-invalid-options-comments/webpack.config.js b/test/statsCases/import-with-invalid-options-comments/webpack.config.js index 7e5b36607b2..29bbb85511b 100644 --- a/test/statsCases/import-with-invalid-options-comments/webpack.config.js +++ b/test/statsCases/import-with-invalid-options-comments/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", @@ -9,7 +10,7 @@ module.exports = { hash: false, entrypoints: false, assets: false, - errorDetails: true, + errorDetails: false, moduleTrace: true } }; diff --git a/test/statsCases/issue-7577/webpack.config.js b/test/statsCases/issue-7577/webpack.config.js index 50e73e91765..423cb47a4c7 100644 --- a/test/statsCases/issue-7577/webpack.config.js +++ b/test/statsCases/issue-7577/webpack.config.js @@ -1,8 +1,9 @@ const base = { mode: "production", optimization: { + moduleIds: "named", + chunkIds: "named", runtimeChunk: true, - namedChunks: true, splitChunks: { minSize: 0, chunks: "all", @@ -14,32 +15,27 @@ const base = { } } }; +/** @type {import("../../../").Configuration[]} */ module.exports = [ - Object.assign( - { - entry: "./a.js", - output: { - filename: "a-[name]-[chunkhash].js" - } + { + entry: "./a.js", + output: { + filename: "a-[name]-[chunkhash].js" }, - base - ), - Object.assign( - { - entry: "./b.js", - output: { - filename: "b-[name]-[chunkhash].js" - } + ...base + }, + { + entry: "./b.js", + output: { + filename: "b-[name]-[chunkhash].js" }, - base - ), - Object.assign( - { - entry: "./c.js", - output: { - filename: "c-[name]-[chunkhash].js" - } + ...base + }, + { + entry: "./c.js", + output: { + filename: "c-[name]-[chunkhash].js" }, - base - ) + ...base + } ]; diff --git a/test/statsCases/limit-chunk-count-plugin/webpack.config.js b/test/statsCases/limit-chunk-count-plugin/webpack.config.js index 056f830cf88..cefff804cbb 100644 --- a/test/statsCases/limit-chunk-count-plugin/webpack.config.js +++ b/test/statsCases/limit-chunk-count-plugin/webpack.config.js @@ -1,10 +1,12 @@ -var webpack = require("../../../"); +const webpack = require("../../../"); + +/** @type {import("../../../").Configuration[]} */ module.exports = [1, 2, 3, 4].map(n => ({ name: `${n} chunks`, mode: "production", entry: "./index", output: { - filename: "bundle.js" + filename: `bundle${n}.js` }, plugins: [ new webpack.optimize.LimitChunkCountPlugin({ @@ -13,6 +15,8 @@ module.exports = [1, 2, 3, 4].map(n => ({ ], stats: { chunkModules: true, + dependentModules: true, + chunkRelations: true, modules: false, chunks: true } diff --git a/test/statsCases/logging-debug/index.js b/test/statsCases/logging-debug/index.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/statsCases/logging-debug/webpack.config.js b/test/statsCases/logging-debug/webpack.config.js new file mode 100644 index 00000000000..8faf807a2fc --- /dev/null +++ b/test/statsCases/logging-debug/webpack.config.js @@ -0,0 +1,22 @@ +const LogTestPlugin = require("../../helpers/LogTestPlugin"); + +/** @type {import("../../../").Configuration} */ +module.exports = { + mode: "production", + entry: "./index", + performance: false, + module: { + rules: [ + { + test: /index\.js$/, + use: require.resolve("../logging/node_modules/custom-loader") + } + ] + }, + plugins: [new LogTestPlugin(true)], + stats: { + colors: true, + logging: false, + loggingDebug: /custom-loader/ + } +}; diff --git a/test/statsCases/logging/index.js b/test/statsCases/logging/index.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/statsCases/logging/node_modules/custom-loader/index.js b/test/statsCases/logging/node_modules/custom-loader/index.js new file mode 100644 index 00000000000..f59e88aae18 --- /dev/null +++ b/test/statsCases/logging/node_modules/custom-loader/index.js @@ -0,0 +1,21 @@ +/* eslint-disable node/no-unsupported-features/node-builtins */ +module.exports = function(source) { + const logger = this.getLogger ? this.getLogger() : console; + logger.time("Measure"); + logger.error("An error"); + logger.warn("A %s", "warning"); + logger.group("Unimportant"); + logger.info("Info message"); + logger.log("Just log"); + logger.debug("Just debug"); + logger.timeLog("Measure"); + logger.groupCollapsed("Nested"); + logger.log("Log inside collapsed group"); + logger.groupEnd("Nested"); + logger.trace(); + logger.timeEnd("Measure"); + logger.clear(); + logger.log("After clear"); + this.getLogger("Named Logger").debug("Message with named logger"); + return source; +}; diff --git a/test/statsCases/logging/webpack.config.js b/test/statsCases/logging/webpack.config.js new file mode 100644 index 00000000000..e3e086af9f3 --- /dev/null +++ b/test/statsCases/logging/webpack.config.js @@ -0,0 +1,23 @@ +const LogTestPlugin = require("../../helpers/LogTestPlugin"); + +/** @type {import("../../../").Configuration} */ +module.exports = { + mode: "production", + entry: "./index", + performance: false, + module: { + rules: [ + { + test: /index\.js$/, + use: "custom-loader" + } + ] + }, + plugins: [new LogTestPlugin(true)], + stats: { + colors: true, + logging: true, + loggingDebug: "custom-loader", + loggingTrace: true + } +}; diff --git a/test/statsCases/max-external-module-readable-identifier/index.js b/test/statsCases/max-external-module-readable-identifier/index.js new file mode 100644 index 00000000000..e7b7d56c8ad --- /dev/null +++ b/test/statsCases/max-external-module-readable-identifier/index.js @@ -0,0 +1 @@ +require("test"); diff --git a/test/statsCases/max-external-module-readable-identifier/webpack.config.js b/test/statsCases/max-external-module-readable-identifier/webpack.config.js new file mode 100644 index 00000000000..7f5712802a4 --- /dev/null +++ b/test/statsCases/max-external-module-readable-identifier/webpack.config.js @@ -0,0 +1,8 @@ +/** @type {import("../../../types").Configuration} */ +module.exports = { + mode: "production", + entry: "./index", + externals: { + test: "commonjs very-very-very-very-long-external-module-readable-identifier-it-should-be-truncated" + } +}; diff --git a/test/statsCases/max-modules-default/webpack.config.js b/test/statsCases/max-modules-default/webpack.config.js index 069d6d62dea..30e8de2c0f0 100644 --- a/test/statsCases/max-modules-default/webpack.config.js +++ b/test/statsCases/max-modules-default/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", diff --git a/test/statsCases/max-modules/webpack.config.js b/test/statsCases/max-modules/webpack.config.js index c2f9c5fdda2..cb83e0b2382 100644 --- a/test/statsCases/max-modules/webpack.config.js +++ b/test/statsCases/max-modules/webpack.config.js @@ -1,8 +1,9 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", performance: false, stats: { - maxModules: 20 + modulesSpace: 20 } }; diff --git a/test/statsCases/module-assets/index.js b/test/statsCases/module-assets/index.js index 06de56f41cf..044882e4593 100644 --- a/test/statsCases/module-assets/index.js +++ b/test/statsCases/module-assets/index.js @@ -1 +1,2 @@ -import('a') +import(/* webpackChunkName: "a" */ "a"); +import(/* webpackChunkName: "b" */ "b"); diff --git a/test/statsCases/module-assets/node_modules/a/2.png b/test/statsCases/module-assets/node_modules/a/2.png new file mode 100644 index 00000000000..48924276b77 Binary files /dev/null and b/test/statsCases/module-assets/node_modules/a/2.png differ diff --git a/test/statsCases/module-assets/node_modules/a/index.js b/test/statsCases/module-assets/node_modules/a/index.js index d89ed76f008..4c93d2b6544 100644 --- a/test/statsCases/module-assets/node_modules/a/index.js +++ b/test/statsCases/module-assets/node_modules/a/index.js @@ -1 +1,2 @@ -import './1.png' +import "./1.png"; +import "./2.png"; diff --git a/test/statsCases/module-assets/node_modules/b/index.js b/test/statsCases/module-assets/node_modules/b/index.js new file mode 100644 index 00000000000..c4e271add3c --- /dev/null +++ b/test/statsCases/module-assets/node_modules/b/index.js @@ -0,0 +1 @@ +import "a/2.png"; diff --git a/test/statsCases/module-assets/webpack.config.js b/test/statsCases/module-assets/webpack.config.js index 2b4661614ae..20922e8dbf1 100644 --- a/test/statsCases/module-assets/webpack.config.js +++ b/test/statsCases/module-assets/webpack.config.js @@ -1,10 +1,14 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", stats: { - assets: false, + assets: true, + chunkGroups: true, + chunkGroupAuxiliary: true, chunks: true, chunkModules: true, + dependentModules: true, modules: true, moduleAssets: true }, diff --git a/test/statsCases/module-deduplication-named/a.js b/test/statsCases/module-deduplication-named/a.js index 8b1a393741c..e94fef18587 100644 --- a/test/statsCases/module-deduplication-named/a.js +++ b/test/statsCases/module-deduplication-named/a.js @@ -1 +1 @@ -// empty +export default "a"; diff --git a/test/statsCases/module-deduplication-named/async1.js b/test/statsCases/module-deduplication-named/async1.js index 118b7b2dfaf..0482646d62f 100644 --- a/test/statsCases/module-deduplication-named/async1.js +++ b/test/statsCases/module-deduplication-named/async1.js @@ -1,3 +1,5 @@ -import "./b"; -import "./d"; -import(/* webpackChunkName: "async2" */"./async2"); +import b from "./b"; +import d from "./d"; +console.log(b, d); + +import(/* webpackChunkName: "async2" */ "./async2"); diff --git a/test/statsCases/module-deduplication-named/async2.js b/test/statsCases/module-deduplication-named/async2.js index 9ee2d754bef..c6fd181fd30 100644 --- a/test/statsCases/module-deduplication-named/async2.js +++ b/test/statsCases/module-deduplication-named/async2.js @@ -1,3 +1,5 @@ -import "./b"; -import "./f"; -import(/* webpackChunkName: "async3" */"./async3"); +import b from "./b"; +import f from "./f"; +console.log(b, f); + +import(/* webpackChunkName: "async3" */ "./async3"); diff --git a/test/statsCases/module-deduplication-named/async3.js b/test/statsCases/module-deduplication-named/async3.js index 7f802fe2d99..36ee0fc2c7e 100644 --- a/test/statsCases/module-deduplication-named/async3.js +++ b/test/statsCases/module-deduplication-named/async3.js @@ -1,3 +1,5 @@ -import "./b"; -import "./h"; -import(/* webpackChunkName: "async1" */"./async1"); +import b from "./b"; +import h from "./h"; +console.log(b, h); + +import(/* webpackChunkName: "async1" */ "./async1"); diff --git a/test/statsCases/module-deduplication-named/b.js b/test/statsCases/module-deduplication-named/b.js index 8b1a393741c..eff703ff465 100644 --- a/test/statsCases/module-deduplication-named/b.js +++ b/test/statsCases/module-deduplication-named/b.js @@ -1 +1 @@ -// empty +export default "b"; diff --git a/test/statsCases/module-deduplication-named/c.js b/test/statsCases/module-deduplication-named/c.js index 8b1a393741c..5d50db5bc15 100644 --- a/test/statsCases/module-deduplication-named/c.js +++ b/test/statsCases/module-deduplication-named/c.js @@ -1 +1 @@ -// empty +export default "c"; diff --git a/test/statsCases/module-deduplication-named/d.js b/test/statsCases/module-deduplication-named/d.js index 8b1a393741c..987d6d7e401 100644 --- a/test/statsCases/module-deduplication-named/d.js +++ b/test/statsCases/module-deduplication-named/d.js @@ -1 +1 @@ -// empty +export default "d"; diff --git a/test/statsCases/module-deduplication-named/e.js b/test/statsCases/module-deduplication-named/e.js index 8b1a393741c..d97e38b22f5 100644 --- a/test/statsCases/module-deduplication-named/e.js +++ b/test/statsCases/module-deduplication-named/e.js @@ -1 +1 @@ -// empty +export default "e"; diff --git a/test/statsCases/module-deduplication-named/e1.js b/test/statsCases/module-deduplication-named/e1.js index 35e90e78fcb..7ced8f9d257 100644 --- a/test/statsCases/module-deduplication-named/e1.js +++ b/test/statsCases/module-deduplication-named/e1.js @@ -1,5 +1,6 @@ -import "./a"; -import "./b"; -import "./c"; -import "./d"; -import(/* webpackChunkName: "async1" */"./async1"); +import a from "./a"; +import b from "./b"; +import c from "./c"; +import d from "./d"; +import(/* webpackChunkName: "async1" */ "./async1"); +console.log(a, b, c, d); diff --git a/test/statsCases/module-deduplication-named/e2.js b/test/statsCases/module-deduplication-named/e2.js index cb20797bbe7..6a04f57e383 100644 --- a/test/statsCases/module-deduplication-named/e2.js +++ b/test/statsCases/module-deduplication-named/e2.js @@ -1,5 +1,6 @@ -import "./a"; -import "./b"; -import "./e"; -import "./f"; -import(/* webpackChunkName: "async2" */"./async2"); +import a from "./a"; +import b from "./b"; +import e from "./e"; +import f from "./f"; +import(/* webpackChunkName: "async2" */ "./async2"); +console.log(a, b, e, f); diff --git a/test/statsCases/module-deduplication-named/e3.js b/test/statsCases/module-deduplication-named/e3.js index 1ee82f31f1f..03a595a78a7 100644 --- a/test/statsCases/module-deduplication-named/e3.js +++ b/test/statsCases/module-deduplication-named/e3.js @@ -1,5 +1,6 @@ -import "./a"; -import "./b"; -import "./g"; -import "./h"; -import(/* webpackChunkName: "async3" */"./async3"); +import a from "./a"; +import b from "./b"; +import g from "./g"; +import h from "./h"; +import(/* webpackChunkName: "async3" */ "./async3"); +console.log(a, b, g, h); diff --git a/test/statsCases/module-deduplication-named/f.js b/test/statsCases/module-deduplication-named/f.js index 8b1a393741c..657d4dee8a8 100644 --- a/test/statsCases/module-deduplication-named/f.js +++ b/test/statsCases/module-deduplication-named/f.js @@ -1 +1 @@ -// empty +export default "f"; diff --git a/test/statsCases/module-deduplication-named/g.js b/test/statsCases/module-deduplication-named/g.js index 8b1a393741c..7cb853264e7 100644 --- a/test/statsCases/module-deduplication-named/g.js +++ b/test/statsCases/module-deduplication-named/g.js @@ -1 +1 @@ -// empty +export default "g"; diff --git a/test/statsCases/module-deduplication-named/h.js b/test/statsCases/module-deduplication-named/h.js index 8b1a393741c..a92b26ccb91 100644 --- a/test/statsCases/module-deduplication-named/h.js +++ b/test/statsCases/module-deduplication-named/h.js @@ -1 +1 @@ -// empty +export default "h"; diff --git a/test/statsCases/module-deduplication-named/webpack.config.js b/test/statsCases/module-deduplication-named/webpack.config.js index 039f0301171..595b06dc2a1 100644 --- a/test/statsCases/module-deduplication-named/webpack.config.js +++ b/test/statsCases/module-deduplication-named/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: { @@ -14,6 +15,7 @@ module.exports = { builtAt: false, chunks: true, chunkModules: true, + dependentModules: true, modules: false } }; diff --git a/test/statsCases/module-deduplication/a.js b/test/statsCases/module-deduplication/a.js index 8b1a393741c..e94fef18587 100644 --- a/test/statsCases/module-deduplication/a.js +++ b/test/statsCases/module-deduplication/a.js @@ -1 +1 @@ -// empty +export default "a"; diff --git a/test/statsCases/module-deduplication/async1.js b/test/statsCases/module-deduplication/async1.js index 26fa1f2244c..375f5861525 100644 --- a/test/statsCases/module-deduplication/async1.js +++ b/test/statsCases/module-deduplication/async1.js @@ -1,2 +1,3 @@ -import "./b"; -import "./d"; +import b from "./b"; +import d from "./d"; +console.log(b, d); diff --git a/test/statsCases/module-deduplication/async2.js b/test/statsCases/module-deduplication/async2.js index 8ab3bed29d0..79de668e30d 100644 --- a/test/statsCases/module-deduplication/async2.js +++ b/test/statsCases/module-deduplication/async2.js @@ -1,2 +1,3 @@ -import "./b"; -import "./f"; +import b from "./b"; +import f from "./f"; +console.log(b, f); diff --git a/test/statsCases/module-deduplication/async3.js b/test/statsCases/module-deduplication/async3.js index b53d36759e9..ef25fd18706 100644 --- a/test/statsCases/module-deduplication/async3.js +++ b/test/statsCases/module-deduplication/async3.js @@ -1,2 +1,3 @@ -import "./b"; -import "./h"; +import b from "./b"; +import h from "./h"; +console.log(b, h); diff --git a/test/statsCases/module-deduplication/b.js b/test/statsCases/module-deduplication/b.js index 8b1a393741c..eff703ff465 100644 --- a/test/statsCases/module-deduplication/b.js +++ b/test/statsCases/module-deduplication/b.js @@ -1 +1 @@ -// empty +export default "b"; diff --git a/test/statsCases/module-deduplication/c.js b/test/statsCases/module-deduplication/c.js index 8b1a393741c..5d50db5bc15 100644 --- a/test/statsCases/module-deduplication/c.js +++ b/test/statsCases/module-deduplication/c.js @@ -1 +1 @@ -// empty +export default "c"; diff --git a/test/statsCases/module-deduplication/d.js b/test/statsCases/module-deduplication/d.js index 8b1a393741c..987d6d7e401 100644 --- a/test/statsCases/module-deduplication/d.js +++ b/test/statsCases/module-deduplication/d.js @@ -1 +1 @@ -// empty +export default "d"; diff --git a/test/statsCases/module-deduplication/e.js b/test/statsCases/module-deduplication/e.js index 8b1a393741c..d97e38b22f5 100644 --- a/test/statsCases/module-deduplication/e.js +++ b/test/statsCases/module-deduplication/e.js @@ -1 +1 @@ -// empty +export default "e"; diff --git a/test/statsCases/module-deduplication/e1.js b/test/statsCases/module-deduplication/e1.js index 8f319a09452..559465226ec 100644 --- a/test/statsCases/module-deduplication/e1.js +++ b/test/statsCases/module-deduplication/e1.js @@ -1,7 +1,8 @@ -import "./a"; -import "./b"; -import "./c"; -import "./d"; +import a from "./a"; +import b from "./b"; +import c from "./c"; +import d from "./d"; import("./async1"); import("./async2"); import("./async3"); +console.log(a, b, c, d); diff --git a/test/statsCases/module-deduplication/e2.js b/test/statsCases/module-deduplication/e2.js index 37edf823b4d..d9d0b7bb4d2 100644 --- a/test/statsCases/module-deduplication/e2.js +++ b/test/statsCases/module-deduplication/e2.js @@ -1,7 +1,8 @@ -import "./a"; -import "./b"; -import "./e"; -import "./f"; +import a from "./a"; +import b from "./b"; +import e from "./e"; +import f from "./f"; import("./async1"); import("./async2"); import("./async3"); +console.log(a, b, e, f); diff --git a/test/statsCases/module-deduplication/e3.js b/test/statsCases/module-deduplication/e3.js index c7adaf8ee81..3303e95d128 100644 --- a/test/statsCases/module-deduplication/e3.js +++ b/test/statsCases/module-deduplication/e3.js @@ -1,7 +1,8 @@ -import "./a"; -import "./b"; -import "./g"; -import "./h"; +import a from "./a"; +import b from "./b"; +import g from "./g"; +import h from "./h"; import("./async1"); import("./async2"); import("./async3"); +console.log(a, b, g, h); diff --git a/test/statsCases/module-deduplication/f.js b/test/statsCases/module-deduplication/f.js index 8b1a393741c..657d4dee8a8 100644 --- a/test/statsCases/module-deduplication/f.js +++ b/test/statsCases/module-deduplication/f.js @@ -1 +1 @@ -// empty +export default "f"; diff --git a/test/statsCases/module-deduplication/g.js b/test/statsCases/module-deduplication/g.js index 8b1a393741c..7cb853264e7 100644 --- a/test/statsCases/module-deduplication/g.js +++ b/test/statsCases/module-deduplication/g.js @@ -1 +1 @@ -// empty +export default "g"; diff --git a/test/statsCases/module-deduplication/h.js b/test/statsCases/module-deduplication/h.js index 8b1a393741c..a92b26ccb91 100644 --- a/test/statsCases/module-deduplication/h.js +++ b/test/statsCases/module-deduplication/h.js @@ -1 +1 @@ -// empty +export default "h"; diff --git a/test/statsCases/module-deduplication/webpack.config.js b/test/statsCases/module-deduplication/webpack.config.js index 039f0301171..595b06dc2a1 100644 --- a/test/statsCases/module-deduplication/webpack.config.js +++ b/test/statsCases/module-deduplication/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: { @@ -14,6 +15,7 @@ module.exports = { builtAt: false, chunks: true, chunkModules: true, + dependentModules: true, modules: false } }; diff --git a/test/statsCases/module-federation-custom-exposed-module-name/entry.js b/test/statsCases/module-federation-custom-exposed-module-name/entry.js new file mode 100644 index 00000000000..5e8c8f3bf81 --- /dev/null +++ b/test/statsCases/module-federation-custom-exposed-module-name/entry.js @@ -0,0 +1 @@ +export default function bootstrap() {} diff --git a/test/statsCases/module-federation-custom-exposed-module-name/index.js b/test/statsCases/module-federation-custom-exposed-module-name/index.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/statsCases/module-federation-custom-exposed-module-name/webpack.config.js b/test/statsCases/module-federation-custom-exposed-module-name/webpack.config.js new file mode 100644 index 00000000000..ac57c47b9f1 --- /dev/null +++ b/test/statsCases/module-federation-custom-exposed-module-name/webpack.config.js @@ -0,0 +1,21 @@ +const { ModuleFederationPlugin } = require("../../../").container; + +/** @type {import("../../../").Configuration} */ +module.exports = { + mode: "production", + entry: "./index.js", + output: { + filename: "[name]_bundle.js" + }, + plugins: [ + new ModuleFederationPlugin({ + name: "container", + exposes: { + "./entry": { + import: "./entry", + name: "custom-entry" + } + } + }) + ] +}; diff --git a/test/statsCases/module-not-found-error/index.js b/test/statsCases/module-not-found-error/index.js new file mode 100644 index 00000000000..c89b0da14b4 --- /dev/null +++ b/test/statsCases/module-not-found-error/index.js @@ -0,0 +1,2 @@ +require('buffer') +require('os') diff --git a/test/statsCases/module-not-found-error/webpack.config.js b/test/statsCases/module-not-found-error/webpack.config.js new file mode 100644 index 00000000000..04f99c80907 --- /dev/null +++ b/test/statsCases/module-not-found-error/webpack.config.js @@ -0,0 +1,6 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + mode: "production", + entry: "./index", + stats: "errors-only" +}; diff --git a/test/statsCases/module-reasons/a.js b/test/statsCases/module-reasons/a.js new file mode 100644 index 00000000000..290e34af37c --- /dev/null +++ b/test/statsCases/module-reasons/a.js @@ -0,0 +1,2 @@ +require("./c"); +export const a = "a"; diff --git a/test/statsCases/module-reasons/b.js b/test/statsCases/module-reasons/b.js new file mode 100644 index 00000000000..26136e869c7 --- /dev/null +++ b/test/statsCases/module-reasons/b.js @@ -0,0 +1,2 @@ +require("./c"); +export const b = "b"; \ No newline at end of file diff --git a/test/statsCases/module-reasons/c.js b/test/statsCases/module-reasons/c.js new file mode 100644 index 00000000000..cfa374bdb67 --- /dev/null +++ b/test/statsCases/module-reasons/c.js @@ -0,0 +1 @@ +// empty \ No newline at end of file diff --git a/test/statsCases/module-reasons/index.js b/test/statsCases/module-reasons/index.js new file mode 100644 index 00000000000..64548aee6bb --- /dev/null +++ b/test/statsCases/module-reasons/index.js @@ -0,0 +1,2 @@ +import "./a"; +import "./b"; \ No newline at end of file diff --git a/test/statsCases/module-reasons/webpack.config.js b/test/statsCases/module-reasons/webpack.config.js new file mode 100644 index 00000000000..db7b8b1808e --- /dev/null +++ b/test/statsCases/module-reasons/webpack.config.js @@ -0,0 +1,9 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + mode: "production", + entry: "./index", + stats: { + modules: true, + reasons: true + } +}; diff --git a/test/statsCases/module-trace-disabled-in-error/index.js b/test/statsCases/module-trace-disabled-in-error/index.js index 76677b42431..de750eddecf 100644 --- a/test/statsCases/module-trace-disabled-in-error/index.js +++ b/test/statsCases/module-trace-disabled-in-error/index.js @@ -1 +1 @@ -require('does-not-exist') \ No newline at end of file +require('./inner') diff --git a/test/statsCases/module-trace-disabled-in-error/inner.js b/test/statsCases/module-trace-disabled-in-error/inner.js new file mode 100644 index 00000000000..b368480fb9b --- /dev/null +++ b/test/statsCases/module-trace-disabled-in-error/inner.js @@ -0,0 +1,2 @@ +require("./not-existing"); +require("./parse-error"); diff --git a/test/statsCases/module-trace-disabled-in-error/not-existing.js b/test/statsCases/module-trace-disabled-in-error/not-existing.js new file mode 100644 index 00000000000..5dfcdd998ec --- /dev/null +++ b/test/statsCases/module-trace-disabled-in-error/not-existing.js @@ -0,0 +1 @@ +require('does-not-exist') diff --git a/test/statsCases/module-trace-disabled-in-error/parse-error.js b/test/statsCases/module-trace-disabled-in-error/parse-error.js new file mode 100644 index 00000000000..597c458e0e6 --- /dev/null +++ b/test/statsCases/module-trace-disabled-in-error/parse-error.js @@ -0,0 +1,5 @@ +Here +could +be :) +your +code diff --git a/test/statsCases/module-trace-disabled-in-error/webpack.config.js b/test/statsCases/module-trace-disabled-in-error/webpack.config.js index cb5614a812d..a4ac64a08ef 100644 --- a/test/statsCases/module-trace-disabled-in-error/webpack.config.js +++ b/test/statsCases/module-trace-disabled-in-error/webpack.config.js @@ -1,8 +1,10 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", stats: { hash: false, - moduleTrace: false + moduleTrace: false, + errorDetails: false } }; diff --git a/test/statsCases/module-trace-enabled-in-error/index.js b/test/statsCases/module-trace-enabled-in-error/index.js index 76677b42431..de750eddecf 100644 --- a/test/statsCases/module-trace-enabled-in-error/index.js +++ b/test/statsCases/module-trace-enabled-in-error/index.js @@ -1 +1 @@ -require('does-not-exist') \ No newline at end of file +require('./inner') diff --git a/test/statsCases/module-trace-enabled-in-error/inner.js b/test/statsCases/module-trace-enabled-in-error/inner.js new file mode 100644 index 00000000000..b368480fb9b --- /dev/null +++ b/test/statsCases/module-trace-enabled-in-error/inner.js @@ -0,0 +1,2 @@ +require("./not-existing"); +require("./parse-error"); diff --git a/test/statsCases/module-trace-enabled-in-error/not-existing.js b/test/statsCases/module-trace-enabled-in-error/not-existing.js new file mode 100644 index 00000000000..5dfcdd998ec --- /dev/null +++ b/test/statsCases/module-trace-enabled-in-error/not-existing.js @@ -0,0 +1 @@ +require('does-not-exist') diff --git a/test/statsCases/module-trace-enabled-in-error/parse-error.js b/test/statsCases/module-trace-enabled-in-error/parse-error.js new file mode 100644 index 00000000000..597c458e0e6 --- /dev/null +++ b/test/statsCases/module-trace-enabled-in-error/parse-error.js @@ -0,0 +1,5 @@ +Here +could +be :) +your +code diff --git a/test/statsCases/module-trace-enabled-in-error/webpack.config.js b/test/statsCases/module-trace-enabled-in-error/webpack.config.js index d282e779931..58a72453689 100644 --- a/test/statsCases/module-trace-enabled-in-error/webpack.config.js +++ b/test/statsCases/module-trace-enabled-in-error/webpack.config.js @@ -1,8 +1,10 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", stats: { hash: false, - moduleTrace: true + moduleTrace: true, + errorDetails: false } }; diff --git a/test/statsCases/name/app.js b/test/statsCases/name/app.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/statsCases/name/server.js b/test/statsCases/name/server.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/statsCases/name/webpack.config.js b/test/statsCases/name/webpack.config.js new file mode 100644 index 00000000000..5072e80e8e9 --- /dev/null +++ b/test/statsCases/name/webpack.config.js @@ -0,0 +1,19 @@ +/** @type {import("../../../").Configuration[]} */ +module.exports = [ + { + name: require.resolve("./app.js"), + mode: "production", + entry: "./app.js", + output: { + filename: "bundle1.js" + } + }, + { + name: require.resolve("./server.js"), + mode: "production", + entry: "./server.js", + output: { + filename: "bundle2.js" + } + } +]; diff --git a/test/statsCases/named-chunk-groups/a.js b/test/statsCases/named-chunk-groups/a.js index 6999047542f..f41440d710c 100644 --- a/test/statsCases/named-chunk-groups/a.js +++ b/test/statsCases/named-chunk-groups/a.js @@ -1,3 +1,6 @@ import "./shared"; export default "a"; + +// content content content content content content content content +// content content content content content content content content diff --git a/test/statsCases/named-chunk-groups/b.js b/test/statsCases/named-chunk-groups/b.js index a47f90b65ff..bfa40f53968 100644 --- a/test/statsCases/named-chunk-groups/b.js +++ b/test/statsCases/named-chunk-groups/b.js @@ -1,3 +1,6 @@ import "./shared"; export default "b"; + +// content content content content content content content content +// content content content content content content content content diff --git a/test/statsCases/named-chunk-groups/c.js b/test/statsCases/named-chunk-groups/c.js index 00c4083b286..c20e5fe8b70 100644 --- a/test/statsCases/named-chunk-groups/c.js +++ b/test/statsCases/named-chunk-groups/c.js @@ -1,4 +1,4 @@ -import "x"; -import "y"; +import x from "x"; +import y from "y"; -export default "c"; +export default "c" + x + y; diff --git a/test/statsCases/named-chunk-groups/shared.js b/test/statsCases/named-chunk-groups/shared.js index f53cf742a26..12ee0e706e0 100644 --- a/test/statsCases/named-chunk-groups/shared.js +++ b/test/statsCases/named-chunk-groups/shared.js @@ -1,2 +1,3 @@ // content content content content content content content content -// content content content content content content content content \ No newline at end of file +// content content content content content content content content +console.log(); diff --git a/test/statsCases/named-chunk-groups/webpack.config.js b/test/statsCases/named-chunk-groups/webpack.config.js index 617a63e18dd..5707a8b1e24 100644 --- a/test/statsCases/named-chunk-groups/webpack.config.js +++ b/test/statsCases/named-chunk-groups/webpack.config.js @@ -13,9 +13,6 @@ const config = { entry: { main: "./" }, - output: { - filename: "[name].js" - }, optimization: { splitChunks: { minSize: 100, @@ -31,17 +28,20 @@ const config = { } }; +/** @type {import("../../../").Configuration[]} */ module.exports = [ - Object.assign( - { - stats: Object.assign({ entrypoints: false, chunkGroups: true }, stats) + { + stats: { entrypoints: false, chunkGroups: true, ...stats }, + output: { + filename: "a-[name].js" }, - config - ), - Object.assign( - { - stats: Object.assign({ entrypoints: true, chunkGroups: true }, stats) + ...config + }, + { + stats: { entrypoints: true, chunkGroups: true, ...stats }, + output: { + filename: "b-[name].js" }, - config - ) + ...config + } ]; diff --git a/test/statsCases/named-chunks-plugin-async/webpack.config.js b/test/statsCases/named-chunks-plugin-async/webpack.config.js index ed9ebafaed8..e435593835a 100644 --- a/test/statsCases/named-chunks-plugin-async/webpack.config.js +++ b/test/statsCases/named-chunks-plugin-async/webpack.config.js @@ -1,29 +1,15 @@ "use strict"; -const NamedChunksPlugin = require("../../../lib/NamedChunksPlugin"); -const RequestShortener = require("../../../lib/RequestShortener"); +const { + ids: { NamedChunkIdsPlugin } +} = require("../../../"); +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", + optimization: { chunkIds: false }, entry: { entry: "./entry" }, - plugins: [ - new NamedChunksPlugin(function(chunk) { - if (chunk.name) { - return chunk.name; - } - const chunkModulesToName = chunk => - Array.from(chunk.modulesIterable, mod => { - const rs = new RequestShortener(mod.context); - return rs.shorten(mod.request).replace(/[./\\]/g, "_"); - }).join("-"); - - if (chunk.getNumberOfModules() > 0) { - return `chunk-containing-${chunkModulesToName(chunk)}`; - } - - return null; - }) - ] + plugins: [new NamedChunkIdsPlugin()] }; diff --git a/test/statsCases/named-chunks-plugin/webpack.config.js b/test/statsCases/named-chunks-plugin/webpack.config.js index 52fd02648fc..b358371ed22 100644 --- a/test/statsCases/named-chunks-plugin/webpack.config.js +++ b/test/statsCases/named-chunks-plugin/webpack.config.js @@ -1,12 +1,12 @@ -var NamedChunksPlugin = require("../../../lib/NamedChunksPlugin"); -var NamedModulesPlugin = require("../../../lib/NamedModulesPlugin"); - +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: { entry: "./entry" }, optimization: { + moduleIds: "named", + chunkIds: "named", splitChunks: { cacheGroups: { vendor: { @@ -17,6 +17,5 @@ module.exports = { } } } - }, - plugins: [new NamedChunksPlugin(), new NamedModulesPlugin()] + } }; diff --git a/test/statsCases/no-emit-on-errors-plugin-with-child-error/TestChildCompilationFailurePlugin.js b/test/statsCases/no-emit-on-errors-plugin-with-child-error/TestChildCompilationFailurePlugin.js index b0b50437796..5d2f170747f 100644 --- a/test/statsCases/no-emit-on-errors-plugin-with-child-error/TestChildCompilationFailurePlugin.js +++ b/test/statsCases/no-emit-on-errors-plugin-with-child-error/TestChildCompilationFailurePlugin.js @@ -1,25 +1,51 @@ "use strict"; -var SingleEntryPlugin = require("../../../lib/SingleEntryPlugin"); +/** @typedef {import("../../../").Compiler} Compiler */ +/** @typedef {import("../../../").EntryNormalized} EntryNormalized */ + +var EntryPlugin = require("../../../").EntryPlugin; /** * Runs a child compilation which produces an error in order to test that NoEmitErrorsPlugin * recognizes errors within child compilations. */ module.exports = class TestChildCompilationFailurePlugin { - + /** + * @param {{ filename: string }} output output + */ constructor(output) { this.output = output; } + /** + * @param {Compiler} compiler compiler + */ apply(compiler) { - compiler.hooks.make.tapAsync("TestChildCompilationFailurePlugin", (compilation, cb) => { - const child = compilation.createChildCompiler("child", this.output); - child.hooks.compilation.tap("TestChildCompilationFailurePlugin", childCompilation => { - childCompilation.errors.push(new Error("forced error")); - }); - new SingleEntryPlugin(compiler.options.context, compiler.options.entry, "child").apply(child); - child.runAsChild(cb); - }); + compiler.hooks.make.tapAsync( + "TestChildCompilationFailurePlugin", + (compilation, cb) => { + const child = compilation.createChildCompiler("child", this.output); + child.hooks.compilation.tap( + "TestChildCompilationFailurePlugin", + childCompilation => { + childCompilation.errors.push(new Error("forced error")); + } + ); + new EntryPlugin( + /** @type {string} */ + (compiler.options.context), + /** @type {string[]} */ + ( + /** @type {Exclude} */ + (compiler.options.entry).main.import + )[0], + "child" + ).apply(child); + child.runAsChild( + /** @type {EXPECTED_ANY} */ + (cb) + ); + } + ); } }; diff --git a/test/statsCases/no-emit-on-errors-plugin-with-child-error/webpack.config.js b/test/statsCases/no-emit-on-errors-plugin-with-child-error/webpack.config.js index 3fb337318da..1ed170b96ae 100644 --- a/test/statsCases/no-emit-on-errors-plugin-with-child-error/webpack.config.js +++ b/test/statsCases/no-emit-on-errors-plugin-with-child-error/webpack.config.js @@ -1,8 +1,9 @@ "use strict"; -var NoEmitOnErrorsPlugin = require("../../../lib/NoEmitOnErrorsPlugin"); -var TestChildCompilationFailurePlugin = require("./TestChildCompilationFailurePlugin"); +const NoEmitOnErrorsPlugin = require("../../../").NoEmitOnErrorsPlugin; +const TestChildCompilationFailurePlugin = require("./TestChildCompilationFailurePlugin"); +/** @type {import("../../../").Configuration} */ module.exports = { entry: "./index", output: { diff --git a/test/statsCases/optimize-chunks/webpack.config.js b/test/statsCases/optimize-chunks/webpack.config.js index ed379539078..efb9acd5dda 100644 --- a/test/statsCases/optimize-chunks/webpack.config.js +++ b/test/statsCases/optimize-chunks/webpack.config.js @@ -1,11 +1,15 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", stats: { + ids: true, reasons: false, modules: false, chunks: true, + chunkRelations: true, chunkModules: true, + dependentModules: true, chunkOrigins: true } }; diff --git a/test/statsCases/output-module/chunk.js b/test/statsCases/output-module/chunk.js new file mode 100644 index 00000000000..c835eddeda7 --- /dev/null +++ b/test/statsCases/output-module/chunk.js @@ -0,0 +1 @@ +export const message = "Hello Chunk"; diff --git a/test/statsCases/output-module/index.js b/test/statsCases/output-module/index.js new file mode 100644 index 00000000000..0440eaf5443 --- /dev/null +++ b/test/statsCases/output-module/index.js @@ -0,0 +1,10 @@ +import { message } from "./module"; + +console.log(message); + +export async function printMessage() { + const { message } = await import("./chunk"); + console.log(message); +} + +printMessage(); diff --git a/test/statsCases/output-module/module.js b/test/statsCases/output-module/module.js new file mode 100644 index 00000000000..6850805cf14 --- /dev/null +++ b/test/statsCases/output-module/module.js @@ -0,0 +1 @@ +export const message = "Hello World"; diff --git a/test/statsCases/output-module/webpack.config.js b/test/statsCases/output-module/webpack.config.js new file mode 100644 index 00000000000..164dbddbf6a --- /dev/null +++ b/test/statsCases/output-module/webpack.config.js @@ -0,0 +1,7 @@ +module.exports = { + mode: "production", + entry: "./index", + experiments: { + outputModule: true + } +}; diff --git a/test/statsCases/parse-error/webpack.config.js b/test/statsCases/parse-error/webpack.config.js index 1bc2a16d0d3..a5a7c03fe3e 100644 --- a/test/statsCases/parse-error/webpack.config.js +++ b/test/statsCases/parse-error/webpack.config.js @@ -1,5 +1,6 @@ "use strict"; +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", diff --git a/test/statsCases/performance-different-mode-and-target/webpack.config.js b/test/statsCases/performance-different-mode-and-target/webpack.config.js index 6e23f0dac62..99f80423cc3 100644 --- a/test/statsCases/performance-different-mode-and-target/webpack.config.js +++ b/test/statsCases/performance-different-mode-and-target/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration[]} */ module.exports = [ { entry: "./index", diff --git a/test/statsCases/performance-disabled/webpack.config.js b/test/statsCases/performance-disabled/webpack.config.js index 801f4a8da0c..49d1699527f 100644 --- a/test/statsCases/performance-disabled/webpack.config.js +++ b/test/statsCases/performance-disabled/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", diff --git a/test/statsCases/performance-error/webpack.config.js b/test/statsCases/performance-error/webpack.config.js index 285444ea347..2a53b983726 100644 --- a/test/statsCases/performance-error/webpack.config.js +++ b/test/statsCases/performance-error/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", diff --git a/test/statsCases/performance-no-async-chunks-shown/webpack.config.js b/test/statsCases/performance-no-async-chunks-shown/webpack.config.js index d015fde107a..1147c3f183f 100644 --- a/test/statsCases/performance-no-async-chunks-shown/webpack.config.js +++ b/test/statsCases/performance-no-async-chunks-shown/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: { diff --git a/test/statsCases/performance-no-hints/webpack.config.js b/test/statsCases/performance-no-hints/webpack.config.js index 1aed48513ac..793fe03db68 100644 --- a/test/statsCases/performance-no-hints/webpack.config.js +++ b/test/statsCases/performance-no-hints/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", diff --git a/test/statsCases/performance-oversize-limit-error/webpack.config.js b/test/statsCases/performance-oversize-limit-error/webpack.config.js index 9e37f0aef6c..79b0915ec4f 100644 --- a/test/statsCases/performance-oversize-limit-error/webpack.config.js +++ b/test/statsCases/performance-oversize-limit-error/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: { diff --git a/test/statsCases/prefetch-preload-mixed/webpack.config.js b/test/statsCases/prefetch-preload-mixed/webpack.config.js index 85c108d2ed7..d864bc6af94 100644 --- a/test/statsCases/prefetch-preload-mixed/webpack.config.js +++ b/test/statsCases/prefetch-preload-mixed/webpack.config.js @@ -1,8 +1,10 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", stats: { all: false, + chunkRelations: true, chunks: true } }; diff --git a/test/statsCases/prefetch/webpack.config.js b/test/statsCases/prefetch/webpack.config.js index 17dba56dbc3..b8a3ca5e08f 100644 --- a/test/statsCases/prefetch/webpack.config.js +++ b/test/statsCases/prefetch/webpack.config.js @@ -1,10 +1,14 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", stats: { all: false, assets: true, + ids: true, entrypoints: true, + chunkGroupChildren: true, + chunkRelations: true, chunks: true } }; diff --git a/test/statsCases/preload/webpack.config.js b/test/statsCases/preload/webpack.config.js index 17dba56dbc3..f84da434cfd 100644 --- a/test/statsCases/preload/webpack.config.js +++ b/test/statsCases/preload/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", @@ -5,6 +6,7 @@ module.exports = { all: false, assets: true, entrypoints: true, + chunkGroupChildren: true, chunks: true } }; diff --git a/test/statsCases/preset-detailed/webpack.config.js b/test/statsCases/preset-detailed/webpack.config.js index 2912acd3e4f..b3f4ace1f5a 100644 --- a/test/statsCases/preset-detailed/webpack.config.js +++ b/test/statsCases/preset-detailed/webpack.config.js @@ -1,5 +1,12 @@ +const LogTestPlugin = require("../../helpers/LogTestPlugin"); + +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", - stats: "detailed" + stats: "detailed", + infrastructureLogging: { + level: "log" + }, + plugins: [new LogTestPlugin()] }; diff --git a/test/statsCases/preset-errors-only-error/webpack.config.js b/test/statsCases/preset-errors-only-error/webpack.config.js index 7f65a605240..a07357ddad8 100644 --- a/test/statsCases/preset-errors-only-error/webpack.config.js +++ b/test/statsCases/preset-errors-only-error/webpack.config.js @@ -1,5 +1,12 @@ +const LogTestPlugin = require("../../helpers/LogTestPlugin"); + +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", - stats: "errors-only" + stats: "errors-only", + infrastructureLogging: { + level: "error" + }, + plugins: [new LogTestPlugin()] }; diff --git a/test/statsCases/preset-errors-only/webpack.config.js b/test/statsCases/preset-errors-only/webpack.config.js index 7f65a605240..04f99c80907 100644 --- a/test/statsCases/preset-errors-only/webpack.config.js +++ b/test/statsCases/preset-errors-only/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", diff --git a/test/statsCases/preset-errors-warnings/index.js b/test/statsCases/preset-errors-warnings/index.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/statsCases/preset-errors-warnings/webpack.config.js b/test/statsCases/preset-errors-warnings/webpack.config.js new file mode 100644 index 00000000000..68ce0928c70 --- /dev/null +++ b/test/statsCases/preset-errors-warnings/webpack.config.js @@ -0,0 +1,12 @@ +const LogTestPlugin = require("../../helpers/LogTestPlugin"); + +/** @type {import("../../../").Configuration} */ +module.exports = { + mode: "production", + entry: "./index", + stats: "errors-warnings", + infrastructureLogging: { + level: "warn" + }, + plugins: [new LogTestPlugin()] +}; diff --git a/test/statsCases/preset-minimal-simple/webpack.config.js b/test/statsCases/preset-minimal-simple/webpack.config.js index 53931799cc0..c4fb6fdc0ff 100644 --- a/test/statsCases/preset-minimal-simple/webpack.config.js +++ b/test/statsCases/preset-minimal-simple/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", diff --git a/test/statsCases/preset-minimal/webpack.config.js b/test/statsCases/preset-minimal/webpack.config.js index 53931799cc0..7ba0caf0a1a 100644 --- a/test/statsCases/preset-minimal/webpack.config.js +++ b/test/statsCases/preset-minimal/webpack.config.js @@ -1,5 +1,12 @@ +const LogTestPlugin = require("../../helpers/LogTestPlugin"); + +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", - stats: "minimal" + stats: "minimal", + infrastructureLogging: { + level: "warn" + }, + plugins: [new LogTestPlugin()] }; diff --git a/test/statsCases/preset-mixed-array/webpack.config.js b/test/statsCases/preset-mixed-array/webpack.config.js index 4b2a99a83e2..e4282dcf3f6 100644 --- a/test/statsCases/preset-mixed-array/webpack.config.js +++ b/test/statsCases/preset-mixed-array/webpack.config.js @@ -1,8 +1,12 @@ +/** @type {import("../../../").Configuration[]} */ module.exports = [ { name: "minimal", mode: "production", entry: "./index", + output: { + filename: "minimal.js" + }, stats: "minimal" }, @@ -10,6 +14,9 @@ module.exports = [ name: "none", mode: "production", entry: "./index", + output: { + filename: "none.js" + }, stats: false }, @@ -17,6 +24,9 @@ module.exports = [ name: "verbose", mode: "production", entry: "./index", + output: { + filename: "verbose.js" + }, stats: { entrypoints: true, hash: false, diff --git a/test/statsCases/preset-none-array/webpack.config.js b/test/statsCases/preset-none-array/webpack.config.js index 642b90fd435..8beaeabc609 100644 --- a/test/statsCases/preset-none-array/webpack.config.js +++ b/test/statsCases/preset-none-array/webpack.config.js @@ -1,13 +1,20 @@ +/** @type {import("../../../").Configuration[]} */ module.exports = [ { mode: "production", entry: "./index", + output: { + filename: "a.js" + }, stats: "none" }, { mode: "production", entry: "./index", + output: { + filename: "b.js" + }, stats: "none" } ]; diff --git a/test/statsCases/preset-none-error/webpack.config.js b/test/statsCases/preset-none-error/webpack.config.js index e99589235da..fc5edb6b418 100644 --- a/test/statsCases/preset-none-error/webpack.config.js +++ b/test/statsCases/preset-none-error/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", diff --git a/test/statsCases/preset-none/webpack.config.js b/test/statsCases/preset-none/webpack.config.js index e99589235da..54cc4b2d3e6 100644 --- a/test/statsCases/preset-none/webpack.config.js +++ b/test/statsCases/preset-none/webpack.config.js @@ -1,5 +1,9 @@ +const LogTestPlugin = require("../../helpers/LogTestPlugin"); + +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", - stats: false + stats: false, + plugins: [new LogTestPlugin()] }; diff --git a/test/statsCases/preset-normal-performance-ensure-filter-sourcemaps/webpack.config.js b/test/statsCases/preset-normal-performance-ensure-filter-sourcemaps/webpack.config.js index dcaca531143..919599037a0 100644 --- a/test/statsCases/preset-normal-performance-ensure-filter-sourcemaps/webpack.config.js +++ b/test/statsCases/preset-normal-performance-ensure-filter-sourcemaps/webpack.config.js @@ -1,6 +1,7 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", - devtool: "sourcemap", + devtool: "source-map", performance: { hints: "warning" }, diff --git a/test/statsCases/preset-normal-performance/webpack.config.js b/test/statsCases/preset-normal-performance/webpack.config.js index bc76bd6985c..1de6394e577 100644 --- a/test/statsCases/preset-normal-performance/webpack.config.js +++ b/test/statsCases/preset-normal-performance/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", diff --git a/test/statsCases/preset-normal/webpack.config.js b/test/statsCases/preset-normal/webpack.config.js index 0bd5f398a97..6b76a5c3bb6 100644 --- a/test/statsCases/preset-normal/webpack.config.js +++ b/test/statsCases/preset-normal/webpack.config.js @@ -1,5 +1,9 @@ +const LogTestPlugin = require("../../helpers/LogTestPlugin"); + +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", - stats: "normal" + stats: "normal", + plugins: [new LogTestPlugin()] }; diff --git a/test/statsCases/preset-summary/index.js b/test/statsCases/preset-summary/index.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/statsCases/preset-summary/webpack.config.js b/test/statsCases/preset-summary/webpack.config.js new file mode 100644 index 00000000000..b3cc92ca604 --- /dev/null +++ b/test/statsCases/preset-summary/webpack.config.js @@ -0,0 +1,9 @@ +const LogTestPlugin = require("../../helpers/LogTestPlugin"); + +/** @type {import("../../../").Configuration} */ +module.exports = { + mode: "production", + entry: "./index", + stats: "summary", + plugins: [new LogTestPlugin()] +}; diff --git a/test/statsCases/preset-verbose/webpack.config.js b/test/statsCases/preset-verbose/webpack.config.js index c44f313ee8d..912534b998c 100644 --- a/test/statsCases/preset-verbose/webpack.config.js +++ b/test/statsCases/preset-verbose/webpack.config.js @@ -1,6 +1,13 @@ +const LogTestPlugin = require("../../helpers/LogTestPlugin"); + +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", profile: true, - stats: "verbose" + stats: "verbose", + infrastructureLogging: { + level: "verbose" + }, + plugins: [new LogTestPlugin()] }; diff --git a/test/statsCases/real-content-hash/a/a.js b/test/statsCases/real-content-hash/a/a.js new file mode 100644 index 00000000000..702f4280cee --- /dev/null +++ b/test/statsCases/real-content-hash/a/a.js @@ -0,0 +1 @@ +console.log("hello"); diff --git a/test/statsCases/real-content-hash/a/b.js b/test/statsCases/real-content-hash/a/b.js new file mode 100644 index 00000000000..96825f2fba5 --- /dev/null +++ b/test/statsCases/real-content-hash/a/b.js @@ -0,0 +1,4 @@ +// yes that's important +if (true) { + console.log("hel" + "lo"); +} diff --git a/test/statsCases/real-content-hash/a/file.jpg b/test/statsCases/real-content-hash/a/file.jpg new file mode 100644 index 00000000000..fe5c6eefa79 Binary files /dev/null and b/test/statsCases/real-content-hash/a/file.jpg differ diff --git a/test/statsCases/real-content-hash/a/file.png b/test/statsCases/real-content-hash/a/file.png new file mode 100644 index 00000000000..fb53b9dedd3 Binary files /dev/null and b/test/statsCases/real-content-hash/a/file.png differ diff --git a/test/statsCases/real-content-hash/a/index.js b/test/statsCases/real-content-hash/a/index.js new file mode 100644 index 00000000000..0777ca1f5e5 --- /dev/null +++ b/test/statsCases/real-content-hash/a/index.js @@ -0,0 +1,4 @@ +// Comment 2019 +const inlinedVariable = "test"; +console.log(inlinedVariable, require("./file.jpg")); +import(/* webpackChunkName: "lazy" */ "./lazy"); diff --git a/test/statsCases/real-content-hash/a/lazy.js b/test/statsCases/real-content-hash/a/lazy.js new file mode 100644 index 00000000000..75de8668db3 --- /dev/null +++ b/test/statsCases/real-content-hash/a/lazy.js @@ -0,0 +1,3 @@ +import test from "./module"; +import url from "./file.png"; +console.log(test, url, new URL("file.jpg?query", import.meta.url)); diff --git a/test/statsCases/real-content-hash/a/module.js b/test/statsCases/real-content-hash/a/module.js new file mode 100644 index 00000000000..25d9a1de703 --- /dev/null +++ b/test/statsCases/real-content-hash/a/module.js @@ -0,0 +1 @@ +export default 40 + 2; diff --git a/test/statsCases/real-content-hash/b/a.js b/test/statsCases/real-content-hash/b/a.js new file mode 100644 index 00000000000..702f4280cee --- /dev/null +++ b/test/statsCases/real-content-hash/b/a.js @@ -0,0 +1 @@ +console.log("hello"); diff --git a/test/statsCases/real-content-hash/b/b.js b/test/statsCases/real-content-hash/b/b.js new file mode 100644 index 00000000000..96825f2fba5 --- /dev/null +++ b/test/statsCases/real-content-hash/b/b.js @@ -0,0 +1,4 @@ +// yes that's important +if (true) { + console.log("hel" + "lo"); +} diff --git a/test/statsCases/real-content-hash/b/file.jpg b/test/statsCases/real-content-hash/b/file.jpg new file mode 100644 index 00000000000..fe5c6eefa79 Binary files /dev/null and b/test/statsCases/real-content-hash/b/file.jpg differ diff --git a/test/statsCases/real-content-hash/b/file.png b/test/statsCases/real-content-hash/b/file.png new file mode 100644 index 00000000000..fb53b9dedd3 Binary files /dev/null and b/test/statsCases/real-content-hash/b/file.png differ diff --git a/test/statsCases/real-content-hash/b/index.js b/test/statsCases/real-content-hash/b/index.js new file mode 100644 index 00000000000..ae72659c661 --- /dev/null +++ b/test/statsCases/real-content-hash/b/index.js @@ -0,0 +1,3 @@ +// Comment 2020 +console.log("test", require("./file.jpg")); +import(/* webpackChunkName: "lazy" */ "./lazy"); diff --git a/test/statsCases/real-content-hash/b/lazy.js b/test/statsCases/real-content-hash/b/lazy.js new file mode 100644 index 00000000000..75de8668db3 --- /dev/null +++ b/test/statsCases/real-content-hash/b/lazy.js @@ -0,0 +1,3 @@ +import test from "./module"; +import url from "./file.png"; +console.log(test, url, new URL("file.jpg?query", import.meta.url)); diff --git a/test/statsCases/real-content-hash/b/module.js b/test/statsCases/real-content-hash/b/module.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/statsCases/real-content-hash/b/module.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/statsCases/real-content-hash/test.config.js b/test/statsCases/real-content-hash/test.config.js new file mode 100644 index 00000000000..a0a96aea222 --- /dev/null +++ b/test/statsCases/real-content-hash/test.config.js @@ -0,0 +1,42 @@ +const fs = require("fs"); +const path = require("path"); +const createHash = require("../../../lib/util/createHash"); + +const hashedFiles = { + "file.jpg": a => a.name.endsWith(".jpg"), + "file.png": a => a.name.endsWith(".png") +}; + +module.exports = { + validate(stats) { + for (let i = 0; i < 4; i += 2) { + const a = stats.stats[i + 0].toJson({ + assets: true + }); + const b = stats.stats[i + 1].toJson({ + assets: true + }); + expect(Object.keys(a.assetsByChunkName).length).toBe(5); + expect(a.assetsByChunkName.main).toEqual(b.assetsByChunkName.main); + expect(a.assetsByChunkName.lazy).toEqual(b.assetsByChunkName.lazy); + expect(a.assetsByChunkName.a).toEqual(b.assetsByChunkName.a); + expect(a.assetsByChunkName.b).toEqual(b.assetsByChunkName.b); + expect(a.assetsByChunkName.a).toEqual(a.assetsByChunkName.b); + } + for (let i = 0; i < 4; i++) { + const statsData = stats.stats[i].toJson({ + assets: true + }); + for (const name of Object.keys(hashedFiles)) { + const asset = statsData.assets.find(hashedFiles[name]); + expect(asset).not.toBe(undefined); + const content = fs.readFileSync(path.resolve(__dirname, "a", name)); + const hash = createHash("md4") + .update(content) + .digest("hex") + .slice(0, 20); + expect(asset.name.slice(0, 20)).toBe(hash); + } + } + } +}; diff --git a/test/statsCases/real-content-hash/webpack.config.js b/test/statsCases/real-content-hash/webpack.config.js new file mode 100644 index 00000000000..ff7970c9a6a --- /dev/null +++ b/test/statsCases/real-content-hash/webpack.config.js @@ -0,0 +1,88 @@ +const path = require("path"); + +/** @type {import("../../../").Configuration} */ +const base = { + mode: "production", + entry: { + index: { + import: "./index", + runtime: "runtime" + }, + a: "./a", + b: "./b" + }, + module: { + generator: { + asset: { + filename: "[hash][ext][query]" + } + }, + rules: [ + { + test: /\.(png|jpg)$/, + type: "asset/resource" + } + ] + }, + optimization: { + minimize: true + }, + stats: { + relatedAssets: true, + cachedAssets: true + } +}; + +/** @type {import("../../../").Configuration[]} */ +module.exports = [ + { + ...base, + name: "a-normal", + context: path.resolve(__dirname, "a"), + output: { + path: path.resolve( + __dirname, + "../../js/stats/real-content-hash/a-normal" + ), + filename: "[contenthash]-[contenthash:6].js" + } + }, + { + ...base, + name: "b-normal", + context: path.resolve(__dirname, "b"), + output: { + path: path.resolve( + __dirname, + "../../js/stats/real-content-hash/b-normal" + ), + filename: "[contenthash]-[contenthash:6].js" + } + }, + { + ...base, + context: path.resolve(__dirname, "a"), + name: "a-source-map", + devtool: "source-map", + output: { + path: path.resolve( + __dirname, + "../../js/stats/real-content-hash/a-source-map" + ), + filename: "[contenthash]-[contenthash:6].js" + } + }, + { + ...base, + context: path.resolve(__dirname, "b"), + name: "b-source-map", + devtool: "source-map", + output: { + path: path.resolve( + __dirname, + "../../js/stats/real-content-hash/b-source-map" + ), + filename: "[contenthash]-[contenthash:6].js" + } + } +]; diff --git a/test/statsCases/related-assets/chunk-style.css b/test/statsCases/related-assets/chunk-style.css new file mode 100644 index 00000000000..c0dd09def3e --- /dev/null +++ b/test/statsCases/related-assets/chunk-style.css @@ -0,0 +1,3 @@ +.chunk { + color: red; +} diff --git a/test/statsCases/related-assets/chunk.js b/test/statsCases/related-assets/chunk.js new file mode 100644 index 00000000000..57e1b4712d0 --- /dev/null +++ b/test/statsCases/related-assets/chunk.js @@ -0,0 +1 @@ +import "./chunk-style.css"; diff --git a/test/statsCases/related-assets/file.jpg b/test/statsCases/related-assets/file.jpg new file mode 100644 index 00000000000..fe5c6eefa79 Binary files /dev/null and b/test/statsCases/related-assets/file.jpg differ diff --git a/test/statsCases/related-assets/index.js b/test/statsCases/related-assets/index.js new file mode 100644 index 00000000000..d265dd810f0 --- /dev/null +++ b/test/statsCases/related-assets/index.js @@ -0,0 +1,5 @@ +import "./style.css"; + +import("./chunk"); + +new URL("./file.jpg", import.meta.url); diff --git a/test/statsCases/related-assets/style.css b/test/statsCases/related-assets/style.css new file mode 100644 index 00000000000..f815695493b --- /dev/null +++ b/test/statsCases/related-assets/style.css @@ -0,0 +1,3 @@ +body { + color: green; +} diff --git a/test/statsCases/related-assets/test.config.js b/test/statsCases/related-assets/test.config.js new file mode 100644 index 00000000000..965ad45e551 --- /dev/null +++ b/test/statsCases/related-assets/test.config.js @@ -0,0 +1,13 @@ +module.exports = { + validate(stats) { + for (const item of stats.stats) { + const json = item.toJson({ assets: true }); + + for (const asset of json.assets) { + if (asset.related) { + expect(asset.related).toBeInstanceOf(Array); + } + } + } + } +}; diff --git a/test/statsCases/related-assets/webpack.config.js b/test/statsCases/related-assets/webpack.config.js new file mode 100644 index 00000000000..130cf25502c --- /dev/null +++ b/test/statsCases/related-assets/webpack.config.js @@ -0,0 +1,126 @@ +/** @typedef {import("../../../").Compiler} Compiler */ +/** @typedef {import("../../../").Configuration} Configuration */ + +const MCEP = require("mini-css-extract-plugin"); +const { Compilation } = require("../../../"); + +/** + * @param {string[]} exts extensions + * @returns {(compiler: Compiler) => void} callback for comperssion + */ +const compression = exts => compiler => { + compiler.hooks.thisCompilation.tap("Test", compilation => { + compilation.hooks.processAssets.tap( + { + name: "Test", + stage: Compilation.PROCESS_ASSETS_STAGE_OPTIMIZE_TRANSFER + }, + () => { + for (const asset of compilation.getAssets()) { + for (const ext of exts) { + if (asset.name.endsWith(".jpg")) { + continue; + } + const newFile = `${asset.name}${ext}`; + compilation.emitAsset(newFile, asset.source); + compilation.updateAsset(asset.name, asset.source, { + related: { + compressed: ["...", newFile] + } + }); + } + } + } + ); + }); +}; + +/** + * @param {string} name name + * @returns {Configuration} configuration + */ +const base = name => ({ + name, + mode: "development", + devtool: "source-map", + entry: "./index", + output: { + filename: `${name}-[name].js`, + assetModuleFilename: `${name}-[name][ext]`, + pathinfo: false + }, + module: { + rules: [ + { + test: /\.css$/, + use: [ + MCEP.loader, + { + loader: "css-loader", + options: { + sourceMap: true + } + } + ] + } + ] + }, + plugins: [ + new MCEP({ + filename: `${name}-[name].css` + }), + compression([".br", ".gz"]) + ] +}); + +const baseStats = { + entrypoints: false, + modules: false, + timings: false, + version: false, + hash: false, + builtAt: false, + errorsCount: false, + warningsCount: false +}; + +/** @type {import("../../../").Configuration} */ +module.exports = [ + { + ...base("default"), + stats: { + ...baseStats + } + }, + { + ...base("relatedAssets"), + stats: { + ...baseStats, + relatedAssets: true + } + }, + { + ...base("exclude1"), + stats: { + ...baseStats, + relatedAssets: true, + excludeAssets: /\.(gz|br)$/ + } + }, + { + ...base("exclude2"), + stats: { + ...baseStats, + relatedAssets: true, + excludeAssets: /\.map$/ + } + }, + { + ...base("exclude3"), + stats: { + ...baseStats, + relatedAssets: true, + excludeAssets: /chunk/ + } + } +]; diff --git a/test/statsCases/resolve-plugin-context/ResolvePackageFromRootPlugin.js b/test/statsCases/resolve-plugin-context/ResolvePackageFromRootPlugin.js index 9e8fa50ec22..2cabac479d3 100644 --- a/test/statsCases/resolve-plugin-context/ResolvePackageFromRootPlugin.js +++ b/test/statsCases/resolve-plugin-context/ResolvePackageFromRootPlugin.js @@ -1,5 +1,14 @@ "use strict"; +/** @typedef {import("enhanced-resolve").Resolver} Resolver */ +/** @typedef {import("enhanced-resolve").ResolveRequest} ResolveRequest */ +/** @typedef {import("enhanced-resolve").ResolveContext} ResolveContext */ + +/** + * @template T, R + * @typedef {import("tapable").AsyncSeriesBailHook} AsyncSeriesBailHook + */ + const nestedNodeModuleRegex = /node_modules.*node_modules/; const replaceNodeModuleRegex = /^.*node_modules(\/|\\)/; @@ -13,15 +22,24 @@ const replaceNodeModuleRegex = /^.*node_modules(\/|\\)/; * Note: this plugin has a very stupid algorithm to check semver constraints and works only with fixed versions. */ module.exports = class ResolvePackageFromRootPlugin { - + /** + * @param {string} context context + */ constructor(context) { this.rootPath = context; } + /** + * @param {Resolver & { hooks: { resolved: AsyncSeriesBailHook<[ResolveRequest & { context: { issuer: string } }, ResolveContext], null | ResolveRequest> } }} resolver resolver + */ apply(resolver) { resolver.hooks.resolved.tapAsync("ResolvePackageFromRootPlugin", (originalResolved, _, callback) => { - if (!nestedNodeModuleRegex.test(originalResolved.path) || !originalResolved.context || !originalResolved.context.issuer) { + if (!nestedNodeModuleRegex.test( + /** @type {string} */ + (originalResolved.path) + ) || !originalResolved.context || ! + (originalResolved.context).issuer) { return callback(null, originalResolved) } @@ -34,20 +52,34 @@ module.exports = class ResolvePackageFromRootPlugin { return callback(null, originalResolved); } - const moduleRequestPath = originalResolved.path.replace(replaceNodeModuleRegex, ""); + const moduleRequestPath = /** @type {string} */ (originalResolved.path).replace(replaceNodeModuleRegex, ""); resolver.doResolve(resolver.hooks.resolve, { context: {}, path: this.rootPath, request: moduleRequestPath - }, `resolve ${moduleRequestPath} in ${this.rootPath}`, {}, (err, resolvedInParentContext) => { + }, `resolve ${moduleRequestPath} in ${this.rootPath}`, {}, (err, _resolvedInParentContext) => { if (err) { return callback(null, originalResolved); } - const packageName = resolvedInParentContext.descriptionFileData.name; - const resolvedVersion = resolvedInParentContext.descriptionFileData.version; - const wantedVersion = issuer.descriptionFileData.dependencies[packageName]; + const resolvedInParentContext = /** @type {ResolveRequest} */ (_resolvedInParentContext); + + const packageName = + /** @type {NonNullable} */ + (resolvedInParentContext.descriptionFileData).name; + const resolvedVersion = + /** @type {NonNullable} */ + (resolvedInParentContext.descriptionFileData).version; + const wantedVersion = + /** @type {{ dependencies: Record }} */ + ( + /** @type {ResolveRequest} */ + (issuer).descriptionFileData + ).dependencies[ + /** @type {string} */ + (packageName) + ]; if (resolvedVersion !== wantedVersion) { return callback(null, originalResolved); diff --git a/test/statsCases/resolve-plugin-context/webpack.config.js b/test/statsCases/resolve-plugin-context/webpack.config.js index 5d7be1fe4b8..7fb04fdaff8 100644 --- a/test/statsCases/resolve-plugin-context/webpack.config.js +++ b/test/statsCases/resolve-plugin-context/webpack.config.js @@ -1,5 +1,6 @@ -var ResolvePackageFromRootPlugin = require("./ResolvePackageFromRootPlugin"); +const ResolvePackageFromRootPlugin = require("./ResolvePackageFromRootPlugin"); +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", diff --git a/test/statsCases/reverse-sort-modules/webpack.config.js b/test/statsCases/reverse-sort-modules/webpack.config.js index f1f2620ecf2..92793287950 100644 --- a/test/statsCases/reverse-sort-modules/webpack.config.js +++ b/test/statsCases/reverse-sort-modules/webpack.config.js @@ -1,9 +1,10 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", performance: false, stats: { - maxModules: 20, - modulesSort: "!id" + modulesSpace: Infinity, + modulesSort: "!name" } }; diff --git a/test/statsCases/runtime-chunk-integration/main2.js b/test/statsCases/runtime-chunk-integration/main2.js new file mode 100644 index 00000000000..bd360e75dff --- /dev/null +++ b/test/statsCases/runtime-chunk-integration/main2.js @@ -0,0 +1 @@ +export default "2"; diff --git a/test/statsCases/runtime-chunk-integration/main3.js b/test/statsCases/runtime-chunk-integration/main3.js new file mode 100644 index 00000000000..b014c4b6570 --- /dev/null +++ b/test/statsCases/runtime-chunk-integration/main3.js @@ -0,0 +1 @@ +export default "3"; diff --git a/test/statsCases/runtime-chunk-integration/webpack.config.js b/test/statsCases/runtime-chunk-integration/webpack.config.js index 6ee9324a2f6..773ef5e9724 100644 --- a/test/statsCases/runtime-chunk-integration/webpack.config.js +++ b/test/statsCases/runtime-chunk-integration/webpack.config.js @@ -1,11 +1,9 @@ -const MinChunkSizePlugin = require("../../../lib/optimize/MinChunkSizePlugin"); +const { MinChunkSizePlugin } = require("../../../").optimize; +/** @type {import("../../../").Configuration} */ const baseConfig = { mode: "production", target: "web", - output: { - filename: "[name].js" - }, stats: { hash: false, timings: false, @@ -18,7 +16,12 @@ const baseConfig = { ] }; -const withoutNamedEntry = Object.assign({}, baseConfig, { +/** @type {import("../../../").Configuration} */ +const withoutNamedEntry = { + ...baseConfig, + output: { + filename: "without-[name].js" + }, name: "base", entry: { main1: "./main1" @@ -26,19 +29,45 @@ const withoutNamedEntry = Object.assign({}, baseConfig, { optimization: { runtimeChunk: "single" } -}); +}; -const withNamedEntry = Object.assign({}, baseConfig, { - name: "manifest is named entry", +/** @type {import("../../../").Configuration} */ +const withNamedEntry = { + ...baseConfig, + output: { + filename: "with-[name].js" + }, + name: "static custom name", entry: { main1: "./main1", - manifest: "./f" + main2: "./main2", + main3: "./main3" }, optimization: { runtimeChunk: { name: "manifest" } } -}); +}; + +/** @type {import("../../../").Configuration} */ +const withFunctionEntry = { + ...baseConfig, + output: { + filename: "func-[name].js" + }, + name: "dynamic custom name", + entry: { + main1: "./main1", + main2: "./main2", + main3: "./main3" + }, + optimization: { + runtimeChunk: { + name: ({ name }) => (name === "main3" ? "a" : "b") + } + } +}; -module.exports = [withoutNamedEntry, withNamedEntry]; +/** @type {import("../../../").Configuration[]} */ +module.exports = [withoutNamedEntry, withNamedEntry, withFunctionEntry]; diff --git a/test/statsCases/runtime-chunk-issue-7382/webpack.config.js b/test/statsCases/runtime-chunk-issue-7382/webpack.config.js index ba14189a142..b44443f5016 100644 --- a/test/statsCases/runtime-chunk-issue-7382/webpack.config.js +++ b/test/statsCases/runtime-chunk-issue-7382/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "development", entry: { diff --git a/test/statsCases/runtime-chunk-single/webpack.config.js b/test/statsCases/runtime-chunk-single/webpack.config.js index 0a10b262f95..f5b3476f7ee 100644 --- a/test/statsCases/runtime-chunk-single/webpack.config.js +++ b/test/statsCases/runtime-chunk-single/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "development", entry: { @@ -5,7 +6,8 @@ module.exports = { e2: "./e2" }, output: { - filename: "[name].js" + filename: "[name].js", + chunkFilename: "[name].chunk.js" }, stats: { hash: false, diff --git a/test/statsCases/runtime-chunk/webpack.config.js b/test/statsCases/runtime-chunk/webpack.config.js index 0abe241e7f4..8bbebaa7bcc 100644 --- a/test/statsCases/runtime-chunk/webpack.config.js +++ b/test/statsCases/runtime-chunk/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "development", entry: { diff --git a/test/statsCases/runtime-specific-used-exports/a.js b/test/statsCases/runtime-specific-used-exports/a.js new file mode 100644 index 00000000000..9835dc4c61b --- /dev/null +++ b/test/statsCases/runtime-specific-used-exports/a.js @@ -0,0 +1,10 @@ +import { x } from "./module"; +import { x as xRe } from "./reexport"; +import importDx from "./dx-importer"; + +(async () => { + const dx = await importDx(); + const dy = await import("./dy"); + const dw = await import("./dw"); + console.log(x, xRe, dx, dy, dw); +})(); diff --git a/test/statsCases/runtime-specific-used-exports/b.js b/test/statsCases/runtime-specific-used-exports/b.js new file mode 100644 index 00000000000..da1c86ea79c --- /dev/null +++ b/test/statsCases/runtime-specific-used-exports/b.js @@ -0,0 +1,10 @@ +import { y } from "./module"; +import { y as yRe } from "./reexport"; +import importDx from "./dx-importer"; + +(async () => { + const dx = await importDx(); + const dz = await import("./dz"); + const dw = await import("./dw"); + console.log(y, yRe, dx, dz, dw); +})(); diff --git a/test/statsCases/runtime-specific-used-exports/c.js b/test/statsCases/runtime-specific-used-exports/c.js new file mode 100644 index 00000000000..8b1a393741c --- /dev/null +++ b/test/statsCases/runtime-specific-used-exports/c.js @@ -0,0 +1 @@ +// empty diff --git a/test/statsCases/runtime-specific-used-exports/dw.js b/test/statsCases/runtime-specific-used-exports/dw.js new file mode 100644 index 00000000000..a36bba330d4 --- /dev/null +++ b/test/statsCases/runtime-specific-used-exports/dw.js @@ -0,0 +1 @@ +export { w, identity } from "./module?chunk"; diff --git a/test/statsCases/runtime-specific-used-exports/dx-importer.js b/test/statsCases/runtime-specific-used-exports/dx-importer.js new file mode 100644 index 00000000000..4efca616142 --- /dev/null +++ b/test/statsCases/runtime-specific-used-exports/dx-importer.js @@ -0,0 +1,3 @@ +export default function importDx() { + return import("./dx"); +} diff --git a/test/statsCases/runtime-specific-used-exports/dx.js b/test/statsCases/runtime-specific-used-exports/dx.js new file mode 100644 index 00000000000..4b88762dbb1 --- /dev/null +++ b/test/statsCases/runtime-specific-used-exports/dx.js @@ -0,0 +1 @@ +export { x, identity } from "./module?chunk"; diff --git a/test/statsCases/runtime-specific-used-exports/dy.js b/test/statsCases/runtime-specific-used-exports/dy.js new file mode 100644 index 00000000000..1536b781f60 --- /dev/null +++ b/test/statsCases/runtime-specific-used-exports/dy.js @@ -0,0 +1 @@ +export { y, identity } from "./module?chunk"; diff --git a/test/statsCases/runtime-specific-used-exports/dz.js b/test/statsCases/runtime-specific-used-exports/dz.js new file mode 100644 index 00000000000..636868e9603 --- /dev/null +++ b/test/statsCases/runtime-specific-used-exports/dz.js @@ -0,0 +1 @@ +export { z, identity } from "./module?chunk"; diff --git a/test/statsCases/runtime-specific-used-exports/module.js b/test/statsCases/runtime-specific-used-exports/module.js new file mode 100644 index 00000000000..372b6f6fa23 --- /dev/null +++ b/test/statsCases/runtime-specific-used-exports/module.js @@ -0,0 +1,5 @@ +export const w = "w"; +export const x = "x"; +export const y = "y"; +export const z = "z"; +export const identity = Symbol(); diff --git a/test/statsCases/runtime-specific-used-exports/reexport.js b/test/statsCases/runtime-specific-used-exports/reexport.js new file mode 100644 index 00000000000..c497efb280f --- /dev/null +++ b/test/statsCases/runtime-specific-used-exports/reexport.js @@ -0,0 +1 @@ +export * from "./module?reexported"; diff --git a/test/statsCases/runtime-specific-used-exports/webpack.config.js b/test/statsCases/runtime-specific-used-exports/webpack.config.js new file mode 100644 index 00000000000..4f37ce2c369 --- /dev/null +++ b/test/statsCases/runtime-specific-used-exports/webpack.config.js @@ -0,0 +1,59 @@ +const entry = { + a: "./a", + b: "./b", + c: "./c" +}; + +const stats = { + usedExports: true, + chunks: true, + chunkModules: true, + dependentModules: true, + modules: true, + orphanModules: true, + nestedModules: true +}; + +/** @type {import("../../../").Configuration[]} */ +module.exports = [ + { + name: "production", + mode: "production", + output: { + filename: "production-[name].js" + }, + optimization: { + concatenateModules: false, + chunkIds: "named" + }, + entry, + stats + }, + { + name: "development", + mode: "development", + output: { + filename: "development-[name].js" + }, + optimization: { + concatenateModules: false, + chunkIds: "named" + }, + entry, + stats + }, + { + name: "global", + mode: "production", + output: { + filename: "global-[name].js" + }, + optimization: { + concatenateModules: false, + chunkIds: "named", + usedExports: "global" + }, + entry, + stats + } +]; diff --git a/test/statsCases/scope-hoisting-bailouts/index.js b/test/statsCases/scope-hoisting-bailouts/index.js index 4b47535dfa4..c32d15297b5 100644 --- a/test/statsCases/scope-hoisting-bailouts/index.js +++ b/test/statsCases/scope-hoisting-bailouts/index.js @@ -1,7 +1,6 @@ import "./cjs"; import "./entry"; import "./eval"; -import "./injected-vars"; import "./module-id"; import "./module-loaded"; import "./ref-from-cjs"; diff --git a/test/statsCases/scope-hoisting-bailouts/injected-vars.js b/test/statsCases/scope-hoisting-bailouts/injected-vars.js deleted file mode 100644 index ceab8aa3163..00000000000 --- a/test/statsCases/scope-hoisting-bailouts/injected-vars.js +++ /dev/null @@ -1 +0,0 @@ -export default [__dirname, __filename]; diff --git a/test/statsCases/scope-hoisting-bailouts/webpack.config.js b/test/statsCases/scope-hoisting-bailouts/webpack.config.js index 217a56fcc80..61a8acc6d76 100644 --- a/test/statsCases/scope-hoisting-bailouts/webpack.config.js +++ b/test/statsCases/scope-hoisting-bailouts/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: { @@ -11,6 +12,7 @@ module.exports = { externals: ["external"], stats: { assets: false, + orphanModules: true, optimizationBailout: true } }; diff --git a/test/statsCases/scope-hoisting-multi/first.js b/test/statsCases/scope-hoisting-multi/first.js index eac72ca132f..3b36a720e7d 100644 --- a/test/statsCases/scope-hoisting-multi/first.js +++ b/test/statsCases/scope-hoisting-multi/first.js @@ -2,5 +2,7 @@ import v from "./vendor"; import c from "./common"; import x from "./module_first"; -import(/* webpackChunkName: "lazy_first" */"./lazy_first"); -import(/* webpackChunkName: "lazy_shared" */"./lazy_shared"); +import(/* webpackChunkName: "lazy_first" */ "./lazy_first"); +import(/* webpackChunkName: "lazy_shared" */ "./lazy_shared"); + +export default v + c + x; diff --git a/test/statsCases/scope-hoisting-multi/lazy_first.js b/test/statsCases/scope-hoisting-multi/lazy_first.js index ca72b4a85bc..c12ce00629a 100644 --- a/test/statsCases/scope-hoisting-multi/lazy_first.js +++ b/test/statsCases/scope-hoisting-multi/lazy_first.js @@ -1,2 +1,3 @@ -import "./common_lazy"; -import "./common_lazy_shared"; +import a from "./common_lazy"; +import b from "./common_lazy_shared"; +export default a + b; diff --git a/test/statsCases/scope-hoisting-multi/lazy_second.js b/test/statsCases/scope-hoisting-multi/lazy_second.js index ca72b4a85bc..c12ce00629a 100644 --- a/test/statsCases/scope-hoisting-multi/lazy_second.js +++ b/test/statsCases/scope-hoisting-multi/lazy_second.js @@ -1,2 +1,3 @@ -import "./common_lazy"; -import "./common_lazy_shared"; +import a from "./common_lazy"; +import b from "./common_lazy_shared"; +export default a + b; diff --git a/test/statsCases/scope-hoisting-multi/lazy_shared.js b/test/statsCases/scope-hoisting-multi/lazy_shared.js index fd4ea8dc510..d48e87c659a 100644 --- a/test/statsCases/scope-hoisting-multi/lazy_shared.js +++ b/test/statsCases/scope-hoisting-multi/lazy_shared.js @@ -1 +1,2 @@ -import "./common_lazy_shared"; +import a from "./common_lazy_shared"; +export default a; diff --git a/test/statsCases/scope-hoisting-multi/second.js b/test/statsCases/scope-hoisting-multi/second.js index bfe7cd704be..2d460cf416a 100644 --- a/test/statsCases/scope-hoisting-multi/second.js +++ b/test/statsCases/scope-hoisting-multi/second.js @@ -1,5 +1,7 @@ import v from "./vendor"; import c from "./common"; -import(/* webpackChunkName: "lazy_second" */"./lazy_second"); -import(/* webpackChunkName: "lazy_shared" */"./lazy_shared"); +import(/* webpackChunkName: "lazy_second" */ "./lazy_second"); +import(/* webpackChunkName: "lazy_shared" */ "./lazy_shared"); + +export default v + c; diff --git a/test/statsCases/scope-hoisting-multi/webpack.config.js b/test/statsCases/scope-hoisting-multi/webpack.config.js index 168d64fc2f6..392007e703f 100644 --- a/test/statsCases/scope-hoisting-multi/webpack.config.js +++ b/test/statsCases/scope-hoisting-multi/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration[]} */ module.exports = [ { mode: "production", @@ -7,7 +8,7 @@ module.exports = [ }, target: "web", output: { - filename: "[name].js" + filename: "a-[name].js" }, optimization: { concatenateModules: false, @@ -35,7 +36,7 @@ module.exports = [ }, target: "web", output: { - filename: "[name].js" + filename: "b-[name].js" }, optimization: { splitChunks: { @@ -51,6 +52,7 @@ module.exports = [ }, stats: { assets: false, + orphanModules: true, optimizationBailout: true } } diff --git a/test/statsCases/side-effects-issue-7428/webpack.config.js b/test/statsCases/side-effects-issue-7428/webpack.config.js index 5d0abd9e3cd..7d6f086d647 100644 --- a/test/statsCases/side-effects-issue-7428/webpack.config.js +++ b/test/statsCases/side-effects-issue-7428/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "none", entry: "./main.js", @@ -7,6 +8,7 @@ module.exports = { concatenateModules: true }, stats: { + orphanModules: true, nestedModules: true, usedExports: true, reasons: true diff --git a/test/statsCases/side-effects-optimization/index.js b/test/statsCases/side-effects-optimization/index.js new file mode 100644 index 00000000000..7c36899c867 --- /dev/null +++ b/test/statsCases/side-effects-optimization/index.js @@ -0,0 +1,4 @@ +import { huh, a } from "big-module"; +import { smallVar } from "module-with-export"; + +console.log(huh, a, smallVar); diff --git a/test/statsCases/side-effects-optimization/node_modules/big-module/a.js b/test/statsCases/side-effects-optimization/node_modules/big-module/a.js new file mode 100644 index 00000000000..cd1e633707d --- /dev/null +++ b/test/statsCases/side-effects-optimization/node_modules/big-module/a.js @@ -0,0 +1,2 @@ +export * from "module-with-export"; +export const a = "a"; diff --git a/test/statsCases/side-effects-optimization/node_modules/big-module/index.js b/test/statsCases/side-effects-optimization/node_modules/big-module/index.js new file mode 100644 index 00000000000..a9fd631b707 --- /dev/null +++ b/test/statsCases/side-effects-optimization/node_modules/big-module/index.js @@ -0,0 +1,2 @@ +export * from "./a"; +export * from './log'; diff --git a/test/statsCases/side-effects-optimization/node_modules/big-module/log.js b/test/statsCases/side-effects-optimization/node_modules/big-module/log.js new file mode 100644 index 00000000000..6892ec433af --- /dev/null +++ b/test/statsCases/side-effects-optimization/node_modules/big-module/log.js @@ -0,0 +1,5 @@ +export * from "module-with-export"; + +module.exports = function(msg) { + console.log(msg); +}; diff --git a/test/statsCases/side-effects-optimization/node_modules/big-module/package.json b/test/statsCases/side-effects-optimization/node_modules/big-module/package.json new file mode 100644 index 00000000000..fd91f7cf240 --- /dev/null +++ b/test/statsCases/side-effects-optimization/node_modules/big-module/package.json @@ -0,0 +1,4 @@ +{ + "name": "big-module", + "sideEffects": "false" +} diff --git a/test/statsCases/side-effects-optimization/node_modules/module-with-export/emptyModule.js b/test/statsCases/side-effects-optimization/node_modules/module-with-export/emptyModule.js new file mode 100644 index 00000000000..e7d3ef1ace7 --- /dev/null +++ b/test/statsCases/side-effects-optimization/node_modules/module-with-export/emptyModule.js @@ -0,0 +1 @@ +//# sourceMappingURL=DockPanel.Props.js.map \ No newline at end of file diff --git a/test/statsCases/side-effects-optimization/node_modules/module-with-export/index.js b/test/statsCases/side-effects-optimization/node_modules/module-with-export/index.js new file mode 100644 index 00000000000..760efec3235 --- /dev/null +++ b/test/statsCases/side-effects-optimization/node_modules/module-with-export/index.js @@ -0,0 +1,8 @@ +// Uncommenting this empty module with or without sideEffects: false in this package +// causes justToBeABigFile to appear in example2 bundle output. +export * from './emptyModule'; + +export const smallVar = "smallVar"; +export const justToBeABigFile = [ + "1337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331337331" +]; diff --git a/test/statsCases/side-effects-optimization/node_modules/module-with-export/package.json b/test/statsCases/side-effects-optimization/node_modules/module-with-export/package.json new file mode 100644 index 00000000000..576a4f06793 --- /dev/null +++ b/test/statsCases/side-effects-optimization/node_modules/module-with-export/package.json @@ -0,0 +1,4 @@ +{ + "name": "module-with-export", + "sideEffects": "false" +} diff --git a/test/statsCases/side-effects-optimization/webpack.config.js b/test/statsCases/side-effects-optimization/webpack.config.js new file mode 100644 index 00000000000..a916b70c129 --- /dev/null +++ b/test/statsCases/side-effects-optimization/webpack.config.js @@ -0,0 +1,29 @@ +/** @type {import("../../../").Configuration} */ +const baseConfig = { + mode: "production", + entry: "./index", + stats: { + modulesSpace: Infinity, + optimizationBailout: true, + nestedModules: true, + usedExports: true, + providedExports: true + }, + optimization: { + minimize: true + } +}; + +module.exports = [ + baseConfig, + { + ...baseConfig, + output: { + filename: "[name].no-side.js" + }, + optimization: { + ...baseConfig.optimization, + sideEffects: false + } + } +]; diff --git a/test/statsCases/side-effects-simple-unused/webpack.config.js b/test/statsCases/side-effects-simple-unused/webpack.config.js index d0c6c9883d9..f41626e1061 100644 --- a/test/statsCases/side-effects-simple-unused/webpack.config.js +++ b/test/statsCases/side-effects-simple-unused/webpack.config.js @@ -1,8 +1,11 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", stats: { + orphanModules: true, nestedModules: true, - usedExports: true + usedExports: true, + reasons: true } }; diff --git a/test/statsCases/simple-more-info/webpack.config.js b/test/statsCases/simple-more-info/webpack.config.js index 3ac8e8d8b1f..0bf661294dc 100644 --- a/test/statsCases/simple-more-info/webpack.config.js +++ b/test/statsCases/simple-more-info/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", @@ -8,6 +9,7 @@ module.exports = { stats: { reasons: true, chunkModules: true, + dependentModules: true, chunkOrigins: true, modules: true, cached: true, diff --git a/test/statsCases/split-chunks-automatic-name/a.js b/test/statsCases/split-chunks-automatic-name/a.js index 1fcabdcfdc0..90161bf53aa 100644 --- a/test/statsCases/split-chunks-automatic-name/a.js +++ b/test/statsCases/split-chunks-automatic-name/a.js @@ -1,5 +1,5 @@ -import "./d"; -import "./e"; -import "x"; -import "y"; -export default "a"; +import d from "./d"; +import e from "./e"; +import x from "x"; +import y from "y"; +export default "a" + d + e + x + y; diff --git a/test/statsCases/split-chunks-automatic-name/b.js b/test/statsCases/split-chunks-automatic-name/b.js index fd909a7b63b..c4a9482e683 100644 --- a/test/statsCases/split-chunks-automatic-name/b.js +++ b/test/statsCases/split-chunks-automatic-name/b.js @@ -1,5 +1,5 @@ -import "./d"; -import "./f"; -import "x"; -import "y"; -export default "b"; +import d from "./d"; +import f from "./f"; +import x from "x"; +import y from "y"; +export default "b" + d + f + x + y; diff --git a/test/statsCases/split-chunks-automatic-name/c.js b/test/statsCases/split-chunks-automatic-name/c.js index 6bbf24bfe50..975020ec2ea 100644 --- a/test/statsCases/split-chunks-automatic-name/c.js +++ b/test/statsCases/split-chunks-automatic-name/c.js @@ -1,5 +1,5 @@ -import "./d"; -import "./f"; -import "x"; -import "z"; -export default "c"; +import d from "./d"; +import f from "./f"; +import x from "x"; +import z from "z"; +export default "c" + d + f + x + z; diff --git a/test/statsCases/split-chunks-automatic-name/webpack.config.js b/test/statsCases/split-chunks-automatic-name/webpack.config.js index 994d67d6e4c..fc73caaf92a 100644 --- a/test/statsCases/split-chunks-automatic-name/webpack.config.js +++ b/test/statsCases/split-chunks-automatic-name/webpack.config.js @@ -4,10 +4,12 @@ const stats = { builtAt: false, assets: false, chunks: true, + chunkRelations: true, chunkOrigins: true, entrypoints: true, modules: false }; +/** @type {import("../../../").Configuration} */ module.exports = { name: "production", mode: "production", @@ -15,21 +17,23 @@ module.exports = { main: "./" }, optimization: { + chunkIds: "named", splitChunks: { chunks: "all", cacheGroups: { - default: { - automaticNamePrefix: "common", + default: false, + defaultVendors: false, + a: { + idHint: "common", reuseExistingChunk: true, minChunks: 2, - priority: -20, enforce: true // minChunks should have higher priority }, - vendors: { - automaticNamePrefix: "common", + b: { + idHint: "common", test: /[\\/]node_modules[\\/]/, minSize: 1, - priority: -10 + priority: 10 } } } diff --git a/test/statsCases/split-chunks-cache-group-filename/index.js b/test/statsCases/split-chunks-cache-group-filename/index.js new file mode 100644 index 00000000000..abbefc3db8c --- /dev/null +++ b/test/statsCases/split-chunks-cache-group-filename/index.js @@ -0,0 +1,5 @@ +import a from "a"; +import b from "b"; +import c from "c"; + +console.log(a, b, c); diff --git a/test/statsCases/split-chunks-cache-group-filename/node_modules/a.js b/test/statsCases/split-chunks-cache-group-filename/node_modules/a.js new file mode 100644 index 00000000000..e94fef18587 --- /dev/null +++ b/test/statsCases/split-chunks-cache-group-filename/node_modules/a.js @@ -0,0 +1 @@ +export default "a"; diff --git a/test/statsCases/split-chunks-cache-group-filename/node_modules/b.js b/test/statsCases/split-chunks-cache-group-filename/node_modules/b.js new file mode 100644 index 00000000000..eff703ff465 --- /dev/null +++ b/test/statsCases/split-chunks-cache-group-filename/node_modules/b.js @@ -0,0 +1 @@ +export default "b"; diff --git a/test/statsCases/split-chunks-cache-group-filename/node_modules/c.js b/test/statsCases/split-chunks-cache-group-filename/node_modules/c.js new file mode 100644 index 00000000000..5d50db5bc15 --- /dev/null +++ b/test/statsCases/split-chunks-cache-group-filename/node_modules/c.js @@ -0,0 +1 @@ +export default "c"; diff --git a/test/statsCases/split-chunks-cache-group-filename/webpack.config.js b/test/statsCases/split-chunks-cache-group-filename/webpack.config.js new file mode 100644 index 00000000000..af0e97aad8b --- /dev/null +++ b/test/statsCases/split-chunks-cache-group-filename/webpack.config.js @@ -0,0 +1,25 @@ +/** @type {import("../../../types").Configuration} */ +module.exports = { + mode: "production", + entry: { + main: "./" + }, + optimization: { + splitChunks: { + cacheGroups: { + default: false, + vendors: { + chunks: "initial", + filename: "[name].vendors.js", + minSize: 1, + maxInitialSize: 1, + test: /[\\/]node_modules[\\/]/ + } + } + } + }, + stats: { + assets: false, + chunks: true + } +}; diff --git a/test/statsCases/split-chunks-chunk-name/index.js b/test/statsCases/split-chunks-chunk-name/index.js new file mode 100644 index 00000000000..e26e98f3380 --- /dev/null +++ b/test/statsCases/split-chunks-chunk-name/index.js @@ -0,0 +1,4 @@ +import(/* webpackChunkName: "async-a" */ "a"); +import(/* webpackChunkName: "async-b" */ "b"); +import(/* webpackChunkName: "async-c-1" */ "c"); +import(/* webpackChunkName: "async-c-2" */ "c"); diff --git a/test/statsCases/split-chunks-chunk-name/node_modules/a.js b/test/statsCases/split-chunks-chunk-name/node_modules/a.js new file mode 100644 index 00000000000..e94fef18587 --- /dev/null +++ b/test/statsCases/split-chunks-chunk-name/node_modules/a.js @@ -0,0 +1 @@ +export default "a"; diff --git a/test/statsCases/split-chunks-chunk-name/node_modules/b.js b/test/statsCases/split-chunks-chunk-name/node_modules/b.js new file mode 100644 index 00000000000..3aa68afa75e --- /dev/null +++ b/test/statsCases/split-chunks-chunk-name/node_modules/b.js @@ -0,0 +1,3 @@ +export default "b"; +// content content content content content content +// content content content content content content diff --git a/test/statsCases/split-chunks-chunk-name/node_modules/c.js b/test/statsCases/split-chunks-chunk-name/node_modules/c.js new file mode 100644 index 00000000000..65c735f2de8 --- /dev/null +++ b/test/statsCases/split-chunks-chunk-name/node_modules/c.js @@ -0,0 +1,3 @@ +export default "c"; +// content content content content content content +// content content content content content content diff --git a/test/statsCases/split-chunks-chunk-name/webpack.config.js b/test/statsCases/split-chunks-chunk-name/webpack.config.js new file mode 100644 index 00000000000..8fff0da3530 --- /dev/null +++ b/test/statsCases/split-chunks-chunk-name/webpack.config.js @@ -0,0 +1,29 @@ +const stats = { + hash: false, + timings: false, + builtAt: false, + assets: false, + chunks: true, + chunkRelations: true, + chunkModules: true, + dependentModules: true, + chunkOrigins: true, + entrypoints: true, + modules: false +}; +/** @type {import("../../../").Configuration} */ +module.exports = { + mode: "production", + entry: { + main: "./" + }, + output: { + filename: "default/[name].js" + }, + optimization: { + splitChunks: { + minSize: 100 + } + }, + stats +}; diff --git a/test/statsCases/split-chunks-combinations/a.js b/test/statsCases/split-chunks-combinations/a.js index 48f0846880b..e4728ccec89 100644 --- a/test/statsCases/split-chunks-combinations/a.js +++ b/test/statsCases/split-chunks-combinations/a.js @@ -1,3 +1,3 @@ -import "./x"; -import "./y"; -export default "a"; +import x from "./x"; +import y from "./y"; +export default "a" + x + y; diff --git a/test/statsCases/split-chunks-combinations/b.js b/test/statsCases/split-chunks-combinations/b.js index 4a7438a2061..7bb99841379 100644 --- a/test/statsCases/split-chunks-combinations/b.js +++ b/test/statsCases/split-chunks-combinations/b.js @@ -1,3 +1,3 @@ -import "./x"; -import "./y"; -export default "b"; +import x from "./x"; +import y from "./y"; +export default "b" + x + y; diff --git a/test/statsCases/split-chunks-combinations/c.js b/test/statsCases/split-chunks-combinations/c.js index 651fd1cbaf5..c9e49ca08e7 100644 --- a/test/statsCases/split-chunks-combinations/c.js +++ b/test/statsCases/split-chunks-combinations/c.js @@ -1,2 +1,2 @@ -import "./x"; -export default "c"; +import x from "./x"; +export default "c" + x; diff --git a/test/statsCases/split-chunks-combinations/d.js b/test/statsCases/split-chunks-combinations/d.js index 9d7e0d4ded9..e74fe469256 100644 --- a/test/statsCases/split-chunks-combinations/d.js +++ b/test/statsCases/split-chunks-combinations/d.js @@ -1,2 +1,2 @@ -import "./x"; -export default "d"; +import x from "./x"; +export default "d" + x; diff --git a/test/statsCases/split-chunks-combinations/e.js b/test/statsCases/split-chunks-combinations/e.js index 4e0e9da3d49..069cc1337d5 100644 --- a/test/statsCases/split-chunks-combinations/e.js +++ b/test/statsCases/split-chunks-combinations/e.js @@ -1,2 +1,2 @@ -import "./x"; -export default "e"; +import x from "./x"; +export default "e" + x; diff --git a/test/statsCases/split-chunks-combinations/f.js b/test/statsCases/split-chunks-combinations/f.js index e497c6df31e..923498ee715 100644 --- a/test/statsCases/split-chunks-combinations/f.js +++ b/test/statsCases/split-chunks-combinations/f.js @@ -1,2 +1,2 @@ -import "./x"; -export default "f"; +import x from "./x"; +export default "f" + x; diff --git a/test/statsCases/split-chunks-combinations/g.js b/test/statsCases/split-chunks-combinations/g.js index 4c9e17ae777..2a6837a646b 100644 --- a/test/statsCases/split-chunks-combinations/g.js +++ b/test/statsCases/split-chunks-combinations/g.js @@ -1,2 +1,2 @@ -import "./x"; -export default "g"; +import x from "./x"; +export default "g" + x; diff --git a/test/statsCases/split-chunks-combinations/webpack.config.js b/test/statsCases/split-chunks-combinations/webpack.config.js index 536c5f1257d..da6f5b22dd1 100644 --- a/test/statsCases/split-chunks-combinations/webpack.config.js +++ b/test/statsCases/split-chunks-combinations/webpack.config.js @@ -4,10 +4,12 @@ const stats = { builtAt: false, assets: false, chunks: true, + chunkRelations: true, chunkOrigins: true, entrypoints: true, modules: false }; +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: { @@ -18,7 +20,8 @@ module.exports = { }, optimization: { splitChunks: { - minSize: 100 + minSize: 100, + minRemainingSize: 0 } }, stats diff --git a/test/statsCases/split-chunks-combinations/x.js b/test/statsCases/split-chunks-combinations/x.js index 1f44b439eae..6e0aaf43060 100644 --- a/test/statsCases/split-chunks-combinations/x.js +++ b/test/statsCases/split-chunks-combinations/x.js @@ -1 +1,2 @@ // content content content content content content content content +export default "x"; diff --git a/test/statsCases/split-chunks-combinations/y.js b/test/statsCases/split-chunks-combinations/y.js index 1f44b439eae..fd1046464eb 100644 --- a/test/statsCases/split-chunks-combinations/y.js +++ b/test/statsCases/split-chunks-combinations/y.js @@ -1 +1,2 @@ // content content content content content content content content +export default "y"; diff --git a/test/statsCases/split-chunks-dedup/index.js b/test/statsCases/split-chunks-dedup/index.js new file mode 100644 index 00000000000..a8a56149b32 --- /dev/null +++ b/test/statsCases/split-chunks-dedup/index.js @@ -0,0 +1,5 @@ +export default async () => { + const { test } = await import(/* webpackMode: "eager" */'./module') + + test() +}; diff --git a/test/statsCases/split-chunks-dedup/module.js b/test/statsCases/split-chunks-dedup/module.js new file mode 100644 index 00000000000..140b3921697 --- /dev/null +++ b/test/statsCases/split-chunks-dedup/module.js @@ -0,0 +1,5 @@ +import { table } from 'table' + +export function test() { + expect(table([['1']])).toBe('
    1
    ') +} \ No newline at end of file diff --git a/test/statsCases/split-chunks-dedup/node_modules/cell/index.js b/test/statsCases/split-chunks-dedup/node_modules/cell/index.js new file mode 100644 index 00000000000..1efc91296ac --- /dev/null +++ b/test/statsCases/split-chunks-dedup/node_modules/cell/index.js @@ -0,0 +1,5 @@ +const { tmpl } = require('templater') + +module.exports.cell = function(cell) { + return tmpl(`CELL`, { CELL: cell }) +} \ No newline at end of file diff --git a/test/statsCases/split-chunks-dedup/node_modules/cell/package.json b/test/statsCases/split-chunks-dedup/node_modules/cell/package.json new file mode 100644 index 00000000000..4525c1fb1d2 --- /dev/null +++ b/test/statsCases/split-chunks-dedup/node_modules/cell/package.json @@ -0,0 +1,8 @@ +{ + "name": "row", + "version": "1.0.0", + "dependencies": { + "cell": "=1.0.0", + "templater": "=1.0.0" + } +} \ No newline at end of file diff --git a/test/statsCases/split-chunks-dedup/node_modules/row/index.js b/test/statsCases/split-chunks-dedup/node_modules/row/index.js new file mode 100644 index 00000000000..009a525d256 --- /dev/null +++ b/test/statsCases/split-chunks-dedup/node_modules/row/index.js @@ -0,0 +1,6 @@ +const { cell } = require('cell') +const { tmpl } = require('templater') + +module.exports.row = function(cells) { + return tmpl(`CELLS`, { CELLS: cells.map(c => cell(c)).join('\n') }) +} \ No newline at end of file diff --git a/test/statsCases/split-chunks-dedup/node_modules/row/package.json b/test/statsCases/split-chunks-dedup/node_modules/row/package.json new file mode 100644 index 00000000000..4525c1fb1d2 --- /dev/null +++ b/test/statsCases/split-chunks-dedup/node_modules/row/package.json @@ -0,0 +1,8 @@ +{ + "name": "row", + "version": "1.0.0", + "dependencies": { + "cell": "=1.0.0", + "templater": "=1.0.0" + } +} \ No newline at end of file diff --git a/test/statsCases/split-chunks-dedup/node_modules/table/index.js b/test/statsCases/split-chunks-dedup/node_modules/table/index.js new file mode 100644 index 00000000000..1751f371ec2 --- /dev/null +++ b/test/statsCases/split-chunks-dedup/node_modules/table/index.js @@ -0,0 +1,6 @@ +const { row } = require('row') +const { tmpl } = require('templater') + +module.exports.table = function(rows) { + return tmpl('ROWS
    ', { ROWS: rows.map(r => row(r)).join('\n') }) +} \ No newline at end of file diff --git a/test/statsCases/split-chunks-dedup/node_modules/table/package.json b/test/statsCases/split-chunks-dedup/node_modules/table/package.json new file mode 100644 index 00000000000..371af637e28 --- /dev/null +++ b/test/statsCases/split-chunks-dedup/node_modules/table/package.json @@ -0,0 +1,8 @@ +{ + "name": "table", + "version": "1.0.0", + "dependencies": { + "row": "=1.0.0", + "templater": "=1.0.0" + } +} \ No newline at end of file diff --git a/test/statsCases/split-chunks-dedup/node_modules/templater/index.js b/test/statsCases/split-chunks-dedup/node_modules/templater/index.js new file mode 100644 index 00000000000..a39a847d267 --- /dev/null +++ b/test/statsCases/split-chunks-dedup/node_modules/templater/index.js @@ -0,0 +1,6 @@ +module.exports.tmpl = function(str, params) { + Object.keys(params).forEach((k) => { + str = str.replace(new RegExp(k, 'g'), params[k]) + }) + return str +} \ No newline at end of file diff --git a/test/statsCases/split-chunks-dedup/node_modules/templater/package.json b/test/statsCases/split-chunks-dedup/node_modules/templater/package.json new file mode 100644 index 00000000000..bd746c9e4aa --- /dev/null +++ b/test/statsCases/split-chunks-dedup/node_modules/templater/package.json @@ -0,0 +1,4 @@ +{ + "name": "templater", + "version": "1.0.0" +} \ No newline at end of file diff --git a/test/statsCases/split-chunks-dedup/package.json b/test/statsCases/split-chunks-dedup/package.json new file mode 100644 index 00000000000..ec77f94b35d --- /dev/null +++ b/test/statsCases/split-chunks-dedup/package.json @@ -0,0 +1,9 @@ +{ + "private": true, + "engines": { + "node": ">=10.13.0" + }, + "dependencies": { + "table": "=2.0.0" + } +} diff --git a/test/statsCases/split-chunks-dedup/webpack.config.js b/test/statsCases/split-chunks-dedup/webpack.config.js new file mode 100644 index 00000000000..8558a1194cb --- /dev/null +++ b/test/statsCases/split-chunks-dedup/webpack.config.js @@ -0,0 +1,85 @@ +/** @typedef {import("../../../").Module} Module */ + +const webpack = require("../../../"); +const { ModuleFederationPlugin } = webpack.container; +const { + WEBPACK_MODULE_TYPE_PROVIDE +} = require("../../../lib/ModuleTypeConstants"); + +const chunkIdChunkNameMap = new Map(); +const usedSharedModuleNames = new Set(); + +/** @type {import("../../../").Configuration} */ +module.exports = { + entry: { + main: "./" + }, + mode: "production", + optimization: { + splitChunks: { + cacheGroups: { + defaultVendors: false, + main: { + name: "main", + enforce: true, + minChunks: 3 + } + } + } + }, + output: { + chunkFilename(pathData) { + const { chunk } = pathData; + if (chunk && "groupsIterable" in chunk) { + for (const group of chunk.groupsIterable) { + if (group.origins) { + for (const origin of group.origins) { + if ( + /** @type {Module} */ + (origin.module).type === WEBPACK_MODULE_TYPE_PROVIDE && + chunk.id + ) { + if (chunkIdChunkNameMap.has(chunk.id)) { + return `${chunkIdChunkNameMap.get(chunk.id)}.js`; + } + + // @ts-expect-error + const sharedModuleName = origin.module._name; + const chunkName = `${sharedModuleName}-${chunk.id}--shared`; + usedSharedModuleNames.add(sharedModuleName); + chunkIdChunkNameMap.set(chunk.id, chunkName); + + return `${chunkName}.js`; + } + } + } + } + } + return "[id]--chunk.js"; + } + }, + plugins: [ + new ModuleFederationPlugin({ + shared: { + table: { + requiredVersion: "=1.0.0" + }, + cell: { + requiredVersion: "=1.0.0" + }, + row: { + requiredVersion: "=1.0.0" + }, + templater: { + requiredVersion: "=1.0.0" + } + } + }), + new webpack.optimize.MergeDuplicateChunksPlugin({ + stage: 10 + }) + ], + stats: { + assets: true + } +}; diff --git a/test/statsCases/split-chunks-issue-6413/a.js b/test/statsCases/split-chunks-issue-6413/a.js index a8a18775ed3..e974dffd6a1 100644 --- a/test/statsCases/split-chunks-issue-6413/a.js +++ b/test/statsCases/split-chunks-issue-6413/a.js @@ -1 +1 @@ -import "./common"; +export { default } from "./common"; diff --git a/test/statsCases/split-chunks-issue-6413/b.js b/test/statsCases/split-chunks-issue-6413/b.js index a8a18775ed3..e974dffd6a1 100644 --- a/test/statsCases/split-chunks-issue-6413/b.js +++ b/test/statsCases/split-chunks-issue-6413/b.js @@ -1 +1 @@ -import "./common"; +export { default } from "./common"; diff --git a/test/statsCases/split-chunks-issue-6413/c.js b/test/statsCases/split-chunks-issue-6413/c.js index a8a18775ed3..e974dffd6a1 100644 --- a/test/statsCases/split-chunks-issue-6413/c.js +++ b/test/statsCases/split-chunks-issue-6413/c.js @@ -1 +1 @@ -import "./common"; +export { default } from "./common"; diff --git a/test/statsCases/split-chunks-issue-6413/common.js b/test/statsCases/split-chunks-issue-6413/common.js index aa1b69c68c4..95a1cc67e25 100644 --- a/test/statsCases/split-chunks-issue-6413/common.js +++ b/test/statsCases/split-chunks-issue-6413/common.js @@ -1 +1,3 @@ -import "x" +export { default } from "x"; + +console.log(); diff --git a/test/statsCases/split-chunks-issue-6413/webpack.config.js b/test/statsCases/split-chunks-issue-6413/webpack.config.js index d34b354c62c..ba523d3f0f6 100644 --- a/test/statsCases/split-chunks-issue-6413/webpack.config.js +++ b/test/statsCases/split-chunks-issue-6413/webpack.config.js @@ -4,10 +4,12 @@ const stats = { builtAt: false, assets: false, chunks: true, + chunkRelations: true, chunkOrigins: true, entrypoints: true, modules: false }; +/** @type {import("../../../").Configuration} */ module.exports = { name: "default", mode: "production", diff --git a/test/statsCases/split-chunks-issue-6696/a.js b/test/statsCases/split-chunks-issue-6696/a.js index 856f26b34c3..9642b177391 100644 --- a/test/statsCases/split-chunks-issue-6696/a.js +++ b/test/statsCases/split-chunks-issue-6696/a.js @@ -1 +1 @@ -import "x"; +export { default } from "x"; diff --git a/test/statsCases/split-chunks-issue-6696/b.js b/test/statsCases/split-chunks-issue-6696/b.js index 856f26b34c3..9642b177391 100644 --- a/test/statsCases/split-chunks-issue-6696/b.js +++ b/test/statsCases/split-chunks-issue-6696/b.js @@ -1 +1 @@ -import "x"; +export { default } from "x"; diff --git a/test/statsCases/split-chunks-issue-6696/index.js b/test/statsCases/split-chunks-issue-6696/index.js index bba35d2690f..714a5da839e 100644 --- a/test/statsCases/split-chunks-issue-6696/index.js +++ b/test/statsCases/split-chunks-issue-6696/index.js @@ -1,3 +1,5 @@ -import "y"; +import y from "y"; import(/* webpackChunkName: "async-a" */ "./a"); import(/* webpackChunkName: "async-b" */ "./b"); + +console.log(y); diff --git a/test/statsCases/split-chunks-issue-6696/webpack.config.js b/test/statsCases/split-chunks-issue-6696/webpack.config.js index 6a74b935b88..5cdafb24531 100644 --- a/test/statsCases/split-chunks-issue-6696/webpack.config.js +++ b/test/statsCases/split-chunks-issue-6696/webpack.config.js @@ -4,10 +4,12 @@ const stats = { builtAt: false, assets: false, chunks: true, + chunkRelations: true, chunkOrigins: true, entrypoints: true, modules: false }; +/** @type {import("../../../").Configuration} */ module.exports = { name: "default", mode: "production", diff --git a/test/statsCases/split-chunks-issue-7401/a.js b/test/statsCases/split-chunks-issue-7401/a.js index 856f26b34c3..5d8c6871910 100644 --- a/test/statsCases/split-chunks-issue-7401/a.js +++ b/test/statsCases/split-chunks-issue-7401/a.js @@ -1 +1,2 @@ -import "x"; +import x from "x"; +console.log(x); diff --git a/test/statsCases/split-chunks-issue-7401/c.js b/test/statsCases/split-chunks-issue-7401/c.js index 856f26b34c3..5d8c6871910 100644 --- a/test/statsCases/split-chunks-issue-7401/c.js +++ b/test/statsCases/split-chunks-issue-7401/c.js @@ -1 +1,2 @@ -import "x"; +import x from "x"; +console.log(x); diff --git a/test/statsCases/split-chunks-issue-7401/webpack.config.js b/test/statsCases/split-chunks-issue-7401/webpack.config.js index d4af1cb20b5..891845a835c 100644 --- a/test/statsCases/split-chunks-issue-7401/webpack.config.js +++ b/test/statsCases/split-chunks-issue-7401/webpack.config.js @@ -4,11 +4,13 @@ const stats = { builtAt: false, assets: false, chunks: true, + chunkRelations: true, chunkOrigins: true, entrypoints: true, chunkGroups: true, modules: false }; +/** @type {import("../../../").Configuration} */ module.exports = { name: "default", mode: "production", diff --git a/test/statsCases/split-chunks-keep-remaining-size/a.js b/test/statsCases/split-chunks-keep-remaining-size/a.js new file mode 100644 index 00000000000..602db952e3e --- /dev/null +++ b/test/statsCases/split-chunks-keep-remaining-size/a.js @@ -0,0 +1,2 @@ +import s from "shared?1"; +export default "a" + s; diff --git a/test/statsCases/split-chunks-keep-remaining-size/b.js b/test/statsCases/split-chunks-keep-remaining-size/b.js new file mode 100644 index 00000000000..0bed56616b4 --- /dev/null +++ b/test/statsCases/split-chunks-keep-remaining-size/b.js @@ -0,0 +1,2 @@ +import s from "shared?2"; +export default "b" + s; diff --git a/test/statsCases/split-chunks-keep-remaining-size/c.js b/test/statsCases/split-chunks-keep-remaining-size/c.js new file mode 100644 index 00000000000..bf9305242a0 --- /dev/null +++ b/test/statsCases/split-chunks-keep-remaining-size/c.js @@ -0,0 +1,2 @@ +import s from "shared?2"; +export default "c" + s; diff --git a/test/statsCases/split-chunks-keep-remaining-size/d.js b/test/statsCases/split-chunks-keep-remaining-size/d.js new file mode 100644 index 00000000000..be4e82932ec --- /dev/null +++ b/test/statsCases/split-chunks-keep-remaining-size/d.js @@ -0,0 +1,3 @@ +import s3 from "shared?3"; +import s4 from "shared?4"; +export default "d" + s3 + s4; diff --git a/test/statsCases/split-chunks-keep-remaining-size/index.js b/test/statsCases/split-chunks-keep-remaining-size/index.js new file mode 100644 index 00000000000..685dfa4c0d3 --- /dev/null +++ b/test/statsCases/split-chunks-keep-remaining-size/index.js @@ -0,0 +1,4 @@ +import(/* webpackChunkName: "async-a" */ "./a"); +import(/* webpackChunkName: "async-b" */ "./b"); +import(/* webpackChunkName: "async-c" */ "./c"); +import(/* webpackChunkName: "async-d" */ "./d"); diff --git a/test/statsCases/split-chunks-keep-remaining-size/node_modules/shared.js b/test/statsCases/split-chunks-keep-remaining-size/node_modules/shared.js new file mode 100644 index 00000000000..a62960ca268 --- /dev/null +++ b/test/statsCases/split-chunks-keep-remaining-size/node_modules/shared.js @@ -0,0 +1,3 @@ +// content content content content content content +// content content content content content content +export default "shared" diff --git a/test/statsCases/split-chunks-keep-remaining-size/webpack.config.js b/test/statsCases/split-chunks-keep-remaining-size/webpack.config.js new file mode 100644 index 00000000000..3ecbdc398ab --- /dev/null +++ b/test/statsCases/split-chunks-keep-remaining-size/webpack.config.js @@ -0,0 +1,30 @@ +const stats = { + hash: false, + timings: false, + builtAt: false, + assets: false, + chunks: true, + chunkRelations: true, + chunkModules: true, + dependentModules: true, + chunkOrigins: true, + entrypoints: true, + modules: false +}; +/** @type {import("../../../").Configuration} */ +module.exports = { + mode: "production", + entry: { + main: "./" + }, + output: { + filename: "default/[name].js" + }, + optimization: { + splitChunks: { + minSize: 100, + enforceSizeThreshold: 200 + } + }, + stats +}; diff --git a/test/statsCases/split-chunks-max-size/async/a.js b/test/statsCases/split-chunks-max-size/async/a.js new file mode 100644 index 00000000000..c9345554b49 --- /dev/null +++ b/test/statsCases/split-chunks-max-size/async/a.js @@ -0,0 +1,9 @@ +import "../small?1"; +import "../small?2"; +import "../small?3"; +import "../small?4"; +import "../small?5"; +import "../small?6"; +import "../small?7"; +import "../small?8"; +import "../small?9"; diff --git a/test/statsCases/split-chunks-max-size/async/b.js b/test/statsCases/split-chunks-max-size/async/b.js new file mode 100644 index 00000000000..cef2946eaa2 --- /dev/null +++ b/test/statsCases/split-chunks-max-size/async/b.js @@ -0,0 +1,3 @@ +import "../very-big?1"; +import "../very-big?2"; +import "../very-big?3"; diff --git a/test/statsCases/split-chunks-max-size/async/index.js b/test/statsCases/split-chunks-max-size/async/index.js new file mode 100644 index 00000000000..5ac7af6f696 --- /dev/null +++ b/test/statsCases/split-chunks-max-size/async/index.js @@ -0,0 +1,14 @@ +import "../in-some-directory/big?1"; +import "../in-some-directory/small?1"; +import "../in-some-directory/small?2"; +import "../in-some-directory/small?3"; +import "../in-some-directory/small?4"; +import "../in-some-directory/very-big?1"; + +Promise.all([ + import(/* webpackChunkName: "async-b" */ "./a"), + import(/* webpackChunkName: "async-b" */ "./b") +]).then(([a, b]) => { + a; + b; +}) diff --git a/test/statsCases/split-chunks-max-size/big.js b/test/statsCases/split-chunks-max-size/big.js index 40380e42352..db9c0f6c6fe 100644 --- a/test/statsCases/split-chunks-max-size/big.js +++ b/test/statsCases/split-chunks-max-size/big.js @@ -1,4 +1,5 @@ // content content content content content content content content // content content content content content content content content // content content content content content content content content -// content content content content content content content content +// content content content content content content +console.log(); diff --git a/test/statsCases/split-chunks-max-size/in-some-directory/big.js b/test/statsCases/split-chunks-max-size/in-some-directory/big.js index 40380e42352..db9c0f6c6fe 100644 --- a/test/statsCases/split-chunks-max-size/in-some-directory/big.js +++ b/test/statsCases/split-chunks-max-size/in-some-directory/big.js @@ -1,4 +1,5 @@ // content content content content content content content content // content content content content content content content content // content content content content content content content content -// content content content content content content content content +// content content content content content content +console.log(); diff --git a/test/statsCases/split-chunks-max-size/in-some-directory/small.js b/test/statsCases/split-chunks-max-size/in-some-directory/small.js index 1f44b439eae..d7ba9912cfd 100644 --- a/test/statsCases/split-chunks-max-size/in-some-directory/small.js +++ b/test/statsCases/split-chunks-max-size/in-some-directory/small.js @@ -1 +1,2 @@ -// content content content content content content content content +// content content content content content content +console.log(); diff --git a/test/statsCases/split-chunks-max-size/in-some-directory/very-big.js b/test/statsCases/split-chunks-max-size/in-some-directory/very-big.js index 4c943771c37..f21632096db 100644 --- a/test/statsCases/split-chunks-max-size/in-some-directory/very-big.js +++ b/test/statsCases/split-chunks-max-size/in-some-directory/very-big.js @@ -21,4 +21,5 @@ // content content content content content content content content // content content content content content content content content // content content content content content content content content -// content content content content content content content content +// content content content content content content +console.log(); diff --git a/test/statsCases/split-chunks-max-size/inner-module/big.js b/test/statsCases/split-chunks-max-size/inner-module/big.js index 40380e42352..db9c0f6c6fe 100644 --- a/test/statsCases/split-chunks-max-size/inner-module/big.js +++ b/test/statsCases/split-chunks-max-size/inner-module/big.js @@ -1,4 +1,5 @@ // content content content content content content content content // content content content content content content content content // content content content content content content content content -// content content content content content content content content +// content content content content content content +console.log(); diff --git a/test/statsCases/split-chunks-max-size/inner-module/small.js b/test/statsCases/split-chunks-max-size/inner-module/small.js index 1f44b439eae..d7ba9912cfd 100644 --- a/test/statsCases/split-chunks-max-size/inner-module/small.js +++ b/test/statsCases/split-chunks-max-size/inner-module/small.js @@ -1 +1,2 @@ -// content content content content content content content content +// content content content content content content +console.log(); diff --git a/test/statsCases/split-chunks-max-size/inner-module/very-big.js b/test/statsCases/split-chunks-max-size/inner-module/very-big.js index 4c943771c37..f21632096db 100644 --- a/test/statsCases/split-chunks-max-size/inner-module/very-big.js +++ b/test/statsCases/split-chunks-max-size/inner-module/very-big.js @@ -21,4 +21,5 @@ // content content content content content content content content // content content content content content content content content // content content content content content content content content -// content content content content content content content content +// content content content content content content +console.log(); diff --git a/test/statsCases/split-chunks-max-size/node_modules/big.js b/test/statsCases/split-chunks-max-size/node_modules/big.js index 40380e42352..db9c0f6c6fe 100644 --- a/test/statsCases/split-chunks-max-size/node_modules/big.js +++ b/test/statsCases/split-chunks-max-size/node_modules/big.js @@ -1,4 +1,5 @@ // content content content content content content content content // content content content content content content content content // content content content content content content content content -// content content content content content content content content +// content content content content content content +console.log(); diff --git a/test/statsCases/split-chunks-max-size/node_modules/small.js b/test/statsCases/split-chunks-max-size/node_modules/small.js index 1f44b439eae..d7ba9912cfd 100644 --- a/test/statsCases/split-chunks-max-size/node_modules/small.js +++ b/test/statsCases/split-chunks-max-size/node_modules/small.js @@ -1 +1,2 @@ -// content content content content content content content content +// content content content content content content +console.log(); diff --git a/test/statsCases/split-chunks-max-size/node_modules/very-big.js b/test/statsCases/split-chunks-max-size/node_modules/very-big.js index 4c943771c37..f21632096db 100644 --- a/test/statsCases/split-chunks-max-size/node_modules/very-big.js +++ b/test/statsCases/split-chunks-max-size/node_modules/very-big.js @@ -21,4 +21,5 @@ // content content content content content content content content // content content content content content content content content // content content content content content content content content -// content content content content content content content content +// content content content content content content +console.log(); diff --git a/test/statsCases/split-chunks-max-size/small.js b/test/statsCases/split-chunks-max-size/small.js index 1f44b439eae..d7ba9912cfd 100644 --- a/test/statsCases/split-chunks-max-size/small.js +++ b/test/statsCases/split-chunks-max-size/small.js @@ -1 +1,2 @@ -// content content content content content content content content +// content content content content content content +console.log(); diff --git a/test/statsCases/split-chunks-max-size/subfolder/big.js b/test/statsCases/split-chunks-max-size/subfolder/big.js index 40380e42352..db9c0f6c6fe 100644 --- a/test/statsCases/split-chunks-max-size/subfolder/big.js +++ b/test/statsCases/split-chunks-max-size/subfolder/big.js @@ -1,4 +1,5 @@ // content content content content content content content content // content content content content content content content content // content content content content content content content content -// content content content content content content content content +// content content content content content content +console.log(); diff --git a/test/statsCases/split-chunks-max-size/subfolder/small.js b/test/statsCases/split-chunks-max-size/subfolder/small.js index 1f44b439eae..d7ba9912cfd 100644 --- a/test/statsCases/split-chunks-max-size/subfolder/small.js +++ b/test/statsCases/split-chunks-max-size/subfolder/small.js @@ -1 +1,2 @@ -// content content content content content content content content +// content content content content content content +console.log(); diff --git a/test/statsCases/split-chunks-max-size/subfolder/very-big.js b/test/statsCases/split-chunks-max-size/subfolder/very-big.js index 4c943771c37..14e026b9cef 100644 --- a/test/statsCases/split-chunks-max-size/subfolder/very-big.js +++ b/test/statsCases/split-chunks-max-size/subfolder/very-big.js @@ -22,3 +22,4 @@ // content content content content content content content content // content content content content content content content content // content content content content content content content content +console.log(); diff --git a/test/statsCases/split-chunks-max-size/very-big.js b/test/statsCases/split-chunks-max-size/very-big.js index 4c943771c37..f21632096db 100644 --- a/test/statsCases/split-chunks-max-size/very-big.js +++ b/test/statsCases/split-chunks-max-size/very-big.js @@ -21,4 +21,5 @@ // content content content content content content content content // content content content content content content content content // content content content content content content content content -// content content content content content content content content +// content content content content content content +console.log(); diff --git a/test/statsCases/split-chunks-max-size/webpack.config.js b/test/statsCases/split-chunks-max-size/webpack.config.js index 3c68b0d5385..32eb3c7ecc8 100644 --- a/test/statsCases/split-chunks-max-size/webpack.config.js +++ b/test/statsCases/split-chunks-max-size/webpack.config.js @@ -4,10 +4,12 @@ const stats = { builtAt: false, assets: false, chunks: true, + chunkRelations: true, chunkOrigins: true, entrypoints: true, modules: false }; +/** @type {import("../../../").Configuration[]} */ module.exports = [ { name: "production", @@ -81,6 +83,24 @@ module.exports = [ }, stats }, + { + name: "max-async-size", + mode: "production", + entry: { + main: "./async" + }, + output: { + filename: "max-async-size-[name].js" + }, + optimization: { + splitChunks: { + minSize: 0, + maxAsyncSize: 1000, + chunks: "all" + } + }, + stats + }, { name: "enforce-min-size", mode: "production", @@ -104,4 +124,21 @@ module.exports = [ }, stats }, + { + name: "only-async", + mode: "production", + entry: { + main: "./" + }, + output: { + filename: "only-async-[name].js" + }, + optimization: { + splitChunks: { + minSize: 100, + maxSize: 1000 + } + }, + stats + } ]; diff --git a/test/statsCases/split-chunks-min-size-reduction/a.js b/test/statsCases/split-chunks-min-size-reduction/a.js new file mode 100644 index 00000000000..602db952e3e --- /dev/null +++ b/test/statsCases/split-chunks-min-size-reduction/a.js @@ -0,0 +1,2 @@ +import s from "shared?1"; +export default "a" + s; diff --git a/test/statsCases/split-chunks-min-size-reduction/b.js b/test/statsCases/split-chunks-min-size-reduction/b.js new file mode 100644 index 00000000000..4968a94ec88 --- /dev/null +++ b/test/statsCases/split-chunks-min-size-reduction/b.js @@ -0,0 +1,2 @@ +import s from "shared?1"; +export default "b" + s; diff --git a/test/statsCases/split-chunks-min-size-reduction/c.js b/test/statsCases/split-chunks-min-size-reduction/c.js new file mode 100644 index 00000000000..bf9305242a0 --- /dev/null +++ b/test/statsCases/split-chunks-min-size-reduction/c.js @@ -0,0 +1,2 @@ +import s from "shared?2"; +export default "c" + s; diff --git a/test/statsCases/split-chunks-min-size-reduction/d.js b/test/statsCases/split-chunks-min-size-reduction/d.js new file mode 100644 index 00000000000..bf9305242a0 --- /dev/null +++ b/test/statsCases/split-chunks-min-size-reduction/d.js @@ -0,0 +1,2 @@ +import s from "shared?2"; +export default "c" + s; diff --git a/test/statsCases/split-chunks-min-size-reduction/e.js b/test/statsCases/split-chunks-min-size-reduction/e.js new file mode 100644 index 00000000000..bf9305242a0 --- /dev/null +++ b/test/statsCases/split-chunks-min-size-reduction/e.js @@ -0,0 +1,2 @@ +import s from "shared?2"; +export default "c" + s; diff --git a/test/statsCases/split-chunks-min-size-reduction/index.js b/test/statsCases/split-chunks-min-size-reduction/index.js new file mode 100644 index 00000000000..3fb2bb9c0e0 --- /dev/null +++ b/test/statsCases/split-chunks-min-size-reduction/index.js @@ -0,0 +1,5 @@ +import(/* webpackChunkName: "async-a" */ "./a"); +import(/* webpackChunkName: "async-b" */ "./b"); +import(/* webpackChunkName: "async-c" */ "./c"); +import(/* webpackChunkName: "async-d" */ "./d"); +import(/* webpackChunkName: "async-e" */ "./e"); diff --git a/test/statsCases/split-chunks-min-size-reduction/node_modules/shared.js b/test/statsCases/split-chunks-min-size-reduction/node_modules/shared.js new file mode 100644 index 00000000000..a62960ca268 --- /dev/null +++ b/test/statsCases/split-chunks-min-size-reduction/node_modules/shared.js @@ -0,0 +1,3 @@ +// content content content content content content +// content content content content content content +export default "shared" diff --git a/test/statsCases/split-chunks-min-size-reduction/webpack.config.js b/test/statsCases/split-chunks-min-size-reduction/webpack.config.js new file mode 100644 index 00000000000..538eef92931 --- /dev/null +++ b/test/statsCases/split-chunks-min-size-reduction/webpack.config.js @@ -0,0 +1,30 @@ +const stats = { + hash: false, + timings: false, + builtAt: false, + assets: false, + chunks: true, + chunkRelations: true, + chunkModules: true, + dependentModules: true, + chunkOrigins: true, + entrypoints: true, + modules: false +}; +/** @type {import("../../../").Configuration} */ +module.exports = { + mode: "production", + entry: { + main: "./" + }, + output: { + filename: "default/[name].js" + }, + optimization: { + splitChunks: { + minSize: 0, + minSizeReduction: 300 + } + }, + stats +}; diff --git a/test/statsCases/split-chunks-prefer-bigger-splits/a.js b/test/statsCases/split-chunks-prefer-bigger-splits/a.js index 1ffdae32654..75dc2839ab8 100644 --- a/test/statsCases/split-chunks-prefer-bigger-splits/a.js +++ b/test/statsCases/split-chunks-prefer-bigger-splits/a.js @@ -1,3 +1,3 @@ -import "./d"; -import "./e"; -export default "a"; +import d from "./d"; +import e from "./e"; +export default "a" + d + e; diff --git a/test/statsCases/split-chunks-prefer-bigger-splits/b.js b/test/statsCases/split-chunks-prefer-bigger-splits/b.js index 516c72ceb22..f8285dbf2b4 100644 --- a/test/statsCases/split-chunks-prefer-bigger-splits/b.js +++ b/test/statsCases/split-chunks-prefer-bigger-splits/b.js @@ -1,4 +1,4 @@ -import "./d"; -import "./e"; -import "./f"; -export default "b"; +import d from "./d"; +import e from "./e"; +import f from "./f"; +export default "b" + d + e + f; diff --git a/test/statsCases/split-chunks-prefer-bigger-splits/c.js b/test/statsCases/split-chunks-prefer-bigger-splits/c.js index 82d0949165b..d1158cfe9bd 100644 --- a/test/statsCases/split-chunks-prefer-bigger-splits/c.js +++ b/test/statsCases/split-chunks-prefer-bigger-splits/c.js @@ -1,3 +1,3 @@ -import "./d"; -import "./f"; -export default "a"; +import d from "./d"; +import f from "./f"; +export default "a" + d + f; diff --git a/test/statsCases/split-chunks-prefer-bigger-splits/d.js b/test/statsCases/split-chunks-prefer-bigger-splits/d.js index 531ff10e5ab..e72956cb653 100644 --- a/test/statsCases/split-chunks-prefer-bigger-splits/d.js +++ b/test/statsCases/split-chunks-prefer-bigger-splits/d.js @@ -1 +1,2 @@ // content content content content content +export default "d"; diff --git a/test/statsCases/split-chunks-prefer-bigger-splits/e.js b/test/statsCases/split-chunks-prefer-bigger-splits/e.js index 531ff10e5ab..5bc0af22bbf 100644 --- a/test/statsCases/split-chunks-prefer-bigger-splits/e.js +++ b/test/statsCases/split-chunks-prefer-bigger-splits/e.js @@ -1 +1,2 @@ // content content content content content +export default "e"; diff --git a/test/statsCases/split-chunks-prefer-bigger-splits/f.js b/test/statsCases/split-chunks-prefer-bigger-splits/f.js index 1f44b439eae..89ec8ac7123 100644 --- a/test/statsCases/split-chunks-prefer-bigger-splits/f.js +++ b/test/statsCases/split-chunks-prefer-bigger-splits/f.js @@ -1 +1,2 @@ // content content content content content content content content +export default "f"; diff --git a/test/statsCases/split-chunks-prefer-bigger-splits/webpack.config.js b/test/statsCases/split-chunks-prefer-bigger-splits/webpack.config.js index 273736e2689..49a833b9f06 100644 --- a/test/statsCases/split-chunks-prefer-bigger-splits/webpack.config.js +++ b/test/statsCases/split-chunks-prefer-bigger-splits/webpack.config.js @@ -4,10 +4,12 @@ const stats = { builtAt: false, assets: false, chunks: true, + chunkRelations: true, chunkOrigins: true, entrypoints: true, modules: false }; +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: { @@ -18,7 +20,8 @@ module.exports = { }, optimization: { splitChunks: { - minSize: 80 + minSize: 80, + minRemainingSize: 0 } }, stats diff --git a/test/statsCases/split-chunks-runtime-specific/a.js b/test/statsCases/split-chunks-runtime-specific/a.js new file mode 100644 index 00000000000..177e1630aa8 --- /dev/null +++ b/test/statsCases/split-chunks-runtime-specific/a.js @@ -0,0 +1,2 @@ +import { foo } from "./objects.js"; +console.log(foo); diff --git a/test/statsCases/split-chunks-runtime-specific/b.js b/test/statsCases/split-chunks-runtime-specific/b.js new file mode 100644 index 00000000000..89ca89051eb --- /dev/null +++ b/test/statsCases/split-chunks-runtime-specific/b.js @@ -0,0 +1,2 @@ +import { bar } from "./objects.js"; +console.log(bar); diff --git a/test/statsCases/split-chunks-runtime-specific/c.js b/test/statsCases/split-chunks-runtime-specific/c.js new file mode 100644 index 00000000000..eb3a22152f1 --- /dev/null +++ b/test/statsCases/split-chunks-runtime-specific/c.js @@ -0,0 +1,2 @@ +import { bar } from "./objects.js"; +console.log(bar, "!"); diff --git a/test/statsCases/split-chunks-runtime-specific/objects.js b/test/statsCases/split-chunks-runtime-specific/objects.js new file mode 100644 index 00000000000..563f5f9a9e5 --- /dev/null +++ b/test/statsCases/split-chunks-runtime-specific/objects.js @@ -0,0 +1,2 @@ +export const foo = { name: "foo" }; +export const bar = { name: "bar" }; diff --git a/test/statsCases/split-chunks-runtime-specific/webpack.config.js b/test/statsCases/split-chunks-runtime-specific/webpack.config.js new file mode 100644 index 00000000000..008575c37f0 --- /dev/null +++ b/test/statsCases/split-chunks-runtime-specific/webpack.config.js @@ -0,0 +1,59 @@ +const entry = { + a: "./a", + b: "./b", + c: "./c" +}; +const stats = { + chunks: true +}; + +/** @type {import("../../../").Configuration} */ +module.exports = [ + { + name: "used-exports", + mode: "production", + output: { + filename: "used-exports-[name].js" + }, + entry, + optimization: { + splitChunks: { + minSize: 0, + chunks: "all" + } + }, + stats + }, + { + name: "no-used-exports", + mode: "production", + output: { + filename: "no-used-exports-[name].js" + }, + entry, + optimization: { + splitChunks: { + minSize: 0, + chunks: "all", + usedExports: false + } + }, + stats + }, + { + name: "global", + mode: "production", + output: { + filename: "global-[name].js" + }, + entry, + optimization: { + splitChunks: { + minSize: 0, + chunks: "all" + }, + usedExports: "global" + }, + stats + } +]; diff --git a/test/statsCases/split-chunks/a.js b/test/statsCases/split-chunks/a.js index 8f888da4986..bcead2ab1f7 100644 --- a/test/statsCases/split-chunks/a.js +++ b/test/statsCases/split-chunks/a.js @@ -1,6 +1,6 @@ -import "./d"; -import "./e"; -import "x"; -import "y"; -export default "a"; +import d from "./d"; +import e from "./e"; +import x from "x"; +import y from "y"; +export default "a" + d + e + x + y; import(/* webpackChunkName: "async-g" */ "./g"); diff --git a/test/statsCases/split-chunks/b.js b/test/statsCases/split-chunks/b.js index fd909a7b63b..c4a9482e683 100644 --- a/test/statsCases/split-chunks/b.js +++ b/test/statsCases/split-chunks/b.js @@ -1,5 +1,5 @@ -import "./d"; -import "./f"; -import "x"; -import "y"; -export default "b"; +import d from "./d"; +import f from "./f"; +import x from "x"; +import y from "y"; +export default "b" + d + f + x + y; diff --git a/test/statsCases/split-chunks/c.js b/test/statsCases/split-chunks/c.js index 6bbf24bfe50..975020ec2ea 100644 --- a/test/statsCases/split-chunks/c.js +++ b/test/statsCases/split-chunks/c.js @@ -1,5 +1,5 @@ -import "./d"; -import "./f"; -import "x"; -import "z"; -export default "c"; +import d from "./d"; +import f from "./f"; +import x from "x"; +import z from "z"; +export default "c" + d + f + x + z; diff --git a/test/statsCases/split-chunks/g.js b/test/statsCases/split-chunks/g.js index 45be0e69101..c9ff5a60bac 100644 --- a/test/statsCases/split-chunks/g.js +++ b/test/statsCases/split-chunks/g.js @@ -1,2 +1,2 @@ -import "./f"; -export default "g"; +import f from "./f"; +export default "g" + f; diff --git a/test/statsCases/split-chunks/webpack.config.js b/test/statsCases/split-chunks/webpack.config.js index 5172e72b58f..8370c7e4957 100644 --- a/test/statsCases/split-chunks/webpack.config.js +++ b/test/statsCases/split-chunks/webpack.config.js @@ -4,10 +4,12 @@ const stats = { builtAt: false, assets: false, chunks: true, + chunkRelations: true, chunkOrigins: true, entrypoints: true, modules: false }; +/** @type {import("../../../").Configuration[]} */ module.exports = [ { name: "default", @@ -39,7 +41,7 @@ module.exports = [ c: "./c" }, output: { - filename: "default/[name].js" + filename: "all-chunks/[name].js" }, optimization: { splitChunks: { @@ -55,13 +57,12 @@ module.exports = [ mode: "production", entry: { main: "./", - a: "./a", - b: "./b", - c: "./c", - vendors: ["x", "y", "z"] + a: ["x", "y", "z", "./a"], + b: ["x", "y", "z", "./b"], + c: ["x", "y", "z", "./c"] }, output: { - filename: "default/[name].js" + filename: "manual/[name].js" }, optimization: { splitChunks: { @@ -70,7 +71,7 @@ module.exports = [ cacheGroups: { default: false, vendors: { - test: "vendors", + test: /[\\/]node_modules[\\/]/, name: "vendors", enforce: true } @@ -89,7 +90,7 @@ module.exports = [ cccccccccccccccccccccccccccccc: "./c" }, output: { - filename: "[name].js" + filename: "name-too-long/[name].js" }, optimization: { splitChunks: { @@ -111,7 +112,7 @@ module.exports = [ c: "./c" }, output: { - filename: "default/[name].js" + filename: "custom-chunks-filter/[name].js" }, optimization: { splitChunks: { @@ -127,13 +128,12 @@ module.exports = [ mode: "production", entry: { main: "./", - a: "./a", - b: "./b", - c: "./c", - vendors: ["x", "y", "z"] + a: ["x", "y", "z", "./a"], + b: ["x", "y", "z", "./b"], + c: ["x", "y", "z", "./c"] }, output: { - filename: "default/[name].js" + filename: "custom-chunks-filter-in-cache-groups/[name].js" }, optimization: { splitChunks: { @@ -142,7 +142,7 @@ module.exports = [ cacheGroups: { default: false, vendors: { - test: "vendors", + test: /[\\/]node_modules[\\/]/, name: "vendors", enforce: true, chunks: chunk => chunk.name !== "a" diff --git a/test/statsCases/track-returned/index.js b/test/statsCases/track-returned/index.js new file mode 100644 index 00000000000..da2a5d62eb3 --- /dev/null +++ b/test/statsCases/track-returned/index.js @@ -0,0 +1,2550 @@ +function rand() { + return Math.random() > 0.5; +} + +it("should track return in function declaration", () => { + function a1() { + return; + require("fail1"); + } + + function a2() { + if (true) return; + require("fail2"); + } + + function a3() { + { + { + if (true) return; + require("fail3"); + } + } + } + + function a4() { + if (true) { + { + { + } + return; + require("fail4"); + } + } + } + + function a5() { + if (rand()) { + return; + throw require("fail5"); + } + + if (rand()) return; + require("./used?n=171"); + } + + a1(); + a2(); + a3(); + a4(); + a5(); +}); + +it("should track return in function expression", () => { + const a1 = function () { + return; + require("fail6"); + } + + const a2 = function () { + if (true) return; + require("fail7"); + } + + const a3 = function () { + { + { + if (true) return; + require("fail8"); + } + } + } + + const a4 = function () { + if (true) { + { + { + } + return; + require("fail9"); + } + } + } + + const a5 = function () { + if (rand()) { + return; + throw require("fail10"); + } + } + + a1(); + a2(); + a3(); + a4(); + a5(); +}); + +it("should track return in arrow function expression", () => { + const a1 = () => { + return; + require("fail11"); + } + + const a2 = () => { + if (true) return; + result = require("fail12"); + } + + const a3 = () => { + { + { + if (true) return; + result = require("fail13"); + } + } + } + + const a4 = () => { + if (true) { + { + { + } + return; + result = require("fail14"); + } + } + } + + const a5 = () => { + if (rand()) { + return; + throw require("fail15"); + } + } + + const a6 = () => { + if (true) { + return; + (() => require("fail16"))() + } + } + + a1(); + a2(); + a3(); + a4(); + a5(); + a6(); +}); + +it("should work correct for lonely throw", () => { + throw 1; + require("fail17"); +}); + +it("should work correct for lonely return", () => { + return; + require("fail18"); +}); + +it("should work correct for try catch and loops", () => { + try { + throw 1; + require("fail19"); + } catch (e) { + require("./used?n=164"); + } + + try { + if (true) { + throw 1; + require("fail20"); + } + + require("fail21"); + } catch (e) { + require("./used?n=165"); + } + + try { + if (true) { + throw 1; + require("fail22"); + } + + require("fail23"); + } catch (e) { + require("./used?n=166"); + } + + try { + try { + if (true) { + throw 1; + require("fail24"); + } + + require("fail25"); + } catch (e) { + require("./used?n=172"); + } + + require("./used?n=173"); + } catch (e) { + require("./used?n=174"); + } + + function test() { + try { + return; + require("fail26"); + } finally { + require("./used?n=167"); + } + } + + function test1a() { + try { + try { + if (true) { + return fn(); + require("fail27"); + } + + require("fail28"); + } catch (e) { + require("./used?n=175"); + } + + require("./used?n=176"); + } catch (e) { + require("./used?n=177"); + } finally { + require("./used?n=178"); + } + } + + function test1b() { + try { + try { + if (rand()) { + return fn(); + require("fail27"); + } + + require('./used?n=245'); + } catch (e) { + require('./used?n=79'); + } + + require('./used?n=80'); + } catch (e) { + require('./used?n=81'); + } finally { + require('./used?n=82'); + } + } + + function test1c() { + try { + try { + if (true) { + throw 1; + require("fail"); + } + + require("fail"); + } catch (e) { + require('./used?n=83'); + } + + require('./used?n=84'); + } catch (e) { + require('./used?n=85'); + } finally { + require('./used?n=86'); + } + } + + function test1d() { + try { + try { + if (rand()) { + throw 1; + require("fail"); + } + + require("./used?n=87"); + } catch (e) { + require('./used?n=88'); + } + + require('./used?n=89'); + } catch (e) { + require('./used?n=90'); + } finally { + require('./used?n=91'); + } + } + + function test1e() { + try { + try { + if (true) { + throw 1; + require("fail"); + } + + require("fail"); + } catch (e) { + require('./used?n=104'); + return; + } + + require('fail'); + } catch (e) { + require('./used?n=92'); + } finally { + require('./used?n=93'); + } + } + + function test1f() { + try { + try { + if (rand()) { + throw 1; + require("fail"); + } + + require("./used?n=94"); + } catch (e) { + return require('./used?n=95'); + } + + require('./used?n=96'); + } catch (e) { + require('./used?n=97'); + } finally { + require('./used?n=98'); + } + } + + function test1g() { + try { + try { + if (rand()) { + throw 1; + require("fail"); + } + + require("./used?n=99"); + } catch (e) { + require('./used?n=100'); + throw 1; + } + + require('./used?n=101'); + } catch (e) { + require('./used?n=102'); + } finally { + require('./used?n=103'); + } + } + + function test2() { + try { + try { + if (true) { + return; + require("fail30"); + } + + require("fail31"); + } catch (e) { + require("./used?n=179"); + } + + require("./used?n=180"); + } catch (e) { + require("./used?n=181"); + } finally { + require("./used?n=182"); + } + + require("./used?n=41"); + } + + function test3() { + if (true) { + try { + if (true) { + throw new Error('test') + } + require("fail33"); + return false; + } catch (err) { + return false; + } finally { + require("./used?n=170"); + } + } + } + + function fn() { + throw new Error('test'); + } + + function test4() { + try { + return fn() + } catch (err) { + require("./used?n=183"); + } finally { + require("./used?n=184"); + } + } + + function test5() { + try { + return fn() + } catch (err) { + require("./used?n=185"); + } finally { + require("./used?n=186"); + } + } + + function test6() { + try { + return fn() + } catch (err) { + return; + require("fail34") + } finally { + require("./used?n=187"); + } + + require("fail35"); + } + + function test7() { + return next(); + + function next() { + return require("./used?n=188"); + } + } + + async function test8() { + try { + let routeModule = fn(); + + return routeModule; + } catch (error) { + if (test && require("./used?n=189")) { + throw error; + } + } + } + + async function test9() { + try { + let routeModule = fn(); + + return routeModule; + } catch (error) { + if (test && import.meta.hot) { + require("fail36"); + } + } + } + + function test10() { + return require("./used?n=190"), require("./used?n=191"); + } + + function test11() { + try { + let routeModule = fn(); + + return routeModule; + } catch (error) { + const test = 1; + require("./used?n=192") + } finally { + const test = 1; + require("./used?n=193") + } + } + + function test12() { + try { + return fn(); + } catch (error) { + return; + require("fail37"); + } finally { + return; + require("fail38"); + } + import("fail39"); + } + + function test13() { + try { + return fn(); + } catch (error) { + require("./used?n=194") + return; + } finally { + require("./used?n=195") + return; + } + import("fail40"); + } + + function test13() { + try { + fn(); + } catch (error) { + return; + } finally { + return; + } + + require("fail78"); + } + + function test14() { + throw 1, require("./used?n=196"); + require("fail41") + } + + function test15() { + try { + return this || require("./used?n=197"); + } catch { + if (true) return; + require("fail42"); + } + + require("fail"); + } + + function test16() { + try { + return this || require("./used?n=198"); + } finally { + if (true) return; + require("fail43"); + } + + require("fail44"); + } + + function test17() { + try { + return fn(); + } finally { + return; + } + + require("fail45"); + } + + function test18() { + try { + return fn(); + } catch (e) { + + } finally { + require("./used?n=199"); + return; + } + + require("fail46"); + } + + function test19() { + try { + return fn(); + } catch (e) { + return fn() + } finally { + require("./used?n=200"); + return; + } + + require("fail47") + } + + function test19() { + try { + return fn(); + } finally { + require("./used?n=201"); + return; + } + + require("fail79") + } + + function test20() { + try { + return fn(); + } catch { + require("./used?n=202"); + return; + } + + require("fail80") + } + + function test21() { + try { + try { + throw '1'; + } catch (x) { + throw '2'; + } + + require("fail") + } catch (x) { + require("./used?n=203"); + } + + require("./used?n=204"); + } + + function test22() { + try { + try { + throw '1'; + } catch (x) { + throw '2'; + } finally { + throw '3'; + } + + require("fail") + } catch (x) { + require("./used?n=205"); + } + + require("./used?n=206"); + } + + function test23() { + try { + try { + } finally { + throw '3'; + } + + require("fail") + } catch (x) { + require("./used?n=207"); + } + + require("./used?n=208"); + } + + function test24() { + try { + try { + + } finally { + throw '3'; + } + + require("fail81") + } catch (x) { + // handle it + } finally { + } + + require("./used?n=209"); + } + + function test25() { + try { + try { + try { + + } finally { + throw '3'; + } + + require("fail81") + } catch (x) { + // handle it + } finally { + throw 1 + } + } catch (e) { + require("./used?n=210"); + } + } + + function test25a() { + try { + return; + } finally { + } + + require("fail"); + } + + function test26() { + try { + return; + } finally { + throw 1; + } + + require("fail"); + } + + function test27() { + try { + fn(); + } finally { + require("./used?n=211"); + } + + require("./used?n=212"); + } + + function test28() { + try { + return fn(); + } finally { + require("./used?n=213"); + } + + require("fail"); + } + + function test29() { + try { + throw 1; + } finally { + require("./used?n=214"); + } + + require("fail"); + } + + function test30() { + try { + return fn(); + } catch { + return require("./used?n=215"); + } + + require("fail"); + } + + function test30() { + try { + throw 1; + require("fail"); + } catch { + return 2; + require("fail"); + } + + require("fail"); + } + + function test31() { + try { + throw 1; + require("fail"); + } catch { + return 2; + require("fail"); + } finally { + require("./used?n=216"); + } + + require("fail"); + } + + function test32() { + try { + } catch (e) { + } finally { + } + + require("./used?n=217"); + } + + function test33() { + try { + throw 1; + } finally { + } + + require("fail"); + } + + function test33() { + try { + return 1; + } finally { + } + + require("fail"); + } + + function test34() { + try { + return 1; + } catch (e) { + return 1; + } + + require("fail"); + } + + function test35() { + try { + try { + return fn(); + } catch (e) { + throw 1; + } + + require("fail"); + } catch (e) { + require("./used?n=218"); + } + + require("./used?n=221"); + } + + function test36() { + test(); + + throw 1; + + function test() { + require("./used?n=220"); + } + } + + function test37() { + try { + test(); + return false; // Validation skipped = feature disabled. + } catch { + test(); + return true; // Validation worked = feature enabled. + } finally { + require("./used?n=57"); + } + + require("fail"); + } + + function test38() { + try { + try { + test(); + return false; + } catch { + test(); + return true; + } finally { + require("./used?n=59"); + } + require("fail"); + return; + } catch (e) { + require("./used?n=240"); + return; + } finally { + require("./used?n=60"); + } + + require("fail"); + } + + function test39() { + try { + test(); + return; + } catch (e) { + try { + test(); + return false; + } catch { + require("./used?n=62"); + return true; + } finally { + require("./used?n=63"); + } + return; + } finally { + require("./used?n=64"); + } + + require("fail"); + } + + function test40() { + try { + return; + } finally { + require("./used?n=105"); + } + + require("fail"); + } + + function test41() { + try { + throw 1; + } catch (e) { + require("./used?n=106"); + } finally { + require("./used?n=107"); + } + + require("./used?n=108"); + } + + function test42() { + try { + return; + } catch (e) { + return; + } finally { + require("./used?n=109"); + } + + require("fail"); + } + + function test43() { + try { + return; + } finally { + require("./used?n=110"); + } + + require("fail"); + } + + function test44() { + try { + return rand(); + } catch (e) { + throw 1; + } finally { + require("./used?n=111"); + } + + require("fail"); + } + + function test45() { + try { + throw 1; + } catch (e) { + return rand(); + } finally { + require("./used?n=112"); + } + + require("fail"); + } + + function test46() { + try { + throw 1; + } catch (e) { + throw 1; + } finally { + require("./used?n=113"); + } + + require("fail"); + } + + function test47() { + try { + try { + return rand(); + } catch (e) { + return rand(); + } finally { + require("./used?n=114"); + } + } catch (e) { + require("./used?n=115"); + } + + require("./used?n=116"); + } + + function test48() { + try { + return rand(); + } catch (e) { + // nothing + } finally { + require("./used?n=117"); + } + + require("./used?n=118"); + } + + function test49() { + try { + throw 1; + } catch (e) { + // nothing + } finally { + require("./used?n=119"); + } + + require("./used?n=120"); + } + + function test50() { + try { + try { + return rand(); + } catch (e) { + // nothing + } finally { + require("./used?n=121"); + } + + require("./used?n=122"); + } catch (e) { + // nothing + } + + require("./used?n=123"); + } + + function test51() { + try { + try { + throw 1; + } catch (e) { + // nothing + } finally { + require("./used?n=124"); + } + + require("./used?n=125"); + } catch (e) { + // nothing + } + + require("./used?n=126"); + } + + function test52() { + try { + try { + return rand(); + } finally { + require("./used?n=127"); + } + + require("fail"); + } catch (e) { + // nothing + } + + require("./used?n=137"); + } + + function test53() { + try { + try { + throw 1; + } finally { + require("./used?n=128"); + } + + require("fail"); + } catch (e) { + // nothing + } + + require("./used?n=136"); + } + + function test54() { + try { + try { + return rand(); + } finally { + require("./used?n=129"); + } + + require("fail"); + } finally { + // nothing + } + + require("fail"); + } + + function test55() { + try { + return fn(); + } catch (e) { + require("./used?n=130"); + } finally { + require("./used?n=131"); + } + + require("./used?n=132"); + } + + function test56() { + try { + fn(); + } catch (e) { + // nothing + } finally { + require("./used?n=133"); + return; + } + + require("fail"); + } + + function test57() { + try { + fn(); + } catch (e) { + // nothing + } finally { + require("./used?n=134"); + throw 1; + } + + require("fail"); + } + + function test58() { + try { + fn(); + } catch (e) { + // nothing + } + + require("./used?n=135"); + } + + function test59() { + try { + fn(); + } catch (e) { + try { + throw 1; + } catch (e) { + throw 1; + } finally { + require("./used?n=138"); + } + } + + require("./used?n=139"); + } + + function test60() { + try { + try { + throw 1; + } catch (e) { + throw 1; + } finally { + require("./used?n=140"); + } + } catch (e) { + // nothing + } + + require("./used?n=141"); + } + + function test61() { + try { + return fn(); + } finally { + require("./used?n=142"); + } + + require("fail"); + } + + function test62() { + try { + throw 1; + } finally { + require("./used?n=143"); + } + + require("fail"); + } + + function test63() { + try { + // nothing + } finally { + require("./used?n=145"); + } + + require("./used?n=146"); + } + + function test64() { + try { + rand(); + } finally { + require("./used?n=147"); + } + + require("./used?n=148"); + } + + function test65() { + try { + return fn(); + } catch (err) { + // nothing + } finally { + require("./used?n=149"); + } + + require("./used?n=150"); + } + + function test66() { + try { + throw 1; + } catch (err) { + // nothing + } finally { + require("./used?n=151"); + } + + require("./used?n=152"); + } + + + for (let i = 0; i < 1; i++) + if (rand()) + require("./used?n=219"); + + for (let i = 0; i < 1; i++) { + if (true) { + require("./used?n=222"); + return; + } + import("fail48"); + } + + try { + if (rand()) { + if (true) return; + require("fail49"); + } + return; + } catch { + } + + require("./used?n=223"); +}); + +it("should handle edge case with switch case", () => { + const a = rand() ? 1 : 2; + switch (a) { + case 1: { + if (true) return; + return require("fail51"); + } + case 2: + if (true) return; + return require("fail52"); + default: + require("./used?n=168"); + } +}); + +it("should work correct for if", () => { + if (true) { + require("./used?n=153"); + return; + } + + require("fail53"); +}); + +it("should work correct for if #2", () => { + if (false) { + require("fail54"); + } else { + require("./used?n=154"); + } +}); + +it("should work correct for if #3", () => { + if (false) { + require("fail55"); + } else if (true) { + require("./used?n=155"); + } else { + require("fail56"); + } +}); + +it("should work correct for if #4", () => { + if (false) { + require("fail57"); + } else if (false) { + require("fail58"); + } else { + require("./used?n=156"); + } +}); + +it("should work correct for if #5", () => { + if (rand()) + return; + else if (rand()) + return; + else { + const test = 1; + require("./used?n=42"); + } +}); + +it("should work correct for if #6", () => { + if (rand()) + return; + else { + const test = 1; + require("./used?n=43"); + } +}); + +it("should work correct for if #7", () => { + if (rand()) + return; + else + return; + + require("fail"); +}); + +it("should work correct for if #8", () => { + if (rand()) { + rand() + } else if (rand()) { + rand() + } else + return; + + require("./used?n=44"); +}); + +it("should work correct for if #9", () => { + if (true) { + return; + } else if (rand()) { + require("fail"); + } else + require("fail"); + + require("fail"); +}); + +it("should work correct for if #10", () => { + if (rand()) { + return; + } else if (true) { + return; + } else + require("fail"); + + require("fail"); +}); + +it("should work correct for if #11", () => { + if (false) + return; + else if (rand()) { + return; + } else + return; + + require("fail"); +}); + +it("should work correct for if #12", () => { + if (false) + return; + else if (false) { + return; + } else + return; + + require("fail"); +}); + +it("should work correct for if #13", () => { + if (true) + return; + else if (true) { + return; + } else + return; + + require("fail"); +}); + +it("should work correct for if #13", () => { + if (false) + return; + else if (false) { + return; + } else { + } + + require("./used?n=45"); +}); + +it("should work correct for if #14", () => { + if (fn()) + return; + else if (fn()) { + fn() + require("./used?n=46"); + } + + require("./used?n=47"); +}); + +it("should work correct for if #15", () => { + if (true) { + return; + } + + require("fail"); +}); + +it("should work correct for if #16", () => { + if (true) return; + + const test = 1; + require("fail"); +}); + +it("should work correct for if #17", () => { + if (false) return; + + const test = 1; + require("./used?n=48"); +}); + +it("should work correct for if #18", () => { + if (rand()) return; + + const test = 1; + require("./used?n=49"); +}); + +it("should work correct for if #19", () => { + if (!rand()) + // if reference flag is false ,then show the form and update the model with relative type list + return rand(); + else { + if (rand()) { + rand(); + require("./used?n=144"); + rand(); + } else { + rand(); + require("./used?n=58"); + rand(); + } + } + + require("./used?n=65"); +}); + +it("should work correct for if #20", () => { + if (rand()) { + return; + } else if (rand()) { + return; + } else if (rand()) { + return; + } else if (rand()) { + return; + } + + require("./used?n=61"); +}); + +it("should work correct for if #21", () => { + if (rand()) + return; + else if (rand()) + return; + else if (rand()) + return; + else if (rand()) + return; + + require("./used?n=239"); +}); + +it("should work correct for if #22", () => { + if (rand()) { + if (true) { + return; + } else if (rand()) { + return; + } else { + return; + } + + require("fail"); + } else { + return; + require("fail"); + } + + require("fail"); +}); + +it("should work correct for if #23", () => { + if (rand()) { + if (rand()) { + return; + } else if (true) { + return; + } else { + return; + } + + require("fail"); + } else { + return; + require("fail"); + } + + require("fail"); +}); + +it("should work correct for if #24", () => { + if (rand()) { + if (rand()) { + return; + } else if (rand()) { + return; + } else { + return; + } + } + + require("./used?n=238"); +}); + +it("should work correct for if #25", () => { + if (rand()) { + if (rand()) { + return; + } else if (rand()) { + return; + } else { + return; + } + } else if (rand()) { + return; + } + + require("./used?n=237"); +}); + +it("should work correct for if #26", () => { + if (rand()) { + if (rand()) { + return; + } else if (rand()) { + return; + } else { + return; + } + } else if (rand()) { + return; + } else if (rand()) { + } + + require("./used?n=236"); +}); + +it("should work correct for if #22", () => { + if (rand()) { + if (rand()) { + return; + } else if (rand()) { + return; + } else { + return; + } + + require("fail"); + } else if (rand()) { + if (rand()) { + return; + } else { + return; + } + + require("fail"); + } else { + return; + } + + require("fail"); +}); + +it("should work correct for if #23", () => { + if (rand()) { + if (rand()) + return; + else if (rand()) + return; + else + return; + + require("fail"); + } else if (rand()) { + if (rand()) + return; + else + return; + + require("fail"); + } else { + return; + } + + require("fail"); +}); + +it("should work correct for if #24", () => { + if (rand()) { + if (rand()) { + return; + } else { + return; + } + } else { + return; + } + + require("fail"); +}); + +it("should work correct for if #25", () => { + if (rand()) + return; + else if (rand()) + return; + else + return; + + require("fail"); +}); + +it("should work correct for if #26", () => { + if (rand()) { + return; + } else if (rand()) + return; + else + return; + + require("fail"); +}); + +it("should work correct for if #27", () => { + if (rand()) + return; + else { + if (rand()) + return; + else + return; + } + + require("fail"); +}); + +it("should work correct for if #28", () => { + if (rand()) { + if (rand()) { + return; + } else { + const test = 1; + require("./used?n=235"); + return; + } + + require("fail"); + } +}); + +it("should work correct for if #29", () => { + if (rand()) { + return; + if (rand()) { + return; + } else { + return; + } + + require("fail"); + } +}); + +it("should work correct for if #30", () => { + if (rand()) { + rand(); + return; + } else { + rand(); + } + + require("./used?n=234"); +}); + +it("should work correct for if #31", () => { + if (rand()) { + rand(); + } else { + rand(); + return; + } + + require("./used?n=233"); +}); + +it("should work correct for if #32", () => { + if (rand()) { + rand(); + return; + } else { + rand(); + return; + } + + require("fail"); +}); + +it("should work correct for if #33", () => { + if (rand()) { + rand(); + return; + } else if (rand()) { + rand() + } else { + rand(); + return; + } + + require("./used?n=232"); +}); + +it("should work correct for if #34", () => { + if (rand()) { + rand(); + return; + } else if (rand()) { + rand(); + return; + } else { + rand(); + } + + require("./used?n=231"); +}); + +it("should work correct for if #35", () => { + if (rand()) { + rand(); + } else if (rand()) { + rand(); + return; + } else { + rand(); + return; + } + + require("./used?n=230"); +}); + +it("should work correct for if #36", () => { + if (rand()) { + if (rand()) { + return; + } else if (rand()) { + return; + } else { + return; + } + require("fail"); + } else if (rand()) { + rand(); + } else { + rand(); + } + + require("./used?n=229"); +}); + +it("should work correct for if #37", () => { + if (rand()) { + rand(); + } else if (rand()) { + if (rand()) { + return; + } else if (rand()) { + return; + } else { + return; + } + require("fail"); + } else { + rand(); + } + + require("./used?n=228"); +}); + +it("should work correct for if #38", () => { + if (rand()) { + rand(); + } else if (rand()) { + rand(); + } else { + if (rand()) { + return; + } else if (rand()) { + return; + } else { + return; + } + require("fail"); + } + + require("./used?n=227"); +}); + +it("should work correct for if #39", () => { + if (rand()) { + rand(); + } else if (rand()) { + rand(); + } else { + return; + require("fail"); + if (rand()) { + return; + } else if (rand()) { + return; + } else { + return; + } + require("fail"); + } +}); + +it("should work correct for if #40", () => { + if (rand()) { + require('./used?n=8'); + } else { + if (rand()) { + require('./used?n=9'); + } else { + if (rand()) { + require('./used?n=10'); + } else { + if (rand()) { + require('./used?n=11'); + } else { + if (rand()) { + require('./used?n=12'); + } else { + return; + } + require('./used?n=1'); + require('./used?n=2'); + } + require('./used?n=3'); + } + require('./used?n=4'); + } + require('./used?t=5'); + } + require('./used?n=6'); + require('./used?n=7'); +}); + +it("should work correct for if #41", () => { + if (rand()) { + return + } else { + if (rand()) { + return + } else { + if (rand()) { + return + } else { + if (rand()) { + return + } else { + if (rand()) { + return + } else { + return; + } + require('fail'); + require('fail'); + } + require('fail'); + } + require('fail'); + } + require('fail'); + } + require('fail'); +}); + +it("should work correct for if #42", () => { + try { + if (rand()) { + return; + require("fail"); + } else { + return; + require("fail"); + } + + require("fail"); + require("fail"); + } catch (e) { + require('./used?n=13'); + } +}); + +it("should work correct for if #43", () => { + for (let i = 0; i < 1; i++) { + if (true) + return; + require("fail"); + } +}); + +it("should work correct for if #44", () => { + for (let i = 0; i < 1; i++) + if (true) + return; + require("./used?n=14"); +}); + +it("should work correct for if #45", () => { + if (rand()) + rand(); + else if (rand()) + rand(); + else + if (rand()) + return; + else if (rand()) + return; + else + return; + + require("./used?n=68"); +}); + +it("should work correct for if #47", () => { + if (rand()) + return; + else if (rand()) + rand(); + else + return; + + require("./used?n=69"); +}); + +it("should work correct for if #48", () => { + if (rand()) + return; + else if (true) + rand(); + else + return; + + require("./used?n=70"); +}); + +it("should work correct for if #49", () => { + if (true) + return; + else if (rand()) + rand(); + else + return; + + require("fail"); +}); + +it("should work correct for if #50", () => { + if (rand()) + return; + else if (true) + return + else + return; + + require("fail"); +}); + +it("should work correct for if #51", () => { + if (rand()) + return; + else + return; + + require("fail"); +}); + +it("should work correct for if #52", () => { + if (true) + return; + else + return; + + require("fail"); +}); + +it("should work correct for if #53", () => { + if (rand()) + rand(); + else + return; + + require("./used?n=71"); +}); + +it("should work correct for if #54", () => { + if (rand()) { + return rand(); + } else + return; + + require("fail"); +}); + +it("should work correct for if #55", () => { + if (rand()) { + rand(); + } else + return; + + require("./used?n=72"); +}); + +it("should work correct for if #56", () => { + if (rand()) { + return rand(); + } else + rand(); + + require("./used?n=73"); +}); + +it("should work correct for if #57", () => { + if (rand()) { + rand(); + } else + return rand(); + + require("./used?n=74"); +}); + +it("should work correct for if #58", () => { + if (rand()) { + rand(); + } + + require("./used?n=75"); +}); + +it("should work correct for if #59", () => { + if (rand()) { + return rand(); + } + + require("./used?n=76"); +}); + +it("should work correct for if #60", () => { + if (true) { + return rand(); + } + + require("fail"); +}); + +it("should work correct for if #61", () => { + if (false) { + return rand(); + } + + require("./used?n=77"); +}); + +it("should work correct for if #62", () => { + if (false) { + return rand(); + } else { + rand() + } + + require("./used?n=78"); +}); + +it("should work correct for if #63", () => { + if (false) { + return rand(); + } else { + return rand() + } + + require("fail"); +}); + +it("should work correct for switch #1", () => { + switch (expr) { + case "Oranges": + return; + break; + case "Apples": + rand(); + require("./used?n=15"); + break; + case "Bananas": + case "Cherries": + rand() + require("./used?n=16"); + break; + case "Mangoes": + case "Papayas": + require("./used?n=17"); + break; + default: + require("./used?n=18"); + } +}); + +it("should work correct for switch #2", () => { + switch (expr) { + case "Oranges": { + return; + break; + } + case "Apples": { + rand(); + require("./used?n=19"); + break; + } + case "Bananas": + case "Cherries": { + rand() + require("./used?n=20"); + break; + } + case "Mangoes": + case "Papayas": { + require("./used?n=21"); + break; + } + default: { + require("./used?n=22"); + } + } +}); + +it("should work correct for block statement", () => { + { + { + return; + require("fail"); + } + require("fail"); + } + + require("fail"); +}); + +it("should work correct for loop and return", () => { + function test() { + for (let i = 0; i < 0; i++) + if (rand()) + return; + require("./used?n=23"); + } +}); + +it("should work correct for labeled statement", () => { + use_cache: { + if (rand()) { + rand(); + } else { + require("./used?n=27") + } + if (rand()) { + break use_cache; + } + if (false) { + require("fail") + } else { + return; + } + return entry.result; + } + + require("./used?n=24") + + { + require("./used?n=25") + } + + require("./used?n=26") +}); + +it("should work correct for while statement", () => { + let n = 0; + let x = 0; + + while (false) { + n++; + x += n; + require("./used?n=28"); + return; + } + + while (false) { + n++; + x += n; + return; + require("fail"); + } + + while (false) { + n++; + x += n; + throw new Error('test'); + require("fail"); + } + + require("./used?n=29"); + + while (false) + return; + + require("./used?n=30"); + + while (require("./used?n=241") < 5) { + return; + } + + require("./used?n=242"); + + while ( + (() => { + return 15; + })() < 10 + ) { + return; + } + + require("./used?n=243"); + + while ( + (function wrap() { + return 15; + })() < 10 + ) { + return; + } + + require("./used?n=244"); +}); + +it("should work correct for do while statement", () => { + let n = 0; + let x = 0; + + do { + n++; + x += n; + require("./used?n=31"); + return; + } while(false) + + do { + n++; + x += n; + return; + require("fail"); + } while(false); + + do { + n++; + x += n; + throw new Error('test'); + require("fail"); + } while(false) + + require("./used?n=32"); + + do + return; + while(false) + + require("./used?n=33"); +}); + +it("should work correct for for/in", () => { + const object = { a: 1, b: 2, c: 3 }; + + for (const property in object) { + return; + } + + try { + for (const property in object) { + return; + require("fail") + } + } catch (e) { + + } finally { + + } + + try { + for (const property in object) { + throw new Error('test'); + require("fail") + } + } catch (e) { + require("./used?n=66"); + } finally { + require("./used?n=67"); + } + + require("./used?n=34"); + + for (const property in object) + return; + + require("./used?n=35"); +}); + +it("should work correct for for/of", () => { + const iterable = [10, 20, 30]; + + for (let value of iterable) { + return; + } + + require("./used?n=36"); + + for (let value of iterable) + return; + + require("./used?n=37"); +}); + +it("should work correct for for", () => { + for (let i = 0; i < 9; i++) { + return; + } + + require("./used?n=38"); + + for (let i = 0; i < 9; i++) + return; + + require("./used?n=39"); +}); + +it("should work correct for function declaration", () => { + require("./used?n=40"); + + function test() { + return; + } + + require("./used?n=50"); +}); + +it("should work correct for IIFE", () => { + require("./used?n=51"); + + (function () { + return; + })(); + + require("./used?n=52"); + + (() => { + return; + })(); + + require("./used?n=53"); + + (async () => { + return; + })(); + + require("./used?n=54"); +}); + +it("should work correct for classes", () => { + require("./used?n=55"); + + class Test { + fn() { + return; + } + } + + require("./used?n=56"); +}); + +it("should not include unused assets", (done) => { + let a, b; + (function () { + try { + return; + + require("fail59"); + } finally { + a = require("./used?n=157"); + + { + try { + return fn(); + require("fail60"); + } finally { + b = require("./used?n=158"); + } + } + + require("./used49"); + } + })(); +}); + +it("should work correct for classes", () => { + class Test { + value = true ? require("./used?n=159") : require("fail62"); + + static value = true ? require("./used?n=160") : require("fail63"); + + constructor(height = true ? require("./used?n=161") : require("fail64"), width) { + if (true) return; + return require("fail65"); + } + + method() { + if (true) return; + return require("fail66"); + } + + static method() { + if (true) return; + return require("fail67"); + } + + get area() { + if (true) return; + return require("fail68"); + } + + set area(value) { + if (true) return; + return require("fail69"); + } + } +}); + +function top1() { + return; + require("fail70"); +} + +if (false) { + require("fail71"); +} else if (true) { + require("./used?n=162"); +} else { + require("fail72"); +} + +const test = true ? require("./used?n=163") : require("fail73"); + +const a = rand() ? 1 : 2; + +switch (a) { + case 1: { + if (true) require("./used?n=225"); + else require("fail74"); + } + case 2: + if (false) require("fail75"); + default: + require("./used?n=169"); +} + +if (true) { + require("./used?n=224"); +} + +if (false) { + require("fail77"); +} + +require("./used?n=226"); diff --git a/test/statsCases/track-returned/test.config.js b/test/statsCases/track-returned/test.config.js new file mode 100644 index 00000000000..02f3effd85c --- /dev/null +++ b/test/statsCases/track-returned/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + validate(stats) { + expect(stats.compilation.modules.size).toBe(246); + } +}; diff --git a/test/statsCases/track-returned/used.js b/test/statsCases/track-returned/used.js new file mode 100644 index 00000000000..4387befddd2 --- /dev/null +++ b/test/statsCases/track-returned/used.js @@ -0,0 +1 @@ +module.exports = 10; diff --git a/test/statsCases/tree-shaking/a.js b/test/statsCases/tree-shaking/a.js index cb4174a1ead..53fb9a1419e 100644 --- a/test/statsCases/tree-shaking/a.js +++ b/test/statsCases/tree-shaking/a.js @@ -1 +1,3 @@ -export var a; \ No newline at end of file +export var a; + +console.log(); diff --git a/test/statsCases/tree-shaking/b.js b/test/statsCases/tree-shaking/b.js index 659a403c6d5..ec8a2cadad7 100644 --- a/test/statsCases/tree-shaking/b.js +++ b/test/statsCases/tree-shaking/b.js @@ -1 +1 @@ -export var b; \ No newline at end of file +export var b; diff --git a/test/statsCases/tree-shaking/edge.js b/test/statsCases/tree-shaking/edge.js index b5dc74ea52b..53bc2c1fff2 100644 --- a/test/statsCases/tree-shaking/edge.js +++ b/test/statsCases/tree-shaking/edge.js @@ -1,2 +1,4 @@ export var x = 1; -export * from "./unknown2"; \ No newline at end of file +export * from "./unknown2"; + +console.log(); diff --git a/test/statsCases/tree-shaking/index.js b/test/statsCases/tree-shaking/index.js index 290c040374b..3bf5750b419 100644 --- a/test/statsCases/tree-shaking/index.js +++ b/test/statsCases/tree-shaking/index.js @@ -1,6 +1,6 @@ import { a as a1 } from "./reexport-known"; import { a as a2, c as c2 } from "./reexport-unknown"; -import { a as a3} from "./reexport-star-known"; +import { a as a3 } from "./reexport-star-known"; import { a as a4, c as c4 } from "./reexport-star-unknown"; import { y } from "./edge"; diff --git a/test/statsCases/tree-shaking/reexport-star-known.js b/test/statsCases/tree-shaking/reexport-star-known.js index 281c96ee930..b8f4c7d85b3 100644 --- a/test/statsCases/tree-shaking/reexport-star-known.js +++ b/test/statsCases/tree-shaking/reexport-star-known.js @@ -1,2 +1,4 @@ export * from "./a"; -export * from "./b"; \ No newline at end of file +export * from "./b"; + +console.log(); diff --git a/test/statsCases/tree-shaking/reexport-star-unknown.js b/test/statsCases/tree-shaking/reexport-star-unknown.js index fc0528c5299..b2a713c0c0d 100644 --- a/test/statsCases/tree-shaking/reexport-star-unknown.js +++ b/test/statsCases/tree-shaking/reexport-star-unknown.js @@ -1,3 +1,5 @@ export * from "./a"; export * from "./b"; -export * from "./unknown"; \ No newline at end of file +export * from "./unknown"; + +console.log(); diff --git a/test/statsCases/tree-shaking/reexport-unknown.js b/test/statsCases/tree-shaking/reexport-unknown.js index 8c5b800ded0..88b98b161d3 100644 --- a/test/statsCases/tree-shaking/reexport-unknown.js +++ b/test/statsCases/tree-shaking/reexport-unknown.js @@ -1,3 +1,5 @@ export { a } from "./a"; export { b } from "./b"; -export { c, d } from "./unknown"; \ No newline at end of file +export { c, d } from "./unknown"; + +console.log(); diff --git a/test/statsCases/tree-shaking/require.include.js b/test/statsCases/tree-shaking/require.include.js index bacf81ea04f..774ce0e48a1 100644 --- a/test/statsCases/tree-shaking/require.include.js +++ b/test/statsCases/tree-shaking/require.include.js @@ -1,2 +1,4 @@ export var a = 1; export default 2; + +console.log(); diff --git a/test/statsCases/tree-shaking/unknown.js b/test/statsCases/tree-shaking/unknown.js index e69de29bb2d..b7bd4c88516 100644 --- a/test/statsCases/tree-shaking/unknown.js +++ b/test/statsCases/tree-shaking/unknown.js @@ -0,0 +1 @@ +console.log(); diff --git a/test/statsCases/tree-shaking/unknown2.js b/test/statsCases/tree-shaking/unknown2.js index e69de29bb2d..b7bd4c88516 100644 --- a/test/statsCases/tree-shaking/unknown2.js +++ b/test/statsCases/tree-shaking/unknown2.js @@ -0,0 +1 @@ +console.log(); diff --git a/test/statsCases/tree-shaking/webpack.config.js b/test/statsCases/tree-shaking/webpack.config.js index 5de0fe940b0..018c4209c9f 100644 --- a/test/statsCases/tree-shaking/webpack.config.js +++ b/test/statsCases/tree-shaking/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../").Configuration} */ module.exports = { mode: "production", entry: "./index", diff --git a/test/statsCases/warnings-space-warning/a.js b/test/statsCases/warnings-space-warning/a.js new file mode 100644 index 00000000000..cc798ff50da --- /dev/null +++ b/test/statsCases/warnings-space-warning/a.js @@ -0,0 +1 @@ +export const a = 1; diff --git a/test/statsCases/warnings-space-warning/index.js b/test/statsCases/warnings-space-warning/index.js new file mode 100644 index 00000000000..d7d72476299 --- /dev/null +++ b/test/statsCases/warnings-space-warning/index.js @@ -0,0 +1,3 @@ +import { bb } from "./a"; + +console.log(bb); diff --git a/test/statsCases/warnings-space-warning/webpack.config.js b/test/statsCases/warnings-space-warning/webpack.config.js new file mode 100644 index 00000000000..2e516731d15 --- /dev/null +++ b/test/statsCases/warnings-space-warning/webpack.config.js @@ -0,0 +1,9 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + entry: "./index.js", + mode: "production", + stats: { + warningsSpace: 0, + warnings: true + } +}; diff --git a/test/statsCases/warnings-terser/a.js b/test/statsCases/warnings-terser/a.js deleted file mode 100644 index fbd003bfecc..00000000000 --- a/test/statsCases/warnings-terser/a.js +++ /dev/null @@ -1,7 +0,0 @@ -module.export = function someUsedFunction() {}; - -function someUnRemoteUsedFunction1() {} -function someUnRemoteUsedFunction2() {} -function someUnRemoteUsedFunction3() {} -function someUnRemoteUsedFunction4() {} -function someUnRemoteUsedFunction5() {} diff --git a/test/statsCases/warnings-terser/index.js b/test/statsCases/warnings-terser/index.js deleted file mode 100644 index e0b5278ba9c..00000000000 --- a/test/statsCases/warnings-terser/index.js +++ /dev/null @@ -1,12 +0,0 @@ -var someRequiredUsedFunction = require("./a"); - -function someUsedFunction() {} - -someRequiredUsedFunction(); -someUsedFunction(); - -function someUnUsedFunction1() {} -function someUnUsedFunction2() {} -function someUnUsedFunction3() {} -function someUnUsedFunction4() {} -function someUnUsedFunction5() {} diff --git a/test/statsCases/warnings-terser/webpack.config.js b/test/statsCases/warnings-terser/webpack.config.js deleted file mode 100644 index 19487004ac8..00000000000 --- a/test/statsCases/warnings-terser/webpack.config.js +++ /dev/null @@ -1,36 +0,0 @@ -const TerserPlugin = require("terser-webpack-plugin"); -module.exports = { - mode: "production", - entry: "./index", - output: { - filename: "bundle.js" - }, - optimization: { - minimize: true, - minimizer: [ - new TerserPlugin({ - sourceMap: true, - terserOptions: { - compress: { - warnings: true - }, - mangle: false, - output: { - beautify: true, - comments: false - }, - warnings: true - }, - warningsFilter(message, filename) { - return /a\.js$/.test(filename); - } - }) - ] - }, - stats: { - chunkModules: false, - modules: true, - providedExports: true, - usedExports: true - } -}; diff --git a/test/statsCases/wasm-explorer-examples-sync/Q_rsqrt.wasm b/test/statsCases/wasm-explorer-examples-sync/Q_rsqrt.wasm new file mode 100644 index 00000000000..e5c17c16d93 Binary files /dev/null and b/test/statsCases/wasm-explorer-examples-sync/Q_rsqrt.wasm differ diff --git a/test/statsCases/wasm-explorer-examples-sync/duff.wasm b/test/statsCases/wasm-explorer-examples-sync/duff.wasm new file mode 100644 index 00000000000..0b75ea455a8 Binary files /dev/null and b/test/statsCases/wasm-explorer-examples-sync/duff.wasm differ diff --git a/test/statsCases/wasm-explorer-examples-sync/fact.wasm b/test/statsCases/wasm-explorer-examples-sync/fact.wasm new file mode 100644 index 00000000000..50ce8c098a4 Binary files /dev/null and b/test/statsCases/wasm-explorer-examples-sync/fact.wasm differ diff --git a/test/statsCases/wasm-explorer-examples-sync/fast-math.wasm b/test/statsCases/wasm-explorer-examples-sync/fast-math.wasm new file mode 100644 index 00000000000..1733deb9ba7 Binary files /dev/null and b/test/statsCases/wasm-explorer-examples-sync/fast-math.wasm differ diff --git a/test/statsCases/wasm-explorer-examples-sync/index.js b/test/statsCases/wasm-explorer-examples-sync/index.js new file mode 100644 index 00000000000..a9cfd3a36de --- /dev/null +++ b/test/statsCases/wasm-explorer-examples-sync/index.js @@ -0,0 +1,23 @@ +it("Q_rsqrt should work", function() { + return import("./tests").then(t => t.run_Q_rsqrt()); +}); + +it("testFunction should work", function() { + return import("./tests").then(t => t.run_testFunction()); +}); + +it("fact should work", function() { + return import("./tests").then(t => t.run_fact()); +}); + +it("popcnt should work", function() { + return import("./tests").then(t => t.run_popcnt()); +}); + +it("fast-math should work", function() { + return import("./tests").then(t => t.run_fastMath()); +}); + +it("duff should work", function() { + return import("./tests").then(t => t.run_duff()); +}); diff --git a/test/statsCases/wasm-explorer-examples-sync/node_modules/env.js b/test/statsCases/wasm-explorer-examples-sync/node_modules/env.js new file mode 100644 index 00000000000..bb82d984bdc --- /dev/null +++ b/test/statsCases/wasm-explorer-examples-sync/node_modules/env.js @@ -0,0 +1 @@ +export const _Z3powdd = Math.pow; diff --git a/test/statsCases/wasm-explorer-examples-sync/popcnt.wasm b/test/statsCases/wasm-explorer-examples-sync/popcnt.wasm new file mode 100644 index 00000000000..f605a5a95f7 Binary files /dev/null and b/test/statsCases/wasm-explorer-examples-sync/popcnt.wasm differ diff --git a/test/statsCases/wasm-explorer-examples-sync/test.filter.js b/test/statsCases/wasm-explorer-examples-sync/test.filter.js new file mode 100644 index 00000000000..324b9e82115 --- /dev/null +++ b/test/statsCases/wasm-explorer-examples-sync/test.filter.js @@ -0,0 +1,5 @@ +const supportsWebAssembly = require("../../helpers/supportsWebAssembly"); + +module.exports = function (config) { + return supportsWebAssembly(); +}; diff --git a/test/statsCases/wasm-explorer-examples-sync/testFunction.wasm b/test/statsCases/wasm-explorer-examples-sync/testFunction.wasm new file mode 100644 index 00000000000..3be47ce57b4 Binary files /dev/null and b/test/statsCases/wasm-explorer-examples-sync/testFunction.wasm differ diff --git a/test/statsCases/wasm-explorer-examples-sync/tests.js b/test/statsCases/wasm-explorer-examples-sync/tests.js new file mode 100644 index 00000000000..c957248a967 --- /dev/null +++ b/test/statsCases/wasm-explorer-examples-sync/tests.js @@ -0,0 +1,50 @@ +import * as Q_rsqrt from "./Q_rsqrt.wasm"; +import * as testFunction from "./testFunction.wasm"; +import * as fact from "./fact.wasm"; +import * as popcnt from "./popcnt.wasm"; +import * as fastMath from "./fast-math.wasm"; +import * as duff from "./duff.wasm"; + +export function run_Q_rsqrt() { + const result = Q_rsqrt._Z7Q_rsqrtf(1/1764); + expect(result).toBeGreaterThan(41.9); + expect(result).toBeLessThan(42.1); +} + +export function run_testFunction() { + const view = new Int32Array(testFunction.memory.buffer); + view[0] = 123; + view[1] = 1; + view[2] = 2; + view[3] = 3; + const result = testFunction._Z12testFunctionPii(4, 3); + expect(result).toEqual(6); +} + +export function run_fact() { + const result = fact._Z4facti(11); + expect(result).toEqual(39916800); +} + +export function run_popcnt() { + expect(popcnt.main(0xF0F)).toEqual(16); + expect(popcnt._Z5countj(0xF0F)).toEqual(8); +} + +export function run_fastMath() { + expect(fastMath._Z3food(42)).toEqual(14); + expect(fastMath._Z9maybe_mindd(42, 24)).toEqual(24); + expect(fastMath._Z8call_powd(42)).toEqual(9682651996416); + expect(fastMath._Z6do_powd(42)).toEqual(9682651996416); + expect(fastMath._Z6factorddd(42, 42, 42)).toEqual(3528); +} + +export function run_duff() { + const view = new Uint8Array(duff.memory.buffer); + view[0] = 123; + for(let i = 1; i < 100; i++) + view[i] = i; + const result = duff._Z4sendPcS_m(200, 1, 100); + for(let i = 1; i < 100; i++) + expect(view[199 + i]).toEqual(i); +} diff --git a/test/statsCases/wasm-explorer-examples-sync/webpack.config.js b/test/statsCases/wasm-explorer-examples-sync/webpack.config.js new file mode 100644 index 00000000000..6e61793ab6e --- /dev/null +++ b/test/statsCases/wasm-explorer-examples-sync/webpack.config.js @@ -0,0 +1,25 @@ +/** @type {import("../../../").Configuration} */ +module.exports = { + mode: "production", + entry: "./index", + output: { + filename: "bundle.js" + }, + optimization: { + splitChunks: { + minSize: {}, + maxSize: { + webassembly: 500 + } + } + }, + stats: { + chunks: true, + chunkModules: true, + dependentModules: true, + modules: true + }, + experiments: { + asyncWebAssembly: true + } +}; diff --git a/test/statsCases/worker-public-path/index.js b/test/statsCases/worker-public-path/index.js new file mode 100644 index 00000000000..8f85f137a4d --- /dev/null +++ b/test/statsCases/worker-public-path/index.js @@ -0,0 +1,4 @@ +const worker = new Worker(new URL("./worker.js", import.meta.url), { + type: "module" +}); +worker.postMessage("ok"); diff --git a/test/statsCases/worker-public-path/webpack.config.js b/test/statsCases/worker-public-path/webpack.config.js new file mode 100644 index 00000000000..8f1f15977e8 --- /dev/null +++ b/test/statsCases/worker-public-path/webpack.config.js @@ -0,0 +1,8 @@ +/** @type {import("../../../types").Configuration} */ +module.exports = { + mode: "production", + entry: "./index.js", + output: { + filename: "[name]-[contenthash].js" + } +}; diff --git a/test/statsCases/worker-public-path/worker.js b/test/statsCases/worker-public-path/worker.js new file mode 100644 index 00000000000..939319f6379 --- /dev/null +++ b/test/statsCases/worker-public-path/worker.js @@ -0,0 +1,6 @@ +function upper(str) { + return str.toUpperCase(); +} +onmessage = async event => { + postMessage(`data: ${upper(event.data)}, thanks`); +}; diff --git a/test/target-browserslist.unittest.js b/test/target-browserslist.unittest.js new file mode 100644 index 00000000000..ef6104c9b80 --- /dev/null +++ b/test/target-browserslist.unittest.js @@ -0,0 +1,84 @@ +const { resolve } = require("../lib/config/browserslistTargetHandler"); + +describe("browserslist target", () => { + const tests = [ + // IE + ["ie 11"], + ["ie_mob 11"], + + // Edge + ["edge 79"], + + // Android + ["android 4"], + ["android 4.1"], + ["android 4.4.3-4.4.4"], + ["android 81"], + + // Chrome + // Browserslist return `chrome` versions for `electron 11.0` query + ["chrome 80"], + ["and_chr 80"], + + // Firefox + ["firefox 68"], + ["and_ff 68"], + + // Opera + ["opera 54"], + ["op_mob 54"], + + // Safari + // Browserslist return `safari` versions for `phantomjs 2.1` query + ["safari 10"], + ["safari TP"], + ["safari 11"], + ["safari 12.0"], + ["safari 12.1"], + ["safari 13"], + ["ios_saf 12.0-12.1"], + + // Samsung + ["samsung 4"], + ["samsung 9.2"], + ["samsung 11.1-11.2"], + + // Opera mini + ["op_mini all"], + + // BlackBerry + ["bb 10"], + + // Node + ["node 0.10.0"], + ["node 0.12.0"], + ["node 10.0.0"], + ["node 10.17.0"], + ["node 12.19.0"], + + // UC browsers for Android + ["and_uc 12.12"], + + // QQ browser + ["and_qq 10.4"], + + // Kaios + ["kaios 2.5"], + + // Baidu + ["baidu 7.12"], + + // Multiple + ["firefox 80", "chrome 80"], + ["chrome 80", "node 12.19.0"], + + // Unknown + ["unknown 50"] + ]; + + for (const test of tests) { + it(`${JSON.stringify(test)}`, () => { + expect(resolve(test)).toMatchSnapshot(); + }); + } +}); diff --git a/test/typesCases/cjs/index.ts b/test/typesCases/cjs/index.ts new file mode 100644 index 00000000000..a3bec018e2b --- /dev/null +++ b/test/typesCases/cjs/index.ts @@ -0,0 +1,24 @@ +require("./a"); +require.include("./a"); +require.resolveWeak("./a"); +require.ensure(["./a"], require => { + require("./b"); +}); +require.ensure( + ["./a"], + require => { + require("./b"); + }, + err => {}, + "name1" +); +const context = require.context("ctx"); +context.keys(); +context.id; +context.resolve("./a"); +require.context("ctx", true, /.*\.js/, "sync"); + +//@ts-expect-error +require(123); +//@ts-expect-error +require.include(123); diff --git a/test/typesCases/global/index.ts b/test/typesCases/global/index.ts new file mode 100644 index 00000000000..0c4b305ba38 --- /dev/null +++ b/test/typesCases/global/index.ts @@ -0,0 +1,18 @@ +__webpack_hash__; + +//@ts-expect-error +window.__webpack_hash__; + +__webpack_require__(1); +//@ts-expect-error +global.__webpack_require__(1); + +__webpack_require__("1"); +//@ts-expect-error +global.__webpack_require__("1"); + +if (module.hot) { +} + +__webpack_exports_info__.exportA.used; +__webpack_exports_info__.exportA.b.c.provideInfo; diff --git a/test/typesCases/hot/index.ts b/test/typesCases/hot/index.ts new file mode 100644 index 00000000000..c60f9a3a623 --- /dev/null +++ b/test/typesCases/hot/index.ts @@ -0,0 +1,25 @@ +module.hot.status(); +module.hot.accept(() => { module.hot.data; }); +module.hot.accept((err, { moduleId, module }) => {}); +module.hot.accept("1", () => {}, (err, { moduleId, dependencyId }) => {}); +module.hot.accept(["1", "2"], () => {}, (err, { moduleId, dependencyId }) => {}); +module.hot.decline(); +module.hot.decline("a"); +module.hot.decline(["1", "2"]); +module.hot.dispose(() => {}); +module.hot.invalidate(); +module.hot.addStatusHandler((status) => {}); +module.hot.removeStatusHandler(() => {}); +module.hot.check(true).then(() => {}); +module.hot.apply({ + ignoreUnaccepted: true, + ignoreDeclined: true, + ignoreErrored: true, +}).then(() => {}); +module.hot.apply({ + ignoreUnaccepted: true, + ignoreDeclined: true, + ignoreErrored: true, + onDeclined: (event) => { console.log(event.moduleId) }, +}).then(() => {}); +module.hot.apply().then(() => {}); diff --git a/test/typesCases/meta/index.ts b/test/typesCases/meta/index.ts new file mode 100644 index 00000000000..baaaeb3ce1e --- /dev/null +++ b/test/typesCases/meta/index.ts @@ -0,0 +1,3 @@ +import.meta.url; +import.meta.webpack; +import.meta.webpackHot.accept("a"); diff --git a/test/walkCssTokens.unittest.js b/test/walkCssTokens.unittest.js new file mode 100644 index 00000000000..79523ba1100 --- /dev/null +++ b/test/walkCssTokens.unittest.js @@ -0,0 +1,87 @@ +const fs = require("fs"); +const path = require("path"); +const walkCssTokens = require("../lib/css/walkCssTokens"); + +describe("walkCssTokens", () => { + const test = (name, content, fn) => { + it(`should parse ${name}`, () => { + const results = []; + walkCssTokens(content, 0, { + comment: (input, s, e) => { + results.push(["comment", input.slice(s, e)]); + return e; + }, + url: (input, s, e, cs, ce) => { + results.push(["url", input.slice(s, e), input.slice(cs, ce)]); + return e; + }, + leftCurlyBracket: (input, s, e) => { + results.push(["leftCurlyBracket", input.slice(s, e)]); + return e; + }, + rightCurlyBracket: (input, s, e) => { + results.push(["rightCurlyBracket", input.slice(s, e)]); + return e; + }, + leftParenthesis: (input, s, e) => { + results.push(["leftParenthesis", input.slice(s, e)]); + return e; + }, + rightParenthesis: (input, s, e) => { + results.push(["rightParenthesis", input.slice(s, e)]); + return e; + }, + semicolon: (input, s, e) => { + results.push(["semicolon", input.slice(s, e)]); + return e; + }, + comma: (input, s, e) => { + results.push(["comma", input.slice(s, e)]); + return e; + }, + atKeyword: (input, s, e) => { + results.push(["atKeyword", input.slice(s, e)]); + return e; + }, + colon: (input, s, e) => { + results.push(["colon", input.slice(s, e)]); + return e; + }, + delim: (input, s, e) => { + results.push(["delim", input.slice(s, e)]); + return e; + }, + identifier: (input, s, e) => { + results.push(["identifier", input.slice(s, e)]); + return e; + }, + hash: (input, s, e, isID) => { + results.push(["hash", input.slice(s, e), isID]); + return e; + }, + string: (input, s, e) => { + results.push(["string", input.slice(s, e)]); + return e; + }, + function: (input, s, e) => { + results.push(["function", input.slice(s, e)]); + return e; + } + }); + fn(expect(results)); + }); + }; + + const casesPath = path.resolve(__dirname, "./configCases/css/parsing/cases"); + const tests = fs + .readdirSync(casesPath) + .filter(test => /\.css/.test(test)) + .map(item => [ + item, + fs.readFileSync(path.resolve(casesPath, item), "utf-8") + ]); + + for (const [name, code] of tests) { + test(name, code, e => e.toMatchSnapshot()); + } +}); diff --git a/test/watchCases/cache/add-defines/0/a.js b/test/watchCases/cache/add-defines/0/a.js new file mode 100644 index 00000000000..60b7ed0ba82 --- /dev/null +++ b/test/watchCases/cache/add-defines/0/a.js @@ -0,0 +1 @@ +export default [DEFINE.A, RUN]; diff --git a/test/watchCases/cache/add-defines/0/b.js b/test/watchCases/cache/add-defines/0/b.js new file mode 100644 index 00000000000..5b3a01604b1 --- /dev/null +++ b/test/watchCases/cache/add-defines/0/b.js @@ -0,0 +1 @@ +export default [DEFINE.B, RUN]; diff --git a/test/watchCases/cache/add-defines/0/c.js b/test/watchCases/cache/add-defines/0/c.js new file mode 100644 index 00000000000..06992193032 --- /dev/null +++ b/test/watchCases/cache/add-defines/0/c.js @@ -0,0 +1 @@ +export default [DEFINE.C, RUN]; diff --git a/test/watchCases/cache/add-defines/0/index.js b/test/watchCases/cache/add-defines/0/index.js new file mode 100644 index 00000000000..9622448ff5c --- /dev/null +++ b/test/watchCases/cache/add-defines/0/index.js @@ -0,0 +1,9 @@ +import a from "./a"; +import b from "./b"; +import c from "./c"; + +it("should invalidate modules when properties are added/removed from the DefinePlugin", () => { + expect(a).toEqual([0, 0]); + expect(b).toEqual([2, 0]); + expect(c).toEqual([undefined, 0]); +}); diff --git a/test/watchCases/cache/add-defines/1/index.js b/test/watchCases/cache/add-defines/1/index.js new file mode 100644 index 00000000000..ea010d63d3c --- /dev/null +++ b/test/watchCases/cache/add-defines/1/index.js @@ -0,0 +1,9 @@ +import a from "./a"; +import b from "./b"; +import c from "./c"; + +it("should invalidate modules when properties are added/removed from the DefinePlugin", () => { + expect(a).toEqual([1, 1]); + expect(b).toEqual([2, 0]); + expect(c).toEqual([undefined, 0]); +}); diff --git a/test/watchCases/cache/add-defines/2/index.js b/test/watchCases/cache/add-defines/2/index.js new file mode 100644 index 00000000000..56d9d352569 --- /dev/null +++ b/test/watchCases/cache/add-defines/2/index.js @@ -0,0 +1,9 @@ +import a from "./a"; +import b from "./b"; +import c from "./c"; + +it("should invalidate modules when properties are added/removed from the DefinePlugin", () => { + expect(a).toEqual([1, 2]); + expect(b).toEqual([2, 2]); + expect(c).toEqual([3, 2]); +}); diff --git a/test/watchCases/cache/add-defines/3/index.js b/test/watchCases/cache/add-defines/3/index.js new file mode 100644 index 00000000000..21baf7c1611 --- /dev/null +++ b/test/watchCases/cache/add-defines/3/index.js @@ -0,0 +1,9 @@ +import a from "./a"; +import b from "./b"; +import c from "./c"; + +it("should invalidate modules when properties are added/removed from the DefinePlugin", () => { + expect(a).toEqual([1, 3]); + expect(b).toEqual([undefined, 3]); + expect(c).toEqual([3, 3]); +}); diff --git a/test/watchCases/cache/add-defines/test.filter.js b/test/watchCases/cache/add-defines/test.filter.js new file mode 100644 index 00000000000..87860f28c19 --- /dev/null +++ b/test/watchCases/cache/add-defines/test.filter.js @@ -0,0 +1,3 @@ +module.exports = function (config) { + return !(config.experiments && config.experiments.cacheUnaffected); +}; diff --git a/test/watchCases/cache/add-defines/webpack.config.js b/test/watchCases/cache/add-defines/webpack.config.js new file mode 100644 index 00000000000..9f2333a888b --- /dev/null +++ b/test/watchCases/cache/add-defines/webpack.config.js @@ -0,0 +1,70 @@ +/** @typedef {import("../../../../").WebpackPluginInstance} WebpackPluginInstance */ + +const { DefinePlugin } = require("../../../../"); +const currentWatchStep = require("../../../helpers/currentWatchStep"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + cache: { + type: "memory", + cacheUnaffected: false + }, + plugins: [ + compiler => { + const base = { + DEFINE: "{}", + RUN: DefinePlugin.runtimeValue( + () => Number(currentWatchStep.step || 0), + [] + ) + }; + const defines = [ + { + ...base, + "DEFINE.A": 0, + "DEFINE.B": 2 + }, + { + // change + ...base, + "DEFINE.A": 1, + "DEFINE.B": 2 + }, + { + // add + ...base, + "DEFINE.A": 1, + "DEFINE.B": 2, + "DEFINE.C": 3 + }, + { + // remove + ...base, + "DEFINE.A": 1, + "DEFINE.C": 3 + } + ]; + compiler.hooks.compilation.tap("webpack.config", (...args) => { + const plugin = new DefinePlugin( + defines[Number(currentWatchStep.step || 0)] + ); + plugin.apply( + /** @type {EXPECTED_ANY} */ + ({ + hooks: { + compilation: { + /** + * @param {string} name name + * @param {EXPECTED_FUNCTION} fn fn + */ + tap: (name, fn) => { + fn(...args); + } + } + } + }) + ); + }); + } + ] +}; diff --git a/test/watchCases/cache/asset-concat/0/images/file.jpg b/test/watchCases/cache/asset-concat/0/images/file.jpg new file mode 100644 index 00000000000..fe5c6eefa79 Binary files /dev/null and b/test/watchCases/cache/asset-concat/0/images/file.jpg differ diff --git a/test/watchCases/cache/asset-concat/0/images/file.png b/test/watchCases/cache/asset-concat/0/images/file.png new file mode 100644 index 00000000000..fb53b9dedd3 Binary files /dev/null and b/test/watchCases/cache/asset-concat/0/images/file.png differ diff --git a/test/watchCases/cache/asset-concat/0/images/file.svg b/test/watchCases/cache/asset-concat/0/images/file.svg new file mode 100644 index 00000000000..d7b7e40b4f8 --- /dev/null +++ b/test/watchCases/cache/asset-concat/0/images/file.svg @@ -0,0 +1 @@ +icon-square-small diff --git a/test/watchCases/cache/asset-concat/0/index.js b/test/watchCases/cache/asset-concat/0/index.js new file mode 100644 index 00000000000..e753a8de9d0 --- /dev/null +++ b/test/watchCases/cache/asset-concat/0/index.js @@ -0,0 +1,9 @@ +import png from "./images/file.png"; +import svg from "./images/file.svg"; +import jpg from "./images/file.jpg"; + +it("should generate assets correctly", () => { + expect(png).toMatch(/^data:image\/png;base64,/); + expect(svg).toMatch(/^data:image\/svg\+xml;base64,/); + expect(jpg).toMatch(/\.jpg$/); +}); diff --git a/test/watchCases/cache/asset-concat/1/index.js b/test/watchCases/cache/asset-concat/1/index.js new file mode 100644 index 00000000000..afa409e3820 --- /dev/null +++ b/test/watchCases/cache/asset-concat/1/index.js @@ -0,0 +1,9 @@ +it("should generate assets correctly", () => { + const png = require("./images/file.png"); + const svg = require("./images/file.svg"); + const jpg = require("./images/file.jpg"); + + expect(png).toMatch(/^data:image\/png;base64,/); + expect(svg).toMatch(/^data:image\/svg\+xml;base64,/); + expect(jpg).toMatch(/\.jpg$/); +}); diff --git a/test/watchCases/cache/asset-concat/test.filter.js b/test/watchCases/cache/asset-concat/test.filter.js new file mode 100644 index 00000000000..87860f28c19 --- /dev/null +++ b/test/watchCases/cache/asset-concat/test.filter.js @@ -0,0 +1,3 @@ +module.exports = function (config) { + return !(config.experiments && config.experiments.cacheUnaffected); +}; diff --git a/test/watchCases/cache/asset-concat/webpack.config.js b/test/watchCases/cache/asset-concat/webpack.config.js new file mode 100644 index 00000000000..b2a5d4c00bc --- /dev/null +++ b/test/watchCases/cache/asset-concat/webpack.config.js @@ -0,0 +1,26 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + cache: { + type: "memory" + }, + module: { + rules: [ + { + test: /\.png$/, + type: "asset/inline" + }, + { + test: /\.jpg$/, + type: "asset/resource" + }, + { + test: /\.svg$/, + type: "asset" + } + ] + }, + optimization: { + concatenateModules: true + } +}; diff --git a/test/watchCases/cache/asset-modules/0/file.txt b/test/watchCases/cache/asset-modules/0/file.txt new file mode 100644 index 00000000000..557db03de99 --- /dev/null +++ b/test/watchCases/cache/asset-modules/0/file.txt @@ -0,0 +1 @@ +Hello World diff --git a/test/watchCases/cache/asset-modules/0/index.js b/test/watchCases/cache/asset-modules/0/index.js new file mode 100644 index 00000000000..a08393ec3ce --- /dev/null +++ b/test/watchCases/cache/asset-modules/0/index.js @@ -0,0 +1,19 @@ +import { stat } from "fs"; +import { promisify } from "util"; + +it("should return a valid url when cached", async () => { + const url = new URL("file.txt", import.meta.url); + expect(url.pathname).toMatch(/\.txt$/); + expect((await promisify(stat)(url)).isFile()).toBe(true); +}); + +it("should return a valid url when modified", async () => { + const url = new URL("other.txt", import.meta.url); + expect(url.pathname).toMatch(/\.txt$/); + expect((await promisify(stat)(url)).isFile()).toBe(true); +}); + +it("should not emit undefined files", () => { + expect(STATS_JSON.assets.map(a => a.name)).not.toContain(undefined); + expect(STATS_JSON.assets.map(a => a.name)).not.toContain("undefined"); +}); diff --git a/test/watchCases/cache/asset-modules/0/other.txt b/test/watchCases/cache/asset-modules/0/other.txt new file mode 100644 index 00000000000..3ee38493646 --- /dev/null +++ b/test/watchCases/cache/asset-modules/0/other.txt @@ -0,0 +1 @@ +Hello World 2 diff --git a/test/watchCases/cache/asset-modules/1/file.txt b/test/watchCases/cache/asset-modules/1/file.txt new file mode 100644 index 00000000000..557db03de99 --- /dev/null +++ b/test/watchCases/cache/asset-modules/1/file.txt @@ -0,0 +1 @@ +Hello World diff --git a/test/watchCases/cache/asset-modules/1/other.txt b/test/watchCases/cache/asset-modules/1/other.txt new file mode 100644 index 00000000000..22c0dee49b8 --- /dev/null +++ b/test/watchCases/cache/asset-modules/1/other.txt @@ -0,0 +1 @@ +Hello World 3 diff --git a/test/watchCases/cache/asset-modules/2/index.js b/test/watchCases/cache/asset-modules/2/index.js new file mode 100644 index 00000000000..12552c1b0c2 --- /dev/null +++ b/test/watchCases/cache/asset-modules/2/index.js @@ -0,0 +1,5 @@ +it("should not emit files", () => { + expect(STATS_JSON.assets.map(a => a.name)).not.toContainEqual( + expect.stringMatching(/\.txt$/) + ); +}); diff --git a/test/watchCases/cache/asset-modules/3/index.js b/test/watchCases/cache/asset-modules/3/index.js new file mode 100644 index 00000000000..a08393ec3ce --- /dev/null +++ b/test/watchCases/cache/asset-modules/3/index.js @@ -0,0 +1,19 @@ +import { stat } from "fs"; +import { promisify } from "util"; + +it("should return a valid url when cached", async () => { + const url = new URL("file.txt", import.meta.url); + expect(url.pathname).toMatch(/\.txt$/); + expect((await promisify(stat)(url)).isFile()).toBe(true); +}); + +it("should return a valid url when modified", async () => { + const url = new URL("other.txt", import.meta.url); + expect(url.pathname).toMatch(/\.txt$/); + expect((await promisify(stat)(url)).isFile()).toBe(true); +}); + +it("should not emit undefined files", () => { + expect(STATS_JSON.assets.map(a => a.name)).not.toContain(undefined); + expect(STATS_JSON.assets.map(a => a.name)).not.toContain("undefined"); +}); diff --git a/test/watchCases/cache/change-dep-while-detatched/0/index.js b/test/watchCases/cache/change-dep-while-detatched/0/index.js new file mode 100644 index 00000000000..4b619873ee5 --- /dev/null +++ b/test/watchCases/cache/change-dep-while-detatched/0/index.js @@ -0,0 +1,7 @@ +import value from "./module"; +import value2 from "./unrelated"; + +it("should detect changes to dependencies while module is detached", () => { + expect(value).toBe(42); + expect(value2).toBe(42); +}); diff --git a/test/watchCases/cache/change-dep-while-detatched/0/module.js b/test/watchCases/cache/change-dep-while-detatched/0/module.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/watchCases/cache/change-dep-while-detatched/0/module.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/watchCases/cache/change-dep-while-detatched/0/unrelated.js b/test/watchCases/cache/change-dep-while-detatched/0/unrelated.js new file mode 100644 index 00000000000..f79b64f9e4d --- /dev/null +++ b/test/watchCases/cache/change-dep-while-detatched/0/unrelated.js @@ -0,0 +1 @@ +export { default } from "./module"; diff --git a/test/watchCases/cache/change-dep-while-detatched/1/index.js b/test/watchCases/cache/change-dep-while-detatched/1/index.js new file mode 100644 index 00000000000..b6f2159fce3 --- /dev/null +++ b/test/watchCases/cache/change-dep-while-detatched/1/index.js @@ -0,0 +1,5 @@ +import value from "./module"; + +it("should detect changes to dependencies while module is detached", () => { + expect(value).toBe(42); +}); diff --git a/test/watchCases/cache/change-dep-while-detatched/1/module.js b/test/watchCases/cache/change-dep-while-detatched/1/module.js new file mode 100644 index 00000000000..888cae37af9 --- /dev/null +++ b/test/watchCases/cache/change-dep-while-detatched/1/module.js @@ -0,0 +1 @@ +module.exports = 42; diff --git a/test/watchCases/cache/change-dep-while-detatched/2/index.js b/test/watchCases/cache/change-dep-while-detatched/2/index.js new file mode 100644 index 00000000000..4b619873ee5 --- /dev/null +++ b/test/watchCases/cache/change-dep-while-detatched/2/index.js @@ -0,0 +1,7 @@ +import value from "./module"; +import value2 from "./unrelated"; + +it("should detect changes to dependencies while module is detached", () => { + expect(value).toBe(42); + expect(value2).toBe(42); +}); diff --git a/test/watchCases/cache/change-dep-while-detatched/webpack.config.js b/test/watchCases/cache/change-dep-while-detatched/webpack.config.js new file mode 100644 index 00000000000..009c97a1f16 --- /dev/null +++ b/test/watchCases/cache/change-dep-while-detatched/webpack.config.js @@ -0,0 +1,10 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + cache: { + type: "memory" + }, + optimization: { + sideEffects: false + } +}; diff --git a/test/watchCases/cache/changing-module-id/0/index.js b/test/watchCases/cache/changing-module-id/0/index.js new file mode 100644 index 00000000000..b933cd1cd1d --- /dev/null +++ b/test/watchCases/cache/changing-module-id/0/index.js @@ -0,0 +1,10 @@ +import value from "./module"; +import value2 from "./unrelated"; +import value3 from "./other-module"; + +it("should work when modules change ids", async () => { + expect(value).toBe(42); + expect(value2).toBe(42); + expect(value3).toBe(42 + +WATCH_STEP); + expect(import("./module?async")).resolves.toEqual(nsObj({ default: 42 })); +}); diff --git a/test/watchCases/cache/changing-module-id/0/module.js b/test/watchCases/cache/changing-module-id/0/module.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/watchCases/cache/changing-module-id/0/module.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/watchCases/cache/changing-module-id/0/other-module.js b/test/watchCases/cache/changing-module-id/0/other-module.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/watchCases/cache/changing-module-id/0/other-module.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/watchCases/cache/changing-module-id/0/unrelated.js b/test/watchCases/cache/changing-module-id/0/unrelated.js new file mode 100644 index 00000000000..3b44be3ed19 --- /dev/null +++ b/test/watchCases/cache/changing-module-id/0/unrelated.js @@ -0,0 +1,2 @@ +export { default } from "./module"; +if (Math.random() < 0) import("./module?async"); diff --git a/test/watchCases/cache/changing-module-id/1/other-layer.js b/test/watchCases/cache/changing-module-id/1/other-layer.js new file mode 100644 index 00000000000..c29038c754b --- /dev/null +++ b/test/watchCases/cache/changing-module-id/1/other-layer.js @@ -0,0 +1,2 @@ +export { default } from "./module"; +import "./module?async"; diff --git a/test/watchCases/cache/changing-module-id/1/other-module.js b/test/watchCases/cache/changing-module-id/1/other-module.js new file mode 100644 index 00000000000..fb7b0b97d1b --- /dev/null +++ b/test/watchCases/cache/changing-module-id/1/other-module.js @@ -0,0 +1,3 @@ +import value from "./other-layer"; + +export default value + 1; diff --git a/test/watchCases/cache/changing-module-id/2/other-module.js b/test/watchCases/cache/changing-module-id/2/other-module.js new file mode 100644 index 00000000000..8940fd86d41 --- /dev/null +++ b/test/watchCases/cache/changing-module-id/2/other-module.js @@ -0,0 +1 @@ +export default 44; diff --git a/test/watchCases/cache/changing-module-id/webpack.config.js b/test/watchCases/cache/changing-module-id/webpack.config.js new file mode 100644 index 00000000000..04720f340aa --- /dev/null +++ b/test/watchCases/cache/changing-module-id/webpack.config.js @@ -0,0 +1,23 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + cache: { + type: "memory" + }, + optimization: { + sideEffects: false, + providedExports: false + }, + module: { + rules: [ + { + test: /other-layer/, + layer: "other-layer" + } + ] + }, + experiments: { + cacheUnaffected: true, + layers: true + } +}; diff --git a/test/watchCases/cache/child-compilation-cache/0/index.js b/test/watchCases/cache/child-compilation-cache/0/index.js index 20702978cd2..147b0659af6 100644 --- a/test/watchCases/cache/child-compilation-cache/0/index.js +++ b/test/watchCases/cache/child-compilation-cache/0/index.js @@ -1,14 +1,14 @@ -it("should use correct caches in compilation and child compilations", function() { +it("should use correct caches in compilation and child compilations", function () { var x = require("./report-cache-counters-loader!./changing-file"); - switch(WATCH_STEP) { + switch (WATCH_STEP) { case "0": - expect(x).toEqual([1, 1]); + expect(x).toEqual(["", 1, "my-compiler 123|0|", 1]); break; case "1": - expect(x).toEqual([2, 1]); + expect(x).toEqual(["", 2, "my-compiler 456|0|", 1]); break; case "2": - expect(x).toEqual([3, 2]); + expect(x).toEqual(["", 3, "my-compiler 123|0|", 2]); break; default: throw new Error("Not handled step"); diff --git a/test/watchCases/cache/child-compilation-cache/0/report-cache-counters-loader.js b/test/watchCases/cache/child-compilation-cache/0/report-cache-counters-loader.js index 5bdddc6059e..d1decabc839 100644 --- a/test/watchCases/cache/child-compilation-cache/0/report-cache-counters-loader.js +++ b/test/watchCases/cache/child-compilation-cache/0/report-cache-counters-loader.js @@ -1,21 +1,67 @@ +/** @typedef {import("../../../../../").Compiler} Compiler */ +/** @typedef {import("../../../../../").Compilation} Compilation */ + var map = new Map(); var currentWatchStepModule = require("../../../../helpers/currentWatchStep"); -module.exports = function(source) { - if(map.has(currentWatchStepModule.step)) return map.get(currentWatchStepModule.step); - this._compilation.cache.counter = (this._compilation.cache.counter || 0) + 1; +/** @type {WeakMap>} */ +var cacheMap = new WeakMap(); - var childCompiler = this._compilation.createChildCompiler("my-compiler " + source.trim(), { - filename: "test" - }); +/** + * @param {Compiler} associate associate + * @param {string} path path + * @returns {{ counter: number }} result + */ +const getCache = (associate, path) => { + let o = cacheMap.get(associate); + if (o === undefined) { + o = new Map(); + cacheMap.set(associate, o); + } + let c = o.get(path); + if (c === undefined) { + c = { counter: 0 }; + o.set(path, c); + } + return c; +}; + +/** @type {import("../../../../../").LoaderDefinition} */ +module.exports = function (source) { + if (map.has(currentWatchStepModule.step)) + return map.get(currentWatchStepModule.step); + + const compiler = /** @type {Compiler} */ (this._compiler); + const compilation = /** @type {Compilation} */ (this._compilation); + + const compilationCache = getCache( + compiler.root, + compilation.compilerPath + ); + compilationCache.counter++; + + var childCompiler = compilation.createChildCompiler( + "my-compiler " + source.trim(), + { + filename: "test" + } + ); var callback = this.async(); - childCompiler.runAsChild((err, entries, compilation) => { - if(err) return callback(err); + childCompiler.runAsChild((err, entries, _compilation) => { + if (err) return callback(err); + + const compilation = /** @type {Compilation} */ (_compilation); - var childCache = compilation.cache; - childCache.counter = (childCache.counter || 0) + 1; + const childCache = getCache(compiler.root, compilation.compilerPath); + childCache.counter++; - var result = `module.exports = [${this._compilation.cache.counter}, ${childCache.counter}]; // ${source}`; + var result = `module.exports = ${JSON.stringify([ + /** @type {Compilation} */ + (this._compilation).compilerPath, + compilationCache.counter, + compilation.compilerPath, + childCache.counter + ])}; // ${source}`; map.set(currentWatchStepModule.step, result); callback(null, result); }); diff --git a/test/watchCases/cache/emit-when-clean/0/file.txt b/test/watchCases/cache/emit-when-clean/0/file.txt new file mode 100644 index 00000000000..557db03de99 --- /dev/null +++ b/test/watchCases/cache/emit-when-clean/0/file.txt @@ -0,0 +1 @@ +Hello World diff --git a/test/watchCases/cache/emit-when-clean/0/index.js b/test/watchCases/cache/emit-when-clean/0/index.js new file mode 100644 index 00000000000..c67fe3ba479 --- /dev/null +++ b/test/watchCases/cache/emit-when-clean/0/index.js @@ -0,0 +1,14 @@ +import { stat } from "fs"; +import { promisify } from "util"; + +it("should return a valid url when cached", async () => { + const url = new URL("file.txt", import.meta.url); + expect(url.pathname).toMatch(/\.txt$/); + expect((await promisify(stat)(url)).isFile()).toBe(true); +}); + +it("should return a valid url when modified", async () => { + const url = new URL("other.txt", import.meta.url); + expect(url.pathname).toMatch(/\.txt$/); + expect((await promisify(stat)(url)).isFile()).toBe(true); +}); diff --git a/test/watchCases/cache/emit-when-clean/0/other.txt b/test/watchCases/cache/emit-when-clean/0/other.txt new file mode 100644 index 00000000000..3ee38493646 --- /dev/null +++ b/test/watchCases/cache/emit-when-clean/0/other.txt @@ -0,0 +1 @@ +Hello World 2 diff --git a/test/watchCases/cache/emit-when-clean/1/file.txt b/test/watchCases/cache/emit-when-clean/1/file.txt new file mode 100644 index 00000000000..557db03de99 --- /dev/null +++ b/test/watchCases/cache/emit-when-clean/1/file.txt @@ -0,0 +1 @@ +Hello World diff --git a/test/watchCases/cache/emit-when-clean/1/other.txt b/test/watchCases/cache/emit-when-clean/1/other.txt new file mode 100644 index 00000000000..22c0dee49b8 --- /dev/null +++ b/test/watchCases/cache/emit-when-clean/1/other.txt @@ -0,0 +1 @@ +Hello World 3 diff --git a/test/watchCases/cache/emit-when-clean/2/index.js b/test/watchCases/cache/emit-when-clean/2/index.js new file mode 100644 index 00000000000..12552c1b0c2 --- /dev/null +++ b/test/watchCases/cache/emit-when-clean/2/index.js @@ -0,0 +1,5 @@ +it("should not emit files", () => { + expect(STATS_JSON.assets.map(a => a.name)).not.toContainEqual( + expect.stringMatching(/\.txt$/) + ); +}); diff --git a/test/watchCases/cache/emit-when-clean/3/index.js b/test/watchCases/cache/emit-when-clean/3/index.js new file mode 100644 index 00000000000..b3584ac0a20 --- /dev/null +++ b/test/watchCases/cache/emit-when-clean/3/index.js @@ -0,0 +1,22 @@ +import { stat } from "fs"; +import { promisify } from "util"; + +it("should return a valid url when cached", async () => { + const url = new URL("file.txt", import.meta.url); + expect(url.pathname).toMatch(/\.txt$/); + expect((await promisify(stat)(url)).isFile()).toBe(true); +}); + +it("should return a valid url when modified", async () => { + const url = new URL("other.txt", import.meta.url); + expect(url.pathname).toMatch(/\.txt$/); + expect((await promisify(stat)(url)).isFile()).toBe(true); +}); + +it("should not rewrite files and only compare them", () => { + for (const asset of STATS_JSON.assets) { + if (asset.name.endsWith(".txt")) { + expect(asset).toHaveProperty("emitted", true); + } + } +}); diff --git a/test/watchCases/cache/emit-when-clean/webpack.config.js b/test/watchCases/cache/emit-when-clean/webpack.config.js new file mode 100644 index 00000000000..36b900e3e16 --- /dev/null +++ b/test/watchCases/cache/emit-when-clean/webpack.config.js @@ -0,0 +1,5 @@ +module.exports = { + output: { + clean: true + } +}; diff --git a/test/watchCases/cache/emit-without-clean/0/file.txt b/test/watchCases/cache/emit-without-clean/0/file.txt new file mode 100644 index 00000000000..557db03de99 --- /dev/null +++ b/test/watchCases/cache/emit-without-clean/0/file.txt @@ -0,0 +1 @@ +Hello World diff --git a/test/watchCases/cache/emit-without-clean/0/index.js b/test/watchCases/cache/emit-without-clean/0/index.js new file mode 100644 index 00000000000..c67fe3ba479 --- /dev/null +++ b/test/watchCases/cache/emit-without-clean/0/index.js @@ -0,0 +1,14 @@ +import { stat } from "fs"; +import { promisify } from "util"; + +it("should return a valid url when cached", async () => { + const url = new URL("file.txt", import.meta.url); + expect(url.pathname).toMatch(/\.txt$/); + expect((await promisify(stat)(url)).isFile()).toBe(true); +}); + +it("should return a valid url when modified", async () => { + const url = new URL("other.txt", import.meta.url); + expect(url.pathname).toMatch(/\.txt$/); + expect((await promisify(stat)(url)).isFile()).toBe(true); +}); diff --git a/test/watchCases/cache/emit-without-clean/0/other.txt b/test/watchCases/cache/emit-without-clean/0/other.txt new file mode 100644 index 00000000000..3ee38493646 --- /dev/null +++ b/test/watchCases/cache/emit-without-clean/0/other.txt @@ -0,0 +1 @@ +Hello World 2 diff --git a/test/watchCases/cache/emit-without-clean/1/file.txt b/test/watchCases/cache/emit-without-clean/1/file.txt new file mode 100644 index 00000000000..557db03de99 --- /dev/null +++ b/test/watchCases/cache/emit-without-clean/1/file.txt @@ -0,0 +1 @@ +Hello World diff --git a/test/watchCases/cache/emit-without-clean/1/other.txt b/test/watchCases/cache/emit-without-clean/1/other.txt new file mode 100644 index 00000000000..22c0dee49b8 --- /dev/null +++ b/test/watchCases/cache/emit-without-clean/1/other.txt @@ -0,0 +1 @@ +Hello World 3 diff --git a/test/watchCases/cache/emit-without-clean/2/index.js b/test/watchCases/cache/emit-without-clean/2/index.js new file mode 100644 index 00000000000..12552c1b0c2 --- /dev/null +++ b/test/watchCases/cache/emit-without-clean/2/index.js @@ -0,0 +1,5 @@ +it("should not emit files", () => { + expect(STATS_JSON.assets.map(a => a.name)).not.toContainEqual( + expect.stringMatching(/\.txt$/) + ); +}); diff --git a/test/watchCases/cache/emit-without-clean/3/index.js b/test/watchCases/cache/emit-without-clean/3/index.js new file mode 100644 index 00000000000..4e187404a34 --- /dev/null +++ b/test/watchCases/cache/emit-without-clean/3/index.js @@ -0,0 +1,22 @@ +import { stat } from "fs"; +import { promisify } from "util"; + +it("should return a valid url when cached", async () => { + const url = new URL("file.txt", import.meta.url); + expect(url.pathname).toMatch(/\.txt$/); + expect((await promisify(stat)(url)).isFile()).toBe(true); +}); + +it("should return a valid url when modified", async () => { + const url = new URL("other.txt", import.meta.url); + expect(url.pathname).toMatch(/\.txt$/); + expect((await promisify(stat)(url)).isFile()).toBe(true); +}); + +it("should not rewrite files and only compare them", () => { + for (const asset of STATS_JSON.assets) { + if (asset.name.endsWith(".txt")) { + expect(asset).toHaveProperty("cached", true); + } + } +}); diff --git a/test/watchCases/cache/emit-without-clean/webpack.config.js b/test/watchCases/cache/emit-without-clean/webpack.config.js new file mode 100644 index 00000000000..e1eaf59239c --- /dev/null +++ b/test/watchCases/cache/emit-without-clean/webpack.config.js @@ -0,0 +1,5 @@ +module.exports = { + output: { + clean: false + } +}; diff --git a/test/watchCases/cache/immutable/0/index.js b/test/watchCases/cache/immutable/0/index.js new file mode 100644 index 00000000000..cfb9f941213 --- /dev/null +++ b/test/watchCases/cache/immutable/0/index.js @@ -0,0 +1,3 @@ +it("should update the output file", () => { + expect(WATCH_STEP).toBe("0"); +}); diff --git a/test/watchCases/cache/immutable/1/index.js b/test/watchCases/cache/immutable/1/index.js new file mode 100644 index 00000000000..5c8a656fda4 --- /dev/null +++ b/test/watchCases/cache/immutable/1/index.js @@ -0,0 +1,3 @@ +it("should update the output file", () => { + expect(WATCH_STEP).toBe("1"); +}); diff --git a/test/watchCases/cache/immutable/webpack.config.js b/test/watchCases/cache/immutable/webpack.config.js new file mode 100644 index 00000000000..0925d384b06 --- /dev/null +++ b/test/watchCases/cache/immutable/webpack.config.js @@ -0,0 +1,10 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "production", + cache: { + type: "memory" + }, + output: { + filename: "bundle.js?[contenthash]" + } +}; diff --git a/test/watchCases/cache/loader-import-module-progress/0/a.generate-json.js b/test/watchCases/cache/loader-import-module-progress/0/a.generate-json.js new file mode 100644 index 00000000000..038edcdf962 --- /dev/null +++ b/test/watchCases/cache/loader-import-module-progress/0/a.generate-json.js @@ -0,0 +1,4 @@ +export const value = 42; +export * from "./imported.js"; +export { default as nested } from "./b.generate-json.js"; +export const random = Math.random(); diff --git a/test/watchCases/cache/loader-import-module-progress/0/b.generate-json.js b/test/watchCases/cache/loader-import-module-progress/0/b.generate-json.js new file mode 100644 index 00000000000..0f36d13b5b5 --- /dev/null +++ b/test/watchCases/cache/loader-import-module-progress/0/b.generate-json.js @@ -0,0 +1,2 @@ +export const value = 42; +export * from "./imported.js"; diff --git a/test/watchCases/cache/loader-import-module-progress/0/imported.js b/test/watchCases/cache/loader-import-module-progress/0/imported.js new file mode 100644 index 00000000000..75fab4cabd1 --- /dev/null +++ b/test/watchCases/cache/loader-import-module-progress/0/imported.js @@ -0,0 +1,2 @@ +export const a = "a"; +export const b = "b"; diff --git a/test/watchCases/cache/loader-import-module-progress/0/index.js b/test/watchCases/cache/loader-import-module-progress/0/index.js new file mode 100644 index 00000000000..e0bf61a09d2 --- /dev/null +++ b/test/watchCases/cache/loader-import-module-progress/0/index.js @@ -0,0 +1,16 @@ +import a from "./a.generate-json.js"; +import { value as unrelated } from "./unrelated"; + +it("should have to correct values and validate on change", () => { + const step = +WATCH_STEP; + expect(a.value).toBe(42); + expect(a.a).toBe("a"); + expect(a.nested.value).toBe(42); + expect(a.nested.a).toBe("a"); + expect(a.b).toBe("b"); + expect(a.nested.b).toBe("b"); + if (step !== 0) { + expect(STATE.random === a.random).toBe(step === 1); + } + STATE.random = a.random; +}); diff --git a/test/watchCases/cache/loader-import-module-progress/0/loader.js b/test/watchCases/cache/loader-import-module-progress/0/loader.js new file mode 100644 index 00000000000..fde06f26f49 --- /dev/null +++ b/test/watchCases/cache/loader-import-module-progress/0/loader.js @@ -0,0 +1,7 @@ +/** @type {import("../../../../../").PitchLoaderDefinitionFunction} */ +exports.pitch = async function (remaining) { + const result = await this.importModule( + `${this.resourcePath}.webpack[javascript/auto]!=!${remaining}` + ); + return JSON.stringify(result, null, 2); +}; diff --git a/test/watchCases/cache/loader-import-module-progress/0/unrelated.js b/test/watchCases/cache/loader-import-module-progress/0/unrelated.js new file mode 100644 index 00000000000..46d3ca8c61f --- /dev/null +++ b/test/watchCases/cache/loader-import-module-progress/0/unrelated.js @@ -0,0 +1 @@ +export const value = 42; diff --git a/test/watchCases/cache/loader-import-module-progress/1/unrelated.js b/test/watchCases/cache/loader-import-module-progress/1/unrelated.js new file mode 100644 index 00000000000..9ea3faa10bc --- /dev/null +++ b/test/watchCases/cache/loader-import-module-progress/1/unrelated.js @@ -0,0 +1 @@ +export const value = 24; diff --git a/test/watchCases/cache/loader-import-module-progress/webpack.config.js b/test/watchCases/cache/loader-import-module-progress/webpack.config.js new file mode 100644 index 00000000000..93b7fc7f8ae --- /dev/null +++ b/test/watchCases/cache/loader-import-module-progress/webpack.config.js @@ -0,0 +1,43 @@ +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + cache: { + type: "filesystem" + }, + module: { + rules: [ + { + test: /\.generate-json\.js$/, + use: "./loader", + type: "json" + } + ] + }, + plugins: [ + new webpack.ProgressPlugin(), + { + apply(compiler) { + compiler.hooks.done.tapPromise("CacheTest", async () => { + const cache = compiler + .getCache("ProgressPlugin") + .getItemCache("counts", null); + + const data = await cache.getPromise(); + + if (data.modulesCount !== 3) { + throw new Error( + `Wrong cached value of \`ProgressPlugin.modulesCount\` - ${data.modulesCount}, expect 3` + ); + } + + if (data.dependenciesCount !== 3) { + throw new Error( + `Wrong cached value of \`ProgressPlugin.dependenciesCount\` - ${data.dependenciesCount}, expect 3` + ); + } + }); + } + } + ] +}; diff --git a/test/watchCases/cache/loader-import-module/0/a.generate-json.js b/test/watchCases/cache/loader-import-module/0/a.generate-json.js new file mode 100644 index 00000000000..038edcdf962 --- /dev/null +++ b/test/watchCases/cache/loader-import-module/0/a.generate-json.js @@ -0,0 +1,4 @@ +export const value = 42; +export * from "./imported.js"; +export { default as nested } from "./b.generate-json.js"; +export const random = Math.random(); diff --git a/test/watchCases/cache/loader-import-module/0/b.generate-json.js b/test/watchCases/cache/loader-import-module/0/b.generate-json.js new file mode 100644 index 00000000000..0f36d13b5b5 --- /dev/null +++ b/test/watchCases/cache/loader-import-module/0/b.generate-json.js @@ -0,0 +1,2 @@ +export const value = 42; +export * from "./imported.js"; diff --git a/test/watchCases/cache/loader-import-module/0/imported.js b/test/watchCases/cache/loader-import-module/0/imported.js new file mode 100644 index 00000000000..75fab4cabd1 --- /dev/null +++ b/test/watchCases/cache/loader-import-module/0/imported.js @@ -0,0 +1,2 @@ +export const a = "a"; +export const b = "b"; diff --git a/test/watchCases/cache/loader-import-module/0/index.js b/test/watchCases/cache/loader-import-module/0/index.js new file mode 100644 index 00000000000..39f187adc49 --- /dev/null +++ b/test/watchCases/cache/loader-import-module/0/index.js @@ -0,0 +1,18 @@ +import a from "./a.generate-json.js"; +import { value as unrelated } from "./unrelated"; + +it("should have to correct values and validate on change", () => { + const step = +WATCH_STEP; + expect(a.value).toBe(42); + expect(a.a).toBe("a"); + expect(a.nested.value).toBe(step < 3 ? 42 : 24); + expect(a.nested.a).toBe(step < 3 ? "a" : undefined); + expect(a.b).toBe(step < 1 ? "b" : undefined); + expect(a.nested.b).toBe(step < 1 ? "b" : undefined); + expect(a.c).toBe(step < 1 ? undefined : "c"); + expect(a.nested.c).toBe(step < 1 || step >= 3 ? undefined : "c"); + if (step !== 0) { + expect(STATE.random === a.random).toBe(step === 2); + } + STATE.random = a.random; +}); diff --git a/test/watchCases/cache/loader-import-module/0/loader.js b/test/watchCases/cache/loader-import-module/0/loader.js new file mode 100644 index 00000000000..fde06f26f49 --- /dev/null +++ b/test/watchCases/cache/loader-import-module/0/loader.js @@ -0,0 +1,7 @@ +/** @type {import("../../../../../").PitchLoaderDefinitionFunction} */ +exports.pitch = async function (remaining) { + const result = await this.importModule( + `${this.resourcePath}.webpack[javascript/auto]!=!${remaining}` + ); + return JSON.stringify(result, null, 2); +}; diff --git a/test/watchCases/cache/loader-import-module/0/unrelated.js b/test/watchCases/cache/loader-import-module/0/unrelated.js new file mode 100644 index 00000000000..46d3ca8c61f --- /dev/null +++ b/test/watchCases/cache/loader-import-module/0/unrelated.js @@ -0,0 +1 @@ +export const value = 42; diff --git a/test/watchCases/cache/loader-import-module/1/imported.js b/test/watchCases/cache/loader-import-module/1/imported.js new file mode 100644 index 00000000000..8124f2dd3b6 --- /dev/null +++ b/test/watchCases/cache/loader-import-module/1/imported.js @@ -0,0 +1,2 @@ +export const a = "a"; +export const c = "c"; diff --git a/test/watchCases/cache/loader-import-module/2/unrelated.js b/test/watchCases/cache/loader-import-module/2/unrelated.js new file mode 100644 index 00000000000..9ea3faa10bc --- /dev/null +++ b/test/watchCases/cache/loader-import-module/2/unrelated.js @@ -0,0 +1 @@ +export const value = 24; diff --git a/test/watchCases/cache/loader-import-module/3/b.generate-json.js b/test/watchCases/cache/loader-import-module/3/b.generate-json.js new file mode 100644 index 00000000000..9ea3faa10bc --- /dev/null +++ b/test/watchCases/cache/loader-import-module/3/b.generate-json.js @@ -0,0 +1 @@ +export const value = 24; diff --git a/test/watchCases/cache/loader-import-module/webpack.config.js b/test/watchCases/cache/loader-import-module/webpack.config.js new file mode 100644 index 00000000000..2a0a5ded08d --- /dev/null +++ b/test/watchCases/cache/loader-import-module/webpack.config.js @@ -0,0 +1,12 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + module: { + rules: [ + { + test: /\.generate-json\.js$/, + use: "./loader", + type: "json" + } + ] + } +}; diff --git a/test/watchCases/cache/loader-load-module-progress/0/imported.js b/test/watchCases/cache/loader-load-module-progress/0/imported.js new file mode 100644 index 00000000000..75fab4cabd1 --- /dev/null +++ b/test/watchCases/cache/loader-load-module-progress/0/imported.js @@ -0,0 +1,2 @@ +export const a = "a"; +export const b = "b"; diff --git a/test/watchCases/cache/loader-load-module-progress/0/index.js b/test/watchCases/cache/loader-load-module-progress/0/index.js new file mode 100644 index 00000000000..9003530a920 --- /dev/null +++ b/test/watchCases/cache/loader-load-module-progress/0/index.js @@ -0,0 +1,14 @@ +import a, { value, random } from "./mod.js"; +import { value as unrelated } from "./unrelated"; + +it("should have to correct values and validate on change", () => { + const step = +WATCH_STEP; + expect(a).toBe(24); + expect(value).toBe(42); + expect(random).toBeDefined(); + + if (step !== 0) { + expect(STATE.random === a.random).toBe(step === 1); + } + STATE.random = a.random; +}); diff --git a/test/watchCases/cache/loader-load-module-progress/0/loader.js b/test/watchCases/cache/loader-load-module-progress/0/loader.js new file mode 100644 index 00000000000..3605d5b0a36 --- /dev/null +++ b/test/watchCases/cache/loader-load-module-progress/0/loader.js @@ -0,0 +1,15 @@ +/** @type {import("../../../../../").PitchLoaderDefinitionFunction<{}, {}>} */ +exports.pitch = async function (remaining) { + const callback = this.async(); + const result = this.loadModule( + `${this.resourcePath}.webpack[javascript/auto]!=!${remaining}`, + (err, result) => { + if (err) { + callback(err); + return; + } + + callback(null, result) + } + ); +}; diff --git a/test/watchCases/cache/loader-load-module-progress/0/mod.js b/test/watchCases/cache/loader-load-module-progress/0/mod.js new file mode 100644 index 00000000000..6027da9afc9 --- /dev/null +++ b/test/watchCases/cache/loader-load-module-progress/0/mod.js @@ -0,0 +1,4 @@ +export const value = 42; +export * from "./imported.js"; +export const random = Math.random(); +export default 24; diff --git a/test/watchCases/cache/loader-load-module-progress/0/unrelated.js b/test/watchCases/cache/loader-load-module-progress/0/unrelated.js new file mode 100644 index 00000000000..46d3ca8c61f --- /dev/null +++ b/test/watchCases/cache/loader-load-module-progress/0/unrelated.js @@ -0,0 +1 @@ +export const value = 42; diff --git a/test/watchCases/cache/loader-load-module-progress/1/unrelated.js b/test/watchCases/cache/loader-load-module-progress/1/unrelated.js new file mode 100644 index 00000000000..9ea3faa10bc --- /dev/null +++ b/test/watchCases/cache/loader-load-module-progress/1/unrelated.js @@ -0,0 +1 @@ +export const value = 24; diff --git a/test/watchCases/cache/loader-load-module-progress/webpack.config.js b/test/watchCases/cache/loader-load-module-progress/webpack.config.js new file mode 100644 index 00000000000..c853d37e2e0 --- /dev/null +++ b/test/watchCases/cache/loader-load-module-progress/webpack.config.js @@ -0,0 +1,42 @@ +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + cache: { + type: "filesystem" + }, + module: { + rules: [ + { + test: /mod\.js$/, + use: "./loader" + } + ] + }, + plugins: [ + new webpack.ProgressPlugin(), + { + apply(compiler) { + compiler.hooks.done.tapPromise("CacheTest", async () => { + const cache = compiler + .getCache("ProgressPlugin") + .getItemCache("counts", null); + + const data = await cache.getPromise(); + + if (data.modulesCount !== 4) { + throw new Error( + `Wrong cached value of \`ProgressPlugin.modulesCount\` - ${data.modulesCount}, expect 4` + ); + } + + if (data.dependenciesCount !== 4) { + throw new Error( + `Wrong cached value of \`ProgressPlugin.dependenciesCount\` - ${data.dependenciesCount}, expect 4` + ); + } + }); + } + } + ] +}; diff --git a/test/watchCases/cache/managedPath/0/index.js b/test/watchCases/cache/managedPath/0/index.js new file mode 100644 index 00000000000..6f34d922c67 --- /dev/null +++ b/test/watchCases/cache/managedPath/0/index.js @@ -0,0 +1,6 @@ +import { foo, bar } from "foo"; + +it("should have the correct values", () => { + expect(foo).toBe("foo"); + expect(bar).toBe("bar"); +}); diff --git a/test/watchCases/cache/managedPath/0/node_modules/bar/index.js b/test/watchCases/cache/managedPath/0/node_modules/bar/index.js new file mode 100644 index 00000000000..c399d568960 --- /dev/null +++ b/test/watchCases/cache/managedPath/0/node_modules/bar/index.js @@ -0,0 +1 @@ +export const bar = "bar"; diff --git a/test/watchCases/cache/managedPath/0/node_modules/bar/package.json b/test/watchCases/cache/managedPath/0/node_modules/bar/package.json new file mode 100644 index 00000000000..08d910e73dc --- /dev/null +++ b/test/watchCases/cache/managedPath/0/node_modules/bar/package.json @@ -0,0 +1,4 @@ +{ + "name": "bar", + "version": "0" +} diff --git a/test/watchCases/cache/managedPath/0/node_modules/foo/index.js b/test/watchCases/cache/managedPath/0/node_modules/foo/index.js new file mode 100644 index 00000000000..ab4dd19f623 --- /dev/null +++ b/test/watchCases/cache/managedPath/0/node_modules/foo/index.js @@ -0,0 +1,2 @@ +export const foo = "foo"; +export { bar } from "bar"; diff --git a/test/watchCases/cache/managedPath/0/node_modules/foo/package.json b/test/watchCases/cache/managedPath/0/node_modules/foo/package.json new file mode 100644 index 00000000000..badf996f50c --- /dev/null +++ b/test/watchCases/cache/managedPath/0/node_modules/foo/package.json @@ -0,0 +1,4 @@ +{ + "name": "foo", + "version": "0" +} diff --git a/test/watchCases/cache/managedPath/1/index.js b/test/watchCases/cache/managedPath/1/index.js new file mode 100644 index 00000000000..0fb697da07b --- /dev/null +++ b/test/watchCases/cache/managedPath/1/index.js @@ -0,0 +1,6 @@ +import { foo, bar } from "foo"; + +it("should invalidate resolving if inner node_modules appears", () => { + expect(foo).toBe("foo"); + expect(bar).toBe("inner-bar"); +}); diff --git a/test/watchCases/cache/managedPath/1/node_modules/foo/node_modules/bar/index.js b/test/watchCases/cache/managedPath/1/node_modules/foo/node_modules/bar/index.js new file mode 100644 index 00000000000..2ff8107b56a --- /dev/null +++ b/test/watchCases/cache/managedPath/1/node_modules/foo/node_modules/bar/index.js @@ -0,0 +1 @@ +export const bar = "inner-bar"; diff --git a/test/watchCases/cache/managedPath/1/node_modules/foo/node_modules/bar/package.json b/test/watchCases/cache/managedPath/1/node_modules/foo/node_modules/bar/package.json new file mode 100644 index 00000000000..e933892c51f --- /dev/null +++ b/test/watchCases/cache/managedPath/1/node_modules/foo/node_modules/bar/package.json @@ -0,0 +1,4 @@ +{ + "name": "bar", + "version": "1" +} diff --git a/test/watchCases/cache/managedPath/2/index.js b/test/watchCases/cache/managedPath/2/index.js new file mode 100644 index 00000000000..7720db7958b --- /dev/null +++ b/test/watchCases/cache/managedPath/2/index.js @@ -0,0 +1,6 @@ +import { foo, bar } from "foo"; + +it("should not invalidate managed item if package version stays equal", () => { + expect(foo).toBe("foo"); + expect(bar).toBe("inner-bar"); +}); diff --git a/test/watchCases/cache/managedPath/2/node_modules/foo/node_modules/bar/index.js b/test/watchCases/cache/managedPath/2/node_modules/foo/node_modules/bar/index.js new file mode 100644 index 00000000000..cefb29dfac8 --- /dev/null +++ b/test/watchCases/cache/managedPath/2/node_modules/foo/node_modules/bar/index.js @@ -0,0 +1 @@ +export const bar = "undetected-bar"; diff --git a/test/watchCases/cache/managedPath/3/index.js b/test/watchCases/cache/managedPath/3/index.js new file mode 100644 index 00000000000..297d6411f09 --- /dev/null +++ b/test/watchCases/cache/managedPath/3/index.js @@ -0,0 +1,6 @@ +import { foo, bar } from "foo"; + +it("should invalidate when directory gets deleted", () => { + expect(foo).toBe("foo"); + expect(bar).toBe("bar"); +}); diff --git a/test/watchCases/cache/managedPath/3/node_modules/foo/node_modules/bar b/test/watchCases/cache/managedPath/3/node_modules/foo/node_modules/bar new file mode 100644 index 00000000000..4ac595696b9 --- /dev/null +++ b/test/watchCases/cache/managedPath/3/node_modules/foo/node_modules/bar @@ -0,0 +1 @@ +DELETE_DIRECTORY diff --git a/test/watchCases/cache/managedPath/webpack.config.js b/test/watchCases/cache/managedPath/webpack.config.js new file mode 100644 index 00000000000..7ef2fe927c0 --- /dev/null +++ b/test/watchCases/cache/managedPath/webpack.config.js @@ -0,0 +1,15 @@ +const path = require("path"); + +/** @type {(env: Env, options: TestOptions) => import("../../../../").Configuration} */ +module.exports = (env, { srcPath }) => ({ + mode: "development", + cache: { + type: "memory" + }, + snapshot: { + managedPaths: [path.resolve(srcPath, "node_modules")] + }, + module: { + unsafeCache: false + } +}); diff --git a/test/watchCases/cache/max-generation/0/changing-file.js b/test/watchCases/cache/max-generation/0/changing-file.js new file mode 100644 index 00000000000..335d3d1ad2c --- /dev/null +++ b/test/watchCases/cache/max-generation/0/changing-file.js @@ -0,0 +1 @@ +module.exports = "0"; diff --git a/test/watchCases/cache/max-generation/0/index.js b/test/watchCases/cache/max-generation/0/index.js new file mode 100644 index 00000000000..3f40c870cd0 --- /dev/null +++ b/test/watchCases/cache/max-generation/0/index.js @@ -0,0 +1,3 @@ +it("should watch for changes", function() { + expect(require("./changing-file")).toBe(WATCH_STEP); +}) diff --git a/test/watchCases/cache/max-generation/1/changing-file.js b/test/watchCases/cache/max-generation/1/changing-file.js new file mode 100644 index 00000000000..ba0e0f3e141 --- /dev/null +++ b/test/watchCases/cache/max-generation/1/changing-file.js @@ -0,0 +1 @@ +module.exports = "1"; diff --git a/test/watchCases/cache/max-generation/2/changing-file.js b/test/watchCases/cache/max-generation/2/changing-file.js new file mode 100644 index 00000000000..c202b851341 --- /dev/null +++ b/test/watchCases/cache/max-generation/2/changing-file.js @@ -0,0 +1 @@ +module.exports = "2"; diff --git a/test/watchCases/cache/max-generation/webpack.config.js b/test/watchCases/cache/max-generation/webpack.config.js new file mode 100644 index 00000000000..6314aff8311 --- /dev/null +++ b/test/watchCases/cache/max-generation/webpack.config.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + cache: { + type: "memory", + maxGenerations: 3 + } +}; diff --git a/test/watchCases/cache/new-split-chunk-entry-node/0/entry.js b/test/watchCases/cache/new-split-chunk-entry-node/0/entry.js new file mode 100644 index 00000000000..ee6b400b3d3 --- /dev/null +++ b/test/watchCases/cache/new-split-chunk-entry-node/0/entry.js @@ -0,0 +1,3 @@ +import "./shared"; + +export default "ok"; diff --git a/test/watchCases/cache/new-split-chunk-entry-node/0/index.js b/test/watchCases/cache/new-split-chunk-entry-node/0/index.js new file mode 100644 index 00000000000..6f9ed71a9fa --- /dev/null +++ b/test/watchCases/cache/new-split-chunk-entry-node/0/index.js @@ -0,0 +1,32 @@ +import fs from "fs"; +import path from "path"; + +it("should include the correct split chunk ids in entry", async () => { + await import("./module"); + const runtimeId = STATS_JSON.chunks.find(c => c.names.includes("runtime")).id; + const entryCode = fs.readFileSync( + path.resolve(__dirname, "entry.js"), + "utf-8" + ); + STATE.allIds = new Set([ + ...(STATE.allIds || []), + ...STATS_JSON.entrypoints.entry.chunks + ]); + const expectedIds = Array.from(STATE.allIds).filter( + id => STATS_JSON.entrypoints.entry.chunks.includes(id) && id !== runtimeId + ); + try { + for (const id of STATE.allIds) { + const expected = expectedIds.includes(id); + (expected ? expect(entryCode) : expect(entryCode).not).toMatch( + new RegExp(`[\\[,]${id}[\\],]`) + ); + } + } catch (e) { + throw new Error( + `Entrypoint code should contain only these chunk ids: ${expectedIds.join( + ", " + )}\n${e.message}` + ); + } +}); diff --git a/test/watchCases/cache/new-split-chunk-entry-node/0/module.js b/test/watchCases/cache/new-split-chunk-entry-node/0/module.js new file mode 100644 index 00000000000..65d0bd772b1 --- /dev/null +++ b/test/watchCases/cache/new-split-chunk-entry-node/0/module.js @@ -0,0 +1,3 @@ +export {}; + +if (Math.random() < 0) console.log("module"); diff --git a/test/watchCases/cache/new-split-chunk-entry-node/0/shared-dep.js b/test/watchCases/cache/new-split-chunk-entry-node/0/shared-dep.js new file mode 100644 index 00000000000..b0ec3a7fd42 --- /dev/null +++ b/test/watchCases/cache/new-split-chunk-entry-node/0/shared-dep.js @@ -0,0 +1 @@ +if (Math.random() < 0) console.log("shared-dep"); diff --git a/test/watchCases/cache/new-split-chunk-entry-node/0/shared.js b/test/watchCases/cache/new-split-chunk-entry-node/0/shared.js new file mode 100644 index 00000000000..4b72961d9cd --- /dev/null +++ b/test/watchCases/cache/new-split-chunk-entry-node/0/shared.js @@ -0,0 +1,2 @@ +import "./shared-dep"; +if (Math.random() < 0) console.log("shared"); diff --git a/test/watchCases/cache/new-split-chunk-entry-node/1/module.js b/test/watchCases/cache/new-split-chunk-entry-node/1/module.js new file mode 100644 index 00000000000..5905fa622ec --- /dev/null +++ b/test/watchCases/cache/new-split-chunk-entry-node/1/module.js @@ -0,0 +1,4 @@ +import "./shared"; +export {}; + +if (Math.random() < 0) console.log("module"); diff --git a/test/watchCases/cache/new-split-chunk-entry-node/2/module.js b/test/watchCases/cache/new-split-chunk-entry-node/2/module.js new file mode 100644 index 00000000000..12c23b5377c --- /dev/null +++ b/test/watchCases/cache/new-split-chunk-entry-node/2/module.js @@ -0,0 +1,5 @@ +import("./shared"); +import("./shared-dep"); +export {}; + +if (Math.random() < 0) console.log("module"); diff --git a/test/watchCases/cache/new-split-chunk-entry-node/3/entry.js b/test/watchCases/cache/new-split-chunk-entry-node/3/entry.js new file mode 100644 index 00000000000..b1047118ac6 --- /dev/null +++ b/test/watchCases/cache/new-split-chunk-entry-node/3/entry.js @@ -0,0 +1,3 @@ +import "./shared"; + +export default "ok2"; diff --git a/test/watchCases/cache/new-split-chunk-entry-node/4/module.js b/test/watchCases/cache/new-split-chunk-entry-node/4/module.js new file mode 100644 index 00000000000..5905fa622ec --- /dev/null +++ b/test/watchCases/cache/new-split-chunk-entry-node/4/module.js @@ -0,0 +1,4 @@ +import "./shared"; +export {}; + +if (Math.random() < 0) console.log("module"); diff --git a/test/watchCases/cache/new-split-chunk-entry-node/5/module.js b/test/watchCases/cache/new-split-chunk-entry-node/5/module.js new file mode 100644 index 00000000000..99ac54f1701 --- /dev/null +++ b/test/watchCases/cache/new-split-chunk-entry-node/5/module.js @@ -0,0 +1,4 @@ +import "./shared-dep"; +export {}; + +if (Math.random() < 0) console.log("module"); diff --git a/test/watchCases/cache/new-split-chunk-entry-node/webpack.config.js b/test/watchCases/cache/new-split-chunk-entry-node/webpack.config.js new file mode 100644 index 00000000000..704b991b52c --- /dev/null +++ b/test/watchCases/cache/new-split-chunk-entry-node/webpack.config.js @@ -0,0 +1,25 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + bundle: "./index.js", + entry: { import: "./entry.js", runtime: "runtime" } + }, + mode: "production", + cache: { + type: "memory" + }, + output: { + filename: "[name].js", + pathinfo: true, + library: { type: "commonjs-module" } + }, + optimization: { + splitChunks: { + minSize: 1, + chunks: "all", + usedExports: false + }, + minimize: false, + concatenateModules: false + } +}; diff --git a/test/watchCases/cache/new-split-chunk-entry-web/0/entry.js b/test/watchCases/cache/new-split-chunk-entry-web/0/entry.js new file mode 100644 index 00000000000..ee6b400b3d3 --- /dev/null +++ b/test/watchCases/cache/new-split-chunk-entry-web/0/entry.js @@ -0,0 +1,3 @@ +import "./shared"; + +export default "ok"; diff --git a/test/watchCases/cache/new-split-chunk-entry-web/0/index.js b/test/watchCases/cache/new-split-chunk-entry-web/0/index.js new file mode 100644 index 00000000000..08156b44730 --- /dev/null +++ b/test/watchCases/cache/new-split-chunk-entry-web/0/index.js @@ -0,0 +1,32 @@ +import fs from "fs"; +import path from "path"; + +it("should include the correct split chunk ids in entry", async () => { + if (Math.random() < 0) import("./module"); + const runtimeId = STATS_JSON.chunks.find(c => c.names.includes("runtime")).id; + const entryCode = fs.readFileSync( + path.resolve(__dirname, "entry.js"), + "utf-8" + ); + STATE.allIds = new Set([ + ...(STATE.allIds || []), + ...STATS_JSON.entrypoints.entry.chunks + ]); + const expectedIds = Array.from(STATE.allIds).filter( + id => STATS_JSON.entrypoints.entry.chunks.includes(id) && id !== runtimeId + ); + try { + for (const id of STATE.allIds) { + const expected = expectedIds.includes(id); + (expected ? expect(entryCode) : expect(entryCode).not).toMatch( + new RegExp(`[\\[,]${id}[\\],]`) + ); + } + } catch (e) { + throw new Error( + `Entrypoint code should contain only these chunk ids: ${expectedIds.join( + ", " + )}\n${e.message}` + ); + } +}); diff --git a/test/watchCases/cache/new-split-chunk-entry-web/0/module.js b/test/watchCases/cache/new-split-chunk-entry-web/0/module.js new file mode 100644 index 00000000000..65d0bd772b1 --- /dev/null +++ b/test/watchCases/cache/new-split-chunk-entry-web/0/module.js @@ -0,0 +1,3 @@ +export {}; + +if (Math.random() < 0) console.log("module"); diff --git a/test/watchCases/cache/new-split-chunk-entry-web/0/shared-dep.js b/test/watchCases/cache/new-split-chunk-entry-web/0/shared-dep.js new file mode 100644 index 00000000000..b0ec3a7fd42 --- /dev/null +++ b/test/watchCases/cache/new-split-chunk-entry-web/0/shared-dep.js @@ -0,0 +1 @@ +if (Math.random() < 0) console.log("shared-dep"); diff --git a/test/watchCases/cache/new-split-chunk-entry-web/0/shared.js b/test/watchCases/cache/new-split-chunk-entry-web/0/shared.js new file mode 100644 index 00000000000..4b72961d9cd --- /dev/null +++ b/test/watchCases/cache/new-split-chunk-entry-web/0/shared.js @@ -0,0 +1,2 @@ +import "./shared-dep"; +if (Math.random() < 0) console.log("shared"); diff --git a/test/watchCases/cache/new-split-chunk-entry-web/1/module.js b/test/watchCases/cache/new-split-chunk-entry-web/1/module.js new file mode 100644 index 00000000000..5905fa622ec --- /dev/null +++ b/test/watchCases/cache/new-split-chunk-entry-web/1/module.js @@ -0,0 +1,4 @@ +import "./shared"; +export {}; + +if (Math.random() < 0) console.log("module"); diff --git a/test/watchCases/cache/new-split-chunk-entry-web/2/module.js b/test/watchCases/cache/new-split-chunk-entry-web/2/module.js new file mode 100644 index 00000000000..12c23b5377c --- /dev/null +++ b/test/watchCases/cache/new-split-chunk-entry-web/2/module.js @@ -0,0 +1,5 @@ +import("./shared"); +import("./shared-dep"); +export {}; + +if (Math.random() < 0) console.log("module"); diff --git a/test/watchCases/cache/new-split-chunk-entry-web/3/entry.js b/test/watchCases/cache/new-split-chunk-entry-web/3/entry.js new file mode 100644 index 00000000000..b1047118ac6 --- /dev/null +++ b/test/watchCases/cache/new-split-chunk-entry-web/3/entry.js @@ -0,0 +1,3 @@ +import "./shared"; + +export default "ok2"; diff --git a/test/watchCases/cache/new-split-chunk-entry-web/4/module.js b/test/watchCases/cache/new-split-chunk-entry-web/4/module.js new file mode 100644 index 00000000000..5905fa622ec --- /dev/null +++ b/test/watchCases/cache/new-split-chunk-entry-web/4/module.js @@ -0,0 +1,4 @@ +import "./shared"; +export {}; + +if (Math.random() < 0) console.log("module"); diff --git a/test/watchCases/cache/new-split-chunk-entry-web/5/module.js b/test/watchCases/cache/new-split-chunk-entry-web/5/module.js new file mode 100644 index 00000000000..99ac54f1701 --- /dev/null +++ b/test/watchCases/cache/new-split-chunk-entry-web/5/module.js @@ -0,0 +1,4 @@ +import "./shared-dep"; +export {}; + +if (Math.random() < 0) console.log("module"); diff --git a/test/watchCases/cache/new-split-chunk-entry-web/webpack.config.js b/test/watchCases/cache/new-split-chunk-entry-web/webpack.config.js new file mode 100644 index 00000000000..7b4cd8b6302 --- /dev/null +++ b/test/watchCases/cache/new-split-chunk-entry-web/webpack.config.js @@ -0,0 +1,35 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + entry: { + bundle: "./index.js", + entry: { import: "./entry.js", runtime: "runtime" } + }, + mode: "production", + cache: { + type: "memory" + }, + output: { + filename: "[name].js", + pathinfo: true, + publicPath: "./", + library: { + name: ["RESULT", "value"], + type: "assign" + } + }, + optimization: { + splitChunks: { + minSize: 1, + chunks: "all", + usedExports: false + }, + minimize: false, + concatenateModules: false + }, + externalsType: "commonjs", + externals: ["fs", "path"], + node: { + __dirname: false + }, + target: "web" +}; diff --git a/test/watchCases/cache/reexport-mangle/0/bar.js b/test/watchCases/cache/reexport-mangle/0/bar.js new file mode 100644 index 00000000000..02712e80f3e --- /dev/null +++ b/test/watchCases/cache/reexport-mangle/0/bar.js @@ -0,0 +1,2 @@ +export const bar = "bar"; +export const bar2 = "bar2"; diff --git a/test/watchCases/cache/reexport-mangle/0/foo.js b/test/watchCases/cache/reexport-mangle/0/foo.js new file mode 100644 index 00000000000..fbbec29ce79 --- /dev/null +++ b/test/watchCases/cache/reexport-mangle/0/foo.js @@ -0,0 +1,2 @@ +export default "foo"; +export const unused = "foo2"; diff --git a/test/watchCases/cache/reexport-mangle/0/index.js b/test/watchCases/cache/reexport-mangle/0/index.js new file mode 100644 index 00000000000..7e2d1f2292d --- /dev/null +++ b/test/watchCases/cache/reexport-mangle/0/index.js @@ -0,0 +1,14 @@ +import { foo, bar } from "./module"; +import value from "./other-user"; + +it("should invalidate when mangled name change", () => { + expect(foo).toBe("foo"); + expect(bar).toBe("bar"); + expect(value).toBe(42); +}); + +it("should invalidate when mangled name change (cjs)", () => { + expect(require("./module-cjs").foo).toBe("foo"); + expect(require("./module-cjs").bar).toBe("bar"); + expect(value).toBe(42); +}); diff --git a/test/watchCases/cache/reexport-mangle/0/module-cjs.js b/test/watchCases/cache/reexport-mangle/0/module-cjs.js new file mode 100644 index 00000000000..bc7f96a1143 --- /dev/null +++ b/test/watchCases/cache/reexport-mangle/0/module-cjs.js @@ -0,0 +1,7 @@ +var foo = require("./foo?cjs").default; +exports.foo = foo; +var bar = require("./bar?cjs").bar; +exports.bar = bar; +exports.baz = "baz"; + +console.log.bind(console); diff --git a/test/watchCases/cache/reexport-mangle/0/module-reexport-cjs.js b/test/watchCases/cache/reexport-mangle/0/module-reexport-cjs.js new file mode 100644 index 00000000000..8660f141af8 --- /dev/null +++ b/test/watchCases/cache/reexport-mangle/0/module-reexport-cjs.js @@ -0,0 +1,5 @@ +exports.foo = require("./foo?reexport-cjs").default; +exports.bar = require("./bar?reexport-cjs").bar; +exports.baz = "baz"; + +console.log.bind(console); diff --git a/test/watchCases/cache/reexport-mangle/0/module-reexport.js b/test/watchCases/cache/reexport-mangle/0/module-reexport.js new file mode 100644 index 00000000000..8926a7937d7 --- /dev/null +++ b/test/watchCases/cache/reexport-mangle/0/module-reexport.js @@ -0,0 +1,5 @@ +export { default as foo } from "./foo?reexport"; +export { bar } from "./bar?reexport"; +export const baz = "baz"; + +console.log.bind(console); diff --git a/test/watchCases/cache/reexport-mangle/0/module.js b/test/watchCases/cache/reexport-mangle/0/module.js new file mode 100644 index 00000000000..4353d2074d8 --- /dev/null +++ b/test/watchCases/cache/reexport-mangle/0/module.js @@ -0,0 +1,8 @@ +const ident = x => x; +import { default as fooImp } from "./foo"; +export const foo = ident(fooImp); +import { bar as barImp } from "./bar"; +export const bar = ident(barImp); +export const baz = "baz"; + +console.log.bind(console); diff --git a/test/watchCases/cache/reexport-mangle/0/other-user.js b/test/watchCases/cache/reexport-mangle/0/other-user.js new file mode 100644 index 00000000000..02e480d6741 --- /dev/null +++ b/test/watchCases/cache/reexport-mangle/0/other-user.js @@ -0,0 +1,12 @@ +if (Math.random() < 0) { + import("./foo"); + import("./foo?cjs"); + import("./bar"); + import("./bar?cjs"); + import("./foo?reexport"); + import("./foo?reexport-cjs"); + import("./bar?reexport"); + import("./bar?reexport-cjs"); +} + +export default 42; diff --git a/test/watchCases/cache/reexport-mangle/1/other-user.js b/test/watchCases/cache/reexport-mangle/1/other-user.js new file mode 100644 index 00000000000..f80bea5e0b9 --- /dev/null +++ b/test/watchCases/cache/reexport-mangle/1/other-user.js @@ -0,0 +1,8 @@ +if (Math.random() < 0) { + import("./foo"); + import("./foo?cjs"); + import("./foo?reexport"); + import("./foo?reexport-cjs"); +} + +export default 42; diff --git a/test/watchCases/cache/reexport-mangle/2/other-user.js b/test/watchCases/cache/reexport-mangle/2/other-user.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/watchCases/cache/reexport-mangle/2/other-user.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/watchCases/cache/reexport-mangle/webpack.config.js b/test/watchCases/cache/reexport-mangle/webpack.config.js new file mode 100644 index 00000000000..10396828746 --- /dev/null +++ b/test/watchCases/cache/reexport-mangle/webpack.config.js @@ -0,0 +1,14 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "production", + cache: { + type: "memory" + }, + output: { + pathinfo: true + }, + optimization: { + minimize: false, + concatenateModules: false + } +}; diff --git a/test/watchCases/cache/unsafe-cache-duplicates/0/after.js b/test/watchCases/cache/unsafe-cache-duplicates/0/after.js new file mode 100644 index 00000000000..7f810d3f328 --- /dev/null +++ b/test/watchCases/cache/unsafe-cache-duplicates/0/after.js @@ -0,0 +1 @@ +export default 0; diff --git a/test/watchCases/cache/unsafe-cache-duplicates/0/index.js b/test/watchCases/cache/unsafe-cache-duplicates/0/index.js new file mode 100644 index 00000000000..62397182ce7 --- /dev/null +++ b/test/watchCases/cache/unsafe-cache-duplicates/0/index.js @@ -0,0 +1,3 @@ +import "./unsafe-cache-root"; + +it("should compile fine", () => {}); diff --git a/test/watchCases/cache/unsafe-cache-duplicates/0/module.js b/test/watchCases/cache/unsafe-cache-duplicates/0/module.js new file mode 100644 index 00000000000..150d1169254 --- /dev/null +++ b/test/watchCases/cache/unsafe-cache-duplicates/0/module.js @@ -0,0 +1 @@ +export { default } from "./after"; diff --git a/test/watchCases/cache/unsafe-cache-duplicates/0/unsafe-cache-root.js b/test/watchCases/cache/unsafe-cache-duplicates/0/unsafe-cache-root.js new file mode 100644 index 00000000000..881aafcba62 --- /dev/null +++ b/test/watchCases/cache/unsafe-cache-duplicates/0/unsafe-cache-root.js @@ -0,0 +1,2 @@ +export default require.resolve("./module"); +export { default as module } from "./module"; diff --git a/test/watchCases/cache/unsafe-cache-duplicates/1/alternative-path.js b/test/watchCases/cache/unsafe-cache-duplicates/1/alternative-path.js new file mode 100644 index 00000000000..881aafcba62 --- /dev/null +++ b/test/watchCases/cache/unsafe-cache-duplicates/1/alternative-path.js @@ -0,0 +1,2 @@ +export default require.resolve("./module"); +export { default as module } from "./module"; diff --git a/test/watchCases/cache/unsafe-cache-duplicates/1/index.js b/test/watchCases/cache/unsafe-cache-duplicates/1/index.js new file mode 100644 index 00000000000..45dde1cd591 --- /dev/null +++ b/test/watchCases/cache/unsafe-cache-duplicates/1/index.js @@ -0,0 +1,5 @@ +import id from "./alternative-path"; + +it("should compile fine", () => { + expect(id).toBe("./module.js"); +}); diff --git a/test/watchCases/cache/unsafe-cache-duplicates/2/after.js b/test/watchCases/cache/unsafe-cache-duplicates/2/after.js new file mode 100644 index 00000000000..0eff3b8bcb5 --- /dev/null +++ b/test/watchCases/cache/unsafe-cache-duplicates/2/after.js @@ -0,0 +1 @@ +export { default } from "./unsafe-cache-root"; diff --git a/test/watchCases/cache/unsafe-cache-duplicates/2/index.js b/test/watchCases/cache/unsafe-cache-duplicates/2/index.js new file mode 100644 index 00000000000..295951a85c4 --- /dev/null +++ b/test/watchCases/cache/unsafe-cache-duplicates/2/index.js @@ -0,0 +1,6 @@ +import id, { module } from "./alternative-path"; + +it("should not duplicate modules", () => { + expect(id).toBe("./module.js"); + expect(module).toBe("./module.js"); +}); diff --git a/test/watchCases/cache/unsafe-cache-duplicates/webpack.config.js b/test/watchCases/cache/unsafe-cache-duplicates/webpack.config.js new file mode 100644 index 00000000000..790b968d827 --- /dev/null +++ b/test/watchCases/cache/unsafe-cache-duplicates/webpack.config.js @@ -0,0 +1,32 @@ +const path = require("path"); + +/** @typedef {import("../../../../").NormalModule} NormalModule */ + +/** @type {(env: Env, options: TestOptions) => import("../../../../").Configuration} */ +module.exports = (env, { srcPath }) => ({ + mode: "development", + cache: { + type: "filesystem", + maxMemoryGenerations: Infinity, + idleTimeout: 1 + }, + module: { + unsafeCache: module => + /module\.js/.test(/** @type {NormalModule} */ (module).resource) + }, + plugins: [ + compiler => { + compiler.cache.hooks.get.tap( + { + name: "webpack.config.js", + stage: -1000 + }, + (identifier, etag) => { + if (identifier.includes(path.join(srcPath, "module.js"))) { + return null; + } + } + ); + } + ] +}); diff --git a/test/watchCases/cache/unsafe-cache-managed-paths/0/index.js b/test/watchCases/cache/unsafe-cache-managed-paths/0/index.js new file mode 100644 index 00000000000..6a611308f87 --- /dev/null +++ b/test/watchCases/cache/unsafe-cache-managed-paths/0/index.js @@ -0,0 +1,5 @@ +import value from "package"; + +it("should detect updates of managed paths when version changes", () => { + expect(value).toBe(WATCH_STEP); +}); diff --git a/test/watchCases/cache/unsafe-cache-managed-paths/0/node_modules/package/index.js b/test/watchCases/cache/unsafe-cache-managed-paths/0/node_modules/package/index.js new file mode 100644 index 00000000000..b428ff41a01 --- /dev/null +++ b/test/watchCases/cache/unsafe-cache-managed-paths/0/node_modules/package/index.js @@ -0,0 +1 @@ +export default "0"; diff --git a/test/watchCases/cache/unsafe-cache-managed-paths/0/node_modules/package/package.json b/test/watchCases/cache/unsafe-cache-managed-paths/0/node_modules/package/package.json new file mode 100644 index 00000000000..c6a5cb99d58 --- /dev/null +++ b/test/watchCases/cache/unsafe-cache-managed-paths/0/node_modules/package/package.json @@ -0,0 +1,4 @@ +{ + "name": "package", + "version": "0.0.0" +} diff --git a/test/watchCases/cache/unsafe-cache-managed-paths/1/node_modules/package/index.js b/test/watchCases/cache/unsafe-cache-managed-paths/1/node_modules/package/index.js new file mode 100644 index 00000000000..508074e2ae0 --- /dev/null +++ b/test/watchCases/cache/unsafe-cache-managed-paths/1/node_modules/package/index.js @@ -0,0 +1 @@ +export default "1"; diff --git a/test/watchCases/cache/unsafe-cache-managed-paths/1/node_modules/package/package.json b/test/watchCases/cache/unsafe-cache-managed-paths/1/node_modules/package/package.json new file mode 100644 index 00000000000..fc9e9b9b633 --- /dev/null +++ b/test/watchCases/cache/unsafe-cache-managed-paths/1/node_modules/package/package.json @@ -0,0 +1,4 @@ +{ + "name": "package", + "version": "0.0.1" +} diff --git a/test/watchCases/cache/unsafe-cache-managed-paths/2/node_modules/package/index.js b/test/watchCases/cache/unsafe-cache-managed-paths/2/node_modules/package/index.js new file mode 100644 index 00000000000..bd360e75dff --- /dev/null +++ b/test/watchCases/cache/unsafe-cache-managed-paths/2/node_modules/package/index.js @@ -0,0 +1 @@ +export default "2"; diff --git a/test/watchCases/cache/unsafe-cache-managed-paths/2/node_modules/package/package.json b/test/watchCases/cache/unsafe-cache-managed-paths/2/node_modules/package/package.json new file mode 100644 index 00000000000..90376860226 --- /dev/null +++ b/test/watchCases/cache/unsafe-cache-managed-paths/2/node_modules/package/package.json @@ -0,0 +1,4 @@ +{ + "name": "package", + "version": "0.0.2" +} diff --git a/test/watchCases/cache/unsafe-cache-managed-paths/webpack.config.js b/test/watchCases/cache/unsafe-cache-managed-paths/webpack.config.js new file mode 100644 index 00000000000..510ec2e86d4 --- /dev/null +++ b/test/watchCases/cache/unsafe-cache-managed-paths/webpack.config.js @@ -0,0 +1,10 @@ +/** @type {(env: Env, options: TestOptions) => import("../../../../").Configuration} */ +module.exports = (env, { srcPath }) => ({ + mode: "development", + cache: { + type: "memory" + }, + snapshot: { + managedPaths: [/^(.+?[\\/]node_modules[\\/])/] + } +}); diff --git a/test/watchCases/cache/unsafe-cache/0/changing-module.js b/test/watchCases/cache/unsafe-cache/0/changing-module.js new file mode 100644 index 00000000000..545ea91edf5 --- /dev/null +++ b/test/watchCases/cache/unsafe-cache/0/changing-module.js @@ -0,0 +1,5 @@ +import "./unchanged-module.js"; +import "./unchanged-module.json"; +new URL("./unchanged-module.svg", import.meta.url); + +export default "0"; diff --git a/test/watchCases/cache/unsafe-cache/0/index.js b/test/watchCases/cache/unsafe-cache/0/index.js new file mode 100644 index 00000000000..d399884e305 --- /dev/null +++ b/test/watchCases/cache/unsafe-cache/0/index.js @@ -0,0 +1,6 @@ +import value from "./changing-module"; +import "./proxy-module"; + +it("should compile and cleanup correctly", () => { + expect(value).toBe(WATCH_STEP); +}); diff --git a/test/watchCases/cache/unsafe-cache/0/proxy-module.js b/test/watchCases/cache/unsafe-cache/0/proxy-module.js new file mode 100644 index 00000000000..a02f056626c --- /dev/null +++ b/test/watchCases/cache/unsafe-cache/0/proxy-module.js @@ -0,0 +1,4 @@ +import "./unchanged-module.js"; +import "./unchanged-module.json"; +new URL("./unchanged-module.svg", import.meta.url); +import "external"; diff --git a/test/watchCases/cache/unsafe-cache/0/unchanged-module.js b/test/watchCases/cache/unsafe-cache/0/unchanged-module.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/watchCases/cache/unsafe-cache/0/unchanged-module.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/watchCases/cache/unsafe-cache/0/unchanged-module.json b/test/watchCases/cache/unsafe-cache/0/unchanged-module.json new file mode 100644 index 00000000000..0967ef424bc --- /dev/null +++ b/test/watchCases/cache/unsafe-cache/0/unchanged-module.json @@ -0,0 +1 @@ +{} diff --git a/test/watchCases/cache/unsafe-cache/0/unchanged-module.svg b/test/watchCases/cache/unsafe-cache/0/unchanged-module.svg new file mode 100644 index 00000000000..3e8fcacea68 --- /dev/null +++ b/test/watchCases/cache/unsafe-cache/0/unchanged-module.svg @@ -0,0 +1 @@ + diff --git a/test/watchCases/cache/unsafe-cache/1/changing-module.js b/test/watchCases/cache/unsafe-cache/1/changing-module.js new file mode 100644 index 00000000000..883b73a3d7f --- /dev/null +++ b/test/watchCases/cache/unsafe-cache/1/changing-module.js @@ -0,0 +1,6 @@ +import "./unchanged-module.js"; +import "./unchanged-module.json"; +new URL("./unchanged-module.svg", import.meta.url); +import "external"; + +export default "1"; diff --git a/test/watchCases/cache/unsafe-cache/2/changing-module.js b/test/watchCases/cache/unsafe-cache/2/changing-module.js new file mode 100644 index 00000000000..156ac382b80 --- /dev/null +++ b/test/watchCases/cache/unsafe-cache/2/changing-module.js @@ -0,0 +1,6 @@ +import "./unchanged-module.js"; +import "./unchanged-module.json"; +new URL("./unchanged-module.svg", import.meta.url); +import "external"; + +export default "2"; diff --git a/test/watchCases/cache/unsafe-cache/webpack.config.js b/test/watchCases/cache/unsafe-cache/webpack.config.js new file mode 100644 index 00000000000..edbb2155bad --- /dev/null +++ b/test/watchCases/cache/unsafe-cache/webpack.config.js @@ -0,0 +1,13 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "development", + cache: { + type: "memory" + }, + module: { + unsafeCache: true + }, + externals: { + external: "var 123" + } +}; diff --git a/test/watchCases/context/loader-context-dep/0/directory/.empty b/test/watchCases/context/loader-context-dep/0/directory/.empty new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/watchCases/context/loader-context-dep/0/index.js b/test/watchCases/context/loader-context-dep/0/index.js new file mode 100644 index 00000000000..3db5817d840 --- /dev/null +++ b/test/watchCases/context/loader-context-dep/0/index.js @@ -0,0 +1,4 @@ +it("should detect changes in a loader context dependency", function() { + var result = require("./loader!"); + expect(result.length).toBe(+WATCH_STEP % 3 + 1); +}); diff --git a/test/watchCases/context/loader-context-dep/0/loader.js b/test/watchCases/context/loader-context-dep/0/loader.js new file mode 100644 index 00000000000..039b13c4ca2 --- /dev/null +++ b/test/watchCases/context/loader-context-dep/0/loader.js @@ -0,0 +1,14 @@ +const path = require("path"); +const directory = path.resolve(__dirname, "directory"); + +/** @type {import("../../../../../").LoaderDefinition} */ +module.exports = function () { + this.addContextDependency(directory); + const callback = this.async(); + this.fs.readdir(directory, (err, _files) => { + if (err) return callback(err); + const files = /** @type {string[]} */ (_files); + files.sort(); + callback(null, `module.exports = ${JSON.stringify(files)};`); + }); +}; diff --git a/test/watchCases/context/loader-context-dep/1/directory/a.js b/test/watchCases/context/loader-context-dep/1/directory/a.js new file mode 100644 index 00000000000..86011574e3b --- /dev/null +++ b/test/watchCases/context/loader-context-dep/1/directory/a.js @@ -0,0 +1 @@ +// a diff --git a/test/watchCases/context/loader-context-dep/2/directory/b.js b/test/watchCases/context/loader-context-dep/2/directory/b.js new file mode 100644 index 00000000000..67654f2fdee --- /dev/null +++ b/test/watchCases/context/loader-context-dep/2/directory/b.js @@ -0,0 +1 @@ +// b diff --git a/test/watchCases/context/loader-context-dep/3/directory/a.js b/test/watchCases/context/loader-context-dep/3/directory/a.js new file mode 100644 index 00000000000..f42a9f0e7e1 --- /dev/null +++ b/test/watchCases/context/loader-context-dep/3/directory/a.js @@ -0,0 +1 @@ +DELETE diff --git a/test/watchCases/context/loader-context-dep/3/directory/b.js b/test/watchCases/context/loader-context-dep/3/directory/b.js new file mode 100644 index 00000000000..f42a9f0e7e1 --- /dev/null +++ b/test/watchCases/context/loader-context-dep/3/directory/b.js @@ -0,0 +1 @@ +DELETE diff --git a/test/watchCases/long-term-caching/issue-8766-with-cache/0/index.js b/test/watchCases/long-term-caching/issue-8766-with-cache/0/index.js new file mode 100644 index 00000000000..8965417323f --- /dev/null +++ b/test/watchCases/long-term-caching/issue-8766-with-cache/0/index.js @@ -0,0 +1,10 @@ +import { foo } from "./shared"; + +it("should compile fine", () => { + expect(foo).toBe("foo"); + STATE.hash = STATS_JSON.assetsByChunkName.async[0]; +}); + +it("should load the async chunk", () => { + return import(/* webpackChunkName: "async" */ "./other-chunk"); +}); diff --git a/test/watchCases/long-term-caching/issue-8766-with-cache/0/other-chunk.js b/test/watchCases/long-term-caching/issue-8766-with-cache/0/other-chunk.js new file mode 100644 index 00000000000..2cc14fb43c4 --- /dev/null +++ b/test/watchCases/long-term-caching/issue-8766-with-cache/0/other-chunk.js @@ -0,0 +1,3 @@ +import { foo } from "./shared"; + +if (Math.random() < 0) console.log(foo); diff --git a/test/watchCases/long-term-caching/issue-8766-with-cache/0/shared.js b/test/watchCases/long-term-caching/issue-8766-with-cache/0/shared.js new file mode 100644 index 00000000000..591700482e7 --- /dev/null +++ b/test/watchCases/long-term-caching/issue-8766-with-cache/0/shared.js @@ -0,0 +1,2 @@ +export const foo = "foo"; +export const bar = "bar"; diff --git a/test/watchCases/long-term-caching/issue-8766-with-cache/1/index.js b/test/watchCases/long-term-caching/issue-8766-with-cache/1/index.js new file mode 100644 index 00000000000..2497ee6506d --- /dev/null +++ b/test/watchCases/long-term-caching/issue-8766-with-cache/1/index.js @@ -0,0 +1,11 @@ +import { bar } from "./shared"; + +it("should compile fine", () => { + expect(bar).toBe("bar"); + const hash = STATS_JSON.assetsByChunkName.async[0]; + expect(hash).toBe(STATE.hash); +}); + +it("should load the async chunk", () => { + return import(/* webpackChunkName: "async" */ "./other-chunk"); +}); diff --git a/test/watchCases/long-term-caching/issue-8766-with-cache/webpack.config.js b/test/watchCases/long-term-caching/issue-8766-with-cache/webpack.config.js new file mode 100644 index 00000000000..5438f5e84a5 --- /dev/null +++ b/test/watchCases/long-term-caching/issue-8766-with-cache/webpack.config.js @@ -0,0 +1,8 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "production", + cache: true, + output: { + chunkFilename: "[contenthash].js" + } +}; diff --git a/test/watchCases/long-term-caching/issue-8766/0/index.js b/test/watchCases/long-term-caching/issue-8766/0/index.js new file mode 100644 index 00000000000..8965417323f --- /dev/null +++ b/test/watchCases/long-term-caching/issue-8766/0/index.js @@ -0,0 +1,10 @@ +import { foo } from "./shared"; + +it("should compile fine", () => { + expect(foo).toBe("foo"); + STATE.hash = STATS_JSON.assetsByChunkName.async[0]; +}); + +it("should load the async chunk", () => { + return import(/* webpackChunkName: "async" */ "./other-chunk"); +}); diff --git a/test/watchCases/long-term-caching/issue-8766/0/other-chunk.js b/test/watchCases/long-term-caching/issue-8766/0/other-chunk.js new file mode 100644 index 00000000000..2cc14fb43c4 --- /dev/null +++ b/test/watchCases/long-term-caching/issue-8766/0/other-chunk.js @@ -0,0 +1,3 @@ +import { foo } from "./shared"; + +if (Math.random() < 0) console.log(foo); diff --git a/test/watchCases/long-term-caching/issue-8766/0/shared.js b/test/watchCases/long-term-caching/issue-8766/0/shared.js new file mode 100644 index 00000000000..591700482e7 --- /dev/null +++ b/test/watchCases/long-term-caching/issue-8766/0/shared.js @@ -0,0 +1,2 @@ +export const foo = "foo"; +export const bar = "bar"; diff --git a/test/watchCases/long-term-caching/issue-8766/1/index.js b/test/watchCases/long-term-caching/issue-8766/1/index.js new file mode 100644 index 00000000000..2497ee6506d --- /dev/null +++ b/test/watchCases/long-term-caching/issue-8766/1/index.js @@ -0,0 +1,11 @@ +import { bar } from "./shared"; + +it("should compile fine", () => { + expect(bar).toBe("bar"); + const hash = STATS_JSON.assetsByChunkName.async[0]; + expect(hash).toBe(STATE.hash); +}); + +it("should load the async chunk", () => { + return import(/* webpackChunkName: "async" */ "./other-chunk"); +}); diff --git a/test/watchCases/long-term-caching/issue-8766/webpack.config.js b/test/watchCases/long-term-caching/issue-8766/webpack.config.js new file mode 100644 index 00000000000..b3c40d3396b --- /dev/null +++ b/test/watchCases/long-term-caching/issue-8766/webpack.config.js @@ -0,0 +1,7 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "production", + output: { + chunkFilename: "[contenthash].js" + } +}; diff --git a/test/watchCases/plugins/automatic-prefetch-plugin-9485/0/delayed.js b/test/watchCases/plugins/automatic-prefetch-plugin-9485/0/delayed.js new file mode 100644 index 00000000000..0696fcd6ae0 --- /dev/null +++ b/test/watchCases/plugins/automatic-prefetch-plugin-9485/0/delayed.js @@ -0,0 +1 @@ +})] diff --git a/test/watchCases/plugins/automatic-prefetch-plugin-9485/0/foo/0.js b/test/watchCases/plugins/automatic-prefetch-plugin-9485/0/foo/0.js new file mode 100644 index 00000000000..61dfec6b18a --- /dev/null +++ b/test/watchCases/plugins/automatic-prefetch-plugin-9485/0/foo/0.js @@ -0,0 +1 @@ +module.exports = '0'; diff --git a/test/watchCases/plugins/automatic-prefetch-plugin-9485/0/foo/a.js b/test/watchCases/plugins/automatic-prefetch-plugin-9485/0/foo/a.js new file mode 100644 index 00000000000..252028035af --- /dev/null +++ b/test/watchCases/plugins/automatic-prefetch-plugin-9485/0/foo/a.js @@ -0,0 +1 @@ +module.exports = "This "; diff --git a/test/watchCases/plugins/automatic-prefetch-plugin-9485/0/foo/b.js b/test/watchCases/plugins/automatic-prefetch-plugin-9485/0/foo/b.js new file mode 100644 index 00000000000..14485a976a2 --- /dev/null +++ b/test/watchCases/plugins/automatic-prefetch-plugin-9485/0/foo/b.js @@ -0,0 +1 @@ +module.exports = "is only "; diff --git a/test/watchCases/plugins/automatic-prefetch-plugin-9485/0/foo/c.js b/test/watchCases/plugins/automatic-prefetch-plugin-9485/0/foo/c.js new file mode 100644 index 00000000000..910a0111794 --- /dev/null +++ b/test/watchCases/plugins/automatic-prefetch-plugin-9485/0/foo/c.js @@ -0,0 +1 @@ +module.exports = "a test"; diff --git a/test/watchCases/plugins/automatic-prefetch-plugin-9485/0/index.js b/test/watchCases/plugins/automatic-prefetch-plugin-9485/0/index.js new file mode 100644 index 00000000000..da329579cd1 --- /dev/null +++ b/test/watchCases/plugins/automatic-prefetch-plugin-9485/0/index.js @@ -0,0 +1,10 @@ +it("should watch for changes", function () { + if (+WATCH_STEP !== 3) expect(require("./delayed")).toBe(WATCH_STEP); + else expect(require("./delayed")).toBe("This is only a test." + WATCH_STEP); + if (+WATCH_STEP > 0) { + for (var m of STATS_JSON.modules.filter(m => + /(a|b|c)\.js$/.test(m.identifier) + )) + expect(m.issuer).toBe(null); + } +}); diff --git a/test/watchCases/plugins/automatic-prefetch-plugin-9485/1/foo/1.js b/test/watchCases/plugins/automatic-prefetch-plugin-9485/1/foo/1.js new file mode 100644 index 00000000000..4ac32c71327 --- /dev/null +++ b/test/watchCases/plugins/automatic-prefetch-plugin-9485/1/foo/1.js @@ -0,0 +1 @@ +module.exports = '1'; diff --git a/test/watchCases/plugins/automatic-prefetch-plugin-9485/2/foo/2.js b/test/watchCases/plugins/automatic-prefetch-plugin-9485/2/foo/2.js new file mode 100644 index 00000000000..2db2c90b9d6 --- /dev/null +++ b/test/watchCases/plugins/automatic-prefetch-plugin-9485/2/foo/2.js @@ -0,0 +1 @@ +module.exports = '2'; diff --git a/test/watchCases/plugins/automatic-prefetch-plugin-9485/3/foo/3.js b/test/watchCases/plugins/automatic-prefetch-plugin-9485/3/foo/3.js new file mode 100644 index 00000000000..63e585f4129 --- /dev/null +++ b/test/watchCases/plugins/automatic-prefetch-plugin-9485/3/foo/3.js @@ -0,0 +1,5 @@ +var a = require("./a"); +var b = require("./b"); +var c = require("./c"); + +module.exports = a + b + c + '.3'; diff --git a/test/watchCases/plugins/automatic-prefetch-plugin-9485/delayed.js b/test/watchCases/plugins/automatic-prefetch-plugin-9485/delayed.js new file mode 100644 index 00000000000..9c95b9ad3ba --- /dev/null +++ b/test/watchCases/plugins/automatic-prefetch-plugin-9485/delayed.js @@ -0,0 +1,9 @@ +module.exports = function (source) { + expect(source).toMatch(/^\}\)\]/); + this.cacheable(false); + return new Promise(resolve => { + setTimeout(() => { + resolve("module.exports = require('./foo/' + WATCH_STEP);"); + }, 500); + }); +}; diff --git a/test/watchCases/plugins/automatic-prefetch-plugin-9485/webpack.config.js b/test/watchCases/plugins/automatic-prefetch-plugin-9485/webpack.config.js new file mode 100644 index 00000000000..cfc6b797db9 --- /dev/null +++ b/test/watchCases/plugins/automatic-prefetch-plugin-9485/webpack.config.js @@ -0,0 +1,15 @@ +const path = require("path"); +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + module: { + rules: [ + { + test: /delayed/, + use: path.resolve(__dirname, "./delayed") + } + ] + }, + plugins: [new webpack.AutomaticPrefetchPlugin()] +}; diff --git a/test/watchCases/plugins/automatic-prefetch-plugin/0/delayed.js b/test/watchCases/plugins/automatic-prefetch-plugin/0/delayed.js new file mode 100644 index 00000000000..39cd50b34ef --- /dev/null +++ b/test/watchCases/plugins/automatic-prefetch-plugin/0/delayed.js @@ -0,0 +1,8 @@ +module.exports = function() { + this.cacheable(false); + return new Promise(resolve => { + setTimeout(() => { + resolve("module.exports = require('./foo/' + WATCH_STEP);"); + }, 500); + }); +} diff --git a/test/watchCases/plugins/automatic-prefetch-plugin/0/foo/0.js b/test/watchCases/plugins/automatic-prefetch-plugin/0/foo/0.js index 02c256b22d7..61dfec6b18a 100644 --- a/test/watchCases/plugins/automatic-prefetch-plugin/0/foo/0.js +++ b/test/watchCases/plugins/automatic-prefetch-plugin/0/foo/0.js @@ -1,5 +1 @@ -var a = require("./a"); -var b = require("./b"); -var c = require("./c"); - -module.exports = a + b + c + '.0'; +module.exports = '0'; diff --git a/test/watchCases/plugins/automatic-prefetch-plugin/0/index.js b/test/watchCases/plugins/automatic-prefetch-plugin/0/index.js index 1af08ab64ad..512aac7e3b7 100644 --- a/test/watchCases/plugins/automatic-prefetch-plugin/0/index.js +++ b/test/watchCases/plugins/automatic-prefetch-plugin/0/index.js @@ -1,7 +1,10 @@ it("should watch for changes", function() { - expect(require("./foo/" + WATCH_STEP)).toBe('This is only a test.' + WATCH_STEP); + if(+WATCH_STEP !== 3) + expect(require("./delayed!./delayed")).toBe(WATCH_STEP); + else + expect(require("./delayed!./delayed")).toBe('This is only a test.' + WATCH_STEP); if(+WATCH_STEP > 0) { for(var m of STATS_JSON.modules.filter(m => /(a|b|c)\.js$/.test(m.identifier))) - expect(m.prefetched).toBe(true); + expect(m.issuer).toBe(null); } }); diff --git a/test/watchCases/plugins/automatic-prefetch-plugin/1/foo/1.js b/test/watchCases/plugins/automatic-prefetch-plugin/1/foo/1.js index 47ee172bb39..4ac32c71327 100644 --- a/test/watchCases/plugins/automatic-prefetch-plugin/1/foo/1.js +++ b/test/watchCases/plugins/automatic-prefetch-plugin/1/foo/1.js @@ -1,5 +1 @@ -var a = require("./a"); -var b = require("./b"); -var c = require("./c"); - -module.exports = a + b + c + '.1'; +module.exports = '1'; diff --git a/test/watchCases/plugins/automatic-prefetch-plugin/2/foo/2.js b/test/watchCases/plugins/automatic-prefetch-plugin/2/foo/2.js index bdd8cf1fe5d..2db2c90b9d6 100644 --- a/test/watchCases/plugins/automatic-prefetch-plugin/2/foo/2.js +++ b/test/watchCases/plugins/automatic-prefetch-plugin/2/foo/2.js @@ -1,5 +1 @@ -var a = require("./a"); -var b = require("./b"); -var c = require("./c"); - -module.exports = a + b + c + '.2'; +module.exports = '2'; diff --git a/test/watchCases/plugins/automatic-prefetch-plugin/webpack.config.js b/test/watchCases/plugins/automatic-prefetch-plugin/webpack.config.js index a33728b6c3b..6b46d011d33 100644 --- a/test/watchCases/plugins/automatic-prefetch-plugin/webpack.config.js +++ b/test/watchCases/plugins/automatic-prefetch-plugin/webpack.config.js @@ -1,4 +1,6 @@ -var webpack = require("../../../../"); +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ module.exports = { plugins: [new webpack.AutomaticPrefetchPlugin()] }; diff --git a/test/watchCases/plugins/define-plugin/0/index.js b/test/watchCases/plugins/define-plugin/0/index.js index fae807688d4..5c15b91ba8c 100644 --- a/test/watchCases/plugins/define-plugin/0/index.js +++ b/test/watchCases/plugins/define-plugin/0/index.js @@ -1,23 +1,52 @@ -it("should be able to use dynamic defines in watch mode", function() { +it("should be able to use dynamic defines in watch mode", function () { const module = require("./module"); - expect(module).toEqual(nsObj({ - default: WATCH_STEP, - type: "string" - })); + expect(module).toEqual( + nsObj({ + default: WATCH_STEP, + type: "string" + }) + ); }); -it("should not update a define when dependencies list is missing", function() { +it("should not update a define when dependencies list is missing", function () { const module2 = require("./module2"); - expect(module2).toEqual(nsObj({ - default: "0", - type: "string" - })); + expect(module2).toEqual( + nsObj({ + default: "0", + type: "string" + }) + ); }); -it("should update always when fileDependencies is true", function() { +it("should update always when fileDependencies is true", function () { const module3 = require("./module3"); - expect(module3).toEqual(nsObj({ - default: WATCH_STEP, - type: "string" - })); + expect(module3).toEqual( + nsObj({ + default: WATCH_STEP, + type: "string" + }) + ); +}); + +it("should allow to use an options object with fileDependencies", function () { + const module4 = require("./module4"); + expect(module4).toEqual( + nsObj({ + default: WATCH_STEP, + type: "string" + }) + ); +}); + +it("should allow to use an options object with dynamic version", function () { + const module5 = require("./module5"); + expect(module5).toEqual( + nsObj({ + default: { + version: WATCH_STEP, + key: "TEST_VALUE5" + }, + type: "object" + }) + ); }); diff --git a/test/watchCases/plugins/define-plugin/0/module4.js b/test/watchCases/plugins/define-plugin/0/module4.js new file mode 100644 index 00000000000..47f6d73ae91 --- /dev/null +++ b/test/watchCases/plugins/define-plugin/0/module4.js @@ -0,0 +1,2 @@ +export default TEST_VALUE4; +export const type = typeof TEST_VALUE4; diff --git a/test/watchCases/plugins/define-plugin/0/module5.js b/test/watchCases/plugins/define-plugin/0/module5.js new file mode 100644 index 00000000000..ea6a7173869 --- /dev/null +++ b/test/watchCases/plugins/define-plugin/0/module5.js @@ -0,0 +1,2 @@ +export default TEST_VALUE5; +export const type = typeof TEST_VALUE5; diff --git a/test/watchCases/plugins/define-plugin/webpack.config.js b/test/watchCases/plugins/define-plugin/webpack.config.js index 31a075ce7c2..927b02be100 100644 --- a/test/watchCases/plugins/define-plugin/webpack.config.js +++ b/test/watchCases/plugins/define-plugin/webpack.config.js @@ -1,25 +1,38 @@ const path = require("path"); const fs = require("fs"); const webpack = require("../../../../"); -const valueFile = path.resolve( - __dirname, - "../../../js/watch-src/plugins/define-plugin/value.txt" -); -module.exports = { - plugins: [ - new webpack.DefinePlugin({ - TEST_VALUE: webpack.DefinePlugin.runtimeValue( - () => { - return JSON.stringify(fs.readFileSync(valueFile, "utf-8").trim()); - }, - [valueFile] - ), - TEST_VALUE2: webpack.DefinePlugin.runtimeValue(() => { - return JSON.stringify(fs.readFileSync(valueFile, "utf-8").trim()); - }, []), - TEST_VALUE3: webpack.DefinePlugin.runtimeValue(() => { - return JSON.stringify(fs.readFileSync(valueFile, "utf-8").trim()); - }, true) - }) - ] + +/** @type {(env: Env, options: TestOptions) => import("../../../../").Configuration} */ +module.exports = (env, { srcPath }) => { + const valueFile = path.resolve(srcPath, "value.txt"); + return { + plugins: [ + new webpack.DefinePlugin({ + TEST_VALUE: webpack.DefinePlugin.runtimeValue( + () => JSON.stringify(fs.readFileSync(valueFile, "utf-8").trim()), + [valueFile] + ), + TEST_VALUE2: webpack.DefinePlugin.runtimeValue( + () => JSON.stringify(fs.readFileSync(valueFile, "utf-8").trim()), + [] + ), + TEST_VALUE3: webpack.DefinePlugin.runtimeValue( + () => JSON.stringify(fs.readFileSync(valueFile, "utf-8").trim()), + true + ), + TEST_VALUE4: webpack.DefinePlugin.runtimeValue( + () => JSON.stringify(fs.readFileSync(valueFile, "utf-8").trim()), + { + fileDependencies: [valueFile] + } + ), + TEST_VALUE5: webpack.DefinePlugin.runtimeValue( + ({ version, key }) => JSON.stringify({ version, key }), + { + version: () => fs.readFileSync(valueFile, "utf-8").trim() + } + ) + }) + ] + }; }; diff --git a/test/watchCases/plugins/dll-reference-plugin/webpack.config.js b/test/watchCases/plugins/dll-reference-plugin/webpack.config.js index 14a6d08ccfe..9f4b18a4b3d 100644 --- a/test/watchCases/plugins/dll-reference-plugin/webpack.config.js +++ b/test/watchCases/plugins/dll-reference-plugin/webpack.config.js @@ -1,4 +1,6 @@ -var webpack = require("../../../../"); +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ module.exports = { plugins: [ new webpack.DllReferencePlugin({ diff --git a/test/watchCases/plugins/mini-css-extract-plugin/1/a.css b/test/watchCases/plugins/mini-css-extract-plugin/1/a.css new file mode 100644 index 00000000000..8cbf1faa6cd --- /dev/null +++ b/test/watchCases/plugins/mini-css-extract-plugin/1/a.css @@ -0,0 +1,5 @@ +@import "./dependency.css"; + +.a { + color: red; +} diff --git a/test/watchCases/plugins/mini-css-extract-plugin/1/b.css b/test/watchCases/plugins/mini-css-extract-plugin/1/b.css new file mode 100644 index 00000000000..869690c300d --- /dev/null +++ b/test/watchCases/plugins/mini-css-extract-plugin/1/b.css @@ -0,0 +1,3 @@ +.b { + color: red; +} diff --git a/test/watchCases/plugins/mini-css-extract-plugin/1/chunk.css b/test/watchCases/plugins/mini-css-extract-plugin/1/chunk.css new file mode 100644 index 00000000000..aad283b7bca --- /dev/null +++ b/test/watchCases/plugins/mini-css-extract-plugin/1/chunk.css @@ -0,0 +1,5 @@ +@import "./dependency.css"; + +.chunk { + color: red; +} diff --git a/test/watchCases/plugins/mini-css-extract-plugin/1/chunk.js b/test/watchCases/plugins/mini-css-extract-plugin/1/chunk.js new file mode 100644 index 00000000000..c7300ee6e93 --- /dev/null +++ b/test/watchCases/plugins/mini-css-extract-plugin/1/chunk.js @@ -0,0 +1 @@ +import "./chunk.css"; diff --git a/test/watchCases/plugins/mini-css-extract-plugin/1/dependency.css b/test/watchCases/plugins/mini-css-extract-plugin/1/dependency.css new file mode 100644 index 00000000000..9e006e4b0c5 --- /dev/null +++ b/test/watchCases/plugins/mini-css-extract-plugin/1/dependency.css @@ -0,0 +1,3 @@ +.dependency { + color: red; +} diff --git a/test/watchCases/plugins/mini-css-extract-plugin/1/index.js b/test/watchCases/plugins/mini-css-extract-plugin/1/index.js new file mode 100644 index 00000000000..4da984abe4d --- /dev/null +++ b/test/watchCases/plugins/mini-css-extract-plugin/1/index.js @@ -0,0 +1,69 @@ +import "./a.css"; +import "./b.css"; + +const fs = __non_webpack_require__("fs"); +const path = __non_webpack_require__("path"); + +it("should load a chunk with css", () => { + const linkStart = document.getElementsByTagName("link").length; + const scriptStart = document.getElementsByTagName("script").length; + const promise = import("./chunk"); + + const links = document.getElementsByTagName("link").slice(linkStart); + const scripts = document.getElementsByTagName("script").slice(scriptStart); + + expect(links.length).toBe(1); + expect(scripts.length).toBe(1); + links[0].onload({ type: "load" }); + __non_webpack_require__( + scripts[0].src.replace("https://test.cases/path", ".") + ); + + const css = fs + .readFileSync( + path.resolve( + __dirname, + links[0].href.replace("https://test.cases/path", ".") + ), + "utf-8" + ) + .trim(); + expect(css).toMatchInlineSnapshot(` + ".chunk { + color: red; + }" + `); + + return promise; +}); + +it("should generate correct css", () => { + const css = fs + .readFileSync(path.resolve(__dirname, "main.css"), "utf-8") + .trim(); + expect(css).toMatchInlineSnapshot(` + ".dependency { + color: ${WATCH_STEP === "1" ? "red" : "green"}; + } + + .a { + color: red; + } + + .b { + color: ${WATCH_STEP === "1" ? "red" : "green"}; + }" + `); +}); + +if (WATCH_STEP !== "1") { + it("should not emit javascript again", () => { + expect( + STATS_JSON.assets.filter(a => a.name.endsWith(".js")) + ).not.toContainEqual( + expect.objectContaining({ + cached: false + }) + ); + }); +} diff --git a/test/watchCases/plugins/mini-css-extract-plugin/2/b.css b/test/watchCases/plugins/mini-css-extract-plugin/2/b.css new file mode 100644 index 00000000000..a4710ab8618 --- /dev/null +++ b/test/watchCases/plugins/mini-css-extract-plugin/2/b.css @@ -0,0 +1,3 @@ +.b { + color: green; +} diff --git a/test/watchCases/plugins/mini-css-extract-plugin/2/dependency.css b/test/watchCases/plugins/mini-css-extract-plugin/2/dependency.css new file mode 100644 index 00000000000..b0c6c9c5b88 --- /dev/null +++ b/test/watchCases/plugins/mini-css-extract-plugin/2/dependency.css @@ -0,0 +1,3 @@ +.dependency { + color: green; +} diff --git a/test/watchCases/plugins/mini-css-extract-plugin/webpack.config.js b/test/watchCases/plugins/mini-css-extract-plugin/webpack.config.js new file mode 100644 index 00000000000..bb8848ce287 --- /dev/null +++ b/test/watchCases/plugins/mini-css-extract-plugin/webpack.config.js @@ -0,0 +1,22 @@ +const MCEP = require("mini-css-extract-plugin"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + module: { + rules: [ + { + test: /\.css$/, + use: [MCEP.loader, "css-loader"] + } + ] + }, + output: { + publicPath: "", + pathinfo: false + }, + target: "web", + node: { + __dirname: false + }, + plugins: [new MCEP()] +}; diff --git a/test/watchCases/plugins/module-concatenation-plugin/0/index.js b/test/watchCases/plugins/module-concatenation-plugin/0/index.js index 43d5e57af72..a60e2e2480d 100644 --- a/test/watchCases/plugins/module-concatenation-plugin/0/index.js +++ b/test/watchCases/plugins/module-concatenation-plugin/0/index.js @@ -1,13 +1,20 @@ -it("should watch for changes", function() { - if(WATCH_STEP === '0') { - expect(require("./foo/" + WATCH_STEP)).toBe('This is only a test.' + WATCH_STEP); - } - else if(WATCH_STEP === '1') { - expect(require("./foo/" + WATCH_STEP)).toBe('This should be a test.' + WATCH_STEP); - } - else if(WATCH_STEP === '2') { - expect(require("./foo/" + WATCH_STEP)).toBe('This should be working.' + WATCH_STEP); +it("should watch for changes", function () { + if (WATCH_STEP === "0") { + expect(require("./foo/" + WATCH_STEP)).toBe( + "This is only a test." + WATCH_STEP + ); + } else if (WATCH_STEP === "1") { + expect(require("./foo/" + WATCH_STEP)).toBe( + "This should be a test." + WATCH_STEP + ); + } else if (WATCH_STEP === "2") { + expect(require("./foo/" + WATCH_STEP)).toBe( + "This should be working." + WATCH_STEP + ); } - expect(STATS_JSON.modules.length).toBe(4 + Number(WATCH_STEP)); + const realModule = m => m.moduleType !== "runtime" && !m.orphan; + expect(STATS_JSON.modules.filter(realModule).length).toBe( + 4 + Number(WATCH_STEP) + ); }); diff --git a/test/watchCases/plugins/module-concatenation-plugin/webpack.config.js b/test/watchCases/plugins/module-concatenation-plugin/webpack.config.js index b913c78abb1..dffc81bba10 100644 --- a/test/watchCases/plugins/module-concatenation-plugin/webpack.config.js +++ b/test/watchCases/plugins/module-concatenation-plugin/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { mode: "production" }; diff --git a/test/watchCases/plugins/profiling-plugin/0/index.js b/test/watchCases/plugins/profiling-plugin/0/index.js new file mode 100644 index 00000000000..cecdb3b9c59 --- /dev/null +++ b/test/watchCases/plugins/profiling-plugin/0/index.js @@ -0,0 +1,3 @@ +it("compiles", function() { + expect(WATCH_STEP).toBe("0"); +}) \ No newline at end of file diff --git a/test/watchCases/plugins/profiling-plugin/1/index.js b/test/watchCases/plugins/profiling-plugin/1/index.js new file mode 100644 index 00000000000..5e1eb9ebdba --- /dev/null +++ b/test/watchCases/plugins/profiling-plugin/1/index.js @@ -0,0 +1,3 @@ +it("should not crash on recompile", function() { + expect(WATCH_STEP).toBe("1"); +}) diff --git a/test/watchCases/plugins/profiling-plugin/deprecations.js b/test/watchCases/plugins/profiling-plugin/deprecations.js new file mode 100644 index 00000000000..dee16addc3f --- /dev/null +++ b/test/watchCases/plugins/profiling-plugin/deprecations.js @@ -0,0 +1,3 @@ +module.exports = [ + { code: /DEP_WEBPACK_COMPILATION_NORMAL_MODULE_LOADER_HOOK/ } +]; diff --git a/test/watchCases/plugins/profiling-plugin/webpack.config.js b/test/watchCases/plugins/profiling-plugin/webpack.config.js new file mode 100644 index 00000000000..0395d66871e --- /dev/null +++ b/test/watchCases/plugins/profiling-plugin/webpack.config.js @@ -0,0 +1,6 @@ +const webpack = require("../../../../"); + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [new webpack.debug.ProfilingPlugin()] +}; diff --git a/test/watchCases/plugins/watch-ignore-plugin/webpack.config.js b/test/watchCases/plugins/watch-ignore-plugin/webpack.config.js index a24d87e2f09..076857a06a5 100644 --- a/test/watchCases/plugins/watch-ignore-plugin/webpack.config.js +++ b/test/watchCases/plugins/watch-ignore-plugin/webpack.config.js @@ -1,5 +1,6 @@ -var webpack = require("../../../../"); +const webpack = require("../../../../"); +/** @type {import("../../../../").Configuration} */ module.exports = { - plugins: [new webpack.WatchIgnorePlugin([/file\.js$/, /foo$/])] + plugins: [new webpack.WatchIgnorePlugin({ paths: [/file\.js$/, /foo$/] })] }; diff --git a/test/watchCases/recover-from-error/missing-module/0/errors.js b/test/watchCases/recover-from-error/missing-module/0/errors.js index 08c3cac4eed..8a65e54f089 100644 --- a/test/watchCases/recover-from-error/missing-module/0/errors.js +++ b/test/watchCases/recover-from-error/missing-module/0/errors.js @@ -1,3 +1 @@ -module.exports = [ - [/Module not found/, /Can't resolve 'some-module' /] -]; +module.exports = [[/Module not found/, /Can't resolve 'some-module' /]]; diff --git a/test/watchCases/recover-from-error/parse-failed-esm/0/errors.js b/test/watchCases/recover-from-error/parse-failed-esm/0/errors.js new file mode 100644 index 00000000000..534e9facc4c --- /dev/null +++ b/test/watchCases/recover-from-error/parse-failed-esm/0/errors.js @@ -0,0 +1 @@ +module.exports = [[/Module parse failed/]]; diff --git a/test/watchCases/recover-from-error/parse-failed-esm/0/index.js b/test/watchCases/recover-from-error/parse-failed-esm/0/index.js new file mode 100644 index 00000000000..15d7eae2373 --- /dev/null +++ b/test/watchCases/recover-from-error/parse-failed-esm/0/index.js @@ -0,0 +1,26 @@ +it("should recover from syntax error in module", async () => { + switch (WATCH_STEP) { + case "0": + case "2": + await expect(import("test-module")).rejects.toEqual( + expect.objectContaining({ + message: expect.stringContaining("Module parse failed") + }) + ); + break; + case "1": + await expect(import("test-module")).resolves.toEqual( + expect.objectContaining({ + default: 42 + }) + ); + break; + case "3": + await expect(import("test-module")).resolves.toEqual( + expect.objectContaining({ + default: 43 + }) + ); + break; + } +}); diff --git a/test/watchCases/recover-from-error/parse-failed-esm/0/node_modules/some-module/index.js b/test/watchCases/recover-from-error/parse-failed-esm/0/node_modules/some-module/index.js new file mode 100644 index 00000000000..b31ea6eacda --- /dev/null +++ b/test/watchCases/recover-from-error/parse-failed-esm/0/node_modules/some-module/index.js @@ -0,0 +1 @@ +export default 42*; diff --git a/test/watchCases/recover-from-error/parse-failed-esm/0/node_modules/test-module/index.js b/test/watchCases/recover-from-error/parse-failed-esm/0/node_modules/test-module/index.js new file mode 100644 index 00000000000..38445fe6e0d --- /dev/null +++ b/test/watchCases/recover-from-error/parse-failed-esm/0/node_modules/test-module/index.js @@ -0,0 +1 @@ +export { default as default } from "some-module"; diff --git a/test/watchCases/recover-from-error/parse-failed-esm/1/node_modules/some-module/index.js b/test/watchCases/recover-from-error/parse-failed-esm/1/node_modules/some-module/index.js new file mode 100644 index 00000000000..7a4e8a723a4 --- /dev/null +++ b/test/watchCases/recover-from-error/parse-failed-esm/1/node_modules/some-module/index.js @@ -0,0 +1 @@ +export default 42; diff --git a/test/watchCases/recover-from-error/parse-failed-esm/2/errors.js b/test/watchCases/recover-from-error/parse-failed-esm/2/errors.js new file mode 100644 index 00000000000..534e9facc4c --- /dev/null +++ b/test/watchCases/recover-from-error/parse-failed-esm/2/errors.js @@ -0,0 +1 @@ +module.exports = [[/Module parse failed/]]; diff --git a/test/watchCases/recover-from-error/parse-failed-esm/2/node_modules/some-module/index.js b/test/watchCases/recover-from-error/parse-failed-esm/2/node_modules/some-module/index.js new file mode 100644 index 00000000000..b31ea6eacda --- /dev/null +++ b/test/watchCases/recover-from-error/parse-failed-esm/2/node_modules/some-module/index.js @@ -0,0 +1 @@ +export default 42*; diff --git a/test/watchCases/recover-from-error/parse-failed-esm/3/node_modules/some-module/index.js b/test/watchCases/recover-from-error/parse-failed-esm/3/node_modules/some-module/index.js new file mode 100644 index 00000000000..8efc7299424 --- /dev/null +++ b/test/watchCases/recover-from-error/parse-failed-esm/3/node_modules/some-module/index.js @@ -0,0 +1 @@ +export default 43; diff --git a/test/watchCases/resolve/in-loader/0/file.js b/test/watchCases/resolve/in-loader/0/file.js new file mode 100644 index 00000000000..0f57817f75f --- /dev/null +++ b/test/watchCases/resolve/in-loader/0/file.js @@ -0,0 +1 @@ +0; diff --git a/test/watchCases/resolve/in-loader/0/index.js b/test/watchCases/resolve/in-loader/0/index.js new file mode 100644 index 00000000000..1f1e695c057 --- /dev/null +++ b/test/watchCases/resolve/in-loader/0/index.js @@ -0,0 +1,5 @@ +import value from "./loader!./loader"; + +it("should resolve to the correct file", () => { + expect(value).toBe(`${WATCH_STEP};`); +}); diff --git a/test/watchCases/resolve/in-loader/0/loader.js b/test/watchCases/resolve/in-loader/0/loader.js new file mode 100644 index 00000000000..ac9321e55d0 --- /dev/null +++ b/test/watchCases/resolve/in-loader/0/loader.js @@ -0,0 +1,15 @@ +/** @type {import("../../../../../").LoaderDefinition} */ +module.exports = function () { + const callback = this.async(); + this.resolve(this.context, "./file", (err, file) => { + if (err) return callback(err); + if (!file) return callback(new Error("Resolving failed")); + this.fs.readFile(file, (err, result) => { + if (err) return callback(err); + callback( + null, + `export default ${JSON.stringify(/** @type {Buffer} */ (result).toString("utf-8").trim())};` + ); + }); + }); +}; diff --git a/test/watchCases/resolve/in-loader/1/file b/test/watchCases/resolve/in-loader/1/file new file mode 100644 index 00000000000..0afc6045cfe --- /dev/null +++ b/test/watchCases/resolve/in-loader/1/file @@ -0,0 +1 @@ +1; diff --git a/test/watchCases/runtime/dynamic-import/webpack.config.js b/test/watchCases/runtime/dynamic-import/webpack.config.js index 019baa474ce..b536f6cfe5e 100644 --- a/test/watchCases/runtime/dynamic-import/webpack.config.js +++ b/test/watchCases/runtime/dynamic-import/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { output: { chunkFilename: "[name].[chunkhash].js" diff --git a/test/watchCases/runtime/static-import/test.config.js b/test/watchCases/runtime/static-import/test.config.js index 3d9533c7394..3080b9d1ebf 100644 --- a/test/watchCases/runtime/static-import/test.config.js +++ b/test/watchCases/runtime/static-import/test.config.js @@ -1,6 +1,3 @@ module.exports = { - bundlePath: [ - "./runtime~main.js", - "./main.js" - ] + bundlePath: ["./runtime~main.js", "./main.js"] }; diff --git a/test/watchCases/runtime/static-import/webpack.config.js b/test/watchCases/runtime/static-import/webpack.config.js index 22f0a470f8b..c95208c176b 100644 --- a/test/watchCases/runtime/static-import/webpack.config.js +++ b/test/watchCases/runtime/static-import/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { output: { filename: "[name].js" diff --git a/test/watchCases/scope-hoisting/caching-inner-source/webpack.config.js b/test/watchCases/scope-hoisting/caching-inner-source/webpack.config.js index 59e948b1212..c939ba33f61 100644 --- a/test/watchCases/scope-hoisting/caching-inner-source/webpack.config.js +++ b/test/watchCases/scope-hoisting/caching-inner-source/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { optimization: { concatenateModules: true diff --git a/test/watchCases/sharing/provide-unsafe-cache/0/index.js b/test/watchCases/sharing/provide-unsafe-cache/0/index.js new file mode 100644 index 00000000000..3925ed384ed --- /dev/null +++ b/test/watchCases/sharing/provide-unsafe-cache/0/index.js @@ -0,0 +1,9 @@ +import "./unrelated"; + +it("should provide a module even when watching", () => + import("package").then(async ({ default: value }) => { + await __webpack_init_sharing__("default"); + expect(value).toBe("package"); + const pkg = __webpack_share_scopes__.default.package["1.2.3"]; + expect(pkg).toBeTypeOf("object"); + })); diff --git a/test/watchCases/sharing/provide-unsafe-cache/0/node_modules/package/index.js b/test/watchCases/sharing/provide-unsafe-cache/0/node_modules/package/index.js new file mode 100644 index 00000000000..7f3e455325f --- /dev/null +++ b/test/watchCases/sharing/provide-unsafe-cache/0/node_modules/package/index.js @@ -0,0 +1 @@ +export default "package"; diff --git a/test/watchCases/sharing/provide-unsafe-cache/0/node_modules/package/package.json b/test/watchCases/sharing/provide-unsafe-cache/0/node_modules/package/package.json new file mode 100644 index 00000000000..a510e8069cc --- /dev/null +++ b/test/watchCases/sharing/provide-unsafe-cache/0/node_modules/package/package.json @@ -0,0 +1,3 @@ +{ + "version": "1.2.3" +} diff --git a/test/watchCases/sharing/provide-unsafe-cache/0/unrelated.js b/test/watchCases/sharing/provide-unsafe-cache/0/unrelated.js new file mode 100644 index 00000000000..f05882b96f2 --- /dev/null +++ b/test/watchCases/sharing/provide-unsafe-cache/0/unrelated.js @@ -0,0 +1,2 @@ +export default 1; +console.log.bind(console); diff --git a/test/watchCases/sharing/provide-unsafe-cache/1/unrelated.js b/test/watchCases/sharing/provide-unsafe-cache/1/unrelated.js new file mode 100644 index 00000000000..e9822f8e25d --- /dev/null +++ b/test/watchCases/sharing/provide-unsafe-cache/1/unrelated.js @@ -0,0 +1,2 @@ +export default 2; +console.log.bind(console); diff --git a/test/watchCases/sharing/provide-unsafe-cache/webpack.config.js b/test/watchCases/sharing/provide-unsafe-cache/webpack.config.js new file mode 100644 index 00000000000..efd2c99705b --- /dev/null +++ b/test/watchCases/sharing/provide-unsafe-cache/webpack.config.js @@ -0,0 +1,10 @@ +const { ProvideSharedPlugin } = require("../../../../").sharing; + +/** @type {import("../../../../").Configuration} */ +module.exports = { + plugins: [ + new ProvideSharedPlugin({ + provides: ["package"] + }) + ] +}; diff --git a/test/watchCases/side-effects/issue-7400/test.filter.js b/test/watchCases/side-effects/issue-7400/test.filter.js new file mode 100644 index 00000000000..87860f28c19 --- /dev/null +++ b/test/watchCases/side-effects/issue-7400/test.filter.js @@ -0,0 +1,3 @@ +module.exports = function (config) { + return !(config.experiments && config.experiments.cacheUnaffected); +}; diff --git a/test/watchCases/side-effects/issue-7400/webpack.config.js b/test/watchCases/side-effects/issue-7400/webpack.config.js index 2bd35aa7c7e..58251b86aef 100644 --- a/test/watchCases/side-effects/issue-7400/webpack.config.js +++ b/test/watchCases/side-effects/issue-7400/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration} */ module.exports = { optimization: { sideEffects: true diff --git a/test/watchCases/simple/multi-compiler/webpack.config.js b/test/watchCases/simple/multi-compiler/webpack.config.js index 24bc32acac3..1c53840c393 100644 --- a/test/watchCases/simple/multi-compiler/webpack.config.js +++ b/test/watchCases/simple/multi-compiler/webpack.config.js @@ -1,3 +1,4 @@ +/** @type {import("../../../../").Configuration[]} */ module.exports = [ { name: "changing", diff --git a/test/watchCases/simple/production/0/changing-file.js b/test/watchCases/simple/production/0/changing-file.js new file mode 100644 index 00000000000..335d3d1ad2c --- /dev/null +++ b/test/watchCases/simple/production/0/changing-file.js @@ -0,0 +1 @@ +module.exports = "0"; diff --git a/test/watchCases/simple/production/0/changing-module.js b/test/watchCases/simple/production/0/changing-module.js new file mode 100644 index 00000000000..b428ff41a01 --- /dev/null +++ b/test/watchCases/simple/production/0/changing-module.js @@ -0,0 +1 @@ +export default "0"; diff --git a/test/watchCases/simple/production/0/index.js b/test/watchCases/simple/production/0/index.js new file mode 100644 index 00000000000..b335a3e459f --- /dev/null +++ b/test/watchCases/simple/production/0/index.js @@ -0,0 +1,6 @@ +import module from "./changing-module"; + +it("should watch for changes", function () { + expect(require("./changing-file")).toBe(WATCH_STEP); + expect(module).toBe(WATCH_STEP); +}); diff --git a/test/watchCases/simple/production/1/changing-file.js b/test/watchCases/simple/production/1/changing-file.js new file mode 100644 index 00000000000..ba0e0f3e141 --- /dev/null +++ b/test/watchCases/simple/production/1/changing-file.js @@ -0,0 +1 @@ +module.exports = "1"; diff --git a/test/watchCases/simple/production/1/changing-module.js b/test/watchCases/simple/production/1/changing-module.js new file mode 100644 index 00000000000..508074e2ae0 --- /dev/null +++ b/test/watchCases/simple/production/1/changing-module.js @@ -0,0 +1 @@ +export default "1"; diff --git a/test/watchCases/simple/production/2/changing-file.js b/test/watchCases/simple/production/2/changing-file.js new file mode 100644 index 00000000000..c202b851341 --- /dev/null +++ b/test/watchCases/simple/production/2/changing-file.js @@ -0,0 +1 @@ +module.exports = "2"; diff --git a/test/watchCases/simple/production/2/changing-module.js b/test/watchCases/simple/production/2/changing-module.js new file mode 100644 index 00000000000..bd360e75dff --- /dev/null +++ b/test/watchCases/simple/production/2/changing-module.js @@ -0,0 +1 @@ +export default "2"; diff --git a/test/watchCases/simple/production/webpack.config.js b/test/watchCases/simple/production/webpack.config.js new file mode 100644 index 00000000000..dffc81bba10 --- /dev/null +++ b/test/watchCases/simple/production/webpack.config.js @@ -0,0 +1,4 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + mode: "production" +}; diff --git a/test/watchCases/snapshot/unable-to-snapshot/0/index.js b/test/watchCases/snapshot/unable-to-snapshot/0/index.js new file mode 100644 index 00000000000..b57118d1b82 --- /dev/null +++ b/test/watchCases/snapshot/unable-to-snapshot/0/index.js @@ -0,0 +1,5 @@ +import value from "package"; + +it("should not crash", () => { + expect(value).toBe(42 + WATCH_STEP); +}); diff --git a/test/watchCases/snapshot/unable-to-snapshot/0/node_modules/package/changing-file.js b/test/watchCases/snapshot/unable-to-snapshot/0/node_modules/package/changing-file.js new file mode 100644 index 00000000000..335d3d1ad2c --- /dev/null +++ b/test/watchCases/snapshot/unable-to-snapshot/0/node_modules/package/changing-file.js @@ -0,0 +1 @@ +module.exports = "0"; diff --git a/test/watchCases/snapshot/unable-to-snapshot/0/node_modules/package/index.js b/test/watchCases/snapshot/unable-to-snapshot/0/node_modules/package/index.js new file mode 100644 index 00000000000..f4be413d1f1 --- /dev/null +++ b/test/watchCases/snapshot/unable-to-snapshot/0/node_modules/package/index.js @@ -0,0 +1,2 @@ +import other from "./changing-file"; +export default 42 + other; diff --git a/test/watchCases/snapshot/unable-to-snapshot/1/node_modules/package/changing-file.js b/test/watchCases/snapshot/unable-to-snapshot/1/node_modules/package/changing-file.js new file mode 100644 index 00000000000..ba0e0f3e141 --- /dev/null +++ b/test/watchCases/snapshot/unable-to-snapshot/1/node_modules/package/changing-file.js @@ -0,0 +1 @@ +module.exports = "1"; diff --git a/test/watchCases/snapshot/unable-to-snapshot/2/node_modules/package/changing-file.js b/test/watchCases/snapshot/unable-to-snapshot/2/node_modules/package/changing-file.js new file mode 100644 index 00000000000..c202b851341 --- /dev/null +++ b/test/watchCases/snapshot/unable-to-snapshot/2/node_modules/package/changing-file.js @@ -0,0 +1 @@ +module.exports = "2"; diff --git a/test/watchCases/snapshot/unable-to-snapshot/webpack.config.js b/test/watchCases/snapshot/unable-to-snapshot/webpack.config.js new file mode 100644 index 00000000000..52c5156b7bf --- /dev/null +++ b/test/watchCases/snapshot/unable-to-snapshot/webpack.config.js @@ -0,0 +1,18 @@ +const path = require("path"); + +/** @type {(env: Env, options: TestOptions) => import("../../../../").Configuration} */ +module.exports = (env, { srcPath }) => { + console.log(env); + + return { + cache: { + type: "memory" + }, + snapshot: { + managedPaths: [path.resolve(srcPath, "node_modules")] + }, + module: { + unsafeCache: false + } + }; +}; diff --git a/test/watchCases/warnings/warnings-contribute-to-hash/0/warning-loader.js b/test/watchCases/warnings/warnings-contribute-to-hash/0/warning-loader.js index a5206b8bdac..dbf6abe1827 100644 --- a/test/watchCases/warnings/warnings-contribute-to-hash/0/warning-loader.js +++ b/test/watchCases/warnings/warnings-contribute-to-hash/0/warning-loader.js @@ -1,4 +1,5 @@ -module.exports = function(source) { +/** @type {import("../../../../../").LoaderDefinition} */ +module.exports = function (source) { this.emitWarning(new Error(source.trim())); return ""; }; diff --git a/test/watchCases/warnings/warnings-contribute-to-hash/0/warnings.js b/test/watchCases/warnings/warnings-contribute-to-hash/0/warnings.js index 968e3ec0117..77561d2bebb 100644 --- a/test/watchCases/warnings/warnings-contribute-to-hash/0/warnings.js +++ b/test/watchCases/warnings/warnings-contribute-to-hash/0/warnings.js @@ -1,3 +1 @@ -module.exports = [ - [/Warning1/] -]; +module.exports = [[/Warning1/]]; diff --git a/test/watchCases/warnings/warnings-contribute-to-hash/1/warnings.js b/test/watchCases/warnings/warnings-contribute-to-hash/1/warnings.js index 842179a3371..cf7a02b47ff 100644 --- a/test/watchCases/warnings/warnings-contribute-to-hash/1/warnings.js +++ b/test/watchCases/warnings/warnings-contribute-to-hash/1/warnings.js @@ -1,3 +1 @@ -module.exports = [ - [/New Warning/] -]; +module.exports = [[/New Warning/]]; diff --git a/test/watchCases/wasm/caching/test.filter.js b/test/watchCases/wasm/caching/test.filter.js index 23177349638..cb37e21905f 100644 --- a/test/watchCases/wasm/caching/test.filter.js +++ b/test/watchCases/wasm/caching/test.filter.js @@ -1,5 +1,5 @@ -var supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); +const supportsWebAssembly = require("../../../helpers/supportsWebAssembly"); -module.exports = function(config) { +module.exports = function (config) { return supportsWebAssembly(); }; diff --git a/test/watchCases/wasm/caching/webpack.config.js b/test/watchCases/wasm/caching/webpack.config.js new file mode 100644 index 00000000000..d2aff73f7bf --- /dev/null +++ b/test/watchCases/wasm/caching/webpack.config.js @@ -0,0 +1,6 @@ +/** @type {import("../../../../").Configuration} */ +module.exports = { + experiments: { + asyncWebAssembly: true + } +}; diff --git a/tooling/compile-to-definitions.js b/tooling/compile-to-definitions.js deleted file mode 100644 index a19aca0c5f4..00000000000 --- a/tooling/compile-to-definitions.js +++ /dev/null @@ -1,79 +0,0 @@ -const fs = require("fs"); -const path = require("path"); -const mkdirp = require("mkdirp"); -const prettierrc = require("../.prettierrc.js"); // eslint-disable-line -const { compileFromFile } = require("json-schema-to-typescript"); - -const schemasDir = path.resolve(__dirname, "../schemas"); -const style = { - printWidth: prettierrc.printWidth, - useTabs: prettierrc.useTabs, - tabWidth: prettierrc.tabWidth -}; - -// When --write is set, files will be written in place -// Elsewise it only prints outdated files -const doWrite = process.argv.includes("--write"); - -const makeSchemas = () => { - // include the top level folder "./schemas" by default - const dirs = new Set([schemasDir]); - - // search for all nestedDirs inside of this folder - for (let dirWithSchemas of dirs) { - for (let item of fs.readdirSync(dirWithSchemas)) { - const absPath = path.resolve(dirWithSchemas, item); - if (fs.statSync(absPath).isDirectory()) { - dirs.add(absPath); - } else if (item.endsWith(".json")) { - makeDefinitionsForSchema(absPath); - } - } - } -}; - -const makeDefinitionsForSchema = absSchemaPath => { - const basename = path - .relative(schemasDir, absSchemaPath) - .replace(/\.json$/i, ""); - const filename = path.resolve(__dirname, `../declarations/${basename}.d.ts`); - compileFromFile(absSchemaPath, { - bannerComment: - "/**\n * This file was automatically generated.\n * DO NOT MODIFY BY HAND.\n * Run `yarn special-lint-fix` to update\n */", - unreachableDefinitions: true, - style - }).then( - ts => { - let normalizedContent = ""; - try { - const content = fs.readFileSync(filename, "utf-8"); - normalizedContent = content.replace(/\r\n?/g, "\n"); - } catch (e) { - // ignore - } - if (normalizedContent.trim() !== ts.trim()) { - if (doWrite) { - mkdirp.sync(path.dirname(filename)); - fs.writeFileSync(filename, ts, "utf-8"); - console.error( - `declarations/${basename.replace(/\\/g, "/")}.d.ts updated` - ); - } else { - console.error( - `declarations/${basename.replace( - /\\/g, - "/" - )}.d.ts need to be updated` - ); - process.exitCode = 1; - } - } - }, - err => { - console.error(err); - process.exitCode = 1; - } - ); -}; - -makeSchemas(); diff --git a/tooling/decode-debug-hash.js b/tooling/decode-debug-hash.js new file mode 100644 index 00000000000..ac5640c5c33 --- /dev/null +++ b/tooling/decode-debug-hash.js @@ -0,0 +1,10 @@ +const fs = require("fs"); + +const file = process.argv[2]; + +let content = fs.readFileSync(file, "utf-8"); +content = content.replace(/debug-digest-([a-f0-9]+)/g, (match, bin) => + Buffer.from(bin, "hex").toString("utf-8") +); + +fs.writeFileSync(file, content); diff --git a/tooling/format-schemas.js b/tooling/format-schemas.js deleted file mode 100644 index 803acd5a1da..00000000000 --- a/tooling/format-schemas.js +++ /dev/null @@ -1,146 +0,0 @@ -const fs = require("fs"); -const path = require("path"); -const prettier = require("prettier"); - -const schemasDir = path.resolve(__dirname, "../schemas"); - -// When --write is set, files will be written in place -// Elsewise it only prints outdated files -const doWrite = process.argv.includes("--write"); - -const sortObjectAlphabetically = obj => { - const keys = Object.keys(obj).sort(); - const newObj = {}; - for (const key of keys) { - newObj[key] = obj[key]; - } - return newObj; -}; - -const sortObjectWithList = (obj, props) => { - const keys = Object.keys(obj) - .filter(p => !props.includes(p)) - .sort(); - const newObj = {}; - for (const key of props) { - if (key in obj) { - newObj[key] = obj[key]; - } - } - for (const key of keys) { - newObj[key] = obj[key]; - } - return newObj; -}; - -const PROPERTIES = [ - "$ref", - "definitions", - - "$id", - "id", - "title", - "description", - "type", - - "items", - "minItems", - "uniqueItems", - - "additionalProperties", - "properties", - "required", - "minProperties", - - "oneOf", - "anyOf", - "allOf", - "enum", - - "absolutePath", - "minLength", - - "minimum", - - "instanceof", - - "tsType" -]; - -const NESTED_WITH_NAME = ["definitions", "properties"]; - -const NESTED_DIRECT = ["items", "additionalProperties"]; - -const NESTED_ARRAY = ["oneOf", "anyOf", "allOf"]; - -const processJson = json => { - json = sortObjectWithList(json, PROPERTIES); - - for (const name of NESTED_WITH_NAME) { - if (name in json && json[name] && typeof json[name] === "object") { - json[name] = sortObjectAlphabetically(json[name]); - for (const key in json[name]) { - json[name][key] = processJson(json[name][key]); - } - } - } - for (const name of NESTED_DIRECT) { - if (name in json && json[name] && typeof json[name] === "object") { - json[name] = processJson(json[name]); - } - } - for (const name of NESTED_ARRAY) { - if (name in json && Array.isArray(json[name])) { - for (let i = 0; i < json[name].length; i++) { - json[name][i] = processJson(json[name][i]); - } - } - } - - return json; -}; - -const formatSchema = schemaPath => { - const json = require(schemaPath); - const processedJson = processJson(json); - const rawString = JSON.stringify(processedJson, null, 2); - prettier.resolveConfig(schemaPath).then(config => { - config.filepath = schemaPath; - config.parser = "json"; - const prettyString = prettier.format(rawString, config); - let normalizedContent = ""; - try { - const content = fs.readFileSync(schemaPath, "utf-8"); - normalizedContent = content.replace(/\r\n?/g, "\n"); - } catch (e) { - // ignore - } - if (normalizedContent.trim() !== prettyString.trim()) { - const basename = path.relative(schemasDir, schemaPath); - if (doWrite) { - fs.writeFileSync(schemaPath, prettyString, "utf-8"); - console.error(`schemas/${basename.replace(/\\/g, "/")} updated`); - } else { - console.error( - `schemas/${basename.replace(/\\/g, "/")} need to be updated` - ); - process.exitCode = 1; - } - } - }); -}; - -// include the top level folder "./schemas" by default -const dirs = new Set([schemasDir]); - -// search for all nestedDirs inside of this folder -for (let dirWithSchemas of dirs) { - for (let item of fs.readdirSync(dirWithSchemas)) { - const absPath = path.resolve(dirWithSchemas, item); - if (fs.statSync(absPath).isDirectory()) { - dirs.add(absPath); - } else if (item.endsWith(".json")) { - formatSchema(absPath); - } - } -} diff --git a/tooling/generate-runtime-code.js b/tooling/generate-runtime-code.js new file mode 100644 index 00000000000..6772fda53f6 --- /dev/null +++ b/tooling/generate-runtime-code.js @@ -0,0 +1,99 @@ +const path = require("path"); +const fs = require("fs"); +const terser = require("terser"); +const prettier = require("prettier"); + +// When --write is set, files will be written in place +// Otherwise it only prints outdated files +const doWrite = process.argv.includes("--write"); + +const files = ["lib/util/semver.js"]; + +(async () => { + for (const file of files) { + const filePath = path.resolve(__dirname, "..", file); + const content = fs.readFileSync(filePath, "utf-8"); + const exports = require(`../${file}`); + + const regexp = + /\n\/\/#region runtime code: (.+)\n[\s\S]+?\/\/#endregion\n/g; + + const replaces = new Map(); + + let match = regexp.exec(content); + while (match) { + const [fullMatch, name] = match; + const originalCode = exports[name].toString(); + const header = + /** @type {RegExpExecArray} */ + (/^\(?([^=)]+)\)?\s=> \{/.exec(originalCode)); + const body = originalCode.slice(header[0].length, -1); + const result = await terser.minify( + { + ["input.js"]: body + }, + { + compress: true, + mangle: true, + ecma: 5, + toplevel: true, + parse: { + // eslint-disable-next-line camelcase + bare_returns: true + } + } + ); + + if (!result.code) { + throw new Error(`No code generated for ${name} in ${file}`); + } + + const args = header[1]; + if (/`|const|let|=>|\.\.\./.test(result.code)) { + throw new Error(`Code Style of ${name} in ${file} is too high`); + } + let templateLiteral = false; + const code = result.code + .replace(/\\/g, "\\\\") + .replace(/'/g, "\\'") + .replace(/function\(([^)]+)\)/g, (m, args) => { + templateLiteral = true; + return `\${runtimeTemplate.supportsArrowFunction() ? '${ + args.includes(",") ? `(${args})` : args + }=>' : 'function(${args})'}`; + }); + replaces.set( + fullMatch, + ` +//#region runtime code: ${name} +/** + * @param {RuntimeTemplate} runtimeTemplate + * @returns {string} + */ +exports.${name}RuntimeCode = runtimeTemplate => \`var ${name} = \${runtimeTemplate.basicFunction("${args}", [ + "// see webpack/${file} for original code", + ${templateLiteral ? `\`${code}\`` : `'${code}'`} +])}\`; +//#endregion +` + ); + match = regexp.exec(content); + } + + const prettierConfig = await prettier.resolveConfig(filePath); + const newContent = await prettier.format( + content.replace(regexp, match => replaces.get(match)), + { filepath: filePath, ...prettierConfig } + ); + + if (newContent !== content) { + if (doWrite) { + fs.writeFileSync(filePath, newContent, "utf-8"); + console.error(`${file} updated`); + } else { + console.error(`${file} need to be updated`); + process.exitCode = 1; + } + } + } +})(); diff --git a/tooling/generate-wasm-code.js b/tooling/generate-wasm-code.js new file mode 100644 index 00000000000..582b8ef9ca9 --- /dev/null +++ b/tooling/generate-wasm-code.js @@ -0,0 +1,90 @@ +const path = require("path"); +const fs = require("fs"); + +// When --write is set, files will be written in place +// Otherwise it only prints outdated files +const doWrite = process.argv.includes("--write"); + +const files = ["lib/util/hash/xxhash64.js", "lib/util/hash/md4.js"]; + +(async () => { + // TODO: fix me after update typescript to v5 + // eslint-disable-next-line no-warning-comments + // @ts-ignore + // eslint-disable-next-line n/no-unsupported-features/es-syntax + const asc = (await import("assemblyscript/asc")).default; + + for (const file of files) { + const filePath = path.resolve(__dirname, "..", file); + const content = fs.readFileSync(filePath, "utf-8"); + + const regexp = + /\n\/\/[\s]*#region wasm code: (.+) \((.+)\)(.*)\n[\s\S]+?\/\/[\s+]*#endregion\n/g; + + const replaces = new Map(); + + let match = regexp.exec(content); + while (match) { + const [fullMatch, identifier, name, flags] = match; + + const sourcePath = path.resolve(filePath, "..", name); + const sourcePathBase = path.join( + path.dirname(sourcePath), + path.basename(sourcePath) + ); + + const { error } = await asc.main( + [ + sourcePath, + // cspell:word Ospeed + "-Ospeed", + "--noAssert", + "--converge", + "--textFile", + `${sourcePathBase}.wat`, + "--outFile", + `${sourcePathBase}.wasm`, + ...flags.split(" ").filter(Boolean) + ], + { + stdout: process.stdout, + stderr: process.stderr + } + ); + + if (error) { + throw error; + } + + const wasm = fs.readFileSync(`${sourcePathBase}.wasm`); + + replaces.set( + fullMatch, + ` +// #region wasm code: ${identifier} (${name})${flags} +const ${identifier} = new WebAssembly.Module( + Buffer.from( + // ${wasm.length} bytes + ${JSON.stringify(wasm.toString("base64"))}, + "base64" + ) +); +// #endregion +` + ); + match = regexp.exec(content); + } + + const newContent = content.replace(regexp, match => replaces.get(match)); + + if (newContent !== content) { + if (doWrite) { + fs.writeFileSync(filePath, newContent, "utf-8"); + console.error(`${file} updated`); + } else { + console.error(`${file} need to be updated`); + process.exitCode = 1; + } + } + } +})(); diff --git a/tooling/inherit-types.js b/tooling/inherit-types.js deleted file mode 100644 index 03963b5a45a..00000000000 --- a/tooling/inherit-types.js +++ /dev/null @@ -1,144 +0,0 @@ -const path = require("path"); -const fs = require("fs"); -const ts = require("typescript"); -const program = require("./typescript-program"); - -// When --override is set, base jsdoc will override sub class jsdoc -// Elsewise on a conflict it will create a merge conflict in the file -const override = process.argv.includes("--override"); - -// When --write is set, files will be written in place -// Elsewise it only prints outdated files -const doWrite = process.argv.includes("--write"); - -const typeChecker = program.getTypeChecker(); - -/** - * @param {ts.ClassDeclaration} node the class declaration - * @returns {Set} the base class declarations - */ -const getBaseClasses = node => { - /** @type {Set} */ - const decls = new Set(); - if (node.heritageClauses) { - for (const clause of node.heritageClauses) { - for (const clauseType of clause.types) { - const type = typeChecker.getTypeAtLocation(clauseType); - if (ts.isClassDeclaration(type.symbol.valueDeclaration)) - decls.add(type.symbol.valueDeclaration); - } - } - } - return decls; -}; - -/** - * @param {ts.ClassDeclaration} classNode the class declaration - * @param {string} memberName name of the member - * @returns {ts.MethodDeclaration | null} base class member declaration when found - */ -const findDeclarationInBaseClass = (classNode, memberName) => { - for (const baseClass of getBaseClasses(classNode)) { - for (const node of baseClass.members) { - if (ts.isMethodDeclaration(node)) { - if (node.name.getText() === memberName) { - return node; - } - } - } - const result = findDeclarationInBaseClass(baseClass, memberName); - if (result) return result; - } - return null; -}; - -const libPath = path.resolve(__dirname, "../lib"); - -for (const sourceFile of program.getSourceFiles()) { - let file = sourceFile.fileName; - if ( - file.toLowerCase().startsWith(libPath.replace(/\\/g, "/").toLowerCase()) - ) { - const updates = []; - sourceFile.forEachChild(node => { - if (ts.isClassDeclaration(node)) { - for (const member of node.members) { - if (ts.isMethodDeclaration(member)) { - const baseDecl = findDeclarationInBaseClass( - node, - member.name.getText() - ); - if (baseDecl) { - const memberAsAny = /** @type {any} */ (member); - const baseDeclAsAny = /** @type {any} */ (baseDecl); - const currentJsDoc = memberAsAny.jsDoc && memberAsAny.jsDoc[0]; - const baseJsDoc = baseDeclAsAny.jsDoc && baseDeclAsAny.jsDoc[0]; - const currentJsDocText = currentJsDoc && currentJsDoc.getText(); - let baseJsDocText = baseJsDoc && baseJsDoc.getText(); - if (baseJsDocText) { - baseJsDocText = baseJsDocText.replace( - /\t \* @abstract\r?\n/g, - "" - ); - if (!currentJsDocText) { - // add js doc - updates.push({ - member: member.name.getText(), - start: member.getStart(), - end: member.getStart(), - content: baseJsDocText + "\n\t" - }); - } else if ( - baseJsDocText && - currentJsDocText !== baseJsDocText - ) { - // update js doc - if (override || !doWrite) { - updates.push({ - member: member.name.getText(), - start: currentJsDoc.getStart(), - end: currentJsDoc.getEnd(), - content: baseJsDocText - }); - } else { - updates.push({ - member: member.name.getText(), - start: currentJsDoc.getStart() - 1, - end: currentJsDoc.getEnd(), - content: `<<<<<<< original comment\n\t${currentJsDocText}\n=======\n\t${baseJsDocText}\n>>>>>>> comment from base class` - }); - } - } - } - } - } - } - } - }); - if (updates.length > 0) { - if (doWrite) { - let fileContent = fs.readFileSync(file, "utf-8"); - updates.sort((a, b) => { - return b.start - a.start; - }); - for (const update of updates) { - fileContent = - fileContent.substr(0, update.start) + - update.content + - fileContent.substr(update.end); - } - console.log(`${file} ${updates.length} JSDoc comments added/updated`); - fs.writeFileSync(file, fileContent, "utf-8"); - } else { - console.log(file); - for (const update of updates) { - console.log( - `* ${update.member} should have this JSDoc:\n\t${update.content}` - ); - } - console.log(); - process.exitCode = 1; - } - } - } -} diff --git a/tooling/print-cache-file.js b/tooling/print-cache-file.js new file mode 100644 index 00000000000..8f1077152b8 --- /dev/null +++ b/tooling/print-cache-file.js @@ -0,0 +1,183 @@ +const path = require("path"); +const fs = require("fs"); +const BinaryMiddleware = require("../lib/serialization/BinaryMiddleware"); +const FileMiddleware = require("../lib/serialization/FileMiddleware"); +const Serializer = require("../lib/serialization/Serializer"); +const SerializerMiddleware = require("../lib/serialization/SerializerMiddleware"); + +/** @typedef {{ size: number, lazySize: number }} SizeInfo */ + +const binaryMiddleware = new BinaryMiddleware(); + +const serializer = new Serializer([binaryMiddleware, new FileMiddleware(fs)]); + +const rawSerializer = new Serializer([new FileMiddleware(fs)]); + +/** @type {Array} */ +const lazySizes = []; + +/** + * @param {(Buffer | (() => Promise))[]} data data + * @returns {Promise} size info + */ +const captureSize = async data => { + let size = 0; + let lazySize = 0; + for (const b of data) { + if (Buffer.isBuffer(b)) { + size += b.length; + } else if (typeof b === "function") { + const i = lazySizes.length; + lazySizes.push(undefined); + const r = await captureSize(await b()); + lazySize += r.size + r.lazySize; + lazySizes[i] = r; + } + } + return { size, lazySize }; +}; + +const ESCAPE = null; +const ESCAPE_ESCAPE_VALUE = null; +const ESCAPE_END_OBJECT = true; +const ESCAPE_UNDEFINED = false; + +/** + * @param {Array} data data + * @param {string} indent indent + * @returns {Promise} promise + */ +const printData = async (data, indent) => { + if (!Array.isArray(data)) throw new Error("Not an array"); + if (Buffer.isBuffer(data[0])) { + for (const b of data) { + if (typeof b === "function") { + const innerData = await b(); + const info = /** @type {SizeInfo} */ (lazySizes.shift()); + const sizeInfo = `${(info.size / 1048576).toFixed(2)} MiB + ${( + info.lazySize / 1048576 + ).toFixed(2)} lazy MiB`; + console.log(`${indent}= lazy ${sizeInfo} {`); + await printData(innerData, `${indent} `); + console.log(`${indent}}`); + } else { + console.log(`${indent}= ${b.toString("hex")}`); + } + } + return; + } + const referencedValues = new Map(); + const referencedValuesCounters = new Map(); + const referencedTypes = new Map(); + let currentReference = 0; + let currentTypeReference = 0; + let i = 0; + const read = () => data[i++]; + /** + * @param {string} content content + */ + const printLine = content => { + console.log(`${indent}${content}`); + }; + printLine(`Version: ${read()}`); + while (i < data.length) { + const item = read(); + if (item === ESCAPE) { + const nextItem = read(); + if (nextItem === ESCAPE_ESCAPE_VALUE) { + printLine("null"); + } else if (nextItem === ESCAPE_UNDEFINED) { + printLine("undefined"); + } else if (nextItem === ESCAPE_END_OBJECT) { + indent = indent.slice(0, -2); + printLine(`} = #${currentReference++}`); + } else if (typeof nextItem === "number" && nextItem < 0) { + const ref = currentReference + nextItem; + const value = referencedValues.get(ref); + referencedValuesCounters.set( + ref, + (referencedValuesCounters.get(ref) || 0) + 1 + ); + if (value) { + printLine( + `Reference ${nextItem} => ${JSON.stringify(value)} #${ref}` + ); + } else { + printLine(`Reference ${nextItem} => #${ref}`); + } + } else { + const request = nextItem; + if (typeof request === "number") { + const ref = currentTypeReference - request; + printLine( + `Object (Reference ${request} => ${referencedTypes.get( + ref + )} @${ref}) {` + ); + } else { + const name = read(); + referencedTypes.set(currentTypeReference, `${request} / ${name}`); + printLine( + `Object (${request} / ${name} @${currentTypeReference++}) {` + ); + } + indent += " "; + } + } else if (typeof item === "string") { + if (item !== "") { + referencedValues.set(currentReference, item); + printLine(`${JSON.stringify(item)} = #${currentReference++}`); + } else { + printLine('""'); + } + } else if (Buffer.isBuffer(item)) { + printLine(`buffer ${item.toString("hex")} = #${currentReference++}`); + } else if (typeof item === "function") { + const innerData = await item(); + if (!SerializerMiddleware.isLazy(item, binaryMiddleware)) { + const info = /** @type {SizeInfo} */ (lazySizes.shift()); + const sizeInfo = `${(info.size / 1048576).toFixed(2)} MiB + ${( + info.lazySize / 1048576 + ).toFixed(2)} lazy MiB`; + printLine(`lazy-file ${sizeInfo} {`); + } else { + printLine("lazy-inline {"); + } + await printData(innerData, `${indent} `); + printLine("}"); + } else { + printLine(String(item)); + } + } + const refCounters = Array.from(referencedValuesCounters); + refCounters.sort(([a, A], [b, B]) => B - A); + printLine("SUMMARY: top references:"); + for (const [ref, count] of refCounters.slice(10)) { + const value = referencedValues.get(ref); + if (value) { + printLine(`- #${ref} x ${count} = ${JSON.stringify(value)}`); + } else { + printLine(`- #${ref} x ${count}`); + } + } +}; + +const filename = process.argv[2]; + +(async () => { + const structure = await rawSerializer.deserialize(null, { + filename: path.resolve(filename), + extension: ".pack" + }); + const info = await captureSize(structure); + const sizeInfo = `${(info.size / 1048576).toFixed(2)} MiB + ${( + info.lazySize / 1048576 + ).toFixed(2)} lazy MiB`; + console.log(`${filename} ${sizeInfo}:`); + + const data = await serializer.deserialize(null, { + filename: path.resolve(filename), + extension: ".pack" + }); + await printData(data, ""); +})(); diff --git a/tooling/typescript-program.js b/tooling/typescript-program.js deleted file mode 100644 index bd9413ab6ae..00000000000 --- a/tooling/typescript-program.js +++ /dev/null @@ -1,17 +0,0 @@ -const path = require("path"); -const fs = require("fs"); -const ts = require("typescript"); - -const rootPath = path.resolve(__dirname, ".."); -const configPath = path.resolve(__dirname, "../tsconfig.json"); -const configContent = fs.readFileSync(configPath, "utf-8"); -const configJsonFile = ts.parseJsonText(configPath, configContent); -const parsedConfig = ts.parseJsonSourceFileConfigFileContent( - configJsonFile, - ts.sys, - rootPath, - { noEmit: true } -); -const { fileNames, options } = parsedConfig; - -module.exports = ts.createProgram(fileNames, options); diff --git a/tsconfig.json b/tsconfig.json index 3df37338ce8..b6ca80d0a5c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,17 +6,17 @@ "allowJs": true, "checkJs": true, "noEmit": true, - "strict": false, - "noImplicitThis": true, - "alwaysStrict": true, + "strict": true, "types": ["node"], "esModuleInterop": true }, "include": [ "declarations.d.ts", "declarations/*.d.ts", + "schemas/**/*.json", "bin/*.js", "lib/**/*.js", - "tooling/**/*.js" + "tooling/**/*.js", + "setup/**/*.js" ] } diff --git a/tsconfig.module.test.json b/tsconfig.module.test.json new file mode 100644 index 00000000000..1bf38455df0 --- /dev/null +++ b/tsconfig.module.test.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "lib": ["es2017", "dom"], + "allowJs": true, + "checkJs": true, + "noEmit": true, + "strict": true, + "moduleResolution": "node", + "types": ["node", "./module"], + "esModuleInterop": true + }, + "include": ["hot/**/*", "test/typesCases/**/*"] +} diff --git a/tsconfig.types.json b/tsconfig.types.json new file mode 100644 index 00000000000..72cdfefca3f --- /dev/null +++ b/tsconfig.types.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2017", + "module": "commonjs", + "lib": ["es2017", "dom"], + "allowJs": true, + "checkJs": true, + "noEmit": true, + "strict": true, + "types": ["node"], + "esModuleInterop": true + }, + "include": ["declarations.d.ts", "declarations/*.d.ts", "lib/**/*.js"] +} diff --git a/tsconfig.types.test.json b/tsconfig.types.test.json new file mode 100644 index 00000000000..52ab5c90461 --- /dev/null +++ b/tsconfig.types.test.json @@ -0,0 +1,16 @@ +{ + "extends": "./tsconfig", + "compilerOptions": { + "types": ["node", "jest"] + }, + "include": [ + "declarations.d.ts", + "declarations/*.d.ts", + "test/**/webpack.config.js", + "test/cases/**/*loader*.js", + "test/watchCases/**/*loader*.js", + "test/configCases/**/*loader*.js", + "test/hotCases/**/*loader*.js", + "declarations.test.d.ts" + ] +} diff --git a/tsconfig.validation.json b/tsconfig.validation.json new file mode 100644 index 00000000000..576457fdf87 --- /dev/null +++ b/tsconfig.validation.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig", + "include": ["types.d.ts"] +} diff --git a/types.d.ts b/types.d.ts new file mode 100644 index 00000000000..9dd9839ffb6 --- /dev/null +++ b/types.d.ts @@ -0,0 +1,17278 @@ +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn fix:special` to update + */ + +import { Buffer } from "buffer"; +import { Scope } from "eslint-scope"; +import { + ArrayExpression, + ArrayPattern, + ArrowFunctionExpression, + AssignmentExpression, + AssignmentPattern, + AssignmentProperty, + AwaitExpression, + BaseNode, + BigIntLiteral, + BinaryExpression, + BlockStatement, + BreakStatement, + CatchClause, + ChainExpression, + ClassBody, + ClassDeclaration, + ClassExpression, + Comment, + ConditionalExpression, + ContinueStatement, + DebuggerStatement, + Directive, + DoWhileStatement, + EmptyStatement, + ExportAllDeclaration as ExportAllDeclarationImport, + ExportDefaultDeclaration, + ExportNamedDeclaration as ExportNamedDeclarationImport, + ExportSpecifier, + ExpressionStatement, + ForInStatement, + ForOfStatement, + ForStatement, + FunctionDeclaration, + FunctionExpression, + Identifier, + IfStatement, + ImportDeclaration as ImportDeclarationImport, + ImportDefaultSpecifier, + ImportExpression as ImportExpressionImport, + ImportNamespaceSpecifier, + ImportSpecifier, + LabeledStatement, + LogicalExpression, + MaybeNamedClassDeclaration, + MaybeNamedFunctionDeclaration, + MemberExpression, + MetaProperty, + MethodDefinition, + NewExpression, + ObjectExpression, + ObjectPattern, + PrivateIdentifier, + Program, + Property, + PropertyDefinition, + RegExpLiteral, + RestElement, + ReturnStatement, + SequenceExpression, + SimpleCallExpression, + SimpleLiteral, + SpreadElement, + StaticBlock, + Super, + SwitchCase, + SwitchStatement, + TaggedTemplateExpression, + TemplateElement, + TemplateLiteral, + ThisExpression, + ThrowStatement, + TryStatement, + UnaryExpression, + UpdateExpression, + VariableDeclaration, + VariableDeclarator, + WhileStatement, + WithStatement, + YieldExpression +} from "estree"; +import { IncomingMessage, ServerOptions } from "http"; +import { + Session as SessionImportInspectorClass_1, + Session as SessionImportInspectorClass_2 +} from "inspector"; +import { JSONSchema4, JSONSchema6, JSONSchema7 } from "json-schema"; +import { ListenOptions, Server } from "net"; +import { validate as validateFunction } from "schema-utils"; +import { default as ValidationError } from "schema-utils/declarations/ValidationError"; +import { ValidationErrorConfiguration } from "schema-utils/declarations/validate"; +import { + AsArray, + AsyncParallelHook, + AsyncSeriesBailHook, + AsyncSeriesHook, + AsyncSeriesWaterfallHook, + HookMap, + IfSet, + MultiHook, + SyncBailHook, + SyncHook, + SyncWaterfallHook, + TapOptions +} from "tapable"; +import { SecureContextOptions, TlsOptions } from "tls"; +import { URL } from "url"; +import { Context } from "vm"; + +declare interface Abortable { + /** + * When provided the corresponding `AbortController` can be used to cancel an asynchronous action. + */ + signal?: AbortSignal; +} +declare class AbstractLibraryPlugin { + constructor(__0: AbstractLibraryPluginOptions); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; + parseOptions(library: LibraryOptions): false | T; + finishEntryModule( + module: Module, + entryName: string, + libraryContext: LibraryContext + ): void; + embedInRuntimeBailout( + module: Module, + renderContext: RenderContextJavascriptModulesPlugin, + libraryContext: LibraryContext + ): undefined | string; + strictRuntimeBailout( + renderContext: RenderContextJavascriptModulesPlugin, + libraryContext: LibraryContext + ): undefined | string; + runtimeRequirements( + chunk: Chunk, + set: Set, + libraryContext: LibraryContext + ): void; + render( + source: Source, + renderContext: RenderContextJavascriptModulesPlugin, + libraryContext: LibraryContext + ): Source; + renderStartup( + source: Source, + module: Module, + renderContext: StartupRenderContext, + libraryContext: LibraryContext + ): Source; + chunkHash( + chunk: Chunk, + hash: Hash, + chunkHashContext: ChunkHashContext, + libraryContext: LibraryContext + ): void; + static COMMON_LIBRARY_NAME_MESSAGE: string; +} +declare interface AbstractLibraryPluginOptions { + /** + * name of the plugin + */ + pluginName: string; + + /** + * used library type + */ + type: string; +} +declare interface AdditionalData { + [index: string]: any; + webpackAST: object; +} +declare class AggressiveMergingPlugin { + constructor(options?: AggressiveMergingPluginOptions); + options: AggressiveMergingPluginOptions; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface AggressiveMergingPluginOptions { + /** + * minimal size reduction to trigger merging + */ + minSizeReduce?: number; +} +declare class AggressiveSplittingPlugin { + constructor(options?: AggressiveSplittingPluginOptions); + options: AggressiveSplittingPluginOptions; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; + static wasChunkRecorded(chunk: Chunk): boolean; +} +declare interface AggressiveSplittingPluginOptions { + /** + * Extra cost for each chunk (Default: 9.8kiB). + */ + chunkOverhead?: number; + + /** + * Extra cost multiplicator for entry chunks (Default: 10). + */ + entryChunkMultiplicator?: number; + + /** + * Byte, max size of per file (Default: 50kiB). + */ + maxSize?: number; + + /** + * Byte, split point. (Default: 30kiB). + */ + minSize?: number; +} +type Alias = string | false | string[]; +declare interface AliasOption { + alias: Alias; + name: string; + onlyModule?: boolean; +} +type AliasOptionNewRequest = string | false | string[]; +declare interface AliasOptions { + [index: string]: AliasOptionNewRequest; +} +declare interface Argument { + description?: string; + simpleType: SimpleType; + multiple: boolean; + configs: ArgumentConfig[]; +} +declare interface ArgumentConfig { + description?: string; + negatedDescription?: string; + path: string; + multiple: boolean; + type: "string" | "number" | "boolean" | "path" | "enum" | "RegExp" | "reset"; + values?: EnumValue[]; +} +type ArrayBufferLike = ArrayBuffer | SharedArrayBuffer; +type ArrayBufferView = + | Uint8Array + | Uint8ClampedArray + | Uint16Array + | Uint32Array + | Int8Array + | Int16Array + | Int32Array + | BigUint64Array + | BigInt64Array + | Float32Array + | Float64Array + | DataView; +declare interface Asset { + /** + * the filename of the asset + */ + name: string; + + /** + * source of the asset + */ + source: Source; + + /** + * info about the asset + */ + info: AssetInfo; +} +declare interface AssetDependencyMeta { + sourceType: "css-url"; +} +declare interface AssetEmittedInfo { + content: Buffer; + source: Source; + compilation: Compilation; + outputPath: string; + targetPath: string; +} +type AssetFilterItemTypes = + | string + | RegExp + | ((name: string, asset: StatsAsset) => boolean); + +/** + * Options object for data url generation. + */ +declare interface AssetGeneratorDataUrlOptions { + /** + * Asset encoding (defaults to base64). + */ + encoding?: false | "base64"; + + /** + * Asset mimetype (getting from file extension by default). + */ + mimetype?: string; +} +type AssetGeneratorOptions = AssetInlineGeneratorOptions & + AssetResourceGeneratorOptions; +type AssetInfo = KnownAssetInfo & Record; + +/** + * Generator options for asset/inline modules. + */ +declare interface AssetInlineGeneratorOptions { + /** + * Whether or not this asset module should be considered binary. This can be set to 'false' to treat this asset module as text. + */ + binary?: boolean; + + /** + * The options for data url generator. + */ + dataUrl?: + | AssetGeneratorDataUrlOptions + | (( + source: string | Buffer, + context: { filename: string; module: Module } + ) => string); +} + +/** + * Options object for DataUrl condition. + */ +declare interface AssetParserDataUrlOptions { + /** + * Maximum size of asset that should be inline as modules. Default: 8kb. + */ + maxSize?: number; +} + +/** + * Parser options for asset modules. + */ +declare interface AssetParserOptions { + /** + * The condition for inlining the asset as DataUrl. + */ + dataUrlCondition?: + | AssetParserDataUrlOptions + | (( + source: string | Buffer, + context: { filename: string; module: Module } + ) => boolean); +} + +/** + * Generator options for asset/resource modules. + */ +declare interface AssetResourceGeneratorOptions { + /** + * Whether or not this asset module should be considered binary. This can be set to 'false' to treat this asset module as text. + */ + binary?: boolean; + + /** + * Emit an output asset from this asset module. This can be set to 'false' to omit emitting e. g. for SSR. + */ + emit?: boolean; + + /** + * Specifies the filename template of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk. + */ + filename?: string | ((pathData: PathData, assetInfo?: AssetInfo) => string); + + /** + * Emit the asset in the specified folder relative to 'output.path'. This should only be needed when custom 'publicPath' is specified to match the folder structure there. + */ + outputPath?: string | ((pathData: PathData, assetInfo?: AssetInfo) => string); + + /** + * The 'publicPath' specifies the public URL address of the output files when referenced in a browser. + */ + publicPath?: string | ((pathData: PathData, assetInfo?: AssetInfo) => string); +} +declare class AsyncDependenciesBlock extends DependenciesBlock { + constructor( + groupOptions: + | null + | string + | (RawChunkGroupOptions & { name?: null | string } & { + entryOptions?: EntryOptions; + }), + loc?: null | SyntheticDependencyLocation | RealDependencyLocation, + request?: null | string + ); + groupOptions: RawChunkGroupOptions & { name?: null | string } & { + entryOptions?: EntryOptions; + }; + loc?: null | SyntheticDependencyLocation | RealDependencyLocation; + request?: null | string; + chunkName?: null | string; + module: any; +} +declare abstract class AsyncQueue { + hooks: { + beforeAdd: AsyncSeriesHook<[T]>; + added: SyncHook<[T]>; + beforeStart: AsyncSeriesHook<[T]>; + started: SyncHook<[T]>; + result: SyncHook< + [T, undefined | null | WebpackError, undefined | null | R] + >; + }; + getContext(): string; + setContext(value: string): void; + add(item: T, callback: CallbackAsyncQueue): void; + invalidate(item: T): void; + + /** + * Waits for an already started item + */ + waitFor(item: T, callback: CallbackAsyncQueue): void; + stop(): void; + increaseParallelism(): void; + decreaseParallelism(): void; + isProcessing(item: T): boolean; + isQueued(item: T): boolean; + isDone(item: T): boolean; + clear(): void; +} +declare class AsyncWebAssemblyModulesPlugin { + constructor(options: AsyncWebAssemblyModulesPluginOptions); + options: AsyncWebAssemblyModulesPluginOptions; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; + renderModule( + module: Module, + renderContext: WebAssemblyRenderContext, + hooks: CompilationHooksAsyncWebAssemblyModulesPlugin + ): Source; + static getCompilationHooks( + compilation: Compilation + ): CompilationHooksAsyncWebAssemblyModulesPlugin; +} +declare interface AsyncWebAssemblyModulesPluginOptions { + /** + * mangle imports + */ + mangleImports?: boolean; +} +declare class AutomaticPrefetchPlugin { + constructor(); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +type AuxiliaryComment = string | LibraryCustomUmdCommentObject; +declare interface BackendApi { + dispose: (callback: (err?: null | Error) => void) => void; + module: (module: Module) => ModuleResult; +} +declare class BannerPlugin { + constructor(options: BannerPluginArgument); + options: BannerPluginOptions; + banner: (data: { hash?: string; chunk: Chunk; filename: string }) => string; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +type BannerPluginArgument = + | string + | BannerPluginOptions + | ((data: { hash?: string; chunk: Chunk; filename: string }) => string); +declare interface BannerPluginOptions { + /** + * Specifies the banner. + */ + banner: + | string + | ((data: { hash?: string; chunk: Chunk; filename: string }) => string); + + /** + * If true, the banner will only be added to the entry chunks. + */ + entryOnly?: boolean; + + /** + * Exclude all modules matching any of these conditions. + */ + exclude?: string | RegExp | Rule[]; + + /** + * If true, banner will be placed at the end of the output. + */ + footer?: boolean; + + /** + * Include all modules matching any of these conditions. + */ + include?: string | RegExp | Rule[]; + + /** + * If true, banner will not be wrapped in a comment. + */ + raw?: boolean; + + /** + * Specifies the stage when add a banner. + */ + stage?: number; + + /** + * Include all modules that pass test assertion. + */ + test?: string | RegExp | Rule[]; +} +declare interface BaseResolveRequest { + path: string | false; + context?: object; + descriptionFilePath?: string; + descriptionFileRoot?: string; + descriptionFileData?: JsonObjectTypes; + relativePath?: string; + ignoreSymlinks?: boolean; + fullySpecified?: boolean; + __innerRequest?: string; + __innerRequest_request?: string; + __innerRequest_relativePath?: string; +} +declare abstract class BasicEvaluatedExpression { + type: number; + range?: [number, number]; + falsy: boolean; + truthy: boolean; + nullish?: boolean; + sideEffects: boolean; + bool?: boolean; + number?: number; + bigint?: bigint; + regExp?: RegExp; + string?: string; + quasis?: BasicEvaluatedExpression[]; + parts?: BasicEvaluatedExpression[]; + array?: any[]; + items?: BasicEvaluatedExpression[]; + options?: BasicEvaluatedExpression[]; + prefix?: null | BasicEvaluatedExpression; + postfix?: null | BasicEvaluatedExpression; + wrappedInnerExpressions?: BasicEvaluatedExpression[]; + identifier?: string | VariableInfo; + rootInfo?: string | VariableInfo; + getMembers?: () => string[]; + getMembersOptionals?: () => boolean[]; + getMemberRanges?: () => [number, number][]; + expression?: + | Program + | ImportDeclarationImport + | ExportNamedDeclarationImport + | ExportAllDeclarationImport + | ImportExpressionImport + | UnaryExpression + | ArrayExpression + | ArrowFunctionExpression + | AssignmentExpression + | AwaitExpression + | BinaryExpression + | SimpleCallExpression + | NewExpression + | ChainExpression + | ClassExpression + | ConditionalExpression + | FunctionExpression + | Identifier + | SimpleLiteral + | RegExpLiteral + | BigIntLiteral + | LogicalExpression + | MemberExpression + | MetaProperty + | ObjectExpression + | SequenceExpression + | TaggedTemplateExpression + | TemplateLiteral + | ThisExpression + | UpdateExpression + | YieldExpression + | SpreadElement + | PrivateIdentifier + | Super + | FunctionDeclaration + | VariableDeclaration + | ClassDeclaration + | ExpressionStatement + | BlockStatement + | StaticBlock + | EmptyStatement + | DebuggerStatement + | WithStatement + | ReturnStatement + | LabeledStatement + | BreakStatement + | ContinueStatement + | IfStatement + | SwitchStatement + | ThrowStatement + | TryStatement + | WhileStatement + | DoWhileStatement + | ForStatement + | ForInStatement + | ForOfStatement + | ExportDefaultDeclaration + | MethodDefinition + | PropertyDefinition + | VariableDeclarator + | SwitchCase + | CatchClause + | ObjectPattern + | ArrayPattern + | RestElement + | AssignmentPattern + | Property + | AssignmentProperty + | ClassBody + | ImportSpecifier + | ImportDefaultSpecifier + | ImportNamespaceSpecifier + | ExportSpecifier + | TemplateElement; + isUnknown(): boolean; + isNull(): boolean; + isUndefined(): boolean; + isString(): boolean; + isNumber(): boolean; + isBigInt(): boolean; + isBoolean(): boolean; + isRegExp(): boolean; + isConditional(): boolean; + isArray(): boolean; + isConstArray(): boolean; + isIdentifier(): boolean; + isWrapped(): boolean; + isTemplateString(): boolean; + + /** + * Is expression a primitive or an object type value? + */ + isPrimitiveType(): undefined | boolean; + + /** + * Is expression a runtime or compile-time value? + */ + isCompileTimeValue(): boolean; + + /** + * Gets the compile-time value of the expression + */ + asCompileTimeValue(): + | undefined + | null + | string + | number + | bigint + | boolean + | RegExp + | any[]; + isTruthy(): boolean; + isFalsy(): boolean; + isNullish(): undefined | boolean; + + /** + * Can this expression have side effects? + */ + couldHaveSideEffects(): boolean; + + /** + * Creates a boolean representation of this evaluated expression. + */ + asBool(): undefined | boolean; + + /** + * Creates a nullish coalescing representation of this evaluated expression. + */ + asNullish(): undefined | boolean; + + /** + * Creates a string representation of this evaluated expression. + */ + asString(): undefined | string; + setString(string: string): BasicEvaluatedExpression; + setUndefined(): BasicEvaluatedExpression; + setNull(): BasicEvaluatedExpression; + + /** + * Set's the value of this expression to a number + */ + setNumber(number: number): BasicEvaluatedExpression; + + /** + * Set's the value of this expression to a BigInt + */ + setBigInt(bigint: bigint): BasicEvaluatedExpression; + + /** + * Set's the value of this expression to a boolean + */ + setBoolean(bool: boolean): BasicEvaluatedExpression; + + /** + * Set's the value of this expression to a regular expression + */ + setRegExp(regExp: RegExp): BasicEvaluatedExpression; + + /** + * Set's the value of this expression to a particular identifier and its members. + */ + setIdentifier( + identifier: string | VariableInfo, + rootInfo: string | VariableInfo, + getMembers: () => string[], + getMembersOptionals?: () => boolean[], + getMemberRanges?: () => [number, number][] + ): BasicEvaluatedExpression; + + /** + * Wraps an array of expressions with a prefix and postfix expression. + */ + setWrapped( + prefix?: null | BasicEvaluatedExpression, + postfix?: null | BasicEvaluatedExpression, + innerExpressions?: BasicEvaluatedExpression[] + ): BasicEvaluatedExpression; + + /** + * Stores the options of a conditional expression. + */ + setOptions(options: BasicEvaluatedExpression[]): BasicEvaluatedExpression; + + /** + * Adds options to a conditional expression. + */ + addOptions(options: BasicEvaluatedExpression[]): BasicEvaluatedExpression; + + /** + * Set's the value of this expression to an array of expressions. + */ + setItems(items: BasicEvaluatedExpression[]): BasicEvaluatedExpression; + + /** + * Set's the value of this expression to an array of strings. + */ + setArray(array: string[]): BasicEvaluatedExpression; + + /** + * Set's the value of this expression to a processed/unprocessed template string. Used + * for evaluating TemplateLiteral expressions in the JavaScript Parser. + */ + setTemplateString( + quasis: BasicEvaluatedExpression[], + parts: BasicEvaluatedExpression[], + kind: "raw" | "cooked" + ): BasicEvaluatedExpression; + templateStringKind?: "raw" | "cooked"; + setTruthy(): BasicEvaluatedExpression; + setFalsy(): BasicEvaluatedExpression; + + /** + * Set's the value of the expression to nullish. + */ + setNullish(value: boolean): BasicEvaluatedExpression; + + /** + * Set's the range for the expression. + */ + setRange(range: [number, number]): BasicEvaluatedExpression; + + /** + * Set whether or not the expression has side effects. + */ + setSideEffects(sideEffects?: boolean): BasicEvaluatedExpression; + + /** + * Set the expression node for the expression. + */ + setExpression( + expression?: + | Program + | ImportDeclarationImport + | ExportNamedDeclarationImport + | ExportAllDeclarationImport + | ImportExpressionImport + | UnaryExpression + | ArrayExpression + | ArrowFunctionExpression + | AssignmentExpression + | AwaitExpression + | BinaryExpression + | SimpleCallExpression + | NewExpression + | ChainExpression + | ClassExpression + | ConditionalExpression + | FunctionExpression + | Identifier + | SimpleLiteral + | RegExpLiteral + | BigIntLiteral + | LogicalExpression + | MemberExpression + | MetaProperty + | ObjectExpression + | SequenceExpression + | TaggedTemplateExpression + | TemplateLiteral + | ThisExpression + | UpdateExpression + | YieldExpression + | SpreadElement + | PrivateIdentifier + | Super + | FunctionDeclaration + | VariableDeclaration + | ClassDeclaration + | ExpressionStatement + | BlockStatement + | StaticBlock + | EmptyStatement + | DebuggerStatement + | WithStatement + | ReturnStatement + | LabeledStatement + | BreakStatement + | ContinueStatement + | IfStatement + | SwitchStatement + | ThrowStatement + | TryStatement + | WhileStatement + | DoWhileStatement + | ForStatement + | ForInStatement + | ForOfStatement + | ExportDefaultDeclaration + | MethodDefinition + | PropertyDefinition + | VariableDeclarator + | SwitchCase + | CatchClause + | ObjectPattern + | ArrayPattern + | RestElement + | AssignmentPattern + | Property + | AssignmentProperty + | ClassBody + | ImportSpecifier + | ImportDefaultSpecifier + | ImportNamespaceSpecifier + | ExportSpecifier + | TemplateElement + ): BasicEvaluatedExpression; +} +declare interface Bootstrap { + header: string[]; + beforeStartup: string[]; + startup: string[]; + afterStartup: string[]; + allowInlineStartup: boolean; +} +type BufferEncoding = + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "base64" + | "base64url" + | "latin1" + | "binary" + | "hex"; +type BufferEncodingOption = "buffer" | { encoding: "buffer" }; +type BuildInfo = KnownBuildInfo & Record; +type BuildMeta = KnownBuildMeta & Record; +declare abstract class ByTypeGenerator extends Generator { + map: Record; + generateError?: ( + error: Error, + module: NormalModule, + generateContext: GenerateContext + ) => null | Source; +} +declare const CIRCULAR_CONNECTION: unique symbol; +declare class Cache { + constructor(); + hooks: { + get: AsyncSeriesBailHook< + [ + string, + null | Etag, + ((result: any, callback: (err?: Error) => void) => void)[] + ], + any + >; + store: AsyncParallelHook<[string, null | Etag, any]>; + storeBuildDependencies: AsyncParallelHook<[Iterable]>; + beginIdle: SyncHook<[]>; + endIdle: AsyncParallelHook<[]>; + shutdown: AsyncParallelHook<[]>; + }; + get( + identifier: string, + etag: null | Etag, + callback: CallbackCacheCache + ): void; + store( + identifier: string, + etag: null | Etag, + data: T, + callback: CallbackCacheCache + ): void; + + /** + * After this method has succeeded the cache can only be restored when build dependencies are + */ + storeBuildDependencies( + dependencies: Iterable, + callback: CallbackCacheCache + ): void; + beginIdle(): void; + endIdle(callback: CallbackCacheCache): void; + shutdown(callback: CallbackCacheCache): void; + static STAGE_MEMORY: number; + static STAGE_DEFAULT: number; + static STAGE_DISK: number; + static STAGE_NETWORK: number; +} +declare abstract class CacheFacade { + getChildCache(name: string): CacheFacade; + getItemCache(identifier: string, etag: null | Etag): ItemCacheFacade; + getLazyHashedEtag(obj: HashableObject): Etag; + mergeEtags(a: Etag, b: Etag): Etag; + get( + identifier: string, + etag: null | Etag, + callback: CallbackCacheCacheFacade + ): void; + getPromise(identifier: string, etag: null | Etag): Promise; + store( + identifier: string, + etag: null | Etag, + data: T, + callback: CallbackCacheCacheFacade + ): void; + storePromise( + identifier: string, + etag: null | Etag, + data: T + ): Promise; + provide( + identifier: string, + etag: null | Etag, + computer: (callback: CallbackNormalErrorCache) => void, + callback: CallbackNormalErrorCache + ): void; + providePromise( + identifier: string, + etag: null | Etag, + computer: () => T | Promise + ): Promise; +} +declare interface CacheGroupSource { + key: string; + priority?: number; + getName?: ( + module: Module, + chunks: Chunk[], + key: string + ) => undefined | string; + chunksFilter?: (chunk: Chunk) => undefined | boolean; + enforce?: boolean; + minSize: SplitChunksSizes; + minSizeReduction: SplitChunksSizes; + minRemainingSize: SplitChunksSizes; + enforceSizeThreshold: SplitChunksSizes; + maxAsyncSize: SplitChunksSizes; + maxInitialSize: SplitChunksSizes; + minChunks?: number; + maxAsyncRequests?: number; + maxInitialRequests?: number; + filename?: string | ((pathData: PathData, assetInfo?: AssetInfo) => string); + idHint?: string; + automaticNameDelimiter?: string; + reuseExistingChunk?: boolean; + usedExports?: boolean; +} +declare interface CacheGroupsContext { + moduleGraph: ModuleGraph; + chunkGraph: ChunkGraph; +} +type CacheOptionsNormalized = false | FileCacheOptions | MemoryCacheOptions; +declare class CachedSource extends Source { + constructor(source: Source); + constructor(source: Source | (() => Source), cachedData?: any); + original(): Source; + originalLazy(): Source | (() => Source); + getCachedData(): any; +} +type CallExpression = SimpleCallExpression | NewExpression; +declare interface CallExpressionInfo { + type: "call"; + call: CallExpression; + calleeName: string; + rootInfo: string | VariableInfo; + getCalleeMembers: () => string[]; + name: string; + getMembers: () => string[]; + getMembersOptionals: () => boolean[]; + getMemberRanges: () => [number, number][]; +} +declare interface CallbackAsyncQueue { + (err?: null | WebpackError, result?: null | T): any; +} +declare interface CallbackCacheCache { + (err: null | WebpackError, result?: T): void; +} +declare interface CallbackCacheCacheFacade { + (err?: null | Error, result?: null | T): void; +} +declare interface CallbackFunction_1 { + (err: null | Error, result?: T): any; +} +declare interface CallbackFunction_2 { + (err?: null | Error, result?: T): any; +} +declare interface CallbackNormalErrorCache { + (err?: null | Error, result?: T): void; +} +declare interface CallbackNormalModuleFactory { + (err?: null | Error, stats?: T): void; +} +declare interface CallbackWebpack { + (err: null | Error, stats?: T): void; +} +type Cell = undefined | T; +declare class Chunk { + constructor(name?: null | string, backCompat?: boolean); + id: null | string | number; + ids: null | ChunkId[]; + debugId: number; + name?: null | string; + idNameHints: SortableSet; + preventIntegration: boolean; + filenameTemplate?: + | string + | ((pathData: PathData, assetInfo?: AssetInfo) => string); + cssFilenameTemplate?: + | string + | ((pathData: PathData, assetInfo?: AssetInfo) => string); + runtime: RuntimeSpec; + files: Set; + auxiliaryFiles: Set; + rendered: boolean; + hash?: string; + contentHash: Record; + renderedHash?: string; + chunkReason?: string; + extraAsync: boolean; + get entryModule(): Module; + hasEntryModule(): boolean; + addModule(module: Module): boolean; + removeModule(module: Module): void; + getNumberOfModules(): number; + get modulesIterable(): Iterable; + compareTo(otherChunk: Chunk): 0 | 1 | -1; + containsModule(module: Module): boolean; + getModules(): Module[]; + remove(): void; + moveModule(module: Module, otherChunk: Chunk): void; + integrate(otherChunk: Chunk): boolean; + canBeIntegrated(otherChunk: Chunk): boolean; + isEmpty(): boolean; + modulesSize(): number; + size(options?: ChunkSizeOptions): number; + integratedSize(otherChunk: Chunk, options: ChunkSizeOptions): number; + getChunkModuleMaps(filterFn: (m: Module) => boolean): ChunkModuleMaps; + hasModuleInGraph( + filterFn: (m: Module) => boolean, + filterChunkFn?: (c: Chunk, chunkGraph: ChunkGraph) => boolean + ): boolean; + getChunkMaps(realHash: boolean): ChunkMaps; + hasRuntime(): boolean; + canBeInitial(): boolean; + isOnlyInitial(): boolean; + getEntryOptions(): undefined | EntryOptions; + addGroup(chunkGroup: ChunkGroup): void; + removeGroup(chunkGroup: ChunkGroup): void; + isInGroup(chunkGroup: ChunkGroup): boolean; + getNumberOfGroups(): number; + get groupsIterable(): SortableSet; + disconnectFromGroups(): void; + split(newChunk: Chunk): void; + updateHash(hash: Hash, chunkGraph: ChunkGraph): void; + getAllAsyncChunks(): Set; + getAllInitialChunks(): Set; + getAllReferencedChunks(): Set; + getAllReferencedAsyncEntrypoints(): Set; + hasAsyncChunks(): boolean; + getChildIdsByOrders( + chunkGraph: ChunkGraph, + filterFn?: (c: Chunk, chunkGraph: ChunkGraph) => boolean + ): Record; + getChildrenOfTypeInOrder( + chunkGraph: ChunkGraph, + type: string + ): undefined | { onChunks: Chunk[]; chunks: Set }[]; + getChildIdsByOrdersMap( + chunkGraph: ChunkGraph, + includeDirectChildren?: boolean, + filterFn?: (c: Chunk, chunkGraph: ChunkGraph) => boolean + ): Record>; + hasChildByOrder( + chunkGraph: ChunkGraph, + type: string, + includeDirectChildren?: boolean, + filterFn?: (c: Chunk, chunkGraph: ChunkGraph) => boolean + ): boolean; +} +declare class ChunkGraph { + constructor(moduleGraph: ModuleGraph, hashFunction?: string | typeof Hash); + moduleGraph: ModuleGraph; + connectChunkAndModule(chunk: Chunk, module: Module): void; + disconnectChunkAndModule(chunk: Chunk, module: Module): void; + disconnectChunk(chunk: Chunk): void; + attachModules(chunk: Chunk, modules: Iterable): void; + attachRuntimeModules(chunk: Chunk, modules: Iterable): void; + attachFullHashModules(chunk: Chunk, modules: Iterable): void; + attachDependentHashModules( + chunk: Chunk, + modules: Iterable + ): void; + replaceModule(oldModule: Module, newModule: Module): void; + isModuleInChunk(module: Module, chunk: Chunk): boolean; + isModuleInChunkGroup(module: Module, chunkGroup: ChunkGroup): boolean; + isEntryModule(module: Module): boolean; + getModuleChunksIterable(module: Module): Iterable; + getOrderedModuleChunksIterable( + module: Module, + sortFn: (a: Chunk, b: Chunk) => 0 | 1 | -1 + ): Iterable; + getModuleChunks(module: Module): Chunk[]; + getNumberOfModuleChunks(module: Module): number; + getModuleRuntimes(module: Module): RuntimeSpecSet; + getNumberOfChunkModules(chunk: Chunk): number; + getNumberOfChunkFullHashModules(chunk: Chunk): number; + getChunkModulesIterable(chunk: Chunk): Iterable; + getChunkModulesIterableBySourceType( + chunk: Chunk, + sourceType: string + ): undefined | Iterable; + setChunkModuleSourceTypes( + chunk: Chunk, + module: Module, + sourceTypes: Set + ): void; + getChunkModuleSourceTypes(chunk: Chunk, module: Module): ReadonlySet; + getModuleSourceTypes(module: Module): ReadonlySet; + getOrderedChunkModulesIterable( + chunk: Chunk, + comparator: (a: Module, b: Module) => 0 | 1 | -1 + ): Iterable; + getOrderedChunkModulesIterableBySourceType( + chunk: Chunk, + sourceType: string, + comparator: (a: Module, b: Module) => 0 | 1 | -1 + ): undefined | Iterable; + getChunkModules(chunk: Chunk): Module[]; + getOrderedChunkModules( + chunk: Chunk, + comparator: (a: Module, b: Module) => 0 | 1 | -1 + ): Module[]; + getChunkModuleIdMap( + chunk: Chunk, + filterFn: (m: Module) => boolean, + includeAllChunks?: boolean + ): Record; + getChunkModuleRenderedHashMap( + chunk: Chunk, + filterFn: (m: Module) => boolean, + hashLength?: number, + includeAllChunks?: boolean + ): Record>; + getChunkConditionMap( + chunk: Chunk, + filterFn: (c: Chunk, chunkGraph: ChunkGraph) => boolean + ): Record; + hasModuleInGraph( + chunk: Chunk, + filterFn: (m: Module) => boolean, + filterChunkFn?: (c: Chunk, chunkGraph: ChunkGraph) => boolean + ): boolean; + compareChunks(chunkA: Chunk, chunkB: Chunk): 0 | 1 | -1; + getChunkModulesSize(chunk: Chunk): number; + getChunkModulesSizes(chunk: Chunk): Record; + getChunkRootModules(chunk: Chunk): Module[]; + getChunkSize(chunk: Chunk, options?: ChunkSizeOptions): number; + getIntegratedChunksSize( + chunkA: Chunk, + chunkB: Chunk, + options?: ChunkSizeOptions + ): number; + canChunksBeIntegrated(chunkA: Chunk, chunkB: Chunk): boolean; + integrateChunks(chunkA: Chunk, chunkB: Chunk): void; + upgradeDependentToFullHashModules(chunk: Chunk): void; + isEntryModuleInChunk(module: Module, chunk: Chunk): boolean; + connectChunkAndEntryModule( + chunk: Chunk, + module: Module, + entrypoint: Entrypoint + ): void; + connectChunkAndRuntimeModule(chunk: Chunk, module: RuntimeModule): void; + addFullHashModuleToChunk(chunk: Chunk, module: RuntimeModule): void; + addDependentHashModuleToChunk(chunk: Chunk, module: RuntimeModule): void; + disconnectChunkAndEntryModule(chunk: Chunk, module: Module): void; + disconnectChunkAndRuntimeModule(chunk: Chunk, module: RuntimeModule): void; + disconnectEntryModule(module: Module): void; + disconnectEntries(chunk: Chunk): void; + getNumberOfEntryModules(chunk: Chunk): number; + getNumberOfRuntimeModules(chunk: Chunk): number; + getChunkEntryModulesIterable(chunk: Chunk): Iterable; + getChunkEntryDependentChunksIterable(chunk: Chunk): Iterable; + hasChunkEntryDependentChunks(chunk: Chunk): boolean; + getChunkRuntimeModulesIterable(chunk: Chunk): Iterable; + getChunkRuntimeModulesInOrder(chunk: Chunk): RuntimeModule[]; + getChunkFullHashModulesIterable( + chunk: Chunk + ): undefined | Iterable; + getChunkFullHashModulesSet( + chunk: Chunk + ): undefined | ReadonlySet; + getChunkDependentHashModulesIterable( + chunk: Chunk + ): undefined | Iterable; + getChunkEntryModulesWithChunkGroupIterable( + chunk: Chunk + ): Iterable<[Module, undefined | Entrypoint]>; + getBlockChunkGroup(depBlock: AsyncDependenciesBlock): undefined | ChunkGroup; + connectBlockAndChunkGroup( + depBlock: AsyncDependenciesBlock, + chunkGroup: ChunkGroup + ): void; + disconnectChunkGroup(chunkGroup: ChunkGroup): void; + getModuleId(module: Module): null | string | number; + setModuleId(module: Module, id: ModuleId): void; + getRuntimeId(runtime: string): string | number; + setRuntimeId(runtime: string, id: string | number): void; + hasModuleHashes(module: Module, runtime: RuntimeSpec): boolean; + getModuleHash(module: Module, runtime: RuntimeSpec): string; + getRenderedModuleHash(module: Module, runtime: RuntimeSpec): string; + setModuleHashes( + module: Module, + runtime: RuntimeSpec, + hash: string, + renderedHash: string + ): void; + addModuleRuntimeRequirements( + module: Module, + runtime: RuntimeSpec, + items: Set, + transferOwnership?: boolean + ): void; + addChunkRuntimeRequirements(chunk: Chunk, items: Set): void; + addTreeRuntimeRequirements(chunk: Chunk, items: Iterable): void; + getModuleRuntimeRequirements( + module: Module, + runtime: RuntimeSpec + ): ReadonlySet; + getChunkRuntimeRequirements(chunk: Chunk): ReadonlySet; + getModuleGraphHash( + module: Module, + runtime: RuntimeSpec, + withConnections?: boolean + ): string; + getModuleGraphHashBigInt( + module: Module, + runtime: RuntimeSpec, + withConnections?: boolean + ): bigint; + getTreeRuntimeRequirements(chunk: Chunk): ReadonlySet; + static getChunkGraphForModule( + module: Module, + deprecateMessage: string, + deprecationCode: string + ): ChunkGraph; + static setChunkGraphForModule(module: Module, chunkGraph: ChunkGraph): void; + static clearChunkGraphForModule(module: Module): void; + static getChunkGraphForChunk( + chunk: Chunk, + deprecateMessage: string, + deprecationCode: string + ): ChunkGraph; + static setChunkGraphForChunk(chunk: Chunk, chunkGraph: ChunkGraph): void; + static clearChunkGraphForChunk(chunk: Chunk): void; +} +declare abstract class ChunkGroup { + groupDebugId: number; + options: ChunkGroupOptions; + chunks: Chunk[]; + origins: OriginRecord[]; + index?: number; + + /** + * when a new chunk is added to a chunkGroup, addingOptions will occur. + */ + addOptions(options: ChunkGroupOptions): void; + + /** + * returns the name of current ChunkGroup + * sets a new name for current ChunkGroup + */ + name?: null | string; + + /** + * get a uniqueId for ChunkGroup, made up of its member Chunk debugId's + */ + get debugId(): string; + + /** + * get a unique id for ChunkGroup, made up of its member Chunk id's + */ + get id(): string; + + /** + * Performs an unshift of a specific chunk + */ + unshiftChunk(chunk: Chunk): boolean; + + /** + * inserts a chunk before another existing chunk in group + */ + insertChunk(chunk: Chunk, before: Chunk): boolean; + + /** + * add a chunk into ChunkGroup. Is pushed on or prepended + */ + pushChunk(chunk: Chunk): boolean; + replaceChunk(oldChunk: Chunk, newChunk: Chunk): undefined | boolean; + removeChunk(chunk: Chunk): boolean; + isInitial(): boolean; + addChild(group: ChunkGroup): boolean; + getChildren(): ChunkGroup[]; + getNumberOfChildren(): number; + get childrenIterable(): SortableSet; + removeChild(group: ChunkGroup): boolean; + addParent(parentChunk: ChunkGroup): boolean; + getParents(): ChunkGroup[]; + getNumberOfParents(): number; + hasParent(parent: ChunkGroup): boolean; + get parentsIterable(): SortableSet; + removeParent(chunkGroup: ChunkGroup): boolean; + addAsyncEntrypoint(entrypoint: Entrypoint): boolean; + get asyncEntrypointsIterable(): SortableSet; + getBlocks(): AsyncDependenciesBlock[]; + getNumberOfBlocks(): number; + hasBlock(block: AsyncDependenciesBlock): boolean; + get blocksIterable(): Iterable; + addBlock(block: AsyncDependenciesBlock): boolean; + addOrigin( + module: null | Module, + loc: DependencyLocation, + request: string + ): void; + getFiles(): string[]; + remove(): void; + sortItems(): void; + + /** + * Sorting predicate which allows current ChunkGroup to be compared against another. + * Sorting values are based off of number of chunks in ChunkGroup. + */ + compareTo(chunkGraph: ChunkGraph, otherGroup: ChunkGroup): 0 | 1 | -1; + getChildrenByOrders( + moduleGraph: ModuleGraph, + chunkGraph: ChunkGraph + ): Record; + + /** + * Sets the top-down index of a module in this ChunkGroup + */ + setModulePreOrderIndex(module: Module, index: number): void; + + /** + * Gets the top-down index of a module in this ChunkGroup + */ + getModulePreOrderIndex(module: Module): undefined | number; + + /** + * Sets the bottom-up index of a module in this ChunkGroup + */ + setModulePostOrderIndex(module: Module, index: number): void; + + /** + * Gets the bottom-up index of a module in this ChunkGroup + */ + getModulePostOrderIndex(module: Module): undefined | number; + checkConstraints(): void; + getModuleIndex: (module: Module) => undefined | number; + getModuleIndex2: (module: Module) => undefined | number; +} +type ChunkGroupOptions = RawChunkGroupOptions & { name?: null | string }; +declare interface ChunkHashContext { + /** + * results of code generation + */ + codeGenerationResults: CodeGenerationResults; + + /** + * the runtime template + */ + runtimeTemplate: RuntimeTemplate; + + /** + * the module graph + */ + moduleGraph: ModuleGraph; + + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; +} +type ChunkId = string | number; +declare interface ChunkMaps { + hash: Record; + contentHash: Record>; + name: Record; +} +declare class ChunkModuleIdRangePlugin { + constructor(options: ChunkModuleIdRangePluginOptions); + options: ChunkModuleIdRangePluginOptions; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface ChunkModuleIdRangePluginOptions { + /** + * the chunk name + */ + name: string; + + /** + * order + */ + order?: "index" | "index2" | "preOrderIndex" | "postOrderIndex"; + + /** + * start id + */ + start?: number; + + /** + * end id + */ + end?: number; +} +declare interface ChunkModuleMaps { + id: Record; + hash: Record; +} +type ChunkName = null | string; +declare interface ChunkPathData { + id: string | number; + name?: string; + hash: string; + hashWithLength?: (length: number) => string; + contentHash?: Record; + contentHashWithLength?: Record string>; +} +declare class ChunkPrefetchPreloadPlugin { + constructor(); + apply(compiler: Compiler): void; +} +declare interface ChunkRenderContextCssModulesPlugin { + /** + * the chunk + */ + chunk: Chunk; + + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; + + /** + * results of code generation + */ + codeGenerationResults: CodeGenerationResults; + + /** + * the runtime template + */ + runtimeTemplate: RuntimeTemplate; + + /** + * undo path to css file + */ + undoPath: string; +} +declare interface ChunkRenderContextJavascriptModulesPlugin { + /** + * the chunk + */ + chunk: Chunk; + + /** + * the dependency templates + */ + dependencyTemplates: DependencyTemplates; + + /** + * the runtime template + */ + runtimeTemplate: RuntimeTemplate; + + /** + * the module graph + */ + moduleGraph: ModuleGraph; + + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; + + /** + * results of code generation + */ + codeGenerationResults: CodeGenerationResults; + + /** + * init fragments for the chunk + */ + chunkInitFragments: InitFragment[]; + + /** + * rendering in strict context + */ + strictMode?: boolean; +} +declare interface ChunkSizeOptions { + /** + * constant overhead for a chunk + */ + chunkOverhead?: number; + + /** + * multiplicator for initial chunks + */ + entryChunkMultiplicator?: number; +} +declare abstract class ChunkTemplate { + hooks: Readonly<{ + renderManifest: { + tap: ( + options: + | string + | (TapOptions & { name: string } & IfSet), + fn: ( + renderManifestEntries: RenderManifestEntry[], + renderManifestOptions: RenderManifestOptions + ) => RenderManifestEntry[] + ) => void; + }; + modules: { + tap: ( + options: + | string + | (TapOptions & { name: string } & IfSet), + fn: ( + source: Source, + moduleTemplate: ModuleTemplate, + renderContext: RenderContextJavascriptModulesPlugin + ) => Source + ) => void; + }; + render: { + tap: ( + options: + | string + | (TapOptions & { name: string } & IfSet), + fn: ( + source: Source, + moduleTemplate: ModuleTemplate, + renderContext: RenderContextJavascriptModulesPlugin + ) => Source + ) => void; + }; + renderWithEntry: { + tap: ( + options: + | string + | (TapOptions & { name: string } & IfSet), + fn: (source: Source, chunk: Chunk) => Source + ) => void; + }; + hash: { + tap: ( + options: + | string + | (TapOptions & { name: string } & IfSet), + fn: (hash: Hash) => void + ) => void; + }; + hashForChunk: { + tap: ( + options: + | string + | (TapOptions & { name: string } & IfSet), + fn: ( + hash: Hash, + chunk: Chunk, + chunkHashContext: ChunkHashContext + ) => void + ) => void; + }; + }>; + get outputOptions(): Output; +} + +/** + * Advanced options for cleaning assets. + */ +declare interface CleanOptions { + /** + * Log the assets that should be removed instead of deleting them. + */ + dry?: boolean; + + /** + * Keep these assets. + */ + keep?: string | RegExp | ((filename: string) => boolean); +} +declare class CleanPlugin { + constructor(options?: CleanOptions); + options: { + /** + * Log the assets that should be removed instead of deleting them. + */ + dry: boolean; + /** + * Keep these assets. + */ + keep?: string | RegExp | ((filename: string) => boolean); + }; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; + static getCompilationHooks( + compilation: Compilation + ): CleanPluginCompilationHooks; +} +declare interface CleanPluginCompilationHooks { + /** + * when returning true the file/directory will be kept during cleaning, returning false will clean it and ignore the following plugins and config + */ + keep: SyncBailHook<[string], boolean | void>; +} +declare interface CodeGenerationContext { + /** + * the dependency templates + */ + dependencyTemplates: DependencyTemplates; + + /** + * the runtime template + */ + runtimeTemplate: RuntimeTemplate; + + /** + * the module graph + */ + moduleGraph: ModuleGraph; + + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; + + /** + * the runtimes code should be generated for + */ + runtime: RuntimeSpec; + + /** + * when in concatenated module, information about other concatenated modules + */ + concatenationScope?: ConcatenationScope; + + /** + * code generation results of other modules (need to have a codeGenerationDependency to use that) + */ + codeGenerationResults?: CodeGenerationResults; + + /** + * the compilation + */ + compilation?: Compilation; + + /** + * source types + */ + sourceTypes?: ReadonlySet; +} +declare interface CodeGenerationJob { + module: Module; + hash: string; + runtime: RuntimeSpec; + runtimes: RuntimeSpec[]; +} +declare interface CodeGenerationResult { + /** + * the resulting sources for all source types + */ + sources: Map; + + /** + * the resulting data for all source types + */ + data?: Map; + + /** + * the runtime requirements + */ + runtimeRequirements: null | ReadonlySet; + + /** + * a hash of the code generation result (will be automatically calculated from sources and runtimeRequirements if not provided) + */ + hash?: string; +} +declare abstract class CodeGenerationResults { + map: Map>; + get(module: Module, runtime: RuntimeSpec): CodeGenerationResult; + has(module: Module, runtime: RuntimeSpec): boolean; + getSource(module: Module, runtime: RuntimeSpec, sourceType: string): Source; + getRuntimeRequirements( + module: Module, + runtime: RuntimeSpec + ): null | ReadonlySet; + getData(module: Module, runtime: RuntimeSpec, key: string): any; + getHash(module: Module, runtime: RuntimeSpec): string; + add(module: Module, runtime: RuntimeSpec, result: CodeGenerationResult): void; +} +type CodeValue = + | undefined + | null + | string + | number + | bigint + | boolean + | Function + | RegExp + | RuntimeValue + | { + [index: string]: RecursiveArrayOrRecord< + | undefined + | null + | string + | number + | bigint + | boolean + | Function + | RegExp + | RuntimeValue + >; + } + | RecursiveArrayOrRecord< + | undefined + | null + | string + | number + | bigint + | boolean + | Function + | RegExp + | RuntimeValue + >[]; +type CodeValuePrimitive = + | undefined + | null + | string + | number + | bigint + | boolean + | Function + | RegExp; +declare interface Comparator { + (a: T, b: T): 0 | 1 | -1; +} +declare class CompatSource extends Source { + constructor(sourceLike: SourceLike); + static from(sourceLike: SourceLike): Source; +} +declare class Compilation { + /** + * Creates an instance of Compilation. + */ + constructor(compiler: Compiler, params: CompilationParams); + hooks: Readonly<{ + buildModule: SyncHook<[Module]>; + rebuildModule: SyncHook<[Module]>; + failedModule: SyncHook<[Module, WebpackError]>; + succeedModule: SyncHook<[Module]>; + stillValidModule: SyncHook<[Module]>; + addEntry: SyncHook<[Dependency, EntryOptions]>; + failedEntry: SyncHook<[Dependency, EntryOptions, Error]>; + succeedEntry: SyncHook<[Dependency, EntryOptions, Module]>; + dependencyReferencedExports: SyncWaterfallHook< + [(string[] | ReferencedExport)[], Dependency, RuntimeSpec] + >; + executeModule: SyncHook<[ExecuteModuleArgument, ExecuteModuleContext]>; + prepareModuleExecution: AsyncParallelHook< + [ExecuteModuleArgument, ExecuteModuleContext] + >; + finishModules: AsyncSeriesHook<[Iterable]>; + finishRebuildingModule: AsyncSeriesHook<[Module]>; + unseal: SyncHook<[]>; + seal: SyncHook<[]>; + beforeChunks: SyncHook<[]>; + /** + * The `afterChunks` hook is called directly after the chunks and module graph have + * been created and before the chunks and modules have been optimized. This hook is useful to + * inspect, analyze, and/or modify the chunk graph. + */ + afterChunks: SyncHook<[Iterable]>; + optimizeDependencies: SyncBailHook<[Iterable], boolean | void>; + afterOptimizeDependencies: SyncHook<[Iterable]>; + optimize: SyncHook<[]>; + optimizeModules: SyncBailHook<[Iterable], boolean | void>; + afterOptimizeModules: SyncHook<[Iterable]>; + optimizeChunks: SyncBailHook< + [Iterable, ChunkGroup[]], + boolean | void + >; + afterOptimizeChunks: SyncHook<[Iterable, ChunkGroup[]]>; + optimizeTree: AsyncSeriesHook<[Iterable, Iterable]>; + afterOptimizeTree: SyncHook<[Iterable, Iterable]>; + optimizeChunkModules: AsyncSeriesBailHook< + [Iterable, Iterable], + void + >; + afterOptimizeChunkModules: SyncHook<[Iterable, Iterable]>; + shouldRecord: SyncBailHook<[], boolean | void>; + additionalChunkRuntimeRequirements: SyncHook< + [Chunk, Set, RuntimeRequirementsContext] + >; + runtimeRequirementInChunk: HookMap< + SyncBailHook<[Chunk, Set, RuntimeRequirementsContext], void> + >; + additionalModuleRuntimeRequirements: SyncHook< + [Module, Set, RuntimeRequirementsContext] + >; + runtimeRequirementInModule: HookMap< + SyncBailHook<[Module, Set, RuntimeRequirementsContext], void> + >; + additionalTreeRuntimeRequirements: SyncHook< + [Chunk, Set, RuntimeRequirementsContext] + >; + runtimeRequirementInTree: HookMap< + SyncBailHook<[Chunk, Set, RuntimeRequirementsContext], void> + >; + runtimeModule: SyncHook<[RuntimeModule, Chunk]>; + reviveModules: SyncHook<[Iterable, Records]>; + beforeModuleIds: SyncHook<[Iterable]>; + moduleIds: SyncHook<[Iterable]>; + optimizeModuleIds: SyncHook<[Iterable]>; + afterOptimizeModuleIds: SyncHook<[Iterable]>; + reviveChunks: SyncHook<[Iterable, Records]>; + beforeChunkIds: SyncHook<[Iterable]>; + chunkIds: SyncHook<[Iterable]>; + optimizeChunkIds: SyncHook<[Iterable]>; + afterOptimizeChunkIds: SyncHook<[Iterable]>; + recordModules: SyncHook<[Iterable, Records]>; + recordChunks: SyncHook<[Iterable, Records]>; + optimizeCodeGeneration: SyncHook<[Iterable]>; + beforeModuleHash: SyncHook<[]>; + afterModuleHash: SyncHook<[]>; + beforeCodeGeneration: SyncHook<[]>; + afterCodeGeneration: SyncHook<[]>; + beforeRuntimeRequirements: SyncHook<[]>; + afterRuntimeRequirements: SyncHook<[]>; + beforeHash: SyncHook<[]>; + contentHash: SyncHook<[Chunk]>; + afterHash: SyncHook<[]>; + recordHash: SyncHook<[Records]>; + record: SyncHook<[Compilation, Records]>; + beforeModuleAssets: SyncHook<[]>; + shouldGenerateChunkAssets: SyncBailHook<[], boolean | void>; + beforeChunkAssets: SyncHook<[]>; + additionalChunkAssets: FakeHook< + Pick< + AsyncSeriesHook<[Set]>, + "name" | "tap" | "tapAsync" | "tapPromise" + > + >; + additionalAssets: FakeHook< + Pick, "name" | "tap" | "tapAsync" | "tapPromise"> + >; + optimizeChunkAssets: FakeHook< + Pick< + AsyncSeriesHook<[Set]>, + "name" | "tap" | "tapAsync" | "tapPromise" + > + >; + afterOptimizeChunkAssets: FakeHook< + Pick< + AsyncSeriesHook<[Set]>, + "name" | "tap" | "tapAsync" | "tapPromise" + > + >; + optimizeAssets: AsyncSeriesHook< + [CompilationAssets], + ProcessAssetsAdditionalOptions + >; + afterOptimizeAssets: SyncHook<[CompilationAssets]>; + processAssets: AsyncSeriesHook< + [CompilationAssets], + ProcessAssetsAdditionalOptions + >; + afterProcessAssets: SyncHook<[CompilationAssets]>; + processAdditionalAssets: AsyncSeriesHook<[CompilationAssets]>; + needAdditionalSeal: SyncBailHook<[], boolean | void>; + afterSeal: AsyncSeriesHook<[]>; + renderManifest: SyncWaterfallHook< + [RenderManifestEntry[], RenderManifestOptions] + >; + fullHash: SyncHook<[Hash]>; + chunkHash: SyncHook<[Chunk, Hash, ChunkHashContext]>; + moduleAsset: SyncHook<[Module, string]>; + chunkAsset: SyncHook<[Chunk, string]>; + assetPath: SyncWaterfallHook<[string, PathData, undefined | AssetInfo]>; + needAdditionalPass: SyncBailHook<[], boolean | void>; + childCompiler: SyncHook<[Compiler, string, number]>; + log: SyncBailHook<[string, LogEntry], boolean | void>; + processWarnings: SyncWaterfallHook<[Error[]]>; + processErrors: SyncWaterfallHook<[Error[]]>; + statsPreset: HookMap< + SyncHook<[Partial, CreateStatsOptionsContext]> + >; + statsNormalize: SyncHook< + [Partial, CreateStatsOptionsContext] + >; + statsFactory: SyncHook<[StatsFactory, NormalizedStatsOptions]>; + statsPrinter: SyncHook<[StatsPrinter, NormalizedStatsOptions]>; + get normalModuleLoader(): SyncHook< + [LoaderContextNormalModule, NormalModule] + >; + }>; + name?: string; + startTime?: number; + endTime?: number; + compiler: Compiler; + resolverFactory: ResolverFactory; + inputFileSystem: InputFileSystem; + fileSystemInfo: FileSystemInfo; + valueCacheVersions: Map>; + requestShortener: RequestShortener; + compilerPath: string; + logger: WebpackLogger; + options: WebpackOptionsNormalized; + outputOptions: OutputNormalized; + bail: boolean; + profile: boolean; + params: CompilationParams; + mainTemplate: MainTemplate; + chunkTemplate: ChunkTemplate; + runtimeTemplate: RuntimeTemplate; + moduleTemplates: ModuleTemplates; + moduleMemCaches?: Map>; + moduleMemCaches2?: Map>; + moduleGraph: ModuleGraph; + chunkGraph: ChunkGraph; + codeGenerationResults: CodeGenerationResults; + processDependenciesQueue: AsyncQueue; + addModuleQueue: AsyncQueue; + factorizeQueue: AsyncQueue< + FactorizeModuleOptions, + string, + Module | ModuleFactoryResult + >; + buildQueue: AsyncQueue; + rebuildQueue: AsyncQueue; + + /** + * Modules in value are building during the build of Module in key. + * Means value blocking key from finishing. + * Needed to detect build cycles. + */ + creatingModuleDuringBuild: WeakMap>; + entries: Map; + globalEntry: EntryData; + entrypoints: Map; + asyncEntrypoints: Entrypoint[]; + chunks: Set; + chunkGroups: ChunkGroup[]; + namedChunkGroups: Map; + namedChunks: Map; + modules: Set; + records: null | Records; + additionalChunkAssets: string[]; + assets: CompilationAssets; + assetsInfo: Map; + errors: Error[]; + warnings: Error[]; + children: Compilation[]; + logging: Map; + dependencyFactories: Map; + dependencyTemplates: DependencyTemplates; + childrenCounters: Record; + usedChunkIds: null | Set; + usedModuleIds: null | Set; + needAdditionalPass: boolean; + builtModules: WeakSet; + codeGeneratedModules: WeakSet; + buildTimeExecutedModules: WeakSet; + emittedAssets: Set; + comparedForEmitAssets: Set; + fileDependencies: LazySet; + contextDependencies: LazySet; + missingDependencies: LazySet; + buildDependencies: LazySet; + compilationDependencies: { add: (item: string) => LazySet }; + getStats(): Stats; + createStatsOptions( + optionsOrPreset?: string | boolean | StatsOptions, + context?: CreateStatsOptionsContext + ): NormalizedStatsOptions; + createStatsFactory(options: NormalizedStatsOptions): StatsFactory; + createStatsPrinter(options: NormalizedStatsOptions): StatsPrinter; + getCache(name: string): CacheFacade; + getLogger(name: string | (() => string)): WebpackLogger; + addModule( + module: Module, + callback: (err?: null | WebpackError, result?: null | Module) => void + ): void; + + /** + * Fetches a module from a compilation by its identifier + */ + getModule(module: Module): Module; + + /** + * Attempts to search for a module by its identifier + */ + findModule(identifier: string): undefined | Module; + + /** + * Schedules a build of the module object + */ + buildModule( + module: Module, + callback: (err?: null | WebpackError, result?: null | Module) => void + ): void; + processModuleDependencies( + module: Module, + callback: (err?: null | WebpackError, result?: null | Module) => void + ): void; + processModuleDependenciesNonRecursive(module: Module): void; + handleModuleCreation( + __0: HandleModuleCreationOptions, + callback: (err?: null | WebpackError, result?: null | Module) => void + ): void; + addModuleChain( + context: string, + dependency: Dependency, + callback: (err?: null | WebpackError, result?: null | Module) => void + ): void; + addModuleTree( + __0: { + /** + * context string path + */ + context: string; + /** + * dependency used to create Module chain + */ + dependency: Dependency; + /** + * additional context info for the root module + */ + contextInfo?: Partial; + }, + callback: (err?: null | WebpackError, result?: null | Module) => void + ): void; + addEntry( + context: string, + entry: Dependency, + optionsOrName: string | EntryOptions, + callback: (err?: null | WebpackError, result?: null | Module) => void + ): void; + addInclude( + context: string, + dependency: Dependency, + options: EntryOptions, + callback: (err?: null | WebpackError, result?: null | Module) => void + ): void; + rebuildModule( + module: Module, + callback: (err?: null | WebpackError, result?: null | Module) => void + ): void; + finish(callback: (err?: null | WebpackError) => void): void; + unseal(): void; + seal(callback: (err?: null | WebpackError) => void): void; + reportDependencyErrorsAndWarnings( + module: Module, + blocks: DependenciesBlock[] + ): boolean; + codeGeneration(callback: (err?: null | WebpackError) => void): void; + processRuntimeRequirements(__0?: { + /** + * the chunk graph + */ + chunkGraph?: ChunkGraph; + /** + * modules + */ + modules?: Iterable; + /** + * chunks + */ + chunks?: Iterable; + /** + * codeGenerationResults + */ + codeGenerationResults?: CodeGenerationResults; + /** + * chunkGraphEntries + */ + chunkGraphEntries?: Iterable; + }): void; + addRuntimeModule( + chunk: Chunk, + module: RuntimeModule, + chunkGraph?: ChunkGraph + ): void; + + /** + * If `module` is passed, `loc` and `request` must also be passed. + */ + addChunkInGroup( + groupOptions: string | ChunkGroupOptions, + module?: Module, + loc?: SyntheticDependencyLocation | RealDependencyLocation, + request?: string + ): ChunkGroup; + addAsyncEntrypoint( + options: EntryOptions, + module: Module, + loc: DependencyLocation, + request: string + ): Entrypoint; + + /** + * This method first looks to see if a name is provided for a new chunk, + * and first looks to see if any named chunks already exist and reuse that chunk instead. + */ + addChunk(name?: null | string): Chunk; + assignDepth(module: Module): void; + assignDepths(modules: Set): void; + getDependencyReferencedExports( + dependency: Dependency, + runtime: RuntimeSpec + ): (string[] | ReferencedExport)[]; + removeReasonsOfDependencyBlock( + module: Module, + block: DependenciesBlockLike + ): void; + patchChunksAfterReasonRemoval(module: Module, chunk: Chunk): void; + removeChunkFromDependencies(block: DependenciesBlock, chunk: Chunk): void; + assignRuntimeIds(): void; + sortItemsWithChunkIds(): void; + summarizeDependencies(): void; + createModuleHashes(): void; + createHash(): CodeGenerationJob[]; + fullHash?: string; + hash?: string; + emitAsset(file: string, source: Source, assetInfo?: AssetInfo): void; + updateAsset( + file: string, + newSourceOrFunction: Source | ((source: Source) => Source), + assetInfoUpdateOrFunction?: + | AssetInfo + | ((assetInfo?: AssetInfo) => undefined | AssetInfo) + ): void; + renameAsset(file: string, newFile: string): void; + deleteAsset(file: string): void; + getAssets(): Readonly[]; + getAsset(name: string): undefined | Readonly; + clearAssets(): void; + createModuleAssets(): void; + getRenderManifest(options: RenderManifestOptions): RenderManifestEntry[]; + createChunkAssets(callback: (err?: null | WebpackError) => void): void; + getPath(filename: TemplatePath, data?: PathData): string; + getPathWithInfo( + filename: TemplatePath, + data?: PathData + ): InterpolatedPathAndAssetInfo; + getAssetPath(filename: TemplatePath, data: PathData): string; + getAssetPathWithInfo( + filename: TemplatePath, + data: PathData + ): InterpolatedPathAndAssetInfo; + getWarnings(): Error[]; + getErrors(): Error[]; + + /** + * This function allows you to run another instance of webpack inside of webpack however as + * a child with different settings and configurations (if desired) applied. It copies all hooks, plugins + * from parent (or top level compiler) and creates a child Compilation + */ + createChildCompiler( + name: string, + outputOptions?: Partial, + plugins?: ( + | ((this: Compiler, compiler: Compiler) => void) + | WebpackPluginInstance + )[] + ): Compiler; + executeModule( + module: Module, + options: ExecuteModuleOptions, + callback: (err: null | WebpackError, result?: ExecuteModuleResult) => void + ): void; + checkConstraints(): void; + factorizeModule: { + ( + options: FactorizeModuleOptions & { factoryResult?: false }, + callback: (err?: null | WebpackError, result?: null | Module) => void + ): void; + ( + options: FactorizeModuleOptions & { factoryResult: true }, + callback: ( + err?: null | WebpackError, + result?: ModuleFactoryResult + ) => void + ): void; + }; + + /** + * Add additional assets to the compilation. + */ + static PROCESS_ASSETS_STAGE_ADDITIONAL: number; + + /** + * Basic preprocessing of assets. + */ + static PROCESS_ASSETS_STAGE_PRE_PROCESS: number; + + /** + * Derive new assets from existing assets. + * Existing assets should not be treated as complete. + */ + static PROCESS_ASSETS_STAGE_DERIVED: number; + + /** + * Add additional sections to existing assets, like a banner or initialization code. + */ + static PROCESS_ASSETS_STAGE_ADDITIONS: number; + + /** + * Optimize existing assets in a general way. + */ + static PROCESS_ASSETS_STAGE_OPTIMIZE: number; + + /** + * Optimize the count of existing assets, e. g. by merging them. + * Only assets of the same type should be merged. + * For assets of different types see PROCESS_ASSETS_STAGE_OPTIMIZE_INLINE. + */ + static PROCESS_ASSETS_STAGE_OPTIMIZE_COUNT: number; + + /** + * Optimize the compatibility of existing assets, e. g. add polyfills or vendor-prefixes. + */ + static PROCESS_ASSETS_STAGE_OPTIMIZE_COMPATIBILITY: number; + + /** + * Optimize the size of existing assets, e. g. by minimizing or omitting whitespace. + */ + static PROCESS_ASSETS_STAGE_OPTIMIZE_SIZE: number; + + /** + * Add development tooling to assets, e. g. by extracting a SourceMap. + */ + static PROCESS_ASSETS_STAGE_DEV_TOOLING: number; + + /** + * Optimize the count of existing assets, e. g. by inlining assets of into other assets. + * Only assets of different types should be inlined. + * For assets of the same type see PROCESS_ASSETS_STAGE_OPTIMIZE_COUNT. + */ + static PROCESS_ASSETS_STAGE_OPTIMIZE_INLINE: number; + + /** + * Summarize the list of existing assets + * e. g. creating an assets manifest of Service Workers. + */ + static PROCESS_ASSETS_STAGE_SUMMARIZE: number; + + /** + * Optimize the hashes of the assets, e. g. by generating real hashes of the asset content. + */ + static PROCESS_ASSETS_STAGE_OPTIMIZE_HASH: number; + + /** + * Optimize the transfer of existing assets, e. g. by preparing a compressed (gzip) file as separate asset. + */ + static PROCESS_ASSETS_STAGE_OPTIMIZE_TRANSFER: number; + + /** + * Analyse existing assets. + */ + static PROCESS_ASSETS_STAGE_ANALYSE: number; + + /** + * Creating assets for reporting purposes. + */ + static PROCESS_ASSETS_STAGE_REPORT: number; +} +declare interface CompilationAssets { + [index: string]: Source; +} +declare interface CompilationHooksAsyncWebAssemblyModulesPlugin { + renderModuleContent: SyncWaterfallHook< + [Source, Module, WebAssemblyRenderContext] + >; +} +declare interface CompilationHooksCssModulesPlugin { + renderModulePackage: SyncWaterfallHook< + [Source, Module, ChunkRenderContextCssModulesPlugin] + >; + chunkHash: SyncHook<[Chunk, Hash, ChunkHashContext]>; +} +declare interface CompilationHooksJavascriptModulesPlugin { + renderModuleContent: SyncWaterfallHook< + [Source, Module, ChunkRenderContextJavascriptModulesPlugin] + >; + renderModuleContainer: SyncWaterfallHook< + [Source, Module, ChunkRenderContextJavascriptModulesPlugin] + >; + renderModulePackage: SyncWaterfallHook< + [Source, Module, ChunkRenderContextJavascriptModulesPlugin] + >; + renderChunk: SyncWaterfallHook< + [Source, RenderContextJavascriptModulesPlugin] + >; + renderMain: SyncWaterfallHook<[Source, RenderContextJavascriptModulesPlugin]>; + renderContent: SyncWaterfallHook< + [Source, RenderContextJavascriptModulesPlugin] + >; + render: SyncWaterfallHook<[Source, RenderContextJavascriptModulesPlugin]>; + renderStartup: SyncWaterfallHook<[Source, Module, StartupRenderContext]>; + renderRequire: SyncWaterfallHook<[string, RenderBootstrapContext]>; + inlineInRuntimeBailout: SyncBailHook< + [Module, RenderBootstrapContext], + string | void + >; + embedInRuntimeBailout: SyncBailHook< + [Module, RenderContextJavascriptModulesPlugin], + string | void + >; + strictRuntimeBailout: SyncBailHook< + [RenderContextJavascriptModulesPlugin], + string | void + >; + chunkHash: SyncHook<[Chunk, Hash, ChunkHashContext]>; + useSourceMap: SyncBailHook< + [Chunk, RenderContextJavascriptModulesPlugin], + boolean | void + >; +} +declare interface CompilationHooksModuleFederationPlugin { + addContainerEntryDependency: SyncHook; + addFederationRuntimeDependency: SyncHook; +} +declare interface CompilationHooksRealContentHashPlugin { + updateHash: SyncBailHook<[Buffer[], string], string | void>; +} +declare interface CompilationParams { + normalModuleFactory: NormalModuleFactory; + contextModuleFactory: ContextModuleFactory; +} +declare class Compiler { + constructor(context: string, options?: WebpackOptionsNormalized); + hooks: Readonly<{ + initialize: SyncHook<[]>; + shouldEmit: SyncBailHook<[Compilation], boolean | void>; + done: AsyncSeriesHook<[Stats]>; + afterDone: SyncHook<[Stats]>; + additionalPass: AsyncSeriesHook<[]>; + beforeRun: AsyncSeriesHook<[Compiler]>; + run: AsyncSeriesHook<[Compiler]>; + emit: AsyncSeriesHook<[Compilation]>; + assetEmitted: AsyncSeriesHook<[string, AssetEmittedInfo]>; + afterEmit: AsyncSeriesHook<[Compilation]>; + thisCompilation: SyncHook<[Compilation, CompilationParams]>; + compilation: SyncHook<[Compilation, CompilationParams]>; + normalModuleFactory: SyncHook<[NormalModuleFactory]>; + contextModuleFactory: SyncHook<[ContextModuleFactory]>; + beforeCompile: AsyncSeriesHook<[CompilationParams]>; + compile: SyncHook<[CompilationParams]>; + make: AsyncParallelHook<[Compilation]>; + finishMake: AsyncParallelHook<[Compilation]>; + afterCompile: AsyncSeriesHook<[Compilation]>; + readRecords: AsyncSeriesHook<[]>; + emitRecords: AsyncSeriesHook<[]>; + watchRun: AsyncSeriesHook<[Compiler]>; + failed: SyncHook<[Error]>; + invalid: SyncHook<[null | string, number]>; + watchClose: SyncHook<[]>; + shutdown: AsyncSeriesHook<[]>; + infrastructureLog: SyncBailHook< + [string, string, undefined | any[]], + true | void + >; + environment: SyncHook<[]>; + afterEnvironment: SyncHook<[]>; + afterPlugins: SyncHook<[Compiler]>; + afterResolvers: SyncHook<[Compiler]>; + entryOption: SyncBailHook<[string, EntryNormalized], boolean | void>; + }>; + webpack: typeof exports; + name?: string; + parentCompilation?: Compilation; + root: Compiler; + outputPath: string; + watching?: Watching; + outputFileSystem: null | OutputFileSystem; + intermediateFileSystem: null | IntermediateFileSystem; + inputFileSystem: null | InputFileSystem; + watchFileSystem: null | WatchFileSystem; + recordsInputPath: null | string; + recordsOutputPath: null | string; + records: Record; + managedPaths: Set; + unmanagedPaths: Set; + immutablePaths: Set; + modifiedFiles?: ReadonlySet; + removedFiles?: ReadonlySet; + fileTimestamps?: Map; + contextTimestamps?: Map; + fsStartTime?: number; + resolverFactory: ResolverFactory; + infrastructureLogger?: ( + value: string, + type: LogTypeEnum, + args?: any[] + ) => void; + platform: Readonly; + options: WebpackOptionsNormalized; + context: string; + requestShortener: RequestShortener; + cache: Cache; + moduleMemCaches?: Map; + compilerPath: string; + running: boolean; + idle: boolean; + watchMode: boolean; + getCache(name: string): CacheFacade; + getInfrastructureLogger(name: string | (() => string)): WebpackLogger; + watch(watchOptions: WatchOptions, handler: RunCallback): Watching; + run(callback: RunCallback): void; + runAsChild( + callback: ( + err: null | Error, + entries?: Chunk[], + compilation?: Compilation + ) => any + ): void; + purgeInputFileSystem(): void; + emitAssets( + compilation: Compilation, + callback: CallbackFunction_2 + ): void; + emitRecords(callback: CallbackFunction_2): void; + readRecords(callback: CallbackFunction_2): void; + createChildCompiler( + compilation: Compilation, + compilerName: string, + compilerIndex: number, + outputOptions?: Partial, + plugins?: WebpackPluginInstance[] + ): Compiler; + isChild(): boolean; + createCompilation(params: CompilationParams): Compilation; + newCompilation(params: CompilationParams): Compilation; + createNormalModuleFactory(): NormalModuleFactory; + createContextModuleFactory(): ContextModuleFactory; + newCompilationParams(): { + normalModuleFactory: NormalModuleFactory; + contextModuleFactory: ContextModuleFactory; + }; + compile(callback: RunCallback): void; + close(callback: RunCallback): void; +} +declare class ConcatSource extends Source { + constructor(...args: (string | Source)[]); + getChildren(): Source[]; + add(item: string | Source): void; + addAllSkipOptimizing(items: Source[]): void; +} +declare interface ConcatenatedModuleInfo { + type: "concatenated"; + module: Module; + index: number; + ast?: Program; + internalSource?: Source; + source?: ReplaceSource; + chunkInitFragments?: InitFragment[]; + runtimeRequirements?: ReadonlySet; + globalScope?: Scope; + moduleScope?: Scope; + internalNames: Map; + exportMap?: Map; + rawExportMap?: Map; + namespaceExportSymbol?: string; + namespaceObjectName?: string; + interopNamespaceObjectUsed: boolean; + interopNamespaceObjectName?: string; + interopNamespaceObject2Used: boolean; + interopNamespaceObject2Name?: string; + interopDefaultAccessUsed: boolean; + interopDefaultAccessName?: string; +} +declare interface ConcatenationBailoutReasonContext { + /** + * the module graph + */ + moduleGraph: ModuleGraph; + + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; +} +declare class ConcatenationScope { + constructor( + modulesMap: ModuleInfo[] | Map, + currentModule: ConcatenatedModuleInfo + ); + isModuleInScope(module: Module): boolean; + registerExport(exportName: string, symbol: string): void; + registerRawExport(exportName: string, expression: string): void; + registerNamespaceExport(symbol: string): void; + createModuleReference( + module: Module, + __1: Partial + ): string; + static isModuleReference(name: string): boolean; + static matchModuleReference( + name: string + ): null | (ModuleReferenceOptions & { index: number }); + static DEFAULT_EXPORT: string; + static NAMESPACE_OBJECT_EXPORT: string; +} + +/** + * Options object as provided by the user. + */ +declare interface Configuration { + /** + * Set the value of `require.amd` and `define.amd`. Or disable AMD support. + */ + amd?: false | { [index: string]: any }; + + /** + * Report the first error as a hard error instead of tolerating it. + */ + bail?: boolean; + + /** + * Cache generated modules and chunks to improve performance for multiple incremental builds. + */ + cache?: boolean | FileCacheOptions | MemoryCacheOptions; + + /** + * The base directory (absolute path!) for resolving the `entry` option. If `output.pathinfo` is set, the included pathinfo is shortened to this directory. + */ + context?: string; + + /** + * References to other configurations to depend on. + */ + dependencies?: string[]; + + /** + * A developer tool to enhance debugging (false | eval | [inline-|hidden-|eval-][nosources-][cheap-[module-]]source-map). + */ + devtool?: string | false; + + /** + * The entry point(s) of the compilation. + */ + entry?: + | string + | (() => string | EntryObject | string[] | Promise) + | EntryObject + | string[]; + + /** + * Enables/Disables experiments (experimental features with relax SemVer compatibility). + */ + experiments?: Experiments; + + /** + * Extend configuration from another configuration (only works when using webpack-cli). + */ + extends?: string | string[]; + + /** + * Specify dependencies that shouldn't be resolved by webpack, but should become dependencies of the resulting bundle. The kind of the dependency depends on `output.libraryTarget`. + */ + externals?: + | string + | RegExp + | (ExternalItemObjectKnown & ExternalItemObjectUnknown) + | (( + data: ExternalItemFunctionData, + callback: ( + err?: null | Error, + result?: string | boolean | string[] | { [index: string]: any } + ) => void + ) => void) + | ((data: ExternalItemFunctionData) => Promise) + | ExternalItem[]; + + /** + * Enable presets of externals for specific targets. + */ + externalsPresets?: ExternalsPresets; + + /** + * Specifies the default type of externals ('amd*', 'umd*', 'system' and 'jsonp' depend on output.libraryTarget set to the same value). + */ + externalsType?: + | "import" + | "var" + | "module" + | "assign" + | "this" + | "window" + | "self" + | "global" + | "commonjs" + | "commonjs2" + | "commonjs-module" + | "commonjs-static" + | "amd" + | "amd-require" + | "umd" + | "umd2" + | "jsonp" + | "system" + | "promise" + | "module-import" + | "script" + | "node-commonjs"; + + /** + * Ignore specific warnings. + */ + ignoreWarnings?: ( + | RegExp + | { + /** + * A RegExp to select the origin file for the warning. + */ + file?: RegExp; + /** + * A RegExp to select the warning message. + */ + message?: RegExp; + /** + * A RegExp to select the origin module for the warning. + */ + module?: RegExp; + } + | ((warning: Error, compilation: Compilation) => boolean) + )[]; + + /** + * Options for infrastructure level logging. + */ + infrastructureLogging?: InfrastructureLogging; + + /** + * Custom values available in the loader context. + */ + loader?: Loader; + + /** + * Enable production optimizations or development hints. + */ + mode?: "none" | "development" | "production"; + + /** + * Options affecting the normal modules (`NormalModuleFactory`). + */ + module?: ModuleOptions; + + /** + * Name of the configuration. Used when loading multiple configurations. + */ + name?: string; + + /** + * Include polyfills or mocks for various node stuff. + */ + node?: false | NodeOptions; + + /** + * Enables/Disables integrated optimizations. + */ + optimization?: Optimization; + + /** + * Options affecting the output of the compilation. `output` options tell webpack how to write the compiled files to disk. + */ + output?: Output; + + /** + * The number of parallel processed modules in the compilation. + */ + parallelism?: number; + + /** + * Configuration for web performance recommendations. + */ + performance?: false | PerformanceOptions; + + /** + * Add additional plugins to the compiler. + */ + plugins?: ( + | undefined + | null + | false + | "" + | 0 + | ((this: Compiler, compiler: Compiler) => void) + | WebpackPluginInstance + )[]; + + /** + * Capture timing information for each module. + */ + profile?: boolean; + + /** + * Store compiler state to a json file. + */ + recordsInputPath?: string | false; + + /** + * Load compiler state from a json file. + */ + recordsOutputPath?: string | false; + + /** + * Store/Load compiler state from/to a json file. This will result in persistent ids of modules and chunks. An absolute path is expected. `recordsPath` is used for `recordsInputPath` and `recordsOutputPath` if they left undefined. + */ + recordsPath?: string | false; + + /** + * Options for the resolver. + */ + resolve?: ResolveOptions; + + /** + * Options for the resolver when resolving loaders. + */ + resolveLoader?: ResolveOptions; + + /** + * Options affecting how file system snapshots are created and validated. + */ + snapshot?: SnapshotOptionsWebpackOptions; + + /** + * Stats options object or preset name. + */ + stats?: + | boolean + | StatsOptions + | "none" + | "verbose" + | "summary" + | "errors-only" + | "errors-warnings" + | "minimal" + | "normal" + | "detailed"; + + /** + * Environment to build for. An array of environments to build for all of them when possible. + */ + target?: string | false | string[]; + + /** + * Enter watch mode, which rebuilds on file change. + */ + watch?: boolean; + + /** + * Options for the watcher. + */ + watchOptions?: WatchOptions; +} +type ConnectionState = + | boolean + | typeof TRANSITIVE_ONLY + | typeof CIRCULAR_CONNECTION; +declare class ConstDependency extends NullDependency { + constructor( + expression: string, + range: number | [number, number], + runtimeRequirements?: null | string[] + ); + expression: string; + range: number | [number, number]; + runtimeRequirements: null | Set; + static Template: typeof ConstDependencyTemplate; + static NO_EXPORTS_REFERENCED: string[][]; + static EXPORTS_OBJECT_REFERENCED: string[][]; + static TRANSITIVE: typeof TRANSITIVE; +} +declare class ConstDependencyTemplate extends NullDependencyTemplate { + constructor(); +} +declare interface Constructor { + new (...params: any[]): any; +} +declare class ConsumeSharedPlugin { + constructor(options: ConsumeSharedPluginOptions); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} + +/** + * Options for consuming shared modules. + */ +declare interface ConsumeSharedPluginOptions { + /** + * Modules that should be consumed from share scope. When provided, property names are used to match requested modules in this compilation. + */ + consumes: Consumes; + + /** + * Share scope name used for all consumed modules (defaults to 'default'). + */ + shareScope?: string; +} +type Consumes = (string | ConsumesObject)[] | ConsumesObject; + +/** + * Advanced configuration for modules that should be consumed from share scope. + */ +declare interface ConsumesConfig { + /** + * Include the fallback module directly instead behind an async request. This allows to use fallback module in initial load too. All possible shared modules need to be eager too. + */ + eager?: boolean; + + /** + * Fallback module if no shared module is found in share scope. Defaults to the property name. + */ + import?: string | false; + + /** + * Package name to determine required version from description file. This is only needed when package name can't be automatically determined from request. + */ + packageName?: string; + + /** + * Version requirement from module in share scope. + */ + requiredVersion?: string | false; + + /** + * Module is looked up under this key from the share scope. + */ + shareKey?: string; + + /** + * Share scope name. + */ + shareScope?: string; + + /** + * Allow only a single version of the shared module in share scope (disabled by default). + */ + singleton?: boolean; + + /** + * Do not accept shared module if version is not valid (defaults to yes, if local fallback module is available and shared module is not a singleton, otherwise no, has no effect if there is no required version specified). + */ + strictVersion?: boolean; +} + +/** + * Modules that should be consumed from share scope. Property names are used to match requested modules in this compilation. Relative requests are resolved, module requests are matched unresolved, absolute paths will match resolved requests. A trailing slash will match all requests with this prefix. In this case shareKey must also have a trailing slash. + */ +declare interface ConsumesObject { + [index: string]: string | ConsumesConfig; +} +type ContainerOptionsFormat = Item | (string | Item)[]; +declare class ContainerPlugin { + constructor(options: ContainerPluginOptions); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface ContainerPluginOptions { + /** + * Modules that should be exposed by this container. When provided, property name is used as public name, otherwise public name is automatically inferred from request. + */ + exposes: Exposes; + + /** + * The filename for this container relative path inside the `output.path` directory. + */ + filename?: string; + + /** + * Options for library. + */ + library?: LibraryOptions; + + /** + * The name for this container. + */ + name: string; + + /** + * The name of the runtime chunk. If set a runtime chunk with this name is created or an existing entrypoint is used as runtime. + */ + runtime?: string | false; + + /** + * The name of the share scope which is shared with the host (defaults to 'default'). + */ + shareScope?: string; +} +declare class ContainerReferencePlugin { + constructor(options: ContainerReferencePluginOptions); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface ContainerReferencePluginOptions { + /** + * The external type of the remote containers. + */ + remoteType: ExternalsType; + + /** + * Container locations and request scopes from which modules should be resolved and loaded at runtime. When provided, property name is used as request scope, otherwise request scope is automatically inferred from container location. + */ + remotes: Remotes; + + /** + * The name of the share scope shared with all remotes (defaults to 'default'). + */ + shareScope?: string; +} +declare interface ContextAlternativeRequest { + context: string; + request: string; +} +declare abstract class ContextElementDependency extends ModuleDependency { + referencedExports?: null | string[][]; +} +declare class ContextExclusionPlugin { + constructor(negativeMatcher: RegExp); + negativeMatcher: RegExp; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface ContextFileSystemInfoEntry { + safeTime: number; + timestampHash?: string; + resolved?: ResolvedContextFileSystemInfoEntry; + symlinks?: Set; +} +declare interface ContextHash { + hash: string; + resolved?: string; + symlinks?: Set; +} +type ContextMode = + | "weak" + | "eager" + | "lazy" + | "lazy-once" + | "sync" + | "async-weak"; +declare abstract class ContextModuleFactory extends ModuleFactory { + hooks: Readonly<{ + beforeResolve: AsyncSeriesWaterfallHook<[any]>; + afterResolve: AsyncSeriesWaterfallHook<[any]>; + contextModuleFiles: SyncWaterfallHook<[string[]]>; + alternatives: FakeHook< + Pick< + AsyncSeriesWaterfallHook<[ContextAlternativeRequest[]]>, + "name" | "tap" | "tapAsync" | "tapPromise" + > + >; + alternativeRequests: AsyncSeriesWaterfallHook< + [ContextAlternativeRequest[], ContextModuleOptions] + >; + }>; + resolverFactory: ResolverFactory; + resolveDependencies( + fs: InputFileSystem, + options: ContextModuleOptions, + callback: ( + err: null | Error, + dependencies?: ContextElementDependency[] + ) => any + ): void; +} + +declare interface ContextModuleOptions { + mode: ContextMode; + recursive: boolean; + regExp: RegExp; + namespaceObject?: boolean | "strict"; + addon?: string; + chunkName?: null | string; + include?: null | RegExp; + exclude?: null | RegExp; + groupOptions?: RawChunkGroupOptions; + typePrefix?: string; + category?: string; + + /** + * exports referenced from modules (won't be mangled) + */ + referencedExports?: null | string[][]; + layer?: string; + attributes?: ImportAttributes; + resource: string | false | string[]; + resourceQuery?: string; + resourceFragment?: string; + resolveOptions?: ResolveOptions; +} +declare class ContextReplacementPlugin { + constructor( + resourceRegExp: RegExp, + newContentResource?: string | boolean | RegExp | ((context?: any) => void), + newContentRecursive?: boolean | RegExp | NewContentCreateContextMap, + newContentRegExp?: RegExp + ); + resourceRegExp: RegExp; + newContentCallback?: (context?: any) => void; + newContentResource?: string; + newContentCreateContextMap?: ( + fs: InputFileSystem, + callback: ( + err: null | Error, + newContentRecursive: NewContentCreateContextMap + ) => void + ) => void; + newContentRecursive?: boolean; + newContentRegExp?: RegExp; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +type ContextTimestamp = null | ContextFileSystemInfoEntry | "ignore"; +declare interface ContextTimestampAndHash { + safeTime: number; + timestampHash?: string; + hash: string; + resolved?: ResolvedContextTimestampAndHash; + symlinks?: Set; +} +type CreateStatsOptionsContext = KnownCreateStatsOptionsContext & + Record; +type CreateWriteStreamFSImplementation = FSImplementation & { + write: (...args: any[]) => any; + close?: (...args: any[]) => any; +}; +declare interface CreatedObject {} + +/** + * Generator options for css/auto modules. + */ +declare interface CssAutoGeneratorOptions { + /** + * Configure the generated JS modules that use the ES modules syntax. + */ + esModule?: boolean; + + /** + * Specifies the convention of exported names. + */ + exportsConvention?: + | "as-is" + | "camel-case" + | "camel-case-only" + | "dashes" + | "dashes-only" + | ((name: string) => string); + + /** + * Avoid generating and loading a stylesheet and only embed exports from css into output javascript files. + */ + exportsOnly?: boolean; + + /** + * Configure the generated local ident name. + */ + localIdentName?: string; +} + +/** + * Parser options for css/auto modules. + */ +declare interface CssAutoParserOptions { + /** + * Enable/disable `@import` at-rules handling. + */ + import?: boolean; + + /** + * Use ES modules named export for css exports. + */ + namedExports?: boolean; + + /** + * Enable/disable `url()`/`image-set()`/`src()`/`image()` functions handling. + */ + url?: boolean; +} +declare interface CssData { + /** + * whether export __esModule + */ + esModule: boolean; + + /** + * the css exports + */ + exports: Map; +} + +/** + * Generator options for css modules. + */ +declare interface CssGeneratorOptions { + /** + * Configure the generated JS modules that use the ES modules syntax. + */ + esModule?: boolean; + + /** + * Avoid generating and loading a stylesheet and only embed exports from css into output javascript files. + */ + exportsOnly?: boolean; +} + +/** + * Generator options for css/global modules. + */ +declare interface CssGlobalGeneratorOptions { + /** + * Configure the generated JS modules that use the ES modules syntax. + */ + esModule?: boolean; + + /** + * Specifies the convention of exported names. + */ + exportsConvention?: + | "as-is" + | "camel-case" + | "camel-case-only" + | "dashes" + | "dashes-only" + | ((name: string) => string); + + /** + * Avoid generating and loading a stylesheet and only embed exports from css into output javascript files. + */ + exportsOnly?: boolean; + + /** + * Configure the generated local ident name. + */ + localIdentName?: string; +} + +/** + * Parser options for css/global modules. + */ +declare interface CssGlobalParserOptions { + /** + * Enable/disable `@import` at-rules handling. + */ + import?: boolean; + + /** + * Use ES modules named export for css exports. + */ + namedExports?: boolean; + + /** + * Enable/disable `url()`/`image-set()`/`src()`/`image()` functions handling. + */ + url?: boolean; +} +declare interface CssImportDependencyMeta { + layer?: string; + supports?: string; + media?: string; +} +type CssLayer = undefined | string; +declare class CssLoadingRuntimeModule extends RuntimeModule { + constructor(runtimeRequirements: ReadonlySet); + static getCompilationHooks( + compilation: Compilation + ): CssLoadingRuntimeModulePluginHooks; + + /** + * Runtime modules without any dependencies to other runtime modules + */ + static STAGE_NORMAL: number; + + /** + * Runtime modules with simple dependencies on other runtime modules + */ + static STAGE_BASIC: number; + + /** + * Runtime modules which attach to handlers of other runtime modules + */ + static STAGE_ATTACH: number; + + /** + * Runtime modules which trigger actions on bootstrap + */ + static STAGE_TRIGGER: number; +} +declare interface CssLoadingRuntimeModulePluginHooks { + createStylesheet: SyncWaterfallHook<[string, Chunk]>; + linkPreload: SyncWaterfallHook<[string, Chunk]>; + linkPrefetch: SyncWaterfallHook<[string, Chunk]>; +} +declare abstract class CssModule extends NormalModule { + cssLayer: CssLayer; + supports: Supports; + media: Media; + inheritance: [CssLayer, Supports, Media][]; +} + +/** + * Generator options for css/module modules. + */ +declare interface CssModuleGeneratorOptions { + /** + * Configure the generated JS modules that use the ES modules syntax. + */ + esModule?: boolean; + + /** + * Specifies the convention of exported names. + */ + exportsConvention?: + | "as-is" + | "camel-case" + | "camel-case-only" + | "dashes" + | "dashes-only" + | ((name: string) => string); + + /** + * Avoid generating and loading a stylesheet and only embed exports from css into output javascript files. + */ + exportsOnly?: boolean; + + /** + * Configure the generated local ident name. + */ + localIdentName?: string; +} + +/** + * Parser options for css/module modules. + */ +declare interface CssModuleParserOptions { + /** + * Enable/disable `@import` at-rules handling. + */ + import?: boolean; + + /** + * Use ES modules named export for css exports. + */ + namedExports?: boolean; + + /** + * Enable/disable `url()`/`image-set()`/`src()`/`image()` functions handling. + */ + url?: boolean; +} +declare class CssModulesPlugin { + constructor(); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; + getModulesInOrder( + chunk: Chunk, + modules: Iterable, + compilation: Compilation + ): Module[]; + getOrderedChunkCssModules( + chunk: Chunk, + chunkGraph: ChunkGraph, + compilation: Compilation + ): Module[]; + renderModule( + module: CssModule, + renderContext: ChunkRenderContextCssModulesPlugin, + hooks: CompilationHooksCssModulesPlugin + ): Source; + renderChunk( + __0: RenderContextCssModulesPlugin, + hooks: CompilationHooksCssModulesPlugin + ): Source; + static getCompilationHooks( + compilation: Compilation + ): CompilationHooksCssModulesPlugin; + static getChunkFilenameTemplate( + chunk: Chunk, + outputOptions: OutputNormalized + ): TemplatePath; + static chunkHasCss(chunk: Chunk, chunkGraph: ChunkGraph): boolean; +} + +/** + * Parser options for css modules. + */ +declare interface CssParserOptions { + /** + * Enable/disable `@import` at-rules handling. + */ + import?: boolean; + + /** + * Use ES modules named export for css exports. + */ + namedExports?: boolean; + + /** + * Enable/disable `url()`/`image-set()`/`src()`/`image()` functions handling. + */ + url?: boolean; +} +type Declaration = FunctionDeclaration | VariableDeclaration | ClassDeclaration; +declare class DefinePlugin { + /** + * Create a new define plugin + */ + constructor(definitions: Record); + definitions: Record; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; + static runtimeValue( + fn: (value: { + module: NormalModule; + key: string; + readonly version: ValueCacheVersion; + }) => CodeValuePrimitive, + options?: true | string[] | RuntimeValueOptions + ): RuntimeValue; +} +declare class DelegatedPlugin { + constructor(options: Options); + options: Options; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface DepConstructor { + new (...args: any[]): Dependency; +} +declare abstract class DependenciesBlock { + dependencies: Dependency[]; + blocks: AsyncDependenciesBlock[]; + parent?: DependenciesBlock; + getRootBlock(): DependenciesBlock; + + /** + * Adds a DependencyBlock to DependencyBlock relationship. + * This is used for when a Module has a AsyncDependencyBlock tie (for code-splitting) + */ + addBlock(block: AsyncDependenciesBlock): void; + addDependency(dependency: Dependency): void; + removeDependency(dependency: Dependency): void; + + /** + * Removes all dependencies and blocks + */ + clearDependenciesAndBlocks(): void; + updateHash(hash: Hash, context: UpdateHashContextDependency): void; + serialize(__0: ObjectSerializerContext): void; + deserialize(__0: ObjectDeserializerContext): void; +} +declare interface DependenciesBlockLike { + dependencies: Dependency[]; + blocks: AsyncDependenciesBlock[]; +} +declare class Dependency { + constructor(); + weak: boolean; + optional: boolean; + get type(): string; + get category(): string; + loc: DependencyLocation; + setLoc( + startLine: number, + startColumn: number, + endLine: number, + endColumn: number + ): void; + getContext(): undefined | string; + getResourceIdentifier(): null | string; + couldAffectReferencingModule(): boolean | typeof TRANSITIVE; + + /** + * Returns the referenced module and export + */ + getReference(moduleGraph: ModuleGraph): never; + + /** + * Returns list of exports referenced by this dependency + */ + getReferencedExports( + moduleGraph: ModuleGraph, + runtime: RuntimeSpec + ): (string[] | ReferencedExport)[]; + getCondition( + moduleGraph: ModuleGraph + ): + | null + | false + | (( + moduleGraphConnection: ModuleGraphConnection, + runtime: RuntimeSpec + ) => ConnectionState); + + /** + * Returns the exported names + */ + getExports(moduleGraph: ModuleGraph): undefined | ExportsSpec; + + /** + * Returns warnings + */ + getWarnings(moduleGraph: ModuleGraph): undefined | null | WebpackError[]; + + /** + * Returns errors + */ + getErrors(moduleGraph: ModuleGraph): undefined | null | WebpackError[]; + + /** + * Update the hash + */ + updateHash(hash: Hash, context: UpdateHashContextDependency): void; + + /** + * implement this method to allow the occurrence order plugin to count correctly + */ + getNumberOfIdOccurrences(): number; + getModuleEvaluationSideEffectsState( + moduleGraph: ModuleGraph + ): ConnectionState; + createIgnoredModule(context: string): Module; + serialize(__0: ObjectSerializerContext): void; + deserialize(__0: ObjectDeserializerContext): void; + module: any; + get disconnect(): any; + static NO_EXPORTS_REFERENCED: string[][]; + static EXPORTS_OBJECT_REFERENCED: string[][]; + static TRANSITIVE: typeof TRANSITIVE; +} +declare interface DependencyConstructor { + new (...args: any[]): Dependency; +} +type DependencyLocation = SyntheticDependencyLocation | RealDependencyLocation; +declare class DependencyTemplate { + constructor(); + apply( + dependency: Dependency, + source: ReplaceSource, + templateContext: DependencyTemplateContext + ): void; +} +declare interface DependencyTemplateContext { + /** + * the runtime template + */ + runtimeTemplate: RuntimeTemplate; + + /** + * the dependency templates + */ + dependencyTemplates: DependencyTemplates; + + /** + * the module graph + */ + moduleGraph: ModuleGraph; + + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; + + /** + * the requirements for runtime + */ + runtimeRequirements: Set; + + /** + * current module + */ + module: Module; + + /** + * current runtimes, for which code is generated + */ + runtime: RuntimeSpec; + + /** + * mutable array of init fragments for the current module + */ + initFragments: InitFragment[]; + + /** + * when in a concatenated module, information about other concatenated modules + */ + concatenationScope?: ConcatenationScope; + + /** + * the code generation results + */ + codeGenerationResults: CodeGenerationResults; + + /** + * chunkInitFragments + */ + chunkInitFragments: InitFragment[]; +} +declare abstract class DependencyTemplates { + get(dependency: DependencyConstructor): undefined | DependencyTemplate; + set( + dependency: DependencyConstructor, + dependencyTemplate: DependencyTemplate + ): void; + updateHash(part: string): void; + getHash(): string; + clone(): DependencyTemplates; +} + +/** + * Helper function for joining two ranges into a single range. This is useful + * when working with AST nodes, as it allows you to combine the ranges of child nodes + * to create the range of the _parent node_. + */ +declare interface DestructuringAssignmentProperty { + id: string; + range?: [number, number]; + shorthand: string | boolean; +} +declare class DeterministicChunkIdsPlugin { + constructor(options?: DeterministicChunkIdsPluginOptions); + options: DeterministicChunkIdsPluginOptions; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface DeterministicChunkIdsPluginOptions { + /** + * context for ids + */ + context?: string; + + /** + * maximum length of ids + */ + maxLength?: number; +} +declare class DeterministicModuleIdsPlugin { + constructor(options?: DeterministicModuleIdsPluginOptions); + options: DeterministicModuleIdsPluginOptions; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface DeterministicModuleIdsPluginOptions { + /** + * context relative to which module identifiers are computed + */ + context?: string; + + /** + * selector function for modules + */ + test?: (module: Module) => boolean; + + /** + * maximum id length in digits (used as starting point) + */ + maxLength?: number; + + /** + * hash salt for ids + */ + salt?: number; + + /** + * do not increase the maxLength to find an optimal id space size + */ + fixedLength?: boolean; + + /** + * throw an error when id conflicts occur (instead of rehashing) + */ + failOnConflict?: boolean; +} +type DevtoolModuleFilenameTemplate = string | ((context?: any) => string); +declare interface Dirent { + isFile: () => boolean; + isDirectory: () => boolean; + isBlockDevice: () => boolean; + isCharacterDevice: () => boolean; + isSymbolicLink: () => boolean; + isFIFO: () => boolean; + isSocket: () => boolean; + name: string; + path: string; +} +declare class DllPlugin { + constructor(options: DllPluginOptions); + options: { + entryOnly: boolean; + /** + * Context of requests in the manifest file (defaults to the webpack context). + */ + context?: string; + /** + * If true, manifest json file (output) will be formatted. + */ + format?: boolean; + /** + * Name of the exposed dll function (external name, use value of 'output.library'). + */ + name?: string; + /** + * Absolute path to the manifest json file (output). + */ + path: string; + /** + * Type of the dll bundle (external type, use value of 'output.libraryTarget'). + */ + type?: string; + }; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface DllPluginOptions { + /** + * Context of requests in the manifest file (defaults to the webpack context). + */ + context?: string; + + /** + * If true, only entry points will be exposed (default: true). + */ + entryOnly?: boolean; + + /** + * If true, manifest json file (output) will be formatted. + */ + format?: boolean; + + /** + * Name of the exposed dll function (external name, use value of 'output.library'). + */ + name?: string; + + /** + * Absolute path to the manifest json file (output). + */ + path: string; + + /** + * Type of the dll bundle (external type, use value of 'output.libraryTarget'). + */ + type?: string; +} +declare class DllReferencePlugin { + constructor(options: DllReferencePluginOptions); + options: DllReferencePluginOptions; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +type DllReferencePluginOptions = + | { + /** + * Context of requests in the manifest (or content property) as absolute path. + */ + context?: string; + /** + * Extensions used to resolve modules in the dll bundle (only used when using 'scope'). + */ + extensions?: string[]; + /** + * An object containing content and name or a string to the absolute path of the JSON manifest to be loaded upon compilation. + */ + manifest: string | DllReferencePluginOptionsManifest; + /** + * The name where the dll is exposed (external name, defaults to manifest.name). + */ + name?: string; + /** + * Prefix which is used for accessing the content of the dll. + */ + scope?: string; + /** + * How the dll is exposed (libraryTarget, defaults to manifest.type). + */ + sourceType?: + | "var" + | "assign" + | "this" + | "window" + | "global" + | "commonjs" + | "commonjs2" + | "commonjs-module" + | "amd" + | "amd-require" + | "umd" + | "umd2" + | "jsonp" + | "system"; + /** + * The way how the export of the dll bundle is used. + */ + type?: "object" | "require"; + } + | { + /** + * The mappings from request to module info. + */ + content: DllReferencePluginOptionsContent; + /** + * Context of requests in the manifest (or content property) as absolute path. + */ + context?: string; + /** + * Extensions used to resolve modules in the dll bundle (only used when using 'scope'). + */ + extensions?: string[]; + /** + * The name where the dll is exposed (external name). + */ + name: string; + /** + * Prefix which is used for accessing the content of the dll. + */ + scope?: string; + /** + * How the dll is exposed (libraryTarget). + */ + sourceType?: + | "var" + | "assign" + | "this" + | "window" + | "global" + | "commonjs" + | "commonjs2" + | "commonjs-module" + | "amd" + | "amd-require" + | "umd" + | "umd2" + | "jsonp" + | "system"; + /** + * The way how the export of the dll bundle is used. + */ + type?: "object" | "require"; + }; + +/** + * The mappings from request to module info. + */ +declare interface DllReferencePluginOptionsContent { + [index: string]: { + /** + * Meta information about the module. + */ + buildMeta?: { [index: string]: any }; + /** + * Information about the provided exports of the module. + */ + exports?: true | string[]; + /** + * Module ID. + */ + id: string | number; + }; +} + +/** + * An object containing content, name and type. + */ +declare interface DllReferencePluginOptionsManifest { + /** + * The mappings from request to module info. + */ + content: DllReferencePluginOptionsContent; + + /** + * The name where the dll is exposed (external name). + */ + name?: string; + + /** + * The type how the dll is exposed (external type). + */ + type?: + | "var" + | "assign" + | "this" + | "window" + | "global" + | "commonjs" + | "commonjs2" + | "commonjs-module" + | "amd" + | "amd-require" + | "umd" + | "umd2" + | "jsonp" + | "system"; +} +declare class DynamicEntryPlugin { + constructor(context: string, entry: () => Promise); + context: string; + entry: () => Promise; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface Effect { + type: string; + value: any; +} +declare interface EffectData { + resource?: string; + realResource?: string; + resourceQuery?: string; + resourceFragment?: string; + scheme?: string; + assertions?: ImportAttributes; + mimetype?: string; + dependency: string; + descriptionData?: Record; + compiler?: string; + issuer: string; + issuerLayer: string; +} +declare class ElectronTargetPlugin { + constructor(context?: "main" | "preload" | "renderer"); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} + +/** + * No generator options are supported for this module type. + */ +declare interface EmptyGeneratorOptions {} + +/** + * No parser options are supported for this module type. + */ +declare interface EmptyParserOptions {} +declare class EnableChunkLoadingPlugin { + constructor(type: string); + type: string; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; + static setEnabled(compiler: Compiler, type: string): void; + static checkEnabled(compiler: Compiler, type: string): void; +} +declare class EnableLibraryPlugin { + constructor(type: string, options?: EnableLibraryPluginOptions); + type: string; + options: EnableLibraryPluginOptions; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; + static setEnabled(compiler: Compiler, type: string): void; + static checkEnabled(compiler: Compiler, type: string): void; +} +declare interface EnableLibraryPluginOptions { + /** + * function that runs when applying the current plugin. + */ + additionalApply?: () => void; +} +declare class EnableWasmLoadingPlugin { + constructor(type: string); + type: string; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; + static setEnabled(compiler: Compiler, type: string): void; + static checkEnabled(compiler: Compiler, type: string): void; +} +type EncodingOption = + | undefined + | null + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "base64" + | "base64url" + | "latin1" + | "binary" + | "hex" + | ObjectEncodingOptions; +type Entry = + | string + | (() => string | EntryObject | string[] | Promise) + | EntryObject + | string[]; +declare interface EntryData { + /** + * dependencies of the entrypoint that should be evaluated at startup + */ + dependencies: Dependency[]; + + /** + * dependencies of the entrypoint that should be included but not evaluated + */ + includeDependencies: Dependency[]; + + /** + * options of the entrypoint + */ + options: EntryOptions; +} +declare abstract class EntryDependency extends ModuleDependency {} + +/** + * An object with entry point description. + */ +declare interface EntryDescription { + /** + * Enable/disable creating async chunks that are loaded on demand. + */ + asyncChunks?: boolean; + + /** + * Base uri for this entry. + */ + baseUri?: string; + + /** + * The method of loading chunks (methods included by default are 'jsonp' (web), 'import' (ESM), 'importScripts' (WebWorker), 'require' (sync node.js), 'async-node' (async node.js), but others might be added by plugins). + */ + chunkLoading?: string | false; + + /** + * The entrypoints that the current entrypoint depend on. They must be loaded when this entrypoint is loaded. + */ + dependOn?: string | string[]; + + /** + * Specifies the filename of the output file on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk. + */ + filename?: string | ((pathData: PathData, assetInfo?: AssetInfo) => string); + + /** + * Module(s) that are loaded upon startup. + */ + import: EntryItem; + + /** + * Specifies the layer in which modules of this entrypoint are placed. + */ + layer?: null | string; + + /** + * Options for library. + */ + library?: LibraryOptions; + + /** + * The 'publicPath' specifies the public URL address of the output files when referenced in a browser. + */ + publicPath?: string | ((pathData: PathData, assetInfo?: AssetInfo) => string); + + /** + * The name of the runtime chunk. If set a runtime chunk with this name is created or an existing entrypoint is used as runtime. + */ + runtime?: string | false; + + /** + * The method of loading WebAssembly Modules (methods included by default are 'fetch' (web/WebWorker), 'async-node' (node.js), but others might be added by plugins). + */ + wasmLoading?: string | false; +} + +/** + * An object with entry point description. + */ +declare interface EntryDescriptionNormalized { + /** + * Enable/disable creating async chunks that are loaded on demand. + */ + asyncChunks?: boolean; + + /** + * Base uri for this entry. + */ + baseUri?: string; + + /** + * The method of loading chunks (methods included by default are 'jsonp' (web), 'import' (ESM), 'importScripts' (WebWorker), 'require' (sync node.js), 'async-node' (async node.js), but others might be added by plugins). + */ + chunkLoading?: string | false; + + /** + * The entrypoints that the current entrypoint depend on. They must be loaded when this entrypoint is loaded. + */ + dependOn?: string[]; + + /** + * Specifies the filename of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk. + */ + filename?: string | ((pathData: PathData, assetInfo?: AssetInfo) => string); + + /** + * Module(s) that are loaded upon startup. The last one is exported. + */ + import?: string[]; + + /** + * Specifies the layer in which modules of this entrypoint are placed. + */ + layer?: null | string; + + /** + * Options for library. + */ + library?: LibraryOptions; + + /** + * The 'publicPath' specifies the public URL address of the output files when referenced in a browser. + */ + publicPath?: string | ((pathData: PathData, assetInfo?: AssetInfo) => string); + + /** + * The name of the runtime chunk. If set a runtime chunk with this name is created or an existing entrypoint is used as runtime. + */ + runtime?: string | false; + + /** + * The method of loading WebAssembly Modules (methods included by default are 'fetch' (web/WebWorker), 'async-node' (node.js), but others might be added by plugins). + */ + wasmLoading?: string | false; +} +type EntryItem = string | string[]; +type EntryNormalized = + | (() => Promise) + | EntryStaticNormalized; + +/** + * Multiple entry bundles are created. The key is the entry name. The value can be a string, an array or an entry description object. + */ +declare interface EntryObject { + [index: string]: string | string[] | EntryDescription; +} +declare class EntryOptionPlugin { + constructor(); + apply(compiler: Compiler): void; + static applyEntryOption( + compiler: Compiler, + context: string, + entry: EntryNormalized + ): void; + static entryDescriptionToOptions( + compiler: Compiler, + name: string, + desc: EntryDescriptionNormalized + ): EntryOptions; +} +type EntryOptions = { name?: string } & Omit< + EntryDescriptionNormalized, + "import" +>; +declare class EntryPlugin { + /** + * An entry plugin which will handle creation of the EntryDependency + */ + constructor(context: string, entry: string, options?: string | EntryOptions); + context: string; + entry: string; + options: string | EntryOptions; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; + static createDependency( + entry: string, + options: string | EntryOptions + ): EntryDependency; +} +type EntryStatic = string | EntryObject | string[]; + +/** + * Multiple entry bundles are created. The key is the entry name. The value is an entry description object. + */ +declare interface EntryStaticNormalized { + [index: string]: EntryDescriptionNormalized; +} +declare abstract class Entrypoint extends ChunkGroup { + /** + * Sets the runtimeChunk for an entrypoint. + */ + setRuntimeChunk(chunk: Chunk): void; + + /** + * Fetches the chunk reference containing the webpack bootstrap code + */ + getRuntimeChunk(): null | Chunk; + + /** + * Sets the chunk with the entrypoint modules for an entrypoint. + */ + setEntrypointChunk(chunk: Chunk): void; + + /** + * Returns the chunk which contains the entrypoint modules + * (or at least the execution of them) + */ + getEntrypointChunk(): Chunk; +} +type EnumValue = + | null + | string + | number + | boolean + | EnumValueObject + | EnumValue[]; +declare interface EnumValueObject { + [index: string]: EnumValue; +} + +/** + * The abilities of the environment where the webpack generated code should run. + */ +declare interface Environment { + /** + * The environment supports arrow functions ('() => { ... }'). + */ + arrowFunction?: boolean; + + /** + * The environment supports async function and await ('async function () { await ... }'). + */ + asyncFunction?: boolean; + + /** + * The environment supports BigInt as literal (123n). + */ + bigIntLiteral?: boolean; + + /** + * The environment supports const and let for variable declarations. + */ + const?: boolean; + + /** + * The environment supports destructuring ('{ a, b } = obj'). + */ + destructuring?: boolean; + + /** + * The environment supports 'document'. + */ + document?: boolean; + + /** + * The environment supports an async import() function to import EcmaScript modules. + */ + dynamicImport?: boolean; + + /** + * The environment supports an async import() is available when creating a worker. + */ + dynamicImportInWorker?: boolean; + + /** + * The environment supports 'for of' iteration ('for (const x of array) { ... }'). + */ + forOf?: boolean; + + /** + * The environment supports 'globalThis'. + */ + globalThis?: boolean; + + /** + * The environment supports EcmaScript Module syntax to import EcmaScript modules (import ... from '...'). + */ + module?: boolean; + + /** + * The environment supports `node:` prefix for Node.js core modules. + */ + nodePrefixForCoreModules?: boolean; + + /** + * The environment supports optional chaining ('obj?.a' or 'obj?.()'). + */ + optionalChaining?: boolean; + + /** + * The environment supports template literals. + */ + templateLiteral?: boolean; +} +declare class EnvironmentPlugin { + constructor(...keys: (string | string[] | Record)[]); + keys: string[]; + defaultValues: Record; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +type ErrorWithDetail = Error & { details?: string }; +declare interface Etag { + toString: () => string; +} +declare class EvalDevToolModulePlugin { + constructor(options?: EvalDevToolModulePluginOptions); + namespace: string; + sourceUrlComment: string; + moduleFilenameTemplate: DevtoolModuleFilenameTemplate; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface EvalDevToolModulePluginOptions { + /** + * namespace + */ + namespace?: string; + + /** + * source url comment + */ + sourceUrlComment?: string; + + /** + * module filename template + */ + moduleFilenameTemplate?: string | ((context?: any) => string); +} +declare class EvalSourceMapDevToolPlugin { + constructor(inputOptions: string | SourceMapDevToolPluginOptions); + sourceMapComment: string; + moduleFilenameTemplate: string | ((context?: any) => string); + namespace: string; + options: SourceMapDevToolPluginOptions; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +type ExcludeModulesType = "module" | "chunk" | "root-of-chunk" | "nested"; +declare interface ExecuteModuleArgument { + module: Module; + moduleObject?: ExecuteModuleObject; + preparedInfo: any; + codeGenerationResult: CodeGenerationResult; +} +declare interface ExecuteModuleContext { + assets: Map; + chunk: Chunk; + chunkGraph: ChunkGraph; + __webpack_require__?: WebpackRequire; +} +declare interface ExecuteModuleObject { + /** + * module id + */ + id?: string; + + /** + * exports + */ + exports: any; + + /** + * is loaded + */ + loaded: boolean; + + /** + * error + */ + error?: Error; +} +declare interface ExecuteModuleOptions { + entryOptions?: EntryOptions; +} +declare interface ExecuteModuleResult { + exports: any; + cacheable: boolean; + assets: Map; + fileDependencies: LazySet; + contextDependencies: LazySet; + missingDependencies: LazySet; + buildDependencies: LazySet; +} +declare interface ExecuteOptions { + /** + * module id + */ + id?: string; + + /** + * module + */ + module: ExecuteModuleObject; + + /** + * require function + */ + require: WebpackRequire; +} +type Experiments = ExperimentsCommon & ExperimentsExtra; + +/** + * Enables/Disables experiments (experimental features with relax SemVer compatibility). + */ +declare interface ExperimentsCommon { + /** + * Support WebAssembly as asynchronous EcmaScript Module. + */ + asyncWebAssembly?: boolean; + + /** + * Enable backward-compat layer with deprecation warnings for many webpack 4 APIs. + */ + backCompat?: boolean; + + /** + * Enable additional in memory caching of modules that are unchanged and reference only unchanged modules. + */ + cacheUnaffected?: boolean; + + /** + * Apply defaults of next major version. + */ + futureDefaults?: boolean; + + /** + * Enable module layers. + */ + layers?: boolean; + + /** + * Allow output javascript files as module source type. + */ + outputModule?: boolean; + + /** + * Support WebAssembly as synchronous EcmaScript Module (outdated). + */ + syncWebAssembly?: boolean; + + /** + * Allow using top-level-await in EcmaScript Modules. + */ + topLevelAwait?: boolean; +} + +/** + * Enables/Disables experiments (experimental features with relax SemVer compatibility). + */ +declare interface ExperimentsExtra { + /** + * Build http(s): urls using a lockfile and resource content cache. + */ + buildHttp?: HttpUriOptions | (string | RegExp | ((uri: string) => boolean))[]; + + /** + * Enable css support. + */ + css?: boolean; + + /** + * Compile entrypoints and import()s only when they are accessed. + */ + lazyCompilation?: boolean | LazyCompilationOptions; +} +type ExperimentsNormalized = ExperimentsCommon & ExperimentsNormalizedExtra; + +/** + * Enables/Disables experiments (experimental features with relax SemVer compatibility). + */ +declare interface ExperimentsNormalizedExtra { + /** + * Build http(s): urls using a lockfile and resource content cache. + */ + buildHttp?: HttpUriOptions; + + /** + * Enable css support. + */ + css?: boolean; + + /** + * Compile entrypoints and import()s only when they are accessed. + */ + lazyCompilation?: false | LazyCompilationOptions; +} +type ExportAllDeclarationJavascriptParser = ExportAllDeclarationImport & { + attributes?: ImportAttribute[]; +}; +declare abstract class ExportInfo { + name: string; + + /** + * true: it is provided + * false: it is not provided + * null: only the runtime knows if it is provided + * undefined: it was not determined if it is provided + */ + provided?: null | boolean; + + /** + * is the export a terminal binding that should be checked for export star conflicts + */ + terminalBinding: boolean; + + /** + * true: it can be mangled + * false: is can not be mangled + * undefined: it was not determined if it can be mangled + */ + canMangleProvide?: boolean; + + /** + * true: it can be mangled + * false: is can not be mangled + * undefined: it was not determined if it can be mangled + */ + canMangleUse?: boolean; + exportsInfoOwned: boolean; + exportsInfo?: ExportsInfo; + get canMangle(): boolean; + setUsedInUnknownWay(runtime: RuntimeSpec): boolean; + setUsedWithoutInfo(runtime: RuntimeSpec): boolean; + setHasUseInfo(): void; + setUsedConditionally( + condition: (condition: UsageStateType) => boolean, + newValue: UsageStateType, + runtime: RuntimeSpec + ): boolean; + setUsed(newValue: UsageStateType, runtime: RuntimeSpec): boolean; + unsetTarget(key: Dependency): boolean; + setTarget( + key: Dependency, + connection: ModuleGraphConnection, + exportName?: null | string[], + priority?: number + ): boolean; + getUsed(runtime: RuntimeSpec): UsageStateType; + + /** + * get used name + */ + getUsedName( + fallbackName: undefined | string, + runtime: RuntimeSpec + ): string | false; + hasUsedName(): boolean; + + /** + * Sets the mangled name of this export + */ + setUsedName(name: string): void; + getTerminalBinding( + moduleGraph: ModuleGraph, + resolveTargetFilter?: (target: TargetItemWithConnection) => boolean + ): undefined | ExportsInfo | ExportInfo; + isReexport(): undefined | boolean; + findTarget( + moduleGraph: ModuleGraph, + validTargetModuleFilter: (module: Module) => boolean + ): undefined | null | false | TargetItemWithoutConnection; + getTarget( + moduleGraph: ModuleGraph, + resolveTargetFilter?: (target: TargetItemWithConnection) => boolean + ): undefined | TargetItemWithConnection; + + /** + * Move the target forward as long resolveTargetFilter is fulfilled + */ + moveTarget( + moduleGraph: ModuleGraph, + resolveTargetFilter: (target: TargetItemWithConnection) => boolean, + updateOriginalConnection?: ( + target: TargetItemWithConnection + ) => ModuleGraphConnection + ): undefined | TargetItemWithConnection; + createNestedExportsInfo(): ExportsInfo; + getNestedExportsInfo(): undefined | ExportsInfo; + hasInfo(baseInfo: ExportInfo, runtime: RuntimeSpec): boolean; + updateHash(hash: Hash, runtime: RuntimeSpec): void; + getUsedInfo(): string; + getProvidedInfo(): + | "no provided info" + | "maybe provided (runtime-defined)" + | "provided" + | "not provided"; + getRenameInfo(): string; +} +type ExportNamedDeclarationJavascriptParser = ExportNamedDeclarationImport & { + attributes?: ImportAttribute[]; +}; +type ExportPresenceMode = false | 0 | 1 | 2 | 3; +declare interface ExportSpec { + /** + * the name of the export + */ + name: string; + + /** + * can the export be renamed (defaults to true) + */ + canMangle?: boolean; + + /** + * is the export a terminal binding that should be checked for export star conflicts + */ + terminalBinding?: boolean; + + /** + * nested exports + */ + exports?: (string | ExportSpec)[]; + + /** + * when reexported: from which module + */ + from?: ModuleGraphConnection; + + /** + * when reexported: from which export + */ + export?: null | string[]; + + /** + * when reexported: with which priority + */ + priority?: number; + + /** + * export is not visible, because another export blends over it + */ + hidden?: boolean; +} +type ExportedVariableInfo = string | VariableInfo | ScopeInfo; +declare abstract class ExportsInfo { + get ownedExports(): Iterable; + get orderedOwnedExports(): Iterable; + get exports(): Iterable; + get orderedExports(): Iterable; + get otherExportsInfo(): ExportInfo; + setRedirectNamedTo(exportsInfo?: ExportsInfo): boolean; + setHasProvideInfo(): void; + setHasUseInfo(): void; + getOwnExportInfo(name: string): ExportInfo; + getExportInfo(name: string): ExportInfo; + getReadOnlyExportInfo(name: string): ExportInfo; + getReadOnlyExportInfoRecursive(name: string[]): undefined | ExportInfo; + getNestedExportsInfo(name?: string[]): undefined | ExportsInfo; + setUnknownExportsProvided( + canMangle?: boolean, + excludeExports?: Set, + targetKey?: Dependency, + targetModule?: ModuleGraphConnection, + priority?: number + ): boolean; + setUsedInUnknownWay(runtime: RuntimeSpec): boolean; + setUsedWithoutInfo(runtime: RuntimeSpec): boolean; + setAllKnownExportsUsed(runtime: RuntimeSpec): boolean; + setUsedForSideEffectsOnly(runtime: RuntimeSpec): boolean; + isUsed(runtime: RuntimeSpec): boolean; + isModuleUsed(runtime: RuntimeSpec): boolean; + getUsedExports(runtime: RuntimeSpec): null | boolean | SortableSet; + getProvidedExports(): null | true | string[]; + getRelevantExports(runtime: RuntimeSpec): ExportInfo[]; + isExportProvided(name: string | string[]): undefined | null | boolean; + getUsageKey(runtime: RuntimeSpec): string; + isEquallyUsed(runtimeA: RuntimeSpec, runtimeB: RuntimeSpec): boolean; + getUsed(name: string | string[], runtime: RuntimeSpec): UsageStateType; + getUsedName(name: string | string[], runtime: RuntimeSpec): UsedName; + updateHash(hash: Hash, runtime: RuntimeSpec): void; + getRestoreProvidedData(): RestoreProvidedData; + restoreProvided(__0: RestoreProvidedData): void; +} +declare interface ExportsSpec { + /** + * exported names, true for unknown exports or null for no exports + */ + exports: null | true | (string | ExportSpec)[]; + + /** + * when exports = true, list of unaffected exports + */ + excludeExports?: Set; + + /** + * list of maybe prior exposed, but now hidden exports + */ + hideExports?: null | Set; + + /** + * when reexported: from which module + */ + from?: ModuleGraphConnection; + + /** + * when reexported: with which priority + */ + priority?: number; + + /** + * can the export be renamed (defaults to true) + */ + canMangle?: boolean; + + /** + * are the exports terminal bindings that should be checked for export star conflicts + */ + terminalBinding?: boolean; + + /** + * module on which the result depends on + */ + dependencies?: Module[]; +} +type Exposes = (string | ExposesObject)[] | ExposesObject; + +/** + * Advanced configuration for modules that should be exposed by this container. + */ +declare interface ExposesConfig { + /** + * Request to a module that should be exposed by this container. + */ + import: string | string[]; + + /** + * Custom chunk name for the exposed module. + */ + name?: string; +} + +/** + * Modules that should be exposed by this container. Property names are used as public paths. + */ +declare interface ExposesObject { + [index: string]: string | ExposesConfig | string[]; +} +type Expression = + | ImportExpressionImport + | UnaryExpression + | ArrayExpression + | ArrowFunctionExpression + | AssignmentExpression + | AwaitExpression + | BinaryExpression + | SimpleCallExpression + | NewExpression + | ChainExpression + | ClassExpression + | ConditionalExpression + | FunctionExpression + | Identifier + | SimpleLiteral + | RegExpLiteral + | BigIntLiteral + | LogicalExpression + | MemberExpression + | MetaProperty + | ObjectExpression + | SequenceExpression + | TaggedTemplateExpression + | TemplateLiteral + | ThisExpression + | UpdateExpression + | YieldExpression; +declare interface ExpressionExpressionInfo { + type: "expression"; + rootInfo: string | VariableInfo; + name: string; + getMembers: () => string[]; + getMembersOptionals: () => boolean[]; + getMemberRanges: () => [number, number][]; +} +declare interface ExtensionAliasOption { + alias: string | string[]; + extension: string; +} +declare interface ExtensionAliasOptions { + [index: string]: string | string[]; +} +type ExternalItem = + | string + | RegExp + | (ExternalItemObjectKnown & ExternalItemObjectUnknown) + | (( + data: ExternalItemFunctionData, + callback: ( + err?: null | Error, + result?: string | boolean | string[] | { [index: string]: any } + ) => void + ) => void) + | ((data: ExternalItemFunctionData) => Promise); +type ExternalItemFunction = + | (( + data: ExternalItemFunctionData, + callback: ( + err?: null | Error, + result?: string | boolean | string[] | { [index: string]: any } + ) => void + ) => void) + | ((data: ExternalItemFunctionData) => Promise); + +/** + * Data object passed as argument when a function is set for 'externals'. + */ +declare interface ExternalItemFunctionData { + /** + * The directory in which the request is placed. + */ + context?: string; + + /** + * Contextual information. + */ + contextInfo?: ModuleFactoryCreateDataContextInfo; + + /** + * The category of the referencing dependencies. + */ + dependencyType?: string; + + /** + * Get a resolve function with the current resolver options. + */ + getResolve?: ( + options?: ResolveOptions + ) => + | (( + context: string, + request: string, + callback: ( + err?: null | Error, + result?: string | false, + resolveRequest?: ResolveRequest + ) => void + ) => void) + | ((context: string, request: string) => Promise); + + /** + * The request as written by the user in the require/import expression/statement. + */ + request?: string; +} + +/** + * If an dependency matches exactly a property of the object, the property value is used as dependency. + */ +declare interface ExternalItemObjectKnown { + /** + * Specify externals depending on the layer. + */ + byLayer?: + | { [index: string]: ExternalItem } + | ((layer: null | string) => ExternalItem); +} + +/** + * If an dependency matches exactly a property of the object, the property value is used as dependency. + */ +declare interface ExternalItemObjectUnknown { + [index: string]: ExternalItemValue; +} +type ExternalItemValue = string | boolean | string[] | { [index: string]: any }; +declare class ExternalModule extends Module { + constructor( + request: string | string[] | RequestRecord, + type: string, + userRequest: string, + dependencyMeta?: + | ImportDependencyMeta + | CssImportDependencyMeta + | AssetDependencyMeta + ); + request: string | string[] | Record; + externalType: string; + userRequest: string; + dependencyMeta?: + | ImportDependencyMeta + | CssImportDependencyMeta + | AssetDependencyMeta; + + /** + * restore unsafe cache data + */ + restoreFromUnsafeCache( + unsafeCacheData: UnsafeCacheData, + normalModuleFactory: NormalModuleFactory + ): void; +} +declare interface ExternalModuleInfo { + type: "external"; + module: Module; + runtimeCondition?: string | boolean | SortableSet; + index: number; + name?: string; + interopNamespaceObjectUsed: boolean; + interopNamespaceObjectName?: string; + interopNamespaceObject2Used: boolean; + interopNamespaceObject2Name?: string; + interopDefaultAccessUsed: boolean; + interopDefaultAccessName?: string; +} +type Externals = + | string + | RegExp + | (ExternalItemObjectKnown & ExternalItemObjectUnknown) + | (( + data: ExternalItemFunctionData, + callback: ( + err?: null | Error, + result?: string | boolean | string[] | { [index: string]: any } + ) => void + ) => void) + | ((data: ExternalItemFunctionData) => Promise) + | ExternalItem[]; +declare class ExternalsPlugin { + constructor(type: undefined | string, externals: Externals); + type?: string; + externals: Externals; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} + +/** + * Enable presets of externals for specific targets. + */ +declare interface ExternalsPresets { + /** + * Treat common electron built-in modules in main and preload context like 'electron', 'ipc' or 'shell' as external and load them via require() when used. + */ + electron?: boolean; + + /** + * Treat electron built-in modules in the main context like 'app', 'ipc-main' or 'shell' as external and load them via require() when used. + */ + electronMain?: boolean; + + /** + * Treat electron built-in modules in the preload context like 'web-frame', 'ipc-renderer' or 'shell' as external and load them via require() when used. + */ + electronPreload?: boolean; + + /** + * Treat electron built-in modules in the renderer context like 'web-frame', 'ipc-renderer' or 'shell' as external and load them via require() when used. + */ + electronRenderer?: boolean; + + /** + * Treat node.js built-in modules like fs, path or vm as external and load them via require() when used. + */ + node?: boolean; + + /** + * Treat NW.js legacy nw.gui module as external and load it via require() when used. + */ + nwjs?: boolean; + + /** + * Treat references to 'http(s)://...' and 'std:...' as external and load them via import when used (Note that this changes execution order as externals are executed before any other code in the chunk). + */ + web?: boolean; + + /** + * Treat references to 'http(s)://...' and 'std:...' as external and load them via async import() when used (Note that this external type is an async module, which has various effects on the execution). + */ + webAsync?: boolean; +} +type ExternalsType = + | "import" + | "var" + | "module" + | "assign" + | "this" + | "window" + | "self" + | "global" + | "commonjs" + | "commonjs2" + | "commonjs-module" + | "commonjs-static" + | "amd" + | "amd-require" + | "umd" + | "umd2" + | "jsonp" + | "system" + | "promise" + | "module-import" + | "script" + | "node-commonjs"; +declare interface FSImplementation { + open?: (...args: any[]) => any; + close?: (...args: any[]) => any; +} +declare interface FactorizeModuleOptions { + currentProfile?: ModuleProfile; + factory: ModuleFactory; + dependencies: Dependency[]; + + /** + * return full ModuleFactoryResult instead of only module + */ + factoryResult?: boolean; + originModule: null | Module; + contextInfo?: Partial; + context?: string; +} +declare interface FactoryMeta { + sideEffectFree?: boolean; +} +type FakeHook = T & FakeHookMarker; +declare interface FakeHookMarker {} +declare interface FallbackCacheGroup { + chunksFilter: (chunk: Chunk) => undefined | boolean; + minSize: SplitChunksSizes; + maxAsyncSize: SplitChunksSizes; + maxInitialSize: SplitChunksSizes; + automaticNameDelimiter: string; +} +declare class FetchCompileAsyncWasmPlugin { + constructor(); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare class FetchCompileWasmPlugin { + constructor(options?: FetchCompileWasmPluginOptions); + options: FetchCompileWasmPluginOptions; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface FetchCompileWasmPluginOptions { + /** + * mangle imports + */ + mangleImports?: boolean; +} + +/** + * Options object for persistent file-based caching. + */ +declare interface FileCacheOptions { + /** + * Allows to collect unused memory allocated during deserialization. This requires copying data into smaller buffers and has a performance cost. + */ + allowCollectingMemory?: boolean; + + /** + * Dependencies the build depends on (in multiple categories, default categories: 'defaultWebpack'). + */ + buildDependencies?: { [index: string]: string[] }; + + /** + * Base directory for the cache (defaults to node_modules/.cache/webpack). + */ + cacheDirectory?: string; + + /** + * Locations for the cache (defaults to cacheDirectory / name). + */ + cacheLocation?: string; + + /** + * Compression type used for the cache files. + */ + compression?: false | "gzip" | "brotli"; + + /** + * Algorithm used for generation the hash (see node.js crypto package). + */ + hashAlgorithm?: string; + + /** + * Time in ms after which idle period the cache storing should happen. + */ + idleTimeout?: number; + + /** + * Time in ms after which idle period the cache storing should happen when larger changes has been detected (cumulative build time > 2 x avg cache store time). + */ + idleTimeoutAfterLargeChanges?: number; + + /** + * Time in ms after which idle period the initial cache storing should happen. + */ + idleTimeoutForInitialStore?: number; + + /** + * List of paths that are managed by a package manager and contain a version or hash in its path so all files are immutable. + */ + immutablePaths?: (string | RegExp)[]; + + /** + * List of paths that are managed by a package manager and can be trusted to not be modified otherwise. + */ + managedPaths?: (string | RegExp)[]; + + /** + * Time for which unused cache entries stay in the filesystem cache at minimum (in milliseconds). + */ + maxAge?: number; + + /** + * Number of generations unused cache entries stay in memory cache at minimum (0 = no memory cache used, 1 = may be removed after unused for a single compilation, ..., Infinity: kept forever). Cache entries will be deserialized from disk when removed from memory cache. + */ + maxMemoryGenerations?: number; + + /** + * Additionally cache computation of modules that are unchanged and reference only unchanged modules in memory. + */ + memoryCacheUnaffected?: boolean; + + /** + * Name for the cache. Different names will lead to different coexisting caches. + */ + name?: string; + + /** + * Track and log detailed timing information for individual cache items. + */ + profile?: boolean; + + /** + * Enable/disable readonly mode. + */ + readonly?: boolean; + + /** + * When to store data to the filesystem. (pack: Store data when compiler is idle in a single file). + */ + store?: "pack"; + + /** + * Filesystem caching. + */ + type: "filesystem"; + + /** + * Version of the cache data. Different versions won't allow to reuse the cache and override existing content. Update the version when config changed in a way which doesn't allow to reuse cache. This will invalidate the cache. + */ + version?: string; +} +declare interface FileSystem { + readFile: ReadFileTypes; + readdir: ReaddirTypes; + readJson?: ( + arg0: PathOrFileDescriptorTypes, + arg1: ( + arg0: null | Error | NodeJS.ErrnoException, + arg1?: JsonObjectTypes + ) => void + ) => void; + readlink: ReadlinkTypes; + lstat?: LStatTypes; + stat: StatTypes; + realpath?: RealPathTypes; +} +declare abstract class FileSystemInfo { + fs: InputFileSystem; + logger?: WebpackLogger; + fileTimestampQueue: AsyncQueue; + fileHashQueue: AsyncQueue; + contextTimestampQueue: AsyncQueue; + contextHashQueue: AsyncQueue; + contextTshQueue: AsyncQueue; + managedItemQueue: AsyncQueue; + managedItemDirectoryQueue: AsyncQueue>; + unmanagedPathsWithSlash: string[]; + unmanagedPathsRegExps: RegExp[]; + managedPaths: (string | RegExp)[]; + managedPathsWithSlash: string[]; + managedPathsRegExps: RegExp[]; + immutablePaths: (string | RegExp)[]; + immutablePathsWithSlash: string[]; + immutablePathsRegExps: RegExp[]; + logStatistics(): void; + clear(): void; + addFileTimestamps( + map: ReadonlyMap, + immutable?: boolean + ): void; + addContextTimestamps( + map: ReadonlyMap, + immutable?: boolean + ): void; + getFileTimestamp( + path: string, + callback: ( + err?: null | WebpackError, + fileTimestamp?: null | FileSystemInfoEntry | "ignore" + ) => void + ): void; + getContextTimestamp( + path: string, + callback: ( + err?: null | WebpackError, + resolvedContextTimestamp?: + | null + | "ignore" + | ResolvedContextFileSystemInfoEntry + ) => void + ): void; + getFileHash( + path: string, + callback: (err?: null | WebpackError, hash?: null | string) => void + ): void; + getContextHash( + path: string, + callback: (err?: null | WebpackError, contextHash?: string) => void + ): void; + getContextTsh( + path: string, + callback: ( + err?: null | WebpackError, + resolvedContextTimestampAndHash?: null | ResolvedContextTimestampAndHash + ) => void + ): void; + resolveBuildDependencies( + context: string, + deps: Iterable, + callback: ( + err?: null | Error, + resolveBuildDependenciesResult?: ResolveBuildDependenciesResult + ) => void + ): void; + checkResolveResultsValid( + resolveResults: Map, + callback: (err?: null | Error, result?: boolean) => void + ): void; + createSnapshot( + startTime: undefined | null | number, + files: null | Iterable, + directories: null | Iterable, + missing: null | Iterable, + options: undefined | null | SnapshotOptionsFileSystemInfo, + callback: (err: null | WebpackError, snapshot: null | Snapshot) => void + ): void; + mergeSnapshots(snapshot1: Snapshot, snapshot2: Snapshot): Snapshot; + checkSnapshotValid( + snapshot: Snapshot, + callback: (err?: null | WebpackError, result?: boolean) => void + ): void; + getDeprecatedFileTimestamps(): Map; + getDeprecatedContextTimestamps(): Map; +} +declare interface FileSystemInfoEntry { + safeTime: number; + timestamp?: number; +} +type FileTimestamp = null | FileSystemInfoEntry | "ignore"; +type FilterItemTypes = string | RegExp | ((value: string) => boolean); +declare interface Flags { + [index: string]: Argument; +} +declare interface GenerateContext { + /** + * mapping from dependencies to templates + */ + dependencyTemplates: DependencyTemplates; + + /** + * the runtime template + */ + runtimeTemplate: RuntimeTemplate; + + /** + * the module graph + */ + moduleGraph: ModuleGraph; + + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; + + /** + * the requirements for runtime + */ + runtimeRequirements: Set; + + /** + * the runtime + */ + runtime: RuntimeSpec; + + /** + * when in concatenated module, information about other concatenated modules + */ + concatenationScope?: ConcatenationScope; + + /** + * code generation results of other modules (need to have a codeGenerationDependency to use that) + */ + codeGenerationResults?: CodeGenerationResults; + + /** + * which kind of code should be generated + */ + type: string; + + /** + * get access to the code generation data + */ + getData?: () => Map; +} +declare class Generator { + constructor(); + getTypes(module: NormalModule): ReadonlySet; + getSize(module: NormalModule, type?: string): number; + generate(module: NormalModule, __1: GenerateContext): null | Source; + getConcatenationBailoutReason( + module: NormalModule, + context: ConcatenationBailoutReasonContext + ): undefined | string; + updateHash(hash: Hash, __1: UpdateHashContextGenerator): void; + static byType(map: Record): ByTypeGenerator; +} +declare interface GeneratorOptions { + [index: string]: any; +} +type GeneratorOptionsByModuleType = GeneratorOptionsByModuleTypeKnown & + GeneratorOptionsByModuleTypeUnknown; + +/** + * Specify options for each generator. + */ +declare interface GeneratorOptionsByModuleTypeKnown { + /** + * Generator options for asset modules. + */ + asset?: AssetGeneratorOptions; + + /** + * Generator options for asset/inline modules. + */ + "asset/inline"?: AssetInlineGeneratorOptions; + + /** + * Generator options for asset/resource modules. + */ + "asset/resource"?: AssetResourceGeneratorOptions; + + /** + * Generator options for css modules. + */ + css?: CssGeneratorOptions; + + /** + * Generator options for css/auto modules. + */ + "css/auto"?: CssAutoGeneratorOptions; + + /** + * Generator options for css/global modules. + */ + "css/global"?: CssGlobalGeneratorOptions; + + /** + * Generator options for css/module modules. + */ + "css/module"?: CssModuleGeneratorOptions; + + /** + * No generator options are supported for this module type. + */ + javascript?: EmptyGeneratorOptions; + + /** + * No generator options are supported for this module type. + */ + "javascript/auto"?: EmptyGeneratorOptions; + + /** + * No generator options are supported for this module type. + */ + "javascript/dynamic"?: EmptyGeneratorOptions; + + /** + * No generator options are supported for this module type. + */ + "javascript/esm"?: EmptyGeneratorOptions; + + /** + * Generator options for json modules. + */ + json?: JsonGeneratorOptions; +} + +/** + * Specify options for each generator. + */ +declare interface GeneratorOptionsByModuleTypeUnknown { + [index: string]: { [index: string]: any }; +} +declare class GetChunkFilenameRuntimeModule extends RuntimeModule { + constructor( + contentType: string, + name: string, + global: string, + getFilenameForChunk: ( + chunk: Chunk + ) => + | string + | false + | ((pathData: PathData, assetInfo?: AssetInfo) => string), + allChunks: boolean + ); + contentType: string; + global: string; + getFilenameForChunk: ( + chunk: Chunk + ) => string | false | ((pathData: PathData, assetInfo?: AssetInfo) => string); + allChunks: boolean; + + /** + * Runtime modules without any dependencies to other runtime modules + */ + static STAGE_NORMAL: number; + + /** + * Runtime modules with simple dependencies on other runtime modules + */ + static STAGE_BASIC: number; + + /** + * Runtime modules which attach to handlers of other runtime modules + */ + static STAGE_ATTACH: number; + + /** + * Runtime modules which trigger actions on bootstrap + */ + static STAGE_TRIGGER: number; +} +declare interface GroupConfig { + getKeys: (item?: any) => undefined | string[]; + createGroup: (key: string, children: any[], items: any[]) => object; + getOptions?: (name: string, items: any[]) => GroupOptions; +} +declare interface GroupOptions { + groupChildren?: boolean; + force?: boolean; + targetGroupCount?: number; +} +declare interface HMRJavascriptParserHooks { + hotAcceptCallback: SyncBailHook< + [ + ( + | ImportExpressionImport + | UnaryExpression + | ArrayExpression + | ArrowFunctionExpression + | AssignmentExpression + | AwaitExpression + | BinaryExpression + | SimpleCallExpression + | NewExpression + | ChainExpression + | ClassExpression + | ConditionalExpression + | FunctionExpression + | Identifier + | SimpleLiteral + | RegExpLiteral + | BigIntLiteral + | LogicalExpression + | MemberExpression + | MetaProperty + | ObjectExpression + | SequenceExpression + | TaggedTemplateExpression + | TemplateLiteral + | ThisExpression + | UpdateExpression + | YieldExpression + | SpreadElement + ), + string[] + ], + void + >; + hotAcceptWithoutCallback: SyncBailHook<[CallExpression, string[]], void>; +} +declare interface HandleModuleCreationOptions { + factory: ModuleFactory; + dependencies: Dependency[]; + originModule: null | Module; + contextInfo?: Partial; + context?: string; + + /** + * recurse into dependencies of the created module + */ + recursive?: boolean; + + /** + * connect the resolved module with the origin module + */ + connectOrigin?: boolean; + + /** + * check the cycle dependencies of the created module + */ + checkCycle?: boolean; +} +declare class HarmonyImportDependency extends ModuleDependency { + constructor( + request: string, + sourceOrder: number, + attributes?: ImportAttributes + ); + sourceOrder: number; + getImportVar(moduleGraph: ModuleGraph): string; + getImportStatement( + update: boolean, + __1: DependencyTemplateContext + ): [string, string]; + getLinkingErrors( + moduleGraph: ModuleGraph, + ids: string[], + additionalMessage: string + ): undefined | WebpackError[]; + static Template: typeof HarmonyImportDependencyTemplate; + static ExportPresenceModes: { + NONE: ExportPresenceMode; + WARN: ExportPresenceMode; + AUTO: ExportPresenceMode; + ERROR: ExportPresenceMode; + fromUserOption(str: string | false): ExportPresenceMode; + }; + static NO_EXPORTS_REFERENCED: string[][]; + static EXPORTS_OBJECT_REFERENCED: string[][]; + static TRANSITIVE: typeof TRANSITIVE; +} +declare class HarmonyImportDependencyTemplate extends DependencyTemplate { + constructor(); + static getImportEmittedRuntime( + module: Module, + referencedModule: Module + ): undefined | string | boolean | SortableSet; +} +declare class Hash { + constructor(); + + /** + * Update hash {@link https://nodejs.org/api/crypto.html#crypto_hash_update_data_inputencoding} + */ + update(data: string | Buffer, inputEncoding?: string): Hash; + + /** + * Calculates the digest {@link https://nodejs.org/api/crypto.html#crypto_hash_digest_encoding} + */ + digest(encoding?: string): string | Buffer; +} +type HashFunction = string | typeof Hash; +declare interface HashableObject { + updateHash: (hash: Hash) => void; +} +declare class HashedModuleIdsPlugin { + constructor(options?: HashedModuleIdsPluginOptions); + options: HashedModuleIdsPluginOptions; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface HashedModuleIdsPluginOptions { + /** + * The context directory for creating names. + */ + context?: string; + + /** + * The encoding to use when generating the hash, defaults to 'base64'. All encodings from Node.JS' hash.digest are supported. + */ + hashDigest?: "base64" | "latin1" | "hex"; + + /** + * The prefix length of the hash digest to use, defaults to 4. + */ + hashDigestLength?: number; + + /** + * The hashing algorithm to use, defaults to 'md4'. All functions from Node.JS' crypto.createHash are supported. + */ + hashFunction?: string | typeof Hash; +} +declare abstract class HelperRuntimeModule extends RuntimeModule {} +declare class HotModuleReplacementPlugin { + constructor(); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; + static getParserHooks(parser: JavascriptParser): HMRJavascriptParserHooks; +} + +/** + * These properties are added by the HotModuleReplacementPlugin + */ +declare interface HotModuleReplacementPluginLoaderContext { + hot?: boolean; +} +declare class HotUpdateChunk extends Chunk { + constructor(); +} + +/** + * Options for building http resources. + */ +declare interface HttpUriOptions { + /** + * List of allowed URIs (resp. the beginning of them). + */ + allowedUris: (string | RegExp | ((uri: string) => boolean))[]; + + /** + * Location where resource content is stored for lockfile entries. It's also possible to disable storing by passing false. + */ + cacheLocation?: string | false; + + /** + * When set, anything that would lead to a modification of the lockfile or any resource content, will result in an error. + */ + frozen?: boolean; + + /** + * Location of the lockfile. + */ + lockfileLocation?: string; + + /** + * Proxy configuration, which can be used to specify a proxy server to use for HTTP requests. + */ + proxy?: string; + + /** + * When set, resources of existing lockfile entries will be fetched and entries will be upgraded when resource content has changed. + */ + upgrade?: boolean; +} +declare class HttpUriPlugin { + constructor(options: HttpUriOptions); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +type HttpsServerOptions = SecureContextOptions & + TlsOptions & + ServerOptions; +type IBigIntStats = IStatsBase & { + atimeNs: bigint; + mtimeNs: bigint; + ctimeNs: bigint; + birthtimeNs: bigint; +}; +declare interface IStats { + isFile: () => boolean; + isDirectory: () => boolean; + isBlockDevice: () => boolean; + isCharacterDevice: () => boolean; + isSymbolicLink: () => boolean; + isFIFO: () => boolean; + isSocket: () => boolean; + dev: number; + ino: number; + mode: number; + nlink: number; + uid: number; + gid: number; + rdev: number; + size: number; + blksize: number; + blocks: number; + atimeMs: number; + mtimeMs: number; + ctimeMs: number; + birthtimeMs: number; + atime: Date; + mtime: Date; + ctime: Date; + birthtime: Date; +} +declare interface IStatsBase { + isFile: () => boolean; + isDirectory: () => boolean; + isBlockDevice: () => boolean; + isCharacterDevice: () => boolean; + isSymbolicLink: () => boolean; + isFIFO: () => boolean; + isSocket: () => boolean; + dev: T; + ino: T; + mode: T; + nlink: T; + uid: T; + gid: T; + rdev: T; + size: T; + blksize: T; + blocks: T; + atimeMs: T; + mtimeMs: T; + ctimeMs: T; + birthtimeMs: T; + atime: Date; + mtime: Date; + ctime: Date; + birthtime: Date; +} +declare class IgnorePlugin { + constructor(options: IgnorePluginOptions); + options: IgnorePluginOptions; + + /** + * Note that if "contextRegExp" is given, both the "resourceRegExp" and "contextRegExp" have to match. + */ + checkIgnore(resolveData: ResolveData): undefined | false; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +type IgnorePluginOptions = + | { + /** + * A RegExp to test the context (directory) against. + */ + contextRegExp?: RegExp; + /** + * A RegExp to test the request against. + */ + resourceRegExp: RegExp; + } + | { + /** + * A filter function for resource and context. + */ + checkResource: (resource: string, context: string) => boolean; + }; +type ImportAttribute = BaseNode & { + type: "ImportAttribute"; + key: Identifier | SimpleLiteral | RegExpLiteral | BigIntLiteral; + value: Literal; +}; +type ImportAttributes = Record & {}; +type ImportDeclarationJavascriptParser = ImportDeclarationImport & { + attributes?: ImportAttribute[]; +}; +declare interface ImportDependencyMeta { + attributes?: ImportAttributes; + externalType?: "import" | "module"; +} +type ImportExpressionJavascriptParser = ImportExpressionImport & { + options?: + | null + | ImportExpressionImport + | UnaryExpression + | ArrayExpression + | ArrowFunctionExpression + | AssignmentExpression + | AwaitExpression + | BinaryExpression + | SimpleCallExpression + | NewExpression + | ChainExpression + | ClassExpression + | ConditionalExpression + | FunctionExpression + | Identifier + | SimpleLiteral + | RegExpLiteral + | BigIntLiteral + | LogicalExpression + | MemberExpression + | MetaProperty + | ObjectExpression + | SequenceExpression + | TaggedTemplateExpression + | TemplateLiteral + | ThisExpression + | UpdateExpression + | YieldExpression; +}; +declare interface ImportModuleOptions { + /** + * the target layer + */ + layer?: string; + + /** + * the target public path + */ + publicPath?: string; + + /** + * target base uri + */ + baseUri?: string; +} +type ImportSource = + | undefined + | null + | string + | SimpleLiteral + | RegExpLiteral + | BigIntLiteral; + +/** + * Options for infrastructure level logging. + */ +declare interface InfrastructureLogging { + /** + * Only appends lines to the output. Avoids updating existing output e. g. for status messages. This option is only used when no custom console is provided. + */ + appendOnly?: boolean; + + /** + * Enables/Disables colorful output. This option is only used when no custom console is provided. + */ + colors?: boolean; + + /** + * Custom console used for logging. + */ + console?: Console; + + /** + * Enable debug logging for specific loggers. + */ + debug?: + | string + | boolean + | RegExp + | FilterItemTypes[] + | ((value: string) => boolean); + + /** + * Log level. + */ + level?: "none" | "error" | "warn" | "info" | "log" | "verbose"; + + /** + * Stream used for logging output. Defaults to process.stderr. This option is only used when no custom console is provided. + */ + stream?: NodeJS.WritableStream & { + isTTY?: boolean; + columns?: number; + rows?: number; + }; +} +declare class InitFragment { + constructor( + content: undefined | string | Source, + stage: number, + position: number, + key?: string, + endContent?: string | Source + ); + content?: string | Source; + stage: number; + position: number; + key?: string; + endContent?: string | Source; + getContent(context: GenerateContext): undefined | string | Source; + getEndContent(context: GenerateContext): undefined | string | Source; + serialize(context: ObjectSerializerContext): void; + deserialize(context: ObjectDeserializerContext): void; + merge: any; + static addToSource( + source: Source, + initFragments: InitFragment[], + context: Context + ): Source; + static STAGE_CONSTANTS: number; + static STAGE_ASYNC_BOUNDARY: number; + static STAGE_HARMONY_EXPORTS: number; + static STAGE_HARMONY_IMPORTS: number; + static STAGE_PROVIDES: number; + static STAGE_ASYNC_DEPENDENCIES: number; + static STAGE_ASYNC_HARMONY_IMPORTS: number; +} +declare interface InputFileSystem { + readFile: ReadFileFs; + readFileSync?: ReadFileSync; + readlink: ReadlinkFs; + readlinkSync?: ReadlinkSync; + readdir: ReaddirFs; + readdirSync?: ReaddirSync; + stat: StatFs; + statSync?: StatSync; + lstat?: LStatFs; + lstatSync?: LStatSync; + realpath?: RealPathFs; + realpathSync?: RealPathSync; + readJson?: ( + pathOrFileDescriptor: PathOrFileDescriptorFs, + callback: ( + err: null | Error | NodeJS.ErrnoException, + result?: JsonObjectFs + ) => void + ) => void; + readJsonSync?: (pathOrFileDescriptor: PathOrFileDescriptorFs) => JsonObjectFs; + purge?: (value?: string | string[] | Set) => void; + join?: (path1: string, path2: string) => string; + relative?: (from: string, to: string) => string; + dirname?: (dirname: string) => string; +} +declare interface Inspector { + Session: typeof SessionImportInspectorClass_1; +} +type IntermediateFileSystem = InputFileSystem & + OutputFileSystem & + IntermediateFileSystemExtras; +declare interface IntermediateFileSystemExtras { + mkdirSync: MkdirSync; + createWriteStream: ( + pathLike: PathLikeFs, + result?: + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "base64" + | "base64url" + | "latin1" + | "binary" + | "hex" + | WriteStreamOptions + ) => NodeJS.WritableStream; + open: Open; + read: Read>; + close: ( + df: number, + callback: (err: null | NodeJS.ErrnoException) => void + ) => void; + rename: ( + a: PathLikeFs, + b: PathLikeFs, + callback: (err: null | NodeJS.ErrnoException) => void + ) => void; +} +type InternalCell = T | typeof TOMBSTONE | typeof UNDEFINED_MARKER; +declare interface InterpolatedPathAndAssetInfo { + path: string; + info: AssetInfo; +} +declare interface Item { + [index: string]: string | string[] | T; +} +declare abstract class ItemCacheFacade { + get(callback: CallbackCacheCacheFacade): void; + getPromise(): Promise; + store(data: T, callback: CallbackCacheCacheFacade): void; + storePromise(data: T): Promise; + provide( + computer: (callback: CallbackNormalErrorCache) => void, + callback: CallbackNormalErrorCache + ): void; + providePromise(computer: () => T | Promise): Promise; +} +declare class JavascriptModulesPlugin { + constructor(options?: object); + options: object; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; + renderModule( + module: Module, + renderContext: ChunkRenderContextJavascriptModulesPlugin, + hooks: CompilationHooksJavascriptModulesPlugin, + factory: boolean + ): null | Source; + renderChunk( + renderContext: RenderContextJavascriptModulesPlugin, + hooks: CompilationHooksJavascriptModulesPlugin + ): Source; + renderMain( + renderContext: MainRenderContext, + hooks: CompilationHooksJavascriptModulesPlugin, + compilation: Compilation + ): Source; + updateHashWithBootstrap( + hash: Hash, + renderContext: RenderBootstrapContext, + hooks: CompilationHooksJavascriptModulesPlugin + ): void; + renderBootstrap( + renderContext: RenderBootstrapContext, + hooks: CompilationHooksJavascriptModulesPlugin + ): Bootstrap; + renderRequire( + renderContext: RenderBootstrapContext, + hooks: CompilationHooksJavascriptModulesPlugin + ): string; + getRenamedInlineModule( + allModules: Module[], + renderContext: MainRenderContext, + inlinedModules: Set, + chunkRenderContext: ChunkRenderContextJavascriptModulesPlugin, + hooks: CompilationHooksJavascriptModulesPlugin, + allStrict: undefined | boolean, + hasChunkModules: boolean + ): false | Map; + static getCompilationHooks( + compilation: Compilation + ): CompilationHooksJavascriptModulesPlugin; + static getChunkFilenameTemplate( + chunk: Chunk, + outputOptions: Output + ): TemplatePath; + static chunkHasJs: (chunk: Chunk, chunkGraph: ChunkGraph) => boolean; +} +declare class JavascriptParser extends Parser { + constructor(sourceType?: "module" | "auto" | "script"); + hooks: Readonly<{ + evaluateTypeof: HookMap< + SyncBailHook< + [UnaryExpression], + undefined | null | BasicEvaluatedExpression + > + >; + evaluate: HookMap< + SyncBailHook< + [ + | ImportExpressionImport + | UnaryExpression + | ArrayExpression + | ArrowFunctionExpression + | AssignmentExpression + | AwaitExpression + | BinaryExpression + | SimpleCallExpression + | NewExpression + | ChainExpression + | ClassExpression + | ConditionalExpression + | FunctionExpression + | Identifier + | SimpleLiteral + | RegExpLiteral + | BigIntLiteral + | LogicalExpression + | MemberExpression + | MetaProperty + | ObjectExpression + | SequenceExpression + | TaggedTemplateExpression + | TemplateLiteral + | ThisExpression + | UpdateExpression + | YieldExpression + | SpreadElement + | PrivateIdentifier + | Super + ], + undefined | null | BasicEvaluatedExpression + > + >; + evaluateIdentifier: HookMap< + SyncBailHook< + [Identifier | MemberExpression | MetaProperty | ThisExpression], + undefined | null | BasicEvaluatedExpression + > + >; + evaluateDefinedIdentifier: HookMap< + SyncBailHook< + [Identifier | MemberExpression | ThisExpression], + undefined | null | BasicEvaluatedExpression + > + >; + evaluateNewExpression: HookMap< + SyncBailHook<[NewExpression], undefined | null | BasicEvaluatedExpression> + >; + evaluateCallExpression: HookMap< + SyncBailHook< + [CallExpression], + undefined | null | BasicEvaluatedExpression + > + >; + evaluateCallExpressionMember: HookMap< + SyncBailHook< + [CallExpression, BasicEvaluatedExpression], + undefined | null | BasicEvaluatedExpression + > + >; + isPure: HookMap< + SyncBailHook< + [ + ( + | ImportExpressionImport + | UnaryExpression + | ArrayExpression + | ArrowFunctionExpression + | AssignmentExpression + | AwaitExpression + | BinaryExpression + | SimpleCallExpression + | NewExpression + | ChainExpression + | ClassExpression + | ConditionalExpression + | FunctionExpression + | Identifier + | SimpleLiteral + | RegExpLiteral + | BigIntLiteral + | LogicalExpression + | MemberExpression + | MetaProperty + | ObjectExpression + | SequenceExpression + | TaggedTemplateExpression + | TemplateLiteral + | ThisExpression + | UpdateExpression + | YieldExpression + | PrivateIdentifier + | FunctionDeclaration + | MaybeNamedFunctionDeclaration + | VariableDeclaration + | ClassDeclaration + | MaybeNamedClassDeclaration + ), + number + ], + boolean | void + > + >; + preStatement: SyncBailHook< + [ + | ImportDeclarationJavascriptParser + | ExportNamedDeclarationJavascriptParser + | ExportAllDeclarationJavascriptParser + | FunctionDeclaration + | MaybeNamedFunctionDeclaration + | VariableDeclaration + | ClassDeclaration + | MaybeNamedClassDeclaration + | ExpressionStatement + | BlockStatement + | StaticBlock + | EmptyStatement + | DebuggerStatement + | WithStatement + | ReturnStatement + | LabeledStatement + | BreakStatement + | ContinueStatement + | IfStatement + | SwitchStatement + | ThrowStatement + | TryStatement + | WhileStatement + | DoWhileStatement + | ForStatement + | ForInStatement + | ForOfStatement + | ExportDefaultDeclaration + ], + boolean | void + >; + blockPreStatement: SyncBailHook< + [ + | ImportDeclarationJavascriptParser + | ExportNamedDeclarationJavascriptParser + | ExportAllDeclarationJavascriptParser + | FunctionDeclaration + | MaybeNamedFunctionDeclaration + | VariableDeclaration + | ClassDeclaration + | MaybeNamedClassDeclaration + | ExpressionStatement + | BlockStatement + | StaticBlock + | EmptyStatement + | DebuggerStatement + | WithStatement + | ReturnStatement + | LabeledStatement + | BreakStatement + | ContinueStatement + | IfStatement + | SwitchStatement + | ThrowStatement + | TryStatement + | WhileStatement + | DoWhileStatement + | ForStatement + | ForInStatement + | ForOfStatement + | ExportDefaultDeclaration + ], + boolean | void + >; + statement: SyncBailHook< + [ + | ImportDeclarationJavascriptParser + | ExportNamedDeclarationJavascriptParser + | ExportAllDeclarationJavascriptParser + | FunctionDeclaration + | MaybeNamedFunctionDeclaration + | VariableDeclaration + | ClassDeclaration + | MaybeNamedClassDeclaration + | ExpressionStatement + | BlockStatement + | StaticBlock + | EmptyStatement + | DebuggerStatement + | WithStatement + | ReturnStatement + | LabeledStatement + | BreakStatement + | ContinueStatement + | IfStatement + | SwitchStatement + | ThrowStatement + | TryStatement + | WhileStatement + | DoWhileStatement + | ForStatement + | ForInStatement + | ForOfStatement + | ExportDefaultDeclaration + ], + boolean | void + >; + statementIf: SyncBailHook<[IfStatement], boolean | void>; + classExtendsExpression: SyncBailHook< + [ + Expression, + ClassExpression | ClassDeclaration | MaybeNamedClassDeclaration + ], + boolean | void + >; + classBodyElement: SyncBailHook< + [ + StaticBlock | MethodDefinition | PropertyDefinition, + ClassExpression | ClassDeclaration | MaybeNamedClassDeclaration + ], + boolean | void + >; + classBodyValue: SyncBailHook< + [ + Expression, + MethodDefinition | PropertyDefinition, + ClassExpression | ClassDeclaration | MaybeNamedClassDeclaration + ], + boolean | void + >; + label: HookMap>; + import: SyncBailHook< + [ImportDeclarationJavascriptParser, ImportSource], + boolean | void + >; + importSpecifier: SyncBailHook< + [ImportDeclarationJavascriptParser, ImportSource, null | string, string], + boolean | void + >; + export: SyncBailHook< + [ExportNamedDeclarationJavascriptParser | ExportDefaultDeclaration], + boolean | void + >; + exportImport: SyncBailHook< + [ + ( + | ExportNamedDeclarationJavascriptParser + | ExportAllDeclarationJavascriptParser + ), + ImportSource + ], + boolean | void + >; + exportDeclaration: SyncBailHook< + [ + ( + | ExportNamedDeclarationJavascriptParser + | ExportAllDeclarationJavascriptParser + | ExportDefaultDeclaration + ), + Declaration + ], + boolean | void + >; + exportExpression: SyncBailHook< + [ + ExportDefaultDeclaration, + ( + | ImportExpressionImport + | UnaryExpression + | ArrayExpression + | ArrowFunctionExpression + | AssignmentExpression + | AwaitExpression + | BinaryExpression + | SimpleCallExpression + | NewExpression + | ChainExpression + | ClassExpression + | ConditionalExpression + | FunctionExpression + | Identifier + | SimpleLiteral + | RegExpLiteral + | BigIntLiteral + | LogicalExpression + | MemberExpression + | MetaProperty + | ObjectExpression + | SequenceExpression + | TaggedTemplateExpression + | TemplateLiteral + | ThisExpression + | UpdateExpression + | YieldExpression + | MaybeNamedFunctionDeclaration + | MaybeNamedClassDeclaration + ) + ], + boolean | void + >; + exportSpecifier: SyncBailHook< + [ + ( + | ExportNamedDeclarationJavascriptParser + | ExportAllDeclarationJavascriptParser + | ExportDefaultDeclaration + ), + string, + string, + undefined | number + ], + boolean | void + >; + exportImportSpecifier: SyncBailHook< + [ + ( + | ExportNamedDeclarationJavascriptParser + | ExportAllDeclarationJavascriptParser + ), + ImportSource, + null | string, + null | string, + undefined | number + ], + boolean | void + >; + preDeclarator: SyncBailHook< + [VariableDeclarator, Statement], + boolean | void + >; + declarator: SyncBailHook<[VariableDeclarator, Statement], boolean | void>; + varDeclaration: HookMap>; + varDeclarationLet: HookMap>; + varDeclarationConst: HookMap>; + varDeclarationVar: HookMap>; + pattern: HookMap>; + canRename: HookMap>; + rename: HookMap>; + assign: HookMap>; + assignMemberChain: HookMap< + SyncBailHook<[AssignmentExpression, string[]], boolean | void> + >; + typeof: HookMap>; + importCall: SyncBailHook< + [ImportExpressionJavascriptParser], + boolean | void + >; + topLevelAwait: SyncBailHook< + [ + | ImportExpressionImport + | UnaryExpression + | ArrayExpression + | ArrowFunctionExpression + | AssignmentExpression + | AwaitExpression + | BinaryExpression + | SimpleCallExpression + | NewExpression + | ChainExpression + | ClassExpression + | ConditionalExpression + | FunctionExpression + | Identifier + | SimpleLiteral + | RegExpLiteral + | BigIntLiteral + | LogicalExpression + | MemberExpression + | MetaProperty + | ObjectExpression + | SequenceExpression + | TaggedTemplateExpression + | TemplateLiteral + | ThisExpression + | UpdateExpression + | YieldExpression + | ForOfStatement + ], + boolean | void + >; + call: HookMap>; + callMemberChain: HookMap< + SyncBailHook< + [CallExpression, string[], boolean[], [number, number][]], + boolean | void + > + >; + memberChainOfCallMemberChain: HookMap< + SyncBailHook< + [Expression, string[], CallExpression, string[], [number, number][]], + boolean | void + > + >; + callMemberChainOfCallMemberChain: HookMap< + SyncBailHook< + [ + CallExpression, + string[], + CallExpression, + string[], + [number, number][] + ], + boolean | void + > + >; + optionalChaining: SyncBailHook<[ChainExpression], boolean | void>; + new: HookMap>; + binaryExpression: SyncBailHook<[BinaryExpression], boolean | void>; + expression: HookMap>; + expressionMemberChain: HookMap< + SyncBailHook< + [MemberExpression, string[], boolean[], [number, number][]], + boolean | void + > + >; + unhandledExpressionMemberChain: HookMap< + SyncBailHook<[MemberExpression, string[]], boolean | void> + >; + expressionConditionalOperator: SyncBailHook< + [ConditionalExpression], + boolean | void + >; + expressionLogicalOperator: SyncBailHook< + [LogicalExpression], + boolean | void + >; + program: SyncBailHook<[Program, Comment[]], boolean | void>; + terminate: SyncBailHook<[ReturnStatement | ThrowStatement], boolean | void>; + finish: SyncBailHook<[Program, Comment[]], boolean | void>; + }>; + sourceType: "module" | "auto" | "script"; + scope: ScopeInfo; + state: ParserState; + comments?: Comment[]; + semicolons?: Set; + statementPath?: StatementPathItem[]; + prevStatement?: + | ImportDeclarationJavascriptParser + | ExportNamedDeclarationJavascriptParser + | ExportAllDeclarationJavascriptParser + | ImportExpressionImport + | UnaryExpression + | ArrayExpression + | ArrowFunctionExpression + | AssignmentExpression + | AwaitExpression + | BinaryExpression + | SimpleCallExpression + | NewExpression + | ChainExpression + | ClassExpression + | ConditionalExpression + | FunctionExpression + | Identifier + | SimpleLiteral + | RegExpLiteral + | BigIntLiteral + | LogicalExpression + | MemberExpression + | MetaProperty + | ObjectExpression + | SequenceExpression + | TaggedTemplateExpression + | TemplateLiteral + | ThisExpression + | UpdateExpression + | YieldExpression + | FunctionDeclaration + | MaybeNamedFunctionDeclaration + | VariableDeclaration + | ClassDeclaration + | MaybeNamedClassDeclaration + | ExpressionStatement + | BlockStatement + | StaticBlock + | EmptyStatement + | DebuggerStatement + | WithStatement + | ReturnStatement + | LabeledStatement + | BreakStatement + | ContinueStatement + | IfStatement + | SwitchStatement + | ThrowStatement + | TryStatement + | WhileStatement + | DoWhileStatement + | ForStatement + | ForInStatement + | ForOfStatement + | ExportDefaultDeclaration; + destructuringAssignmentProperties?: WeakMap< + Expression, + Set + >; + currentTagData?: TagData; + magicCommentContext: Context; + destructuringAssignmentPropertiesFor( + node: Expression + ): undefined | Set; + getRenameIdentifier( + expr: + | ImportExpressionImport + | UnaryExpression + | ArrayExpression + | ArrowFunctionExpression + | AssignmentExpression + | AwaitExpression + | BinaryExpression + | SimpleCallExpression + | NewExpression + | ChainExpression + | ClassExpression + | ConditionalExpression + | FunctionExpression + | Identifier + | SimpleLiteral + | RegExpLiteral + | BigIntLiteral + | LogicalExpression + | MemberExpression + | MetaProperty + | ObjectExpression + | SequenceExpression + | TaggedTemplateExpression + | TemplateLiteral + | ThisExpression + | UpdateExpression + | YieldExpression + | SpreadElement + ): undefined | string | VariableInfo; + walkClass( + classy: ClassExpression | ClassDeclaration | MaybeNamedClassDeclaration + ): void; + + /** + * Pre walking iterates the scope for variable declarations + */ + preWalkStatements( + statements: ( + | ImportDeclarationJavascriptParser + | ExportNamedDeclarationJavascriptParser + | ExportAllDeclarationJavascriptParser + | FunctionDeclaration + | VariableDeclaration + | ClassDeclaration + | ExpressionStatement + | BlockStatement + | StaticBlock + | EmptyStatement + | DebuggerStatement + | WithStatement + | ReturnStatement + | LabeledStatement + | BreakStatement + | ContinueStatement + | IfStatement + | SwitchStatement + | ThrowStatement + | TryStatement + | WhileStatement + | DoWhileStatement + | ForStatement + | ForInStatement + | ForOfStatement + | ExportDefaultDeclaration + )[] + ): void; + + /** + * Block pre walking iterates the scope for block variable declarations + */ + blockPreWalkStatements( + statements: ( + | ImportDeclarationJavascriptParser + | ExportNamedDeclarationJavascriptParser + | ExportAllDeclarationJavascriptParser + | FunctionDeclaration + | VariableDeclaration + | ClassDeclaration + | ExpressionStatement + | BlockStatement + | StaticBlock + | EmptyStatement + | DebuggerStatement + | WithStatement + | ReturnStatement + | LabeledStatement + | BreakStatement + | ContinueStatement + | IfStatement + | SwitchStatement + | ThrowStatement + | TryStatement + | WhileStatement + | DoWhileStatement + | ForStatement + | ForInStatement + | ForOfStatement + | ExportDefaultDeclaration + )[] + ): void; + + /** + * Walking iterates the statements and expressions and processes them + */ + walkStatements( + statements: ( + | ImportDeclarationJavascriptParser + | ExportNamedDeclarationJavascriptParser + | ExportAllDeclarationJavascriptParser + | FunctionDeclaration + | VariableDeclaration + | ClassDeclaration + | ExpressionStatement + | BlockStatement + | StaticBlock + | EmptyStatement + | DebuggerStatement + | WithStatement + | ReturnStatement + | LabeledStatement + | BreakStatement + | ContinueStatement + | IfStatement + | SwitchStatement + | ThrowStatement + | TryStatement + | WhileStatement + | DoWhileStatement + | ForStatement + | ForInStatement + | ForOfStatement + | ExportDefaultDeclaration + )[] + ): void; + + /** + * Walking iterates the statements and expressions and processes them + */ + preWalkStatement( + statement: + | ImportDeclarationJavascriptParser + | ExportNamedDeclarationJavascriptParser + | ExportAllDeclarationJavascriptParser + | FunctionDeclaration + | MaybeNamedFunctionDeclaration + | VariableDeclaration + | ClassDeclaration + | MaybeNamedClassDeclaration + | ExpressionStatement + | BlockStatement + | StaticBlock + | EmptyStatement + | DebuggerStatement + | WithStatement + | ReturnStatement + | LabeledStatement + | BreakStatement + | ContinueStatement + | IfStatement + | SwitchStatement + | ThrowStatement + | TryStatement + | WhileStatement + | DoWhileStatement + | ForStatement + | ForInStatement + | ForOfStatement + | ExportDefaultDeclaration + ): void; + blockPreWalkStatement( + statement: + | ImportDeclarationJavascriptParser + | ExportNamedDeclarationJavascriptParser + | ExportAllDeclarationJavascriptParser + | FunctionDeclaration + | MaybeNamedFunctionDeclaration + | VariableDeclaration + | ClassDeclaration + | MaybeNamedClassDeclaration + | ExpressionStatement + | BlockStatement + | StaticBlock + | EmptyStatement + | DebuggerStatement + | WithStatement + | ReturnStatement + | LabeledStatement + | BreakStatement + | ContinueStatement + | IfStatement + | SwitchStatement + | ThrowStatement + | TryStatement + | WhileStatement + | DoWhileStatement + | ForStatement + | ForInStatement + | ForOfStatement + | ExportDefaultDeclaration + ): void; + walkStatement( + statement: + | ImportDeclarationJavascriptParser + | ExportNamedDeclarationJavascriptParser + | ExportAllDeclarationJavascriptParser + | FunctionDeclaration + | MaybeNamedFunctionDeclaration + | VariableDeclaration + | ClassDeclaration + | MaybeNamedClassDeclaration + | ExpressionStatement + | BlockStatement + | StaticBlock + | EmptyStatement + | DebuggerStatement + | WithStatement + | ReturnStatement + | LabeledStatement + | BreakStatement + | ContinueStatement + | IfStatement + | SwitchStatement + | ThrowStatement + | TryStatement + | WhileStatement + | DoWhileStatement + | ForStatement + | ForInStatement + | ForOfStatement + | ExportDefaultDeclaration + ): void; + + /** + * Walks a statements that is nested within a parent statement + * and can potentially be a non-block statement. + * This enforces the nested statement to never be in ASI position. + */ + walkNestedStatement(statement: Statement): void; + preWalkBlockStatement(statement: BlockStatement): void; + walkBlockStatement(statement: BlockStatement): void; + walkExpressionStatement(statement: ExpressionStatement): void; + preWalkIfStatement(statement: IfStatement): void; + walkIfStatement(statement: IfStatement): void; + preWalkLabeledStatement(statement: LabeledStatement): void; + walkLabeledStatement(statement: LabeledStatement): void; + preWalkWithStatement(statement: WithStatement): void; + walkWithStatement(statement: WithStatement): void; + preWalkSwitchStatement(statement: SwitchStatement): void; + walkSwitchStatement(statement: SwitchStatement): void; + walkTerminatingStatement(statement: ReturnStatement | ThrowStatement): void; + walkReturnStatement(statement: ReturnStatement): void; + walkThrowStatement(statement: ThrowStatement): void; + preWalkTryStatement(statement: TryStatement): void; + walkTryStatement(statement: TryStatement): void; + preWalkWhileStatement(statement: WhileStatement): void; + walkWhileStatement(statement: WhileStatement): void; + preWalkDoWhileStatement(statement: DoWhileStatement): void; + walkDoWhileStatement(statement: DoWhileStatement): void; + preWalkForStatement(statement: ForStatement): void; + walkForStatement(statement: ForStatement): void; + preWalkForInStatement(statement: ForInStatement): void; + walkForInStatement(statement: ForInStatement): void; + preWalkForOfStatement(statement: ForOfStatement): void; + walkForOfStatement(statement: ForOfStatement): void; + preWalkFunctionDeclaration( + statement: FunctionDeclaration | MaybeNamedFunctionDeclaration + ): void; + walkFunctionDeclaration( + statement: FunctionDeclaration | MaybeNamedFunctionDeclaration + ): void; + blockPreWalkExpressionStatement(statement: ExpressionStatement): void; + preWalkAssignmentExpression(expression: AssignmentExpression): void; + blockPreWalkImportDeclaration( + statement: ImportDeclarationJavascriptParser + ): void; + enterDeclaration( + declaration: Declaration, + onIdent: (ident: string, identifier: Identifier) => void + ): void; + blockPreWalkExportNamedDeclaration( + statement: ExportNamedDeclarationJavascriptParser + ): void; + walkExportNamedDeclaration( + statement: ExportNamedDeclarationJavascriptParser + ): void; + blockPreWalkExportDefaultDeclaration( + statement: ExportDefaultDeclaration + ): void; + walkExportDefaultDeclaration(statement: ExportDefaultDeclaration): void; + blockPreWalkExportAllDeclaration( + statement: ExportAllDeclarationJavascriptParser + ): void; + preWalkVariableDeclaration(statement: VariableDeclaration): void; + blockPreWalkVariableDeclaration(statement: VariableDeclaration): void; + preWalkVariableDeclarator(declarator: VariableDeclarator): void; + walkVariableDeclaration(statement: VariableDeclaration): void; + blockPreWalkClassDeclaration( + statement: ClassDeclaration | MaybeNamedClassDeclaration + ): void; + walkClassDeclaration( + statement: ClassDeclaration | MaybeNamedClassDeclaration + ): void; + preWalkSwitchCases(switchCases: SwitchCase[]): void; + walkSwitchCases(switchCases: SwitchCase[]): void; + preWalkCatchClause(catchClause: CatchClause): void; + walkCatchClause(catchClause: CatchClause): void; + walkPattern(pattern: Pattern): void; + walkAssignmentPattern(pattern: AssignmentPattern): void; + walkObjectPattern(pattern: ObjectPattern): void; + walkArrayPattern(pattern: ArrayPattern): void; + walkRestElement(pattern: RestElement): void; + walkExpressions( + expressions: ( + | null + | ImportExpressionImport + | UnaryExpression + | ArrayExpression + | ArrowFunctionExpression + | AssignmentExpression + | AwaitExpression + | BinaryExpression + | SimpleCallExpression + | NewExpression + | ChainExpression + | ClassExpression + | ConditionalExpression + | FunctionExpression + | Identifier + | SimpleLiteral + | RegExpLiteral + | BigIntLiteral + | LogicalExpression + | MemberExpression + | MetaProperty + | ObjectExpression + | SequenceExpression + | TaggedTemplateExpression + | TemplateLiteral + | ThisExpression + | UpdateExpression + | YieldExpression + | SpreadElement + )[] + ): void; + walkExpression( + expression: + | ImportExpressionImport + | UnaryExpression + | ArrayExpression + | ArrowFunctionExpression + | AssignmentExpression + | AwaitExpression + | BinaryExpression + | SimpleCallExpression + | NewExpression + | ChainExpression + | ClassExpression + | ConditionalExpression + | FunctionExpression + | Identifier + | SimpleLiteral + | RegExpLiteral + | BigIntLiteral + | LogicalExpression + | MemberExpression + | MetaProperty + | ObjectExpression + | SequenceExpression + | TaggedTemplateExpression + | TemplateLiteral + | ThisExpression + | UpdateExpression + | YieldExpression + | SpreadElement + | PrivateIdentifier + | Super + ): void; + walkAwaitExpression(expression: AwaitExpression): void; + walkArrayExpression(expression: ArrayExpression): void; + walkSpreadElement(expression: SpreadElement): void; + walkObjectExpression(expression: ObjectExpression): void; + walkProperty(prop: SpreadElement | Property): void; + walkFunctionExpression(expression: FunctionExpression): void; + walkArrowFunctionExpression(expression: ArrowFunctionExpression): void; + walkSequenceExpression(expression: SequenceExpression): void; + walkUpdateExpression(expression: UpdateExpression): void; + walkUnaryExpression(expression: UnaryExpression): void; + walkLeftRightExpression( + expression: BinaryExpression | LogicalExpression + ): void; + walkBinaryExpression(expression: BinaryExpression): void; + walkLogicalExpression(expression: LogicalExpression): void; + walkAssignmentExpression(expression: AssignmentExpression): void; + walkConditionalExpression(expression: ConditionalExpression): void; + walkNewExpression(expression: NewExpression): void; + walkYieldExpression(expression: YieldExpression): void; + walkTemplateLiteral(expression: TemplateLiteral): void; + walkTaggedTemplateExpression(expression: TaggedTemplateExpression): void; + walkClassExpression(expression: ClassExpression): void; + walkChainExpression(expression: ChainExpression): void; + walkImportExpression(expression: ImportExpressionJavascriptParser): void; + walkCallExpression(expression: CallExpression): void; + walkMemberExpression(expression: MemberExpression): void; + walkMemberExpressionWithExpressionName( + expression: MemberExpression, + name: string, + rootInfo: string | VariableInfo, + members: string[], + onUnhandled: () => undefined | R + ): void; + walkThisExpression(expression: ThisExpression): void; + walkIdentifier(expression: Identifier): void; + walkMetaProperty(metaProperty: MetaProperty): void; + callHooksForExpression( + hookMap: HookMap>, + expr: + | ImportExpressionImport + | UnaryExpression + | ArrayExpression + | ArrowFunctionExpression + | AssignmentExpression + | AwaitExpression + | BinaryExpression + | SimpleCallExpression + | NewExpression + | ChainExpression + | ClassExpression + | ConditionalExpression + | FunctionExpression + | Identifier + | SimpleLiteral + | RegExpLiteral + | BigIntLiteral + | LogicalExpression + | MemberExpression + | MetaProperty + | ObjectExpression + | SequenceExpression + | TaggedTemplateExpression + | TemplateLiteral + | ThisExpression + | UpdateExpression + | YieldExpression + | Super, + ...args: AsArray + ): undefined | R; + callHooksForExpressionWithFallback( + hookMap: HookMap>, + expr: + | ImportExpressionImport + | UnaryExpression + | ArrayExpression + | ArrowFunctionExpression + | AssignmentExpression + | AwaitExpression + | BinaryExpression + | SimpleCallExpression + | NewExpression + | ChainExpression + | ClassExpression + | ConditionalExpression + | FunctionExpression + | Identifier + | SimpleLiteral + | RegExpLiteral + | BigIntLiteral + | LogicalExpression + | MemberExpression + | MetaProperty + | ObjectExpression + | SequenceExpression + | TaggedTemplateExpression + | TemplateLiteral + | ThisExpression + | UpdateExpression + | YieldExpression + | Super, + fallback: + | undefined + | (( + name: string, + rootInfo: string | VariableInfo | ScopeInfo, + getMembers: () => string[] + ) => any), + defined: undefined | ((result?: string) => undefined | R), + ...args: AsArray + ): undefined | R; + callHooksForName( + hookMap: HookMap>, + name: string, + ...args: AsArray + ): undefined | R; + callHooksForInfo( + hookMap: HookMap>, + info: ExportedVariableInfo, + ...args: AsArray + ): undefined | R; + callHooksForInfoWithFallback( + hookMap: HookMap>, + info: ExportedVariableInfo, + fallback: undefined | ((name: string) => any), + defined: undefined | ((result?: string) => any), + ...args: AsArray + ): undefined | R; + callHooksForNameWithFallback( + hookMap: HookMap>, + name: string, + fallback: undefined | ((value: string) => undefined | R), + defined: undefined | (() => R), + ...args: AsArray + ): undefined | R; + inScope( + params: ( + | string + | Identifier + | MemberExpression + | ObjectPattern + | ArrayPattern + | RestElement + | AssignmentPattern + | Property + )[], + fn: () => void + ): void; + inClassScope(hasThis: boolean, params: Identifier[], fn: () => void): void; + inFunctionScope( + hasThis: boolean, + params: ( + | string + | Identifier + | MemberExpression + | ObjectPattern + | ArrayPattern + | RestElement + | AssignmentPattern + )[], + fn: () => void + ): void; + inBlockScope(fn: () => void, inExecutedPath?: boolean): void; + detectMode( + statements: ( + | ImportDeclarationJavascriptParser + | ExportNamedDeclarationJavascriptParser + | ExportAllDeclarationJavascriptParser + | FunctionDeclaration + | VariableDeclaration + | ClassDeclaration + | ExpressionStatement + | BlockStatement + | StaticBlock + | EmptyStatement + | DebuggerStatement + | WithStatement + | ReturnStatement + | LabeledStatement + | BreakStatement + | ContinueStatement + | IfStatement + | SwitchStatement + | ThrowStatement + | TryStatement + | WhileStatement + | DoWhileStatement + | ForStatement + | ForInStatement + | ForOfStatement + | ExportDefaultDeclaration + | Directive + )[] + ): void; + enterPatterns( + patterns: ( + | string + | Identifier + | MemberExpression + | ObjectPattern + | ArrayPattern + | RestElement + | AssignmentPattern + | Property + )[], + onIdent: (ident: string) => void + ): void; + enterPattern( + pattern: + | Identifier + | MemberExpression + | ObjectPattern + | ArrayPattern + | RestElement + | AssignmentPattern + | Property, + onIdent: (ident: string, identifier: Identifier) => void + ): void; + enterIdentifier( + pattern: Identifier, + onIdent: (ident: string, identifier: Identifier) => void + ): void; + enterObjectPattern( + pattern: ObjectPattern, + onIdent: (ident: string, identifier: Identifier) => void + ): void; + enterArrayPattern( + pattern: ArrayPattern, + onIdent: (ident: string, identifier: Identifier) => void + ): void; + enterRestElement( + pattern: RestElement, + onIdent: (ident: string, identifier: Identifier) => void + ): void; + enterAssignmentPattern( + pattern: AssignmentPattern, + onIdent: (ident: string, identifier: Identifier) => void + ): void; + evaluateExpression( + expression: + | ImportExpressionImport + | UnaryExpression + | ArrayExpression + | ArrowFunctionExpression + | AssignmentExpression + | AwaitExpression + | BinaryExpression + | SimpleCallExpression + | NewExpression + | ChainExpression + | ClassExpression + | ConditionalExpression + | FunctionExpression + | Identifier + | SimpleLiteral + | RegExpLiteral + | BigIntLiteral + | LogicalExpression + | MemberExpression + | MetaProperty + | ObjectExpression + | SequenceExpression + | TaggedTemplateExpression + | TemplateLiteral + | ThisExpression + | UpdateExpression + | YieldExpression + | SpreadElement + | PrivateIdentifier + | Super + ): BasicEvaluatedExpression; + parseString(expression: Expression): string; + parseCalculatedString(expression: Expression): { + range?: [number, number]; + value: string; + code: boolean; + conditional: any; + }; + evaluate(source: string): BasicEvaluatedExpression; + isPure( + expr: + | undefined + | null + | ImportExpressionImport + | UnaryExpression + | ArrayExpression + | ArrowFunctionExpression + | AssignmentExpression + | AwaitExpression + | BinaryExpression + | SimpleCallExpression + | NewExpression + | ChainExpression + | ClassExpression + | ConditionalExpression + | FunctionExpression + | Identifier + | SimpleLiteral + | RegExpLiteral + | BigIntLiteral + | LogicalExpression + | MemberExpression + | MetaProperty + | ObjectExpression + | SequenceExpression + | TaggedTemplateExpression + | TemplateLiteral + | ThisExpression + | UpdateExpression + | YieldExpression + | PrivateIdentifier + | FunctionDeclaration + | MaybeNamedFunctionDeclaration + | VariableDeclaration + | ClassDeclaration + | MaybeNamedClassDeclaration, + commentsStartPos: number + ): boolean; + getComments(range: [number, number]): Comment[]; + isAsiPosition(pos: number): boolean; + setAsiPosition(pos: number): void; + unsetAsiPosition(pos: number): void; + isStatementLevelExpression(expr: Expression): boolean; + getTagData(name: string, tag: symbol): undefined | TagData; + tagVariable(name: string, tag: symbol, data?: TagData): void; + defineVariable(name: string): void; + undefineVariable(name: string): void; + isVariableDefined(name: string): boolean; + getVariableInfo(name: string): ExportedVariableInfo; + setVariable(name: string, variableInfo: ExportedVariableInfo): void; + evaluatedVariable(tagInfo: TagInfo): VariableInfo; + parseCommentOptions(range: [number, number]): { + options: null | Record; + errors: null | (Error & { comment: Comment })[]; + }; + extractMemberExpressionChain( + expression: + | ImportExpressionImport + | UnaryExpression + | ArrayExpression + | ArrowFunctionExpression + | AssignmentExpression + | AwaitExpression + | BinaryExpression + | SimpleCallExpression + | NewExpression + | ChainExpression + | ClassExpression + | ConditionalExpression + | FunctionExpression + | Identifier + | SimpleLiteral + | RegExpLiteral + | BigIntLiteral + | LogicalExpression + | MemberExpression + | MetaProperty + | ObjectExpression + | SequenceExpression + | TaggedTemplateExpression + | TemplateLiteral + | ThisExpression + | UpdateExpression + | YieldExpression + | Super + ): { + members: string[]; + object: + | ImportExpressionImport + | UnaryExpression + | ArrayExpression + | ArrowFunctionExpression + | AssignmentExpression + | AwaitExpression + | BinaryExpression + | SimpleCallExpression + | NewExpression + | ChainExpression + | ClassExpression + | ConditionalExpression + | FunctionExpression + | Identifier + | SimpleLiteral + | RegExpLiteral + | BigIntLiteral + | LogicalExpression + | MemberExpression + | MetaProperty + | ObjectExpression + | SequenceExpression + | TaggedTemplateExpression + | TemplateLiteral + | ThisExpression + | UpdateExpression + | YieldExpression + | Super; + membersOptionals: boolean[]; + memberRanges: [number, number][]; + }; + getFreeInfoFromVariable( + varName: string + ): undefined | { name: string; info: string | VariableInfo }; + getMemberExpressionInfo( + expression: + | ImportExpressionImport + | UnaryExpression + | ArrayExpression + | ArrowFunctionExpression + | AssignmentExpression + | AwaitExpression + | BinaryExpression + | SimpleCallExpression + | NewExpression + | ChainExpression + | ClassExpression + | ConditionalExpression + | FunctionExpression + | Identifier + | SimpleLiteral + | RegExpLiteral + | BigIntLiteral + | LogicalExpression + | MemberExpression + | MetaProperty + | ObjectExpression + | SequenceExpression + | TaggedTemplateExpression + | TemplateLiteral + | ThisExpression + | UpdateExpression + | YieldExpression + | Super, + allowedTypes: number + ): undefined | CallExpressionInfo | ExpressionExpressionInfo; + getNameForExpression( + expression: MemberExpression + ): + | undefined + | { + name: string; + rootInfo: ExportedVariableInfo; + getMembers: () => string[]; + }; + static ALLOWED_MEMBER_TYPES_ALL: 3; + static ALLOWED_MEMBER_TYPES_EXPRESSION: 2; + static ALLOWED_MEMBER_TYPES_CALL_EXPRESSION: 1; + static getImportAttributes: ( + node: + | ImportDeclarationJavascriptParser + | ExportNamedDeclarationJavascriptParser + | ExportAllDeclarationJavascriptParser + | ImportExpressionJavascriptParser + ) => undefined | ImportAttributes; + static VariableInfo: typeof VariableInfo; +} + +/** + * Parser options for javascript modules. + */ +declare interface JavascriptParserOptions { + [index: string]: any; + + /** + * Set the value of `require.amd` and `define.amd`. Or disable AMD support. + */ + amd?: false | { [index: string]: any }; + + /** + * Enable/disable special handling for browserify bundles. + */ + browserify?: boolean; + + /** + * Enable/disable parsing of CommonJs syntax. + */ + commonjs?: boolean; + + /** + * Enable/disable parsing of magic comments in CommonJs syntax. + */ + commonjsMagicComments?: boolean; + + /** + * Enable/disable parsing "import { createRequire } from "module"" and evaluating createRequire(). + */ + createRequire?: string | boolean; + + /** + * Specifies global fetchPriority for dynamic import. + */ + dynamicImportFetchPriority?: false | "auto" | "low" | "high"; + + /** + * Specifies global mode for dynamic import. + */ + dynamicImportMode?: "weak" | "eager" | "lazy" | "lazy-once"; + + /** + * Specifies global prefetch for dynamic import. + */ + dynamicImportPrefetch?: number | boolean; + + /** + * Specifies global preload for dynamic import. + */ + dynamicImportPreload?: number | boolean; + + /** + * Specifies the behavior of invalid export names in "import ... from ..." and "export ... from ...". + */ + exportsPresence?: false | "auto" | "error" | "warn"; + + /** + * Enable warnings for full dynamic dependencies. + */ + exprContextCritical?: boolean; + + /** + * Enable recursive directory lookup for full dynamic dependencies. + */ + exprContextRecursive?: boolean; + + /** + * Sets the default regular expression for full dynamic dependencies. + */ + exprContextRegExp?: boolean | RegExp; + + /** + * Set the default request for full dynamic dependencies. + */ + exprContextRequest?: string; + + /** + * Enable/disable parsing of EcmaScript Modules syntax. + */ + harmony?: boolean; + + /** + * Enable/disable parsing of import() syntax. + */ + import?: boolean; + + /** + * Specifies the behavior of invalid export names in "import ... from ...". + */ + importExportsPresence?: false | "auto" | "error" | "warn"; + + /** + * Enable/disable evaluating import.meta. + */ + importMeta?: boolean; + + /** + * Enable/disable evaluating import.meta.webpackContext. + */ + importMetaContext?: boolean; + + /** + * Include polyfills or mocks for various node stuff. + */ + node?: false | NodeOptions; + + /** + * Override the module to strict or non-strict. This may affect the behavior of the module (some behaviors differ between strict and non-strict), so please configure this option carefully. + */ + overrideStrict?: "strict" | "non-strict"; + + /** + * Specifies the behavior of invalid export names in "export ... from ...". This might be useful to disable during the migration from "export ... from ..." to "export type ... from ..." when reexporting types in TypeScript. + */ + reexportExportsPresence?: false | "auto" | "error" | "warn"; + + /** + * Enable/disable parsing of require.context syntax. + */ + requireContext?: boolean; + + /** + * Enable/disable parsing of require.ensure syntax. + */ + requireEnsure?: boolean; + + /** + * Enable/disable parsing of require.include syntax. + */ + requireInclude?: boolean; + + /** + * Enable/disable parsing of require.js special syntax like require.config, requirejs.config, require.version and requirejs.onError. + */ + requireJs?: boolean; + + /** + * Deprecated in favor of "exportsPresence". Emit errors instead of warnings when imported names don't exist in imported module. + */ + strictExportPresence?: boolean; + + /** + * Handle the this context correctly according to the spec for namespace objects. + */ + strictThisContextOnImports?: boolean; + + /** + * Enable/disable parsing of System.js special syntax like System.import, System.get, System.set and System.register. + */ + system?: boolean; + + /** + * Enable warnings when using the require function in a not statically analyse-able way. + */ + unknownContextCritical?: boolean; + + /** + * Enable recursive directory lookup when using the require function in a not statically analyse-able way. + */ + unknownContextRecursive?: boolean; + + /** + * Sets the regular expression when using the require function in a not statically analyse-able way. + */ + unknownContextRegExp?: boolean | RegExp; + + /** + * Sets the request when using the require function in a not statically analyse-able way. + */ + unknownContextRequest?: string; + + /** + * Enable/disable parsing of new URL() syntax. + */ + url?: boolean | "relative"; + + /** + * Disable or configure parsing of WebWorker syntax like new Worker() or navigator.serviceWorker.register(). + */ + worker?: boolean | string[]; + + /** + * Enable warnings for partial dynamic dependencies. + */ + wrappedContextCritical?: boolean; + + /** + * Enable recursive directory lookup for partial dynamic dependencies. + */ + wrappedContextRecursive?: boolean; + + /** + * Set the inner regular expression for partial dynamic dependencies. + */ + wrappedContextRegExp?: RegExp; +} + +/** + * Generator options for json modules. + */ +declare interface JsonGeneratorOptions { + /** + * Use `JSON.parse` when the JSON string is longer than 20 characters. + */ + JSONParse?: boolean; +} +type JsonObjectFs = { [index: string]: JsonValueFs } & { + [index: string]: + | undefined + | null + | string + | number + | boolean + | JsonObjectFs + | JsonValueFs[]; +}; +type JsonObjectTypes = { [index: string]: JsonValueTypes } & { + [index: string]: + | undefined + | null + | string + | number + | boolean + | JsonObjectTypes + | JsonValueTypes[]; +}; + +/** + * Parser options for JSON modules. + */ +declare interface JsonParserOptions { + /** + * The depth of json dependency flagged as `exportInfo`. + */ + exportsDepth?: number; + + /** + * Function to parser content and return JSON. + */ + parse?: ( + input: string + ) => null | string | number | boolean | Buffer | JsonObjectFs | JsonValueFs[]; +} +type JsonValueFs = + | null + | string + | number + | boolean + | JsonObjectFs + | JsonValueFs[]; +type JsonValueTypes = + | null + | string + | number + | boolean + | JsonObjectTypes + | JsonValueTypes[]; +declare class JsonpChunkLoadingRuntimeModule extends RuntimeModule { + constructor(runtimeRequirements: ReadonlySet); + static getCompilationHooks( + compilation: Compilation + ): JsonpCompilationPluginHooks; + + /** + * Runtime modules without any dependencies to other runtime modules + */ + static STAGE_NORMAL: number; + + /** + * Runtime modules with simple dependencies on other runtime modules + */ + static STAGE_BASIC: number; + + /** + * Runtime modules which attach to handlers of other runtime modules + */ + static STAGE_ATTACH: number; + + /** + * Runtime modules which trigger actions on bootstrap + */ + static STAGE_TRIGGER: number; +} +declare interface JsonpCompilationPluginHooks { + linkPreload: SyncWaterfallHook<[string, Chunk]>; + linkPrefetch: SyncWaterfallHook<[string, Chunk]>; +} +declare class JsonpTemplatePlugin { + constructor(); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; + static getCompilationHooks( + compilation: Compilation + ): JsonpCompilationPluginHooks; +} +declare interface KnownAssetInfo { + /** + * true, if the asset can be long term cached forever (contains a hash) + */ + immutable?: boolean; + + /** + * whether the asset is minimized + */ + minimized?: boolean; + + /** + * the value(s) of the full hash used for this asset + */ + fullhash?: string | string[]; + + /** + * the value(s) of the chunk hash used for this asset + */ + chunkhash?: string | string[]; + + /** + * the value(s) of the module hash used for this asset + */ + modulehash?: string | string[]; + + /** + * the value(s) of the content hash used for this asset + */ + contenthash?: string | string[]; + + /** + * when asset was created from a source file (potentially transformed), the original filename relative to compilation context + */ + sourceFilename?: string; + + /** + * size in bytes, only set after asset has been emitted + */ + size?: number; + + /** + * true, when asset is only used for development and doesn't count towards user-facing assets + */ + development?: boolean; + + /** + * true, when asset ships data for updating an existing application (HMR) + */ + hotModuleReplacement?: boolean; + + /** + * true, when asset is javascript and an ESM + */ + javascriptModule?: boolean; + + /** + * object of pointers to other assets, keyed by type of relation (only points from parent to child) + */ + related?: Record; +} +declare interface KnownBuildInfo { + cacheable?: boolean; + parsed?: boolean; + strict?: boolean; + + /** + * using in AMD + */ + moduleArgument?: string; + + /** + * using in AMD + */ + exportsArgument?: string; + + /** + * using in CommonJs + */ + moduleConcatenationBailout?: string; + + /** + * using in APIPlugin + */ + needCreateRequire?: boolean; + + /** + * using in HttpUriPlugin + */ + resourceIntegrity?: string; + + /** + * using in NormalModule + */ + fileDependencies?: LazySet; + + /** + * using in NormalModule + */ + contextDependencies?: LazySet; + + /** + * using in NormalModule + */ + missingDependencies?: LazySet; + + /** + * using in NormalModule + */ + buildDependencies?: LazySet; + + /** + * using in NormalModule + */ + valueDependencies?: Map>; + + /** + * using in NormalModule + */ + assets?: Record; + + /** + * using in NormalModule + */ + hash?: string; + + /** + * using in ContextModule + */ + snapshot?: null | Snapshot; + + /** + * for assets modules + */ + fullContentHash?: string; + + /** + * for assets modules + */ + filename?: string; + + /** + * for assets modules + */ + assetsInfo?: Map; + + /** + * for assets modules + */ + dataUrl?: boolean; + + /** + * for css modules + */ + cssData?: CssData; +} +declare interface KnownBuildMeta { + exportsType?: "namespace" | "dynamic" | "default" | "flagged"; + defaultObject?: false | "redirect" | "redirect-warn"; + strictHarmonyModule?: boolean; + async?: boolean; + sideEffectFree?: boolean; + exportsFinalName?: Record; + isCSSModule?: boolean; +} +declare interface KnownCreateStatsOptionsContext { + forToString?: boolean; +} +declare interface KnownHooks { + resolveStep: SyncHook< + [ + AsyncSeriesBailHook< + [ResolveRequest, ResolveContext], + null | ResolveRequest + >, + ResolveRequest + ] + >; + noResolve: SyncHook<[ResolveRequest, Error]>; + resolve: AsyncSeriesBailHook< + [ResolveRequest, ResolveContext], + null | ResolveRequest + >; + result: AsyncSeriesHook<[ResolveRequest, ResolveContext]>; +} +declare interface KnownNormalizedStatsOptions { + context: string; + requestShortener: RequestShortener; + chunksSort: string | false; + modulesSort: string | false; + chunkModulesSort: string | false; + nestedModulesSort: string | false; + assetsSort: string | false; + ids: boolean; + cachedAssets: boolean; + groupAssetsByEmitStatus: boolean; + groupAssetsByPath: boolean; + groupAssetsByExtension: boolean; + assetsSpace: number; + excludeAssets: ((value: string, asset: StatsAsset) => boolean)[]; + excludeModules: (( + name: string, + module: StatsModule, + type: ExcludeModulesType + ) => boolean)[]; + warningsFilter: ((warning: StatsError, textValue: string) => boolean)[]; + cachedModules: boolean; + orphanModules: boolean; + dependentModules: boolean; + runtimeModules: boolean; + groupModulesByCacheStatus: boolean; + groupModulesByLayer: boolean; + groupModulesByAttributes: boolean; + groupModulesByPath: boolean; + groupModulesByExtension: boolean; + groupModulesByType: boolean; + entrypoints: boolean | "auto"; + chunkGroups: boolean; + chunkGroupAuxiliary: boolean; + chunkGroupChildren: boolean; + chunkGroupMaxAssets: number; + modulesSpace: number; + chunkModulesSpace: number; + nestedModulesSpace: number; + logging: false | "none" | "error" | "warn" | "info" | "log" | "verbose"; + loggingDebug: ((value: string) => boolean)[]; + loggingTrace: boolean; +} +declare interface KnownStatsAsset { + type: string; + name: string; + info: AssetInfo; + size: number; + emitted: boolean; + comparedForEmit: boolean; + cached: boolean; + related?: StatsAsset[]; + chunks?: ChunkId[]; + chunkNames?: ChunkName[]; + chunkIdHints?: string[]; + auxiliaryChunks?: ChunkId[]; + auxiliaryChunkNames?: ChunkName[]; + auxiliaryChunkIdHints?: string[]; + filteredRelated?: number; + isOverSizeLimit?: boolean; +} +declare interface KnownStatsChunk { + rendered: boolean; + initial: boolean; + entry: boolean; + recorded: boolean; + reason?: string; + size: number; + sizes: Record; + names: string[]; + idHints: string[]; + runtime?: string[]; + files: string[]; + auxiliaryFiles: string[]; + hash: string; + childrenByOrder: Record; + id?: string | number; + siblings?: (string | number)[]; + parents?: (string | number)[]; + children?: (string | number)[]; + modules?: StatsModule[]; + filteredModules?: number; + origins?: StatsChunkOrigin[]; +} +declare interface KnownStatsChunkGroup { + name?: null | string; + chunks?: (string | number)[]; + assets?: { name: string; size?: number }[]; + filteredAssets?: number; + assetsSize?: number; + auxiliaryAssets?: { name: string; size?: number }[]; + filteredAuxiliaryAssets?: number; + auxiliaryAssetsSize?: number; + children?: { [index: string]: StatsChunkGroup[] }; + childAssets?: { [index: string]: string[] }; + isOverSizeLimit?: boolean; +} +declare interface KnownStatsChunkOrigin { + module: string; + moduleIdentifier: string; + moduleName: string; + loc: string; + request: string; + moduleId?: string | number; +} +declare interface KnownStatsCompilation { + env?: Record; + name?: string; + hash?: string; + version?: string; + time?: number; + builtAt?: number; + needAdditionalPass?: boolean; + publicPath?: string; + outputPath?: string; + assetsByChunkName?: Record; + assets?: StatsAsset[]; + filteredAssets?: number; + chunks?: StatsChunk[]; + modules?: StatsModule[]; + filteredModules?: number; + entrypoints?: Record; + namedChunkGroups?: Record; + errors?: StatsError[]; + errorsCount?: number; + warnings?: StatsError[]; + warningsCount?: number; + children?: StatsCompilation[]; + logging?: Record; + filteredWarningDetailsCount?: number; + filteredErrorDetailsCount?: number; +} +declare interface KnownStatsError { + message: string; + chunkName?: string; + chunkEntry?: boolean; + chunkInitial?: boolean; + file?: string; + moduleIdentifier?: string; + moduleName?: string; + loc?: string; + chunkId?: string | number; + moduleId?: string | number; + moduleTrace?: StatsModuleTraceItem[]; + details?: string; + stack?: string; + cause?: KnownStatsError; + errors?: KnownStatsError[]; + compilerPath?: string; +} +declare interface KnownStatsFactoryContext { + type: string; + makePathsRelative: (path: string) => string; + compilation: Compilation; + rootModules: Set; + compilationFileToChunks: Map; + compilationAuxiliaryFileToChunks: Map; + runtime: RuntimeSpec; + cachedGetErrors: (compilation: Compilation) => WebpackError[]; + cachedGetWarnings: (compilation: Compilation) => WebpackError[]; +} +declare interface KnownStatsLogging { + entries: StatsLoggingEntry[]; + filteredEntries: number; + debug: boolean; +} +declare interface KnownStatsLoggingEntry { + type: string; + message?: string; + trace?: string[]; + children?: StatsLoggingEntry[]; + args?: any[]; + time?: number; +} +declare interface KnownStatsModule { + type?: string; + moduleType?: string; + layer?: null | string; + identifier?: string; + name?: string; + nameForCondition?: null | string; + index?: number; + preOrderIndex?: number; + index2?: number; + postOrderIndex?: number; + size?: number; + sizes?: { [index: string]: number }; + cacheable?: boolean; + built?: boolean; + codeGenerated?: boolean; + buildTimeExecuted?: boolean; + cached?: boolean; + optional?: boolean; + orphan?: boolean; + id?: string | number; + issuerId?: null | string | number; + chunks?: (string | number)[]; + assets?: (string | number)[]; + dependent?: boolean; + issuer?: null | string; + issuerName?: null | string; + issuerPath?: null | StatsModuleIssuer[]; + failed?: boolean; + errors?: number; + warnings?: number; + profile?: StatsProfile; + reasons?: StatsModuleReason[]; + usedExports?: null | boolean | string[]; + providedExports?: null | string[]; + optimizationBailout?: string[]; + depth?: null | number; + modules?: StatsModule[]; + filteredModules?: number; + source?: string | Buffer; +} +declare interface KnownStatsModuleIssuer { + identifier: string; + name: string; + id?: string | number; + profile: StatsProfile; +} +declare interface KnownStatsModuleReason { + moduleIdentifier: null | string; + module: null | string; + moduleName: null | string; + resolvedModuleIdentifier: null | string; + resolvedModule: null | string; + type: null | string; + active: boolean; + explanation: null | string; + userRequest: null | string; + loc?: null | string; + moduleId?: null | string | number; + resolvedModuleId?: null | string | number; +} +declare interface KnownStatsModuleTraceDependency { + loc?: string; +} +declare interface KnownStatsModuleTraceItem { + originIdentifier?: string; + originName?: string; + moduleIdentifier?: string; + moduleName?: string; + dependencies?: StatsModuleTraceDependency[]; + originId?: string | number; + moduleId?: string | number; +} +declare interface KnownStatsPrinterColorFunctions { + bold?: (value: string | number) => string; + yellow?: (value: string | number) => string; + red?: (value: string | number) => string; + green?: (value: string | number) => string; + magenta?: (value: string | number) => string; + cyan?: (value: string | number) => string; +} +declare interface KnownStatsPrinterContext { + type?: string; + compilation?: StatsCompilation; + chunkGroup?: StatsChunkGroup; + chunkGroupKind?: string; + asset?: StatsAsset; + module?: StatsModule; + chunk?: StatsChunk; + moduleReason?: StatsModuleReason; + moduleIssuer?: StatsModuleIssuer; + error?: StatsError; + profile?: StatsProfile; + logging?: StatsLogging; + moduleTraceItem?: StatsModuleTraceItem; + moduleTraceDependency?: StatsModuleTraceDependency; +} +declare interface KnownStatsPrinterFormatters { + formatFilename?: (file: string, oversize?: boolean) => string; + formatModuleId?: (id: string | number) => string; + formatChunkId?: ( + id: string | number, + direction?: "parent" | "child" | "sibling" + ) => string; + formatSize?: (size: number) => string; + formatLayer?: (size: string) => string; + formatDateTime?: (dateTime: number) => string; + formatFlag?: (flag: string) => string; + formatTime?: (time: number, boldQuantity?: boolean) => string; + formatError?: (message: string) => string; +} +declare interface KnownStatsProfile { + total: number; + resolving: number; + restoring: number; + building: number; + integration: number; + storing: number; + additionalResolving: number; + additionalIntegration: number; + factory: number; + dependencies: number; +} +declare interface KnownUnsafeCacheData { + /** + * factory meta + */ + factoryMeta?: FactoryMeta; + + /** + * resolve options + */ + resolveOptions?: ResolveOptions; + parserOptions?: ParserOptions; + generatorOptions?: GeneratorOptions; +} +declare interface LStatFs { + ( + path: PathLikeFs, + callback: (err: null | NodeJS.ErrnoException, result?: IStats) => void + ): void; + ( + path: PathLikeFs, + options: undefined | (StatOptions & { bigint?: false }), + callback: (err: null | NodeJS.ErrnoException, result?: IStats) => void + ): void; + ( + path: PathLikeFs, + options: StatOptions & { bigint: true }, + callback: (err: null | NodeJS.ErrnoException, result?: IBigIntStats) => void + ): void; + ( + path: PathLikeFs, + options: undefined | StatOptions, + callback: ( + err: null | NodeJS.ErrnoException, + result?: IStats | IBigIntStats + ) => void + ): void; +} +declare interface LStatSync { + (path: PathLikeFs, options?: undefined): IStats; + ( + path: PathLikeFs, + options?: StatSyncOptions & { bigint?: false; throwIfNoEntry: false } + ): undefined | IStats; + ( + path: PathLikeFs, + options: StatSyncOptions & { bigint: true; throwIfNoEntry: false } + ): undefined | IBigIntStats; + (path: PathLikeFs, options?: StatSyncOptions & { bigint?: false }): IStats; + (path: PathLikeFs, options: StatSyncOptions & { bigint: true }): IBigIntStats; + ( + path: PathLikeFs, + options: StatSyncOptions & { bigint: boolean; throwIfNoEntry?: false } + ): IStats | IBigIntStats; + ( + path: PathLikeFs, + options?: StatSyncOptions + ): undefined | IStats | IBigIntStats; +} +declare interface LStatTypes { + ( + path: PathLikeTypes, + callback: (arg0: null | NodeJS.ErrnoException, arg1?: IStats) => void + ): void; + ( + path: PathLikeTypes, + options: undefined | (StatOptions & { bigint?: false }), + callback: (arg0: null | NodeJS.ErrnoException, arg1?: IStats) => void + ): void; + ( + path: PathLikeTypes, + options: StatOptions & { bigint: true }, + callback: (arg0: null | NodeJS.ErrnoException, arg1?: IBigIntStats) => void + ): void; + ( + path: PathLikeTypes, + options: undefined | StatOptions, + callback: ( + arg0: null | NodeJS.ErrnoException, + arg1?: IStats | IBigIntStats + ) => void + ): void; +} + +/** + * Options for the default backend. + */ +declare interface LazyCompilationDefaultBackendOptions { + /** + * A custom client. + */ + client?: string; + + /** + * Specifies where to listen to from the server. + */ + listen?: number | ListenOptions | ((server: Server) => void); + + /** + * Specifies the protocol the client should use to connect to the server. + */ + protocol?: "http" | "https"; + + /** + * Specifies how to create the server handling the EventSource requests. + */ + server?: + | ServerOptions + | HttpsServerOptions + | (() => Server); +} + +/** + * Options for compiling entrypoints and import()s only when they are accessed. + */ +declare interface LazyCompilationOptions { + /** + * Specifies the backend that should be used for handling client keep alive. + */ + backend?: + | (( + compiler: Compiler, + callback: (err: null | Error, api?: BackendApi) => void + ) => void) + | ((compiler: Compiler) => Promise) + | LazyCompilationDefaultBackendOptions; + + /** + * Enable/disable lazy compilation for entries. + */ + entries?: boolean; + + /** + * Enable/disable lazy compilation for import() modules. + */ + imports?: boolean; + + /** + * Specify which entrypoints or import()ed modules should be lazily compiled. This is matched with the imported module and not the entrypoint name. + */ + test?: string | RegExp | ((module: Module) => boolean); +} +type LazyFunction< + InputValue, + OutputValue, + InternalLazyTarget extends SerializerMiddleware< + any, + any, + Record + >, + InternalLazyOptions extends undefined | LazyOptions +> = (() => InputValue | Promise) & + Partial<{ options: InternalLazyOptions }>; +declare interface LazyOptions { + [index: string]: any; +} +declare class LazySet { + constructor(iterable?: Iterable); + get size(): number; + add(item: T): LazySet; + addAll(iterable: LazySet | Iterable): LazySet; + clear(): void; + delete(value: T): boolean; + entries(): IterableIterator<[T, T]>; + forEach( + callbackFn: (value: T, value2: T, set: Set) => void, + thisArg: K + ): void; + has(item: T): boolean; + keys(): IterableIterator; + values(): IterableIterator; + serialize(__0: ObjectSerializerContext): void; + [Symbol.iterator](): IterableIterator; + static deserialize(__0: ObjectDeserializerContext): LazySet; +} +declare interface LibIdentOptions { + /** + * absolute context path to which lib ident is relative to + */ + context: string; + + /** + * object for caching + */ + associatedObjectForCache?: object; +} +declare class LibManifestPlugin { + constructor(options: LibManifestPluginOptions); + options: LibManifestPluginOptions; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface LibManifestPluginOptions { + /** + * Context of requests in the manifest file (defaults to the webpack context). + */ + context?: string; + + /** + * If true, only entry points will be exposed (default: true). + */ + entryOnly?: boolean; + + /** + * If true, manifest json file (output) will be formatted. + */ + format?: boolean; + + /** + * Name of the exposed dll function (external name, use value of 'output.library'). + */ + name?: string; + + /** + * Absolute path to the manifest json file (output). + */ + path: string; + + /** + * Type of the dll bundle (external type, use value of 'output.libraryTarget'). + */ + type?: string; +} +declare interface LibraryContext { + compilation: Compilation; + chunkGraph: ChunkGraph; + options: T; +} + +/** + * Set explicit comments for `commonjs`, `commonjs2`, `amd`, and `root`. + */ +declare interface LibraryCustomUmdCommentObject { + /** + * Set comment for `amd` section in UMD. + */ + amd?: string; + + /** + * Set comment for `commonjs` (exports) section in UMD. + */ + commonjs?: string; + + /** + * Set comment for `commonjs2` (module.exports) section in UMD. + */ + commonjs2?: string; + + /** + * Set comment for `root` (global variable) section in UMD. + */ + root?: string; +} + +/** + * Description object for all UMD variants of the library name. + */ +declare interface LibraryCustomUmdObject { + /** + * Name of the exposed AMD library in the UMD. + */ + amd?: string; + + /** + * Name of the exposed commonjs export in the UMD. + */ + commonjs?: string; + + /** + * Name of the property exposed globally by a UMD library. + */ + root?: string | string[]; +} +type LibraryExport = string | string[]; +type LibraryName = string | string[] | LibraryCustomUmdObject; + +/** + * Options for library. + */ +declare interface LibraryOptions { + /** + * Add a container for define/require functions in the AMD module. + */ + amdContainer?: string; + + /** + * Add a comment in the UMD wrapper. + */ + auxiliaryComment?: string | LibraryCustomUmdCommentObject; + + /** + * Specify which export should be exposed as library. + */ + export?: string | string[]; + + /** + * The name of the library (some types allow unnamed libraries too). + */ + name?: string | string[] | LibraryCustomUmdObject; + + /** + * Type of library (types included by default are 'var', 'module', 'assign', 'assign-properties', 'this', 'window', 'self', 'global', 'commonjs', 'commonjs2', 'commonjs-module', 'commonjs-static', 'amd', 'amd-require', 'umd', 'umd2', 'jsonp', 'system', but others might be added by plugins). + */ + type: string; + + /** + * If `output.libraryTarget` is set to umd and `output.library` is set, setting this to true will name the AMD module. + */ + umdNamedDefine?: boolean; +} +declare class LibraryTemplatePlugin { + constructor( + name: LibraryName, + target: string, + umdNamedDefine: boolean, + auxiliaryComment: AuxiliaryComment, + exportProperty: LibraryExport + ); + library: { + type: string; + name: LibraryName; + umdNamedDefine: boolean; + auxiliaryComment: AuxiliaryComment; + export: LibraryExport; + }; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare class LimitChunkCountPlugin { + constructor(options?: LimitChunkCountPluginOptions); + options: LimitChunkCountPluginOptions; + apply(compiler: Compiler): void; +} +declare interface LimitChunkCountPluginOptions { + /** + * Constant overhead for a chunk. + */ + chunkOverhead?: number; + + /** + * Multiplicator for initial chunks. + */ + entryChunkMultiplicator?: number; + + /** + * Limit the maximum number of chunks using a value greater greater than or equal to 1. + */ + maxChunks: number; +} +type Literal = SimpleLiteral | RegExpLiteral | BigIntLiteral; +declare interface LoadScriptCompilationHooks { + createScript: SyncWaterfallHook<[string, Chunk]>; +} +declare class LoadScriptRuntimeModule extends HelperRuntimeModule { + constructor(withCreateScriptUrl?: boolean, withFetchPriority?: boolean); + static getCompilationHooks( + compilation: Compilation + ): LoadScriptCompilationHooks; + + /** + * Runtime modules without any dependencies to other runtime modules + */ + static STAGE_NORMAL: number; + + /** + * Runtime modules with simple dependencies on other runtime modules + */ + static STAGE_BASIC: number; + + /** + * Runtime modules which attach to handlers of other runtime modules + */ + static STAGE_ATTACH: number; + + /** + * Runtime modules which trigger actions on bootstrap + */ + static STAGE_TRIGGER: number; +} + +/** + * Custom values available in the loader context. + */ +declare interface Loader { + [index: string]: any; +} +type LoaderContextDeclarationsIndex = + NormalModuleLoaderContext & + LoaderRunnerLoaderContext & + LoaderPluginLoaderContext & + HotModuleReplacementPluginLoaderContext; +type LoaderContextNormalModule = NormalModuleLoaderContext & + LoaderRunnerLoaderContext & + LoaderPluginLoaderContext & + HotModuleReplacementPluginLoaderContext; +type LoaderDefinition< + OptionsType = {}, + ContextAdditions = {} +> = LoaderDefinitionFunction & { + raw?: false; + pitch?: PitchLoaderDefinitionFunction; +}; +declare interface LoaderDefinitionFunction< + OptionsType = {}, + ContextAdditions = {} +> { + ( + this: NormalModuleLoaderContext & + LoaderRunnerLoaderContext & + LoaderPluginLoaderContext & + HotModuleReplacementPluginLoaderContext & + ContextAdditions, + content: string, + sourceMap?: string | SourceMap, + additionalData?: AdditionalData + ): string | void | Buffer | Promise; +} +declare interface LoaderItem { + loader: string; + options?: null | string | Record; + ident: null | string; + type: null | string; +} +declare interface LoaderModule { + default?: + | RawLoaderDefinitionFunction + | LoaderDefinitionFunction; + raw?: false; + pitch?: PitchLoaderDefinitionFunction; +} +declare class LoaderOptionsPlugin { + constructor(options?: LoaderOptionsPluginOptions & MatchObject); + options: LoaderOptionsPluginOptions & MatchObject; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface LoaderOptionsPluginOptions { + [index: string]: any; + + /** + * Whether loaders should be in debug mode or not. debug will be removed as of webpack 3. + */ + debug?: boolean; + + /** + * Where loaders can be switched to minimize mode. + */ + minimize?: boolean; + + /** + * A configuration object that can be used to configure older loaders. + */ + options?: { + [index: string]: any; + /** + * The context that can be used to configure older loaders. + */ + context?: string; + }; +} + +/** + * These properties are added by the LoaderPlugin + */ +declare interface LoaderPluginLoaderContext { + /** + * Resolves the given request to a module, applies all configured loaders and calls + * back with the generated source, the sourceMap and the module instance (usually an + * instance of NormalModule). Use this function if you need to know the source code + * of another module to generate the result. + */ + loadModule( + request: string, + callback: ( + err: null | Error, + source?: string | Buffer, + sourceMap?: null | object, + module?: Module + ) => void + ): void; + importModule( + request: string, + options: undefined | ImportModuleOptions, + callback: (err?: null | Error, exports?: any) => any + ): void; + importModule(request: string, options?: ImportModuleOptions): Promise; +} + +/** + * The properties are added by https://github.com/webpack/loader-runner + */ +declare interface LoaderRunnerLoaderContext { + /** + * Add a directory as dependency of the loader result. + */ + addContextDependency(context: string): void; + + /** + * Adds a file as dependency of the loader result in order to make them watchable. + * For example, html-loader uses this technique as it finds src and src-set attributes. + * Then, it sets the url's for those attributes as dependencies of the html file that is parsed. + */ + addDependency(file: string): void; + addMissingDependency(context: string): void; + + /** + * Make this loader async. + */ + async(): ( + err?: null | Error, + content?: string | Buffer, + sourceMap?: null | string | SourceMap, + additionalData?: AdditionalData + ) => void; + + /** + * Make this loader result cacheable. By default it's cacheable. + * A cacheable loader must have a deterministic result, when inputs and dependencies haven't changed. + * This means the loader shouldn't have other dependencies than specified with this.addDependency. + * Most loaders are deterministic and cacheable. + */ + cacheable(flag?: boolean): void; + callback: ( + err?: null | Error, + content?: string | Buffer, + sourceMap?: null | string | SourceMap, + additionalData?: AdditionalData + ) => void; + + /** + * Remove all dependencies of the loader result. Even initial dependencies and these of other loaders. + */ + clearDependencies(): void; + + /** + * The directory of the module. Can be used as context for resolving other stuff. + * eg '/workspaces/ts-loader/examples/vanilla/src' + */ + context: string; + readonly currentRequest: string; + readonly data: any; + + /** + * alias of addDependency + * Adds a file as dependency of the loader result in order to make them watchable. + * For example, html-loader uses this technique as it finds src and src-set attributes. + * Then, it sets the url's for those attributes as dependencies of the html file that is parsed. + */ + dependency(file: string): void; + getContextDependencies(): string[]; + getDependencies(): string[]; + getMissingDependencies(): string[]; + + /** + * The index in the loaders array of the current loader. + * In the example: in loader1: 0, in loader2: 1 + */ + loaderIndex: number; + readonly previousRequest: string; + readonly query: string | OptionsType; + readonly remainingRequest: string; + readonly request: string; + + /** + * An array of all the loaders. It is writeable in the pitch phase. + * loaders = [{request: string, path: string, query: string, module: function}] + * In the example: + * [ + * { request: "/abc/loader1.js?xyz", + * path: "/abc/loader1.js", + * query: "?xyz", + * module: [Function] + * }, + * { request: "/abc/node_modules/loader2/index.js", + * path: "/abc/node_modules/loader2/index.js", + * query: "", + * module: [Function] + * } + * ] + */ + loaders: { + request: string; + path: string; + query: string; + fragment: string; + options?: string | object; + ident: string; + normal?: Function; + pitch?: Function; + raw?: boolean; + data?: object; + pitchExecuted: boolean; + normalExecuted: boolean; + type?: "module" | "commonjs"; + }[]; + + /** + * The resource path. + * In the example: "/abc/resource.js" + */ + resourcePath: string; + + /** + * The resource query string. + * Example: "?query" + */ + resourceQuery: string; + + /** + * The resource fragment. + * Example: "#frag" + */ + resourceFragment: string; + + /** + * The resource inclusive query and fragment. + * Example: "/abc/resource.js?query#frag" + */ + resource: string; + + /** + * Target of compilation. + * Example: "web" + */ + target: string; + + /** + * Tell what kind of ES-features may be used in the generated runtime-code. + * Example: { arrowFunction: true } + */ + environment: Environment; +} +declare class LoaderTargetPlugin { + constructor(target: string); + target: string; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface LogEntry { + type: string; + args?: any[]; + time: number; + trace?: string[]; +} +type LogTypeEnum = + | "error" + | "warn" + | "info" + | "log" + | "debug" + | "profile" + | "trace" + | "group" + | "groupCollapsed" + | "groupEnd" + | "profileEnd" + | "time" + | "clear" + | "status"; +declare const MEASURE_END_OPERATION: unique symbol; +declare const MEASURE_START_OPERATION: unique symbol; +declare interface MainRenderContext { + /** + * the chunk + */ + chunk: Chunk; + + /** + * the dependency templates + */ + dependencyTemplates: DependencyTemplates; + + /** + * the runtime template + */ + runtimeTemplate: RuntimeTemplate; + + /** + * the module graph + */ + moduleGraph: ModuleGraph; + + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; + + /** + * results of code generation + */ + codeGenerationResults: CodeGenerationResults; + + /** + * hash to be used for render call + */ + hash: string; + + /** + * rendering in strict context + */ + strictMode?: boolean; +} +declare abstract class MainTemplate { + hooks: Readonly<{ + renderManifest: { + tap: ( + options: + | string + | (TapOptions & { name: string } & IfSet), + fn: ( + renderManifestEntries: RenderManifestEntry[], + renderManifestOptions: RenderManifestOptions + ) => RenderManifestEntry[] + ) => void; + }; + modules: { tap: () => never }; + moduleObj: { tap: () => never }; + require: { + tap: ( + options: + | string + | (TapOptions & { name: string } & IfSet), + fn: ( + value: string, + renderBootstrapContext: RenderBootstrapContext + ) => string + ) => void; + }; + beforeStartup: { tap: () => never }; + startup: { tap: () => never }; + afterStartup: { tap: () => never }; + render: { + tap: ( + options: + | string + | (TapOptions & { name: string } & IfSet), + fn: ( + source: Source, + chunk: Chunk, + hash: undefined | string, + moduleTemplate: ModuleTemplate, + dependencyTemplates: DependencyTemplates + ) => Source + ) => void; + }; + renderWithEntry: { + tap: ( + options: + | string + | (TapOptions & { name: string } & IfSet), + fn: (source: Source, chunk: Chunk, hash?: string) => Source + ) => void; + }; + assetPath: { + tap: ( + options: + | string + | (TapOptions & { name: string } & IfSet), + fn: (value: string, path: PathData, assetInfo?: AssetInfo) => string + ) => void; + call: (filename: TemplatePath, options: PathData) => string; + }; + hash: { + tap: ( + options: + | string + | (TapOptions & { name: string } & IfSet), + fn: (hash: Hash) => void + ) => void; + }; + hashForChunk: { + tap: ( + options: + | string + | (TapOptions & { name: string } & IfSet), + fn: (hash: Hash, chunk: Chunk) => void + ) => void; + }; + globalHashPaths: { tap: () => void }; + globalHash: { tap: () => void }; + hotBootstrap: { tap: () => never }; + bootstrap: SyncWaterfallHook< + [string, Chunk, string, ModuleTemplate, DependencyTemplates] + >; + localVars: SyncWaterfallHook<[string, Chunk, string]>; + requireExtensions: SyncWaterfallHook<[string, Chunk, string]>; + requireEnsure: SyncWaterfallHook<[string, Chunk, string, string]>; + get jsonpScript(): SyncWaterfallHook<[string, Chunk]>; + get linkPrefetch(): SyncWaterfallHook<[string, Chunk]>; + get linkPreload(): SyncWaterfallHook<[string, Chunk]>; + }>; + renderCurrentHashCode: (hash: string, length?: number) => string; + getPublicPath: (options: PathData) => string; + getAssetPath: (path: TemplatePath, options: PathData) => string; + getAssetPathWithInfo: ( + path: TemplatePath, + options: PathData + ) => InterpolatedPathAndAssetInfo; + get requireFn(): "__webpack_require__"; + get outputOptions(): Output; +} +declare interface MakeDirectoryOptions { + recursive?: boolean; + mode?: string | number; +} +declare interface MapOptions { + columns?: boolean; + module?: boolean; +} +declare interface MatchObject { + test?: string | RegExp | (string | RegExp)[]; + include?: string | RegExp | (string | RegExp)[]; + exclude?: string | RegExp | (string | RegExp)[]; +} +type Matcher = string | RegExp | (string | RegExp)[]; +type Media = undefined | string; + +/** + * Options object for in-memory caching. + */ +declare interface MemoryCacheOptions { + /** + * Additionally cache computation of modules that are unchanged and reference only unchanged modules. + */ + cacheUnaffected?: boolean; + + /** + * Number of generations unused cache entries stay in memory cache at minimum (1 = may be removed after unused for a single compilation, ..., Infinity: kept forever). + */ + maxGenerations?: number; + + /** + * In memory caching. + */ + type: "memory"; +} +declare class MemoryCachePlugin { + constructor(); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare class MergeDuplicateChunksPlugin { + constructor(options?: MergeDuplicateChunksPluginOptions); + options: MergeDuplicateChunksPluginOptions; + apply(compiler: Compiler): void; +} +declare interface MergeDuplicateChunksPluginOptions { + /** + * Specifies the stage for merging duplicate chunks. + */ + stage?: number; +} +declare class MinChunkSizePlugin { + constructor(options: MinChunkSizePluginOptions); + options: MinChunkSizePluginOptions; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface MinChunkSizePluginOptions { + /** + * Constant overhead for a chunk. + */ + chunkOverhead?: number; + + /** + * Multiplicator for initial chunks. + */ + entryChunkMultiplicator?: number; + + /** + * Minimum number of characters. + */ + minChunkSize: number; +} +declare interface Mkdir { + ( + file: PathLikeFs, + options: MakeDirectoryOptions & { recursive: true }, + callback: (err: null | NodeJS.ErrnoException, result?: string) => void + ): void; + ( + file: PathLikeFs, + options: + | undefined + | null + | string + | number + | (MakeDirectoryOptions & { recursive?: false }), + callback: (err: null | NodeJS.ErrnoException) => void + ): void; + ( + file: PathLikeFs, + options: undefined | null | string | number | MakeDirectoryOptions, + callback: (err: null | NodeJS.ErrnoException, result?: string) => void + ): void; + ( + file: PathLikeFs, + callback: (err: null | NodeJS.ErrnoException) => void + ): void; +} +declare interface MkdirSync { + ( + path: PathLikeFs, + options: MakeDirectoryOptions & { recursive: true } + ): undefined | string; + ( + path: PathLikeFs, + options?: + | null + | string + | number + | (MakeDirectoryOptions & { recursive?: false }) + ): void; + ( + path: PathLikeFs, + options?: null | string | number | MakeDirectoryOptions + ): undefined | string; +} +declare class Module extends DependenciesBlock { + constructor(type: string, context?: null | string, layer?: null | string); + type: string; + context: null | string; + layer: null | string; + needId: boolean; + debugId: number; + resolveOptions?: ResolveOptions; + factoryMeta?: FactoryMeta; + useSourceMap: boolean; + useSimpleSourceMap: boolean; + hot: boolean; + buildMeta?: BuildMeta; + buildInfo?: BuildInfo; + presentationalDependencies?: Dependency[]; + codeGenerationDependencies?: Dependency[]; + id: null | string | number; + get hash(): string; + get renderedHash(): string; + profile?: ModuleProfile; + index: null | number; + index2: null | number; + depth: null | number; + issuer?: null | Module; + get usedExports(): null | boolean | SortableSet; + get optimizationBailout(): ( + | string + | ((requestShortener: RequestShortener) => string) + )[]; + get optional(): boolean; + addChunk(chunk: Chunk): boolean; + removeChunk(chunk: Chunk): void; + isInChunk(chunk: Chunk): boolean; + isEntryModule(): boolean; + getChunks(): Chunk[]; + getNumberOfChunks(): number; + get chunksIterable(): Iterable; + isProvided(exportName: string): null | boolean; + get exportsArgument(): string; + get moduleArgument(): string; + getExportsType( + moduleGraph: ModuleGraph, + strict?: boolean + ): "namespace" | "default-only" | "default-with-named" | "dynamic"; + addPresentationalDependency(presentationalDependency: Dependency): void; + addCodeGenerationDependency(codeGenerationDependency: Dependency): void; + addWarning(warning: WebpackError): void; + getWarnings(): undefined | Iterable; + getNumberOfWarnings(): number; + addError(error: WebpackError): void; + getErrors(): undefined | Iterable; + getNumberOfErrors(): number; + + /** + * removes all warnings and errors + */ + clearWarningsAndErrors(): void; + isOptional(moduleGraph: ModuleGraph): boolean; + isAccessibleInChunk( + chunkGraph: ChunkGraph, + chunk: Chunk, + ignoreChunk?: Chunk + ): boolean; + isAccessibleInChunkGroup( + chunkGraph: ChunkGraph, + chunkGroup: ChunkGroup, + ignoreChunk?: Chunk + ): boolean; + hasReasonForChunk( + chunk: Chunk, + moduleGraph: ModuleGraph, + chunkGraph: ChunkGraph + ): boolean; + hasReasons(moduleGraph: ModuleGraph, runtime: RuntimeSpec): boolean; + needBuild( + context: NeedBuildContext, + callback: (err?: null | WebpackError, needBuild?: boolean) => void + ): void; + needRebuild( + fileTimestamps: Map, + contextTimestamps: Map + ): boolean; + invalidateBuild(): void; + identifier(): string; + readableIdentifier(requestShortener: RequestShortener): string; + build( + options: WebpackOptionsNormalized, + compilation: Compilation, + resolver: ResolverWithOptions, + fs: InputFileSystem, + callback: (err?: WebpackError) => void + ): void; + getSourceTypes(): ReadonlySet; + source( + dependencyTemplates: DependencyTemplates, + runtimeTemplate: RuntimeTemplate, + type?: string + ): Source; + size(type?: string): number; + libIdent(options: LibIdentOptions): null | string; + nameForCondition(): null | string; + getConcatenationBailoutReason( + context: ConcatenationBailoutReasonContext + ): undefined | string; + getSideEffectsConnectionState(moduleGraph: ModuleGraph): ConnectionState; + codeGeneration(context: CodeGenerationContext): CodeGenerationResult; + chunkCondition(chunk: Chunk, compilation: Compilation): boolean; + hasChunkCondition(): boolean; + + /** + * Assuming this module is in the cache. Update the (cached) module with + * the fresh module from the factory. Usually updates internal references + * and properties. + */ + updateCacheModule(module: Module): void; + + /** + * Module should be unsafe cached. Get data that's needed for that. + * This data will be passed to restoreFromUnsafeCache later. + */ + getUnsafeCacheData(): UnsafeCacheData; + + /** + * Assuming this module is in the cache. Remove internal references to allow freeing some memory. + */ + cleanupForCache(): void; + originalSource(): null | Source; + addCacheDependencies( + fileDependencies: LazySet, + contextDependencies: LazySet, + missingDependencies: LazySet, + buildDependencies: LazySet + ): void; + get hasEqualsChunks(): any; + get isUsed(): any; + get errors(): any; + get warnings(): any; + used: any; +} +declare class ModuleChunkLoadingRuntimeModule extends RuntimeModule { + constructor(runtimeRequirements: ReadonlySet); + static getCompilationHooks( + compilation: Compilation + ): JsonpCompilationPluginHooks; + + /** + * Runtime modules without any dependencies to other runtime modules + */ + static STAGE_NORMAL: number; + + /** + * Runtime modules with simple dependencies on other runtime modules + */ + static STAGE_BASIC: number; + + /** + * Runtime modules which attach to handlers of other runtime modules + */ + static STAGE_ATTACH: number; + + /** + * Runtime modules which trigger actions on bootstrap + */ + static STAGE_TRIGGER: number; +} +declare class ModuleConcatenationPlugin { + constructor(); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare class ModuleDependency extends Dependency { + constructor(request: string); + request: string; + userRequest: string; + range: any; + assertions?: ImportAttributes; + static Template: typeof DependencyTemplate; + static NO_EXPORTS_REFERENCED: string[][]; + static EXPORTS_OBJECT_REFERENCED: string[][]; + static TRANSITIVE: typeof TRANSITIVE; +} +declare abstract class ModuleFactory { + create( + data: ModuleFactoryCreateData, + callback: (err?: null | Error, result?: ModuleFactoryResult) => void + ): void; +} +declare interface ModuleFactoryCreateData { + contextInfo: ModuleFactoryCreateDataContextInfo; + resolveOptions?: ResolveOptions; + context: string; + dependencies: Dependency[]; +} +declare interface ModuleFactoryCreateDataContextInfo { + issuer: string; + issuerLayer?: null | string; + compiler?: string; +} +declare interface ModuleFactoryResult { + /** + * the created module or unset if no module was created + */ + module?: Module; + fileDependencies?: Set; + contextDependencies?: Set; + missingDependencies?: Set; + + /** + * allow to use the unsafe cache + */ + cacheable?: boolean; +} +declare class ModuleFederationPlugin { + constructor(options: ModuleFederationPluginOptions); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; + + /** + * Get the compilation hooks associated with this plugin. + */ + static getCompilationHooks( + compilation: Compilation + ): CompilationHooksModuleFederationPlugin; +} +declare interface ModuleFederationPluginOptions { + /** + * Modules that should be exposed by this container. When provided, property name is used as public name, otherwise public name is automatically inferred from request. + */ + exposes?: (string | ExposesObject)[] | ExposesObject; + + /** + * The filename of the container as relative path inside the `output.path` directory. + */ + filename?: string; + + /** + * Options for library. + */ + library?: LibraryOptions; + + /** + * The name of the container. + */ + name?: string; + + /** + * The external type of the remote containers. + */ + remoteType?: + | "import" + | "var" + | "module" + | "assign" + | "this" + | "window" + | "self" + | "global" + | "commonjs" + | "commonjs2" + | "commonjs-module" + | "commonjs-static" + | "amd" + | "amd-require" + | "umd" + | "umd2" + | "jsonp" + | "system" + | "promise" + | "module-import" + | "script" + | "node-commonjs"; + + /** + * Container locations and request scopes from which modules should be resolved and loaded at runtime. When provided, property name is used as request scope, otherwise request scope is automatically inferred from container location. + */ + remotes?: (string | RemotesObject)[] | RemotesObject; + + /** + * The name of the runtime chunk. If set a runtime chunk with this name is created or an existing entrypoint is used as runtime. + */ + runtime?: string | false; + + /** + * Share scope name used for all shared modules (defaults to 'default'). + */ + shareScope?: string; + + /** + * Modules that should be shared in the share scope. When provided, property names are used to match requested modules in this compilation. + */ + shared?: (string | SharedObject)[] | SharedObject; +} +type ModuleFilterItemTypes = + | string + | RegExp + | (( + name: string, + module: StatsModule, + type: "module" | "chunk" | "root-of-chunk" | "nested" + ) => boolean); +declare class ModuleGraph { + constructor(); + setParents( + dependency: Dependency, + block: DependenciesBlock, + module: Module, + indexInBlock?: number + ): void; + getParentModule(dependency: Dependency): undefined | Module; + getParentBlock(dependency: Dependency): undefined | DependenciesBlock; + getParentBlockIndex(dependency: Dependency): number; + setResolvedModule( + originModule: null | Module, + dependency: Dependency, + module: Module + ): void; + updateModule(dependency: Dependency, module: Module): void; + removeConnection(dependency: Dependency): void; + addExplanation(dependency: Dependency, explanation: string): void; + cloneModuleAttributes(sourceModule: Module, targetModule: Module): void; + removeModuleAttributes(module: Module): void; + removeAllModuleAttributes(): void; + moveModuleConnections( + oldModule: Module, + newModule: Module, + filterConnection: (moduleGraphConnection: ModuleGraphConnection) => boolean + ): void; + copyOutgoingModuleConnections( + oldModule: Module, + newModule: Module, + filterConnection: (moduleGraphConnection: ModuleGraphConnection) => boolean + ): void; + addExtraReason(module: Module, explanation: string): void; + getResolvedModule(dependency: Dependency): null | Module; + getConnection(dependency: Dependency): undefined | ModuleGraphConnection; + getModule(dependency: Dependency): null | Module; + getOrigin(dependency: Dependency): null | Module; + getResolvedOrigin(dependency: Dependency): null | Module; + getIncomingConnections(module: Module): Iterable; + getOutgoingConnections(module: Module): Iterable; + getIncomingConnectionsByOriginModule( + module: Module + ): Map>; + getOutgoingConnectionsByModule( + module: Module + ): undefined | Map>; + getProfile(module: Module): undefined | ModuleProfile; + setProfile(module: Module, profile?: ModuleProfile): void; + getIssuer(module: Module): undefined | null | Module; + setIssuer(module: Module, issuer: null | Module): void; + setIssuerIfUnset(module: Module, issuer: null | Module): void; + getOptimizationBailout( + module: Module + ): (string | ((requestShortener: RequestShortener) => string))[]; + getProvidedExports(module: Module): null | true | string[]; + isExportProvided( + module: Module, + exportName: string | string[] + ): null | boolean; + getExportsInfo(module: Module): ExportsInfo; + getExportInfo(module: Module, exportName: string): ExportInfo; + getReadOnlyExportInfo(module: Module, exportName: string): ExportInfo; + getUsedExports( + module: Module, + runtime: RuntimeSpec + ): null | boolean | SortableSet; + getPreOrderIndex(module: Module): null | number; + getPostOrderIndex(module: Module): null | number; + setPreOrderIndex(module: Module, index: number): void; + setPreOrderIndexIfUnset(module: Module, index: number): boolean; + setPostOrderIndex(module: Module, index: number): void; + setPostOrderIndexIfUnset(module: Module, index: number): boolean; + getDepth(module: Module): null | number; + setDepth(module: Module, depth: number): void; + setDepthIfLower(module: Module, depth: number): boolean; + isAsync(module: Module): boolean; + setAsync(module: Module): void; + getMeta(thing: object): any; + getMetaIfExisting(thing: object): any; + freeze(cacheStage?: string): void; + unfreeze(): void; + cached( + fn: (moduleGraph: ModuleGraph, ...args: T[]) => R, + ...args: T[] + ): R; + setModuleMemCaches( + moduleMemCaches: Map> + ): void; + dependencyCacheProvide( + dependency: D, + ...args: [ + ARGS, + ...((moduleGraph: ModuleGraph, dependency: D, ...args: ARGS) => R)[] + ] + ): R; + static getModuleGraphForModule( + module: Module, + deprecateMessage: string, + deprecationCode: string + ): ModuleGraph; + static setModuleGraphForModule( + module: Module, + moduleGraph: ModuleGraph + ): void; + static clearModuleGraphForModule(module: Module): void; + static ModuleGraphConnection: typeof ModuleGraphConnection; +} +declare class ModuleGraphConnection { + constructor( + originModule: null | Module, + dependency: null | Dependency, + module: Module, + explanation?: string, + weak?: boolean, + condition?: + | null + | false + | (( + moduleGraphConnection: ModuleGraphConnection, + runtime: RuntimeSpec + ) => ConnectionState) + ); + originModule: null | Module; + resolvedOriginModule: null | Module; + dependency: null | Dependency; + resolvedModule: Module; + module: Module; + weak: boolean; + conditional: boolean; + condition?: ( + moduleGraphConnection: ModuleGraphConnection, + runtime: RuntimeSpec + ) => ConnectionState; + explanations?: Set; + clone(): ModuleGraphConnection; + addCondition( + condition: ( + moduleGraphConnection: ModuleGraphConnection, + runtime: RuntimeSpec + ) => ConnectionState + ): void; + addExplanation(explanation: string): void; + get explanation(): string; + isActive(runtime: RuntimeSpec): boolean; + isTargetActive(runtime: RuntimeSpec): boolean; + getActiveState(runtime: RuntimeSpec): ConnectionState; + setActive(value: boolean): void; + active: void; + static addConnectionStates: ( + a: ConnectionState, + b: ConnectionState + ) => ConnectionState; + static TRANSITIVE_ONLY: typeof TRANSITIVE_ONLY; + static CIRCULAR_CONNECTION: typeof CIRCULAR_CONNECTION; +} +type ModuleId = string | number; +type ModuleInfo = ConcatenatedModuleInfo | ExternalModuleInfo; +declare interface ModuleMemCachesItem { + buildInfo: BuildInfo; + references?: WeakMap; + memCache: WeakTupleMap; +} + +/** + * Options affecting the normal modules (`NormalModuleFactory`). + */ +declare interface ModuleOptions { + /** + * An array of rules applied by default for modules. + */ + defaultRules?: (undefined | null | false | "" | 0 | RuleSetRule | "...")[]; + + /** + * Enable warnings for full dynamic dependencies. + */ + exprContextCritical?: boolean; + + /** + * Enable recursive directory lookup for full dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.exprContextRecursive'. + */ + exprContextRecursive?: boolean; + + /** + * Sets the default regular expression for full dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.exprContextRegExp'. + */ + exprContextRegExp?: boolean | RegExp; + + /** + * Set the default request for full dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.exprContextRequest'. + */ + exprContextRequest?: string; + + /** + * Specify options for each generator. + */ + generator?: GeneratorOptionsByModuleType; + + /** + * Don't parse files matching. It's matched against the full resolved request. + */ + noParse?: + | string + | RegExp + | (string | RegExp | ((content: string) => boolean))[] + | ((content: string) => boolean); + + /** + * Specify options for each parser. + */ + parser?: ParserOptionsByModuleType; + + /** + * An array of rules applied for modules. + */ + rules?: (undefined | null | false | "" | 0 | RuleSetRule | "...")[]; + + /** + * Emit errors instead of warnings when imported names don't exist in imported module. Deprecated: This option has moved to 'module.parser.javascript.strictExportPresence'. + */ + strictExportPresence?: boolean; + + /** + * Handle the this context correctly according to the spec for namespace objects. Deprecated: This option has moved to 'module.parser.javascript.strictThisContextOnImports'. + */ + strictThisContextOnImports?: boolean; + + /** + * Enable warnings when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextCritical'. + */ + unknownContextCritical?: boolean; + + /** + * Enable recursive directory lookup when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextRecursive'. + */ + unknownContextRecursive?: boolean; + + /** + * Sets the regular expression when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextRegExp'. + */ + unknownContextRegExp?: boolean | RegExp; + + /** + * Sets the request when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextRequest'. + */ + unknownContextRequest?: string; + + /** + * Cache the resolving of module requests. + */ + unsafeCache?: boolean | ((module: Module) => boolean); + + /** + * Enable warnings for partial dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.wrappedContextCritical'. + */ + wrappedContextCritical?: boolean; + + /** + * Enable recursive directory lookup for partial dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.wrappedContextRecursive'. + */ + wrappedContextRecursive?: boolean; + + /** + * Set the inner regular expression for partial dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.wrappedContextRegExp'. + */ + wrappedContextRegExp?: RegExp; +} + +/** + * Options affecting the normal modules (`NormalModuleFactory`). + */ +declare interface ModuleOptionsNormalized { + /** + * An array of rules applied by default for modules. + */ + defaultRules: (undefined | null | false | "" | 0 | RuleSetRule | "...")[]; + + /** + * Specify options for each generator. + */ + generator: GeneratorOptionsByModuleType; + + /** + * Don't parse files matching. It's matched against the full resolved request. + */ + noParse?: + | string + | RegExp + | (string | RegExp | ((content: string) => boolean))[] + | ((content: string) => boolean); + + /** + * Specify options for each parser. + */ + parser: ParserOptionsByModuleType; + + /** + * An array of rules applied for modules. + */ + rules: (undefined | null | false | "" | 0 | RuleSetRule | "...")[]; + + /** + * Cache the resolving of module requests. + */ + unsafeCache?: boolean | ((module: Module) => boolean); +} +declare interface ModulePathData { + id: string | number; + hash: string; + hashWithLength?: (length: number) => string; +} +declare abstract class ModuleProfile { + startTime: number; + factoryStartTime: number; + factoryEndTime: number; + factory: number; + factoryParallelismFactor: number; + restoringStartTime: number; + restoringEndTime: number; + restoring: number; + restoringParallelismFactor: number; + integrationStartTime: number; + integrationEndTime: number; + integration: number; + integrationParallelismFactor: number; + buildingStartTime: number; + buildingEndTime: number; + building: number; + buildingParallelismFactor: number; + storingStartTime: number; + storingEndTime: number; + storing: number; + storingParallelismFactor: number; + additionalFactoryTimes?: { start: number; end: number }[]; + additionalFactories: number; + additionalFactoriesParallelismFactor: number; + additionalIntegration: number; + markFactoryStart(): void; + markFactoryEnd(): void; + markRestoringStart(): void; + markRestoringEnd(): void; + markIntegrationStart(): void; + markIntegrationEnd(): void; + markBuildingStart(): void; + markBuildingEnd(): void; + markStoringStart(): void; + markStoringEnd(): void; + + /** + * Merge this profile into another one + */ + mergeInto(realProfile: ModuleProfile): void; +} +declare interface ModuleReferenceOptions { + /** + * the properties/exports of the module + */ + ids: string[]; + + /** + * true, when this referenced export is called + */ + call: boolean; + + /** + * true, when this referenced export is directly imported (not via property access) + */ + directImport: boolean; + + /** + * if the position is ASI safe or unknown + */ + asiSafe?: boolean; +} +declare interface ModuleResult { + client: string; + data: string; + active: boolean; +} +declare interface ModuleSettings { + /** + * Specifies the layer in which the module should be placed in. + */ + layer?: string; + + /** + * Module type to use for the module. + */ + type?: string; + + /** + * Options for the resolver. + */ + resolve?: ResolveOptions; + + /** + * Options for parsing. + */ + parser?: { [index: string]: any }; + + /** + * The options for the module generator. + */ + generator?: { [index: string]: any }; + + /** + * Flags a module as with or without side effects. + */ + sideEffects?: boolean; +} +declare abstract class ModuleTemplate { + type: string; + hooks: Readonly<{ + content: { + tap: ( + options: + | string + | (TapOptions & { name: string } & IfSet), + fn: ( + source: Source, + module: Module, + chunkRenderContext: ChunkRenderContextJavascriptModulesPlugin, + dependencyTemplates: DependencyTemplates + ) => Source + ) => void; + }; + module: { + tap: ( + options: + | string + | (TapOptions & { name: string } & IfSet), + fn: ( + source: Source, + module: Module, + chunkRenderContext: ChunkRenderContextJavascriptModulesPlugin, + dependencyTemplates: DependencyTemplates + ) => Source + ) => void; + }; + render: { + tap: ( + options: + | string + | (TapOptions & { name: string } & IfSet), + fn: ( + source: Source, + module: Module, + chunkRenderContext: ChunkRenderContextJavascriptModulesPlugin, + dependencyTemplates: DependencyTemplates + ) => Source + ) => void; + }; + package: { + tap: ( + options: + | string + | (TapOptions & { name: string } & IfSet), + fn: ( + source: Source, + module: Module, + chunkRenderContext: ChunkRenderContextJavascriptModulesPlugin, + dependencyTemplates: DependencyTemplates + ) => Source + ) => void; + }; + hash: { + tap: ( + options: + | string + | (TapOptions & { name: string } & IfSet), + fn: (hash: Hash) => void + ) => void; + }; + }>; + get runtimeTemplate(): RuntimeTemplate; +} +declare interface ModuleTemplates { + javascript: ModuleTemplate; +} +declare class MultiCompiler { + constructor( + compilers: Compiler[] | Record, + options: MultiCompilerOptions + ); + hooks: Readonly<{ + done: SyncHook<[MultiStats]>; + invalid: MultiHook>; + run: MultiHook>; + watchClose: SyncHook<[]>; + watchRun: MultiHook>; + infrastructureLog: MultiHook< + SyncBailHook<[string, string, undefined | any[]], true | void> + >; + }>; + compilers: Compiler[]; + dependencies: WeakMap; + running: boolean; + get options(): WebpackOptionsNormalized[] & MultiCompilerOptions; + get outputPath(): string; + inputFileSystem: InputFileSystem; + outputFileSystem: OutputFileSystem; + watchFileSystem: WatchFileSystem; + intermediateFileSystem: IntermediateFileSystem; + getInfrastructureLogger(name: string | (() => string)): WebpackLogger; + setDependencies(compiler: Compiler, dependencies: string[]): void; + validateDependencies(callback: CallbackFunction_1): boolean; + runWithDependencies( + compilers: Compiler[], + fn: (compiler: Compiler, callback: CallbackFunction_1) => any, + callback: CallbackFunction_1 + ): void; + watch( + watchOptions: WatchOptions | WatchOptions[], + handler: CallbackFunction_1 + ): MultiWatching; + run(callback: CallbackFunction_1): void; + purgeInputFileSystem(): void; + close(callback: CallbackFunction_1): void; +} +declare interface MultiCompilerOptions { + /** + * how many Compilers are allows to run at the same time in parallel + */ + parallelism?: number; +} +declare abstract class MultiStats { + stats: Stats[]; + get hash(): string; + hasErrors(): boolean; + hasWarnings(): boolean; + toJson(options?: string | boolean | StatsOptions): StatsCompilation; + toString(options?: string | boolean | StatsOptions): string; +} +declare abstract class MultiWatching { + watchings: Watching[]; + compiler: MultiCompiler; + invalidate(callback?: CallbackFunction_2): void; + suspend(): void; + resume(): void; + close(callback: CallbackFunction_2): void; +} +declare class NamedChunkIdsPlugin { + constructor(options?: NamedChunkIdsPluginOptions); + delimiter: string; + context?: string; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface NamedChunkIdsPluginOptions { + /** + * context + */ + context?: string; + + /** + * delimiter + */ + delimiter?: string; +} +declare class NamedModuleIdsPlugin { + constructor(options?: NamedModuleIdsPluginOptions); + options: NamedModuleIdsPluginOptions; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface NamedModuleIdsPluginOptions { + /** + * context + */ + context?: string; +} +declare class NaturalModuleIdsPlugin { + constructor(); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface NeedBuildContext { + compilation: Compilation; + fileSystemInfo: FileSystemInfo; + valueCacheVersions: Map>; +} +declare interface NewContentCreateContextMap { + [index: string]: string; +} +declare class NoEmitOnErrorsPlugin { + constructor(); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +type NoParse = + | string + | RegExp + | (string | RegExp | ((content: string) => boolean))[] + | ((content: string) => boolean); +type Node = false | NodeOptions; +declare class NodeEnvironmentPlugin { + constructor(options: NodeEnvironmentPluginOptions); + options: NodeEnvironmentPluginOptions; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface NodeEnvironmentPluginOptions { + /** + * infrastructure logging options + */ + infrastructureLogging: InfrastructureLogging; +} + +/** + * Options object for node compatibility features. + */ +declare interface NodeOptions { + /** + * Include a polyfill for the '__dirname' variable. + */ + __dirname?: boolean | "warn-mock" | "mock" | "node-module" | "eval-only"; + + /** + * Include a polyfill for the '__filename' variable. + */ + __filename?: boolean | "warn-mock" | "mock" | "node-module" | "eval-only"; + + /** + * Include a polyfill for the 'global' variable. + */ + global?: boolean | "warn"; +} +declare class NodeSourcePlugin { + constructor(); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare class NodeTargetPlugin { + constructor(); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare class NodeTemplatePlugin { + constructor(options?: NodeTemplatePluginOptions); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface NodeTemplatePluginOptions { + /** + * enable async chunk loading + */ + asyncChunkLoading?: boolean; +} +declare class NormalModule extends Module { + constructor(__0: NormalModuleCreateData); + request: string; + userRequest: string; + rawRequest: string; + binary: boolean; + parser?: Parser; + parserOptions?: ParserOptions; + generator?: Generator; + generatorOptions?: GeneratorOptions; + resource: string; + resourceResolveData?: ResourceSchemeData & Partial; + matchResource?: string; + loaders: LoaderItem[]; + error: null | WebpackError; + + /** + * restore unsafe cache data + */ + restoreFromUnsafeCache( + unsafeCacheData: UnsafeCacheData, + normalModuleFactory: NormalModuleFactory + ): void; + createSourceForAsset( + context: string, + name: string, + content: string | Buffer, + sourceMap?: string | SourceMap, + associatedObjectForCache?: object + ): Source; + getCurrentLoader( + loaderContext: LoaderContextNormalModule, + index?: number + ): null | LoaderItem; + createSource( + context: string, + content: string | Buffer, + sourceMap?: null | string | SourceMapSource, + associatedObjectForCache?: object + ): Source; + markModuleAsErrored(error: WebpackError): void; + applyNoParseRule(rule: Exclude, content: string): boolean; + shouldPreventParsing( + noParseRule: + | undefined + | string + | RegExp + | (string | RegExp | ((content: string) => boolean))[] + | ((content: string) => boolean), + request: string + ): boolean; + static getCompilationHooks( + compilation: Compilation + ): NormalModuleCompilationHooks; + static deserialize(context: ObjectDeserializerContext): NormalModule; +} +declare interface NormalModuleCompilationHooks { + loader: SyncHook<[LoaderContextNormalModule, NormalModule]>; + beforeLoaders: SyncHook< + [LoaderItem[], NormalModule, LoaderContextNormalModule] + >; + beforeParse: SyncHook<[NormalModule]>; + beforeSnapshot: SyncHook<[NormalModule]>; + readResourceForScheme: HookMap< + FakeHook< + AsyncSeriesBailHook<[string, NormalModule], null | string | Buffer> + > + >; + readResource: HookMap< + AsyncSeriesBailHook< + [LoaderContextNormalModule], + null | string | Buffer + > + >; + processResult: SyncWaterfallHook< + [[string | Buffer, string | SourceMapSource, PreparsedAst], NormalModule] + >; + needBuild: AsyncSeriesBailHook<[NormalModule, NeedBuildContext], boolean>; +} +declare interface NormalModuleCreateData { + /** + * an optional layer in which the module is + */ + layer?: string; + + /** + * module type. When deserializing, this is set to an empty string "". + */ + type: "" | "javascript/auto" | "javascript/dynamic" | "javascript/esm"; + + /** + * request string + */ + request: string; + + /** + * request intended by user (without loaders from config) + */ + userRequest: string; + + /** + * request without resolving + */ + rawRequest: string; + + /** + * list of loaders + */ + loaders: LoaderItem[]; + + /** + * path + query of the real resource + */ + resource: string; + + /** + * resource resolve data + */ + resourceResolveData?: ResourceSchemeData & Partial; + + /** + * context directory for resolving + */ + context: string; + + /** + * path + query of the matched resource (virtual) + */ + matchResource?: string; + + /** + * the parser used + */ + parser: Parser; + + /** + * the options of the parser used + */ + parserOptions?: ParserOptions; + + /** + * the generator used + */ + generator: Generator; + + /** + * the options of the generator used + */ + generatorOptions?: GeneratorOptions; + + /** + * options used for resolving requests from this module + */ + resolveOptions?: ResolveOptions; +} +declare abstract class NormalModuleFactory extends ModuleFactory { + hooks: Readonly<{ + resolve: AsyncSeriesBailHook<[ResolveData], false | void | Module>; + resolveForScheme: HookMap< + AsyncSeriesBailHook<[ResourceDataWithData, ResolveData], true | void> + >; + resolveInScheme: HookMap< + AsyncSeriesBailHook<[ResourceDataWithData, ResolveData], true | void> + >; + factorize: AsyncSeriesBailHook<[ResolveData], undefined | Module>; + beforeResolve: AsyncSeriesBailHook<[ResolveData], false | void>; + afterResolve: AsyncSeriesBailHook<[ResolveData], false | void>; + createModule: AsyncSeriesBailHook< + [ + Partial, + ResolveData + ], + void | Module + >; + module: SyncWaterfallHook< + [ + Module, + Partial, + ResolveData + ] + >; + createParser: HookMap>; + parser: HookMap>; + createGenerator: HookMap< + SyncBailHook<[GeneratorOptions], void | Generator> + >; + generator: HookMap>; + createModuleClass: HookMap>; + }>; + resolverFactory: ResolverFactory; + ruleSet: RuleSet; + context: string; + fs: InputFileSystem; + parserCache: Map>; + generatorCache: Map>; + cleanupForCache(): void; + resolveResource( + contextInfo: ModuleFactoryCreateDataContextInfo, + context: string, + unresolvedResource: string, + resolver: ResolverWithOptions, + resolveContext: ResolveContext, + callback: ( + err: null | Error, + res?: string | false, + req?: ResolveRequest + ) => void + ): void; + resolveRequestArray( + contextInfo: ModuleFactoryCreateDataContextInfo, + context: string, + array: LoaderItem[], + resolver: ResolverWithOptions, + resolveContext: ResolveContext, + callback: CallbackNormalModuleFactory + ): void; + getParser(type: string, parserOptions?: ParserOptions): Parser; + createParser(type: string, parserOptions?: ParserOptions): Parser; + getGenerator(type: string, generatorOptions?: GeneratorOptions): Generator; + createGenerator(type: string, generatorOptions?: GeneratorOptions): Generator; + getResolver( + type: string, + resolveOptions?: ResolveOptionsWithDependencyType + ): ResolverWithOptions; +} + +/** + * These properties are added by the NormalModule + */ +declare interface NormalModuleLoaderContext { + version: number; + getOptions(): OptionsType; + getOptions(schema: Parameters[0]): OptionsType; + emitWarning(warning: Error): void; + emitError(error: Error): void; + getLogger(name?: string): WebpackLogger; + resolve( + context: string, + request: string, + callback: ( + err: null | ErrorWithDetail, + res?: string | false, + req?: ResolveRequest + ) => void + ): any; + getResolve(options?: ResolveOptionsWithDependencyType): { + ( + context: string, + request: string, + callback: ( + err: null | ErrorWithDetail, + res?: string | false, + req?: ResolveRequest + ) => void + ): void; + (context: string, request: string): Promise; + }; + emitFile( + name: string, + content: string | Buffer, + sourceMap?: string, + assetInfo?: AssetInfo + ): void; + addBuildDependency(dep: string): void; + utils: { + absolutify: (context: string, request: string) => string; + contextify: (context: string, request: string) => string; + createHash: (algorithm?: string | typeof Hash) => Hash; + }; + rootContext: string; + fs: InputFileSystem; + sourceMap?: boolean; + mode: "none" | "development" | "production"; + webpack?: boolean; + hashFunction: HashFunction; + hashDigest: string; + hashDigestLength: number; + hashSalt: string; + _module?: NormalModule; + _compilation?: Compilation; + _compiler?: Compiler; +} +declare class NormalModuleReplacementPlugin { + /** + * Create an instance of the plugin + */ + constructor( + resourceRegExp: RegExp, + newResource: string | ((resolveData: ResolveData) => void) + ); + resourceRegExp: RegExp; + newResource: string | ((resolveData: ResolveData) => void); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +type NormalizedStatsOptions = KnownNormalizedStatsOptions & + Omit< + StatsOptions, + | "context" + | "chunkGroups" + | "requestShortener" + | "chunksSort" + | "modulesSort" + | "chunkModulesSort" + | "nestedModulesSort" + | "assetsSort" + | "ids" + | "cachedAssets" + | "groupAssetsByEmitStatus" + | "groupAssetsByPath" + | "groupAssetsByExtension" + | "assetsSpace" + | "excludeAssets" + | "excludeModules" + | "warningsFilter" + | "cachedModules" + | "orphanModules" + | "dependentModules" + | "runtimeModules" + | "groupModulesByCacheStatus" + | "groupModulesByLayer" + | "groupModulesByAttributes" + | "groupModulesByPath" + | "groupModulesByExtension" + | "groupModulesByType" + | "entrypoints" + | "chunkGroupAuxiliary" + | "chunkGroupChildren" + | "chunkGroupMaxAssets" + | "modulesSpace" + | "chunkModulesSpace" + | "nestedModulesSpace" + | "logging" + | "loggingDebug" + | "loggingTrace" + | "_env" + > & + Record; +declare class NullDependency extends Dependency { + constructor(); + static Template: typeof NullDependencyTemplate; + static NO_EXPORTS_REFERENCED: string[][]; + static EXPORTS_OBJECT_REFERENCED: string[][]; + static TRANSITIVE: typeof TRANSITIVE; +} +declare class NullDependencyTemplate extends DependencyTemplate { + constructor(); +} +declare interface ObjectDeserializerContext { + read: () => any; + setCircularReference: (value: ReferenceableItem) => void; +} +declare interface ObjectEncodingOptions { + encoding?: + | null + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "base64" + | "base64url" + | "latin1" + | "binary" + | "hex"; +} +declare interface ObjectForExtract { + [index: string]: any; +} +declare interface ObjectSerializer { + serialize: (value: any, context: ObjectSerializerContext) => void; + deserialize: (context: ObjectDeserializerContext) => any; +} +declare interface ObjectSerializerContext { + write: (value?: any) => void; + setCircularReference: (value: ReferenceableItem) => void; + snapshot: () => ObjectSerializerSnapshot; + rollback: (snapshot: ObjectSerializerSnapshot) => void; + writeLazy?: (item?: any) => void; + writeSeparate?: ( + item: any, + obj?: LazyOptions + ) => LazyFunction; +} +declare interface ObjectSerializerSnapshot { + length: number; + cycleStackSize: number; + referenceableSize: number; + currentPos: number; + objectTypeLookupSize: number; + currentPosTypeLookup: number; +} +declare class OccurrenceChunkIdsPlugin { + constructor(options?: OccurrenceChunkIdsPluginOptions); + options: OccurrenceChunkIdsPluginOptions; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface OccurrenceChunkIdsPluginOptions { + /** + * Prioritise initial size over total size. + */ + prioritiseInitial?: boolean; +} +declare class OccurrenceModuleIdsPlugin { + constructor(options?: OccurrenceModuleIdsPluginOptions); + options: OccurrenceModuleIdsPluginOptions; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface OccurrenceModuleIdsPluginOptions { + /** + * Prioritise initial size over total size. + */ + prioritiseInitial?: boolean; +} +declare interface Open { + ( + file: PathLikeFs, + flags: undefined | string | number, + mode: undefined | null | string | number, + callback: (err: null | NodeJS.ErrnoException, result?: number) => void + ): void; + ( + file: PathLikeFs, + flags: undefined | string | number, + callback: (err: null | NodeJS.ErrnoException, result?: number) => void + ): void; + ( + file: PathLikeFs, + callback: (err: null | NodeJS.ErrnoException, result?: number) => void + ): void; +} + +/** + * Enables/Disables integrated optimizations. + */ +declare interface Optimization { + /** + * Avoid wrapping the entry module in an IIFE. + */ + avoidEntryIife?: boolean; + + /** + * Check for incompatible wasm types when importing/exporting from/to ESM. + */ + checkWasmTypes?: boolean; + + /** + * Define the algorithm to choose chunk ids (named: readable ids for better debugging, deterministic: numeric hash ids for better long term caching, size: numeric ids focused on minimal initial download size, total-size: numeric ids focused on minimal total download size, false: no algorithm used, as custom one can be provided via plugin). + */ + chunkIds?: + | false + | "natural" + | "named" + | "deterministic" + | "size" + | "total-size"; + + /** + * Concatenate modules when possible to generate less modules, more efficient code and enable more optimizations by the minimizer. + */ + concatenateModules?: boolean; + + /** + * Emit assets even when errors occur. Critical errors are emitted into the generated code and will cause errors at runtime. + */ + emitOnErrors?: boolean; + + /** + * Also flag chunks as loaded which contain a subset of the modules. + */ + flagIncludedChunks?: boolean; + + /** + * Creates a module-internal dependency graph for top level symbols, exports and imports, to improve unused exports detection. + */ + innerGraph?: boolean; + + /** + * Rename exports when possible to generate shorter code (depends on optimization.usedExports and optimization.providedExports, true/"deterministic": generate short deterministic names optimized for caching, "size": generate the shortest possible names). + */ + mangleExports?: boolean | "deterministic" | "size"; + + /** + * Reduce size of WASM by changing imports to shorter strings. + */ + mangleWasmImports?: boolean; + + /** + * Merge chunks which contain the same modules. + */ + mergeDuplicateChunks?: boolean; + + /** + * Enable minimizing the output. Uses optimization.minimizer. + */ + minimize?: boolean; + + /** + * Minimizer(s) to use for minimizing the output. + */ + minimizer?: ( + | undefined + | null + | false + | "" + | 0 + | ((this: Compiler, compiler: Compiler) => void) + | WebpackPluginInstance + | "..." + )[]; + + /** + * Define the algorithm to choose module ids (natural: numeric ids in order of usage, named: readable ids for better debugging, hashed: (deprecated) short hashes as ids for better long term caching, deterministic: numeric hash ids for better long term caching, size: numeric ids focused on minimal initial download size, false: no algorithm used, as custom one can be provided via plugin). + */ + moduleIds?: false | "natural" | "named" | "deterministic" | "size" | "hashed"; + + /** + * Avoid emitting assets when errors occur (deprecated: use 'emitOnErrors' instead). + */ + noEmitOnErrors?: boolean; + + /** + * Set process.env.NODE_ENV to a specific value. + */ + nodeEnv?: string | false; + + /** + * Generate records with relative paths to be able to move the context folder. + */ + portableRecords?: boolean; + + /** + * Figure out which exports are provided by modules to generate more efficient code. + */ + providedExports?: boolean; + + /** + * Use real [contenthash] based on final content of the assets. + */ + realContentHash?: boolean; + + /** + * Removes modules from chunks when these modules are already included in all parents. + */ + removeAvailableModules?: boolean; + + /** + * Remove chunks which are empty. + */ + removeEmptyChunks?: boolean; + + /** + * Create an additional chunk which contains only the webpack runtime and chunk hash maps. + */ + runtimeChunk?: + | boolean + | "single" + | "multiple" + | { + /** + * The name or name factory for the runtime chunks. + */ + name?: string | ((entrypoint: { name: string }) => string); + }; + + /** + * Skip over modules which contain no side effects when exports are not used (false: disabled, 'flag': only use manually placed side effects flag, true: also analyse source code for side effects). + */ + sideEffects?: boolean | "flag"; + + /** + * Optimize duplication and caching by splitting chunks by shared modules and cache group. + */ + splitChunks?: false | OptimizationSplitChunksOptions; + + /** + * Figure out which exports are used by modules to mangle export names, omit unused exports and generate more efficient code (true: analyse used exports for each runtime, "global": analyse exports globally for all runtimes combined). + */ + usedExports?: boolean | "global"; +} + +/** + * Enables/Disables integrated optimizations. + */ +declare interface OptimizationNormalized { + /** + * Avoid wrapping the entry module in an IIFE. + */ + avoidEntryIife?: boolean; + + /** + * Check for incompatible wasm types when importing/exporting from/to ESM. + */ + checkWasmTypes?: boolean; + + /** + * Define the algorithm to choose chunk ids (named: readable ids for better debugging, deterministic: numeric hash ids for better long term caching, size: numeric ids focused on minimal initial download size, total-size: numeric ids focused on minimal total download size, false: no algorithm used, as custom one can be provided via plugin). + */ + chunkIds?: + | false + | "natural" + | "named" + | "deterministic" + | "size" + | "total-size"; + + /** + * Concatenate modules when possible to generate less modules, more efficient code and enable more optimizations by the minimizer. + */ + concatenateModules?: boolean; + + /** + * Emit assets even when errors occur. Critical errors are emitted into the generated code and will cause errors at runtime. + */ + emitOnErrors?: boolean; + + /** + * Also flag chunks as loaded which contain a subset of the modules. + */ + flagIncludedChunks?: boolean; + + /** + * Creates a module-internal dependency graph for top level symbols, exports and imports, to improve unused exports detection. + */ + innerGraph?: boolean; + + /** + * Rename exports when possible to generate shorter code (depends on optimization.usedExports and optimization.providedExports, true/"deterministic": generate short deterministic names optimized for caching, "size": generate the shortest possible names). + */ + mangleExports?: boolean | "deterministic" | "size"; + + /** + * Reduce size of WASM by changing imports to shorter strings. + */ + mangleWasmImports?: boolean; + + /** + * Merge chunks which contain the same modules. + */ + mergeDuplicateChunks?: boolean; + + /** + * Enable minimizing the output. Uses optimization.minimizer. + */ + minimize?: boolean; + + /** + * Minimizer(s) to use for minimizing the output. + */ + minimizer?: ( + | undefined + | null + | false + | "" + | 0 + | ((this: Compiler, compiler: Compiler) => void) + | WebpackPluginInstance + | "..." + )[]; + + /** + * Define the algorithm to choose module ids (natural: numeric ids in order of usage, named: readable ids for better debugging, hashed: (deprecated) short hashes as ids for better long term caching, deterministic: numeric hash ids for better long term caching, size: numeric ids focused on minimal initial download size, false: no algorithm used, as custom one can be provided via plugin). + */ + moduleIds?: false | "natural" | "named" | "deterministic" | "size" | "hashed"; + + /** + * Avoid emitting assets when errors occur (deprecated: use 'emitOnErrors' instead). + */ + noEmitOnErrors?: boolean; + + /** + * Set process.env.NODE_ENV to a specific value. + */ + nodeEnv?: string | false; + + /** + * Generate records with relative paths to be able to move the context folder. + */ + portableRecords?: boolean; + + /** + * Figure out which exports are provided by modules to generate more efficient code. + */ + providedExports?: boolean; + + /** + * Use real [contenthash] based on final content of the assets. + */ + realContentHash?: boolean; + + /** + * Removes modules from chunks when these modules are already included in all parents. + */ + removeAvailableModules?: boolean; + + /** + * Remove chunks which are empty. + */ + removeEmptyChunks?: boolean; + + /** + * Create an additional chunk which contains only the webpack runtime and chunk hash maps. + */ + runtimeChunk?: + | false + | { + /** + * The name factory for the runtime chunks. + */ + name?: (entrypoint: { name: string }) => string; + }; + + /** + * Skip over modules which contain no side effects when exports are not used (false: disabled, 'flag': only use manually placed side effects flag, true: also analyse source code for side effects). + */ + sideEffects?: boolean | "flag"; + + /** + * Optimize duplication and caching by splitting chunks by shared modules and cache group. + */ + splitChunks?: false | OptimizationSplitChunksOptions; + + /** + * Figure out which exports are used by modules to mangle export names, omit unused exports and generate more efficient code (true: analyse used exports for each runtime, "global": analyse exports globally for all runtimes combined). + */ + usedExports?: boolean | "global"; +} + +/** + * Options object for describing behavior of a cache group selecting modules that should be cached together. + */ +declare interface OptimizationSplitChunksCacheGroup { + /** + * Sets the name delimiter for created chunks. + */ + automaticNameDelimiter?: string; + + /** + * Select chunks for determining cache group content (defaults to "initial", "initial" and "all" requires adding these chunks to the HTML). + */ + chunks?: RegExp | "all" | "initial" | "async" | ((chunk: Chunk) => boolean); + + /** + * Ignore minimum size, minimum chunks and maximum requests and always create chunks for this cache group. + */ + enforce?: boolean; + + /** + * Size threshold at which splitting is enforced and other restrictions (minRemainingSize, maxAsyncRequests, maxInitialRequests) are ignored. + */ + enforceSizeThreshold?: number | { [index: string]: number }; + + /** + * Sets the template for the filename for created chunks. + */ + filename?: string | ((pathData: PathData, assetInfo?: AssetInfo) => string); + + /** + * Sets the hint for chunk id. + */ + idHint?: string; + + /** + * Assign modules to a cache group by module layer. + */ + layer?: string | RegExp | ((layer: null | string) => boolean); + + /** + * Maximum number of requests which are accepted for on-demand loading. + */ + maxAsyncRequests?: number; + + /** + * Maximal size hint for the on-demand chunks. + */ + maxAsyncSize?: number | { [index: string]: number }; + + /** + * Maximum number of initial chunks which are accepted for an entry point. + */ + maxInitialRequests?: number; + + /** + * Maximal size hint for the initial chunks. + */ + maxInitialSize?: number | { [index: string]: number }; + + /** + * Maximal size hint for the created chunks. + */ + maxSize?: number | { [index: string]: number }; + + /** + * Minimum number of times a module has to be duplicated until it's considered for splitting. + */ + minChunks?: number; + + /** + * Minimal size for the chunks the stay after moving the modules to a new chunk. + */ + minRemainingSize?: number | { [index: string]: number }; + + /** + * Minimal size for the created chunk. + */ + minSize?: number | { [index: string]: number }; + + /** + * Minimum size reduction due to the created chunk. + */ + minSizeReduction?: number | { [index: string]: number }; + + /** + * Give chunks for this cache group a name (chunks with equal name are merged). + */ + name?: + | string + | false + | ((module: Module, chunks: Chunk[], key: string) => undefined | string); + + /** + * Priority of this cache group. + */ + priority?: number; + + /** + * Try to reuse existing chunk (with name) when it has matching modules. + */ + reuseExistingChunk?: boolean; + + /** + * Assign modules to a cache group by module name. + */ + test?: + | string + | RegExp + | ((module: Module, context: CacheGroupsContext) => boolean); + + /** + * Assign modules to a cache group by module type. + */ + type?: string | RegExp | ((type: string) => boolean); + + /** + * Compare used exports when checking common modules. Modules will only be put in the same chunk when exports are equal. + */ + usedExports?: boolean; +} + +/** + * Options object for splitting chunks into smaller chunks. + */ +declare interface OptimizationSplitChunksOptions { + /** + * Sets the name delimiter for created chunks. + */ + automaticNameDelimiter?: string; + + /** + * Assign modules to a cache group (modules from different cache groups are tried to keep in separate chunks, default categories: 'default', 'defaultVendors'). + */ + cacheGroups?: { + [index: string]: + | string + | false + | RegExp + | (( + module: Module + ) => + | void + | OptimizationSplitChunksCacheGroup + | OptimizationSplitChunksCacheGroup[]) + | OptimizationSplitChunksCacheGroup; + }; + + /** + * Select chunks for determining shared modules (defaults to "async", "initial" and "all" requires adding these chunks to the HTML). + */ + chunks?: RegExp | "all" | "initial" | "async" | ((chunk: Chunk) => boolean); + + /** + * Sets the size types which are used when a number is used for sizes. + */ + defaultSizeTypes?: string[]; + + /** + * Size threshold at which splitting is enforced and other restrictions (minRemainingSize, maxAsyncRequests, maxInitialRequests) are ignored. + */ + enforceSizeThreshold?: number | { [index: string]: number }; + + /** + * Options for modules not selected by any other cache group. + */ + fallbackCacheGroup?: { + /** + * Sets the name delimiter for created chunks. + */ + automaticNameDelimiter?: string; + /** + * Select chunks for determining shared modules (defaults to "async", "initial" and "all" requires adding these chunks to the HTML). + */ + chunks?: RegExp | "all" | "initial" | "async" | ((chunk: Chunk) => boolean); + /** + * Maximal size hint for the on-demand chunks. + */ + maxAsyncSize?: number | { [index: string]: number }; + /** + * Maximal size hint for the initial chunks. + */ + maxInitialSize?: number | { [index: string]: number }; + /** + * Maximal size hint for the created chunks. + */ + maxSize?: number | { [index: string]: number }; + /** + * Minimal size for the created chunk. + */ + minSize?: number | { [index: string]: number }; + /** + * Minimum size reduction due to the created chunk. + */ + minSizeReduction?: number | { [index: string]: number }; + }; + + /** + * Sets the template for the filename for created chunks. + */ + filename?: string | ((pathData: PathData, assetInfo?: AssetInfo) => string); + + /** + * Prevents exposing path info when creating names for parts splitted by maxSize. + */ + hidePathInfo?: boolean; + + /** + * Maximum number of requests which are accepted for on-demand loading. + */ + maxAsyncRequests?: number; + + /** + * Maximal size hint for the on-demand chunks. + */ + maxAsyncSize?: number | { [index: string]: number }; + + /** + * Maximum number of initial chunks which are accepted for an entry point. + */ + maxInitialRequests?: number; + + /** + * Maximal size hint for the initial chunks. + */ + maxInitialSize?: number | { [index: string]: number }; + + /** + * Maximal size hint for the created chunks. + */ + maxSize?: number | { [index: string]: number }; + + /** + * Minimum number of times a module has to be duplicated until it's considered for splitting. + */ + minChunks?: number; + + /** + * Minimal size for the chunks the stay after moving the modules to a new chunk. + */ + minRemainingSize?: number | { [index: string]: number }; + + /** + * Minimal size for the created chunks. + */ + minSize?: number | { [index: string]: number }; + + /** + * Minimum size reduction due to the created chunk. + */ + minSizeReduction?: number | { [index: string]: number }; + + /** + * Give chunks created a name (chunks with equal name are merged). + */ + name?: + | string + | false + | ((module: Module, chunks: Chunk[], key: string) => undefined | string); + + /** + * Compare used exports when checking common modules. Modules will only be put in the same chunk when exports are equal. + */ + usedExports?: boolean; +} +declare interface Options { + /** + * source + */ + source: string; + + /** + * absolute context path to which lib ident is relative to + */ + context: string; + + /** + * content + */ + content: DllReferencePluginOptionsContent; + + /** + * type + */ + type?: "object" | "require"; + + /** + * extensions + */ + extensions?: string[]; + + /** + * scope + */ + scope?: string; + + /** + * object for caching + */ + associatedObjectForCache?: object; +} +declare abstract class OptionsApply { + process( + options: WebpackOptionsNormalized, + compiler: Compiler + ): WebpackOptionsNormalized; +} +declare interface OriginRecord { + module: null | Module; + loc: DependencyLocation; + request: string; +} +declare class OriginalSource extends Source { + constructor(source: string | Buffer, name: string); + getName(): string; +} + +/** + * Options affecting the output of the compilation. `output` options tell webpack how to write the compiled files to disk. + */ +declare interface Output { + /** + * Add a container for define/require functions in the AMD module. + */ + amdContainer?: string; + + /** + * The filename of asset modules as relative path inside the 'output.path' directory. + */ + assetModuleFilename?: + | string + | ((pathData: PathData, assetInfo?: AssetInfo) => string); + + /** + * Enable/disable creating async chunks that are loaded on demand. + */ + asyncChunks?: boolean; + + /** + * Add a comment in the UMD wrapper. + */ + auxiliaryComment?: string | LibraryCustomUmdCommentObject; + + /** + * Add charset attribute for script tag. + */ + charset?: boolean; + + /** + * Specifies the filename template of output files of non-initial chunks on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk. + */ + chunkFilename?: + | string + | ((pathData: PathData, assetInfo?: AssetInfo) => string); + + /** + * The format of chunks (formats included by default are 'array-push' (web/WebWorker), 'commonjs' (node.js), 'module' (ESM), but others might be added by plugins). + */ + chunkFormat?: string | false; + + /** + * Number of milliseconds before chunk request expires. + */ + chunkLoadTimeout?: number; + + /** + * The method of loading chunks (methods included by default are 'jsonp' (web), 'import' (ESM), 'importScripts' (WebWorker), 'require' (sync node.js), 'async-node' (async node.js), but others might be added by plugins). + */ + chunkLoading?: string | false; + + /** + * The global variable used by webpack for loading of chunks. + */ + chunkLoadingGlobal?: string; + + /** + * Clean the output directory before emit. + */ + clean?: boolean | CleanOptions; + + /** + * Check if to be emitted file already exists and have the same content before writing to output filesystem. + */ + compareBeforeEmit?: boolean; + + /** + * This option enables cross-origin loading of chunks. + */ + crossOriginLoading?: false | "anonymous" | "use-credentials"; + + /** + * Specifies the filename template of non-initial output css files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk. + */ + cssChunkFilename?: + | string + | ((pathData: PathData, assetInfo?: AssetInfo) => string); + + /** + * Specifies the filename template of output css files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk. + */ + cssFilename?: + | string + | ((pathData: PathData, assetInfo?: AssetInfo) => string); + + /** + * Similar to `output.devtoolModuleFilenameTemplate`, but used in the case of duplicate module identifiers. + */ + devtoolFallbackModuleFilenameTemplate?: string | ((context?: any) => string); + + /** + * Filename template string of function for the sources array in a generated SourceMap. + */ + devtoolModuleFilenameTemplate?: string | ((context?: any) => string); + + /** + * Module namespace to use when interpolating filename template string for the sources array in a generated SourceMap. Defaults to `output.library` if not set. It's useful for avoiding runtime collisions in sourcemaps from multiple webpack projects built as libraries. + */ + devtoolNamespace?: string; + + /** + * List of chunk loading types enabled for use by entry points. + */ + enabledChunkLoadingTypes?: string[]; + + /** + * List of library types enabled for use by entry points. + */ + enabledLibraryTypes?: string[]; + + /** + * List of wasm loading types enabled for use by entry points. + */ + enabledWasmLoadingTypes?: string[]; + + /** + * The abilities of the environment where the webpack generated code should run. + */ + environment?: Environment; + + /** + * Specifies the filename of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk. + */ + filename?: string | ((pathData: PathData, assetInfo?: AssetInfo) => string); + + /** + * An expression which is used to address the global object/scope in runtime code. + */ + globalObject?: string; + + /** + * Digest type used for the hash. + */ + hashDigest?: string; + + /** + * Number of chars which are used for the hash. + */ + hashDigestLength?: number; + + /** + * Algorithm used for generation the hash (see node.js crypto package). + */ + hashFunction?: string | typeof Hash; + + /** + * Any string which is added to the hash to salt it. + */ + hashSalt?: string; + + /** + * The filename of the Hot Update Chunks. They are inside the output.path directory. + */ + hotUpdateChunkFilename?: string; + + /** + * The global variable used by webpack for loading of hot update chunks. + */ + hotUpdateGlobal?: string; + + /** + * The filename of the Hot Update Main File. It is inside the 'output.path' directory. + */ + hotUpdateMainFilename?: string; + + /** + * Ignore warnings in the browser. + */ + ignoreBrowserWarnings?: boolean; + + /** + * Wrap javascript code into IIFE's to avoid leaking into global scope. + */ + iife?: boolean; + + /** + * The name of the native import() function (can be exchanged for a polyfill). + */ + importFunctionName?: string; + + /** + * The name of the native import.meta object (can be exchanged for a polyfill). + */ + importMetaName?: string; + + /** + * Make the output files a library, exporting the exports of the entry point. + */ + library?: string | string[] | LibraryOptions | LibraryCustomUmdObject; + + /** + * Specify which export should be exposed as library. + */ + libraryExport?: string | string[]; + + /** + * Type of library (types included by default are 'var', 'module', 'assign', 'assign-properties', 'this', 'window', 'self', 'global', 'commonjs', 'commonjs2', 'commonjs-module', 'commonjs-static', 'amd', 'amd-require', 'umd', 'umd2', 'jsonp', 'system', but others might be added by plugins). + */ + libraryTarget?: string; + + /** + * Output javascript files as module source type. + */ + module?: boolean; + + /** + * The output directory as **absolute path** (required). + */ + path?: string; + + /** + * Include comments with information about the modules. + */ + pathinfo?: boolean | "verbose"; + + /** + * The 'publicPath' specifies the public URL address of the output files when referenced in a browser. + */ + publicPath?: string | ((pathData: PathData, assetInfo?: AssetInfo) => string); + + /** + * This option enables loading async chunks via a custom script type, such as script type="module". + */ + scriptType?: false | "module" | "text/javascript"; + + /** + * The filename of the SourceMaps for the JavaScript files. They are inside the 'output.path' directory. + */ + sourceMapFilename?: string; + + /** + * Prefixes every line of the source in the bundle with this string. + */ + sourcePrefix?: string; + + /** + * Handles error in module loading correctly at a performance cost. This will handle module error compatible with the EcmaScript Modules spec. + */ + strictModuleErrorHandling?: boolean; + + /** + * Handles exceptions in module loading correctly at a performance cost (Deprecated). This will handle module error compatible with the Node.js CommonJS way. + */ + strictModuleExceptionHandling?: boolean; + + /** + * Use a Trusted Types policy to create urls for chunks. 'output.uniqueName' is used a default policy name. Passing a string sets a custom policy name. + */ + trustedTypes?: string | true | TrustedTypes; + + /** + * If `output.libraryTarget` is set to umd and `output.library` is set, setting this to true will name the AMD module. + */ + umdNamedDefine?: boolean; + + /** + * A unique name of the webpack build to avoid multiple webpack runtimes to conflict when using globals. + */ + uniqueName?: string; + + /** + * The method of loading WebAssembly Modules (methods included by default are 'fetch' (web/WebWorker), 'async-node' (node.js), but others might be added by plugins). + */ + wasmLoading?: string | false; + + /** + * The filename of WebAssembly modules as relative path inside the 'output.path' directory. + */ + webassemblyModuleFilename?: string; + + /** + * The method of loading chunks (methods included by default are 'jsonp' (web), 'import' (ESM), 'importScripts' (WebWorker), 'require' (sync node.js), 'async-node' (async node.js), but others might be added by plugins). + */ + workerChunkLoading?: string | false; + + /** + * Worker public path. Much like the public path, this sets the location where the worker script file is intended to be found. If not set, webpack will use the publicPath. Don't set this option unless your worker scripts are located at a different path from your other script files. + */ + workerPublicPath?: string; + + /** + * The method of loading WebAssembly Modules (methods included by default are 'fetch' (web/WebWorker), 'async-node' (node.js), but others might be added by plugins). + */ + workerWasmLoading?: string | false; +} +declare interface OutputFileSystem { + writeFile: WriteFile; + mkdir: Mkdir; + readdir?: ReaddirFs; + rmdir?: Rmdir; + unlink?: ( + pathLike: PathLikeFs, + callback: (err: null | NodeJS.ErrnoException) => void + ) => void; + stat: StatFs; + lstat?: LStatFs; + readFile: ReadFileFs; + join?: (path1: string, path2: string) => string; + relative?: (from: string, to: string) => string; + dirname?: (dirname: string) => string; +} + +/** + * Normalized options affecting the output of the compilation. `output` options tell webpack how to write the compiled files to disk. + */ +declare interface OutputNormalized { + /** + * The filename of asset modules as relative path inside the 'output.path' directory. + */ + assetModuleFilename?: + | string + | ((pathData: PathData, assetInfo?: AssetInfo) => string); + + /** + * Enable/disable creating async chunks that are loaded on demand. + */ + asyncChunks?: boolean; + + /** + * Add charset attribute for script tag. + */ + charset?: boolean; + + /** + * Specifies the filename template of output files of non-initial chunks on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk. + */ + chunkFilename?: + | string + | ((pathData: PathData, assetInfo?: AssetInfo) => string); + + /** + * The format of chunks (formats included by default are 'array-push' (web/WebWorker), 'commonjs' (node.js), 'module' (ESM), but others might be added by plugins). + */ + chunkFormat?: string | false; + + /** + * Number of milliseconds before chunk request expires. + */ + chunkLoadTimeout?: number; + + /** + * The method of loading chunks (methods included by default are 'jsonp' (web), 'import' (ESM), 'importScripts' (WebWorker), 'require' (sync node.js), 'async-node' (async node.js), but others might be added by plugins). + */ + chunkLoading?: string | false; + + /** + * The global variable used by webpack for loading of chunks. + */ + chunkLoadingGlobal?: string; + + /** + * Clean the output directory before emit. + */ + clean?: boolean | CleanOptions; + + /** + * Check if to be emitted file already exists and have the same content before writing to output filesystem. + */ + compareBeforeEmit?: boolean; + + /** + * This option enables cross-origin loading of chunks. + */ + crossOriginLoading?: false | "anonymous" | "use-credentials"; + + /** + * Specifies the filename template of non-initial output css files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk. + */ + cssChunkFilename?: + | string + | ((pathData: PathData, assetInfo?: AssetInfo) => string); + + /** + * Specifies the filename template of output css files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk. + */ + cssFilename?: + | string + | ((pathData: PathData, assetInfo?: AssetInfo) => string); + + /** + * Similar to `output.devtoolModuleFilenameTemplate`, but used in the case of duplicate module identifiers. + */ + devtoolFallbackModuleFilenameTemplate?: string | ((context?: any) => string); + + /** + * Filename template string of function for the sources array in a generated SourceMap. + */ + devtoolModuleFilenameTemplate?: string | ((context?: any) => string); + + /** + * Module namespace to use when interpolating filename template string for the sources array in a generated SourceMap. Defaults to `output.library` if not set. It's useful for avoiding runtime collisions in sourcemaps from multiple webpack projects built as libraries. + */ + devtoolNamespace?: string; + + /** + * List of chunk loading types enabled for use by entry points. + */ + enabledChunkLoadingTypes: string[]; + + /** + * List of library types enabled for use by entry points. + */ + enabledLibraryTypes: string[]; + + /** + * List of wasm loading types enabled for use by entry points. + */ + enabledWasmLoadingTypes: string[]; + + /** + * The abilities of the environment where the webpack generated code should run. + */ + environment: Environment; + + /** + * Specifies the filename of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk. + */ + filename?: string | ((pathData: PathData, assetInfo?: AssetInfo) => string); + + /** + * An expression which is used to address the global object/scope in runtime code. + */ + globalObject?: string; + + /** + * Digest type used for the hash. + */ + hashDigest?: string; + + /** + * Number of chars which are used for the hash. + */ + hashDigestLength?: number; + + /** + * Algorithm used for generation the hash (see node.js crypto package). + */ + hashFunction?: string | typeof Hash; + + /** + * Any string which is added to the hash to salt it. + */ + hashSalt?: string; + + /** + * The filename of the Hot Update Chunks. They are inside the output.path directory. + */ + hotUpdateChunkFilename?: string; + + /** + * The global variable used by webpack for loading of hot update chunks. + */ + hotUpdateGlobal?: string; + + /** + * The filename of the Hot Update Main File. It is inside the 'output.path' directory. + */ + hotUpdateMainFilename?: string; + + /** + * Ignore warnings in the browser. + */ + ignoreBrowserWarnings?: boolean; + + /** + * Wrap javascript code into IIFE's to avoid leaking into global scope. + */ + iife?: boolean; + + /** + * The name of the native import() function (can be exchanged for a polyfill). + */ + importFunctionName?: string; + + /** + * The name of the native import.meta object (can be exchanged for a polyfill). + */ + importMetaName?: string; + + /** + * Options for library. + */ + library?: LibraryOptions; + + /** + * Output javascript files as module source type. + */ + module?: boolean; + + /** + * The output directory as **absolute path** (required). + */ + path?: string; + + /** + * Include comments with information about the modules. + */ + pathinfo?: boolean | "verbose"; + + /** + * The 'publicPath' specifies the public URL address of the output files when referenced in a browser. + */ + publicPath?: string | ((pathData: PathData, assetInfo?: AssetInfo) => string); + + /** + * This option enables loading async chunks via a custom script type, such as script type="module". + */ + scriptType?: false | "module" | "text/javascript"; + + /** + * The filename of the SourceMaps for the JavaScript files. They are inside the 'output.path' directory. + */ + sourceMapFilename?: string; + + /** + * Prefixes every line of the source in the bundle with this string. + */ + sourcePrefix?: string; + + /** + * Handles error in module loading correctly at a performance cost. This will handle module error compatible with the EcmaScript Modules spec. + */ + strictModuleErrorHandling?: boolean; + + /** + * Handles exceptions in module loading correctly at a performance cost (Deprecated). This will handle module error compatible with the Node.js CommonJS way. + */ + strictModuleExceptionHandling?: boolean; + + /** + * Use a Trusted Types policy to create urls for chunks. + */ + trustedTypes?: TrustedTypes; + + /** + * A unique name of the webpack build to avoid multiple webpack runtimes to conflict when using globals. + */ + uniqueName?: string; + + /** + * The method of loading WebAssembly Modules (methods included by default are 'fetch' (web/WebWorker), 'async-node' (node.js), but others might be added by plugins). + */ + wasmLoading?: string | false; + + /** + * The filename of WebAssembly modules as relative path inside the 'output.path' directory. + */ + webassemblyModuleFilename?: string; + + /** + * The method of loading chunks (methods included by default are 'jsonp' (web), 'import' (ESM), 'importScripts' (WebWorker), 'require' (sync node.js), 'async-node' (async node.js), but others might be added by plugins). + */ + workerChunkLoading?: string | false; + + /** + * Worker public path. Much like the public path, this sets the location where the worker script file is intended to be found. If not set, webpack will use the publicPath. Don't set this option unless your worker scripts are located at a different path from your other script files. + */ + workerPublicPath?: string; + + /** + * The method of loading WebAssembly Modules (methods included by default are 'fetch' (web/WebWorker), 'async-node' (node.js), but others might be added by plugins). + */ + workerWasmLoading?: string | false; +} +declare interface ParameterizedComparator { + (tArg: TArg): Comparator; +} +declare interface ParsedIdentifier { + request: string; + query: string; + fragment: string; + directory: boolean; + module: boolean; + file: boolean; + internal: boolean; +} +declare class Parser { + constructor(); + parse( + source: string | Buffer | PreparsedAst, + state: ParserState + ): ParserState; +} +declare interface ParserOptions { + [index: string]: any; +} +type ParserOptionsByModuleType = ParserOptionsByModuleTypeKnown & + ParserOptionsByModuleTypeUnknown; + +/** + * Specify options for each parser. + */ +declare interface ParserOptionsByModuleTypeKnown { + /** + * Parser options for asset modules. + */ + asset?: AssetParserOptions; + + /** + * No parser options are supported for this module type. + */ + "asset/inline"?: EmptyParserOptions; + + /** + * No parser options are supported for this module type. + */ + "asset/resource"?: EmptyParserOptions; + + /** + * No parser options are supported for this module type. + */ + "asset/source"?: EmptyParserOptions; + + /** + * Parser options for css modules. + */ + css?: CssParserOptions; + + /** + * Parser options for css/auto modules. + */ + "css/auto"?: CssAutoParserOptions; + + /** + * Parser options for css/global modules. + */ + "css/global"?: CssGlobalParserOptions; + + /** + * Parser options for css/module modules. + */ + "css/module"?: CssModuleParserOptions; + + /** + * Parser options for javascript modules. + */ + javascript?: JavascriptParserOptions; + + /** + * Parser options for javascript modules. + */ + "javascript/auto"?: JavascriptParserOptions; + + /** + * Parser options for javascript modules. + */ + "javascript/dynamic"?: JavascriptParserOptions; + + /** + * Parser options for javascript modules. + */ + "javascript/esm"?: JavascriptParserOptions; + + /** + * Parser options for JSON modules. + */ + json?: JsonParserOptions; +} + +/** + * Specify options for each parser. + */ +declare interface ParserOptionsByModuleTypeUnknown { + [index: string]: { [index: string]: any }; +} +type ParserState = Record & ParserStateBase; +declare interface ParserStateBase { + source: string | Buffer; + current: NormalModule; + module: NormalModule; + compilation: Compilation; + options: WebpackOptionsNormalized; +} +declare interface PathData { + chunkGraph?: ChunkGraph; + hash?: string; + hashWithLength?: (length: number) => string; + chunk?: Chunk | ChunkPathData; + module?: Module | ModulePathData; + runtime?: RuntimeSpec; + filename?: string; + basename?: string; + query?: string; + contentHashType?: string; + contentHash?: string; + contentHashWithLength?: (length: number) => string; + noChunkHash?: boolean; + url?: string; +} +type PathLikeFs = string | Buffer | URL; +type PathLikeTypes = string | URL_url | Buffer; +type PathOrFileDescriptorFs = string | number | Buffer | URL; +type PathOrFileDescriptorTypes = string | number | Buffer | URL_url; +type Pattern = + | Identifier + | MemberExpression + | ObjectPattern + | ArrayPattern + | RestElement + | AssignmentPattern; + +/** + * Configuration object for web performance recommendations. + */ +declare interface PerformanceOptions { + /** + * Filter function to select assets that are checked. + */ + assetFilter?: (name: string, source: Source, assetInfo: AssetInfo) => boolean; + + /** + * Sets the format of the hints: warnings, errors or nothing at all. + */ + hints?: false | "error" | "warning"; + + /** + * File size limit (in bytes) when exceeded, that webpack will provide performance hints. + */ + maxAssetSize?: number; + + /** + * Total size of an entry point (in bytes). + */ + maxEntrypointSize?: number; +} +declare interface PitchLoaderDefinitionFunction< + OptionsType = {}, + ContextAdditions = {} +> { + ( + this: NormalModuleLoaderContext & + LoaderRunnerLoaderContext & + LoaderPluginLoaderContext & + HotModuleReplacementPluginLoaderContext & + ContextAdditions, + remainingRequest: string, + previousRequest: string, + data: object + ): string | void | Buffer | Promise; +} +declare class PlatformPlugin { + constructor(platform: Partial); + platform: Partial; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface PlatformTargetProperties { + /** + * web platform, importing of http(s) and std: is available + */ + web?: null | boolean; + + /** + * browser platform, running in a normal web browser + */ + browser?: null | boolean; + + /** + * (Web)Worker platform, running in a web/shared/service worker + */ + webworker?: null | boolean; + + /** + * node platform, require of node built-in modules is available + */ + node?: null | boolean; + + /** + * nwjs platform, require of legacy nw.gui is available + */ + nwjs?: null | boolean; + + /** + * electron platform, require of some electron built-in modules is available + */ + electron?: null | boolean; +} +type Plugin = + | undefined + | null + | false + | "" + | 0 + | { apply: (arg0: Resolver) => void } + | ((this: Resolver, arg1: Resolver) => void); +declare interface PnpApi { + resolveToUnqualified: ( + arg0: string, + arg1: string, + arg2: object + ) => null | string; +} +declare class PrefetchPlugin { + constructor(context: string, request?: string); + context: null | string; + request: string; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare class PrefixSource extends Source { + constructor(prefix: string, source: string | Source); + original(): Source; + getPrefix(): string; +} +declare interface PreparsedAst { + [index: string]: any; +} +declare interface PrintedElement { + element: string; + content?: string; +} +declare interface Problem { + type: ProblemType; + path: string; + argument: string; + value?: string | number | boolean | RegExp; + index?: number; + expected?: string; +} +type ProblemType = + | "unknown-argument" + | "unexpected-non-array-in-path" + | "unexpected-non-object-in-path" + | "multiple-values-unexpected" + | "invalid-value"; +declare interface ProcessAssetsAdditionalOptions { + additionalAssets?: any; +} +declare class Profiler { + constructor(inspector: Inspector); + session?: SessionImportInspectorClass_2; + inspector: Inspector; + hasSession(): boolean; + startProfiling(): Promise | Promise<[any, any, any]>; + sendCommand(method: string, params?: object): Promise; + destroy(): Promise; + stopProfiling(): Promise<{ profile: any }>; +} +declare class ProfilingPlugin { + constructor(options?: ProfilingPluginOptions); + outputPath: string; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; + static Profiler: typeof Profiler; +} +declare interface ProfilingPluginOptions { + /** + * Path to the output file e.g. `path.resolve(__dirname, 'profiling/events.json')`. Defaults to `events.json`. + */ + outputPath?: string; +} +declare class ProgressPlugin { + constructor(options?: ProgressPluginArgument); + profile?: null | boolean; + handler?: (percentage: number, msg: string, ...args: string[]) => void; + modulesCount?: number; + dependenciesCount?: number; + showEntries?: boolean; + showModules?: boolean; + showDependencies?: boolean; + showActiveModules?: boolean; + percentBy?: null | "entries" | "modules" | "dependencies"; + apply(compiler: Compiler | MultiCompiler): void; + static getReporter( + compiler: Compiler + ): undefined | ((p: number, ...args: string[]) => void); + static defaultOptions: { + profile: boolean; + modulesCount: number; + dependenciesCount: number; + modules: boolean; + dependencies: boolean; + activeModules: boolean; + entries: boolean; + }; + static createDefaultHandler: ( + profile: undefined | null | boolean, + logger: WebpackLogger + ) => (percentage: number, msg: string, ...args: string[]) => void; +} +type ProgressPluginArgument = + | ProgressPluginOptions + | ((percentage: number, msg: string, ...args: string[]) => void); + +/** + * Options object for the ProgressPlugin. + */ +declare interface ProgressPluginOptions { + /** + * Show active modules count and one active module in progress message. + */ + activeModules?: boolean; + + /** + * Show dependencies count in progress message. + */ + dependencies?: boolean; + + /** + * Minimum dependencies count to start with. For better progress calculation. Default: 10000. + */ + dependenciesCount?: number; + + /** + * Show entries count in progress message. + */ + entries?: boolean; + + /** + * Function that executes for every progress step. + */ + handler?: (percentage: number, msg: string, ...args: string[]) => void; + + /** + * Show modules count in progress message. + */ + modules?: boolean; + + /** + * Minimum modules count to start with. For better progress calculation. Default: 5000. + */ + modulesCount?: number; + + /** + * Collect percent algorithm. By default it calculates by a median from modules, entries and dependencies percent. + */ + percentBy?: null | "entries" | "modules" | "dependencies"; + + /** + * Collect profile data for progress steps. Default: false. + */ + profile?: null | boolean; +} +declare class ProvidePlugin { + constructor(definitions: Record); + definitions: Record; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare class ProvideSharedPlugin { + constructor(options: ProvideSharedPluginOptions); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface ProvideSharedPluginOptions { + /** + * Modules that should be provided as shared modules to the share scope. When provided, property name is used to match modules, otherwise this is automatically inferred from share key. + */ + provides: Provides; + + /** + * Share scope name used for all provided modules (defaults to 'default'). + */ + shareScope?: string; +} +type Provides = (string | ProvidesObject)[] | ProvidesObject; + +/** + * Advanced configuration for modules that should be provided as shared modules to the share scope. + */ +declare interface ProvidesConfig { + /** + * Include the provided module directly instead behind an async request. This allows to use this shared module in initial load too. All possible shared modules need to be eager too. + */ + eager?: boolean; + + /** + * Key in the share scope under which the shared modules should be stored. + */ + shareKey?: string; + + /** + * Share scope name. + */ + shareScope?: string; + + /** + * Version of the provided module. Will replace lower matching versions, but not higher. + */ + version?: string | false; +} + +/** + * Modules that should be provided as shared modules to the share scope. Property names are used as share keys. + */ +declare interface ProvidesObject { + [index: string]: string | ProvidesConfig; +} +declare interface RawChunkGroupOptions { + preloadOrder?: number; + prefetchOrder?: number; + fetchPriority?: "auto" | "low" | "high"; +} +type RawLoaderDefinition< + OptionsType = {}, + ContextAdditions = {} +> = RawLoaderDefinitionFunction & { + raw: true; + pitch?: PitchLoaderDefinitionFunction; +}; +declare interface RawLoaderDefinitionFunction< + OptionsType = {}, + ContextAdditions = {} +> { + ( + this: NormalModuleLoaderContext & + LoaderRunnerLoaderContext & + LoaderPluginLoaderContext & + HotModuleReplacementPluginLoaderContext & + ContextAdditions, + content: Buffer, + sourceMap?: string | SourceMap, + additionalData?: AdditionalData + ): string | void | Buffer | Promise; +} +declare class RawSource extends Source { + constructor(source: string | Buffer, convertToString?: boolean); + isBuffer(): boolean; +} +declare interface RawSourceMap { + version: number; + sources: string[]; + names: string[]; + sourceRoot?: string; + sourcesContent?: string[]; + mappings: string; + file: string; +} +declare interface Read< + TBuffer extends + ArrayBufferView = ArrayBufferView +> { + ( + fd: number, + buffer: TBuffer, + offset: number, + length: number, + position: null | number | bigint, + callback: ( + err: null | NodeJS.ErrnoException, + bytesRead: number, + buffer: TBuffer + ) => void + ): void; + ( + fd: number, + options: ReadAsyncOptions, + callback: ( + err: null | NodeJS.ErrnoException, + bytesRead: number, + buffer: TBuffer + ) => void + ): void; + ( + fd: number, + callback: ( + err: null | NodeJS.ErrnoException, + bytesRead: number, + buffer: ArrayBufferView + ) => void + ): void; +} +declare interface ReadAsyncOptions< + TBuffer extends ArrayBufferView +> { + offset?: number; + length?: number; + position?: null | number | bigint; + buffer?: TBuffer; +} +declare class ReadFileCompileAsyncWasmPlugin { + constructor(__0?: ReadFileCompileAsyncWasmPluginOptions); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface ReadFileCompileAsyncWasmPluginOptions { + /** + * use import? + */ + import?: boolean; +} +declare class ReadFileCompileWasmPlugin { + constructor(options?: ReadFileCompileWasmPluginOptions); + options: ReadFileCompileWasmPluginOptions; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface ReadFileCompileWasmPluginOptions { + /** + * mangle imports + */ + mangleImports?: boolean; + + /** + * use import? + */ + import?: boolean; +} +declare interface ReadFileFs { + ( + path: PathOrFileDescriptorFs, + options: + | undefined + | null + | ({ encoding?: null; flag?: string } & Abortable), + callback: (err: null | NodeJS.ErrnoException, result?: Buffer) => void + ): void; + ( + path: PathOrFileDescriptorFs, + options: + | ({ encoding: BufferEncoding; flag?: string } & Abortable) + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "base64" + | "base64url" + | "latin1" + | "binary" + | "hex", + callback: (err: null | NodeJS.ErrnoException, result?: string) => void + ): void; + ( + path: PathOrFileDescriptorFs, + options: + | undefined + | null + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "base64" + | "base64url" + | "latin1" + | "binary" + | "hex" + | (ObjectEncodingOptions & { flag?: string } & Abortable), + callback: ( + err: null | NodeJS.ErrnoException, + result?: string | Buffer + ) => void + ): void; + ( + path: PathOrFileDescriptorFs, + callback: (err: null | NodeJS.ErrnoException, result?: Buffer) => void + ): void; +} +declare interface ReadFileSync { + ( + path: PathOrFileDescriptorFs, + options?: null | { encoding?: null; flag?: string } + ): Buffer; + ( + path: PathOrFileDescriptorFs, + options: + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "base64" + | "base64url" + | "latin1" + | "binary" + | "hex" + | { encoding: BufferEncoding; flag?: string } + ): string; + ( + path: PathOrFileDescriptorFs, + options?: + | null + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "base64" + | "base64url" + | "latin1" + | "binary" + | "hex" + | (ObjectEncodingOptions & { flag?: string }) + ): string | Buffer; +} +declare interface ReadFileTypes { + ( + path: PathOrFileDescriptorTypes, + options: + | undefined + | null + | ({ encoding?: null; flag?: string } & Abortable), + callback: (arg0: null | NodeJS.ErrnoException, arg1?: Buffer) => void + ): void; + ( + path: PathOrFileDescriptorTypes, + options: + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "base64" + | "base64url" + | "latin1" + | "binary" + | "hex" + | ({ encoding: BufferEncoding; flag?: string } & Abortable), + callback: (arg0: null | NodeJS.ErrnoException, arg1?: string) => void + ): void; + ( + path: PathOrFileDescriptorTypes, + options: + | undefined + | null + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "base64" + | "base64url" + | "latin1" + | "binary" + | "hex" + | (ObjectEncodingOptions & { flag?: string } & Abortable), + callback: ( + arg0: null | NodeJS.ErrnoException, + arg1?: string | Buffer + ) => void + ): void; + ( + path: PathOrFileDescriptorTypes, + callback: (arg0: null | NodeJS.ErrnoException, arg1?: Buffer) => void + ): void; +} +declare interface ReaddirFs { + ( + path: PathLikeFs, + options: + | undefined + | null + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "base64" + | "base64url" + | "latin1" + | "binary" + | "hex" + | { + encoding: + | null + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "base64" + | "base64url" + | "latin1" + | "binary" + | "hex"; + withFileTypes?: false; + recursive?: boolean; + }, + callback: (err: null | NodeJS.ErrnoException, result?: string[]) => void + ): void; + ( + path: PathLikeFs, + options: + | "buffer" + | { encoding: "buffer"; withFileTypes?: false; recursive?: boolean }, + callback: (err: null | NodeJS.ErrnoException, result?: Buffer[]) => void + ): void; + ( + path: PathLikeFs, + callback: (err: null | NodeJS.ErrnoException, result?: string[]) => void + ): void; + ( + path: PathLikeFs, + options: + | undefined + | null + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "base64" + | "base64url" + | "latin1" + | "binary" + | "hex" + | (ObjectEncodingOptions & { + withFileTypes?: false; + recursive?: boolean; + }), + callback: ( + err: null | NodeJS.ErrnoException, + result?: string[] | Buffer[] + ) => void + ): void; + ( + path: PathLikeFs, + options: ObjectEncodingOptions & { + withFileTypes: true; + recursive?: boolean; + }, + callback: (err: null | NodeJS.ErrnoException, result?: Dirent[]) => void + ): void; +} +declare interface ReaddirSync { + ( + path: PathLikeFs, + options?: + | null + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "base64" + | "base64url" + | "latin1" + | "binary" + | "hex" + | { + encoding: + | null + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "base64" + | "base64url" + | "latin1" + | "binary" + | "hex"; + withFileTypes?: false; + recursive?: boolean; + } + ): string[]; + ( + path: PathLikeFs, + options: + | "buffer" + | { encoding: "buffer"; withFileTypes?: false; recursive?: boolean } + ): Buffer[]; + ( + path: PathLikeFs, + options?: + | null + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "base64" + | "base64url" + | "latin1" + | "binary" + | "hex" + | (ObjectEncodingOptions & { withFileTypes?: false; recursive?: boolean }) + ): string[] | Buffer[]; + ( + path: PathLikeFs, + options: ObjectEncodingOptions & { + withFileTypes: true; + recursive?: boolean; + } + ): Dirent[]; +} +declare interface ReaddirTypes { + ( + path: PathLikeTypes, + options: + | undefined + | null + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "base64" + | "base64url" + | "latin1" + | "binary" + | "hex" + | { + encoding: + | null + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "base64" + | "base64url" + | "latin1" + | "binary" + | "hex"; + withFileTypes?: false; + recursive?: boolean; + }, + callback: (arg0: null | NodeJS.ErrnoException, arg1?: string[]) => void + ): void; + ( + path: PathLikeTypes, + options: + | "buffer" + | { encoding: "buffer"; withFileTypes?: false; recursive?: boolean }, + callback: (arg0: null | NodeJS.ErrnoException, arg1?: Buffer[]) => void + ): void; + ( + path: PathLikeTypes, + callback: (arg0: null | NodeJS.ErrnoException, arg1?: string[]) => void + ): void; + ( + path: PathLikeTypes, + options: + | undefined + | null + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "base64" + | "base64url" + | "latin1" + | "binary" + | "hex" + | (ObjectEncodingOptions & { + withFileTypes?: false; + recursive?: boolean; + }), + callback: ( + arg0: null | NodeJS.ErrnoException, + arg1?: string[] | Buffer[] + ) => void + ): void; + ( + path: PathLikeTypes, + options: ObjectEncodingOptions & { + withFileTypes: true; + recursive?: boolean; + }, + callback: (arg0: null | NodeJS.ErrnoException, arg1?: Dirent[]) => void + ): void; +} +declare interface ReadlinkFs { + ( + path: PathLikeFs, + options: EncodingOption, + callback: (err: null | NodeJS.ErrnoException, result?: string) => void + ): void; + ( + path: PathLikeFs, + options: BufferEncodingOption, + callback: (err: null | NodeJS.ErrnoException, result?: Buffer) => void + ): void; + ( + path: PathLikeFs, + options: EncodingOption, + callback: ( + err: null | NodeJS.ErrnoException, + result?: string | Buffer + ) => void + ): void; + ( + path: PathLikeFs, + callback: (err: null | NodeJS.ErrnoException, result?: string) => void + ): void; +} +declare interface ReadlinkSync { + (path: PathLikeFs, options?: EncodingOption): string; + (path: PathLikeFs, options: BufferEncodingOption): Buffer; + (path: PathLikeFs, options?: EncodingOption): string | Buffer; +} +declare interface ReadlinkTypes { + ( + path: PathLikeTypes, + options: EncodingOption, + callback: (arg0: null | NodeJS.ErrnoException, arg1?: string) => void + ): void; + ( + path: PathLikeTypes, + options: BufferEncodingOption, + callback: (arg0: null | NodeJS.ErrnoException, arg1?: Buffer) => void + ): void; + ( + path: PathLikeTypes, + options: EncodingOption, + callback: ( + arg0: null | NodeJS.ErrnoException, + arg1?: string | Buffer + ) => void + ): void; + ( + path: PathLikeTypes, + callback: (arg0: null | NodeJS.ErrnoException, arg1?: string) => void + ): void; +} +declare class RealContentHashPlugin { + constructor(__0: RealContentHashPluginOptions); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; + static getCompilationHooks( + compilation: Compilation + ): CompilationHooksRealContentHashPlugin; +} +declare interface RealContentHashPluginOptions { + /** + * the hash function to use + */ + hashFunction: string | typeof Hash; + + /** + * the hash digest to use + */ + hashDigest?: string; +} +declare interface RealDependencyLocation { + start: SourcePosition; + end?: SourcePosition; + index?: number; +} +declare interface RealPathFs { + ( + path: PathLikeFs, + options: EncodingOption, + callback: (err: null | NodeJS.ErrnoException, result?: string) => void + ): void; + ( + path: PathLikeFs, + options: BufferEncodingOption, + callback: (err: null | NodeJS.ErrnoException, result?: Buffer) => void + ): void; + ( + path: PathLikeFs, + options: EncodingOption, + callback: ( + err: null | NodeJS.ErrnoException, + result?: string | Buffer + ) => void + ): void; + ( + path: PathLikeFs, + callback: (err: null | NodeJS.ErrnoException, result?: string) => void + ): void; +} +declare interface RealPathSync { + (path: PathLikeFs, options?: EncodingOption): string; + (path: PathLikeFs, options: BufferEncodingOption): Buffer; + (path: PathLikeFs, options?: EncodingOption): string | Buffer; +} +declare interface RealPathTypes { + ( + path: PathLikeTypes, + options: EncodingOption, + callback: (arg0: null | NodeJS.ErrnoException, arg1?: string) => void + ): void; + ( + path: PathLikeTypes, + options: BufferEncodingOption, + callback: (arg0: null | NodeJS.ErrnoException, arg1?: Buffer) => void + ): void; + ( + path: PathLikeTypes, + options: EncodingOption, + callback: ( + arg0: null | NodeJS.ErrnoException, + arg1?: string | Buffer + ) => void + ): void; + ( + path: PathLikeTypes, + callback: (arg0: null | NodeJS.ErrnoException, arg1?: string) => void + ): void; +} +declare interface Records { + [index: string]: any; +} +type RecursiveArrayOrRecord = + | { [index: string]: RecursiveArrayOrRecord } + | RecursiveArrayOrRecord[] + | T; +type ReferenceableItem = string | object; +declare interface ReferencedExport { + /** + * name of the referenced export + */ + name: string[]; + + /** + * when false, referenced export can not be mangled, defaults to true + */ + canMangle?: boolean; +} +type Remotes = (string | RemotesObject)[] | RemotesObject; + +/** + * Advanced configuration for container locations from which modules should be resolved and loaded at runtime. + */ +declare interface RemotesConfig { + /** + * Container locations from which modules should be resolved and loaded at runtime. + */ + external: string | string[]; + + /** + * The name of the share scope shared with this remote. + */ + shareScope?: string; +} + +/** + * Container locations from which modules should be resolved and loaded at runtime. Property names are used as request scopes. + */ +declare interface RemotesObject { + [index: string]: string | RemotesConfig | string[]; +} +declare interface RenderBootstrapContext { + /** + * the chunk + */ + chunk: Chunk; + + /** + * results of code generation + */ + codeGenerationResults: CodeGenerationResults; + + /** + * the runtime template + */ + runtimeTemplate: RuntimeTemplate; + + /** + * the module graph + */ + moduleGraph: ModuleGraph; + + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; + + /** + * hash to be used for render call + */ + hash: string; +} +declare interface RenderContextCssModulesPlugin { + /** + * the chunk + */ + chunk: Chunk; + + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; + + /** + * results of code generation + */ + codeGenerationResults: CodeGenerationResults; + + /** + * the runtime template + */ + runtimeTemplate: RuntimeTemplate; + + /** + * the unique name + */ + uniqueName: string; + + /** + * undo path to css file + */ + undoPath: string; + + /** + * modules + */ + modules: CssModule[]; +} +declare interface RenderContextJavascriptModulesPlugin { + /** + * the chunk + */ + chunk: Chunk; + + /** + * the dependency templates + */ + dependencyTemplates: DependencyTemplates; + + /** + * the runtime template + */ + runtimeTemplate: RuntimeTemplate; + + /** + * the module graph + */ + moduleGraph: ModuleGraph; + + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; + + /** + * results of code generation + */ + codeGenerationResults: CodeGenerationResults; + + /** + * rendering in strict context + */ + strictMode?: boolean; +} +type RenderManifestEntry = + | RenderManifestEntryTemplated + | RenderManifestEntryStatic; +declare interface RenderManifestEntryStatic { + render: () => Source; + filename: string; + info: AssetInfo; + identifier: string; + hash?: string; + auxiliary?: boolean; +} +declare interface RenderManifestEntryTemplated { + render: () => Source; + filenameTemplate: TemplatePath; + pathOptions?: PathData; + info?: AssetInfo; + identifier: string; + hash?: string; + auxiliary?: boolean; +} +declare interface RenderManifestOptions { + /** + * the chunk used to render + */ + chunk: Chunk; + hash: string; + fullHash: string; + outputOptions: Output; + codeGenerationResults: CodeGenerationResults; + moduleTemplates: { javascript: ModuleTemplate }; + dependencyTemplates: DependencyTemplates; + runtimeTemplate: RuntimeTemplate; + moduleGraph: ModuleGraph; + chunkGraph: ChunkGraph; +} +declare class ReplaceSource extends Source { + constructor(source: Source, name?: string); + replace(start: number, end: number, newValue: string, name?: string): void; + insert(pos: number, newValue: string, name?: string): void; + getName(): string; + original(): string; + getReplacements(): { + start: number; + end: number; + content: string; + insertIndex: number; + name: string; + }[]; +} +declare interface RequestRecord { + [index: string]: string | string[]; +} +declare abstract class RequestShortener { + contextify: (value: string) => string; + shorten(request?: null | string): undefined | null | string; +} +declare interface ResolveBuildDependenciesResult { + /** + * list of files + */ + files: Set; + + /** + * list of directories + */ + directories: Set; + + /** + * list of missing entries + */ + missing: Set; + + /** + * stored resolve results + */ + resolveResults: Map; + + /** + * dependencies of the resolving + */ + resolveDependencies: ResolveDependencies; +} +declare interface ResolveContext { + contextDependencies?: WriteOnlySet; + + /** + * files that was found on file system + */ + fileDependencies?: WriteOnlySet; + + /** + * dependencies that was not found on file system + */ + missingDependencies?: WriteOnlySet; + + /** + * set of hooks' calls. For instance, `resolve → parsedResolve → describedResolve`, + */ + stack?: Set; + + /** + * log function + */ + log?: (arg0: string) => void; + + /** + * yield result, if provided plugins can return several results + */ + yield?: (arg0: ResolveRequest) => void; +} +declare interface ResolveData { + contextInfo: ModuleFactoryCreateDataContextInfo; + resolveOptions?: ResolveOptions; + context: string; + request: string; + assertions?: ImportAttributes; + dependencies: ModuleDependency[]; + dependencyType: string; + createData: Partial; + fileDependencies: LazySet; + missingDependencies: LazySet; + contextDependencies: LazySet; + ignoredModule?: Module; + + /** + * allow to use the unsafe cache + */ + cacheable: boolean; +} +declare interface ResolveDependencies { + /** + * list of files + */ + files: Set; + + /** + * list of directories + */ + directories: Set; + + /** + * list of missing entries + */ + missing: Set; +} + +/** + * Options object for resolving requests. + */ +declare interface ResolveOptions { + /** + * Redirect module requests. + */ + alias?: + | { + /** + * New request. + */ + alias: string | false | string[]; + /** + * Request to be redirected. + */ + name: string; + /** + * Redirect only exact matching request. + */ + onlyModule?: boolean; + }[] + | { [index: string]: string | false | string[] }; + + /** + * Fields in the description file (usually package.json) which are used to redirect requests inside the module. + */ + aliasFields?: (string | string[])[]; + + /** + * Extra resolve options per dependency category. Typical categories are "commonjs", "amd", "esm". + */ + byDependency?: { [index: string]: ResolveOptions }; + + /** + * Enable caching of successfully resolved requests (cache entries are revalidated). + */ + cache?: boolean; + + /** + * Predicate function to decide which requests should be cached. + */ + cachePredicate?: (request: ResolveRequest) => boolean; + + /** + * Include the context information in the cache identifier when caching. + */ + cacheWithContext?: boolean; + + /** + * Condition names for exports field entry point. + */ + conditionNames?: string[]; + + /** + * Filenames used to find a description file (like a package.json). + */ + descriptionFiles?: string[]; + + /** + * Enforce the resolver to use one of the extensions from the extensions option (User must specify requests without extension). + */ + enforceExtension?: boolean; + + /** + * Field names from the description file (usually package.json) which are used to provide entry points of a package. + */ + exportsFields?: string[]; + + /** + * An object which maps extension to extension aliases. + */ + extensionAlias?: { [index: string]: string | string[] }; + + /** + * Extensions added to the request when trying to find the file. + */ + extensions?: string[]; + + /** + * Redirect module requests when normal resolving fails. + */ + fallback?: + | { + /** + * New request. + */ + alias: string | false | string[]; + /** + * Request to be redirected. + */ + name: string; + /** + * Redirect only exact matching request. + */ + onlyModule?: boolean; + }[] + | { [index: string]: string | false | string[] }; + + /** + * Filesystem for the resolver. + */ + fileSystem?: InputFileSystem; + + /** + * Treats the request specified by the user as fully specified, meaning no extensions are added and the mainFiles in directories are not resolved (This doesn't affect requests from mainFields, aliasFields or aliases). + */ + fullySpecified?: boolean; + + /** + * Field names from the description file (usually package.json) which are used to provide internal request of a package (requests starting with # are considered as internal). + */ + importsFields?: string[]; + + /** + * Field names from the description file (package.json) which are used to find the default entry point. + */ + mainFields?: (string | string[])[]; + + /** + * Filenames used to find the default entry point if there is no description file or main field. + */ + mainFiles?: string[]; + + /** + * Folder names or directory paths where to find modules. + */ + modules?: string[]; + + /** + * Plugins for the resolver. + */ + plugins?: ( + | undefined + | null + | false + | "" + | 0 + | { + [index: string]: any; + /** + * The run point of the plugin, required method. + */ + apply: (arg0: Resolver) => void; + } + | ((this: Resolver, arg1: Resolver) => void) + | "..." + )[]; + + /** + * Prefer to resolve server-relative URLs (starting with '/') as absolute paths before falling back to resolve in 'resolve.roots'. + */ + preferAbsolute?: boolean; + + /** + * Prefer to resolve module requests as relative request and fallback to resolving as module. + */ + preferRelative?: boolean; + + /** + * Custom resolver. + */ + resolver?: Resolver; + + /** + * A list of resolve restrictions. Resolve results must fulfill all of these restrictions to resolve successfully. Other resolve paths are taken when restrictions are not met. + */ + restrictions?: (string | RegExp)[]; + + /** + * A list of directories in which requests that are server-relative URLs (starting with '/') are resolved. + */ + roots?: string[]; + + /** + * Enable resolving symlinks to the original location. + */ + symlinks?: boolean; + + /** + * Enable caching of successfully resolved requests (cache entries are not revalidated). + */ + unsafeCache?: boolean | { [index: string]: any }; + + /** + * Use synchronous filesystem calls for the resolver. + */ + useSyncFileSystemCalls?: boolean; +} +declare interface ResolveOptionsResolverFactoryObject1 { + alias: AliasOption[]; + fallback: AliasOption[]; + aliasFields: Set; + extensionAlias: ExtensionAliasOption[]; + cachePredicate: (arg0: ResolveRequest) => boolean; + cacheWithContext: boolean; + + /** + * A list of exports field condition names. + */ + conditionNames: Set; + descriptionFiles: string[]; + enforceExtension: boolean; + exportsFields: Set; + importsFields: Set; + extensions: Set; + fileSystem: FileSystem; + unsafeCache: false | object; + symlinks: boolean; + resolver?: Resolver; + modules: (string | string[])[]; + mainFields: { name: string[]; forceRelative: boolean }[]; + mainFiles: Set; + plugins: Plugin[]; + pnpApi: null | PnpApi; + roots: Set; + fullySpecified: boolean; + resolveToContext: boolean; + restrictions: Set; + preferRelative: boolean; + preferAbsolute: boolean; +} +declare interface ResolveOptionsResolverFactoryObject2 { + /** + * A list of module alias configurations or an object which maps key to value + */ + alias?: AliasOption[] | AliasOptions; + + /** + * A list of module alias configurations or an object which maps key to value, applied only after modules option + */ + fallback?: AliasOption[] | AliasOptions; + + /** + * An object which maps extension to extension aliases + */ + extensionAlias?: ExtensionAliasOptions; + + /** + * A list of alias fields in description files + */ + aliasFields?: (string | string[])[]; + + /** + * A function which decides whether a request should be cached or not. An object is passed with at least `path` and `request` properties. + */ + cachePredicate?: (arg0: ResolveRequest) => boolean; + + /** + * Whether or not the unsafeCache should include request context as part of the cache key. + */ + cacheWithContext?: boolean; + + /** + * A list of description files to read from + */ + descriptionFiles?: string[]; + + /** + * A list of exports field condition names. + */ + conditionNames?: string[]; + + /** + * Enforce that a extension from extensions must be used + */ + enforceExtension?: boolean; + + /** + * A list of exports fields in description files + */ + exportsFields?: (string | string[])[]; + + /** + * A list of imports fields in description files + */ + importsFields?: (string | string[])[]; + + /** + * A list of extensions which should be tried for files + */ + extensions?: string[]; + + /** + * The file system which should be used + */ + fileSystem: FileSystem; + + /** + * Use this cache object to unsafely cache the successful requests + */ + unsafeCache?: boolean | object; + + /** + * Resolve symlinks to their symlinked location + */ + symlinks?: boolean; + + /** + * A prepared Resolver to which the plugins are attached + */ + resolver?: Resolver; + + /** + * A list of directories to resolve modules from, can be absolute path or folder name + */ + modules?: string | string[]; + + /** + * A list of main fields in description files + */ + mainFields?: ( + | string + | string[] + | { name: string | string[]; forceRelative: boolean } + )[]; + + /** + * A list of main files in directories + */ + mainFiles?: string[]; + + /** + * A list of additional resolve plugins which should be applied + */ + plugins?: Plugin[]; + + /** + * A PnP API that should be used - null is "never", undefined is "auto" + */ + pnpApi?: null | PnpApi; + + /** + * A list of root paths + */ + roots?: string[]; + + /** + * The request is already fully specified and no extensions or directories are resolved for it + */ + fullySpecified?: boolean; + + /** + * Resolve to a context instead of a file + */ + resolveToContext?: boolean; + + /** + * A list of resolve restrictions + */ + restrictions?: (string | RegExp)[]; + + /** + * Use only the sync constraints of the file system calls + */ + useSyncFileSystemCalls?: boolean; + + /** + * Prefer to resolve module requests as relative requests before falling back to modules + */ + preferRelative?: boolean; + + /** + * Prefer to resolve server-relative urls as absolute paths before falling back to resolve in roots + */ + preferAbsolute?: boolean; +} +type ResolveOptionsWithDependencyType = ResolveOptions & { + dependencyType?: string; + resolveToContext?: boolean; +}; +type ResolvePluginInstance = + | { + [index: string]: any; + /** + * The run point of the plugin, required method. + */ + apply: (arg0: Resolver) => void; + } + | ((this: Resolver, arg1: Resolver) => void); +type ResolveRequest = BaseResolveRequest & Partial; +declare interface ResolvedContextFileSystemInfoEntry { + safeTime: number; + timestampHash?: string; +} +declare interface ResolvedContextTimestampAndHash { + safeTime: number; + timestampHash?: string; + hash: string; +} +declare interface ResolvedOptions { + /** + * - platform target properties + */ + platform: false | PlatformTargetProperties; +} +declare abstract class Resolver { + fileSystem: FileSystem; + options: ResolveOptionsResolverFactoryObject1; + hooks: KnownHooks; + ensureHook( + name: + | string + | AsyncSeriesBailHook< + [ResolveRequest, ResolveContext], + null | ResolveRequest + > + ): AsyncSeriesBailHook< + [ResolveRequest, ResolveContext], + null | ResolveRequest + >; + getHook( + name: + | string + | AsyncSeriesBailHook< + [ResolveRequest, ResolveContext], + null | ResolveRequest + > + ): AsyncSeriesBailHook< + [ResolveRequest, ResolveContext], + null | ResolveRequest + >; + resolveSync(context: object, path: string, request: string): string | false; + resolve( + context: object, + path: string, + request: string, + resolveContext: ResolveContext, + callback: ( + err: null | ErrorWithDetail, + res?: string | false, + req?: ResolveRequest + ) => void + ): void; + doResolve( + hook: AsyncSeriesBailHook< + [ResolveRequest, ResolveContext], + null | ResolveRequest + >, + request: ResolveRequest, + message: null | string, + resolveContext: ResolveContext, + callback: (err?: null | Error, result?: ResolveRequest) => void + ): void; + parse(identifier: string): ParsedIdentifier; + isModule(path: string): boolean; + isPrivate(path: string): boolean; + isDirectory(path: string): boolean; + join(path: string, request: string): string; + normalize(path: string): string; +} +declare interface ResolverCache { + direct: WeakMap; + stringified: Map; +} +declare abstract class ResolverFactory { + hooks: Readonly<{ + resolveOptions: HookMap< + SyncWaterfallHook<[ResolveOptionsWithDependencyType]> + >; + resolver: HookMap< + SyncHook< + [ + Resolver, + ResolveOptionsResolverFactoryObject2, + ResolveOptionsWithDependencyType + ] + > + >; + }>; + cache: Map; + get( + type: string, + resolveOptions?: ResolveOptionsWithDependencyType + ): ResolverWithOptions; +} +type ResolverWithOptions = Resolver & WithOptions; + +declare interface ResourceDataWithData { + resource: string; + path?: string; + query?: string; + fragment?: string; + context?: string; + data: ResourceSchemeData & Partial; +} +declare interface ResourceSchemeData { + /** + * mime type of the resource + */ + mimetype?: string; + + /** + * additional parameters for the resource + */ + parameters?: string; + + /** + * encoding of the resource + */ + encoding?: false | "base64"; + + /** + * encoded content of the resource + */ + encodedContent?: string; +} +declare abstract class RestoreProvidedData { + exports: RestoreProvidedDataExports[]; + otherProvided?: null | boolean; + otherCanMangleProvide?: boolean; + otherTerminalBinding: boolean; + serialize(__0: ObjectSerializerContext): void; +} +declare interface RestoreProvidedDataExports { + name: string; + provided?: null | boolean; + canMangleProvide?: boolean; + terminalBinding: boolean; + exportsInfo?: RestoreProvidedData; +} +declare interface RmDirOptions { + maxRetries?: number; + recursive?: boolean; + retryDelay?: number; +} +declare interface Rmdir { + ( + file: PathLikeFs, + callback: (err: null | NodeJS.ErrnoException) => void + ): void; + ( + file: PathLikeFs, + options: RmDirOptions, + callback: (err: null | NodeJS.ErrnoException) => void + ): void; +} +type Rule = string | RegExp; +declare interface RuleSet { + /** + * map of references in the rule set (may grow over time) + */ + references: Map; + + /** + * execute the rule set + */ + exec: (effectData: EffectData) => Effect[]; +} +type RuleSetCondition = + | string + | RegExp + | ((value: string) => boolean) + | RuleSetLogicalConditions + | RuleSetCondition[]; +type RuleSetConditionAbsolute = + | string + | RegExp + | ((value: string) => boolean) + | RuleSetLogicalConditionsAbsolute + | RuleSetConditionAbsolute[]; +type RuleSetConditionOrConditions = + | string + | RegExp + | ((value: string) => boolean) + | RuleSetLogicalConditions + | RuleSetCondition[]; +type RuleSetLoaderOptions = string | { [index: string]: any }; + +/** + * Logic operators used in a condition matcher. + */ +declare interface RuleSetLogicalConditions { + /** + * Logical AND. + */ + and?: RuleSetCondition[]; + + /** + * Logical NOT. + */ + not?: + | string + | RegExp + | ((value: string) => boolean) + | RuleSetLogicalConditions + | RuleSetCondition[]; + + /** + * Logical OR. + */ + or?: RuleSetCondition[]; +} + +/** + * Logic operators used in a condition matcher. + */ +declare interface RuleSetLogicalConditionsAbsolute { + /** + * Logical AND. + */ + and?: RuleSetConditionAbsolute[]; + + /** + * Logical NOT. + */ + not?: + | string + | RegExp + | ((value: string) => boolean) + | RuleSetLogicalConditionsAbsolute + | RuleSetConditionAbsolute[]; + + /** + * Logical OR. + */ + or?: RuleSetConditionAbsolute[]; +} + +/** + * A rule description with conditions and effects for modules. + */ +declare interface RuleSetRule { + /** + * Match on import assertions of the dependency. + */ + assert?: { [index: string]: RuleSetConditionOrConditions }; + + /** + * Match the child compiler name. + */ + compiler?: + | string + | RegExp + | ((value: string) => boolean) + | RuleSetLogicalConditions + | RuleSetCondition[]; + + /** + * Match dependency type. + */ + dependency?: + | string + | RegExp + | ((value: string) => boolean) + | RuleSetLogicalConditions + | RuleSetCondition[]; + + /** + * Match values of properties in the description file (usually package.json). + */ + descriptionData?: { [index: string]: RuleSetConditionOrConditions }; + + /** + * Enforce this rule as pre or post step. + */ + enforce?: "pre" | "post"; + + /** + * Shortcut for resource.exclude. + */ + exclude?: + | string + | RegExp + | ((value: string) => boolean) + | RuleSetLogicalConditionsAbsolute + | RuleSetConditionAbsolute[]; + + /** + * The options for the module generator. + */ + generator?: { [index: string]: any }; + + /** + * Shortcut for resource.include. + */ + include?: + | string + | RegExp + | ((value: string) => boolean) + | RuleSetLogicalConditionsAbsolute + | RuleSetConditionAbsolute[]; + + /** + * Match the issuer of the module (The module pointing to this module). + */ + issuer?: + | string + | RegExp + | ((value: string) => boolean) + | RuleSetLogicalConditionsAbsolute + | RuleSetConditionAbsolute[]; + + /** + * Match layer of the issuer of this module (The module pointing to this module). + */ + issuerLayer?: + | string + | RegExp + | ((value: string) => boolean) + | RuleSetLogicalConditions + | RuleSetCondition[]; + + /** + * Specifies the layer in which the module should be placed in. + */ + layer?: string; + + /** + * Shortcut for use.loader. + */ + loader?: string; + + /** + * Match module mimetype when load from Data URI. + */ + mimetype?: + | string + | RegExp + | ((value: string) => boolean) + | RuleSetLogicalConditions + | RuleSetCondition[]; + + /** + * Only execute the first matching rule in this array. + */ + oneOf?: (undefined | null | false | "" | 0 | RuleSetRule)[]; + + /** + * Shortcut for use.options. + */ + options?: string | { [index: string]: any }; + + /** + * Options for parsing. + */ + parser?: { [index: string]: any }; + + /** + * Match the real resource path of the module. + */ + realResource?: + | string + | RegExp + | ((value: string) => boolean) + | RuleSetLogicalConditionsAbsolute + | RuleSetConditionAbsolute[]; + + /** + * Options for the resolver. + */ + resolve?: ResolveOptions; + + /** + * Match the resource path of the module. + */ + resource?: + | string + | RegExp + | ((value: string) => boolean) + | RuleSetLogicalConditionsAbsolute + | RuleSetConditionAbsolute[]; + + /** + * Match the resource fragment of the module. + */ + resourceFragment?: + | string + | RegExp + | ((value: string) => boolean) + | RuleSetLogicalConditions + | RuleSetCondition[]; + + /** + * Match the resource query of the module. + */ + resourceQuery?: + | string + | RegExp + | ((value: string) => boolean) + | RuleSetLogicalConditions + | RuleSetCondition[]; + + /** + * Match and execute these rules when this rule is matched. + */ + rules?: (undefined | null | false | "" | 0 | RuleSetRule)[]; + + /** + * Match module scheme. + */ + scheme?: + | string + | RegExp + | ((value: string) => boolean) + | RuleSetLogicalConditions + | RuleSetCondition[]; + + /** + * Flags a module as with or without side effects. + */ + sideEffects?: boolean; + + /** + * Shortcut for resource.test. + */ + test?: + | string + | RegExp + | ((value: string) => boolean) + | RuleSetLogicalConditionsAbsolute + | RuleSetConditionAbsolute[]; + + /** + * Module type to use for the module. + */ + type?: string; + + /** + * Modifiers applied to the module when rule is matched. + */ + use?: + | string + | ( + | undefined + | null + | string + | false + | 0 + | RuleSetUseFunction + | { + /** + * Unique loader options identifier. + */ + ident?: string; + /** + * Loader name. + */ + loader?: string; + /** + * Loader options. + */ + options?: string | { [index: string]: any }; + } + )[] + | RuleSetUseFunction + | { + /** + * Unique loader options identifier. + */ + ident?: string; + /** + * Loader name. + */ + loader?: string; + /** + * Loader options. + */ + options?: string | { [index: string]: any }; + }; + + /** + * Match on import attributes of the dependency. + */ + with?: { [index: string]: RuleSetConditionOrConditions }; +} +type RuleSetUse = + | string + | ( + | undefined + | null + | string + | false + | 0 + | RuleSetUseFunction + | { + /** + * Unique loader options identifier. + */ + ident?: string; + /** + * Loader name. + */ + loader?: string; + /** + * Loader options. + */ + options?: string | { [index: string]: any }; + } + )[] + | RuleSetUseFunction + | { + /** + * Unique loader options identifier. + */ + ident?: string; + /** + * Loader name. + */ + loader?: string; + /** + * Loader options. + */ + options?: string | { [index: string]: any }; + }; +type RuleSetUseFunction = (data: EffectData) => + | string + | RuleSetUseFunction + | { + /** + * Unique loader options identifier. + */ + ident?: string; + /** + * Loader name. + */ + loader?: string; + /** + * Loader options. + */ + options?: string | { [index: string]: any }; + } + | ( + | undefined + | null + | string + | false + | 0 + | RuleSetUseFunction + | { + /** + * Unique loader options identifier. + */ + ident?: string; + /** + * Loader name. + */ + loader?: string; + /** + * Loader options. + */ + options?: string | { [index: string]: any }; + } + )[]; +type RuleSetUseItem = + | string + | RuleSetUseFunction + | { + /** + * Unique loader options identifier. + */ + ident?: string; + /** + * Loader name. + */ + loader?: string; + /** + * Loader options. + */ + options?: string | { [index: string]: any }; + }; +declare interface RunCallback { + (err: null | Error, result?: T): any; +} +declare class RuntimeChunkPlugin { + constructor(options?: { + /** + * The name factory for the runtime chunks. + */ + name?: (entrypoint: { name: string }) => string; + }); + options: { name: (entrypoint: { name: string }) => string }; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +type RuntimeCondition = undefined | string | boolean | SortableSet; +declare class RuntimeModule extends Module { + constructor(name: string, stage?: number); + name: string; + stage: number; + compilation?: Compilation; + chunk?: Chunk; + chunkGraph?: ChunkGraph; + fullHash: boolean; + dependentHash: boolean; + attach(compilation: Compilation, chunk: Chunk, chunkGraph?: ChunkGraph): void; + generate(): null | string; + getGeneratedCode(): null | string; + shouldIsolate(): boolean; + + /** + * Runtime modules without any dependencies to other runtime modules + */ + static STAGE_NORMAL: number; + + /** + * Runtime modules with simple dependencies on other runtime modules + */ + static STAGE_BASIC: number; + + /** + * Runtime modules which attach to handlers of other runtime modules + */ + static STAGE_ATTACH: number; + + /** + * Runtime modules which trigger actions on bootstrap + */ + static STAGE_TRIGGER: number; +} +declare interface RuntimeRequirementsContext { + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; + + /** + * the code generation results + */ + codeGenerationResults: CodeGenerationResults; +} +type RuntimeSpec = undefined | string | SortableSet; +declare class RuntimeSpecMap { + constructor(clone?: RuntimeSpecMap); + get(runtime: RuntimeSpec): undefined | R; + has(runtime: RuntimeSpec): boolean; + set(runtime: RuntimeSpec, value: R): void; + provide(runtime: RuntimeSpec, computer: () => R): R; + delete(runtime: RuntimeSpec): void; + update(runtime: RuntimeSpec, fn: (value?: R) => R): void; + keys(): RuntimeSpec[]; + values(): IterableIterator; + get size(): number; +} +declare class RuntimeSpecSet { + constructor(iterable?: Iterable); + add(runtime: RuntimeSpec): void; + has(runtime: RuntimeSpec): boolean; + get size(): number; + [Symbol.iterator](): IterableIterator; +} +declare abstract class RuntimeTemplate { + compilation: Compilation; + outputOptions: OutputNormalized; + requestShortener: RequestShortener; + globalObject: string; + contentHashReplacement: string; + isIIFE(): undefined | boolean; + isModule(): undefined | boolean; + isNeutralPlatform(): boolean; + supportsConst(): undefined | boolean; + supportsArrowFunction(): undefined | boolean; + supportsAsyncFunction(): undefined | boolean; + supportsOptionalChaining(): undefined | boolean; + supportsForOf(): undefined | boolean; + supportsDestructuring(): undefined | boolean; + supportsBigIntLiteral(): undefined | boolean; + supportsDynamicImport(): undefined | boolean; + supportsEcmaScriptModuleSyntax(): undefined | boolean; + supportTemplateLiteral(): undefined | boolean; + supportNodePrefixForCoreModules(): undefined | boolean; + returningFunction(returnValue: string, args?: string): string; + basicFunction(args: string, body: string | string[]): string; + concatenation(...args: (string | { expr: string })[]): string; + expressionFunction(expression: string, args?: string): string; + emptyFunction(): string; + destructureArray(items: string[], value: string): string; + destructureObject(items: string[], value: string): string; + iife(args: string, body: string): string; + forEach(variable: string, array: string, body: string | string[]): string; + + /** + * Add a comment + */ + comment(__0: { + /** + * request string used originally + */ + request?: string; + /** + * name of the chunk referenced + */ + chunkName?: null | string; + /** + * reason information of the chunk + */ + chunkReason?: string; + /** + * additional message + */ + message?: string; + /** + * name of the export + */ + exportName?: string; + }): string; + throwMissingModuleErrorBlock(__0: { + /** + * request string used originally + */ + request?: string; + }): string; + throwMissingModuleErrorFunction(__0: { + /** + * request string used originally + */ + request?: string; + }): string; + missingModule(__0: { + /** + * request string used originally + */ + request?: string; + }): string; + missingModuleStatement(__0: { + /** + * request string used originally + */ + request?: string; + }): string; + missingModulePromise(__0: { + /** + * request string used originally + */ + request?: string; + }): string; + weakError(__0: { + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; + /** + * the module + */ + module: Module; + /** + * the request that should be printed as comment + */ + request?: string; + /** + * expression to use as id expression + */ + idExpr?: string; + /** + * which kind of code should be returned + */ + type: "promise" | "expression" | "statements"; + }): string; + moduleId(__0: { + /** + * the module + */ + module: Module; + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; + /** + * the request that should be printed as comment + */ + request?: string; + /** + * if the dependency is weak (will create a nice error message) + */ + weak?: boolean; + }): string; + moduleRaw(__0: { + /** + * the module + */ + module: null | Module; + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; + /** + * the request that should be printed as comment + */ + request?: string; + /** + * if the dependency is weak (will create a nice error message) + */ + weak?: boolean; + /** + * if set, will be filled with runtime requirements + */ + runtimeRequirements: Set; + }): string; + moduleExports(__0: { + /** + * the module + */ + module: null | Module; + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; + /** + * the request that should be printed as comment + */ + request: string; + /** + * if the dependency is weak (will create a nice error message) + */ + weak?: boolean; + /** + * if set, will be filled with runtime requirements + */ + runtimeRequirements: Set; + }): string; + moduleNamespace(__0: { + /** + * the module + */ + module: Module; + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; + /** + * the request that should be printed as comment + */ + request: string; + /** + * if the current module is in strict esm mode + */ + strict?: boolean; + /** + * if the dependency is weak (will create a nice error message) + */ + weak?: boolean; + /** + * if set, will be filled with runtime requirements + */ + runtimeRequirements: Set; + }): string; + moduleNamespacePromise(__0: { + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; + /** + * the current dependencies block + */ + block?: AsyncDependenciesBlock; + /** + * the module + */ + module: Module; + /** + * the request that should be printed as comment + */ + request: string; + /** + * a message for the comment + */ + message: string; + /** + * if the current module is in strict esm mode + */ + strict?: boolean; + /** + * if the dependency is weak (will create a nice error message) + */ + weak?: boolean; + /** + * if set, will be filled with runtime requirements + */ + runtimeRequirements: Set; + }): string; + runtimeConditionExpression(__0: { + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; + /** + * runtime for which this code will be generated + */ + runtime?: RuntimeSpec; + /** + * only execute the statement in some runtimes + */ + runtimeCondition?: string | boolean | SortableSet; + /** + * if set, will be filled with runtime requirements + */ + runtimeRequirements: Set; + }): string; + importStatement(__0: { + /** + * whether a new variable should be created or the existing one updated + */ + update?: boolean; + /** + * the module + */ + module: Module; + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; + /** + * the request that should be printed as comment + */ + request: string; + /** + * name of the import variable + */ + importVar: string; + /** + * module in which the statement is emitted + */ + originModule: Module; + /** + * true, if this is a weak dependency + */ + weak?: boolean; + /** + * if set, will be filled with runtime requirements + */ + runtimeRequirements: Set; + }): [string, string]; + exportFromImport(__0: { + /** + * the module graph + */ + moduleGraph: ModuleGraph; + /** + * the module + */ + module: Module; + /** + * the request + */ + request: string; + /** + * the export name + */ + exportName: string | string[]; + /** + * the origin module + */ + originModule: Module; + /** + * true, if location is safe for ASI, a bracket can be emitted + */ + asiSafe?: boolean; + /** + * true, if expression will be called + */ + isCall: boolean; + /** + * when false, call context will not be preserved + */ + callContext: null | boolean; + /** + * when true and accessing the default exports, interop code will be generated + */ + defaultInterop: boolean; + /** + * the identifier name of the import variable + */ + importVar: string; + /** + * init fragments will be added here + */ + initFragments: InitFragment[]; + /** + * runtime for which this code will be generated + */ + runtime: RuntimeSpec; + /** + * if set, will be filled with runtime requirements + */ + runtimeRequirements: Set; + }): string; + blockPromise(__0: { + /** + * the async block + */ + block?: AsyncDependenciesBlock; + /** + * the message + */ + message: string; + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; + /** + * if set, will be filled with runtime requirements + */ + runtimeRequirements: Set; + }): string; + asyncModuleFactory(__0: { + /** + * the async block + */ + block: AsyncDependenciesBlock; + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; + /** + * if set, will be filled with runtime requirements + */ + runtimeRequirements: Set; + /** + * request string used originally + */ + request?: string; + }): string; + syncModuleFactory(__0: { + /** + * the dependency + */ + dependency: Dependency; + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; + /** + * if set, will be filled with runtime requirements + */ + runtimeRequirements: Set; + /** + * request string used originally + */ + request?: string; + }): string; + defineEsModuleFlagStatement(__0: { + /** + * the name of the exports object + */ + exportsArgument: string; + /** + * if set, will be filled with runtime requirements + */ + runtimeRequirements: Set; + }): string; +} +declare abstract class RuntimeValue { + fn: (value: { + module: NormalModule; + key: string; + readonly version: ValueCacheVersion; + }) => CodeValuePrimitive; + options: true | RuntimeValueOptions; + get fileDependencies(): true | string[]; + exec( + parser: JavascriptParser, + valueCacheVersions: Map>, + key: string + ): CodeValuePrimitive; + getCacheVersion(): undefined | string; +} +declare interface RuntimeValueOptions { + fileDependencies?: string[]; + contextDependencies?: string[]; + missingDependencies?: string[]; + buildDependencies?: string[]; + version?: string | (() => string); +} + +/** + * Helper function for joining two ranges into a single range. This is useful + * when working with AST nodes, as it allows you to combine the ranges of child nodes + * to create the range of the _parent node_. + */ +declare interface ScopeInfo { + definitions: StackedMap; + topLevelScope: boolean | "arrow"; + inShorthand: string | boolean; + inTaggedTemplateTag: boolean; + inTry: boolean; + isStrict: boolean; + isAsmJs: boolean; + terminated?: 1 | 2; +} +declare interface Selector { + (input: A): undefined | null | B; +} +declare abstract class Serializer { + serializeMiddlewares: SerializerMiddleware[]; + deserializeMiddlewares: SerializerMiddleware[]; + context?: Context; + serialize( + obj: DeserializedValue | Promise, + context: Context & ExtendedContext + ): Promise; + deserialize( + value: SerializedValue | Promise, + context: Context & ExtendedContext + ): Promise; +} +declare abstract class SerializerMiddleware< + DeserializedType, + SerializedType, + Context +> { + serialize( + data: DeserializedType, + context: Context + ): null | SerializedType | Promise; + deserialize( + data: SerializedType, + context: Context + ): DeserializedType | Promise; +} +declare class SharePlugin { + constructor(options: SharePluginOptions); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} + +/** + * Options for shared modules. + */ +declare interface SharePluginOptions { + /** + * Share scope name used for all shared modules (defaults to 'default'). + */ + shareScope?: string; + + /** + * Modules that should be shared in the share scope. When provided, property names are used to match requested modules in this compilation. + */ + shared: Shared; +} +type Shared = (string | SharedObject)[] | SharedObject; + +/** + * Advanced configuration for modules that should be shared in the share scope. + */ +declare interface SharedConfig { + /** + * Include the provided and fallback module directly instead behind an async request. This allows to use this shared module in initial load too. All possible shared modules need to be eager too. + */ + eager?: boolean; + + /** + * Provided module that should be provided to share scope. Also acts as fallback module if no shared module is found in share scope or version isn't valid. Defaults to the property name. + */ + import?: string | false; + + /** + * Package name to determine required version from description file. This is only needed when package name can't be automatically determined from request. + */ + packageName?: string; + + /** + * Version requirement from module in share scope. + */ + requiredVersion?: string | false; + + /** + * Module is looked up under this key from the share scope. + */ + shareKey?: string; + + /** + * Share scope name. + */ + shareScope?: string; + + /** + * Allow only a single version of the shared module in share scope (disabled by default). + */ + singleton?: boolean; + + /** + * Do not accept shared module if version is not valid (defaults to yes, if local fallback module is available and shared module is not a singleton, otherwise no, has no effect if there is no required version specified). + */ + strictVersion?: boolean; + + /** + * Version of the provided module. Will replace lower matching versions, but not higher. + */ + version?: string | false; +} + +/** + * Modules that should be shared in the share scope. Property names are used to match requested modules in this compilation. Relative requests are resolved, module requests are matched unresolved, absolute paths will match resolved requests. A trailing slash will match all requests with this prefix. In this case shareKey must also have a trailing slash. + */ +declare interface SharedObject { + [index: string]: string | SharedConfig; +} +declare class SideEffectsFlagPlugin { + constructor(analyseSource?: boolean); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; + static moduleHasSideEffects( + moduleName: string, + flagValue: undefined | string | boolean | string[], + cache: Map + ): undefined | boolean; +} +type SimpleType = "string" | "number" | "boolean"; +declare class SizeOnlySource extends Source { + constructor(size: number); +} +declare abstract class Snapshot { + startTime?: number; + fileTimestamps?: Map; + fileHashes?: Map; + fileTshs?: Map; + contextTimestamps?: Map; + contextHashes?: Map; + contextTshs?: Map; + missingExistence?: Map; + managedItemInfo?: Map; + managedFiles?: Set; + managedContexts?: Set; + managedMissing?: Set; + children?: Set; + hasStartTime(): boolean; + setStartTime(value: number): void; + setMergedStartTime(value: undefined | number, snapshot: Snapshot): void; + hasFileTimestamps(): boolean; + setFileTimestamps(value: Map): void; + hasFileHashes(): boolean; + setFileHashes(value: Map): void; + hasFileTshs(): boolean; + setFileTshs(value: Map): void; + hasContextTimestamps(): boolean; + setContextTimestamps( + value: Map + ): void; + hasContextHashes(): boolean; + setContextHashes(value: Map): void; + hasContextTshs(): boolean; + setContextTshs( + value: Map + ): void; + hasMissingExistence(): boolean; + setMissingExistence(value: Map): void; + hasManagedItemInfo(): boolean; + setManagedItemInfo(value: Map): void; + hasManagedFiles(): boolean; + setManagedFiles(value: Set): void; + hasManagedContexts(): boolean; + setManagedContexts(value: Set): void; + hasManagedMissing(): boolean; + setManagedMissing(value: Set): void; + hasChildren(): boolean; + setChildren(value: Set): void; + addChild(child: Snapshot): void; + serialize(__0: ObjectSerializerContext): void; + deserialize(__0: ObjectDeserializerContext): void; + getFileIterable(): Iterable; + getContextIterable(): Iterable; + getMissingIterable(): Iterable; +} +declare interface SnapshotOptionsFileSystemInfo { + /** + * should use hash to snapshot + */ + hash?: boolean; + + /** + * should use timestamp to snapshot + */ + timestamp?: boolean; +} + +/** + * Options affecting how file system snapshots are created and validated. + */ +declare interface SnapshotOptionsWebpackOptions { + /** + * Options for snapshotting build dependencies to determine if the whole cache need to be invalidated. + */ + buildDependencies?: { + /** + * Use hashes of the content of the files/directories to determine invalidation. + */ + hash?: boolean; + /** + * Use timestamps of the files/directories to determine invalidation. + */ + timestamp?: boolean; + }; + + /** + * List of paths that are managed by a package manager and contain a version or hash in its path so all files are immutable. + */ + immutablePaths?: (string | RegExp)[]; + + /** + * List of paths that are managed by a package manager and can be trusted to not be modified otherwise. + */ + managedPaths?: (string | RegExp)[]; + + /** + * Options for snapshotting dependencies of modules to determine if they need to be built again. + */ + module?: { + /** + * Use hashes of the content of the files/directories to determine invalidation. + */ + hash?: boolean; + /** + * Use timestamps of the files/directories to determine invalidation. + */ + timestamp?: boolean; + }; + + /** + * Options for snapshotting dependencies of request resolving to determine if requests need to be re-resolved. + */ + resolve?: { + /** + * Use hashes of the content of the files/directories to determine invalidation. + */ + hash?: boolean; + /** + * Use timestamps of the files/directories to determine invalidation. + */ + timestamp?: boolean; + }; + + /** + * Options for snapshotting the resolving of build dependencies to determine if the build dependencies need to be re-resolved. + */ + resolveBuildDependencies?: { + /** + * Use hashes of the content of the files/directories to determine invalidation. + */ + hash?: boolean; + /** + * Use timestamps of the files/directories to determine invalidation. + */ + timestamp?: boolean; + }; + + /** + * List of paths that are not managed by a package manager and the contents are subject to change. + */ + unmanagedPaths?: (string | RegExp)[]; +} +declare interface SortFunction { + (a: T, b: T): number; +} +declare abstract class SortableSet extends Set { + /** + * Sort with a comparer function + */ + sortWith(sortFn?: SortFunction): void; + sort(): SortableSet; + + /** + * Get data from cache + */ + getFromCache(fn: (set: SortableSet) => R): R; + + /** + * Get data from cache (ignoring sorting) + */ + getFromUnorderedCache(fn: (set: SortableSet) => R): R; + toJSON(): T[]; +} +declare class Source { + constructor(); + size(): number; + map(options?: MapOptions): null | RawSourceMap; + sourceAndMap(options?: MapOptions): { source: string | Buffer; map: Object }; + updateHash(hash: Hash): void; + source(): string | Buffer; + buffer(): Buffer; +} +declare interface SourceLike { + source(): string | Buffer; +} +declare interface SourceMap { + version: number; + sources: string[]; + mappings: string; + file?: string; + sourceRoot?: string; + sourcesContent?: string[]; + names?: string[]; + debugId?: string; +} +declare class SourceMapDevToolPlugin { + constructor(options?: SourceMapDevToolPluginOptions); + sourceMapFilename: string | false; + sourceMappingURLComment: + | string + | false + | ((pathData: PathData, assetInfo?: AssetInfo) => string); + moduleFilenameTemplate: string | ((context?: any) => string); + fallbackModuleFilenameTemplate: string | ((context?: any) => string); + namespace: string; + options: SourceMapDevToolPluginOptions; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface SourceMapDevToolPluginOptions { + /** + * Appends the given value to the original asset. Usually the #sourceMappingURL comment. [url] is replaced with a URL to the source map file. false disables the appending. + */ + append?: + | null + | string + | false + | ((pathData: PathData, assetInfo?: AssetInfo) => string); + + /** + * Indicates whether column mappings should be used (defaults to true). + */ + columns?: boolean; + + /** + * Emit debug IDs into source and SourceMap. + */ + debugIds?: boolean; + + /** + * Exclude modules that match the given value from source map generation. + */ + exclude?: string | RegExp | Rule[]; + + /** + * Generator string or function to create identifiers of modules for the 'sources' array in the SourceMap used only if 'moduleFilenameTemplate' would result in a conflict. + */ + fallbackModuleFilenameTemplate?: string | ((context?: any) => string); + + /** + * Path prefix to which the [file] placeholder is relative to. + */ + fileContext?: string; + + /** + * Defines the output filename of the SourceMap (will be inlined if no value is provided). + */ + filename?: null | string | false; + + /** + * Include source maps for module paths that match the given value. + */ + include?: string | RegExp | Rule[]; + + /** + * Indicates whether SourceMaps from loaders should be used (defaults to true). + */ + module?: boolean; + + /** + * Generator string or function to create identifiers of modules for the 'sources' array in the SourceMap. + */ + moduleFilenameTemplate?: string | ((context?: any) => string); + + /** + * Namespace prefix to allow multiple webpack roots in the devtools. + */ + namespace?: string; + + /** + * Omit the 'sourceContents' array from the SourceMap. + */ + noSources?: boolean; + + /** + * Provide a custom public path for the SourceMapping comment. + */ + publicPath?: string; + + /** + * Provide a custom value for the 'sourceRoot' property in the SourceMap. + */ + sourceRoot?: string; + + /** + * Include source maps for modules based on their extension (defaults to .js and .css). + */ + test?: string | RegExp | Rule[]; +} +declare class SourceMapSource extends Source { + constructor( + source: string | Buffer, + name: string, + sourceMap: string | Object | Buffer, + originalSource?: string | Buffer, + innerSourceMap?: string | Object | Buffer, + removeOriginalSource?: boolean + ); + getArgsAsBuffers(): [ + Buffer, + string, + Buffer, + undefined | Buffer, + undefined | Buffer, + boolean + ]; +} +declare interface SourcePosition { + line: number; + column?: number; +} +declare interface SplitChunksOptions { + chunksFilter: (chunk: Chunk) => undefined | boolean; + defaultSizeTypes: string[]; + minSize: SplitChunksSizes; + minSizeReduction: SplitChunksSizes; + minRemainingSize: SplitChunksSizes; + enforceSizeThreshold: SplitChunksSizes; + maxInitialSize: SplitChunksSizes; + maxAsyncSize: SplitChunksSizes; + minChunks: number; + maxAsyncRequests: number; + maxInitialRequests: number; + hidePathInfo: boolean; + filename?: string | ((pathData: PathData, assetInfo?: AssetInfo) => string); + automaticNameDelimiter: string; + getCacheGroups: ( + module: Module, + context: CacheGroupsContext + ) => null | CacheGroupSource[]; + getName: (module: Module, chunks: Chunk[], key: string) => undefined | string; + usedExports: boolean; + fallbackCacheGroup: FallbackCacheGroup; +} +declare class SplitChunksPlugin { + constructor(options?: OptimizationSplitChunksOptions); + options: SplitChunksOptions; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface SplitChunksSizes { + [index: string]: number; +} +declare abstract class StackedMap { + map: Map>; + stack: Map>[]; + set(item: K, value: V): void; + delete(item: K): void; + has(item: K): boolean; + get(item: K): Cell; + asArray(): K[]; + asSet(): Set; + asPairArray(): [K, Cell][]; + asMap(): Map>; + get size(): number; + createChild(): StackedMap; +} +type StartupRenderContext = RenderContextJavascriptModulesPlugin & { + inlined: boolean; +}; +declare interface StatFs { + ( + path: PathLikeFs, + callback: (err: null | NodeJS.ErrnoException, result?: IStats) => void + ): void; + ( + path: PathLikeFs, + options: undefined | (StatOptions & { bigint?: false }), + callback: (err: null | NodeJS.ErrnoException, result?: IStats) => void + ): void; + ( + path: PathLikeFs, + options: StatOptions & { bigint: true }, + callback: (err: null | NodeJS.ErrnoException, result?: IBigIntStats) => void + ): void; + ( + path: PathLikeFs, + options: undefined | StatOptions, + callback: ( + err: null | NodeJS.ErrnoException, + result?: IStats | IBigIntStats + ) => void + ): void; +} +declare interface StatOptions { + bigint?: boolean; +} +declare interface StatSync { + (path: PathLikeFs, options?: undefined): IStats; + ( + path: PathLikeFs, + options?: StatSyncOptions & { bigint?: false; throwIfNoEntry: false } + ): undefined | IStats; + ( + path: PathLikeFs, + options: StatSyncOptions & { bigint: true; throwIfNoEntry: false } + ): undefined | IBigIntStats; + (path: PathLikeFs, options?: StatSyncOptions & { bigint?: false }): IStats; + (path: PathLikeFs, options: StatSyncOptions & { bigint: true }): IBigIntStats; + ( + path: PathLikeFs, + options: StatSyncOptions & { bigint: boolean; throwIfNoEntry?: false } + ): IStats | IBigIntStats; + ( + path: PathLikeFs, + options?: StatSyncOptions + ): undefined | IStats | IBigIntStats; +} +declare interface StatSyncOptions { + bigint?: boolean; + throwIfNoEntry?: boolean; +} +declare interface StatTypes { + ( + path: PathLikeTypes, + callback: (arg0: null | NodeJS.ErrnoException, arg1?: IStats) => void + ): void; + ( + path: PathLikeTypes, + options: undefined | (StatOptions & { bigint?: false }), + callback: (arg0: null | NodeJS.ErrnoException, arg1?: IStats) => void + ): void; + ( + path: PathLikeTypes, + options: StatOptions & { bigint: true }, + callback: (arg0: null | NodeJS.ErrnoException, arg1?: IBigIntStats) => void + ): void; + ( + path: PathLikeTypes, + options: undefined | StatOptions, + callback: ( + arg0: null | NodeJS.ErrnoException, + arg1?: IStats | IBigIntStats + ) => void + ): void; +} +type Statement = + | FunctionDeclaration + | VariableDeclaration + | ClassDeclaration + | ExpressionStatement + | BlockStatement + | StaticBlock + | EmptyStatement + | DebuggerStatement + | WithStatement + | ReturnStatement + | LabeledStatement + | BreakStatement + | ContinueStatement + | IfStatement + | SwitchStatement + | ThrowStatement + | TryStatement + | WhileStatement + | DoWhileStatement + | ForStatement + | ForInStatement + | ForOfStatement; +type StatementPathItem = + | ImportDeclarationJavascriptParser + | ExportNamedDeclarationJavascriptParser + | ExportAllDeclarationJavascriptParser + | ImportExpressionImport + | UnaryExpression + | ArrayExpression + | ArrowFunctionExpression + | AssignmentExpression + | AwaitExpression + | BinaryExpression + | SimpleCallExpression + | NewExpression + | ChainExpression + | ClassExpression + | ConditionalExpression + | FunctionExpression + | Identifier + | SimpleLiteral + | RegExpLiteral + | BigIntLiteral + | LogicalExpression + | MemberExpression + | MetaProperty + | ObjectExpression + | SequenceExpression + | TaggedTemplateExpression + | TemplateLiteral + | ThisExpression + | UpdateExpression + | YieldExpression + | FunctionDeclaration + | MaybeNamedFunctionDeclaration + | VariableDeclaration + | ClassDeclaration + | MaybeNamedClassDeclaration + | ExpressionStatement + | BlockStatement + | StaticBlock + | EmptyStatement + | DebuggerStatement + | WithStatement + | ReturnStatement + | LabeledStatement + | BreakStatement + | ContinueStatement + | IfStatement + | SwitchStatement + | ThrowStatement + | TryStatement + | WhileStatement + | DoWhileStatement + | ForStatement + | ForInStatement + | ForOfStatement + | ExportDefaultDeclaration; +declare class Stats { + constructor(compilation: Compilation); + compilation: Compilation; + get hash(): string; + get startTime(): number; + get endTime(): number; + hasWarnings(): boolean; + hasErrors(): boolean; + toJson(options?: string | boolean | StatsOptions): StatsCompilation; + toString(options?: string | boolean | StatsOptions): string; +} +type StatsAsset = KnownStatsAsset & Record; +type StatsChunk = KnownStatsChunk & Record; +type StatsChunkGroup = KnownStatsChunkGroup & Record; +type StatsChunkOrigin = KnownStatsChunkOrigin & Record; +type StatsCompilation = KnownStatsCompilation & Record; +type StatsError = KnownStatsError & Record; +declare abstract class StatsFactory { + hooks: StatsFactoryHooks; + create( + type: string, + data: FactoryData, + baseContext: Omit + ): CreatedObject; +} +type StatsFactoryContext = KnownStatsFactoryContext & Record; +declare interface StatsFactoryHooks { + extract: HookMap< + SyncBailHook<[ObjectForExtract, any, StatsFactoryContext], void> + >; + filter: HookMap< + SyncBailHook<[any, StatsFactoryContext, number, number], boolean | void> + >; + sort: HookMap< + SyncBailHook< + [((a?: any, b?: any) => 0 | 1 | -1)[], StatsFactoryContext], + void + > + >; + filterSorted: HookMap< + SyncBailHook<[any, StatsFactoryContext, number, number], boolean | void> + >; + groupResults: HookMap< + SyncBailHook<[GroupConfig[], StatsFactoryContext], void> + >; + sortResults: HookMap< + SyncBailHook< + [((a?: any, b?: any) => 0 | 1 | -1)[], StatsFactoryContext], + void + > + >; + filterResults: HookMap< + SyncBailHook<[any, StatsFactoryContext, number, number], boolean | void> + >; + merge: HookMap>; + result: HookMap>; + getItemName: HookMap>; + getItemFactory: HookMap< + SyncBailHook<[any, StatsFactoryContext], void | StatsFactory> + >; +} +type StatsLogging = KnownStatsLogging & Record; +type StatsLoggingEntry = KnownStatsLoggingEntry & Record; +type StatsModule = KnownStatsModule & Record; +type StatsModuleIssuer = KnownStatsModuleIssuer & Record; +type StatsModuleReason = KnownStatsModuleReason & Record; +type StatsModuleTraceDependency = KnownStatsModuleTraceDependency & + Record; +type StatsModuleTraceItem = KnownStatsModuleTraceItem & Record; + +/** + * Stats options object. + */ +declare interface StatsOptions { + /** + * Fallback value for stats options when an option is not defined (has precedence over local webpack defaults). + */ + all?: boolean; + + /** + * Add assets information. + */ + assets?: boolean; + + /** + * Sort the assets by that field. + */ + assetsSort?: string | false; + + /** + * Space to display assets (groups will be collapsed to fit this space). + */ + assetsSpace?: number; + + /** + * Add built at time information. + */ + builtAt?: boolean; + + /** + * Add information about cached (not built) modules (deprecated: use 'cachedModules' instead). + */ + cached?: boolean; + + /** + * Show cached assets (setting this to `false` only shows emitted files). + */ + cachedAssets?: boolean; + + /** + * Add information about cached (not built) modules. + */ + cachedModules?: boolean; + + /** + * Add children information. + */ + children?: boolean; + + /** + * Display auxiliary assets in chunk groups. + */ + chunkGroupAuxiliary?: boolean; + + /** + * Display children of chunk groups. + */ + chunkGroupChildren?: boolean; + + /** + * Limit of assets displayed in chunk groups. + */ + chunkGroupMaxAssets?: number; + + /** + * Display all chunk groups with the corresponding bundles. + */ + chunkGroups?: boolean; + + /** + * Add built modules information to chunk information. + */ + chunkModules?: boolean; + + /** + * Space to display chunk modules (groups will be collapsed to fit this space, value is in number of modules/group). + */ + chunkModulesSpace?: number; + + /** + * Add the origins of chunks and chunk merging info. + */ + chunkOrigins?: boolean; + + /** + * Add information about parent, children and sibling chunks to chunk information. + */ + chunkRelations?: boolean; + + /** + * Add chunk information. + */ + chunks?: boolean; + + /** + * Sort the chunks by that field. + */ + chunksSort?: string | false; + + /** + * Enables/Disables colorful output. + */ + colors?: + | boolean + | { + /** + * Custom color for bold text. + */ + bold?: string; + /** + * Custom color for cyan text. + */ + cyan?: string; + /** + * Custom color for green text. + */ + green?: string; + /** + * Custom color for magenta text. + */ + magenta?: string; + /** + * Custom color for red text. + */ + red?: string; + /** + * Custom color for yellow text. + */ + yellow?: string; + }; + + /** + * Context directory for request shortening. + */ + context?: string; + + /** + * Show chunk modules that are dependencies of other modules of the chunk. + */ + dependentModules?: boolean; + + /** + * Add module depth in module graph. + */ + depth?: boolean; + + /** + * Display the entry points with the corresponding bundles. + */ + entrypoints?: boolean | "auto"; + + /** + * Add --env information. + */ + env?: boolean; + + /** + * Add cause to errors. + */ + errorCause?: boolean | "auto"; + + /** + * Add details to errors (like resolving log). + */ + errorDetails?: boolean | "auto"; + + /** + * Add nested errors to errors (like in AggregateError). + */ + errorErrors?: boolean | "auto"; + + /** + * Add internal stack trace to errors. + */ + errorStack?: boolean; + + /** + * Add errors. + */ + errors?: boolean; + + /** + * Add errors count. + */ + errorsCount?: boolean; + + /** + * Space to display errors (value is in number of lines). + */ + errorsSpace?: number; + + /** + * Please use excludeModules instead. + */ + exclude?: + | string + | boolean + | RegExp + | ModuleFilterItemTypes[] + | (( + name: string, + module: StatsModule, + type: "module" | "chunk" | "root-of-chunk" | "nested" + ) => boolean); + + /** + * Suppress assets that match the specified filters. Filters can be Strings, RegExps or Functions. + */ + excludeAssets?: + | string + | RegExp + | AssetFilterItemTypes[] + | ((name: string, asset: StatsAsset) => boolean); + + /** + * Suppress modules that match the specified filters. Filters can be Strings, RegExps, Booleans or Functions. + */ + excludeModules?: + | string + | boolean + | RegExp + | ModuleFilterItemTypes[] + | (( + name: string, + module: StatsModule, + type: "module" | "chunk" | "root-of-chunk" | "nested" + ) => boolean); + + /** + * Group assets by how their are related to chunks. + */ + groupAssetsByChunk?: boolean; + + /** + * Group assets by their status (emitted, compared for emit or cached). + */ + groupAssetsByEmitStatus?: boolean; + + /** + * Group assets by their extension. + */ + groupAssetsByExtension?: boolean; + + /** + * Group assets by their asset info (immutable, development, hotModuleReplacement, etc). + */ + groupAssetsByInfo?: boolean; + + /** + * Group assets by their path. + */ + groupAssetsByPath?: boolean; + + /** + * Group modules by their attributes (errors, warnings, assets, optional, orphan, or dependent). + */ + groupModulesByAttributes?: boolean; + + /** + * Group modules by their status (cached or built and cacheable). + */ + groupModulesByCacheStatus?: boolean; + + /** + * Group modules by their extension. + */ + groupModulesByExtension?: boolean; + + /** + * Group modules by their layer. + */ + groupModulesByLayer?: boolean; + + /** + * Group modules by their path. + */ + groupModulesByPath?: boolean; + + /** + * Group modules by their type. + */ + groupModulesByType?: boolean; + + /** + * Group reasons by their origin module. + */ + groupReasonsByOrigin?: boolean; + + /** + * Add the hash of the compilation. + */ + hash?: boolean; + + /** + * Add ids. + */ + ids?: boolean; + + /** + * Add logging output. + */ + logging?: boolean | "none" | "error" | "warn" | "info" | "log" | "verbose"; + + /** + * Include debug logging of specified loggers (i. e. for plugins or loaders). Filters can be Strings, RegExps or Functions. + */ + loggingDebug?: + | string + | boolean + | RegExp + | FilterItemTypes[] + | ((value: string) => boolean); + + /** + * Add stack traces to logging output. + */ + loggingTrace?: boolean; + + /** + * Add information about assets inside modules. + */ + moduleAssets?: boolean; + + /** + * Add dependencies and origin of warnings/errors. + */ + moduleTrace?: boolean; + + /** + * Add built modules information. + */ + modules?: boolean; + + /** + * Sort the modules by that field. + */ + modulesSort?: string | false; + + /** + * Space to display modules (groups will be collapsed to fit this space, value is in number of modules/groups). + */ + modulesSpace?: number; + + /** + * Add information about modules nested in other modules (like with module concatenation). + */ + nestedModules?: boolean; + + /** + * Space to display modules nested within other modules (groups will be collapsed to fit this space, value is in number of modules/group). + */ + nestedModulesSpace?: number; + + /** + * Show reasons why optimization bailed out for modules. + */ + optimizationBailout?: boolean; + + /** + * Add information about orphan modules. + */ + orphanModules?: boolean; + + /** + * Add output path information. + */ + outputPath?: boolean; + + /** + * Add performance hint flags. + */ + performance?: boolean; + + /** + * Preset for the default values. + */ + preset?: string | boolean; + + /** + * Show exports provided by modules. + */ + providedExports?: boolean; + + /** + * Add public path information. + */ + publicPath?: boolean; + + /** + * Add information about the reasons why modules are included. + */ + reasons?: boolean; + + /** + * Space to display reasons (groups will be collapsed to fit this space). + */ + reasonsSpace?: number; + + /** + * Add information about assets that are related to other assets (like SourceMaps for assets). + */ + relatedAssets?: boolean; + + /** + * Add information about runtime modules (deprecated: use 'runtimeModules' instead). + */ + runtime?: boolean; + + /** + * Add information about runtime modules. + */ + runtimeModules?: boolean; + + /** + * Add the source code of modules. + */ + source?: boolean; + + /** + * Add timing information. + */ + timings?: boolean; + + /** + * Show exports used by modules. + */ + usedExports?: boolean; + + /** + * Add webpack version information. + */ + version?: boolean; + + /** + * Add warnings. + */ + warnings?: boolean; + + /** + * Add warnings count. + */ + warningsCount?: boolean; + + /** + * Suppress listing warnings that match the specified filters (they will still be counted). Filters can be Strings, RegExps or Functions. + */ + warningsFilter?: + | string + | RegExp + | WarningFilterItemTypes[] + | ((warning: StatsError, value: string) => boolean); + + /** + * Space to display warnings (value is in number of lines). + */ + warningsSpace?: number; +} +declare interface StatsPrintHooks { + sortElements: HookMap>; + printElements: HookMap< + SyncBailHook< + [PrintedElement[], StatsPrinterContext], + undefined | string | void + > + >; + sortItems: HookMap< + SyncBailHook<[any[], StatsPrinterContext], boolean | void> + >; + getItemName: HookMap>; + printItems: HookMap< + SyncBailHook<[string[], StatsPrinterContext], undefined | string> + >; + print: HookMap< + SyncBailHook<[any, StatsPrinterContext], undefined | string | void> + >; + result: HookMap>; +} +declare abstract class StatsPrinter { + hooks: StatsPrintHooks; + print( + type: string, + object?: any, + baseContext?: StatsPrinterContext + ): undefined | string; +} +type StatsPrinterContext = KnownStatsPrinterColorFunctions & + KnownStatsPrinterFormatters & + KnownStatsPrinterContext & + Record; +type StatsProfile = KnownStatsProfile & Record; +type StatsValue = + | boolean + | StatsOptions + | "none" + | "verbose" + | "summary" + | "errors-only" + | "errors-warnings" + | "minimal" + | "normal" + | "detailed"; +type Supports = undefined | string; +declare class SyncModuleIdsPlugin { + constructor(__0: SyncModuleIdsPluginOptions); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface SyncModuleIdsPluginOptions { + /** + * path to file + */ + path: string; + + /** + * context for module names + */ + context?: string; + + /** + * selector for modules + */ + test?: (module: Module) => boolean; + + /** + * operation mode (defaults to merge) + */ + mode?: "read" | "create" | "merge" | "update"; +} +declare interface SyntheticDependencyLocation { + name: string; + index?: number; +} +declare const TOMBSTONE: unique symbol; +declare const TRANSITIVE: unique symbol; +declare const TRANSITIVE_ONLY: unique symbol; +declare interface TagData { + [index: string]: any; +} +declare interface TagInfo { + tag: symbol; + data?: TagData; + next?: TagInfo; +} +declare interface TargetItemWithConnection { + module: Module; + connection: ModuleGraphConnection; + export?: string[]; +} +declare interface TargetItemWithoutConnection { + module: Module; + export: string[]; +} +declare class Template { + constructor(); + static getFunctionContent(fn: T): string; + static toIdentifier(str: string): string; + static toComment(str: string): string; + static toNormalComment(str: string): string; + static toPath(str: string): string; + static numberToIdentifier(n: number): string; + static numberToIdentifierContinuation(n: number): string; + static indent(s: string | string[]): string; + static prefix(s: string | string[], prefix: string): string; + static asString(str: string | string[]): string; + static getModulesArrayBounds(modules: WithId[]): false | [number, number]; + static renderChunkModules( + renderContext: ChunkRenderContextJavascriptModulesPlugin, + modules: Module[], + renderModule: (module: Module) => null | Source, + prefix?: string + ): null | Source; + static renderRuntimeModules( + runtimeModules: RuntimeModule[], + renderContext: RenderContextJavascriptModulesPlugin & { + codeGenerationResults?: CodeGenerationResults; + } + ): Source; + static renderChunkRuntimeModules( + runtimeModules: RuntimeModule[], + renderContext: RenderContextJavascriptModulesPlugin + ): Source; + static NUMBER_OF_IDENTIFIER_START_CHARS: number; + static NUMBER_OF_IDENTIFIER_CONTINUATION_CHARS: number; +} +type TemplatePath = + | string + | ((pathData: PathData, assetInfo?: AssetInfo) => string); +declare interface TimestampAndHash { + safeTime: number; + timestamp?: number; + hash: string; +} +declare class TopLevelSymbol { + constructor(name: string); + name: string; +} + +/** + * Use a Trusted Types policy to create urls for chunks. + */ +declare interface TrustedTypes { + /** + * If the call to `trustedTypes.createPolicy(...)` fails -- e.g., due to the policy name missing from the CSP `trusted-types` list, or it being a duplicate name, etc. -- controls whether to continue with loading in the hope that `require-trusted-types-for 'script'` isn't enforced yet, versus fail immediately. Default behavior is 'stop'. + */ + onPolicyCreationFailure?: "continue" | "stop"; + + /** + * The name of the Trusted Types policy created by webpack to serve bundle chunks. + */ + policyName?: string; +} +declare const UNDEFINED_MARKER: unique symbol; + +/** + * `URL` class is a global reference for `require('url').URL` + * https://nodejs.org/api/url.html#the-whatwg-url-api + */ +declare interface URL_url extends URL {} +type UnsafeCacheData = KnownUnsafeCacheData & Record; +declare interface UpdateHashContextDependency { + chunkGraph: ChunkGraph; + runtime: RuntimeSpec; + runtimeTemplate?: RuntimeTemplate; +} +declare interface UpdateHashContextGenerator { + /** + * the module + */ + module: NormalModule; + chunkGraph: ChunkGraph; + runtime: RuntimeSpec; + runtimeTemplate?: RuntimeTemplate; +} +type UsageStateType = 0 | 1 | 2 | 3 | 4; +type UsedName = string | false | string[]; +type Value = string | number | boolean | RegExp; +type ValueCacheVersion = string | Set; +declare class VariableInfo { + constructor( + declaredScope: ScopeInfo, + freeName?: string | true, + tagInfo?: TagInfo + ); + declaredScope: ScopeInfo; + freeName?: string | true; + tagInfo?: TagInfo; +} +type WarningFilterItemTypes = + | string + | RegExp + | ((warning: StatsError, value: string) => boolean); +declare interface WatchFileSystem { + watch: ( + files: Iterable, + directories: Iterable, + missing: Iterable, + startTime: number, + options: WatchOptions, + callback: ( + err: null | Error, + timeInfoEntries1?: Map, + timeInfoEntries2?: Map, + changes?: Set, + removals?: Set + ) => void, + callbackUndelayed: (value: string, num: number) => void + ) => Watcher; +} +declare class WatchIgnorePlugin { + constructor(options: WatchIgnorePluginOptions); + paths: (string | RegExp)[]; + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare interface WatchIgnorePluginOptions { + /** + * A list of RegExps or absolute paths to directories or files that should be ignored. + */ + paths: (string | RegExp)[]; +} + +/** + * Options for the watcher. + */ +declare interface WatchOptions { + /** + * Delay the rebuilt after the first change. Value is a time in ms. + */ + aggregateTimeout?: number; + + /** + * Resolve symlinks and watch symlink and real file. This is usually not needed as webpack already resolves symlinks ('resolve.symlinks'). + */ + followSymlinks?: boolean; + + /** + * Ignore some files from watching (glob pattern or regexp). + */ + ignored?: string | RegExp | string[]; + + /** + * Enable polling mode for watching. + */ + poll?: number | boolean; + + /** + * Stop watching when stdin stream has ended. + */ + stdin?: boolean; +} +declare interface Watcher { + /** + * closes the watcher and all underlying file watchers + */ + close: () => void; + + /** + * closes the watcher, but keeps underlying file watchers alive until the next watch call + */ + pause: () => void; + + /** + * get current aggregated changes that have not yet send to callback + */ + getAggregatedChanges?: () => null | Set; + + /** + * get current aggregated removals that have not yet send to callback + */ + getAggregatedRemovals?: () => null | Set; + + /** + * get info about files + */ + getFileTimeInfoEntries: () => Map; + + /** + * get info about directories + */ + getContextTimeInfoEntries: () => Map; + + /** + * get info about timestamps and changes + */ + getInfo?: () => WatcherInfo; +} +declare interface WatcherInfo { + /** + * get current aggregated changes that have not yet send to callback + */ + changes: null | Set; + + /** + * get current aggregated removals that have not yet send to callback + */ + removals: null | Set; + + /** + * get info about files + */ + fileTimeInfoEntries: Map; + + /** + * get info about directories + */ + contextTimeInfoEntries: Map; +} +declare abstract class Watching { + startTime: null | number; + invalid: boolean; + handler: CallbackFunction_1; + callbacks: CallbackFunction_1[]; + closed: boolean; + suspended: boolean; + blocked: boolean; + watchOptions: WatchOptions; + compiler: Compiler; + running: boolean; + watcher?: null | Watcher; + pausedWatcher?: null | Watcher; + lastWatcherStartTime?: number; + watch( + files: Iterable, + dirs: Iterable, + missing: Iterable + ): void; + invalidate(callback?: CallbackFunction_1): void; + suspend(): void; + resume(): void; + close(callback: CallbackFunction_1): void; +} +declare abstract class WeakTupleMap { + set(...args: [K, ...V[]]): void; + has(...args: K): boolean; + get(...args: K): undefined | V; + provide(...args: [K, ...((...args: K) => V)[]]): V; + delete(...args: K): void; + clear(): void; +} +declare interface WebAssemblyRenderContext { + /** + * the chunk + */ + chunk: Chunk; + + /** + * the dependency templates + */ + dependencyTemplates: DependencyTemplates; + + /** + * the runtime template + */ + runtimeTemplate: RuntimeTemplate; + + /** + * the module graph + */ + moduleGraph: ModuleGraph; + + /** + * the chunk graph + */ + chunkGraph: ChunkGraph; + + /** + * results of code generation + */ + codeGenerationResults: CodeGenerationResults; +} +declare class WebWorkerTemplatePlugin { + constructor(); + + /** + * Apply the plugin + */ + apply(compiler: Compiler): void; +} +declare class WebpackError extends Error { + /** + * Creates an instance of WebpackError. + */ + constructor(message?: string, options?: { cause?: unknown }); + [index: number]: () => string; + details?: string; + module?: null | Module; + loc?: SyntheticDependencyLocation | RealDependencyLocation; + hideStack?: boolean; + chunk?: Chunk; + file?: string; + serialize(__0: ObjectSerializerContext): void; + deserialize(__0: ObjectDeserializerContext): void; + cause: any; + + /** + * Creates a `.stack` property on `targetObject`, which when accessed returns + * a string representing the location in the code at which + * `Error.captureStackTrace()` was called. + * ```js + * const myObject = {}; + * Error.captureStackTrace(myObject); + * myObject.stack; // Similar to `new Error().stack` + * ``` + * The first line of the trace will be prefixed with + * `${myObject.name}: ${myObject.message}`. + * The optional `constructorOpt` argument accepts a function. If given, all frames + * above `constructorOpt`, including `constructorOpt`, will be omitted from the + * generated stack trace. + * The `constructorOpt` argument is useful for hiding implementation + * details of error generation from the user. For instance: + * ```js + * function a() { + * b(); + * } + * function b() { + * c(); + * } + * function c() { + * // Create an error without stack trace to avoid calculating the stack trace twice. + * const { stackTraceLimit } = Error; + * Error.stackTraceLimit = 0; + * const error = new Error(); + * Error.stackTraceLimit = stackTraceLimit; + * // Capture the stack trace above function b + * Error.captureStackTrace(error, b); // Neither function c, nor b is included in the stack trace + * throw error; + * } + * a(); + * ``` + */ + static captureStackTrace( + targetObject: object, + constructorOpt?: Function + ): void; + static prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any; + + /** + * The `Error.stackTraceLimit` property specifies the number of stack frames + * collected by a stack trace (whether generated by `new Error().stack` or + * `Error.captureStackTrace(obj)`). + * The default value is `10` but may be set to any valid JavaScript number. Changes + * will affect any stack trace captured _after_ the value has been changed. + * If set to a non-number value, or set to a negative number, stack traces will + * not capture any frames. + */ + static stackTraceLimit: number; +} +declare abstract class WebpackLogger { + getChildLogger: (name: string | (() => string)) => WebpackLogger; + error(...args: any[]): void; + warn(...args: any[]): void; + info(...args: any[]): void; + log(...args: any[]): void; + debug(...args: any[]): void; + assert(assertion: any, ...args: any[]): void; + trace(): void; + clear(): void; + status(...args: any[]): void; + group(...args: any[]): void; + groupCollapsed(...args: any[]): void; + groupEnd(): void; + profile(label?: string): void; + profileEnd(label?: string): void; + time(label: string): void; + timeLog(label?: string): void; + timeEnd(label?: string): void; + timeAggregate(label?: string): void; + timeAggregateEnd(label?: string): void; +} +declare class WebpackOptionsApply extends OptionsApply { + constructor(); +} +declare class WebpackOptionsDefaulter { + constructor(); + process(options: Configuration): WebpackOptionsNormalized; +} + +/** + * Normalized webpack options object. + */ +declare interface WebpackOptionsNormalized { + /** + * Set the value of `require.amd` and `define.amd`. Or disable AMD support. + */ + amd?: false | { [index: string]: any }; + + /** + * Report the first error as a hard error instead of tolerating it. + */ + bail?: boolean; + + /** + * Cache generated modules and chunks to improve performance for multiple incremental builds. + */ + cache: CacheOptionsNormalized; + + /** + * The base directory (absolute path!) for resolving the `entry` option. If `output.pathinfo` is set, the included pathinfo is shortened to this directory. + */ + context?: string; + + /** + * References to other configurations to depend on. + */ + dependencies?: string[]; + + /** + * Options for the webpack-dev-server. + */ + devServer?: false | { [index: string]: any }; + + /** + * A developer tool to enhance debugging (false | eval | [inline-|hidden-|eval-][nosources-][cheap-[module-]]source-map). + */ + devtool?: string | false; + + /** + * The entry point(s) of the compilation. + */ + entry: EntryNormalized; + + /** + * Enables/Disables experiments (experimental features with relax SemVer compatibility). + */ + experiments: ExperimentsNormalized; + + /** + * Specify dependencies that shouldn't be resolved by webpack, but should become dependencies of the resulting bundle. The kind of the dependency depends on `output.libraryTarget`. + */ + externals: Externals; + + /** + * Enable presets of externals for specific targets. + */ + externalsPresets: ExternalsPresets; + + /** + * Specifies the default type of externals ('amd*', 'umd*', 'system' and 'jsonp' depend on output.libraryTarget set to the same value). + */ + externalsType?: + | "import" + | "var" + | "module" + | "assign" + | "this" + | "window" + | "self" + | "global" + | "commonjs" + | "commonjs2" + | "commonjs-module" + | "commonjs-static" + | "amd" + | "amd-require" + | "umd" + | "umd2" + | "jsonp" + | "system" + | "promise" + | "module-import" + | "script" + | "node-commonjs"; + + /** + * Ignore specific warnings. + */ + ignoreWarnings?: ((warning: Error, compilation: Compilation) => boolean)[]; + + /** + * Options for infrastructure level logging. + */ + infrastructureLogging: InfrastructureLogging; + + /** + * Custom values available in the loader context. + */ + loader?: Loader; + + /** + * Enable production optimizations or development hints. + */ + mode?: "none" | "development" | "production"; + + /** + * Options affecting the normal modules (`NormalModuleFactory`). + */ + module: ModuleOptionsNormalized; + + /** + * Name of the configuration. Used when loading multiple configurations. + */ + name?: string; + + /** + * Include polyfills or mocks for various node stuff. + */ + node: Node; + + /** + * Enables/Disables integrated optimizations. + */ + optimization: OptimizationNormalized; + + /** + * Normalized options affecting the output of the compilation. `output` options tell webpack how to write the compiled files to disk. + */ + output: OutputNormalized; + + /** + * The number of parallel processed modules in the compilation. + */ + parallelism?: number; + + /** + * Configuration for web performance recommendations. + */ + performance?: false | PerformanceOptions; + + /** + * Add additional plugins to the compiler. + */ + plugins: ( + | undefined + | null + | false + | "" + | 0 + | ((this: Compiler, compiler: Compiler) => void) + | WebpackPluginInstance + )[]; + + /** + * Capture timing information for each module. + */ + profile?: boolean; + + /** + * Store compiler state to a json file. + */ + recordsInputPath?: string | false; + + /** + * Load compiler state from a json file. + */ + recordsOutputPath?: string | false; + + /** + * Options for the resolver. + */ + resolve: ResolveOptions; + + /** + * Options for the resolver when resolving loaders. + */ + resolveLoader: ResolveOptions; + + /** + * Options affecting how file system snapshots are created and validated. + */ + snapshot: SnapshotOptionsWebpackOptions; + + /** + * Stats options object or preset name. + */ + stats: StatsValue; + + /** + * Environment to build for. An array of environments to build for all of them when possible. + */ + target?: string | false | string[]; + + /** + * Enter watch mode, which rebuilds on file change. + */ + watch?: boolean; + + /** + * Options for the watcher. + */ + watchOptions: WatchOptions; +} + +/** + * Plugin instance. + */ +declare interface WebpackPluginInstance { + [index: string]: any; + + /** + * The run point of the plugin, required method. + */ + apply: (compiler: Compiler) => void; +} + +declare interface WebpackRequire { + (id: string): any; + i?: ((options: ExecuteOptions) => void)[]; + c?: Record; +} +declare interface WithId { + id: string | number; +} +declare interface WithOptions { + /** + * create a resolver with additional/different options + */ + withOptions: ( + options: Partial + ) => ResolverWithOptions; +} +declare interface WriteFile { + ( + file: PathOrFileDescriptorFs, + data: + | string + | Uint8Array + | Uint8ClampedArray + | Uint16Array + | Uint32Array + | Int8Array + | Int16Array + | Int32Array + | BigUint64Array + | BigInt64Array + | Float32Array + | Float64Array + | DataView, + options: WriteFileOptions, + callback: (err: null | NodeJS.ErrnoException) => void + ): void; + ( + file: PathOrFileDescriptorFs, + data: + | string + | Uint8Array + | Uint8ClampedArray + | Uint16Array + | Uint32Array + | Int8Array + | Int16Array + | Int32Array + | BigUint64Array + | BigInt64Array + | Float32Array + | Float64Array + | DataView, + callback: (err: null | NodeJS.ErrnoException) => void + ): void; +} +type WriteFileOptions = + | null + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "base64" + | "base64url" + | "latin1" + | "binary" + | "hex" + | (ObjectEncodingOptions & + Abortable & { mode?: string | number; flag?: string; flush?: boolean }); +declare interface WriteOnlySet { + add: (item: T) => void; +} + +declare interface WriteStreamOptions { + flags?: string; + encoding?: + | "ascii" + | "utf8" + | "utf-8" + | "utf16le" + | "utf-16le" + | "ucs2" + | "ucs-2" + | "base64" + | "base64url" + | "latin1" + | "binary" + | "hex"; + fd?: any; + mode?: number; + autoClose?: boolean; + emitClose?: boolean; + start?: number; + signal?: null | AbortSignal; + fs?: null | CreateWriteStreamFSImplementation; +} +declare function exports( + options: Configuration, + callback?: CallbackWebpack +): Compiler; +declare function exports( + options: ReadonlyArray & MultiCompilerOptions, + callback?: CallbackWebpack +): MultiCompiler; +declare namespace exports { + export const webpack: { + (options: Configuration, callback?: CallbackWebpack): Compiler; + ( + options: ReadonlyArray & MultiCompilerOptions, + callback?: CallbackWebpack + ): MultiCompiler; + }; + export const validate: ( + configuration: Configuration | Configuration[] + ) => void; + export const validateSchema: ( + schema: Parameters[0], + options: Parameters[1], + validationConfiguration?: ValidationErrorConfiguration + ) => void; + export const version: string; + export namespace cli { + export let getArguments: ( + schema?: + | (JSONSchema4 & { + absolutePath: boolean; + instanceof: string; + cli: { + helper?: boolean; + exclude?: boolean; + description?: string; + negatedDescription?: string; + resetDescription?: string; + }; + }) + | (JSONSchema6 & { + absolutePath: boolean; + instanceof: string; + cli: { + helper?: boolean; + exclude?: boolean; + description?: string; + negatedDescription?: string; + resetDescription?: string; + }; + }) + | (JSONSchema7 & { + absolutePath: boolean; + instanceof: string; + cli: { + helper?: boolean; + exclude?: boolean; + description?: string; + negatedDescription?: string; + resetDescription?: string; + }; + }) + ) => Flags; + export let processArguments: ( + args: Flags, + config: any, + values: Record + ) => null | Problem[]; + } + export namespace ModuleFilenameHelpers { + export let ALL_LOADERS_RESOURCE: string; + export let REGEXP_ALL_LOADERS_RESOURCE: RegExp; + export let LOADERS_RESOURCE: string; + export let REGEXP_LOADERS_RESOURCE: RegExp; + export let RESOURCE: string; + export let REGEXP_RESOURCE: RegExp; + export let ABSOLUTE_RESOURCE_PATH: string; + export let REGEXP_ABSOLUTE_RESOURCE_PATH: RegExp; + export let RESOURCE_PATH: string; + export let REGEXP_RESOURCE_PATH: RegExp; + export let ALL_LOADERS: string; + export let REGEXP_ALL_LOADERS: RegExp; + export let LOADERS: string; + export let REGEXP_LOADERS: RegExp; + export let QUERY: string; + export let REGEXP_QUERY: RegExp; + export let ID: string; + export let REGEXP_ID: RegExp; + export let HASH: string; + export let REGEXP_HASH: RegExp; + export let NAMESPACE: string; + export let REGEXP_NAMESPACE: RegExp; + export let createFilename: ( + module: string | Module, + options: { + namespace?: string; + moduleFilenameTemplate?: string | ((context?: any) => string); + }, + __2: { + requestShortener: RequestShortener; + chunkGraph: ChunkGraph; + hashFunction?: string | typeof Hash; + } + ) => string; + export let replaceDuplicates: ( + array: T[], + fn: ( + duplicateItem: T, + duplicateItemIndex: number, + numberOfTimesReplaced: number + ) => T, + comparator?: (firstElement: T, nextElement: T) => 0 | 1 | -1 + ) => T[]; + export let matchPart: (str: string, test: Matcher) => boolean; + export let matchObject: (obj: MatchObject, str: string) => boolean; + } + export namespace OptimizationStages { + export let STAGE_BASIC: -10; + export let STAGE_DEFAULT: 0; + export let STAGE_ADVANCED: 10; + } + export namespace RuntimeGlobals { + export let require: "__webpack_require__"; + export let requireScope: "__webpack_require__.*"; + export let exports: "__webpack_exports__"; + export let thisAsExports: "top-level-this-exports"; + export let returnExportsFromRuntime: "return-exports-from-runtime"; + export let module: "module"; + export let moduleId: "module.id"; + export let moduleLoaded: "module.loaded"; + export let publicPath: "__webpack_require__.p"; + export let entryModuleId: "__webpack_require__.s"; + export let moduleCache: "__webpack_require__.c"; + export let moduleFactories: "__webpack_require__.m"; + export let moduleFactoriesAddOnly: "__webpack_require__.m (add only)"; + export let ensureChunk: "__webpack_require__.e"; + export let ensureChunkHandlers: "__webpack_require__.f"; + export let ensureChunkIncludeEntries: "__webpack_require__.f (include entries)"; + export let prefetchChunk: "__webpack_require__.E"; + export let prefetchChunkHandlers: "__webpack_require__.F"; + export let preloadChunk: "__webpack_require__.G"; + export let preloadChunkHandlers: "__webpack_require__.H"; + export let definePropertyGetters: "__webpack_require__.d"; + export let makeNamespaceObject: "__webpack_require__.r"; + export let createFakeNamespaceObject: "__webpack_require__.t"; + export let compatGetDefaultExport: "__webpack_require__.n"; + export let harmonyModuleDecorator: "__webpack_require__.hmd"; + export let nodeModuleDecorator: "__webpack_require__.nmd"; + export let getFullHash: "__webpack_require__.h"; + export let wasmInstances: "__webpack_require__.w"; + export let instantiateWasm: "__webpack_require__.v"; + export let uncaughtErrorHandler: "__webpack_require__.oe"; + export let scriptNonce: "__webpack_require__.nc"; + export let loadScript: "__webpack_require__.l"; + export let createScript: "__webpack_require__.ts"; + export let createScriptUrl: "__webpack_require__.tu"; + export let getTrustedTypesPolicy: "__webpack_require__.tt"; + export let hasFetchPriority: "has fetch priority"; + export let chunkName: "__webpack_require__.cn"; + export let runtimeId: "__webpack_require__.j"; + export let getChunkScriptFilename: "__webpack_require__.u"; + export let getChunkCssFilename: "__webpack_require__.k"; + export let hasCssModules: "has css modules"; + export let getChunkUpdateScriptFilename: "__webpack_require__.hu"; + export let getChunkUpdateCssFilename: "__webpack_require__.hk"; + export let startup: "__webpack_require__.x"; + export let startupNoDefault: "__webpack_require__.x (no default handler)"; + export let startupOnlyAfter: "__webpack_require__.x (only after)"; + export let startupOnlyBefore: "__webpack_require__.x (only before)"; + export let chunkCallback: "webpackChunk"; + export let startupEntrypoint: "__webpack_require__.X"; + export let onChunksLoaded: "__webpack_require__.O"; + export let externalInstallChunk: "__webpack_require__.C"; + export let interceptModuleExecution: "__webpack_require__.i"; + export let global: "__webpack_require__.g"; + export let shareScopeMap: "__webpack_require__.S"; + export let initializeSharing: "__webpack_require__.I"; + export let currentRemoteGetScope: "__webpack_require__.R"; + export let getUpdateManifestFilename: "__webpack_require__.hmrF"; + export let hmrDownloadManifest: "__webpack_require__.hmrM"; + export let hmrDownloadUpdateHandlers: "__webpack_require__.hmrC"; + export let hmrModuleData: "__webpack_require__.hmrD"; + export let hmrInvalidateModuleHandlers: "__webpack_require__.hmrI"; + export let hmrRuntimeStatePrefix: "__webpack_require__.hmrS"; + export let amdDefine: "__webpack_require__.amdD"; + export let amdOptions: "__webpack_require__.amdO"; + export let system: "__webpack_require__.System"; + export let hasOwnProperty: "__webpack_require__.o"; + export let systemContext: "__webpack_require__.y"; + export let baseURI: "__webpack_require__.b"; + export let relativeUrl: "__webpack_require__.U"; + export let asyncModule: "__webpack_require__.a"; + } + export const UsageState: Readonly<{ + Unused: 0; + OnlyPropertiesUsed: 1; + NoInfo: 2; + Unknown: 3; + Used: 4; + }>; + export namespace cache { + export { MemoryCachePlugin }; + } + export namespace config { + export const getNormalizedWebpackOptions: ( + config: Configuration + ) => WebpackOptionsNormalized; + export const applyWebpackOptionsDefaults: ( + options: WebpackOptionsNormalized, + compilerIndex?: number + ) => ResolvedOptions; + } + export namespace dependencies { + export { + ModuleDependency, + HarmonyImportDependency, + ConstDependency, + NullDependency + }; + } + export namespace ids { + export { + ChunkModuleIdRangePlugin, + NaturalModuleIdsPlugin, + OccurrenceModuleIdsPlugin, + NamedModuleIdsPlugin, + DeterministicChunkIdsPlugin, + DeterministicModuleIdsPlugin, + NamedChunkIdsPlugin, + OccurrenceChunkIdsPlugin, + HashedModuleIdsPlugin + }; + } + export namespace javascript { + export { + EnableChunkLoadingPlugin, + JavascriptModulesPlugin, + JavascriptParser + }; + } + export namespace optimize { + export namespace InnerGraph { + export let bailout: (parserState: ParserState) => void; + export let enable: (parserState: ParserState) => void; + export let isEnabled: (parserState: ParserState) => boolean; + export let addUsage: ( + state: ParserState, + symbol: null | TopLevelSymbol, + usage: string | true | TopLevelSymbol + ) => void; + export let addVariableUsage: ( + parser: JavascriptParser, + name: string, + usage: string | true | TopLevelSymbol + ) => void; + export let inferDependencyUsage: (state: ParserState) => void; + export let onUsage: ( + state: ParserState, + onUsageCallback: (value?: boolean | Set) => void + ) => void; + export let setTopLevelSymbol: ( + state: ParserState, + symbol?: TopLevelSymbol + ) => void; + export let getTopLevelSymbol: ( + state: ParserState + ) => void | TopLevelSymbol; + export let tagTopLevelSymbol: ( + parser: JavascriptParser, + name: string + ) => undefined | TopLevelSymbol; + export let isDependencyUsedByExports: ( + dependency: Dependency, + usedByExports: boolean | Set, + moduleGraph: ModuleGraph, + runtime: RuntimeSpec + ) => boolean; + export let getDependencyUsedByExportsCondition: ( + dependency: Dependency, + usedByExports: undefined | boolean | Set, + moduleGraph: ModuleGraph + ) => + | null + | false + | (( + moduleGraphConnection: ModuleGraphConnection, + runtime: RuntimeSpec + ) => ConnectionState); + export { TopLevelSymbol, topLevelSymbolTag }; + } + export { + AggressiveMergingPlugin, + AggressiveSplittingPlugin, + LimitChunkCountPlugin, + MergeDuplicateChunksPlugin, + MinChunkSizePlugin, + ModuleConcatenationPlugin, + RealContentHashPlugin, + RuntimeChunkPlugin, + SideEffectsFlagPlugin, + SplitChunksPlugin + }; + } + export namespace runtime { + export { GetChunkFilenameRuntimeModule, LoadScriptRuntimeModule }; + } + export namespace prefetch { + export { ChunkPrefetchPreloadPlugin }; + } + export namespace web { + export { + FetchCompileWasmPlugin, + FetchCompileAsyncWasmPlugin, + JsonpChunkLoadingRuntimeModule, + JsonpTemplatePlugin, + CssLoadingRuntimeModule + }; + } + export namespace esm { + export { ModuleChunkLoadingRuntimeModule }; + } + export namespace webworker { + export { WebWorkerTemplatePlugin }; + } + export namespace node { + export { + NodeEnvironmentPlugin, + NodeSourcePlugin, + NodeTargetPlugin, + NodeTemplatePlugin, + ReadFileCompileWasmPlugin, + ReadFileCompileAsyncWasmPlugin + }; + } + export namespace electron { + export { ElectronTargetPlugin }; + } + export namespace wasm { + export { AsyncWebAssemblyModulesPlugin, EnableWasmLoadingPlugin }; + } + export namespace css { + export { CssModulesPlugin }; + } + export namespace library { + export { AbstractLibraryPlugin, EnableLibraryPlugin }; + } + export namespace container { + export const scope: ( + scope: string, + options: ContainerOptionsFormat + ) => Record; + export { + ContainerPlugin, + ContainerReferencePlugin, + ModuleFederationPlugin + }; + } + export namespace sharing { + export const scope: ( + scope: string, + options: ContainerOptionsFormat + ) => Record; + export { ConsumeSharedPlugin, ProvideSharedPlugin, SharePlugin }; + } + export namespace debug { + export { ProfilingPlugin }; + } + export namespace util { + export const createHash: (algorithm: HashFunction) => Hash; + export namespace comparators { + export let compareChunksById: (a: Chunk, b: Chunk) => 0 | 1 | -1; + export let compareModulesByIdentifier: ( + a: Module, + b: Module + ) => 0 | 1 | -1; + export let compareModulesById: ParameterizedComparator< + ChunkGraph, + Module + >; + export let compareNumbers: (a: number, b: number) => 0 | 1 | -1; + export let compareStringsNumeric: (a: string, b: string) => 0 | 1 | -1; + export let compareModulesByPostOrderIndexOrIdentifier: ParameterizedComparator< + ModuleGraph, + Module + >; + export let compareModulesByPreOrderIndexOrIdentifier: ParameterizedComparator< + ModuleGraph, + Module + >; + export let compareModulesByIdOrIdentifier: ParameterizedComparator< + ChunkGraph, + Module + >; + export let compareChunks: ParameterizedComparator; + export let compareIds: ( + a: string | number, + b: string | number + ) => 0 | 1 | -1; + export let compareStrings: (a: string, b: string) => 0 | 1 | -1; + export let compareChunkGroupsByIndex: ( + a: ChunkGroup, + b: ChunkGroup + ) => 0 | 1 | -1; + export let concatComparators: ( + c1: Comparator, + c2: Comparator, + ...cRest: Comparator[] + ) => Comparator; + export let compareSelect: ( + getter: Selector, + comparator: Comparator + ) => Comparator; + export let compareIterables: ( + elementComparator: Comparator + ) => Comparator>; + export let keepOriginalOrder: (iterable: Iterable) => Comparator; + export let compareChunksNatural: ( + chunkGraph: ChunkGraph + ) => Comparator; + export let compareLocations: ( + a: DependencyLocation, + b: DependencyLocation + ) => 0 | 1 | -1; + } + export namespace runtime { + export let getEntryRuntime: ( + compilation: Compilation, + name: string, + options?: EntryOptions + ) => RuntimeSpec; + export let forEachRuntime: ( + runtime: RuntimeSpec, + fn: (runtime?: string) => void, + deterministicOrder?: boolean + ) => void; + export let getRuntimeKey: (runtime: RuntimeSpec) => string; + export let keyToRuntime: (key: string) => RuntimeSpec; + export let runtimeToString: (runtime: RuntimeSpec) => string; + export let runtimeConditionToString: ( + runtimeCondition: RuntimeCondition + ) => string; + export let runtimeEqual: (a: RuntimeSpec, b: RuntimeSpec) => boolean; + export let compareRuntime: (a: RuntimeSpec, b: RuntimeSpec) => 0 | 1 | -1; + export let mergeRuntime: (a: RuntimeSpec, b: RuntimeSpec) => RuntimeSpec; + export let mergeRuntimeCondition: ( + a: RuntimeCondition, + b: RuntimeCondition, + runtime: RuntimeSpec + ) => RuntimeCondition; + export let mergeRuntimeConditionNonFalse: ( + a: undefined | string | true | SortableSet, + b: undefined | string | true | SortableSet, + runtime: RuntimeSpec + ) => undefined | string | true | SortableSet; + export let mergeRuntimeOwned: ( + a: RuntimeSpec, + b: RuntimeSpec + ) => RuntimeSpec; + export let intersectRuntime: ( + a: RuntimeSpec, + b: RuntimeSpec + ) => RuntimeSpec; + export let subtractRuntime: ( + a: RuntimeSpec, + b: RuntimeSpec + ) => RuntimeSpec; + export let subtractRuntimeCondition: ( + a: RuntimeCondition, + b: RuntimeCondition, + runtime: RuntimeSpec + ) => RuntimeCondition; + export let filterRuntime: ( + runtime: RuntimeSpec, + filter: (runtime?: RuntimeSpec) => boolean + ) => undefined | string | boolean | SortableSet; + export { RuntimeSpecMap, RuntimeSpecSet }; + } + export namespace serialization { + export const register: ( + Constructor: Constructor, + request: string, + name: null | string, + serializer: ObjectSerializer + ) => void; + export const registerLoader: ( + regExp: RegExp, + loader: (request: string) => boolean + ) => void; + export const registerNotSerializable: (Constructor: Constructor) => void; + export const NOT_SERIALIZABLE: object; + export const buffersSerializer: Serializer; + export let createFileSerializer: ( + fs: IntermediateFileSystem, + hashFunction: string | typeof Hash + ) => Serializer; + export { MEASURE_START_OPERATION, MEASURE_END_OPERATION }; + } + export const cleverMerge: ( + first?: null | T, + second?: null | O + ) => T | O | (T & O); + export function compileBooleanMatcher( + map: Record + ): boolean | ((value: string) => string); + export namespace compileBooleanMatcher { + export let fromLists: ( + positiveItems: string[], + negativeItems: string[] + ) => (value: string) => string; + export let itemsToRegexp: (itemsArr: string[]) => string; + } + export { LazySet }; + } + export namespace sources { + export { + Source, + RawSource, + OriginalSource, + ReplaceSource, + SourceMapSource, + ConcatSource, + PrefixSource, + CachedSource, + SizeOnlySource, + CompatSource + }; + } + export namespace experiments { + export namespace schemes { + export { HttpUriPlugin }; + } + export namespace ids { + export { SyncModuleIdsPlugin }; + } + } + export type ExternalItemFunctionCallback = ( + data: ExternalItemFunctionData, + callback: ( + err?: null | Error, + result?: string | boolean | string[] | { [index: string]: any } + ) => void + ) => void; + export type ExternalItemFunctionDataGetResolve = ( + options?: ResolveOptions + ) => + | (( + context: string, + request: string, + callback: ( + err?: null | Error, + result?: string | false, + resolveRequest?: ResolveRequest + ) => void + ) => void) + | ((context: string, request: string) => Promise); + export type ExternalItemFunctionDataGetResolveCallbackResult = ( + context: string, + request: string, + callback: ( + err?: null | Error, + result?: string | false, + resolveRequest?: ResolveRequest + ) => void + ) => void; + export type ExternalItemFunctionDataGetResolveResult = ( + context: string, + request: string + ) => Promise; + export type ExternalItemFunctionPromise = ( + data: ExternalItemFunctionData + ) => Promise; + export type RuleSetUseFunction = (data: EffectData) => + | string + | RuleSetUseFunction + | { + /** + * Unique loader options identifier. + */ + ident?: string; + /** + * Loader name. + */ + loader?: string; + /** + * Loader options. + */ + options?: string | { [index: string]: any }; + } + | ( + | undefined + | null + | string + | false + | 0 + | RuleSetUseFunction + | { + /** + * Unique loader options identifier. + */ + ident?: string; + /** + * Loader name. + */ + loader?: string; + /** + * Loader options. + */ + options?: string | { [index: string]: any }; + } + )[]; + export type WebpackPluginFunction = ( + this: Compiler, + compiler: Compiler + ) => void; + export { + AutomaticPrefetchPlugin, + AsyncDependenciesBlock, + BannerPlugin, + Cache, + Chunk, + ChunkGraph, + CleanPlugin, + Compilation, + Compiler, + ConcatenationScope, + ContextExclusionPlugin, + ContextReplacementPlugin, + DefinePlugin, + DelegatedPlugin, + Dependency, + DllPlugin, + DllReferencePlugin, + DynamicEntryPlugin, + EntryOptionPlugin, + EntryPlugin, + EnvironmentPlugin, + EvalDevToolModulePlugin, + EvalSourceMapDevToolPlugin, + ExternalModule, + ExternalsPlugin, + Generator, + HotUpdateChunk, + HotModuleReplacementPlugin, + InitFragment, + IgnorePlugin, + JavascriptModulesPlugin, + LibManifestPlugin, + LibraryTemplatePlugin, + LoaderOptionsPlugin, + LoaderTargetPlugin, + Module, + ModuleGraph, + ModuleGraphConnection, + NoEmitOnErrorsPlugin, + NormalModule, + NormalModuleReplacementPlugin, + MultiCompiler, + Parser, + PlatformPlugin, + PrefetchPlugin, + ProgressPlugin, + ProvidePlugin, + RuntimeModule, + EntryPlugin as SingleEntryPlugin, + SourceMapDevToolPlugin, + Stats, + Template, + WatchIgnorePlugin, + WebpackError, + WebpackOptionsApply, + WebpackOptionsDefaulter, + ValidationError as WebpackOptionsValidationError, + ValidationError, + Entry, + EntryNormalized, + EntryObject, + ExternalItem, + ExternalItemFunction, + ExternalItemFunctionData, + ExternalItemObjectKnown, + ExternalItemObjectUnknown, + ExternalItemValue, + Externals, + FileCacheOptions, + GeneratorOptionsByModuleTypeKnown, + LibraryOptions, + MemoryCacheOptions, + ModuleOptions, + ParserOptionsByModuleTypeKnown, + ResolveOptions, + RuleSetCondition, + RuleSetConditionAbsolute, + RuleSetRule, + RuleSetUse, + RuleSetUseItem, + StatsOptions, + Configuration, + WebpackOptionsNormalized, + WebpackPluginInstance, + ChunkGroup, + Asset, + AssetInfo, + EntryOptions, + PathData, + AssetEmittedInfo, + Entrypoint, + MultiCompilerOptions, + MultiStats, + ResolveData, + ParserState, + ResolvePluginInstance, + Resolver, + Watching, + Argument, + Problem, + StatsAsset, + StatsChunk, + StatsChunkGroup, + StatsChunkOrigin, + StatsCompilation, + StatsError, + StatsLogging, + StatsLoggingEntry, + StatsModule, + StatsModuleIssuer, + StatsModuleReason, + StatsModuleTraceDependency, + StatsModuleTraceItem, + StatsProfile, + InputFileSystem, + OutputFileSystem, + LoaderModule, + RawLoaderDefinition, + LoaderDefinition, + LoaderDefinitionFunction, + PitchLoaderDefinitionFunction, + RawLoaderDefinitionFunction, + LoaderContextDeclarationsIndex as LoaderContext + }; +} +declare const topLevelSymbolTag: unique symbol; + +export = exports; diff --git a/yarn.lock b/yarn.lock index 9cd51e1dd38..19561f462f9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,2293 +2,2795 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.0.0-beta.35": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" - integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@babel/highlight" "^7.0.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" -"@babel/highlight@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" - integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== +"@apidevtools/json-schema-ref-parser@9.0.9": + version "9.0.9" + resolved "https://registry.yarnpkg.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz#d720f9256e3609621280584f2b47ae165359268b" + integrity sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w== dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^4.0.0" + "@jsdevtools/ono" "^7.1.3" + "@types/json-schema" "^7.0.6" + call-me-maybe "^1.0.1" + js-yaml "^4.1.0" -"@samverschueren/stream-to-observable@^0.3.0": - version "0.3.0" - resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" - integrity sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" + integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== dependencies: - any-observable "^0.3.0" - -"@types/babel-types@*", "@types/babel-types@^7.0.0": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.2.tgz#63dc3e5e7f6367e1819d2bba5213783cd926c5d5" - integrity sha512-ylggu8DwwxT6mk3jVoJeohWAePWMNWEYm06MSoJ19kwp3hT9eY2Z4NNZn3oevzgFmClgNQ2GQF500hPDvNsGHg== - -"@types/babylon@^6.16.2": - version "6.16.2" - resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.2.tgz#062ce63b693d9af1c246f5aedf928bc9c30589c8" - integrity sha512-+Jty46mPaWe1VAyZbfvgJM4BAdklLWxrT5tc/RjvCgLrtk6gzRY6AOnoWFv4p6hVxhJshDdr2hGVn56alBp97Q== + "@babel/helper-validator-identifier" "^7.27.1" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/compat-data@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.27.1.tgz#db7cf122745e0a332c44e847ddc4f5e5221a43f6" + integrity sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9", "@babel/core@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.27.1.tgz#89de51e86bd12246003e3524704c49541b16c3e6" + integrity sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.27.1" + "@babel/helper-compilation-targets" "^7.27.1" + "@babel/helper-module-transforms" "^7.27.1" + "@babel/helpers" "^7.27.1" + "@babel/parser" "^7.27.1" + "@babel/template" "^7.27.1" + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.27.1", "@babel/generator@^7.7.2": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.27.1.tgz#862d4fad858f7208edd487c28b58144036b76230" + integrity sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w== + dependencies: + "@babel/parser" "^7.27.1" + "@babel/types" "^7.27.1" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/helper-annotate-as-pure@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz#4345d81a9a46a6486e24d069469f13e60445c05d" + integrity sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow== + dependencies: + "@babel/types" "^7.27.1" + +"@babel/helper-compilation-targets@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.1.tgz#eac1096c7374f161e4f33fc8ae38f4ddf122087a" + integrity sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g== + dependencies: + "@babel/compat-data" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-module-imports@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" + integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== + dependencies: + "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/helper-module-transforms@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz#e1663b8b71d2de948da5c4fb2a20ca4f3ec27a6f" + integrity sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g== + dependencies: + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.27.1" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.8.0": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" + integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== + +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-validator-identifier@^7.25.9", "@babel/helper-validator-identifier@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" + integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== + +"@babel/helper-validator-option@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== + +"@babel/helpers@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.1.tgz#ffc27013038607cdba3288e692c3611c06a18aa4" + integrity sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ== + dependencies: + "@babel/template" "^7.27.1" + "@babel/types" "^7.27.1" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.27.1", "@babel/parser@^7.6.0", "@babel/parser@^7.9.6": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.1.tgz#c55d5bed74449d1223701f1869b9ee345cc94cc9" + integrity sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ== + dependencies: + "@babel/types" "^7.27.1" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== dependencies: - "@types/babel-types" "*" - -"@types/cli-color@^0.3.29": - version "0.3.29" - resolved "https://registry.yarnpkg.com/@types/cli-color/-/cli-color-0.3.29.tgz#c83a71fe02c8c7e1ccec048dd6a2458d1f6c96ea" - integrity sha1-yDpx/gLIx+HM7ASN1qJFjR9sluo= - -"@types/json-schema@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.0.tgz#5a2b780fec9f2cf851e1b5e0a29a4cac6c9686c5" - integrity sha512-vKFTUFiUOLIoe80UE1l3ZvnlDYxgNCrpa/KEesJoTMIvWuI4zA6pxNlOBHR81ghVpyx3M4CRf0LPTd9HivK7Mg== - -"@types/lodash@^4.14.116": - version "4.14.116" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.116.tgz#5ccf215653e3e8c786a58390751033a9adca0eb9" - integrity sha512-lRnAtKnxMXcYYXqOiotTmJd74uawNWuPnsnPrrO7HiFuE3npE2iQhfABatbYDyxTNqZNuXzcKGhw37R7RjBFLg== - -"@types/minimist@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" - integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= + "@babel/helper-plugin-utils" "^7.8.0" -"@types/mz@0.0.32": - version "0.0.32" - resolved "https://registry.yarnpkg.com/@types/mz/-/mz-0.0.32.tgz#e8248b4e41424c052edc1725dd33650c313a3659" - integrity sha512-cy3yebKhrHuOcrJGkfwNHhpTXQLgmXSv1BX+4p32j+VUQ6aP2eJ5cL7OvGcAQx75fCTFaAIIAKewvqL+iwSd4g== +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: - "@types/node" "*" + "@babel/helper-plugin-utils" "^7.12.13" -"@types/node@*": - version "10.5.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.5.1.tgz#d578446f4abff5c0b49ade9b4e5274f6badaadfc" - integrity sha512-AFLl1IALIuyt6oK4AYZsgWVJ/5rnyzQWud7IebaZWWV3YmgtPZkQmYio9R5Ze/2pdd7XfqF5bP+hWS11mAKoOQ== - -"@types/node@^10.9.4": - version "10.10.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.10.1.tgz#d5c96ca246a418404914d180b7fdd625ad18eca6" - integrity sha512-nzsx28VwfaIykfzMAG9TB3jxF5Nn+1/WMKnmVZc8TsB+LMIVvwUscVn7PAq+LFaY5ng5u4jp5mRROSswo76PPA== +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" -"@types/node@^9.6.4": - version "9.6.30" - resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.30.tgz#1ecf83eaf7ac2d0dada7a9d61a1e4e7a6183ac06" - integrity sha512-mFkVM9yFexPPKm0sidVyEzM8F0O06W3vZ8QnjHYa3AB1uvtPOayGKLrXlXIKOdJ7LOE+zilhxYbGPy/34QTgrw== +"@babel/plugin-syntax-import-attributes@^7.24.7": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7" + integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" -"@types/prettier@^1.13.2": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-1.13.2.tgz#ffe96278e712a8d4e467e367a338b05e22872646" - integrity sha512-k6MCN8WuDiCj6O+UJsVMbrreZxkbrhQbO02oDj6yuRu8UAkp0MDdEcDKif8/gBKuJbT84kkO+VHQAqXkumEklg== +"@babel/plugin-syntax-import-meta@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" -"@types/source-list-map@*": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" - integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -"@types/tapable@^1.0.1": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.4.tgz#b4ffc7dc97b498c969b360a41eee247f82616370" - integrity sha512-78AdXtlhpCHT0K3EytMpn4JNxaf5tbqbLcbIRoQIHzpTIyjpxLQKRoxU55ujBXAtg3Nl2h/XWvfDa9dsMOd0pQ== +"@babel/plugin-syntax-jsx@^7.27.1", "@babel/plugin-syntax-jsx@^7.7.2": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz#2f9beb5eff30fa507c5532d107daac7b888fa34c" + integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" -"@types/webpack-sources@^0.1.4": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.5.tgz#be47c10f783d3d6efe1471ff7f042611bd464a92" - integrity sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w== +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: - "@types/node" "*" - "@types/source-list-map" "*" - source-map "^0.6.1" + "@babel/helper-plugin-utils" "^7.10.4" -"@webassemblyjs/ast@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" - integrity sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA== - dependencies: - "@webassemblyjs/helper-module-context" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/wast-parser" "1.7.11" - -"@webassemblyjs/floating-point-hex-parser@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz#a69f0af6502eb9a3c045555b1a6129d3d3f2e313" - integrity sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg== - -"@webassemblyjs/helper-api-error@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz#c7b6bb8105f84039511a2b39ce494f193818a32a" - integrity sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg== - -"@webassemblyjs/helper-buffer@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz#3122d48dcc6c9456ed982debe16c8f37101df39b" - integrity sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w== - -"@webassemblyjs/helper-code-frame@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz#cf8f106e746662a0da29bdef635fcd3d1248364b" - integrity sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw== - dependencies: - "@webassemblyjs/wast-printer" "1.7.11" - -"@webassemblyjs/helper-fsm@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz#df38882a624080d03f7503f93e3f17ac5ac01181" - integrity sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A== - -"@webassemblyjs/helper-module-context@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz#d874d722e51e62ac202476935d649c802fa0e209" - integrity sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg== - -"@webassemblyjs/helper-wasm-bytecode@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz#dd9a1e817f1c2eb105b4cf1013093cb9f3c9cb06" - integrity sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ== - -"@webassemblyjs/helper-wasm-section@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz#9c9ac41ecf9fbcfffc96f6d2675e2de33811e68a" - integrity sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q== - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-buffer" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/wasm-gen" "1.7.11" - -"@webassemblyjs/ieee754@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz#c95839eb63757a31880aaec7b6512d4191ac640b" - integrity sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ== +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: - "@xtuc/ieee754" "^1.2.0" + "@babel/helper-plugin-utils" "^7.8.0" -"@webassemblyjs/leb128@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.11.tgz#d7267a1ee9c4594fd3f7e37298818ec65687db63" - integrity sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw== - dependencies: - "@xtuc/long" "4.2.1" - -"@webassemblyjs/utf8@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.11.tgz#06d7218ea9fdc94a6793aa92208160db3d26ee82" - integrity sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA== - -"@webassemblyjs/wasm-edit@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz#8c74ca474d4f951d01dbae9bd70814ee22a82005" - integrity sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg== - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-buffer" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/helper-wasm-section" "1.7.11" - "@webassemblyjs/wasm-gen" "1.7.11" - "@webassemblyjs/wasm-opt" "1.7.11" - "@webassemblyjs/wasm-parser" "1.7.11" - "@webassemblyjs/wast-printer" "1.7.11" - -"@webassemblyjs/wasm-gen@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz#9bbba942f22375686a6fb759afcd7ac9c45da1a8" - integrity sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA== - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/ieee754" "1.7.11" - "@webassemblyjs/leb128" "1.7.11" - "@webassemblyjs/utf8" "1.7.11" - -"@webassemblyjs/wasm-opt@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz#b331e8e7cef8f8e2f007d42c3a36a0580a7d6ca7" - integrity sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg== - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-buffer" "1.7.11" - "@webassemblyjs/wasm-gen" "1.7.11" - "@webassemblyjs/wasm-parser" "1.7.11" - -"@webassemblyjs/wasm-parser@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz#6e3d20fa6a3519f6b084ef9391ad58211efb0a1a" - integrity sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg== - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-api-error" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/ieee754" "1.7.11" - "@webassemblyjs/leb128" "1.7.11" - "@webassemblyjs/utf8" "1.7.11" - -"@webassemblyjs/wast-parser@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz#25bd117562ca8c002720ff8116ef9072d9ca869c" - integrity sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ== - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/floating-point-hex-parser" "1.7.11" - "@webassemblyjs/helper-api-error" "1.7.11" - "@webassemblyjs/helper-code-frame" "1.7.11" - "@webassemblyjs/helper-fsm" "1.7.11" - "@xtuc/long" "4.2.1" - -"@webassemblyjs/wast-printer@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz#c4245b6de242cb50a2cc950174fdbf65c78d7813" - integrity sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg== - dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/wast-parser" "1.7.11" - "@xtuc/long" "4.2.1" +"@babel/plugin-syntax-numeric-separator@^7.10.4": + version "7.10.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -"@xtuc/long@4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" - integrity sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g== +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -abab@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" - integrity sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4= +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" -abbrev@1.0.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" - integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= +"@babel/plugin-syntax-top-level-await@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" -accepts@~1.2.12: - version "1.2.13" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.2.13.tgz#e5f1f3928c6d95fd96558c36ec3d9d0de4a6ecea" - integrity sha1-5fHzkoxtlf2WVYw27D2dDeSm7Oo= +"@babel/plugin-syntax-typescript@^7.7.2": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" + integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== dependencies: - mime-types "~2.1.6" - negotiator "0.5.3" + "@babel/helper-plugin-utils" "^7.25.9" -acorn-dynamic-import@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" - integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== +"@babel/plugin-transform-react-display-name@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.27.1.tgz#43af31362d71f7848cfac0cbc212882b1a16e80f" + integrity sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ== + dependencies: + "@babel/helper-plugin-utils" "^7.27.1" -acorn-globals@^1.0.3: - version "1.0.9" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf" - integrity sha1-VbtemGkVB7dFedBRNBMhfDgMVM8= +"@babel/plugin-transform-react-jsx-development@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz#47ff95940e20a3a70e68ad3d4fcb657b647f6c98" + integrity sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q== dependencies: - acorn "^2.1.0" + "@babel/plugin-transform-react-jsx" "^7.27.1" -acorn-globals@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" - integrity sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8= +"@babel/plugin-transform-react-jsx@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz#1023bc94b78b0a2d68c82b5e96aed573bcfb9db0" + integrity sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw== dependencies: - acorn "^4.0.4" + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-module-imports" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/plugin-syntax-jsx" "^7.27.1" + "@babel/types" "^7.27.1" -acorn-globals@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" - integrity sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ== +"@babel/plugin-transform-react-pure-annotations@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz#339f1ce355eae242e0649f232b1c68907c02e879" + integrity sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA== dependencies: - acorn "^5.0.0" + "@babel/helper-annotate-as-pure" "^7.27.1" + "@babel/helper-plugin-utils" "^7.27.1" -acorn-jsx@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-4.1.1.tgz#e8e41e48ea2fe0c896740610ab6a4ffd8add225e" - integrity sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw== +"@babel/preset-react@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.27.1.tgz#86ea0a5ca3984663f744be2fd26cb6747c3fd0ec" + integrity sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA== dependencies: - acorn "^5.0.3" + "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-validator-option" "^7.27.1" + "@babel/plugin-transform-react-display-name" "^7.27.1" + "@babel/plugin-transform-react-jsx" "^7.27.1" + "@babel/plugin-transform-react-jsx-development" "^7.27.1" + "@babel/plugin-transform-react-pure-annotations" "^7.27.1" + +"@babel/template@^7.27.1", "@babel/template@^7.3.3": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.1.tgz#b9e4f55c17a92312774dfbdde1b3c01c547bbae2" + integrity sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.1" + "@babel/types" "^7.27.1" -acorn@^1.0.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-1.2.2.tgz#c8ce27de0acc76d896d2b1fad3df588d9e82f014" - integrity sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ= +"@babel/traverse@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.1.tgz#4db772902b133bbddd1c4f7a7ee47761c1b9f291" + integrity sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg== + dependencies: + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.27.1" + "@babel/parser" "^7.27.1" + "@babel/template" "^7.27.1" + "@babel/types" "^7.27.1" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.3.3", "@babel/types@^7.6.1", "@babel/types@^7.9.6": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.1.tgz#9defc53c16fc899e46941fc6901a9eea1c9d8560" + integrity sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -acorn@^2.1.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" - integrity sha1-q259nYhqrKiwhbwzEreaGYQz8Oc= +"@codspeed/core@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@codspeed/core/-/core-4.0.1.tgz#91049cce17b8c1d1b4b6cbc481f5ddc1145d6e1e" + integrity sha512-fJ53arfgtzCDZa8DuGJhpTZ3Ll9A1uW5nQ2jSJnfO4Hl5MRD2cP8P4vPvIUAGbdbjwCxR1jat6cW8OloMJkJXw== + dependencies: + axios "^1.4.0" + find-up "^6.3.0" + form-data "^4.0.0" + node-gyp-build "^4.6.0" -acorn@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= +"@codspeed/tinybench-plugin@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@codspeed/tinybench-plugin/-/tinybench-plugin-4.0.1.tgz#b0e27a963c03e6ca84c99685ee86abdbd3aa5c9f" + integrity sha512-hga1xif6XU8p/FZqTHzUrDPrBSLqxc3NuxMX8m4P8AIdhORsPrvgSNe09uVYlVOtD6jG7kPsmx5DZscez4wKrQ== + dependencies: + "@codspeed/core" "^4.0.1" + stack-trace "1.0.0-pre2" + +"@cspell/cspell-bundled-dicts@9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-9.0.1.tgz#a61b34317f5cbe3fda56af9a399af6fe7041fc82" + integrity sha512-h7gTqg0VF4N8VhOPk66XewuSsT56OP2ujgxtAyYQ4H+NuYd3HMfS0h/I3/y9uBhllwOEamaeAzYhc5JF/qIrsQ== + dependencies: + "@cspell/dict-ada" "^4.1.0" + "@cspell/dict-al" "^1.1.0" + "@cspell/dict-aws" "^4.0.10" + "@cspell/dict-bash" "^4.2.0" + "@cspell/dict-companies" "^3.2.1" + "@cspell/dict-cpp" "^6.0.8" + "@cspell/dict-cryptocurrencies" "^5.0.4" + "@cspell/dict-csharp" "^4.0.6" + "@cspell/dict-css" "^4.0.17" + "@cspell/dict-dart" "^2.3.0" + "@cspell/dict-data-science" "^2.0.8" + "@cspell/dict-django" "^4.1.4" + "@cspell/dict-docker" "^1.1.14" + "@cspell/dict-dotnet" "^5.0.9" + "@cspell/dict-elixir" "^4.0.7" + "@cspell/dict-en-common-misspellings" "^2.0.11" + "@cspell/dict-en-gb-mit" "^3.0.6" + "@cspell/dict-en_us" "^4.4.8" + "@cspell/dict-filetypes" "^3.0.12" + "@cspell/dict-flutter" "^1.1.0" + "@cspell/dict-fonts" "^4.0.4" + "@cspell/dict-fsharp" "^1.1.0" + "@cspell/dict-fullstack" "^3.2.6" + "@cspell/dict-gaming-terms" "^1.1.1" + "@cspell/dict-git" "^3.0.4" + "@cspell/dict-golang" "^6.0.21" + "@cspell/dict-google" "^1.0.8" + "@cspell/dict-haskell" "^4.0.5" + "@cspell/dict-html" "^4.0.11" + "@cspell/dict-html-symbol-entities" "^4.0.3" + "@cspell/dict-java" "^5.0.11" + "@cspell/dict-julia" "^1.1.0" + "@cspell/dict-k8s" "^1.0.10" + "@cspell/dict-kotlin" "^1.1.0" + "@cspell/dict-latex" "^4.0.3" + "@cspell/dict-lorem-ipsum" "^4.0.4" + "@cspell/dict-lua" "^4.0.7" + "@cspell/dict-makefile" "^1.0.4" + "@cspell/dict-markdown" "^2.0.10" + "@cspell/dict-monkeyc" "^1.0.10" + "@cspell/dict-node" "^5.0.7" + "@cspell/dict-npm" "^5.2.3" + "@cspell/dict-php" "^4.0.14" + "@cspell/dict-powershell" "^5.0.14" + "@cspell/dict-public-licenses" "^2.0.13" + "@cspell/dict-python" "^4.2.18" + "@cspell/dict-r" "^2.1.0" + "@cspell/dict-ruby" "^5.0.8" + "@cspell/dict-rust" "^4.0.11" + "@cspell/dict-scala" "^5.0.7" + "@cspell/dict-shell" "^1.1.0" + "@cspell/dict-software-terms" "^5.0.8" + "@cspell/dict-sql" "^2.2.0" + "@cspell/dict-svelte" "^1.0.6" + "@cspell/dict-swift" "^2.0.5" + "@cspell/dict-terraform" "^1.1.1" + "@cspell/dict-typescript" "^3.2.1" + "@cspell/dict-vue" "^3.0.4" + +"@cspell/cspell-json-reporter@9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@cspell/cspell-json-reporter/-/cspell-json-reporter-9.0.1.tgz#c21c750fdd006a5dec308efec01063e80cd32d49" + integrity sha512-Rpn7Tuq9t8bZpXZFV43NkhCl0LaPDJZSON4/JFxGbOcH16ryXfrx7oObUTIIyxSxO3fGkzaJZHIwGibRJSsbNQ== + dependencies: + "@cspell/cspell-types" "9.0.1" + +"@cspell/cspell-pipe@9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@cspell/cspell-pipe/-/cspell-pipe-9.0.1.tgz#34e2b167dae4bda4c9e03639efdc8efabdbd7b7d" + integrity sha512-bhFcvF2a8KYKVh/OebCfJ8LFw5GYHyUsUjAbxnznTBrYOFSIclDjwUwT29yVDXwnQkJkB6Px5Y9e2VvtFizVFg== + +"@cspell/cspell-resolver@9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@cspell/cspell-resolver/-/cspell-resolver-9.0.1.tgz#8cb2a3d21cb9bd4f7dbba69e496a0fc9155afd5b" + integrity sha512-AhIXAhX1qt7Y3EyiP/5rAk7Ow7DJpAyB44wPbfdF9p1vhnk6oQ7RslnD3G6S9o/vNxZ0DWFPREMWx19J/3c+hw== + dependencies: + global-directory "^4.0.1" + +"@cspell/cspell-service-bus@9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@cspell/cspell-service-bus/-/cspell-service-bus-9.0.1.tgz#c151e5a3b48306b48b36a043fa282f254691f5e9" + integrity sha512-DoW6hLkFIO3BXePtUYQEax3FTH9fkwCUbf6qphAEXnr4PjoyPZsgBhR6iCrZd4DyhuFiRvK3Cgpq2o3O0NdODQ== + +"@cspell/cspell-types@9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@cspell/cspell-types/-/cspell-types-9.0.1.tgz#6143b68e1c5c9115ec397fba9615c90e4b37fa52" + integrity sha512-8FRmvyV1AYEepJB3J7jji1ZYG9yOK0eYr4WuUVPfUJa6N3HyeZjWKhxbVvqedmEI74f5Ls3cQKHY1T2Yvqk/ag== + +"@cspell/dict-ada@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-ada/-/dict-ada-4.1.0.tgz#60d4ca3c47262d91ecb008330f31a3066f3161f9" + integrity sha512-7SvmhmX170gyPd+uHXrfmqJBY5qLcCX8kTGURPVeGxmt8XNXT75uu9rnZO+jwrfuU2EimNoArdVy5GZRGljGNg== -acorn@^4.0.4, acorn@~4.0.2: - version "4.0.13" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" - integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c= +"@cspell/dict-al@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-al/-/dict-al-1.1.0.tgz#8091d046b6fe74004f3f1df8d1403a280818537f" + integrity sha512-PtNI1KLmYkELYltbzuoztBxfi11jcE9HXBHCpID2lou/J4VMYKJPNqe4ZjVzSI9NYbMnMnyG3gkbhIdx66VSXg== -acorn@^5.0.0, acorn@^5.3.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" - integrity sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ== +"@cspell/dict-aws@^4.0.10": + version "4.0.10" + resolved "https://registry.yarnpkg.com/@cspell/dict-aws/-/dict-aws-4.0.10.tgz#d1aa477b751113898d51b14443f1e9c418e4ab71" + integrity sha512-0qW4sI0GX8haELdhfakQNuw7a2pnWXz3VYQA2MpydH2xT2e6EN9DWFpKAi8DfcChm8MgDAogKkoHtIo075iYng== -acorn@^5.0.3, acorn@^5.6.0: - version "5.7.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.2.tgz#91fa871883485d06708800318404e72bfb26dcc5" - integrity sha512-cJrKCNcr2kv8dlDnbw+JPUGjHZzo4myaxOLmpOX8a+rgX94YeTcTMv/LFJUSByRpc+i4GgVnnhLxvMu/2Y+rqw== +"@cspell/dict-bash@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-bash/-/dict-bash-4.2.0.tgz#d1f7c6d2afdf849a3d418de6c2e9b776e7bd532a" + integrity sha512-HOyOS+4AbCArZHs/wMxX/apRkjxg6NDWdt0jF9i9XkvJQUltMwEhyA2TWYjQ0kssBsnof+9amax2lhiZnh3kCg== + dependencies: + "@cspell/dict-shell" "1.1.0" -acorn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.5.tgz#81730c0815f3f3b34d8efa95cb7430965f4d887a" - integrity sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg== +"@cspell/dict-companies@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-companies/-/dict-companies-3.2.1.tgz#6ce1375975c5152fbea707b66f0b30dc2811265d" + integrity sha512-ryaeJ1KhTTKL4mtinMtKn8wxk6/tqD4vX5tFP+Hg89SiIXmbMk5vZZwVf+eyGUWJOyw5A1CVj9EIWecgoi+jYQ== -ajv-errors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59" - integrity sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk= +"@cspell/dict-cpp@^6.0.8": + version "6.0.8" + resolved "https://registry.yarnpkg.com/@cspell/dict-cpp/-/dict-cpp-6.0.8.tgz#bb3b6763daa1dd152250785de6dc7fca031320c1" + integrity sha512-BzurRZilWqaJt32Gif6/yCCPi+FtrchjmnehVEIFzbWyeBd/VOUw77IwrEzehZsu5cRU91yPWuWp5fUsKfDAXA== -ajv-keywords@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" - integrity sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo= +"@cspell/dict-cryptocurrencies@^5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-5.0.4.tgz#f0008e7aec9856373d03d728dd5990a94ff76c31" + integrity sha512-6iFu7Abu+4Mgqq08YhTKHfH59mpMpGTwdzDB2Y8bbgiwnGFCeoiSkVkgLn1Kel2++hYcZ8vsAW/MJS9oXxuMag== -ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - integrity sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY= - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" +"@cspell/dict-csharp@^4.0.6": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@cspell/dict-csharp/-/dict-csharp-4.0.6.tgz#a40dc2cc12689356f986fda83c8d72cc3443d588" + integrity sha512-w/+YsqOknjQXmIlWDRmkW+BHBPJZ/XDrfJhZRQnp0wzpPOGml7W0q1iae65P2AFRtTdPKYmvSz7AL5ZRkCnSIw== -ajv@^5.0.0, ajv@^5.1.0, ajv@^5.3.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" +"@cspell/dict-css@^4.0.17": + version "4.0.17" + resolved "https://registry.yarnpkg.com/@cspell/dict-css/-/dict-css-4.0.17.tgz#e84d568d19abbcbf9d9abe6936dc2fd225a0b6d6" + integrity sha512-2EisRLHk6X/PdicybwlajLGKF5aJf4xnX2uuG5lexuYKt05xV/J/OiBADmi8q9obhxf1nesrMQbqAt+6CsHo/w== -ajv@^6.1.0: - version "6.5.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" - integrity sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" +"@cspell/dict-dart@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-dart/-/dict-dart-2.3.0.tgz#2bc39f965712c798dce143cafa656125ea30c0d8" + integrity sha512-1aY90lAicek8vYczGPDKr70pQSTQHwMFLbmWKTAI6iavmb1fisJBS1oTmMOKE4ximDf86MvVN6Ucwx3u/8HqLg== + +"@cspell/dict-data-science@^2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@cspell/dict-data-science/-/dict-data-science-2.0.8.tgz#512ac2f805ec86ad6fd7eee8a11821c94361f1f9" + integrity sha512-uyAtT+32PfM29wRBeAkUSbkytqI8bNszNfAz2sGPtZBRmsZTYugKMEO9eDjAIE/pnT9CmbjNuoiXhk+Ss4fCOg== + +"@cspell/dict-django@^4.1.4": + version "4.1.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-django/-/dict-django-4.1.4.tgz#69298021c60b9b39d491c1a9caa2b33346311a2f" + integrity sha512-fX38eUoPvytZ/2GA+g4bbdUtCMGNFSLbdJJPKX2vbewIQGfgSFJKY56vvcHJKAvw7FopjvgyS/98Ta9WN1gckg== + +"@cspell/dict-docker@^1.1.14": + version "1.1.14" + resolved "https://registry.yarnpkg.com/@cspell/dict-docker/-/dict-docker-1.1.14.tgz#867797789360e7b9b36d8a146facf5a454f6fb08" + integrity sha512-p6Qz5mokvcosTpDlgSUREdSbZ10mBL3ndgCdEKMqjCSZJFdfxRdNdjrGER3lQ6LMq5jGr1r7nGXA0gvUJK80nw== + +"@cspell/dict-dotnet@^5.0.9": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@cspell/dict-dotnet/-/dict-dotnet-5.0.9.tgz#c615eb213d5ff3015aa43a1f2e67b2393346e774" + integrity sha512-JGD6RJW5sHtO5lfiJl11a5DpPN6eKSz5M1YBa1I76j4dDOIqgZB6rQexlDlK1DH9B06X4GdDQwdBfnpAB0r2uQ== + +"@cspell/dict-elixir@^4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@cspell/dict-elixir/-/dict-elixir-4.0.7.tgz#fd6136db9acb7912e495e02777e2141ef16822f4" + integrity sha512-MAUqlMw73mgtSdxvbAvyRlvc3bYnrDqXQrx5K9SwW8F7fRYf9V4vWYFULh+UWwwkqkhX9w03ZqFYRTdkFku6uA== + +"@cspell/dict-en-common-misspellings@^2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.0.11.tgz#5ba78c86c1d638d6c1acd4c6409d756266860822" + integrity sha512-xFQjeg0wFHh9sFhshpJ+5BzWR1m9Vu8pD0CGPkwZLK9oii8AD8RXNchabLKy/O5VTLwyqPOi9qpyp1cxm3US4Q== -ajv@^6.5.3: - version "6.5.4" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.4.tgz#247d5274110db653706b550fcc2b797ca28cfc59" - integrity sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" +"@cspell/dict-en-gb-mit@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@cspell/dict-en-gb-mit/-/dict-en-gb-mit-3.0.6.tgz#23af2677bc32deaca829efdfc45bd0efd1779af6" + integrity sha512-QYDwuXi9Yh+AvU1omhz8sWX+A1SxWI3zeK1HdGfTrICZavhp8xxcQGTa5zxTTFRCcQc483YzUH2Dl+6Zd50tJg== -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" +"@cspell/dict-en_us@^4.4.8": + version "4.4.8" + resolved "https://registry.yarnpkg.com/@cspell/dict-en_us/-/dict-en_us-4.4.8.tgz#36513b6b578d8d90ec8b68a7e780fde42ae08033" + integrity sha512-OkNUVuU9Q+Sf827/61YPkk6ya6dSsllzeYniBFqNW9TkoqQXT3vggkgmtCE1aEhSvVctMwxpPYoC8pZgn1TeSA== -alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= +"@cspell/dict-filetypes@^3.0.12": + version "3.0.12" + resolved "https://registry.yarnpkg.com/@cspell/dict-filetypes/-/dict-filetypes-3.0.12.tgz#cff1c2b3a8fed06235e5faf7a62f53ded06c2f4d" + integrity sha512-+ds5wgNdlUxuJvhg8A1TjuSpalDFGCh7SkANCWvIplg6QZPXL4j83lqxP7PgjHpx7PsBUS7vw0aiHPjZy9BItw== -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= +"@cspell/dict-flutter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-flutter/-/dict-flutter-1.1.0.tgz#66ecc468024aa9b1c7fa57698801642b979cf05e" + integrity sha512-3zDeS7zc2p8tr9YH9tfbOEYfopKY/srNsAa+kE3rfBTtQERAZeOhe5yxrnTPoufctXLyuUtcGMUTpxr3dO0iaA== -ansi-escapes@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" - integrity sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw== +"@cspell/dict-fonts@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-fonts/-/dict-fonts-4.0.4.tgz#4d853cb147363d8a0d8ad8d8d212b950a58eb6f4" + integrity sha512-cHFho4hjojBcHl6qxidl9CvUb492IuSk7xIf2G2wJzcHwGaCFa2o3gRcxmIg1j62guetAeDDFELizDaJlVRIOg== -ansi-regex@^2.0.0, ansi-regex@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= +"@cspell/dict-fsharp@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-fsharp/-/dict-fsharp-1.1.0.tgz#b14f6fff20486c45651303323e467534afdc6727" + integrity sha512-oguWmHhGzgbgbEIBKtgKPrFSVAFtvGHaQS0oj+vacZqMObwkapcTGu7iwf4V3Bc2T3caf0QE6f6rQfIJFIAVsw== -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= +"@cspell/dict-fullstack@^3.2.6": + version "3.2.6" + resolved "https://registry.yarnpkg.com/@cspell/dict-fullstack/-/dict-fullstack-3.2.6.tgz#a5916de25a0acc9cedef2fd97760e1656017280e" + integrity sha512-cSaq9rz5RIU9j+0jcF2vnKPTQjxGXclntmoNp4XB7yFX2621PxJcekGjwf/lN5heJwVxGLL9toR0CBlGKwQBgA== -ansi-regex@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" - integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w== +"@cspell/dict-gaming-terms@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.1.1.tgz#755d96864650f679ed5d0381e867380bf8efcf9a" + integrity sha512-tb8GFxjTLDQstkJcJ90lDqF4rKKlMUKs5/ewePN9P+PYRSehqDpLI5S5meOfPit8LGszeOrjUdBQ4zXo7NpMyQ== -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= +"@cspell/dict-git@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-git/-/dict-git-3.0.4.tgz#3753f17a2a122f4dc734a51820fac7b6ffc594f1" + integrity sha512-C44M+m56rYn6QCsLbiKiedyPTMZxlDdEYAsPwwlL5bhMDDzXZ3Ic8OCQIhMbiunhCOJJT+er4URmOmM+sllnjg== -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" +"@cspell/dict-golang@^6.0.21": + version "6.0.21" + resolved "https://registry.yarnpkg.com/@cspell/dict-golang/-/dict-golang-6.0.21.tgz#dc6fb7177cd99faa8bdebaecb22ec13570154424" + integrity sha512-D3wG1MWhFx54ySFJ00CS1MVjR4UiBVsOWGIjJ5Av+HamnguqEshxbF9mvy+BX0KqzdLVzwFkoLBs8QeOID56HA== -any-observable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" - integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== +"@cspell/dict-google@^1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@cspell/dict-google/-/dict-google-1.0.8.tgz#dee71c800211adc73d2f538e4fd75cc6fb1bc4b3" + integrity sha512-BnMHgcEeaLyloPmBs8phCqprI+4r2Jb8rni011A8hE+7FNk7FmLE3kiwxLFrcZnnb7eqM0agW4zUaNoB0P+z8A== -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= +"@cspell/dict-haskell@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@cspell/dict-haskell/-/dict-haskell-4.0.5.tgz#260f5412cfe5ef3ca7cd3604ecd93142e63c2a3a" + integrity sha512-s4BG/4tlj2pPM9Ha7IZYMhUujXDnI0Eq1+38UTTCpatYLbQqDwRFf2KNPLRqkroU+a44yTUAe0rkkKbwy4yRtQ== -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" +"@cspell/dict-html-symbol-entities@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.3.tgz#bf2887020ca4774413d8b1f27c9b6824ba89e9ef" + integrity sha512-aABXX7dMLNFdSE8aY844X4+hvfK7977sOWgZXo4MTGAmOzR8524fjbJPswIBK7GaD3+SgFZ2yP2o0CFvXDGF+A== -append-transform@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" - integrity sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw== - dependencies: - default-require-extensions "^2.0.0" +"@cspell/dict-html@^4.0.11": + version "4.0.11" + resolved "https://registry.yarnpkg.com/@cspell/dict-html/-/dict-html-4.0.11.tgz#410db0e062620841342f596b9187776091f81d44" + integrity sha512-QR3b/PB972SRQ2xICR1Nw/M44IJ6rjypwzA4jn+GH8ydjAX9acFNfc+hLZVyNe0FqsE90Gw3evLCOIF0vy1vQw== -aproba@^1.0.3, aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== +"@cspell/dict-java@^5.0.11": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@cspell/dict-java/-/dict-java-5.0.11.tgz#3cb0c7e8cf18d1da206fab3b5dbb64bd693a51f5" + integrity sha512-T4t/1JqeH33Raa/QK/eQe26FE17eUCtWu+JsYcTLkQTci2dk1DfcIKo8YVHvZXBnuM43ATns9Xs0s+AlqDeH7w== -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" +"@cspell/dict-julia@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-julia/-/dict-julia-1.1.0.tgz#06302765dbdb13023be506c27c26b2f3e475d1cc" + integrity sha512-CPUiesiXwy3HRoBR3joUseTZ9giFPCydSKu2rkh6I2nVjXnl5vFHzOMLXpbF4HQ1tH2CNfnDbUndxD+I+7eL9w== -argparse@^1.0.7: +"@cspell/dict-k8s@^1.0.10": version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" + resolved "https://registry.yarnpkg.com/@cspell/dict-k8s/-/dict-k8s-1.0.10.tgz#3f4f77a47d6062d66e85651a05482ad62dd65180" + integrity sha512-313haTrX9prep1yWO7N6Xw4D6tvUJ0Xsx+YhCP+5YrrcIKoEw5Rtlg8R4PPzLqe6zibw6aJ+Eqq+y76Vx5BZkw== -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= - dependencies: - arr-flatten "^1.0.1" +"@cspell/dict-kotlin@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-kotlin/-/dict-kotlin-1.1.0.tgz#67daf596e14b03a88152b2d124bc2bfa05c49717" + integrity sha512-vySaVw6atY7LdwvstQowSbdxjXG6jDhjkWVWSjg1XsUckyzH1JRHXe9VahZz1i7dpoFEUOWQrhIe5B9482UyJQ== -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= +"@cspell/dict-latex@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-latex/-/dict-latex-4.0.3.tgz#a1254c7d9c3a2d70cd6391a9f2f7694431b1b2cb" + integrity sha512-2KXBt9fSpymYHxHfvhUpjUFyzrmN4c4P8mwIzweLyvqntBT3k0YGZJSriOdjfUjwSygrfEwiuPI1EMrvgrOMJw== -arr-flatten@^1.0.1, arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== +"@cspell/dict-lorem-ipsum@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-4.0.4.tgz#8f83771617109b060c7d7713cb090ca43f64c97c" + integrity sha512-+4f7vtY4dp2b9N5fn0za/UR0kwFq2zDtA62JCbWHbpjvO9wukkbl4rZg4YudHbBgkl73HRnXFgCiwNhdIA1JPw== -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= +"@cspell/dict-lua@^4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@cspell/dict-lua/-/dict-lua-4.0.7.tgz#36559f77d8e036d058a29ab69da839bcb00d5918" + integrity sha512-Wbr7YSQw+cLHhTYTKV6cAljgMgcY+EUAxVIZW3ljKswEe4OLxnVJ7lPqZF5JKjlXdgCjbPSimsHqyAbC5pQN/Q== -array-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= +"@cspell/dict-makefile@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-makefile/-/dict-makefile-1.0.4.tgz#52ea60fbf30a9814229c222788813bf93cbf1f3e" + integrity sha512-E4hG/c0ekPqUBvlkrVvzSoAA+SsDA9bLi4xSV3AXHTVru7Y2bVVGMPtpfF+fI3zTkww/jwinprcU1LSohI3ylw== -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= +"@cspell/dict-markdown@^2.0.10": + version "2.0.10" + resolved "https://registry.yarnpkg.com/@cspell/dict-markdown/-/dict-markdown-2.0.10.tgz#7e00957036aa3da2ea133135ae53a9108fb6b223" + integrity sha512-vtVa6L/84F9sTjclTYDkWJF/Vx2c5xzxBKkQp+CEFlxOF2SYgm+RSoEvAvg5vj4N5kuqR4350ZlY3zl2eA3MXw== -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - dependencies: - array-uniq "^1.0.1" +"@cspell/dict-monkeyc@^1.0.10": + version "1.0.10" + resolved "https://registry.yarnpkg.com/@cspell/dict-monkeyc/-/dict-monkeyc-1.0.10.tgz#21955a891b27270424c6e1edaaa4b444fb077c4f" + integrity sha512-7RTGyKsTIIVqzbvOtAu6Z/lwwxjGRtY5RkKPlXKHEoEAgIXwfDxb5EkVwzGQwQr8hF/D3HrdYbRT8MFBfsueZw== + +"@cspell/dict-node@^5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@cspell/dict-node/-/dict-node-5.0.7.tgz#d26e558b2b157c254c6d5e5bf9b63cf35654c5ea" + integrity sha512-ZaPpBsHGQCqUyFPKLyCNUH2qzolDRm1/901IO8e7btk7bEDF56DN82VD43gPvD4HWz3yLs/WkcLa01KYAJpnOw== + +"@cspell/dict-npm@^5.2.3": + version "5.2.3" + resolved "https://registry.yarnpkg.com/@cspell/dict-npm/-/dict-npm-5.2.3.tgz#f33d259245ea15796627661ae91e6e25b039b3ae" + integrity sha512-EdGkCpAq66Mhi9Qldgsr+NvPVL4TdtmdlqDe4VBp0P3n6J0B7b0jT1MlVDIiLR+F1eqBfL0qjfHf0ey1CafeNw== + +"@cspell/dict-php@^4.0.14": + version "4.0.14" + resolved "https://registry.yarnpkg.com/@cspell/dict-php/-/dict-php-4.0.14.tgz#96d2b99816312bf6f52bc099af9dfea7994ff15e" + integrity sha512-7zur8pyncYZglxNmqsRycOZ6inpDoVd4yFfz1pQRe5xaRWMiK3Km4n0/X/1YMWhh3e3Sl/fQg5Axb2hlN68t1g== + +"@cspell/dict-powershell@^5.0.14": + version "5.0.14" + resolved "https://registry.yarnpkg.com/@cspell/dict-powershell/-/dict-powershell-5.0.14.tgz#c8d676e1548c45069dc211e8427335e421ab1cd7" + integrity sha512-ktjjvtkIUIYmj/SoGBYbr3/+CsRGNXGpvVANrY0wlm/IoGlGywhoTUDYN0IsGwI2b8Vktx3DZmQkfb3Wo38jBA== + +"@cspell/dict-public-licenses@^2.0.13": + version "2.0.13" + resolved "https://registry.yarnpkg.com/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.13.tgz#904c8b97ffb60691d28cce0fb5186a8dd473587d" + integrity sha512-1Wdp/XH1ieim7CadXYE7YLnUlW0pULEjVl9WEeziZw3EKCAw8ZI8Ih44m4bEa5VNBLnuP5TfqC4iDautAleQzQ== + +"@cspell/dict-python@^4.2.18": + version "4.2.18" + resolved "https://registry.yarnpkg.com/@cspell/dict-python/-/dict-python-4.2.18.tgz#3f7fdd73a392a563491ffc0e7812356863af4b14" + integrity sha512-hYczHVqZBsck7DzO5LumBLJM119a3F17aj8a7lApnPIS7cmEwnPc2eACNscAHDk7qAo2127oI7axUoFMe9/g1g== + dependencies: + "@cspell/dict-data-science" "^2.0.8" + +"@cspell/dict-r@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-r/-/dict-r-2.1.0.tgz#147a01b36fc4ae2381c88a00b1f8ba7fad77a4f1" + integrity sha512-k2512wgGG0lTpTYH9w5Wwco+lAMf3Vz7mhqV8+OnalIE7muA0RSuD9tWBjiqLcX8zPvEJr4LdgxVju8Gk3OKyA== -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= +"@cspell/dict-ruby@^5.0.8": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@cspell/dict-ruby/-/dict-ruby-5.0.8.tgz#25a8f47db12cabeaddde2f38ba3d6c51fb94d7f7" + integrity sha512-ixuTneU0aH1cPQRbWJvtvOntMFfeQR2KxT8LuAv5jBKqQWIHSxzGlp+zX3SVyoeR0kOWiu64/O5Yn836A5yMcQ== -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= +"@cspell/dict-rust@^4.0.11": + version "4.0.11" + resolved "https://registry.yarnpkg.com/@cspell/dict-rust/-/dict-rust-4.0.11.tgz#4b6d1839dbcca7e50e2e4e2b1c45d785d2634b14" + integrity sha512-OGWDEEzm8HlkSmtD8fV3pEcO2XBpzG2XYjgMCJCRwb2gRKvR+XIm6Dlhs04N/K2kU+iH8bvrqNpM8fS/BFl0uw== -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +"@cspell/dict-scala@^5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@cspell/dict-scala/-/dict-scala-5.0.7.tgz#831516fb1434b0fc867254cfb4a343eb0aaadeab" + integrity sha512-yatpSDW/GwulzO3t7hB5peoWwzo+Y3qTc0pO24Jf6f88jsEeKmDeKkfgPbYuCgbE4jisGR4vs4+jfQZDIYmXPA== -arrify@^1.0.0, arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= +"@cspell/dict-shell@1.1.0", "@cspell/dict-shell@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-shell/-/dict-shell-1.1.0.tgz#3110d5c81cb5bd7f6c0cc88e6e8ac7ccf6fa65b5" + integrity sha512-D/xHXX7T37BJxNRf5JJHsvziFDvh23IF/KvkZXNSh8VqcRdod3BAz9VGHZf6VDqcZXr1VRqIYR3mQ8DSvs3AVQ== -asap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/asap/-/asap-1.0.0.tgz#b2a45da5fdfa20b0496fc3768cc27c12fa916a7d" - integrity sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0= +"@cspell/dict-software-terms@^5.0.8": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@cspell/dict-software-terms/-/dict-software-terms-5.0.8.tgz#baa277fabfc70f3d8453830e26628ee6df53fad9" + integrity sha512-VsJesitvaHZpMgNwHHms3yDsZz7LNToC2HuSAnyt1znn37ribiJF1ty0jWhVQO6fv7K4PM1KsKTJIwqBwc446g== -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= +"@cspell/dict-sql@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@cspell/dict-sql/-/dict-sql-2.2.0.tgz#850fc6eaa38e11e413712f332ab03bee4bd652ce" + integrity sha512-MUop+d1AHSzXpBvQgQkCiok8Ejzb+nrzyG16E8TvKL2MQeDwnIvMe3bv90eukP6E1HWb+V/MA/4pnq0pcJWKqQ== -asn1.js@^4.0.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" +"@cspell/dict-svelte@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@cspell/dict-svelte/-/dict-svelte-1.0.6.tgz#367b3e743475e7641caa8b750b222374be2c4d38" + integrity sha512-8LAJHSBdwHCoKCSy72PXXzz7ulGROD0rP1CQ0StOqXOOlTUeSFaJJlxNYjlONgd2c62XBQiN2wgLhtPN+1Zv7Q== -asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" - integrity sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y= +"@cspell/dict-swift@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@cspell/dict-swift/-/dict-swift-2.0.5.tgz#72d37a3ea53d6a9ec1f4b553959268ce58acff28" + integrity sha512-3lGzDCwUmnrfckv3Q4eVSW3sK3cHqqHlPprFJZD4nAqt23ot7fic5ALR7J4joHpvDz36nHX34TgcbZNNZOC/JA== -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= +"@cspell/dict-terraform@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-terraform/-/dict-terraform-1.1.1.tgz#23a25f64eb7495642ab17b8fbeda46ac10cd6f43" + integrity sha512-07KFDwCU7EnKl4hOZLsLKlj6Zceq/IsQ3LRWUyIjvGFfZHdoGtFdCp3ZPVgnFaAcd/DKv+WVkrOzUBSYqHopQQ== -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - integrity sha1-104bh+ev/A24qttwIfP+SBAasjQ= +"@cspell/dict-typescript@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@cspell/dict-typescript/-/dict-typescript-3.2.1.tgz#638b5d48b97d00b3db15746dd5cdf5535147fb55" + integrity sha512-jdnKg4rBl75GUBTsUD6nTJl7FGvaIt5wWcWP7TZSC3rV1LfkwvbUiY3PiGpfJlAIdnLYSeFWIpYU9gyVgz206w== -assert@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" - integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= +"@cspell/dict-vue@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@cspell/dict-vue/-/dict-vue-3.0.4.tgz#0f1cb65e2f640925de72acbc1cae9e87f7727c05" + integrity sha512-0dPtI0lwHcAgSiQFx8CzvqjdoXROcH+1LyqgROCpBgppommWpVhbQ0eubnKotFEXgpUCONVkeZJ6Ql8NbTEu+w== + +"@cspell/dynamic-import@9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@cspell/dynamic-import/-/dynamic-import-9.0.1.tgz#e71d33bd13ffd2ab86227d955a3d4c62791a3b6b" + integrity sha512-BoWzHwkufo90ubMZUN8Jy4HQYYWFW7psVCdG/4RUgfvVnazkPfLxWBbsPQsLrlIP0utaqei7D9FU0K7r7mpl4A== + dependencies: + "@cspell/url" "9.0.1" + import-meta-resolve "^4.1.0" + +"@cspell/filetypes@9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@cspell/filetypes/-/filetypes-9.0.1.tgz#349f5e6e28ff741720df8f6e44a8e6d42ea37e6e" + integrity sha512-swZu3ra2AueyjEz/bPsvwFuHGYhjWZBx1K9FSvZA/yDIX5RVr6orQSuf9zvXNFui6Nyk0tudLnn3y9jT0LHk8A== + +"@cspell/strong-weak-map@9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@cspell/strong-weak-map/-/strong-weak-map-9.0.1.tgz#509819ab5503ffb21794fbba5d19650fdf05985b" + integrity sha512-u87PWr1xACqs/F3HibZ4Eb0Za/ghWIa6WLvEKV9OaiLfEUQuczbrXPVgHmGr83H0XXWUKy8FvVbWGFmXwiw+gQ== + +"@cspell/url@9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@cspell/url/-/url-9.0.1.tgz#bffe68a51b98e4c1a7dfbd2d42994451510a02f9" + integrity sha512-8xaLrsQ742dmwXwS6tjreps3NpSQe6WEZFPQQT2DprVJXGZnfQR8ob0c+kPhD0hu9A6PwShJsRsfh3DQGKCqAw== + +"@discoveryjs/json-ext@^0.6.1": + version "0.6.3" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz#f13c7c205915eb91ae54c557f5e92bddd8be0e83" + integrity sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ== + +"@es-joy/jsdoccomment@~0.49.0": + version "0.49.0" + resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.49.0.tgz#e5ec1eda837c802eca67d3b29e577197f14ba1db" + integrity sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q== + dependencies: + comment-parser "1.4.1" + esquery "^1.6.0" + jsdoc-type-pratt-parser "~4.1.0" + +"@eslint-community/eslint-utils@^4.1.2", "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0", "@eslint-community/eslint-utils@^4.5.0", "@eslint-community/eslint-utils@^4.5.1": + version "4.5.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz#b0fc7e06d0c94f801537fd4237edc2706d3b8e4c" + integrity sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.11.0", "@eslint-community/regexpp@^4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" + integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== + +"@eslint/config-array@^0.20.0": + version "0.20.0" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.20.0.tgz#7a1232e82376712d3340012a2f561a2764d1988f" + integrity sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ== + dependencies: + "@eslint/object-schema" "^2.1.6" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/config-helpers@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.2.1.tgz#26042c028d1beee5ce2235a7929b91c52651646d" + integrity sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw== + +"@eslint/core@^0.13.0": + version "0.13.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.13.0.tgz#bf02f209846d3bf996f9e8009db62df2739b458c" + integrity sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/eslintrc@^3.3.1": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz#e55f7f1dd400600dd066dbba349c4c0bac916964" + integrity sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@9.25.1", "@eslint/js@^9.21.0": + version "9.25.1" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.25.1.tgz#25f5c930c2b68b5ebe7ac857f754cbd61ef6d117" + integrity sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg== + +"@eslint/object-schema@^2.1.6": + version "2.1.6" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" + integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== + +"@eslint/plugin-kit@^0.2.7", "@eslint/plugin-kit@^0.2.8": + version "0.2.8" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz#47488d8f8171b5d4613e833313f3ce708e3525f8" + integrity sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA== dependencies: - util "0.10.3" + "@eslint/core" "^0.13.0" + levn "^0.4.1" -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== +"@humanfs/node@^0.16.6": + version "0.16.6" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" + integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.3.0" -async-each@^1.0.0: +"@humanwhocodes/module-importer@^1.0.1": version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - integrity sha1-GdOGodntxufByF04iu28xW0zYC0= + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -async-limiter@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" - integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== - -async@1.x, async@^1.4.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= +"@humanwhocodes/retry@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" + integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== -async@^2.1.4: - version "2.6.1" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" - integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== +"@humanwhocodes/retry@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.2.tgz#1860473de7dfa1546767448f333db80cb0ff2161" + integrity sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@isaacs/fs-minipass@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz#2d59ae3ab4b38fb4270bfa23d30f8e2e86c7fe32" + integrity sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w== dependencies: - lodash "^4.17.10" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + minipass "^7.0.4" -atob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" - integrity sha1-ri1acpR38onWDdf5amMUoi3Wwio= - -autoprefixer@^6.3.1: - version "6.7.7" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" - integrity sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ= - dependencies: - browserslist "^1.7.6" - caniuse-db "^1.0.30000634" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^5.2.16" - postcss-value-parser "^3.2.3" - -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - integrity sha1-FDQt0428yU0OW4fXY81jYSwOeU8= +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -aws4@^1.2.1, aws4@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" - integrity sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w== +"@jest/console@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" + integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + +"@jest/core@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" + integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== + dependencies: + "@jest/console" "^29.7.0" + "@jest/reporters" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + ci-info "^3.2.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^29.7.0" + jest-config "^29.7.0" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-resolve-dependencies "^29.7.0" + jest-runner "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + jest-watcher "^29.7.0" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" + integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== + dependencies: + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" -aws4@^1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" - integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== +"@jest/expect-utils@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" + integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== + dependencies: + jest-get-type "^29.6.3" -babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= +"@jest/expect@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" + integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.0.0, babel-core@^6.26.0: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-generator@^6.18.0, babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-jest@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.6.0.tgz#a644232366557a2240a0c083da6b25786185a2f1" - integrity sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew== - dependencies: - babel-plugin-istanbul "^4.1.6" - babel-preset-jest "^23.2.0" - -babel-jest@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.0.0-alpha.1.tgz#938cec03844a55c88e9caba883a8755b5251744c" - integrity sha512-WGyx048FHxnwHV6iCXElgNlxoZ/8lVHtyrjbh84/zq4xdEYi8pwGgKa+pyl/PZDKEaj9q53wAbn5f5T7DiSpiw== - dependencies: - babel-plugin-istanbul "^4.1.6" - babel-preset-jest "^24.0.0-alpha.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-istanbul@^4.1.6: - version "4.1.6" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" - integrity sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ== - dependencies: - babel-plugin-syntax-object-rest-spread "^6.13.0" - find-up "^2.1.0" - istanbul-lib-instrument "^1.10.1" - test-exclude "^4.2.1" - -babel-plugin-jest-hoist@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167" - integrity sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc= - -babel-plugin-jest-hoist@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.0.0-alpha.1.tgz#f34e318af20b8ff9132b8f123d16c5cd4be4d9b3" - integrity sha512-4VCaV7i8vTutkW7dhNrC/Y9ObKoxnXfUvzikZgJuD265I3CHQVZtlSk/Do9VcSHjdyvwKEn/hQUmC3cX6+t3RQ== - -babel-plugin-syntax-object-rest-spread@^6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - integrity sha1-/WU28rzhODb/o6VFjEkDpZe7O/U= - -babel-preset-jest@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46" - integrity sha1-jsegOhOPABoaj7HoETZSvxpV2kY= - dependencies: - babel-plugin-jest-hoist "^23.2.0" - babel-plugin-syntax-object-rest-spread "^6.13.0" - -babel-preset-jest@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.0.0-alpha.1.tgz#3fd2d18325a36d299d6c1b8ce827fc7a2c7ebcc9" - integrity sha512-aEI9leFxeFXG2lyHSMKR2JBYwRSnfsA0Ayu1osqI5ydOz0iZci1IXYP90ZOZp5Gfm/nBidG9ywHs/JmUXyvvLw== - dependencies: - babel-plugin-jest-hoist "^24.0.0-alpha.1" - babel-plugin-syntax-object-rest-spread "^6.13.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.0.0, babel-traverse@^6.18.0, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.0.0, babel-types@^6.18.0, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" + expect "^29.7.0" + jest-snapshot "^29.7.0" -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== +"@jest/fake-timers@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" + integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-util "^29.7.0" + +"@jest/globals@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" + integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/types" "^29.6.3" + jest-mock "^29.7.0" + +"@jest/reporters@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" + integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^6.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^29.7.0" + jest-util "^29.7.0" + jest-worker "^29.7.0" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" + integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== + dependencies: + "@jest/console" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" + integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== + dependencies: + "@jest/test-result" "^29.7.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + slash "^3.0.0" + +"@jest/transform@^29.7.0": + version "29.7.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" + integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.6.3" + "@jridgewell/trace-mapping" "^0.3.18" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" -balanced-match@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" - integrity sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg= +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -base64-js@^1.0.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" - integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== +"@jridgewell/source-map@^0.3.3": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== -benchmark@^2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/benchmark/-/benchmark-2.1.4.tgz#09f3de31c916425d498cc2ee565a0ebf3c2a5629" - integrity sha1-CfPeMckWQl1JjMLuVloOvzwqVik= +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: - lodash "^4.17.4" - platform "^1.3.3" + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" -big.js@^3.1.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" - integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== +"@jsdevtools/ono@^7.1.3": + version "7.1.3" + resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" + integrity sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg== -binary-extensions@^1.0.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" - integrity sha1-RqoXUftqL5PuXmibsQh9SxTGwgU= +"@jsonjoy.com/base64@^1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/base64/-/base64-1.1.2.tgz#cf8ea9dcb849b81c95f14fc0aaa151c6b54d2578" + integrity sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA== -bluebird@^3.5.0, bluebird@^3.5.x: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" - integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== +"@jsonjoy.com/json-pack@^1.0.3": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pack/-/json-pack-1.2.0.tgz#e658900e81d194903171c42546e1aa27f446846a" + integrity sha512-io1zEbbYcElht3tdlqEOFxZ0dMTYrHz9iMf0gqn1pPjZFTCgM5R4R5IMA20Chb2UPYYsxjzs8CgZ7Nb5n2K2rA== + dependencies: + "@jsonjoy.com/base64" "^1.1.1" + "@jsonjoy.com/util" "^1.1.2" + hyperdyperid "^1.2.0" + thingies "^1.20.0" -bluebird@^3.5.1: - version "3.5.3" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" - integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== +"@jsonjoy.com/util@^1.1.2", "@jsonjoy.com/util@^1.3.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/util/-/util-1.5.0.tgz#6008e35b9d9d8ee27bc4bfaa70c8cbf33a537b4c" + integrity sha512-ojoNsrIuPI9g6o8UxhraZQSyF2ByJanAY4cTFbc8Mf2AXEF4aQRGY1dJxyJpuyav8r9FGflEt/Ff3u5Nt6YMPA== + +"@kwsites/file-exists@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@kwsites/file-exists/-/file-exists-1.1.1.tgz#ad1efcac13e1987d8dbaf235ef3be5b0d96faa99" + integrity sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw== + dependencies: + debug "^4.1.1" -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== +"@kwsites/promise-deferred@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz#8ace5259254426ccef57f3175bc64ed7095ed919" + integrity sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw== -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - integrity sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8= +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: - hoek "2.x.x" + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= +"@npmcli/agent@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/agent/-/agent-3.0.0.tgz#1685b1fbd4a1b7bb4f930cbb68ce801edfe7aa44" + integrity sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q== dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" + agent-base "^7.1.0" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.1" + lru-cache "^10.0.1" + socks-proxy-agent "^8.0.3" -braces@^2.3.0, braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== +"@npmcli/fs@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-4.0.0.tgz#a1eb1aeddefd2a4a347eca0fab30bc62c0e1c0f2" + integrity sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q== dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" + semver "^7.3.5" -brorand@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -browser-process-hrtime@^0.1.2: +"@pkgr/core@^0.1.0": version "0.1.2" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" - integrity sha1-Ql1opY00R/AqBKqJQYf86K+Le44= + resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.2.tgz#1cf95080bb7072fafaa3cb13b442fab4695c3893" + integrity sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ== + +"@pkgr/core@^0.2.0": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.2.1.tgz#6d083acfddae21fb329c8df8c94bf895ce7d0c15" + integrity sha512-VzgHzGblFmUeBmmrk55zPyrQIArQN4vujc9shWytaPdB3P7qhi0cpaiKIr7tlCmFv2lYUwnLospIqjL9ZSAhhg== + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== -browser-resolve@^1.11.3: - version "1.11.3" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" - integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== +"@sinonjs/commons@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== dependencies: - resolve "1.1.7" + type-detect "4.0.8" -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== +"@sinonjs/fake-timers@^10.0.2": + version "10.3.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" + integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" + "@sinonjs/commons" "^3.0.0" -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== +"@stylistic/eslint-plugin@^4.2.0": + version "4.2.0" + resolved "https://registry.yarnpkg.com/@stylistic/eslint-plugin/-/eslint-plugin-4.2.0.tgz#7860ea84aa7ee3b21757907b863eb62f4f8b0455" + integrity sha512-8hXezgz7jexGHdo5WN6JBEIPHCSFyyU4vgbxevu4YLVS5vl+sxqAAGyXSzfNDyR6xMNSH5H1x67nsXcYMOHtZA== dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" + "@typescript-eslint/utils" "^8.23.0" + eslint-visitor-keys "^4.2.0" + espree "^10.3.0" + estraverse "^5.3.0" + picomatch "^4.0.2" -browserify-des@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.1.tgz#3343124db6d7ad53e26a8826318712bdc8450f9c" - integrity sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw== +"@tokenizer/token@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276" + integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A== + +"@types/babel__core@^7.1.14": + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" + integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" -browserify-rsa@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= +"@types/babel__generator@*": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.27.0.tgz#b5819294c51179957afaec341442f9341e4108a9" + integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== dependencies: - bn.js "^4.1.0" - randombytes "^2.0.1" + "@babel/types" "^7.0.0" -browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= - dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== +"@types/babel__template@*": + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: - pako "~1.0.5" + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" -browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: - version "1.7.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" - integrity sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk= +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.7.tgz#968cdc2366ec3da159f61166428ee40f370e56c2" + integrity sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng== dependencies: - caniuse-db "^1.0.30000639" - electron-to-chromium "^1.2.7" + "@babel/types" "^7.20.7" -bser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" - integrity sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk= +"@types/eslint-scope@^3.7.7": + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== dependencies: - node-int64 "^0.4.0" + "@types/eslint" "*" + "@types/estree" "*" -buffer-from@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" - integrity sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ== +"@types/eslint@*": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.1.tgz#d5795ad732ce81715f27f75da913004a56751584" + integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= +"@types/estree@*", "@types/estree@^1.0.6": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" + integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== + +"@types/glob-to-regexp@^0.4.4": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@types/glob-to-regexp/-/glob-to-regexp-0.4.4.tgz#409e71290253203185b1ea8a3d6ea406a4bdc902" + integrity sha512-nDKoaKJYbnn1MZxUY0cA1bPmmgZbg0cTq7Rh13d0KWYNOiKbqoR+2d89SnRPszGh7ROzSwZ/GOjZ4jPbmmZ6Eg== -buffer@^4.3.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= +"@types/graceful-fs@^4.1.3": + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" + "@types/node" "*" -builtin-modules@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= +"@types/istanbul-lib-report@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + dependencies: + "@types/istanbul-lib-coverage" "*" -bundle-loader@~0.5.0: - version "0.5.6" - resolved "https://registry.yarnpkg.com/bundle-loader/-/bundle-loader-0.5.6.tgz#6c9042e62f1c89941458805a3a479d10f34c71fd" - integrity sha512-SUgX+u/LJzlJiuoIghuubZ66eflehnjmqSfh/ib9DTe08sxRJ5F/MhHSjp7GfSJivSp8NWgez4PVNAUuMg7vSg== +"@types/istanbul-reports@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: - loader-utils "^1.1.0" + "@types/istanbul-lib-report" "*" -cacache@^11.0.2: - version "11.3.1" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.1.tgz#d09d25f6c4aca7a6d305d141ae332613aa1d515f" - integrity sha512-2PEw4cRRDu+iQvBTTuttQifacYjLPhET+SYO/gEFMy8uhi+jlJREDAjSF5FWSdV/Aw5h18caHA7vMTw2c+wDzA== - dependencies: - bluebird "^3.5.1" - chownr "^1.0.1" - figgy-pudding "^3.1.0" - glob "^7.1.2" - graceful-fs "^4.1.11" - lru-cache "^4.1.3" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.2" - ssri "^6.0.0" - unique-filename "^1.1.0" - y18n "^4.0.0" +"@types/jest@^29.5.11": + version "29.5.14" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5" + integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== +"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.6", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/mime-types@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@types/mime-types/-/mime-types-2.1.4.tgz#93a1933e24fed4fb9e4adc5963a63efcbb3317a2" + integrity sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w== + +"@types/node@*", "@types/node@^22.15.11": + version "22.15.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.15.12.tgz#9ce54e51e09536faa94e4ec300c4728ee83bfa85" + integrity sha512-K0fpC/ZVeb8G9rm7bH7vI0KAec4XHEhBam616nVJCV51bKzJ6oA3luG4WdKoaztxe70QaNjS/xBmcDLmr4PiGw== dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" + undici-types "~6.21.0" -call-me-maybe@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b" - integrity sha1-JtII6onje1y95gJQoV8DHBak1ms= +"@types/stack-utils@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= +"@types/xxhashjs@^0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@types/xxhashjs/-/xxhashjs-0.2.4.tgz#fd35be1a3673295337f932c182e02ade748c1922" + integrity sha512-E2+ZoJY2JjmVPN0iQM5gJvZkk98O2PYXSi6HrciEk3EKF34+mauEk/HgwTeCz+2r8HXHMKpucrwy4qTT12OPaQ== dependencies: - callsites "^0.2.0" + "@types/node" "*" -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^17.0.8": + version "17.0.33" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" + integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/scope-manager@8.29.0": + version "8.29.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.29.0.tgz#8fd9872823aef65ff71d3f6d1ec9316ace0b6bf3" + integrity sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw== + dependencies: + "@typescript-eslint/types" "8.29.0" + "@typescript-eslint/visitor-keys" "8.29.0" + +"@typescript-eslint/types@8.29.0": + version "8.29.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.29.0.tgz#65add70ab4ef66beaa42a5addf87dab2b05b1f33" + integrity sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg== + +"@typescript-eslint/typescript-estree@8.29.0": + version "8.29.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.29.0.tgz#d201a4f115327ec90496307c9958262285065b00" + integrity sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow== + dependencies: + "@typescript-eslint/types" "8.29.0" + "@typescript-eslint/visitor-keys" "8.29.0" + debug "^4.3.4" + fast-glob "^3.3.2" + is-glob "^4.0.3" + minimatch "^9.0.4" + semver "^7.6.0" + ts-api-utils "^2.0.1" + +"@typescript-eslint/utils@^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/utils@^8.23.0": + version "8.29.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.29.0.tgz#d6d22b19c8c4812a874f00341f686b45b9fe895f" + integrity sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@typescript-eslint/scope-manager" "8.29.0" + "@typescript-eslint/types" "8.29.0" + "@typescript-eslint/typescript-estree" "8.29.0" + +"@typescript-eslint/visitor-keys@8.29.0": + version "8.29.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.29.0.tgz#2356336c9efdc3597ffcd2aa1ce95432852b743d" + integrity sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg== + dependencies: + "@typescript-eslint/types" "8.29.0" + eslint-visitor-keys "^4.2.0" + +"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" + integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== + dependencies: + "@webassemblyjs/helper-numbers" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA= +"@webassemblyjs/floating-point-hex-parser@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#fcca1eeddb1cc4e7b6eed4fc7956d6813b21b9fb" + integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= +"@webassemblyjs/helper-api-error@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#e0a16152248bc38daee76dd7e21f15c5ef3ab1e7" + integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= +"@webassemblyjs/helper-buffer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz#822a9bc603166531f7d5df84e67b5bf99b72b96b" + integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== -caniuse-api@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" - integrity sha1-tTTnxzTE+B7F++isoq0kNUuWLGw= +"@webassemblyjs/helper-numbers@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#dbd932548e7119f4b8a7877fd5a8d20e63490b2d" + integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== dependencies: - browserslist "^1.3.6" - caniuse-db "^1.0.30000529" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" + "@webassemblyjs/floating-point-hex-parser" "1.13.2" + "@webassemblyjs/helper-api-error" "1.13.2" + "@xtuc/long" "4.2.2" -caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000840" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000840.tgz#68d5a0f0694c92180b0d82e720d70f8e61366604" - integrity sha1-aNWg8GlMkhgLDYLnINcPjmE2ZgQ= +"@webassemblyjs/helper-wasm-bytecode@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#e556108758f448aae84c850e593ce18a0eb31e0b" + integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== -capture-exit@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" - integrity sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28= +"@webassemblyjs/helper-wasm-section@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz#9629dda9c4430eab54b591053d6dc6f3ba050348" + integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== dependencies: - rsvp "^3.3.3" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/wasm-gen" "1.14.1" -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= +"@webassemblyjs/ieee754@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz#1c5eaace1d606ada2c7fd7045ea9356c59ee0dba" + integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" + "@xtuc/ieee754" "^1.2.0" -chalk@^1.0.0, chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= +"@webassemblyjs/leb128@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz#57c5c3deb0105d02ce25fa3fd74f4ebc9fd0bbb0" + integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" + integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== +"@webassemblyjs/wasm-edit@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" + integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/helper-wasm-section" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-opt" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + "@webassemblyjs/wast-printer" "1.14.1" + +"@webassemblyjs/wasm-gen@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz#991e7f0c090cb0bb62bbac882076e3d219da9570" + integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" -chalk@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65" - integrity sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ== +"@webassemblyjs/wasm-opt@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz#e6f71ed7ccae46781c206017d3c14c50efa8106b" + integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" -character-parser@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-1.2.1.tgz#c0dde4ab182713b919b970959a123ecc1a30fcd6" - integrity sha1-wN3kqxgnE7kZuXCVmhI+zBow/NY= +"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" + integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-api-error" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" -character-parser@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0" - integrity sha1-x84o821LzZdE5f/CxfzeHHMmH8A= +"@webassemblyjs/wast-printer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz#3bb3e9638a8ae5fdaf9610e7a06b4d9f9aa6fe07" + integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== dependencies: - is-regex "^1.0.3" + "@webassemblyjs/ast" "1.14.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-3.0.1.tgz#76ac285b9658fa642ce238c276264589aa2b6b57" + integrity sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA== -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== +"@webpack-cli/info@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-3.0.1.tgz#3cff37fabb7d4ecaab6a8a4757d3826cf5888c63" + integrity sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ== -chokidar@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.3.tgz#dcbd4f6cbb2a55b4799ba8a840ac527e5f4b1176" - integrity sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.0" - braces "^2.3.0" - glob-parent "^3.1.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^2.1.1" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - upath "^1.0.0" - optionalDependencies: - fsevents "^1.1.2" +"@webpack-cli/serve@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-3.0.1.tgz#bd8b1f824d57e30faa19eb78e4c0951056f72f00" + integrity sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg== -chownr@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" - integrity sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE= +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== -chrome-trace-event@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" - integrity sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A== - dependencies: - tslib "^1.9.0" +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -ci-info@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2" - integrity sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg== +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== -ci-info@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== +abbrev@1.0.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== + +abbrev@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-3.0.1.tgz#8ac8b3b5024d31464fe2a5feeea9f4536bf44025" + integrity sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + event-target-shim "^5.0.0" -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -clap@^1.0.9: - version "1.2.3" - resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" - integrity sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA== +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +acorn@^8.14.0, acorn@^8.8.2: + version "8.14.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" + integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== + +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.3" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1" + integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== dependencies: - chalk "^1.1.3" + clean-stack "^2.0.0" + indent-string "^4.0.0" -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" + ajv "^8.0.0" -clean-css@^3.1.9: - version "3.4.28" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-3.4.28.tgz#bf1945e82fc808f55695e6ddeaec01400efd03ff" - integrity sha1-vxlF6C/ICPVWlebd6uwBQA79A/8= +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== dependencies: - commander "2.8.x" - source-map "0.4.x" + fast-deep-equal "^3.1.3" -clean-css@^4.1.11: - version "4.1.11" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a" - integrity sha1-Ls3xRaujj1R0DybO/Q/z4D4SXWo= +ajv@^6.12.4, ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: - source-map "0.5.x" + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" -cli-color@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-1.3.0.tgz#cd2ec212efbd1a0eeb5b017f17d4e2d15e91420f" - integrity sha512-XmbLr8MzgOup/sPHF4nOZerCOcL7rD7vKWpEl0axUsMAY+AEimOhYva1ksskWqkLGY/bjR9h7Cfbr+RrJRfmTQ== +ajv@^8.0.0, ajv@^8.1.0, ajv@^8.9.0: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: - ansi-regex "^2.1.1" - d "1" - es5-ext "^0.10.46" - es6-iterator "^2.0.3" - memoizee "^0.4.14" - timers-ext "^0.1.5" + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" -cli-cursor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" - integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc= +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: - restore-cursor "^1.0.1" + type-fest "^0.21.3" -cli-cursor@^2.0.0, cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= +ansi-escapes@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz#00fc19f491bbb18e1d481b97868204f92109bfe7" + integrity sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw== dependencies: - restore-cursor "^2.0.0" + environment "^1.0.0" -cli-truncate@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" - integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ= +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: - slice-ansi "0.0.4" - string-width "^1.0.1" + color-convert "^2.0.1" -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= +ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@^3.0.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" + normalize-path "^3.0.0" + picomatch "^2.0.4" -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== +append-transform@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" + integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" + default-require-extensions "^3.0.0" -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== -clone@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= +are-docs-informative@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/are-docs-informative/-/are-docs-informative-0.0.2.tgz#387f0e93f5d45280373d387a59d34c96db321963" + integrity sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig== -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" -coa@~1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" - integrity sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0= +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-timsort@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-timsort/-/array-timsort-1.0.3.tgz#3c9e4199e54fb2b9c3fe5976396a21614ef0d926" + integrity sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ== + +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +assemblyscript@^0.27.34: + version "0.27.36" + resolved "https://registry.yarnpkg.com/assemblyscript/-/assemblyscript-0.27.36.tgz#5ff7ae6c3047e96b13de32d4dc741f256d33943f" + integrity sha512-1qX2zf6p7l/mNYv8r21jC/Yft7kX7XKR3xUHw41zvV4xad5lyC8w7jZiwZBGoy64VKZLc+bTDJDWi8Kb70YrHA== dependencies: - q "^1.1.2" + binaryen "116.0.0-nightly.20240114" + long "^5.2.4" -codacy-coverage@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/codacy-coverage/-/codacy-coverage-2.1.1.tgz#8d22a58ef6858602d01de2ff2563be06c57e29a3" - integrity sha512-MGMkPS5d9AqQEXTZ4grn/syl/7VvOehgWTeU2B41E22q767QolclfdfadKAndL287cIPEOEdwh9JBqCwQJLtFw== - dependencies: - bluebird "^3.5.x" - commander "^2.x" - joi "^12.x" - lcov-parse "^1.x" - lodash "^4.17.4" - log-driver "^1.x" - request "^2.83.0" - request-promise "^4.x" - -code-point-at@^1.0.0: +assert-never@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/assert-never/-/assert-never-1.4.0.tgz#b0d4988628c87f35eb94716cc54422a63927e175" + integrity sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA== + +async@1.x: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +axios@^1.4.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.9.0.tgz#25534e3b72b54540077d33046f77e3b8d7081901" + integrity sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +babel-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" + integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== + dependencies: + "@jest/transform" "^29.7.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.6.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-loader@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-10.0.0.tgz#b9743714c0e1e084b3e4adef3cd5faee33089977" + integrity sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA== + dependencies: + find-up "^5.0.0" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" + integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-preset-current-node-syntax@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" + integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-import-attributes" "^7.24.7" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + +babel-preset-jest@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" + integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + +babel-walk@3.0.0-canary-5: + version "3.0.0-canary-5" + resolved "https://registry.yarnpkg.com/babel-walk/-/babel-walk-3.0.0-canary-5.tgz#f66ecd7298357aee44955f235a6ef54219104b11" + integrity sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw== + dependencies: + "@babel/types" "^7.9.6" -coffee-loader@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/coffee-loader/-/coffee-loader-0.9.0.tgz#6deabd336062ddc6d773da4dfd16367fc7107bd6" - integrity sha512-VSoQ5kWr6Yfjn4RDpVbba2XMs3XG1ZXtLakPRt8dNfUcNU9h+1pocpdUUEd7NK9rLDwrju4yonhxrL8aMr5tww== - dependencies: - loader-utils "^1.0.2" +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -coffeescript@^1.10.0: - version "1.12.7" - resolved "https://registry.yarnpkg.com/coffeescript/-/coffeescript-1.12.7.tgz#e57ee4c4867cf7f606bfc4a0f2d550c0981ddd27" - integrity sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA== +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== -color-convert@^1.3.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" - integrity sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ== - dependencies: - color-name "^1.1.1" +binaryen@116.0.0-nightly.20240114: + version "116.0.0-nightly.20240114" + resolved "https://registry.yarnpkg.com/binaryen/-/binaryen-116.0.0-nightly.20240114.tgz#ad8bfbde77d4cb4715b93997114eefc30f45155b" + integrity sha512-0GZrojJnuhoe+hiwji7QFaL3tBlJoA+KFUN7ouYSDGZLSo9CKM8swQX8n/UcbR0d1VuZKU+nhogNzv423JEu5A== -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: - color-name "1.1.3" + balanced-match "^1.0.0" + concat-map "0.0.1" -color-name@1.1.3, color-name@^1.0.0, color-name@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" -color-string@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" - integrity sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE= +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: - color-name "^1.0.0" + fill-range "^7.1.1" -color@^0.11.0: - version "0.11.4" - resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" - integrity sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q= +browserslist@^4.24.0, browserslist@^4.24.4: + version "4.24.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" + integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== dependencies: - clone "^1.0.2" - color-convert "^1.3.0" - color-string "^0.3.0" + caniuse-lite "^1.0.30001688" + electron-to-chromium "^1.5.73" + node-releases "^2.0.19" + update-browserslist-db "^1.1.1" -colormin@^1.0.5: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" - integrity sha1-6i90IKcrlogaOKrlnsEkpvcpgTM= +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== dependencies: - color "^0.11.0" - css-color-names "0.0.4" - has "^1.0.1" + node-int64 "^0.4.0" -colors@~1.1.2: +buffer-from@^1.0.0: version "1.1.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" - integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" - integrity sha1-cj599ugBrFYTETp+RFqbactjKBg= +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== dependencies: - delayed-stream "~1.0.0" + base64-js "^1.3.1" + ieee754 "^1.2.1" -combined-stream@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" - integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== +builtin-modules@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-5.0.0.tgz#9be95686dedad2e9eed05592b07733db87dcff1a" + integrity sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg== + +bundle-loader@^0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/bundle-loader/-/bundle-loader-0.5.6.tgz#6c9042e62f1c89941458805a3a479d10f34c71fd" + integrity sha512-SUgX+u/LJzlJiuoIghuubZ66eflehnjmqSfh/ib9DTe08sxRJ5F/MhHSjp7GfSJivSp8NWgez4PVNAUuMg7vSg== dependencies: - delayed-stream "~1.0.0" + loader-utils "^1.1.0" -commander@2.8.x: - version "2.8.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4" - integrity sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ= +bundle-name@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" + integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== + dependencies: + run-applescript "^7.0.0" + +cacache@^19.0.1: + version "19.0.1" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-19.0.1.tgz#3370cc28a758434c85c2585008bd5bdcff17d6cd" + integrity sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ== + dependencies: + "@npmcli/fs" "^4.0.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^10.0.1" + minipass "^7.0.3" + minipass-collect "^2.0.1" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^7.0.2" + ssri "^12.0.0" + tar "^7.4.3" + unique-filename "^4.0.0" + +caching-transform@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" + integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== dependencies: - graceful-readlink ">= 1.0.0" + hasha "^5.0.0" + make-dir "^3.0.0" + package-hash "^4.0.0" + write-file-atomic "^3.0.0" -commander@^2.14.1, commander@^2.9.0, commander@^2.x: - version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" - integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" + integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" -commander@~2.17.1: - version "2.17.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" - integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== +call-bound@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" + integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== + dependencies: + call-bind-apply-helpers "^1.0.2" + get-intrinsic "^1.3.0" -commander@~2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.6.0.tgz#9df7e52fb2a0cb0fb89058ee80c3104225f37e1d" - integrity sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0= +call-me-maybe@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.2.tgz#03f964f19522ba643b1b0693acb9152fe2074baa" + integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= +callsites@^3.0.0, callsites@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -compare-versions@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.3.0.tgz#af93ea705a96943f622ab309578b9b90586f39c3" - integrity sha512-MAAAIOdi2s4Gl6rZ76PNcUa9IOYB+5ICdT41o5uMRf09aEu/F9RK+qhe8RjXNPwcTjGV7KU7h2P/fljThFVqyQ== +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= +caniuse-lite@^1.0.30001688: + version "1.0.30001712" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001712.tgz#41ee150f12de11b5f57c5889d4f30deb451deedf" + integrity sha512-MBqPpGYYdQ7/hfKiet9SCI+nmN5/hp4ZzveOJubl5DTAMa5oggjAuoi0Z4onBpKPFI2ePGnQuQIzF3VxDjDJig== -concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== +chalk-template@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/chalk-template/-/chalk-template-1.1.0.tgz#ffc55db6dd745e9394b85327c8ac8466edb7a7b1" + integrity sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg== dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" + chalk "^5.2.0" -console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: - date-now "^0.1.4" + ansi-styles "^4.1.0" + supports-color "^7.1.0" -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= +chalk@^5.2.0, chalk@^5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.1.tgz#1b48bf0963ec158dce2aacf69c093ae2dd2092d8" + integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== -constantinople@^3.0.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-3.1.2.tgz#d45ed724f57d3d10500017a7d3a889c1381ae647" - integrity sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw== - dependencies: - "@types/babel-types" "^7.0.0" - "@types/babylon" "^6.16.2" - babel-types "^6.26.0" - babylon "^6.18.0" +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== -constantinople@~3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-3.0.2.tgz#4b945d9937907bcd98ee575122c3817516544141" - integrity sha1-S5RdmTeQe82Y7ldRIsOBdRZUQUE= +character-parser@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0" + integrity sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw== dependencies: - acorn "^2.1.0" + is-regex "^1.0.3" -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= +chokidar@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" -content-disposition@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.1.tgz#87476c6a67c8daa87e32e87616df883ba7fb071b" - integrity sha1-h0dsamfI2qh+Muh2Ft+IO6f7Bxs= +chownr@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-3.0.0.tgz#9855e64ecd240a9cc4267ce8a4aa5d24a1da15e4" + integrity sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g== -content-type@~1.0.1: +chrome-trace-event@^1.0.2: version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -convert-source-map@^1.4.0, convert-source-map@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" - integrity sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU= + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" + integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== -cookie@0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.1.5.tgz#6ab9948a4b1ae21952cd2588530a4722d4044d7c" - integrity sha1-armUiksa4hlSzSWIUwpHItQETXw= +ci-info@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.2.0.tgz#cbd21386152ebfe1d56f280a3b5feccbd96764c7" + integrity sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg== -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-js@^1.0.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" - integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY= - -core-js@^2.4.0, core-js@^2.5.0: - version "2.5.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" - integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw== - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +cjs-module-lexer@^1.0.0: + version "1.4.3" + resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz#0f79731eb8cfe1ec72acd4066efac9d61991b00d" + integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q== -cosmiconfig@^5.0.2: - version "5.0.5" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.5.tgz#a809e3c2306891ce17ab70359dc8bdf661fe2cd0" - integrity sha512-94j37OtvxS5w7qr7Ta6dt67tWdnOxigBVN4VnSxNXFez9o18PGQ0D33SchKP17r9LAcWVTYV72G6vDayAUBFIg== +clean-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7" + integrity sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw== dependencies: - is-directory "^0.3.1" - js-yaml "^3.9.0" - parse-json "^4.0.0" + escape-string-regexp "^1.0.5" -cosmiconfig@^5.0.6: - version "5.0.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.6.tgz#dca6cf680a0bd03589aff684700858c81abeeb39" - integrity sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ== - dependencies: - is-directory "^0.3.1" - js-yaml "^3.9.0" - parse-json "^4.0.0" +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -coveralls@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.2.tgz#f5a0bcd90ca4e64e088b710fa8dda640aea4884f" - integrity sha512-Tv0LKe/MkBOilH2v7WBiTBdudg2ChfGbdXafc/s330djpF3zKOmuehTeRwjXWc7pzfj9FrDUTA7tEx6Div8NFw== +clear-module@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/clear-module/-/clear-module-4.1.2.tgz#5a58a5c9f8dccf363545ad7284cad3c887352a80" + integrity sha512-LWAxzHqdHsAZlPlEyJ2Poz6AIs384mPeqLVCru2p0BrP9G/kVGuhNyZYClLO6cXlnuJjzC8xtsJIuMjKqLXoAw== dependencies: - growl "~> 1.10.0" - js-yaml "^3.11.0" - lcov-parse "^0.0.10" - log-driver "^1.2.7" - minimist "^1.2.0" - request "^2.85.0" + parent-module "^2.0.0" + resolve-from "^5.0.0" -create-ecdh@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== +cli-color@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-2.0.4.tgz#d658080290968816b322248b7306fad2346fb2c8" + integrity sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA== dependencies: - bn.js "^4.1.0" - elliptic "^6.0.0" + d "^1.0.1" + es5-ext "^0.10.64" + es6-iterator "^2.0.3" + memoizee "^0.4.15" + timers-ext "^0.1.7" -create-hash@^1.1.0, create-hash@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== +cli-cursor@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-5.0.0.tgz#24a4831ecf5a6b01ddeb32fb71a4b2088b0dce38" + integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" + restore-cursor "^5.0.0" -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -create-react-class@^15.6.0: - version "15.6.3" - resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.3.tgz#2d73237fb3f970ae6ebe011a9e66f46dbca80036" - integrity sha512-M+/3Q6E6DLO6Yx3OwrWjwHBnvfXXYA7W+dFjt/ZDBemHO1DDZhsalX/NUtnTYclN6GfnBDRh4qRHjcDHmlJBJg== - dependencies: - fbjs "^0.8.9" - loose-envify "^1.3.1" - object-assign "^4.1.1" - -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= +cli-truncate@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-4.0.0.tgz#6cc28a2924fee9e25ce91e973db56c7066e6172a" + integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" + slice-ansi "^5.0.0" + string-width "^7.0.0" -cross-spawn@^6.0.0, cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - integrity sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g= - dependencies: - boom "2.x.x" - -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -css-color-names@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= - -css-loader@^0.28.3: - version "0.28.11" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.11.tgz#c3f9864a700be2711bb5a2462b2389b1a392dab7" - integrity sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg== - dependencies: - babel-code-frame "^6.26.0" - css-selector-tokenizer "^0.7.0" - cssnano "^3.10.0" - icss-utils "^2.1.0" - loader-utils "^1.0.2" - lodash.camelcase "^4.3.0" - object-assign "^4.1.1" - postcss "^5.0.6" - postcss-modules-extract-imports "^1.2.0" - postcss-modules-local-by-default "^1.2.0" - postcss-modules-scope "^1.1.0" - postcss-modules-values "^1.3.0" - postcss-value-parser "^3.3.0" - source-list-map "^2.0.0" - -css-parse@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-1.0.4.tgz#38b0503fbf9da9f54e9c1dbda60e145c77117bdd" - integrity sha1-OLBQP7+dqfVOnB29pg4UXHcRe90= + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" -css-selector-tokenizer@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" - integrity sha1-5piEdK6MlTR3v15+/s/OzNnPTIY= +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: - cssesc "^0.1.0" - fastparse "^1.1.1" - regexpu-core "^1.0.0" - -css-stringify@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/css-stringify/-/css-stringify-1.0.5.tgz#b0d042946db2953bb9d292900a6cb5f6d0122031" - integrity sha1-sNBClG2ylTu50pKQCmy19tASIDE= + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" -css@~1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/css/-/css-1.0.8.tgz#9386811ca82bccc9ee7fb5a732b1e2a317c8a3e7" - integrity sha1-k4aBHKgrzMnuf7WnMrHioxfIo+c= +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: - css-parse "1.0.4" - css-stringify "1.0.5" + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" -cssesc@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" - integrity sha1-yBSQPkViM3GgR3tAEJqq++6t27Q= - -cssnano@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" - integrity sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg= - dependencies: - autoprefixer "^6.3.1" - decamelize "^1.1.2" - defined "^1.0.0" - has "^1.0.1" - object-assign "^4.0.1" - postcss "^5.0.14" - postcss-calc "^5.2.0" - postcss-colormin "^2.1.8" - postcss-convert-values "^2.3.4" - postcss-discard-comments "^2.0.4" - postcss-discard-duplicates "^2.0.1" - postcss-discard-empty "^2.0.1" - postcss-discard-overridden "^0.1.1" - postcss-discard-unused "^2.2.1" - postcss-filter-plugins "^2.0.0" - postcss-merge-idents "^2.1.5" - postcss-merge-longhand "^2.0.1" - postcss-merge-rules "^2.0.3" - postcss-minify-font-values "^1.0.2" - postcss-minify-gradients "^1.0.1" - postcss-minify-params "^1.0.4" - postcss-minify-selectors "^2.0.4" - postcss-normalize-charset "^1.1.0" - postcss-normalize-url "^3.0.7" - postcss-ordered-values "^2.1.0" - postcss-reduce-idents "^2.2.2" - postcss-reduce-initial "^1.0.0" - postcss-reduce-transforms "^1.0.3" - postcss-svgo "^2.1.1" - postcss-unique-selectors "^2.0.2" - postcss-value-parser "^3.2.3" - postcss-zindex "^2.0.1" - -csso@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" - integrity sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U= - dependencies: - clap "^1.0.9" - source-map "^0.5.3" - -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": - version "0.3.4" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz#8cd52e8a3acfd68d3aed38ee0a640177d2f9d797" - integrity sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog== - -"cssstyle@>= 0.3.1 < 0.4.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.3.1.tgz#6da9b4cff1bc5d716e6e5fe8e04fcb1b50a49adf" - integrity sha512-tNvaxM5blOnxanyxI6panOsnfiyLRj3HV4qjqqS45WPNS1usdYWRUQjqTEEELK73lpeP/1KoIGYUwrBn/VcECA== +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== dependencies: - cssom "0.3.x" + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" -cuint@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" - integrity sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs= +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== -cyclist@~0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" - integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= +coffee-loader@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/coffee-loader/-/coffee-loader-5.0.0.tgz#376de71ea3dc648a9c4cac5b02fbadb7c19c8e6e" + integrity sha512-gUIfnuyjVEkjuugx6uRHHhnqmjqsL5dlhYgvhAUla25EoQhI57IFBQvsHvJHtBv5BMB2IzTKezDU2SrZkEiPdQ== -d@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" - integrity sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8= - dependencies: - es5-ext "^0.10.9" +coffeescript@^2.5.1: + version "2.7.0" + resolved "https://registry.yarnpkg.com/coffeescript/-/coffeescript-2.7.0.tgz#a43ec03be6885d6d1454850ea70b9409c391279c" + integrity sha512-hzWp6TUE2d/jCcN67LrW1eh5b/rSDKQK6oD6VMLlggYVUUFexgTH9z3dNYihzX4RMhze5FTUsUmOXViJKFQR/A== -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" +collect-v8-coverage@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== -data-urls@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.0.0.tgz#24802de4e81c298ea8a9388bb0d8e461c774684f" - integrity sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA== +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== dependencies: - abab "^1.0.4" - whatwg-mimetype "^2.0.0" - whatwg-url "^6.4.0" + color-name "~1.1.4" -date-fns@^1.27.2: - version "1.29.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" - integrity sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw== +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= +colorette@^2.0.14, colorette@^2.0.20: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== -debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== dependencies: - ms "2.0.0" + delayed-stream "~1.0.0" -debug@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" +commander@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +commander@^12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== + +commander@^13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-13.1.0.tgz#776167db68c78f38dcce1f9b8d7b8b9a488abf46" + integrity sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +comment-json@^4.2.5: + version "4.2.5" + resolved "https://registry.yarnpkg.com/comment-json/-/comment-json-4.2.5.tgz#482e085f759c2704b60bc6f97f55b8c01bc41e70" + integrity sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw== + dependencies: + array-timsort "^1.0.3" + core-util-is "^1.0.3" + esprima "^4.0.1" + has-own-prop "^2.0.0" + repeat-string "^1.6.1" -debug@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" - integrity sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg== - dependencies: - ms "^2.1.1" +comment-parser@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.4.1.tgz#bdafead37961ac079be11eb7ec65c4d021eaf9cc" + integrity sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg== -debug@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" - integrity sha1-+HBX6ZWxofauaklgZkE3vFbwOdo= - dependencies: - ms "0.7.1" +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== -decamelize@^1.0.0, decamelize@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== -decamelize@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" - integrity sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg== +constantinople@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-4.0.1.tgz#0def113fa0e4dc8de83331a5cf79c8b325213151" + integrity sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw== dependencies: - xregexp "4.0.0" - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= + "@babel/parser" "^7.6.0" + "@babel/types" "^7.6.1" -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= +convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== -default-require-extensions@^2.0.0: +convert-source-map@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" - integrity sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc= - dependencies: - strip-bom "^3.0.0" - -define-properties@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== - dependencies: - object-keys "^1.0.12" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= +copy-anything@^2.0.1: + version "2.0.6" + resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" + integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== dependencies: - is-descriptor "^0.1.0" + is-what "^3.14.1" -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= +core-js-compat@^3.41.0: + version "3.41.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.41.0.tgz#4cdfce95f39a8f27759b667cf693d96e5dda3d17" + integrity sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A== dependencies: - is-descriptor "^1.0.0" + browserslist "^4.24.4" -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" +core-js@^3.6.5: + version "3.42.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.42.0.tgz#edbe91f78ac8cfb6df8d997e74d368a68082fe37" + integrity sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g== -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= +core-util-is@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^8.2.0: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + +create-jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" + integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-config "^29.7.0" + jest-util "^29.7.0" + prompts "^2.0.1" -del@^2.0.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= +cross-spawn@^7.0.0, cross-spawn@^7.0.3, cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" -del@^3.0.0: +crypto-random-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-4.0.0.tgz#5a3cc53d7dd86183df5da0312816ceeeb5bb1fc2" + integrity sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA== + dependencies: + type-fest "^1.0.1" + +cspell-config-lib@9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/cspell-config-lib/-/cspell-config-lib-9.0.1.tgz#ec00b2bf75d88507cc3e9b6e26d6a6ed0f6194f5" + integrity sha512-hbeyU6cY4NPKh69L4QpBZgGz00f7rLk10xPlCo6MxEmCqSOTuXXvDEUR51d2ED69G+GyFAeZi5VU9IdJ4jhvzQ== + dependencies: + "@cspell/cspell-types" "9.0.1" + comment-json "^4.2.5" + yaml "^2.7.1" + +cspell-dictionary@9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/cspell-dictionary/-/cspell-dictionary-9.0.1.tgz#de6c70c509a863f667cb21bb75f6f41332fe1e81" + integrity sha512-I9gjRpfV4djxN0i2p9OzWIrkjtUaGUyVE9atvRbkHUMeqDUhC2Qt0Mb9tnF8I7qnHeZt+U44vUa9Dg7yrJ+k4Q== + dependencies: + "@cspell/cspell-pipe" "9.0.1" + "@cspell/cspell-types" "9.0.1" + cspell-trie-lib "9.0.1" + fast-equals "^5.2.2" + +cspell-gitignore@9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/cspell-gitignore/-/cspell-gitignore-9.0.1.tgz#ae7f74a876d621542fcca6a2216bd74cb1738c40" + integrity sha512-xjgOmeGbHEaeF0erRQ2QXwqxWqGDiI4mu+NjCL7ZHPoAM5y8PEO6IbxVNabIB1xC4QAborbtEQ/8ydDWLJcPoQ== + dependencies: + "@cspell/url" "9.0.1" + cspell-glob "9.0.1" + cspell-io "9.0.1" + +cspell-glob@9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/cspell-glob/-/cspell-glob-9.0.1.tgz#0249ba4a0a41cac8454678df84300e36a28cc5b1" + integrity sha512-dQU/ln6J9Qe31zk1cLJnq/WNAjRrTUig1GG8WA2oK1jHZKY9VbyJLb5DUFnDUx35cI0jdOEnGSCWi8qNjHSc1Q== + dependencies: + "@cspell/url" "9.0.1" + picomatch "^4.0.2" + +cspell-grammar@9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/cspell-grammar/-/cspell-grammar-9.0.1.tgz#84509e77210106f6fa025691dd2e2a6a38791760" + integrity sha512-FZ1z1p3pslfotZT/W/VRZjB4S+z0ETrTbNmQ5pGmhdY0nm7Slmg+8nIJluLEjBneBGTJIOcLjYykwS2vI6jzxw== + dependencies: + "@cspell/cspell-pipe" "9.0.1" + "@cspell/cspell-types" "9.0.1" + +cspell-io@9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/cspell-io/-/cspell-io-9.0.1.tgz#1c4a6071f734df070039c0d057a75cd8333886a3" + integrity sha512-L5fZY0glVeQb6nmt1WL1wKzZzoHJUkBQ9BGCrwqSXIrjZrYmBNSKixCjo6o9n2keRUwpNjsvZj1TQDKDV+FsXA== + dependencies: + "@cspell/cspell-service-bus" "9.0.1" + "@cspell/url" "9.0.1" + +cspell-lib@9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/cspell-lib/-/cspell-lib-9.0.1.tgz#1cc10f485cfe976c5091999278c4c37f548b67e9" + integrity sha512-F4vJG6GmAGVAuhgcepO12UtG7yev7Rcfa31MLIyYNTrd5NeORzM+GTHnL970FlEflwYPYjcSTGwkyowQ+ZbmDg== + dependencies: + "@cspell/cspell-bundled-dicts" "9.0.1" + "@cspell/cspell-pipe" "9.0.1" + "@cspell/cspell-resolver" "9.0.1" + "@cspell/cspell-types" "9.0.1" + "@cspell/dynamic-import" "9.0.1" + "@cspell/filetypes" "9.0.1" + "@cspell/strong-weak-map" "9.0.1" + "@cspell/url" "9.0.1" + clear-module "^4.1.2" + comment-json "^4.2.5" + cspell-config-lib "9.0.1" + cspell-dictionary "9.0.1" + cspell-glob "9.0.1" + cspell-grammar "9.0.1" + cspell-io "9.0.1" + cspell-trie-lib "9.0.1" + env-paths "^3.0.0" + fast-equals "^5.2.2" + gensequence "^7.0.0" + import-fresh "^3.3.1" + resolve-from "^5.0.0" + vscode-languageserver-textdocument "^1.0.12" + vscode-uri "^3.1.0" + xdg-basedir "^5.1.0" + +cspell-trie-lib@9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/cspell-trie-lib/-/cspell-trie-lib-9.0.1.tgz#219acb8e6d249504a1fd4026df9c50871cad05a7" + integrity sha512-gIupiHwLdsQun79biJgiqmXffKUGzFjGLFEeVptI2Zy5Oa3XhRJsHap4PyeleErONkpzxMG1tgpOWzhOqwl65Q== + dependencies: + "@cspell/cspell-pipe" "9.0.1" + "@cspell/cspell-types" "9.0.1" + gensequence "^7.0.0" + +cspell@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/cspell/-/cspell-9.0.1.tgz#f279181887fb79961f588eab93af69be703f1918" + integrity sha512-AJqsX+3eSTz9GmIuyEZUzCCTbvCPw6+Nv7UYa4PCn7vNV3XEb5LHTp5i9y2i65fNaeNEcQXLrLYoY/JcBFmUSQ== + dependencies: + "@cspell/cspell-json-reporter" "9.0.1" + "@cspell/cspell-pipe" "9.0.1" + "@cspell/cspell-types" "9.0.1" + "@cspell/dynamic-import" "9.0.1" + "@cspell/url" "9.0.1" + chalk "^5.4.1" + chalk-template "^1.1.0" + commander "^13.1.0" + cspell-dictionary "9.0.1" + cspell-gitignore "9.0.1" + cspell-glob "9.0.1" + cspell-io "9.0.1" + cspell-lib "9.0.1" + fast-json-stable-stringify "^2.1.0" + file-entry-cache "^9.1.0" + semver "^7.7.1" + tinyglobby "^0.2.13" + +css-loader@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-7.1.2.tgz#64671541c6efe06b0e22e750503106bdd86880f8" + integrity sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.33" + postcss-modules-extract-imports "^3.1.0" + postcss-modules-local-by-default "^4.0.5" + postcss-modules-scope "^3.2.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.5.4" + +cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" - integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU= - dependencies: - globby "^6.1.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - p-map "^1.1.1" - pify "^3.0.0" - rimraf "^2.2.8" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= +cuint@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" + integrity sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw== -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= +d@1, d@^1.0.1, d@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.2.tgz#2aefd554b81981e7dccf72d6842ae725cb17e5de" + integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw== + dependencies: + es5-ext "^0.10.64" + type "^2.7.2" -depd@~1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= +date-fns@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-4.1.0.tgz#64b3d83fff5aa80438f5b1a633c2e83b8a1c2d14" + integrity sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg== -des.js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" - integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.3.6, debug@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" + ms "^2.1.3" -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= - dependencies: - repeating "^2.0.0" +dedent@^1.0.0: + version "1.5.3" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" + integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= +deep-is@^0.1.3, deep-is@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -detect-newline@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" - integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -diff@^3.2.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +default-browser-id@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.0.tgz#a1d98bf960c15082d8a3fa69e83150ccccc3af26" + integrity sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA== -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== +default-browser@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.2.1.tgz#7b7ba61204ff3e425b556869ae6d3e9d9f1712cf" + integrity sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg== dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" + bundle-name "^4.1.0" + default-browser-id "^5.0.0" -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== +default-require-extensions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.1.tgz#bfae00feeaeada68c2ae256c62540f60b80625bd" + integrity sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw== dependencies: - esutils "^2.0.2" + strip-bom "^4.0.0" + +define-lazy-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" + integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== doctypes@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" - integrity sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk= - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + integrity sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ== -domexception@^1.0.0: +dunder-proto@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" - integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug== + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== dependencies: - webidl-conversions "^4.0.2" + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.1.tgz#b1a7a29c4abfd639585efaecce80d666b1e34125" - integrity sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" - integrity sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU= - dependencies: - jsbn "~0.1.0" +electron-to-chromium@^1.5.73: + version "1.5.132" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.132.tgz#081b8086d7cecc58732f7cc1f1c19306c5510c5f" + integrity sha512-QgX9EBvWGmvSRa74zqfnG7+Eno0Ak0vftBll0Pt2/z5b3bEGYL6OUXLgKPtvx73dn3dvwrlyVkjPKRRlhLYTEg== -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== -electron-to-chromium@^1.2.7: - version "1.3.45" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.45.tgz#458ac1b1c5c760ce8811a16d2bfbd97ec30bafb8" - integrity sha1-RYrBscXHYM6IEaFtK/vZfsMLr7g= +emoji-regex@^10.3.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.4.0.tgz#03553afea80b3975749cfcb36f776ca268e413d4" + integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== -elegant-spinner@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" - integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= - -elliptic@^6.0.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" - integrity sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8= - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= - dependencies: - iconv-lite "~0.4.13" +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== dependencies: - once "^1.4.0" + iconv-lite "^0.6.2" -enhanced-resolve@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" - integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== +enhanced-resolve@^5.0.0, enhanced-resolve@^5.17.1: + version "5.18.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz#728ab082f8b7b6836de51f1637aab5d3b9568faf" + integrity sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg== dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - tapable "^1.0.0" + graceful-fs "^4.2.4" + tapable "^2.2.0" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +env-paths@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-3.0.0.tgz#2f1e89c2f6dbd3408e1b1711dd82d62e317f58da" + integrity sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A== + +envinfo@^7.14.0: + version "7.14.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.14.0.tgz#26dac5db54418f2a4c1159153a0b2ae980838aae" + integrity sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg== -errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== +environment@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1" + integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + +errno@^0.1.1: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== dependencies: prr "~1.0.1" -error-ex@^1.2.0: +error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -error-ex@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" - integrity sha1-+FWobOYa3E6GIcPNoh56dhLDqNw= - dependencies: - is-arrayish "^0.2.1" +es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== -es-abstract@^1.5.1: - version "1.12.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" - integrity sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA== - dependencies: - es-to-primitive "^1.1.1" - function-bind "^1.1.1" - has "^1.0.1" - is-callable "^1.1.3" - is-regex "^1.0.4" +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-module-lexer@^1.2.1, es-module-lexer@^1.5.3: + version "1.7.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a" + integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== -es-to-primitive@^1.1.1: +es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" - integrity sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0= + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" + integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" + integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== dependencies: - is-callable "^1.1.1" - is-date-object "^1.0.1" - is-symbol "^1.0.1" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + has-tostringtag "^1.0.2" + hasown "^2.0.2" -es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.45, es5-ext@^0.10.46, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2: - version "0.10.46" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572" - integrity sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw== +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.53, es5-ext@^0.10.62, es5-ext@^0.10.64, es5-ext@~0.10.14, es5-ext@~0.10.2: + version "0.10.64" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714" + integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg== dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.1" - next-tick "1" + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + esniff "^2.0.1" + next-tick "^1.1.0" + +es6-error@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -es6-iterator@^2.0.1, es6-iterator@^2.0.3, es6-iterator@~2.0.3: +es6-iterator@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== dependencies: d "1" es5-ext "^0.10.35" es6-symbol "^3.1.1" -es6-promise-polyfill@^1.1.1: +es6-promise-polyfill@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/es6-promise-polyfill/-/es6-promise-polyfill-1.2.0.tgz#f38925f23cb3e3e8ce6cda8ff774fcebbb090cde" - integrity sha1-84kl8jyz4+jObNqP93T867sJDN4= + integrity sha512-HHb0vydCpoclpd0ySPkRXMmBw80MRt1wM4RBJBlXkux97K7gleabZdsR0gvE1nNPM9mgOZIBTzjjXiPxf4lIqQ== -es6-symbol@^3.1.1, es6-symbol@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" - integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= +es6-symbol@^3.1.1, es6-symbol@^3.1.3: + version "3.1.4" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.4.tgz#f4e7d28013770b4208ecbf3e0bf14d3bcb557b8c" + integrity sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg== dependencies: - d "1" - es5-ext "~0.10.14" + d "^1.0.2" + ext "^1.7.0" -es6-weak-map@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" - integrity sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8= +es6-weak-map@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA== dependencies: d "1" - es5-ext "^0.10.14" - es6-iterator "^2.0.1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" es6-symbol "^3.1.1" -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.4, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== escodegen@1.8.x: version "1.8.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" - integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg= + integrity sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A== dependencies: esprima "^2.7.1" estraverse "^1.9.1" @@ -2297,791 +2799,650 @@ escodegen@1.8.x: optionalDependencies: source-map "~0.2.0" -escodegen@^1.9.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" - integrity sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw== - dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-config-prettier@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-3.1.0.tgz#2c26d2cdcfa3a05f0642cd7e6e4ef3316cdabfa2" - integrity sha512-QYGfmzuc4q4J6XIhlp8vRKdI/fI0tQfQPy1dME3UOLprE+v4ssH/3W9LM2Q7h5qBcy5m0ehCrBDU2YF8q6OY8w== - dependencies: - get-stdin "^6.0.0" - -eslint-plugin-es@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-1.3.1.tgz#5acb2565db4434803d1d46a9b4cbc94b345bd028" - integrity sha512-9XcVyZiQRVeFjqHw8qHNDAZcQLqaHlOGGpeYqzYh8S4JYCWTCO3yzyen8yVmA5PratfzTRWDwCOFphtDEG+w/w== - dependencies: - eslint-utils "^1.3.0" - regexpp "^2.0.0" - -eslint-plugin-jest@^21.26.2: - version "21.26.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-21.26.2.tgz#5b24413970e83e2c5b87c5c047a08a4881783605" - integrity sha512-SCTBC6q182D4qQlQAN81D351jdte/YwTMo4f+l19Gvh1VemaNZP7ak3MLLvw6xkL9dO2FxVjCLk5DCdl1KfdLw== - -eslint-plugin-node@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-8.0.0.tgz#fb9e8911f4543514f154bb6a5924b599aa645568" - integrity sha512-Y+ln8iQ52scz9+rSPnSWRaAxeWaoJZ4wIveDR0vLHkuSZGe44Vk1J4HX7WvEP5Cm+iXPE8ixo7OM7gAO3/OKpQ== - dependencies: - eslint-plugin-es "^1.3.1" - eslint-utils "^1.3.1" - ignore "^5.0.2" - minimatch "^3.0.4" - resolve "^1.8.1" - semver "^5.5.0" - -eslint-plugin-prettier@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.0.0.tgz#f6b823e065f8c36529918cdb766d7a0e975ec30c" - integrity sha512-4g11opzhqq/8+AMmo5Vc2Gn7z9alZ4JqrbZ+D4i8KlSyxeQhZHlmIrY8U9Akf514MoEhogPa87Jgkq87aZ2Ohw== +eslint-compat-utils@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz#7fc92b776d185a70c4070d03fd26fde3d59652e4" + integrity sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q== + dependencies: + semver "^7.5.4" + +eslint-config-prettier@^10.1.1: + version "10.1.2" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.2.tgz#31a4b393c40c4180202c27e829af43323bf85276" + integrity sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA== + +eslint-plugin-es-x@^7.8.0: + version "7.8.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz#a207aa08da37a7923f2a9599e6d3eb73f3f92b74" + integrity sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ== + dependencies: + "@eslint-community/eslint-utils" "^4.1.2" + "@eslint-community/regexpp" "^4.11.0" + eslint-compat-utils "^0.5.1" + +eslint-plugin-jest@^28.6.0: + version "28.11.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-28.11.0.tgz#2641ecb4411941bbddb3d7cf8a8ff1163fbb510e" + integrity sha512-QAfipLcNCWLVocVbZW8GimKn5p5iiMcgGbRzz8z/P5q7xw+cNEpYqyzFMtIF/ZgF2HLOyy+dYBut+DoYolvqig== + dependencies: + "@typescript-eslint/utils" "^6.0.0 || ^7.0.0 || ^8.0.0" + +eslint-plugin-jsdoc@^50.6.3: + version "50.6.9" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.6.9.tgz#b4afc06110958b9c525456b6c4348bf14e21c298" + integrity sha512-7/nHu3FWD4QRG8tCVqcv+BfFtctUtEDWc29oeDXB4bwmDM2/r1ndl14AG/2DUntdqH7qmpvdemJKwb3R97/QEw== + dependencies: + "@es-joy/jsdoccomment" "~0.49.0" + are-docs-informative "^0.0.2" + comment-parser "1.4.1" + debug "^4.3.6" + escape-string-regexp "^4.0.0" + espree "^10.1.0" + esquery "^1.6.0" + parse-imports "^2.1.1" + semver "^7.6.3" + spdx-expression-parse "^4.0.0" + synckit "^0.9.1" + +eslint-plugin-n@^17.16.2: + version "17.17.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-17.17.0.tgz#6644433d395c2ecae0b2fe58018807e85d8e0724" + integrity sha512-2VvPK7Mo73z1rDFb6pTvkH6kFibAmnTubFq5l83vePxu0WiY1s0LOtj2WHb6Sa40R3w4mnh8GFYbHBQyMlotKw== + dependencies: + "@eslint-community/eslint-utils" "^4.5.0" + enhanced-resolve "^5.17.1" + eslint-plugin-es-x "^7.8.0" + get-tsconfig "^4.8.1" + globals "^15.11.0" + ignore "^5.3.2" + minimatch "^9.0.5" + semver "^7.6.3" + +eslint-plugin-prettier@^5.1.3: + version "5.2.6" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.6.tgz#be39e3bb23bb3eeb7e7df0927cdb46e4d7945096" + integrity sha512-mUcf7QG2Tjk7H055Jk0lGBjbgDnfrvqjhXh9t2xLMSCjZVcw9Rb1V6sVNXO0th3jgeO7zllWPTNRil3JW94TnQ== dependencies: prettier-linter-helpers "^1.0.0" - -eslint-scope@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" - integrity sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA== + synckit "^0.11.0" + +eslint-plugin-unicorn@^59.0.0: + version "59.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-59.0.0.tgz#11783a80ce81ab397cccbb1ce046a30eda9bb4b9" + integrity sha512-7IEeqkymGa7tr6wTWS4DolfXnfcE3QjcD0g7I+qCfV5GPMvVsFsLT7zTIYvnudqwAm5nWekdGIOTTXA93Sz9Ow== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" + "@eslint-community/eslint-utils" "^4.5.1" + "@eslint/plugin-kit" "^0.2.7" + ci-info "^4.2.0" + clean-regexp "^1.0.0" + core-js-compat "^3.41.0" + esquery "^1.6.0" + find-up-simple "^1.0.1" + globals "^16.0.0" + indent-string "^5.0.0" + is-builtin-module "^5.0.0" + jsesc "^3.1.0" + pluralize "^8.0.0" + regexp-tree "^0.1.27" + regjsparser "^0.12.0" + semver "^7.7.1" + strip-indent "^4.0.0" + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== dependencies: - esrecurse "^4.1.0" + esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^1.3.0, eslint-utils@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" - integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== +eslint-scope@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.3.0.tgz#10cd3a918ffdd722f5f3f7b5b83db9b23c87340d" + integrity sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" -eslint-visitor-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" - integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== +eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^5.8.0: - version "5.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.8.0.tgz#91fbf24f6e0471e8fdf681a4d9dd1b2c9f28309b" - integrity sha512-Zok6Bru3y2JprqTNm14mgQ15YQu/SMDkWdnmHfFg770DIUlmMFd/gqqzCHekxzjHZJxXv3tmTpH0C1icaYJsRQ== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.5.3" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^2.1.0" - eslint-scope "^4.0.0" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^4.0.0" - esquery "^1.0.1" +eslint-visitor-keys@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" + integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== + +eslint@^9.21.0: + version "9.25.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.25.1.tgz#8a7cf8dd0e6acb858f86029720adb1785ee57580" + integrity sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.20.0" + "@eslint/config-helpers" "^0.2.1" + "@eslint/core" "^0.13.0" + "@eslint/eslintrc" "^3.3.1" + "@eslint/js" "9.25.1" + "@eslint/plugin-kit" "^0.2.8" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.2" + "@types/estree" "^1.0.6" + "@types/json-schema" "^7.0.15" + ajv "^6.12.4" + chalk "^4.0.0" + cross-spawn "^7.0.6" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.3.0" + eslint-visitor-keys "^4.2.0" + espree "^10.3.0" + esquery "^1.5.0" esutils "^2.0.2" - file-entry-cache "^2.0.0" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.7.0" - ignore "^4.0.6" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" imurmurhash "^0.1.4" - inquirer "^6.1.0" - is-resolvable "^1.1.0" - js-yaml "^3.12.0" + is-glob "^4.0.0" json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.5" - minimatch "^3.0.4" - mkdirp "^0.5.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - pluralize "^7.0.0" - progress "^2.0.0" - regexpp "^2.0.1" - require-uncached "^1.0.3" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" - table "^5.0.2" - text-table "^0.2.0" - -espree@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-4.0.0.tgz#253998f20a0f82db5d866385799d912a83a36634" - integrity sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg== + optionator "^0.9.3" + +esniff@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/esniff/-/esniff-2.0.1.tgz#a4d4b43a5c71c7ec51c51098c1d8a29081f9b308" + integrity sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg== + dependencies: + d "^1.0.1" + es5-ext "^0.10.62" + event-emitter "^0.3.5" + type "^2.7.2" + +espree@^10.0.1, espree@^10.1.0, espree@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" + integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== dependencies: - acorn "^5.6.0" - acorn-jsx "^4.1.1" + acorn "^8.14.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.2.0" -esprima@2.7.x, esprima@^2.6.0, esprima@^2.7.1: +esprima@2.7.x, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= - -esprima@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= + integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== -esprima@^4.0.0: +esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" - integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== +esquery@^1.5.0, esquery@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" + integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: - estraverse "^4.0.0" + estraverse "^5.1.0" -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== dependencies: - estraverse "^4.1.0" + estraverse "^5.2.0" estraverse@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" - integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= + integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== -etag@~1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.7.0.tgz#03d30b5f67dd6e632d2945d30d6652731a34d5d8" - integrity sha1-A9MLX2fdbmMtKUXTDWZScxo01dg= +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== event-emitter@^0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= + integrity sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA== dependencies: d "1" es5-ext "~0.10.14" -events@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== -exec-sh@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36" - integrity sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw== - dependencies: - merge "^1.2.0" - -execa@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" - integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== - dependencies: - cross-spawn "^6.0.0" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.9.0.tgz#adb7ce62cf985071f60580deb4a88b9e34712d01" - integrity sha512-BbUMBiX4hqiHZUA5+JujIjNb6TyAlp2D5KLheMjMluwOuzcnylDL4AxZYLLn1n2AGB49eSWwyKvvEQoRpnAtmA== - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -exit-hook@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" - integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g= +events@^3.2.0, events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= +expect@^29.0.0, expect@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" + integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== dependencies: - is-posix-bracket "^0.1.0" + "@jest/expect-utils" "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= - dependencies: - fill-range "^2.1.0" - -expect@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-23.6.0.tgz#1e0c8d3ba9a581c87bd71fb9bc8862d443425f98" - integrity sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w== - dependencies: - ansi-styles "^3.2.0" - jest-diff "^23.6.0" - jest-get-type "^22.1.0" - jest-matcher-utils "^23.6.0" - jest-message-util "^23.4.0" - jest-regex-util "^23.3.0" - -expect@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-24.0.0-alpha.1.tgz#68341d057d4ba21308d33b33dfcf9923cc3b306c" - integrity sha512-EepihGJ/U+bT0FCTyu42NhPxNeme16rmsN5i4e/5h7C08laJ1ICZsoUfyGPdbPgsgDp1HSOfS2KBl3mD7xBx0Q== - dependencies: - ansi-styles "^3.2.0" - jest-diff "^24.0.0-alpha.1" - jest-get-type "^24.0.0-alpha.1" - jest-matcher-utils "^24.0.0-alpha.1" - jest-message-util "^24.0.0-alpha.1" - jest-regex-util "^24.0.0-alpha.1" - -express@~4.13.1: - version "4.13.4" - resolved "https://registry.yarnpkg.com/express/-/express-4.13.4.tgz#3c0b76f3c77590c8345739061ec0bd3ba067ec24" - integrity sha1-PAt288d1kMg0VzkGHsC9O6Bn7CQ= - dependencies: - accepts "~1.2.12" - array-flatten "1.1.1" - content-disposition "0.5.1" - content-type "~1.0.1" - cookie "0.1.5" - cookie-signature "1.0.6" - debug "~2.2.0" - depd "~1.1.0" - escape-html "~1.0.3" - etag "~1.7.0" - finalhandler "0.4.1" - fresh "0.3.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.1" - path-to-regexp "0.1.7" - proxy-addr "~1.0.10" - qs "4.0.0" - range-parser "~1.0.3" - send "0.13.1" - serve-static "~1.10.2" - type-is "~1.6.6" - utils-merge "1.0.0" - vary "~1.0.1" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" +exponential-backoff@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.2.tgz#a8f26adb96bf78e8cd8ad1037928d5e5c0679d91" + integrity sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA== -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= +ext@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" + integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" + type "^2.7.2" -extend@~3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" - integrity sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ= +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -extend@~3.0.1, extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-equals@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-5.2.2.tgz#885d7bfb079fac0ce0e8450374bce29e9b742484" + integrity sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw== + +fast-glob@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" + integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.8" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -external-editor@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" - integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= - dependencies: - is-extglob "^1.0.0" +fast-uri@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" + integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= +fastest-levenshtein@^1.0.12: + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= +fastq@^1.6.0: + version "1.19.1" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" + integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== + dependencies: + reusify "^1.0.4" -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= +fdir@^6.4.4: + version "6.4.4" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.4.tgz#1cfcf86f875a883e19a8fab53622cfe992e8d2f9" + integrity sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg== -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= - -fast-levenshtein@~2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fastparse@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" - integrity sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg= - -fb-watchman@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" - integrity sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg= - dependencies: - bser "^2.0.0" - -fbjs@^0.8.16, fbjs@^0.8.9: - version "0.8.16" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" - integrity sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s= - dependencies: - core-js "^1.0.0" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.9" - -figgy-pudding@^3.1.0, figgy-pudding@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" - integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== - -figures@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= - dependencies: - escape-string-regexp "^1.0.5" - object-assign "^4.1.0" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= - dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" - -file-loader@^1.1.6: - version "1.1.11" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.11.tgz#6fe886449b0f2a936e43cabaac0cdbfb369506f8" - integrity sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg== +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== dependencies: - loader-utils "^1.0.2" - schema-utils "^0.4.5" - -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= + flat-cache "^4.0.0" -fileset@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" - integrity sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA= +file-entry-cache@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-9.1.0.tgz#2e66ad98ce93f49aed1b178c57b0b5741591e075" + integrity sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg== dependencies: - glob "^7.0.3" - minimatch "^3.0.3" + flat-cache "^5.0.0" -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== +file-loader@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" + loader-utils "^2.0.0" + schema-utils "^3.0.0" -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= +file-type@^18.7.0: + version "18.7.0" + resolved "https://registry.yarnpkg.com/file-type/-/file-type-18.7.0.tgz#cddb16f184d6b94106cfc4bb56978726b25cb2a2" + integrity sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw== dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" + readable-web-to-node-stream "^3.0.2" + strtok3 "^7.0.0" + token-types "^5.0.1" -finalhandler@0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.4.1.tgz#85a17c6c59a94717d262d61230d4b0ebe3d4a14d" - integrity sha1-haF8bFmpRxfSYtYSMNSw6+PUoU0= +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: - debug "~2.2.0" - escape-html "~1.0.3" - on-finished "~2.3.0" - unpipe "~1.0.0" + to-regex-range "^5.0.1" -find-cache-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" - integrity sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA== +find-cache-dir@^3.2.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: commondir "^1.0.1" - make-dir "^1.0.0" - pkg-dir "^3.0.0" + make-dir "^3.0.2" + pkg-dir "^4.1.0" -find-parent-dir@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" - integrity sha1-M8RLQpqysvBkYpnF+fcY83b/jVQ= +find-up-simple@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/find-up-simple/-/find-up-simple-1.0.1.tgz#18fb90ad49e45252c4d7fca56baade04fa3fca1e" + integrity sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ== -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" + locate-path "^5.0.0" + path-exists "^4.0.0" -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== dependencies: - locate-path "^2.0.0" + locate-path "^6.0.0" + path-exists "^4.0.0" -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== dependencies: - locate-path "^3.0.0" + locate-path "^7.1.0" + path-exists "^5.0.0" -flat-cache@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" - integrity sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE= +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== dependencies: - circular-json "^0.3.1" - del "^2.0.2" - graceful-fs "^4.1.2" - write "^0.2.1" - -flatten@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" - integrity sha1-2uRqnXj74lKSJYzB54CkHZXAN4I= + flatted "^3.2.9" + keyv "^4.5.4" -flush-write-stream@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" - integrity sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw== +flat-cache@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-5.0.0.tgz#26c4da7b0f288b408bb2b506b2cb66c240ddf062" + integrity sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ== dependencies: - inherits "^2.0.1" - readable-stream "^2.0.4" + flatted "^3.3.1" + keyv "^4.5.4" -for-in@^1.0.1, for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - dependencies: - for-in "^1.0.1" +flatted@^3.2.9, flatted@^3.3.1: + version "3.3.3" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.3.tgz#67c8fad95454a7c7abebf74bb78ee74a44023358" + integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== -form-data@~2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" - integrity sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE= +foreground-child@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" + integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" + cross-spawn "^7.0.0" + signal-exit "^3.0.2" + +foreground-child@^3.1.0, foreground-child@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" + integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== + dependencies: + cross-spawn "^7.0.6" + signal-exit "^4.0.1" + +fork-ts-checker-webpack-plugin@^9.0.2: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-9.1.0.tgz#433481c1c228c56af111172fcad7df79318c915a" + integrity sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q== + dependencies: + "@babel/code-frame" "^7.16.7" + chalk "^4.1.2" + chokidar "^4.0.1" + cosmiconfig "^8.2.0" + deepmerge "^4.2.2" + fs-extra "^10.0.0" + memfs "^3.4.1" + minimatch "^3.0.4" + node-abort-controller "^3.0.1" + schema-utils "^3.1.1" + semver "^7.3.5" + tapable "^2.2.1" -form-data@~2.3.1, form-data@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" - integrity sha1-SXBJi+YEwgwAXU9cI67NIda0kJk= +form-data@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.2.tgz#35cabbdd30c3ce73deb2c42d3c8d3ed9ca51794c" + integrity sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w== dependencies: asynckit "^0.4.0" - combined-stream "1.0.6" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" mime-types "^2.1.12" -format-util@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/format-util/-/format-util-1.0.3.tgz#032dca4a116262a12c43f4c3ec8566416c5b2d95" - integrity sha1-Ay3KShFiYqEsQ/TD7IVmQWxbLZU= - -forwarded@~0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -fresh@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" - integrity sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8= +fromentries@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" + integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= +fs-extra@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" -fs-minipass@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" - integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== +fs-minipass@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" + integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== dependencies: - minipass "^2.2.1" + minipass "^7.0.3" -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" +fs-monkey@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.6.tgz#8ead082953e88d992cf3ff844faa907b26756da2" + integrity sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg== fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^1.1.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.2.tgz#4f598f0f69b273188ef4a62ca4e9e08ace314bbf" - integrity sha512-iownA+hC4uHFp+7gwP/y5SzaiUo7m2vpa0dhpzw8YuKtiZsz7cIXsFbXpLEeBM6WuCQyw1MH4RRe6XI8GFUctQ== - dependencies: - nan "^2.9.2" - node-pre-gyp "^0.9.0" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@^1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" - integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg== - dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" +fsevents@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +gensequence@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/gensequence/-/gensequence-7.0.0.tgz#bb6aedec8ff665e3a6c42f92823121e3a6ea7718" + integrity sha512-47Frx13aZh01afHJTB3zTtKIlFI6vWY+MYCN9Qpew6i52rfKjnhCF/l1YlC8UmEMvvntZZ6z4PiCcmyuedR2aQ== -g-status@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/g-status/-/g-status-2.0.2.tgz#270fd32119e8fc9496f066fe5fe88e0a6bc78b97" - integrity sha512-kQoE9qH+T1AHKgSSD0Hkv98bobE90ILQcXAF4wvGgsr7uFqNvwmh8j+Lq3l0RVt3E3HjSbv2B9biEGcEtpHLCA== - dependencies: - arrify "^1.0.1" - matcher "^1.0.0" - simple-git "^1.85.0" - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-own-enumerable-property-symbols@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz#5c4ad87f2834c4b9b4e84549dc1e0650fb38c24b" - integrity sha512-TtY/sbOemiMKPRUDDanGCSgBYe7Mf0vbRsWnBZ+9yghpZ1MvcpSpuZFjHdEeY/LZjZy0vdLjS77L6HosisFiug== +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-stdin@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b" - integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g== +get-east-asian-width@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz#21b4071ee58ed04ee0db653371b55b4299875389" + integrity sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ== -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= +get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" + integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== + dependencies: + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + function-bind "^1.1.2" + get-proto "^1.0.1" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.1.0" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== +get-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" + integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== dependencies: - pump "^3.0.0" + dunder-proto "^1.0.1" + es-object-atoms "^1.0.0" -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= +get-stdin@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" + integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= +get-tsconfig@^4.8.1: + version "4.10.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.10.0.tgz#403a682b373a823612475a4c2928c7326fc0f6bb" + integrity sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A== dependencies: - assert-plus "^1.0.0" + resolve-pkg-maps "^1.0.0" -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" + is-glob "^4.0.1" -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: - is-glob "^2.0.0" + is-glob "^4.0.3" -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@^10.2.2: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" glob@^5.0.15: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= + integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== dependencies: inflight "^1.0.4" inherits "2" @@ -3089,906 +3450,472 @@ glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.0.5, glob@^7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== +glob@^7.0.5, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.1, glob@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== +global-directory@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" + integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^11.7.0: - version "11.7.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" - integrity sha512-K8BNSPySfeShBQXsahYB/AbbWruVOTyVpgoIDnl8odPpeSfP2J5QO2oLFFdl2j7GfDCtZj2bMKar2T49itTPCg== - -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + ini "4.1.1" -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= - dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== -graceful-fs@^4.1.11, graceful-fs@^4.1.2: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= +globals@^15.11.0: + version "15.15.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-15.15.0.tgz#7c4761299d41c32b075715a4ce1ede7897ff72a8" + integrity sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg== -"graceful-readlink@>= 1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" - integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= +globals@^16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-16.0.0.tgz#3d7684652c5c4fbd086ec82f9448214da49382d8" + integrity sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A== -"growl@~> 1.10.0": - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== +gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= +graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -handlebars@^4.0.1, handlebars@^4.0.3: - version "4.0.11" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" - integrity sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw= +handlebars@^4.0.1: + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== dependencies: - async "^1.4.0" - optimist "^0.6.1" - source-map "^0.4.4" + minimist "^1.2.5" + neo-async "^2.6.2" + source-map "^0.6.1" + wordwrap "^1.0.0" optionalDependencies: - uglify-js "^2.6" - -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - integrity sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4= - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - integrity sha1-M0gdDxu/9gDdID11gSpqX7oALio= - dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" - -har-validator@~5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" - integrity sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0= - dependencies: - ajv "^5.1.0" - har-schema "^2.0.0" - -har-validator@~5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" - integrity sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA== - dependencies: - ajv "^5.3.0" - har-schema "^2.0.0" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" + uglify-js "^3.1.4" has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" - integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.0" - -hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - integrity sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ= - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" - -hmac-drbg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" + integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - integrity sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0= - -hoek@4.x.x: - version "4.2.1" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" - integrity sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA== +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -home-or-tmp@^2.0.0: +has-own-prop@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - -hosted-git-info@^2.1.4: - version "2.7.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" - integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== + resolved "https://registry.yarnpkg.com/has-own-prop/-/has-own-prop-2.0.0.tgz#f0f95d58f65804f5d218db32563bb85b8e0417af" + integrity sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ== -html-comment-regex@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" - integrity sha1-ZouTd26q5V696POtRkswekljYl4= +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== -html-encoding-sniffer@^1.0.2: +has-tostringtag@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw== + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: - whatwg-encoding "^1.0.1" + has-symbols "^1.0.3" -http-errors@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.3.1.tgz#197e22cdebd4198585e8694ef6786197b91ed942" - integrity sha1-GX4izevUGYWF6GlO9nhhl7ke2UI= - dependencies: - inherits "~2.0.1" - statuses "1" +hash-wasm@^4.9.0: + version "4.12.0" + resolved "https://registry.yarnpkg.com/hash-wasm/-/hash-wasm-4.12.0.tgz#f9f1a9f9121e027a9acbf6db5d59452ace1ef9bb" + integrity sha512-+/2B2rYLb48I/evdOIhP+K/DD2ca2fgBjp6O+GBEnCDk2e4rpeXIK8GvIyRPjTezgmWn9gmKwkQjjx6BtqDHVQ== -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - integrity sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8= +hasha@^5.0.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" + integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" + is-stream "^2.0.0" + type-fest "^0.8.0" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= - -husky@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/husky/-/husky-1.1.3.tgz#3ccfdb4d7332896bf7cd0e618c6fb8be09d9de4b" - integrity sha512-6uc48B/A2Mqi65yeg37d/TPcTb0bZ1GTkMYOM0nXLOPuPaTRhXCeee80/noOrbavWd12x72Tusja7GJ5rzvV6g== - dependencies: - cosmiconfig "^5.0.6" - execa "^0.9.0" - find-up "^3.0.0" - get-stdin "^6.0.0" - is-ci "^1.2.1" - pkg-dir "^3.0.0" - please-upgrade-node "^3.1.1" - read-pkg "^4.0.1" - run-node "^1.0.0" - slash "^2.0.0" - -i18n-webpack-plugin@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/i18n-webpack-plugin/-/i18n-webpack-plugin-1.0.0.tgz#0ca12296ec937a4f94325cd0264d08f4e0549831" - integrity sha512-WMC2i05OuitjxYmeQU8XV4KJ+CrWnTOY5DwjygRz2dNByezfnTbVbV67qX4I53KHlscSnOsJyv6StuZxmm6J7w== + function-bind "^1.1.2" -iconv-lite@0.4.19: - version "0.4.19" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" - integrity sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ== +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" +http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== -iconv-lite@^0.4.4: - version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" - integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== +http-proxy-agent@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== dependencies: - safer-buffer ">= 2.1.2 < 3" + agent-base "^7.1.0" + debug "^4.3.4" -iconv-lite@~0.4.13: - version "0.4.21" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.21.tgz#c47f8733d02171189ebc4a400f3218d348094798" - integrity sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw== +https-proxy-agent@^7.0.1: + version "7.0.6" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== dependencies: - safer-buffer "^2.1.0" + agent-base "^7.1.2" + debug "4" -icss-replace-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" - integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= - -icss-utils@^2.1.0: +human-signals@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" - integrity sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI= - dependencies: - postcss "^6.0.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -ieee754@^1.1.4: - version "1.1.11" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.11.tgz#c16384ffe00f5b7835824e67b6f2bd44a5229455" - integrity sha512-VhDzCKN7K8ufStx/CLj5/PDTMgph+qwN5Pkd5i0sGnVwk56zJ0lkT8Qzi1xqWLS0Wp29DgDtNeS7v8/wMoZeHg== +husky@^9.0.11: + version "9.1.7" + resolved "https://registry.yarnpkg.com/husky/-/husky-9.1.7.tgz#d46a38035d101b46a70456a850ff4201344c0b2d" + integrity sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA== -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= +hyperdyperid@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/hyperdyperid/-/hyperdyperid-1.2.0.tgz#59668d323ada92228d2a869d3e474d5a33b69e6b" + integrity sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A== -ignore-walk@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== +iconv-lite@^0.6.2, iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: - minimatch "^3.0.4" + safer-buffer ">= 2.1.2 < 3.0.0" -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^5.0.2: - version "5.0.3" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.0.3.tgz#b1ec93c7d9c3207937248ba06579dda6bf4657bf" - integrity sha512-jJ7mKezpwiCj29DWDPORNJ6P90RpT2i4kfKLxioSb0VcGnoWuib5eg9dOXR45bghMYxVNUeKoJR1UGJ/sS3Oqw== +ignore@^5.2.0, ignore@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== image-size@~0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" - integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= + integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== +import-fresh@^3.2.1, import-fresh@^3.3.0, import-fresh@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf" + integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +import-meta-resolve@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#f9db8bead9fafa61adb811db77a2bf22c5399706" + integrity sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw== imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -indent-string@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" - integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= +indent-string@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" + integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= - -ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - -inquirer@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" - integrity sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg== - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.0" - figures "^2.0.0" - lodash "^4.17.10" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.1.0" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - -invariant@^2.2.2, invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - -ipaddr.js@1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.0.5.tgz#5fa78cf301b825c78abc3042d812723049ea23c7" - integrity sha1-X6eM8wG4JceKvDBC2BJyMEnqI8c= +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= +ini@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" + integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" +interpret@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" + integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-9.0.5.tgz#117a960819b08780c3bd1f14ef3c1cc1d3f3ea5a" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== dependencies: - kind-of "^6.0.0" + jsbn "1.1.0" + sprintf-js "^1.1.3" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= +is-builtin-module@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-5.0.0.tgz#19df4b9c7451149b68176b0e06d18646db6308dd" + integrity sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA== dependencies: - binary-extensions "^1.0.0" + builtin-modules "^5.0.0" -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - integrity sha1-VAVy0096wxGfj3bDDLwbHgN6/74= +is-core-module@^2.16.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== dependencies: - builtin-modules "^1.0.0" - -is-callable@^1.1.1, is-callable@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" - integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== + hasown "^2.0.2" -is-ci@^1.0.10: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" - integrity sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg== - dependencies: - ci-info "^1.0.0" +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== -is-ci@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== +is-expression@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-4.0.0.tgz#c33155962abf21d0afd2552514d67d2ec16fd2ab" + integrity sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A== dependencies: - ci-info "^1.5.0" + acorn "^7.1.1" + object-assign "^4.1.1" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== +is-fullwidth-code-point@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz#9609efced7c2f97da7b60145ef481c787c7ba704" + integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" + get-east-asian-width "^1.0.0" -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-directory@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= - -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= - dependencies: - is-primitive "^2.0.0" - -is-expression@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-3.0.0.tgz#39acaa6be7fd1f3471dc42c7416e61c24317ac9f" - integrity sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8= - dependencies: - acorn "~4.0.2" - object-assign "^4.0.1" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-generator-fn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" - integrity sha1-lp1J4bszKfa7fwkIm+JleLLd1Go= - -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= - dependencies: - is-extglob "^1.0.0" - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" - integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= - dependencies: - is-extglob "^2.1.1" - -is-number@^2.1.0: +is-generator-fn@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= - dependencies: - kind-of "^3.0.2" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== - -is-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-observable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" - integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: - symbol-observable "^1.1.0" + is-extglob "^2.1.1" -is-path-cwd@^1.0.0: +is-inside-container@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= - -is-path-in-cwd@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" - integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== + resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== dependencies: - is-path-inside "^1.0.0" + is-docker "^3.0.0" -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= - dependencies: - path-is-inside "^1.0.1" - -is-plain-obj@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= - -is-promise@^2.0.0, is-promise@^2.1, is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - -is-promise@~1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-1.0.1.tgz#31573761c057e33c2e91aab9e96da08cefbe76e5" - integrity sha1-MVc3YcBX4zwukaq56W2gjO++duU= +is-promise@^2.0.0, is-promise@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" + integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== -is-regex@^1.0.3, is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= +is-regex@^1.0.3: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== dependencies: - has "^1.0.1" - -is-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk= + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" -is-resolvable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== - -is-stream@^1.0.1, is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-svg@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" - integrity sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk= - dependencies: - html-comment-regex "^1.1.0" +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== -is-symbol@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" - integrity sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI= +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== -is-typedarray@~1.0.0: +is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= +is-what@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" + integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isemail@3.x.x: - version "3.1.2" - resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.1.2.tgz#937cf919002077999a73ea8b1951d590e84e01dd" - integrity sha512-zfRhJn9rFSGhzU5tGZqepRSAj3+g6oTOHxMGGriWNJZzyLPUK8H7VHpqKntegnW8KLyGA9zwuNaCoopl40LTpg== +is-wsl@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.0.tgz#e1c657e39c10090afcbedec61720f6b924c3cbd2" + integrity sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw== dependencies: - punycode "2.x.x" + is-inside-container "^1.0.0" isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" +isexe@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-3.1.1.tgz#4a407e2bd78ddfb14bea0c27c6f7072dde775f0d" + integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== -isobject@^3.0.0, isobject@^3.0.1: +isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -isomorphic-fetch@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= - dependencies: - node-fetch "^1.0.1" - whatwg-fetch ">=0.10.0" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== -istanbul-api@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.1.tgz#4c3b05d18c0016d1022e079b98dc82c40f488954" - integrity sha512-duj6AlLcsWNwUpfyfHt0nWIeRiZpuShnP40YTxOGQgtaN8fd6JYSxsvxUphTDy8V5MfDXo4s/xVCIIvVCO808g== - dependencies: - async "^2.1.4" - compare-versions "^3.1.0" - fileset "^2.0.2" - istanbul-lib-coverage "^1.2.0" - istanbul-lib-hook "^1.2.0" - istanbul-lib-instrument "^1.10.1" - istanbul-lib-report "^1.1.4" - istanbul-lib-source-maps "^1.2.4" - istanbul-reports "^1.3.0" - js-yaml "^3.7.0" - mkdirp "^0.5.1" - once "^1.4.0" - -istanbul-lib-coverage@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341" - integrity sha512-GvgM/uXRwm+gLlvkWHTjDAvwynZkL9ns15calTrmhGgowlwJBbWMYzWbKqE2DT6JDP1AFXKa+Zi0EkqNCUqY0A== +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== -istanbul-lib-hook@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.1.tgz#f614ec45287b2a8fc4f07f5660af787575601805" - integrity sha512-eLAMkPG9FU0v5L02lIkcj/2/Zlz9OuluaXikdr5iStk8FDbSwAixTK9TkYxbF0eNnzAJTwM2fkV2A1tpsIp4Jg== +istanbul-lib-hook@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" + integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== dependencies: - append-transform "^1.0.0" + append-transform "^2.0.0" -istanbul-lib-instrument@^1.10.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b" - integrity sha512-1dYuzkOCbuR5GRJqySuZdsmsNKPL3PTuyPevQfoCXJePT9C8y1ga75neU+Tuy9+yS3G/dgx8wgOmp2KLpgdoeQ== +istanbul-lib-instrument@^5.0.4: + version "5.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-instrument@^6.0.0, istanbul-lib-instrument@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" + integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== + dependencies: + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +istanbul-lib-processinfo@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz#366d454cd0dcb7eb6e0e419378e60072c8626169" + integrity sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg== dependencies: - babel-generator "^6.18.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - babylon "^6.18.0" - istanbul-lib-coverage "^1.2.0" - semver "^5.3.0" + archy "^1.0.0" + cross-spawn "^7.0.3" + istanbul-lib-coverage "^3.2.0" + p-map "^3.0.0" + rimraf "^3.0.0" + uuid "^8.3.2" -istanbul-lib-report@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz#e886cdf505c4ebbd8e099e4396a90d0a28e2acb5" - integrity sha512-Azqvq5tT0U09nrncK3q82e/Zjkxa4tkFZv7E6VcqP0QCPn6oNljDPfrZEC/umNXds2t7b8sRJfs6Kmpzt8m2kA== +istanbul-lib-report@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: - istanbul-lib-coverage "^1.2.0" - mkdirp "^0.5.1" - path-parse "^1.0.5" - supports-color "^3.1.2" + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" -istanbul-lib-source-maps@^1.2.4: - version "1.2.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz#ffe6be4e7ab86d3603e4290d54990b14506fc9b1" - integrity sha512-8O2T/3VhrQHn0XcJbP1/GN7kXMiRAlPi+fj3uEHrjBD8Oz7Py0prSC25C09NuAZS6bgW1NNKAvCSHZXB0irSGA== +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== dependencies: - debug "^3.1.0" - istanbul-lib-coverage "^1.2.0" - mkdirp "^0.5.1" - rimraf "^2.6.1" - source-map "^0.5.3" + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" -istanbul-reports@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.3.0.tgz#2f322e81e1d9520767597dca3c20a0cce89a3554" - integrity sha512-y2Z2IMqE1gefWUaVjrBm0mSKvUkaBy9Vqz8iwr/r40Y9hBbIteH5wqHG/9DLTfJ9xUnUT2j7A3+VVJ6EaYBllA== +istanbul-reports@^3.0.2, istanbul-reports@^3.1.3: + version "3.1.7" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== dependencies: - handlebars "^4.0.3" + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" istanbul@^0.4.5: version "0.4.5" resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" - integrity sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs= + integrity sha512-nMtdn4hvK0HjUlzr1DrKSUY8ychprt8dzHOgY2KXsIhHu5PuQQEOTM27gV9Xblyon7aUH/TSFIjRHEODF/FRPg== dependencies: abbrev "1.0.x" async "1.x" @@ -4005,2328 +3932,1452 @@ istanbul@^0.4.5: which "^1.1.1" wordwrap "^1.0.0" -jade-loader@~0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/jade-loader/-/jade-loader-0.8.0.tgz#d1b09971a9bf90a2b298b0af5b1ad0300d109c2e" - integrity sha1-0bCZcam/kKKymLCvWxrQMA0QnC4= - dependencies: - loader-utils "~0.2.5" - -jade@^1.11.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/jade/-/jade-1.11.0.tgz#9c80e538c12d3fb95c8d9bb9559fa0cc040405fd" - integrity sha1-nIDlOMEtP7lcjZu5VZ+gzAQEBf0= - dependencies: - character-parser "1.2.1" - clean-css "^3.1.9" - commander "~2.6.0" - constantinople "~3.0.1" - jstransformer "0.0.2" - mkdirp "~0.5.0" - transformers "2.1.0" - uglify-js "^2.4.19" - void-elements "~2.0.1" - with "~4.0.0" - -jest-changed-files@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.0.0-alpha.1.tgz#ad39ec0b79406bd22c9cf0c7e19f32b5552f2b2e" - integrity sha512-1KRIJo8AnDU+F9HNdvbdurn5xN61hFUlMf8CSCrPncM7zDlP5+SrcKPNtYPXbiTQy4cXxnj3ebVaZ+h6niEDzw== - dependencies: - execa "^1.0.0" - throat "^4.0.0" - -jest-cli@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.0.0-alpha.1.tgz#a90f8eba2312eabbc99b36d1dfcee296b916e79b" - integrity sha512-FsqgvxFn4+8DOT1Ackt5zk54udlUVNGNSJwBW/D5WQ9ySXLpkC3g3Boq4rX93S7H08K1qY+ZTZ7+IUjOdXxArg== - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.1" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.1.11" - import-local "^2.0.0" - is-ci "^1.0.10" - istanbul-api "^1.3.1" - istanbul-lib-coverage "^1.2.0" - istanbul-lib-instrument "^1.10.1" - istanbul-lib-source-maps "^1.2.4" - jest-changed-files "^24.0.0-alpha.1" - jest-config "^24.0.0-alpha.1" - jest-environment-jsdom "^24.0.0-alpha.1" - jest-get-type "^24.0.0-alpha.1" - jest-haste-map "^24.0.0-alpha.1" - jest-message-util "^24.0.0-alpha.1" - jest-regex-util "^24.0.0-alpha.1" - jest-resolve-dependencies "^24.0.0-alpha.1" - jest-runner "^24.0.0-alpha.1" - jest-runtime "^24.0.0-alpha.1" - jest-snapshot "^24.0.0-alpha.1" - jest-util "^24.0.0-alpha.1" - jest-validate "^24.0.0-alpha.1" - jest-watcher "^24.0.0-alpha.1" - jest-worker "^24.0.0-alpha.1" - micromatch "^2.3.11" - node-notifier "^5.2.1" - prompts "^1.1.0" - realpath-native "^1.0.0" - rimraf "^2.5.4" - slash "^2.0.0" - string-length "^2.0.0" - strip-ansi "^5.0.0" - which "^1.2.12" - yargs "^12.0.2" - -jest-config@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-23.6.0.tgz#f82546a90ade2d8c7026fbf6ac5207fc22f8eb1d" - integrity sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ== - dependencies: - babel-core "^6.0.0" - babel-jest "^23.6.0" - chalk "^2.0.1" - glob "^7.1.1" - jest-environment-jsdom "^23.4.0" - jest-environment-node "^23.4.0" - jest-get-type "^22.1.0" - jest-jasmine2 "^23.6.0" - jest-regex-util "^23.3.0" - jest-resolve "^23.6.0" - jest-util "^23.4.0" - jest-validate "^23.6.0" - micromatch "^2.3.11" - pretty-format "^23.6.0" - -jest-config@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.0.0-alpha.1.tgz#da6e00542146a6cfc1b17634951c862bdd2be2d3" - integrity sha512-p0Qo9f4Ga8ZSH/3JDPh/McgABCYrV8YhULGwnr58epa+vkhJLzVHVLWDwL8Z6QuiC0MCae3IdGytiHe1AIC8WQ== - dependencies: - babel-core "^6.0.0" - babel-jest "^24.0.0-alpha.1" - chalk "^2.0.1" - glob "^7.1.1" - jest-environment-jsdom "^24.0.0-alpha.1" - jest-environment-node "^24.0.0-alpha.1" - jest-get-type "^24.0.0-alpha.1" - jest-jasmine2 "^24.0.0-alpha.1" - jest-regex-util "^24.0.0-alpha.1" - jest-resolve "^24.0.0-alpha.1" - jest-util "^24.0.0-alpha.1" - jest-validate "^24.0.0-alpha.1" - micromatch "^2.3.11" - pretty-format "^24.0.0-alpha.1" - -jest-diff@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.6.0.tgz#1500f3f16e850bb3d71233408089be099f610c7d" - integrity sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g== - dependencies: - chalk "^2.0.1" - diff "^3.2.0" - jest-get-type "^22.1.0" - pretty-format "^23.6.0" - -jest-diff@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.0.0-alpha.1.tgz#0b06a44e8de5ec295c7630435e55e8ee861c8f40" - integrity sha512-mAgFuNenb5X0WNVoIDa4AObEpL5RXyHqHXrmDWp1H9PI11XTadp8Hhxn4hy87psh7Cy2zN1K0S7IQmMjspz2ZQ== - dependencies: - chalk "^2.0.1" - diff "^3.2.0" - jest-get-type "^24.0.0-alpha.1" - pretty-format "^24.0.0-alpha.1" - -jest-docblock@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.0.0-alpha.1.tgz#345f64288e39f63ed778ad4321dbe20dc1b0cda1" - integrity sha512-w5UD7rXu8/710oSN5ZGDzxgtmL4DohS5r4nqVAOUMKKhTMvX51zBILS9HFvDr5MNqr12Mpk19fdX1yt8oLlU/Q== - dependencies: - detect-newline "^2.1.0" - -jest-each@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-23.6.0.tgz#ba0c3a82a8054387016139c733a05242d3d71575" - integrity sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg== - dependencies: - chalk "^2.0.1" - pretty-format "^23.6.0" - -jest-each@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.0.0-alpha.1.tgz#ba175293c8193b958390b504d550acc540013e0f" - integrity sha512-U4KQT6q6eaPqWLJ9Lnc+8J1OaQvjNACQDCogQyeTSJUVFdcy0lbbGh32GTYwu9tkUr2K8F9jjsdb1swWPrRO2Q== - dependencies: - chalk "^2.0.1" - jest-util "^24.0.0-alpha.1" - pretty-format "^24.0.0-alpha.1" - -jest-environment-jsdom@^23.4.0: - version "23.4.0" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz#056a7952b3fea513ac62a140a2c368c79d9e6023" - integrity sha1-BWp5UrP+pROsYqFAosNox52eYCM= - dependencies: - jest-mock "^23.2.0" - jest-util "^23.4.0" - jsdom "^11.5.1" - -jest-environment-jsdom@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.0.0-alpha.1.tgz#2fce3065a6d307ab40698eb0c70c1c6872adf0b4" - integrity sha512-s9FFarPmskDPJ7Tc1BXrLDz4847MMTg/kO9FiXGiIyz/r7w9VD3XbXx51mqAKTjPzNP+AT86XkyJRvsdBBkuEA== - dependencies: - jest-mock "^24.0.0-alpha.1" - jest-util "^24.0.0-alpha.1" - jsdom "^11.5.1" - -jest-environment-node@^23.4.0: - version "23.4.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-23.4.0.tgz#57e80ed0841dea303167cce8cd79521debafde10" - integrity sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA= - dependencies: - jest-mock "^23.2.0" - jest-util "^23.4.0" - -jest-environment-node@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.0.0-alpha.1.tgz#1631cb92df59acb16814ae90fd124bef658a680f" - integrity sha512-jbZyXaWaZW2/gOI0rnTJjHYksIzPHTle4IkROEbL/TlHFp1obvhQSCSbvaYM9h5aOpaUekDJ/E/jjXqjvjBDOQ== - dependencies: - jest-mock "^24.0.0-alpha.1" - jest-util "^24.0.0-alpha.1" - -jest-get-type@^22.1.0: - version "22.4.3" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" - integrity sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w== - -jest-get-type@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.0.0-alpha.1.tgz#c36bcdc322ecc95b2a06afd25f1887f00c1a723f" - integrity sha512-frmfCGS5d7OwJF2TU7/d3PDM41L50lpQkLtPJqMWlSNh9sr3ng5y4MtumwUIf+tuuJUG6kltnTQa8k3GRPa7jg== - -jest-haste-map@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.0.0-alpha.1.tgz#2d9461140ea1510be17d770946fae4f9df3b49c1" - integrity sha512-Ezz46VZw+4QyiqbLqcw6LpAzeoFdE9pUoZF7yOu7yMNiB1iW74vHPyOhwJnAbqDI1duAAlCxP6avP8u68fY4+g== +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== dependencies: - fb-watchman "^2.0.0" - graceful-fs "^4.1.11" - invariant "^2.2.4" - jest-docblock "^24.0.0-alpha.1" - jest-serializer "^24.0.0-alpha.1" - jest-worker "^24.0.0-alpha.1" - micromatch "^2.3.11" - sane "^3.0.0" - -jest-jasmine2@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz#840e937f848a6c8638df24360ab869cc718592e0" - integrity sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ== - dependencies: - babel-traverse "^6.0.0" - chalk "^2.0.1" - co "^4.6.0" - expect "^23.6.0" - is-generator-fn "^1.0.0" - jest-diff "^23.6.0" - jest-each "^23.6.0" - jest-matcher-utils "^23.6.0" - jest-message-util "^23.4.0" - jest-snapshot "^23.6.0" - jest-util "^23.4.0" - pretty-format "^23.6.0" - -jest-jasmine2@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.0.0-alpha.1.tgz#5c99f0fd073321c893778c00b27be5ed50ce1933" - integrity sha512-r8LJUyPf/VDtmuZMCmXXGizH7YBh3zDso8sy2qiKuad0MhV4vXp9LqFT4GCyRK2u4yZMeZHyR3aG1SrsYFd7hA== - dependencies: - babel-traverse "^6.0.0" - chalk "^2.0.1" + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jest-changed-files@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" + integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== + dependencies: + execa "^5.0.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + +jest-circus@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" + integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/expect" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" co "^4.6.0" - expect "^24.0.0-alpha.1" - is-generator-fn "^1.0.0" - jest-diff "^24.0.0-alpha.1" - jest-each "^24.0.0-alpha.1" - jest-matcher-utils "^24.0.0-alpha.1" - jest-message-util "^24.0.0-alpha.1" - jest-snapshot "^24.0.0-alpha.1" - jest-util "^24.0.0-alpha.1" - pretty-format "^24.0.0-alpha.1" - -jest-junit@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-5.2.0.tgz#980401db7aa69999cf117c6d740a8135c22ae379" - integrity sha512-Mdg0Qpdh1Xm/FA1B/mcLlmEmlr3XzH5pZg7MvcAwZhjHijPRd1z/UwYwkwNHmCV7o4ZOWCf77nLu7ZkhHHrtJg== - dependencies: - jest-config "^23.6.0" - jest-validate "^23.0.1" - mkdirp "^0.5.1" - strip-ansi "^4.0.0" - xml "^1.0.1" + dedent "^1.0.0" + is-generator-fn "^2.0.0" + jest-each "^29.7.0" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-runtime "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + p-limit "^3.1.0" + pretty-format "^29.7.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" + integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== + dependencies: + "@jest/core" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + chalk "^4.0.0" + create-jest "^29.7.0" + exit "^0.1.2" + import-local "^3.0.2" + jest-config "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + yargs "^17.3.1" + +jest-config@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" + integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.7.0" + "@jest/types" "^29.6.3" + babel-jest "^29.7.0" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^29.7.0" + jest-environment-node "^29.7.0" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-runner "^29.7.0" + jest-util "^29.7.0" + jest-validate "^29.7.0" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.7.0" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" + integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-docblock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" + integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" + integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + jest-get-type "^29.6.3" + jest-util "^29.7.0" + pretty-format "^29.7.0" + +jest-environment-node@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" + integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.7.0" + jest-util "^29.7.0" -jest-leak-detector@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.0.0-alpha.1.tgz#52354c5a5cc7866a90b029b1bee3e19b37ac019e" - integrity sha512-PkMZNr3fHYmXV1YC8k2qOmAQOPKRZezLR22dIaCou7UsPo/ABzocu/AaKkoE7CKlqvL9nR/s4Gti+pSucLCFEA== - dependencies: - pretty-format "^24.0.0-alpha.1" +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== -jest-matcher-utils@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz#726bcea0c5294261a7417afb6da3186b4b8cac80" - integrity sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog== +jest-haste-map@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" + integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== dependencies: - chalk "^2.0.1" - jest-get-type "^22.1.0" - pretty-format "^23.6.0" + "@jest/types" "^29.6.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.6.3" + jest-util "^29.7.0" + jest-worker "^29.7.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" -jest-matcher-utils@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.0.0-alpha.1.tgz#1dac56784414cb41cb1053e2656ff70b5052b018" - integrity sha512-wXOaSPbM46+PswZzoeX5nA5duzMb60FppBxoQEBmEMk3ti7rQIzC2JUBoVijsSNpvSL6iZQBQvV4UDMk/dzK6g== +jest-junit@^16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-16.0.0.tgz#d838e8c561cf9fdd7eb54f63020777eee4136785" + integrity sha512-A94mmw6NfJab4Fg/BlvVOUXzXgF0XIH6EmTgJ5NDPp4xoKq0Kr7sErb+4Xs9nZvu58pJojz5RFGpqnZYJTrRfQ== dependencies: - chalk "^2.0.1" - jest-get-type "^24.0.0-alpha.1" - pretty-format "^24.0.0-alpha.1" + mkdirp "^1.0.4" + strip-ansi "^6.0.1" + uuid "^8.3.2" + xml "^1.0.1" -jest-message-util@^23.4.0: - version "23.4.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-23.4.0.tgz#17610c50942349508d01a3d1e0bda2c079086a9f" - integrity sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8= - dependencies: - "@babel/code-frame" "^7.0.0-beta.35" - chalk "^2.0.1" - micromatch "^2.3.11" - slash "^1.0.0" - stack-utils "^1.0.1" +jest-leak-detector@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" + integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== + dependencies: + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-matcher-utils@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" + integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== + dependencies: + chalk "^4.0.0" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + pretty-format "^29.7.0" + +jest-message-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" + integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.7.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" + integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.7.0" -jest-message-util@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.0.0-alpha.1.tgz#d16798d5efaeec671b522cee4eecca5d366d8644" - integrity sha512-NCZj4srQib5A/hOVk0nn98x57X/ptOhYDE6Ahsq103847Jr/EDWmi19SZe1H/HmG21hPEIRTDJ6Tv9krCm9UDw== - dependencies: - "@babel/code-frame" "^7.0.0" - chalk "^2.0.1" - micromatch "^2.3.11" - slash "^2.0.0" - stack-utils "^1.0.1" - -jest-mock@^23.2.0: - version "23.2.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-23.2.0.tgz#ad1c60f29e8719d47c26e1138098b6d18b261134" - integrity sha1-rRxg8p6HGdR8JuETgJi20YsmETQ= - -jest-mock@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.0.0-alpha.1.tgz#8a873ef031770d61b752f063b4f78451c087ed67" - integrity sha512-J/Gu6dafQo1dtWWc3bIm6cPT/j2FTDu7S0fFYznWqiT62JpBpkogGetO71tJETsgodXyyxqMovAz6Ex3MCV+aw== - -jest-regex-util@^23.3.0: - version "23.3.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-23.3.0.tgz#5f86729547c2785c4002ceaa8f849fe8ca471bc5" - integrity sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U= - -jest-regex-util@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.0.0-alpha.1.tgz#6e74e9898cef283c669005136c21024a0d19024e" - integrity sha512-qvCqgll7SSW1zMkbz9HzwsoUqtuXM5iTejPPCCcZXZ2DPpnTV5TqHNuCmi0swpSOCDC1I/bN55XsvjZNVB0zjg== - -jest-resolve-dependencies@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.0.0-alpha.1.tgz#01f3c48bd6a1cfd7b0af5acda0202e3ddb73583d" - integrity sha512-d2h9IXQkj9XK6KjLRtJlVMSDwnFI4p6LjtSt0OLXokRk36/phUiBhxGBPvL0DXjGYjj2p+2KNLmd0/CznZi1rg== - dependencies: - jest-regex-util "^24.0.0-alpha.1" - jest-snapshot "^24.0.0-alpha.1" - -jest-resolve@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-23.6.0.tgz#cf1d1a24ce7ee7b23d661c33ba2150f3aebfa0ae" - integrity sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA== - dependencies: - browser-resolve "^1.11.3" - chalk "^2.0.1" - realpath-native "^1.0.0" - -jest-resolve@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.0.0-alpha.1.tgz#a9be18cf08778cf8b044669e199b8cf73a2ed5c8" - integrity sha512-eXZEuU8HRRfm8bhKqOvTqPcEDtq+vYXvb7RvuJ3sCHBb+ASlsav0lOTvIIYSCvIACDXwNTbkxKHc/yxBQY9MTg== - dependencies: - browser-resolve "^1.11.3" - chalk "^2.0.1" - realpath-native "^1.0.0" - -jest-runner@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.0.0-alpha.1.tgz#1011f282acb088dee450721db4bbe12cf5d59b7d" - integrity sha512-kyRFEAKFr6U4vIDw6BLq1TLSQFHG0/rW/zR6Uq30iBc3o6gv3yG22lGFrrkb2hs9EHHIM5GyfI2srQyqxcr7kg== - dependencies: - exit "^0.1.2" - graceful-fs "^4.1.11" - jest-config "^24.0.0-alpha.1" - jest-docblock "^24.0.0-alpha.1" - jest-haste-map "^24.0.0-alpha.1" - jest-jasmine2 "^24.0.0-alpha.1" - jest-leak-detector "^24.0.0-alpha.1" - jest-message-util "^24.0.0-alpha.1" - jest-runtime "^24.0.0-alpha.1" - jest-util "^24.0.0-alpha.1" - jest-worker "^24.0.0-alpha.1" - source-map-support "^0.5.6" - throat "^4.0.0" - -jest-runtime@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.0.0-alpha.1.tgz#70ed533636f39cf9d978d0a237c62235e895ef83" - integrity sha512-JBYaoXW3xIDaag3m3G7ICCDdP1HdTF7QDGmDLr3kSUGntkXKvXCwC3/owQPWh+EIe/xplFLuzJRqmRkx5GfOIw== - dependencies: - babel-core "^6.0.0" - babel-plugin-istanbul "^4.1.6" - chalk "^2.0.1" - convert-source-map "^1.4.0" - exit "^0.1.2" - fast-json-stable-stringify "^2.0.0" +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-resolve-dependencies@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" + integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== + dependencies: + jest-regex-util "^29.6.3" + jest-snapshot "^29.7.0" + +jest-resolve@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" + integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.7.0" + jest-validate "^29.7.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" + integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== + dependencies: + "@jest/console" "^29.7.0" + "@jest/environment" "^29.7.0" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.7.0" + jest-environment-node "^29.7.0" + jest-haste-map "^29.7.0" + jest-leak-detector "^29.7.0" + jest-message-util "^29.7.0" + jest-resolve "^29.7.0" + jest-runtime "^29.7.0" + jest-util "^29.7.0" + jest-watcher "^29.7.0" + jest-worker "^29.7.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" + integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== + dependencies: + "@jest/environment" "^29.7.0" + "@jest/fake-timers" "^29.7.0" + "@jest/globals" "^29.7.0" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" glob "^7.1.3" - graceful-fs "^4.1.11" - jest-config "^24.0.0-alpha.1" - jest-haste-map "^24.0.0-alpha.1" - jest-message-util "^24.0.0-alpha.1" - jest-regex-util "^24.0.0-alpha.1" - jest-resolve "^24.0.0-alpha.1" - jest-snapshot "^24.0.0-alpha.1" - jest-util "^24.0.0-alpha.1" - jest-validate "^24.0.0-alpha.1" - micromatch "^2.3.11" - realpath-native "^1.0.0" - slash "^2.0.0" - strip-bom "3.0.0" - write-file-atomic "^2.1.0" - yargs "^12.0.2" - -jest-serializer@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.0.0-alpha.1.tgz#b686ae3ff9cd1f15ed22b82dffc1f30069f21e66" - integrity sha512-cu4AAkwnfjCZIgW1G7JtJ2fWg/C0aZhwMATsfdam4y432Bd7TQsGVDIRAS5q4trjtVrrftQX6gcgxnjYokjMkQ== - -jest-snapshot@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-23.6.0.tgz#f9c2625d1b18acda01ec2d2b826c0ce58a5aa17a" - integrity sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg== - dependencies: - babel-types "^6.0.0" - chalk "^2.0.1" - jest-diff "^23.6.0" - jest-matcher-utils "^23.6.0" - jest-message-util "^23.4.0" - jest-resolve "^23.6.0" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - pretty-format "^23.6.0" - semver "^5.5.0" - -jest-snapshot@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.0.0-alpha.1.tgz#9281a8bbef6035b0c1207087bdb8aef979138387" - integrity sha512-x6fvmRUfU0z6AhDL7nhkotxy1wZy+mdc8KEGUzv89tC3H/Gf+/AWaZAXnBJs1iglxK92R0NbWGyPogrDdjn1WQ== - dependencies: - babel-types "^6.0.0" - chalk "^2.0.1" - jest-diff "^24.0.0-alpha.1" - jest-matcher-utils "^24.0.0-alpha.1" - jest-message-util "^24.0.0-alpha.1" - jest-resolve "^24.0.0-alpha.1" - mkdirp "^0.5.1" + graceful-fs "^4.2.9" + jest-haste-map "^29.7.0" + jest-message-util "^29.7.0" + jest-mock "^29.7.0" + jest-regex-util "^29.6.3" + jest-resolve "^29.7.0" + jest-snapshot "^29.7.0" + jest-util "^29.7.0" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" + integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.7.0" + "@jest/transform" "^29.7.0" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.7.0" + graceful-fs "^4.2.9" + jest-diff "^29.7.0" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.7.0" + jest-message-util "^29.7.0" + jest-util "^29.7.0" natural-compare "^1.4.0" - pretty-format "^24.0.0-alpha.1" - semver "^5.5.0" - -jest-util@^23.4.0: - version "23.4.0" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-23.4.0.tgz#4d063cb927baf0a23831ff61bec2cbbf49793561" - integrity sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE= - dependencies: - callsites "^2.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.11" - is-ci "^1.0.10" - jest-message-util "^23.4.0" - mkdirp "^0.5.1" - slash "^1.0.0" - source-map "^0.6.0" + pretty-format "^29.7.0" + semver "^7.5.3" -jest-util@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.0.0-alpha.1.tgz#25688bdae5341fef83ccc7fc780fc757e2dbc132" - integrity sha512-zcoiYQolZ5N7T1vkh8QVjC+iFJkgTodKGfXl+rQcH0fIQiclrLUbsixamaNVlAdYwS4e0eGNMBl5FF3bAWgddg== - dependencies: - callsites "^2.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.11" - is-ci "^1.0.10" - jest-message-util "^24.0.0-alpha.1" - mkdirp "^0.5.1" - slash "^2.0.0" - source-map "^0.6.0" - -jest-validate@^23.0.1, jest-validate@^23.5.0, jest-validate@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-23.6.0.tgz#36761f99d1ed33fcd425b4e4c5595d62b6597474" - integrity sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A== - dependencies: - chalk "^2.0.1" - jest-get-type "^22.1.0" - leven "^2.1.0" - pretty-format "^23.6.0" - -jest-validate@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.0.0-alpha.1.tgz#4ce52e73f478ddbcd2670633fc9377cd05afb850" - integrity sha512-8KQoA2753UZK+v5+jawXrUvXAqtwa1Y6EVMguzQTUVZI0T24bQHFirjMSxeLxb6hWQpnu7RDwvzT9kpXj7XQ8g== +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== dependencies: - chalk "^2.0.1" - jest-get-type "^24.0.0-alpha.1" - leven "^2.1.0" - pretty-format "^24.0.0-alpha.1" - -jest-watcher@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.0.0-alpha.1.tgz#8a94dafb90cf6c9404709085614aec6565a7bca1" - integrity sha512-19EOefXYqQvKhJAA6NCop15b013od2W70T9dCKM2CTk+XKmtUtY5ZG262Zo3vCOf7wZjFwE7Zydt6tZWjW2vfw== - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.1" - string-length "^2.0.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" + integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== + dependencies: + "@jest/types" "^29.6.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.6.3" + leven "^3.1.0" + pretty-format "^29.7.0" + +jest-watcher@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" + integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== + dependencies: + "@jest/test-result" "^29.7.0" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.7.0" + string-length "^4.0.1" -jest-worker@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.0.0-alpha.1.tgz#7b82ab2e534cf66640c42715d0a8f16b1ad5cdeb" - integrity sha512-WlYhxJgLsfFIqnvbzVkzompu8cauOBhSRQElRr5PNOhhVeucQvfO3Dd17L0x23nZIkUPT6HuEDjgZfvbLt4+RA== +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== dependencies: - merge-stream "^1.0.1" + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" -jest@24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-24.0.0-alpha.1.tgz#97e3433a62a6ec08de965143ae433e0bc559a43a" - integrity sha512-klBGg4n0gG8dHIHgWmGn4DunyENPkQ0FvUAfhuC5mWPAZ7irhLNQl5S05YID2NhOHhjZXqoyLOQzioU3NGXKfw== +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== dependencies: - import-local "^2.0.0" - jest-cli "^24.0.0-alpha.1" + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" -joi@^12.x: - version "12.0.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-12.0.0.tgz#46f55e68f4d9628f01bbb695902c8b307ad8d33a" - integrity sha512-z0FNlV4NGgjQN1fdtHYXf5kmgludM65fG/JlXzU6+rwkt9U5UWuXVYnXa2FpK0u6+qBuCmrm5byPNuiiddAHvQ== +jest@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" + integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== dependencies: - hoek "4.x.x" - isemail "3.x.x" - topo "2.x.x" - -js-base64@^2.1.9: - version "2.4.3" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.3.tgz#2e545ec2b0f2957f41356510205214e98fad6582" - integrity sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw== + "@jest/core" "^29.7.0" + "@jest/types" "^29.6.3" + import-local "^3.0.2" + jest-cli "^29.7.0" -js-stringify@^1.0.1: +js-stringify@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" - integrity sha1-Fzb939lyTyijaCrcYjCufk6Weds= + integrity sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g== -js-tokens@^3.0.0, js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: +js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.x, js-yaml@^3.9.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" - integrity sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw== +js-yaml@3.x, js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== dependencies: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^3.11.0, js-yaml@^3.12.0, js-yaml@^3.7.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" - integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== dependencies: - argparse "^1.0.7" - esprima "^4.0.0" + argparse "^2.0.1" -js-yaml@~3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" - integrity sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A= - dependencies: - argparse "^1.0.7" - esprima "^2.6.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - -jsdom@^11.5.1: - version "11.11.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.11.0.tgz#df486efad41aee96c59ad7a190e2449c7eb1110e" - integrity sha512-ou1VyfjwsSuWkudGxb03FotDajxAto6USAlmMZjE2lc0jCznt7sBWkhfRBRaWwbnmDqdMSTKTLT5d9sBFkkM7A== - dependencies: - abab "^1.0.4" - acorn "^5.3.0" - acorn-globals "^4.1.0" - array-equal "^1.0.0" - cssom ">= 0.3.2 < 0.4.0" - cssstyle ">= 0.3.1 < 0.4.0" - data-urls "^1.0.0" - domexception "^1.0.0" - escodegen "^1.9.0" - html-encoding-sniffer "^1.0.2" - left-pad "^1.2.0" - nwsapi "^2.0.0" - parse5 "4.0.0" - pn "^1.1.0" - request "^2.83.0" - request-promise-native "^1.0.5" - sax "^1.2.4" - symbol-tree "^3.2.2" - tough-cookie "^2.3.3" - w3c-hr-time "^1.0.1" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.3" - whatwg-mimetype "^2.1.0" - whatwg-url "^6.4.1" - ws "^4.0.0" - xml-name-validator "^3.0.0" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-1.1.0.tgz#b01307cb29b618a1ed26ec79e911f803c4da0040" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= +jsdoc-type-pratt-parser@~4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz#ff6b4a3f339c34a6c188cbf50a16087858d22113" + integrity sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg== + +jsesc@^3.0.2, jsesc@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +jsesc@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== json-loader@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" integrity sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w== -json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== -json-schema-ref-parser@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/json-schema-ref-parser/-/json-schema-ref-parser-5.1.3.tgz#f86c5868f40898e69169e1bbc854725a4fd0e1ad" - integrity sha512-CpDFlBwz/6la78hZxyB9FECVKGYjIIl3Ms3KLqFj99W7IIb7D00/RDgc++IGB4BBALl0QRhh5m4q5WNSopvLtQ== +json-schema-ref-parser@^9.0.1: + version "9.0.9" + resolved "https://registry.yarnpkg.com/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz#66ea538e7450b12af342fa3d5b8458bc1e1e013f" + integrity sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q== dependencies: - call-me-maybe "^1.0.1" - debug "^3.1.0" - js-yaml "^3.12.0" - ono "^4.0.6" + "@apidevtools/json-schema-ref-parser" "9.0.9" -json-schema-to-typescript@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/json-schema-to-typescript/-/json-schema-to-typescript-6.0.1.tgz#31baac45a124b586d4021d12a5ea0ec07fddf294" - integrity sha512-IlR/sfKZ7Vb9+By4qQLFpegJQjTfqI7AXW5RBwjVm3D0EnvkHrSmGt2Bc95qL7XC/dWpx36ZvnMyKPazWwVe7g== - dependencies: - "@types/cli-color" "^0.3.29" - "@types/json-schema" "^7.0.0" - "@types/lodash" "^4.14.116" - "@types/minimist" "^1.2.0" - "@types/mz" "0.0.32" - "@types/node" "^10.9.4" - "@types/prettier" "^1.13.2" - cli-color "^1.3.0" - json-schema-ref-parser "^5.1.3" +json-schema-to-typescript@^9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/json-schema-to-typescript/-/json-schema-to-typescript-9.1.1.tgz#572c1eb8b7ca82d6534c023c4651f3fe925171c0" + integrity sha512-VrdxmwQROjPBRlHxXwGUa2xzhOMPiNZIVsxZrZjMYtbI7suRFMiEktqaD/gqhfSya7Djy+x8dnJT+H0/0sZO0Q== + dependencies: + "@types/json-schema" "^7.0.4" + cli-color "^2.0.0" + glob "^7.1.6" + is-glob "^4.0.1" + json-schema-ref-parser "^9.0.1" json-stringify-safe "^5.0.1" - lodash "^4.17.11" - minimist "^1.2.0" + lodash "^4.17.15" + minimist "^1.2.5" + mkdirp "^1.0.4" mz "^2.7.0" - prettier "^1.14.2" + prettier "^2.0.5" stdin "0.0.1" -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= - dependencies: - jsonify "~0.0.0" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: +json-stringify-safe@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@^0.5.0, json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= +json5@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" + minimist "^1.2.0" -jstransformer@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-0.0.2.tgz#7aae29a903d196cfa0973d885d3e47947ecd76ab" - integrity sha1-eq4pqQPRls+glz2IXT5HlH7Ndqs= +json5@^2.1.2, json5@^2.1.3, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== dependencies: - is-promise "^2.0.0" - promise "^6.0.1" + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" jstransformer@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3" - integrity sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM= + integrity sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A== dependencies: is-promise "^2.0.0" promise "^7.0.1" -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== - -kleur@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-2.0.2.tgz#b704f4944d95e255d038f0cb05fb8a602c55a300" - integrity sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ== - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= - -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: - invert-kv "^2.0.0" + json-buffer "3.0.1" -lcov-parse@^0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" - integrity sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM= +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -lcov-parse@^1.x: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-1.0.0.tgz#eb0d46b54111ebc561acb4c408ef9363bdc8f7e0" - integrity sha1-6w1GtUER68VhrLTECO+TY73I9+A= +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -left-pad@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e" - integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== +less-loader@^12.2.0: + version "12.3.0" + resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-12.3.0.tgz#d4a00361568be86a97da3df4f16954b0d4c15340" + integrity sha512-0M6+uYulvYIWs52y0LqN4+QM9TqWAohYSNTo4htE8Z7Cn3G/qQMEmktfHmyJT23k+20kU9zHH2wrfFXkxNLtVw== -less-loader@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-4.1.0.tgz#2c1352c5b09a4f84101490274fd51674de41363e" - integrity sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg== +less@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/less/-/less-4.3.0.tgz#ef0cfc260a9ca8079ed8d0e3512bda8a12c82f2a" + integrity sha512-X9RyH9fvemArzfdP8Pi3irr7lor2Ok4rOttDXBhlwDg+wKQsXOXgHWduAJE1EsF7JJx0w0bcO6BC6tCKKYnXKA== dependencies: - clone "^2.1.1" - loader-utils "^1.1.0" - pify "^3.0.0" - -less@^2.5.1: - version "2.7.3" - resolved "https://registry.yarnpkg.com/less/-/less-2.7.3.tgz#cc1260f51c900a9ec0d91fb6998139e02507b63b" - integrity sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ== + copy-anything "^2.0.1" + parse-node-version "^1.0.1" + tslib "^2.3.0" optionalDependencies: errno "^0.1.1" graceful-fs "^4.1.2" image-size "~0.5.0" - mime "^1.2.11" - mkdirp "^0.5.0" - promise "^7.1.1" - request "2.81.0" - source-map "^0.5.3" + make-dir "^2.1.0" + mime "^1.4.1" + needle "^3.1.0" + source-map "~0.6.0" -leven@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" - integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA= +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== -levn@^0.3.0, levn@~0.3.0: +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" -lint-staged@^8.0.4: - version "8.0.4" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-8.0.4.tgz#d3c909fcf7897152cdce2d6e42500cd9b5b41a0d" - integrity sha512-Rs0VxXoyFqHMrPQgKAMy+O907+m5Po71UVPhBi7BUBwU7ZZ2aoc+mZmpOX3DVPCoTcy6+hqJa9yIZfacNpJHdg== - dependencies: - chalk "^2.3.1" - commander "^2.14.1" - cosmiconfig "^5.0.2" - debug "^3.1.0" - dedent "^0.7.0" - del "^3.0.0" - execa "^1.0.0" - find-parent-dir "^0.3.0" - g-status "^2.0.2" - is-glob "^4.0.0" - is-windows "^1.0.2" - jest-validate "^23.5.0" - listr "^0.14.2" - listr-update-renderer "https://github.com/okonet/listr-update-renderer/tarball/upgrade-log-update" - lodash "^4.17.5" - log-symbols "^2.2.0" - micromatch "^3.1.8" - npm-which "^3.0.1" - p-map "^1.1.1" - path-is-inside "^1.0.2" - pify "^3.0.0" - please-upgrade-node "^3.0.2" - staged-git-files "1.1.2" - string-argv "^0.0.2" - stringify-object "^3.2.2" - -listr-silent-renderer@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" - integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= +lilconfig@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" + integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== -listr-update-renderer@^0.4.0, "listr-update-renderer@https://github.com/okonet/listr-update-renderer/tarball/upgrade-log-update": - version "0.4.0" - resolved "https://github.com/okonet/listr-update-renderer/tarball/upgrade-log-update#06073fa93166277607a7814f4e1f83960081414c" - dependencies: - chalk "^1.1.3" - cli-truncate "^0.2.1" - elegant-spinner "^1.0.1" - figures "^1.7.0" - indent-string "^3.0.0" - log-symbols "^1.0.2" - log-update "^2.3.0" - strip-ansi "^3.0.1" - -listr-verbose-renderer@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35" - integrity sha1-ggb0z21S3cWCfl/RSYng6WWTOjU= - dependencies: - chalk "^1.1.3" - cli-cursor "^1.0.2" - date-fns "^1.27.2" - figures "^1.7.0" - -listr@^0.14.2: - version "0.14.2" - resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.2.tgz#cbe44b021100a15376addfc2d79349ee430bfe14" - integrity sha512-vmaNJ1KlGuGWShHI35X/F8r9xxS0VTHh9GejVXwSN20fG5xpq3Jh4bJbnumoT6q5EDM/8/YP1z3YMtQbFmhuXw== - dependencies: - "@samverschueren/stream-to-observable" "^0.3.0" - is-observable "^1.1.0" - is-promise "^2.1.0" - is-stream "^1.1.0" - listr-silent-renderer "^1.1.1" - listr-update-renderer "^0.4.0" - listr-verbose-renderer "^0.4.0" - p-map "^1.1.1" - rxjs "^6.1.0" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lint-staged@^16.0.0: + version "16.0.0" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-16.0.0.tgz#31826709bde6a62542431da3055f038e386a20db" + integrity sha512-sUCprePs6/rbx4vKC60Hez6X10HPkpDJaGcy3D1NdwR7g1RcNkWL8q9mJMreOqmHBTs+1sNFp+wOiX9fr+hoOQ== + dependencies: + chalk "^5.4.1" + commander "^13.1.0" + debug "^4.4.0" + lilconfig "^3.1.3" + listr2 "^8.3.3" + micromatch "^4.0.8" + nano-spawn "^1.0.0" + pidtree "^0.6.0" + string-argv "^0.3.2" + yaml "^2.7.1" + +listr2@^8.3.3: + version "8.3.3" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-8.3.3.tgz#815fc8f738260ff220981bf9e866b3e11e8121bf" + integrity sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ== + dependencies: + cli-truncate "^4.0.0" + colorette "^2.0.20" + eventemitter3 "^5.0.1" + log-update "^6.1.0" + rfdc "^1.4.1" + wrap-ansi "^9.0.0" + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== -loader-runner@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" - integrity sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI= +loader-utils@^1.1.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.2.tgz#29a957f3a63973883eb684f10ffd3d151fec01a3" + integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" -loader-utils@^1.0.0, loader-utils@^1.0.2, loader-utils@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" - integrity sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0= +loader-utils@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" -loader-utils@~0.2.5: - version "0.2.17" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348" - integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g= +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - object-assign "^4.0.1" + p-locate "^4.1.0" -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" + p-locate "^5.0.0" -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" + p-locate "^6.0.0" -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= +lodash-es@^4.17.15: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= +lodash.flattendeep@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= - -lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5: - version "4.17.10" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" - integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== - -lodash@^4.17.11: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== - -log-driver@^1.2.7, log-driver@^1.x: - version "1.2.7" - resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" - integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== - -log-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" - integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= - dependencies: - chalk "^1.0.0" +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -log-symbols@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" - integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== - dependencies: - chalk "^2.0.1" +lodash@^4.17.15, lodash@^4.17.19: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-update@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" - integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= +log-update@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-6.1.0.tgz#1a04ff38166f94647ae1af562f4bd6a15b1b7cd4" + integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== dependencies: - ansi-escapes "^3.0.0" - cli-cursor "^2.0.0" - wrap-ansi "^3.0.1" - -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= + ansi-escapes "^7.0.0" + cli-cursor "^5.0.0" + slice-ansi "^7.1.0" + strip-ansi "^7.1.0" + wrap-ansi "^9.0.0" -loose-envify@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" +long@^5.2.4: + version "5.3.1" + resolved "https://registry.yarnpkg.com/long/-/long-5.3.1.tgz#9d4222d3213f38a5ec809674834e0f0ab21abe96" + integrity sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng== -loose-envify@^1.1.0, loose-envify@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" - integrity sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg= - dependencies: - js-tokens "^3.0.0" +lru-cache@^10.0.1, lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== -lru-cache@^4.0.1, lru-cache@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" - integrity sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA== +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" + yallist "^3.0.2" -lru-queue@0.1: +lru-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" - integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM= + integrity sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ== dependencies: es5-ext "~0.10.2" -macaddress@^0.2.8: - version "0.2.8" - resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" - integrity sha1-WQTcU3w57G2+/q6QIycTX6hRHxI= - -make-dir@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== - dependencies: - pify "^3.0.0" - -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= - dependencies: - tmpl "1.0.x" - -map-age-cleaner@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz#098fb15538fd3dbe461f12745b0ca8568d4e3f74" - integrity sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ== - dependencies: - p-defer "^1.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -matcher@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/matcher/-/matcher-1.1.1.tgz#51d8301e138f840982b338b116bb0c09af62c1c2" - integrity sha512-+BmqxWIubKTRKNWx/ahnCkk3mG8m7OturVlqq6HiojGJTd5hVYbgZm6WzcYPCoB+KBT4Vd6R7WSRG2OADNaCjg== - dependencies: - escape-string-regexp "^1.0.4" - -math-expression-evaluator@^1.2.14: - version "1.2.17" - resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" - integrity sha1-3oGf282E3M2PrlnGrreWFbnSZqw= - -math-random@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" - integrity sha1-izqsWIuKZuSXXjzepn97sylgH6w= - -md5.js@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" - integrity sha1-6b296UogpawYsENA/Fdk1bCdkB0= - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - -mem@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.0.0.tgz#6437690d9471678f6cc83659c00cbafcd6b0cdaf" - integrity sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^1.0.0" - p-is-promise "^1.1.0" - -memoizee@^0.4.14: - version "0.4.14" - resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.14.tgz#07a00f204699f9a95c2d9e77218271c7cd610d57" - integrity sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg== - dependencies: - d "1" - es5-ext "^0.10.45" - es6-weak-map "^2.0.2" - event-emitter "^0.3.5" - is-promise "^2.1" - lru-queue "0.1" - next-tick "1" - timers-ext "^0.1.5" - -memory-fs@^0.4.0, memory-fs@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= - -merge-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - integrity sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE= - dependencies: - readable-stream "^2.0.1" - -merge@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" - integrity sha1-dTHjnUlJwoGma4xabgJl6LBYlNo= - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - -micromatch@^2.3.11: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.1.4, micromatch@^3.1.8: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@~1.33.0: - version "1.33.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" - integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== - -mime-db@~1.35.0: - version "1.35.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" - integrity sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg== - -mime-db@~1.36.0: - version "1.36.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" - integrity sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw== - -mime-types@^2.1.12, mime-types@~2.1.17: - version "2.1.19" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" - integrity sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw== - dependencies: - mime-db "~1.35.0" - -mime-types@~2.1.18, mime-types@~2.1.6, mime-types@~2.1.7: - version "2.1.18" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" - integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== - dependencies: - mime-db "~1.33.0" - -mime-types@~2.1.19: - version "2.1.20" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" - integrity sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A== - dependencies: - mime-db "~1.36.0" - -mime@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" - integrity sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM= - -mime@^1.2.11, mime@^1.4.1, mime@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -minimalistic-assert@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@^1.1.1, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= - -minipass@^2.2.1, minipass@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" - integrity sha512-/jAn9/tEX4gnpyRATxgHEOV6xbcyxgT7iUnxo9Y3+OB0zX00TgKIv/2FZCf5brBbICcwbLqVv2ImjvWWrQMSYw== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" - integrity sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA== - dependencies: - minipass "^2.2.1" - -mississippi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - -ms@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" - integrity sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg= - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - -mz@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -nan@^2.9.2: - version "2.10.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" - integrity sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -needle@^2.2.0, needle@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" - integrity sha512-t/ZswCM9JTWjAdXS9VpvqhI2Ct2sL2MdY4fUXqGJaGBk13ge99ObqRksRTbBE56K+wxUXwwfZYOuZHifFW9q+Q== - dependencies: - debug "^2.1.2" - iconv-lite "^0.4.4" - sax "^1.2.4" - -negotiator@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.5.3.tgz#269d5c476810ec92edbe7b6c2f28316384f9a7e8" - integrity sha1-Jp1cR2gQ7JLtvntsLygxY4T5p+g= - -neo-async@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" - integrity sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA== - -next-tick@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= - -node-libs-browser@^2.0.0: +make-dir@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" - integrity sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^1.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.0" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.10.3" - vm-browserify "0.0.4" - -node-notifier@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" - integrity sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg== - dependencies: - growly "^1.3.0" - semver "^5.4.1" - shellwords "^0.1.1" - which "^1.3.0" - -node-pre-gyp@^0.10.0: - version "0.10.3" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" - integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -node-pre-gyp@^0.9.0: - version "0.9.1" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.9.1.tgz#f11c07516dd92f87199dbc7e1838eab7cd56c9e0" - integrity sha1-8RwHUW3ZL4cZnbx+GDjqt81WyeA= - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.0" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.1.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -nopt@3.x: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= - dependencies: - abbrev "1" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-package-data@^2.3.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.0.1, normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= - -normalize-url@^1.4.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" - integrity sha1-LMDWazHqIwNkWENuNiDYWVTGbDw= - dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" - -npm-bundled@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" - integrity sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow== - -npm-packlist@^1.1.6: - version "1.1.10" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" - integrity sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npm-path@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.4.tgz#c641347a5ff9d6a09e4d9bce5580c4f505278e64" - integrity sha512-IFsj0R9C7ZdR5cP+ET342q77uSRdtWOlWpih5eC+lu29tIDbNEgDbzgVJ5UFvYHWhxDZ5TFkJafFioO0pPQjCw== - dependencies: - which "^1.2.10" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -npm-which@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa" - integrity sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo= - dependencies: - commander "^2.9.0" - npm-path "^2.0.2" - which "^1.2.10" - -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -nwsapi@^2.0.0: - version "2.0.7" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.7.tgz#6fc54c254621f10cac5225b76e81c74120139b78" - integrity sha512-VZXniaaaORAXGCNsvUNefsKRQYk8zCzQZ57jalgrpHcU70OrAzKAiN/3plYtH/VPRmZeYyUzQiYfKzcMXC1g5Q== - -oauth-sign@~0.8.1, oauth-sign@~0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-keys@^1.0.12: - version "1.0.12" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" - integrity sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= - dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.1" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - -once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^1.0.0: - version "1.1.0" - resolved "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" - integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k= - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - -ono@^4.0.6: - version "4.0.8" - resolved "https://registry.yarnpkg.com/ono/-/ono-4.0.8.tgz#d1b12e048cd8a9fe5d2fbf69d3ad42bf7b0feb5e" - integrity sha512-x7IM7JLrarP9WxfjDHTBs6io1D1ixEZnhKqnjMnwz+9waPZSapkGYe7jBAqnMTL+HAMfsN6rSHW3Pi+C/9dyjg== + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== dependencies: - format-util "^1.0.3" + pify "^4.0.1" + semver "^5.6.0" -optimist@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= +make-dir@^3.0.0, make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" + semver "^6.0.0" -optimist@~0.3.5: - version "0.3.7" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.3.7.tgz#c90941ad59e4273328923074d2cf2e7cbc6ec0d9" - integrity sha1-yQlBrVnkJzMokjB00s8ufLxuwNk= +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +make-fetch-happen@^14.0.3: + version "14.0.3" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz#d74c3ecb0028f08ab604011e0bc6baed483fcdcd" + integrity sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ== + dependencies: + "@npmcli/agent" "^3.0.0" + cacache "^19.0.1" + http-cache-semantics "^4.1.1" + minipass "^7.0.2" + minipass-fetch "^4.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^1.0.0" + proc-log "^5.0.0" + promise-retry "^2.0.1" + ssri "^12.0.0" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== dependencies: - wordwrap "~0.0.2" + tmpl "1.0.5" -optionator@^0.8.1, optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" +math-intrinsics@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +memfs@^3.4.1: + version "3.6.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" + integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== + dependencies: + fs-monkey "^1.0.4" + +memfs@^4.14.0: + version "4.17.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.17.0.tgz#a3c4b5490b9b1e7df5d433adc163e08208ce7ca2" + integrity sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg== + dependencies: + "@jsonjoy.com/json-pack" "^1.0.3" + "@jsonjoy.com/util" "^1.3.0" + tree-dump "^1.0.1" + tslib "^2.0.0" + +memoizee@^0.4.15: + version "0.4.17" + resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.17.tgz#942a5f8acee281fa6fb9c620bddc57e3b7382949" + integrity sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA== + dependencies: + d "^1.0.2" + es5-ext "^0.10.64" + es6-weak-map "^2.0.3" + event-emitter "^0.3.5" + is-promise "^2.2.2" + lru-queue "^0.1.0" + next-tick "^1.1.0" + timers-ext "^0.1.7" -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= +meow@^12.1.1: + version "12.1.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-12.1.1.tgz#e558dddbab12477b69b2e9a2728c327f191bace6" + integrity sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw== -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -os-locale@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620" - integrity sha512-7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw== +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.0, micromatch@^4.0.4, micromatch@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: - execa "^0.10.0" - lcid "^2.0.0" - mem "^4.0.0" + braces "^3.0.3" + picomatch "^2.3.1" -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== +mime-types@^2.1.12, mime-types@^2.1.27: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" + mime-db "1.52.0" -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= +mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -p-is-promise@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" - integrity sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4= +mimic-function@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mimic-function/-/mimic-function-5.0.1.tgz#acbe2b3349f99b9deaca7fb70e48b83e94e67076" + integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" +min-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== -p-limit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" - integrity sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A== +mini-css-extract-plugin@^2.9.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz#966031b468917a5446f4c24a80854b2947503c5b" + integrity sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w== dependencies: - p-try "^2.0.0" + schema-utils "^4.0.0" + tapable "^2.2.1" -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" +mini-svg-data-uri@^1.2.3: + version "1.4.4" + resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz#8ab0aabcdf8c29ad5693ca595af19dd2ead09939" + integrity sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg== -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== +"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: - p-limit "^2.0.0" - -p-map@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" - integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== + brace-expansion "^1.1.7" -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= +minimatch@^9.0.4, minimatch@^9.0.5: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" -p-try@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" - integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== -pako@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" - integrity sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg== +minipass-collect@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-2.0.1.tgz#1621bc77e12258a12c60d34e2276ec5c20680863" + integrity sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw== + dependencies: + minipass "^7.0.3" -parallel-transform@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" - integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY= +minipass-fetch@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-4.0.1.tgz#f2d717d5a418ad0b1a7274f9b913515d3e78f9e5" + integrity sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ== dependencies: - cyclist "~0.2.2" - inherits "^2.0.3" - readable-stream "^2.1.5" + minipass "^7.0.3" + minipass-sized "^1.0.3" + minizlib "^3.0.1" + optionalDependencies: + encoding "^0.1.13" -parse-asn1@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" - integrity sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw== +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== dependencies: - asn1.js "^4.0.0" - browserify-aes "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" + minipass "^3.0.0" -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= +minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" + minipass "^3.0.0" -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== dependencies: - error-ex "^1.2.0" + minipass "^3.0.0" -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" + yallist "^4.0.0" -parse5@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" - integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.2, minipass@^7.0.3, minipass@^7.0.4, minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== -parseurl@~1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" - integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= +minizlib@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-3.0.2.tgz#f33d638eb279f664439aa38dc5f91607468cb574" + integrity sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA== + dependencies: + minipass "^7.1.2" + +mkdirp@0.5.x: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= +mkdirp@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -path-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= +mkdirp@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-3.0.1.tgz#e44e4c5607fb279c168241713cc6e0fea9adcb50" + integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== dependencies: - pinkie-promise "^2.0.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +nano-spawn@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + resolved "https://registry.yarnpkg.com/nano-spawn/-/nano-spawn-1.0.1.tgz#c8e4c1e133e567e3efba44041dcfb12113d861b6" + integrity sha512-BfcvzBlUTxSDWfT+oH7vd6CbUV+rThLLHCIym/QO6GGLBsyVXleZs00fto2i2jzC/wPiBYk5jyOmpXWg4YopiA== -path-is-inside@^1.0.1, path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= +nanoid@^3.3.8: + version "3.3.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" - integrity sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME= +needle@^3.1.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/needle/-/needle-3.3.1.tgz#63f75aec580c2e77e209f3f324e2cdf3d29bd049" + integrity sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q== + dependencies: + iconv-lite "^0.6.3" + sax "^1.2.4" -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= +negotiator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a" + integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -pbkdf2@^3.0.3: - version "3.0.16" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" - integrity sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" +next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - integrity sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU= +node-abort-controller@^3.0.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" + integrity sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ== + +node-gyp-build@^4.6.0: + version "4.8.4" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.4.tgz#8a70ee85464ae52327772a90d66c6077a900cfc8" + integrity sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ== + +node-gyp@^11.2.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-11.2.0.tgz#fe2ee7f0511424d6ad70f7a0c88d7346f2fc6a6e" + integrity sha512-T0S1zqskVUSxcsSTkAsLc7xCycrRYmtDHadDinzocrThjyQCn5kMlEBSj6H4qDbgsIOSLmmlRIeb0lZXj+UArA== + dependencies: + env-paths "^2.2.0" + exponential-backoff "^3.1.1" + graceful-fs "^4.2.6" + make-fetch-happen "^14.0.3" + nopt "^8.0.0" + proc-log "^5.0.0" + semver "^7.3.5" + tar "^7.4.3" + tinyglobby "^0.2.12" + which "^5.0.0" -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= +node-preload@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" + integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== + dependencies: + process-on-spawn "^1.0.0" -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= +nopt@3.x: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== dependencies: - pinkie "^2.0.0" + abbrev "1" -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= +nopt@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-8.1.0.tgz#b11d38caf0f8643ce885818518064127f602eae3" + integrity sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A== + dependencies: + abbrev "^3.0.0" -pkg-dir@^3.0.0: +normalize-path@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -platform@^1.3.3: - version "1.3.5" - resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.5.tgz#fb6958c696e07e2918d2eeda0f0bc9448d733444" - integrity sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q== +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nyc@^17.1.0: + version "17.1.0" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-17.1.0.tgz#b6349a401a62ffeb912bd38ea9a018839fdb6eb1" + integrity sha512-U42vQ4czpKa0QdI1hu950XuNhYqgoM+ZF1HT+VuUHL9hPfDPVvNQyltmMqdE9bUHMVa+8yNbc3QKTj8zQhlVxQ== + dependencies: + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + caching-transform "^4.0.0" + convert-source-map "^1.7.0" + decamelize "^1.2.0" + find-cache-dir "^3.2.0" + find-up "^4.1.0" + foreground-child "^3.3.0" + get-package-type "^0.1.0" + glob "^7.1.6" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-hook "^3.0.0" + istanbul-lib-instrument "^6.0.2" + istanbul-lib-processinfo "^2.0.2" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.2" + make-dir "^3.0.0" + node-preload "^0.2.1" + p-map "^3.0.0" + process-on-spawn "^1.0.0" + resolve-from "^5.0.0" + rimraf "^3.0.0" + signal-exit "^3.0.2" + spawn-wrap "^2.0.0" + test-exclude "^6.0.0" + yargs "^15.0.2" -please-upgrade-node@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.0.2.tgz#7b9eaeca35aa4a43d6ebdfd10616c042f9a83acc" - integrity sha512-bslfSeW+ksUbB/sYZeEdKFyTG4YWU9YKRvqfSRvZKE675khAuBUPqV5RUwJZaGuWmVQLweK45Q+lPHFVnSlSug== +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +once@1.x, once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: - semver-compare "^1.0.0" + wrappy "1" -please-upgrade-node@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz#ed320051dfcc5024fae696712c8288993595e8ac" - integrity sha512-KY1uHnQ2NlQHqIJQpnh/i54rKkuxCEBx+voJIS/Mvb+L2iYd2NMotwduhKTMjfC1uKoX3VXOxLjIYG66dfJTVQ== +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: - semver-compare "^1.0.0" + mimic-fn "^2.1.0" -pluralize@^7.0.0: +onetime@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" - integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow== - -pn@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -postcss-calc@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" - integrity sha1-d7rnypKK2FcW4v2kLyYb98HWW14= + resolved "https://registry.yarnpkg.com/onetime/-/onetime-7.0.0.tgz#9f16c92d8c9ef5120e3acd9dd9957cceecc1ab60" + integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== dependencies: - postcss "^5.0.2" - postcss-message-helpers "^2.0.0" - reduce-css-calc "^1.2.6" + mimic-function "^5.0.0" -postcss-colormin@^2.1.8: - version "2.2.2" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" - integrity sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks= +open-cli@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/open-cli/-/open-cli-8.0.0.tgz#077d11bd5f1247895028d41ab3ea74c3d63e6c02" + integrity sha512-3muD3BbfLyzl+aMVSEfn2FfOqGdPYR0O4KNnxXsLEPE2q9OSjBfJAaB6XKbrUzLgymoSMejvb5jpXJfru/Ko2A== dependencies: - colormin "^1.0.5" - postcss "^5.0.13" - postcss-value-parser "^3.2.3" + file-type "^18.7.0" + get-stdin "^9.0.0" + meow "^12.1.1" + open "^10.0.0" + tempy "^3.1.0" -postcss-convert-values@^2.3.4: - version "2.6.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" - integrity sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0= +open@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/open/-/open-10.1.0.tgz#a7795e6e5d519abe4286d9937bb24b51122598e1" + integrity sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw== dependencies: - postcss "^5.0.11" - postcss-value-parser "^3.1.2" + default-browser "^5.2.1" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" + is-wsl "^3.1.0" -postcss-discard-comments@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" - integrity sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0= +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== dependencies: - postcss "^5.0.14" + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" -postcss-discard-duplicates@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" - integrity sha1-uavye4isGIFYpesSq8riAmO5GTI= +optionator@^0.9.3: + version "0.9.4" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" + integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: - postcss "^5.0.4" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" -postcss-discard-empty@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" - integrity sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU= +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: - postcss "^5.0.14" + p-try "^2.0.0" -postcss-discard-overridden@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" - integrity sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg= +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: - postcss "^5.0.16" + yocto-queue "^0.1.0" -postcss-discard-unused@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" - integrity sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM= +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== dependencies: - postcss "^5.0.14" - uniqs "^2.0.0" + yocto-queue "^1.0.0" -postcss-filter-plugins@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c" - integrity sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew= +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== dependencies: - postcss "^5.0.4" - uniqid "^4.0.0" + p-limit "^2.2.0" -postcss-merge-idents@^2.1.5: - version "2.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" - integrity sha1-TFUwMTwI4dWzu/PSu8dH4njuonA= +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== dependencies: - has "^1.0.1" - postcss "^5.0.10" - postcss-value-parser "^3.1.1" + p-limit "^3.0.2" -postcss-merge-longhand@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" - integrity sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg= +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== dependencies: - postcss "^5.0.4" + p-limit "^4.0.0" -postcss-merge-rules@^2.0.3: - version "2.1.2" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" - integrity sha1-0d9d+qexrMO+VT8OnhDofGG19yE= +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== dependencies: - browserslist "^1.5.2" - caniuse-api "^1.5.2" - postcss "^5.0.4" - postcss-selector-parser "^2.2.2" - vendors "^1.0.0" + aggregate-error "^3.0.0" -postcss-message-helpers@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" - integrity sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4= +p-map@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-7.0.3.tgz#7ac210a2d36f81ec28b736134810f7ba4418cdb6" + integrity sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA== -postcss-minify-font-values@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" - integrity sha1-S1jttWZB66fIR0qzUmyv17vey2k= - dependencies: - object-assign "^4.0.1" - postcss "^5.0.4" - postcss-value-parser "^3.0.2" +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -postcss-minify-gradients@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" - integrity sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE= +package-hash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" + integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== dependencies: - postcss "^5.0.12" - postcss-value-parser "^3.3.0" + graceful-fs "^4.1.15" + hasha "^5.0.0" + lodash.flattendeep "^4.4.0" + release-zalgo "^1.0.0" -postcss-minify-params@^1.0.4: - version "1.2.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" - integrity sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM= - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.2" - postcss-value-parser "^3.0.2" - uniqs "^2.0.0" +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== -postcss-minify-selectors@^2.0.4: - version "2.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" - integrity sha1-ssapjAByz5G5MtGkllCBFDEXNb8= +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== dependencies: - alphanum-sort "^1.0.2" - has "^1.0.1" - postcss "^5.0.14" - postcss-selector-parser "^2.0.0" + callsites "^3.0.0" -postcss-modules-extract-imports@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85" - integrity sha1-ZhQOzs447wa/DT41XWm/WdFB6oU= +parent-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-2.0.0.tgz#fa71f88ff1a50c27e15d8ff74e0e3a9523bf8708" + integrity sha512-uo0Z9JJeWzv8BG+tRcapBKNJ0dro9cLyczGzulS6EfeyAdeC9sbojtW6XwvYxJkEne9En+J2XEl4zyglVeIwFg== dependencies: - postcss "^6.0.1" + callsites "^3.1.0" -postcss-modules-local-by-default@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" - integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk= +parse-imports@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/parse-imports/-/parse-imports-2.2.1.tgz#0a6e8b5316beb5c9905f50eb2bbb8c64a4805642" + integrity sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ== dependencies: - css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" + es-module-lexer "^1.5.3" + slashes "^3.0.12" -postcss-modules-scope@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" - integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A= +parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: - css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" -postcss-modules-values@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" - integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA= +parse-node-version@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: - icss-replace-symbols "^1.1.0" - postcss "^6.0.1" + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +peek-readable@^5.1.3: + version "5.4.2" + resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-5.4.2.tgz#aff1e1ba27a7d6911ddb103f35252ffc1787af49" + integrity sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg== -postcss-normalize-charset@^1.1.0: +picocolors@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" - integrity sha1-757nEhLX/nWceO0WL2HtYrXLk/E= - dependencies: - postcss "^5.0.5" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== -postcss-normalize-url@^3.0.7: - version "3.0.8" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" - integrity sha1-EI90s/L82viRov+j6kWSJ5/HgiI= - dependencies: - is-absolute-url "^2.0.0" - normalize-url "^1.4.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" +picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -postcss-ordered-values@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" - integrity sha1-7sbCpntsQSqNsgQud/6NpD+VwR0= - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.1" +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== -postcss-reduce-idents@^2.2.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" - integrity sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM= - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.2" +pidtree@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" + integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== -postcss-reduce-initial@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" - integrity sha1-aPgGlfBF0IJjqHmtJA343WT2ROo= - dependencies: - postcss "^5.0.4" +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -postcss-reduce-transforms@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" - integrity sha1-/3b02CEkN7McKYpC0uFEQCV3GuE= - dependencies: - has "^1.0.1" - postcss "^5.0.8" - postcss-value-parser "^3.0.1" +pirates@^4.0.4: + version "4.0.7" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22" + integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== -postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" - integrity sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A= +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" + find-up "^4.0.0" -postcss-svgo@^2.1.1: - version "2.1.6" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" - integrity sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0= - dependencies: - is-svg "^2.0.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - svgo "^0.7.0" +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== -postcss-unique-selectors@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" - integrity sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0= +postcss-modules-extract-imports@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" + integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== + +postcss-modules-local-by-default@^4.0.5: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz#d150f43837831dae25e4085596e84f6f5d6ec368" + integrity sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw== dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" + icss-utils "^5.0.0" + postcss-selector-parser "^7.0.0" + postcss-value-parser "^4.1.0" -postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" - integrity sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU= +postcss-modules-scope@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz#1bbccddcb398f1d7a511e0a2d1d047718af4078c" + integrity sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA== + dependencies: + postcss-selector-parser "^7.0.0" -postcss-zindex@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" - integrity sha1-0hCd3AVbka9n/EyzsCWUZjnSryI= +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== dependencies: - has "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" + icss-utils "^5.0.0" -postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: - version "5.2.18" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" - integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg== +postcss-selector-parser@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz#4d6af97eba65d73bc4d84bcb343e865d7dd16262" + integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA== dependencies: - chalk "^1.1.3" - js-base64 "^2.1.9" - source-map "^0.5.6" - supports-color "^3.2.3" + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^6.0.1: - version "6.0.22" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.22.tgz#e23b78314905c3b90cbd61702121e7a78848f2a3" - integrity sha512-Toc9lLoUASwGqxBSJGTVcOQiDqjK+Z2XlWBg+IgYwQMY9vA2f7iMpXVc1GpPcfTSyM5lkxNo0oDwDRO+wm7XHA== +postcss@^8.4.33: + version "8.5.3" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" + integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== dependencies: - chalk "^2.4.1" - source-map "^0.6.1" - supports-color "^5.4.0" + nanoid "^3.3.8" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== -prepend-http@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= +"prettier-2@npm:prettier@^2": + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== prettier-linter-helpers@^1.0.0: version "1.0.0" @@ -6335,194 +5386,138 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^1.14.2: - version "1.14.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.14.2.tgz#0ac1c6e1a90baa22a62925f41963c841983282f9" - integrity sha512-McHPg0n1pIke+A/4VcaS2en+pTNjy4xF+Uuq86u/5dyDO59/TtFZtQ708QIRkEZ3qwKz3GVkVa6mpxK/CpB8Rg== - -prettier@^1.14.3: - version "1.14.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.14.3.tgz#90238dd4c0684b7edce5f83b0fb7328e48bd0895" - integrity sha512-qZDVnCrnpsRJJq5nSsiHCE3BYMED2OtsI+cmzIzF1QIfqm5ALf8tEJcO27zV1gKNKRPdhjO0dNWnrzssDQ1tFg== +prettier@^2.0.5: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== -pretty-format@^23.6.0: - version "23.6.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" - integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw== - dependencies: - ansi-regex "^3.0.0" - ansi-styles "^3.2.0" +prettier@^3.5.1: + version "3.5.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.5.3.tgz#4fc2ce0d657e7a02e602549f053b239cb7dfe1b5" + integrity sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw== -pretty-format@^24.0.0-alpha.1: - version "24.0.0-alpha.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.0.0-alpha.1.tgz#38dc7af33801d644755235be1940fc1b1799e112" - integrity sha512-fpbQUw/B3MQASmXyh+hchSq7GKg8EgRoC3IE8imHxVassZ6BTDlvflNgLAeexEez4Jm1df+pEfOZeINNH/Z89g== +pretty-format@^29.0.0, pretty-format@^29.5.0, pretty-format@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" + integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== dependencies: - ansi-regex "^4.0.0" - ansi-styles "^3.2.0" + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" -private@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== +proc-log@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-5.0.0.tgz#e6c93cf37aef33f835c53485f314f50ea906a9d8" + integrity sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ== -process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== +process-on-spawn@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.1.0.tgz#9d5999ba87b3bf0a8acb05322d69f2f5aa4fb763" + integrity sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q== + dependencies: + fromentries "^1.2.0" process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -progress@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" - integrity sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8= - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== -promise@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-6.1.0.tgz#2ce729f6b94b45c26891ad0602c5c90e04c6eef6" - integrity sha1-LOcp9rlLRcJoka0GAsXJDgTG7vY= +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== dependencies: - asap "~1.0.0" + err-code "^2.0.2" + retry "^0.12.0" -promise@^7.0.1, promise@^7.1.1: +promise@^7.0.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== dependencies: asap "~2.0.3" -promise@~2.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-2.0.0.tgz#46648aa9d605af5d2e70c3024bf59436da02b80e" - integrity sha1-RmSKqdYFr10ucMMCS/WUNtoCuA4= - dependencies: - is-promise "~1" - -prompts@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-1.1.1.tgz#c687590e472c08cd84cfa4b8694b1cab5de45144" - integrity sha512-lC0+ifgWNKhTNF28Wj41TOXE+gEzrHcDqkCRHMbv39afuGT1ClekTgcVF+r2VuSgNr3Fy2hq6Pu3Mlt43u+QlQ== - dependencies: - kleur "^2.0.1" - sisteransi "^1.0.0" - -prop-types@^15.5.10: - version "15.6.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" - integrity sha512-4ec7bY1Y66LymSUOH/zARVYObB23AT2h8cf6e/O6ZALB/N0sqZFEx7rq6EYPX2MkOdKORuooI/H5k9TlR4q7kQ== +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== dependencies: - fbjs "^0.8.16" - loose-envify "^1.3.1" - object-assign "^4.1.1" + kleur "^3.0.3" + sisteransi "^1.0.5" -proxy-addr@~1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.0.10.tgz#0d40a82f801fc355567d2ecb65efe3f077f121c5" - integrity sha1-DUCoL4Afw1VWfS7LZe/j8HfxIcU= - dependencies: - forwarded "~0.1.0" - ipaddr.js "1.0.5" +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - -psl@^1.1.24: - version "1.1.28" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.28.tgz#4fb6ceb08a1e2214d4fd4de0ca22dae13740bc7b" - integrity sha512-+AqO1Ae+N/4r7Rvchrdm432afjT9hqJRyBN3DQv9At0tPz4hIFSGKbq64fN9dVoCow4oggIIax5/iONx0r9hZw== - -public-encrypt@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" - integrity sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== -pug-attrs@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-2.0.3.tgz#a3095f970e64151f7bdad957eef55fb5d7905d15" - integrity sha1-owlflw5kFR972tlX7vVftdeQXRU= +pug-attrs@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-3.0.0.tgz#b10451e0348165e31fad1cc23ebddd9dc7347c41" + integrity sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA== dependencies: - constantinople "^3.0.1" - js-stringify "^1.0.1" - pug-runtime "^2.0.4" + constantinople "^4.0.1" + js-stringify "^1.0.2" + pug-runtime "^3.0.0" -pug-code-gen@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-2.0.1.tgz#0951ec83225d74d8cfc476a7f99a259b5f7d050c" - integrity sha1-CVHsgyJddNjPxHan+Zolm199BQw= +pug-code-gen@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-3.0.3.tgz#58133178cb423fe1716aece1c1da392a75251520" + integrity sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw== dependencies: - constantinople "^3.0.1" + constantinople "^4.0.1" doctypes "^1.1.0" - js-stringify "^1.0.1" - pug-attrs "^2.0.3" - pug-error "^1.3.2" - pug-runtime "^2.0.4" - void-elements "^2.0.1" - with "^5.0.0" - -pug-error@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-1.3.2.tgz#53ae7d9d29bb03cf564493a026109f54c47f5f26" - integrity sha1-U659nSm7A89WRJOgJhCfVMR/XyY= + js-stringify "^1.0.2" + pug-attrs "^3.0.0" + pug-error "^2.1.0" + pug-runtime "^3.0.1" + void-elements "^3.1.0" + with "^7.0.0" + +pug-error@^2.0.0, pug-error@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-2.1.0.tgz#17ea37b587b6443d4b8f148374ec27b54b406e55" + integrity sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg== -pug-filters@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-3.1.0.tgz#27165555bc04c236e4aa2b0366246dfa021b626e" - integrity sha1-JxZVVbwEwjbkqisDZiRt+gIbYm4= +pug-filters@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-4.0.0.tgz#d3e49af5ba8472e9b7a66d980e707ce9d2cc9b5e" + integrity sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A== dependencies: - clean-css "^4.1.11" - constantinople "^3.0.1" + constantinople "^4.0.1" jstransformer "1.0.0" - pug-error "^1.3.2" - pug-walk "^1.1.7" - resolve "^1.1.6" - uglify-js "^2.6.1" + pug-error "^2.0.0" + pug-walk "^2.0.0" + resolve "^1.15.1" -pug-lexer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-4.0.0.tgz#210c18457ef2e1760242740c5e647bd794cec278" - integrity sha1-IQwYRX7y4XYCQnQMXmR715TOwng= +pug-lexer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-5.0.1.tgz#ae44628c5bef9b190b665683b288ca9024b8b0d5" + integrity sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w== dependencies: - character-parser "^2.1.1" - is-expression "^3.0.0" - pug-error "^1.3.2" + character-parser "^2.2.0" + is-expression "^4.0.0" + pug-error "^2.0.0" -pug-linker@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-3.0.5.tgz#9e9a7ae4005682d027deeb96b000f88eeb83a02f" - integrity sha1-npp65ABWgtAn3uuWsAD4juuDoC8= +pug-linker@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-4.0.0.tgz#12cbc0594fc5a3e06b9fc59e6f93c146962a7708" + integrity sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw== dependencies: - pug-error "^1.3.2" - pug-walk "^1.1.7" + pug-error "^2.0.0" + pug-walk "^2.0.0" -pug-load@^2.0.11: - version "2.0.11" - resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-2.0.11.tgz#e648e57ed113fe2c1f45d57858ea2bad6bc01527" - integrity sha1-5kjlftET/iwfRdV4WOorrWvAFSc= +pug-load@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-3.0.0.tgz#9fd9cda52202b08adb11d25681fb9f34bd41b662" + integrity sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ== dependencies: - object-assign "^4.1.0" - pug-walk "^1.1.7" + object-assign "^4.1.1" + pug-walk "^2.0.0" pug-loader@^2.4.0: version "2.4.0" @@ -6533,1995 +5528,1315 @@ pug-loader@^2.4.0: pug-walk "^1.0.0" resolve "^1.1.7" -pug-parser@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-5.0.0.tgz#e394ad9b3fca93123940aff885c06e44ab7e68e4" - integrity sha1-45Stmz/KkxI5QK/4hcBuRKt+aOQ= - dependencies: - pug-error "^1.3.2" - token-stream "0.0.1" - -pug-runtime@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.4.tgz#e178e1bda68ab2e8c0acfc9bced2c54fd88ceb58" - integrity sha1-4XjhvaaKsujArPybztLFT9iM61g= - -pug-strip-comments@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.3.tgz#f1559592206edc6f85310dacf4afb48a025af59f" - integrity sha1-8VWVkiBu3G+FMQ2s9K+0igJa9Z8= - dependencies: - pug-error "^1.3.2" - -pug-walk@^1.0.0, pug-walk@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.7.tgz#c00d5c5128bac5806bec15d2b7e7cdabe42531f3" - integrity sha1-wA1cUSi6xYBr7BXSt+fNq+QlMfM= - -pug@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/pug/-/pug-2.0.3.tgz#71cba82537c95a5eab7ed04696e4221f53aa878e" - integrity sha1-ccuoJTfJWl6rftBGluQiH1Oqh44= - dependencies: - pug-code-gen "^2.0.1" - pug-filters "^3.1.0" - pug-lexer "^4.0.0" - pug-linker "^3.0.5" - pug-load "^2.0.11" - pug-parser "^5.0.0" - pug-runtime "^2.0.4" - pug-strip-comments "^1.0.3" - -pump@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== +pug-parser@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-6.0.0.tgz#a8fdc035863a95b2c1dc5ebf4ecf80b4e76a1260" + integrity sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw== dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" + pug-error "^2.0.0" + token-stream "1.0.0" -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" +pug-runtime@^3.0.0, pug-runtime@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-3.0.1.tgz#f636976204723f35a8c5f6fad6acda2a191b83d7" + integrity sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg== -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== +pug-strip-comments@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz#f94b07fd6b495523330f490a7f554b4ff876303e" + integrity sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ== dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" + pug-error "^2.0.0" -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= +pug-walk@^1.0.0: + version "1.1.8" + resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.8.tgz#b408f67f27912f8c21da2f45b7230c4bd2a5ea7a" + integrity sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA== -punycode@2.x.x: - version "2.1.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" - integrity sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0= +pug-walk@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-2.0.0.tgz#417aabc29232bb4499b5b5069a2b2d2a24d5f5fe" + integrity sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ== -punycode@^1.2.4, punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= +pug@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/pug/-/pug-3.0.3.tgz#e18324a314cd022883b1e0372b8af3a1a99f7597" + integrity sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g== + dependencies: + pug-code-gen "^3.0.3" + pug-filters "^4.0.0" + pug-lexer "^5.0.1" + pug-linker "^4.0.0" + pug-load "^3.0.0" + pug-parser "^6.0.0" + pug-runtime "^3.0.1" + pug-strip-comments "^2.0.0" punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - -qs@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-4.0.0.tgz#c31d9b74ec27df75e543a86c78728ed8d4623607" - integrity sha1-wx2bdOwn33XlQ6hseHKO2NRiNgc= - -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - integrity sha1-E+JtKK1rD/qpExLNO/cI7TUecjM= + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== -qs@~6.5.1, qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== - -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" - integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s= - dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= +pure-rand@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" + integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== -randomatic@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923" - integrity sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA== - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" - integrity sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A== +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== +raw-loader@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6" + integrity sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA== dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -range-parser@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= - -range-parser@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.0.3.tgz#6872823535c692e2c2a0103826afd82c2e0ff175" - integrity sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU= + loader-utils "^2.0.0" + schema-utils "^3.0.0" -raw-loader@~0.5.0, raw-loader@~0.5.1: +raw-loader@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" - integrity sha1-DD0L6u2KAclm2Xh793goElKpeao= - -rc@^1.1.7, rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-dom@^15.2.1: - version "15.6.2" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.6.2.tgz#41cfadf693b757faf2708443a1d1fd5a02bef730" - integrity sha1-Qc+t9pO3V/rycIRDodH9WgK+9zA= - dependencies: - fbjs "^0.8.9" - loose-envify "^1.1.0" - object-assign "^4.1.0" - prop-types "^15.5.10" - -react@^15.2.1: - version "15.6.2" - resolved "https://registry.yarnpkg.com/react/-/react-15.6.2.tgz#dba0434ab439cfe82f108f0f511663908179aa72" - integrity sha1-26BDSrQ5z+gvEI8PURZjkIF5qnI= - dependencies: - create-react-class "^15.6.0" - fbjs "^0.8.9" - loose-envify "^1.1.0" - object-assign "^4.1.0" - prop-types "^15.5.10" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" + integrity sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q== -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= +react-dom@^19.0.0: + version "19.1.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.1.0.tgz#133558deca37fa1d682708df8904b25186793623" + integrity sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g== dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" + scheduler "^0.26.0" -read-pkg@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" - integrity sha1-ljYlN48+HE1IyFhytabsfV0JMjc= - dependencies: - normalize-package-data "^2.3.2" - parse-json "^4.0.0" - pify "^3.0.0" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" - integrity sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg= - dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" - readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" +react-is@^18.0.0: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== -realpath-native@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.1.tgz#07f40a0cce8f8261e2e8b7ebebf5c95965d7b633" - integrity sha512-W14EcXuqUvKP8dkWkD7B95iMy77lpMnlFXbbk409bQtNCbeu0kvRE5reo+yIZ3JXxg6frbGsz2DLQ39lrCB40g== - dependencies: - util.promisify "^1.0.0" +react@^19.0.0: + version "19.1.0" + resolved "https://registry.yarnpkg.com/react/-/react-19.1.0.tgz#926864b6c48da7627f004795d6cce50e90793b75" + integrity sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg== -reduce-css-calc@^1.2.6: - version "1.3.0" - resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" - integrity sha1-dHyRTgSWFKTJz7umKYca0dKSdxY= +readable-stream@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.7.0.tgz#cedbd8a1146c13dfff8dab14068028d58c15ac91" + integrity sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg== dependencies: - balanced-match "^0.4.2" - math-expression-evaluator "^1.2.14" - reduce-function-call "^1.0.1" + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + string_decoder "^1.3.0" -reduce-function-call@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" - integrity sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk= +readable-web-to-node-stream@^3.0.2: + version "3.0.4" + resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.4.tgz#392ba37707af5bf62d725c36c1b5d6ef4119eefc" + integrity sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw== dependencies: - balanced-match "^0.4.2" - -regenerate@^1.2.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" - integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + readable-stream "^4.7.0" -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== - dependencies: - is-equal-shallow "^0.1.3" +readdirp@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexpp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.0.tgz#b2a7534a85ca1b033bcf5ce9ff8e56d4e0755365" - integrity sha512-g2FAVtR8Uh8GO1Nv5wpxW7VFVwHcCEr4wyA8/MHiRkO8uHoR5ntAA8Uq3P1vvMTX/BeQiRVSpDGLd+Wn5HNOTA== + resolve "^1.20.0" -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== +regexp-tree@^0.1.27: + version "0.1.27" + resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" + integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== -regexpu-core@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" - integrity sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs= +regjsparser@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.12.0.tgz#0e846df6c6530586429377de56e0475583b088dc" + integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= + jsesc "~3.0.2" -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= +release-zalgo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" + integrity sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA== dependencies: - jsesc "~0.5.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - integrity sha1-7wiaF40Ug7quTZPrmLT55OEdmQo= + es6-error "^4.0.1" -repeat-string@^1.5.2, repeat-string@^1.6.1: +repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" - -request-promise-core@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" - integrity sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY= - dependencies: - lodash "^4.13.1" - -request-promise-native@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" - integrity sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU= - dependencies: - request-promise-core "1.1.1" - stealthy-require "^1.1.0" - tough-cookie ">=2.3.3" - -request-promise@^4.x: - version "4.2.2" - resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.2.2.tgz#d1ea46d654a6ee4f8ee6a4fea1018c22911904b4" - integrity sha1-0epG1lSm7k+O5qT+oQGMIpEZBLQ= - dependencies: - bluebird "^3.5.0" - request-promise-core "1.1.1" - stealthy-require "^1.1.0" - tough-cookie ">=2.3.3" - -request@2.81.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - integrity sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA= - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "^0.6.0" - uuid "^3.0.0" - -request@^2.83.0: - version "2.87.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" - integrity sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.6.0" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" - forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" - performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - tough-cookie "~2.3.3" - tunnel-agent "^0.6.0" - uuid "^3.1.0" - -request@^2.85.0: - version "2.88.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.0" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.4.3" - tunnel-agent "^0.6.0" - uuid "^3.3.2" + integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= - -require-uncached@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== -resolve-cwd@^2.0.0: +require-main-filename@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= - dependencies: - resolve-from "^3.0.0" - -resolve-from@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -resolve-from@^3.0.0: +resolve-cwd@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@1.1.7, resolve@1.1.x: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= - -resolve@^1.1.6, resolve@^1.1.7: - version "1.7.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" - integrity sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw== + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== dependencies: - path-parse "^1.0.5" + resolve-from "^5.0.0" -resolve@^1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" - integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== - dependencies: - path-parse "^1.0.5" +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -restore-cursor@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" - integrity sha1-NGYfRohjJ/7SmRR5FSJS35LapUE= - dependencies: - exit-hook "^1.0.0" - onetime "^1.0.0" +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +resolve.exports@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" + integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= - dependencies: - align-text "^0.1.1" +resolve@1.1.x: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== -rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== +resolve@^1.1.7, resolve@^1.15.1, resolve@^1.20.0: + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== dependencies: - glob "^7.0.5" + is-core-module "^2.16.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== +restore-cursor@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-5.1.0.tgz#0766d95699efacb14150993f55baf0953ea1ebe7" + integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -rsvp@^3.3.3: - version "3.6.2" - resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" - integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== + onetime "^7.0.0" + signal-exit "^4.1.0" -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= - dependencies: - is-promise "^2.1.0" +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== -run-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/run-node/-/run-node-1.0.0.tgz#46b50b946a2aa2d4947ae1d886e9856fd9cabe5e" - integrity sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A== +reusify@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" + integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= - dependencies: - aproba "^1.1.1" +rfdc@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.4.1.tgz#778f76c4fb731d93414e8f925fbecf64cce7f6ca" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== -rxjs@^6.1.0: - version "6.2.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.2.tgz#eb75fa3c186ff5289907d06483a77884586e1cf9" - integrity sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ== +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== dependencies: - tslib "^1.9.0" + glob "^7.1.3" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +run-applescript@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.0.0.tgz#e5a553c2bffd620e169d276c1cd8f1b64778fbeb" + integrity sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A== -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: - ret "~0.1.10" + queue-microtask "^1.2.2" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0: +safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sane@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-3.1.0.tgz#995193b7dc1445ef1fe41ddfca2faf9f111854c6" - integrity sha512-G5GClRRxT1cELXfdAq7UKtUsv8q/ZC5k8lQGmjEm4HcAl3HzBy68iglyNCmw4+0tiXPCBZntslHlRhbnsSws+Q== - dependencies: - anymatch "^2.0.0" - capture-exit "^1.2.0" - exec-sh "^0.2.0" - execa "^1.0.0" - fb-watchman "^2.0.0" - micromatch "^3.1.4" - minimist "^1.1.1" - walker "~1.0.5" - watch "~0.18.0" - optionalDependencies: - fsevents "^1.2.3" - -sax@^1.2.4, sax@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +sax@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" + integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== -schema-utils@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" - integrity sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8= - dependencies: - ajv "^5.0.0" +scheduler@^0.26.0: + version "0.26.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.26.0.tgz#4ce8a8c2a2095f13ea11bf9a445be50c555d6337" + integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== -schema-utils@^0.4.0, schema-utils@^0.4.4, schema-utils@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" - integrity sha512-yYrjb9TX2k/J1Y5UNy3KYdZq10xhYcF8nMpAW6o3hy6Q8WSIEf9lJHG/ePnOBfziPM3fvQwfOwa13U/Fh8qTfA== +schema-utils@^3.0.0, schema-utils@^3.1.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== dependencies: - ajv "^6.1.0" - ajv-keywords "^3.1.0" + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== +schema-utils@^4.0.0, schema-utils@^4.3.0, schema-utils@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.2.tgz#0c10878bf4a73fd2b1dfd14b9462b26788c806ae" + integrity sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ== dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" -script-loader@~0.7.0: +script-loader@^0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/script-loader/-/script-loader-0.7.2.tgz#2016db6f86f25f5cf56da38915d83378bb166ba7" integrity sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA== dependencies: raw-loader "~0.5.1" -semver-compare@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" - integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= - -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" - integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== - -semver@^5.5.0: - version "5.5.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" - integrity sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw== +semver@^5.6.0: + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^5.5.1: - version "5.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" - integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -send@0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.13.1.tgz#a30d5f4c82c8a9bae9ad00a1d9b1bdbe6f199ed7" - integrity sha1-ow1fTILIqbrprQCh2bG9vm8Zntc= - dependencies: - debug "~2.2.0" - depd "~1.1.0" - destroy "~1.0.4" - escape-html "~1.0.3" - etag "~1.7.0" - fresh "0.3.0" - http-errors "~1.3.1" - mime "1.3.4" - ms "0.7.1" - on-finished "~2.3.0" - range-parser "~1.0.3" - statuses "~1.2.1" - -send@0.13.2: - version "0.13.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.13.2.tgz#765e7607c8055452bba6f0b052595350986036de" - integrity sha1-dl52B8gFVFK7pvCwUllTUJhgNt4= - dependencies: - debug "~2.2.0" - depd "~1.1.0" - destroy "~1.0.4" - escape-html "~1.0.3" - etag "~1.7.0" - fresh "0.3.0" - http-errors "~1.3.1" - mime "1.3.4" - ms "0.7.1" - on-finished "~2.3.0" - range-parser "~1.0.3" - statuses "~1.2.1" - -serialize-javascript@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" - integrity sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ== +semver@^7.3.4, semver@^7.3.5, semver@^7.5.0, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3, semver@^7.7.1: + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== -serve-static@~1.10.2: - version "1.10.3" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.10.3.tgz#ce5a6ecd3101fed5ec09827dac22a9c29bfb0535" - integrity sha1-zlpuzTEB/tXsCYJ9rCKpwpv7BTU= +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: - escape-html "~1.0.3" - parseurl "~1.3.1" - send "0.13.2" + randombytes "^2.1.0" -set-blocking@^2.0.0, set-blocking@~2.0.0: +set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" + kind-of "^6.0.2" -set-value@^2.0.0: +shebang-command@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.4, setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== dependencies: - shebang-regex "^1.0.0" + shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -simple-git@^1.65.0: - version "1.92.0" - resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-1.92.0.tgz#6061468eb7d19f0141078fc742e62457e910f547" - integrity sha1-YGFGjrfRnwFBB4/HQuYkV+kQ9Uc= - dependencies: - debug "^3.1.0" +signal-exit@^4.0.1, signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== -simple-git@^1.85.0: - version "1.106.0" - resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-1.106.0.tgz#81024c7c22fafd0c386a2b338031cc60b3568b9c" - integrity sha512-LaxKq4X9Om7bb16Cpinc36hT1YLHMM9KDQMSWJVv4Y1TGDEUuZbs+0lAk2JSKkCEO3xFjcMSx5OjvZo+i4eJvQ== +simple-git@^3.27.0: + version "3.27.0" + resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.27.0.tgz#f4b09e807bda56a4a3968f635c0e4888d3decbd5" + integrity sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA== dependencies: - debug "^4.0.1" - -sisteransi@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.0.tgz#77d9622ff909080f1c19e5f4a1df0c1b0a27b88c" - integrity sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ== + "@kwsites/file-exists" "^1.1.1" + "@kwsites/promise-deferred" "^1.1.1" + debug "^4.3.5" -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" - integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= +slashes@^3.0.12: + version "3.0.12" + resolved "https://registry.yarnpkg.com/slashes/-/slashes-3.0.12.tgz#3d664c877ad542dc1509eaf2c50f38d483a6435a" + integrity sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA== -slice-ansi@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" - integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== dependencies: - is-fullwidth-code-point "^2.0.0" + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== +slice-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-7.1.0.tgz#cd6b4655e298a8d1bdeb04250a433094b347b9a9" + integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" + ansi-styles "^6.2.1" + is-fullwidth-code-point "^5.0.0" -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - integrity sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg= - dependencies: - hoek "2.x.x" +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - integrity sha1-RBttTTRnmPG05J6JIK37oOVD+a0= +socks-proxy-agent@^8.0.3: + version "8.0.5" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee" + integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== dependencies: - is-plain-obj "^1.0.0" + agent-base "^7.1.2" + debug "^4.3.4" + socks "^2.8.3" -source-list-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" - integrity sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A== - -source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== +socks@^2.8.3: + version "2.8.4" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.4.tgz#07109755cdd4da03269bda4725baa061ab56d5cc" + integrity sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ== dependencies: - atob "^2.1.1" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" + ip-address "^9.0.5" + smart-buffer "^4.2.0" -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== - dependencies: - source-map "^0.5.6" +source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== -source-map-support@^0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" - integrity sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g== +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@~0.5.6: - version "0.5.9" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" - integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@0.4.x, source-map@^0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - integrity sha1-66T12pwNyZneaAMti092FzZSA2s= - dependencies: - amdefine ">=0.0.4" - -source-map@0.5.x, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@~0.1.7: - version "0.1.43" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" - integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y= - dependencies: - amdefine ">=0.0.4" +source-map@^0.7.4: + version "0.7.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== source-map@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" - integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50= + integrity sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA== dependencies: amdefine ">=0.0.4" -spdx-correct@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" - integrity sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g== +spawn-wrap@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" + integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" + foreground-child "^2.0.0" + is-windows "^1.0.2" + make-dir "^3.0.0" + rimraf "^3.0.0" + signal-exit "^3.0.2" + which "^2.0.1" spdx-exceptions@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" - integrity sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg== + version "2.5.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== +spdx-expression-parse@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz#a23af9f3132115465dac215c099303e4ceac5794" + integrity sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" - integrity sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA== + version "3.0.21" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.21.tgz#6d6e980c9df2b6fc905343a3b2d702a6239536c3" + integrity sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg== -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -sshpk@^1.7.0: - version "1.14.2" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98" - integrity sha1-xvxhZIo9nE52T9P8306hBeSSupg= - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - safer-buffer "^2.0.2" - optionalDependencies: - bcrypt-pbkdf "^1.0.0" - ecc-jsbn "~0.1.1" - jsbn "~0.1.0" - tweetnacl "~0.14.0" - -ssri@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== - dependencies: - figgy-pudding "^3.5.1" - -stack-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" - integrity sha1-1PM6tU6OOHeLDKXP07OvsS22hiA= - -staged-git-files@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-1.1.2.tgz#4326d33886dc9ecfa29a6193bf511ba90a46454b" - integrity sha512-0Eyrk6uXW6tg9PYkhi/V/J4zHp33aNyi2hOCmhFLqLTIhbgqWn5jlSzI+IU0VqrZq6+DbHcabQl/WP6P3BG0QA== - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -statuses@1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -statuses@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.2.1.tgz#dded45cc18256d51ed40aec142489d5c61026d28" - integrity sha1-3e1FzBglbVHtQK7BQkidXGECbSg= - -stdin@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/stdin/-/stdin-0.0.1.tgz#d3041981aaec3dfdbc77a1b38d6372e38f5fb71e" - integrity sha1-0wQZgarsPf28d6GzjWNy449ftx4= - -stealthy-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -stream-browserify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" - integrity sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds= +ssri@^12.0.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-12.0.0.tgz#bcb4258417c702472f8191981d3c8a771fee6832" + integrity sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ== dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" + minipass "^7.0.3" -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" +stack-trace@1.0.0-pre2: + version "1.0.0-pre2" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-1.0.0-pre2.tgz#46a83a79f1b287807e9aaafc6a5dd8bcde626f9c" + integrity sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A== -stream-http@^2.7.2: - version "2.8.2" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.2.tgz#4126e8c6b107004465918aa2fc35549e77402c87" - integrity sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA== +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= + escape-string-regexp "^2.0.0" -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= +stdin@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/stdin/-/stdin-0.0.1.tgz#d3041981aaec3dfdbc77a1b38d6372e38f5fb71e" + integrity sha512-2bacd1TXzqOEsqRa+eEWkRdOSznwptrs4gqFcpMq5tOtmJUGPZd10W5Lam6wQ4YQ/+qjQt4e9u35yXCF6mrlfQ== -string-argv@^0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.0.2.tgz#dac30408690c21f3c3630a3ff3a05877bdcbd736" - integrity sha1-2sMECGkMIfPDYwo/86BYd73L1zY= +string-argv@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== -string-length@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" - integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0= +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: - astral-regex "^1.0.0" - strip-ansi "^4.0.0" + char-regex "^1.0.2" + strip-ansi "^6.0.0" -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" -string_decoder@^1.0.0, string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: - safe-buffer "~5.1.0" + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" -stringify-object@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.2.2.tgz#9853052e5a88fb605a44cd27445aa257ad7ffbcd" - integrity sha512-O696NF21oLiDy8PhpWu8AEqoZHw++QW6mUv0UvKZe8gWSdSvMXkiLufK7OmnP27Dro4GU5kb9U7JIO0mBuCRQg== +string-width@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-7.2.0.tgz#b5bb8e2165ce275d4d43476dd2700ad9091db6dc" + integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== dependencies: - get-own-enumerable-property-symbols "^2.0.1" - is-obj "^1.0.1" - is-regexp "^1.0.0" + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" -stringstream@~0.0.4: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - integrity sha1-TkhM1N5aC7vuGORjB3EKioFiGHg= +string_decoder@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^2.0.0" + ansi-regex "^5.0.1" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^3.0.0" + ansi-regex "^5.0.1" -strip-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f" - integrity sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow== +strip-ansi@^7.0.1, strip-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: - ansi-regex "^4.0.0" + ansi-regex "^6.0.1" -strip-bom@3.0.0, strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== -strip-bom@^2.0.0: +strip-final-newline@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= - dependencies: - is-utf8 "^0.2.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= +strip-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-4.0.0.tgz#b41379433dd06f5eae805e21d631e07ee670d853" + integrity sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA== + dependencies: + min-indent "^1.0.1" -strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -style-loader@^0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.19.1.tgz#591ffc80bcefe268b77c5d9ebc0505d772619f85" - integrity sha512-IRE+ijgojrygQi3rsqT0U4dd+UcPCqcVvauZpCnQrGAlEe+FUIyrK93bUDScamesjP08JlQNsFJU+KmPedP5Og== +strtok3@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-7.1.1.tgz#f548fd9dc59d0a76d5567ff8c16be31221f29dfc" + integrity sha512-mKX8HA/cdBqMKUr0MMZAFssCkIGoZeSCMXgnt79yKxNFguMLVFgRe6wB+fsL0NmoHDbeyZXczy7vEPSoo3rkzg== dependencies: - loader-utils "^1.0.2" - schema-utils "^0.3.0" + "@tokenizer/token" "^0.3.0" + peek-readable "^5.1.3" -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= +style-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-4.0.0.tgz#0ea96e468f43c69600011e0589cb05c44f3b17a5" + integrity sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA== -supports-color@^3.1.0, supports-color@^3.1.2, supports-color@^3.2.3: +supports-color@^3.1.0: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= + integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== dependencies: has-flag "^1.0.0" -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: - has-flag "^3.0.0" + has-flag "^4.0.0" -supports-color@^5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" - integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: - has-flag "^3.0.0" + has-flag "^4.0.0" -svgo@^0.7.0: - version "0.7.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" - integrity sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U= - dependencies: - coa "~1.0.1" - colors "~1.1.2" - csso "~2.3.1" - js-yaml "~3.7.0" - mkdirp "~0.5.1" - sax "~1.2.1" - whet.extend "~0.9.9" - -symbol-observable@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" - integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -symbol-tree@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" - integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= +synckit@^0.11.0: + version "0.11.2" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.11.2.tgz#2a8015ce5df8d5eb0cc47ee55924ad8f8756c24b" + integrity sha512-1IUffI8zZ8qUMB3NUJIjk0RpLroG/8NkQDAWH1NbB2iJ0/5pn3M8rxfNzMz4GH9OnYaGYn31LEDSXJp/qIlxgA== + dependencies: + "@pkgr/core" "^0.2.0" + tslib "^2.8.1" -table@^5.0.2: - version "5.1.0" - resolved "https://registry.yarnpkg.com/table/-/table-5.1.0.tgz#69a54644f6f01ad1628f8178715b408dc6bf11f7" - integrity sha512-e542in22ZLhD/fOIuXs/8yDZ9W61ltF8daM88rkRNtgTIct+vI2fTnAyu/Db2TCfEcI8i7mjZz6meLq0nW7TYg== +synckit@^0.9.1: + version "0.9.2" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.2.tgz#a3a935eca7922d48b9e7d6c61822ee6c3ae4ec62" + integrity sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw== dependencies: - ajv "^6.5.3" - lodash "^4.17.10" - slice-ansi "1.0.0" - string-width "^2.1.1" + "@pkgr/core" "^0.1.0" + tslib "^2.6.2" -tapable@^1.0.0, tapable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.0.tgz#0d076a172e3d9ba088fd2272b2668fb8d194b78c" - integrity sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA== - -tar@^4: - version "4.4.4" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd" - integrity sha512-mq9ixIYfNF9SK0IS/h2HKMu8Q2iaCuhDDsZhdEag/FHv8fOaYld4vN7ouMgcSSt5WKZzPs8atclTcJm36OTh4w== - dependencies: - chownr "^1.0.1" - fs-minipass "^1.2.5" - minipass "^2.3.3" - minizlib "^1.1.0" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.2" +tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar@^7.4.3: + version "7.4.3" + resolved "https://registry.yarnpkg.com/tar/-/tar-7.4.3.tgz#88bbe9286a3fcd900e94592cda7a22b192e80571" + integrity sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw== + dependencies: + "@isaacs/fs-minipass" "^4.0.0" + chownr "^3.0.0" + minipass "^7.1.2" + minizlib "^3.0.1" + mkdirp "^3.0.1" + yallist "^5.0.0" + +temp-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-3.0.0.tgz#7f147b42ee41234cc6ba3138cd8e8aa2302acffa" + integrity sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw== -terser-webpack-plugin@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz#cf7c25a1eee25bf121f4a587bb9e004e3f80e528" - integrity sha512-61lV0DSxMAZ8AyZG7/A4a3UPlrbOBo8NIQ4tJzLPAdGOQ+yoNC7l5ijEow27lBAL2humer01KLS6bGIMYQxKoA== +tempy@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-3.1.0.tgz#00958b6df85db8589cb595465e691852aac038e9" + integrity sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g== + dependencies: + is-stream "^3.0.0" + temp-dir "^3.0.0" + type-fest "^2.12.2" + unique-string "^3.0.0" + +terser-webpack-plugin@^5.3.11: + version "5.3.14" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz#9031d48e57ab27567f02ace85c7d690db66c3e06" + integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.25" + jest-worker "^27.4.5" + schema-utils "^4.3.0" + serialize-javascript "^6.0.2" + terser "^5.31.1" + +terser@^5.31.1, terser@^5.32.0, terser@^5.38.1: + version "5.39.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.39.0.tgz#0e82033ed57b3ddf1f96708d123cca717d86ca3a" + integrity sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== dependencies: - cacache "^11.0.2" - find-cache-dir "^2.0.0" - schema-utils "^1.0.0" - serialize-javascript "^1.4.0" - source-map "^0.6.1" - terser "^3.8.1" - webpack-sources "^1.1.0" - worker-farm "^1.5.2" - -terser@^3.8.1: - version "3.10.11" - resolved "https://registry.yarnpkg.com/terser/-/terser-3.10.11.tgz#e063da74b194dde9faf0a561f3a438c549d2da3f" - integrity sha512-iruZ7j14oBbRYJC5cP0/vTU7YOWjN+J1ZskEGoF78tFzXdkK2hbCL/3TRZN8XB+MuvFhvOHMp7WkOCBO4VEL5g== - dependencies: - commander "~2.17.1" - source-map "~0.6.1" - source-map-support "~0.5.6" - -test-exclude@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.1.tgz#dfa222f03480bca69207ca728b37d74b45f724fa" - integrity sha512-qpqlP/8Zl+sosLxBcVKl9vYy26T9NPalxSzzCP/OY6K7j938ui2oKgo+kRZYfxAeIpLqpbVnsHq1tyV70E4lWQ== - dependencies: - arrify "^1.0.1" - micromatch "^3.1.8" - object-assign "^4.1.0" - read-pkg-up "^1.0.1" - require-main-filename "^1.0.1" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" thenify-all@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== dependencies: thenify ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": - version "3.3.0" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" - integrity sha1-5p44obq+lpsBCCB5eLn2K4hgSDk= + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== dependencies: any-promise "^1.0.0" -throat@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" - integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= - -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -time-stamp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.0.0.tgz#95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357" - integrity sha1-lcakRTDhW6jW9KPsuMOj+sRto1c= - -timers-browserify@^2.0.4: - version "2.0.10" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" - integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg== - dependencies: - setimmediate "^1.0.4" +thingies@^1.20.0: + version "1.21.0" + resolved "https://registry.yarnpkg.com/thingies/-/thingies-1.21.0.tgz#e80fbe58fd6fdaaab8fad9b67bd0a5c943c445c1" + integrity sha512-hsqsJsFMsV+aD4s3CWKk85ep/3I9XzYV/IXaSouJMYIoDlgyi11cBhsqYe9/geRfB0YIikBQg6raRaM+nIMP9g== -timers-ext@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.5.tgz#77147dd4e76b660c2abb8785db96574cbbd12922" - integrity sha512-tsEStd7kmACHENhsUPaxb8Jf8/+GZZxyNFQbZD07HQOyooOa6At1rQqjffgvg7n+dxscQa9cjjMdWhJtsP2sxg== - dependencies: - es5-ext "~0.10.14" - next-tick "1" +three@^0.176.0: + version "0.176.0" + resolved "https://registry.yarnpkg.com/three/-/three-0.176.0.tgz#a30c1974e46db5745e4f96dd9ee2028d71e16ecf" + integrity sha512-PWRKYWQo23ojf9oZSlRGH8K09q7nRSWx6LY/HF/UUrMdYgN9i1e2OwJYHoQjwc6HF/4lvvYLC5YC1X8UJL2ZpA== -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== +timers-ext@^0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.8.tgz#b4e442f10b7624a29dd2aa42c295e257150cf16c" + integrity sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww== dependencies: - os-tmpdir "~1.0.2" - -tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + es5-ext "^0.10.64" + next-tick "^1.1.0" -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= +tinybench@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-4.0.1.tgz#ff5940b4e4a63892ef0cad3daf148d5fd8a3725b" + integrity sha512-Nb1srn7dvzkVx0J5h1vq8f48e3TIcbrS7e/UfAI/cDSef/n8yLh4zsAEsFkfpw6auTY+ZaspEvam/xs8nMnotQ== -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= +tinyglobby@^0.2.12, tinyglobby@^0.2.13: + version "0.2.13" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.13.tgz#a0e46515ce6cbcd65331537e57484af5a7b2ff7e" + integrity sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw== dependencies: - kind-of "^3.0.2" + fdir "^6.4.4" + picomatch "^4.0.2" -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" + is-number "^7.0.0" -token-stream@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a" - integrity sha1-zu78cXp2xDFvEm0LnbqlXX598Bo= +token-stream@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-1.0.0.tgz#cc200eab2613f4166d27ff9afc7ca56d49df6eb4" + integrity sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg== -topo@2.x.x: - version "2.0.2" - resolved "https://registry.yarnpkg.com/topo/-/topo-2.0.2.tgz#cd5615752539057c0dc0491a621c3bc6fbe1d182" - integrity sha1-zVYVdSU5BXwNwEkaYhw7xvvh0YI= +token-types@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/token-types/-/token-types-5.0.1.tgz#aa9d9e6b23c420a675e55413b180635b86a093b4" + integrity sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg== dependencies: - hoek "4.x.x" + "@tokenizer/token" "^0.3.0" + ieee754 "^1.2.1" -tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@~2.4.3: - version "2.4.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== - dependencies: - psl "^1.1.24" - punycode "^1.4.1" +toml@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" + integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== -tough-cookie@~2.3.0, tough-cookie@~2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" - integrity sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA== +tooling@webpack/tooling#v1.23.9: + version "1.23.9" + resolved "https://codeload.github.com/webpack/tooling/tar.gz/877a9a9f5ab0bac3d60f595dd0ffc92234356a49" dependencies: - punycode "^1.4.1" + "@yarnpkg/lockfile" "^1.1.0" + ajv "^8.1.0" + commondir "^1.0.1" + glob "^7.1.6" + json-schema-to-typescript "^9.1.1" + terser "^5.32.0" + yargs "^16.1.1" -tr46@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk= - dependencies: - punycode "^2.1.0" +tree-dump@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/tree-dump/-/tree-dump-1.0.2.tgz#c460d5921caeb197bde71d0e9a7b479848c5b8ac" + integrity sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ== -transformers@2.1.0: +ts-api-utils@^2.0.1: version "2.1.0" - resolved "https://registry.yarnpkg.com/transformers/-/transformers-2.1.0.tgz#5d23cb35561dd85dc67fb8482309b47d53cce9a7" - integrity sha1-XSPLNVYd2F3Gf7hIIwm0fVPM6ac= - dependencies: - css "~1.0.8" - promise "~2.0" - uglify-js "~2.2.5" - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz#595f7094e46eed364c13fd23e75f9513d29baf91" + integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== -tslib@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" - integrity sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ== +ts-loader@^9.5.1: + version "9.5.2" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.5.2.tgz#1f3d7f4bb709b487aaa260e8f19b301635d08020" + integrity sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw== + dependencies: + chalk "^4.1.0" + enhanced-resolve "^5.0.0" + micromatch "^4.0.0" + semver "^7.3.4" + source-map "^0.7.4" -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= +tslib@^2.0.0, tslib@^2.3.0, tslib@^2.5.0, tslib@^2.6.2, tslib@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + prelude-ls "^1.2.1" type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== dependencies: prelude-ls "~1.1.2" -type-is@~1.6.6: - version "1.6.16" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" - integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.18" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -typescript@^3.0.0-rc: - version "3.0.0-rc" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.0.0-rc.tgz#13553808426d393d3f92c054f4fa6f24589549c1" - integrity sha512-//6ivFupDRi+rtsivXnYNfXK7URxdvO18hhxgNpbiIVBE611+1NCiiEfgjjx53TU7fjxlhWPuv3RRj5hJF62/w== +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -ua-parser-js@^0.7.9: - version "0.7.18" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed" - integrity sha512-LtzwHlVHwFGTptfNSgezHp7WUlwiqb0gA9AALRbKaERfxwJoiX0A73QbTToxteIAuIaFshhgIZfqK8s7clqgnA== +type-fest@^0.8.0: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -uglify-js@^2.4.19, uglify-js@^2.6, uglify-js@^2.6.1: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" - integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= - dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" +type-fest@^1.0.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" + integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== -uglify-js@~2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.2.5.tgz#a6e02a70d839792b9780488b7b8b184c095c99c7" - integrity sha1-puAqcNg5eSuXgEiLe4sYTAlcmcc= - dependencies: - optimist "~0.3.5" - source-map "~0.1.7" +type-fest@^2.12.2: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= +type@^2.7.2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.3.tgz#436981652129285cc3ba94f392886c2637ea0486" + integrity sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ== -union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^0.4.3" + is-typedarray "^1.0.0" -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= +typescript@^5.8.2: + version "5.8.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e" + integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== -uniqid@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1" - integrity sha1-iSIN32t1GuUrX3JISGNShZa7hME= - dependencies: - macaddress "^0.2.8" +uglify-js@^3.1.4: + version "3.19.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f" + integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= +undici-types@~6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" + integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== -unique-filename@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== +unique-filename@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-4.0.0.tgz#a06534d370e7c977a939cd1d11f7f0ab8f1fed13" + integrity sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ== dependencies: - unique-slug "^2.0.0" + unique-slug "^5.0.0" -unique-slug@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" - integrity sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg== +unique-slug@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-5.0.0.tgz#ca72af03ad0dbab4dad8aa683f633878b1accda8" + integrity sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg== dependencies: imurmurhash "^0.1.4" -unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= +unique-string@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-3.0.0.tgz#84a1c377aff5fd7a8bc6b55d8244b2bd90d75b9a" + integrity sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ== dependencies: - has-value "^0.3.1" - isobject "^3.0.0" + crypto-random-string "^4.0.0" -upath@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.5.tgz#02cab9ecebe95bbec6d5fc2566325725ab6d1a73" - integrity sha512-qbKn90aDQ0YEwvXoLqj0oiuUYroLX2lVHZ+b+xwjozFasAOC4GneDq5+OaIG5Zj+jFmbz/uO+f7a9qxjktJQww== +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== +update-browserslist-db@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + escalade "^3.2.0" + picocolors "^1.1.1" -url-loader@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.6.2.tgz#a007a7109620e9d988d14bce677a1decb9a993f7" - integrity sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q== +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: - loader-utils "^1.0.2" - mime "^1.4.1" - schema-utils "^0.3.0" + punycode "^2.1.0" -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= +url-loader@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" -util-deprecate@~1.0.1: +util-deprecate@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util.promisify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - -util@0.10.3, util@^0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= - dependencies: - inherits "2.0.1" - -utils-merge@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" - integrity sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg= - -uuid@^3.0.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" - integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA== - -uuid@^3.1.0, uuid@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== - -val-loader@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/val-loader/-/val-loader-1.1.0.tgz#ed91537424d62a4ded98e846ccf07367756bf506" - integrity sha512-8m62XF42FcfrBBl02rtDY9hQhDcDczrEcr60/aSMxlzJiXAcbAimRPvsDoDa5QcGAusOgOmVTpFtK5EbfZdDwA== - dependencies: - loader-utils "^1.0.0" - -validate-npm-package-license@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" - integrity sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vary@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.0.1.tgz#99e4981566a286118dfb2b817357df7993376d10" - integrity sha1-meSYFWaihhGN+yuBc1ffeZM3bRA= - -vendors@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801" - integrity sha512-w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ== + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -vm-browserify@0.0.4, vm-browserify@~0.0.0: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= +v8-to-istanbul@^9.0.1: + version "9.3.0" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" + integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== dependencies: - indexof "0.0.1" + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" -void-elements@^2.0.1, void-elements@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" - integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= +void-elements@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" + integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== -w3c-hr-time@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" - integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= - dependencies: - browser-process-hrtime "^0.1.2" +vscode-languageserver-textdocument@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz#457ee04271ab38998a093c68c2342f53f6e4a631" + integrity sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA== -wabt@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wabt/-/wabt-1.0.0.tgz#f33a5c4a6405370ec80ba97e782d092f1d599ff4" - integrity sha512-Apt7rylKNS2VWMMYgY43aYStopVpc9wCJ16y0CznaWcJC2vs7BLVGAV6pffBqn28BfWYeYVA92zRwBstaq1zaA== +vscode-uri@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.1.0.tgz#dd09ec5a66a38b5c3fffc774015713496d14e09c" + integrity sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ== -walker@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= - dependencies: - makeerror "1.0.x" +wabt@1.0.0-nightly.20180421: + version "1.0.0-nightly.20180421" + resolved "https://registry.yarnpkg.com/wabt/-/wabt-1.0.0-nightly.20180421.tgz#db3565bff0d5023c9576270aa5369f2cec45b878" + integrity sha512-bsu9zk672KACjoabONcAS94IS20prRm05IbiIUGfa8eBpRLjWZv8ugocdinV/ONh0mFMfXrVWkvF1/BNtwIfUw== -wast-loader@^1.5.5: - version "1.5.7" - resolved "https://registry.yarnpkg.com/wast-loader/-/wast-loader-1.5.7.tgz#1b165cef7225c70a7e82a50e4f8bf0bc1ec9f2fd" - integrity sha512-0lEkuNchI7oHLv5unScE/v4qAz4JWoxEMbKbjZ8yQyyGe/qEWDIT5mPIdr2N44XHAWGB0k3WG5OVrDSRuEn0Ug== +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== dependencies: - wabt "^1.0.0" + makeerror "1.0.12" -watch@~0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" - integrity sha1-KAlUdsbffJDJYxOJkMClQj60uYY= +wast-loader@^1.12.1: + version "1.14.1" + resolved "https://registry.yarnpkg.com/wast-loader/-/wast-loader-1.14.1.tgz#40a2ef2a3333c8c4fe651eb842aafdfcaf1e1f9e" + integrity sha512-s35gffU7MzyA8nHZapVlYG6KlfSey4ZlZ1Xk//6wmXzogPAykqBMKWUWWBuzVSrrm8dWqNfzcPD0I3z167N72g== dependencies: - exec-sh "^0.2.0" - minimist "^1.2.0" + wabt "1.0.0-nightly.20180421" -watchpack@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== +watchpack@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" + integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== dependencies: - chokidar "^2.0.2" + glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" - neo-async "^2.5.0" - -webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== -webpack-dev-middleware@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz#f8fc1120ce3b4fc5680ceecb43d777966b21105e" - integrity sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A== - dependencies: - memory-fs "~0.4.1" - mime "^1.5.0" - path-is-absolute "^1.0.0" - range-parser "^1.0.3" - time-stamp "^2.0.0" - -webpack-sources@^1.1.0, webpack-sources@^1.3.0: +webassembly-feature@1.3.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" - integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" - integrity sha512-jLBwwKUhi8WtBfsMQlL4bUUcT8sMkAtQinscJAe/M4KHCkHuUJAF6vuB0tueNIw4c8ziO6AkRmgY+jL3a0iiPw== - dependencies: - iconv-lite "0.4.19" - -whatwg-fetch@>=0.10.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" - integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== - -whatwg-mimetype@^2.0.0, whatwg-mimetype@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz#f0f21d76cbba72362eb609dbed2a30cd17fcc7d4" - integrity sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew== + resolved "https://registry.yarnpkg.com/webassembly-feature/-/webassembly-feature-1.3.0.tgz#2966668bfb6be7abf9821ea0b71f87623f49a54f" + integrity sha512-tvszvOBbV/X6gj0Nh3hxmrLUSZzXIxEwL6EzDrqU4OPLRuUVMne/bg8kFFRxwDMJVM+1R+c+O2ajrxa8HIkRwA== -whatwg-url@^6.4.0, whatwg-url@^6.4.1: - version "6.5.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8" - integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ== +webpack-cli@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-6.0.1.tgz#a1ce25da5ba077151afd73adfa12e208e5089207" + integrity sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw== + dependencies: + "@discoveryjs/json-ext" "^0.6.1" + "@webpack-cli/configtest" "^3.0.1" + "@webpack-cli/info" "^3.0.1" + "@webpack-cli/serve" "^3.0.1" + colorette "^2.0.14" + commander "^12.1.0" + cross-spawn "^7.0.3" + envinfo "^7.14.0" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^3.1.1" + rechoir "^0.8.0" + webpack-merge "^6.0.1" + +webpack-merge@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-6.0.1.tgz#50c776868e080574725abc5869bd6e4ef0a16c6a" + integrity sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg== dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.1" - webidl-conversions "^4.0.2" + clone-deep "^4.0.1" + flat "^5.0.2" + wildcard "^2.0.1" -whet.extend@~0.9.9: - version "0.9.9" - resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" - integrity sha1-+HfVv2SMl+WqVC+twW1qJZucEaE= +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@^1.1.1, which@^1.2.10: - version "1.3.0" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" - integrity sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg== - dependencies: - isexe "^2.0.0" + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which@^1.2.12, which@^1.2.9, which@^1.3.0: +which@^1.1.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: - string-width "^1.0.2 || 2" - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= + isexe "^2.0.0" -with@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/with/-/with-5.1.1.tgz#fa4daa92daf32c4ea94ed453c81f04686b575dfe" - integrity sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4= +which@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/which/-/which-5.0.0.tgz#d93f2d93f79834d4363c7d0c23e00d07c466c8d6" + integrity sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ== dependencies: - acorn "^3.1.0" - acorn-globals "^3.0.0" + isexe "^3.1.1" -with@~4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/with/-/with-4.0.3.tgz#eefd154e9e79d2c8d3417b647a8f14d9fecce14e" - integrity sha1-7v0VTp550sjTQXtkeo8U2f7M4U4= +wildcard@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== + +with@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/with/-/with-7.0.2.tgz#ccee3ad542d25538a7a7a80aad212b9828495bac" + integrity sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w== dependencies: - acorn "^1.0.1" - acorn-globals "^1.0.3" + "@babel/parser" "^7.9.6" + "@babel/types" "^7.9.6" + assert-never "^1.2.1" + babel-walk "3.0.0-canary-5" -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= +word-wrap@^1.2.5, word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -wordwrap@^1.0.0, wordwrap@~1.0.0: +wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" -worker-farm@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" - integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== dependencies: - errno "~0.1.7" + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" -worker-loader@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/worker-loader/-/worker-loader-1.1.1.tgz#920d74ddac6816fc635392653ed8b4af1929fd92" - integrity sha512-qJZLVS/jMCBITDzPo/RuweYSIG8VJP5P67mP/71alGyTZRe1LYJFdwLjLalY3T5ifx0bMDRD3OB6P2p1escvlg== +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== dependencies: - loader-utils "^1.0.0" - schema-utils "^0.4.0" + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" -wrap-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" - integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= +wrap-ansi@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz#1a3dc8b70d85eeb8398ddfb1e4a02cd186e58b3e" + integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" + ansi-styles "^6.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write-file-atomic@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" - integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA== +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== dependencies: - graceful-fs "^4.1.11" imurmurhash "^0.1.4" + is-typedarray "^1.0.0" signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= - dependencies: - mkdirp "^0.5.1" - -ws@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-4.1.0.tgz#a979b5d7d4da68bf54efe0408967c324869a7289" - integrity sha512-ZGh/8kF9rrRNffkLFV4AzhvooEclrOH0xaugmqGsIfFgOE/pIz4fMc4Ef+5HSQqTEug2S9JZIWDR47duDSLfaA== +write-file-atomic@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" + integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== dependencies: - async-limiter "~1.0.0" - safe-buffer "~5.1.0" + imurmurhash "^0.1.4" + signal-exit "^3.0.7" -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== +xdg-basedir@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9" + integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ== xml@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" - integrity sha1-eLpyAgApxbyHuKgaPPzXS0ovweU= - -xregexp@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" - integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg== - -xtend@^4.0.0, xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= + integrity sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw== -xxhashjs@^0.2.1: +xxhashjs@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/xxhashjs/-/xxhashjs-0.2.2.tgz#8a6251567621a1c46a5ae204da0249c7f8caa9d8" integrity sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw== dependencies: cuint "^0.2.2" -"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= +yallist@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-5.0.0.tgz#00e2de443639ed0d78fd87de0d27469fbcffb533" + integrity sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw== -yallist@^3.0.0, yallist@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" - integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= +yaml@^2.7.1: + version "2.8.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.0.tgz#15f8c9866211bdc2d3781a0890e44d4fa1a5fff6" + integrity sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ== -yargs-parser@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" - integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== +yamljs@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/yamljs/-/yamljs-0.3.0.tgz#dc060bf267447b39f7304e9b2bfbe8b5a7ddb03b" + integrity sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ== dependencies: - camelcase "^4.1.0" + argparse "^1.0.7" + glob "^7.0.5" -yargs@^12.0.2: - version "12.0.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" - integrity sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ== - dependencies: - cliui "^4.0.0" - decamelize "^2.0.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^15.0.2: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" require-directory "^2.1.1" - require-main-filename "^1.0.1" + require-main-filename "^2.0.0" set-blocking "^2.0.0" - string-width "^2.0.0" + string-width "^4.2.0" which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^10.1.0" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yargs@^16.1.1: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yarn-deduplicate@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/yarn-deduplicate/-/yarn-deduplicate-6.0.2.tgz#63498d2d4c3a8567e992a994ce0ab51aa5681f2e" + integrity sha512-Efx4XEj82BgbRJe5gvQbZmEO7pU5DgHgxohYZp98/+GwPqdU90RXtzvHirb7hGlde0sQqk5G3J3Woyjai8hVqA== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + commander "^10.0.1" + semver "^7.5.0" + tslib "^2.5.0" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yocto-queue@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.2.1.tgz#36d7c4739f775b3cbc28e6136e21aa057adec418" + integrity sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==